pax_global_header00006660000000000000000000000064120723361070014513gustar00rootroot0000000000000052 comment=1d8bb9b490be3a6aed41df228d35de2f8b0f2750 tinyos-2.1.2+dfsg/000077500000000000000000000000001207233610700137615ustar00rootroot00000000000000tinyos-2.1.2+dfsg/README000066400000000000000000000045371207233610700146520ustar00rootroot00000000000000This contains the TinyOS 2.0 source code as of version 2.1.2 on $Date: 2012-08-08 07:18:52 $ This tree includes the TinyOS 2.0 documentation in tinyos-2.x/doc; you can also find the documentation online at: http://www.tinyos.net/tinyos-2.x/doc/ Please note that RPM releases do not include the doc/ or tools/ directories. They do not include the former because of the above URL, where corrections can be applied quickly. They do not include the latter because that compiled versions of its code are installed in the tinyos-tools RPM. The basic directory structure is as follows: apps: Sample TinyOS applications. tests: Sample TinyOS applications which test a part of the system. doc: Documentation index.html: Index file to all documentation txt: Text files (TEPs) html: HTML files (TEPs, installation) tutorial: Tutorials pdf: PDFs of larger documents, such as the TinyOS Programming Manual support: Non-nesC code for using TinyOS nodes make: TinyOS make system sdk: Standard developers kit: serial communication, etc. c: C SDK (fully supported, but not exhaustively tested yet) java: Java SDK (fully supported, heavily tested and used) python: Python SDK (limited, not fully supported) tools: TinyOS-specific tools and scripts platforms: Platform-specific tools release: Scripts and configurations for packaging release RPMs tinyos: TinyOS scripts java: Native support for TinyOS JNI libraries (serial and env) misc: Assorted utility scripts, begininning with tos- ncc: The scripts that invoke the nesC compiler: ncc, mig, ncg tos: TinyOS source code (nesC, C) chips: Chip-specific code interfaces: Core system interfaces lib: Extensions and larger common subsystems byte_radio: General radio stack for byte-level radios net: Network (multihop protocols) ctp: Collection tree protocol le: Link estimator lqi: LQI-based collection for CC2420 platforms power: Power management component library printf: Printing small text messages to serial port serial: Serial communication timer: Timer component library tossim: TOSSIM simulator platforms: Platform-specific code sensorboards: Sensorboard drivers system: Core system components types: Core system data types (header files) You can find documentation for the 2.0.1 release online at: http://www.tinyos.net/tinyos-2.x/doc/ tinyos-2.1.2+dfsg/apps/000077500000000000000000000000001207233610700147245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/AntiTheft/000077500000000000000000000000001207233610700166125ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/AntiTheft/Nodes/000077500000000000000000000000001207233610700176625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/AntiTheft/Nodes/AntiTheftAppC.nc000066400000000000000000000046431207233610700226450ustar00rootroot00000000000000// $Id: AntiTheftAppC.nc,v 1.5 2008-04-24 21:15:50 mmaroti Exp $ /* * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Top-level configuration for node code for the AntiTheft demo app. * Instantiates the sensors, dissemination and collection services, and * does all the necessary wiring. * * @author David Gay */ #include "antitheft.h" configuration AntiTheftAppC { } implementation { /* First wire the low-level services (booting, serial port, radio). There is no standard name for the actual radio component, so we use #ifdef to get the right one for the current platform. */ components AntiTheftC, ActiveMessageC, MainC, LedsC, new TimerMilliC() as MyTimer; #if defined(PLATFORM_MICA2) components CC1000CsmaRadioC as Radio; #elif defined(PLATFORM_MICAZ) components CC2420ActiveMessageC as Radio; #elif defined(PLATFORM_IRIS) components ActiveMessageC as Radio; #else #error "The AntiTheft application is only supported for mica2, micaz and iris nodes" #endif AntiTheftC.Boot -> MainC.Boot; AntiTheftC.Check -> MyTimer; AntiTheftC.Leds -> LedsC; AntiTheftC.RadioControl -> ActiveMessageC; AntiTheftC.LowPowerListening -> Radio; /* Instaniate, wire MTS300 sensor board components. */ components new PhotoC(), new AccelXStreamC(), SounderC; AntiTheftC.Read -> PhotoC; AntiTheftC.ReadStream -> AccelXStreamC; AntiTheftC.Mts300Sounder -> SounderC; components DisseminationC; AntiTheftC.DisseminationControl -> DisseminationC; /* Instantiate and wire our settings dissemination service */ components new DisseminatorC(settings_t, DIS_SETTINGS); AntiTheftC.SettingsValue -> DisseminatorC; /* Instantiate and wire our collection service for theft alerts */ components CollectionC, new CollectionSenderC(COL_ALERTS) as AlertSender; AntiTheftC.AlertRoot -> AlertSender; AntiTheftC.CollectionControl -> CollectionC; /* Instantiate and wire our local radio-broadcast theft alert and reception services */ components new AMSenderC(AM_THEFT) as SendTheft, new AMReceiverC(AM_THEFT) as ReceiveTheft; AntiTheftC.TheftSend -> SendTheft; AntiTheftC.TheftReceive -> ReceiveTheft; } tinyos-2.1.2+dfsg/apps/AntiTheft/Nodes/AntiTheftC.nc000066400000000000000000000145141207233610700222020ustar00rootroot00000000000000// $Id: AntiTheftC.nc,v 1.7 2009-10-28 19:11:15 razvanm Exp $ /* * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Main code for the anti theft demo application. * * @author David Gay */ #include "antitheft.h" module AntiTheftC { uses { interface Timer as Check; interface Read; interface ReadStream; interface Leds; interface Boot; interface Mts300Sounder; interface DisseminationValue as SettingsValue; interface Send as AlertRoot; interface StdControl as CollectionControl; interface StdControl as DisseminationControl; interface SplitControl as RadioControl; interface LowPowerListening; interface AMSend as TheftSend; interface Receive as TheftReceive; } } implementation { enum { /* Threshold for considering mote in a dark place */ DARK_THRESHOLD = 600, /* Amount of time warning leds should stay on (in checkInterval counts) */ WARNING_TIME = 3, /* Number of acceleration samples to collect */ ACCEL_SAMPLES = 10, /* Interval between acceleration samples (us) */ ACCEL_INTERVAL = 10000 }; settings_t settings; message_t alertMsg, theftMsg; uint16_t ledTime; /* Time left until leds switched off */ uint16_t accelSamples[ACCEL_SAMPLES]; /********* LED handling **********/ /* Warn that some error occurred */ void errorLed() { ledTime = WARNING_TIME; call Leds.led2On(); } /* Notify user that settings changed */ void settingsLed() { ledTime = WARNING_TIME; call Leds.led1On(); } /* Turn on bright red light! (LED) */ void theftLed() { ledTime = WARNING_TIME; call Leds.led0On(); } /* Time-out leds. Called every checkInterval */ void updateLeds() { if (ledTime && !--ledTime) { call Leds.led0Off(); call Leds.led1Off(); call Leds.led2Off(); } } /* Check result code and report error if a problem occurred */ void check(error_t ok) { if (ok != SUCCESS) errorLed(); } /* Report theft, based on current settings */ void theft() { if (settings.alert & ALERT_LEDS) theftLed(); if (settings.alert & ALERT_SOUND) call Mts300Sounder.beep(100); if (settings.alert & ALERT_RADIO) /* A local broadcast with no payload */ check(call TheftSend.send(AM_BROADCAST_ADDR, &theftMsg, 0)); if (settings.alert & ALERT_ROOT) { /* Report the identity of this node, using the collection protocol */ /* Get the payload part of alertMsg and fill in our data */ alert_t *newAlert = call AlertRoot.getPayload(&alertMsg, sizeof(alert_t)); if (newAlert != NULL) { newAlert->stolenId = TOS_NODE_ID; /* and send it... */ check(call AlertRoot.send(&alertMsg, sizeof *newAlert)); } } } /* We have nothing to do after messages are sent */ event void AlertRoot.sendDone(message_t *msg, error_t ok) { } event void TheftSend.sendDone(message_t *msg, error_t ok) { } /* We've received a theft alert from a neighbour. Turn on the theft warning light! */ event message_t *TheftReceive.receive(message_t* msg, void* payload, uint8_t len) { theftLed(); /* We don't need to hold on to the message buffer, so just return the received buffer */ return msg; } /* At boot time, start the periodic timer and the radio */ event void Boot.booted() { errorLed(); settings.alert = DEFAULT_ALERT; settings.detect = DEFAULT_DETECT; call Check.startPeriodic(DEFAULT_CHECK_INTERVAL); call RadioControl.start(); } /* Radio started. Now start the collection protocol and set the wakeup interval for low-power-listening wakeup to half a second. */ event void RadioControl.startDone(error_t ok) { if (ok == SUCCESS) { call DisseminationControl.start(); call CollectionControl.start(); call LowPowerListening.setLocalWakeupInterval(512); } else errorLed(); } event void RadioControl.stopDone(error_t ok) { } /* New settings received, update our local copy */ event void SettingsValue.changed() { const settings_t *newSettings = call SettingsValue.get(); settingsLed(); settings = *newSettings; /* Switch to the new check interval */ call Check.startPeriodic(newSettings->checkInterval); } /* Every check interval: update leds, check for theft based on current settings */ event void Check.fired() { updateLeds(); if (settings.detect & DETECT_DARK) call Read.read(); /* Initiate light sensor read */ if (settings.detect & DETECT_ACCEL) { /* To sample acceleration, we first register our buffer (postBuffer). Then we trigger sampling at the desired interval (read) */ call ReadStream.postBuffer(accelSamples, ACCEL_SAMPLES); call ReadStream.read(ACCEL_INTERVAL); } } /* Light sample completed. Check if it indicates theft */ event void Read.readDone(error_t ok, uint16_t val) { if (ok == SUCCESS && val < DARK_THRESHOLD) theft(); /* ALERT! ALERT! */ } /* A deferred task to check the acceleration data and detect theft. */ task void checkAcceleration() { uint8_t i; uint16_t avg; uint32_t var; /* We check for theft by checking whether the variance of the sample (in mysterious acceleration units) is > 4 */ for (avg = 0, i = 0; i < ACCEL_SAMPLES; i++) avg += accelSamples[i]; avg /= ACCEL_SAMPLES; for (var = 0, i = 0; i < ACCEL_SAMPLES; i++) { int16_t diff = accelSamples[i] - avg; var += diff * diff; } if (var > 4 * ACCEL_SAMPLES) theft(); /* ALERT! ALERT! */ } /* The acceleration read completed. Post the task that will check for theft. We defer this somewhat cpu-intensive computation to avoid having the current task run for too long. */ event void ReadStream.readDone(error_t ok, uint32_t usActualPeriod) { if (ok == SUCCESS) post checkAcceleration(); else errorLed(); } /* The current sampling buffer is full. If we were using several buffers, we would switch between them here. */ event void ReadStream.bufferDone(error_t ok, uint16_t *buf, uint16_t count) { } } tinyos-2.1.2+dfsg/apps/AntiTheft/Nodes/Makefile000066400000000000000000000004721207233610700213250ustar00rootroot00000000000000SENSORBOARD = mts300 PFLAGS += -DMTS300CA PFLAGS += -I%T/lib/net/ctp -I%T/lib/net -I%T/lib/net/4bitle -I%T/lib/net/drip COMPONENT=AntiTheftAppC #CFLAGS += -DLOW_POWER_LISTENING #CFLAGS += -DLPL_DEF_LOCAL_WAKEUP=512 #CFLAGS += -DLPL_DEF_REMOTE_WAKEUP=512 #CFLAGS += -DDELAY_AFTER_RECEIVE=20 include $(MAKERULES) tinyos-2.1.2+dfsg/apps/AntiTheft/Nodes/antitheft.h000066400000000000000000000017071207233610700220260ustar00rootroot00000000000000// $Id: antitheft.h,v 1.3 2007-04-04 22:06:22 idgay Exp $ /* * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * @author David Gay */ #ifndef ANTITHEFT_H #define ANTITHEFT_H enum { ALERT_LEDS = 1, ALERT_SOUND = 2, ALERT_RADIO = 4, ALERT_ROOT = 8, DETECT_DARK = 1, DETECT_ACCEL = 2, AM_SETTINGS = 54, AM_THEFT = 99, AM_ALERT = 22, DIS_SETTINGS = 42, COL_ALERTS = 11, DEFAULT_ALERT = ALERT_LEDS, DEFAULT_DETECT = DETECT_DARK, DEFAULT_CHECK_INTERVAL = 1000 }; typedef nx_struct settings { nx_uint8_t alert, detect; nx_uint16_t checkInterval; } settings_t; typedef nx_struct alert { nx_uint16_t stolenId; } alert_t; #endif tinyos-2.1.2+dfsg/apps/AntiTheft/README.txt000066400000000000000000000075511207233610700203200ustar00rootroot00000000000000README for AntiTheft Author/Contact: tinyos-help@millennium.berkeley.edu Description: AntiTheft is a demo "antitheft" application. The accompanying tutorial-slides.ppt Powerpoint file is a tutorial for TinyOS that uses AntiTheft to introduce various aspects of TinyOS and its services. The slides are also available in PDF format in tutorial-slides.pdf (but with animation missing). AntiTheft can detect theft by: - light level (a dark mote is a mote that has been stolen and placed in a concealed dark place, e.g., a pocket!) - acceleration (you have to move a mote to steal it...) It can report theft by: - turning on an alert light (a red LED) - beeping a sounder - reporting the theft to nodes within broadcast radio range (nodes receiving this message turn on their red LED) - reporting the theft to a central node via multihop (collection) routing The antitheft detection and reporting choices are remotely controllable using the java GUI found in the java subdirectory. Nodes blink their yellow LED when turned on or when an internal error occurs, and blink their green LED when new settings are received. This demo is written for mica2, micaz or iris motes using the mts300 sensor board. The code in the Nodes directory should be installed on the motes detecting theft. Each mote should have a separate id, and a mts31n0 or mts300 sensor board. The code in the Root directory should be installed on a mote connected to the PC using a programming board. It talks to the java GUI, forwarding settings from the PC to the sensor network, and forwarding theft alerts from the sensor network to the PC. See below for detailed usage instructions. Tools: The java directory contains a control GUI for the antitheft demo app. Usage: The following instructions will get you started with the AntiTheft demo (the instructions are for mica2 motes, replace mica2 with micaz or iris if using either of those motes) 1. Compile the root and node code for the antitheft application for your platform (mica2, micaz or iris): $ (cd Nodes; make mica2) $ (cd Root; make mica2) 2. Install the root code on a mote with a distinct identifier (e.g., 0): $ (cd Root; make mica2 reinstall.0 ) # For instance: (cd Root; make mica2 reinstall.0 mib510,/dev/ttyUSB0) 3. Install the node code on some number of mica2 motes, giving each mote a distinct id. $ (cd Nodes; make mica2 reinstall.N ) # For instance: (cd Nodes; make mica2 reinstall.22 mib510,/dev/ttyUSB0) 4. Put some mts310 sensor boards on the non-root mica2 motes. You can use mts300 boards instead, but then the acceleration detection will not work. 5. Connect the root mica2 mote to your PC and switch on all motes. 6. Compile and run the java application. The text below assumes your serial port is /dev/ttyS0, replace with the actual port you are using (e.g., COM3 on Windows or /dev/ttyUSB0 on Linux) $ cd java $ make # Unecessary if antitheft.jar exists $ java net.tinyos.sf.SerialForwarder -comm serial@/dev/ttyS0:mica2 $ ./run # start the graphical user interface 7. The buttons and text field on the right allow you to change the theft detection and reporting settings. The interval text box changes the interval at which motes check for theft (default is every second). Changes are only sent to the mote network when you press the Update button. Finally, if you've selected the Server theft report option, the message area will report received theft messages. Known bugs/limitations: - A newly turned on mote may not send theft reports (when the "Server" theft report option is chosen), as: o It takes a little while after motes turn on for them to join the multihop collection network. o It can take a little while for motes to receive the current settings. None. $Id: README.txt,v 1.6 2007-11-19 17:21:20 sallai Exp $ tinyos-2.1.2+dfsg/apps/AntiTheft/Root/000077500000000000000000000000001207233610700175355ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/AntiTheft/Root/AntiTheftRootAppC.nc000066400000000000000000000045201207233610700233560ustar00rootroot00000000000000// $Id: AntiTheftRootAppC.nc,v 1.6 2008-04-24 21:15:51 mmaroti Exp $ /* * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Top-level configuration for root-node code for the AntiTheft demo app. * Instantiates the dissemination and collection services, and does all * the necessary wiring. * * @author David Gay */ #include "../Nodes/antitheft.h" configuration AntiTheftRootAppC { } implementation { /* First wire the low-level services (booting, serial port, radio). There is no standard name for the actual radio component, so we use #ifdef to get the right one for the current platform. */ components AntiTheftRootC, MainC, LedsC, ActiveMessageC, SerialActiveMessageC; #if defined(PLATFORM_MICA2) components CC1000CsmaRadioC as Radio; #elif defined(PLATFORM_MICAZ) components CC2420ActiveMessageC as Radio; #elif defined(PLATFORM_IRIS) components ActiveMessageC as Radio; #else #error "The AntiTheft application is only supported for mica2, micaz and iris nodes" #endif AntiTheftRootC.Boot -> MainC; AntiTheftRootC.SerialControl -> SerialActiveMessageC; AntiTheftRootC.RadioControl -> ActiveMessageC; AntiTheftRootC.LowPowerListening -> Radio; AntiTheftRootC.Leds -> LedsC; components DisseminationC; AntiTheftRootC.DisseminationControl -> DisseminationC; /* Next, instantiate and wire a disseminator (to send settings) and a serial receiver (to receive settings from the PC) */ components new DisseminatorC(settings_t, DIS_SETTINGS), new SerialAMReceiverC(AM_SETTINGS) as SettingsReceiver; AntiTheftRootC.SettingsReceive -> SettingsReceiver; AntiTheftRootC.SettingsUpdate -> DisseminatorC; /* Finally, instantiate and wire a collector (to receive theft alerts) and a serial sender (to send the alerts to the PC) */ components CollectionC, new SerialAMSenderC(AM_ALERT) as AlertsForwarder; AntiTheftRootC.CollectionControl -> CollectionC; AntiTheftRootC.RootControl -> CollectionC; AntiTheftRootC.AlertsReceive -> CollectionC.Receive[COL_ALERTS]; AntiTheftRootC.AlertsForward -> AlertsForwarder; } tinyos-2.1.2+dfsg/apps/AntiTheft/Root/AntiTheftRootC.nc000066400000000000000000000063741207233610700227260ustar00rootroot00000000000000// $Id: AntiTheftRootC.nc,v 1.5 2009-10-28 19:11:15 razvanm Exp $ /* * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Root node code for the antitheft demo app, just acts as a bridge with the PC: * - disseminates settings received from the PC * - acts as a root forthe theft alert collection tree * - forwards theft alerts received from the collection tree to the PC * * @author David Gay */ module AntiTheftRootC { uses { interface Boot; interface SplitControl as SerialControl; interface SplitControl as RadioControl; interface LowPowerListening; interface DisseminationUpdate as SettingsUpdate; interface Receive as SettingsReceive; interface StdControl as CollectionControl; interface StdControl as DisseminationControl; interface RootControl; interface Receive as AlertsReceive; interface AMSend as AlertsForward; interface Leds; } } implementation { /* Start the radio and serial ports when booting */ event void Boot.booted() { call SerialControl.start(); call RadioControl.start(); } event void SerialControl.startDone(error_t error) { } event void SerialControl.stopDone(error_t error) { } event void RadioControl.startDone(error_t error) { /* Once the radio has started, we can setup low-power listening, and start the collection and dissemination services. Additionally, we set ourselves as the (sole) root for the theft alert dissemination tree */ if (error == SUCCESS) { call LowPowerListening.setLocalWakeupInterval(512); call DisseminationControl.start(); call CollectionControl.start(); call RootControl.setRoot(); } } event void RadioControl.stopDone(error_t error) { } /* When we receive new settings from the serial port, we disseminate them by calling the change command */ event message_t *SettingsReceive.receive(message_t* msg, void* payload, uint8_t len) { settings_t *newSettings = payload; if (len == sizeof(*newSettings)) { call Leds.led2Toggle(); call SettingsUpdate.change(newSettings); } return msg; } message_t fwdMsg; bool fwdBusy; /* When we (as root of the collection tree) receive a new theft alert, we forward it to the PC via the serial port */ event message_t *AlertsReceive.receive(message_t* msg, void* payload, uint8_t len) { alert_t *newAlert = payload; call Leds.led0Toggle(); if (len == sizeof(*newAlert) && !fwdBusy) { /* Copy payload (newAlert) from collection system to our serial message buffer (fwdAlert), then send our serial message */ alert_t *fwdAlert = call AlertsForward.getPayload(&fwdMsg, sizeof(alert_t)); if (fwdAlert != NULL) { *fwdAlert = *newAlert; if (call AlertsForward.send(AM_BROADCAST_ADDR, &fwdMsg, sizeof *fwdAlert) == SUCCESS) fwdBusy = TRUE; } } return msg; } event void AlertsForward.sendDone(message_t *msg, error_t error) { if (msg == &fwdMsg) fwdBusy = FALSE; } } tinyos-2.1.2+dfsg/apps/AntiTheft/Root/Makefile000066400000000000000000000004241207233610700211750ustar00rootroot00000000000000PFLAGS += -I%T/lib/net/ctp -I%T/lib/net -I%T/lib/net/4bitle -I%T/lib/net/drip COMPONENT=AntiTheftRootAppC #CFLAGS += -DLOW_POWER_LISTENING #CFLAGS += -DLPL_DEF_LOCAL_WAKEUP=512 #CFLAGS += -DLPL_DEF_REMOTE_WAKEUP=512 #CFLAGS += -DDELAY_AFTER_RECEIVE=20 include $(MAKERULES) tinyos-2.1.2+dfsg/apps/AntiTheft/java/000077500000000000000000000000001207233610700175335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/AntiTheft/java/AntiTheftGui.java000066400000000000000000000200231207233610700227260ustar00rootroot00000000000000// $Id: AntiTheftGui.java,v 1.5 2010-06-29 22:07:13 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Description: * The GUI for the AntiTheft application. * * @author Bret Hull * @author David Gay */ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import net.tinyos.message.*; import net.tinyos.packet.*; import net.tinyos.util.*; public class AntiTheftGui implements MessageListener, Messenger { MoteIF mote; // For talking to the antitheft root node /* Various swing components we need to use after initialisation */ JFrame frame; // The whole frame JTextArea mssgArea; // The message area JTextField fieldInterval; // The requested check interval /* The checkboxes for the requested settings */ JCheckBox detDarkCb, detAccelCb, repLedCb, repSirenCb, repServerCb, repNeighboursCb; public AntiTheftGui() { try { guiInit(); /* Setup communication with the mote and request a messageReceived callback when an AlertMsg is received */ mote = new MoteIF(this); mote.registerListener(new AlertMsg(), this); } catch(Exception e) { e.printStackTrace(); System.exit(2); } } /* Build up the GUI using Swing magic. Nothing very exciting here - the BagPanel class makes the code a bit cleaner/easier to read. */ private void guiInit() throws Exception { JPanel mainPanel = new JPanel(new BorderLayout()); mainPanel.setMinimumSize(new Dimension(500, 250)); mainPanel.setPreferredSize(new Dimension(500, 300)); /* The message area */ JScrollPane mssgPanel = new JScrollPane(); mssgPanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); mssgPanel.setAutoscrolls(true); mssgArea = new JTextArea(); mssgArea.setFont(new java.awt.Font("Monospaced", Font.PLAIN, 20)); mainPanel.add(mssgPanel, BorderLayout.CENTER); mssgPanel.getViewport().add(mssgArea, null); /* The button area */ BagPanel buttonPanel = new BagPanel(); GridBagConstraints c = buttonPanel.c; c.fill = GridBagConstraints.HORIZONTAL; c.gridwidth = GridBagConstraints.REMAINDER; buttonPanel.makeLabel("Detection", JLabel.CENTER); c.gridwidth = GridBagConstraints.RELATIVE; detDarkCb = buttonPanel.makeCheckBox("Dark", true); c.gridwidth = GridBagConstraints.REMAINDER; detAccelCb = buttonPanel.makeCheckBox("Movement", false); buttonPanel.makeSeparator(SwingConstants.HORIZONTAL); buttonPanel.makeLabel("Theft Reports", JLabel.CENTER); c.gridwidth = GridBagConstraints.RELATIVE; repLedCb = buttonPanel.makeCheckBox("LED", true); c.gridwidth = GridBagConstraints.REMAINDER; repSirenCb = buttonPanel.makeCheckBox("Siren", false); c.gridwidth = GridBagConstraints.RELATIVE; repServerCb = buttonPanel.makeCheckBox("Server", false); c.gridwidth = GridBagConstraints.REMAINDER; repNeighboursCb = buttonPanel.makeCheckBox("Neighbours", false); buttonPanel.makeSeparator(SwingConstants.HORIZONTAL); buttonPanel.makeLabel("Interval", JLabel.CENTER); fieldInterval = buttonPanel.makeTextField(10, null); fieldInterval.setText(Integer.toString(Constants.DEFAULT_CHECK_INTERVAL)); ActionListener settingsAction = new ActionListener() { public void actionPerformed(ActionEvent e) { updateSettings(); } }; buttonPanel.makeButton("Update", settingsAction); mainPanel.add(buttonPanel, BorderLayout.EAST); /* The frame part */ frame = new JFrame("AntiTheft"); frame.setSize(mainPanel.getPreferredSize()); frame.getContentPane().add(mainPanel); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } /* Add a message to the message area, auto-scroll to end */ public synchronized void message(String s) { mssgArea.append(s + "\n"); mssgArea.setCaretPosition(mssgArea.getDocument().getLength()); } /* Popup an error message */ void error(String msg) { JOptionPane.showMessageDialog(frame, msg, "Error", JOptionPane.ERROR_MESSAGE); } /* User pressed the "Update" button. Read the GUI fields and send a SettingsMsg with the requested values. When the requested settings are bad, we silently update them to sane values. */ public void updateSettings() { SettingsMsg smsg = new SettingsMsg(); short alert = 0; short detect = 0; int checkInterval = Constants.DEFAULT_CHECK_INTERVAL; /* Extract current interval value, fixing bad values */ String intervalS = fieldInterval.getText().trim(); try { int newInterval = Integer.parseInt(intervalS); if (newInterval < 10) throw new NumberFormatException(); checkInterval = newInterval; } catch (NumberFormatException e) { /* Reset field when value is bad */ fieldInterval.setText("" + checkInterval); } /* Extract alert settings */ if (repLedCb.isSelected()) alert |= Constants.ALERT_LEDS; if (repSirenCb.isSelected()) alert |= Constants.ALERT_SOUND; if (repNeighboursCb.isSelected()) alert |= Constants.ALERT_RADIO; if (repServerCb.isSelected()) alert |= Constants.ALERT_ROOT; if (alert == 0) { /* If nothing select, force-select LEDs */ alert = Constants.ALERT_LEDS; repLedCb.setSelected(true); } /* Extract detection settings */ if (detDarkCb.isSelected()) detect |= Constants.DETECT_DARK; if (detAccelCb.isSelected()) detect |= Constants.DETECT_ACCEL; if (detect == 0) { /* If no detection selected, force-select dark */ detect = Constants.DETECT_DARK; detDarkCb.setSelected(true); } /* Build and send settings message */ smsg.set_alert(alert); smsg.set_detect(detect); smsg.set_checkInterval(checkInterval); try { mote.send(MoteIF.TOS_BCAST_ADDR, smsg); } catch (IOException e) { error("Cannot send message to mote"); } } /* Message received from mote network. Update message area if it's a theft message. */ public void messageReceived(int dest_addr, Message msg) { if (msg instanceof AlertMsg) { AlertMsg alertMsg = (AlertMsg)msg; message("Theft of " + alertMsg.get_stolenId()); } } /* Just start the app... */ public static void main(String[] args) { AntiTheftGui me = new AntiTheftGui(); } } tinyos-2.1.2+dfsg/apps/AntiTheft/java/BagPanel.java000066400000000000000000000046561207233610700220620ustar00rootroot00000000000000// $Id: BagPanel.java,v 1.2 2007-04-04 22:29:29 idgay Exp $ /* tab:4 * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import java.awt.*; import java.awt.event.*; /** * A GridBagLayout based panel with convenience methods for * making various swing items. These methods also ensure a * consistent appearance. * * @author David Gay */ public class BagPanel extends JPanel { Font boldFont = new Font("Dialog", Font.BOLD, 12); Font normalFont = new Font("Dialog", Font.PLAIN, 12); GridBagLayout bag; GridBagConstraints c; /* Create a panel with a bag layout. Create some constraints are users can modify prior to creating widgets - the current constraints will be applied to all widgets created with makeXXX */ public BagPanel() { bag = new GridBagLayout(); setLayout(bag); c = new GridBagConstraints(); } /* The makeXXX methods create XXX widgets, apply the current constraints to them, and add them to this panel. The widget is returned in case the creator needs to hang on to it. */ public JButton makeButton(String label, ActionListener action) { JButton button = new JButton(); button.setText(label); button.setFont(boldFont); button.addActionListener(action); bag.setConstraints(button, c); add(button); return button; } public JCheckBox makeCheckBox(String label, boolean selected) { JCheckBox box = new JCheckBox(label, selected); box.setFont(normalFont); bag.setConstraints(box, c); add(box); return box; } public JLabel makeLabel(String txt, int alignment) { JLabel label = new JLabel(txt, alignment); label.setFont(boldFont); bag.setConstraints(label, c); add(label); return label; } public JTextField makeTextField(int columns, ActionListener action) { JTextField tf = new JTextField(columns); tf.setFont(normalFont); tf.setMaximumSize(tf.getPreferredSize()); tf.addActionListener(action); bag.setConstraints(tf, c); add(tf); return tf; } public JSeparator makeSeparator(int axis) { JSeparator sep = new JSeparator(axis); bag.setConstraints(sep, c); add(sep); return sep; } } tinyos-2.1.2+dfsg/apps/AntiTheft/java/Makefile000066400000000000000000000011541207233610700211740ustar00rootroot00000000000000GEN=SettingsMsg.java AlertMsg.java Constants.java ANTITHEFT_H=../Nodes/antitheft.h all: antitheft.jar antitheft.jar: AntiTheftGui.class jar cf $@ *.class SettingsMsg.java: $(ANTITHEFT_H) mig -target=null -java-classname=SettingsMsg java $(ANTITHEFT_H) settings -o $@ AlertMsg.java: $(ANTITHEFT_H) mig -target=null -java-classname=AlertMsg java $(ANTITHEFT_H) alert -o $@ Constants.java: $(ANTITHEFT_H) ncg -target=null -java-classname=Constants java $(ANTITHEFT_H) antitheft.h -o $@ AntiTheftGui.class: $(wildcard *.java) $(GEN) javac *.java clean: rm -f *.class $(GEN) veryclean: clean rm antitheft.jar tinyos-2.1.2+dfsg/apps/AntiTheft/java/antitheft.jar000066400000000000000000000200371207233610700222210ustar00rootroot00000000000000PK 6 META-INF/PK 6--META-INF/MANIFEST.MFManifest-Version: 1.0 Created-By: 0.92-gcc PK 6AlertMsg.classKsG#Z-B6 ?$PlGF HJfօvvI\rr*[>@.9$p%UP HBULO_\A*}!PȲ VXS0|DV9B c!y![|@ʆ-z}:3mq 3M1], 25c0U0--Qb"gq`q7։d5)ve2!2&%aZ5:(062uêeei)5W׮s+_8`N0NSvpb(hkϙSkBՋd1}iR| eZZCUᖐB+W)Wu5U*0?=RKcRQ!J+oUxkTsvӪ8z9?vMRAZE eWs%a8*wQcnQa'=[4Äk?ָm0]nrs^Gr{E.g'Vb:b5Kco}4I1դ GH'!4|`3#$Fu"oHV\$xFq)*!겡%MRҔ$ %MQRh>%}@IJnMK?!thv Uɾzz,U80 V'vSF罄-MYuq#Ÿ@I1QIm^¤XO.o1JM"RDifePcy~=ۖ_^Pk}EqtkQ\5%]:M;։+D6f#}5jnI +Wji;O,.֋Ã?>OPK 6KTAntiTheftGui$1.classmQJ@=-mvqAU> >+B)*BP4Sډ$O .Gw`2{a@&(¢%,X1f`!"3,8MDg, TCG#!:f(vR-"tyqc]q=%|yŃLxaܩkS.݌!':m? <~*,WCOZ0Q` k`BeR>0:R1px f_ ^\UjN&vmd`س2JUO`aG U#A!hB e"k}ץנO u( V?~A9fOdO'ߐ&% CE PK 6*:b AntiTheftGui.classW |?vLHVC#l." DsX$@ jq;YFvw섀mZJZj(٠ۊZmڪV{V}ofs_o}ߛo,*lTу+JW0qkUć|CEzܠF7(B Rp""ķeUm*x vp;TLN1}[L|Gp,O4w)x@\Q=GF 9+־d~X8x$G~,xOdOgxVU~,S&&?'_2BxSRK,įZj9j&;9exnT}e >T ;xILM)#>D c' O;+P>032Lm5I#FM+-un[O֔V}[MLkNh.t:`:ahu6G44p1z0}`Ղ4 6m6[mVC4j$D-`=#&*?PѰTa7wYvZ8K͔| &+1SF[o˰] (^3̚l~V*\%!њn;6{[' ۶l¤ޞAɹkan5bPx,xk͟ajwS`QRn5q/BZhVkC°t\v( 5h"!8*ak.q}NMe ;oziRn+l6F*-6Y2Y"*(HŌQVۣHmM&aOvڤJI[ѣFL64΀h2 f,fs{C*P\pm6#Eb, x5:h"VO>girvMMZDz/Ys!=j8W(us֔FTBUUBj4:0Fba"Z8H鴑0; S|z YT]4:hdh:Fc%IzFX<ȍݒz:@xx jF4jKy)Bz,0' ("Zpn^}XvRwF`V+FiFT:Z:j':0꡵ETrF*V+2*RIDu! h]3s"f18k1PRwF\,BՐ>C6h5<;zt:mڷffle\7rZE= ]IiiMgi# p6Xg0k773'~Ҩknu+Hcδqڼ+p\|z[|QR"c('S*&Ս{k(J= یqk7c{Iڙ!Sw RYq1g3?'-FD^>^Df|Y/mݑW}C B-]jl4M{)-cy>?ɨz=ɖC^Ǒr ,;E`jVcJSīlڑW5"a\BŸ/'4Ӧ{*0S1o# =h 7~zOw>%4nhivRC+5ΰחtbM%2}x/NorCoQ+RZA U[s*mr#Jqܸ[ќm3n$;r<6rvC6rֆbKDT Wn5>ئc%T8Cn ŝ|wrgٹyGn>'7sg/S|Bz着+@?" _'?WyYw@ Z25o/ wz?q؄؂<˘{h&dr,@ *5n|w|( 3Ӥ̢>,G( 8Ġ*qPSXhjSLcϧ33Y M  AYU2\֟Vk~VcAu0ˠ?`oPُ*ǑjX(sMGuE…ԇB^̞. VsO ! ։D3X Z3$^\|j\ϗFs<ɷ+UW9_,5-*,02_='t_2)ZW%%E(b$jE5w')4vYƢDE`ǕB#<x,U`zuwMUl6Uɦg0b20*ĺ+ř4f ppK876e,xѺ y[ &־p.^w7Kq^踏1qs?n|{s2\xf<+#Q$x/FsK x/3{gG-T=4$9 a C!.{*53LWssX,Y3"cQ&-~?Ozx7} PK 62i~BBagPanel.classU SW (hLimSicbLM۴!a7jg*΄Na!ܱr^w9^_Qqណ|-g!C2+9Ī:.x5 u c:< Ny Ec(kV$6Yilȳ(fᱎҰ@b׫k \,eZql4ds*&0y1YY+_{3g9j4-I1C˦e-bfRFE9۲R'ސ*{ຶ%PҪˮcZ z,7皶U0w NoxHo0nڇI}hsvAVT] KR^աfzU`)큕+Hvc<²}5ylJK9@)27uѪ)v`V`bS*H`N\  g~/$*@Fۉm6{wk==^4quk~t\3<1{dKEriK^7hr{TV:Y8LF#x*+g7^efνˌq?#u;: :HMzGUoSN e5-8hx1OGwҹtnIA}!9OZ1Dh 8b#xCk!Hp :.8BHFo; pISY_RAY*K|-&\ #)la4l!Tlp)j}\!1B1}F\qf۝z0q.8Iޅqfא,dJO+%a ꗇ]hc\="k-|}}ZGybWl:EZ< : Ydd:h-.SiɳDdPK 6oConstants.class]N@,xBvImmml`I|/W&.|ħ0)6|ߜۜ%9pTC742,mDf)aY4lC9azDž0;OI#U!7R7_4-[7YPgf$U@a@|1'zӆ)/Ҍ~H RXm'T ՇMi؆h,Kr$SmGʞWSN.fapP)f~17enA/Ȓ,WmX㥒 ,i{H,M0lؔe# IJʕfOd-֣:!zrҖjv}#4/˙_lX'L[5 -UC/L߱VwܐвriQNE[+Xm|p  !`XA\AB!yggm<<%YRaF&>I [Z|D >S̔e{ziX6sVruQFxMqt](xmrhCv*t1Wy9\C4NZ Ӱ7MXC_9I4(M&8i('=I;҄+=Pk Q1nv=vW MR;hϻ6Cejr?֠%*t?}%TI@6K|8=c1qmmu {"Βu9ɻIm1v9<_V;yǜ ~5SN{Js%" ?{ިu1ֶu ַXsry?G:oGB/Ik`ߐw^3-xηT7oe744т?;ߊHB&/& v4%HQJ^bvD"RWXч.O?S-{߻i52PK 6 META-INF/PK 6--'META-INF/MANIFEST.MFPK 6AlertMsg.classPK 6KTYAntiTheftGui$1.classPK 61dCAntiTheftGui$2.classPK 6*:b TAntiTheftGui.classPK 62i~B BagPanel.classPK 6oConstants.classPK 6*mA0 SettingsMsg.classPK 1tinyos-2.1.2+dfsg/apps/AntiTheft/java/build.xml000066400000000000000000000006201207233610700213520ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/AntiTheft/java/run000077500000000000000000000002371207233610700202670ustar00rootroot00000000000000#!/bin/sh if cygpath -w / >/dev/null 2>/dev/null; then CLASSPATH="antitheft.jar;$CLASSPATH" else CLASSPATH="antitheft.jar:$CLASSPATH" fi java AntiTheftGui tinyos-2.1.2+dfsg/apps/AntiTheft/tutorial-slides.pdf000066400000000000000000026200551207233610700224430ustar00rootroot00000000000000%PDF-1.2 % 8 0 obj << /Length 9 0 R /Filter /FlateDecode >> stream H @ [@lpbdɝaӸ\+)1utZJMA= rNO7W~ endstream endobj 9 0 obj 71 endobj 6 0 obj << /Type /XObject /Subtype /Image /Name /im1 /Filter /DCTDecode /Width 136 /Height 90 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 7 0 R >> stream AdobedC    !"(($#$% '+++,.3332-3333333333Z  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI%}lڟS<їra`>5H>`W3Wn4ߎ Ӱ\Yc͖Y^|{r􎙏\8n.-w.7mU &^"#h V&O V5qReld00>Ͷ5)f}v՘ֶޥsCLF+?2'KV;%?rYY[fֺٍEܛ 7K鿨d[9`^Υc kt!qY*~uz^ l!n5`q%ZOn&]\)>pB5Xm}@'+}|ǵR%*4~Vom{\:\:>W^:RWi+޿ [vm9̂=,cl_fK`jr=]E>#7Ig]a*2Oۖ  tf;]2}qwdc*7׽SkŢc̼n`ˣnb̆ǙpZxY:MA_\\z1n"YSЯm2*eXkxy+=9AEDRI$I%+TlX090S9cKCZ$LHh$RJgnޣIhݒ7NiOyo?텑m=&^(Zߥoj~ Y- x qq22+Ŧ̋0is|SEku\AA -D?:o6y]k#) A.6OE}[sHX||:~c[!46>Z,o{\r F+_%iڣ\r3 b+~t}Kϑpjho~=Wl{ jȴcs߼zqJʜb>8@{-|$+SO5''u?vDiĜ4^>ן5YK=0޵=&I-5UlG7BZ\Ƽa 9sjO==6R˩c>wܲs?7X.^=߹'!U.ןJڬhL3kO">2KK˨hά.{;luՍY1Ycǩ |+5aÏh?}sX9ۤϵ:8yBzRwr#>!3'R n[8+վ6U^7l_7APǛ>e~nfz>פx?(="$H<4} 澶u77nd^ktbF= Yic&4v\_9?Xz ]a^9^!hxOR~}S/5EnY8?`{]]UH"k6?8^ρ10+C5F|JZjI$I/+RI$I$_+V_Kz]6;lm=Fãaf?ª瘛">j_Lo&=;O1WzNy=ȁشϊJ-t^Vh{-ݶy7_Y>dz=[p ƇѭP&Xznf Yg~[V)^?)^пԌO.m$Sf^gt?ymC#f;3cΧ:Ew<> O_V_Tp]~KFE6=p'h$SgDtzm[kr8⽇ 7=ot>oPy-ƪ7=$N԰zn#.\ԟ ыK7V?soR">u e,̜lkk1`u<\.hϼc6US67=eem6eZkqisݤ p?oΛ]ϯӹLnkDֱzG꘭{(˯cm80 ~i}?688%{^&K2񫽀$r~=}H[k i\OYS sa?}eY1aZH0p~އOZfCjh5Op2:m}E`o<-ZnHxmNn+l<~%^֐b%<=~b[]C4y~RnG֞K[][t|/^ˠ߫_|/pPH$53L](u:L :&Vژk&6NJ亟zf{Yd i?Vg{` K|9F].6ԷL?:O/5]fWNk\IRٿV2,bq|]8J=*Ou+p{+k45A !.ڟs>S"*uոIk\yzwϪFt6WI ~Ko[s,.!KgB>7ן8P\?#C[Z@)_3My5c[I*XƟH *L}*YSv<]BWI%#}Z7WoQ,x$`[S-믭Z_^ƿ=pH?7/hz*0L+*V!hkG ֱkDxoH}_Ҳ>OkͿMiۿEm&W/qjnվ%k{CQIoҏ9?c/5wY}CQN讧#Uo[j)^?)]BR1?YR7KQN+Mw+~uGSLݵ5zշ1]gNF drzM[ƿ__T?ׇtuOno? Vn}sǔʻhf q-^w\LoF6+c5qӝuhlnGDm֦zP[$@V:ޖP"{*Yu=LƆqno"CC$}>h?Te}dۛE:>7ǀ#PxO"u {,Ү|_s\HZ}OVukX0^mn HcA<| >JWEh}aɧkZ^Kg+ou_tc8zdpOiDŽ#}Q-{v@TiܧѾ߄Uq6c6g">Nfǽ-p+qhʢ豶cC^U]SlxpBSe:׾M5Vz޾<>HkI:?[>f[ -=Z` NqzkMcvk:AV:=OKͦ{.ǭޣ\b 32eיҰ+yTø̓+¹k]9[$ծ%{^w?.}sU*է [Q=G%KѾ)Kyg\V'9~U7}JW}KJI_,oɛnYW ~o*C E$Wk,BAJUWM,oEl.KsHevOwY\ퟖgtԺ nMװx%G/}qs[q-YkIRWgvoZu5sg/V׬Yٹو;&ƿy)Sv^NNMMuI Mf,doq X\jg_Tʾ NTA姱0u*j;bebїC/7g[8v.Ǹ1K=b8?֯y?Wp}6\;.>{yJ﮷Z͹liy'kG`@9[=Nckrѧ?O9q07W=q޿RKӹRu:OntzΣkƭ_;$y۞ Vtd"YO r[X]bes1Za?JL;h4T?g_gFcKΓUulvp%ѩ?Dn]7%K~+K?77}oJQ=G%I)Kyg\V'?ފɟcWi?zF>W]x8y.lnӺm84Ulc|~OieůW i_(c6kvN^e5W, ߣZ5s]Ck"tjI^;z%_T:`N,;&wIi꿶,1?-;&g^4j}c 9㾨l?TztskuaŰtksq[k\-?n@8=}mռ/2Kq+c teou^can0}Ϧc5 hgUpB_̰TW'szc}7SsC0{gWlfWaWke1">znGik-pOUY:޸ Z5'IU:VEy l8j)A&@.t>aH&^nf^=-w-2aI ]̌yi9#@qC[c|tsɪg_X8jLo_+WoΫ#$5Np{!:Вk#>(= ԝx|oZz>e<51؏}.>}a̹Ʀ?r]:QEs*գQՇֿb}k$2X{#>RyƖ<wR陞vz/[`_I5o ,?*k?}XU7)-0OU?Yz>NF]ɠՖkHGtN0̼k/0n]cPU[C ezv|Uu:&VnkzIzp!D9x1 QΑ>k?2켎m/ye0y[?PeI- ~t{ludÜ?W_W9zoS?El{mtO[?/OJtcXtn.)>t> \&,~83A0D_3WzpsP.)ߕrڏG¾ձӌh@Vu_URjŻq ?Wif8đ>:WBt\jk'S$'̙^vMf.-p9:^ٍKi7VP:G&Mn$.d+;;_|EQ,D2_M~3CY-^CկʱwR\nc6T~y%H}^ϫ:l½tt.-7+֞Ҳmx6`>k;}v4>Y=.kdH '5TC$:d/?axMTq?ӫz &+RI%lW3prj}:Ll._wԟɓw~谲==&x,iU鴶6 7ΏYz\]a#TW>7+guRZڧ#i8.'B[~N<}#_"WnzoVfgNʫ/YKi!{Vvu _S}d/m2+RݦUtDIS]f27&4aWkrkL\;T@Vzn@XwZ-ǭ%WnodFk]UKՏ]nc?WI$IG+wkV-leu%F|`nWuދf6 Gc~+/Aw/*adegM̱XCL _\;۲Elqayt:V?[mApq\N ~hΫ׾_zf}Ә۔\[;v#zY7*!ۭm-=2>0_g>.hm^2GUw>lMYP$:0<׮Ӻ6՜K~}5lp$i38Ud`wk>kwux=~7Ob1D X){S[7Aܮ ,$ʽ}Fw $I$_W:ONgMC-!Â#/e'18GG<|M7΄/_kk/ԲN@0ClI4}@m~Wlov5-}^8/u>8w|~G~cYWM(e0|bM_ #kykv\ܖڣ2=, ?"^Vި;^^kM{#yOu?\iqf@,\}ZXzMG*qѶ>|~+em=sL s^H#PBt$I$+RI$,\<{2rkZI(_}8>۬mUKZ+Zjk^ .4 /Λ>}rV jn$7qOw U10zK,ʾM2@=9'c]m2{Or{xS]:q2. {+~^tb mv'b yOHԒI+RI$IeuϪW>VYպu=F5ߑ R'3nv%Yݡo܏@ldR4#Q<ӵlk]Ns@sKA?!^B żPOp>EqڷlU&9l^<6~ ߩ^:# XFH.kܳ {FʾGW;33 1Qwe{$Je4dddc}*p~2lƞsd:'kkN'MyUdŀ}\oִ0@,|wS _?߶Lk]?ޫ:LEO2/Aݿ0Y;ayg7⩏lֽؙgU[۷ƥ`uOKm7ADnșk^ |΁իcK*p\`fv7˹di j> {GwtxXu 0w#yܭ5q$_+RI$I$_+RI$I$_>ʆE_^T? U?szUZϢ?,ӕO%/Ӓ"?JMOy#sKGg?s_+RI$I$_ endstream endobj 7 0 obj 9575 endobj 10 0 obj << /Length 11 0 R /Filter /FlateDecode >> stream HO@0P$uiUcMKA J Ub`@1a7+ 5n6&Jj_l'9q||Λ}/¢Xn{O{ uO\ucM] ^6{#\{wu0 > p\V7׿\8|}|B"j!?lAVaze'7s+^CTBI%ƕddB`SmlYȇ VYS9aTQY8RdHBCQ:- @VwόC?'^rd8,#'C>CVfu䑟; ġ4QR q *G'v8r|6: O#BGNʓ(212~32;4ƥn* ad@8(P YMPUd eP2. u]C1RXBX, Ҡp;7!x} &Rb JḘ۷۩cWij}o=x|C~&-W|{> stream AdobedC    !"(($#$% '+++,.3332-3333333333Z  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI%}lڟS<їra`>5H>`W3Wn4ߎ Ӱ\Yc͖Y^|{r􎙏\8n.-w.7mU &^"#h V&O V5qReld00>Ͷ5)f}v՘ֶޥsCLF+?2'KV;%?rYY[fֺٍEܛ 7K鿨d[9`^Υc kt!qY*~uz^ l!n5`q%ZOn&]\)>pB5Xm}@'+}|ǵR%*4~Vom{\:\:>W^:RWi+޿ [vm9̂=,cl_fK`jr=]E>#7Ig]a*2Oۖ  tf;]2}qwdc*7׽SkŢc̼n`ˣnb̆ǙpZxY:MA_\\z1n"YSЯm2*eXkxy+=9AEDRI$I%+TlX090S9cKCZ$LHh$RJgnޣIhݒ7NiOyo?텑m=&^(Zߥoj~ Y- x qq22+Ŧ̋0is|SEku\AA -D?:o6y]k#) A.6OE}[sHX||:~c[!46>Z,o{\r F+_%iڣ\r3 b+~t}Kϑpjho~=Wl{ jȴcs߼zqJʜb>8@{-|$+SO5''u?vDiĜ4^>ן5YK=0޵=&I-5UlG7BZ\Ƽa 9sjO==6R˩c>wܲs?7X.^=߹'!U.ןJڬhL3kO">2KK˨hά.{;luՍY1Ycǩ |+5aÏh?}sX9ۤϵ:8yBzRwr#>!3'R n[8+վ6U^7l_7APǛ>e~nfz>פx?(="$H<4} 澶u77nd^ktbF= Yic&4v\_9?Xz ]a^9^!hxOR~}S/5EnY8?`{]]UH"k6?8^ρ10+C5F|JZjI$I/+RI$I$_+V_Kz]6;lm=Fãaf?ª瘛">j_Lo&=;O1WzNy=ȁشϊJ-t^Vh{-ݶy7_Y>dz=[p ƇѭP&Xznf Yg~[V)^?)^пԌO.m$Sf^gt?ymC#f;3cΧ:Ew<> O_V_Tp]~KFE6=p'h$SgDtzm[kr8⽇ 7=ot>oPy-ƪ7=$N԰zn#.\ԟ ыK7V?soR">u e,̜lkk1`u<\.hϼc6US67=eem6eZkqisݤ p?oΛ]ϯӹLnkDֱzG꘭{(˯cm80 ~i}?688%{^&K2񫽀$r~=}H[k i\OYS sa?}eY1aZH0p~އOZfCjh5Op2:m}E`o<-ZnHxmNn+l<~%^֐b%<=~b[]C4y~RnG֞K[][t|/^ˠ߫_|/pPH$53L](u:L :&Vژk&6NJ亟zf{Yd i?Vg{` K|9F].6ԷL?:O/5]fWNk\IRٿV2,bq|]8J=*Ou+p{+k45A !.ڟs>S"*uոIk\yzwϪFt6WI ~Ko[s,.!KgB>7ן8P\?#C[Z@)_3My5c[I*XƟH *L}*YSv<]BWI%#}Z7WoQ,x$`[S-믭Z_^ƿ=pH?7/hz*0L+*V!hkG ֱkDxoH}_Ҳ>OkͿMiۿEm&W/qjnվ%k{CQIoҏ9?c/5wY}CQN讧#Uo[j)^?)]BR1?YR7KQN+Mw+~uGSLݵ5zշ1]gNF drzM[ƿ__T?ׇtuOno? Vn}sǔʻhf q-^w\LoF6+c5qӝuhlnGDm֦zP[$@V:ޖP"{*Yu=LƆqno"CC$}>h?Te}dۛE:>7ǀ#PxO"u {,Ү|_s\HZ}OVukX0^mn HcA<| >JWEh}aɧkZ^Kg+ou_tc8zdpOiDŽ#}Q-{v@TiܧѾ߄Uq6c6g">Nfǽ-p+qhʢ豶cC^U]SlxpBSe:׾M5Vz޾<>HkI:?[>f[ -=Z` NqzkMcvk:AV:=OKͦ{.ǭޣ\b 32eיҰ+yTø̓+¹k]9[$ծ%{^w?.}sU*է [Q=G%KѾ)Kyg\V'9~U7}JW}KJI_,oɛnYW ~o*C E$Wk,BAJUWM,oEl.KsHevOwY\ퟖgtԺ nMװx%G/}qs[q-YkIRWgvoZu5sg/V׬Yٹو;&ƿy)Sv^NNMMuI Mf,doq X\jg_Tʾ NTA姱0u*j;bebїC/7g[8v.Ǹ1K=b8?֯y?Wp}6\;.>{yJ﮷Z͹liy'kG`@9[=Nckrѧ?O9q07W=q޿RKӹRu:OntzΣkƭ_;$y۞ Vtd"YO r[X]bes1Za?JL;h4T?g_gFcKΓUulvp%ѩ?Dn]7%K~+K?77}oJQ=G%I)Kyg\V'?ފɟcWi?zF>W]x8y.lnӺm84Ulc|~OieůW i_(c6kvN^e5W, ߣZ5s]Ck"tjI^;z%_T:`N,;&wIi꿶,1?-;&g^4j}c 9㾨l?TztskuaŰtksq[k\-?n@8=}mռ/2Kq+c teou^can0}Ϧc5 hgUpB_̰TW'szc}7SsC0{gWlfWaWke1">znGik-pOUY:޸ Z5'IU:VEy l8j)A&@.t>aH&^nf^=-w-2aI ]̌yi9#@qC[c|tsɪg_X8jLo_+WoΫ#$5Np{!:Вk#>(= ԝx|oZz>e<51؏}.>}a̹Ʀ?r]:QEs*գQՇֿb}k$2X{#>RyƖ<wR陞vz/[`_I5o ,?*k?}XU7)-0OU?Yz>NF]ɠՖkHGtN0̼k/0n]cPU[C ezv|Uu:&VnkzIzp!D9x1 QΑ>k?2켎m/ye0y[?PeI- ~t{ludÜ?W_W9zoS?El{mtO[?/OJtcXtn.)>t> \&,~83A0D_3WzpsP.)ߕrڏG¾ձӌh@Vu_URjŻq ?Wif8đ>:WBt\jk'S$'̙^vMf.-p9:^ٍKi7VP:G&Mn$.d+;;_|EQ,D2_M~3CY-^CկʱwR\nc6T~y%H}^ϫ:l½tt.-7+֞Ҳmx6`>k;}v4>Y=.kdH '5TC$:d/?axMTq?ӫz &+RI%lW3prj}:Ll._wԟɓw~谲==&x,iU鴶6 7ΏYz\]a#TW>7+guRZڧ#i8.'B[~N<}#_"WnzoVfgNʫ/YKi!{Vvu _S}d/m2+RݦUtDIS]f27&4aWkrkL\;T@Vzn@XwZ-ǭ%WnodFk]UKՏ]nc?WI$IG+wkV-leu%F|`nWuދf6 Gc~+/Aw/*adegM̱XCL _\;۲Elqayt:V?[mApq\N ~hΫ׾_zf}Ә۔\[;v#zY7*!ۭm-=2>0_g>.hm^2GUw>lMYP$:0<׮Ӻ6՜K~}5lp$i38Ud`wk>kwux=~7Ob1D X){S[7Aܮ ,$ʽ}Fw $I$_W:ONgMC-!Â#/e'18GG<|M7΄/_kk/ԲN@0ClI4}@m~Wlov5-}^8/u>8w|~G~cYWM(e0|bM_ #kykv\ܖڣ2=, ?"^Vި;^^kM{#yOu?\iqf@,\}ZXzMG*qѶ>|~+em=sL s^H#PBt$I$+RI$,\<{2rkZI(_}8>۬mUKZ+Zjk^ .4 /Λ>}rV jn$7qOw U10zK,ʾM2@=9'c]m2{Or{xS]:q2. {+~^tb mv'b yOHԒI+RI$IeuϪW>VYպu=F5ߑ R'3nv%Yݡo܏@ldR4#Q<ӵlk]Ns@sKA?!^B żPOp>EqڷlU&9l^<6~ ߩ^:# XFH.kܳ {FʾGW;33 1Qwe{$Je4dddc}*p~2lƞsd:'kkN'MyUdŀ}\oִ0@,|wS _?߶Lk]?ޫ:LEO2/Aݿ0Y;ayg7⩏lֽؙgU[۷ƥ`uOKm7ADnșk^ |΁իcK*p\`fv7˹di j> {GwtxXu 0w#yܭ5q$_+RI$I$_+RI$I$_>ʆE_^T? U?szUZϢ?,ӕO%/Ӓ"?JMOy#sKGg?s_+RI$I$_ endstream endobj 13 0 obj 9575 endobj 16 0 obj << /Length 17 0 R /Filter /FlateDecode >> stream HTMS0{Lgo۽)PZ ҋHTƱ!ʖ-Nx۷ow.PFE(A3@ Mw2]! "!mhL{ 7L\} Fj% eתTM1c{?CZGD=N7/U1(\V:SɦtȜ-"1 4ǛouWHߗvy(J(o*rL)NN<ey#+N]UFhIu(G=a ﺛFbfԈk]nhT.ma NbG8%`a7.S \l]|LUȍrY8:qm8cDvP+ g#459Ƨ; ˭B՛%P E},#m ૅ$#N[u KcS7NUta ޥϦ{iz endstream endobj 17 0 obj 701 endobj 4 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 5 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im1 6 0 R /im2 12 0 R >> /ProcSet 2 0 R >> /Contents [ 8 0 R 10 0 R 16 0 R ] >> endobj 23 0 obj << /Length 24 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$DhJ24MT8j endstream endobj 24 0 obj 175 endobj 21 0 obj << /Type /XObject /Subtype /Image /Name /im3 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 22 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 22 0 obj 734 endobj 25 0 obj << /Length 26 0 R /Filter /FlateDecode >> stream H]RK1~iP u[ݛăi%-;d t9A3xPi(~Co|/ CJ>RjU ۴^Y%%=i'$> $>ءk$cCN( vѠ{|Rxq S4j˱R꟣G}JE=A UuAd\cXrO::D YrxYL9mA xTF1@WW߿T*Pj(%'xJ%Tc.3\䷹^|DZe~7`8Tga\(W'*'`" VJyV? U;~QokåNv2YҊ&uY_SPxX ߶&dx^_ٽHL=ъf-,Da ù~~ЯWm7-@y endstream endobj 26 0 obj 477 endobj 27 0 obj << /Type /XObject /Subtype /Image /Name /im4 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 28 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 28 0 obj 734 endobj 31 0 obj << /Length 32 0 R /Filter /FlateDecode >> stream HR͎0~wiuI葋7l nKnrXQ4߯ hxW XzVV6#{ATˊkcQf8Kd/x)\c`(XPw! ՝dP0i!hk<?iz v!ڼBRlz:eI4snJMӷYEcB7H)حh-q \qH&aڴr;` )2,{<]pR!p$@sV.fmY3 &{=n $$ٸź *w4>fSI⿖t*;[5~.|LzgpʼFgg(t>\9Ԅ+媻?wE+|Vۮ endstream endobj 32 0 obj 414 endobj 20 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 5 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im3 21 0 R /im4 27 0 R >> /ProcSet 2 0 R >> /Contents [ 23 0 R 25 0 R 31 0 R ] >> endobj 36 0 obj << /Length 37 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$DhJ24MT'Ewo8m endstream endobj 37 0 obj 175 endobj 34 0 obj << /Type /XObject /Subtype /Image /Name /im5 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 35 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 35 0 obj 734 endobj 38 0 obj << /Length 39 0 R /Filter /FlateDecode >> stream HeRkA~RE0LF47 Yū\&zt&̼'xA-vwu]mѩc6v6GƐׂE8:prt|<`~31ܤ&C3Bߴh% V+ea@*K[e1Ŧ^>.IA2rk鯖e舘:$ /@l a*^ (?3y(nyYFk&oE>Ϣ8bBdß\cP{2Ot=bYhb.ece7: ԝ!>s:[K7S8[]+6Yc]sjU!A_V~Agr&6 1)Cf#J1AםspzpM'pjǵ|z4'1z endstream endobj 39 0 obj 487 endobj 40 0 obj << /Type /XObject /Subtype /Image /Name /im6 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 41 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 41 0 obj 734 endobj 42 0 obj << /Length 43 0 R /Filter /FlateDecode >> stream HVMO@s4jff?-(E-pI1C[]E)9Jfޛy3/aPlF(H}he-l!9>#`=.lpL5pAM]B~[L˟UQGOF)O T\v pIڡ0\WG= SC9Z؃?0zFl=cڠ$ N߃#vլvb&B"vmY RRC o-wa3[TȔG@(rSЖm8?,?d͢*ۓaCOxOa5vQBJziw>ʹ#P;ˠ@f؟3ECRe!]-͢i(ulϧomjڹQ+j w!]hg "C=<(۷E^'H>1|:$ 禂Xd'XzϾ㱤jBw egs7"gOZG^ ~?wXy֘(Gp-z"7MG07z]-V%U={ѩCC\ݻ#`vo`Um`$! endstream endobj 43 0 obj 679 endobj 44 0 obj << /Type /XObject /Subtype /Image /Name /im7 /Filter /DCTDecode /Width 244 /Height 160 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 45 0 R >> stream AdobedC    !"(($#$% '+++,.3332-3333333333  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?֯cOgSl>h5ŀ#7_3-ZAEe|QYs;H>im |R@ -b)^SƼwt R ۄnQp5LDM:4 uh5qbb;&#;D)4BD' 'R =N<憟Eu׹Qx WD5pR R S 쥦Zk k  b<=H43+@#0G>*R9SϊgIs)'A̦vw#1"4Zt+Eqt=O<$ xHm'wBrh3 O- Ly' ljk+4wkt_6]4- > L(h2>)LH $ ( v_7-$+iDH ]$tL]$tR'HT )#0 3 C.8Bx!"`H:jS;8)d*MsD8O郤n] tZD&. &SHCNpӅdv'Y-Y&Io;(;'$$%Gp(ۇKjBrA4ڂ>jNqRxJuHu Z9 G=0 s)l>)l>)e4#Qd}s" D3+A<] ''[,sCNc,sCw ܀GοP㺯ѿPP5M調Fq.2LXvz cx#-»,wt.е@Z|TiRKOf||:ʟ:ʋ .]d'mNӶu[a,i B"T-<e4DhtJ}J}JQk!(qJ @7E'hF fÂ>+Ǵi](+D{Lv0HDa..a.!>E@W|k]Ouꃰ|{|WXSdOuA2 / 7Gsp<&s .p At'A}Sca /mZOxOIP$4I0j^sF6&B 'd0=OXncj9 6] pqPfK,>ú|ͦ[,F;Zmx`wP2[CAq%G+$c5_ӳc{+ @5"~`ZPw,#հ(LzW^M)BwV~RJAXO@uP HG1_Ԭ=.84jI( 5RHa] apO\>6 6 zikCݦ _0OSĨgjA;+qgO!jy;0I[rdz+չk ԫi,^]5V.$ VN$+R h#|UNTiΨIBdQq$'ED;ED;DumvM trF^.+m~CwQٰBgYqIycȪ?\,om?w!֟0U4+\|{ ΥPuҺ?TEaA't_Wz?YU5m0 fllF2]M|Bw|"Y*'i5ʷp?%˚ O> g FCr5 |G:S9̨\8 $s}Ѩ(>܎]Zk:p0m2Z lHÅQeC[::.wu¯1ǻ@tzn7P /, \{.wYGU~6S H 5 w5Ŗ]s\4 U_2׾ָr !S#fl! }akomm~TkWmW5+wUZ%:k q-}ēLJ1E$ ,k$<ǡ >ƲI&}^y$L齃& n-{#/AU0:F>1=#-:GG=lS^nZt˚U{\\'XWr>}U08=DhgNGGS$<8}3'ވrCaD>侳Ul>e }+#⎜6[C]cl2C\>&RXי;VGYq+0~v]N+ w[w٫0;k+}Msj'@gԯuىӫvcsCn'P10<i[Ww֖Kwh8h43Qdc\ τ7Cj`:S>c%dk ֗O}Fb]QsKNn5F}Oʫ,\4БZ-]2juRXKH 4$kׇ>zgV⾌Q4gi* O34?]/?lA Ӻi'\՗1rHL{dN\w֛3*/0ͦfA:Gq[Ne]C;%dAy2IBX86LOA Lx*[!pqHj uFi&D sCDT ԝ̃ :Eydl$ u0tXtr>=zݣH`a<;_N@r񵍘S 'lnyUwl_7!ָ^T֨xtc1f`xpޔ $>;#Uﱃ6y~{A=O?`Qa@Cz݄÷w*~3ƃX& wIU>= 6vx.eϴ4aU"hjߟTWf:a-s@Zbdo̬}׵-s@V&O ʫ:_h(WS*vYs@ZߗG?#mmf-M`ߗֲWR |V]kۜZZ]_t*ǭ&<5璯f'Pwh/p^y+C3`:I ^y+ĸSE=1T6B};곳 _oVW x6ʜy=.t2+'v3t{&$}rwIv:/hqX~Yqi| :q:| qYz]as$΀yժLp.}cp$ bsc"I:_ʼ~cZXCCiU:OZu5cypnGiUo[O> 9;w?JGnӍw.}p 渿sՍik.}p O>[#F5W@5cvMY}[:ڌ8m}oȯ+/:k#ekUy}O*̷{>=$ ϙ^| ϙ`YkLXay=zW~*,AYm1⫻ 5H/}kz}g].͝O޽s;dBdBt]6i8'% $9aΆ~Ukh -Lނ˲] ,.љsɰtdhX'N9 -`^}X9tYC w4Fkbu82ʶ5{[r=&F (gYX=k덴Hs6٥ R彻 4ƿoW0`3fu?cs+8" D|*:}W#ztA$%v3>խ` sC"~V'PfbXeTuՓYo3N/RfbXeTuՓYo3^7Sb*}4ao3qU~cqh&7DyH+;Q2+Em&s@<$vԲvzV5@A#N:;n <k. ZMXMúҺv>_JSh 6l7tNWՒΝeF9m,>%ieؽc%MsX=%ifN/[{11 o9xa]$ZDjgz용%R׈. NˏәӲ꩎m r#Skt>X.7l8H+Wps9 nq!đV~ }Xnq!đ-\7'9쵛]t]{aK>+]2wtw3ߎMv;l뙣&H2AO[_Xq*ƴCfh q>EtYpqnuVkFLʆd:.Yy1k(122InDˢÿ eZy$C"~tgt΀LInDGڽ62^\k.) Ȧ ! ɟ5=_TS֐do;60L7Xg}#Ժ{[?jޝazub8 ӺeDvZ{֭ ipw8WwoO-NkHI! ;>%kOuoOsel>-ײEUF5_ֵNʝS ?Dվ6Phhq$8;\nTn{8#rؿU:X޵PN׼|r>e6u,6odyj4T !2q0[Ӕ\ߴYc5c dZ7t8Z3Yn.80a th `&߬X!5-̆82DnϬ=S!:}&gY}MVOvj7DOu:UPm`k5V F5=p [x5*pa7Y[+Cĝk?%S6T-6i'qW~?E#һ--D:'=JE--DNIk:?S\}d@+8\L|W9Ēd5˗.q.q3'J\9!2q ՛)~0 +ٖ]m?Nv-lHp۫.qlmyy`<s:n  Z,ۛ062tN<~+Y8tou{7`m]>:PwTL06d鮟z~=O ni.s;,61iniMyWe48^qxc3%юf׵w:v>FVX6Yx7Ե:qpПV'[:MkjuB~Ht޳n64zOr>p^Tv{=hqc<{.nwQ!q^qc<{-cu{1K30rmqs5$'ufcabm{&U5+Sy+R#Tl kck.3;uӕ+؆7rzYN^GSL osY_ڪ4\ّXyVnȮ}c}Y4)e:V^OԎѧ"0#EJ,edfft|usqfe=/ }'>c]t5H#_7 &3ʼkN1Wmh$rokA#=9ZG+f=Oi[= 썸DvF";#lGe@vvd8UW?UO0??>ZOn꾬֊5\遤a}Tp}9miL +3G:]9LM_okDweWϫ`ּH(Oz;W[yH*=K*7uZ \t7R$Jc?3}-s sv#XY>6:܏7%sKZGgA>Spr>2۴^knt+n2tkhKn&#.tޣ_Kꭺ5̗KwGIк>gUq` 9d[#LG_^]yX95Z\0{.3>1rq\Co,.=u,Wafo,.Uֹ;Kb f@颳U'3XЂ{UZ9$=4{Uz;^Cm`!H'[=O bU2kѸO:DG,cU[kѸO:2WتzXqО9_:WMmUo5-6442$Y]OۙU-ŮhdI:wOɢae?vc `7I2|[jmc0{O᧊bl;ct_iޮk]q᧊gOh 7Zà 5D8Lˀ.۸U,} H0A;T}gUe t`QVKe7TKKEdt0NQ0.ã.ZM5@a% Ѐ >uyTSXc.]DN+ +dYmw]r}2᫴ea; ff][eEkZ\.]:JzUA˲28#I׺A*H'^6t* #";q:~&6FFf>ST0KI28:zn22 3V; .$N̜lY9\ wi28C.UůsAq'*K8y]sAq'++Z:9 kָn Q=I_fJY^$Ǵ=@[[i2/{ۺG6܋h{@E96X^NAq?UY=̼s. blNE^d΂={ˮW--_#N\Re>\imee-sxO6ojks 3GPվqPcehceku_Ckql{\n񅞖]!%įfE++6ͯ { [pq vʶܐ5u\v732^+ yIAXcSuַ2Y3zjf8"ooUԯpph:*Ӣ}tjyz5K[*eX6L;ɕIZI_5׶T35<~y/o3[+s25<~ 67ZRloMnWCl6}PܩSv.FwVäTms,M~ z/֫07ih}&-;p-^Աq ǷR]3<0|8[?V-ɯ?~XLItik/7}/69$I#^?WzoQ9yAelx G%Ovn^UM{Y[^$IG_+>;~:=C E,9G7՞в*eYӐcׯ}3+ed3a> ޅ`͌{ZR4B0ε9<$\^wZ2tNJ%hgft0ˋc,1^MzD Ǿ8k0w<=+Z!xyQ8B۠crhe{\"W8O##1{hRv=:D+] ?9V\\Ip]N.I_z5NypбۇrO=U>^^+g< y-@L ςa|=_TiAkx"۽չ ?xeO&ƐyV~:#p!=F:p-uY4[-֝^, tq.փEm.a/I 8~ǽN=sߺcXyG29I3q?]L7l}fs$əOTRwyCs$əͰɇOۻxR\ p{lN^>"%Ŏo"Xw\RT+Ǻac[7h- >RRƾT[*a>A~UM[jeo,~33nkw [.s:\{ 5 i?,zf qx<["?*U5l8"?*^^F46$G]ks=-$GZ\SH+WGM1M"?pz=+tEj˿SuYtEc:.[}a#OÕz2ۘx~ =A5Kn`;čm+ZpqZ y^1Au@sLDZ p_#1 LyB wY^Kdx|{ƍ=.mHYXx{m=tTaVsHv㾪gC(a@HםH1NQmԋưs7:c 2qᆭ1Z" Hם`.~aʩزl>+ 3.ȭSKbɰ>+9n] e76KwyX2GM -Kn.郎GNmԎAi.ӟe;B\*%ܝ'~^SV}F@Aneu:}F@A:V[h#KhΫ^c` 8gMv6z]Ev .o­W04n&ʟQԛ 3ml#?g+ՍoGcn8A~nJ["9(x= 5ΊtSY9%UK _ Ϫ}WvWn¶y^;n [ y}e鸘@@OfE'˰Q"A`Θ?%zLލ` wX:@ vvS hԵ'ڬn>G_Gb$H tP@"Z~ r R 辦]A C<uTlkZ!,]ƺCr,VkP}1V8<9qr^)֡$c~py38ӾMYnXݫ#4I}/]e"u&yX?^-9SMuHԙsOmu/Y`tI{|e~3 0i3 F S̭m-;.Sb;;ܠ6;.#ncK.{;- )61]۫^7jg ú{c>$mկij2gL`f8|K6׍ڴ*9gErI7p-i!?T"X .nZӬC{x,zcˉpde.:70sgph$Bcp{l Xpsl ẍAuYE3un{~,|"+cߤKuEjWDη?'7N'HujuLyxu~UonTHtQ]W^;&7ckAƲDk:[.5ٲY"5ӎ F.xgP02l7~<#xN.v͕t߸H8R,T6ݯH8_qm-˼wp]Ǻpm-ku໳uUg2[1wwvC1ײZyQrMf?GV[OldWS_6D{P%83,}=5<}ՋTgeK##SS^5Ve{/HMO/.`ONspq.,c[},#]] 3{XH|H;![ IJz^Hz0mPl,xCW ҏQ̍~+K*/xv[Ǿf@RA1ia݉MGNjrXHH&4[X86QEWmMy!@I2cO庶-Nek-kݳ\&?g潶lc\w[ų1͹};opu37(x"^P S_J߰W[H3xeHDJs-Fq4Dn=l@lZǍkxv'kΎ1^N>=gyn$/S3Ѱ17.[kƮ?t^-th~h݋%ō?:CAtV`.cc]5w|Oڿ}`+jBn8(MpQ Fd Fe%Qץ_T4mhh?u4mָ.V?Σ5xj3p[Z^H;ɀyw~WļfZ^H;ɀywxΧwlihkiIoy0>s?Y}b\[wgϬ5d?Ye m.oxƜB澵uS,7wvZkq M ^[j#v- fNڛc7WAgIWzv^..;6[AgIZy]+ ܍mX p:ΒG5t.hs%pj+q3$ 5en{d 8^1ZʜQA?r{nmnsi A0~'5zMn*X@~n#Oacj;HZAcOpe2Ӛ~ebSHp K/d;*u׳c憹Ò o ;k9׳cp ǂ9KHoI[C򒶮ٟY\*4IH^<=nh:4EL5ƒppx9iѢ*g1n;nh~.Q161`fs e7}qc$s^b`n]/ਦʘI@)q1QD9p^@3"=8Aj8PEv1l/<m}G!o!sfK-$0QƱپ[quex暑`im $a$οruE 7G$οr(u,'\/0\ḒD6']~zOSkQo.-G\W3uYA#W+ӺOK)}.,{jS׳/86T].6`h8VqUtLk]}u^ìyh8ZxX:J,},5Vjtϙ4UhnEo6dVU w]::N/!u>ƈ t +znKLŮu_= 7tfUsDAnb߫X=euvDF_ݍA)u64::|Ris^ sQcױs<sS?{7;t>J =K+a% Y[}B% ұ0o- iPkq{NP+siAkgR?koXWX_陭}Xwcy.鱘\F@]1+Hz\j]*Q1ߛ+Ա^\G.{fuv dLOu_ir 7UgꓶdΩGU~_T}M||Wc/֚@`ԯs ]>V+Ȫ֚@`ԯs Wkn~aU_W]c}]=^;|$<~ӀϪbǰHv %%&$/ ] VW]vwOXэLjI#n\-L1SZ1$Z]n|7ƌj FsMeyuM08iR³:s2vKmmnXǟ+VeYuݕ늝Kahp>@윜|qmL ;qmL.61ߊDZ[C_d ]5ٓo mRsm<\=,W<a  rnnmba@HiLU1nbaGѦy3WWרót)C@g1?r9pV+p~5<{fFѡ Qpx2!i/ahi$$'Uq4I, $Ny$;@Ww: 2|w2q)culǴSU꽍?z.6}ٍmdL|GwVvF#S}o\LG}?8Nc7l:G}?OH}u>O̮Wk! $UMAt ZKC* -QzGN jm` A#urr:UWZȲD[ĭps\}F lW30c+fD[4>:oKm6P=o$j=;`X{}p.uӰ;*xoP$jѫo*݇kqԒ:f>Isv]chRK!?'NPec}u*̋6K0n?Jw{Ȼ܋wl`>y?%C=ߑ{.v2}`Os_gvCCv+5 m;@\Cm-fiJı̏U|~ 5ߚ.5s1Xu/a .ƥzϙ^QC}:/3伙`Tj_ϙDµ]Kam~Ήv=ȁKk !t~t,ƹ5Aq x5ϵnI xUkah <nsn!Gܽ#ꓜy.껜 sӿ9^i4ԫ+_\ˑςu\N|%r9IGQJF| UJԖODuYY>Z'U}t}u,c\Vg̷ Qa`}d{ G?sh<˝/IQ{ˉzCE[;wxҿjYQ+`|>-QӀO̻nUKK* ZpzUa̼7eP Ϫ _k^l"}ވoX @⿤Oq:q[ɖ61H%>=)H7yٰVK~;kAYwm T`q;-c1K>n`]칤Y_k#m 4aj:$\Fi-]]\_Dm[є@eo3_ CrH C9K.5򡬭C9#3C \a`iHx<-ˋK>sVA--,$x+[bF8H Ǥo,4_50E{wU+ϳ\\${w`}wUo- ? ]Sk\[[##̍j!Es ol_#]m9fxq9{*{ZH|2oeb4R^ ָ43̩a}eexK%#Íf1>+>٫ӧFY>ؙxzM~RH١IU,˺ nlcUM׀ZnZh-lh4U,$mc\k#&9:e}vጛEiy/l8|=ӇZ ^k`p5,NX[gLM'#9c\]Ucш4BQi¶]{^>}'*uVLI\?Umq =IƹFԱ2(xz ?짤ǔ+fupE䣨[4=//hpT(-{ȍDz@%yqV q~tw8GzGԣ=.' pn+BN ->AV qynVcWG. A: fCB2ՒZv]LWA3~>Q~gS/J댻*CwXW(7>PX>%Re[ͭ>JVz*6vskt{uZueōVp$o}gϲ_M -p{tF3cl,NݠCTX.kմߨUΡ`9s+?v;Ycн~/\dY`o>ܶhJZ=Mv9kVcȭZ7%_Lc3IS?tT"};0:;Sc E, ow;K"}7bt8n瓸-O^T҃{Nm?t*ngIs}wikZm"Xj۫5ӷ5,5mkzK]^C[}pCn/D斱 nh - Ɔhwۚ>BGFֹhwۚ>BsK\E>DD eOv(<-:LJs=#=/ L.>6?VN뀩 Yk:tVѹSxtD?/- soNF w_KZj mqt3[cX9k mqg@+ KÈH3YYC#"懽sC r]s3mc-1ѣ,#Ͷ!1~l{ w'kο53,ͧeXI}Nב?5usgMʴ5%ܘqް!}jlYKWgi:?Z&=GDǴP_ΪxGVLjxc!W7@yhx}A~kk~o']?h 1DtULVi3Mgp`~ī`~`~_QӴDsA-uv4$8йKf=Ů`X-WcH{ k [f^᪽C]6ucua\hOu.چùL!uǽUsLFkZh$c ۼNq]G#}YĹup\Iۆ'Ru7}^Ź dlv3u)u1ϹKl{Gnigod2DZh$vVR8Y\㗲4;w*WFtڞ/k"C!\unޟS{\6!̀5q3+]έ[is]/kW3> *}`{N_!w*`V}ӡvZ_FX}ӡv][66`~i.ؕH{ j {Gu 8`oo:&6F=!qs;p#A1G;;~)6k?!a ˤz i_MMX5<۷e X5<۷eԚS'ݻ%١h#46&4ȍ既֙"4k9WE@߻6W>ilH i$LYNa&[ܿkcƤq5.q{$>a8^܊clgG^ᵇp&[sZ^-UsYXweW">bu+]iڞwsc;'&Pk6k[jxU6f}60Z>ֆ"uge`t/ֹs0O~ʭ]P i,s0O~ʵWcɌƆd=/侫awOc_Gmf`35XWc뾸}Lt\F/{Xlf`35ERqnCnEƣݳ$6UƧ&Sortsf=ʺaoO߶}?IOhnʃM8:9@sNvDkThɹʯ-`My.'dFs[]Ӫɵ{ X 8$ȍufuj:MyՌss/d4;G VF3ɧh._.u<,\,òh{$ˀh~1+ξS?<~Bp>c*rZ"Ť;ͧ \Z"fIޟү˗+?_ NX>4ҫcb *ՌesVp5V :dO[H #G~Hvn=Ͷmsx#B,cpGex?ݵÂ;/ޤEqvs[9cMecUyX4W s[9T8׳V^7L5Í{#ĪtqfωZ9Y[Kw9 skst"ymt~s+[<O6YKa.a}B+eշt#@r2:cKlX59 ܻrm0'O\&_[Ȳl<ɀ`x}3yYV[d$t%.qz6VMq3 }?KX=ε1>*;&`am==c7qNq|}i7MƱ_qq|ak+zTn㫜Pcֲ-֍!WkIg[ 7KZ,!c#pVɷkZ%9_v1~5ہi,5]sY__pr.9;ve994! Kqqs%̓¯oiq{ݸX߯8Vn.q%bK{xks4-Ds[m ~g`Ϯ=k34.`"v! y6Gv:;Gt~8Gv:;Jt~KvGv:g888:on]ΫKpv&kÃq~gs_ٸ?1Ӑ52uIZq&1_"upƅ;>c 5\}ή3Ч'[qdN3Ф>=y{i;7!ʢi{hfHtɽܴ@὆74oM0uH}k _v:>zev:ǝXez8ɉ|W%Wš{=LHП6[gH{f=h' S$SPvC&d̃+誻z$ |7̙c:  3&dQɮVݸWU}v_OܨK6ȱKOܳrڮS:AMG}gD6;f_ 1Ypna&[a&؃[IeIqcS 'hRv_)mX`'u[Cq݋gNЙ\bX*;r~¢uf&cX`o!Y3N}at>j ABWzoԮnȭχp]7_[7fx8^uSo{ˀ<ؕ qVZny ڣn+ M6x[4t)14ptS[jchOL[Gjb㵢!jֈk+aG-A S >h]Ht KSs]ef`c3^Hv rݏpIkWhfCrmÍG˼olW˱|~Uc_OUTF9ҧ7F=gS;Nqu7}Mߣ%7}MߣU:85L>t6f?6Coc#Go£WS]ģ&tiG6(tx/ձZ߱dŨ|?Ȩ~=cE?X[})ǩD7n?GL)3G,$CqHIЧ7*`<Ћ;+h 8ߐW !A pj#CaHb64Rn<}%&cҔfcÉ&6cE薟$>䃓ӱﲫ Q%yBdYM`s$O(y]>KK|'11;rN8CFMSMR_Rm:4Sv$( 3w<R_8],8Z[h+ϑ rlx]2uKEQ+YEaV6UuL|i^N#[^Xlͭ寍 krl$:^W}ݮ&AJ.{C{9vVI۴z~QiǦKA]M$HtX p {!WEFߖsޖ<2'ŁD( $$iH;r;r#Nɽ"4kDAn 򬵭;z`4tғZRkJ0V Rfv4[d{d&a>3 m0gs-ϊEb1lh:ƎtV9> stream H T-T524V0B]CS3Cc=#SSc =S\^\ |^ endstream endobj 49 0 obj 50 endobj 46 0 obj << /Type /XObject /Subtype /Image /Name /im8 /Filter /DCTDecode /Width 284 /Height 208 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 47 0 R >> stream AdobedC    !"(($#$% '+++,.3332-3333333333  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?\)yp .5 Lj !9bLBp8 Me{%-]ΉjtI 2NCߒn cΰ<9N$䜏yD%1'ӕw1"OD>i|tANt@Kɽ-/ۚo\9ԺAW/u.֞{rMfߐ,^ȕuF>Dz:KZAJ:@RU@JJDqJD\ayAvy2%@dJ%SpFTƳN@5Zx-tİ 5-AƵ=ڴihR&J~jo~ Uovjݓ[³:iER"F) LQ%ĸS;q;-#8H THELH"`B.̭9te8|$!7T\B nΆ iֶ?Z~Nʣs*6*2*ggdYu2HT_ *OUh'T2z:[:euƶ}yGYu++'UvVVGT0yTd2U-FLx^M] xzkf5b٫Jϸs1hHٗH#^IfM.;Fޥu+uF}+uV_X<{SFF]kky(TbfXSsSbgY{]+iZ@]?N-l Q2 s> kyqP5?6z\l 5?6\'^|~\y3#0\koGorAcݺ-i]prƚ4knSUdVE_6=2mpʼs$#[̩!hbP 5K%.4[/3 P1`1`j4 9+F ӒW.µ\ r"A(bd&2W<+ K) .0JrLĦ.t@DE)|'>%I4y(4j4Qup<]f}5i|y5pΈoky*08U[`qp:wd2KTcD]ֈT9D̻&]@I0{q%в5;,Iv /+Y}qUYy=^g]V.GWCebuk^a.αI_c:_-ixx7ϖj.ϕjj(rJ(n;Zf= PtץcytbvgV7R7&ѫh]o.*e_f;Z{zqu܍t΅:|q+Wow]OJ*A~v=7ju ޢon KdX>>r^iZGv=uΛoMun O%{sSm;AYAwY{_~X\fp-LfznB\B@UeѢ1$4i8Wc{IW[UumBxwWS+;r|Ujk*a{I]/ιV r06L:I{9>_f>(0I{y>u^f~n+t=T@o-x{mT+-$o]qW\DuUe9x)ϷN}^ [E#HHSΟJDGܑGܑ$j>tݩТ\yQ(7ƈn}BGPlipg:>ְx>5=`0fX ,sU *;J0:ZgurϿ=duz !du>B_Lμ t^iG5Ē#L+*̛2OeYs~ OJ f'a UZ6 8XۅOU bGyUJYgUgU;,~jUGqq<@> JU:U-6}[}_](5۸{ _PX[_Ke@0qT=ky|~]NIspyrZꧭZIspyE=sXkI.p yqmpmx\M{{FiBZ-'x{i>%gNF5/ȸ]m$\L^|j_q⺚K~5tzCiƲ浦G>kߩYX䳧P9cu~tgXdSɭ:?EN#f3u]$?twYXwX6]+EV"ýmetZ8{?FߛM^K`-p(nveVU{`-p)eU/e/նӓn5U~b Ժӓf5W~b .^3ʶ?IT`#U!X3X"#U00fo Z z Ƌ$H ☓$ 1D\Gu999uuIl2iW(vݘ&`S1LncU+s*vJi;Km`'rX ܸ̞ Xyt\޾:V>WYJZarzf:fqjͿWC&\vWJct6ߑy%=5z 5yߗ6Gf/mgMXԍ;7Rޡh!Tdg_UȴkϺ]/XZ٨mV\١Ctָ_n-S'cuq/^o+:Ӛ \Gמy8O\GA.=1u}/ lq~{:W՜~*.}0W{!Zed:gӻdqV}oa.aݴ<>?%}GuuR@a+VRc+h0ӧԏϮΦOQɿvW{4,U4[ ͤj}MZ{=\+.K4y#Λ,-w[lL}ykop`dz&f`0Ńsp: b% V?H95][l[(XYU+ qĻ1ZlnI>q--ew [kce#;G9@/\:ډZF:*_WN=;.6ߙV~ܐ biqXᵍWMk,f;Տ!O]ӝ31}| ?(^Nt.2N]iѳO:eyu7]WNՙ4cV7cGdA_KzmtޝYQX-1#2Wx;9^gĬoq<+Q}0lSlMʹK_"V$n'GG\:i23*Sl[]S+sq@B摮UcngWº'P,йk1?Z.a?>[f#]9ۢ-?~U{la:KɅ5՝_ҫg ]\"ͯǗ~G>K-\Guݮh#X@#R ' )iot?_^:7N({IJ$w(oy -(6[U{̯{C-2NFYkftYSh;>+3'>!c>򕏗+dVNOZcf>K3jdNWe'@GI ?ׇW OĕeS@ī-e5h*NHo>'^S4o>=-ΩV7{/h?^/vFEm;h?S.͢\=+79b6sou ~CV=9xo.hV`ꖽ~ߤ}cAVCEb] ~;Ihސ ~;IðO4{uMߧ`yYSLx z6VW+zP5Գǚ[gE}W깗b1άUo7Et~.5ŭ<lt8'dz;c<v|YoآC f^;vk[O L@> OꩫdrpS{j~F= ^A߶k}b00ڃ_ Կ7n%~;'Nyjk/8<;"KӸt矹hdaUw[dWcv3>Z.]YŸquvX0u/:{]`|m9c5i㺻j`>_#P]X}ToMh]K7]fWa(mu\>Yq2w07HbCXka?b 1[tȱr}kEi-a~<; 7ճeFM!k WqQ߈YվmҸ0u|uV ll\z`s]f q9uWG}C1}3_W] h `^ ki ;34@c:=9W /N. Ѝ@)pH(7^ xl\y(9^ $eK ?I~e=vpg䚫Z-;hi_X(k}vڬc`kk+ecc#qy==@5qt});'<9_4pu`u6'0LR$ĭrtRLJ N{D8ʯeyXgN'OK&&<Trn# k{ AvWԺMld Σղm|2-|OT 9V{>M^y<;WS5ģׇSuģ3p$2({nȢpӰ^Hi_NާcYgRΩcYg]qeW8 -.p&jX;qed n},~/՞a>W~f+rCMD/wԦ VUWX h2`}MƯ9vT5ߐ>MOڎl#RhOA-jgY2GFjLṱ:2_:=} k s+SbYo%3u}`7:U.Nsuqܸ~ԺWHZtm`jgR`s˯>n9{4+g^­oy K Ƽj#Ւ As&xaVƲk9#@Y Nꮲ@<M09oq2疐y$z:-es- &<&ueUK^[|A "dljЙCΰ>9պƴ84;`}_Y ΰ> [*|d11˚y=&ci&mus0' Z2:aɭP":`Op첛#u=ǰmsy%ϷAg|鱿gms|?>ySOKeSc5m%ϷA#F=v+6G+ }Ck8`rժ8`rTr.V/om9.֧kmYwŲ |k{Mk j۹;>\Z=O/ګp?%}|Ybu.-jI8/Lmk"t4(Vs:Ee <>ZxYVYzmM{]k:>-}* }w?wtf0h.oew?wkT[~ߴ{ȴc C@ӓ߹TmdZl !L⨗dq"m4 9=75Sv5JL%&Iqw}|N A{c$*yif*9x,jʸYyV%߬Y66m51J9%y_ɶM6ϥnFXkc~$3YhI0PmǬ;B?u|U4wۙl7OS7&6iȾϢv-?svc{h?c61~M6}?4+w U[d}򮓧}IκC|GΗ~-KlvӺkj;k][s?=[ؽ3tƳ쭮WuvTl@zk+*Ѳ;{xm㕡N},m9VelF'jf{FU}; 8٫'h8Z˱b"kb6wDzMgPf]ؚxkp8r DsZǻΡr~=oxkXp8"qsU/ϩ!WEwIbuSKqscHerU:=6<18C_pG&cuޓw٘!$:huqnqYZ`בƈC߇C`-iglL &K?CbgLFF%\ mx؝5^ձzYX]/GCwn<wK7?}o>cBlR6IJ^'RW`KtTVŬ˽7] PXw.C Jlql /3!s\>ӆym53"ǹ.}H5 K^E/qsgN`~JUaWz2Gp>Iì[(3:R>$|³:-)DxnNINL'0I~M'~3ʫhsL׵өT& 0ULcNVNpx,'efXt^ mI:C6\u+DzX7O<*67Xja{w}w\t4 IVnq:xG 8uN'~xièI8b=۹.-΀I.v]6ԬoJv4͠΀I.p%t2k]鴽NI%tvk£3,loKNΆ@UNv6 ]=6Yr\pM@T^N¦K{$6SmwcQe[TR \ο)k]]v]c tvvjuySeck,)9Pv5!3̏SK[O `J"K֮8ZO#W*{͘lYhiv=> xIm-ohc2e0<<|B.;^p_cocki p<|B#wSّSX/k΢;GpWmnkO.up<'^곽0ަDZku΂u9=@^ױs] p<'QӝS>լ1خewXKCcʧzUps*Z G{.V?TǙhd2 Z ˔,z^-bI8?Tl7u$ Μi*o Uuɧ4,`rZCh!^aYe=#q{D|-.f63ins>G.s}-sKN}'#[[^Ms\ǵa$oq>Nye]2fh#cyv;L p[nl8ޗ7-$v\v?լ7 %=7*Kcë {H[J~%׹cn3@hlpid7Xa4<ƁtM̭*ekpCsk{5w1rc]^u52T5h8!ƫ˺khkG p]%}^̲EԱp l;q04P˭z&5a ;H+lonaicZei`@!>:}aKH %ΒwXS6QU5Vh{H %ΒwYӻS4zZcK$کt,Z׼RUZqa yVcwkGs#S˞Y>F׸v?SzefbedTA&~Qu9Y94IGc[V}ᄚ: 浺Λqkiu};X^Pу5ol.],5?gVֿX)Ug+3ѫĒR]{_.2e^.scLK?'38;\\d\.2"Wh'tF΄pЎ: 2 #Sʐ?SffSffSRix<'yufn'sh-|x]:~^gJt?f9mqOU>tJ .t c%e6:MUȱmwfm܇Y^oqk)$jF-Ⱥ{-}!孥ua{j5#Dw_Vlx49s[[cQUv5ؙ677p[uvSYͬ<879͘2[G!ߏэXx\& #_(X:Eo.3:QnʭssGn$Q_Ruzv@ly(de=cfuGpD**kV:n$wBwnn渓,f4xx.pvfiSHX3I3J;>^ +4̭mԹihilqd盙[[nsKCKIXkm9kEެ^:1q-8NGU;J\Kjݮ=AsocuZch@}l$&;(D7+Iԗ45L Nc]x }?"l4_MK kiq@$ƺ022Ah9I?H^ǧs[쩖8 !Ֆ@.&0Ū1Ů}/ӳӶX$VZ]c66Uf8[XcYitK;IMkhh5g >3Q}`a.k!&A|gAGo 8LdtPջ'` 2_ƀk tEr[5dA鮊GVќlA鮊'L5ӂ/K81 u#ObU/x}@ls}u#O6cuo:Τi=?7YGe- 9iXucAY]gn1,=;Kwh<~+3~ѭ 5p;Kwh<~+X6H> ~!B>e=V d]\?{mՅ`-> g/`^_?P6?P# mӕ*ޜ%/Q Q POD'"b#U|à4hahhӕG3/ ̛[KUL_cko*E}ki<_rn{zh>Aafaq٠VGRu)`h4 /-d3vl]Y{f\^Z08CKs+~Hm&%C|E386YfD3ۻx={F1 hnOhFs\7][ ݸi NF%s(kgsX6`ȩdmeXZֻ᳴ȫOocZ{΂v>(8-nS]_M[]k^-'V;QYȬT,-~*h6ʘR>ݧ )]ԺښmsMݧ ƾrx&K]L9>_>sAf;MLԒ.{"XдIBS\Er%3HUŬ$yB6֋Ԁv.þag!@ v3h=?,>X=Th6YL(.p=tı/՝Cos:}$}R|$y_3[euk:[h/}\^Iuk:K!u\q'>1VSl2ӼYd$OYV̓ dZ}<\8WsKuLs窻 mp9ϲIT!mV0 v7*u;T~6V74cWJ{j5mM.cK1tʙ>}74> ݧ*V kpE}K ; av- k <55'-<_G7ahkXA'x݅aLGLꍪ6C]A"v: zmv%e͕G  "* 3haq ;N0un̯l8kD؞ڕ ol4쫧k6\cD؞ڔV}s}U`L5#CQ=Y4{.ai{٩ Hs/>g?&X^aiuclhc.b({m4kHTw@Ӂ~,RkkHs^U(̷̣Ύq&B:9fXq Wsdus~Sjn<Ĕn_ #IU:h} F<đרwS9xVm@?Sǻ:`-cO' 2[Mbdy/QXm{Zظ#d|QuvVkft.HAU>Pv;}vksZ: Վ6}ԛkuѤw&5i]jvK 6 :4y$Ƽ-cyds:k=o, ,ʮ3o$d ǹ6\$ s*C `-y wxB ݽzv wXͥ8Đ*s~`eZjvK%E^cu%Dyޕ&Igoռ~yFG a" 돥EN#*pM[.g <6:N " Cp!Yv?Oy_d>}> XQ*H3yϏ)ɳ{;F#xVm]v 8dYkO/H'>_D/tIkh_:.{ΒGc +Hw 1J܀s~J۲0%t:>X d%q:k:e10 sq|yEngV]e}M h ]oV q:h ]gW sΨFM< Uƕx:ƟBᏓ^ c")Շ 2$A?!0ʜ$/ǷӱՎ.pHh] Wk'}~NR;4$gǸc pID,Xvnk`$KwX>Z7C 5 H$'M8#0ZY:sH3:YP[s]U!lm L}eW؏OX 66f&u*X&fCzE9Fw?Gr5d̗z.59ԞLm!t۞̚r]fCNK8 ]VAkkpsDZe |@'C2?"1k 7!:=B]z $5>L9 ua{.pps@K$Y,/ytr[^mi-hvK3~3em\ h L?Uݎo1[ZKZipL?nՓײͯkvZuf̞21Ze^:Z o,:F{O+W,YEh%lyOis{#k[[r` dDO`un=lY[~90W`;K $r~K3ۃIXWf4uv@::^/zN&Sr+uM$+c;kZ%$O`x\G?gK9ꅙE[!Z.1"{O tkv>KV2حh=}Z13{ c~KWk19;xZ+&XEQSb[ `&НJm ԦНJXnk Ёs'"9$nN:N>fOKn'৷ڃU=äORq1IMH*y4=l9Q:.S* 5۷$<0hȪ ]D"Шul5 x+6gE=Cw [VȳqfӞ=#+g8yl3ɉռL,۫5U?(-;ީ13({=]?(sd#O/ӳ){: XsՏ&Y ؎B^:D=p*\ŧIús>*Ax[]#\`:pʇ[kU3D@Kwem$jLS)EZ6L53OˣnADkA#>kl'кj^Ncsif>Kًuy4;ͤK&o}xWW}M'mX#Kc}Caq unZ{vK9mlh$$1p:AƱۘWoTmoC=~5n=YK M-g*bSMb׸;ZLIT5Xml4O}zai'2J3mklƣQQ x. h$Ο 4RT w4a> 3(0\pgO ٖk|<6WVM5e84hƻ;OM4f_tcO01F ?vLæ= C.A{-v50 & 44ȞX=&̜RC"XLA1hh:<h2뾱eѐp|G:[gOۜͮF3z"XmmmfzG=?uA~QeP덗vP>f ϥؘβkx?duW^KO8F˽WctjLW? 6%NO8_799iݹg/0muc81y\k\2,.!:rRlZ$ƾ׹85IMFE985I]-[>z Ƹ˴$m=JyXw?H2HԭEm.^ 0#ͳ[=;V5 ?!~kp>c9O?V.= '_0lSXdcS=8حr~%CG?J9?5DFm1!1!18d ?L'q u+!8)RiMa#Qđ(bH>=ˣ܈0Ad}/AJ*΍[Cb].gb4~ӹ wpPY<uܬ{[kk#YKe˚ƱkַCʡzU=Bc+ k[[wWs\8-tiV~tM;ҽHs F5{4}a"w쵻q An@WP驥^Hզaq>FWq5΃#VVW%q{;wâU#>ٽ@.'Ee&Qmۮ2ϐ <-{}s~AsW7UꄋY3V6 +;?L`Q˻$U }󊨶nLs9qh$~c%tN+# %3u Cj5|ّEYR dC|sRET@sdA24!=[ac]Tݳi0@Iyy}kZ׹ a=Ix"{ΨXHk$)θi :0@ 9W:!тoL9.̹{]4=CA2jxcd1ǒ4o|;J]>,$Ho|5\FOy!¶>D>EϩzH=1,e^"|'O5eC2\+{e%`Qȶe.vI O4Ҳz%-n]Yn wFȧ(e3*.eaø|uN2+6YYsmp>_*;' R-s}+;dbWFs}tnFA8yܣvM@·.U- nsT@8y,un/-p?tpruN.[%QN~:.Fp3jquvj,ZwLq Q6ֽumhwLψ# jm5nKC8r`|@^ǮluLZ {&1HIfYMn p,g==}Z\ tCX4%.mA )]c.ma0B:_nda.{}M9GsV.X=UӾ|(utV:f]f[8 ]ynͭ y-bH8 x cHIcHH+p =Q G $HDȒyRhAה|"Wsdx[l ØI<N;QA3QLm./KSv܉%H1Rx'*[WƴNwTnf5;v=ܴw_E^ݖT K'ln*]?n2غ_~uzWQm2MW Cݤ-¢IZn&8YUŸyfԲfpLqLY}F]W_h4:b讫G-:tY_Wpʿ:Sob@/ut zE !f#x+#e۟zAu*DE?ԉo\վ_]qi ={Z=c:5oopWz}v얆OHx+*Y5৲19APwG[{wKIyϜjd19[ Z9VU}>tGT [5AcvxyiLV,n2<5?8¶Hk>d|G⃰ƚ{I_TK i$W+$!pcj{;g#`GUF8:Gʺѓ[V潡 k#drzcU5hkY0$WI3Ùi,<845&dSzN TdZf̛'dbS}"7{Z9=ξSs̾> ⺨y eCHv3Yiɿ7+.R-~<4׎FTu:{v3{ <-o3[C0pj@?Fkٌv#?j>պe5 pjdr?cm\4 cH2Ğ -cY^;K'H2ĝA0+hkf@2IXq3].lx8Oyr1eWXkǎ@DB-nj_Y-xȇ x"O!21n5lsk|K77wƽ#M<Lځ̑urZ[efkl@H0u{nEjNӓ5VEkp#ff]]N8h9TF}yX$Πw +|ڲSMw]#Y!uxY*mWzmsApw!uYTnmø]#_k1*Çh|@'H+*f6\d*6MZ %ē#H#ZMشSU{K:I$~>+kk윱Ulq$ p ?O*fnuuTH>:Ԩtֳhݕ^=O$>:t 1zo<|t}7Fmon;([x tM^-{ձǤ;tCLO[z]C 6Xi~jZ9t'?>˛V[mu1+̫u*nw]d!$G>rSm_C\D G>sW`N"L@:~3lkU֫n;_ӍEK +ʏZn3;AGEXQSH U&`ΧwT)Qqhx`,n{Y#d)f-N m8 $&M HJBRq출{#5b~'~'~'c,p5ֹ >j.`sH# ~tg~^ugOPMU  YkUl)v\k k&$t _MoKc}. 0vHF䟡Yev*k΀?4qđ#kOf[1쫧?Jivx^YKEzs ½԰q]N7`\&~^+ŕ7Q<|v>E֗V݌ΐO _E f A?5쮵267d9$ÈXucZ"0N3Y诧m[c_g?T&.%M`[X}k?jcLA] }xfEmuk|ԁʷۺH{]v~!:9έ:-#ȘV:V~Nv^ :Y:fAiDǚXR'8;gPuy_Ed{H]5dzxMs2NH-.gAAX97Շ=`ֿ,mGW%;x-[nUVׇ[;kոk0?mxx!I4x 0cU<_x0h?Y aX=l/A|Ӫ23,Zn2|].x*X i߃xrγ%m~E͇AoWp(OӯސGܐG 5#A&2424ž-t*zTTDGe+tLxQ)NSR#EDht@' 4 4$IQh;&h;(4n 5[ƨƩ8w8NG"`S☻^9M4k4$-B9#CT JS%7iN$'7^ίOS?[n[Bw47y&nGMͭၶ󆠃\6CȮ-ߜ5Bl k  kv^^^^jm9-tOǃ :ٙE⬩cw? .߳\o6^Dn -s?qSzPs Z=+OƶG_JZ.h >+ý5EZ=0GizA9WUh4fKyA۱X8C1m3vRUpYu[q?ӀD*Tbs.i;͏ 4#*w)ג$c-$H0GkǪ KA-2 z)]E-Ưtۋ`qZ/֋KhۘeF{~k_}G'uh f O4\^['e6 CL;.K U˵ߣ[dv_#гjik6C?]GB7gn|JӺksVgXtEz^%e`-@t\wYjzxv.1ޛC,ǃca>kK ~/#YE¤eZ\GOƦ{Kqԭq1.,`Is.:a1owqF$)|$$J@i)6 N%;`:h5[M˧@5QL@גSĞIKQ%("J2@+p.H1R $NH`2`2v) Bu4)iLHiJ$% ={3)t)9J;&GdOSY[(S:}'CH t)"N R_tFh#8.Aާc᷁wϺ澰 .e-wcg>˓ ?.Rzn6[0 \I=Pʪa{ Gr 7zU=sbWIߤ0lUb9DH m IǹkZlsw\ƣ#__8uİt:}=)/M:e/gQ̕K.hn]}~d[emkhS=JUUXemml5V+11 f@Ll"+E|TѪGtje7\jJLj+ޓr$RtT} >tq8 =]%w n;$L#D$i@ ~)_ {ģR$p8 D@&0DŽyMۍٍ4hxNDObI0L(/R=<V$:!eQms,ii"X%i;e98WecgNɀYSߠd{x><\1ط? cdIA{\GP&F=W]+Y8o5fֶ$>uZ@mY$#jKlsY>-o>}^u8] { +gNfk5߈WMw܏z{[ݬ<UfSlɰscc\G ;1궦5$|9,k7Kv S̆}=K>[=C~GXd0s[9 vGGun=n K91篈VmZ*k]\{-ct= w<,ԟ%wbͯ}LƩ7|`Oey-#|4M΂SstH)iO%ڒOؒO.> BxGun?X0Hgsq=JKHR꘶>V\7^$=3es]Wjģun{~dgחP/߼ЪW\2K6cSur ]z1 ݃nf3Fx%KR4guNS|9Vjq9G ΨdwNٟM'`3e{{ NN!"u1 Db'H|O'nk‰)J:|S)eF@>*2L)KZj~i R%Kxۜ8wnc*chcN<cӈ܎Bێ}6HQU* ʘstRn- J- (8g&'DN5Ry co!1=1=3r$'I'8a8aLm0sS9%wOg&yN''n#R?E3L L L L {$ {&iq3ݞ8[s?m40 :J`@t *#qfe܂(@Hw*CN "{'Ot p8Ho }& 5׺`c]{ چ|8[O=p" HFSiHiHt/ඃt#5|'?w:u&-yO):_k{΋e:"E!TsʘSw=nL$(p(#Tjq<#8>:'4&=Ғy 'ݍ@|Vj$' Jr;ԨH"B Pܶ"NCJv T2xO,gdh-4_4[ƈBS HJc?4T8~$O$O1"|$R$R$RHG!()@J1 endstream endobj 47 0 obj 30483 endobj 50 0 obj << /Length 51 0 R /Filter /FlateDecode >> stream HA@0E=!*hMHEB^ɝ@!U5T|(HGRH֑:֝[X8~7:zlϐl4 endstream endobj 51 0 obj 102 endobj 33 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 5 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im5 34 0 R /im6 40 0 R /im7 44 0 R /im8 46 0 R >> /ProcSet 2 0 R >> /Contents [ 36 0 R 38 0 R 42 0 R 48 0 R 50 0 R ] >> endobj 55 0 obj << /Length 56 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$DhJ24MTݽ28r endstream endobj 56 0 obj 176 endobj 53 0 obj << /Type /XObject /Subtype /Image /Name /im9 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 54 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 54 0 obj 734 endobj 57 0 obj << /Length 58 0 R /Filter /FlateDecode >> stream H]AKAvq{)2Y7I!t =x(Ex PVH1/""koN%)[0vofZef{GFן4#Vomzdk͕Ո1٣.kE4|͢& 7wX]5;Fí7,|>? ~D8zq )$7+Nb1˥^tiT;$z|YΆ7Yy%amL¶ p.+ȍb6z Q%BEMR hs/_l,R|F.?i>Ht;8«B> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 60 0 obj 734 endobj 61 0 obj << /Length 62 0 R /Filter /FlateDecode >> stream HUˎ6C7C# c` %6whRqimAi]]]6?757 @ ^W*4O 6_;nvj+F*<_Ӌ W_`uC`W9;|B61M$`iW lJ+1Ƌ4f AAy])Ċ3Rbv륒m*)?Us' c$L㱏i1ODmZd՝ mso܂8@a!>;*^ g=((S<3^>C^ ;u"Ƀv W2߫^7ڎOi T,]Htl@S; mн4P>*K{Rp lyLCAQsjjϬC 7 zN'5H0Ė4moqY+X4laIaq8FUe m=mK?lFYj{ڂbTZb-xٿbTV`S'+IMۻ}IrHCg{KvOx)Ѷ6I2:@UfBٻxY!m2_zm,if^pL]]A> 7w%,I083k{XAp=>;$[.]-dU Ux"I*F䠻ᮞ .cŽńOH>\wG.ўEzm_;x@c !unF˴~̙^mr ZGo;0ᲡYzG}u<6J*V)DNmq i*~{wH[~7^zN endstream endobj 62 0 obj 851 endobj 52 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 5 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im9 53 0 R /im10 59 0 R >> /ProcSet 2 0 R >> /Contents [ 55 0 R 57 0 R 61 0 R ] >> endobj 66 0 obj << /Length 67 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsRn;ӂ$$')CΎD0dZiu D 7zCC"p/#ĺF:^=V>O<;az$D{YTIF} cʓ$>!8 endstream endobj 67 0 obj 175 endobj 64 0 obj << /Type /XObject /Subtype /Image /Name /im11 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 65 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 65 0 obj 734 endobj 68 0 obj << /Length 69 0 R /Filter /FlateDecode >> stream HeAk@_euW zĦ6Kwۮ,"=Yz=,G[?AoMa=xšČfv[/HbE>"."䢭5/T%I`nʘd;UkBAl:pI& Nzy "ATbg2Z\`u6F bOxNDVҺB3sc=tԷ3eԟOJ2~)KSәl!܊g[ͅ~bnh{= endstream endobj 69 0 obj 496 endobj 70 0 obj << /Type /XObject /Subtype /Image /Name /im12 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 71 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 71 0 obj 734 endobj 72 0 obj << /Length 73 0 R /Filter /FlateDecode >> stream HVMo8HpCQlj\D-E~HNZќ,CÙ7ooX]/8 /׋4IiCP aEYC%ą/WS vidXHaɲ')de<\Vpqmԃ҈*^Aݵp{SV9għLC[B+ApV,ĮZ 0X'3ϞPnˢ`H)@Љ9$ XU2e|™EE'ϼ +z`LtYK贅zG+|p .q쿀xlg@WA3aU8v#H "䲴X7A7Q֣)Ĉc|II#1YF9@ZeMPgI #H V>2'8xelsKȿ}7L?/l^,؜rR|4ȵޣ{ O^zz/0YzyRzllWZ%T6 c49KcYcd7( oT/άggPN0.c&ABJi*Yt.Wh #+o[XI_"1V}?;?k7\oz[х;ao! 66c-=BaiFpg۾gJ}9Y?qs c?tT|(ay0&[GMYrjL_h_w‚p*6}؋CX(^oԯLcXŭY#K*gAJ7r^ebd7lEcԼ(W):Ez`)ӞYG)(X+/glϧe<;^cw@Y~^zc% endstream endobj 73 0 obj 910 endobj 63 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 5 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im11 64 0 R /im12 70 0 R >> /ProcSet 2 0 R >> /Contents [ 66 0 R 68 0 R 72 0 R ] >> endobj 77 0 obj << /Length 78 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$Dn gR%MU&ta*Ow"8 endstream endobj 78 0 obj 176 endobj 75 0 obj << /Type /XObject /Subtype /Image /Name /im13 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 76 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 76 0 obj 734 endobj 79 0 obj << /Length 80 0 R /Filter /FlateDecode >> stream H]Ak0ǟu ս]6XtqA&c-e-9F顇RBF "9~kr);y')n X{%0zΛFok X3'4m aWFgONO>^~6F0JY(Z;)j+BG7PeK B횗w͢[tr2$@쀜 hڀC"*dZoo^*q'*ͫ_#c5˕ x&xiN8]IPIhUK{qd_?dsb`T1YfV$D23^Q9;%|?zcgy~1*} +J0xXt֦T4h"u9_rT>t*KB2?=Yr endstream endobj 80 0 obj 478 endobj 81 0 obj << /Type /XObject /Subtype /Image /Name /im14 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 82 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 82 0 obj 734 endobj 83 0 obj << /Length 84 0 R /Filter /FlateDecode >> stream HTr@a;$7˶.ĉc.e*@RHN$3=_ Y PgJoF9))ZCjEe4[d VZM,qGX 7Lqbb"*¥2Tan7PPowdcinOJPzv3"thibk)jSFbȦX{r_EMgӱ'm8gb!h )}и< e+PHA(xP9ɌǮnݟ۹@#$~\f"}|^ xD w~?F!>mq M?DU׃38ϭf*sKU_S3q"!Pd S3sCXiټEh^4]8Z?¹QghTؗDs0 ]][޴KB8'V9>wM=ٍ%ktOdTb endstream endobj 84 0 obj 567 endobj 74 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 5 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im13 75 0 R /im14 81 0 R >> /ProcSet 2 0 R >> /Contents [ 77 0 R 79 0 R 83 0 R ] >> endobj 89 0 obj << /Length 90 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$DhJ24MT'Qw"?8 endstream endobj 90 0 obj 176 endobj 87 0 obj << /Type /XObject /Subtype /Image /Name /im15 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 88 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 88 0 obj 734 endobj 91 0 obj << /Length 92 0 R /Filter /FlateDecode >> stream HeRj@E- . c(킩ĥJ%CCQ . rrXʲ!!ӛռ9'v :<aq \W"hsyX4I[>.98z~zo|8Aq$'W8N-zpK޷[Z?֭kZQѧ;[`!]Ve"z\e~9[4,R`4coٍ!ޏ)N"g&7E*uF!S S53ݍXxij3C?JD4Du(XjG`,4&qiU(,ӣ~ا*NM{vgwfۨmznX7TrU1-3WMdњ8y.WGnGA*Ƅ!!. x38&cɝy~nE%?# endstream endobj 92 0 obj 479 endobj 93 0 obj << /Type /XObject /Subtype /Image /Name /im16 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 94 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 94 0 obj 734 endobj 95 0 obj << /Length 96 0 R /Filter /FlateDecode >> stream HUn0V))ǺMEQ}Q$`+QEߗ=,#hR =ـw3;}:D)F8e β G ĕ=G;[m'J[<_/9H5|@~&LCVvBFCoDI L 'a41ƖbYw$s抄҉Ms ۳.B߷c9vNy)b%̥տ@ES#B'#Q1aD0߅Y͕qYٹ4+Pl!!D7c8Zwb5"+:RW-OJQNw,uo.нlU ߤ>K`Ll/!!iQI N/[h 5X8Eg4K|&zdr;et0²hD& WBq:cN;_l ; U[]67d+y?n`jYz (pj? +N*2[(`,jQ%4>G)vU;She*kH#Y9<jyE#94O>P!M)Z+žUYksv-?L-HB -Ko~?.. Z0̀Ъ}IJWDD\iH x?M endstream endobj 96 0 obj 689 endobj 85 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 86 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im15 87 0 R /im16 93 0 R >> /ProcSet 2 0 R >> /Contents [ 89 0 R 91 0 R 95 0 R ] >> endobj 100 0 obj << /Length 101 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7=ЦJdt7i3k}|"z8 endstream endobj 101 0 obj 175 endobj 98 0 obj << /Type /XObject /Subtype /Image /Name /im17 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 99 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 99 0 obj 734 endobj 102 0 obj << /Length 103 0 R /Filter /FlateDecode >> stream H]Rk@~1+x/͓M6Iە]< RCqVdEB=xO^r)8q~$.7  ~ Ȇz65dSw? a$bwG:פR"~gx'`7큔E‡rt -rBkM^hѨ00(-Vfxo!Je ڀ a8521e pfSů/7Q,B2+۩"72]->s5B=B,I{ng'\CyvSDi3Y&^^ME4FˁFh "*IiJDu> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 105 0 obj 734 endobj 106 0 obj << /Length 107 0 R /Filter /FlateDecode >> stream HVn6:z6I9q.lc1-$eK|}h&kyޫ^Aʳ.wr&f@\9~yY 83*\)/梇?@0;۪'ߞ2C-C\ r ˢa>Yz0`1}@NSk8NF ƗzD5 1W:;^ll*ke\8Ѩ}]UF"fMeE,[%uVx Tc#ܿocn~R,p$YT}CzQ䒜 ht=-;Fqx 7yYY(sW|btǂY|r%XTrh֪^a)3+dfxKjHЕTUFyLHNDYw_(.V {lUdƛ`=vַt2q4jprFmVoSճLeq#-4EeF~ayD>Ic̞;$ c-R] dHg徸SS>'v2 INXUT=c2> /XObject << /im17 98 0 R /im18 104 0 R >> /ProcSet 2 0 R >> /Contents [ 100 0 R 102 0 R 106 0 R ] >> endobj 111 0 obj << /Length 112 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mN2uao0(8#HB!"Z .j'Ș8:&i]}ǚ.N%R Nѫo*>V9|b$,V{; *ʳklZ-rv{x $!> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 110 0 obj 734 endobj 113 0 obj << /Length 114 0 R /Filter /FlateDecode >> stream HeAkA04Wvm"nF47CՃh/~|oCSz)&P֌of)7?739ΓN[ۖvlc>:lȢ7;,yX4o,:xţїဃZVsd,*1: ~bhӉ3/ u?1@¼@=<,-}Dժ).V*,j}iHT`f2S) īh ~p^\j,ܥJ̊yz)ͻV4ryaJTR7&Bp*^%2ө(9/8Tr}rn[1^vommŪµQ9LP5al3 z߾184k_OR.}Q=n:wlX?3ϏoiMst|nG^; endstream endobj 114 0 obj 476 endobj 115 0 obj << /Type /XObject /Subtype /Image /Name /im20 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 116 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 116 0 obj 734 endobj 117 0 obj << /Length 118 0 R /Filter /FlateDecode >> stream HUr0 L6M6>HV4$_d9w|4"/U e&O_WdCʁlWxf \hio@i`Oi.asE`d"`UE# J4rs(r@ϳdd ھR;xV3 ȎK0#1Xh\T<IiDӠNQ9ixV"D%m@\Hd8, WuZ@ED`tq( Of>Ey,ŋ2JÉGm<~.ʹ4OǺ=\evJ TXG1O~K(2RpkuSo٬-5a/4 C٫EaTK0r jFM7mU2#)_9 t"R+r"g|,̱WЏ Eq>/@y> /XObject << /im19 109 0 R /im20 115 0 R >> /ProcSet 2 0 R >> /Contents [ 111 0 R 113 0 R 117 0 R ] >> endobj 122 0 obj << /Length 123 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsRn;ӂ$$')CΎD0dZiu D 7zCC"p/#ĺF:^=V>O<;az$D. gREMU&ta*_wX8 endstream endobj 123 0 obj 176 endobj 120 0 obj << /Type /XObject /Subtype /Image /Name /im21 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 121 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 121 0 obj 734 endobj 124 0 obj << /Length 125 0 R /Filter /FlateDecode >> stream H]RAk1~QZovtW(ڮԽA۠aap% 'NO>;>G0C{wki9zz J gHmH bmߊA pQ?onR^-J4䙀L. 8:Q̗$W_r*K]ԫ Nj{OUmRJl[?{VSz~X祊SުB25땜}J: ooݾ(,Нrjp;<'pJM]_SP<[\_ &e|P۵XLъv#,EW烥~~|Om7g뿧ď9 endstream endobj 125 0 obj 475 endobj 126 0 obj << /Type /XObject /Subtype /Image /Name /im22 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 127 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 127 0 obj 734 endobj 128 0 obj << /Length 129 0 R /Filter /FlateDecode >> stream HUn@VݻyjKDĦvy{ƻk B*HQfΜ9s "c N3 ^p*Y.׵qtn ^t :F24a*;3m(y,:ڧ֬0TmB9Uu|4F<dP@(ٲ3D2 ^<qE(|$Ӏ̡Hʺ1;/ELffLM/ryMP5jW'h-)@So+`]?лq$'8V,6Mw۵&ķdzJI7ꚇ`/Nd/fq{/)l5Z_~z"׻;v7Qai1[@5Uݘw7 <_2U[U88Pz3E4483> /XObject << /im21 120 0 R /im22 126 0 R >> /ProcSet 2 0 R >> /Contents [ 122 0 R 124 0 R 128 0 R ] >> endobj 133 0 obj << /Length 134 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$D.Pp(UD_iB8Y8 endstream endobj 134 0 obj 176 endobj 131 0 obj << /Type /XObject /Subtype /Image /Name /im23 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 132 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 132 0 obj 734 endobj 135 0 obj << /Length 136 0 R /Filter /FlateDecode >> stream HeRjAv;,l`zdWXk{3xr!8zfE)"^B.>BfC>B94:N[ճ?鮪? xNNV;'|#z/Drr$ފm y'%OH3 iٜVPڋK8K f6//bhT}LsVpDOSrke):/@laՌv B͋BlV^n5~ݤa2TTÿn2ݏX#OiE?gmiILCԄȱ BN;3ȢMVS<ӓ~0ć&gd=ɲ<ٍdeͩBR~,5WZr6[ 75-;\?g\[ËXٸvpgIM<>iw endstream endobj 136 0 obj 483 endobj 137 0 obj << /Type /XObject /Subtype /Image /Name /im24 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 138 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 138 0 obj 734 endobj 139 0 obj << /Length 140 0 R /Filter /FlateDecode >> stream HWnHCو 8 2HL HAQa0>IHu-tL'*p*$\d5Է0|OɄY(Ux=h~tÛl[̷pӻ*VXB?L Jz4oy=ߛDBw)/è_1Gf[!&C~oɚ*wexk&tXaajZ?)%bҎƳ3L1{u5>k׾k^բƔ2;kk~N6#=h۲c):d T4Ћ \&tꐛ!b 3^77&xB"W'bK\rW,Ƀq'yOncS:yǼUdNTJJZEz74EH&-a4;%,}~9zݓ1~ E(ʌS08GQ/>37y,&nRSrr !}]#4O 8_6[~uPf|jsOolNp;-"C N8=8"LZD@uEi7m_q~q ã*+nrWdOX;yq-u;2f6[gEܻ2g,ݞ| KڏTto={',#i$8֒QcqtZV9Ai0ёM endstream endobj 140 0 obj 1373 endobj 130 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 86 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im23 131 0 R /im24 137 0 R >> /ProcSet 2 0 R >> /Contents [ 133 0 R 135 0 R 139 0 R ] >> endobj 144 0 obj << /Length 145 0 R /Filter /FlateDecode >> stream H]Aj1 EO;eU-yf&f`hK iI6!쁡 @ݿDfd0btu5B 9~Co> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 143 0 obj 734 endobj 146 0 obj << /Length 147 0 R /Filter /FlateDecode >> stream H]Ak@_L4^Ka<۴kbJ[=)=P=H.z)~zuֽ,"2B ČofVL~f7b'+2Ԏ:lҊCnD,psgp^5Mz`/bWYR؊^Y 6Fճ%Zh[|m.ֺb헡ҽW#> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 149 0 obj 734 endobj 150 0 obj << /Length 151 0 R /Filter /FlateDecode >> stream HWnF<{.u vRh&R#QtIFQ;{E4 ERs=svfy$,U0HL8@bd?2ISo :{Cɘu4E9J/ )?d2ke'011I%:I/V)C{,Nns:[捕RMM S"7hŨiWG#cºrw'`0)! wx3y ! Nn8dQysX.b-CE,> .)r1ChTң}ȳ=>S>:>?= C6eEUlmeG$UÂgj)N /ʉS2?!x(b8@mi89e:.U\L(!dqA}5߄= v:@A{0Pe[a4`UK1kXalhU/&y]Wֵ7:H5-9KG{tU!:rgD8Wꐛ >b ^WWg3x|"b1q6%]fXs`p1$Qyiȿz/T1{mɿ}=ѧ% cl N>50nVvw8)ʶyi èD?)q||D⻺z(Vy}@VzR> "NqsyIN#)M#Ǭ 0Y|oZ`}_Wfi!v@nͪv;L eXLV0p~j%ig'tjmcIK=eBD,Sm[ &JsnD$p_mvs +&Wzkv}WM.&f ל;MPB>eߝk K4|fua I". endstream endobj 151 0 obj 1325 endobj 141 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 86 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F3 152 0 R >> /XObject << /im25 142 0 R /im26 148 0 R >> /ProcSet 2 0 R >> /Contents [ 144 0 R 146 0 R 150 0 R ] >> endobj 158 0 obj << /Length 159 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$D.av=,P(Jӄ1Lq ݽY8 endstream endobj 159 0 obj 177 endobj 156 0 obj << /Type /XObject /Subtype /Image /Name /im27 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 157 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 157 0 obj 734 endobj 160 0 obj << /Length 161 0 R /Filter /FlateDecode >> stream HeRAk@~1^=,d$M6Kwۮ,"DDz(Fa!ԛ&k)8缙n f|7ͺ_z<׎ļ[Xlϵ"1|u"x\DmX <7bH ap٧_/\C] Q9-L滜̅Y`@r"Xd, (i5]EfJqO?[\SɊ0mi)I陿`/ L* $]+T/o]wa+2xj/BAeqF'8*־l8/T'Xiw(*eyZ7Ɖ˅$Vu!9b_אxN=(*ӱ;,(PrHx Y1,_6Ejds21hhXsٰ~M $3#k=Iwh 8bB= i'8Í~:^]?'5[X?S*l endstream endobj 161 0 obj 492 endobj 162 0 obj << /Type /XObject /Subtype /Image /Name /im28 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 163 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 163 0 obj 734 endobj 164 0 obj << /Length 165 0 R /Filter /FlateDecode >> stream HWnF<vQ1]u-4UE@JD"]Rv{goRfR͋D 3g܎Ar>O4By3Lp ,Ze< 8Jјmqy,$3ͯK8_vժcL)1)Zʚ6CDRR9}ne˛mwy>xg3=zV gzٕMgg@@ <}ŀ>wv[Kk݆G>_8lZsC y@b. rOڅ툕*Mɺ3;8FOΫ]ٞ:`E.dMVL82"sXvpq]>9T3F"?"@OB{_.קՇs8XDՃgUm+r_55| e3BcJەwwM 5$O(ΜQK$- ey@_18Q:ru~ߖmլ3=>ރ)|vfd"m6P |VOcO;YQ|TZ҇5.x\>J PtLШ'H\l/t"oYnYm~pVy0HNm>I=LZp.Fuܺe{u),bKy , <{_\'O"2+Ƙ0jH2nh{3Am+}9ODp3M6<3Eܖp @mJLeTp.Z.s$߹ j- CI[H)";0hYxq&CLѬpH`4 o@!U{@1֙h)#}/0޿]Ǧhc.ZrpH {PE$'sI,:F붩lRԨe1t܀y{Am]W47ek2>btF:Acƨ߸}fkBDq Pgjv;Nz@Kf.̌Qg xL\J1 n-tUvtAbPv睒ø)">l h~Py,ċ LPԒ ljJ&̏[C֡qxU8cUo4X] <\-u=NvBJ[ endstream endobj 165 0 obj 1266 endobj 154 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 155 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im27 156 0 R /im28 162 0 R >> /ProcSet 2 0 R >> /Contents [ 158 0 R 160 0 R 164 0 R ] >> endobj 169 0 obj << /Length 170 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$D.qv=,P(Jӄ1Lq{Y8 endstream endobj 170 0 obj 177 endobj 167 0 obj << /Type /XObject /Subtype /Image /Name /im29 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 168 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 168 0 obj 734 endobj 171 0 obj << /Length 172 0 R /Filter /FlateDecode >> stream H]j@2I.uS)x B#؅PK]B[!E. .E yJxm zR(:e7ۙF1ZXM=ZmuY_]mF@,Sw֨bGlM37?2ulb`U&qǪ ">,Zuit"@P&èwJ/xfs)*#QzwVc}P6R4oz^(qU/swx3BJ鈗 Owm2H#-t>t"7ins7 a̍7 <^Q޼+kE(}zGwiv0'du]TO{dc%EY/xTQE]QX@)p􅨣6fD> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 174 0 obj 734 endobj 175 0 obj << /Length 176 0 R /Filter /FlateDecode >> stream HWێHC="vEZj_FB!qf lgF#WCXfę:ut dOϲde^Hg H %Kɲ/(03chGiKg.H0;颯=܅U C4 'uظp*5Lоڱ8Gk0ɉɉEI=ӿNN:R</|ݹ㻍݂ a-3utV~sǩFY 2N3MJ33]74%H:+lhsG9/:FWM@%0i%d_7`ЄS,Q}F2L6p ]s0 l0&%`9)ضYJ n]CFw8l}3 :M"8YmlDN`IhzT OP7msa&!H,h)iژ훦n.UqDFqd,[aYvf|W['q ?I9IvkV`{3@͜dh},&:0U*l.h1Ws1ʍ: ,OFQN0aXʙssmțj$ :a_Ov7d_1WfWprbxqd!0P{XmV&ǫMi51Ȯ|]׾1-37V|k+~- ݕ^ 17Y\DM>@V«;@"]g$X&?]T7%no{a7TL^09}ɋP] Aau-sCV 0Gv*RPN ofg0ks1A2)&)eq vϯM"O|S>kYV_Y,'Wq3 endstream endobj 176 0 obj 1437 endobj 166 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 155 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im29 167 0 R /im30 173 0 R >> /ProcSet 2 0 R >> /Contents [ 169 0 R 171 0 R 175 0 R ] >> endobj 180 0 obj << /Length 181 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsRn;ӂ$$')CΎD0dZiu D 7zCC"p/#ĺF:^=V>O<;az$D.K.Je4Wi1|9NAY8 endstream endobj 181 0 obj 176 endobj 178 0 obj << /Type /XObject /Subtype /Image /Name /im31 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 179 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 179 0 obj 734 endobj 182 0 obj << /Length 183 0 R /Filter /FlateDecode >> stream HeRj@ZnhPoD &vַRz(=Cje֯p_[$t5TMwW OI3sFw[mkmna;V;dG(Ϻ!Yء|ۢ|>-Q~񷓣W_?ѐ upɂCě^`x>50X%\;U}SbmXYd-%FaA PXEyGn| ~}iX߿Ĭ{9 Ԧ}?lyy6=_fי v-{ҮfXD~U 9h ڲs[E\弲ALx`~{2yH/{+]mccs;E#퀪y/yAl +;e)ӟmV1FWrqN'p'/G;l766~- endstream endobj 183 0 obj 479 endobj 184 0 obj << /Type /XObject /Subtype /Image /Name /im32 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 185 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 185 0 obj 734 endobj 186 0 obj << /Length 187 0 R /Filter /FlateDecode >> stream HWn6<:A-&^"@Eh}̋J+cWQɡ$Jpx8s/(NP [ ``%\+Z^AqrARxUqv|^>K,>⺁z.w _ e~oƬa ֟L ?tκͪ}mv;q+ἇsȪJƽSON)8mOޞEsY(Y]v$k(4  vhonMMWp( w JysmkYb˔ڟhS]1&zMtXC] upw7aR$80Lcb}r"L2v~'172eUA8i)ߕ$MV^uKtJ ǰ0IO>l@(6xGIe-eYMw8ߝiwyIzKei^nuw1#(0푚LLc/q9\ wsXֈI**_JGڹ|YC'rFkܦBI1~LnлaA9h-3{nLC;~w/1 -[!7ЂsAs*\h( 5@Gv5 u믛-VDTU*5^"dᷞ.ɹP33eo͎$nXwPR5 !VLګ>X{2>]s(,AWkp4|DgGLEZ}^6y(܎9 A+#L,k$f(OuPf'3Uir&2s**:H.^lnk+A*qnQX4Q 8_p1*TPBz`ʧN4m*6֯eC[3F@r;N&4lFPfvcJ sUdy0_>LfަyڃM`K <@YtyB[TnOP@!EjFc@^.c  $S^H B?TZ`a]ӤVh'e(UoL%a ל endstream endobj 187 0 obj 1201 endobj 177 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 155 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F3 152 0 R >> /XObject << /im31 178 0 R /im32 184 0 R >> /ProcSet 2 0 R >> /Contents [ 180 0 R 182 0 R 186 0 R ] >> endobj 191 0 obj << /Length 192 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$D.Pp(UD_iB8Z8 endstream endobj 192 0 obj 176 endobj 189 0 obj << /Type /XObject /Subtype /Image /Name /im33 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 190 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 190 0 obj 734 endobj 193 0 obj << /Length 194 0 R /Filter /FlateDecode >> stream H]k@ǟu)] SbL$.7J %dz-#VWА!Kx\8jw{߻> ZkFd]?MCQ4k9:%xҊpDM;5["aqCƏPCGR#?PTnhy'$ #?Z|O-CrGXuZ}nyE[x;0k# g_Ī_NRJ?F8cm?&cޖ>o<PZVU XjHRxHWAjpI \T8T@t$YZ6ykO|]K̫zAŽ"%הoʮL\FtwV܍ڋn.ٺtA:?u endstream endobj 194 0 obj 490 endobj 195 0 obj << /Type /XObject /Subtype /Image /Name /im34 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 196 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 196 0 obj 734 endobj 200 0 obj << /Length 201 0 R /Filter /FlateDecode >> stream HK 0 DO;̲Yĵ:$|bI!6^2. TJ0L1'Đ,WR}g }vwlC}0]ꋖJFr,]6[Ro6* endstream endobj 201 0 obj 127 endobj 198 0 obj << /Type /XObject /Subtype /Image /Name /im35 /Filter /FlateDecode /Width 495 /Height 209 /BitsPerComponent 4 /ColorSpace [ /Indexed /DeviceRGB 15 197 0 R ] /Length 199 0 R >> stream HWMsFjF2/?n(D֖o.jȂn|cQ+GG]ȢݛJ:vg,"ׯq&ы]@K8~Y8~Y8~Y8~Y8~Y8~Y8~YPQp dedwSŶw9%M֍la Mu dݸf|oDe}#<Űd |WHqAm0'ETOqZK7Tٻo|g}~A}O[8{烜3]lOߌ.4Q\.fŵl`7T%k~*Q19;ojI4{StFsjeT[! IM7ESS/ OԷůI–'{LHE\@ҷ^ػ(HG7_>֙>km~gǑxWbv=؛MsM[ #QgBUj2+kxye"[Pm]le5>nAE{α|Ք$9$p!ds"/Dډڢf?FbtͫMSp=f=dPo:T-1IpKJ [R%>}[e6X3W(a fl&676X3^|*pІ7qZ1KPx.aOϬbv&g6Sn[߭[vZl,w C|"~d5>γY!X?e /7RHJJPoȼC$1dC6X]_}EG\21SFq-) TflNҁ ׻ȷܯR< ߊlvFn;[{(3Z ?-rHHfCRX=_<=OG+tq^Ksid nRIhwdJ\rPi6)RX9;<bHW\+Hg1^Ksu>fҷH#}G*ʑa:Qڼ. bSIy[bH0LNJK%I#Prf*H`B UMOU rvF`k;S^*8'$#{EDJ]ޛ\PトR8}p)"l6gMNR!rdC_nEH֛l3w. .s[j)E *]4LY$V ԸV']X, ԈPlT) YjTSr |#Tk6V+| ܷ}Z?[+AX P ,.^Syll{;d?oŠoE3Ul [QthF7QޥJ~,q%li;27JzU+A;ӌ4mB%\sX=G ja$-OkYtY@m !Tb d uR9` 1yM`T3sF:liq. Xy9ڠ`\dêo3,rH`7 &@+P0mv}K9`2u<v˾ \]7 }.6={T|-Ji[ycna}(vѮo\ml-\.ОVnvy[8-x'P%`|rw=z ^'s[Z>w/<}999Ti ;=S7B!| ^{؍SxYs}7 6ѭ3Hn|_ɹ|O4>~[,7n7\÷`;vԷQteSzoq%<[(`%ƛX@<+).0i:NKkp?w> stream !!!$!s8W)trnlVj5 endstream endobj 202 0 obj 46 endobj 203 0 obj << /Length 204 0 R /Filter /FlateDecode >> stream H TC endstream endobj 204 0 obj 11 endobj 188 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 155 0 R /Resources << /Font << /F1 18 0 R >> /XObject << /im33 189 0 R /im34 195 0 R /im35 198 0 R >> /ProcSet 2 0 R >> /Contents [ 191 0 R 193 0 R 200 0 R 203 0 R ] >> endobj 208 0 obj << /Length 209 0 R /Filter /FlateDecode >> stream H]A1 O;.&&mlet`PQэx{Dy=Dfc`$Lz3֔u =u ^m}PP$X`m0sgԴ#ώN?&I9~KM 7KTrlҴ``LW|ZR8 endstream endobj 209 0 obj 178 endobj 206 0 obj << /Type /XObject /Subtype /Image /Name /im36 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 207 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 207 0 obj 734 endobj 210 0 obj << /Length 211 0 R /Filter /FlateDecode >> stream Hek1!Ski r.J2!CCQpN/;nȚ?A&K褀V$H|${~etgk-:MC;Q̶͈ D4|Ǣ m`1OO~ l4P+G^h=3 Z``=kC{7rmwly6xKSqJ{z[jjxO0"P ]cz罏ެ e/D.L WHo+u1{bŭED/B$u+x ]qV5NoT*Ax%p{9UR Q rܻ.(/rp1ZmV偽G_]q6^ܴbQF(-&26M3z߮8X;l{'E>?7I4 O@^mŬ֧ endstream endobj 211 0 obj 476 endobj 212 0 obj << /Type /XObject /Subtype /Image /Name /im37 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 213 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 213 0 obj 734 endobj 214 0 obj << /Length 215 0 R /Filter /FlateDecode >> stream HTMs0˭]I$[;mҋlbQa)ףI.$N{J2,%X߭HL)<`1seUd(,) \+BR_@$ h67^ޣL9oUI.c ~P1)CG(H?B^gM) U­ U1@Y0-Xo@Uڟq#F$DN{|g|* MgP{Z*Rݵ0l&d~`y;2~J ȃFD"Xv;+3нr#LqtЫގ호\\Lǜ7A2eϘfK2Ŭvwh4ʊ{SA-|F_.F(k _\^=҉^*$$%ݯ SÉ!\8`C[nʪ/U[wÀMĥd;Fd[eGA!(߱c,Lйf~gI%,.>cm7x l1b[\d`^sdΣTLWm/-B?\lp5hw> /XObject << /im36 206 0 R /im37 212 0 R >> /ProcSet 2 0 R >> /Contents [ 208 0 R 210 0 R 214 0 R ] >> endobj 219 0 obj << /Length 220 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7]Lm{YPF} =c/א1Z8 endstream endobj 220 0 obj 176 endobj 217 0 obj << /Type /XObject /Subtype /Image /Name /im38 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 218 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 218 0 obj 734 endobj 221 0 obj << /Length 222 0 R /Filter /FlateDecode >> stream H]RMK1~gcPoB]A:Vؽ)mكx(tCIaKg^fK)BKcg}$*ԨH )ޖ7ŷ0 endstream endobj 222 0 obj 477 endobj 223 0 obj << /Type /XObject /Subtype /Image /Name /im39 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 224 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 224 0 obj 734 endobj 225 0 obj << /Length 226 0 R /Filter /FlateDecode >> stream HWnF<*}hSNE$>TRX]{goRpb3gCv4L%UFr©s$(i }rfm9Ts1|e ge:xˏU<866F#F1+Ɣ[ƴa<*C-~MWw=u):`lD\/.~)c 1CfÜш~Dؘ:`C\TayR)WYUnQwu˗ߜ/N߾{zl5"#@JY8*G>plסPL0qBZnuomvb> EǬV3\5BjhGCj$Hy8{0nf[_#JӺ &'zOk4I+ks㏃J5[GM S"mie_RjLvRFCȯgeR9aݶM{޻ZODo7W'`{؛V#/ߔwumGaJ: ;,L>6Ӊ9 x_X d҉Z=> f>m겮N-!<\Sl#Gpd[9B 9Š=}B'mHsǥaH{Oё9A|i{/Mˢ;"xS%aTZ2 ^ ̾5\op=<(YrcPi,^lwP vie| w›߅/mg694ҭREژh$D,L>ɜh>>Ƞᔻ|\5`4fZn7AF| Morؤ)=M<.tz܁{=guFT>s7dP2a\>R>Pk'w :;ѲA0}̹cPkH(d(C0tk]cGNS\ Pp #`L2> rˤ_}x\1,s=OM >TavewV^_z7GU~DiHy`5|N'm/hOЫ]pWx%\ґPCj0miH7¶8+lm_"Ob)(a?>u}4\8ۥ5^5zF6-wդ]/'ѼBm"^Mf{9m-J$RwqTJʡ i$Lz{ T\py£nZUssG?5<WC; %V_5uFȏ} M"AMGb2SJl/' endstream endobj 226 0 obj 1386 endobj 216 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 155 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im38 217 0 R /im39 223 0 R >> /ProcSet 2 0 R >> /Contents [ 219 0 R 221 0 R 225 0 R ] >> endobj 231 0 obj << /Length 232 0 R /Filter /FlateDecode >> stream H]Aj1 EO;eU-y lo0%$G HwBH|&N7qǚRԕ޷ < )Ц [Q0vm ]`xJu,& ⚻V+.?xq ¼y$7]BZ!XQƐc1_}~ Z8 endstream endobj 232 0 obj 180 endobj 229 0 obj << /Type /XObject /Subtype /Image /Name /im40 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 230 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 230 0 obj 734 endobj 233 0 obj << /Length 234 0 R /Filter /FlateDecode >> stream HeRAkA~RvE0l!hnAJ=WBq/Woe&zt&̼{ݐ m{c/x{l,m :pV.-q#bȂ1H ,+{ɮ6 ZԺLe"QzQj<∉S ! wsُY#vRNBez.R4Z}V@dϠ]Dv_ъrzT̗/dnp.<-[lƺԊBRl V747Lm,)|Mf" 1AמspizpO'pjOƵ[f4'6 endstream endobj 234 0 obj 488 endobj 235 0 obj << /Type /XObject /Subtype /Image /Name /im41 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 236 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 236 0 obj 734 endobj 237 0 obj << /Length 238 0 R /Filter /FlateDecode >> stream HWnF<ڱE 8]H$R:ieIeAJrҺEٳ3g\DfQ& :ٛLr,YGh 5D'D k&hysgG8xUagS1 wy+!Rg&2 ?NtʽbSTseu} b}v&<DN.pݣMb1mSkՁiz\WBܻe{o EǂM+pizA|0=:BxL€+kRP+0пL2'L;:?JJz}Ԙ#ߘͬi+MeTrlUcL翺X;E'DעGYwCTD[3ޡW\* vVRj@Soycg"+&egeQ>N˺AEzlvT1/'V_(-4 ;7^lTNG.ͭ$~ӄ+`p/6ׂ+-ӞzVRl٧z~VvP yxu9E\|vt{,%'rGr9W=LmeQ>YARP!>E>ưRZu<>7ZΗv>SXA;RֿCr擇pNzcf7NzyI9KMd컽18S{i +򧨠t>Hr9DJZkX7n*;R,r2JVU tYA1 18B7FG DsR#J\@`22;F-)6Y\2 *.Ӏ ! ѣ' 5"E/?)4w&nUp~s.À=܋/r[yo~1O8a)o+:Zytn!tetλ@e0ZXKZ{Kj9ULw+rS#o$BwS_åY}s#=8Xx|[o*ZD*c9N{m]|/2IXo04VXӪi)-`m n sɂe ebwbuLd{ pIi]8/Z`M ]@aP endstream endobj 238 0 obj 1284 endobj 227 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 228 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F3 152 0 R >> /XObject << /im40 229 0 R /im41 235 0 R >> /ProcSet 2 0 R >> /Contents [ 231 0 R 233 0 R 237 0 R ] >> endobj 242 0 obj << /Length 243 0 R /Filter /FlateDecode >> stream H]AN0 EO;尨Nb'ݢ–AH nJB/ >%2437&N?cM)A? \ahS,CK%f3o\x$,Gyƃox7a>&I9m%*e 9hZ02nN Y8 endstream endobj 243 0 obj 178 endobj 240 0 obj << /Type /XObject /Subtype /Image /Name /im42 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 241 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 241 0 obj 734 endobj 244 0 obj << /Length 245 0 R /Filter /FlateDecode >> stream H]K1t%N/a=cYuݛKJ"> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 247 0 obj 734 endobj 248 0 obj << /Length 249 0 R /Filter /FlateDecode >> stream HWn7>&ǤIo@$gUYJv!I\ݕ+. X<ܙp89|W.ZtqJ6_~OIRFAŮU3&Vu:7b}=W^֟;l_bx," 06KSƀfɣ\7 ۇV4.b:f8ͺ-e9W-awy@+.j`QiĆI!;V@*{*Fε~,.MuF>gqI9l4f ?Z)a،o7wAV#A&#@h"8MČ UsF8"!F(#I*4k wX]<˂zƻdqhΕxr~t.5lQLؐ:es I&"%287[TSg؟MbI6! 9l2E*2 Lît̫'&)t$*&.R:S(l+\.Lr,[9C?b:-M9`jlx4Y}DtY (٨Y#HrK~h'^AQ6Q?~sᛅm1Fl5%8R"22-\? C xD]㘭t-Hk9$ekYfu6Q'+pHēc)YzV#[oLU C.eA3)%\ -œRw7\τȭp>^)B rBcCFx"0B ټYeQ0GL1 G9")Xc)Uk0 Kr5n72pװ^1S=@|* R<цT=.#<*]5۰]:-Tmb>gCy*6|iy{=|zƏB.PB\ sK=Kp`~,_yR3,4Jo!-U^3MghB]\eV?hZ"FVKYdUXjq>G4%';utӚtn./hO4+׺V^KkJ׉M_y|.\09 ޱ`]_*`U2x"gΟh>X)emFYY%a;2wY5s_/>CKcAl(DuL"YGq͇,%c{w0,VL쥟8Fp5ulð?}P͟c#7 endstream endobj 249 0 obj 1364 endobj 239 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 228 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im42 240 0 R /im43 246 0 R >> /ProcSet 2 0 R >> /Contents [ 242 0 R 244 0 R 248 0 R ] >> endobj 253 0 obj << /Length 254 0 R /Filter /FlateDecode >> stream H]Aj1 EO;eU%yf&f`hK iI6!큡 H _Q;G)IL)6X7Gx&d~? ơPZ7Hv(aPQiiy:#w ̛IƿQ:u(rC&2&r_^ YZ8 endstream endobj 254 0 obj 179 endobj 251 0 obj << /Type /XObject /Subtype /Image /Name /im44 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 252 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 252 0 obj 734 endobj 255 0 obj << /Length 256 0 R /Filter /FlateDecode >> stream HeAK@_ʈvk <Jڍ⮺RJx M{)TLaF"fΛU/"."碥4.T%I`nʘd;QkBAl:pmq& Nzy "cATbg3> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 258 0 obj 734 endobj 259 0 obj << /Length 260 0 R /Filter /FlateDecode >> stream HWn[7V4mb}VFɵSr}g#/e;Q€;g6 &BYhŋ][kSğK1?@Z]Pιyrn277\_רt6y3G{rbSXܼkvͫoU ?@`{_^j%͡fʬj ,j()89;h,;uø |P>rb^A`xXJКwfu֟ʙ{ݽ%xMs:W,ɳvis)jbgL'|\ln3jҐэ׷T]UKW{GyI %`aS5kn@CKdYbT1Zo6HYG~B0 ic8T΋մ?!KFNAR+mȅ^\Z;r }W4xPgTVݓdނ͇4)O("U6D9Vݼ_bsBBBrXXul(H9y=l[ه=LrWv0sU}D wl4Kv" X/`iuKH ѯq>#r`mK=gz;$/ُ>CQ_9f\EH:1kRj]ߕ]\zc|"9M2İz rveI3t5>pzu:޻N~x:%*4#8KKu涯1WFY#r\A"ŶzhRLã Ŝ<_;aKqA⃛i|jθE}A͢Ov}NV#mjMRN\Bswv?>z8̷\uE4={°cUS[O"Gau3zSTb >ڟ~6C+Ke?v}&{'݉Y,,lա|-xykXCZcZ 5DnI!() <&)&XiU-4 9ҟ|Vdp s̞ /3d 4 }iAjC"Ҭz-7AP5Rz Ysޞw}pKq8xy X_\*<|U-ٳ`,k|?`XOaK[$ hpd6;Kы#L$M;e(LKZib(#6߱Y;/Fp# }SI?8{ڭ n|r-Bȟnv,5?Z÷.˜7@Q&JwD{8Dp'4WT ]ߕo>CW endstream endobj 260 0 obj 1655 endobj 250 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 228 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im44 251 0 R /im45 257 0 R >> /ProcSet 2 0 R >> /Contents [ 253 0 R 255 0 R 259 0 R ] >> endobj 264 0 obj << /Length 265 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$DB{YTQF} cʗ ݽY8 endstream endobj 265 0 obj 177 endobj 262 0 obj << /Type /XObject /Subtype /Image /Name /im46 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 263 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 263 0 obj 734 endobj 266 0 obj << /Length 267 0 R /Filter /FlateDecode >> stream H]k0ǟ ս]6XqA&c-e9J顇RmAF Gr,'fCɃ=Iqy_}ߓ,яŧ0Y#']Y3k?;=Ô7\|Db!V[;]ϖU#dkr endstream endobj 267 0 obj 478 endobj 268 0 obj << /Type /XObject /Subtype /Image /Name /im47 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 269 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 269 0 obj 734 endobj 270 0 obj << /Length 271 0 R /Filter /FlateDecode >> stream HWn7ސcҤ7 h質%+PrnܕD}va̙kzv`"!Gc` >~R,4'?:iY]69roL`K1Flid3W.AM²%IýYrM$Zve^=nۏǷDDT ~J@^ՊChάjā f4IqhǼq@eYӈ 豈,l(ekޙ+[1+g~w'qE1,FYHi8ִp|3sqOܜ Q8B24ObDK/.I= 9;BNZB42YWt,mcRt\A $edE拼B$(ghhCF=;/΄B~#ڇJu{ضysj \яpvߏfeU,@N?^Β9OЊiqd `ϓ+D nU `^@\֛z+1Q c:nƊ&CB^B~ay}7ލZb r[/Nh)ϧ:D}:B˙@i1@Zf# a1b1Ku5d:̀ bhtx'\z>=[K q!si z0!1캤tI*tA^ƒ2ӝ(#hDFtOyr >q8#?x Bz;! WM1L3t8&M>hulTy@j) 𪬮Þ`:S=ߕ]:\Q_O䑟P&^i78|kTű%z6+539$k$G^xp9Mxbqy|]g X}P{ܻy|~Rsjjo>Q{K_ Ewq,Wظx|.^>3Ϙ_k87C!f-|h3]G/ؠpfX׊gEZBe{_tݮsN=PJY(eC5{BiU8&dG=$i5q1!TИnC Fo9Y2!G\8ȔLeҧKCihU%:AemVE1'f*$)s͎,\)+/HFQ4E!GZ~0DY5= jqj5{ߛgL/>利7t2ŀ6[&:ЯKw'ǀ9i@fl֯z(vKg^b"Rioqe5ܠ {b?ndj5\ 66n7YO~7ހEܞ>ynH6mJ?#n>~f9t15':J@# >_n~סӨ%_b endstream endobj 271 0 obj 1696 endobj 261 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 228 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im46 262 0 R /im47 268 0 R >> /ProcSet 2 0 R >> /Contents [ 264 0 R 266 0 R 270 0 R ] >> endobj 275 0 obj << /Length 276 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7݇@.&Mzx_1c7Y8 endstream endobj 276 0 obj 176 endobj 273 0 obj << /Type /XObject /Subtype /Image /Name /im48 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 274 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 274 0 obj 734 endobj 277 0 obj << /Length 278 0 R /Filter /FlateDecode >> stream HeRj@E- . c(ԛV쀩ĥJ%CCQ . zrXʲ!!ӛռ9@ܷ hf \"hqyXqm(<~+d٫A_ eHъCے_c`ܣ;=zs ji8Xb]jEEJlm*> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 280 0 obj 734 endobj 281 0 obj << /Length 282 0 R /Filter /FlateDecode >> stream HUKS0[ ɖ 3=9rز+)P}W$3eﱻ `Y*8˂HJ3 9~,`qqC+ö(-]ӌ~庑p)-ׂ XAbl"cb-f8*>[';/i Gpù?ini{ |2LNǴ޺5r@'5f;.j7Uhmddo!fy_8ԑw.sSMf(?.@Q#VUo*N*+WuA[45J?9C+w7,uAF֟l?hエ.^[;ʍo=q"EtyqEC#lz  endstream endobj 282 0 obj 788 endobj 272 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 228 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im48 273 0 R /im49 279 0 R >> /ProcSet 2 0 R >> /Contents [ 275 0 R 277 0 R 281 0 R ] >> endobj 286 0 obj << /Length 287 0 R /Filter /FlateDecode >> stream H]N0 D 0G8Ԍi• P+zA$]i-{$YOh]"a(LAIŭ-qǺI}A9‹P9#Tcnr',GԯaPk|}}CAɻ)ǿ1s trҭ`"}nF̗ Y8 endstream endobj 287 0 obj 179 endobj 284 0 obj << /Type /XObject /Subtype /Image /Name /im50 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 285 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 285 0 obj 734 endobj 288 0 obj << /Length 289 0 R /Filter /FlateDecode >> stream H]RMk@UI6RrJQ삩%ͦJ %C趔KLG[鯐!^E.Av?2bVOo̊glg{KM[9>#xC m I =T[|>=>9{=2ȕRYD2W4Zq É ?Hc%WmO,DI}7F\X # 8*,kF;^^{c"t%Ӣ(-r39+B!=Dٟ _EY.pStNS>flʺe]EIǰ^+m*ث؛h9b2AD Tם4.,[J rdEw(`Y=] جKUԫX5 ϶uB Tc$ܐґ4Pj+L۵M֤&? 5^{XfӳEz?" endstream endobj 289 0 obj 488 endobj 290 0 obj << /Type /XObject /Subtype /Image /Name /im51 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 291 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 291 0 obj 734 endobj 292 0 obj << /Length 293 0 R /Filter /FlateDecode >> stream HTˎ0.g̮m:VU#u "NDFըRWXp| dw hY(f 9))C3 1/kN)ݏ EBI%S nRZy5ϔi1r,KiS@ w;c P;;TG¥ׇK6͇sW<rFt< 㲎zхH&7db*5)ukl5g`8UtTEjT/HtGJIR.lExȂ0nTXFW ONpxF7>cWʤ)tp vʹ}ĹZCхĀݼ]?TBJ>!]/kwM|d &63QTN:Ruήڂ U&sN5}m7R#޴FUCsTYӷq'{bvY{ڌlˤÍ->_!HTJ nH wJh7 nʹe|$@@ endstream endobj 293 0 obj 556 endobj 294 0 obj << /Type /XObject /Subtype /Image /Name /im52 /Filter /DCTDecode /Width 130 /Height 130 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 295 0 R >> stream AdobedC    !"(($#$% '+++,.3332-3333333333  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_RL i{F RLpӏQ[$X=o=3:<|fd1,Ǝf>32M^7wc]T9ib:Z땼PS[CKh iк]↺e.%|uUUyӒI$I$_ӒI$I$_ӒI$kaqONֹ >;걟MU6ψR}Vψ_ӑq\Y&7"L 7"L  ,ٴu̴w<򎱍GRnc]c#tGMV\9ѣuPzemY s *n ._tp4U[. /ӒI$I$_ӒI$I$_ӒI$I^k} |>;v6&=r }a>}מwMǰnA/0vϲ:ʵunUkmh}V{7F~[]U9ʬ_*אt^ƲiznK˜ h@=JlNCrp]f^-Pd1vUj%xQdda1vUj%x_;m}.q[k~e6^\?̠׌M[*_atj)(=K+$J:E2뤲H*q]+( ]wOGzžNv6A$28% ^A 0RI2I$I/ӒI$I$_]]hsWu뾍\r)adY^$GU}gzuWXY}'M~=ePR^WP~`ԇaחn߿*vX,sˌe{qYcw.2eeUcV E׏mTosX 4tƨ9[^=UQ1e`^@IOңspKSHѹm]:N9T>߯؟^3n uwz7=7k9I*>Q.OQ"ڿF絶v4:zL$J#{gD,B?w^+Y\/}޻m/ƍ Ы_Suٽ{c6\cFLhU+\c8.$/C=ÂB{\k8.$($KӒI$I$_ӒI$Iy׿׾uʪv Xs_#G4Hu{}{\`ѕX}.54sK^8!yׯ׾ʪv Xs_#G4Huᆴu\ѱznvCwq <wW:OXB7`!K jϫW't|^~]CO`r5B_X31к Lt.d?Sj]6zEͧa4%w6D|ޯgZ,vcI^Kѿמ汣FOh}y~cG/ G+ɺ7]qk {Ǝ_!Dj WIfkCIh?V[WvaVOA /6\VS}AsG6}>/6\VS{鮂lѣx. Gͳ3k4hpZ Ah$I$ӒI$I$_,h= {zl5q1b Rp"&kժlhĸI?5VGs .|Lmf;,Ϫ'7pRޫw:vU-Z7^hׁzzӒI%ԞޗǠu^+:uC}GR{z_x+ן i5ԞޙǠuCy^NHoHNYUXCJrq*Uua*vAW(>J]ySso! |rD?rW>vM$y9.YtΫ_&Ӌd it8'<m.u$I$ӒI$I$_ӒKVȭ6 DKt\ugR ]WHNm{ Vu p {2jN#]/t}L=^斛^uҺImiièeӕS:o[~7PUOT5_kNx >ٞc:hnکS(=COgiZVVת^9y5 כYK|5ꗻ^MBn5G  BKg/&7`k#ipy#.n/QƱČѹ)O`ໟihOIl]v~rˬYun3aYen38> ~C PkqVGGI$ӒI$I$_ӕ~=6k}-sOc<Pic)yaag:*weYm,~/,,=:/4~Vϙ1RM7\ %ci-2?0eyOs|ܜ'e jEs?DX BY(7ۅKQM?yh/EY(7ۅK:"mĸ#G|z/FGQ,_in%na=c Z1p'3xy} un8A^^^F5B[W[ɳt_q{O7>Xט[ɳt_qs7>|V>_W2l]/`;WuF\åϟV>nsX95InsX95INsX95I~?X-u_Wഖ"~w?X-u_WഖE,o+>Z꾯i-S:Y>W_V/ÛqY{ݍLL |ORUο{[m [7H#_t)}G_ÅQ- Ȁ$v^w06W4@hWwc `|mW:dl0>|BY6U IK.=2"?It-q$stVu`ƒ9TՅaӒI$I$_ӒI%|UC+oIw翶sunfmwaV0Pcr]+fUn%@0{WzPͪ;][˚ #Wq׻/.UNŧ4B}^w_ӡ~-<9_W^~+YbkshkyQX}⹟f/֪'6ַue>~+:g֯W`ɿ Ai%ۉn>ApX/ '=SZ-{@\&:0}qku`zy.=G^=7Sillq>n&OzGt>;멃 Ը'tZ:LO\OVm$I$ӒI$I$_ӒI$I$_ӒI$IXkXUcO8A0W?wbSu6Zon \pٺ.xNt0Jٙ__rǣI'󬭂|5Ϫ99X].m'޸99Xv;\?z Mbސ.zuw_CCskyUCCI$ӒI$I$_ӒI$I$_ӒI$I$_:v W{\5csk Ok^Ljsk+Kiu5ߊ-]Ơ9irU:W쿭_[oЫ"cE p .cJmb}@#җl1s0%ӮIӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӗ endstream endobj 295 0 obj 6207 endobj 298 0 obj << /Length 299 0 R /Filter /FlateDecode >> stream H T B^C=#SC =sS#CCKS(U!C!\!*#CC=S 54)260J$*g+) endstream endobj 299 0 obj 86 endobj 296 0 obj << /Type /XObject /Subtype /Image /Name /im53 /Filter /DCTDecode /Width 119 /Height 112 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 297 0 R >> stream AdobedC    !"(($#$% '+++,.3332-3333333333pw  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?ӒI$I$_ӒI$IJcX$&1t4IRcmh>4{ zE=G_sh:-tc#^OR7)Ϣ]0ƻG9Z| 9Z| =Z| d)$ӖW[NmnX f875ۃpBwW`C'Fpt8b _[Nd6n D–7^uVn 'JXWqzOS֋jX wx$y)ct ^uVn 'KMi-%ӒI$I$_ӒI%okYY݉o-̐dvSf;c!%溓J.>$>Q?OWo=dݶLL#o,~ؗbgUI$I$ӒI$I$_Ӕ<5 U7aNcL+UQ,cЗ %rVQ]'a{ٸÓE}`镅ԯWA_c79xOcc$ZW>mVUS^Y,1˪G*gаc'ӑh w!C#/\Zl[0A{ |\[1ri lpAB ]cc/q>5w[G<ל}{3 c{wUֶ uѯ7gz^#ّs1轡;utgYFZQe<]UNӑ;c@RsC?{+'ĩ9={P1Ůئ{Gb8;ɔWӒI$I$_l[]sUűL[]q>ɘ.5W[ʹYm%1x'B.scgZ,Ŷ+is^ Х{O=Y;_q2juY7ӭ`eEm-ӖF/+?nJwU~ Y+]kuc Ȣm} 矐'iuu6܋> s8RP.˻&n}.$e[?6˲nvOOl#i]ԌΗ^Mg-2οЯu[G!/}P8y,=BʩοЯu[G!0גWbacĸ^Ӱ+.51۟WDDI$I%ӒI$Id}iS(NG֟2Xt۩d}iS(NӒI$Z(78뵭UZR'&UmeTD et3}22/G1;&c:j?V,~%~$2wDҹ}WUnMwi9NC't@+K}DNP:[[mV=Ccj{ 2羽~ wN n˞.%;',|+ڗ.ۀt|j\ЮӒI$IZI1 % h% _{ƌ7 SrWelS쮸:ӭݙk_N\PcK sH+_}l#h=]ys %1ί@{v!sZ?aӿn/?eR֟2Xt۩kuӕS~ 3koՌXy7_Y[s~d!V,n /8kKis1m5/?aXְotq&'kb; +\kd Ę_ӗ-r:?Ltj%.mNi͂>'o퓑ֱg;cUey,xqsjsH.ly?elS9;>+cËSAs`,G׾uԮWְ-l0[ejN̞p}:|vAkeĞI/Ruwd+㵬 [.$L]WzӒI$|[[ Koh0vD*P}%A?cS]ck0 ̚gt98Q&'> ̚`,sp*LO%mѓXYs ոXYs ոFN>Mb-e&7VG*}nz^wA0Asf; GY>956.%t4H?ZE#wPƮ\J6[cBcaV.%sP-Eh9ĒdI[nsIqy%msdIL2ZV8N^쌻TDҲ10`$Iq=t3Y}3LyxX}Uƪgk6s;d#d}U?U1E6N<G DsKIA斒4!2dӒI%]:Yn+3qܜG͹էȬ"q\Ed}huN[g'nfui(^_m/p6w;g(N_m/p6w;g(N_m/p6w;g+ֳ~uzNٙ[ُcZ>ot{+?sFG\ꍙ5V@'.?q$mϩrӪ6fVc֏[ēF}XlsfJF} jg˝2Wo:67D}7cV?\I/GWϝʚ}Y;1E˭_>w7*jcދBФJ1CGg+y6s1DN ?llQ"SBc\T:n.F^v=^901rraC=vGX~2WgH7'A=+'p9V?4ɒ>Wt/XY=@7&`β!Le^ƍ4?[zzE+]uϬ[zE?!\䓯uOٵݼ[:o-Q;{zo W|EV'.1ەw0[`|Dˮ}_7Llv}6VD$!b}r빟W S_gs ,& H\0,;7>`˶Zqqݓ~NXcX1칯Sg7`[}7n}9mӒI%>tYU.Y .<1%)XXGg.=_9p1NEad]L |ׂiçco:yӳM9n(%n'r|U.UQNqV<0ɀVz~V[EK[&K'ӒI$I$_ӑqZ;Ick p:8naF23:vCPGֹMX9?Vۘ7eV@k̀[:V_ɫ? Y~{srs}7A> ̞K`}Z?oncpUno^H'dײD[\Zʲ}R/jN~f^+Z][(1Z -yy^kǩ4=w51|ez5xn Lv춼zmcCqSӒI$I$_ӒI$I$_ӒI$.dSf];cukݓq~52Tty gu?q|H _XYHzGN]7TCYcήhޓz=O&Ɓe2\h*$I$ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI% endstream endobj 297 0 obj 6102 endobj 300 0 obj << /Length 301 0 R /Filter /FlateDecode >> stream H T #7{ endstream endobj 301 0 obj 13 endobj 283 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 228 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R /F3 152 0 R >> /XObject << /im50 284 0 R /im51 290 0 R /im52 294 0 R /im53 296 0 R >> /ProcSet 2 0 R >> /Contents [ 286 0 R 288 0 R 292 0 R 298 0 R 300 0 R ] >> endobj 306 0 obj << /Length 307 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsRn;ӂ$$')CΎD0dZiu D 7zCC"p/#ĺF:^=V>O<;az$D]v8 *h4c Sr4Z$8 endstream endobj 307 0 obj 176 endobj 304 0 obj << /Type /XObject /Subtype /Image /Name /im54 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 305 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 305 0 obj 734 endobj 308 0 obj << /Length 309 0 R /Filter /FlateDecode >> stream He1k1ǟ抩ⵃ4BsI]09'qi%СRL EùҏOЭwxȚ%tOρ Nxpܰfku#Sv,z1Ţ=΢1=g!z_Oǯ|=.j]XDd̹'3Ŀƌf[ihM'> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 311 0 obj 734 endobj 312 0 obj << /Length 313 0 R /Filter /FlateDecode >> stream HVn0M[o- -S6-HwHS#h=3o޼77X|zX RV$y p TIxE7X0Vc᱂G5n7W}mXm:(m ?4)i^SNKR QCQ-$me:nh#uv AnTgGwHp 9Xffh[){u-E N^sePyL@~?v+ endstream endobj 313 0 obj 801 endobj 302 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 303 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im54 304 0 R /im55 310 0 R >> /ProcSet 2 0 R >> /Contents [ 306 0 R 308 0 R 312 0 R ] >> endobj 317 0 obj << /Length 318 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$Dmv=,P(Jӄ1LqRCwoZ_8 endstream endobj 318 0 obj 176 endobj 315 0 obj << /Type /XObject /Subtype /Image /Name /im56 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 316 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 316 0 obj 734 endobj 319 0 obj << /Length 320 0 R /Filter /FlateDecode >> stream H]RAk1~QZB vPڮԽA=>9{ ^#PKk7ΠMt_8CGjxbUK)Cy A;r @U$<ʭLeveqԱ cf\\|T/uQ2@8R 7UE%X"e9J)"U!RJX?ϻj~X畊SڪB25{JՊ: o̻(gӵj&;,&pi%^Юצ- ݂7,&Nf컽ђvC,H0o / GsnOp@ĺA endstream endobj 320 0 obj 474 endobj 321 0 obj << /Type /XObject /Subtype /Image /Name /im57 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 322 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 322 0 obj 734 endobj 323 0 obj << /Length 324 0 R /Filter /FlateDecode >> stream HWnF %ٽrw{ :NBPARv"Yڕl'F/~lq9s̙?Dsɴ"drB3*$4:W+cHsA&_bVpLH9O)oz;fN/zdxfψsV'h)n7le}AIm=*5yJqnwÇpc皺)2p;n\??RyGBg=AG@2UtyR֋jt!xRGb#be@T]]U]#jalj@3'rI$L(zVF.#Z)32<֓F8 2 AJ"dD.rLfYFkIYCvWq@y0f˲mݺae,)w᱈f\u]ݞwnZtHe%i Tqg,ѸXǘ&9'R*vuדH€g>.;j<8m%8s3m9cCes+0w aM$i-.bI NG!.cr3Ο,|} C|,6uX$.4DJg!( 1Q 6;y ~'@!.\wqEz02I҈˖s S}dB]S5`ܥDY:vQv/6K{еOQa,G3e~=!ôC|E"xi;tYMkr~/O <+ hݾzX,Ǣ^K&ۧ9Af#'N5ykdA1&{@WF)Wd> $tEw vqJL>WLc|E^NOf/<D~0rUA6ߺb5+ųψ H ,z̕z㓓_3s5jv?lW+̧b᪳a&Rp΂Gz~vᅵd q8l Y ͧhȸ0OHU82`s5|PO_V~墿و`#I?oȄdbȯ+ьS+|qI&gOaˎMk=O yxP[ɭwI6{3{}jv: +g#L86n -kGߧI.;u tkS3hk-Dž`hg먯7#Xco-*yGijکø X 8; OZjeE3=mc ׉ PЦM}3p_Y(SW/ːr?nΕ; 7}s_0 zaz5ߑa .jG,%#?A{!`+ٿ ;ȉdǢP~FL()G(ẨovfI1O+gI6ye0 utKNt4}2IwWH4\mwl3qF}&б9lxuI-Gټni<zͬ WD_A;M*n7[PEfU o¢!D ls Cf.kdis]YE"Twj[^kX@EW]]Kw 7˚-[$Osjwl[8HMםEHdnֵج |up,Rn;GRMSvY W endstream endobj 324 0 obj 1774 endobj 314 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 303 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im56 315 0 R /im57 321 0 R >> /ProcSet 2 0 R >> /Contents [ 317 0 R 319 0 R 323 0 R ] >> endobj 328 0 obj << /Length 329 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7ݧ@.&Mzx_1Z8 endstream endobj 329 0 obj 176 endobj 326 0 obj << /Type /XObject /Subtype /Image /Name /im58 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 327 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 327 0 obj 734 endobj 330 0 obj << /Length 331 0 R /Filter /FlateDecode >> stream HeRjAv;,L`z3 ,5YѽD< 9= 3x|H.搫a/{@Vj㫯jP<脢k{N۝P ?\>abˡx#61ॐO'G>GCg3Z{[Ci/.m`2/#M! H_`_ch}L3鹚;'9w2tDL YP 60Aj+vDe_!W6/5}o(|tx_7,{2^&mnȟ24Fu! vӇi5Dc0N1%-kUet8/z#]Ma(-av.6YkQsjŬԠ_ y s͕ %BlK"*1A%i W";x:jޙGˁmi'* endstream endobj 331 0 obj 483 endobj 332 0 obj << /Type /XObject /Subtype /Image /Name /im59 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 333 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 333 0 obj 734 endobj 334 0 obj << /Length 335 0 R /Filter /FlateDecode >> stream HWnF %ݝivIB" `TRQ.41!̙3g.|fO3I C)!RpfDEAښ#~|I)<@w3\2Xnʦ2`H8aϔNo w濙vnPp){J8["߄uۚ]ݔ]o hO@ѣgX4`LXM^Lj*&ĈjMWwRH º9!ъ0!{tXt_]o#6(;.xdr*2c3G48c<E[Ӣa]VX 檘r{mF]Mx@8IlMYo.9y݁ Yc1EQգӴ.#$#S5oδW&qNջ[3MYC%yD)psayL "$sc}B'y)M\DAZSF,( ZL=1Yx7m`1qm7`1}!'Қ[j("*UvKH2Ȼ2qrd*`QtN)w1崒lLI>8MqTر[LcɚSn!fCH"M_ƽxd}. Bߦ}/Y"q*$RgSY]y^C_-0S%829U.n ܔ(~ ]8/c>z#O%IY;s(!N[£!;48q5ZӐ_0e='2*[t~8[=?}AG½T)Whg& "ʋ= P) rjh5ޏAԔΒ+zmyYUf{Y p@ǐ@) C/_\ttqM9sȕl9'ɢL,12Er/–oZ{Y N# Vap> /XObject << /im58 326 0 R /im59 332 0 R >> /ProcSet 2 0 R >> /Contents [ 328 0 R 330 0 R 334 0 R ] >> endobj 339 0 obj << /Length 340 0 R /Filter /FlateDecode >> stream H]j1 D0ȶd5l{!-)} R$^]"a=P4[_nc$ڝ޷"%#UQj]`x,C }LZ6|;}]GD昔|x(rFI@)! fb=/Og'pZ8 endstream endobj 340 0 obj 179 endobj 337 0 obj << /Type /XObject /Subtype /Image /Name /im60 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 338 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 338 0 obj 734 endobj 341 0 obj << /Length 342 0 R /Filter /FlateDecode >> stream H]Ak@_L4^KaMz`/bWYR؊^Y 6Fճ%Zh[|m.ֺb헡ҽW#> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 344 0 obj 734 endobj 345 0 obj << /Length 346 0 R /Filter /FlateDecode >> stream HVnF/ SruWɣW<KMj뻋Ac6|6ADaXNMjlS|DwvyzzV~*u)2*Iƾ,*U?cKP5D%G-l X$z"Z$~6uwݵ*{fM3LL׫oȘ(g{5B䲤Ծ)E0R6~ UB$ (t7)xهd۟<+9b"IH$!DNC I='M'XCa|1#!s^z 7x|||,-!B+J<6/,P3):#E,ec3^[;MZ7`:8ֶsaЮ <W9D׌s=]M$?TnҰue4TIv lˁLVβ-Y%f Z7<t3E/̿- z:D8|yIf(WD4َ kcwo\Cl"lDIKax)ARwNX)FwٿG endstream endobj 346 0 obj 951 endobj 336 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 303 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im60 337 0 R /im61 343 0 R >> /ProcSet 2 0 R >> /Contents [ 339 0 R 341 0 R 345 0 R ] >> endobj 350 0 obj << /Length 351 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$De@&*M:0/<{Z8 endstream endobj 351 0 obj 177 endobj 348 0 obj << /Type /XObject /Subtype /Image /Name /im62 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 349 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 349 0 obj 734 endobj 352 0 obj << /Length 353 0 R /Filter /FlateDecode >> stream HeRMkAq -zXƓ f5+,M{3xYr!8z#,b r s5@\BNPl8eWw6Xo^׫.o.͵b1oEB͸%[sn 6+юyL-=_ > stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 355 0 obj 734 endobj 356 0 obj << /Length 357 0 R /Filter /FlateDecode >> stream HUn0\ $%JhҠH=4=02cIE;;@^ҋE۳e ɇU"LENHJ2ʁ(r|yYB+R%I)8k Y^qg9Fzm W¨HR,ؐ5$3V abҌj,͘C'UǴ%/,&_ex5Y9A4 FplV!<ȵ5Famu-QЦ5ƓK1`YA/R4)/K?S&]|𸀭t[Avsvܩǹ`%9Ac<Ȫ]#w aA;;T'<)SAZqn;M[eIkð :C=y`IMU9+65fKx9ɘur MQ1kUq!5J};V7Yh3VJ!s/cUxМM!4PD5;fp3ok |T endstream endobj 357 0 obj 704 endobj 358 0 obj << /Type /XObject /Subtype /Image /Name /im64 /Filter /DCTDecode /Width 130 /Height 130 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 359 0 R >> stream AdobedC    !"(($#$% '+++,.3332-3333333333  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_RL i{F RLpӏQ[$X=o=3:<|fd1,Ǝf>32M^7wc]T9ib:Z땼PS[CKh iк]↺e.%|uUUyӒI$I$_ӒI$I$_ӒI$kaqONֹ >;걟MU6ψR}Vψ_ӑq\Y&7"L 7"L  ,ٴu̴w<򎱍GRnc]c#tGMV\9ѣuPzemY s *n ._tp4U[. /ӒI$I$_ӒI$I$_ӒI$I^k} |>;v6&=r }a>}מwMǰnA/0vϲ:ʵunUkmh}V{7F~[]U9ʬ_*אt^ƲiznK˜ h@=JlNCrp]f^-Pd1vUj%xQdda1vUj%x_;m}.q[k~e6^\?̠׌M[*_atj)(=K+$J:E2뤲H*q]+( ]wOGzžNv6A$28% ^A 0RI2I$I/ӒI$I$_]]hsWu뾍\r)adY^$GU}gzuWXY}'M~=ePR^WP~`ԇaחn߿*vX,sˌe{qYcw.2eeUcV E׏mTosX 4tƨ9[^=UQ1e`^@IOңspKSHѹm]:N9T>߯؟^3n uwz7=7k9I*>Q.OQ"ڿF絶v4:zL$J#{gD,B?w^+Y\/}޻m/ƍ Ы_Suٽ{c6\cFLhU+\c8.$/C=ÂB{\k8.$($KӒI$I$_ӒI$Iy׿׾uʪv Xs_#G4Hu{}{\`ѕX}.54sK^8!yׯ׾ʪv Xs_#G4Huᆴu\ѱznvCwq <wW:OXB7`!K jϫW't|^~]CO`r5B_X31к Lt.d?Sj]6zEͧa4%w6D|ޯgZ,vcI^Kѿמ汣FOh}y~cG/ G+ɺ7]qk {Ǝ_!Dj WIfkCIh?V[WvaVOA /6\VS}AsG6}>/6\VS{鮂lѣx. Gͳ3k4hpZ Ah$I$ӒI$I$_,h= {zl5q1b Rp"&kժlhĸI?5VGs .|Lmf;,Ϫ'7pRޫw:vU-Z7^hׁzzӒI%ԞޗǠu^+:uC}GR{z_x+ן i5ԞޙǠuCy^NHoHNYUXCJrq*Uua*vAW(>J]ySso! |rD?rW>vM$y9.YtΫ_&Ӌd it8'<m.u$I$ӒI$I$_ӒKVȭ6 DKt\ugR ]WHNm{ Vu p {2jN#]/t}L=^斛^uҺImiièeӕS:o[~7PUOT5_kNx >ٞc:hnکS(=COgiZVVת^9y5 כYK|5ꗻ^MBn5G  BKg/&7`k#ipy#.n/QƱČѹ)O`ໟihOIl]v~rˬYun3aYen38> ~C PkqVGGI$ӒI$I$_ӕ~=6k}-sOc<Pic)yaag:*weYm,~/,,=:/4~Vϙ1RM7\ %ci-2?0eyOs|ܜ'e jEs?DX BY(7ۅKQM?yh/EY(7ۅK:"mĸ#G|z/FGQ,_in%na=c Z1p'3xy} un8A^^^F5B[W[ɳt_q{O7>Xט[ɳt_qs7>|V>_W2l]/`;WuF\åϟV>nsX95InsX95INsX95I~?X-u_Wഖ"~w?X-u_WഖE,o+>Z꾯i-S:Y>W_V/ÛqY{ݍLL |ORUο{[m [7H#_t)}G_ÅQ- Ȁ$v^w06W4@hWwc `|mW:dl0>|BY6U IK.=2"?It-q$stVu`ƒ9TՅaӒI$I$_ӒI%|UC+oIw翶sunfmwaV0Pcr]+fUn%@0{WzPͪ;][˚ #Wq׻/.UNŧ4B}^w_ӡ~-<9_W^~+YbkshkyQX}⹟f/֪'6ַue>~+:g֯W`ɿ Ai%ۉn>ApX/ '=SZ-{@\&:0}qku`zy.=G^=7Sillq>n&OzGt>;멃 Ը'tZ:LO\OVm$I$ӒI$I$_ӒI$I$_ӒI$IXkXUcO8A0W?wbSu6Zon \pٺ.xNt0Jٙ__rǣI'󬭂|5Ϫ99X].m'޸99Xv;\?z Mbސ.zuw_CCskyUCCI$ӒI$I$_ӒI$I$_ӒI$I$_:v W{\5csk Ok^Ljsk+Kiu5ߊ-]Ơ9irU:W쿭_[oЫ"cE p .cJmb}@#җl1s0%ӮIӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӒI$I$_ӗ endstream endobj 359 0 obj 6207 endobj 360 0 obj << /Length 361 0 R /Filter /FlateDecode >> stream H T #7{ endstream endobj 361 0 obj 13 endobj 347 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 303 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R /F3 152 0 R >> /XObject << /im62 348 0 R /im63 354 0 R /im64 358 0 R >> /ProcSet 2 0 R >> /Contents [ 350 0 R 352 0 R 356 0 R 360 0 R ] >> endobj 365 0 obj << /Length 366 0 R /Filter /FlateDecode >> stream H]Aj1 EO;eU-ٳ no0$!d6!<C)o9#$W ͌S`$Lz3kJQ7ЂpRMAA*1?#I&Wk>08ʫkZmv~~~!Awzo`JGC][^n~~Yl8 endstream endobj 366 0 obj 180 endobj 363 0 obj << /Type /XObject /Subtype /Image /Name /im65 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 364 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 364 0 obj 734 endobj 367 0 obj << /Length 368 0 R /Filter /FlateDecode >> stream H]MKAǟu.K饐o]ntդ-HSe )YɱKtr81i CYq^ Yv?>]lU=ZՂ:ۨѝ6X#. k5gRo}??=xmxӇIDܲ>|:A+ V?dZ:H-;Pĸ Ԯ0]ҋ^X&e='b;Hh[Rbl/2-LF^w֋%Ӽ*8E2qRxGO9BXH)wiNIx$6%QtN& C^sƑ0ƛACEd\ɻsTAB(oޕѕ"Ztv0'du};z4dzJ^*W-)x S QGam:̈9%x>j 0}^]w6k}S endstream endobj 368 0 obj 477 endobj 369 0 obj << /Type /XObject /Subtype /Image /Name /im66 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 370 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 370 0 obj 734 endobj 371 0 obj << /Length 372 0 R /Filter /FlateDecode >> stream HWn6< !)B)P mK{[Ia/J:Ek%+Eۙ4\W˙@ ,Z c;rͮLHŊsqW_2,h?nfm7JbyD\ΝR s,~koK]z`WfTʢ9Vѷ8JQ}m±0ڃZ*NzMc<$Bum{]mB)b [ID\'%5d4,^?Vͽέ= K|fdy0a cBfmý7)n桘)7gghdGK_3T b /uۭ]杯ﶭݦ^^5/5<k-swG1) -JA2& (шG5!2zAc@X9/pzw|i!-J$jEyQ"ZF-/~/`p T ikj;{Wu%Cf;w*u!)"N12.]mkZX])6r'{Ny08(1Nv-[ [X-{͍w ۮn(}}jSr:R p񦶾HKň #^DU:9BX}Cuv Pi޶$!axפP}kTT1G*13O?BYR&GD$BR xA v/LpIIMbUrܒB22|6*SRBUa[u4)w6OW8G[ }wvr0O:"E=o2(@ܿ\O dE')P?q완ZnMGJ# m$_92R|6lfޜAd"-Qa )R˭~*g18kZ;h$lP>!J<+#p' yFRS5  DS)b1-}Y9%PYSʊV47j endstream endobj 372 0 obj 1287 endobj 362 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 303 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im65 363 0 R /im66 369 0 R >> /ProcSet 2 0 R >> /Contents [ 365 0 R 367 0 R 371 0 R ] >> endobj 377 0 obj << /Length 378 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$Ddv=,P(Jӄ1LqY8 endstream endobj 378 0 obj 176 endobj 375 0 obj << /Type /XObject /Subtype /Image /Name /im67 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 376 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 376 0 obj 734 endobj 379 0 obj << /Length 380 0 R /Filter /FlateDecode >> stream HeRAk@~c ٍk{xRz= zWx_ 9ڟ0e/{Č&]/}{I{~b ٶvuuvCvt, )#ؔ׌+ 7f1W 9;3#!@!{mom0T"v >_8^]ѷ%6puK6xp~Xb([AZ$@V"@*BrC 0E9sM0h[_XDv"Kמ\"d/M,BonoRS D±bUO@#пu[&P+$RjC#Vdxͺ[(^5.7(&8e)~e6X~5E l 7|:Ϗ dm3?9Fl] endstream endobj 380 0 obj 478 endobj 381 0 obj << /Type /XObject /Subtype /Image /Name /im68 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 382 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 382 0 obj 734 endobj 383 0 obj << /Length 384 0 R /Filter /FlateDecode >> stream Hݎ00f; ެi!bV7MXEդs_`n MÂeLp ,:W+W53eu(cxQW"V,Fhx[=VT%yy(/!cː;~t; .+ZA+K"}߶v뛾V``7㰈~/=45}crDB\Uc+gj%z`+> /XObject << /im67 375 0 R /im68 381 0 R >> /ProcSet 2 0 R >> /Contents [ 377 0 R 379 0 R 383 0 R ] >> endobj 388 0 obj << /Length 389 0 R /Filter /FlateDecode >> stream H]Aj1 EO;eU-yf&f`hK iI6!쁡 @ݿDfd0btu5B 9~Co> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 387 0 obj 734 endobj 390 0 obj << /Length 391 0 R /Filter /FlateDecode >> stream H]k@_L4^ċsdMbvm=)=PE$.Yo_1!x:۽Adw }a&|;37 -ۏ㈴ih;VSw{8< IpG6p%/Ɇp N߽>ý._@JJk@9T3=չ0_|o]C=chC5wnA~浇pxȬM93Bf (fPůO?VTydڋBMDJQc2('t&tOr1<|:*!EmUUʀe֫,ԫLFz)D.DY .$PO{sAdyL'0MӕU@gOج+.jPKE]/h:_V=[\DU23MPٵDX8nݝh;97Gˆ~Ҳ-}u endstream endobj 391 0 obj 490 endobj 392 0 obj << /Type /XObject /Subtype /Image /Name /im70 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 393 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 393 0 obj 734 endobj 394 0 obj << /Length 395 0 R /Filter /FlateDecode >> stream HWmo6T8EU$7d@dCYcb l:qH,$Ȇ_$y[/d=^F"AU&B0#\W.B }A4Ϩ5[甲#48"z(&(f8 6'MyDj,pF1iӺAޥXO[l̢YW30E3&LB8RRFD92&Id1X45ۀ6gYUU5TEd&Ry?x+fm,7G>yF2mU42DTKIV'n{=+ePRfYVclZ r3mqc6Ok\T8+)z1YsoWeY$gLuS|U,U`76EݜUM]Wu*Nrʅ wQi~ )x'E;aZVc4|:'aZ%.UfQl6~{"ϊɇ#4ۓx~¹Wм/JЇ*KdskV&t\֮%8D,efk*6s: ;^nI\_ͮ/ kALd-E<"}8Vo!Z\A^]^vHE5!*Jڟ@@MX68"DY;&;S͒<7> /XObject << /im69 386 0 R /im70 392 0 R >> /ProcSet 2 0 R >> /Contents [ 388 0 R 390 0 R 394 0 R ] >> endobj 399 0 obj << /Length 400 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$DB{YTQF} cʗݽY8 endstream endobj 400 0 obj 177 endobj 397 0 obj << /Type /XObject /Subtype /Image /Name /im71 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 398 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 398 0 obj 734 endobj 401 0 obj << /Length 402 0 R /Filter /FlateDecode >> stream He1k1!Ski,7s!!PJҡ B s/OЭwܐ5A&KȤV$H?${nj~atFM\C;Q̶NFgiu#fQL7lmaGFÃ,|;} l4zP G^oXЙ=n-e005/޽+qG|ļ~%O}a=-5hl/aKNqTw޼ yϫD.L H+e1{bŵ]ED/B$u+x ]qV5IoT*Ax%1p㽹wUR Q rܻ,8rsriZ1^puD{UsӊeJ˨ܖ6̮lMJ/Z8T`m&nlmt:G<6@ڴ6L֦ endstream endobj 402 0 obj 476 endobj 403 0 obj << /Type /XObject /Subtype /Image /Name /im72 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 404 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 404 0 obj 734 endobj 405 0 obj << /Length 406 0 R /Filter /FlateDecode >> stream HWnF>rP3{.Qc;E'n,}`e+VbECr5$R'ӑDqhE|D*$4:U*c斌^b dK qxsqDGLY)!4aFhOqxyT!MOtL8 pʬG2~WԏӪ%^άaT<'>bY,Vyj.*ٱ0(ƛKc=xT8c*kPxfx8-lezqVZ{/(F4ztbHlH<Nz*8C$I7l/Qύ8zuTZGD={a}{eB1CQZ-B&~)0bUa8mo,fb67&0KU\]1t')-Sf8jIfINNdBzp<zUsR x6aֺHy<.߄/72P*04CEqE]C/&_Aur,egzzsyqF 5J8r\b'* hERJ;y}u5ur7nOL"e4C?{1,*tðiiQaD$3$KQ 䶨ɿ|1?O6Sb;f?5M9׾†;ř;պ(_/DKmTw)4r!sOep8[;Q,byP?K-VꯢZĚ?"i8Anw^u(+l;,O\"4\Xi4K)%F۸Ɉ7dx>hKF%Ɨ'H>]!@Aݨa@Sw^`F>!o[Re0ыk ȥ ~ YYB,LZ>/g2fm+[Gfarj&f|4;ݹ`a7M3DopDBݟuTf,ޯ ucY:4݇x=L2X2hMN[WЋKsKDk}'.Ey[a$+i:{&~,b,4'ܝ{ .DLlkl endstream endobj 406 0 obj 1479 endobj 396 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 374 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F3 152 0 R >> /XObject << /im71 397 0 R /im72 403 0 R >> /ProcSet 2 0 R >> /Contents [ 399 0 R 401 0 R 405 0 R ] >> endobj 410 0 obj << /Length 411 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$DB{YTQF} cʗ{Z,8 endstream endobj 411 0 obj 177 endobj 408 0 obj << /Type /XObject /Subtype /Image /Name /im73 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 409 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 409 0 obj 734 endobj 412 0 obj << /Length 413 0 R /Filter /FlateDecode >> stream H]Rk@~QZB mںiPLmWZT C1zV6$ ^LaN؋xBAf f %(ytSmvˆv퐞^Pr'vCaDCE}Ct[J×4}:?=;3(X<#XK)ѵʠE3A ՆuAl\cXqO:&D YÞqx[8탶AxTF1@߾L׸Tz$%xHT.*.B /Ce1|O"3d8RSIpʰQ_8MW'*`"IVZyZ? u̻~wQXOgk˥Nv:yҊM]_SPxX _&dt @ٽXL=ъv#,E`KK' ~лC{Ŷ/ endstream endobj 413 0 obj 477 endobj 414 0 obj << /Type /XObject /Subtype /Image /Name /im74 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 415 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 415 0 obj 734 endobj 416 0 obj << /Length 417 0 R /Filter /FlateDecode >> stream HWmo7 U'֭d[AωۋmF׏").i(ĢDR|yHNwB\4 ٙ;.qоәmXNya&'qp?~n.!> gޝǴ:u:'q? ♸~bMSx% E 'n8x6B =$c:o;Df %2I'p ķ6ݰ&Aݏkp<94 iMSڵ׿ڑ+4cC$6`i ݟtOF*mx8LqLR#}W襭ZϠbL$^3w0~b8qs7PL:2 jpȓ>M5 ޶w#%džVb{iXg?nqKί 39D`_a7@i-(]C(Y iuKa4Ml"=U [.JЊ.f4vF7(ZOU^/rۺ>j ?!h38L4F)*?B3YOb{`W]oEQnv`͚o ?зb{BMgRkrQR"U͓믭%=5Pl-z!!/8oE;`zl<,l8!<>bx(~ƫ/ci9m\ T;foy4Ղ tC| ^iaN JddU>DUwuCyT%dV7QoctLDthB@ bw[XnYr$Vd2vfXb2[S[&MĶZ))%x!];MC lNRX;.s^׵-Q%3` jdfjBk+x1j9Q$ĪitjE3ӛ)M@#akbXHl62]H7N~CM^,/̖T&~C?Em+f6N z6ۯu{QV!ʪzA;%IdZ 6vQ >oF7ST,'qrنgR }y]4NL8; Ω_O`T3ys]`hFvM(> /XObject << /im73 408 0 R /im74 414 0 R >> /ProcSet 2 0 R >> /Contents [ 410 0 R 412 0 R 416 0 R ] >> endobj 421 0 obj << /Length 422 0 R /Filter /FlateDecode >> stream H]Aj1 EO;eU-ٳ no0$!d6!<C)Gz#[U"C3c98IS*LkǚRԍ> \ahS=CP;J.gH,/& ꚻV7]_īc$)ǿi}o`JGC]W^n>~/Zg8 endstream endobj 422 0 obj 179 endobj 419 0 obj << /Type /XObject /Subtype /Image /Name /im75 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 420 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 420 0 obj 734 endobj 423 0 obj << /Length 424 0 R /Filter /FlateDecode >> stream HeRAkA~Rv"Mk7!hnAJ=WBq/ū\ rq = LB}||{of{{ǽv~;awNȏN?zSF^o{{s??y7q0`e?\qZK zz3!9oZAH` 2'e3bB'_NJ߄Ѡ%{99nW2tLY 60e%c{/;_J]VZםJ%jR/*ݲq3vb!d_9Ίy! {;(ty%Vת%V  PVB KSUΊ*U4ZQ TOB9mdav9⪐ /U 1 49SlK5|&3Mɘ"k9Gpc=8ay=;fӨGo endstream endobj 424 0 obj 487 endobj 425 0 obj << /Type /XObject /Subtype /Image /Name /im76 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 426 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 426 0 obj 734 endobj 427 0 obj << /Length 428 0 R /Filter /FlateDecode >> stream HWmo7 U'֭t[Aωۋ؇ٯER:](PE|7Uӡd'Bv~ A%tfۮe^ N1LwBܦai:$6iJb qq%Ź7N*\BOy3NjwB)%mA`6hN"1M񆄲E(B~ a6v6?ø3œkF;4-)^<]{{APFX1qKbڜv 4t<{R@wuMAo/dG4w\/mzNq$t?O2|:; 㰞3ǁ+фՑ אysTV~J,^ϻ$vi8n{5?y hWc(4\ ?1Pu F/)6.zuSSZRRj̏X9<άqG-4ߢoђ["Ac썟.=]u264* }s[ѱ7ּ?Vqx2iik!Go>_n>g͗u_eFFQR㐾C#wQ=p!5 @Í> /XObject << /im75 419 0 R /im76 425 0 R >> /ProcSet 2 0 R >> /Contents [ 421 0 R 423 0 R 427 0 R ] >> endobj 432 0 obj << /Length 433 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$Dlv=,P(Jӄ1LqJ ݽZ8 endstream endobj 433 0 obj 177 endobj 430 0 obj << /Type /XObject /Subtype /Image /Name /im77 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 431 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 431 0 obj 734 endobj 434 0 obj << /Length 435 0 R /Filter /FlateDecode >> stream H]Ak@_L@e/E6mmٶ+uo]< RCq )t_)&Ы7e[JffJ' gtReV G1[V#f,hE1 7w 5[+o ^{p`c29v'x`z 9t.{ѥ PmeC;|P_d kSgxȠ(fsϿ!\j :U ]R|M?q~QRʓE'/'~G|&NDBk \WY y!x ʨR1U7y*ȌZi)zVU:IySuy7ؚ\gQ2S+뽺*ו2m.ѥkirm,պb헡ڽ׈`>^ /z [f-iu endstream endobj 435 0 obj 487 endobj 436 0 obj << /Type /XObject /Subtype /Image /Name /im78 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 437 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 437 0 obj 734 endobj 438 0 obj << /Length 439 0 R /Filter /FlateDecode >> stream HWnF>JP1{A Spr+Qt%N;;KJi,Ys=sf-t>9Qd"hD3*$4VG+cb[ 8|)9?bjVЌ{}YϪ eH3Nf2TCWֱ) OZU^YYlj'6gLD !_QŒ Q%r-eVE9ȴܠWZdSR^u{45Q`$7޹'. ocBfۑ!sLaSf彥<9) f=QЫ-}BJPb>n}c)"Q^81g|`NM[ۣ.zݬ}nL&U(P@Q)鎯Qa8BcA.%yL?<̭w)|}k!p2ZV7&]\(zJj$@7Ul2z'gArpr|v~yr|YE HD,r 'FAxhUuRJyvzzne#e#Qb+hvg^!K:0dz82*BtRxSÄ]UoUS/O^n߮=sgj$3q<3i6*98޴ͪ'ܨӣ_:R[3MFT JZDI$I`qz$&DpxlUWdbÅO`ֆyoⷝRK`Y9?f?9 H %~[‘P+~uJY{BU1 endstream endobj 439 0 obj 1620 endobj 429 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 374 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im77 430 0 R /im78 436 0 R >> /ProcSet 2 0 R >> /Contents [ 432 0 R 434 0 R 438 0 R ] >> endobj 444 0 obj << /Length 445 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$DB{YTQF} cʗ:wZ8 endstream endobj 445 0 obj 177 endobj 442 0 obj << /Type /XObject /Subtype /Image /Name /im79 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 443 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 443 0 obj 734 endobj 446 0 obj << /Length 447 0 R /Filter /FlateDecode >> stream HeAK@_ʈvk z*j⮺EV)RJYEKwmi]J,\1Bwͅȃt ZL@X:D8 90'fy"9X=l͙Ğ6XG}uY/n5fz,ioΔ1S>+0.M1_O{*NOp'v an6X] endstream endobj 447 0 obj 496 endobj 448 0 obj << /Type /XObject /Subtype /Image /Name /im80 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 449 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 449 0 obj 734 endobj 450 0 obj << /Length 451 0 R /Filter /FlateDecode >> stream HSMo0- 6JUz:@ܬkl(U~ޛ7U .>e 9))G al G3!G51C1lAܙ#DxE=[=%K_?\'zx TgZ Ϯj ' 硱|kG ;Yjv 'ßE%3ڏpi.)I/tς'4I/(y0A'0)%-.䜮܃~ӻ-E =$OR%G0лp9fpd Ŏ;&kkdz1RO#B3k?& Ň(P"4DW\?V$rKL{"r{> /XObject << /im79 442 0 R /im80 448 0 R >> /ProcSet 2 0 R >> /Contents [ 444 0 R 446 0 R 450 0 R ] >> endobj 455 0 obj << /Length 456 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7=@.&Mzx_Y0Z8 endstream endobj 456 0 obj 176 endobj 453 0 obj << /Type /XObject /Subtype /Image /Name /im81 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 454 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 454 0 obj 734 endobj 457 0 obj << /Length 458 0 R /Filter /FlateDecode >> stream H]Ak0ǟuս]VXfuA&c-e9F顇RBF "9}kAr);y')n X{%3zz٩i lY 9GmwY#ԩim)_:>;9}톶[ Ll a/:TQJX,!,?4:H=([b\j׬ `͢s)'bDPzblr(yhتiEdd01xbT;Vi^*iO2rR:;JY;t"$AuN^& UUH/ƫrőQ0 "c89H5HetgEcw; ??zSgy~1*} KJXt֦T4h"u+-?bT޵+ B2?;oXr endstream endobj 458 0 obj 478 endobj 459 0 obj << /Type /XObject /Subtype /Image /Name /im82 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 460 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 460 0 obj 734 endobj 461 0 obj << /Length 462 0 R /Filter /FlateDecode >> stream HTˎ@C{=XJ q/gvdOXˎ-"p(/3IUHQT ~W dw(F&Y?2}@&}5:@(&E vLj= ھËksRb#"89SOC[z bsRh fch *"bU|[Gv5]k=w %;zwP9\w8Q*T  X/F!XYą} M]^IA'Rx2?! fEe~pkodd|kHFo*kҸN#~c ɿSJijUl8c}176nSb§iMƌdyKY2BzTy70^Jg)ŞrK\x  V ftA cb4-G]8[-|?YWw90Qﱦ endstream endobj 462 0 obj 581 endobj 452 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 441 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im81 453 0 R /im82 459 0 R >> /ProcSet 2 0 R >> /Contents [ 455 0 R 457 0 R 461 0 R ] >> endobj 466 0 obj << /Length 467 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7=3)gRC]M&Z<_spwo['8 endstream endobj 467 0 obj 176 endobj 464 0 obj << /Type /XObject /Subtype /Image /Name /im83 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 465 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 465 0 obj 734 endobj 468 0 obj << /Length 469 0 R /Filter /FlateDecode >> stream HeRA@~C, vvfغ[\D<YA"毨x/ =OKa}4-/${߼LN$V'{t,: :iB!oEpR.^}.ا-ǯ}9?={W>p 8^sx]KLLtgݻGX[}aSVUKS-\G.*?S.A2?-bxXP@l QՌ7ڇ"EO3̋Dvכ@C*∩]㩆?, =b2^ZmEgqӘW % rZ e)jERiժgB1z#Zhxݲ6[+֍~\U~AB̕h !N~\5цQwP wH nEvrkmɞfy~#C endstream endobj 469 0 obj 479 endobj 470 0 obj << /Type /XObject /Subtype /Image /Name /im84 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 471 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 471 0 obj 734 endobj 472 0 obj << /Length 473 0 R /Filter /FlateDecode >> stream HW[oFy:"Qp⽩O9Z%==/Hȅ%i߻7ۻ\*/`ofg @`DfL(C2*83_I ;|=3bVƌ昘 g30(X0,.jp&gE"w;u?ICt>d:~2; 72D\kp-lB YۭIR*զVOpW.*R@4; gbb%W4Q!iIw<1hݑi#z@1;DM92mz!O/txcm'0-JIvVT&M\^ x4cJC:BiAxeˣ1۴CچQ4laԟ,vBEo]m~<2> /XObject << /im83 464 0 R /im84 470 0 R >> /ProcSet 2 0 R >> /Contents [ 466 0 R 468 0 R 472 0 R ] >> endobj 477 0 obj << /Length 478 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(F HB!"Z\0N<8HSHuǚי^'a(oj+ȍCB*Gp/,'ĺD8Vgoxrt0I7=ԦJ et7i3k|͊>Y8 endstream endobj 478 0 obj 175 endobj 475 0 obj << /Type /XObject /Subtype /Image /Name /im85 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 476 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 476 0 obj 734 endobj 479 0 obj << /Length 480 0 R /Filter /FlateDecode >> stream H]Rk@~1+x/͓M[Iە]< RCqVdEB=xO^r)8q~$.7  <]dC=[u.oH`% MkR"~gx'`7큔E‡rt -rBkM^hѨ00(-Vfxo!Je ڀ a8521e pfSů/7Q,B2+۩"72]->s5B=B,I{ng'\CyvSDi3Y&^^ME4FˁFh "*IiJDu> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 482 0 obj 734 endobj 483 0 obj << /Length 484 0 R /Filter /FlateDecode >> stream HWnF} dbfl\'End}`0hqdiE$blM_lRss0Fd&j2Dq(33)ḁψ[1cb0^B`~?jAVLAⲨvK'"x%z*ryDuWncȄS'#,_z@}~c+ؕ>q5sw y.Weq2*-*'U^׍NEZY#*&X$T0kC=ihܡyR! _'@eN$jByb()֥XSokZh%[u8 p!/M4VFmSaĽn 5˺\uUVMVYǐs"Ivpœ1;~0ͦW?,BT:!J~;$Xˬ2.g7ӫ,i3mbxJ]s^F!,*DPpFq/l[$Noȱ,咆']>M_FMmpSiT04Bh>Zc XL?)vj'}U2iV2!X])ylEAOuy¦ k=J@.N>@,!BuoEhyT]G]?K OMsվ#SL!ba.dځ;<7*rG џ0ҜO;#)Pˆ_aFax  8Cj}&<}bq [}ۆ!6ԝ۟yCĞuu1>`1be789n'p33yDpHi$`h'7&$ t!AF.DVS=7f#(Wm'r O9@Oh\ި[`Aq27ͻA'I Y0;Xx3LH =c}N.\6ضty'='ύf{ޘHyItY3T<뻲Q$ ,[yV_T[D 6+wCscF"(k(!c *jj |yyWo"]ԻC@?VY i\PzT`UTlSpX[9dG1R7U aX.WUs²㰞;nM<f[2(¬Q& ?Wqrtzz-nG/)/΢ endstream endobj 484 0 obj 1302 endobj 474 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 441 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im85 475 0 R /im86 481 0 R >> /ProcSet 2 0 R >> /Contents [ 477 0 R 479 0 R 483 0 R ] >> endobj 488 0 obj << /Length 489 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7=Lm{YPF} =c/ל0Y8 endstream endobj 489 0 obj 176 endobj 486 0 obj << /Type /XObject /Subtype /Image /Name /im87 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 487 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 487 0 obj 734 endobj 490 0 obj << /Length 491 0 R /Filter /FlateDecode >> stream HeAkA04WvmVݴhn""!^o%^R71g+ \4zȘ3O$7f^;DoCNy\8 熸%@WIgi)@%VpTɷd PtjNTSSV@!^UFkP#A.WRu5`ZJhXT:(zgDP g Y©t*y& gU3Q"&9/(T }|i[1ZvommŲ Q9LQ95el3 zɣ߾18k_OZ.}^?n2wl<3Ϗo醛$Ix#^I endstream endobj 491 0 obj 476 endobj 492 0 obj << /Type /XObject /Subtype /Image /Name /im88 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 493 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 493 0 obj 734 endobj 494 0 obj << /Length 495 0 R /Filter /FlateDecode >> stream HVYoF7 6hc=j%3(d#FOU. |RO8œFHH]2>mD*4?/2C\gS16 0:vzM_D6"{2Lh"!;A@SƢs4˳$ϗ|e&R|=X86gAu f:FgLZfDqԾ]DǮLk&Ja;({`.?¹uԷaCT 1˄&.q~EQgkbZu+XXU{ P4zZD;!O\)-{WVy싦غ5-t;ծJ8Oo;"ttEDM[zM685%rMӃ0A6+=CU$[4t2 M֦.|#Hg?P~7òDa ;߹<ɮ)*i9կDDSvr[r-T5}]wPۣ ^wLQ\E1cԳ8.׽>R\xK yIEk"8C;<&܇td#0nM ߌ:|$6FiW+p)w endstream endobj 495 0 obj 976 endobj 485 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 441 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im87 486 0 R /im88 492 0 R >> /ProcSet 2 0 R >> /Contents [ 488 0 R 490 0 R 494 0 R ] >> endobj 499 0 obj << /Length 500 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7=@.&Mzx_pwoZ 8 endstream endobj 500 0 obj 176 endobj 497 0 obj << /Type /XObject /Subtype /Image /Name /im89 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 498 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 498 0 obj 734 endobj 501 0 obj << /Length 502 0 R /Filter /FlateDecode >> stream H]RAk1~QZB vPڮԽActOF4|ɢ  {-wX;|z|r9X^u훁vTg& /1&@a Ch".k ~K)CG9IAz9*x֦268DTF1_\\|T/uQ2@:R 7UE%X"e9J)"U!RJX?ϻVz~X畊SުB25땜}J: ooݽ(gӹ>v:[ YNLzAv8y6?lMk68wݙFX%a / GsnOϐ>į> endstream endobj 502 0 obj 473 endobj 503 0 obj << /Type /XObject /Subtype /Image /Name /im90 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 504 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 504 0 obj 734 endobj 505 0 obj << /Length 506 0 R /Filter /FlateDecode >> stream HWnF<{C&}r&~ P0f"*I0{JR#y%̙3`j!p" \QT|\Jn`q) b1015,?B_ v`eNpNvGDY3Ot#F摔<>o=<ݗf{ާP6hқD1\z"1S ޯ׺j[;ܵ%D*|c1& wF ; >53s™;j$۪3AJFǥIwo 22U+u{k&}zivUdnV̍1l 뽆uzNX}oJ/FIX3_82v+5^{mA 2Uɼ ?'GKGV10sTMRE_@{$M -TݦiNp޳N4Zs^0Vk  XUT6ڲY ePJV+ J2vݺK0uvKts!E?hI؈]W87pӖ>avh6P]{ӆl[n}+fI3"L!KCkATWԓ)ݏT*#V`jDLE|Ѓ+T_.d#p?),}gUayrb t 桕եhy"=IXzN,2q†:7hbl2̈PEZRܩ" `w \~]r] fhA|Iɣ&C t4"G1N{I+.CdOD$= Vpqaw`W7De`j?^TqZkm7E,-_1'g Ci)ks >B%9-q핻 ,u {Ca~beτ,sSy:%Ln5#4ҿc+?l1'쌲!uXd*F#"k5,LB4LU6Xa,Q9\dYFTKVnPQՑr"SZbpy*_P1gv'l#f }A$̍:}ߴ{ڎǍQ /J]\*%)]I#p>CF^]|=ҝz)x[M,#qbFiCLyaьlzʣoMЀop+Wt3""¿E1ZTq޵}uYb*ckgϥ/15o WREڡ$GK -71sC wgFP[UZ9|8.Q( @נ4JM 2P璚r,f˘2d<}C endstream endobj 506 0 obj 1442 endobj 496 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 441 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im89 497 0 R /im90 503 0 R >> /ProcSet 2 0 R >> /Contents [ 499 0 R 501 0 R 505 0 R ] >> endobj 511 0 obj << /Length 512 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$DB{YTQF} cʗ {Z/8 endstream endobj 512 0 obj 177 endobj 509 0 obj << /Type /XObject /Subtype /Image /Name /im91 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 510 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 510 0 obj 734 endobj 513 0 obj << /Length 514 0 R /Filter /FlateDecode >> stream HeRjAv;,LE0Y3 ,5YѽD< 9= 3x|G sG谗=v Fizb5W5Uu({wmvCƵ!vvwS\g"r@lq9\rt釷x$lYkoj(MLei3!K,vTu,:)WpnZ:qF;x-ͱ 0EBA3LP1ݬAE9PDv+촲0u/,#"*7ju1z^I2笭L3Q{k rZ  3cL,jiU90=o*r= !>szv0YV?Q9b^HjP/բ_JKK!|%sM˘ [ᬆkxp-k<7o@4˓ݎ endstream endobj 514 0 obj 483 endobj 515 0 obj << /Type /XObject /Subtype /Image /Name /im92 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 516 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 516 0 obj 734 endobj 517 0 obj << /Length 518 0 R /Filter /FlateDecode >> stream HUR@M--!qNI࣫E^^% /d*pULOO7|XMRdIV'(A3@ M7?gw09]b "!6v2G Fa"R _UN`s3&Q܇ȹ;'8 "W퓋sD8]"eϵ,: 9iiNqKCI;30G#Bz^MɛBHL--1Pp=MSlsuC"'#OCYĆYשBZm'Py2TĦ8|@NS`Re!mݖ.U(-^" Z?9(G!}!F&2W^֭#Avn~PQaGfO`z֝ <7NH6`rWqz @,0jUݍ^#k+6JSېAi k…R̞Ʀ" M ZZgHM81Z)B@l5tu,- OW&{XձMtS V;3q2G: KuN]kȎj'. IF{2lMo5$|u>*ۂ0(^Գ`[mṬ3hK` M[b`@ZSpm+[+7^F@!3Cq%2ir}:gy^-7I$Hz4WDdL(WLp4Ft*1vN6fE0ם`qmdtϐp7#JxXONuZwѼӀQX8-1-*cTTZoc) QG1?֋Ki5w endstream endobj 518 0 obj 896 endobj 507 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 508 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im91 509 0 R /im92 515 0 R >> /ProcSet 2 0 R >> /Contents [ 511 0 R 513 0 R 517 0 R ] >> endobj 522 0 obj << /Length 523 0 R /Filter /FlateDecode >> stream H]Aj1 EO;eU%y lo0%$Ǟ H _:G)IL)6X7Gx&d~? Ρ.o\HvaP^\sey:#/A7$UP 2]e|m_^%a /Zj8 endstream endobj 523 0 obj 179 endobj 520 0 obj << /Type /XObject /Subtype /Image /Name /im93 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 521 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 521 0 obj 734 endobj 524 0 obj << /Length 525 0 R /Filter /FlateDecode >> stream H]Ak@_L4^Ka<۴ubJ[=)=P=H +])R 9{YDd${o{Fמ-#_kZfjpu"dQ;[l}7[X?x1rU<{|ڡAC CWi0>3~ep,ct+5~|QF KsQ{'3)xH@wwX4Yz`*!:+)zi+>ɿM>q?ϧB)Er(ҮgӉ*_tIcU] M;tBcnx ʨB1U7^YĨV8\ZUb{Л7uޔ|~?]eIb+We/hX/{U6hm žXzů_J^-C7Wn4^ ;vח4G-G endstream endobj 525 0 obj 486 endobj 526 0 obj << /Type /XObject /Subtype /Image /Name /im94 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 527 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 527 0 obj 734 endobj 528 0 obj << /Length 529 0 R /Filter /FlateDecode >> stream H͎ ߡIHR-H xr~,Uwcd]x(]%}2n{۶WzH$n&{o_oclﶇ%oߊto\d>}~_~z?~Ƿly͗z{テ3~2Q*CEC-ܛn2y>=7ˁ6t TH-_[J˱ ͐,[%0 n RףRѿ~ sϏ9CBG}zu}6EpFVف^ϝ MjeQSd1yfǛ5UΌ7+AtnC0f 里n[_xyL̉>;{to߿5sHGmj5DOρZfh[n&#BF>-u V5)M 웇r![FF:~iS>O+#-Naq]V;F00:9l6FH?78K rv1޽4-&ѷkL'Dzjk(DMyT`ƀZuY: 'fVSƐ&tc ttxrRh5i5jLk (v%K&dP< -Zf1嘖wHVh2!+:RD]{ .[S|kׂ6i)EX'K= yZѝ@+#cUaSjJd乳Ex"V#Zш94-ϥE%'a0b+_t 3~KfL,_ TxFwF3OLJXAX#3ZCc.1M'E"oWZ9@}K=/2f2X|ܞK=sS zT`sUp@qPP#$NlUh|xNy9u*OV6 5ep y6RQ <%ZvZޫ\Bt"HCf9QhuxF-Azudf=6ޅPcs} cp6\䑪:KSDDXT$o_S W];Pu1"JA[=Sd4Lon jP.RQ*#5b+SKf}ZPyٟizlFʳ,:f(͕BS i-љ.Oo ]˗z)ј Q|NHMExNeX~.ϱ=T(= P: 8_> Z $; feB,|b?3 aLNU ZʋZ g' k8m+n}.k: w %N:PrH5NeMZ["EIL,⍅j'hN"ƴy:S;2+׽nFvw 58UP=VwWi_+a^J}8*lכ=i6`v ӓo/u?2cS ĞjA~hmKҝ/{|&:&tA8"'Qo Nz~*e_4)LJ̪?;% O>iG=Vud(mxH֨WEcs&{FE{Ckq2 #`ta}P-$J#0fEO^8,H,P_OL?ߏU{vCiyqs=O<"DO;I@Ch9 hDD9:מщ] T!'ɗ$ J'buUUvG7⢥7 .}ɸ ȓ=LI=lby29zPxP5ZOLuRD 4sAj({9u2bVt?N-=A{I.jEqhry?2ӥsU1QSaiJkvLk"l kTBN Cha+.I1OH ºZ Bˎua,b F)^,nȂ¬m)_VOkwO= \Dc=3 .:߶&G';^tZ?1l p_x1TIIhTIQ,O%t߱)1eKR-,KbY*ۗy W<X/1-J,-`?OS wZ+l̛*./]q>wҤ&cyu` *o">rHCb"9\Z\5mxѮL%R⍟zigOdbs8ԋZ=U)*~rl)KmӰJp^OnzhWTɑC$S8,GRvzk@)w(KVtS[V؀Ůr%(~vE--<52ԉaJ/UX#Ӵ_"2Rщ@)ŶW#q(ls, TRQtBHxc`<8ʭE .K\ZZ?GhӤʎ+`/uc4`p%tF&ңF=ܤ'!QEXg6Aś"7 fʌٕA[D3/hdWf?)^ndnї(B66%DH}jPlDxsip0 ǘm*.@yi̠f߉͹PY15.X 932F,.Ћ7/hZK` RjvL+IY"DaD|^qZ|I xŏȤ7mf8d>L5䏜g~HvZD^mެ]`LWun MށpsP2B6}nv@80†80H Ӎ/ƒ@~rQ@6gdqh? Vs 6Eqp.70*ړ H 랠 qö-Lqir{:2f;m`-E-`Gs ڃCq-,7j=O"fͭsϸݕ ľ΀y 1L(k8S12q2OG=) N]C.`a)rVv%!|#6ײ|HH:HzViΌxb"%#gb%#^7> /XObject << /im93 520 0 R /im94 526 0 R >> /ProcSet 2 0 R >> /Contents [ 522 0 R 524 0 R 528 0 R ] >> endobj 533 0 obj << /Length 534 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsRn;ӂ$$')CΎD0dZiu D 7zCC"p/#ĺF:^=V>O<;az$D]v8 *h4c Sr:EwZ8 endstream endobj 534 0 obj 176 endobj 531 0 obj << /Type /XObject /Subtype /Image /Name /im95 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 532 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 532 0 obj 734 endobj 535 0 obj << /Length 536 0 R /Filter /FlateDecode >> stream HeRAk@~1i2xĦ]ѽYD<,=Pj,Gћ&k)8缙n f|7͆o>kb|KqK,c1|mW虈[> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 538 0 obj 734 endobj 539 0 obj << /Length 540 0 R /Filter /FlateDecode >> stream HWێ ~h\VWb@,y+HCbh=ymyX=ÿ/N,lޖS:eIצֶm7黟Rsק}^y旇O^yyzy?>|ܽ;YQ۶"맻SCq;^8|˽rmr0S׷a2 5%O'6L}q(wfe_?g}PkZǴ(]ӺL.քd/W|G\ד-Y]k77Vq3jD.'a{/׿fxfZ-![\ }i}}:8U,_ctItIN.o_=}zW[W^8j~Zӽ?,lj H32GO0G)L\bad .˷Ҍ^ixzk.{ºd wBUm/pRLГgFHh^ 2눃s%γ>:IUX-_Yd'ּ -)G@m-[/QxJ %ES3gjM׺<[ݸ6x-E&\}ү2?Wk$MM4†8!HN005{UtC}~R:#m&CCu̓浯c O䫻*LE ?f#J}N#q.MOTlrRz+H. 4(>=*D.(h6'9 (% 40-F)u9O#5^|2gAuE.]0b)S0Sط>FS_8|X"JzѮЩF[,IR(һɘ8E<CԮO} }ZA^&sR@6`*T'.R9dF#~ԧ>H+ *Z:q5ᙢ ;$b.mr*#HR0=k;ĕ!g#G#7́Ӓ鄵Ecf< WXF'Q$Lу7dž<(]z&*C5ԥ}P4 G5*qvkZ - Գm #?1&]\_1N`xO!x2bv\ ]zHlG$8+ܥ5cQ:QN姇Nq >HQ$BKB9Iu @>H+4H^D#ǜpK M;L5JNM?Fݏ*S͢XM76Qi }囿 :͵'I6i ^>?2tw7X4 endstream endobj 540 0 obj 2166 endobj 530 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 508 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im95 531 0 R /im96 537 0 R >> /ProcSet 2 0 R >> /Contents [ 533 0 R 535 0 R 539 0 R ] >> endobj 544 0 obj << /Length 545 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$Dmv=,P(Jӄ1Lq{Z8 endstream endobj 545 0 obj 177 endobj 542 0 obj << /Type /XObject /Subtype /Image /Name /im97 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 543 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 543 0 obj 734 endobj 546 0 obj << /Length 547 0 R /Filter /FlateDecode >> stream H]MkAǟ z/Bz춵$PmZTz)=P{(+D/cKKt\-Xdy&g3G~ctz-`j'VNmv߲FamR>MQ˳7_NS}*J/G7N'R.-1.k6zWb'VI9wI9':h탲 nbK!DdٿbE;4 | q ICFPt8RJG> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 549 0 obj 734 endobj 550 0 obj << /Length 551 0 R /Filter /FlateDecode >> stream HWێ~ Mx͛HaRVuabyC9y~;%Y YR _ 9/-㰷Wf>G<~^ӧ7my?y~Trvdlq9X֎m `[r˙ce d 5D)X^TW  LĻ/ Ȳ@ &g9Du}?!mQ֣֯Yjp1֢֘ K1ͿVk< +'zz2=Rl߽4zˠ) bv0C&ՑoT0noOC3!JE/TI( Çjk" 7-E(1Si%?q$X,Y-mh\p-Js2xy$az2*V4o@;P 2 l+"y]7#A|aU+mnB$5\rLTEl$2K6٢2RΨP+Pr,zl.]aYyi7ټxUĢSsh7/M8S h=Z)!k\'F UG#d { 1z*Ef\ d`*ieɜrdlڸfU Ri* T-Iۤ Ȥc}zͩ;erGݘop1I* %vf"Q?mWrK0mx!Ÿ<rd1^!i9Oo'`c'UJVsfe*7щXZҊsuRGLDejZ.rLJ^@;-1BƢXڥ9um:LL^fH}EbkrZs +IcXH;"[zwk uf]bj?mKYڶfDq); az/L ,׫k S]ܦ"8AV|[dĦ͏XLf6Q<ޢB Z#S ?VlVȮ0(D + n(0g2\Ql`yTh嚿AInMhe^-whh[wwUKbSک%70ҮŸ\uQ7ހxԶps(qsXВk􍣸Pѹy zYyW70T]u! 6G.&iua4XdoS,fWZm'i%]E0Y\5&Ł2֚MݔdȘI8ZDFlj(=)(^4 \Fvq؄[纹E@sy5E Sny|aFu- m?ޝBzȖPR _y6KZޞ^՜%1 YCG,ꛅu3sIrȷ]lޢ݇ǁU; Fbnq*ܿ<6EfҫKV=7gse ;aszDŽvȌBU lEaBm+6a2s:DŽf{ Anq H ~q ;nfLOqIA7 lEC0l~qA~_qLi@AW<F%#{;_Ä݉ay!N+h'2#msNRT>,f~N[( qlgɋ%K-['YΔ JXBZ8@Cw!3i%xnkk4]NPe+ٔoyt@k+[?t~g&'l:}ԏYvfq\MѳSwFYG&#KtP?GJZnI +E RFnR3=`ۻT8t68J.n&6" jT[+$Z {-osһnST$QX`24dƷ1?4W]xlkdlWWGptz/ y0ܠAGL;IK[]T*q ȉS\),d;D9+@Z4Uċ-1֡_a%u,bwŠpUalOQ0a pcC7ahH{h؎Ϡ>K !?o!ElJ0IQh%n endstream endobj 551 0 obj 3248 endobj 541 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 508 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im97 542 0 R /im98 548 0 R >> /ProcSet 2 0 R >> /Contents [ 544 0 R 546 0 R 550 0 R ] >> endobj 555 0 obj << /Length 556 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mN2uao0(8#HB!"Z .j'Ș8:&i]}ǚ.N%R Nѫo*>V9|b$,V{; *ʳklZ-rv{x $!fjS24MȌZ<_spwo[8 endstream endobj 556 0 obj 176 endobj 553 0 obj << /Type /XObject /Subtype /Image /Name /im99 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 554 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 554 0 obj 734 endobj 557 0 obj << /Length 558 0 R /Filter /FlateDecode >> stream HeRn@ WmJ#B" RԄ6rB‪z0"E~E|~VH=*aw'RKތ9d3O[ݐ͵mne;vȎNSB_K֡|޳I(?x/ upC뚜cx޿10Z%\;T}Sbc XYd-?Ks#HÂ)P\A1/ҰY+rM~I#l.U_{r˿Ȯ2$Y K=Ͱ-t3Ϋ@ +A r^e.yye9= 䙚dl$0Yְ?Y5֪vFU^.G+ƗvhSggmV1F\TjqϦp+/ƍ[dnifO endstream endobj 558 0 obj 479 endobj 559 0 obj << /Type /XObject /Subtype /Image /Name /im100 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 560 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 560 0 obj 734 endobj 561 0 obj << /Length 562 0 R /Filter /FlateDecode >> stream HVێ6m^$Q*ЇmM۸˾peV")𢋝,4Y'Μ9sF0HY) N ;.ei9 ,1VmdG9uK iF{+;y#Ge^Æ6#1;~C_C̗p`l>I[RG]:GЂ%1BpR\  HOuAUc4ߏvAO/d±0c4"|c pX^A^w,رʓcyH`]U$}4,.' 54$Ydn<),~ <[5&+~HDГS,qQMIӏиYUE~'cR9~}D[Y O6ժU/A$gQՄ\jѭ"W#~A8Z ?e@.u!\&qT0mX@Il鍲x4u,l z AFں4`t]jp#w~p=@TJI1O1Mբ+(*?| ND^^}k_o"^ !ШRC2A:tm|?FlȻ .˲lX[>[+y1^uuAWZy\5ihJc!j&xEM]JGRv?O#@}rq\B>wk(Xn5LHįV`㋎1, }q'm6ceޢk%DAv{jl>H$%њY(o}Fjs+H}qlokJboIvjܶѢճ2x6^ {gf"|LeEDv6;;*ɁW}j<ޡ*xSW(Ui:PY5:ud *ynOR;hFyq_b endstream endobj 562 0 obj 1143 endobj 552 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 508 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im99 553 0 R /im100 559 0 R >> /ProcSet 2 0 R >> /Contents [ 555 0 R 557 0 R 561 0 R ] >> endobj 566 0 obj << /Length 567 0 R /Filter /FlateDecode >> stream H]j1 D0ȶd5l{!-)} R$^]"a=P4[_nc$ڝ޷"%#UQj]`x,C }LZ6|;}]GD昔|x(rFI@)! fb=/Ogb79 endstream endobj 567 0 obj 179 endobj 564 0 obj << /Type /XObject /Subtype /Image /Name /im101 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 565 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 565 0 obj 734 endobj 568 0 obj << /Length 569 0 R /Filter /FlateDecode >> stream H]kAߺz/BnMnH-C"EJ=GB#&/޼NK"#Dʚq~[fǛ42V{Sw8< I`4q#/ISoyEp'G^~_{J%|ԵjxBOH'/ [厬 z!b; | ?Cw8> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 571 0 obj 734 endobj 572 0 obj << /Length 573 0 R /Filter /FlateDecode >> stream HU_o0!5c;txYjB|w8ɒKcwO[@P*:X8FB)[N/HĶddϙB{['Ђ8`'%{ rB*F/Ңzs2=d@=fڣE6BCYŘޖ&_Yx ă0 Zƈwn0.G54ަYGN4M^-UQ0yiPidmJ6]6@tH[4rgEF-sE?Co0eNRhƤ9J麮/Š8xRhU'sG=sFE]-[X[U8;bq\OFu954$ )ŽX7(cEU:3yUN#yӷOIǧ%8bvPHaUe;ߙcVlc#~PgQSݻӴCOS\s†xtOT,)w4w~5)gSSY{2-Z핁b?-B֛p|_lLia9/|f냡 >kn 7BH^֞ΆQrdqb#!`N^n\=9phnvy1uj'ϦJM)C0y <Sifvig=++]/!e;7[ endstream endobj 573 0 obj 779 endobj 563 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 508 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im101 564 0 R /im102 570 0 R >> /ProcSet 2 0 R >> /Contents [ 566 0 R 568 0 R 572 0 R ] >> endobj 578 0 obj << /Length 579 0 R /Filter /FlateDecode >> stream H]N0 D 0G8Ԍi• P+zA$]i-{$YOh]"a(LAIŭ-qǺI}A9‹P9#Tcnr',GԯaPk|}}CAɻ)ǿy:> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 577 0 obj 734 endobj 580 0 obj << /Length 581 0 R /Filter /FlateDecode >> stream He1k1!Ski rvzkCPL Eù d';nȚ %tROρ OCF2rζ:ݭ툍OE4|ˢ. 6 #kc'FÃ#| lPsG^j=3 ;``=k^B{WrMwdY6xk}!O%a=-5hl| aKNpRޢ YXT& 7HKe>{b=ED/\&$uKgxs]rR1MoT*Fx% p㽹%$e Q rܻ$2kzY7{miŪµQZQ% eTmnCfW&%ֳ\qJ676н{'D>7MQ_ꇏ@jiONۭ~2 endstream endobj 581 0 obj 477 endobj 582 0 obj << /Type /XObject /Subtype /Image /Name /im104 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 583 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 583 0 obj 734 endobj 584 0 obj << /Length 585 0 R /Filter /FlateDecode >> stream HWۮ[~l D!澰oi(Pi =/}F}-8#mIkf-??<۵eQݾ;7uWmS5u_oE!w}Pi}:/~ٵ]MULQ`,MSΌuەwoY^{ux k]q /-+ Z9zݿ^߿,?}qw?\7= S OφEmPweUTW?ᇷŮq/ݏJ20Oetᧇ\;$G8NIk*GºG%=|SIb>ky#9aU/\ΔɁ`_sFQ@fC!P:bXNNf lnyT-ՐV6hdM2ok2k_sf]g2[y_W9jb%~]usOh707WȰs9$(N6o e2 t M2cJ{X3ʊtW$.ݒFZdT&s0GG@dWy); p54BƓV@cD *a QPq]r"x؜M911H: HA我(\S+50t"O cg:$7ZГ!Bn( 9$!IlGz0!jZC-m&g<`DGHˏFN”Ɠn&`bCHHtdt 4O>0b%XZɌQk9=8*Fb bPIhݘ09"NH1r%̶<|(q%uM f$1̊txЭ! g(h PNJ͔ Zb({!]μ6`u ã i ȓaf. ɱ2d)9 "YCr_)]H اtt"3f$2ȁ\׵) *%LΜ;`j'ȡkc+$~ MgJπd٦ŠۚnJ[E* AVP0gZ@(`īyP\ʡC DNӒcl@ 02Ԥn'vlK QA mÁLgvD\S+߲:&H t\_;jvQ)rJu>&IMb]tdm-em+ )YI#zxk9IcD$EyP IEm w8Fl+q8. ܯ=@\WdȔ83=H8%_@ Dw")S4ˆu _#X?!15GLaI' ڨ|?<E+@>D?@SIwUzcWՓu, gvSX:Tu㗌"S19VFb{[ٓ0#IdpR!֧ @tW@Q(HZ# fH r6wX‘kslצ*'Kfů' ')W(k@n b džNwlG|Ii!ɣrIEda #EM0Ͽ%V* dB)yW/z Z A" ]yKX"(5\+[=S6-m⹓c%b&=Ty3yaM5$)1_IN0/@d^0#FDjl^M疧h9*S-R3d PPM [Tty@( IQq&:"~@:x$A+@sD30ՠR@"d d$$P䒊?tԆ>#H!HA@#aJJdƠW# *lm&`#n\tX^]tXzDPP Ɗj AI-@i4450wc@(kLRe9( 4()$r3((7lͥC1UH.R7bQ "%~]1+VE/*j̲h̙ OwGi2YΤʉҥ!)gϩRP.(*P@ nʀPZI\]O$UǷz3 9$a7:y27F"1V$$)zRK7u nC  iFmC׵oO4,1ĵN'f&:_2CAA I W Hu8ci3F\AysROyS,ȕI.ֺ$4I[T#I1jW gH n&1r֒2z /ZZ2x5)J\_8jh <"t|(ISdɕ-\YQ)#OaH` V.:k΃Nˉ 92ҋ^BAǪ2X LĢY35><p9 pWW?½sFECFEP H tq(cƒYtCM*:a.Lp˜Ԑ.Dqe"6ʈ2}2҃D p"e"uR];بN?= dkǪhV9?a tε_DMn 89#*p@ʧB\q*n9L=dWWaO\)M=%J (>L!KA.g`"`]r}36r웁wΘt)=Jp "Ȇ "AQ (Cg" *]G\SI.FGf%D23_<ڎo @šeCX` ٖʨ1''dba 7ZO|FyƵ:#e |=g"bה:wWD=+1ߟNK r bφGDb3rACO0 alJx=|{~ ]^8KI^}9D8Dya+ٮLIu*:ANQhk(>?CO"&3Hj̯ȿb c U"g`:'LbljZ~MxBWD$BH*G 2* КBt!(S;qv%q4 e,2*QWE,!;_@24`v~TT`&bl0BZSfMFzLv߼j(ӤGkomW=ޱGީy'>N&0]fŏDz\Kf:A VRy~Z1 '2Uj eT%D!-J]Y$#" {Mz)l/>, 6 2.2)oH6v{\͑{YoxHN\pgsPލӡ9 kG~]S`1",aT"= T fG)E703y0Ɉ{0i1oy 3r>+.YÒ:ɔV^Ð{ A-^+#[2J|i^TtL*w6n4['`?8?:eb+/Lʘ}2HNUUsU,.vl>lݑ}\a&*!(x%H"*Bg D쯄# Od&21 ޮPsmP\] Y;j^;TZYo"8[FEPEN` "Ɯ<  C}$h ]N0CB-.H dCt00c$^S<_&E%N @$yDI 1 3)7'Rh`xx(ɑj8;u|.D%)/#Pʨu/ ʘjяG ItH)Q;b韀/V-?R^GED".kPo&@.֬Ӄ-@y[21P.QFEHYQ rbvaɆEʘjbHjv#1v2 Xk^@I]4L>8gi^p2~k! §r0"OJ 7J@ @XGUp&zHep{;J\ҡLh딩"EX "(ḋR>LG0ݮۍO FH/WdYIz*c.-gf$93\~ ڹUa#M`Sa<7~͗M.0ATqM Js#ꃵu=D uQ]Sa@S2v>14X?ʨ G) =0HS\^2eTd~!5'+UXM$X`"+6Ml <-צ'W1V %6:-0Xz"WJ.!9sKu\_x(NXC\'i_8&py{XG$P~"*"^[]˗p-y{d*»ȩHg'B@`!M#܋Zƃ8ji7=T˗8N+tcQaN2B|2o{0'"XN&>M_IC ҦS;z<;]o2\ F߿wV"`'|SA#ýCSD%P" :i1c@2==˔X'َE%Kmc6n GNdATPFEȎD%PMӏ~D>cчD*3'"489%ȭޙ< l{YB% H 8F8G5zh Q r"YFDk09eԃQ*s+"HG Q( x'NZhG㡼^?.uV 3J%ĮmRùYS"?%}d`WsC_iIN P2c<i;:^1z|| ]$Q CaSM؝XD i'#D72@]W&66`Q ky|(D+Z=ȗ]k!`IGTk'laW>5o5vz~C""Az0H߉@[I2 x0z@w?nPFEPc۩)KeTF]N<ʘ Bi]s T{XIwzID$ZT4S7[Xջk41w 7'Ξ_ax1`.b]Œ)2JZGqt`ț!o:RFEȬ%.2$uj&JTeE_1.8>.J*1݉5WoSlVG'l{f.Cm_vhGUF=*ڙ~ I CgTF{$nADSA;;M$ %'FC &bD2|\Nj a%<~x)LS棝2"AYU.bI 7,252BF!<tţ A%&> Ǹ@UQ.2J0h(sٌKA6~ܾ`VBEACJ3 ,X$^-.#0A83p"(ʌVK>,#L| '͉!Wez()F<BkYBV?Q甦m(L=NaH;U#xCbLKE\D>V]5֣7JHl?Ё9#)d ʂX ^1;uCu_Oq"0Jʺ?kpVﮕ;Fl87`+f,"8,R ` &a\LPKa>  O|J̀QF』GuhjDv"Elr"@DZ26@=F/pSx;^M5@5,SM=j^<̌wB@k/;{D.CF_ܢ耭Oǁю32v9tfZRQ|X*8h*A6 e jA'"(H+ѝndT^F "S>>o0>kyLErlvkG];+~G-hCw\,P*)* LaT'` Q4)Uɴ$ke"j9? J3<S "r)ׅ#./ r }Sx,; ("B-P1ꃴbŨ+cHX2Dl$%V1#O$bTdDqDU$p['N 25UхeF'C!eRߓ#a`h0R!L IQv a`(:413II||,1s@uQfykLX3bAD;¨4j( 4wgyjїg N %AD- A%aZ9WfFvp]QBptLȺFex>?8yNH ">и\m. q/Hb "ө351W 8q?ѕόܒOSlU\ ݑ?oH f>lfz&с/_@vB߯0K]3н2 OleYm{LWJw;Wh;s{_+@s32eWUtz. Ĝ{G lO2bK(T4"We'!Hd.nd|Kc>jAaL4SƉnJ4?wMn;"+ x2Ig'd3۴s{Ƹ"(`;'v̇%'3K fVIOAD~<q&/o* ċ5ϷXl_t 3F$:2QR_R@󥵎T]ؽ/;SY_,''~Vä@ 'L`OA7a>"\akv6^To%lIwiM>,"*n=$F GxUD$@$B8F AE*g! rpC{YeBxJ0R(@A]R#tje̹ D]$ΕQk0ްc` n" .^c &Yʫx1sDsF.q*c5w>! "EDq "zEM*B\g&R9@ ot`tK Yu98sG1W6hQ.2NZ[ۨ=A.uaF*X`\ljbmzϟX{± "\bjf v™2_x"a]qs;ƸNHN1KD.~ ӁLm],%' 溠OAN]$NX3B.` cA!k2m\CڨrFkw칪xgхɍ޵dhمD<,2n'1BOa6?֦vƜp6o.L݁̐~\/,xZ!$^Ԟ q6 {gSXqVs,`pq6+/PeT!G?"UǴZ٣ه%WuzhVA:-] f"%>@EJ"t D%+{0͍f%,@Db!=&HfHaaxu jKq!/3 4eO6a`hJQP GQ#m5>vƜ 'ɞS#bԔ1hi>"#MX:Ɯ7:O4i3i3>7X\ t"$Jȯ~ YăOjxJrzu]ĐVcʘ}XAfA> ";cL~i\T$р NE 8hqRuQ}z@:kqfYׂxqZ<pŝ=m|G^ˉV, "D}d,HN2|$v2v'$E8i.p E#v-kͺ;.I9nՁ8ֆe-6˿'igFE an,2#*yeTd8+cȦMsaཞ[A"F(>Q ҂1KFnL/1H\bmf Oώ xCg iǺd@MDWƤ5NΫAf/, FEP!3KVaN%.2-#v ᄓ86Cw&( x%@' K%:Jܤ' =duPX]Gݸ6jq_\fqe5xS5~YO<:Qf'^ ؝TJKm ~DYʛ3loUjc1n^8 AC;".P9fM݂xFsGPo(ӧHEW2*R`rD}1Tup(;cn/8(Y0)!An--HH;}f F.Q Rт1 Y0*BZ0挀bVZ7bH/ >.|+!>%^aAnʂ2=/ sDx#t<@A!D!H;Rg-qz^P*aL|0x7VxbQ~<1ʏ(?.,3v' x^ 4)cn0CEL" IT! iWFݴv ;ic_p-H޾ve< k?~pLЁ "A=LxCC_=ø6jRFEP_)"(!S=Vv8s(cwmbU$,Tav$&Ѱ6sO)v.덫7E~~@CFEaTm|aH gg9I!pvƜ%'VI`0/Dzb[ $b"BM>KF`R"l[~H@2XM+L #Ζ VgK%޳]mR\t:%ʡ(QͭV% aF?u'~D.n+ ^~D&B) t- 5 N *,A:+fpn# `,ϗ w^lNdIDz)pUWF~,v#Yyڕbn*V#篱X_"ºKj |_?H;,3/TY,ZD#Jě L#=UD8pƩHD7Tlf)D'vE7ޛ&j6knzc7޸IL\ ΧSATUN2**Y݅KmI32B¡쌹C-o>ȍ|_DCa.υ4 N Z C=a@7 "n@A^m#QFE)hQ*lltg jTeTH}X@%,X2'u=1Էc:!2"'VAT2`R47b^k؝N_q";NaLi,*8hQ_99{j-crS<2J+)Ǻ+O8<ϔ \jDnUQv9c'捸}3<̯Yx8hַdx@Q'dF*\OϝHۦI] BpM5ԼrbQ6*R|/E_nn)vaF]{hBC2*l=E"kF>PU5%4*"젪{N֛ymfwy+GsRɛ#`? F( FE-ȭ2ҏH"!QcHc])c#m7]Mue6mM1Wf{ a;a0>'lCxv ^ 2̈́AIDbM -M 5=u!6QdD!A>Ŭ x =:!EFe1Vő v 8PFEP8|EVA>,f%#h e87JI2_ر ߹bjV(c (eE"+c=Vwh/BֈP9DZ<y@ qZtI$>@fL&N>dM @3Vʨt*cD%^^S.b(IdvX'vp3L"(@Ɓ4މKCdDO;yf:9 X}~-D@,a/B,"d<3 YH\  5%c﹊Qɜ>P{.͠եRs8̂}D"=LVpkόe}lݧp& | [d0TbGBhE\{gni;JLË,(76mu?jQfLR{3 vN䓑?t+3.! V `˯CZqаm{퍷KyUgh}֟.qL)F'UaAFAU@5?(GD L<0vrF؎|!dDe}H$GHpvH:8$=;q2|?u4f:3p ĵ }EP$5F;Db+ҝ0T\S ftHlهEHB\TD$34 !X*8{&qGɎݹNXj/RQ.Um< ҙN]8/sSDmft`GP33E.իcoxNs0~/B" ɼAD$I#3pr]M?d("(eTUKF Sg؝Sqү. 6 *QFE؊)ьQp@$!*Yʌ)biqGh|\HcmO c2hnę0E?w%r{ĆAL2=YCuq;>Pc*N:A͡:xwL_ʬ0앙gcb { ;9ⁱ-cp"2\6E !a)) ӂsF̷H )D&qz d!% !DG  " ]0M:=|LtCܫJ]lV9(\ʇEdGg|wia:fLcQfo>og=_{op"Y=hp tBWcr;G|{#ܭ8=ΨvUѹ9't?ν ` >,04H=bH( T!qǠI B "cwEP݉댼kmt 1v[?Q|1K ;QVYaT)X3'ke591dd/w;Od > ڎ%cq2JF.qZ}ќnUB7f^M.pXSB2*VU}7V]q]Z?x(",\aXVvq͟ۉ)<s:.>S Re߀q$ɾN=3a OɃ/^wc7ng;YIWE*D$@wWHUB@*D$~H%y0H|2alLR™d_ox~ P0Iʨs59%Q :oч%?x=du^ ?g,+?}˫ .Ut/_hїJwj̀Y3{{@D%X턹. kRaH"v3朄)pvƺsL1@]Au9=E&SG sک5Y14O(@2fhZQƞq#w{tPG۲I&z\Ly9\x3anuo-?hdz)<naoNA5sxU(SD4cQ'$[31$t2*Bf]ګʘC%/ %G ?8:2Zd0jWɩ+mSbPcS`V%y)"aMB,|؋Ͱʘ19GKͫb~qxF!@XV?S ǃ=tR (ct`wG4AL}0uI_ a}I`RApҰae:9 {U1*L($nj^|bT$HwZ#Θ}YD%^SD4Q/ĚRr(g`ZyVwL5ks# "A")Ì=̵KA(Cv;- xkpFaAУNAE)Hӌ9kqᐥzcv(;u 7Ƽ[;8oy{cӉEĒXK> Xzuk[Jm.vc\\i!֪ ݫa;8CѮ|W,evrD4SOb}#OG>jX|#[H_8 dCiB8F qf"]Ŕa=vY%'._ڙ&2Wipܮ FU⺍;ݹѕ~<)`ߘ˔)"BuЌ&6aw "`Mю+q`s2,yۗ݅APGLYHx% K Wd 0V=ȨVę-~:a=%HR*20F@ ه*2OeF,} # cn'?) #Pg4)" 0eiSN[0 _D*)ֿ/b he$p%7Wow"}P6csJ9w/>1J]ȫLnPȍ򡌊_Aw2#f2vKZG%# r] b;qec:ߕ䔀-*H$. BH& F^VGM)8O3,l] ÆBW @:C퍡qkƍ8s" ܊TaU<,i  }QQ1os帏e$%UIR:; !iT5!kWhkwڴ>9%ȆD\ !fƁB>ٺ([Ko7dNX=W{kQ 8E;*F}DT:h0;b멊1c ԊSsR?.Z|X22Fez@sx=zݪڧܑ'R0 \]zdQ/y<ٵAzڝE#G{KԽ0c&_LO¨v cF?'8!~+92 ^QpY' e;1KD@XQja188\~DQ"bS5X ֝0x4>;չrW3[]0*lg|U8"h?,1Ny >93sZɃBN ^ r lB 1FG!a(]1.UAltY=NZϵ\91Y{k<4zHV]pYLܵylx%жk YaЎNQ¡0_D",<;c.gvhb? KjF=!1$gr+<}qVNx]raO8?dXO hVFEP9QMeTlSA,1:"b96XB]H!0H*Z1*B#"߿ Y1*BbTlzEeq|Xkf|<*"F!cHr19 @Y!4A;l*2!}1ɳbT f e {L{0CeFI(;c6Y *J|^80v|\,,GnŔsO13e f qcS0r)_  t2)H 2!#z]n|D%P9n%HXj@ݮLS85&2On/],l*jatD[+i]k_ݲV[ڝxG7șS1`ȎT!=L=b3D+fLt~(cw!eLEATb}ILӺ#v؅s_f9W'`3Q$>$am!*[¯ߏ Xٖvd{#z@PFE)AT tZ| ?Ϣ6Y7G+F/88]q're^6jE&OB/H~d0>$LƆ=ly| r>em(8(AN` Q7,r0*z[kF`g)"_"U8Ih%kwI#{8e߻ʅޏ'0D^~k_TAa'DÒqD iCb&T؝oHi UZ㔘xI-Z_MD}. znf$F8G{}R pI =p~\8qA.x]m]qw7}r Ƚ0E_ P i :_ #x؝t'"ah-J%ŝV1v4("$#8LTXeC =s."`aH!#$1+B:7ES,Un#qEN٥Qw)sng.Zu{g7F>-taaΫÅQ%v cIo8`//U (F7vH }1qOOhPS6o()H  </D$D$з@g!١(iI*SriOt҅=0^Wƾ2L\p bXH]Bj%[@%vD]n ;A eN6>%[3%'̧ȂB8P5yG t uqKh{ iy!zׇؼĆ2*rQ%AA"XrZz@ˁ2f'ƚD,sj ;s*"cTF1t*cy9E2nv)L^⃆!ѿG褂H  _ IM"^c$b螊1*qm"$A X>H!P$FhثbOte 'u;c CΦE;cwmܬZ6 ҾBz "+X LAD"bf?YgC7op{Cw ; +TjW(:ʨ)Hj6oWeT|80#ŇA~3Co" 'p@wzͣ'w̯A x /B8|3:zG B;tAyK&p#tI,/qK-|']tya[Unyɡ̈XDFI2˘Yʊ!eNj~CaOD|tHjBֻf36jZu5ȓ)8]VZ ̮^_ksj[u{b?meTN!O:ATR"ʨԖXs0jaq'kFEL%,3S3#&gB>RxZTĩ#B>0 V >gx_ZV ^霯eW!E" UO >nc}#4q;Jґ0-{y-bS΍ l*5Jd..к#WB_#SAs]4w >>ȩKnTxC\+F+UG;Ol.Q Vv`Q;>PGW!v1b6vm/7^&W "AJQo.KzKyi"D\P NÝkU~4^ʨD@("܊DLc KA-2o (Jf4ATCA;2f'^(#5W]lbo,T*cwb)CoFi(>DV'fL -O vY"-8:lue!PHtu?l/<>Q^D%P=vv&3@BPFEȐ ba)(ybG 1OiMfG}H |i!Z1*fD e{2K:XFm'yGd"9%RHT@.VROA.k|8UBp:(ׅArN|!%݇EM2PRkEml18:ٝz' D'u؝{O]~e+W_R,{֋;}ODHK|l ? @-+ѝcT W !+׃WK i("[(SD+F'k\_T> x(cɟ"}WQ6r!Y:0=|e:cg B@7ŎDڕ3XEG;s;;!D&C^`cOf'tdPovP("D$p `AbJDw1o7h"'ph8# |~*?7U߇ K*o&b(+<'8|cD$HMs,/$3뤌 B))*SDeI&J=NA󪌹 bb)b1Q_qj֬6+%3][d 1<0 CcH^9bTb">}Q^ԅX`ߣ67L%vZE*yz"dFATpNX$Ctr~^릭WfM8b)B< AiX\a*s",it zaY= !'F=@1+"d,f687۠3*lnpq; qfre(c@724,ĒLH*Onde̻^iWu'cGD@6 ҖBx=}BS~q&B o%4Y'3a&Xw&^I8q2}L7W3]k+gg۸u ( ׼?V,r0uYi_sE,X||Ko 3վiWdyV$}US"H%D\fk%7PB2];Vpqznۤ1F%H Ϛ@EP_QRA|$F))$ buE]$ܓ(Zs_Xs<XeD~{eLgVEpʺ|. [,D_I4x]*S vncH{F阊ł%PCclUW Fѕ}o9B &ʨgϢN~飼P*JuIR %#1̂t)#鸒7JZ0_UQ&"Zd[fݓV,u6ޔf\ liƸ^~ tbWe޸T^V'Sĵ~s'(>=ͫW9^|Z aTG'l$0v' vjTeTlA}a"ZAFF0Clܜ`#,ƨxsgƝMirY1a1$n2F >kO VvZ\~ J4h i!>vŹ|I0~<h+cʘ32fc̃maH:4M6~kLS9g0ѶיYW?-GpTُ'`m/ ASq{hQD} /Ko0ɇ?,#Gd>Q.r2M%ԯñ8E 9 `@.*A9l&I"fZNis27.ڙσ'dK2"U&`7~&D]T'X_6#fe1"a P8v*cwҏ:m"5 T_A. t w\_TbE.Fha4xSbؽX/ Z (8|<>?3MT5o<07 1DTEakݴʨvWwFȫWu7?E=2{Uw]K$ҒB*!J I4'K#=H8 $'CP%q(SE AynXWe>XH[8 ҟewRGL*<kzpe}̝ӷ؍ϣx%.D$H**!cڅ98h#衠aW_1d(?Ӂ9oyCP8!㣂AW2`zG/EG2`e_V(@še9qs؝8[;![_t+c&M@6\' @О]]_ !Ѽ7bB8LL]%^(@šWדP@z)FhUʘixF/@\>|%M;gP|_`QI+Pp"獑7ݔ64t=9Ҷ]D~V xRD$1Q C%P #JCOQ_9!G` ET"B(ca@%QP h)cOE~ܭWu.ݮ1$#k!<_\+]|lagޔƵϴN,0*l",TfE*HEEXDMN{"ҜPKjqKFDn~i5AO],"xVǴ-d0(@זUz.h@Y|T{oț7?ox#~32*lǾϰ|tm(c/ʼnE$I{C3!1@n'yXH KADB2졏T\4g|C"!3102tu|?F>I PFϛgtz4Kn\\7ۖ XӸ2*2TD%X"Sh^L},9LF!ᄮ:A2۰wܤ/|#ҔX'HN9="^ 2+]./)x7"Jøq02ZđL$eU2p7gHۙ߸hgFb}P?bP¨Լ`Vƞ@YQkoX°`70`f̼ _GOݔؓJ\+G } AY%!C h*WY$?o:eP@.!Aʨ:&;GˮiCQD f k"1D,2`bẬd0HoGt MAa4 O0T!t] }|`y7F{eh0 b|1%eeM֏ 6*?pCnLY#>Q|<{'jq;%酒Ug7ٙOhqP @e顇<|%ě:횺<%3j`s"U$6v0} Gseݳa"lF2h]~cmtz E|H[ _tN+yS٬|0F~<W,[ez**9H?iݮ) eTP؃A]rW> b"=TNʘ;5q|=IEV6EtD7iq5gf[ԍ8Q>& n eȧvD J,E.^x*c.}Lo Fw0*¶eӝHi eS봛Z޴S2v'==# R$deNBs>0,>Dfɬa7GD/㍙` oǝz#~l|r? ؙ~Dz};l SEbH81g$q̅Ee\>  "B$4f+h_}_cX+Z-W=Mݸ)M' ~2vC0CKZ-Nzi4vm-`b0~[`q;!'gA- j!&0\6ݰL) Yq+JAԇ IeTD%VFEPMSWsmw;ge <\>"fe̍f)o/7Ӗ끑^؝XDHm1K#Q2Xsk~UcTKFZ|D<_P>qJđ<*CD=%HgV㣪ܛaoF~d-S>Qʨ)2D,ezAJу?Omi]ld QM 8iI|Mekƛ׸6. ~fg!󅞗(Ё !AIGDקzT\ p޹ETz@Ƿ %\t`NVFEIv_}!AA>4h*cχII kYLcțZ\{em46r2-wպ1e6N6|ZBqHmEs&ȱWʉKLj0L3Z9ylèa;%,#DsZ->zi3K0S=cdc>~/+stC)uS]$~Ԭ7è^X#B ౞TFmwS.)Ɯ7Zo\e<aT"*v0V1@`N"+cE5Yso$,m0vqwe"$#̃w2ّ;802)Q\_s  gA^?Z*jլI6b _"ǂH2tJWF?E]U_<=`cMJ$؝J%pK&[8rg:_U*jk}Ղ&=c|W<1#s%gudiSdHP6$x'UW@iHu. jVĀpZH V\A !fD,$FvLl+;ph5;sX竸\7\ܿ#Ԯx]E\'D*8qFYt )QIm?/üu'@9u)E,P=օ@ QXg,QD"$y÷z;3R@%BdL"$+c#A :G[D@d'ԥHu3 *Q"SlƠ\)¤}$ZR, {AȝT>fdY}栧^~{){QD b暰:0B8pnvwSM|z1##b9ί=?|R5 #1^̜;# )Ç3k$'Srk$ TBq i=Nu5 ~Z,3 aE** A ߑE4 2:褮2&+HgLȠurA&@⣞H0" b8 u)"#xF'"g) r 0q N<Ԑg3/"\ADSRK!  5pt@u2Z-<$6 "΅:j6A+aûWl6}C5A~Z ۉ`8f`.nDn ƚ/ycݺK?E3i?ܘ_]c嗛;?6?nn_Es͸:]8fl!̼x۷˚K8ano:;,<YhG?CxXG0G7q{gηnJWLƸ.0"66u[L/]``["16Y1k:K_$Ko;N6jӚ.'5z,5!CsS^uը-M7y1kx?5Xu7t"z?7$? y?,BozxxӨ.btcZ4ZwC# endstream endobj 585 0 obj 30779 endobj 574 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 575 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F4 586 0 R /F5 588 0 R >> /XObject << /im103 576 0 R /im104 582 0 R >> /ProcSet 2 0 R >> /Contents [ 578 0 R 580 0 R 584 0 R ] >> endobj 593 0 obj << /Length 594 0 R /Filter /FlateDecode >> stream H]j1 D0ȶkCK[RHKs)ػBfB[]?ue@a J*nm&6/b@ޣ_skNYh;ԯaPkixBAɻ)tۨ} trҭ`"K|Qp9 endstream endobj 594 0 obj 179 endobj 591 0 obj << /Type /XObject /Subtype /Image /Name /im105 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 592 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 592 0 obj 734 endobj 595 0 obj << /Length 596 0 R /Filter /FlateDecode >> stream H]RkA~QZ-B &PFjn-*9)=P\=,c/\%4l3Ώl J>Py iK;ۆu.nm􂒃  $88>m!o) _ҠdЧ` hվc ?G7n_*wnQ'T:zFq͏cQ?x(c/6dk{Qfm2p1SA ]^~*WS"\BMϲ"PQLȯs1l=:ψgRͤ& F}%$^l ̞ 8+Z-+Mk&W]Fa> V{:b1K+f~MAbe*~қ-xCe"e0s6D+;e<,]Cl7Vߓ[ endstream endobj 596 0 obj 478 endobj 597 0 obj << /Type /XObject /Subtype /Image /Name /im106 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 598 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 598 0 obj 734 endobj 599 0 obj << /Length 600 0 R /Filter /FlateDecode >> stream HW]#1 `|0oN` y-%C G3Ejw nqF*VW7瀞?maӷU1M*i׵P򛺲ƎtԾϷlwq럷w~}כƏ|~\SY֘=c[ݾݾwcxU]o\wմ-2⯫nxhm ~zVxw~޾q⪫vmjV78yhf umGaε瀞i7 Z7=a7?Yqm@DSUv.b֩֏!^7zt*CN0ag]LJX14J߷ZWBU ʝUvƩlrڋ]D[q~2b$;ҹ7d;2'VMȺ_(}cAk]l(;.z%7w˦ݿv~gفwp wݴβ5ޘI\4::}\/ N]}})@5Z /,O ^SW~yf7뇭}hk zIml|X3yi>ƨdZ!OH#}*Xdo|*43oXiu=2p$1?N]dbtB\wMB9ƿ&?NE;J><ɢGjh/\1?es{& {ZyBgPaSW^Nnse;crG>Uځ|,#ڗ s>Z)BqĄ!Bp0qVx8jh(LUe 0(- Sa7#qu(%nP<}JOJD$?3PP=1ra zmy4m3Gd>r`{l(>j'#WOoTr-9sBĖ0|`4@H` D uD_:"0THQJ(蠪1@B]"fFTg K bĈ’,oClRQX2p+!d $W 9=m:u_{!+)#֑OAZA&X"+4/9B~8ci#| *&`dՈ;cjuԪ$aqĨA1%#QJ(P1j%aqf$~(H~ed4L.=JHcTksB4&жz~3TW[ZڙgyfTť}ϑ~D9 K:*IjN'wL^WJ#[qr%:$Y: `ݛ]g ]}:t$ *3B𖯍h u GZ#1ag? ɂj؞7D /W:WCT盶KFQ1vfጡoHuP6$s. "`: E: , ?V)l%`.SB5M1APchAQFj# *aZb)B PFūf#;pʂ:?Nu[^M_'Qoy_ojѾ<];gVPFSci:$w-+ ״_+cQ9cbk҉-|)A *ar$cI ݠnAxm0PP1%Z* 28C+?S0utxt왳- E\gwֳW6fy `gƝN EQpV;B#`1(J34En?C';VVTCg ^z:R%"F1\Orc7bLM̘'=О<z<rWGIg飒pQO7\d:7P4y-lPYIH ?cGVh:|t\ W+")0 sU^& 1@D>}" Z\#FP&RRJf-#f5 i+@65emޱwL3@;s]" 8ϴ\4IH4 {' H!꼐]0P3=B~|^'f̉0:G,?E2IZHy7ZE81#J"!)TE0ԁ ah"'7Q3nX (~LL`CߤgM}#Xݑ;YX>T>y D$QpŐő>ȃZ`0R:KQRgjdL$g Z #'y J)Ɋ$ov.Б)0{[_̭[_i܉Eq9!VNَ)37(!:i{'G '"u:\-WFRJIHMs BժБ\X!p63&1r%i #aj %꠶?be#RJrs(< 7 `Y*LUߵE\r=iMխ6WE~`K.={bAVnzPp=3Ĩ!`J1l\u@VwpWC_A$##!S5՚#?d;µ#\|"DbIXY1/emT\{L"g s6jթFl.|Yןma3!J$$TA#.ɥ@J"pD@Qvdu##W{GC0b#V!`6@ԶCLy(JPJJ)Rbt pJ罶NN\8)!cLCWA$[YƏA .t>/奕;M_az yFHd GSLTA1;Ï~z? jCaiT 5t)rrl?Sg8WhdMv!j[k3{֝83W 8T gЈ_3"VJ>:#r\:US- 1rSJ~ mn|08"pfP+(T}D Q MDF rD_s 5`ƾSg HΕY۳q(nfנּfVjuY[w&I?PF$d$3T p# +T^Xj@GJ,-> v@uPg (,;PP} ZWC! i(j6BFÇ$ff#VX\coX.a V6ZŮJ0%#oS$g: r~*Rp#/Q ȡzݒ;1*g;|RYIE,RFоd‰Y y G]$4$&'Y'H;! a)nAB!>v ^1py I ]a~+'тm6:@ 7?etHmc" EvM;Z#9u}laP1bNƞ j潰W ^o -; Q,CN=A&@.ȉWj۰aݰw>38: :I.v@w}WwMXn2"^ rc).X5oi o1;awXŸ8:"κ d1^vx c^^vq6O}jAIqަ QnZFiM p57'pf턙(s54JLs{mt?;s4eW~aRFEP̀`=|8օQ'GӉ%4(]Gt$<)`zԖ*[ EUD!@iH#OyHAV3 0kjkutz.^ݪ]ғx᫭Fz墌0 w!\` Zf}J9x)^Po$a 4;d'ضzb"cABBO2XFCzH"خ22s\ַ\1Wрs毭}XX}!ܹ *oGR[ ;3 buqʨvYEF#Is$)FitAy"@PD$FQD$Hx]t" t)u1cXx+0R'M*x]oTSuNMXMj}hGv*cwn/e [f=0eN<-@=^F GAJ1H8Gbf^`kATh|XD˜U"Q콸I߉ADb%tJ@ ݪx],_dȨT%E!:ܩ':{ xutM=k׼U;nWW T% ꃵ0*BAT"_EMİ6 KERLH_nF?9 &,q""A8)ƝzxakAץ b7t!kCmoNJ'2߇=pg?]]eS!$2B'u4Xd ;?ꐸM&\kD J@W >i"@ qXh' %xW ёDRo^LU'_YuY~rc 8>G }0EhFSs.ЋMk)t5Hb#%(>ؽ#Cd^ǁhR$)T C y  \daΙ7U ލʒDn ׯ AT3A9Vje&𡦌;Mߖێ'bHDQ_v}7G[%b(f۷ĎgB<av9HD$Э )H0ʈyHd> f/N1@qv VGb,+cn"e>Mru1b*FEC JŨCxU!-V1b,>!T1bӠb̉b{HK!hM 'q}aA #p4É8E*q"O}SD PFE=PLn1@2fh(cah2HXUw/Lʨ1;2u2d]"بā?Bȍm$,G_%>Z "$B8P8=-"݂44T(R4$'\Nv“ H`&f<' !JsD:KE:r"JoK@y|\\qq}a[Io}a\ۙs= 9t0aXvA b2}et)}lx+A N DHmQADq&oAYq'[4f %IʨZeS;a <>QT&^Fʸ|,/Q`ʨ)fiFVK;1H/^ ʘ] XpL-+ J H"7K22xeTؚʘIŹU9vҢ誐 *1`'7.r0*DY"r0|< 2*BA>ЎQ*lQ͔Q'Rƚ|)N#bx1$]6 !hI偝>pxXykĄ%D\D\l4\W#7q4,gW?EI<+.Bb̉X|X !hW;Ԝp1c"NX1E$ 3M@#c+!aQ'hόi,v"`I"HDR̥a"'NБKBDgT!DmZAЪ - $nQ/Б1EG3 dB"Ϲ?i1$eX$^=S;{Hʨ)F/`܉'_5 ymu)ׅCwvWK,x+4Jt-ZS9$f(D:PFEP%k;||\1#8OMD\Hq1c.69/2E\e #Z`eT }G Kv]*p)H`6$BrOBm"xā8saCj b@*:6nee>țM v br<8*G+#jGG$G"ʚbtAH@""D\)&!BH 3""a 6ʉ*FEA55/?8ftsRcy0n"Ay/<"!3\YWFU%7M@[`vՁޟ8g~r˒EcRJWny 'k}''8& %@߄x w" A98$P? W G;aRM=IK4 T@cz]|-(_@C2=bʘϊ?8 Uc&Jb-zbW8hpp-S6LӢ%E\^82{|#-Xp ʽ Ho. y^8q bIleL%nDՀϘ $7MxT\l]eT)b:ʨiRA>>j3~i{N/佸w!vov/h /tŖy nπx @D$+*W°t uaXpW,wf=apE[FcIHqցOsa6Q cJHK U0ޭ8$ IĐș:#uŽpѼv g0]yڳo;r]s]cMtV+T{ACD\s) Mx6iHÉ%f>H 5D8 XejιM"EO"QƜH/A2}bMRbW*+R@ |>c*wU l걚! :JM܄}AĚoB<,%nD0c9 zb *ʱ#S]+:kʘ}C >5݁ʘ|A56zҶmНAEC Pѻ$/m6\fG\kY}`t_ o\;ҽ%<+ބJ|6@M8IA38qn'A9\ j\|)c1lU>>S]H^si0PbɼEVXU+X"0!誺 GE^yF< O{~'_pQ vcn aT%*]Dz)#-մ֕+C=3M'W^ۏIK6>mwg2ViQ[=|#)2ʐwR ʘ}!ah0H/u%S/k a8h=/7Ȯ ;s!`UFEz(H>yoD%x}8yG~i#LDK|%S0v2>-s@i}+Yw˰`y|~!8#\~-a,nutVo{pm 6?xU2Q{Fh.uXuRe̙a9>kch4GyI7'kE Cx}%ވiq'cwBA:ʘ}8u%Ѻ .kqIho>?KD׎thMD93^~zPQ,zvL'˄EN#So v1֟P=NՒE$ փpw"$fe ]x"w4|GNг:Aτ2hylnzv__+b=[qN㫇b0:;[qpZݲ9.R#ۺ0*jW?T¨FPg!yoĚGf*q 8R!>$:4?s=5:EHJ|=ްl=ʘ7Ӊ\ a@Oap%p ^Xp`ȿo-rp <>> VTpaD(fK_.XW5DAv,"G/[{0b"KFEHLwQKQ'9s"KÐHf1YzGMYD,t*̟[g+ \Fin3s{.ts@\wNPǂO’oH7JVF} |C9_eev_)BD}n#%zG@W2oX q<?u^i^a Z?J teTxlP'qŷ_|}l 09*"(j IW]m ]ƻT_{<0a;A{ʸ{$x fٜ"[j̎{=;v~*K".geN,7Լq.YL,ìn9/-[Khd𹤌/^KB"Pу*Cr>yWFMiY6G<=*$Ђiq;A_[5|k7N0a''c4$yLE&y!_e?+?rp ;Q4/PǏvJJ@34h`yQób""j QPFXHa jJE% }iNbc$niҍm^u^ʸa*c/L ڛKvA(cV+cLI_fKs_4p2_N>7गM# ={ GwWۗ*u+w<:m_CYg/K}6_n'D% ".? \yX$YiH|T"#ż%H%&NNB~ rIi ![GgCc"ьAp4=8>=997|S +{rFiqcU&^Q"5`'a+0Τi*9E2~HS"b Y @R @o@ADAQ'G`(0BEyp`hyx\O{GliZ\~= \Ugy cobē`#}}5ۏ'Xl c5̴hoĉ ]8y'sJH #H\bm%X " u1:R"ЛFg<<[D>?IH ?{ Lu3v<~rv$J ^׬?4t]|K"Jߌ"Q_aǵ 'LƷfA$J"3Ta&k/4^@ו sqS{`)ML㮳8 /z:ٛȣM=(O|:n'oʨ_`"bM::g\̉3)9< bN$}(60*jh?>lEۚLJ870rץ"DҴbތ=׍޼z'F&{f)@#"Hwn&Ch, a~D {?Z++?dbqV oV81SL`-ʘ},<¨6zVMQ tu`덯'e4jChLj$!H x%xT"\#1JI` 0] xA/}gQ~5tOCn >n,TʨJS_7dQ,~sfHa)bތ3A$̩CW+ҕFMxO?~+g>?70C0zaW\ gW\CbFvA.؍!`W\[) K)e8E wLY31ڱ<2_ dC@&E^DAJr)U M Mx{(w s9:ex=PNJ`{'?lrx+`y6)|ЧӇK̿1%N`x"!ݮj$ĐpLHHa}tO*.%Am%.4P^r.H%ASX cPFE AQJq3q"vR*E1"WWL*"$A>ګ]$J1Q:fc-vf4%͜"^vW Fh,JD(#$D~(cūbh("$OAD"$e DubND}*SEE310MxIcSΘB)$(XDЄ(#"yƉ|b cvu3qL© @ݶzཽ< C(#`8eۨ K|J&e>&*Q WeTteNcMXG5aTd0*Uw1R[J޹ݟƜTŇE 2Gyd"9E[2"7.RuD*n)A>7 XAGO(v&}ADTR`*!)D}0'ʨ U6S\L<>L$JQ&ՒZg9Evb특s %x@ `S%9Ig00H aX^7QdG$,DҼb ">ryWb+iZpovleĞ3#g渱wX~v:#UQ$f"b̈ y䉋xzOvCTB U"$A.x "h,J0(a@_1MaT0n'08x"1'"E3bL ˉQ3_&ID4ʨٝƜ_nrJ%.j@ctO`.J;9ka>NcoH!. E!D5 "Tg?R$ M݇h=KGns3$P9Qt( &Ϥʨʨk>0P1gsyUƿࣗ &q-5Z1+ӣ:QfʘKe,I^5p$ dxa2ȋȂ\Z#p:pYL)5Գaj׍y΃y"vH'I6xZ,/5$D]EWUjb,KU΅^pᤎ`c~2!۪u'" H`D\;NizH'".PG".Y@Z/ޕ&<ęx&A4n|D%Vǿ@͡9t\(c^Aș`zhL#U3W0Yӗi;q!O-w0!80Y{dcevwrqE8=|شVtJC C5zh'9)BTS*2"Bn K숽.ˍ|,TP!ֺ@cTC6b1A:`&+aj{!N,UM¯c5µG㑒}OZONoAx] @HA ѕ@(}L$NTv!$ޘvNtd)"Ag~s89r; j Zt .2ynhᷪ꿵6 .wpm4 ],v,i3 @U/hB<D<-f~ ěZhN驊Ucb"P1tTr( ӧҦa. 9BcuꤳFm0;s,@}N`B DF N%%ՃCu "Ad_›> C3Q t9Ywr0ތ 8Rj)n;otvI&,r29cIp$3.X;xO5k /% "fa=H q T0" 졥Lrc[9lATesiG9!.$"v2#.G,#態 ǥUcZ֪Vz\Y̭M«?{pP՟!z?o|nHW`B,8 @p4T80DP@惥 *BAT-dAIOؓMy](2{bv1l4T\ߟ0k\kz(r VE`vdaa Z=;>8 {A(t'AکE` '7ʂ E"OX@|aa,f8ZLAa^p- 38{ed|l7F6>7naAӈ2}cM?EƝVv}+cwMe|N/Ʌ$8k\oLWﯵr'fB:42'p% \mCݒۭ[98Ԩzߘݔ<6`g>XUS¸ayA> 'ӼCmazv!xL`*FEQERR>B1HXڋ\ Ac1b1xUfhsLUgLg,˻װ:{FIC|~!#9? FDXqשּJe>țb>v(4D ie{}8E,8yADu׍22uɫuCe yw .Nuptӥh[ڵQmU :>;rtnzFV]f~]LIÈENFTc:V(ǜq mf>%اׇ%vHoH/i5Pg؊QCD@VL>u!/>E>0S>ȵ]1pI)bnu˖8C8#,̨U Ntz$y6M9GCn:(}Qf?24(oZXD Xj)!>$~M5CVAyb f# d:Uox1HcH꒠Hծx8X+TmOGf}޳6ESusZj4$,r2@3v惕EJŜ1#"w7t1-팶Yqif̺3'.r0`ՠ9^LJOb\8JZ`s0: ,X gzh쁼adkgWENUZk3j 'G/nj'$^KwJWJt\~a2_LsHkG$FR-%ʕi#h$r$ RJ{:89>)Aћ5篕k֌f~ξ+~T xv4LN;3~\킾}iC&o[n/[||B'aHhN8k(𑠌4ᔞL`xa";^*JA@Lg<|x,No#.p  =4gU׶+{OC'V{k=m|+`&H< Ck*ŠmVy 6(J uDN!D`ۗJ \.8=]NAB 0A ,npy^T4 f v_1`m/֡RC@?x b"B! 4 ~yJ41z@/J8,buߊ$ 8qvڞ=6^wFp28s6iwWBg ]A&%#%$P\B1Ha!LĪlx7D(T*  KfNfD" Lf@o7AB1 P ^> >89гKsuj,jwO&x8_Jƽk~tG ( tG+6\el( [ !.bPa*". +EDt"牦I0 7Eb8{jܘkgo8ut *b*د=y܌}xT,o>G#W}W}6*!d!%D%ND\#ةĉnJ"vq ""> o)\:he}!p1Nk%o?<`pCnT0¨j%V aT0ؠؓj8NbAG%PK  8@a8 ;HfD| 4x@sNw bHb_8_@)<27 졜MCц7>SݛnI,TRcHJ)39k0pQUƛx>v,ADjQAa|"/H@;m%y(vH駬hж#-N'eN%i?Q 0[  f.Þ wSdTA><"2S &JFDUM2e"Q!#3\. ADIX@ai\ o/ 9-P YHtp2 O eTDtJi:AYUF'{X'c1㔞ًMuL11*"6[}|XDb#'F2`JO)ke%*!`JpM-AyEb- /Fe>P: )R9oZ{0h0bDŽ%٣mTkQAQ.B2"HDC6 yb bɂp;_ 4  JTvM1z n'r+a MJfm%fyJob>H2Js&Db$Me4O|LXW 0"BHiM0fۤR8'ZaXJf{Ø32c¯EDTDၔ.RJTUay8}災Vv%& bƸvx01EHBv~`*Q1)Y^CQDA9QV*cv޳3_i5r'a3(uxG페[V@P D\".2Ǔz@A.6͞gb21z}%RbCaFQ[ʨ) *2fQ%G D24`Nc8:L)`Q$%P*/CabE`>/ R%Xe$ % <,jhD@}%Wb>ݹ_XQ2v{G(3}*c[rc M徠)O5R@UBA}P"2V*Đ K<w/d9u$n 70Jᙈ9]@}O*U4P& u+1V=)S낼8s1"l$Ksr/cuC&X],(u!ߐcg;Ne72f K]n4oQ2*BD$ص{3%X+c QєD2.vS1$P#Yl@E@Q╈&ncA 3a"՘7& bpZzeDl D/cl_ tƕn2f#ЧJ#7 ֦*;"o~e>y:u~QZ]cʸ+deZ2צ,$ )HDPF}(N v\uy]Ž2*:Uwe z|;DA2#L* ^ RF fx +T OtWxX:""h4i"1c)d:!!xÔPhAl%.eT$/`>F :1VF܊8"DVȯW='p(}/ :N\@>?/U+,ja޳ܷMeAdt $yQ0HQ2bV-0)TQe*QSF}ZeN,FfXjclP% 58|dX}MGƞ=~qtw⸹Yo]_< AQa($JIg!|D7q Ʈ$2B wC3Q dcLF%Pt*3f{3h{LA oD5u]ÜYNpIƓu!N3lX|Sd_^tNk]*~#/D@ RF8F؄#lc @ V%aT"&v@i"yX` Dhmܡ wVƔGW^!/G ~ _Ȃ+)Jgx0*9Q nXAK°1@'B0p&nQnrWFD@{(uJE&f':v1w[ic]WWFwN_py+X}ӞLѕ?=k8=U%`е!Wb00i8Zq 47a )eDT&^A. tU(>&cr ^ t\1$2v2,L֪a@v;vCkBc]<%XbC_QY2={@./> "h 'AlN+aHXzFh2a8>X+H(pHXs,FG}#≼D"NlTa GQl]`wo?R3߿+){6}N{a<yQچ "Abluj`(s`h#9i"."X]( u:>n $ʘ}$P+c1Jic3[Qm;i/ ^suR8zߟkߟ^ x̬owx5+z0wU}""'H "$F4tc+b ]_8(CzS|)=r :t]!J@10HS:{1@2f;ʼEhbQ [/l-7 ߋrhA}˜E2qʨ Q SfD}":a0ivW+{u@i(c6e>P)3,(Dވ{CbyĪVeWb_skwV3;Ssk0"2e jzhX⍨ v3W2ʰUs]x!`Y`lvGyDN'2Lʨڌ2v'DƐDeNE*cH-oX|ohӀl5A:/yhXlt:/Ζ4`#V[}b\g6 X63J"$^x7S Le~D#"dUD}<Q rb:Ɲs"X-"QC"֩*pHp"m65Sb]k`p v^lkGK]^Lݕ7>?v ,ǁu3'eƉfnUa̕\CnqaE*c>7K&XeTEe;$VA^ uA  qR/$UΨ`fI蟳LހrgUH)Y1$Fqw]Q "ďi@C /obDy%.d4%2LfMc9Eg /NV Ngv.ksf`YgaY xR$KiAF`v?zi)QC?J1$F|s\1KJ\FRYG&GBq=!(cr9Q)ƱrS"hTFA21DP`a9wt[tA7f`l@ʨ CaVp頦a#Q11NS޷|z;_j PL S ~(c31;H!aI}1#' _81Pa4o'w\/OŸѳlԷGѴǯcEx]+k-7ǃo%,XD`g$쫪wK^^0^͂n_eDyLa *2ǂE>=#G1'c!C@&3D&ۧ)p݈{>>_#==CVlzܧ  CO􅞾|,u{qx*aY{Tb)fvKpq*QⰈX}t,#`tDIJ.QFD2̅x3b?$U9xG"pwV HLUF=! J'ZgRE~kMI&ŪJ+e3M5fAL{f5zʸE؞V 2blϤ^Ȉncջ` #ʨAt"*G,=HgA܎ĕ$Hf,a.}S#…ֳ`{}G]-cȻ/ޘg !{*H` (rRkk<ąxmY?Q[2d,qX2Ɨ0dN(+2T$*cvH9ڠoF##1_K5DI4aTXҀ#_5]70DMpcſwQ/JȈ9Xj{J8"82FqوJo,./F+"1("QlKE|N@g-sF Hb qt8w Y1nZ ,4?+~:OGWR\;sыk+MaAQ@ZE ɐCx`2:4q8?q_SAn x "QȄİ7PA1bXpH4w%ƮLz2 1P%0xo<r7MMz JʋowuхU^WV`eq>f8,"=]{,n.q%"9H?+62XYPQ H"hxb!So531CS51B 'M,8g}vmoqfNF,&k3:2g4ΗZδT"!E^K2 [ΘN{eLXDh.fQIīV&@%H '1ZBj Â%b1_޶f[B&VxGl\f=0 81/ǜWMLcͿu- kF3[YQD,a~X`]blɼHbOD ox%<D$L$g*ph)?M ,^4wĄH0Vxh2b.j](ek [KcY q"T;GDfc#L3ü4(cwR_)cjM1a. j[PI d ѿ 6HbŨg5{ ١A3?~k&fQLޙ\xGvT{`;=x*cN]"XBnCs$t/9g$+MB1n2ȉwLdx 1:\@XD?B+DoS!ѱS{`҇#4-zU펞302-aU;xXDPa (Hh|i$ ĸ[>K.{Fna. >oH a*c ~&Bs /h8mqo _kp- s-,w XofL'lmkݘ7Z~n ^">؎y#lg.՛En3\YjsW&+HdBDdPchvY`$ 1:bAf ; i?E7] ̺l0{.:o.h`ހ%|>V^N$hȄjMLj(9lJaaIf8ؠ@NQ:dqlxP-*1ƀ.L" FdY'@PA\VFCT"==l4b1zӶ&70DލVMr[ "нzIH,A4dE$NØCN|e4Ɣ!QRyM_L""A:]fHՉx4.ie*A5HU5wI4b,zBXnZMKs޿d`V3oN ʵ,`c? lTK/8&Ɯ pXS>#ʘ;$` ~Ѳd`VdLj$lAi4 L0BC5Ā#(ϧuv ^s0)Go}g/ɭxI[4V'=?Om `+B".YKq(1 la||CD$Hf)`HGe7"L43 kqj%N8O'7yòEњnw7[N ǿŕHX EmZlw (V^M$~7 "A<̈́<JX̉#x%vİMH@A(2Zl)(s5FT&920 FER0d,qXD,|a+A- cCZM{6I:^Ę (-ًAoo썅nB8 d$ d$[(h&: >'%>?zL3CX!YZǖ2dj";6.we<"ahkP-lCI 7S-ʌ f4q;#O&1fG4t>G6fBP"(Aij AKczE?LW,KbB*#"q"HHUa X:(Vs2QRqo8 "$*cR(w]ݏa@2#aIUt/C fd)`Hbc`A|ii0nLx%گݶa %Sb 49)HZю68!\}>b PL` SJF(D7v&k ~$$A8sa: @ JRd\r_~PG͛śY5.`I]s0T tP@b@ %ECRYa*DJ JSb01CH+bX3bun`aH)vgѱ̦~# h/t@1 8 (h a0GD0{Hh/xR@bIz U{ў\J Ok0g`tQ {RYHX)6S:- M~Tߪ2gyu**gca K;rAgS1~fޔͤu2wθs{Jw> z_dTgcP.kу7hDrI% G;n 3ӥtG%̬h9O1}rb{ja駄 |,Ĥ9h|赍iE6W"~y^]ܙDi×+Q¯F_nwוRTks "NYPwIWrǸ6f55:> /XObject << /im105 591 0 R /im106 597 0 R >> /ProcSet 2 0 R >> /Contents [ 593 0 R 595 0 R 599 0 R ] >> endobj 604 0 obj << /Length 605 0 R /Filter /FlateDecode >> stream H]j1 D0ȶkCK[RHKr HHz3H_ѺD2qg0i%&ў/b@sky', w0ch(Wҵ~8" WǠCєtӕpA$Đcnۗ` 9 endstream endobj 605 0 obj 179 endobj 602 0 obj << /Type /XObject /Subtype /Image /Name /im107 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 603 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 603 0 obj 734 endobj 606 0 obj << /Length 607 0 R /Filter /FlateDecode >> stream HeRAkA~Rv"MjY!hnAJ=WBq/ū\ rq = LB}||{of{{ǽ^;l {|)^Gl,m-:pV&-q #fȂ H ,+{.7 RԺLU*QzQi> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 609 0 obj 734 endobj 610 0 obj << /Length 611 0 R /Filter /FlateDecode >> stream HWێ>4&&o9@q" ztqD"3vuaժk.Z9]ubmS+5\uW¸^W1Tu}S_}:/~|8|y=t\eaJjfd Ӏh8܎a<>Li5͔տ޾Uqxx/|og3ۍ \ Yטwi^޿Cqw^O/zK۟ h0W?7;WŏumMq_+ЇEKbb񯶪cC~^( r>Vf>@S1myc4[2N9Ƨ=Ng鄬uUZƧ2oW-Mk|J2S]z22 iBmtV5SG?%z @s,sOW{ęNﻲ5>l<>>7|toeC]Sݯ!`Y)M$نq>U"GH'eJ{^7* b-$(dz&m1?U$!ki$fCiߤ!`| ґO'oEFh b6yl".g=ܢM%|$ۜSqNZS嬉֫x{0кuNБخo^r?ּ@Gׯ En5mz\d~x2k#8!lʦI{.C?ͯC'/nƛ|YkZW_.<'؞0ٜQ*4`Sdsp.:L |iJs4|Γ]WS#`75=F/UC@3Go`gc %nCI:dRibliW+RJѢmgcP%j\CI,>#`cv#Gs;ދ[SBO:H lכ9^J[$ڧJxyh|$V=XWRv8o98~6Oy_{qwip vVX`ftJ *2Ö"A\鈊"K(D8 N3Ϣd!ƉՅl-z!A(5,9/<iH@ m=D:zp1a@rp~=1-)0F18^92)Er`ia+fc+fq'K 9'PaT)&U.sX|үQVGm~BzG1ۤ:55eJ$fcʐ 5${!p7&a h&(Fad,9yh)O`@$s!AL/Hn +lMlq&.`塃F,$rډݶmi&o nRס@HDO$($Ja2wæ,  k6@(WV@\%l(Ds# $PXHL-.DeTXUTy]њ9I}zC1E_@YdɌFYv @sNU3K<9> .t!3 gA8(@2l ϦO_ U9G!@K 4 0n9Pu8rӄׇ:%'ut.rtns+C$\)AJ=JU o!l[Zyia9sJƃ>K ѻg1`m1zv{WCx)0 LS1(l h•ʡ%LB0AB M 0B I#xx{@Q@;1 Χn e#7=!$f4'ueyHk%Ew4%_׫6E/@>[nBSf}2eZ="qјp+BD\Қl^!$@Z58I$SpR <#Mr)ә5 h26`f6{6 tƆF97Xܳye\c QJD4Z40%^{2ȉ_n[l*KMb/&JA,Zf;A 2B$g/fth+\ BYRD:qΊ7j,,:N9N .ӗ~o $}h臆bK̑DD8&d\-*ȔDd^ |((uֹH^I̤ɷ"u__3; z.y.ssk@B1sID*8Q ܱȯ5rrPH@*!AXS(KƼ+!`]`myPL4p $m`L2Ls{fHaB(/S0e!RWVJ(!pY'5MrYpd\sd41cĚ&XpzE|x!cR΅gSM^ojF1*> j@ˠ T"-R 'rf/"/\`@(, ?~f#f { 6{4]Lwh]4l`%Ie^ FnnܜT,}ڌ !C"P sy dР4QMHVs pv"Jaޠu Q B% m @AF \Cs|cj"v>zn˾@P8hCI)IFl1ZQuklWk 98倓`K!(DU@ 3bJjpG5 @?ǓӡY&V=O?'P _F8r:aqhxa6Bpdl>u!*`KI1Th%$HrjQ㦳NLC[ 4)Fp+Xjh? *Ma@h"|0S0"KW΁\*Jdd ̶k.kngtgts铣)E |A/@MkmZff"3iјbtPdWث B B5@/ߵ+K?|=j<}d<=|( !|. 5`)BdLyzWvB(ҏ#~P7շe)S,IΩPKL@ Or_5F8ZZm`:Cʙ-Q`D1 K H(F" FÂ[Z9T@/IJRVL i~mKYW5W|0;^%@K cܲ$u(:;\1OV ]e;k#8-"YU؉)Q&8H'N dm)U@|:31hC/Ѿ$fʟsq*9[` w[yn`=ϛ":7ZX|j>uvjssR䪅'Lxk`@sU4+ii-JN ;c-ӻ 05& [0G~vD6o ՟4KSt9Joe MmE ,$⪉/a ݔ; ;cDC2R$"%"YBH1ul~l+c:,D*R|xH߈.0ZSZ~G/*} odv5Ah 0j<]Q2O@{{Vn5p]e=rG[Xm\s¤m[ 3+b[,cA3z \1 Ҟp"1s4x9$k`bM@eZ\3b(< ̈́+ai*’N˂36".PxM,<-E\[*R&F%ڰ1hƅXǂފYU00{sqaϷwar_7o$.!+]Pdj1 }Vq-C#ge;`FXH+X3 FHj90Ua]!7LS4`X=Zg1L9c-B,1kf y$[bFԻ?ۃ0=p87f۫;}5t>xI}I]+M!kK*0C Dx qn4f3nt O6))? Pc'|H(iNx]kh@E$Iq<`01za4R MIDB$!2؋uXbG%@"[VL)o&xC߈0ytU=?@vG1ѫR X2x< ĺ` H8PD꾂 D"$H0.{*b.$Tsh?ĉ'Hl?#$#D SJ֭Fݹ#{IJDX X`6@o#v"t$G6=;=hhy E  7 ׬ ~U`B6B숭GƶSMjXWo6z֫Y"8}gPGVV |. "%/e_x\(h'qx;dy,,zc&T+W70ݚWњC˾f7}Wz*:p{M@̦,|/#FW5‘G"$/c&Ӈra16Iv2=Ȣ5dR'\=(;9"$H`[\8BB9V` 6"X-ai  cuv͸XXeW#D8E xx0hxo7瓖N+|2+}gO8X?/]4isߖ1*#ٯ^(mGXDHC\B\j"HJL hF_ z=oL7ran.LcZ kf.NI7Hd9X O%}jO_Yc g]own՗pDKk>KY63=|p+t5l4F'<ҕg_ߜ.MRn%T%Ͽa$b+A)U}xl`u"|9pTu3C + f"dEl\@DsKvj1;y7JÍf|WlL?ar]tU]WDN"Ȉ"AV0R2M\XWd>Zz}<`I1:_W<>=83g1hd g73{N]@XڬfpˮUa"nY2uL5^!qw;>jZ.'  x(%#EO@Gr$#Ef0gx^uʽ+j•0m>}<0WCa).@L|ÍNb:ZOsg$!)r_' q aH,R{3މ[Y[WHY> u/'F * : ƾMƾǾ|2D9`x;._8IDJ{1Rr nbV^&v'a6N0F%^h܂=@Z LBSAyQB[5¾D=Rx#L]w?ﲎD8q2XZq=njHi6Dϟp|d"ϧrE-+v Z R ݚ8 9gs犯)a (&[Ч \EnW'ͩ*%AUqx@|]qYc$py+}h⪉v4xފ}7NnY~2neQ6`. mi{?O 8|^jgvfR%|?|$?[Eyauq};XI`"F=ܧOB1~L?e%)= $ f{U E K0) pN|.;$I[U.uj2mSgԉ@E?0` q`p>K_#k[;$[lAm(8. ]p'$;ft{E瑀?OkOTae4Tgo5lTHA0Vhpn %Y('rj_aTz%,P4|ä:]W~xʍVFY]t\ 4\} :Lܑ<⅝B49X`,]6h{zf:|Nu |EU۫"I$f׾+л\2"!"X#)^uE+^yѹD~5f{>U f?2SL*WDJ\naI p b6whbn(f]1 H uV KxRIDDkW 5GYʁ I 0삑 ];&5`ZC^DɧW X` #D kà[7%{eh^.{ۅ XgY͓9]xUH< fE%O$AO?B<;M0Ce8 ^ULlJF:R%/ܠMHr3b> d (xI]Fv'3bZz~3Bao`×xzvDOc/Χay`1y?#8x*ȸV@O7 ",_|IFl^LB=TÃy]*q)|@B5 77/~j6.&lXs3*iZLɿdSݢ["Ŀf TAa#oF CL+}pd+F0@'WRwN@z0|{>LSgis5f, 'kLM6ި$"$r `vkS~P'C >q{N VL*EH$t41`Icmi@~*3 '~?S Y?L.)T@^>+`ZwKl$, rR 5AĴZ@17}"M>F c ddlF$J3C/L6W0r:N"8njv1H㈌+`1%BY *:X7=_B%#FxGIr`,MYmz nepV8^X6aL6 u*'oiVi* mHZEK23ܐ -&1q+J4|w".hKP 5S)0Ua`, qrhwY6p7C6 k5M"R2]z  MPCPo!"mr+,cPG[@L%@(``% u Q&mךo=Үd`0&6"X!4s`sX O A^gExyvA 2[j` ZiRJwcfWi6/LVdby+a)H-[޷sn>|'=HVMi6L{@f.52ꞌ1 zП 8dO{9 ҸGW9f{ZO1oG? Sӡ 0E ԈW(H Tm`6@F32/,IqneV'c`3\n '_U}d~$cގviٮ0T.ݙ0zܫgVqN;^SԤ.; GVXL8KMZ!?ךf\P/|f!B ]P R _hP-gxv'g4\F=UqjXܾ~꯳s1}CanBaog ` ihɺ19|)B]+V1ؾFfra&KG~Ao/!>R$F4ULR!_R$8= x!NWܺ}@ tфo쭜|/Y54UQjC9j+!jU{JTr]< $Bvz rHMlEN($R"B!"p~ P_`HwM00m,԰ԮE!r,M8 IDJ"\+-k bEHh&"R KMR Eq`_ nݳEl],^Yާ:]TE-\Ij bHicLcT8XGD9]N\pƵ,ZyS Bt%tl h*DH鳎N&IqD \z!m[i=;(9VZB2A$6!l!taZ~^݀N|Pb&^a}X1BV+ u# NJV*ހ\&'L ~pM 2l1&K%I؈э40 '":؟ua5<@bH(m^[8]{S&צ&M4OUhiB+^X q7 TUxJM2+ܘ.|H&V]  qZ{30oAH [ TQU1l{8=O2Bug&vB";#-يt44TₙlŝX<{T[2{m/V}~ȋuVy ȩ;ux9Et?ox:@WK̯?? HNM=H"$FZÛ0aza"4>Ċ\k\|!8"%)"SJX",H Gɺ? REq¹y$}~ Ps/xp1u$Hy䱰a ť>u# 8dblҝI06V*[ţAuLIV0USh3{:K?iDbP4U(HHd$vL >`y\;Q,.{}Ħ'IN3 sD*x$?V:4r"v{Ȩ\ܜs5{=UBl2 rJpF F" "$;`[A'Lȵ23}$$V&Kw~'tg)\XmXa\ m[ˮy7ۮl>[L[h*)o"JsV@n6d1$f ;X!lH8 }X9_k!p Vb|E`z>ĸyl<nbRiIi f8 v|ϯ;@(BN^F{9ig0@:ItCgiѫ:3X9P/S 0h-QB@ 0=]@7/? "'8$GQ)P7u~ϩT}N9OܰTAў8m"$ܪj4HD{-Y[wH :t"3S)`$FAhcw޿kwG2R'x&nt&da!Fb%#DPRmdEt`1JgDH" J 2FCVЍǿ&h@$o(?|8rwb|&.%NU*̣bl8譂G+8A<n[ޱj@~BE #Β;=8!'6IԐ 9p#?L6,$,V*^ưS#1657 Xao WˈiiO+ \|QCX֠p0Y֘h $ g&әI=Wx6GrB: E+U!X̱\,—Kedsᮅ+}Qu;W/a & H"@` bpz mXyZV jg6Ϯ c0LZ`ҵMfFBR!W^ :I0}KZ6=qoe֮c\ {>ϴE B Iİx>~pw^;0)cә*44{]4kL5+F "/V5|Y?7c.%{#V~NÌ;<^r^X~/L#A6˫d`l/ٗ{fzqa' .ޥ $BֱM 0$  b,aA4q"b|H&^|(s Ϊ\0qpCu< TL}>p "w@oa.\D FK 9sis]z k&pxV6 DžZ<[ %\ 4o۷_e?C $5a!.`BBX{_F"p 7bE͜j X!f"VhCur(8@i܀n5<p@l:o]D\x: w]31$Gf򧉐4rĚ kjs$<*5etF?ծ{HOt ,6َ0ڑ.Qyh]W:|H2R73 vU|י8e',014n/xHdsiU4kÿ ъv8f/2#u,hK XdjTiRvq""1U(bS'd ޾G+ +J> H؟,_ +M0X;|~}~69\ߎ}Pi^˗A߬mg":SI4{_`xNXHX̞v e jFB İg~N?1#2}*Oܩ9FKraUNb!;oS 84~u zS~E7PqՃ s7̬X[X_@@ЖVDJ`F;(!ԛ,,,˓7ŧㅸ2SY!IxX tTn Z3TCJ8ؾwui4 t>munvZө"UMtwV1e|kr+Hk +xqaYUv.!OܴpĭWm_6 vl?8ަyID4&y!.;$gWM%Ä92T@)5ax$ H?u ͕POYpM|%ȫmX @$Cg0aAbb:r=;4悲[ܾ%d*`C/DTum6㢧x'Xw*87`X~+ }q01p`BHha a8Dӗ q>; ({|[Q4m V۔y1eV0*}Z.^t*!v;|6$xXJ &T 0\\&û.ΆO\hx贰U窬uLOkGE#6>jE/t/_HNJ)RPX`/^oFxk[GxuȺlD~%t"*!3rJ%Bޑ "!qH@;xc: [ Vm7JbCjs84\5lǗDh&&n[2Bd]p7ӈ M#[2HO"Ywc`SaJH , y_z~qlXZF\p} •`[L%C`ގ؅.W<$sV8nu؛y K+*!SOGn@0yG L^c*!5;?/w//7PW@ǂhp" !qY$TP|v"NHF,MCa`8q&lĺu w<_aJ)Q4G0}@pB E"wT*@+^8/FT; O"nֶ ۬*ODD e eL d][_MD J J8L48 HPZ~>f1tV5ܚh,|ھ`@&֧-G5@>vaӆ}9Cя8` ;8>@X+b |H3Uj3U“@'d#y޿|ޭN//ͭ';/oUz j)̚"4 ?`fP Z|@6~UR|MHF< .fȦz p= /$Wq( vn{hԳ$^+ԒS3@d >V۞wwQ7~zAǛq cIk:Nډ[&Ǝ@(N'X0>Eq"ⳙɸ`@y||{{?3> jh7#63I tCğE܁oRSȠ11_KZ>$T8C(f8Cic?sOt >='L*] }װ2⅊@,H'HbEЋs|A+6gIa9~öL Z $q4  8@yiDt؞W?j&^W2YdzZ`%@AG7 bGD" G4"ofs8062Vg dNRd@F퀼㿈v@\BFD]f%37f>RΏzT%o֌Pn6N zeB: }vHګXNMdP>퀼Pn~5]TlݳSkŏoi+ھlۊ^#5XfNG'|G$?<*8HH&@hl@UÊHuHlɬ!NuO۸almd(*9P333v`&Z(|~\f}K?Vm(|aENTۧw,3gv c mkOĊ|s-a'އG- d"BSN""Ի ",PKQWz7 :q c"o%BQalk&WGV?EjU6)<dWeh1%fa9 Χ>HW(uĊ$2b;q.9"@5d *"#j!#lĊhaɓ-c)jXX?L~|N:v=Nf+;u HZsӃd  NU`L|lMUl5@^T%DՂ} >?ǎ@~s F^Bw3j7RdkzB|`.5$ڋ7"ŊӉz&/%ș<DWB^=_3ᅹ+; 9{ɳW rЩOC3z" Ɔ PaA0 ^z j"2gc;Ú(;AP%r|0Y 'z'}DځꂥF0nYx˾mg:U Y\1q|B&ϱH YosA#"hƉ-OXȦXǶX6M 4"Wp ^ q:3Üg,-||c.3k\l*nfWK L;QE6E(2&HpMX$RR\IP[ +G?Ty ^; l8c\y ltiGN0'`.>NdnˇDs7 e Z kīb{^->Ï(P`KE mV63P !m+~Y,gX**t5*a$O2j~k?uTuEH簱a"H Dq_ =0sO7okz򒈬@Tݏq1f=#a۔y0sj'U,U3]2]<-c-euX8oBĸپc 32oyF1 DG貧'ݦk";Md4Kڮ+v̽RR ϵz҉((&k[ãKv1 ,;؟޶w *U*:^H #_ʠ@BuY$=!+y1(2hg+,ljWy{zSW$~ [2 /2Aq$3 [A*$˖# 2L l"tA qQuZ57` dP1a2LȨ0 ԺY(v}}h-1oĆӉn7ee .K66r# S -$'La|"buV@|Mg0 "-.0c ^TlD\꨹1o)bʋʊ:4-2_STۢ 2u$:fB)@uH j{lO P?pU\ S !!Vy\U`m@ ԏy=SmJ`܊~-z&E3ҷtƴL8sDꀹKd;]0 5CBdo2:+ELorf +UYƹu]I F°xΉ;zE2q/}@_>to;[߶5D>*-MW ./烧VQBL⵹f1\Ds}f͟ -/f-fJoU$OOBGLdb9s`y&\$>*%6ɥ"ɥi2iR(blCI++܋vvƮz@o>?}xbӒO-/51;竀`W`ş`\ =/2X 5ˌuE+[HHZ{2ѭ@@sm ev֊bTf*Dlif P#4w`Ç+w`ϞٳDڶ;/Dcq6m}~qz.*"}6">*q2qK K;K qAئYXG)q6-L'rT羉 mS&>MUhTp|;m.!a^'R8!v7N[I "6%pc$j/cϾ4~ݡkʦX'\@t|2Nnle#󆮌V|H^K&A]κD˵[8|Fb'V!™Q$COsAM]_Ԯe[v|~a*^O^J^__ܕ'mA+ q-y=Yґ0պrnA0@%X^ӈH=8GΆxlS0g8}yPjĭga oۍntCD+U>$X-eCe ڈ? E@p>cB&< 4_MwM=iuև8 =LwF3qYXKvr)[V)l#QҰYSNHsZ*VU7ԄQ@ NPz$v0ͻL.vu4 DE`Q(p bPrQTN3!)I&#(#9jb9`:]E[):c π-L8 z+*$$JqF^ +at3g6_& >d]9a CQHIy0%lFt'9PbvǷdHeFɴǫ.>6#k+ #1x5Sl$yhЉSb2cIuH+DQ-dP΂!$Edc.2/b( rP@i w+ ڧ$I!f9 _An AP7.4 _.|yyv_  %*| f!apE$QB(f"xBq{@Q # 4E)67 T *fcn#cFJ@Y7&olgBHxia=$\#Q6]$S8Dz*sFk! ẞF4'(l쟀uxi 52@ȭ^QPlLx1Uh+8x{X"cI &EIՐ3CdPJcs"ۯw/"!K= Su}Ypأ=Xƞ )7P>*V3`מY~TelPFmn(@L!L)A̢(ˠ(B]зQ)R*P /枳s>w}sVNm\/_te[o y_ky*}٦G6%ejW/$1p~Pu腺CeO[~}hj[7~:SUuT\7U:X=6uۘί>5~ոѤxwɬuVZǾ6SyS=&J_s+s^Ĩe#mш%A{=*+eEST][aY3=seYƸ ԼMgoVmOZafe^9VPO"d2NN^JMGmBaԝ>zw+yj㱒}7Vy槉Jvj=>~ٞtt/(W[3  endstream endobj 611 0 obj 24661 endobj 601 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 575 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F4 586 0 R /F5 588 0 R >> /XObject << /im107 602 0 R /im108 608 0 R >> /ProcSet 2 0 R >> /Contents [ 604 0 R 606 0 R 610 0 R ] >> endobj 615 0 obj << /Length 616 0 R /Filter /FlateDecode >> stream H]N0 D 0G8Ԍi• P+zA$]i-{$YOh]"a(LAIŭ-qǺI}A9‹P9#Tcnr',GԯaPk|}}CAɻ)ǿ깆oOR:J 9vV0־\7~9 endstream endobj 616 0 obj 180 endobj 613 0 obj << /Type /XObject /Subtype /Image /Name /im109 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 614 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 614 0 obj 734 endobj 617 0 obj << /Length 618 0 R /Filter /FlateDecode >> stream H]AKAvq{)2Y7I!t =x(Ex PVH1/""koN%)[0vofZef{GFן4#Vomzdk͕Ո1٣.kE4|͢& 7wX]5;Fí7,|>? ~D8zq )$7+Nb1˥^tiT;$z|YΆ7Yy%amL¶ p.+ȍb6z Q%BEMR hs/_l,R|F.?i>Ht;8«B> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 620 0 obj 734 endobj 621 0 obj << /Length 622 0 R /Filter /FlateDecode >> stream HkoܸO;+Qknי\NР߾ )n_OΆ~ǯdÿ]p#a'L0m_0Ei*tq88.{vw@y9n|*dȊ^̫bӗIhkr)2qU7)8֘lMNq]bŦo'*5cgrfrolSX٫9\ٞ~^݈ôs?-=܈]0<z<= :/ɲz޲>W{/!މxYq~_ԋnhS `aϨg_3;<~ǚ_;6ZzpN2x'L31Mc|l9pppp ZiF3hK➉;6kTaGEEEE]i> &28|x xNN];u|BA~*DX_fz"i {<@sfTs3xlGr肚e&+N=l[XuR?:{TtLס {+nRcWʫj),S[>sX2ͳx^ˮM, is+f>fxho}\x37?B7oZUa()krj|R}GuQpET& %ouqGZv8қ)F:TTTT5vૺHu"accccoÎur]qEFpƃ].pJk35K|mf6c1dddd#GZKUx e2*EzxJR-F]IdOUap2222ˑ#-EЍ.TdԈM<*`۹"nQQQQQפFbvjj)\\\\܍L"^wZeE&ICsl[W((((WBo_-4f.7,G➉nA5R續p#E⥭ {{à@G:+UD+5}RsaiŇWQLKΐm3c^܄{xjj]qȣ^>M'*#xa B͕ŋ[h* ~y=oKCKP6q' *7{q#Sc_IƯH]v^iݙ[ΔqKUF3v{V8ngLM&܋!;w$B+4Kǁ @KW W ppppm⑨#RK+ltBEEEE]%K<Ӱ7dǺ]qEFوM<*ZZTTTTԗFҎv;Mr])ܼ,|r7|}{f4>4[j6]P |# DVz售Y x+)֧ sp4dY*G2xH>GL5bM$Jzbx' mA****JpB2X-{&n0;H֨bI2<$^*dݳh突*8e)\\\\3q-H.ʌSM%28|x$HWNެ -6vQ>a8)-+YN\!];x/ 5}om{ȋUʕ5dPI GlxpppppώG]rE7"No-i EuMj$.3Nސ:uEe/88886pv+Nf u%j8jӴ?maq9ҬmTuk7[Kl;Wd%****H,JwX-{&n8;ŒRyjKGRl[W5/OmUtAK➉nAt٦QNdppppm"Vq۽=ac^dő(nVJzm֣H/%!U!;yVY=4ϥeF]cCq ]tҽEmm-O1!!N8qw%F8ĉ'`;SΠ|̆sqKS]|1n z0pr]gr$9Woz#}CWD#*VaD?.˫懝k+waJ*UPEF>b26)o ]? H;w@LҥN.Uq+Jً--]tҽDZUTRDv 5%<G8q{Yt˛Ȓ%K6]]Ջ? FOD{ׯ  3y_ G?]Dק}p@>'lc7>HApw \@x;ڭZkf*B`A&)="KZ>P~[+8w9Af!T9H2S`"wFQR ]<7:I}^=boRg5.*qKYӡvEg}Q_7߷P:D+2#l+-,f\#PDjXƐ,oݯ$2!?4Q#̚Xϡ`G~'~5 op@#q,[>>/(==ʊC#pYg 8~R,8e&O+EZUbK(sG:+P`#HԳ&- ,Թ5ydDf>>e}SƖݩ5wh!sn]awY "rDD C)?KXY¼p GSXb 9睂p jP7c@W/~c2Sr"Y2S(q*]0|C"l`To3==B#հf81q\J,TV>6Hi:unxh[yUop˖j&pswN=HZ>(@ط" )< (#Oed#um:YhEHe8VlCÐ^];'O`ԵCfه2)԰j F'3pz}Gu // E4s"vcZ~b'F^y$@hGEDߗ d=+|v!"U{0I^M#0z#@`:]="9ȌDOG2W~Y:șۑ6\DDZKpi 'b>]=+Ff ,%oG.3u:^"HYH5[X:L9_ P)c!m۟.3kޚF>G_y8eÉ߳UF"OC?Yk 9}1,HdN5_pkUgW5("з-_?+ax{ \(37@w'#R+uwt _~v} t;>D*UTau-6t}}ݾz8qĉ?Z'+>|YP޼D,Yd+eAADQRJjMjHֆgRmqĉ'^O4<_|*O(„ &|W8QB<5v65u;E*UT+QuFV%ԏpeB8qǛޙڝ#y:ĉ'L<iֽ9TRjۑ:Rz6mڴi?NU)rP}qĉ&r poFTRZK:}YL21ʔ)S9r(z5/3UB8qğK+Wb UTR|5ܘ0@ѥK.ݛюDYl'N8wi9x%Jh/Tgm@`y.]tč 6d=Nĉ'N8h4>T1^@F4^ֈ^?WF"-0y ;|<ȿ>QbGSf*ˍ,O8?bֿ]ЮH fF=r1i=\~5_xlZ1zxP}xac3Ǹi%f Ua'B< loBEEEE}^%JrM?'T/Z|[L~A؉+;kkEEEEE=Aj]%H=VSUa{SM΁^;{IUFDR BQ!####DT^ 6h 88889zY[Sr9FEEEE=ԒB3 CFFFF~ىCZyf4tI9/r ((((_ۿPW<-J`% Ezi5d:΁;OSu=.$s)c'U(ƇqsomSF@9.]>׼-Ks@ox|gS"YY򁋋KܩSԔ\ՀQGQq`XZ9ppppNW-E' E\7(ֲ****T'JV*& ́eԥI=(q'AMNMGR!SZ Ŏ3~N$_T|0000NXyY]+****zΔVUr~x5Ux >ZZ)````Wr'>;wRQQ8(UROTlllls^6N~:Ɔէ߆XOd;}Z3ii~xR}| Z^nϙD⾈[ .-`**88889qX<:ҫq~_ډkRJ8& Ezv*Ogɓgєf]u-;Ĺo+oC3'~h߱WDl38?י}K#1tOmDVa񠞯yuN ) h8^2AS6p `ccccRsy ́IuzIJL} ;-Z9ppppՈ{N,GEEEE=Z%:(}gϏz$ }d'R b3 wQStճ3% uMT+Q'wfI7QN7ĝ6d9M^4444NX{zԬcpqqqq_ĭgaWq~N).:f܎ACCCCC'؝+m....N`w2L>ŃT!',3~br֎R ʢ"\;)V&TTTTCNVLFdː6]ull#ǼB'h$*bʤ<:;]n(l3#;1 `دNIz]ܱ6dvm׉@hy#ϹaOеHA=N\x`痷V8hZAYGjm`O{1TPO,u_PQo֣Drz98888qX<:>)````WwJLjU%燷\SUω;Vw|M~A؉+/;ikAEEEE} RPz..accccRcHH=n2~9D5J"v_L C?zlj:tMjvځ#N8q73mJzk\H&Mҙ2mgzKq ]tҽqV*֮̐j'N=LClPf#N8q7GS5X(tҥ{7ӹ(wuEȤkѤ"ڴiӦ};Sw4>ۚ'N8*1uVaБK.]7wv;jj^UTRE͔ɚuSG8qog{K\A.]t^ʹ-ʵ!/UGar+wW쯍"O{.O_bZ$/%;c9ĉ'~cyvn.x:`؇\#/;埑ˈ-Qr_A`Giy^p w3<5"'M<p+mdRƫY9Lө`_:':d@Lm-3SGgѫ)Ы{^l⽚u8tzf׃4 '8<wEd#:."EGqp]c~<";_%#K}6EwBؿqB’#o ~Wԫ a`YfD/H{l1~1h6Am‎|o{˰#76EaP?wGjq/Ka\+k)XQ^ ?/"R/rBow1* $ ms̔_Z>!e ȌD)3GR .顉`S)԰k c֢?2n_&Jd(a?V~wX,x^,NkpJiu |=DD3rfd47PfJd񑬙 q݀ K@Gtk׈ ` ȸ3" ƚH }x ,eW잷'h"" b픙q^Eˌ@3Rt.[BׇKC?Kfgxk8S76_;Yq: 􍑙Ru˫/~w,GkD[v (3WjC TNfZ`|,DD A7#| ϗ`>lߺi۸sy^"5<BI/xw㗞iw!Q)]`d8_j rM&2#0c9e,ۅ]m4 }C^hC+p {[[ o~=ȗf 848(R3>sf|(|`7s6/2" ,#0- _8ehGTF ̀)|.'2TU(@8X`"q 鰋R|^ ռ0`I站;tvDsv:7BAd\N+ }b_aģXpGHeFN8?p.u$'e88ǰ6!= n2#}#d#u^#4q 2q?'<_&|ޜ:y[9o}F^Ic`]$uW7*a,T԰'gj6l_ʌ) 5FD$l漻o]2Sx{ɉgB0s͸k3a7ʼ<1l8#z*EչKq{z:|="pf ?~vӣ|<:߿Ͽ~Մ>ArkImڴi,V $?~#G8qo{XATRJ&5ӗ}YL20ʔ)S9r(ۚyս'N8qt`CY zJ*U5G,c ]tҽ;ڒL/!N8q3]gJWD%JL4TߘzP"E.]t/&Kf[[2z#N8_ˍ@(e;@$39'[[y,$࿃˔oACCCC]:k' }"f,9~N<(.R +8pppp~#(5-iх=4"NZϸɔ-llllsAX|6ƁSڋԬfeх}7h.;v*խ;zՏJdhgOf^i; ](\\ܳRs׿oQWX8}f߸u,; j9@uv²7d'AcSZg28-\={G_RׯԇtZ?}`qܜfӾwrqzxSJm{}(cnZE.д̎a@5h14ΓPďZ+Ɓ~v[|~~V[$XXXX؃A>w2ڄz$j(vpppppAR||s_"E`g)TTTTԃnT*[~D˭ 8888Iqd$****ԠԪxsfӰbGfA+OPƒiO(Yk#****ԠT̖~ Az(6ٴpppps~Y{\TTTTԿegWԢa"H,iegњ΁[]~ nsP/d,Ր;N65xZ,>)/g܆ACCCCCڣTѤ-...sqe}zHEo:Ѳ{\w~ΘGpܓiJ=Lo;zG/w꠮9d>yjL ]'V@0~A*d3 ݍ~K%jRHe|r2ZPQQQQz!cQ,Rǩ8ppppn'y2%|(`````8&+'BPQQQQ9SJ#Z@ăRbA;Iȷ````(Y]#***Iqe}zm)׾(T3DfciZG{*Û-j*wp&IL|yؑTZ؆hM:G򸠢I JϮv7%fpcfÐ_GN<}xޚV6κneo;,D;a|7 בп="5 Najց}u&r+x-_n?CzFZ6y* X-;qoGn376P: (?֖z*:_ |haU6k=aDEEEE^5ի-~~N<:5 6 p!V^vzׂz$5Zպ ~-`ccccÎRs՛mʝ܍|BEEEE=ꗞZMoBLDT^r/6l 88889q?⬭%EJ jIRÏ!####9COZyf4t7җ럆_i >Yu i^h܆v=>w]C[w8Ws +H''8kYZwx&|ﭏO4~~e=HE .yjNt} 7tOW>^(.WzEŝBEEEE=ǁa.hEgOfNi; ](\\\\qbܤZJR8Yz6xCRIBj \l; Y9ICFv3i4xI,>)|(````W"ֻTTTT#~ԨVUk 88888|.S  1;]RwPQQQQqPRWOTllllsQ^{ V-1 " bk+: Ѝ%B8 ÇNݑX٢UY`i}Ƚ)ĹVgb>a ͿU^9(p…'n%z7>p?Lе QyGMSٮ&WNDk4}J tÆE(<ΕvHSURCLjǨ0~GY R=nsUM1aTRF> /XObject << /im109 613 0 R /im110 619 0 R >> /ProcSet 2 0 R >> /Contents [ 615 0 R 617 0 R 621 0 R ] >> endobj 626 0 obj << /Length 627 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$Dav=,P(Jӄ1Lqw9 endstream endobj 627 0 obj 177 endobj 624 0 obj << /Type /XObject /Subtype /Image /Name /im111 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 625 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 625 0 obj 734 endobj 628 0 obj << /Length 629 0 R /Filter /FlateDecode >> stream HeAk@_euW zĦ6Kwۮ,"=Yz=,G[?AoMa=xšČfv[/HbE>"."䢭5/T%I`nʘd;UkBAl:pI& Nzy "ATbg2Z\`u6F bOxNDVҺB3sc=tԷ3eԟOJ2~)KSәl!܊g[ͅ~bnh4Y= endstream endobj 629 0 obj 497 endobj 630 0 obj << /Type /XObject /Subtype /Image /Name /im112 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 631 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 631 0 obj 734 endobj 632 0 obj << /Length 633 0 R /Filter /FlateDecode >> stream HUr8*Iƃܒ]*}A(HBBZRwS$GOO7V%m)vO+%@*pGX=P`rbxAxxe u`HxxËu]c)iQXڴb2RtVw?^_LaE;ʆl$Oe_*CD)&L˂ vМ@y' tNx {|`TBf=. _0zkL ;9p2=0`,JxGig(ʹkU1됈Hl]C1 Oдp1 4i ~TR6ǫS:F9N3hMDN{;8^ ‡m[vqコmP>H)_"dtUn ߆&#TaeŲ_')$wOy> /XObject << /im111 624 0 R /im112 630 0 R >> /ProcSet 2 0 R >> /Contents [ 626 0 R 628 0 R 632 0 R ] >> endobj 637 0 obj << /Length 638 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$Dqv=,P(Jӄ1Lq Q9 endstream endobj 638 0 obj 177 endobj 635 0 obj << /Type /XObject /Subtype /Image /Name /im113 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 636 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 636 0 obj 734 endobj 639 0 obj << /Length 640 0 R /Filter /FlateDecode >> stream H]Ak0ǟu ջ^6XtqA&c-e9F顇2BJ "9~kAr);y')n X{%2zΛFok )X3G4m+a7F'淏/N?6F0JY(ZSVn&n2N'Rcʖ5/E/xnMʹr*JO/`#169 DlUȴ22^UNTWFj+)A> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 642 0 obj 734 endobj 643 0 obj << /Length 644 0 R /Filter /FlateDecode >> stream HTˎ0C0peXH{eQ >mgJ;prUj y!CFr©BI<,Kp=d; L,\)BMXW704hL0k;5_2;E2 -T!涙M ~M IJlV J&!IeqMadlE+)'tS/{?@;v/{4K֎L8A{j[N0Rm񫚘 c3 Z[*Ud6=p-8GNLO$1I@|ciny<pDŝV)mNO  Lrx3^2/9fJseoys I8"ξB&VA <$ྜ,R¨0A1IT4?_sTa̾V endstream endobj 644 0 obj 483 endobj 645 0 obj << /Type /XObject /Subtype /Image /Name /im115 /Filter /DCTDecode /Width 273 /Height 250 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 646 0 R >> stream AdobedC    !"(($#$% '+++,.3332-3333333333  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$IywM9[>Wom0l I᣺?w?;?s~}b#+3`k Gu~w7l^FWgװ@-'??t?Yu ,_3*\_{#"*gš>j/~n./OUZ5K?Eʷ^ȧʪshl-gY<+_»-gY<%-gY<%-gY<%-gYѾ^E.$3YY/ q$A?Fȷ/"ϴo}K$/+RI$I$_+RI%i/F bi/F bi/F b۽cĵpWn69=]A~}pC$_Ӎ^l>3q??B;6oO3dqӀqn?hGy:ιMY07׶~Eͥ!ƀq>#c}l3o}_{nk\[a h9V:ιMY07׶~Eͥ!ƀq>#r:~-,ewYS_c*qsZHHr:~-,ewYS_c*qsZHHr:~-,ewYS_c*qsZHH>;ˏfWS*yq7ot>;ˏfWS*yq7ot>;ˏfWS*yq7ot­o_tdz8:z`?efptz2ws[]!N7ޘmٴ*̝yeWHvGӍ7[vm7 G3'w>^hw_^6=JqK~ׇo7@lawO̯v8տuxek÷śA 6`B0;W~wRRߺv250A!6/ֿ[߇sGC]bY`6l_Xaٗm؏Um%  uؿZo~ó/'ӱ]museK4Tɲq>0MǺZڋC>ev}Sa}9u൥=}-˻}S&+Gu6.skKj/q{CK[,뺍ֳ=DևxDhffg]mεlǾc&ߦ8#EK33:nuef=3584 Wmuۺkrݑ[S65'"v`ͩ0U3mLA8p-sj` oL;zs ez>lo;;n:Ĭ~aۘ윏M/쀳c1v%eSަdzmd۶α+3Է+1f}mŷnp/0vyQf;1nVcqwn ^a$+ӱtvcRܬљMý8IQCV㑐cvU8,nNh\Z'A3>`ќr2{ʧŞwZI D8Fg uZ3FC}T⸳ҮC=;qh ;Ga7dtkdebI5M2 $g}^u >llW<0[I IA#:Ρߛo i$׷4$~p gUߩ7~EYX\lp!yNeȮ-ȯ*Ǽzc44m Ȉ%h7wM.Ev_nFFEyVf=7W!lhnDA+ލw ݗ]8?&'xlƘ{Z4v^Ѿt+"}kFz7.v^Ev_UC`hj-EI$K+RI$I$_+RI$I$_+RI$I$_+W t/) t/) t/)rܤK+RI$I$_?#E?b?#E?b?#E?bWrI$_+W-Fk3Y{ֲv`o$s}hњ}^sX5[>\Z>f5W1=k!kV G-O8k s2E[ҹdo"uXk s2E[ҹdo"uXk s2E[ҹdo"u].V6^5Y8ֶnh}v0\wXxdZ۩-sObceUknc <W+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_?#E?b?#E?b?#E?bWrI$_+RI$IpKBرpKBرpKBر+RI$Ir_G^=2tNԳrcPYK}}`^KbhTΉrn^jk1sﯴ :kl_{ʙ:N_RYCf0.p'M ֬zyw`M6\+/O_Zrr݁6ysp̭[0>}jwvۓi;2qpn7Y"E¼ 71'PuZ8ۇ8d7,M^v~:oÁ2_HQp;eLt?G V7=Kh[ncp-{nY&\_R?Z)?V?A6f>n ^[ VI4o#c}WԺO֊pOվzY7׻He0^iz+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$IpKBرpKBرpKBر+RI$I$_+RI%i/F bi/F bi/F bܮw++RI$I$_?gFs?gFs?gFsWrI$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI%i/F bi/F bi/F bܮw++RI$I$_+W t/) t/) t/)rܤK+RI$Ipڳ_qpڳ_qpڳ_q+RI$IQd_1Kk= #]5TpzEu l赏uzǸHMUzE]C.4-c^5UzK̢̪(k,i4>>ߚzK̢̪(k,i4>>ߚzK̢̪(k,i4>>ߚGֿ94uh 7̊*0:'T_|l: bfEen QF6NMc1CM"ʃ7qyMfߋ^P{qcN1ĉlo 6Zz&p{Ӎ{w0t$NSc}hY׃13CƜk&@Lq"t2zf?:]8TocX< qUޡoLGP˧ 2,k'. J:MhtS!Ecd% _d7 Cw ؙ#{cqr]k!ͅhlL潱89.6&gMfNUXkXI&dz'*Kh$ebacٓ}xV%4xt]ǀ湦A(]ǀ湦A(]ǀ湦A*JJK+RI$I$_+RI$I$_+W t/) t/) t/)rܤK+RI$I$_?#E?b?#E?b?#E?bWrI$_+RI%+7STu{(W#:Ӿ눆Y 2 /=]APZFVu6\D2@ILyJ o0:UΫ:!@Ld ڮ[s^!AmWTj{l9ax B궫e=Vװp<G!+RI%tՓl{rL~+ɫ'`ي&MC W_VOMʚ1c6*o[o}{ݸ5'QWN2FKv+Ǽq>(ͪq7TzrNKǢ C.&LnGA1gGtlԛ"r^=bq2gku2:0:=7eu^ܬ} ;[ccՏCuT15@7lz`7|эV= SցKn^c^61NvLb|^԰z^+r11ud~[׹gSv4$5WRXlZf LQ +*ن=^ >{&V ]K?Ua zk97;cX 2}G4<7wWDL*9=SVCX={wВX`h%wߋ my !ycc;I,0d4hvOToņ6`UɎ뢯XLw٧ݿEz+U.Ѻ_K9'iմWs ptލY88MLp4KnIf7lmc!b]u9`-V}!X. 5 Hľۨ}sl" tV XWzF%ENck?KaHV HuTnVI$T켇o$MĝFΕJVy1dLNENvI.HInTnVI$T켇o$MĝFΕnXާP־Rt 11ƽ굥AF짗n5U-p 5Gej;*J k6zeXey{tOT՞a6lC˽=+.m]{c%9\9>%ZoJ§ 5l6l"9VҺ{0e f==&6F͆[jU*pCYFIa#+RI$I$_+RI$I$_+RI$IpKBرpKBرpKBر+RI$I$_+RI%i/F bi/F bi/F bܮw++RI$I$_lS GI:t'F㳘t]}?se` : #qh.|{B0RcΝI4^MtMuֲ45kk1144pS]5S]t`즦jme,k`\K[ceM=pkp~Y.n=ƭ}6ZƸ y/\oF΅Y/6G%5`l0Qbfs,*2 ͑smL/ElXui dr\[v.0`x Ppsn+ꖺcc>ᵦ>Djuw;aΩkyo\9?CZcFPpsn+ꖺcc>ᵦ>Dj%.$_+RI$I$_+RI$I$_+RI$I$_+RI%i/F bi/F bi/F bܮw++RI$I$_+W t/) t/) t/)rܤK+RI$I3;\YE- \<(9xض̊.imZAAŷ.dQsKlƂ n}V>c}[9:ǁ~?6q G:7>[uΝc KZLnu8#z~ՏVCN_%-&7zwξ)zRNEx_`{[K{ h.'Pr+Dz\ELs@kAq>@^6=V*cZ "t+FT̯S(f377kDA hayCȥ +-3+ &@H^_)gBaJn u9c:ɱsvD* U]ꐫ)ʾrk`84djFFL/y}k*ĺq܆5:/K^eZ .|!s@qFjDj΋]2I$I+RI$I$_+RI$I$_+RI$I$_+W t/) t/) t/)rܤK+RI$I$_?#E?b?#E?b?#E?bWrI$_+RI%cb+f}>ul $&wWį+'GrQ@8Ș\>_/y_؝g+}GXyVO"av􎃂.J \|\N>dzGAfKf% k>.'W2I]D=# 뵃W$+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_?#E?b?#E?b?#E?bWrI$_+RI$IpKBرpKBرpKBر+RI$I$_+W ?5 ?5 ?5rܤK+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$IpKBرpKBرpKBر+RI$I$_+RI%i/F bi/F bi/F bܮw++RI$I$_?gFs?gFs?gFsWrI$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI%i/F bi/F bi/F bܮw++RI$I$_+W t/) t/) t/)rܤK+RI$Iy~=/g,.V-;vv>/#/w۽gş_r*qn'SwXnW[-}??t?Yu ??t?Yu ??t?Yu ??t?Yu Cz0s:Yͷ"Mgz7f5sO ?G 3ur*f~W svnW4Cz0s:Yͷ"Mgz7f5sO gj}S&cϱnq3p0̀k&~V&֮u:hYxov9,7`bgj}S&cϱnq3p0̀k&~Ql݉k +6crtKA"5l݉k +6crtKA"5l݉k +6crtKA"5z^CGVwS˺c;` p,h5]S~uh.x8wU1vl F+YzM[%O'.6Yc5!e_4}e88}W3:2jm ;Ć#>>՝E56EU}C\\cIlW YzU΢̚p¢!.i$H gutJksk my%Liu@gu?_K>n ꁟ3e)-P}0ݦAo^~{uǪTX^`%o^~{uǪTX^`%o^~{uǪTX^`%+W t/) t/) t/)rܤK+RI$I$_?#E?b?#E?b?#E?bWrI$_+RI%j?j?j?ܮw++RI$I$_+RI$I$_+RI$I$_+W9~ԺMT3uB?o:{_鹂 ~^9n};h]'-\YR70^Sco Gm E wl+בX2!&fu)wl+בX2!&fu)wl+בX2!&fu(}TVcңz0q\籾-{5ijA' >guޫ^1Q~=8sX{YU3U?ǿW9o ^=iq,{DIΛӾtGHdz"z}s{V5n6@>g :oNҺ}#<1iνXւy$`/L;wJt{0(ǧѧ:cZfCa6y~>3s)=u`v&H SNNNRex]wӞ:vt[It$t_''2LifrX;] $::GQIYe{XkP G]E&Mfֵc5@$ p>uM5ZXZ7ֺ5$y555?#E?b?#E?b?#E?bWrI$_+RI$IpKBرpKBرpKBر+RI$I$_+W GG8oXj??j+Qu?Q.w+I$+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$IpKBرpKBرpKBر+RI$I$_+RI%i/F bi/F bi/F bܮw++RI$I$_noWzUy.6h:WäZ̕_-g:ޯw$>]clєu?I'+ѺZu_I}U٣(M_Ok2StSGGχ#]]ǥgbq@Ԧ_]>GQº,-ǏJځMҾ]N}>쎣stX v.[CR.r[>GHۏ:L>XKKZX,uӷr[>GHۏ:L>XKKZX,uӷr[>GHۏ:L>XKKZX,uӷG89_cs5կxS:zU돣`b/9׋~oc=G?0r1u{ukŀA?7ΘgNF!C:,Mij՗9#'kѾ}d4`b0[3hJq-K=Ysb={ƸgNF!C:,Mij՗9#'kjH݋znCz~v扟s@tkjH݋znCz~v扟s@tkjH݋znCz~v扟s@tjԛz>:WL_I= "tW}mMqg+]u/u A݆c:+&u^ϳ.kyElx~n1ȝ? Gj/>RS0-K ƀINWb?VGQ}fzǹh^H4Np"CZ:7Ԭc=5 D@1uӄmY\_:.U³yb'y\:'7EVm΋pkİ~X}G ~՛Es\+7,V"wQ{kf_^:uW^~6=YV\ڲ+dN-ti2t<ӬźʷՑ]k%6vxqkH홗ׯ;uf-ןVU6{Y,i{Ë]Gm|TcUFe|da} c-`\%ӡZY2LJҫ\ǦA"ZKB>eSWu񓏏M0E8pN~|,='u,,BZ[C JB&4=/vdNK\YKhuiT[$Ƒ'׎̞Բ k)mX7* d$ǫjNVal k,5^Sֽi :_X0ê3{E+sZ׵- sU8uYsq1{eyNkZt.wA0' Σ;`?e6]"toyBuYݏC.Ѵt}Muϭ7:zp{x레֮u5}nnm=/? 1 1 W'jz^~58cf0=c^O?jp,`,{hkL25XZ Wԯ98c`s*i3%~s6"xXZ Wԯ98c`s*i3%~s6"xXZ Wԯ98c`s*i3%~s6"x_j>ct<\\ Yl,7nc$ZxX;"{q=CV[ ۭ$-,%: /V7NȿOPՖvI68K y2AlN /}Cy=wR8f_`>ˬipc@}CN!γ2]esMPOGԲq&uO,cl%p7DF7Fƞw 22u޽LsE7Y ˽%2Vw 22u޽LsE7Y ˽%2Vw 22u޽LsE7Y ˽%2TGޜ2/{s7eTK|cvAѠ (8e^22^nʩ֗2afn샣A@QSzp̼deμݕS.e͎ F86N~My9϶bdI fַ].0$m22smcɢAͭop \`I+;6ed>d9E$ZtRVuT,}/lD#lw4]S_NoamT$mF}[SԳ3M\ 8 ʘH:#jȧ/"YѾś/Ⱥ̌kad2%pvRb]VfFN5js찇;pԈ ~h˾NmuF7h!@UC>ё}2rl>j@nѴCC@m/}#.e9:}wݣh9V!erKKI'RL 4- C 䖗mN4h4[-.& $Hi04h+ I$+RI$I$_+W t/) t/) t/)rܤK+RI$I$_?#E?b?#E?b?#E?bWrI$_+RI%eQ=ί"?2"3;~0 ^qTz@9곫ȳ=wÖߤ-װ\F_:_,"/3?0uϮ}+[f$YԨn?9Ϯ}+[f$YԨn?9Ϯ}+[f$YԨn?9+V[щin߳]Owf@'tN7NGKw텺{M6;tE﬽)ltbr>[7l-lٷP :(W[(ˮwO9{ƖĴ80ZKB_־nGP.<8s[8Oi.M Z%BltjǹilKC \?E4*]7/KWvisNFEMpu*]7/KWvisNFEMpu*]7/KWvisNFEMpu++RI$I$_+RI$I$_+RI$I$_+RI$I$_?#E?b?#E?b?#E?bWrI$_+RI$IpKBرpKBرpKBر+RI$I$_+V?}+^$Yԯ?5.0?}+^$Yԯ?5.0?}+^$Yԯ?5.06/uF,[ 2 '$n6/uF,[ 2 '$n6/uF,[ 2 '$np/bϭ;]eF֛k>3ÈpwY1zghytCakMsv8c3u4tu!YQLW>u^oJ쪁/i4"\A;ʹ~WeT <|'ݎq{Ixy uUϨWR*a>w{M/-sȗN2cu q?屭S vZ<h.cu q?屭S vZ<h.cu q?屭S vZ<h6_+RI$I$_+RI$I$_+RI$I$_+RI$IpKBرpKBرpKBر+RI$I$_+RI%i/F bi/F bi/F bܮw++RI$I$_^.0*`Y3uFZCgkx'P}dϭi `LyU B >[o,6yI1.$Y9TٕѰ27v5n{@ZIBW?&̬ލ}۱sNNo/6efl ݍ[$tꨦMU!`xUE4j c )Umkh_t} v} t'̪#t[X~Vow >eW+`B{]I*ڶK+RI$I$_+RI$I$_+RI$I$_+RI%i/F bi/F bi/F bܮw++RI$I$_+W t/) t/) t/)rܤK+RI$IQ]GVfd{Y104<Һ'Km >۲97;Rb`h xGtN>}eYsdnv@ +RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+W t/) t/) t/)rܤK+RI$I$_?#E?b?#E?b?#E?bWrI$_,muCq I'/o[p$0I|,muCq I'*KdteUչm~ okf CtfGO}U[[m6i` pt:KdteUչm~ okf C6gTɸWnuv} .#A<9!3`adac+:V;H>F~000n۝i{KiO?HO:~^^n&=1 \Sc/selAO:~^^n&=1 \:,~vͱ;M#ӝ},ufokmltNxcc7~߳]lNSf;tE֚I$I/+RI$I$_+RI$I$_+RI$I$_+RI$I$_?#E?b?#E?b?#E?bWrI$_+RI$IpKBرpKBرpKBر+RI$I$_/RKzu`9pi nԸyB/RKzu`9pi nԸyB/RKzu`9pi nԸyB:ԾuLO@_2]赌]U:X)Ky 꾇R3k?Wkq~tZ3!Wa޵˺ە yN赭y k%uۭ*@k[Xw?]zKK.[nT Mu;ֶQXuU\,k\mH>kQXuU\,k\mH>kQXuU\,k\mH>k+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$IpKBرpKBرpKBر+RI$I$_+RI%i/F bi/F bi/F bܮw++RI%+]ck!Q< +]ck!Y?U~쁑q.cWN= YF=lpY?U~쁑q.cG꠯"p2H77Ťnul}Q+Ȭt\̒ 5qiAp۬D[T~ +3$s~\ZA\6Q(}[n>/ MxEpxovhu 5uխS-VۅgK~.3SCal@:2@nfѻo+dS=b݆ͣv 4W609zŻ Fh+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI%i/F bi/F bi/F bܮw++RI$I$_+WjD=3?7;nXGWjD=3?7;nXGWjD=3?7;nXGWU/okX[d5?g?_klFv#/ok?VwklF{նG#K^a;?mHX[d4V/{նG#K^a;?mHX[d4V/{նG#K^a;?mH?VwklF{նG#K^a;?mHX[d4V/{նG#K^a;?mHX[d4V/{նG#K^a;?mH?VwklF{նG#K^a;?mHX[d4V/{նG#K^a;?mHX[d4V/{նG#K^a;?mH?VwklF{նG#K^a;?mHX[d4V/{նG#K^a;?mHX[d4V/{նG#K^a;?mH?VwklF{նG#K^a;?mHX[d4V/{նG#K^a;?mHX[d4V/{նG#K^a;?mH?VwklF{նG#K^a;?mHX[d4V/{նG#K^a;?mHX[d4V/{նG#K^a;?mH?VwklF{նG#KI0_S[%t/)_:ŋ]RI%+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_ endstream endobj 646 0 obj 23154 endobj 647 0 obj << /Length 648 0 R /Filter /FlateDecode >> stream HTɎ@Q$DiK@Xtcg>`mFZa}ZGdH@^E ¯Atbƌ^ "x?곂X$НNCeǴquum6k ;ؗJ8X[!fXב<&sK 5* ~+Z&z>$ HAI4f:3hkX崻ԁlx7 & @kc6fuh0,: Ϳf< RW$65Xj=6׾uek;, 7769<ܯS6džP)K97eSzމȷP/BVx73i ٟ|A]PMÚA+h*wW|rBuJ/m/moX53H\U, BmNļ #10?"6ìa]ҿ= f:Zji'rЖ9OKʆա cxrU`DF9㧆 . endstream endobj 648 0 obj 562 endobj 634 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 575 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im113 635 0 R /im114 641 0 R /im115 645 0 R >> /ProcSet 2 0 R >> /Contents [ 637 0 R 639 0 R 643 0 R 647 0 R ] >> endobj 653 0 obj << /Length 654 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsRn;ӂ$$')CΎD0dZiu D 7zCC"p/#ĺF:^=V>O<;az$DK.Je4Wi1|9N">9 endstream endobj 654 0 obj 176 endobj 651 0 obj << /Type /XObject /Subtype /Image /Name /im116 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 652 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 652 0 obj 734 endobj 655 0 obj << /Length 656 0 R /Filter /FlateDecode >> stream HeRA@~C, vfSغ[\D<YA"毨x/ =OKa}4-/${߼LN$V=-: Bqqz!ѐ˷pR!GEˁx'ڴ/g/>ʇ.T!k+rrI̢{7 }/,q}`Ӫʽvi}*/U%g%XcEL"O A3*P1]A})b}yhzS\h_eQ1"Pk> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 658 0 obj 734 endobj 659 0 obj << /Length 660 0 R /Filter /FlateDecode >> stream HSn0f;hkf $&e%ePM6@/%y "8͐&3FL n_gO\Q{LVF]D8v {x5wtRkXF~ ŏJ \c /KKꗶ]U[$uhMU~4G# -ފ(rӜKM͌98^gdTTZU0.O"ߣ#' iyuN k=my_txcDe4R2i.1'S3e4[Ҕ9gI~B(Jz)]l4f83; 24C9U<^W5/X/\<dx~dkn^mtSFKDv ~h߻"  endstream endobj 660 0 obj 494 endobj 649 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 650 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im116 651 0 R /im117 657 0 R >> /ProcSet 2 0 R >> /Contents [ 653 0 R 655 0 R 659 0 R ] >> endobj 664 0 obj << /Length 665 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7]m6=,Pj(Iӄ1^Hpwo9 endstream endobj 665 0 obj 176 endobj 662 0 obj << /Type /XObject /Subtype /Image /Name /im118 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 663 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 663 0 obj 734 endobj 666 0 obj << /Length 667 0 R /Filter /FlateDecode >> stream H]RMk@UI\6RzjQ쀩!ͦJ %C趔KLG[鯐!^E.Av?2bVOo̊͗퀬gc]͠M6ګ9>#xC @6wyCZ*-kN>|{=2ȕRYT2W4Zq É ?Hc%WlO-DI}7F\Y 'F&& pT W6Y׌v Խ{c"t)Ӣ(-r39+B!=Dٟ+_AٯY.p3tNS>flʺe]7툢cXY /&EUDcjhf  -PGisN9 ";j`E.lV%*UgB Tc$ܐґ4Pj+LoI{QM͹}k{b[kfӳVkpW endstream endobj 667 0 obj 489 endobj 668 0 obj << /Type /XObject /Subtype /Image /Name /im119 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 669 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 669 0 obj 734 endobj 670 0 obj << /Length 671 0 R /Filter /FlateDecode >> stream HWێ\xN sIHzg~(`O[w̰VmVN?_N{R(=mד;;qsgsjr*e?-sPً6~hF>ކ_^ܞ}nq|:OH{ +%D|I}Hvc(IRlA8eM*5)s$.37$LOW۸-y37m6T'ѩo?olqEJguV\7֢cz{ׂ,TH>멆Zv, cq0qJ;ζ{H)1d7EuY"᥃4mK݅R}Nѯa4' m"Z|~~|~x~}T-u|9dxc7CneTF8a_F;9DKxs`*dun0GGCf(y_EAtx!~` ]h*S0dPs?3Jeۙrqˌr+P'}?~' O͘##$v_ rj9\XgPrB۷]G7_6.L gT0s 56Tybd%$Dg8_ڜ8`a/$dZ{b+; n=Wr85*Vnڅur$v;s;s)5OKֹy4ndǟa(p".s' yO9qUAa|چ#&k<yvW1xtm «J2) MQ3'p;ef않Ԏv W<}p\{*XQ1sd[3 &jcd^l ,|0sg ;5 bs+٠<3mtdaHn4Y=( /u|دWkKv{j}%+h)?(M'I(smKi "{4xPHżqh.$sbIr8f" N`\bڅ]P5Df JɑK5( }YŶQ n)"V9Yidw-az_pрp JzAg"akhXmSxE+%J f].O=Z*~\4<ȻR؝N"\~l_VvsVlL{>. US_#ff{FU#(| hۃ? Ll(%y7tGueu<\m@L$N9 &!tuʎ˕Ա3+\nJM(U j3U7m{`V#Q xfu. MG.&X8*̢ג!ؗor1!،h@e8$ɘȔڑ 9 G.[ xhs{,jq)L#>zAu1 ((q\@X|:5bBjD8 -4qF%njnO@o:$YX`.& ?_,Gjzɝk]6vû endstream endobj 671 0 obj 2073 endobj 661 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 650 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im118 662 0 R /im119 668 0 R >> /ProcSet 2 0 R >> /Contents [ 664 0 R 666 0 R 670 0 R ] >> endobj 675 0 obj << /Length 676 0 R /Filter /FlateDecode >> stream H]Aj0 EO;e*ٖl.MWv ba}I Od*#0q TL?֔VH:9^cP{rH2>~no]Kjz}C$AOks 41ؤiX6r/o9 endstream endobj 676 0 obj 180 endobj 673 0 obj << /Type /XObject /Subtype /Image /Name /im120 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 674 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 674 0 obj 734 endobj 677 0 obj << /Length 678 0 R /Filter /FlateDecode >> stream HeAkA04Wvm"nF47CՃh/~|oCSz)&P֌of)7?739ΓN̷pm-l|tEox7f wXX4oy Sq_pE9D2cǘ sK? m1ęP}Ʌк|n[ӟ [a^ t~JQt| QT jn+|{MEOgL$A03EUiy?8/.s5DYq%UOS fżP]^R@0*u{! A8UNPsQc^tRyTF] j9>9{X_Ŷ\ܶbUZ&R U0مkMIoИjƵEb鯿'D7;Q6ޙǷtMst|j#Cm endstream endobj 678 0 obj 477 endobj 679 0 obj << /Type /XObject /Subtype /Image /Name /im121 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 680 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 680 0 obj 734 endobj 681 0 obj << /Length 682 0 R /Filter /FlateDecode >> stream HVYo@ H}coyߵsЦ%Fm7x~AT"3xI~&59Ҡx#s0<g̡3vFV gR,/6(fru)ֽWxʿO?TE.֠P-\\{\v//ơON pcV5FRG2T҂"2P6Pm9TG.-[cJf:'\&K\NO(q'>$ z춗~kV(rPEJ,bPsV&oFrzVqȱ|~SY,#9q*A{M-fiaJYhM(` 2#ɷ́[j}Mǜy'vwK|moے ^t@7K[qP0 %ȫ)fяhorM0'f{@Q(!gLVI2GbܑSnjO'1/k+PPcxQSb)Gػ!`f@nj,ZFː dLg$S NNOOx7M;t`Fsۡ! mvw\0'X&ijHcngځTbc& b~;:bgZʷ|Hiug;H^8_k,p=pg{ߞzFXIνdY4n*ۉ9ʳ vZP|D%#9|d$`1l> /XObject << /im120 673 0 R /im121 679 0 R >> /ProcSet 2 0 R >> /Contents [ 675 0 R 677 0 R 681 0 R ] >> endobj 686 0 obj << /Length 687 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7]Lm{YPF} =c/Wݽ9 endstream endobj 687 0 obj 177 endobj 684 0 obj << /Type /XObject /Subtype /Image /Name /im122 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 685 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 685 0 obj 734 endobj 688 0 obj << /Length 689 0 R /Filter /FlateDecode >> stream H]RAk1~QZo]8]{kQكxCAFX١97xq9?0^S Ӎ/ ͗%!3ѝ^6qlw ۉzlэ9CX?3ht:4W) ppt8``hOc-?Gׯ_:Wam7  CuAl\m[s4H:M ˁUƓ<p?6 8!R4gJR Z+?k,B)E=,~r̽|ŴVB8UL9޿&Vy┣*$$Lz%je pziE?x7/ K|ng5.V|g%^Юݯ)(N-M[z2oZ ffhEwfV"v XR??iGóNw k endstream endobj 689 0 obj 475 endobj 690 0 obj << /Type /XObject /Subtype /Image /Name /im123 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 691 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 691 0 obj 734 endobj 692 0 obj << /Length 693 0 R /Filter /FlateDecode >> stream HWYo8|.`{@]U޸QsQs ssjlΪ`SjgҭbO )(f[㌃uL&twu?t9xWjAl-|R m\YUBGKu9.KK;ѩqB(Y3S(vF!V VHVHvc6*jb(uí{}SO_ Eߢ kutvǷfn1T&rչI4EˎB܊6PX\{YĈLKD]E`s =l5AjjO|pF ǐ'4}A6݀\A %oX]$Q׳ITI,_)ZUUy/]-=1~Z4W]eDDw(x㊍gFu|63^D$q,v_?8tA0 t*^Zvw]}nbl~OV_a<r62.!-K?ZG'EV$+`E/dَ!PNyYJXJ(`~://:;|4b9{Ph/i,37" >U/ 7htD+] Pm9 3Vؼ;Y3JZw :'gB9$<{= IM/pnB+LymZ^a4Q*)h(c@Q#JA, )U,^62WL0_|ּVh9t6d]ne.q}!QIɉUeYT#о'cw a6#?SfUR' 09a8\3 3t0!|25<').gq@! endstream endobj 693 0 obj 1096 endobj 683 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 650 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im122 684 0 R /im123 690 0 R >> /ProcSet 2 0 R >> /Contents [ 686 0 R 688 0 R 692 0 R ] >> endobj 697 0 obj << /Length 698 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$DB{YTQF} cʗT V9 endstream endobj 698 0 obj 177 endobj 695 0 obj << /Type /XObject /Subtype /Image /Name /im124 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 696 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 696 0 obj 734 endobj 699 0 obj << /Length 700 0 R /Filter /FlateDecode >> stream HeRjAv;,LE03욬 "ărdr|G sG谗=v Fizb5W5Uu wmvCƵEh'V(OsZB.ދ}r$ވ\rtwx$lYkoj(MLei3!K,vTu,:)WpnZ:IF;x-ͱ 0EBA3LP1ݬAE9PDv+촲0u/,#v"*7ju1z^I2笭L3Q{k rZ  3cL,jiU90=o*r= !>4=HS,+ݨMZ֜Z1/$5j/H\s%gmc[C@eLspVõ<8O5j4=( endstream endobj 700 0 obj 483 endobj 701 0 obj << /Type /XObject /Subtype /Image /Name /im125 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 702 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 702 0 obj 734 endobj 703 0 obj << /Length 704 0 R /Filter /FlateDecode >> stream HTn0cvDR#( >[SL9 ,*%&.I=6287HoIN ]"Úd8]#(-6p,`sTd N(xD~FI<ԫnPNhqY#B^*g{y)'])dL[$K{ߺ?Wy@~ )X:X(;GZBi'7pTS'"[*;eAhƈ#tͬ.AITG4шPNO:iYd4w'퉅jT ۩EZZŠxu@)GZRp^g :cʑ؟|rF`=S!ctʸfqFh\y+@V.5€CDMCDr2 W%4kL`%:k)?B|ҊӨ>tC^+qyc > /XObject << /im124 695 0 R /im125 701 0 R >> /ProcSet 2 0 R >> /Contents [ 697 0 R 699 0 R 703 0 R ] >> endobj 708 0 obj << /Length 709 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsRn;ӂ$$')CΎD0dZiu D 7zCC"p/#ĺF:^=V>O<;az$Dn gREMU&ta*_xCw9 endstream endobj 709 0 obj 176 endobj 706 0 obj << /Type /XObject /Subtype /Image /Name /im126 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 707 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 707 0 obj 734 endobj 710 0 obj << /Length 711 0 R /Filter /FlateDecode >> stream H]Ak@_L4^KaMz`/bWYR؊^Y 6Fճ%Zh[|m.ֺb헡ҽW#> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 713 0 obj 734 endobj 714 0 obj << /Length 715 0 R /Filter /FlateDecode >> stream HTr0]: Q%y @k a0AlI ^"-MW{Α>Aa )H#H1S੔AtvMrDmmĈ`n%%+uoPv)(vZ~%g]c rsKGUMy0>A-GvږUc_,>$C}/mI,) L3KiJfKvKֳcI|W]w U^9ow2ăabI0Ő.(!4qy <r*Ϲ?9~/ޜm%ɱw=D<4cdp>dC QMUu鳓LQm۴Ul7(x0:ĐG@ Px Q.D!ljd!^Xx %,I;/R4@_ٷ=Y̓ptrOA̻ǒ⩅dp>i"!L{}W;O&fYlFgeS+χWhUS|3=> /XObject << /im126 706 0 R /im127 712 0 R >> /ProcSet 2 0 R >> /Contents [ 708 0 R 710 0 R 714 0 R ] >> endobj 720 0 obj << /Length 721 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7d6=,Pj(Iӄ1^ޓ 9 endstream endobj 721 0 obj 176 endobj 718 0 obj << /Type /XObject /Subtype /Image /Name /im128 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 719 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 719 0 obj 734 endobj 722 0 obj << /Length 723 0 R /Filter /FlateDecode >> stream HeRJAD:hڽ0MN8 dor!Ń$3Y"[3|@BBLU05u^ IŧsH̛oIh1j\3-W<|#_՗kþx+FNpۛÍ?|僾w{pRD`8053B3fiɽ`;0, Vw)qZ6 8t]sM+$ga4,(0vz+SSNՕeLUYy'%\TeE:u=RC9 ڎtm\Hl kX[c.tԃm,SݖxGA |=!+Fuæ_Ϝ`nS  r.֯(dfzl'I5>?_gVL读;!c4o_sh.G7 endstream endobj 723 0 obj 494 endobj 724 0 obj << /Type /XObject /Subtype /Image /Name /im129 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 725 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 725 0 obj 734 endobj 726 0 obj << /Length 727 0 R /Filter /FlateDecode >> stream HSn0僔%)Rhȭ0heaK,%"^l$JݝY~&)pZ9ج#L 0e!xQ@s)C`JP{~~jTWxO8wV_N I`+BHNϔE,{=DR ꠏ]ku]!HMNp0㎎~/X hYx?0CBI0lPdpiG7Ua'زo:Nďݭ#te-+>0H@}6vH\&Щϗ) Pe,A~*^ڪ1v5>XUynb8mO #ö!5p:҅3Uwl)Rʼ+8 ǻLuF*cNqAfʏLKg"WpI'^_P%B7.doTNgI 2ㆼU aokGbًcߍ3.쓿E7_u endstream endobj 727 0 obj 516 endobj 716 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 717 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im128 718 0 R /im129 724 0 R >> /ProcSet 2 0 R >> /Contents [ 720 0 R 722 0 R 726 0 R ] >> endobj 731 0 obj << /Length 732 0 R /Filter /FlateDecode >> stream H]N0 D 0G8Ԍi• P+zA$]i-{$YOh]"a(LAIŭ-qǺI}A9‹P9#Tcnr',GԯaPk|}}CAɻ)ǿ깆oOR:J 9vV0־\7M| 9 endstream endobj 732 0 obj 179 endobj 729 0 obj << /Type /XObject /Subtype /Image /Name /im130 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 730 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 730 0 obj 734 endobj 733 0 obj << /Length 734 0 R /Filter /FlateDecode >> stream H]MKAǟuZREz2Pרk"kMJbRJ"YQ%\NBlq^ Yv?\l]=[ZmuU_m꟰F@w,SjoR>17:q~zb`e&oUYY3Z}X%r&2Djف%vMQ^ J7).ST: !GD&&l!߱i2]XQ1ͫ_"(%Ewx;/eEc!tĊ;HӬÝd HJ0Mb!/܍#C\0ƛACEd\sTAB(oޕэ"Ztv0'f:>QO{dc%EY/xTQE]QX@)pN􅨣67fD> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 736 0 obj 734 endobj 737 0 obj << /Length 738 0 R /Filter /FlateDecode >> stream HWَ\7=&F8Y&@]?`6n;AgxH^ݮ`R%<Wwrjѕϭ8w>9Z诖o9N7RH#PRgٞخϯi j#F=fS~#)Tlu_F>NMn۩2G JAM`Iy憀xhRX!qm٨NtS[)G&0|:w-p@_www9Ya:I\>PL2w?/֘ضM ɱ*Mj,ٴAƔ|z3$*)txCWy''  Oݗpo^WM)G%ha1k$%dP|Ձ#~P|;QǫP o޽Jb by%u:alɕ@ |:Cn!8?=_$$HDQEM!;rm٠X53B-D^kvTgU\(F G>gˢH/ʐ6k;R-G&xFwuC=nS*` N֥ɺgZ xl Jgƴg]3@M?Fgg z)ѝ._Π޳\:x(|9 L/ZVΩ*]@w8QAϓahT#Z8PnMj2 {t0=$쑅96 r6ân>lb E!V(;jZ#posO:* )7{J QD dQ"&F7! _5, S:o::@Ԝ tRc.Yt4+QyB,FGh R=q$=r34otjtp'FKyHvɵaQwl+t!ar7ˇEv,,V8]^`7MѩXLLPerYwZV^DJيWbIY(e",XWą%Y+׶X(vXIQ= pJ#8#pԩ|@eC`--U&ż$)`{vJS)EI)M{ܢKAm#_ :o)4,,W xW '9xuAm);7g14}gsh70,VA)lGLsL=qhMh ѓ.\CdVPakX`mn>,/_& Q5:şL'fcc`ڃ! )Dh3>Y\71݉3Y;:idش̊d.FҦDƤ[ܨySG}7T0S#b5O$/+xRmPc&j+Kn?#ذUbԢ rI|D_sZY5XŷlN{)؏FseUTS %{@z W H|ư<ע}A0Tv@UEҾvf+KƼ#vHQdF+2[EV)+|aFԂg!Fk~0i1_ <6&WğONlrY^'(7-޾wZ endstream endobj 738 0 obj 2223 endobj 728 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 717 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im130 729 0 R /im131 735 0 R >> /ProcSet 2 0 R >> /Contents [ 731 0 R 733 0 R 737 0 R ] >> endobj 742 0 obj << /Length 743 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$Dnav=,P(Jӄ1LqY9 endstream endobj 743 0 obj 177 endobj 740 0 obj << /Type /XObject /Subtype /Image /Name /im132 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 741 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 741 0 obj 734 endobj 744 0 obj << /Length 745 0 R /Filter /FlateDecode >> stream HeRn@ WmJ#B"4u6rB‪z0Vd n|E|~VH=*eg'RKތ9d3{V7dAvnSFǔcW,R)mS>00>:zrt3:1pAntckrvnGC8Exޚa0D@xJ|t0@uǃoKl2< +◬j$ LVgkݬ9bHP5/e=/rb|S6bǹqZ`0\FAYmEXYTjqϦp+/ƍ[dO6vF?9 endstream endobj 745 0 obj 479 endobj 746 0 obj << /Type /XObject /Subtype /Image /Name /im133 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 747 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 747 0 obj 734 endobj 748 0 obj << /Length 749 0 R /Filter /FlateDecode >> stream HWYo7КÛiDnֵkwr٩l#g3ù^5h7^FڂS1x:@"n6 mz8tz<70 z3}nH& S'%_w 9jҵ6yiXd'X5g\$ "Fobgޙ-PAU1xuK[wwǖג$1FĞx7d 5<AѴ4|un!&x"H+X YNR @ƨ\=LU*"HKM9^5 &{/FdvK5166܂ uc3}J3 .e9VqL҆sðe{֦Ȗ9v>FK80M B'l/i.>$AT+`e&a=@[dp)/&(Z - v"8KU7f:`|7&efnRRf%Il\k % سeE<fjy&?F endstream endobj 749 0 obj 1088 endobj 739 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 717 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im132 740 0 R /im133 746 0 R >> /ProcSet 2 0 R >> /Contents [ 742 0 R 744 0 R 748 0 R ] >> endobj 753 0 obj << /Length 754 0 R /Filter /FlateDecode >> stream H]Aj1 EO;eU-yf&f`hK iI6!쁡 X ~_S"C3I2R1tu5B 9V~Co> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 752 0 obj 734 endobj 755 0 obj << /Length 756 0 R /Filter /FlateDecode >> stream H]k@ǟu)] S8bL$.7J %dz-#VWHhȐ%[sx .jw{߻> \kFd]?[&jmD.H+K5q# vk["aqCƏPCGR#?PTfhy' #?Z|O-CrGXuZ}eೊz;nA|c0xY1 )pvpA翾C"trYϴX`Qs<©Wr2Bx19^|2fm6*EY˪J KW4(둈z9 D́LTBjs%R^y)T#&Ilh/{%\ JU"pi]WŽ"הoʮL\FtwV܍ڋn.ٺ䴱;l endstream endobj 756 0 obj 491 endobj 757 0 obj << /Type /XObject /Subtype /Image /Name /im135 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 758 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 758 0 obj 734 endobj 759 0 obj << /Length 760 0 R /Filter /FlateDecode >> stream HUr67UARmrC>&!k> ^$*>e3ݍ?`d X~C2i$e!O! 6X1wْrQw8~ßj&S+${yT/uC`[#p@Vb\XU E>*SkidamFe^uF,^`xx(J%[LHy^D$p*;f{g/m9v0h:,tLB/ u<Ή,Ntf oclVBӡ] K ƹ~->@i\"4^`^p'3:GQ9%吲Z3)gH&8&jνߤ $,?ޣWe20U?&w?}#=<6,"fl%-) :Gפw3t̿%쓿އ6=Iv,\S4WeXH (^_3r-ǢʯRYNrem{qUmqv(2  E˓mY,ކ@cd2ƯH|6j-%<wtKu[}n-*yzxHV+KPťαX83s2g8~F:c vo:ds"<7pe9+qb|(M#{R:ue=勂NB_@&d1 ;NPV 7(tvZԼ+H+};)%1|]c?RV*` )'|;z=08C|;|*b%/RIA16784tICqa'Y endstream endobj 760 0 obj 859 endobj 750 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 717 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R /F3 152 0 R /F6 761 0 R >> /XObject << /im134 751 0 R /im135 757 0 R >> /ProcSet 2 0 R >> /Contents [ 753 0 R 755 0 R 759 0 R ] >> endobj 766 0 obj << /Length 767 0 R /Filter /FlateDecode >> stream H]A0 EO;e*ٖl.!in}J) ^%243 L$)So}ƚRԍARAчo*1aI&=O69ʫkjZm:_D $)tr5"XPFccZ|yj9 endstream endobj 767 0 obj 180 endobj 764 0 obj << /Type /XObject /Subtype /Image /Name /im136 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 765 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 765 0 obj 734 endobj 768 0 obj << /Length 769 0 R /Filter /FlateDecode >> stream He1k1!ki,$s!ĥPJҡ B s/OЭwܐ5A&K褀V$H?${nj~atog3mC{Qv툍==F4|͢oXu0#[NN^} l4zPKG^h=3 {Z``=k^@{rmwdy6x+SqJz[jfx_("P =czw޼ E/D.L Io*5r=q@FȮ"]!Sw:ӕsn_ ՚ i7jwRĻ*S(]rȧ9p1|4miŲ QZLP%seTmnKff׶&%Ӎ߮8X[l{'E>?7NQ4_Ǐ@زuvb6LS endstream endobj 769 0 obj 477 endobj 770 0 obj << /Type /XObject /Subtype /Image /Name /im137 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 771 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 771 0 obj 734 endobj 772 0 obj << /Length 773 0 R /Filter /FlateDecode >> stream HWr7 ~Ngkԝ^rJDGv&_ _nss@XV?߬UަuJݼ^^C :Poam+յ^`c&-_yUo?lzw9w/ۻw/^O+7LFRYA' wN.  ~H;k=JH2Z6/{do;~of6js:[h΢ȓ:G=:qw t۾|6/ D6w~2۸X{.:ڦG62plmK:̟_nVƢ>0T!ub01ʋLewB Tp#FUkG>']6=I^=t4&LuV\BsY;a|xSx@l$O=|cI >>!/Ac I&7b4$9eft~Ix$>OCJLWsɓunlJ緗r) buZn9FvYn H#.PRO.ڲ@i!7 ޹ϼp`A1_Hp.=@n!7 ޕ6 r_8sA0iᝁџJ g. zԥό^ H; v!IygJ4qӚt__ib.;րbϙEy ZZWHl{]RPNd85[b9qڋHH~600xb˔6ڰ0ؾ@%EInvjyˌ'ljK *m)ɳ8Ra!'IKhFq ,[QfN<3DG{CP@{ LHDDo!b 74!6emF6 @#Mrh0i@ k`?^L> !RP|^_#Dhw2-ҡxK35"6Uqǵ0Hv2=ӅUB-_py,5^u3lgZy`Alvcͨ%A+ZeD0_@P<+a my3#Jo-K#- ~[hxfeQd-_Z5~Hx2+ ~+׍T,iĬ>G= hC! nY刹Q+ͱ|~FM [)H2I=_&zK$'jᦶ6uY%98&~rc9.xgJ(ͯo!7K~Gގըu\ TOjz8lNP붭No!˔x8~7N>ֲW0sͨw{BLX~ZLM/pouYBX5-^WSUkޠLUtl endstream endobj 773 0 obj 1611 endobj 763 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 717 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R /F3 152 0 R >> /XObject << /im136 764 0 R /im137 770 0 R >> /ProcSet 2 0 R >> /Contents [ 766 0 R 768 0 R 772 0 R ] >> endobj 777 0 obj << /Length 778 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7l6=,Pj(Iӄ1^竄ޔ 9 endstream endobj 778 0 obj 176 endobj 775 0 obj << /Type /XObject /Subtype /Image /Name /im138 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 776 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 776 0 obj 734 endobj 779 0 obj << /Length 780 0 R /Filter /FlateDecode >> stream H]RMk0~m-B V7mݤP~dtl#(=P04Ȉi Ƈ\&IFGB#'|d{summV{m#HЧh&!mKіyOIpݳ/gG?|%.g0Esk(9rU)4naXDPeYD5=F%G੣8C4 ې%=ljfm2p1SA ]^~V.T^pQPJOGY}K(\Je\w^|DZegp1j&b; Fu-$^l̞ 8+Z-+;&WCFa VG:lf1K+f~MAbe*~қ=x}e"e0q6[{ݝZX<^NCCn/Z;a endstream endobj 780 0 obj 479 endobj 781 0 obj << /Type /XObject /Subtype /Image /Name /im139 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 782 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 782 0 obj 734 endobj 783 0 obj << /Length 784 0 R /Filter /FlateDecode >> stream HSN0~D=cw+ҲQ׎^SF3L pیHDãRPCvsOcSV(BCCy3vAZUƴ+ݵ޶{^]oF X{T.E 5#%[Zy}\Pu d NeP@|O/ Y7rFRܣmkg@;Vʃ:3!ț0Ќ3S> /XObject << /im138 775 0 R /im139 781 0 R >> /ProcSet 2 0 R >> /Contents [ 777 0 R 779 0 R 783 0 R ] >> endobj 789 0 obj << /Length 790 0 R /Filter /FlateDecode >> stream H]Aj0 EO;e*ٖl.MWv ba}I Od*#0q TL?֔VH:9^cP{rH2>~no]Kjz}C$AO[s 41ؤiX6r/o9 endstream endobj 790 0 obj 180 endobj 787 0 obj << /Type /XObject /Subtype /Image /Name /im140 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 788 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 788 0 obj 734 endobj 791 0 obj << /Length 792 0 R /Filter /FlateDecode >> stream HeRAkA~RvE0l!hnAJ=WBq/Woe&zt&̼{ݐ m{c/x{l,m :pV.-q#bȂ1H ,+{ɮ6 ZԺLe"QzQj<∉S ! wsُY#vRNBez.R4Z}V@dϠ]Dv_ъrzT̗/dnp.<-[lƺԊBRl V747Lm,)|Mf" 1AמspizpO'pjOƵ[f4'NyF endstream endobj 792 0 obj 489 endobj 793 0 obj << /Type /XObject /Subtype /Image /Name /im141 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 794 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 794 0 obj 734 endobj 795 0 obj << /Length 796 0 R /Filter /FlateDecode >> stream HWn[7I+|?EZnQDɕdr΃:#/ϼx8V?^Uu J]kWzR CA^6ƵޯD`E& tw?m'0Y{=λtKuiUt՜z)Y%j΅Dڝyw7(Q}'*fAU։o!FjYe:dh 1ź).n:}A,팡lλA}iNݩt~B3>~bMn[==!km,.w`B ?R f[SLJڜyK;)-9 \i sIA%d*^l=2ӱ6W0Dr|y-#k@4HY$S?"Xgb*G;u"U<n kj rc&<S$UGz2'{30i bNӶ$Gߪs 4!`Nf&LA,5ˮxE;cҌnOH8Q7(.DƅP$kJYwF1(>KĒ;n:(CC;U?ː@قCFRĘ1p`LvXSۅ "90EpVL䛌(M$Yx.Պ+0&O<6G:2ft'l*0}%y(jõJdhSܤE˰fz ٟ 5 ;8HJӳǗV~GX@SB Z e"1OaQƒVRK,byRye/H.8vQ+UQGILTrV79@N_sj >zȱtro*>h2M"AMNxOB:B09T#). ?Ɥ{=!Jn d6y/w{\ { jgR. t}_[r\eco^^%UW-=Ime$E ; մm_nҝE*NjcZJ=? [ iKG$o583\Qj.|ZkZѱV5TaY2~,$.d9]"Hv9ѷτvŸ豜Y &eԞKE}ʖdyܮK)Xf儔ݤIA^LD>+BJcx,y,44HyFeahxG;?΢×|O;ޟ!vE<44|7n9O7K Cccn5ډAq3 endstream endobj 796 0 obj 1798 endobj 785 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 786 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R /F3 152 0 R >> /XObject << /im140 787 0 R /im141 793 0 R >> /ProcSet 2 0 R >> /Contents [ 789 0 R 791 0 R 795 0 R ] >> endobj 800 0 obj << /Length 801 0 R /Filter /FlateDecode >> stream H]An1 EO;%,Idh- rQ@TgPUJ"? !|Jdhf,_L$)SLkǚRoA )Ц ݧvm-=`$,GyηH0&I9mR- XQƐc#c/Wqu'Y9 endstream endobj 801 0 obj 179 endobj 798 0 obj << /Type /XObject /Subtype /Image /Name /im142 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 799 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 799 0 obj 734 endobj 802 0 obj << /Length 803 0 R /Filter /FlateDecode >> stream H]AKAvq{)^ 蹮ѬQSln<"EL{]v}?zv=Z8\izih~ gxӟXr)k]_V)wMV)ᙰ6u&aGr.+ȍb6z Q%BEMR hs/_l,R|J.?i>H> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 805 0 obj 734 endobj 806 0 obj << /Length 807 0 R /Filter /FlateDecode >> stream HS͎0|wJ9N+bTqڋ71!u/mw%؂8r͌!{j9mF h `uݧB@v@=KVXu@Tpt#>qm4rvLj3i3_3y8{`@E l1^GN:XDž$ڱ [9=4,H)RGr&@ B1Wmh=_a9"hA73 a׽j KJ.9I}D=Ek,e}^IE6dY]> /XObject << /im142 798 0 R /im143 804 0 R >> /ProcSet 2 0 R >> /Contents [ 800 0 R 802 0 R 806 0 R ] >> endobj 811 0 obj << /Length 812 0 R /Filter /FlateDecode >> stream H]Aj1 EO;eU%y lo0%$Ǟ H _:G)IL)6X7Gx&d~? Ρ.o\HvaP^\sey:#/A7$ӽ,ԡ'e t(ھ\Eox9 endstream endobj 812 0 obj 180 endobj 809 0 obj << /Type /XObject /Subtype /Image /Name /im144 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 810 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 810 0 obj 734 endobj 813 0 obj << /Length 814 0 R /Filter /FlateDecode >> stream HeAk@_euW zĦ[7Kwۮ,"=Yz=,G[?AoMa=xšČfv[/HbE>"."䢭5/T%I`nʘd;UkBAl:pI& Nzy "ATbg2Z\`u6F bOxNDVҺB3sc=tԷ3eԟOJ2~)KSәl!܊g[ͅ~bnh2 endstream endobj 814 0 obj 497 endobj 815 0 obj << /Type /XObject /Subtype /Image /Name /im145 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 816 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 816 0 obj 734 endobj 817 0 obj << /Length 818 0 R /Filter /FlateDecode >> stream Hܗn0G9ƽOQA %ZzD`XkU_^laɡ[^?^EƭOɵ.K(kh}xV_v|h~Y^rzny[^ئ[).Ґ.Ї< cyB?0"Xcy0ʻr5wchcx\.O.yq>>1i^@o׏ >v:G=9ݿ^k贇ᪧ?_76Q儯'},l`zl^}Nw c4_oԾکٺ)G 6|E+}i˧_.be??/엿/a'->?!:n鷣o0EU*[#.laW~>+ }QBpSmڛ%ޫnW:`0Gܞ F/B簡po7M۩ޡGw)?cmWD[]#lPv؎)JcfEJS/`8`khv hwn:yt}eBҍ+Kl/)uU귡W{5:̗ L3̡C_[۱͵s:L[Y}\w' AhψRf2:.z10 s?fö"{ }CI`l{{6 vQ%m@:Ι; \YbcfN0z |6ћ#C 8h xaq2$vلfD(|QU}nT0I$iv *V4@AE*[oI|uD"EG\$)o9a9!JA鬡PmXfE߱0Œ@\tר>z#HV1Y0&rI^9oTCȘt3ULKd98?|oh7NfDUV T0tnL4!!}G'qEM9"OgCUMbgD"=ٯ0p),2 +Uaea0޾r~C3y,W) X(b8!/BIC(XP4M Ν 5+Qgן]h\QVM3_E/k&@)Ȟ=m;lʬGuՀul%2J^hbS%Q우RAMӯ4.G96U ̡Lu<0WSOM5z$#pc jd<툲:B[B UBX*)WpP=oEBJe](Ghc6 I$[M~"D ,&-9DC t:Q5w{<-q6DTM;VLkM%AKB?°%xs ~'g%a,L8hGѾ@gݕHg8!kE|AH ^$E{.Т.-,s TV5:x.w=!Z e2Q&IQsUZ0Z'jAWoۊ>z]}7]oFuV Gŏ+ D-7ĸ\ګ/#u#Z}( fh% E"$zD7Y{<9gx} vmiz*&4 DvYH,]| } xuu5wlR$c;N-%N:QrO#| ݂lV?a+MA'gܤ'@ё[ŭ9VM'_RǽUqnJ@B$jEͤ=n؅b'v1]܊`E$2!4G4W@*/ll}aR_Z|JG.16w)1}O4i5Hjt_B> j:OPadxK,D Zv:׈=ӎ6SI4^U*W'}4-'1bfqVhW#I : ̙_܁Z@;ן4ДS^wrDmX/Biĸm/.D@kgM<&Je,<} ۡn762mhcV&VQN`eE\öƑ@MB,]k`V]6XˬV0"}Յl)${AD{}Q#^vMRAG,`5ᕢ$Z~/eձ_W8 4.#`58M ۭp[ _Ϥ8(:t{5͑ض97:.S_\7$+-l Nt(t'Cv|'t܏ 4sc._6ZqC9E~Tk JJхkX9Q-[ _oaTUN@Cc12+b$>tkLTJgLEB|8}ռtsuSS*J j>KX?t :amy&h-`D056h%Ep£)I[ۈֈXI77k{#?7 0*fSdhNzD5 [;7 6" bNAǚЎvFxsDb1%=8UH"O\7sqo-EaL)$A1R1W%1"7-|/ޤzI~G ϵ9THVWY 9SmzƲba&--jdeba'f ogaA+aQԸaYG+X=Jl^5'9A%- f*yfN> &&3ZkU5]u[I&(Qgr'a.nRX.ztH-F,1gX(`Լq|Z⣥V~Y>j]OǾ}\m4-8 )d.ˋz+GBC/GN&|HK>|e)GM1GH _U?/]]lq"8^&4R"Xۀfǩur/"6NlfeG` -s^0&OMs& '8ǙHSDгs\p;psQ"Uk=XůMz{yX9|MLT+)}[%uNNQf qEHfg- KD[mt>[3ޢRF?N?{=Jo+yHVRRɣ, ƜEoHZ-]$Z흣(mE -j{VKrY'l+ؤgs&ݤapB$KCh#!lj@K/" pr;}&Q?$~QHv6C DnTd~tnJU?o¬>D푌䂹xHJ,յo%+tY0#ρvt60۱v\ޮ,-$ZOW&[|{ѸkT׸J>㾃~T{/xhf`Mmg#֘[[Oo:cCOo>*M,HgIS/,!~ՙBgS\f"RMT^uN):-nvcwHs;Y#TZkݟ# 2a=#r?6H|?-gd\KP/RlL$J$Xট] x3 |; .?#/N67HtO}oF/| 0Jcnu^>] RC=|K}r/I>ד=]wsٽ߷xu)9W[Pcw\__OGW?hr\uYxv-9{izI=j -;i^GdInsH8EWJh3l _w#IF '#ewcNZ]GVV,KZF8+^GtE}u{k7g#/1?iGx!E /%8H3=,gJˆ JhH;嵯9VmSҲ 4QzrA!}|%FD}]r7j{Cm4J(TMc?Ā ⒤%)% 3$GΕΐzgMdDmBM͞ȩ2B0\9a<fZkZЕa:R:+bmVMµbӤ,0ʂ4e:| ꂒ͌9W޹oxkdA~ϊVedj2=%G ĺqA^(zb.D3{2JB]CƳm? 4a7`Fߝ \۷nIK@t d.‚n y\,B%:dϾgJ _U pE5EP̜DXN HHEEZ䫦G^WV+J 7믘b-@zpa BKU響 s՞z/21U@*VGD,xTjvs3_D5AV ߘ}`SΜ3SLWs 3 unl2xG޲&QP3.x.TmZHip<=__cx%6'b3To˓h| endstream endobj 818 0 obj 6978 endobj 808 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 786 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R /F3 152 0 R >> /XObject << /im144 809 0 R /im145 815 0 R >> /ProcSet 2 0 R >> /Contents [ 811 0 R 813 0 R 817 0 R ] >> endobj 822 0 obj << /Length 823 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsRn;ӂ$$')CΎD0dZiu D 7zCC"p/#ĺF:^=V>O<;az$Dj24MT'>9 endstream endobj 823 0 obj 176 endobj 820 0 obj << /Type /XObject /Subtype /Image /Name /im146 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 821 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 821 0 obj 734 endobj 824 0 obj << /Length 825 0 R /Filter /FlateDecode >> stream H]Ak0ǟu ջ]6hݴqA&c-9J顇2mAF "9}kr;y(')n X{%1ѽݭ0`4w4!k[;;bK>kǂ6kPNXSN\|N8}IPffihUK{Il?epb`T3YV$-26^QF5;|܏z}gy~1*} kJ0Xt֦T4h#씏йXը֎VB6ٿj4CHW endstream endobj 825 0 obj 479 endobj 826 0 obj << /Type /XObject /Subtype /Image /Name /im147 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 827 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 827 0 obj 734 endobj 828 0 obj << /Length 829 0 R /Filter /FlateDecode >> stream HWn~ÿHse9) xNlxtw] ް!W/u_]ewDWN9ǻoxs9'RK'ח}zcN6ܾo"[k_|ۇ7/wn?/Wx|[BG8}{ ǻLx-+J^Eݏ9Ǜ뗻ږR)TJ~ϯh?ǕϹ>@F9yWY A0k»Z Z`и9t'#@}ǿ\ qe~9.3?fauο"~kHkkC6?;%u:rrʹ<&!7U~ .pY]@w%YF,j S-Iw?r<>1C'fPqx[Rߎxx"<]}c6`ۗۉ2[uqgg];8×D91q=_/7.c߽=?=^ZˠEs1(*"Q"#;_a)CNS:p(@Vn{QJE*Q=]H?׋!|+evjȱ=B-1[uw7Nӏt)l?daOH4<>g7DtN5}lhi<'{ePvLŊ:Ӆ SEb~աKζe/[ciY L`#'^YߐF`Q=Y! iR5-P@ :9̧6C±ѦƎ{9>X, @Vٍy,JnI6Icv"Lq,8u Q=3DH}BZth`F}+2]+z*+PkVvX_gD3#z 8Ʊu&H cٟa-!pL=?M|X+{-Cs܆tԴQ\< ͆' Ym|XM@ Ow(&v=J4ZgY2"{F8ܙL$[Z׽ u bAq.Rk=#En eP$DI3bOQe8*ܟi2>pT6čظ(Rʩ?Ӕ;. `%h9I.,@%C2#aY"Q@Z M &(Sʨ~ ,eO/ɬxJ]05]M*k{*M޳;_|M\AX|ѵu_K%/* 9[1ZĤj52<.*MHK2$Q+ЌdTBz^=n"!9P|n} _FA]A]AYA9q'KeGU9xniRp* W%jW8e>.bzfbuUnz]IW+أT%ˌ3 }Pq4]JS" KU'6v$..8M_ bEs#'=eXze >#;p1jj|AJmU V߸u[ܿ0k,(@>QpKuL]U Nrw B&(7C]5HoL=fCj Hs(]`鞤A \sAzT>>l8pR[:2UdZ@^T3 V gn Po@*.Ȫ,MQPfP'ohY_p*01+ nVp"jfvb(eVf@d,3*4aR(Lyd"MK (,PjNV_P]jܲa: $uE0 bo]t#_l X.ejIMc`?$q7`b[2؂!'  )fTf a~dy z"~ݰݹa"v]@^ x7(/v4>v3΀'I4.arM^rúIR3ib_ U!?tOiGLtJQXwpARv-EJ3ՊyE{0بPZBho.qQ^祕fۘ/L s ^ݙu<K)@/,YqNFrӋjDdV[Hp;eI |FT!{V[.%r I"WJCf9Cf",(䃢jT}aqVyKR#e5?^HXjA}4`ո>)NDN{.vzؓhM'Ơu|ФwRFil B*r-*kPTXI+.5Ӗ]' +}0TLX^Nʋ _J+3o |Ψ3=]7 JA"7c֪]@R> ] X^HwYB-̝ N$u\ECu)(n5Vx,}AŅ2 S`zoxc-[&)r5zjRo#EIT? Q5fɍ"WK=`sP5Z4b |?M^O*tvnExAGtDS$e,E}\[Q2?,|V/;]"45T3Wyޮ0HĮFY}oRtj@x*k#|ss_ js Qkک*)tWH7U`v6o*SSe}!ѻ9-dpdnp5ŖHg;~D-A==Z?"W [n|`O΅t7BH9js5u.N~=Q3zd-͔8:]8!tP&IO68ǤٰQ"ƈ}18d>򅑡KˡMcf.Z3/'MDX@V'NIJx۵ ߊ{T{yO ۪MX뮉4ApbuN&d ]^_U+r{qis'CF!RNb%U¨ؖ) ^my@{Yec}d'qwpE諲v/an3I}Lf-Xz,Y>O~n磒bkt< \&,4dgW3 zQ=]Ze  zTRvW/b2OuF>m72G>ByPŰ\\!H+K>f$kgPj: 3 5p(rMq>u]3,=1=OVz<1mD"ijZU|j|FS)ސH+lX 5u%V,Ps\e$<-^T@'jJ`EN>Nwg,'n!lBd(GL d4=b5=C5^YFM^<˜^uJڌyp=Ύ'uE@_G??w;rYㅣT$vQPՖW@I-,befjv`T9D$ީ{ )JHm] ҋNY<4u&A9{SWjn}DtLUpW\.1Lbig$;/Xm;h"Zi9 ZVq ^#\!9pjBZl8_˪Ol~vP'Vg1TC ͻ@2 ZFў vNh)E &ڳ?țV jlj4aٜdq+O 8 :HD+UޡyADjy"k#"e]afaKXf`w3h/ ɠpF/ 67>nr/2q)DÙoE:ߠ'ͱ  't. T3'/^l AdpGKR?~P vg.輫KY}"%%AV̓Az {暉̊dA'G-΃_ߎl}"$Fh.]i WhI8UjXDȠut( :ammnʏT@VCE9 %I^BEjX%ܲs3X&ɆnP_Wk_6KCGhuӜA{ Nw'TۮSΦsS~\10_1Ыe!soC}K8?nYh֋ xC,,r#LSs๻`**䦰ӭ/s_54+c3jT7p#8"9lEnNXZfۭShGe>fC- UQ+"þoZŠzV=nbh+!WR9%gاZ9<)a Ȩ"dԅDH(Jڀ i89c3}&X !ޒƯ??(m endstream endobj 829 0 obj 6324 endobj 819 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 786 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R /F3 152 0 R >> /XObject << /im146 820 0 R /im147 826 0 R >> /ProcSet 2 0 R >> /Contents [ 822 0 R 824 0 R 828 0 R ] >> endobj 833 0 obj << /Length 834 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7=Lm{YPF} =c/WݽL9 endstream endobj 834 0 obj 177 endobj 831 0 obj << /Type /XObject /Subtype /Image /Name /im148 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 832 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 832 0 obj 734 endobj 835 0 obj << /Length 836 0 R /Filter /FlateDecode >> stream HeRj@E- . c)V쀩ĥJ%CCQ . zrXʲ!!ӛռ9O@ڷ hV \W"hsyX4I[>.98z~zo|8Aq$'W8N-zpK޷[Z?֭kZQѧ;[`!]Re"z\e~:[4,R`4coٍ!)N"g&7E*uF!S S53ݍXxij3C?JD4Du(XjG`,4MV;> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 838 0 obj 734 endobj 839 0 obj << /Length 840 0 R /Filter /FlateDecode >> stream HMn0O;,kdע iD4/ERM+罙7$'I`s Qe4^!@DFk$E$w]'շCW) 9: LX>ˍ0W1aM>x57ąψHȴU4JJl\XΗ_tvu'Ym%nMC>xg[Ե'Y3h% ;irRrkmʅ8/E645xx~"|E/8ļ!4j>ކYd|nelʂ1X~CaZC|]))_KKdi}S6WoA|f4~l9+ks\nn v endstream endobj 840 0 obj 585 endobj 830 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 786 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R /F3 152 0 R >> /XObject << /im148 831 0 R /im149 837 0 R >> /ProcSet 2 0 R >> /Contents [ 833 0 R 835 0 R 839 0 R ] >> endobj 844 0 obj << /Length 845 0 R /Filter /FlateDecode >> stream H]j1 D0ȶkCK[RHKr HHz3H_ѺD2qg0i%&ў/b@sky', w0ch(Wҵ~8" WǠCєWjWC]Lrn_j\9 endstream endobj 845 0 obj 179 endobj 842 0 obj << /Type /XObject /Subtype /Image /Name /im150 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 843 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 843 0 obj 734 endobj 846 0 obj << /Length 847 0 R /Filter /FlateDecode >> stream H]RMk@UI6RrJQ삩%ͦJ %C趔KLG[鯐!^E.Av?2bVOo̊glg{KM[9>#xC m I =T[|>=>9{=2ȕRYD2W4Zq É ?Hc%WmO,DI}7F\X # 8*,kF;^^{c"t%Ӣ(-r39+B!=Dٟ _EY.pStNS>flʺe]EIǰ^+m*ث؛h9b2AD Tם4.,[J rdEw(`Y=] جKUԫX5 ϶uB Tc$ܐґ4Pj+L۵M֤&? 5^{XfӳV"`S endstream endobj 847 0 obj 489 endobj 848 0 obj << /Type /XObject /Subtype /Image /Name /im151 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 849 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 849 0 obj 734 endobj 850 0 obj << /Length 851 0 R /Filter /FlateDecode >> stream HVnF<:@M}I-FIėN`a"1I{foRۗ Eigg9{Vqi׫S$ZIP( rfSӂq|1Pm_ ݮ l7[ӎpluM?4]?gNݵ7h1u5+svۭwnf+q;1:/{%<9.ɭRJl#m a%Q_n߬ nCc9#6/ٴ*T_wV܎Pos_KJSLN܈-JcJ4v -gL9O%{deP~(YA*# Sk\ڢBܥI\MuEyJGLw"U9%$pm9{|dlYR?~8BLpRDw} uلʹ@ 4|ؙASkȍDT#EGU@{bȅ L]%<.wS uNrv )~<ﱭÃʅ1)SAD(8Vx*",Q2[7U5VFR=MY0Teh`i33ؘj07~\n'CoK@BJ@:3:4mrSڈ ^+L;|cM})tΦs F-Rh J¹$+o(,'qzwF(a# %k;\A G(|wp|;cA@;dW]p$^~V WSgR/ eV÷ֱsfE;0S}5e8^/AUp:> /XObject << /im150 842 0 R /im151 848 0 R >> /ProcSet 2 0 R >> /Contents [ 844 0 R 846 0 R 850 0 R ] >> endobj 856 0 obj << /Length 857 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$DB{YTQF} cʗ$9 endstream endobj 857 0 obj 177 endobj 854 0 obj << /Type /XObject /Subtype /Image /Name /im152 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 855 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 855 0 obj 734 endobj 858 0 obj << /Length 859 0 R /Filter /FlateDecode >> stream He1k1ǟ抩ⵃ4Bsq]09'qi5ҡRL E9ҏOЭwxȚ%tWOρ Nxrv7pmoZډ| g坘E/yfbQ-LyYtGã_>~c>,#2ɌWc3t~-[4Цg^@%C!nMb`yu7)G{yYZ:$'z 9P*(@US\-Urk=MYHT`j2S)5h apQ\j$ܥZLY);V2rYaJTB7ƩBp*F^2ө(;((Tr}|n[1ZvmmŲµQ9LP5al3Kzɓ߾184_OR.}^=n2|P?7Oنo'C!r endstream endobj 859 0 obj 477 endobj 860 0 obj << /Type /XObject /Subtype /Image /Name /im153 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 861 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 861 0 obj 734 endobj 862 0 obj << /Length 863 0 R /Filter /FlateDecode >> stream HUn@<Zm#IӧV--Dc q@߻7L'l={朙/"EAP+00FF8`̔C ^A4&@eLm2cL4e93EH}|4T:a*_U +Ȫ%7EU1BK{ &D7(rje֜@( Ea)?p.] 7_hћqL$=) X(&S$uR, 6irO;N>-dOcv Ͽe@|a~~rz ނQSfn\&Gr+#/InBW\uo&ݜӚKYpi$Ŵڕiu_}aT<'3mGa.#y@B!Z8 e؍Qk!ENٛtF?Aifηy LXڢӞ@,kCU3iiO7@@Vz4+zYoV_gDÈԱԒ؞9,#f}550o&2\@i=T~& hb2D*/`($N/\F֋ :lUQ?u34ؽ$ainnڄ#K9}JNۇMl~8~?qΚ$`n]uIْ {כ$}Wvql;?~jVLډ?&A` endstream endobj 863 0 obj 752 endobj 852 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 853 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im152 854 0 R /im153 860 0 R >> /ProcSet 2 0 R >> /Contents [ 856 0 R 858 0 R 862 0 R ] >> endobj 867 0 obj << /Length 868 0 R /Filter /FlateDecode >> stream H]AN0 EO;%,jveAnP*RgD7hnOJB// sd2w|&N`J٭.qǺQ <3P gӋ`lJU.:#Wpv1Tki|:^o1aozN=rC&2&Ʋ/ML1/9 endstream endobj 868 0 obj 179 endobj 865 0 obj << /Type /XObject /Subtype /Image /Name /im154 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 866 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 866 0 obj 734 endobj 869 0 obj << /Length 870 0 R /Filter /FlateDecode >> stream H]RAk1~QZontW(ڮԽA{:p% 'NO>;>G0C{wki9zz J gHmH bmߊA pQ?onR^-J4䙀L. 8:Q̗$W_r*K]ԫ Nj{OUmRJl[?{VSz~X祊SުB25땜}J: ooݾ(,Нrjp;<'pJM]_SP<[\_ &e|P۵XLъv#,EW烥~~|Om7g(b? p endstream endobj 870 0 obj 475 endobj 871 0 obj << /Type /XObject /Subtype /Image /Name /im155 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 872 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 872 0 obj 734 endobj 873 0 obj << /Length 874 0 R /Filter /FlateDecode >> stream HWn6Ip'['ǹ(mhcߧZ8&0`W\~M']#[i5;x<ݏJhj4{lvUhHŨ*:\? a~-?6Ȣ,tZ-QphZ'$( 戬8bA,@|s!>UZ@LQ 0ćM4?Q'Q|~R{/'Ii8oJ PJ m|$E%2D)+N )d"c~VUk,FP:՞NFl"W,Lg8&8ˆTb|JCp":H*2Im*,t"af%/u X 6 "k-|@7&_r3҉dy.z?ba@<2CT\J ̊+:G$Ұ(Mc$-ZopGqV]a™Eh)1!CeoCy$n4IgIU^y<r1 %8!$&$|O~lI=^y" Ǎ<[2?F|ueT)iЊs#)-leM6=asl=x"9»b㲄7X p\0`W.O+5ryWU-FŦL1`mGh 55tn1X}+$:Uu{*Uufe@lAgy[[f8$0t&t,3h IQdr`S{f'%_ٺODK]~s̞(|MeLjKku6Lnc5I<.`gz],&W<ދqf޸ {2),d$Zn_F昖åTڳ=> /XObject << /im154 865 0 R /im155 871 0 R >> /ProcSet 2 0 R >> /Contents [ 867 0 R 869 0 R 873 0 R ] >> endobj 878 0 obj << /Length 879 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsRn;ӂ$$')CΎD0dZiu D 7zCC"p/#ĺF:^=V>O<;az$D]v8 *h4c SrD }9 endstream endobj 879 0 obj 177 endobj 876 0 obj << /Type /XObject /Subtype /Image /Name /im156 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 877 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 877 0 obj 734 endobj 880 0 obj << /Length 881 0 R /Filter /FlateDecode >> stream HeRjAv;,LE03욬 "ărdr|G sG谗=v Fizb W_tWՁy E-B;aWlw7Bqx"ޘעr\].^#Ft0rOLJG>#,짵gsZ{SCi/l`27#M! I_`_cik}LswpO2rcoe舘):@l aՌWf "/-ʁB/m^&^a5~_gQ1TT˿̯sݏY#OeMܖ?gmeiګ\C@Xfj&`cJdQ[&&Nʁ)SI "FdY]F]lֲԊy!Au@V~A+-9lK,WE4T.co -y t85WYtk6- endstream endobj 881 0 obj 483 endobj 882 0 obj << /Type /XObject /Subtype /Image /Name /im157 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 883 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 883 0 obj 734 endobj 884 0 obj << /Length 885 0 R /Filter /FlateDecode >> stream HW͎6~Ik/m&{EZ޸}rf8%'KO֜hX_Z8 qJV(+dejw!q'VwоZJyW&:t^ū?k7uty-EE:Dg߯0 r(VMHl>M{9 '&u 4G7!-7IOl]ՙ#oiQ,|c6&ҿc^ pt-_@c!`xA(Kfμ^ybѩHm&,e--/_(#`q#P0߳=ȡ/e9߳j|Ʌo"^<7.D=`34]Ro{2wTϊTATڌ!Ki F2g 87-;?wEq{mN\|7$OTrkK=LQiS;KqK{f8Kw/uAۋg,tf:@O]=S4`FD;zo@T3{*?|bO/~d==EJ)Ӈ_Gi5@){gf(ʧC 7sSc{ئ&a,IXJYkG+rLILf&%r4zztoDW7ř0lEtrkyOcdU{ט*v53? hY endstream endobj 885 0 obj 1583 endobj 875 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 853 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R /F3 152 0 R >> /XObject << /im156 876 0 R /im157 882 0 R >> /ProcSet 2 0 R >> /Contents [ 878 0 R 880 0 R 884 0 R ] >> endobj 889 0 obj << /Length 890 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7=Lm{YPF} =c/WьޔL9 endstream endobj 890 0 obj 176 endobj 887 0 obj << /Type /XObject /Subtype /Image /Name /im158 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 888 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 888 0 obj 734 endobj 891 0 obj << /Length 892 0 R /Filter /FlateDecode >> stream H]Ak@_L4^Ka3~ep,ct+5~|QF KsQ{'3)xH@wwX4Yz`*!:+)zi+>ɿM>q?ϧB)Er(ҮgӉ*_tIcU] M;tBcnx ʨB1U7^YĨV8\ZUb{Л7uޔ|~?]eIb+We/hX/{U6hm žXzů_J^-C7Wn4^ ;vח4Gh endstream endobj 892 0 obj 486 endobj 893 0 obj << /Type /XObject /Subtype /Image /Name /im159 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 894 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 894 0 obj 734 endobj 895 0 obj << /Length 896 0 R /Filter /FlateDecode >> stream Hۮ^7ǟ`ú$>.K HJ@I[)<3j>f^x񿮧?zʡ5_׫Oc-y+;n?ݾ5?ߍN2󧏯__o^݇?zÓsʿz)}x3|-q}7a ~ކ3L6|fr0FwT@YcѲ,xfwxE߬Klp+#k/W~ =Q}KHNzWӻ6~מVt̢Vsyd˟8ۂ?TVDӌu~ AR\( erޥK*J?޽y?s܊AЇ# 4rКYJߎ,5ԭ=E$r"", g+]"&´ Q1P9&Hy+$/O ƽ3/]Z6)&MMWIk[KqL8?VRJ 5ι=ɴZc[3/n k}D]K4cD*Ջlpl(c( kA`(wE&<ʔhl>UG) 13M{4xPf󆬗WJ]qEҴigvJDs4xxM~y^|dX\ ޓ+}h@}EU)VE+zH=4LfM|}̛1,VY.s3D3de׌>wTijr`=tt՛x&r|nArp#W2t[HR,4~ęSg16TW>#F#:abtdN8ā٨("hҎ`2\#X3f[.~8qO(!5M,MVl$8VfN·jV~AA^#NG ƄPon$p$^oO}ԏ lQE3twT"-1dq_}S?qTV #)tTZ4Vx^bB|tEi_3A?L䐁sO*K)Ak4RwHsjj0szHp8*}cx&jQL REIu;Q- 89b1`P髡'gLFVQz 4\>C nZ0p͝)X? :l[EQJ"C;U;Hz&=SZCWHqR&`< ry` ̷bri:e*C"gc*m+:Spv.*&Xu.EV\F}olAf뷮@/ȃtS^VGNx`+w˻>cfs|@‡upcPSPETYVCs꿠J f)v vW[*]F%!8𓢠50AӖqup a'I .cRŊʑP2GBfwY:P.O@pډ' Y v[ ;K2cedoCI|& >t%*!^ܶփv~~j }ز|AXE\u|ΐÇ qK~02ɱ8 tZ =05 `'"3?ދ!VB,X,柰C#nx]!=xԍα+G/䒽ꯍk,`!NO}WTqv暧7n$kڑh-֫e7$7x#WF'R7۬dP'0X-M1qhM&X9^đş:_2ڹ=}fsQ 7<.Yt@1o!W9B4.\< zx[B鞓ys_5,uS"\lޘs]p#==Vm)l|j3e``E{v~Oy5\ػ:-$16 -#tYVbf=&ƇתjdӛN ikhAA_ho[cRY'#dCl|AGJ4pKF6̵xEGX#۱mΠ3.*yQ& `?>TF_)/8XsG%#k3biB#:鰀#&#\T`{o1V|Te>#]}[l^T@ޜSx $#H$k%-i.x=ۂnLcQmwFț@_//\5)5:+gc&o@+\/]kAapsRAtfɎB͍=lgM5& \)wFZ&~jpRYt#|]<=y Ή4 BA]xQ>q])Fjf6D$urc*Գif.U+~|Bv `]LXǸ +Ec{$ 4. fO6j}XCݱkZ62K.hNh]` Ma̠$ݨF>40wO@rD&h. p8!Zsi5E5]i[.:&h͖Qϟ}(3ڮxf`dדm|idtd fUoxfny|; :-/ב1I m% t|9c) ; e]suNj-mTj Yzh5TԴ*iK eRCuYS + pe[p"V|RB`LjS1yJŶM (q96q"1sX@[Ri)M@F֯[f^M'j⾪]`KFt-&0n'.ѫ76u]?eAY'dRQ,Ҹ;2 q_@#m 4?-EZ}DJp@ NoΔUqʲܠ ޹L&)nC;u># a }fɝO1\VՐJPJd]`fowd15[t\?o1r5_;h1\L0gY9&0ɯ'(cW -{@7(UH0$Fy kȓh:2إ?٬=mn481GXTZ) c[zF.ޕV}>]MEmA#vXb'dO#Myg7nHA/6Oq8.H %Bm 2*(Ht}=qO97|QjЌ*r;a-B!&j7WM,$vhW Vv(h7 l4Y;l}~hjeOtm>_?AS >,ZVt]ؘ 66f^DW||~v %bYpg˥|V#pGU_"pDу5R:E`)pV0,YpǔEGAI0|KzN>'=ѕde7Q=һvTֆwEٶ DnDy|®;$ .Cr\!=n%8_kz?d+Y9Y+Bb)9G3 ZJD& 43_-OIrPe< `LɬAC;F 9)ɒ‘T=d8X%m\hto?EeN yk+g s2F٭%ÉR:5@JtTSA32.-(iiɑ,Iw Mv'ud{=.hn3n?FF]Uv-'e`^gH|5Z/iM|`#eq _giB! g:.Gvo)U{IM6O4E}wpIۃ%ӜֺLZ}2$H 5ӺA-_iy}yRC^glgg8F3e^ q!;G?~ߥr,ʴΟ/14KnRYdIR;WRt ވly||/͏/uʠ&>>/?k֯ώkWnym&_n)r~iT( e!, 4 O-@ (cs#ifl Wt Xc`l$_BPU >T endstream endobj 896 0 obj 6196 endobj 886 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 853 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im158 887 0 R /im159 893 0 R >> /ProcSet 2 0 R >> /Contents [ 889 0 R 891 0 R 895 0 R ] >> endobj 900 0 obj << /Length 901 0 R /Filter /FlateDecode >> stream H]j1 D0ȶkCK[RHKr HHz3H_ѺD2qg0i%&ў/b@sky', w0ch(Wҵ~8" WǠCєRVjWC]Lrn_\9 endstream endobj 901 0 obj 179 endobj 898 0 obj << /Type /XObject /Subtype /Image /Name /im160 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 899 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 899 0 obj 734 endobj 902 0 obj << /Length 903 0 R /Filter /FlateDecode >> stream HeRAk@~1i2xĦ[]ѽYD<,=P4B_[r^JOSPJsL3_yߛfC.ch%B- Km 6KщyTm=[M +4ׂGE45|g>qqq!/CTFx 3&'4wn@ IUkޡ!e9mhL[nsw 5J:ӖK F9Ұ@B}]}駠w4,c%UO%W588_Ru/, MKV]-JYqlIr! !$am]Hǎ=95$Q tGBj;9e{o_V`v q9s s42˹lXZO~|B)N_wOoJZis?N'p-fg7WѢ}vw7 endstream endobj 903 0 obj 493 endobj 904 0 obj << /Type /XObject /Subtype /Image /Name /im161 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 905 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 905 0 obj 734 endobj 906 0 obj << /Length 907 0 R /Filter /FlateDecode >> stream H͎0Fwj*6LU;Jɲ$1&2&i޾D3*E |}w>uT0L$XHBRI"'BBt@ =F1IhQϕ?Dh6<'vmo+=o-6hFGX?E<p@ҁ]@K;`'F5aK+CArrO3,%S@c9A#~3)Z&|Ŏ$KXJ:g|4tby< 39wV#TZy}+0-h3UP1cI ^0Q^!> /XObject << /im160 898 0 R /im161 904 0 R >> /ProcSet 2 0 R >> /Contents [ 900 0 R 902 0 R 906 0 R ] >> endobj 911 0 obj << /Length 912 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7=@.&Mzx_bݽ9 endstream endobj 912 0 obj 177 endobj 909 0 obj << /Type /XObject /Subtype /Image /Name /im162 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 910 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 910 0 obj 734 endobj 913 0 obj << /Length 914 0 R /Filter /FlateDecode >> stream H]j@2i.uS xB8lBw m"RBYN(*X%*ᅷyMJt. >B_gngh}k lojUlKF;?f̀oYРaըf'RN[>vqvf` qϪ "[Y},Ztit"BPèwJ/xjs)*cQz^$&Z{l!R4ooXQ0ͫ_!C(%8!#G(:)#Vazf]$;dNbGEG8Fn4 %x1n cnD=0TdL89HM$D=](B;j' rw.:x%+)z\涠:. N݁s/D2#h笖 -Ũt*G ym~_m_\[r endstream endobj 914 0 obj 479 endobj 915 0 obj << /Type /XObject /Subtype /Image /Name /im163 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 916 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 916 0 obj 734 endobj 917 0 obj << /Length 918 0 R /Filter /FlateDecode >> stream HUIr0|0Gʢ /CRY` S@Vb(;$V}dP*+ ՌdHKQ( =.n(0lA2ZP5?2p>͙(V=jU ?t[t1Ya.nsAtY$@*ɸ֍~ 6  tҦ :c`;|U F6:!b,LB\\7bI]|"wl)åexNaZ '_,h³(?rղm# 1 ,)gz[̪VI~mtPQr,7go ?SX,qͽNQ4L)#E6r{etW//W@lyD@"I„Q‹=yVhIjkR[RX}94#nUwPJqcǘ^B63sQLKK~Ϋ1/ʋp{3I}?p bo0%M跘?uSvRzXd_әd֛# `Bѝ݁KZģF=IQYQ%q~Nv L|g~B۶ʺhm-7cA0.(ŏ˴x֭J.xfAS`/탊)/nd(ťI4|_g8LV?f Kx'!radi: Deo| Үڸ/H)S675OY6K{lD+_z= _ endstream endobj 918 0 obj 813 endobj 908 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 853 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R /F3 152 0 R >> /XObject << /im162 909 0 R /im163 915 0 R >> /ProcSet 2 0 R >> /Contents [ 911 0 R 913 0 R 917 0 R ] >> endobj 923 0 obj << /Length 924 0 R /Filter /FlateDecode >> stream H]A @ EO0wK]4&3LօsR݈w$$')5_t c L!eڶ)y[X"r !/c'VܑDb]#_bMAyq Uu>O8az$De@&*M:0/I,79 endstream endobj 924 0 obj 177 endobj 921 0 obj << /Type /XObject /Subtype /Image /Name /im164 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 922 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 922 0 obj 734 endobj 925 0 obj << /Length 926 0 R /Filter /FlateDecode >> stream HeRn@ WmJ#B"۔: RԄ6rB‪z0"E~E|~VH=*eg'RKތ9d3nȶvnSFǔcW,R)mS>00>:zrtot> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 928 0 obj 734 endobj 929 0 obj << /Length 930 0 R /Filter /FlateDecode >> stream HS˒0aX <|O(BIr$>#Xv/Ji})  )N_2RNK W%Ñ a,'eg x&Ux~ͺg@QOΙQ?>gF xl#Z'YZk<3x n}w~@kT? W`n!DY$uUovY8gzL @bWa~\sG.O ObC|3W:ۯs7`Tʍqi?F=%_zݗr /˹ЎaPc`f {%=K1,eYoM z\EMKw7cNV5sTM>K#f|!W9M0:v-{WS?z\x:*E!igsخl\wsb@;t|+3Ȩ2)p@R oalYj3~%y1c s$ۂ`yc)b@ endstream endobj 930 0 obj 532 endobj 919 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 920 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R /F3 152 0 R >> /XObject << /im164 921 0 R /im165 927 0 R >> /ProcSet 2 0 R >> /Contents [ 923 0 R 925 0 R 929 0 R ] >> endobj 934 0 obj << /Length 935 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(F HB!"Z\0N<8HSHuǚי^'a(oj+ȍCB*Gp/,'ĺD8Vgoxrt0I7=ԦJ et7i3k|3 wO9 endstream endobj 935 0 obj 176 endobj 932 0 obj << /Type /XObject /Subtype /Image /Name /im166 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 933 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 933 0 obj 734 endobj 936 0 obj << /Length 937 0 R /Filter /FlateDecode >> stream H]k@ǟu)]S8,L$.7J !dz-(#VWHhХ[sx( .A~H1;}݉^w7mTfpc+ 'uHZ_ ^o4!ICmyCӏg'/pCķPc)cK?T iy&5F#?@O FCGXxJ}dಊz)vA|a2x18HQ ppAWW?JEZfE=U^rRDB{'N'S!u6 qҶg1k Q(J[Fxexz3ѐ/P8a9P4) ޹(oq)D!+i+U xiYuh/pgd]zJٴ̫zAP2} "פ_ GҬERth> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 939 0 obj 734 endobj 942 0 obj << /Length 943 0 R /Filter /FlateDecode >> stream HVN@e*H3o ]%,Zq&ʱSہ"xf<]Tjǹ{ G!Ndrb(!Phz4fX m%ElRz}!gl F"Dbe浼(@G$IeScѦ oZ|s:5'Xz0%5xa]$ W\K:Η7lԆSf(婲,ʛш[ڪ@ߛ.l'ؤOo8l1:`13>t::ȁ FŜ3O1MGClt S^pxw D!xB^z63tjS /~^ghHP?~2:=f endstream endobj 943 0 obj 885 endobj 931 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 920 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R /F7 940 0 R >> /XObject << /im166 932 0 R /im167 938 0 R >> /ProcSet 2 0 R >> /Contents [ 934 0 R 936 0 R 942 0 R ] >> endobj 947 0 obj << /Length 948 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7=Lm{YPF} =c/Wޓ9 endstream endobj 948 0 obj 176 endobj 945 0 obj << /Type /XObject /Subtype /Image /Name /im168 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 946 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 946 0 obj 734 endobj 949 0 obj << /Length 950 0 R /Filter /FlateDecode >> stream He1k1!Ski,4g;rvxkCPL E9 t';nȚ %dRW+Oρ OCF1~މMCö:27G֍hx  kagF#} lzP G^oXLљf=n e005/ڽ+qG|Ĭz-O%}a=-5hl/aKNpTo^qe,PBe*kץV s2er=KZȮ"].wu:ӥ3n._ ՘$ I7jwĻ2U(]rp5xY7miŲµQZQ%seTmnCfW&%W]qJ676?N\6}^}n:ǁްl>o endstream endobj 950 0 obj 477 endobj 951 0 obj << /Type /XObject /Subtype /Image /Name /im169 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 952 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 952 0 obj 734 endobj 955 0 obj << /Length 956 0 R /Filter /FlateDecode >> stream HTM09fmvV9x gHv%{{ !JJɬeB2i$e!S) y|gMʪse9X*5,׵7KB -x gTF4e9:Nz6T^;w"(Ĉд(vNix2: :2 9>kҶEw<ш%a d2Y^M~Bi$vу68yUGyۙ:4~sE$P}.e(Jy1u2E^3}&bN7Dsb.Ĥ. ~԰, Aצ1M\N5Lȩ,igϱIc$%ɋJʛ\gc2݀+^*g¶`~O)h endstream endobj 956 0 obj 546 endobj 944 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 920 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R /F8 953 0 R >> /XObject << /im168 945 0 R /im169 951 0 R >> /ProcSet 2 0 R >> /Contents [ 947 0 R 949 0 R 955 0 R ] >> endobj 960 0 obj << /Length 961 0 R /Filter /FlateDecode >> stream H]j1 D0ȶd5l{!-)} R$^]"a=P4[_nc$ڝ޷"%#UQj]`x,C }LZ6|;}]GD昔|x(r^FI@)! fb=/Og-n9 endstream endobj 961 0 obj 179 endobj 958 0 obj << /Type /XObject /Subtype /Image /Name /im170 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 959 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 959 0 obj 734 endobj 962 0 obj << /Length 963 0 R /Filter /FlateDecode >> stream H]Rk@~QZB miPLmWZT C1zV6$ ^LaN؋xBAf f %(ytS[ݎ6BzzAA I i=vt[J×4}:?=;3(X<#XK)ѵʠE3A ՆuAl\cXqO:&D YÞqx[8탶AxTF1@߾L׸Tz$%xHT.*.B /Ce1|O"3d8RSIpʰQ_8MW'*`"IVZyZ? u̻~wQXOgk˥Nv:yҊM]_SPxX _&dt @ٽXL=ъv#,E`KK' ~лNԡ?] endstream endobj 963 0 obj 478 endobj 964 0 obj << /Type /XObject /Subtype /Image /Name /im171 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 965 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 965 0 obj 734 endobj 966 0 obj << /Length 967 0 R /Filter /FlateDecode >> stream HTKo@(=ٝm(ڦ*rMdhweǮT%k3=vfn\z!9#>a4PpuEPP@zSS I:iT6{sX~LavCF]`l gڬhLjH|ExoMh̴>6Ly;"ܧP*(C"5b\%FXq1׌lUg`,ɪ*8g9a1ql/\e9 P?_8$4eYW=u;|A*;g/jrf29]㵚hB + дsm`U..ԡz\Lt|K#*N } q8l%1]jHke[BuH^(ƣiwWWŢё?/*wFnxE}2DxɴmYm%7>B6YYj`CSA8f7Ⱥե! fϺC<*sp@-SM4)Է%ry}s8[РKXt+ Ω}g S9ԉF{Z Ezt[@91Xae!I˦668zT endstream endobj 967 0 obj 686 endobj 957 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 920 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im170 958 0 R /im171 964 0 R >> /ProcSet 2 0 R >> /Contents [ 960 0 R 962 0 R 966 0 R ] >> endobj 971 0 obj << /Length 972 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7=@.&Mzx_<{9 endstream endobj 972 0 obj 177 endobj 969 0 obj << /Type /XObject /Subtype /Image /Name /im172 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 970 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 970 0 obj 734 endobj 973 0 obj << /Length 974 0 R /Filter /FlateDecode >> stream HeR1k@~WLtc(Բ(rNzk(CPB jBL ,Kn?pO{{w;n7"F|'jn{C/x;l,m :pVFe万R 3 stdA^$bkC|-tQj]w2p =/RLw|ID)]分;g&,;S)'k*efX](ZH|HVAlsP.OU";ͯT%hESo*ry}|ȗx6Z٪<vg7lS+n I Z R@3ŶTSOpk2Q7P)K Vp2;V{:ޙGe989mG|K endstream endobj 974 0 obj 489 endobj 975 0 obj << /Type /XObject /Subtype /Image /Name /im173 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 976 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 976 0 obj 734 endobj 977 0 obj << /Length 978 0 R /Filter /FlateDecode >> stream Hen0E0Vj_qU%Tn"b 6c]ő9wf>,Rs. YZR$RԪX3)'-8O׮ؚKOBP"ah"GHe:f6;Yhz{|NQUBr2bsfF*_6`;;Rt :a>'oKB5SrRcMNFƼ@k;=kf {=FM:I/hA ΃5qp6[sq]:%{o.|9Q endstream endobj 978 0 obj 307 endobj 968 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 920 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R >> /XObject << /im172 969 0 R /im173 975 0 R >> /ProcSet 2 0 R >> /Contents [ 971 0 R 973 0 R 977 0 R ] >> endobj 982 0 obj << /Length 983 0 R /Filter /FlateDecode >> stream H]An1 EO;%,؉dh- rQ@TܞdPUٲ,V !9Z0e,_LD[[nc(ڋ \ SwSP:J&gpHĶEf CCyu]/oxu 0I7J}rG.2F|m_=<9 endstream endobj 983 0 obj 180 endobj 980 0 obj << /Type /XObject /Subtype /Image /Name /im174 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 981 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 981 0 obj 734 endobj 984 0 obj << /Length 985 0 R /Filter /FlateDecode >> stream H]AK1tK^J/jzihv gx`[r)k]է_V!w]V!aQX:-@9\ ŕ rӢ&KLX)Iv5|,I'E''Z~|"7}NDU* z.@4繊zs1(JT <) 1jU{-Nr[U)mh̚?cmqŞFTVOʪ_P+^˨zD žXjK/C{s=x^wz@ZQ|x endstream endobj 985 0 obj 488 endobj 986 0 obj << /Type /XObject /Subtype /Image /Name /im175 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 987 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 987 0 obj 734 endobj 988 0 obj << /Length 989 0 R /Filter /FlateDecode >> stream HV˲6 LMNLY-}|8wn 6?6"AL v?opgLIR9NhATfԛ7[SEL9<л?ѕ3]C6DH{`sIh'2Ql1*F9*~}YthW|ˆLDLgTr|be8q)lL@*1"s]0)㙧g]]O:Q޺oF6ʗ|e"iPW2R2JQJFY3VKs@{FBt@L)k_dr?,3Lo}+}"+;9IA.Cfw8[ufW+45\7'UQ"ښJ-l<ž|Փ}NIpy10XJҙ3#;_EɽLiOtYƋUx#̛H==&`Φ-ˣ);|R s*[薪0bH܍Ã4*l^PU^,ݿ8+= ?@H" q,17s{xKqf\mRjU !+%}0IjxS|2]mHC$t 99ڥ"6"k^g<[U1!1N_y)3̖2~?%i0Kʸ4NOȫ/X~?WDtK^\k^DHNl2za9SA1\uC c34Ey!vEM㐁cX nt+w#P_.܇ \wڷk1sH-Hw"kJ1Dmׅz=`so҈k  /Fi: endstream endobj 989 0 obj 1074 endobj 979 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 920 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im174 980 0 R /im175 986 0 R >> /ProcSet 2 0 R >> /Contents [ 982 0 R 984 0 R 988 0 R ] >> endobj 994 0 obj << /Length 995 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(F HB!"Z\0N<8HSHuǚי^'a(oj+ȍCB*Gp/,'ĺD8Vgoxrt0I7=Ϲp(5EߤiBUaO9 endstream endobj 995 0 obj 176 endobj 992 0 obj << /Type /XObject /Subtype /Image /Name /im176 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 993 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 993 0 obj 734 endobj 996 0 obj << /Length 997 0 R /Filter /FlateDecode >> stream HeAk@_eJt2xĦ[&ݶ+7Cb(z'քڃ`^YPJ8of_ycF-[*zpy5`}FŢXR6kQ^.yè݃ӏ>~]-9R¢~Lg͑/!=,w*fo̠YKv$żF>nYCśKrJ9\ @CTu6_:? TukRU&bG,WJJwȨ8E8|-1tyŤmݵq|jIs U%$ܩ6bӁhuTLrIjՋHk F^e28C_ъx`K1WgV{s bVe5&7뱤;UxO/¸0H>hφ;9Xx_عq^_+6{0dN endstream endobj 997 0 obj 496 endobj 998 0 obj << /Type /XObject /Subtype /Image /Name /im177 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 999 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 999 0 obj 734 endobj 1000 0 obj << /Length 1001 0 R /Filter /FlateDecode >> stream HUv6,s"O̮m}z! I($ٲEaksosQ $ %v_6 W_*ʂfq J|[z#PYIxIUt'?0V8r >LKUŠpJdF=zM-xH-y|"Pc0X 'k3ht :ތk4pڃ9@7W*12b) &|gh&E *R+z wЏvB gk0XV :d^Df? C%:i|m *31^" F*,+ΓazN[zjLÇ?|2$tKNi`ĮByR`~^wrbb^3/ ^7[c fDlzVo:9̊啑$G >+n\uEZ05&ƾi2Hz5yRz[z\2cN} hhzHzt(jKQ1ӊ̻C(3v/a|ܫlvX.P ~ X> /XObject << /im176 992 0 R /im177 998 0 R >> /ProcSet 2 0 R >> /Contents [ 994 0 R 996 0 R 1000 0 R ] >> endobj 1005 0 obj << /Length 1006 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7=Lm{YPF} =c/WIݽ9 endstream endobj 1006 0 obj 177 endobj 1003 0 obj << /Type /XObject /Subtype /Image /Name /im178 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 1004 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 1004 0 obj 734 endobj 1007 0 obj << /Length 1008 0 R /Filter /FlateDecode >> stream H]Ak0ǟv ջ^6htuB&c-9F顇2mBF "9}kr;y(')n X{%3ѽ[aѴl7 GX3;?Xm50~ӳ>_N#S-ՔRwzʢ/\cӉ؇%vnKXtj*@쀜<569:DbUȵr2T;QYQ:YȝeT3!t3w>wTH$f7MD^ʍWKb!+@<7 !vn12][(,*nv09VRVcUDWnapNOH(MǵhYG)sX{Q{ө/Ņ6?hX endstream endobj 1008 0 obj 479 endobj 1009 0 obj << /Type /XObject /Subtype /Image /Name /im179 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 1010 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 1010 0 obj 734 endobj 1011 0 obj << /Length 1012 0 R /Filter /FlateDecode >> stream HWnF<@Ds\6:EM#}`M$bE *p&ٳgΜY WYBAP%`,bF8KR(f PQ-0.IS|0Ĕfo&/ i367JRƇR*]MB &&T.1O\63Lnق(f/$s/_@CfFfa ~ 0MY%DfK7ij(b=;XCyE;I3~e)(KtSc@N4o~/ta+` TVռ&>ee1\ȯOECPljE:F,xo ; Ch` rr_ySd "q>Fe_}Zz󟾅ej)uO DNW쭋c" qKDŽ'q P޴^iP~8fӅd)6lޏvUERB̼^'YKyj&~&SۋN=jmd,KێԆ"l4a|WsQN1 endstream endobj 1012 0 obj 1223 endobj 1002 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 991 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im178 1003 0 R /im179 1009 0 R >> /ProcSet 2 0 R >> /Contents [ 1005 0 R 1007 0 R 1011 0 R ] >> endobj 1016 0 obj << /Length 1017 0 R /Filter /FlateDecode >> stream H]j1 D0ȶd5l{!-)} R$^]"a=P4[_nc$ڝ޷"%#UQj]`x,C }LZ6|;}]GD昔|x(r^FI@)! fb=/Ogn9 endstream endobj 1017 0 obj 179 endobj 1014 0 obj << /Type /XObject /Subtype /Image /Name /im180 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 1015 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 1015 0 obj 734 endobj 1018 0 obj << /Length 1019 0 R /Filter /FlateDecode >> stream HeRA@~C, vfغ[\D<YA"毨x/ =OKa}4-/${߼LN$V'{t[ttA \aKtp 8^sx]KLLtgݻGX[}aSVUKS-\G.*?S.A2?-bxXP@l QՌ7ڇ"EO3̋Dvכ@C*∩]㩆?, =b2^ZmEgqӘW % rZ e)jERiժgB1z#Zhxݲ6[+֍~\U~AB̕h !N~\5цQwP wH nEvrkmɞfy~b endstream endobj 1019 0 obj 480 endobj 1020 0 obj << /Type /XObject /Subtype /Image /Name /im181 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 1021 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 1021 0 obj 734 endobj 1022 0 obj << /Length 1023 0 R /Filter /FlateDecode >> stream HUr0ÕɌI e9Z_̉:i5cţ5 75W̧tJ'[>Xu{Z8[q \F;kY6`ΆփCKŲ%)7[יx~-pЭ> l!KMB0<\vJdOҍO BE$p0:=Nz#ly@p973Dۺ74XلD%-_gIfʓ%HX?̡v|f$(35v~> /XObject << /im180 1014 0 R /im181 1020 0 R >> /ProcSet 2 0 R >> /Contents [ 1016 0 R 1018 0 R 1022 0 R ] >> endobj 1027 0 obj << /Length 1028 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7=@.&Mzx_={9 endstream endobj 1028 0 obj 177 endobj 1025 0 obj << /Type /XObject /Subtype /Image /Name /im182 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 1026 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 1026 0 obj 734 endobj 1029 0 obj << /Length 1030 0 R /Filter /FlateDecode >> stream H]Rk@~1+x/͓Mm+uoxAH顇("VdEB=xO^r)8q~$.7 ZdC=ۛ]] {0 t7'+Q) _Ox'`7큔E‡rt(-rBkM^h00(-Vfxo!Je ڀ e8521ep pfSů/7Q,B2+۩"72]->s5B=B,I{ng'\CyvSDi3Y&^^ME4FˁFh "*IiJDu> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 1032 0 obj 734 endobj 1033 0 obj << /Length 1034 0 R /Filter /FlateDecode >> stream HVr6*Iƃ÷ͮ7Yr ȉ>CH*b f3=lu!_dM8̀y EY=+YvX0*<7D 7}V6^ sAEg&}n $eXXb01c% Aw_ +Z>*!+ZXX3#4f*}mlMVNAifd!:'Ì(8,"j=0U90G$ZrUoQ$˓$ܓ>պ^9W.U*Y~E-tU;:o/X_"'!y6¨]fAt`И3!jz>o>N_eųYr>ųM5=v$ȁTPcs+?.5'U'>=|A>MZPG0L"Iu|,\)z # nhӢ,ϰ%z2J"+FGJqcxIz$卭2eMzu2bYd\&b;LWNbլi=/[v{|\ UXƩ SM >I &-~hsff4.fWmm6Y?!fsR]%Mg&ZYـ]?3rP`yFZ#o.Vk-pWݜʅn=goI^PSu6n˕?[%ȫt)k>I0㘗ca vYg4҈2brB3^BtUh d tXpnkq[AZ{q/1:UjiѬ>y_/?2v/<( endstream endobj 1034 0 obj 916 endobj 1024 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 991 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im182 1025 0 R /im183 1031 0 R >> /ProcSet 2 0 R >> /Contents [ 1027 0 R 1029 0 R 1033 0 R ] >> endobj 1038 0 obj << /Length 1039 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(8#HB!"Z .j'Ș8:&i]9CΰD 7zơ̡c#'ܓDb]\jo]EyvMoxvt0I7=3)gRC]M&Z<_%G w9 endstream endobj 1039 0 obj 177 endobj 1036 0 obj << /Type /XObject /Subtype /Image /Name /im184 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 1037 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 1037 0 obj 734 endobj 1040 0 obj << /Length 1041 0 R /Filter /FlateDecode >> stream He1k1!Ski 4_ĥBRJ12^; 6K>F ?A!k>BI"\>I>'8IwF_#kkvf[͈ N#aQ{oY=0! {Nǯ~N=6j]XD#/zVY17DPYwm10.t'OWwYK=*փR¢+a5ŅB~yZ$g}V&Uߟd rJx_7rOIq+dG'ŴQotwZ:WQ꼐*@%⹨Sc5qZf*b,{WY~.Vey`;+&˚V,*\+U⚛Jls437)vơM u$hgsxWy~0/74'8bC=w endstream endobj 1041 0 obj 477 endobj 1042 0 obj << /Type /XObject /Subtype /Image /Name /im185 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 1043 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 1043 0 obj 734 endobj 1044 0 obj << /Length 1045 0 R /Filter /FlateDecode >> stream HUn0.ZSR& CFbl(r}I&h|hы%@lP )Bˈ`hfyGr-+ ` nK "}==6OQA%pܽ4#Ä4O!p"=QFrSWÑsuyA!PyXY cХ|Vebw댍|ꔲS+'Gh7 ]d9JS=jwZLr~j[x-V3U&d$ q*_ ^wQL rdyTs0 /w >v֢D4H^ZѨ5 uK1(݆;s[Aw#Y'h$e;x.tDbU,ڡYr nC'c32:_p/ဍ* 62.gk20FʦH^Ppm.;8~XWP܁eۚb^ƂCbRvj I;s#) _4یxl-PZ.\&E'h-XӺ{F>,OP>;i \:d:;;-ϷUNrوn{i>^/<8Mn3|S3;I`C-\^R+s[5ԯeܴ endstream endobj 1045 0 obj 707 endobj 1035 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 991 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im184 1036 0 R /im185 1042 0 R >> /ProcSet 2 0 R >> /Contents [ 1038 0 R 1040 0 R 1044 0 R ] >> endobj 1049 0 obj << /Length 1050 0 R /Filter /FlateDecode >> stream H]A 1 EO;.&&mv2uao0(F HB!"Z\0N<8HSHuǚי^'a(oj+ȍCB*Gp/,'ĺD8Vgoxrt0I7Mq8 o4g*09 endstream endobj 1050 0 obj 176 endobj 1047 0 obj << /Type /XObject /Subtype /Image /Name /im186 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 1048 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 1048 0 obj 734 endobj 1051 0 obj << /Length 1052 0 R /Filter /FlateDecode >> stream H]R1k0~>5$(vK!nĹ44ܖЖJ2dU;I,2L*4T'|>$%(|t ƺfaD7Q'vC0"퐠G${MɗIG%LZJ.߽(KU\tMt bnߒ~ R/onRN]o> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 1054 0 obj 734 endobj 1055 0 obj << /Length 1056 0 R /Filter /FlateDecode >> stream HUn0 &@S@.mDC#o/)J$@$'pvvvѷu$p"c?"#K ń;pܱc,t"`7"{j=Rp'7Nj}EqgHZ1׍k`_4X|eB{,GH#)aL14PF^$)NLM$$,)uz:sY b,HX̠}nB=4I4A[ؙLݷX~yM1#|2d)c4JKUuʅLm[ۨ-L ;{&z!M&?XӨb_6\ͅ]yo &HLHCEnf ?.Qa{]ŶMچd?Ird UuꝮtm1GӪu~À{#`䢹!}U!2cxs$(5ɥpfyi>/JNi=]8K?U|jԾR1˻.D?<u}5LؘCPkPO(ն԰oZ"1oe4Y2nbj.xljx,‚ endstream endobj 1056 0 obj 676 endobj 1046 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 991 0 R /Resources << /Font << /F0 14 0 R /F1 18 0 R /F2 29 0 R >> /XObject << /im186 1047 0 R /im187 1053 0 R >> /ProcSet 2 0 R >> /Contents [ 1049 0 R 1051 0 R 1055 0 R ] >> endobj 1061 0 obj << /Length 1062 0 R /Filter /FlateDecode >> stream H]Aj1 EO;eU-y lo0%$G HwBH|&N7qǚRԕ޷ < )Ц [Q0vm ]`xJu,& ⚻V+.?xq ¼y$7BZ!XQƐc1_}U79 endstream endobj 1062 0 obj 181 endobj 1059 0 obj << /Type /XObject /Subtype /Image /Name /im188 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 1060 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 1060 0 obj 734 endobj 1063 0 obj << /Length 1064 0 R /Filter /FlateDecode >> stream HeRjAv;,LE03 ,5YѽD< 9= 3x|G sG谗=v Fizb5W5Uu({wmvCƵEh'V(NsJB.r$^\rt釷x$lYkoj(MLei3!K,vTu,:)WpnZ:qF;x-ͱ 0EBA3LP1ݬAE9PDv+촲0u/,#"*7ju1z^I2笭L3Q{k rZ  3cL,jiU90=o*r= !>szv0YV?Q9b^HjP/բ_JKK!|%sM˘ [ᬆkxp-k<7o@4˓NoWR2 endstream endobj 1064 0 obj 483 endobj 1065 0 obj << /Type /XObject /Subtype /Image /Name /im189 /Filter /DCTDecode /Width 85 /Height 57 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 1066 0 R >> stream AdobedC    !"(($#$% '+++,.3332-33333333339U  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$ݵMTݵHh!! I$KTN:+RI$I111 NI$K+RI$ɓ$K+RI$ɓ'N ^+%$Ja)I%+SJiM)ӧI$+SL0?$ӦL;/pI$I$ I$I$_A+R.R$_ (I$"~I?$ 9L2t+S&L:tI+RI$I$_^ !$N:I$+R(L2S%> +RI$ɓ$K+RI$I$_+RI$I2d/o JJI$I$ endstream endobj 1066 0 obj 734 endobj 1067 0 obj << /Length 1068 0 R /Filter /FlateDecode >> stream HUn0̧($)Zhȥb&it}IQhR X;3;^| ˋ b(Qf )r Fe8Cc yM>1C0+ _!e(]jҞુnFzqceEλ_,%L26++t4))@/pЧ~,ةu›aN d+GѬm]WZXrzc@*IDM+e" Ϝ#>#yʹQƁRPY>bNDA ^W58k妠 dz Fd]kGf :#[{?XRÏ[9g#Q:b 'O•^5UuZkffJDк> /XObject << /im188 1059 0 R /im189 1065 0 R >> /ProcSet 2 0 R >> /Contents [ 1061 0 R 1063 0 R 1067 0 R ] >> endobj 1072 0 obj << /Length 1073 0 R /Filter /FlateDecode >> stream H3T0¢t^c3 272P051P(JUH-虛*idagd`l%*gZ(e endstream endobj 1073 0 obj 74 endobj 1070 0 obj << /Type /XObject /Subtype /Image /Name /im190 /Filter /DCTDecode /Width 481 /Height 65 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 1071 0 R >> stream AdobedC    !"(($#$% '+++,.3332-3333333333A  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$IyWԌ̷J:n$⸟_Q[Ә6V8Ϳ*ed6.*_G̱n[A7PB?+\6 ^8Xu:;:oRe/n5`q "Uz~13/kqp6L/*qMT !"u^U~?//USĻzX.7&4 Sg/2s;I[U2]e0c_5+RI$I$_+RI$I$_?$*?k?-Η&w ә򺿩ɲȽwˢ_+RI$I$_+RI$IxH}L/~EpI25EjH_Wm}KOJOV[e cs%{5q kDxw &Ԓr,ε[Yjװ%`]64,cߑkH?"ѫ{Hk\G/nzgVfgNʫ3YKi!{Vnu _S}d/"e/m<Vʿۇߟ7m hdu^'.̟9GSv4w\'+oVa jJfCI.n=^F3>LaE [$I$+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI%#O-gt.S_ʼupKЧ [Q=G%KѾ)K{դI$+RI$I$_+W3ԯ]AC乭akto5~ QrVn'qhiw@,Ӳ7_V;4_WES[ϩFl:7ʺT>W:6'+Q@VH]+We}>A9s$Hoa5f'Rg%+RI$I$_+RI$I$_ ɛ?WiޟȽGLK$_ _ؿ_Dmk?.oOڿH+&;/Vnm_V3ߊ{I3Guu^ΕHi 1#[[U9Wic t8qt=B{Y]vPfôL#BO=hZht0 |׷h+3#=6FY9$H[%z7vHZ9* ]?Coi{5$ϗhSѺ&RťK"@@ט]Tί쬻kiΒ A+k/!'U^KxX.2a|}-p8ē+άy}yēk%E߱|2ʛ`=su%{N?9 <4qvzG?MƬN +ZI$+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$Ig/:M}`ɥ-Us:OK{_FK!$ ݇먮4@/h$}_'TW 3?ftO6+7@V>Λq0_` {c -U>0\baьqNLJ]M5],h!tO?WgLΫ&w9 0p=:wZ]L<\Z  jf6-9k]W9XoчS-~;/K,}:^9I'V#縹Ĺ2IIIQMMCu1bI09OUOV!$c 5$>%}Sw7%ޮKL7SѤ%{gϫgtMI>K}0=cV_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+euv4=k k^A B sL̼{Iu>GW3\?^ս?+u*ϱu&|K}Sƶ_E߸-??EY~d|1Ì2j/# :@O;a8isy;3oN<-/C՚<ۋYcd'Gk*.E6̏:! u ]~c+&+ u}>n- ˵[沾{ H_ď>r <5u}zz?EWzCu\\-i{im[Äyt:M{w Oa@*o/>$;eml`/E~P@psl͹x56d|\>]ןfv7DcH?#Ϋj ?K,}uq{K$I+s\\I$+s$:1q kZ$x$9 h.$RkKL/'gAe]o7SK?Q~5G;0#m_: lukOUvu+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I /3lkȢѵZ8xt*FEOmo<0T_[,acpW龵hi#Lwԟȏ-" k>m'ZNg#@^[$K~(^INxc^ݧ>@\'Xz?ڨg\sO6!5sbw~uzswuj}~uO&-;KDvi suN}dm$ 7]$hwׯG2[z=˄?W'I3[#7e ,CO/Gv>O,%>*zoי{ŤܚKǧ}.f}UkۈA.l>O֞cI{L~Ieu3_Վk)[.׷xAoa׉{L 3NEv8cUu+RI$I$_+RI$I$_,elu81s$sX95II5$Sm{]֨is[7LvO 7\(*dKd!Pt` W/Fdޟޞ*dkvx;1qusgI lkfHq٭0#̟Ĩ4~דϬ]sgmkã֍<pKu.;X9YYvoXv5NV??X~f~\ɋ2,SVp>i?Wd %+grt̼vR~~%}gDϴs:ّdC]_GoV֣ ȳ*Qik|:Ea14lʞXXzĸs._MYx,{q{ "Vn'Ux-sq2k̸Sc 󂺪32q7OS{&r]k򕩍f5Bh36*_X:LܗV@}\,OI>_sibm/T`t;k!\+4mꕳk;O=gd_o?*/X>.]6_U}]xqn\{}uM7t]|^> o?'}??3Ky?5ŶLfAOpsmIƪw=9U55OߧTrU]=?-o{]~YSisK~>M- sZd}zCw[$k*v­wT}lʧҳ3Pk^lvKd4ޥzU{Գ3X;&MW))% A_gp}cVH,iG%C3eNLj$k`^Zj}G/\y?X/xU-w}V][>hdy.SƪY߸?qq1pŦzkY]M kG@j(UMmkkG v뭁15ESR_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I +3lkȦѵxt*QNEOmo<o?xY9ړ&u6=湄(*Sw ʱ:xv1cIv5G~VngՎ抩,%G~VZۧ4,.9ĆN'O'~q,9vXtG7l7oR[5Ykf"/K/TS_ YDeu/w6%ܽor?/}K"_ zC_OD$s*vw~lʨ[_N&";q]?Wg8ihh퍕* O{ v{+xef֑ԸV~T=? ]Mc:W`ÌI+SQ7k΢Ǵ<;aZvQ.`.?̺SWAvM.o?(ٰe!w'_.gDOYSkI,|^Ӿ^&,s\Γf=7iq~&JZI$I/+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+W endstream endobj 1071 0 obj 8204 endobj 1074 0 obj << /Length 1075 0 R /Filter /FlateDecode >> stream Hݕ=o@}XVb3 %q[m* 5(!" V !#blC㗻9w;=;ß'tV׃^ρG|ɥs{=>+p9ɳo>1cluR[Fmtg,U-,[)f_هhGf?> stream AdobedC    !"(($#$% '+++,.3332-3333333333  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$I$_+RI$I$_+RI$I$_+RI$I$_+VWSczVĵꮹ?Lg[/uyy=Ye8-"s?r36ӛvsK?7O_T訾2Lʪp?G[2ͱ3\R .]7e0yɵ|E0sH|*\qG WԣԿCcM/}"N>L)l{s>Dmq$z4Vy."gDxsщXH 9Y-axUF ކ~" Opӧe/Wq>·WU\k$DٿV4:_D뗬ă?ٿV4q>·Wv뗭ğ"Up|RC71|_,.md;?z~Jٵޝg, 1͕{{?ګxoƶ5ncK"5?\sj{|-?~GKc0aƵ|Åq0}K@^ג| ?\]c9cW}GKnǕ[ٰ9X>;zvz/c6z?XEsX#xW]ԺwRTRIwȐH[zطבY$o͑7{7cloAI/+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI%[?tr3äfCK9Yxur@k['̨[u4}mmZt[KK* A{uO{ 9}6AߔrtAvCg ;s:V=&Gh#\6:L Zb zDUzWdPP4>gOqSs.#}W <=0C@9gz'dX~=B GfduN[cK׷P \Yz89Z,ǢǶG"ZYe.Ⱦ`>3nf#-IKHWS kfUBui1s?Ok7qUeo["6R[]k#gVk_Ma [dd}hT}b-߈D{}V@%"U&vD0z?)U6.A*s>= 3k_ZY^=y-wkCm?w~m"x F&=ls+EVcyqUk}nX$=? I7] ~i?p2:Տ7g:A 6dQc'.j7WçǬ7S$]C7E7{% ~?jy"eaWse8> BiX-{ ȅ&XװZA}X?]:361XMy:Y"7O|QѿG7"C@.Q&~2~b0is?|n?X:2,S٠?= z][mv9ON6~p|?.{~Ȼ-dI$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+W!j}Ma/(4ñ}ݨkc|]Wx0i9@AYw`Ǽ`Gǰ#YGHgӾ;Odv= ?Y+U: i߭m m <?K,ve2\I\Vf^e웬:Xu/<~NsYٝ7+9pcENsZO>k;uN?cĻ$S 'čutaeϣS,i1]I?_sd5q < Y$pp|b=3dž\|\HЧH=DKL/^Ѻ?J|Xw=5Ć+q:~ \Lj.4{m8je@CⰈI$K+RI$I$_+VwV>Zƺ4v$|L}Z | |r02 \?V?P`7+9 -.i=fk9z2@p'~eU:]:5't8toOQK"L΃$.GkCzql1uON'L<1>ZZc_EuV0ØC|]5Y[7A$%H]ԟꥴ.vNfhA,-W E}'_ /a?o̅z/V ŷ#ݴ*.fY*uǴh/NK&0A ٷ/?.2k-#H&@s[X?T.xkx]z/'{z[s-7r쟃B !c[wi{77[]u5hcZֈ kZƆ IӤK+RI$I$_+RI$I$_+RI$I$_+V/_Vc yoѶj+;}_fO;!8kVyۑX|p>xogT`scROuYwMkzs\=Jz:ՋH/.\Z…ޙzIf_Oʷ!YKLxi=df`n}H?y.TVÚ`w߈0h7~{?v/_Ύ@ڳog}BNnCF]I$+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_m_77*}^)! ${ɞ@h}g׳21jx{p= y.`YS]F$_UWv>70yR8D#ąKIkmcKZGG.iӺ~xkݕѱܯf~k*:Cw~G=Zt[>ցt 0~BJ谾r[9Wbbb׍MxT6Əu4QF=,Ul0֏ u1n+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$__kfa2dP 2"L5ǻtMe rH r+~N#C,twx ˊcu ]69A.&UyUdR*psH$A:n}6s \z}F /i)c`& Xh-Lm`=w+3 @ p +RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+W+{YQ}6]oraqn6'BzW2_UC{Ltt^iﰸ{"Oo-y$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_Ϭ?Z:լ6Tli!.>Mh${V]/ sA$ %{Vfv&b̋m&gk+\O![5T'E?Ewm}oUUe6Ϧc7 V:OG.\\>\Ƿq E+&Mw ڼ̿> Z6sAYbd}nkzǒ4t7BK:JÝ@/3[Ȣѹ8x4+NȩQcmZZBDzƇ<|:?Po^6,m*w^OfX{ ;侳pʥWiw+WW?쮃cXq/GV^uhuqƹ4õ>K,Ϯӵد.$I$+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$IxH}JnKSg5]?[Vj?Gt?SdʽzzI%+RI$I$_+RI%M8[ yAÈ*WYvֺ(aRU[[}}I]_dsupCLtÍ*^z?Vc̬{kO-& ؙ5dixp rq4@Ж8a$I$+RI$I$_+W͟+oNNw\+\jH_Wm}LWIO ^?O0upXjfS S+>ecX~3\] <.dI_/dQC xk_LD Bk;A۲KZ]:{~ s+{@H:5? +">RNY8w1ku:ww^/:5m݇U euU,ʚ&Yv:_Ρ.wd< igK;ać_33ۚcnWkhmޘ;^:Ҟu.71+C35yc9Z.$yIVn ]uu{S__RaWWW\W?WgPjtG87@}}7bg>ƹ-$4V0KsFK%›Jr2 ]jC },elu81s$sXִI' &ԒԟzgU6Y*S?/'Uu͒\W?WgR?]ʗsL_~.q__'Uu͗_jtG8o^>/ZXaՓ[t:zCȵSqm\ }G45i'ZI/?$*?k?-Η&ht~_RX/!crnc @qW^ܼ1ZZ.$m%tU21WQ/l z/ybuk+&9+tgZk#Kf rX̖x>[? WTIxH}L/~EpI25EjH_Wm}KOJOV{I%+RI%?ą;U6 ⾵?"ɬuɪgS?eȽwˢI$I%+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI%վs5ݚ$U.ձGM:[Sd4 `'@̫ 0h;X:PzuHgc{4h/ O+gݗ=8q#AyfUyѿPcuU>Z[YzU;rr?=̯zՎ|ȶϣjMvuxH}KYn]7%KHǗ'sWҧ [Q]G!KѾrrgXz7SS?ly+Kw&9^o%:R|R5'tRJO[RJJ[}~+?鹔n}xwgn.?̌KNߏckĹ%o6Scq+q:~E+W VWlUY_\O֯al^t5RR;[O2OUē~Bwff\1i}~]YMi<Ҵ_VE_SWkCb$#Xke2״91{Z ɛ?WiޟȽGLK$_ _ؿ_Zs]+RI$I|zޱoܚѩ[sϬ6 Zlsb6כC#/5EW<ϳ}Qw(6͂9ez}폣N{>ѳ7Oa8k[$+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I|zV>4oq/"Y:p3F.";9\o~ܼEfk".mf\0:}Mf !CGgX W&ǃݭԁ]EnoQ<@_ZW[+ck` kZ 8/skZƆ@@^?D/۟MI>)5E+_￵[/r^N%nx+Ѻg]6W[Ⱦ//5@׃vz2ͿdWcj__jǡĉU8S74% af]fNCZMu?`y:'Y Qԛui,c|'y+~k< Y~;MMeN,x`hUkK\<sk 5AQL虗VH` ir|W˳3NȰCxO^n}7ǀ &8^ %hyU5E}jVKY _9?>[[^C"fwϪ?R&>Mm/L໮ЏS@2>!z/o w?cY}n8Pܺ΋e\\^=c[?UN&]W}8[/~cG`)YWY*{}=ۛYOo?{0#YEk_?߭}twٜl*}3d~G}a%cAbclONѲ:[L=~S%z߳~nǖ_eѷn[k{gQG҆ퟄ:/QΥ^PuV_Mh1\?YWXcwVΎusSӮZZBVJWt΅\$ cl!vڳٓLs4>'{4^K=f+^ܨ͟*?oM}pI2 yzQ!}]C/U=+<~B[k+RI$If}fL?WU{ YdG~uTQoLyyix۸#ȟM񌼗e_`X.2ac_s]8LǗ &<ДBXtOؿQN3-}^ݺ^fdDpgNo_3԰LW}YŻ&u+[j+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$Iau߫UT)A aѠH2{YX=/6[ q' -o{/k"n۬1IŶcy=>$W{$?f]nt3G?TtWM {6LG f5&&mezBI/Щ?Dn]7%KѾ)Ǘ+_￵[/r^N%nx+Ѻg]6W[ȿ!]"t!}пN%ix Nab% 򲊿/5wY}KQN讧/UwTq/o#T~R_zWHw H+G+wI.cW/5Eu5_Guol/a]ǿ]_g7}\=19gzP٘9/j_LNż>VU}gtmȦ01 h+TY،_c!H<5Ei?atziߏm9G كVb7VGvg'|dwzG־_ !Oa^0skWG?7eRS#AZTW^V]#7Sʻ([]뭕0cCZZ]8+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_ֳcf'H,}u}ohNu.mu ``ָp י^"@.%y ?LCaz_lLOxb=?&D:>OX5Ť/+W?䵟k_O_q*.u{7}oJG.oW>u?+w^Կ?J̯Aߑ|^8_=/7N$??} ?B_A+Ww[_jz_guEy_򫿦ʩ*!_YjGW{ԿJJ?$*?k?-Η&w ә򺿩ɲȽwˢ_/5wYKQN讧/Mw*PSü IAJW5tP|mw]OăMVԱ=/8~B0GV u!_3gӝ+5EjH_Wm}KOJOV{I%쿶pok)ÿzO?tt>9m7Տw\pvh?_2_}}e/y$^9m.y.q'Ľ{$PQLQ W0F_Sk\C=<|qm/64 gc\S}\Yk|+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+W_>:iI I{ cKM{ZNaqZ\ Np=*: }lx$x\ l7kc\t+O^?B_A^VQWw[_jz_guEy_򫿦ʩ*!_[V)^?)^пԌO/o~Bgʪ">Kbɬu5_Guol/+W_\zu3OXùueY%fZǰ\-S?μ3+qXꂮ[k_mwM乥ou<B?Snn'qim-otܺ:6_N^_W9zo_S?FnwlOKY?e8sIw[=#ROY7\D95tDU{j}:JmY5OkVzwԿ=7-XA3{8E]+M^ s} ɛ?WiޟȽGLK$_ _ؿ_Zs]:;:l +-u4qW28^at[ᕙG4]gΤx}պ\lVg /s:eٙ:q}pV.'Pev k42,']LSFSl^mWE+"];h. o98q2\eOqR<\7Qԛ*ƀ|Oӟ^HcG`<~+W RmU,В;Ãy)Vu6}+~ǃ#v#dt81{As]egƛ0:_pmux>.g 5޷i{iKgD6#Gլ;k5kIf9cUݐ,4\míqNȖ__>/nd9M܆wݗҾn՝Yq77٘g%.{q_\:Gޑ_PmԸvu`ubҭ^Ӻ?P|O\gAtr>Әf&K6DsO~א\ݠpwheg}m魰5"8|⼕qɡ *?!W5OT3eW,=&D%7/Ƶ9ensyGz|6:9$xWˋ I$Yj~2ΡU!ci\wp>+3d2>Ë //@:huxR7>N-W[Z+UU5hU]5ƈp:*I$I/+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I|a ~N̏w93_텇_9x8\/:=ݼąj/ltLdrjXa!>jV9psLd|ٝ 9Ct܏^la8N|]7$et[ōԩ/iLkƜGŴ]M^VQRI%\~lrf;sɂպA_]>MEȥ.'`,=kOc;/]KȡŖV/ƿ(Wmn-{5i *{K\WwkQIo',~UwDVٟ6e%!]"t!}пN%ix Nab% 򲊿/5wY}KQN讧/UwTq/o#T~R_zWHw H?W6;gy0Lj {A?VOQkr)vK 9:a8{@s'ާҺI~'Pŷ!sKLx=ef``;*kyek,5VUT5jH?Wm}KOKN VLξ MTA姱0u*j;؃؅ebїC/~k~?>ٓӉsӲ C<םAֽ9459 ~}Y] (&){)Z<JY $|p_ LOIOӡ[k#?F:ʺ?;W3u.Nn]Z\cNx ɰs3F-/pIsr}kD?QU|Z*#`ŏ{įC`'?ed@~+UsL}&=Kn*ơ^4{ebcQMM!h ꩬŵ ՙcnv6s+!v5xi=i003bdՒ֘q8*4ic\VI%+RI$I$_+RI$I$_+RI$,\<{22kZI(_}8>۬mUKZBs2jkL8rqk-BXc_+RI$I$_+RI$I$_ ϬWpsgTvئם{I{/fk=b+ƇBgUvf`c{\H9_[Yֺ~=ܚ (]׺=U0> QtYfMLst-s#H}oEo䶣HAo]t!׺qb 3=cMuKOOFƿ V/$+*?k ^v59_YjGW{ԯJJ-}+RI% b]:?yww57awk;R]Gy,s_>u/+w^?J̯Aߑ|^|oM#|Nx<<_ht/Z 5蘿h"+W{\_f?W}CP?ފ󛿏>*ޠ9M}i_R+ҿG+_F'+WJ/?.s7/c[|?7|Xq丁|S!}^Pm}LOJU_++P3S/䅓oT-)G蟧|T/Qg^U/|WՔ8쪎?7%˅?.ڣEBC7"sS?Kɝ?;w Z$9?//lMw7q^+ۭ)G蟧y_P@?Կ\__Sa+J?U|J+guoRoIko"q_̥cOv'_+W+`RW$Pu#/ ɪ;?;>Wt++RI$I$_+RI$I$_+RI$IrK*(X]+O ]R2ח7s?cYy_~o?_̽7|~ע$I$+RI$I$_+WVWlT5q\g֯R~8Aɿ+?7yCOJC/'~?/tW?*O+=1??1?S;!+W endstream endobj 1077 0 obj 19584 endobj 1078 0 obj << /Length 1079 0 R /Filter /FlateDecode >> stream Hn@wY$H -%Qr)@Q DhKS}uŞ;>|{$ug%?ȩ}ο^{Uʞo:0u<PsU8VLy^y-"{8Yyg614?9{f$,TJ|K8Fp@|hII?C2p .ɺAp9ȉ!ĩ!8"5rf!C<+Vy  AVfԒs$oN^#+$ o üpd-Q*@ >r?Yqz0/LkԓUXb?-Q [ϔ8HyX.6qA|YXtFIr"C5JLøl<9@rjBebrn!Q%Si6!3g32#CXlq=3pkْ #'\mYyZ 6=;)=jFnSbK?QQ3Ҋ7|ORMKHf~\L%ȍ> stream AdobedC    !"(($#$% '+++,.3332-3333333333  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI%?ۏg]c':Ueθ~&w#~q0pw6]d7{}Zv= $W}\=GG_..þׇ;htIyH}kSQ&˝{;Gw\-lé2cĕ_SG.Οwӹ` \VaV;O<ˏP{觬}_X~ ~cJW:52}捏tSfuL'5.d|Xk/{. 5U'Fl}[SEѳe zV3h&hWGnl뾶8l{`aL9o-F >`/ok10leUǘk\k\__vFp\$Dk/{_O T'F/zս/p_돣ăȿ_V5O U듣ăȋVEtW֫k0 ZƏ*t~uAs=4*Ld] X[4 A[s^H#!dA Iӯ?$*?k?-Η&i/U>GY%=+ +_Y'Fͯdzƹc =S ۑf=3+_պ?OꞶNCTBK2L/V3.XJ'ZݣeU\h'+TlX090S9cKCZ$LHh$RJ-53*ާc\Z{Z?J:}@#Jұ^f$2/OA_RcF6_W/5]fWNk5Ǚ0<עl6X8^ >m.4}jV| įAǯ'(ne89 (Yu6%aD-j5=9A)/ ɛ?Wޟȹ1W5EjH_Wm}KOJOV{I%+RI%?ą;U6 ⾵?"ɬuɪgwRNolȽwˢI$I%+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI%}zKdu^H4W^к]V")=GSF1"K=C+g?Dem=sL s^ֹ9Aio~Bgʪ"⾵KbɬI[KOKNϡ؟ԝw]JF="I<w'^K·/.]UOr|Jrġ\h|duon ShykGײ_w0~rz$T>`+X+>e5DJauPG[Yedb78u,FϿu_wQL-{'iwzOY%~usx7MK;r+mp G$|WbeQNM.և4໚nk W ɛ?WiޟȽGLK$_ _ؿ_Zs]+RI$I|z:׎]ȫs*sh;P}pY:ʹT΀i{/?Y!5Eo>t1_<ٙm4޽kVbWW2\]}ncJ>I6XfxzI$+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I|~i1Ӝ,tA=w+~}dwXΦ؅̮  >uCX*Iky0῵Ն}bU{Xo6/^ޫ5ƚJ=A%vW_R@1_U/l]I$$վ%{^_?.}rSW5E+_￵[/r^N%nx+Ѻg]6W[Ⱦ//5@3+bd7Mv86ʠ4^>߉EDiӬo4oq,r;Pί'i{uaݷX1)7F4X1[vӰϘ ? wuAg_a[-0ayu:][Lq ǹ%H_5A]fgGY9/-Lh48 ݓos=ԶLƝ{_oK{ +¿$4&ȹ__ؼrk!ԿǠtG#dek[39k}F>ۗm֊\ ZW:&/RX;0WtO>v%m`+ߡΡMNnh{ZO0-Ons2c. ~/qrqY&u2]~}}2jcH^x@xY[:~CqkyXDv.s俵㝕qXX4m8ddǂ;EX ȺFn">''AQ>#sXw;e۷~Y?ԏ%iS쾏n>1g}-#~_2gyw[D^wW2hQp%m"{O\Z鶴zK]>k\_/;}g{s_๡~$&[:s2zUl7I'zg E#O{#E6m7;"pI2 yzQ!}]C/U=+<~B[k+RI$Iav߫UTz} $= ߬}Tt-[.$WysdPBa]oR>Sl5Gvwg^-`p9污.x@CCWF+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$Is_?uCx/:7>.{5EQWϫUwJ7֢U'S&L+~lO'a?'ԩaw?HJ_^Mƶ őz7W%Z]ٟ3n*[6\oT>t 0YMͲ2Ƶ}#s]>-Q94;guι+kEp-/_5Ei~Zﴹ?x:5Xk~ٍ`q8~Uvձw>zWH}L~E&?%__ KOJOϠؿ_Zs]I$I/_c7[f]eOqx7u~eoU_Y.-N4s&WWa~fWw5o5tw_,M.m1ܞAv_Qw1{|իۗx+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_ԗH/2=ID~2MBWkN7>gEyBwN}UtήZ༉O`u?+w^Կ?J̯Aߑ|^8_=/7N$??} ?B_A+Ww[_jz_guEy_򫿦ʩ*!_YjGW{ԿJJ?$*?k?-Η&w ә򺿩ɲȽwˢ_/5wYOQN讧/Mw*(JޒP/% %]WăMVԿT ulO OP/voM{L5EjH_Wm}KOJOV{I%mN`Spn⻿_^ӞDY`/ȽS'e|e{^9I'JqssO$=.$$)W[{ky kZ$x$ƹ h.q0iq '}?~N.aoQ }huC|μ ~Yŗ4hpٿvWWq7X"`%K+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+WVWlUY_\W֠?kgW?".\Ok_׀n /dT^A+0ЭkXֵ54/+RI%#O-gt.SoʼypK_է [Q=G%KѾ)K{]Q:F_vgM%t_n"pz^n8H1_>t+O^?B_A^VQWw[_jz_guEy_򫿦ʩ*!_[V)^?)^пԌO/o~Bgʪ">Kbɬu5_Guol/+Wǿ]g쯭g ,=&xغPl艝xܽ꒯_ga "__CoL_'2<~.:_]uۏVN꿌T\ψl菱ghc o->[L8#  Ey z6\ l{ >A V5Ui/ ɛ?WiޟȽGLK$_ _ؿ_Yc+c`.s`9$rsƗ8I<CA$Wӳ5u_~ZǷkVfcH uZe,es`jO}O7}j`k#>x]>Ǻ^9I'JW9qsq$O$&~)$Ik?߬=gv%ppiǃcVخ]}OU &Ak{z#P;yE\2+ۭaߜ|c+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI%_ăL}tWUO?.G|Ňпվ&{ ;8[M?o_+RI$IxoH~w7ed;^m1-zn\._/ߋty5E+_￵[/r^N%nx+Ѻg]6W[Ⱦ//5H??} ?B_A^VQWw[_jz_guEy_򫿦ʿ59] /o#T~R_zWHw H/c}gU@d!s4FOӬӛs2* 4\g39[c#kWWϨJ!,"7ti$_[:-v3Yk.ۺ4 =U^Xki}P}+ ۏkwWdxG|:nЭs c8 ç\Ξh|-w,ܸ(9$ض3p=ȳyX[?q:^(謰Ei}knߺ|Yohu\sF#ϓG>jּ:1|}`pr^]n.LCA+W?g72v> Y8ٙ ϏW_{_NgR'V?"W֬?8{LF*֪3~VdvK_ _ؿ_?S+^c74Az7̶ݱfkkOzַ!\[/h1JxqGIzG"рlnȝF5k|]{myZ^(oWA>s~cKjе|elmu1kD kXրִ@:I$I/+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I|m zN{ 4^1q+ӕ굖;wo6~N3BF=c4pAXs4#BZKH ?V:=OKͦ{.ǭޣ\b 33eיҰ+yTø̓+pnmtZ0=֚I/߯R~_XM>=Šx`az֏G8W`;Ǽ/d5GN gվw=]Sk!Ç^+:GQYN͡Լvl,KMwVX1<wkQIoɟco'SONI䮛+-w_! tpS8kW DVvM!z>/Zȯ+(/5wYH9ern>~UIVA_YjGW{ԿJJz_R~ :ucZǏƨZ>S[^];Ǽ)unΣj'k:&ϬS}Xz o5r;u_[cL5 >\7a?mOOt[kS _C,Ӈ*Cu\I+>ve-Y[ć'+/cK^ ]ݵWunƇ=2oPg cusF#Z_ZR]S򰏸w_V-~;m5-#uX~?I$Rl/ř)I8C*U"*t'A]vLϷe ݮ3K~Q~m5y ̯^[E6]i:M=6k|3py{Yeo ƣ*(U-{4!\8Aw.q1԰,s[5 lGt)v^+C\Ə;<fX\j$kc_ LOIOӡ'׸oGɚ)^+gut[w37'֌Ga? 4r{ä}_f^;ßqnfkhFѽ|޳OCVtiZ3:fe:@??u/.(muX|~0zOO8k|$l Kr_Sw=Lǥ`*V]EtlC,>ٴ#OV{u쳧붧s`0cY:x eh+)$+RI$I$_+RI$I$_+RI%WuL:u6;w ? nVK:jn }X]*?V]ElC,>ٴ#*#]tvםl 3ZcxahD +RI$I$_+RI$I$_η:gTC*펪w4}w^~}_陟c ;K@@{.OXطz7ݱi!U?k^۰eԘxm78q:9 (^dُ~pmpGACmuvdC q@R_fT渲]!4rw 2[Wct!׺I~o [Aѡ})+M4<[g <PMsG ȗobΗ{m nnStez.± Z$Ia@8J~g:'P& Ii^5+RI%[?qi̤^CÁ9XxzYTW\և6GPofkmk#YgՎҰ+», doS}_3*,Vx #ɳqn-[EBY}+euv4=k k^A"AЂ/ԟgRU5Yka "/J?/'TR[_W+g?%ȶ0Z455d+V-R~[c׽9صI䓵g;8/qM ~XΚI'Nm"rLJ橿D߲gDo.&.=xش׏Mck+hh(UMmkkG u[+hc[kD+Tl1<<9{K\L@p B XR?^IWg 3쾙(D\_T+?YV5msO!=[GNŪkK )WӺ}o95/+RI%}RŸ^FM7FaQYOCsp&ȇǸA:~\cɏtCWY7\_IwSoV[}#UnM{GCyx\O?U1UjqpML|SzE..n+ :]Mu6ֵkZƆ:I$+RI%[tޝԱ6~-9kc^p#DWt+_\>ZuV&.É h.#ā{U1eLD>Kr"<I V ?G{@. ^$ĬlphIjUX1 }'Ŏ̺ܮf~FEu_Ev^5ɶֲ7ynW캪6ᵁ!r?k/{Om돣??o\ܜy<zJ:CrŶ-O{.'Wٖ{ >`"}bCլu:@"~U >!<|}?$JY[Hp"z/[]wU:fKrlG "%mtԱpA"eQKnw/+W3OԯA?dygkw~+nҲ.n_phqohx4K+tKW۱F~gkY7Qx`PsGP kU}CG$Dc,]z52$A듚}M!u }p2 r_翴֯U_Y m28I>9ZtwP 5uAnC-ٸm}sUUm6Ϧc7 ^Z9LEcۻ\%tXoj^k.+/̜ǦZִxt ^ǩcj\Je\.9۟Z1a /#O ƕXG. hc/ϫZ:\7|lq->mpyH{'J]//|Xع14:AOԯA?dygkw~*S{e\ܿFMCơ uqv<H,?` /_Y檷`PshD5>!HhcȻJem=sLе{CC Z Au/ s. džUk#sXAY^c_egkA^g]c=0vOwGҲ>ӌzգ]}{WٕoI@+×m.Ɖ >+Ӿj޿'u\^HCheVSHwI1ۃzԾ/ͣ._MkqNdEвMݣ41KcMW?YsqfnDz j&_|ejαFM7 cS`uj[XIӸhUޑԟhէ&a>NfͿc &+mV49iЅ[] wGESI$I%+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI%yVN<}ϸ(\O=#MSCS?:_nko[~7U>XLkN' :8ͽ״6ӒuEg5;o+RI%m/GX?b}uUI?*wH?DjjO?3fNO6E+W[WkMtb-\+mu0 uӎ c:s*׸ZX p?`ca%@h<J/QWջu ^nov~t/.xɨlfVc{ '!hu7YuMvgpNkCg7}V\)pexKipNvZ u.s^܊pki 0t'We`dbEi~esh^mf-}J,4}Y(d[8SLvS|>6S\Zn2>[Yzwӄʝ6ñ E>Ep. eWtk[qAhwx+6QWWk=!cMdN+g}AJ &Ȭ}iVige3:.2d?0>VB77qOQ>C$~ eWI6 Kl5n阞γN6e{I&'1չ5u0[MbW}SɹAϲƒ|B-zoSz nN[4Ѡ\_?S2gYmLu:;p ;ehc\n[1 ?L=3{?imoa^Kp>+ gGlkb9qe`u~UHnǮ4cGQԧ7gi_y^vRI$ jN22\Ǵn0Y$5<zvMZ8ȨCg겿/Z37Yv[V}gѐgc˺F9u w^kc\9Il,2Yh{>t?XpOF}FV<>H?_B߳kXwJ.GO̯9dH>$>eu_T73do L*νvoHL_Gs`}`daEvWܒ4X_խ g۟6i44XtvQzE[41t ϰcm.jU#WcK}28.sst[Mx.eN}{O-S*ƋC889#E֭ӾuNm?)sAtS7Wνk gEe_OG8ɰ &@'}Vхr3ݏk*gHF8u ]qchgA՞^C_em߫ J63qxf;W uq'X^VJbU*cwI* L|Nhn$_NtZ>am7/+RI$;"h[ĵ-p3׵pA/>}Y֌ݫ{Weg'ugŇyTvmem ս!çg@ñĶ5n}]?f.2?0_DbecדuyZ72ڜFzёS-[ĵ ȅevv2 *+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_,elu81s$sXִI' &Ԓ7љmxVZ+Ƒ\Fnz׷>6ӣ'Hs~vT<}y֏ Nc:A Z^'IqC. l]Ukq)2 1?tיִK-LQ;o^=v=!a$*h\ѓ4 "Ncԟʿs?h/ӿjOkOlV\Qe11#]^xT>u2ʟmokO P8nRX\._Jk_ZoX܏ڙH9'l:GopK]UjE፬e ZlxDx0>}SMY5.F>_ChF418$s$괿$;U6~Ko_+Um^TrWmtY6X0{3t!Q 8,eouub۽ly}fk k)sѳĕTkZ\@JUz͟\_ss~10\L4h5y_#}}wOpXb}6De7ty/_KX}O[ewU_m{&dHgкSFT]1q."vz_\8=/}A洽$~ _$O7*'@/ȯw?jT:S*?FWGO?D۟NHҏXn>KsAۻy1gl;>'t5SevQϬUwU?4}ssqc d&WEo^q3_Z kai -|8]7NRps2 6]k2'k~/UU=Ha*_Uzuv1ygo~mƗj4wnw/kFIέhfc Kz@+'֟S>JvwK42ku$~}y:O㑇Ysl͏$΄ƿ`btR8<9q{UuQ/~NևjLpevY]~ܲm;䪵w3ɎWE 3Q3#vݱ1Ou]FgXcZX*l1:./~@J 翶wmIU _>+O^?B_A^VQRI$I?g,¼ Նve]7t̬p]Y;v'^kzIC-KL}//啾4$9A^.9-p-sLypii #MS&L?[U._N..I# ii ϪV}|R_ρZ%_Op ;Mg=+SYZ 5~-gkr˨yӸ#E?gzOȓ[p/ta]I$I%+RI$I$_+RI$I$_+RI$I$_+RI$IrX?NyW4(+Z|B]tfco<{!g! ?Wϰ+@0qlhv4K?S˙pSdfA#D~ezF_ I-ťԑ1/[YgXl 04Hc@h>$ +uwOoi XK71Z#x!TiI$5E}O?R[WkWIWXI%^pK鹭/ʬ`i !{OPWdik0c⽷")}6 c}O~71<;cgO/6ԽYcW-7nk>s\SȪ _;}yǰ5ͶA}$6jϬpsrAEH?(IG9] Ϭ[:&pꦚpM7='R|?rުF@7hKoN#I-}uJϷoݲ<6^z茦zq=W폄.fާsu#Vq0b9`qpYWEҾ7gI9,!!)trIE]:;@I+ClޏױmRY-s֟Zp`u*Y]ip ~+1Uɬ5Hs\<Ε? a_԰o*QAp5U|{jƲǸs] Ao,+snii3 d?$*?k?-mڃh^g*SvVC[adHi7>C/ꬳcv_k$ltEb̦^Ks1v^NFZ֓Iv_U}]acԵøRVItc@wuu___Nλ]9y˶9%w_Z{Mmpsi;Kx8I>}[vN-As_1> B粿W:rm$ XeQլʳɹsF2a؟S/u].L!/xcA}kw.C.ۭmp4H>KԺշdcefh?]M%oe0xm#,c1/SvLQ<A}UwYvKnn.tGܽ'K/{~FOOF\5ZgO Wza_}-1ؙ;v BnSv@}YUwOs .g#X|,[u![`X{n`3|]Us(~HhWy?>.M -ok~vh*!pOW_/%~0cVIe5rCD ^E-i%4O0. k ESRI$+RI%_oR32޷+ l ;_~}EoSkN`MmV_(;'pM++"|lǺ֖^W}Xcir6UeOs4B5D+qcC )1%AsH Z_^z}+2GU۟0<M?'N6>Y?G*\Fæ~KW /R|-~*TWaKըƭkSs1P&O~kon/c:Mv]LVZ3Y^ӺD{m79+ͧQ 1VEyp}l-e$I$+RI$I$_+RI$IVKtsN 26O\@Aëʾz 5|ʅC7cko@nM{\yx$}ukW/LG5u*\$z3`5WuޑKvSO%2έW:VVi!6഍ρ`gm\ <+q"75AsYu[R֏_-?`u#{qYNK< v՝ٸTH>'Op=W,mi<&r_u>ٗvH.גO::@{8_5I)$I$I/JI<#X5WJ9$<ץP?Z:ϧՏlC-{?7W_YmuW+kVȇ?=/zcV,k.v]q䓠K/F=X6e\y'`у).2I+]^V+RI$I$_+RI$I$_+W} 폱n_gG37kUo>5=-y }[쏴zrݻ'^Llm ^]^5>54MdS=:ɝ|aM+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_m'Q 2Ivsd/R7u= `DSu\,;kT~ tWP'I#+zNh&٫;k؟zGyk;'K?>K5D~+O?^1:n ,cA?c+mbt% gѐ֊F)I'㼹}Vݎe1c9gvV;;h|dU"4~''Y- | ]VԞ5VAg;wSs\ {U=OZr 5I$'I$I/5DI$ch=a?o̅wN܏v7̫yn*u-x ԫcK*p\`fv7˹d`H&s^B熿*W?z_P>Xqt금7tq$Op y.W]k," %Op . #C\yyyeЭUm$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$,L\{1"FkCAШ]M7ꮭc 0Tl0k-pWeCֿ_oJڶDp'@;.7jލYcvJD`x,LϪx6;Ρdž~j}2i _VC}nK}GKoHc@:jNK?JpgAI$5DI$I$5DI$I$5DI$I$'J}mu!kDO9 h.s9%t$5&#O=VM=qLOxyi y0~i͓_O7q=H|{@0w,w}3hw\W[\&o I_汍IA:ӓ{Z$a`hL,{l;溎?e[toq~x>:8elmu1kD kXրִ@:I$I/+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI%־}V뾩}+*Z_X,*Po9Ti{7ǓU|ס t|y\'T?h~^f֦mV~n#\o7zƿ#CϑGk*==VYYw5x֥ԿML#rX>At9ړ&u6=ֹ 7k=x͗0'4t Ȣ%xqppTg(;_,K>}x1W-$ YsOK̐H҇ԁ#i R׺S+Rx-4v_3u<٘c5nHWaP' %OI% H5_ԟv1Wz7<v\7eGܭHc\AEn"LOy/"+}sh >}eޗ52׳u70b$%Z-kOH \!fOk0I핑gxOt+t'sGK?ڗX.ed8!O}N/nik{\H@{RYL#1mD2dkaj<9k=52wJOvz.x<46>_/+s]- Ȱmaͫ:OaOŢGz7ծFk79A_z7GL}}7{qk VOkV3\e–|- qʁԆ4 a$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+W endstream endobj 1081 0 obj 24640 endobj 1082 0 obj << /Length 1083 0 R /Filter /FlateDecode >> stream HkF_yY#ͥg5BW?T0:PJ 䐃iCqa[K=KnT@օC Ƭ5}gF]eG.bo>z̬Jssgc-oZgv[4̺cҪ~6,m]9[E f?cn|o.<M}8ڍ #c(GeDv `URzf&g7_ Npx#$h6~ g5 }w즄4 /ҋ 3smEv:EީmwjA CsVvYhG vy%3cJ3Β^RNT-Pp %n ga,dߖ ųDY> stream AdobedC    !"(($#$% '+++,.3332-3333333333@  a!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw(8HXhx )9IYiy *:JZjz ?+RI$I$_+RI$I +/̜ǦZִxt F=OUl缀֏2Tl_cK`z]; iNj[߼5~;zvoꏶ}e s'F뾲twvSGr2XGڈ>Aۘ sF'O7= *\G W2^I]O'X?X7؁-y1Tèn1U vijvl7 $og$U*I'`/Reld00>Ͷ5)>}jk[oRG`]{\vM?pozU6U//TڝK%;0?l:ʗ^TozU6O~ήg>:RwÎ_+.5AŬoFEvkcLǨ5GcZ︄Z?Gkߘۚ%]>8.c`H]cW~nnl2<?*dMt+%1][rROdɥ RK`s.p@O}sa{CHor"_o{o~_N LyLgWs4H7W 6~+iҬ.* {+_uHtm=-q-R1s{v'ɮ+[G &O[Q[I$+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI%eQW?heק7k uVg_:Y 33Lgmz<~+>oϮH?cnv^6pSga.n/\ς8.w./_QVv1OzAʻ26d=tr2-6fEF\\ݑukc7<]@yI$I%5DI$I$5DI$I$5DI$~+GdѤtΥ8=͢5#x=_t]8@$x`ѱrIO#-ؽMp$Pkk5 ,E,6f}R .c.W̻E}[78enV pto~[p4?p+S~%u2`}jnFd`t CcgOQܟ0 yY>u~-an13 sO9Ҥc{3MYD5DI$<BP_?[31Z72ڱs}jk]oMa0BcXg;䕛gԟu,=I`.shI;UG}\Ɨ;eI܂zgQ .84 I5O% x!:PRI$K5DI$I)JO~m}u;2iљV'_׏4W~#]@\NHq{vpkV?#䲪~a@u}>dw7|Weѿe}RcHF$}!w.[/VcQ=su 3:5I|]?Vlɫ%$vόp|iu9A+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+W C[WH? ҎA->Zx~wY]oWA٣įz[s[:Km>,ޥ]u ʿ*[sITd%5@ ]կ?[]:˩ !`@1 >KW}V`nu g>&&<s gEE~Ӻ8pտxpQ>kړu<}s~pr?w}Ok9-7r쟃Bz;kve?16CpӺ~\~ Ӻn8ŧI㱬h' /kèUMxNʚ>A{u4SC6U[ko;XI$K+RI$I$_+Tl1{CZH Ls\L@p B :1t&0gS Jc*JΙ3S`*͎Ĩ7i/P̾-ƺCϨ~V_暛~(hڬ~;ÿR諾* }J }+үտJdK.W߸3k`glȽ;j7ISod1u)qkOl-ٕ1' 7pBP~' ױr4{~\}lh0 gt>icK\ A {ǹi ic A;L5DI$VgU]'1}?*KŔdžpQ0om>[$(ɾ=x+ʫ͍>يc%tjʹ}QǯH6~Q+zfk7~crW]uܬkgkn_T˺V~6m6X]!j^/M_:?CvM94< \a4Zhąbd+ @p+Ev'"VoV׎抦I/+RI$I$_+RI$I$_+RI$I$_+RI$I$_+W+~b}N/ʰ979$,_X1׸]lIʣ:};^m`xRwe\쌋_e2\Ou97_em.{u%pw]e:Ǹ2IPPRl/dX' |9=u^*ä>+g+yR|\gk~%}3L}Tr2S4rw9>/Qz'JmvXucO[]oN;?ʽu+Y$_+RI$I$_+RI$I$_+RI$I$_+RI$IS]V27&4aWkrk \;T@龰h?]H=?cv2X?&zT?WÝ`6̒y-w/WӮӻci1 h?4?cvv2X&rSX}a.v/\V6_NI&ۯ0c%yM=7 g݇pƼ9W-oMX;-ikn=Կeunk* 5DI}1?S&{?ӭU諬[ +P3~ٙ7ce6is,eLsִI'=6-xѶxD1xk>ApsN> mv5Ʀq~AUK9W]בcW쾶n?Veەn%r7XDG+}~}"vU6Ct %D|'s;&Z>18'Rt2_K]?ÿ>mOsSbL~Lk _]WQYD2* jbu}L}f?C-'>gEadu,\\>k0uᅮqC] NDٷkۙM4t׹4@ @ |u^>bkF< O %hs;UV_֯am]'Mbb|S]uԆ '0h]嵵.DW[(!4fyBo]z,"mvոk_Xzg]uNq =ia=o/PA> ~ +W{c}4;g2=Jxk+s>p_tK-u̖5gvGܲz<\ -i~'乜uY#]l<87h_,2vp~ ~k˱H {v>zzݣ}L_XU+gZ _:~߿G_JfG+X[Ӳrns21v :v4 tT~S,?mv^zWI #iϷ)񢶵;\IPֿvcCe.{@N`MzzcgmswҀOמHmO9$ F;]f1>'XoT[?5_)̋,}$1m py\vk=-Ϭk5yyX-]`U0un-³)qk y.l~i·Ѱ>?EYy,a8O >l_ڹm=ci].;?YCh+&HW>–3x`:~pu\StFHx d[ܗm3H۸zc`ᵂZGr]GT\kN)<f4}IW֏o6mm|>]W߬L='Vnɘktޤ3pS\/2]'[luz >!vKlt/كl{0~i19?[f)774' teGۉy%Y(Xs n_O}_]|OF4cÈ@^EdQU;uv="A9]V2c it,s^ֹC#+TlX090S9cKCZ$LHh$RJ;f}m֟yymy8N3g@{9^Ǯuk'@ߒ5\Z;:7>gʬEAwߘ2è; ~c?R_ײU[a9]CvgY,>}#z'J]:1Tcdy$$+:N鸬äSK8kICWTI+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$IQ u=O;EIKdh|ƪwMB^f5Y-փ<0ݷ@p> %2+.m'}>M˴ڧ־Η{&EWCw/PؖeKUGq]ds&'\oI}% ~YJcB>M_Bc)jӭU+RI%m/GX?b}uUI?*wH_cVc't|kݳtxjҳqsī%챭ic}Uȫ%R\kj}KX湸{~97dK${;z_Li5V?]/;dݙ3l~Sc{ZH [Ih+ +u[}!0uƲn58A4/mSN>ŷgپog ׯ!O^m͑dBn}_QFIc`}W6Pe.ɪE&Y'k'_-Ӎskj L*Z,x*{K[է}Qx[ebd8m9 4>Z^'It_Ϫ,*Ϻ.i@t"W}VnC2^a_-$/Mmٟܺ9>7pOp"<c}pI9zep,"FYޏz-ZDt%ioH7Z?!VwlI#}jVȽ˩t?ٳnE_skG^[ɨZϲAC$WQu_vZ _;&ƭiųlvF> SWd__3K] 5ۨ];,oS0n/btoӑJss C<-u ܜhfP͙lh@<潘Xm&AUnOR>}If_Nj-CI6{GվuO###{6[굳ř:klʬsv C_>S-:Oվ_^wZկIu/Ucʟ$վ%l{M?.?ʱW97+e}CvOq<>c]fKtO Tٝ* aй>j_VpYnMX}I~ss`0Y>~3){4^zC¨9»HCI?]ׯ/)0Rѳ"71à>|ZY?ORʝ6r ~j}KݹM{}/YD/W7dwߔo, $Ln+k?]\*s6{13slpˉwOEW'VΝ2,;#;.ag}Zf[sVXm cGJ)..f-/ʿ˽MvUNEj=7m2njBFX}Sv-?V8tf?XO˪RN-Zڗ g:ocmD<SKMŠx%? _%halTW*֯V1}>%ix :o_]/Zȿ+RI%nt/Ww(ӷ lj/:oUNAY_Y3N/NsZ߅ ÕϩV3~^wX87mcׁƇֺ8TDˉ1.`۝+I1rW֝ t6F="sr{}3at*1+XIO+ģKCi$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI$I$_+RI%+euv4=k k^A"AЂbrej]VZ{h>A]ZtRYy%cd{6Yl{]Oܿ?վozoTS̋ pp-'B=?QNwHC2] ^pnn3+]I$+}`RW$Pu#/ ɪg?SM{ BPlQ_mmx kHv;NJ 𱾷YGXۃh$j5W<t-+ؽ'Ltw?/Et}6 ~. =O_X(._xy.G0qvYsn\+Գ+u,6\)[ }UKzR˺p{]#zo+W=vwk3h,n=&-4gݭm<"txh9}sZ)X;3 к'DS#sV76;V>SeX͵d"/ռ{Xnsa#] ~SsGoz/I]c#uMM݌A>+O^?B_A^VQRI%:k/kZ`Hys01h,cc!' y7kKDH'5E=YuvY\wjoDT}6k6% #]o'UfK :hZ]I%+RI%W('kIUuՑUUemx.grّC}l{>AtE+RI$I$_+RI$I$_+RI$I$_+UnԺwM99Ti!cd% Pr1*6^=`} lJSK7y,'Uu͕?supLtÍ*~t,LV%ƹ-'i0a^724K658(bd8봁$1ܿ+RI$I$_+RI$I$_?/V)^(^Ԍ.#N&x\Ss?Vo_o^»ЮO)ѓm,N;u ruwI@d~aP<`_g;}GkԞ1X:.ڧp&dAX}R鳭ާH_WNgOӿjT:'>:K k\@;>Ӻa {߫|Iitl =*AKˏZ*>i_[:˺~NmW:V[ah8+z>ݛvC,sZ*sC`|ZWg_uƸi_;}GkԞ1X?qT~5A]4K_ؘ8}?YuLJ[Ea쮶 _F+mUWh Xz&Mu1_ړ'Aqz~5lƱLAc/;g}`.Yu.hAi/Z6qzѺ@;/5̯-u{vKѺoVPu.Y{Y=XV:n=lPn:W]ܬkcs#QA]P]K_]jidѕKw <;}GsԘ $5 Y?y\OEm{ }Y'N\5[ULW_Le6_Cp$-ϫUWn\}AyӚH.s{|>i_[:~NmW:V[ah8+z>rnekZENhlJy_c\@44o{\쾤%wo -H/dD~<%^Ӱ0+ǮZKZ6D~UQF+1j+۷t]B066/<ߨYd2VMVՓ5j߫w_e&o5g>gkK`|$S}SoJim5Z].ִ~ }q蘽? >i~.ӭՃ*s֐]SnbYf]d"8u{Wf7O{0iv! U(68P;}l1}[XddW< ?^l}L?=ߙO4}ocF6seK] endstream endobj 1085 0 obj 13045 endobj 1086 0 obj << /Length 1087 0 R /Filter /FlateDecode >> stream H TC endstream endobj 1087 0 obj 11 endobj 1069 0 obj << /CropBox [ 36 36 756 576 ] /Type /Page /Parent 1058 0 R /Resources << /XObject << /im190 1070 0 R /im191 1076 0 R /im192 1080 0 R /im193 1084 0 R >> /ProcSet 2 0 R >> /Contents [ 1072 0 R 1074 0 R 1078 0 R 1082 0 R 1086 0 R ] >> endobj 14 0 obj << /Type /Font /Subtype /TrueType /Name /F0 /BaseFont /Verdana /FirstChar 32 /LastChar 255 /Widths [ 352 394 459 818 636 1076 727 269 454 454 636 818 364 454 364 454 636 636 636 636 636 636 636 636 636 636 454 454 818 818 818 545 1000 684 686 698 771 632 575 775 751 421 455 693 557 843 748 787 603 787 695 684 616 732 684 989 685 615 685 454 454 454 818 636 636 601 623 521 623 596 352 623 633 274 344 592 274 973 633 607 623 623 427 521 394 633 592 818 592 592 525 635 454 635 818 1000 636 1000 269 636 459 818 636 636 636 1521 684 454 1070 1000 685 1000 1000 269 269 459 459 545 636 1000 636 977 521 454 981 1000 525 615 352 394 636 636 636 636 454 636 636 1000 545 645 818 454 1000 636 542 818 542 542 636 642 636 364 636 542 545 645 1000 1000 1000 545 684 684 684 684 684 684 984 698 632 632 632 632 421 421 421 421 775 748 787 787 787 787 787 818 787 732 732 732 732 615 605 620 601 601 601 601 601 601 955 521 596 596 596 596 274 274 274 274 612 633 607 607 607 607 607 818 607 633 633 633 633 592 623 592 ] /Encoding /WinAnsiEncoding /FontDescriptor 15 0 R >> endobj 15 0 obj << /Type /FontDescriptor /FontName /Verdana /Flags 32 /FontBBox [ -250 -210 1831 1005 ] /MissingWidth 455 /StemV 92 /StemH 92 /ItalicAngle 0 /CapHeight 1005 /XHeight 503 /Ascent 1005 /Descent -210 /Leading 215 /MaxWidth 1526 /AvgWidth 508 >> endobj 18 0 obj << /Type /Font /Subtype /TrueType /Name /F1 /BaseFont /Verdana,Bold /FirstChar 32 /LastChar 255 /Widths [ 342 402 587 867 711 1272 862 332 543 543 711 867 361 480 361 689 711 711 711 711 711 711 711 711 711 711 402 402 867 867 867 617 964 776 762 724 830 683 650 811 837 546 555 771 637 948 847 850 733 850 782 710 682 812 764 1128 764 737 692 543 689 543 867 711 711 668 699 588 699 664 422 699 712 342 403 671 342 1058 712 687 699 699 497 593 456 712 650 979 669 651 597 711 543 711 867 1000 711 1000 332 711 587 1049 711 711 711 1777 710 543 1135 1000 692 1000 1000 332 332 587 587 711 711 1000 711 964 593 543 1068 1000 597 737 342 402 711 711 711 711 543 711 711 964 598 850 867 480 964 711 587 867 598 598 711 721 711 361 711 598 598 850 1182 1182 1182 617 776 776 776 776 776 776 1094 724 683 683 683 683 546 546 546 546 830 847 850 850 850 850 850 867 850 812 812 812 812 737 735 713 668 668 668 668 668 668 1018 588 664 664 664 664 342 342 342 342 679 712 687 687 687 687 687 867 687 712 712 712 712 651 699 651 ] /Encoding /WinAnsiEncoding /FontDescriptor 19 0 R >> endobj 19 0 obj << /Type /FontDescriptor /FontName /Verdana,Bold /Flags 16416 /FontBBox [ -250 -210 2140 1005 ] /MissingWidth 545 /StemV 181 /StemH 181 /ItalicAngle 0 /CapHeight 1005 /XHeight 503 /Ascent 1005 /Descent -210 /Leading 215 /MaxWidth 1783 /AvgWidth 568 >> endobj 29 0 obj << /Type /Font /Subtype /TrueType /Name /F2 /BaseFont /TimesNewRoman /FirstChar 32 /LastChar 255 /Widths [ 250 333 408 500 500 833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 778 500 778 333 500 444 1000 500 500 333 1000 556 333 889 778 611 778 778 333 333 444 444 350 500 1000 333 980 389 333 722 778 444 722 250 333 500 500 500 500 200 500 333 760 276 500 564 333 760 500 400 549 300 300 333 576 453 250 333 300 310 500 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 549 500 500 500 500 500 500 500 500 ] /Encoding /WinAnsiEncoding /FontDescriptor 30 0 R >> endobj 30 0 obj << /Type /FontDescriptor /FontName /TimesNewRoman /Flags 34 /FontBBox [ -250 -216 1165 1000 ] /MissingWidth 323 /StemV 73 /StemH 73 /ItalicAngle 0 /CapHeight 891 /XHeight 446 /Ascent 891 /Descent -216 /Leading 149 /MaxWidth 971 /AvgWidth 401 >> endobj 152 0 obj << /Type /Font /Subtype /TrueType /Name /F3 /BaseFont /Verdana,Italic /FirstChar 32 /LastChar 255 /Widths [ 352 394 459 818 636 1076 727 269 454 454 636 818 364 454 364 454 636 636 636 636 636 636 636 636 636 636 454 454 818 818 818 545 1000 683 686 698 766 632 575 775 751 421 455 693 557 843 748 787 603 787 695 684 616 732 683 990 685 615 685 454 454 454 818 636 636 601 623 521 623 596 352 622 633 274 344 587 274 973 633 607 623 623 427 521 394 633 591 818 592 591 525 635 454 635 818 1000 636 1000 269 636 459 818 636 636 636 1519 684 454 1070 1000 685 1000 1000 269 269 459 459 545 636 1000 636 977 521 454 980 1000 525 615 352 394 636 636 636 636 454 636 636 1000 545 645 818 454 1000 636 542 818 542 542 636 642 636 364 636 542 545 645 1000 1000 1000 545 683 683 683 683 683 683 989 698 632 632 632 632 421 421 421 421 766 748 787 787 787 787 787 818 787 732 732 732 732 615 605 620 601 601 601 601 601 601 955 521 596 596 596 596 274 274 274 274 612 633 607 607 607 607 607 818 607 633 633 633 633 591 623 591 ] /Encoding /WinAnsiEncoding /FontDescriptor 153 0 R >> endobj 153 0 obj << /Type /FontDescriptor /FontName /Verdana,Italic /Flags 96 /FontBBox [ -250 -210 1828 1005 ] /MissingWidth 455 /StemV 92 /StemH 92 /ItalicAngle -11 /CapHeight 1005 /XHeight 503 /Ascent 1005 /Descent -210 /Leading 215 /MaxWidth 1523 /AvgWidth 508 >> endobj 586 0 obj << /Type /Font /Subtype /TrueType /Name /F4 /BaseFont /Arial /FirstChar 32 /LastChar 255 /Widths [ 278 278 355 556 556 889 667 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 333 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334 584 750 556 750 222 556 333 1000 556 556 333 1000 667 333 1000 750 611 750 750 222 222 333 333 350 556 1000 333 1000 500 333 944 750 500 667 278 333 556 556 556 556 260 556 333 737 370 556 584 333 737 552 400 549 333 333 333 576 537 278 333 333 365 556 834 834 834 611 667 667 667 667 667 667 1000 722 667 667 667 667 278 278 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 556 556 556 556 556 556 889 500 556 556 556 556 278 278 278 278 556 556 556 556 556 556 556 549 611 556 556 556 556 500 556 500 ] /Encoding /WinAnsiEncoding /FontDescriptor 587 0 R >> endobj 587 0 obj << /Type /FontDescriptor /FontName /Arial /Flags 32 /FontBBox [ -250 -212 1208 1000 ] /MissingWidth 276 /StemV 80 /StemH 80 /ItalicAngle 0 /CapHeight 905 /XHeight 453 /Ascent 905 /Descent -212 /Leading 150 /MaxWidth 1007 /AvgWidth 441 >> endobj 588 0 obj << /Type /Font /Subtype /TrueType /Name /F5 /BaseFont /Arial,Bold /FirstChar 32 /LastChar 255 /Widths [ 278 333 474 556 556 889 722 238 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 333 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 389 280 389 584 750 556 750 278 556 500 1000 556 556 333 1000 667 333 1000 750 611 750 750 278 278 500 500 350 556 1000 333 1000 556 333 944 750 500 667 278 333 556 556 556 556 280 556 333 737 370 556 584 333 737 552 400 549 333 333 333 576 556 278 333 333 365 556 834 834 834 611 722 722 722 722 722 722 1000 722 667 667 667 667 278 278 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 556 556 556 556 556 556 889 556 556 556 556 556 278 278 278 278 611 611 611 611 611 611 611 549 611 611 611 611 611 556 611 556 ] /Encoding /WinAnsiEncoding /FontDescriptor 589 0 R >> endobj 589 0 obj << /Type /FontDescriptor /FontName /Arial,Bold /Flags 16416 /FontBBox [ -250 -212 1165 1000 ] /MissingWidth 323 /StemV 153 /StemH 153 /ItalicAngle 0 /CapHeight 905 /XHeight 453 /Ascent 905 /Descent -212 /Leading 150 /MaxWidth 971 /AvgWidth 479 >> endobj 761 0 obj << /Type /Font /Subtype /TrueType /Name /F6 /BaseFont /Symbol /FirstChar 30 /LastChar 255 /Widths [ 600 600 250 333 713 500 549 833 778 439 333 333 500 549 250 549 250 278 500 500 500 500 500 500 500 500 500 500 278 278 549 549 549 444 549 722 667 722 612 611 763 603 722 333 631 722 686 889 722 722 768 741 556 592 611 690 439 768 645 795 611 333 863 333 658 500 500 631 549 549 494 439 521 411 603 329 603 549 549 576 521 549 549 521 549 603 439 576 713 686 493 686 494 480 200 480 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 620 247 549 167 713 500 753 753 753 753 1042 987 603 987 603 400 549 411 549 549 713 494 460 549 549 549 549 1000 603 1000 658 823 686 795 987 768 768 823 768 768 713 713 713 713 713 713 713 768 713 790 790 890 823 549 250 713 603 603 1042 987 603 987 603 494 329 790 790 786 713 384 384 384 384 384 384 494 494 494 494 600 329 274 686 686 686 384 384 384 384 384 384 494 494 494 600 ] /FontDescriptor 762 0 R >> endobj 762 0 obj << /Type /FontDescriptor /FontName /Symbol /Flags 6 /FontBBox [ -250 -220 1250 1005 ] /MissingWidth 333 /StemV 109 /StemH 109 /ItalicAngle 0 /CapHeight 1005 /XHeight 503 /Ascent 1005 /Descent -220 /Leading 225 /MaxWidth 1042 /AvgWidth 600 >> endobj 940 0 obj << /Type /Font /Subtype /TrueType /Name /F7 /BaseFont /FHHCEB+Wingdings /FirstChar 30 /LastChar 255 /Widths [ 500 500 1000 1030 1145 1301 1344 894 1217 458 1084 892 1132 1132 1171 1171 1441 1443 1096 1343 699 699 892 554 602 1072 948 1078 939 891 892 892 891 910 910 587 793 674 674 942 942 549 549 892 843 843 843 1111 660 849 1089 888 880 650 813 747 747 723 693 794 885 892 896 891 1156 1054 964 1090 941 933 946 1025 929 1096 1065 780 1050 1271 747 953 747 891 891 891 891 458 747 986 891 578 1060 1060 891 892 892 530 530 500 892 892 892 892 892 892 892 892 892 892 892 892 892 892 892 892 892 892 892 892 892 892 1000 1000 1000 1000 1000 1000 1000 1000 313 458 313 891 891 891 891 891 953 458 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 891 1048 1048 1048 1048 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1253 1253 794 794 891 891 891 891 891 891 979 979 891 891 776 776 776 776 1067 1067 891 891 873 873 873 873 891 891 811 811 1060 811 782 782 782 782 482 385 635 786 892 892 1035 ] /FontDescriptor 941 0 R >> endobj 941 0 obj << /Type /FontDescriptor /FontName /FHHCEB+Wingdings /Flags 16388 /FontBBox [ -250 -211 1738 1000 ] /MissingWidth 895 /StemV 284 /StemH 284 /ItalicAngle 0 /CapHeight 899 /XHeight 450 /Ascent 899 /Descent -211 /Leading 110 /MaxWidth 1448 /AvgWidth 890 /FontFile2 1088 0 R >> endobj 1088 0 obj << /Filter /FlateDecode /Length 1089 0 R /Length1 1091 0 R >> stream HUiPUG*. sC=T . @nAAF4qG\D c b5&XŌ015f܇T{sO # fr\ csk%qoZjnr~6$Z\ :pB2^x9ě='gAƿ/'[i*2N;I v눾Mtܢc*WKMvwҙ͹%4yb&yu^rn_tݘWXoVOo6A^l=$x8n&[8UE3Y¨Vmf]((4ddҬsٛuZ%YwpԹsWWn=<{[cϷ?A 62|T1&sq'3q) b5kTζ$OԴ9Yssr/(,zĤ3fzdE.-+_>Xiǟlݶ}]5|wj"$ DGTHgb>[c z)| l` ;Áj]YWDD/ /} /c"a  0# #QhA$L0# c1 x1 XLB, | *ZTa *1$c*!f" d" sb(@!>$L ,,r,b,A)Rߕc%C|&l[ ۱; 5؍={jqqqG94q'p_p_ Y|s"Єf\D .[\\5\ -w~}'  O4q;FB*KtZm)FʞZj^!CJ14RMY#,ȳ*VVV(I@N #ȫbQ*Y#}zBKOt`&Ŧtfah/jq.Ϟ?X܍/7-|;?DY'gU%(B0C(ʅ#Bp_h9#pq8|o[ş)\$oiBȔIR*MjQqʡrKT\7!P1*qJRTZ6mGf]6n7 |vaDR{AɱuJL= f$3#ʟQ eE7>,BOC;ɷ EyJ>6JJ -UZ>:ow^VLVaH{*ipLR)OZһKDp<M1ӆdb$ưh*ޔTUL}S2$3G2C2$묆!,_5Tɠ6鱉^k2$Zu=Ѻ}#^^jv4f-8l1:{HCd]?iiO+-ʐ_Ǣ™u!u6dm0n&xӴD+)_c 1Uc49RSǨY;RUiC!-yf&$'gtL؅ l|fx euL$4 x7ﶰS4g:YYYj5zII4”D/`7UUn!Y7A\$x'X$N];&RpLb xvԳ3ۙYoRő@)G@P, AB"BJy:;wf?<{g*0fdPؕģ0Ez8sf"}"]j<3b=hzߍN^}t_XozVwT08?ezy[XD{N")N^R h&W9J ώBs2]I$RN`RGUrk1h.~nssiͤ>O34Ge>Ռiw'{v4=3-ylQn٣4k\Eiư4k5[4O˓\+[w6ΖHj󐗍掑PopC~3} db/֡=Z'l)Cv7GRۧu^]eKley# [W1׸7+}޼$O dKžQX/- r?|/Ow `Z"t_?%1 ];}۸#X unzƿƽnvQyr@AM/^B׽- ܛeIUo]8qޏ:ϨWsYzƿG7RQ{o2KD58(RL?}?oXȶ9Avdc߷OwFk#Zq>8 M`g>U='؇IwD]`,,L]OJ(b#' z쌏4pm!/8vſ(}cvw>I'фIJ;w1-E;O%$SK(qL%*NIHKk{RHwKQZ3@8#wI=#VnŒ˯󁡡qtնˮdqS$){AhYoZ0XF- S}t)Qy|V4s%1Ь hqk+(+< l̮qUJ>ice))|B/ ê<ü`&l5ESh<_[DNNRf$FJZ?[UuMqFw-Z!t m W\pf^P:?vdQ i(maEԿD2` C(|M!\q峝ӧ>ݒ-ZTlkA-Shg.G`bOL&522k!7]u͝㊲kZ&4HiYU]x‘9Gg`Heg-ֈ)u>d(k;uI@6P[ 2\j6C٫ l t2fh ,*aE7k޺ y᪡W|(r$Mө3U7Uk[y +Ri"ekEgǩ%鿭{%,z zG!KhP |'+qTq, ./(}ytI܏l]b)wΞ{ҬyD\a + Sm@יHH9t!T2Cݢ(md4`MbUl5iK[o xJP5I*ɺ]kNڢ9? i1?cN'iAt) *)T )'PWA@k: _54uC.(.ܺj.'_5 z5H˼PY60鴖.9GG>* UlS),^G!NgM:0[rʑ\Ve˭s*ιvVDNf&Wke*IC3h3lVf 3neXOc#:ΊYή3>dTHZ]aYo>ȑ]@jWMJY8ж04<@O САwHlqF(;9H#WaǐJzҶ̑,27iD@Q{3Vd<PrzUpGra}Ӣ 3(l'ӭA;cǐ : Nvvf4=03333333sHRU=;+Dz.E5ǒc%mQGAk3w63E>?wZ[kGo {v@,VT;΃\hm"A!Gq.eʕDGr87HH4p1K48-'e|m}sLƶ]R3r3f]Jr xNZ@\Vz#=h`L繍%+8.ʈR{8.{SqZ섒 G L;,gB1[//50 ^r[ܓn'g4d&%ĴTc|LDݷ)?LNuM7hh;bHJwH-lX "\ ͎.5?]:ևU*qHfΨ\|-혾4@ bΖ#f,25D* lF@ <<]L0e<24%3DrOr3=0H8o\o$ߦ\fٚy[0w4^[~XuӴ-ߺF q$Js)Q(=.iunl}=[t#-/N&۷j go`ӗ; ghy(޷wk(8S"N0^쫌y%vUƜ'\bo,:P-C/*0^}ues}G ye-l.TC ϳo-q~ jB,6geC Wvw*[|Om.#6\;5[oBrU?9I[jne$.yɐvҳj8"? 8sph蠋5c'p-\uq=\7 q#7Mq3-[ָ ny#-]p8 p7\'{>㾸K\@\+p%ƒpCP< #p5Gx x>Pc!"< ##A ȡQSp3x2ix:gYx6yx>^Ex1^ex9^WUx5^ux=ހ7Mx3ނmx;ށw]x7ރ}x?>C0>c8>OS4>s~G1~g9~_W5~w=?O3o;3/PL%Ati#(d+/q{Z+}Wq|OQ#0VU6L8 y: ʃ5LTfѺ4)6^{pצef6gicOOP3dŪPZ}u˳DaZXkõqZjiTFIq, ZC#=jɇo^r6;>ͣBWT*& f1,~e i፬`ή!h0,Z&NC۲4⢭EMTY^t:MzTqZ&*Ey{j2CF3@R:I:RG~ R"n}MeL# 4&V]]xyIħ$5KtHQ]HFy5X(q^SiEiW{AD¢R/#ZOZ~)K,"uzS44*[miB?y9Ϛ* fG}/~*j(=ƄĤOMM S}hV m!պ)汘ʜEd'"̈́GJR 9aJ"'lu(t&"*U4:mB[ou2'f>ɭ$Vvqo5ƴ+ߞ|5ŻK0JSfTl3G%4)NZEsMCR׊3*#ZTьݶS5T3v!5)OU=jC(:Vvڴ_c]'Yڔ4`Ԧ+5tHʧtZ^ɦ%s;5sŽVLU{y.>xf95sL6:vRjj[Ike6'Y+-TJ*JjM5Lu7LiYԪw )=;tW;BbSHn5-`쩲ʞVc?y3S招饁Q q=c o{o@dYGuaQ;{\_W|7( endstream endobj 1089 0 obj 7536 endobj 1091 0 obj 14958 endobj 1090 0 obj 0 endobj 1092 0 obj 0 endobj 953 0 obj << /Type /Font /Subtype /TrueType /Name /F8 /BaseFont /CourierNew,Bold /FirstChar 32 /LastChar 255 /Widths [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] /Encoding /WinAnsiEncoding /FontDescriptor 954 0 R >> endobj 954 0 obj << /Type /FontDescriptor /FontName /CourierNew,Bold /Flags 16418 /FontBBox [ -250 -300 715 1000 ] /MissingWidth 596 /StemV 191 /StemH 191 /ItalicAngle 0 /CapHeight 833 /XHeight 417 /Ascent 833 /Descent -300 /Leading 133 /MaxWidth 596 /AvgWidth 600 >> endobj 2 0 obj [ /PDF /Text /ImageB /ImageC /ImageI ] endobj 5 0 obj << /Kids [4 0 R 20 0 R 33 0 R 52 0 R 63 0 R 74 0 R ] /Count 6 /Type /Pages /Parent 1093 0 R >> endobj 86 0 obj << /Kids [85 0 R 97 0 R 108 0 R 119 0 R 130 0 R 141 0 R ] /Count 6 /Type /Pages /Parent 1093 0 R >> endobj 155 0 obj << /Kids [154 0 R 166 0 R 177 0 R 188 0 R 205 0 R 216 0 R ] /Count 6 /Type /Pages /Parent 1093 0 R >> endobj 228 0 obj << /Kids [227 0 R 239 0 R 250 0 R 261 0 R 272 0 R 283 0 R ] /Count 6 /Type /Pages /Parent 1093 0 R >> endobj 303 0 obj << /Kids [302 0 R 314 0 R 325 0 R 336 0 R 347 0 R 362 0 R ] /Count 6 /Type /Pages /Parent 1093 0 R >> endobj 374 0 obj << /Kids [373 0 R 385 0 R 396 0 R 407 0 R 418 0 R 429 0 R ] /Count 6 /Type /Pages /Parent 1093 0 R >> endobj 441 0 obj << /Kids [440 0 R 452 0 R 463 0 R 474 0 R 485 0 R 496 0 R ] /Count 6 /Type /Pages /Parent 1094 0 R >> endobj 508 0 obj << /Kids [507 0 R 519 0 R 530 0 R 541 0 R 552 0 R 563 0 R ] /Count 6 /Type /Pages /Parent 1094 0 R >> endobj 575 0 obj << /Kids [574 0 R 590 0 R 601 0 R 612 0 R 623 0 R 634 0 R ] /Count 6 /Type /Pages /Parent 1094 0 R >> endobj 650 0 obj << /Kids [649 0 R 661 0 R 672 0 R 683 0 R 694 0 R 705 0 R ] /Count 6 /Type /Pages /Parent 1094 0 R >> endobj 717 0 obj << /Kids [716 0 R 728 0 R 739 0 R 750 0 R 763 0 R 774 0 R ] /Count 6 /Type /Pages /Parent 1094 0 R >> endobj 786 0 obj << /Kids [785 0 R 797 0 R 808 0 R 819 0 R 830 0 R 841 0 R ] /Count 6 /Type /Pages /Parent 1094 0 R >> endobj 853 0 obj << /Kids [852 0 R 864 0 R 875 0 R 886 0 R 897 0 R 908 0 R ] /Count 6 /Type /Pages /Parent 1095 0 R >> endobj 920 0 obj << /Kids [919 0 R 931 0 R 944 0 R 957 0 R 968 0 R 979 0 R ] /Count 6 /Type /Pages /Parent 1095 0 R >> endobj 991 0 obj << /Kids [990 0 R 1002 0 R 1013 0 R 1024 0 R 1035 0 R 1046 0 R ] /Count 6 /Type /Pages /Parent 1095 0 R >> endobj 1058 0 obj << /Kids [1057 0 R 1069 0 R ] /Count 2 /Type /Pages /Parent 1095 0 R >> endobj 1093 0 obj << /Kids [5 0 R 86 0 R 155 0 R 228 0 R 303 0 R 374 0 R ] /Count 36 /Type /Pages /Parent 1096 0 R >> endobj 1094 0 obj << /Kids [441 0 R 508 0 R 575 0 R 650 0 R 717 0 R 786 0 R ] /Count 36 /Type /Pages /Parent 1096 0 R >> endobj 1095 0 obj << /Kids [853 0 R 920 0 R 991 0 R 1058 0 R ] /Count 20 /Type /Pages /Parent 1096 0 R >> endobj 1096 0 obj << /Kids [1093 0 R 1094 0 R 1095 0 R ] /Count 92 /Type /Pages /MediaBox [ 0 0 792 612 ] >> endobj 1 0 obj << /Creator /CreationDate (D:20070404153150) /Title /Author /Producer (Acrobat PDFWriter 5.0 for Windows NT) >> endobj 3 0 obj << /Pages 1096 0 R /Type /Catalog >> endobj xref 0 1097 0000000000 65535 f 0000706610 00000 n 0000704233 00000 n 0000706982 00000 n 0000021389 00000 n 0000704288 00000 n 0000000184 00000 n 0000009940 00000 n 0000000019 00000 n 0000000166 00000 n 0000009960 00000 n 0000010791 00000 n 0000010811 00000 n 0000020569 00000 n 0000684243 00000 n 0000685341 00000 n 0000020590 00000 n 0000021369 00000 n 0000685599 00000 n 0000686705 00000 n 0000024838 00000 n 0000021879 00000 n 0000022795 00000 n 0000021606 00000 n 0000021859 00000 n 0000022815 00000 n 0000023370 00000 n 0000023390 00000 n 0000024306 00000 n 0000686973 00000 n 0000688064 00000 n 0000024326 00000 n 0000024818 00000 n 0000084175 00000 n 0000025343 00000 n 0000026259 00000 n 0000025070 00000 n 0000025323 00000 n 0000026279 00000 n 0000026844 00000 n 0000026864 00000 n 0000027780 00000 n 0000027800 00000 n 0000028557 00000 n 0000028577 00000 n 0000053117 00000 n 0000053286 00000 n 0000083953 00000 n 0000053139 00000 n 0000053267 00000 n 0000083975 00000 n 0000084155 00000 n 0000088129 00000 n 0000084721 00000 n 0000085637 00000 n 0000084447 00000 n 0000084701 00000 n 0000085657 00000 n 0000086223 00000 n 0000086243 00000 n 0000087160 00000 n 0000087180 00000 n 0000088109 00000 n 0000092111 00000 n 0000088635 00000 n 0000089552 00000 n 0000088362 00000 n 0000088615 00000 n 0000089572 00000 n 0000090146 00000 n 0000090166 00000 n 0000091083 00000 n 0000091103 00000 n 0000092091 00000 n 0000095734 00000 n 0000092619 00000 n 0000093536 00000 n 0000092345 00000 n 0000092599 00000 n 0000093556 00000 n 0000094112 00000 n 0000094132 00000 n 0000095049 00000 n 0000095069 00000 n 0000095714 00000 n 0000099480 00000 n 0000704398 00000 n 0000096242 00000 n 0000097159 00000 n 0000095968 00000 n 0000096222 00000 n 0000097179 00000 n 0000097736 00000 n 0000097756 00000 n 0000098673 00000 n 0000098693 00000 n 0000099460 00000 n 0000103485 00000 n 0000099991 00000 n 0000100908 00000 n 0000099715 00000 n 0000099970 00000 n 0000100928 00000 n 0000101496 00000 n 0000101517 00000 n 0000102436 00000 n 0000102457 00000 n 0000103464 00000 n 0000107342 00000 n 0000104001 00000 n 0000104920 00000 n 0000103724 00000 n 0000103980 00000 n 0000104941 00000 n 0000105497 00000 n 0000105518 00000 n 0000106437 00000 n 0000106458 00000 n 0000107321 00000 n 0000111213 00000 n 0000107860 00000 n 0000108779 00000 n 0000107583 00000 n 0000107839 00000 n 0000108800 00000 n 0000109355 00000 n 0000109376 00000 n 0000110295 00000 n 0000110316 00000 n 0000111192 00000 n 0000115670 00000 n 0000111731 00000 n 0000112650 00000 n 0000111454 00000 n 0000111710 00000 n 0000112671 00000 n 0000113234 00000 n 0000113255 00000 n 0000114174 00000 n 0000114195 00000 n 0000115648 00000 n 0000120073 00000 n 0000116180 00000 n 0000117099 00000 n 0000115899 00000 n 0000116159 00000 n 0000117120 00000 n 0000117685 00000 n 0000117706 00000 n 0000118625 00000 n 0000118646 00000 n 0000120051 00000 n 0000688325 00000 n 0000689432 00000 n 0000124434 00000 n 0000704514 00000 n 0000120593 00000 n 0000121512 00000 n 0000120315 00000 n 0000120572 00000 n 0000121533 00000 n 0000122105 00000 n 0000122126 00000 n 0000123045 00000 n 0000123066 00000 n 0000124412 00000 n 0000128940 00000 n 0000124942 00000 n 0000125861 00000 n 0000124664 00000 n 0000124921 00000 n 0000125882 00000 n 0000126440 00000 n 0000126461 00000 n 0000127380 00000 n 0000127401 00000 n 0000128918 00000 n 0000133210 00000 n 0000129447 00000 n 0000130366 00000 n 0000129170 00000 n 0000129426 00000 n 0000130387 00000 n 0000130946 00000 n 0000130967 00000 n 0000131886 00000 n 0000131907 00000 n 0000133188 00000 n 0000140015 00000 n 0000133730 00000 n 0000134649 00000 n 0000133453 00000 n 0000133709 00000 n 0000134670 00000 n 0000135240 00000 n 0000135261 00000 n 0000136180 00000 n 0000139756 00000 n 0000136429 00000 n 0000139734 00000 n 0000136201 00000 n 0000136408 00000 n 0000139884 00000 n 0000139904 00000 n 0000139995 00000 n 0000143780 00000 n 0000140535 00000 n 0000141454 00000 n 0000140256 00000 n 0000140514 00000 n 0000141475 00000 n 0000142031 00000 n 0000142052 00000 n 0000142971 00000 n 0000142992 00000 n 0000143759 00000 n 0000148245 00000 n 0000144299 00000 n 0000145218 00000 n 0000144022 00000 n 0000144278 00000 n 0000145239 00000 n 0000145796 00000 n 0000145817 00000 n 0000146736 00000 n 0000146757 00000 n 0000148223 00000 n 0000152611 00000 n 0000704633 00000 n 0000148756 00000 n 0000149675 00000 n 0000148475 00000 n 0000148735 00000 n 0000149696 00000 n 0000150264 00000 n 0000150285 00000 n 0000151204 00000 n 0000151225 00000 n 0000152589 00000 n 0000157069 00000 n 0000153133 00000 n 0000154052 00000 n 0000152854 00000 n 0000153112 00000 n 0000154073 00000 n 0000154642 00000 n 0000154663 00000 n 0000155582 00000 n 0000155603 00000 n 0000157047 00000 n 0000161813 00000 n 0000157579 00000 n 0000158498 00000 n 0000157299 00000 n 0000157558 00000 n 0000158519 00000 n 0000159095 00000 n 0000159116 00000 n 0000160035 00000 n 0000160056 00000 n 0000161791 00000 n 0000166578 00000 n 0000162321 00000 n 0000163240 00000 n 0000162043 00000 n 0000162300 00000 n 0000163261 00000 n 0000163819 00000 n 0000163840 00000 n 0000164759 00000 n 0000164780 00000 n 0000166556 00000 n 0000170434 00000 n 0000167085 00000 n 0000168004 00000 n 0000166808 00000 n 0000167064 00000 n 0000168025 00000 n 0000168584 00000 n 0000168605 00000 n 0000169524 00000 n 0000169545 00000 n 0000170413 00000 n 0000187108 00000 n 0000170956 00000 n 0000171875 00000 n 0000170676 00000 n 0000170935 00000 n 0000171896 00000 n 0000172464 00000 n 0000172485 00000 n 0000173404 00000 n 0000173425 00000 n 0000174061 00000 n 0000174082 00000 n 0000180476 00000 n 0000180684 00000 n 0000186973 00000 n 0000180498 00000 n 0000180664 00000 n 0000186995 00000 n 0000187088 00000 n 0000191045 00000 n 0000704752 00000 n 0000187686 00000 n 0000188605 00000 n 0000187409 00000 n 0000187665 00000 n 0000188626 00000 n 0000189182 00000 n 0000189203 00000 n 0000190122 00000 n 0000190143 00000 n 0000191024 00000 n 0000195895 00000 n 0000191564 00000 n 0000192483 00000 n 0000191287 00000 n 0000191543 00000 n 0000192504 00000 n 0000193058 00000 n 0000193079 00000 n 0000193998 00000 n 0000194019 00000 n 0000195873 00000 n 0000200522 00000 n 0000196402 00000 n 0000197321 00000 n 0000196125 00000 n 0000196381 00000 n 0000197342 00000 n 0000197905 00000 n 0000197926 00000 n 0000198845 00000 n 0000198866 00000 n 0000200500 00000 n 0000204550 00000 n 0000201032 00000 n 0000201951 00000 n 0000200752 00000 n 0000201011 00000 n 0000201972 00000 n 0000202537 00000 n 0000202558 00000 n 0000203477 00000 n 0000203498 00000 n 0000204529 00000 n 0000214866 00000 n 0000205058 00000 n 0000205977 00000 n 0000204780 00000 n 0000205037 00000 n 0000205998 00000 n 0000206571 00000 n 0000206592 00000 n 0000207511 00000 n 0000207532 00000 n 0000208316 00000 n 0000208337 00000 n 0000214731 00000 n 0000214753 00000 n 0000214846 00000 n 0000219272 00000 n 0000215425 00000 n 0000216344 00000 n 0000215144 00000 n 0000215404 00000 n 0000216365 00000 n 0000216922 00000 n 0000216943 00000 n 0000217862 00000 n 0000217883 00000 n 0000219250 00000 n 0000222944 00000 n 0000704871 00000 n 0000219779 00000 n 0000220698 00000 n 0000219502 00000 n 0000219758 00000 n 0000220719 00000 n 0000221277 00000 n 0000221298 00000 n 0000222217 00000 n 0000222238 00000 n 0000222923 00000 n 0000227401 00000 n 0000223467 00000 n 0000224386 00000 n 0000223186 00000 n 0000223446 00000 n 0000224407 00000 n 0000224977 00000 n 0000224998 00000 n 0000225917 00000 n 0000225938 00000 n 0000227379 00000 n 0000231947 00000 n 0000227909 00000 n 0000228828 00000 n 0000227631 00000 n 0000227888 00000 n 0000228849 00000 n 0000229405 00000 n 0000229426 00000 n 0000230345 00000 n 0000230366 00000 n 0000231925 00000 n 0000236588 00000 n 0000232468 00000 n 0000233387 00000 n 0000232190 00000 n 0000232447 00000 n 0000233408 00000 n 0000233965 00000 n 0000233986 00000 n 0000234905 00000 n 0000234926 00000 n 0000236566 00000 n 0000241269 00000 n 0000237123 00000 n 0000238042 00000 n 0000236843 00000 n 0000237102 00000 n 0000238063 00000 n 0000238630 00000 n 0000238651 00000 n 0000239570 00000 n 0000239591 00000 n 0000241247 00000 n 0000245992 00000 n 0000241802 00000 n 0000242721 00000 n 0000241524 00000 n 0000241781 00000 n 0000242742 00000 n 0000243309 00000 n 0000243330 00000 n 0000244249 00000 n 0000244270 00000 n 0000245970 00000 n 0000249552 00000 n 0000704990 00000 n 0000246500 00000 n 0000247419 00000 n 0000246222 00000 n 0000246479 00000 n 0000247440 00000 n 0000248016 00000 n 0000248037 00000 n 0000248956 00000 n 0000248977 00000 n 0000249531 00000 n 0000253212 00000 n 0000250071 00000 n 0000250990 00000 n 0000249794 00000 n 0000250050 00000 n 0000251011 00000 n 0000251569 00000 n 0000251590 00000 n 0000252509 00000 n 0000252530 00000 n 0000253191 00000 n 0000257614 00000 n 0000253731 00000 n 0000254650 00000 n 0000253454 00000 n 0000253710 00000 n 0000254671 00000 n 0000255230 00000 n 0000255251 00000 n 0000256170 00000 n 0000256191 00000 n 0000257592 00000 n 0000261993 00000 n 0000258120 00000 n 0000259039 00000 n 0000257844 00000 n 0000258099 00000 n 0000259060 00000 n 0000259628 00000 n 0000259649 00000 n 0000260568 00000 n 0000260589 00000 n 0000261971 00000 n 0000266034 00000 n 0000262500 00000 n 0000263419 00000 n 0000262223 00000 n 0000262479 00000 n 0000263440 00000 n 0000263996 00000 n 0000264017 00000 n 0000264936 00000 n 0000264957 00000 n 0000266013 00000 n 0000270539 00000 n 0000266541 00000 n 0000267460 00000 n 0000266264 00000 n 0000266520 00000 n 0000267481 00000 n 0000268034 00000 n 0000268055 00000 n 0000268974 00000 n 0000268995 00000 n 0000270517 00000 n 0000274520 00000 n 0000705109 00000 n 0000271059 00000 n 0000271978 00000 n 0000270781 00000 n 0000271038 00000 n 0000271999 00000 n 0000272562 00000 n 0000272583 00000 n 0000273502 00000 n 0000273523 00000 n 0000274499 00000 n 0000282757 00000 n 0000275042 00000 n 0000275961 00000 n 0000274762 00000 n 0000275021 00000 n 0000275982 00000 n 0000276548 00000 n 0000276569 00000 n 0000277488 00000 n 0000277509 00000 n 0000282735 00000 n 0000288006 00000 n 0000283264 00000 n 0000284183 00000 n 0000282987 00000 n 0000283243 00000 n 0000284204 00000 n 0000284777 00000 n 0000284798 00000 n 0000285717 00000 n 0000285738 00000 n 0000287984 00000 n 0000294323 00000 n 0000288514 00000 n 0000289433 00000 n 0000288236 00000 n 0000288493 00000 n 0000289454 00000 n 0000290012 00000 n 0000290033 00000 n 0000290952 00000 n 0000290973 00000 n 0000294301 00000 n 0000298536 00000 n 0000294830 00000 n 0000295749 00000 n 0000294553 00000 n 0000294809 00000 n 0000295770 00000 n 0000296329 00000 n 0000296350 00000 n 0000297270 00000 n 0000297291 00000 n 0000298514 00000 n 0000302413 00000 n 0000299059 00000 n 0000299979 00000 n 0000298779 00000 n 0000299038 00000 n 0000300000 00000 n 0000300571 00000 n 0000300592 00000 n 0000301512 00000 n 0000301533 00000 n 0000302392 00000 n 0000336268 00000 n 0000705228 00000 n 0000302926 00000 n 0000303846 00000 n 0000302645 00000 n 0000302905 00000 n 0000303867 00000 n 0000304424 00000 n 0000304445 00000 n 0000305365 00000 n 0000305386 00000 n 0000336245 00000 n 0000689700 00000 n 0000690789 00000 n 0000691044 00000 n 0000692137 00000 n 0000369389 00000 n 0000336806 00000 n 0000337726 00000 n 0000336526 00000 n 0000336785 00000 n 0000337747 00000 n 0000338305 00000 n 0000338326 00000 n 0000339246 00000 n 0000339267 00000 n 0000369366 00000 n 0000397162 00000 n 0000369927 00000 n 0000370847 00000 n 0000369647 00000 n 0000369906 00000 n 0000370868 00000 n 0000371436 00000 n 0000371457 00000 n 0000372377 00000 n 0000372398 00000 n 0000397139 00000 n 0000417536 00000 n 0000397701 00000 n 0000398621 00000 n 0000397420 00000 n 0000397680 00000 n 0000398642 00000 n 0000399211 00000 n 0000399232 00000 n 0000400152 00000 n 0000400173 00000 n 0000417513 00000 n 0000421524 00000 n 0000418072 00000 n 0000418992 00000 n 0000417794 00000 n 0000418051 00000 n 0000419013 00000 n 0000419590 00000 n 0000419611 00000 n 0000420531 00000 n 0000420552 00000 n 0000421503 00000 n 0000449120 00000 n 0000422046 00000 n 0000422966 00000 n 0000421768 00000 n 0000422025 00000 n 0000422987 00000 n 0000423546 00000 n 0000423567 00000 n 0000424487 00000 n 0000424508 00000 n 0000425071 00000 n 0000425092 00000 n 0000448434 00000 n 0000448457 00000 n 0000449099 00000 n 0000452723 00000 n 0000705347 00000 n 0000449665 00000 n 0000450585 00000 n 0000449388 00000 n 0000449644 00000 n 0000450606 00000 n 0000451166 00000 n 0000451187 00000 n 0000452107 00000 n 0000452128 00000 n 0000452702 00000 n 0000457879 00000 n 0000453232 00000 n 0000454152 00000 n 0000452955 00000 n 0000453211 00000 n 0000454173 00000 n 0000454742 00000 n 0000454763 00000 n 0000455683 00000 n 0000455704 00000 n 0000457857 00000 n 0000461933 00000 n 0000458392 00000 n 0000459312 00000 n 0000458111 00000 n 0000458371 00000 n 0000459333 00000 n 0000459890 00000 n 0000459911 00000 n 0000460831 00000 n 0000460852 00000 n 0000461912 00000 n 0000466099 00000 n 0000462443 00000 n 0000463363 00000 n 0000462165 00000 n 0000462422 00000 n 0000463384 00000 n 0000463939 00000 n 0000463960 00000 n 0000464880 00000 n 0000464901 00000 n 0000466077 00000 n 0000469885 00000 n 0000466609 00000 n 0000467529 00000 n 0000466331 00000 n 0000466588 00000 n 0000467550 00000 n 0000468113 00000 n 0000468134 00000 n 0000469054 00000 n 0000469075 00000 n 0000469864 00000 n 0000473587 00000 n 0000470406 00000 n 0000471326 00000 n 0000470129 00000 n 0000470385 00000 n 0000471347 00000 n 0000471913 00000 n 0000471934 00000 n 0000472854 00000 n 0000472875 00000 n 0000473566 00000 n 0000477190 00000 n 0000705466 00000 n 0000474096 00000 n 0000475016 00000 n 0000473819 00000 n 0000474075 00000 n 0000475037 00000 n 0000475611 00000 n 0000475632 00000 n 0000476552 00000 n 0000476573 00000 n 0000477169 00000 n 0000482488 00000 n 0000477702 00000 n 0000478622 00000 n 0000477422 00000 n 0000477681 00000 n 0000478643 00000 n 0000479201 00000 n 0000479222 00000 n 0000480142 00000 n 0000480163 00000 n 0000482466 00000 n 0000486650 00000 n 0000482998 00000 n 0000483918 00000 n 0000482720 00000 n 0000482977 00000 n 0000483939 00000 n 0000484498 00000 n 0000484519 00000 n 0000485439 00000 n 0000485460 00000 n 0000486628 00000 n 0000490596 00000 n 0000487162 00000 n 0000488082 00000 n 0000486882 00000 n 0000487141 00000 n 0000488103 00000 n 0000488674 00000 n 0000488695 00000 n 0000489615 00000 n 0000489636 00000 n 0000490575 00000 n 0000692401 00000 n 0000693469 00000 n 0000495320 00000 n 0000491147 00000 n 0000492067 00000 n 0000490866 00000 n 0000491126 00000 n 0000492088 00000 n 0000492645 00000 n 0000492666 00000 n 0000493586 00000 n 0000493607 00000 n 0000495298 00000 n 0000498872 00000 n 0000495854 00000 n 0000496774 00000 n 0000495577 00000 n 0000495833 00000 n 0000496795 00000 n 0000497354 00000 n 0000497375 00000 n 0000498295 00000 n 0000498316 00000 n 0000498851 00000 n 0000503782 00000 n 0000705585 00000 n 0000499410 00000 n 0000500330 00000 n 0000499129 00000 n 0000499389 00000 n 0000500351 00000 n 0000500920 00000 n 0000500941 00000 n 0000501861 00000 n 0000501882 00000 n 0000503760 00000 n 0000507411 00000 n 0000504319 00000 n 0000505239 00000 n 0000504039 00000 n 0000504298 00000 n 0000505260 00000 n 0000505829 00000 n 0000505850 00000 n 0000506770 00000 n 0000506791 00000 n 0000507390 00000 n 0000517509 00000 n 0000507949 00000 n 0000508869 00000 n 0000507668 00000 n 0000507928 00000 n 0000508890 00000 n 0000509467 00000 n 0000509488 00000 n 0000510408 00000 n 0000510429 00000 n 0000517487 00000 n 0000526931 00000 n 0000518043 00000 n 0000518963 00000 n 0000517766 00000 n 0000518022 00000 n 0000518984 00000 n 0000519543 00000 n 0000519564 00000 n 0000520484 00000 n 0000520505 00000 n 0000526909 00000 n 0000530615 00000 n 0000527466 00000 n 0000528386 00000 n 0000527188 00000 n 0000527445 00000 n 0000528407 00000 n 0000528967 00000 n 0000528988 00000 n 0000529908 00000 n 0000529929 00000 n 0000530594 00000 n 0000534660 00000 n 0000531152 00000 n 0000532072 00000 n 0000530872 00000 n 0000531131 00000 n 0000532093 00000 n 0000532662 00000 n 0000532683 00000 n 0000533603 00000 n 0000533624 00000 n 0000534639 00000 n 0000538483 00000 n 0000705704 00000 n 0000535170 00000 n 0000536090 00000 n 0000534892 00000 n 0000535149 00000 n 0000536111 00000 n 0000536668 00000 n 0000536689 00000 n 0000537609 00000 n 0000537630 00000 n 0000538462 00000 n 0000542745 00000 n 0000538995 00000 n 0000539915 00000 n 0000538715 00000 n 0000538974 00000 n 0000539936 00000 n 0000540491 00000 n 0000540512 00000 n 0000541432 00000 n 0000541453 00000 n 0000542723 00000 n 0000547431 00000 n 0000543280 00000 n 0000544200 00000 n 0000543002 00000 n 0000543259 00000 n 0000544221 00000 n 0000544784 00000 n 0000544805 00000 n 0000545725 00000 n 0000545746 00000 n 0000547409 00000 n 0000556732 00000 n 0000547965 00000 n 0000548885 00000 n 0000547688 00000 n 0000547944 00000 n 0000548906 00000 n 0000549472 00000 n 0000549493 00000 n 0000550413 00000 n 0000550434 00000 n 0000556710 00000 n 0000560291 00000 n 0000557244 00000 n 0000558164 00000 n 0000556964 00000 n 0000557223 00000 n 0000558185 00000 n 0000558758 00000 n 0000558779 00000 n 0000559699 00000 n 0000559720 00000 n 0000560270 00000 n 0000564189 00000 n 0000560813 00000 n 0000561733 00000 n 0000560535 00000 n 0000560792 00000 n 0000561754 00000 n 0000562313 00000 n 0000562334 00000 n 0000563254 00000 n 0000563275 00000 n 0000564168 00000 n 0000567819 00000 n 0000705823 00000 n 0000564724 00000 n 0000565644 00000 n 0000564446 00000 n 0000564703 00000 n 0000565665 00000 n 0000566224 00000 n 0000566245 00000 n 0000567165 00000 n 0000567186 00000 n 0000567798 00000 n 0000571813 00000 n 0000568353 00000 n 0000569273 00000 n 0000568076 00000 n 0000568332 00000 n 0000569294 00000 n 0000569865 00000 n 0000569886 00000 n 0000570806 00000 n 0000693728 00000 n 0000694859 00000 n 0000570827 00000 n 0000571792 00000 n 0000575454 00000 n 0000572347 00000 n 0000573267 00000 n 0000572070 00000 n 0000572326 00000 n 0000573288 00000 n 0000573845 00000 n 0000573866 00000 n 0000574786 00000 n 0000702873 00000 n 0000703965 00000 n 0000574807 00000 n 0000575433 00000 n 0000579239 00000 n 0000575991 00000 n 0000576911 00000 n 0000575711 00000 n 0000575970 00000 n 0000576932 00000 n 0000577490 00000 n 0000577511 00000 n 0000578431 00000 n 0000578452 00000 n 0000579218 00000 n 0000582641 00000 n 0000579761 00000 n 0000580681 00000 n 0000579483 00000 n 0000579740 00000 n 0000580702 00000 n 0000581271 00000 n 0000581292 00000 n 0000582212 00000 n 0000582233 00000 n 0000582620 00000 n 0000586801 00000 n 0000583154 00000 n 0000584074 00000 n 0000582873 00000 n 0000583133 00000 n 0000584095 00000 n 0000584663 00000 n 0000584684 00000 n 0000585604 00000 n 0000585625 00000 n 0000586779 00000 n 0000590778 00000 n 0000705942 00000 n 0000587322 00000 n 0000588242 00000 n 0000587045 00000 n 0000587301 00000 n 0000588263 00000 n 0000588839 00000 n 0000588860 00000 n 0000589780 00000 n 0000589801 00000 n 0000590756 00000 n 0000595103 00000 n 0000591304 00000 n 0000592226 00000 n 0000591023 00000 n 0000591282 00000 n 0000592248 00000 n 0000592809 00000 n 0000592831 00000 n 0000593753 00000 n 0000593775 00000 n 0000595080 00000 n 0000598863 00000 n 0000595636 00000 n 0000596558 00000 n 0000595353 00000 n 0000595614 00000 n 0000596580 00000 n 0000597142 00000 n 0000597164 00000 n 0000598086 00000 n 0000598108 00000 n 0000598841 00000 n 0000602908 00000 n 0000599407 00000 n 0000600329 00000 n 0000599126 00000 n 0000599385 00000 n 0000600351 00000 n 0000600922 00000 n 0000600944 00000 n 0000601866 00000 n 0000601888 00000 n 0000602886 00000 n 0000606719 00000 n 0000603439 00000 n 0000604361 00000 n 0000603158 00000 n 0000603417 00000 n 0000604383 00000 n 0000604942 00000 n 0000604964 00000 n 0000605886 00000 n 0000605908 00000 n 0000606697 00000 n 0000610497 00000 n 0000607249 00000 n 0000608171 00000 n 0000606969 00000 n 0000607227 00000 n 0000608193 00000 n 0000608751 00000 n 0000608773 00000 n 0000609695 00000 n 0000609717 00000 n 0000610475 00000 n 0000614242 00000 n 0000706066 00000 n 0000611032 00000 n 0000611954 00000 n 0000610747 00000 n 0000611010 00000 n 0000611976 00000 n 0000612541 00000 n 0000612563 00000 n 0000613485 00000 n 0000613507 00000 n 0000614220 00000 n 0000683988 00000 n 0000614670 00000 n 0000623063 00000 n 0000614493 00000 n 0000614649 00000 n 0000623086 00000 n 0000623792 00000 n 0000623814 00000 n 0000643588 00000 n 0000643612 00000 n 0000644631 00000 n 0000644653 00000 n 0000669483 00000 n 0000669507 00000 n 0000670593 00000 n 0000670616 00000 n 0000683850 00000 n 0000683874 00000 n 0000683967 00000 n 0000695150 00000 n 0000702786 00000 n 0000702833 00000 n 0000702809 00000 n 0000702853 00000 n 0000706156 00000 n 0000706274 00000 n 0000706395 00000 n 0000706501 00000 n trailer << /Size 1097 /Root 3 0 R /Info 1 0 R /ID [<54d8646b5fc5d104b080fe14b618c767><54d8646b5fc5d104b080fe14b618c767>] >> startxref 707034 %%EOF tinyos-2.1.2+dfsg/apps/AntiTheft/tutorial-slides.ppt000066400000000000000000222270001207233610700224700ustar00rootroot00000000000000ࡱ> J$J$K$L$M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$^$_$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z${$|$}$~$$$$$$$$$$$$$$$$$$$$$$n~ofu~W2.0V0PNG  IHDR WF pHYs.#.#x?v MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3gAMA|Q cHRMz%u0`:o_FdIDATxwد]yOջd5K nظظacHNk$$;I!MلL@fsEl(I0t ݖe[n꽷##rS^뺯HlZZZ G ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `VGp`슕njui[W|nê#Mצ3gUM߻[mήN^x:::|xi6l]Ֆ-ՃW߲b[}e:-+]յ+~_7MgЊ߳VK+wӊ};/ !qlyrok#V2[6U;Y4gNRLWsL9Չfk5][FnpB#{2=#|nZN??[ﻮmY|ߵFHw[Zo3s%xf6--o띸 Q"TYL:hGˁ"\ZL:Fv4Y=:l.1iw<&eޓ L?o[1MEuguM#4.¼GZv ˓߄ 1\%slVFԈMzuJ#.91)jskvM߳bEO<ӵpt-?1‡՝ kwuUX K-GY x:V[9jK#x֘uLc%Qۓ5FHtKddziWW7UUwM5&c1}f-~}-X,WsԶs)RLojL:H0}|ru\#:WϏ#}ッ1{{]jW9z`WƳO-OrLGЈkTǷNۘDuBFӦgb1eR#rF`u{uw#ZXUT{kԫxU>mѓӶE,uj+Ni9zS::}<n\SЈnmW{v] GWڴ4":M֘,ub#:PXwv GTϞX;x{c୍Fu{6M̾L M\זbF,uF#:yNiLZSG7Xld+W>֞ ;lLaT]טzp#=/qZ+m-O:Mј@uvcԙjSOcW|~z^ߘpusumussxWIWN0F8ٍܶ:çkGcϦ8ټ]=\nol =]{ qSQ-3 h];5©sՅiTG::cO UWU_ZW+xUo1=Q=:xz0G)Wo>JWly $qk/"#NoDTgU6"sQ~m;sK W>ۘru]ugc}Ղ\htUmkTG6V$]Xwz#hwtЦZLݘhתknLrl%`W,QmiDT;ՉuzcU~T)V֘x=X#zucc]Cu86OJձթ괖Q]8];68 ^1] 6V ~uniX[ XU(~[Cmj;1DӫNFֳkꋍFuoHڛ uF\F1iFDutxFd%UUcjWX}1jWV xWU۪#ӨkSTg6`ژ8} յ՗/WwV5+X7~,BmՎFLuduZөlDU96P6OΞ>^nn1Fxuo@3k EHFHuRut3]g40sbuFluUc׫վV2*is-FHu\cչEuzc1'K-- ~m1麮[X#(WTK-TGU6" SkU'Tj< mmLY}BpO˱WZ^1y9Tϭ^V=z VoV7We3Uʘj{c*Y6BKpPY]:]w5~>M^ `XTS+1KS<&p_}t>]YuWcEHXwnuac96m^1]5X}BF%@UO"RQRטHu^cJ]8]U7T>ӈP\$XU67VmkT'W7d;T=usˑoNh.d퍘FDuqc߳2 `:mR>>ӈ&XUFiŵ:::Qۈc(|7O-iV>R}Z= `M Q,mn9xΟ>>cxNhVWU><s@B+5G\G+'SmiL:~Wi;Eh1buSuB+5A\jkc2y4VZ8VVU_>Z}Fjg/$ֲ-jENv8*uU>ҘjuUuc+"֒ӵ:ƪ YjvR麥XjOcu X1Ֆƚ1 өrTQVoZ]S}@cW>GpfxaՙTϩ[=z{c`x{/4"6&Z}6po4*P[LXwQA TWaՋGէ 8Ue]]҈[jm :ztV}Pc}{+ 8UTϛtW9&xB'WY}z#puM;Ӭ+qp,SVY乍꼬cSutPcm4b6Y3#өx单ϝ`Q~mV~1jo1<=*Rm7Szi#:wĒ~gOT>TNFd1RvLxB*Oo^kDV"YY'}jgR Vw5b-6VLov{uwQꥻOX|Oή1z).lkDVK+~jW=bku|1";|5l[P+E wqOQ&e?{mm93ݘzg3zwdq{>6semk9Zޭ mM?~܊`#2]G5&n\x% kCNo< L,=G?aXEJ흮LiQw5ϼaF r ukn=ot˓).ǧjkq1o_gmjT'6"D=?omXۧXwE2b+S}t?=7"G  6ӵd5OnqT71okJk5V-5bﻥDFrMP# =='|M`[ZԞm݋pj[#ڈ>wdceԬIM_Lڣa`V=1'߭_}uXT lH*gbTxKOXe T౓/ۈv6`]Lzp${vO/b~ ,Ȋ߿]tճONjybq@:GWW^iD/TXF,/Ӭ D\ϖƓUg7ST]X-1rӟv5""PFqot;aboL:~uBcՉXؖ'a-.n{7FXuT-w7XՇۦ?oDV'aQE깍K+K[q->~@7]w7b]`F4Í`jqyǟ?Skգ㫓ە1=j [p/^}ꏫk[L no kϦ5N'?o\8⡖C[6=ӵk[+k1 k}1G6çk1F|uRcI({oy}"Z+XNiVV}+#cƓ#eKӧQ--R7"O`9Fwp ,Zƙ.[(G6"qqP닏oLZ9Jx˳U[n=+ny*X65AliU/^^zAuu`u[:\㷫uz{on__XVFzcg[cbOs+OoX'Njt 85^qIcߪn`WSW6KgO_VE,P4{[JB]y"=zUhcG#:\-SNΝ?1DWppXsU:,&TmnƤcEiyuչWdmmVs՗AEV?UAի^xB(OR{kv7N6o1jtt^}X9+Nnߝ_]T:sڶWdlnLFdkQ]=Y AիAdv<,V-0Ɠ_njT~}6aOSn>ӈnטhuac*%j1jt 65֥x7ZL9q<=QՉU-5$[QnLz#P\rD]wn>ף'\_טnuQ#: Wk$EdkhDVO!:q<ч7&TzsAճ|FT{յj4O=X;sG4Sōu4"#[%IVۈ8F4 8U6M7zQGrDX鷷P=X緈޿~bCDkiWvL1ujk ln9zO#FdP"+ W7Z;շ5V)l\KpjvOcE}}7ƺ]#Y ;?iLI=:zsG7*͎ `su~c-OY DY^_TIl<+WmL1q4B1՝jO#}PSj{uJ#ztVǷ[m͋XVFV~OI!`#ҘPuBc+S^x 6='vwVw4ؽ~nly퍕 80hL4~=<1ӯVgS?OSNdg*6M'i< T\緸v6}QܘDutxRwoVjOmm|n#҈J}Uzgcnך 7*6Mu)Un{mkiLZLD'nn>w"*XmFDub#1:qb؊Ƌf^Vw[ψ lt݈^XwauaٽW=ؘxIY$=>WЈjX!x}k_W:u #Y5^F4/M?"`5W=:5yavU;g!g/UNgk(_nƋ ^ZzCC+Ys׍5f, `Vop4B{[vWT_>وkyz4Q]XcXeN^gR<P*Qճ+ۈ69V}-OݘFDFPuUuxmOVۦ땍FhqJ\To;^}{%`Xpj}Wh8ĖFLPuGc*>[ݘWW}1>w5B3Ǧ+~m>;.bC/"ޯQX D=-UW6&TtTk}LqzYc1ՁB+7V~g/v\vŇw^~Ux65^!~lc%w(+c7/ULoܘ\ucիFheu ږꝍj]_"Vx ՛WW';-TWVИLƺ} `úvh'mcmVg5"I8]GikX:!,T_zkcy%8FT`#TcߵL`ޗol{mmՁ'5^(y1W4~h`s#ǻ:zsݍWhO1ծdT>Xw}u}Tng~f~U4BMo4TBݙ k 5Tz{ d?[^S}d7V'`yt%wVXw~dcR/o/~տl^X<8+lX@cxb:GA{UPUƄOWggZbh`mWl\5@8zw9y6O#jguS#pFLu_1p<zG>ᎉտ.oL*/25E\ljx ֛k_SXheշV?Ut+XUϖ3h<*“ԘJ@u_u]cE?nsDl ߛ3KwT7YmwD<V7 `VX O`}1U_sDP 6&ZƄS/nx~ziOnL6 Vqڶ: AջyK՞d{;7VaIGOh_uI7T^ݿK V=V`1 `^P]\ˆv5\ƄRӪVU=:9+yۘboNLL\liDU'5^͆1k/V>X.7WP-)įi Y\R\/dM T*sW7t96=ՃdUWUuDfؘNu#hDVo\:"+]Tc]/V_ x`W:+¡1xKt4tn>՘Nkx~{+6 ۫V]RÎqPx}wUͺx5]WX}v5Xz'ԘS̚@xUY1oB2Dznkqӿ?u\Ƅ?_X֝ƃ5&TX]]}})V^W?x'OW{ <=*~?%TNq,RAөX}FdF_z$q&dz}4^ ӑS'65^{F#ͺXw_uKOW8"`ߟ#5"3φ_U?QJ^0O mΪ^x{`oWuwuMcUWsD77&Y:9 ntgTP_7҈Ω^x@e[jSQcbztgcJѯ5"w6V]mv<֥if?YzđWԶ/xBDzfv7>xUTZv՛KcYmToNQ_ <>qQmkDU/mIx1kRT-&T}_JC՛󪣦l,Wzvuyutx qlo֘RnG >W귪kL:$6ӫNmV_k+bs:zMƫtw85e_c]=W^>uDԞꏪToiDVmD6?XW:8ֻ͍67Wot4kƾdOULPt=TZݍ":~?O? *`ZDUT^zuѬ {FD՗?M{To7ݯx6WϪ~F| Xo4;<iUU_hUNPp]S/ꇫ羽]h6W:>GF'֋-ձ zcYV۫kS><]Wg JnLz}ubVnTX]ޘl X^P}WBDz-;7ThU!H*G!_U7WKH\3UoLzol_U_l g߭~1jYvT:yA XkU'WR}{A˪FP՟6*֎VeUFgWo9Xt۫w5&Wk{|?>xִկWVHGT'=B\-'U1]'8UeT_]rPݎ`]ꏪX}WcUG}wudF!VوNr,RYT}#G}zOc+c˺mT XUjrBFPdDzjnИPO<\Ӌoջsmfza?~{uK\'+W9UaOcB]>1P};uqƄMf]z~ ?Cu#`WڶFTITmbc'V8oW~Eb^QdGz$oiLƃr:ޘNj/9ژx7Llv4q?l<$`W'Uz[uc9dAՃխ?\}\c <ܘ}IV/`}9pk{ 뉸 8XW'W/oLL:vT}T}T`ƚT}gujX7'V?Q+/Ց^m{uJ#zGATFPFPAOT_m燫gzT슟y7;qpli[wVoΤCa_c]?x տ>QTMf]kվ];/&Z'-W*md5Rp}dzeE6Dznlms X/yŎYjDSW7W>ؘTuUc T?XWշW:uc[cզ]3+2qLm_V4{۪/4^ƴ>NgbչX7Ve*\]DUӾڿ6BVxXc~LWWG8ua1J`%͍8/zoeW@uMOZ՗T:h<k x6UGUϭؘT-R}C''WV{W7˱-]+qdޘTT=XtL-uMj eV]s;/GZ Ȏ L:pvWVU>0}rՏT^kݶ/Ww^~N\<}Qջ7UG:b_Í?oT/˚Ks$f*`m+ޖ@y1Cks4({_iV?x8DzT?M;.Vf*Hc4&U:ݱwӨn>rPJ@}ƪɚ]H\YwVv,RpuO?iDUr<ZD꿯^ҘtJ?Ty^|#ŎdS_X}ꃍ xUWT_iL>Dzf[#;.w^~GjbL&lKw4p@]Ә^Tsk˪_ݽ+>K9V7,`c?zCMv-UUU~1ꪝ_AW߮^_X֤oQ?R8U~mN^UmюSXwU:8]ձdMzku:5q3;.bsu\ƤwV8gd1ƃR}zT7T?RQmr,k{v\vO ։]:zA+4s2Uɔ*XnU7&|vl.q?Kos$**؀v\vC?WԑWW?X:ʱ<)KxoWhoUzgu#YvTAG$՟1onO㕊V҈>Yh'U85꿯nK!8 U:l.hJ:'ƃhWVUauuOՏT':5Ա5&~'CkK7U'T[X}@\=PdG&Վ_s*846UϪ^^`uiñ<_~ػ8Km]ޑlN-.O'q'ClM1#zMHBw6bW3szݯٝ9;3;{}* 0V1bSpoϩP2`ڄ`\[=d%]G}zMW} n Xͻ} F Ά.3$U^UQYYQク_IjVH#`c0U0{kcT/lسUoP&Rj[}uJ2Ϊ~z_KI*êV/l+hի3X~M_w~r0 `66UgVϬ^hU]87W( 0GX\zcwϭ>UFt8 `U'UOi||g7Ujj7Woot9:~Bjp <Y=1!J5nn`CcVWRZVꇫ 5:~nsuvV+ѝ5?V) wP@uq9`y:zj=#Q] 5Jp~cru=ѽ7+ݚ!PճmUk^_'ꗪ7Eէ󪛕}I=$80Uo>,kF9:N~uEOpz +IUU_]}[e[^wo~y\tg~By`_UCWk$o VU]S}W"*`罻v[; *}'6BU/6ZhՋVV[^w5VoKj^8e#D nߦꮫ;/W~TE&`j̥U?TݣZUpv56\W\]TFU]nym1՘[O:V)3;۷ZM>__zSu?VRsgmGWw@ F`4FA7_N~x^WT\?mmur̝U/P]pN;ѵ gc|{T7*{"\F#իRUVh%+U?P}zdkW갭R`V:G}.h!\ꋍP_4BU,NV̏o>T^urpkUnh\mFMJ.]uX-%zgp+U8vVTVo^YCYXSqFեnU>R0[%ϫ]YurPU>Y0ZfݕcnY`"e< WJѝ nUPcnV!% [_ڥZ%Ǫ^`jT+ܸ[c\IJz\o[+W+ g#c.V}I9pܾ5M#1p 8Fuzur,5.|EU9pܾ; wW_QٟW^TmTes|cDX@Upnn`^\_IZ%Y6 xr,Opv)sӍ+Ų:z^uR,&*+bY=zbY)pʴ-NX6oG `\{gbY=6ݫpOkb٬U G `eV4ݫ6)XXA.5շWg(X ^Qݨҽ `aW,?QReteX USWWe FX_OJl2|UeG+ŲyXtXχT_Ue W,?d{H XT(Ų$eX)ŲxXjRLU(òT}WuRLU3˪+bY<_Hߟ5FnW%whmJW,߯>Wk`eXXڦK!JWݫ>]`eX=>XQ)YJrW./dP}[uRU˅՟WW(ŒojR `.6W;QfVkkJ23y6L|쪶V&ve[S}c}ґsW*x;z~uFDhz5΋FȊ8::|r>::vc˫k/7&W5oU7+rF'ӔcI=:{c='T]O)f WuѓݪO>ޥ:ѝ[&pyG &"AY{su~uJW-]>0DŽöF7fcg#cTݣzlFj_ml.>Q>3sUL֒zRF6KsL `> Y75/̞^=:wF?Շ!75:[]o9'uߠKэ0msL ؓ5P#gVo[*N7B]^_}jyOAsc^Lpp[T u>۝j[u@ɟwow Y^^2M6F<^tVݫt9$\ډճi?UWoF+eivluswFW6Kvn^Q=r,ݫΟ` W5Hݣw7OgKueua#Ⱦ'ѹjmuD3ҦF877ɉOW~1*Fwίzf3{\]R}1z-;m]^mNœ'ﮨzhur,4VmRgg{?Áۥ3Sn VM'XUkcڿso5^oWQ}a/yhF0@.5S]#U̳5J0U^w[;VwkGUfP}gߪoۛ]K߫mY=lѐW+Œ9. 0W`u8zaԞ_3{ڮn^8?m2ëjʄU4F64oQ !\Sk5{/__pU1?Z=1po.kFۺWmSwbIP ,#N׶V/k7uj]vV۞;nѭ˹{-h@W9^ `=z^+h}q}#sE[FVmht:IjlI\zcu^}HӫgT.sWgguraգwT*vHFۺS9C#upkԮ[m7BUgTQ93ݛ+ov[W-&qp-xEi1sk'?L `.Wb{x| իumwQ=@[[ݯ:WU}ѷڙF}s~F09ٻguVwܱ %`N+,zkWU4:NFǬQ}n{;=w6~mlE~1vRX5:b XL'7:Ci{wLgO7Tl·>U}uvFG H[7Xe`1ݯ(mZMsv?WkGUt/WTS%qn9<Wu>eT7ﱶѽj͝ZqegbXGg4 tP͆=|SLj]swtr>|+WWkU'kOOjM)fnmXd`Vhd.j|}{um#ugjvDu<եJ$U؝ Wb:=wilum{q3mY7U{.·Un`Wb:=4:;W/d~zmuRܺ ,+*XL7F{Xw{5"~zqu~g} e{}TV=۶(ŒxXu2,`1՞CD5CVnnk Ցݫ'UCNWV7abkc=|현GXݧ1sr,=Otot5:;?=m>.;'1.yWU]=:Y9fjm KL ޺lkJMqrQ3ow5B^[{X@c\pli<4*eV `!j!5&\5M_W֮3]9tQ '\ioAyڴP{Qmr7k꾪3wDc32Ŵ=v6-'󪟭~F(tVŸUj`WXH75B/mvPW7LwX[mh&' 4-4Wݻ:R9fJ`1]tn7G78۫U_nV'V7:ܞ+6`U`!|蕍NY-3u|u„p,kk Չձ3yWVu<տfou`w;:tjnrTUwmϝ˜MՃV)Q}ک3uLujR,*XL[{ڹ.8K펯_G7(kVkL%lRKG GgTntZ*\Nq3sQ=Qhumhz`{ Wp=|~scYK\TY{9ѽ3W.ίrWhYKu2,*X\>ԞG޿`Z_UsՑϨwQ#hb&]3uLuF%V/:Oo]uHQ٥$SfmnTWV-/}_;vs:zZK\_i^wpgWoq'_?zH_V\}:\9fhU?GWXݽqgA5819iT&۟tk9h ==| 8K?_vD[M6UV`iW爵8 %\uvv 'ܕ@3B'Vϯ]}f~mKUOC8Ontjnc{yFٺxRw9աJ0{Ug}jdczRSշk%}.ΫWt;;qQ{ovn4o'몏L> W9.a.1ƉJ1[cE7FՋjsA=9zqu=|mGF312#$$4l{@O4kM h]UnYպ|gs_2>JtXsF=*Xh^gS5}}f__zMu3coVu[7UY/VWY3?!\`ꏫV?UpX]0ѕhs/7:DSVkn QT=m=|]Kj[F9itRz%UcG#\uƨ T]2WWL>m}#;}p!־vLF/OnTg{~fijV*X]>_(PH#>̜wp#\fR۩hG#8Fpj{_ZWmit:“Zn&Kl..urtuΤU3$\l;w_P:p~F}3'ӏW67T/mtb͍ՇoS>_ WQ A W̌pΨ~xmjޮ,ΫX=qaޜU`c.mjnhnk]#Luh#rm>Z^cፖpl>T}c64nP 5ս^8RMF7WV87G7=1eun98y~ǫ7W[͵OssyT'3L WwƺUߪ>SR#w5}' 4}mk@vkv(Tsj]_}1`嘺5I P.%>*lUtϫ6F=Wu>~i+_To<+ c"fF7e0eUT=qÕVTzMqfyqW#F p dE6YݕcAF*[oVLTo\yƱu2ohBuAF꽍UL._C&`ʄ=9z~ ]d=]NlG4Cﳫeˍ.Go8r/a41|903`:zA9ud{[upuJuFwTG7.+˩7Uc٬ly7s,J VScߚ̭u}7$fWuYUrXuhS Gh:/ء$S;TuBj+wds*W X5dԬl_nPX8߬iGXWB ):X9MՇ&wލrmmdtsV`[X[u!LT_GUQpU,-WYiUGgW|:z~2YXW7H9NU̖uAi05P`X%XڑUs!J0:W8ѱg( 슄f`e*Gv(SV&77f,ବlLQd+/XM}pu-aա XLp,SX,%`kUrTuxUS!\gSꗪW#T_`nV9*XUOM +t>Vo-'҄faMx`V_)$0U05U?SB3oULf` WmY|u ݇/Uz`Fv4,1}ҹ `*`\\u ݇?^vΆz΃*0몇W ݇-ի^]gI!fcCuZuR8*5_Ba{7/[RXkL Wt[|c$Jz_#X +j28*8pgT?^={Qo0%Up`N~z އ˪VwT=Ջ+tΫ~fIn!\[Yz}_+,)}zZ3Չ+tvU~Ȓ|=*7GU\}g߮η{&\_w{'\wYU[pmU-) WsbsV>lC U?aW7-)۷zVSպV]Ò9Uw뫧VPe+-)sdgc-*ػUZ?ZRȆj20τ`Ω~ އջZ]bI#㫍J<[uN~z ߏOU%`4Nic^糮:сbd\uܙ]uMu߬|1[VqAJ<uD}տ\qiU}no66BSGT&P;F%tXu{?MuEuUv52oFׯN~sK X o~=:oݺFjc#uhut#0uD1GO>RMys#ĴَY]7w.vE#|u67NVnG#(8^ Lp&/4T;w5~ղp#&}NNjt:f&;xqc[NnnvitJ#luI˓_5v sR̄WpsV~\PN1K #A85QvK.)-[m]duYuiSœ]޸XA0sL^lP5y]sRLM&vw~z ߏ+?Β.5Mtv5ܞ }'4Qݥ:::qVqC'i5:Z}`FF(E͍ΙUӷbE)p1W߹uV[-tvc680'WWWj\1Νq^oMjtgu] _qä>~V;o9 +c6UkWa 65Ɨ},'Ez!SN?9ѝ#լ=ΞFK窏V{cv`:˱Y8fWmmWjei^}k/W0 WMq?ȝzzcZ<HvivYӯͮFKo\{MՖ[Y]ysn6gV?W=dA+X`%Zqp 5W6X}xե?7Y:[ߙՑ=Vl\t늓&WFL`65BLvCVcWnd;1[e'I/j>8H[X7=qQ1JoO.эӷ1xRL o^[V5aՍUi7wƺFxꁍ|QW6bmmlt6zpcc#]\'UϨMA׺n g?љ {`uؘ2N)ft *aՋ,l:ϲ\;1i?o2Wr(jnZ=oc4 ڽ&S~y lRUPT '\?}S_v6bK +C&36S_]mt$zj~pEUW}(XNfcmSEꗪc`_>WnQ +9퉍.V_seXn~yP=z|S{7:Y=zgmJ:1yBwٸ.vLpg%WU_eY`;k=zsWՕJ" Cp Tlt@{Xk/) F5J1W6F WLp_UZ}Yjqd{xƉxX1mqJ”R=1^Q+w4P"8b\*APՏ.\T^)K 鞍n4=g̥gTZYYVVxUj]mP Ei1x1*-+,5[12:+w1K Lyv[0uUO~ѵjBl[;_TW( seՍS \JvX ?Uq[S=::qesmT`%_k@UQQUƶꪄF ŋ0}g}?w]]$dcW) + տN{ΜX`i\8Q)fjRLp+}l4\T\}w./UUXIˉnU?¢X_=:1R'Y`lΪVqQ7Sz+ V\R:waGWV_}1#!»4:eUITs,Xݬ #\Jzd[VиT}_#cSgVYx <2y6vV7:W0%U$kW]Du˫w[^`?}US:ǫU_WWY}HIXF6F׮UQ}%#J nOUw]ZsK  +wFCտRV TGV_"]28ѽC)G E %%_>Cݪ 77F Fj5.ެ3=*`<_=q ovVrA㫟=qۡcV,C{5Ǝ*)2'dvVltiy){)JbWQ`OXJ@Xhs,mI*ӹ yw\ՃhRf{+R]*sq''=w \ݥ1ٸz WLplChnT3X%]SziToXTw~qΡ/WߒqpuwfjGF*H y }K-/`uR ꗪV}oN ;:D)ffwjRLpXRJ,WV}OU0 mLסPll)ysRbk/-/L^DX(QwLc6L)q0S76.2T'5N-]n2:Xm4xPc惕)X_ݣ:X)fF*cfD!ՏUhotz֋/V(BSJxzbo>Cs'+y;`t`^\xuӮK,/0G]= ǙկVOU XOoXzeՑJ,{V?UM)`ź_#`uR0q=ѳڮ pz/[T/vXf`׸xrKFQJ+ںꛪox@}b殫.d `[=ao[f`ܣ1flS=շ&uU UޓU[`v7T/lN>ZHnOQ `SF X UuRj6:WmR\S)fG Y:۵?Tg f"fgTߒ՚F̌_ _TYP=ܷU:z|uR3px9zqcϦsJ1s]+l W0 kW:vҵ XlsWC ,o/VQqf-HCUX}Qzeܙc~Ջӕ[]X]i_3wejR̖pӶzhjWWVXj`˟pU_5::lUK竝J0[UL۱g-m>XeVsy`i1pr|R7FKh@ L˺F-]Q׸`58zXc38zauUX|w`lm>KB i:zquێFת*q`xp#V{69e$Rp#d W0-wEjK 2Vh@`=znuRJnݜN [(B;qqaJ$>YmW s`iy@*D]Ak؏ǐVi]L]]]_|I{xjWuχU6B9"8`!Q=ڨK⋓Y,*E=tRкF#͆۫'66\;˫K':ٮT]7u0նɿׇvN>;@;\uDcՉcG794Wsl{T}c7*Y[w\ (iiz\ݿՇ*vFuVN%LOF0F/TV_itH\-|[48L>Zݳ:˭ɕF'$ h:y^f?y@X1O}]]I[-8nפ>s.3W(j}]R\}䱃SFW705F-k-}m`;Nܿ]86RέcVTrfc&XVot `:zFݿG4HsF%٫ '4Ni91"jӤ~)ՊqhcƄX:W7:ܵͷ2/xh̜`[)qF% ݎFkw7:eܥz` ٓ ϟcU4< t >:q@ݿkk5ynFIGU5BW7:NuCibޝ1Y+%7'Vcn$kG6nNU5¬]9]+Sc{?[7:lułߥ}իGTOoyNL'yqTcl'X׸ȊٻѽSWi%c[ܫ?nF&o['Ս{4FI=%H%Mͭ&\]턫VS]NS\up&ɋcǫUwpI+zP#8Ҹq,fX:UCl\[D;muut;i]=Ō.)qlư͇Noit zoU?]zFx9钹܎zU$1+Ӽg_R_h?` W4:IFYVwok&)\bky<~mWՅZ|kdwe1*u9Tv4V,V]KK nkclѧcq"TY6'WWotCUHתvMύP՛&qLjU)Ͳ8aݫVwuZ:7:^KK }1i [WVW[n7U>8eYܸ2ݓuꙍ0,ݙr}DI'-~qpeYrW=zrOP%sUjR,Zu3K-5̥+4?+duXZ4oH ZOk׵jy\Hy{{s9-#V5bI}VpwAՓ->XE*0^87M^47WmP VtZ^^VI#$ľϓ?]$KjS`8dhX2;nP J2W/jtx=կT89:R[yZk\j;~Ս.ֿXS9&#+YbPzR,=<36W\=r5?4N,R%sRuz)ճbI]Wi`0 nt|r,3`EX[=:Q)6]`LO~pGΩ'Bޘ>K昌n9θRw+ԽJi/X$6BG*Œ:^ܑzSQ +몗UW)Œ8:Z8vR, Tb嘙wUVK⩍̷VwW%zKuR,*nϚշ'.mQa`E֡@zUQ#<,OTZ%P<{~ɊP=R̵s]jWWo\(2xǭ;3JV/T/.T[RsxTXm#L|r,wVo1X'TOayvN#`I)G˔`Wp{o,_dT]h`{GM+9gL~գb>踼.^g`|:B)fjRzDuw(yrE[Q'˦ݫX:&=R %\ؠ ,9, bkX[=)AgU۔c|O%J1ǙWVQ{_~\)fq^k,5շL^v6* `K ՗Wz2}Nt ?^+®꟪?U9zTB@ϩ7V+Œ@k&L (ѵJ+]XlW5DnWXWQW X5_Sƨ9W,^GSsaY^qs@ S=BzwccTԳstc< :]=1B]YY>XmS8z2,c#u\zG^A êozsu%jϒc z t\WM)VTT8zdsK׀-+Od@}g]jzUF&Π;6YUzi:-dUn g~i38^)Ż`Wpx ['vTW4p`]ݿZSu]FWVm[ҽjVN KaՃLYZ;.W !\i *k]c[$!)J1U6]+1sZmR %sp\͗Mu#U$=,9*8`'Tlk?.U{ջb&ZSê'VbYq>C`8 ݭz*ϛ7UWZrXUnPrvuNFL}q/:,.U+_=B!շV)Ųl_E `ظ侫`_/’sec40g]u$?OתEssOǔbntQ`UՇ]1#U~CV9 p _STV-~z}LۚՉJ0SgU+ŲyWsF `uP=qʢѵʛX}5N^oVW}Y)ҵ۫(_=Tf^MJ,VLn$\:\=Zq-9ZUyT{KW7Nxv4FW) 33b|z׉I `uIzd EwccԂ+=͡=&k.mt2x6U6*L<oSuap%*Zi`ߜV3ca{bTsBtpzu2L~,k#oT $\_=y#-;>guWWlG±C`\=5GcuSU7V}zE#d1(իbU:?'H~0U.NWeK0V5Z%{Y:ώmu\TRmUUaKb z:Lσ'erzGc0sJ `8U7Uo˕zbU]T}T)F z^uWXVm6` Wk3}W#wgV'*l^^qUF9>ӵj9m^s2mvU^lyE::T)Ӎ`@dI15GWTzquR, s:WVY%zcwu`߸0b 9MY9p_=qa6g0ǼX|V=f_[vrJut2p2LݩߎEuR,k74]0焫3`_U>cULǍbU{)~{vk0Dy pb[U[]Xz}::X)bWcJjT}J)e/'V/TeXۡZ=}l˱p!J1]PUkg!ʰ.^ V *ŵkͫdoٸ*}wlufA)b{Xծ.PPwNY^T}`X\Tw_%F}) 05[ !+VkrtNNU;mmչJn^U]+tbkպU;/Ve]uƸ-ܮƸั#sB wcg5.fy}:ڦ+pbZWݷ3;9h ΪQUXU_V::[CHǿyy+JW,#47Uoj`Wf0#{aW#XuRL!Ip S:`^X=L _V+#\x8ȴ\W5#׺FWJ1myv)ÅcS`Q}GuR̅wTmt8`X,L`{cG-=~;::D)bWZ`b[VӔ`~:G)ŽՕJ2 W,#'VGz{Kp@%Li2mp2`oQ=ѡX11hT^cӲsuJW7VLϦh@iV+xEEeX0XWw_%8 VG)l|Q)-9m JzR̍/VnR  b8ѵjPzg#`;1#iWuYF&\5mczTաJ17^+pbX_ݷz*s%0<1^Y]|KaꎪSj\sbn\YEExU)dwTT~`VM0uG7W0:V=5UhX<|kH@8qUӳѹjRp+[ӵbL  =&Ε]V O `[Wo75VmFjRL-/}M՗ӹb6'HpDV9Շ<,*mMV՗[~vdu2:ƌMccٷVϪ6(ZW]A `e[Sݽz*{Sr~ip6*TT] ͍;bjV{U:I)ʻ'1 bh5ZmM{k-?;6iUPE|bq@Ws1VRzyyX7LkWTڪE b)hwUWUUӰq 0lSB8 J1WvVN*$\2k}*{craa0VC[]݁^տS JxVC5F8۪T[~8td=aqVF $\Nnu1pTVwq_.A{1JI~INI1bAcDc]Rw6 ,eba;\>1ޓ3Y՗g4hoMU#9o.ޟ>~8~̸GVn*mH_,*g፻Q>bV5y2`Y}_PQLUltz,TTϟ}K/E1`(x?'ٴP}c\םF;V}8Sf}rcrZ]%hZ@`vls`_}gQL7V]/ ٧\޳ON}Kjg:?v ¾f}hX&* _j=Wi܁XWcfS]!F*9 P^pΞ|/Eu@c- ,{XNz(Z@rPg6WKu 0 MفwU=m rO9|߾QK`Q)"BU:qLW|QX7gy{ue_x0#O3﬎T{}j(rxW9{ޛTy ,C bfAՑbVӪ$vMuvu(r۱pFoj.K`ѭmBW]=]S۳`.)WL}gzck[Vc{.vզ/KE0BcUyo>%$Y= Xm^\}[u(WY0#yoi`<$QLOTU]# \06Tϝ罩HK`IXC:QzŪ`)WL<9XK`ѭ:M zX ZS^kS{sh,j] ,7T_3kY'E(kIdKX9/%}rMշWbUx}frZ(W͛[7WjE*\ݘZu((*i~>z>0`{@##Ejz{&0\0U~K /Vc)U՟UWSsUWz \}we&Zlz(-is7U`ڻꛫX5X x(-*Wu9|[sR`;CEj\SU}RܞrY_=:pcV/V gꇫSj(=*鳶zd0g{{uui/V gǪӥ[Lr9:mSѻjl8U/il`ݍêcoΩn2XR "X<<ꧪIcyS\.(WLo>Ye֤dpm8#K"՟6MR.몇Z@cw g}H56SzlzkKp7=>sܷWWU{,mՕ-3<{] շ6(VWѸ6wI `z]=:rUz,`LU_]}WuDVŪfj@ `zT7}K+vÆ3^Y^];1-*鱶:Z羥:7wM,z~D*}Q>s7W{,vˆ3~nC*R`7(WLT's^]U]elvÆ3~Zcj:^*鰶::d/e=s>.pُ~z4VTT}\.*鰶:sxKZ/esMQ wmÙg^d iZޒ U+o:ל>-Յ ^ :awmÙg?YzYn`%::qNɯ,w܅Igd`jvY'GEE`孭W9 {,N wtb s=u5ژX=t߷&lupjTZ*QpOBN羹1 /eucho)V(QW ߪ/+>|9}[ {),ՖɯsoRf͍U,_ V^s5nRXUܻMKYXuu(X U+>|jÜ>^nSuY~̳b,Lչ`(Wu}ߔrJԘ$|(af΍՟TobRXYU羵(Xm0I'X5+j(XLU+gmu|u>-yՕ^ n[uEaߔݰ̳XDUUŶV̚Fjm.RXW\6Vk\] ,u%vņ3~Pcb՗Z鬸`)rWj~X x896clkLK1nE?" l8GV/^뤳+͢`)2p q'q +(yEMbXtWTox9gT?T=-gTX}N,*sxu9~'׾bǪljb\RFQVթsܷWW72nâZSY% Xy<{mEULTyl`)WqձsVWWy)7ljtP`em8}3NymzQԔVBu|{Z `mm6cl<̳̜s߬>) rX(WͫmՕu^ +jcUikE b^9WUS],5"Xoi`el.qlUm8l^`јVC)V͢-TLedr2\=ǰqw1Ux(^_`yܧՙAIox@w`u?*V5)W-}5T_:f|QܔButgpc>+&1,5!-%{O>=WTU1}r[[{ޫV ŰTGTLBP1n^Z"WX!Uo9~۪er4ڸ{n:1JqXW}ecb1*QRц3^N5F^n.z8Ś(y9껪1>X Qis5U{))-51uLշ4̮K_. Vr;:q/qfQ,bEuW_󬻱&W`E)W,j9`[cj&/picg g*Ǟ\}oj8fq0 񓃃9>0f++bXTkT6n0̺ꋫ艹W'o~HL *On\tlrFbmuJ@fG_>( rڷ::/q]jc8qn;Q::ZssկUoF `l8.{q &WIj1-TGV^}yc $W[QX^rƺƖBjnFjMf#஭Qz/$RU9~۫k`\XYSݿ1 ̅BkU_]}Gq̕7WY]$ rYۭwΫmY 0mâڻ萔ஜ\}Suq+~(fkDlM q۫Mf/rMu䘍ű1yxQN-TO~)V͛K_|_7`< 5U.WUf5bۿzp}QBL5oTi\|v8յ-^SeScrFQ,'U۱wW?3K$sesM`*e- ث1xm>?y0..â[_:Ṕ{W?ЭkuoWSmrX[9lo`j]^}&թ`?^B)"kTZQu8XͬXcMԺduSNzW7sx7UˀyԪj X[b^ 06Ut:&~au(1~HDTX|X{UGy۫r`}T nOxlد1Wo !B `y۪͝+'GSX\Y( VW?PljPD,QXLnSY Sc,ř^괾U[*&>YLQ0k؆3^mLw kkZQ,}QK2'UݘLՁ"aY\<﵇j/=¹grqlO^49Niw$nFq0\X#jt:(%ocz)`ʝT}gX/tucE_U7Y\<﵇m竛D13VǪD$V_ݘf]gTuE}w3v`-Tr&QZ?;l1/ Uo*Ȏ_Y=$?~V:_FjX +hKsWw}hX9W5U7bɬ[}eVTF媕uIQ,WL^wljmz;q;߬:I$܍WT?S}X#kނ[vpudc=qM;3ıh\dVqp[ݱXãET*2`bF+Mk]ٱ g9b?;q1]w`uBou8VS3Ui=Ip{/~z.g(XWE|B4V}}dŪy :;-kC\Z|O<u껫Cmo"~]+VƊo㪰-Y\GUPZ)[6,0nnl\ei(X9vXbF`~4 V9nSLqb `yDs}KښD>ڸL<iLQ̽^({U'`SuXDmlW]X3)VSXzNJfҶäڥsxྡྷXqWTotlcWbn=FESZ=|`1"vUp'̤T(\#0q,_!FպE=F9&QO5Z1M>G;/~.*tVMCB4TLXno1j>] [b~Ƅ@BnߎUH `]j(#sJzcT:Q*?3Ū'OzIrų$`l^XCkb *@M;U..iR*Yi۫T͊ƕpjcEWYI~ɟr8_Տ4]LեY,mL()W,rfѶ?}/+kE"(|S8fޓ_:l&鰹1) V`Q()W,RYueUam)^XQwTbŜRx=)ìv'TUrV0C,iV]d&IkRd@}7XZW__}8V9;%X'V?"Yu֘ܦc*moT#Z1TL_,+}]dr,I}T<޸(Vuk1Y9WgVz8VuZW5]NWiV̖SM5V X*g7̦͍ |g8܆FƅEbU::7}/S~c2Z}mTu[T_(Zx.1w_.*wۖT}qsqܺQRDz8mk;Y~T\=ngYNoaPy~LU/lL:?/Q+r7`Y`(W,EPffE-v}p}Kc 'W]#ezKuNqLoRe\@]i'6V6~U4bm>sYݐ)t⸴}/=\֋#60y]+ |T]Xs8QiL \_ ^S=Jz_z[9zNc'W^՚G.Ub^Xg܃#VToV0;67":S*`]ژ0;_}?kY,ՋGU_]=bYr6T/[;imyrsc2\g:7;=K9ܸ `~]9^-S-WFڭX;z}$ǚ{UOlzh݉Փž13v~a:bi(FP,`7}?dz%, *Ӷ\`vloII0ίI+;51YsKoI=c*;yz韫7T%{dzpĪ#Rm(XD^Kɯ ir}C|<XNaV^7f0V_(^+W}T.([W](Kտ4#u@c}Sz[A5{c'OFj<}ÒZ]T]l* X\U,5;jF:Q(P(:wDryɟ/kL^Z]ۘ)ImtOQy^c= %/m٘til8SP7yؘ^uZW4J2^XՇU|N8ƜWW?=yz8)woL>% fY\pEc}reG<nz`cjU[wQ{m2شOٍ $g7pƅK'?#Ի5\>:QDSG4V3*Eu]F1ؙk?~{r,,'XN;Y ,KWOf~6{5=k ·+iɟ ӫ>X߻Q[kLOcB "}S7T{{Yܭ6 VGT޸ q}uW*.~g{8`i9rZA̖R#wVi\TO,wm3[NqXwFFɯo@nlz(HۭAO(U?#+#U/d)X-{g&QΩ~yFq`rXS8y E+Ry1^X, 5i6 kuգo.k!1ZK|oh7N -ڪ'ɿ>ߧ6z5xsB??Lj\4:IĻ_-["`8x`,t0+tEsꓓVI1VИ^҃&֮#]טfu_7y,4K_(lknk7&Mm!)&8CE&u_M5Wn=vec}zUkz&LP`99ɬV]Xpa)W1>S]cz1 -\XFYjGk䪍VxkFqj&v{kc9s|}:J|c A‹usgo7 2S`9ݸtMav\߸+kT`Sk3me߫1j}3Nh1=v`^]UQg~pu;zXNkuT?̊wa|fp3eU9ꇫ#űǶOW(T|t3կz`W(V,*ڬdXՀ꿪[D&Q\:FJj]Z}" +nT8UKK PXbSuIu(F:Q@7V3շ`uO|pu(`.l^Uꕍprs`^̐&>Xa5 GlL^ӎ{fEw}{ՏTow`mk|tuf&ü:D_lܤĮLuNdx`\(VyJ*erimuXu(1oI;rvZ+`~(Xdu8ve=̪V/~'*J&Ww*' fMէKST<zOսs ̳o~Q>z8`fl^SJjHVU,}'%[Ū DL\T%&`[WW[smC%W.d]0)VTs$iMuxRf6]V}z(`m8"lL81卋V̵L&ܵ+jjgq8`\rڱQ0>_}Fć7UE?mܜ̷(yۿ7UbU,asssƊKDmKCm[UVzƳθQ$\^kʉ fXo+N^:ޱW_ݯz8`U}q[Dr(*X5>SUƳ8_\ X +74$>RNu(yV88QGTK `}Vw9 fЍՇcvxkVQxCgu7=9SW.L~zƳ}V1*wX4.^ӘbƊW|э V;zg=4TKOn<댷o<"M `m>{3sջEkӫ͢n1W[wpA9`7uƧA `9VG\캹pc= VT]% UR}Tm̺OT/Z!6>Zyuju8`6V/GtuH`U1aWS\l7LW"n睍uJ?_=Lpok"jX`lo-Ym;n^hsr065]ۅYO UT;:R ̩+N8^qgEwC+o<>ߘ '&_LnLD0>Rc9-")*qR[[8w'ĿT뫟N ܭ_.H`IiQTŽ*SDŒb4B `mn]~Ŗջh ?U{W?V=@$p>טsa}D~,SZ]n"aTz賹XdUKo{ܻ+{WMz}\ "ngSZȊ@7T.~b{Ƥl*Uiccm5 VO +hVKD `motRN?(W}F̱c~:L$lj\8RtPZsr\ꛫ{ػ?^=bx}奄q#$L 'ߋz_$d 'hv꽢`][ucwW-k7qpx.9M=Q=N$[ozGlVꛪ”zs_/ ǖ꒔&K[\Rhk/k|^(%T/o&`DǍ 1:[SEzSc'#F `ylk\`PPcoN;mp[[C~1%k}wkscMՇϊM3TVYF̼5>(X=Z+Vж:lLo=wqД` kK6 VF;S&WuH`\PI/+s^Q}Qp`>Xy^? xF)x+H `yliM\s @'f< VTQ/`'.|g;#Dn]-3 zicBu"K[~Qq815r3.0|X[*ܺ[D_':E$N\[McW/yUOs9baƔ7 2߮Q@+{%r^?lcSu3~ wud5U Tol>֘so.[X:z|Ο2>ۘV]Fp5y|9Ձa\: ~=S屽,+ʺSFQ{/ p'έ~:9F+/n/ wSY}i}DlZ{)USʉ5屽qF&Rpg6Uojм) 5?RƔdcc=տW_S=:J4̈ID[Q,vU/j0Rvե|^80 qNŝ::(Nm>P7Nz`6O[37w55lLzVUQ"I$>Y&iĝmiJUK.ܸ G]=fq]75 WUWQ10bkc&??Ϯ^+V7VSsHXTo|FGr;[KUXMϦ곍.bQ;镫]81u~u^bxccwO7<19{75l^R[Ճ5a]XQzoM,,퍲ޛ2_Ә!Ց"[Ow3)Ur8 ].ZU])%[k~TϪ6؉6Vo۸zh`\((~q3ke\ؘE)UW<>X?GV':/Ν||ciU?T]!u@uÍ_\=T,\cɻVk\h`\٘Ӫ'V+c[Eba]87{+٘yfΖ4u8W UgSc:wm &]sw$GeUNjWj\{Ld$+mkS&?Gi<aK͍)O鰱:1-UNo;:LL6]6y_N,mÂ(ER=uMn]%Փ#EĖɱeՃSR=:PDpxp4zRduX"6ny{cZK鳹1mV[4Vz*?%`y]Qݘwtjul(=quOH ع%K^ݸiսrܥgqm<#տ4&<1>Rb\(21)5J*''7iNϭW#`'5&1]uG7.xwaYg\W̳?9Yz`FY~QRb7]_}QFy[ƺDj~<.iv@uBz|c'wHuPV\q&B `O\09);zTI_=wsn4JVk\yld$`gn>ҘFw4Y+&giÙg:6鵍Z=l3d5wfF=g.kHc}ӫ<'R]?y\<5iU%C&E>|MM>>:wd(m8(X^wnmLgέoL/*X.5N}z["΃Gw녝4\|]zJڭEO55ژqדe#$m\ИRFZ/!SX~W5N%eqliNV=h'4.2=İd荒qw:K>klDuU7JWG4&]2{v6L~޶M~,&yKʌhƍ;~>T=r]u"Z[u.~QftczՙPiKfsɯ5VQɟ'U}}rc&ON.nLHLuYLu`g]/]\nl|(ֆI+3+BޘsDuꁍVtԉ#\D][W7D>{E{fGj] p~]M.h\D8lĢX3y\2,͍5ŷ}xFj'Wyyr U7M5J;o|'?n>թѓGm\>9>չi0OӮOXY^(xnSX~7.rUo4.Lm 5[|zccVj\9['L2y ;&X{.~B1!?Oū5Z 6M5Vҝӭ5|>nرBpǴo|9F*'^<9ιbeykfrָ]Ę>ܘD[/(Vlϱuȶn]#xec7&0.~iG4&_Ԙpu@ㆉ}'JqSFyɱu:lNJE˻@usc=V/-\7N]ٸ3:qRW VmzQ'4VlhvkF|߱{Ǵ7C8y4u>dsk8[KX&_؃-55Fubṟиm_>9ƸqNn{&͓-^.rJ)锫vlq %'%=oj6Vٸb?n֭嬵Bޓ_?(Tiܶy߻eQwI `moz8Bc 6N~Ko{6iG kneu_ƿ{ )LVuՅbeTjL%`fT}V l`(Wōܽq%\2UUbQ. r^]^}FlAErPX۫ DWkRSX97erڧzju(XjU+gkuQcfj\.kd,TU։\r4'ݲzzu(XJU+g{crgD[V! rʺv~3ERQXY۪ -'T\.>'ݲP]=&rRט^P=:R,*(vۺaՃDRPXyTaR=O,6*:YmFޢ`)WdzpO?U=ZI `m>]}N{HQuyb#{UNI `:lN8zq(X,Uakunu(>ӫDbQTb,TT_$ rt^]V}Z{l˫DbP4ViTOA `zl>Z]/=vPR۫zDxQpO)WLE%GmLZrtX Ȟ[W=z('͢GN UesQ#gV=\0]VL칅[DR>77Vrl^XW *鳩zdŞ[U}(UgS:QcT_T% vrV]T] {lK `:\.{l+cEPN7WobQ>NJ*鴹@u(՗ULj]\0WW6 V,3DR^7W!EsPc5)`W(WL[媭X U_' vr\}:_fEQnWWoâYNZ*鶱zվ G\06U﫮ŢYS}Sh;\0ݶWV.EO(WLaQ-TU_W(vF `mY"EzZ\Q3Uo[Q,co\:\_Y nm+D)W7UoÒ8>ඔVǫb-Tl\;(WU KbK'VTEkZ/J `5RՀKeRXmjtD@ `uzGMK;Er겵X2U_Q=F=pduHj.۫˪׉bIݫj(thOVo`RX}ݘbX[=:QկU?8ǸUr공dQ,Cz(qzoW_U\m6`uSX}WToŒZPoQw[ߨzPn6WD%U]յAX2Vo^&6^X}M *isuNXRGWUW)q{ls'zL`\bXr w)Kj<5* 굱zwq, Ջwf= ̛#/10*kkǒ;=չo+TGWk0_Xݮj.%P=NQL[S=/U_^b\2 `uԘtq,ߕ0Z}Ic  "oU۶3[RZ.U^X[=zQ`P̂kwT׈b>;V}w^]}cKXm\mnLQzW\q,wqs`˪'4&֯ \0.iTZ>GWV}z8`Uطzb}ub(W̆[WNDzXT}OunuH`=9"(W̆էOj9^}sSIUo0yHUU ՗VcZ}MqƔUk[ C `vl>P}z8Bu껫󪏉VIU/RU {B `vl.ޘrJ|>DO E\0[nj:MjƝp~Ul_}I*XX̖չ՛RZ GVX%˪gTLsmwl|S>U#XtWOjLzJubA,,{fտbES}u8`,TϪ~k7;*VdLMU +a?'8~9 2QMT٘`Xqê>Y\G]=zN`fӶԤJj%T}ouivq.{tFjGjA,,7*uScEVFS";иYYbR+N `vm>Vz8ViW?P k5 UlJ )\0nX}su8V՗VV*hMcRsӪ_8} UmkՙXQGVR}Sq0TiY=Q2 \0^S}U8VԽo. ̎RsWl3 \0V^U!q4Jo s`mn-U=8X%WV/zRgEZ(U=zFL`QToi0s:0CvV:1 V*qIc5rt88X^=Ϥ*V=*qK퍵to~_RUOhͅJUzU씫ɽאַ^&V7JUOiDP/7WoiPZ}ou1c\X 3G `\Pm.t9jcՕ"`SӪ]TS-*v\zmc2kq +CST=:XBV|QථzfuoqL;o7&Y0?y)Wp{[W)A$ շT۫_+lɍ UONk['X^U̍kgUǪqB_ rdcӪ6&[S*_U3գwű:(XXFuHC8w\&TPRkű]}C`s":kgWOh{@uXV1 rwo#OǪrH卓t?_'ppEՓ{UgL%*@ zǪsP;qg xHƍo[/nUܝkָey_w,VOXwp`j/'UntX]nתW`IX[TݻڧZ#X]7Uظkű*8KEܘ"y`1 A ]ui7㫓ű*T:F#GWnLDՂh`S`WmF9i_աoVW`=z~jX`3 -*v5_TOh4buZ:<ܭU=1܈3K ݱ::zpcaW5NBnBiSS}frkSU7cۯz^u`KտëUϨUTY .+S`O\Qi~XUO^&`=qiML9\Zg "~:zs1cS#r抩U8(`3GV8gÚ{_ 0Þ(T=z@c$U#4&=8fButu\S, 9Qz\MfT{早UQZ%žWGU[HU)UOX_f3RƝ~LY8xxߪn 8ga5{-*կWULYSݷFU 0Xc4u|+\bZr,:F"̽6&޸ p\ ,뫗6F[8]]^g"VؚճkN XLg=ۻzxS?ߨ. No8Gq|Z ;rikO֋d&-4~kuJPvKꋪVn<1 `I(Wnq+1QF`=QzdcZQY,S]\Rlc]=&/WNm},7*}WRmL[:)k=sx9CS?`)WTn["y4FXywaƺ/8p\N4RUU,˫?N'zxu|uZcrbnc UOkNhܸ ```l>Vnc" Q7TiL'\[N]=1*@k\R%>{~ճӬ~X`(R=1jhnUK'ҾDsemc=wW~zX`UݿzLc߱1ՁƳ˔X.WXq̝Lbqc'W?`S`lX ա";뫇Un ]bUգU57,T}8BT'5EtV'Uh@ubcBF vYcnS=q oU Lc4 U۸jCf*UaYg-U,չ/Vj|Z81eUquh`*R=z|PuZux`)WV~ ̵SU=}b7S_ 0oX)7VNg[2߯ ,GTO]=:>*XQWTZ}8hLzDGVSU,$R=ヘ U06u eAc! UT4pXC3 `Xi[W@0q4J,Nhј ~luT-NL qPճ_oL<}4TXwTλ*竳o:_WVm T(T=1F\ c&~wtqUOhqꏫ79qR(T9gLl< !{D id  ޚ]/T\0i7yTc>X\ULV?_fuHGV/^Q]'f̾߇5&T=[ U`(W06V\WDDwƊӪgUR,VT(V)T,3*竗VWV-Q{Q YՇE*oujcR'fTUT=W}']=KE:Q:ztLXqULչO5F?B$삅7X^<LӫV(S(T 0%v[U?[^uHEkg7ꯪ6evLu UltR`5\PU4yzEĎ֘N>:jxƳǔX-nhb~Qݱo?U[}F4,5ՉգkR8q@V*V+w}~8 Ձ TϨzk]c"գZ{ry@jXm.~qW=fzj9kkطQzLc:i1uM;U6۫s_hLzHN^GϫV}i'5'V'7n9Zߘ Q`5^SH"ڻ::˪ޘZS(T=zlubuS`ZWo4F=nZ:qan4Fcߗ,bvqE-tLE$EJ;eɦز;ʪdS"ȈCqf7̆``GcGhwbrϧsν3O߾}y> `#8161d6qkdP_K, GɩW$}W߳4UjUTgd? M\ZDuzVXEduYcg_n4kIxGռ9i/"`{W- GǪV?&_T?4kue;>ИVun#^9``xLq ljLH{cUeuXuΫX1꣍j%8 zHu]rp,"RB4&Y=kN-j>T1 K%`y4k,Цƛ?Q]]{7_n^DYՕOOϜ, fGW, ئfkկWߪvY"fsuY#z{chl:;{py zt?VW?oI8NNk\)}eS׫7&Z=by^3+6{FHutlL *֫xCWVN++.؆]iW4^j8UgVOXm/>>Y}3[՘ |~#:b8UwI`ʼnsJ$%+~B[`#R]\zo#zKNvڶ4a*6U- 'F`ua#SU7TZ"`T׋S]dS5,BQ0/T(T_?hI84N*|/6O6bG-V]~TuYOt*`:\ k dcBQWeD8pfuUG4"Uwdt<vT]иaչm7[*`6K_FBF_5mS7Tˍ;.jsNuitMk\LrZcz/FHoT߮$k hW}Ɩ[}z'+1{ө.nTg4wW}1 ظNm\qec:ջAblTnow{* B\ճkLbsut\YˍiVߩL!li9zs#zocRؖ^}կWSxElbUzo$A<1+շ5Ö[q y1귫oU$ZӶ]{}{B^ V]3g7Ums+"z=:m:Z*WFT{)OT- &y߭IaKwJc۪?UY}# VM-kTT'O_ #%hVǙ`/~zm7S۾mD?ocˆ7<͍-ONMLz=7o'` ~W__$gWgUW6 Ac6 ޘPZ4qr۪YUİ^mN˪TO4&Z\MhUm*\6hUTMϱNTγէOT_kLgYx5Uj%:ղlΚ+~X}&%l$Uo˫w5b!-o%1L'U=6m^ߞ뮱&Wo%?v5 - ":Z}d:svSlLz꜖S_O罬1}-FHuFcb?1xƤT$(WkT=QSײAmNo\/7tYݝ FL=IU6bm-b*N{Tk#p{jgcX6Ds'>҈n۪s%)'v[\mNLZ>Y}}*V)q?StI#+-΀ctR8a1ƛV77b;-Q1y-TW5"AgN[@`{Ƥ@MT s5xEUp|Y#ՖMjtW:n{uKuS#i^Օ-.kl|_}Uݸ鐥`Wn8Y?i '7N".bd;[{>x`:1uFLuE#::s:hTD*VzrcR75&Us5xY*85ؒ?,pVV1vVT58~z)X%EvW}mz}duҰVx%U쭾S8IN+c'0/l\jwc݈jlz#ru/R6EEPvg7"S[Ө8Z>ߘR'p#߬>dY`XܸjGutY}vc 8u*别`Zj\Ƙ&p5i81jo 秿Uq{GcA`<=a/T+#NNDT}tjg/Q V=շ'[Ɩڶ81ztxǪgOǃqouk#V鸨R]ΨNkT[Өx8X}DuC=]KF'`cxs?kL֗t3'^M? ^h9zt:kl%@cNK i FۘDuf͉8q~Ru갥a#5 𣈫`Xj5%j{#zSU϶]=R~VW٘z>7+ōTgWg5"[ڈ65PXMnWS^_ _W7Wq8'i4NnoLXjy՞3iV;{}^d[#1jgN-GT"Q~x8N^ ֦(6[- lhնFx! ծXLz\وs4KV~'V@Zt/4&V=\͔*x[/E\kRd[/UZWnm$^LOzz^=Ҙru#aZqF.iSWNp괖je<%`-^[Q=ոFT ־=շ!ĭ޸६n҈.n/jDSMӿUV^NXvTml oJN*X_>V[u8rXFxg:v7|x1ߗmiSMǹITxj1iԙ#:>wUU}uzݵ;^I\ρd, p YÍwW{Ŗ;c XLۗk͖jt՘8unut\4^<}n{bm-S)Þ~m.^c@\R#R/6&Y9!+liyϧFpg6⪇SjWOM?۞nDZ{A)-O֘,uvcyqqmm9:eSJ-U7TؖqWV#P, pfpsc+'^j$ۘ`4~cT'[>r)T[jLZLZlWˁTpJ,Rٸ@Ô*XL h\_zd!GҊE=0ߘvԈvӍ0p#zgmY[_#-l7&B~\V] [jL4JnNVj'{W/MW϶omnLzqh1skj=yVhlsx-4i^_}.iI+Mޗ7;8}n1m[#:icc[kS#:cX|・0j1QugW[3, `zU/zИT.Xߎ|axxmnb;M=GO1˞4V|l1yĭFuؓ-4M[_Xc˖}x8ƴŖtKXjlwwK9jDIW4ӯtwrcZG|?,"R/r^dԘvf:ozFwS׸`1]XGL*`RDV~D,ϑʖWzràR/m,B~ttq-W#;Śo{{OM/ge}K^{'ת6"]QW:brl@`rՑN]+;kщ~,LXݞlLXv% *xL^w]T,C&|1 գ)U, &W&Wtruu竿ZfEu귫Ww4T,U`zqUgUVǭ*<֘Nշ[=_4J+8l K3gWnoWWY`Y}+#jL (L:ҩ{X]SnUտilBqQ2 6aocT}7%g, ~XP}VcB x *h9\=^vuS+_hidq1߯xbw/G\mcէ[ruGA՗Vw7&TͶ x_~ȮFP3xMUtqǪ?][, pn<߫hlw 87 տmVl66&e19{O#pԈez1VS4-xTn]OP3*x[vVnuת4؈֘X1%5qp~q/Uz @c߫US=UMPg*D;x>[vgY0U?>]}z7}WRBuc#D#juPuKcBg;gݍ' XMg/WUkl3֍Wzqѕ U#VT7TNw[XsnƄXUjvԘf_di`U_=Z}DFPk X UwUlluUcw#zcB׫] 5L\K՞?E#K,U7]kxA扫f"X׫.<pvT?~ uF\UmRGճս--OcyJ\u'/T7U?VUZxMW;/VnLT X/UO4轭MHuW{7oOT XoUUQ}Tβ<"K UU7V_lH*`WWZy#:nnmLfcBFP@*`}[j)|o/6"DVlA7T6b*flZZZ ]{Uj`YjS6\w\l$+'Yէ?ZJ˓6Y&֨=껍IUwW5WL ؈տ>S}OUZ"ֈCpƄoV߯vT{A!ڈlW=T=Z}YcXUO7&T}buKTbҞ뮱R `8X=*ۍm\ 7p=߈T}5&T-Y&IB;Ԉ>׈Vrg7V,ɳnR}8h-q7_DDV}=X} V-#76"?[::iS?lLrukTv' 9\=_^?~sWƤU_i9:`VqTn\Q|#IV?U]d8v76nxAV!qkx|Go7&X-"T[,\P5&TԘNe?UN\v6oWoOTNDޡ~wT?ވ4.б#8zW6v ,|@#q͍Փ-UXUG5XXc_>\d'1OǞdc#*cg[=X3?YtdvT77b;өmT[?_}z{sO7Y]hVC]՝խj`UjWUW?Yꃍje8n5S=4NUVߘH|p:l0*pzzduu6&Z:2{'ө~0ވjTS 8%QT#W?U]y벿z1鸩U[Np`8\=߸RTPٖ yzPԘPuGpc0өxI*g1 X}ՇKS,v}GukV7"աT *Pc='w6 չ ؠAշ1v5W Kվ 'oVU?ݘfMVKcOW4mzmtZlQ&X{W{Wf?Tn߭~1bM{_}{"nj `Zjlqz?V}]mTqTwU7V߫mTAs*pzqE~zueVǫ{1Mhl~Tq'X6AįU~h| O6b{V48ZTh*keƓ՗[6g:RЮƅw4bۦÍ갥`Wl cGT?8 vWw6baۘ[DLszrh Bn^g^hy?1k `ZTOUOW7VQ@cηT {ZmTwU6"t*XU8zzRua#FhX}zsc͖ NjT4ThlL1a/&Xjl#[-VjL$KÍmonvRe8ZSցVW7"Ndil巣1FHt1Rb*xU v5N|ZztVK/멖c5<Ըjo1Ւ%G\6Z}:z{[2hCqw#X=]PKLnj iZ=8ZufuEc4"w7,4S[ӈo\:-Wp,5N 0U7VWU~zgꍖ u$1ݍvWZL@\jq;OUT]]Z1]T[-kġFWYTc6YzcvK*Ԋ6BhLn=rLR*V+/VdG{hL1ƅ3 qkӍU7W'WVo^6Zp4ӋCG6{kbXS4Zy1 )Vo>T}tRO7Bۦ?lTW;X/[s5R:ii}`cp{[mVUWVW5Z}zckA/Ac[']FH՞9l`3 j1P#7OTT5bViL:ٲl{Snlldc"3 `WQ,N=S=8TNS>T]ޘ|ڶPݱ4^hKXa[@~FHuru~#zgc5bV!ݍT4&R=݈kB*e\[iL1Q}tu^uA=ՏWbNs~XZטHLRLHF*xv05N=ߘvsDUhVZ>l4N6B]++-Uf*'7՘pcM{mOol7;ЈkwOǽsW>_8UꬌiWWTάέژhW[,!@S#yՎDޖCÖ8U,$쟎g[Z}:1MۦMXϞkS5PhT6&Qm9:iT*!o/T-O:kԡFD4{q"[~iT%co1`Bc{Wӫ.hLzsutj%V]GaՃꙖ}mgƈ[lsTc-թ)9Օ[ShLzku%pF8Q=6}F@QF*XZPd$ōVW}[c{-!:<ܘ:@#zzR혞mDTQ뚸 VqZgGuc֘nuqcՕ Wo]]d xc[ONF}4*`Wڱ8yqsg VU7Ŕ+wTζ<]~y -o鷘B%`Z\cmզj{#\1չִӿW?lL|llk:Ҋ_ e\՘DBc*͍ W얃7UlL2s1D!Ɣ+,Y>F\ƉEp81Ս3?<;՞$G{Q$i.z\mNnoLzSue]V^} TOۘ4dwL8!UJN1ë[rFӃգՎ񻧱#ծk5Q-P VqJ,Uc{o7qF#zkuUcեVjQO4"7Qۘ yxjp*5A\[]]՗IW'Wg5BEtFFuRŒ ,&O-&9>٘8uxcgZ4-O` WG8r՝g"'OgUWToИp؆Px@F0c1}F,u`]TPk*xyƤӮ4K77&]]R]<ݿj{ݽxԎߝ}F`^-B*6(q#nlyꭍƤ DxnLS=_=׈oSXjP=ԘDXja>^ X4L\Se> q+kTU=OnNnL:16Oy(5-sF(hǧLJݍHj3P*x|rQlZZ2yxv^bmmXVg4a6=>p N/Xn&^gcXjD-{fÍ(FAZVR$b]s5xL8&`bktvS!"ҘuuOV7BSKZ]ئkkb,86חUM_?>}㋭v {Yrx;,H\:MY8X?|ìS[Vp[cM0k߸x:_67 1/r?NV߯ 65;kLz`?DrQlDR!6M+z q"X悋q^qeusFLN/&6}@c U`kcx~`kW6A{p#rzp~6}Fuxخc/~-D-X/XUW ^qwF|r|Pk)jjy0<8}Fur#Y,q-b6i⭗Gm&ӟ{z;W|?oLq</s}0j.M;w`/P(U^+'땇Y+ZbRБAԖ㦭CWzteLsh!)4f{uX՛ӿvl"2z-A6v5cg#l=otkyVkRKGڥ#{V>徧ڴL#m ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `vvIENDB``!["fGϞ7evRP5/*)"x흿oIvGڐE Hذx VH`d8&TpP"/ 2a0̙00. 8apW~[S==$?fzի'? wK7}"~['տr0_@OeO=l_Y2B$?oY>~Qy-?ȿoEh:vwwB!B!B!B-cX{!B!B!B!B=+cB!B!B!B^!BuU=C0 { !'C!> ѱ;Vx"`ss3gwwwp~~oM>wD j9ej7ަAĐa}[hм* v1\hݛo>ID)v",Eɜ](CSG6_{\(/zK}/zhcn1R&q<^i5=1By|*z-=-ضq?{ï=__zN"k+/l&=8ӱ9X ߧN׎o?׮5V+yMv)V>1gυ</D<;oI&=Nϯio*"^u BĐ|Kݜe4!{>W4u=hYCC_"#} U1DcGέpǾ&yxɤ{|{v` π1̯hPn;h?FF>>}{a*{nxϞ=Q.C͛P$~]cq>L?\ƑZc5"i+ äAA?|5~Gì8fAA> t#sLJ40?b1>"> ePkOW*> Db"> e1CP>tEC0 1a|ڶ9B#u)8Fu,蚜ͣĐ<^ؓWJpոkk<>Wo\?yƄcI|jLc௏cʵ=sܢCZ5YI>u\tR1&h+@!bHރ/^ #b?|-!W!<F!5 !b+Mk D![\^|I*?|ZY]]}scu kn{"0󚣣ϒ(=1Wgggiփ\3GQcCW>GĐCs.>D&!}ܼD mSCdbĐ+u{c7>U^Z[x!{пf}:W XngBQv(@ A|B]|x|j X(@ A|B]| b>Ӽ>VV!(-C?t}hr7*]^tί|~~>\'^M׊JdWftwߦ@cX Db1C?|@Qva~|5V@Qva777K0+++&?|hЗ rX7h<ۣ"ÇЯL~;q>8'msus;&KWͻs=}<^;ױ1|7~}3iP/Λau_c1SJׄso>oǰq?kq>YY_O?Vx3-m:Mq >ϨǛݤcJmy|r4><1bj7cU1C~ 9 1/Ɛ*6cǐ:ǔǍkWh,sfվy<䀹C!?өbHnCJn}ҘoZ%CC]իV~Ojh#qݸR[f1~ݼUi"(qǐq޷J sVHf1@OH?CyN[l}moݯSyF}r UtLJs9=}#ü?%msS=<Q6<&|͕hf1~ʩ^>8_7ߧ5Jsk_ϟ s1Ca.ρK1$#JGcRwU?}.- 1d!oh4ǹjDg.!&Ch̦؇cs~V._|xЇ>0 ?|xw2Gļ+@a>5YwZ!|JqOoD _li>F47_w C[_n]>߭s* ",F7e~C=8Oջ'_1}ڎ>VmCnICa>sWz=3 |?V5w{;Gx'G}%:y|8W8i;wl1dF'ikL}?4U}(ַ@|x6NרŐ|^w'\SCXǽjY\ײȈ2>ڿdLk7=Ǟ "̗FWAy`?|@Db"> eC |;j 7!# 1BC?|@c Y!1!!Ц||tm:2scD Y |mswWt]qA-t}&y_4qEE簎74xky{\s[I 5V@ě.ƛh?Jkin}$k܉1c9 Tɫh5goxΣ߫>hzW4&h\'G!Cm]BN?_mC7hcE?o|Pc?5JF)&h <!bbiu=}4h&߮#A> oB,B|@CBG Aa |żV7> D !"! ψ!Xe+ЇxB!B!B!B-l, 85@!Bhz?!~g@RSE?~7}2/? ~6L_~Dk3חK7000000 f0 f0 f0 f0 f0 f0      ``````0Gcձ73Ci3333-{~~>ݍ[{!viKL$EJvJ߿-Ti...$*g[[FジIa6s3 qPtLI9N81)ben{{;5He^__[A?[ydOTe鄒J{r~,GW5 K[MRRa{WUܥTGⷜV }X\.T+%[N(Z%Sh\ );s%6*C9oȩ.Q4aIʮ2:pV|H4r=Ē0;݆UtlVSYH1IJ]+LlCW1ꄚȞr9\k"3~2~F3-gk0ib%L}fȌ~a0#g6fI 7L{FZbQLiLєҟkX{*7I=v]xct4LfRȬ*uŦV{7KmBrC"UƒR}yv3PL:RԷӉkJrw>-Y&񢑙x X[ZFw4\33=X!c]30yfsf-Eg)͌f3a0Ӳ}Եw<{L-`޼y<4`f20_, 3u1 f64l0i `0i 4l`L LO1ӭ%0 f:й[`f0 f``f0 f``f0`f0 f`yPoYf`٢qv>48,v6!Xnf*i)\3Ildh=#[l9^-[LF ą9 9i(`JWeb-[deښ:֠N&V`Oa[4cޒ 1+[R=`ǝ#3VLJH6ʵҩtf.X )3R@ciEfR&t F{؄O`f3}!IYlČ%W8me&6lbn& Բ ˇaF"zd&`W)QMM`)Ю6L`؍ɇgb[k9psh= dEfFL*jVVVNNN=#?3Ckt-0RZE\SM66]=1!>Iefg.&$YUL LcTlgg)Ŗl:Dx|ƶo ;ffOl`f4I$Ikoԏ,8=`NPѰ `0ľ/^P`f`r3 f̂3n_33 }<`f13, 31i`/_Lluu]f㰗4v-i֋Y^/`moo:ʎ=fi1˖8rʦ`fV1 ㈍Lǘ>["3 LW<-1c͘{03f<-6s63 ̂0bs3jhb2VMefd 0o߶Lf`fte}h^߇Yff0˞f z03g03u4af/i 40^`!ԩE[D[`f0 f` f``f0 f`f0 f``f0 f`f0 f``nZ710WWWiaOIq@4)%eg{?Y"XmVl `]* 0 `030 `03 30 30Cnnn(14 L-;::Z^^ؠe֖ܛGe5:pHGǟ˷^{^HW(Lz/{^eI#Gw]4_d,mL_1ٱTM>4Mժ^jz{#q!,?ٔyVF#CWDeggeo*䝿hLw°lN*٢@^`ff+ş[V-x{ݘIOVv72|Y.*&dIXfx}`n0SfhhM=23f̶g1GrӎaW*UBӧOk2[5qfd&39elΧj'xf03?bƒW^կgҴtCK9X17+&ṟ@JLqxs:b i-uLמS٤^ƀ|i?c[ꑳ Mo}Vfi\TCITAifJӓUv2#Y?תgTCk\^ɬԎvS-B?K*'fW\ҩI⤯;jׄ(􋙔5gz#ݚh-iv PǢٔ6k8 ̴6qqV;iT2#Σ3c&6󱚉:qF`fޙ1`_̼~| >2s> 3lW51il46˫)^ᧇi B_X}+tw-zT fouhnoofl (, 3}{Z^L!%EcFR2I̬?@RFXe|e"\Qt^666YҳFLrbLǘ۳6,ٌdIưb03gggW:828/hjn' fO gPd&N # _[`_LӬOD0,Ӥg6S'>2cԴ?j4L76Q6/ 3]b,H30 `03 `03 301a0a0a0a03 30a0a0a03 30 ̘لIfq...Ɗƙe fO(n'H λU?a0̜O|-&sLZE*Ħ$703`&YX*z.30SfFFQ0{@Y$G3~f6rjX6f_] f`_Xq*DL-2.30/fkgX,`f[;0HX+%U5aEb5̢1U_ldcȱ30 `03 `03 ->363ef0      ```晙XBmn$qMxHJĠPNG  IHDRjsRGB pHYsodGIDATx^m8FȥW`% Jz4vl~ܧnʖ#$Uo {rqK5 @5_!@5 @5_!@5 @5_!@5 @5_!@5 @5_!@5 @5_!@5 @5_!@ ovyf(2NJ5_DͷR]| /+-9h @`T/@9PZ 0*| y-Bj>jf @<m!J553@ jCF% C5ϡE[@@G ~A!Т- Q f @shPQ3_r9mϲ(z G?~}6ۗ/_}S2 $J3tgh s嫉*^&m>,p?rod_.hhk9ytx(uPhf؄^?3IR0S~YM4Te4EC2Y:nOq@ɸ?>܆@k@o UW#(?8PLZz4\< 'Q-xۏ+-e>B)u[^$R?r钾&ł.^uE6y~z2%kUR硽{F{k"}~*ɿʸ6GoFdU6ڠnߣi 0)VZRy9_yePfk J}*WGu}d<L\~+-M[ODUBy]ll NGeF`@͗IeI ݺ̢/yr[KHՕt#ݰ(}bzYZB`1b G$RWZ{Nÿ.ZzwvdĽJ-ݾ7_nHsJSPp 5R/f@3`5?>cI|@l΄=F#U2?o3 `P1d}|n jQ 5'Y}i Pq2듹;@w6 ߀GPcP-N +-3%yq2xY{B|@FP{g͇8Rߓ#] wyizI`O9K´Y#%<#\<VϦHw+sge,VZԀZz8pDd[γ{㿅4%ỊH[roW=h3)Vr(D23Fm%=1m$V|4GsXsd)Ƿq<Xu?G-:ֵ^"ltbn/UP?֌#uwo/۷o>ƜIwǏo߾Mo2q<3Sy't{Ǐ#%m"QR,+tQQ,0A=\jG@\lk]۫K7=\N6߿qe.!>|DSV~/٨@\#-hĕ5%ھ`W92}47lnԩ2K tq;5Grv雧їCYglXddZ3WՈT^\[W/=*ԫ$VApJ:pO=jHuڗzj~`{NrIqZVZzLq>FEJ<⧸5V3ai#]X\-pSR4iJ;tW\!^EPI*L}cH#yeFId콗hQqN Z.c4SSMʈ)G۸Gp\뢳KmR BsX8^,6ep8]loq _U腚SEzH ODSyRxb8:vSPA uIQ=my9tJGj~4w)ҫbA?DYq=;)J).*)tP)TOۢ3bI>hy/Լ&Ք!w<-},DCBt8%%9ե3z ).\/O7wY5n QtZ eХpKxHS‘X2RX%"e4ka=?՚l,9;4egI)ўmPj/l$Vەd|TN /}H"tIK_( -|!\zuas,F/^Ɍt2qޠc;öl͍^+A-oRslNM&YH5(⇃Rn(fK2i9G{,hT&d~dݳ忌ȼ-=:[Kmm|&(E0;%ز'H[mb5/ĺX/!bn maKR%3j/<YHO J-VJK-O+ŒQ=#07O%ռ5԰i p3~!I9bbiFN$*Q h|$P42E{N2l5ضc{2j~ȐIzasS&Tqoq~,f6HBje!NWtlE(V|.8_BxjK6X&LVZ %p'5_8lD5(ٓUI3c@ ^A Mc^y8 NPN@SyS/!0nI!/ 5}$"7BĈߣ.w۷5պbusj`5޲ϟ?u۷o{ [UׯS٨ݥuu)\KZl@ݏt=zQ\YvBVᾪYy 1h. DB6bD'_Y|mVM2s2. NVO>>CUs{qϻ"僅U Ln֨P/kڃWyRz.vZYϥYiFY?7?G8բW͖ ҫ;z}sqAYzfz,Z]7A̫[t-_*8_ N_O]h0xU}N A'' L2fY>ʞZ42H$z~OҳsGP蓐fVVZ*:H~f 57̬DHc![n^r;bJ܈KYaبWusuZ7zY/%T@t\OW卞U'kgS-Y Nr-"R]x wGlCu8h=J_5v;fBNK*HsS#͏W&P [ZQ5׿nܧ`!M=ϿJ<ҽ\E )ι&g{GkzyEh|{R*MԼJw02wIiGk11zlC2Jp }w&~9&!P>=DVs+ϳ&םw%"?V)7:&3'&}Π?'jf H0͆f<삄{+-X7U~λ@N]?9'/s}/Hd+w%9Lwߨz~Nn? +-ۗ:k5xr.} @Y/j^nH@V?R}ٓ GuⳮMMtɉ?ދ)ֿQ'CZ(c\5*YB;,Wq/Zaّn!=fW;gC#n+}m^=:kFQ~ <٥AqSFWA/Z@97\#-aѹ}7b:R >F@r#ѕ!Ďwx;u;|]/ss{M۝ɑ,Cꊛ$5 j3LGu/I%JPvPRNP%JP@;+@h5 4#pxوCri{MV")zjZWQB'u˸Ej6jmx *Xi#&? Pj^#F pdIENDB`n&B2uH<@&PNG  IHDR Ti$ pHYs.#.#x?v MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3gAMA|Q cHRMz%u0`:o_F2IDATxY}_L` }߸/(-dAũT*JS.+8%\FVbDz(9(J)Qu;=TuioLgjsl T!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6UlT!fCP̆ A0*`6`yo.5>ju[ܿuzla^nRuiuL_jx?x׺1^d߆i]sTM߲{:Wߝq˺_wztuiڳg}u5]w &8.L86"-(i} 8j9=g\9p#:~͵Յ5rkq{g^coqzioFozl@Y<@#;:=⻗Uk֑uG_x_̵L'ނ/¨FشvE-bŴ 1YjgcYMF,R2=1Qjq[v{=֑<L׷4G"zV-MEwк]u;V7_^ U0KrrkqFشV_^]JnLZ]=ޘ!4]?:]k-Zjm TƳVwΛlˍP{.jDUTWO]2mN+ ӪkC)WUOV6ªGQӍp B,^꪿[3; q,I?iK#rZiL]U=]^4]:w~ty^ue#z3SgՓ#i=5ۘtyc-ֱ,1V& Upbm釃ŴٍR6=틫e gUoۘfBc WOMi=1]>ӈ5:˧^U-5ŔZ VAԞFu~#Z\^Z,u^cԞƟљ*vU;F8th\x#zz]-'#Z?ꨭ*x|"xZiLZRNNS;]7Y 8ݖz%q3zzW=ՈjX7"#ӯ]Vb+`T07R/ԞF(uYcԅF4:1 fOvg]5:jo#zT=јvt-MX&[ 3іuk1qjQ]hSOdE0uNc˒flyǎT/VO7&[=ݘlH#zz1F\uVGl/p:جGS+M:J]ј4uucԕpjtyV)7k{y _6b.ÇZLN*Ar#ZiYJkpF8uYu]uQcՎF86RK~pyX#z:P=\}Yo4-pB8ݖӥN-֕U+'Z,=~=k7B:P=Q}1Ws4Z-&[nN4TZ8OJ]ۘ0ucc9pjіwN?.5=vZmVߚ.ӘnHcF`fj[W"DZjDSۧ?:q"1yp-ծi]Z6;[iV7&YԘzu$ 7gN-MmnnҘ.nnQ]_meeէu՗WWOVGZ `TR<]ژ0uquiuScխl Oz\kj&Wf}@1}Fu[uSuUuY˖p,⪟oVT/$-Tjkc۫wT5Nna8UOTߪPqF\u: 7HPQSiLzW ;mh׫?1աUN*im.iTWU7OUl`Uc6"oWOVG W#S`w"RniTlL:wMS/TU>ט\jo#:fXOPgՕ T7UVo.&0[pCk7a~PjU Al^ TS;˫%[Ll=U}VEXuW0S*\LkGuMu{#zOSWltVi=Qq'端UWǦ`c;~ ۦB|ꗫOW߬V}:U!g1j{ueݍ)TolaKm?hV6VVmKP)T6N|u{#:6 شoUX}1hu6yUpzlVm)TnL\3\SI;՟U/6ªc Sc1j1ǫwV7T7V{l@'ڔjUstZeiz߫Ek`Ϣ-?_-1p&Y}pZR}wEVlr*8IvyF@ufwn}i,7B=r[}^-OGۯ-WmPhP]X#wlsik5Y?gOc꺯 8kmkmߛ{6`^'_W_fj%dw/NZSԈӈoU")MW{X#z:<8|t}kL#`:ZTxt}ؓճ4[_S_/M_P?LWxT7ªuǽ.V`-WkesRuqut{^mY2Zc'9ՇTT[^oLDVWWI;{qR 7PQ]kO 8Q/!֦CoDm-y1iǷ5GӞV4˾u_o?Qwjn~[׽j^4[-",^M?[4&`]VUM>^~ݎBbX[}l+~xWpPo;҈ nLָאַahU/?IHkOGNy;m?܈^\P{맵^oւݍXd-5 ab9s/vM??6m]ŔZևW+`ON~V^g0`?<  BP?4jqy ۫5"'oo[pqtrtct}GMA6!Ho$b(Pcj2^R+ak#`Fu~]]4=W#Z_L˧^ `V[iw?7,l0*`y6aQhh}s=&IOZ^\?4N^L|7t jLZHsxYqp}W֦PnoWNLkW6Fuִvjq},K_hLFoT4cZ!`͖ ۫S݈n.kl R/<jM{"ZL#zJԈqԋ$ 8Ok_Ձx򕞴λE|c]Иdu1Fu^kΙأ~86GJcZտ>_=1~#8UD泫ջ1խ˶ HH[6zH=ۈiDRKHj8 ܁X]y+?ޘV1^\]vMm|l[no>U}om% YjLqOnh l~^e-Q϶6UjqsZb9 xpuxwXw;ڈvLk1FpuQcE94B-W@\l%'{߯~j#6T0'"/O7&C":˧L6bZlQ4NZ~z|ɰ}pc]ïpu:F9V]o7\]T]6=O[rnկU[FdܺN"Agԇ-]V.6q"ZUOTOϷ6Iuϯ{@u `Z\hdՅjw#|}tJ/NL>W?g\*$O@#fz8ԑF4Ԗ'SMZL:| "zOjlV7"EtuIcuG ԾiZ>ߘZ;գ뎏8UlvITˍ_}12[ݱF r1}F,hH#z1aotF0uvHjo#L]o{uN#:wW].OhկV?S3տOXpB ،6NhƉNSkԑF(`@#zzM=]؈Jഞjϴ.nL[؈.k-ڲ 8qΫ>UtuGWl:ZgKN6w/>RdƔZm-:ڤcPǪSmT{buVl8ǪuߺΫoLl:u:'YfoYOT>]~ϫ7U[O_/>\}zwcJyN㣩z1&MPKp1AF4܈Λe VW7[SA"bK ՘cկ5&V[X؈WGmDT4N޺ b:ÍlmCsӱs/O;v7&^[\0նDVzmmĊ7W\vw@U b{҈>T|IgxV:8pcCXM:0-x^֓/6.Օc+XnL귪t'UN#6"WW7&^>mh#zqBwGCj_}od84{1U77ވV%[nWZXebkTp4B 7&RG[m>:ܘ(DF<@#zzp@#h'Y]P]ߘbuK#IVd+MZUUFXt :*NIT>ZDur|8uoSˇS?7No ؄dj[R]ڈFnјsbDVUV]}s:F4 `"dXsnkn[Z8upj_btk5&Sl\#jvW5ZFdsZXoUV8V.n>RduKu~0_Xjqy:P^hD~puz`z_igWWT7WN7NӈWce ,W7TU*UuOS1꣍L`~SW6&K=Ә2FP=8i=\P=Y؈>8iMȥFXrSc-SVɖY}귧ԗV3"Zj`q釫ޟ3j/4Gԃ'>ИFuhuGm!/M?p:=1Ƈ4no=J+μvoӍUj:5-Ae8꣍ITﭮ3ёg'_?8龽S96‘'ǍpF`uscrӺpz|[+ꗪߨ~z|:8c x%ۦuu#pƉlgֱj_c7R=ވ^h-άcGF8uQu}#zgcυ뎙] c{UY|`p|qrWnβ=!ԡdLpƤGD =nxdZ.n|m=->e[&KՏUI'ճ0 #ƧT}qMh#:؈5©WkLz1uq'pUW5>}{t ͅտ_}R[6=A,VlLzGu8l6SZ>HTtb&Oo;iW}?Pj1jGŶ\X'U~ `^wTWkT﩮'糹kL8؈7M[}P=Ј6# 8ɞ7ߩt}Kc GhY26YJ^=UgFDzWOVMfpOjTO5&O}vcÍxj#8/ON_U4o|sw{VU6>`STv4>/V77N؄X#zF؈R=FoZV~uUՇKc[7B[}qz}l*3=ޮIqb湶 p#:ThR4{oUO;b3F|X6>ǫnj-Zel@A3-$Urcy;RBua:ZXv4eqK?UTzՋh`Tl[]եՇgNilTӧR;Io8[hx`ToTz5F#ؖ>Au{h:WU5N/Lp<\oL}Uja pUg'S~+ `YjNDՇsb$juqk)T_$Ngߞ֞OTokLprS[}{ _lꝍ!rdH8UƧ_}rttc oUgW~Fr^cVqw1][i ZVs[S~lG[ 6V߫_}1{zǶLԺk^=q;^! ;{֛t;RTc;+>Y}qLGTQ}1ꀭV3+vW;Wq꼽qww;Vm p* N'WqLםɲ>WM}oNcBg:k6⪏6mjVqm>ݘy?8pGl pNjWş~Pu$8Z@Ru Tߪ_Uun>RXczUjm$ݯ1Uʹ*[Z]wƶλ7'_PcmwNFHLEI߫?p&Phx-[7⪟^v8~G84M8p^ p 0>kgue/5>}YT[}N`<x#ǙL7w6OTov7%[Ip~WN/ɺI!81VӨU}q wqT/V_j|rՓ 8q^xZk窟jL}߯Iwa.p9[v4>I_>8݆7kN-P=Xi#ZP\N*xLUՇҘ{A#ZM@;xz֦UDTq' ^WJMv޼@H#|F@:b8UO뷧@T}vz6q]iU_K' Yj\[Ûpט@tUiUQߩ>R%ծjmX2 8AUm:TVޠÍN_jTш؈"6˿lLZLVq"ƴ_oL:d[7KPvTWzNtP]}'꿫g}?\]ZUuwV?Q7տoVa*5[]Օ6NmuXmLz[=PSq㉝wmcgueuGKmUlo?>҈֘ jS?{/Y^ӓsfaȒ"A -AńWp]kv ^QFT$Ca2n[p#"ةm'ﭞTݣ[V-iUoN)TKs]'W nkZmjL::tuk/U?[Q}wcrՃRb^]}KՇ0 !*`)XVYoMuhn1)TVߨi>6n͗3TVzluJu`\D'5q7Ee|*`1[QRݽzx3*6WS9QW}dꆩukffv`7dydq}#"b[JcVWܑB_UZ=3CIJRءFӓ?Eӫ624&ÝyQcZVo| p *`X(R8sgUGfI֘@:r g%UU=1m1ݪSݿ՟O> n P U\spu걍<9iKuSHuEc/U.,7U\z\]C׀9F7U7P_=bY6U7L M/7 UP¶yӪ{WGN>#Žx[~bՉB2,y5y=z S"E MG>zhՁY4UKs/U>\m0?ϼ[U/nNVg{LկVoAB`QQfò.;=;G^ DuMu~uVDt -۫4&V}kul-u'UTݳՅg#0V4Tw IJM7v0P]٘Bunuf)B"q`o|eiگAc~bE,)T3FգŲM7vQ:1TUiDoiW=:Z.%kMcjoT6.*`olLɍ#k[Q:|۟H XZ.~zg)CSZ\_JoM"I ]˪U"êgWϙg.mnD2KW\}_,-V\ݵZW]1l , UZVaQwLcDl64JTU_NoL:FD V慨1n՘Ru|\u6@(Twfy:q͂q/5JTkR}dFݖN~{zX`aaؑ}EUO͂1ՙSS7Wo>\qGUGN>Ot:fP-E{UO[=Z!ak5(Q}QD̘+SzNeY2XVjF[hsƎ@kL(Q]X}QTuVJTŪﯾkuhVYQ^$0)T+ë7vzF0{[MS,gUE0N>_=1эi,~~QZט`C Ut2AӫV˼vKFG%m"6Vo>V}_]CE$YruL%մX`~Q9ꁍT/Jj>+#Q`~_ջlL:_45뫳sW`XY[=zjcG{e^Vmnh>W}F իU/_]-͢#]M^JU0O(Tx\9_U3;[}x[T^\ݿ:P4޳e/U=*X]=w%yeQ[KTNopqE;WVONVfQ{fuP}}O GVk˼1]moT>U}Q("ES6&V=:T,UQS}H G4JTϯ˼rcǪҲƔ^PݭZ)EVPs*Xo[zNuX-ITWWg6P}zrzxέ~`_fQz`GT { Upl^=zvTjcuMSgӪ\}˫fZbuRՊՍ"P }1#Ө}g[y)TW*v%o5&pwEQr;M B,wDVY(}fQ'3/TS"`}1<^6MuH`n(TulDg"վ[KT7JTgV͎O̜K?NkLLZl~:f2ne"٧Pq"s;NHolm(Q}Q9z|LZl~:t=n%"٥PϊY=zZ&R ۪Ǝkh\0tGUDXm;n7G #?;Sk7vXjEDC|^bJ,5 s)UR}"%VeL7R7TT_>֘H&0\ZNVeX٘TlK fB;+CVj$9r(ߧ7R].gwO>ϾzIuw ,|7JU)UP:zHҶjcuMuN<<\TjuF#cŲ(2J fB̝卝S=zQTseSucu~c'OLL.V?\=:Z&O fB̾e'7&R=Z!Y|uz3r,&_^;bYn)UM^w`f(T:1s6&U1; 5#sdT<,r7W5L;IJ୬~ڸzߛZJQٱ:zRd*f꣓/%V,t+.]vukn 9*wi^P=:H,b[5U]U}1"Ս`'WeA;jfjݚE{F f˪LjloLxꓓ?ZQo+˂vLղk׿Q B卣kc"325N]V}[KT6vsOWgW_ݭ 1IU&DG WeFMWk;|}QLux`\VjꧪoiLfa:e׮Ժ58A vAՃEUdFmn.>U}XTmk GQ(/UW]ީukvr.;1ꇫ?nXjfLW7U5 TS`SuT0>]zCus9 CǞzz~`Pw˫NJdl.>R}Ժ5f)U_~_.T~fZfH`l_KSŲצ˫36R}ijݚ93UiuV*,HO~׮Ժ5N(T7[Q]=;CIJ׶TVUU^]&اW]Ztp,HϪn^W#1*XvꡍTϫ^e;h}rA<̥ukcgV?S}zEuRL, ΋W]S\$>*k/Tq${HflίNS}2Ө`>FǪSY8VTkW]{S\.f UZvoY=a"cӨ.kLzoF A&[K̆Ϫ _, VW^/D?PR:zbHqyOmjsnFꧫlLf8DR`YQS=QzVuXvtuSuiCՇ33 OU.^R-.kw;X*WW^T=:Q,mKcyGӨ>U}C4(]XBT2,V?טTAr`S`)8zP=E[+/6JTPm,zVS]Vo5, {ߪR*{TϨ^y]1c'_4òq!ꗫRg#}ՓWOVemή(RY XV]Y|jH6TT]-2*QcUϪ.n.>Shuh;HgUdAX]zcuHXX,Z}O] Uܹ-#_P}QLuh|cJTա"Y~wC(TЭ8W.q;WgUDskWTGdAWc׫`IQ`ZI)suէTn'.gucձ"YUQ:W,5 U,4˪êGT/TŲS[swU֘LI4 jKIp߾rq(TXZDԆ տW. 0 ~1^)Uw/1e *]gW?P=D$;um§WoW,`mO /?W7mLEO lyuTB۷:zOƎLsVVd^gSRէi)T0_R=zd9T$۵bb7WWUP}kKw^(](;.oQ=Z[W$dsտU 0XJl^T}$tXl`XQP}GN6ޖkU>ҘRK}r>ۿ)X`|pxe#$X]Z}1},~唪WUVnLJE սV_U$tuCuIc տW. }1WR^puAu8Xl`_XQ\=q"VW_>X:N4_m S~J,66R0UUj^P(67vN9QzwuzcRbIU٪jmj}Q$,&6P0W(QH3ʥէ>P-`Z׮]TlN^UӘ.?,6N0VT'WO^Q=V$UP]\}zGc*buk>z~-GU?\]T]("`Z=cLUu]uF5攩%fjݚOV?_}"y떉B ٲzjHjbk0Wk>\,US|QpJUAﳞIb, U̖S- VߨUr=V^"+U}&y^ՏVN 28R<6&tIu7ZcկVgJczJ}Ѣ`O̒eRRtcuauZ ^ oUX[%7{/0*{75&RF w_8hՏT_>%**sUgUH5TZUcWTUH v϶F4S0s:zMu8WgV],*5[E/TokLF,bz}u@Ց"W~rC vnsuquzFZ̺MTW?:9exp9E`!QzHO"skC'H/iLbxquFgՍ`PۻqT5JT >uAk!"7VU[}X5-*muչG>*y귪CV+D2oT^+}1o^HEE|PR1=T_ :Չ7Y:Jg U,[+OUZ[uX^U!yeGU[|PbQ:Q2,x7Voh^^ yՙ T>*vUV?^$}VP|rsuv'DژRu껳]t_; `_}m:13 wyգű=zvu~u8ؗW;N]}z[T̬OV\\$}jU=*}  U 7T__kT̞7U^]$}TW}E ٴlbZꭍ#l֘RuF/zd& +-"GSmsݫGv1Y:X U̖eՆ_VoLwTw>A\msM ٲhuNR}jmJ̱ %s\S`ll`շWEIRP>ZMbyYuW10՟Wby\j(M U['&Q3WM &*akψbyLL`)Tꯪ+E|uW10[n5&V1U=_*ۻQ3/NA j(TVP}V.}q`)TlEO(Q͍=̎mδ('V(SՓ;au^ꃍ7ݘ5T]}d]27W^1ͿK*`No2#TϬU:KudybF V7Z3&ǜ9z|@h{D fֲFqs'Ww?y0YT͝TǥPP=Qxuv\fQ:L9Uwrӫnq=!IշT]wr^ݽ1)쭛2ɞQnR=s@շzũTN.pCwVOU߻Oա+νGT͕ê'7&]!vBTPo'׻Q~Lar_Y=zvujvb )썩S֮RڊjKZ&cuե6̊T?׎T[SzSu.rK9dgcէSY(U]kViL[!9qkqvH]jS?:.{nEG$`=;|S՟VokV4ԴbFaj[9GWO~Fiv74 S7ONw6W/(U\&xL5&=:EsbƔ772D k45۪M `6ܳQz.PyW,50tPuTP-֢Ս R7WWUWUTߨhyΨ~Z[[frgs >e`B0׶6j:;|C+&-ӘjxK4J<.VwtE[ӟQca/Fjelr-eS7&Fޅ|\v^z_;\vէ˽vۙVǬ;`g`ژRuGVo<s~ցPӷYl^=Q뽿z'כz|n-s5'5 AWgӲm[gTǬ[>y e U *ؾVe(뫯Tuzza,R UUgUZ=:crk=Ug4pξW'-|nkwU}^՘7w؅VQڶmnWbNҘv(*f'6&@eWړI:奄x'YݮZn;ݭ1Ƕ=$f;Ikp;6z7{HDtG 2Ru@6\vDp/=rUQ̉Uʶpv—Pu;_VmǏoYuӝ<)Uv6Z}QշTxYm۪ D1'VU;Pc\tƶ;޷e7n5۹/=v$͢u˫UQ;:i;omb.'j\QչՕ۹wr؆D1'P߮Og`Q;OcZu˷xUGW<ե۳vhš˛BW66JSnst:OՓbiT];9R[T_mAת-|Iwhc"mlL~i~Qگ[ UӓՍבծ8}Lc6y[s;ȅ]wM[1W( Pi6+r`󪿪ރߝnsvm>[]Bl[V=1Zqp[E3C˚BLz'gӴ+ f~iuFqm(-*/t-կ5 U7mVe0k(1;R[KUۚ(ܑ)?31v۪݊Em' N_[*ރ?M3W+4S.iLz`u8fC+D-.oLyT#I7[o4L˫㫻6&U皙2U2Am;ՍX콩IcV[ݯ:7@&SWGXzkc>W=Oz\:::O7f Bю U+Sf>ꯪ/?zJ^>][۝=_VmŬ:BBTuAe;ژv3W>јT5u';F!jO(..ҘqTvp QP U=_.w٘V5W.\IsU{x?QpT_qS窫E1VUk%J 3s)=W1%jglLz~c{o˫Ӫk,fŗVD1R&J t;zhl[c{Qunݫ'k˶xY̊E1(S׮_QT5-lLU7˕bjݚ[!r&,|m8oc/>X[un{EL$HuìX}:Ta{)TsY};wn^V_>V3&{r\[{L)U݅۽wcq۹5^fRc*ډ䳥j(P1˫ooxPuN5vU{W7JL'_du=_U΋7OkLjNz~;xFهu$뇶{X_cҶjda/SsT]ms^zHuNwp@U(.ur캡Tj[ݷ1 =0;sm[cgmi1̘ 6VkhӢfڿTﭶ]}W\=w^Y=`;mߘе`m>_].YuX<*`)`ydAVQSvuM9wr ZOVCU3W_tHcB*Q,m UsWU뫳wpV'oe}s\gw\}j\nsosުjLٺ ?Wԕ՗E1kMN(T,q Up[Mu.QߪpյIӇnYMFcԶx<7V]}6u;:[SWoL:|;;]1z}Nm(1{N=]& k?(TݧzI^($Nu+7O_(bF=G1YF!j~nQu^PBuW?6skbuN{~&q,M Uk.:zv._YXc(ɬ1%jsD5V=HQzW,VTSiVV?P1g{Pߪgέ(1;W `R]SsjmurcRGt,=;{LOV:7US}y1''ҥPW5ajݚmߪ_<{'[ӭqZ}[;Twk}jsƴ0sRcUX`Xvӫ˫T UuTu귪GT[}Qטr4zsVp~ud.Ǭ8Q/:0(T[v˪zT`V3^Z=ꝍbՖ|<˫'sөvMVZZ-Yqdu3Fq,= U0V]B}OWUWM[0mmn^]=o{c3wWά^Xmj'WlL:ovwQꏪ+yeCJjv(BPsdw^5Y.nf@ ̽FSڑ{V?R>(UYW]((XъFF!nթV؅ǻbgygSuFue,[Y49` RYze6vzZ^-, jL}ze)w꩓_]]>95XU=w1^S}zCl^pgòLX`^~EgJkLzyFq8(osF2t{mor՛ykSɘY˪Ei,- U0KV]ꧫgIMWTϬPrƔwWT}Y0nTݐBl91q,- U0 V]@h+Xrή~ՓTG7%6J]inJ͓uxCc3ꮍBP3lVϫ~zD`IdyPUݣ:ZQ-ZMUUTn>՘Rtau;hp*A2KQE"&WVZݯ1}rXctcU7ӌ>S}:_܋µܣSY˫c`I0̐k]zmuDb|::[c ]#M&TE(TT.QdV%aS ULXXV\EߝZF ݱ(Ym)T_= 9YԺ5jun.Kg6,kl0 `S`!YQ=1jέ~ojݚY쁭Ն)3kUul(7*eê6JU Uo:`Y^/X5&Rz}WToԺ5 6bmTӢX W]o?Zn͍xy-AI_0ݵnjzK;S\ku03Ei6΁I=*S^@]oM[s XQʶٰ:ir "Kvc,,ǿpS|`lfBlX(S-P|txU-2UL[s T]YmŌVM)T0(S:x>O[n( 3 U'Tϩ~:a>] ,ژ̛΄*EO biT'-pm_M[*`̶ٰ:O/VT~z}S۪?ZYdXYR( M }mYu#sR}ukauH7*S@tFV',h[mbXؗ^dΩpjݚZM`S`_9j~W:*#^Y@ Ϧ֭l, U̵V?9y!TukJ*Ҫks>YԺ5Y BseEmWYꏦ֭9*Xx+~z~Toju,L U̅{V?S=i?뫿Ժ5[RI v|s\éukJ.*fӡT?t RM r@U+8V)§Plدzz?#zcV)ȶjZ g ~~wTQmJGVV{F vuCsV}ydEulJg3ꧪg,Z̠e5]QMONlL6YVWG:rUU7N~gjͷV ,HcE{F rX]ꯪYeF9jU(uXu@uѓ?ojLؿ[NTMnk.n-jM7/OM~QX]]T]?j1mִٍ`(T0WD տT7;c+U2ՑaRGMNT(J7yuj̖ ֶɟ7WN|K,W5 WWMs6Ymm}={9*֊Yc[+VnwU4u )RGM?fr'Sn!;ޖĪS.m..15喲0w5&^.ŬPTX[^Ww?s?δJXඦ{cFn-OXݽKu&wuG76&V]^]V]T}`r\ uMޏŌ( M qꧪ.qUտYsfmN1+wMk03M/ۖ!ؙաIS7JSYYOSnsՓԗ7&WU}QQwfƄLz5% M =uT% ylj:'V5&ݯ0Y+IJצ;W][82`iP`WUhE\RQ[=YX=Qjc媯6vL2uPuCok(,(5w:qO4&W}|#*f)BbUꕋ\YaYV2YQ=Q\uFFjE+5&%>arzhՍrC4 U>9ypөaVlmLX3˫T]eCZ0o-MT_nw1E&{wHR bK/3~Ӎ_ߘ;U,/άNkL8YLTWV<9=A,Kʪգp[I=R JM@RDQaԱ!6Q;q~8;*^B )sr޿? -ޫ<׵|^}־׺?=LտT׋9at=Y+bڝ U3O ;srKVowX`l8z=T*G7L5|x U̯}Ć ԯޚbesuw#w[uu&h<*êm7ZvVQmwX`W=zr׏<`-n~TCIWWI/pIkUon s`KulI+bZlS~MS.VՍ-L͵ȃGUohBf6LzR3z=A*QU4SIVƺC KyP13OTV]T:gz|ôWKuhf±۶?zJ؆TpW0՟>R 3hSuXxMy S ^hFiwsF?uX`5z=U׉`*Y=a X01h1[&T-bE\WݰfBwtDf`-K۫_v:03VUfw}05Ϋ\=zHCVYzSô GX9js@ mj(R}ߌWrh`&ݫaC6J# j&φSiN(VzW4LbX1^ UaՏ7OOVi C{W^QZq} `ܻzqw S91~Kel 0{չ3v90QSVCãꛫ'W5a2ڽW_]LՉކ2Q>*_}팬>9ՃhV` 65yQ@q0!V`uwW]/VRCjIO `ml ꏫW;0gkj]}{0a6VOj(ݫaZBJ[}6S,B|XRD}U5LzW,ꛪE„;zQuNC }o:Z/ڙ UsA `~Z}Y'SϡFjyꗪV0vUa:F0%6WϪQjGյb`^#TP`)ŢêUϜTyj c6J"9m FT/m(a#"`B0>*NsgCæmx[SV󫟩Cu8W?2mz0aY+jYO `ܧBww9WpZՏTw;gTDŒP=ճm?T$Lj(V Վ_$ ٧P0_NzČgg7vO5L:NJ qHuj&T[0bu5 KHB2w>/  0ά~mM`^2te,UWW;D0Bӕ_X>#k_^=aRսEpm(bxq0G~z5vhurﮔ}Օ͢D0QgwZ =gEΨ(q06VZmW⋖8aJ+c_u'sfնI3Upx1xN^<~T̻<S UXVŊaR Uicտ5V}JXA oix88;KU&UZjljaE]_yEˢ U 5}fXaGV?T=f`NQX{ R+o]uVE+fQ0srսfhM7VG-n۾ `ݽr*ί~zR+dkuk! P0[Tϭ=CkWV&U) `FYdj8ݧTt*V! CDbn/TP-;WV>km?\_[SqoCꩋ۶q:m>; pc`vT:kִz}jX#7L~w9`]PDhQ0FTljaEp7*9b3lR]T=}ִ\}jC ( `Vs88@T[QKg/|^ C6кTTC L6L ] նzA,]::^+j_u's& uJY3'A^\hzFm׋pV?P Vza&#g/n~( X}gC\ 6L;[짣S3p][}6%B9[׍Tp)zvm}&Ɇ9UG&B1+X0DQjQ˖'غwV;W ձ&W'&Άꛫoo)ȯVQ*P=6ܸ'eJ09TDu(`bV~9ttMw(VԞj(;gl]7VSkcDӫ! xgU0Ӫsrn>p9P065l} 귫f` Xߔ*` UplxpΑ S*wmɆIU M6Uu)vfCݔ*`-lz^E056Vϭ#|!XqWWVK? Uꛪغ{m306TOʔ*`mVvafꫪm_ o(S=R0W_[=gt= NŊxu(BZ=z ϫw8 9zBu(Y)`,8:;:umÄݢO Uyކ}S̒ eSDGWPfýTG`0j(V'%Q'*t\C\ێ꯫8 Wm7X!gT3amZ=#̫2ՙfe}N ˍYɳzb\RtW::zlu(px'fE0~.a:^Q/*ɲP]}gu 3 m^ܶgn`ܞR=* YaS=Ć UbhOq(]3};?twf:VM06Wj^|9W^+nQ/*ɱP=j U506O0&G4L2~(`.\aR acuQkOUK_ U۫fpm{wU0s꾋۶op[-ºEWŪ!P0WO<뻶GypJQyirX-սD0ή0P[M `2Y=:z׶a:՟8аxQB#Ds^ \0WŪzOC 9PV][auC ̙ m }Uj(Ҟ _-bi4<0QV{E0lX{|ڰT<;j8xꞢI]׎ _۰wݗaj:jׇU6q6e,8WnL:z@YusN `m]mΝ]_~uC ̡ SH k6VP=\Zj(KZ]]]հ3M՞;P4{n/TQ?z8B) e|'V}#T;6?{sֆrսӫnT>|6L{}J!ˬws Uky13mx6k(ۖIwfyj~[6jX{BÄiz轃3wSu]҆j(TZk}~I՛CX::n(ZĢC96TTJ3†"4+oGi9Ʀcgt}Vvhx{~Glɗ4N8aCBuTÔ 67LCsGM- r=w}<Ej1P Uk `.t*76lW{S3K ũc6үk|TuXCwwdĤ;ctLi,8Ġ)>:iQzMCɳhW?Var1NpꫫTX]Peu]mVۡ76lEf:_TMxG9գWI0Al(˝xbffab|ֿ\}p gikk?mt:z ߟ@P&F| 귫[nʺfzk6??OYգ{Ee]U&.UwVT^=:Bj(B8a:ձ3#5LkWTU?$l%V1 6P|'Wtr}C! %dS ?UWVߖ)kԆB?V`j,TŪHC ܑBT}uU3[?jLLm8kG) U3jm}wA5ɪR=:z8!뿣Ej7V;[wꛪ3ir`*zI X=WG'Wwtma[Tㆆiz8V=F# Q[&* f X=z qWWGnsfeq-n8PԺŪÆJ̤qXakűk(T) zbu(Ve 5=Tc:zVaF׷\}܌i/>(UsLC Cj'c׉bUl?`P=R-b ٰrVO7k]}u S5oW׋bUY]̽6#U_>)OeRj__bXU{W;DRX oh7^UTo6m(Ql̽GV~j>Pa:?5Lbm.+ zv  ϣP2U?k]Wڧ?>.a USSE*>T@KTŪ8r霆RQV_Bʼޯa,VޛͫlywAj(VJ=&+Ku(V!c`"-4/8IjzCu(Rs׸zw7̄.Ŋ;:J 0TNŊ@Cj3,kUnŊGML'5;`lPP0V_;뼹a:59̌Vovdu6;|:zBu(VGMj~jI+! Ȇ+듣B |I UuXC^R57̔+T׊bEYSm̝uëE{ʔ'ŵ/UŊP] fK)UѵQ{gTVM+fsl/>v^]ju8&WJ:zb4L޺{'b]|Y U㱾zp_MջrI6l8畳0ʄ*/[WbS62vW0-sVuo1Lsnj>zc\+ BxP:yy]ZjO*QզLys!X~D/WWbW}k 5P=ctZj(pwF `թg+l0Wz(bX1Ugb|W׉U Uoc'Mκ[CsG?_5PPN|l@#.;WCeQ̴]տ8VS cX}ڏzsC.Q?UO[aUݣZX,>_3ohX V=zRVo˄KB99X-+U쿍չQ՟V׋b.P%19 SY;o>#BWа!d^eW5X-7Tvb.Z}Rcar *saQVovPV=:iֺ<@^]mXk(|JscDcwrC (۪w5L4L -TgVϙRa8 gV'alV0q}Bs|uS2j-aJOX=:o]>Q ⋄Rݳ:Tcs]/:0onٰA$qս~WwŚxj(8P&TܹSZEup0CD1J5Y.mx 㳥:+c5< )wtGzoa8 Tgg"qYsm!1ݩb8`GUQ'5ucچpV`{Vq S[wTb. սp0J~m}zk} 8` U_d;St='E1vUXS#rbՑXSK K;zruܜvrlCQކT׊bn-U^a 뾵zpB[^=}N{[憧p[YmXU(v]11ꔆzs6< k8( U_lK9YϪ]=9:A cxCuc6LSU]'5wkQ0 U_ĆT`KevGu(b\s꣣ V?AlwWoqP|V^jQRQ̽=էD1VU~9Lk?Pذ!n UQ̽2յC_V=AlOWicP9s'zOUp1imU?Y" [3b6U'~V=:VᯫK89c3dUP]#0VWT{@ÄOaJU|yϫ*pKfQ0N Us| KM=Y0`Qcٝ_, Fǫ}cSe=znUM% L`l^`oC3CD15Q0abnQqb:Ga_u`GTVSi>K UTݐI|ZV(/Փ&]1jVB^xF9Z= p0NwlrDΉJUϖX1|ӫoxeuX 6{as}եzrlufUjjsuBQf]-E11.^S+A nN5/HnPX-al6hvS cDoY}cu(&_>+H wV5Z%O8ϓ'W[D16K bP ]{Au(&uU7P̻CTzUS v0vG7L`L7$Qp+`-4l~{ե?Apg_Ävg:J82*W8QniNu(XI U<[_]0z͋] өv:ІBzQ_dw<*m1#7_?TP̫Q HR?A;:J +yhZXmin `=j(&j{u(Xi UZήzּzKaUmX_j(jSC=`^ݻ$QLAT]Pcּzk8hǦP5N-mOh(yVjO9dž|W̟#.DSa)Qyɯ5/WWU8mCubEcud=ϯ29a*վ·[W>z)TճRԝ4o^0VB0{V5i(S}8h[RZTO_xYU]&`ܫѵcORQZy::zּzgupSմ0z1^W,꟪ݢ`0N8G]ޑ9憇txX0Ͷ ̗UmDY2өXe UY_ݫzyx`,6WGr6_܁vq8TnI 7TVs={~8tfsbT,VB0O'ٺoPVm06f7TϮ6b⼿zMu(Xm Uݳzyzg0.dC.06WLjqVn"z__yz@wŞ'~9"`ʭk'UD@Ս`-(Tb:9[mջcafQ3~%ٴP}{DOzoSF@ Um 7'M^ ~c#D̠'4D@WQVl!wU.qfsu|TiZ=`WhuOQL3 5P̃nOu_]1) ao&{Ljbb}a:M`-)T^wVu]n?g^ v Ńf}T1TTL?ypHjm O`<6UG{5`>hQ3⫪龜z[Ct*֜[>gS}S`0#6^EX;E$PfBufwuO<`>k̂ `^}imk_Sfݖs~w[C6X)&B&qLWVB uGTO5/WT5sxuyV_]}ou(&kvIP{ݪ l{U9jQ 8:^ :zau(& ꓢ`(TlKjӜ{w&ح̈MաbбTՒ($ U,R=q׽zgä*kZ0#>o;k&TWIP̪sCNPiyf]Ցx\&B06VVGٺ6w 0cQ:CCV7IP̪sNqLE Gb-7- &B06prS`U'W[EAj x\qU0Y: O`MN `5mW_3vUW`mհmm(S})"GDjY}Ou(k]7RfBռzgÔ*v^T%p}tDSf}9\v9 r~PS3)P̚MêcpUr 0Ncբ^Q]# B0k6V_Uu/Up 0Ŏ~zVeN=VM`Zo׽zWuS);X% B0K6TUVPzVѢ7TWD %WT9 6۶? iL?ZD % 9[ru}qfqU?Y] 귪+EQfɑչs}GLmϮ^\=\S4< B0+6VNõ.nvUz4W{L)*`VlY:k[}i֥Xpm?LpoB0+6U=GeZN -n~T[*KWo} B0+e'Wgڗk8 VRuMu(훪U:T"So7ܛP̂pOi*>S*nT$2uni(S=өr U,X__2k[} *ղaRw ճ.՟`)T`}uja׾HZ6O5ՏVgb*}zEIQ0 Yx;:sN׿`,Pp,nꧪIc*VAղ8 UPݷ:}׾\][]4X5Tw폭~z4M`V(Tn}uAu}o~T~m&uiE,Q {V7: V N1ܹm/^R=^SkwPfB0cVnv*>ܹmShn̠ "9]ROV'܉QepiveE,rf뫳tnhE7ݡL܇f&S`渑L{=i{KէjWC oq󫗦L5 ZQ0=t{WW; V-gt@WzF?NOUD274i~{uƜ_:Z~̽Q?L5 v5L<@0WgUw/UV kB {w(S}]LUW, fB0_wtnwueIj\ZyPLMՙs[SX && `FeT37P1t˪nT$ `,T2KgL5+_NQ0/i::kN׿XuS`-UWWD̀)Tw~:eYWOyAZWPGKՍN5qM U+agjGT]U]. `,n~~d=YqC7yf05OW]WTX;G3:P}(dq WOYUQ0o 9aaoG[ cwu_t;fv^|X8i7NՏUm"lWH FVg'ZebV&S&ry?wyPLst N5Q c::Am__}m)߬ZJ 6StT:̮]}Ne<m۷TU/.귪DG & Չաs- X[7TaUGU+1 e\]u SV*`>_w*0V-|PYߪ^ɪEi:u׿T}6&j_@8x 1 M74Lz8fTQ]+ b UTXܶ}::ccXN `Z]6y8b]u<`Q}[Yig!QPLêsxK e k3e]uRU: ff( irTuQTXs{6?-﫾9YwK՟W/C  ՉՖ9`a:nDaR㳱:eq>qA{t)fq̴j{uqu8)Tbcuj 9`aw]uj]uf"T=u.|e UR>> pKu:qa>;껪1_bnQQ)7W; cGjgu8b}uVutu8.;H:Qs^mB j01n.MjU'U 艹0wk+PLP\psɰjcT#T=Lf>?p(T9^rucé0QnXkes0ܹ#oCu/q̕~Lp)T`}{2Znp:L0V R;sVշVcݢNp3xy3XvW{lǺ Tߗ2ռ&pPi:q3Xjx*BdHu(R=9ߙ̏Q+8p U4P0,W7V9& U;E1VGUT/ VqqSо ry&Tۆ긆)`0\}ghq̥?~ZpL9`irUuYta| |R=RWWBQx،LC< O4 `\U}%T=* ԉT/7yODA88,W{ 醆iT cS k0OXzvRͳO6 /*`-n۾:P0Q,^L}ǫc16 eW˃FTW0vDL ՉsRudB czFu(w~a"Rg;_~-?*`ҭ klxCsD{\sՋ{dV׫+c)x:Zd0Ѯ>\ZmX]=zgK̘cTQ?Cw6LJrܔ&ꘔ6TkwLXON3~OW?U=0?ɧ rct\z(`(Tkq)Una`r>Z(znu7Q0eΨ~aSEȧWG cB{6THui6Įsg>'X=GE|Lj8`uٜL{bhZl.vbElmRuQ0ΨL yxT[>*`ߣCKuխ32T7bE,TaLMՓ^\?UVJf6` աbhP[~ؐMkәRT]q0Aέ0꾹WkǍ`No(Vͳ<]T5|X>X]VWWPݧaU _WR<tGPu$5umCQՓAxh "_hs өR߭~BrT?SO0\&٩F1Y0fԕ0W7bU'T?P%`sCe_v~m۷q*,U{P=oVpm~R)PLܠYa3+㌆R~gD*4g:DT·?i(U-sR]-i ?L)bS 0ɖE3馆 ϦHӪ XsoP@:j"D1N^XdzVpJU`wu{Vt{e)STP&"4zHrmUk 俚Nn* [^P:a k 6L)PLD3i9iWچ %֞'EΪSQ̝GT?[mkX6.W?T}ʪi]^ ђkV+LSE d6lY]P4aܯO6OVoϤv^LgV?_=ڴW?VNJ|,4V퓩.L*`\ {sW+y`ZQH:T̴h(S=EՋm?Ae-`,WP4`*)T̓~`6^ye-T"Z[V׬sT}? 3>Kpt'm?!;+[E?lL~QtR&ihaR +kIoE&n(|GE3a?WϫYշW?fR06Q+TL/*`B̪kRZ 뫧U6cMT}FkOU?X)LӪ~֮$whCIm?a2 XY_,e*z U$[$ڕMϫ$K7gzZ:zQCqLV?Wxu0Gm?YSU7/mg˫B0fҲk1RX-k(ԎյXSV۪/qjJ8)^Ptqs5))wk+K2 f$zM{6Oj(VbC;CızGʄkmku}uH& S~z`~=]ms0egkOfB0Nٛv̎g -գk]V1Ջ#[űf.^kn"8W?R&o*՗3JUkI2+CWftT-)2;6N< m)}}KLjc"R=o;_gZ;z|CSᄒzFmOUw8Wub׫fB06T7l2)fVd:JZ6KP&X}UuTPdW=a#GWhCCj]ϮյbgWP(M U$'j(l6ig̻+&I^PݳzE.5_WϬ&rBՅ՟^oˊ;@3yiNyUj7?eg0PV۞EP"k׌ 2r-ln(.S=8jY4#k5LGbrkTu걣?&;zTTǏZêG[7WGS|'R 3O `:,eS#cѻEsC3u-Q}oCoa+5 y.D:z8Ew[EsP490fHuG5~jHqw۪8]$} Ua+f|i|TCZjmmRݷzSCi#ǪT;4v_Ô-XUo6?V.9iѣ>`5ThtX1˪U/  Uo]uhx?LBQPع:\a:{CqյՕ U76LYnr= SQ'y 圧TsM;x憉ϗthu^uaCi!i!sDž UX1 P0c `gu "1iWG^g7L=}- Gq} U ӞQeClaJչR5-k(ܧzf_T>=PctN{սz@{_cE0mVV?F96tX7zPnwuuYCiyduduRCIb{ 6SzbC鱹:azoΆW̲S۝]P6;|(X(?YpC|)7T^0lT{&R:.>X="SL_slh2&fVPF9ܩ5uF1|ZÔwW.>4{4Ֆꘆ)Tg6L:U{et؜ ̖] wd(̻5l$?DsiJ]o^]}u8n}ƹwuh(w\:#5>nirmh(Emm>uT$5NNs29 pK_]w"o Uo]ulÆ%5l$:*w \]¸,LٿǪjZs77V'Vj@}sueu3 on(F۪0w2[CÑǍF-WӪNj\.:CȿT?W-oɷ bo8x8`}`8S?iRq̤ז㾧aڎg SvBW6EPw<&J-}T4GraM+'NSJU5L%vM"zq_cYߪnz&+L `:ؼĬYnPzgoV0$q̅;N u{ U;W-筍 e w-[X;V?&U)UKFV̭]+_n(Y*鰱iMfM O_հƆ)0zT-2n?&Nnkuxfi o|PvVoP׫_>- y)tXdi%;O4V]' P6Q@oU0}CJ]Q+ +oi(LBtX6R@usCj([aS:Un̅Ϫ^] pgj(!D|x$ 4LXO@][\& y7URDF'P0=6W5l- h/J|:IUlj.ar 0.~نB:~QcEacӭF0k߮+ k7^R#{TO.R O$>D̘[VyWP۪kx0zyu8ΆD3eEV7 fކ2'E\V>$v5'kU?[K eQLǫ7A  ::Z⋄/n~ǿueҁ?k/e0I₆i0j8|Nq\P=m?9<͝zkC(qTpW*Bu= FS}GoZ߆R˫{+3zU>O S~%e*` LcU88_iBʗ3'[?F>4zy>GzCU^0F\TPt^ܩU\='L[?~zG$VVń*`)}~h0˪7VP"UZ^@wDO~*qܩULK\z[T)TϷPBꒆiUUWP >}>" {'7,/k{ƿT?QR qPLO޳E zO1Qw_}w+Փe]Umu(`~ծwPLψ,TGWG@ÓgnUskuqypCʤ/mO|/T/8s "I$/z>:J̨Vonp0|WUQwgVE>YYwdy}o(V(*`W'PUz(;Tյ/wavǿw.˲{lzI$?H()I !@BI  TqǸmYbҶ7WҮvn~>;̜>& jTxPH}H~K\Jt${b=bH.UkK0Uo.k>C"I$I$IJł*Il7Q`ءJm#JJC!IY|'*io{N !սz ǐzKTN5v-]@I$I$ITrTId+j_T $IǏc*i([' կ~ݩfM`Jn). \$I$I$E!T5LZ.áx0pHd3u,X!=< !՝(z_xpH%+࿈BC$I$I$$U!xF`&0Pn~m($I>n H8Rݹ+,57' Tt |J$I$I$U*Y!rܞMtjD".C!IBl/ih . K'@~k.47[6C$I$I$IRYP%6L1q;0YZ$=UBگ_ }(;S]@'QX%)[ہ/]K$I$I cAJ!x0-}Z8p v$I{EtJ!դLݣX!e# $I$I$I@TId& aTvn1$i[/`7K@UIc(pdpH| ss C"I$I$I*U!T i 7CQ)t!Iy"p40pHC#? 6$RUItRg,ڎ48xy~ijeC$I$I$U:;TIdcL`P \Gt$I,|pH+' l1RZ| 8Sg 4"; $I$I$IRJR%[h Չ1aL$=6?_ v>I$I$Ijd$U=Īه!YAu^ L!I gH"3r_%Uu*Dw'Cj]XH%I$I$I$U~`aR#0h6#Oo I4D7NpHԕΕwl0pS9NJ~|(b*I$I$IT,T麀axF`0PάPH!>NaK:w TVǀ GHIá:`:Gc1$$I$I$V4IXET ^zá:s7ZB`$IxHm8% ol>\l3p!Q@,R ba͆D$I$I$ $U~`aRC4C:8xfH$I>n> pz}#xx=nX?>4IlH//R)l"|']Tv_%%p!Q zpǐH$I$IZfAJG$rih<"ÄգǁI4ďVцD:?kwG# P(Ոi-WD$I$I$IRͳJR%v዁ Vá:n'>I>j+8C":[JD^}U]v_nHTźoi\K$I$I$ $U<{ ,R% >7$$iw=ip!j}`-+EgT CtW[NUU{<ʒ$I$I$Iuł*I,O$-c1)á: 0K`!$I&E{[}ۀE:d\+UZb?^E,~$Ui^|0P$I$I$.YP%uI&vx0.C:*ѩ]C"I XyD'#x'p!Fd;Q-D!jC?p*Dâ %ZC"I$I$IU*]/ 8*罆Cun@+v,$Ix!e Mm+IE:G`8q *:{D!SY$I$I$ JR'5f8`&ջܐ$I~6"Tp+х>)E?v/`9QTu9hXTFD!¿=E$I$I$iU*]9-, VƏ $In5$Ұ x v{6-Aa'p5$Qt`aQ (:%I$I$IdAJKoArDa2!D-;yD$ aU3< iXv"UI[_nZd@{G/}Dow1*'x~ pI$I$I$/$U>J \o(HyؐH!lFt|2|^" 4 x+p0Ͱ |d%yCRK-pâ"y(t1+♘$I$I$I!I`: vi/-3 $IDQD 4,Vu+8;>"I$I$I4<&6Hty`-3Â*i(;řؐHxfr|v" r`)Q4[K?Z &p}% `=[խ_ t,]ƢXH%I$I$I4b&ItybpHC勁*Hbzx=-IXA D7E.N"fwF58 ZKz y<|(y!rb$p~\+g^$I$I$I:TI;U7358PH ]\1_$ 'ͭ?~]\Fttp^\]jucG]K2$:;N~W'B[RI$I$I$/$UbM 8pHF"I6p7Q*l$! G8 1?/NUG끫ۻ.hH-/'Da%d- R1,$I$I$IٰJR5򘸸?ĊTIHFY< 8ܰH܏x>nh$Iv7U7WIGiX6Eˈ+3JUDGkxT*<.}~ g^<替~#ϒ$I@{Gg)Db);<b bZMզqzOo,ܙΥyt`T /)w rT"].U'S Ssѝl-C'8'V& #Lv*WE$I x+0i9x!ݸ$Iդ xF`D93\`m.pV8cyӾƧs"kN&ЕTItċÜ8V"s<TIj sbeWpI}{DaՉ㋉ tu]Kk.CU"VbQTފR)^"yn1q]\ QHuK6:ԤVˉUz8sSXh62C*ITr3btT#B[ $\3G&]m@R5 V]r/'S>;G[؃]IlzJ}8~4zz!<MV? $I Uہk.%u-]U{GN,#:NWS}XE/\K( T%Ce:Wd98HLi^kV72`b-k^ |8C%>%I473#$U+n `Q{G殥KF`,{Kw,}@7b)s*wd({mAeAjOͧL7Hؼ/MҡV_nʳ|P-IjK?aVπ㉂$gt-] xt.O̺HHi4Bۉ7O; yLb0D}o ybQfx{pQ0=ոm4Z] Pq \ tϜFghT,T-EpUJ ~ \Dt:HF$IW/.}K3UKz~bۈ_ ㋉B:D“Dկ+zG< ~C/:YAՑ]ȗaBjO.GTkZXP%6"QF"qD,9|Y-9hh} vQTvэnj$I$I V(|epۑ"}rz_pK&TI&$cDf!T/DRb $iU00T[uZUUSC@DbqDtBqU{:ǧ?}}|ra_.̽XXNAbqpFKCVפqAa%x3vJ7}͸D'ҟa7*I$I$Ic<8Xx!綌_xw=ص&$U $U# IUy~9M)kwxPxkRUܕa/(91zs?vȯSgKxj&Bډ֭C4N<O \DiۄEU/Miw]{4.zP5iхAZj{گT*Xu-Cw$I$IJNx-VppQpuŵNN5O RⲒUN`%^T^|aTpv8oSk|JRel$I$I$Ր`ѥWˁ <ߕL"$XP%&V,5v*W/VVm3(M?"`RV J$IRNm* CYM&:Ms t6hNV1FMm%^=~]s֧_/Ժ<~$I$I$I%u#;"#SxkFi4UI?rgp1c"IIRu#V l$O@bgj9xX]$IvnJaǧலӉW$Ixl#" v{m tK__OTv=^G$I$I$Ip;p W ]Ŀ-bUIH@kN&,[?oӘvm*![ $I> 4oNᅮVS&i;ӟ!{Ld?}Zs4m-o! v(CGu>lH1XMv֓>#I$I$I;N]RwJ$IJTI&y`jԂkOj0H$I5ϥ§(\(N 4 XoxB?_ؑ 3PHA'^p5_ET Ă6=ۓgQ,UwI$I$I$:I;xu)ѽj>U ,XpHUI 278i$I$d [Si?k~\=sX$%I$I$ITO706X`C[x%IUł*If&TIVm0$I$UBUA!$I$I$IR x=pҠ-Nv8X |%5IUx0 [pU6C'XP%䁍 C1l9`&ph8$I$I$I$I$I\<]8 z Z`Aj ;TTp 0PH$I$I$I$I$  &wJRղJR5:&TC!I$I$I$I$I$ذۀܠ?o2I‚*Ij-0 [ I$I$I$I$I$qFwM$&XP%OOi. I$I$I$I$I$Mv|f$ $U|=e(F8 8PH$I$I$I$I$),Cwz %m$ $U20bc $I$I$I$I$IRIhzoW.T,T@V|C!I$I$I$I$ITRM@3C|m>`8~D4<lѽ ~O\RJR5{XgF$HWI$I$I$I$I$F0eM!& v k0n=].dIFi6pH;p`$I$I$I$I$I*57yD.lhvr' ~ V2eo/CirVwJeAjO Lj'`A$I$I$I$I$IR>IQEGfF_P 'OTv s_~Atʧo0~࿉N[].RYP%C2x>p+pH$I$I$I$I$]Ԩ6tӞn؞>iwj`$U~q׆T{k# 7$I$I$I$I$IzbAj<:/$J$I$I$I$I$IT,Te:CqHKB$I$I$I$I$IT/,TOC l($I$I$I$I$I$I‚*Iծ FcJPH$I$I$I$I$IU]8P62`$I$I$I$I$I$ $U`8$9`6bC!I$I$I$I$I$ITIvy`-PkB$I$I$I$I$IT x0`1pi8$I$I$IM{GI_479=SuZ? X7|U)}u-]R J5aa\z*T1 mZxkZc;{ UUWμsu ZĹjm۹a^=%I2j <lC2x#C`$I$I$Isid`0HJLU-DRAg5 ?]-qӈ)i86}C+}-5ZwGَߦYDBjtFVP Xmi9HWk&OMcX.q IˡTmLc:!a^C0';㉜M_AU. Ӹ1OO75iNK׽**\mNxgmLnJkYq57xښ۩inK ݇oѹ&ݗtﳿ7+!4?4 Zi݇nO=۱VTbTI=imAա_N~f8$I$I$IJn88,}f kDZ38}~"1y32)1F7H/'1P<3(4(#r5&dƴo8{ӾN$)'m֦}(Hf`vڟSy;+(K$+OL{nfdy/$oOW}h`_H6踝זw ESVHoOcWa ۖ٭ WM׬Gw]02/E5ϬAPa, X\Hd,ܟ)D\!HT[N$&? <.+vӉ™~@D"q2xZ(zkdFSLm~?m(B;W]\D$Nb  N/n!:M{ p'pX tg`B)\8P{6p:^}5Q8 ^zQ.% &wta^ƤY^Wwug4_98(v>R)| (:]th18bQT}]3&sg~=Qhpo-}ulJ{a2(mywar*4Oy"ݟX,iOFSK}nugпP,5(趲(b\F5TnO?㢴_EtQ7x3tla.S41l>c | '݈TJ@B(:V QDAiUظ#?E (um\tWC68/^C^Qt`ǧqt/:+G Uv,XH%I* /.jEO1ޒ&:4Ñ`Q$I$I$) '/#V?HxB"" Z4HN}?х^V' .  wxԠyJ89jx{a/Ob1SU~}!bAz@ ]M>`? \*ǤqJi,l ^F$]ǮՀ]N!UKE 6秹uiZ_]:?[=JmJ{;iй}Zi4,$͂*IX>T3$I$I$I8@JT`|,DRs:jl'Z̨c7L#L괿U6x#Q@4>4SSҐXum3($^1ȥcDL ^N9f </{p:'cGׁ~Ƶu~Ii;X^iNKLΰH44 $ՒJYgQi'|Wi$I$I$IĪE$rOo |}4Q\R#?T !9(D2Y9 xQ847-DՒt͛$IgAZ MVCo>`8$I$I$I. ""Q*GB$&$hO`]b1H4=EtuWR) Cx9D9kd]}4w"ùj͎kFߒƲb1$IĂ*If7p> 8C!I$I$I\Dt[?E$.iDGV7FD1]!Q+|xQKmU sOF|.Q,r35MKbIt,Tkv7"k $I$I$I;:|HcDDuD# GMC$XE9Go!Npʵ"<@YN".ѱGigQӚ£jnbA I4 TI5==fCنB$I$I$)wtX""W{k^EUuq:QL7RG\Y QT' G]j^LtzVC?IDWW`PK G{A:j!m ^୘'IR&,TkJ\' I$I$IL@ΈW ѽT׊ӑt0uâ*ԥx-vQZ7oIC;(yQisB GMk"^-ͽ^]$IʌUjnW!3Ӎ-%I$I$IR]k,$n4W*77`ױC1HDs.k(*Fh|C1#aWVtA,ɸy>*7ȵH/ :U5K$ehIhQPg(2!;x$I$I$Is.b%{ _ DrO1/ۯ6!> I{G牆nKUu0{j$bX隱PM>jE*$IN$բ1`9pdbxpH$I$Iz9ks+B7kOPKӿ؉y`[*ӛ,G~ƤO4=:yP/M^d[>[ӟT`<0 PƟ("ivwmYU} tjHv1ݜDragK;:w-]C4/> tUѿ}@Ap(R1Du;07}#/(a?~U ֧_wu++(@ٜBQʎt^ܢAqtq=D_qJ4 4. g ە~]ư>`m:ҘTÚ]AUkÚiƯ%> M~t6u[w N.1Pl1ºiO.ÿp \%nLԎrA0P,1 AcB>(+eD. "px/UMhsWkkJui>4Gɧmй;q>w;3U;=j1ӹ~08ȧel'mtϚOkJ1gK΋Zˀ; $I$I$IHyzwEHˈ$-鳋Hf,b '&mD"I}DD[ #N6U|H(('?C$ e ɦ$kDnT1PZH$*Q7?3$iI|6t'ϧ4 GonTG8Q@:뉢Du|Oo!6C*MYi \F$,[+~Vy&B#'cpu:tQ3[b4ukIWo"J:u +XL<;唦;Ǒ;:ZdI"~m ET;ӱ;31ºIi/Χ#; x}ӶV~8`~3Uek50>ϧkXl&}X'݄Jh2c-Dz7p%QH==yuya{qpٙq©8t-]h,Q6NVMY#dwUҜ:7Dt?ǧhK HDII]]ݕn F`: xHm" N,xn \BPC("4M txJN-iܸ>QHw!jo~6E! ]S][*i " 3'@ưsRȏ<Ϟ4< <,OM܉o>q(F.h t'W/9-Dұ_e6fTv :=BbpՕ[牤>(e/$ mJ44U4Wν Jo?sՒw-]R7=]ix<ogy%#KtV9~.}T]|LG]G}-g`щ]zPh=(h:>Z$)TIUy GfڈjCpI$I$IT;:[ եQr3QH*1O$n : \|H^\BU[zM$Xb : M[|:ދaz#ۥjQw (|5QXLM ?T|i̹.M$Ir8wq:o#v2tbsM)tuC +Jo$8 $ղj(Te'Gl&A6C"I$I$IjԅDv{*k-nBMDꯈwkol(]i_?EѵJ$֪\GDgcn>e1cؓDNYk# [$CL`N}emcI14[%:(bQCt=n:6VEX3 B='|!:kޗbx,Z{WE{i@'TҍaJr%M!I$I$IjM{GDQQ1 & Wd.A{5 >Gv0do]>Wq4p[P:WI/)Bd3I;}(<ۻ.U|^t.# +H#Da!rc$ +diE>O_,/1Q(Yw/#y'>vcSߥEU*aD"~’j0~i`1`YD5gϦ=88=$>E7$VRAY5lQ{|x-uCnYsC4ERYUTDCMTϬԕT+_)[ I$I$ITc&o""D AOq' Jpw`unH15g/2o" gؚƱOS"Εpd"~k\T^wLjºbu9)U8ܖ='NjXX!?L"m=iSIdAXNٛHx$I$I$I uXD!CT~WUY8< |j=(+֘ы Jq:N 9㶋TU?6ʗϔYDJ:.^Dr?dV6 |U5k;ԖݏzYIi2B~3S"l{K:_LJ$,TzG{ Erઁ$I$I$6ӋUQLE.¶s ETΪj="-iO0Q[ Y%V}x0'Bk8nZkg|n"ͯuQHۿ(\1]˾Dq O!̵-=D=E9#19@Sp$iFy Ga|k:'xH44 $Ջ-T~=9#C!I$I$IB [j$Ny6zvp4XV{Y3Gk;I/>cS;:'b.A`el&:)ڡ:~AӉrSZȾ|7puՊ;]otMw/Q=a9hSp~_<9$UE_9PXنB$I$I(&{,IHRzE{5w3Db +G$?6' \y2n+p "ow*0Vn"31me dݻӸDXڈfe0.mNKr<\LxwN%I0&ےTO7Sfd9$I$It '>H` F2ѿ x,&VeMJòf6Ë*fcDنW%Fm"4-ӹD# xViXjӽsK۽XV=<\u6wաYAsn)LxwCEJR= EQl($I$I$ ON` i7DJp`پ?_\OVժebYٓβ$kf\ëCdYLJtkx:,q1KȾKpmVbm wg)r-p&pVo.Yi&:TP^3>׼W>n3GfxUcx3m61V-d_,46K""ei9(.@xg]•`cZ<y+OSۋ{HBJ7=ă[ E A$I$I> #J"6gX$Y3ѡ*Ĺn"m}n7p!vFWٯgXV">KmNm[>7M` KsRw<)8_%YZ+m~$p0_tIqj{qI2cAz0]8x$I$IbM$i 6qn pWD&Od\U=۬7աHBߚ6. ِ6\VjْeP5(rGtnZWj-U{d"ܣIT,T~=W; $I$ITwfggTicad ]]Lt2Yo QYVd[*_x*m/3f+0컈xyJǥX)gY;_O$oAY?8ʭ+7m*+'+DQLëaYolcS)m)i^ >lMތ; ,m7ʕCQleAպtCDz[ۖB8#C!I$I$մ"!\YR%[sȾY`Kİ(pmgEd[|L$giQ [1BcRM6Pc@&a(6`=&{Z`qXʲ*j$Id$թnN>dQtcW_7$I$IR9JbxbvIt Djk,~VKՋϛgQ$;TM%NgE $I&WtT7%3xp$I$IjƑO_b*IգHRN`%՟7\DjL!BI#?7mF`J{GgJ*]inVJs9J9}4 429?y.lKT,T϶[ Eɮ9IC$I$Ij>\3K>DjSM$Q7}`,w4|y ٘WR x #a*i&̳ڹ^[Gsgi\JOΡtZIς*IPX $I$IT&&:R}$U`&&ꩠje6b O Y(Rg(̷<`RQJ=%drQ' $I$ITVT/Nfb"VHRr$\5֞Avgy;iډz c0/Nq>xH,<]OvkV2i=X0!jjg|LnZ$iqA[ q:=C I$I$I5 xpRI/O}\ݹZbf"YtQL@gpp?Bi~0CɹYvǰk{49d2x ƿC&KfDHl<1:K=SO||[o4D=8ߛ P;5'Sϯ5/˂kI4 $ vU c8Jjc?I$I$d&/^A$HF;+e%P'3Df\ ځp$S]A$= $io{_1e1x3M!I$I$++! $TΟ!S<S%UEi Otӳ;$Ն1iBDN9Ò$I89ݑƂrZ)pH$I$IvPH$eg,Q#L)z.T3{IRmh" f_\LR3,$ID@!$I> $ih}5@(6$I$Ic JWN L$8G0ER9t&I$ˈn$I! $i6?$Vh3ex$I$IR)R] \LĎTږ/0pTeh6F\y@C$XP%I|Xb8ʪXmωB $I$I@#Y(:He!$u\.>BSW!ڜ |1L>g-qޢYIQYlإZ ӆD$I$I5H|IؑJTʓz&7TW1.?x}0% K:4K,PcX(mJRmv* f4Ҷ\FEI4TIҁw~XCfH$I$ITC*! KHρ (o>Ewwö{[ӿ e* ;À`T5Nz8#}ES=ưF t/T$VJӁw/TAv'Ϧ7UudFx\@$UtpcAUS!$I$I84bu˰#$I]}DaU 'n M+Y` 0(Nޓ Drj/ł*ZIc+0Ocj4g Nc4f5 dۡ/}OUTI*B_cK}>c QHcHϠ1,?h+ARMe%~e,B."o8 %CnsQ+I4jI:,x u!I$I*2XEJbj,+I?J(|;[lj1Z r@#yKHw#}z D7n*$2߉n2Bxb #ĢJ_MQLUJ}sJ$74D"F{$F+p)p ][i {WcUHC[Cm! RcB?DaRU{(Qi7ʑUwjW 4+!DW DGBI`A$ ngD Gh'XO$I$I s%IRAtzPTBg3Mt]$Շvb"m#i [TR-ؚOq)8OC/EcTIT,yX}\k$I$IT.ˁgɎڗdQ<^`TsS4 9`jFc:L"Smo>MtZe%IRA$nMJOcGJ$I$Iw&rp0.IQkN!e6 f{+^ppBưmgT[ TyeCiAU88 hx=D!ՆY$͵$i *|ъ3x|`H$I$ITWW١$InQ=lD1ToX$SӞưowm"b*Ⱦ "Iա<5Q0$i|'I#p vDWTl7$$I$I*2:RL8N$){Uv|R%Ղs}TGn y42i^Ԗ=htJ4|TIҡx)pHsO7Ģ*I$I$\ c0 _Y!Ky"QQ 8vn!#Z9W&ayC;*mD(p-!d_1fhBbA,-6޲6UYTM! ᛱJaJM>d~8+U4Wr!&.Yx +nxNԐ>.$I'ȒChw%rQo%nH$I$I4 g/ QHjX$l&Vg#ϲ0)}SU%L,א67-HtQ@t.ix&UbuSsM囒qns7p?V^`ѩ*$IdA$3%v% XT%I$I#}"I7}L8k%:M'VrĊҩV䈄,߃[ LffU-Umi%c̜{EY.xHK3d`Мv%Iin~pTۈ>e8$I$I4H"ɨHRM#dLLT oEY~` ڒ#:cd#Oc;d_e%UDG,TUDqL+85 7&7K4^8%i"T5m>tC%`!$I$IkG]b$Փ="-ߛU0YRLǓɪsebd%Otưk332/V+U\uv{T1d۝4o3eT$i,n~Lt@R ?E$I$Bt8 C*KeS+0 h$!4&d`4ŇS3fюv kZ2/۰MĹj?+ciDqk?Hrl 3NIFĂ*I*rpQrbK$I$ITDhGUc;Uѓ{ Tqs DcV]rDlQV^`-GU@Wۜ:%I $)_ރ+]X!Ӹ $I$IRCQ]K,4%Iؿl;IMךVLXTDjW5)ͥ2f/k;`fd'alOnsQVv# ,,ȾkxbI4LTIRv.0U0ċO; $I$IR8Dup 0H(p1$I@t嘑D&[Z Y zN踗Ў:3(J!9TyqsqۜL2uugbfѥJ$ %I $);}7BTG<$v$I$IfcNTSiIV}@a( t*p&0x}WȶtXZ3 6w1WmJmd_?Y/RthrFۜKTbA$IbA$ek'Cj ]?l5$$I$IUepp)pљ|{1(J*^N+O<m% $IAXP%I-;3oUEUO+ $I$IR;Hu.0$I$I% +#01]Re+F'f`<-ur'mN. o|xp хHR끍o(i7E#dYF%,E!} &ZUVQpTe/]vf{*z-8x*Go)g^y.K +XJJc eFCQr<߷wt.2$$I$I2 x?wW dIOt]i'3"I=KcW] sEۈwHTM1b y$I$I?Ӏ> 7XJIay"1$p6p!EBű)'/6:peJXM Ӏkl;oo#dnW8SuosQTQ+d90\&K D7b+1˅ oE' &Wd|x6f%Ib)I*S/?z!I$I)#lLT_$ 56X9~!.Kz_Oa󓁷/7aH\D4$d_\ ,}#FTm7̙ x Otq~jL Tu$n <\5_C>:`Kq3g\!&I>/ jErmoH$I$IR(WĊ/]\R=PJ/F,42x+BӝD']oxw^$}$js* 9`&.)I$Iju$V-XLwT'V_U/xu-]~L] /$^m˦x xlIQ]ȎQ86׺sN/¶{klO3nbbj=a`GOծX\:>^Xx YTs@#k&'d_4]Gj#$IL$IG<2zjxbOwt$I$I5=Dro!.g͆Gx$$mH,W MDG.3 yY,#eif*ñDϦ9Et'u/>wc uPwy"1TI,J~\ Lu S\VsǼ('ҧ'[ 0PH49}&~Nt+FNa-k=$Ir5!I*Ws+ GMi!Vy]K4,$I$!YJ$Oĕ%iץtv_Hx~'3~.ɷwt |x7pHX~Tl%&Zٺ /&i]Lz0(}`qdGdǰ2nCO$WVȳ8:sgb |2%ؐ=eGqU%8C<\|;/.gO¿OzIUT^ˁO pX{G?v-]a$I$IrEDR4 $i{E>}p%k"6*7*t-]uRb\4DAKI[.6+/3!IHS(@8(\o}xri:HctL }D=nOHgݺ5o\󁛁*86;J!_JRe})]a8jXbYZ $I$I*EJ7)nr$՛^we}b,F(M,˖\۱cñlql%vR,;Xò$J D`'Aw,:}g\`Ly_e9s}ϯ_h <|a}G5kU?^=:}Fj~z]XSu&6ꊅW^kax<1 [Ku}Gbэv{A],77an VM'M'40rO7 wO՘d0-:;qZgts n#@t_u#xO`Gvӱ7? 'Z=.ֻ}wLC//6rFg7WOnl1TC4+NJ7W׿Sc-Յ>c:q:=g:>6kvtk+继}?䟬>3wN SCOm->kO5'8O`0;M-w~ܾaz^p5mӹv촍ߞ`5#_7>H9֥-+1=fohx/j6㮁 ƍk :<0ιG5l4- 6]yGuUԓ_u[mv`ϳ'aG]l}O;1(sۊcq-mۦpwTcI}|v,ry&4:|{cPj3_vcuhf?1XL3z<n.o.k :̎UOOwL OǯspL2;V=az ;֞g;U~,Lr0{_Gcգ/6&8x0VCW5ƫ}tۍ.E++>~Պ iV?5FmV;;!'gڶfOc5 D̂SM1po?91 |N^ڷ0jyxXu@cZv:r@g=crT#qr?Pu{WMP9nǿ {ZnotNvvw:6=sk[k6ޣ7fæg3 >=m &paܡ8ۇlZfo4WuP4ՇWFHnAdsGfbFpt!;vp:Vr=>~ 8fۊcccMi_vCM#PUߍU_ږ._5fsx)^٘t/h RY~z{g8t65f?سʫ1@oeFCa/Tz}ݹ͍Pw=uևkꇫFw~}F`هVcRHUJo͍;cxCo6&*o. gߘ̓m1ST?^}/鍎o7f}eTÍQ tGX֛'wW]Eܳ\đϑۇbUWd}o?,v7FwJ X}vV\Ftq7VM_Tꌼ]WX毺FZonj BM)6CK9֕G5V)677Tq]}uon]$~^_Fǫl.iX}@G֨Tc]YocxhL{Y^rvϴiFx`?@;4UbcsUgU1 ( lxs˫?QDY}g1 {nkUWWF@nOT?$lͼOxW!Aj~z:oܷk1lTcPݩBӱG#T^ߜN)dž_N'g* l8W՘M'VM v?3ƯiW]qZݡ"/VGPi^otEi%LWg6p >Xif;e#{cx7:6jW5&)6nWƇPi/QJO~K{cC\]^lweuU[έit`}otvy;^yUYJmWrs# @5BwWf iLtYnնl}/NXwU?Xms`Yjuo?ymjtu<h>P]Kx|ѕTo4}юZEoտn|zpNgZ?XfRX?6&SNK*@{II֦عʫs*,T7BRc߭zvߴ? &?#nbT?a??þ<}[#``lO4:~z7&sqTQr;i}l]/U~3/oI6.'BǫV$1ne55[A7V5=Ʋz_̟ נW]ʫﮮ6VgjwcPjzP}PV]zc'ZL9vկ5B*Kխ5:Ӭ}=|}Q>6ҍm->.N?^}ѭ8]eaV]j~oi? {W<qZSM>[\/4owˊm kìkot5U}ouI_e75&Mщʬ۾F'^}3WdsGn74r$l6mFn׺\>4v:ƷdZ`5RV5k{]i޶]J>P]TL~`b\D9_U;*׮so{!ڿVcկL=ytq0Gr?0[~>,O:7zx+6(oTU?Vذpuտm.N42iZ^ј4ekfh boUl1q V7[=hW_h :i ﯮk D}x ]O-6k?83,v?9g i[X }k}1fgUU5X/T~~Gys_Ɨ-|mVߘԋ_LJlPUkRCQ]ԘјiSc0n 'BG+>z{jǵvg9,#P58*kLR96mZߕm{[&?Ppw>x=ѫ՝YGOVu~m;䋍U ʲ^hcYCo6'`Դ]o.;Ǔ#X/L gR=|]S՞n ;mw6_՘cR6P{_^G?Ҝǧץߪ~{:Gx箝k=Hͭdkkso].53Im>3`X[3hOZ3q̺U]T}MooG+ zcc2sO 1 V_MyVSG`kFuNn HFq}tׂ۫ooV`սA~OOvd{j bi;y:Zז}}l٫\a]{.%3iDkߜꊧ`M>/^Tu:htd7/Ǫm֓ӹ-v[}C?xy0oK7&ic5<֘cF㗯cON hl: `]/է]4AZطݾ\FjUW8֞_.}7W՘U~pXl7UTzMu~BT<j 4 u2n_69{/3zx1@m6`m>ؘe5/v[w6f Z|A7OaK9?Ջr#iHc0_>9P{f?Xp봞[]AT}i{F۫ot{1!a_+Wp#Lm/s7W}/|aڷ\]t/a;Kxg/$Ruqdo]תi{']5BoܑiD#,{%y״o;EOV0_:هlL_;m_u$s̞OL W]qPUW8X X'ze6;侬fkd[foo j?:%p,4=\}uF{ïl}AcZhcv4=m zFma G@ߟ%N.Id}<1]>8mAkOFi휖iݭdz_kW6~R#lpS#x0 rǯŃ{Qc״<~\im }nT%Չ.?Lթvp8v5:2m#_N'MM=_>TO˗^[>lq=u>l?Mcn=X_527\.>ipSKuk=ӶUv}L7Moq:~zh#\ufut|sٴ׼kӱXmԴyę=rzEc27Nǭ}ߴon7L!M?XՏ7Ui:t8mGҴ2:m:~d&^=\6H{pz;uZ?wMO碏8vxjŲs?8| vܘe}s[`:'/+Fǁ߾87MEQN^mo|uTـ+ N~`ttwMƠf(2\uccsrK-4Ο~to? U,UG71xt}6cL˧}]:m˟h .>yzn]<㧯u4:0Ơ[jy ~ƀuMi :i=:fZ'Ls&0=tִk\9T 3{j:yڇsz-:i:ntz-:w+^˞`~x6ok fg i?q^MoO_uUۦ}1;7h=Tۦ{CxgPѩmۊc}k4:Rcc23lcPl l`lpt4s=}0AkK-@xvLi}mK_zZj9@'[pT˃ R{aqgc`}G5p[V_Ӟi1;f +g~hyAυY:s WUѭ}*pRꫪUiNnty T_ g~:WI8@hOW*9ի5:Q::Vyxַ2-* /a7U~p]хꫫK[DuRTO6B0W%7VZ|upl.\a:}e-J"P1qZS"+*fj^_I8z{OU+A:zeDU۪~1XiJϪӫoQ3_\}]]U*rBuQUkeNhRumޢ$F5]\}SꗫUw):zm#TuRձJF'P3Yhtտަ$f[K6B~[]<–Tit>:ڬLL g[ UqxN{U>l$WVo^ޘFc9ְiCB 粷;U}plilp1%֩괞ޅF{z2 !Cv?~@I867zuc5{XjzYu^uR::]kڥ *U=N@?bÑ1ꛪ/5Un X#hLbM0Eթ1ӹzwk3uJ"PzFHh #m1s%՛?V}̴6TVltzt}Zc]z6{_kQ%Pxzt]fKuNuVT4NuGE]nNh_;TD<\S%*^Yj'@lj FZ~e as5Sotd6-[*W8 LH p^[Q|:F_:хJ {zGbt sgFGMg{T4>`P[}?$3sgVWѭ곍U7*5S^Q_$ڒdF .e֠=qh{ =BUj Yq5_)%ay\c&7ULF'+Z]4-WO7&68FGw5:rߝBW]؎ai:٭@Bu]O6f jsuWz15pm W@U[6P]V::m:2-:P:U]}ёʀc *F4:UXeaR4-U_[}_uk#TꋍIWʫϮ.^POQm7'@p8H8kt[땅 j::1+՛?ZZ}jZnnI FuTg6T[T9U>xa{KY(8Yht%au:1m sz#lڴzYu~˹ٍn[XOU~t+A*x^UfWmtRx6UN%;]>W]dEe-w:==<5d]oTTVI Pjd]u|fRj:zZUUm z1՗{ 9SULSO]mn֧{T$H/@kFU efSѽkG 0FK㶣ń};mLz+A*xX+۪k;fuA7WmӪWU{!{\}ڡt/Յeɍic3)Vν7#H dѡ^}!5Wms]v7VM՗3e\=tXFxFpFxFxjS#@57-lV}zZL *֢ǫ7BUSh˦F7cT6UVLw[ᩋ !YӪRNmJ)jO[A[,( |UUV 3뚰1xx[c,`FjkIR5T5SVW'N ,8+=R}ёws'CD lR],p\}QL@Rc_n~Y恵gn:n=~ZN.jtkGօMqEYٍԬ эSG'8TN귫k``=>U=X^de5o6i918ꫪ}ϴ5-U_iFg 3]N-SSp8[^K n_uK-X_f]fǷ'4[_R-LZY7-WwN FhFY3!8ubMk8r~Hrg4 T,5B3_OY`[:Y]ටѥ걖VVۧ}ՍVKsz#4uQ#4uvIIձ\۔u>~t~4vT<rOum?5nl`@mK-wT6Vmnmnnv+'r~Q_nxKoO];}J@,[}W_ޠ,!ǦiY9bcVծrO#xk3`\mNN˳mk90ulm90%,CկVltzA؄T-5 ?_}U}FwVftTfuw#do{̚oH8טt -6\r?,*41Q(R#X{ܳxcCՃ-mtzzz*3ӱ-w:|:IjkutytFj-Ӿxv{eJg)8tTl>Ft<@<ǫj l?U+ F?piYii,hrt}1jt}G#pxcON:] PqթSAM}'6BT6SUM3]nj,,utߦg=nTomLOig"Pfu՟~܊g \rjڷbٻrg#T5 V:[=:~lZvi>۪3cݣ4QgOmYYǨYWM+.7r_ {OT~iW7*y TUW(RcWF#TuM ֻY`:xd==lbܸzzj+kZo0sz<~rFiq1'UgLOhf!skCRszzX[W>T}эjtp@=[U~nxAZ\-N[_w7:^ͷjwk {zb#ez8ULc'5PK~-wR^mnrZEK HT}ՍIt^*x毺bzdWDxv+偑K-fg{{]A+H#`=dkLsut Oy9-w;:sz~M_;uzl:Kmnon;}mM[y}YsW{(S`+nꛫ>SSbeǙMYkg_Zmj |bV=ⱏ7BZ[c;}FFǫۦ2=FP My3Ei>:n5=m.ut{S-5:FͺLQD=}L ^[գ[MǪ 3 llnwWFHFdWcv걖[k uy},xg=cWw8[./2[Fi60 r -wI; f?ϚkNc~P+;Df_~Jc] sKK&teW5:8B _75 f-NMFaF׫V7dʯrFkgPczs۶y>￿kofS]{Cp33]VDžFFhzs]o{oVmoeFMPg0Z~эsf]dul*oG@[zSuN1? <-Yxkug95kͷ:sir\͍LGȟ1,sf=:{oz5{}`,`4*8^ykLc7GGR `u{эꗫ/T5Q6 *HClWUgTVUlhtPu_^eM 80zGWWKqCVUFSY*HhVuRoT߮*:p W؟@p Tʫί~_7KTXcvT~Xuo#HGi"PiG)۫ܘWWT+ =YXj2&T1AYUdzwF'*8wV_0_~pn2*X=V7Vzo?Z4ar_#D-NT!+5O VS`_ޡ4!x#D'jAyF Vƌп\}C՟^4A|z n T궧o6BU:AiFGU_ltȞo`[jtկV?ZYyqg-Փ Q@KՎ귪/WXO7( '7Totz {QyL ֞}=/5fV+ lh{U^}zڕkoc`Կ>P6KWWU篺bAy~/*Xۖ7Unڢ<.-T_nt@uch PRXꗫZ}/VO6&Zщ ez;URi`Y_ZF'T1]KեJڞ#ջߩhv+K'PǫTC'V'>Q=!!PR5_}O6U:Gyxl#DFj>!*CJ 6`Yꗫ\}su!xRoML ఙ[ZZR`^yu`zGuAXu[F-w?x+TP׾C~TeQU][}`H ռYUB`cpu7Wz[uy\;էV*`fǪoH$Yjt|'ZDgz @TU}[ lbF7O6:Q횿=+ʫU `R`V_`F5՗]_uNTkҒyʫcsoP 6`Yj^eXtʎU?U[X5LQՓխgn_u>eXb՛﫾:UX#a>Y}^7BT T/RhVDBG>Q}rpc=UW:&PTU~շUg8{HFw!l8B#XFVS"ǪUhv7&`}Վ﫾zmU|{GVKTEeCg1#5յV1JK0L@+jI؟@p-VOVW?X-՟XmS"У=>Rrj|e٘9:KՇVZT&^*p[j z^J[NU`˫a=QݘsNT_lt?uZR&^,*HWh>]wUS"uoRFjocR"PcgZ}[#X %XWlkLꡖCT P&Au5f&Z]Z)<{~:´7:ﭖ CM X]]/VPG+^]PBu[#Y]U}}k[K-JcTwVTMFMJO4P- @,V~zU5:XL:tsouc}BTl@UFTvT>SV[AJZ@uSsmcվF 64*`[vUw5fnouI;7V+ =PP]_}zOS&x:*e'/5#L[WoNW&yr#D @Ti VH-7To^_T!xcFFjQ T_u՛4V+|ᩛY*xiսG3iXT<LR^:]qBTp T#G [j |zOunmWNP.X6^4TYQ=O-*U,\DuccT7U_\DUkOPukFeG`8|fGGkw7U\zYuzIyсFxF7=1,@\vTK,T_~:zys[I ==͍՝սΖST TypÍWTV7U_S:Z%ktщFxꑖTK P"P,UǪ:?W]ZqZ^W]\mQ2x^1ݍI vZR2XVg W}:zeeNV۔ Zmniniv'@@0 W=xubuQ5U7BV*|u[u{#@u[uk#@@crja:^T2֞`Чy뫯^]@XGlt}jgST}ծiyrUUPڢd .6S7UVOL q֗j_c`{SW4Vzc6%`yxq]NT6:.x֯@ӝrOiy}"%04uC m.TL6& XL) 8fQi N::zekפ{׭==XV]\UձpЏ{]n.j_]q`ZhitvUu E`5[jtZW=U=\Z}RuFs˪ WVUsJ27BS7LSO=rhjwu `-YYw\[SR]\F'WT'*!pkni7SOW=Mit8 XZPPcGݫ.^qyYuiu/XFw;AɮFpj}S)#D fqZUգ̟T[]ntkxT66SL?4-;ASN"Ul{w4C_bu\uz#d5fuQJ#M]-#jmJp ` `#Z=Du\ul::zYkSִFGW,UO,8{X`jtx}jS,dur!KW7:YnhtyFxjgKT ^l ƞZY[?-7X`zph=ZYNY3-;A'Fǩ}AT L!!w!]..^U:U)4u{ˁ%vM]N)#PllcWot:-wztyaub#t_u_i1]fݦ8 Uph-U{e[O7VF%VWV۪M :A=1]uFǽ-L%#c5-3V[NjfA  !J *005PSwNm9(r)8$`XYSX}`:?zqjpTUW,6B+.zGj~t1VWۦSAgMj6[sXVw6¡ n/N;>ma2 Պۋ GҒ*+]4-ՖFF׫WgN][_>}Ω:I+wWMFF1 ԣ],rPje@ʛ+KW]Cݿ4]`c=cw/쪞iw% @ԊFMӶ; A͞?{Wn @@&lzTbH1w5YzzthʹKtBp_qqK94 ykֽrhQjRXY.0!p5^)ܓP 0*^PuA}Z>o֊آ.:Y= 4@S6sbųQ"[[N`:3R!Ɛ\ mÁw[s(슨 1R }@)^Ǐ h2/z1}1z m J(`Ve0/!M _e zcʕeȠi1 Cv8[#W,1t*$[Mp{4H.4J$~_OAm5E_,RYlu#חn+ 4*ey0^oWc8*xn@Ta4asl ]:AU 5 kdLlKlJ#kO'@^A3l5Y^4Y)ġdthf- P+^^y/ 0!h пtA11|Jf1`S٭&Ѐ.c %l"ެ;O[/B*:u0f NW/CϏ!뉱*s^mjWqni͇ka\ mslNk;FOʿVVy 1<&ߜ}^3J 25X&ktU<檲})Ѐ #0k<)4Plj܄zbZלy C[MOe%NAF C5)A l{k*U)BPu4]wkUs.4 -BkpY5 0 Ky/P59Ϋy+4NnҺq^ʞj3Ȕns{\OCsk 5 2Zy^MoM#40 ZVB醔a\ka 5/X .Si Ű9_ xX?.u,|nH{} | A db"M= lu?LfQG:40Iք% 7^G]Wrl'40uLy y5}CL 0o@m™r lҼHQ&&2l]W>6|}}4w(0\l%0 0> + i[{ock{ ^MX[ 9cvwOBZώ*CMY5?O1rAf1񦬂@):o␣ /T!<fnWyجV&؁j3/I8ݑXu̮-RKOIۖy7b 4NX,&`~ -|)ccݠ5 ۓxC?Fa 4xyUsq8漂P>h.r&pO9)cNC aeSjޥvDɲ[La޴KAfHBMzV#z&ÂL95؃jJ[jd!vP7g =hA[zY 5H1h s8BMϨ9kC͡@ 0PAby5V=v?]TJ@m\Cܬ #inzVIhd5q>IX4 5Rj{d92m:(NS+%~? m 4WYo u3v1 2F)pӛ)VCK9oGm{i@J\l^=4W{Uf?F #ΥYͣ6{^=4P6\o6{^w\6*f{6"=$T»uU6K#@b)fy}} Z.V9SzIOoۊ3/E_Qæc~˂?۷CM[[|>@)5s4],8iyz|\tVСΖm`!(O[}j_}f cZ[,aC @s=4ەiU+|{K ,qT7L9Nπ؈a^,_>m]&\ :e>=tܔ[~iǟeiO/C(=Şey\}304$siiq 9I4.`S\ @lC/6^*VW]kz gZsXY6ù++#%x| B%s4}|^bnחs1,l>!gT$P3ӟt*e_VhYzeyWɭRUA}@B3h{rGx_~{ 4?N迼dW}mIei~M~˰,ߚ}h(J%izվU=eun[@]~x,g0*0;HCv!{rvh(MgHzź쳗K@sI+tW(d4#=`1ίY39w-q /@dZ<_~pZP]{G\s|Ƹ"ۋc {Xj[ jg+%-h(Fo'}ނC2.CsU  ŊsboA~|˿=({Y`$>~@@iVw{927Gq{k:xJsyGx[=?\8 ;{ O|_l{m۷77:׷}% *e٣X@ihDf \|L[{`|-̻;ӯKsj>l~йH(wiYv.y5i2СƮ{X/b/67Q3[г7)oQ߾/|.z3C4; =!(a{LllYR>WJ[T'Ṗ)tokKssa 3 { +RV;h[_,/1?]3.1~^~ZOu]j_5)Ԝ޳ m3|fK\$-nPB{<f O/헿) G5Pw7u/4ˎR3sef .XmDa&l1jN6V\8qܤ`:-_C1bG៽1f. /yKsX?ܜ`~BE֊?7鵸^:XVl΁Ɛ3aPs6ϪY?~푉0 aya=4ㅙe[ ߐA&nM|-n|U 2`Ua̍@9Suϐ3a1lוawʩ0@ ;=ƐL 2K%␻m>?f_ 40nhWhQanUBN4 M3oWhaU6nK94 3BsHFP~|n_̷19?r605h桄#3pV:Ya4a\)0?@s9ǿfK!zff0sPJ=̪ 3JO=|q/24C&~|ԩoa&yfJ Uws]fb@".|@̹@u 3ˁ~@* j'>w@3DY5=92Фg|WX fhҊfgӋ6̼s~g8`2]/t/^OxrsﮌXVޱgf1xi ^R@y}-\pNaR*eny樘y3mY4as7.w9ĂʭdǴ돉̋, {#oLE 8nq|jؿ +be8 YJq+6pS& UG>D 0 S*F6n <Jo,xҧ26 v;.V./zt| xgw5F+Tb!qo{n>= <V98p%o /[zcVn`@!i_t[+Y<=kGbThb}0d~Yf ]1} >&ln\6?q뎂jM5X7 Jl,ח8<PCC?˙ׂ 0@Ξ k 5-fʧ Wڂ}?RqN 4e\S+-AQS 6⠀ؑ soCK^ ;?3 YecOPd WLaEytN&vM7@/5hr;SoSoqv&zk``u 4i(f 5:,fBQ00\6#j'skM)CΆ;TP_ueCgiv)d;ls?;t<T̼&nŹ2^!,f*f~&z=9MZWsuV0oWTĒͻL(:h:%8zK=5 |V0K6=5B |;'rh{hF9'l5L')3B `ŷ 40DUf0+g?zCŪZiYd̓ 3̘%J9MI?Mz=M ӊ=px N? @&6үw3fa&^jNkb*~I {KӖPCJ@[jr8Hg ڃ υ}{Y1g>ܔEz![ //4fѣ2+HjuFʀ{[013W 1G R7k_z7/lsmF/ ZN(X 蝁+簇;3Yؓ{gJF}ԞscKOiJd5;JTp4izg `sM<;*r uaeX؞n !ЌuD lbc縰(w$,h_jJS8^sQEIw>c6Ԝzj(w&^~nϧwqbyAeK|嚯551ǧqC֡446gޙf.3?c#8SSdž~Ф&Ό ȩSI72|#]j^ߐdFqK7h*6MX0sUع7Ԕݥ a~բkR=4#_(.kyćBS[ 31 ,u~hwx}[SrR(`SKkZdU.̛#jYfd>Vp)P\gU++)Rm7h^뮩zh)sc7U+1WrgqIU,K{'rFQL@8* T\wGySЌ;cf(~~]PJUpw@3A;[}D.!!ޙ!:׺ɒfU/t:_2ma@(Z9,t0i`2=AnXC3s;[}8Q׶4" 3qY3m2R9ءsCrF׶܇=s0YSv>fiZd}s}|.Ldw&vS[ m~}N׶Uwܙ1zh#E`x97PsJ>ߤ).h2FwE۶3?u08ޙ8@5lF,+Ϟ`Un3a:jY=4j7N/gOr #z]v2}@3R͑EÇ  }- cmf0z|ʺa:n  C8gmd@3p3sg"m[x7\ |m: f"dk{)[Q X7?~P=4\`WFs;C*y٪m 4ig 7`W l:}B۞>-<0:r~ NpVMjѳ̷O Cx\.#ąK4]j @ōE03/39Ia_i(oޙ LdaC)}Yf_@aL3*}$3{ 4ivY( ̔[f_vfA=l*cL;@i@a 5L˟igLYr*Py|-Lf»rP뷡UL 4P")v3Ph5u>Ly[yFP&?yi&J0 u,QRrڠL2͟0g}ܦ~<6LTUN]\pG#>VXy߁f1EA:=<ĕ>:V4QO`p ̌*.崏,&QEk2[`_ل 9z[Ys~di=4` u\lY:o߫7Ɏ; ̟q` |<}#wM@GCh?c3]a梄 -fufK]b}Be ܪfvySΘ +]i?,@mx>S 1m}sRF2p}28 //]s.Liv9"jCI8@X\]d:UjQ\_1L 1Vf֡Сf;wx}9`0{I %-\t):3 3y3 4?Poo۷|;ეC#0Ug d/_a 4 3>K7ða&4C^ik@N5v f^e{^'[lj5u`a}q hUVW { 2qLy=Eh<*_k~`/a&sf7 .zWJg0 a427?6 +Ԭhvd1֡Eh̡fW 3q/a~byY{))ИCڋ:Fn 3 @Jy>WO(gjzy=53 \FhQ v6P~ӰP23SE s jZ( 1Ke^ { <&Шrx%i sIɒ>þ&jV6Nrx¶Թ  =>b=>SD_ZCE$Ju܆wAF{a[>* }vZB#>8, b7!9Nu @uV7 zpO5شu~xr 5E5J T*>Oq?fC +4TL2`et,~+6&팁$ؼn?Ol }׃ 16*"d{j(\qaF@,JpW|P_^gu* U *}{DõP#K/ Z,08AE475]I25J1\>$褡lG_O{CJ58 gU@CM~(}GJcqOƣێ S=Ԭ~3;*eQƮڻTwE0Z\iX",3d[ܼ_cYf&zhTb˰CM Ww9xs%KWx@sA+ƕ*xub?fFE~b[L&5( a.I1U 5ՈaetP|48 49\vנJb-5Pc"c±6v9H"@.ԱTӨJ\e!{C^f'ͰxBzӫAa9STtze 4$]6xh=wNkTOj4zԇ 5AeZl8 4OQ{5?nI٥P38U 4e,q*Ewz@agjv.kjBڮݛU< se4 >F֫?zs\Сt,Xxn}&ziƫc0 /Ԙ1]_RK Փʏ;|~J PY%.6xy0|b}pEBlw~gw$5VO4Vua1ܼLۺc8h24qPO%xu#ظ@=eKf?hСY!4V~MHO2]Wcܱ1?l%HtgW o1؜Ekzds"5,z,*8]TsX,'{wQuܨptc0c/n߇t 4񿌶}ai+j~聪x25C:׏zus7ױI/ihoR],s#)~U 1+!&o SǶ|AO2$ܸ{tOCyN H fW-ࡼagq-fR?]aj AMl\=NOJ(~]xr 4 ڧfTC_]]h/^9݂N|B< Y< nM @)5t9<͓~:l-]_}_Fhjgxѭv4qBҮ^i:] CKs{g!V~ C0Pr 5Ar 4#|3Yfo:8ߥ/~K<$C8,ʡ{s&CuM 3KYe,2Gx&4󽶋@Ksj7@v~M'&ߌ?c@F{M/Ġpq4P'{9g9si\d9c/2CiΟ[}~y}ME壗*@ϻMކE ;364s|lOKvxP?ȴ/4h߁C!{O(` sؾ/?#%B >`s]g?'C`0sھi KA&y_goN̋4:D@sQe^L'} /@omUPz ,CAed͓@sppp6{)7v2%SWI +!poYod ݧ@󾰲'GA&\4JMZࢰ8Jde_fh4K0בav`վ ,8I 2`f΁&yS`4<d`恦%j" 34B" Mx쥉Q 10rzm3 dhvWr/MtV/2@A{ @ ziPc9gsx#4JJsji @o5@AI :Y@@4B SYRAX%4B 0uXT"A{"<$ qƻMe.N!0 oGڶs{;Ʉ2S cކͰD>дu5bo̫$R&ФUZα`VA&.'7xv h8f]iYJ hPws4it+: Bo 4]Yzu^'jXlT`*g7*Џ5zޖC1ǕJdgV9{V$1g4ȾM1g I6gC RMwrCCnT&>p6_{ph$nHo3jL3wnO Lǩ?*ho JYW);f4adfṶY8D`u^L!&ϊfPs޾l4a N5s@%CӫS3.ṷY9d`6D͋iH̡{V[j5VRHӾ^Ņbo[a|eyA.Ԝ<6,=F% #3 ,ΧY؅_ݛ4$fbfN̯K̡{lM쩈wc뼢{B  4OJGe"7u<Bd^e|+a6<Xb/L7J޶SlOJp69"lVC;K]sEa70<8Cӫ fYc){߾Y8Lqty=cm~:bFl14 Mlh~ Ю44,mI)05P2f`sÍU044{/&lVJqwby#a 0PF WN'fJ& ]O_5F{\\"ڲ[`Ӿ.̳UcIsagE5*f=5c @`^~==u@# ^}h EPuqq#Vpv&3l׹,\Ƶ1\M @#dM }9W4BMI61\*QmM0Af&o+8$4Acz`dhhQz AF8w"X|g!dWpg!$Lp jƚPD#@#o^Y+͢`{Td@W@sPe 8VKj47B Ȁ@3t!HƄšhqh`hZ)W^A) =& 6M[y0bL^Bk,M=i]s 8c#*s6CJ b^Y+`:?lG74(W[XqgwM/IM0ly\߷w"̯p`^Mep*rM} .]B03`2̫ez@-t *MzuMbم@_q+%Qm߅K!v̏Ah)lϫ_+"Q.,·ac]] /14͖ۏ^4ɉ֛ -]PyիpYv\Q 4iZIЅ^йң:뼖(^]h^][nڕ^* .n$.|nX@3ԅ=Ϋy4!_?Fa%.{=,0VR4;‚ xg6vp%]P {ȩ7Flg4),#sz;=5-%zZ]sc>xv @Nϫy$۪}BhͰq? 'Pgln M; zk(_ǧ-rp^{ðpC^`΃1 ۠sLlbo̅hJIVBv@4 uEփ#/ 48ӟ-4@#Poy2]cyhh`Yk`޺^n:D -44}()*|ubn[&5@"mR7{r Ur{\v. @ƍ:>C>L @U;E 6]ћÄ~o+f40@sGCn~t "4 tW VZ~pG/d k&@vnS؉ {\BJ, @͸.tһl &70@Wlm..zYy{!f4 H[/<я#NP^XYwWso@ Ѐ@m ~ ۞0{Ez>={y  @ 7 q`MZo|Ͽ /@@E4 @4 @  @  @/-l k3[IENDB`nz8'-[eCWPNG  IHDRiG*_sRGB pHYsjIDATx^=պ҆/0 hzdÉ̀ jւ1@F3 Cq]_YmzJwʻ/? -lOs@? @ C>b1@ C>b1@ C>b1@ C>H%p…TOQh`MD;6\ s$\wDJ0 (0(;T#Z/&t99G;rP<$9A;)jd2B2! aUZlώ4C;2Ќc\cBR:B;* V6W I7 (HHiXnKK7(rQ~yXlA-;u=2뮤[h"u G (64+Jj9pjhv 3S(8:1Gk(3.ټ:ƍwYd jЎ2ⰦgflvIޭpعT"v$>͞/>{ڵk{"?6.yGiOJ@}_|)o޾}kϟ?{NJ˒qhJ%`;2.]d?>|ŋhD& !v жǏq9LYh,"$*y8^~C'W zKgҡi!vsIdub.PTB:"O>u ,3+?-A;ZK#n߾-pO>YU㇝]_0Mk vb|,W^u9!zin]/f8ڑ!X ="KmLnݺeG:zWUX=$'J+&%*yh{)P4tGTWZJE;JHNp"Psq$bϒhq'(p%KGgg1ЎbB#ǨcDx7hn7 ҁЎjm_c_ϵ~˙UrnEQBC; P6#[W3wVC[0FԵ_hGad3{#XmvhGv,-!ݨfr+^-$!M̡`.{({iLyv̞?BqOh(nhv%C'"HF%K M#S:<:|!D0k 8L(םH?7@, ~юed q`.I_#v hG 5@hk!vP v hG 5@hk!vP v hG 5@hk!vP v hG 5@hk!vP v hG 5@hk!vP v hG 5@hk!vP v hG 5@hk!vP v hG 5;^z5ۋ@;* VM~Eq~~~޽,B\Pp7I@w*\k6ׯb yG9cEnC/޸qCԒNKe@ 7-tVٙD?]߱q.kY ٳ(wPÄog/VWюF4C×Y'(;i*jb?utj2,|an4߃"86zG-[Õ9ׯqV:;,{\Xow6Yڍ=3@ #}!.3s@;R@;ڍ=3@ #}!.3s@;R@;ڍ=3@ #}!.3s@;R@;ڍ=3@ #}!.3swkO"4,; 4ӄ@fhGf#hgĚB '#'leqhGg'vijgiHSKh*LPbM@; eò""ME P< FY;cE vS#؎u1#{ń"ّjMZ4k;<{f^.س$#$v4v& dhG2B @IhGagH&v$#$v4v& dhG2B @IhGagH&v$#$v4v& dhG2B @IhGagH&v$#$v4v& dhG2B @IhGagH&v$#,ހF\|Ç^ɓ5s Fq[}o_z-]&vMxcb߿:ѡ{[wׯ_zvo߾38xWE5#fżc_'p08]ݖׯ_oDw1p,'!v,{ mwew'=Kgۢcb?Ec gڏРr^ű?|qѷ&vGfpE0f,s+4Yt,s7k`'Z1%sgw~v(pL ,5qڡƦvJ4h㔮SRqю,&{ ўaQ5_@mm}D*v)t4mn@!f ߀fqT`J;t\'5GZ.%V0Uߚ3f06:;OQxgžoyH;\rR%#J^Vf&'Aw;t,ƠK{U$ARNtJV^[{(B;:;[Z\{jr=KiA#Nx E P8%J#v@Ў:℗(QZDu@;^B4hGiA#Nx E P8%J#v@Ў:℗(QZDu@;^B4hGiA#Nx 7KH?|9NPM^5EkWSn\74#D9g!J>-pdħ)4:e)cc9ӝvj#Xڱ2&B>V[2 n`x>ڑn 뮛+@]ӜؼF;pJSa< UhG4:1n- XlN5hrG4U;M2HY4Bi6hCkA4tq(#{p F죨Ŋv N[C)a gjKcU S]@; A Xlh*X5F>"v±ٿhtY:Y0FA8"!rtG;rPpDav"Ȃ1-C#DB;3Kp$#ЎcpATm2G8Í|v2ڱpcmڄ}hFm@#p(h > pc]ۺ|G#`G;V>eEs9B ǫW>|ɘq6\apvt۬MBnܸ1k'A||hB#//Π:Ν;FNNN1% 'KbY.inK .UׯщbKA61dFg^k;8g6p |vv4ݻih,?yQ;fpm}cĶ30#n(eɼQIټ8?r>/ֶOu=))6ڶ붗щKuEջ,7#XĔ[簿QJ6|E9?;g))G|ǝ}&w/w&X3g8gF~Y=ɋn,FtGGs1o Erbq[ӿ"  |m]()[Ҝ϶R3ޑE9=k εQu*zi ?;l c?*YFcD8cE`s]L1\HG·Lp6o9be^UtQv-ι*~3W 1SzK EiE`LjfKcN׷, @7uHu>qgɠ ln恝=Ki-o^1ЎԸ JpG"x# ‘oGJЎxzGEX XGxЎpVV6E>cvB8BAѮhGPy(H=B"vSB81Rc %|L혹1H:U_F>&Ks-BcsZE.V.@kzG "B:eIw;s۽Y<bpKWwD ܙ_ Gk*_ xr{8n Ў\Q(_;\q:ϟs0;W\ nsy8e ź "XLd=A;ry;h<jǎz1Fn=A;VkVhG?mN56N1‘:ɕS[_v/}DȵZf! MD6 w,%ߞ#=;!QA;rgA£H*%yG*jVNP\;$Дp,J@Ўcxf@kaQ{}hG5hS88gJZ@@;җFhd!PFc ڑ3@@IR4IafPLJd_;%˧fXՍg?^} ^i =K\|BrQȦٰ(w 8;7oNos.Rm:K:)pщ̥j"Z?BҷN@C," }ǥKfǏDB]JҎYͳDvv駽ԹRK۳- ]lT/]1s1e1S&?{[Ν;+GhQ`}z@A?p|왴ѣGwdSװj lˮTwYs4k:w?ڹ~uѕAR{BNK22vG_"EPSJlb'Vi^ږ['6l*&:\XaËݜz E5s_ne_f1:K7/]웲ކqS7^,a1."ʊ#D[klp:e`%>111ʔ۷*^ЉkիWu/7XVڸs5x]щ2O>Fd]KgÏNRWΞӽs+Y_/0ǝ'L?~FmvCz,O4/?(at ˛:YAjo:'In\q;:btwE2sWY>u{ˎ2uyH޼y'; nOwjlPwҙ2scb鷤wZ_/9pwe47Dsث!C>cY}OJIщnoR$5uKSG#IِjJc9=2uFa oIoȡ$L[gƃ:|!asimLMVDҕ DlSC +UUwZJ#h\'HTAgGYi3iN j!X>ܢԇu1-1 vьHt}s_RX)`f;r|J,g{˱U{*v@˿^I+RN?Fסd%ɵO:{ꗺl:H>$hXjŮslP鿴V:< ԿOl{9~/JuKTk~Z)[`-3k9+wc^h}j1eb3nB{W]IMcp`uhk80 YJ N륚/]& 늝*VU@Kwä {qf̥ g;v}JT- ւkϱ|=xFRM$Ϟ%Hޯ3G8@ Pmiޠph;Vkt;" vY5yWه #ڑ+dkka=,v my2-h!в| qU4V"Ц|ڱҒq&$4\Akt5|&J3A?v c' KcUQ;r%p[_q"ȵ k/?uFpwl;r7gQck6wjcQ`rL.ߔю Hgh 瘛c!c7hsy;h<jvfzz%lnv"ZvRҩ/;rx;hG<{V k. ۈEw\lNv/sIXT(aɵ8r٩l+j|7l/ u!c/ u!Z^6nkٟU,kǾ>1: P>,!P"Ĩ'v#<@ЎO(Q~%@;J >A|hG1CH(1* !P"Ĩ'v#<@ЎO(Q~%@;J >A|hG1CHL>fnIENDB`nK{2̯'PNG  IHDR<9sRGB pHYsjDIDATx^]=v.57ˀ~ &59Ȱd9d,v`;FGVSnO]*Uݪy?K!ӺB "RBH!)R!D$ȀD"r@d@@DTI9 2 "eQ*2(B@DR H@ !P#޼yt@}s/ex;켮#!>U"^f /ۑHol6amG?؝4of"\ԛ}mV%:^팙HemXxnUO@cT=J%M.,T9BEl"5TDj_Uq qY:m! d-QJS(Tc1^HiZ#B@lɊYX}HpS+R˹{'-N!>r T-MK] 23eue;x@>4-.˜WAwXp+R'݉c?ƻ:Yuz: ;K%NE殔$?P H(dnnnJzjӝ|_otxjq]48U_@AK_}=Y~GP{0Q߯* / O?~裏>Ss]!qZwEO ,"{/@ SBl3`uyᄈG)ʽ51`,`!\ZO IFe dpXḾ|T1T9'-"b%eLG$kJ۞?p1as#B'].(wֈ74p%\/NuUd6vA IɀA'Ķnx^*u]Z("?kT2?sB5^~- 4(q0.#@kј6 kA F Qu!*1(ń'5UM$twR]w*<<(kDzl[8c헔hvKz:䉮1d†L 84$Xqܥ]r*L?^/mی66y {F v-&h"㸼DگVHJ^]U$ 7I]~=nz |=F1B?ƻ"cJiZK2n!>,i vٺעt9,2G7D>wY#鰢S'MnREbxzZL)~L>B\$+*Ų7GVcwR[mۊ5u)&1ښ qn$ceQ>&ܓj@y?L ϙ0y*#ҩcz N͏وѩ]gye Tcf";j)kP]W}ML;=.wt'-T| Rc"y1.Ŝ̉=f| i1 !,"VP:,Z|tM e|k$βTh"ú4+G]%R˯. :h5^H] վGyC-K"-![^FP"˰ʩH:o8:#27I{LY#5#P{E>@ D6ԖXiƴVi̸娍c̥ZdB@)R36"hH:oՌAi FE$r]Dvc'+B"iTQ̘2I{S@3 p(՜S##U3S@KIE"U21H&J+yxxHQE9a<'v=*Ѷš+G4Bq^1eo2R,#*yϛ̓|~~v[U-hҜX7)1*?yx G\HJE- "-ͳXZˢa3;)y9Ԍ9gO b9јpt%sǤ)xEٵ[^_YOl ̝юFI/܊ J,XPXƺp#f|B1* eFR6` #ϒI=H?t2 ,/pH}Ll"Yx {V[؋ <.[>k@v^mpwhZ !^/˶y/$}#=ռ#\GSO k[߸! +GM;8U47 G38W$į HzZhrH}p], vM$NdkcR}*GtB$Oqi&EqT!#B ueG+"h=Wp=|C 8m"KQ_% !dsO"\f)1B1(N~D(2ڣ<<=$ŢUHv[&UHX#yENui19Z"y JۧpN,ZŢw0Kxp"ۄEE_^^" yJ-½]7tyy9+avBDz~~'"򪅝06/o+#Xe49U#B6w۷?;Uʣ"bd/IPDlكԨvX)tiϤl^ݭJU# H$UڭK5aEd$v(Z\In?l:܏ypcCc\KlPl4b,jޮlM ndnhKy1n{ `lɱ?b#Ĭ;6bSa7c{k UqmQܸB5۾rcfs7w6&˲6lu&6#oxce0qU=.vܜ6Jၪ#C:%! "Uϴ o&=M(!___SK&HhF܀K|ͪ= }2e*RF0󫺻s+tyyn$UB% Ќk?*ZZQ@VWY ,pE )qFw:Qr\TAt0Z\ƲkiW~,AI_B(\\|NE܎屫|(D}\tay9ɓqc1Q% @{'w858-ibᮉˎqJ&R6H+^EârosS .l& .Jz=%@,Wb"]1tFvofho=ٌt 3C?۱w&Qj,ʇ~"Ǩz >D2D$G@D>D2D$G@D>D2D$G@D>D2D$G@D>D2D$G@D>D2D$G@?Z2DQ?a]2$[VEڊ tP9+ֈHPIP# "՟g[D TQU* JSDI\L! ")/@D fQu]K)J!qB@D*N4 H.U'<*2<it=㧰};@uB "RBH!)R!D$ȀD"r@d@@DTI9 2 "eQ*2(B@DR H@ ! ")@DinB'>Y(puuGX =>ݡZs򷷷"C.3F}mO0KiD-lS8i Gl8X:袥"ou%ӶU :Ţk?9!= 7ۼzH f#LS;(vqUZjsżFn aj hz K;nf(Ǻi)]M .axBCDzZ=%l3-۲?qȪ <툜v)f(f?bM6jyta¡="Ү7_u=7{VYX/a}{.H'(I'MJi4kզH5HI")c\D4zHH 5L6b`N9#Ihp]]#K;7? }d=t8GD*G@D:r #"RQO# "׎(MIENDB``!i~ .kn0}$x]}lY"?竂6D_hPD bD#KEc"QB,~!ҥv3;޳ls=_3`l<ߏ?Gsc,0| c fc,c}XT;zc ς.O8L]cdg3Žx (hPƲSWKgt<؁ں:h>ҋ:̺ ;yLpute4O>'9|"~U >mzx!ّ&VSCG h4ٲ[XQq3[]oBkjn.@lkjkZYIi++zc|e,O|1" uxn@zo{ F|}7O"KoS)?⪇VώG%Y"Kot˂%A]}Ml uË/Ko#C?ᜡP}U/[/-lV4%hii!|B?rwwqCMm?^V54 ̃G #LJпB$ fD|ȋ|@1LJ6:4#C=f|׌Oc5W`uZp!rPn 8CP:>زykkI/,\ #|A_ C+^A|`-`f% @@|5gϞC8D(0)+]k}q,333RW `} ӧ'mKK׻|I(}ߟl^*ڑx <nn1neSs7RdR +Ff!О}xT|޼}jx~R.\Hh~=T^6xa#=l]h [NkdžS=23ԇu@h/ _kfZD}<^ۃ< \ӡ`%{^^y} %VyyWS Oj{P,YpLi">]uԹ`ڴl̘5Qms)(sMxY9s\S(}J"_5-/B:Vc\%06WݾYd-uZ¿`mxCq̅{&&\Ϭ^J[QZF#u{»= 1Q65ZoK1j,px<˻UT|A,L*+wS[;PzFJ{a+"ae3{ssUۤp [Nk?׮<~ԗ-؋\@}NEI=>Pjl(Uk1F3>Ss;x<׊%XSc-w> >KjlOgT+?ʼFkklmO+@!̊9Wc#dw%7PP=͈>}Zvz(Q5͈:PXxfU;FD5?-[#rh࿺#x꩕rݭd>]%8*vT~a"w^f̘)8XϽ+eͼ@5T z eٳW¼`j֘;o({6mm-)\͑+W2܃@vRKfztLIK>qbi|u sQ}?c_eD/KbܸӺ>nuKB  _ s}R::u%rs'ҹ>|1XvVl+R}c_Zq/ѯױ&OOI>}ŋ{ y lOw+^ mh;{}Rƽg<0rdfskӯi]sqw"^&D;Du,D;?#+v""""""""""""""""""""""""""""";g\SQP&>?eN= >೑g5lpXfҧ<9al ?c%yUi8>@8 @#mqppb:tk``xᎎ];|"oB;>O7o=p8288xpxtvh}ಧ[*Ʈoh$L8X)`kj_ZRZNwǺ{"Hm]= Gvy˚a{ =٣ 㶶pIY+aiŶ޾qA8=;ƾgWdDž$Uw `k`D$+iY1xfU_+qx`b`=80!,á/ٟVo I.m`jM';z4I v555ѺċAǹV"yq` ڢŗasS519B8X;p8 UuO!PeƎ-aK;j껻aB~0 il$]9[P3,{s E!Y\E8ՀC.ݢJa!nQ%q  8䒽e+`\r^%++w]8$Kv1ddp\YC{Qd <ĬǡIzX琓6Z%(u :ŐʒG`gCN / kKV8T)Sws"GLXJpHTppGTɭ8|C8lټUyEJnŁ),\v萰 >&7E8pX ts C.l+)ʥU={%! ++]~ظL%4A$n>]~H|z%b(Č  'O38U~hهI2u?W3!b(Q0Y9هC#`*= xm? K$fdpH_pPc{TZB "=ѥE>9 P&(#xI s|Z/Hj0ubE9P,~d?}2?9\*#b0uڃ?֋:Ƶ57{8f-cw*#pyk zyՋ!y0SُC^S^%۰,yXvyՋ:&&}MM?fLE{㣬t-LϺ gΜX/xޛ7t<"_;v^7[~)WE;/++ǧ)}M~, 0K}hIxޛ:6.*۶^5sI7OXiC3_rC7Pr\GJ{߇n "d߫ lHe."ywaghn4E DyX8vg2z _Ew$u{P0@8&=e넉W-\mu${0r`U%U|: 8S023ݾކ^J/V~#r X??6 @V2}z@»֑!;]eQydh}3:6U ,` _)/ﲊ/Hꜞܝ'́< \dIe̥NU_N6ո$Cso( y>X%VO"׵߇悾%%~mGr\E"xCskP%L|xzNa;}h.ʫ`C] :d7n7Tr顬+XVvpِP w;i.R{!3gʻXSY83y.5/_%&GyFԳIg\h:R-GGo-L TSϸdT\uRxB%ddjsOe8z+yU>0J誢PGq0=N{T8\TigJim:U0\n#93mƷ O= ݺPhŎTzL\ٌ3s8p[ `1x$!)={a f2w&,M%e+ ࢱ㋞8U!}Uq] ]x}܅'G$ 8\0'8vzxrrL`!  ^d$Y 6 bpwomHx]mlTU>t[ nc!AH~`*fMHAC\RKSm5U$~@JHL$|H3m-̴2t*iga:i9gνs&f9=s?2un]3 LU+WLrr9 CzK8!!<`ek$?Kj%o|T7ۉrxb0󹫷mO%sv{`~_>9|ycQ_~1Z&aV_̞}/9}I/~WHn5kJvhC %Oo؇ѿҷ&񐾕&uu]%dt4NnݺD"ABz%N4]fte\#GcLJIIwI;Ů] T*E )vd\i)/L s8jk%[w;{If՟|u $kWL(FԾxTP|YBv[!x- )&q:::\/AW}qGIr $Y_H'J^֫brXTi49T8Ln&S7HՖU-uo}6WO?xRVpFcIe4W?hT1x?WuNFy:k܀\ ~ea2Poi;V@kP3Jj^x VpA];_~!^b90QK*<*Hv sI0P #Dۼ#e>J::dd$3{zആH d4<(b$}APjvy`V2'a[οAlɒ1u4XjhYA>A^[yf |!d|}}8n '^z|컴5!Nڷ·"OzBط·s.:(z|VHz6+WKϒIϦqYkyypw:[_%;Uφ<"ikH+i7^kGisil Y5ʰٸZ;zy>1XnNf'#"΋E#DXu?>o ]Ě'y[|<_ܪ[OWry|Gkry?ociY ?-{q 4}/+X3*񁷭_,9tK[|lKY[~@ly֦WYKYekD~eKB_F-;y~,BVqmdUVzhLCm߬b꡵7،>6:DsYIWqQZtzE# iO8C[jf"39aLv F}ٯ2zm.d]kWH]~>5oQg[K|2`8iԇKs>\{ܭ/tKB^GHss=B4iGT@X+ M4iҤI&M4iҤI$1x`S;ngo+#!c9O'UʫU6>ށxg P])M8SliA`M?O,q6ҺoiD" x^3x&n~2rbW?xD"ǻ{mm^vZ8J+_ U6ډ+1x6LPlkݺw޲~Hd(Lz}$ZlMs5JnB$f[GG'w}}ս*s]} &q6C'ʶ^"'0D"7!&q6=7oOܨܘ;m{Q}dh~'%Ζqƒ0N 2 &|| <Ung_YmG#F`$(B>!0S>bpƙ"k=5?tz/?\jwwL+Hb !\Qܽ7tp0`XJG"xi4h4 >Ip:DP,VT4 bc{Lu65f;8 [5`3D""8ù?d#LpU""_8pYOp6KDg5;C8sWn< 8skLDXdz“3ɚ3ɚ/'"""lm  hܽ{4x[ڄRH@[aXmf#dqTV 5Y6<'kwҦyILSIɣ'wi 45,pV ;_6<'qn -j[A#ޞTzõkKΝ'qf]9U"3)ݩ8oEq*t.[Q mlmT"ߊTP췢8ZcߊThgMy*..2řcg`dR&D?gZ*83o婬RӀ|♖n>ά[A;9Avlg5vlMQihh`3]ݎMyʜCM,Tt;n2'au73-E7*Y13]E^T/ٺSߝ.s|ϋG9LWînvm80޶zgSZ U u1 Y~NW Fikhz,)yҤ}ZHgTAij3^ @K +A* }-4`V y/v*n!ԃV] 5gͺg ?`l olP i#N16lx]NRK i;\nvQI6U(i+>_FT: ]``:R Ѝ3gn*lP^XTh3|l[Yݧzg LpǎbRwXͽW e ;M/<odVK{ݘYKhP}Q-#UƴNϿ~}i.hi9k (:G79lAQ*S0Il="l.X25Y) yFagkun˪h49lYn bU* p,P%mhOP|g ڼ1u RZ: v()w 5od 1W`x+G5?#3#/8BMMqqyg{L??w-Rқo_swT+pH[^K)JY_9% ^83X=FjTJ2k0R?~׃ǥy8?Rw# ?onz w°J#B ?mα[GGG }}55YYy^#~ y y}y}y"y"y=d~w%w%!!?&?&ǔ|=&_\{c~7>T 7?RQpz&d߱-p 섾L?Asm?WW;9"0or~ߜ5zzRܫX^t(_|#gޛyK}>~[r ְ B@!P8}0P~,V 凓ߒK?#/~ߘ#]_$)2G9oQh~[ѥP~'1>?Vޒol)Կ8R\hqUe~ߑ'A>_I~$Aɤ>ݿR y*~ϫ?,JJM|O-!4˧ \=6p,.`~_}(e|&)33KYqUlRv(?xk)gdr.)7[C3QOOu:ϻ,uH]?Jݠw;tz[?==^Pސ-!3PR?C4( I}>+@~4Ca& 'ȏFB)GIyHci?/  TA~I?BAwL:\:t?))4OKg|>'۟YI.ϻ{Qte 4+Uy_c*ku(t~{HߒnC;t,Wtx/ =$7GP'"=SgsyoK/~9~RzE<+54-Oowfw{^?(}"'3g 4/Wy*}7;4l{/ !!/ E G*UAӄN< !Lț‚%lþk x^#\y_Oϻ$B[?!DHy_P"4Gh? "ÉP‹ߋ "B("AG" "|^vh/G1?I<1E,X"6[!~∸x_D|" DB"%I'IOR Dr?\ w'H "'Djȧi F|Zxt"=Ӌ e3LP2EYDVylPW9?~F$#2\s[!yE>(? /( {¢P~QQ /&C+.J@%DIKҐ/-|/#B(G<[9Qx? *BW/*CWU]?WU!_UT#󧪉.jSCԄ_S"w ڢwQʯ+|Av~=Qx DCh E#(h Ƣ k"Bhh\ _[VPZPZ6o#VN'wl/:|!ёxWE'y믓LP~}E?yoD_ 1z >_=y"/A~?\G b 4cX(qb<Nj &B~L(AayGQ Lqq'IwROӐ?-|qqg9ȟ!^\qxDitPO/g33ʙ I ՟Y,rVYlP~v9CeϜr.yߟsϫ?x_?Uityǟ ϐgLy;KM<5[CCa#PG!T>L>N埐OB| _3>_g筿9yg/ϻrAQI _uE |xku yn7oʷ]ݒoCߖ{|x|竱OOk+шGSCѕ$wĂc)?b+qQB㏫ăOW@K$ƟPIDJbJ'QB> Zɔ>_+) BI J*yJIMRxJAJ!yR C"EEb*+%}XB) J)yJ)/:Q#w*+ _AR ʯT++UWQ{UUA㯦TW]PjB5ZP~-64:(uU|]'w4 W!*FJcyJ(S4͔P+-JKyZ*RZV@mo|;=_{cwP:[?NP~'3Ͽ.P~+*ݠuSCݕ_=_=^P~/7[C߈w*}٥w+{o߫)+A!RCV@GWWA?'wr $IJ9M<o̞3Yy/UAߝW.[>]T.Ao\V@W]U[ה+7 C S[my߷;P.Կ=oο܇}?PCHy hOPS?ϔϕP %RyE<+5_+o睿(oVy盲#?*筟OgV@|W4ow(x+X%U@^/ԯ*:uՀo&㟩Z>ߌo6mՁ>{jAj!Ԑ_ "&o?ap|x5#F$52#QQ}9j4萏ƀ| 5&c?bVϻG ?x3 ?L&O&"wJ&_b5 Կ$jR'UA>[r5S)gWSϫ?4OO|:5=ӫf$ ox#,gQBYlP~65;]Ps|Kj.V@yԼ?/WP-R C"?)ŠʼngWK;~PKϻQR-_J- joeԲ/#_-W+ԊP~EZ%2_YB<_TQBUj_P~uT &~k=QK _[:j]z>ߚ_OOߖ] u0`uyաėWϻ:LN<;\A<9B TGϻ0J hcԱcqPǩgW'{~b:DuPdu 4Sԩ>ߎӈgWϫ:x3ԙP3YP,u6Tluu.T\u4P|uԿBy翅"yǿEbyǏ%RyO,UAL]+PWoxoxV{QB[שyߨn&u3~6[-VoUA~(;Nu.u7w{{>ySϻ~گ w8z?X=B<(TQ4cqWO;~POBTOAӐ?Q?#w?y/!Qz+Wנkuyǯ h7ԛ?7[Rou[GK|-wbOO|M{>$6ox>&wX}?QB y %4+ȿR_{V@ow{wfO~g 俨_ ?? ڟw4A<'2@^T~U i:ù~M.[M-.o\-g<->T|- P~B-i!XK-)4Id%Ӓ|7vɵƟBK R/x;~BK#w*Oe3hg2[ˬeƟE gղA>xZ(?绳_N-rC>x^yPy|i!_+ZA A/ kE+%wVT+_L+N߃VxVx'~k*h!_QDߋ~:h獿։x;i֍xc7;k=z;zA&wZ}P~_OO<hBg6{6x^kC6  pmm$?Ro61hc!?Vqx(66xۓPdm S>߇}M#?MOf{~{6xmYl9?sPsy͇|mTm!"(m)42h˴>ߗ= PJmjyǏhkkuPik Fy&?-ߢmUmv۵ėv|?vNmvC~xg߫#7kAhj H; v?T;F<}L; yOh'NAN| {F;K?AHaP NzyzDG#ϻI _d= 4(zTQh󮟢1/x=ԿXzl(?qǃ?_|=4 P~B=ԿDzbyII睿ɠ}~{Sr=zJyS*=5Sii睿Lg32ꙠLzfhfֳ@>V=g6=;4zsPv9\ϥ&7zyϣ%wȫ _@/H?_OOz_( ?@H<7P#郉/!,o>Ca߇!?\A8}?ӈOӧ[?P }&xYwgC㟭ρ}.\}?Oh _/ƿH_ /їB/՗A~Gǿ\_Jy_"_Wkk:ȯC[o _&y6雡mַE oշAݮoǰw껈&w{ G տW}~P ꇈ筿Ca(~GՏA~x ';)Ϗe:!7g?#7w^_/B_/A㿤_/W E ~ ʿ_w]Mh7[Pn鷡tG ~g!ꏠ?C')TFx!݈AhdOB< ? fdnƟ?4r.#7'ry՟K_}FCh Fod4&~M&FS75Aќx4-iihM?Pc!X/2'-6@XJ<2er>~.7Vo$XELAx3 L f:ytfzfȟP~F3Lffh,P~3+4YlP١f(?s?x6@>xc^33ϻ~o毀YxB2 ϻ~,l濈Y_Q_,f (Y%RK}~Yx1ϻ~*k#W9   \ %R/5A~痳xs%VUjyy_cƿ\G0OB'S?el#Sϡ y_/|E}H?xtVzy/x#? deleXYZو_fe٭sX9}~=;? 3[y ?g'[VAV!(UxU(4V1CU%/i_*K[e嗱ߐ*G<>*@W*BU U*XU!_ժF=_jVC7o5joj5of5jA ; 0k8pkHh#QPGY(5cqgoM'X?&ZId(5緰XS!?՚Fk݃=>߷!zGc?@b=ZϠgsyo[/^;^A^;@B>`}$7Od}&ϛ7߬[?kɗla#–mH[U[5[GmB7mw?XM? >@B>oG|;"4HdGَ>xv4GcϻÎI =N'A>Z?$P~;)N'v~r;)ƟNEvhs9}~/{9\3۹!Cx'd|'+: N<NN?;E9vϻJߵͿ:3.4~ APAnnHytCA& ?xn8~Bx7T7"HP"Q|:xQhFݍnLh1XP~,76n(?qxƇM'pBO&"wM nIܤPɈ?};?x;O"W*75KƟM n:ȧs{w3@>Lf&fYn6h١gws@9ܜ>]N7\nnyv;~q՟O<ߔ-[/ ? E"nQhuA_-[/ᖄKrK-[x^eܲP~YsC[x nEn%yo*V!wV_խF_m@=܎v"W'3;].nWy_uuAP=nOy믧 |o}!~nPw |.{?!Pw(?F<w$G}历?C<1X8yƹ;ޝ@< D$y?''S|Oqϫ;xitOwg@pgBtgA~;9s<.ƿ]o_.&bw ]J]{}y>C4Gc(x)43hPsT %}Wk7Poܷ?owPP>H/W( ~w4`!' /x/_~4^AhBP~!0TaG(_+WŽ/$wW R^iWx;A_ޫ@<U|%2+{UxUzՠWC맺W5kzZ^m(Wu>zg5 אx׈xF^c^MMf>5C7Z@-Vi嵆6xm^;ȷCkuWlHB?A'3{O3hy!{/W彆k { A{Ox>{}>ϻB%?_) >e~?:AGCQ>H9,_y@C?T~qMy$RT> '3YB/?GJW_*?2?5CIj,?ʏơ|5.U\5OOW`@x@M(<_VxoDT~"U~CQUjUU{T]xIW ~C57UjS۪C;KyW(>տT~Q>>C5"?c׏Z&W&-sw3kYYcgղ }MN]!|Klϩ9_-j ?k(_@+H_P+DBZaj kEhE)_T+=bZqŵT~ $Kjk_i UerT~9Oy_A(1@^xƒc/QTbm 5Kc߯/ՖQ˴ck+_]6_[MտZ[# 7h)Q$<6Tfm h[)UFM.;~Q;SvDxlюRGc?qOh')R;E)4Z;C3YvNxN;O^ <"Q$k_/?ƒK1?1ҙ'[xYl=_=G\=5~c_o|J8=C='Կ[?ꉄǎDByEWU]t_ *M*-[My[w(.]ݣFT#zb'֓=;LxK')S)Ǿ_HS驅Ǯ_4I/O/TLϤgaY"y|S'^ZTBc֋}?QD/bcӋSc%T~IK饅e(_F/+<(_N/OzW+R^IxUILz*zUjVիQ믚^^#ʧ} &k(_KMzz=zz}g}_C#z&zS?ͨfzswsBo)<[ꭢ|:8ZxzGmozG*މw|gޕZ?]ncw{{꽄T~oOOG+>P}U0}8##cG ]G飩Gc(?FKX}~E Ǟ?&$$}2?Y"YlsT\}w>ZQ>#|[/<6? E_/b} KR}L_N ʯWRWQW P ]_~7DLpc6ꛄ߬o[۪oۅv}U}'w껨w黅Ǯ=T{T{}T>}?)P1gQ?$<6Ta=?~BxsB?)wX?ПPOcOϨgs *Rx{)<_EWkʿRQ[@? 'g*#y|g_~W((0j 7j =2j _m_Ǩ+<ߨ'Q>/\Ox~F@4Q~1Xxw1b Pc0c8?!qxcxf|*?M/7P>PxTf"'2~T|(:uӠa7Mi lӡ1]kzT ̀ |1!4#cGcIǮI̤c-Lxl%3 ?%7S 3)T2S ~LCLKf:ҙӛ`f{~hfLf(_,bf|V33;AfNf.Mffj  Ǿ_*d/l~1FX~18_,!U}U!Eo#{d.<|L?6?'TO̧c?5Q?3 ~|A ߯yiI+Wk*7[*7`m~?ϔl~j1R?m1ϊa11iŲeŦ|l+C+.\+ϊ+oǮX _+3+_"KKO4*_t*_ jIyӲ(oY65~Pޱ\~S[uV{ _b+$VR*?Of%?BxGR V*᱿JM姶PJK姵QT~z+3X3Z(,cϲXY/MxNA՟IV.rSPyc篼V>w>+ ]? Z YǮ"W*W*&n{}:II)453cϟgQS ch]dD|=xl"<. ]/[WuUxpuu׭T7T7[T_)uZ;Twcׯ={}*Px-[o~o=l!Zߟc"<5X_jKfaǤ|L;/fOl;C;.׎g3/?77v'R>-念 ]? *ښl]x6 {f-ۦmwlWx5Sv@ao?vDxXxv'R'Q>?BxNI姴S ?SSNC姱RitOg?`g|F;U&;so v,vVل)!Q9Wxv?~v S~=Dx3J ?éʏGRGQєmc| 8x*=Axp=ʟhO'ٓ*=ʟjO{3͞.HQ5~ !?l[GTGc qU $Oڧ;eOg3YʟQS}Zh_/? so/c_b_+Uj_~}ʿn}ʿi[_)}}ws׾G߳S}~HoQ-\o#dNn?b?7Og= ?/K~E+5~C忱Ro珿쿅G>ڟ/bC?Wj ?'{ '&Ӊ%uN@ |Љ"NbI"Q+KN?9)@@:ǎA`j;C8CCaco9ÅΟÝc/F8#3EQhjqR?~}3ʟL':IdOvPOqR~3Ӝ锟̠o33Y̦lgg3<*3_x=Y^x~pR Ec_cY"<t2er*Bxi_{YMjq ?:[笧_l= F&fl8[)F6g;;;NgU.g75=T{9j8Ǯ|O|sHxCa?:DŽǮǜwNPsRxpsSiʟqRuQw9O޹@_p.RsS)X8)ٹ"<*UssCxM*s[ίTm*swTw{T=Tߢ|o7X#w<yByJ?u gs K[b??Wcr^Sy#1XcXnlnW7.\7Q/M <6 ܄cRߺ?wU?ը|Յ_tנpM_Mע-צ:;Ky=ק}7|Q|݈X~MLn$nRK&O&~$wSP)ܔO馢/niܴu ݿsS 5T!uxGGcGccP>{}>τǮcKƒWc+5Uk }K[W7v?PQxpIxOg/?cUx??/Ë)<*ʏ"ʏ%OxϋGFx c?/'J嫞FAIyӳgy65P;K廞Gy?(??%?DxI%J%/\xKAR 異/O?Vx}Z/yKe3x)DL^(?~ee^6*?ٽ;~sz(M՟C_//U^/~yo }V+H_AS!05"cFqpEb/~JP%c뿤WJxlJyK{exe^9ʗSWU*QWWʯUz(_ͫ心˯WKxU˫->o?;@Ajz?F)=aXGTGcc18UqOx'?面w*wgsS _.Rw򗼟Tן?{. *wUxg]Q_ =^nMjnQUxW6mǻKQwCC(? 7X#w*w==)zϨyϩ{ὤI?WTה罧{E}#UG,5D~(<ߏP>''I~2W2?9Ur?I᧤OJ?K㧥?O;3gg~&9ς~Yc?c(Cxlr9s\~n~G?ձ~>jS>_ QW/,A_B0P>$O$IA2*?Y\xW@ AEW * ]*TTՄǾT+S=!*__x_:|pHxy(8,<GG)<8A"8I NQw*8M:8C3Yʟ Qw.8O.PT/?Eg/%,+o+?>|SYxl>_—c'R_#dƤ|0c);2'Ka;~  jO{>ϩ j_/IgUuw{j߇ENo?Rcϔ~;P_)5Wxl#c"1(#33++;H8T~H<*?^$~?7ƒ# ( Px#a[*H"DW"Ѩ|- }?G *߈c?ŌX"qKͿOy?D;ƒ#cđ$TI"IFQ>Y$9UH *?E$%2Z"):Z?i"iKI'~(|"w0QG}Lj}8; IhONA|={?;C}(!{{L>C 7_|_}}#7w}??x ~PFhh#  F87"xQ`D$'x^"G6@QP~T#]y?x#&ӈ/xl#8F\yψO|]#TFB DDFby/#7> PaB4$~i(+Âe w kÅk@F'1B> 2#9HA0VB+U2V\o!7kZcgzcc#&hl26C-P[!(N7?_o"7Pncc/G<>c?o w8`8D6@Ǹ׸G<xC?4ϛPc T'S?5AfHWO$ j&~SHK6m@?-\yW@" GO*;~'ɡK.RxUv~ x^ST?HM,"+䳊lP.r@!rB9E.>~gy罿G%_#w'CEy P~AQB0 "P/*A(T$(( Ң_g2,r<_AT|EQ DeEWUUUT_MT'A3P~Co$Ƣ D4|S _3E ~-DK(hm=h#Bo+;Go;N;_t]]?u]ͿTn;{P{^PzP{>#B+Ab4~@~ (`1x^PP1x^#HybQb4yw o b"b'ɐ,@"zm1x^鐟.f@!fB3,yYb6?[!_̅7W#cX@<@,oXD<"b _*AL,;b+!RڿJjxF׊uub=Tb b#7MP7͐,@"B*A&ϻ.v@;Nyw<.E<.x^v=Pxg͟ 4!G DTL'wq\ o8 8Sc ?#ϫYqj9qּA\$7.KP%q E\%oͿk:4 yǯ&T[6xxHTf'0B>L Ħ> P0M(4%4Lx˴٦C@3 LK3'O?x(P!yCa(yxy?j#wy?N'!<y߰i 3Yȟ5Ay `^E/!ټBGh>"7!|B ?ǑqWƃOƇPȄ e"n"xA 2Tl2;4~e9dN甹<璹r/~_dhr r?HoryPyF<5L'_ wx 叔%G{a qrH>'"B||?/%K kȿo!V;C~{/?{A~$Gx[/\/U~M~'A4GP_Dx^#Ȑ@> /GSщ?PcTX*6Gljj\T|hW ?PD&i"x^~b#ӧ (Px eBPT Wʂ-eCV! UP~J$*)gR TrU )TJyR|*U @OB>JG?uV]wQ]?]U7(wW='^7ުG|_TyoWϻ~A` VCQCF.R/VK/QK[AgZQ~ZAP?!~aVGgWGUǠSǡBIu i_?ϻtVN'뼺H<I]&^VW E]諸_SסT&S݂-ujmuxwW#O'WCy[?H='?xV|Ƿ@O`%Z<>;?x^~bG߷@`=$wd=&w)OgPY!zK~/Wez7[owP; >B ϐl} 7y|Cn ; m?l鿿x#xSh; a6Rv8~oGxvDyH/ʏlGŎ GA>jt;Î v,P~l;ǎK(g [a7m yi+y/ʶ[M4y4{:3=3Yeφl{sϵϻ7ϞͿ 셐_h/^ /@K쥐_j/o㓰r{W+!^E<~Pj{ ^ :ȯC_oo7?D{?T샐?h> @}jQ>qO'!>}㓱i gg;/@`_$w} ʿd_&e T+UyWkP5:ݾ}-Pow;]Ow{o?~H<Gd?c T'S( 39 yK/WWk7߿Bow@<#'y}?Cl!wJSHx 8N!y 9v@/: _)N ȗpJϻ,锂*4NYy/:S ƿSʯT|%24~*TWթWs;Uwj@Ԅ|MZNmv@ԅ_שizN}yo iDpvz|&oo.yw9{ox>g?y_pB9sx?!w:QcqǝPO8')h9y?%uA:\wH+{;|"w|?;_Wwy iyP(x: 0:,au8p:gc?@'Թ\:7s @7|C#uy&)T7L7|sj o[Atkyֺ 4mt[y翶v=#u'ugyκ Ew%wUw#_w]{Խҽ![|ݗxԃ<>/҃C!?T#wCȏ#!?Ro c ?F?V8=?D$yIz2?YO!w4EO|T=xiz:g{~ P!}(>J<}T?'g'ԧҧ= i}x?ϫY}?C "/K/ϛ?( U} ʿCIw#ˏF$w2 ʏF|d7 䣸Q!ՍFx^|n~(?[܂t A/_-"nQy_EbPʼn]wK@%ܒPKRnie<[x[x<ʻWp+ϛJP+Wv@[x[.nu~Pk5n-rkC[.4uz__ϭnyo6$Wn#7rCۄxK)mF<ߟh6ƿۂx -ܖ>t[Ak嶆|k T6n[mvP~;=ݎv|'3v]_W=ܞt{ϛ{}%t_T~nw@<4rk`w䇸CCaP0w8䇻#pGB"w5 ;x1X(;xqx(;x DhLt';Lr';Nv;Lqz|vTw?͝NϠgs($w~龂_(x[4~_w?~?Ogy>_͟/Wy/߈gw{wht|АxC{|%/|@y'B@Dy7b@$(?R@dG(Q!5 'W_}%+|#{?QB= ?}X KO=郾}U oy-? mn'g;hjo1 ?;$/V|'5ϹS4w#gA<_?.x ߿=W?IЧ~ү_K!} Ϛ-ߖm˿C_p>lA#s ` 'm _lsf_lsM6wbk6bBۜ7房̞m@m#PaiF)/4d]~ݦki!mV[M n_ln_n7}vbv3cX?C꠯GA_Y>q4)F"g|?;~ݟ? o[ ۦCY2xv"8+#_fs; gϟ"39'x ۅϟ_mRol/FPs?w/ƴ|6b?}ϲm0kįϚ~/D߄-|owH| ~-Ɖ&tC~]<矃? xHMVey7d9N<_XgG[iςOw{<,.x?3 0%9%C=߹?s1篒!; @XO4DD3Blb E ,?b = Ƈl?u;c!hq-཮EИ%Wx'#0 I5D 9zymF ?ql!m,P`dԹwUH?1BL̉RC/@=+ ^/m` uj[(x%O.4Qm۶m۶m۶m۶m۶Utd7sz]W_ ٟ@i)շCҷmqZ G^;(X&*^)i*)կoٿL1J{~"vso_kL=QgN+n #2jӟ!x5M^x{{==--55tf#s<_o?7%7%!!_&_&oA:uu8߯!W_}]\?\h˟z і*d~?~ߟSȹo<sk_~}_?339"/}kW<_ ~߀s߷gy˷dy#{2q)YPYwwdy7Xr "7B_h) &x y~X)C E#S G >_ǐbB>f𽼐XBcߧ{#Ņ|\)/^uU? =ׂ!ĐO,%/I}ҐCdRr(?3} )%;eM秒RϻO-Hi] f{ >=>=/C y~{!LRfg@>xNlRvgr@>9\>}r;~rKy_)/J OTxQP*D|3/$ƯTx"RQR1h6J@T%/%|ϧl_F* R9yo93W*BW*A*KUW[?'IաWs3!Մ_3yZRmז@TR=I}> ;~.侁 /7 _k,5|rCEI͡}o=oZϻoy[o|6 y ^{vy!o_~ϻ<|Vv~Gg'3,u!W+TWX.|R/hzI-|/T_/ i 4~AP igcy" J ?LN<5\A=~Si&M' (4x͔fAs~6s+̓?O|ig_(-"wX$-KePˤP/V|JyRZE|s_׾~ji i-_+_'_/mi#k $m[P[m֏mv(N;]>]nkSNvH{!WG|v}>{QDQE4Gщ]Ā| xS"_&w q]';P DB'P~bO"BIE2K&|~vO!Rϫ?H" O#BiE:ȧ "#Qd3,@> ?F<[6jv!r|k"7-ϻ~#ByE>yD~(?(@<_QxGAQj!QEEEE1PPK/)JA(EyWF|YQDyȗ _AT$D_}Ŕ-e@ޑ]ȻGj<9> @Nr"ɉ!XN$rRK*'drry\NAC>\P A/,!w;A\/.Ư\x]R.@eΟerP~9< _Ar%y\ʯ,WUUj֟jru!ׄ_S_-6rב|+#w\x/7 w܈xHn 7ܔxm*7Ln7[@-䖐o)|+5[m Fn r;>_^@AH> G1ǡ yINʧ|۟O/!gPYN>埗/ϻqAH_@/P/WWky7[(kx $G$&w>__*&'w]Ax%&S_,%6JQBU{O_|%@IH Ϡd$wdT2[2)gV@YP~V%4)};?9/x#jn%G%/WG<|J~P BB+(E/#s18_\)_ eIJi(Rx[F)KJ_U;SCW| $_RC!_CPe)!?\e$#QP(e4The ?FK߆}V˯%k]'F}T!WCHm _c 䛨M!Tmfjs- Bm j+yG+5ZmQ|[۩!^@{}G _~jo k:xu`u?D 0SCWGϛ#ԑ"we:u,Ǫǫ ?A~:xu2du )TyTu?MNSC߯ !RC?G1=֏ Įzxz ?&w:!gԳ_gsP9< "//_QBz 됿ހC To|gv-6(zʿ#zj}x P'>%~=UA?P %/WP+54^o| ۿQ;=߫ AHߍZ$yϿE"C(DѢ[jшiѡZ k1"6ox[-.WG<%Zy-!PK_"-wg'֒@>x^jɈɴOڟBKI?Oe?Ϩe3iάehY}UFߋ=ji_[ϛuzՇ꯯5h Z#(&7њBMfo5|s[h-!RkVZky[km|7;mvo'z{֑Z'yG'3o.PwѺ{UwӺC=|/7{k} G Z? m @m?HL|m?D 0ӆ[?k#?REm?_;@< A4ikG#QՎAwL;ǵ֏IȟNAvx g?#7P.@]E/i!Y+Uyjנ]'v:~nh7}~ nϫvx݁.j Oy=i?ўB  %+y?_ko}F{ {} # j'3?k_ E 7y7;]~B>HH%]@^貎_yO`vU]#~Mס|]7o&~S[ ۺyGw@z(yPzh(?x0zX(??P|~D#ϻ~G&Wd= Q!U4=:z 1P~L=#jl=8z\zT|= !POC>$/IdO'O| =%+ O&Kj= FO ՟VOC P~=#LϤg&w&燱Y}UF<ى}~]s;sAn=G ͟z>(?/|A֋@/_T/bzqΟ%P~IG)4/!e,/=UN/_^@< zEyOE4*镡zWѫB^ W]͟zMί"W-6kugBuz=>__ozCꍠHo _c T) o7'js4~--VP>?ZoC?_G<~zy>x@ A`(>>0yap(>xHG꣠GcqxO ~O'BI꟤O'S ?E 4it(>x7CI>x?sy{~a_/$B}Ϗ/їB_/2}9+W+*ȯWC~k_#~o ~m7Bo7˛_7[|~,-VyO[mP6};yN(x]nyn}G >B?!0#Q(~lj3'}pR?E)Jxo|#H DO"#1F(?Id3ɡ) HI<הF*(?xH_#-;?x? P~##3S,bd|V#١F0rB> ܐm|#/gFAy 2 C/l_( Q秲?Ō%睿K%4J_(M|) e/o#n9oL 7'O4&A~1)bLo1x?͘O7f@3î?˘ 6@~1j\c y֯>? EEb(x-1B_j,#7~ˌPˍ_aڿX2VC~5Z([ol`l77}~6{ll!J3C~qqx8q?l?b95k187Nϻp8 8Ecqxq?o\"Kd\/WW!ոku׍q7[Po!۸CP=0Gc(b<%~?5AxayxEC/P_j|#7;Ax^%6@I̤P~R3L'7S@)̔P~J3?jj3 g3-LGP0 BB? ]6@E̢>_,F ~?0Bh>"~=2Cj)|?3C>/̗_g7_Cj-|G0PB_X+ױh# O<ފG"[#ZHVd(P~+*_QhP~4+:ѭ֏VLV,XVlǶ@o+.׊GToՀkX5V-yjYVyԱ;~Z=VϪO#(xc XO!z3bϟ yx^/Wx7[yA{@B ?Pg 4_}A߭P~BAΗlya/ *y։m@I$v8ȇϫ?PE#;~"ّv(vT(? hvt(?1v,(?xێ;.v<Ώg'wķo'|B;ى!N_;)# dvr'S@Oa? P4P~;-NͿtvzh|~ vFyLLvfygϛ?YlΟ_v;vN(? Psy nHv_y~v@BAP {0?{;ϻno=xc= =h{ Xy?O埱Bgs?gyT"4/ڗKe(}珳}Wk;_o@7원i"7P;P.׾G5t,yZ ێ㸐wj@N(ȇrBCS0NXyOX't[?9_x'#8#:#9Dʼn _T'ϟ9ѡGwb[?c81c:Ćc;qNj"'1$P~'): IN<_$wR$@J'4~P4M㤅O뤃?}5w2d$w,xgr2ϻB=~=|/7!}P~_~N; ? 9!?!Ph:à73ጄ3/(g4OG;c1Xyu'wh33xk3 ʟL&ߙOqB~3 Ӝ̀ g&3YPPlgTg_b<,ڿYH8|?98_uAߜPߝ>IxnhDqBQhPGsCP1ܘ?cc筟8>ߍK<׍GߝK]op7B~x ov@~[mmv(x  j.w7nw4{>(>=܃{?G(䏺Ǡǡ N')ȟrOCw=Co{%̮{x 䯸WgwAPuo7toAېށ. Ͻ}}?tAPc 矰 }NH{{'yC'C^+ yӈӉ?tπox&YPgϻn{x._A!G矱Cy! CHPȐEŋJ?O%&~'@>IdPɼO/O饂|*/5^y?i>=it3{՟ ^FyL^f2{Y?xYe#w(?x3?9\>?/?j>/?{|%/|!0 {E_(_+ϛŽP~ $?%RPJT+_,_+ϻUޫ"WJ>߫L<^(WUjU|ukx5͟^-(WʯՁ|.zy!_k^C7ϻo5{M|5U)^3yͼͽZ﵂|+56PBmvP~;=#;z ^wBoN<׃x ׋x^zC!Kᝄ?靂)44~3PBgs?睇yTd%_.CwWwxsͻw7݂wʿ!Bw{P=>{=$wGcyĮx3(xϽx{E@} ͿB}}w~B>H E y9@ @WTy ty=0ݿ3,yǯ`߄?w\h| |Аx K<;~AC>|@E=kt~ڎJ%i۶m۶m۶m6W۶o;{|5;5'G ͟HyRy+(qUA>xo!@IH*]?>)>+_| owW~@?_!}R~/ UOjDGT#A>YEYB<EJ<U"?x#_ 5&wL5KM<[qTxUTWUxTU7U Rm۪yG ͿJR >4~_ @ /ʏl_M@?9Ԝϩ|.57syQB>x|j~yj) R C/ XE獿ZxC18j y/K _J- jy만Z/˩jhVP+VꯤV|e 䫨UUU|lWS{X]AO Pm#1㯱o6毩 o6毹"} %[ Jm jy맍oNmjwP;Bv;jyo+4]nP~7;]A<jW{}?%j?yϟu@A`uԿ!Phàap(:u$?RRGC y_K<=VGR{x>S4!o/ B}I</WP+5Z}C}-hqZZ|y@ ?P$P~-)TK'Ӓ;~k)ZJy)TPRi罿JFKK|-tϻ~2˞ ZFLϤe|f- gѲB> ?ٵP9ϩ|.-7skyG Z>C_+@`zϻ~zC>%7}~ h (6xo6C ?L666 y%Xm{?^@>ߨm"׿Mfy۬mh[6yMov@;Pvjwi![Z{}Ph罿9 ay#P(uT;ӎϛ y $R;SigPY4sy(vʿ]/j I vxhW筿5kuy׏ Myonjnϻ~@㿣%w݃i{_{GPPkO=ўBOg!ݿgs?^_j J{ Pj N{xxy_}ѾB}M#?3k_o(POzDH:2HzdzGѣBGգAG'"ʏ$UL=V'ac*x]!wPtWuxPu݀7tx݂-݆;P. ݅wu /ut!_G 7;4AƐo7Do zO_39z oo|k xw[;Aߎz'띡zyׯ.zWhuջ{w'wT{=g{A~z@~>@}?HLxk>xp}4HyϑO&.o>x},Ax}DO'A㟤Od} ySiPP3τg고gC@~>7Ӱ?WGꟈ??韡ֿ~Z_o?!]O_/7[ ?m 3"@>@hD|$#2#Q dQE5A>эa LWL#XFl6o(bP~D3t x0L(4,[64!G.'אA Z|f#.׈3C> _B#H Fy'R#T2#9Tr#H ? ?4i?Mk ,睿睿2hd3筿Fy F6hٌP~v#r9F.2rC6@>y|g(_(YB_( 6;1_Qš7Jϻ~0JB%R/e_(2FYȗ5A뿜Q/oT|"+ _ɨ맲QUjT#ߨW7j[5_j2jC6@cԅzF}(o`4$FFcyM&FӐξ~65o4'Wsoa$Z[!h6F[ȷ5AFw0:B뷣 dt;]w1{~jtC>w7z@ѓx^{?z{}罿c%G<~Fh~` ?2C!b à?pcTcdd4FeGc1Xȏ5;3oL7$P&S)ThSiP4c:?ݘo1xLcT,c6lcN7{k̃y_`,$X/2C[l,K2/3C/7V;W+]VW6@1B5օ|n:c=76ohl"wdl&y_[PVcۡo7v[;P;]encԿ=^5A3C!8HPI$fR(? Of&|r3S)4SAԐOmOc BlLGY 獿Y/d&~ EYY Y/n @ $_,Efh ̆Ο F76|Qv~)kj6#wnf6'll 4[AP~k 6f[(mov '3;] -䋱?fv'7=̞P~O߽P~oK7@_`._h.\ /6@_b.\տ\ y?W+*yoVy׏5ڐ/o#:s= Fo47A~x-Vy篭6hnaNs]nh=Ps/}/yC4(h>C {<6ϫOgf>|0_|E@^ThTK5Kuˀ ˄iYPeC޶y_B޵$4~iy!_Y>}+ ǵ{gŇo% 7 Oh%|"+1Vy׏$VRId?Mf%J/OiSY!J>itOg|z+O+#he|&+33[Y V6hY!VNhrAs[yh|Ev~~VA(U/d&Y*B-}4;:n ׿vLǴcodžێC<8_UhT[5['wma?Lۂ-&a؂xv|ז!_=~i{3>vv\hqx3?o' NHJ;S٩C;?x;-? `g$D< gϻ~dB?v;vNie|n;y!.vAy뷠]vBAP~q_. 嗴KA믔]xi 42vYyϿerP~9}xs>埲OC}g=k}>䛳_!߾_/A}ʿb_%߾;N<}ݾ߰o;ݴoA}x};]y]4{}(0[CGc'b?Sϡ?_@/에i+5~^o睿o?y/?'y?ٟC%{?_=~B_oBi/7ToBO;Hs"@>HοȐDqGq|+N4ΟѝP~ '&N,(?8OG!w+ y 9:?1?cBt,hcC@s t<x;8q}?׉/x_P~'!GB'DNbh;I'qB> ?ZɝOᤄ|J'UȷaTNjȧvϛ4NZȧuA>z'Hx,NVYl~dƟprB"ws;y~m|P~~G N!r ["8EuA/;% _) N)P~i 2NY-딃/vWy NE(Sx2Ge T%SxSx_u45Ԃ_˩ v@믎Sʯԃ濞Sʯ4|aȷgiDtϛGc(<%3(x (x+hr^Cv@x缇p>B)仳LI<SĂcq G(?B^T&t0}g:~LaA!w=B?WH(_ }/BqE<(? "!4 E"y?P~bIDRyߤ"L$P~ 2{STSH-@i}VƟN|zDFg2̐,@gY!Ud|6v9DN"\"7[ 7K<yE>yD~EyDAhE!DahEE _L/.J@( _R|)QEheDYȗB(OAe DCy7 H4o,[MDS7͈f9Կ[o)ZAk%ZChF毭hv=T{сx#Scww]]Ut#K7ѝx.z@!zB)zA [+Ab?@ AP 1,@CА/A~N@C~(D<'xY|!*A< _7[!+%wv\dFp#;Dt#ϻFanyF%WT7͍Gwc@1ܘƂ|,7648*W\j5W'ok_5L"p y%WJ(_>? 7.P %pB'tA'rCO&In2'sCM#)ܔSTnjynyߤqߘM?Of3=et3AfƟBo;\y_uA?ϝo_.$K,qBKe_._Jy+UP*w5]C<]㮅_#]w7;~7&(Z-󞿶[罿nۡoww@;ܝPNwWO`]nyC 7C?tA'>S4Ps}I< xhoܷowP{COfx ~&7/P_ܯP_o~w tA?__%2W%ҿ2ROaIF&72 GQ?MF|t1dLǔ KƆ[Ɓ|@^*4~Ujפ]7 ϔ,iTv-y߿9Rϛ?!]y])͟?O}@ Ǖ OƇ|| dB' H&|bIdR'Ɉ?'C~LA՟O/ B,B0Կ²gȢPEe1ydq(,A<$_R|)Yx,3eYȗ _N'_V wT+JP~%Yʯ,@ _UVꐯ.k@ גՖuȺP~]Y/g_O'U_6Ȇ6lLԿrT "/!X.D.e_&\O].W/W{RWՐ_-ϻY#Bk:yo\寗 AnF f( r.w@~ןr]r7-@~ }r?~yxyWa( B|G1X>ȧ*A|N<\_ȗ)_A|M<-@o[o;ȿC~!?ȏ(?ߚ_~gx^ȯ_7wy|?]~ȟP~_ߐ-@K<O{!#z ɋ ^GB> ѼѽP~ /&cz?by^y߿~S=ͿLyL |˳!o{O@^x.z=χŃϋ@ O%O%|b/ $^RhId!KN ?Z?ٽP~/g/rϫ?x//?߯{+ zB^a(W"^QyEbż{%JBW R^_2/%7^9(WxT"TE+y!_٫*^UWAWսՄ|Mky!_۫C<[ǫuz_yޟ5;4~c +MWAͼP{-$o׊^k^ȷߙkڇ v~{w:ϫ u|g wAݽ{x=^^oy^h}zo ޠ_ o0?!P{È0o8TpoGx#F[PF{c7 A&@~7IP&yޔ_~~M%?՛F˛ s7ʟ̓o7ʟ-o!Bo[ %R/j_-'w] ׿J*(5_㭅ZoԿuzyW{HitO秇g3B> ̐gJ<՟N<~$w"w&?]~AyOA_/ @__ /|qK%!_/[+&w(헁e獿_/W Y_x+U}^ů _xw5:_ݯ~M5Z_P:!}%7~=}o7ϛF~cy~&~S( o7'wo %ߖ~+hΟ6P~-Կ~_3~'(.wwCZ=P~O㷗߇x_g??@<@( ??#鏂? y1XhcqPOO$wO'C~L*/Ӡity׏ (?x3YP,63۟9\A~?|_"yEbh%Pid2_ ex^W=?WC5?Bku_Pz Fhm7ϻ~l7Co+46(=w; .Pn{ տ?AA?aT(Ǡlj]'ݿOnOOi T,Y?O<ʿC_@ %^Wk(:~oC~/7'~x B Z?~"wC</xO}AyF" #筿A(?JQhE CуĄ3XAl8 @Ư:FgI~ !0HDAb'@O$ A2y' C>yx %S *HM[= 79P~ ssy AEW *AT+U?UP~ՠW:ԿA jBԂkC0];Ct@_,`(X /qvK!4Xer/V`%2X VC~uk]ٍdk23̔Rev[]ќFlE=ӟ'3սiC~o+|+U߭o O_[:zyz?H|wxswx}B}|}O?=g^PK+ȿ&{ [;|!|}|Ͼ/PW(|߉?|~c߂񯞹'EÀ $4,-C@GʗO6mC׆ y HBٍ39!E< ՟h3Co| F!h =;Qx^EP~Q_(F %3 _( Fȗ1B_(rFyyOy_H6ݘͿLy?fĕlcs=<5A~13 "(_l,!7K/52c9TrcJ(xX 6@X 5A~/zc7!D< [3۠mvyۍPw;.(x1o#wg'A?h"8L<G#QyQqjqIȟ4NAq3?cY?o\"4//!ٸqWkqʿn 77i"we܆ow]?wk#wg܇|`@Hx ՟\fnf  ̆P74Aol6Moj6[73o| %f+ȷ2[Com!7ۘm=jkƿٞx_#ߎf'h;lv]jvai" 6@}~g9`$~4Ad?BH[-~+ M3[}_Y[@h A? XC0(7Yán w?7E# #B N|xDDy׏"ID&w,@QDTyD<#N4T  ph #<ۏ#gQb4-@#B+Ax(O(&A$&C~?ELT1 j41xwPg>4Ss?G%7yP|yP B(X"%b)T,X/+W_)VA~X Ϳb5b-͟b b#Ql"{ fx?ElVxmb;]o  Kڿ[!~{Wxv? B?(AayGGL'~'?!N[NS=%NCψT9q_=>{\%qWUywU\5qjuqx [64( ]qx㞸_< xC${|hvcOS3yLy/>i@7I<󫦴-)<>IHILF[R,M {3ˑ3QPGPG1#B~?N 'ϻ~M3IN&w,@STiPO!?] ΐ3=>*{Δϒ?[΁?G΅?W#7P/ /Er1X.\ R \rWȕP[%W{|4k]ȵo\G|@<տQnڿInfjx*Avo;;!So {#z|t+ϫX>!wz"/<ϡT x!Z!woP ?B͟O3_Wyߠo;AJ )2!o*+A o+xPZ^*?@%?J 'UɈ=?NRϻMRB)U*yOTjy_jH<9P#JK^e 73/L*3U,*+䳪lϦCgW9*'s\ϥrCVy GڟWx|*?/ ϫ*DW 7T<>{5RX5򛨦of9\| Ւx j ֪ ۨPmU;ȷSW AuOG :[;.]WՍxo7z?C{^Rު/WPAP 5@CPyP5 j0'W!?\ j$F(5Qc睿c8yᅩSgW]?'PD5 d(͟)j*䧪iC~ퟡfB~Ex^W}:P"~RGQ(:c84 (: S4O3PϨ{VNxWgW!Q]"_]euWUyUu k:O_W7o?nAR=?@w]yϻ}y@=xCx^#yD=S j3xs^ϻTW5_7Bz;y׏#Q}"yׯ/+?wy] ;m62v((?F?c|X;oG/jD;Ɏ#Q Ŏ v4G[1vLywL;ˎM<;xǎK<׎ώ|;T;!v"'C>#woئ+E<߲/lI=]!FNI<} :N٧3YyYǧ`石C}x"/ڗ_/Cl_W!վku_o@wþI<} ʿe߆m߁. Ͼ}ǧd|`?$#yOl?!w~b?j?39/{a_گWkyk ~ ~G ؐā|'.:'w@7 DO$?ー1<>1gw,[ 7#|(yrl(vyOkDžu$P~'):ɠ'sCIpR[S:TNjO~ $N(?O뤃|:'=Od|'#N&y/d8YN6yW9١A<NNN.y?s9߹<}%W^'1xT TAT!0_)"NQuASN yG $_)RNiȗv@Ser9_y_"J%2*T%cU_ͩN= F3;_c &NS7uA7sCӂxi tZ[?Z9NyqBmvo紇_{;8 ;;]gw[:ݠnNw(ӃxpzB >P8}N?( $a3A`y`gTggd_?:È07g$THg? v:9(3IP'9筟)P8S=?LL7͙Nәrf{3ۙqϛsysC,8 "y"g1;K/qBYF|gg94~˝Y *ȯrV(ku_笇zgot6ϻ~nr6C-?lVg6g;Tvguxǝ.v9=> P^gw;8!Cav@?Q18TqI'SP)44O;g3Yʾ~usyyׯy_p.{~vѹɹL?y yB<'S:ψ_}<;/ yI<{鼂jk 48o!y|㳳?: v@x7y7;-xPp~'w5R'_ҡ5uȇa N^G|sׯ::2GQ(:*TT ʏC>A7y G%_P~~]/ B.B0u(.J<._1]x.%ԥR4.e=>ۗg!_^W_AW|E] teWU _EWj:_Cׄ|M]x]K׆꯭?VGׅz>YO[߆种tcƺ )T7|3ݜx4~-tKZVPtkȷm F|[v=4~utGu'Ǟ?tgyכּ@]tW(wݡC{^P~/ݛxC!P"_>GG1T }xuR?O[O3_}g}>GٝOq{5՝F?=pOB'S?l=3YyYϹ {KP_r/C{j*ս5:ݽpoB7[?ކ{xWb]xCy}D<#1Tc 4~OܧPOg> wyᾄ P_o㾅ݏx}r?C~_]ߠ~'w;otR_??? TRА?L@Xȇ p= g ) 2#D| AG v|>j*߃~<߇A_ x7~sA_5rsmCA8Q=A| o!wH_)}%OϟE ~U;W xWʯ5G/\G?:뿥/ymw*+cA_!ͼ  ;cn 9_s8f_sq17☋1☓Cǜ7r̉8q̞cVJ}E1cYp4Amr8nÿuܴ~q븙qע?!FWtB~!eHoYCl_㸁~iĐ,EDVFƿ8r8Ha+\w^y9Z3!jתƳ?֐'֐ם>DTyl?PG?D[w>m )"5x(O\;&}_2x>7iWП\ k``,X0 = yݏ5|쟿r%9ֈ%C?83xs5篒!}ϯ|i90jϜ =w/'1t r 9r? ק!-ʿ9߂A ~-ν೮EИ%Wxr<'#0 IU6 6 Nbjr ZdCOLORRAW AUTO 0MED.H AF-S :NORMAL Optional,TTLMz @B@8 @8 NORMAL # 8 I  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<<<====>>>>????@@@@AAAAAABBBBCCCCDDDDDDEEEEFFFFFFGGGGHHHHHHIIIIIIJJJJKKKKKKLLLLLLMMMMMMNNNNNNOOOOOOPPPPPPQQQQQQRRRRRRSSSSSSTTTTTTUUUUUUUUVVVVVVWWWWWWXXXXXXYYYYYYZZZZZZZZ[[[[[[\\\\\\]]]]]]]]^^^^^^______````````aaaaaabbbbbbbbccccccddddddddeeeeeeffffffffgggggggghhhhhhiiiiiiiijjjjjjjjkkkkkkllllllllmmmmmmmmnnnnnnnnooooooppppppppqqqqqqqqrrrrrrrrssssssssttttttttuuuuuuuuvvvvvvvvwwwwwwwwxxxxxxxxyyyyyyyyzzzzzzzz{{{{{{{{||||||||||}}}}}}}}~~~~~~~~MODE2 3SPEEDLIGHT 0207FG\\ZUCdk̮{el/ɻǜ 3*]"D2ęlGqr@Y2Za 7NުotRaz;^&.RSՍ$)"JqzO_ʕyǙ FU)+U+ڰ1+4uaRNMJx-_CQ3A= %Y+㽴G=\Fqeâ {d L5̄YN^Un%P3+ћxv7P%n?+5W)Nҧ!/KEP\vMiWb1LgYHzh|,5Z?CahLgg-Bȁ$2Uo: u)Str|?5b?N[*2-MgQos) ŀ˹Q G{(R]Jܵ+;,Бoj xsVVvcxKjo,; R'#U8牮v:ߡ|cpq>",BS O(̅wa^a3i9}#hgڿOFF 30207FC]Y Z>Aar{el/BɸR3dDHpe.h/g_hpĤb?{Gya<բ_N[0O dS)"ʏqp˕|:Gɴ'U('S!ܴ:-Аok xsVVsx jo,; R'(T&㽴G:ߡ|Ōpq")٤Re N1̄[O^=`ԉ|#RbeѾOwLQ*wH8dm|3$#`itofAlSY]BFi{0201Ru]Lx\bn,G0]d]d010102CUSTOM1NORMAL00100Nikon Editor 6.2.7ASCII |(,,JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?yߩ3qjц("d[%YXyvT\WiiדL\(ѬY.5svE"=Y\is 2Ot=Ҭ(yt^8mɦU_\ucR o:,|n.qPI]F.p nC9X^vy&ʪ8y,7hOM97c "%Wċ| }?ƎV;|Qy|HnGjEm{Ch}twfsH}Eqv=nHbd^)>{3%O F_1&$r؊`bAqp}47o𣕊cI:ۇO8Љ-r:p9rfJ^:8?~il=:~a OjO'8a}3Ey<GZɂIwv5f[C!yd0iRF"/6*v\MMZ\ɷT6p/1x#<};V͹D;X25|Flo&# 61o*)$Jķ6v[r #s[RGy#h|Ji-uosFIv'{t' 2çXU#8^ݵ ^I1S/tm|UMב`SwJb_ ;yǽ[c퓌 }zFZĠonPg8[c <1]_~:;/_U>OZgh=>a4xVСW$?l$㯡َ dH԰O$iWN\2!q^3ןґ#Fj sk\f]. 3зIs"m0Uo^ErDmI5srɑMP&H$Ĝ8*+CrW^Bbf=*`v`0w`6qkxA#nOL1Rz 6"N֒FU9#=+~Oٵ[G2e$qگMWNw̢o,lZoE捃:pr~lcj(IZyXoېGcpE\ol]wu۲e89Oָ67t;;imJ5 s&S>^~QJִ/'rƃ>| aM\onQ0{Wk zuUvG(+Q4PsE 87q'%")Rj8^]6!MM:Ɗ:s^'SΓ12]8GCx|{x$& .μ5(S<6/xZk%dp2ub$R#,oDtҽOx*UvRd}}@1cVuAk_{r9IYؿ^IS:20C aV.{9 eYIG8ߙt@?f us>ҕ5Ew<fyFqq!WΣ{7ڡxd1{g?;Okn6o(gR"m#?J.Ù,+啝)\ 6X$R2߻&uk@vd8$F9=3vP P,2zay6skdYR8e?tePcW}ϒ*I eWssy[YnHSn1A֩J+0x81VTn7E"V2$/6 :TiRM-ͼR9Oq]\~o]=ɶG Wi9mm-\<RM`$g?9*>β2jI{c,.b ʘ`ug,bwy:6VxTӬn4)fsZ5kH{a |` {Wecey9[v~.OO]wp=i0C:n.).s7A\ ?ʬoH+̇ݓ}t᧗h qCѫ/^IlljA]ڹ'G'(XO)llI\抉i m W}3R!n{hiX.;[b; 萁"WmRnj[{v: k)6awDqڅ j^N׭odmRX۸bG#C$vz߭:fk?uɍr8uq9dg泖mb[lq-)GNiRio(?ZQo:&xﮭɾI9Vbxncԡٮamm,YPUQW%HR(h*Ȁ{sӭe^&ʺU+4w6HI#-T 3.$,sc蝕Ѻvj~gX<)oݢ.x-{7V\1BdM1Pbu#=Rih7G#+$bz!U1J&zt(SW+|ݻc ze[\s^gNoS;57A" "ߍ(S^_Ib ` "26I;Ư, m|E2}Cz֕jiY [s$ir-ٰ =0eU\s"޷uǁoooAa={%fve\)*K`i늹;bԖHӔ5ݹ3p<#.5-N gMqin܇ăx8qI\# ZB615ķaUJJpsǸ=ZKF4rK"ǜȌ6;u\wܕJg81 kq-h019ALqgXMf}C #tcd#tH$$~BBӮ-cRV@̌ {׊T,4l_ VU, {{,_NI%.l<|yx7s w67dsIϷ\p;V$z\&y!GMG w\0ܳ!p}{!{"6ʇ+;9LId3iZ}V[xd qڸ=.2I_+$9qIĬ:a$Ke?Ӄ9bW6i3D]Tm(QZ!g/0 珨#o V̓Β(%1JٍӤi/-lgTonN9Ӛ[{q؅9I{w0.u6*g3)5P( ;$UdEL1sE'|#vi &JK=?CsR>7rG1w4b%|95!+l78W2|aZV\Ur?]X,GqdѦ:lrw>T0qJ'`v߼Z<)P@! zvդFoZqG]CD]:UX @In ==J _7Fd]@4Riwps2F128W8u j/92#pOE<]X{Ӟ5<%"|m36Ӓ=j-S0ɧ][K 8;HT#0[SShy&Ԗ0Ȧ&/ƛHKOYM+ JEv>@<ڏEIwLB+Xl4Qm[."5gRu~63_S%ҭ=,WPRSwD%GS+_@%/ť $Dl?tưR&5բ? p9Q*( NB9P=6w&f3Ğԋ+r cѠj6MSiճlMzJQ@֝(D0oZR2yj@kU5yڤ> ;p'O sn(Œ$*q@0GJ;z `EqiLdsǎ(\Zk&Fi6-J#z Hw"g?hqF`9# ۞EE y;rҀ/'ӵ;@ {@PFv@C  !"$"$Cs4"N!1A"Qaq2#BR$3%4Cbr5S&Est4!1AQ"2aq#B3RC ?5Hemw@M]urRh;DHQ *h\ʀjgSN-2FȘ!!wɑ==*Ae=OPEc9S4Q*?~ɏ1{u1$v-AzM6gN>wk2!YrùK;j٪n^- K-pUI?*s-܌dˆRvm\M1yJS-ºN[o$'?Ҭx2A2wG?=EZq֥fJܤ S ;T%pi'zP< SFKBxХBs{ZVi<žI6HS3zzѷ=%*R[fzULǒ{5=B@0 (A+yhx#Iۥ{sJRڅGc\&8*bҁك@5`THI泲_ I5`dɑ$F5jcj (|jrSEmITPqS"\hA] ?&㻏ErE ]pHlI0dR&;MH2ho"ޘ*)vݔ4X{ IҕL 'w?6)DGj`=[Byj"P%2@M쒕=KB$>h( )ZdIAj$իԳμ`AxSBxR Jv1Wɞ:@~S&ܕ)d$wRܮv@ !*:.?)@yR Ԙ—Oj'C0T) \ $@P@RL9"E0xT `I4ԸchT8Q*ZtTmL I[U@vpuCbrJw?zט)OΧSkMm3czQIᇰG=H5^SRӜڣO{p;EcVaĠ\`Bg2gTm5K duUvbdj+L嶧Ӿb7h'n'򉬋 ..uG i坉sxU_E謽SvKtLܓd/ɍ\Gȧ hLk$S `(eA@M:|ZޖP(2Z*$\+u6-g}Υo3-UrO15%͸= w~OaG.GJ $w}n~( l/w8$Ga{qC޹yDO:[ylI6{.3j  ,z;P#֭\ ) $zz*{ג0Q(56L>;rƎ;)n;R&8) YEpx*Z9s˝KPкK& #zPI=+auޥߨrHIWwOKVݸ OG=j'QX*N@,+ozXk =Ҷ"P N2_ Р*Ψ%R?|īڊQ#o#S%+Nܚ\jW@LZ6~ڜ%JL1P0DrT@H`J uNL.U~٨Iuvs[|DyJ!J,MY%)Iz.=zS L]D=mqTޟMalR'QVBI*Q{'..- A_Sz"iڽ3rѹ qްC{3vR>W:#l5w3j$=M%Os0@n@:$"|O3R6LBvL$q>V+:v1I1ՎlMe¬Kw!-$6R>M6_+9~-ZeXPMӈޖ\?M;&;;tf#)\nGEa \f@v'0ݬ ?8Z3Ǎ$M<@s76W_[@))Py/ k'nEԒ"Yt'i ="f}ɫp}f*f}DZBZroZ]nlM.GpbW5;8B5` Y:'4R7I@/NDj4y*D?wxW6|D6_XU&=(;Iᆺ%!SWM(m3 =KKжV[QWJaRV[/;}|ĺ_ܔOX5 ”ն /@1OO9{rx\}(rȒhp"m SJTw.-Y9׈bAX Ef[2^49dm}kn[oɒ@nl" Ӳ~kb ^\'*#X`3 u#!X[v^bJ9 \no5r[֔zg0CxI~֏ɪ"bmbIjBVPjG%0lMZ-͎%dO z5oq&/Uƃɺ[zc$59{bC,;XsWK`mw6JVGH]j5.K~[L&2yuטMknnK,^TI Iu(n ViE[ՏRIJJ@>vd~<}sF?-\j?iO[(NQ ?OzRM^ΓNw,!Ȼ OA^]QBvR=*uV.ؿv'9K[/)e}w8K[v l^2[j[oZvN=& P;נlڇW;ԐOY#ɦvqn+#j}/@^$7S]J*ZTU W1S mcẁpG?zen+ j7I):L{&.wr8fMˬ)]IHx7ӯo2}7kf啸 9ģߴSEc5kx,NنVM#XMganZ y@HVxIk'fZyGY“թma[1"n2vM6e^Sn@"5gw9M BⱋHp%j O>6:sZF CP; B*SI_e_]x\jA08$(Ž[>>Z>5B *ivmRm8L(HTBtޞs2oP! J#f, .\zu Q*oPA =ki]FvYR|\SkکUOh˜ 2VV-4DZs s3 =kr*ad&e~mMZՖu;tMJ褡^㸦-Ncj֜ɋqeVٔ{calookg$S'^^Yʛ)@R9' vq*q~hBcFN'Qb~jI{A[!PsRǷj+9̩%Am~Xc !"zs5l 0䌑m]e֟iI)?#Y%dDBQR`ק0끋 6+(Ɛ/#w3XGwOm;%s0%ۃ"d:q%N$DZ4(*@4qp\;xJ%J9[ OpQ.R W?ZƊKkۗi֯dPmCRdkM#Zr A3YOnab*pR'jsCd{Zh-R[.vҰ[R@ @1ڣ-A۷jz6Lu *I~P8ONѷ FP=I2GC5Ԩ3=@4!A)慖DdH`Jk6@=ڳ$9'ڬl<(QqMm ϽL4]|*#%;:},Cm8ßi!_VM/m aлfX}ډg T'U IA#VqjmrM,: G r]a̤?w,\X۴略e$GZ5w V$~8LnM][yׯǚ: OP*_+aq{$#̐L) -7|`>[я0(RRacQ ]ٷRT (?iW޴ش[?tU䷟ħ~mLIVқъرXXj*26n}P69Vq8Gv̩xj !:Het^z?֙HVȀSӵ((϶TIJDcUh,,Gi)g˙o)|emE G)jGGct>"K+jl9'{ut_qƮP7 OFK3k:9'JtgNJS~֚Nh(z̅Ңpw#m]nPRϨO?8csw8ƝqÍgcI:ѩFq[9 a*HNgAxPk?~p䄶}<3mf܅y_J`"f-mi*peS$ctR $oը3ifpyD.z1FKèۏ WQc'Ccu}㎺.BhҭY5ypE,CLLҞKcnϽ|jaO%x'iιW 8R` ZaHleCinxv0z 6M*>mI(ԅCe yˇ BTTGevj;pnv%e,]Lu ٻu4Hn k'hMI疷Fk#bzѩ{ $2j&"եη'O(Yr{jz=j-o4? +Tp+*ԲDDfe~.$\#֟rI[-%iQzZ5 KP\EE^m!>oZۨDM܎B ͺXmhIsKM,Q~Ñni %Slfӆ)?XJSہ';d>%$֛R?*_{O#qfy=)ޘqw7VʟnijMlQ/z_B1Lqz87dTA-*ޞUyKjW oCEӗMT:L҂0؊?Y򈔥0AHdže6P.KEZ-4Vqʵ. VcFZC6؀?vzgQ[\"J q+=j+]jJöLZ!jW <(SqTgmrmRv;Erüh@%Al ~kan4l+rT}o^ V(HTBR crg-f<#'^D˸ymlHp"1a\䕉_9)po▒ plZD|"hQbZD[9"z5c>%!݅T{mNב/T{r)u_(]RПB'+3#@d$5ossl8ڧGLHR=8-+ [F7\\+{:‍\HUĐH4sA~ѭMhG2ӾBR7$IQ:tZ?G]`pZՒqJ[? H)k?кIK{Q+q"gj(<2zV[s~ئذL!^w jTvJz?Pm!uQrn/m I#N8k G)qEPHAYH C]C[3O$mFdmCTJ4^ɲxRH$Hƭ 6rzOQjIQjkek[%$murG^S%5ǓYzU M}RO$z}kaa)zRGh-?SF)[Хo2WZr,5O?>MZ2밢y eBIF֜eˆ6keW)O19#7K_ev >zwI[fR~$-x]Բp[wr\H+\ڞ[RRݢJĤ)ȑ1ǽ|H.3{TZ{ #cczQgo`'b:}5~7X,ԟ4 #J\nQB.mTyE n VU?B~՞xf ֧e.\K6(%)IJS%Q?\+GnP.ҷ&#MJS4"[ełGҪ;k3'x]FWNy2?{SvڕnuBмȶ RL;L@czj5_3QyW=jInHEȀَ 4g1(i.ʋ{7/8Tx*S# /+Xj4%8şW.~ =}5OfE%}aS;t4f3zw;}M!WYK $o~߸j- e`IYnՙumJ&^xG֪(q& =-DDz6<-ծڶnn.aL( ik?8`z”뒏]ՍC’ JD{u/cKk%|kZnlmx Z<1U|F^gۊBHɏȎԁfqHZ/[q+lTXh4[uZ֝ovDFEFw |5%t{89iwXc.<uGzOSkfƟӍ]rɹ[*@EuaU9sMIlW4 Cm̼QV7$c]?ċ&n-)q 3U-cNLͺfܯKj`)$HWlj_!m{owC.(MKXqk\}UfH< [O/NZn06eI,#(1̱[WU94@wfLO6ᱵgd۷wyRI#ڨp 45O!'y3^]{{i,o 9k,]$1E:lBZ]3!ke'x6 Yf ]#iP;|Z\cF ~P^2-F\ri/iOo,Kh*bګMb-3Z^A +$Ot/S^!9ozVہhcW\0L6u1"7 Xjڔ՚钕|B[I"TIJ|yՖ\)kdPq)OMq)6jP[(|t PI3ՕC-'!IO=b%*q+e.+c%Ox0&&y)Žp:OHH=isݗY]z[Û4XAA :;Glr)jV2AxT %bJwOwәM쮗itH$)&zy;jIJ40u3kǬؽYSJ#jrGde]!0# +ğfW(66HSI2[2$:x͝ ݍwM%$J% #l9dYtNM̭n:-ѵghKO$9IZzN_[xb_lY]Ŭym+sbdҳevܱiYmJAYS<If),nq `9>BY$gҘqV8(!,L{T Xy[U[k'nwIs5>E:d׏5Jk·6霒v ~jM`h]JTqzsjy>.PxSsh He7.a~`V1 xEiGZ[{9mdDc m-ClI^nvokn* M}51FXv?7*ڢjg#>Jgmܕ RIMmUȭ(a4޹=[ ~N-rDB$qޠFdb0(ev R)ce҅얱[XBe HM).7z靶- +#5𭊾w `laЧ_ Rb?jWBfRvC9tJpALqH]:ۜ>Ёw4 wkD?Y"\<.헶_BVR= Lq[tOi{cg.-d[)PMٸnVX.6I)@3o vRtAOJҺRզ"텃fLāW*R4UokwqU J]ZA&A=%̲ H9Ӷ{e,t4+ڡ*eq iHZ=Yi*͢sEWBRX6%=B{Pt#lAԚOyV6NA y~C7|(4Jތ8(Z㞵y}ڵJ@?Q0յ5[~Y q&jϑ^䵷l$sڮEN GZiwoxYuBV;'Jʒ?V[sbWtЀғްMٜ[=gvJl…=9-gGltIL޶!SUd+TE6&~t1|"T*p#9T/nG*$5c;T'dơ@r8H)̑DHrbbJz3`#,*X #ɮ#Wa[8 h<`5[&@LSXSpS(=\ݢ *Fqȣ2:nJH5++ [oi&+5yC-jٲgv| m]yV'KMdždoBFν\KDCAz\T.D*J'zY0,KfgN?^hGOMsRZiCӱ{pRI_z.WGMno\iХLB?$)' .uLu|}nJH1IM]ј&JG">Z|f6!fY_h ٸө"5Rإ %NIJ%Cq&) ͚heN.@Q@T|V옭-376ڑ\5'Cvnu6XJ>=Z,7)|[l2ߘSxkG5]xl޴-a Hc{S1ku l6QinVToQ #{ImR=Wifޥ^Xq*pD=*QҜ+~fkTJA;Ln)lWwC˶ip$)Gc5ʲ m[[pJ=5M'䖘LJR{ JTţjnUR{̺@s!z1"`RXa 9fI3?-k'gܨOՆim1>c5-o~k_u`6)tPI\ދxn5+ɟiWZewe>Uw.[0'IL5ZѬbŗ񬥍Sl)(0z^R)YP Svs%Reu:}y?+l>bH莔Pc[L-/pݸ(tnVO!(W7vY1/@<мzbL2iKVkLSm;B=Ĝ]qa6’S$(!JB;Ӧ&#pD/xBĝ oY{-6ngZ'bUfب*5)isǥZe{}Iag~ѹ+B {ڮ 1gmZ>S\Bz?/Z̷K0HW𪟎:q-q|N2..v% JUFJZnb(TM\q%i􂴞B@&jE1aIuI%3?j=TӊK$G3IJRԬF+FQn.aaֲ*y49.< H*}u Heg=cc&,"M6O0){5I^9aJ'^? Sҍ7,Z}k+TضbWlp su5(@a9֩Rm2z Z$)PGM)3JKZK<Eөx'4)vңS'zQ "i H?4騎J) E@#E*Z@ֲo]ߪTL!k_Cts [^*CcO@$q'zSVGk'Ոi`[um?E?^< ["4}o VU,!B@{Nu:0oG,׬mostpqf@ Zx"L29K_xkarJ:ՃS,6SFV75jRJ$n5J_rc(5F3::BMU;Qaw* ةei֧ c3.)k䝽I`(%hJkϗXyaVYRKc<) 9:aҗ\!cp4 }î!HJ2:`-Z'/`gm\7IRyH@?7%Efx@xmeԙl;T1Pz6FйBRIu!(IaT&_CIA"= -lTQlr69 ”u۵i5KHΖ ]ti*ÂͻMcJ@E0um\.%*'k2J$$C&$\|ˎ de ̀S֗kFOȸeG4? DFBRTy&f~zN܃#v8*!uk외cfTZTYOx&n2|Vm)B%E?vZyMpco- "Bw! _­X ,=uĸCTAO$>~[L[imN\;pIRX9ʕlB}*dfJLw8Ch/_S.;m?꩝>vR'qXHpP :.([6\khI'tsA^sot)RVS JL 'rzeWObV+@Cl!Άx s֭|@84چB-R/Ej u'Ym=|o0ON/KNEuPrOٴulS@3)PA hicd=JhYt)I%fAXKU _uɷyVqcTy>Unz@.n"'exCxvqI6[6JJ2=⢟.Apl .RC)LO ֚ =қ|}>HQRlkAZWL)J?y@Dy4|hV{ g~][ IT=:+VANP؅~+iͮZC]m\Ce B Ld7|]k ,0*;{M\@M+F]FUϬ%n⡻i#PVQɕE2!錃va- O^{(9W y=m@jDDyBO7+'0ūؗK>r9FۓψTܻv ; lVuךټ%qְ(L}OU[eX>](Uo< ?t?Yڵ1o鞸) t 56޻G:xχ{25^A}U={]K̵rJ =콥CvJV7Q\o?n&cqIV0}\e=RO^kV97aP VoqZ9oByZI)QD5{dRTQI5[n,|T )xeʐU"dG+6Hkۡd.jN+ׯR5S]༔Ij2J2Dbe#SrRU;QHc8ߝDW~T?*ahV >j$uThC4SjR-EZx,e?xUdL𹧗<º3Wq ҸuQU'kc08Jf͞K:(\il< j2AOh[UFewE*yd "ಡ))ҝ$2#MX~+iAw#@l $mD Ξir_AԋnTUٸ 0"޹ %w(m";Oގ9>YT=SyD>nk,\}OBo' )_WnZ@?*˗7 >p@ڟJfxH{Ihܺ\.@ZJPPUlc-' ʗ,XZ=_Vp^z/z[(\[}ܪ_loiu nk8Oa;K[k,٨4,ٴIi{ %^T׹@FDn;7I&)*ߝm;jlSuTdfnk4nl[.èRIXVb6ض nNTsu wU5a? Xtv*? P`PQzU6BHAW 璣͊',Ik)FEsUÖ;JԨ{ny`ŒuK~J"AQ $K*-HAblӖ[۷pųm.BU$}m#m֌9i%մR;yIWuNy :eL nJWa7ƭ+70E%hJVݻg?mɺ-I3h$WUQn[KϢ~rZIl!-PH0)q78OC&ThO1ÜyW? j▱f4ve-mjTLKyܸŲvبBzT75uUk̼ ?ɉ>ܵ3D҈T_^pJQz1 ^[jqR HwW"ڱn?vRۭGj04\26&ldv3I^7xm[ ȭ_\^`zkez(xk&9x&(J3{L霶BrCۗmK +DhSwo3e貌i}0$_3zeJ.Iy?~o8g/YJn!@GUuX\4fDhKIPkMpCc( ;}S\9⧼?I7 Hk#;j $Ef^$$1ߚ'Vb9lZt+jZa'~酧jJwlRTt5t{NPr68GzO%FII'Ԯg*vf8]02Z[O)?5ӏFr#F&<%ԮnmuۨO@1ރ@6n1'Bh0Mڔ l=BsPg:w@?R_N'74׸앋RBJXSD-*EfE/οmn%$=2$mּiR1y:צs4ݣ?PJ>RYd*<@ʓrGR t59?.&Zo- p0vX'`T8:IRzaE [LV6GVLTɤ{/tEܥ-e Z內wJalu:ʯ7MJd 1@NԬ4IO&{{QRRQ gt%>Z nԼT6srpy(.4WoO\FRM3̾tq?B@,nc.݅'wDW ]D_Zzspb.IOUt]<:`Z4ӣqx 1ieƓJ׃'Mգmʖ؃z5 OotN=* y+;#|2VͶrobӡw컁Z+ ݛ*Eͫ H N?{?E)*oqYae"f,ILJg#^RqypxT)YK˗W^[qeXJAxfOhoB&%IvM!{,G5Oؗ3w6<+2ܵXˇub?b6^+i>BH>IY8 v-l[Bvl{xR[L(AI' mZ2WhRL2ڒ_h'O/][ p$)E7aˋ4ȕ?+[IyNQAQKM'6CEmqa?LKR+(D)x#}LA\DRC|?Ďqڋ!"O?LE*wzp9 n&PdmLH&W'B ZbzUOQ6Y{cөq E͍G׏%<)15bLu#jh!ߡڔU%S#.Ӗ)M0e8{'-T:ESJI?RpM6%!e$yI JdlV6̼., DO#MxgwsT9{jm:Z_?tZ2t0嫋KMy ) (r u=(~Lt^xRx7r; :뙷4l9vkA/$Aחh_xg#+Du&"ٴ0q54]r [kQRJI< iMLzR*,sy;{әZ!>egIP2y<&=ur},%H͊< ֖%z¹fc䳨4ڜ ʴṺgerGR#Kޡ~&^۔)F[JTD-ma0_\ClFҶy$** ެUs!zos \[!)SyrN_q\J8OVepN9-)(&IsPO!Ht`$A@+uaݛ6ZMJN͈@O3k1dO#!(D+)8+d'i t֣ub2 12yHh7DVi 2;{uklD\-,1v p7@:p@_@wM05z2q Pʁ>uQ6^[ W[BB2zv4RmLrʝ#?tŻwod,H+K& Z?Vf'#fn-%/rkV^fKVWNd8FA&H>iӖzix͛q`~)OCTW bⱘRh7W ITMeKܕfOrxu8+)G">83m.Ç2{a.;@f뻴b]H \9l `TEe;׊Қ-r'xZXLړ礎PRKa 8= 22I04?J,e,vJڼ%*gzf;m//mI*h)d(@Y0$UNaԸKlŎStٻpmP"ִA8 ?Ҹ\i.wy=R2ocS1&XK/!Bct{:iշ,2.!gQIH4TWbM|-b t0HƥJN 1ٛ0x H>$~u_3\&II>PGx8QT8ڣTƘ:N<]Y(_֐gFfkȖ2rɁ 3)^9kd7VvzֽɷoJmX}~i%JZt{!!*nG1j|EԚY; q%,6iP[J>lZe3"B._*@= 'Ul Oyoj4_g-i )JFߍԢJ`6~naHJ<j#VZj5{J^OD|ESCSdmx]xҢe˓SYaz*Y@ZTl@'nV^BݍA~rdH-A心ƒ ʣ=[j{7pP#܂j1r|"dcH577vIt0;s^^&l%J$kflmqЫP>% TwE{~ch[y.^KMqotu1ЏcUp{ve̅%ʀ'YZCojovx|ЍIOJyf.3Y뜑NpcY+6nݫhNgc[K]Xmtkq$W+^!m ޅs[\)6Cl폹y}7( I yu:rfV!0+-t{+C6n)@Lk,Y;}^\4mLhR9v.޻ j(һH(yN=>Ms"}`7ʜhIU-N;, D*'GZF{i :Deoe N'k@Z}=-H>Ÿ_6.:R#^vYw'}tϗ>~XTymGVH+8j_ܘ3sZQIDU4Ԛ>K,A+4*H gela؁#L" b2UWzr-KbA!@f=TF[ŋP.4oN nȸ[ۻn ҔADB7|]=Dîc> np4qK˂Ni t Rӻ`Ok34W :zJ]\A )GbU&xɁ:vAHd/ufIQTL"::#j6x-M#D~ ̧unRn$"7'n[/Y5ǣWZ(i ;^0 N0#V F@<x㘴F?odF䈙k|)-Vʺnc3iػv\8Iq^oNR Oޭ\&X/"/Z6ͩD< P$3RU(sR2\SL*e*rkk+Ӻ9倸ح9K 16LHT9UFw+}Ӹ뜃86?q[eIyWk/t Ցکi[J==I5M\s)Ď3?:oƋ"f6vx[."yK'TEjvn<ڇ"䱩+[x 4v.I;-T7:ؼpgPvbpRiwli*#( /-n-vӒ< *=.he!luKw1yd-j} H&A= DQ^r-.,VrR%(IJ`bpoUql>v&M+\(OSYx؇B4&k^/haI1GtU~yK'.H,[ !Pºcc [՟u) ~ 6vWfao~`j'oeny%. c ޷ӌ1gajЄ=Hf֘+[VԄ?`*cc5zw];&BA{Q29sJuN 2<0RTbW[kQ`5wyܕŝn,R19 YHYl6ܔ=Pctf=8*HqrvhkxNURLr8HIPL;^qbJVطCaiNBx"])=dv4|6~n/z^}+ L%S{>jO )|mdlRx$uu.e|ny PO8(ŵ;+̒"OS9Vk/mhʵuЇ_ٻI@ЁG\<vo<-v};*p!2O"67h5.}uZ.Zq_z>u*kh*k"Ų奰f==lqT206vt.|eg@=}D[KzacG"m}Ny5q'n~(٧n1}j< Q[*W=K]9gjZKiڙ)mm(HHp_B7Wh;lvG5a,[v7lR J^Ҥ}jbRA'0AtXp>7 y4.*(69xMZR )]f4Ո/on[R6dqOտ 5Ʒ~ݝpw(Gn2#(36#x[*uK*@ Ǥ&U_ -(uR2BA O,]E&I-A[si׸m e'ICdrz˹yWTVH|w✕ӣ9i_ԉ'0Ŗ5')Uu*A*?5?Y,1xT[;]x:)A$zBG)eo~\h=;JB?zbr6V˛bmVmX*`M6#-#5:ޤ.1[Y0jd! q,IQs5HTc ¥ELlXnO|ٕ%)2Yi$ ӭYX#56S<ŝaZJeMA?dYY!p9&dqJ!]E\7 5~-ˍdmnCDn,lK/U~vR3} 1 Y0-x[X#q]Ê=IqOc7itAaM$yD ?YMXm>[C{*\RDO=h4CJ PUؚW9c-y;d5ғnO.+ġn G@%$wmƃGTX<]ZL!%iA0'zywԎ,sV[][ń)}t}ӌΏE\}.vk$FM̋ jQtF+?Zmlbմ2\n#y_Rgva{C$!ՠl8'oiSCJ,3/qap- Uü)\š( aIT?jZ_JNM(Vz~,pm2 ԣvTBSZ|R0^Vyo㊴ l2Vxm.xn_a]& oWb$)GJm"jqy6Qmq$h$Y~Y Z&f e q 3Qb*iA_VKjǝPDk<=8ێ;B?RB$E9/..61 ਓ@46\~=I[)I*r#'NMQ1swDZ@$:iGTr̪ШuI1ޤ>J!B^!]eRNj`pPUf1\; ѷuMc>Ǩ=p^IƷR] %*+Ihc}tKa4_fY)JűRU2|I5_1seS܇v?dEbUCIAQv9~u+$6q}Z5桽S3kJWД -nb$mH" >:c-,]l|-Pw.U9&'HX{wMX2G W08*۴bOnEU_ϸLnDj+[C,2l/yR={Ui÷sl[mvk"W5%`qX ݫ[[% K_r8̾Ujkkyqp|23O-vG"8PMDQV ;6oDi*៶+5g>TunصM1ӹE()Wpdr"|n;7 mY7ݛ!Jt wR8Y.q|Yi{ʔG%= Guk?Zbˢ -Rw#Ү;[iHCAd/\x[k2p t6[ -;s5|s/ik9 xz߬Z!p@2k*C3gh,*HPI;}'vo)Wol5MIa o\IJe!ch"1RIq%;f%[AF glM1x6 +>'G1>5:MіFⴭᴻJ=#IjC3jn4>T%i}̙ܺ­ BN[ n\9#fk̼inuϧlmԢ T撊~ eۇ&p͕͢~K~Nd4e1;qEJP}'vۥW<(iyN;0śk//r”H#P\5Z-.9qMmOmJ#kHv/NƷY\C)m.m(RTYP)&ϹSzI̭$8N PO(=<Sa+q,✺uvJJ @wm|לezSoqUdp9N,j-4ܜc6|!g/ܶAlB^u2-#X..qy[BAW}cFzK\I <~H4M픶 q3kYM(c[]jFw'Snp۸AHڤiJ mmf}>eJOT|sP"FSͼu*M+iIr?:=GaWQ#mNZvOQߥenKK,m[*"XRz=h[F Oj9^^22ΟHx{QjȜp w9e&i*cG)=ɴ9hjt* UVٷb6MB?k$LPVV/#ځS7} ;$ &r:M5ZG)1O8?g6n%<5k3J@J` )i n# dtr$mQ#ynѓ1jP76a}uTg_Ig(FlP\?)\O38+,BZ{R,FuЄ(I?³Ɏ9IL s֙[K;ظWn:+jBJQ'z%*iJfuo<+[v_iߤeAkDĂ7tFי<[S\& [AI@OI g{j;V^f+ZJCdBr+,9+b+u.]]TrצQ: GBҗ}+nX}m: J Q]=$+h\\l/5?zio.۷r~JY@~Q %+$L֭^d.\mt^$R~7m=UR-~^;o0,qfC %FdL3Um4ͦw1nC/H O7Ef.6ˬ~mn-m $FDnIx/.:f"峹2w !wL|T4Y:Cm6~T0>58 Ckl,޼66ک(?b-/Z [$U5 f&+o&#$܆ٷ!O46e?o?O"A?!wEi˕2ͦUiXmּQޒ{S"{'y"HLh%D%E ߭j'i=kr878Hm7)tpHH=)#Gh0.zt!E֔;AgYzSn\m-Q$I$ߒL0bԱunמ@4 D I.9 ClpMŠn\$H'hi(JOdSrew=ae{=]qߵE۶Hf*qJ%Dַf5P 9qn^ b ooKx}cpŵvSOVҴ'g.2,)<>.Okm.bܕ!G&~ h=I.1 |ïOMBPY]0q>SIf=+> `?zfl9nr\)tqZRpaͣ+4œ }KnI=KI1PBA` g-j (^jBC-1`mCxT]JIHB#ZQjP Tilwi׷cZdK֞o̸S̕<^ O<+CUX̋md]UEb>P=&:Vzb3gtΥT\!f'x@YYs#nK WH>wWJ_OwPe5~ fi)o#HWOֺ`RqT/ "9II?j x 4-D㌼ )rVOmp¯P|'H2'tЂT~)9iĔĝ]dʛ B޶( $NZNJ,q6Ҷ6IBRyTTA Ot:JY3Ϧ3rJUfx==벲[/:?|S ǀk֙ejQ̬GԻ)"yWJD(E76tY騰smVlX~.[tQ! )Q͗S}w_ʪ#fRBPTG5b8oq.A*QzQ.W/Tۮ|B́F9AK%"a [m\K֥_VBx`VlD =JgRn@aB^B玔viQ@ CAvVb:OB Sǽ(ߚmӘ-MnLZA={jzFK $Gޥ7bF/c3Xq.^BV) vF" 7Y1+HaV@6a *}l3&j $ѡ D}G^(n=1DKO\H[|KBR+)h%T.nNMEWv[ZKcKyc |oLaJ.ty}ODN,M $s'hw-x{!dvMO$x/.v] T4wDfHu#+WٴO^(HKrqS'9rL^ZK28PC7 ;,\QkSJ֖ "ޖ])^h"/G x}kdS{w-:/c+A!VOzJ &g :9[>յL, ()Kpm*AI# i} }rGEI][\:’;xZK}bե$GKf$u9gK_*Bym}{~U\$S]Ym4ݳ["#[0Cd>zԽжy(qtRcW)[FǑ.ILĽksRqJ4{[ónE-Py,2I>{*:L溦bN>x4ҷH\ L8 >*<[T~ܟEyZT@|K{LuW%ՙD,ڐAZU qݻ95vQ5fE-EDJA0PAҩOEȞ -$= i7@4QGz6r׭9i*3W>KN؃FkNR+&=> '!jB_z:XNLIN@Ri7$>E E-* zA)T6 3.rG&hhA ߊt `ʅ(I)~h`e@" X) @Mi!=i7R@"aK:Ll$<|E?SFoiQ_XB Аhgx ̒G4G)J$+8!6 eGڕK(J7mPz@Q I'q%]M"u=i@BTA#K,OyJ)J+hIIg"bh(Ls=-հ$ ($ ԤDQK,DDO #޸HP>_ĽWz(u(L+`A(ld% rIS&GjD"fnAj+6pi2d9Yط _KQB%wwKNRxIS/ďa݋__xIj@$Hl% CDsXJNn٪Ug :RDRGRd1R7(d0RS12G$"O4I2}:ʁ-PAIM4 gEj W z~jR$n(6Ҁ В4;WA$0)aHOh ?& AD\ )}8A= I?ƇCrGIptdTgڊB)qK "c|҅mEII ML~/K+Х'O?Mӽ8uێa\?4(cNB i$*UI 7ROi( %*~M8H+BS+V PzGښt0 H&6'@! $LA@='i&e4RH?P1)%"; RPҒHCw:xG+H&@Z/ #Y +` Q&~.$4 Y4 ۰&b)V <@Ci(OUA'J O<HqӐ8#]J&$ ,S"yЩ<=)BՁ<7HM1LI1&<8hGXB@Y# cpT:ފ #qR4pH$Ty'SLGO'oD(=`EroZ%}D)XV:JI( ]ɚ&"Rb=bѱ|Ms+%`]% :BVfE08Ғ ;ӵ@ (P @5@74ސR: 4>Z@ +92 =;Pn!H\&}V 0#Rf"v>I M %\M8ٻw*y={H@  E$A2M8QJ ? dPbvP()4IJڒRTL")Br(@s\M0 )J+=~(2D+QPRG=T2& OzMRRL@- B=`QS UEܞfnŴHmGsN&)3| A Tte 9BHMFHm'yYP ?lLFNSKv[>pa1WLMK33jۺr~(А>~)d)D펴6!Eg ""U恆R1+P(&{d˞x9Wu$%֍ ciRW=Q?zA r80iHHQY{P0:[3Qʒ\G4ԩ+Jr`$2 D*Iɠ[dJ;i J@@=tϷr:G"IL\> Gq;iDH(X6P`DG@z2ލ$RaK Oj!c@ ]ERTQ(JBbx(YzR ޺HWD]]@ D0 @7Lbhuu IJ$ HށH]]HB٠F\%{w℧T~iJFIF,,65ExifII*  (12i$%.NIKON CORPORATIONNIKON D200,,Nikon Editor 6.2.7 W2006:06:23 09:56:32&"'0220 *2   :|B,8282820100? e JY    J B "no     ,8 2004:06:23 09:40:392004:06:23 09:40:39+ ,NikonII*70210            (2 @ @R  `>3 3 Nbjr ZdCOLORRAW AUTO 0MED.H AF-S :NORMAL Optional,TTLn @B@8 @8 NORMAL # 8 I  !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<<<====>>>>????@@@@AAAAAABBBBCCCCDDDDDDEEEEFFFFFFGGGGHHHHHHIIIIIIJJJJKKKKKKLLLLLLMMMMMMNNNNNNOOOOOOPPPPPPQQQQQQRRRRRRSSSSSSTTTTTTUUUUUUUUVVVVVVWWWWWWXXXXXXYYYYYYZZZZZZZZ[[[[[[\\\\\\]]]]]]]]^^^^^^______````````aaaaaabbbbbbbbccccccddddddddeeeeeeffffffffgggggggghhhhhhiiiiiiiijjjjjjjjkkkkkkllllllllmmmmmmmmnnnnnnnnooooooppppppppqqqqqqqqrrrrrrrrssssssssttttttttuuuuuuuuvvvvvvvvwwwwwwwwxxxxxxxxyyyyyyyyzzzzzzzz{{{{{{{{||||||||||}}}}}}}}~~~~~~~~MODE2 SPEEDLIGHT 02070n> M /pIShT`|>{Cee& ~hX DStmOPv0lUu.CS6.#(k4d@mآS{<ƫ42hYXIU؆ȾOEYU01'pYh34ݫ/6}fXW;4j->;.Z}C7niygrSk%_ɵˌlB|xy^b͚Na R4w(WcIp/ M ;13BX&>[}mzOn)7rղHA鮐ī:b괛UcӃ+GFG ZKﰎ)#r>ݙv(֠KZnHqF8GOx&+IF߰=䱏ELA.0Wr7)nOzmu32qJTNO-d2?8H+ lT`TFԘG@͙;[|?]賶zװa&m~]eK)'q`+U2mw>Wa?J-hSB;QS^B%Tǹ9{T]Do0 !VLnun 0oDڍ]JT{ 9Ƹ#ėJLyKaq6A-OU4C.U '7ik&K(s_Rde`Rzny\KOFF 02073i0M /pIhW_1R'aNī͊ Lb{r~@gǃ^g_t$kPvlU2,Cw6i.+d-j4@~QfS]%<ǹ9 {UJ\Do1!WLLV! 0oDڍ]JT{ 9Ƹ<%ł\SgQ~@4j-d+.i6vC-2TlvPk%+t_7&„c, xr_`|/隬jA V҈gSlEpzQ?2; ͗P02013ͺ`>)f/pJi]d]d01010#CUSTOMNORMAL0100Nikon Editor 6.2.7ASCII q|(,,JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?#҃֐)r=q\ȥ1t|Ӈ2G=YzEi5nUm;Ģ]ZK nwq֭S\Ou֐f F H#*@qҠ=; 4.pGz@/P2MP1qbRuiGgM9i Z&QҎФ恉cJ:uەqր<Ҏ98 ֗11Pr3)xP",b3F01G~:,M$e8cډƟ$pc_ʮ7RJ(ΥEN.LepB+p"zܓ5mF:5TT+:O56canh aJ9<};-{t7oIJY8ڜzt`LVjXqH9,9cL\=2fDǥp{.i[nvKEJZ_cߥ*=j]]k?@UU2<ŭO`=}GN\RZ:i R :qA@p@\<t=;QLh y44nqE;~tR3^ 4 X ]A$;%Ko~N9սoTW 2&VZ߆῁n.n.-b"e@^KuRrug5avb6/<QT>l]GXKoc!H4cڛ=%cw|i0:}+xsr3漉"K!o_YBstzFm<][:y=SXK ƛPŕ0:swVu$[F1n+9CxC] -VY5KϴKi';@v`dAm^ǯK#!G)t\5jLm$9xeU#=CЎS]Z:2}Q[&BCzRh>9* c̃rO}p>~!iʽN?JjjPJHS sҲTjsrŨF֒],[F7;R&Z[_G[O>j3amƧA9q$'kp_r0_1?*jQB6=$4q\6N o [9Rk-wOcs N@?kNKS^di.@ґOP/*8@=((5OJqN8<B3yH֔RS}m]>%u ֭XZ<p=Oa\^HGDw{1[ЊrƼVX9qwC-NqB-̲+#mc<֥eږzsY~ǨM}&9rc\١ X䑼98?׌->+QKwO9T)T}RIDZ&WSєSVN?OWUL XprrOϵKc[-q N3oeuxmmΓr/\Uk=FPiUG}EYY5bӸgMAQNQ JndC&%i !>s]<ҳd@RqؙAKs)յ&!C}qZnbIrWs8Rq|eh*t;MVc&`۴0]*Y EKyɍ́z9Uɼ0#=Y)ӯbA3BNÎ( -ˁAۇ]QJdGncF'n 9;#i`gAu$l M&ppJnVԮnFS@t֌ֻeXU,xcIeA'?(a߃ǭeRQFԚdLxeSaӹ=@qC9P"2#񎸪8g^?JX $I2Cw_SI4SLpCOOS{Է!ź?aFxm~ h⡺w fb< F28$W}Iл$첊AJusHY:/n5+vB1ps۶ Ž]yY:޴>s+YvdsOdڹi;#SMsPHF!' 51^wɭi?Kg'܌^6,sh+q@s23F=@m)C ,0GᚡqҵYr:őր9-N "Xh!ee83=o-7.p;]Z$eXtX*Ml?ʯ,@$d׿J߷^:<[UL* k~h_a9>q:ܣcZnz. "{s"DABna=i]EtfC2.퐩w8'/^D;?A'VӮ46-^m ǫQ6փH䵹ΑUmWRc{kcj@.޹'O4:8H{ <>W4V=q%|ǁizq+{yc{$Udu;}A:Gn*`,jB$w8'=B>5mF+icw?3r3Jo\qWfa@b1 ǹKIn0[vJ%7ws3 qtlX 69ϡgkgFжq?v"ƹ=@"do94f2Ǡ xv#K4zոq5,A0abZ)qʓ@Jq(ǩ@3h1/G2p;VHV3㹒%,TuhmboA/W*nc仇bzH [LV)b5 P?;:iz(b. J9,׵x=蒆Y#iZOayDlk p9>-!'=FuKQ #gcldXz:Mi:Ћd,c[aToz\rv>`< e%^-Yb3\*ҋ;.r)ʬpۼ܎ uGk-kWw37f0/鴌{tZo,ŴBsn7Fz5 SOf7L&`C*Ie?ֻ =wEk-B<x&%POᚕe?]c?0UiK't~? zI*#Ja}jN r?*ip"yglwXԧgcZ< m1SI8Z϶HޱVulrGl+WLc8r*ԅ5gxs1@ sE rsEJ0xP ĶW͡EqJf=P#p{0j` u|rP (#%,GҙXs@=6@$–M#4(ȮYpGڙQ]c -.W4ɅA@"͜FmJi l;sN?j%Hɡp{Ӫ#?[UBhx h'#9Q1\dwUE8s@o }B28f<{BLN3y0܎3HT!%&FWp_7A }[%y8Bl9;PLp2}*юO8 rW4ܞ !8ڟ`FAP=mܟ|vYAA#8R)qU bz qR8*; zA)R8#t9J@ Df?/2vJX緵G@Ƞ˷rw9)}@x0h@r+GQs\'>(P y>wzFRƄw5@Si9AvFPmnԎȧzeA&mW~E,k@|F< ֠G-w0q *@*`}~)@oy HݶҀY2ёʲ満dȥrFT?$NnQ #r@8`fL {H#ڪ>9_pil#۰s>;TsrI-c4K(O@$՘hˌrE*2ғkҩbq>H9\8RҤPݲs]8#Gb;0@ ݲ4QlQXc֞T(pF*0$v@r`qq-ؠ֕7"s g7>W6{zEڡGcڄJrG'ސչ'z!?gMʹs$'eUrqO( 4.2܏xm8=qJpO5JqIFFG`i}=( nw4B]n9<"H'4'&2**06DߞPh$jR+ d5A{g}(YA5*$Pn>jd =NޠqK1P 0wc4}sHYF\RLKI$Ԫ,G9P(^y$CNHyۆ!T}i?9A\|P)ddwu3E 0E+fッ@psPxڝ9L)78! ^x!sӊ%4QHv^'ݔa3CR p>d% dPhFHSA.ͤ7@rp*I 7Pm";µ8goz.wzC@ray`5qP c!j%l {B_N}($MSޔ$0|P>C"}h0}sK)}>^i g8ȠVbMrr; X0O4bP ⺜Lw#dҹ=\}i%P=6!Lޅc,wW,c 8zQsMd/sK~N\`~qfDkrLP @tp$)\8#ڇdrh*W0/iLircP+3څ{D.9bcD07ojt) qeSպ5,ؓ՘9|"9(^=#EN* `7P!tȧLga_<_{u%iw&kIDdbO'"<< $Eeݟ='T! Ѓ!;d?~Ʒ'Vh:XgOo5fGuz问7=4<.`zTUF I W?8O<==Ap+V+…5ϗ{m%xrsP !9*%}dd+y1҅#*hA.)op} H(Ҝ1qRT;SRPC 9r6у7~NG9*o';X('ѧ+@푁0Bq2$MɜFcC.J HnO|/Jk:]?ĵ-/J%u ժ,_SvTVYJxfbIg =Ga&:BB853dML,{"v==i5S,&Ѫc4#RmFǸpҵ8uU?AqJ./ )r*(ilg޻#rbJ' s@[}iP$,27{Ђdžp?4QG=.vYXaB R$CGfhؐO?E B6sGހ1Ksj"2 1L{vHN;REP 2Pi@V#(U㊄]۳ѱ3\!ei$<=(Q<PV#yL}ߤbFZM F"ȣ#SPGw8J}M0*PX˜kp`9oTۇe7 ZPn+FqB~ѷ9'3wvp1(d9Cn)㏊;@6$9)|1,F=ɠ cy@ t UR/ ǜ&y~*m`l`Ig} >.5kdcd?5:ZDZ cS~*KtӺL/[=ہKvcWwu6M: o:r {{ЍReV6[in^FRnI/O 8]!rN|ڌOͩjqF'"QTW~&7W./}E0=``&YUӡmvMr^ܶEK+<3.k_7AN1FsM9Lw{ e-Ԛ)~89ܥ\[垻ז6[bXy9L^кwWKM9*BI:Y`N}G|SZمN$& ?Il|f2cq *x&oUM~}=^(4o$-wahgzaXg=fx+9 0?c;J:mzVQٝa%=;F{պv@Wi8pÌHJʨlS7]??J;]h/O-[kJw ^U_I˻İAutQߓV='_ڄ6MIgv (O^GT&T׃ldpz#yyۓNaү E$Al,nk;.`a᲋+]гc@HGa4t qlg;'ӊՃ`1-l})2G޴~(Q]I;yIVޕc bv҃pqH9 3H¸$s}C+O+ހ*$`%yAz4̠Ǘ SCN8wۜnQBb5! qHpBq^&rpA9;z RW 7珑E$`HE֩AM~O8s qÃ]/<4 kLm` j71AVa؊`8$E9m:8H'qHqǠٵϥ8#N*H8rf8RyASM78l|bq[4ŃJD`e r)eC C5F˜+y|j@N>(TdsyL)O/n{Ӈfn1)?ZF$`zWڜ(6l!DZ/ڌ(.>+&r "Pi<5 dgR<O p7E7lj5.G҂_. 8T"0O (k95rXw֎±r'֕UAM.⋀{H3⹋ɮAy" H9~_߭ ! 8>(cިV(wۀ}]psg8IcNƜ?ڂ5*CD>@H{{'mx?SQy*F荙ĞEdMC#ӡ1g4f'?RF^徜Dq1n,Ĝ}}3_S'^vϘֳj$?zmB=Vo-6p$(=c!}f${z_G[ZˤđEpw/bJuJIrَMKs=[OXG{ygxd`{:ͧEtKyZD#eQ~OJtƫ7L, =*U?N=x]eySu&ѿwb}s^<+^S׶MeRXiYi1w2'y#\I;d}b;;B=+LuAVHqg c=&zH:m, Z[H!-JMb4 'c~7Nc=kxrIdM3?ҷ77_3_zwT9Xd"L?TpO>&-"۪tkΝάx,g2[K6GbֵG_Fv6|>Lymcs+/ 9$VZG΁k{՗f[-G y Iq;1x&]鲈ٕ5[tak=30[i{g-Pjd]BϨ cQɗa&٫-W@3qFOhmq-7$E(D"@2pG>jQZi@0{1'P?A utQWm㻸\FYQrI9XOVJZF~U<4Yos/m0=Ǣm]c{8DR<,3;sޯnb/?Y%HpsqEx={c-Ŝx  {PԵ&_=Js;q|-Yn ^ֹDԣ׺SխO;A?\gZ;[imGA֮-ҕ͙7}{i>_XՍl#m o뚜Op3~Eҹf^N:%./lx8+Au.tB9%Q煆W꧟ں~Jh_Y2"\r#XVG&m!G 'NR+mO-)! AけY :qwXjWhU[@yl:Cڗv1^.'ziW+e|3Q,W O+dWJ*TCɀ9]bsr~8#$rt{T<(|,ڌ"e&∞ܟqcU\> pҌ;U#qy8z0 HQ)p9\P *3ǿ/q~; i@AK_A^3BnCM!`F=E>f \ zc(d.FhZ5^TP0?0H`qE'4(oY o:+rN0S܏ziOF6v=9xbY&f8 /ҵz@&4p]e\=ے=kxG9xfj:W𽥱ԯuCMȖ$ beoZ$ԚP+#~HG$}jMVC OBIqQQzRKh(AQYBB;c]oZϦj٤F˜JDoK;8K,Yy? K Ḙss/ $YrOڦcnitΘygԫf\:{A7w)>iսjChW61D!#Pl4Q{V~K)ۂOҬ.(On>foOH VJm M=[Ir0N`dՂkzIEd;±qYx&5U,gK 2vxgߓTOޕӎ۫u/q)'yB'=7ֲjE4I&ʢV&4;TR195)^8->WZU9EσgJGl{FAEim$8LR.]Au`ё9OPtݞbż+22U#Ԝa?z.MF󩴝T4ju Mֲ`"HaW$~ &?rEW;v'+N2@R4;n[;k9S<.N q>k :f^&}JB'CFy plxuGIf3PsznӐkGv|I%fs' 8@DRݑp5]U߈_1Ns^Ǿj ˧vW $6G=}}:s,IELxxų c#~[=Mj YG̟edܐy``.2M}['(I4eaQGxKʜoCn3Qϯ :v|53۟GlvWzܖz_Zb l;<֊SK=BV1\mOe93ysN=_ڍofjI-؁iO(+f5'&3uKDwfT+bCCh-zAw3!Pz;:L-ݝYNqֿJ3XNX )C#ܐ~θX=~ 8,ǢNߚӮ່4N>ՏQjzM su#gp"k }3URKӑv {D>:/0\ 㞗|3|uH׆N8/Ofa,/NG'lט6\lW,(I`茔PI%Es!Jϭ; \r=UvFBFc(dzmaW`ޔ iNqEg;";`Wop91@>?O7`h ?j<У$ܺͷӊDP9Xcœ{DGh315Ren8 rUYBJW&dzW-<3RKI6fCLuυ$N;|WҠ>RUvY[K{tX(;c_a^ѝ,_MHXjځvNd>ϭ`? -ZM7YY#"X%UwsZ=\:kW[@dq'j3sӪ-,6=isZZ9K2F#1/ۭ5%|&7Lԏ@=kuK^a m^+DKk6GLX>h6MY%5tqc  `1L[j77 kYaRŽ)3ME I"Kv[< -^F;r3o#6}j$W%-)H䏒Y~ս]b_Hڽ]ؠl{?Z[k+2Zik'r51,7 c o8ҵkrFէӖ<::u.R4mWN@HAҤtFҝ#T: wЬIn$9k5kuHՒ[4I]FCx;[ c3YzLk.m(a ls 0s\%XF?Jd޼s;nT+}J٤lNF3wӚtՖsٲoC7:Us~SO˨-%q%GҳOZ,uKx# ,W%0U '>c}Mwh}؆KY2ZwC;vSzɹƳAd+;R*= Qe"æ:oIӠg[K"9< g@}WB4BO[]Eam!SIou29-(uaּo<f&ߦM1m7p6k>;7lר)hd_p ǰ昻S==`VR&D@>qm5!L<})/+բ >!\>wڦ']6^RHX}6^|U1@9.2z6kgj-rU k>i)Z\7)~߾+I 4+,R0*~SԽ7pb~EYXd1&u»*I/;WH.w~]=?$s_!|or j4SwQuNL]*X.+}h4kKՠ˸n׹ |#\Q8r a>& PqK˩88FV~Ft 4\M\`3@ݍy',x гeE7v88>F 8r {]jp qMN~sJ{n<\T> Č0}iILqL8c1N=hQI?-W|2)G |s`. x8 ݽ0+('h T q\krrqN(I$h0L;v,Cv{,F@ß.)9<ӽCCA8?}E v|4][ S~od:a*RC)drH}zq5H\iG4*Gg'CA#N!Y?Jb4,c;kr0s@5)b{JX W4n徔qT-0Ќq\@ fZHb鮪@pX!PhHeBvFrhQ}E"m̘Hf*B<sOїp6s\A1TK)9Fv)AU<|hƥoi^\T/YJ{l}_~#2jhﷀ)늬! =_A.|5[D %vr+nf9*][Gb}껒7Vl%M5qO_MjPFI>9dۦӫg&7-w ;J OS&r V_\޹״sPִk$i96]M2+fIG=jۂ\B;F  a}MZY_7E:Ym%fxڧzhk֫tmlF q(mp=~+_%6SDoKX絈cr=G]Cz'WIBi,r[D9eA 8]|ktQ}/3qmA hm{՞U, Lږ sX~daf.@H[˗O^}GND^O}?Qkc=Ō8'c&)skwzNYA#O Ww-ێ#c )Qs=G%yoB!Y,|59rPzq\1NWkn:n稭cӣiC,%(}{mضՃB$Je;] . ݆8z]nXW]Zj1x:Q4ŰҬKu7WV#߸8>j텙Kky8ǖzc{m#NUVuk$ ޭ4Wt.H.e{PVdgϽ֓2xAEq)`(Rw$5[Vt֣-lG 7 s޺ljm9+Pj}iwt[,tqIݎHd}]+A+yxf>5 TaT:$eCs(ABT=*BUү[?z?De'ڼ t=\apDði|"ˀyZjJQiԺlUQݡ` ֽK{=b5 mR p|Ï2k8nDZ̳4D8^=}08RK'B2C 9;T^Qju{mED\B0{ҷUǦhPQp5߇=Kד=RBߛү&Wh8Ub03c\}k]G'9*:$RHt*ȩtG*;kaYպLfFŋiKܹg} c'ךnFq_b*KN`׷ZDJE^4N FktvA?1\҇gtwTM4zE><2xm8 )s^54ޝ_mso,I0; p6}BtwO)6_p>ׂ2kؗu q™LnL /p_: OT,êFў7;j^>|ocI:?JѮTDkI f0qPְv} }Bv%&6?5U'gUKnsHuc+ CC0h:棤"XHBq #85>cM.sǟ\:ٹ_H7@)ye۞խ7 x6 ?8\cեfs gx${1w6s>_Z'q\} ~ &`(Т֑#W }$rtf>!YxUɣ.qq}~V#ޅ8 l!ʃj@8;)}x/Li28@F 8(P!k GUYNg6W R1Mɒp@ҀA <=;ӘV R* *6`ӪTґܕ*@G?iF-v4߇"qO32p(A6#ThLx4|<p(ʕ]@g*ޅg l~&G?"ǔ  dؚ,i jDž!$(Hx= `C@%޺.kRa>߅}ouUwz|_R^9mؾGkzurMn);7Ŕ$gq~jڬ.K%Iz+i/ul G#gLG?v!\m=kЌz«l^NN^kKSU@gc8/9myq $$VmPkr|qjǹ>ѣ95RxKRҮӣ[1^<jnz<mu֝{ķQ_YۧN/b:FigzRN,91NbE1~E随OmGKt~`IIp8cB0k72,xe91PYYv74^*'^l5> =c^\ imMeP9إWdy YT3*c%/ C DDX y8ϩmNi)yuvۦ F;pq'ڲ %y#\O|M0qe€HLP>GeԜ18*Kqr7:xsȽp4J2GRNNNF8puBDH4;AZC5kK{kg6^Jw0ٗ8b.$< }銳LxT}b]ZiwJUedq[k|H:Wir[EUe,1+69'1LYγ[ ;OrTp)6^h }1 jXm=[e5ͼ^,4Pbu'ݭ'SzWjz4O Ԝ}O{6tJtܦ-{'}l,bkkȮYD7K8fۤ`/2F-ñ+ ۿe#VW1F!Ykc/]dh ~{U#m͟RJ~75 +{ΧKHO/;qqc9iE}:o^Ys[tkPTZ=AdTǯKD5zL/O\ii>PNj4f.nc[nUmGMdfݽT:eP}Mo!m:[eeb$ɩO\·z&M>U<;gnGxkwԚ3jv=5\[MnVF=$9/ t RJ~k\MDEG#P#$g99gtYQE&O2rW+JI9 |QGM)9hT}{0ǥRAt&JP &Q ]ޣۚh#-l Mcsһyݎ.tb {Q)R0X\*2~*EF16тI,ZL<4 @qI ,bq`v#oʭ/s#y $ȧ 42q#Br{r)Gr(`{O`GI'9=]\d`sA]c}h ai WǽkPa9PJx,ێGl{P=h(BX ANg8PƻOT ;$]J)dǺt+"b wV~Å- ܏SQt侸,LIԽB6v澳MJS'jn߱[ooDËŪd{zc~jN2]F <2b~g.NI>\P{Al3F޽oe&x,GXxs'=zke,/:v| ;ydS?5EWZEmդ2r1un{Q\Uq*:{@mQҭcGr?Y.L-^Rx4ˡ;`&,B[v&v7I]9xP I%%>ZK]&4)](rxjtL]G`bV\q ׉Ww:N^i\g<ovKS~/oMNK3 };P0$c ǸT{rF)3'OZc4Bǚ$ ToG(丱GMRKLLc>R%Ρ=X\zܒ#JY_E#=kz06O:s^rb5m Ժorf]ZLYq,Ӗ?jk(I$+ge<=HppN_ g[j޳sip!7{y%ȋ}IַUӮ-zvU7\L$Ucw1XtzZ7^5D%R X9p^M(RXy/'FV9,s5mNI]Kgi»pw9˘ձR0~Ն4li&ۊ]A e<R7r 7/qw σp<k;Կ6 W{ŮzZ9'(2\)^X `VNᳲmF N@>g1܂1HC`:B^4:֭ʑGPek۬z'Utv;m9Ixwg:Fr1G"\4;X}2%2:$gOں >5hhEs@Rߎ1ט>uD:QD,O7X Ψ4~?w [qkmJ >m6K5 5*>' .dye-z*5u[4TõJŏe@2bzӗv'T\nN##r0K$'Jo 'nӴ[r#}{7]V<(\$Ұ]ܑ<0k DVJ'2Rm@m]]ơiw]e w0U΋ l[i/4beG`+PF #+4ߜ.o͝d6xqEʫJ<0xkg)v 9 zz$^.nw,m-,wmP6aݔ`5'GEկH J >!K`s#5]ӿ-fՖ[=ٖh81޾.ltDWK՟ Sj~Q{+=F9;w2! d#|ǟd{;E(yxWXجÕ#"YV2@6!jM$.W  FPvRJ\4oZY{v_BjP5ljpghgB#nF۽Yiz̳֡,L3Fqf/n]}( S<,kzwJP-^n;5G?ҷ/Q_D)ktN]2\bۏ` w="axR(WE@<\ék|ap,}*}(d)V ^<%c׊!p'vzzaoָ8RN;f%hfl@FNEwz<0ǨF A~\7#@@CtoN0PAQ(% 8c\`0G~i[#>3P m?qHHsNBq n  B/Һe;=;TO$>h$_UQ0}38 GuI\(Qڼ)z_>|[.OQ/kZg!_ՔbXcr޽2i~GMWIuNWz@=֚vLL}@l5#lmᵓQK[fS{[ Q墷b]7̊1<3nNN\5&LӞBq׹h9ҭ]ȥp|_A>cyt51'==+4kG`kTf4Բ3 +D綽T>l#}Ӯʒ`7,0G־n5}GZP. 6 ^սNu!{ ԙ/n@R}8'װ&si3HMhcG=ٻRm\fR(bAc&bh*~zmDQ~b@C<arq+OQvqQxkZ\39kF?$ LJu?IqkT d9 E" 9 > $Ac|Źk!Gg>0`m:K6Mmr4r`2>FkM~ k0ڵ_Ses\k}= ZlLBF#FZi6:k#kO$fw mVh r B?ÑyӺƏ.GOeqMZr]Z*FpN@E*A8/~ƹSQݎLK(ՇAiwڏV gu 6ױpvܰSjZn[4K  !PoZM)-t:]&%ͤp^p˗`T83J2@-ۆifK@$={db!d(PDnY&7m՝{t qa9}b|WEa\AKӑX;dRTgnYt%PC;$E<)H 2)>ڂn2]]٣.?Ȩn+${ dg0jOYֵaӆAyCm=m^E&TŦrW([2dVKy IHa0LLg_ݧ~("Եpb(AsVo%hʩhV[]G,U9MhΝ~00KIșJאAtif$:`H$v ~աu=G=nL-ݪCGlnMY/<5Ԟ(km>[e4W0EMM[P7wXcR})4],䷹WÓ'pZ6Ѕh2pP=((ʒkX=E-sSP#YTlET灎]},8D"18ZuBh^C514︜iGXicms Bc4 eskRmE4ny-OQXt~2@..mk)'F;ǀTSxhQue6DŽhsڲophcIRΒMҀJ:-ʱI~H}Tbq>ANvŽ~pqWWM+GmCSoުKw,Brn32^=Q-3HRr''ۇERjiC%|!R~Oc5v^O.?$Kc*l|rHvzuzDntkbKF@uY^H#q':{D:R"gAK1ʹ'ک` ۷ԋ{Ь{Vbn&M65vAGe2U#0ON6P8Rr}qMVX$8Xo"+;qJow*q Dq5Ԗ;S< E#׹7i:Nsaqwpp{sY5LwEo[!J1|F+z{MD\lf?' ^T՟LꚌve$RB$ Č Z枚g*5XȠ*˂Ks+K^ojZkJg-D* 1l[`o[,4>^#O"mN?O&ڵ̸57JC7$sMy#iMU>䏪qRM<ƸI8BTg'oɤZzOLqB)8$B,i>A=BNp(H'9s@7v?)@d!4UPG_.0ޜG`r}j鰣9( $|{#~@<})y~*J1 ٌ/8+'$|b]J= .AQsF>[9D'` IgN0bM{UuC!ezj[ccޡWQyߵu 2>y!Cڐ.۰29ZYr'UOCiu @MXI*FҼuѩf]/ '޶_5UC%usZʱwo.F3tLבjΑ(5ӵ-cX 4cZ7W,n?h. fAꅇo9ۊaG]I|䷇XMU-tmFLbƲwQx%֬Lx5268`~iV[+uF,qNT-3pd/rA)<~s}#yuӽMmo{6E%Ҍ)PJI龝:WfUr6j]ZZnB4#/WZךbQ@qhDZ'%Z&@Ψ? ̨ ]sQ5mBXHPţْeNޮڳZIUw>f-bn+<^oyz(@j.b0=W Z01&2Wiv's;q]G88pyT 8 Y/gI&Ȝr@Un)PF[~?җhIg c?(8q}h1$1("Eilg(cǠrm\,1&} $f엽7=C06w&_jKMJVigP,=aҺwcK+Pi C%F̘9gRIE `#}c%a-<Ԯ,e d2L$H29R즳ɵkn%YFWԁ9.(fiq)n)gKzl1mI<v85n&=:*Z+f.vU'Q]XZEƷmaیbBM޹ h fW>+vy85-Gdn5i֑#DqqEuP[[֤s7$CTs:Ec+&L/WEԵKȯ/yl"MiDjܫ)7?zjVR XTmqZ{WWctW7@D=3ھk'(Ng6ڠ];W#mhG>PL[_iF[y!UKvoB}r(d{ts ;精|r n&If>u+#2;}+p៘iZXj=E5숶%R݈q >*tb:5`dᐼC'A99 V/zB'NKY[ b1FfobԞ}sSm&[[!H2eֻk ӹg(u=ẵs* @O*qe [+n{]Lek` rއ52tZP5 `ۓyڲz΅\ש2YU%@8p#kW:kViu<{k[,yoa-=1|zw!ߊQgK⽑ cEgs啉/=Rp0LӠ}J+X%1>]3I5۷io]aR>yMXiEp֕,縴TldlVyfZXzg[k)=>i䐼š%@=ԗk>W[$L̹'<\0^YRi\IX Ɍy9urM& F9ݎ3MYθ#ܔYҺ[R5Q;n𶑵&pISj\h'MiZ*@=sm#` Mj;i5 fY_+G#$өs->8V]w1W2.{Kqz6ӥ$RH(2sU7}JzL E4CoqrI#1SX^E̦6H絵#wܢr{#4Z܉Aʸ?ƸݗS-1Nk5%σc+tnTЖ#r-Ie[kyZ2PF=+eԗ%ޝiܳZ\Im+G0r{~NkO8๖]Fo qYk\UUmR\8um6IXѲ<2 x9@tky5kkm'W3DTӕ&OldU:е"K"]#=IB5ͮe06N7BܜHk8Y=JFoY mj[X*ѡpo.@#q՚KI01fo9태Uխp˪c}z63gv={nyvb xܫ,_1'cZ&VKzVQpȸ*6҆)j$p$w3d$V.z7ns1JTc Tk񵨅,e"g8UYRI?lS1*G$"),J#\3[ȇ uk3ncd$WEV'WmimEB-+jHdž#?鞍ҵX|FӢ徻$rOz[tPjtkK_Z>d ?U"p>%.Ihb./v Vlܶ(nomwϖ z[-oٕ-ob<.^/orCY]SKB.lu+ΔYD%|y$Hmޟ5MZStOaf>5ddsA Y1c.o.Ĵ'g5la>S$s^aԓf/kkĨ>TSVAkhkC KV!_b}}k3tu\M67fUvlVˬa%'oaqsh'0K 9nVH29(}H腑$ҁ cf8Ձ~8Hj$p)e[ Ayep.dː>=(v2|R5%dy>ǃڛI<|oBF0zV^Fgԑ@b8Q*Q嬖:Ŷh ,ִOZ2ٛ)FR d*T}ZZxφpʅdb 6qR>ƻcd>+Ci?%ۼT;2'piO9/õ 5xh;hGxHʹK(+,+ >9 Z;X ;y4;dFORkvA|S:0@p80*<2b s v$/x?91&o&%\{]q?+9\%Ddl-II.`DX{nzWݿMhדkVwP_ rX qZ~ko"튶D!ZV;/]\JJE.' Ҽ_{:EoguPu7P[ eWRm|*}%DĞZT[rOol;W% d8$𳼋)Ccp>az힏6clPcS38 AYCvzv]@jzMru&5b\ApGqFR+)O|\jX8 Y\i6֯<>[ƉbY3!5g.MT >_D}Nu-o ɫb;[-WMI$/u'd'`%OKYkܦkzdU )ʰ%ٲr;WGCo-Mp qVP7ԍFrٺO[4nd_\Θ, )ǭ\kKu7S&^˽ev툛, FVqjJ]pcM3&KflĖFRw{}Yw+jKBɧ( < ބYۋC[ԷH. H@PxUMk1]B(Lvm}2pI)ܞ@V{{SKVX<)@$w a\S8a'deb"nѮҬu夳$ci"bʁ/ ?;h%Q2 VşY$EqVjwnUD@>@>ߊSKkwn,ǒNZ?Jcqݏ'+v8<%ɢO5?}NM:-,s hHzHg-3PQ<1yy2 ;X^=jL瑚3 [`^b4W-]/UK *2$_G8%<)y5Nպ=tģ*Z9V?U<+yjn9[1kW6o}_fZaZQ\Vlz!xqB۲xU2<_LخhbrrrsBgaoW HC$1#¯XM` _s7!0PI#wcWn'&UsDpx{ PF}ouF1 55F7)> < p~kVRs+ IO$|T>^?20rZm{uJ"o"py }ՔQa}B2;$k<3εÙ->~dnb+!w'V^uo7\AG;Ud8|$%o nFr+-O5:M37)zi2cZU >O8x#Fد@[]5RZMJ?SYބtWT7P"/kRzs[v[VD/0+=xK-g]k$fH#@}Ee6Il^5|]O=M/GMX4RYcwn>ت"%5#/er@'g1Z^lyUd!ڣk= =M:ǨtF[ PcnY}꠶53 5tŵ$Om` R>k7.Pv!G] jkz1Z_5nJÎ#j:kRҬ "w}>ʭbfܧzGn1֝ZmJmֺT5ï/*6_7;'&|ڽu QaeM$-Esì/t!t}8 RleI Tc:6hPVEIwjz5a?N9<7酔8AeNAi@( ? {v&z ly*\_:⥋Ynʣ7G7,UՐ`;mgxXꍼXyE#.%fc(Ln6{Ge{il-#ZD,NJQabdD^&HՀއk%nxUmszL)lD{^v= 5k2J qּaVEwyK01q\qo :?ue8#Z'ot7YdVQSD߽f6_(=o%f%9olW]gk:KkE+[X SSGn$ @\*r=%jS\"4[MB3vJ:G0FL\TGsx'L۲ |G;eZYh"k[H-N݌- q tCr&E}RC"%t? #ՏNz=ݬ~im2qo#/ۉ+ e˓j/%zP)F壷2F /=7>(5=mm;T<}Ak x#Ie̝ &# 5h<- $4j7[?N5Do"NG7@qK7z6?UQNBaq{Tq | -|xUb8pG?\UtQ`HDn#?7FymEcfG=c nuse՝I{ӗ啣ʆM "e%c5gEҺ@!W6GU!#W>V;v+bdT@0!Ol:]i"Μ:g$WFY ȸb@=X >.5>m,%Ǎ…dè}yzQKἶn;@cT@zʬ@s)VO7ƜmۛIWiy08Of4]KR$.h'dUG\ 0s*~Q<6:bfeUy@`e,n;H8h4g՗:JO-^%ήѤ0<p6Uj62]z)L}CCֺu Ks}bR[C `Oc"Yޑk+[yk0$'9〠ǯҶ4J(-zwWq z;r16?4:D/ ߜA-1{K}jFzuM7*!7 ϵW'yuBQU,$_ xKk4Y(%IsڛBiw pp$P?% DG#?lֆTb3p-Ea={Z-#S~ndj9fbyLI jcɔ&]ABMRmi" tvAv ![qSS=RiUmwVSwWK?:HPMi-U D$%;wԿ ~׬z}IalT%X+q`ChJM H4XsgcBgx\xAga9SFx_X}miF  H$3ك}q^puΫ`5}F/]E4vt,HLc]dyRcb,,chI,;rѱ=jX2a8£ 2IB:AҴhL$F.v$c{ڦ"C5LmJ;[(ǍZaXy|5PG \b}]Zej=o'RO3 "*׌qڽ /,H궍l`Iq}>OAM[CQ$oAX+g8J?./6nr%/1ԏ^մV-z#N=?O6EϟI WcEյKP2ut*b@r4b 8A1e\100Zi#9ma9hӻ W~u=3l&Dsڹi?׀=9\)Q$G 9E>$gة?oR+nc7U+dQ~'$SB5jq횉#{=N3Rnځj/> 6;3]4I_RTwڠ꧜?siY,A?Ja}WӪ- $[OVeC# 뫤h7Va' x56:Fu %\bMjm[F"^p+&y7d95č_pT5+q=,Tޞzo; l$EQI%b۶ОkQq} /oÁn3jS[ir0c$<Ҥr2j!?)92sf(ֲK Ө=L:=T-2ZTOd 㚥 /'T{Ie`w+؃U=%{u]TW- J\2տVjuQ ;9lmB dZ٦r5ꫦ0;)I#r.>)~-1==iHhq [ Rz\ R5mmlc9`8j/VMż qgwm2Ў+)ND+Xۦ.x ^3";yC'ZD7֎0@dx֛r鬅oZhk;hpd;uPO dtgn~֥æ~>nj07 v>gE.u 8 V"U}ֺW-]NVV&_ E'}=DѡҮ \ŽNC Uk].H3W"i3w]qPiKe"uh?* Fkb6*ZqF3Ź2" e?E?Җ ~jl54 oRBHdo0jFi}V|Df`smSYv=2),X{:;=xԖp0]]W :in:M?A#TF;[j㺲o;[GҲޥَM4Sc=b)?O JkEu#VrZXɎG%Ay;*8y2hW}*;9mv},,qvV%P Flg5XE-ޡ,r>$q?@YJfM'7RA-q;Rk]^v5nEcgi0>tutkeÎ'|(ڤm>]_M>ѱ 鎛-<ת(MN `1MGfՔdT^5ٞdvMht[kc āb%y/̱p'*H{~7H&^UیG?\V+i(S=Wi!8E\a3!;~γV 'e[_*2XjG NqVΠI:khD́+aY&c W6򭦓oo,<#6vڤG҆V@.-x']3 %%I_Ԍp*.lWjcP^F$沒nDbECbw1b>w <Z^Lؼ{M{mG+u.+MBT "$Cq(ī9k &x\Oڲoo;D}OMhr#y$Tuqڽ?RN랝>u&n[C޹9jtޙZS9,6ή>jZiezGy%*e CFO>oVG}0#P'#yzr[sci5 aUy{Bmո,C$~)}rI:MjOm__|=dH# 3Z^+CAmJM kdҵ[fp9uѷVzMϱBܞqW6zWzA,YNA?#5u5 *ʭ fa 1.;8mහVXĐ 0 ~RF>Դ=jKՂ^G{{& )Q ۋ3ThvItK.y=ϭZj/k>+VmBc$(xb>bYqe{?ğ,b}e""$8 iz?Hyl?4[$.\Lw%Zt֟6 [Xa[t T8R@-_>it bXH!B S $"ݻMџMÞ:Rm6(;DYS=cu'R^wu%ʡTi&x׾lxd|T^oOZA;Vp,sd=.?е}K?[[7DݼqE'1*o_Fãz۫N'/ZHU(PAey,{NZӮ5_tZscαƩquݍ|QkVZgS%ZqOesi!w0:L|02$WZjsC{4۪AB R;{* < ͮkwkze2DŽ>s ꎝ}gXд9ׅQ\_tuH~Y=Xj1AI"Otx,<=W#[ 6}QѴ|k $. GVPo5cJKxZxI8PpS9=ƥRiz[X|KuW,B-su֛tkCbnn,m pd۸#9hZ-:[1yӐ[D K-Hf @v*PIk۹"u7U +F2,=,y&X}F-PEm>@  yx_RZ^6zU~)ek#@zQ[c^r`j |yqqPӭ-n'c{MyFjڌp„ ={ʹVYYr=NXHR|W$.5fH0dz"$QĀ~hZ\Vo)!B#v)#j>)yP0(Ǘh {R4 J#P,yPqD#LA!e;IC|ߵwI O+0*/~.Y<u~u0RNvj<ҟb$&~ʸ?H#_;c64c!}j59Bc;[Q쭐;# ^R.sNm*l}vRe8Sw, qDqY' Rf's%e\ AY0S^9B{M;K6r=+οĺd0wvg3Y4ى6b"VHEn*3)e<6#;}3G{\C @,ЊLķvLaXr*߫5%:U ,' O#YrPݲqf.){N/>]Ag(yH89d^o_Zq[\j7[>%m ߚ3kaQ f,5>?m;NnH8#8ϠԭgJ,upUhs>jZ?W6ex#3q5u Dzlf&ivc,}ceulf#:^z!?(42 +LmO \\nWAF+ԺG ?ws=ȫ/wro/t*"-;hUG@[K__M2=GY~7Mtx6&Bב€X<4mo? ?ޮ˅{]=gYdm}ɦzKXgE7gt fKy{rGqX˜Io&'zr\t։'EգS#H%X%ٝ >Mh/^/oT_)WhneOȬe?Fj ͮuy$R%aφ Sz𿡵-S]O[¶ҮׂLj fvJƱ_s*4li؇O[ɧa }m`}p++77Q/t!BF<.11O@9n,e溕 .Z;(EMX?U>@> rvr5F[ GZF?Ho#u%2m攱;y'8Ygmyqtu͢3\E;EǦO#k9hUuUIWS}`ȠU$RpZZ,K,s&F xcwMuOt|2F_H :NnpqI퓜TMa\ 4m1#hȑ 9#Y^m_-t#B"\\8&ORB}픽Mb$۾gNu sf|OLjZZtIH ?5~յ;)8br>:$zCԺQc#٪[ۊ=l|]._ySV P=ˋg/( 'VK."xe6q)2죟 \hiW֚-˴v8Ddg޼Bcl8<(wGi-(I==3DN\2O:]n z7L|( 4C k:Ÿy?j2@݆?FjDr$sϠ5:5.>MBCw0 C!ٸq<~ fƒ]ңe{eI#5^U1I8yzG[i}#UhStYsiv yO%cZc&6{um&x/ \Dض ÷U\ڮ^K-%[Q pyZ0enT iU[T*t7VVyR0]Vw"m/ r117w8kmq~hN}[E8gf3 -Ts_8\Dd`"R5nj#d|=7ZBVT,v@ea# AX^:^Vp ~`(YO?l=BIt굃QՔ5ؼcF+x*G޷~$\蟈Mڐ]iib}F6đOz r^6鞹|)I+ JX@* NߊkmsOtth*ɖ`X4i-ְ>C 48d!w (ޭ:"tΙ-VCxÔ|pF~jOW}GZ^7P]ʎ`vAփ znm5-Jzu+(zjK)f>/4T䉯( V ߢ8mS1m9fw߷Lԍw+È'1djEӮbJMۀO$Vj8G>\/ ͎I+^]U-̠ p>[X0Y]Gi] Z1l$o=mat[wͥc{hbpai <%5f!v=k ~[Nm}98 Π[& C^N3 2}95PE d;bNI"fJh7rF_(oP?zD@v@jvܢG=[_uX-a? qJyy7`Ѹ.U1}i)ALߟZ-H@ϥk([ʿLyrq˟H |JHBU| @;TSDyr}hG*@v#<'ޣ!^i~rS9pB⚔Kp~)028zP D7.W8.rsE+>…qϰJ  ]@Eo6x7zyGy#!8.,> xLr;cFF'׊mVB( \T[[2z2?j8UD#$r0~hVc?cJ1]GcD e'#(H]I$P:({M,eޞX"2 >oqɳUGV^6 rB@Oֶ)&L[vFKFc#~%HNLqY:lS޾͒?aYeqџ}A8+11d#؃^.6Xmm1mBݷڼZ"ceajn5C*9.fPM,kӫ`tXnħt GafzۣnmO]/Fֺ̊9z?WWtZj-KWZktb>xm|n99T<1Di}mŮ^H&%C͔t֫i -m'Y,Juhn Zf>UTޏ<+ktݭٹ2epCc[%7[|Rt[k%XkzC0SqmO`C ڈ?{vOqE~?E]BzR^;hH8RcxL5^-'Iq"$UA˱^P_V7=5}zLS:UިĢXQAnPwc=_ ;i[Ac'c C~Z=t[.똞u1Mݖ6w [m2WrzsGiϹwZP57igkQa5噹7N]6XV q#+s]equ>.ya5rd 'S+ Q=#1 \3mXM?M"qYI"ņF;[o.,-@f%㷛I_Dhc}[wVK 3 zVIrl3J%`"Yfm3^t W]$:F45{ G8>¼R7sIceDwdw?sZ)ӿzvH킒I6E25,M^obS˜~&jPjZɷeH[hG'_4^ea*Ag չ5[xI#vC1 c?VHVFz;տ.d*[w-)mnnDC9QVEYe,noT>Юl"_Js}֚jy|u ]Xy|ƷOJ^"SZc!\d C^=`:[P鴄uoq{Z9b'{! gf?0}%{p x\؂0@)f.Kxb:yX.;uM$>H9l>#m` [ J*[٩ ݪ9rOpdKzucJ^?9kuSMzs]ͪ˦Zc$*6Ðf[RP[صY, 3<y>B0Q,,yǾ\ܒ@ ;kpUm沺;}@JdcxsP8Qi]5c6]yyH3hՌuZKݫ]=:tVo~Z_  Or+ZECuUͦI3)>0`<`wi7͢YG$'۔gn_q0}4lhJ!/8 >WOh;XZFx7HG ~*>hiY'[ gpic2Tz_JP#ܰD[j>򙲸9G c'[#A.fg=ZmwtV&[fFG5Kng'xu.ceܰG4jm09UVi74m"`n`[OџѰaֶ*%DĜc9F7(C|Z%˕ ǿlm@.HSj`@ ]w9cxzG;qN~@G\w "udmc֝V/ v(&RN >4̠""NC<}(9n=B9WQJp8]P`eb!M)P%9bp},,j;0TQ@ޜSnc{Pr&Ajd匊FYcQn,y8Nƭ䉰XD>WpeOoݨL͟ު/`3jy/^skp8(L~qY}3Qan=c׶]DI ?Y.bϧvsYy8=qqǧT3Z xY[*Ga,wYUF~+1hOIU59E'z AE 0IMgzlfZ.#ƙwϰ"t.ԤtشNe*."`^٭7]= Zfb~e(s[Z\mqYޛWfM R͠`d<>t b[ a%~JlzS;\[p}~O[\n%Pa Ic^2k/v—>aё-}) d;Z>֦v)$uVc':3g%C^t:ߪ`;lI3ڻnX=ǡzz:R JX`Irqڱ6/ryu2-$yG'$d*..0Q7!UE=!1hױEwwkۙxX |gVS~0&iZMoVtLu֡%柨Kބ |ya .tQ ɍ{CWuDO um࿏{2l ݀\z7Y;Hu[4r$RnLL^Ae54Gf92܁jOմjhdv0{+ޟ-JRc?{VSFo=RK9nRB?Qn;Z{ՋrOaUzi&Qo#ǍfޔSԡB.ۘ{9g X1Ys+}u)3Muδ8*4{;{.wKklBē{}Qaxu,l$ܑ;j4kKDobX.K!r0aޮ5YsHѶ{UB?@^\Q܏OmVeGgmM}[<,y1dgێƻ:"D鎞-o]s{D@p OdEM@$!>~:OZYӟOxͰT) <{ߊ֫S|17;TVdVuJСXfi.D5Jn;zIΠ}_]%|I. sC;ЩpIysu#;qn9sQW'm2#d]oleY %Cz/J}SФbͦ_#Q=UK+ouD*D$n qsmweT,;I\psHϳ;$K?Woh{sax&㩺{y5>N$cw~ u]Bo twv/^hڞ. ĜU<ޓL1?j3xsTOls,d}NY~i8}Lc:ya1x=)>+'$]gĉ^CW=|+JULlg<nFOkSFY.]  p}ޔW#<V 'Ec'h}R.se}9><)/ֈc$gހ)Ou$s]B:H+~)BϽP[ɪAUHrG7٫gLmH KlsQd@_1xN4AIۓϩvT)d@q5>D E6q QuY9Vۃxԡ!ɫqQUwp6Xƥjx'L\ J\ìd<ڌ`=[O Fsgpľ>^}$G39vm[k]`J*jDxYc2S㒇Nj]=;VؙD[i Fn*b0}1OPsuo Gl7"},# oCTֺd2jx'BL{b@~HbH5`"n(Xnv0\qB8inO`fQ?:jH=T;&e%ch Vjrd XUEgpFlv<-,HOc iQ>ONg (r9DKM 3Y#sߚ_ŧQm"H#BSxr=fOӑtާiƤ Z۝G7HxOmcmQ<Fݫ΁^/״]R=;,H#Hn8>K+b_ɥޯ{.g>?ֳT$Kξ)5?CIԺGG%ܞ6-¼pFxT8`tm]4΋*H` W#FSw]$O{vgxł wC[.ko8NoT1vdיC4h,>$ fy6Ȼσn`71{}zUGKvDΩ'x8m̦Ag- cIivF=^QC8z~Ӷ}[,OC$xÖ3`zcoyjz]夃2Wʶ('hQ MiZmCk$˩4O&E*S}j l!-Dג  mzgPt%7{iؼl=޲ZƛThiV#i)[,Hl}M<2:ka"ܟZ q`FG9^t^GVmKn#@TA05\*9 T 574sX׿#EM*nf&h>|{tQ]óaH8\7c/F}F;]+U[˖o#0LdXPSO 4˛)S3ÏoFT}jl ,Y[ٖfEJ(>^YҸNШ|P \dis,Qy(?\K+mޟ<00;T}mZ tyNPn NBz{K h+(rTȠӴ;cƇa͎ɪ &1nA;S1ѐ?RhdV#"1w#`/=?y`ҐcnF;~y07 pZ0?zW_.fURrxMݸHGRBkM֟+gbL<}\}Esm1$Ō ^{GWUMTiM3S# &@#Ou>ڿO]\1 Z>I[R=8נ~O[U<#r?$h>0.}n4Ȯ#*d=~.5Easin}597nM &q5%.:?4B_Aԍ?n\cOQD[usld+巍Uw8nu kge&[˜FGrxZbƆTpA(h=qYUVapIqu4r-ϯjdxJ##SP@er) i~ jܑ۽k#sP!]F0WPFr3>8戂xRaHf})U`T>4o|wׁP ~Ǵg_js4F]H"0]l' ԭve=S!\Fv?ҡv˸c8\j BA OқPW=l絆2@qj'4pb/4݅Q` FҷVFH2ޠdN󊨇iOjIG X] QUxlShK=7^>+AKѡ`g$qPhLIޕ6gKG#5:R'b=}黭6H7qUdiLldLx= <&27AYfoH8 ]_gBJ~P4W7j5RO#?I-0B@ڥ$$ ,m{0=88bh)S|gȬC HOs{oޯt8,g$gaO"H@d~`iy+kCMZ7"{sj.y>od$_cYD{6:'xK2{ȭ_v.oTx${Xcr?zlŹ'r1VSr\Fo캍Xsx,j]?PG8\yHR=j폚)pYqVIb.9?ΥozWO1;s7%# C\o>jGMtԺ0jv6$|}O)\Q\‹[cSqH`WOߙn-b#1$,C >Z},|K3P~ӢYxd;w{ldI/{-v ;FI! sR oX :rsI45Qe|8H}O#irfѵhŻk%Gt7%w~*h{.Ѯzb87vC﷑7V>U6ZB|8YsSa$0MqwMi AǽUILM濦Zj1.Hh.Oearζ\s:Uq}w{cco%][Wf,wO}wyѺrMwQ"Hv}טhwƭ5bg{|9X+ YaGb6p,#]6~Mn.3/LwCk V:vls:H``L=^գkvԚ t3HǶ\ź,ݕ.ZtQ5ץMb+a}l# I[5VCC?=($Zzۨީ^i@ C؎XށiG$ҭ&HܠUfr1+%s|]=%C}u,[ڻe n<ɒ8:ZNފs| g gw"x ș# t$`ZQ+b)lr=ҷ[q}y\i$~p?#9<&WfuΤMr8E{_unY[6nWĉǷڞz=FOJ_ cV!'=Z> OXj4^H.=;K˓q9x8pzs}{{3\]HPH209zѐcZK[FM-~q+#<Fɡ9ms~8,<+5ꎚuI,v^lW2ٶ3R1ŵcu6xqqq㴭qysUz7Nu{b_ R3fv{&an=?m4mrGf㙂1~䏥{u$%حe{>[ -J_>]c%޳@ Kěp1j+<3|d>Ӧ%%A;bU/Duj3\6zG0ݐ+>R7+&?"lpؤh*j +)haeګ䈨 Ǵ+IA Y@<Jtѷqxl3ܓTA@E6JV2=O?;C}ɤ##-ۚ(Eݒ}(YUs1 \ۛގK/oɢ!N0> ioNxԩE'sBYjIҤֵ+Ɩ{|yYHA>W $eA]iYݧ(8bI<d{RFAQ\L{T1%2c O 4ns뚝Nwq܁QﶮZnw zS@)F@M򹨳>;UՑ32NA -@Y5\S-;hJ=3QD;YF1sW B95H܅"Ȫq!@'ג*MGNV,0_UEކYvzO b=~#9\,As nW?Qԅ<0|Et蜳ӿǧ+gr2Tv#Ӂƭ!Ֆ_OkWgؘY$/lX7^iArOjpD$OQQ1<̣mmI|3Q׉ZԦl4E$KISWwwӬe#dN~fC~T<9E9?ǻE"ͦSnRV+ d}eO="7.߃0'MjLj7'IҢ0~M3ChwYve%$_+}Ct}ZK랜O#KP!a8rLtVm-uk{:vZ46<=hEa=W[uFck)_ʱidi?Wiqۄ* #ɯe뾩:GzQ4bއp&F?z8Cz/IYq!0qRĺ_ܓx5=iaeakm4p$.9.q,qR5٭NX^U#?+ `ٻ}: \[eK{ngBV^2w)y+qfi ]ϵ]7.~=*&^i+BO vZTǦm݋<w5ŝCyo*,yp3k,ݿ 3+=ֶ? [HÉ11Xn'LܦdHBq灌b{6ݤ 6a}gY_Ĺ?A ;Һש`:M˜x?>׵V8 __4DvLc>e#^qsh֝8Ԕ԰f?CtW6{=J&xo8c^#п[uFp??e}J^OI4z4LpEi-;᜶&w;[;cJ=*$2Y_1/nki_1lk>rf>y5蟇}IuH[GzLjM4[YH8)d\< W Wſ߉=Uj]f r n1l+ǻ˻ӖOPM d&}8~ѺkM@)3X'%%M.FuVMS\^>~Nk/PM_L-K4bNkuÛ3%h˜~5v6ej`cOLRdKX; 䑁KmHhNY@p3;ҡ,w1JNH6ӤnLGG4=ćnNr>*޷:, n7DW^kwS ʩ>ȇ'UR0U2H$cUdϾKFN.I2aqzURn]7 !Efv҄r2=( >Y <޹;7{|ѡ$?ΙwVq.~Rc u 慎y>s!BOR g*YIeҠٌ`\p}E\i%1Z>BaoeNp㚬 6O\*X OϠU5UB9Mcd]u ԃk5cCpHˮt<ڝńwlJ'2B<>znF{Y 7M3_T~\Qm1_U[FkFq *!jǟ>Smisv'IuQv܅x~Ս׶2eۖM~&v-Z$G^uGWk}A1K(?X~~2~.-spk+>MI=MHɮW ?&[ujsiM$Lyc[W{РԻ2 ^y~n"##XcssZMgf+Ax_hc ,aI>ڂG 싞3^鶱)keYG{^Υ#@vѧ.qLCEzwUdw}auwzzKv">;J8Ddž:n.\t,g. 7am .77DM6\ch'h]iq/I_QJ]%19d>gkMwgvF73IeP1&K7amgZ_nmsg7/$(mi,3|Vu-뽝Lhg9$ ɣϫ NNtwl84~ҡkhxZM8y6̡F>4jݻ:g8dUKȑ*6F,ĎҼ"Tyծ5f}J缇1 >£X`ߓڰ\ią zdbA9wjFQ£4Dл&Zؙ ʨ2 Q2Cp.4,1P>qՃƹ)*r1ߏjW=۱W)-xfk {뾚dע2Dz~|/žx;MF;K6DFx5%vHy? SXo2htϼ O,$Ԭ⾁qse!}P_ wRJr~/?|8mu/98@`{^ƽá?ѝBR]VЯ FH*$($ c8 c*aǸ! {SK4nĨaz`89H$cT1%8rbFC)~ cU@@ER_(˒y1ɠ N; >J}{ ,?+H*+U0SV!NgMR {)#n!;*]Nx\O ˓>lyC і-F}1E ӃH$qZ``%qQyjѐ08E^m;vj-9S3nA靈۽@F-)pQ$wE"`X eHa>`6x&2Ga5Xu$F{*ys(He׎*ZI=֢ږÌU;E =cqs-0f<Pn7xr)kU= wR̻vAc ah=k_5gg?jVI֜Jsٴ@>[gP0K@XG| $x@eqUwzPJ𼜏H(O9]u!z{H`sS4WS1*^}*6 fDk=Fcn68o-5ݦJtxWO`ӰOwhk|nT'oJt.٭O-)[pn}w,zTq x$j~ItFӳ'cA/YƸnl ϮGcY:dEn3=?Ihv?q6sKړݦ<n=~JI_v^sKp}3XPuᾇq%[Fn"O/fa&BQ- h+ܟ9WVmѵq4 8Q5R-OThChԉ(!@-rQY&}GX'ׂEdu79gv3햭5[4MʵIGo`" r2Iy5=q:~-V]BXJU@?@=Kw@*($Wjdl9"?A U aF@ #߽`XooJfv{Vx1lYY/.,3 U8>?cqX[N8#*)U%@DS!^ENAbƹ2ɪ[[.e p`[@ dcihIS+GہKs xw60=Tܜxc؎¦-;NAceZW QB;d+}N*V@9 _]w5[*NA^ѿ_v=Vuy$;"lBt[0jQ@:[e$,t13#G>T݋2HF1%jrHH\>IbKgֈL7ykx,IM##nTi6eJi"RI;pE;}3޵D}sDIO ?n"cNŰ4MNAޕ~CzW(o,;fѲ050nq]B@#=I!$`n @T$dS) lF@( jJ0) \R%`|Wn*lIr J-@S&=Y00@?$S|_zzF1M5Jy:Pv2ԪUR 9Ev@UA=;?4k0r31K"L( Ly'6s )OY xpXq=#^€i+s=jSY۟% WP(n" (.r#%SVI5Q]c=3JoF?X%%IxSj4 eϩhsf=ϯW  +p)bRwq寐ex h ab;kHaUc#7ۣv\ٗ$AqUS8$9lV`BzB '41YncO`2c5fU FhB8:OS'ntC&zI,CFOlaMT63UWkƠjˍ<䝃#}jo>F޳ n8+霷jݷFq+_{'%{UUΙ|1`+|mLŢ-:0[{p!qӖF@O׫AǷj_97m&@ug{0G֣텕2aΟ c}T?үL>y@O`8m&v?OF<|VRHK=g?5WqE1-k)d ا x14KwJx>y*@$Vih}a.CFuzJmpIq^6gb=(ٳ ka*U5"oVWAU(R$[uěf$3ZtU޽X q}fe|ek..T>_iɞ?޼GIԯ/aw8>ffϪ5ֿR8clUQkC6~L3VEǦf%.~~/@ޥ{ V.U;yaU}S'$繪K'IY+, חKf_[st{c*>ky;]<P=ڦW3xӶnǸo`NB=qPmK;VXX'-wt[Dn' p1T;J#ŏԗZhY&n|)b^BXԳb̉l{Oahݕݎ2 UT>6(>`G9f-.g$kkH; i( V@. /83*kr4QʸyԑaT1 h 0I!?N2Ooj=F}$p#Api@e8@Z%Fnh96I#R2}q#D@qľ\m4vB@p|C)8 >+&QP㏜ <>gvU5@nb{ppxBwp~9r=x@'H1ښ1'Ur۳0h2{RWh-y}r=1i} I2Y8Y{! g*ؤs#`*JJ. `(Z @`wpsNpv>_@<1 : jA''$ T]Horwm4)$`v!x/߅_ROzf@ez~d6H8ڔDd\`6}+!QW9 c=q"ҬzJKf bB-\HQq۸3|Pil%wLl|{TYm9ؑ=~X>>Lϗ$qUvHXN}xsPAq#%1sXxjN{UuΚw"8V1ǷNP25 \ 3<ߵVeb=}`0L 8G8 qd& XŒxR6RUʍ%"v0UMͬ9WGC`ѯ8iaWF;Y238 *zئx<ۭ<[T0=I60)/[}SU9HOrFv=8&1d mrW??SXHa+$瑳0"Hg-'lƟjepJޥx(iR^JΉN0=MѭL?G?SUFdgm}8h-8K%?,cM2M;6qPH܀;@ӰwERl3FтUwzKa1X)Vn@;8'㊴{ShRk'< SpHp{zz&F2pʜh#$,1K$96GZBibpxd.x#:`lǰ9f)?8֑٣rqڍXҦ4J{Z#8'UMU~i7}YvCaVlR{cx`r94⢂ r( ڭ@r2R)_E&rOR1OP1A 9<~*(vo;F>O\8rꤑg)_7"9,rq2v { 2einڠ1!O96c~GjF$BpM;z&"p;QrH iܒ}9'dw$ jD,TSL*L / CSPSOڌ`a֟lI>dq҄lr}ۂ_Udt 1HJc <IN~n>]T^(QQ焞ʍqS199&÷Sh$_.ޡ\ZU%"-ȦO@wP;T($(q*K RqpR;.퀟@yGq>@f2Q'6oZۼdddM,^S@^YIǗhVͧfjY y,U;7D 5֚\giϦSu!#B* ݆[Rhcw!3qjѕ9":G("o+Z05{@m1?qڧ^i{IكUO`Uǯjܦ0]Γrjx2c۶k, 2qx56Vwpj8^hHQ*lcͬJSo>*>*nX$]я;Ȫ cXԒHή\=zm :㟥H3;`j嬠FH>Qcq#Gc5<+)-xų\©6O8⮢Y35+ EjR`ZM|Rȇ$+wB[ޚRo1_S0qZld vK0Px;T-rl$١lh[d`؎ѱV< oE*OPvԡnp0>´&v8=ǥT!6C j*|օmBJ#3%>F@e<1(@q' /c*Lv^3#h>qMon q:$rOBGaF0-hO;> `6[1kgմ ёǸ^zd`8l 8bOli6#uF8*<4;y9-Ѥ\m1Q0LB$<͵Ho.ME1 60*Dhx>NJ+8iG8oj)+w*r})MʫI(;WP#1\97bv Ͻe#28Bg{d(J4k*rTpdA+GH1Nx> ,19I\4߂H!apsi;8( ܌ڕFqj ljbP RڑOzLy?@)YFshBTw4HqEɔN02sE7)&r;?e#N>+\I9 @)P{ PwE6,sږ1pJ@X>@nIbe,{cf}i'VP3'Si'n(;wP0sӤ UϽF?Ӽ( & MN=x <Ҝc֔ Gh|)V }=ՑAMϷ-ɫ}}0i#٩|->̤n n4@Ux=l;R`#q$ 7R<˅)H'n#"H1Viˀۀ`OznebݳS* ld[xYmrqQebIUBy'T o['@emGiQֆH#[0\)%`-B7w+ 9)#JN9o%υ5k0W]2 \9̰U#95vlA Ic\Q EƔpT~Q>]ʨV#F+}qnXd iՔXS5/<ކȃydF?k<"A sjv 9b5S杂)LpEb ʛviLT C&Yv39/||jtƎ[eܹ5XXb Q.3"XğFI @%N(Y$' TGیD4zeœV8=|'\N,⑙;ŽN J)8;H@jǶk,@nySy3xL|\S ?40Td{z0 Naފ7'BySD@'ی!)# >hg\dҫc?QD ,p~+@Glr5h0v%^0d: WveR SF|ynHK=hLa!$`}v@0A׊qT |q{BRO$8U l!Iݎ٥+$;*#kv0l@b{vLK1=pc} 2TTr(2W$&X7 P$\\]gsxsD~1ޠ;HJ$>اUZm01Lf=]O2rs;f8,F5E`GOFITLdӾi h8=!J>0ئ&c*(p#V2_XbbFǠPG|fe{s)LЌ0N9YAx$p}[RA>=5F=AE=eIRG#=H i!>ـ,&4݂G짽kdAFPP v :OUBZ#U-vS_ڽ;]if?y#o=jLdR >z[5m35Ow,A#cDm^9Kd`vU'^kS.+H3dqStĈ]4.[.OrGפXڰB]M4@>ޕKv1n9޴ LRGqR q8ȧ-2/ R&S7+3oY=<Ȁ0D#f*p0@[>Rz"!މ-9, zJBp#Ǖ[=KCM\Z0  (vo9TqOb2~iIJT1Q?ά9l6ܝŇ"O &J>PFL`jU6%y8Qh"'ph/8܄%#i R`{5(@KW=bexkd=xZv2ycJ09<_;SŒs;Qv.OaFKJ'$4V(sH l$j96 }9#8bq,9đ2}jх] 'ӌHP2y5)IsayϾ=de 9QHp+ Np~iYݘ` R749 s( 09 G}"OJG"'P!wR'qHڜۖ9R6ܐ>v\sR9zK;YyR~Աv?$eQPeG fV*SBAPx#'$l8*7{~1FHa@8q6>)b t R)(#92?΁( `qnA==i a֝E8o/1F`#fIX`zCdotI#8R9U0?p;|m+0Tg+x =q]+ gTN8]>4X}$\(\!Oޜs2Gǥ$X#}#( Kqߚc{4M<`+eڼcqL .OȮ}i\s )Vc`nq@ F;} Vqh|=ڕB7-hJp}r= r@iGHJ=(c^_ %C[GV_-_-#P %bi0O=$J֗i z #k 'zbE`ȁ {f!w)Vdb !ڮqwby,O hʨ\Gq`@n$\0P~GzpRNUw9%]HU&ϷjA )l¸Xɑdmvޓ8'H"<8TzRT^)HF?F03=* aB8u+>@<WWPJj76>/}jhAuuycVH~ku;€r@5 /<ʤ KaaOp;Muu<66)ݏJc84jSҺ$1ֺ0\|R3!Qy]]T'g}뫨l/ PF0QG=M!V)p>UvuuB1-S[I]WWVX6[UlG#uu<!'w!<޼p+$~i/"IG1p;|(=uu ǥ&<G~BG7pX2 uu yhSrpy@e1{{M+++bWQ &NXgP`=]]PBmv(v;@2fuIbpAF\&߭uu0rINFM8LqNh+>UbBP}4%{WWUeR biIuuFAK+=4<@+h9)x%}kyU"b:@ " wvP1]]D"y˶m۶m۶m۶m۶m{>oLg֬y{ꪺ'">̪]WHS||]ڠ:z'u}>#{Gՠ_<><><><ދ<ދ<ޒ<ޒ<^<^<^<^<ӟFHm&R糐NVJ]77{=I5tyK# ^{8(rzhW>.Կ~\h8IVHOF'O);NnO(l>N2к]o ~M"_/]^S #2MM>6אאGG{{[[kkKKNsz?~?\_oFoFKKBB-xht{{77ǟǟ|<_Uoׯ;{?AET#k_Ay yn+z>oi?ےC<'x< B<> |`rZ CjsT-l]A<!Ϗ)łc//>vﷳ|\)O?uUr0{!?_ R$RRh4' zO.BJ)TofTߏ y~j) ϛ_Z)T׬!O3ېg 6!?SC^f) HYJ٠wgr?sH99\od\Rno/T_T??Ti~PAPP`igg!P[apy.i$Hi?/0;hi ?&U!_8h~/M ~O~U71!RB>OBO|IӉ?]Ly3YP,i6;Nߵ y\i? /-i!oB>Ebh%_"-RiIˡ/V|N_!?/{^yg?%y[J NZտ^ _M7|[58/m~CwH;v|.v-A~tx= J H:LB<EDGшg!] cSĂ%bC>Gą|\?D|(?H"!TBZD"1X$򓈤dO&|O.RH?@< 2{(2Ag3,PYE6g١P~)r|Av~8s!_|QE!h _aQ( _TPE ȗ%KRJPE/?/뿬(G<(_^T|QE%y***PUDUW _MT.j@5DM(Z6k:#BuE=/Y=Qx^E7 gF17M&)T4i.Z@-JZo#Bۉ^t";(:ϫ ΢ Tѕxu Mt֯=!S֯M<G+AD(be!?X !W1x1 &C~o ?RGPh1cXb~x(O=LO!?YL1i&_w]3ݐ-@~ bO? B8C04䏈oǠc8t';/N?w_E{ ψ8G?#?' AQ_$92YeGϫ? .ǀ!DŽ)ǂ%dž|l9T9.4r}!WO@ 3PA`!"%70apHȏGA~<hy c!?Vqxȏ'@g<Z$Id®__^Fy?ϻ~ʇ H> ||?*?&?. $)?%i gY!^@;j+u _G J=yQOO<3+ @iHSC~rxrA)!X9#Qy_Uk)ǡ+'|)r'S?&wV@rxU߂UU5y5U'y_5 $7S]jC۪yGu]ՃT@ Pjhjh~a԰P~X5é!^A-H?(F Mj yjL(? ؐƁ|5. O_M] ԄP~B5}'Vϛ5)TMFZjhP B/ V@ZEbP/6jIȗTKϛ_)4Ke]?eԲP~Y˩W+@ԊP~E_I _e W*䫪ՠ!_]_ &MϷe~&m_GKxgs KȿT_?w_}]>o} ;{~? ILx xկWW_w_N$w"w/ixdƾȚBaj N E|D-#i!Y/ʏE|4-:Tt-7? P8hq!WxZ|Zh O%Zby'֒@>? ɴOr-BK Z*ȧRC>x4ZZhitPP~z-3h3jLZfgֲ|O-+Z6yMZrBrA>ZZ߇Jk ZȷB^w:BN/:Cwֺ@]nu|w{h={j K [>Z_˾ϫ֟xWm?@ C~6Z!PhCaP0m8?\o6#Qhm 6o6kO&ϛDmT$m2?YOѦBSii!?]A<3C o6 gksB~66x(_-"y_[ %Ry[-_-'˵P+_J[ o PPMP>?]fm h[UF<ݦm'7vB~ ݐ߭!h{>CovPC??d?jLj>k'B;I_Oꉈ?O'I%ՓA>?)P)TP~*=5񼯟SiOOOOg|=#4z&?g&Wf= zV(? ]C ՟SsC>?ϫ>=?_/zAh~B//!"zQ^z1Ӌϛ_q_B/I<ϔK[Rziȗ@^_Y~/WꯠWWQJzezWѫϻTիAWUkϫ^ʯ"^ʯׁ|.=>[_o@oz#Fzc7֛@~͠fzs(oQo"JoM?>޿ޗx{OOJ}@}o&!!ďׇ{0y1LN}o>y(yѐ!w1X}qx(>x&' ?I OѧB~> 鐟π>3YPPl}?G A~>Dz  H_Lx/ʏhDdD&F(FTG5A>э^?0bBӈˈ F8F\F<3vHH#? S(2 4v~a1BQxޟ3CōJ%_IT)4KeerFyFy*+U2*CW6@U>?Ո_ͨNo 7H3C~q?ha6@qx;j!88 4NAq3?cY4syȟ7.{`\h\/h~W>?߸F@0>BO2>Cx_ߠߡh?}~; Ag7 SeS!{WM _3uo&~iA[ ۦ.Tkzg E\3/o0aG3,Úpfxyތ@*3"ьDg7{o& 7fB(?_"31Tb3 L f2'3C')̔OiOeSiL f:tfz_?of 7 fF(?x#lfYf6hPP9̜iesy _^3G>3?T~ !_,KؾYxן"P~(/jʼn]?/a/i"K6@1BYYZf fE(Y ʐlVUW5AY_ &4f-(Yʯmցuf=3C꿁oh6|#1MMf3_?o6'7f y0[B-V[6@꿭PP~#:Nfgfw1Bw5Aw3{͞ߞf/yem}퟾f?~f@4A2C!bjáȏ0G(_?ohs 1Bcqgxss"''!?ٜ)TO5ϻO3CP s&?ӜE<,s6?ۜ?ǜ+yg'7(xEby?K \ տ\erh+̕P+U_e_mטk:h>כo07ϛFs7!-Vo5A~0wB;]vw{]{̽P{}g~ϯf!2/W+U(y ݼM4oϻ2oCmށ. ϼ̇xh>#14'S_Og?n %{i| ȿ1B5A7?@ /P_̯PWt3C7:' m!^/,ʗ-B^4ky2Ix+%JTVjhR[iXiV:?o'~qVF[Io@>? fe|v+sX9ߜV.h~P~n+ /g[|~Ux^B/d [E _* _*CUU/i_)4V2VY(U_9c%Z~Vh~` h "~5x޿=BkdyBuauu ?fqNX')h~P3Pg?k?gyT"Ѻ/[W ź 5_Cn݀oX7-y-6ۺǺKxN'SϻSBoJ;T*;5Si NA> `g|F;3ٙ]?,P~;+4v6(?n|;'TN; vB>>=v B]/l!w(b%~Eb/f|q $Kڥ(eֿ]e첐/k֯]/oW+}`G JveyW_w߮J B} ZcqO@OB} P3P,~:gyϟ`%Pe ž _APuþ ߴoA};PwP]?BO#1(j?ω{n _/_گWkh7PoPowgo?!Og@bSowy@x~ڿ ^r_82/; Gh DŽ7 cCێyq}4AspBA>0PaapPD|'"4N$(?d' ʼn ՉGsC>1>L'&y߉C|i'.׉/O$|B'9I'qBIdNr'wR@>)TrRYR;igw<賈|:'=;?L39!,NVguANNNtrAo.'7n'T'ϟwϻ~9NP~A_) NqBSx/Oq~%/锂/唆_)_) u߈w)Sx^T"P~e 8U!_թjNuWwj<Ԅ|MT-6j;u _ǩ _שzN}48 !iؾ&o4|S맙͝oᴄ|K믕o|-T[?j紇oto#;: .NWnO7;;=Ϳ=^z9NqB@y@g &3Cďwɼpy>A&g$[yQowFC1%~ 33333md(3ʟL4g:4 ^Lytfϫ39̅7יsC~ZB("g1Tbg Y /uA~˝_ᬄYW~x^5_%YGuA?sCἄK_9_;o y [;=7/|%77(8?/(?H\y*PVu5(_supM(t-(rmη]x.=7 А!+x 놃?FэHndy_Ev@GqBQhF[1ÍI ] ܄O&|"714n'qBO&O&) M n*͞*75v@iܴO#wO禇Of ~܌f ,nVguAf9nNts{ nÞ_7/ np B[v@Eܢ_Q_-_-_- n)ȗrKCW-2nYher>_-OgsϹ!޽ EK.!ٽŽ {x5:Tu4M({ ʿކowqB{?>?tAxy>O!}gsᾄ}} ȿqBu{}Gh|t?3~&yB?x_K@<_B/T"/1{IݿxI!K?r/Ͽd^JȧRA>x@>?xKO|o["h,C~Z%RhKeP2o`xo%Vkz [տ Fo6A~-Po+z v.&w@~{}3{@Bww?w; 1Cw'Oz?坆?OYȟϻϛy_.B_.APe Ż _Aw׽P7PMoy}pۻ]wPw{>߻??GP#1{?BOgϼὄKT+5{-zyݿ{| H<'><}x_!ow("y ~R@@^2?9@^ UzloLy X6Tp|'B xP^ @l C>| ~_@dGD|@Tƞ@4G D'W@ (?F &3 !;qq!7x/ B (IBI ,翳}@ ȧ|@*y?!:xOHK ,uο*u Hݤ.|'{J K R>R_A꿿4xϯ@y@i i0KCHC0h~äȀ̾#QGIo4cPcqI DO&{&IhS*M7Mt) f@3PL)<ࣰåGH ?K yo4x4p4iiyBEcxw,%R7ecɼi%xҪKkKk{^@i?Kt?(!0KG D:J"Fb"&cX%bq8".W#wP~|!AB РiBO aB‚-a|lv-…+<~OExC"P E"'!X$|?IE2yd"9Tr)DJ"SԐO-|O#{~ҊtO' AdQd"w3PEgY!Ud|6?ErP~N Dnh~Ey_>.{D~(_HWX򋈢P~QQ /&C($t%E)K2/#B_Vˉ//*[AT x+J$*ϻ?EWU!_UT|5Q_uQx Z6OmQuD]=Qʯ/@hHx/@; B;(A䏈c~|L\?!NB8Jiqgـs<ϋ "Eq e_W]W皸_7 C܄wS܂oې-@ ݿ!G3cy{,@?O?gP3xx R%^CxFߊw'C^|?o'y 俈W wh~( _?-#>(>DBQho??1X3P8#Dž+ǃyI / tYUY&Pl{ 囲-&7?[v|Gv!{OA꿽䎐(w|'3t:]gϿܕx 3P=P=^^ror>r_r?(/A~<<CPCab0y8# ?B ?R叒GC~!;+䕐_)"*y5Z^5ZȯA~zyA&o7C~y+۠ۡy?w;>_]nyϛy/WOA(|xCaGG L>\>埐OB;))t'g F>K}%? DO$O$|%)TR%LIN<\IPR| ZIC%QB>x)JP BT ARx"PEPEbP~18+% _B) _R)RJiJ2JYȗU|*Rx^ _AJ%yUR*C*(U!_U_Mu_C TjAR:PuR?P@iH}~#xPCrxrxQ188 %'?r*35yi3O+g+syyrx{A_T.Arx.+W E r הPוP &o*܆o+w>_ =SCxx秇#y)'ShOg)ϡ+/ By +h~^+o(o!Vy|$7'(/P_PW)!]OyOK (*A*#!YYF%F#FꏮƀꏡƄ|L5T,564jQB>_<5>%U@^2t@^QUTU5UՀ7Uxjϛ:PB{y_ A>&O&|B5tP$P~5)TM/?"ೱO$RMExxW @P BT AR CZ꿈ZEb!_\-jIj)JjZx^er3P P~"_QJjejWQBZx?V5jMj秖Z:օ_W9'__mjC7Tϻ?ίڄxo6|S39䛫- Bm Ϳ ?ZmFm VmNmjjǀډx^~'3;]g]!UnjwwW{{P{B|ot} O_o:Al?XB}~(zzzz?#Q(z zǡ;? lR=ED} 3?SC{ K+5Z}6 #'w~~~'34/W(  K QB_?(k!YB}-{~h j=P~b- DK 'Ւ|x%RRB> ?43PitP~:-=t ~~e2Bg2A>f- thYZ6gӲC>:Z΀/r;\Zn;yo>-?T~//|!0a_D+ Z1bZqJ@%P%R/b heZ9yWN+O<-U+h!_QD,V /U%~o_WӪZ y߿QC Z-yRK ? |mV>xZ>4{6{6֚@Mfo5|s[h-kO+5Tk hmjvZ/:@֑xZ'(֙xuuuiݡZ({i!BAC h$_A`ֆ׆BCa3PpmGh#FA(6cqi3^?A$&iڔ/צצϫ60m m&L-x߿µm4YlB~6tPm!P[/|ivbm D[ /ՖA˴__JmT*m5m w__^Ao6A~fm O[_m6m;]N.]ny[=^AC~vPC;?(QT1xe yNB'S?i hg!V;Gk{=j H{ )43s( %4+(:˳Z{C?.AKL<7|Evϫ_5yMס|]7 o&[P@]ȻyOz=T=! HO z'ѓ|%%ՓO''O|J=S驡@iP~Z=!^ zFh~LϤg&>g!~o_ ՟UF?^:zAh~B/WX/ыBEbš/| dW륈KC23>A^꿼^U+AW꯬W|*Ո׫Ck5ׂ|-6ku*{~u#W=>__ozCyo7|c M!Tofzs7[@BoIz_h~}~P~??:;>x>}(CaÉݿH(> Gc1X ?N?^ DhI_?I T(> ʟOaggB~G@gAgC~>xd>\}4y|( _{x^"}1-֗ϻ?KPKe_/_oxR_*}54y?^_o?M~ڤoZ7[ EJ< Mտ]N.wϻ=P{P{}P>}? @?!h~Pa(TQXfcq yOB'SSihgPgs?y4 E_/A~+_ѯB~ ~:o~ ې߁߅]T=>Gc?֟?%!Og?'o/Ru!5x-a3y{yy xx!M]Oh~?_P/7{3 OHو(FTG5AG3CэaĄ|L#c!ۈ?xqxxF|7$h~!>;_2eC!w~BA^3tA< 囆y˰!otBA3|~A/d$|#!Fo7B>x^ɌP~r#S)!HTFjȧ6@Oc%SZ#H@<`dhd|f# V#[7dןN<9 ՟\Fn6@>y|g|~[(H<)h/doaT(TQ_(Fo7JϛIKKe_,_(_(_ި FEW4*AW2*C*bT|UՉ_ݨͿQ5Zߘo&7F1BQ꿞Qo`4|C4FFc76@71BMfP~39-g-[ h FohK 9X"/2C~xYb,%72eryo_aWUjȯ6@~ku_gzc7!-~-blVc!A(P?h?dG%1Bqx=f'7 (qx޿s82NC?m!/g!޸ݟ E_4.Ad\l\*_3Cq7i"o܆mqʿk#w?0BxGc(j<39Tst^/5ۿ4^ϫx^o7[ȿ5A{g '2>C?_~3C7~ 4~A;۰o=?m"G2#C>Q̨󞟨f4(?D݌0cB> ?xیnjk"O\3ό7o)/L@+ yԠ5SnaPiZLxot~By}32@ ̄Oh& v31I=?I̤3dOf&|r3Ka$' 6@KcOkәKof|3#TF3t~P,ߞ]3+و՟NỷPDs''S=S̩PSifNt3 _9xa΄L3?܌a΂g!?ۜo99/໲ \/47C~_j.\/7W@0WB~ xO6@1B_k:s=4(1M o6@[̭PVso7w@;̝PNswnxG<>s?T~4A4Ay8໳?l(?jǡ y $;i)4OgϘg;k?gy//Ke_6@j׈yʿnހ &_7[P-6ow ǼK<5Ao>!|D<| OgPߓo %|Wkȿ1B5Ao~#?}2?C/b~W俙!π7A?޿̿P_?#Y=(P~+*Z ͊V ?1iłeņc[q8V\ǵ|oxoI,/,xɖyR!ZԿf-:?2bZTeP@ޱ\]˃,Y X JD<%ϛ_b+ XIV2'C'RW +%t)TOeJ4VZȧAC P~+#3Z3Y/gϻYjefe|v+sX9rZ\Vn@By|g|~t X.h_* _*|?UxUŭ/a|IJC2BerrVyV VEV%(U꿲UʯbUoUT5z[5_ê V-ZVmy?j[u:V]׵AUxo5ίoh5Y5@7BMfof5|s[X-~{~-V3֐om!wXmV;ȷ{:@w:B w@buju|7;t~ݭP~'4V/(>?X}G@ d}&b}Zߠ#Ga$o/7[kF|$;2 yv#xwDC>xİcv,DzcCǶ8v܀OD|5-}ey߿# [%Qm {A6mB3m ߲m(߶; ߵ=|(v!;vBy'A>?Ob'ɠdvr)vJv*ySC@KcOk#Nge3h3ڙgۙݟvgϛV;vy?? P}C?da(>cqO@O'SP)4Og > }?o_}x})ৰɾ _A}x (}7[e߆}xc߅]t~P}4C?A~ ʞ)!~AAD: ͉N ?1P~L'4XNl(?'৳}'.uAHP#}L$ W'!%tA'rC'v@>? ?O| '%4N*ȧrRCv@iI՟I՟3?38՟D?|N''?yw @/ 0N(Sx:ŠbNqwJ@+ᔄK: _) _)2NYN9(S TTWɩL܉pf~-oߙMT3g.#9Gg!g9;K Y 2er J*ȯrVCv\_%WZg߿9zgg#7:79mv ݟmv(g']nh~=wxsx^?!0a8G!9s?O8';霂)4O;g 9 s9<;/8~>߹D 萏 )ʏ E767qg!ߕ%W@^2eW⪐W] :ա|5 o&Mׂڐ]bw]x>}7? D3ĐO&MJ?.ӹݿn(?xet3Agr3Cgv@gqBYlP~67;nNn.(?<%!-n_>n!nav@q;n1([꿸[[x[ [/햁˸en9([:n([JP_٭B<*nUyՠա5Ϳ[ʯւ|-6kuօ _ϭn5pB FP~#1m&nӀ_ήیxϏfnsn nKyk鶂o嶆oo㶅o붃|;={#;;ny.nW( 꿛=WO'{ͯۛxz}}!?o;C0h~PpwG#~%(h(;㎅Ǻqxyw;ʟNDw'!?ٝ)TOuA7͝Ow ΀΄gP~,y,w6gss!?םGsϛ~=!rC{GܣQ䏹lj?'O'OSiȟv@,Ϻ;w/ϛ"ѽ_r/ϛe Ž 5kuhބނކm.]!}À_ǞC_3'POܧS䟹ϡ/ } }Wkȿv@} ~#?~?_~=_owyw@pBtA~~v@_?#y!ً(^T?QhE݋bv~L/X^l^BAC= _Td(_+ կzy:{ox&Mςِ='7=;?| A>%|/!OB/K ?Y/)x^27 m/%H饂|*/5x^ȧ~#oKG$ڼ/e$#Lć̐e!e|V//;/T/'\^n^B|^/ z _+L̛?Û;3py^#Y&wf{sB~7PPo!t~ E3P%PK_-2o9t~˽P oe{VC~_뭃yg{=mm&~ox׭6lCo'TNo4]o/z TA??!BGc?w;NBw Ӑ?흁w; n?'wʿ]$]"7Ke(wʿ]wջku (w7[݆݁xw݃݇{~{H#!ُ#ŏJt} //C^_k4_u߀ᛐ7}+myw!=߇!(?' w ~"(?O'|?)ɠO') O ~*S!OB>x??? ?gY~6hP~v?I[wB;!0TaGACP $4)ȟOC&O, w//(xwտ_C7o ˿ ۿ߁ S!Cy{? Pῄ鿂+5k  翇 ٟ> /Wy7;w oT/4P?B#"ȡ( h柯E'!z(cbB>f(cbC>v('ʏx#/B249@^ PjH!F 7C|+dϛr|'<{!CP B DPBġ$PIBIA>Y(9TP h~)B)T*Ci?M(-6OJ 1 B!9YBYe e#d er߀I|[(4\PCy<;?O(/|~T Tx-*_(TCE/* bPBš/*ݿRP~Ph~eBer=r/ W U&kP(J*P5(Z:tj@ՄkjABڡ:?uBuzojaoj 75|PSfP~Psy<ڻ (m]ݸ{ @VU@p݂u'9%dqqF|sV7*ԅ|]T=>4NNC(o4|c 8M:͠fNs?Ao=^_/7qZ6N?~N(3 @gi o3C o3pg? tFA>G;c,O3;s[; DOt&Yvn3ʟLg*SiMsC~3f83!?ә?˙ v@s>:,O˟̷</pB/tAŐ_,g)~KeP2g9;+,O{Zᬄ W;k5ZhkuPPzgϟ! Fl79-Oۿ-P[P[mmv(;]=^uA~9!9ϟ%tAsi#(TQis?O8'!9ey;圆?휁?㜵yyyy 'S?OSi?sCϝP i{鼂弆_;o7[(||G?9!Z͐'Z? c-O?<,iE"C>2EhƢC>:ńcXbCfq ŅAX|(?>K a -O?!KD[ĐO̒@> K ;;A1Zqhr&|$/様5=f oX_" 䖧~ORXxORA>KmyGYh~iXZȧeY:hc{Wg,_v,4L,33,>쳰-OGʲAXvgg9 |N _.YPyY>|,?|V Wֿ0"aE-O<ϊAc!_/JB$+_|iV + e __UoB!k7b!ߘ5oš5 Xss[oZYvb֬ ߆֯-kv={XGhudN3;.ʺA_g=!ߓ|/כAclighy6`l4!l(䇲aƆC~8 d|? lXX6oyO&X?hbl?M|66h4˗g!?Ͱ|Y6S3,Yl6g9>3ķgs-߆v̓oK;@~[-|K_̖@_–BK2/cˡ[V@`+WU]VCfk,Oc}voG;X?;hyCP!vfG,O{8ŽBG1q=`'ii(4;3,<;g/>/K]evWU_e ]#7-O'}jyZOgPPs4Kh~/WPPk ߸o!}w{h~=~~p?B } y~!@Axxȇ82<"G#P~dG|T ?G1,O{DŽ/&dž@qx>?>O'@?!OD[oyb(?1ObyM“B>);@ 򌻐w9ǹ\YCqȏ{qcy x2d<9Tr?O ՟OSC>5OO˃!A!=_T<Ͽ'ןgyh~xAh~O>\Oi!_ yO^Š%KP%y)ȗ!_WW|9^<W!_W+_,O/2_W|^Uy5W-Oy ( WkAmy@Buy= ߀7|C?߈7<-1o&)f3o[@oiyK o ߚA!ߟ> hP`>CP ?~8|$GQ(>@cX|PO!?O?Od> |P (~&Y|is ?υYv!?/_B "(_ /K%|)e_ƗC/+,O %__W5տuP: |i뷑o&h~[Vo ow@~ տw@{^G/gyZo@?hyC?[w~(?c8~ ȟ'OSP)~?@gY(,?gy_}><9< iG/KP%~_W!_5~i7MT-~ʿ@w](.?<!Gi̟X6')?3 ȿ/! kB-??Any-@O2"AD|D DdGQ ED?h":E 1cXP~,ʏ-|$q-O?gyW<ʏ/@>׿߈D'BߊPE$")䓊,Ow?&\(B@BHLPWB[ֿayW_Nǿ\"7nyD^ O_@d_PdyQ/$ CgQEDQ䋉/.J@%KҐ/-@(kyQ/'CW^T+>+JO;/~hQiEӾBQʯ*Y~)neW)~rQ#hEmӾGmQiE],?v_Է\zh |toCFiE7Mfo&C7-%R[P~ko#Bhv=t#;Nu}>:.']!Ut/~}E?(ͯ?@ @1 b䇈>P1ᖧbHȏ,OGPh1Z1b,NJqPxhNj PDbdb T1S4O!?]Xd?C̴퟽biOfy-O{:(AwHaq8 4c84B?)NA8 Zψ>Ίs8,O|| g[i %R p2< #Jde$(? 2 ȨݿQe4(?G1 CƄ?eyX2' /cyZqd\(?x2>T| 7PȄO(Yx_~ +C>L$2)N:ɠt]ɡ> ? )-O_JeyԐ҃'i $Ydr2BOJ ?L 姖iȴI+e:h~dz{OH^f< (e&L233,PY䏖'Y!Uf&C.sX? 甹咹24<2/|Pd~ODeֿ,hy _H|a34eE!_T/&Ce ˒P%e)ȗ!_Z|YYY9Y%_^V|Ye%WX6_de(**TUYdu_Cքk__e-(my[[ցֿ _WփP~}ˆ'F1&o"Zl7!\| ZJ|kǯ6-VN<Av|G瓐}';.Ϳ w Mv]< ͯK|o}d_h~A?9rPOJ?/Zx_Pp9!GZ6riϿh(o r4qr< 'BOIr2')"B~閧ay3C΄L9  r49r.?W΃/@~\r4Er1X.K2er94r;Wȕ_)WYx_j\ riN_/7@Fo7Pf[VrMn!wZ~|쒻![O}>~(<<C0XȣPQy q' BOPwY?+Ayȟ,OE(K2/++*4P h~7MߔoPmyyʿ+<'{}WG}Gii?|jyx*Y7._@|iyx)_Y |myy-X |kt-O{^~yA~ ?Zx_~P 7P7*!DO*14* t$QIG1h~L>[ϕ򅒐JA+!gy{@dy Rɠd*9\| )U*ȧRVi4*-VC7Xө>_zU(??Ϩ2A> *i7ZUVgU Me|v*'S|.UQyWyO|~UTAT?Yv A* gUOU/Y[L/JB*ey_)UK2Qe[VyCTy _AUꯨ*APUWQUjCWW5WCՄ|M+UkP~mUuT]?z>DίCj!Fo[v5VM,O{oZfPTsh~U ȷP--O-U+V5[6PmT[h۪vP~;ڿUOF?:Z6iwR;..+W;w T^7[Go_꿟_ 5@5|rr`5j(䇪a05F@FBTGѐ@~ ?V85Zj5?IMd5)4OS-OQOgP3^@^B/+ȿRVoߨPo;(zi?'I}g;CFЁY@tx^G#B>H:2dQtThhPtt(?dCǴv-O{r5<i_P yO/H'OS@>N :RԐO@iO}>=9?X|:g?@ό:IgYg#;!S.ۭ@~ky ߯@>>҇!X?BG1(>i?>Yԧ,O> T}g9ȟ!^_wA_E}K( _נ]סo@ S߂o|6}.{P}_?B?ԏPcBO3?!\ ?/+ȿү{XwC#?O?C!C|hyYy{,O{.? ?(PQPQh>y-O?ʏŴ?ʏŅ׋gyW|/x@K'Aoo'@IP~R;I?9wɽK᥄|J/ԐOKi`{ K '2B> g@>#T^V(? ټPٽ<7s{y kyZy||~ x~x-O7`(7C  {# ? (ȏFC퍁xc8ȏC&@=N&|M<7So7 ʟMtogx3͂gy@~7syP{ B/A/C~ {K-Or(+U_孆_[ A~zoo#TFo7y7{[x[!?{-O}ooyx-O{ww?#P(zǠ|!rqOx'!;eyN[x;; A?]"/z]ٻby*ջͻ M/L?ݲo&|ca&+D}D[נ7-?v$X狒?,O3iagƅk8FZ'2_<1A2ɠP~rOaRB>IT&#& ӘOk!lYә'7Cߛ `~&T&l@>ZMV(?g3١g79 s\er[x_~<`y7 hA~ ? 򇘡PP3 pfGiFA~ f ǘPc8ȏ3Ǜ >_~LD3'Pd3ʟbZvN5,O{fC f&gYPlhg9ߛcB5 ?̇|Zfϗ%׿,kA3ϛ PEi.P_1Wk됿nn|so[en[msʿcBkA<Cc?6O?1O!<34%^W>__זڼ@0!| !:? (0?0(.(|E"!)(W"/rPG A,O<G#(&3(+(jx!M;>}3s!?Dp#\t>g!?:CG!9F-_~ H^':oԞ&hEa> P=#8ϯs~k%zHQ~OS3C~q g|-3/®Wo\3W9?rraלkk د\߸ff5+| mîǺ旯7LJr:am[M n\ߺn^7u|u3~®+𷮛EǢ?!rGG:}߭Cꐕ[ZaύWkb'M16:1/3]W222eF?$f|HՌЏ|a)/_<焮a0+Ϫk͡_v_"3o]Wpq$Fp_w/ִ|5|_oC?K|,_"ߏMyj4 y@p͜׎ԍ SڑB?B?qɽ, v e^?#:׻Eq->N6DoZ$㞌%ЏHa?'Y?uCߏiMZ/!|!ǐ87C'ڰ/U!g1E!_u*5~}KT' 'pD>v Xsxgmـg^$ABzǩaדW ~ڸgkz_~Cdg hf;ϡ} XJ_!?ԟE5}:~nĻ5~ v r?SYb=?אW-BW;IȽz5Y|ӊSٻKw.5/5Sﮟ&zm'k|ݿ?{|}}=tKCKCSBSBBBCC C CBBC_.i_gXgӧϿ5< T'Ocފ5*lm_ϨBR AՇĒ6=z?ϻ'~?sJH"QCbImHTNJӞRƻYZcI㨇Q=Xi#ǨGuf}>2}Oܮq_?ۦ϶__oo//CթpD?BBsBsBBBGmb__O{u䨵pDý+}ý.Aͨ|$y[r"|aH.n>ދ:>QhGrK18> XQp[X|D=_}+}QQ??>\|'z/}¨>'z}b) I'z]>YOQ?!D> TQs~O/4ȧFl>tQo|O/e@>R&3Efp99}(>kp-=٥r"Sʅ|$sKy#E>|R] _@*|A _$JŐ/&GTRIKJ/%FT2RY}uq_.3 WCW*!_I|e U>p_U|5:եאj"_SG||- #BT7 R=|ח _R#4FRS7XM!?A7!Ljo.@QFBU"~!Zj|mmvvR{~h u vB) NW!_ZE|gKO]#|.k+]oF|7;ݥz"S|/7>"Wo~#_;俓"?_>, A~40IÑ.@~4(GE=}zi,cqȏ#?> Q>O&!?I}/UOF<~4 itK3!D~4 YlgG}i.s^/"PZ"#XZ}>_*-C~ WH?"*WI_-A~:I_/m@~&7I,mA~ҶOoWHov CډNi Gڋ^i/p?/p0>op8G>opT:18ǥȟNFrtD>ܟWnOܟ#>* t%/I,O,]At5Iב.@t37[ߒn#[.w{ߓ#_z!G?#Xz_Ї3Iϑ.@/"+57ȿ"V_ߐMߥ?C?+*^eeYA^UUYC^uu@ސMMي-;;+{{/r4ё.@>r,cɱ-G,A> q+ ϐLxǓ#_N|9! D'#XN|9)Id'#\N| 俐S"RN|*95/#|4rZO'G> rF3ʙ$gF>,rVِ&gG>rNsʹ%F>"Wo~#_;俓Fy ?DPyG ?BHyȏ ?FXyȏ' ?ADyODRy*SiO#?] y&3Yϒg#?[y.s^/"P^"#X^K/!L^ry+Q^Jyȯ F^Zyȯ7 AވFyo Eˈmo#]ށy';]w#[ރy/{}#_> C#X>(GcG'ȟO!J>i gȟ!N>y_/!Ie'Fg W_!Mˉߐo"S-6;ߑ"W=>?"P~#1'?"T~39ȿ_"R%—˯%F7[ʿ"ɿ#"WȋVyYQB^;"*#+Bx_y[qB~X_qC^+=GW%Zȋ(=?]Pb1X~,%vȋ(Q+|'G$KljOC~X_,C>J( O$B>J(IO$C>J S(_ J*S)#|%%_*iOE>tJz+ϠdD> LJf3+YϢdE> lJv+9ϡD> \Jns+y"|eJ>)ϯ@RJ! )/ARJ1)ő/@RJ)K)/ARJ_Ej,c~GƉ}?Q"WOϐLxS#_M|5! D'R#XM|5)Id'S#\M| PS"RMȧVDK5 iԴȧU!NM|z5ԌgT3!I͌|f5 YԬgU!M͎|v59ԜTs!K5?P "_P-|!0"Q"_T-|18ȗPK"_R-|)42ȗQFFȗW+ _A|EWV _E|UWWk _C|MV _G|]x_m|! F7R#Xm|)Mf7S#\m| %-VȷR[#Zm|-mvȷS#^|co"W;!I wV EծwUAwW{ C|OV G|_[U!OᛊPC;u AR#?Xu(CaS#?\u$#QȏRG#?Zu,cqȏS#?^ubo&W'!?Idu SԩOU!?Mtu3ԙTg!?KlusԹ!/v!X,CS#?_]bZ.D"|s?C^l%u)Ke!?Q,.1buE?|u2+U!/vUjWk_E~uz׫ߠnD~)·߬nA~6䷩ۑ߮@~.w߭A~>߯@z!?-Q䏪ǐ?GzIO?Fz3YϪ?Gz E/^F??#z%·W^Cz o7BzwCz>B䟨O>C<·/D 򿨯F7[ߪ"򿩿#"F˚ȫۈ5y]374yS4y[sw4yW4y_ hGӢ#]| -&1Xb#[#|[8'E>)j!9k񐏧G>ZBjO%F>$ZRjɐO%G>x_K|J-ȧ־DK- iȧ!NK|z-g2!Iˌ|f- Ygղ!Mˎ|v-9x_˅|.-7<"Wˇ|>-? "_P+|!0"ъ"_T+|18ŵȗJ"_R+|)42x_+|Yȗ* _A|EW֪ _E|UմWj _C|M _G|]^(#__k|! F7#Xk|)Mf7Ӛ#\k| %-VȷZ#Zk|-mvȷ#^;w:!I wֺ EwվAݴwz C|O G|_[EZk}w@j F~6!PjÐ G~6HGjF~61Xj'hMB~6hSMC~6 gh3B~6hs}=?~@ȋ^_A꿐^_X/ы"_T//yK(^Ϳ^*륑/ blBX_/z4 zŐ;+B~X_z//׫|)^-G!?N,@O &5Zk#_[!_O|} 7!Ho|c M7՛!Lo|s-ȷ[!Jo|k mȷE=w;"Q|'+;#Y|kֻ"Uonwӻ#]|'=^{#[|/}o# ?@!?H`}CՇ!?Lp}#ȏG!?Jh} cȏE~}< O'"?Q$}2)Oѧ"?U4}:g"?S,}69"?WyG} /!H/֗ D_R}/W BȯW!J_j} kȯ!N_ o7"Q߄&}3-oѷ"U߆6};w"S߅.}7="W߇>}?F!金?A~1Ǒ?@~)O駑?A~9?_@~%/#@??#~+Uא_G~Mo귐F~;]GCꏐ?F$O?C _//+_鯑Ao;m/r,7CE^545CG^7 D4,-F6E5<=G7#ьG7b È|L#V"7b#؈|?1"Oϐύx3#H|#! D'2#H|#)Id~xH|r#)/H|J#ȧ6DK# iȧ5!H|z#g42!Ȍ|f# Yg5Ea#;ٍ0r"ȅ|.#7<1"ȇ|>#?0 "_(|!0"1"_(|18ōȗ0JFȗ6 _(|Yȗ7* _|EW6 _Ũ|UՌW7j _è|M~xߨ|.uz3#_h|! F72#h|)Mf73#h| %-Vȷ2Z#h|m)7!h|{w4:! w6 w5A݌w7z |O6DQ/}o|??0C;c A2#?c(Ca3#?c$#Qȏ2F#?Gȏ5!?xcO4&!?ɘdc SO5!?͘tc34f!?˘lcs5G{c^#7#?Xc! E/2~@c1%/1"X2c9ˍȯ0~DGc%+Uȯ2V#Xc-ku~xXzco46!،fc [o5!؎vc;4v!؍nc{5!؏~@'7"8!0#1"818Ǎȟ0N"8)43ȟ1"89< _0."ѸNj_6~B'g6 ŸUZȋq=qݸ0n"Ӹ-6ZTqտkCQC^GG~$zGOb3?0 "_,|!0"1"_,|1x*7K _,|Iȗ6 _,|Yȗ7+ _|EW6 _Ŭ|UW7k _ìᧉZ2k#_۬|.uz3#_l|! F72#l|)Mf73!/o eȋ}~lf?]x6ȷ1ۆۚPvf{T!䏈͎!/wGSO_(fI!7]o+fQ,ob'O/w!{}B^>fߐ[淨o~~fwh3"?+`4䇘CjC~9G#iBG#L1!/V968ǙQ sbȯPId'SbNE~9 9m g3Q3Y,s691FYk~b7煼7Ϝ|s ̅/4_db?~02?Ke2s9Z G4W4WhVk"lw6ŞךB^u[憐~̍FsZMffs Z-V46Ts';]]nTcE~/7'̃!/C!V,oF?lA1Q<< $'Shh=mAy<9|ȋ~9o^@/#\h^ yy9l!?_,o^A_1j^Cy=7o7Q7[2oowcE5!ϼ}̇{d>y|bO̧33yȋm TKȋ/++uȋ=6ߠo̷ȿ5Eohfa Xw"^d/[ 򊥢UK yGtT_;~ DMBoY6o[X.!Y>o~`ECO4+z{P+Fȏ[1C^V[XV{m}d}bc+'V\\STS3?>GxV|~h V""+q_ \?$'%dV{J/_X)R!JOm}/4ȧҢҡhKoe@3X3Zde }f+Kȋʊg!ʎn@sX9C^WN+ʍʃʇgG>U_*APȋ=~ HUͿUQX_$\U77ƨ~c j|Sͬ7ZkaD[Z"baj|k m!/~mvȷڣ[B^d}euF;[]P.!?K,ouEwAcuCYQVT3/=^!/v^V"r7W}oC~Xbߟgbk@/[߅"5h bkpȋc5$䋉!B,o bk8?kd_*GZeymA~584qx[P!J,oMBO&'[SP)TT5 ittk3!\,oBeF~5'/knȋ}7[PϷ/ E"뇐,[KBXZ22k9[+[aJWZVGo&ŞXkC^ֺ[uzT`mD7ZdmFo ڊVk6k;b?;Nk.k7:w[{P=Bx{}!/Vց{;`DZPCaTu#QZǐ?fGq'hN)tȋ3hXgZ?g? ޺b/XQ֥.Yl=h?[WPW!/_׬_nuտiBuXww׺gݏ+߷`=DZB^lYQ֓['SZY{n@^i/+_YmAz꿵~EW7~GwJab?ibŎɖm2VP}VWm&:Z?67m ovȋ=۶wlylyvZG|7#Î|L;hbqȋ=|lA> 'v\qO}jfv<ǷN?(¯?8^$IQId!/QaDSKeF>%_iOcE>.ŎtvzP쌨~F;S_+3ٙC^vYQYllvvT?aD>+\vnrycEkC>_~ /h b0ZvN~qDȋmvII_.ꗶ _.ber~9< h`WD+ڕdWFWU[ծ ?!/6v뿆]3Ŷ_MڨvuQuz~=>_n7n7#n֯oj7CQv [-#[ڭoeF6vې[v;Tv;hwBUȋ=}ewF;]BX:_]CX&䋊nnv#{Dvϐ?%{!|o}E[ ?!?`{C!?p{D$G#iB~=ckC~='hOB~=SjOC~= g3iϊ,{69ϱ"?yϳ#?^{! E/@{1%/"^2{9ȯDG{e"Wګ_eF~5Z_gG~ F7ڛdoF~-VېfoG~Nwڻe[n{{!ޏ~!>aG!>q'ȟO!>i gȟEm}/h_B}OdWj_C} o7iB}wkߋۅ=>?"~#1'?"~39ȿ_"_Wȿ_#~-o_-ٿ#"Cˎȫ뎁țێȻ~|4':ѝpb"Ӊ|,'6򱝏8q>A'.qO Ϝϑ܉|<'>~O$D>DNb;IO$E> dNr;)O|NJS:OF>%_:iOE>tNz;d}F'gv Ɋ|V'ٜgwr ɉ|N'v ɋ|^'w _)|A~/ASN19ő/@SN)K9/ASN99/T@SN%+9TAS5UjWs#_ݩ| &5Zrj#_۩|.uzs#_i|! F7r#i|)Mf7sG}¾NK[:oF6N[:oGNG;:|WNg;;]|NW: -ݜwwz |Ov |_[u!|g@gv ?PgX? w#?g$#QȏrF#?g,cqȏs#?ޙg"IOr&#?ٙg*SiOs#?ݙ gf?(wf!?˙lgsuG{gw YBgYbg K/u!Yrg+#!*W9_A~:9_l@~&79lA~69ۑ@~ήXDGcO>E gs䟻/D 򿸯F&$w"_ߐ??ݿ=%OF^OE^45OG^ D,-Fw<y<y hG#݋| /&1Xb#؋|?"Oϐ<_{G>^BzO%F>$^RzɐO%G>D> T^jS{_"4^Zz"U^3xeB>^xYeC>^sx9B>^xyC>^M<DWB^a {E/EW b^q{%/DW R^iK{e/EWr^y{UDW)_{UAW^5yՑ@W^-kyAW^=y5@^#yo57^Sz͐o5G^K[zoF6^[zoG^G;z}W^g;{]}owAݼwz |O |_[!|o@oD[o(Ca#?o$#QȏF#?o,cqȏ#?ޛo"IO&#?ٛo*Sixߛto3!/vެ;,o6?ۛbϙEG77՟-@~"y?x8G%!_[,- boY#yC^1˽ȯ~ y*Wy_A~:y_m@~&7ymA~6y#]NwzF~=^zG~wAz?Fw#Qzǐ?GwO/#/ "#o"ooGA]]C}}?@>!͏|t?1c!ˏ|l#??Fc?qOď|\S??C>~ O'B>~IO'C>~ S_ ~*SO~Xt~zgD> L~f3YgE> l~v9D> \~nsyE>/?@_~! /A_~1ő/@_~)K/A_~9/W@_1?WF_*~UՐWG_~MkF_:~]G~Co7~Mo7C~ [-oB~moC~;wB_wwE ݐwG~O{F>~_"~~w@" ?CC~?G#B~?cC~?'O y$rS"KSOX~{?= g3ggQ9J=?y| _/D~E/F~$"K_/C~ W?"*W_A~:_o@~&7oA~J!-| 1 b!+|#? >F qO$|x? ςϑ<| >'"0H| 1$' "4H| 9Ƀȧ@ %)Tȧ R#:2. &H| ȧ2 !Ȉ| g %Ȋ| [ȋ}.[=ž=ȁ| gȋ}-g F>wm@@p!?AHp cq'?Ddp SiOg?Elpsy\Dbp Ke/?!S3?W\Ejp ko o7BVpwC^p!IGg _!MLǐc"S|,9v79qǕ!O||9 '!HN|b9 I'%%YF^YE^55YG^ Dޔ(o-;;+{{/r drr)O!D> TrjSiO#E>trz-(gB>rY*gC>rs9)B>ry+C>r /(x/F\"rQŐ/&G\rIKʥ/%F\2rY/'G\ rE+ʕ$WF\%ʻ\r5Ց.@\r-kɵ-A\r=/7@r#ɍo,7Ar(rs-o!D Vrk[mo#Evr{ wD Nrg;]"wE nrw=!x/Br}+C(B~<C*C~<G#)B~<:<1X'G~< D'ʓ$OF~<)TӐ&OG~<Lg!< Ylgs|D"?W^^y! E/#X^y)KA^2y9ȯW"R^*GWGd5Z_'G~ F7ʛ$oF~-Vې&oG~Nwʻ%F~=OQ>x/E~}~? D|CaG?"E| cq'?!IOʧ?%F|3(B!N>y_/!Ie EUW!Mu7ߔo!KmwߕE|(o.?BO*?C _/)B"ɯ|*aZ~-owȿ#^#OFo?#Y+_oE??%1TbEJ(qC>J( O$B>J(IOHK(+hkQ>xțۊȻJ|D(ɐO$G>JJS*OF>4JZ*|Z_I|z%gT2!IɌ|f% YgU!MɎ|v%9Tr!Kɍ|n%yU!Oɏ|~Q>xBRJ(E/CRJ K(%/BRJ(e/CRJ+(TBR9ʧ*WQ"_U|5:ՕPj"_S|-6:Q"_W|=>7P"Pi|#1&7QF fJs+-oD VJk[+moEvJ{+tD NJg;+]tE nJ(QWz C|OV G|_W ?@@e!/v`eHȋ_3Db' US#?\ed$+B^G)(c b2>?L@럠LD~2 Ig2%OL y*it ̐,+߅|_3 4KeNȋ4G\e^ |+#B*_,F~%R*? er++_D~ UʏQ>xF~5Z*_G~ F7*ߤlF~-V*ېߦlG~Nw*ߥF~'gIً^eW @9AV D9QǔWN BȟTN!J9iL&+g?Cr/(\Br/\Arʯ\Cr o(7Brʝ(]W"W=>?P"P ߔߑ]y#1'?Q"Ty39ϕȿP^"Ry+P9/R^#Zy-owȿS#^#ORFoQ>#Y+_oSE??51ԘQ>xB>jqC>j O&B>j䓨IOJK*+jksț۪Ȼj|FɐO&G>jJSOF>4j([W!NM|z5ԌgT3!I͌|f5 YԬgU!M͎|v59ԜTs!K͍|n5yԼU!Oj /BZj䋨E/CZj K%/BZj˨e/CZj+|^_|%2*WQ"_U|5:Pk"_S|-6:Q"_W|=>7P"Pm|#q'Mo6E fjs䛫-oD Vjk[moEvj{۫vD Njg;]vE-wW{ C|OV G|_W ?@b@u!/֏VCԡhPu:ap䇫#|_HuT h4:&X4:qxǫND~: Id'SNE~: it䧫3D~]/(Sg!?KlusԹU!?O|{W @]Bu/V D]RP!L]ru+ԕQxB~#?_A~:ש_n@~&7߬nA~6䷩ۑ߮@~(_XWw#[݃'R"W݇>u?P"P=!0#Q"T=18ȟPFg$'SȟROG"z3YϪ?Gz E/^F W^E+א^GzMoގEwԻU!O}ԇ?TC7wW!H}c Oԧ?U!L}s/ԗȿT_!J#?S ȿV F}[ȿW? AGԿ[V EWOkb"S|,-68"W|<->'"PK|"-1$'ђ"T4yYSW45ʗ5 yMӑ5yC375 yK5yGsw5yO ,"!/vPDK'Ӓ#\K/OBSi|I4!/kiOCOb!gZFZ&t~gֲ;Y!/vNV-ٴhٵ!?Ur|=_-wWz:Og@>z&3陑ϬgA>z6ّϮ@>z.s鹑ϭ5}=/y|#_/| B #_X/|(EbӋ#_\/| $%RȗK#_Z/|,erQxG^ zE+ꕐWF^*zUՐWG^zMk교F^:z]Gz(_K!Ho|c M7՛!Lo|s-ȷ[!Jo|k mȷ!No|{w;!Ikz]wCz{=Bz}CB~>C|_0}8ȏG"?R(}41ȏ"?V8}< O'"?Q$}2)Oѧ"?U4}z+3D~鳐F~>9\󐟧G~= _/D~EbK_/E~?ˢ|=__r}+ȯW!Jȯ F_Z}ȯ7 A߈F}oַ EߊV}Qx@~.w黑߭A~?{߫C~C^!C^4~1Ǒ?@so '?B~:g&gC^?_y{.C^%4~/!Fׯ_ѯD_5k~=+(PMoB^o#[.w{#_!ߐMG?#X)Og?ӟ#\K_ꯐ_k_oEw{D O?g?_Oψ| #&1X2b#ۈ|#.qx3#H|#! D'2#H|#)I )7 yPW yА y07 yӰ ypw y y#Ɍ'7R H囊F*SOmA>F:Ood@>F&3ldA>F6ّn@>F.s|3ȃ|#/y|3#(| B2 #_(|(Eb3#_(| $%Rȗ2J#_(|lo./gGQ FE+dTFQ*FUՐfTGQFMkeFQ:F]gԏ- 74!h|c M75!h|s-ȷ4Z!h|k mȷ5!h|{QxotBF]jtCF{=iBF}kCh B~18ʷ!1"?0c8Íȏ0F"?(c41ȏ1"?8c< O0&"?ј$c2)O1"?՘[t3aD~eF~19\gG~= _`,D~EbK_b,E~Co#ː_f,G~JW_ejWk_cE~uz`lD~ Mf7lE~-ʷo7v ؉Nc6 5!؏~4!8aG5!8 O?#q)O?mAq9?o\@q%/l/WjƵ(^_3#ݸ &7[2n#۸.w{3#x!ߐߍG?2#x)Og?3GK_eƟi_k_ocEw{`|D Om?g?_|GWߌOό| 3&1X2c#ی|3.qx3#L|3! D'2#L|3i$)#/ "#i"oi#o"#A>b&C>|f~/`DYBfa E/bEY bfq䋛%/aDY Rf(U7 _,|Yȗ7+ _|EW6 _Ŭ|UW7k _ì|M6 _Ǭ|]^&o6@f#ol6Af3䛙͑on@f:ωf4f;ۙ7;Df';lvA5f)CXozbf/^f%}cE~f`D~9(6 ?Ps7G ?Hsȏ6 ?Xsȏ7' ?DsO6D94䧙ӑn@~9wgB~9skC~9o.@~"_l.s)K\2s9ȯ0W"\*G4W#\s-kuȯ3#܀s#Mo27#܂sk-ېfnG~NweF~=OdE~}~?`DyCaG?bEy,7O ͓ȟ4O!C _/iB"mA;ߙo~@'?#O/l~A7俙"VLcZeF>8V\ZgG>VBZOd%+ I'$%KF^KE^45KG^ D޴,-F޶E޵<=G޷+|JVr[)OaD> TVjS[iOcE>tVz[`eD> LVf3[YbeE> lVv[9 ʉ|N+ ʋ|^+ _*|A _*|QŬJ _*|IT,[/mAUV9Y/oU@UV%+YlUAUV5YՑn@UV-kYmՉC.uz׳#_j|! F7#jbu)j7#j| %Kj淶 j|[].[C^: |Gw |Wݬwz |O |_ ?凉 Yl A~50YÑn@~5(GYmA~58YoM@~5$'Ypߚk*SiO#?ݚ k&3Κ,k69ϱ"?ךZk! E/G%RZ? er[+_aD~ U֏hF~5ZZ_gG~ F7Zdm#k [o!ڎvk;v!ڍnk{ڋ^k :ADQu1YǑ?n@3?['?iBuXg?kCu/Xh]Bu/b]*W_պ5:׭߰n"Ӻ-6;߱"׺=>?" ߬ߑz#1'Q~xo=E gs[/aD Wa_eF7[ZgGG?ZdNJ?!/v??+[_X_ZB^׾Ymgǰc1iDzDzcǶwbvvNsڹeF>]vA څ/dF]"vQŐ/fG]v(?QK!_.|i eȗ!_.|yW+!_ɮ|e UW!_ͮ|u5״k!_ˮ'vukC]v oh7BvMoj7Cv [-oiBvmdn|;=w;"|'3.w"|7;{"|/7>"|?"`D~=A`CbE~= ap#aD~= QhGccE~=qx`OS{O ?ŞT{Og ?ÞL;俳g!?˞l{sϵ!?Ϟ|{俷 ^姉"ً_l/A~`/C~ W+_iB~#?ګ_mA~:_oo@~(?]7#ނ{+[mo#ށ{';]w#ރ'"އ>{?">!p!G?bE} cq'?aIOڧ?eF}3Y?gG} E/ڗd_FK)Wb_E+אf_G}MoڷeF};]gGCڿ!;ۏwOj?C _/iB"ٯmA;o@1OFo?#+_oE??'1tb!ˉ|l'qu!ω||' Q~O$B>N8IOHK(+hkX[8;x{N|D8ɐO$G>NJS:OF>4NZ:OG> NF3:dF>,N(?Ww!Ɏ|v'9tr!ɍ|n'yu!ɏ|~t !_)|aEu!_)N K8%/BSN8e/CSN+8TBSN8UTCSN k85|ߩ|-6:q"_ש|=>7p"i|#1&7q"i|39͝ȷpZ"i|+u^w i|[ȷw: |Gwv |Wݜwwz |Ov |___ ; @~3 9 A~309Ñ@~3(G9A~389L g"IOr&#?ٙg*SiOs#?ݙ g&3Ι,g69q"?יYf(Y,F;K8K_ er;+_DY*ǐ#;C^5Z:_b!/g1/l y69lAl b-h#+ΐtv!=OE~}~;?Kv 9QǜwN ȟtN!9i gȟu!9y_t.!ɹ嗊/\Asί\Cs o87Bs8wCs8oQy#1'?q"y39ϝȿp^"y+pDO/r^#y-owȿs#嗉G?:?|F/W:ߐ%n c1B>nqC>?/'p"M|"71$'q"ԕ\yUW\yՐ\y57\yӵ\yuw\7ʯ]y q!M|r7)ܔȧtS!M|j7 iܴȧu!M|z7܌!/f yf+#,nV䳺ِfý|7'9\rs#b7_ȋ}~-ί[n! /A[n(Jw#_-| $%RȗrK#_-|,erȗs#_ޭ|"JWr+#_٭|*UjWs#_ݭݚtk!_˭|muܺu!_ϭ|} ܆7t!m|c Mܦ7u!m|s-ܖȷt[En۸moCn;vBn仸]vCn{=Bn(Fw"|??p"? w0!q"?0w8ȏpG"?(wtȋocܱ!JwE8w|ȋ;͟N y~l; Id'SMqNCNy~l;#䧊̐.߅ ߝwvo9!Mw"?םV]w! E!/EbKK_w]rw:J4*7!/=4Zwz~Q~׻B^lwcȋ M{-h[ܭou!;w݉޿.4?=E~}~w=bB~XFGG?C?G'B^s9I4{ Sit~3!/y=u!=y܋Q~ѽb{Ϳ;Jȋ*ZUא{u!ͽu:Morovwܻ!/]:{}>-Şo!/Gh#1}?qOg=s}b/ܗ^_ 'z~}}-owhQ~{Cȋ܏t?}rFo?(?_B^q"7_GY /Gޟ^,4?;ž?c{qE->?/^BzO%F>$Ş/)z~I= _{eOAW<_44_tu@7<=ӳ<ysV;byh^|EB^#^2t~ɼhɽh)!/KB>??6~MCOG>?^(MeygeYlg󲇼'^ΐ{9\hhN{g?Ewsyt Q~{ERȋw9 xW]Ekȋ}~~׼h׽h7BwwͿEzQ~Ð-ž~~y~?{{??Ͻȿ^ ޟ_k_{oxoa{b??އؿ!/v~>'&{|g :/א}C7_O>yb1C^ߘ~,4?~(P yC~ C^O'BO'FO' y'OKh/"Zh|ywB^E=~?#h~O'#O֟Obߟ)Thh4ȧӆ?it!/s:?=:~3aaτ|&?s7,!_IbO6?;:~s9s\~nsyy~3@_ _/ο_8_/|(Eb#_/bϿ_2~+ yJC^)A_Y\ȋ}~+U+!_ɯί__5jW󫇼5D_+žjAE_/z~} oo7o7Mfͣ1~o|KUȋoۄoEv~hw@~'N~g4wE {F y{>ؿ!/B^@4?Ac?=!Pt~Cah08?o?? Q(B y,?by?ޟO'I!/M'OA~?Tzӑ@~?Lo&B^Y/+sύ?秉-CX _/B~K_2ˑ_@~*W?"(Rد"_:= o7"߄&3-o"߆6;w"߅.7=B'o?%G~A?F#Qǐ?GD SiOg?E.ʟȟ/ E_A W_EW_o ÿM ǿ]^?#?@o#?A3ϑ@+_ '!(Vؿ";=?"'oA3/"7_ b #| QA>NA<$@>AA"O$A>Iˁȫ끁Q7 y+y'pwy/  !,H| )ȧ R!*H| iȧ !.H/A3dB>SAYdC>[As9B>WAyC>_A Ea_0(|0" "_4(|8ŃȗJ"_2(|42ȗ "_6(|< W*"_1|r$+UTEjP jAu5DfP ZAmkuEnPzA} o4DaFAcMo4Ei,_͂7Z "h|ˠȷ &h|۠ȷ: !|Ǡw %|נ݂wzD_}'=^ z#;|/}~ #?` A #?8`(Ca #?<`$#QQF~t01XG~|0 D'LF~r0)TӐLG~z0Lg!]0 Y(U ?'`G` / !(X` K/ ~@`˂/V "X`k_C~]7lB~S[lC~[w;B~W?Ek>@@p!?AHp1Ǒ?@D3?'?BTpgu?8< _."12_%*W_5:׃n"36; Fp{}v$q"q|H|G D'$F>q$ I"IO"2rDA^ȫ y-G@ވț y+b#oG䝈">~$@>DD!,!N y#RFRF>u$Mȟ#itQxI|HHF4?c$"C~X3HVlgdG>{$G,Gr?+Oh~H?%G b$ȏ#|u?R0+B!?]y G`)|H1E#_R WTHe+G _%RjWTGz5"5|HmkG _'Rz׋G~ " oi|HcGD)M#͐oi|H [DZ"2 VȷAM-m#oi|H;D:"1 NwtAK+]#ݢ?Dg"?UrJKF@$((JFTDE0$AAD@$眓|s}yS󿷫t7756ȷ "6h|=탷;|#Nw :#9xw.w "5x7DݐtG{AO{{Ao{}A_G0@ F~p0!А= C~X0G#B~TA~L!c|GC~\0'L@~B0!/z?`2ϐ,`*SiO #?=`&3Y >G f#?;K B`.sy!?z?o&` / !(X` K/ E; !,X`+ȯ V!*X`M"6X`= o6"1؄{~@`3-o ~D`+[)؆`;ۃ~F?=NwF~w{E~o}~?D`pCaG?Ehp cq'? C)O?ALp9?\@Bp%/\AJp5ב@F; Z'CpH|2")DJSTȧO- FE>H|:"DF3Lg, EdE>Ȇ|6=D!ENs\- G܁"/yE>@䅐KWB#A.FNxȏ|~Q E! E/""_TC;Eq䋋ȗ%/)B.Q Rn/-ʄȾ(|YQr"(|yQ >#|EQ J,DA*WU*FaGCx|5Q5DMkZ- _GEx D=Ǒ\<I/B)iτ,ϊ7!h|#y/ xKȿ$^Fe WU4Ax ȿ."T4Ch'ȿ!Z B%-E+[KFh|D{ۋ[t@|G N3;ȿ#]ݐ&#]@|O ^=- G/}E? "?P B~䇈Ð&#?\@~H1 Q?- ?F|b,cG$>Fc1qb<'"&1S?$&#?Y|gb ST䧊iOӑ.f ?CD~,9/BF~%_J b-A1b BE/_, D,E~ow'!L,Y.Vh+Q+*W!.z_A~X=bz׋ o(6hl!ft7--*Z_l*~/IlC~؎v=?G_b_7Z_?)vKn[{#"WC~؏~q !G?""TC8 Oȟ?%N#ZA8Yqs</_$.#Y\AUq k: oCbxe2')O!S"RB>L|j42-ie:ȧ 3"QfB>̌|f,2+Ye=/#]@> .s"SB>̍|n<y+!OR /D^Jy- Fڐ=/Nz̏|~Y e! E/""_TC;eqȗ%/)B.Y RnCJ,|Y=#E^Y}'G~Y? +#_Y>!U""_U>W#?"EQY j:e kȚה%k#_[A|]zד#|'?)#__>SA_O#|g?+"P>sdc^ E_/!|+ȿ"_EU&5_#lףe37o l| &oʖȷo%B-ֲ md[vȷo/Fm#e';w.+]ȿ+!MvG|{ȿ'{#[A|e_~/ ?@D~GC""?TC~p9r$#(G@F~!ʱȏ!8ȏ|\9 r"*'!?INF~ ȩOӐ&#?]@~L9 Ys?_ l99ː쿔_!\9yk俖 |r! "/K_""T~;俓ː_&#\@~\"rjW5ȯk_+!NG~܀r/@r [("UOrv!J|:*TF3LgRϬ|>ʊ|V l*;UsېMݎ*'9U.sVyϣ@*T|BgJWJ|^+Qy\{}U AU_HU~Uԝߩ#_\@*|IuwR!&/FnUҪ eTY˪rȗS {Uy˫ WP!UE+JWR |e HUAi#aV zGU5䫩WW5j"_SB|mU:.uc?!_O= PO"|}TȧR oFi ϨgV5DzT#7V? Z_z ȿ^ի1>%&1>MkC>}djEf1hb_Bz Tk[6ȷQmo!NGzU;wTB>CdIuFzwT仨wU"|7=TO{^R!|o>}W}!OG#j  VC"?T C~p5j$#(G@F~!ȏU!8ǩ!)>A5 j"է&!?IMF~ 䧨OUӐ#?]@~L5 Ys?W_ l5'3G/R}Wj.s<穯Z}7j>/T_#X-A~ZR-ߪN-C~Zr"DȯT_V#ZA~ZZuj=7oTߤG{?oV[ߢ~DG'RB>kڎvgV _Nw]R߭~C7=j/{>W?"PB:au$EUǐ?#\@:Iu S4ϨȟU?#^]@Eu K2䯨_UB>{uuw&>N#!L'G>N| :tjS4ȧiO!NG>΀|:t= EgE>Ά|6:9mߦoGv:tnsy%R-WZ#Ahy=^G>.|]ta "E/!_L߉8u Kȗw߭K#_ZA.|Y]r".|y] >#|E] JЕDAP猞U"_U?я"|5]5tMkZҵ _GE~ t=Ǒ\?ɐ=#__?S ?A,7!n|#y/ ~Kȿ_Fe WU7A~-sGב]7En|3 -oDM[ȿ[#ZAn|[v=ȿ; Aw <tg;wGwA|W.nwݑ{ CD|/}G}t#z_@~@=Az0Ð#?\@~H= Q?У ?Fz,cG?zxODO@~D)IOғ?C3=)z*S4O3g"?SB~!/z_F~%_ꯐJE~<5_oFG~^zb%/K_E[e!D/+_W"RB~^j5z-k:ȯߠ7"QoB~7#YoA~VB^Dmoۑ߮w Cѿ"މN ]z7o GE~އ>AC҇C^F#G?!LG> }iO3ȟg?!NG}e/+1~}*W51>Z1 q&x d&9M C 27bh=& iLm&]_-o&LƐב}F)G;~Lf3,1>GYL_'Zd5M?0Zos[-on&'9M.s6yc@&L|`Dț#F!F^1ykxɏ|~S M! 6E/b"_C;Mq䋛ȗ0%CF˔BMiK2ȗ1e/k!_܃=^5/o* _܇}~7h*!_<2̓!C?d _TEy#?bEQS j:M k4ej#_A|]z3#y"}y'M}뛧4@y3?cEY93od#<_0/"y ȿl^Aj珞7Mob^C5:򯛦75͐of#ܼ-̛ȿiZ"ҴBy Lk[6ȷ1mok!δGy; Dw0h:!tFywL付w5"|7=LO{^2!|o>}7}k|f@A2l ? E~03f#HGQȏ2 h31C?4ck> Bc?6g#?|'fD'OLB~d)O1Sj!?LG~ 3f!_8z|f6/|Wf.s<癯|7f>/4_d#,A~YR-ߚBHY2f+JWUȯ2_m ƬE~Y:fF7Mo2#f7-o1?|'2ېf#@~/b~EWfnwߐA~ً^}f?!_,zB9as#(G1䏙7'?aN"ҜB9is3,g9ϙȟ7`."\Bes%쯘_5אf#@md'ɑOnS ¦D>M|*6 ilZtȧOo3|>͈|F L63mجgِf#@> ns"B>͍|n<yk!!_"z 䅕KWV#AXyg=G>-|[la "E/j!_މxȗ%/aK"_ޅ]mK#_ږA-|Y[r"-|y[ >#|E[ J+zVF}C?d _VE}#?bEQ[ j:m kؚ״ek#_A|]z׳|O'G} lا>3Y䟵 ohC9F1?o_@"/ڗɾ;z߾ Mkȿf_Guls7ö@}7mK[Vȷo!m|k6-mm;!_:z߾۶lG;NwlA.+]ȿk!vG|{ȿg{#A}?D۾g#@~@;Av0ءÐf#?܎@~H; Q?m ?~em#Gm8'b'Oh?ENB~Ϳ3~D)1>9STiOng ? rig!?~sEvQm9_+Z~E۹1>Gs?"Z~Eob||v! "/K_b"~D.C~]rv%+*Wȯk_c"֮C~]z v#&7v3햐7zv+[Od!nG~݁3?_v';.wﶿ!݃v~!_>zD=!{GQcǑ?nO žD=){ gYsȟ?o/ ^De/+_Wj!^G ; ⑏wɐO#ܥ@>K|J T.5]ӸȧuB.\F3Lgr eE>ˆ|6.9mnGv.\nss#|EW)+EUF{C? _UE{#?EQW j:] ktj#_A|]X?=!_= pO"|}O7pO#{gܳ?"=s\c޽ E_t/|2/WŽ Mkȿ^Gu\s䛻7õ@{7]K[Vȷro!k|k6m?=!εG{];wt:#ٽ; ]\W仺wuC|w'=]/{FEE|?n@Ar ? E~07n#HGQȏr h7&DЍE~!?΍G~O'Ot"$73?sS"?MC~t7#F3LgYr#/lg9q_" \ys_#o|/p _!-F~[G/u"2䗹/w+_V"ҭB~[j5n-k:׹ȯw6"mB~!Hیf-Gt[~B' mn;w/Wu;v!F~ uBACr? E;1w'IOSȟr? ƝE;9wŐ=.!]Fwu䯻p#=q>x,G|&)OSKS#ڧA?Oգ}:1>Z >c-33gY"gC>ώ|v6o#ω|N \>7};BFϋ|^|>@>y%+ko7"oCy _D/|!_¾E|ѐ=!_߉8} Kȗw!/|)7wȗe/"_֗C'Go-ˣC>J}mR6F%j__?(׉Ub|h_5G81!_WG| _|mk:uCv |=Ǒ?IB)i g}C7Bo|c<uKȿ_Fe W7A ȿ"7Co|soȷo"o|K V-oۄ||{w@|G N3;ȿ wEw}7w={"B/ ǿ/}}?"?B~`?!~(C0#G"?ҏB~ Eȏc?DC?#?#8??'"?~d'ϐOA~T?-ӑg ?D~,9/F~%_E~<5_oG~_~"z/A~_R-/C~_r~%+*Wȯk_"֯C~_z ~#&7C?o[DG'ې#@~/EW~nwߐA~>?"B?a#(G1'?O"ҟB?i3,g9!Te/+_W!_G ; :?q㑏ϟ d#< SO|O?u7ϟ4"6:O|ϐ?#gB>Sѻ KI;Bu 7oOZOrwqBA}v|0PܼI(;u27t UcIqڏ˖b ˜k(uRrs_ ~?~OHX4៌F\۸Z&׈k~G:L|Q}߷S%lW<-y5Rc۱UY\BMS&?r6?|1'_?7o_ɞNwet^l)yME?L[ f d\Vq+C*<񻘆_&,gאkH.dq 9ݶBtW]6' TkgW*$1{\ LܿztMn/tuy&'mMO]c[\z/;=Ok k%cٺ:`vKXONW`KtLw˟qqQ3صؚ ų'[M8=n_Ͻ,mG-{ I4ކ&Un)3b~?eOz,ÿo^Hx2Kq^kp ;+͟?1L3P C_|w)n1¯6m{cKqW]Q8,\Kp f|030ﻎ ױ:_c]X5^uݠ 0&Ċ[[xv7sӼr{wK>} g]4{s^_b\W־jRJ3(,tpK$-L2ϲ2%kl*a)'\Vr~;G0yf͖L>Ff{Dq /Jx["տ5}Sj\IPTP@K^0O~ gb0wktX_>X#{?Ѱz^QվYX"g>Yl`%^[j{iea岇[g[VnZ)aC vUdZv~VώZC;dm5=vXjmu5VZ[b}l6Ȧ0dl,FDLnunGgm5̼j0CE[5m̞v[ZgųÎYD;iE{챞[z.%;m^zVĠ zwc\co&܂;pZKko|/Lf7շ`Z-іȓ羵fm5; |G ZwѶvݴ﮽|{`"fc}4Og:E~.#V!M~n#t{h=8` L׃~`1~!}G!8lj}x;cYTv]oiW|oWhBZa7`7mxj $w|z,Tz}h  (O ~f %8po6N=~'~?G|7'yi_ҟy_ 5*oů쮿e){w3^wod_|w$.75p[NhVX4a&d2P\~t$1MIs\']K )!EXԓR*PTH@!)( Ep sI@v|$c 䁔s $x)K|#{N^x ynmwrKn?c:j5_ .R.NrjqkvZc긹VMnqkj] JZv2%T.%ٽᬽiskל$D:Avrַ3o%| 9DƲ7lud%+|uY<_I|yKX_B>t򹥕.Rg>O.9}bHrWS&|@yd";cm[n/,Nq {reW8 /|ve.s3;S!6&E0IsBwt>|7F]D]B.rs`b.q`.s[Qu;+ ]w]׺= &fl"vvǥ}.?cgEms]tXP vYlָ%5c5|>7}3Dh,G>OSI=g> d/^%l54.@ҒIu$E7I)%~!bI@i (&J}a3KULr=SGֲ}DndRCUw\)Qg\GDž'[Jw9nMwkmgɒdIzUtYKny-jVt%دn#s!sBew4+J3(͜(<YYWYX%X ,CMo(zC3TcKWM۸:* J::F ( :ѕש0frr]9]ce28' \;.?j2?2?2?j3^ pp~;a+H$v ygA6–BT ccac]C]QST@OWLB'h(ЕԺPӕj4Q(%(k*yYkN֞ _d⷟a|q}\''*N">FϮ&vBj2<99MTns/#Y .#lv89\j[d.զ4pn#} Uu s+laم 1vN. q?85޺Ao7Ňe> wΐGXxr.a $?CiƄf!=/h233iO,=|m-cW>]DGEAvv:;Rf':~A--*`Km-F/i ɟ6IQA<5ۖ1~9wVpe%߭հ76.gke-vεvkW:cn-s|O9o'aWT\~E,lVo~E;gے=T~,?h!ǭ?aEI+*O[9*sV՟(x_&W5׬n}u77m F 10߱I;F [oC:z5⡾>E؏tѧpƧ1_-  !9y{]߇dN$-d䃼r@6 !-dA< "CX}`} ܵp_n e冝`;"Wm\r6y[!glYrܦ#l(]{?a;k!kޗ[mYdUdVL&Yc9de~FYr` ő]jXd`a*R[KS]EW5]khn^<9G<&p ӮtfP*s$3.\R~+ ǜNorǽ{.u9#\zNxz) uBuz2fc ]}wX_s{H?7 UPۑQݱ,l1$%ђHvK"-Rj7# ULYlU'`"r5'D(S֙[@Yhd &j&6_f+eݶIo{dQ;)ȒvAN9md-+g큜dx.\7L/,+|+!DԫÏKY\ $zLni =d_!;䂼Xa(% <_ joP4ZcG;褗 tKK/Z_``azFY`6`}t3@shz*A=iETcT#0 k?/YCeNw˭ND{NR,x{=_)lT2I/.]֋LZTJHJ7\9b$"J7)o5<,嬦ViYc<sc0f_sIV+鴠$ӢOKJ -+V/d@ISy &2}Fz1(9;el)VfrY dSl./2L JuE=x ݙeOT Ӗ^KTm"1 %DzzZJz#7 RJB Ԁߠ4ZSB' a 2 &T V ; g26[_icyM dZKv4&R<][WIe=$=3+ d EO,mi9֖Vzm D1*YnW9pA=djѵDzsUl/ToT!RDl8)Ϣ~2!QKH'"Br2 %B6%32%W' ‚dda2$K@y6D'zTc=PǻQRt2U{ =TOӯ:e=מ.p-ŚbzeT?+V'ZGl~.nwn>/s䶋] (z؅ף1]r½|=Gr݅@u4C1;6Z9VQTr͓nuAM]nlwd([8YO"\r%qSTsc fH7[2-[.ygOFu;~w&-; aihNHcш(u9}sR-RVs{!hL Bf~Դ/5$ko N.ϣ|N?t0.=kz<i+BZ%VUS]&Ml3قyZC[z [~{ 0xS4, `FuK`Zҗ>?>ߖevMEmQGe< aA 5ոFriRc͔6%0A2sN$߉bk}/)ϵ.r^Cڑs^&u8z'$ʹѮRIsV?@`I9kG:^mUVZa[l@y@9@Yl56ԶޒQ}~ŞR}{?ޑ/k=B9B9fc `;03?5P]=(hUVJW棸fZjlu PzT.UW^Rn(Jj;/[͘uC~C-Ͼ~B&ӥT%t\\HwE.~qK{qJLz>,>?2?b-%la}kYRI*XtI+H:PrI/|6RFJ%WkH}WKK{)"$2\2d!93=EL""^ %&;~qQ8+HêrkW\_5g۟\_;Wα޲/x8)(ĵԢщh7|xl!y?UlRSԖ.akmZ4_KڿvOHgZWÿ^Ϥ"2?d/]4KMe.5Y*YK3 ˟}g?-gIOU\nr-|ky #w:Y' \~pocp>QvIشY-Vm2fgL;YNwhw=2~t?(m%7cYO}UjTfX{Y|PʟٟP姤[!9n!?=|q_ Wa!/h_X/I}>M/>5ϢY}FhnR'> I8SZ_QT(*E%*EUDNm".S?"JnK!DL7"ӇhwaxkKLS ; O Rvb%;.mev>/%)JAHBNDBfT2e/Ԑ¯~$$!T[ZB>DŽHg=s(8JO ># 7='wm?o kջZՍZ 5UQ7h;ݬT-PGMCQG GIj**1-'bzN -5^ЬLzG}MNh} o4>F@Qg4duEw.!]ƛ͕ԮHJډ@Oَrhґ j`ᒔbhU-Wy )@ߘ1=:Pӿ4[G0rE[vzF; (wP\{W}?Mw44 Dʨ|:j/ԬTЄ>&5OH|\McQb@4!uW3xCXԤdQGE9PZb׈#>_F @xz$jS4Ԫ8n]aɨe8 r*fd,Խ\)B RZYO_9R[ZS!b%YkIjp 2.$Z ?ϙJA ϣy99RїѴ<>*Jƃ?ݡQǕ3!T0󕠊y_jY!40%_BG˜ͳA/tӥ[nͰ?l=Yv߲9ls*E8l-\j m-VaaN첽} 8}zspc|j쥭_籆Yg:kba ZD?"ah~|/{X :C'hm5fi؆į![gU](zx d,k=6=Nү\߸Nr #Q~HJ>W,1GraH} -WH/ @+&#=&{̴ڲcQo!}iF1b%=Vg8˟_=MEc?ӫQ3/_]~2BH ;S'K С AOo-\ze Ϊg[O8s= =)F3:'}3ziPXHYźXog]eg-d5^YzR؊JmSӷL~.,bG.O5ԈrZÅa}ϭwơyiRˤK,.G-ε:ےLY,NO-N|guEj0I=~/]WG{zHst@#@]A<\J腲hhh\vpͱGN6e[$m0^Zyk䅮Ruc\u_dm9]\ekD:zc=QhDl"66q[ȼ-Z[md62u\ B(t%q+v̳(:U9gak:H:&'NcYh{?P/P>Jv__+2ۈ"ol#j}5ޕD2"{HI%Kds%ͦjΔDO/:UNsQ [a-זro}1~N'NdΒ^Pg't!Z&ɆdBy@no"dA>-9ɂ,z 8&$#~l/$!?]>; %2wSx,?Cf'IɛdBZfH6W˒[/H~R(g4p NJ%=ǥ¢ߠ.Ӑ,6V0`Yij6='{?a71v>Z:2 yIJߔ.Ⱦ`[{@鍞PS^SIJsΗ6Ύ7B=8z}P#}FRcɜdd2ce.:H/L.F/C|e9B,^λIS[YCևDhmF έ6'SEѓMO6&9pIaCGG#a|֮V;ٝgGV{|VNi9؃G Yͩte60@wh挩jZ||YF-)qDՁD0(y/S̒`Y(eOvwGrZeFdC# /ҏhIt!;mxK r ݀ȮKT&kH9JW:ZQk9ieRCKRϋ0-&cL"2K B\ rR-Z@vA8g2=x /> V(.F,A])I/I)E4fgePeertE!QYӷj}ԭZvmjXlu՗@~CԵJk.-gIio툦B_r7@]l/խ-fVRS91WkBD5j$Q9xWVޙIzl~f֖$$jHlQPK=qJ9 9+/|"f!f/S]ѩu+o[7:֣:J+z('j#o.K?KzwTA}Ԁ߰>'HchY$Τ$8a/ :z;CsrM)r:lV?bX+a d[`;=Q8 w.U ps >wI!t '}bkX\8 r_ >[x)Sx6\pNqVg7ln7nv[$/\yfs7A.rѱCn\v䊛[ brXk%حn3ln'rpeygcxy=|f*"%|q,:Ntz Ʒ\>݇wfWM7ں5宙.vmu]g= QPC.nvp 5=s3R5ZϭnVw[ sEC˹]Z֒^- >-!'qWS3횉g3gd̛3L/ŘMaDY+dw}O30Hcs:7\r/-=Ƨ_ Mf|M _` d^8G rW4uq`]7-{uP joPp4elshsm N]n]־tgu(8wX': _Osf]պ5tؿź_s9 mf[4yn/7T(>1н`ϞwH3}/ThO t$~w ;)=1Зj핁nC#I1؛Vp?S`9X]鰌SbjX ]lAτ' a͏|[u i_=Г:HP#k:^DSN s`%|]k6&n噝zUe=\Gf}T!\ͰJX01`d=`7F00 }uw(urm3+9`*A0rm,]3xvmmضY`V]`,p_g yb\Tol[}3DZf=ڠYϺ~ܿioy _we:aDdtd#mASUOhm}VѧZIky}ewZ\?hK ͧ4 }2kxzFXJꏖHc[|h|Qh"ir NE2G['ݖv] %zsRnsCEvJi{LW ^K N#gFZh,bkNٱ+%ԬX3[r`h:Ki-L~Ք [sh2ˍ4ЄVeMY[ia5Ub4R~&V5>moz͞.Tndqwr'כ B#t;%z\p}1_Dpc!CKЧcj0ܔqzG&=xDnW2G_|}KV*}I\6S٤6H2W%BN%9 {\=C~Rq9ݰ`[R.erm }['H=*wxM='!T=IzIհ V2XL, cL2f2LH#CFȊdH2a$Q3hCt'&yS E VjX Ć8go;X o_w-`!C~fhqmr*XNԾzZB>BdS=oMup|VO,BRFI$Y$ ākpO~<? /Yh@2Ȭ?i@Q-4RF հ,Q lQ o~O/Y?o}:{S_ d`Z_jWvOyv;G|bg}!W[|Cwk}ʏsw?e?+?h`0 >:C{hMkAe(E!d>WἽG`+^K셟 `羽=MF-(oO|>=z?;?7n _W'E?B~zw3pw㾳Cw={|G}]NWrV6ȷ0fV:ͷɾ1too=}ci'hj+@BC__BM_W@y_GKߴ !i!!|U"*}!  /̵~h6/4/ /|I})YZ2ZZƗ V"VFWfU6tƞ: Gcx2u\_Oe~Xv|8ه{C]G !}$'~.,֧~>#\ЗPZG'?ap.gG0G 9dFdq%i_Y{.vvYkh;P@-UlC8~{6che6rTH8I-F/BH$Z/RjIC,aR$(6j{~kN׻͹\)W{s9/sc3er;/5.ܬ[U^N;=_xioJ!n fQv=uDv tӎ{[W&jeZeWhlפѰVgD>}rtnzw;B:שW.-Ko(,b׭`7y8s'ysa#KؼnS?)Z)\U9 |RILi6 nii>v OQUC1%~wZ -a=Z1mQ'fI҅mau(DDTyT{L(J{q m]6`-( !Cfz,mT[`>6a;Y L|gE#I k:YݰvY3;aI-lQTNtUY~fL gрflb;dԆ .y-I߽LK´?5]Ck\7ܘ&\Luetnm/ gnNi֛v: zF'5_ ~Zε` {8/g#n::V@4WCZA_KWzL=Z8nUDա jfZVޅCpN} kKok`^U*8' P-z_g;UQmEXݳ=WU$:!=q-R/ O3 E1 Cn6~T8?7jpTAPLz*G-F1؆"~s,?:AOJ˧yTcU}oq=CsT#j< < S`L4d!rIi44? p`!iC@@W[Ʋ \IJ xڍV PV]@eh|DL kPHMl4Z1T0 RX5h@4!AOjW}:Ւ4_kuȝfϾwse & HԊ1dh+cVdv@k[yůnjcyRP} i ܷkX3ID Vj4" .aƯ\dq}|3OG8σ+("|_XSM"]dMl}tƗ`b12C(#8'PgqKAPGшa q'hBB.i6qMSqASpVG:Nរ=-d]&Ju¥QLκL9 W&z\smr -(@  ` r<@http://www.tinyos.net/dist-2.0.0@http://www.tinyos.net/dist-2.0.0d Chart Excel.Chart.808Microsoft Office Excel Chartf Chart Excel.Chart.808Microsoft Office Excel Chartg Chart Excel.Chart.808Microsoft Office Excel Charth Chart Excel.Chart.808Microsoft Office Excel ChartD/ 0|DVerdanasw0hh,-x: 0"DTimesasw0hh,-x: 0  DSymbolsw0hh,-x: 00DCourier New0hh,-x: 01@DWingdingsw0hh,-x: 0@ .  @n?" dd@  @@`` pb    43  IJ LNOkB-VX [\`(bdfghvwxyz{$+ 9!   && Lb$fu~W2.0V0o2$fGϞ7ec"ob$$qMxHJĠb$B2uH<@&.b$/nIf!RDBҚb$8'-[eCWb$K{2̯'2$i~ .knP2$ ^d$Y 6 /+$"$+U 0=  0e0e     A@ Ap 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||s " 0e@        @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F   5%    !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab f3f3f@8ĺʚ;ʚ;g4@d@dvx: 0ppp@  G4BdBdxx: 0<4dddd4 0h-<4BdBd4 0h-%fh___PPT2001D<4X0___PPT10 ___PPT9/ 0|d?-09.14.05 ^Verdana Bold 8 write title of presentation hereO =!6TinyOS 2.0: A wireless sensor network operating system0David Gay, Intel Research Berkeley with Phil Levis, Vlado Handziski, Jonathan Hui, Jan-Hinrich Hauer, Ben Greenstein, Martin Turon, Kevin Klues, Cory Sharp, Robert Szewczyk, Joe Polastre, David Moss, Henri Dubois-Ferrire, Gilman Tolle, Philip Buonadonna, Lama Nachman, Adam Wolisz and David Culler 11N     (;Sensor NetworksSensor network are collections of small, battery operated computers with sensors, and possibly actuators, to sense and control their environment radios, to report data and receive instructions typical expected lifetimes range from a few months to several years PI I <Some Typical DevicesPmica2 (2002) 8MHz ATmega128 4kB RAM, 128kB flash 512kB external flash 20kb/s custom radio many different sensor boards 2 AA batteries: radio+cpu: 75mW sleep mode: 140W: z" z"B   Jtelosb (2004) 1MHz TI MSP430 10kB RAM, 48kB flash 512kB external flash 250kb/s 802.15.4 radio built-in sensors 2 AA batteries: radio+cpu mode: 63mW sleep mode: 30 W:q'q'Fy  =Sensor NetworksSensor network are collections of small, battery operated computers with sensors, and possibly actuators, to sense and control their environment radios, to report data and receive instructions typical expected lifetimes range from a few months to several years Suggested applications include: data collection, environmental or industrial monitoring, object tracking Today: We ll build a simple  anti-theft application using TinyOS 2.0, which detects theft by light level or movement reports theft by blinking, beeping, to neighbours or to a central server is configurable from a central server in less than 200 lines of codeI IF  I IF rP Challenges  Driven by interaction with environment ( Am I being stolen? ) Data collection and control, not general purpose computation Requires event-driven execution Extremely limited resources ( 2 AA s, 4kB of RAM ) Very low cost, size, and power consumption Reliability for long-lived applications ( Don t steal me in a year! ) Apps run for months/years without human intervention Reduce run time errors and complexity Real-time requirements ( What is movement anyway? ) Some time-critical tasks (sensor acquisition and radio timing) Timing constraints through complete control over app and OS Constant hardware evolution>Z^Z3Z+ZFZ[Z4Z{ZZ>^3+F[4 {   f > OutlineTinyOS and nesC overview Building a simple anti-theft application The Basics  Advanced Networking  Basic Networking BREAK Managing Power For experts: implementing device drivers resource and power management low-level code and concurrency Review and Conclusion|B4 8=B48= sRTinyOS and nesCTinyOS is an operating system designed to target limited-resource sensor network nodes TinyOS 0.4, 0.6 (2000-2001) TinyOS 1.0 (2002): first nesC version TinyOS 1.1 (2003): reliability improvements, many new services TinyOS 2.0 (2006): complete rewrite, improved design, portability, reliability and documentation TinyOS and its application are implemented in nesC, a C dialect: nesC 1.0 (2002): Component-based programming nesC 1.1 (2003): Concurrency support nesC 1.2 (2005): Generic components,  external typesLWAWA@TinyOS in a nutshellSystem runs a single application OS services can be tailored to the application s needs These OS services include timers, radio, serial port, A/D conversion, sensing, storage, multihop collection and dissemination, & Application and services are built as a set of interacting components (as opposed to threads) using a strictly non-blocking execution model event-driven execution, most service requests are split-phase Implementation based on a set of OS abstractions tasks, atomic with respect to each other; interrupt handlers resource sharing and virtualisation, power management hardware abstraction architecture!7g&f>1!7g&   ! &  >1(:"vTnesC in a seashell  C dialect Component based all interaction via interfaces connections ( wiring ) specified at compile-time generic components, interfaces for code reuse, simpler programming  External types to simplify interoperable networking Reduced expressivity no dynamic allocation no function pointers Supports TinyOS s concurrency model must declare code that can run in interrupts atomic statements to deal with data accessed by interrupts data race detection to detect (some) concurrency bugsK+$ &+$  9  `    wU The BasicsGoal: write an anti-theft device. Let s start simple. Two parts: Detecting theft. Assume: thieves put the motes in their pockets. So, a  dark mote is a stolen mote. Theft detection algorithm: every N ms check if light sensor is below some threshold Reporting theft. Assume: bright flashing lights deter thieves. Theft reporting algorithm: light the red LED for a little while! What we ll see Basic components, interfaces, wiring Essential system interfaces for startup, timing, sensor sampling AogAS    gxV<The Basics  Let s Get Startedwmodule AntiTheftC { uses interface Boot; uses interface Timer as Check; uses interface Read; } implementation { event void Boot.booted() { call Check.startPeriodic(1000); } event void Check.fired() { call Read.read(); } event void Read.readDone(error_t ok, uint16_t val) { if (ok == SUCCESS && val < 200) theftLed(); } }  x w 1M :   {W.The Basics  Interfaceswmodule AntiTheftC { uses interface Boot; uses interface Timer as Check; uses interface Read; } implementation { event void Boot.booted() { call Check.startPeriodic(1000); } event void Check.fired() { call Read.read(); } event void Read.readDone(error_t ok, uint16_t val) { if (ok == SUCCESS && val < 200) theftLed(); } } x x 1M :   |YVThe Basics  Interfaces and Split-Phase Opswmodule AntiTheftC { uses interface Boot; uses interface Timer as Check; uses interface Read; } implementation { event void Boot.booted() { call Check.startPeriodic(1000); } event void Check.fired() { call Read.read(); } event void Read.readDone(error_t ok, uint16_t val) { if (ok == SUCCESS && val < 200) theftLed(); } } <x Z 1M :   VThe Basics  Interfaces and Split-Phase Opswmodule AntiTheftC { uses interface Boot; uses interface Timer as Check; uses interface Read; } implementation { event void Boot.booted() { call Check.startPeriodic(1000); } event void Check.fired() { call Read.read(); } event void Read.readDone(error_t ok, uint16_t val) { if (ok == SUCCESS && val < 200) theftLed(); } } <x   ( 1M :   \6The Basics  Configurationsconfiguration AntiTheftAppC { } implementation { components AntiTheftC, MainC, LedsC; AntiTheftC.Boot -> MainC.Boot; AntiTheftC.Leds -> LedsC; components new TimerMilliC() as MyTimer; AntiTheftC.Check -> MyTimer; components new PhotoC(); AntiTheftC.Read -> PhotoC; }  #   ] The Basics [ The BasicspLet s improve our anti-theft device. A clever thief could still steal our motes by keeping a light shining on them! But, however clever, the thief still needs to pick up a mote to steal it. Theft Detection Algorithm 2: Every N ms, sample acceleration at 100Hz and check if variance above some threshold What we ll see (Relatively) high frequency sampling support Use of tasks to defer computation-intensive activities TinyOS execution modelLt{t{}XHThe Basics  Advanced Sensing, Tasksuses interface ReadStream; uint16_t accelSamples[ACCEL_SAMPLES]; event void Timer.fired() { call ReadStream.postBuffer(accelSamples, ACCEL_SAMPLES); call ReadStream.read(10000); } event void ReadStream.readDone(error_t ok, uint32_t actualPeriod) { if (ok == SUCCESS) post checkAcceleration(); } task void checkAcceleration() { ... check acceleration and report theft... } \ J&    "? ":~ZHThe Basics  Advanced Sensing, Tasksuint16_t accelSamples[SAMPLES]; event void ReadStream.readDone(error_t ok, uint32_t actualPeriod) { if (ok == SUCCESS) post checkAcceleration(); } task void checkAcceleration() { uint16_t i, avg, var; for (avg = 0, i = 0; i < SAMPLES; i++) avg += accelSamples[i]; avg /= SAMPLES; for (var = 0, i = 0; i < SAMPLES; i++) { int16_t diff = accelSamples[i] - avg; var += diff * diff; } if (var > 4 * SAMPLES) theftLed(); }>0Z}'L  " $<  pM#The Basics - TinyOS Execution Model #The Basics - TinyOS Execution Model #The Basics - TinyOS Execution Model xThe Basics - Summary3Components and Interfaces Programs built by writing and wiring components modules are components implemented in C configurations are components written by assembling other components Components interact via interfaces only Execution model Execution happens in a series of tasks (atomic with respect to each other) and interrupt handlers No threads System services: startup, timing, sensing (so far) (Mostly) represented by instantiatable generic components This instantiation happens at compile-time! (think C++ templates) All slow system requests are split-phase0m(m3:B)0m(m 3 :B)_* Advanced Networking@TinyOS 2.0 contains two useful network protocols: dissemination, that disseminates a value to all nodes in the network use for reconfiguration, program dissemination, i.e., network control collection, that allows all nodes to report values to root nodes the simplest data collection mechanism Dissemination Collection2EFA' d2EF6' `* Advanced Networking.Different anti-theft mechanisms may be appropriate for different times or places. Our perfect anti-theft system must be configurable! We want to send some settings to all motes selecting between dark and acceleration detection. We ll also allow selection of siren-based alerts instead of the  bright flashing light , and of the theft check interval We ll use the dissemination protocol to achieve this What we ll see: How to use the dissemination protocol How to start (and stop) services  External types, and their use in networking ` u ubP Advanced Networking   External Types#include  antitheft.h module AntiTheftC { ... uses interface DisseminationValue<settings_t> as SettingsValue; } implementation { settings_t settings; event void SettingsValue.changed() { const settings_t *newSettings = call SettingsValue.get(); settings.detect = newSettings->detect; settings.alert = newSettings->alert; call Check.startPeriod(newSettings->checkInterval); } event void Timer.fired() { if (settings.detect & DETECT_DARK) call Read.read(); if (settings.detect & DETECT_ACCEL) { call ReadStream.postBuffer(accelSamples, ACCEL_SAMPLES); call ReadStream.read(10000); } }t0Z)*               "AdJ Advanced Networking  Dissemination#include  antitheft.h module AntiTheftC { ... uses interface DisseminationValue<settings_t> as SettingsValue; } implementation { settings_t settings; event void SettingsValue.changed() { const settings_t *newSettings = call SettingsValue.get(); settings.detect = newSettings->detect; settings.alert = newSettings->alert; call Check.startPeriod(newSettings->checkInterval); } event void Timer.fired() { if (settings.detect & DETECT_DARK) call Read.read(); if (settings.detect & DETECT_ACCEL) { call ReadStream.postBuffer(accelSamples, ACCEL_SAMPLES); call ReadStream.read(10000); } }. @+               "AgJ Advanced Networking  Disseminationconfiguration AntiTheftAppC { } implementation { ... components ActiveMessageC, new DisseminatorC(settings_t, DIS_SETTINGS); AntiTheftC.SettingsValue -> DisseminatorC; AntiTheftC.RadioControl -> ActiveMessageC; }< Y-)1 )  eBDissemination  How does it work?Use local broadcasts and packet suppression Scale to a wide range of densities Control transmissions over space 100% eventual reliability Disconnection, repopulation, etc. Continuous process Maintenance: exchange metadata (e.g., version numbers, hashes) at a low rate to ensure network is up to date Propagation: when a node detects an inconsistency, the network quickly broadcasts the new data [Slide Courtesy Phil Levis]j,D5,>5fR Advanced Networking  Starting Servicesuses interface SplitControl as RadioControl; ... event void Boot.booted() { call Check.startPeriodic(1000); call RadioControl.start(); } event void RadioControl.startDone(error_t ok) { } event void RadioControl.stopDone(error_t ok) { }  t   . hD Advanced Networking - Collection@What if thieves aren t deterred by sirens and flashing lights? We need to report the theft! We ll use the tree-based collection to send theft reports to a base station. What we ll see: collection protocol message_t, TinyOS s message buffer type Send, TinyOS s address-less send interface&gg JiD Advanced Networking - Collectioninterface Send as AlertRoot; interface StdControl as CollectionControl; ... message_t alertMsg; event void RadioControl.startDone(error_t ok) { if (ok == SUCCESS) call CollectionControl.start(); } void theft() { if (settings.alert & ALERT_LEDS) theftLed(); if (settings.alert & ALERT_ROOT) { alert_t *newAlert = call AlertRoot.getPayload(&alertMsg); newAlert->stolenId = TOS_NODE_ID; call AlertRoot.send(&alertMsg, sizeof *newAlert); } } event void AlertRoot.sendDone(message_t *msg, error_t ok) { } ` +F S            "   jD Advanced Networking - Collectioninterface Send as AlertRoot; interface StdControl as CollectionControl; ... message_t alertMsg; event void RadioControl.startDone(error_t ok) { if (ok == SUCCESS) call CollectionControl.start(); } void theft() { if (settings.alert & ALERT_LEDS) theftLed(); if (settings.alert & ALERT_ROOT) { alert_t *newAlert = call AlertRoot.getPayload(&alertMsg); newAlert->stolenId = TOS_NODE_ID; call AlertRoot.send(&alertMsg, sizeof *newAlert); } } event void AlertRoot.sendDone(message_t *msg, error_t ok) { } L +hS            "   T1&Networking: packet abstract data type  message_t is a platform-defined type for holding packets a fixed size byte array capable of holding MTU of all data-link layers (platform-selected) accessed only via interfaces: Packet: general payload access, provided at each layer xxPacket: information for layer xx9[Z9[ 7$ kG&Networking: packet abstract data type  message_t is a platform-defined type for holding packets a fixed size byte array capable of holding MTU of all data-link layers (platform-selected) accessed only via interfaces: Packet: general payload access, provided at each layer xxPacket: information for layer xx9[Z9[ 7$ kD Advanced Networking - Collectioninterface Send as AlertRoot; interface StdControl as CollectionControl; ... message_t alertMsg; event void RadioControl.startDone(error_t ok) { if (ok == SUCCESS) call CollectionControl.start(); } void theft() { if (settings.alert & ALERT_LEDS) theftLed(); if (settings.alert & ALERT_ROOT) { alert_t *newAlert = call AlertRoot.getPayload(&alertMsg); newAlert->stolenId = TOS_NODE_ID; call AlertRoot.send(&alertMsg, sizeof *newAlert); } } event void AlertRoot.sendDone(message_t *msg, error_t ok) { } ( 9b            "   l$ Basic NetworkingThe police may not get there in time to catch the mote thief. So, let s alert the mote s neighbours! We ll send a local broadcast message over the radio. What we ll see: active message-based single-hop messaging 2* ,U3> Basic Networking - Interfacesaddress-free interfaces for sending, receiving: Send: send a packet Receive: receive a packet  active messages interfaces: active messages has destination addresses active messages has  message type , used for dispatch on reception AMSend: send a packet to an active message address Receive is reused Message type not specified in interfaces, but in configurationsL0.0.m$ Basic NetworkingKuses interface AMSend as TheftSend; uses interface Receive as TheftReceive; ... message_t theftMsg; void theft() { ... if (settings.alert & ALERT_RADIO) call TheftSend.send(AM_BROADCAST_ADDR, &theftMsg, 0); } event message_t *TheftReceive.receive (message_t* msg, void *payload, uint8_t len) { theftLed(); return msg; }4L $}6uJ                  $ Basic NetworkingKuses interface AMSend as TheftSend; uses interface Receive as TheftReceive; ... message_t theftMsg; void theft() { ... if (settings.alert & ALERT_RADIO) call TheftSend.send(AM_BROADCAST_ADDR, &theftMsg, 0); } event message_t *TheftReceive.receive (message_t* msg, void *payload, uint8_t len) { theftLed(); return msg; }(L &MJ                  n$ Basic Networkingconfiguration AntiTheftAppC { } implementation { ... components new AMSenderC(54) as SendTheft, new AMReceiverC(54) as ReceiveTheft; AntiTheftC.TheftSend -> SendTheft; AntiTheftC.TheftReceive -> ReceiveTheft; }( DGT "         oL Basic Networking  Buffer ManagementSending: Each AMSenderC component has a 1-entry queue for a message_t * Each outstanding send must use a separate message_t buffer up to application to ensure this commonly: associate a variable with each Send/AMSend interface, and don t reuse it until corresponding send completed Receiving: Receive passes you a message_t *, and wants one back: event message_t* receive(message_t* msg, ... Common pattern 1: copy interesting data out of msg, return msg Common pattern 2: return a different message, and access msg later  z 6- z 6-" % - Wb             / :Networking - SummaryGoals A composable (application-selected) network stack Platform-selected link layers Portable, reusable code above the link layer Cross-platform communication (ex: telosb-micaz, PC-any mote) Four-part solution: abstract data type for packets (message_t) composable, link layer independent, portable common networking interfaces (Send, AMSend, Receive) composable, portable  external types (nx_struct, nx_uint16_t, etc) interoperable networking component structuring principles composable, link layer independent" d+-5/-#+ - 5/-#  C  G  P Networking Component Structure )Messaging: networking component structure )Messaging: networking component structure pManaging PowerWe want our anti-theft device to last a while, or the thief will just wait a bit to steal our motes! Luckily, in TinyOS 2, this is fairly straightforward Services and hardware components switch themselves on and off based on whether they are in use ex: light sensor switched on just before a reading, and off just afterwards ex: accelerometer switched on before group reading, warms up for 17ms, does readings, switches off The microcontroller is set to a power mode consistent with the rest of the system Radio reception is not as simple, as program doesn t specify when messages might arrive Applications can switch radio on or off explicitly Or, applications can use TinyOS 2 s  low-power listening support Radio channel is checked every N ms Messages sent with an N ms preamble (or repeatedly for N ms) User must specify N (default is N=0, i.e., always on)_ua6_u  a  6  qUsing Low-power Listeningmodule AntiTheftC ... uses interface RadioControl; uses interface LowPowerListening; ... event void RadioControl.startDone(error_t ok) { if (ok == SUCCESS) { call CollectionControl.start(); call LowPowerListening.setLocalDutyCycle(200); } } < 7 / b  3HrPower Management effectsMAll power management switched off: 11.83mA Checking acceleration every secondNNPower Management effectsRAccelerometer power management enabled: 11.46mA Checking acceleration every secondSSPower Management effectsFLow-power listening enabled: 4.26mA Checking acceleration every secondGGPower Management effectspProcessor power management enabled, all power management switched on: 1.04mA Checking acceleration every secondqqzV For Experts : implementing device drivers VImplementing a service, such as the timer or the light sensor involves one or more of: setting up support for multiple clients (via generic components) managing concurrent requests to the service (resource management) powering any necessary hardware on and off (power management) accessing low-level hardware, dealing with interrupts (concurrency) To see these issues in some detail, we ll look at the example of a simple analog sensor connected to an A/D channel of the microcontroller similar, but simpler than the PhotoC sensor used in AntiTheftC (that sensor shares and A/D channel with a temperature sensor, and needs a warmup period, complicating resource and power management)LWW, {A simple light sensorBasic steps to sample light sensor: Setup voltage on PW1 pin Turn on A/D converter Configure A/D converter for channel 6 Initiate A/D sampling In A/D interrupt handler: read A/D result registers report reading to application Turn off A/D converter Turn off voltage on PW1 pinN$83$83~Services with Multiple Clientsmodule AdcP { provides interface Read; } implementation { command error_t Read.read() { ... } ... task void acquiredData() { signal Read.readDone(SUCCESS, val); } }                        Services with Multiple Clients Services with Multiple Clients Services with Multiple Clients }A Fix: Parameterised Interfaces&     2provide interface Read<uint16_t>[uint8_t id] provides an array of interfaces, each identified by an integer each of these interfaces can be wired differently compiles to a runtime dispatch on the identifier, or an extra argument on function calls Often, components just want any interface, as long as it s not used by someone else: unique( some string ): returns a different number at each use with the same string, from a contiguous sequence starting at 0 uniqueCount( some string ): returns the number of uses of unique( some string )L-U-UZM   q  )     Services with multiple clientsmodule AdcP { provides interface Read[uint8_t client]; } implementation { uint8_t client; command error_t Read.read[uint8_t c]() { client = c; ... } ... task void acquiredData() { signal Read.readDone[client](SUCCESS, val); } } z  1  G    -       2          Services with multiple clients|generic configuration AdcReadClientC() { provides interface Read<uint16_t>; } implementation { components AdcP; enum { ID = unique( adc.resource ) }; Read = AdcP.Read[ID]; } @ bJ  Services with Multiple Clients Services with Multiple Clients L'Resource Management>Single application, but still many services competing for resources, e.g.: timers in application and multihop routing storage in network reprogramming and delay-tolerant networking A/D converter used for sensing and CSMA radio Different requirements from different services: exclusive access: CC2420 radio on micaz physically connected to capture pin for hardware timer 1 must reserve timer 1 for radio latency sensitive: low-jitter multi-kHz A/D sampling best effort: wake me every 5 minutes for sampling, and every 12 for route maintenanceXK0 K0a,eN)Resource Management (continued)UDedicated Resources single client picked at compile-time optional compile-time checks(BBfBResource Management (continued)Dedicated Resources single client picked at compile-time optional compile-time checks Properties: guaranteed availability no latency Examples: most lowest-level hardware abstractions, e.g., hardware timersvB # ?B # ? O,Resource Management (continued)vVirtualised Resources service implementation virtualises resource between N clients all clients known at compile-time Da4,gCResource Management (continued)Virtualised Resources service implementation virtualises resource between N clients all clients known at compile-time Properties guaranteed availability sharing-induced latency run-time overhead Examples scheduler, timers, radio send queue` B %4+ B % Resource Management (continued)VArbitrated Resources a shared resource some number N of clients known at compile-time <B#Resource Management (continued)Arbitrated Resources a shared resource some number N of clients known at compile-time (see unique) resource arbiter manages resource allocationP{8Resource Management (continued)Arbitrated Resources a shared resource some number N of clients known at compile-time resource arbiter manages resource allocation Properties: guaranteed availability unknown latency immediateRequest: get it now, if available Examples: storage, sensing, busesn (+ + (    =&Resource management for A/D conversionmodule AdcP { provides interface Read[uint8_t client]; uses interface Resource[uint8_t client]; } implementation { uint8_t client; command error_t Read.read[uint8_t c]() { return call Resource.request[c](); } event void Resource.granted[c]() { client = c; ... } ... task void acquiredData() { call Resource.release[client](); signal Read.readDone[client](SUCCESS, val); } } 2 E)2r    X                              &Resource management for A/D conversionconfiguration AdcC { provides interface Read<uint16_t>[uint8_t client]; } implementation { components AdcP, new RoundRobinArbiterC( adc.resource ) as Arbiter; Read = AdcP; AdcP.Resource -> Arbiter.Resource; }< t3#tX  iEPower ManagementA/D service is internally managed service has enough information to set hardware state can build on resource management system 8"^^P-Power ManagementCSMA radio is externally managed not enough information to set hardware state management from application, or higher-level service, e.g., neighbourhood message scheduling service (as we saw earlier)4!jFPower Management with Arbiters hD#Resource & Power Management SummaryKThree kinds of resources, all have guaranteed availability: dedicated single client, no latency typically external power management arbitrated multiple clients, unknown latency typically internal power management reusable power managers virtualised multiple clients, no latency, runtime overhead typically internal power management< > F S< > F  SLow-level code and concurrency,Most TinyOS code can live in tasks, and not worry too much about concurrency issues. For instance, in AdcP, the lines call Resource.release[client](); signal Read.readDone[client](SUCCESS, val); do not need to worry about requests coming in between the release and readDone (and changing client), as: tasks do not interrupt each other commands and events that are called from interrupt handlers must be marked async However, some code has to run in interrupts: because it is very timing sensitive because the microcontroller signals events via interruptsv" - js-^j^ -^ f         FnesC support for concurrencyOnesC does three things to simplify dealing with interrupt-related concurrency: requires the use of async on commands and events called from interrupt handlers runs a simple data-race detector to identify variables accessed from interrupt handlers provides an atomic statement to guarantee the atomic execution of one or more statements:OOcConcurrency examplepuint8_t resQ[SIZE]; async command error_t Queue.enqueue(uint8_t id) { if (!(resQ[id / 8] & (1 << (id % 8))) { // concurrent access! resQ[id / 8] |= 1 << (id % 8); // concurrent access! return SUCCESS; } return EBUSY; } If an interrupt occurs during the if, and the interrupt handler also calls Queue.enqueue then: An available slot may be ignored (probably not a problem) The same slot may be given twice (oops!) If an interrupt happens during the 2nd concurrent access (write): The interrupt handler s write of resQ will probably be lostX c B < Z/c$<  $    $  Data Race Detection  Every concurrent state access is a potential race condition Concurrent state access: If object O is accessed in a function reachable from an interrupt entry point, then all accesses to O are potential race conditions All concurrent state accesses must occur in atomic statements Concurrent state access detection is straightforward: Call graph fully specified by configurations Interrupt entry points are known Data model is simple (variables only)`U6tU 6t  Data race fixedpuint8_t resQ[SIZE]; async command error_t Queue.enqueue(uint8_t id) { atomic { if (!(resQ[id / 8] & (1 << (id % 8))) { resQ[id / 8] |= 1 << (id % 8); return SUCCESS; } return EBUSY; } Atomic execution ensured by simply disabling interrupts... Long atomic sections can cause problems! E.g.: limit maximum sampling frequency cause lost packetsl / 4 //4~  1    |Concluding RemarksReflections on TinyOS TinyOS status What we didn t see, and where to find out more Other sensor network operating systems Last wordsDReflection  Components vs ThreadsTinyOS has no thread support Execution examples earlier show execution of tasks, interrupt handlers This execution crosses component boundaries Each component encompasses activities initiated in different places, these could be viewed as independent  threads . In AntiTheftC we see: booted event initiated in system setup timer event initiated in timer subsystem settings-changed event initiated in dissemination subsystem light and acceleration completion events, ultimately caused by the requests from within AntiTheftC the movement-detection task, initiated in AntiTheftC However, it s not always clear exactly what a  thread of control is. E.g.: is the movement-detection task part of the  thread initiated in response to the periodic timer expiration in the timer subsystem?b$L$L >  + DReflection  Components vs ThreadsA more productive view is to consider the system as a set of interacting components A component maintains the information that represents its state A component makes requests for actions from other components A component responds to commands and events from other components, representing: Requests (from other components) for the initiation of a new action Ex: please sample the light sensor Completion of requests the component made of other components Ex: message queued for sending to the root of the collection tree Events representing asynchronous actions from the environment or other components Ex: system booted, timer expired, new dissemination value received Tracking the details of the control flow across components is not necessary within this mindset.TD#>BRCaTD#> B RCa<Reflection  Static AllocationTinyOS/nesC use static rather than dynamic allocation. Why? Ensure that resources are available for the worst case ex: each message source gets one queue slot Simplify debugging (by removing a major source of bugs) But where did that static allocation happen? AntiTheftC allocated some variables for message buffers, acceleration samples Instantiation of generic components implicitly allocates state instantiating a module creates a new set of variables unique/uniqueCount allow compile-time sizing of arrays to match the number of clients<7,8-<7,8- ,  D^9HReflection  TinyOS Goals Revisited $  Operate with limited resources execution model allows single-stack execution Allow high concurrency execution model allows direct reaction to events many execution contexts in limited resources Adapt to hardware evolution component, execution model allow hardware / software substitution Support a wide range of applications tailoring OS services to application needs Be robust limited component interactions, static allocation Support a diverse set of platforms OS services should reflect portable servicesZ.ZZ^ZZBZ%Z,Z Z2Z#Z-Z.^B%  , 2#-- Z5&Reflection  StatusTinyOS 2.0 released in November 2006 25  TinyOS Enhancement Proposals describing TinyOS structure 114k lines of code in TinyOS core (in CVS today) Services: completed: booting, scheduling, timer, A/D conversion, I2C bus, radio, serial port, storage, multihop collection and dissemination, telosb sensors, simple mica sensors in progress: over-the-air reprogramming, more sensors in limbo: security, time synchronisation Platforms: mica family, telos, eyes, tinynode, intel mote 2 2.0.1 release planned for IPSN conference General API cleanup (based on TEP finalisation), bug fixes%o f;%o 8f; bm\7!Other OSes for Mote-class DevicesSOS https://projects.nesl.ucla.edu/public/sos-2x/ C-based, with loadable modules and dynamic memory allocation also event-driven Contiki http://www.sics.se/contiki C-based, with lightweight TCP/IP implementations optional preemptive threading Mantis http://mantis.cs.colorado.edu C-based, with conventional thread-based programming model semaphores+IPC for inter-thread communicationt3O$O&h3O$O&h b ; ; aTWhat we didn t see, Where to find out moreWe didn t see: The build system How to get code onto motes The 3-level hardware abstraction architecture Storage (flash) abstractions Where to find out more http://www.tinyos.net The TinyOS Enhancement Proposals (TEPs) The web tutorials Phil Levis s nesC/TinyOS programming manual, available from http://csl.stanford.edu/~pal/ `wwP#7]8 Last WordsAWork In Progress sensorboards, TEPs community feedback on design and TEPs Remains to be done: finish system services, in particular network reprogramming But, compared to TinyOS 1.1, TinyOS 2.0 is already: better designed better documented more reliable more portable Download it today: http://www.tinyos.net/dist-2.0.0 !9<4 d>6 d9<4t N " <X 0?//T2z   0` .\GV~`L` `\GGV~ .L>?" dd@?" dd<@[% }(% dh" i  ~?" dd@ ! #" $  PT`   i ``p>>    ((  l   0` #" `  H #" `d`  T Click to edit Master title style! !B  Hx #" `  RClick to edit Master text styles Second level Third level Fourth level Fifth level!     S  HD #" `Ae  D*  Hı #" `A e   @ TinyOS 2.0   H #" `!'e  D*f  C 0AIntel_white".jiH  0޽h ? `\GGV~ .L  white  0 YQ@(    N3. /U#"Aintel_rgb_1700#" `S3eq   Z ?#" ``   T Click to edit Master title style! !   Z6 ?#" ` `%   W#Click to edit Master subtitle style$ $H  0޽h ? `\GGV~ .L 0 P(    N6rArA *  6 n*  U++UU  ND>rArA  * 6 p*  U++UUd  c $ ?v  >4  N >rArA  Y? > RClick to edit Master text styles Second level Third level Fourth level Fifth level!     S   T >rArA @  > n*  U++UU   T4>rArA  @ > p*  U++UUH  02m.F ? 3380___PPT10.Ҹ`u\9 0 `X  (     3 r6 "`vv 6    # l6 "`* 6 V  0޽h ?"` .\GV~`Ly___PPT10Y+D=' = @B +}  0  $(   r   S lO>d`  > r   S 6 > H   0޽h ? `\GGV~ .L___PPT10i."+D=' = @B +  0 $u(  $r $ S 0U>d`  > r $ S U> i  >  $ S X\>  >  XL $ C $A  mica2!BN $ C &Atelosb* r  $ N_> p?"6@ NNN?N -P W%lifetime: a few days to several years&(2&H $ 0޽h ? `\GGV~ .L___PPT10i. @H+D=' = @B +  0 ,0(  ,x , c $n>d`  > x , c $f> > H , 0޽h ? `\GGV~ .L___PPT10i."+D=' = @B +^  0 Ph(  ~  s *w>d`  >   s *r><$ 0 > H  0޽h ? fff.&___PPT10.K)Pe!+FD' = @B D]' = @BA?%,( < +O%,( < +Ds' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*>%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*>|%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(Ds' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*@%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*@u%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*u%(Ds' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*J%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*Jf%(+8+0+0 +}  0 8$(  8r 8 S X>d`  > r 8 S > > H 8 0޽h ? `\GGV~ .L___PPT10i.e+D=' = @B +}  0 p$(  r  S \>d`  > r  S 4> > H  0޽h ? `\GGV~ .L___PPT10i.L@DF+D=' = @B +  0 4P(  4r 4 S >d`  >  4 S |>g<$ 0 > H 4 0޽h ? `\GGV~ .L~v___PPT10V.[c+FD' = @B D' = @BA?%,( < +O%,( < +D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4!%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4!X%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4Xr%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4r%(D ' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*47%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*47e%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4e%(D ' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4G%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4Gi%(+8+0+40 +  0  h(   ~   s *l>d`  >    s *l>  <$ 0 > H   0޽h ? fff___PPT10.V)E+[W_D;' = @B D' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*  %(D ' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*  %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* 9%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* 9j%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* j%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(Ds' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* #%(D ' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* #G%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* Gt%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* t%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(+8+0+ 0 +  0 (P(  (r ( S >d`  >  ( S ><$ 0 > H ( 0޽h ? `\GGV~ .L___PPT10.LW+[W_DB' = @B D' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(6%(Dp ' =%(D ' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(6A%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(AR%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(R%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*( %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*( 9%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(9z%(Ds' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(z%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(%(+8+0+(0 +>  0   ,(  ,r , S  >d`  > r , S >oP >  , N@>p?"6@ NNN?N o,$@ 0 Programs are built out of named components A component provides and uses interfaces Interfaces contain commands and events, which are just functions A module is a component implemented in Cl 6  ,6 ,$D  0e  , T>p?"6@`NNN?N   Iinterface Boot { /* Signaled when OS booted */ event void booted(); }JJ,B  , ZDp?"0@NNN?N6 l hg  ,hg ,$@  0  , T>p?"6@`NNN?Ng  interface Timer { command void startOneShot(uint32_t period); command void startPeriodic(uint32_t period); event void fired(); }B  , ZDp?"0@NNN?NhH , 0޽h ? `\GGV~ .L44___PPT104.Lg+}D4' = @B D3' = @BA?%,( < +O%,( < +D' =%(Dc' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*,%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*,+%(D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*,D' =,54*3>!Bstyle.color='`B@BPB<*,D ' =%(D ' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*,+T%(D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*,+D' =,54*3>!Bstyle.color='`B@BPB<*,+D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*,+TD' =,54*3>!Bstyle.color='`B@BPB<*,+TD' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*,TuD' =,54*3>!Bstyle.color='`B@BPB<*,TuD' =%(Du' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*,T|%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*,%(D' =%(Df' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*,%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*,%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*,|%(D{' =%(D#' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*,%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*,%(D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*,wD' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*,D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*,D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*,D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*,D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*,D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*,D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*,;D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*,;_D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*,_qD' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*,quD' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*,uw+8+0+,0 +%  0 >640 (  4x 4 c $0 d`   x 4 c $ oP   4 Zp?"6@`NNN?N[ X ,$@ 0 Iinterface Boot { /* Signaled when OS booted */ event void booted(); }JJ,$ 4 Np?"6@ NNN?Nk ,$@ 0 4Interfaces specify the interaction between two components, the provider and the user. This interaction is just a function call. commands are calls from user to provider events are calls from provider to userH@ {  4 Z#p?"6@`NNN?N ,$@  0 interface Timer { command void startOneShot(uint32_t period); command void startPeriodic(uint32_t period); event void fired(); }H 4 0޽h ? `\GGV~ .L___PPT10.Lg+:lD' = @B D{' = @BA?%,( < +O%,( < +D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4W%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4W%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4%(D"' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4%(D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*4D' =,54*3>!Bstyle.color='`B@BPB<*4D{ ' =%(D# ' =%(D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*4D' =,54*3>!Bstyle.color='`B@BPB<*4D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*4D' =,54*3>!Bstyle.color='`B@BPB<*4D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* 4%(D' =A@BBBB0B%(D' =1:Bhidden*o3>+B#style.visibility<*4%(D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*4D' =,54*3>!Bstyle.color='`B@BPB<*4++0+40 ++0+40 ++0+40 ++0+ 40 +  0  <(  <x < c $<d`   x < c $=oP   < NEp?"6@ NNN?N  xAll long-running operations are split-phase: A command starts the op: read An event signals op completion: readDone  -Lym < TLMp?"6@`NNN?Nu Z ainterface Read { command error_t read(); event void readDone(error_t ok, val_t val); }bbbH < 0޽h ? `\GGV~ .L___PPT10i.Lg+D=' = @B +  0  `H(  `x ` c $Xd`   x ` c $XoP  K ` N`p?"6@ NNN?N   All long-running operations are split-phase: A command starts the op: read An event signals op completion: readDone Errors are signalled using the error_t type, typically Commands only allow one outstanding request Events report any problems occurring in the op6-I7] ,m n ` Tfp?"6@`NNN?Nu Z ainterface Read { command error_t read(); event void readDone(error_t ok, val_t val); }bbbH ` 0޽h ? `\GGV~ .L___PPT10i.Lg+D=' = @B +".  0 0 HJ(  Hr H S xud`   r H S PvgH   H HP~p?"6@`NNN?N T,$ 0 p A configuration is a component built out of other components. It wires  used to  provided interfaces. It can instantiate generic components It can itself provide and use interfaces @B56 H T䇠p?"6@`NNN?N,$@  0 bgeneric configuration TimerMilliC() { provides interface Timer; } implementation { ... }cc,   H Txp?"6@`NNN?NA ,$@  0 Tgeneric configuration PhotoC() { provides interface Read; } implementation { ... }UU9H H 0޽h ? `\GGV~ .L&&___PPT10%.M`O+3WD%' = @B D$' = @BA?%,( < +O%,( < +D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*H?%(D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*H D' =,54*3>!Bstyle.color='`B@BPB<*H D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*H1XD' =,54*3>!Bstyle.color='`B@BPB<*H1XD' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*H?i%(D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*HYzD' =,54*3>!Bstyle.color='`B@BPB<*HYzD' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*HzD' =,54*3>!Bstyle.color='`B@BPB<*HzD ' =%(DD ' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*Hi%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*H%(D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*HD' =,54*3>!Bstyle.color='`B@BPB<*HD' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*HD' =,54*3>!Bstyle.color='`B@BPB<*HD' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*H%(D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*HD' =,54*3>!Bstyle.color='`B@BPB<*HD' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*HD' =,54*3>!Bstyle.color='`B@BPB<*HDA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*H%(++0+H0 ++0+H0 ++0+H0 +   0 qi@  L(  Lr L S d`    L ZA p?"6@ NNN?NJ;8 *-#   L*-#  L ZA p?"6@`NNN?N*-# # L Z p?"6@ NNN?N SMainCD8 Z  L Z  L ZA p?"6@`NNN?NZ ,  L Zp?"6@ NNN?N ; \TinySchedulerCH L 0޽h ? `\GGV~ .L___PPT10.M$ +D' = @B Dh' = @BA?%,( < +O%,( < +D' =%(D' =%(D/' =4@BB#BB%()?)?D' =.K7 BBBBB]M -4.16667E-6 1.84971E-6 L -0.61388 -0.00439 *3>*B ppt_xB ppt_y=@0BBAApBB'B@<* LD' =%(D`' =%(D' =4@BBBB%()?)?D\' =.$7 BBBBB]M 5.27778E-6 -4.79769E-6 L -1.03767 -0.60694 *3>*B ppt_xB ppt_y=0BBAA<*L+}  0  D$(  Dr D S d`   r D S   H D 0޽h ? `\GGV~ .L___PPT10i.M*׽+D=' = @B +   0 RJ8(  8x 8 c $DFd`   x 8 c $GoP   8 HhHp?"6@`NNN?N?  ZReadStream is an interface for periodic sampling of a sensor into one or more buffers. postBuffer adds one or more buffers for sampling read starts the sampling operation readDone is signalled when the last buffer is full W6 N L+ 8 TPp?"6@`NNN?N 18 interface ReadStream { command error_t postBuffer(val_t* buf, uint16_t count); command error_t read(uint32_t period); event void readDone(error_t ok, uint32_t actualPeriod); }              %      H 8 0޽h ? `\GGV~ .L-%___PPT10.Lg+D' V= @B D\' = @BA?%,( < +O%,( < +D' =%(D;' =%(D' =A@BB@BB0B%()?)?D*' =.7 BBBBB/M 0 0 L 0 -0.33295 E*3>*B ppt_xB ppt_y=0BB<*8+8+0+80 +   0 B: @(  @x @ c $*d`   x @ c $*oP   @ H+p?"6@`NNN?N ~ |In readDone, we need to compute the variance of the sample. We defer this  computationally-intensive operation to a separate task, using post. We then compute the variance and report theft.*~=H @ 0޽h ? `\GGV~ .L|___PPT10\.Lg+D' 3= @B D' = @BA?%,( < +O%,( < +D' =%(D' =%(D:' =A@BB@BB0B%()?)?D' =.I7 BBBBB[M 5.55556E-7 -1.7341E-7 L -0.00156 -0.54474 *3>*B ppt_xB ppt_y=@0BBAApBB9cBt<*@+8+0+@0 +f4  0  8(  x  c $d`   "  ZHp?"6@`NNN?NuH S RealMainP   "  Zp?"6@`NNN?N    V AccelStreamC   "   ZPp?"6@`NNN?N=o  T AntiTheftC   B @ ZDp?"0@NNN?NaT ,$@ 0  T ?"6@ NNN?N+_! U RealMainP     Z p?"6@ NNN?N+ 7StackL  T$?"6@ NNN?NY,$D 0 V AntiTheftC    ! Z p?"6@ NNN?N{'   < Task Queue  " # Zp?"6@`NNN?Na@  5Timer" $ Z p?"6@`NNN?N 2  5Alarm" % Zp?"6@`NNN?N% T SchedulerP   B + ZDp?"0@NNN?N& & ,$@ 0B .@ ZDp?"0@NNN?N W,$@ 0- 0 T\?"6@ NNN?NY,$D 0 7Timer- 1 T?"6@ NNN?N_,$D 0 7Alarm 2 T1?"6@ NNN?N" ,B 3 TD1?"0@NNN?N+ B 4 TD1?"0@NNN?N,  5 Z  p?"6@ NNN?N p @serial receive 6 Z p?"6@ NNN?NS  M ; H/W timer  % 7 ZD p?"6@ NNN?Nh b ] A/D conv.   8 Z p?"6@ NNN?NE CDe ?Interrupt tableH  0޽h ? `\GGV~ .L___PPT10.X+UɻDL' = @B D' = @BA?%,( < +O%,( < +D' =%(Du' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =%(Du' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*.%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*0%(D' =%(Du' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*+%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*1%(DL' =%(D' =%(D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*6 D' =%(Dq' =%(D' =A@BBBB0B%(D' =1:Bhidden*o3>+B#style.visibility<*1%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*+%(D' =%(Dq' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*.%(D' =A@BBBB0B%(D' =1:Bhidden*o3>+B#style.visibility<*0%(D' =%(Dq' =%(D' =A@BBBB0B%(D' =1:Bhidden*o3>+B#style.visibility<*%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*%(+P+0+0 ++0+0 ++0+00 ++0+00 ++0+10 ++0+10 +Q5  0 !! % =!(   x   c $Єd`   "   ZXp?"6@`NNN?NuH S RealMainP   "   Z`p?"6@`NNN?N    V AccelStreamC   "   Zp?"6@`NNN?N=o  T AntiTheftC      Z$ p?"6@ NNN?N+ 7Stack   Zؗ p?"6@ NNN?N{'   < Task Queue  "   Z0p?"6@`NNN?Na@  5Timer"   Zp?"6@`NNN?N 2  5Alarm"   Zp?"6@`NNN?N% T SchedulerP   Gl  $  $ $  ,$D 0   T?"6@ NNN?NX$ 7TimerB   ZDp?"0@NNN?N   fl Z % Z,$D 0B   ZDp?"0@NNN?NZ1    T?"6@ NNN?NY V SchedulerP      T1?"6@ NNN?N" ,B   TD1?"0@NNN?N+ B   TD1?"0@NNN?N,    ZԲ p?"6@ NNN?N p @serial receive   Z p?"6@ NNN?NS  M ? H/W timer  %   Z p?"6@ NNN?Nh b ] A/D conv.     Z@ p?"6@ NNN?NE CDe ?Interrupt table6 l    !   ,$D 0   T?"6@ NNN?N   < timer task     c j0e0e    B|CDE(F @  o 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| |E\ $|+ @   s " 0e@        @ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN 5%  N 5%  N    5%    !"?N@ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab g Gl +  # + ,$D 0   T?"6@ NNN?N_+! 7AlarmB "  ZDp?"0@NNN?N  H   0޽h ? `\GGV~ .LLD___PPT10$.X+z#D' = @B D' = @BA?%,( < +O%,( < +DL' =%(D' =%(D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*  D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*# %(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*$ %(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*% %(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*! %(D2' =%(D' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*% %(D2' =%(D' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*$ %(D2' =%(D' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*# %(+5  0 "" %$T"(  $x $ c $1d`   " $ ZH3p?"6@`NNN?NuH S RealMainP   " $ Z<p?"6@`NNN?N    V AccelStreamC   " $ Z83p?"6@`NNN?N=o  T AntiTheftC    $ T@?"6@ NNN?N+_! V SchedulerP     $ ZD p?"6@ NNN?N+ 7Stack  $ ZtA p?"6@ NNN?N{'   < Task Queue  " $ Z+B#style.visibility<*$%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*$%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*$%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*$%(DL' =%(D' =%(D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*$$ D2' =%(D' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*$%(D2' =%(D' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*$%(D2' =%(D' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*$%(+}  0  $(  r  S X+d`   r  S 0,  H  0޽h ? `\GGV~ .L___PPT10i.N +D=' = @B +   0 $p X(  Xr X S |d`    X S D%  $  X NA p?"6@ NNN?Nsy X NA  p?"6@ NNN?N{ AH X 0޽h ? `\GGV~ .L___PPT10i.M"O+D=' = @B +  0  \0(  \x \ c $ d`   x \ c $h  H \ 0޽h ? `\GGV~ .L___PPT10i.M"O+D=' = @B +a   0 ]U d(  dr d S d`   r d S d2 7  ` d Tp?"6@`NNN?Nm ,$@ 0 j#ifndef ANTITHEFT_H #define ANTITHEFT_H typedef nx_struct { nx_uint8_t alert, detect; nx_uint16_t checkInterval; } settings_t; #endif   !     -         Y d H\p?"6@`NNN?N = ,$D 0 oExternal types (nx_...) provide C-like access, but: platform-independent layout and endianness gives interoperability no alignment restrictions means they can easily be used in network buffers compiled to individual byte read/writes 4@  C    H d 0޽h ? `\GGV~ .L___PPT10.M#+D' = @B D' = @BA?%,( < +O%,( < +D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*d%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*d%(+p+0+d0 ++0+d0 +(  0 E= p(  px p c $d`   x p c $42 7  u p Tlp?"6@`NNN?Nb  Uinterface DisseminationValue { command const t* get(); event void changed(); }VV&   :   p Hp?"6@`NNN?N] k,$ 0 6Dissemination is simple to use: The changed event is signalled when new settings are received The get command is used to obtain the received value We can then simply read the received settings* u.&6    H p 0޽h ? `\GGV~ .L___PPT10c.M#+n )D' = @B D' = @BA?%,( < +O%,( < +DZ' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*p _%(D0' =A@BB@BB0B%()?)?Dw' =.?7 BBBBBQM -0.00156 0.03931 L -0.00156 -0.29364 *3>*B ppt_xB ppt_y=@0BBAApBBB(x*<*pD' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*pD' =,54*3>!Bstyle.color='`B@BPB<*pD"' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*p_%(D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*pD' =,54*3>!Bstyle.color='`B@BPB<*pD-' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*p%(D' =4@BBBB%(D' =,54 *3>!Bstyle.color='`B@BPB<*p-D' =4@BBBB%(D' =,54 *3>!Bstyle.color='`B@BPB<*p-VD' =4@BBBB%(D' =,54 *3>!Bstyle.color='`B@BPB<*pV+p+0+p0 ++0+p0 +#  0 :2 |(  |r | S xd`   r | S P   | Hp?"6@`NNN?N]   dFinally, we need to wire in the new functionality: We create a disseminator for the settings_t type We wire ActiveMessageC to start to the radio (we ll see why in a little bit) 3@U     7 H | 0޽h ? `\GGV~ .L___PPT10i.Mx+D=' = @B +9  0 PH t(  tr t S 8d`   r t S    t NA p?"6@ NNN?NGH t 0޽h ? `\GGV~ .L___PPT10i.M<+D=' = @B +  0 7/ x(  xr x S pd`   r x S p  @ x Hup?"6@`NNN?N7 3,$ 0 VWhenever possible, TinyOS 2.0, starts and stops services automatically. This isn t possible for the radio (no knowledge of when messages might arrive), so responsibility passed to the programmer. Must turn on radio for dissemination service to work. SplitControl is one of the interfaces for starting and stopping services Split-phase, used when start/stop may take a while C4w&   q S x TDxp?"6@`NNN?N-  ,$@ 0 ]interface SplitControl { command error_t start(); event void startDone(error_t ok); command error_t stop(); event void stopDone(error_t ok); }              H x 0޽h ? `\GGV~ .L___PPT10.M0{e+ІA D' = @B D' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*xH%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*x%(DT' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*xC%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*xCw%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*x%(D' =4@BBBB%(E5' =1B B`BPB,54*3>B ppt_c='`B@BPB<*x-D' =,54*3>!Bstyle.color='`B@BPB<*x-D ' =%(D' =%(D(' =A@BB@BB0B%()?)?Do' =.77 BBBBBIM 5E-6 -2.54335E-6 L 5E-6 -0.18867 *3>*B ppt_xB ppt_y=@0BBAApBBB2<*xD' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*xnD' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*x++0+x0 ++0+x0 ++0+x0 +}  0  $(  r  S cd`   r  S d  H  0޽h ? `\GGV~ .L___PPT10i.M8f+D=' = @B +  0  C(  r  S Jd`   r  S hK(  n  HSp?"6@`NNN?N] k hBefore we can report anything, we need to: Start the radio (already done) Start the collection service +>i i   T$Yp?"6@`NNN?N;   Minterface StdControl { command error_t start(); command error_t stop(); }NNZ           H  0޽h ? `\GGV~ .L___PPT10i.M]C+D=' = @B +   0 ME0 (  x  c $&d`   x  c $'(    Hx,p?"6@`NNN?N +  ]Collection messages are sent By placing data in a message_t buffer Using the Send interface6A3 "&3   "    T9p?"6@`NNN?N ,$@ 0 interface Send { command error_t send(message_t* msg, uint8_t len); event void sendDone(message_t* msg, error_t ok); command uint8_t maxPayloadLength(); command void* getPayload(message_t* msg); }                      H  0޽h ? `\GGV~ .LME___PPT10%.M]C+M{D' 8= @B DD' = @BA?%,( < +O%,( < +D{' =%(D#' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D2' =A@BB@BB0B%()?)?Dy' =.A7 BBBBBSM -0.00173 -0.28601 L -0.00173 -0.61896 *3>*B ppt_xB ppt_y=@0BBAApBBB(x*<*+p+0+0 ++0+0 +\  0 '|-(  |r | S 4d`   r | S     D | Zp?"6@ NNN?N: G ,$@ 0 Hlink-layer header areaI  | Zp?"6@ NNN?N: Z ,$D 0 Mdata, footer, metadata area$  | Zp?"6@ NNN?No  ,$@ 0 (B  | TDp?"0@NNN?Ny QQ ,$@ 0B | TDp?"0@NNN?No 77 ,$@ 0B | TDp?"0@NNN?No  ,$@ 0B | TDp?"0@NNN?Nz ,$@ 0B | TDp?"0@NNN?Nz ZZ ,$@  0> | ZX p?"6@ NNN?Nt #N ,$  0 Bapplication data; | Z p?"6@ NNN?Nt  ,$  0 ? cc1000 header? | Z p?"6@ NNN?Nd 9 ,$  0 Ccollection header; | Z  p?"6@ NNN?N\ U  ,$  0 ? cc1000 footer= | Z p?"6@ NNN?N{  ,$ 0 Acc1000 metadataB | TDp?"0@NNN?N  ,$@ 0B |  `Dp?"0@NNN?Nz QQf ,$@ 0 | Tp?"6@ NNN?Ny k ,$@ 0 | Tp?"6@ NNN?No 6 ,$D 0r | Z p?"6@ NNN?NEC ,$@ 0r | Z p?"6@ NNN?N ff ,$@ 0*r  |  ` p?"6@ NNN?N o ,$@ 0 (X "| Z p?"6@ NNN?N{ ! O,$ 0 \CollectionPacket8 #| Z p?"6@ NNN?Ng ,$ 0 <Packet: $| Z p?"6@ NNN?N{ oO,$ 0 > CC1000Packet  r %| Z p?"6@ NNN?N RO_ ,$@ 0P &| Z p?"6@ NNN?N^ + 2,$ 0 TAMPacket  H | 0޽h ? `\GGV~ .L>>___PPT10n>.0`$+;Dj;' = @B D%;' = @BA?%,( < +O%,( < +D(' =%(D' =%(D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<* |%(D' =-g6B fade*<3<* |D!' =%(D!' =%(D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<* |%(D' =-g6B fade*<3<* |D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* |%(D' =-g6B fade*<3<* |D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D' =%(D ' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<* |%(D' =-g6B fade*<3<* |D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*"|%(D' =-g6B fade*<3<*"|D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*$|%(D' =-g6B fade*<3<*$|D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%|%(D' =-g6B fade*<3<*%|D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*&|%(D' =-g6B fade*<3<*&|D' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*|%(D' =-g6B fade*<3<*|D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*#|%(D' =-g6B fade*<3<*#|++0+|0 ++0+ |0 ++0+ |0 ++0+|0 ++0+|0 ++0+|0 ++0+|0 ++0+|0 ++0+ |0 ++0+"|0 ++0+#|0 ++0+$|0 ++0+&|0 +~  0 #%(  x  c $(qd`   x  c $r     ZHzp?"6@ NNN?No   (B   TDp?"0@NNN?Ny QQ B   TDp?"0@NNN?No 77 B   TDp?"0@NNN?No  B   TDp?"0@NNN?Nz B   TDp?"0@NNN?Nz ZZ    Z~ p?"6@ NNN?Nt #N  Bapplication data  Z p?"6@ NNN?Nt   ? cc1000 header   Z p?"6@ NNN?Nd 9  Ccollection header  ZЋ p?"6@ NNN?N\ U   ? cc1000 footer   Z p?"6@ NNN?N{   Acc1000 metadataB  TDp?"0@NNN?N  B   `Dp?"0@NNN?Nz QQf   Tp?"6@ NNN?Ny k   Tp?"6@ NNN?No 6 r  Z p?"6@ NNN?NE r  Z p?"6@ NNN?N ff r   ` p?"6@ NNN?N o  ($  Zt p?"6@ NNN?N{ ! O \CollectionPacket  Z$ p?"6@ NNN?N   <Packet  ZP p?"6@ NNN?N{ oO > CC1000Packet  r  Z p?"6@ NNN?N RO_   Z p?"6@ NNN?N^ + 2 TAMPacket   " Zԫp?"6@ NNN?N: G  Hlink-layer header area # Z8p?"6@ NNN?N: Z  Mdata, footer, metadata areaH  0޽h ? `\GGV~ .L___PPT10i.0`$+D=' = @B +  0 @ o(  x  c $Od`   x  c $PR(    HSp?"6@`NNN?NG We use getPayload to get access to the portion of message_t available to the application We use an external type to actually write the data@   !   Q   T`p?"6@`NNN?Nd   interface Send { command error_t send(message_t* msg, uint8_t len); event void sendDone(message_t* msg, error_t ok); command uint8_t maxPayloadLength(); command void* getPayload(message_t* msg); }                        Tgp?"6@`NNN?N: 6typedef nx_struct { nx_uint16_t stolenId; } alert_t;77h         H  0޽h ? `\GGV~ .L___PPT10i.M]C+D=' = @B +}  0 P $(  r  S 4Id`   r  S  J  H  0޽h ? `\GGV~ .L___PPT10i.M+D=' = @B +   0  P(  r  S 6d`     S 7<$ 0  H  0޽h ? `\GGV~ .L  ___PPT10 .1z+FDL ' = @B D ' = @BA?%,( < +O%,( < +D> ' =%(D ' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*_}%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*}%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*0%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*0p%(+8+0+0 +   0 ` (  r  S d`   r  S X  |  H p?"6@`NNN?Ne u tAMSend is just like send, but with a destination The theft message has no data, so no use of the payload functions. uu o k  TX'p?"6@`NNN?N,$D 0 uinterface AMSend { command error_t send(am_addr_t addr, message_t* msg, uint8_t len); event void sendDone(message_t* msg, error_t ok); command uint8_t maxPayloadLength(); command void* getPayload(message_t* msg); } ^                               H  0޽h ? `\GGV~ .L___PPT10.M '+|3DO' = @B D ' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(+8+0+0 +N   0  d(  dx d c $cd`  c x d c $c c  d T\p?"6@`NNN?Nh,$D 0 %interface Receive{ event message_t* receive(message_t* msg, void* payload, uint8_t len); command uint8_t payloadLength(); command void* getPayload(message_t* msg); }B                             P d H\ p?"6@`NNN?Ne u HAMSend is just like send, but with a destination The theft message has no data, so no use of the payload functions. On Receive, we just light the  bright red light   H d 0޽h ? `\GGV~ .L___PPT10.M '+|3DO' = @B D ' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*d%(+8+0+d0 +   0 p 9(  r  S $cd`  c r  S c c   HHcp?"6@`NNN?N + The Active Message ids used for dispatching are specified as parameters to the generic components used for active message sends and receives.  ~  T cp?"6@`NNN?Nk,$D 0 generic configuration AMSenderC(am_id_t id) { provides interface AMSend; provides interface Packet; provides interface AMPacket; provides interface PacketAcknowledgements as Acks; } ...     4        H  0޽h ? `\GGV~ .L___PPT10.M0~K+ DO' = @B D ' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(+8+0+0 +o   0 <4 (  r  S xcd`  c r  S Pc c   Ttcp?"6@`NNN?NR? ,$D 0 Dmessage_t buffer; message_t *lastReceived = &buffer; event message_t* receive(message_t* msg, ...) { /* Return previous message buffer, save current msg */ message_t *toReturn = lastReceived; lastReceived = msg; post processMessage(); return toReturn; } task void processMessage() { ... use lastReceived ... }EE.                                                        H  0޽h ? `\GGV~ .L___PPT10.Mљn+ksDO' = @B D ' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(+8+0+0 +  0 0 n(  x  c $,cd`  c   c $`cW<$ 0 c  X)H  0޽h ? `\GGV~ .L___PPT10_./ V!+D' = @B D' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*8%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*8V%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*V%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*,%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*,a%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*av%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*v%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(+8+0+0 +  0 $  @   (   x   c $8~c`  c "   Zcp?"6@`NNN?N AE  8AM Radio  5"   Z$cp?"6@`NNN?N ) ,$D 0 9 AM Serial  "   Zcp?"6@`NNN?NR #X ; Application  B  @  `Dp?"0@NNN?NQ B    `Dp?"0@NNN?NP ,$@ 0B  @  `Dp?"0@NNN?NQ B    `Dp?"0@NNN?NQ  ,$@ 0B  @  `Dp?"0@NNN?NZ+ B    `Dp?"0@NNN?NG D ,$@ 0`   Zyc p?"6@ NNN?N a Packet AMPacket AMSend2 ,H   0޽h ? `\GGV~ .L|t___PPT10T.19+[D' = @B Ds' = @BA?%,( < +O%,( < +D' =%(D) ' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =-g6B fade*<3<* D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =-g6B fade*<3<* D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =-g6B fade*<3<* D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =-g6B fade*<3<* D! ' =%(D)' =4@BB BB%(D' =-g6B fade*<3<* D' =1:Bhidden*o3>+B#style.visibility<* %(D)' =4@BB BB%(D' =-g6B fade*<3<* D' =1:Bhidden*o3>+B#style.visibility<* %(D)' =4@BB BB%(D' =-g6B fade*<3<* D' =1:Bhidden*o3>+B#style.visibility<* %(D6' =A@BB BB0B%(D' =-g6B fade*<3<* D' =1:Bhidden*o3>+B#style.visibility<* %(+p+0+ 0 ++0+ 0 +  0 P q(  x  c $`lc`  c "  Zmcp?"6@`NNN?N AE  8AM Radio  "  Zqcp?"6@`NNN?NR #X ; Application  B @  `Dp?"0@NNN?NQ B @  `Dp?"0@NNN?NZ+   Zuc p?"6@ NNN?N  NPacket Receive$H  0޽h ? `\GGV~ .L___PPT10i.19+D=' = @B +>1  0 ZR` (  x  c $'c`  c "  ZT.cp?"6@`NNN?N AE  8AM Radio  "  Z`1cp?"6@`NNN?NR #X ; Application  B @  `Dp?"0@NNN?NQ B @  `Dp?"0@NNN?NZ+   Z5c p?"6@ NNN?N  NPacket Receive$"  Zt;cp?"6@`NNN?N`L : Collection  B    `Dp?"0@NNN?NMw B    `Dp?"0@NNN?NMaa B    `Dp?"0@NNN?NM ,$@ 0B  @  `Dp?"0@NNN?N[O ,$@ 0m   Z|@c p?"6@ NNN?N,$ 0 q Send AMSend( Ez \    Q ,$@ 0  ZlBcp?"6@ NNN?N\   (B  TDp?"0@NNN?N  r  Z p?"6@ NNN?Nf    ZKc p?"6@ NNN?N.B I 8Packet  Z Pc p?"6@ NNN?Ng n  Gcc1000 + coll. header=z \   6 ,$@ 0  Z0Ucp?"6@ NNN?N\   (B  TDp?"0@NNN?N   r  Z p?"6@ NNN?N-y    Z$Xc p?"6@ NNN?N_B z 8Packet  Z[c p?"6@ NNN?N   ? cc1000 headerB  TD1?"0@NNN?N g ,$D 0B  TD1?"0@NNN?N ,$@ 0H  0޽h ? `\GGV~ .L___PPT10d.19+@D' = @B D' = @BA?%,( < +O%,( < +Dt ' =%(D ' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*Dv ' =%(D ' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =-g6B fade*<3<* D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =-g6B fade*<3<* D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =-g6B fade*<3<* D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*%(+8+0+ 0 +  0  P(  r  S cd`  c   S lc<$ 0 c H  0޽h ? `\GGV~ .L___PPT10.MpA+DY' = @B D' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*e%(Ds' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*E%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*E%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D> ' =%(D ' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*R%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*R%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(^%(+8+0+0 +  0  (  r  S cd`  c r  S c c z  Hcp?"6@`NNN?N d  We request that the radio use a 2% duty-cycle low-power listening strategy We wire the interface to the actual radio (not shown)  H  0޽h ? `\GGV~ .L___PPT10i.M@ Z+D=' = @B +   0 $   (  r  S Kd`  K x  c $K( 2r  K  0 c $0e0eA d    ? A@  Ap 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||s " 0e@        @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F   5%    !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab4*  d KH  0޽h ? `\GGV~ .L___PPT10i.MB+D=' = @B +   0 0 ( < (  <x < c $Kd`  K ~ < s *K _^  K  <0 c $0e0eA f    ? A@  Ap 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||s " 0e@        @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F   5%    !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab8*  f KH < 0޽h ? `\GGV~ .L___PPT10i.MB+D=' = @B +   0 0 (  @ (  @x @ c $TKd`  K ~ @ s *,K1 T{  K  @0 c $0e0eA g    ? A@  Ap 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||s " 0e@        @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F   5%    !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abV!a  g KH @ 0޽h ? `\GGV~ .L___PPT10i.MB+D=' = @B +   0 0 ( D (  Dx D c $Kd`  K ~ D s *K1 ' K  D0 c $0e0eA h    ? A@  Ap 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||s " 0e@        @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F   5%    !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abMr^  h KH D 0޽h ? `\GGV~ .L___PPT10i.MB+D=' = @B +}  0 0 $(  r  S Kd`  K r  S K K H  0޽h ? `\GGV~ .L___PPT10i.Np +D=' = @B +&  0 x@ (  r  S xKd`  K   S xK <$ 0 K 28     NA p?"6@ NNN?N&  ZlK p?"6@ NNN?N ; V"PW1, ADC6 are microcontroller pins##~  HKp?"6@`NNN?N8 \,$@  0 PExposing sensor (maybe) and A/D converter (definitely) to multiple clients Resource management: need to share light sensor and A/D converter with other clients Power management: should leave sensor or A/D on between consecutive clients or for repeated accesses Must avoid data races in interrupt handler and interrupt handler setup codeQQ Q H  0޽h ? `\GGV~ .L___PPT10.N`lAc+mxD' = @B D' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*$=%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*=S%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*Sy%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*y%(Ds' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*K%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*K%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*Q%(+p+0+0 ++0+0 +}  0 p $(  r  S TKd`  K r  S K K H  0޽h ? `\GGV~ .L___PPT10i.NИ+D=' = @B +   0   0  HK (  Hx H c $tKd`  K " H ZKp?"6@`NNN?N  V AccelStreamC   " H Z Kp?"6@`NNN?Nj 8 T AntiTheftC   "  H ZKp?"6@`NNN?N1 5Radio" H ZKp?"6@`NNN?N o t  NAdcPB H@  `Dp?"0@NNN?NHvMlB H  `Dp?"0@NNN?N? B H  `Dp?"0@NNN?NP  B H@  `Dp?"0@NNN?N >   H ZK p?"6@ NNN?N   >Read interfaceH H 0޽h ? `\GGV~ .L___PPT10i.X+D=' = @B +  0 vn@ L(  Lx L c $[Kd`  K " L Z@]Kp?"6@`NNN?N  V AccelStreamC   " L ZPbKp?"6@`NNN?Nj 8 T AntiTheftC    L TfK?"6@ NNN?N+_! 7Radio L Z0kK p?"6@ NNN?N+ 7StackF L ToK?"6@ NNN?NY,$D 0 PAdcP L ZrK p?"6@ NNN?N{'   < Task Queue  "  L ZvKp?"6@`NNN?N1 5Radio  L T1?"6@ NNN?N" ,B  L TD1?"0@NNN?N+ B L TD1?"0@NNN?N,  L ZX{K p?"6@ NNN?N p @serial receive L ZK p?"6@ NNN?NS  M ; H/W timer  % L ZȄK p?"6@ NNN?Nh b ] A/D conv.   L ZK p?"6@ NNN?NE CDe ?Interrupt table" L Z,Kp?"6@`NNN?N o t  NAdcPB L ZDp?"0@NNN?N6 ,$@ 0H L 0޽h ? `\GGV~ .L___PPT10.X+ˠ,D/' = @B D' = @BA?%,( < +O%,( < +D' =%(Du' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*L%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*L%(DL' =%(D' =%(D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*L +8+0+L0 +&  0 P P(  Px P c $lKd`  K " P ZKp?"6@`NNN?N  V AccelStreamC   " P ZDKp?"6@`NNN?Nj 8 T AntiTheftC   F P TDK?"6@ NNN?N+_!,$@ 0 PAdcP P Z(#K p?"6@ NNN?N+ 7Stack- P T'K?"6@ NNN?NY,$D 0 7Radio P Z +K p?"6@ NNN?N{'   < Task Queue  "  P Z/Kp?"6@`NNN?N1 5RadioN  P T3K?"6@ NNN?N Y,$@ 0 X AccelStreamC     P T1?"6@ NNN?N" ,B  P TD1?"0@NNN?N+ B  P TD1?"0@NNN?N,  P Z(9K p?"6@ NNN?N p @serial receive P Z>K p?"6@ NNN?NS  M ; H/W timer  ) P ZAK p?"6@ NNN?Nh b a A/D conv.   P ZGK p?"6@ NNN?NE CDe ?Interrupt table" P ZxKKp?"6@`NNN?N o t  NAdcPB P ZDp?"0@NNN?No " ,$D 0B P ZDp?"0@NNN?N3  ,$@ 0B P ZDp?"0@NNN?N   ,$D  0H P 0޽h ? `\GGV~ .L___PPT10b.X+-ߘDV' = @B D' = @BA?%,( < +O%,( < +D' =%(Du' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*P%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*P%(D' =%(Du' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*P%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*P%(D' =%(Dq' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*P%(D' =A@BBBB0B%(D' =1:Bhidden*o3>+B#style.visibility<*P%(D' =%(Du' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* P%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*P%(++0+P0 ++0+P0 ++0+P0 ++0+ P0 +  0 ` <(  ~  s * Kd`  K ~  s * K K H  0޽h ? 3___PPT10i.oز+D=' = @B +  0  0(  x  c $Kd`  K x  c $pK K H  0޽h ? `\GGV~ .L___PPT10i.NИ+D=' = @B +}  0  $(  r  S Gd`  G r  S G G H  0޽h ? `\GGV~ .L___PPT10i.N`k+D=' = @B +"   0 9 1 `  T (  Tx T c $Gd`  G " T ZLGp?"6@`NNN?N  V AccelStreamC   " T ZGp?"6@`NNN?Nj 8 T AntiTheftC   " T Z8Gp?"6@`NNN?N1 5Radio" T TGp?"6@`NNN?N   NAdcPB T@  `Dp?"0@NNN?NHvMlB T  `Dp?"0@NNN?N? B  T  `Dp?"0@NNN?NX@ 7 B  T@  `Dp?"0@NNN?N %   T ZG p?"6@ NNN?N   >Read interface  T Tp?"6@ NNN?NB    T Tp?"6@ NNN?NB H T 0޽h ? `\GGV~ .L___PPT10i.X+D=' = @B +&  0 " \(  \x \ c $Gd`  G " \ ZGp?"6@`NNN?N  V AccelStreamC   " \ ZGp?"6@`NNN?Nj 8 T AntiTheftC   F \ T|G?"6@ NNN?N+_!,$@ 0 PAdcP \ ZG p?"6@ NNN?N+ 7Stack- \ TG?"6@ NNN?NY,$D 0 7Radio \ ZؤG p?"6@ NNN?N{'   < Task Queue  "  \ ZGp?"6@`NNN?N1 5Radio  \ T1?"6@ NNN?N" ,B  \ TD1?"0@NNN?N+ B  \ TD1?"0@NNN?N,  \ ZG p?"6@ NNN?N p @serial receive \ ZG p?"6@ NNN?NS  M ; H/W timer  ) \ Z@G p?"6@ NNN?Nh b a A/D conv.   \ Z|G p?"6@ NNN?NE CDe ?Interrupt tableB \ ZDp?"0@NNN?N " ,$D 0B \ ZDp?"0@NNN?N3S ,$@ 0" \ TGp?"6@`NNN?NS   NAdcP \ Tp?"6@ NNN?N - 9  \ Tp?"6@ NNN?N 9 H \ 0޽h ? `\GGV~ .L~___PPT10^.X+NDR' = @B D ' = @BA?%,( < +O%,( < +D' =%(Du' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*\%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*\%(D' =%(Du' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*\%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*\%(D' =%(Dq' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*\%(D' =A@BBBB0B%(D' =1:Bhidden*o3>+B#style.visibility<*\%(D' =%(Dq' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*\%(D' =A@BBBB0B%(D' =1:Bhidden*o3>+B#style.visibility<*\%(++0+\0 ++0+\0 ++0+\0 ++0+\0 +  0 `Tb(  Tr T S Gd`  G r T S ȆG  G 6 T HG "`E ,$ 0 |83 kinds of resources: arbitrated, dedicated, virtualised(##H T 0޽h ? `\GGV~ .L___PPT10.=K+T^DO' = @B D ' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*T%(+8+0+T0 +  0    \ (  \r \ S ZGd`  G r \ S [GT G 8" \ Z]Gp?"6@`NNN?Nuq ,$@ 0 < CC2420 radio  ;" \ ZdGp?"6@`NNN?N) "N ,$D 0 ?Uninformed user7" \ ZhGp?"6@`NNN?Nl P ,$@ 0 ; H/W Timer 1  B \  `Dp?"0@NNN?Nq PPn ,$D 0B \  `Dp?"0@NNN?N^ R ,$@ 0B  \@  `Dp?"0@NNN?NL I e ,$@ 0B  \ ZD1?"0@NNN?N $ ,$@ 0B  \ ZnG 1?"6@`NNN?N   ,$D  0 Fcompile-time errorH \ 0޽h ? `\GGV~ .L___PPT10.+ġ2D' = @B DZ' = @BA?%,( < +O%,( < +D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*\%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*\%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*\%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*\%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*\%(DN' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* \%(D' =-g6B fade*<3<* \D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* \%(D' =-g6B fade*<3<* \D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<* \%(D' =-g6B fade*<3<* \++0+\0 ++0+\0 ++0+\0 ++0+ \0 +  0 `0(  x  c $hSGd`  G x  c $,TG G H  0޽h ? `\GGV~ .L___PPT10i.+D=' = @B +6  0 }uh (  hr h S  Gd`  G r h S D G G 7" h ZBp?"6@`NNN?NA > ,$@ 0 ; H/W timer 0  <" h ZGp?"6@`NNN?NJE ,$@ 0 @periodic sensingY" h ZGp?"6@`NNN?N^ ,$@ 0 ]multihop networking 9" h ZGp?"6@`NNN?N G ,$@  0 = Timer service7" h  `Gp?"6@`NNN?N3 ] ,$D  0 5timer7"  h  `"Gp?"6@`NNN?N> > ,$@ 0 5timerB  h  `Dp?"0@NNN?N'& ,$@ 0B  h  `Dp?"0@NNN?N& ,$@ 0B h@  `Dp?"0@NNN?N  9 ,$@ 0B h  `Dp?"0@NNN?N m / ,$@ 0B h  `Dp?"0@NNN?N 4 ,$@ 0B h  `Dp?"0@NNN?N   4 ,$@  0< h Z)G p?"6@ NNN?N-(M ,$  0 @virtual resource2 h N-G p?"6@ NNN?N, jL ,$ 0 Bdedicated resourceB h TD1?"0@NNN?Nm 2,$@  0B h TD1?"0@NNN?N S  ,$@ 0H h 0޽h ? `\GGV~ .L""___PPT10".+_#D ' = @B D ' = @BA?%,( < +O%,( < +D< ' =%(D ' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* h%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* h%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* h%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*h%(Dt' =%(D' =%(D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =-g6B fade*<3<*hD+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =-g6B fade*<3<*hD8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =-g6B fade*<3<*hD+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =-g6B fade*<3<*hD+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =-g6B fade*<3<*hD8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =-g6B fade*<3<*hD+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =-g6B fade*<3<*hD8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =-g6B fade*<3<*h++0+h0 ++0+h0 ++0+h0 ++0+h0 ++0+h0 ++0+ h0 ++0+h0 ++0+h0 +  0 p0(  x  c $$Gd`  G x  c $G G H  0޽h ? `\GGV~ .L___PPT10i.+D=' = @B +/  0 t l  h (  hx h c $Bd`  B x h c $B B /" h Z+B#style.visibility<*h%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D>' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =-g6B fade*<3<*hD[' =4@BB BB%()))D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =-g6B fade*<3<*hDm' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* h%(D' =-g6B fade*<3<* hD)' =4@BB BB%(D' =-g6B fade*<3<*hD' =1:Bhidden*o3>+B#style.visibility<*h%(DY' =4@BB BB%()))D' =-g6B fade*<3<*hD' =1:Bhidden*o3>+B#style.visibility<*h%(D?' =%(D' =%(D)' =4@BB BB%(D' =-g6B fade*<3<* hD' =1:Bhidden*o3>+B#style.visibility<* h%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* h%(D' =-g6B fade*<3<* hD+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*h%(D' =-g6B fade*<3<*hD' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* h%(D' =-g6B fade*<3<* hD' =%(D' =%(D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<* h%(D' =-g6B fade*<3<* hD+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* h%(D' =-g6B fade*<3<* h++0+h0 ++0+h0 ++0+h0 ++0+ h0 +g:  0   lp (  lx l c $Bd`  B x l c $B B " l ZdBp?"6@ NNN?N3 u 3ADC" l ZBp?"6@`NNN?N_k  < Light sensor  " l T8Bp?"6@`NNN?N;[  : CSMA radio  " l ZBp?"6@`NNN?N O  7ArbiterB l TDp?"0@NNN?NB  % ,$D 0B  l@ TDp?"0@NNN?NL  ,$D 0B  l ZDp?"0@NNN?Nh  ,$@ 0B  l ZDp?"0@NNN?N^ r ,$@  0B  l TDp?"0@NNN?Nq Q ,$@ 0B  l ZDp?"0@NNN?Nh  4 ,$D  0B l@ TDp?"0@NNN?N^ v ,$@ 0 l C *Aj0234131 h,$D 0B l ZDp?"0@NNN?N^  - ,$D  0H l 0޽h ? `\GGV~ .L/,',___PPT10,.+tLD+' = @B D+' = @BA?%,( < +O%,( < +D' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*l%(D' =-g6B fade*<3<*lD ' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* l%(D' =-g6B fade*<3<* lD)' =4@BB BB%(D' =-g6B fade*<3<*lD' =1:Bhidden*o3>+B#style.visibility<*l%(D' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* l%(D' =-g6B fade*<3<* lD+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*l%(D' =-g6B fade*<3<*lD' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* l%(D' =-g6B fade*<3<* lD=' =%(D' =%(D)' =4@BB BB%(D' =-g6B fade*<3<* lD' =1:Bhidden*o3>+B#style.visibility<* l%(D)' =4@BB BB%(D' =-g6B fade*<3<*lD' =1:Bhidden*o3>+B#style.visibility<*l%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* l%(D' =-g6B fade*<3<* lD ' =%(D' =%(D)' =4@BB BB%(D' =-g6B fade*<3<* lD' =1:Bhidden*o3>+B#style.visibility<* l%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*l%(D' =-g6B fade*<3<*lDn ' =%(D ' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* l%(D' =-g6B fade*<3<* lD)' =4@BB BB%(D' =-g6B fade*<3<* lD' =1:Bhidden*o3>+B#style.visibility<* l%(D)' =4@BB BB%(D' =-g6B fade*<3<* lD' =1:Bhidden*o3>+B#style.visibility<* l%(D)' =4@BB BB%(D' =-g6B fade*<3<*lD' =1:Bhidden*o3>+B#style.visibility<*l%(D' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*l%(D' =-g6B fade*<3<*lD+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*l%(D' =-g6B fade*<3<*l+  0  p0(  px p c $Bd`  B x p c $ȠBO  B H p 0޽h ? `\GGV~ .L___PPT10i.+D=' = @B +  0  (  r  S \Bd`  B r  S ܇B B \  TBp?"6@`NNN?N  interface Resource { async command error_t request(); async command error_t immediateRequest(); event void granted(); async command error_t release(); }                  H  0޽h ? `\GGV~ .L~ v ___PPT10V .Nݛ+D ' B= @B D ' = @BA?%,( < +O%,( < +D' =%(D' =%(D8' =A@BB@BB0B%()?)?D' =.G7 BBBBBYM 2.77778E-6 4.50867E-6 L 0.00173 -0.53157 *3>*B ppt_xB ppt_y=@0BBAApBB9c:B#<*DL' =%(D' =%(D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*DL' =%(D' =%(D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<* DL' =%(D' =%(D' =4@BBBB%(D' =,54*3>!Bstyle.color='`B@BPB<*Ch+8+0+0 +  0  d(  r  S sBd`  B r  S ltB B 8  TyBp?"6@`NNN?N+,$D 0 Bgeneric configuration RoundRobinArbiterC(char resourceName[]) { provides interface Resource[uint8_t client]; ... } implementation { ... uniqueCount(resourceName) ... } Z     V    H  0޽h ? `\GGV~ .L___PPT10.N%R+ksDO' = @B D ' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(+8+0+0 +,  0    m (  x  c $RBd`  B "  ZSBp?"6@`NNN?NC  @user application   HWB "`0 LGoal: set hardware to lowest-power state consistent with application needs &LL"  Z[Bp?"6@`NNN?N   < A/D hardware  "  Z_Bp?"6@`NNN?N\ # '  ; A/D service  B  TDp?"0@NNN?N u9 ,$D 0B  ZDp?"0@NNN?N ,$@ 0B   `Dp?"0@NNN?N  B   `Dp?"0@NNN?N  B  ZDp?"0@NNN?N, 'L ,$D 0  Z0eB c"$ ` <$@  0 B H  0޽h ? `\GGV~ .Lo!g!___PPT10G!.*j+J³D ' = @B D ' = @BA?%,( < +O%,( < +D ' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D!' =4@BBBB%(D' =,54*3>Bfillcolor=@BPB<*D' =1:B solid*a3>Bfill.type<*D' =1:B true*]3>Bfill.on<*D' =%(D)' =4@BB BB%(D' =-g6B fade*<3<*D' =1:Bhidden*o3>+B#style.visibility<*%(D ' =%(D' =%(D)' =4@BB BB%(D' =-g6B fade*<3<*D' =1:Bhidden*o3>+B#style.visibility<*%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*Dy' =%(D!' =4@BBBB%(D' =,54*3>Bfillcolor=@BPB<*D' =1:B solid*a3>Bfill.type<*D' =1:B true*]3>Bfill.on<*D' =%( D)' =4@BB BB%(D' =-g6B fade*<3<*D' =1:Bhidden*o3>+B#style.visibility<*%(D ' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*"%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*"W%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*W%(+8+0+0 +!  0    l$ (  lr l S ,Bd`  B " l Z-Bp?"6@`NNN?NW >  >radio hardware" l ZL1Bp?"6@`NNN?NR )  = radio service" l Z/Bp?"6@`NNN?NC  @user applicationB l ZDp?"0@NNN?N \ ,$D 0B l@ ZDp?"0@NNN?N<L ,$D 0B  l  `Dp?"0@NNN?N \ B  l  `Dp?"0@NNN?N QQ\ B  l  `Dp?"0@NNN?NC   l Z:B p?"6@ NNN?N\ Gmessage reception l H>B "`0 LGoal: set hardware to lowest-power state consistent with application needs &LL l s *LBBS" |q<$@ 0 B H l 0޽h ? `\GGV~ .L___PPT10.*j+}D' = @B DE' = @BA?%,( < +O%,( < +Dh ' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*l%(D' =-g6B fade*<3<*lDy' =%(D!' =4@BBBB%(D' =,54*3>Bfillcolor=@BPB<*lD' =1:B solid*a3>Bfill.type<*lD' =1:B true*]3>Bfill.on<*lD' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*l%(D' =-g6B fade*<3<*lDy' =%(D!' =4@BBBB%(D' =,54*3>Bfillcolor=@BPB<*lD' =1:B solid*a3>Bfill.type<*lD' =1:B true*]3>Bfill.on<*lD ' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*l%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*l!%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*l!N%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*lN%(+8+0+l0 +OH  0  {  (  x  c $| Bd`  B "  Z\p?"6@ NNN?Nd c  3ADC"  ZBp?"6@`NNN?N?t < Light sensor  "  TLBp?"6@`NNN?Ngs : CSMA radio  "  Z$Bp?"6@`NNN?N g 7ArbiterB  TDp?"0@NNN?NZ} =,$D 0B   ZDp?"0@NNN?Nh ,$@ 0B   TDp?"0@NNN?N| n ,$@  0B   ZDp?"0@NNN?Nd ,$@  0  C *Aj0234131` { ,$D  0B  ZDp?"0@NNN?Nv{ E,$@ 0"  ZBp?"6@`NNN?N2D  = Power ManagerB  ZDp?"0@NNN?N ] ] e ,$D 0B  ZDp?"0@NNN?Nb ',$D 0H  0޽h ? `\GGV~ .Lt:l:___PPT10L:.+fsD :' = @B D9' = @BA?%,( < +O%,( < +D' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D ' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*Dy' =%(D!' =4@BBBB%(D' =,54*3>Bfillcolor=@BPB<*D' =1:B solid*a3>Bfill.type<*D' =1:B true*]3>Bfill.on<*D' =%(D)' =4@BB BB%(D' =-g6B fade*<3<*D' =1:Bhidden*o3>+B#style.visibility<*%(D)' =4@BB BB%(D' =-g6B fade*<3<*D' =1:Bhidden*o3>+B#style.visibility<*%(D ' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =-g6B fade*<3<* D)' =4@BB BB%(D' =-g6B fade*<3<*D' =1:Bhidden*o3>+B#style.visibility<*%(D' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =-g6B fade*<3<* D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D=' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =-g6B fade*<3<* D)' =4@BB BB%(D' =-g6B fade*<3<* D' =1:Bhidden*o3>+B#style.visibility<* %(D)' =4@BB BB%(D' =-g6B fade*<3<*D' =1:Bhidden*o3>+B#style.visibility<*%(D=' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D)' =4@BB BB%(D' =-g6B fade*<3<* D' =1:Bhidden*o3>+B#style.visibility<* %(D)' =4@BB BB%(D' =-g6B fade*<3<* D' =1:Bhidden*o3>+B#style.visibility<* %(D' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D!' =4@BBBB%(D' =,54*3>Bfillcolor=@BPB<*D' =1:B solid*a3>Bfill.type<*D' =1:B true*]3>Bfill.on<*D;' =%(D' =%(D)' =4@BB BB%(D' =-g6B fade*<3<*D' =1:Bhidden*o3>+B#style.visibility<*%(D)' =4@BB BB%(D' =-g6B fade*<3<*D' =1:Bhidden*o3>+B#style.visibility<*%(D)' =4@BB BB%(D' =-g6B fade*<3<*D' =1:Bhidden*o3>+B#style.visibility<*%(+}  0 $(  r  S $Bd`  B r  S B B H  0޽h ? `\GGV~ .L___PPT10i.ط+D=' = @B +}  0  $(  r  S d`   r  S   H  0޽h ? `\GGV~ .L___PPT10i.N>+D=' = @B +}  0  $(  r  S d`   r  S t  H  0޽h ? `\GGV~ .L___PPT10i.NP+D=' = @B +   0  P(  r  S Xd`     S X<$ 0  H  0޽h ? `\GGV~ .L  ___PPT10 .N]1+FDc ' = @B D ' = @BA?%,( < +O%,( < +Ds' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*X%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*X%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*9%(+8+0+0 +  0  h(  ~  s *d`     s *<$ 0  H  0޽h ? fffjb___PPT10B.W)@,P+[W_D' = @B D' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*<%(Ds' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*<U%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*U%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D ' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*M%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*Mz%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*z%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(+8+0+0 +  0  0(  x  c $Td`   x  c $  H  0޽h ? `\GGV~ .L___PPT10i.N]1+D=' = @B +}  0 P $(  r  S d`   r  S   H  0޽h ? `\GGV~ .L___PPT10i.N0+D=' = @B +  0  ,0(  ,x , c $|d`   x , c $@  H , 0޽h ? `\GGV~ .L___PPT10i.N@d+D=' = @B +  0  00(  0x 0 c $$d`   x 0 c $  H 0 0޽h ? `\GGV~ .L___PPT10i.N7+D=' = @B ++  0  ("(  (r ( S dyd`    ( S dz<$ 0  0 ( Tp?"6@`NNN?Na:,$D 0 :tmodule AntiTheftC { ... } implementation { message_t alertMsg, theftMsg; uint16_t accelSamples[SAMPLES]; ... }uu                ( THp?"6@`NNN?N,$D 0  module AdcP { ... } implementation { uint8_t client; uint8_t someState[uniqueCount( adc.resource )]; .. someState[client] ... }Z  6 #     H ( 0޽h ? `\GGV~ .LA9___PPT10.N@u+?DE' = @B D' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(R%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(%(D ' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(R%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(%(++0+(0 ++0+( ++0+(0 +  0 P(  r  S  ed`     S  f<$ 0  H  0޽h ? `\GGV~ .Lwo___PPT10O.g x+FD' = @B D' = @BA?%,( < +O%,( < +D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*M%(Ds' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*Md%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*d%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* E%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*Eq%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*q{%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*{%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(+8+0+0 +}  0 @$(  r  S Xd`   r  S Y  H  0޽h ? `\GGV~ .L___PPT10i.5L+D=' = @B +}  0 `$(  r  S |Rd`   r  S @S  H  0޽h ? `\GGV~ .L___PPT10i.7@@+D=' = @B +}  0  `$(  `r ` S 46`  6 r ` S  ~4 6 H ` 0޽h ? `\GGV~ .L___PPT10i.M+D=' = @B +}  0 p$(  r  S Hd`   r  S |I  H  0޽h ? `\GGV~ .L___PPT10i.7?+D=' = @B + 0 2*0(  |  TI.>/A$intel_rgb_1700tag,! V  0޽h ?"@` .\GV~`L___PPT10i.ո +D=' = @B + 0 l((  l^ l S v   > l c $#> Y?  >  H l 02m.F ? 3380___PPT10.ݸw$ 0 @4(  d  c $v     s *x Y?    H  02m.F ? 3380___PPT10.ݸwVT 0 $f(  $d $ c $v    $ s *@    P(Services modeled as separate components  ) H $ 02m.F ? 3380___PPT10.K,0 [xǟ hLl13X`Ydbff=ٽٸ_teWVWW:uoR@A}+TͼvoWCЄ!,OO D!*шN b!.O$!)HN RԤ!-HO2d!+NrG])DaPb'JPR e)Gy*PJT UFujPZyR4!ߐ*j篳r-ǎzϤZ^+ /sAϫ&Zy??w@(HS4bAZOV ^4 @.# L ȿZ (je0ڙN)P@|^g:y_M{1yҌViC@{hG{:БNt ]Fw'Mҏ?ew+w+ۃi'"`{\{(i6B:ۖ(ŌSB?Ux?,? ,o}R-X6`XwSi?0MW~m rĹYD85d4i?~,K)LcӀ~.`981@Ǘ}O[N }|'h۹I넅ul߮c-u,V_;?y{#~ةԼIΙd>tBn5XAFMZ=DfnlӠ3E@a#~l]v[u Xo&?v|eTA&VlжY ;"P@?𿮿CXy_ o?,/-`p\?3mO= ?W:Etm8a=2-ulש] v(ѿ&oX  =n}xC6mѨ]WQMK$}@osܖJ@/Cʰ@#{a,~fb4)Leә@n6s{}g Yb4 YJV5eF6-leNv=>sWG81s9)4g89s!}K\ Wunpo]q<ySy[?G>/|:`8$(IJ k MD "L &M$ !HL,~9)IEjҐt'Dfld'9En#yG~ PBE)Fq~%)EiPrDePjT5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~` 2`$2Lg&2La*Ә f2a.,a)`%X͚X6la+va/r_9o(8 ~$Ӝ,8.r\*׸ nr.<)x ^׼-xϟ|# BPAY(B#<H$" ؓD#:1I,b#> HH"$#9)HI*R#=H&2d#;9I.rK>S0E(J1%(I)JS<H%*ST:5I-jSԣ> hH#ӄ49-hI+Zӆ=H':Ӆt;=I/zӇ? 3 c8#(F3c<Lb2S43b6s<泀,b1KX2~a9+X*Vc=&6lc;;.vc?8!~0q8'Ns<%.s\:7-ns>x#<9/x+^󆷼=|3_7 BPAHB0%@D"(D%щALb8%I@B$$%IAJR4%@F2,d%ANr@1! eHF11eLdT1d\1,dYR YJV5eF6-leNv=A rwNr?8r\"r&r|+A!( $MD "L &M/`N$!)HN RԤ!-HO2d!+NrG (LRD JRҔ,(O*RT*ըN jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(F2ьa,~f"2`&2,`!X_X Vլa-X6la+va/r_9o(8 ~$Ӝ,8.r\*׸ nr =<1Ox3󂗼5ox;''>|/`BP& a Gx"HD& QFtbX&qG|D$& IIFrRT& iIGz2Ld& YFvr\&?|)DaPb'JPR e)Gy*PJT UFujPZԦuG}АF4 MiFsZВV miG{:БNt ]FwzГ^}G0A fCpF0Qf cx&3d0iLg3l0yg YberVUf kYz6Mlf [vv]f{~pCa~G9qN;'9 g9y.pK\ Wunp[w}G< Oys^W oy{goE瀓`BP& a Gx"HD& QFtbX&qG|D$& IIFrRT& iIGz2Ld& YFvr\&?|)DaPb'JPR e)Gy*PJT UFujPZԦuG}АF4 MiFsZВV miG{:БNt ]FwzГ^}G0A fCpF0Qf cx&3d0iLg3l0yg YberVUf kYz6Mlf [vv]f{~pCa~G9qN;'9 g9y.pK\ Wunp[w}G< Oys^W oy{goEq BPAHB0%@D"(D%щALb8%I@B$$%IAJR4%@F2,d%ANr@1! eHF11eLdT1d\1,dYR YJV5eF6-leNv=e9A+#9p3E.q+\׹Mnq;yC'<yK^7|W ~!?AJ0!I(B#<H$"D#:1I,b#> H2|QO %HMҒd #L 'M~$/O R((O$(MRT"LRԠ&MR4!hLҌ洠%hMҎt#Lҍ'Mҏ ` 2`$2Lg&2La*Ә f2a.,a)`%Xֲl`#`' rwNr?8r\"r&r|+#8?"4aK8D"2QJ4"6qK<Ⓚ$"1IHJ2"5iHK:ғd"3YJ6"7y#?(H! S8?Q4e(K9ST2UJ5SԢ6uK=Ӏ41MhJ3ӂ5mhK;Ӂt3]J7Ӄ7}K?3 b0C03b4c83$&3Lc:3,f3c> X",b5kX:ֳlb3[6b7{>sWG81s9)4g89s\2W5s6w=<1Ox3󂗼5ox;''>|/~ @BЄ!,O"D!*шN b!.O$!)HN RԤ!-HO2d!+NrG (LRD JRҔ,(O*RT*ըN jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(F2ьa,~f"2`&2,`!X_X Vլa-X6la+va/r_9o(8 ~$Ӝ,8.r\*׸ nr.<)x ^׼-xϟ|# %$ CXD$BT$C\$$IBR$ICZґ d$BV$Ï%)@A Q")CYQ TBUQԤC]Q4iBSќiC[ўtBWѝC_џ dP1dX1 D&1)LeәLf19eYB%,edYZֱ ldVd^r8QqIN9Yq \Uq]q<ySy[?G>/|p|``BP& a Gx"HD& QFtbX&qG|D$& IIFrRT& iIGz2Ld& YFvr\&?|)DaPb'JPR e)Gy*PJT UFujPZԦuG}АF4 MiFsZВV miG{:БNt ]FwzГ^}G0A fCpF0Qf cx&3d0iLg3l0yg YberVUf kYz6Mlf [vv]f{~pCa~G9qN;'9 g9y.pK\ Wunp[w}G< Oys^W oy{goEk#8?"4aK8D"2QJ4"6qK<Ⓚ$"1IHJ2"5iHK:ғd"3YJ6"7y#?(H! S8?Q4e(K9ST2UJ5SԢ6uK=Ӏ41MhJ3ӂ5mhK;Ӂt3]J7Ӄ7}K?3 b0C03b4c83$&3Lc:3,f3c> X",b5kX:ֳlb3[6b7{>sWG81s9)4g89s\2W5s6w=<1Ox3󂗼5ox;''>|/~u %$ CXD$BT$C\$$IBR$ICZґ d$BV$Ï%)@A Q")CYQ TBUQԤC]Q4iBSќiC[ўtBWѝC_џ dP1dX1 D&1)LeәLf19eYB%,edYZֱ ldVd^r8QqIN9Yq \Uq]q<ySy[?G>/|?'A Fp~ ! Ehp'DdhD'1Elx' IDbd$')IEjҐt'Dfld'9En#yG~ PBE)Fq~%)EiPrDePjT5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~g`0a g#h0qg?3ILf Stf0Yfs|E,f KY/,g+Yjְugfmlg;n}9į7pcsSipsepk\7mp{ycg</ykwO>O| __0>0AJk\92  CUD$BT$C\E~$$IBR$ICZґ d$BV$Ï%)@A Q")CYQ TBUQԤC]Q4iBSќiC[ўtBWѝC_џ dP1dX1 D&1)LeәLf19eYB%,edYZֱ ldVd^r8QqIN9Yq \Uq]q<ySy[?G>/|p!( $MD "L &M$ !HL %HMҒd #L 'M~$/O R((O$(MRT"LRԠ&MR4!hLҌ洠%hMҎt#Lҍ'Mҏ ` 2`$2Lg&2La*Ә f2a.,a)`%Xֲl`#`' rwNr?8r\"r&r|+&A Fp~ ! Ehp'DdhD'1Elx' IDbd$')IEjҐt'Dfld'9En#yG~ PBE)Fq~%)EiPrDePjT5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~g`0a g#h0qg?3ILf Stf0Yfs|E,f KY/,g+Yjְugfmlg;n}9į7pcsSipsepk\7mp{ycg</ykwO>O| __\T+0AJ0!I(B#<H$"D#:1I,b#> HH"$#9)HI*R#=H&2d#;9I.rK>S0E(J1%(I)JS<H%*ST:5I-jSԣ> hH#ӄ49-hI+Zӆ=H':Ӆt;=I/zӇ? 3 c8#(F3c<Lb2S43b6s<泀,b1KX2~a9+X*Vc=&6lc;;.vc?8!~0q8'Ns<%.s\:7-ns>x#<9/x+^󆷼=|3_7" BPAHB0%@D"(D%щALb8%I@B$$%IAJR4%@F2,d%ANr@1! eHF11eLdT1d\1,dYR YJV5eF6-leNv=e9A+#9p3E.q+\׹Mnq;yC'<yK^7|W7L@BЄ!,O"D!*шN b!.O$!)HN RԤ!-HO2d!+NrG (LRD JRҔ,(O*RT*ըN jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(F2ьa,~f"2`&2,`!X_X Vլa-X6la+va/r_9o(8 ~$Ӝ,8.r\*׸ nr.<)x ^׼-xϟ|#(r``BP& a Gx"HD& QFtbX&qG|D$& IIFrRT& iIGz2Ld& YFvr\&?|)DaPb'JPR e)Gy*PJT UFujPZԦuG}АF4 MiFsZВV miG{:БNt ]FwzГ^}G0A fCpF0Qf cx&3d0iLg3l0yg YberVUf kYz6Mlf [vv]f{~pCa~G9qN;'9 g9y.pK\ Wunp[w}G< Oys^W oy{goEE#8?"4aK8D"2QJ4"6qK<Ⓚ$"1IHJ2"5iHK:ғd"3YJ6"7y#?(H! S8?Q4e(K9ST2UJ5SԢ6uK=Ӏ41MhJ3ӂ5mhK;Ӂt3]J7Ӄ7}K?3 b0C03b4c83$&3Lc:3,f3c> X",b5kX:ֳlb3[6b7{>sWG81s9)4g89s\2W5s6w=<1Ox3󂗼5ox;''>|/n %$ CXD$BT$C\$$IBR$ICZґ d$BV$Ï%)@A Q")CYQ TBUQԤC]Q4iBSќiC[ўtBWѝC_џ dP1dX1 D&1)LeәLf19eYB%,edYZֱ ldVd^r8QqIN9Yq \Uq]q<ySy[?G>/|p!( $MD "L &M$ !HL %HMҒd #L 'M~$/O R((O$(MRT"LRԠ&MR4!hLҌ洠%hMҎt#Lҍ'Mҏ ` 2`$2Lg&2La*Ә f2a.,ai{b5kX:ֳlb3[6b7{>sWG81s9)4g89s\2W5s6w=<1Ox3󂗼5ox;''>|/n %$ CXD$BT$C\$$IBR$ICZґ d$BV$Ï%)@A Q")CYQ TBUQԤC]Q4iBSќiC[ўtBWѝC_џ dP1dX1 D&1)LeәLf19eYB%,edYZֱ ldVd^r8QqIN9Yq \Uq]q<ySy[?G>/|p!( $MD "L &M$ !HL %HMҒd #L 'M~$/O R((O$(MRT"LRԠ&MR4!hLҌ洠%hMҎt#Lҍ'Mҏ ` 2`$2Lg&2La*Ә f2a.,a)`%Xֲl`#`' rwNr?8r\"r&r|+@q?AJ0!I(B#<H$"D#:1I,b#> HH"$#9)HI*R#=H&2d#;9I.rK>S0E(J1%(I)JS<H%*ST:5I-jSԣ> hH#ӄ49-hI+Zӆ=H':Ӆt;=I/zӇ? 3 c8#(F3c<Lb2S43b6s<泀,b1KX2~a9+X*Vc=&6lc;;.vc?8!~0q8'Ns<%.s\:7-ns>x#<9/x+^󆷼=|3_7"P||XEX%X/ ˱+ ka=6`#6a3|۰;avcb{AaQ88S838s8q?".2g\5\ -=<#< !!1 )!9R %R!5 -!=2 #2!3 +!;r 'r!7 /!? 0(8J$J4ʠ,ʡ<*"*2*:j&j6.>!1)9Z%Z5ڠ-ڡ=:#:3+;z'z7/?` a0`(a8F`$Fa4`,a<&`">$|S0)>tLl\瘏/ K%a9V`%Va5`-:l&l؂obcv;n^~|8C8#8cq'q qgq#.'\%\븁۸xxx+^^ ~o'=> $FE8GDD$DFDE4DG D,FEGD!FE1G D)FE9GTD%TFTE5TG D-FE=G4D#4F4E34G D+FE;GtD'tFtE7tGD/FE?  0 (8LG1` b>gY9y`!a1`)2, *WX؀؄[ [lvN|]؍=؋}؏qqqGq ?8N$N4,<~˸qp7ppwppO~sKko-;Ȉ舁؈HHHHHHHHȀȄȂȆȁȅȃȇ((((((((򨀊ʨꨁڨhhhhhhhh耎肮聞胾񘀉1&LTLç 131 1s1c>,",,ŗXXXX _c V|m؎؉ {= 0( )9ǏppW3nn <ïxxWx7 şx4aQ1q Iɐ)iYِ9yPPEPP%PPePPPPUPP5PPuPP M-m]=}00C00#00c000a>d|)ia:f`&fa6`.sXXX˰+k_ac6b6kl7؊o ۱;va7`/a?!18888.. ~U\uMm]}8888p'ppgpp?~E\e\ϸk[;{xGx'x_ 9^%^57?BqGhAXCxD@DDBdDATDCt@LBlA\C|$@B$Bb$AR$Cr@JBjAZCzd@FdBfdAVdCv@NBnA^C~@ABaAQCq@IBiAYCyT@ETBeTAUTCu@MBmA]C}4@C4Bc4AS4Cs@KBkA[C{t@GtBgtAWtCw@OBoA_C @ ` P pHhXxLD|I `*S|阁٘1_`bc K,rJjZ|uX ؈M،`+6lw؅؃؇ppGpNN G\OK+Wq q7q qwqO W< +O{|@Hzn0pH(hX8xHDH$HdHHTH4HtH ȈLȌ,ȊlȎȉ\ȍ<ȋ|ȏ(B("(b((R(2(r( J*jZ:zhFh&hfhhVh6hvhN.n^>~A!aQ1q 0 c2>L4|0300s09 ,B,b,R|eXXUX5X 5lŷ؆؁{~qIiYy q q?*:n&n6.>!1)~3xxx;[wxa Q 1 q I ɑ) i Y ّ9 yQQQEQ Q%Q QeQQQ QUQ Q5Q QuQ M - m ] = }111C1 1#1 1c11&cL'Ocfbfcb>||XEX%X/ ˱+ ka=6`#6a3|۰;avcb{AaQ88S838s8q?".2g\5\ -=<#< !!1 )!9R %R!5 -!=2 #2!3 +!;r 'r!7 /!? 0(8J$J4ʠ,ʡ<*"*2*:j&j6.>!1)9Z%Z5ڠ-ڡ=:#:3+;z'z7/?` a0`(a8F`$Fa4`,a<&`">$|S0)>tLl\瘏/ K%a9V`%Va5`-:l&l؂obcv;n^~|8C8#8cq'q qgq#.'\%\븁۸xxx+^^ ~o'=> $FE8GDD$DFDE4DG D,FEGD!FE1G D)FE9GTD%TFTE5TG D-FE=G4D#4F4E34G D+FE;GtD'tFtE7tGD/FE?  0 (8LG1` b>gY9y`!a1`)2, *WX؀؄[ [lvN|]؍=؋}؏qqqGq ?8N$N4,<~˸qp7ppwppO~sKko-;dȈ舁؈HHHHHHHHȀȄȂȆȁȅȃȇ((((((((򨀊ʨꨁڨhhhhhhhh耎肮聞胾񘀉1&LTLç 131 1s1c>,",,ŗXXXX _c V|m؎؉ {= 0( )9ǏppW3nn <ïxxWx7 şx,aQ1q Iɐ)iYِ9yPPEPP%PPePPPPUPP5PPuPP M-m]=}00C00#00c000a>d|)ia:f`&fa6`.sXXX˰+k_ac6b6kl7؊o ۱;va7`/a?!18888.. ~U\uMm]}8888p'ppgpp?~E\e\ϸk[;{xGx'x_ 9^%^57?BqGhAXCxD@DDBdDATDCt@LBlA\C|$@B$Bb$AR$Cr@JBjAZCzd@FdBfdAVdCv@NBnA^C~@ABaAQCq@IBiAYCyT@ETBeTAUTCu@MBmA]C}4@C4Bc4AS4Cs@KBkA[C{t@GtBgtAWtCw@OBoA_C @ ` P pHhXxLD|I `*S|阁٘1_`bc K,rJjZ|uX ؈M،`+6lw؅؃؇ppGpNN G\OK+Wq q7q qwqO W< +{o7|)Gػ !$tȆB.bO(n3" E 2r5$bHT$採XH롪Jw"N-THйB)6 THN!B M6iHjO6uilHӌKLæ QNMjk_)uH{;e+^z!Cr/d33M3ϖl/)8"?E+JpZ_?|S(_"?Ows'_ozdJo{R=^ I_o_Y{?C?Hs'ÆCccaccwd㸿,_:|Hzp#ӱ];iW䙬P!B )lnty IL9b_hnѪMv]+CXFGu"qwj_<֩_Kp/{RS (qHW{됰aCwc'$JW\+2Đ{BK$hsTEp@gHuv֎3h.l]Ӡu]S{ ~2e5֪{~-b%79zL/Z!c{_ܡ} W]/Kѣk˘CN3x|OƵ2.1qK9XB_ו1#23.#Č_)ZHd>:~axcf!(3_]2M_FxA]_ʐ!y8!:u!f0kC{G>A-0~ ?_ߟ~STLMHK .fJ>5~Jp-H5bwC-=%s;#;婡BJrHAz 6&?ߛ:4:OC%ӯW^۳X?ޒJ3yp ~6 +g-gK㿮u˿?7\JU _/M&]!C[H;C@!f2VBaBTnEB?|܋MH?z󙻇gR?n̸ >g޳>lꘑ31t }[ο_N#(zH9)\*!Ci/w@H`Zwk[xovſhӟ6}?Kllŏ,W.TL*K| /]|Y_5i.Tiԯ.ԏmDQ2c]⫤ .. TZD8%*[櫟\\XڳX .U?ϒ]rmM.9U)ޠF\*]rpcpu.yTZ*oYp|K>V̼%#¥ 7:dB<%t)R˼$d.X\P+KQS)]W|C.\-Cs\JRo.Tr6.U7.eTV v.eUnc4r*wbKyX *c*gB4ɥJgRY.h**68*{ @*F.T.>ξ.UTg>. TJ5_/*S.T~c.UnԥJiuvi2Qy?yLQ\LU;i*KC ;˧*܅38eJˆ2Cez 2SEHQ\fD֡le>g2Werp.Ts|Wnr/T#x~@ARsY.T]~sYӨvYTٟtRE7.T8}W*Ig.+TpheJ 6v?vY#*߼xwn5*:`V%EJgS^%8pe7lTi`鐫.Tf \6܈;U`e.|2#]yhs.ߪ-lS)v՝t١>]pSQ|cG]v$n(\\Z\\S*-pUt1r9.oEs9R*8rHe.h*p,rDe!JNnQS'W.?lWSnp9BJ_\rJevpǿY5r9#.gU8Qu9Gxr^e_pGG *z2'(*k.TWy.U2=+\+*:ʢ6x0ʕ 5u:dt.7UqrK%B9UMvRNܾ]M宊'S 's;xr*Y<*V%xDOqy֥$C[W~dD|]|xtK(}.>1UǪʍ\|qTDKX}' [% _0.UtT%JOp6xR%J(xKd4yDQչKTv.T.\Sz*:U%..Tv .UBH%\ӡK\8)OlQхe^2U%^sxe\>Uщ.'.UrJ*-ueo,=n2[%]d|*wϭ\xu)r4xKi=tWs)F*tZͥʶOR^UpKu˸TRY<,RYv0 ,RE%N$TUFQj*z鸰KuB.5Tbc*UtRKEW.Ucn:*C\.uU 뤹K=p/9Kl٥J& e\*\k(i]E.TB*ӂ)D *?Oh^O]Zyb*#tbԥʎ.mUO⹴SѼ.K{pAeupQn2ltN*u*ХYQ\t]$*o`Dn*Kwjz CEӞ0.=Ut'KVJ/~]xOŋ_*^ Pe.Tuů ]x2Lŋ_*^Pe.Tuů/~]ƪx2Nŋ_*^LPe.x2Iŋ_Uuů'*^LQe.TuTŋ_Tuů /~]fx2Kŋ_*^Qe.Tu\ŋ_*^|ů/~]xHŋ_*^,Qe._xLŋ_*^Pe.TuYů/~]֪x.TuYů/~]6xIŋ_*^|ů/~]Qe.ߪxMŋ_*^Pɱ.ߩxKŋ_*^Qe.Tuٯů*^P堊.Tu9ů/~]xrLŋ_Tu9ů /~]NxrJŋ_*^Q嬊.Tu9ůˏ*^\P'/~].xrIŋ_*^\Qg/~]xrMŋ_*^P妊.Tuů/~]xrOŋ_*^TůKL/~]bx[ŋ_8*^U%.UuIůKB/~]xXW $*^$U%.UuIůKJ/~]RxZŋ_4*^U%.UuɠůKF/~]2xYŋ_,*^dU%.UuɡůKN/~]rx[ŋ_<*^U%.Uu)ůKA/~] xRXŋ_"*^Uץ.Uu)ůKI/~]JxRZŋ_2*^UK9/~]ʫxRAŋ_*^TRץ.UTuůK5/~]xRCŋ_*^Rץ.uTuůK=/~]x@ŋ_*^4Rץ.MTuiůK3/~]xBŋ_*^Rץ.mTuiůK;Gzȥ.TuůK'/~]:xEŋ_q^tSץ.=TuůK//~]zxGŋ_*^Sץ.Tuů /~]x2Dŋ_*^ Se.#Tuů(/~]Fx2Fŋ_*^Se.TuůG*^LRc/~]&x.STuů4/~]>U3/~]x2Cŋ_*^Re.sTuů</~]>We._x@ŋ_*^,Re.KTuYů˗*^,Se.+TuYů*/~]Vx@e.kUuJŋ_u*^We.Uu٤ůf/~]Ve.ߨxUŋ_oUu٦ův/~]vxSŋ_Tu٥ůn/~]xWŋ_}*^W{/~]xrPŋ_C*^V刊.GUu9ů*^W儊.'Uu9ůi/~]ΨxrVŋ_s*^WG/~].x.Uuůe/~]x.WUuůu/~]nxrSŋ_[*^V厊.wUuů}/~]xPŋ_G*^Qe.SUuů˧*^|ůt/~]fx2Sŋ_Y*^Ve.sUuů*^W /~]xPŋ_E*^,Ve.KUuRŋ_e*^,We.+UuYůj/~]֨xVŋ_TuYůz/~]6xQŋ_M*^lVk/~]x.[UuVŋ_m*^lWe.;UuNŋ_]*^Ve.{Uu٧ů~/~]W倊.Uu9ůa/~]xrTŋ_c*^ůq/~]NxrRŋ_S*^V匊.gUu9ůy/~]~T傊.?xrQŋ_K*^\V劊.?xrUŋ_k*^\W冊.7UrKŋ{*Uuů]/~]xr_ŋ_*^/~]xR@ŋ_*^Rץ.ETu)ůK1/~]xRBŋ_*^Rץ.eTu)ůK9/~]ʫxRAŋ_*^TRץ.UTuůK5/~]xRCŋ_*^Rץ.uTuůK=/~]x@ŋ_*^4Rץ.MTuiůK3/~]xBŋ_*^Rץ.mTuiůK;/~]ګxAŋ_*^tRץ.]TuůK7/~]xCŋ_*^Rץ.}TuůK?/~]x2@ŋ_*^ Re.CTuů0/~]x2Bŋ߻*#Uuůh/~]ƨx2Vŋ_q*^We.UuHŋ_I*^k2Y/|F)*^LUe.x.UuůL/~]fx2[ŋ_9*^Ue.x2_ŋ_/TuYůB/~]xXŋ_%*^,UK/~]x\ŋ_*^Te.UuYůZ/~]Re.Uu٠ůF/~]6xYŋ_Uu٢ů7*^lU[/~]x]ŋ_*^T;/~]vx[ŋ_=*^Ue.Uu^ŋ_*^T吊.Uu9ůQ/~]x.Uu9ůI/~]NxrZŋ_3*^U圊.UuQ/\P'/~].xrIŋ_*^\Qg/~]xrMŋ_*^P妊.Tuů/~]xrOŋ_*^(~ɜ̕(~G/h%K̝(~'/d%JӉ|&Qy/l%K̛(~||!Q/Y Q/&_`%_Jˉ|%Q/j%_K|#Qo&_DKNۉ|'QE/n%KdDK(~/Y,?x}*Y"Q%/Y*Q&_DKNlj$Qe/i%&_\%?KdDFVHdDKVJdDK~(~*"QU/Y-Q_&_z%JdDKLdDKNdDKMdDKOdDK6LdDK6NdDK6MdDK6OdDKLdDKN׉l(~ɶl(~(~Ɏ(~Ή(~ɮ(~(~ɞ(~މ(~ɾ(~(~Ɂ(~(~ɡ&Q/9Q/91Q/99QS/95Q/9=Q3/93Q/9;Qs/97Q/9?Q /0Q/8QK/4Q/Q/1Q/9Q[/5Q/=Q;/3Q/;Q{/7Q/?Q/y0Q/y8QG/y4Q/yQ&_DK^H!Q?&_DK(~L(~_/[%/&_DK^J3Q%_r%N?7Q%_J%UQ&u◼>Q7$_DKޔ(~ɛ/"Q)/*Q/&Qi/.Q/!Q/)Q/%QY/-Q/yK%oMm◼=Q9/yG%L]◼;Q$_DKޗ(~/@%LC|8Q9/+Q$_DK>(~/;QO$_DK>(~ɧ/L%$_DK>(~/7Q/B%'_@%_LdDK(~ɗ/J% %_DK(~/F|3Qo%_p%N;,(~w/^%&_DK~(~b,(~,(~R0Q%_t%?N',(~O/Y6Q/Y%'_B%+&_R%+'_DKVI◬(~j2Q/U%k$_f%k%_v%$_n%%_~%$_a%%_q%$_i%%_y%[$_e%[%_u%NdDKMdDKOdDKvLdDKvNdDDk%%_{%{$_g%{%_w%$_o%%_%$_r`%%_rp%$_rh%IDKODKLDKNDKMDKODKNLDKNNDKNMDKNODKLDKNDKMDKODK.LDK.NDK.MDK.ODKLDKNDKMDKODKnLDKnNDKnMDKnO;/3Q/;Q{/7Q/?Q/y0Q/y8QG/y4Q/yQ&_DK^H!Q?&_DK(~_/k%KDK(~K#Q&_DK^N߉'Q&_DK^I5S*_DK^(~/yC%oLM◼9Q)/2Q/:Qi/6Q/>Q/1Q/9QY/5Q/=Q$_DKޖ(~/#Qw$_DKޕ(~ɻ/yO%M}◼?Q$_DK>(~ɇɜ̕(~G/h%K̝(~'/d%JӉ|&Qy/l%K̛(~|G+DKOdDK(~ɂ|)Q/'_DKJ䫉|-Q'_DK(~ɷ/Y8Qo'_DKI仉|/QE/~%?HdDKOdDKLdDK~(~ɏ/Y:Q'_DKI䧉,(~r,Q/Y!Q/Y)Q/y%$_DKVMdDK~(~*Q5/Y3Q/Y;Qu/Y7Q/Y?Q /0Q/8QM/4Q/QH?$zHGVՏO֑9Q6$:FDH3F(!y)Q$BO+%!W$/'*ADH(~hkzU{䵉N.Q';O$"DGD>ȧL"$DC>h{%7B!' @!_L- R!_Nt2+*,h`W Zo!_O,v|3Qo%pB!N4';„,Iw^!&DB~>bƃ,(:~,5R60Qb% t ?N4',%OuY6BYsx$Y>Q5 Y1Q,}Y9Q#'J4 HtdģY- _& z J5wd>Y+qONړuwdč;oT oJ$͉%)F S&ބ@JLx&N2m d " 3&<@fJg̜x%2kd쉷$f[m~?#1Oޑ'Lw%ɻ=z=y_bj?1#O>'L̿%ɇd$;+1N>R'M̤%&dt9Db|219N>'NL$f1MMLjs )l2b,&_LSKYid4Jb,z&_M8%&iel2Vb,;&NL?|'1SLIL&d,0~b 1KKL(Y"1KL璥Ӹ䇉[Ĥ-Y:1WK~%?I̒e䧉yXlb,u%?KLsd*Y11JVJLiSJb"1IJVM̍S䗉Pzb*1IHLw5d&Y;1IILeu3d%Y?1_I6HLS dĤ$81I6'ly$ٓtJ6'il^$[ړp$[%&$=j_ۓ4uHImI($%$M I ȎI@=I291Gv'Mv'i얘#ۓtNH=IC^$ّSud{fȾ9_b>oO}#ړtt@r=Ism9Ğ5rhbBƞ-#9̞3rxb֌aOd921*D'҃mO 9&1F')(!%${&ȉ-r=ISZL9ŞjOҼ9-1]EN'i"gړ4'Eβ'郐"ؓDM7I:"ۓ4D.HL* IK"%.$m%$MKD2{Y!r=IAJ{xUr=Iq&1C')'ٓ4COI!7&nM$,f{fj- r=I2t ݞYr=I[rgb΅eOC,;1BIL{IO!%Q$͞IJȃ=IS$yĞ =IW5yܞ%}Dby4V6Q%:|DuOސhE=yS'oNdDOLdDNNTdDNMdDNOdDNfLdDgNfNTdDCNfMdDNfO-5Qz%nDMH4B3cw%kDkMޓ({5y_&O4"|0?%jgDLLdDL>GM2X@&OdD]L>h'0T&NT3̓l/\%OdDKK ̟(~|1Q!R%_N,H+,(~W/Z%_O|3Qo%_p%N;,(~w/^%&_DK~(~b,(~,(~R0Q%_t%?N',(~O/Y6Q/Y%'_B%+&_R%+'_DKVI◬(~j2Q/U%k$_f%k%_v%$_n%%_~%$_a%%_=II%ړI6Kds{$dDK'%['_k{6$&&_=I/>QI*~Ɏ$]/ٞ(~ɮ$d7{ =I/3Q/۞(~ɾ$d?{%ؓe$&_r=I`{_rH%ړT$_r=I/9ܞ(~ɑ$DK'%ؓt%FM8{br|%'ؓI*~I◜lORKNIT{_r=I@DKΰ'%g&_r=I/9۞(~ɹ$my◜oOq\(~E$DK.'%ړ/ܞ\(~ɕ$*{.5Չ\cORBM:{BFr=I/!QI*~MlORKn'!ܚ(~m$DKHN{>IJn{=$DK'%'_=I/yОKzP%ۓgGQ{~4c$]N/yžkid%Oٓ$I*~3(~'/T%N3̓(~g/\%OdDKK ̟(~|1Q/R%_N+,(~W/Z%_O|3Qo%_p%N;,(~w/^%&_DK~(~b,(~,(~R0Q%_t%?N',(~O/Y6Q/Y%'_B%+&_R%+'_DKVI◬(~j2Q/U+Y#Q5/Y+Q/Y'Qu/Y/Q/ Q /(I:!ؓK6Md3{laOұҞl(~$׉lcORK'%%_=I/!QI*~N$]/ŞljORKvKdw{_G%{ړTI2/Ǟ(~~$d{~UhO&(~$=CI*~ɡƞ(~${brd%GٓT/9ƞkO%9.QI''$_r=I9ɞ◜(~)$DKN'%ۓ'g$_r=I=DKζ'%ؓؑs/9Ϟm.9?Q I: ړT/؞DK.'%ٓ/ž\(~U$j{5\kORAKijz{S $}/ɞlO҇7%Q[Izl#%_r=Iv{ɝeO;Q{IzP!ړT/ߞ<(~Ƀ$!{É(~/P%NdDKJ#|4qM>(~/;QO$_DK>(~ɧ/L%$_DK>(~/7Q/B%'_@%_LdDK(~ɗ/J% %_DK(~/F%L[,(~ɷ/N%$_DK(~ɢ|?Q$_X%'_D%K&_T%?L'?JdDK~(~O/Y&Q&_l%%_DKOdDKVLddDKVN,u◬(~//Y5Q/e%'_DKHdDKJdDKIdDKKdDK6HdDK6JdDK6'%ړB6Kds{'liO )ʞl(~ɯI*~6l(~v$eCdDKv'%;ړthNvJdg{K.jOR(Cv'%'_=I/3QI*~$m>kO1/QI*~$p/9Ȟm98QCIz $ړT$_r=I/9{<&g$ZYrf%g5$g\._#$Wrnh%_%<-"M%&JTrQ;%2%k kG.KDJigS)'.:Quk 'gJ&'H}&E5&!^%_WInWQ[mOɭBDIn>wH;eDHN{5^kfE"/!yW[HUluD%HI4QkTG1+RWqO y"'yJb:5i6,>#1e9Y5E=$jDCޖ(y#Qܜ#w& DoCޝk{- yo!Kt2*| &DB>YȜv̕(UG] hB!K4'„̝I'd!J!Ӊ|&Q}yl KZ̛h3||!]Y T/& ^|JRAl% _IdDpSU+IU|JR@75@,l%闛|JRW@"f|JR!@g% ZI'OXI'YI'[I'K$ɒywC+IKut&8qoN~b%,c%NJ 8Y6qMKnYI&[I&+XI&+&nJ;h;s+Id+I1Y5qS|cCOK+I[du+IwW^F>i%e%飛%$aɺVd=+Iwd}+I*d)0q[J6O6tPK6t!G6Mrwds+I7d +IdK+Id]$:qH~m%鞑lc%i ZIC$%n ACe>s^쒸#ZI#YI#'7$ݬ$ҫdĭ7qGF@HtPB1'&A,r{+r[*r;) 9,qDtDtDDĭ9J9Jq9J!>9>qCNHݐ$Ԑ$ː$Sw. 9J} 9J 9#qWBL܌$FV$=ғs$qs79JmV&ȅVn"E{rq▁\b%N\j%\f%鱛\ W$ȕVUVV53|rmĞ\g%\o%4`%ܘ8i'7%VN-Vɭrr[z&L8%&ɇdĴ2+1L>D&M%I>)&s'&'䓉`,0tb|&q!FIlg3s]|.71KKޒ/$&mZo,Y01!Kd%i|JҁYWPb|51Jf%ij|JҌ*T)Vbڔ,l%r|JM%$Dw${VeȢVӝYNM9ͫ%$Me%3d%J#+Idi+IWljKrYJ҃7a#W\b,1H4HV4HV4HVJL3V& *V/$}ĒUd$ pn%X*1GHL5$둵$M瑵$uwdĜYJTYJ J2J6LǑpdc+IJUɦVjf)6ybfla%iBli%ile%ilHȯd+Isdd[+IScd;+I3bdD!1EvxLv\dJҕJLJ#1oELLW$R$MN}$I}SQd J#9JRHtEJ.J+IK?9J҅7#rXbˆ'"GXI"GZI29Jd9:1DILc$=8+Ix+I!>9!H$z$8$m))rjbf%in%i^a%i:!g%&_VrXrX!'SV.ȅV>EVrqb\"!ZI!YI![I!W$?ȕYrr<\c%鈊\ %&2Vhrk+$JJҔJL-1AnO+IWN+IV.+cĜ'1@KHtH"$ ȃo򐕤I򰕤򈕤)h'% 򸕤bsѽ?$*wG+IM;JR~yDNh߬$$-V.K#QZI::!%/[Ijɿ7O&TqYIj+V m_=6ym&K!Q7&iD#Mޜ(LTL(4nLt&L( ޘ̘L̜(,N̚l̞yK,yk%oK+'J]2G%HT䝉於+Qؒw'zZD=Kޛhee,y%HT䃉ƕ|(Q'U2gV%sM%I&\$D>W |<єdv,A>E'UO%ZPi?Q3~~J< Ul$K>̛1||!QZ]%Y QQ/&I`$R$_Nԏ+֑, _Mtkj|=(o$DDHe=쒞,h ɷ%!N$$*ADH(ɢVz?DG~h.NK{dDGT%dDqG~ȏ5YJҏq#?ItqdDG~hȲ,Ϭ$AY!QY)Q$5f%?OedD?F~Ȫ2}խ$U^W(Ț^V6dDyEMtVdDUEO4Td+I0G5ԅƉl(Ȧl"[IjBlVlhȯ$EdDGDMTCdD#DOAd+I[c!;%s!$kҹ -ݭ$}= 35&{%Zw!XIdȾ*h`[ȁVjrP]!'JrHK!&*DsBK&p+ID'G$rd!G%rtBc%'&r\ ' rB '& rR '[I.)ʂh*i%Vrf g%rvs8/9'Q5s$9?q0@.HD{@.JDW@.xHK.M4D!@.O?J]?*qONk=JҍwrC⶝ܘ['7%n͉{srK▜j%Nܖ''mrg.e%ܝ&$nɽ;hr_ƙo%~qJ~-%K܍$Ԓ'=䏉;ͳ?%n0ɟ$W$n'_woGb➑Jҭ"y)qH1$L%nˉ?M{=-_Ύ#UqG^}#Kܵ>qFސG#oLܚ7%țd2qEJm7YdĽ6qKEKI7Pd}1qDfJ%7Gd=5q+tf2[̞!oI&nsw7퉛2G^#q Cޙs!Jܰw'S{'佉y| qA> Jh'/Ȝۊ3w#ĽX▁|<KN O$ 'S?L✟̓l<^&'y2o4̗8{'_H' $Ngd 9p1JLJl&α׬$.x'Ψ7'䛉gi3Y8qL8I&߱tnLI&΄'dyi{%[,sZNeɒ3XTĕEG;M%KsHljRY&q J~ϧ3Olℓ,8$?K^gd$Y1qyJRԑ8c$?O(UBjl8 $L|''J5'xdyY+q:GNőu'od9Y/qFO 'f'%&F0ql8"&εfS,ẙl8"[&ΣVӧgM׉%Ml85"%Έ!C8!;%vΉ]6d) -q&CvO=-d +qBN}$'&NE~3ă8 &N3A rp⤂8 &N!og%%NrD8+ G%NщsrL⩟x'%cOij99)$NNNd2yGSx䝉\',yw'Iޛ'y_ⓑ?9H>#L|Ƒ%>N>"s&>\&'hsgcOg ; B> L|:|*Y@>Xg<'|6%~437k+-?nk&Y0B|)/'V?ZKPbe#_XvN6jOQ+N7'fdት|{b%!ĺAX%w'քMdщOvL.&~sM=%KLVn,9;H#?u&ɏ'~SO&~/2[%?'No,7L~6ӻE*Ya'sdʼn͒&~6MV$OYeg?-%Nll6Aˉ'ɯ&NK֘\7Yskd'.:k%N97Fğb%Nl4J&+%Nwl6_|Ŀr$[N,l5}d[%'/l3Y8vBvoK^aoWe7 *;Ms'o%L$N;'Mw%O'{L${N&{M9'{O]$L}%N&M'Ol$L$N%M&O&L<'N'HIJL=M]N}O\c'׍ɵ%9~rIN\'ױɵ.9yr=LN\3S'ɵ79}r}NΘ\Ó3'ςϋϔϝϦϯϸ=@r>!jr/\=Hܓ$N[&6d쑒'~vNnJ^+ygܒ=[rO-{CrG2ɝ?%w%c/={rO2ɽ?d썓'~c'NWO3y${щX2'~/JH3Ho y*2;d<%N6l̘3dd%3',.%uɬ8KfKƹ_2{2$0yk2%2y{2*9q#g;q.+gɻq'g{qN/gqޛ|387N>8N:+GW8N>c83O>sdnޓO$|>vgɧqΟ|:wgq_̓;ɸwH>ɸHMG2_2A/$$?)ɸsI{dd$_JNd%_I=QP2&)Z2'*F2o&+V2Ȓq|;wmwq,;ɸKdd&Obd3&%.2Y<ɸLLƽgT2F&4Q2Xq8wOq,;ɸNMq\2%:Y> ɸNVL}wR2ēqo<w*ɸO~;dd'%?e2zdd4ɯ$k$=HLF!Y;CN2Zddzh*]$$H6ox$O@&hEM'$dd4'E2ڕdˉ} * LN:-Mކl&'nbsb}2ڞd1PS2:ddF.葒],%%kJvOF쑌>*3 UW2:ddX>赒}t%%JOF~,90YrP2:dj!ْCѼ%IFv.9<}]rD2dtzQh%$ LMF709>arB2dtIhC&$LNMFW29=}frF2dtYhAы&$)MMFw659?jrA2dtEhe&$M.MF\v7<}orE2J>:d荓k$'&[NKFۜ\9!tr?gurS2Zfzd4ɭ.tmhۓч'w$!OLFgܕ=ߠ^='M{rS{r_2~d4ɃuCh'$OM\@X2fǓ1_<d)$O%c!y:3ɘHMD\2f+1631ǑYɘIɘ+IٓɘOIɘsIYd$OLMR2n$c6'g2w%c'y9s@ɿ1+'D1s/sI+ɘ]J^32曒&c*y]2椒'c*yC2歒7&c&+yS2涒7'c+"_ɔɘKJY2u2f͒i1Ldd̵%'c-!qɌɘKfJƜ]2s2fY1̚dd%'c60yK2&c0y[2'cV1#;13sɻ1;;{17s1˙?1|0sɇ1[|8ɜɘQMJkd̺&M7d2fxO%c7t2f$c^8'3g1w|.1̛ddA'_HƬt22橓1s|1sɂɘNd%1ߝ|93W1',Yɘ7Oɘ[Oa%1۞|3ɷ1#,9ɘOc%1,ɘOdd ;$=bxAx2W,w$K&Rx7BC+'$?J;xWCd!YJO^dd;"Y.H~wP$[I"Y!HVL.Ndd7#y2ޭo$xGGj2㑬w}$L@ՓΐWVIHƻG5~dd$Y;9IIƻPud=+w$'+x7Ka2ߒlw$&$I6Md͒Ιdd&J5ɖxMU2ށl$Nƻtmdd'J=xOC2옌w%;%=BVJvI]΢dd(=>Jx?Rg2ޡ알,%{']L>x_So2엌>%[I*9 JL;d*9J}VɡxUd+9,JO#$t%G%]^xWrL2 %%bVKNH;ʒd,99CKNxgZrj2ޫw%'lx[rf2󖜕w%g[I/.9'KM{nd.JwɅx^rQ2ޕ\%${ɥVK.Kƻ˓~d02 LJƻ+w&&㽅uxar}2ܐw$&7ZIG1)ZLnN[d1Jݏx?drG2!ܙL&w%]x_erO2ik%d3?LH;6!+d3y$LM{Aǒq+&O$ɓV)MJƻLd5y6MMxj|2޿6hM~&/$]$!M&Jƻg?'_1R5Mf%jdl5{2ީ&HƻyZI7W'/'=ɿ?~~O8o29O'$kf{U&xrdo9yc2ɜ)mNޜw;'S$ɔxGt2U2#LwM'$}ɴxgu2]2kLw_'3$Ɍxv2S2޳̜wq'$}ɬxw2[2̞w'oIÓ&ےxWy2G2g#'Jƻ'ɜxG}2W2c|$O>'K;'x~d?d2|*O>H> HIw $M$Kw$O$&;=] >d+^dd|wC%+wHl%W$'"Y(%|57|J;)[I|oEd|Ed|E-+HVߵ|'Ǒ,Hk%$#YJA';D${FŬ$$YJJ%$$Y2{,FI~h%)ɏ$c%YJ{X'Z$\e$%$ZI|wL\2_&Y2&YJ{j$&YJn8ޜV߭b%;/=ɪd5+I~i%}@V*+Jִ~d-+0Jֶdd|Rn2/)YJ;$w)J⻙ MFdc+J6dS+J6KwN%'{-$*J$+:ߓ,c@ضm6ڸIIڦIڠA۶m۶m۶o{#W}=dd]ZNJqx'Wo2ޮdd^NJpxGXr{Ēw%'#KqxgYr{͒Ü$} -9"|Zr{֒$Ŗ$dnɱ{ߒ$ $'w%'&KNJU$>'w%:I/9-|w^rz2~ 'w%g:I/9I]~s$ $<'w &'L.HQ\$"'w&;I1$|gbri2^2'w/&;I1Iɕ{wA&W;I/2I❒ɵNLKM\ 2IɍNLnrxWfrs2>dɭNLnsxwgr=;w&w& MrxhrF{w&&-MsxirO$ޑ< G5y(|jXG$ٚ<$^dݯa'$!<$)'w&O'MIi<$9'w&;I?7y!|nb2%'w&/;I7yI❿ɫ{גw';I_8yIɛ{w'o;I8yIɻNMNK߭ 9IɇNqN>rxsq2>dɧNN>sxt/wX'_&Nrxvo$ީ| w;.|7w$$d]ē_$9$^7'w'C? 7OL߁ '=:|z2L2ddp{ۓw'#$OFL G>9||2J2>ddh{ѓE6OJH1_HJ쓱MIqex2~r5L3tc2Q 'u D&I4ddѻL&KTd}LlMJdHi6cƹL]!Ȍ\9{3dD@fMq%̖Ix93ٹ̕(ONfG$$Z2or_|:̟4>OCHdׁjsY8+pH :IA'9I '+,.ȒN_ݛ$d܁ۑemYI2x~7Z,$S㽃 ~ܕ3YI҃$d8Ie}c4Y%Q}U$ d5'I?tdu'ɮN2\5pYIR+B$O~$!$ 2ߐu= dP$9IzLLwWlhNȆd#'IWdc'I&.)9uIRB6u |Zl$]!'o &ɐm$W@$3d{'ɧW_|ZrBvtt@vr+$A?w2gO!u49Ijr.N8]-9v $y0I2<"3Q򐽒Ndd_'Is~$@9I(CtT$}%'!rHt=HuT Ü$7#;I%G&"rdxWrֈ$?qɌ";I N>$dQ9I 9IHNK.ؐNL'I9I20nGNOd$rXra|'I YD1E.r\$"8IFhN.MTU@˝$uV 'cѥɕN+rUejDEq4pk$:'I5^ܐlCFr?hrd>f'IM%9]!&*/rF ;Iɇ ɝ$ IU:I ro#% $)"8IB :I*Cɑ DcFq DuT=<$EG ':4DqɓNKSNFF򴓤V<,l^#9IzLLwW$邐(Ki&/;Ij+NN^MTṕmN8򆓤$) o%h;Nw$q$]} 9U*򡓤|$)!;IzC>IyOUI20@>w/$ DGJqIRGq['I.١+^}#?8IɏN @dc DH~q,_W'I I2pb !IHOJd? 0 l5.QDFHdĤ딽H"WgQ"56dDHFOFc#11>+{KIdd.x}N&HdODBL40H&I4&&_MhL(IK)]%2)9L(-ɺ]Ēi%6ya2]$'' |]̐3ɌI&3%M2sudDIfM?x'%N2{_]Γ̙,e+Q~_EIdd߁|:̟ߚ/Y ы)(Y(QMI4dQ'jbNdd.T,$*,$YIRDXLM%&G $ժdy' NUb#J$xIRJ~$<OɿQETdijec.&;%61w37DYWLvI<&:ndDLH<&{&JfW6ۙYLI<&:E~dDLH<'&hrP 99509$̜4n8&%Ý"surd&G%59&T:9.4&'$ϓ{rr&$S79-TE]79#񜟜7H79+䟜wJ79'q@M9?ч c o?rQ\wS $q@.۪G-<љ+DyNJD\ ׵".q[A{^ܐx"1Q7DNnIq[r'%n=~ֽ; Na+]rw'$JȽZܗ=!\AHܧ/y(qBN4ĝ y4Qݓ0q{U!O%njf L1t'E>5t-D>KR$ĽLR4@2tEN2o$]o ;3If~/򣙤 SFl&i'b&鎌ؒ Iz@Fp@M!hd&:qFIVawmdĶ>qd2Bb##%62ȉ:2JbG#%6[<2Fb#c%6;؉>2Nb׃#%?@2AbL$%6DĉC2IbgLC$%H[E2EbLg$S%6MԉG2MbL$%QI2Cb?̘$3%6V̉L2Kb̚$%Z[N2Gbυ̙$s%6_܉P2Ob̛%%cR@b_,?% %6h‰UHb,c%%l[WDb,%K%6q҉YLb7,%%FQ|!+&sJr↗.C~%$~Ȫ[`Zb&k$6ȚbVbW!qwTvb{M&&dĆY?qL6H wd8q+M6I%?%ɟJd5,D6Oe$_o&E⾛=DL܀;Pdĝ8Gb+3qKNIImd>qNإ";$Ɏ*S⶝ط"NܿI"5M"I'&nfnfs{|d>;E1tOMl{$$=#$zrܙ(fv!f>C[c03I=2ri&)"G%JrHD{@5}F3tOO죑$IĆ9LR@N6|BNI4 T3IWD@N7a&s g&6Yfʇo3I-9L#Wr^ I $z rerLCFrib\f&r\n&iώ\.ȕf6U\m&i\c&_MMl$R!' f>N$]9EL%x[$63I=G0ԁ;$=:!w%rD+B5@3T3I ȃB򐙤a3I;DsB5uHKT(q3I{ 3I] y2H2AN*g$Y3IۋDB7ZF^H-E3I%3I y9H^1W[53IU yL/F!oI o%򶙤+L򎙤ئ$IkJ򁙤C3IDC>6I>I49S3I[33Ia Q%v.';%jCsbߜ;$6E"dDHv5˛f&a<=N01=d/3Ido3IdDH5NKԏd3I3Iȁxr rpbGb&ZP3I[DEI7x(*ɑfǓ$Į=9LR{IMlߓ$՘x3Iq!9!g$%$'%Mrb&$&if@rzba&ǎi&iӟ(?fv9k&yf2@.0tD.L|cLRX@.6DSJ.5X\Lf*fSreUfJTru5fTr/ %jUrcܐWɍo0 7I*Z͉4 Ij\ɭfܖ^fܑ`ɝf e&a;3IɽoK I $I@%IZ'% [򰙤3Iķ.$U0'$uI3Iy*Q꒧$qg.yL/B򜙤<>򂙤򒙤O^6TW/yLRK^Ku3I/yLf%oIzON3IW]3I/y/Q$DK>4T$DK>1TO/LRK>7//L4*Q$23I/6Q$DK~HG3I/)Q$3Iȯf&bQ!/*Q/&Qa/.Q/!Q/)Q/%QQ/-Q/#Q1/+Q/'Qq//Q/ Q /(Q$QIQdL(~L(~TL(~4L(~tL(~ ̘(~LdDKfIdDKfKdDKHdDKJdDKIdDKKdDKHdDKJdDKIdDKKdDKHdDKJdDKIdDKKdDKVHdDKVJdDK~(~/Y%QU/Y-Q/Y#Q5/Y+Q?$>/Y'Qu/c%%_~%$_a%%_q%$_DK(~ɦl(~%Q&_DKHlrVl(~?/g%$_m%%_}%JdDKvLdDKvN/&N?f__3I_%I&&__Wdw3I/#Q=$dDK6}$dDK3T/9LRK4P(~fǓC/9LE,9LRKO3I/92Q$=&GI*~1k&%%_r◜`&)7$'&_r;rr%I8ȩf_rZ%I*~◜i&e&%g'_r◜(~yf_rjDK.4tB.Jb3IW3I/4Q$DK0t@4T/LRKIDK3/LAn4LnJf3I/%Q[$63Ia&%w&_rm&1'Q{$=})/Q$]$DK2T/yLRK5AKq3I/y"Q'$)3Iy:Qg$CM93IG?yLRK^HE3I/y)Q$3Iɫ◼f&%'_򆙤◼i&y+Q$=&$_򮙤KM򞙤◼(~f_a%I*~f~'|j&%%_򹙤|a&)#_&_򕙤DKI[3I/.Q$3Iȏd&骆(~/f_򫙤*DKd@dDKJdDKIdDKKd!1n/)Q/%QQ/-Q/#Q1/+Q/'Q(~x◌(~L(~DL(~$L(~dL(~L(~TL(~4L(~tL(~ ̘(~L̜(~,̚(~l̞(~̙(~\̝(~<̛(~|̟(~,(~B,(~",(~b,(~,(~R,(~2,(~r,(~ ◬(~J◬(~/}%$_j%%_z%k$_f%k%_DKN<* $_n%LdDKOdDK6LdDK6NdDK(~ɟ+ɦl(~%Q&_DKHl(~Vl(~?/g%$_m%%_}%JdDKvLdDKvN߉'QI*~$YdDKv5/LM0T=/LRKNd3I/LRKKd3I/9 Q$ 3I!b&494Q$]=$DK4T/9LRK1cGM83I/9>Q$D3I9)Q$AS/9LүXr◜(~f_rf%gI:fs/9LRKK|3I/L҃$ra%IB '_rI%I*~e\n&}5LR0JL*3I:Qk$Z3I .Q$%DKn4Wd&%7'_rܚ(~mf_rDK4t%FJn3I/LBro%IzHO3I@A3I/y(Q$DK5T$CO 3IG?y2qM2T$NDK5/yLaG^0T/yLRK^N3I/yLңmZ%I$o$_򦙤◼e&#=y;Qw$=%&_򞙤k<򾙤|(~ɇf_Q%'_򉙤DK>3˛|n&%_$_򥙤+zU%_I&ߘI*~ɷ|g&%'_򃙤h&)Q$]N_/Lҵkof_2Ĥ%C&_2T%C'_2L%&_2\%'_2B%#&_2R%#'_2J%&_2Z%'_2F%c&_2V%c'_2N%&_2^%'_2A%&_2Q%'_2I%&_2Y%'_2E%S&_2U%S'_2M%&_2]%'_2C%3&_2S%3'_2K%&_2[%'_2G%s&_2W%s'_2O%&_2_%'_@% &_P% '_H%&_X%'_D"#K&_T Y:Qe/Y6Q/Y>Q/Y1Q/Y9Q%y=} 0Y%Uu=&%`z)1Y# 5ύZr!$h:gdD]Li3Y/ϟlx"M6J4d3jIR&J<&NtdSsϱflxMh_Ϻ3"=?-V"l G&L<3'$im):.Qɿe5!hN~율ɿO=6o<_&$ؓ]6- 잨~[T^dDMI<'&o_.쟨r`'% bA &rrXN[rd3'G%щ &Ztr\n rbW''99QS7DNNKq;9#qALt=9;Q“s#497Ɠw%D-O.Hܞ <(qB.N 4ؓݹ="q CLtĽ :Qk75DOKݐ>m1;DOnI[?-qDnOl;B^=;)@I{]?M@H.}y8q@I@G;ĝy<@HR'{ Ľy:@IH.y.qEOl7]ľy)qE^Nl@W7bNy-qGF^OlI7fy+qFNlRw7kny/qFOl[oo$&/G8qb#|#&v4g;;ybk|#_&8W{=ub|#&v=w?}b $?&AOAsbC1$&vFo;D2db U$C%JЉ{F2Lbӄ y$%vOH2Bb$#%SȉJ2Jbc$%vX;M2Fb$c%\؉{O2Nb󅌛 %%vaQ2Ab;L-%%eĉS2IbLQ%%vj;V2EbˆLu%S%nԉ{X2MbL%%vsZ2Cb[̘%3%w̉\2Kb̚%%v|;_2Gb̙&s%܉{a2Ob3̛)&%vc@b{,M& %‰eHbÈ,q&%v;hD,Y2q+MJ%dĦY6qsMK.wd6Y1qMVJ7w' 8Y%EVM܉[Qd-9Y#'ELܛStvb['&dľY?qN6Hl` 7dN8qGO6Ili?%nɟ{[d=>,E6O쓿$v_wom/E=ELdF:Q$v?&5FM<$%~4+YFvHdĮ)g߉'FjdD@vM쬑 =FHT d^+9ndDfobh!m8r@ &A^ؘ#$ rhbh*ቭ:rD G&Qؼ#$J rlbh3JHF*$Q(O;DD>Ol/2JJtMf+&Q:oDDOl51K~JQĆ,%QL_;DCE|@lђ!U*WKNtVdĦ-6Q^dDEFHlu)KFNZd.5bd艦%c&*/2Vbϗ8_2n#%v6L&&j12Qb_L$ b2i(#%vƌL2&S&{dDFIl"ie.LOjdĶ21QdDFfIl4Y-LfO4od33Q{dDGIlFy/+MOsd4Y0QӑdD_GIlXEY,sMO4xd6Y2Q呥{dDGIljeY.MO|d67Y1QdDG~&Od8Y5[dD%HH쉓5 Y+9N( ډ]rN-$&!Y/oNOd:0Q$;dDH6Il?%E:41dDHm'MomwE~$O쿓-=$*ONyD3IIl͓m%.GOOt_zC$;&vNؾ'NԘ?}|DI'$Mkbgh8-~G${&^Γ'$OobhAo $Pr`A^rH %&ChJo G$*Srd{QrLD%&hSo' '$jUrb I~rJh%&Ӏh\o9 g$Wrf{Y&rN%&heoK $Yra" %>ߨ@.Iw,-< DKL|*咫@Iw5.> DKnL|)@nIvrk%%_r{%w$_rg%w%_rw%$_ro%%_r%$_`%%_p%$_h%%_x%O$_d%O%_t%$_l%%_|%/$_b%/%_r%$_j%%_z%o$_f%o%_v%$_n%%_~%$_a%%_q%$_i%%_y%_$_e%_%_u%$_m%%_}%?$_c%?%_s%$_k%%_2%C&_2T%C'_2L%&_2\%'_2B%#&_2R%#'_2J%&_2Z%'_2F%c&_2V%c'_2N%&_2^%'_2A%&_2Q%'_2I%&_2Y%'_2E%S&_2U%S'_2M%&_2]%'_2C%3&_2S%3'_2K%&_2[%'_2G%s&_2W%s'_2O%&_2_%'_@% &_P% '_H%&_X%'_D%K&_T%K'_L%&_\%'. ◬(~J◬(~/}%$_j%%_z%k$_f%k%_DKNdDKM䏉◬(~IOdDK6LdDK6NdDK(~ɟ/4Q/(~~(~(~A(~!(~a(~(~Q(~1(~q(~ ◜(~I◜(~)◜(~i◜(~◜(~Y◜(~9◜(~y◜(~\(~E\(~%\(~e\(~K re%W%_ru%$_rm%%_r}%7$_rc%7%_rs%$_rk%%_r{%w$_rg%w%_rw%$_ro%%_r%$_`%%_p%$_h%%_x%O$_d%O%_t%$_l%%_|%/$_b%/%_r%$_j%%_z%o$_f%o%_v%$_n%%_~%$_a%%_q%$_i%%_y%_$_e%_%_u%$_m}7.Q/!Q/)Q/%Q_/-Q!/2Q/:Qa/6Q/>Q/1Q/9QQ/5Q/=Q1/3Q/;Qq/7Q/?Q /0Q/8QI/4Q/Q/1Q/9QY/5Q/=Q9/3Q/;Qy/7Q/?Q/Y0Q{‰,(~ɢ,(~,(~ɒ,(~҉,(~ɲ,(~◬(~Ɋ◬(~ʉ.Q'_J%&_Z%'_F%k&_V%HdDKIdDK(~z◬(~l(~Fl(~&)Q?'_i%%_y%I䯉-Q-/{%[&_U%['_DK(~6l(~vl(~ɿ/!Q/)Q/w%I俉/Q]/5Q/==/3Q/;Q}/7Q/?Q/90Q/98QC/94Q/9QU/Y5Q/Y=Q5/Y3Q/C%k'_N%&_DKKdDK6HdDK6JdDK6IO9QM/,Q/K%Mol(~/2Q/:Q$_DKIdDKKdDK(~(~N(~ɿ/O%M(~ɮ(~(~ɞ(~މ(~ɾ(~(~Ɂ(~(~ɡ(~(~ɑ(~щ(~ɱ(~◜(~ɉ◜(~ɉ◜(~ɩ◜(~◜(~ə◜(~ى◜(~ɹ◜(~\(~Ʌ\(~ʼn\(~ɥ\(~\(~ɕ\(~Չ\(~ɵ\(~ܐ(~ɍܔ(~͉grK%&_r[%'_rG%w&_rW%w'_rO%&_r_%'_@%&_P y8QG/y4Q/yQ/y1Q/y9QW/y5Q/y=Q7/y3Q/y;Qw/y7Q/y?Q/0Q/8QO/4Q/Q/1Q/9Q_/5Q/bQ!/*Q/&Qa/.Q/!Q/)Q/%QQ/-Q/#Q1/+Q/'Qq//Q/ Q /(Q/$QI/,Q/"Q)/*q DNdDKMdDKOdDKfLdDKfNdDKfMdDKfOdDKLdDKNdDKMdDKOdDKLdDKNdDKMdDKOdDKLdDKNdDKMdDKOdDKVLdDKVNw>QU/Y5Q/Y=Q5/Y3Q/C%k'_N%&#?&dDKOdDK6LdDK6NdDK(~ɟ/4Q/<(~ɣ<(~<(~ɓ<(~Ӊ<(~ɳ<(~◼(~ɋ◼(~ˉ◼(~ɫ◼(~◼(~ɛ◼(~ۉ◼(~ɻ◼(~|(~ɇ|(~lj|(~ɧ|(~|(~ɗ|(~׉||@OMDKODK~LDK~NDK~MDKf@dDKJdDQ2L%&_2\%'_2B%#&_2R%#'_2J%&_2Z%'_2F%c&_2V%c'_2N%&_2^%'_2A%&_2Q%'_2I%&_2Y%'_2E%S&_2U%S'_2M%&_2]%'_2C%3&_2S%3'_2K%&_2[%'_2G%s&_2W%s'_2O%&_2_%'_@% &_P% '_H%&_X%'_D%K&_T%K'_L%&_\%'_B%+&_R%+'_DK~(~*◬(~j◬(~◬(~Z!Q/Y'Qu/c%%_~%$_a%%_q%$_DK(~ɦl(~%Q&_DKHl(~Vl(~?/g%$_m%%_}%JdDKvLdDKvN߉'Q&_DKvIdDKvKdDKHdDKJdDKIdDKKdDKHDKJDKIDKKDKH\#Q(~1(~q(~ ◜(~I◜(~)◜(~i>NNODKLDKNDKMDKODK.LDK.NDK.MDK.ODKLDKNDKMDKODKnLDKnNDKnMDKnODKLDKNDKMDKODKLDKNDKMDKODKLDKNDKMDKODK^LDK^NDK^MDK^ODKLDKNDKMDKODK>LDK>NDK>MDK>ODKLDKNDKMDKODK~LDK~NDK~MDKv@dDKJdDKIdDKKdDKFHdDKFJdDKFIdDKFKdDKHdDKJdDKIdDKKdDK&HdDK&JdDK&IdDK&KdDKHdDKJdDKIdDKKdDKfHdDKfJdDKfIdDKfK\i/#Q9/+Q/'Qy//Q/Y Q/Y(Q/Y$Q~,(~b,(~,(~R,(~2,(~r,(~ ◬(~J◬(~/}%$_j%%_z%k$_f%k%_DKNdDKM䏉◬(~l(~Ɇl(~Ɖl(~ɟ/s%&_Y%'_DK(~/"Q'_e%[%_u%H䟉l(~ɶl(~+Q/1Q/9Q'_DK(~/%Q]/-Q/#Q=/+Q/'Q}//Q/9 Q/9(Q/9$QC/9,Q/9"Q#/9*q DNDKMDKODKNLDKNNDKNMDKNODKLDKNDKMDKODK.LDK.NDK.MDK.ODKLDKNDKMDKODKnLDKnNDKnMDKnODKLDKNDKMDKODKLDKNDKMDKODKLDKNDKMDKO&/$_b%/%_r%$_j%%_z%o$_f%o%_v%$_n%%_~%$_a%%_q%$_i%%_y%_$_e%_%_u%$_m%%_}%?$_c%?%_s%$_k%%_2t%C&_2T%C'_2L%&_2\%'_2B%#&_2R%#'_2J%&_2Z%'_2F%c&_2V%c'_2N%&_2^%'_2A%&_2Q%'_2Iq4Q/Q/1Q/9QY/5Q/=Q9/3Q/;Qy/7Q/?Q/Y0Q/Y8QE/Y4Q/YQ/Y1Qu?WdzޣEFDZ$Bf&")RD (dJQV)"-s?՟q<|}o iHr7! In&Q ɍ߄4$&$7~4oB$f$7~rO ɍ߄4${In&E ɍ߄ $V$7~r_ ɍ߄$6$7~6oBMH@ Hr7!In&S ɍ߄t$.$7~5oBMH@ Hr3!=In&W ɍ߄$In&O ɍ߄ $~$7~?oBM@ Hr7!In&dH ɍ3 $a$7~2 $$7~3oBvM@ Hr7!Mg$7~7oBM@ oB2MH@%L$7~9oBMH@ Hr7!In&$G ɍ߄ $\$7~;%i. iz)sY{\y\ ii6撛&t^DW 뷠ecɈ&̐,dd'*$'$>!y yɇ& S_B )H69B|@5h =\@)HM~1e>c&+Дp ݛ"RR Tx 8Wbŧr ÿT dZHu[ZSJۯdޫ9&3/uH -hjPhjZhj64u܁ϝTXz`}4wr%kkƁTX4pI&hB] r/Q-蟖D">4ѴAM;'h:H.)<-9M@칣P!LI !Sargd Q !C F3"j|BFŃhF15K-H'y222 F3 Qcyh@3+x}Si^fN 5n߿D3Yq(gtBr="4g+nt.NLd߉.vd/Ϣy8@ԗ_7s8yhLk{Q $~V{IG)OӁO3<;?_wD ܽI̜Ww*?&/7KsOLҤII I& 8gL HȆ&{V $~6܁ħ<+ȯO~*,)s@raSM1^K~+)^IUji|$$z\O@SJ9'WZz b Jᵐʁ;[u 77?7\~-;d rȤ6@j:;(Y_F۩|;!u! i]hPsC44ƹ ir/[Ӷ@2V=dd[ӆ.g{*:HN +nh'QO>8ç?3j8y0dPь$&3gΣHh32h&AbNS҇iΏRc@8$ ,ySِ9yi䰀/$Y"/F}<%d"d)>/A2Tv >Xݯ@ yu& iZަeC.rmل>dt6Sϖ@sG|lE\@v@vBvAv=h>|F{! !C`n/9>_ӮoxFsQi~z $>k} jhNVDir/D#Wy~#DA_ (ϿMI.&VڴQ ӦVLh2SO4YNT=\; __#|Ļhs$W!4ASM@]8KiehJs9+ %! W*U: p4W3eU.xg+O 5ȘVBs-2T\ F47s3>!\ѹMM4ځ'uZVH|ڹr=|w FM@soSrM5HsȽ WKƽ qn-=3Y˝̬B=] Mwj'7~jNۗ#?dd d΃iP|AdFɜy58 с7Ю8g< LL!dp >S0i8?Bԣz tvzL?f'iB3u:\<|Ӵ4 g!p^L+Wg/@/RRvpϦɵԼ@VA^%kh^yΫѬ7ֲ#M;_\ב]zv o xl!ɵ 8فNzlݐ=O {yt?Ο}|Dk oXˇ9=ϱ@q[# 4ߣr- rr3ο@BA~<7~a/c_I~+J.洐tRە猐LdFR[-]͎OrJHK|RG'?>ҥӂSMa4EhASϥh.CSr9cq`)r]IU8FS竉* )OyH5\R r-2TaF]Ḡq!q#>7?nFS | Q5uQM-|jQM|@s'.>Owi6iH|hJwޛQ=D5Gs/MKH+CMrjs4tBә]JT7*lO@gn/4-Cӏ\i@r $'3P0y8T84cqx4L'yx2L $~/a5 #G!ѫq>f&OYh5Csj|͗o_9HCk(k8; 'hNB~$X3h~F {YuQ ϓ7|~ \ o?D?z5=M.}Oz4dd"*s~΂&+> ӧ9 $~"W@S\'o ]|&{UR \Je!W0%U*x習hE@j|2娹< @*ҮJkU* Ur@^)aoǪAS-hjMM4wڴ@_MfRRhB M#|3[cMƧHsȽjeE߾Z/g٭Ѵ $M@r{4H+::ҕꆦ;hzBzAzShl@Z1(k`|E3f8bD \07F}4 x@D4 5/@g9K,g1y.yR_bܗ/cYH|ZI=\^Uש Z&oYf Zm;Tͻ d߈=&z}|>`L?DfGԳ6rmgDwͧψڋfg?sQi!4_ӫu1=Bc$+]2?A{uY#S g~7A~\@\@eH5#3q $~͐=$=> ! 3" fHmW6|Cr@rBrArgHy'/5CMH@]>3`j.CS<{).#rR互޸/O@є sMҫn\JD]r ٯct|} s47\7Ӯj\[Ԁ:5&mD O4 {Cfo#|3M4 $~Vލz9܋O ZђH6: Lr#{{4tN˝t+.#ݓHH|ꃦ/3ӊ8 džFT8D=@hfcqy;Dj!4yvO]SaꙆ#D=1|CfЇYD= yg3\|G4kz~h $~YD̺ht >/@^,%r-C2>ˉZAJ^!jQy^}{7"VZfzz7az{;fއ|@~f3l!#4SV6\;Լg7{\b/O>$~ȗsr#hB8[# 'IzG|Ni|P̟_ӳhQϯ8߈h $>>C &)WLdLJ IH|6N12v2ɔ1u3+K *+lSgK}#\'WHAH!F0H Yň*ѹ,c,|%є\ zJ\zFSrOT`F]O@JheU&W@u*|=>7OMf4hEu-Dՠo%&>!u;cwzs}4 !΍iїM34ܜ^M@q@תE&>HkHrEM{h: ҙ.̖nh+Adtzӛ'̟>D~hC@32!t(QÈfd$|dfbGcK8O&!4LLfǞH|@⿦(1Vt ?N+fϝY<3)g3s5g<4<j^f!>fQ N.$QCc/y ˈzWZyѼϛhނy #6{;8 $~g|z4hFfS !>![#4CR64!lȵ;V|ZzBQ~?G>W8B5@uD $~=NԷw {DD#8'ԧq>g4ϒ3W|D h@'3/4oZ/?H_ǹdJդ͔+Qʀ&#> ɂOL'hrrQO@FH|ϗ)u "0QE(>) %~9+Д"\4>e\Mo $~CS>{f&="JRkT*:HU 7BnLTn![IT@3@mn $>YݎOs'Qu!^rҘ& {4Gs/sQ-Y;OӚ\mjE#:ct+Qi{z қ Gҏ? Y9A`|30vt<8?HG5X8xDCT822! (Ǩy:̍qLxͬ@/O@l*H|~<ꙏӐgYYHԳhcz<= zuKhy9'˩gE w%>мJ^#DM4oAVC֐}-oQzzFr&z}>`t>g3;![ymCOgQ;!ٍfO! 9Q_%%B5ٿ(c-М|O@='HS !g3_ϫgќcyN;;ȟ 翩ȿ dN͕6sjT:H@7 h2fNLh2ߗB=YONT̩.'\8'/Q2W~4p.H"0QEUbui s2|J.GsE ;ZI4-WҮwhr]e-娧<3k !kTT]ס ހύD݄fs55pMM4&ms;3rɬKzo.fxis#4 j7gfދO ZV8߇56jKT;ՁO't $>?wŧO]O>DcC@<h Hf9'ϣYB=/"d)>/ 2d9>+ +!P*_ B:#$-j4kp-!}]C6{h6Ѯ|χl7>B1>[ۈZwS$.n4{ B>#^4h~>' 4 __A|<+!0'#h2:';N^r! ?rAs=g*%|xWrw'ʿ d\/\%ɒ.KjYR+@TFre"*3QY ɎO49!Hʃ&ouM@g\4BS8K+B+CS\ s̖R互^ETiʐj4eєCSRzDU"׵ʁ\_8_ |##x>7Ou4S#V&ڐu;QwvEShbtՐFƐ&,iuwŹ{BK|ZAç5 Qm!Xt#3 +cڍ݉ so'#?}8@VpzB=CYX_ьd̓QсĿ3X*G52IhB3TF3 QF13:3ljI'B$)l|栙C3h, B|8Dih\ /CJ4@VA^y\o@$-4ѬADf>23[67eH> cV6rmG dQ;]hvCggh/$%=U w̱C߾ox&B#ߣr#N iv3DYf9|~XNA?!sd\ΗdMդɚI55Wңɀʒ5uflYSNvɁsNɍOHެ2>! ! ^RbYSK,S"xtttç;^7!/ϸ~h3(B3 @Үah<21}̓8B3z_9KWCQB rIԨ4Rgfl>!jF4ȕ,h?eKV9jN407KTXMA U"DES Rr)=r4W)IW?JL j4e|ˡ)L@=PsEU>Me4U:HU܀FVCSr Vz& $~64S'iuO=꣹ iiDh@RhQ=j^E [QnO޶hh:ӑz:҅\]tt'W4="W@Sh0܏]? `3h0B5t$Q Q̄h@ǑkoM!d|S!3 Ώhf8'yF322z4QϠYf!3Y4'Yh=/y1{)Ⱦ 2=WЬ^%5j~7!oAV㼆zB|rYFvl $>Ӿys _߂#DJmhC>ang'dQA)?#j/dQ| fԗ|99אo~8GGyZ#qzߒ;'{|~ I$?2zN9DBYZq+!;@'k/.M\A.ɞ?i˞\ + >Y'QىɉO.|rr7{G;mr O"͞:SUr9QW)IBs%*HirAs52A\kh*1:עO_GTUh 7C?܂JTM46|nN@ŹhbiHQOcinͽ8 $~n}~ކiKvj{Z!L=]O)]F=žhzAzSh@Mx g<P0N=# #y Q?f ƢGLLL<L)hB&jcG\f;J(b& y :@&"j5QkZm|ށ#]l $~}wS dfcV6v'}hvAvC)3zc/}|(@%hA!|f~C@.h 14OMߢ OQ'x"'N9h~>2 !'hA/?.ɑII#5*]Խ%}HtȈO@.ɞ%c= Mvr$>'$W;@n|M@]=?]*L?ASR R\|Y P j%R\I=Wчq.մ,*OT5DUT"Z4TAsk*m^ 7s3QT[VHMƴ> :;;qKT=꣹ XC4pn iiy74 $~vC̄{Ѵ WKri iøjO ꄦ3.n~qH~ړ+=7>ӗT8&ja8 j$@ Qh4ccqk<>yɌ4S!< G d:ddLgISg8 $>gg#8f >f}\BA,A!Kz 2d9dc+UW Ӯ7 oF̨ѼH\^O6H >@>![ QǐmlG hvمf7dQ ^>p?>C`t% OAsͱ@q@w` '!?Sh~"i~9K+ΡyH;c?i_<.o4}?4LmiHZH:Hddʙ?dAM6HvHHNjΕ3uΙ::yr $~#ˏOrB9SgKa4E^R\eD r4WSRD]IU\H|/O@7h*L]_נL@]2*_/cWEs=>7Q7 TWCnak@nŹ&kM܎ םh2[ꑫ>>wi(7D([Ac4Mwhf674^H Zc܇OkH-QՁz:B:.hnhzQaofO_zQ!p dd05A3\ g4kCX8|C&@&Dx:Lg O̖ih $(cNo̠3'g'߉B3s>\i7೐^} N;T$[ zR|^,e*\YJ+UW!Qhޠ7!oAVv oCwCn̨lb&f‡Լ- ?[lC؉.nO|FhQ~hd A!ZqVAsr r\ߢ D9IԏhN1?uA3οs.ޯ8 ~'FO h$Wj4RBJI&$#QdF5Wjf'{ T49O_ȕ;WZΓ+uf%*C UM!HaH|))θ_eMI4«ДƧL ;d/H?+ME4r ע OUiDr}x3s QBjU Mm* oǧ>ws'3.z_n.r54$57& )QwCA4^4-荖hZAjG:OHW|rOO|z~>qf > f(< 2hF=@ԃQT81Dg< DMBdr |=fgG<ʌzz@8L4O3 ͓<=B3;d>\V<}>QO.@,d΋y/E4K!/ 2d9d_AU413o&5f5d d-ަ!j߅'jhޣ76~ |H.͖@ڏ@϶@vr}|v}d7Ozهf?|9@_ DB5>ߠ9Lo(>x[w:{4?/$׏Tx М Q?C~,s8Jyo8AoI_5Y?j$wj=ir͝.wj=dȝڮ8g"*3$ QYɞdATNr+7Qyp΋&_ +? ROܩ\"SG(>w\H$ M +^M)ȕD]42h%<#XQX% $>VƧJ~?:4UU>$ zjYw#fz:QPa r݊OMH-|j#݆vH;HVRM}]h 4 $>5ǚ)>w?hiA8>|Zis[ڡiO4DTgHHWi74i{ Eͽ!ՇKT?H@r B3C '4# 5 2:K4cqhƳN'H|~DKb7Bf,Q|L'jqfB jI $79DeG|v<Î\ y"4\ A$rȺXH*ߗZyԳ d_EuɸEjְ6=..>[6u >͇͐- k+mkQ;nvMA)h~jd?K4_Ac|7h9Qum whN0ߣ!L{z~d}'i|99497fh rgh!uI9&Oj˓;m<3I]pΜ'u-gA5OFT#OjsBrFs?>hB1:pk f=6Ͱ@p4#p$Z > f,dQ!牁I̖ T*|8> #GAf1[d"l|fc1D-< YY yG _R|^b.#efrr`W *ykh^ 4oR[Dg-6QͻDml$=ل}f?́-Glٽ vZ dwBv=h>>#j/Q u͗8E@Oغ 9D}0149|K+~Q?9#S?9Mҟi/#W4!1^?//?EzIzMI7u&G!ٝM@eΛcYʊ&DD |D ` >VySgB4E󦮋br@\>M]WS2Q ͕ODAs5hʡ)@K+B*A%{erU\hn r35WPO IT-4܆vjȝ8ŧm Ҁ\ ! Ļ{i:-дZN $>ɴ&{H[H;H{HHGZщLTՍ^~4} }O@faD g j$|f]A32>D&Qi4S<4#D=14̠fD ip> y h@B34QϠYf!g,,O.!΋ȵ,er-+V*м Z&QoUy:%j=db#Mhއ|@Ln!#4J۷k;wŎ=?Ugdk_ 7h>|AWDkCaur -Qߑh~4 ?Y9jz[ {D'\$~;?/?z|$ $m ӡIɔ/3 ɆOv49 9ʅ&7$$/$$?Zz K-)H]bRgTq|. $~]/u${95_/ufR\t\W?=KSv]H|F*KT9rϗr+?@*B*A%We4U UV\!7An&{5uK >2[jS Mm41ʷ3uOwЊ;u^ >H7@Ҕ Fӌ޸Ms4܂VD݇56hڢiiMG; sW|MHO{ җzfAD f A37 pV<σQѐ18gc:2pf hLc}zg:; 4SL@3 ')4q\<|C<YBy6<s8?4/c/B%2^FWyU^C:ߤg5b עywOм( Dh>@!d3Q[荏V|hv C=h1y 9LO¯ Q:BQA;N?u2mG|Nq Ӂ_ΐg/hΒ_!78O\ \?.ɟ&&-$]T SgTF|2Ɍ&KْO ٩'GM.sɃ&/5 Q"SCSTù:#x >5 8עhnNT4wRz>4@M#7& =r7>G݃ss`m{}Tؚm mvjs'4tAҍhz@zBz?qCet?,:zf0d{PZ1 2y(41DC3\y2x 23GIOfd.3z|B%jsD=H%H">K>x:fy ZI=Ы^%k^GO7-fj58m4@.h6yMQ!S#r}Sf+ٷ'lOفf'`5&jS*ven#~? |+BъQ>Q4d6^wsQ'ќBΧ!g ?C~#xbF=So>\|13SP@-ҩXJ, $R6L,b-<yV,A"h^bter|VY4м y!o7yQ^Sx kwм>7@6ҊpDާ]!Λɾ }+mhC>!jd'5hpK}-y 4x +ur!hңhA-CsМ $#ΧXBs:'gL_МEs+QFNh $>ߐ/ct.)IS0uI&] 37}O LDe.ڮ,Oԓ 䢞h@BQa~Hrħ0m/ )FTqzR*`,rF $ޱKs%*HiZQ>e*GTyH5TJkO+Ns} ~c o"́\tM@.F ~+$m6F4wM]#>QwiOC|#|i)=7ٛN9cq/%Zu֐6D%W;4逦#> 邦+nꎦhO{<\t˞Џ C@BAC@ҊahCF5@3(zc4ư2:&R$CL)30yͣhC32!3!O@f$)lp.桙lygYZY"r-$ٟgf.A3E4K9D˨ezl9+Y*^%kh^󛐷g5d Qk6QP:4YfF4Im-ɵDml'w.n@>|^>^'/|A4| h0G!Lj:w=N O.~t |<!YvsT+hy'uhA/B$ $-$]ْPj= jF|2?3J9K HMr夞\R{n4y κE;*)LT4E!h.\FT _N`I4 W|Keu5,1S!xW +2*Z*C@h' !7s3\ՉM@V $ލk 췣ȝDESM}4wc v$?nܢώ28 2ƧY OA<3ZiiMmдŧ=Q 錦 ndIT/?i|?cD!ho #p4#G2: >g4d c!5 h&B&13Ty{#<Et j~?g/{>|S|{~ u\_ !Q48K}GO=>?oD#35DahΑW<>;ȟ Dzz#y#MTФ$~e@1Y)zNlSەpx堞S{>89/|\\*0E))ϥ\FKKN|\M@/՜Ds%ٯBSzr]e^MyH5Sh*Z4!U U!uo$&Zqs2UOB Ͻq%xǮA=?kS RQ  Nꢩ Ҁ !j j@gwsz@C 4-O %W;ff{:҉ΐ.d N{ܓzzAzu?>j_s?>؍3(,1!<0pF@FA(|FCK2OO D$43\ST0bQQ!3y2 gٟ YV"Fp15?GKyR4/}Q/CWЬB*5y}Z<+ߡu̖wѬl F4ъMif@>"8oyOpށf' $~/4-3Ҋ}h)/Ю/+rdk4ߠ9LGucq|E8O '!?s?u3r\y4?ȟDO_\R$i-iѤ $~/H_$9d*2ImW@wh=;$GY$uLsMH^H>Zz 0RO14!RehJ^KQᕁ'p.H!hcH|һW $ޟ+Ѯk!:V!uDUEs=1m9T-sR R췐FѩV45 pL ٣P8I%Qz@Ո\4)MT34gn܋E ݖDbWv$>涴=:B:Ѯΐ.DuE ҃ {|M_`7M @3Q ! e ]ߛFk$sr=(4qX}>! ! Qd4Sg*ay\y D@8}8B$)g잃\2h|?3'?XH|Y_u!kz3 f),C2,V೒~~Uh^ $>}N77DΫѬAM;u[Hl=zu|f3-[i6jNOhى.4!{ ҊȾ}hhWA~(d5ooGGxvG- |@IȏS u3uz6t^5+yrFQMӜ^jnsK4 MH[AC:@:B:A:C@Ra7Hwz鉦ެl|1߭3zAC35DD=@ԃQg #jCހ[Ր5d_mrJY]ϫy'Z!d3d >[hvمf7dSj ه~s*/k|&Q*<8>2{# DߓVI4?| Fs9K9ȯd?oD9'>q@5ϿovQ%RKI IIP,5WFH&g.?YpΊO6Hvs\R{>7wUzD'.4 444Ƨ \tf{͙QiOKVJ+4m|ۢi=ʎh:;3]hEWH7Cz@zBzM_ZbQqD`r g{pF0[F@lf BQx|&ЇL5)hyihA(1Cf83s&QO5~~Q!s5|\ u q~"|§hisc4MpnnH34'^ՂDBshڠi(C>YLTHW鎦cړ^hz҇\}C22Ah.: @4#8\BPA] 1K,c_1+@Y VZc_ Aj̧!&Fg+l?AvB.Pvc1!#(Tcq9}} z?->1gA9y\(H 1 ux ynAp@] }H~z 3,(ρ!8?OՋ%/C~ k߀-6ļʻ=yh!hb>Ž925|}} #1? ( O(oT/{x_AI=%!J=Dew8{u2'V &9Ĥ%邿'xN 1i sW:ȓ^fEqߤ y@9s@VAJ^pbCL\b R"(,KJBL)QܝKi)#{,Ĕ(*Rb*Aʐ rUJu\bA5!(aSWS(nmyCLi A_͡U PZyn1!si y?!OP:BNWgyBL7QHwCw 1`tz2[z}]?sP@AC_CPPQ!h5FyČ\Gch (xb+5oA!P~V?<UW7O zb#b9•xWg,"Gx_*!dN1QJ1Id$>) O`*p:GbBL$ŽÐ}?q0 09BcV'@9 Gz bNÑBsV@}]<`*\u +&܂sxZ݁hGc 0(7?Vσ(OϋKeQo1 uQ7n~? ySdowା ރއV!2 >Vµ/ ϗW(KB_=#,_Dq/W8@p' b@Zr%~V r{D3 JBȜ(+qQNUK1szO RALjIg#-JJzP2g2,9+(@yr@LNb΃y!s>Q6]3VH)W()UbJ(ʀòSbʃR1@3T# RԀh?5EQALmQuo+z ŝ7T4j~zԕ敉:4(-Ai~ZCL8bCLP:BNp6:C.n+h ~zA y~vj?AC < f0x1CACPFB_@ ƀ2qgb>Pٞcρ>VC| Wkb1!O,{";W*V .JfOQܚ[&Ž7~+W$( AIy@I '|?/{?| J;b@P8a3 c1 j (c81ʝ&N)3b٘ 3bf2k(k.͇B"ȳ.e)2ȼ? jY1kAYzP6@p\@ gc V}m?;g 1{ ^ js#3v br: 1iP@sbC@.y ⮬Bk0\<n@MPnA_!(wAGz2?!G1zb@̋P!_V/ü yUw%ļg Pބ߂!]yp??!'PI>>Ž9|sܗ+5(@ow{1?3(+(;('8 ?/+@''9ZEBLBIUbQJb~#(YqO.KJ~R SA{PBt%J&hb@LVCL 1`sCy &/(Dq{Qܻ"O<ᵥ0Zb+d. yJALiSbBL9\ZU(AxUVEqwv5 &Zw^3H-S[w]b-4< AiJcbBL3PCp[ VkFw-򴃳b:⮚:ubw?]ػBn'( soZ(!PBAg0(Cj yAh5Q31XJ;L&AɠLS!4h5Ze&( lυyg>ZUk!Y+Őy _K!2QrY1+!fVk!fZmZ&h-lV|5 KѾ<_ (B@Zʏ'_կ/Qߐ^<`dF["2'% Z%${RIyCL PRBT4*-Ĥw<2@LFL9(n+ dl=o8Q9ONPr;o8uy0@ @LA)1!(CL 8c%!(n, ˈʊr{ydJ%hU*TTj J EM1:Ъ.>dn1 AiCLP 4(60mU;jP:B_@ 2w;\)=sOQܻX (J GYo 8 VC!f eh}1ZeÉ3 )@T3 tL8g2y(YǾZ-%g)2ȳ Y kU5g-\; zhb6 Zmg(ANPvA_{>PC_ 0~8d>1'!(A9yB9Qܕy8n\W~W3Pw0b2 1`tCPF2 e  88!fLI3)L36 2OV3@ > ̆9g.( |ȳ\ `1,@2Qr2e(AYZ8? f=(F1!f VyNPvAݢw@潢!u!8(G1PC9 @YsZV^V@ s5Qܽu &(@huWw~܇VY}c ,zb#}b@_/‘1/W_̯y]w?ļ [p6]8A CP>c | g.>/Dqw_Co`|@Z1?_կ'd b@'?1')NC3s291s @\!G| ?S8`?V_`-57{o!;=(?#O3(@B w _ y_(+NB}%}E+BDG9 b1IAIJrPRTp\!& I ALz3 ZeJV=d¯{`nGw$䇾  B_@) GZ2? 8d.KBL)PJRpˁi+@se%8ʢ*Sz1Aa (5AkCL J=Qy>iXm yubAB YEo 1`[6޶xny:@tq,.+1AJO >V e P7b޳~⮚AG22b@Lt8p̄g\fC_s@ yA|P@,ŽbZy+ JVAjS@ZHz @FMk oZV;A<{ f/>ȼAa3dZ}ʧpAA| 1_A | |1?@̏p} 1A0x[w7z $%`8Q$%QU0aGb 䠤ŭl)qM? P#~GOGfRbr>FlL$ $w@Jߩ D:ZDwE߳DOq703܈Hl#)7]q{OF9 FL(# GO(G:=I?OϪ 6ŋ;G@Ts'_lh |-GK%Ѣ|>Z-GKRh|>Z-GKe2h|>Z-GriƋ;qԏ8oDdqB8!*sBDqO^ Cj>k b']*={;$"~8%a8UPռ_?a΢Ά=&-x 7Hr70JIia=sU:xHw׃t ^|W834 ,Ax9=$Uęd Yv/?$:sTZdJ ^ g#1aˮl$؈,g#t1H`f#g#mN!A6۝.{a6l$l$6 !A6|Qa6l$l$6 f6p6"_>OFFaNFFmD:F~FوlDچ[7"h݈0و6 {6f6"8Ʒg#2Ć7(jEڈ4و6 nDҺif#)lh.H3HaCpF$e#F$g#Qt~ןճc#4'6&f6r6 چ1[FOiV6r6 چFBFB3 9 mc#`l$4H򧃊HF"Z7HH$lhޜ)d#ϡ +8 m]o$Df6q6 چ[7Q6Hو6v-zوRu#֍(3Q(aC)C6l<mXوlD چFe#Fg#J6\6(Qf68wF.ZĊĔf6s6 چ7<6l$l$6 !WEٰX6\6S6HH"ld휫$$$f6p6چMBעIl$l$6 w7HH"lh.I(Il$l$6ڥ(~j뷞j7HH*lhnHJFR3I9I me#)e#†ER6HH&lO?l$Sl$l$3L6ܺ֍df6q6 چHFl$l$6 n$l$3\xs/ʳ\)霒FrFraC֢C6䣤f}oV ae#9g#mu#9l$l$6 n$l$7BHlPll0B69cF'Q?̆†֍n0B6)()ll67R~HHIHif#%g#mu#%)ll6 f6Rr6R چFJFJ3)9kk/g#ZoTf6Rq6R چ{+F*F*aCpHEHef#g#mxll06RHH-l\0]{6R+6RS6RHH-lhZ45]6Z6\6RS6RHH-lhnHMHmf#5g#{OȳFFFaCpFZ7ҘHH#lh4W3i8i me# e#4Fcf}Hiz#†֍n5V6}JZOIkf#-g#mf6r6 #]<THGF:38 me#e#tt†)蜒F:F:aCp(ll6dԧ껞zl6~޵FzFzaCptNIof#=g#mu#=ll6 WzFz39e۞ ndu# †֍ nd0A6F`f#g#mldld0Q4MFP"g#sFF39 m<%#<%†)霒FFFFaCpHhf##g#=ѳ[ȤK)KF&F&aCpF&Z72$lh)ldld6 wF&Ffacs퇏S/e6>lf#3g#mD:S[faojlf#3g#msJf:d6Y6=lfFf3>E؈^X,tLD"#Ο>ֈ,fsu3IYheb,u3IYg1y^ʘs^o=UF̮AV}m[Gt r{mAV^ چ;WdDd5׃Bփf6r6 cg#d!ll†Mѽi638ل m]cfklf6q6 چFff#g#a'5wf6ŵFvFvaC>_}j#whV6s6 چFvFv39م me#;e#윍ݷΙg#9haf#g#mu#9ll6 wNAf6rp6rچ{/<e#F|yųS}N3>'if#'g#mll4S6ܺ֍f6rr6r چFNFN39x5P'пN 0$eoWH k%rhy|>Z>-VG+ hE|>Z1VG+飕Jhe|>Z9VGU*hU|>Z5VGӂS.q5&v8Prʥ\teqx%5Npk\.Zrk\.^rI6/rk\.^rI6ָ\[(I WYȳ;n%7(ll6HeFnFnaCpMmf#7g#mܔf6rs6grm3O6\6Q6'lhnȧꆶae#g#mu#e#|w<՜_)f6s6 چ={چ†7ae#?g#mFgF~FacodFFF38 m]oP mFFaCpFZ7 (( lhn(@(`fgޖ{lT덂tQFAFAaCpFAZ7 (((lh.)ll6 nl4QQHgl }B†ߠ2QQH6F!(dfgmp {چBB†d#dz(dfgѡy6 +6 S6 ((,lh.)ll6 wQ7 ((,lhRQFaFac^((B(bfgmll1QQD69S(("lhe"/eFQ-JעEll6 w-ZE((*lhFQ3E9E mý/ZQFQF1a#iBӖ\lSll3QQL6\6Q6((&lhR)ll6 wN)F(ffg!o8(}((.lhR)ll6 wN)Nf6s6 چFqFq39%ٱw=(F Z7J((!lhn(AF 3%8% mݧf6Jp6JچF F 3%8%)uƳQREKҵhI3%9% me$e†֍n4QQR6\6JR6J((%leNy6JgJg\ll6 RmF)F)aCبd{b(q +8 mݧl2QQZبpF'=z4]o6QQZ6ܺQ֍f6Js6J چ[7JӺQFiFiaCp))ll6dsܳQc㽞r6O u6ʘ((#lh $$1QQF6}JO)cf gmEP6ʘ(F!޳uC^B֕"џD5Q֟:yl]YZ#ʚ9(ρy"ȫ+KWeͣ_Γ8G+KǼyzPN>_-ofZmVGh }F>ZcGk5Zh-}V>ZkGk磵:h}N>ZgGuab] p^N1k\8míq1Řk\ q1R o ָ^Y#4̆#5NpT1Řknl6~\zLjI翚f6jr6j چ;$5ll6 f6jr6j چ6I٨if&gQ| glRZt]F-F-aCp?3E?3efgmZt]F-F-aCp٨E٨efg18=UݨMFm39 mýSދmf6gm3jl8>U ae6gmsJmFm39ulQu`ucfgm:tQFFaCF퐍 Fy*̆::†QQFF]a{.[٨F]Z7٨٨+lh.u)ull6 n !_?2̆†~g.ezF ̳QO7F=38 meezz†Ս:!A6 >:̆zz†7Q6٨٨/l RF}u>[F}F}aCpOof>gmlԧl7QQ_6)ll46aس@) FFaCpր~G†*d#Ȇ @0V6p6چ[7P6hh(l< ?"FCl]{†F 64ѐP6=B6_,̆†ER6hh$lh~|MFn4uFF†a=l#38 mC3d#uO0V6q6 چ[7Q6hh,l4z656>x?GƜ†l$6l4l46 acGϐ (ua6l4l46 Ɣf6|ȫluMhhb&?^u>cٺ&W_ֹ&x'reٺ&2b=s7}$NOkBǼy̛zTF弍&k~i:FS7 oJ75sД׃ݷh$zla6D4m)efzՙfjьVff6q6 چF3F338̈́ m>s3}ff6q6 چF3F338ͅʯZngyh- vzh}|>Z?6G hC|>0m6G飍Fhc|>8m6GM&hS|>4mzCj\#:.jA׃׸R wmԃzk\^zH6usnaq=x!5NpF=ڨFOachlT_O:4ѓS6\6zR6z)lhד=ll6B6~^=blR+~7^^†ыF/F/aCpEefgmbzQ6z-l|ݳ[{vo39 me7eޜ†ћFoFoaCpMmf7gwl ==GE{2Qg>>†v3}8} m]o>f6p6چC}lg#W_a# l]_k&?^uٺtoA_9G^#l]_V?^I$ uƼyzO|۫/Tgd[GyzOF_pA?Z9A?@pfA?!Bpט\F?Fa㥢}3_?FFaCpOof?gmtFFaChE+s +9T?Zcz?4@f6p6چ38 m]G f6p6چF +Tٰ11Ph,Ki (lh.)l l 6 ݥ*c†?9eA Il Rl l 211H6ܽ 7dfcgcmAt1 aCp{61 `aVC=ڴl Vl l 611X6\6S6,lh.)l l 6 w-:1`aS8³1DBi 111D69eS"lhzc]o 111D6<6l>Z۰11Tب=C>e(ݧ 511T6ܺ1֍f6r6 چPP3C9C mc@FmX&lk|gcbcecaa†֍an 311L63gffcgcmxl &hm0paomNnfc8gcmuc8l l 6 n ucᜍ†᱑+d=چᜍ7_)#zc†Ὗc{3#8# m]kf6Fp6Fچ;s3#8#"UV=1R11HHaCۈT6411R69e$SF)lhZt$]411J跠w׷y6F9eSF%lhzc]o211J69eSF%lh}Q(38R]hhh39 m#R`mfc4gcmsh:611Z6!A6˟a6ll6䗥j{6(6P6Ƙ#lhZt ]111F6ܺ1֍1f6p6چѣGFyebd0V6p6 G懚j17ƚ+lhZkF~=z0V6r6 چXX3c9c më=B6lqF4lSll311N6ܺ1֍qf6q6 چ;s838 mC؈id㹢7f aecgc2e`xy'wd +S8S m}3S8S_? '6g3ISlLlL6 nt`~O0V6r6 چ={SlLlL6 nLlL51՟1Ӽgzg43: Ոifsu9jgYcyy54O`wЛI`$M7t^k\1r0t^ چtt3y=.Dhn=N٘nfc?{M/0wqy?Lm6Gh}>BmG[-іh}>JmG[㣭h} >FmGmѶhޗR?rJz uov7;\f7Cjָ0׸͐m{t֛aq3x!5Npjq35NP6f fY33ll6 Lze†ᮇgL3393 m+ͤl411K3d¤<}Yte<,,aCp7{Vn,38 mLgLgYY†11,laۥlVl̦l611[6\6fS6f٘٘-lh2)ll6 w<1lacSTm {6 111G6ޘcfcgcms:111G6\6P6٘٘+l\г1WՍn511W6 w511W69e.S٘٘+lhZt.ecyFWod,ؘ٘G٘gfcgcmucll6 ^gcmļl711_6|ޘofc>gcmuc>ecš=>~>gcbcec†a=3 8 m]o,f6p6چX@X`fcgcqgys{6{_ 齯f6r6 چ[7ҺBBaCpBZ7XX(lh. ) l,l,>{'~E9=TXD"38O EEf6q6y*.(l,l,> T6\6Q6XX,lT/ҦO{6+6S6XX,lh)l,l,6 Ŕf6s6 چXLXlfc1gcW;gcbc ec%%†֍%n,1D6=]bfc gcml,l,1T8sܵY<KK)Kl,l,6 f6r6 چ]JעKl,l,6 f6r6 e^gcbcecee†lgrXX&lh.(l,l,6 9eef6q6 łoZX)>e圍†~~rraCpzc圍†~ֶr ac/FMXXAXafcgcmuc+ll6 nuc†Ჱ Jacw+iy6V9e%SVXX)lh>e%ݧ4R6߮]ifc%gcm덕f6Vr6V 6_~X*U7VѺ**aCۈT6RV6Vq6V چ[7VѺ**aCp**38Ry6V֍f6Vs6V چOYM)ll6 waWXX-lhnXMXmfc5gc>ipJƚw6/ZK'p55†>˿&_cfc gcmk5t-aCp3k8kUZlUuc-kll6 w7֚XX+lh.k)kll6 nl5NxvwKXum ~M:38 mc[F- ٰN6 B6|K0V6q6 چ::3>-F?[Vf"u_3>[Xo`?^牜#zn=]m7z:Ot*lz:c׃ 2򏍿)CoChՃ 2իz<x= mngm79@p t`&bm|uec ƬгQM7ҽF39 mF=Ѝf66r66 چHllll6 f66r66 nd,:ҳI~7l6VOL&38 mýllll6 MMf66q66 چDdfcgc{Oج-`l6Y6}f66s66 چ;lsf39 mí)llll6/-jo6"lht ݛn1E6[ t--†ᲱVacox6*6R6*lh.[)lll6 wNJ甭f6r6 چVV3[9ۄtzo66638ۄ mÝS9emm†Ჱ66aCp(llll6>oP{6}vOnfc;gcmuc;llll6 f6s6 چ{/|;eclZaoocGGh{}}>~퀏vG;юhG}c>q턏vG;壝hg}s>y킏vG]ѮhW}k>0-x9o+]N;ԞjS0׸mbv{1;5nq;i;5nq;iyq;5NP6v ݳS;NNaCpF;h†wN3;9; m}&w'ec]ƖTͳKguWgu]]†ᮍvѵ.38 mo]f6vq6v چ[7vQ6v-l63x/ٳ[)露nnaCpnZ7v-lhnMn39 mec7ecݜ=FO=jNC=f6p6چ3{8{ m]o=f6p6چ3{8{ ={UK^3{9{ mÝS9e†Ჱ^^aCpKkfc/gcxȧ޳OݧG3O6`>>aCpGgfcgcmk}}f6q6 .]X;~~~39 mx?x†Ჱ~~aCpl7q@HxQx69S88 lh38 mݧf6p6چ{e〙Ft'8bë_5]788(lhuull6 wrS88(lhn8H8hf g㐰!oҳqH)r!!aCp)>吙CC†qq!!aCp!!38s?҄=Oߟ:lf0g㰰mtqaaaCp8L8lf0g㰰mu0e㰙Ü#5򧞍#nu㈙##†qqaCp8B8bfg㈰mll1qqT(bo?l Qa[qQQaCpGz㨙†S}Q3G9G me(e㨙cƠwF.Zg㘺/z=ffg㘰mctr11aCp8F8ffg㘰mccf6q6 q<Ć,qal7qq\6"qao+}qqaCp8N8nf8g㸰mFgqq6y˥;AW'D'} ?䵄7gNG$'e o%d#ȁ߫N98I@piN8I!Bp?'9I8if$g㔰1x6N)ZN88%lh}SF2qqJ6)Z-N88%lhe㔙Sھ zw}˳q:T7iac Oll6 ll6 nu㴙Ӝ†1OS6N88#l<lQ:`:cf g㌰m3tqaCp8C8cf g㌰ms3g8gdg㬚S9嬙†7Y3g9g mÝS9嬙†֍f6r6 ~ճqNqq99aCpz㜙ss†qq99aCp;G8gfg㼰1g3{ٳq^qqyyaCp8O8of:ݧ\7qq]6ܵunf:g㺰msuu3&0~Xxnh|>vG=h|>3>ڳ>s>> >E%eU5u M-m&Vj*=r 䪎̶L uUǚk\,qR wmKFk\8mýKĚk\,qR kqqCxH=m]7]7ll6 wmtnٸٸ!lhw7ll6  3787 qk<7ս^M3797 me&e㦙†֍n4qqS6ܺqqM-aUí3 lR{[tOu--aCp[tNefg㖰mlܢl2qqK6--38͎lVgroٸٸ-lh.)ll6 ۔f6ns6n چ[7nS6nٸٸ#l7ly69Sٸٸ#lhg?wg?wll6 wq7ٸٸ#lhze㎙;Fd]lUu.wll6He#!ae.g㮰mܥ5qqW6\6R6ٸٸ'lԜ =}{>=38 mýOwާgfg㞰mull6 ;j(ll6wl=CkQ of>g㾰m߉O}}aCpٸOٸof>g㾰mf6|l]{u*すDxGyu~x'r:ztyy@w1`<1iHy=T{Zͣ׃2چ[zC^ چxHD<m눇f6r6 .Lg㑺o޷xdfg㑰mGt##aCpxDxdfg㑰ml\6.m\6.tEq6.bɆEX7.m\6. ۸m\T۸m\$2S.B6.bFCom01.9S.m\6. ۸m\R۸m\"27.~%lِ1K%Ke1gߠMˢn\uel2ِ1~eyYm2qlehel2ِ1eq~όu&a qEm ql߸+jW+dCs8\Q۸m\!2 qEm ql$Ƚmѫ5&Ua*qUm*qlUhUl*ِ1UU!cqڸq۸F6 j㚰q ڸq ۸F6d >\s5k5!c55q ۸F6d 5h5l:{+M{jױdCu:6cɆCCq۸N6d n:q]m:qlM \)c?qCmql|rSnm6n 7`/zCmql|qCmql|nfqS)7rSm&ql|N 甛j7dCsM8T۸m$27j7@Qlǩ<8<@@l#lF m ׍@X76@!c^4T6n~R-61n=[p-lِ1[-[-!cq ֍[jCs-h-l6Z MbN jdC6nC6ncɆװml6ِ1omj;d#q|X܁;jw;dC6@w6`wȆ;pNq۸C6d ^7@w6`wFp߃wŜr)w6bwɆm܅6m6 ۸ mU۸m%27Bw6bFj6ĸ{dȺa{j{dCpgٰ{j{dC={=!cp{jdc-fEq6cɆ}X7m6 ۸mW۸m'27C6cݛ#0x X7m<6 Ým= -jdC6@6`Ȇ7@6m'| 9-c,c-c'Xe,2222n{i{eEZYƢ,cіG'XeeKD5.c'y$>]D5NAp?H]p 'cv\ok\qATd 5.H]CxH6Pm!l7ja\CC!c5CzxH6d n!Pm݆%GݺFMlޭ{Gj"?߭{{Gj=RwH}ᄍ7ݺG?RG<{~?3zփ׃te tp8H,os~C1ɁcXE<11:1Xm1L6<[ͭd,V6ɆFmcdCt6`!c"V6 ;yĹb16l@/'!c3GQO6`OȆX7m<6 @O6`O0.T?O6bOɆSX7m<6 x mSxm<#2|w5m<6 ׍g3gs:U 71狞A=Wxm<'2xxN6d n9\m9l| xxA6\xPㅰxxA6d nBmlxj/dCs h l#ld3Lpa#W6ɆmCjF8ِ1ph#\m#'2S¡ppl%hmM\ۗqй/6^b/Ɇ)/:Kl%ِ1x//6^b/Ɇ/z mTxm"͞7x\Ú3^R%|'4^m6^ xmRxm"2`x xE6d ^7^A6^adzNbbD8mvʽl#l| װjFِ1x݈u#Bm#ۈ 2E#l5٠/71^o:Zm5lx jdC6^C6^cɆm6^m6ސxaY}C6̪M֍7jo7dC6@o6`oȆ7pNyxC6d n Fm lssD㭘S9[l-ِ1xo6boɆm6ުm6ޒ ojoHq`#ҹN1?G Sj#6"H!c~#jF$ِ1W$Tۈ6"ɆF$m#q Xιa;a{;lِ1w;w;!c~7ީm6ޑ xmSxmD zel7k(1QDg6(!css6(!cFFE6d /mDmDadc@n&-hoDmDcdCh4E6h!c~#jF4ِ1x mDmDcojb{_{{!c͝1<)پxO6d >s{{!cpjﱍdn|LjdCo|Pm| 2`@6d nAmC6r%u-^'#iìSbȆ:1j1F ِ1r)lؖK1j1F ِ1h#Fm#ۈ!2=%ڈQۈpѼt^9N8)яj"?$}5Gsq/85>G7fT|{|GGz\ wOq;I>z|Z'\>OjXq5t?b jF,ِ1x kDF,K6d n#ڈUۈ6bɆmBjgTCژgg!c~Ym3lghgl3ِ1gpL/bN/j_/dC࿓||Qm|!2m|6 w~6m|ps_4'ȳagqq.1WX\˘e2ayYYƼ-c>1_X˘e2`KhKdKlKbKjKfKnKaKiKeKmKcKkKs_L RPK) qq\PSu :b8.hoOָ8.k\T1`qA5O.d|571\ hEmp!2]\P좶m F..7rQp6\Ȇ{#hEmp%Լ751\]xfW WlÕlnº᪶m ypUp6\Ɇ+᪶m%#"511 qjqdC6Bq6bqɆӉvm6 ƅ6m6ƈGǮidbw\.چF6d OavܝچF6d c3Fz|Ck p#2Sܠ 7 7lÝl;#[C]p66ܱ w!c놻چ;N6d o~]mp'2mmcdvobx^j؆ِ1E." lÃl|NsچA6d ox@j؆'(P䁺& =mx  OX7<6< O!c5'\zmxbdC6< O OlËljy!EK)^pNR6Ȇװ^p 륶mx )^pNR6Ȇ/hKm ۈG66l lտO؈mSۈm#2`݈ۈG6d n#Om#lxFІچC6d ^7|`Q6|Ȇ᣶m'tj5#a݈ۈO6d n#>_m#>lF|h#F|l#>ِ1x݈mWۈmOӬ bbo}]j؆/ِ1L#X<_ _l×l܆/᫶m Іچ/l,h&Fg'PHm$ 2E^4Fl#ِ1x 6` Ȇm$6m$6FQ,db9FǑu? ?lÏllŏlضY6 ?!c놟چG6d nS6ɆL 6 !c놿چ?O6d nW6Ɇ h_m kpy#2u#l<ۨ Y76!cs\йjFِ1h#@m# 2mm` ƉVMj dC϶&tA϶&THm$$26!6FBl#!ِ1HHD6\'L\H߭KޭKHD6d Mװ6aȆm$6m$6 Hm$RHdx+1pYj^j|.12E$0w[:Hv\ܓ?/|.15~b7f88<1Il^i%Q$$/cz:Hv׃$@k$pmD-" IH;@I6`IO(nb$6BI6bIɆm$6m$6 IaHHJ6d c&6m$6ב՚-jb$=f2c&SHm$#2_&kdjɰddC''SHm$#2ɠdjɰd7L} c#9ٰ\m#9l99jɱdCu#96cɆFrh#Frl#D￘)ĞV mPHm 2SR9%F l#ِ1F F !cHHI6V>8`&FJoFJFJ!ca YHI6d _J_JFJ!co6Rm6RSobu#6RaȆF*X7Rm6R SRuJ*TF*!c H HM6RiSA>#}55}5Fjl#5ِ1x/6RcɆFjX7Rm6R i6Rm6Ґg ۚH#z4MHC6d n# Fm# lFh#Fl# ِ1xHmQHm%_61Ҋ5lZMHK6d ;IZ;IZFZ!cp/L?hNqّrGXFX&XfXXVX6XvXXNX.wܖ<|-c-c,c-cE,cE-c,c-c%,c%-c,c-ce,äC{SzN5.=q׸Td QzuKk\zq2^]/٨M bM2md62 3v F!cp j dC62@62`(zEߜ62bɆ.bxZdCQFeTȈmd$2_og62md62KR潗$F&X72md62 ׍LndRȄmd"2 Ȥ D6d ^72A62aFL2nfYm#3l.jdC{nfFf!cFfF8P`v#S9%Fl# ِ1>]OEm# lndu#Fl# ِ1xmdQȂmd%'N ~*Y YͪJ6d WsE<!2#>"ZD\ùY@6m6՞ 01:ohCyl'ȫK6d n#/Wm#/l| E^F^!cBy6bƩfO319ȆP|j|dC}D>GSȇm#2`ȧG6d n#Om#lLkb6C6cɆF~X7m6 mWȏm'2 -?_m#?Ql)ro&F(@6+xmiFlِ1x(FF!cpjdCkFdqjo{a{h{ﱍɆ߭[dC66Wljcˎ/FAFA!cQ֍jdC6 B6 bɆFAF!6ݕQLmQlnuF1lِ1R )6aȆbF1bFqvMh<_)FqыhqFq!cp﫸Fql8ِ1:8\W(m'2Q(Q(A6s{bQB<Z>ZBmQlF hF lِ1R)%6J`%ȆF FI1¤n!M- {ђj%dCsJI8T(m$2Q(Q(I6d - mT(m"tQiLYqc\TVeWV]Wj}W׸Td >_Yu+k\Yq2WV]8rfY]oMrRL9ѧe{OS(m#2F9lِ1rF9rF9!cިQNmQloLnuFyl<ِ1z<\oW(m'2-p˫m6ʓ F塍j屍 dhNJ{Fz\oWPۨmT 2?;<;Flِ1 F F!cp jd$Ͼ41*pFEl"ِ1xݨFEFE!cpjdC{1jJdcK\3&F%s%s%JF%!c**mT6* ۨmTRۨmT"27*A6*m8^[|:ݺ`A-sq7v߭ֈ~;0{/A}}sqovq/u?{AeٖN0Ы,WVʸT/cfWͮvP׃@2QY-2IFeFoPQڨQۨB6d ~^Tx^T*F!ci6QۨB6d n QEm Ql,)ݵOMFUhFUl*ِ1xYU6bUɆ}jUdC{ZUjUjd&F5@5@5jF5!cpՠjjհjdCsJ58TSۨmT#2Q ڨQ ۨN6ݺ]ﱉQ]ԍnTWۨmT'2QڨQۨN6d >TsJuFu!c}FuF Q;km6j ?'P>'PCmQlnԀuF lِ1xQڨQlLs* GQ7~uGɆ{a/ƏƏdCƏQmGlG!cp?B?mm$g*}5aݨQۨI6d >ԄsJMFM!cp5j5dCsJMhFMlH̉&F-ыւh-ZF-!c9Sjm6j )RKmQlnԂ6jm6j\xĨ-FmX7jm6j ۨ mVۨm&2Ek^Fml6ِ1:6Q[m6QliWaL:ߨ:ju:dC6@u6`uȆ:pNQۨC6d >ԁ6m6꒍=E޹ib6Bu6buɆmԅ6m6 ۨ mUۨm%2QڨQۨG6Uk2 QڨQۨG6d ދփh=zF=!c~7m6 ۨmSۨm'L>뚉Q_بmWۨm'2QڨQۨO6d oԇF}F}!cpjd{ǿWLFhFlِ1FF!c9Sm46 hm4Phm4$k /QP|C rCFC!cp j dC6B 6b Ɇװ j Fd#x\415l#mhD6d nHmшlF#hF#lِ1xhm4Rhm4&[]01;C5FˎS96cɆK~Fcl1ِ1AA6cɆ7C6cMF^th"&hhB6d NRNR&F!c^ Em46 hm4Qhm4%s{$uhmIjJ6< 1]Tm)єlhSa#Tm)єl|Ni 甦jMdCsJShFSlٸq4MfhfjͰfdCF3o4Shm4#2 h hF6d nLmќl\=\| CsFs!c-16ljhN6d n9\m9ќl|hhA6;v-F F !c֍j-dCF oPhm 2Bmђl[Lc&FKc#}[hI6)&[^Rm%ђlٞNGo_*716Zb-ɆFKX7Zm6Z )-j-6/Ǵ2$5/|W+J-]wZZ;0dV2RVo..VRV{8e}_Nz/-sdkgko`hdlbjfnaie22222262eleleleleWP0˹/v9^{~ؔ;]w,[Xk<*&c=pZkg2yZZ]Zy5U6kakqqӆl~vXC&Fnm6`mȆ6nhC6d n Fm цlFhFl-0`F+hK6Ɯ 1VVm-іlF[hF[l-ِ1}[oVm-іlF[hF[l'-&Ob'oOOdCϞ{6~6~"2?OOdC{,?A?mm#/8>fbg{g{Shm#2hhG6d c3[3[ZvdC鴃6کm6ړgOh/F{X7ګm6ړ )^m=ўl|NijdCu=^m=сlO0AԍntPmt 2蠶@6d nAmсlFhFl#Xq>;MbS:mt6: mtTmt$2#|FGl#ِ1x/訶D6=v 褶 D6d otF'NF'!c}Np߾F'lِ1o:Njd#[Ŝ)6:cɆ:ýjdCpYm3љl|N mtVmt!L]`袶B6d ^7Em хlntuFl ِ1袶J6.}&誶J6d otFWFW!c֍j]dC6B]6bƹ*&ְF7lِ1 )6aȆF7X7mt6 ot6mt6 R ,Yobt6C6cɆ﮶N6d }uWmt'27C6c=FE֙=D/=6z`=Ȇ꡶A6d >sJF!c衶I6*5Z7z~FOl'ِ1ўdFFOl'ِ1x FOFO!c~'Sm'ыlxx%ꥶ E6d N)6zaȆF/X7zm6z mRmL69~61~ugX7~VlfaȺ933ِ1x/3EVl|NYmgl7<=VE/6zcɆװFol7ِ1)6zcɆm6zm6}D/}6`}ȆC6d >sJ>F!cp}>j}d֎M8諶K6d oF_F_!c9/Sm6 aB}6bMYG-619sH?aV?~F?!c5l?G6d ;l?;l?~F?!cp~jd#clߍ_a/_m?џlnuFl?ِ1x6cɆm6m6OyZ`b Pm 2E^tlcِ1x16`Ȇװj6/ybޭKo^_`E-sq7vk/j{/pE}}sqovC>΋{@C䊚c t ֻݍoe=q=Hw_` z0E T@!c@hc@lc(\@& 9wRm "211D6d >W s A !c8m11AjdѾ641=pOk`lc0ِ1x96cɆצt`lc0ِ1x11B6&\3"-}!jC!dC6@C6`CȆm 6m 6 ?:1lOwi&Ưbm+6UlƯƯjb Mk_6~6~%2_ m+1l9&P1 sPP!c~c(7m 6 ׍n Um %2SBC6bȆ0an0a)6aȆ1 F6d nc1Lmc1ln 6m pa3dgv 126262626262626262626262elewT4t L,l\<|B"b0é9p1 pukpq2o 5n88 {15n8qé 5n ɻ='#D<#6F`#Ȇ1A6d NN!ch1Bmc1lD9Qc11I6d nc$1Rmc$1l7 {j#dCuc$1Rmc$1l䊚so8cSF9e(lcِ12 )6FaȆQpN1 E6d ^7FA6FaFNJ{F11F1֍jdC6FC6FcɆhX7Fm6F  mVm!+wq1FmQm!2ߧƨm6Ɛ ׍1nQm!2S@c6`cƃ FcxǪm6ƒ b,XX!c1֍jcdCcjcqd#U{=Foo6aȆ}qj㰍qdCuc6aȆq8qxѐkbwdrxx!c_c8l>5^mc<1lnucxlc<ِ1xA'jbLOOPۘmL 2E'^tlcِ1  !cp jdB:S 11&gV'gV'mL6& #3#3Qmc"1l|N甉jdCϨM6&mL6& N2Ę$7&IjIdCuc6&aȆQQ1 ۘD6d ^7&A6&a^Ę,zɰ1ۘL6d װ6&cɆdX7&mL6& a'C6&c C oja  Mm7l7!cpAmmF6d n7h7߰)djgbL6@S6`SȆ)pN1ۘB6d ދN)!c9e 1Emc ;q֪7~jc ]mwlw!c~wo;;ِ1ߡ6~6BVĘ*TX7mL6 }M{_S6bSɆTX7mL6 ۘ mLUۘjxky.5u4ivn^w1M`݁u`ew\ܛ]w{>M}ϧz0Iw:iMst8WLWL/cb:t0]`:ɁPtL'2ӡjӱd#ֆM hc lcِ13;33;36f`3Ȇp1ۘA6d nc1Cmc1l88Ę)-f}j3dCkәpm:Smc&1l|m:Mgm6f w΄6fm6fkMĘ%,X7fm6f k; k;Kmc1ln̂uc,lcِ1xݘmRۘm& 921f jdCp1[mc61ln̆ucllc6ِ1lhcllcٸML9hclcِ1s๶s6`sȆ߻߻1ۘC6d hclc.H毫ڛs\\!cu\N1ۘK6d N )s6bsɆ\ِ1:e>\Wۘm'21ژ1ۘO6d ȯ6m6ՋL(X|<#l]{(|j dC--PXm, 2XX@6d NYm,PXm,$R-nib,sB8,TXm,$27~cBlc!ِ1BB!cXXD6JZkXdF*56aȆ):e"lcِ1"HmclXm,RXm,& /ݨXXmc1ln,ucblc1ِ1xX bb!c9e1Xmc1lr|崉D)KDmc l]{%jK%dC{_K%!cXnCs><FqfR9,c-c+,c+-c,c-ck,ck-c,cX[6X6Z6Y6[ƶXƶZƶYƶ[vXvZvYv[jܛ&76ָ׸Td >-Ru[kRq2o-5n)8Ka[qKlΐ.[Cc؋Ybm,6 Xm,SXm,#2 X XF6d ncLmcl88]X.rX7m,6 Xm,WXm,'2XXN6d nc9\mc9l:p$Yz&  !cp+j+dC6V@+6V`+ȆYmPXm$' 11V֍j+dCϨϨTXm$2XXI6d OXXE64mWA-c؋YbVm6V ׍UnRXm"2 X XE6d >6Vm6Vk /QX-l6Vm6V X mVXm&2XXM6d jhcjlc ٘jn cXXC6d >s5!c}5pnlc ِ1xXXK6.U fbZoUXm%2] pתm6֒ ׍nUXm%27Bk6bF|GSX'l6֩m6֑ XmSXm#2XXG6d ncNmc݆%?̻uA yļ[IP.\ߋn?;0dϿ~8kᄍ7xu{zX^ԃW/c>b=#֫`=91ss"zD6֫m66C)ڱAim{Z66`ȆYYݠ@6d >Wls !chclc#xʛ$$66bɆצtFlc#ِ1FF!cبD6<,}9cӆyfu٘wdyMjMdC06pذ}}&lcِ1 )66aȆ&hc&lc3iZ2&folff!c~3̗|Ckc3l|b3@7ml66 [l66ml6 J[7o(oQ؂ml!2-16=tZ[-dCs8lQ؂ml!2S@[6`[3K[~VJݪJ6d olVV!c֍jCuc+Umc+ldbzqcو'>弍lpuyȺMmclCt8Uf&6lcِ1x 6aȆ6hc6lc;hFWEMnlucvlc;ِ1xvv!cpۡj۱dCuc;]mc;l,~CCmcl|/| ߡA6d o!cuhclc'ٸUj`㵅LnucNlc'ِ1x NN!c~c'7vm6v ׍N.dr;c إ E6d ncKmcl.hc.lcِ1x إ M6)`b{nn!c9e7Svm6v a[mc7l|N mV؍mI6~{0'ƟƟdCJ ϕSmOlO!c'mmI6d <ןƟjb{kbs8Q؃m!2{`أC6d ncGmcln6m6 wiMb|/3߫K6d nc/Wmc/l|Sm6 {j{}d,oebs)#'m6 `/Omclnuc>lcِ1xmS؇m'< 41֍jdC~oW؏m'2aدO6d ^7C6cƟLnbooP8m 2S9lِ1:\P8m 2q8q8H6"c8(AX7m6 8mT8m$2q8q8H6d ~AhAlx21qHSu!C!!csm6 8mR8m"2q8qn?;q2v2eeeeeeeeeeeeeeeeeeeee,2v2v2v2v2v2v2r>aq]X΋{1ͮ8wL\qL}zp:1\{"zpD8mS8m'8.ޑ9ߑ9q8N6d G|a;^ql8ِ1\qVjDZdCsqhqlٸҳ& vP8m 2߷?Om6N 8mP8m 2MqBmql$8o^&IbY=I6̎ {Rm$qlFKg C8m$2q8q8I6d n$qRm$qlTk\R7N~)lِ1\R8m"2q 8q 8E6d nqJmqlm{LjdC䞆V8m&2EO^il4ِ13j3dڕ5&21Έq֍3jg3dC3prFm qlhl ِ1x/z8q8K6b- 01ΊOuAߟ:q8K6d w%Yl,ِ12ccM Y!cq8q8G6UqNSu9s9!c~7Ωm6Α ׍snS8m#27A6aF&01 硍j籍dC6C6cɆ{~'yl<ِ1x8mW8m\ [ĸ l\6.m\6. ۸m\P۸m\ 2|lِ1xqڸq۸H6^ݗĸ(l\6.m\6. a/zQm"qldcx-g s"Jobhm\6. )jKd#{31. KjKdC6.A6.aȆalTsp0$&%lِ1K%Ke\\s5k5!c16ʙhW9obhm\6 ׍k5kuA[ׅuu!cq֍jױdC0hg O+ZױdCρ^6m\6n< qCظmP۸m 27`ݸq۸A6d S7*:c8l !Z7dCs h l&8Ү&Ma&qSm&qlMhMl&ِ1xݸ MM!cuMhMl#lxF$R(lBjF ِ1݂@@l#lnºm ׍@h#Pm#۸E6ʗ!ĸ%yyq ۸E6d L-L-[-!cQa~^ZC6nA6na}01npml6ِ1w:ntV۸m&2(actwgF&ml6ِ1rڸq۸C6ޞ>ĸ#IIq۸C6d N)w6`wȆA6qph5Jk|Ckql| {ڸqnr]NR˸q.\ߋo|'.|]sqO󝤻t{R4\\{ᄍ7}݅rgHiw|q?91LY߽TЊ=!c>qOmqlt?y7&}G܇}}}!co܇߸q۸O6d c3ƿZdC6C6cƺD$$6`Ȇxx@6d <<!cvs_s_^08,s<==[ƞXƞZB,c03s Xeee,2222i{gE[[>Xb,c-c,cϖ/s_=i.3ϺQ3o qAQ1g{58H]p 'ck\D5Nk X5.F-;M 71!m<6 =o6bɆm<6m<6 FjGd 1MGnSxm<#2_<6m<6/31֍jϱdCss!cpsl9ِ1ćM dsl /Ğ gBml|Nyj/dCu/6^`/Ȇ h l#llxx6¡ppl#lYp{F8N6d ^7aW6Ɇph#\m#xI6rs &K1sKK!c֍j/dC6^B/6^b/ɆKhKlf 㕰 x xE6d nJml|3 xE6d x ۈ oq]31":%S"6"!cuJ\DmD`dCu#֍l#lFm&gZaZm5lkhkl5ِ1kk!c~5Zm5lx8&1s7!c^ Eߨm6ސ Su7!cxxK6s4>&[a-Vm-lx jodCu-o6boɆm6ުm6"ƴ`bD9%)jF$ِ1 HHl#l|<GmDbdCHh#Rm#n;npzɫwA"E{8_N݁'}}sqovֽ yT[8kE" QA}QR; |""p="21((l#lT3bi#ZM4Zm#ۈ&2F8>#mD ۈ66h!cpFF4l ]v䣓&{G{{!c>=#ޫm6ޓ xmWxm'2#C6c~˜01>g?g?m|6> ׍n|Pm| 21?lِ1{jU 1߈FF C6d 6kl#lY_F C6d >@1j1GQp"w{>|Tm|$2?#\|Tm|$2aH6d g dGlp4=D 6>aȆO D6d nImlL d'l#l/ݨC&Fx1mĒ +~+Vm#ۈ%2 {jF,ِ1x mĪmbFMϢ jdCu36>cɆgX7>m|6> )j/d#ӝC718W3$}!Qm|!2;+__Ȇ|}Qm|!2B6d ^7@_6m8· d'8s<\,c17˘e2iųy[|,c-c1?˘e,222222222222228iɽ{ʿN!VquO >qE:qq\=qEt{qO S;c8j܄b.#chko.dc311\\.}m lÅlFKg s0Kobhm`.dC}+]6\ !cp.Іچ J6n^pnHߚb(sr? W WlÕlwAWWچ+J6d ̪+zfUmp%2 mmbqɆc#N#S9%F\l#.ِ1LhOÚZqdC}s\W7Uۈm%2)g 遇ed ؆٨ֿq&mmandCnhMm p#2mmandC6ܠ 7 7lÝlL^p]چ;N6d o~]mp'2Ea/ꮶm p66ܱ A'o11< hCm 2_xuچA6d nP6<Ȇmx@j؆'pqo&S<⩶mx -16J:TobhmxbdC6< O OlÓlƆ3ڧT6F hbx놗چE6d ox~Km "2_z5چE6d n R6⑍aY{m01xp#FF|jb6C6cɆmć6m6 ׍nWۈm'2([ab.ǩ%2ve*W)pNU6|ɆmBj؆/ِ1 _hWm%2S|⫶kx+Yö6/y5w[=@-"]xSu ^Fv⥜%; w?{{q^{?A,~' ?8W~te zGd ^`=SD"?hOm'|rO]jb;צf3ɟl8֢LW6ɆmCj؆?ِ1 h_m'2aϿ,#chmcd]lbFF@6d G>"@m# 2 -$jFِ1泛ZFB1c:U &tBaۄNHH6d ~viBWtviBFB!c֍j dCu#! 6bh{\&F"ߙw&RHm$"2S9%F"l#ِ1E"oHm#ln$u#F"l#1!K?&Fb'N$=Wǟ|=Fbl#1ِ1\\6cɆFbX7m$6 ׍İn$VHm$!?̌h5HyHyHHB6d o$F$F!c֍$jI$dC062ew^յ !$$ $X "wwKEKbR =Nog>oze5kqW2Fl#+|Ȍ]LL++<ʪJ6d c#aJjYdC6BY6bYɆa;k;c8l ~_Ȋmd#{,}MS}J6lF6!c ljٰldCkJ6dSȆmd#2F*7%ٰMɦ N6nw&Fv7þ]m#;lfވwp0*Fvl#;ِ16;fWȎmd'2ha#i{%*Fvl#(y*湉&F7rCm#l|gj9dC}#96r`9ȆA6n7qpظ~mbhm6rtgb}#'96rb9Ɇ$ٜj9dCFN8oTȉm$2E#16kjr~Ck#'li{q&F.7rKm#lo}#F.l#ِ1 )6raȆaˈtpx͍5or~Ck#lЯ11r;&#7lY܉г6rcɆm6rm6r ז~ז[m#7J6 &4&ombdC} W WlÕl|pچ+J6d npUp6򐍦Qu -ebgyyl#ِ1|F>|F>!cp|j|dC#ȧO6j1#ȯO6d >凳Q~F~!c(?m6 Fjdc6 : 21 jdC}6 `ȆTFlِ1k6 m6I'†;᮶m p66ܱ w!c5)j؆;ِ1mmcɆKTM, <)Q(H6d kJAFA!ce16kjR|Ck QlFA؆٠! zmx`dC6<  lÃl܆ᡶmx ϢІچ݆!Bٺ0zk?[WDY=RD!Bva<[W:(vP|x?[WWO>dC>pQ6|Ȇ hGm(B6>1ugx|Flِ1x(F"F!cwJ/Q(B6d nQDmQlжQTS}JQFQ!c}JQO)Q(J6d 7¾QTm(Ql,(QTm(K6 PWoBjF11b6ۛD(F1bF1!cQ bjŰbdC}6aȆm6m6ƹH31 ?hOm#2\Dwr6 ?!c}ܧma~dC᧶m4W/7چ?O6d >Y_m'2~O⯶m  h_m(N6"{11 šjűdCW(m'2a(Q(N6d n8Q\m8@6/6l#lom Ϣp P6ȆlQB(mP(m 2Fv<[l؎gKm6J Ϣ%,ZBmQl|(mP(m$()fђp-Q(I6d O) )%6Jb%ɆFI7Jm6J o6Jm6J@F)xQJmQl ;@Jm6J (mR(m"27JA6Jad+}#@@l#lo¾m Ϣp T6Ɇה@h#Pm#(M6yF631Jy47Jm6J ÜavYiFi!cy47Jm6J FiF_Ϲ/6 l#lAAjAFِ1x}#Hm#"2AFFL6 %_;F076`!cS)jF0ِ1x}#Xm#&2FF0Ql4wܙ(#l6ʨm6ʐ oe6`eȆF7ʨm6ʐ (mQ(mVThEC6B!c{{B=!j!Fِ1h#Dm#!2mm`eƵ\}31:26§ ʪm6ʒ oU(m%2Ö{زjedC$6ʪm6BFV7}#PPl#l| jF(ِ1Ph#Tm#%2ECPP ~a~0{<-rZyKVRdU",*ZUKVRaմ"-ZZmKVRYj-ZCKmXjZo5x+<[& ^;~~. ua~fgÓv>[Xٻy. 0u Z8]qI_feZh=x] /cu-kjx] '2<׵p!cy8W6ʑQ/ibs07o#3ק\wyF9lِ1rF9rF9!c3rF9lِ1<\(Q(O6,Q^<\^m-*mT6* *)Flِ1RڨQۨH6YĨ(өөQۨH6d n"QQm"Ql|ި獊jdC6*B6*bƎĨaF%a4QImQlF%hF%lِ16$8jb8l(go͓|CkQlQImQl~.Lbި jdC6*C6*cɆהpMQۨL6d 7*C6*cdXV01"3l#l|)jFِ1,gl#l|mDmD`UF71y 7mT6 *oTQۨmT!2U`ߨQۨB6d 7@U6`UJ 71:)fѪdlH7mT6 ۨ mTUۨmT%2~*|~FUl*ِ1sUjUjd~fcBMjbިjjհjdC T TSۨmT#2_S5F5lِ1xߨmTSۨmT'n_D+kbTw_Ԙ4 3XoTWۨmT'2&:|&Ful:ِ1:VWۨmT'2QڨQۨA6b6}6QC5QCmQlj5dCF 8oPۨm 2_Sj@56j`5/ 21j|FMl&ِ1xߨ FMFM!cp5j5dC6jB56jbdBf61"E߈}#Rm#ۈ$2F=lF$I6d >oDy#Rm#ۈ$2 mDmDbF9m.ebr΢o"I~%>F-lِ1]ւwYKmQlF-hF-lِ1h-hF-l6٨$q@&FmO )6jcɆFml6ِ1FmFm!cY6Q[m6QlۭL:ޞ:ޞ:ju:dC061`Zu:dC6@u6`uȆmԁ6m6꒍×58obF]8oUۨm%2uaߨQۨK6d n.QWm.Ql|ި mUۨmD{>31(h#Jm# ۈ"2H|HFE6d ~.E6(!cpQFFQlgQOبmSۨm#2`ߨQۨG6d 7QOmQl|MmSۨm';JsQ_Q_m>QlF}hF}l>ِ1F}F}!cpjdN|LbSm46 hm4Phm4 2hh@6d 46m46iYh(nnhH6d n!Pm!ѐlFChFCl!ِ1FCvcg癤F[4Rhda><1Ij@4;0O|&67_})ه'p>^Fkh-W6SЋkE4A4]}hq?&2$~OA41x?66k 1bƌ3fF C6d =I 1j1F ِ1w1[Ĩm`1dC6bl#lܨS#VX7b6bX!ccwjF,ِ1E,oF F !cp-j-d}3g11ZvKnhI6d$츰%ٰThm$2hhI6d >o6Zm6Z z DhF+VF+!cV|F+lِ1VF+VF+!cߟjmRhm&'ܝ$Zﷆ6ZcɆal9c8l^}Zm5њl|m gjdCgj6dc"F6oQhm!27yFl ِ1xhF6F!c5 Fm іl< ]rkOZhhK6d ~{[x{[F[!cjmdCh[hF[l?[\iLvF;hF;lِ1xhF;vF;!cvjvdCkJ;hF;lG5@ߨm|m|C6d$"FRCkl!cA)w<Z`ߐ Fml=٘Yqc^6cɆ3jdCWhm'2h@6.9JnbtpSE@6l_ruPmt 2_S:5Flِ16:`ȆgFFGc6:bɆFG7:mt6: Qm#ёl=jNdF1U$61:5\S:mt6: NotRmt"2`褶 D6d t6:mt6%#;[a[h[ooɆm| m|--ِ1-7Ul|MVm[l38h MFghFgl3ِ1FgFg!cjdC謶nwd#Ag{lwPwjEOٺ;0?/|;xS_W|xJ}wk]蚗ynbD1w ]}.A.t!2].j]p?B"d >Gt6mt6sU|~Um+ѕlFWhFWl+ِ1+tUmt%2#B]6bƦ']dhbt6A6aȆ F6d 7Mmэlot6mt6+V]̘D]m;ѝlot}Fwl;ِ1xFwFw!csFwF="MFhFlِ1ٰ==6z`=ȆF7zm6z 衶I6Z_zӹ{zfLSm'ѓlo}FOl'ِ1FOFO!c詶E6=xkb}6zaȆ{^j^dC6zA6zaȆg^F/^Foqq_{aVm&2譶M6d n7[m7ћlo6zm6b_}}}}}6`}ȆC6d II>F!c}JhFl/٨ƹ}}M~﫯F_l/ِ1/Um%2ߧj}dCkJ_hF_l٘M~b~j~dCkJ?Sm#2觶G6d nOmџl^yRg&F>d#K˾_m?џl^^jdCF8oWm'2_SC6cF Zozbb ߧ ߧ Pm 2`1@6d >o !c11n~+~ahy Km6Rj Ԇ[j#,(Km6Rk[j,$Km6RjMԦ[j3,,Km6Rkͳ[3z 9ciS {7d 379c8z\ȱfx}C7z{@{@R1@{@ "#cy lcِ176aȆ==1D6d > 6m 69~,`7m 6 `S6cɆTj`lc0ِ1l41B6>8|"!pn1B6d ~N7 Qm !211B6d nc1Dmc1l 61T m Um %2? 醪m 6 C1Tmc(1lPhcPlc7oļ1 6aȆap1 F6d 71Lmc1l àajðdcuLphcplc8ِ16cɆgp1N6d >6m 6F_y1Bܿ8޿8Bmc1lo}clcِ1x;Bmc1lhclc$pwp)捑p1I6d nc$1Rmc$1lHhcHlc$ِ1H(ј޵jb{Qp;Jmc1l|gQjQdC(8oRm"2?mRm&_抉1ZѰoVm&27Fychlc4ِ1hh!c}hhch C^ߛ߭Wo{8~]y{~|v݁dÃ}W{7}?[=߫kuV 1b׊1?1te >Gƨ` 911c"~0D|mQm%at+ccXlc,ِ1Z1c6bcɆ׊p1K6d ~XhcXlcp81NqoSm#211G6d ~n1$6aȆ8hc8lc<8|cоgM3-xagdƫm6Ɠ mWm'211O6d >c6ƫm6&D1A?& !cyc7&mL6& ۘmLPۘmL 2 jdlK21&1jdCDD!cYt"E'mL6& ۘmLTۘmL"xM:abLߓLIjIdCk$LRۘmL"21 ژ1 ۘD6d L6&mL6&-Y>xqĘ,d7&mL6& >>Ymc21ldhcdlc2ِ1xߘ mLVۘmL!vĘ"7mL6 S1Emc 1lhclc ِ1xߘmLQۘmL%61 +ͦ9tgdmL6 # k_SɆ}MUۘmL%21ژ1ۘJ6d nc*1Umc*1lMiPC&471Mmc1l|ޘijӰidCg_4i4!cpӠijӰdciM1]NDwmL6 #<#<]mc:1l|;amL6 ӡjӱd Kob}c36f`3Ȇ 7fm6f )32Cmc1l hc lc&p93LL!c kLlc&ِ12)36fb3Ɇ˘ mTۘm" Ko>}1KؘmRۘm"2`ߘ1 ۘE6d ̂k,Y,!c1 ژ1 ۘM6}a1[ؘ mVۘm&29wpذR`llc6ِ1xߘ ll!cYt61[mc61lT.cvvlcِ1xߘ9!cyc7m6 )s9jsd#g1;Lo̅}c\lc.ِ1̼a{\\!c1jsdCk\hc\lc٠'y1lfMspذ2q|lc>ِ12)6cɆṁ6m̷Y`yBKmR[b-~ԖYj-JKmR[cYj- FKmRbmԶYj-NKmRRcfi_uZ z{P1ܼ =nq yyd >-=n-B1áMbOm,6 Xm,TXm,$2_oBlc!ِ1B"QrU1LE⻟EEjEdC6A6aȆEpn^XD6d >-6m,6 יŽὭ6cɆm,6m,6 Űo,VXm,&2?Y m,VXlxkyn=<[}ZwIKOwD}د_r~8K| K?1uՆR1G,sR_R2l)lR-oK"~D|X m,UXm@6<wj@6l7oِ1Gِ1#~Plj?`FSz 01elv2lcِ1ss6aȆep%Y XF6d Xm,SXm,'szX\SLXN6q#rr!cs91m,6 Xm,WXm,'2ˡj˱du-51V3Lk lcِ1  !cp+j+dC J؃%&JlIƚ7Kؕj+dCJ8TXm$2䌑1~Ckc%l|MY mTXm"c"cاUjUdC*8RXm"2ߧUjUdC6VA6VaƘߤX-pXXM6d >jj!c}jOYXM6d >o6Vm6֐Bfכobky5!c5jk5dC}c k6`kȆhclc-HLfb{صpVmc-l|X 獵jkdC}c-k6bkɆgѵZ:֞sLu:hc:lcِ1xX:u:!c}:OYXG6d 7A6aFk}3X/l6֫m6֓ 16;9WZ뱍dCp^mc=l|XmWXml =2 )>elcِ1xAmclF3?OdZ dC}cAmclWtcaبH6d >olFF!cyc#76ml66 p#Qmc#ltTc ؤ D6d 66aȆMpؤ D6d l66ml66oolbl66C66cɆml66ml66  mlV،ml&2j-dcY/L-hclc ِ1[6`[Ȇml6ml6 --VqȌ]&[,΢[6b[Ɇml6ml6 }mg_[6b[ɆgѭV6'koƙD6m6!c5e\Sml6 molS؆ml#2۠mj۰dRcM;;j۱dC6C6cɆ)>evlc;ِ1v1qg&XA6-ߛ{b3"j;dC{pCmclo}clcِ1Nq>D)F;Ś);6vb;ɆDH chm6v ;ἱSmc'l| mT؉m"i#Mi9aE6Ig.lcِ1x.].!c ]j]dC{].]nQM41v}nO٭M6d OupYyioϯbhm6v ?>[mc7lo6vmp<y&i;o3I?·]G#~T;|x2e$O>TGG5=t.PCos4Mz]}G}~a{up8>3=u=@kVQ؃!csGmcl|A&^ •d# B~{6b{Ɇ爽GU؋m%2ثK6d ~^hc^ {_֋_" x>9[j,,!KvR;jԎ[j',)KvR;k[j,%KgKvRj]Ԯ[j7,_,-{_Q+_}}}}d }=nq|{>Q1<}FW_&71;md?ٰ %6cɆ׿pۯO6d nc?_mc?l|6mW؏m k3y_8;m6 #  ۈv@mqlhlِ1lt8qlal0ِ1x8 aa!c,al0ِ1aqCvGļqG6`GȆm6m6 CrCrDmql|r8q8J6E+{XS5Ql(ِ1(U8m%2q8q8J6d n(qTm(qlԝo\&1aqLmqlo}1lِ1,z ΢6aȆהc1cq1;Džqq!cpǡjDZdCq8oW8m'2ǡjDZd E;',z΢'6N`'Ȇ)'> lِ1x8  !c It߷71NY$EOm6N oT8m$27NyIl$ِ1x8 mT8m"δqJ8mR8m"2EOY)lِ1r )6NaȆK<mR8m&][Whkbi8oV8m&2a8q8M6d n4qZm4qlihil xUk㌸G Gl ِ1aÜQ8m!23jg3dC6@g6`g;8+Y7Ϊm6Β Ϣg,zVm,qlo}Yl,ِ1wmgjgsd/-Ls9h9lِ1s9s9!cp砍sj簍sdC砍sj簍dC~k631 硍j籍dCy8W8m'2q8q8O6d O9mW8m\ + ĸ ɽɽq۸@6d >^ !c=q۸@6d nqAmqlXjZj-,OgK0m۲_wro'B{[nwzӹ ӹqqM=Nm8V۸ݦ'c۰VxC6^ql|Oum6 ߇6m6 &!cjdC8oo<6m<6&=Ś)6cɆsl9ِ1xxss!cpϡjϱd 01^/j/dCPxm 2 t  !cS^@/6^m8<[fٺߠ"~0}?{ojO>`Ȇ)>lِ1,΢6>`ȆgƟdxEyO8o''ِ1$͖=W166$2O=ɟjb Bmm|4ߓLbt^ӆ(Ɇ̥jQm#|w"b}GOhE1G_d#⬇&_➝=;mmE6d 3o:c8l\fpݙ_ l__ja Amm|"Kӆy'ʻU|'lِ1 6>aȆgOp D6d 7>A6>aib|g8o|Vm|&2gαjdC}36>cɆghgl x;&g0 ٰ5/j_/dC||Qm|!2B6d ]haF&RKdXj-$ZRK-RKaRYj-4ZZK-R`e2Yj-,ZVK-RarYj-5WK-qKle67 {ʿN!V'pIfOqw8*W1'?Mp1`K?1xKz:\6tْHg.h6JHH6d >7'tAssBFB!cs..FBl#!ِ1lHHD6'ܝ$cf# ?Om$6 ؈wHZDjDdC6A6aȆm$6m$6\ƭȱ;f41\ hEmp!2.om`.dCk \S\6\ !c5pQp6 M 'қFbFb!cpjdCg1]YLbFb!cpj$d㮆t&F``$F!c$.|?Fl# ِ1~; o'QHm$!2HHJ6&9lb$hR8&UHm$%2) )FRl#)ِ1FRFR!cpIjIdd7o21 ɠdjɰddC}#6aȆm$6m$6 '6m$p<䕜l$ty.92E$0}?%$;0{Lp4m&W_o><%gk\}͓~yJn )W?)|Lgj)p?HAd R~B-")HA h#F l#%ܥҔwIMbL g̔j)dC6RB)6Rb)Ɇ)#FJl#%ِ1FJF*g6ILT,<< O HE6d >GG*TF*!csTp%I HE6d ~_b*h#F*l#5u.&Fj.ݥ6RcɆm6Rm6R ԰oVHm&2?L mVHm!%9.#7y#Fl# ِ14F4F!cpi4ji4dCkJh#Fl#-miygZIHK6d n#-Vm#-l|M gѴjidC6Bi6bƚ?c;b6A6aȆgtpMHG6d 7Nm#l|MImSHm'#~HuOuOHO6d n#=^m#=lj鱍dC6C6cȆ/412y#72md62 )Am#l|Mה j dC62@62`Ɇ!L5lnʨH6d n##Qm##lFFh#FFl##ِ16#Qm##l)hs?LLb a3md62  ~Im#lF&h#F&l#ِ1, Ȥ L6 r]32]3262cɆFf72md62 }eg_62cɆהFfFl+/ߚYļY6`YȆˢB6d 7Em# l,F,FVA'0 jYdC}#+Y6bYɆY6FVl#+ِ16FVF6}GW21l|#F6l#ِ16aȆ6F6l#ِ1 Ȧ N6>6K#aȮN6d 7þ]m#;lod}#Fvl#;ِ1ȮA6\RCoPȁm 2wPj9dCF8oPȁm 29j9d#ĂLξa~_4'0]T>Sm#'lܜ.ܜj9dCkJNTȉm$2ߧ6rm6r F#`ȥ E6d$llضK6raȆ6F.l#ِ1\F.\Fnͧ=FnFn!cSrSrm6r ܰoVȍm&27rC6rcduV|ombdC6\ W WlÕlo¾᪶m  WhUmC6NXC#y`ȣC6d n#Gm#l|g0=/l]>D>|vy.d匯Ϙ>†᣶m S16B0+Z>؆ِ1 lÇlKhGm(B6?d)Q(Q(B6d >oF"F!c}JO)Q(B6d >o6m6]dx(*EsѢjEdCU(m%2_S5FQl(ِ1R(Q% _ฉ+lBj؆/ِ1x}Wm%2 mmbdC6| _ _lhaGMbF1hF1lِ1x(F1bF1!cpŠbjŰbdCkJ1hF1lÏl~†᧶m 3s? ?lÏl|چG6d 7 ? ?lßl\[x/7چ?O6d 5_m'2g޳꯶m  h_m(N6~x zF lِ1F F !cy7Jm6J )%j%dLcbhI8T(m$2Q(Q(I6d 7J¾QRm$Qlo6Jm6J$J(V"RjRdC6JA6JaȆm6Jm6J SJA6Jad#|#3vbFF H6d ][ -Pm#$2mmbdCkJ m&Dskl&V(m&24﫴Fil4ِ14ÖV(m&2_SJC6Jm8 2$ݎgzy&)v W\?̇'cy&)v _})ه'w>y~Lmn5Ō g` A0jPDZD0$BkE0m!vJjQFwe6`eȆg2GQ(m!2_+Fl ِ12F2FhÂ֛L1cU#Dm#!2$~Om [sl#lFm%?(+֔pM)Q(K6d 7¾QVm,Ql|M) הjedCgejePqonMPPPPl#lF(m )pM U6BɆ-BPP {_;{Ӌ|7]a.}?GVR+oU*Zj,ʖZVRjUԪ[j5,ZVRmձZjQZ=KRkh5Ԣ-K-R-.}K4Nab _DžF=N{0 S0¨| _DžF=N_qa׿pSWWbnssr#\m#'2.\<['chmcdC061R8W16±p!c/W6ʑ.('F97F9rF9!c٨d rF9!c٨d rF9!c=U9hF9l<ٸpv+L.\Q^m(ΣM^.^jdC3f}8cWۨm'2/>\Im6 Ϙjdch F7m46 o4Phm4 2hh@6d ~hhH6vVqPhm4Thm4$2hhH6d n!Pm!ѐl|hhD6Mea&F#16h#FF#!cpFjFdC{FpoHmшlFF#FF4!&FѰoDmDcdCGjF4M6d n#ڈVۈ6Ɇhh#Zm#ۈ!n lbĈFF C6d >Y4Fm#ۈ!2_SbmĐ Sbl#l\܁&Fا}JF,K6d ~ 7b6bX!cpFF,K6d 7bXXl#l<8&F~5~mđ qpވSۈ6Ȇה8ĩmaqdC}#ڈSۈ6F>zĈkJ<\S6ⱍx!cFF<O6d 7a߈Wۈ6ɆmCjFc}Lbm gjdC}16cɆA6F:c8lIƚ79hL6d 46m4p078hj5Ԛ[j-,Z+KRkkԾ[j,Z'KQvY[ .)Nw/   HB \ w(PSJwknNעsg=g>=fgX[ƆX|-c~aᖱQ1hXN5.jiFNbs󟻺ƹN5NϬgV58wq2Z8c8j\. 9qƹS1^;q?q.WM 1yCm 2<硶mx ب5Gbhmx`dC{ІچI6 iCM OQ7j}dɑ4>&F_Q7ºWm/їl {Ѿj}dCƠQa#h@ژA%K6d ^7B}6bF,g{ \m6 oߍ觶G6d 3x8c8l<Wg%G6d o6mp՟l$բZDǿ[O~n]vǤW?W/߭y5 f_CoX ?׃te G  `91i${*V\Y@q=Q\Mbb ܷ1H6d nc 1Pmc 1l@hc@lc ِ1{L dc@lÛldkq9-p᭶mx 66 o!cw6 o!c>V6 V$AjAdC%%ZAdC&1D6d n hc lÇl?^#ゾm #1[" [룶m  X7|6| !c᣶m &+7=,-Õ``!c9e0Sm 6 i1L6d nc01Xmc01l8M!9\!döa0Dmc1lݺN_16`CȆX7m 6 m Qmhu _ _l×l|OimbdC/7|6| _!cpІچ/G66 ? ?lÏl}?qm #!駶m ~Іچ1l*l 6m 6 Ca1Tmc(1ln ucPlc(ِ1x m Um #oX&Ÿ1m 6 'pN1 F6d ^71Lmc1l݂a0ap}Uv411֍jñdCuc86cɆm 6m 6 )ájñdcP'01Fpklcِ1I` !c9eSFm6F OmPm$V_61RԍnTm$2_딑j#dC069c8lO%*Hlc$ِ1HhcHlcٸ/11F9 sQF/6FaȆQpN1 E6d >s(Q(!c^t1JmcO6wNM Q7aW6ɆmCj؆?ِ1xu_m'2mmc-l6Fm6F  mVm&2a1M6d ދ6Fm6Ɛr?h`b؋Qm!27:8c8lDW=z}tbhm6Ɛ mQm!2Fx 1Fmc 1l\IźMnucXlc,ِ1x XX!cpcjcdCsXhcXaЉ0=&xZƂ,c,cIXele,262626262naʹEZfYf[XƢ,cі<|@5.}qu_lk z5@]p 'cXy2@5N5.ָu 5.jk\Ƒ C jij\г6aȆbqj㰍qdC6A6aȆq8qxAO521Ƌ1֍j㱍dC6C6cɆm6ƫm6Ɠ C6cdǙ&FnmbdC}s 6@!csHjF ِ1@h#Pm#"v$N$rAmaAdC6 l#lFm 3666/yM  %jyn"&Ewe?n vǓ\dGWO_}nǟNqt'\随hʆ^92>{U~0te G>"X ׃`r cz EEzL"d 66dcT21&pmDlc"ِ1DD!c&&mL6& N6&mL6&_4\ĘaD6.Y7&mL6& `1Imc1l~$xo$lcِ1I$IF0 #DԍX7B6B!cFFB6d 6 kl#l|"Q6BɆeb}~_F(J6d ^7BaU6BɆmBjF(ِ14U6&ſJ1YԍɰnLVۘmL&2'w2|'wdlc2ِ1dd!c9e21Ymc2F6n&lAajaFِ1}0x$Lm# #27`m )aFF1l(ۦ1EؘmLQۘmL!21ژ1ۘB6d װS6`SȆmL6mL6GX_Ę*YꂞY1ۘJ6d"1Umc*1l|N 甩jSdCSjSidW&4ыN4i4!cu4N1 ۘF6d 1 oLSۘmL#27A6a^-fbLMwAMWۘmL'2_LjӱdCuc:6cɆtF8HA{p&FnmcdCu#֍ppl#lFF8N6d n#W6f.S/lb ؋Pۘm 27f~c lcِ1xݘ  !c9e1CmcA6_-hbD2"l#lnDmD ۈ6"6"!cpFF1lZԵ&LQ7fº1Smc&1lE tLL!csfsfm6f )3j3Hџ{~gbD FF$I6d ^7"a݈Tۈ6"Ɇ"WF$I6d ^7"HHlcp(0+1K`/:Kmc1lfK ۑ6faȆ{Y1 ۘE6d <,hc,lc6:γ\&lac61[mc61ln̆ucllc6ِ1ll!c1ژ1ۘC68NĘ#79js9dC0u3F3Aѯbhm6 s`/:Gmc1l|_t1GmcE6(X&٪&FQnDmDaQdC{_Qp+Jm# ۈ"2QnDmDaQdCu# ڈRۈ6FDɲѢhF4M6d c3F]_ڈ6Ɇ̣yF4M6d n#ڈVۈ6 gjb6Bs6bsɆߘ1ۘK6d ^7º1Wmc.1l|N mUۘmĐyܛĈ6bl#lF mĐ 1߈Qۈ6bȆm@1j1+XbKK5N5.ָXu5.jѱpqR1hg Tb5.qd9gMOcbĉƹƩmaqdCp6Ⰽ8!c/qjqFِ1x?mĩma ɆR :z!\G/TXm,$2ߛ]fm,6 Xm,TXm,$2XXD6뺭aJcF7XD6KW$XLYXD6d >,s"E"!cu"^XD6d ncHmcl8^fb,bb!cpjdCbo,VXm,&2a#$cw'ݩ.chm,6-_51K%jK%dC].].QXm,!2XXB6d c#3FMmZKdyݒK:e)\,UXm,%2KaXXJ6d nc)Tmc)l1МTmc)O6J \pGb#^؈66ⱍx!c$f˥xa[.ūmcdChls !c93Fև/RZd}fbl66B66bɆ甍pN٨H6d nc#Qmc#lF7g n^WW?/U Odb:}? ?A?mmD6d ^7~u'Ȇِ1fU Mdw7=616)MjMdCϋnϋnR؄ml"276~c&lcِ1M&MflYKKYmc3l {jdCsf8lV،ml&2&p3جn:٢.?˻u[E`݁ǿ[V-꫿~͏nxͷ\~k^(6d? sig~okg~V_q=MY?۔ϸLd G "~g!c6~VJ6/*-ʰUmc+l|?ml6  mlU؊ml%2تF6T)~6i<,l|Xf6lcِ1]mdöMmclmj۰mdCmlS؆ml'WB?|}.·ýj۱dCuc;6cɆa]mc;lv҉׭n;uA6lCP؁m 2o|olcِ1!c9eCmcl4})v=j;dCuc';6vb;Ɇm6vm6v ׍N.1'{&.acKmcl݂]݂]j]dC.oR؅m"2߷mR؅m&GZ纉[a[mc7l|Ok7ڭM6d ^7vú[mc7lnva.~u>D;s}>!c֍}j}dC6A6a_\`buc?6cɆدO6d W؏m'2_o6m6:Wsqq!c~8q\m8ql4v41Nu N9q8A6d  !cp'j'dCk I11ѲL9<~l? iIl$ِ1~II!cp'j'dC{_'j'6/yF6;"~0?u7̏'noٯq7 p8濩okG1NgOgO)\N՗199Nzp)xZ)\NSjdҌcc61NiXNm6N a8q8M6d n4qZm4qlihil z#&ݒ& z ؙȱ:Q8m!2q8q8C6d oq[Q8m!2 qFm qll(88+-}jgdC6Bg6bgɆ⦅Ϫm6Β MBg6bcǥLsNsdTQ29s9!c96=q8G6d nqNmql9h9l<(r,m?E8yy!cq֍j籍dCkpur^msAmqlhl"وM&Eyw^T۸m\$2"|El"ِ1x/z6.bɆ.B6.bƵMAm41.^rAq ۸D6dČ%a#zImql߸KjKdCK%KeյmLˢn\uel2ِ1xݸ ee!cq֍jdCsehel hMg W{_߸B6|fn\Q۸m\!2 |l ِ1uEm qlhl*٘̽5&UQ7ºqUm*ql|rSm\6 )WrUm*ql11jWkdGZmb\kkp {Mmqlfav:5k5!c55q ۸F6d >\6m\6dUYĸ.\Sm\6 ׍n\W۸m\'2qڸq۸N6d >\6m\6~'u_Znb.dC@߁]mwlw!c~wo;;ِ1x]mw0_an[ۖ;{?,c-cZ====m{f{n{a{i{e{m{c{k{g{o`hdanP{_݀558o uk q2q7`q7pA5N Xnk <$ 951n&om6n ⌑$MM!c5Mq۸I6d ~_&qSm&qls<`b6nA6naȆYYq ۸E6d 7߂}-[-!cpdK\dbߑ킾#s[m6qljdC6nC6ncɆmx+ĸ#X7m6 w`qGmql|N;jw;dChl.XL61^.Em6 ۸ mU۸m%2qڸq۸K6d n.qWm.ql[SN|㞨`ݸq۸G6d o܃={=!cp{j{dC܃6m6_}}!c=p}l>ِ1>\W۸m'27C6cFƿ$:x pNyx@6d ^7@ml}{jdCv  K^M̻ujEwݺ?`ovǓ|XP_?W,w5׃t[lCa=xq=xHW_!z|xE{Dm l|Ny'jO'dCu O6`OȆm<6m<6 GӓgTԍnss!cpϡjϱdC6C6cɆm<6m<6^bf_hbpAPxm 2xxA6d Ny)/6^`/Ȇm6^m6^ux?`b{_/KK!cp/j/dCu%/6^b/Ɇ{їK+hF?:\Rxm"2쌑$WjWdC6^A6^aȆmRxm&H|ZaZm5l|_5}xM6d n5Zm5l|Ny mVxm!K]˟dFxmQxm!2QU|Ck lx7jo7dCu Fm lo[[!c֍jodCu-o6boɆ[;A'61މwp;lِ1wSxm#2`xxG6d ^7A6aƉ-.g71 jﱍdCu=6cɆ{X7ޫm6ޓ jﱍd+o#MbNjdC2~2~Pm| 2~|~lِ1GQogGG!c֍jdCu#6>bɆm|6>m|6> 2LObNOjOdC{_'O'!c ֍OjOdC>A6>a 31>֍jdCu36>cɆm|6>m|6> ׍gva'|=#e,e2jKlKbKjKfKnsee}cdlbjfnai28I6qf?ۚ=?$o?n׸ϩc5b(+1`Kϩc/!(bM7Jzj dC϶&tE϶&THm$$2HHH6d %6m$p䕈l$jOݺDPD"Dv]/%$;0?wH}ٯq7Owp8<.tWMsq+]W2_+ځ .@+]"\p=p!2߷w6\6\ WҪwp}چ+J6d <+zUmp%2+\apUp6\Ɇgv6\6\d~&FbQ7úXm#1ln$u#Fbl#1ِ1]љ6cɆFbF>ٷIDHF$F!cm$6 c(+P$F!c9% Dm# lpeb$6BI6bIɆm$6m$6 )IᜒTm#)ln$6m$6 W F !c~#7Rm6R ׍F FJqq&FJa#%Rm#%lM {єj)dC6RB)6Rb)ɆFJh#FJl#H,&F*}c#ٰ}0.F*l#ِ1 )6RaȆTH HE6d n#Jm#lT=8#aHHM6d n#5Zm#5lH jdCkFjF1j:i6KmiFX-'ɇEӨm6Ґ )iFm# l|NI4ji4dCu# Fm# llv|VSuJZFZ!c֍jidC6Bi6biɆm6Ҫm6ґgҶ7197CȆtj鰍tdC6A6aȆtpNIHG6d >6ҩm6ғyrH/IHHO6d ~-=ז^m#=lM{j鱍dCu#=^m#=l88SO#_֣Ƞ@6d ~>GAm#lndu#Fl#ِ1xmdPȀmd$Kv\QaQm##l|N甌jdC62B62bɆFFh#FFlqq@ ahooȆXHchm|m|C6d nhooȆm|m| lأLLF&h#F&l#ِ1xF&LF&!c~#72md62  Ȥ L6/+wrS#ȬL6d ~HfWtHfFf!c֍jdCFfh#Ffl# ٘*I9ML,Fh#Fl# ِ1WEm# l|# ȢB6d ^7@Y6`You.>}*ְY6FVl#+ِ1.ϲmd6  mdUȊmd%2')+Um#+ltt= Ml~J6x?%F6l#ِ1F6Mm#lljٰldCh6h#F6 1;I{_Ȯ.?蜠j̏'e?坤2dW_o~܍x2k]}ͳzy`&Kz9D9W?9|?r 91\ȡ׃$B Cm#lb:&FNG}DNFN!c>3Æj9dC6rB96rb9Ɇm6rm6%=>#Ʒjbߒ ?o66%2~[jbߒ M6UE6*d)wM# ȥ E6d >sJ.\F.!c ֍\j\dCρ6rmphNzg8m9#e,e,e,eeeeeeeeeeeeeee;r ,c,c-cU,cU-c,c-7+u)qa˭qqM5Np[]rjk\nXrk\n\rS1xoָyȆ KUMl#ِ1l>7Om#ln6m6 ϸ?hbwәg \m6 v~F~!cpjdC6C6c'oĜR)6 `ȆpN)Q(@6d >sJF!cFFAqʙCAq jdC딂pRPm QljdC6 B6 b7a|LBO!x類F!lِ1xQ6 aȆF!X7 m6 (mR(m&Rx51 ;mQlnV(m&2a(Q(L6d n0QXm0Ql( mV(m!S ?JQDE`QDmQlnuFlِ1"F"F!cpE"jEd] 21wrwrm6 ( mU(m%2_딢jEdC~BE6bFbW)Jľh1/ZLmQl| [ am6 ׍bnS(m#2ŠbjŰdoebhq؋W(m'27~Fql8ِ1:8\W(m'2šjűd㟞M&F aQBmQlF hF lِ1x(F F !c=F FIZaMFIhFIl$ِ1WIURm$QlFIhFIl$ِ1R(Q(E6^8>V(%SJm6J ׍RnR(m"2SJ9F)lِ1F)hF)l4(x¶QZ( mV(m&2a(Q(M6d ^7JúQZm4Qln6Jm6ʐ~b31ʈuJN)Q(C6d N))e6`eȆFX7ʨm6ʐ (mQ(m%(+(Q(K6d ܲ;e6beɆ{. {.Q(K6d N) mU(m|G6nw#ʩ91x=(ES(A9!c>QNmQl8>(/l6ʫm6ʓ %V%V^m9FqfG 95-c,c-cu,cu-c,c-c ,c -c,c-cM,c?ZƚZƚYƚ[ZXZZZYZ[XZY[:X:Z:Y:[ƺXƺZƺY·A5R Ia:_ 8P׸ՠ'cjk\ \jP1\SP׸ՠ'cq55jc¶Knbt>{fިI6l#Tۨm$2QڨQۨI6d T56jb5ɆK mTۨm"=~&F-qSKmQlF-hF-lِ1xݨF-ZF-!cިQKmQlf+u-nt?dh5ߟQۨM6d _Vۨm&2QڨQۨM6d ޮ mVۨm!Wxs51ꈺQ֍:ju:dCuu6`uȆmԁ6m6 )u:jud#S '21ꊳ³m6 ۨ mUۨm%2ߋ bm6 ׍F]F=A[%41uJ=NQۨG6d nQOmQl|íQۨG6d NmSۨm'ZŨ/lԇ6m6 Wۨm'2_ԇjdC6C6c Ʊ41 j dC/6/6Phm4 2 `hh@6d >46m46O35hh(zцmhH6d >4sJCFC!c^!Em46  j FdVV31֍FjFdC6A6aȆm46m46 o46m46 ځ{kb4u16cɆpNihL6d n1Xm1јl|Ni m4Vhm4!.~hgl.Ja{QFl ِ1xhF&F!c~ 7m46 hm4QhbxGn]nݏZ]q|ϗH{5+Տkhw`~t6:mt6:y #HwyIdGFG!c9#S:mt6: ?>Qm#ёlFGhFGl٨<ĤMNntuF'lِ1 )6:aȆmt6:mt6: )NjdcRL~L6>,Uqy#Fgl3ِ1FgFg!c~37:mt6:  mtVmt!S|"FX7mt6 mtQmt!2袶B6d g袶J6wt}A'L˞Mj=dCpSm'ѓl|N 甞j=dC~zB=6zm8^eޭs߭E/^v]_ޭEnt_~\렗݁wzY_}nǿ[ ^^k ׃t͓gߵ1Ca=譾q=MW_}DoGV;Aor cGo׃$B}DohFolËltK^2xmxa^dCH̖A^[/ /lËl܆᥶mx 66>d#`K}>F>F!c֍>j}>dC>p&飶C6d o裶K6v$N!諶K6d c=f_F_!cG_諶K6d mUm#oZ^2Ow6aȆm6m6 mSm#2~jd?Ux/FX7m6 mWm'2诶O6d o6m6 Gz1@ԍn Pm 211@6d ދ!cpjdcev613@3@m 6 a/:Pmc 1l{сjdC{Zj oq?TL oaV6ɆmxCj؆7ِ1 o olÛl܆7᭶m "w1H`1Hmc1l hc lcِ1A A !c^t1HmcC696GQ6|Ȇm`>dCsS|6| !c~Q6a1 m51=p|`lc0ِ1x ``!c^t0Em 6 )j!dl118 S7 ہNC6`CȆX7m 6 ׍!n Qm !211% L _o~Wm%2_5چ/K6d nU6|ɆmBj؆hꙶ?~9#~j~؆ِ1 ?hOm#2S⧶m A~j~P^cCa1J6d nc(1Tmc(1lPhcPlc(ِ1x m Um #t:cqÝ4 Q\i Sm #2Fx|Fx0lcِ1a0a0!c1 1 n1(U&pqpWtppdpX7m 6gD o pp󴗈װájñd6 V61F8)n +\Lw#6F`#Ȇm6Fm6F ׍nPm 211I6FQLU&Hg>Tm$2 7Fm6F  mTm$27FB#6FbƦ oXabggRm"2`1 E6d nc1Jmc1l||1JmcO6n2_ܣ6 !c/寶m 66 !c9W6FU1ZaG5hh!c$fk4ٰjdC6FC6FcɆm6Fm6Ɛ \bbS)c6`cȆ1pN1C6d nc 1Fmc 1l| ;1nrX!51.+.wƒcO'|'i, ?V}گq7_I X5ks_ܗI/=%r>8xXe,262lhd Z&[,cS,cS-c,c-cᖱLXelelele,2mkͳͷ-@Ʈ1-4%4@kX|^ Zy-Ꙍ g+[|^ 5.@]p3ldOuXc~x8lcِ1L?a룫*8lcِ1g7Nmc1l|=1O65/j㱍dCuc<6cɆ1O6d nc<1^mc<H6"op(@8mbdC@@l#lnºm BjF8$FAjAFِ1[ R6Ȇ}AjAFِ1x66 d#E~M nLuclcِ12)6&`ȆmL6&mL6& M6&mL6Ftcb^4jF0ِ1`h#Xm#&2?( m S``lc"LnLucDlc"ِ1wr'NTۘmL$2_Nk؉jdCsDhcDlcU:hHc7&~c$lcِ1ss6&aȆIpN1 ۘD6d ދN6&mL6Bƻ1}wF!nm 6B6B!cuJ\m`!dC6Bl#l?^p#TU6BɆ)pm oPPl#l6B6BdÇLyyjdCuc26&cɆdX7&mL6& ׍dFXOT#Iad%GvRO#Lm# #2mmaadCu# ֍00l#l| mmaS}7Ę7)dڀC*IS6`SȆmL6mL6 ׍)nLQۘmL!21ژ1ۘJ6 $Y{1oSw޷?^RiLUۘmL%23qn. |Ckc*1l|2SmL6 ۘ mLUۘmL#[ 11ssmL6 OLSۘmL#2S9e4lcِ1x1 ژ1 ۘN6 |hbLOOWۘmL'2EmL6 ۘmLWۘmL'2mLWۘmO_4lbFF8N6dl .lض6±p!c9%)jF8ِ1mmc3(dbp 1lvj3dCuc36f`3Ȇ X7fm6f ۘmPۘmDSfLhbDFFA6d n#ڈPۈ6"ȆFjFِ1xmDmD`3FLbN 甙j3dC6fB36fb3ɆLX7fm6f ׍LF$8\ҌccMHn]$|.Rm#ۈ$2߈jF$ِ1Hh#Rm#ۈ$2 mDmDbȆ 11fu,N1 ۘE6d ^7f1Kmc1l|NYjYdC6fA6fau=&lqv6;[mc61llhcllc6ِ1xݘ ll!c5lhcl K^s̻uK^w7Ɨ(& E̱0? Ǒ9js̏'e˿[7Q_9o~܍x2us5sp=ks쥪# (cF3J}p=/c>" QjQD׃(X"p="2_DAQjQF4xya&Fӆy(lSjF4ِ1\%z6Zm#ۈ&2 mDmDcdC6hhlc.(9W~&\Q7º1Wmc.1l 珹jsdCW™d\lc.ِ1\F |M6kl#lpF C6d l#l|mĨm`ҹrlb~ٸG䆔>&|Q7ú1_mc>1lEm6 بX"n_ژm'2jd#gux D 6` ȆYYX@6d ދ.!cg@ 6m8·a/g8숵g[h[d[l[b[j--mmddlb2222222r>L,ո`::fMWROTmc)lRhcRlc)ِ1^RTmc)lRhcRl#l/F<jF<ِ1xh#^m#ۈ'27amē ۈ66ⱍed&2ы.2e2!c~㫺cw(Nq"] ݊;+kq+Z(w/.I"B@xc1r{u箧g}s̹֚{7vm6v ׍nP؁m 2_6vm6h:pk6ܰ 7!c놛چF6d ދ^Mm p#2mma;ƧgN&N>N>NN!cwvwvm6v 99Smc'l|N mT؉m"\]M]]]j]dCuc6vaȆ]pN٥ E6d \pKmcN6O鞧. womcdC;76ܱ w!c9)j؆;ِ1mmcF_M.%dTQRnn!c)jdCp[mc7l|k7[mc7ll#7=j{=dCoQ؃m!2S9elcِ1xmQ؃m%7rO]Ջ5YQR~-Wmc/lnuc^lc/ِ1^^!cث [C X7<6< !c^j؆ِ1 hCm 2Іچ݆#}ۺDww׷uH+eO-b]xu`اv\<'R.:}껿~Su=ߧp=O|ag6껿׃te G}~'21C"zD|b?_mc?ql\jckKط8-m6 ww@mqlhlِ1xq8q$-WO<34O OlÓlnxº᩶mx 6<6< O!cpІچ'qlL<{̃jdCpa A!cpjdCsAhAl٘TRcMLCnu!lِ1x8!C!!cpCjCdCp?!Caqt11q֍jdC0F7W ۫ʇ6cɆצal0ِ1x8 mV8m!EM8"Im6 [G6`GȆm6m6 G#jGd\I,AߘGE8 QQ!cgh]1jGdCsQ8U8m%2GjGcdcO㷕n`b6A6aȆc8q 8F6d ^7qLmqln6m6U[8.ýjDZdCggW8m'2q8q8N6d ^7C6c'FLּuLnu lِ1xq'6N`'Ȇ-8-8q8A6d h l$iMIhIl$ِ19'9'6Nb'Ɇ9 9q8I6d >6Nm6Nib6NA6NaȆ::q 8E6d nqJmql)h)lËlh&Xz5چE6d >x9Km "27`᥶mx ^Іچ݆|y"o9>Ӗ3s 1_%˘ee2` YƮXƂ-cW-c!P5Xe,2v2v2aݴEYnY·wENb󟷺yM5N58ou5Λjb^yM5N7q?aכ=>†᣶m  lÇl܆᣶m >Іچql4{b&isA rvZm4qlihil4ِ1x|ͧ6NcɆihil ٠ӭ*gD|g6`gȆ3pN9q8C6d ^7qFm ql33YqzN*gwgwg6bgɆYX7Ϊm6Β 8 mU8m%2SBg6bƇ-obu6aȆm6Ωm6Α 9s9!cp砍sj簍dzf51λ~<ٰ=t9q8O6d >syy!cp硍j籍dCsyhyl;2w2&qVxV !cp j dC؋^P۸m\ 2 jdvKŷuu6.bɆ甋pNq۸H6d n"qQm"qlEhEl×l_߭KjS|]+K~Su=p={gmz~b~}?Xp=#2~EzG"d >WA~j~eu{{]sqlgqc^V۸m\&21/qYm2qlehel2ِ1~ehelßlD6r/GmcdCwH6 !cj؆?ِ1xmmcd#ob9%)jFِ1gݳl#lFm 66@5gF m T6ɆmBjF ِ1mmbAdcQqe 31ĻA] l#l}m ?' l#l 66+d&o\+!cq֍+jW+dC؋^Q۸m\!2S@W6`d#E@67rnúm  V6ɆF0jF0ِ1`h#Xm#۸J6运ĸ*l\6m\6 SuUU!c~*7m\6 WjW1eKr!bN sJFB6d Mn&7Dm#!2SBm ׍h#Dm#%Ǐ801BEu#Tm#%2nmbdCu#֍PPl#l 6B6BkdU+ab\\\S۸m\#2E05lِ1k5k5!c9qMmF6*tp*`b aFFF6d g6°0!c9% )ajaFِ10h#Lm# '÷$>lb FF8N6d n#W6ɆmCjF8ِ1FF8qlthb\6C6cɆ߸q۸N6d >\suu!cqڸq۸A6zTzX܀j7dCu76n`7Ȇm܀6nm6n 7j7QpᘑәFmD ۈ6"6"!ctmD ۈ6"6"HѝbNsJF$I6d n#ڈTۈ6"ɆHoDmDbdCsJ$m$J:7s؛9MM!c)7j7dC6nB76nb7Ɇm܄6nm6F뗔&FQnDmDaQdC6((l#lyJ|mD FAQjQ-±# ;;6naȆ[pNq ۸E6d ^7nqKmql߸mR۸e>u"m9eee,2kgݷ======[ƞY=e222222eee|hq-dS荢aoqѸES1 hu5.jk\4qk\48FѰEk\4n9} q[|wy~wy[m6ql| jdC{1^mm!cpj;d쾯oIlb{1w^;!cq֍;jw;dCuw6`wȆ{;;vΏD{9/mdqEܵ0O}[wֈjwSo»W}ᄍxjv ]=A -,!ň>"1A }׃Xbbp=!21PDZD 1$B ڈQۈ6bOk7:#zd#5XXl#loco[ƪmbdC6bXXl#lF,m#:;#>=lِ1xy6aȆm܃6m6 ۸mS۸mđ gl2u#Μ T鵟qjqFِ1gqݳ88l#l|o6ƩmaqdC{qFFqlz+XއkjdC}oW۸m'2qڸq۸O6d ^7C6cи61Mx@6V: o4xx*l<6m<6 }={_O6bOɆ甧pNyxJ6d n)Tm)O6vv|lbċxmē ׍xX76ⱍx!cpFF<O6d mīmcF7xhb<6A6aȆ{g} xF6d 1+F?yxm<#2 x l872<01sʟpNSmOlO!c9;W `W$''ِ1Lݨ>]g bhmmI6d NSmOl9٘q&sa9\m9l|_9}xN6d c+Ƭ~JJ sl9ِ1s qzM lِ1  !c9+9%mZ/dCs h l%x_=#ޫ=91\)b氌k/̛ V{\ޓ׃{Ѫng!c>+F·eݚdZdC0=f+W 󻈹m| 2_|6>m|6> M<}ou-qʧNI7Dd]1Q&A m1RO Y"z?k\"Gщ}1l$LYbz,Fbl#1ِ1ivDbFb!c/6cɆFbFQ;*IDۺ$dOd+$QHm$!2.}[Dm# lۺ$m]$F!cHHJ6_(Qw?#%uݖjIdCplWRFR!cwϒ:лgI6bIɆIjIddɄdF2dF2!cpɠdjɰddCsJ28$SHm$#2SA6agݛ]41p~á6dC࿅pBum8 ِ1 Pp`!cphá6 G\ϛɅFrFr!c3@; 6cɆHHN6d >$6m$6R0-9#HHA6d ^7RBm#lF h#F l#ِ1xHmPHm$Z:MFJh#FJl#%ِ1xH FJFJ!cp)j)dC디FJF*6Ӷ>&F*ʁRHm"2`H HE6d ;2wdRm6R _ H HM6|.o#XjdC6RC6RcɆES}jdC6RC6RciFjǞ218s4\0Fl# ِ1]\16_שݢ bhm6Ґ SuJ4F!cpi4jidc_\=abFZoUHm%27~#FZl#-ِ1xi6biɆm6Ҫm6ґЎ71 頍tj鰍tdCu#6aȆm6ҩm6ґ 頍tj鰍d#M=jb6C6cɆHHO6d oFzFz!c5lzh#Fzl#٠ F F!c֍ j dCu#62`Ȇ F FF1ҦLFFh#FFl##ِ1x62bɆ{ьͨH6d vFh#FFl#J͞&F&?9Im#lF&h#F&l#ِ1LF&LF&!c~#Im#l6܇&FfodVȌmd&272~#Ffl#3ِ1FfFf!cpj,dڝ31},p_4Fl# ِ1xF,F!c^4 Emd6 Y,jYd&FVQ7ºUm#+l {ѬjYdC6BY6bYɆmd6mdp~H<|mZ|]x4{8\Gj_`\}fO xϿP/p=FiGz\ l껟 ׃lte ^zM ȁlȦ ׃l$BklF6lFvQ4fz&Fv\ald'l#ِ1La>0- F>l#ِ1)6aȆ7A6m8χ gOqّrGXAX!XaXXQX1XqX XIX)XiXWr -c-c,c-cU,cU-c,c-c5,c5-c,c-cu,WwSךNEk\~uˏk\~q2_o׸Td ^_]jW׸x+@6&>h=dQ@(mP(m 2Yotpڰ\oF!cި m6 (mP(m$GNsaQP(mT(m$2 |FAl ِ1 \ST(m$2_S6 m6  ۍ.($l6 m6 t6 aȆm6 m6 ͅBjdɧ-31 va.Q(L6d ^7 úQXm0QlFahFal0ِ1x( mV(m!CJ("5)5)Q(B6d ~XxX"F!c~7m6 ׍"F"FQgV&FQ{Q{QFQ!cuJQN)Q(J6d N) )E6bEɆχ) mU(m#w/<|QL`QLmQl=b=bjŰbdC6A6aȆm6m6/ nbQedvzqFq!cQ֍jűdC6C6cɆm6m6J Z`bu%6J`%Ȇ{-Q(A6d oF F !c~QBmQl,wa;()l6Jm6J ׍nT(m$2Q(Q(I6d N) mT(m"gb6JA6JaȆm6Jm6J )RJmQl|_QJmQlowi9&FiQoV(m&2SJ9Fil4ِ1FiFi!cF(Q(C6;&FQoQ(m!2פ |פFl ِ1WUFm Qln6ʨmp~}5o2oZ^AJ-+sd~[tWv)>_S]H8 _Wo.]߭ +\=V^YG}DY/AY2+¹AY\ʒejeq=(K"d ^Be6b/#¦\Q6aȆ,,Q(G6d nQNmQlF9hF9l<٨vܰSMnuFyl<ِ1"?ʫm6ʓ (mW(m'2߷(mW(mT  hQ0+ C j dCk pmZAmQlN116U{|_GZ dC6*@6*`_ -~2ZMkӯ66&25dC돯kɆm| m|5QlԀ6jm6jKjQS)5RSm&Ql j5dCkؚp [Sm&QlnԄ6jm6jӖ5?Ĩ%F-X7jm6j `/ZKmQlF-hF-lِ1xݨmRۨm& 61j jdC$Ն$Vۨm&2QڨQۨM6d S7b퉫#chm6ꐍy{:;u6`uȆE}:ju:dCFoQۨm!2icncԑ16m·ԵQ2V22eee[XcXXSX3XsX XKX+XkXX[X;X{XXGX'Xgw.naR;]=7Sۨm'SĨ/zF}l>ِ1^L}S_m>QlojdCpᴑwsvCk>рl 8iϡ>&Fa@mрl|m46 hm4Phm4 2_S5kj oȆ֖u617Fml!cp@ߨm|m|C6d o|o66!2}W 4| ѐl:w{ E 6b Ɇm46m46 بQboj'OCk!ѐl|Ni甆j Fd#?^nb4sJ#84Rhm4"2hhD6d c+F3JCkшln4uF# G^ߚoG^sJKFK!c]16ǼhE6j$n13]+&&F+lِ1x 6ZaȆ{Vm hE6d c+`ud VFk1UahhM6d n5Zm5њl|5lhM6d c+?Z6dc盙m\m]a6jm6dCaaQhm!27~Fl ِ1NNjՑ16`mG3LnuF[l-ِ1xh F[F[!cpmjmdCF[oUhm#%7Nv;}vjvdC ѽ]16ӟhm#2hhG6d ^F;^F;vF{1`NL]]jdC b8m$4w bhm6ړ hmWhm'2٨i#sg!wZdcӵUFAmсlFhFlِ1FF!c ήNeO16:`T7:~FGl#ِ1"FFGl#ِ1\jdC0u+Q*A F'sTXLNbϼ3虜 D6d Ӌvpژ9,K3$ D6d nImщld#+EΈ. F'l3ck˺&Fg3|Ym3љl6u&Fgl3ِ1)6:cɆa֮N;'q˓ Fgl;8ywwdCK]66#2wwdC0VNe*1+WZa]&FcU [ꢶB6d }uQmt!23̻mt6 ?kuQmt%K n軒V'h%몶J6d Ӌit]6b]ɆFWX7mt6 誶F6yw5XtnjݰndCphMmэlF7hF7lِ1ݠnjݰdcjcIy݅FwFw!c֍jݱdCsJw8tWmt'2讶A6N,_11z5lA6d ^7zCmуlnuFlِ1衶I6^tSԍnTm$2y'+ӆNOFO!cpFOl'ِ1=j=60'0,x }olbjfn26262elelelelele'ϖ Iɖ) Ɯy27yuK]z+xۺ^݁^z^SZozW1sn]/XzkW/<{ôd~+oJhoVx^Mw_{lox^Md =Oox^M"d [!j>dcW`heM>~C6l Qm!2~Flِ1x<}6`}ȆJ}>j}d#.21֍j}dCu/}6b}Ɇm6m6 }j}~dПo+mb~觶G6d Ι맶G6d >sJ?~F?!cp~jdDZ&i21utO6d n?_m?џlFhFl?ِ1F:e=JA p߃1@6d o !cpjdC6@6`ƵOMb&@o @@!c1֍jdC Tm $211D62o;铽1ΪnH<< `buc,c6bcɆa̻b8mUm%2ca1K6d ^7Bc6bƒγVMqb2SƩm6Ƒ U8~o0Nmc1lnuc8lcِ1q8qOd#`NpTt'Im'l'!c3zb8mt}]Q*A Ȇal4vp0?5A Ȇmm݆㘟ͳD~3j?E'|~3|gS|9#hY}}s\$ {37*2&ꔆx1Wsxx2Ypp:12^`<ɁPx'21C6cQĘ clcِ1t\NPۘmL 21ژ1ۘ@6d >WL6&mL6&S>ًsE16&bɆa֦=\16˹%ژmL$21ژ1ۘH6d ^7&B6&bƛ MjbLkI1 ۘD6d $I$!cpIjIdCIjd}bbLgOgOVۘmL&2Ӛ &mL6& ۘ mLVۘmL&2:ژ1ۘB6FϏĘL!1ۘC6d --9!cps9js9dChclc.ٸpȂLbk.1ۘK6d ^7º1Wmc.1l\hc\lc.ِ1\<4ռ|}<1Omc1lf iW bhm6 a51l|2ژ1lЉL_Ŝ+S~UlUmWlW!c+mmJ6d nWhW_dЋ!?=01֍j dC6@ 6` ȆX7m,6 Xm,PXm,$31~c!7m,6 cPmc!l]{хj dC6B 6bm|]oodCk7߰Ȇmmِ1x/o"18j伅1&"""E"!c5"]XD6d ncHmcl\E"EbA]caXXL6d otp0(]2A b!cpjdCsbhcb G^ox|[;@W.\<{mFv݁x~ohᄍxjvw\=-CoX,w/` }  D` KȁXE,` 1xXXJ6~J(c+¹bRlc)ِ1c)\,UXm,%2_.kӥjKdC}RhcRlcXN&2acLmcl2hc2lcِ1xX2e2!c X XN6|&r߹w.WXm,'2_,rr!c֍j˱dCuc9\mc9lMRjv& o  !c8D T7Vm6V #v+6V`+Ȇm6Vm6V LnucJlc%ِ1xX JJ!c9e%SVm6V XXE6fjb*oRXm"2\;Wm6V ׍UnRXm"2߷XmRXm&ޏ,bbv sja;`ajlc5ِ1)6VcɆjX7Vm6V X mVXm!摒lbuc k6`kȆm6֨m6֐ ׍5nQXm!2_6֨m6֒*R&Z{_k֪m6֒ kaVmc-l|S֪m6֒ X mUXm#2?hbSXm#2XXG6d ncNmcl:hc:lc=[$fzcaXXO6d nc=^mc=l}}j뱍dCߝ6֫m66G~ X76ml66 `Amcl{ j dChc 0t>D-xlmmmmanas[v[XZ<,c,c-c,cCÖ#c㖱S1/0;=k{KFS\#og;ym5n#8Q]6jkFX6kF\6R1ָFy^416&ޤ D6d ncImcl| 7ml66 ͛Mjd~₉YYmc3l|w3ݬL6d T66cɆml66ml6L-glc ِ1j \SmQ؂ml!2آB6d \p Emc ld{U<3 oU؊ml%2S9eVlc+ِ1)[6b[ɆVhcVlchdԢMmmj۰mdCpnlS؆ml#2?p}>!c=}>}~ѵ~MjdCuc?6cɆpNٯO6d >6m628 99q8@6d ywP8m 2S9lِ1r8q$W,q31<Ŝ O OlÓlnxº᩶mx )pNT6<ɆmxBjAuM.f ٰvPm qlAhAl ِ1AA!cwB6bF 368$):!lِ1"qHmql8CjCdC!h!l0٘gV7~al0ِ1:0\V8m&27~al0ِ1r8q8B6Ng/α8"X7m6 !bqDmql|N9#jG#dC{G#jGdCW17G G G6bGɆ)G:Ql(ِ1r)G6bGɆ7BG6bF5ϋcOm01u1N9q 8F6d ^7qLmql1h1lِ1xq 8q 8N6$Y2zxv>k;q8N6d MqMqq!c~87m6 ǡjDZdc_!ǭ51N'j'dC mO '6N`'ȆџOm6N 8mP8m$O[61N^$EOm6N )=\16r>,%8m$2EO^Il$ِ1xq8q8E6JiY9yE˘ee2v2o ZƂ,cW,cXee,2nnaEZnZƢ,c,xS8e毓oM\ظ|HOk78xýou5Λjk7qk78ްyk7|FdشQ>bچC6d c+F* ֆC6d nQ6|Ȇ?hGm8M6r8w71Ni>q8M6d sŜV8m&2FJXcb8m416NcɆNC6NcgFхW|\db6@g6`gȆX7Ψm6ΐ ׍3nQ8m!2@6Ψmp~u|[>ug[g"E'cۺFU;8kw`.?V}ᄍxjvg^i\GsY`w=^tGd+. 9\Α۟"zpD8mS8m')zlů&yvW8m'2#q^mچG6d |Om#2_A~j~e1uEݸ ee!c8D del2ِ1\#sYm2qlehelßlަɺ&Xuچ?O6d zQ lßlnú᯶m )Іچ?@6b Flbod72jFِ1x/{l#lFF@6d mm`d)`b}@/m {= T6Ɇװp m ׍@h#Pm#"݇SL"BFD6d n#R6Ȇ 8maAdCFm\!/_aqEW`/zEm qlhl ِ1++!c9 qEm L6BS *8'#XV6Ɇ7FF0L6d >9%Xm#&2S``l*٠_kb\딫prUm*ql {ѫjWdC6BW6bWɆm\6m\6BF?R7*2q0/˄ !j!Fِ1FQ6BȆm@!j!Fِ1h#Dm#%s^FMebuJ(\mbdCp#Tm#%2 mmbdCh(m\#g;Dݸ5k5!c^Em\6 o\6aȆ{k5kFHx#L0<% >O S6Ȇ08maadCu# ֍00l#lFm kaF8ٰ}m  W6Ɇװp m FF8ql+܄31q֍jױdC6C6cɆpNq۸N6d ^7C6c7Ɓ =Z11n7j7dC6n@76n`7Ȇ X7nm6n +uڸqۈ g>5>&F߈jFِ1xl#lnDmD õNcb jF$(cYHA&FnDmDbdC '0Rm#ۈ$2 mDmDbdCsJ$i8&ipWZMsd/P9\G{7n|~&7wfn{~S}ozE|gקzQbsEGzEw_/J ׃(r czEDEDzE"d ^((lوJj^&-1W܂s-[-!cgh3[jC6nA6naȆ;oA6nm8}_Ozg8∶q2v2v2cݳY[XZY[ƞXƞZ-c,cZƞ[^X^Zm{e{m{c{k{g222rK4ո\mnu5.ָhu5.jaWվյJ$qѸES1l4ܛV׸h\㢩|5.Z]wltܰkwxOnml6ِ1"om6n w[m6ql|o6q[m6ql,~2N&Q7qGmql=ﻣq۸C6d nqGmql|qGmqlhyeq7㮰qڸq۸K6d lU۸m%2qڸq۸K6d 7߅6m6bȆyĈݖl#lF mĐ ۈ6b6b!cp1FF K6?{;#V؈6b6bX!cpFF,K6d n#ڈUۈ6bɆ*ڈUۈ6iEOĸ'{pNq۸G6d lS۸m#2w>ﻧq۸G6d ދރ6m6ƉKr$hbĉuJ\ĩmaqdC88l#lnmđ ׍8h#Nm#۸O6^W{㾘S9}l>ِ1xݸ}}!cm6 ׍}Q1S'ۚĜ)6`Ȇ!y!yx@6d ^7@mlFVoxxH6FLPxmm|6> M@ulِ1x/6>`ȆvaΉaasّx$XƒX\-cn1w˘e22eX|-c,c-c~1X XJX*XjXXZXe,e,e,22dha'r|ĕ,9%rςg=埓Չ]׸^Ac?1xKjOָD^bSǀ_bq:FFbFb!c5UbwJHL6d %vGQbFb!cpj M{&;\Qo䢶m p6\6\ !c놋چ B6d 7@.j.FQ.I_M$Fh#Fl# ِ1D 4$QHm$!2HHB6d 7'6m$6\0ǯNfNq%-0|X몶m tUp6\ɆmBj؆+ِ1xp6\6\ 71n"7w~چF6d >9Mm p#2ߧssGtnjn؆ِ1xmmad#κa^p'$6ܱ w!c9)j؆;ِ1x/{Qw wlÝl|Nq66ܱ 8P`J!j؆ِ1xuCm 2mxmx`dC6<  lÓl=L&;}[究mx T6<ɆO8xmxbdC'᩶m$%+' d41uJRNIHJ6d 7)I6bIɆm$6m$6 ׍FR؆ٸsypٰچE6d >x9Km "2S⥶mx mxmxad#[/鞁&ްnxmxcdCp1PV6ɆmxCj؆7ِ1 mxmxc>dŞӑmҙ> wtچC6d nQ6|Ȇm@>j>؆ِ1Q6|O?oߕu/}6| _!cwM|ѻ&j؆/ِ1ޗ/U6|ɆmBjF2q119ml>jK HF6d NI)6aȆ{dM HF6d >$6m$p|䕜l$..Kj"]?_cps^Ոj=?n]rx~r7bu=Oq={^m0/HK w?2}[v91x=""p=#2_A~j~؆?]׼&#a᯶m FmcdC=?16 !c>W6Rߦm2.BHmPHm 2.Sm6R HmPHm 2#R@)6R`)Ɇ51R )j)dCu#%)6Rb)Ɇ)#FJl#%ِ1FJF*Q, >&F*a#Jm#l| ?Rm6R `Jm#l|NImRHm&Tz~gjIHM6d 7iVHm&2aHHM6d ދ6Rm6ҐM'kb6@i6`iȆ4pNIHC6d n# Fm# lFh#Fl#-xTf&FZa#-Vm#-l|NI 甴jidCsJZ8UHm%2SBi6bd#ۂmAF@6d S79c'7m S:%@m# 2El#H-eb6A6aȆJJHG6d n#Nm#lF:h#F:l#=XU6[/#s_HO6l6ҫm6Ƶi?v>&FX5lF H6d ދ^4Pm#$2mmbdC6@@l#ȸv7(F1dsJ F!c֍ j dCsJ8dPȀmd 2S2@62`AdF31 h#Hm#"2_uJFD6d k l#lnAAjAFF1Ԙηޘŷ62bɆ2½jdCsJF8dTȈmd$2ȨD64x#;?0;:0F&l#ِ1x 62aȆmd62md62 )Lj6a{"χ blbjf YƲ[-cHXXe,2ciemck峌巌Y X Z Y [ƊXƊZƊY· K紙?` k`u 5.j`8k\0qTd ^a V׸`\ォ| 5.X]B6*Dy!p?Dm#!2G-m !oQ6BȆ@!j!Ff̀<7125UfʬL6d 7F62cɆFfX72md62 Fj,dcסe6>51֍,jY,dC#L,F!c,p/&Fl# ِ1,F,FVAo>11 YjYdCp1PUm#+l|N 甬jYdC1ȪF6ڕMmdSȆmd#25|5F6l#ِ1xF6lF6!c^4Mm#J6znH#TӅ}PPl#lFF(J6d ^7BaU6BɆmBjFX񎭉&z0؋maadC~೟00l#lnm aFF݆#ۺO?gw5Ed0wws^9Ȯv\.;\dWo..hgW=3j;^~8te ^¡pp\ɁA8j׃ph#\m#ۈ -zĈ=f1#6"!cpFFA6d oEFA6d GD@jF$٘]8Ǚ7MH^dCjF$ِ14M#6"H!c3jF$ِ1Hh#Rm#A6.~u#xNv96r`9Ȇm6rm6r mPȁm 2ȡۈ"i{Yo#J Rۈ6ȆmDAQjQFِ1x((l#l9ImDѢ߈FF4M6d o -6h!cpFF4M6d ދFCjF ۫{#9KcF'&FF C6d n#ڈQۈ6bȆ8Ĩm`1dCsJ m$\ᲉSԍnTȉm$2g5'|g5FNl#'ِ1x FNFN!c)sB96rbȆ{TibggRȅm"2`ȥ E6d c3ƲdZ4A \F.!c~#Km#ll~D&FnN )6rcɆazɭM6d oVȍm&2ȭC6ry#s_ԍcbF>oSȇm#2`ȧG6d n#Om#l|ȧO6zo ۋ6cɆF~X7m6 SuJ~F~!cȯۈ#czĈu#֍88l#l9lg πĩmaqdCF76Ⰽ8!cpqFFQl\6&F|[@mQlyJlQً?zd|i('zjzdCpc-q=aim6 `/ZOmQlnԃ6m6꓍^|l|LF_>p#kWۨm'2V>kQۨO6d n>Q_m>QlF}hF}lhZ7"3Lhj dC hF!c~7m46 hnqLCMҕ;7I j "]?_ow4;0`{_ o w\܋]7I =o q=hD[#_L5zF׃Fte _#蠑A#\H-HFF#FFc៯SLb?m46 aXm1јl|?m46 ?C6cMFVM21֍&jM&dCp1&jM&dC=fc6Qhm4!2M&jMdcԩW'MEh FSFS!cjSFS!c9)Sm46 c31jMfdc_Ǜ͜4#ʛLmьl|Oj hF6d ^7LmьlL dF3 ǹ/Nzg8hn9eeeeeeeeeeeee XWX7XwXؗ^ޖ>~,c,c-c,c-4P}??bk׸Td 759qͩLL׸Td 7755_ hCƚ-D-6Z`-Ȇ&bF lِ1-6Z`-ȆF FK;kAߙ-FKFK!cFKFK!cp-j-dCu%Rm%ъlo|&F+1sJ+VF+!c[m6Z hmRhm"2VjdѢ21Z jdC{nkFk!c}pFkl5ِ1FkFbꥉ#M6 6 6jm6dC}m6`mȆO|ڨm6ڐ PhFl-hWCGߘmEh F[F[!c~-7ڪm6ڒ )mVm-іlYp[hF[l٘?`*Mv͋ȆvjvdCsJ;8Shm#2hhG6d >6کm6ړxO\^^m=ўlm{jdCF{oWhm'2h@6c.eujbtttPmt 2:mt6: mtPmt 2_v6:mt6:{&FGotFGFG!c^#E;mt6: mtTmt$2jNdNZhbtr}~ٰ}ImщlNjNdCό;gƝ6:aȆF'hF'l38ƅ&Fgq>Lgx>LgFg!c::mt6: ׍ΰntVmt&2謶B6gܷE)]Em хlntuFl ِ1xF.F!cp].j]/FٍOߝkb|!{__m|m|A6d S7:c8lT{2pyj bhm|m|A6d ^7u //Ȇm|m|ѕl8cbtu+]6b]Ɇװ]FWl+ِ1FWUm+ѕl mtUmt#4MmtSmt#2F7lِ1xF7nF7!cpݠnjݰdY&Fwa;]m;ѝl|ϼ;3﮶N6d <;|]m;ѝlFwhFwlو}W\7z~Flِ1xFF!cp=j=dC6z@=6zm8>|[mۺ//"0wws^IT;\܃]ӷu_»i^⟾/K\z=_>bD] b 犞׃te o[T;AOr c'1{E'1՞FOF/q]L^Z/ F/lِ1s^9I/^F/!c1{m6z M{A6zaɆ͝Lޢ gjdC=focVm&2a譶M6d G6zm6潫eL#>pN飶C6d }6`}Ȇ{>裶C6d ^7@}6`}̽LnuF_l/ِ1֗lئj}dCu/}6b}ɆF_hF_l#œۚ~F?~F?!c9Sm6 mSm#2~jd#e=#ۘ996cɆ{O6d n?_m?џlFhFl+Qmդ6߶21WJm+l+!c_m|m|E6d N SR lWWj_aƘwm^^oab ggPm 211@6d nc1@mc1lۂ@qRQ%ŷ᷌6bɆa)b'71Pmc 1l|N甁jdC{_jAdegଦ& A !c1֍AjAdC6A6aȆm 6m 6gb `o Vm &211L6d > s``!c5`hc` 0Nqf9C-c_[ƆYƆ[ƾ}kemc2ele8xD$dT4؏閱,c,c- ?߲?!7{!7׸!Td O7 Q׸! 'cW#@`7׸!Td > 5n Pk Lbn(ܧ1J6d ^P^PP!c516wyhxPZCdCPhcPlk&ע7F_m|m|M6d } {66&2RaHa?> bhm|m|M6d 50Y&01 s0a0!csajðadC0sJqgswZðadCuc1Lmc1l88X.pX7m 6 ׍n Wm '2?n8|[7>mw$b #E|]\9/$ߩ|gw`.sZ8~8)Lg^/v^;\{>,B\1ûte mۺ{r cP=Y! V|O"d G|m|=1l׮1VXwCc6bcɆ-1Vmc,1lX|uXlc,ِ1Xd41~6~6~Plha>\ʞ dC06*9c|~(mZ?`? ?@?mm#l\'֦t8lcِ1c\Sm#2nn8lcِ1xmSm'_@1c ǫm6Ɠ [6cɆm6ƫm6Ɠ ?'mWmL T11&9eS&mL6& ׍ nLPۘmL 2y|ylcِ1xݘmLPۘmL$w]+lbLt0Da'mL6& a/:Qmc"1l}}jdCDhcDlc6BAc7&~c$lcِ1xݘ$I$!c1 ֍IjIdC{ZIjdܳyƙul4N&jdCuc26&cɆdX7&mL6& ׍d1㷥L){)jS)dCuc S6`SȆ{)1ۘB6d oL6mL6E_kbLMMUۘmL%2`*`Tlc*ِ12)S6bSɆmL6mL6U:e\LSۘmL#2`ݘ1 ۘF6d nc1Mmc1l| ; ژ1 l8o|#ٰRƏƏdCƏQmGlG!cp?B?mmH6d ދm#1l|9MnLuctlc:ِ16cɆmL6mL6 )ӡjӱd`_g11fDsĘA68tȺ1Cmc1l hc lcِ1  !cu hc lc&psebuc&36fb3Ɇߘ1ۘI6d nc&1Smc&1lLhcLl'Qη21~?}џ6~6~"27~Oj?a?  Im'l'!c9'h'YdcS'g1KԍYnRۘm"2`ݘ1 ۘE6d 1 oRۘm"2YjdUIn}Ę-fýjdCag簳6fcɆm̆6fm6f ۘ mVۘm?aXkgo[`2222222222222222222eleleleleleW0s={wP4Gs7G]7j'w97׸9Td ́ukq2ߧku翹d# l&\3_c.4[{s6bsɆ湰o1ۘK6d >ͅ\\!co.1Wmc.1ltg,&<1lO-mSۘm#2FfFfXt|cS9e|lc>ِ1x<6cɆ|X7m6 ׍|w>;&ac@mcld#3416` Ȇm,6m,6 Xm,PX`gmȫx#u?7~V.\ݺj?{v~[35~Vw\܋]<ۺ=Y}`!F*[(BXB\ݗ13f#5ED&u׃@--TXB!czXXD6?=X$l,6m,6 .5b"lcِ1xVEjEdC="hc"lc18յDZt&b>b8k,VXm,&218c8lװ bhm,6 X m,VXm,&2?e1Xmc1l$5&ac Dmc l=%=%jK%dC=c.QXm,!2K%jKdK4&R1,sRR!cR6]XJ6d ^7ºTmc)l|s)Tmc)lh{Le2hc2lcِ1e2e2!cpˠej˰edCucLmclZj&rac9\mc9l]{j˱dCp\mc9lrhcrlcxו& o  !cp+j+dC6V@+6V`+Ȇm6Vm6VexX)l6Vm6V X mTXm$2XXI6d nc%Rmc%lZ7J)JmclXUjUdCUpJmclF&JmclzgZcXXM6d ^7VúZmc5ljhcjlc5ِ1xX mVXm!l Kmbs8QXm!2X7֨m6֐ XmQXm!23_mQXm%}SRcx/c-|/cZlc-ِ1xX ZZ!c5Z]XK6d ^7Bk6bF#M*abuc6aȆ:X7֩m6֑ XmSXm#2rNmclIs)^a^mc=lzhczlc=ِ1:e=\WXm'2롍j뱍 du516֍ j dCooP؀ml 2ؠ@6d ol66ml66N&bbl66B66bɆިH6d ދnFF!cpjMdNJlbl&؋nR؄ml"2o|o&lcِ1x 66aȆml66ml6~!?um/ۺ_6~6~!2_)mmB6d nh__Ȇ__6~66sl|,ll66ml66 l\ia;flc3ِ1x66cɆml66ml6 GiWkblqv ٰmVoQ؂ml!2?S} Ws 2;j;6羬Npvҋ<qN,c-c{,c{-c,c-c,cYZY[ƎXƎZƎYƎ[NXNZNYN[X~a;g;o`h2v2v2ܗT{'ic XvkN\vR1D 4T׸'cָ׸Td 5n.$xM]b]j]dCw .].!c=]pe.lcِ1 إ M6np.Y73dcE[nn!cgjdCuc76vcɆm6vm6=ڏob}{6`{Ȇtm6 =!c9eGmcl4y_*=cثK6d ~^~^^!c֍j{dCuc/Wmc/lLa c7~c>lcِ1x/6aȆ>X7m6 mS؇m'g Zt/l6m6 )ᜲ_mc?lnuc~lc?ِ1~wgӪ$Lbܷ?q8@6d nq@mqlnulِ1SjFJ4ab&onِ1S~S lnoja CoA73LAhAl ِ1AA!cpjdCu qPm ql9&5=Em6 {~{Hmql!h!lِ1qHmql|q*`bu06cɆװal0ِ1aa!c90qXm0qlvSM#hlِ1x8#!cpG#jG#dC6@G6`GF/]21:d{Tm(qlݳݳjGdC6BG6bGɆ産Q1Χ1Mcb_=q 8F6d 11c1!cpǠcjǰcdCǠcjǰdAC˳&q S̏ jDZdCpr\m8qlqhql8ِ1x8mW8m <8!)': lِ1L/aS'6N`'Ȇᰑ(щb&Fد& 甿66&2u7ql%M&u suq6cɆ}X7m6 ׍nW۸m'2RakI }lAgu> !c~7m<6 ׍nCC!cpCl!ِ1xxCC!c9)6m8>zdְ>o3=Z#sqwH݁ӷu*?}sq/vq΋{H}z_3{,cXc\ݗ1\:xv׃@1"zD|xxB6}Dcb<n'!cpO'jO'dC06:c8l,;?q@eIxm=SS!c16κd 31q5*db<g=g=Sxm<#2 x xF6d  v6aȆal;c8l t]Žb23l98\a\m9lshsl9ِ1)6cɆsX7m<6^ zL71^89ٰ(Bml | lِ1x//6^`/Ȇm6^m6^^7fbu%/6^b/Ɇ| |xI6d >sKK!c@_@_m6^uJԍWnRxm"2`x xE6d nJmlF g &wxm&1"`ZԍװnVxm&2xxM6d n5Zm5ldcb_m6FzN41řxxl#l7o,īmcdCkxWۈ6Ɇa5wƠghHCk#xC6-Tx㍨o`xxC6d o7!c֍7jo7dC0sJ gsJTZod;ož[/Vm-l| aߪm6ޒ x mUxm%2QF`ZowdcEG51މ22ީm6ޑ `Nml;h;lِ1̜Ra#ݘr 'xO6WN31ދ=p{l=ِ17I7I6cɆ7jﱍdC>k{@6\jAm|Pm| 2>k@6d ^7>Amlv0 O0<{Gb˘e,e2fsyX<-cI-c^1o˘e222g󷌥XY[-c,cAL=/ykeyոIODDhcO?1xKjOָD^k\"T>{pKL6 ib$hXm#1l|KjdC6C6cɆqN m$VHmsUl0pu  lÅlnᢶm ӹx}: lÅl<hEmHB6D&FNI6`IȆbx$jI$dC6@I6`IȆTI$jI WQ_fb9)j؆+ِ17\W WlÕl|Nqsچ+J6d npUp6w':psS6ܰ 7!c~ njn؆ِ1 7hMm p#2mmad@x nú᮶m 6wpwG;2A wlÝl܆;᮶m Іچ;A6Κ}! oxmx`dChCm 2mxmx`dCuP6<u=L OaT6<Ɇ@k{mxbdC6< O OlÓl|Tp|䕔l$Nd>uIaT-"]m]R[$U;Hjw`./m]Rx~R7bOyqtϓyR\oj9|~#`᥾^xݗ1\ //\ȁ1 ^ІچM6izۃ큾V6Ɇ-ᾅچ7M6d nV6ɆV6|Fw/z>bmg  lÇl3چC6d nQ6|Ȇ>ІچK6:Vy:VOil& ŐLU6|Ɇ_8mbdC6| _ _l×l9/᫶m$# g ^H&F2X7m$6 i%}g2dF2!cdp/ FZl#l&FSm ׍X76!c~#jFِ1oxP6ґ8iMtbNItj鰍tdC0ښ8c8lZR{xZ鰍tdC06 :c8l.uQ16aȆϿMtj鰍d'oebhzFz!cuJzNIHO6d oFzFz!cC6cdcm&&F7am T6ɆmBjF ِ1:%T62zL j dCh؋fPȀmd 2Ƞ@6d n#Am#D6ry.6 l#lۂ mAFD6d n#R6Ȇ66d&FF1dsJFFF!c~##72md62 Qm##lnd62md62GImdRȄmd"27Z8c8l4[>יf bhmd62 a35l&LF&!cuJ&h#F&|Dl9#22222j e[",c(Xe,222222kgoL5B?` b5.׸`q29qS1xo {`u 5.j{`X5.!d# ckb/!j!Fِ1n Q6BȆC~FB6d n#Qp||[NS+̷uaȬ.\.3tY ݁m]fdVo..gV̸d{>Q ,b~ςA2Y,jYp=Bd >WdsE,d!2_+e6md6Cw-^P*X=jYdC6BY6bYɆmd6md6 YjYldmD 6aȆmd6md6 $F6l#ِ1::Mm#J6J9%Lm# #2S 00l#;11֍jٱdCu#;6cɆpNɮN6d >d6md6 .! mcdC{ZpO+\m#'2mmcdCsJ8mDKR(mbD8m?a+jFِ1D 4DmD`dCF7"6"!c "l#ltLHQ7"a݈Tۈ6"ɆF$jF$ِ1x݈u#Rm#ۈ$2FF$l,_)&FganJa;-Fl#ِ1FF!c^4Esm6r 9j9(q=UL(76(!cwH;$QjQFِ1;$Q((l#l66hAÒEMhּ,M6lQGmDcdC%F6h!c~#jF4ِ1x mDmDc1dњ*lbĈFF C6d ދ^4Fm#ۈ!27b`mĐ ׍h#Fm#I6~7MA#ӆ8%'03sm6r Mp16rb9ɆȩI6d ދ6rm6rUZ/`bu#6raȆF.X7rm6r `Km#lF.h#F.l#7H>3ϼMb_47ͭM6d LnLnFn!c֍jdC6rC6rcyFyy|F>!cacDa bhm6 ׍|nSȇm#27A6aF,cb6C6cɆF~X7m6 a/_m#?lF~h#F~l#l{%Ĉ6⠍88l#lFmđ )qpNSۈ6Ȇ8h#Nm#(@6h.Q@(mP(m 2R>O)Q(@6d nQvU N8)PJ!H`B]mp'2mmcdCІچ;Ql\qQEԍ*nTQۨmT!2U`ݨQۨB6d oQ$U6`UȆFhFlÃldM چA6d nP6<Ȇj؆ِ1 hCmnq˪}ќ"φqi92V2mfnհմղնձZZY,cFƖXXSX3XsX Xe,2l I5ѭ1dc/3L O|6| !c9)>j>؆ِ1 lÇln@>j>F :ydL&F 1ԀsJ F !cQ֍j5dC{5n F !cp5j5dlcǡ&FMa&QSm&QlF3llFMl&ِ1xݨ FMFM!c9&QSm&Qltxk &F-װ6jaȆ{ZQ ۨE6d ^7jQKmQlnԂ6jm6j%&Fma6Q[m6Ql|N jdChm؋Vۨm&2?6Q[m6Qlwm{ZQڨQۨC6d >ԁsJ:F!cpu:ju:dCsJhFl×l5:GWS|:Wm%2_uچ/K6d DNx4,YZ؆/ِ1 _hWmۨK6E^F]l.ِ1wuwu6buɆF]X7m6 ۨ mUۨm#S:^l01 zjzdCu6aȆ{zQۨG6d nQOmG68r51Ĝ? ?lÏl ?xچG6d kX? ?lÏl66 ͿLnb Іچ?O6d >9_m'2S⯶m a  l>٨iDIMF}hF}l>ِ1:%ayQ"A F}!cpjdCsJ}hF}lh|Lb am46 ԍVVŭTZ dCFo4Phm4 2S@ 6` %;Mlb4hC؋6Thm4$2hhH6d o4FCFC!c8NhnW#(ۺFZ4Rhda.r~[׈|lh\\렑݁m]#X~#7O.lG*=op=hLr~Ezփ׃te 6 qp8(qWTb bh4191x"zИD|h m4Vhm|o#@P6Ȇ 6jFِ1 l#l 66&dc탘ޙMDM6`MȆ- 2Fl ِ1x$M6`MȆצM&jMdi551h~FSl)ِ1FSFS!c)1m46 ׍FSF3QlH ^͜s)֎cCMi hF6d 3|* chm46 `LmьlF3hF3l9hs^bE6cɆa֦͝16ҵ`ZͱdCu96cɆ{FsF 1g+Xj-dC6Z@-6Z`-Ȇm6Zm6Z ׍F F ٸ=l&F ~[m #Ɇmj T6Ɇ@8mbdC6@@l#ld"s#HS:%Hm#"2AnmaAdCk R6ȆmAAjAF0H[b͌&F0Nde_o6`!c FF0L6d ^7aV6ɆװFF0B6~뱉"F!j!Fِ1:%SB6B!cm !FF݆|9F8PX+Xe,2akmkcuuuuEYƢ-c],c1XXWXeeeeeeee,2r>LKqǖ?qj)i iq-qkI5NQKT׸Ƶ'c5UKjq-qkI5N5%q-5%BFڬ}`bv(\ombdC_(B6BP!c(FjF(ِ1x mmbȆc#9}x|F+lِ1sV`+VF+!c ֍VjVdC6ZA6Zaadanm ׍0X76°0!c9 ajaFِ1* S6ƶ[51Ś*6±p!c`F8N6d >9%\m#'27¡ppl#lMa#ڈPۈ6"Ȇ{؋FmD`dCsJS"6"!c9%ڈPۈ6Zr6zibsJk8Vhm&2^5^Fkl5ِ1 g 3X)hm&2hhC6 =yFOOFm цlD Fm цlFhFl ِ16F6F$Xyxk&FS"mD [ Tۈ6"ɆHoDmDbdCh$m%++&F[1sJ[F[!c~-7ڪm6ڒ maVm-іlFg ˰=d F;V%hhG6d {]Shm#2hhG6d c3Ʃ^xZd#Z51ڋp﫽F{l=ِ1x6cɆpNihO6d c#3љ5=Chmt ty`蠶@6d nAmсlntuFlِ1:^+}!chmtp|n]"jEtTha.,9/zj]ۺwTo.]w/>cuwtR;A'r cz  ׃N$B=f'hF'l3甉ٹoalt&ͤjdC6:C6:cɆmt6:mt6: aYm3E6/>ibD}(omD ?CТ6(!c3 QjQFِ1x݈u#Jm# ۈ&/S;;dvlF4M6d ^7a݈Vۈ6ɆmDCjF4ِ1x݈u#Zm#B6w\&F1tsJ.F!cG袶B6d |Em хlFVg ~gmCk C6h軣&F&7~mĐ ׍X7b6b!c~#1j1F ِ1-_a?xZݱdc~=C|~Cmуlփlئj=dCpCmуlƆ3罯T bhm6zӿmSԍnTm$2 E{m6z =aSm'ѓlFOhFOlpwD/ 6zaȆa@g '6zaȆm6zm6z { bhm6znba{簽6zcɆ):Fol7ِ1FoFo!cᰑ5qlO16zc}OC7?#>pN飶C6d c#a#žICkчl{>j}>dC06<16lQmēgbbċFF<O6d /E6ⱍx!cpFF<O6d o~#^m#K6R/?bW mUm%2 7m6  mUm%27~F_|0=A,cC,cC-c?ZƆYƆ[FXFZFYF[XZY[~MMMMMMMMͰʹl98:Q`OԸ~S׸~'ck\?\Q1xk\?uk\?q2q`맮qןl LFhFl?ِ1^L_m?џl|?ܧ믶O6d Q#o31jdC}7Pm 2挑_m 2_ojd]`}֘>@O7Pmc 1l|N甁jdCs@8 Tm $2S9e@lc(JMA hc lcِ1A A !cpAjAdCs 8 Rm &419e0Sm 6  m Vm &211L6d O7 Vlmz;ƇsZvI?_<ѧo~}j?m?ᄍxgH8+~Pp=B5zCľx\ݗ1ct0D`Cȁ tE `1x9C6`CFg]bb 6BC6bCɆCcPlc(ِ1PP!cpCjCFhƥ.61~}ďQmGlG!c>GG##ِ1ŏp&QmGlG!c3Æ4 bhmm #3Bc1 1 F6d ^71Lmc1l{ajðadCka1 N6.{|c11N6d o pp!c1֍jñdC6C6c#F\x31F~c7Fm6F )#2Bmc1lnuclcِ1o1Bmc1lo?9&HQ7Fº1Rmc$1lHhcHlc$ِ1HH!cp#j#QdcĦ)21FQps(lcِ1;$;$6FaȆm6Fm6F mRm&]ܧ5-hX7Fm6F a/:Zmc41lhhchlc4ِ1h~##yy1C6d S7>pذ)0Fmc 1lhclc ِ11Fmc 1lxλ=tcE^tXlc,ِ1x XX!cpcjcdCuc,c6bFO51Ɖooǩm6Ƒ b8lX bhm6Ƒ بafI 8lcِ1x8qx瀛&Exx!c93Fz˻&1O6d g>Wm'2a1l06$':|ٰ}OOdC0sJ3FjZ4A Ȇ生OOdC{_?6~6&RW'?Ę ):elcِ1x16&`ȆmL6&mL6& ۘmLPۘmL$71&D^OKM$ے8t?6&bɆaS7& ?z0Dlc"ِ1{{6&bɆ甉pN1ۘD6poebL{_$I$!c)IjIdCuc6&aȆ$X7&mL6&[&o8ĘS Ɇ/&mL6& )2Ymc21lYdmdlc2ِ1Lݨᰱ޹HCkc21l|]ݗL)ߘ)jS)dC6@S6`SȆ)S:elc ِ1xݘ)Ta)&T1oLUۘmL%21ژ1ۘJ6d >LsTT!cpcTlc٘x3q1M`1Mmc1l4hc4lcِ1xݘ4i4!cpӠijӰddIR 31 ӡjӱdCt؋NWۘmL'27~ctlc:ِ1t oOCMߘj3dCòoPۘm 2Sf9e lcِ1x136f`3F-z7Ę)l̄6fm6f ׍nTۘm$21ژ1ۘI6d 1oTۘi8gMR?8} g"~0O.雤aYgsq޻:/dM?ܗU99̲1262626262222222222222222222elelelelelelelܗYTvUv,8RWYx^EUL=,Xf,<͢z&c~xg+,<͢&cgyfk,&t1[{6{6[mc61l {jdC=l8Vۘm&2yfollc٨xv_rL9b=v?s6`sȆX7m6 ۘmQۘm!21ژ1ۘK6bO8&Ę+l̅6m6 ۘ mUۘm%21ژ1ۘK6d nc.1Wmc.1l9qocxl|lِ1`g HZdC6C6cɆ|X7m6R_X ) :elcِ1; ; 6` Ȇm,6m,6 / 6` Fxe/ ].tAwPmc!ln:c$Od$Pmc!l| am,6 Xm,TXm,"?/]~>$X$"X7m,6 `/HmclEEjEdC6A6aƥƚEX bb!cm,6 ׍Űn,VXm,&2XXB6;kDԍ%n,QXm,!2K`XXB6d nc Dmc l|Sm,6mb,uod ӊrTmc)l| am,6 __Tmc)l\\jKedcOv61epc2lcِ1 )6aȆalTqH"2e2!cU16KCkclZv꒝LNfca9ٰ}\mc9l| am,6 a5rr!c~c97m,6V'x`b oPXm 27V~c lcِ1  !cpk lc%٨z{L]]j+dC6VB+6Vb+Ɇ{ѕ]XI6d ^7VºRmc%lЦZ[c`X XE6d >s*U*!c^tEWm6V SVu*UjqUcx>OYXM6d ^7VúZmc5l|NY jdCsj8VXm!l8}FSu5!cpk5jk5dCs8QXm!2XXK6ʸ.}[ bw`.*9`ᄍxJ_ۺ_\&瓯2I`I}7zMؤv ׃M@`"6zD{Mjdtl7\66cɆ ެL6d ߹VjdCkpmYmc3lScg-j[-dCuc [6`[ȆX7ml6 ׍-nlQ؂ml%u<cS9eVlc+ِ1`g 7ICkc+lnlucVlc+ِ1x[6bƐRc`ئ F6d ^7Mmcl|m Mml6 )Mmcl _ҲQcخN6d ~vxvv!c9e;Sml6 imj۱d^/V;!c֍j;dC6v@;6v`;Ȇءnq>-ϐqٱr.n^>~A!دÖ#c㖱,c'-c,c-cg,cg-c,c-c,c-c,c-cW,cW-c,W)qAibwkN\vR1E;E;5n'q;5n5n'8;S]voوslbk]pMKmcl|]j]dC6vA6vaȆm6vm6v53._-Y YݭM6d ^7vú[mc7ljdCnV؍m!O:019eSm6 ׍=nQ؃m!2أC6d ncGmcluwoMcFf/Ff^lc/ِ1Y^^!cp{j{dCs^8U؋m#]11~c7m6 mS؇m#2اG6d ^7Omcl>[i&~7wd)#//)~~!cpjdC6C6cɆ~X7m6 4oا;m6 `q@mqlhlِ1A-\^&AыAA!cwm6 8mT8m$2q8q8D6Z4qH8mR8m"2S9!lِ1C!C!!cpCj_tL_) _6~6~%2F2Ս_6~6~%2+ƯƯdC03Æ1 bhmm&G/6E8 aa!c~07m6 6cɆ):al٠*GD/zG6`GȆ#pN9q8B6d ^7qDmql#dFl(٨;+GQqTm(ql|N9 産jGdC6BG6bGɆ8q8F6'W㘘S91lِ1r )6aȆcpN9q 8F6d >s1cqu㸰q8q8N6dd|'u\m8qlnuql8ِ16c'ۡϖ31N~7Nm6N '`qBmql h lِ1x8 v~3%2_}7X-~S.\< t~[9hEGNpq]߭ w77O?}[#~Sp=8IsF1Nzpփ׃te c=I$2'j'q=8I"d c6Nm6N<*eb6NA6NaȆa`g +6NaȆm6Nm6N 8mR8m&r-fI1OYil4ِ14\V8m&2_jdC}iGV8m!:t9qF8mQ8m!237Ψm6ΐ 8mQ8m!2 ?Ϩm6Β͵R')fb{ZgYY!cq֍jgdC]]U8m%2q8q8G6\8's8q8G6d nqNmql8sj簍sdCs98S8m'giz21΋9ql{jdC6C6cɆpNqnxgݝfO|[j+gjϰgdC{^3g3!cgp3lِ16a;pb<u96cɆpNyxN6d ^7ú\m9l|Nyjϱd~͒71^8;ٰBml|Nyj/dC6^@/6^`/ȆpNyxI6O8&RԍnTxm$2xxI6d n%Rm%l| a_m6^ G\ޚorAJml+h+lِ1:\Rxm"2`x lLvκߘ^؋ِ1??66 2dCCmlOqci'ٸy|hƟƟdC蟰SmOlO!c9O8''ِ1Lݨa{uO?d?{ebkoVxm&2axxM6d ^7^úZm5l|Ny j7d~FxmQxm!27~l ِ1Fm l 7 7jodcx{?71 ojodCaaUxm%2xxK6d ^7ºVm-8ɟ AmmE6d ^7u/Ȇal9cI __dC66R xG6H1,w㝰xxG6d o;w;!c~7ީm6ޑ {6a &-Vxdb-dC66Vl|N)mmM6d aVxO6D&{oWxm'2F2Vޓ [zxO6d ^7ú^m=l{h{lMhlِ1x!cplِ1Gx3LGhGl#ِ1;;6>bɆGX7>m|6> ?O|ThaĖ$/,cI-c,c-c.1WX XJX*XjXXZX:Xzؗ ,c,c-cY,cY-c,c-c9,c9-c,c_[r|tJ]ոD)8CN?1z;+Zoϩc?1xKj?:q\S'NFF61vbWNHL6d O1eU NCk#1l7JzjdC6C6cIȆM$Fh#Fl# ِ1I\I6`IȆFX7m$6 FI\QoDm#݆#/F~ۺ/LZvI?_OF6Lux2dF2!c=`g lJ՘hZɰddC$sE$SHm$#2= N HN6&D lb$u#96cɆFrX7m$6 L\m#9ln$u#FrlÅlXMM W+zEmp!2mm`.dC6\  lÅlY+z좶mI |pu W WlÕl܆+᪶m pUp6\Ɇ+jF 8@5有iuOA6fUBm#l|mMSm6R MSi F !ci NIHI6<#طH -Rm6R w)6Rb)Ɇ甔pNIHI6d ^7RºRm#%l|4r&F*(+GTdc[@H HE6d ^7RJm#lnu#F*l#ِ1xHF*TFj-Г&FjoFjFj!c֍jdCFjoVHm&2HHC6H31҈9% SҨm6Ґ CCFm# l|NI4ji4dC6@i6`iF̹ /i]ci]љci6biɆFZX7Ҫm6Ғ H mUHm%27~#FZl#XYGMtnu#F:l#ِ1tF:tF:!cwӹwөm6ґ ׍tnSHm'cgzwH/l6ҫm6ғ HmWHm'2Waüݝ%A Fz!cp+FzlKQh jb|)z/a/ƗƗdC{__½/66$21R6WZ_b_ #-{4,SZ_bFM+;hbdFodPȀmd 2`Ƞ@6d W6g >Fl#ِ1LaȞ Fl##٠Ŝ)62bɆ72jdC62B62bɆ甌pNɨl\\8ʕ?+~+Ȇ}WWdC0s3Æ66"2_|)_m|md"~rhIԍLndRȄmd"272~#F&l#ِ1LvpXoȄmd"22+2F&l#3hPkFM̢ {jdCu#362cɆaF5g \c} Ffl#3ِ1x FfFa;M,9ܔ,dö!Em# l{,jY,dCu# Y6`YȆ7,jYdLnbdsJV8dUȊmd%2F2}Um#+lnx;c8lTr>A FV!c֍jYld#Y/WfbdsJ68dSȆmd#2 >Oɦ F6d >dsJ6lF6!cuJ6Nɦ N6<0y]SuJvFv!c$cD jٱdC  16*Ѥ;A Fv!c9%;Smd6r>nC)9Cm#lj9dC0FKgȁm 29`ȡnqLNM&)MRNQ|Vc9"rE'eo&)'9r|xP7I9oPX"ŵw?|D~+'9<'螿gC/+r" }׃\R;ȅA.r cP=2f!%ЊȅA.!c31sm6&Jjs0M6lj|55ِ1#aij_c_ ?C>CZmklk!cp_C_m|m&Rf[a[m#7l|?rm6r  bhm6r a[m#݆ܗUܗy6,<9ZYƾ巌}k+g2V2eee2V2V2nbjܢ&ݻqēj׫ok\\P17y7y5.qy]<]<׸|F>!c֍|j|dC33Sȇm#2(F>lѢj/,31uX7QlF3g ճG166!2 77dCuX7QO6&I׳R#8$+:$F~l#?ِ1Y]Y6cɆȯO6d ^7ú_m#?Qlz=&F|W@mQljdCP(m 2E ^Fl H[b͌ M~ԍd4(VS m6 ZZPm Ql-{тjdCH%bߟ*Q(D6jXwQHԍBnR(m"2Q(Q(D6d ^7 QHmQl\B\BjdCv-gbvfPl,Q(L6d 0|SXm0Ql- {jdCha؋V(m!llQD<, Q(m!2Q(Q(B6d >sJ"F!cpE"jEdCۡM jEdChQ؋U(m%2Ea(Q(J6d ދhQF1Qq?F1QLmQlnuF1lِ1bF1bF1!cpŠbjŰdk9fY]Y6cɆFqX7m6 (mW(m'2S9FqlX~j&F Q7JQBmQlnuF lِ1W UBmQl|*Q(I6;Njb6JB%6Jb%ɆFIX7Jm6J ( mT(m$2Q(Q(E6|[|"S.\< t~[M;0wa~;xSw\TsJE؆\R&8k릶m wN7 7lÍlnᦶm  7X76ܰJdIWlbTsJ%8TRۨmT"2`ݨQ ۨD6d ^7*QImQl|J|Jjdn41*Q֍jdC6*C6*cɆ):Fel2ِ1xݨ Fe؆;TF&Xú5چ;N6d npWp6Ɇw8mcdC;76ܱ*dcɀf31^ EmT6 W{U6`UȆ*pNQۨB6d ^7QEm A6wm!j؆ِ1x/{Q lÃl܆ᡶmx ?C<6<6Üg'ȿgvxZUy[ƪYƪ[|,c5,c5-c,c-cu,cz1?˘eeeeee,222222h [B,xRKg ?Nb󟧺yI5N58Ou5Γj{#Oyk'qTd yS]7ܧV6 8Q ڨQ ۨF6d nQMmQlݳjݳjjհjdCVVSۨmT' RjbTwОjձdC6C6cɆpNQۨN6d acLCk:C6t#)>p⣶m 6|6| !cp>ІچC6d o~GmۨA6Vu`bgpEgPۨm 2_Ԁj5dC6j@56j`5Ȇ)5:F l&H46[QSak5lMFM!cQ֍j5dC6jB56jb5ɆFMX7jm6j QY7B(F-aZb`-ZF-!csjsjm6j psHoJ F-lِ1ZO-ZFmѭcĨ-7jjdC?ULmFm!cQ֍jdCsJm8Vۨm!k{XĨ#FFQۨC6d ^7QGmQl|ߨQۨC6d nQGmK6Ocb _᫶m  _X7|6| _!c 놯چ/K6d o~WmۨK6ep:EQWua/ZWm.Ql{{judCgmu6buɆ½ju6y3ɿE=zvI?_3m]=r|bɋ$A=sq_^m]=x~=7O~[W~tpCOi=-?-྅ځ~@s+"p=#2_A~j~؆?ٸ$Űa&#aeW6Ɇa`g qwj؆?ِ1s_m'2#a᯶m'_;Ĩ/lԇ6m6 iՇ{Z6cɆF}l>ِ1F}FCLbNij dC0kO16v>16` ȆpNih@6d 6mצ 6` ǽ= 61֍j dCFCo4Thm4$2l;m46 Pm!шlTﷱ&F#6mצ6aȆFpNihD6d >4sJ#FF#!c^Em46 G󤹉XAAXm1јlFchFcl1ِ1EcrmhL6d ^7úXm1@6v3#@P6Ȇ8m`dCF76!cFFфl/ML&Z Fl ِ1xhF&F!c֍&jM&dCh؋6Qhm4%gM`b4hS؋6Uhm4%2MahhJ6d n)Tm)єln4uFSlx;|IF&F3ы6h3fF3!cm_F3lِ1fF3fF3!c ֍fjͰdܗ+ok`b4u96cɆFsX7m46 a\m9ќln4uFslو q9BԍnPhm 27Z~F lِ1xhF F !cuJ Ni$˖31:%S6@!cpFF H6d n#T6ɆmBjFٸ?bb9%)AjAFِ1 l#lFm )ApN R67;&FSm 66`!c}`/m  V6BZsJSB6B!cB\!j!Fِ1x/{l#l9l|bc;ôjke [",c-cm,cvNΖ(Xee,2kjuu[Z·iI5n\ i8ﺷtEﺷT׸Ƶ'c%[k\K\ZR1-5%q-7j {d\01BE PPl#l7 QF(J6d >/Tm#%2 mmbF;]h7Ȇ׫[m6Z ׍VnRhm"2`h hE6d nJmF6/5|61D00l#lnm ׍0X76°0!c9 ajaF8٠~üpN6{ MnF8N6d ^7aW6ɆmCjF8ِ1xu#\m#ۈ ;: 61"Dl#lۺm]FA6d n#ڈPۈ6"ȆFjFkdk _yu|ߚl͸+h1Fkl5ِ1xh FkFk!c~57Zm6Z ׍ְnVhmȫӷum`F-]xRvO[׆؎jv\ݺ62Q6o. m t{4]J^1#ݏTH\"nj=fA$@sE$A$1x=6"6"dcmF[F[!cooڪm6ڒ ?k Uhm%2hhG6 &F;|NmюlhvjvdC}D;GShm#21F;l=0^ԍnWhm'2S1'w^m=ўlnuF{l=ِ1xhF{FIqڴ\vPmt 27:~Flِ1xFF!cpjdc޵ikbt6:B6:bɆmt6:mt6: a/Qm#ёlFGhFGlٸ^b̬7eLNbNNjNdC6:A6:aȆNpN餶 D6d nImљlZqi~+~Fgl3ِ1EE6:cɆFgX7:mt6: a/Ym3E6Zv&FmDmDaQdC(NRۈ6ȆχDmDaQdC6((l#l8>J[Ĉ6hhl#lF4mD ѰVۈ6Ɇh8DmDc]g+fbth؋vQmt!27~Fl ِ1.F.F!cmt6bF*ڃ31bD/{l#lF mĐ 1߈Qۈ6bȆ8Ĩm`dS/lbĊ FF,K6d ދ^4Vm#ۈ%2 mĪmbdCsJ,Sb6bdcz ]E FWFW!c󰻪mt6 )]Um+ѕlntuFWl#ll9{+M8a#ڈSۈ6Ȇ{8؋ƩmaqdCu#֍88l#lnmt#=~7&F7aMmэlnjݰndC{_W7nF7!c ֍njݰdqļ&FwotFwFw!c֍jݱdCu;6cɆaF-g s"J16c=FanmbN`F!cp=j=dCFoPm 2Sz9Fl'X8Qk8+:FOl'ِ1FOFO!cp=j=dCsJO8Tm" q]慫^dU/^F/!cp^j^dCF/oRm"2`襶 M6 tM25[a/[m7ћlD mAoFo!c~77zm6z ׍ްnVm!{NfbN`>F!cuJN飶C6d ~nvxnv>F!c֍>j}x1ve11}xxl#lxx~F<O6d ^7a݈Wۈ6ɆmCjF_qd615l_K6d c3Æqp_F_!cg}3j}dC Nj9V9k·aYo`hdl26262elelelelelelelelelele'D$dT4t L y3yG^m]?I?ueglI?_SĽ)^)!cpS)jS)dC6@S6`SȆgՍ)jSdcN}011֍jSdC6BS6bSɆalvpl~LpTlc*ِ1\l S6b}1MԍinLSۘmL#2ߘ7mL6 ׍inLSۘmL#21 ژ1 ۘN6LnLuctlc:ِ1tt!cpӡjӱdC6C6c3Fռ_2|zmbuc36f`3ȆpN1ۘA6d N)36f`3Ȇ{1ۘI6F>+c3aݘ1ۘI6d nc&1Smc&1ln̄ucLlc&ِ1L,qpqŭ/LYnijȆij6faȆm̂6fm6f ۘmRۘm"21 ژ1 ۘM6&l=ٞijdC6fC6fcɆm̆6fm6f %7fm6損*tĘ#ޭޭ1ۘC6d nc1Gmc1lߘ9js9dCplQۘm%$p艉1Wsa1Wmc.1l"FlCkc.1l\hc\lc.ِ12)s6bF@LDcو%G6vp.6aȆox`yz 끷{zMW_xgvq=&2PZ7$Bs7+6dRMX+!cYglcِ1!cs 6`>dcQܧ>nE1a{Gm!2#|`᣶m [-Q6|Ȇ>j>Bqi§on EXBB!c9;-m,6 ׍n,TXm,$2X%).}S~~\_;bUEU6|Ɇ/j؆/ِ1xuWm%2K 4mbF={LEbs\XD6d }e"lcِ1xX"E"!cpEj6w__z߆qg>bR2r J˘elelelelelelele,2hhdlbj mm[vXB,c;-c(cΟո){9-bb!cy1m,6IwX"l,6m,6 -tK6`KȆ%o^XB6d nc Dmc lksxK&R7/}RR!c֍jKdCuc)K6bKɆgK6b뷶zX&2X7m,6 Xm,SXm,#2 X XF6d o,2erؗΙ>rO\mc9lyyj˱dCr؋.WXm,'2dV̗m,6VW՚)zX!pNYXA6d ^7VBmclnuc lcِ1\l9e lc%(0?g٧MJhcJlc%ِ1xX JJ!c^t%EWm6V X mTXm>|11E  lßl|omcdCu  lßl|)j*ˑND 6VaȆUpNY XE6d ]U6VaȆgՍUjdH#jj!c9e5SVm6V X mVXm&2K T7Vm6֐׭k55!cpk5jk5dCs8QXm!21w>49{;SZkdE?lbZoUXm%2XXK6d nc-Vmc-l|NY 电jkudc^$#넍u:u:!c=up|:lcِ1:e\SXm#2jPDXO6NJ^XmWXm'2E^tzlc=ِ1;2;26cɆE}j뱍 d#kˊ?"M bcؠ@6d ncAmcl|N j dCp jQفkb^4jFِ1xl#lFm =l#l]`=&Fۆ}@aΆm }½@@l#lFF H6d k@@ %ݺݺZlThaݺFlT;hw`ۻuaeبW<7wF5߈&˿OI[[I}7zM&Ml"2`=ؤ ׃M$BpllR؄ml&fZ%,cflc3ِ1\ñ1? GL6d 66cɆ{ͰܬB6\I|E[଱Emc l|?ml6 o{[6`[Ȇצ[tlc+ؘU|gn'VV!cxa V!c֍jCo ߰Umc+D6 v~\u#֍ l#lnm M`m %S6md#ǡDLmbOkڦ F6d ncMmcl6hc6lcِ1x/ 6aFTMnlucvlc;ِ1vv!cpۡj۱dCpvF0Xiþ[L`a#V6Ɇ{hjF0ِ1`h#Xm#&2nmc;ƕ-dbkp Cmclnuclcِ1!c@ucl#l(A&Fmm`!dC{!p/9%Tm#%2jF(ِ1Ph#Tm##]n&08maadC6 00l#lnm 666Üh#|#.n^>Xeleeeeeeeeeeeeeeeeeeeeeee0TE/Bm#E6^(Gc/ ܥ E6d ncKmclY]Y]j]dC%%R؅m&;9ϚE nn!c=pwnlc7ِ1x߼ͻ6vcɆnX7vm67L==j{=dCuc{6`{Ȇm6m6 %7m6+l6m6 ׍nU؋m%2ثK6d 89j{}dbc7~c>lcِ1x>}>!c~c7m6 %6adcug3ĈϚDgM"6"H!cߟ?mD ۈ6"6"H!c~#j~qw}#}Mnuc~lc?ِ1}~~!cpjdCuc?6cFO6>&o!cggm6 `q@mqlhl hU} L9nA޸݈jdCA؋T8m$2a8q8H6d AAvK^̻u%aޭ;gCj"c}?x߭;Dl;0J߭;w>!7ݺCR_Ck~^\zD{X}zpð8vp׃@{ᇡjq=8L"d 8V8m! YoqDwG6`GȆaVTU^2gZG#dC}GQ8m!2#qDmqlY&QԍdEΗ׽Ql(ِ1;G;G6bGɆWm6 8 mU8m#O^ibcpqLmqlccjǰcdCu6aȆm6m6tnbwyqq!cq8q8N6d n8q\m8qlqhqlوsxSMnu lِ1^ ~Bmql|mzMOm6N w'6N`'Ɇdbb6NB'6Nb'Ɇm6Nm6N ׍nT8m$2q8q8E62g28%l6Nm6N `/zJmql)h)lِ1\ÞR8m&~qqZaO5ii!cpjdCii!cNNm6ΐg+U/28#X7Ψm6ΐ )grFm qlhl ِ1sgsg6`gFskbW]jgdC0딦 W~Ϫm6Β )grVm,ql|rSΪm6ΑN|68'spN9q8G6d ^7qNmql9h9lِ1xq6aŢebsy8W8m'2q8q8O6d >syy!cp硍j籍 duU#L n\ulِ1  !cp j dCp jd#M+c71. jdC딋prQm"ql|"q۸H6d ^7.ºqQm"ql4951.@/y@/m\6. ׍Kn\R۸m\"2`ݸq ۸D6d 8n\R۸m\&տMehel2ِ1xݸ ee!cpjdCpE/m\6^L3ĸ"z+q۸B6d ^7qEm ql|rSm\6 ۸m\Q۸m\%q;g6O㪨Waݸq۸J6d n*qUm*qlUhUl*ِ1̜ñ7y3Fq۸F6*m} 㚻5n_#z%ܾq ۸F6d 55k5!cpנkjװkdC5o\S۸f}߇n M-m]=}C?Gǖ'g-c-c/,c/-c,c-co,co-c,c-c,c-c,c-c_,߇N5y@t]Faot]]wj!bw뮫ku\S15:qש7{w7=ĸ3j7Ȇsj7dCkpMuCmql|Munm6n  P۸m$o7Eݸ MM!c-1~.{Z7dC6nB76nb7ɆMX7nm6n_XqKKsKsKmqln܂u-lِ1[-[-!c@6nmܲp^mޭ+#6"nE~𯓘4v[݁9xoݺV_o7u[wV_۸ܡkvzzwrG}zpX91:\GQ!c@l.ٸaM~]x]l.ِ1[Kw FU5%]l.ِ1]]!cpwjw{dypv&=cރ={=!cwdwdm6 n=u6aȆm܃6m66jCW㾨aݸq۸O6d >܇s}}!cpjdCkpmz_m>lq21gVxgVm<6 @ml|v6`Ȇ}jd\efb<6B6bɆ=m<6 aPm!l|Ny甇jFҶOhb#`??dCs?pNGml!cp@mmC6d ^7uGdYǵ71 GjGdCu6aȆK|K|xD6d \#HmlL&ca1Xm1lnSxm<#2`x xF6d ދ>3g3!cu3Ny lYxMM׿p_ɆaƿƿdC66Ul.q666ί6517LxN6Jx]R֍jϱdC6C6cɆm<6m<6 a\m9lAml%7@6d ^7>Amlhl#وt=UMb a?m|6> a/Qm#ljdC6>B6>m8/|2$E3/4s N>E|0Ѿ~'s8IgO~~?~随WcEJg1W|sgg2 ;?|391\">zD|6>m|6T"_l ِ1|S؈ mTۈm$2ciذ=rSm#&lnĄu#FLl#&ِ1x݈ FLF,0VąKz;ZoRۈm"2`݈ ۈE6d n#Km#lF,h#F,lÃldtF1ËzxY lÃl"/|چA6d nP6<Ȇ{Q؋zmx`Fg =-jbsJl8Vۈm&2a݈ۈM6d n#6[m#6lnĆu#Fll#}FGSuJ8F!c=8^h7Fl#ِ18F8F!c^4Em6<ƅ4s'S<6< O!cpІچ'I6d NO OlÓl܆'᩶mx䓪}|L /1x9Km "2mxmxa^dCϐxy^j^؆ِ1\l9Km ۈK6h[Ĉ+攸pNۈK6d n#.Wm#.lnąu#F\l#.ِ1SqSq6b.19M 6\j.lE6d ދ`/Rpa.!cp.hå6\dCpچ ۈG6 ]:O؈mSۈm#2ñMfCk#l{xjxdC6A6aɆ5<&F|oćF|F|!c9%>Sm6 a_m#>lF|h#F|l#(C߷21֍j dCI@m#ln$u#Fl#ِ1FFBi?PHm$THm$$27~#FBl#!ِ1x 6b Ɇ) :%FBl#ض!IMDbNIDjDdC6A6aȆ؈xiñᗿf"% )6Rb)Ɇ-H -HHI6d M^@)6Rb)Ɇm6Rm6R=[9Hſ% }K,F*l#ِ1xHF*TF*!c ֍TjTdCpTjd#Ah9S^xjZm#5l"z'7Fjl#5ِ145\VHm&2_j4dZ`bq -4d#gҭe{%bQHm!2i`HHC6d ^7Fm# l4Mli=&ƏnƏj?b? ^ETlƏƏj?b? ׍aQmGl#-و_VLR#X딴jidCu#-i6biɆ=jidC6Bi6b?O_Ilb$Onِ1^x+w F*/K3J Ȇmmِ16~6ґ_+V.N`Nm#lttj鰍tdCh:؋SHm#2_tj6Ü߇"͎xdeeeeeee尌崌岌嶌屌嵌峌巌l+d2V2V2V2eeeeee02V)x*=|*ƥ5.=8aߜ^]jk\zXҫk\z\S1>]zO^]/`x&FOePȀmd 239Fl#ِ1xoF62`Ȇz;Fl##xoG.#aȨH6d n##Qm##l|3md62 %2md62C&m$ ~$F&l#ِ13$3$62aȆF&X72md62 W1b&LFfpz;3\ogVȌmd&2aȬL6d ^72úYm#3l j,d/u+cY=,q,F!cmd6 mdQȂmd!2S9%Fl#+ٸ9ZLbN 甬jYdCu#+Y6bYɆmd6md6 etY6bFѮ019%Smd6 `Mm#lYlYljٰldCsJ68dSȆmd'u&FvN)6cɆFvX7md6 ׍ndWȎmd'2K 4dWȎm SsJNF.U|41r ֍\j\dC6rA6raȆF.X7rm6r %Esm6rr_X-l6rm6r a[m#7lFnh#Fnl#7ِ1FnFA;pL8rO ݁9xvo僕!_}s{.<'C^~W??{jq=Od >W"E ?1{~F}=71 jdCsEX# m6 M iF!c@6 `ƪ=Ql~FAl ِ1=ZAFA!c> # m6 RPm 3ٸ1=j?c? CĈ chmmL6d ^7~ugɆϰn3QldycQ(Q(D6d >sJ!BF!!c~7 m6 %QHm h~o ِ1W̳G ِ1甔QbhmmB6d >_6~6 y5u\dC]R>]Xm0Ql|RS m6 luplR?EQ(L6d ~0ORXm0Qlv},;m6 hظy'GZE"dC ʺc86a(m!2S9Fl(H hC{&FQn]Qn]QFQ!cQ֍jEdC06ʸc86Jp%FQl(ِ1\l9FQlWQm~Wo++ِ1Lña%ƯƯdC0Fw F4VlCkWlW!c+mm#F;01Q ֍bjŰbdCu6aȆm6m6 %6aS:ibFqoW(m'2_kjűdCsJq8W(m'2Q(Q(A6dp>*`bu%6J`%ȆwKm6J ׍nP(m 2RO)Q(I6::U7J~FIl$ِ1x( FIFI!cp%j%dCkؒp [Rm$Ql t~YꊉQQZm4QlnuFil4ِ11%1&nZdCFioV(m}~߇)cGYX9XyXXEX%XeXXUX5XuX XMX-XmXX]X=X}XXCX#XcXXSX3XsX XKX+XkaP{yx91T Pu+k\q2ƕ5 85Uu+k\q2K Tʨk\<%9FYl,ِ1We6beɆ翲p+Q(K6d * Te6boon]|('l6ʩm6ʑ (mS(m#2`(Q(G6d 8hF9lԂsJ-ZF-!cpZjdizDFmFm!cuJmNQۨM6d ^7júQ[m6Qlٳٳj:dcML:FhFlِ1=:Z:F!c:pFlِ1xݨF:F]qoRCMF]hF]l.ِ1xQu6buɆalupllDڨm%2K dF]ltݐ!&F=N)6aȆmԃ6m6 `QOmQl|QۨO6Z8(2ĨaɆGm6 ۨmWۨm'2aݨQۨO6d 8nWۨm4 }dnb4u 6` Ȇm46m46  `/@mрl.q6j d fؐl~FCl!ِ1x/ 6b Ɇ甆pNihH6d >4sJCF#l]bb4h#؋6Rhm4"2_6kFjFdCu6aȆaְΆc@D#FFcQ]&n61h^vb4&;c8:dhhL6d ^7úXm1јlh jdC{ycF1!S7~Fl ِ1xhF&F!c֍&jM&dC{_MW&FSA_Z 01 MjMdC6BM6bMɆaF9w I%FSl)ِ1xM6b\5Gůh&fh hf1:\4Shm43xm{fjͰfi/)Lmќl\pњu&Fsa9\m9ќln4uFsl9ِ1)6cɆװFslAkMbNij-dC6Z@-6Z`-Ȇm6Zm6Z hmPhm$Rh mThm$2%|FKl%ِ1FKFK!c9%SZm6Z obo兾JmъlnuF+lِ1VF+VF+!c@6Zm6ZUahhM6d ^7ZúZm5њlm {jdCsJk8Vhm}߇icG[X;X{XXGoNΖ.-c,c-c=,c=-c,c-c},c}-c,c-c,c-c,cXel2626}6T:g6ϩXSk6׸6Td >_ukk\q2Ƶ5 8%ڨk\{s^jkbwBm"Ep<6dDZ&Fw/jnr!z%orQm!2S9Flِ1x/}6`}Ȇm6m6^Vk:+zѾK6d ~/GWm/їlF_hF_l/ِ1F_F?A_eb v?~F?!c}~p_F?lِ1)6aȆg觶O6L#H7m6 ׍nWm'2诶O6d vv1Rh=kB=@mc1lhclcِ1==6`ȆX7m 6fjb 3 n@@!c9e Sm 6 ׍n Tm $2$?؁jAd# WCLAn uc lcِ1x A !cpAjAdC0{_m1o%OZ?u=M?p??Ȇnِ1p??ȆA6qplh빣ny9ONRxpn5$ WEia*p9SOs8{ꛃe?際v&OkE< %0/XR_p={Z_@s_pK-/\"2+s_ja:{41 jdC{^``!c=pOk`lc0ِ1:#MZF/>ob-l m77ِ1x7?Vln jc ì?c86rPCkolcZŔL!(CȆ Qm !2l Qm !211B6d S761V16`CƊ{111֍jCdCPo Um %2S9ePlc(ِ1?&1Tmc݆ݗw_t_z߆q1}ᖱQі1q Iɖ)i閱Yٖ9y1o˘ele2ݗaTn>1^o4L{5nqè 5n 5n8׸a S׸a 'c3@5n ph ]z~pp!c5p1N6d  pp!cM dcplch:ٽM7{j#dCϺϺPm 211A6d nc1Bmc1l>9c7c11I6d  T#6Fb#ɆGۑj#dCsHhcHlc84cSF9e(lcِ1o1ǪGm6F ׍QnRm"2Qjd#~/u61F1֍jdCuc46FcɆ{Ѱ1M6d ^7FC6FccFv>&Q71Fmc 1lm8dzG1C6d nc 1Fmc 1lhclc,p~bVGcca1K6d N )c6bcɆ由pN1K6d c#QlUm#ӗ1NmSm#2SZc86lcSm#21˟:J q8!c~c1Nmc1lcS9exlc<ِ1x16cɆA6spl0lߕbm'231ۘ@6:JĘ X7&mL6& ۘmLPۘmL 2h=JӭCkc1lߘmLPۘmL$V&Dac"1Qmc"1lߘjdC0sJwh(16&bɆa&1Qmc"1l|yƵoibL6&A6&aȆ$X7&mL6& ((y,QZIdC6&A6&az&dNdNdd!cpjdCkp ;Ymc21l mLVۘmL! x1ES`/:Emc 1lhclc ِ1oN:Emc 1lhclc*hS}gz0~RЛ%,Xf,\f՗1\1 fz0,xmZ,\f?> ژ1 ۘM66_VĘ-l̆6fm6f ??[mc61l|m:VjdC6fC6fcsȆŢ41s9js9dC6@s6`sȆצstlcِ1}99\Q[V71\QUۘm%2S9e\lc.ِ1\\!c\hc\lc/Dݘِ1xݘmWۘmxW [u o olÛl܆7᭶mx ްV6ɆmxCj?窤+ DX!c{hM1% %lcِ1) 6` Ȇm,6m,6|FA.]u  lÇln᣶m  X7|6| !cp>Іچl^d|YcXXH6d ~}!]XH6d ^7ºPmc!lBhcBl×lN&X5چ/K6d 7|6| _!cpІچ/K6d mmbFO+eb,"o,RXm,"2S9e"lcِ1E"E"!cXn>yat_qgbR2r J˘elelelelelelele,2hhdlbj mm[vXB,c;-c0a5 {[9E~k8~pS8?\U?̪G5N秮q~x[L6~6C1cþyblc1ِ1bXmc1lf}K%blc1ِ1xoXXB6Nlɯ&wodY]B6j?^Dmc l7Z{%jK%dC06cxQbhm,6 ?_XXJ6dscKaXXJ6d RRR!c1DQbhm,6 KjKedX61h^-edcg G6aȆbej˰edCO-O-SXm,#2 X XN6VLb/f9܋YXN6d 3ppl^WQchm,6 ׍n,WXm,'2SC6c+Ʈ1+,hb[ n  !cu NYXA6d S7*c86NtI% lcِ1xXmPXm$OzRԍnTXm$2SZc86lqTXm$21udQbhm6V SVB+6VbdXjgb)dc~@wr6 !cu?\mcdC06*c86RO4J lßlnCj*1w:e\RXm"2hH0_e)sF XE6d >s*U*!c~cJmcl\ncXXM6d NY )6VcɆalTwH%jlc5ِ1jhcjlc x?4&ac Fmc l"FlCkc lfN}>J 5!c~c Fmc݆Zn]nZ؁UXkaÿ[sU;Xkw`ݺQy\{گ9xEG|`]4[':X֩:\՗1\zfhٳQbhE`1xXXO6-pw}cXazlc=ِ1zz!cxdö^mc=lzhczlcٸ\!^cؠ@6d 6צ66`Ȇml66ml66  jobFF@6d n#P6Ȇm@jFِ1x66@{қF m 66@!co~; O=mbdCu#T66iɐ(ll66ml66 aQmc#lnlucFlc#ِ1xmlT؈ml":716u&N٤ D6d ~mImclnluc&lcِ1xmlR؄ml&q{1Y mlV،ml&2fg3جL6d nc3Ymc3l|/|3Ymc3l E)[Emc lnluclc ِ1--!c9e Emc l ofJcتJ6d nc+Umc+l jCIBAdc6&FAnmaAdChE6 !cFFD6d >AAjA6&vy5D6m6!c56ݦ F6d ,-1/oS؆ml#2SA6aFGLnll'*]mc;lnlucvlc;ِ1 Z6cɆ)ۡj۱`ci$&FSm ׍`X76`!cpFF0L6d ^7``lcX_$21v֍j;dC6v@;6v`;ȆRv _!cء!wK/F7B6B!cm ! Q6BȆ{h#Dm#I62N\՗1xz|}jp=G"d c6m6"Ӣ+ygbD"jF$ِ1Hh#Rm#ۈ$2 mDmDbdCsE$m'뵉_mW؏m'2.q?|.q~lc?ِ1~~!cpjG]Wumk#! ;Kq+Pw-PBq)CŵKB   $171~us۽~s̹\;l4}f #@66!c3jFِ1<ŧ P6Ȇh#@m#8K6Z۱qV8 mU8m%2S9Yl,ِ1EgEg6bgɆYhYl#l|c#Pi•HF H6d n#T6Ɇ;~gF H6d n#T6Α G8'9X7Ωm6Α 8mS8m#2`8q8G6d >6Ωm6ơ{߳11 h#Hm#"2 {AjAFِ1 h#Hm#"2AFFql&y1syy!cp硍j籍dC:q8O6d ^7C6cdcS*21ųgٳ``l#l|N sJF0L6d ^7aV6ɆMɒFF0B6{7u#DԍX7B6B!cp!FFB6d 7B6B!c9%Q6Bƒ7njb FF(J6d >9%Tm#%24Мm  mmbad#=.aS̪-ltYw$.00l#lnm )apN S6ȆmAaja؀fb\u6.`ȆX7.m\6. ۸m\P۸m\ 2E/@6.`ɆKϛuql|NjdCoj(ѷHsL(a# ڈRۈ6Ȇ=ϞEmDaQdCu# ֍((l#l߈66hqgbNsJF4M6d oD~#Zm#ۈ&2 mDmDcdC6hhlpj@`/@ml|Sm<6 o<6`ȆCK&CQ7ºPm!lnktkv⮟.z @_;0t{ ;~Žؿyo=q=xCb6ވ22ި\ݗ1^\ސo\F- oH{77[G%-LbmMߪm6ޒ i{Zo6boɆ犷pxxK6d G6ުm6Ɖn:}󵉑 l$@ j Fِ1xHu#Am#H 2m$m$` dCu#HPH6F'411yDQ$m$bdCp"Qm#H$2߷H]FF"H6d m$m$bƎ֞jhbu6aȆצ;lِ1x6aȆ;h;l#l[z&FX&iFD6d n# HRH6Ȇ)> ZFD6d o$AIjI{rgk:=\Wxm'2xxO6d >s{{!c9=^m=ld|%͋&1|s!c^E?m|6> m|Pm| 2j6#o;;y=-c.1W˘e2a󴌥yYƼ-c,c>1_˘e,e2222222222222e,lߨr?d^|M N!y'yNָd^ɼzNָɼPSǀ_ri~#b$_r/4%WHm$'2{/Frl#9ِ1FrFr!cpɡjɱ 1ޑ1˛.nᢶm p6\6\ !c5ZSm`.dC6\  l#xH)z;F l#ِ1))6R`)Ȇ)> d#F l#ِ1aR@)6R`d21\z ]6\ W!c 놫چ+J6d W/ W WlÕl܆+᪶mk+nb놛چF6d ^Mm p#2uB{njn؆ِ1mmad\nú᮶m p66ܱ w!cpІچ;N6d OmmcdW) b)j؆ِ1)/t~Cm 2mxmx`dC6<  lÓl4[9Ŭ<Ɇ ^O OlÓlچ'I6d p=6< O!cpІچ'l /H)攔pNIHI6d ~F&:#Rm#%l|SRm6R H mTHmx*E/.nbxy߻Bw饶mx ?k兞5R6Ȇ^j^؆ِ1 /hKm &H[{_p[m&216l?^⭶mx 66 o!cgݽ o ol#(x6ً L*TF*!cuJ*NI HE6d ދh*TF*!cSA6Ra>dcUniҙ>bom`>dCu  lÇl܆᣶m )>ІچK6.P(0+zQ_؋mbdC_NU6|ɆE}ᾨچ/K6d mmb~dcNE3&~j~؆ِ1X#姶m S@? ?lÏl܆᧶g8䕚l$ny}<[H.\ujR{|֥fjOm^cx.5<5t' 37}?#w2~:W;|EEzO"d cCjFޭ)L4Fh#Fl# ِ1EoFm# l iҨm6Ґ i4jidcЦJfb \ZFZ!c֍jidCi6biɆm6Ҫm6ґȕtb=f:QSHm#2_tj鰍tdC=f:cSHm#2HHO6:}^HmWHm'2HHO6d hzhzFz!cGzh#Fzl#ٸ: F F!c~#72md62 ׍ ndPȀmd 2 jdg4312 jdC62B62bɆFFX72md62 mdTȈmd"=$ld62md62 `/Im#l|/< Ϥ D6d >d62md62j~䱉Ya35lfFf!c22md62 a35lfFf!cg3C62cY#Y,F,F!c֍,jY,dCsJ8dQȂmd!2S@Y6`YFY+ޔ219%+Smd6 hV/Y6bYɆmd6md6 f6md65E# Ȧ F6d ^7Mm#l| Smd6 mdSȆmd'W[}aR _JvFv!cp#Fvl#;ِ1hv/]m#;l|NmdWȎm|F6uֵ}7>gja ׍`Lm3l3!cugpggdC06516>6rT.Ef71r8y~!3ϡA6d n#Cm#lj9dCkFv0}?LN{}a+o`hdlbjfy?LNqmdr:u7%'8&HNuˉk\Nq2?#ɩq9qI5N_N8T׸'cָFbŁ秅_G4r) ߟʥ E6d >_.\F.!c9sm6r ͹\jdlbp[m#7ljdC6rC6rcɆ۹j]g _H} ᄍק2v^B{^׃tK(+,V¸/czP:(vP׃@kpmZX-0IQ(Q(B6ֵ:[&FUiQ(m!21Flِ1"F"F!c="F"FQecEE( FQFQ!cg݋g݋m6 S|jEdC{ZEjEbdc,MbnuF1lِ1E1oQLmQl,bjŰbdC=f1hF1l8-4a(Q(N6d n8Q\m8QlYYjűdCFqhFql٘ͱuMnuF lِ1R)%6J`%Ȇ{/{/Q(A6d o6Jm6J/71J:0)%FuG"RJm6J SJuJIFI!c9$SJm6J ׍FIF)1ege&F)1sJ)RF)!cpRjRdC6JA6JaȆRF)RFidY1u4XgBEnV(m&27J~Fil4ِ1FiFi!c94QZm49VV_~so|99ِ1x֍6>6>'27>jc a?6>W(C6"8)`b.߇]Fm QlnuFl ِ12F2F!cQ(Q(K6wY&FYQ7ºQVm,Ql|_,-Q(K6d n,QVm,Ql( mU(m#/019 S9Q8 F9rF9!c5l9-Q(G6d oF9rF9!cuJ9hF9l Qss_updCpc_ j_`_ Bm l !c~ h /d~YjQ^By/ 6cɆFyX7ʫm6ʓ (mW(m'2?wY(Qۨ@6JGm9Ĩ cYDzFlِ1XK\lZ j dCߵUߵUPۨmT 2?LhFl"0YLNT$GtEFE!c^"E+mT6* G_~G_Qm"QlFEhFElEo,TBPImQlnTuF%lِ1:\TRۨmT"2_V6*mT6*EebT6*C6*cɆ*ýjdCu26*cɆװj*dN 31*pFl ِ1D tFl ِ1xݨF*F!cuJhFl*٘MFUhFUl*ِ1hU/ZUm*QlFUhFUl*ِ1FUF5lF5QMmQl|NjjհjdCkjp [MmQl| [ ڨQn~a~x԰}iiemckgok`khkdkl2222eeX XKX+XkXX[طvT77N>]uOW]]WjpqqN5Nk\u\S1~uX㪫k\u< N|QCF5`oTCmQlF hF lِ1F F !cv hF !/ٺuu_ŽK/"]?A_|iw`.>/wK7t:o=R}Ͽ&.)jpMxk~M\jݗ1x= AM$25j5q=I"d ^jB56jbF7_hbo[-ZF-!c}Zp߾F-lِ1ZF-ZF-!cpZjd#WۙEY6jcɆѵQ[m6Ql|]km6j ֆ6jm6ꐍWc_6hcbuu6`uȆ:pNQۨC6d nQGmQlnԁ6m6꒍Cdrmib돺pQWm.QlnԅuF]l.ِ1F]F]!cQڨQۨG6|kQڨQۨG6d ^7QOmQlzzjzdC6A6aƦaMLbRSm6 ׍nWۨm'2aݨQۨO6d >ԇ6m6< ~X@ԍn4Phm4 2hh@6d YYF!c@ 6` ƒk31֍j dC6B 6b Ɇװ FCl!ِ1xhm4Thm4"i&=HԍFn4Rhm4"2hhD6d nHmшlhm4Rhm4&st}K^wdm46 a/Xm1јlFchFcl1ِ13jȆA4骙_9+8|ِ166"24PWWdCu+h+&dcdue*Mٺ&l]&F!cpM&jM&dC6@M6`MȆm46m46/Rh*FSX7m46 ~Tm)єlRM{m46 h m4Uhm4#f?]}FWqL3fF3!c ֍fjͰfdC{_W3fF3!cuJ3hF3lkqzME֍66&2?53ÆѡjdCpAmсlnt6:mt6:a:zsKH6l_zwTmt$2 ;mt6: mtTmt$2߷mtThx˶Enǻ8:Y2222222222222elelele{`P0pH(і1-cc-}D52NĹNe'uk\'q2q15s65qoN ׸NTd k\'udn{BE͝6:cɆΰoL6d >u_gFg!c3Ym3хl}蛻Fl ِ1.F.F!c.poFl ِ1 Em ѕlnfUԍntUmt%2誶J6d ^7ºUm+ѕl|M誶F6+)<6mt6 M@ F6d {7{7nF7!cpݠnjݰdٕwǙ݅FwFw!c֍jݱdC6C6cɆFwFQgbMj=dC6z@=6z`=ȆpN顶A6d YhFl'ؖ±lbu'=6zb=Ɇm6zm6z =a/Sm'ѓlFOhFOl(mw^F/^F/!cgHzgHzm6z ׍^nRm"2mRm&eb6zC6zcɆm6zm6z }{_6zcɆ{FoF1L>y>y>j}>dC6@}6`}Ȇ>pN飶C6d ^7@}6`}̡61֍j}dCF_oUm%2諶K6d n/Wm/яlIWTϹN1Uٰ=OmяlnuF?lِ1~F?~F?!c5l?hF?l?ew&Fװ6cɆFX7m6 mWm'2j+.9wd wjaߑ >wwdC:;ﰍȆװAߩm|m bb uc6`ȆpN1@6d Oi}jdCuc1@mc1lDN\!(96sl@lc ِ1@@!c1֍jdC@hc@lchLAn uc lcِ1x16aȆm 6m 6 ׍A Ad{ߋ33߫m|m|O6d o|66'2}}==ِ1x^m{lc0hzNE ``!cm 6  m Vm &2j6uٺ!pkZsqWv5C{|я5R7b |`(w*;»?T}z0v0׃@`(C"z0D{P0w41IIm 6 ?1Lmc1l0hc0lcِ1a0apQ(0{Mn ucplc8ِ1MN6l7eplc8ِ1po1\mc81lm Wm +{3x1B#`9Bmc1l|1?Fm6F ׍nPm 211I62-)l6Fm6F  Tm$2d$@Gm6F ?FB#6FbȆQ[LQ(x^m(lcِ1x(Q(!cpQjQdCuc1Jmc𬲤&nj?`? eeAml!c~j?`? Amlc4^edu&hыhh!cuhN1M6d nc41Zmc41l|N mVm!1Fԍ1nQm!27ƨm6Ɛ mQm!211l ߖ21~?6~6~$2y~g 0ǛC+ƏƏdCƏƏdC6~6~TK6䋜+zѱ1K6d >sXX!cpcjcdC6Bc6m8sѼFΎqxMMMMMMMdn262eleW,lo9yEŖ%-cK-c,c-G5C3U?q7{q7׸qTd 5nqƍ5nƍ5n85nƍxQ&xT6cɆp1O6d ;Wm'2_o6ƫm6&Ɠ|lkbLuc6&`ȆX7&mL6& ׍ nLPۘmL 2 jddmmbL6&B6&bɆDX7&mL6& N{6&bɆD$AJ1Ę$IpN1 ۘD6d 3 LRۘmL"2`ݘ1 ۘD6d αI$IdV&dQ7&ú1Ymc21ldhcdlc2ِ1dd!c1ژ1ۘB6=Ϝ&Q71Emc 1lhclc ِ1&S&S6`SȆmL6mL6UULx1UN{S6bSɆߘ1ۘJ6d oLTT!cuThcTlcZF^&41Ls4i4!c1 ֍ijӰidC6A6aȆ4hc4l'AO؎11~r0D6l? OOdCu'X7~R l|N )?mmD6d ~&'h'dëW~#FEݘtt!c1֍jӱdC0h'g *)ZӱdCsthctlg1䯥?;{Q?) Ymglg!c3?mmL6d > 生6~6~&2?C?mm oW851fu N1ۘA6d `ᄍ7O<[ 翨/̤{ |SBLQfz0S}gz0&baT;Lr c=PL$2_̄6fm6~%5,CWN_;~UlmmJ6d >W _6~6~%2+Ư,q%͋=LYn̂uc,lcِ1ٺYl,Y,!cxYjYdC6fA6faFsOjbkpm:[mc61l|16fcɆpN1ۘM6d mVۘmF6N7LD ֍6~6~#2y.3ƐPͅCk7l7!cpAmmF6d n7h7߰9d*=&<<9!c~c7m6 w΁s6`sȆḿ6m6撍ݓFĘ+改pN1ۘK6d c3ÆmK~\lc.ِ1xݘ \\!cBs6bF\9^kibuc6aȆyߘ1ۘG6d nc1Omc1l|Ok1Omc1l9t,c&|Q7ú1_mc>1l|c>ߘ1ۘO6d N)6cɆṁ6m6mUX z]X@6d o,!cpclcِ1tGM dclc!٘qa#c aXXH6d nc!Pmc!l@BB!cB"j DX"E"!cقEjEdCuc6aȆm,6m,6%UX,zŰ]XL6d nc1Xmc1l] {jdCb4ė&ac Dmc l|NY%jK%dCuc K6`KȆ,6m,6~'{~27~jc ]mwlw!cxOmmN6d ;RZƿ\ecXXJ6d nc)Tmc)l|NY 甥jKdCRhcRlcrgMe^Ԭ藑 ۊ~2lcِ1x 6aȆm,6m,6 ˠej˰dnUX.):erlc9ِ1xXrr!cpkrlc9ِ1rvìce*j؟u M͖-m햱,c;-c,c-c{,c{-c,c-c,c-c,c-cG,YA5ٵ;6N+k* qLj{4OP׸ƭ'coVk \VP1+5nq+|q+5nVag)ab}J7TXm$2^p%^pJlc%ِ1JJ!co%Rmc%٨ EL?gr?FWqnِ19?9?66 2dCk??66V[SD(hbuc6VaȆUpNY XE6d ncJmcl|NYmRXm&%;LκaZM6޾|hjlc5ِ1j5\SVXm&2_SkjdCuc5Zmc5l}P\&Q7Fmc lhclc ِ1Fmc lhc !?ٺu:.yO%ҝO?"]?iw`.?ᄍ7=8{>?̡zk{_U/cZ`Z\֒X׃$B鬅6֪m6֑ %dbs[sٰH:u:!cb+֩m6֑ `Nmcl|XmSXm'S:~X/}j뱍dCuc=6cɆczlc=ِ1z] cӆYl ۠@6d ncAmcl{ j dCshclc#:'kK_cXl돍jdC66B66bɆavEW sH؈ml$2jMdqMM{MjMdC66A66aȆ)> 4lR؄ml"2}Imclt;׾caجL6d ދnff!cxOS6ml66 wn66ml6^w51^t Eml6 mlQ؂ml!2آB6d ol6ml6n[VV!c&p+ٰ5[6b[Ɇml6ml6 d#peqIcS9e6lcِ1x6m6!cmpc6lcِ1 ئ N6w ۅvv!c_{vlc;ِ1x/6cɆml6ml6vצ'umb6v@;6v`;Ȇ);:elcِ1Cmcl_dpKL66"2l`R l"mmE6d omlORjS;a/Smc'lyyj;dCuc';6vb;ɆNhcNlce'&.acKmcl{]j]dC6vA6vaȆ].]nQ bLݢ jdCnoV؍m&2Sv9enlc7ِ1nឭ)M=hclcِ1x=!c5ݣC6d >6m6i{Ŝ){6b{Ɇ ޫK6d ^7ºWmc/l mU؋m#r961m6 mS؇m#27~c>lcِ1{A6ap:bbs~8W؏m'2S9e~lc?ِ1)6cɆ~c8 l6m6 a5!cpjdCuq@mqlxye7~Al ِ1r)6bɆaN]u?bhm6 jCd朩4>&!Q7qHmql!h!lِ1L/a#sL3W C!!c^qHmql(Yx}㰨a8q8L6d n0qXm0ql|N9 jdC6C6m81g}x'INj'dC{,'II!cq֍j'dC{,'j'Sd]&)o)S)!c1Ȇ)S)!cSp)lِ1:qJmqlLv&i羽٩>M6qGޔjdCu46NcɆpN9q8M6d n4qZm4q6dqF|sҞQ8m1"az3jg3fVu g6`gέ33F0)M&Fxwi|wiF@6d N l#lnm 66d#vr7֙gEqg6bgɆm6Ϊm6Β 8 mU8m%2?}8q$r1jaF ٘_hjF ِ1;@@l#l|N sJF H6d ^7@@lٸ}01Ήsp9lِ1x/z6aȆװ9lِ1x/z8q" L g/jRȆMJAjAFِ1xu#Hm#"2mmaAdC6 l<~ޚ%&yoyy!caaϫm6Γ )r^mDCjFd/9b< \<@mlxjdC6@6`Ȇal;jb 6`ɆEkCPm!ln%~mĒ FF݆ss.<[~\-]맋m<[,3ssqOlsyw\܋}99/螯|S*jK>C _ \^ݗ1 B/ȁx׃$Bߓ6^m6FySmbĉ}8omđ qnjSۈ6Ȇ8GĩmaqdC=fm$J /+R|/6^b/ɆxxI6d KKK!c%Rm%lxZV1_+lِ1xx+W+!cxOu6^aȆW+WF<9Lxa#ڈWۈ6ɆmCjF<ِ1xxl#l|N66ⱍd{DžқŜ)6^cɆm6^m6^ )Zm5ln6^m6ސV%?x#)o:l ِ177!cpo7jo7dChl-وa_㭘S9[l-ِ1x/o6boɆm6ުm6ޒ x mUxm$uR61h#Am#H 2m$m$` dCE6!cS&@ j F"ٸ4R&F~5~m$ )pNITH6ɆWF"H6d o$Bj;81&;Q7Nml;x;lِ1w;w;!cu;h;l#l?$l$AIjIFِ1$h#Im# H"27`m$ IFFlT*tv){}װ6cɆxxO6d oWxm'2x@6+}Aԍn|Pm| 27>~lِ1<ŧzjdCpL d aaHx$XRX\-cn1w˘e22e󶌥X|-c~Ԗ1XXZX:XzXXFX&XfXXVX6Xvg}?ß_"S3myո9埓_dޮk\2oT1`K7Jz9u Xy{'ss@5N*ǯR41{(7ꍒm$6 ɽQߜ\m#9l7JzjɱdCp1jɱ fb.Іچ B6d ^7\`pQp6\Ȇ.hm p6\6\dvk&<11RxwnFLHA6d n#Bm#l@sJ F !c9Bm#J6R]UpUp6\Ɇ_tF/mbdCs+S\6\ W!c~pUp6ȆEn†ᦶm Ÿy7 7lÍl܆ᦶm  7hMm p'oOFVwolچ;N6d Ӌupذ=ஶm p66ܱ w!c916du][j2ֆ;A6v!j؆ِ1x  lÃlچA6d c#3Oj&ݟYM6<ƃ>E01<:S<6< O!cacHg +ֆ'I6d Oi3j؆'ِ1秜1М⩶m$[#SR9%FJl#%ِ1x)6Rb)Ɇ)):%FJl#%ِ1絝16H;d vC^^d#G:/X-""];8y+=>]dzu^{ラ{dսGK}Ͻp={ޤz'.z} UyݷnV}o\xzv791x oo\I7jF*!&F*oІچC6d nQ6|Ȇ}  l×lJ4ϬzgV}6| _!c9)j؆/ِ1 _hWm%2 mmb~d؎֞21DuOm#2~nma~dC{Z~pOOm#2mmaƚ}Zi{Z6RcɆm6Rm6R H mVHm&2ES^4Fjlßl8,GM N lßl|Nsچ?O6d oWj؆?ِ1ƸF]2+ֆ?l̝:텃&FQ7Fm# lnu#Fl# ِ1xi6`iȆaFSgOߓdW 4FZ᝷3isisi6biɆJ JQvU).-!HAB!B X HaE ^Jq-š)R(PXRgv-<{s_֬l#'ِ193sm6r l8 $'96rbƐ`bIr\j\dCu#6raȆ\ȥ E6d S7;c[7|? M6^'vn[}{_6rcɆ ɭM6d oFnFn!cF7ݙ;tbhm6n/ݸ#FX7m6 y`/Gm#lFh#Fl#ِ1Lݨ1ա}Ck#lܛƥr#E^4F^l#/ِ1F^F^!c^4/Em6 ìS9c8l<⊧>p%-Ybb9)j؆+ِ1x W WlÕlnº᪶m  \6\ 7q߱7nbNqsچF6d o~Mm p#2_uچF6d ~΃ᦶm#;Lr\#S9%F>l#ِ16\Sȇm#2_|j|dC<6m6t61Epu]mp'2S⮶m pWp6Ɇw66ܱd#q #ȯO6d ދ懽h~F~!c~#?7m6 ׍F~FSFF!caa _jdC6 @6 `ȆFhFl T,&FApApAFA!c9 S m6 (mT(m$2jBdcW31 Q֍BjBdC0sJ3zoF!lِ1xQ6 aȆm6 mχNa<,xyZJXƼ,cޖ1˘eeee2V2V2o+g+o`h UZƂ,c-cU,c0T i_XC<3ό=58q2=`졮qyP1^܋P8\<75C]W6m6<E7S7<ɆyZmx ySm$2 mxmxbdC6< O Ol~(!%F lِ1R)%6J`%Ȇm6Jm6J (mP(mx /r'`6Ek䦨چE6d n R6ȆmxA^j^؆ِ1ެ᥶mxIjbx 놷چ7M6d >x9[m&2{Zj؆7ِ1o yCj؆8a ً1|Ȇs  lÇlچC6d ^7|`Q6|Ȇ᣶mcmNnob 놯چ/K6d ^7|aU6|Ɇ=j؆/ِ1 _hWm(I66upjbT(m$2Q(Q(I6d ^T(m$2EKB%6JbFjbF)RF)!cpRjRdC6JA6JaȆF)hF)l4X2qQZ싖6JcɆ5Ɇ ,Q(M6d n4QZm4Ql|_4QZm4G6AAjAFeeҸ+Eݨ FeFe!c)jdCu26*cɆװj6T1$o@U"E$U!^=-kT;0O.Ujݯb?wFUl*ِ1@6mT6BƴMN|g'Dm#!2mm`!dC}D#B6B!cmmm8}Y}Ozg8f UEX"-cQꖱhX-XmXX]X=Xeee,22222gkj%X-cIdX3˹/Tr,غ3*fClƅJ5NQ(B5.׸Pq2$CqƅR1Z)ָPu _"&FHF6tajaFِ100l#lo}sFF6d >AajaFYG_NaT!#\oW6͊Zu#֍ppl#ܬE (\m#7l66±jdѼWobTu6aȆF5X7mT6 ׍jnTSۨmT#2SA6adq1o\MoD~#Bm#ۈ 2nDmD`dCς#l#lnD@jF$hsNaJ$ٰpmD ۈ6"6"H!c FF$I6d n#ڈTۈ6ƕzL<%E}QjQFِ1(h#Jm# ۈ"27`mD ? 66d}%Żgg6cɆߨQۨN6dOՍjձdCu:Q]m:QlqL&F oԀF F !cp5j5dCu56j`5ȆF hF l&و*#&FM1ԄsJMFM!caDk њj5dC6jB56jb5ɆmԄ6jm6ƶy=cӘѢnDúmD ׍hX76h!cpFF4M6d ^b4m"7tIib{_W-ZF-!c1{%6jaȆmԂ6jm6j ?3mRۨm&+^9~<Ũ-FmX7jm6j SjuJmFm!c)jdC6jC6jcuĨ#lԁ6m6 üa;Flِ1WUGmQl|RڨQۨK6f.QWa5l]F]!c~.7m6 #@kغjudC{ujuzd#񈳏DݨF=zF=!c9Sm6 ۨmSۨm#2QڨQۈ!;~O#F؈6b6b!cFF C6d >9%Fm#ۈ!2Sbl>HaTVMb>ߨQۨO6d ^7úQ_m>Ql|RSm6 ׍F}FAO01֍j dCu 6` ȆpNih@6d hۈ%Ogb#oĪmbdCu#֍XXl#lnºmĒ )FF,ѐlu؛&FCNi) 6b ɆFCX7m46 |/a{cFCl!ِ1FCvwSojH-]x/}55A#stjw~#7F7RF4{4).z93s~c\ݗ1x=h AcƸ4&2+ùZDc\j&dڦ|h"z&lhB6d ~~Cx~C&F!coo뚨m46 76m46Ȇ/Θq8pFG6d ^7`݈Sۈ6Ȇ-EFG6d ^7⠍88l)qVLbvM6bMɆm46m46 )MTm)єll m4UhmēĈor6ⱍx!ci<;6ⱍx!cpFF<O6d omīmc dceCf11Dl#ln$m$ H66!cm$m$`d/59hb$:-MI$&0Qm#H$2m$m$bdC6DDl#lH66$1+P}&FIn$m$aIdCE%6$!cpIFFD6d ^7$$l#ly}]&Fx %m$cdCH#b16d!c$9IF2L6d gbb jF3e`h hF6d ^7LmьlF3hF3lِ1xhm4Shf8,;?FqfGs9-,c--c,cZZ[X>uuu}nlbjf2222ee+XoXX_X?X0ͩƥ)bSs77}ssukk\sq2?9<55986{59qͩonk\sukdK->] OBmтl|MZm6Z #@{-6Z`-ȆbZ@-6Z`-Ƴh)z7jhI6d 'a_>hm$2hhI6d %Rm%ъlttZZ h hE6d \|.Jmъl|NiVjVdC}s+hF+lSqcLOzSTmSlS!c1zSOOɆb>{1m|m|J6d c#TmSl5HzrahhM6d4"^Fkl5ِ1uG6ZcɆ{FkF嫙&,11m6jm6dCh؋Qhm!2m`hhC6d >6ڨm6>#}^hb|&)ugja M16N:ޔ;QZa ~3ϰȆggjam/mEh F[F[!c֍jmdCu-m6bmɆF[hF[l\&F;Q7Nmюl]v]vjvdC6A6aȆF;hF;l=Xaڗ3LbSګm6ړ ׍nWhm'2hhO6d ~>L{hF{l~y[&Fg03la;mt6: ׍ntPmt 2蠶@6d ^7:@6:`Ɯݝhbtu#6:bɆmt6:mt6: ?3wTmt$23mtTmt";8jݺ\}?}s^?}{9鞧k6v1^g\ьtsCX_gY};zЙ{Agθt&2jq=L"d 3Ym3хl xط-mt6 mtQmt!2>_B6d cv6mt6/MzU|~Um+ѕl {̮j]dCu+]6b]Ɇmt6mt6:&F7lِ1xF7nF7!cpݠnjݰndC=f7hF7l ]M/ĜSPln|j_`_ )_9 //Ȇj_`FR=11֍jݱdCu;6cɆMN6lSmt6 mtWm 3-ұC  Cmуlj=dCH/4МCmуl|衶I6j/US mTm$2=a詶I6d Tm$2詶l_rWK1| /66$2716p;qbhm|m|I6d nKhK//Ɇ{//66zR&F/ыh/^F/!c ֍^j^dC6zA6zaȆ6zm6"kCJm+l+!cacCٽ|Ck+l+!c~+o|ِ1x/WFo:T&Fo1sJoFo!c5loM6d popoFo!c97[m7чl8SS9Flِ1̜qbhm6 ׍>nQm!2}>j}d#_}[}E F_F_!c֍j}dCH/4W_F_!c諶G6?R!'G6d c#av?~F?!cp~j~dC6A6aobu?6cɆ鯶O6d N)6cɆF1q1@m Pm 2_kjdC6@6`Ȇhc|ۉ0}>@9,c-cC,cC-c,c-c_[FXFZFYF[Xƾ}kgo262elelelelelelelelelelel|Tݗ6oh: t@qӁ7׸Td ^7P]7jTj 5n 8׸ T׸xD64Kwԭ1H A !cpAjAdC 8 Rm "2A6aɆN11m 6 ``!cororm 6 ׍`AoFCD<C6`CȆTCjlcِ1;Dmc1lhclc(8SQ&P^<J6l: Um %2Ca1J6d > sPP!cCjCad滋D1 6aȆϕϕ1 F6d ދ0a0!c~c1Lmc1lx.l 6m 6 a/:\mc81l|w81N6d ^7C6m8>|[7P~[52V.\<5o뾆V;\<ݿw뾦r[z}tq~3{L΋{~;!!!#p=Aw_`t0B`#ȁa-1"̺:HbhE`1{#j#d7LHhcHlc$ِ1x9#6Fb#ɆA6tpp>t(Hlc$ِ1c$1Rmc$1l̿-ˌr&(G}(Q(!cpQjQdC6FA6FaȆm6Fm6F}[7*cb6FC6FcɆm6Fm6F #= 1162iFbhm6F j1dckYJcĞmQm!2_k1jc1dC0kg *Ckc 1l|m:1ldF~ooȆ;ߨm|m|C6d c#_.l77j`cƐ5g41Ɗ1֍jcdCsX8Um%2Y8c8lW3~Ckc,1l mUm|K6^=cG`Q[Q7u[ooɆƷn|--ِ1*>CKQ ooɆm| m|-1lt5B&8ы8q8!cqpc8lcِ1d m#2SA6a]ϲ71Ƌ1֍j㱍dC6C6cɆxX7ƫm6Ɠ ׍xwdŮ_}[ Aߩm|m|G6d NIppذ=Nm;l;!cpAߩm|m|G6d n;h;ﰍ d\ 11&9eS&mL6& ׍ nLPۘmL 2a|LQ !c9e1Amc=وyř&jcߓ ìS1ҦdC^m{l{!c=DI㲚DD!c5D1ۘH6d >LsDD!c1ژ1ۘD6B*$obbL$I$!c5l3ÆIjIdCs$8LRۘmL"21 ژ1 ۘL66Hq9ecaݘ1ۘL6d oLdd!c9e2S&mL6& pab 6&cSȆ>ْĘ"lL6mL6 ;~;Emc 1lFegϣKQ )!c7@S6`SnĘ*lL6mL6 ׍nLUۘmL%27~cTlc*ِ1T4Qpѝߟ41Mmc1l||31 ۘF6d ^71Mmc1l4hc4lc:٘TmtۯM{jӱdCuc:6cɆtX7mL6 ۘmLWۘm 7煉1C)32Cmc1l hc lcِ1  !cmPۘm$_/c3aݘ1ۘI6d nc&1Smc&1l|2Sfm6f }̈́6fm6f ځ{bbuc6faȆfYjYdC,Y,!cY,Yl}}ׇȳȳ6fcɆm̆6fm6f )2[mc61lߘ mVۘm·̱eleleleleleleleleleleleleGJ*jZ:zFO-c,c-c[,c[-c,c?s|5|[j>m8QW9f.ߋN8Z[Q׳9zf.?n~樫{3.mXk<@wL M6EP}?~91x?Zx^DAmlc.ٸ0mosZi.\+Uۘm%2 k\\!cpsjsdCk\<ѠxMy~ԍyd](m6 ۘmWۘm'2aݘ1ۘO6d VmWۘm, ?fb,phN LpOȿj dCo,PXm, 2XX@6d o@mclgΘ EXBB!cp j dC{, BB!c9e!Pmc!l:񔉱i"aEjEdCs"8,RXm,"2`XXD6d NYm,RXm,&+\XԍŰn,VXm,&2^{1^{blc1ِ1x/6cɆbqstGM%b am,6 #~#Dmc l|NY%jK%dCshclc)٘y!;KRR!c~c)7m,6 ׍n,UXm,%2XXF6ҙ&222e2!ca;Bu2lcِ1xX2e2!c9eLmcl|A&rac9\mc9l]{j˱dC6C6cɆm,6m,6Vw +  !c~c7Vm6V XmPXm 2XmPXmH6z^}VGo6~6~$27~Əj?b? QmGlG!c6~TXI6:~!mRԍnTXm$2XXI6d ދJJ!cJ*z\ލ&***U*!cUpc*lcِ1U*U*!cpUjd}51V9e5SVm6V ׍հnVXm&2SV9ejlc5ِ1v5Zmc5l4&/QXm!2XXC6d nc Fmc l]mQXm%X+ZX7֪m6֒ a5ZZ!coo֪m6֒ X mUXm#넍u:u:!cp렍uj밍udCgm6aȆu:uzcX/l6֫m6֓ XmWXm'2S9ezlc=ِ1zQnҟ316 j dC pAmcl|S6ml66 ol66ml66Qa/Qmc#lnlucFlc#ِ1)66bɆװjF{\ab$7~?mmD6d N S~R l ?mmD6d >m݆㘟7I)̯^}&g(g"S{~gX#~V;\<o~g~3&gxVq=D<{*[L26>b#6&\6ݗ1x=&Ml"217sZ&\6MjdcW3M016>b3#6ml66  mlV،ml&2+6ùbflc3ِ1f{518[Ȇvml6 # #l؈nQ؂ml!2[`آB6d Gl6ml6^ycbl6B[Ɇaewpذ=ݪJ6d ^7ºUmc+lV6xZ#Mmmj۰mdCuc6aȆ-}mj۰mdCs6hc6lc;,]Lvhcvlc;ِ1x6cɆpNٮN6d nc;]mc݆ܗUty6,9vZ~j;e;m2v2v2v2v2v2v2v2v2v1_TӼ/l:pK;~a5n8Ii3x}C[vjkXvk\vP1xkuہ翝dq7`bN8T؉m$2voNlc'ِ1N;Smc'lo mT؉mB6?iԍ_kdEml!cIiw.}616~6~!2//dC__6~6v Oߞebuc6vaȆςwm6v w.].!c9eKmcllm0&nga&~nlc7ِ10Ɇnn!cpjdC6vC6vc{FG"w31=plcِ1x{6`{Ȇm6m6 أK66Egcqi%Oc^lc/ِ1^^!c}pn^lc/ِ1^>HOԍ}nS؇m#2اG6d ދ>}>!c^tOmcl[[c5g'%txW6cɆm6m6 mW؏m'2د8@6rD8!cpjdCoP8m 28mP8m$'015A=q8H6d A>AA!cpjdC6B6bFig%D8!C!!cpCjCdCs!8R8m"2q8q8L6zW\VIqX8 mV8m&2?70<7al0ِ1aa!cpj#d? L#✇##jG#dCG#!c5=q8B6d u8q8J6/5hhbQoU8m%2E^Ql(ِ1x8 QQ!cpGjGcdip}㘰q 8q 8F6d ^7qLmqlnu1lِ1r 8q 8N6U㸘S9ql8ِ1x8qq!cA(ql8ِ1qhql8qhㄨ'`8q8A6d  !c9SNm6N 8mP8anGFoNjqR-]x/ۺFT;8iw`.ߋs;/I?i?|[w{~׃_oWgޯbm+\z+}#uUW\~%2i+Bmm"v$x\q 6NaȆ-N}SjSdC=)cR8m"2_6Nm6N z08-l6Nm6N wwZm4ql8 gjdC}ihil7fwA&obN )mmF6d mmF6d n7h7߰Ȇߠ6~6ΐYqgD83!c}Dg Q8m!27~l ِ1r8q8K6rqVԍnU8m%2ga8q8K6d ^7ºqVm,qlY9׃ʘ焍s9s9!cp砍sj簍sdC6A6aȆm6Ωm6Γ4{-e)8/<<yl<ِ1yy!c9\s%K%!cpKjdFEqYaqYm2qln\uel2ِ1ee!ce W++!c22m\6 )WrEm ql| qEm݆|t>DǙW-x\]ݰݴݲnmckg2v22222eeee/sߖWז7waR_u3p/檺]5*8FWaotU]wj ^kU\R1xotָwFKJ߯ל}y wl]S۸m\#2f| >3q ۸F6d 55k5!cpנkjװdcuCsřᙛ6cɆuX7m\6 a|]m:qluhuleVㆳo6g q۸A6d nqCmqloj7dCk M݉k\Lb/&܋q۸I6d ޾ 76nb7Ɇm܄6nm6n nB76nb(ĸE6RxqllM騣nR۸m"27n~-lِ1ytyt6naȆ[-[dcN>KҚ^jc ]mwlw!c~wo;;ِ1;mwSh3ӸM6|rn+4nm6n aq[m6qlmhml6ِ1rڸq۸C6^l߸7m6 ށ{w6`wȆ;߸q۸C6d >܁6m6tԈycb]oU۸m%2E^]l.ِ1xqw6bwɆm܅6m6 z^:\S۸m#2qڸq۸G6d ^7qOmql|NmS۸gm@m]ۺ?HDy?"0Ou?ӱ;ᄍxFv39/{wnM'}}e}ݿ}2a=vp׃@s}8WW}!codC6cƭ?V@\@ml|ֈjdCp@ml|mxxH6U{طx-m<6 ׍nCl!ِ1xxxD6NM;&#Q7HmlnT?{O6bOɆxxJ6d STm)lShSlYxY㙰 x xF6d $a3g3!c~7m<6 xm˘e,eee5auJk\ TCNb( 1`Kb/ 1`Kb"P1 h&'.=O\{Hm|m|B6d nhOOȆm|m| ِ1OO6>6R/~t҅)]PߜRm#%l7Jzj)dC6RB)6Rb)ɆFJF*Qޱ51R TjTdC6RA6RaȆrA~Rm6R HmRHe+5$|.52RE0Oujӱ~.5 w?gdu=Oq=HC=RziD4껟׃4te ~~4!2!SZip=HC"d / Fm# l8~L#HHK6d >W5"FZl#-ِ1xVjidC=fZh#FZl#UGi&F:H6aȆaisS>HG6d n#Nm#lF:h#F:l#=|}ߔ͓LFzh#Fzl#=ِ14=\WHm'213Fzl#=ِ1FzF-'\ .y_ F!cg:I%2md62 ׍ ndPȀmd 272@62`FW{LjdCu##62bɆFFX72md62 M3B62bݍ+ScbdE&LF&!c^4a5?Ȅmd"2`Ȥ D6d n#Im#B6Z4lPbHE).pNqQp6\ȆpqA m`.dCς]\г` lÅl|Nq6\6\dgMŜ)62cɆFfX72md62 ׍̰ndVȌmd&2E3C62cYF7?1"ld6md6 }e{_Y6`YȆmd6md6 a@Y6`Y> 01~#+7md6 # #l؈fUȊmd%2ȪJ6d n#+Um#+l콸~h_#7~#F6l#ِ1h6/Mm#lF6h#F6l#ِ1x Ȧ N66p.+#sN1ɆmC2Fvl#;ِ16;\fWȎmd'2ȮN6d od6md6r }!pNɡA6d ^7rCm#l.j9dCsJh#Fl#'X8}Ǫn&FNN9]o:Tȉm$29aȩI6d }Tȉm$2ȩE6 T,]g#X\j\dC6rA6raȆ7r\j\dC6rA6raShbv)M6J&7Fnl#7ِ1Wn[m#7lnu#Fnl#7ِ16FnFqU[#XpSp6ȆmAnjn؆ِ1%vSp6Ȇ{Q7hMm G6H01~#7m6 #ȇm#27~#F>l#ِ1|F>|؆;h؁31]A. w wlÝl|}mcdCu w wlÝlu66ܱd{LjdCu#?6cɆE}jdCF~h#F~ 17I)1͝$ -S/o!UZDsI*$ cMR8kPo.]<P{~zEQw iD T  91\Q" zPD|(mT(m"a:T($Bp(Q(D6d G}D!BF!!cBpF!lِ1xY(Qnq*qzҋ<q|–"b1OX ˘e2c󵌕YXZ-c,c-c,c-cJ@Xeee,2V2b9Ńjߤ}!jqk8uP8\<|;"u5΃j?X<5F ިFal0ِ1}a#V(m&2 Fal0ِ1}ahFalXV0E`(Q(B6d {{"F!cpE"jE"dCuQDmQlxz^(*=+ =+Q(J6d 7}sQFQ!cpEjEdC 6m6dbu6aȆab8l^+Q (F6d oF1bF1!cQ (Q (N6(7w]Q\(mW(m'27~Fql8ِ1FqFq!cpšjű O10`S6<6< O!ciSI{mxbdC x<6< O!cpІچ'Ql;gYXj%dCF oP(m 2Q(Q(A6d LQBmE6zҙ&^nxmxa^dC76 /!cp^ІچE6d ^7 / /lÛl<ȼT[S:[m&27a᭶mx S:[m&266 zi J>\)xچC6d 3$:c8l^Q6|Ȇm@>j>؆ِ1hGm%RT6| _ _l×lچ/K6d N_ _l×l܆/᫶m$ abhI؋T(m$2Q(Q(I6d oFIFI!cp%j%Rd01J^EKm6J Üa8?Q (E6d ^7JQJmQlF)hF)l4٠B>4Fil4ِ1x/Z6JcɆm6Jm6J j ?'`O ?X76 ?!c w~j~؆ِ1 ?hOm#2n8c ~j~F@(#))Q(C6d oF2F!cuJN)Q(C6d ^7@e6`eRD6ea(Q(K6d n,QVm,Ql- {ѲjedC{_eje QdlM o~_m'27a᯶m  X76 !c^W6ʑ>Oe01ʉ5l9-Q(G6d nQNmQlF9hF9lِ1rF9rFy}ߦS9Fyl<ِ1R)6cɆ**Q(O6d nH6R8x0U"*ET0O.ۺAEv?|[WR+~E7.ۺWT=5cnџߜ!zj|ݗ1x=p= 2߷""p= 2+lxT)z&F%aQImQlJjJdC=f%cVRۨmT"2Q ڨQ $(lBjF ِ1xu#Pm#$2#am 66 q먱7AFm ׍ X76 !cpAFFD6d mmaF,|dbTeTeTVۨmT&22Fel2ِ1FeFe!cpj*dc71Q֍*jU*dC࿿QF*F!c^ EmT6 ?'mTQۨm Gӓ,F0jF0ِ1xu#Xm#&2nmcdCu#V67r8pĨ*jUdCu*U6bUɆFUX7mT6 UjUQ~M19%Dm#!2ݞ=!j!Fِ1h#Dm#!2$QpsV#8#rGe,2V2aEYƪ[jXjZƢ-c,c-cu,cu-c,c1XXCX#XcXXee,2`K%Yƒ-c,ÄR[?W_P1/T]Bq 'cPqƅR1h|Pu 5.jPXB5.ado~v}s6°0!c(aǷ(FF6d p6°0!cpaFFN67lY#\ԍpX76±p!cFF8N6d kppl#l|MmmcF'aڜ61웫mT6 ׍jnTSۨmT#2F5lِ1jF5jFpl$:ibDw"gjFِ1x݈u#Bm#ۈ 2mDmD`dCsJmD_9wĈw~2Rm#ۈ$2&7~mD ۈ6"6"H!c mDmDbQd7^%(oDmDaQdCDod6(!cpQFFE6d ^7((l:٠՝sF:pl#4mT6 TT]m:QlFuhFul:ِ1FuF .EA5D/Z56j`5Ȇ''QۨA6d nQCmQl|NmPۨm$Wgd_uQSԍnTۨm$2S16l?WSm&Ql| [akm6j ׍FMF4و \6#ZԍhX76h!cojF4ِ1x݈u#Zm#ۈ&2 mDmDcӍm61jojojm6j OP OPKmQl|_Q ۨE6d nQKmQl[ MڢnԆuFml6ِ1:6\Vۨm&2R>OQۨM6d oԆ6jm6ꐍYgu:yJ:F!c^Em6 u`QGmQlFhFl.٨j&F]QoUۨm%2QڨQۨK6d >ԅsJ]F]!coBu6m8>g~n`3oZD=sS;gw`.ߋs;/~=ݯg?|[Wz{^׃7:Ћ փݏ A tvA 91x="b"bp=!2+bl>٘9LǬ+C}F}!cgh3jdCkpmZ_m>QlF}hF}l]&Fc6=fF!c֍j dC6@ 6` ȆYmm4PhmĒ1?wr+gjF,ِ1x݈u#Vm#ۈ%2_GF,K6d ^7bXXl!HMq E 6b Ɇ-}j dCu! 6b Ɇm46m46OVtfb4u6aȆFpNihD6d ^7HmшlF#hF#l1x:6{&Fcы6hcFc!cm46 ׍ưn4Vhm4&2 o m4Vhm4!|O4h"l46m46 M`Dm фlFhFl ِ1&F&FٸoIL8:ܔ8a mđ )qpNSۈ6ȆmAqjqFِ18h#Nm#hJ6h*hhJ6d n)Tm)єlh jMdCkئFSF<8r Lx 3ē mūmcdCF<76ⱍx!cFF<O6d ~C<m$gb$5l\&m$` dCkMPH6ȆF j Fِ1xH66D3ht!&F ~[m$ ˟OTH6ɆF"jF"ِ1xm$m$bId#+M$NI$$l#lHFFD6d n# HRH6Ȇalab IjIF2Xխ}Md_2|/Ym#H&27am$ H66d!cdh#Ym#hF6fZ+x >kk hF6d o4Shm?:R(P)4$!A@$ ܽKZhq(3록~3Wϵ0kzt%2誶J6d t6mtfyRs<,5OKRazYjޖZoKRgXj>@KR-AZh ԆXjC-aZ6Ray?L7q td:us*G߯UE>M׍zqpF=NT5U7u{\7q2_MύldL&즶m npnvSp6Ȇ?7mandC6ܠ 7 7l;٘x@n]u6cɆao162?)YoQ"mt'2讶N6d 讶p' GFptp]mp'2omcdC6ܡ w wlÝloCj؆|ڽL 'ΛjdcW<Cm 2{j؆ِ1}g lÃl܆ᡶmxۮibxyj؆'ِ1'T6<Ɇ'j؆'ِ1'᩶mxmlnbx}:/O祶mx 66 /!c/x⥶mx  /hKm A6~wL=]Mo}Flِ1=6z`=Ȇm6zm6z Ϣ=j=6y4U=[Tia}'tS݁9xu=DS}{Ͼ9xRvgzsS}{~Ћ3z~ ^ ^te zAz~Ћ|^jp?E"d V6zm6F#Ĵ61 oh[m&2#᭶mx _xn᭶mx ϘІچ7ћlXѭ&Foom&2譶M6d >GsDoFo!c譶C6*m2ڵG>oQm!2裶C6d kJ>F!c@}6`}Ɔ9/jdb6B}6b}Ɇm6m6  mUm%2}j}~dH#Ě)6aȆg~pG6d c3Æ(w16aȆ~F?~F1bEFF!cpjdCh8Wm'2诶@62^Jg cl1@6d nc1@mc1l|MהjdCkhclÇlDRneUGj>؆ِ1 hGm!26|6|d#1}[(捁p1H6d nc 1Pmc 1l|獁jdC}c 1Pmc K6 ^gr}6| _!cpІچ/K6d 7|aU6|Ɇ/᫶m|L ?7`S6Ȇema~dC6 ? ?lÏl|S6ɆeK†?᯶m o  lßl|Mkچ?O6d Cj 0GKA A !c5e\Sm 6 m Rm "2_SA6ad51FP6Ȇm@jFِ1הl#lo@jF ٸxA#Po@@l#l|M kJF H6d n#T6Ɇ߇mmbFz1X m Vm &2&w0|&w`lc0ِ17o, Vm &2EC6cC?3O@&1o !!c5e\Sm 6 !o Qm !211J6;?Avcs0 %w8$ Um %2Ca1J6d {P{PP!cSBC6bȆRYLao }c0lcِ1x0a0!c1 ajðadC0hc0l#lsܙr]O#lN l#l tFD6d ~ a6 !ck h#Hm#N6ݙ M:ca1N6d 7þ1\mc81l|gjñdCkphcplc:KL:eN1A6d nc1Bmc1l|Mהj#dC6F@#6FmlyHKmbXjZnYj- DKm6RbEXjZ6RԦYj-LKmcͶXjs-XaEUtck:/{\08`=.`q2 T{\08`=.y4ő߭ wGE0walH`HsDʷw Q``}Q(Q"2`?1 Q$BJQj&Fmm`!dC6Bl#lZ)^+m`!dC{,!FF1lgc11M6d ~hxhh!ckZihlc4ِ1}j1dq_sH1c1jc1dCQm!2_S5elc ِ191%~?G#T6B6BP!c5%)jF(ِ1Ph#Tm#%27BPPl#l\{L0qQ S6Ȇ maadCkJ\S6°0!cpaFFN6䵉.F8jF8ِ1הppl#loþm ϢFF81l޾ub—&Xac,1Vmc,1l| gѱjcdC}c,c6bcɆ獱X8Qm{Ě2)6aȆ#3~Gf8lcِ1;@qj㰍qdCk8hc8lc<&xxxx!cYto$lcِ1I$I$!cyc1Imc1lD{wnbL6&C6&cɆpޘ1ۘL6d nc21Ymc21loL6&mL6ebbL6@S6`SȆa:9c8lt_'[DBژmL!21ژ1ۘB6d 7@S6`dc+N]01"h#Bm#ۈ 2oDmD`dC{_p+Bm#ۈ 2mDmD`ds'Ϛ;wr#6"H!c{#jF$ِ1x߈}#Rm#ۈ$2 mDmDbQdnuĈ)Q:%Jm# ۈ"23{QjQFِ1F߈Rۈ6Ȇ(h#Jm# ۘJ6ݔqcӆ ;lNUۘmL%21ژ1ۘJ6d LkTT!c𽯩TF4螪]GLh1oDy#Zm#ۈ&2߈jF4ِ1hh#Zm#ۈ&2_ShhlcٸSMiξaɝF6?{5MSۘmL#2`ߘ1 ۘF6d nc1Mmc1loL6mL6 .Ę.̧=jӱdC6C6cɆ1ۘN6d 7C6c361f8L x¡oPۘm 21ژ1ۘA6d ; ;  !c LQc3v3ż136fb3Ɇ7fj3dCװ35LL!c8S1j362$7%}<4+9,Yv.<ηgf1K`݁9x"vo'Y?~ǩyptg,b`d 1G9"F}cp?/c~AA 1@ bHA m&+zc1ژ1ۘM6d nc61[mc61llhcllc6ِ1lM6AkL9b9js9dC3~Qۘm!21ژ1ۘC6d Lhclc.٘>>csؘK6Lnic\lc.ِ1\5Wmc.1lc.1ۘK6d i5٘1ۈ%);>.eb FF,K6d I,|$Vm#ۈ%2oĪmbdC6bXX {_9{Ӌ|7],o-Zj,ŖKmR[nVZj,ՖKmR[om~6Zj,͖KmRnvZj,ݖ{_Q =j߲E<17σsِ1||!co>\m6 ù7ᰑ=q/ޝj2|lc7+qֹ&ac@mclhclcِ1xX!cj d21  j dC6B 6b Ɇ/Z/ZXH6d c#3F.KKQMXm,"n58X$ޥKs"lcِ1>"OHmcl|MYהEjEdCk",RXm,&/9)`b,}c16cɆab:8c8ln\XL6d ,kbb!c8m,6V~bb,)Ku%!c}%pnlc ِ1xX%!cyc 7m,6/01 KjKdCH b$16bKɆm,6m,6 o,UXm,#V3X&֔epMY XF6d >o,2e2!cpˠej˰edC .6m,6 BZ\̢,\mc9lF'g b|,ZZ˱dC6C6cɆrhcrlc(`M!& 7VBmcl|Xj+dC6V@+6V`+Ȇm6Vm6VZ4lbtL1V s/ Rmc%lotqpذ}kJlc%ِ1+i+6Vb+ɆA6:c8ld~RޢLYXE6r} &*7VJmcl|kZ XE6d }RXm"2٨aTQZdciSR11V8qO׫Ʈx^jdC06LXM6XM6d kjj!cavKjAOq 21ֈk5vlc ِ1k6`kȆm6֨m6֐ ߚRZkd#͵K#}MܵܵjkdC!!UXm%2] Eתm6֒ X mUXm#q"8X'__XG6d >o:u:!cuj밍udC069c8lMf.:lc=(|Lzhczlc=ِ1zz!cp롍j뱍dC6C6cƋjebl66@66`Ȇ pؠ@6d ncAmcl pc C^gC^߾ rE-spvo{/j'b_Db?I8 <翨/ls~3^q9 l`o`#}jq?Hd imT؈F!c7l66ml666+W_jblצ&M&!cpMjMdCk&VlR؄ml"2&hc&lc38Q陈N&f߹66cɆml66ml66 ͰolV،ml&2fhcflc ٨s囆M-bMה-j[-dC6@[6`[Ȇ-)clc ِ1--V/*KcXS5eVlc+ِ1VV!c$t5aã J6d >ol6ml62UMmolS؆ml#2gggg6lcِ1 )6aȆ6hc6lc;X3]ἱ]mc;lol}cvlc;ِ1)6cɆml6ml6v llb6v@;6v`;Ȇm6vm6v _);6v`;ȆSv@;6v`;F̃K71v5e'\Svm6v  mT؉m$2/c'/cNlc'ِ1x mT؉m"iB_%f]pݥ E6d ..].!c ]j]dC.hc.lc7y&nqnxnn!cjdCn8oV؍m&2حC6L&]5c{`أC6d =!c=j{=dChc a.;{#{-gXjZj-CaK툥vR;f~NXj'-SiK팥vR;g.Xj-KeK튥vRf]nXj7-[7ݲ'*N{s=r/83u2vGU'ch/{^R1^^Wz׿UxG6^i>9lN>}>!chm6 _ST6aȆm6m6φU+kbw0G'#m6 ?[>[_mc?l|6gjdCjdvqzMb/܋9q8@6d P8m 2q8q8@6d nq@m+hxcp W̯_6~6~%27+ٰ=ƯƯdCƯpUmWlW!ck__6~6S^z51qjdC} 6bɆA7m6 A!Q/~`|LC{]R8m"2q8q8D6d nqHmql~C!Ca;6KLwwjdCt>aa!cpjdC}0qXm0ql8nj8"l6m6 _װG6`GȆm6m6 8mQ8m%kw501 GjGdC}(G6bGɆ9 9q8J6d n(qTm(qlwDŽc1c1!cq cjǰcdC}6aȆ|?^8q 8N6^k_F㸰q8q8N6d >qq!ckql8ِ1x8mW8nx7l]uloPojEwߞ :M7sDyeuf?I=d΃s :>q);!88>'p?8Ag_0{Z1:~;Z'p?8Ad V"NE1 h l$py83WX+NpRm$ql|8 {II!cp'j'dC࿡6Nm6N ǍKD8)S)!c1Om6N 7n)S)!cpSjduγ&21N jdC}46NcɆi7Nm6N )j3dÛ21g3jg3dC6@g6`gȆ7Ψm6ΐ _6Ψm6Β2n98+捳p8q8K6d uiU8m%2ga8q8K6d 6Ϊm6Αo]8'l6Ωm6Α #8m#2߷8-Ωm6Α 8mS8m'g":]듉q^~~^mhE߸}}!cpjdC{}}!cC6m8<[[;tvo웃'eݺ9]}Gc=gxv@kVTxm<$2_+Pm!l|xCC!ckӇC#Qx۷Dx#G#!cGjGdC6A6aȆ#h#l1٘'Lchcl1ِ1xx cc!c=pOcl1ِ1c٥ML'bMyה'jO'dC} O6`OȆ7m<6 _>6m<6 >Xcb!oِ1={VPlj` ??66UbZǮ41秞秞m<6 o@6>`F֒7%ib|kG|Tm|$27>yGl#ِ1)6>bɆOm|Tm|"tgbI̢,Iml3Æ6>aȆa?kOjOdC6>A6>aFҞy11>jdCg8o|Vm|&23gl3ِ1jHKy/8oِ1\SR l| mmE6d {__ja_y{M/o|}l ِ1//!cy 7m|6 //vc6$ L߰[]9L]mw`迃3O$vMoed΃sW:珮ԩU_>_q?Jg_sW8G|U;Wr c+\+E|+1Znޗu߽nǻ89Zj,RKh%[jI,Z2K-jRZj,ԖZK-RKoe2Zj,̖ZK-Rnr{_R6Y SW>qE3?_q\]'qq\QSǀ=.k{\W1`b'+q{pK6.)/#+_⺢/F\l#.ِ1}q]}q6bqɆmą6m6 qjqxdک&FFbl#1ِ1)6cɆ N~ NHL6d n#1Xm#1lL}&Fq ^&QHm$!2.+z.Fl# ِ1)I6`IȆg$F$FRo6Rm6R zUY#+z*WTjTdC}#6RaȆal4wp0_] TF*!cpTjdլJż6RcɆm6Rm6R ltpX'[De)HM6d 6Rm6Ґvf)ibkJQHm!2MEӨm6Ґ j.Zi4dC6@i6`iFn51ҊjidC}}UHm%2HZWjidCkJZh#FZl#غ6 Lt6ٰ 6aȆהtpMIHG6d TwpبRObhm6ґ  5Nm#l؁ob}#=6cɆהpMIHO6d 7j;c8ldgؓ-w16cɆהFzFQ_sļ62`ȆF72md62 Zkݨ6w162`Ȇה F v2z^y.#%ZDFsp۳ujr>[~_ R}wph?I;sLtΧ$֊LpȤ>p?Dg_ tI ȁa֊ZHD&Ld"2?e&h#F&l#3HE2}}62cɆpȬL6d V4spxկ|Ck#3l| mdVȌmd!051,jY,dC6@Y6`YȆalto] ,F!c3 Em# l|yxU mdUȊmd%2_S5%FVl#+ِ1̚ᰑDſJ6d n#+Um#+lGeri&ld6md6 # #Mm#ld㶛34w16aȆmd6md6%wL.Dmd6 odWȎmd'2YS;cZٱdC6C6c9ȆoIdbh8Pȁm 2G8G8Fl#ِ1,΢96r`9ȆmPȁm${?2$$Tȉm$2EsY4FNl#'ِ1=;9=;96rb9ɆFNh#FN a.~aw#=-8oSȇm#2m6 ?>Om#lF>h#F>l#?Xt/Mb.?ܧ˯O6d 7þ_m#?lo}#F~l#?ِ1 C6cFnҞ}}6 `Ȇm6 m6 |WaF!cFFA1q ,Z΢6 bɆm6 m6 Ϣ,ZPm Ql|M)mT(m"oYQHQHmQl|(BjBdCkJ!R(m"2Q(Q(L68k01 ߌ ߌ m6 °oV(m&2Q(Q(L6d ~ [(Q(B6v`bh8Q(m!2y&3Yܙ(m!2F|FFlِ1x(mQ(m%nEŚR)E6bEɆ* *Q(J6d n(QTm(Qlo6m6p&F1kJ1bF1!cpŠbjŰbdC)uJ1bF1!ckbF1bFq&Fqa8Q\m8Ql|(jűdC)uJqFq!ckFqF q3*(!֔pM)Q(A6d nQBmQlF hF lِ1Q(Q(I6ZPdy&FIa$QRm$Ql$-Q(I6d n$QRm$QlFIhFI C^?g몛=[\I~P.܅۳u?v}xPg<);=ɜG9RtkrQC`?(>p?(Eg_kE)蠔A)J["J~PDQJmQlL&]C&Fi1cFil4ِ1ZQ6JcɆm6Jm6J ?wY(QlYME6~6~$2܏=s?mmH6d >GW6~6~$2ǏƏj?beʪm;cb(㊾QFm Ql|ߢ ܷ(Q(C6d ~_Fx_F2F!ck2F2FY;MղղjedCFY8oU(m%2, ;˪m6ʒ ejerdcVyĽ~~6aȆrp(Q(G6d YwS(m#2Q(Ql8L,ER lOOj?a? Ϣ?Y'Ȇ-~6~R (O6ƭ8zQlĉFdcW<j屍dChy8W(m'2Q(Q(O6d >o6ʫm6*=&]51*y7*mT6*-ۨmTPۨmT0\"QڨQۨ`vD nQAmQl ~\TU&FETkJEFE!cY"E+mT6* ۨmTTۨmT$2mTTۨmT"/moQIJoTRۨmT"2|F%lِ1uJ%xRImQloT6*mT6*yYlbT{_WeFe!cpFel2ِ1FeFe!cY2QYm2Qlޝb L*bMה*jU*dC0}3F8OgWQۨmT!2_S5Fl ِ1xߨmTQۨmT% sMoT}FUl*ِ1QU6bUɆ̫=jUdC6BU6bƩ--11 ՠjjհjdC@W@WSۨmT#2`ߨQ ۨF6d nQMm0߿SZMKVRcյYj-ZCKRkb5ԚYj-ϖZKKRkcYj-ZGKRbu:^שx:|U=:8V{=:qթ|׿Wd ~?su㪫{\u hkF lِ1>]gg ۧkm6j 5WCmQlF FMQDg"Lb6 gj5dCssM87Tۨm$2QڨQۨI6d n&QSm&Qlug$`ߨQ ۨE6d S Rۨm"2͸͸F-lِ1\ ڨQ ۨM6']kQ[ب mVۨm&27jyFml6ِ1}H}H6jcɆFmhFmlpWQGبmQۨm!2_S5Flِ1,Z΢u6`uȆmԁ6m6 aQW<]>]Wm.QlF]hF]l.ِ1Qu6buɆהF]F=1&F=1փh=zF=!c5\Sm6 ۨmSۨm#2QڨQۨO6&WhQ_)R_m>QlF}hF}l>ِ1F}F}!cC6m8j`C#[$ "Ewߞk4P;h`w`迃s;~o`?I8[st\׼C a?h> q?hHg_!tP! Ɂğpl$B3fChFClnzRK?#9F#lِ1Θ6aȆ׊F[4Rhm4"2_+A6aŽgg6cɆFc7m46 ưo4Vhm4&21C6cMF51D,F&F!cD Ck фlFaChm4!2_S@M6`MƙoF;vF;!cpvjdK#}텍F{F{!cpF{l=ِ1F{F{!c5=^m=сl8^(PAmtPmt 2a<-'.Flِ1)6:`Ȇmt6:mt6:QmtTmt$2a訶H6d /vTmt$2訶D6MN9N9WImщlF'hF'lِ1xF'NF'!cyImљlk=U &Fg[[g[[gFg!cpjdCװ5lgFg!cpj.d2˙]Ě)]6`]Ȇmt6mt6 mtQmt!2_S@]6`]Хm61p﫫FWl+ِ1FWFW!cy+7mt6  mtUjz?0~nxYj-5wKRԼ,ZOKmXj}-~ZKmc |-5?KRdXj`Km6RfYj-tW1oá!%_nu=u=8v{=qݨ|/܋qpF=N=q=^ML 71Mm p#2_禶m p66ܰ 7!cߌݠ 7 7 C^ͳu^aEwv.u=AwsDߞ~wn?I=[sw:?z&.;;}Ёځ;@pWpD:pWp6j}>dC}F>F!cYEm6 >F>F_$O\Lj}dCߑ+##chm6  mUm%2諶G6~]_'ϕ_iSm#2|F?lِ1W?Omяl|MmSm'9__m?џl D0Fl?ِ1xFF!c诶@6~y)gc1plcِ1u>jdC}c|!c؆(&mm`>dC6|  lÇl܆᣶m )>Іچ1l,t1P} 1H6d ~2t@lc ِ15@mjdC6B6bd# w#mbdC೨/nچ/K6d 7|aU6|ɆmBj؆وwOL ?5Om#2~oma~dC6 ? ?lÏl|66 <11E}_m'2omcdCtW6Ɇ?᯶m "Kyhb 6A6aȆ 7m 6 _T1D6d ~21 w&71,gl#l:%^m`dCkJ\S6!cpFFH6 ?{(lBjF ِ1@h#Pm#$2ombdC6@@lc0x]&` k``!cpjdC}c06cɆg`ѕM41!:elcِ1!!!c1!jC!dChc 1C2|{&i(C"Ew5:v0<홤Uod΃s>T}·~0yi3~0 a? ate ~m: ^S;0r cb\+E `1x?m Sm K61=;A#Hm#"26 צAjAFِ1^x R6Ȇ h#Hm#N6n ca1N6d 2plc8ِ11$6cɆalkb 6c#Ʀ??jbp^{vF Ee1A6d ~q1A6d 7F1Bmc1lt1Bmc݆/}M/0wq[1ReXj-1Zf[jc-qxKm6RdMԦXjZeMԢ-itKm6ReXj-9\K-ޗ`q7y,XUSL=NQ0=.`q2q{\0qd >7qxI67bt͚o$;S'cgOcHlc$ِ15HxM5Rmc$1lHhcHlc$ِ171E6~&(17s(Q(!chFm6F a#NL C#_'.(lcِ1Q(QF٘6ù&FXSBm ͆=l#l*^Sm`!dCkJm&>a1Z mVm&2F#!1M6d nc41Zmc41lo6Fm6Ɛlb6@c6`cȆה1pM1C6d ;Qm!2c1jcPS߃o01Bż PPl#l D0F(J6d ~Y(,Tm#%2 mmbadcǔ51saK#Lm# #2 װajaFِ1ה00l#l|M 66°p$zCrU&FomcdCߑ ߑ16±p!c5%)jF8ِ1x66±dít,71 cjcdC)cuXX!cpcXlc,ِ1X8q,:΢6aȆap31G6d k8q8!cp㠍qj㰍dEYż16cɆx7ƫm6Ɠ oWm'2`<1^mc<1lIT%u1AؘmLPۘmL 2KCkc1l|ޘ j dC}c1Amc1lTwj1Q1Qmc"1l:e"N1ۘH6d ~ ;^NTۘmL$2NmLTۘmL"[{x1IؘmLRۘmL"216l?MRۘmL"21 ژ1 ۘD6d nc1Imc1l/hc1ژ1ۘL6d 7&þ1Ymc21l| gjdCM6&mL6ibL)Su)!c觨mL6 )oLQۘmL!21ژ1ۈ 92x7y=Ĉ6"l#lFmD 7"6"!c5%ڈPۈ6"4x#RU}Χ~MK؛kFzѢDó>ѸDٗ1Z DD~Md hhI#1hhlc7&4alL#(mL6 Ϙ9Mmc1l|s1 ۘF6d >GL6mL6{+m8Ę.fpƜ1ۘN6d >GLstt!c1jӱdCppcb 6c3ȆĘ657D OCj3dC}c36f`3Ȇ 7fm6f  Lqp~&L1ōLL!cp3j3dC}c&36fb3Ɇalsp}ٞlwZ3Ydܓ}LY♤YYjYdCςRۘm"21 ژ1 ۘE6d c#3Fc<&chm6bƱҎ1b3wƨm`1dCgc6b!cp1FF C6d 7b`߈Qۈ6f.<61f}v1fm6f Ϣ,:[mc61llhcllc6ِ1l%&71Gmc1l99js9dC6@s6`sȆaldrp֗W16`sFīu01m6 }ͅ{_s6bsɆS딹jsdCpꌁSm6bEgMXq Sb6bX!c53ƷOZF,ِ1Xh#Vm#ۈ%2$ڈUۈpѼFΎyx̷Xj -EbKmR[f-VXj+-UjKmR[g6XjXj-MfKmRfmvXj;-]nKm0<7O7z׿ypqpG=N ̃ Syͣ'cy{<'3nD9^*@1 jdC0_g W\YZdCs|87Wۘm'2ùy|lcH5ʪmMjZX@6d 7@mclj dCs8-PXm,$􅴖&B7¾Pmc!lf3FϪRZ dCkB,TXm,$2`!Pmc!l|0uMEo,}c"lcِ1"Hmcl"hc"lcِ1Fpug *$."lc1q󬉱XŰo,VXm,&2] pm,6 ἱXmc1l^Űo,VXm,!p`b,}c K6`KȆ%pXXB6d 7Dmc l%%Rz]cXXJ6d nc)Tmc)lRhcRlc)ِ1sKew_ձ ()nP)NhKKbBHHB`!@ƐBgi|zvYf}6v`dNq521\Ŝ W WlÕl]Wچ+J6d p]6\ W!c mmb;F';NN!c֍j;dC6vB;6vb;Ɇm6vm6v :KmR؅m"2Ew^t.lcِ1.Kmcl.hc.lc7h&-l6vm6v ׍ݰnV؍m&2_jdCnhcnlc8vE)UM=hclcِ1==!c֍=j{=dCucGmc݆^ 3γu{)j{"œws νj{S{!G+껿~Ӳu{=߫{q=G|˝czD=>߇>2_`91\"zD[b}jdаIS~+cb6C6cɆm6m6 ?~~!cpj 71u-Kn†ᦶm npSp6Ȇ7GmandC=ᦶm Q8 Y=Y=q8@6d ^7q@mql|N9jdC6@6`Ƣ}cB AA!cgݜ16B~Ck qlAhAl ِ1 qPm qȬ?"Y8$Im6CpN9q8d$"NrNm6Չ!h!l0p4=aa!csjdC6C6cɆ6m6۾ib؋Q8m!2G`8q8B6d >s#!cq8q8J6zQQ!cpGjGdC6BG6bdveFd61Epu]mp'2nmcdC6ܡ w wlÝl܆;᮶m#]b˟,8&c8q 8F6d S7z:c8llp0Æ8m#2q 8q 8F6d N9mS8m' "ҙŷoW8m'287m6 6cɆqhqlhZt|ҍMnu lِ1:3FmYZ'dCu'6N`'ȆO@'6N`'ɆObR'{_Ia;qRm$ql𝝓j'dC6NB'6Nb'Ɇװ'j'SdJ-'51Nu)N9q 8E6d o)S)!cpSjSdC)h)lÃl}0 dy7>Cm 2_xuچA6d nP6<Ȇϝx@j؆'٠/51<OdCό}3c lÇl|6|6|d#Yěii!cq֍jdC6NC6NcɆiAo5<11Έ5:q8C6d 3!cpg3jg3dC6@g6`dY7M _aU6|Ɇ/j؆/ِ1_Wm%2 mmb~dы61ij?Om#2mma~dCཨE6 ?!cp~Іچ݆Y6ٺPYvݺ9Yv>[wgweOyqtϪY\w$}pv?91xEEzO"d ?᯶m#!qqN[6aȆsp8q8G6d G}9s9!c9h9l#l8^{6l#lFm ׍X76!cmm`ɆweMyhyl<ِ1;$aoq^m\6.m\6Fwt9obFFD6d SA6 !cpAFFD6d n#R6Ɩ%3núm  V6ɆmCjF0ِ1CjEm`|㢨aݸq۸H6d o\T۸m\$2_\딋jdCEhEl#l8q61BDu#Dm#!27B`m ol#l|N 6B6BPUk{F(m }PPl#l|N sJF(J6d n#U6tڃ31Ĝ00l#l| װajaFِ10h#Lm# #2S 00lx1}GMKn\u%lِ1x/z 6.aȆm\6.m\6. ?_m\R۸ma_=dbFF8N6d ^7aW6ɆuﺇmcdC6¡ppl2ٸ&n&ea2qYm2qlehel2ِ1:2\\V۸m\&2S.C6.cWFu^cb\s]s]Q۸m\!2qڸq۸B6d N)W6`WȆ{++Uq)2*&Uo\UU!c~*7m\6 WaqUm*ql|N m\U۸mDSo!lD@jFِ1h#Bm#ۈ 2nDmD`dC6"l8&5q<[pMmql5h5lِ1xݸ5k5!c9qMmql8|nV7~ul:ِ1uu!cq֍jױdC6C6c7ƁC7Nlbp07ٰmHP۸m 2qڸq۸A6d ^7nqCmql|NmP۸m$%2xV`bu&76nb7Ɇ)7:Ml&ِ1MM!c5MhMlضΣ5&-ыނ-[-!cgm೶[jC6nA6naȆ-h-l#ltt=LHQ7"a݈Tۈ6"ɆH8DmDbdCF$7"6"H!c~#ڈTۈp/:}݆j"œ{I V;mw`.ߋUR;/*mݿmiœ8$݆߶sw_ݗK/Kw,cw-c,cі}C#cXe,2oK%ZƞZƞYƞ[^Xi{m{c{k{g{o`hKծT}ַʶԔ(gc^*f{Y4J]ŢEULZgQz(g2y`eRW( )Qm#ln|uGl#ِ1xm|Th>LO~C͎$.gd䖱TԖ4t 1XFX&疱̖,l얱\ܖ<|/,c]}I=QqJ$.hSq:K5. q}%qI$.>u X㒸O >%qA5O1~̅? = Lm3l3!c3}ِ1\6>6>#2O3h3ϰdQ51 IjIdC6BI6bIɆm$6m$6 ׍FRF2̥҃rɄdF2dF2!cpɠdjɰddCkd.hMLm#l|/&Lm#l\3MFrh#Frl#9ِ1x6cɆm$6m$6 )ɡjɱdcf61R^4ESm6R wwpذ=JHA6d I I F !c9%Bm#l[r튌&FJQ7RºRm#%lnu#FJl#%ِ1xH FJFJ!c9%%Rm#%lԫD&F*a#Jm#ll]*t.F*l#ِ1>]*OJm#ln6Rm6R $IӘ]wS7Rm6R a/Zm#5lFjh#Fjl#5ِ1xH mVHm!G٩&FQ7Fm# lTog \7۞'16`iȆ4ji4dCu# Fm# l׭iEH FZFZ!cwMҺwMҪm6Ғ H mUHm%2ijitdJ1҉֍tj鰍tdC0sJ/g >;[E,I tF:!c9%Sҩm6ґ ?LmSHm'k-୉^HmWHm'27~#Fzl#=ِ1xHFzFz!cp額j鱍 d#CT412 j dCk p Am#lFh#Fl#ِ1xȠp!O 9Ep6\6\ !c놋چ B6d >9Emp!2mm`=312}ьp_4FFl##ِ1FFFF!c}ьp_4FFl##ِ1ȨD660# LjLdC62A62aȆLpNɤ D6d <%Im#݆.w?[ :AZv?g>>W;\<տlpWs~Ӳ'zs^s\2=߽a݇^f]odV̸d/c}p"Af\2aY-"3I-2C62cYƍ61>" #md6 ?G,F!cpY,jY,dC}Dh#Fl#+h_C&FVԍd!jYdC޳gY6bYɆmd6md6 ׍FVF6q{&F6~&7(md6 ׍lndSȆmd#2 Ȧ F6d 6mdSȆmd' :~\.#Fvl#;ِ1FvFv!civ6ͮN6d ^7C6c9w ^ܸjb{Z9VF!ci&ɡA6d 6צ96r`9Ȇ{6Cm#lTP*p# HN j9dC6rB96rb9Ɇ W96rb9Ɇ-rB96rbȆkZCM\nu#F.l#ِ16\Rȅm"2 ȥ E6d o6rm6ra# 61r5lnͭM6d .ǹ6rcɆm6rm6r  mVȍm!Gd}#l6m6 y`/Gm#l|Sm6 yX7m6 )Om#ln6m6 9c_^ ؋~ِ1: NBm l !c_m|m|A6d o|m|lLo&F~1sJ~F~!cpjdCu#?6cɆװj64߇_s|;-c,c-cE,cE-c,c-c%,c%-c,c-ce,ce-c,c-c,c-c,c_Z*[ƪXƪZƪYƪ[jXjZjYj[XZYSj\N?NDoTF5q)4\jm.qp+@5N5q5q5_A1(ݮ9Mb+翂jdC_A8T(m$2Q(Q(H6d n QPm Ql:2oZ! F!lِ1R Ȇ1C!BF!!cpBjBdCkBF!BFaёk01 90S m6 ׍°nV(m&2Q(Q(L6d * mV(m!4kbsJ8Q(m!2?[-Q(B6d ̸|f\DmQl|N)mQ(m%vEŜR)E6bEɆQ+ Q+Q(J6d n(QTm(Qln6m6&F1aQLmQlnavlF1lِ1R )6aȆF1hF1l8@EQ6cɆjűdCu86cɆ{FqF 11J%j%dCP(m 2/Km6J (mP(m$޿(S$ٰ}ЩFIl$ِ1x( FIFI!cp%j%dC6JB%6Jm8y2gf6=9[W v"JE'+׫Jb浜gJY}sn])xKy)\J=jmk ι|p4}WJ~i\Jݗ1Ei蠴Ai\J׃ҰV(Ai!cGihFil XnQF?PFm Ql|(2je2dC6@e6`eȆ2F2FYd~M.ʺߟ*Q(K6d YYYYFY!cpejedC Be6bƤtEJXjbu6aȆrpN)Q(G6d nQNmQln6ʩm6ʓg(/g˫m6ʓ ׍nW(m'2Q(Q(O6d nfat=CkQld951jQ֍j5dC5FMFM!cp5j5dC6jB56jbǗVĻ~~6jaȆB@F-ZF-!cpZjZdC06:c8l[+z2F-l6H1u-MFmhFml6ِ1xQ6jcɆmԆ6jm6j ׍ڰnVۨm!SۥQGI$Qۨm!216lm6 ۨmQۨm!2QڨQۨK6OĨ+lԅ6m6 ׍nUۨm%2QڨQۨK6d g QۨG6:D/Z6aȆatpp̯+$F=lِ1h=/ZOmQlnԃuF=0a}x45555555}eke222222222222222222}T8jhg8{1^L}uk\}q25>8?3W׸է'c5U}q׀lt5   6` Ȇm46m46  @mрl|m46/Z z!\o7Thm4$2hhH6d \!|.Pm!ѐlFg o?/9?'16m8y5rn<[VFj"œ{5χ4;0Ok;5F~{Yms^qϟ|sܟ\\{zИ|տml51w1vcxAc\aX-1IphhB6QD4{,M6`MȆ!ikD&F!c> #m46 ChhJ6/^cb4돦pTm)єlFShFSl)ِ1xh FSFS!chhF6uH몚&F3Q7LmьlF3hF3lِ1l3e4Shm4#2QaRgd fFs%qh.~ۣFsl9ِ1FsFs!c֍jͱdC06 9c8lm~5(hA6-m8yeطhW"-6Z`-Ȇצ-ڴF lِ1ڴ\Phm 2Qa;*{ROhm$Je`bFKoThm$2hhI6d ދhKFK!cE1|ZOhm|E6R-8_WWdCsWpNJm+l+!c~+o|ِ1Ȇw[g ]"RI VdcZJ*21Z3VjVdCu6ZaȆVpNi hE6d c3Æ6Za_'=*fb|-װn|55ِ1x֍66&2_údC }:c8ler2hM6n&Fk s50[nVhm&2hhM6d oFkFk!c9'16Zcmƽ=8m`hhC6d >sJ6F!c֍6jm6dC 8c)m6`mFKegbuS̷ ے:l#_mhK6d n-Vm-іlF[hF[l-ِ1F[F;A֛h'F;X7کm6ڑ hmShm#2S9F;lِ1o{6aFIK/nb8mq^m=ўl9l{F{l=ِ1F{F{!c<6ګm6: g11:g3jdCh؋vPmt 2_vkjdCmtPmt$54:QmtTmt$2S:9FGl#ِ1x6:bɆmt6:mt6:w9$N褶 D6d ^7:Imщl|NNjNdC6:A6:a}Q Y mtVmt&2謶L6d ^7:úYm3љl[j.dc[򷊤419 Smt6 )]Em хlFhFl ِ1xmtQmt%9CD&51w{w{mt6  mtUmt%2S9FWl+ِ1+Um+эl,0Ⱥ!`覶 F6d nMmэlntuF7lِ1ou6mt6Tٛ}gbtFwotWmt'27~Fwl;ِ1FwFw!cpݡjݱd&FaCmуlFhFlِ1FF!c9Cm݆pLO}6z3I=^="zE'Mb)G v\<տLROx{~O7O.{_==奄=q=E|߇SzĻ~量p=Ew_}D/GR;A/r cz  ׃^$Bk^F/^Fo+Lb jdC [m7ћlFohFol7ِ1ڴ7[m7чlMX>j}>dCu}6`}Ȇm6m6 ׍>F>vᄌ_z߆q|,c-c,c-c,cXƾ }gjfnaiemckgo`hdlbjfnaiK_qq+׸Td @/g GW]חjk\_Xk\_\R1Z/q}5/V5cb6A6aȆ:F?lِ1~F?~F?!cOmџl8>뮉_a_m?џl̽16ƅ6k\Obhm6 mWm'2C6cFQ "MojdCuc6`Ȇ tm 6 ׍@q(=KnE@@!cm 6 {6{6Pmc 1ly@ Qjg& Q71Hmc1l|=m 6 )2Hmc1l|Nm Rm|C6~i4ahooȆ7n| ِ1oo66!2 7Ʒd#ݮ9CMos[a;ƷƷdCu[X7UlƷƷjbߒ Vm[lc0X9mQ&`o ``!cߑ Gf`lc0ِ1x/:6cɆm 6m 64y.hb ucC6`CȆ!pN1B6d !AC6`CȆ)C!jC,s߉wjaߑ ׍`Nm;l;!cpAߩm|m|G6d /wPg{m51o 1J6d o PP!c~c(7m 6 {61F6W)|Lab2 Sm 6 m Sm #27~c0lcِ1xm Sm ':oeb po Wm '2Em 6 )2\mc81lLphcplcS20 cxGm|Gmlcِ1!c1֍j#dChclc$ٸ7,wcSF9eHlc$ِ1Rx$ٰ#6Fb#Ɇm6Fm6F aGB#6FbF8lb6FA6FaȆQ1 E6d >s(Q(!c^t1Jmc1ln&h5}Vm&2Sz:c8l6=tObhm6F ׍ѰnVm&2j1dΦN[w51c1jc1dC{_c1!c1֍1jc1dC11Xqڟ21 cjcdCUm%2 7ƪm6ƒ  mUm#eDcEǩm6Ƒ Su8q8!c1֍qj㰍qdCs8hc8 !2>[7Vj"œ{~kC1ۘH6d nc"1Qmc"1l|s"1Qmc"1lkZt|ҍ&$GL}$I$!c}Ipb$lcِ1x1 6&aȆI$Id1kMɢnLucdlc2ِ1xݘ dd!cpjdC6&C6&cSƛߝĘ"LImL6 S`1Emc 1lhclc ِ1))T1cSaݘ1ۘJ6d >LsTT!c~c*7mL6 O6mL6G=XjbLip2Mmc1lnLuc4lcِ1i4i4!c=i4itѯcEݘtt!cp/|tlc:ِ1tt!c9e:1]mc:1lD$hm1CSfu  !c9eSfm6f 3`1Cmc1lǹ6fm6f֍<Ę)攙pN1ۘI6d N )36fb3Ɇ2΄ggm6f ׍LvD_s|c;-cs,cs-c,c[[XZY[ƖXƖZƖY~-h[c[k[g[o`hdl22}YTK\8q%j,Xfk,\fQ17 5nqYY7 ׸YTd ? ָY7 F7̛fb}l7Vۘm&21ژ1ۘM6d 7φ}ll!co61[mc61lydc1ژ1ۘC6d ޞs6`sȆḿ6m6 ́6m6撍r 9Ę+l̅6m6 ۘ mUۘm%2¾y\lc.ِ12ژ1ۘG6~[m1oE ˢ6aȆbyjydCuc6aȆyjF62^|bWl|=\o==ِ1x/=EWln|m|=1l O30cn('(Wۘm'2F 6'm|lc>ِ1z~Ckc>1l|hc|lc`c7~clcِ1:e\,PXm, 2S9elcِ1x/XXH6ehA&BbBi#/TXm,$2E{9c8l~wBlc!ِ1BPmc!ln,6m,6 01wMwMm,6 `Hmcln,uc"lcِ1"hc"lc1Ǘ)7@o,VXm,&2݈w#m,6 a/Xmc1lbhcblc oX"X7m,6 K`Dmc lhclc ِ1XXJ68vບK藒 _Co,UXm,%2KaXXJ6d >,sRR!c^t)Tmc)l\3_N&2NY)6aȆ2X7m,6 `/Lmcl|kLmc݆߭tOٺH!E]x/^lj?bVw7O.yxPp=XN|G r}/`9}?'Y,W;Xrr c>b9#E,`91xXXA6<pW& PXm 2F }h lcِ1  !cu+j+dٛ+E+6Vb+ɆJX7Vm6V ?_] TXm$2_6Vm6V =cSV9e*lcِ1U*U*!c$sUjUdC6VA6VaɆٯ-j`bjj!cpjdCpZmc5ljhcjlGQ`@|uME֍6~6~$2#ƏƏdC6~6~TlQmGlc XqŌ5M5κana{Yflc ِ155!c^t Eרm6֐ ׍55Zqfbuc-k6bkɆm6֪m6֒ wk6bkɆm6֪m6֑Q51։5:]XG6d ncNmclnuc:lcِ1XXO6>OzT^a5zz!cp/|zlc=ِ1xXzz!cp롍j뱍 dc}S ):elcِ1  !c֍ j dCI6@66`F\ JEFF!cpjdCuc#66bɆml66ml66Avl_$zMݤ D6d ncImcl&hc&lcِ1 ؤ L6n6M6)]cS69eflc3ِ1~~66cɆml66ml66 S6C66c?_*`bS̙S6~6~"2?OOdC6~6~R l|N Im'lc ٸ0|&ol-!cp[-j[-dC[-!cآJ6* ۪J6d olU؊ml%2_l딭jCuc+Umc}a}mxl2ele71WN.n^>~˘eeeeeee2v2v2v2v2v2ayYjcmbwݦqpF5N5nq5nqۨTupԸL$m5n8`ۦq3٨ԉ^l?߻j?c? #[L6l6~6~&2٘a>I Ɇm m3 Gd21~}/oEml!c7 ِ1Loa#g/Ǐe$//dC{1@mmJ6 0~t &Ư}:7J6laUl_ửmmJ6d c3F?WcbC5~#ِ1ٺߠ6~6~' 4X)mmN6d o6~6~'2S;c8l[+lnm݆$I߿[Dx-S$;"vE'g<[>;C`݁x/lA[v rڻ~Ӳ}n;|t7i6E*WG+te G>UWr cz!RY6I W\\IІچ+lD^C3cةI6dld'ٰmT؉m$2#v>bNlc'ِ1NhcNlcurXc#v>b.lcِ1~.߹KmclF{g :؅m"2#vA6vaɆǽbLbOk7ڭM6d c=nn!c168fe?M6d >6vm6=yu#l6m6 mQ؃m!2وᰱ*I =!c9eGmclluc7~c^lc/ِ1x/{6b{ɆA6;;c8l?K6d ^7B{6bȆfb6A6aȆ>X7m6 ìS9c$'16aȆ>hc>lc?٘Bbb6C6cɆ{ݯO6d Ӌvp|9sCkc?l~hc~lÍl I2rvr?Mp66ܰ 7!cpnІچF6d |Mm p#2mmaFM41jdC6@6`Ȇs~lِ1Al댏Mb 8q8H6d oAA!cm6 8mT8m"Uw〉qHԍCnR8m"2q8q8D6d ~<qHmql!h!l0(=wK.8 7m6 )rXm0qlahal0ِ1a-_@L&aqDmqlhlِ1##!cpG#jGd#yg21 GjGdC0a#I^B~Ck(qlQhQl(ِ1w,BG6bdYgb~j؆;ِ1x w wlÝl| װj؆;ِ16wh]m8F6?vqL8mS8m#2q 8q 8F6d nqLmql|N9mS8m'aI"Ylbgó6cɆm6m6 )r\m8qlqhqlQԹ& R џ^Y/՜P8m 2q8q8A6d nqBmql|N9mP8m$ncfb{_'II!c'sؓj'dC6NB'6Nb'ɆÞ6Nm6N >LS,)x)lِ1SL)S)!cpSjSdC6NA6NadciHC|~Cm 2S<⡶mx P6<Ȇ hCm$3M Og0g=Ɇ}^YFO OlÓlw={mxbdCu O OlÓl6<6< /1}G^b }ymxa^dC{_^pKm "2mxmxa^dC\ / / }a}ow<|,c-cg,c1?Y˘ee,2v2h` [.ZB,c0%Xeeee,2v2v2v2v2v2iɘ㐗w{g^uWml>[M̼Qk뙷bwaVW1o{3O.y.ouΥ)>b^y͇ay͇|^"|"|C"d @>j>iQ볯ehcbgO36NcɆm&mjdCkptZm4ql|}8q8C6J\8qFԍ3nQ8m!2F ?C6l3jg3dCu g6`gȆJg3jg _ku OmbdCs/S|6| _!cpІچ/K6d nU6Fj:eb}{?o臨m 66 ?!cp~ІچG6d >A~j~Y*W*gŜr)g6bgɆm6Ϊm6Β 8 mU8m%2q8q'xؼ/lCj؆?ِ1>_m'2m S  lٸ9&9aqNmqlssj簍sdCu6aȆ9h9l#l-8lA#@_/ P6Ȇm@jFِ1h#@m# 2mm`Ɇ&yQ7úq^mBjF(b۟a9l|m )apN S6ȆmAajaFِ1x66°Kd(pĸ$%X7.m\6. ׍Kn\R۸m\"2_^kKjKdCuqImN6'- 5#\a6\m#'2=m 66±p!c5l8m\&ok ^fb\u26.cɆ\gd.m\6. ۸ m\V۸m\&2qڸq۸B6=mqE^W6`WȆ+߸q۸B6d װW6`WȆ++Uq}ϛLb {am\6 NU;W6bWɆm\6m\6 ۸ m\U۸mD zӉR׸(\㢨|Qk\8QpR׸(\㢨|5.J]wlTh\xs>ӹq۸C6d ~p(E&}Q7úq_m>qln܇u}l>ِ1xݸ}}!cpjd#VЕ=MnBjFp@Z*&F8ƩmaqdCu#֍88l#l|)qjqFِ18h#Nm#ۈ']oؖ31Ŝxxl#lwūmcdCWۈ6ɆװFF<@6%H #Agm<91\>Sx3!cLmH6eW$¹"Qm#H$2m$m$bƭiMfb<=sc>Wxm<'2'sNjϱdC6C6cɆ-C6c/Iߗysbp0^ ۤBmlF#g 1j/dC6^@/6^`/Ȇm6^m6^Ǿ/R?^KK!c}pKl%ِ1%\Txm$2_6^m6^x%WpNy xE6d 6}צ6^aȆ+X7^m6^ mRxm&Ɲux-來gr_m6^ x mVxm&2_jdCu5Zm5lL5F)oFm lhl ِ177!cpo7jo$1`֖.Ib# o$m$aIdC6$$l#lFm$ a$$l-|7㭨oaxxK6d \[\[[!cpojodC딷[;8S[01 wjﰍwdCu6aȆ{w}xG6d ^7A6aF# ^`Ȇ7>jdCs8|Pm| 2S>@6>m8s}#1˘e2nyZƼ,cޖ1˘e2oKa ZƂ,c)-c,cԖ4Xe,e,22n`8$>xS>% @?_?k\5.Yqs% O >% @5NF)7z;yZo'WHm$'2HHN6d %@QrFr!c/9\m#9B6ͮ;{#m`.dC6\  lÅl|MT.j.؆ ِ1xp6\6\ WǍ9AKL WapUp6\ɆmBj؆+ِ1 W WlÕl܆+᪶m z<MnpSp6ȆmAnjn؆ِ1 7hMm p#2Sܠ 7 7lÝl\!t] wX76ܱ w!c{ZomcdC6ܡ w wlÝl|pWp6dcos21| hGm!2E}`/ꣶm }/ lÇl܆᣶c8`[g5r @O-EE{dMg|й__sqOv߭W}}w\܇]~}?Xp=#2~EzG"d ^ ? ?lßlT_]oZ&O6}aV1_m'2?#mcdC{p/_m'266d˫461R֍j)dCu#)6R`)ȆF X7Rm6R ׍F FوWaX.m`dC{p/<@m# 2nm`dC6l#l7t|$@T6ɆF jF ِ14vjF ِ1@h#Pm#"~SV Y @ R6Ȇƒ^xFD6d c3Fޟ6ȆmAAjAFJtM);Sm6R ׍nTHm$2)aHHI6d .FJF*-oP&F*1sJ*TF*!c~#7Rm6R HmRHm"2Tj`qDbuJ0\mcdC6``l#l hF0L6d 66dh=%FjFj!c9%5SRm6R aS5ljFj!cHHC6sSH#4pNIHC6d n# Fm# lFh#Fl# ِ14F4FZ^"Lnu#FZl#-ِ1FZFZ!c~#-7Ҫm6Ғ ?H!"/01Bh#Dm#!2mm`!dCu#֍l#l6B6BP1ϻnF(m oPPl#lnºm )FF(lp|Y*N`Nm#l|Sҩm6ґ SuJ:tF:!cp頍tj鰍0D*GA19px5\m#'2nmcdC6¡ppl#lF8md {9~612~#72md62 `/Am#l|S2md62 ) jd#q塉QmdTȈmd$2aȨH6d n##Qm##lmdTh{? ~#XfXe,e,e,222mZ,cXNX.XnXX^X>X~XXAX!XaXXQX1XqX a2Q m])q`ˤqpD5N5.q5.q7{L ׸LTd ^2I]2/l|x #BoPۈ6"ȆTpMmD ۈ6"6"!cpFFlAoZmbb䃿Sȇm#2`ȧG6d n#Om#lF>h#F>l#?٘r Ŝ)6cɆȯO6d }Wȏm'27C6c'i*01 jdC6 @6 `ȆװFlِ1x(mP(m$JkC%Q(Q(H6d >sJAFA!cQ֍jdC6 B6 bȆ2&F!W!W!BF!!cpBjBdC6 A6 aȆm6 m6 5QعN1upJKaFa!cpjdCha؋V(m&27 C6 cEFzתQDSuJ"F!cpE"jE"dC6@E6`EȆ)mQ(m%#+`bFQoU(m%2Q(Q(J6d 13F۲-‚?Q(J6d ^7BE6m8s~bPD1bvn g5I1bv$+b_~}œ9$8g6􊋹8+~q\ݗ1ڴ8tP\8Ɂp(Q׃$BsEqhFql<Z0Q(Q(A6d w6e UBmQl|Q?Jm6J (mP(axzޗ^a(iy?G)XiXXYX9XyXXEX%XeXXUgjꖱZږ:-c,c-c ,c -c,c-cM,cM-c,})I5GUSN%E?\v?%5$q%~IxFƕ5$8Ը=>q%q+I5NpIXJk\I<"wJ,mO JF)lِ1oo6JaȆ{R7*Q (E6d V (Q (M6.v21JpoFil4ِ1x( FiFi!ctJÕTiFi!cpj2d 9\(#f2je2dC}s7Q(m!2e`(Q(C6d 76ʨm6ʒMmItbFYoU(m%2_ojedCu,e6beɆFYhFYlXD7~F9lِ1̜arit$F9lِ1x(F9rF9!c^QNmQlLn̛&FyoFyFy!c~<7ʫm6ʓ (mW(m'2SC6cȆW&F A6*`ȆT;Flِ1 F F!cp jd˩o]abTu"6*bɆ﫨QۨH6d QoTTۨmT$2S*B6*bF3K61*9 [lCrQ ۨD6d N)6*aȆ+JjJdC6*A6*aFZĨ,ְFel2ِ1xݨ FeFe!c92S*mT6* S*C6*cUFqZQESuJ*F!cpU*jU*dC6@U6`UȆmT6mT6s/;dbT6BU6bUɆmT6mT6 oTU6bUɆ甪FUgdϧgb|&ggdC{_6>6>#2ggdCߟ Lm3lpP`EmT6 ׍jnTSۨmT#2Q ڨQ ۨF6d mTSۨmT'I;|Ĩ.pNQۨN6d ^7úQ]m:Ql={mT6 աjձdMF hF lِ1xݨF F !c~7jm6j ۨmPۨm$O}{QS)5RSm&Ql|ϼ&3QۨI6d n&QSm&Ql mTۨm"G<ͮ;Ĩ%lԂ6jm6j ?S >SKmQl|Q ۨE6d c#xlRۨm&KuxQ[ب mVۨm&2Sj9Fml6ِ1FmFm!c^6Q[m6Ql,s8dQڨQۨC6d nQGmQlFhFlِ1RڨQۨK69&F]ыօh]F]!cpujudC6Bu6buɆmԅ6mԵp|ٺa\-ssq/O8;?W;\ܓ<[96?Ww\܇]ٺ=\}?Y8Ы'~{{p=Gw_E=z#2ӪE1xQڨQۨO6Z7Z޵Q_aeQۨO6d wF>ٰQۨO6d 6E}F}!c}F}FQ{ZĄ]MFhFlِ1ڴ\6Phm4 2 `hh@6d ^7@ 6` Fm/`b46B 6b Ɇ7~oFCl!ِ1\ \ 6b ɆFChFCl:}&F#aHmшl|?m46 hm4Rhm4"2hhL6MLFchFcl1ِ1xh FcFc!c~17m46 MC6cMF`31M&jM&dC&pDm фlh&jM&dCu Dm єl|&FSa)Tm)єlfajMdCu)M6bMɆFShFSlxBMfbl hF6d Ni)6aȆ;fjͰfdCfF3fv\FΎx}a`hdl2eeekX7XwXXOX/XoXX_X?X@ aS4שxf9|f5598Ը ␘Obhk\s\S1gg59qͩ555_ qI#L7j{j-dC}s 7Phm 2ZިF lِ1F FKkĀMnuFKl%ِ1jhI6d j T-6Zb-ɆFKF+J01Z[m6Z ӵt6ZaȆm6Zm6Z hmRhm&561Z jdCϬVhm&2_SkjdC{1j6dctlbFoQhm!2m`hhC6d ^7Fm цl|NimQhm%U&F[g0}[SrF[l-ِ1^L[Vm-іl|Sڪm6ڒ mjmvd=h'CjCjhG6d ^7NmюlnuF;lِ1vF;vF{Q﯄L9i'#)7ګm6ړ a5l{F{!c5l{mhO6d >6ګm6 peb|!/`dC66Pln|j_`_ ׍//66: \L9żsٰ$Flِ1)6:`Ȇmt6:mt6: a蠶H6 ۤc7:~FGl#ِ1FGFG!c9#S:mt6: )jNd#LKOMN9ŬS: ۆd'NF'!cpNjNdCF'NF'!cpNjd{LVL΢ jdC{_WgFg!c;;mt6:  mtVm|I6rٺ=J}Ͽ 3kG|55ِ1x51Vl|5\|55ِ16166 oMnF7hF7lِ1xF7nF7!c ֍njݰndCsJ7hF7l;?˔Ŝ)6cɆFwX7mt6 mtWmt'2_t6mt6z=DFF!c{{m6z mPm 27z@=6z`=F' m21z@{@{m6z [=6zb=Ɇ詶I6d n'Sm'ыl4*]&F/aKmыlnuF/lِ1\Rm"2SzA6zaF~.51z97Szm6z ׍ްnVm&2Sz9Fol7ِ1){C6zc}FGzobu}6`}Ȇ;Flِ1)}6`}Ȇ>F>F_OΙ&F_ sS [1﫶K6d װ}6b}Ɇm6m6 aB}6bFHTmEM~bN~j~dCp1m6 )Omяln6m6 f3gb6C6cɆFX7m6 ׍nWm'2诶@6^L6ecm 6 M16HH!c9e$SFm6F ׍H(Q˘s E6l6FaȆ(X7Fm6F `/:Jmc1l(hc( !o߭˻vߨE|ca..l7F|v݁gr^ߨ7o..<[ ߨ7{nho:@?iu3N?׃te c=hѸ&2#FC"Fz0D mVm!]71F?0Fmc 1lk1!c>b #ƨm6Ɛ [6ƨm6ƒ -K61:#ƒbG_nULc6bcɆXX7ƪm6ƒ ca1Vmc,1l|s,1Vmc,1ly.1NԍqnSm#21s8lcِ12)6aȆ{q8qxq?4cx'xNj㱍dCuc<6cɆm6ƫm6Ɠ ?C21ۘ@6.7Y=Ccط-&mL6& LPۘmL 21ژ1ۘ@6d >L6&mL6%Gf61iߒ 3w--ِ1x/-EUlƷƷjbߒ Vm[lc"v6uocaݘ1ۘH6d ^7&º1Qmc"1lDhcDlc"ِ1x1ژ1ۘD68^jbLr0DL"r2Imc1lnLuc$lcِ1v\NRۘmL"2IjdcZ&Eݘ dd!cdd!cpjdCdhcdlc Nc7~clc ِ12)S6`SȆmL6mL6 N6mL6#ݷN:Nԍ`Nm;l;!c~wwdC06J:c8l s['166#276SۘJ6Z=jX=c]L%2Umc*1lߘ jSdCuc*S6bSɆThcTlc٨m7MinLuc4lcِ1̜aöu?Mmc1l;mL6 ׍i4itQe+&t)nL'-M?6cɆE}jӱdC࿧LLWۘmL'2_L6mL6f\3cB71f1֍j3dCs 8Pۘm 2ߘ7fm6f ۘmPۘm$}1S| nfLL!cp3j3dCLoTۘm$2SfB36fbFlbgڳ6faȆװv,lcِ12 )6faȆ{Y,YlacSf9ellc6ِ1xݘ ll!c1֍jdC6fC6fcs#L9}sm6 ۘmQۘm!27~clcِ1s_s9jsdږl21g{g{m6 )s2Wmc.1l\hc\lc.ِ1\&|ȯ||!c9e>Sm6 a/:_mc>1lߘmWۘo{#-c -c,c-cK,cK-c,c-c+,c+-c,c-ck,ck-c,c-c,c-c,c-c[,c[-c,c-c;,c?XvZvYv[XZjuje[`:-5nq 5nq -5n-5n8׸-P׸-'cָ^w~y2g뾇+"0w;[=tv^O:/{=y=} )B/B_B2 j q=XHd Dz,TXB!cمB"7KLE"hc"lcِ1E"E"!c"VZXD6d VZm,RXm,&~Փ&bac1Xmc1ln,ucblc1ِ1xX bb!cpj%dkdb,{K`GDmc l|e cYXB6d c.=%!cpK%jKdg61RXXJ6d nc)Tmc)ln,ucRlc)ِ1c)Tmc)l{\\Men,uc2lcِ1 )6aȆ=[=[ XF6d ދ.6m,6 Gӳ\Xm,WXm,'2E^trlc9ِ1x/6cɆm,6m,6VT-X!pNYXA6d wYXA6d o  !c~cBmcl X)l6Vm6V ag~Ckc%lnucJlc%ِ1o+j+Ud?MU*hc*lcِ1Lax*U*!c^tEWm6V )UjdCkjZmc5ljdC6VC6VcɆm6Vm6֐3e/=Ilb6@k6`kȆ#~Gflc ِ155!c3k5jkdcʚkřܵLZZ!c5Z]XK6d ދZZ!c^t-Vmc-l86.31։֍uj밍udCXNmclFqg :u:!cp렍uj밍dce01;yz16cɆzX7֫m6֓ Suzz!c9e=^mc=l^Aԍ nlP؀ml 2`ؠ@6d ol !c=  FAoZ116uٺjdCFF!c~c#76ml66 S6B66bFY,416uٺMjMdC0딏16~{J{> D6d >ls&M&!c~cImcl4ypcS69eflc3ِ1ﰛﰛ66cɆml66ml66 )j-dK4&/nQ؂ml!2E^tlc ِ1)[6`[Ȇ--VQ\_[E VV!c֍jCV؋nU؊ml%2تF6`oc ئ F6d g oS؆ml#2S9e6lcِ1m6mv޵jbl6C6cɆpNٮN6d }mW؎ml'2EC6c;Ȇ4k=B1vuN١A6d ll!c~c7vm6v mPa8{_y3I?~P.\ߋ'x&[v݁'}gw7a=A}`'?Z|1cCo+v¹b`'};\S`';ɁPN$2#vB;6vbYw—31v.6ݥ E6d ncKmcl| ?vm6v [6vm6v Lnhcnlc7ِ1nn!cwwm6v j=dc_c{Ĝ){6`{Ȇm6m6 ){Gmcln6m6_Lnuc^lc/ِ1^wU؋m%2S9e^lc/ِ1x mUkxz{_tozqc-c?ZX~l;o`h2v2v2eeeee7{_Q40pS>1>uۇk>q2q`ۧqpG5N5nq5nq5n~1x[ɡ3$3$6cɆ{7گO6d 7W؏m'2دl8'Pg~яj?b? QmGlG!c5ՏpMƏƏdC}Əj?bFぇ018y ٰ=x@mqlhlِ1\SP8m 2ߧ;mP8mD6 _h?OOdC Im'l'!c~'oِ1x Im'l (6UkLγn$[Ҷ|Al ِ1336bɆ;;q8H6d n qPm ql^qHԍCnR8m"2R8m"2q8q8D6d >6m60 ql>H8D֍jdCkp {Xm0ql|rSm6 8 mV8m!21#plِ1.]Q8m!2FdgJ'16`GȆװG#jGdO11dO((nU8m%2_딣jGdC딣prTm(qlQhQlٸmq&1^cIcjǰcdCpgS1aڎm6 `qLmql1h1l8pPHӆ9{lĤZKL8q8N6d ^7úq\m8qlqhql8ِ1:8q\m8ql.< Xj'dC0uc ۣ'6N`'ȆpN9q8A6d nqBmqllsQqR'aqRm$ql|rSNm6N 8 mT8m$2q8q8E6)MS8SjSdC6NA6NaȆEO}SjSdCkS)Si1w̝Lb {aOm6N {6NcɆiX7Nm6N SNC6Ncgpkcb6@g6`gȆX7Ψm6ΐ ׍3nQ8m!2g3jgd{^x431ΊSgjgdCSg6bgɆm6Ϊm6Β 8 mU8m#]O}7~9lِ1x89s9!c77Ωm6Α qNm݆}!sg8]dzu?ý~;0;[3(~Vw\܇]2lO7[ONSTlmmI6d > ?66$2aߓ|TBnq/wr3]l_p/"k_j{g_gry0e[YB^\{!󹃣~{(xq=xHw_!zxE^vEͳ~IdvP,Im# H"2_&5lFD6d ^7`HRH6Ȇ$h#Im# xK6qr&[o[[!c}zxK6d Ny )o6boɆxxG6&ͿN|_];w;!c֍wjﰍwdCu6aȆw;w{1v&{/Wxm'2?IzxO6d ~=<[^m=l|NymWxm| _ q;m.ンn3IȆٺulِ1:\|Pm| 2E?^lِ1x/n~F&Y2bsY-c1O˘e2cY-c),c@Xe,e,e,2222b Y[-c,c~dMk:% ?_FQo?k\@}s@7ϩc,?1xKj?:ϞM=<%Dt6cɆm$6m$6 Hm$WHm$'2C6c.dXYwM @7Emp!2\Qo䢶m p6\6\ !cmm`d#αps+S\6\ W!cFFmbdCr DrUp6\Ɇb\ W WlÍlk}ІچC6d o~Gm!2_@>j>؆/Xbm צj؆/ِ1M}6| _!cpІچ/K6d nU66S~bNsچG6d o~Om#2S⧶m 66 1|ɕ/b װj؆?ِ1xu_m'2nmcdC6  l#KʧN)Ĝ))6R`)ȆF X7Rm6R ׍nPHm 2ES@)6R`de`BbN sJF@6d 6!cpFF@6d n#P6F-z()pm ׍@X76@!cpFF H6d ~~*T6Fib9%)AjAFِ1YD6lmOFD6d o~#Hm#"2366d#l[LM {єj)dC)FJFJ!c}єp_4FJl#%ِ1yJh#FJl#ȘkMTnu#F*l#ِ1ٺTl]*TF*!c ֍TjTdC6RA6Rad,v ``l#lnúm 66`!c^4V6Rm^{#ES^4Fjl#5ِ1L/a&Fz,Y"N3=!FzFz!cp額j鱍dCp^m#=l|NImWHm^;FF8N6d ދ^4\m#'2_uJF8N6d n#Wp`$ ε,͙ $¶d̠.\ߋ'x&)2{sI~`>$e:ԍ|dt,-TğF>|F>!cuJ>NɧG6d S7:c8lOr_Aȇm#2mSȇm'?~/E}jdC6C6cɆaFg u]+.ZdC6C6m8yp~x|XvnGv^|piٺtiY tPP ɁAAX E 1L=gb 6 b6=($ =BjBdCsE!8WR(m"2Q(Q(D6d >W6 m6 w֚3;3;6 cɆm6 m6 بLZdC. mV(m!.SQD(mQ(m?:oԅ6m6F]gdby njn؆ِ1 7hMm p#2Hlᰱ|ʽ+}Ck p#2_Sܠ 7 7 a~0xgG={<-ZKRkl5<,Z3KiZZj^Z+KRkmXjZKRkoYjZK-R Ԃ,ԣW+G?zՃ==8_Szգ'c%փKqpG=N=q=^F Wjbj؆;ِ1R͝lF4w wlÝlDwx_چ;N6d npWp6꓍a#LιبO6L>niF}l>ِ1̽~_8YZdCyP_m>QlF}hF}lxq-h F7m46 o4Phm4 2Flِ1~@mѐlܻm@Phm4Thm4$2 ahhH6d 4kJCFC!cp j Fdh$fFpmhD6d l]#l]#FF#!c5\Sm46 .hhL65>=h,7m46 _i 4Vhm4&2ߧ4jdC376m46#gb4kJ4Qhm4!2YS16l:jhB6d 7Dm фl]M&jM x@qùO1x ۃKj؆ِ1wA lÃl|چA6d 7<  l)٘2e9&FS7¾Tm)єlo8c8ljhJ6d LnSLnSFS!c=lShFSl٠7 461]6ˌwLmьl|hfjͰfdCkJ34Shm4#2_SA6aFﰩEhFsFs!ck5jͱdCkJs4Whm4'2͡jͱ Oi/U01<6L$ͣچ'I6d OO OlÓl܆'᩶mx Іچ'тlx_; BoPhm 2-`hhA6d nBmтlo6Zm6ZzYC.cbt^2ǖd ?rhhI6d n%Rm%ђlFKhFKl%ِ1uіFK؆٨z^5/xچE6d n R6ȆmxA^j^؆ِ1x666yr~bٛgZI+Vvֵ2Z;0On]+i>g<-;ֵ缕y,s7#go:2ߛzýځ7@-u ooI7᭶m&^]bbeeVhm&2_+ZõFkl5ِ1uְ[Vhm&2 5Zm5C6VDt&#|᣶m  7|6| !c9>j>؆ِ1x6|6| _q9,I&m 6|6| _!cpІچ/K6d 7| _ _l 8P6FhFl ِ16F6F!c5 \Sڨm6ڐ 6F6F[L⾌𾌶jmdCF[8oUhm%2mahhK6d ~ݢ-Vm-юlz&F;Oi)6aȆF;7کm6ڑ voShm#2vjdcg ,΢6cɆm6ګm6ړ a=l{F{!cy=^m=G6ƌ?' ?8oma~dCk\S6 ?!cp~ІچG6d 7 ? ?lßloKbچ?O6d 7aW6ɆmcdC?᯶mt ]_YAotPmt 2`蠶@6d 7:Amсlot6:mt6F|L1Y4@m# 2F #%m 66!cpFFH6/ykJ \S6@!cFF H6d {@@l#lF m*z$FAjAFِ13IA l#lFm AFFёlfPN7:yFGl#ِ1,΢6:bɆalrHOJI FG!cpj6|F&KRbZj]-nZR zXjZeE[j=-KR,>Z_K-Rg%Xj-@Km6~`qU-)Xp V`ォٺ`l]L=N_0\=.`q2q{\0^B̽g6#D!pnQ6B]h"_BmD /Dm#1wnmt"{Wl F6:aȆ뤶 D6d 7:ImщlF'hF'l3ٸ;ʋMFghFgl3ِ1x FgFg!cjdC6:C6:c]ϯ|n-"lt6mt6 _tQmt!2]`袶B6d ThFl#l3MP{jF(ِ1x}#Tm#%2'm _ 6B6Bdcm1&]E FWFW!cnjݰndCkJ7tSmt#2_S5F7lِ1MmF6&\rckbFFF6d n# S6ȆFajaFِ1x666yuw~˃y;]-]9xrv[΃]}Ͼ9xZvgs]}λ~N^w~8te a?W; |kEZD8$B3f8m H衶A6d nCmуl|?zm6z M{@=6z`dc5bFFA6d 7GFA6d ~~l#loD@jF$٨z_U&F=mD M#4Rm#ۈ$2 wFmDbdC6"HHl#l"|&FXSmD ; ;Jm# ۈ"27mD )QFFM6rcbD FF4M6d D5%Zm#ۈ&2 mDmDcdC6hhl'HdZ-LFOhFOl'ِ1)=6zb=Ɇm6zm6z  mTmĐ?.ڻ#l@1j1F ِ1>%Sb6b!cp1FF C6d >o@1j1F/q;[#wL^b Szm6z )Kmыlzg/xūF/lِ1^F/^FoqEkE FoFo!cjdCp[m7ћlFohFol#lJ&F=lF,K6d n#ڈUۈ6bɆהXĪmbdC6bXXl#llp~&FqoĩmaqdCH8a[6Ⰽ8!cpqFFG6d jm!^b&FaGmчlo}Flِ1}6`}Ȇg>F>F_1勾 01 }j}dC0}#a˜m˔$F_l/ِ1}6b}ɆהF_F<3vz.#^S>%^m#ۈ'2ߧ}JF<O6d 5%^m#ۈ'2FF<яlD-I3E`觶G6d s+a񅅮^?G6d ;l?;l?~F?!cp~jxgLLR|&)Am#H 2 o$m$` dCF76!c FFџlp*_mWm'2&?|&Fl?ِ1)6cɆ)jdN˓S>Ě2)6`Ȇ7m 6 )2@mc1l|m Pm $eFp1Pm Tm $211H6d 7¾1Pmc 1l@hc@lcȓء& 3"N'%AjAdC76aȆ 7m 6 )Ajd#͛6?011jdC6C6cɆ`7m 6 `va70C,j Ԇ[j#,(Km6Rk[j,$Km6RjMԦ[j3,,Km6RRk}eͳԾ[j ,B=Jm4D<[7>[7D7zg!p6qCpB=N!p=D7z =n Pq/WLb ׿jCdCP Um %211J6d nc(1Tmc݆!ag*$:H ˌr9L-b]9xrv𿟭{0av=_Oj3L}Ͼ9xZv[7 as> teĀp~0\}~0ξp `891<<1$BphcplcؒݱGL9¼tp=j\WFm6F <c6Fm6FG5jbh8oVm&27Fychlc4ِ1hh!c5e41Zmc41lz&k1!ccdlc ِ12)c6`cȆה11XRa c11K6d kXX!c1jcdC}c,1Vmc,1lxwbcxb|b8lcِ12)6aȆm6Ʃm6Ƒ q8qxQoż16cɆx7ƫm6Ɠ a=xx!c8mxQJєCg  !c{16vuܵZZ dC3Amc1loL6&mL6&&D1oLDD!cYt"E'mL6& )2Qmc"1l|;ژ1ۘD62z:Ę$lL6&mL6& c8ln1 ۘD6d Lk$I$!cpIjd 51&5e2\S&mL6& 1Ymc21ldhcdlc2ِ1d0ffM)hclc ِ1g /7deObhmL6 S1Emc 1l))TA_H515e*\SmL6 a=TT!cyc*7mL6 T4qҁLi4hc4lcِ1uu6aȆNEmL6 _mLSۘmL';z8n515e:\SmL6 S}tt!c1jӱdC6C6c3ʥ{0Ř!l̀6fm6f 31Cmc1l hc lcِ12ژ1ۘI6\>z1S)32Smc&1l|ޘ 獙j3dC6fB36fb3ɆgљL,AOq}2l.HRۘm"2F ]1 ۘE6d 6faȆm̂6fm6f>^p&l̆kll!c1jdC}c66fcɆm̆6fm6損c:^nlbkQۘm!2EYtlcِ1xߘ9!cps9js/F+|L/_=>l[RmKlK!c__m|m|I6d aTlL dK/dG%415e.\Sm6 )s2Wmc.1lcs;m6 ;ژ1npWg' y&+a2~]9xgR;<;x-3I_e?i3;I +9/7OySỵ/cb\+`911"~0D1߬"aߘ1ۘoۘmWۘm7+w·6m69˜Ytٰ,Lmcl2hc2lcِ1e2e2!cpˠej˰oF²wLo>OFml!cttߨm|m|C6d ~-x-ooȆm|m| l_7鶉\|byf=j˱dCHdö-WXm,'2aXXN6d nc9\mc9lv2UcsM 5V<8ӱ_c lcِ1)+6V`+Ȇ 7Vm6V _]mPXm$ ɽϙ+Ś)+6Vb+Ɇal:cLbyrJlc%ِ1xX JJ!cXXE6usX% f*lcِ1xX*U*!cpUjUdC{U*UjQkbj8oVXm&2adjj!cpjdC}c5Zmc5l7k55!c ֨m6֐ k༱Fmc l55ZK:LZhcZlc-ِ1k6bkɆZ7֪m6֒ Z:"u[Mu:hc:lcِ1u:u:!cp렍uj밍udC6A6aƭe_(X/l6֫m6֓ ^mc=lzhczlc=ِ1zqtWvnP؀ml 2ߧl j dC66@66`Ȇol66ml66}_EFF!cYt#E7ml66 Ϣ,Qmc#lFhcFlcUc ؤ D6d ncImclol}c&lcِ1M&Mfpgff!cYt3E7ml66  mlV،ml&2جn׷g%<[-2U.<9;} o;0O׷>Ͼ9xZv-<ߪls>]z[s[s[g [l`-P-l!2_+@[6`T! 31b+\+ml6 MUmc+l| g̭jC6BF`t\5ml6 M6m6!cp۠mj۰mdC6A6aߑ o6.gb|']f66#2wwdCkwpMNm;l;!cpAߩm|ml'cXS5evlc;ِ1xvv!cj۱dC06%vQ&3iLققj;dC8P؁m 2j;dCw@;6v`ߓ<11|^m{l{!c5{|==ِ1=\SWl|M^m{lc'H3@&N$ |N+oE>[Smc'lNhcNlc'ِ1NN!cp;j;]d.}M]b]j]dC.8oR؅m"2_Sv5e.lcِ1].]nxT c^nKmvR;h`[jG,1KGK'KvR;iN[jg,/9KvRh].[jW,5a鸖lŻ=.Dq2.>[q%R1ܜDuK=.zۉ%{\"^-;TW{ܼWmc/l|n j{dC6B{6b{Ɇm6m6 ZoecاG6d 378c8ltZ'N%?G6d >탳>}>!chOmclLϕmr&~~~~!cy?m6 oW؏m'2jdcwӯ71qjdC߭;[w@mqlm6 {v8q8H6ztY㠰q8q8H6d 7¾qPm qlZAx-Al ِ1x8mT8m@6B.AAml!cy#aȫs]K}Ckl!cy8oِ16~6 z@㐰q8q8D6d 7qHmql|8CjCdC6A6aɆ[ՠMӛaa!c=a=q8L6d n0qXm0qlahal٨$&O9)G6`GȆ5959q8B6d >o#!cpG#jGdG 爟6~6~&2 ?mmL6d V m3qll?ťs& 7NqBmqlo} lِ1x8  !c h l$XQ-O'='='6Nb'ɆI7Nm6N 8 mT8m$2'j'SdcNTGMSo})lِ1x8)S)!c5\SNm6N S)Si1zyE8 ii!cqjdC{pozZm4qlihil s}˲]&ll3!cpg3jg3dC} g6`gȆ8mQ8m%oϹ8SΒ7Ϫm6Β 8 mU8m%2ga8q8K6d = mU8mB6|[X8v /j` y__Ȇmm ِ1__6~6Αm)x9x9lِ1}5sj簍sdCsprNmql|8mS8m'l,8/y7Ϋm6Γ )r^mĸ lِ1R虤 j dC6.@6.`Ȇpڸq۸H6/o=ĸ(E7.m\6. )rQm"qlEhEl"ِ1x߸m\T۸m\"I&?8ĸ$%7.m\6. ̢Ϫ_R۸m\"2q ڸq ۸D6d nqImql<]CcMehel2ِ1q6.cɆo\7.m\6. ۸ m\V۸m\!ofb\\\Q۸m\!2& |&l ِ1x߸+!cpW+jWdxnLo\}Ul*ِ1qW6bWɆU7m\6 ϢWjWkd㯙Ф8㚘EY5lِ1336aȆeeq ۸F6d 7A6m/ny KvRmݱ~Zj,K7KR{l=ԞZj[j, KKR{mZj,K0שǭ),Is.ֿpqqN=Nu]W]'c:{uS1ww7Ƽ7 31n\nm6n ssCmql h lِ1}H7j7dcS݄{j7dCp}Sm&qlMhMl&ِ1M-PmuvL[bMה[jC6nA6naȆm܂6nm6n kr ڸq ۸M6G?yĸ-֔pMq۸M6d ܆kmm!cm߾q۸M6d mhmlhOؚw;;!cYEm6 ;oQ۸m!2_S@w6m8l]Dljp>[+(0f2ǯjE'C~W_~;0Ov>[+W~Ӳݺ_9U}.y;t7~pte ~pW.wɁ= EU]!c~pڸq۸G6Vĸ'q۸G6d >cރ3={=!c\+m6 _mS۸m''4{q_oW۸m'2qڸq۸O6d n>q_m>ql}h}lHqp}˙= ' ?Pxm< 2_S5lِ1!chl7ÙMuu6~6~#2oodC6~6~S l| Mm7l!ٸU1fFߟzxH6d n!Pm!lCxCl!ِ1xxD6NEwLuo<3g3!c5LmlD3㹘EYsl9ِ1)6cɆm<6m<6 _zmU/axxI6d 716l?Txm$2xxI6d >o6^m6^+hxx%9 s+lِ1 6^aȆm6^m6^ W+WkAo:ib}56^cɆpxxM6d >okk!cY5Zm5l;?1㍰xxC6d >o7!cpo7jo7dC$6ިm6ޒ>}ux+l6ުm6ޒ  g to[[!c5-\Sުm6ޒ ?[xxG6N((n㝰xxG6d >o;w;!cwjﰍwdCk;h;l=`d!LSIyO6l6cɆ߫m6ޓ ߿޿^m=l|x@6 `@6d 7>Amlo|}lِ1>Amllz_U&Gq#Qm#lGhGl#ِ1GG!cnp̟gJ'晤??"0OLҟpSOsTO8m>Ͼ9x'>Ϲ/ޗM/}K#RRKnRZj,ԖZK-RKoe2Zj,̖RjeԲ[j9,Z.K-Rk[j[j\LIkB' yN!:y׵$.h]SǀZT$.hSǀZ׵$.c')vМgI]{ݓ'UHm$%2+%uAk]RFR!ck,I]ЪTm#)l[Rh#FRl#و̅ߗݗLm#lF2h#F2l#ِ1<6aȆJɠdjɰF}L Lm3l3!cm|m|F6d 7>}3ϰȆggjaFI]o]o6cɆpHHN6d n#9\m#9lo$6m$6R .o1HE͏)Ȇ_Cj)dCkJ PHm 2ESY4F l#ِ1,HHI6Y8# ]mIHI6d n#%Rm#%lFJh#FJl#%ِ1o:)j)Td#n G\wR֥RHm"2_SR5%F*l#ِ1, ΢6RaȆF*h#F*l#5xZ̢,Zm#5l|M gjdCFj8oVHm&27RC6RciȆH¿}'7Fl# ِ1R8 ٰi6`iȆה4pMIHC6d 7@i6`i_z&FZ7¾Vm#-lo}#FZl#-ِ13i]3i6biɆaldK41jitdb!ژ\ҹwSHm#2F 6#8F:l#ِ16aȆF:h#F:l#=8x^S}JzFz!cj鱍dCkJzWHm'27C6c)012k_൯ j dC0}#a2 j dC}#62`Ȇ jdc i&FF;lF;lFFF!cjdCpQm##lod62md62NImdRȄmd"2. z.F&l#ِ1LF&LF&!cS2A62aƨgMb jdC}#362cɆmd62md62 Ϣj ч~61\ļ  lÅl;..;.j.؆ ِ1 hEmp!27\  l# ]ۺE)YEm# l|Smd6 S}J,F!cy# Em# l:*hbd}#+Y6bYɆהpMɪJ6d n#+Um#+lٺFVF6A<&F67Mm#llljٰldC6A6aȆF6h#F6l#;٨ԦbYMFvh#Fvl#;ِ1xFvFv!cy#;7md6 Ϣ١jٱd𤸿#ȡA6d n#Cm#lo}#Fl#ِ1,ȡI6\nbJ#ȩI6d kJNFN!cp9j9dC}#'Sm#݆!\dul`ERea߃#I<8ړR;ew`_|.|F>!c|j|dC࿽烿Sȇm#21A6aF/l6m6 oWȏm'2ȯO6d n#?_m#?9٠o41>6>6>Wljc \msls!cpCm|m zܖ>ܧP(m 2_S 5Flِ1Q6 `Ȇ(mP(`x?|-(dԊXjE-bZqKVR+eXje-rZyKVRRdUԪXjU-jZuKVReնXjZ]K~Or|9T'c \ {\A R1x+{\Au+{\Aq2- q= ^ SI&K3($((Q(D6d _!BF!!cpBjBdCQ!hF!l0+l&Fa7 þQXm0QlFahFal0ِ1\ͅ6 cɆm6 m6ɷ8mbss87Q(m!2_S5Flِ1"F"F!ctE"jEd#u[;EkY(ٰ,ZTm(QluE]w늪m6 )ERTm(Qlo6m6S~(&F17m6 ߳Z >\LmQlo}F1lِ1bF1bFqQִc=LjűdCߑ)#S\m8Ql޳޳jűdC 6m6JkwmbpKk%6J`%Ȇgp-Q(A6d 7JQBmQlF hF l$ٸ=&FI- %6Jb%Ɇal9c8l^aTRm$Qlo}FIl$ِ1R(Q(E6NoB&F)7JQJmQl|R SJm6J (mR(m"2ߧ6Jm6J%IwȒ(-fp-Q(M6d 716R]y>eObhm6J SJ}JiFi!cQ(Q(cޛݻ)M2FhFlyo2p(Q(cޛ-by 7ʨm6ʘfFhFl,s7)FYkJYFY!c5,\Sʪm6ʒ ( mU(m%2=,QVm,QμqSCQ(Q(g+brj對r"_S5F9lyrF9rFyS] LFyhFylyǩהpM)Q(oq*bY_~PɼKlJj JTWyA%*TyaA=g Ny/Zp?d%&bkᕠJjd#.yuEeFe!c92#*mT6* QYm2QlFehFely'PlN11U*jU*@"nQU6`U;D 7U6`U;D >GT6mT6&FUa*QUm*QռE-U6bU{_D 7¾QUm*QռE-BU6bFfs\ՄjF5jF5!cQ jjհjdCjpQ ۨF6d nQMmQl<9&Fua:Q]m:QlFuhFul:ِ1xߨFuFu!cpաjձd-ON 01j5j5dC6j@56j`5ȆmԀ6jm6j ?[WڨQۨI6֬=߱QSak=lMFM!c=lMQۨI6d >քhMFM!cY&QSm&Ql+}UKmQlF-hF-lِ1Q 6jaȆF-hF-l6ppP`aߨQۨO6d >7ׇss}F}!ckׇ׮QۨO6d 7C6c F@A;hb4p^5j@6Jg޳tFF!cggm46  @mрlnhFl!0o01j dC}! 6b ɆהpMihH6d 46m46f,h$l46m46 Ϣ,Hmшlo4}F#lِ1hhL6^]h,~i ihL6d 7þXm1јlFchFcl1ِ1xh m4Vhm4!gy9h"l46m46 q>hB6d n Dm фlFhFlÃl|L ]Cm 2_S<⡶mx pP6<Ȇmx@jFSAS@hhJ6d n)Tm)єlFShFSl)ِ1MjM6y5s>[W"x05"E40OulL݁9x*v[ ޅL}Ͼ9xZv5缙79s3Bt6~te >c64991"~МD|h$ x6< O OlÓl܆'᩶mx 6<6< O!c9T6ZWnjbPhm 2hhA6d nBmтlF hF l%xK:&FKa%Rm%ђl|l g̖j-dCSFKFK!cp-j- /qy*^bMkچE6d 7`R6Ȇ^p᥶mx 66Vd? ĵVZx+VF+!c VjVdC6ZA6ZaȆgVF+V؆7zl& wzmxcdCk{絽6 o!co({o({mxcdC6 o ol5c`éLbMi הjdC}56ZcɆFk7Zm6Z h mVhmu]Xv'6|  lÇl|چC6d O lÇl܆᣶mBm)W6|6| _!cwwmbdC6| _ _l×l|6|6|6dB^]71m6jm6dCkJQhm!2_S5Fl ِ16F6F[quM>hhK6d 7¾Vm-іlF[x}F[l-ِ1ohmjmvd2Lvba۩m6ڑ voShm#2`hhG6d nNmўl;oq&F{m6cɆkkhO6d 7þ^m=ўl|mmWhm~z'?ma~dC?OS6ȆmA~j~؆ِ1 ?hOm'6&x>ﯶm ATh4WObhmcdC6  lßl|M66d p蠶@6d >otFF!cy7:mt6: FFk湼e KKm ?I P6Ȇᰑ$ 7aKӞtNI l#lh#@m#$61(@8ombdCF 76@!ck_WF H6d ~}#T6— 71kYȆ l#lFm )ApM R6Ȇ h#Hm#H6@7:yFGl#ِ1xFGFG!cjdC}#Qm~0}?L=!Z'KR ԺZj,0Kn",HK-RzZj1Z/KkYj},ZRK[j, Km0&|ãs $ JrqS1x =.Xq 'c/{\08既a V`ee!b _FB6d l#l ! !j!Fِ1h#Dm#D6=&F'N 6:aȆQQ뤶 D6d >uQ'NF'!c٨Im݆!g'^a Egv~3:<[^>g<-;u缳w Ts{_kuq^c1 Qo%..te Vtt 91x?A.t!2袶%:>›sD( jF(ِ1 gPPl#l| 3fF(J6d >GBjFWq`c%IM9J6L>niFWl+ِ1FWFW!cp]j]dC}+Um+эl,)SnٺnٺnjݰndC}MmэlF7hF7lِ1 覶 #Cg6qt6°0!cFFF6d L|F&Lm# #2nmmaFG{LbjݱdChw8vWmt'2a讶N6d >ot6mt6F~WT}#ppl#lF8m S>%\m#'2mmc=Ȇϓhb}=6z`=ȆהpM顶A6d ~YxUFlِ1FFxy&#B7"6"!cpFFA6d n#ڈPۈ6"ȆmD@jF$ٸpϭe&FoDmDbdC ׃16n~'16"H!cpFF$I6d n#ڈTۈ6w<4Ĉ6((l#l)e(amD QpވRۈ6ȆmDAQjQF4٘)}̚&FxF&>#mD ì))oVۈ6ɆmDCjF4ِ1hh#Zm#I6bs ^ꩶI6d O )=6zb=Ɇ{ {勇I6d n'Sm'C6|fcbĈĸĨm`1dC0}##?J}Ck#ۈ!21oĨm`1dCkJ m"_^ϿKSz}J/^F/!c2z2zm6z mRm"2^jd#sBuۙɆW?jdC0kJ3eObhm6z  mVm&2jXĚEo¾mĒ X7b6bX!c=l,ƪmbdCppcb jF٠[qޞ8xoOFG6d Ln|&7Nm#ۈ#2qoĩmaqdC}#ڈSۈ6?mG>oQm!2.^C6d [[[[>F!c8u31>j}dc{My%?ؾj}dCH}Ɇm+Wm/їlF_hF_l/ِ1諶ۈ'aޒĈ}#xxl#lxeF<O6d >oy#^m#ۈ'2FF<яl4.lnj^꧶G6d kJ?~F?!cy7m6 mSm$ nH6l#lh.m$ _ME6!c5%HPH6Ҍ+__m?џlFhFl?ِ1xFF!cpj6 p>T,晤p1.<9;$ vk;I?~sp?G|` ć=c 3@x@ٗ1x?@ $2 "E ` 1#?m鮛1D6:1HZ1Hmc1l|{ A !cb\+m 6 ᰑj{p16anb }c06cɆ`7m 6  m Vm &2acl&chm pe{nǻ8X1Rf FXj#-QhKm6Rg&Xj-IdKm6RfMfXj3-YlKm6RRg}mͷX2z\.s"zㆨ{P1x{u{q2G!7!d shnqC7lp Lb6 gjCdC6BC6bCɆ׿p1J6d nc(1Tmc(1l*b4c1 1 F6d >7s0a0!c=01 F6d nc1Lmc1l}e&pq?px?pp!c1jñdC}c86cɆO1A6Φ +obp0'eٰ6Bmc1l)D {!cp#j#dCp=Bmc1llx1Rd$|HH!c5e$\SFm6F )#2Rmc$1l{V1P1E6>utVW6pJq'Pܡ8E ww)Zݵ8wI @C^=n;ógڞ13gu11fyc&7fm6f #1\I6lK36fb3ɆLX7fm6f ۘ mTۘmaMUp6\6\ W!cgV]3j؆+ِ1xpuUmp%2E] W WlchvrqϵMYbgYjYdC?5 ,Y,!c1 ֍YjYdC 9c8l}Ckc1lĘ-fýjdCl8oVۘm&21ژ1ۘM6d Q3Æy+$W16fcsFPs=C6l`m6 ?>>>Gmc1ĺ=elcِ119jsd~!-1WԍnUۘm%27yc\lc.ِ1xݘ \\!cyc.1Wmc.1lrX(1Onݼwm6 ltA?UɹCkc1l{tm6 ׍y8Ǒ%:rsZ곿~Sn5R:}b_\{Ηz Og+ _ :2 mj+p=XAd ~dOB-b+HA"3F@ Iv* lc%hLbX 爕j+dCb%+6Vb+Ɇm6Vm6V ͝1R6W16Vbnd u01ܜ7ќY76ܰ 7!c Θnjn؆ِ16uSp6ȆmAnjn؆;}bM wQ7apWp6ɆMᵩچ;N6d npWp6ɆmcƋ ڛ6VaȆ*X7Vm6V XmRXm"2*hc*lc5وs٫F&j߹wVXm&27Vycjlc5ِ16VcɆm6Vm6<ȆcXρz@=6< !c{چA6d ~^zmx`dC6<  lc ٘_qR&-5pclc ِ155!cpk5jk5dC=X$WX=O OlÓl|چ'I6d >oxySm$2Іچ'l4Jk&cXXK6d 3otrppN={bhm6֒ X mUXm%2Zv\`߇F/w<-k,k-k>5_˚ememe߲`Y mY6[ֶXւ-k[-k,k!햵PZe-ܲòӲ˲aYEY֢-k1xQs#Ln8ykyE5N ?/u5΋jkq^k8?/X5 ?oY->†7᭶mx ?{ =V6ɆmxCj؆7ِ1o{Cj:qOMu:hc:lcِ15:xMNmcljZXG6d ^7A6aɆc#9-c_׫m6֓ ׍nWXm'2ߧ[֫m6֓ ׍z؆XW73&>nm`>dC7|6| !c{چC6d nQ6|pbmbdC0=3FWu|6| _!c 놯چ/K6d S| _ _lÏlt/~†᧶m ?S6 ?!c놟چG6d nS66۬ 216yc76ml66 uqpذ=AmclY Y j dCt jd#{%yż66bɆ獍pبH6d ^76ºQmc#lFhcFlßl8 rR_|~_m'2װj؆?ِ15?W6ɆmCjFpoy#Hm#"2mmaAdCFdxkݺf0mSfvݺͰlV;lw`39fl?)Ħts׃-tK_B:ٷֹE}zξXl` 91xE-b [H·@[6`d#Ǐdb}`om ϘFmcdC3f0jF0ِ1 mmc[ɆY&VQ7ºUmc+lVhcVlc+ِ1x VV!c9b+Umc+l &6Q7Mmcll=e6lcِ1 Θ6aȆXئ !E:#Dii3Dm#!2mm`!dC=%l#l@!j!v1g+51֍j۱dC6C6cɆ{vSml6 mlW؎mg (&b=Pm i=PPl#lnºm FF(F6W&F)amaadChE6°0!cpaFFF6d ^7 00l#le#\66±p!cpFF8N6d >Y4\m#'2FF8l8^gb8oP؁m 2ءA6d >o!cNq#oncx_{'|_{Nlc'ِ1,΢;6vb;ɆNX7vm6v  mT؉m"1i{p&.SvKmclf E6d >o.].!c إ ۈ k&3s!zJ)jFِ1x݈u#Bm#ۈ 2mDmD`dCu#ڈPۈ6"ǯ21"E݈u#Rm#ۈ$2F8>#mD ۈ6"6"H!c&H`b jFثM(a# ڈRۈ6ȆFQjQFِ1(h#Jm# ۈ"2QFFM6*?d#ZhS6h!coDoDmDcdCh4E6h!cpFF4C627h1H#F؈6b6b!c}/mĐ w;Qۈ6bȆ+mĨmm߾c"~&ݖ=}CÖ#c㖵8 Zeeeeeeeeeeeeeee0T^4So)VFp6U׸X\bYg+k\,8Fp6U׸X\b|?ָXuo78@{cا vm6v ݰV؍m&2٘aqjdC{1j=dcۚ461֍=j{=dCջGmcln4swd~Ckcl|nmQ؃m%Z>W|{/^^!c{?{Ὗj{dC=e/){6b{Ɇ{^hc^lc:%M}NBwٰmS؇m#2اG6d Sj8c8lT+W16aȆ{>hc>lc?hrAQL=e~lc?ِ1>~O_mc?l~xx~lc?ِ1xmW؏m SOfs59@6F({6`Ȇm6m6 بa~6W16`Ȇv:߭kY4O-T8hawkjw_kX a5}up?h?)y < ?h׈!!!?!:2`=8vp׃C@03qH-H{!h!l08k$Lb8 jdC3a8cV8m&21k;c8ll|j-龊q8L6d o8q8B6|;s0GȆF#!cpG#jG#dC06j9c8lƴ_8m!2G#jGdcgMnuQl(ِ1QQ!c1ZGdC6BG6bFt+n?db{6aȆcp8q 8F6d Q3Ægm6 8mS8m'5:ab6C6cɆýjDZdC0hg w>?W16cɆC6cqd#A_qݺ8xmđ ۈ66Ⰽ8!ca2 mđ ׍8h#Nm#8A6>~{qB8mP8m 2)'`O9q8A6d c3Ɖb^Ckql h l#l\9?ede&FE,mē ׍xX76ⱍx!c$>IF<O6d ~ mīmc'ƮH31Ny$7Nm6N ׍nT8m$2Or'9q8I6d ^7NB'6NbȆ{ĊEi51Nq ֍SjSdC6NA6NaȆ⦅Om6N ϢSjdclO>&i\i\ii!cpil4ِ1x8 ii!c{hj3d ]M3=l ِ133!cpg3jg3dCO6Ψm6ΒWjeb=,)g6bgɆafюQϪm6Β ب߳~ɿq8K6d >6Ϊm6Α iG焍s9s9!cq֍sj簍sdC6A6aȆ{9h9l0}xܴݲݶݱݵaYgYoY{`Y{hYӲȲزIJԲ̲ܲ²ҲʲڲƲֲβeeeeeeWkn8߭kzyz7ԕ톽'n 8#P׳zfWu[wV*v^Sn Xnk n9pd)7fL~7}&}|[m6ql|o6ܛq۸M6d -[6ncɆXnC6ncwFV+.01q֍;jw;dCuw6`wȆy~Klِ1hl.^j$SLκaqlT=v몪]l.ِ1xݸ ]]!c}wjwdCu.qWm.ˋ񇸧dC66Pl|mmA6d ^76P۸G6λyqY7=a>Y7@m6 {S۸m#2NSm6 ?{vڸq۸O6¦O`b}8oW۸m'2qڸq۸O6d >އ}}!ck}MnMLAසm<6 >#G#!cYHml.^4l$H#cСC֍jdC6C6cɆgp}xL6d SC6cOƣҦ41֍'jO'dCH,bgVm<6 'qx)l6^m6^ s%KK!c딗:Kl%ِ1K+_DDOy{+W+!cav+lِ1xx+W+!cpWjS7bbu56^c"7^yklynX6^C6^c"7^C6^coƍ4?31o7jo7dC01{RxC6d SFm ln6ިm6ޒ ځ[nbOOUxm%2OyxK6d ^7ºVm-l[h[lXGW㝘7y;lِ1{{6aȆm6ީm6ޑ w;wvcr' N_Z]9xw5/Wq<_o<󝤿9K}=3+?{/;׃te +Cz"ޫE=1x=xmWxm|  fp@6d ~^|Pm| 2{@6d >G|6>m|6>L?`jb|u#6>bɆ>=jdCu#6>bɆGhGlx}=㓨` D6d ^7>Iml'h'lِ1\OjdtSq)ya6 >#)&oP|Vm|&27>ygl3ِ1goYm3lFXB6ףx)DOI{J F !cp)j)dCh 8PHm 2NImPHm$#)aHHI6d jJjJFJ!cp)j)dC6RB)6Rb'WO11R ֍TjTdCu#6RaȆm6Rm6R Tjdeb6RC6RcɆm6Rm6R Ϣ,Zm#5lSC6RciƮ G1҈4ji4dCiF4F!cpi4ji4dC=% Fm# l]]:VԍnUHm%2FbF4-ٰMHK6d n#-Vm#-lFZh#FZl#1鄍tF:tF:!ctj鰍tdC6A6aȆm6ҩm6ғ674ab6C6cɆaltrpذ=b^m#=l|#=HHO6d >6ҫmpbޭk yN.j.v;xlu.𾚋ځ݁9xO<8:.b?)Ťts9w sߨݙ zČ 곟׃ te seP;ȀAr ck 4ZD\2'mdPȀmd$25h1Q􊌰WdTȈmd$2ֈjdC"#62bɆmd62md6#qN]NNm;l;!c16F"_l|Θߩm|m|G6d >G|m|l4xm#)`Oɤ D6d o [dRȄmd"2 Ȥ D6d Ȥ L69)ɆEfFf!c$16l?;Ym#3lFfh#Ffl#3ِ1ifh#Ffl# pmwL,d=%Fl# ِ1=,Z,F!cY4 Emd6 Y,jYd1>0ov|#e-e-ee{ZAZ!ZaZZQZ1ZqZ RҖ2-ke-k,k-k?Y*X*Z*Y*[֪X֪Z֪Y֪[j\gFoS17ssu˃k\q2qy`ˣqypC5N5.qy5.qy|6k\u˃_^Qz+y]uAWm#/lF^h#F^l#/ِ1>]^OWm#/l|6 mUȋm#zM|bn|j|dC~>|F>!c9m6 ׍|F>|F~A_ aO6l?ґ_m#?lnu#F~l#?ِ1xF~F~!cpjd|٧71 Q֍jdC6 @6 `ȆFX7 m6 Fd#o"Lߓ S[66'2~==ِ1,=EWlFX^m{l X%Q4%L99jdCFA8oT(m$2)aO)Q(H6d S(Q(D6FYpEn)`O)Q(D6d S RHmQl=F!lِ1xO)mR(m&TQXԍ°nV(m&2)aO)Q(L6d ^7 úQXm0Ql|- mV(m!%[&FQ7QDmQlnuFlِ1QE6`EȆm6m67J,zbu(E6bEɆ獢p(Q(J6d ^7ºQTm(Ql6mpUn]XS+̻u`(Q.<A1sw_L}Ͼ9x vt߭+y19/Aq:G +.zEqx~q\ٗ1Q:(vP׃@3fq8cW(Aq!cߑ)mW(m 줉QBC+P(m 2#J9F lِ1x(E F !ckF duC#e?gϺِ13? 6~6~ 2?dC3j?`%F﬷g71J %j%dC=$)%6Jb%Ɇm6Jm6J Ϙ%j%Rdeb6JA6JaȆa?8c8l>_JmQlF)hF)lِ1x(mR(m&>}(-MKkjdCϬϬV(m&2Q(Q(M6d >o6Jm6ʐC$ڿ(#S2je2dCHWa+_e6`eȆ=2je2dC6@e6`?7R.jb(lm##ِ1x֍6~6~$2?ºƏƏdCƏƏj?beFTy61 ejedCe~gYFY!cpejedC6Be6bȆǾ<#ļQ6aȆ7rj對rdC=)6aȆ{J9hF9l<|`vE(FyFy!cp塍j屍dC{_WyFy!cFyOd=? ?A?mmD6d >o獟6~6~"2?OOdC6~6~R ۨ@6~K&FaQAmQlnTuFlِ1Q6*`ȆQAmQlЯ51* jdChEFE!cpjdCFEhFElx̸MJb_Q ۨD6d ^7*QImQlF%hF%lِ1xOmTRۨmT&vMĨ,Va+mT6* ۨ mTVۨmT&2QڨQۨL6d ^7*C6*cUVRUװFFaW*F!cR*jU*dC6@U6`UȆFhFl*XzT_)FUQoTUۨmT%2QڨQۨJ6d ~ [^VUۨmT%2 mTUۨmT#& ]j.wmT6 ۨmTSۨmT#2amT6 QMmQl4ivnwM::NQۨN6d g^WWۨmT'2)aOQۨN6d ^7C6m߇aGMZ-ZmZZ]Z=Z}ZZCZ#ZcZZSZ3ZsZ ZKZ+Zkϖ6v_,k,k-k],k]-߇A5:b6gW׸Td ~MU^SP׸ՠ'c٨jk\ \jP1xk\ u_M1m6 ̘1$&F}l>ِ1F}F}!cpjd#gu51Flِ1G8[4Phm4 21)Flِ1FFCa&FC@C@CFC!cߟjFCl!ِ1iCxmPm!ѐl|hm4Thm4"icb46A6aȆF#X7m46 ׍Fn4Rhm4"2a#hF#l19?ɳL LFchFcl1ِ1FcFc!cy17m46 FcFˢ*MuJxDm фl: NihB6d SDm фl&F&FS1fx7JMFSFS!cpMjMdC=))M6bMɆm46m46oQfF3hF3lِ1fF3fF3!c fjͰfdCIA6aF6g01pFsl9ِ1}>IsFs!c֍jͱdCu9\m9тl?k$&F Q7ZBmтlnuF lِ1xhF F !cF FKAb h;-FqqdKFK!cp-j-dC6ZB-6Zb-Ɇ{JKhFKlXfm`s_ԜVdV[m6Z hmRhm"2)`Oi hE6d SZA6ZambȴȴVhm6kFkhFkly_[6ZC6Zc"h mVhmlynug1o 獟6~6~6|g\YmglgNj?cm{ %L>h#~' 6jm6KhmQhm1]F%gHU 6Fޥg6F6F[nݝO 51ڊkضF[lyN6Bm6bmͻu"mahhkޭ1xh mUhm#%NԍvnShm#27yF;lِ1xhF;vF;!cpvjd#٦{U61ڋ77ګm6ړ ׍nWhm'2ma۫m6ړ hmWhmt0Ϗ/,=D^.w;mt6:E /vPmt0Ϗ^[xFly~\6:@6:`ͳ#-{7IH6lżFGlyX9Qm#Gt6mtp|%X|mǷ8YݲòӲ˲۲Dzײϲ߲66в6Ȳ6ز6IJ6Բ6̲6ܲ6²6Ҳ6ʲ6ڲ6Ʋ6ֲ6β6޲e7Itnu5u58nuS׸nu'c ָn ׸nTd ^M]םll uLs鮶N6d ]m;ѝl|o;ܛN6d n;]m;уl[xBr&FLLF!c$fD{ j=dC{,=KF!cFFO=&FOSzžSm'ѓl|'멶I6d c3Fťr&*FOl'ِ1s=j=^d'DO{J/^F/!c}NyTbhm6z mRm"2^jdcmgVD1zjdCu76zcɆp譶M6d >o6zm6Nyj>y#zJSm6 GmчlFhFlِ1xmQm%YMSbW mUm%2 K6d n/Wm/їlF_hF_l8{o@7+M~F?hF?lِ1xO{J?~F?!c~:F?lِ1~F?~F1FF!cpFl?ِ1W_m?џlFhFlcheYY=M:eN1@6d /:Pm 2fuS<@mc1l|m Pm $Om(@X7m 6  Tm $27yc@lc ِ1xm Tm "DV$ X7m 6 m Rm "27yc lcِ1xm Rm &3;,l 6m 6  m Vm &27yc`lc0ِ1`QoCDO{!!cpC!jC!dC6@C6`CȆCm Qm %_~z31T m Um %211J6d >o PP!cpCjCad#2KLa =e0lcِ150x ;Lmc1l|ajðadC߱m Sm ',l1\m Wm '211N6d ^7ú1\mc81ln 6m 6F+7;!zSFm6F {#6F`#Ȇm6Fm6F _Î6Fm6F-kbuc$#6Fb#ɆHX7Fm6F Ϣ#,:Rmc$1l:e$1Rmc$1l\gc`1 E6d ^7F1Jmc1l(hc(lcِ1=lRm&ԍѰnVm&2N SFm6F  mVm&27FC6Fm8^|.S`ޭEQca迃n;Oc'xǨ7O}|`,?\Ncb,cg,c`X\ƒ?7>7V-b,cI{XhcXlcXGWc8mqj㰍qdC6A6aȆ?qj㰍qdC6A6aFפqY[^21Ƌ9b<6cɆm6ƫm6Ɠ a'1O6d 絩31^mc<+pbM_ŷK.UmWlW!c2:8c8lr<>~bhmmJ6d nWhW__Ɇ6u@6~Ul\{7~oja ?|f7߰Ȇ{ῩmmF6d c#3쌵?ݝu1lؖj&ac1Amc1lL=elcِ116&`ȆmL6&mL6~'W]0z;dC0uO!;;ِ1ߡ6~6~'23F=6Y]ۘH6Z>Z;cDjdC{^DD!c2jdCuc"6&bƱΎDݘ$I$!c1;~Ckc1l|gIjIdCuc6&m8sA|E?7;&[1Ų6ղ6Ͳ6ݲ6ò6ӲjYeYmYcYkYgYoY[`Y[hY[dY[lY[bY[jY[fY[nY[aY[iYs[VYV[<,kk,kL7fɢM5nM5n28͓R1M|a4i4!c1 ֍ijӰidCT54i4!cpӠijӰdwEO{tt!c1֍jӱdCuc:6cɆkjӱd~!m1CPۘm 2Fb# 1ۘA6d O7Pۘm 2Eg1Cmc1lYyu c)3aO1ۘI6d ^7fº1Smc&1ln̄ucLlc&ِ1mmY1p%!951\yW WlÕl+/誶m  WX7\6\ W!c]apUp6fa\1KԍYnRۘm"2ߘ7fm6f ׍YnRۘm"21 ژ1 ۘM6?abuc66fcɆ{lSfm6f _̆)6fcɆߑ mVۘm!WcEYtlcِ1xݘ9!c1֍9js9dĆ6m6 M8c1ژ1ۘK6d ^7º1Wmc.1l|ޘ 獹jsdC6Bs6bF'kUO1扞2yjydCuc6aȆ{ɜGg/}s霿[s׃Et9$CoطX-"\ٗ1"H`ȁ"(bZ"\ϘEjd#C61;{y p1(5<<|nblc1ِ1Θ6cɆgp\XL6d _&Xmc1l׹U#c#9blc ِ1%%!cs 1m,6 K%jKdc~ǩKKͻuKFև%d)*Tmc)l|\ g̥jKdCuc)K6bKɆm,6m,6Fsdb,{Z2e2!c,s2e2!cyc7m,6 'Ym,SXm,'IejF\Xm,WXm,'2aXXN6d ^7ú\mc9lrhcrlcp =Yo+ļ+6V`+ȆpXXA6d ncBmcl|OkBmclL1Ac+aXXI6d ^7VºRmc%l|] gѕj+dCuc%Rmc%F6n60p6ܠ 7 7lÍlnᦶm  7X76ܰ 7!cY pSp6"G-51܅ wh]mp'2E,ꮶm  wX76ܱ w!c/wh]mXE6{LXuJ༱Jmcl*UjUdCuc6VaȆ{*hc*lc5Uoٛ$]Mjhcjlc5ِ1xOY {jj!c֍jdCuc5Zmc5A6J_= lÃl  j؆ِ1 hCm 2Іچl86܋kDX5!c5:elc ِ1xOY{5!cX$E:S OX7<6< O!c%K쩶mx 6<6< O!cOhSmXK6nkEX ZZ!c֍jkdC{kZZ!cXn}"~o:z˚eײgY`YhYX-k,kA͖-`V6Zeme-ԲfY EX"-kQhZ0^T 8|q ?/u5΋ja.guq^yQ1xK]p'ckyM6nxmbx Іچ7M6d ~ 6 o!c{{mxcdCV6֑5 X'l6֩m6֑ uvpu!"_Xm#2`XXG6d ~XXO6:||cxu=|uzlc=ِ1xXzz!cp롍j뱍dC=e=^mc=C627h1HG<mQ6|Ȇ|5چC6d S|`OQ6|Ȇm@>j>؆/8x+z/)j؆/ِ1xuWm%2nmbdC=U6ⴎo~f\ma~dCu ? ?lÏl|ma~dC೨᧶ml M_.h=A|{ !cp j dCuc66`Ȇ{hc K^ֹ:ouI`ZFsD?[j~n# g웃`O|n#<|#t1?3?/?zOg_q='21[|C+!cgV  l#lL<p⬉f l>m w߻ P6Ȇ{:jFِ1mm`d["L@q?6@!c@?6@!c9"jF ِ1mmbot616 MjMdC3&8cnR؄ml"2MjMdCp~6@66ml6ƮL @|N Hm#"2)AmaAdC=% l#l|"R66%~5,-6}jdC=e3)66cɆml66ml66 j-dlUZ[DO{-!c$1ml6 -lQ؂ml!2آ&_50,zJ0)jF0ِ1 ``l#lF0m ϢFF0lluL\&VQ7ºUmc+ltrpذ۪J6d SžUmc+l|c+Umc+l8^ʒ&6X7ml6 ׍mnlS؆ml#2 ئ F6d ^7A6a!d|)F!nm`!dCϺgC6B!c}/m !FFlܙ؃31=p|vlc;ِ1uvx]mc;l|j۱dCuc;]mc;J6<jb {JF(J6d ;wrC6BP!cpFF(J6d n#U6Fǯ61DO =%Lm# #2anmaadCF76°0!cpaFFN6Z #\\ -ppl#lF8m ׍pX76±p!cpFF8lwyQDc);`O١A6d ~^P؁m 2;`ءA6d ~ ءI6pkbb6vB;6vb;ɆSvm6v ?#>#Smc'ln6vm6vO^%]pإ E6d SvKmcl.x~.lcِ1].]FH@#BԍX7"6"!cpFFA6d 7"6"!ch#Bm#ۈ$G놽C1", gHHl#lF$mD ϢpTۈ6"ɆmDBjF٘5&F)QDmDaQdChE6(!cpQFFE6d >FAQjQF4٨Mha#ڈVۈ6ɆmDCjF4ِ1 hhl#l|ވ66nA驛o11bc\c6b󖁈{J )1j1Fy@F 7b6b恈{J c"~&ݖ=}CÖ#c㖵8 Zeeeeeeeeeeeeeee0Thz_n8Ŋ _K5N/Xu5.jgX8Ūk\,qTd ^baU׸X{sn]Xnnnnv;톽nns쿼ݺݰVo<ݺVxC»=z{D=߃:2{`=أv׃=@8Q؃!cg@{6`{秌gb6B{6b{Ɇm6m6 WU؋m%2V mU؋m#yV)nb{>}>!cp}j}dCJ`'٧G6d >G6m6!뿉Lbbuc?6cɆm6m6 ׍nW؏m'2jdkqoSjdC6@6`Ȇm6 6m6Yy8(zASm6  AA!cq֍jdC= qPm ql6^㐨`8q8D6d n!n!C!!cm6 8mR8m&˴)U8,aX7m6 ðV8m&2= am6 8 mV8m!2 hrqD<'p>'pDmqlFgg$_8m!2)G`O9q8B6d >6m69~#8*S딣jGdC=УjGdC6BG6bGɆm6m6 K]gt41 ǠcjǰcdCS8m#2)`O9q 8F6d _&qLmqlٽѧY 㸰q8q8N6d ^7úq\m8qlqhql8ِ1qhql#lF\ĈhE6Ⰽ8!c16or!IbhmaqdC)q:%Nm#ۈ#2E㠍88lوuڍ& Q7NqBmql:N9q8A6d ^7NqBmql|qBmO6:06F³FKjF<ِ1.IWۈ6Ɇgx8ƫmcdC=%ڈWۈ6N?;Nb[> =!! I$(D1"YQHHR@@Ab"P!agYL={׽ΪUջj cSV9e*nc1nuc*nc1nuc*nc1pXeHr#ݷMb5ѧmsbCNFF:.6t NmmsbC9%H7H6V ociXmX-6t iXmX-6t m5mjnc1n6Vm6ֈjrc/NX#6N$t2~}nc1p aטm6ֈ )k:enc1XCm1XmKMxыVSuZZcZZcZZcv-lc-Nlȓz1uûg8kq16qĆ6Q6qĆutlcNlo6֙m6֋3.XӋ^Սn7Xm:XOm7Xm:XOm7Xm:멍f빍 bۈQblP66P66pĆll0ml:@ml0ml:) fb<ب):eFnc1pS6ml66 ml66ml66 ml66mltۈIʽ{;>,b[ᡫ3I`ہW?PmVll6y=,߾`36zYl׃"Bzl"6"//-E[\lc Elhc lc El8Wls-c`b*6J_:3scj*6t 1sVnc1VjcVnc1VjcVn#CllL7{#C=?A; n#Cl6͠EF!6t S2蜒amd ;3 ncؘky:{166f&6t S9e6nc1psf&6t fm#r<M/n]9;v8v:v9v;8:9;8:9;Ǝ8Ǝ:Ʋccc'c'cccgcgcccccccWdJ{Tw)SF74׸L^2X2i4׸L^2e(\2y˔c`oIk\eo(}B7{1h;퍶ml6 #Zň16sņv:m7ml:Nml7m]ŮLbP0m:;h߼lcCl7}c^jcncݲG WINjcNnc1aj)6\SNNc);6vr;ņPIm4mo~g^]jwe%6t 7v~c.nc1nuc.nc1pMe-6S܋[ilc7[l Z1"6\6m:֍ݴn6m:Mm6m]{Ԝ){6p{Ćuc{6p{Ćڋ1m:{=f{bcЎe8ދWa5^^cx FĆ^^c^^c^>Q-ا>Z7m6 >Z7m6 m6m6 {}>}~bW~o7m:O7m:i/lc?_lX7S6s#c 5bPs:08m:֍n08m:cycylq@l؋6m6^]S2z1q֍fbCuٺfbCuAN9hq8(6t fCbCn {1~7m6 E}CfCbC~7m6 Q6qFFsS%au}68m:0}aac`8Laacawk㈪Gh8bq8b`qG6pGaU E^n;sjn[[^QjQn[sQ:58m~kS1pN9J産fGom*8Jm58md yC^,Ջf^4l#:Ȣ66,cE,,n#Klh#26y{棫81Z7m6y{*)rlq3W1p {am6y{*8Fm38mEy<><8[w~' ^Nz{>/uIyw4'y=8[8WsI-T 1OR'"Nzp۷P16Nm6N9s7̋qJ[6NqĆ6NQ6NqĆ=)c28m:6Nm6Nr=&ťz1N>45Nm6N #bbήrM ic`q6Nsņf3bcj*k&@bރTgĆ3c~yl qFlX7кql qFlh ql qVlS+/Y5sYYc,;Ϛm6Ί 8kq8+6t q8kq8'6.p^s~/Սsbʴ VV`38m:8Gm38m:֍sn38m:稍sf縍b#كZ4bWu<6sņ6S6sņyo78m:SS6sƐVڙŸ 6r8Y7X f bCuN`q۸ 6t hݸ`q۸ 6t |7jnظ&MH~/݇}Ql^ul"qQl؋^EEcEEcrڸhq۸$6/_=n㒿l\=VSM %K%c`ݸD%K%cK%K%cK%Keq|^&b\VeecD,eeceec`qڸlq۸"6oF^+jn1B{+fW+bCWWm\6 װW+fW6"l7rgGp{X~XX1++++Kqu:Ɗ9Ɗ;J8J7Ǟӷ-93$99㟓7_up([ $G?gAk\pl8ָl1?gA翜b#rDMKFNj#FNn#1of}sNFNcFNFNcFNFظL˝3QFemD 0뛣6(c(j#l#ۈ:ڈ66\bQ=z1rq7W2m:ǚ+ce%6t f{6rqĆk\F.\FHlF!U7Bn6BFHl^hLjp2q!c0]0d6BbC2qb<ňV6hhn#ZlގvF4-6t SmmD hj#l#ۈKM< 1bj#l#ۈ:֏rڽӋT&F #6t SbcmĈ 6b6bXb*FF,+6t nĚmrbCKFF,+6t 7bXXn#Nl|l&K0>f/ƙmqqbC;@88n#Nlh#ڈ3ۈ6ĆsJgmċ bīOFF</6t němsbC9%)fF1nSfFؘ HP6n#Al6~ k6c`Hu#l#H:Sn#Ql{x'JDe#H4H6ņu#֍DDn#QlMkDDn#QlxC"h9;읭 -ui,"[ᡫ> 8[;̞9mvثu鷟vއ'X8sܼ$wʝ"IfI$Adm#+NZt#c#6t c#6t #>"Fn#1pc+6b 5l~=WMY#F^n#1F^j#F^n#1nu#F^n#1n6m6 EnؕTGF>|F>c|F>|F>c|F>|F>c#l#_lٟzbW6S6sņee7m:Om7m:)fbGwNǴbP6 P6 pĆ6 P6 pĆٸÏ]M FcFFXlHSɋV6Fl#mņgdt6sacE\fan#,6t 6fan#YlWlQHlX7 ѺQlQHlhQlQHlZ!jF!nXSSʎGFaQl0QXloFaFacWaUl0QXlX7 S6 sEF"/,ExH0Fn1nuFn1FjFn1n6m6RƲ5^b~#)f)F1LR =bm mP)f)F1p+H1H6;I=HUTlDJSE6rEņg ҳE6rEņ6RE6rEņۨ`6m6RrGUHUh*ES6RTc~YTTn#Ul؋^4l#H:֍Tj#l#(&6nkx1bavwP1bF1c]3(m:֍bn3(m:֍bF1bFqy^(NfŹbCLjU\lWqFqcFqFqc~ fFqnظny+1J6b^Bl^VlQBlN)A)%6Jp%ĆsJ :0(m:~Q?FF1wxocXm6J@^adSl$QRl8sJIFIcom%om%6Jr%ņ(򵷮aQm~v#LaJ9Hsvqusw]1V1vccFMc8nu1V1V1V1V1V1vc~RRRm-3s*ϩԸ!8Dͥ5qXJW\JWJjQ)2׸RƕcW5Ć<؋~F&6t FmmqibCsHifiF1Ffmy"O5b㝛fbC@fbCQ֍fbCc5UiF1ȝH2j ݧ+cQ(#6t Q(cQ(#6t eh(cQ(#6t eh(cQ(띟j28^~~,+6&Kr]FYnwJvY.kQ(띩R1nuFYnwJcQlFW9l]%;[W˙Es>n>c66:ڸڸl>n~ʝso/6V׍66:FCcXmm/6t 7fs mOmoq?Xlfj0XՍƴn46hm4:a5lcFcc`hLFcFccFcFq^nb4Q6PM6pMĆkB[l DlmBװM6pMĆ6PM6pMȝ^FSjFSn1n4uFSn1YYfMbCFSF3~hl46m46 {fmfьh&6t hhfьh&6t ьhfьh^b4W6S6sál1p9jnќh^bFsFsxzm46m46ZHjjaтhesJ :0hmk1<,Eaтhbo-f-^Tx֍669:<`C9!6cDl ~!& xxln%'׋RFߒFl%2m6Zm6Z{rbc@=?FFڑ}M FKxOn甖FKƃ.7$ƃn<[ )lbxsJc?g _jblF~ Fߑ;;;{1cc)ӎΎgc:ƞs={1cc%XWX7XwXXOX/XoXX_X?ˎWc:^sw Nמ5=q G=}L{skk\{;wⵧw7׸Ƶ5Ƶ_ًA:5UF9}s7w0mtx=lgbׁ`сwUHFGFG7=֏rڽӋT&FGn#s9fpomt6:mt6{VO(OPOm>[9}:o>>[>dRbLV6&S6&sK?)2lc21c`/:6&sK?6ژl1ɕ(Pm|m|1fp=~ S>sfp=~ _[bLQڋN1ۘmLBװS6pS~m?ژBmL1ۘmL1ژb1ۘKjc*ߘj1ۘ {A E^tTnc*@SfSx/Tn{dr4#=91cct L'YَOc98:>w}1ck7oc c9ƾw1clclcli^s%Ӥƹ.fqxekitM5\7 K54fqxc`o4ָi7$Ƈom|m| 1om|m|c>݇tC}V~ >6>4m#򢵏o}#"]hYGnއv{G;KZ+}LJy=~ bZcVc^>]1|Lfz1ҏcjc\1]i1lc:1=Jin1ۘc`1Vfӹ\?ژNmL7ۘmkKn̠uc nc<'>b#fm6fX7fк1lc1߯@3f3bĘ=I=i1ۘ)6t \̤동f3bC}t~Lnc1LjcLnxDlnx$s'tNlnx$uZ7>1! bOO6>6fp_VWWbRkYtm:lc1Klhc1lc1KlX7fѺ1lc1Kl7;ژe1ۘ llx( kpf|Qm̦6fm6fEA ӚMm6ۘm|*65)eS>sʧfr Ƨn|j)1pN)m|m|*6t Rm|m|Ϟy1>Su3Z7>3 = bD14ggYm|Fm|f<{~3j3ϸ9b"1(s9fs9bC1֍9fs9bC9eSm6 m̡6m6sJ\jc\nc.<usٺfs\bҽfs\b甹\bckso|N6>6>:֍ilsnsc3$gH>7\lhsjsϹ/ /l n xf5m1+a<_m|m|Ϭ1f_pFFvbS6Q6qĆuc6qĆ}g|nc>b໖w-7ۘṁsA E^t|nc>b`/:ژo1Vllߪ~[o|k-1o3ߚm|m|+6t [zWfrߊ ƷƷfr lcoAݷlc1X@f p s:,0Xm,A X`Nl'Gdv?hYO$"t ?Q?mm,joH= iŅf p^-{Z iXhXՂo[,4Xm,jA XhX$6>|{1Ets"nc1n,uc"nc1"jc"nc1"jc"nc1e"1+fp16S6s,cm,6m,6Y MS6mD}wOpɜ^#rKc?;~q1clc؟cc;V8V:q[Kwvquswmpmtmrmvmqmue8ƶ9}Y"5F*y 훗k^H1-5n-5n8%o^bqKx["5Nt\o)b,U6RK6rKvX=fKp^;6RK6rKv{RbcMN);*1~Vϴ7lgngc6~6~:lgngco:?S?mmg mmg11oͿmmgX7~6~1UlNZtJ$ƯnJƯfr Jj+1pWoƯƯbC@RmmClc b`XF2e2$Ϟ-Ϟ-3Xm,;@hclc(ޥ]J/jN)mm!6t oڏb~m ??ĆstNlnc??66aFH?U֍?66a ZEm2XmNj7FF:.6t 0Unm MæmsbC^4H7H6V]$jՋjj0jo6Xm X7VӺlc5* bXmm#rkl]Vxgj,b[!ٺ5F1;Xv}xQ?[>qއ'ZC5| k~Boki=Xkz b`=XKZ)Xz,b-k~ XKm5Xm92Gx1֩;;֙m6։ m6֙m6։ c:nc1XGm3XmKU6s NNlc=. b`6s XOm7Xml&eV}[bl9rAl,7 6ml66 Z76ml66 @ f bCslcblTFF666R66r^ ilc# bF&1hDz~ؤog7ml66 ml66ml66 ml66ml66 ml66ml66Ý^ͪLfpq!Crfnc3y9e3S6ml66ÝA 76S66s[=Na6 [6p[Ć6P[Ćuc [Ćuc lc #1֍fv甭tNj a1VjcVnc+܇gRbcuP{_t+l#:a36l#:od n#Cl8dPf6+݋MSu6mƶp([ fw16jc6ncܕ9elcF~ r#ȝ{<;v8v:v9v;8:9;8:9;Ǝ8Ǝ:Ʋccc'c'cccgcgcccccccWdJuˊZMWyN7ʤQe)5NIk\e)5N(Fk\8k\&q>cꍶhvnc{8-i߼lc;@۩f۹> F۩f۹bc̾*bP0m:֍n0m:{1;6vp;Ć6vP;6vp;]!^jNI甝f;PX7vҺlc'֍f; >Oi%6~.\e^].jc.nc1nuc.nc1.jc.nc1n6vm6v{d{v{vm6vCbnlc7#nm b`/m#6VKL'1^tEm6 =tNc#6t F=?FF'7vH&nc1jcnc/cȋW){露lc/7m6m6;؋^^xPm6m6~+OՍ}n3m:Gm3m:>>lcOlo6m6v?]7m~c?7m6X7Ӻlc??@fbc߳OO8tN9`q8 6t h8`q8 6t \fbC9qlqM8 buAp([hX.AAx7Y):An ,u ql qHlڼ~`^C8DCfCbCCt!n1nu!n1!j!!ٺ"Y:danއ~laznac~f6PW6pW]A EPW6m_q~rrcюXc,1Kp%:r;ƒcycyccccaXccccc,1V1++++~9z4)G2F9Yo?gsΑl3Ǡ5.GrlXr$?gAk\l1pˑj9rrˋ3{ɬ7i)6t | g2{ FNn#1p7g2i)6t \S6rm6ƀ"#JՍ(Z76(cxQk?FĆQfQF1nDѺemD FemY6ȥl6rm6r \ɬoe%6t he%6t ed\Sٚ*d6BbC䆒{rCf!n#$6t !Z7Bf!n#$6t 6Bf!n#Zl;r'/FMmDmDsbC=dmmD mDSfF1F4m9읭 zgbٍA1f1nއ~ gbb?[̞P11ou1;11w^*KؕXG>"z+߾ :5; VXbi=5 VDKmĚmrqbcfBr=&IdK,V88n#Nl^ĈXՋ棽h>|F>c6]3m:)蜒l#Olh#l#_l]b#io/6t io/6t FM?Fb\j#?_lOm7m{N߶(dQ@Սn0(m:֍n0(m:)RlQ@l؋6 m6b>fT}0 m1nim1pN 9%l6bC9%Lm6Fؐ ^de#H6H6ņ6ddn#Yl~!8$VF1F2lm}7NjQP(Hm4(m:)Rl QPlX7 ҺQl QPlxWaAjFAnظ&T/Z6 qĆ6 Q6 qĆ6 Q6 qĆh!jF!ni5QX(Lm6(m:>?^>?^l0QXlxXaDOaFacFaF{A-y19Sm6 "(bQ("6t -BEm6 "F"Fůz1RԳ=)ٞn#Elh#H1H6RĆsJ SR6Rcc)FF QTlS+/FQQo5(m:EiQl(QTlh(Ql(QTlQ(jQHS#?bRomfF1nҺjm mRfF1H6R6RbbC~ N"1Q֍bfŸbbC@ŨbfŸbbC@ŨbfŸbbCQ(fQ(.6̍ܵ(@6sņtRl8Q\l؋hqFqc`(Nm7(m7ܮ׽%]Ö0(m:֍n0(m:g^?F\V%bC^QlFpLILR\ȶɺޙ"baTĄ~YDICțDg-ivPثߜ85Jo;/iKȽ/%/s9J;8:9;ƮsUpUtUrUvUqUu]1V1vc&͎[c:ns1VqK)]uyŇZJkV\JyT1{R)egVJꙎp)ZJ+[)>ʦc`?\ָRWku]gߺ/֬g?l]iFi!cQ֍jdC6JC6Jce[\(FQ7QFm Q쿉|RSʨm6ʘ7CRCRFm Q쿉FhFl,׳`&FY- װe6beɆڞdU(m%2S9FYl,ِ1x/Z(Q(G6vNt}'('F9X7ʩm6ʑ `/ZNmQlF9hF9lِ1x(mS(m ab놻چ;N6d ދ^]mp'2mmcdCwh]m0G3j!j؆1xuCm0"E=`/꡶mx}Q6<6< Oa~=6< O OlÓlnxº᩶mx  OX7<6< O!c=sOhSm2{ zsS6 /g.bp^ІچeE ^7`R6̞ /hKm & .w?ibx Іچ7M6d nV6ɆmxCj؆7ِ1 mxmxcFXMFyhFyl<ِ1FyFy!cp塍j屍dC6C6cdǏn~01*8ARl^Qۨ@6d nQAmQlFhFlِ1xQڨQ1_Ϳb^>j>؆y&bp>Іچcچc6|6|d틆TEFE!cUXQm"QlFEhFEl"ِ1yFEF%vUS~&F%oTF%JF%VF%JF%V #16W= Q ۨdÊ|NmTRۨmT&ԫQY)RYm2QlFehFel2ِ1-_yRڨmT&2S*C6*cdLV41| _hWm%2 mmbdCs/S|6| _!cpІچ/QlMU*F*F!cpU*jU*dC9VEm Ql9lhFl*H7&v7~FUl*ِ1FUFU!cpUjUdCu*QUm*QlPsĨ&F5X7mT6 a5l5jF5!cXV߱Q ۨF6d U ڨQnqȫl] 9[W X]-]x.}UT;0O.ٺpwW}sٝg{^]}ϫzPynK?㲄g j5w5Ԁj91~g (ZD \j׃F FM6jQsO˼dWlX|%j5dC{Z5VMFM!c>&#jm6j ۨ mTۨmoV 8^=16 ?!c놟چG6d 6kS? ?lÏl܆᧶m]g$ lßl.lj'_m'2S⯶m ?  l#l݊8 om`dCu#֍l#lFm [@jF-1MǙZ t-ZF-!c3IZjZdCF-oRۨm"2Zj@q(o(&FxmbdC{ZpO+Pm#$2߷jF ِ1@h#Pm#n}+}7d|#2V2V2bkgo 555Y[-cHXXSXee,222ckiY-c QsQ$TApMqAQ1\D 4k\qATd k u 5.j X5.d#4mޗM`o 6`!c/jF0ِ1`h#Xm#&2_oCjFmy_ެ~bbu66jcɆ"bQ[m6Ql|MUjm6j _TڨQۨC6N;vQڨQۨC6d ^7QGmQlnԁuFlِ1RڨQ!9="8m`!dC0tpذ= Q6BȆF!j!Fِ1mm`uFUƒLnԅuF]l.ِ1>]]OWWm.Ql|]m6 ׍F]F=1ƴcMznԃuF=lِ18g yT16aȆ}zjzdC6A6aƵvĨ/lԇ6m6 aQ_m>QlF}hF}l>ِ1F}F((SgLP19%Tm#%2nmbdCF(7B6BP!cpFF(рl$L`\Flِ17o5Phm4 2 `hh@6d n@mѐl,ʕPԍn4Thm4$27m46 ׍n4Thm4$2_46m46_;yuh$F#X7m46 `Hmшl|hhD6d h#c\=u# ֍00l#l| װajaFِ1w,w,6°0!cmmaash,FcX7m46 ׍ưn4Vhm4&2hhL6d n1Xm1N6eb5l8\ÆmcdCh8E6±p!c~#jF8ِ1ph#\m#ۈ /]ѻ!8DmD`dCu#֍l#lFmD mDmD`d:ckbDw";jjF$ِ1Hh#Rm#ۈ$2_F5lF$I6d 6"6"68e2ٺ&PD&vix?g@MgyqiMw\<#?g{D}ϛzД>9fzMEMw)M44)91\M"zДD|h m4UhmDzxT&F0Qdö mD bpQFFejmDAQjQF"1((l&F3c6=f3fF3!c}fpߢF3lِ1fF3fF3!cF3fF47:žLhѹfGmDcdCu#֍hhl#l}t6ph[eЗqICk#ۈ&21hhl98gLhjͱdCu96cɆFsX7m46 ͡jͱd#+=)F 4k {l] F !cgh-3j-dCIZI F !c~BmC6XppR%#FԍX7b6b!cmĐ [}l#l|N6b6bdcKׄa&FK_%ZsiONihI6d cs6e5'u FK!cp-j-dC6ZB-6ZbdrΧgڙb3nŪmbdCh,Ec6bX!cpFF,K6d >BjF+QR#LVb a[m6Z ÅVdVZm6Z `/JmъlF+hF+l5و61Z jdCFkoVhm&2hhM6d >6Zm6[Ĉe26Ⰽ8!cFFG6d >9%Nm#ۈ#2qFFO6}Ԛ3&FXuJF<O6d o~#^m#ۈ'2nīmcdCu#ڈWۈ6FE7y`b$ FF@6d 6!cp FF@6d n#HPH|F~FfG;IdXX[XeeeeeeeeeeeeeeeeeeeS@ `P0augZ+Sq%k\"qTd >%/Q]qK'c=Dq%R1xK5.Q]D66\IQHk$JRH6Ȇm$AIjIFِ1$$l#loN66dyÖcɢn$úm$ H66d!cpFF2L6d ^7ddl ٠[551ڈ֍6jm6dC}s7Qhm!2hhC6d n Fm іl.^ymahhK6d ^7ºVm-іlF[hF[l-ِ1F[F sϱ&Fmm`)dC{)p7Em#H!2mm`)dC.Slx^bS9F;lِ1n;NmюlF;hF;lِ1x/hhO6G=6{^ԍnWhm'2S9F{l=ِ1=\öWhm'2h@6F9v/FF!c^E;mt6: sXF!c~Amёl۵cc訶H6d n#Qm#ёl`G\FGl#ِ1xmtTh8y.g?[ }I-]xZvuII݁x.uE'd87~6)OD1;w3}aY3ɁAgX:Et313Ym3хlL6Z&FqF <#Em хlFhFl ِ1 ]6`]Ȇ.F.FWqC&FW~QW~QWFW!c>+#mt6  mtUmt%2誶F6MnL7xFF7lِ1nL7nF7!ci76 F6d nMmѝlĶuH]v6cɆpN鮶N6d ^7ú]m;ѝlFwhFwljxCcV==Ƙ'suFlِ1~gCmуlFhFlِ1ڴCmѓlܞcރ&FOo[Tm$2 pSm'ѓlFOhFOl'ِ1:'Sm'ыlvk&F/g/jF/k[pO_F/lِ1L݈wpظ{{Z^dC6zA6zaȆ^F/^Fo/<_E FoFo!cuJoN魶M6d n7[m7ћl|N mVm!kWQ>FhFlِ1̜a#yBS˥C6d nGmчln6m6߳8)`buSؾd6Um%2}a諶K6d n/Wm/їl }j}~dcu!&F?gSm#2g|gF?lِ1y?gOmяlmSm'}9>*`b6C6cɆFX7m6 }{_6cɆFƧdc{LOE)7>Ul|SƧƧdCuSX7>UlTmSlcxei&ac1@mc1lhclcِ1x16`Ȇ@0/z&@ac 1Pmc 1ljdC6B6bɆm 6m 6ۃF=fb  o Rm "211D6d > s A !cpAjd &`Q7ú1Xmc01l|N jdC`؋Vm &27C6cCFyB#ߚCD!!cuN1B6d ^71Dmc1ln 6m 6/yVSݞݞjCdC6BC6bCɆi(MjCdC{_CjCadcb9&1Lm Sm #21 1 F6d ^71Lmc1l|c1Lmc0/a[1262elelelelelelelesIɖ)/-c,c-c3,c3-c,c-cs,cs-c,c-c_YXZ3jِ+74h8썆kp\S1j8\S W׸ 'cpqqN5N5n8q5n8F\I!p1A6d >!cp#j#dC}hclc$h>döa&H #6Fb#Ɇ#z{Hlc$ِ1HH!c11nq3ٺAf1g>3gjEelgF|v݁x:v}gg⎿29/g{f[ Q((2`=v0 ׃Q@Gsأ"Fz0D|mRm&wOHw-l6Fm6F  mVm&2_GjdCshhchlc hGlZc11!cs ?ƨm6Ɛ ۏc6`cȆ@c6`cƊJMbu?dcK6ƪm6ƒ ׍nUm%21.cXlc,ِ1X8L c\Sm#2߷-Ʃm6Ƒ ׍qnSm#211O6?ab.s6cɆxa+_6cɆxX7ƫm6Ɠ 㡍j㱍 diz711&~c7&mL6& `1Amc1lnLuclcِ1  dc렧";9s8|99ِ1L݈spذ}sϱɆn|99ِ1shsϱ/Y7mb|!n|ِ1x֍/66 2_~װ_m|m|A6d ^76PۘH6j|]} M9DdDlc"ِ1]Nw9Qmc"1lDhcDlc"ِ1x/:ژ1ۘD6NcE'^t$lcِ1xݘ$I$!c9eS&mL6& )Ijd^M9L6 icdlc2ِ1dd!cpjdCuc21Ymc21l|aB6SĜ2)S6`SȆ7)jS)dC)p2Emc 1lߘmLQۘmL% RNSɆvjSdC߇ 3Umc*1lnLucTlc*ِ12ژ1lN_ºƗƗdC66TlƗƗj_b_ )_B_m|mL#9~Ę&4 ~;h4lcِ1iy4i4!c9eSmL6 ۘmLSۘmL'_ZmabL{_tt!c~c:7mL6 ׍nLWۘmL'21ژ1ۘA6fԷ1C}̀{_36f`3Ȇ X7fm6f ׍nPۘm 27f@36f`3-{Ę)LX7fm6f ag5LL!c1֍j3dC딙L,qDݘ,Y,!c9eSfm6f ۘmRۘm"21 ژ1 ۘM6Llhcllc6ِ12)6fcɆg=jdClhcllc٠?sv\Qۘm!2S9elcِ199!cps9jsdciIǷVMߘ jsdCuc.s6bsɆ甹pN1ۘK6d ދ΅6m6摍ڗuŘ'ypN1ۘG6d nc1Omc1l|2Sm6 mSۘg83y&)OG̙p&1.\<L|8W;ow`.]y&i>5|7er^{>׃wtr:W|W_ݗ1^Wp/+p= J-+\"2_A_m|m, kgb,}G,PXm, 2 ku [ZX@6d c#aIT16` ȆBxpncXXH6d G,}BB!cs!1m,6 Xm,TXh&ݗ/o8ű}Ŗ%e喱UՖ5u M͖--cXƶYƶ[vXvZvYv[XZY[j\S~禚?NDoF5nq."ݺE׸ETd VZJ5nq7Zk"u[dc21o1m,6 Xmc1l|[ jdCj%dcK܁GM%}%}%jK%dCk%pMDmc lhclc ِ1hclc)P˾MbNY 甥jKdCKRR!co,YXJ6d >,6m,6ڵ~LǼ뾌l,SXm,#2 ږ ԶLmcln,uc2lcِ162er1&žrE6cɆrX7m,6 a/\mc9l|NYm,WXm [Xoð+FWð+6V`+ȆڞdPXm 2]pWm6V XmPXm$٤R+aRmc%lnucJlc%ِ1)+6Vb+Ɇ)+j+Ud#MUN*ad.*U*!c0*lcِ1U*U*!cpUjd˓B11V~c57Vm6V ׍հnVXm&2SV9ejlc5ِ1XXC6zgkukȆ:elc ِ1:W]quOCkc l| aרm6֐ a@k6`kFͳzo11֊֍jkdC{_kZZ!cgk3jkdCsZhcZlch],IMuuXG6l?lNmcl|NYuj밍udCkup Nmcl|NYmSXm' .X/):ezlc=ِ1yzz!c^t=E׫m6֓ ׍zq7&smAmclnluclcِ1ӆ@amA_%U !cwM6@66`}QQ^ݨH6d nc#Qmc#l|N甍jdCFhcFlc0ULM9ŜD6L%Imcl|NMjMdCkMp Imcl|NmlR؄ml&_IablpYmc3lfxrflc3ِ1x66cɆml66ml6?[{}Gc 4n!{8ȺEmc lnluclc ِ1)[6`[Ȇ--VQ }fbluc+[Ɇml6ml6 }m{_[6b[Ɇװ[j[u= L6dkQ=j_c_ }} VlwrdC66Vnqٺ|AfOÜj|]x.ٺo`Fstvߨ7o.]G=׃mtqzyCov6m껿 ׃mte 6צzElS؆6!c}m6mvآL=-sS [ޮN6d Gl5bvlc;ِ1t;\nW؎ml'21C6c;tH1vs1wm6v mP؁m 2ءA6d G6vm6v#+.nbIvŽbNlc'ِ1);6vb;Ɇ甝pN٩I6d NhcNlcHPl[?c`إ E6d ^7vKmcl.hc.lcِ1FlR؅m&΋61v jdC6vC6vcɆpN٭M6d nc7[mc7lL&1s=!c}=pblcِ1==!cp{=j{dG7d`buc/{6b{Ɇm6m6 w{6b{Ɇ|N⌁lU؋m#n\fbuc6aȆ}pN٧G6d o>}>!c}>}~C-ebuc?6cɆaF3ÆաjdCs~8W؏m'2SC6m8s}0o7;Xq2v2eeeee;q ISӖ3s K,c-cW,cW-c?ZƮYƮ[nXnZnYsjܼk_1wָw׸Td u;kq258ԸWx5;2AqIEotF6bɆal;c8lX|bhm6 8mT8m$2q8q8D6r۵c&qH8mR8m"2=pm6 8mR8m"2Q#1~ 16aߚ}s#!cq֍#jG#dC6@G6`GƬSibgd32G6bGɆm6m6 ||Tm(qlQhQl9qPӆ菑>#7Ȏm6 8AS8m#2S91lِ1c1cwdǂ*E߉uwpwwdCu;X7Slwwjaߑ 3Nm;l80&q:Ŝ;N6ep}3p\m8ql={jDZdCqoW8m'2Eg dql(\}H& =װ'6N`'Ȇm6Nm6N '`qBmqln6Nm6N^f`㤳0'Ɇc]'6Nb'{"q8q8i{1x8 II޳A6;cdw@Z'FRe7166'2Ejcߓ k=|{ﱍɆA6D:c8l zpuT166Nw{qJ`qJmqʼ/bq ֍SjSx)rJmqʼ/bu)N9qnql] S+ٺӰZV8ma.uistni9w\<#xL΋>9~ˠ 3[groQ31 D ^zpF g9g`qF- g9g3jgd/eqVwg6bgɆm6Ϊm6Β 8 mU8m%2Q㿹Iq8G62\~8'zsp8q8G6d 99s9!cp砍sj簍sdC06J8c8lZpM̩?e sy:ِ+&yaf}01.<\yq ۸d։|NKjKlm\6.m\6.u"7.~%l΃[2o?updC6~6~PlpWȆal4uFT16~6.sҝob\e؋^V۸m\6.E N )6.c͹K۸ m\V۸m\6.E $aö }Ym2ql<weL+߸+jW+dCo\Q۸m\!2S9l ِ1Fb3Æ? pJCk q՜ô&Ua*qUm*q՜1UUs&WWUUs&W01{*UlGQVłME#7~TlƏƏj?b? QmGlG!c9%9@Z?byUUNDq 6aym-16;F=W:U k5s^[5o\S۸m\3E nqMmql VV&u1\suu!cuuNq۸N6d n:q]m:qlcᳶjױdcbzu01n7j7dC܀P۸m 2qڸq۸A6d  M7ŞMg~Sm&qln܄uMl&ِ1xq76nb7Ɇsڸq۸E6n4mH7n~-lِ1[-[-!cpC8mR۸e}a0-ck2v2v2eد,c,c[i{l{b{j{f{n{a{i{e2eeeeee0}}D#Lmx&568ÅhZw׸Td ݆mukmq2nw[]n(eM;o;jw;dC{1w^;!cpw;jw;dC}hl./oVw]͍~]l.ِ1^Lkg U۸m%2Fz rl6Am6 ׍]Od#%7MD ֍6~6~"2?OOdC0u3ÆyX5U ȆOOj?aؕ-NT:lbgd326aȆ9v~s=lِ1Lrpw9U {=!c5=h=l>٠s&}sW۸m'2_o߇jdC6C6cɆ}h}lgqˊ7M{1d_Ymglg!c=ܟj?c? vpؠO33ِ1x3vC^8 g~sEba.l/_~;0O? qy8Gk/o.]߭_\~{EzW8Wz+}W_q= q@"~U׃_I__6~6 ݖ~e x lِ1{`xx@6d 3Wqp8荚x@6d ujd#mޗs3pxxH6d G<}CC!c16hdUT16bɆ{̇CodEMĻgw~S lnoja )pJT16~6~#2S~6~S xD6K3>3g3!cpϠgjϰdcM Pb am<6 xmFm l}{7jo7dCpxxK6ֿn؄o[Vm-lnu[l-ِ1xx [[!cxxG6N;v灎4nSxm#2a;ᵨӞRxm#2xxG6d <Nmlm|6> S>@6>m~cX'1˘e,e,e,e,e,e,e,e,e,e,e,e,e,e,e22222V2V2V2V2V2V4՘㐗ßO 6g>rCܴM!2OŃ9[?r3Ox:o<[bi'R]<#?g>rC#7m(=>jYx)=X}?}#=nXc#=nX-c#jciF"y:561i4ji4dC4FQHm!2yjFm# lFh#Fl1ƴcMOOO6>6>!2 ''dC6>6>Ql|hOdcW /jobuӺi6biɆJiZ)FZl#-ِ1FZFZ!c=FZ؆ ٸN{.n|o ͺm`.dC6\  lÅlpچ B6d mm`d.01\o&sUp6\ɆW8mbdCu W WlÕlnBjF:hzM21҉֍tj鰍tdC6A6aȆm6ҩm6ґ HmSHm'An:Hӻ}j鱍dC6C6cɆm6ҫm6ғ )額j鱍 d#Rj#Ƞ@6d odPȀmd 2Ƞ@6d g41 jd'fbdk،p Qm##l{ьjdC62B62bɆFFh#FFl#X+[# Ȥ D6d n#Im#l| S2md62 mdRȄmd&G3jY#ȬL6d }G?Ffl#3ِ1%*Ffl#3ِ1hfh#Ffl# Y7L,Fh#Fl# ِ1x/Y6`YȆ//ʢB6d n# Em# lC#?[ ˪J6d g%8FVl#+ِ1FVFV!c9%+Um#+lxs+#`Ȧ F6d odF6lF6!c^4Emd6 mdSȆmd'zEFvFv!c5lvͮN6d ^7ú]m#;l|+;]m#;lЗVs9ľh/Cm#lnu#Fl#ِ1FF!c~#Cm#lL߻xQ#sN1gdr {NFN!c39Йܜj9dCk؜p Sm#'l|N mTȉm"?ZebF.oRȅm"2_\j\dCu#6raȆ\F.\Fnqqr&FnbuM6#uϭM6d {_}Vȍm&2ȭM6d >6rm6ƋkGgb)nyچF6d ^7`pSp6Ȇ)np⦶m )nІچl(#7~#Fl#ِ1}qCGm#l|_4ͣC6d N`h#Fl#/٨NZ51򊺑֍jydCu#/y6byɆF^X7m6 )yjy|d?jbsgr36aȆa)n#=bhm6 mSȇm#2EA6m8wI*$凫j"w$5"A~st3Iϯw\<#?g{_}zP%%wk}DGP/c"3 zP|ߢܷ(Q׃$B=fhFl 3# # >FAl ِ1~gAYPm Ql|(EAFA!c> QPm Qlޗu~%&F!羅ȆGm=<<BjBdC}D!GR(m"2Q(Q(D6d G6 m6 >,Mb0( m6 Bu06 cMo!b90S m6 .Cu0QXm0Ql/&F1sJ"F!c}"pߢFlِ1~gYDmQl(mQ(m%!?}(*l6m6 ?{/ U(m%2Q(Q(J6d n(QTm݆///o8Q}▱RҖ2r1w˘e2e󶌕UX*Z*Y*[|-cU,cU-c,c-c5,c5-c~1Xee,0՘S1q^KZTLF`oTL]Wjaz8g rbhk\1\Q1x+k\1u+k\1q2q`+qWl{aO&Fqa8Q\m8Ql|߾8ܓ+Q(N6d 7}sqFq!c8Q\m8Qlu6cJިF lِ17xc16lP(m 2%`(Q(A6d ^7J@%6J`%u={gb%%T(m$2%a(Q(I6d SŔT(m$2ߋ) mT(m"*.-7`(Q (E6d S ŔR(m"2Q (Q (E6d ^7JA6JaFVK61Jo*Q(M6d n4QZm4Ql|N) jdC6JC6JceȆO؊JeD/Ze6`eȆaSUM_&U 2F!cQ֍2je2dC6@e6`eZo%ea(Q(K6d ^7ºQVm,QlFYhFYl,ِ1:,QVm,Ql0&F9Q7QNmQl-{rj對rdC6A6aȆ{rF9r؆;٘5av.lCj؆;ِ1 wh]mp'2mmcdC6ܡ w wlÃlls|P!)p⡶mx P6<Ȇmx@j؆ِ1xmxmx`drΧgڙnxº᩶mx ?=6< O!cu'\xmxbdC6< O OlËlz^†᥶mx  /X76 /!cBrCꥶmx )^ІچM6 VQu-o8xmxcdCoNV6Ɇ7j؆7ِ1x66doә'Şyyg^^mdC6|  lÇl|NsچC6d ^7|  l"XL]QQV6*bɆmT6*mT6* ۨmTTۨmT$2QڨQnqȫl] ETRda.{窤vP\<l]%QTRJo.]Ĩ.lT6mT6 aQ]m:Ql|NjձdCu:Q]m:Qll/QC)5RCmQlZkg 9S.U F !cp5j5dCj@56j`5ƙv~ib6jB56jb5ɆքWkm6j ۨ mTۨm$2lTۨm'SsS6 ?!c9)~j~؆ِ1 ?hOm#27 ? ?lßl4-E1U|_m'2mmcdC6  lßl܆?᯶m U651Du#@m# 2mm`dC6l#l66Zdµ$3ZI-ZF-!cpZjZdC6jA6jaȆ)Zj@.&FnmbdC6@@l#l|<mbdCsJ h>>0o7;,նձXZY[B-c ,c -c,caƖpXe,222ekf5XZZb-c,c-cqxX0AT9%@)Hz;H]p 'cv\ok\qATd 8>3R׸ \エqAx &dN96``l#lF0m F7 V6Ɇ`h#Xm#ۨM6;~bQ[FaoT[m6QlOm짶Fml6ِ1OmFm!c6Q[m6QlOq|Ĩ#TuFlِ1:F:F!c9Sm6 )u:juzC6!nm O'Q6BȆ8m`!dC6Bl.y&F][Uۨm%2QڨQۨK6d ^7ºQWm.QlF]hF]l٠HĨ'zzQۨG6d >ԃsJ=zF=!cpzjzdCh=hF=l>xQ_)R_m>QlnԇuF}l>ِ1F}F}!c^>Q_m>J6{9#iüJ6l?Pm ׍PX7B6BP!cuJ(\mbdCu#U6cvLt}lb4sJ84Phm4 2 `hh@6d n@mрln46m46wlM,MCxFCl!ِ1xhFCFC!c9!Sm46  j 69֕2œkE#Fviγuh#FvgUj#od9[F{׃0^)Nœs#{-|Y4L}p=/cV7Z00\ȁAajammaɆGx21GchhL6d G4}DcFc!c>1#m46 jp}D#+κaÆ ׃îCmjF8ِ1\2(lؖAjF8ِ1~g8I6±p!cpFF8A6fXum-#B<'I"6"!cFFA6d n#ڈPۈ6"ȆmD@jF$՟+621"fG͎Tۈ6"ɆG³jF$ِ1Hh#Rm#ۈ$2lDmDbMEOGcb4MJFl ِ1xhF&F!c~ 7m46 M@M6`MƋ?Nxbb4u)M6bMɆ_)}jMdCu)M6bMɆ;BM6bQd#oh|M(|5 >_Rۈ6ȆFQjQFِ1(h#Jm# ۈ"2S((l٨ÑMf5蛑 DLmьl.l۵ٰm6Shm4#2 h hF6d >46m46Fl[[MhoD~#Zm#ۈ&2ѰnDmDcdC6hhl#lF4m4'nA1E݈u#^m#ۈ'2mīmcdC6⡍xxl#l|mīmc dc"\Ú@6l}F@6d NIl#lFm$ ׍h#Am#n00}Dw<,cɖ6X;X{XXGX'XgXXWX7XwXXOX/XoXX_X?XاA!a$R~X!D1%/Q]qK'ck\%H5N5.ָDuK5.jۉ%k\"Y01$h#Im# H"2`om$ *Im# H"2$$l#lds$W31Ś*6d!cdm$ H66d!cwMddl XlFԍ6nQhm!2TxFl ِ1)m6`mȆTm6jm6:֕ 2œk E[vi[mck +C[ok8m-)tԛ5KsE )껟A })AA )@ փ\RHh#Em#hG6f\СDxg|gF;lِ1x6aȆm6کm6ڑ vjdc{xMnuF{l=ِ1\X;ӞlڙjdCWhm'2h@6t6:mt6:y ׮71:֍jdC0616hT16:cɆ3=jdC6:C6:c]Fv]DF.F!c֍.j].dCu ]6`]Ȇװ].j]dcw]wzw^G7:!zIBB0zowwY˽Ysksξd nc1Dmc1lhclc(8pq1T>>Tmc(1lP|uPlc(ِ1PP!c9e(1Tmc(1lB&0ы0a0!c9eSm 6 6aȆװàajð WKM Wm+Ump%2nmbdCu W WlÕlnBjpQpmnE16cɆ1N6d ppp!cpájñd㗥\LNfCrp;SƮnrCrlcِ12)#6F`#ȆX7Fm6F #j# 710pt<&nnmandCsS6ܰ 7!c~ njn؆ِ17hMm I6tthbt} ɑdvHH!c1֍j#dCuc$#6Fb#Ɇ甑H(~y1JSFu(Q(!c1 ֍QjQdCGg6FaȆQ(Qhqば1ii&-)dVm&211M6d nc41Zmc41lL dchlc x1Fc`1Fmc 1l|N1jc1dCs8Qm!2 1Fmc 1lñ gbggUm%211K6d  װc6bcɆBc6bF?'q1G6d >s8q8!c1֍qj㰍qdCq8qxӞMbNj㱍dCuc<6cɆm6ƫm6Ɠ ׍x1&y^.Ř X7&mL6& ۘmLPۘmL 21ژ1ۘ@6d NmLPۘ`8f󛤼57Ij"MD8LT;hw`.]󛤉pwkO}sdDx'D\&=Q uU$Q&?I}'z0MYȁmʚv0 ׃I@`"&z0DL6&mL6&1'dbLsMsMVۘmL&2+&ùbdlc2ِ1dd!cdvs_Ĺ/ד^08XjsMMyX<-c^1o,l˘e262ggͷ--XY[-cK,cAes_PZ'{_)b)7׸)Td 3uup8#)7׸)Td ^7E]7jS`qS7l<3[&TTTT!co*mL6 ? jSdCThcTlÝl~T&nmcdCȸod6ܱ w!cpІچ;N6d Cj4yӄi4i4!c1 ֍ijӰidC4i4!c9e1Mmc1lxݼwĘ.pN1ۘN6d ^7ú1]mc:1lߘjӱdCuc:1]mc:A6V%odC X7<6< !c놇چA6d nP6<Ȇmx@j؆'uюsS†'᩶mx  OX7<6< O!cpІچ'I6d ދzBj؆xTl&S⥶mx ? {^j^؆ِ1 /hKm "2^Іچ1l$Y5H!c3`ݘ1ۘA6d S78c8l,Jzqbhm6f ۘmPۘm 2<ژ1ۘI6Ę)LX7fm6f 3a1Smc&1l| ;agm6f ׍L؆7hvگ:&qixOq᭶mx G ϣV6Ɇ7j؆7ِ1V6faĘ%,X7fm6f ׍YnRۘm"2y|y,lcِ1xݘmRۘm&~&(1[a1[mc61llhcllc6ِ1xݘ ll!culhcllc4{&Q71Gmc1lhclcِ1x1s6`sȆmQۘmVǘ>n᣶m 6|6| !c놏چC6d ^7|  l×l ab 놯چ/K6d ދ^Wm%27|a᫶m 6|6|d#S CsEݘ \\!c1֍jsdC6Bs6bsɆ)sjs ?Qiv/71DuOm#2~j~؆ِ1? ?lÏl܆᧶m#kWx9ĘFؘG6p1Omc1l1lߘjdCkp ;_mc>1lṅ6m6OU-zX XX@6d ^7@mclhclcِ1hc G^ i^0-$%E,0On!tP`݁xbvjoYc/}sd|[{׃z k6 P\|sEA@P D@j"7ILE>¼HVEjEdC6A6aȆm,6m,6 Ejda`c#>bblc1ِ1x6cɆm,6m,6 ׍bF &F80Am kϵ T6ɆצT6Ɇ5L d#Pm#XB6fr|bb,K%!c9e Sm,6 ׍%n,QXm,!2o Dmc D6"~?i #Y7̾EHoMKdR6Ȇ 8maAdC$o6 !c9%R6ߺ65q5cZ m,6 Tmc)lRhcRlc)ِ1xX m,UXm,#ϟ쭔ٓ4KȚX XF6d ^7Lmcl|NYej˰edCucLmclW>z{cnwn> J&^XN6dle9ٰm,WXm,'2E^trlc9ِ1rva.a'822b YVYV[-ck,ck-cH:zXe,2222cbmmmL5WSqS+DwqS1 `u 5.jg:k\08׸`X5.+F녹|F+h+h+6V`+Ȇa]16ƞ,RZ+dC6V@+6V`+Ȇm6Vm6V 7K61V +j+dCt+>JJ!cy%Wm6V X! 7peb!FFB6d 3tuHoZZ!Fِ1h#Dm#!2(Q6BVǯ.21BųP'Tm#%2 {jF(ِ1Ph#Tm#%2. mmbadwanm a*Lm# #2mmaadCtaFFl|2׍&***U*!cu*NY XE6d RXm"2Ujdgkbuc56VcɆMmɆmj[XM6d NY )6VcɆjF8٨>Cx&FnmcdCF876±p!c9%)jF8ِ1ph#\m#XC6D+&5!cpk5jk5dCk5!cpk5jkdc:=01֊uZNYXK6d oZZ!c֍jkdC6Bk6bd#$϶^oLa#ڈPۈ6"ȆFjFِ1x݈u#Bm#ۈ 26"6"Hq0;)F7"amD ׍HX7"6"H!c FF$I6d n#ڈTۈ6֑5BoNebuc6aȆ:X7֩m6֑ XmSXm#2XXO6jbuc=6cɆzX7֫m6֓ XmWXm'27C6m8>.MS+̷u`ؠ.\<ۺ  vū:`_I8|Qt?NP6myC/Jԃ(Xw? ׃(2?( vA91x=""p="2QFFM6V-lDCjF4ِ1\ kDF4M6d n#ڈVۈ6ɆmDCjFK&FcnFF!cpjdC66B66bɆl66ml66 $ll66ml66 ?6&M&!cpMjMdCucImcl}ä&f m3|Ymc3l jdC66C66cɆml66ml6bȆ&F7b`mĐ )1pNQۈ6bȆm@1j1F ِ1E ml!k3"ݢB6d >ls-!cp[-j[-dC6@[6`d*N~üK6l/nǪmbdCu#֍XXl#lF,mĒ )FF,l2cE^tVlc+ِ1g+ٰ=[6b[Ɇml6ml6  mlU؊ml#c鷥Lm^ԼlT;.:|s6lcِ1x/ 6aȆml6ml6 aA6aF蠕yEvv!cooml6 ?{oW؎ml'27C6c;΄|L✇j;dCuc;6v`;ȆX7vm6v mP؁m$7<:51v֍j;dC22T؉m$2Gx'|GxNlc'ِ1;j;]d[/oG21v8qVƮx?yV.].!c ֍]j]dCs.8R؅m"2]jd#W~~Lb_t7ݭM6d c3F=z.nlc7ِ1x nn!cunhcnlc٠?{==!c=pclcِ1x{6`{Ȇ){=j{60{>^9,c-c,c-c,c-cG,cZƎZƎYƎ[~n;e;m;c;k;g;o`hdlbjfnai9f/ոtN.W< U׸'c3َwܫq{qK5N^8U׸'ch/q{5n/ Ͽ{;M}bMm6 Omcl>hc>lcِ1xoاO6V?lP[.cx.>ܯO6d c3F؏m'2h~lc?ِ1~qtYJs!cm6 8mP8m 2@6`a[8(攃pN9q8H6d a#C3.Al ِ1r)6bɆA!{ˆ&!ы!C!!cwMwMm6 ׍CnR8m"2?sqHmql˕͠v&asV8m&2S:c8lAV8m&2q8q8L6d >6m6􎭉qD)GrDmqllِ1##!c9qDm݆#_ɿU-Ws] 2~U;\<w~Ow~U_w\<? {+G;>Q6= צGw(G8 jGq=8Jd c=Q%2GjGcdcsǿ]61 6aȆςm6 ? >1c1!cA6a 01q֍jDZdCu86cɆS5L {+w16cɆm6m6~#F Jfb&lmِ1ߠ6~6~#2oodCAmm KUlqB)'rBmql h lِ1\P8m 27N@'6N`'Fe{LIhIl$ِ1^I~Rm$qlFug rD$.Il$ِ1x8 mT8mN6gL~pw߱Ɇ-~mmN6d >6~6~'2Cmm"o9qJw6NaȆOm6N )rJmql)h)l4X^&iQ7NúqZm4qlihil4ِ1ii!cpj3dc߱?mymbq0(ΐ ۏQ8m!2E^l ِ1uFm qlhl,ٸ!c8)Y= װg6bgɆYX7Ϊm6Β 8 mU8m%2EBg6bF >Kibs杝sd9s9!cq֍sj簍sdC9؋S8m#2q8q8O6$q^a5yy!c5y=q8O6d oyy!cg硍j籍 d~141.8"xѷ|lِ1xݸ !cp j dCuqAmql{6F9X\딋jdC.gm6.bɆm\6.m\6. jKd;GjF7ӸD6^'wmkY7.m\6. )rImql%h%lِ1r ڸq ۸L6"]6qYԍ˰n\V۸m\&22el2ِ1ee!cpj+dNbb\q07 ٰݔ+jW+dCu W6`WȆm\6m\6 W+jWd71q֍jWdC2^]U۸m\%2qڸq۸J6d o\6m\64*muqMw"srۖ;{Gǖ'g疱?-c,c-co,cYZY[>X>Z>Y>[ƾXƾZƾY·E5.`nq#_[-58ͷ`|K]nwj ނok-\nQ1w ָ[w^y`M3ojE'5ݺ?`v*o3'c76+ >dςogw6܆m\n6cɆ}h}lpQoD{(Q7@mlhlِ1xx!cxxH6B:~x(xxH6d n!Pm!lChCl!ِ1x/xxD6],HCCHml|Sm<6 )Hml#h#l1xqXԍǰnVxm<&27C6cOFlzW118{QS7Q)[/Sxm<#2SA6avCLn0x#l6ިm6ސ ԍ؏zxC6d n Fm l| Fm 0_q9/8ِ1_p/Ȇmmِ166ޒqG Uwx+[X7ުm6ޒ )]16l?IVm-l|-zxK6d n-Vm-l,im|6> m|P`8#5 MGa{|Q-]x.7Ijw8՝$}_dTo.]o>{Q}?zy#۷I}='c~RO|/c>#>|91x='O|"2Ojd#H׬)Mghgl3ِ1gg!cpjdC6>C6>c_̹/mK^Em|Qm|1羈/j_/m|Qm|1羈|J6运*_Wl+ِ1WW!cp_j_dC6B_6b̙@w–ib|opMm͜ $bǿǿm|63D |Mm͜ $b8j7ovs_Nzg8sĵųŷ%%%%%%%%`Ko`seeeeeeeh8gm6 Nq\72q\72{ʿN!VqI?1x{qI?1[k\dԸ{M T1lyUĈ翸.hۈK6d uAQ\F\!c( m6 FqjqxdóC˚ 烶xd-Fِ1F|F|!cpjdC6C6c Ff218y=ٰ~@m#l;.;j dCςg 6` Ȇm$6m$6msti`b$t{1 ]^LBFB!cp j dCu#! 6b ɆFBF"q;f&F":|[lx~$sJRFR!cpIjIdd#k䬫Ld5l=ni#F2l#ِ1xHF2dF2!c߃H>J HF6d ~X2h#F2l#9^Fr\m#9lߟJHN6d >$sJrFr!c~#9\m#9lۑ&F ыh F !c֍j)dCόSg)6R`)ȆF FJQLH j)dC6RB)6Rb)ɆFJX7Rm6R H mTHm"- I7H%l6Rm6R }{_6RaȆF*X7Rm6R 6Rm6RmZib6RC6RcɆalttp8SƮn}Ck#5lFjh#Fjl#5ِ1FjFAOiFFm# l4.4ji4dCsJ8QHm!2E@i6`iɆ#v,41Ҋ֍jidC6Bi6biɆm6Ҫm6Ғ ׍FZF:ƽeå&F:a#Nm#lM{tj鰍tdCsJ:8SHm#2+Nm#݆#\}i"Fl#ِ1 F F!c>"Am#B6/N51\?\6\ !c놋چ B6d >'qQp6\Ȇ@.j.FF`vg)wEv62bɆ{̨̌H6d ^72ºQm##lFFF&;.# Ȥ D6d ^72Im#lF&h#F&l#ِ1 Ȥ L6f]s&Ffa#3Ym#3lndu#Ffl#3ِ1{{62cɆmd62md6̷;d=mbdWY6`YȆmd6md6 [d+,jY,dC6@Y6`YF5?{*ld6md6 )YᜒUm#+l|N 甬jYdCkجFVF6Q7LlbNljٰldCW6aȆmd6md6 ׍lF6lFvѤZŻ~~6cɆFvX7md6 a]m#;lFvh#FvlGkϞ?׏j?b? ԍՎVZ?b? ?~GɆm#l =8# .rm6r 9`/Cm#lnu#Fl#ِ1Wh#F 0NqّrG.XnXX^X>X~XXAX!XaXXQX1XqX XIX)XiXXYX9XyXXEX%XeXXUX5XuX 09Mm`SN1_Nuˉk\Nq2yQl?ɚS]rjk\NXrk\N\rR1*'q95.'r _ǯ|31rorsorsm6r Km#l7{\j\dC6rA6raFp&G1rp/&Fnl#7ِ1uu6rcɆm6rm6r rC6rcyFlLabq sS MɣC6d y\oQȃm!2f>3ΣC6d Yh#Fl#/p(P#7~#F^l#/ِ1>]^OWm#/l|./ܧ˫K6d ^7By6bƙlb6A6aȆ|ȧG6d n#Om#lmSȇm'w' 41 jdC6C6cɆm6m6 ׍F~F˹1ijOF!c9S m6 a 5lF!cQ(Q(H6-5QPXXPm QlOA짠FAl ِ1ytyt6 bɆm6 m6 =NP($ְF!lِ1BF!BF!!cpBjBdC~ A6 aF CU61 90S m6 ( mV(m&2( 7 m6 ( mV(m!]O-S9Flِ1"F"F!c^Em6 (mQ(bȫۺ"5m]Q(ZDQs]oBE'f(5~Q7O.uE=/Eq=(FCxUzD=(~1/A12_kbjp=(Fd ^zPL-H(mS(m'8(.Ⰿ(Q(N6d n8Q\m8Ql|mZMm6 ?C6c%Ƹw61J=pOF lِ1F F !cp%j%dCppcb %6J`%Ƭ/}ab6JB%6Jb%Ɇ{̒(Q(I6d >sJIFI!c$QRm$Ql5QJ`QJmQlnuF)lِ1ڴ\R(m"2SJA6JaɆ8CMҢ( jdC{^xiFi!c94SJm6J ( mV(m!Z-3(#2pN)Q(C6d ~CxC2F!c9 Sʨm6ʐ (mQ(m%'3uQVN`Y;e6beɆm6ʪm6ʒ )eRVm,Ql- mU(m#7o%_nbF9oS(m#2FB6#F9lِ1R)6aȆF9hF9l_Qۨ@6d"F"CkQl|N j dCT6*mT6*dü+?xQۨH6d ~qExqEFE!cw+w+mT6* ۨmTTۨmT"y+Ĩ$ְF%lِ1xݨF%JF%!cuJ%NQ ۨD6d nQImQl9]|HQ9Qld~\~h&oTVۨmT&27*~Fel2ِ1FeFe!c3*C6*cUFY|ZcbTu U6`UȆIIQۨB6d n QEm Ql|ϼ QEm QliQ&FUޗUɆc;osY7mT6 ׍nTUۨmT%2QڨQۨJ6d mTUۨmT#}|+`ݨQ ۨF6d otqp'_ςڨmT#2_TjjհjdCF5hF5l:u+(m.nRl>LQۨN6d ^7úQ]m:QlnTuFul:ِ1FuhFulZX&F QoPۨm 2εεF lِ1F F !c~QCm|t"SrG-XmXX]OzFƖ&f斱V֖6vNΖ.-c,Ԥi_7 {W׸Td >Մ_Muk\Mq2q5aq5qI5N}sMXjk\M<"ix|F-lِ1;j;j6jaȆZoQ ۨE6d nQKmQllEaݨQۨM6d RmRmFm!cpjdC6jC6jcuƱab6@u6`uȆmԁ6m6 ۨmQۨm!2_SՁ6m6꒍ގwlM]]judC!Յ!Uۨm%2פ.|פF]l.ِ1^L]hF] G^?9+Z mOZ]xv ?dw`.]ۺ`dݺ=I}ϙF\LЫ'A=X~=\ݗ1\S;A=r cG=(ZD=\ԃ6m6 Ǐ71>> 6cɆQۨO6d >WԇsE}F}!c>Q_m>рlaLbmMm46 ׍n4Phm4 2hh@6d c66m46CBLb4sJC84Thm4$2hhH6d jCjCFC!ciChFCl٨Q SĜ)6aȆm46m46 `HmшlFF#FFcтahhL6d Im46 [46cɆ{FcF"}2MDM6`MȆFX7m46 ׍&n4Qhm4!2E@M6`MporMyMyM6bMɆ)M:FSl)ِ1FSFS!c^)Tm)ьlLkp&F3o4F3fF3!cwHwHm46 )Lmьlmm4Shm4'KUh.FsX7m46 )\m9ќlFshFsl9ِ1FsF zsw2&F Q7ZBmтl E Mn F !c9SZm6Z -j-d#f#*-Ż--6Zb-ɆFKX7Zm6Z h mThm$2E[B-6Zbe41Z5l+m hE6d ^7ZJmъlF+hF+lِ1xhmRhm&˾S}..[m6Z o6ZcɆ[=jdCFkhFkl xh#6hhC6d m]m]6F!cpm6jm6dCsJhFl-xmL;;jmdCmF[F[!c9-Sڪm6ڒ ׍F[F;;GLvnuF;lِ1L/ahk"hG6d nNmюln6کm6ړ,ӭzŞy{g^m=ўl]]jdC6C6cɆm6ګm6:"K ):Flِ1wKAmсlFhFlِ1蠶H6l>'`Q)Qm#ёl|#訶H6d n#Qm#ёlnt6:mt6:&7$F'X7:mt6: mtRmt"2 褶 D6d 褶 L6>ux謶L6d N )6:cɆװFgl3ِ1x mtVmt!C;p&F1tsJ.F!c֍.j].dCu ]6`]Ȇ.F.FW1Sa'g]:+\tUmt%2 Emt6 ? vUmt%2?s+Um݆㘟$ɿIV"~0OkMϰFv݁xbo~g~œyqtVq=F覶nqKwNzg8n9eeeeeeX?X@ `P0˘elele2626262626262626262626rKwq-2~;ẫk\w\S1x?u5;qݩu5u5;8׸uW׸xA6gtC=`?CmуlFhFlِ1FF!c mPm$go8~)l6zm6z F=aoSm'ѓl|v=6zb=ɆJ=j=^dNؒ9L^o^j^dCu6zaȆz^j^dC6zA6zaƛA&bbu76zcɆm6zm6z ׍ްnVm&2Kg ~3!chm6e?Labu}6`}Ȇm6m6 mQm!2acf:_͸[Cm%.??z+)}:F_l/ِ1l_7Wm/їl {Ѿj}dCu/}6b=W?fb"/n ِ1__6~6~!27~/j` Eml٨0V{L~~G6pOmяl|N~j~dCsJ?8Sm#2觶O6Й&FыhF!c֍jdC6C6cɆ|쌁)6cFnj018Ba{xlcِ1!cpjdCp~l Pm $nz51~c 7m 6 _4_4Pmc 1l@hc@lc ِ1@hc@lcV19 ӎ_w9Hmc1lAjAdCg g Rm "2SA6aBڟ&````!c9e0Sm 6 ׍n Vm &2SC6cCFP+7187L1l? iclcِ1!!!c1֍!jC!dCuc1Dmc1le&P5} Um %2FB}?Tmc(1l|k(1J6d c3Æ)m #9Äa0a0!c1 ֍ajðadC{_0a0!c-16zfMtm3ܸp6\ W WlÕl\WMچ+J6d o~Ump%2Fr@p%چ+1lW\Lphcplc8ِ1xpp!c-16~/0ZñdC06~vpذ4\mc81ltql™#!c1֍j#dC0u3Fٿ1A6d nc1Bmcf/wMp66ܰ 7Er}manlLQp6W"7`ᦶm$v#HH!c$d3HaaGm6F  mTm$2a<|Ckc$1l4f\XQc3Gm6F `1Jmc1lfN錑߿ɿ1 E6d (1Jmc݆#o֍bZhs]|JWuAZu֍oڻ?~œ{q?ɝG|` =[#1Q1/cz0փ1jcp=Cd 3Wqp0|C+b cHmQm%m6ibsX8WUm%2#a{uhXlc,ِ1XX!coBc6bF^gb6A6aȆWǩm6Ƒ u16jsZ㰍qdC6A6aƨ? hjb6C6cɆ..1O6d nc<1^mc<1lxhcxlcr|]kcٻ ;l^1ۘ@6d ^7&1Amc1lF+g ~pbhmL6&  jdcu/N&D}"|>Qmc"1l{щjdC 9{8c8l4w5+] D!c1ژ1ۘD6Ę$):e$lcِ1I$I$!c[=16?ſ1 ۘD6d nc1Imc1llC/&d=]LVۘmL&2t2|tdlc2ِ1:3Æz.dlc2ِ1j6\|ۉ0v1rT˘elele2iͰʹy[fYf[X|,c1?<˘elelele,222h[b ---3jܱ1ododk\P1xkukq2ո-15nmK] mkq2?d qS5n & fbLu#d#C3GS6bSɆTSjTlc*ِ1#D]1ۘJ6d ThcTlÝl<[)O&xm ovWp6ɆYuךּmcdC};᮶mL#_\8ĘF6yCD]*Y7mL6 ׍inLSۘmL#2QaüHZӰidC6A6aFabL{tt!cpӡjӱdCNNWۘmL'21ژ1 >&mxmx`dCsS<6< !c놇چA6d nP6dC>pGm!2mm`dN†/᫶m  _X7|6| _!c 놯چ/K6d n/᫶kkۺ5usL2W-b]x.^gus?Zs՜ͅaϵ}sdq&w^{>?yp}~}S;|""p=#2~Іچ1l|(u}&Sm6 ۘmWۘm, E;.cXX@6d nc@mclhclcِ1~hclc!٨_&Bac!Pmc!l]{хj dC6B 6b ɆBhcBl#l40)Fmm`dCu#֍l#l hF@6d n#P6X$ZZXD6d ncHmcl9"d"lcِ1E"Eb1$$΄LbSm,6 Subb!cpjdC{ዡj@1yN7L&FnmbdC6@@l#l|N sJF H6d o,51@@lc ٘[jt\9L% % %jK%dCs8,QXm,!2E^tlc ِ1X"+;L ы^4Hm#"2mmaAdCu#֍ l#l|N 66d#zeUKEK6bKɆ^ ^XJ6d nc)Tmc)ln,6m,6 &2qv2xv2e2!c ֍ej˰edC2؋.SXm,#2ˠej˰dlӞi:T21֍j˱dCuc96cɆXXN6d ^7C6mχD=&r JXe,2f[e[m EX"-c,c-c,cQhF&fXele,22222222r>L0ոWu ~'7X]q 'cv0\ok\0qTd ^a V׸`\ォ| 5.X]luLbWm6V ]16,]  !cp+j+dC hc lc%H2rܦ&J svJa;Jlc%ِ1xX JJ!cy%Wm6V ׍JF٠Z!b/&ńm`!dCHȈ߈Q6BȆF!j!Fِ1x6B6BPQTlLPqf(W6֪m6"F<>{ݳYFA6d />Pۈ6"ȆmD@jFِ1\mDmD`dc]>&F1#amD ׍HX7"6"H!c>"jF$ِ1#ڈTۈ6֑%δX'X;uj밍udCupNmclFmg~,w16aȆ:hc:lc=];aKLnuczlc=ِ1c=\WXm'2S9ezlc=ِ1xX@6nNTfAOOAmclhclcِ1:٠@6d ncAmcE6^zm/ĈsJS6(!c9% )QjQFِ1(h#Jm# ۈ"2mDmDafߢ7b )jF1x/ {hhl#ehF4mv5D ~m4ml$8|-(FX76ml66 a75FF!c֍jdC6B66bFm)c ؤ D6d >ls&M&!cpMjMdCM&MfQv E/66cɆml66ml66 S6uff!c~c3Ymc3C6wcb1FF C6d n#ڈQۈ6bȆF 1j1F ِ1mĨm`[Ȇ0N[Emc l| aml6 ׍-nlQ؂ml!2آۈ%}₉+lBjF,ِ1Xh#Vm#ۈ%2nĪmbdC6bXXlc+{yMbN 甭jCsV8lU؊ml%2ë5C@Z[Pܥw--N!@&!4 K`3봝7f>o}1lِ1c1c؆٘x&)np⦶m o 7 7lÍloᦶm ϢnІچqljxq\)r\m8qlo}ql8ِ1x8qq!caC6cd㯙^h.EṨچ;N6d >oy]mp'2omcdC}pWp6NMob}'6N`'ȆEOsj'dC6N@'6N`'Ȇm6Nm6N L01Nqj'dCI8oT8m$2Q#?1R|Ck$ql|M9 mT8m"7w&&;O1NYEOm6N #9.")S)!cy7Nm6N SNA6NadiiӘh چA6d >zYCm 2~롶mx 6<6<6oa<-8mZj,KR|,g[jZd[j,˖ZvRj]B-0KvRiݲn[jw,72|]FSpT8O<w jdCi8V8m&2OC6Nm8:cQLy5gS3jg"̇'ƒ;?.~?֝;3~͇fug5?gp?8K׼Lm2Ί}Y>gq?8KW_Y8U;8Yr c3PY%2gjgsd#}`g8q8G6d VtvH^Z簍sdC6A6aȆs9syzʙŻ=w{W8m'2#9yl<ِ1q6cɆ硍j籍 d+\P۸m\ 2?/m\6. ۸m\P۸m\ 2gqAmE6]l|MK66 /!cy ^j^؆ِ1<R6Ȇ᥶mxis-ymxcdCk7\S6 o!c چ7M6d >zCj؆X˪f&E},ꣶm 6|6| !cچC6d 7|  l"z׭MbMהjdCkE\T۸m\$2.".El"ِ1E؆/82}|v& mmbdC6| _ _l×l| j؆/ِ1, mmb~dëi9~bMkچG6d ~Om#2mma~dC᧶mkbk61,gQ lßloþ᯶m 66 !c/h_m 8kJ\S6!cY4΢jFِ1l#l|66@vSo¾m @76@!c=l mbdC}#T6Fkb AFFD6d n#R6Ȇה maAdC6 l#l,}`)&FXSm 66`!cpFF0L6d ~`h#Xm#۸D6ǭtqIظm\R۸m\"2>>%lِ1K%K%!cyqImqlT;jE&ea2qYm2qlo\}el2ِ1q6.cɆm\6.m\6Bj"8om`!dC6Bl#lom o@!j!ѹK&a qEm ql|{am\6 ۸m\Q۸m\!2E@W6`WL|}l>ِ1}Ĉٓ]{J=Pxm< 2`xx@6d ~6`Ȇald41jdcSx(C7m<6 o%Rm#ۈ$2 mDmDbdCtFF$lxHo<6aȆ#7m<6 )Hml|xۈ"{Cj%lDAQjQFِ1FmDaQdC}# ((l#lFm<& iMbMy הjdC}16cɆm<6m<6 >6m<6W"71'jO'dC0g_16ȵ{bhm<6 >O6`OȆald41'jOd#Y8z Ͼm<6 >O6bOɆm<6m<6 ϢOjOgd+} &3g{m<6 )Lml|MyהgjϰgdC3h3l9Hr"\\m9lshsl9ِ1ss!cxۈ&W}#i+iD9m/׭ӈVۈ6ɆOEmDcdCkJ4\S6h!cY4ڈVۈ6bF&C8#F7b6b!cFF C6d 7b`߈Qۈ6bȆm@1j1 Q>cj'[/FDkddE  !cYE_m6^ xmPxm 27^@/6^`d~h_+)pmĒ X7b6bX!cpFF,K6d >oBjKf?B/sl4h@qyRm%lKhKl%ِ1KK!c_B/6^m8z/l+xJ-]d~_Sgr燣+.ÿu>[ NWO><^kJ}_~/%y5{-fp|q?xMW_5^~Zk^j81ՍkSq,<v88l#l8xxFG6d n#ڈSۈ6ȆqFFO6VX~/fx8cƫmcdCpWۈ6ɆmCjF<ِ1#ڈWۈ6ސ]S[6^?x#7ިm6ސ )oFm lhl ِ177[qq$gol ުm6ޒ )oVm-l[h[l-ِ1~ojowd7cMwb}gwjﰍwdCH;ak_6aȆm6ީm6ޑ wjﰍd_COe&{k{{!c5=\Sޫm6ޓ xmWxm'2x@6mV"dAo|Pm| 2|lِ1!cyAm@6>m F j Fِ1xH}#Am#H 2m$m$` dC6l#HW&G7>¾Qm#lGhGl#ِ16>bɆm|6>m|6><$7>OjOdC'O'!c OjOdC6>A6>m8a4o:ّHl%ԒZj,Z KRKiR[ji,Z:K-Rhe2[jY,Z6KRnԾrZj,ܖWZ/}2ӧ9l:%r_"W):[5b/+Z1`K%rE=ND׿d{^MFbh#Fbl#1ِ16cɆm$6m$6 j$dU>cb$6@I6`IȆF7m$6 ߳EDm# l;$F$FR=OUyIFRFR!cjIdC}#)I6bIɆהFRF21~H$F2l#ِ1xHF2dF2!cpɠdjɰddC6A6at]9]rWtN\m#9lFrh#Frl#9ِ1FrFr!cC6c)^{tibppEPHm 2=+=F l#ِ1F F !cHp!8'&7\ᢶm .ppQp6\Ȇp]\چ B6d npQp6R#/BFG)6:џFJa4dHHI6d kJJFJ!cp)j)dCFJF*ḩ!EʕrE6RaȆm6Rm6R )Jm#lo6Rm6RP] q&FjgBwΔ_VHm&2HHM6d 7RþZm#5l+5Zm#5lD5rkH#)i>%Fl# ِ1i\i6`iȆF7Ҩm6Ґ HmQHm%oGݗԋbu sPZa{I`ZFZ!cjidC6Bi6biɆ獴FZvp5[W -P.|x?|}_|aw`>ڧt~8_o><5Dg뾀 5ttsn\7N?G:OA:2?HS;HA:r cIIҩE 1x?HmSHm'%z^[6cɆ.+ݺj鱍dC6C6cɆm6ҫm62%B%+Um#+llZ>r}# Ȧ F6d >odF6lF6!c=l6ͦ F6d 7A6adjjb}+ܧmbdC࿿~Ump%2-8WW[pj؆+ِ1xp6\6\dl]]hebd6C6cɆFv7md6 )ᚒ]m#;l|mdWȎm !gp&FkJF!cvFpbhm6r )9Cm#lFh#FlK 6ϥ]L/E/66$2_¾ƗƗdC66Tl|MRmKl#'٠_9eb6rB96rb9Ɇm6rm6r o96rb9Ɇm6rm6rSם;%;;ɥ E6d ~N.xN.\F.!cy#7rm6r SrA6raɆk71rjdCg_WnFn!cpjdC6rC6rc_"6J Jm+l+!c_m|m|E6d >o|獯66"2E6R C6\=?d#XS5%Fl#ِ1xF[_m#?l,&?<ɯO6d T6cɆF~F1>vkLo}Flِ1)` F!c m6 FFA1ϭLFAhFAl ِ1x(FAFA!cQjdC6 B6 bM=MBb-gBjBdC6 A6 aȆm6 m6 )Bj6y}mloٺ j_EO{lو;0ft~8Z5V_W|xj1ik5{[͖C^aiAa oFiFi!cQjdC6JC6JceF4ا2je2dC6@e6`eȆm6ʨm6ʐ OR(Q(K6\W<(+֔pM)Q(K6d n,QVm,Ql|M) הjedCejerdc->儍rF9rF9!cp堍rj對rdC6A6aȆF9hF9lxahooȆ77dCߧ|OFml!coo66ʓŲ/IebFyFy!cp塍j屍dCFy8oW(m'2Q(Qۨ@6v9Od01*Q j dCkJTPۨmT 2_S*5Flِ1RڨQۨH6ofbTpRQm"QlFEhFEl"ِ1FEFE!c=lEhFElxQIبmTRۨmT"2Q ڨQ ۨD6d nQImQl|R ڨQ ۨL6yF)hbT6*C6*cɆpިQۨL6d ~pexWeFe!cy2QYm2Qlրh F !cp5j5dC6j@56jm8oj}y&&ܹTia><ٿLRMj5̇k8I 15W|xj)U^k^~}/oz{_jYQRcյYj-ZCKRkb5ԚYjYj[j-ZKKRRRkc~Yj-ZGKRbyK-]=&Uih]KUM_ZN&q1yj-u׵Zd >ׂp-u?׵Zd nZԝ^jQg1<\ ZW <ƈRt11jpQۨM6d ajdCp][m6QlFmhFml٘E}zu:F:F!cym6 u<\GmQl|mQۨm%CR?Ĩ+X3judCp]Wm.Qloԅ}F]l.ِ1[]hF]lض\Lzoԃ}F=lِ1Q6aȆ//QۨG6d ԃ6m6꓍sQ_oWۨm'2QڨQۨO6d ԇkJ}F}!cpjdëh%LFhFlِ1 6` Ȇm46m46 hm4Phm4$1ib4kJC4Thm4$2hhH6d n!Pm!ѐlFChFClو:/i<`hhD6d 4kJ#FF#!cpFjFdCh#hF#l1x7߉KMƢo4}Fcl1ِ1FcFc!c}JcOihL6d 7C6cMFF&Ycb4} M6`MȆה&pMihB6d 7Dm фlo46m46_\hO)pOğFSFS!cpMjMdC{ئpTm)єlo46m46!knb436Ȇc6aȆm46m46 fo4Shm4#2@6m46#q&w}t}ِ17Slwmߩm|m|G6d wwjaߓg!{1~g66'2=dCkpM^m{l{!cpC߫m|m4']f:nb4wޗh^՜lnihN6d ,o4Whm4'2_S5Fsl9ِ1wm͡jͱdcp N->ܧPhm 2-`hhA6d kJ F !cYBmђl[-{ZJThm$2hhI6d 7Z¾Rm%ђlo6Zm6ZW`bF+8oRhm"2_SZ5F+lِ1 6ZaȆF+hF+l5R˄sM1Fkf)dhhM6d m 6ZcɆFk7Zm6Z ϢjC̽ab oِ1\S~PlxfdC}h{gb|& iH6^{F6~6~$2#ƏƏdCkʏpMQmGlG!c36~6ڐ :{db6pFm цl߂khC6d kJ6F!c83Fm іl%Y mtVmt&21>:mt6: iugZ6:cɆ἟a#;7ssFO1!w>Lo}FOl'ِ1)=6zb=ɆFO7zm6z oTm"A/01z ^j^dC Rm"2 襶 E6d EoRm&w,9[ mVm&2譶M6d n7[m7ћlFohFolوBL>bam6 /~/GmчlFhFlِ1>F>F_dMʜ:}F_F_!cY/Em6 Ϣ},Wm/їlFMg |3Z}FngMŚ3\S~Vlj?c? aYmglg!c~}g~d `bs0_#Sm#2觶G6d nOmяl~F?~FQ!rLbMהjdCh8Wm'2?Em6 Fhcdv!cpjdC}c6`Ȇm Pm $m&8Lb獁jdCk@ Tm $211H6d nc 1Pmc 1lcAm 6 a= A !cm 6 ?w91L6Fq >&`1o ``!cpjdC`8o Vm &211B6\f1lqp٨o Qm !2_S5elcِ1x1Dmc1l|m Qbxkw bZPpg높WCw'R:?MCWO>߭ P50滺Ъ&Co a? ate ~0 `Z0Ϙàajðdýp4c8 Wm '236cɆgp1N6d >G 6m 6F >gab8N!c1j#dC{p%1A6d 7F@#6F`#ƭ41F1j#dC䎄Tm$211I6d nc$1Rmc$1l<_B&(E6fr#mRm"2QjQdC{Qpo:Jmc1l(hc(lgOoXX!cpcjcdC}c,1Vmc,1l ( c7yc8lcِ1q8q8!cp㠍qj㰍qdC}c1Nmc1l*i&x1oxx!c5e<\Sƫm6Ɠ 1^mc<1l|21ۘ@6z71& jdC6&B6&bɆהpM1ۘH6d nc"1Qmc"1ltkcE'Yt$lcِ12 )6&aȆ$7&mL6& ϢIj64o:1)TKm6RaʹfYj-9گ\Km6R[`-Yj-%RKmR[aVYj-5ZKmR`mf2u|o:M=n2q=n2q| ׿7d Mdu{dq2qaq7llKދcoO)jS)dCMQۘmL!21ژ1ۘB6d >M6mL6 zcp*c¹yTlc*ِ1xߘ TT!cpSjSdCg1SjSid{EMioL}c4lcِ1xߘ4i4!ci,f4lcِ1i4iteT󯲙Ӆtt!c1jӱdC}c:6cɆt uٔ{r333336f`3Ȇ 7fm6f ۘmPۘm 27f@36f`3Ɇ㦆*Lbޘ 獙j3dC}c&36fb3Ɇbf³j3dC6fB36fbPĘ%1 ۘE6d nc1Kmc1l|ޘYjYdC,hc,lc6EZ51fyc67fm6f )2[mc61l|M הjdClhcllc0 co Km6 9oQۘm!21ژ1ۘC6d 7@s6m8u?f]d9W_̇<[+o><5𿟭^_W5>xqǏu εs4h@q9GU_̥/c~0jsq?Kd >G̅s\%21Bs6bFUͲkbbs<8GSۘm#21ژ1ۘG6d Dj=+[#g16aȆm̃6m6操!]\r41;o ;l||!cs>1m6 Mý||!c9b>1_mc>lLmMo,}clcِ1spذ@mcl|\j dCB9.c셮wm,6 o,TXm,$2XXH6d ,6m,6-*9X$;EjEdCH.b16aȆgEp]XD6d ,6m,6bob,v[l|bşbb!cYt1Em,6 Űo,VXm,&2j%d\?~=X"7m,6 ?>Dmc l|]g%jK%dC}c Dmc l\I7&R,j; m,6 o,UXm,%2KaXXJ6d 7BK6bȆ!Meo,}c2lcِ1.Lmclo,}c2lcِ1e2erY3Lrhcrlc9ِ1>e9ܧ,WXm,'2aXXN6d nc9\mc9lBXmPXm 27:;c8lx\ً}Ckcl hc lcِ1XXI6:oKLق۴j+dC}c%+6Vb+Ɇ+vJlc%ِ1xX mTXm"ErX%^^ XE6d ~U06VaȆ*7Vm6V XmRXm&Uy:X-֔pMYXM6d 7VþZmc5l|] gjdC6VC6VckFqJ7fbߧߧQXm!2î{5jk5dC}c k6`kȆg Fmc ltSQckaXXK6d 7¾Vmc-lZhcZlc-ِ1wmkjkudc@41 렍uj밍udC:8oSXm#2XXG6d OYmSXm'op31֋5e=\S֫m6֓ oWXm'2XXO6d oV{z1L<ٿ߭ ~;0>ٺM}_}هxq~8濩oN-^8ye-v{wvm6v mR؅m"2 إ E6d ~޹ إ M6|}>!ca1mn^Z}dC6A6aȆ7A6aƉҏhbW؏m'2aدO6d nc?_mc?lo6m6$~zT71?>O??Ɇaξ:9cЩg166$2Ojb ??66[SLY^8 3jdC!cpjdCA6&&A1oAA!cpjdCkAT8m$2q8q8D6>p8$!7m6 qHmql!h!lِ1!h!l00mMâo}al0ِ1aa!cpjdCahal[EN&aqDmqlhlِ1##!c}hl(pT&Q= G6bGɆ9 9q8J6d n(qTm(ql|8 mU8m#uw&31q cjǰcdC}6aȆ88q 8F6d nqLmF6Zȷ`PMo 7 7lÍl܆ᦶm  776ܰ 7!cpnІچqltA&q7þq\m8ql|{am6 o6cɆm6m67p6ܡ w wlÝl wxچ;N6d 5]mp'2Eݡ w w 1'e|&\INE0}$= .p8'W|xj?t^k~tWH;t\C'a?8'q?8IW_sI8GT;8Ir c9$qR-$'IϴNB'6Nb1^E.11N SjSdC{SpozJmqlFUgT8m"2_+NA6NadXVbW  lÃlfhqB6<Ȇj؆ِ1 hCmnޗ/^a𴼟㴥vR;k[j,5/KR.ZjoXjZl].[j!KvR , KvRmݱœzK?n4< ?Ou=ΓzJpqyR1x=S R6FZlbx ox᭶mx 66 o!cyj؆7ِ1 oh[m!]\rnbD^t!'8|Gm!2mm`>dC6|  lÇl|M6|6|dcHKMo\}El"ِ1EE!cpjdC6.B6.bdcsDNY~_Q,CyWm%2 mmbdC೨/E}6| _!c5U6ƒ{fb ?x᧶m }/? ?lÏlo᧶m a ? ?lßlVìW&ا}چ?O6d nW6Ɇ)p⯶m )Іچ?@6VM1oy#@m# 2_Sm )pM P6Ȇהh#@m#$,5~#PpT6ɆmBjF ِ1x}#Pm#$2?366 qeteSAbFFD6d n#R6ȆFAjAFِ1mmadaJgb;m/ǃͼ#``l#lF0m `76`!cy#V6.]V5jb\o\o\R۸m\"2%lِ1}]uImql|޸m\R۸m\&tĸ, q۸L6d O )6.cɆe7.m\6. ۸ m\V۸mCRoby#!j!Fِ1הl#lyDFB6d n#Qp6ܧV۸m&2mjdCm8V۸m&2qڸq۸C6x;qG̢w,zGmql|g;jw;dC}w6`wȆה;;vÄo:ny]K힥aݷXj-HK푥e=ԞXjO-gsK-R^XjKK핥R-7[K흥R`%Xj-OÄSx.ֿp{\8qd ~@8O \q 'c9{\88Dž{\8^-ĸ+pnq۸K6d >7߅s]]!cpwjwdCtwjw{d#hKL{b}m6 ={=!cm6 F{j慛oDmD 7"6"!c9jFِ1x߈6"6"dŽgg6cɆm܇6m6 oW۸m'2qڸqx@6*}bじEYlِ1)6`Ȇm<6m<6 Ϣjd]Vk7»m<6 o6aȆm<6m<6 goWxna><ng랓38gu|˿=W?_}ه'Lpt͟s^:kFˆ^#ѸD՗1whhɁgh8cFED~M"d ~ mDmDc1dy:51C6̟mĐ ?b#Fm#ۈ!2_+b`Qۈ6bȆm@1j1 )_Bp lِ1  !c1_m6^ w6^m6bFFbMkJF,K6d 5%Vm#ۈ%2 mĪmbdC6bXXl%ȷXLo}Kl%ِ1xx KK!c5%\S^m6^ ?^B/6^bF_Jx%+lِ13Ȇ+W+!c WjWdCgZWjd1ygbAAVxm&25kl5ِ1;^wVxm&2_S^C6^cqduߖTMO1ļ88l#l8a#mđ 876Ⰽ8!c5%ڈSۈ6FONM]Lx5%^m#ۈ'2oīmcdC}#xxl#lxh#^m#xC6F.͞M:㍰xxC6d l]Gg meo6`oȆϾ7jo7dC6@o6`oODd11 ojodCpVm-l|Sުm6ޒ x mUxm#+-94N6aȆ+W;lِ16aȆ7j;w{QRs{f)EyxO6d 7þ^m=lo}{l=ِ1sMx0~MCk=lۗ4r^XS>5lِ1̹hgg K7={bhm|6> m|Pm| 2#?1"kZ3/K w\'m$` dC}#l#lFm$ y匁֔l#NsJ1>|Gl#ِ1LajdCpQm#l|MהjOd޴Z$ D6d 7>Imlo|}'lِ1,;ܭ)chm|c{#(RKb%ԒYj-RKeXji-/,tZzK-RdeԲXjY-lRa}irYj-,<~>9[uJ͉NI/Dٓ'ww%%ʎz_:qO >%ʎf;u %&iwxU7pJ!@ !tIPRB齪tPzG:{"wA@*"E@YsԵro{fԪdb$w0dvrrFr!c/m$6 Hm$WHm$'25W d#Frl#o&z #S9F l#ِ1>O F !cAU\1<Ȗ$F l#ِ1xoF)6R`)ɆLa)ɆհjȾ9FJl#%ِ1;j)};j)6Rb)ɆA6jb8mHm$2Hp#VCM 7X76ܰ 7!cX|ynjn؆ِ1L݈spڈ.'mZn؆ِ1z6ܰ ٨Ag S7döyPp`!c~ چp qN$6dCཨ lU#g&F*Q7RJm#lHTjTdC6RA6RaȆA6ppxٓHen]x/i ׷u$`Z3EEw= ]ֹ3x׷utT!ŵw~=w<螻;v;8XoC/tM 9WVԸ/czփjq=HMd Sʹb8Ewq~$VDj\RΪ++Rm6<Ƥw71<ľܷP6<Ȇu5Cm 2mxmx`dC6<  lÓl8_ÿAxmxbdCu O OlÓlF+I<6< O!c=-OhSmHC665sQ&Fa# Fm# lFh#Fl# ِ1ڴ+AFNCk# lF^W skpqHK6v~ebI$i6biɆm6Ҫm6Ғ iVX+I FZ!cҪm6/fbx識|S^j^؆ِ1ܷR6ȆA6\Vy ۱U^j^؆ِ1xuKm HG6)pg#طH-ҩm6ґ HmSHm#2i#$F:l#ِ1ܮi>y+chm6ғW=oΰHuOuOHO6d n#=^m#=ldcOKW m^$I Fz!c=5]16VTjIbhm6FYu41Eu[m&27a᭶mx #5)dvS6 o!c [*dچ7lK z ͠@6d ivHCk#lf [içs?I F!c-\16l62`Fq~012^4#E3md62 42 ۟FFFF!c22md62 <'Oi<-$FFl#و=8#`Ȥ D6d 콥+,$I LF&!c22md62 5\16KٓȄmd&U8w,ld62md62 Ym#3lFfh#Ffl#3ِ1FfFф~"E},jY,dC0F3W keY6`YȆ⃾ɢB6d ~HgEm# ltUSuJVFV!caamd6 ؈u/gZYdCg6md6ko5𢉑M)Mm#ln4upڰ=Φ F6d ދfh6lF6!c3NA6a>dy G X7|6| !c8ٰmm`>dC7|6| !cp>ІچK6)|v=W6|6| _!c9)j؆/ِ1xuWm%2?U6uE/6cɆFvX7md6 mdWȎmd'2١jٱ ??71D ? ?lÏln᧶m S:Om#2?S6r|(!l6rm6r !b16r`9ȆȡA6d mPȁm[ m9$?76 !c9)j؆?ِ1xu_m'2mmc9\g:7w71r~#'7rm6r  mTȉm$27r~#FNl#'ِ1xȩE6ܜ]Kͥ E6d ^7rKm#l| ȥn䶜2222V2`+h+d YƂ-c-c!"PXQX1Xeeeee,2a+mEYXƢ-c1$cΏroo뚺Ṋl\܍]ۺp[]r뙹wr8W1sqOvӸ.jWnuʍi21򉺑֍|j|dCoOm#lnu#F>l#ِ1Z)Om#l48v`}#ԍdcc6cɆ::F~l#?ِ1xF~F~!cC6cFۉŖ41 =pFlِ1x(FF!cQ֍jdCsJhFl#lAQ&Fnm`dCu#֍l#l|%m`dC6l F&FAVT(m$2Q(Q(H6d ^7 ºQPm Ql|R(Q(D6f_kQl$K~ؙy[ˢ6 aȆװF!lِ1xQ6 aȆF!hF!l#lZ}y&FxmbdCu#֍@@l#lw}mbdC6@@l#l4#Ha6Hm#"2C@u#Hm#"2Sm 66`q"ML`Q7aV6ɆF0jF0ِ1x/ {``l#l|#V6 k)<|LFahFal0ِ172726 cɆ°(Q(L6d ދ6 m6BƓW31Bh#Dm#!2CHchm`!dCȄodB6B!cClH6q.&F}!m6 KEȆmTDmQlnuFlِ1R(Q% Jo:u#֍PPl#lFF(J6d ދ^4Tm#%2SBPPl(٠E:(\U(m%2Ea(Q(J6d c#a~#I FQ!cpEjEbd#η21Q ֍bjŰbdCu6aȆF1X7m6 )ŠbjŰ0Qnuk]GaFm Nn00l#l|+ }maadChm'uzqQ\(mW(m'2C@jűdC6C6cɆFqhFqlpi&F |F_BmQl(j%dCpRBmQl|_QBmQlЛsLFIhFIl$ِ1%%6Jb%ɆFIX7Jm6J ׍FIF)1hĜR )6JaȆaztkpZRdC6JA6JaȆm6Jm6ƴ *kp W6Ɇ)pm ?O S6±p!c9%W6"ƲwM1D9%Bm#ۈ 27"`mD ߈Pۈ6"Ȇ7" 1]g7INyivn|TJw}j/w\ܓ]<4{^Z}KzIEwz0x"s_:A$}ìMb8D}~ft`ZDpT DDBjFٸmM(VE6ua^PmD QRۈ6Ȇ;~gFE6d cFAQjQF,eDYe6`eȆm6ʨm6ʐ (mQ(m!2nĚF2F4p>qĈv0!M6%H. 6h!cpFF4M6d n#ڈVۈ6ɆFF4C6Ҧ#-bEF C6d l#lF mĐ ۈ6b6bXO}a֦d\ĪmbdCu#֍XXl#lF,mĒ ۈ6b6b6羬s_'ȳagqY(k%X[*X*Z-c,c-cU,cU-c,c-c5,c5-c,cXj[XZY[XZY[ƚXƚZƚYƚ'suWd¼Nqo}sG5N_5.׸8q2;0qk\8`S׸8<%QV( mU(m%2Q(Q(K6d >_YFY!c,QVm,O6jھs#^|ɍWۈ6Ɇ{xūmcdCtp.^m#ۈ'2FFT6*mT6*w82f61*9"S*mT6* UXUXQm"QlnTuFEl"ِ1xݨmTTۨm$MGz횛Hu#֍DDl#l|)jF"ِ1{DDl#ln$BjF%qp|!yLJF%hF%lِ1R )6*aȆװF%lِ1JF%JFeq FeFe!cuJeNQۨL6d oTFeFe!cs,+C6*cU}VEL*FhFl ِ1xݨF*F!cpU*jU*dCu QEm Qlr&FU װU6bUɆ1PݨQۨJ6d vUvUFU!c=FUF5zUFmLjF5hF5lِ1h5/ZMmQlnTuF5lِ1jF5jFu|geMbNjձdCpR]m:Ql| [amT6 )աjձd#(r&F Q7jQCmQlha0F lِ1F F !c^QCmQlD9wj5Eݨ FMFM!c^&Ekm6j ak5lMFM!csjB56jbF#ѳZF-ZF-!cojojm6j ׍ZnRۨm"2mRۨe}G^#ۺOLZ'vnњOu!2|ᄍ'x2׷u{Am_}+Ca=q=Mw_0=fsW s0dPZq=Md ^VAm!c6Q[m6Ql #m6 u\QGmQl|mQۨm%QlF}hF}l>ِ1V}hF}l[:_CM=-S  6` ȆFX7m46 [4j dCu@mѐlM}}j dC{ ^xCFC!c֍j dCu!Pm!шl><} &F# S7 }uJ#FF#!c֍FjFdC6A6aȆF#hF#l1x>vL9IcXm1јln4uFcl1ِ1)6cɆFchFcl p.dw&F}5Qhm4!2M`hhB6d mװM6`MȆFhFl)Bg M:)\4Uhm4%2)|FSl)ِ1xh FSFS!cFSF3pg+Lfw{m46 a5l3fF3!c~7m46 )͠fjͰdʘכŜ)6cɆpNihN6d >4sJsFs!c)͡j6\a'8ha9ǣeeeeSg-cm-c,c-c_X:X:Z:Y:[ƺXƺZƺYƺ[zXzZzYz[Xƾ}ekgo`h9ոޤuj!T-Ƶ58ZPm P׸Ƶ'cZk\ \ZP1xoָ-B.hhI6d 7}sKFK!c%[m6Z h mThm"uvh%zV7j hE6d j+j+VF+!cpVjVdCזּ6Zm6ZFN:nb6ZC6ZcɆFkX7Zm6Z )Zm5њl|/5Zm5цl|h#b6jm6dC0u+ƭhm!2hhC6d nmQhm|J6fu`b|*l| m|))ِ1ƼNFЭpZb ?O6>6>%2Bm|m|F6+&gggja ԍVNQk$ggdCu3X7>S ln|m|9y;ѻ&}m|m|N6d +Fʥa-Bljc \msl-8_nbh[؋Uhm%2pI[aijmdC6Bm6bmɆ甶F[F;q11ډvpF;lِ1W;NmюlF;hF;lِ1vF;vF{$|noLF{hF{l=ِ1:=\Whm'2hhO6d hnd#YSf1}g/"0w~[|>v]{uqtP/w\ܓ]߭/ \:=Ѻ )Otw}? wP;Ar ci6׃$BsEhFl#pxcS;;6:bɆ訶H6d wTmt$2_t6:mt6:A>SzľE'oImщlNp褶 D6d Gt3I'NF'!cpNjd#︞]Lήi:Fgl3ِ1x FgFg!cpjdCsJghFgl XWx]D]6`]Ȇ뢶B6d n Em хl|袶J6 ZSd`z-4mt6 )]Um+ѕl {Ѯj]dC%v6mt67=OD 6aȆF7X7mt6 mtSmt#2SA6a]ot'N]m;ѝljݱdCsJw8tWmt'2SC6c=Əw71z~7zm6z !b9Flِ1FF!cp=j=dų61zgh=gOFO!cwzwzm6z  mTm$2ylTm"W*&Kԍ^nRm"2Sz9F/lِ1W/Kmыl|Kmћl|EO FoFo!c9+ӆg{m6z ׍ްnVm&2E{C6zc}#]Eg}Ĝ)}6`}Ȇ1:Flِ1>F>F!cX裶lu#RRmKlK!c辄}%%ِ1KRmKlK!c//66"yPJ)_9+Ȇ1:+ȆWn|ِ1xWF_1,%LF_hF_l/ِ1̜iXF_l/ِ1}}6b}ɆF_F?~vM~F?hF?lِ16aȆF?X7m6 o6m6i' xibFoWm'2YöpŠuҰIbhm6 mWm'2SC6cF֏ǘD!cuN1@6d > s!c^t1@mc1l,;T%|dYcx6>k1H6d c+F5$@lc ِ1@5Pmc 1l|Nm ThOaYlbj2elelelelelelelelelelelelelele[T4t L,lw9aQ_AۺAۺA7׸ATd 7} uk q2h 5n87H]o0|!,z71L6d ```!cpjdC6C6cCF?Zش1D??Dmc1l|nܧ1B6d nc1Dmc1l7m Qm %]1TPP!c9e(Sm 6  m Um %2CjC6y}ݺq7f̷u__Z-ksq.u_v?} {m_z K~Z5XQop=oor cz Z7|C"d ~77j`Fl`b }0G Sm #21 1 F6d 2 Sm #2ߛm Sm 'g461p1N6d ppp!cpájñdC6C6c#F ߾L!1A6d !c9eSFm6F #j#d;LbOk$1I6d >sHH!c1֍j#dCuc$1Rmc$1l|UcAA1Jmc1ly(o(lcِ1gg6FaȆ-FA6FaɆWU/51FuhN1M6d ohh!cpjdCshhchlc ٘r֣m&ы1!cpc1jc1dCoQm!211K6W;c{c{c6bcɆ由pN1K6d nc,1Vmc,1l mUm#KfȽ1N)2Nmc1l1G6d >s8q8!c~c1Nmc1l˞&xac<1^mc<1l|2Sƫm6Ɠ Suxx!cp㡍j㱍 dcK+1A`1Amc1lnLuclcِ1xݘ !c'@6&`F+gbL6&B6&bɆmL6&mL6& ::Qmc"1lmLTۘmL"+ MIbk1 ۘD6d )6&aȆ$X7&mL6& ۘmLRۘmL&5Nq1Ya1Ymc21lߘ jdCp2Ymc21ldhcdl[q ߊ5p ƷƷdCu[X7Uln| Ʒjbߒ Vm[lc hY瓂FS))!c~c 7mL6 Su)!c))T`ڔǘSŜ2)S6bSɆNamL6 )S2Umc*1lThcTlc٠&ӄi4i4!c8D T7mL6 ۘmLSۘmL#2_N6mL61Ę.lL6mL6 M]16Z?3:0I t!c~c:7mL6 ׍t 1ۧ33  !cu N1ۘA6d ^7f1Cmc1l|_t1Cmc1lPg&L5}Tۘm$2Sb8mel$16fb3Ɇm̄6fm6f SfB36fbCjUĘa,a;n,lcِ1xݘ,Y,!cpYjYdCuc1Kmc1lP3Ę-Eg}jdC0!ic3Ŵ$16fcɆm̆6fm6f j6|gIJg &;a+ߩE|ga.œt}9i,sBB!c9e!Sm,6  j EdyqLEEEjEdCkEpMHmcl"hc"lcِ1"hc"lc1ٸ?#]&b7.VXm,&2?/j1ODmc ln,uclc ِ1xX%!cpK%jKdumoKEX RR!cuRNYXJ6d ^7ºTmc)l] m,UXm,# uX&2X7m,6 )Lmcln,uc2lcِ1xXm,SXm,'~s715r]XN6d rr!c֍j˱dCuc9\mc9lL.IcSV9e lcِ1xX  !c֍j+dCucBmcljmicXXI6d ^7VºRmc%lJ\pJlc%ِ1J*ߟ51V~c7Vm6V !bUjUdCs*8RXm"2 X XM64 &jac5Zmc5l]]jdCkkVXm&2XXC66uoeb؋QXm!2X7֨m6֐ k`Fmc l]mQXm%Q]N8sX+ZX7֪m6֒ Zk6bkɆXXK6d ^7Bk6b?ebuc6aȆ:X7֩m6֑ ׍unSXm#2XXO6,⮉^XmWXm'2F>_XO6d ^7ú^mc=l|NYmWXml &acAmclnluclcِ1  !cp jdro=416~c#76ml66 ׍nlT؈ml$2بH6d nc#Qmc#lm9\'&&acImcl|_tݤ D6d ncImclmlR؄ml&DcجL6d ;nV،ml&2FdbM 6%Nzڑ$flc3ِ1x mlVl{}G^%5}^-{sq.Ǥ:\ܝ]o뾇{~=şN8߫l{>`/<z[D=߂2[`=آv׃-@s(bZ\[-j[ȆӬ521~~~Plj?`? Aml!c=6~6{*VX7ml6 ׍nlU؊ml%2تJ6d nc+Umc+ldr:ٵ)6׾Ȇ6m6!c ֍mj۰mdCW6aȆml6ml6yCOebl{Zvv!c$sj۱dCuc;6cɆۡj۱d=& sPx!c}pblcِ1!c^tCmcl`ʆ&NQ7vºSmc'l j;dCsN8T؉m$2z'Smc'l._ۛ&.acKmcl|/| ߥ E6d ncKmcln6vm6vUdbp[mc7l jdCsn8V؍m&27vC6vm8χ ·=Fyf9{-c,c-c,c-c,c-cG,cG-c,c-c?ZNXNZ~l;k2v2v2v2v2v2v2v2v2v2vr>qӦu#=pۣq{pC5N Q׸='cָ=׸=Td kuۃ翽dL'}M[^^!cwwm6  mU؋m%2ثG6vfcاG6d ^7Omcl>hc>lcِ1}>}~qT=sE߼6cɆ1PدO6d nc?_mc?lomW؏m _={A>7~lِ1"?q8@6d nq@mqln6m6y`bόg6bɆ1МrPm qlAhAl ِ1^AhAl2n 㐘S9!lِ1x8!C!!c  m6 ׍C!Ca88X㰰q8q8L6d jdCu06cɆm6m6ӭG:\Q8m!2C@m6 8mQ8m!2q8q8J6[ E^Ql(ِ1xqG6bGɆm6m6 SBG6bƜ'KU 71^Em6 )rLmql8cjǰcdC1h1l8X8)8.qX7m6 !b^ql8ِ1W '˵#I q!c C6c?5߷x1QQmGlG!c8D dGɆƏn##ِ1#Ə ܁+kb ؋P8m 2C@  !cp'j'dC h l$?㤨'a8q8I6d III!cp'j'dCppcb '6Nm8?uQq3w5~R.\ۺOv]o~+w'7dw~'= ׃StO%\xwJiw}%v %vJȁצSjp=8E"d G6Nm6NJnb6NC6NcɆӰ8q8M6d n4qZm4ql8 mV8m!788cl~x ٰ3!c}N=^Y<(I 3!c6=q8C6d n qFm 3hG?ꆹ)? MYmglg!cΟ~j?c? 3|gɆ生6~6ΒggŜr)g6bgɆaN+7m6 ڸqnׯ߭6mݯU-Wsq.>o~_~;0w~[+o..Ϸu{y߿yc@M2`=xv׃@@-HodcE:gb&lmِ1"mmF6d Mm7l7!c=ߠ6~6x(l<6m<6 CS6bɆCl!ِ1xxll/>%&bOwQ;;ِ1"]mwlw!c9w8;;ِ1;#0wMGbmMm<6 l^|D6lG>Rxm<"2xxD6d nHml&c16^m6^;&kNy )6^cɆm6^m6^ ׍װnVxm&2xxC6I&a Fm l| aߨm6ސ o`Fm lhl-(6#gY㭘S9[l-ِ1[/Vm-l|Ny 男jodCs[h[lϛDx;w;!c9Sީm6ޑ xmSxm#2xlķ{*e/ԍȆm__dC66R l mmE6d _{qlvLnu{l=ِ1x6cɆxxO6d ~v{h{l٠7Mn|ulِ1Amlhlِ1hl#ٸ:χIx$YT1wXj˘e222eKgKoeeeeeeeX|-c-c~1XNX.=/}֏j:%5./qBN?1xKj=u XO q*b8k\9I m$1<'q|QKܵf%EO|E$0wct.zj./Z5%Wo..m]rxϓyr=wKA,?6RAS_껟׃te -Zb8l,!Ibh 91::B-")HA h#F l#%˧LYpJXRm6R RRJFJ!c~8/Sm6R ﱤ6Rm67Nmlfl 2uÍlD}~f7 7lÍlNɒ516vp.ap6Ȇnjn؆ِ1xp66ܰ 2ak!zL1jlA6d 7E{  26jlA6d ^7ІCmÁm"S921R ֍TjTdCTpJm#lF*h#F*l#ِ1xHmRHmKM,p;76ܱ w!c~j؆;ِ1ެ/ڛuWp6Ɇfݡ w wl#5XY@g(Fj_d}oVHm&2SR9%Fjl#5ِ1xH FjFj!cpj ia×?E<6< !c}p/Cm 2_xuچA6d nP6<Ɩɮ01#ȨH6d <%#|Qm##ljdC62B62bZ`bd62A62aȆmd62md62 ׍LndRȄmd"2S2A62a(hbd2gm62cɆ{̰ͬL6d n#3Ym#3lFfh#Ffl# ٘V/]EodY6`YȆaF3W #,jY,dC6@Y6`YȆ)Y,jYd#GauY:%+\dUȊmd%2C@u#FVl#+ِ1xY6bYɆ&Um#+l,+&F6a#Mm#lfϼ+FgW}V#(I lF6!c ֍ljٰldCh6h#F6lÇl#l@>j>؆ِ1a}6| !c8m$Kv*phS'Ibhm`>dCg@>j>؆/٠'6| _ _l×ln4upq|=6|Ɇ_8mbdC/᫶k8&&i&);\dWna.&);\fW;nw`.&);w?{{_=Ϯq={~cA[ =?o-w?21`v91x??\H᧶m OOl򡜉C[䀕!Fl#ِ1"z/#Fl#ِ1\Vj9dC=fh#Flßl/$|E_66 !c놿چ?O6d |>_W6ɆmCjFN|z,c*9ŞVNSm#'lnu#FNl#'ِ1FNFN!cp9j9\d;%F.X7rm6r !b 6raȆ\pNɥ E6d  ȥny:׹/^0γ8r[ckgo+` ZƂ,c–XXeee,2V2V2V2V2nEZƢ,ce,cіXܗT4w?[u-p˭qqM5N5.7q5.7q|Mrk\n\rS1*7q5.7ڬhQ#YYͣC6d 7Qȃm!2(Fl#ِ1xoȣK6WFyaoWm#/lF^h#F^l#/ِ1xoFy6byɆBy6bȆǨ\721̓|dЊ|䃶|j|dCsJ>8Sȇm#2ȧG6d >6m6򓍉fb{n~F~!c֍jdCF~oWȏm'2SC6cFZ41 zQCư3uFlِ1FF!c~7 m6 (mP(m|Lы^4@m# 2mm`dCu#֍l#l|N 66d#gY&FAWhAF+:3XiT(m$2B m6 (mT(m$2jBdccgj~abBpRHmQlnuF!lِ1x/Z6 aȆm6 m6Fcu21Eu#Pm#$2. mbdC6@@l#l|N 66 q]M Y|,Hm#"2iղ9&*$FD6d >9%Hm#"2mmad*oebluJ0xrm ׍`X76`!c FF0L6d >CjFaGۼEQ6 cɆY- Y-Q(L6d c#icrHCk0QlFahFal#l4xÆ&Fk kS0-bşFFB6d N l#l|N sJFB6d >Am!H{3("am6 [W~[WDmQl|N)"jE"dCuQDmJ6:9߰bbc#lX5 mbdCF(7B6BP!c3@B jF(ِ1uFF(QlvuoLyJQhbĸlcmĐ ۈ6b6b!cFF C6d >@1j1F,xѡ^5ߛnºmĒ !b9%Vm#ۈ%2nĪmbdCppcb jva.·ѝ#<#rGYXee,2V2V2V2hdlbjfnaie2V2V2V2V2V22222222r>Lո66s'參ǩk\qqTd >/N]p'ck\G5N qqx+K6%2*(+TeᚪFYl,ِ1"ڋ)Q(K6d SŔU(m%2Be6bdcN11ŷ[xxl#lnúmē ׍xX76ⱍx!cpFFj$16cɆFyX7ʫm6ʓ ?3.mW(mT k :焉QA`/ZAmQl6*`ȆmT6*mT6* ׍ F FE>lL֊֊jdC?UTEFE!c^"E+mT6* jD9e 51ŜDDl#ljF"ِ1xHu#Qm#H$2H66Jd#_>ewѵ I.](ł!h !hSPHqhPܵhgv-:w3gt_Y3{yΘĜ)6aȆam rpذ}6HmшlF#hF#lِ1h wsS<6< !c놇چA6d >x9Cm 2ІچјlͱX&Fco4Vhm4&2hhL6d n1Xm1јln46m4p|uW5"E40w <As^oY7}s[&{O#ozbs{zIw_OO\<Ɂ'jxІچ'єlj>؆ِ1 >  lÇl|mm`m㗯11:S7ڒ m6bmɆF[X7ڪm6ڒ ׍nUhm%2SBm6bd̓rg01|_L8$ApqAQ1 R׸ \エo}sD5N{Ak\F[w(fb FF0L6d >/Xm#&2am FF0B6f=;" !j!Fِ1La{m ׍X7B6B!cp!FFJ6 uu4&F mmbdCkP U6BɆF(jF(ِ1x mmbƲ#Z?(gbsJ{8Whm'2=F{l=ِ1z=\oWhm'2j6yupn]ۺZtP`a.8zA݁xJvo:A};ᄍxjvTo:{A};zБ3 busEGx;~G\:ݗ1XvcQ#ɁX:=jq=H"d ^:B6:bF$lt6:mt6: M;i'NF'!c6:aȆNF'NFͿ5M07f6°0!cm ?#Lm# #2aFFљlڹxA&FgQ7:úYm3љl|ߢ3ܷ謶L6d >tsJgFg!cpjpqH)Lpqm8<6\m#'2nmcdC%6±p!c}FF8хltE)]Em хl=.=.j].dCFotQmt!2].j]d_MOan dM]6b]Ɇal:c8lD9%Bm#ۈ 2S"l(Pio&F/Mn/Mn/^F/!cp^j^dC6zA6zaȆnb 6zadcɂHLF$I6d e$|mD ߈Tۈ6"ɆF$m&R--E{}jdC{_WoFo!cz\*'16zcɆFoFzM>>j}>dCp1>j}>dC}h>F!cp}>j}dp}Um%2_딾j}dC6B}6b}Ɇ甾F_F8P5eQyJ|mD ۈ66(!c^4 QjQFِ1(h#Jm# G6ZL-'a~dU?~F?!c^Em6 mSm#23mSm' /):Fl?ِ1?\Wm'2诶O6d n?_m?1lu~&qx!c1֍jdC  Pm 2S@6`&@N)6bɆm 6m 6 o 6bɆ)jAd7jb  ؋Rm "2AjAdCs 8 Rm "211L6ޏ|qL1Xԍn Vm &2c0|c`lc0ِ1``!cpj6 q}SotZsq/7IC1D`݁xJvkCwf{>D}χz0yzU;zCE9Cw(C  U;Pr c=pOkZP\?BC6m8}Yɹ/I/lYі9b,c,c8pHXele,2626262hgo`hdlbj26262626262elelܗhqSצX>uaGﰣ5.׸hq2j\EM5N=O45.׸hq2qѰEk\4bȆ&Fc`?mĐ ۈ6b6b!cut \GǨm`1dC6blcXojMa0hc0lcِ1\E ,x0lcِ1x0a0!c0hc0l#lLXa#ڈUۈ6bɆѱpmĒ ͱoUۈ6bɆ6b6b8N31ℍ8h#Nm#ۈ#2Smđ ׍8X76Ⰽ8!cw㠍88lc8٨ʶLphcplc8ِ1ެ3醵^ZñdCuc86cɆphcplcؗVsLb~ܷ1A6d ^7F1Bmc1lnuclcِ1x/:1I6̈5)HX7Fm6F #a1Rmc$1l|2SFm6F  mTmē G\b#oīmcdCp1P݈Wۈ6ɆF<jF<ِ1{FF<1lWlUc1 1 E6d o(Q(!cpQjQdCkQ(QFٸ7űgb$9%) j Fِ1; l#lFm$ ׍h#Am#M6zpw*ca1M6d ~hxhh!corGorGm6F aGC6Fcc;ǯ51ƈuN1C6d W_4Fmc 1lhclc ِ1v 1Fmc 1l80zcca1K6d ~XxXX!c9e,Sƪm6ƒ cjcDH!c~61EDDl#ln$ºm$ H66D!c5l"m# l11Ɖ9eSƩm6Ƒ U8U8Nmc1l8hc8lcِ1xmSm'm1^ԍnWm'2ÎWm'211O6d ^7C6cBlj6&`Ȇ ߘ1ۘ@6d nc1Amc1lnL6&mL6&~xcaݘ1ۘH6d oLDD!c=p|Dlc"ِ1xݘmLTۘmL"벽;h1I`1Imc1l"1Imc1ldv3g #e4'16&aȆ$hc$lc2٨gqC&dQ7&ú1Ymc21l"7&mL6& ÜᰱcrI d!cpj)dcuqS S S6`SȆmL6mL6 بQ㟴ژmL!21ژ1ۘJ611^t*EmL6 ۘ mLUۘmL%21ژ1ۘJ6d ٨&|^/ŘO6wMjdC6C6cɆyy1ۘO6d nc>1_mc>l8~b~ғcsMeaē7elcِ1!cp j dC6@ 6` Ɇg1\LBhcBlc!ِ1z{!\o/TXm,$2y!|yBlc!ِ1BdT*21~Aml!c?mm@6d nhȆ{`/"AJX$"X7m,6 Xm,RXm,"2XXD6d gHmclrwoeb,uc16cɆal:c8l~vsblc1ِ1x6cɆal4up0$blc X"X7m,6 ׍%n,QXm,!2Ff Fflc ِ1F3Æ9ZKdUiMKEX RR!c炁[XJ6d >,sRR!cwM9eRlc&2 o,SXm,#2f >3^ XF6d >,s2e2!c^tLmclM==j˱dCsr8,WXm,'2XXN6d 72r 1B+D+6V`+Ȇ[[XA6d >s  !cŜ16Nw]Xm$9,RRmc%l|NY 甕j+dC6VB+6Vb+Ɇalpp0Z+Udck;&*ы*U*!c}Up_t*lcِ1 )6VaȆalqH2* G^[G_p~[ѺZ-b]˿uaXv\<ORmjKwf/T;{n^|./q=XC|k1ֈzփ5껿׃5te c=5!2߷X-֨E` 1L=(䌁lQXm% { -gbue6 ֒ ۡk6bkɆm6֪m6֒ kaVmc-lX jkƮhb(?Ǐj?b? ?GɆmm##ِ1~3,'16~6~"TTɹoaOdöOOdC=OIm'l'!c9'8ِ1ȆdȆd6~6֑!}21։֍uj밍udCuc6aȆalTs@:u:!cAتҟXm'11֋^t=E׫m6֓ XmWXm'2?{=<{zlc=ِ1 g k-uZZ뱍 dFּoD !c^tE7ml66 `Amcl|ulc#o2LnlucFlc#ِ1xFF!c=pOkFlc#ِ1Fd gb"61~WWVln j?c? ׍aYmglg!cK~VD6W$MpN٤ D6d &&M&!cu&N٤ D6d ~&hc&lc3p?ZROcجL6d >lsff!c֍jdCgn66ml6O7lfblolQ؂ml!27ml6 mlQ؂ml!2[-j#{&VqVxVV!cVV!c^t+Eml6  mlU؊ml#s-=riȆ9Z6aȆmئ F6d ncMmclA6aF 51֍j۱dC6C6cɆ{ݮN6d ^7C6m|z"χa9celeدݖ=},c,c-cG,cG-c,c-c',c'-c,c-cg,cg-c,c-c,c-c,c-cW,jrPiXSk׸Td uہkq2>١q;pA5N{1;`ۡq;lT} cxgu'|guNlc'ِ1kSmc'l|Mvm6v  mT؉m"tJ[Kԍ]nR؅m"2pwm6v ͻ`߼Kmcl|/fKmc h}pުL_72od~Qld@34oKCkl!c7 ِ1<01_6~6~% ]x3$Uԍ_aUmWlW!c+mmJ6d nWhW__ɆTBmm&mGT=[ԍݰnV؍m&2wrwm6v a[mc7l|/f7[mc7l~wڴ&Q7Gmclglcِ1==!cأK6h'n^b&gSȯem6 ìa16lU؋m%2ثK6d nc/Wmc/l<[ݬˌ(cxd|d>lcِ1x>}>!cu>N٧G6d NmSgkwj6o7E췋0w~oXՅT΋ʰ_}ᄍxjv$;8/~=ߏ)Rbw@'p'p@}zp\׃P8!czp8q8H6\K#8(;΃jdCp1jdCkӃpmzPm ql8mT8mF6;~MMk6~6~#2a>@(I ߰Ȇmmِ1^oojaƬyMC=C=CjCdCu6aȆm6m6 8mR8m&ES8~$8,-}jdC6C6cɆm6m6 i6m6/G$$GD/zG6`GȆ*bgG6`GȆ-#!c^qDmqlT9T &QQ7ºqTm(ql|(ܷ8q8J6d N9 )G6bGɆ産Q1R9DŽc1c1!c9Sm6 8mS8m#2_6m6'L88.l6m6 ׍nW8m'27~ql8ِ1x8mW8m G^pqB셟{'6N`'Ȇ8q8A6d nqBmql8mP8m$mLXÞkؓj'dCp172'6Nb'Ɇ{ѓ=q8I6d >6Nm6NbqJ)rJmql)h)lِ1S)S)!cpSjd#P㴨a8q8M6d iii!c94SNm6N 8 mV8m!OosqFԍ3nQ8m!2g`8q8C6d n qFm ql=mQ8m%,8+YX7Ϊm6Β ssVm,ql|N9 申jgdCYhYly/3.*㜨`8q8g1:\S8m3j|8q8g1s9sy)kMnuyl<ِ1 g |6cɆyX7Ϋm6Γ a񏉁lW8m\ yqAԍ n\P۸m\ 2^^lِ1  !c~qAmql̈r<61.7.7.m\6. _{6.bɆm\6.m\6. ۸m\T۸m\"_l11.簗sKjKdCp1PqImql%h%lِ1qImql,؄31.; meQs53jee!c)jdCkp {Ym2qlehel ٨4/_21q֍+jW+dCo\Q۸m\!2_\+jW+dC6@W6m_'|sUq[\ t7*ո-翫w׸Td 7_}UukUq2諸]5*8WaqWwl&5>5>5k5!c썮m\6 ۸m\S۸m\#2A6m8>6ym$bۃJ?hZv.^߭:]wsOO]}}s[;翫\{ު|%YzE?|w:|jq=Nd "zpD|m\W۸m '{ĸ!foj7dCs X#nm6n n  !cp7j7dsO7Eݸ MM!c27ɆMM!cq֍j7dC6nB76nb#ߺ31n}[jCu6naȆ[jC6nA6naFԶ9n.Eݸ mm!cpjdCu66ncɆj;dc/\51~7m6 w`/zGmqlhlِ1;;]Wӳ庉qWظ mU۸m%2/.|/]l.ِ1]]!cpwjw{d# 619Sm6 ׍{nS۸m#2_܃{j{dC=h=l>٘${&}a>q_m>ql߸jdC6C6cɆKmW۸m< W x l<6m<6 ׍n6m<6Mwxeb<pXm1l|Sm<6 x mSxm<#2 x xF6d nLmln<6m<6V]L9| l}xN6d ok{xN6d ^7C6c/FKibPxm 2) [Z/dCPxm 2/j/?ƃrgHcbA6$yؚCdC66Plj` KgRNMbS^m6^ S^uKK!c5K}xI6d xxE6ge21^9mWmWjWdCRxm"2E_^+lِ1 x xM6F8g51^~57^m6^ a/Zm5l} {jdC6^C6^coFz:kx377d7!ctGRxm!2o`xxC6d NymQxm%S &mb[oUxm%2&-&[l-ِ1x/o6boɆm6ުmp||m~rwp7Z;sqqqWQN݁x/W]H8 wfO&=_taُ ?E=փ?wO\/c?~jz'91\'ZğI"d SmOl=(_51ދgjﱍdC6C6cɆm6ޫm6ޓ jﱍdcǔ01>֍jdCpAmlhlِ1GQ;K/'JGG!c=-?g [6>bɆצGl#ِ1#Qm݆ܗ9E 8#HjKfKnsZRXRZRY>eeeeeeee尌崌岌Yr[XZY Iu|e:%q5.q{ʿN!V'qsO >%qC_:qIR'߷O1`K?1 ո=u 8%%s hb$u}sR77'UHm$%29FRl#)ِ1FRFR!cYwFRF2qfŕMdF2h#F2l#ِ1dF2dF2!cdnh-F2l#ِ1xHm$SHm$'!sOWz\HƟ$wCtm$6 )ᜒ\m#9ln$u#Frl#9ِ1Fr؆ ٸR)S&7\`ᢶm  X7\6\ !cp.Іچ B6d Omm`d#2lA&nmbdCu W WlÕl܆+᪶m ] W Wl#xw_)D)6R`)Ȇm6Rm6R HmPHm 2SR@)6R`)Fl9^RH mTHm$2HHI6d c3:0FJl#%ِ1xH mTHm"i'-HƿI冞 RHm"27R~#F*l#ِ1xHF*TF*!cpTjZo3ы~{6>6>#2^37gja ? =Lm3l3!cwgjaF^կxŜ)6RcɆFjX7Rm6R ׍԰nVHm&27RC6Rci­;skab6@i6`iȆ4HHC6d n# Fm# l;4F4FZ8Pkk#s k¦%MHK6d DZ7>ZZFZ!c}Ѵp_4FZl#-ِ1xHHG6 :c[#H7ҩm6ґ )Nm#lHtj鰍tdCsJ:h#F:l#=٠Lnu#Fzl#=ِ1L/ᰑb&gS$Fzl#=ِ1FzFz!cH@66rT #Xfk j dCp1МAm#l j dCu#Am#lx!>'ݞjdC࿯ vFFF!cpjdCu##Qm##lΑ&F&Q72Im#l|#Ȥ D6d n#Im#lnd62md62^E62cɆA6 9c8lLsܓoKCk#3lFfh#Ffl#3ِ1FfFA]O7#Emd6 odY6`YȆmd6md6 ?mdQb++H|uYjY"]_ )@U ݁xJ'.+ȪYw\<5e6rm6r.Icbu#6raȆ;s\j\dC6rA6raȆm6rm6ȆU8M 7X76ܰ 7!cpnІچF6d n pSp6Ȇ7hMm M6JҤ&FnQ7rú[m#7l {jdC6rC6rcɆ{FnFS?~>`bu#y6`yȆ<ȣC6d |5|Gm#l|NmQȃm%56Z0+l6m6 ׍nUȋm%2ȫK6d >6m6-ebsJ>8Sȇm#2ȧG6d n#Om#l|NmSȇm'qVM61򋺑֍jdCh~؋Wȏm'27~#F~l#?ِ1j6Ü|͉0gvQ2V2V2V2V2V2V2V2V2V2V2V2eeeeee X%XeXؗ,c,c-c5,c5-c,ca P;u;u* p+qp+@5N_8P׸'cWָW׸Td 5_Ax_ʚ3Mb+翂jdC_A8T(m$2׽ |R\Pm Ql7*mT(m"V;($=+=+Q(D6d W(Q(D6d nQHmQl7*mR(m&=280(,pN)Q(L6d >sJaFa!c5Ua*Q(L6d >6 m6W_XhbQ(m!2Q(Q(B6d --"F!cpE"jEdc(oebu)f(ٰZTm(QlnjEdCu(E6bEɆm6m6T5g(&F1X7m6 `QLmQl(bjŰbdCF1hF1l8 VŝqJqajűdC[W n]qFq!cpšjűdCFqF ˥uך%D(F F !c%sj%dCg|pCg|P(m 2Q(Q(I6:ް]gb֕֕T(m$2nJm6J ׍nT(m$2p@6Jm6J3ݴ(%F)X7Jm6J ׍RnR(m"2-EKm6J (mR(m&kvtQZo6JcɆaz@g .x^ZdC6JC6JcɆalqHO2Fil ٨FؚeD(F2F!coror˨m6ʐ e`QFm QlFNg QY뽿](csm]:uCE|na.ţsrPs53jZdo>s~Sgyq=;t]^\{?,mGT=++AYx˪~Y\ݗ1VYUV,eɁ;βjeq=(K"d o,8c e6bȆGx71 堍rj對rdC{ZV9rF9!c>6aȆm6ʩm6ʓ ufb6C6cɆIʫm6ʓ MõiyFy!cp塍j屍 dFCK{{6*`ȆFlِ1R)6*`Ȇ|M+mT6*nQQԍnTTۨmT$2>a䈷3,I FE!c9"S*mT6* [T6*mT6 x8 /66 2Ssj_`_ )_9 //Ȇ|持l|Ql ^>d9`ݨQ ۨD6d Y wVRۨmT"2`ݨQ ۨD6d >T6*mT6*hbT6*C6*cɆ*=jdCu26*cɆmT6*mT6>]51U*jU*dC6@U6`UȆFX7mT6 hꌑm\ڨm|I6r;uKKK//Ɇ/ƗƗdC66TldcG3g MΦع$'16695ʜqĨ\UɆ QۨJ6d U}UUۨmT%2S9FUl*ِ13ZUWdV_kb|%支WWdC딯:+ȆWn|ِ1Wp+jdcucJ<41wvwvmT6 ۨmTSۨmT#2Q ڨQ ۨF6d ދVh5jFuQS=EݨFuFu!c9:SmT6 ۨmTWۨmT'2mTWۨm ;mQl$Iؚ̡CnVPۨm 2A6lrPۨm 2F lِ1xݨmPۨm$~,QSԍnTۨm$25aݨQۨI6d ^7jºQSm&QlFMhFMl86C&F- rn-aҲߨQ ۨE6d cSKmQlF-hF-lِ1R ڨQ p'ӭޛ9;|뮶m qWp6ɆmCj؆;ِ1xp666a'|ږsW|o"!cz 7FCQOr \ 6b ɆjjhH6d LCLCFC!cp j Fdc^LFy_#F#lِ1x6aȆצLHmшl|ߢHmA6Rnxᡶmx 6<6< !c놇چA6d nP6ms]*bb46C6cɆgn gnhL6d ^7úXm1јl|Ni m4Vhm4!$H hhB6d n Dm фln4uFl ِ1xhm4Qhmx#KOݥچ'I6d ;=6< O!c 놧چ'I6d ^7< O Ol)9P5eMb am46 MaTm)єl| am46 h m4Uhmx;Q51y^+nb4{_WsFs!c99Sm46 ׍n4Whm4'2_46m46Zd[\3gu71Z8sS Q*:=Kɇ-6Z`-Ȇ)-:F lِ1x-6Z`-Ȇ@6Zm6Z|-E-6Zb-Ɇm6Zm6Z kkRm%ђln6Zm6Z e&F+:hE6Vtta/mRhm"2 h hE6d >sJ+VF+!cpVjdc歼441Z}p_Fkl5ِ1FkFk!c95SZm6Z a[C6ZcmFaK&Fыh6F!c^ Eۨm6ڐ SuJ6F!c~ Fm C6p<61|DuGm!2mm`>dCu  lÇl|N6|6|dR&ahhK6d >sJ[F[!cpmjmdCmjm _A_61|Ŝ _ _l×lnº᫶m 6|6| _!c mmbFO^x51ډ֍vjvdCu6aȆװF;lِ1x/h#7=66 ? ?lÏln᧶m  ?X76 ?!cmmade5>&S⯶m yW6ɆmCj؆?ِ1x66q9g CMa#P6Ȇ8m`dC6l#lF`8&|-+T0w;$S?yu7Ip3P}w\<5${{8e}_Nz/A9-c!PX{XXGX'Xee,2222222aeEYY[XZY[ƆXƆZ} x/uWt6%4HkAXׂ ~Qy-Ꙍ 8+[ׂ5.H]pL6>/EW#X66`!cavpF0L6d /zjF0ِ1x mmc!d#Ʉ!41Bh#Dm#!2,{m ׍X7B6B!cp!FFJ6_\8ib FF(J6d S716l9mbdCBPPl#l|>U6ړ>_^hmWhm'2kګm6ړ )^m=ўln6ګm6:雧0 f;jdC06B16;PObhmt6: [~[AmсlmtPmt$`訶H6d Q a#]}Ck#ёljdCu#Qm#щl,hS:9F'lِ1xF'NF'!c9S:mt6: mtRmVkbFFF6d N 00l#l hFF6d Ymt&MVzYԍΰntVmt&2a{Fgl3ِ1)6:cɆFghFgl#l[rD.F8jF8ِ1̜댑&'16±p!c9%)jF8ِ16W6n8"~ӰM.j].dC0{}ܧ'16`]Ȇ.pN颶B6d ^7@]6`]FE8L1ĆN&FWl+ِ1)]6b]Ɇ甮pN骶J6d n+Um+эl\<d7~F7lِ1nF7nF7!cpݠnjݰndCh7hF7l;h_oM~lHv'mt6 :c8l>쮶N6d otFwFw!cFwFpzMj=dCu=6z`=Ȇ衶A6d ދ6zm6z :iuMyՓlj}>dCFoQm!2S@}6`}6VM젾젾j}dCu/}6b}Ɇ 髶K6d ^7B}6bQdҬ31Ĝ((l#lFmD }E((l#l| mDmDm8>g!g~j"]_ \G;0O[~~Syqty?\=36z~g_}zПv׃@=fcWA!c>?_m?1l6c+blcِ1~9@mc1l{jdC6@6`FFEeb 돁p1H6d 5i Tm $2#™d@lc ِ1x91D6/m1Hm Rm "2?c~&za71 F6d 6aȆao1 F6d nc1LmcK6thb:sSbɆXXl#l| ۱jF,ِ1x݈u#Vm#ۈ%2 mĪmbqd#/%qnmđ ? 6Ⰽ8!cFFG6d n#ڈSۈ6eca1N6d nc81\mc81l{jñdC06r:c8lZ2plc([&N)#6F`#ȆazѶ5Jbm 2#`1A6d c#3Fbv16F`#Okb; NHH!c}pnHlc$ِ1HH!cE16NpSwCkc$O6۴[/F<jF<ِ1xxl#l|NsJF<O6d c3Æ9I鑻m"R<11F9y2lRm"21 1 E6d ^7F1Jmc1l|NQj/{s#A}%l#lHFF@6d ^7`HPH6ȆF j hqqKc&w4&whlc4ِ1h/:Zmc41lnuchlc4ِ1!]U .chm6ƐG ]xcbuc c6`cȆ{11C6d ^71Fmc 1lhclc,ٸ۰ǂM^cɆ c6bcɆE}ѱjcdCuc,c6bcɆm6ƪm6F’9ԍDa;@2Qm#H$2n$m$bdC{p|5P(ww-JKN!,@! Kb=kSfr~sλ9}3kֺmI?MOc-_>q=XLg_`1tX`1Ɂb(bZb\ԃٺ8q+^ ѵPX:cXXB6d c.=%!cpK%jK%dC ;c8lTOx16`KƆfdb,6BK6bKɆRX7m,6 X m,UXm,%21Rq.chm,6}jX&ze\ XF6d MeN6aȆצt2lcِ1Lݨ.дOx16aƾc01֍j˱dCuc96cɆrX7m,6 ԍ_4bhm,6VEeb+  !c]16lPXm 2XXA6d c3׵KZ+dX)攕pNYXI6d ދJJ!c9e%SVm6V X mTXm"?jT>cSV9e*lcِ1xX*U*!c ֍UjUdC6VA6VandBG01܄ 7hMm p#27`ᦶm  7X76ܰ 7!cpnІچltoKjj!c93FS}ܪCkc5lnucjlc5ِ1:3bhm6ƽ\[7p6ܡ w wlÝlnú᮶m ߗpWp6ɆmCj1lJ;cE^tlc ِ1\]16hfXm!2XXC6d nc Fmc A6eeL kX lÃlnxᡶmx )pNP6<Ȇ oxmx`krU01֊֍jkdCkصp Vmc-lZhcZlc-ِ1Zv7:iy:zF&fV6vN˘elele2cckgo;`YY-c-cG,c@a<ƥؙcS8OX<58Oq2<穮qyR1z=58Oq2;p=Ag_`;vz|/| ߡ׃$B=cP؁m$CNuS;aSmc'lNhcNlc'ِ1NoSmc'l|mMwm6?~|cbx놗چE6d n R6Ȇ{L/czmxa^dC=S6]dcb 01v ]j]dC6vA6vaȆm6vm6v ׍]nR؅m&ɦ,`c ;wm6v [}nn!cpjdCnoV؍mxw}- ooxmxcdCHʗ7ٰ/o olÛl|m W'j؆7ِ1 oh[m!Y4gG X7|6| !c=-壶m  X7|6| !c} o᣶m!kwxvcboQ؃m!2%FG ؃m!2_k=j{=dCoQ؃m%ӺW mU؋m%23FTݬ؋m%2S9e^lc/ِ1^>=M}>hc>lcِ1;@wS؇m#27m6 mS؇m'/Rf_a/_mc?l|Sm6 a_mc?l.ljO6lS~\F㦙!cggm6 )r@mqlnul×l4\3& mmbdCu _ _l×lnº᫶m }Q_ _l وJp-Q9&A=װ6bɆT@X8q8H6d c3ƎKKޑ2^ A!cq֍j ?ѱw~n᧶m  ?X76 ?!c5\ma~dC{_~pOm8D6n_8$):!lِ1C!C!!c9Sm6 }{_6adcPW+.117so,mcdC6 lßlnú᯶m  X76dn8,aX7m6 8 mV8m&27~al0ِ1a1wAn&g/jl!#jG#dCs8Q8m!2S9lِ1##FHb{֘9Ŝa{FF@6d n#P6ȆFjFِ1h#@m#$s|ib:t $:mbdCau@@l#l|+}mbdCk@ TF}?L=cq Xeeee,2v2v2n;gEZƢ,c-cіEXeee,2v2v2v2v~ qs[}s }s웃5.׸ q2`qAQ1x 5.H]p 'c/A`A;[L`,0|?Xm#&2 mmcdC`V6Ɇa:_[>^ `l((pg&QU8m%2q8q8J6d ^7ºqTm(qlnuQ C^̳uuLrL-]9xuǠcj/g}sT519?Ar;c腈k:!NzBg_ Q; @!j!Bl8ƽ}&qa8q\m8qlIEd0ql8ِ1qq!c8+m6N#51N'j'dC} 8P8m 2q8q8A6d ^7NqBmJ6"bߥ01B4vjF(ِ1{C{C6BP!c}Pom _ ׂC6Bd}EGLnuIl$ِ1x8 II!cp'j'dC0sJg L/Ilٸ~ӑ`XkSjSdC0t8c$oà`ZSdCR8m"2`8q 8M6Ї)LbN9 jdCu46NcɆӰ8q8M6d n4qZm4F6uK&FmmaadCׂ00l#l|N sJFF6d ދ^4Lm# 8C6~ -TiqqF8mQ8m!2g`8q8C6d ^7qFm ql^3^3jgd#QY.gE/zg6bgɆYX7Ϊm6Β 8 mU8m%2ga8q's;)`bFF8N6d /E6±p!ckhZF8N6d n#W6Αkcbu6aȆspN9q8G6d nqNmql9h9l#lnx!FjFِ1h#Bm#ۈ 2_F5lFA6d n#ڈPۈ6"F>3_ƙF$mD ۈ6"6"H!cuJ$\DmDbdCS"HHl#lЗQFmD ۈ66(!c^4 QjQFِ1F߈Rۈ6Γ2}kLebyy!cp硍j籍dCu<6cɆyX7Ϋm6ƑۙrkbD FF4M6d n#ڈVۈ6ɆF4jF4ِ1Lݨa{#Zm#ۈ!uz#Ĩm`1dC6bl#l|)1j1F ِ1x/{l~.#7.~lِ132326.`ȆX7.m\6. )rAmqlS\OMyyjdCu"6.bɆm\6.m\6. _{6.bd&+bWF,K6d g c6bX!c9%)jF,ِ1Xh#Vm#۸D6X䕉qI)rImql%h%lِ1:\\R۸m\"2q ڸq ۸L6Vp4>&ea2qYm2qlIE jdC6.C6.cɆ{˰qۈ#cĈsJS6Ⰽ8!c~#qjqFِ1x88l#lFgx8 H Yg+vI<+`wVwp+vɿ~"ਣ>Wg<ٿ*#\*91xyq׃$B}UG\U۸m\#Cĸ&l\6m\6 #| #|MmqlkjװkdC`ݸq ۸N6Vζ,:q]aq]m:qln\uul:ِ1xq6cɆ7|~ou {_{_ozq7-c,c-cw,cw-cZY[XZ=====m{n{a{i2222222222ޗT=5s!j Xnk \nP1w׸Td ^nwC]nwjJ7Z醺Mĸ)z7q۸I6d >݄MM!cp7j7dCMT۸m"ڔ(-q˹f>rl>rKmqlz-x-lِ1[-[-!cnnm6n gYLbo6ܛq۸M6d n6q[m6ql|}om6n )r[m6ql qi,t Blِ17{Gmql=w{Vm6 ܁{1w6`wƙI '21~.7m6 ?#s>#sWm.ql|N 画jwdCs]8U۸mI6Z޴:$xmmI6d ^7uO??Ɇ?ƟƟdCuOX7T۸G6K<%qOa5={=!cp{j{dC{={=!cq֍{jd[`bw{֍b'/RB֍jdCkp {_m>ql}h}l>ِ1xݸ}8M@UMbSm<6 Su!c~7m<6 ׍nk؇jƧ 41u/X7R lIE t_ja )9/ȆEmm<"3*8kb<#؋>Rxm<"2`xxD6d nHmlGGjd#MMchcl1ِ1E=G)/cl1ِ1cc!c^1Em<6N|_x"'jO'dCu O6`OȆ7'jO'dCoUxm<%2xxF6h\~vME^3lِ13Lml3h3lِ1\>SxmM6#7mmM6d NSVljc S딿66 ?&sa9\m9lnϾ9xٺ`+:]({%Wx>p=xEg_s++\^["^zDWWjdפKUmobsk8WVxm&2xxM6d >Wskk!cpkl ppx#l6ިm6ސ o`Fm lhl ِ177[1WɺoEUxm%2-[l-ِ1-2ުm6ޒ oaVm-l7~;lِ1xx;w;!c~7ީm6ޑ xmSxm'4۽i<[l$ $6Y!{l=ِ1LU7u4ZﱍdCs{8Wxm'2QwƋ@6ҌG\ヸR?m|6> Amln|ulِ1x6>`Ʋ61>:{QsGa. 6>bɆ甏pNH6d LGLGG!c$G'B:D 6>aȆ'X7>m|6> `/Iml'h'l3ؼ:$HsN1g(^]F~gl3ِ1gYm3lghgl3ِ1gvIJ#xgG}GBX"XbXXRX2XrX XJX*˘e,e,eXZX:XzXXFX&XfXXVX6XvX˘e,e,e[Xn}?_?~)+ߧKN!&7Jz9u X&%pE5Nָ'N ɆoO^Е5UBFB!cp j dC6B 6b Ɇm$6m$6'>HDoNHD6d n#Hm#lF"h#F"l#ِ1xoF6a}wXH m$VHm$&29Fbl#1ِ1FbFb!c=Įh7Fbl# h>o L$Fh#Fl# ِ1- ٰMmI6`IȆp=$jI$dCu# I6`IF쳗:01 IjIdCsJR8$UHm$%2HHJ6d ~{RWt{RF2ѣudsJFFF!c9%#S2md62 T'DF&LF&!cgr3gr3md62 ׍LndRȄmd"2`Ȥ L6 Kz,FfX72md62 )ᜒYm#3lndu#Ffl#3ِ1FfFqoniL,=-sa3 ٰ]̢B6d װY6`YȆFX7md6 )YEm# l {&FVߙwfUȊmd%2FRUm#+lFVh#FVl#+ِ1FVUm#+liM)Mm#l{ljٰldC6A6aȆmd6md6ɾ5 51p#Fvl#;ِ1^jٱdC6C6cɆmd6md6r] 9DFF!c֍j9dC6r@96r`9Ȇȡp%&4oSԍnTȉm$2_k؜j9dCk؜p Sm#'lnu#FNl#X_&F.Q7rKm#lntqpذn"F.l#ِ1xF.\F.!cp\joɆy-ƷƷdCu[X7UlƷƷjbߒ Vm[l#7؛~+# 7rm6r ]16 ŋM6d n#7[m#7l|SrmF}?L{<嵌}ogo+`2V2V2V2V2V2V2eeeeeeeeeeeeeeeee0yU>+s#l#ِ1C/ȇm#2ȧO6XwS#S9%F~l#?ِ1F~F~!c`'%?ٰjdCF~oWȏm C[`(Q(@6d ~].X@mQl)I)@6l'Flِ1xQ6 m8<[7|@˳u?;]9x|x?j?'z)Qwp~SWs>[sPp=(H|\A)zŻ= ³_P} zPξAA\ u1"G:NjQ׃$BsEA8WT(m"ɟeiQG BdöaPHmQlF!hF!lِ1BF!BF!!cpBjdcAQV|61 >0# m6 aQXm0QlFmg Z gsJQFQ!cG-g 'gbhm6 _') U(m#11OsEߟ*Q (F6d nQLmQl ܯnb8l84L'^ bF1!c~7m6~$>7,ۓѹN1'GaLQmGlG!cp?B?mmH6d 3pU,^ ɆaF>g4#QlT[۴&Fqg07'{m6 (mW(m'2m~~Ck8QlnuFql޺i&F N))%6J`%Ȇ{-Q(A6d Q3!OO//F lِ1F FI(u"3%s%Fo&j%dCu$%6Jb%Ɇa_\bhm6J _C+ T(m"Qú%nbu6JaȆm6Jm6J (mR(m"2Q (Q (M6:?|;S.~fN)M6ᅋ6JcɆm6Jm6J WWZm4Ql|4(Q(C6n)QF\O)Q(m!2Q(Q(C6d n QFm Ql(2jedc/71ʊ)ejedChY؋U(m%2ׯ,ׯFYl,ِ1R)e6bˏc01ʉgdgdʩm6ʑ #\#\NmQlrrj對rdCsJ98S(m'{jSQ^a/Z^mnUON/Fu ~7ajXQ2V2V2V2V2V2V222222eeeeeeeeeeeeeeeeee[1C^5̳uA!/Հ^ uealI|ՀP׳zfWv>[Wp5UbuՠX76!j9e#SBky&j~M<դ/cy&jZMr c&QS-&ju1j5Zdֲg+751jut-Q ۨE6d ~-\KmQl|oܛQ ۨE6d sp8Ox16jaMLJxMڢnԆuFml6ِ1xݨ FmFm!cpjdCu66jcu.QGFlِ1xݨF:F!c9Sm6 aˣ:uȆQ:judڛuEݨ F]F]!cpujudC6Bu6buɆa_(/F]l܎j:DQ6aȆzpNQۨG6d c3F&CkQld#Og f4CkQl$rKĨ/pNQۨO6d ^7úQ_m>QlߨjdCpaż>ٰjd㏏}^ab4sJ84Phm4 2hh@6d 76Phm4 2 Ȇ6Phm4${8^jb4sJC84Thm4$2hhH6d ^7ºPm!ѐlfH vm46 <#Ĝ)6aȆm46m46 `Hmшl.H  FFc)`b4u16cɆ{ưmhL6d n1Xm1јlFchFcl G\L&n4uFl ِ1gMgM6`MȆ&pNihB6d kFl'QiG? ?A?mmD6d ^7~u'Ȇmmِ1\įzџ6~6#-7Th m4Uhm4%27~FSl)ِ1WSTm)єlxq|dx16bF=ƚD 6aȆm46m46 ׍fn4Shm4#25PLmќlgoqu\ԍn4Whm4'2hhN6d ^7ú\m9ќl|Nijͱdybp}-Ȇj-dCHʶZ \ F !c՜16l/nhA6d ^7ZBmђl\lbsJK8Thm$2E[^FKl%ِ1hK/Rm%ђl.@uFKlWqAh%l6Zm6Z # hm"27Z~F+lِ1\öRhm&Oq61Z; cka~ yRZm6Z aZm5њlnuFkl5ِ1\įj6dcch#;Fl ِ1w{8c8lT=ǭjx16`mȆm6ڨm6ڐ )mFm іl$6%&F[Q7ºVm-іlh jmdC6Bm6bmɆ"~ dF[l٘uh'vhhG6dl)ݎlؖ6aȆװF;lِ1)6aFrU\nbbh^m=ўlnuF{l=ِ1F{F{!cpj6t0$%S LRX-:Et0O噤Avɿg:A};Ͼ9x*o<8+:y\:9^G瞖#:ٷpw#}?:GGt$2^{׃$BkӎpmQm#щll޺&F' wRmt"2nh'b'NF'!c1;mt6: `褶 L6J8tc't&'tVmt&2#:Fgl3ِ1FgFg!c_謶B6HEԍ.ntQmt!2g gFl ِ1~gEm хlFhFl+٨{﷙]E FWFW!c~+7mt6 ?FWl+ِ1FWF7qɩcLnntuF7lِ1nF7nF7!c ֍njݰndC6A6m8M}ѾE.s lemc262e78xDؤxc?Tlo]|Ӱ+awuk\wq2þu5;8a]]םj鮮q׃l\?}|^zFlِ1=6z`=Ȇp롶A6d 3qp7^ FO'Y}Md#AJdH"Y7zm6z ׍nTm$2=a詶I6d oTm"OW/K< >Kmыl|ܧ륶 E6d nKmыlo^jdc ŵNoFo!c{V{{V{m6z )[m7ћlnuFolT㿂L>FhFlِ1)}6`}Ȇm6m6 EnQm%3;]*+zѾK6d ^7ºWm/їlF_hF_l/ِ1F_F?H5'l6m6 ׍~nSm#2pm6 )OmџlaZi诶O6d S6cɆ{O6d ~?Ax?Akb 6@6`Ȇ7jdCuc6`ȆpN1H6M&@q@x@@!cA ߃1H6d ~@x@@!c9e Sm 6 g[mb uc6aȆA1D6d ދ A !c_ՍAjd̗qMκab &MjdCVm &2S9e`lc0ِ1`Q݈q&Q71Dmc1ln uclcِ1x!!c_1J6N51T{C6bCɆ{ѡ1J6d ^7º1Tmc(1lPhcPlc٠7Ma{ajðadC6A6aȆװv0lcِ1a0ap7Uc3̇m 6 ::\mc81ln ucplc8ِ1w#Wm tU1B)#2Bmc1lj#dC6F@#6F`#Ȇ"~ T7Fmp<5<[W[7wTL|Þz?g8W>?z3}׃a=Yg\~&2?zZϸL"d kz(!3<71F QjQdC6FA6FaȆ;GQjQdCIF1Jmc1l>>boLb1?Fm6F  mVm&2a1M6d >Vm!in[#blc ِ1c \Qm!2_k1jc1dCs8QmB6vtCIM:7NMm7l7!cmmF6d n7h7߰Ȇ"~ T7~S G6|#\Kfqdqo3L8q8!ckqj㰍qdCs88Sm#2`1O64Lmbp2^mc<1l|Nj㱍dCx؋Wm'25j㱍 dJ Ӛ;@&wLPۘmL 2#Y+T'mL6& ۘmLPۘmL 2S&9elc"hN{p&DQ7&º1Qmc"1lߘjdC6&B6&bɆ"~ dcDlcٸmLov\NRۘmL"2GxGx$lcِ1x1 6&aȆmL6&mLp&}#-bjfn26262626262elelelelelelelelelelelelelele22n[c󰌭f28Zov4YԸɰMV׸ɸM'co2&kd\&S1z{2\oOV׸ɸM'c_ո7Sƃ%SibLS)!c3ÆSx16`SȆmL6mL6 ۘmLQۘmL%#̿<1USa[}2g7Ous\:'[Л+\X\\ٗ1x9:v0׃@031W-b.sI"~ 4WUۘm#M#uTĘ'l̃6m6 ?#3>#3Omc1lyjydC0Xk8lDeTdx16a2O+ԭob=|8kWۘm'2#>b|lc>ِ1u:||!c_)6c FM2mdb,6@ 6` ȆpNYX@6d ^7@mcl|s\XH6w Ŝ) 6b Ɇm,6m,6 _C[-TXm,$25PPmc!l <<{ cx"EjEdCs"8,RXm,"2_.kEjEdCp'}i"lc1xsMbNY jdCH*bgdm,6 X m,VXm,&2aXXB68:cK;cS9elc ِ1xX%!c~c 7m,6 Xm,QXm,%)TTmc)lN16zn ̹gx16bKɆXXJ6d c3z>^ 2R&2acLmcl]{ej˰edCs28,SXm,#2_.kej˰d#Gˮ{Ŝ)6cɆa8c8ltlCkc9l|NYj˱dC{_r ~_;cXXA6d ^7VBmcl hc lcِ1\įj+dHe)+:e%\TXm$2n%|nJlc%ِ1)+6Vb+Ɇm6Vm6V{7db쬂RXm"2`X XE6d ^7VJmcl|cX p#7b&zQ7؋mandC06:;c8lrSp6Ȇnjn؆ِ13wSp6VGŜ)6VcɆjX7Vm6V X mVXm&2_j wфoeb;{Q@p'ɂ5M&'zw wlÝl|}mcdC6ܡ w wlÝlpچ;lĤwXcX5jk5dC6@k6`kȆ5jk5dCpk6`dː31<;<;<6< !cpІچA6d ދz^Cm 2E=`/꡶m%KhbZ؋UXm%2XXK6d nc-Vmc-l] {ѵjk6celelelelelelelelelelele222mZZ,c,cÖ#X0T:j<5T?,^c69yk'qTd k*Ou5Γjk'qk'88OX<5ƫWX'uo^XG6d >:u:!cyשm6֑ F`oNmclLz_ix,chzlc=ِ1zz!c֍j뱍dCpZSWXml [cا6ml66 ?/>/Amcl|/f܋٠@6d ncAmc݆!ٺ/3mW|6El0O=[6'zmODlTo˳u9ߨ>q=D<[VI7,66z փM곿 ׃Mte sYg ]6zMjp=D"d ^6A66aɆ#ff!cb3+6ml66 \Ymc3l|~3ܷ߬B6 =NPbE'[6`[Ȇ{-ܢB6d nc Emc l|?ml6 ~q71 C6B[Ɇml6ml6 Ejd⾓c֚ľ6oMmclI_6aK٦ F6d 6צ6aȆmpN٦ N6fu=&volvv!cpM]mc;lnlucvlc;ِ1\įllW؎m M+dC);CmclIE j;dCpCmclhclc'8˒m&N1sNN!c֍j;dCuc';6vb;Ɇװ;vNlËltU&S⥶mx #)#E6lD6 /!cp^ІچE6d n R6vۛV61v ]j]dCuc6vaȆ]pN٥ E6d ncKmcl Nֳ^cSv9enlc7ِ1336vcɆnX7vm6v a[mc7M6^n;a[66 o!c 놷چ7M6d ^7aV6Ɇ"~ d[m!"vq)ևl>4飶m ~Gm!2>j>؆ِ1 hGmC6I_c7~clcِ1/Gmcl}t{=j{=dCp7m6y+fdbu0%ʉ~^lc/ِ1u{u{6b{Ɇm6m6 ׍nU؋m#Yއ=9u'>X7m6 `Omcl|N}j}dCyOmclxt-.ׯO6^논Gx~lc?ِ1~~!c8l$HQp]v⧽ƋO6d >s~VMnulِ1xq6`Ȇ):lِ1\įlP8mL8kb:mK6f K_hj؆/ِ1xuWm%2/|چ/K6d ~/Wm8H6ϮnqPԍnT8m$2a8q8H6d u}T8m$25P8q#A<61 ?hOm#2mma~dCཨE6 ?!c_S6?dqH6aȆm6m6 8mR8m"2_kCj avL aW6Ɇ omcdCs?S6 !c~ja!odk&aa0qXm0qlnual0ِ1:0\V8m&2a8qnpLR5L(Zs$_3IG#jGWq>tV#~S3IG9?>Gp=s>ڈ9z =fz@g_sE+p= 2+\H"~ d#@m#$ks6@@l#lF m 66@!c_Tp[nǻ8,XƎ[NXB-c'-c,c-ca3p9Xe,2e;oX.X.Zb-c,c-cq+kQmS? Q` R׸ \エ}PD5N R׸ \エqAx &&F mmcdC6``l#l| _F0L6d n#V6?;>fbptTm(qlQhQl(ِ1QQ!cpGjGcd#SDg/Mc1h1lِ1x| 6aȆcpN9q 8F6d k 6a!dý&FSBm 6B6B!cm g.g.Dm#8N6p{㸨a8q8N6d >sqq!c98Sm6 ׍nW8m ^:98! X7Nm6N 8mP8m 2 lِ1\įP8m]5L(bCڡjF(ِ1 PPl#lnºm ԍC6Bd# N㤨'a8q8I6d  '6Nb'Ɇm6Nm6N Ehm6NzG'rKab6NA6NaȆ9v s)lِ1x/z 6NaȆ"~ ԋR8m&᳢p11N^4EOm6N aqZm4qlnuil4ِ1=$=$6Ncadݣ?51Du#Lm# #2anmaadC6 00l#l hFql2g33!c~ 7Ψm6ΐ 8mQ8m!2q8q8K6}&Y1sYY!c9,SΪm6Β 8 mU8m%25jgp,Y#\a6\m#'2&7>m  W6ɆmCj91]ȆS8m#2`8q8G6d ^7qNmql|rSΩm6"=Ĉu#֍l#ܽ*bkGkGmD`>Vۈ6"6"sG#yFI6)&FE#a/mD ׍HX7"6"H!c[wDض.E\0Oٺ  vɿߺypT.7Oٺ _P \s~x´3.E6>q=Hg_I.$.zpǼ{̋jq=H"d ~ "vQm"K6{WPE#id#pẠrUۈ6bɆmBjF,ِ1Xh#Vm#ۈ%2nO,nOF,qld&%6.aȆ%lِ1xy $6.aȆ"~ 4\R۸m\&mnlZĸ,y|el2ِ1xy6.cɆeX7.m\6. )rYm2G6K6eYm#NM4Nm#ۈ#2qnĩmaqdC6⠍88l#l|3wƩmaWFY\gb\qMMݸB6l7q۸B6d n*S!@ BM@{]ޫT4^T:"]@z!@hB 5Nj^=zϳYf޳BW6bWɆm\6m\6 ۸ m\U۸m\#?4=YkDݸ5k5!c9Sm\6 `qMmql߸kjװdc`LA=٥٥6cɆ):ul:ِ1xݸuu!cq֍jױda671nq֍j7dC݀P۸m 2&|& lِ1xݸ va.a'si9eee,2v2mkgo=====ZƞZƞY,c疱K+kee|Hq.Hhd"řљk\$8pT׸H\"7QEI5NHގT׸H<$C-ĸ)~ ﻩq۸I6d ܛ=76nb7Ɇ翛pq۸I6d >݄M-1_41nnm6n o-[-!com6n ׍[nR۸m&+h47bڀ&}}}}!cul}}!cq֍jdCu>6c1dʫ=w71bD/{l#l7qF C6d ^7b`݈Qۈ6bȆoĨm`F6Wlb<؋>Pxm< 2Em<6 xm"A,]}׃XXbbq=%2_µiZD,$B ڈUۈ6[R]7x*抧pxxJ6d i=Uxm<%2?)چ;N6d 6ܱ w!c Cj؆;ِ1 wh]m n?CP6<Ȇj؆ِ1 hCm 2E{j؆'٨zΘnxº᩶mx 6<6< O!c^j؆'ِ1@O O C^^d#^l^j^v>~zp^R;;0l^eýهl^kA*yAjAFِ1x/{ l#lFm 66`qnL`o~#Xm#&2 >[m 66`!cpFF0B64"7BFFB6d ^7B`Q6BȆװ!p m 6B6Bd#|+#7~#Fzl#=ِ16N ҫm6ғ ׍nWHm'2H@6><;L Fh#Fl#ِ1;2w,dPȀmd 2Ƞ@6d N)62`FGMققjdC{_WFFF!cpjdC62B62bdcTϝg hF(J6d n#U6BɆmBjF(ِ1@sJF(F6Č&FSm }00l#l hFF6d n# S62712g 2g 2md62 S2uJ&LF&!c ֍LjLdCpo)62ad#dTݳbN sJF8N6d >9%\m#'23{jF8ِ1@u#\m#nw"χl9#2222222222222V2V2V2V2V2eeeeSX gRҖ2ra2S[ys,z̰7ʬqqL5N5.3q5.3q| ׸Td >e_fulq·"̳uɪ7̳uPDZD]pg"`vaw`>ܓq=[gՏ_}?וֹsJNFN!cp9j9dCTȉm"QŽ)gbh.؋Rȅm"2 ȥ E6d n#Km#l]!BѻBrm6r/][{{[m#7l77jdCFnFn!c8ķzjl#ِ16K>afɧG6d n#Om#lF>h#F>l#?٘T5gd sʯ|v~F~!c֍jdCF~F~!c5lWr%(@6z։( 7 jdC0]16lP(m 27 ~Flِ1Fd{W s|1.2_Zdc5'551 d9c$R8Vd(Q(H6d ^7 ºQPm Ql|N)甂jdC{_WAF!׺Ж&F!N))6 aȆ--Q(D6d >sJ!BF!!cBp𢡄F!l0]Iژ]3&mjdC{_WaFa!c90S m6 a/ZXm0Qlxg5M"nuFlِ1)E)E6`EȆFX7m6 (mQ(m|B6tN&'''j` ~OOȆ'n| ِ1x 7>Q(J6VQT( mU(m%2S9FQl(ِ1x( FQFQ!cQ֍jEbdT+F41{{{{m6 ׍bnS(m#2_bjŰbdCpo(Q (N6ZL(q@/a(Q(N6d ~oOqxoOqFq!cQ֍jűdCsJq8W(m|J6nݟ%u_Sg)3TmSlS!cpBm|m|J6d ^7>uSOOɆƧn|)Ql\%`(Q(A6d >sJ F !c3K3Km6J Vm%ȆmVBmx  Am|m|F6d a?S l|N )m|m|F6d ^7>u36ǔ4$$"JE0?w>Ոj%̇{I* W%W[I* ;KyI\J5O9ؑ-HC#J>]}Rjp=(Ed +b8E/yЊ(A)!c8ķA)RFi1Jdǘڴ4\V(m&2+JùFil4ِ1xY6JcɆFil HWSQ(Q(C6d ^7QFm QlFhFl ِ1@uFl,XyQVܗQޗQVm,Ql|,,Q(K6d ^ve6beɆm6ʪm6ʑΗKD(F9rF9!c}rpߢF9lِ1x(F9rF9!cp堍rj6lr;E <| Jʖ*jꖱZږ:zFƖ&f斱V֖6vs_S[z̟SyLyLyu+k\yq2ƕ5<8W^]Wjk\yXʫk\yQ_m>Ql|NjdCpo٨Qh@6vSC1֍j dC6@ 6` Ȇ{mh@6d >4sJFCQGد FCFC!cp j dCu! 6b Ɇm46m4p>}6l]#84Rhda>܍}5kFj̇{~7R_Fo>[;\y#5oAcM YC#ëX}zИAcX4191x"zИD~~j&d_"ŀH-`hhA6d nBmтlfN)a*$F lِ1V BmђlLmbu%-6Zb-ɆhhI6d oFKFK!c8ķlThm"ۘJԍVnRhm"2`h hE6d >sJ+VF+!c8ķVjdc~5cL֢nuFkl5ِ16ZcɆFkX7Zm6Z ׍ְnVhm!>F<>Fm цlnuFl ِ1xm6`mȆ76jmdcu*_51ڊ֍jmdCpg,mɆmF[l-ِ1xh F[F[!c֍jmvdȠ&F; sf;aqF;lِ1x/6aȆE}vjvdCu6m8χ:Fw"?-xtuuuuuuu}n22eeee+X?X@ `P0pH(0m<9Ksj/TᚪƵ5=8m\15̑ NC[מj!i!iqqkO5NkpM^]pn${mbt[AmсlojdCpAmсl7D'H6--.(掰oH6d c+ƭr'H6d 7w}sGFG!c֍jNd$NpN餶 D6d `'`'NF'!c ֍NjNdC6:A6:aUn&Fga3Ym3љl={r;mt6: ׍ΰntVmt&2?;3<;Fgl wZ=M.bN.j].dC.pEm хlFhFl ِ1xF.FW~]a誶J6d >tsJWFW!c=ܮpFWl+ِ1>]WOUm+эl &F7X7mt6 SuJ7nF7!c~7mt6 mtSmt'Λ11..mt6 ]m;ѝlFwhFwl;ِ1FwF1yWC:Sz9Flِ1xFF!cp=j=dCPm$t֪SԍnTm$2詶I6d ދhOFO!cp=j=܈if41>usX7>Wl|9\|99ِ1Aó>Wljm8<[W>[Zv؇lF|v݁pϏg뾀} G|_zЋ{ 0zG/襾p=EW_=f/cR;A/r c+zE1x=A/^ƗdP퟽f71sŗ2|%%ِ1ŗpK//Ɇ{/aRmKlK!cǗn|%ћl1ݩLޢnuFol7ِ1x6zcɆFoX7zm6z ! dFol(3yM>FhFlِ1-m6 ߗޗGmчl|N>j}d@zb6B}6b}Ɇu u﫶K6d n/Wm/їlwwj}Fw(bb|%`WWdCsWpNJm+l+!c~+o|ِ166Ke4_U'F?X7m6 ÝG6lDm6 `Omяl~jdE01֍jdCp_m?џlFhFl?ِ1@FV4M&ac1@mc1ljdCs8 Pm 2`1H6uhx9cˆj ȷo'm 6 } {_6bɆ@X7m 6 m Tm "o=>1HԍAn Rm "2E[b8m1D6d ^71Hmc1l|NAjdc\A1u)ɆVm &2 7m 6 ׍n Vm &2n0|n`lcH={5L!n uclcِ1v\Qm !2oolcِ1v\Qm %&P Pa{cPlc(ِ1PP!c9e(Sm 6 _t(|P0ֲsLan uc0lcِ1a0a0!cpàajðadCuc6aƊ]s421QdTQ,pp!c~c87m 6 m Wm '2C|pPS7Fhu1dLdb6@c6`cȆm6ƨm6Ɛ mQm!2olc,ٸɮ&XWlǒ =Ym}jcdC Um%2hXlc,ِ1j,\SUm#')2.Sd8lcِ1x<6aȆ8X7Ʃm6Ƒ ! 4Sm'Խ21ƻlx8O7^mc<1lxhcxlc<ِ1xx!c8ķlWo|kl]jٺI"0lװZkg뾆Wk~͇{rk5蚿Z험~W=07oLo;iO`]}>>A`ȁ 1׃ $BLLPۘmL$cL/<Ę(1ۘH6d s_b W ]6&bɆ1ۘH6d DX7&mL6& Y<Ę$f'IjIdC}$GLRۘmL"2`ݘ1 ۘD6d 6P1Imc ٘ulT=#Looo66!2߷ߨm|m|C6d ^7uooȆ-ߨm|mL& ^1Ę,lL6&mL6& ۘ mLVۘmL&2_Ldd!c1֍j)dyj&מ1l~a)!cgdgdmL6 ׍)nLQۘmL!2S`ݘ1ۘJ6wmDcSaݘ1ۘJ6d wژmL%2&w*|&wTlc*ِ1~T9Umc*-?.O61g} Vm[l[!c9[8|--ِ1x֍o66%2C|hƷ4QzWùLi4hc4lcِ1336aȆ4X7mL6 ۘmLSۘmL'2;ߑfbLNNWۘmL'2 m: mtlc:ِ1v:\NWۘmL'2E^ttlc٨3ާLǹuc lcِ1xݘ  !cp3j3dC3 LqnOgC1f 3j3dCLoTۘm$2_΄kؙj3dC6fB36fbFZ=|obs,8Rۘm"2_̂YjYdC4i8Kmc1l,hc,lc6وސ=j܏&lac61[mc61l|c6ߘ1ۘM6d >̆sll!c^t6Egm6#=N)9;ﰍȆaz֮N 6m WZaߑ )9;ﰍȆFjmhm|m! Wsss6`sȆ9ߘ1ۘC6d ^71Gmc1l=s{m6撍Qt1W΅s6bsɆ 1ۘK6d ^7º1Wmc.1laz0OCkc.1lx&ِ1|/:_mc>1lߨᴱE}Cژm, ݚbb,p S>|lcِ1/@mcln,uclcِ1Lݨᴑ>`B2$XH6:Ljb,Bo,TXm,$2 aXXH6d ^7ºPmc!l up0'-'chm,6'x{ljcߓ ~{ﱍɆaz7ч%==ِ1r&V166-\|HԍEn,RXm,"2XXD6d ncHmclF&Hmc(I&?g~ ِ1S~Pld|W $dC06j?m8R2rO-c+-c,c-ck,ck-c,c-c,c-c,c-c[,cX~mmf2elelelelelelܗ%T/ ;bָ%׸%Td [[u[kq2%׸%Td ^D]o)hNKZi)~m,6 Ka?Tmc)l|e)cYXJ6d VZ m,UXm,#Q~<椉Lԍen,SXm,#2ߛ]fm,6 Xm,SXm,#2_+-6m,6^w|X.l,6m,6 ׍n,WXm,'2XXN6d >,6m,6~"k:w'a'h'ȆOnِ1[Wo>IbhmmD6d cllذK& o  !c ^XA6d ncBmcl|NYmPXmL6<ҕ;xY'3OgɆm m33ِ13S~VlYmglc%٘6oFHc+aXXI6d nc%Rmc%lJhcJlc%ِ1J*|DB&*Q7VJmcl*hc*lcِ1 )6VaȆm6Vm6Vť]mbuc56VcɆ):ejlc5ِ1xX jj!c^t5Zmc5l\ͦM5bS֨m6֐ ׍5nQXm!2]Eרm6֐ a@k6`kƦwzdbȬȬUXm%2kaXXK6d >sZZ!cpkjkudD=zǚDX:u:!cp렍uj밍udCs:8SXm#27A6aƾKl31֋^t=E׫m6֓ XmWXm'2aXXO6d ~_zhczlc٨Q}D c5m oP؀ml 2ؠ@6d ol !c  Fqjfw^:e#\lT؈ml$2F~jdC66B66bɆ甍F&yUIԍMnlR؄ml"2=e=e&lcِ1M&M&!cpMjdVN%N16ufN٬L6d 3upڰyflc3ِ1x/66cɆ)j-dCL-d#Yxj{])|Fflc ِ1Emc l{-j[-dChcl~w;OaQlF[W shO$16~6~!2S~s/j` m +6`퟽M_]s7~%H~UlmmJ6d LCW RDxZb )Bmml%n8cتJ6d װ[6b[ɆaʮN4Ibhml6 A}d&Umc+lLV4MmlS؆ml#2||6lcِ1Jmj۰mdCs6hc6 C^gFOloPojEwcuov=?~x~>η'p~͇{w=[濩oN4+v 6~kw׃@0=fUW 3$;׃ߡ6~6 XCdC}Fِ1jN8IbhmmA6d vb2ۅvv!cn ܮN6d ^7ú]mc;l|b;]mc;lMhclcِ1x;6v`;Ȇaz̪Nh$16v`;Ȇצ;j;dc e31vvvm6v w;6vb;ɆalTqpp6=u$I6d 6 mT؉m"RvdebeeR؅m"27v~c.lcِ1̜$sZ]dC.hc.lc78y[ԍݰnV؍m&2aحM6d /lRvm6v j=d"m.`boQ؃m!2_k=j{=dC \16?؃m!2_6mps10ayf^9,cZ[m;n;a;i2v2v2v2v2v2v2v2v2v2v2v2v2v2v2vr>^q?b 翽׸Td 텽^uۋk^q2ڸbйk^\R1ָF+fb6A6aȆm6m6 ËuȆاG6d mS؇mI6;01?66$2TlVN7J''ِ1xSmOlc?|ULojdCt>~~!c5~گO6d nc?_mc?H= ]9/1甿66"2_SmmE6d n/h/ȆmmqlLeE〸lِ1^s@mql^H !c}AAoHbbu 6bɆY=Y=q8H6d n qPm ql=mT8m"GW87̷ql[ye1?q8D6d ^7qHmql|rSm6 )Cjd#kMͳ&aыaa!cm\16r%q8L6d oaa!c90qXm0ql[O8]\#dösDmql|8q8B6d ^7qDmqln6m6i76GoGoG6bGɆ産pN9q8J6d /mqTm(qlQhQl٠\i [xLmql1h1lِ11uLmql1h1loQbl|&b7\77ِ166&2_ )mmM6d jcRuOlmb;[w\m8qlqhql8ِ1qq!c5qhqlhx8! X7Nm6N krkrBmql|N9j'dC6N@'6N`'&w21N 'j'dCu$'6Nb'ɆIX7Nm6N +u8qn?ٺٺ?jEw*QG?:h%cý?~x[?k{zD=8)?)2`=8vp ׃S@kSP)S"2+NA6NaƠ_}}6NcɆN=jdCb)Ɇ/il4ِ14qZm4ql$9M>&~g6`gȆX7Ψm6ΐ g`qFm qln6Ψm6ΒIW.gbsY8U8m%2ga8q8K6d >sYY!cq8q8G6&9לbsdö;q8G6d ~?9x?9s9!cq֍sj簍sdC6A6aƂsg 51λE9O6lyl<ِ1y&9q8O6d ^7úq^m܁6m6հĈgD3@6h!cuJ4\DmDcdCsJ4S6h!c mDmDcwƪf3Mn܅u]l.ِ1x/zw6bwɆ画pNq۸K6d mU۸m#vsl51)Y{d#}Lj?grm6 ׍{nS۸m#2qڸq۸G6d >܃6mܳp>u<[zy gÕ}v؇޺j̇{~ѝWfz>>1t+uhC/FQ_\b~x?sA 1@@1j1Đ1FF lSMbܷxx@6d >WHml|NyGjGdCAda>I/_u0pg{0о1`K|K:q¼Pc/9=La|< m$6 O< O\m#9l|KjɱdC}srh#Fr C^)F!KV)"REw{۸KAܦ$u|'/ٺah%꧰_}c8\y 5OAJK&3KXR«R}SzaNv׃@sEJ8WTHAJ!czHp#lnahm tSp6Ȇ%b njn؆ِ1xmmadcyL wQ7apWp6Ɇ;j؆;ِ1FN;8sOCkp'2_GCj؆%&mxmx`dC=1=6< !c3<Й@j؆ِ1mxmx`dw/`bx9)j؆'ِ1 OhSm$2S<⩶mx )Іچ'E6;0: y6 /!c9 )^j^؆ِ1o^pu⥶mx )^Іچl^xP#JRm6R isz*{ZTdCu#6RaȆm6Rm6Fig31..6 o!c 놷چ7M6d nV6ɆmxCj؆lo&C؋:6؆lp~á6dCPp`!cІCmÁm&mi&Fj1sJjFj!cpjdCu#56RcɆm6Rm6|ݰ01|DuGm!2S|⣶m 6|6| !c9Q6|F1n:W _X7|6| _!c{V}=j؆/ِ1 _hWm%26|6| ?<|QU7E#⧶m  ?X76 ?!c/?姶m 66 1a%L 76 !cpІچ?O6d 76 !cpІچ?lx mٹF싦i6`iȆ4pNIHC6d NI)i6`iȆ4F4F٘<Ϳ FjFِ1xu#@m# 26l#lFm%|+#E^4FZl#-ِ1FZFZ!c9%-SҪm6Ғ H mUHm#z'%{{҅SHm#2HHG6d ^7Nm#lF:h#F:l#l)9ب&F7am 66@!c5l \mbdCBjFpX`-#ogF# 7emaAdCAp_4Hm#"2mmaAdCu#R6F)睉L`/ E6`!c FF0L6d  76`!c mmc!dc5741B!ƼQ6BȆϣ Cхm`!dCu#֍l#lFm'{^SuJzFz!cC LHO6d /6cɆFzFq6D#72~#Fl#ِ1WAm#lndu#Fl#ِ1xmdP`|8&y&i|&)#22Ed0>g22Ve^G'9dT_o>ܛ^k׃Pw p3T}Cq=/c3j EEzJ"d ~_F(m^MGlap"Lm# #2iM?6Ȇ0GmaadC}Dmd"<9I`Im#lndu#F&l#ِ1^x&Im#lmdRȄma%Uab9%)jF8ِ1نA8ٰmmcdCsJ8S6±p!cpFF݆ܗM;Esҋ<yGf,l얱\ܖ<|B–"O,cE-c,c-cZJX>jǘ9|a2ָ׸Td љ5.3q| ׸Td e5.e_٘ME(Bm#ۈ 2ߛ{jFِ1xl#l|6"6",d#z!L,Fh#Fl# ِ1xF,F!c,p-Fl# ِ1,F,FVxYFVFV!c5UVʪJ6d 7g}sVFV!cpYjYld#cCLllp6F6l#ِ1lF6lebb@Mb%,IԬU{+jE,~}:G9ףgu^F!!c9S m6 (mR(m&kOz(,FaX7 m6 aQXm0QlFahFal0ِ1x/Z(Q(B6*߱ E`(Q(B6d ^7QDmQl|N)"jE"dCuQDmQlE@&FQ_U(m%2Q(Q(J6d ދhQFQ!cQ(Qp'T&nmcdCwNqWp6Ɇ;j؆;ِ1SІچ;A6N&,C6<6< !cxxmx`dCu  lÃlnx@j؆'p<46< O OlÓl܆'᩶mx z}QO OlÓl6<6< /o}=76 /!c~ ^j^؆ِ1: S6 /!cp^ІچQl$x~yQLԍbnS(m#27~F1lِ1R )6aȆC*mS(m'v&Fql]ql]qFq!cQ֍jűdCu86cɆFqF F 3Mb*Q(A6d nQBmQlF hF lِ1:QBmM67K_|ݷ&ӆݛl>x୶mx ?[ V6ɆmxCj؆7ِ1 mxmxc%Ƹ- ^31JQ֍j%dCu$%6Jb%Ɇ(Q(I6d ދ6Jm6J(7(E6F9cn])RF)!cQ ֍RjRdC6JA6JaȆm6Jm6J ځ[bbu46JcɆ"bV(m&2( 7Jm6J ( mV(m!En sdQij>؆ِ1 hGm!25R_Ck!26|6|69a4o:kyeee2V2V2V2V2V2` շ55YY[ƚXƂ-c!f斱PX XKXe,2aEYK5.ScmΘ?'_Q|aU8_\|\_LK5N~|_u5Ηj|aU8_QlnԇuF}l>ِ1xݨF}F}!c^>Q_m݆!d#I>wj@-]9x[Av)y\4Po߃;I<8:  DIb!l> q=hHg_=fCc6T;hACr c!+E4!1\h"b#. R6Ȇ$AjAFِ1 h#Hm#"2"R6 h$zFphhD6d nHmшlhFjFdC}D#hF#l1t`)LFchFcl1ِ1FcFc!c֍jdCsJchFcl 8nR&Fq?sx?s&F!cpM&jM&dC0{O+6Qhm4!2h&3JZ5U+ukk\+q2q`kqpkE5N׌[kƭ5q`+XZk\+#mĒ ׍XX7b6bX!c bjF,ِ1FF,њlU&FkʜdvRZm6Z E@6Zm6Z )Zm5њln6Zm6FV!Mq9\ȏ# qjqFِ1^L܋Sۈ6ȆFqjqFِ18h#Nm#nW:zwݹ6jm"<ֵ5As<[Q6on]xۨy\9ng^[o۷U/cggڪ-91\m"zЖD6ڪm6ϩZĈ6⡍xxl#l5"^m#ۈ'2mīmcdC%CjF;qlqXkvjvdC6A6aȆF;lِ1V;hF;l=٨E@&F{a=^m=ўl.줴'^m=ўl|ߢ=ܷhhO6d >6ګm6ӎL1$9%Am#H 2 n$m$` dCsJS6!cm$m$`Ə#4A'D:mt6: ìM#16l[6:`ȆצڴFlِ1x蠶H6FT#ImщlF'hF'lِ1xmtRm$ |W01Żể6D!c~#jF"ِ1\ůl$m$bdCu#HTH6:S b2V21:~37:mt6: ÅMɆmזּL6d W6:cɆFghFgl ٘aM.bN.j].dC޻k]6`]ȆFX7mt6 mtQmt%agbtvvUmt%2몶J6d otUmt%2 mtUmt#cQ&F7X7mt6 ׍nntSmt#2Emt6 mtSmt'7_11~;7mt6 a/]m;ѝl|NjݱdC6C6c=ҟ+31z=j=dCsJ8Pm 2衶A6d o6zm6z..V)l6zm6z }{_=6zb=Ɇ甞pN驶I6d ^7zB=6zbȆM^F/hF/lِ1 )6zaȆm6zm6z ׍^F/^Fo_wmbVm&2Sz9Fol7ِ1)6zcɆ mVm![okb>pGmчl|N>j}>dC6@}6`}Ȇ>F>F_1\z&F_񽯾ym6  mUm%2諶K6d g諶G641֍~j~dCF?oSm#2觶G6d o6m6 +'m`bwڈ_?P&jdC6C6cɆE}jdCu?_m?1lg领&qx!cjdCp1:elcِ1xm Pm $]O#cs knH6˃6An Tm $2_ 딁jdC6B6bɆ)j6|iIϓ9晤/aR-Ks.΃v)?|?$} ;/gK7O>%<_sxy2~!aᖱQі1q ,c-c,c-cS,cS-c,c_[Ʀ[ƾͰʹͲͶ}kcky ]7x6!ؔA޳A޳A*6kAz6k@m l27H]g0ٸt&` у6cɆazpg Lq$`lc0ِ1``!c`1cgC!!!c1֍!jC!dC6@C6`CȆJC!jCd#CPP!c%Pa[ Um %211J6d ^7BC6bFR+41 àajðadC0a0!capm0lcِ1x1 1 N6s31 ájñdC{,pp!c=peplc8ِ1phcplcX35nTl1BmPm 2#`1A6d !c11I6מ"E1R mTm$2EG^tHlc$ِ1x HH!cp#j#Qd[/oebRm"21 1 E6d ދ(Q(!c^t1Jmc1l ca1M6d nc41Zmc41l|N jdC6FC6Fcc~ObM1Zxuglc ِ1x/:c6`cȆX7ƨm6Ɛ mQm%cXX!c1֍jcdCkرp ;Vmc,1l|k,1Vmc,1l8>JQ1Nw9Nmc1l|2SƩm6Ƒ mSm#2㠍qj㰍d#]c/ƛExx!c..ǫm6Ɠ nx1͹eF6꙼j4lcِ1x1 6aȆ4X7mL6 ۘmLSۘm|M6m0_údCSSVlj_c_ 9j_cƦǽ&tymL6 a1]mc:1l||:31ۘN6d oL6mLpϾ9xjvo\f9҆a bbܷ>3p=Ag_s 8WP; r cs1gE`1 hc lc&p|}1S5Vj3dCpaKdöD1ۘI6d 9wTۘm$2+fB36fbʓ}ib=,cRۘm"2: ^_1 ۘE6d Ĝ},Y,!cpYjdc$M⾌jdCpa'e6ٰjdCsl8Vۘm&2_Ά6fm6%OySsʷjbߒ ׍oaVm[l[!c_?%>--ِ1oo66損sĜ2)s6`sȆalD8c8lt?'16`sȆX7m6 _{mQۘm%?h1Ę+\X7m6 w΅s6bsɆߘ1ۘK6d o̅6m̵p+!xg<{<[XZY[ƾ----}o[g222222222222~yTf/b_#͟<1ِ̓1^|3_mc>1l|hc|lc(bcMj dCtk: 6` Ȇ*~ dclcِ1j@mclݴLBhcBlc!ِ1BB!ck j dCuc!Pmc!ljw˘ &"acHmcl"hc"lcِ1E"E"!cXXL6NwDcXo/jdC6C6cɆpNYXL6d Xl?RI&wߩm|m|G6d n;h;ﰍȆwn|ِ1xNm;lc x3SL%bNY%jK%dCtK>%!c_Ս%jK%dC6@K6`KΒ3[v)?}+웃f?ޕyptοWq=XG<`}zľ:oN}zξ:X֩`91\X׃u$Bs:hc:lQ[y?^j?`? Mk6~6~ 2xj?`? __Amlc=x<`Ȟ&zq m=^mc=lnuczlc=ِ1zo^mc=l|X@66Tp ;7blcِ1  !ckh5 j dC=hclc#sH)ו&FFFF!cpjdC돍pQmc#lmlT؈ml"f5bI)Imcl&hc&lcِ1x&M&!c ؤ l֦ /716=pOkflcYfhcflcY|S6ml66ml66ml6{"X7ml6 ?>Emc l@s-!c9e Emc lY{u&VыnVV!cpCuc+[ɆVhcVlch1zc ئ F6d >ls6m6!cp۠mj۰mdCkm6mv)`blvolW؎ml'2ml6 )ᜲ]mc;lnl6ml6v;!ְ;vlcِ1x!c֍j;dC;j;dcf/&NQ7vºSmc'l};wm6v Uh|Nlc'ِ1x mT؉m"Q2jb.oR؅m"2Sv9e.lcِ1 )6vaȆ].]v7my؏},c,c?[Z~j;g;o`hdlb~Tp|!ms-pۭqqM5Nn8V׸ݸ'ch7vkn\vS1ָ{q41}=pnlcِ1{6`{Ȇ׌m6 {=j{ƊꎛgME֍6~6~$2Gxj?b? U@uGɆp6~TK6cGm/Gm^lc/ِ1x ^^!cy/m6 ){j{}d^hbuc6aȆ}>lcِ1}>}>!cp}jd)}&~ l~q|sϏ˓_mc?ljdC6C6cɆm6m6~"]&Ob/'OOdC0{ׯ9$OOdC5Im'l'!c^'h'dc&!ijuu6`Ȇ8q8@6d nq@mqln6m6~&7~j?c? ׍aYmglg!cp?C?mmL6d 3A*HC&AuAsR,!AA!cq֍jdCAA!cq8qn/E_Wٺ_`E-sg~k_~;0O>[ E}}sgOn/>zpo+w>j!?!:2`=8vp׃C@{ZCjp=8D"d ^A6aFӒ˲71p/al0ِ1=$=$6cɆ*~ 6=q8L6d ?&qXm0ql} 1Ylِ1=G=G6`GȆX7m6 ׍##Qqe-OGE8 QQ!c9(Sm6 8 mU8m%2q8q8F6i㘨`8q 8F6d >s1c1!cS8m#2v 8q 8N6ڼ=q\ܳz޳z\m8qlqhql8ِ1LQl^MG?q8N6d n8q\m8ql8s& 1s  !cp'j'dCs 8P8m 2SN@'6N`'Ö59obIN$'6Nb'Ɇm6Nm6N i{Z'6Nb'ɆIhIl!mc/S)S)!cpSjSdCu6NaȆOA6NaFssy_61N^4EOm6N 8 mV8m&2Nr^'9q8M6d ^7NC6NcgFGGbbu g6`gȆm6Ψm6ΐ )grFm qlhl,P݋WM= {ѳjgdCgYY!c_틞U8m%2q8ql=+ƯƯdC6~6~UlmmJ6d nWhW_sdc𖧶nb9s9!c=sp9lِ1xq6aȆm6Ωm6ΓFibyoW8m'27~yl<ِ1336cɆm6Ϋm6.SX\ j dC6.@6.`Ȇ ߸q۸@6d nqAmqlЛVEE!cpjdCEo\T۸m\$2qڸq۸D6{&%qo%xo%K%!cpKjKdC6.A6.aȆ߸m\R۸m\&kyqYS.uee!c^2E/m\6. ۸ m\V۸m\&2j+dڮW63IWF=K!oܾq۸B6d ^7qEm ql| q۸B6d ~ qEm ٸ=lG&onoja o7~S looja ?ova70W-fn2v2v2v2v2v2v2v2eeeeeeeeeeO K+k[_w\Gw5<6NW}yF*8.] UukUq2qWaqWqJ5Np}U]wjkUX㮪kU<]#&5Ow ]S۸m\#2^|^5lِ1x| 6aȆk5kuQWwE߭q۸N6d ^7úq]m:qld#+g oӽ>q۸N6d ~uhu C^gg~sEna}wljdٺagn?|wxWq=A|1^z7 vC}ozpξ7: \nUH  2+n@76n`7q[R61n>&#nm6n om6n ~~Sm&ql| mT۸m"gW11nk:qKmqln܂u-lِ1xy 6naȆnA6naF6ĸ-l܆6nm6n EHchm6n CrCr[m6qlmhml84qGظmQ۸m!2s^ӹq۸C6d ^7qGmql߸mQ۸m%_w/4qW߅w6bwɆm܅6m6 UhO]l.ِ1xݸ mU۸m#. 'WNzbu6aȆm܃6m6 Su={=!cqڸqldt"ɕd&b\ِ1??66 2dC??66KI'71 jdC~}}!c~>7m6 )jdc^.˅RD6`Ȇװlِ1)6`Ȇm<6m<6և#Nib<Co<6m<6Sr$ox*zѧ}xJ6d ^7ºTm)l@sSS!cpOjOgdR:]_g01953aKy xF6d ^7Lml@u3lِ1 x xN6/x.pNyxN6d n9\m9lnkh5jdC6>@6>`Ȇm|6>m|6> ߗnޗ/^aHs$%}fKnsZRYR[XZY[2X2Z2Y2[ƲXƲZ>ee尌崌岌嶌屌嵌Y/]څ͟S7>%qCI_$n$qC=:qIR'K1`K?1 ո;u 8%%ߝ}TH m$UHm$%2/FRl#)ِ1nZpRFR!c=FRF2ygǹɄdF2dF2!c5U27J HF6d Wv ٰ]>H HF6d ~/Lm#]iIO37 ?S ln|gja )93ϰȆϠ6>6 ,{Oygнg6cɆFrX7m$6 )ᜒ\m#9l|NIm$WHm _Upqm7vQp6\Ȇ33碶m UȆچ B6d >@.j.F qi&F 1sJ F !c֍j)dC{1)^L F !cHHI6ƻ?HR)a/Rm#%lH j)dCFJoTHm$2Hp%/11\EpuUmp%2nmbdC6\ W WlÕlu6\6\TdQeMTnu#F*l#ِ1\TdF4F*l#ِ1}}6RaȆF*h#F*l#58_Or&FjNI )6RcɆpNIHM6d WkZm#5ln6Rm6Ґ9XH#FX7Ҩm6Ґ Å!?4ji4dC6@i6`iȆ)i4jid#U&FZM װi6biɆHHK6d n#-Vm#-lqZh#FZl#(B21 頍tj鰍tdCȤsCȤSHm#2_æktj鰍tdCu#Nm#ld*_HƟKKHO6d aI?HO6d ^7ú^m#=lFzh#Fzl#X1L j dC0u#a j dC62@62`Ȇ{ F FF-~҃>&FF7ݺnu62bɆȨH6d >dsJFFF!cpjLd[?#2md62 `Im#l|#Ȥ D6d >d62md62[ƿۓ }'Ffl#3ِ1FfYm#3l|N jdCFfFk@ފmM,ndu#Fl# ِ1\IB6l'%Fl# ِ1)Y6`YȆE@Y6`YPoǽ&FVQ7ºUm#+lndu#FVl#+ِ1x FVFV!ckg6mdp<9H$,a =Zv?ypw~v݁9xJvޡn??g>s9׃ltNY6q=C/smjltm]U6φA6:2`=Ȧv ׃l@d"Ed 1\ Ȧ N6/}`bd~gvFv!civX#md6 a]m#;l|ȮA6HM}#ȡA6d ^7rCm#lFh#Fl#ِ1xmPȁm$K)9#FNl#'ِ1x FNFN!c3'1sm6r i6rm6r-[W-%l6rm6r mRȅm"2 ȥ E6d ^7rA6raƵ4-pNɭM6d >sJnFn!cpjdCpp@6rm6;d/lbkhy6`yȆFX7m6 mQȃm!2ȣK6%>~0+攼pNɫK6d n#/Wm#/lF^h#F^l#/ِ1ȫp# {ޡ&78mandCsS6ܰ 7!cpnІچF6d ^7ܠ 7 7l#xBP#S9%F>l#ِ1xF>|F>!cp|j|dC{|j69FxgG~{< X Zƾ[<,c1/X1XqX ˘eeeeeeeeeeeeeeee~T6)(5.?8_]j}׸Td 5._ѷLFhFlِ1FF!ck?ൟjdCQhFl ٨~7&FAglNJAakJ m6 (mT(m$2 FAl ِ1|ws Ck H65H Plo_m|m|A6d WkdC068cmCk l8Xa_+Q(Q(D6d nQHmQl|MU m6 y)6 awq/oDFaFa!cw*,Q(L6d WkQXm0Ql{V1j"d#hԸQ&FSQ(m!27~Flِ1:\Q(m!2y'9qG(m%v8G(GFQl(ِ1FQFQ!c_E6bEɆFQX7m6Ưkcb놻چ;N6d VɆmcdCu w wlÝl܆;᮶mxobxg[究mx UCj؆'ِ1x O OlËlr8nK%xmxa^dCkX/R6Ȇװ^p 륶mx a`R6 ځhbkbp [LmQlfNtpyϻ΢(m#27~F1lِ1xQ (Q (N6V$(.FqX7m6 ׍nW(m'2Q(Q(N6d c##l(nxȫy2Fl,H_C&FYQ7ºQVm,QlFYhFYl,ِ1VBtz'16beɆaltp82#}d F9q4&F9aQNmQlF9hF9lِ1L/#տ^(m#2`(Q(O6&&Fy1sJyFy!ckj屍dCsJy8W(m'2Qu'>2Fylh6UFlِ1 F F!cp j dCsJ8TPۨmT$/J1Ĩ(攊pNQۨH6d >TsJEFE!cuJENQۨH6d 13M)~Ck"QlvNQ ڨQ ۨD6d ~h%xh%JF%!c**mT6* ԍ`g =lI JFepr FeFe!c92S*mT6* ۨ mTVۨmT&2mz'16*cUF[KL*FhFl ِ1*F*F!c~ 7mT6 # [JW!t*FUb)#M {ѪjUdCFUoTUۨmT%2UaݨQۨJ6d o4rpبVOObhmT6ǎ/K61 ՠjjհjdC6A6aȆF5X7mT6 ha`I jFuş[.119:SmT6 #\#\]m:QlFuhFul:ِ1;@km6c>dwM&>nm`>dC7|6| !cp>ІچC6d BhGmn{?0}?=~1X-XmXX]X=Xe,2V222dkdklkb XƚZƚYƚ[B-c-,c--capXe,2ey?/ոt_s{|58_q2qk/qTd ^|aU8_\|竮qx#I76~5?xچG6d 7Om#2_S5چG6d w?hOmۨA6;dbpFרA6l.Pۨm 2kF lِ1556j`5ȆF hF l&}4SLbMUjm6j ۨ mTۨm$25н56jb5ɆMVڨQ' Z3gd6 !c9)j؆?ِ1x  lßl܆?᯶m";`ݨQ ۨE6d nQKmQl|NZjZdCsJ-hF-l68s׋&Fm}HdcmFm!cpjdCu66jcɆ)RڨQnWl l]X-EԱ0On]r`vP<ǃuuٯ>ug<5J<8:uuG,CXօkӺ_׃te oQ[U;A]r c__TW-.uI犺F]F=Q݋WgzF=zF=!cgdgdm6 `QۨG6d oQڨQ V1t z8km`dCk6 P6Ȇ{cm`dCu#P6V!M31@h#Pm#$2'P |'PF H6d Wk}@@l#l|mmmbFb桻ob6C6cɆYYQۨO6d >ԇsJ}F}!cQڨQh@6D&Fa@mрl.4 @mрl@uFlِ1ڴ@mѐlɴh(zцmhH6d ^7ºPm!ѐlhj dCu!Pm!D6͐fw&F(_m A R6Ȇ 8maAdCFm4"_'tH)Hmшl|lhD6d nHmшl|Nim4Rhm4&c;~h,l46m46 }5{_6cɆpNihL6d hhB6\j:wDhm4Qhm4!2hhB6d ~NxN&F!c~ Dm L6?<*#X V6ɆmCjF0ِ1 ``l#l|N 661qޫRV!nm SB:%Dm#!2mm`!dC 6B6Bdñ7zT)|]SFS!cpMjMdCښkmM6bMɆ)MjMfd#gf鋯31 ֍fjͰfdCsJ384Shm4#2`h hF6d >46m46951 ͡jͱdCkp \m9ќlFshFsl9ِ1:9\m9J6;޴6BPPl#lF(m SB:%Tm#%2_BjF zhM&F Ni)-6Z`-Ȇm6Zm6Z M-6Z`-ȆF hF l%8&FKa%Rm%ђl|ϼ%3ohI6d }Thm$27ZB-6Zbadar[M0bF6oqm 66°0!c~# ajaFِ1mmadc]N n71Eppl#lF8m 66±p!cmmcdj#i#~1͡L#jFِ1xl#l|NsJFA6d n#ڈPۈ6"Fezת)GkjF$ِ1\!ljF$ِ1=ޞHHl#l|+ڈTۈ6oĈr0$E G)o$FFE6d ^7`݈Rۈ6ȆFQjQFِ1:% ڈRۈ@ieyGe,2kkm[Y[,c,c-c,cΖ.n^ޖ>~/?s<<[[>[ v˭ԕ'xpHu]㓃kY+{=3Oϳu՝V*^S=4΃J]Zy-%)ϔh Xg?kte Vkhh6ڪm6ƍs,?fbċFF<O6d 7f6ⱍx!cpFF<O6d 66ⱍvdci#U01ډvpF;lِ1xhF;vF;!c{{کm6ڑ hmShm'oh/F{X7ګm6ړ ׍nWhm'2hhO6d ދ6ګm6F961h#Am#H 2_$uJF@6d >$9%Am#H 2El3gbth؋vPmt 2S:9Flِ1WAmсlnt6:mt6:-|~W訶H6d ^7:ºQm#ёlntuFGl#ِ1FGF'A_=obth'؋vRmt"2 褶 D6d nImщl|NmtRm$n/xHu#֍DDl#lMhF"H6d >$9%Qm#H$2m$m$bFY}~dbtu36:cɆmt6:mt6: S:uJgsʾGdnf21w% !!DAH6轌GgFYo}|nksy )Aj qh}b)j؆ِ1 lÃl܆ᡶmx 6<6B}Gz0y\ ?2Fo #q=Iw_`$#Fz0@}H$2o$1Rmc$1lxcc;Gm6F ({_6FaȆm6Fm6F Qjd|Z}>51Fs41Gm6F ?Fhh!c8_wVm&2#FC6Fccه#ƨm6Ɛ mQm!2c`1C6d nc 1Fmc 1l:&Xac,1Vmc,1lXhcXlc,ِ1XX!c9e,1Vmc,1lL}|M?MqbNqj㰍qdC8؋Sm#2:>_1G6d d1Nmc݆/q^a|cele26262kMM[ƦZƦYƦ[,c3,c LXelele,2jck ͳͷ[X">ssW|2Ś58oq2筮q޸yS17܁V8o\㼩|5[]7lV"01^Fao4^mc<1l|j㱍dCpڷ1O6d nc<1^mc<1lj[c1ژ1ۘ@6d nc1Amc1l@6&mL6& &@6&`>d#7L 19Gm!2mm`>dCk*Q6|Ȇm@>j>DMߛDD!cpjdC6&B6&bɆmL6&mL6&hbLr=17e|7Imc1l{IjIdC6&A6&aȆI$I؆/p(ʼnD7(؋{1j؆/ِ1xuWm%2C5چ/K6d ^7| _ _lÏl,MYWbO~S6Ȇuma~dCu ? ?lÏl܆᧶mL&}zgOjbLuc26&cɆpN1ۘL6d nc21Ymc21l|N mLVۘmL!JfbLLLQۘmL!2S9elc ِ12)S6`SȆmL6mL6 wL N lßl?<᯶m  X76 !c9W6z+SSEݘ TT!c9e*SmL6 }M{_S6bSɆThcTlcSҔ&4oL4i4!cfO͞1 ۘF6d 9%@m# 2$P6fs31f323j3dCp2Cmc1l{j3dC6f@36f`dcZIf01E@@l#ln"z'>Pm#$2mmbdC%@@l#l4wlM uAymaAdCAp_4Hm#"2mmaAdCu#RpiUC^p|ZLs.Ox2T;iw`.Ž=[7?~S~?f*=3q={~yz =fzLw_}D0#q=&2_GZD0$BsE0m"lەĘ%Y1 ۘE6d 76faȆYZRۘm"2_΂6fm6f.{NĘ-Άll!c>b6#fm6f ۘ mVۘm&2#fC6fc!dW0G.#D<' IB6B!cQ6BȆm@!j!Fِ1^xmJ;V61BŜ PPl#lnºm U6BɆmBj꼳11s9js9dC0]16r<(U7*{bhm6 w΁s6`sȆ{99\1?swc1ژ1ۘK6d N )s6bsɆ甹pN1ۘK6d L dc\l#l|Wy!L0ы^4Lm# #2maadC b8mlr-Y 0l#l|N 66°yd?vVĘ'1ۘG6d nc1Omc1llY&|N)6cɆṁ6m6 )]]16uYbhm6 ۘmWۘm ý F8m ?{6±p!cFF8N6d n#W6I*PX pNYX@6d ^7@mclᴑ#܊Ckclj&@mcA6R[:b#BԍX7"6"!cpFFA6d Nl#lnD@jvÜh#͎Hw<ZY[Ƣ,cK,cK-cіer JXelele,2oKmmmmmmmm|&jܱg-f9E3LnEI5NFwV#5.׸Hq2mqOGk\$qTd \0ָHuB=i˴%Lb[翅j dC BB!c]\16:+}Sbhm,6 .6m,6և_X$}EjEdCuc6aȆm,6m,6 ׍E"Eb{t2-115bZXL6d ^7úXmc1loA/i>/Y b!cy1Xmc1E6VM( 3F W&6(!cFFE6d c߿FWڨ+Y (l#l](h#Jm# XB6nO;[c7~clc ِ1z{ \o/QXm,!2وQ,lc ِ1xXXJ6z=]T[ -UXm,%2XXJ6d o,RR!c~c)Tmc)M6-ְp mD )pNVۈ6Ɇ`DɆhF4M6d n#ڈVۈ6g/-ob,s0/-#m,6 ׍en,SXm,#2]F6lDm,6 ˠej˰A;Mkl#lnmĐ ׍X7b6b!cuJ m,'#Z/+w\[-WXm,'2_.kj˱dCp)` r!cpˡj6Vul X-VE0O.un?V;0O{Po.;[{׃tou˘R[+w%+|X 犕j+q=XId j+q=XI"d c6Vm6bƾe7T71b~g,Uۈ6bɆmBjF,ِ1l'lvqb6bX!c"ڈUۈ6V wD 6VaȆm6Vm6V !bJmcl| X XM6Mjhcjlc5ِ1t5-Vm6V !bjj!c9e5Zmc5G62<'88ĩmaqdCu#֍88l#lՍ88l#lFmēse]Ĉ6⡍xxl#l}x>sF<O6d n#ڈWۈ6ɆmCjF٘w'Oz&Fx%m$` dCu#֍l#l|"\6!cgh FFlt0˴&Q7Fmc lnYC6lm5!c~c 7֨m6֐ k5jkdΏk3ZZ!c^t-Eתm6֒ )kᜲVmc-l|NY mUXm#w9:e\SXm#2ixdž Ckcl;wשm6֑ o6֩m6֓o Ŝ)6cɆI֫m6֓ !b~czlc=ِ1xXmWXml :%?AmlP؀ml 2i(olcِ1a6lP؀ml 2 jdlGLbN甍jdCFolT؈ml$276~cFlc#ِ1F&zw坛M&M&!c ֍MjMdC0t&wWLɊ|Ckcl&hc&lc3٠_jiblpYmc3l|c3جL6d ff!c5fhcflc _hot+c7~clc ِ1omQ؂ml!2]16n\wg16`[Ȇhclc+٨}mLbN 甭jCuc+[Ɇ)[:eVlc+ِ1VhcVlcHAσMmwml6 Í-oS؆ml#2C5wml6 ׍m6mvq󁰉]ԍnlW؎ml'2_lj۱dCvolW؎ml'27C6c;~hbp=k3;Ȇk;6v`;ȆءA6d ncCmcln6vm߇i.nد}CÖ,cG,cG-c,c-c',c'-c,c-cg,cg-c,c-c,c-c,c-c[ƮXƮZj\ˈ;N;Śj'\ST׸'co'vkN\vR1x߼;5n'q;5n.\FD/3mƶNrl.lcِ1].].!cp]j]dCk].]nq%71v5nڭM6d nc7[mc7lk[mc7ln6vm6EkGԍ=nQ؃m!2أC6d 7}=!cp{=j{6~5gvfm]g~o-]xOlݯj'tuqtU_w\<%x"ٺ_=U}`/bgN+抽pث{q=Kw_{{^%2C@"E`/1;${j{}d=?11ʰOmcl|k>}>!cs1m6 }jdcͨqM~7_mc?lݳݳjdCp~~!c~hc~lV"&oq[P8m 2?#s9q8@6d nq@mql|q@mqlTxz/&Aa qPm qlAhAl ِ1xq6bɆ甃A!(h컊LCbN9CjCdC!؋R8m"2C@6m6 Cjd+&aa0qXm0ql= {jdC0{Zm\16ª|VZdCsahal71s㇘uopoodC6~6~S l6F6lSoja Amm! S8"#8q8B6d nqDmql={#jG#dChl(HߺCMRGwm6 8 mU8m%2Ga8q8J6d n(qTm(qlI;&1Wa=F6loS8m#2q 8q 8F6d ދ1c1!c^qLmqlnq\)r\m8qln|'u\m8ql#q8N6d ދ6m6N~Heb6N@'6N`'Ȇ X7Nm6N ׍nP8m 2q8q8I6p-ǘ'II!cicŅ+|Ck$qlN:q8I6d o6Nm6N_z38%7NSjSdCu6NaȆ)X7Nm6N 8mR8m&'88-):il4ِ17@NoV8m&2Yttpڰii!c^4qZm4ql㌘S9l ِ1g~Fm qlՍ3jg3dC6@g6`gF; 11κ1`ϒ /\U8m%2yiYY!c8D tYl,ِ1Y9W~Lsnu9lِ1ss99s9!cq֍sj簍sdC9h9l<\?ub~&yu}W8m'287Ϋm6Γ {6cɆm6Ϋm6.q*::ĸ X7.m\6. S.u !cq֍ j dC6.@6.`FM`9lgk\$O+k\T۸m\$2E/^El"ِ1EE!c𽯋E%jb\u6.aȆ%X7.m\6. ׍Kn\R۸m\"2q ڸq ۸L6߿yt㲫0u28Vv_el2ِ1xݸ ee!cuJW uu M-m]=}Gǖ'g疱?-cY^Y^[XZY}}|ո3s&_5uk5q2?[w A5qר]5]58wM]:وwlXG_jױdC6C6cɆm\6m\6 C6c7Fw:eb P۸m 2o lِ1"qCmql7mP۸m$E\㦰qڸq۸I6d &|wSm&ql|o&ܛq۸I6d >܄6nm6nG *?fbs-8R۸m"2`ݸq ۸E6d ܁q ۸E6d >܂6nm6n&†71n^6Eom6n omm!c96Snm6n )j;d+q#㎘S9lِ1;;!cpw;jw;dC6@w6`wɆ㮘S9]l.ِ1xqw6bwɆ߸q۸K6d >܅6m6=^ĸ'~G^^;26aȆ=X7m6 !b 6aȆ{{={};s/ĸ/pNq۸O6d n>q_m>qljdCu>q_m>llkY@xm!O6`OȆ`a̟m<6 xm5#^m6^ x mVxm&2xxC6f6㍰xxC6d ^7Fm l|g7jo7dC062417jodjQWo3[[!c֍jodCkӷpmVm-l[h[l٘KF&;iSxm#2`xxG6d nNml|Nm7~w&bN)mmM6d ^7uoɆ1МdC66VxO6;㽨axxO6d ^7ú^m=l{h{l=ِ1{qqD!cpjdCs8|Pm| 2m|Pm|$ :9~Qm|Tm|$2S>9Gl#ِ1#\~Tm|$2_~6>m|p~>a8ّe,e,e,e222氌eeeeeeee尌崌岌嶌屌嵌a%Jf9%rQ"wSs_u"׸DSǀ5.{k\"wTc=5.;q1zotC&|_m|m|A6d n h //Ȇ{/QodCj_`CeywH,l$6m$6 ͉QߜXm#1lLbwtF&Fbl#1ِ1xH m$VHm$! YpH"$pNIHB6d ^7Dm# ln$u#Fl# ِ1xHm$QHm$%Ce|^㘉ԝNk'UHm$%2,;z,FRl#)ِ1xH FRFR!c8m8cb I6bnd)5:>nbwѻgnjn؆ِ1xpuMm p#2nnmandC~ܠ 7 7l#٠_8ib$6A6aȆaltpp8, Ck#lw뒹߭K HF6d >$6m$6߷21^49Em$6 ׍n$WHm$'2C@6cɆFrh#FrlA6&.8!l8 چp su  2C5Rֆp  Pp`)F&grH!)):%F l#ِ1wRJPHm 2)`HHA6d MmPHm$HzHtGgrSm6R n]Jwu)6Rb)Ɇm6Rm6R H mTHm"E#ES^4F*l#ِ1x 6RaȆS=TjTdCsJ*h#F*l#5٘crMԮNHM6^}9Sm6R 6RcɆFjX7Rm6R ۚHHC6dp"#i`HHC6d ^7Fm# lHHC6d >6Ҩm6Ғ<􎭉֝OUHm%2iaHHK6d ;i6biɆEBi6m8y#_xC^n]:rM.\<駋w.tN ݁xrgʐN}ᄍxJv;R.y:=OAzK;W bH껟׃te ^Cz|/<= O׃$BsEzh#Fzl#{?Aie!Fl#ِ1 F F!c>"62`Ȇ jdd`wLndu#FFl##ِ1x62bɆצ4FFl##ِ1xmdTȈmd"ky殉I<{gRȄmd"2`Ȥ D6d ^72Im#lD&h#F&l#3XMbN jdC62C62cɆaFW 0z1g162cɆFfh#Ffl# iEmdQȂmd!2ȢB6d ^7Em# lmdQȂmd%Z*ld6md6 YaUm#+l|Smd6 ׍FVF6${&F6|5|Mm#lF6h#F6l#ِ1x/ 6aȆF6h#F6l#;ؿydOMbSmd6 mdWȎmd'2aȮN6d ߙȮA6.晉CmPȁm 2y/+ӆm:Fl#ِ1ƵήNכsg16r`9ȆFh#Fl#'h7kߟ^9FNFN!c^4'Esm6r +=;VzNFN!c~#'Sm#'ld>^ӗ&F.ы悽h.\F.!c9%Srm6r m  wh]mn0E>̗x䳌巌}e+`+h+d2V2V2V2V2V2V2V2V2eee[XYX9w-c-c,c-c,c-cU,cU-c,߇jz%?{o9})/}kܗTd T׸/qj1}kܗTd ^㾄5KuF+mL|L>xF&F>l#ِ14lئ|j|dC࿯v>|F>!c A6aɆʩz'I1򋺑֍jdCkpM_m#?l|m6 mWȏm|E6u\?ub+sAS7"sLh6W֍66"2icnj3oZ_a_ ? >Jm+l+!c5WWj_aƛt7NbbkpMU@mQl(jdC s6 `ȆFFA}WBL9|| H+d}AFA!c]16V\ZdChA؋T(m$2jBdcs'9QHZZHmQlnuF!lِ1xQ6 aȆm6 m6&u z%s_S7&|55ِ1>]{W 66&25dCsj_m8y6gv߭k:[WVX-]xOl]a_X݁xOl]a8kVo.]61*)FEa;SQm"QlFEhFEl"ِ1F{W UTۨmT$2QڨQۨD6&F%|VImQl{JjJdCF%oTRۨmT"2S*A6*a~)fbThe؋VVۨmT&2aݨQۨL6d <2|RYm2QlnT6*mT6p&Fa QEm QlnTuFl ِ1*F*F!cpU*jUdn{JUEQU6bUɆFUX7mT6 ۨ mTUۨmT%2SBU6bƊcgi|LjnTuF5lِ1==6aȆVamT6 ׍jF5jv0a0-a2V2V2V2V2V2V2V22ee'X#XcXXSϖf斱V֖6vNT7p|ҽ3JNW5:qթƵwp8+5:qթ|W׸Td _ָW^㜇j炉UO~ܝQ.\<駋wj԰;0O❻Հ5wdDu5=5pW,<[7k!@w߶te S:b8ܸObh@?@?E$BhdckH`ߙ5ž}MXjm6j 5aQۨI6d i}hg16jb5ɆFMF-]oǘE6r<(U7*|2^KmQln|"UKmQlZjZdC6jA6jaFYĨ-FmX7jm6j ׍ڰnVۨm&2C@6jcɆFmFXmJ&F3S7ꐍS֍:ju:dC6@u6`uȆ=:ju:dCuQGmQlɫu[]VWm.QlF]hF]l.ِ1"u6buɆmԅ6m6ꑍUMz.n#B=zF=!c}zp߾F=lِ1xQ6aȆ׃6m6꓍E5nb ԇ Wۨm'2aݨQۨO6d n>Q_m>QlߨmWۨm4 9Ջрl>@mрlFhFlِ1FF!cp j ]QԍaQmGlG!cwV##ِ1x#7~TlQmGl!XxM9ICFCl!ِ1xhFCFC!cg j dC 46m46~"='wp oِ1x ֍6~6~"2C5Йܟ6~6~"2E6~R hD6Vyx\=N#ͱώpHmшlPBmhD6d ^7Hmшl|Nim4Rhm4&Y&FcQ7úXm1јljdC06:b8mxp-Y Fc!cpj&d#!IM&FhFl ِ1)M6`MȆ`,MȆmFl ِ1hhJ6MFSFS!c^)Em46 !buJSFS!chlTr~i3dC6~6~VlYmglg!c6~6 511fpF3lِ1fF3fF3!c8D dF3lِ1fF3fFs61֍jͱdCp\m9ќlFshFsl9ِ1FshFslzf&F |BmтlY[ F lِ1F F !c~Bmђl8kabu%-6Zb-Ɇm6Zm6Z ?Oi Thm$2hhE6;21Z ֍VjVdC NG+VF+!c ֍VjVdCF+hF+l58]UahhM6d ^7ZúZm5њlnuFkl5ِ1xh mVhm!s~h#l6ڨm6ڐ 7ӆ_6F!c֍6jm6dC6@m6m8Ǵ5gcAIj gjm"œ{&-\U;hkw`.2Uo.]T{V}zЎ5uN<{oSv/c3Ivjp=hGd >W"کE1x=hmShm'h/phhO6d ֈjdCphhhO6d oh@6bU46: W~;mt6: ]16lG:mt6: ?CuPmt 2_t6:mt6:-ǬZ(FGX7:mt6: ׍ntTmt$2訶H6d n#Qm#щl/&F'Wav" D6d ^7:Imщl|NNjNdCF'hF' w_\}}E~-Ζstuuu bhd yZƼ,cC-c,c-c#,c#-c,c-cc,cc-c,}L5M0:3:k\g\:S1EE53q:k\g\:S15ո]~)D21ot颶B6d 3uppڨrU|X"mt!2g |gFl ِ1 Em ѕlSW>&FWL+܉몶J6d 7w}sWFW!cp]j]dC6B]6bzl7q|cY˾F7lِ1ny_7nF7!cpݠnjݰndC}s7hF7l;p.讶N6d ^7ú]m;ѝlmt6 mtWm _kԍdF!cp=j=dCh؋Pm 2Sz@=6z`=ƌ[νdxg'|gFOl'ِ1{={=6zb=ɆFOX7zm6z ׍FOF/,$_ыl$J3F/-sVd6zaȆװF/lِ1"6zaȆװ^jd#zE6zcɆm6zm6z W7ToFo!cFoFqؾ[=M>FhFlِ1)}6`}ȆFX7m6 ׍>F>F_"|&F_oF_F_!c֍j}dC0۹b8m޼髶K6d o6m6.I2'F?X7m6 SuJ?~F?!c֍~j~dC6A6aFt-abhF!cpjdC࿯vF!cjdLn uclcِ1x16`ȆX7m 6 m PmB6z4EEml!co//dC0]16l ِ1 /@Y cXcE^t@lc ِ12)6bɆ@X7m 6 aB6bF{611֍AjAdC6A6aȆalttpڰ}s lcِ1A A؆xҹ&mxmx`dC7<6< !c놇چA6d >x@j`:e0\ Vm &2a1L6d /:Vm &2j6ul(bZs.O8; ;0O?l4m}s.='ޅvzbs{zIw_gm=Y[OO\<Ɂ O8WxExzI"d  mxmxb^d#mճzL61 /hKm "2+\᥶mx 66 /!c> R6$Nob 6BC6bCɆdUm %211J6d G 6m 6+ľ0o1Lmc1ln uc0lcِ1"2m 6 ׍a0apѶ{Epp!c 'pplc8ِ1pp!cwC6c#Ȇ/Lbm:DFm6F ?{Pm 2C@s!c9e1Bmc1l?gKH1RԍnTm$2SF9eHlc$ِ1HH!cp#j#Qd#z"gaFÌRm"26 eRm"2SF9e(lcِ1x1 1 M6+`c8[0-1M6d >shh!c8D T7Fm6F ׍hQ~[#1pN1C6d >s1!cjcy1jc1dCuc 1Fmc 1lhY f0l̍K3\yqXlc,ِ13XX!cpcjcdC6Bc6bncb8oSm#2S9e8lcِ1"SƩm6Ƒ mSg>yat_f;-c,c>I1_˘elele2626262`a YfZƂ-c,c-c!P\Xelele,22a>7ո 3zV8o\㼩y筮q޸yS1"qk788oX5F71Ƌ}pnxlc<ِ1xx!c8D dcxlc<ِ1xhcxlcH2mpcoD dh5-&6&`ȆTjlcِ1  !c1ژ1!&x. m`>dCt>pGm!2mm`>dC{1>Іچ1lL1ѵ2uc"x,DD!cpjdCc:Qmc"1lnL6&mL6&†_dbLt>$I$!c~c7&mL6& !b1Imc1lnL6&mL6|F<oW21|]%v4x?01拺1֍jdC6C6cɆ1Pݘ1ۘO6d >̇6m6ƺ,?>hbl3Id E|噤ppl#lF8m ?k 6±p!c9%W6ί[615]X@6d oqprU|Xbhm,6 ) @mcl|NYm,PXmD#Z/+wĈ߇߇Pۈ6"ȆFjFِ1h#Bm#ۈ 2FF}E>L; -c,c-cQ%h2Xelelele,222g%XXZY[6X6Z6Y6[ƶXƶZƶYƶ[vXI5.q1No}sEI5Np?R]"q'cڑvEI5N_$q翅dcuG71h!m,6 Xm,TXm,$2_S-kj dCkB"pIc`XXD6d ncHmclm,6 Xm,RXm,&;ɧLbhcblc1ِ1x߼͋6cɆa6N'O,blc1ِ1bFƱgL(a# ڈRۈ6ȆmFmDaQdCF76(!c~# ڈRۈpZb[E,QXba.ū{n |γD`݁xOgp.f%껿~S?g{D}ϗz+bzKE=X R_R2 :XRr cs)1E,`)1\Xۈ&-pmD ? 5"Zm#ۈ&2 mDmDcdCsE4m,#6򒉱LXm,SXm,#2\16olw7ŸXm,#2ߛ]fm,6 Xm,SXmĐ{}KabĈs1eF C6d 6kl#lF mĐ @1j1r2GLXj˱dCgr36cɆm,6m,6 ˡj˱dc'\31V}+j+dC oPXm 2C@6Vm6V ׍ JQ{C 7La=[I6l?4Rmc%lJhcJlc%ِ1x/+6Vb+Ɇm6Vm6bƛwVebĊ~#jF,ِ1~g,Uۈ6bɆ1XXl#l|N6b6bUdcy61VY "*U*!c ֍UjUdCIVUjUdC6VA6Va5kbj؋VXm&2XXM6d ^7VúZmc5l,jhcjl#lԦo qd#Q՜1ƶN88l#l|NsJFG6d ދ^4Nm#ۈ#27⠍88l#lxk#^}ýxxl#lccjF<ِ1x|5^m#ۈ'2S⡍xxl#l]~Lˇ&Fk k6FFeu#Am#H 2Sm$ faa6!cp FFllG&Q7Fmc l|_t ]XC6d >s5!c~c Fmc l/K=11֊pkZlc-ِ1xk6bkɆa)56l'תm6֒ ׍Z:sg/k<31։֍uj밍udC6A6aȆ:X7֩m6֑ ȼ@6֩m6֓+ΗMb a׫m6֓ )ᜲ^mc=l۳lv{֫m6֓ SC6c⯜σM bN j dC؋nP؀ml 2C@uclcِ1ؠH6z۷_&F1lsFF!c9e#S6ml66 ;h#vFF!cpjMdN2169eS6ml66 M@nR؄ml"L Sw(V[qwעNq( A4 A $z:s߸w7ƛs͵o}Al ِ1r8q8D6^r™C!C!!cqCjCdC:tHmql|{8q8L6Imql|Kj ?q~tc#3~†᧶m 66 ?!cy~j~؆ِ1᧶m\&s .5qY)rYm2qlehel2ِ1֮N۪/m\6. l늑cbhm\6/qWęxf~Em qlhl ِ1qW6`WȆalspK _ڸm\%/e31qjWdCprUm*ql쫍+ӆڷ<|Ck*ql|M הjWkd nb\6A6aȆ57m\6 ljѿʴ՟*5lِ1>ܧ\S۸m\'?лV)ua:q]m:qlo\}ul:ِ1̚i ~Ck:qlo\}ul貥}ㆹL h lِ1776n`7ȆafNfU/r]bhm6n qe v·n#&qS-]p> ׏j7̇\ݤ_ϹI[^o><מBBׇ'-,/?\{o~pyh⣅5n~p ^[ [te 3G|t`-nì \1"ҵq~7Zp?E"d N3o,yyCkO6v{L~_66 !cj؆?ِ1N"}癔Z؆?ِ1 h_m۸M6͘8q[ظ mV۸m&2]16{b_ڸm&2Q*ml6ِ1mQ21;,lِ1Q۸m!2QiZw;dC06byl.|qW􍻰oU۸m%2m6 ۸ mU۸m%2Q㿾Zw{d51 {j{dCgZ=lِ1{={=!c ]1629CkqlL*uoL}h}l>ِ1,%ӆjdC6C6cɆaF{WFbhm6Z܋%/ab<8oZjZR>[j1PK5{K?N~x?s@=N0=+G,:{\8=.q2qx $WtL'#PC! T6Ɇ@87mbdC6@@l#l@xQF D6UweFD6d >(Hm#"2mmaAdCumaF+:K61=CzxH6d n!Pm!lChCl!ِ1{B6bdeJL` s@L6e< V6Ɇ mcdC6``l#lNοL d#Xm#xD6[x7EyD6l#lِ1ss6aȆals񾊡xD6d 7A6aƦSJNhbo@!j!3qF&3aLmlo<}3lِ1 6aȆLml,_&sqo6^m6BFܵJ11BŚ הPPl#l| )jF(ِ1x}#Tm#%2 mmb/ƹޛ51^=K}xI6d >KK!cħI&FZ/dCK+1971^y7^m6^ ?K >KJml\<} xE6d Wj6y6yg^C"^Ewgٺp|v|x@6>`ȆהGQ[ڛ,΢6>bɆהpMH6d n#Qm#l|Mm|TmD abD FF$I6d n#ڈTۈ6"ɆmDBjF$ِ1x߈6"6"(QM'#J)QpMRۈ6ȆmDAQjQFِ1,g((l#lFm|"g11> OjOdC|ߝ|Rm|"2GG'lِ1'h'l#l8__-)pmD ϢpVۈ6ɆEhF4M6d n#ڈVۈ6>}M,l|6>m|6> |is {9W16>cɆpL6d >~6>m|6blw>abĈ5%)1j1F ِ1l#lF mĐ ۈ6b6b6|Fo{<,ؖZKRkyXj,wZK-RKl%ԒZj,Z K-RKmZj,ZK-Rl}oeq|~W)z?N~Xt??'ğXob9}r&Sr=?:q TcύlnƆ%nd\7 7lÍl|ssMm p#2_hsSp6ȆmAnjnFl^{#Fh6ۈM6d n#6[m#6l|ہ۱6bcɆmĆ6bm6␍51^Fql5Jq6`qȆqhGm#loā}#Fl#ِ18F8؆;ذDZmwomcdC6ܡ w wlÝl܆;᮶m ŸCjF\Aw01y#.7m6 Ϣq,Wm#.l| gѸjqdC}#.Wm#.A6 dhbxyj؆ِ1  lÃloxᡶmx x@jF6cɆהF|v·#Η:o;׳u9S.|}|v݁xyY׳u97ߩwo><+5N}Ϳ ]0K  #' ]}?[Kv@'"E$ 1x?Hm$PHm$$=HZ+̻)W=Yj dCkEB#m$6  ZPm#!l|Lm$THm$";H$#F"l#ِ1uٺDjDdC}#6aȆgDF"DFb1NX}ƚ]}\dBbFb!cjdC L@ LHL6d 7C6cIF{ob$߯&qWm$6 Üiqe$F!ci7MHB6d Lh#Fl#)HEsTM½iRFR!cjIdCFR8o$UHm$%2EBI6bƭjdb$6A6aȆ'7Nn2dF2!cy#7m$6 Hm$SHm$'+pd#HHN6d 7þ\m#9l|HjɱdCFrh#Frl#иaUSMbSRm6R ~Bm#l|MIהj)dC6R@)6R`)F +O71R )j)dC}#%)6Rb)Ɇm6Rm6R ))j)Td#8OfĚ )6RaȆF*7Rm6R SR}J*TF*!cpTjdc{}21RjdC}#56RcɆFj7Rm6R H mVHm!}3&(0H#OI@ߧQHm!2i`HHC6d n# Fm# l|# Fm# lssMbMI הjidCUHm%2_S5%FZl#-ِ1xH mUHm#zxob}#6aȆF:7ҩm6ґ HmSHm#2HHO6^7B#7y#Fzl#=ِ1FzFz!c5%=\Sҫm6ғ זH@6^rxAm#lFh#Fl#ِ1xF F!cy#Am#lۭŚ)62bɆ)>%FFl##ِ1yFxfQm##l|MmdTȈmd" {8.q&LF&!cpLjLdC62A62aȆmd62md62K_nbd}#362cɆהpMɬL6d >odFfFf!cpj5o{'a &^m{l{!cpC߫m|m|O6d n{h{ﱍɆO^m{l# hjױ+M,bg,jY,dCŁ~+Fl# ِ1,F,F!cpY,jY6o0Ƿje~Բ[j9,Z.K-Rk[j,Z!KVR+jhԊ[j%,Z)K'KVR+k;}?z$2bsϡqd 9P8qq2q=A=N೑8BJ6&Y#¹9FVl#+ِ1FVFV!c=UVʪJ6d n#+Um#݆!l:=a6ٺl$"BK'E6lv.tM ݁xÿn]6~67}߭y65φtͻe5dzC~NP;ȁ׊"~!c~FvڲǙ7مFvFv!c-Fvl#;ِ1EeWȎmd'2+e6md6r6db6r@96r`9Ȇ@Pȁm 299Fl#ِ1xmPȁm$J:)!@Tȉm$21s"FNl#'ِ1)96rb9Ɇ mTȉm"CCr%l6rm6r #\j\dC\pKm#lo6rm6r˛u[)ᚒ[m#7l޳޳jdC}#76rcɆFnF7a #8m6]@Qȃm1UCCGm#\E 7@y6`yϻib}#/y6byɆ)y>%F^l#/ِ1)y6byɆF^h#F^l#٘30dn#ȧG6d Oim6 )Om#lo6m6򓍺5i_̢,_m#?lo}#F~l#?ِ1)6cɆ)jd#S( p(Q(@6d nQ@mQl|M)הjdC6 m6 '+6怉QP^Ёu/Q(H6d n QPm QlFAhFAl ِ1R(Q(D6 vT($F!7 m6 (mR(m"27 yF!lِ1x(mR(m&&;}(,Fa7 m6 ( mV(m&27 yFal0ِ16FaF<뙤5Y} ]󹣢J~+#f2p,ep?(CW_ e~P|,EQ(A!cihFl,hR8~&FY7- e6beɆQVm,Ql|( 爲jedC6Be6bFi\61ʉ9\5ʩm6ʑ ?[P>[PNmQl|(rj對rdCs6ʩm6ʓ'Oly(/l6ʫm6ʓ [6cɆFy7ʫm6ʓ ?C6m8h" |G9*Zj,ʖZKVRRnհjZj,ږZKVRo5Zj,ƖZKRknZZj,֖ZK{_*P[SuX5ǩq`qp@=N0_kW g{u{\q2q`qp@=N=q=N"FEkDp7LĊt_bEFE!c"\*mT6* ۨmTTۨmT$2?cmTTۨmT"-oWJjJdC0NAο|CkQlF%hF%lِ1QImQllYSXS*5Fel2ِ1~2oWVۨmT&2? b*mT6* )j*dcOۦ115 \SmT6 UtU6`UȆRFl ِ1RڨQۨJ63C{&FUTkJUFU!cy*7mT6 Tg1U6bUɆהFUF5\obT6A6aȆF57mT6 ۨmTSۨmT#2Q ڨQ ld`b"_//dC/pEml!cY8 ِ1 /Fuqj.Ly,T'74ܧRۨm"2Q ڨQ ۨE6d nQKmQlЛV]Ql8o6jcɆY YQۨM6d n6Q[m6Ql| mVۨm!KjQQG}Ձg_u6`uȆF7m6 }Ձg_u6`uȆu:judʑMܺLn]F]!c=l]QۨK6d O )u6buɆmԅ6m6ꑍ;ujbzpROmQl|gzjzdCkJ=Sۨm#27A6aƣo{eb}>6cɆmԇ6m6 a=l}F}!cpjd ~mb4} 6` Ȇphh@6d 4kJF!cY@mѐlFZ51w5tw5Thm4$2 ahhH6d 4kJCFC!chhD6.5;8h7m46 Fo4Rhm4"2hhD6d >66m4p><[^>[$"EwgC>}5W7_} ؇y1׼1M=-KDMoMp?hBW_ tD Mȁg&pl&$Bߓ46m46Q3TMZTm)єlFShFSl)ِ1ΘM6bMɆ׊FSF3p[Lhm4Shm4#2? o›m46 hm4Shm4#2 h hN6NS'hhN6d n9\m9ќl|ljͱdC6C6c-Ȇj/&F aBmтlLn F !cj-dC6Z@-6Z`-F/11ZZ:wh-6Zb-Ɇ-Zsj-dC6ZB-6Zb-Ɇ-ZB-6ZbFkv{D1Z}J+Oi hE6d" hE6d kJ+VF+!c h hM6~lXSZ5Fkl5ِ16ZcɆ5]jdC{FkFq[>cM6FhFl ِ1q lhC6d 7Fm цl{6F6F[*C{=LbMi הjmdCpVm-іlF[hF[l-ِ1hhG6:oSL<`hhG6d ;w۩m6ڑ hmShm#2hn~[FF;;[Rhu:[j],_-Z7KRi~z[j},-Z?K6Rh [jC,0Km6RiF;}?L{q,qj/ֿpkqqkO=Np^מz{\{ګ{\{S1=q=N"F\IFF!cwupwuPmt 2^^Flِ1蠶H6v97QmtTmt$2^#^FGl#ِ1xFGFG!cvGhFGl8?{$&F'17wss'NF'!c=U'ꤶ D6d nImщlot6:mt6:cR謶L6d 7:þYm3љlFghFgl3ِ1FgF|&FtkJ.F!c3. Fl ِ1.F.F!c5 Em +޴n&Ưo Ưjb ?=ƯƯdC UmWlW!c+ƯFW1FT&FW7¾Um+ѕl|M הj]dCpUm+ѕlFWhFWl٨(viLnot}F7lِ1 )6aȆF77mt6 mtSmt'I^7]k݁5鮶N6d 7þ]m;ѝlFwhFwl;ِ1FwFqOxӛ=Ě)=6z`=ȆE{sj=dCh8Pm 2?mPm$7SLOj=dCkJOTm$2詶I6d n'Sm'ыlrN=M^b^j^dCkJ/Rm"2 襶 E6d ~I/hF/ C^gƘlo$/j"~S.|>fw`><>$N7~͇'`lo~ЛZ9 b te >GsDo޸&2a?$BgZj>dcc}\6}Ȇ!mQm!2裶C6d nGmчl|裶l\6xŚLE6~6~'2;dC6~6~Wl|]mwl/(\{Cj9LӼۣ/\|G_F_!c/1m6 [}6b}Ɇg̾F_F?.ڐ&F?7Omяl~~j~dC}6aȆm6m6wy2#_Fl?ِ1xFF!cpjdCkJhFlcѡhyMo }clcِ1Liv$?@mc1ljdChclc ٨ÉLyS ۃK6bɆ;΁jdC@8o Tm $2jAd#E01As lcِ132326aȆהApM1D6d nc1Hmc1lm)cXS5e`lc0ِ1v0Vm &2`>jdCk`hc`lc٘;4&71Dmc1lqa;1B6d 71Dmc1l\t1Dmc1l4*P7m 6 C1Tmc(1l~[jCdC{ءP0|{1c1 1 F6d k0a0!c1 ajðadCk0hc0lc8/;&pac81\mc81lphcplc8ِ1pp!cYt81\mc81l|T&ac1Bmc1lhclcِ1vÎPm 211I6::_)@sTm$2? EGm6F #1Rmc$1lHhcHlcI21F}(O1 E6d nc1Jmc1l\t<1 E6d >o6Fm6Ff%ʘE hh!c5e4\SFm6F 1Zmc41l|;1ny?0߾f=c-qxKm6RdMԦXjS-itKm6ReͶXjs-y|KmR[d-ԖXjK-erKmRaPke1b׿171d u{q2_oǍ=n 8c`q1ƒ憎(ob6Bc6bcɆsjcdC{pO5Vmc,1l| mUm#%wV41 㠍qj㰍qdC}c6aȆTj8lcِ1xmSm'Q/Ϟdb6C6cɆpn1O6d >7sxx!cxhcxlc862sUL L !c1 j dC6&@6&`ȆmL6&mL6&ؚDx;Qmc"1loL}cDlc"ِ116&bɆmL6&mLp>5l2}yn"&EwgٺIl$Ivn$&$7}߭$5doנ7Y1Y}'~0GfdɸL&21'sZd&dw5M)b;)!cb \+mL6 ۘmLQۘmL!2ߛN6mL6611jSdCﵝ@ﵝ1ۘJ6d >cN+TT!cpSjSid~kbLs l4QlĮeeu6aȆ47mL6 ۘmLSۘmL#2_SA6aF斝~PĘ.@MWۘmL'2m\16l?>]mc:1lthctlc:ِ1t 9333j3dCg3Y  !cp3j3dC6f@36f`3#is621fsbLlc&ِ1>e&ܧTۘm$2? -fm6f ۘ mTۘm"x1e<4loeߘ1 ۘE6d ~9 wRۘm"2`ߘ1 ۘE6d =,hc,lc6(5˻^MM٢ŏ}cllc6ِ1ll!cpjdC6fC6fcs571)o!m6 S}9!cps9js9dC06y=ss6`s #01l2l^1Wmc.1lo̅}c\lc.ِ1\\!cL dc\lcVbkfLybޘyjydCyp2Omc1lYcyVÙgjlc5ِ1<ë6VcɆm6Vm6V X mVXm!G:X#7֨m6֐ Ü۷rpڰ5!cyx רm6֐ 6֨m6֒ߥ01֊3p2^XK6d ~Ʋk6bkɆZ7֪m6֒ X mUXm#E_bbk:SXm#2oo:lcِ1u:u:!cA6aFnz fb?ށ~jzlc=ِ16cɆm6֫m6֓ zq1)L ol}clcِ1]np߻ܠ@6d >ol !cYtAmcl]Hc}Qmc#l|獍jdC66B66bɆml66ml66#/Q516 MjMdC}c66aȆהMpM٤ D6d ncImcld,t/Xcxn=[Ymc3l| gjdCmmV،ml&2o3Ymc3l<pS"K@%nQ؂ml!2آB6d nc Emc l|mlQ؂ml%kv3*֔pM٪J6d >olVV!c5e+\Sml6 V6ѵ&6acMmclfhኁYMmclol}c6lcِ1xmlS؆ml'ߛ?.ll6ml6 ol6cɆv7ml6 mlW؎mE6^;!m7_ja y/Ȇ_oِ1_;D!cyc7vm6v oP؁m 26vm6v! 7Ϛ;NN!cp;j;dCg_;NN!cp;j;]d }lbk.R؅m"2 إ E6d ncKmcl].]n acaحM6d ~.V؍m&27vycnlc7ِ1nq\c{`أC6d ncGmcl߂ۣC6d >6m6W$ob}um6 ){ᚲWmc/l|M הj{dC6B{6bF X`bk>S؇m#2>z>}>!c}>O٧G6d ncOmcl$/|L~hc~lc?ِ1~x_mc?l|jdC*mW؏m ן8 l6m6 NjdCkP8m 2j6ym 0}yo8]p><֗g=ȯc^l߰3ۯS^o5o[L  ]}̘]1lT;8Ar c~pjq?8H"d 7=mT8m"٢01 CjCdCCpqHmql!h!lِ1Zq8q8L6#xJ88 WjdC0m\16l?-uXm0ql|< WjdCgᇡj O}ㆹV†'᩶mx iy3-O OlÓl|o j؆'ِ16Ȇچ'qlI1j㈰q8q8B6d up tZG#dC6@G6`GȆ##QϮךG]Qa{Ql(ِ1x8 QQ!cpGjGdCQhQlوgI8&fcp=q 8F6d ~u Wm6 Ϣ,zLmql|M9mS8f|?̭oGC/{<- KR;iN[jg,9KR;o].Zj,5?KvRj]Ԯ[j7,-KRmݱZj,Ƿw8W҄6?N^xQz{q^d yKp'c{yE=N{*/=N"7_vhM&쭶mx 66 o!cpІچ7M6d yCjqQez'QMٺlqq!c8m6 |\m8qlo6m6Ne7sqB'|Bmql^^j'dC6N@'6N`'ȆT'j' q>bچC6d ~}6| !c5)>j>؆ِ1x6|6|dcΪEebt{Nm6N )'rRm$qlo}Il$ِ1S'j'SdyS|6| _!c5)j؆/ِ1 _ _l×l~_hWm8O6^(_!x7yz7yy!cqj籍dC6C6cɆ)硍j籍 dcwkܧ\R۸m\"2^|^%lِ1>qImG6>W }eb}ܧma~dC{[6 ?!cp~ІچG6d 7 ? ? C^ͳuT0̳uj"̇nex>~Y݁x߭ W~͇'`w.k~Y}/~p1~p^++te ~pE Wȁ+P+\!2?m\Q۸m\%ZL*u㤉qUM½UU!cUq۸J6d 7 W6bWɆm\6m\6 COD߸5k5!c{Zb8mtt,܎q ۸F6d nqMmqlLqMmql\|*Y㺰qڸq۸N6d u8[\W۸m\'2_S5ul:ِ1u 9.؛ހ{j7dC6n@76n`7Ȇ 7nm6n Mo@76n`7FkG7Λ7żq76nb7Ɇm܄6nm6n oT۸m$27j7[dqOxM[bMה[jCgZ-[-!cq [jC}qKmO6ǯ咉/~'߁~'_m'2ߧ}چ?O6d 7aW6Ɇϴ  l6Tu/E߸ mm!cpjdC06Jb|o bhm6n ۸ mV۸m!=ĸ#7m6 )wrGmqlo܁}lِ1rڸq۸K6,͛n5wa߸q۸K6d >ޅ]]!cpwjwdCg_wjw{d}MqO{oS۸m#2qڸq۸G6d XʛNSܯbhm6 ){jd41qjdCk}W۸m'2a߸q۸O6d 7C6cʩ7̗\ȆKjdC?pm<6 xm[Hml|MyהGjGdC}Hmlܙ%"x,c7m<6 Xm1l|My הjdC<6m<6?俶챉D܇āCzxB6d c+ǿUxm<%2OaxxJ6d <6m<6BM=!&FXSBm 7B6B!cFFB6d n#Qp>l9u`x.|u`xv|x<ٺgp'L}ٯÿ<[ ^gk twy2#w\q?xNW_kssZ\-9Ishsl/uKㅰxxA6d ~ x  !c__m6^ Ϙ/j/PQk}^bsDF(J6d 7 {PPl#lF(m 6B6BdS7S51^j/dC6^B/6^b/Ɇm6^m6^ )/j/WdLWo}+lِ1EE6^aȆ+lِ1+h+l5٘8oO&kkzkl5ِ1xx kk!cY5E_m6^ )j7dF&a Fm lhl ِ1xx7!cpo7jod#q@9>ożo6boɆo[l-ِ1[[!cw6ުm6幭?W41„0h#Lm# #2= ~m 66°0!cY4 S6ޑE-eb6A6aȆהwpMyxG6d nNml;h;l=hi&{a=^m=l{h{l=ِ1{{!c{C6cdO11k;kmcdC{p W6Ɇ7FF8N6d >oCjFpr#u_(dvQ"6"!cFFA6d {l#lo21lؐZMa-@6\vNKjdCpAmlo|}lِ1H6zx(7>jdCkG|Tm|$2H6d >o|6>m|6"F!Y=ۈ$3o,!mD # Tۈ6"ɆgH8FmDbdC6"HHl#leqĈF9}QjQFِ1ה((l#lFmD mDmDa?3ߙr3 D6d 7ZbxIJ?Iml'h'lِ1 ۈ&!-h8oDmDcdCF476h!cpFF4M6d }J4m|&,~gg!c{?{?m|6>  m|Vm|&2j31#EchF C6d >oy#Fm#ۈ!2?߈1j1F ِ1h#Fm#n?Fo+pb[jq,5wK-aų[jYj ,Z"K-RKj%Ԓ[j),Z*K-RKk[j,Z&K-%qK̒Ë$5be5=Μ?rSqS+71ʊ~o柿OXY}5VV>>u beMM ߎ>u 5Knbe/eE/mandCĻeEĻmandC೑[V4mandCᦶm&[#dC/6bcɆM6lDcewձ H@HS-Bq-VShqww-|}1776 o!cu7\xmxcdC6 o olÛlnxCjF݅I$F$F!cpI$jI$dCIF$F!c5lh#Fl#)9+]&FRa#)Tm#)lH jIdC6BI6bIɆ)IjIddc@r3D/ 6aȆm$6m$6 )Lm#lF2h#F2lÇlI;8#>j>؆ِ1 lÇln᣶m 6|6|d{ٺl]rFr!cpɡjɱdCu#96cɆm$6m$6RonbsJ 8PHm 2MESm6R o)6R`)Ȇ{F FJ1ϥv#H 7Rm6R o)6Rb)Ɇ甔pNIHI6d M mTHm"uٿ&JԍTnRHm"2ES^4F*l#ِ1~~6RaȆm6Rm6R 婕H֥DgRm6R )ᜒZm#5lnu#Fjl#5ِ1FjFA_41҈9% SҨm6Ґ i`/Fm# lFh#Fl# ِ1 &Fm# l̿3&FZ1sJZFZ!c֍jidC6}e?FZl#-ِ1:%-Vm#-K6WL~W6|6| _!c^j؆/ِ1:S|6| _!cgmІچ/G6{_~pOm#2E`/꧶m o ? ?lÏlnA~j~؆?x|AL q&IW6Ɇ omcdCu  lßlnCjF:A;pQ&F:1sJ:tF:!c֍tj鰍tdCF:oSHm#2sHHO6]h#s kFz}ݚazFz!c~#=7ҫm6ғ )ᜒ^m#=l[額j6c23IMͱV j"]ſIkD v]{8w?{v^ {׃牶Lc)DSݗ1ѷp= 2!11"Z9ysx1"p= 2-h#@m#H6wSQaeȨH6d >WdsEFFF!c3#13md62 mdTȈmd"C39~$֦4F&l#ِ116l[62aȆ;3LjLdCkLF&Lvᆲf}E~-̖sZƂ,cY,cXe,e,e,e,2na崌岌嶌EZXZY[ X Z Y [Ƣ,cE,cE-cіbw_2SLKa2/32k\f\2S1::33k\f\2S15.3q|ָd#G21@@l#l[[jF ِ1@@l#l;c8lq|rfm*Uu#֍ l#lnm ׍ X76 !cpAFFlLAY#Y`ȢB6d -,[bY6`YȆ//ʢB6d n# Em# L6Lfxy#X66`!c FF0L6d n#V6ɆmCjFR1`#D6B6B!coom`!dCF7B6B!cp!FFJ6r11BPh#Tm#%2 mbdCF(7B6BP!c1~md%W8)`bdhV؋fUȊmd%2-ujYdC'>Y6bYɆFVX7md6M܏W31 ֍ljٰldCF6odSȆmd#2S9%F6l#ِ13;cljٰd#_ GLFvh#Fvl#;ِ1)6cɆpNɮN6d EFvFxҦ5M0{|=Lm# #2mmaadC6 00l#l|N sJFN6jF8m uW6ɆpomcdCsJ8jF/tEuLbNj9dCu#96r`9ȆȡA6d c#awZ9Q‹7FmD Pۈ6"ȆYFmD`dCDm$^Sas5lNFN!cX̩߱I6d >sJNFN!cp9j9\dha# ȥ E6d ^7rKm#lF.h#F.l#ِ1;j\jdNq561r jdC6rC6rcɆm6rm6r $7[m#7I6jZB#R߈Tۈ6"ɆmFmDbdCkHTۈ6"ɆGBjFڥyDF{_}Sȇm#2+ۂG6l[p6aȆ|ȧG6d n#Om#݆W~sp74ZD~sq.ٺ̯v\{_aeȯw\܋]}<p g<3 8{LLe ~\ ݗ1\v䷀A\ `Q@-HFFA+71 > # m6 aYPm Ql|(犂jdC돂FAF!UۘD(F!BF!!c5Æ\eŋQ(D6d c3I!BF!!c=BF!BFa5"0ӛ&FaQ7 úQXm0Qlja|Fal0ِ1x( FaFa!c0QXm0E6\2b&F&P&PFE6d ~&) IRۈ6ȆFQjQFِ1~gm! (anJa)E6`EȆFX7m6 ׍"nQ(m!2Q(Q(J6\`bsJQ8U(m%2NRWm6 ׍nU(m%2Q(Qۈ&C\>߯-D$jF4ِ1:%S6h!cpFF4M6d oDCjF1QqW&F1aQLmQlnuF1lِ1bF1bF1!cbF1bF H^ߺ1bNsJF C6d n#ڈQۈ6bȆ21j1F ِ1F c>}a숵|#2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V2V22222}Xqg= j9Ŋ/k\,8׸XXb5.׸Xq2_S5UK5NtŪk\,ƔmG01ℍ8h#Nm#ۈ#2`mđ gSۈ6Ȇ8h#Nm#(N6;ymO8#S>.Q(N6d ^7úQ\m8Qlo.jűdCu8Q\m8Ql86k61JKm6J ׍nP(m 2Q(Q(A6d ^7J@%6J`%A?11J:놱QluIFIFI!cQ֍j%dC6JB%6Jb%Ɇ%j%Rdcio DMVJmQlF)hF)lِ1RF)RF)!c}RF)RFiMbN) jdC~Jg?6JcɆC* C*Q(M6d _(Q(C6[rgQF(mQ(m!27~Fl ِ1x(F2F!c9 QFm Qltu_Lb [a˪m6ʒ ( mU(m%2Q(Q(K6d ދ6ʪm6ʑ$ lb6A6aȆr(Q(G6d >sJ9rF9!cp堍rj對dOQ 11 塍j屍dC6C6cɆFyX7ʫm6ʓ )塍j屍 d㭆&FaQAmQlLxFFlِ1 F F!cp jdÝjbTk؊p [Qm"QlߨjdCsJE8TTۨmT$2_T6*mT6*ߓںyQIS*uJ%JF%!cn0F%lِ1JF%JF%!cpJj6*u![W$"*E=[Wֈjſ g_~Žſ ye=A5;O2Ы"uuUp=Bw_0k =K*^p/A\U*jUp=B"d YڨQۨJ6BkkbTsEU8WTUۨmT%2_T돪jUdC6BU6bUɆ{̪FUF5q|ǛFo1o5#cސڪmT6 ì?qjdckL/F5lِ1xQ 6aȆmT6mT6ٿpQ]MÎFul:ِ1xݨFuFu!cQ֍jձdCeT6mT6jtĨ!ߨQۨA6d 6j5dC6j@56j`5ȆF hF l&4SLnԄuFMl&ِ1xݨ FMFM!cp5j5dC6jB56jbәEsjbr"RKmQlnԂuF-lِ1ZF-ZF-!cpZjdcM6SN71jQ֍jdCeԆeVۨm&26|Fml6ِ1VmhFmlhG&Fװu6`uȆ:pNQۨC6d ^7QGmQlnԁ6m6 !LnԅuF]l.ِ1R)u6buɆװuF]l.ِ1W]hF]lݝfsLzF=hF=lِ1xݨF=zF=!cQ֍zjzdCuQOmQluŜR)6cɆmԇ6m6 ۨmWۨm'2ߨmWۨm4 ܳx@ԍn4Phm4 2S9Flِ1FlUg ;l:>^ F!c^@mѐlЯ.41j yj dC6B 6b ɆalTsp.#hm4$2ׯ!Pm!шl$X;"S9F#lِ1FF#FF#!cE$Ckшlhm4Rhm4&h,l46m46 Bc 6cɆag AO}WZdCsJchFcl ٘4ڧGe&Fo4F&F!c֍&jM&dCu M6`MȆFhFal_4|ǣeXsX XKX+ط,c[Z[XZY~hko`22222222222220M5(^ϩqMakqMqkJ5N77U׸5'c3ƙM/55)8MakqM׌lVDo F6aȆbfjͰfdC0_ g U}^Z<^ fF3!cp͠fjͰog^mb|#A|A| ِ1x 웿QlFqg Q>bhm|m|C6d 7FsΑ<טŜ)6cɆonhN6d n9\m9ќlnTvp0Ck9тl0u&F bQkA6l/Phm 2S:c8lp읆gCkтl(Q}Xqhm 2]ac?dϒ bhm6Z۲xo01Z֍j-dCFKoThm$2Qa;/FKl%ِ13SZm6Z z6;;6ZaȆ߉o߉o hE6d 3FP#hm"2. hnq[sn<[-ߪE|ka.ݺoaV[sq.~lݷt'?9]\{}sq/=Az'ssф++^zwte S9c8t:bh|w@0j8c8Dt'sZz1L=vHCk;l{֡LE= ߫m|m|O6d G|kjcߓ ì?:co!^ ﱍɆal:c8l>U=њlKQӆɆy%FkFk!cicg khM6d c3_|P뷩hm&2aüt?Fhm!̿h#FX7ڨm6ڐ [m6`mȆ=k=khC6d >sJ6F[1b)61:-l[qVm-іlF#g jmdC sm6bmɆm6ڪm6ڑf kbu6aȆvhhG6d ^7Nmюld \;a{F;l31~I~I~Plf5Æ?mm@6d ~xȆa;8c8l86]ۇNj#ٸcvLE֍6~6~$2?[#<[ƏƏdC6~6~TldFSg 5C#^ dcf'?dbg6cɆ{mhO6d >sJ{F{!c~3ÆmKF{l~# FX7:mt6: `AmсlFhFlِ1jOd#A11~ ~ ~R l|N )?mmD6d >生6~6~"2Q#ɿ1 H6wܐ&FGa#Qm#ёl|N甎jdCu#6:bɆtTmt"B y$NpN餶 D6d ^7:ImщlntuF'lِ1Njd⎛FgFg!c~37:mt6: ׍ΰntVmt&2?[謶B6  S9Fl ِ1.F.F!c֍.j].dC6@]6`]}UԍntUmt%2誶J6d ^7ºUm+ѕl|N mtUmt#8oebtu6aȆ{n F6d nMmэlmtSmt'g]z]d@6cɆFwX7mt6 mtWmt'2讶A6V˯ySz9Flِ1FF!c=sj=dC6z@=6z`=Ɇ㇥^41zgm=ᳶj=dCsJO8Tm$2=a詶I6d ދ6zm6z z3Kԍ^nRm"2`襶 E6d nKmыlZ/hF/l7٘rHFWLޢnuFol7ِ1\dFFol7ِ17\Vm&2SzC6zc}F=M'\31֍>j}>dCsJ8Qm!2116Z9ysx16`}Ȇal$mb }6`?z7Y<>Ymglg!c3Ѝ16[35:{Z?c? )?9gɆm m>0}x bdlb26262626262626262626262626262626262626262626+ޘW_s9l]_X+[_{e3wn]_8U׳zf..w*W]ګ]΋W]y9SB~~?Lhhchlc4ِ12)6FcɆѰ1M6d ދ6Fm6Ɛes~ SMC6l c6`cȆ1pN1C6d c#/lc ِ1xmQm%+_lbuc,c6bcɆ由pN1K6d 5}Um%211G6:,v)8~|F?Nmc1l8hc8lcِ1x16aȆȌ6Ʃm6ƓK/xX7ƫm6Ɠ mWm'211O6d o6ƫm6&>7JlbLuc6&`Ȇ ߘ1ۘ@6d ~|F?Amc1l|NmLPۘmL$;p51& jdCuc"6&bɆDX7&mL6& ׍D$߱fbL6&A6&aȆmL6&mL6& a'5$I$!cI$IdQ:s&dac21Ymc21lLdx&wdlc2ِ1dd!cpj6c3I ǚa$M)v.]L;0wg=4Sw{=4){>׃tϏ 9u톷7U<' LUL/cSY۩jSq=Jd o1[LUT!cs*1Umc*1lJXi`Rc1 ژ1 ۘF6d > ֈijӰidCs48WLSۘmL#2?= ژ1 ۘN6<ɵ-1]<{OWۘmL'2#8c8l~vltlc:ِ1c:ImL6 ?C6c3Fz1C<'Pۘm 2_̀j3dC3  !cs1Cmc1l\q)c3aݘ1ۘI6d nc&1Smc&1lߘ j3dCLhcLlc٘pk&,> Dfm6f ?> ?>Kmc1l|NYjYdC6fA6fm8ҋ6[-ckgo[`[h[d[l[b[j[f[n[a[i[e[m[c[k[g[o`hdlbjfnaio4jwuܐ9oluklq23>әqqM5N5n6q5n6qo klu9d#GK[u}M9b=m6 s7Gmc1lhclcِ199\"c&\7υ}\\!cy.m6 ۘ mUۘm%2Bs6bߺ윕Ę'yo1ۘG6d >̃s6cɆpN1ۘO6d ;Wۘm'2ÝmWۘm, 9L`b,؋.PXm, 2_m,6 ,{1 6` ȆB,Z"ϡLA ᷃m,6"7~cBlcy>,b֍j Im,6m,6"F:e\,RXm,"2XXD6d /RXm,"27A6aBZoo,&n:m,6 )ᜲXmc1l] {jdCuc1Xmc1lTz=F`c7~clc ِ1xX%!c9e Sm,6 o,6m,6 v 51~c)7m,6 ׍n,UXm,%2KaXXJ6d >,6m,6s5v\.SXm,#2Ysp8UʷQ!bhm,6 ׍en,SXm,#2SA6aTNj &r}-WXm,'2X7m,6 Xm,WXm,'2XXA6WBXmPXm 27V~c lcِ1  !c~cBmclul™+;j+;j+6Vb+Ɇm6Vm6V X mTXm$27VB+6VbE41V ֍UjUdC6VA6VaȆEW}UjUdCucJmcl,;~X-l6Vm6V ?k[ VXm&2XXM6d nc5Zmc5lHcX5jk5dC؋QXm!2S9elc ِ1x/XnqkyY[ Zv.]߳uk^ZvbγukZ_k^_֭|`ww9[';u껿׃ute ~vls-!c=-pOklc ِ1xmlQ؂ml%,_9*攭pN٪J6d nc+Umc+l|N 甭jC6BȆ)_ř{{6aȆmpN٦ F6d >ls6m6!cp۠mj۰dj[ %LbNj۱dCI$6cɆml6ml6 ۡj۱dcι| 21v8la!c֍j;dC6v@;6v`;Ȇװ;j;dՐ据61v~c'7vm6v  mT؉m$2Ew^tNlc'ِ1yN.5˚Fob1v>.].!c9eSvm6v .6vaȆm6vmp|}FE7;v[2222v2v2v2eeewc㖱SӖ3s K˖+kYʛ?ݢo ׸Td ^v[]vj{ݰ7ڭqqM5NkݰV׸xC6x`cӆ9#laӱpyFflcِ1^Gmclhclcِ1أK6{E ^^!c֍j{dCt{>^^!c5^hc^lc(bpcاG6d T6aȆm6m6 )}jdڞVW51~ޯO6d nc?_mc?l~hc~lc?ِ1>~hc~lbiӚMnulِ1xq6`Ȇm6m6 ׍A18cjAA!cpjdC6B6bɆm6m6 K jC!C!!cs9CjCdC{!C!!cpCjFr[ uL336~6~#2YwpذFoodC{=6~6~#2zlql w|k8,zð=q8L6d ^7úqXm0qlF3Æix16cɆ{a171G#jG#dCpeSaڎm6 G`qDmqlh !ٺX:O7g~o]l]wsq.Ͻp^ww7bOyqtWq=y渗hd!?`te S:c8ضP;׃?ȁPjz1xQqUS?611(+m6 /(^QQ!cS'qm6 6m6%+Ǧjfbu6aȆaFcg g2m6 M1c1!c>qLmql{oLnuql8ِ13qq!cpǡjDZdCsqhqlوs\& uiP8m 2S;c8l?Uf_XZ'dCOg'6N`'Ȇ IKCnib6NB'6Nb'ɆIX7Nm6N 8 mT8m$2q8q8E60[㔘SN9)lِ1R8m"2_SjSdCppcb 6NaFBߖ8-iX7Nm6N ?C; 2Nm6N SNuii!cNC6NcgFombqhD6ΐ =K*^p 3jg3dC6@g6`gȆX7Ψm6ΐ g3jgdqkX[㬘S9Yl,ِ1;;g;;g6bgɆ8q8K6d n,qVm,qlɳMLsNM9a9s9!cp砍sj簍sdC6A6aȆ7A6aƨ;=87~yl<ِ1yy!c~<7Ϋm6Γ 8mW8m\ 5&ĸfplilِ1xq6.`ȆX7.m\6. ۸m\P۸m\$_9hb\u"6.bɆm\6.m\6. ^6.bɆ7.B6.b}Zodb\ߣ_R۸m\"2S.9%lِ1:\\R۸m\"2q ڸq ۸L6f-[qI㲰qڸq۸L6d n2qYm2qln\uel2ِ1ehel hJL+b {am\6 wwEm ql߸+jW+dCk++U{&UQ7ºqUm*qln\uUl*ِ1xݸ UU!cpWjWkd$vO㚨`ݸq ۸F6d n5n5k5!cpנkjװkdC5h5l:Xwc21uuNq۸N6d ^7úq]m:ql|NjױdC6C6m߇aM-m]=}C#cS3s K+k؟wO,c[>[ƾXsj\I_F1N7w75q7݀558ހ{75q7|q75nĸ)l܄6nm6n ݄t76nb7Ɇ翛pq۸I6d >݄6nm6n|qKF`otKmqln܂u-lِ1x| ͷ6naȆbnA6naG>ĸ-މ ߉q۸M6d ^7núq[m6qlmhml6ِ1z6q[m݆s<[wQca.=[w:vp\3gx8/f;~Žſ=]f ;л+]X]\ݗ1\qwzp]LZ]\wjw{d#YU[111m6 ߃6aȆ{{ZS۸m#2+A6aƩy51;;$Ɇ%jdCq_m>ql}h}l>ِ1}1qmˇ\=!csjd~"׫01:y!t4EPm!l,CxCl!ِ1xxCC!cxxD6P}=x$#X7m<6 `Hmlnx+l6ުm6ޒ )oVm-l[h[l-ِ1x/xxG63x'l6ީm6ޑ xmSxm#2xxG6d o6ީm6ޓ K^`b6C6cɆm6ޫm6ޓ xmWxm'2SC6c l|6>m|6> }}{_6>`Ȇm|6>m|6> m|Pm|$(l|6>m|6> a/Qm#l>H6d >|6>m|6>;f]jb|6>A6>aȆm|6>m|6> a?5'O'!c^Imx4n }ِ1x7R l__ja ׍6pۜIk5pI[-osq.뙤a[osqwvg{{8$ {7Ug1W|sgg2?[-v׃@=g(Zg\>j/d ֘_\V/j_/dCQm|!2B6d m|Qbjݗ^aHHhKdKlsZ,c1˘e2mKbKjKf%Z,ct XFXßOO 9%_ 4S9N?1L?Ql?KOָA P?OָA^ P翧翄dcWy71  j dCkAhPm#!l|%acIHH6d >%6m$6)H$l$6m$6 (Hm#l7JzDjDdC}Im$RHm$&e71wwm$6 'B6cɆm$6m$6 $6m$6\Ȇwp>÷.A|MT.j.؆ ِ1.A]w lÅl܆ ᢶm ).Іچ J6N$6U)pNqUp6\Ɇ]Оچ+J6d npUp6\ɆmBj؆?nnᦶm hadCk p#2_uچF6d >Anjn؆;٨[xo]vnú᮶m  wX76ܱ w!c놻چ;N6d npWp6<Ȇ㿟n!zQ؋zmx`dCpe˃lʗچA6d nP6<Ȇ)ІچI6nLO`S)pNT6<Ɇ7<چ'I6d nT6<Ɇ'᩶mxcS5gbx9@"/ /lËlچE6d WzKm "266 o}01Eu[m&2. zmxcdCu o olÛl| mxmxcIF41&!a6Ƶ 6m$6 I`/Dm# ln$u#Fl# ِ1HHJ6^6QLAv t^;FRl#)ِ1hR/Tm#)lFRh#FRl#)ِ1xH m$UHm$#|a#0}2a蓩m$6 )Lm#l|#H HF6d ^7A6a>dV>bom`>dCNQ6|Ȇ'6چC6d c#nQ6b.H_;y}jɱdCFro$WHm$'2E^4Frl#9ِ1HHA6N{񘉑B)`Bm#lnu#F l#ِ1x)6R`)Ȇm6Rm6RW6 uH)ְ)6FJl#%ِ1xH FJFJ!c֍j)dC)j)Tdc;221R TjTdC6RA6RaȆm6Rm6R 6Rm6R*&Fj1sJjFj!c9%5SRm6R )ᜒZm#5l|NI mVHm!^ouH#l6Ҩm6Ґ ׍4nQHm!2HHC6d MmQHc8䕖l$-+-V-"]V ݁l]Z8kUo..{V}zK|ZYV\0|ž/ܷU}_\|zv/91x EEzK"d >WBj؆h~̿%O66 ?!cp~ІچG6d ;6 ?!cS6Flb>j؆?ِ1^? W6Ɇ?j؆?ِ1x66tdAkMtnu#F:l#ِ1xHF:tF:!cp頍tj鰍tdC頍tj鰍dcyǏKEHFzFz!cp額j鱍dC6C6cɆm6ҫm62džv FX72md62 ?{gPȀmd 2Ƞ@6d -Am#@6 ;~gF@6d ^7`P6Ȇ-EF@6d o@jFF!ʐ;&FFQ72ºQm##lFFh#FFl##ِ1:%#\dTȈmd$2_d62md62Skbdu#62aȆmd62md62 )Im#lmdRd>}alGe,22l ZƲZƲYƲ[,cᖱXNX.XnXe,e,e,e,eeeee,2V2V2m+f|&3ո~J k{9e_f8eV׸̸e'c}^~fuˌk\fq22(e5.38aˬqH6J7L@q. T6Ɇ>]F H6d (Pm#$2mmbAdo=21^L܋ R6Ȇ*b*maAdC06 9c8lwċm CmmaYƱ~bbdu# Y6`YȆal|ᰱk'vƏB6d >dsJ,F!cvh#Fl#lmǧ&F mmcdCF076`!c5U0\SmcdCsJ0m &Fsmu!9fwt,\ Q6BȆZakC6B!cp!FFB6d n#Q6BF 2ǽ41B^L(܋ U6BɆPombdC6BPPl#lF(md%:8^51:S7o0Y7md6 ÕdVmd6 2+eVFV!c}FVF61/#7md6 `Mm#l 116Z9ysx16aȆF6h#F6l#;oM5HvVhU%LȮN6d o4tpK`?]m#;l|#;ȮN6d n#;]m#;F6;#Lԍ0X76°0!cFFF6d o~#Lm# #2_ÆAajaF8x^ȱ gboomcdC0hCg )1%[ZF8ِ1xu#\m#'2mmc9ƺG7db9hF!cg93j9dC{_9WF!cp9j9m#¹5Fٰ}8Bm#ۈ 2zzFA6d >D9%Bm#ۈ 2mDmD`9F'4lb9FNFN!c֍j9dCu#'96rb9Ɇm6rmpE6$xcOs.@sE䲋0wao<[ ~0A.sqwv"γu`GK}sᄍ߭y.=υAna^D/#r>" 7}<{ppoN'C:ȍAnr c=pO+ZDn\r׃FnF$Ҽѕ҉MH6!Rm#ۈ$2H jF$ِ1\ HHl#lF$m! /#<ȣC6d NNQ7Om#l|?m6 ׍|nSȇm#2??ȧO6M8ibh~؋Wȏm'216[35:{ZdCF~oWȏm'2SC6cȆmbsJ8P(m 2NR>')Q(@6d ^7 Q@mQl-mP(m$A#;wH((FAX7 m6 -T(m$2Q(Q(H6d n QPm Ql܋}g27 ~F!lِ1F!QHmQl|N)BjBdC6 A6 aR&Faa0QXm0Ql- {jdC6 C6 cɆFaFa^)M(a# ڈRۈ6Ȇ(oDmDaQdCsJS6(!cw((lS+wؒT&Fыh"F!cpE"jE"dCEF"F!cQ(Q(J6޹5\1QT;) ϝU(m%2Q(Q(J6d n(QTm(Ql|(QTm(M6m"-h8DmDcdCF476h!c9%)jF4ِ1x݈66bd;319װF1a;DXLmQlnuF1lِ1x/Z 6aȆ@6m6bҙ1nmĐ ۈ6b6b!c퉁mĐ aca0}Xw<,c-c%,c%-c,c-ce,ce-c,c-c,c-c,c-cU,cU-c,c-c5,c5-c,c-cu,cu-c,c-c ,c -c,c-cM,߇G_ Nob5#ʩ~9\ݗ1rA9r#21A"zPD,mS(m'kv=Y4Q^(mW(m'2\yj屍dC6C6cɆFyFѥC7"L FhFlِ1xY6*`CqwwwM I@  Ipww/Bqwhqk-}<}Y+߽wu{7k{dC6Z@-6Z`-ȆF hF l%٨|xD1[ŽFKl%ِ1٥-٥-6Zb-Ɇ-FKl%ِ1FKF+;.`h hE6d ^7ZJmъlF+hF+lِ1 h p%Gx*+j؆+ِ1xpuUmp%2 mmbdC\ W WlÍlDUC&mmandCO6ܰ 7!c~ njn؆ِ1mmaFI*flbsJk8Vhm&2&5&Fkl5ِ1xh FkFk!cpj6d# KW11ڈwwۨm6ڐ m`Fm цl{콍Fl ِ16F6F[qU`j&F[a-Vm-іl|/- ohK6d >sJ[F[!cpmjm w1ԑ9X,J O OlÓl Oچ'I6d nT6<ɆmxBj؆ֵ^1/x昗چE6d 76 /!cp^ІچE6d ދzA^j^F'q@Sng; _tRmt"27:~F'lِ1NF'NF'!c簝Nj o1N%=L o 76 o!c~j؆7ِ1:S6 o!c mxmxc>doA}Z>9|룶m 6|6| !c놏چC6d nQ6|Feq21|E _ _l×lچ/K6d nU6|Ɇ{Q_hWm#'^u ? ?lÏlچG6d >9Om#2~Іچ>u"χ` Y:[Ƃ-c],c]-c!n^ޖPXX_X?X@ `P0pXelelel|q{k/f7k?qTd _]q'cߩS寮qS1uk9> 0%pkmt6 uo]6b]ɆFWhFWl#ll<>F7B6B!c}om )!pN Q6BȆFmt#O<6mt6 `MmэlntuF7lِ1{ݠnjݰdw^obtsJw8tWmt'2a讶N6d ^7ú]m;ѝl|NmtWm ?!7zj=dC6z@=6z`=Ȇm6zm6z VHhFl'8)_߂LFOhFOl'ِ1FOSm'ѓl|N 甞j=dCς{B=6zbFdZ:^o Rm"2`襶 E6d ^7zKmыlmRm&v51z~77zm6z  mVm&2譶M6d n7[m7J6]?V*P8mbdCBᳶPPl#lF(m )FF(чl\(p믑M>b am6 }`Gmчl>>j}>dCuGmїli=MbN 甾j}dC6B}6b}ɆF_X7m6  mUm#tOWm6 mSm#2觶G6d /觶O6yv 51֍jdCFoWm'2诶O6d o6m6flM ~k@{_6`Ȇm 6m 6 o 6`Ȇ@r|:e \ Tm $2S9e@lc ِ1x@@!cpjAdL`b uc6aȆm 6m 6 m Rm "2SA6aF/?hb kp ;Xmc01l|k01L6d N`N``!cpj!d=6189d(yg>Ko Qm !2C`1B6d ^71Dmc1l|Nm Qm %&CE1C6bCɆχ E1J6d ދPP!c11nq0MR>Yп$ I Sfa.M0[>'z$ oSao.]΋{>L}χz0ycwDzE1w8jq=Nd >W sp '2gg81\mc8F6?^Zt&lAajaFِ19a00l#lFm aFF1l/V=(c;Gm6F ׍nPm 211A6d c6Fm6F[! BG#E9#6Fb#Ɇa;}16fbhm6F w2v#6Fb#ɆHhcHlch=iVL&(1s(Q(!c1 ֍QjQdCQp1Jmc1lmRe8eI/lY9F[X",c(8xXele,262626262kMMͰʹͲͶͱ͵ͳͷ---N5. )\F7 W׸p\©fvpԸ9ӎqS4^ m 5.jp8k\8qTd ^a W׸p<&_keb6FC6FcɆp1M6d nc41Zmc41lo mVm!{1FmQm!2߷Ǩm6Ɛ 51!cpc1jcЮmL7G9Bm#ۈ 2$CmD YPۈ6"Ȇ6"6"HQ( &nDºmD )pNTۈ6"ɆTpMmD  mDmDbcƳ]?11Ɗp/fXlc,ِ1x XX!c9e,Sƪm6ƒ cjc(O}'QnDmD Q߈Rۈ6ȆmDAQjQFِ1xmDmDaF\ijb8oSm#2S9e8lcِ1q8q8!cY8qxQL &x1sxx!c1֍j㱍dCkp ;^mc<1l|<1^mc<1l|}߀i&oM d#pܱrilcِ1xݘ !c:&FJ^%Ckc1l|NmLPۘmDe>ĈF476h!c FF4M6d Nhhl#l66dc41&:m<& SEeݘ1ۘH6d ^D^DD!c~c"7&mL6& ׍DF ٠ӭf1hF C6d >9%Fm#ۈ!2mĨm`1dC6blcHݸDsMIN%Id=?IjIdC6&A6&aȆmL6&mL6& )IjdV31&~c27&mL6& ۘ mLVۘmL&27&~cdlc2ِ1d1m͘6SkXNB6lǧmL6 #)ڦ 6Emc 1lnLuclc ِ1))TѱӖ.411֍jSdCT؋NUۘmL%2ߘ 7mL6 ?k mLUۘmĒ ځ[lbĊ FF,K6d S7|16lGĪmbdCu#֍XXl#lnBjFٸ{ KM8Q7`݈Sۈ6Ȇ8oĩmaqdCu#֍88l#l|mĩmm8>fKyGjO 1.\]`:ɁcZt\ӡjӱd幏21fb+fm6f #)vA6lۮ36f`3Ȇoo1ۘA6d >Ẁ6fm6fcO;Ę)LX7fm6f ?' Tۘm$23aݘ1ۘI6d ^7fB36fbƎ*MY,,Y,!c9}?Kmc1lǜ{YjYdCuc1Kmc1l }V\&l1̆sll!c1֍jdC6fC6fcɆ˘ mVۘm!_n1i[!6m6 w΁s6`sȆ-9!c=99\6m8Ę+ 皫1ۘkV"saݘ1ۘk֫"1ژ1ۘkV"SBs6bĘ'ypN1ۘG6d 5iSۘm#21ژ1ۘG6d >̃6m6操jb6C6cɆṁ6m6 a1_mc>1l|hc|lcp Qm@Xm,PXm, 2gm,6 ׍n,PXm, 2S@ 6` F&X(XXH6d /.TXm,$2XXH6d XXD6Ыb.cX7m,6 )Hmcl"hc"lcِ1xXm,RXd8|݉0gv,22222222222222222222222elelelelelee|Tv*`ָ׸Td ^X]jkbXkb\S1x[ kbu[%dïة KDoFK6`KȆb%jK%dC6@K6`KȆm,6m,6 /31֍jKdC6BK6bKɆKz{Rlc)ِ1R2$苴Leb m,6 52e2!cg3ej˰edCg,6m,6u/Ϛ˅rr!cpˡj˱dC6C6cɆrhcrlcL hc lcِ1)+6V`+ȆpNYXA6d ncBmclT\ʟߛ+3JJ!cuJNYXI6d nc%Rmc%lJhcJlcQcXUjUdCuc6VaȆ):e*lcِ1U*Uj/c3XM6$xG^&9fyjj!cVVm6V ׍հnVXm&2EWC6VckFc71ֈ֍5jk5dCuc k6`kȆX7֨m6֐ ׍55ZѰ11: ukFԇSEɺVmc-lX jkdC6Bk6bkɆ 6֪m6֑;ebupNmcl:hc:lcِ1u:u:!cXnz8_uI]֫E0O.n=Xv\<׋ۺWo.]߭[z=_#?Vs ؠp=@w_`6z{ jp=@"d >Wl66ml66e|a+FF!cpjdCsFX-6ml66 jMd#}l.ķuu66aȆc&lcِ1^&Imclnl66ml66u,ll66ml66 nf=66cɆml66ml66  mlV،ml!K|鲉E?-!c֍-j[-dCs8lQ؂ml!2S@[6`?,jblelelU؊ml%27|16lG!nU؊ml%2E^tVlc+ِ1x mlU؊ml#uc`ئ F6d ^7Mmcl|Nmj۰mdCl6ml6^k?abl6C6cɆ):evlc;ِ1vv!c$ۡj۱dc['21v;j;dC6v@;6v`;ȆءA6d o6vm6v,s));:eNlc'ِ1NN!cp;j;dCNhcNlc٨?].].!c~c7vm6v )Kmcl.hc.l;%߉=wjaߑ Nm;l;!cpAߩm|m|G6d n;h;ﰍdȥ9v7\V؍m&2حM6d װ6vcɆm6vm6c.{`b؋Q؃m!27~clcِ1x{6`{Ȇװ{=j{de {^^!c֍j{dCuc/{6b{Ɇ^hc^lc@sjb>؋S؇m#2`اG6d ncOmcl>hc>lc?0'E~~!cpjdCs~8W؏m'2mW؏m [~q@8mP8m 2|lِ1x8!c~q@mql|n/&AN9)6bɆ8q8H6d n qPm qln6mN0,x}o;b;j2v2v2eeeeeeeeeeeeeeeeeeeeee'ϖaQ˿_H tHwH]wjk!Xk!\Q1xotF5qo>k!u;dQ_aa!c0m6 wXm0qlahal{Ao561z{ﱍɆy~dCu{X7WljcGF/:38"l6m6 ׍#nQ8m!2#fm6 8mQ8m%ʟqT<< U8m%2q8q8J6d c3ƷBno/Ql(ِ1Qv~0օݺHĀ s嫤?E`a.]me~P;\<׋'T~Spn?zpџ0􎉹+1\ݗ1\S;81r cA"zpD|qLmql#_&q qa{ql8ِ1\Qrq]gKCk8qlqhql8ِ1qƏd&Əbm#\##ِ1x##~TlFmg u7]2^ Ɇ6~6N䯳6mqB%v%vBmql晎3Fe,^<^  !c 6=q8A6d nqBmqlZ8)8q8I6d ^7NºqRm$ql|O$:q8I6d IhIl٘>/&)aqJmqlIE u6NaȆ)X7Nm6N ׍S)SitY\(ia4qZm4qlnuil4ِ1x/z6NcɆm6Nm6ΐl.$)qF'p'pFm qlhl ِ1x83!cuhl,ٸ ttX딳jgdCgYY!cq֍jgdCu,qVm,ql,YNd&91s9s9!cq֍sj簍sdCu6aȆm6Ωm6ΓΧ}Z8/l6Ϋm6Γ 8mW8m'2a8q8O6d >6Ϋm6.gb\6.@6.`Ȇ pNq۸@6d ^7.qAmqln\6.m\6._->qQظm\T۸m\$2qڸq۸H6d n"qQm"ql}E%kiLK{KjKdCs%8\R۸m\"2q ڸq ۸D6d nqImql =It&ea2qYm2ql}./g kq۸B6d o\6m\6 ǁ3WUU!c@@m\6 ?O \U۸m\%2SBW6b]f61wwm\6 ׍kn\S۸m\#2S95lِ1k5ku8Q q]ԍn\W۸m\'2qڸq۸N6d n:q]m:ql߸m\W۸m $*1.qCظmP۸m 2_܀j7dC oP۸m 2qڸq۸I6(;xvX܄딛j7dC6nB76nb7ɆMX7nm6n ۸ mT۸m"Cab-oR۸m"2q ڸq ۸E6d nqKmql߸mR۸m&3O7q[ظ mV۸m&26|ml6ِ1ymm!cqڸq۸C6:9<&1܁s;!c^Em6 ׍;nQ۸m!2w;jw6dIZLDŽwr~|'"œ|xo7I??dw`.] w'7O.7I?{tTyS>Cg1W 犟wg\~/c>gGv3?׃"~g!cΟ6~p9޹/'ȳagqܵq2v222222222eW K+ko7w-c-cXe`h222r]q6-%s+z繫qwqK5N0>g5.8߅w5.qw݅5=cK]L{=h=lِ1x?|6aȆJZ=lِ1x?|ڸq۸O6ʶ\q!x>m6 qH?آbhm6 ۸mW۸m'2~>q_m>ltyȳ&Q7@mln966> b'lِ1L/댑m|"2|'lِ1O'OgblMϢ jdCpYm3l|N jdCsg8|Vm|!B_="~_K_6`_Ȇag V,ŋB6d >|s/!c֍/j_6\w>߉0wّx$%%%%%%eeeee}cjfnaiemc28OP*w=;?.oN=埓 \'Oָ.F \PoϿk\T1l?!ЅPm#!lFBh#FBl#!ِ1FBFB!cp j Ddcgdm&F"7'rA}s"DF"!c}D.h.F"l#ِ1R:&FJ^%Ck#l|.Hm#l vN&Fbm]bm]bFb!c֍jdC}sb7'VHm$&2HHB6j?ąDm# l|. ڧKHB6d >$sJ$F!c9% Dm# l$"B_#nIɆPI6bIɆFRX7m$6 H m$UHm$%2_o'uAjIddx*:%\$SHm$#2 H HF6d c3FH/F2l#ِ1F3Æ9-'gZɰdc?E/6cɆm$6m$6 \m#9lnTtZ7ƋHA66Mdb6R@)6R`)Ȇ. ݺj)dCsJ 8PHm 2]wg oPHm$tUR))ᜒRm#%lM {єj)dC디pRm#%l|HHE6ezS\#`H HE6d >sJ*TF*!cpTjTdC06 :c|S~#chm6RGmbbkp Zm#5lnu#Fjl#5ِ1x6RcɆalpp8G3/Z4d۷YiDHF4F!cpi4ji4dC4pFm# lF>g \IVHK6 ViaVm#-lFZh#FZl#-ِ1)i6biɆm6Ҫm6ґ ځebu#6aȆm6ҩm6ґ )Nm#lF:h#F:l#=X?VHP#HHO6d n#=^m#=lnu#Fzl#=ِ1x/6m8>@65ym]8dP`a.u\w32'gݺ p#g}sTv^ {׃t+ڨI?C/a=Ȩq=Hw_ #2zd ZDF\2A62?'^ F&۞712 LjLdCdrAdRȄmd"2_dLjLdC 16f;j֬bhmd62m?kbdpȬL6d ^72úYm#3l|/<3I2md62 {Fml#+HRa&FVg0d%ʪJ6d m]Vm]VFV!c֍jYdC068c8l؎B̪F6pobdu#6aȆlȦ F6d n#Mm#l lj6lFvwjTӃ#Lۂ.ۂjٱdCgd{6cɆmd6md6 kȮA6:pjbh؋Pȁm 27r~#Fl#ِ1FF!cp9j9d#W;61r:놙s DSm#'l𽌜j9dChN؋Tȉm$2ȩE6~8S%F.X7rm6r mRȅm"2 >C˥ E6d ~m.h#F.l#7XW=aH#aȭM6d n#7[m#7l|N jdC࿿ȭC66t*`bu#y6`yȆeẹC6d ^7Gm#lFh#Fl[Q;ƙߺ𳃾uAg}--ِ1x֍o66%2-|ƷƷdCg~ m|-lv# 7m6 oy6byɆ{ѼͫK6d o6m?&0=&o+`sUUUUUUUUհմղնq0m}hOԸ|S׸|'cߟ~*5.8`ߜO]j{|S׸|xO6v_~F~!c/?_m#?QlԤL..jdC0k*Og א.CkQlnuFlِ1>]hFlÅl$u`b \om`.dCu  lÅl܆ ᢶm  hEm(H6~p|kbtAT(m$2S>)Q(H6d >sJAFA!c~ QPm QlLLBF!hF!lِ1BF!BF!!cpBjBdC6 A6 aFȴnŜR)6 cɆ }jdCt>]aFa!c8ϕ:db 6 cEFʎ("FX7m6 E`QDmQl("jE"dCFhFl(ٸ{LnuFQl(ِ1FQFQ!cg?E᳟jEdCu(QTm݆#bd#avuM0բZD1s$IG\'z}[W Vb_~S8yqtϋy1\=mcZ 8}׃W;(Aqr czPփjq=(N"d oQ(Q(A6 |z?|#JPBmQlƆ3Æj%dC6J@%6J`%Ȇ%j%dB#%^xI^Rm$Ql|Q?Jm6J ( mT(m$21KB%6JbZvm,61J9SJm6J qH})RF)!cpRjRdCuQJmQlf8trQZԍҰnV(m&24|Fil4ِ1ڴ4@Km6J ?JC6JceF[J^fbQ(m!2 Fl ِ1x(F2F!cQ(Q(K6ɸ(+FYX7ʪm6ʒ SuJYFY!cQ֍jedCFYhFYl[$}+MrκaȆrj對rdCH*boʩm6ʑ {6aȆװ堍rj對dcԍZC=VE/Z6cɆ):Fyl<ِ1x(FyFy!cp塍j屍 dĞO>11*8?FTbQw{*mT6* S*uJ F!c j dCFhFl"HQk^ELf1u"?6*bɆ+mT6* ׍nTTۨmT$27*B6*b'`bTrٰ-*mT6* Q QImQlnTuF%lِ1xݨmTRۨmT&SYFXTjdCFeoTVۨmT&2QڨQۨL6d ^7*C6*cUȆcnfE^Fl ِ1*F*F!cpU*jU*dCu QEm QlH!]&FUa*QUm*Ql|_*QۨJ6d n*QUm*Ql߂;db U6bƝ9519SmT6 ׍jnTSۨmT#2Q ڨQ ۨF6d mTSۨmT'K'01 աjձdChuFu!c=pϼFul:ِ1xQڨQۨA6sȶĨ!lԀ6jm6j ۨmPۨm 2_րkj5dC6j@56j`5FSĨ07&ٰM56jb5ɆmԄ6jm6j ۨ mTۨm$2SjB56jb˰:|DݨF-ZF-!c~7jm6j ۨmRۨm"2Zjdck31juJmNQۨM6d U}Vۨm&2QڨQۨM6d ^7jC6jcu &FaQGmQl|N:ju:dC06j;c8lRƋQۨC6d ^7@u6m·azFƖ&f斱V1W˘eeee22222ayY:YƼ-c>1_˘χK5:lWָW׸Td >Յ_]uk\]q25.8׸U׸xG6>7C&F=D=D=zF=!cm6 ۨmSۨm#2QڨQnW}0}U߭E}vI>tP_݁x߷uݯw\<Շq:,k AX~\ݗ1\ zЀ4"E41A46m46QU`b4{, KCFC!c! 6b Ɇ4tm46 B 6bȆ١MFlgFjFdC6A6aȆF#X7m46 FjdҾY01֍jdCsJc84Vhm4&2hhL6d n1Xm1фlh"l46m46 ׍&n4Qhm4!2hhB6d ~QhFl)W﷠&FSы6hSFS!cpMjMdC6BM6bMɆuo m4Uhm4#.%?kb4u6aȆm46m46 C CLmьlݳfF3fFs0bᙵLFshFsl9ِ1{{6cɆm46m46 )͡jͱdcu35\/-Ĝ)-6Z`-ȆF X7Zm6Z hmPhm 2hhI6z=RԍnThm$2FR#hI6d oFKFK!cp-j-Vdܜg\61Z VjVdCu6ZaȆZVjVdC6ZA6Zad=8Up6\6\ W!c$1PpUp6\Ɇ+j؆+ِ1 WhUmp#5MnpSp6ȆKt%mandC6ڨm6ڒd9vh+l6ڪm6ڒ 99Vm-іlF[hF[l-ِ1xh mUhmGo.lCj؆;ِ1:S6ܱ w!cj؆;ِ1 wh]mhG6&+]8 :F;lِ1̜a;¨F;lِ16$8_p\ixܫbhm6ڑ )vjdNgbֵwAֵWhm'2ahhO6d oWhm'2h@68S:9Flِ1_g 4YxZdC{yF!cpjdV?FGQm#ёlntuFGl#ِ1FGFG!c~#Qm#A6,yycC P6<Ȇj؆ِ1:S<6< !cpІچI6^zկ6< O OlÓl|oxmxbdC'7<6< O!c9T6ȆzL /N/ /lËlS/xƩچE6d >x9Km "2 Rp||T> NPD'NvI^NNjœ?>wRNo.]΋{I};zM|s'1E_zιRMwcJ7}pV;xCj޸xІچ7C6㩗&XچC6d  lÇl}چC6d nQ6|Fծ 61|E {L_ _l×l_8mbdC6| _ _l×l܆/᫶m鍉'lA~j~؆ِ1 ?hOm#2S⧶m ? ? ? ǹ/wy6,` Y:[Ƃ-c],c]-c!n^ޖPXX_X?X@ `P0pXelelel}wF;ߚ?'[!.B58q2~ᯮqS1x5_]q'c8u_v~&FطjFِ1l#l7 QF@6d >@jF hVKOM@dmʺm z;Pm#$2߷jF ِ1x66 n41Du#Hm#"2mmaAdC6 l#l|o6R6: ޟ|01:;TA[gqB`gFg!cpjdC6:C6:cɆFgF0٘i&Fا tjF0ِ1o& V6Ɇ`omcdC࿡ mmc]ȆoF21}]ӝ.j].dCu ]6`]ȆFX7mt6 )].j]dUObbtFWotUmt%2 mt6  mtUmt%2]j]Q Sg0CFꃹcsl#lFm uQ6BȆFmt#+S5.40M`MmэlF7hF7lِ1xF7nF7!c 覶 N60-{讶N6d }uWmt'2讶N6d ^7C6c=FǯR$51z=sj=dCh؋Pm 2衶A6d mPm$o:η21z =j=dCsJO8Tm$2詶I6d n'Sm'ыl(K)Kmыl|襶 E6d nKmыl|ϼKmћl (re*a譶M6d ^7zú[m7ћl9loFol7ِ1FoF(p@Z4&FnmbdC6BPPl#l|Px>LF(J6d >BjFmZ}`裶C6d FF>F!c=>pϼFlِ1Gmїl8{̩MF_hF_l/ِ1` F_!c9/Sm6 ׍F_F?yM~F?hF?lِ1F?Omяl{~j~dCf6m6􎭉_@6vI^>{1D6d >Rm "211D6d c6m 6#J01s05m 6 11Xmc01l jdC6C6cCFeb 6@C6`CȆX7m 6 [ C6`CȆ!!PpsCs臒 D?Tmc(1lf#m 6 ׍n Um %211F66^w=&0Q71Lmc1l|/| 1 F6d > Sm #21 1 N6EO~&1l$HNN6'r_r1N6d nc81\mc81ln ucplc8ِ1pF٨\sۙM0N 00l#l|3 wmaadC0N S6Ȇ 00lcC\L.j#dC؋Pm 2SF9elcِ1xmPm$,s1R#a1Rmc$1lnucHlc$ِ12)#6Fb#ɆHhcHlcوhlAxacsN16F QjQdCGg6FaȆ-wGm6F o6FmpshN8#xEX"-cc-cQq hDXelelelele,2gfnaiemckgo[`[h[a©5I<$u)\p W׸p\©7 QƅN5N}s85.׸pq2a W׸p<&wz1Z mVm&2_ojdC{hh!cy41Zmc41lrI&1!c1֍1jc1dC}7Qm!211ۈ Ӳ'鐮!'DmD`dCu#֍l#l|NsJFA6d n#ڈPۈ6"ɆG61"Hh#Rm#ۈ$2nDmDbdCu#֍HHl#l|M mDmDbcF˚cXX!c𽘱p/fXlc,ِ1x XX!c11ۈ"tU9#JQRۈ6ȆFQjQFِ1x݈u#Jm# ۈ"2QFF1l,@Lq8hc8lcِ1>8O7Nmc1l|2SƩm6Ƒ ׍q8qx"N%cS9exlc<ِ12)6cɆ~ƫm6Ɠ ׍xa/L nLuclcِ12)6&`Ȇ ߘ1ۘ@6d mhcl#lgTU#ZO 'Vۈ6Ɇh8DmDcdCF476h!c9%ڈVۈ6& ځnbLsD8LTۘmL$2aݘ1ۘH6d nc"1Qmc"1l||"1Qmc"C6zt#F 1j1F ِ1u1ۺl#lhF C6d ^7b G^Fpm$eLRda.]m$:I`݁x.p^UI?~Sp~[7 I{> ׃tK)KCoxN2>'q=Lw_0{c'L`291x= dɸL&2_L6&mL6c*kbL}GLQۘmL!2#>blc ِ1x1V)jS)dC6@S6`SFt^SŻgSgS6bSɆal:c8lŋ1ۘJ6d nc*1Umc*1l mLUۘmĒ W:Ĉu#֍XXl#lj,-b6bX!c}XomĒ ׍Xh#Vm#ۈ#"\Ĉs0?XG6l?Xmđ ׍8X76Ⰽ8!cFFG6d ^7⠍88lcٸVUFMLinLuc4lcِ1^4>Mmc1l{ijӰidC6A6aƼyV=mjbL3ntt!c9e:SmL6 )2]mc:1l|NmLWۘm ~[~Ę!2>c{>Z,@q)Nqw-^⮥K 8@@!D` n)P{ӵ\zͧ밿Y3{Wj+dC6VB+6Vb+Ɇ甕pNYXI6d c#[lTXm"E;Q51VXU*U*!cpUjUdC6VA6VaȆ*hc*lÕl11\E W WlÕl܆+᪶m p6\6\ W!c$Іچ+lt)`bsj8VXm&2EW^tjlc5ِ1x6VcɆjhcjlc ;etv&Q7Fmc l|_t ]XC6d nc Fmc l|Xp#2;01܄ 7hMm p#2mmandCkX7uSp6Ȇᦶm%oCxhbsZ8UXm%2XXK6d oZZ!cXXG6藥:{{6aȆm6֩m6֑ )Nmcln6֩m6֓Bzt61 롍j뱍dC6C6cɆpNYXO6d nc=^mc=l4U&ol !c@:c37ml66 mlP؀ml 2ؠH6R`cبH6d װ66bɆ甍pN٨H6d FhcF0a{>̦"=celele222ayYƼ-c>]1_˘e2`m YƎ~1봉j\TMNj &Q6I]6jؤqpD5NkMpMI]6jT`ۤqlW\Lfhcflc3ِ1x߼͛66cɆml66ml66 o66ml6Nw^mbl6@[6`[Ȇl~ml6 [`߼Emc lnl6ml6<*[z{Vlc+ِ1VV!c֍jCkV؆;ٸ Mq']mp'2mmcdC6ܡ w wlÝlwܡ w wlcXmcml6 #9ڶ ԶMmcl6hc6lcِ1xmlSfk;H>{1m3vvkvv)vnişM8|;tKZy>CC{te 1a jSZxPD|mxmx`dYı;71<?<6< O!cYO7멶mx ZxmxbdCs'᩶m 'k;!X7vm6v #~#Cmcl|~ܷߡA6d 6mP؁mxe x5u / /lËl|O iymxa^dCg{36 /!cmxmxad6 ]01 oh[m&27a᭶mx ްV6ɆmxCj؆Htڇ#M 6kS lÇl|I|6| !c~>j>؆ِ1 hGmI6\eb6vB;6vb;Ɇ=;Ɇ٩I6d ~NxNN!cvB;6vbƼWg61v ]j]dC.oR؅m"2Ew^t.lcِ1x/ إ %-i\t+lBj؆/ِ1 _ _l×lچ/K6d >Bj؆ԥzq&E`/꧶m 66 ?!c~~j~؆ِ1mmad#.'nú᯶m 66 !cpІچ?O6d /mmcdc͡UK2N21Du#@m# 2+m P6Ȇm@jnsDا&nac7[mc7l {jdC6vC6vcɆm6vm6ɆcT#P66@!cpFF H6d ދ^4Pm#$2mmb{蓮{D{6`{Ȇm6m6 {`Gmclhclc/^c{aثK6d nc/Wmc/l^hc^lc/ِ1^hc^lcq,cӆ9;h0>}>!cp}j}dC6A6aȆm6m6v3/m6 a5~~!c~c?7m6 }6m6׮WqY7zӟ1}dsjdCkp {@mqlnulِ1x8mP8m$KR7~Al ِ1AA!c5A=q8H6d n qPm qlLPcd<sN1u(uo%K?CjCdCR8m"2`8q8D6d N9mR8m& O0\V8m&2q8q8L6d oaa!cq8q8B6RY&.Gp9q8B6d ~x#!cpG#jG#dChl#lDf ?$FAjAFِ1:%S6 !cw{=AjAFِ1mmm8>9jI 6${_G_n9q.\<ٿ7IGjGS{}tvGwaU{8?_Nz/E{>Ge,2v2v2f;a EXNY"-c-cQhXe,2v2v2v2v2g`hdlb%XƮZƮYƮ/T:qqĔ` ߂U,kTd 7 f,kTd V -X]قLMp0q{X[! =OFB6d n#Q6BȆm@!j!Fِ1h#Dm#% gnop-Tm#%2 ojF(ِ1Ph#Tm#%2CPPl+Mc1h1lِ1x81c1!ccpo1lِ1:qLmql Lqhql8ِ1)IW8m'2a8q8N6d ^7C6cadēAטa hFF6d ajaFِ10h#Lm# #2mma'Ɠ ߖ>fb ؋P8m 2=1R$  !cp lِ1x/z8q'm_gb9%)jF8ِ1xu#\m#'27am ׍ph#\m#8I6&qKwqR8 mT8m$2yacC_8m$2q8q8I6d ދ6Nm6"Ȇ#&F7"`mD ׍X7"6"!c~#jFِ1x݈6"6"Sd7wn61Nq ֍SjSdCu6NaȆςOm6N wy 8q ۈ$9{p&F mDmDbdCu#֍HHl#lF$mD )FF$ql̍nbsi8V8m&2?s4{3n8k܉q7pA5N%ހ%P׸ݠ'cnk \nP1wָw7Ɔ^%"37E|76nb7Ɇ翛pq۸I6d 7߄}MM!cp7j7[dFqKF`otKmqlo[jCu6naȆm܂6nm6ns=:21nq֍jdC6nC6ncɆ۰oq۸M6d 7߆6nm6Gdib6@w6`wȆm܁6m6 )wrGmql|qGmql3{CqW|[w]l.ِ1]]!cpwjwdCs]h]l}1ˋz1&=aqOmql{{j{dC6A6aȆA6aF_kbs}8W۸m'2FrF>ٰq۸O6d n>q_m>ql߸mW۸mN6W)ΚupdCspN]mwlw!cupdC6~6~Wx@6;η21jdC0um<6 xmk؇jdC6B6bFӶ}x$zG}xD6d ~#x#G#!c֍GjGdC6A6aɆr\61֍jdCco3g3!cpϠgjϰd#?ckb<ss8|s!c16!@6d m|PmE6|ch&___ja )9/Ȇ_nِ166>l /=eb|G؋~Tm|$2H6d |#|Qm#lm|Tm|"fnⵉIm|Rm|"2Fr|"'lِ1x/ 6>aȆm|6>m|6>ul ,l|6>m|6> aYm3lghgl3ِ1nCs><FqfG"22222222222222222222222222222eχq˘_D.%rA5OI7D.[}[k\"k\"T1`K?1z; q{pKL6\\?/H,l$6m$6 ]Xm#1loNjdCQbh#Fbl# xдBM$.}$.}$jI$dC$qA$QHm$!2ߋIbm$6 FI$jIdctO&FR&UHm$%2IaHHJ6d n#)Tm#)l|NI m$UHm$#|Ib$u#6aȆabz9c8l^K HF6d o$F2dF2!c9%Lm#lTuY$&FrQ7ú\m#9l|. ڧKHN6d o$FrFr!c9%9\m#9l`oR#ES^4F l#ِ1:3Ƙ3rSZ)dC6R@)6R`)ȆF h#F l#% YCr#HHI6d ^7RºRm#%lFJh#FJl#%ِ1;j)j)Tdcc'9JHmRHm"2y3F嚸*E TF*!c~#7Rm6R ׍TF*TFjѸ$nLԢM {jdCu#56RcɆm6Rm6R H mVHm+ H\|[m]X-ҨE0OŃ{9K~K;As^5j**5}s4n]xӨy\=wڍ^ZIZIZOAZ2ia=Hv׃@}DZGUHAZ!c>"-Vm#-l,՜&F:6Mצ6aȆaz:cHd??F:l#ِ1V:X-ҩm6ґ 頍tj鰍drg41 額j鱍dCu#=6cɆm6ҫm6ғ [6ҫm62tAm#l|/< Ϡ@6d cf=f F!c9%Am#l\o4#Xd돌jdCgtAgTȈmd$2ȨH6d c#[ldTȈmd"[N%ً>٨߭h̤ D6d n#Im#lF&h#F&l#ِ13LF&LFf1d{6ML6l7%Ffl#3ِ1x62cɆuuϬL6d >d62md6sSLB6l(md6 mdQȂmd!2Y`ȢB6d ^7@Y6`YCTMb/<+ʪJ6d n#+Um#+lFVh#FVl#+ِ16+Um#+l1Ma5l6lF6!cp٠ljٰldC6A6aȆװ٠ljٰdc9Sbdp]m#;lFvh#Fvl#;ِ1x6cɆmd6md6rZϻobsJ8Pȁm 2ȡA6d ^7rCm#l|NmPȁm4Ю%I=S)9ᜒSm#'sJl#ِ1:%\Sȇm#27~#F>l#ِ1|F>|F~@/F~X7m6 mWȏm'27~#F~l#?ِ1F~h#F~l+A_2166R l|N )_m|m|E6d ^7u+ȆWWj_aFM8XjdCu6 `Ȇm6 m6 j6N0-xXƊZƊYƊ[ƾUU}cdlbjfnai2V2V2Vr>LAq{޴TPԸT׸'cWָW׸Td nkAnkAu+k\Aq2qa+qWlxĻ໭6 aȆ BjBdC}s!7R(m"2 A6 aƏ3-`bu06 cɆFaX7 m6 6@a6 cɆm- mV(lȫy.XWDo느#ICmE"E'?yqۏQ;(bw`.ߋ]R9/*C/biݺ"Q"=s =\w2.zBd Vrk%\\HX\  l(8jIIULN(J6a#m6  T TTm(Ql|߾(ܷ/Q(J6d G6m6MN_(&F1X7m6 o6aȆm6m6 (mS(m' ?y\(...Q(N6d (6cɆm6m6 (mW(m|M6R6_údCװZmklk!cװZmklk!cp_C_m|m {8QB<)P(m 2%`(Q(A6d ^7JQBmQlF hF l$Xw]()-J}j%dC6JB%6Jb%Ɇm6Jm6J X(Q(E6 to](%R(Q (E6d >sJ)RF)!cpRjRdCuQJmQl}1ˋz&FiQ7JúQZm4Ql|RSJm6J ( mV(m&2Q(Q(C6QF(mQ(m!2e`(Q(C6d U}Q(m!2*mQ(m%/TzVQVea/ZVm,Ql;;jedC6Be6beɆu/ mU(m#('l6ʩm6ʑ ׍rnS(m#2S9F9lِ1x(mS(m'%k,(olGFR}&+'4ʫm6ʓ zy6cɆ7j屍dCuT6mT6jg5:\Pۨm 25`ݨQۨA6d <|RCmQl|QCmQl5Eݨ FMFM!cQ֍j5dCsJM8Tۨm$2SjB56jm8>||}} E|]x/wyV[s?$} gow[7O.MҷzPyz?Ы%zZǬp=Ew_{^x-Z"2#jA"jzPD|mRۨm&w_8cos0&Ko1PmFm!c=16lFVۨm&2+jùFml6ِ1xYڨQۨC6vQG|[P~[PGmQl:ju:dCuu6`uȆ@u6m8}cOzg8k9eeeeeeeeeeeeeeeeeeee;X'XgXXWX7XwXXOX/Xo˹/uƍ4u~S]q¯k\]\R1g~Φ.8U׸ե'c.k\]\R1Z.qu5.ꑍ QOԃ{,6aȆQۨG6d RSۨm#2A6aƟ8Ĩ\S>ٰ}D__m>QlE -}F}!cި>m6 jd6 61vnh@6d 77}sF!cp j dCsJhFl!٘ߛ FCFC!c93Æg7m46 ) Pm!ѐl|Nim4Thm4"cjb4.m#FF#!cwHwHm46 AAHmшlF#hF#l1p|ĵ`Xԍưn4Vhm4&216r?,=W/bhm46 SuJcFc!c~1Xm1фlxܿ&FQ7Dm фlh&jM&dC55Qhm4!2M&jMdc^TrSM6bMɆhhJ6d o4FSFS!cpMjMfdêBƎ219Sm46 ׍fn4Shm4#2_4fjͰfdCfF3fFskMbNijͱdC6C6cɆm46m46 ͡jͱd#ݴǘ-DhF F !cp-j-dC6Z@-6Z`-ȆF FK{LFKhFKl%ِ1FKFK!cp-j-dC6ZB-6Zbƀ N01Z VjVdCF+VF+!c5l+m hE6d o6Zm6Z3ݳ}Zh mVhm&2G5|GFkl5ِ15\öVhm&27ZC6ZcmcljM666jm6dCu m6`mȆ6pNihC6d ^7@m6`mɆOC>bb卑卑Uhm%2hhK6d >sJ[F[!cwBm6bKkюl}\YNmюlF;hF;lِ1vF;vF;!c9NmўlT6 h7ګm6ړ hmWhm'2hhO6d NimWhmt yqgn6; fuF!cpjdCFotPmt 27:@6:`FmbtFGotTmt$2訶H6d ^7:ºQm#ёlmtTh;m oۺ"0O.mwpwv)Vw;7O.Ϸu{A'(:$-:}N ׃Nte v'v'Nt"2`= ׃N$B=f'hF'l3wy&Fg1WtFgl3ِ1V3ٰ6:cɆw;mt6: j.dlkIR71].j].dCI$]6`]Ȇmt6mt6 ׍.F.FW* (&FW6 צ]6b]Ɇ{̮쪶J6d >tsJWFW!c誶F6 yB 覶 F6d nMmэl9I7F7lِ1xmtSmt'T_.21^;Emt6 p88q/chmt6 ׍ntWmt'2ݡjݱdvC=DFF!c֍j=dC6z@=6z`=Ȇ;{@=6z`=Ɇ5=w=w=6zb=Ɇ I6d n'Sm'ѓlFOhFOlV&F/1sJ/^F/!cuJ/N饶 E6d nKmыl|NmRm&跥LFohFol7ِ1AA6zcɆװFol7ِ1x/譶nq>%v>DǙ},x }ojfna2elele'hX8xD$dT4t0}ƽ\aG}`G]ׇj>p룮q}pC5N5q}5q}|k\u翾dcYW}F_F_!c5U_꫶K6d n/Wm/їlYp_hF_l٘¯07ިF?lِ1~j~dC6A6aȆF?hF?l?٨~=(:XojdCu?6cɆm6m6 C6cFN71wwm 6 `1@mc1lݳ jdC6@6`*Fca1H6d ~@x@@!c1֍jdCs@hc@lc|+cnY -F>Hmc1ln uc lcِ1> O7Hmc1l|/f1Hmc1l6~cX jdC6C6cɆm 6m 6  m Vm !Gܭnb  Qm !2E^tlcِ1!!!c~c1Dmc=p@m&n|jcߓ ak66'2=dCjcCaab un %/ IR֍jCdCsP8 Um %211J6d nc(1Tmc(1l];Lan uc0lcِ1a0a0!cu0N1 F6d > 6m 6bwfo21 ájñdCpo Wm '2a1N6d ^7C6c#ÕwlMj#dC6F@#6F`#Ȇm6Fm6F mPam&u?jZvœ;/Asⵜgw7O.m?z#e|Q|##FG׃j?z#91x=փ"~G!c8QmGlc$powc#F0Rmc$1lݳݳj#dC6FB#6Fb#Ɇ{̑H(LjO&(ac1Jmc1lnuc(lcِ1Q(Q(!c>b1Jmc8a7[M6~6~"216lk~R l|m2~R lOOj?aS51F~c47Fm6F ׍ѰnVm&2>>{1M6d >hhchlc hB}1FmQm!211C6d >s1!cpc1jcd#~;`bsX8Um%2 ;Ǫm6ƒ )c2Vmc,1l mUm#q;db6A6aȆm6Ʃm6Ƒ mSm#2-@6Ʃm6ƓacxGx<|Gxxlc<ِ1xx!cooǫm6Ɠ ׍xѥzqA&Q7&1Amc1lhclcِ1x16&`ȆmL6&mL6& ǿ'Ę(DX7&mL6& ۘmLTۘmL$2S&9eDlc"ِ1D$qc]mGBLInLuc$lcِ1:e\LRۘmL"2`ݘ1 ۘD6d g> ژ1 ۘL61caݘ1ۘL6d ddd!cpcdlc2ِ1v21Ymc21l|ǙL)hclc ِ1xݘ)!cm16my1ۘB6d >L6mL62y01 SjSdCuc*S6bSɆaFSg _5xw^/bhmL6 ׍T4G=[41wvwvmL6 oL6aȆalup7Gži1 ۘF6d l>&`Qa&Gm 6` Ȇ[[X@6d o|޷@mcl|@H%bhm,6~#>?fb&onِ1op7߰ȆY oodC6~6~S XH6FF;{톉Pԍn,TXm,$2E^tBlc!ِ1BB!cp j EdҌ}ug2133m,6 Xm,RXm,"2y|y"lcِ1SEjd]{11;) ds5!cpk5jk5dChclÍl ?kM 7X76ܰ 7!cw;njn؆ِ17 7lÍl 7hMm XK67&ZQ7ºVmc-l|NY 电jkdCkZZ!c9e-Vmc-l<؄31։֍uj밍udC0{_p88q/chm6֑ XmSXm#2렍uj밍dc{01֋gmᳶj뱍dCzz!c~c=7֫m6֓ XmWXml m116֍ j dC0FOg Zoj"lcِ1  !c871 jdgdblFolT؈ml$276~cFlc#ِ166bɆalrp0[66ml@a6YlbjsmmyX<-c;,c^1o˘elele2gXv[-c{,c{-c,c-c,c-c,c-cG,cA_9>D5.QuL]3mmmW6sd=mz"dGK)J|qqm=dg)T΋&udbi3M86k&9dTQvv!c9e;Sml6 ?W'6cɆml6ml6<Ȇ限E=6< !c놇چA6d ox~Cm 2ߛsچI6 /;*ozS OX7<6< O!c 놧چ'I6d nT6<Ɇ OhSmA6q!);:elcِ1E;E;6v`;Ȇ{ݡA6d c3FԆ;D=6vm6Ȇ"S7^drKm "2mxmxa^dCu / /lËld#3ÆWK)Bv䫛J6[N x6 o!c9)j؆7ِ1 oh[m&21615DV6|FʗܑsS|6| !c ᣶m 6|6| !c~>j>N&E-;NN!caÍ^")E N!cp;j;dC%6vm6vCx%v]j]dCk]p Kmcl|cإ E6d ދ.]؆/٘>L _aU6|Ɇ _ombdCu _ _l×l܆/᫶m /11Ĝ? ?lÏl܆᧶m  ?X76 ?!c.!lmadNZkb Іچ?O6d nW6ɆmCj؆?ِ1 h_m 7=:5 l@jFِ1FP6Ȇm@jFِ1lc7XRa|BLbc7حM6d ^7vú[mc7lnhcnlc7ِ1n[mc7H6:޶xA#P T6ɆmBjF ِ1]@@l#lnºm!C {D=!cp{=j{=dCS){6`{ȆA6!J؃m%4+ثK6d nc/Wmc/l116TY_؋m%2ᰑ 6m6ogĜ)6aȆ=}j}dC>}>!c}16nv,6| ic>lc?էc&~1s~~!c֍jdC~؋W؏m'2p\~υ16m8>9`~+Q]/Mvxo3yqv)ſu~tvwa쭜$0<-=?AO_S;(抃p8q=8Hw_ zpZA\#H%bhm6 7|[8$l6m6 16l?rHmql!h!lِ1 Cjdcܨo11 jdC~aa!c01m6 Oy8q8B6ji>yv9x(m6 qqDmql|2m6 #--%21#jG #i "EaFD6d o~#Hm#"2Sm AmmaGF\Χ*Gs {l(8q8J6d|%uTm(ql|N9 産jGdCsQhQ ǹ/~ty6,`!P1qXee,2v2a;eEYƢ-c1XY9yXeeeeee,2`jfŘS0ո.d:}`oqS1m`;k\08? 5.׸`q2a V׸`<U\q͚nٰ@mFB6d kl#l7 QFB6d >@!j!F(ȸ-UMPPPl#lo}sF(J6d kPPl#lF(m#ZԥqL8mS8m#2`8q 8F6d nqLmql|N9mS8m'LP8.býjDZdCu86cɆm6m6 nqhql#ltd#L S6ȆFajaFِ10h#Lm# #20h#Lm# 8A6 ڭ~mㄘSN9 lِ1x8  !cp/ lِ1 F8ٸ:&FF'7]Jm _/ W6ɆmCjF8ِ1ph#\m#8I6aҶ L1D9%Bm#ۈ 27"`mD ߈Pۈ6"Ȇ)FFql8mhbO炧6NaȆm6Nm6N 8mR8m"2SNA6Nad3G761";HHl#l|NsJF$I6d n#ڈTۈ6"ɆHh#Rm#8M68Nhjb6NC6NcɆm6Nm6N 8 mV8m&2SNC6NcQdcjʽ631D((l#l (xHFE6d N((l#lnDAQjQF4٨G=[b )jF4ِ1x hhl#lnDúmD FCjF HuYĭL19%Fm#ۈ!2SbmĐ ۈ6b6b!cmĨm`dTO&FnĪmbdCsJ,Sb6bX!c9%)jF,ِ1x mĪmbg"G8#Ψm6ΐ ׍3nQ8m!2g`8q8C6d ^7@g6m8>:k+h0ۺZU8ka.ߋ,?vp\<%^mYXΪY7O.*8螟U{ch:z\Ss/czpփsjp=8Gd ~S89!czp8q8O6ҷw&y <|v^mq8O6d c3KME y!cyFĈu#֍88l#lnj=fFG6d G>"Nm#ۈ#2YM d#Nm#۸@6O\kbsa@6̯od.m\6. )pظuϗ16.`Ȇ pNq۸@6d oqڸq۸H6WH哯qQM/nEl"ِ1xq6.bɆm\6.m\6. jKd=OpwӆKd̰ۂKjKdC0sJ/g '6.aȆKpNq ۸D6d o\6.m\6. ib\eo\V۸m\&27.~el2ِ1ee!c~2qYm2qliu&^& sQΞcDEm ql9l ِ1++!c9 qEm O6 Ĉu#֍xxl#l=xmē ۈ66ⱍx!cpFF<@6 l$@ j Fِ1xHu#Am#H 2E`/m$ ?'I66d#{z71uUNq۸J6d N )W6bWɆm\6m\6 sڸq۸F6owcb\ޯg6?:]l.ِ1rڸq۸G6/ĸ'l܃6m6 ׍{nS۸m#2~>aq۸G6d uڸqn}}a|e,22n{h{dEZ[ƞXƞZƞYƢ,c-c/,cіWזeeeeee,22}Pq}6N9wHB;$k\(8׸PXB5.׸Pq2BqƅR1>](qdb[Gv51>m6 Faot_m>ql|jdC6C6cad~&apm 66°0!c5U\SmaadC}sm< MV&Q7@ml|NyjdCt>!cpjpO^K/#\66±p!cpFF8N6d n#W6Ɇph#\m#xH6ݞPxm{7/Ȇ&_m6^ xmPxm 2/`xxA6d ^ h l#lq~$cMho -6h!cjF4M6d ^7a݈Vۈ6ɆצFF4l$x)zї}xI6d 6} צ/6^b/ɆKX7^m6^ x mTxm"7c7`bu6^aȆWpNy xE6d nJml+h+l5X"ӞOMkhkl5ِ1^kZm5lkhkl5ِ1kF h۠^eM19%Fm#ۈ!2mĨm`1dC6bl#l|mĨm`oFs+L51ވ֍7jo7dCs8Qxm!2zިm6ސ xmQxm%woI1x+7jodCu-o6boɆm6ުm6ޒ )ojoX>SbNsJF,K6d >W,|+Vm#ۈ%2_5lF,K6d n#ڈUۈ6ޑ>}Cs41މ֍wjﰍwdCu6aȆalvp0[^xm#2xxO6 -Q,8IzxO6d o{{!c^=E߫m6ޓ jﱍdȮ11>֍jdCu6>`Ȇm|6>m|6> jd`ޅ:#\|Tm|$2H6d n#Qm#ln|6>m|6>1a'gb|'؋~Rm|"2#l؈~Rm|"2 D6d nImG6V L8Q7`݈Sۈ6ȆgmqjqFِ18h#Nm#ۈ#2mĩmaɆO.?E/6>cɆalpphPY~Ck3lghgl3ِ1gq>UL/{/j_/dC/pEm lhl ِ1 Em00>L~#e22js[<,c1/˘e22kKdKl[ƒXƒZƒYƒ[RXRZ,cTԖ4t>_xs֍[/83 Fo)BU vO xs O ^?k\`5.^0qspO67v#~09F|l#>ِ1x?6cɆmć6m6 mWۈm I^fbw]FS~.%`]6\ !cwԾpذ}NEmp!2. m`.dC} ᢶm$ -.HoNH@6d O %PHm$ 2. =LH@6d ^7@ 6m8ymWٖγu$Ⱥ7埩Z]w\U\܃]l+5\w~Žſn+{s}#w 72_GAnjnQŻPpPhݾ1xmmad#畟]cb; ;2d#{]zg!pWp6Ɇ w8WmcdC};#6ܱ w!cpІچ;A6ǟjpd̟xg:j؆ِ1 hCm 2_xCm 21=  lÓl,] S)pNT6<ɆO8xmxbdCߵ FߵT6<Ɇ{LOhSm"Chbx놗چE6d n R6Ȇ/8xmxa^dC. / /lÛlZpM&Xzõچ7M6d ~;V6Ɇo8xmxcdCuV6|;S>YO0z죶mU om`>f*bp>ІچcV"7|  l#!8yW[MHj dCsJB8$THm$$2S9%FBl#!ِ1:%!Pm#!K6lxvWU6|Ɇ/j؆/ِ1xuWm%2S| _ _l#٨ίI&F"o$F"DF"!c~#7m$6 '{6aȆm$6m$6$M#S9%Fbl#1ِ1xH FbFb!cpjdCFbh#FblÏl\;ѣ&S⧶m 66 ?!c~~j~؆ِ1 ?hOm'?r|Tu  lßl ^چ?O6d ^7aW6ɆmCjF:{M$n$u#Fl# ِ1xHF$F!c^4 Em$6 zh#Fl#)e&FRQ7ºTm#)ln%NJ6l-qRFR!c3IљܤjIdCkؤFRF21-kA#`H HF6d >$sJ2dF2!c~#7m$6 SA6aƆ!H.l$6m$6 \m#9lFrh#Frl#9ِ1FrF ы)Ĝ))6R`)ȆHHA6d ދh F !c^4Bm#l\Ȼ&FJ}THm$2?[-HHI6d ^7RºRm#%lH mTHmwS\MQ7`P6Ȇ)jFِ1xu#@m# 2FFH696L@o~#Pm#$2~`0~F H6d ^7aT6ɆmBjF*1zw1a'MTnu#F*l#ِ1x 6RaȆ7RTjTdCsJ*h#F*l#5٨uÜeLM6r.\y1Fjl#5ِ1:3ơWU;ZdCu#56RcɆm6Rm6Ґ KZe;cbu# i6`iȆ4HHC6d ^7Fm# l2&Fm#݆pLZh{_iji"]?+7њ$AZsq/O]t^U껟~ŽſIJ yZ=OA:F~,NMi:OA:2#>"A:\ґ須tjp=HG"d >W6ҩm6ғyKzH+}0j鱍dCp1PHHO6d >WsEzFz!cp額j6}*ҋ6[,eee[B,cY,cY-c,c-c9,c9-c,c-cy,cy-c,c-c,c-c,c-cE,cE-c,c-c%,c%-c,c-ce,}@5.0I͟S1e_uˀk\q2ޗ>ˠqp@5N2S5.qy_X2k\<s&ov_6 !cut\GmaAdCQ썂6 !c/R62vbbd{lFFF!c֍jdCQFeTȈmd$2ߛmdTȈmd"dž]~D6ŋ|&q"2F&l#ِ1*\SeRȄmd"2S29%F&l#ِ1LF&LFfh+012p-Ffl#3ِ1[fYm#3lndu#Ffl#3ِ1xȬ&ϛ/yv4 &;Z֍``l#lF0m 66`!c~#V6Bo lzu#֍l#l|N sJFB6d n#Q6BȆ= 6B6B,dc118muJa{@Em# lFh#Fl# ِ1,F,F!cȢJ6J>7]#Xd딬jYdC.sY6bYɆmd6md6 YjYldKP&F6ga` 1F6l#ِ1xF6lF6!cp٠ljٰldCςA6aƱ9:E6cɆFvX7md6 mdWȎmd'2١jٱdcf?01r9%Srm6r ׍nPȁm 2Esm6r o6rm6rE&k)l6rm6r  mTȉm$2ȩI6d n#'Sm#'lĜ )6raȆ7r\j\dCRȅm"2 ȥ M6K&Fn67|[m#7lnu#Fnl#7ِ1FnFn!c5lnh#Fnl#XP3OL<{tym6 ׍h#F>l#ِ1ȧO6]~ #ȯO6d 7Nn~F~!cpjdCjdG\P(m 2|Flِ1FF!c~Q@mQloE/Z6 bɆaE[8c8lT(m$2Q(Q(H6d ]FAF!P1&F!Q7 QHmQl|RS m6 (mR(m"2Bj6 u!g V" E0w[8F]X݁o Uja/l_OkEwE|Q?91E(ZD\?@E6`Ei{y71. OU(m%2_돢jEdCI$E6bEɆ-BE6bȆÍLbbmZ Mm6 ׍bnS(m#2`(Q (F6d G6m6 U|21;Dm6 (mW(m'2Q(Q(N6d >6m6J3_L(j%dC%E F !c9SJm6J ׍F FI1~%yG$pܒk˳%6Jb%Ɇצ%ڴFIl$ِ1x( FIFI!cp%j%RdGQR(RjRdCsJ)8R(m"2Q (Q (E6d >6Jm6J/ƻbbsJi8V(m&2a(Q(M6d >sJiFi!cpj2dvx~p51e2je2dCu e6`eȆ;2je2dCsJhF an_#fGYw(Ĩ"FX7mT6 ۨmTQۨmT!2QڨQۨB6d ^7@U6`UƑ*Ĩ*FUX7mT6 ۨ mTUۨmT%2E^FUl*ِ1{HUjUjdcLjbߨQ ۨF6d 7V [Q ۨF6d _ WSۨmT#2ߨmTSۨmT'䘘Ĩ.FuX7mT6 ׍nTWۨmT'2aݨQۨN6d oT6mT6jD.`b?U#T F !cu/Pۨm 2Ekm6j )5j5dRMbN 甚j5dCkؚp [Sm&Ql|N 甚j5dCsJMhFMl;1/h>M;wSln":[wwdC:;ﰍȆl|Ql4wt=iMZߨZjZdCu6jaȆZߨQ ۨE6d ^7jA6jm8y6gC^gj g hQ.\ߋwjߤvP\܃7uݯw\ܛ]QOmQl䭹ڻrQ_|>v}F}!cpjdC6C6cɆC6c FLܕCLZ Flِ1~g@mрl|v 6` ȆhhH6~ߒ bZVhhH6d n!Pm!ѐlm{цj dCsJChFCl6üMFhFjFdCsJ#84Rhm4"2hhD6d ދ66m46Ih,ýjdC6C6cɆm46m46 h m4Vhm4!n'fh"FX7m46 hm4Qhm4!27~Fl ِ1hhJ6N tTh m4Uhm4%2hhJ6d n)Tm)єln46m46Fkb4sȆǢm46 hm4Shm4#2_6kfjͰfdCޛA6aFݿS:9\4Whm4'2_4jͱdC6C6cɆFshFslp|ߵ9J {-6Z`-Ȇm6Zm6Z -`/Bmтl|Bmђl,5B&FKQ7ZºRm%ђl|Ni 甖j-dCu%-6Zb-ɆFKhFKlXb5kXٰ}dF+lِ1xhF+VF+!c^E[m6Z hmRhm&_/jbpZm5њlFkhFkl5ِ1xh FkFk!c95Zm0"v-c,c-c],c]-c,c-c=,c=-c,c-c},c}-c,c-c,c-c,c-cC,cC-c,c-c#,c#-c,߇iC5.f8k\knBkqmpkC5Ngd32m5 qmƵ5Ƶ5 8m`kqmזlӻ.ib}s[7Uhm%2¾F[l-ِ1F[F[!c-Vm-юllnR&F;=v{6aȆaF g ۫r6aȆm6کm6ڑ ﷃ6کm6ړ~gE /cbu=6cɆF{X7ګm6ړ hmWhm'2SC6cFLFhFlِ1̻-16Jslmt 2蠶@6d >t6:mt6:g:V(zFGl#ِ1z#\owTmt$2ߋb:mt6: )jơivhb|/l|m|==ِ1Lh$O_Ck{l{!c=߫m|m|O6d n{h{ﱍNdcl;&F'aImщlD'x^F'lِ1NF'NF'!cpNj6:ux[sٺΰ.\ߋn<[י؎vuV;lw`.uמּw\ܛ]uw s֍["z.wQ.t/c> #t 91x=EtQA!cz袶J6?S*]v.mt6 MµiWFW!cmt6  mtUmt#?uoMԍnntSmt#2`覶 F6d ^7Mmэl|ߢMmѝl4Y[lZ&Fwcv=fwFw!cpݡjݱdC ]m;ѝl|ߢ;]m;уlm֡Ľ&FaCmуlfaR-_ &Flِ1)=6z`=ȆFFOq=Ŝ)=6zb=Ɇצ=ڴFOl'ِ1)=6zb=Ɇm6zm6zU obu6zaȆ{^ E6d nKmыl]^F/^FoѥWS LޢnuFol7ِ1x6zcɆm6zm6z j>d#WPL>;}wm6 mQm!2裶C6d >6m6Wkbb}F_F_!cp}j}dC06J;c8ll9gx ^m%2SB}6bƮq/'km6 mSm#2_~j~dCk~F?~F1ҍE6cɆa]aëVǣ=CO6d >sJF!c~?_m?1lC csN1/ /:v26`Ȇװvlcِ1!c11H6\~L1Pa1Pmc 1l|N甁jdC Tm $2EB6bE&kcb "O "\{ȗem 6 )2Hmc1ln uc lcِ1xm Rm &S:Ɔ51pk`lc0ِ1`5Xmc01ln uc`lc0ِ1x11B6jo& ! C6`CȆ!pN1B6d ^71Dmc1l|Nm Qm %u&PQ7º1Tmc(1ln ucPlc(ِ1PP!c11F6'yU&0Âo Sm #2`1 F6d nc1Lmc1ln 6m 63l.7jñdCuc86cɆm 6m 6 m Wm mN1B)#2Bmc1lnuclcِ1!c9e1Bmc1ld:rڞn&HQ7Fº1Rmc$1lnucHlc$ِ1HH!c5HhcHlc٠&(g0(aQjQdCuc6FaȆm6Fm6F ׍Q(Qv0/0-26262626262626262626262elelelelelele'\<|BϖEŖ_,cK,cK-߇M5n[2NEo4F5n4q| 7׸Td ^F7Z]F7jkhXFkh{s׸`E]/y~;0`Ϳnp~Žg~=sxx!cxQy+M bm1ۘ@6d ^7&1Amc1lhclcِ1xݘmLPۘmL$ޝ3v<Ę(攉pN1ۘH6d 7V& [1ۘH6d >LsDD!c1ژ1ۘD6:~Ę$lL6&mL6& [L6&aȆ-&}IjIdCuc1Imc1l>3&d1Lsdd!cpjdC6&C6&cɆL6&mL6F#Q511֍)jS)dCOOQۘmL!2S9elc ِ12ژ1ۘJ6R繓c1ژ1ۘJ6d ދNTT!ce16̗㽿1ۘJ6d >L6mL6{o 9i4i4!c9eSmL6 )2Mmc1lnL6mL6~$+g8GQ7~uGɆmm##ِ1#S~Tl|_GhGdSEGLthctlc:ِ12)6cɆtX7mL6 )ӡjӱd#wL41f3j3dCuc36f`3Ȇm̀6fm6f )3j3d# iMb ;agm6f ? Tۘm$21ژ1ۘI6d nc&1Smc&1lhfSLYn̂uc,lcِ1xݘ,Y,!c~c7fm6f )YjdcYc1ژ1ۘM6d ŏll!c1֍jdCuc61[mc61l&1́s9!cps9js9dC6@s6`sȆḿ6m6~"z9? ?A?mmD6d n'h'Ȇmmِ1'h'd,c m6 sa1Wmc.1l\hc\lc.ِ1621jsydc򥻡>sLyߘyjydCuc6aȆ{y1ۘG6d ^7A6aw|koĘ/pN1ۘO6d ^7ú1_mc>1lṅuc|lc>ِ1dM dc|lc/h|L,xlcِ1Fsg ۧHm,6 ׍n,PXm, 2FXXH6FtvPԍn,TXm,$2S9eBlc!ِ1BB!cuBhcB ᘟ͙ t8pK癤 V.\U\yqwxq=~g8k?ᄍ7x!=Y}`V5([$__p=XDw_`z,`Z"\w.6m,6qo.61;dü"-VXm,&2a#_پXL6d bbb!cpj_ƣc/pm//dCuX7~Ql//j` M6~QXB6ַiP/2csN1uc xײn,QXm,!2?˸e\XB6d 6]%jK%dC6@K6`KF$c^nb,uc)K6bKɆRX7m,6 X m,UXm,%2߷X m,UXjVw_t_z߆q|c-c+,c+-cZVYV[XZY[6X6Z6Y6[ƶXƶZƶYƶ[~nckgo;`;h;d2qossZqfYF5rlXk2\Q1LkጁL]jTj-5n8`[qlӼ21pmrlc9ِ16cɆp[XN6d -6m,6V}Y\mb6V@+6V`+ȆgWm6V XmPXm 2+j+dcRC51Vy%Wm6V ׍nTXm$2XXI6d oXlT=:WaWhW__Ɇ] ]++ِ1^̯p/W__Ɇm m+lxZpc X XE6d ,3Æ5UjUdCuc6VaȆ6Vm6V:V~ZX mVXm&2SV9ejlc5ِ1:e5\VXm&27VC6Vcke=lb6@k6`kȆ/Z/ZXC6d nc Fmc ln6֨m6֒ F&Zac-Vmc-lZx~jZlc-ِ1ZZ!c5ZhcZlctm(vcXîkuj밍udCs:8SXm#27~c:lcِ1x/XXO6t^^ԍnWXm'2aXXO6d NY)6cɆz՝&Q76Amclhclcِ1x !c9eAmclt krQmlT؈ml$2E7^tFlc#ِ1FF!c9e#Qmc#ld;wr&&acImcl&hc&lcِ1 )66aȆ&hc&lc3x>LV{Mfhcflc3ِ1ff!cpjdCj-dc{+71[-j[-dC{[-!c5ݢB6d ދn6ml6LLVx&wVlc+ِ1x/[6b[ɆتJ6d ol6ml6Uc`ئ F6d >ls6m6!c9eSml6 mlS؆ml'+|zz.7j۱dC{_vv!c֍j۱dCvhcv !ٺ_r˜D^M-7sq/Ops^Ո~;0`/<[(~Sw\ܛ]<~7= ׃t'i|:qCo#v>b`};j;p=Ad c"vE`1\ءI6j4P c0/턕aNlc'ِ1{;{;6vb;Ɇm6vm6v  mT؉m"41vs1wm6v `Kmcl]j]dC}.hc.lc7ٸALlnx`nlc7ِ1dFtnlc7ِ1c7\V؍m&2߷ mV؍mN6t21~uwX7~Wlnjc ׍a]mwlw!cpCmm!-2{/c8˿ߣC6d ~`<[Gmclhclcِ1w@{6`{FKZ{31֍j{dCuc/{6b{Ɇ{ѽݫK6d m/Wmc/l]rvyc>>}}j}dCg6aȆ}اG6d >6m6Ζu/;jdCuc?6cɆpNٯO6d mW؏m =">8 pN9q8@6d S7Z8c8l[{(ͬvYq8@6d nq@mql| {8q8H6-0qP8mT8m$2a8q8H6d oAA!cpjCdMuqH`qHmql|8q8D6d o!C!!cu!h! an8"-8b;j;f;n;a2v2eeee/Y9yE%eU5u Mߖ[ۖ;{Ę[͟a7}au;kaq2ﰺ508׸ðV׸ø'c0q50 ޛ&aqDmqlhlِ1##!cqDmqloB[&Q7}QQ!cpGjGdCkpMuTm(ql|/(qTm(ql'IV&1Q7qLmql}c}cjǰcdCu6aȆc1cqqXM]Džqq!cq֍jDZdCu86cɆC6c'}R'  !cp'j'dC6N@'6N`'Ȇ h lA_ob!?`dC0sJSg KM ??ȆtmmA6d nh?d#s'E8 II!cq֍j'dCIoT8m$2q8qlܚ16Sԍ?aSmOlO!cpBmmI6d OvZc ׍a[molo!c~oho[ds\M[n܂u-lِ1-qKmql-h-lِ1r ڸq ۸M68fbmm!c93Æmm!cpjdCj;duzL;n܁ulِ1:\Q۸m!2qڸq۸C6d ^7@w6`w?=]/㮰qڸq۸K6d n.qWm.ql|.߸q۸K6d o܅6m6ac\mb=؋S۸m#2_܃{j{dC{prOmql|rڸqn}E~&0Xeee,2i{l{b{j{f=E[^Z^Y^[b,co,co-cwO8gaB9~ ZB*Ask\(8׸PXB5.׸Pq25qƅR1x 5.T]Bwl:ް51>m6 Faot_m>ql|jdC6C6cadLlb9 ajaFِ10h#Lm# #2`m aFFlLĵcl< jdCs89%\m#'2ߋ 666u?ٺPCv^׳uaxv\ߋwP}ᄍ7׳u=q=xDf끵ӥ01#\ݗ1\:xv׃G@"zD<6m<6"/IibDFFA6d n#ڈPۈ6"Ȇ#}FA6d 6"6"HMH/>Tۈ6"ɆHGDmDbdCg#HHl#lnDBjc<6m<6^KS幓xS!dv lِ1//6^`/Ȇ/6^`/Ȇm6^m6غ~bbD FF4M6d oD~#Zm#ۈ&2ѰnDmDcdCsJ4m$U ɜx)zї}xI6d /aȺ7ܳ}Ck%lKhKl%ِ1K+sLW+h+lِ1x 6^aȆ{W} xE6d nJmljD&ka5Zm5lfNiG}Ck5lnukl5ِ15Zm5C66JĈSbl#lY[ |mĐ 1Qۈ6bȆF m!MN?-Fԍ7nQxm!2x7ިm6ސ ׍7nQxm!2_6ިm6ޒ4ox+l6ުm6ޒ oaVm-lx jodCs[h[l#l׭b  װjF,ِ1 XXl#l|NsJF,K6d ڱFF,lz`LwxwjﰍwdC;w;!c֍wjﰍwdC;h;l=<+jxB&{Q7ú^m=l|NyjﱍdC{oWxm'2jﱍd'LjdCs8|Pm| 2S>9lِ1LHv@6>m|6>1՛N(jb|u#6>bɆGX7>m|6> ׍n|Tm|$2E?B6>b71> OjOdCu6>aȆm|6>m|6> o8c 6>aqdcHΖ01ℍ8h#Nm#ۈ#2߈qjqFِ188l#lw˘FF݆pgs&i9Lge|Vla.}=>{tI +glg>{Y}?z~$z_D/׃/te >W|s/|!2_`=׃/$B//vl//o8/os%Z,c1˘e2m%ZY[,c$d䖱Xe,e,e,e,e,e,}8= ]9 oB?I'_u5.^qs O  A?:qB׸x!ϩc/>٘C&F|a#>_m#>lnqobhm6 ۈmWۈm'2y3_m#>B6jR.! .!贾چ B6d ^7\`pQp6\Ȇ]Bоچ B6d Vr6\6\d#çW21utNH@6d m$6  BPߜ@m#lF3dN 6m$6\/Vbb 놫چ+J6d ^7\apUp6\Ɇkڮj؆+ِ1ig9<6\6\ 7Q5UM v Am7 7lÍlY[z즶m p66ܰ 7!cpnІچN6Z/|Zuiü,N6l/mcdC[~]mp'2S⮶m )pNqWp6dCsS|6| !c9Q6wG;oH(l$6m$6 ìa[9c8l8 vobhm$6 ب1lR}Ck#!l|NI甄j _A6| _ _l×lnº᫶m l1~Ck%2nmb!G'ilb$6A6aȆ{DMHD6d S79c8lt&F"l#ِ1Z 716aF1՛s9lbFb!cpjdC :c8l*Wobhm$6 016c~dË~n᧶m 66 ?!cQ~Z~؆ِ1~ІچO6Ζp<61<_m'27a᯶m بQw}Ck'2?[mmcIjeb$u# I6`IȆFX7m$6 )16N-~Hm$!2HHJ6-ݰFk#7~#FRl#)ِ1{_I{_I6bIɆm$6m$6 IjIdd#UݿSokb$sJ28$SHm$#2S9%F2l#ِ1̜R Hm$#2ɠdjɰd 5>#aHHN6d n#9\m#9ln$u#Frl#9ِ1x/HHA6V(h#)`HHA6d nO nO F !cxM,cb8ltwobhm6R ))j)6R!gR4ZDJsq/J kDJv^e5.e_kRlǟMuA!w6 !cpAFFD6d n#R6Ȇ h#Hm#H6zu}Qg62bɆ挰oΨH6d n##Qm##l7mdTȈmd" ͛xɹ2 LdO62aȆF&X72md62 kgRȄmd"2mdRȄmd&-{}Y3vfFf!c֍jdC62C62cɆFfF0pl$7ab,F0L6d 8>3V6Ɇ`8mcdCh0m2z?N Q6BȆF!j!Fِ1xu#Dm#!2!FFڻ:dMWLMC,33[f̒dfffff[ffff[v߼=>nȖ\T?EF歪F6tޯ)f,lLXg r.Lm# #27`m ?;( >;(Lm# #2aFFlpH*)I:%FRl#)ِ1)I6bIɆm$6m$6 ׍FRF2eb$6A6aȆm$6m$6 `Lm#lF2h#F2l#9x=~}L55jɱdCFro$WHm$'2aHHN6d HHA66MB)`/Bm#lHj)dCu#)6R`)ȆF h#F l#%>{#Mb#%HHI6d ^7RºRm#%lFJh#FJl#%ِ1sSB)6RbF~窆&F*Q7RJm#lHTjTdC6RA6RaȆm6Rm6Rz֪Za/Zm#5lFjh#Fjl#5ِ1FjFj!c~#5Zm#5l ݻq#E^4Fl# ِ1xi6`iȆm6Ҩm6Ґ ׍4F4vM^iͽuuiaH.[i֥g?짵}s`vm!sV}zy_7҉"`cLZZjdCsJF8dTȈmd$2aȨH6d mdTȈmd">.#2md62 ׍LndRȄmd"2 Ȥ D6d ^72A62aF `bdM͵~FoVL%ˬL6d odVȌmd&2E3^4Ffl#3ِ143Ym#3l<3婉&FodF,F!c9% Smd6 mdQȂmd!2Y,jYdcEO61zyEV"yD/FVl#+ِ1 -Y6bYɆ甬pNɪJ6d ~NVh#FVl#h=1SMlululjٰldCu#6aȆF6X7md6 )٠ljٰdùe4#gN1dv3lvFv!cjٱdC6C6cɆFvh#Fvl#V&FQ7rCm#l|Srm6r o96r`9ȆA6bJzb$@ﱐCm#lgbk؜p Sm#'l՜՜j9dCu#'96rb9ɆaFiO  16rbFϟmbu#6raȆF.X7rm6r ׍\nRȅm"2ߞ\pNɥ M6]NFnFn!c^47Esm6r SruJnFn!cpj|F>!c(m6 'c[~"lSȇm'D&F~T6cɆa^3Xy$ȏm'2ߋbm6 ׍nWȏm 7Lr`(Q(@6d >sJF!cQ֍jdCu6 `Zabu 6 bɆ{т-Q(H6d oFAFA!c |$;P(m"͂No($l6 m6 6 aȆBpN)Q(D6d smO x'ŸF!BFavSX5&Fa>QllvQѭFaFa!c90S m6 %716 cɆa^A |6 m6 z֚EDQE6`EȆFX7m6 ׍"nQ(m!2٨]ñə~F"vM^Eͽu*y`bTh F!cQ֍ j dCh F!c^QAmQl[WֈjuWso]]xm]ٯk?!s^W}zPΧz[=VO}zPξfzjp=Gd ^zPO-HA=hF=l>hrLb]VjdC}D}X#m6 ׇ6cɆJjHz_11"Hh#Rm#ۈ$2nDmDbdCu#֍HHl#lnDBjF46m46A_hZfd9% J˛Sm46  |7Shm4#27~F3lِ1xhm4Shm4'MJ01pFsl9ِ1:9\4Whm4'2hhN6d n9\m9тlXsq/M{rl Qw+`[m6Z ߓޓBmтlm{j-dCsJ hF l%8#&FK S7Z ۛThm$2-ahhI6d ~=sKx=sKFK!chhE6&g:˯&F+ыh+VF+!c^'cügobhm6Z )JmъlF+hF+l5٨}?.51Z jdC06zb86Nc&Fkl5ِ1xh FkFk!cpj6dqû71ڈ^ Eۨm6ڐ }{_m6`mȆm6ڨm6ڐ hmQhmDER%(oDmDaQdCF76(!cpQFFE6d n# ڈRۈ6VLhQ7a݈Vۈ6ɆADmDcdCF476h!cpFF4іl^2=6z`=Ȇzj=dCQPm 2߷mPm$V=Z{N'm驶I6d ^7zºSm'ѓlj=dCu'Sm'ыl*41zylE{ E6zaȆF/X7zm6z ͽ`KmыlomRm&qplbp[m7ћlnuFol7ِ1)6zcɆFoFz_bb6@}6`}Ȇ}zFlِ1>F>F!cp}>j}d=S+諶K6d ^7ºWm/їl|N 甾j}dCsJ_hF_lȕ;?DF?~F?!c_Nʷ16aȆ{~G6d 觶o^ 4'诶o^1xFFFX7m6WE NmWm k&1 s!c 6`Ȇm 6m 6 jd!&@ac 1Pmc 1l{сjdC@؋Tm $2jAd䋡11yEID6lf1D6d nc1Hmc1lzAzAjAdC hc lc0aΖLbb uc06cɆýjdCs`8 Vm &2ceb 6cCƙJu &ac1Dmc1lhclcِ1!!!c9e1Dmc1lL t.l01uPN1J6d > sPP!c9e(Sm 6 )CjCadJab 0o Sm #21 1 F6d ^71Lmc1ln 6m 64s6L9s,m 6 o 6cɆpX7m 6 m Wm wwHjc7F~clcِ1x1#6F`#Ȇm6Fm6F o6Fm6FEGOc0#Ɇ#6Fb#Ɇ甑pN1I6d >sHH!cuHhcHlchwt&(Q7F1Jmc1l|NQjQdC6FA6FaȆ(hc( &&ϽuIj"}<{F1Z`݁9xsz hm? h9:onՙq&7Fԃ1Q1/c>b #ƨ` 91x=EQ!cs 1Fmc 1ll;W6ƪm6Ƒ"ۺ'=qj㰍qdC6A6aȆm6Ʃm6Ƒ mSm'=~/1O6d {j㱍dCsx8Wm'2SC6cFUĘ 埠1ۘ@6d nc1Amc1lhclcِ1~ jdPr=I=I6&bɆߛe"|ojdCsD8LTۘmL$2S&B6&bwӳ(1IԍInLRۘmL"27&~c$lcِ1I$I$!c9e1Imc1lT>v&d:d:dd!c _tdlc2ِ1dd!c1ژ1ۘB6u&1oLQۘmL!2)jS)dCoLQۘmL!2 mLQۘmL%1&1Ua5TT!cQñ}Asɾ1ۘJ6d ^7º1Umc*1lnL6mL6 g-kAc.c.c4lcِ1x1 6aȆ4X7mL6 ۘmLSۘf<ܗh#r1Yٖ9yEŖ%e喱UՖ5u M͖-mLנ 7{7׸Td pjܟ)LO7Smc&1ln̄ucLlc&ِ1xݘ mTۘm"+<1K1_mc>l85Lhb,6@ 6` Ȇm,6m,6 Xm,PXm, 2]p@mcl:W5T61uBNYXH6d nc!Pmc!lBhcBlc!ِ1XXD6Npjb,uc6aȆm,6m,6 `/Hmcl]m,RXm,&/קXSubb!cpcblc1ِ1v1\.VXm,&2j6{bm߷n K"E~=[k%v[g%곿~㶅x9_R:??wTKaT}zξRX,`)91\K"zD,6m,6:ѲLw.6aȆ_C[_C[ XF6d ncLmcl2hc2lc9X0T11s95m,6 \mc9l|$6cɆ—C6c+FJ]kb׺׺PXm 2+_+Ȇ|PXm 21Ws lcِ1 J21V֍j+dCuc%+6Vb+Ɇm6Vm6V MWB+6Vbƫ ~41VJ c*lcِ1L/ذ=h*lcِ1 )6VaȆU*Uji MբnuXXM6d ~jxjj!c^t5EWm6V NXXC6a&:ܜlf\Ʉ5jk5dC1Y"lc ِ1xX5!cXXK6mpncXîkXcZlc-ِ1xk6bkɆm6֪m6֒ X mUXm#M\cSXm#2Z֩m6֑ )Nmcl|XXO6ߵ"u c7~czlc=ِ1xXzz!cp롍j뱍dCz1얳gblS3@6]*y aclcِ16mP؀ml 2S69elcِ1x/ؠH6ʏжMcFlc#ِ1)66bɆml66ml66 )jMdλFls-!c^t Eml6 ׍--VQƥB>Lzz.cVlc+ِ1x VV!c9e+Sml6 [jd#i5s;D6m6!c ֍mj۰mdCuc6aȆml6mlOc"χ{ylcFmFm.lcِ1 )6vaȆm6vm6v ]lR؅m&۝[\k^k[mc7lnhcnlc7ِ1n[mc7l mVm[7޺=أ.c>[{|9@S>7fP|`/Sbk}^GU쥳/c`/91c/\U؋^!czثG6^6:ϳ0KђاG6d ~>x>}>!c>b#m6 ?cOmclp]hb쇯W؏m'2#>b~lc?ِ1~~!cد8@6ƮLz 〸lِ1ڴ'c6`Ȇy|>lِ1hl ٨V?CL8jdCAA!cq֍jdCu qPm ql8P}18$'P>s#!cpG#jG#dC6@G6`GF]eb딣prTm(qlnuQl(ِ1QQ!cpGjGcd# GqL`/zLmqlnuC8m#2qLؐ16aȆm6m6CG28.l6m6 8mW8m'2=.Ee q!cWC6c'=oob ؋P8m 2q8q8A6d ^7NqBmqln6Nm6N.ϗi:8)^_= __=q8I6d n$qRm$ql| {Rae I!cp'j'Sd#[M61N9SNm6N ߓ{Jܓ+chm6N 8mR8m"2:mR8m&Z98-pN9q8M6d n4qZm4ql|N9 jdCihil ٠O31Έq֍3jg3dCׁjZg3dCu g6`gȆm6Ψm6Β[gE8 YY!cbC8m%2ga8q8K6d >6Ϊm6ΑM'<8'l6Ωm6Α 8mS8m#2_Þksj簍sdC6A6a;lXj籍dCpr^mel2ِ12\^V۸m\&2S.9el2ِ12qYm2ql<\hb\u W6`WȆX7m\6 0WCk ql:++v1W=IZ{+E\0z/$]5UsUQ\Uoί9>Wy<\ q]m:ql~N6luu!c~:쇯m\6 ?:q]m:qlhJo~ lِ1 rCmql|}om6n ׍ M- 3W7MM!c)Jڸm$2qڸq۸I6d mT۸m"b(ĸ%uuq ۸E6d r nm6n `qKmql|NmR۸m&11n^6Eom6n \_TñaUml6ِ1xq6ncɆmKn7wĜr)w6`wȆ)w:lِ1;;!cpw;jwdJl21 wjwdC0u'cÙQNM ]!c~.7m6 ۸ mU۸m#vrqO||Omql|rSm6 ׍{nS۸m#2qOmqlTɶz_&}o܇}}!c0}l>ِ1x/z6cɆm܇6m6 kb<6@6`Ȇxx@6d n@mlhl!ٸ67sl71~!7m<6 a5CC!c~!7m<6 xm6m<6g(x*SX7m<6 wwTm)lShSl)ِ1xxۈ#k~&FG&#mđ qSۈ6Ȇ)qpmđ ۈ66Ⰽgdt&3Q7Lml3h3lِ1g3g3!cpϠgjϰd#w*361֍jϱdCss8Ͼ9x0;xܶ9U}-I-Zr{+[Xު[\ٗ1-\U;x[r cfy+ޛEЊx[!czxxG6js &;Oa.{G6jL^Nml|xwjﰍwdC};GSxm#2#A6a/>{yx/=jﱍdCu=6cɆ{X7ޫm6ޓ ׍{q<g¼ok[%O!6>`Ȇee@6d v6>`Ȇ->@6>`9o.eb|~GG!cG6H6d n#Qm#l|Nm|Tm|"?q嚉l\/81>-C^ImlOOjOdCkOpmImln|6>m|6FƘuy{01Exxl#lhF<O6d ދ^4^m#ۈ'2FF݆|s=?K>Cyf+xxYƼ-c>1_˘e2` YƂ-c!DĖPa?>'vMwgn60 C{S!|ǖ0u:Yv|,ϲ1ϲ+,g~rw?mbx+ ^j^؆ِ1xC/ /lËl? CچE6d xA^j^؆71&fwM oaV6ɆaO dž6 o!c; j؆7ِ17᭶mt)#l@>j>؆ِ1xC lÇln᣶m  hGm%Ao7\6| _ _l×l܆/᫶m UJ_ _l×l6|6| ?qdӕ~a9~a9~j~؆ِ1x ? ?lÏl|NsچG6d nS6ȈO=61 h_m'2mmcdC6  lßl|N66a 6l#l0WF@6d kl#lFFH6[g&F`n70 ]m T6Ɇ{@؋mbdCsJ m+DM 6 !c9%)AjAFِ1 h#Hm#"2mmadc?M0Gpz#Xm#&2 mmcdC6``l#lF0m6Iu#֍l#lFm ' Q6BȆ{h#Dm#H@6n7&Fa#@m#lFh#Fl#ِ1:%\$PHm$ 2HHH6fu6LFBh#FBl#!ِ1FBFB!c9%!Sm$6 '6m$6UHHm$RHm$"2HHD6d ^7Hm#lHm$RHm$&&t7>&Fbּȕl^JHL6d n#1Xm#1ln$u#Fbl#1ِ1xH m$VHmdbSB)jF(ِ1F(U6BɆBWF(J6d oBjv[]tOb_νct#pד7 KJC$'6|/}瓜۠'>)>)IwI O bL${ҽK 6}YWRן\w{|qL+0&{>q3]?}㒺 u}Lr㛸92w, K._/_mBW)+WI߷y3ҿ{97IX1ѹoE>￸ƹ7qh _\w>7?5/(НgWޟlu;]N&M?N/_S̟p-&vepvh;Bmگ++9WwЯ߿cg\1]CGsY?4u@h/v9ret sꝋ>lhbMt;q%^f~vvpo]^a!.3| {x}vPwkї) /o׿Bvӯ͟/v 'd:?N's ?g}grzCnBAO-hD.W;B{+ny,J_*9"?8e|| 7 pKMY}O.kW+5+ʕ>.Ώ[;Mrsj:Ǭ7xsuq)7w{rWG֧?_Obq~}?9~WCyrtG}sL_GY?C=yhWH{}.*LO 3\H $|ŏPח?wn\ki$/Z~tϵ9?:Zl&U-\Kwp@&pOܿ]*wv6 )G9p# ׶yd訟봨s-FEԏlXcDȨ-[EDi4*KځYfʯ>WNa*s:EZ+k~e2oX:~);+Z5O*z.:[rtgLZ4S{H+Ky;M{:vmŝXN~\.d.A_ ˿-(__ YZ [xWh133X,e1333bffh13ڒߵ'/dWVέoÜ}zzϜ|g8B@A}3tf^mHg"4aK8o(2QJ4"6qK<Ⓚ$"1?$#9)HI*R#=H&2d#;?"7yWz )BQQ)CYQ TBUQAMjuK=Ӏ |7?P)P;իzGHso: bv3ƺWp>eOпU{@g? b xoĘtoMZ熁Zg?]F%Bӿ$`Ng3R? =?zLciބ4?$TԌִ!<=H':Ӆt;'Mҏ"ޫ_e_-Kc5AL@ݩܼIΙd:t47Y7qvݚtנQ&"7[lӠ`fE'g覆تSJ0AY_فFi8Qm5{aKA""SS2#'RK6`y6`nc݀ɟٗ@m~SAo#|^@Y(ۢQv5휨h;!o; ?PcK"2[$RP4P} w}7oڴE&GT+ h4_GZ%szs]E+#JO m׵CD.z% ,{B Pm母Q8zשe9Aq#9INq3\@Q@c_׹Mnq;x=<1Ox3󂗼5ox;|3_?7ׁJ8 DQ,p@]rPm-aK8?BT$C\$$$$E]NAJR4%@F2,d%$C^)BQQ)CYQ TBUQAMjQ:ԥi@Cј&4iAKZњ6@G:љ.tAOzћ>_ dP30dX1 LdT1d\1,dYRdY1Zֱ ldVd^9Qq9Yq \UqoyC'<yK^7G>/|d*BP$; MD "L &M$ !H$!)HN RԤ!-HO2d!+Ώ 'M (LR┠$(MRT"LRD jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(_F2ьa,&2La*Ә f2a.,a)X VլWֲl`#`' 8r$8r\"r&~.<)x ^׼-x>|w+_<AJ08 0%@D"(D%щALb8%I@BHBR$ICZґ d$BVANr<%)@A Q")AIJQ2@E*Q*TԤC]Q4iBSќiC[ўtBWѝC_џ dP30dX1 LdT1d\1,dYRdYïeF6-leNv;Ae9Aq#9INq3E.q+\׹Mnq;]q<ySy[|W L $MD "L &Mcw@ %HMҒd #LHr!/O R((N JRҔ,(O*RT*ըOԠ&MR4!hLҌ洠%hMҎt#Lҍ'Mҏ ` 2`$2L`"2`&2,`!X`%X~e-X6la+va/r(8 NrӜ,8.r\*׸ nr7r/G< Oys^W oy{>O| _w/O $MD "L &M$ !H$!)HN RԤ!-HO2d!+Ώ 'M (LR┠$(MRT"LRD jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(_F2ьa,&2La*Ә f2a.,a)X VլWֲl`#`' 8r$8r\"r&~.<)x ^׼-x>|w+Οx A FpBP& a Gx"HD& QFtbX&qG|D$d$')IEjҐt'DfldGr\&yG~ PBE)FqJPR e)Gy*PJT UFu~5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~g`0a/ g#h0qgd0iLg3l0yg Ybe,g+Yj+kYz6Mlf [vv]f{~pCG9qNpS g9y.pK\ Wunp[q{ycg</ykwg;o|O L $MD "L &M$ !H$!)HN RԤ!-HO2d!+Ώ 'M (LR┠$(MRT"LRD jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(_F2ьa,&2La*Ә f2a.,a)X VլWֲl`#`' 8r$8r\"r&~.<)x ^׼-x>|w+_R BP$ CXD$BT$C\$$QEd$')IEjҐt'DfldGr\&yG~ PBE)FqJPR e)Gy*PJT UFu~5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~g`0a/ g#h0qgd0iLg3l0yg Ybe,g+Yj+kYz6Mlf [vv]f{~pCG9qNpS g9y.pK\ Wunp[q{ycg</ykwg;o|O. L $MD "L &M$ !H$!)HN RԤ!-HO2d!+Ώ 'M (LR┠$(MRT"LRD jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(_F2ьa,&2La*Ә f2a.,a)X VլWֲl`#`' 8r$8r\"r&~.<)x ^׼-x>|w+ΟH/0A- AHB0%@D"(D%щALb8%I@BHBR$ICZґ d$BVANr<%)@A Q")AIJQ2@E*Q*TԤC]Q4iBSќiC[ўtBWѝC_џ dP30dX1 LdT1d\1,dYRdYïeF6-leNv=e9Aq#9INq3E.q+\׹Mnq;]q<ySy[|W] % AHB0%@D"(D%щALb8%I@BHBR$ICZґ d$BVANr<%)@A Q")AIJQ2@E*Q*TԤC]Q4iBSќiC[ўtBWѝC_џ dP30dX1 LdT1d\1,dYRdYïeF6-leNv=e9Aq#9INq3E.q+\׹Mnq;]q<ySy[|W? X>0AJ0"4aK8D"2QJ4"6qK<Ⓚ$"1?$#9)HI*R#=H&2d#;?"7yK>S0E(J1S4e(K9ST2UJ55I-jSԣ> hH#ӄ49-hI+Zӆ=H':Ӆt;=I/zӇ? 3 g~a8#(F3c<$&3Lc:3,f3c> X",c9+X*V_Y:ֳlb3[6b7{>s0G81s4g89s\2W5s6w>x#<9/x+^󆷼='>|;!(NBЄ!,O"D!*шN b!.O@ %HMҒd #LHr!/O R((N JRҔ,(O*RT*ըOԠ&MR4!hLҌ洠%hMҎt#Lҍ'Mҏ ` 2`$2L`"2`&2,`!X`%X~e-X6la+va/r(8 NrӜ,8.r\*׸ nr7r HH"IHJ2"5iHK:ғd"3YJ6#9I.r#?(H! S8%(I)JS<H%*ST:?QԢ6uK=Ӏ41MhJ3ӂ5mhK;Ӂt3]J7Ӄ7}K?3 b0C0~3b4c83Lb2S43b6s<泀,b1KX2b5kc=&6lc;;.vc?8!s8'8)Ns<%.s\:7-ns߸=<1Ox3󂗼5ox;|3_?7׏#!(NBЄ!,O"D!*шN b!.O@ %HMҒd #LHr!/O R~S┠$(MRT"LRD jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(_F2ьa,&2La*Ә f2a.,a)X VլWֲl`#`' 8r$8r\"r&~.<)x ^׼-x>|w+Ο0>0AJ{92 4aK]D"2QJ4"6qK IDb~ IIFrRT& iIGz2Ld& YFv~$9En|)DaPb%)EiPrDePjT'jPZԦuG}АF4 MiFsZВV miG{:БNt ]FwzГ^}G0A fCpF0Qf cx&0ILf Stf0Yfs|E,f KYrVUf ugfmlg;n}9apc'9ipsepk\7mw}G< Oys^W oy{>O| _w$! BP$ CXD$BT$C\$$$$%IAJR4%@F2,d%$C^)BQQ)CYQ TBUQAMjQ:ԥi@Cј&4iAKZњ6@G:љ.tAOzћ>@1! e? HF11eD&1)LeәLf19eYB%,eYJV5Zֱ ldVd^9Qq9Yq \UqoyC'<yK^7G>/|&A FpBP& a Gx"HD& QFtbX&qG|D$d$')IEjҐt'DfldGr\&yG~ PBE)FqJPR e)Gy*PJT UFu~5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~g`0a/ g#h0qgd0iLg3l0yg Ybe,g+Yj+kYz6Mlf [vv]f{~pCG9qNpS g9y.pK\ Wunp[q{ycg</ykwg;o|On % AHB0%@D"(D%щALb8%I@BHBR$ICZґ d$BVANr<%)@A Q")AIJQ2@E*Q*TԤC]Q4iBSќiC[ўtBWѝC_џ dP30dX1 LdT1d\1,dYRdYïeF6-leNv=e9Aq#9INq3E.q+\׹Mnq;]q<ySy[|W? a``'! Ehp'DdhD'1Elx' IDb~ IIFrRT& iIGz2Ld& YFv~$9En|)DaPb%)EiPrDePjT'jPZԦuG}АF4 MiFsZВV miG{:БNt ]FwzГ^}G0A fCpF0Qf cx&0ILf Stf0Yfs|E,f KYrVUf ugfmlg;n}9apc'9ipsepk\7mw}G< Oys^W oy{>O| _w$ BP$ CXD$BT$C\$$$$%IAJR4%@F2,d%$C^)BQQ)CYQ TBUQAMjQ:ԥi@Cј&4iAKZњ6@G:љ.tAOzћ>@1! e? HF11eD&1)LeәLf19eYB%,eYJV5Zֱ ldVd^9Qq9Yq \UqoyC'<yK^7G>/|"&A FpBP& a Gx"HD& QFtbX&qG|D$d$')IEjҐt'DfldGr\&yG~ PBE)FqJPR e)Gy*PJT UFu~5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~g`0a/ g#h0qgd0iLg3l0yg Ybe,g+Yj+kYz6Mlf [vv]f{~pCG9qNpS g9y.pK\ Wunp[q{ycg</ykwg;o|On % AHB0%@D"(D%щALb8%I@BHBR$ICZґ d$BVANr<%)@A Q")AIJQ2@E*Q*TԤC]Q4iBSќiC[ўtBWѝC_џ dP30dX1 LdT1d\1,dYRdYïeF6-leNv=e9Aq#9INq3E.q+\׹Mnq;]q<ySy[|W? x^``'! Ehp'DdhD'1Elx' IDb~ IIFrRT& iIGz2Ld& YFv~$9En|)DaPb%)EiPrDePjT'jPZԦuG}АF4 MiFsZВV miG{:БNt ]FwzГ^}G0A fCpF0Qf cx&0ILf Stf0Yfs|E,f KYrVUf ugfmlg;n}9apc'9ipsepk\7mw}G< Oys^W oy{>O| _w$A BP$ CXD$BT$C\$$$$%IAJR4%@F2,d%$C^)BQQ)CYQ TBUQAMjQ:ԥi@Cј&4iAKZњ6@G:љ.tAOzћ>@1! e? HF11eD&1)LeәLf19eYB%dYïeF6-leNv=e9Aq#9INq3E.q+\׹Mnq;]q<ySy[|W? xn``'! Ehp'DdhD'1Elx' IDb~ IIFrRT& iIGz2Ld& YFv~$9En|)DaPb%)EiPrDePjT'jPZԦuG}АF4 MiFsZВV miG{:БNt ]FwzГ^}G0A fCpF0Qf cx&0ILf Stf0Yfs|E,f KYrVUf ugfmlg;n}9apc'9ipsepk\7mw}G< Oys^W oy{>O| _w$ہ BP$ CXD$BT$C\$$$$%IAJR4%@F2,d%$C^)BQQ)CYQ TBUQAMjQ:ԥi@Cј&4iAKZњ6@G:љ.tAOzћ>@1! e? HF11eD&1)LeәLf19eYB%,eYJV5Zֱ ldVd^9Qq9Yq \UqoyC'<yK^7G>/|@`'! Ehp'DdhD'1Elx' IDb~ IIFrRT& iIGz2Ld& YFv~$9En|)DaPb%)EiPrDePjT'jPZԦuG}АF4 MiFsZВV miG{:БNt ]FwzГ^}G0A fCpF0Qf cx&0ILf Stf0Yfs|E,f KYrVUf ugfmlg;n}9apc'9ipsepk\7mw}G< Oys^W oy{>O| _w$P| % AHB0%@D"(D%щALb8%I@BHBR$ICZґ d$BVANr<%)@A Q";S4e(K9ST2UJ55I-jSԣ> hH#ӄ49-hI+Zӆ=H':Ӆt;=I/zӇ? 3 g~a8#(F3c<$&3Lc:3,f3c> X",c9+X*V_Y:ֳlb3[6b7{>s0G81s4g89s\2W5s6w>x#<9/x+^󆷼='>|;p!(NBЄ!,O"D!*шN b!.O@ %HMҒd #LHr!/O R((N JRҔ,(O*RT*ըOԠ&MR4!hLҌ洠%hMҎt#Lҍ'Mҏ ` 2`$2L`"2`&2,`!X`%X~e-X6la+va/r(8 NrӜ,8.r\*׸ nr7r~A1C1 1#1 1c11&cLL'0300a>\|,B,b,XeXXUX5k _a3`+6l7؅؃؇ppGp{qIiY8q?".g\\5\ -=<#` P pHhXxLD|I1S >4L ,g10 KbcVbVc ZzlFlW،-؊ ۱; va7`/a?!wp'ppgpG\OKqWq q7q qwq W<3xo#$5FE8GDD$DFDE4DG D,FEGD!FE1G D)FE9GTD%TFTE5TG D-FE=G4D#4F4E34G D+|hh耎肮聞胾1C00#00c000a>dLT|O1 131 s<,",|XXXX/6c klvN|]؍=؋}؏oqqqG1 )9.~e\U\uMm]}~A1C1 1#1 1c11&cLL'0300a>\|,B,b,XeXXUX5k _a3`+6l7؅؃؇ppGp{qIiY8q?".g\\5\ -=<#` P pHhXxLD|I1S >4L ,g10 KbcVbVc ZzlFlW،-؊ ۱; va7`/a?!wp'ppgpG\OKqWq q7q qwq W<3xo#$=FE8GDD$DFDE4DG D,FEGD!FE1G D)FE9GTD%TFTE5TG D-FE=G4D#4F4E34G D+|hh耎肮聞胾1C00#00c000a>dLT|O1 131 s<,",|XXXX/6c klvN|]؍=؋}؏oqqqG1 )9.~e\U\uMm]}~A1C1 1#1 1c11&cLL'0300a>\|,B,b,XeXXUX5k _a3`+6l7؅؃؇ppGp{qIiY8q?".g\\5\ -=<#` P pHhXxLD|I1S >4L ,g10 KbcVbVc ZzlFlW،-؊ ۱; va7`/a?!wp'ppgpG\OKqWq q7q qwq W<3xo#$3FE8GDD$DFDE4DG D,FEGD!FE1G D)FE9GTD%TFTE5TG D-FE=G4D#4F4E34G D+|hh耎肮聞胾1C00#00c000a>dLT|O1 131 s<,",|XXXX/6c klvN|]؍=؋}؏oqqqG1 )9.~e\U\uMm]}~A1C1 1#1 1c11&cLL'0300a>\|,B,b,XeXXUX5k _a3`+6l7؅؃؇ppGp{qIiY8q?".g\\5\ -=<#` P pHhXxLD|I1S >4L ,g10 KbcVbVc ZzlFlW،-؊ ۱; va7`/a?!wp'ppgpG\OKqWq q7q qwq W<3x%ÅLq,=cn!Cևm*4w{Bq 1$\H(j!C"QHBb\ U%dJq oB80~P…*+cH.!gvg/~6?3_w?g~mI&dM&gLEf_fJ6UH7ݶM}!?I比=~=x \]R{G] dDBϜ6'+ΖZ?[4{HvuW(~2mS('ҹI/_y5 x{ﯷ=)^ IϷ.,~g/=K;GTzO 6$0c c CǸý=CthիO()|HmY}f[3/"[*lOapS +TH`$%4B{t߶WV[R$xXr70I8^ޱK-[V|濿[n[d.<2KM+Tȃ!1xP!#OH/ W1d!* I!+0"P<[֧c׶|Ph.l]ӠuƧ(եKxROѮ?UfU]Zukվmn~ȏϡ_2JEߧP|UT=n9V}1sB;E 3ءcMPww^WČ4w̰6?!fH!B"q8Y 3C G ~m1nGoU 75k˃Vʐ!_qBt@׈ +?rpŗ!+Ӷo8[ i)CL/f_#6 NF7tȿD|ccG>vyjRR+)ӛ#GOS1nl+-)W{d?覆L\BM_ew~KR畓?s#\ťT%8t_.hߋ1TrM17'b?o%d6?n4"ty|_PCr׋->{אR~npn 7n̸|$|6rRnj[\oq݈>J5E>g3E}g\qva,eK2B &~gg~ꓦ~Q0wqm~޸H*zN%˸t ܝNY^DPY/='N%J=MRߝѳmKO+;W8WK4Htſ+q%ʈe>ronMvK,WnMw:yo-9Kǟ|ׁ5I)r%].Y?WI\]p|\R :߹R#.~ͪvQH[~%Jǐ#pѡ[^XK+tH'QaIe1tI9vdQ6I\誱%ʨ=G]ewyCMӮmtɩuM6R^[emkuɣrƨ=׸UIsc\]/g.U Oor*X6¥Js]×I:scq)r8B1x.EUFRLWvER\e5;qNv)lr>igRs#fVPQY>0ڹUqhS]ʩ$ߩڳ.U[`]* .\*:DJ*kvKeJ]yPc\-\h.U pk.5T(ORSe}<RKCICQ6/RGMK pkRO⫡vqb?viRgf}{4Tmtwir4wsi^w.MTJstKS /ѥJޥm?M|֥JKKK+_w. .Ux@>ɥJ)glVeӸpir6KDW9(}tPKG= q餲ͪuktVyCn+.]T6:Z *jhn*]C%3*Ti75^*~÷Ko˸QI|짥\ۻKڥ'1åJp} T)_ wIVC3]*UћPeJ.a*.U$[~bv* 4H+E eʜI72Z!%U .bLSi\1\L+\]f)L:qR>]s"Vٻ]>Sť\'=q\%.sUۿ!eʗ*UU>[*{~P%]|H%8&(bG_'7/Tt~T7+uYrh\% ׌֏]VhcC*juu*qLk.UtqeJ[O\v٨2mpIF|U.U`uehNs٪YϺ|pplMn.UtWweʺtNuJu٥Ah'tC9G5eJy>:pٯGqVE.*_*.Tv9a 2.GT~<ĺUm;fTɕ*+.Tn,۔]Їv9ҤtָTv9r{i+]NHtrT]rVe쑺<^Sm,qA]Q弊L,pQ%?J2ʆO*+*Eە3K*: ݛrYJKJ]2\Sс*\p&T)eGn.Tr[E\ƸU<9rOWY5h*P%.TO>tyَs:DE7~.T]*.T-\."P. vsy7_KMa]gˑ|lW*Y8kvzsy1UǪʍ\|rDDKX}% [% _0.UtT%Jp&xR%J(xKd4yDQչKTov.T\Sz*:U%..Tv .UBH%\ӡK\8)Olp|*quR%7bdWT~ؼ\rNBpɩΤR)Q*zG%8B %ʳ)l|*9.U:FR@Ewu] pw)̣K]uU?R_EO4PI\鎻4TiS'.TfG]4wiT\T .T-]dP rT.T4*7*.mT2 ɥoui}إ)M.TĨKGrtRS.UtQp]UtSv+.Ut`̥˾S%OpnK/z tʰХUIۥJsr2e^2PE3]gMwPeBp``)ufTeO UCda*teW͉.#T,?X*: hM*\R]]>*tEEOrlU8ck#i.T锫vXe3Tz8TQ-8eJN=t٭ҸQW**7>zyeJ=ĺ|jPCw"*wJeVs92q]4*J!J_=p9ڽWI(.'TtJrJead"iK~3*:嬊t\ΩL ^x|PCѷ.U"褹ˏ*:A傊W.?l^zrQEp Jn,pYE7\VY'}\Q=\à5f:Hr']n,rS%fp-:1r[e|B ;*zjuJp="CW'.T6/^ty .T2pyN/8uyr9x˯*:;T%x=Ig*:s7co.U"e*:(8REÐC.TAW* ΌVɫ=.oT vU].T%^*-tqxVӔ.aTԶKXˍ.Ttu^^E/is/]" SzH*S_\"XEE/-wC.Tf2K\\ N,vDOb]4 ѥ<%`V9,>wm^rR^.Tt2~K|=pI:x~KB:aHh*:;%nܓ\Ӌ.TZ鉊Kr;ƹPщ.)UtJ^pI2)8`FEa.iUtiK:}.U>I *[Í.U49IE'!dVb], ^Uz`% ])lW*]\r NlwrɥM/=V] P[*vɧGpZ*uեJ]\ K!MVɠKzRTe1 T૞Kq p긔P\JL<ĺR9PSݥQ|KY!:RNev)<8_ޥ˺TTыe\*rr3pR'\nK5t\إʙD!*1KM*:v+]^*z1Kwh.*uܥJ?qWїե^P%2.TdKcEt.MT5R.MUGjf*uKs"K '\Zzr.Tt<*tbԥʎ.mT^O⹴UѼ.K;p^eUpAv2lt*u*ХYQ\:t]$.*o`D*K7jz ]EӞ0.=Tt'K·C\zx@.}TuůK?/~]x2@ŋ_*^ RC ]x2Dŋ_*^ Se.#Tuů(/~]Fx2Fŋ_*^Se.TuůG*^LRc/~]&x2Eŋ_*^|ů˧*^LSe.3Tuů,/~]fx.sTu\ŋ_*^Se. TuYů"/~]xDŋ_/TuYů2/~]xBŋ_*^Re.kTuRŋ_*^Se.Tu٨ů&/~]Re.[Tu٪ů*^lSe.;Tuů7*^Re.{Tu٫ů>/~]x.Tu9ů!/~]xrDŋ_*^|ů*^S帊.'Tu9ů)/~]NxrFŋ_*^S/~]Ϋx.TuIŋ_*^\Rg/~].xrEŋ_*^\S床.7Tuů-/~]nxrGŋ_*^S徊.Tuyů#/~]x.OTuUŋ_*^*^Uץ.Uuů@/~]x.UuůP/~]x2\ŋ_*^Te.UuůX/~]Ʃx2^ŋ_ *^LT#/~]&x.UuůT/~]>QS/~]x2]ŋ_*^Te.UuLŋ_9*^|ů\/~]x2_ŋ_*^,Te.UuYů*^,Ue.UuYůJ/~]Vx{Oe.kTuRŋ_*^Se.Tu٨ů&/~]Re.[Tu٪ů*^lSe.;Tu٩ů7*^Re.{Tu٫ů>/~]x.Tu9ů!/~]xrDŋ_*^|ů*^S帊.'Tu9ů)/~]NxrFŋ_*^S/~]Ϋx.TuIŋ_*^\Rg/~].xrEŋ_*^\S床.7Tuů-/~]nxrGŋ_*^S徊.Tuyů#/~]t/*^Se.x2Wŋ_y*^We. UuYůb/~]x.KUuYůr/~]VxRŋ_U*^Ve._xVŋ_u*^We.Uu٤ůW*^lVe.[UuZŋ_m*^lWe.;UuFŋ_]*^Ve.{Uu٧ů~/~]U倊.Uu9ůa/~]xrTŋ_Tu^ŋ_c*^W儊.'Uu9ůi/~]ΨxrVŋ_s*^ůy/~]~T傊.?xrQŋ_K*^ůe/~]xrUŋ_k*^\W /~T喊.Uuů]/~]xr_ŋ_*^/~]x.Tu9ů!/~]xrDŋ_*^|ů*^S帊.'Tu9ů)/~]NxrFŋ_*^Sr^ŋ_UuůO*^\T咊.?xrYŋ_+*^\U嚊.UuůM/~]nxr[ŋ_;*^U垊.UuyůC/~]xXŋ__Tuyů˯*^(~||$Q&_DK>(~'/d%'_DK>(~g/l% $_DKL|!Q/b%_Jˉ,(~W/j%_K|#Qo&_H%Jۉ,(~w/n%%_DK(~$ߧ%/Y2Q/a%K'_L%?Jlj,(~O/i%%_DKOjdDK~(~Ɋ◬(~//Y9Q_&_J%&_DKVK׉◬(~◬(~Z◬(~:◬(~z◬(~l(~Fl(~&l(~fl(~l(~Vl(~6l(~vl(~(~N(~.(~n(~(~^(~>(~~(~(~A(~!(~o/9,Q/9"Q#/9*Q/9&Qc/9.Q/9!Q/9)Q/9%QS/9-Q/9#Q3/9+Q/9'Qs/9/Q/ Q /(Q/$QK/,Q/"Q+/*Q/&Qk/.Q/!Q/)Q/%Q[/-Q/#Q;/+Q/'Q{//Q/y Q/y(Q/y$QG/y,Q/y"Q'/y*Q/m%K!Q?&_DK(~3<(~s<(~__/[%ODK(~ɋ3Q/y9Q%_DK(~/_%$_^/ym⿘.Q)/2Q'_DKޘ(~TL(~4L(~tL(~ ̘(~L̜(~,̚(~l̞(~◼)Q7'_DKޚ(~/3Q'_DKJdDKޙ(~ɻ/yw%I佉◼/Q'_DK>(~<|(Qy/p%%_DK>(~/x%H䓉̟(~ɧ/t%I䳉,(~/Y0Q'_DKJ䋉|)Q/'_p%_I䫉|-Q'.7/f%$_DK(~ɢ|'Q&_X%K,(~/Y"Q%/Y*Q&_t%$_DK~(~ɲ$Q&_\%?KdDKVH◬(~J"Q/e%$_j%JdDK~(~◬(~ɚ◬(~ډ◬(~ɺ◬(~l(~Ɇl(~Ɖl(~ɦl(~l(~ɖl(~։l(~ɶl(~(~Ɏ(~Ή(~HvMdDKvOdDKLdDKNdDKMdDKODKLDKNDKM7(~(~ɑ(~щ(~ɱ(~◜(~ɉ◜(~ɉ◜(~ɩ◜(~◜(~ə◜(~ى◜(~ɹ◜(~\(~Ʌ\(~ʼn\(~ɥ\(~\(~ɕ\(~Չ\(~ɵ\(~ܐ(~ɍܔ(~͉ܒ(~ɭܖ(~rG%w&_rW%w'_rO%&_r_%'_@%&_P%'_H%&_X%'_D%O&_T%O'_DK~(~/C%LO9Qg/y6Q/y>Q$_DK(~/y!Q$_b%LDK^N_;Q$_DK(~+◼fWEK^(~/"Q)/y}%oH䍉L(~ԉL(~ɴL(~̐(~Ɍ̔(~̉̒(~ɬ̖(~̑(~ɛ/ys%oI䭉◼-Q9/y{%HdDKN䝉◼+Qw'_DKޛ(~/y%H'LdDK>(~ɼ|8Q/H%Mc|(~/Y(Q/&_DK(~‰|%Q&_DK(~7/f%$_DK(~ɢ|'Q&_X%K,(~/Y"Q%/Y*Q&_t%$_DK~(~ɲ$Q&_\%?KdDKVH◬(~J"Q/e%$_j%JdDK~(~◬(~ɚ◬(~ډ◬(~ɺ◬(~l(~Ɇl(~Ɖl(~ɦl(~l(~ɖl(~։l(~ɶl(~(~Ɏ(~Ή(~ɮ(~(~ɞ(~މ(~ɾ(~(~Ɂ(~(~ɡ&Q/9Q/91Q/99QS/95Q/9=Q3/93Q/9;Qs/97Q/9?Q /0Q/8QK/4Q/Q].1Qᒛ-9Qؒ[6[,-ʒe,#;R^]ƕܝ(Z=~ܛU}DJHtDeJJ4am#^i^ym#KTydDGLw!Qӑ7&92U#S'82M#&72]p#'z62C^#3&Z52SL#3':42K:#&GE=я9yS #oN`-5Qy%.2gb oOZ:̕h܉3Yw%*DCEޓ({}y_"OO҉|05yPY"& %DDKG#ֈ|4Q%:"D5D>h'E?O%jDC>(ygY Q%`!O6 P!_L3KN|9QŐ Jx!_M-k|=Ѯo$JDBIT([|;QE= N!M"dDB@Y/Y9Q_&JY5 _% Z Nwd>Y3qOJړwdč֞r]\oOM !q/Cn'dOҝ 9qBn'>ܚ=!ٓtWBn'icGH܃;IJOJqIx ؓtAMVIʐ7{ĒIe %$ Gy̞x+1}ONړw&&ɻs݉yČ@'%G䣉Yr8xbN|"1N>''&ɧӉin6lbR,&KLa3 k<5Y(1=M&_JLF/'‰gČ3jb|-1LV&H&o&&"cĔɷ3d1Nb^|71LK%&sdT/A"%K$&vɒ\Tb01{KNLڒesG)Z,Y61!K~%?MLgV|bZ%?Ǫd)Ebڔ-%LLUsdĔ(Ub&%N{ӝd,'Y31IJiSd &Y71qIKWӔd$01)I6JEIM6IoO}#ړtt@r=Ism9Ğ5rhbBƞ-#9̞3rxb֌aOd921*D'҃mO 9&1F')(!%${&ȉ-r=ISZL9ŞjOҼ9-1]EN'i"gړ4'Eβ'郐"ؓo"ٓtEη'iv\T"ړ4D.J\xIKI0"&e$MB {&ȕ$]S?j{rMb\kORO'iZ\!7ؓ4CnLݐIY$Ԑ[4V{emr=I0{2Ĝ ˞/ '1B'i>ܗF!ۓ4{B')Y &JC$M3#{&Dȣ$]Րq{=Iyyʞ tbF֞ =I''ikN 'in91%A'i&)Q7'oDMޚ73l' mDMJdDkMޙ(ɻ5yw&I4佉"/?'jgDL>(h0x&HT䓉̟T/t%I䳉,(~/Y0Q'_DKJĆ䋉|) /'_p%_I䫉|-Q'_DK(~"|+Qo'_h%I仉,(~/~%'_DKHdDKJ䇉,(~2(Q'_l%?I䧉,(~/Y>Q/y%+&_R%HdDK~(~*◬(~ɯ/Y-Q_'_z%k$_f%k%_v%$_n%%_~%$_a%ٓ '_=I_5ɦlfO!#ܞl(~ɖ$dDK'ƞdDK'%'_=I/ўtS%;ۓQ]/՞|fO1=eaORKLdDK'%$_=I/Ϟ(~$mɁdOa9؞(~ɡ$7fORK'%G$_r=I/9*QI*~1$]c/9Ξ(~ $epD{_rR%'ۓTS/9՞◜fOW rz%gؓT3/9˞◜mOOI\{6DKη'鸇\`ORK.L"{_rq%ؓTKI{e\nORKHJ{_r=IDK')g!&_r=I!#ޞܐ(~ɍ$DKn'%ؓ%ܚ(~m$DKHN{>IJn{{I*~ɽgORKO{_=IDK')"$ɣ$hI '_=IDK')H"OۓT&_;{_DK`ORKhOf)Q?ۓt AIY{_=I Şk%'7=I/y!QؓT/=I/yɞ̂(~ɿI ȿ/=I/=IK◼bORX@^3%MuL(~ɔ◼>Q7$_DKJdDKIdDKKdDKfHdDKfJdDKfIdDKfKdDKHM◼9Q$_DKޖ(~ɜ◼=Qw$_2W%s'߻w&_DKޝ(~{/yo%K| Q&_2O%J\y/p%%_DK>(~/x%H䓉̟(~ɧ/t%I䳉,(~/Y0Q'_DKJ䋉|)Q/'_p%_I䫉|-Q'_DK(~"|+Qo'_h%I仉,(~/~%'_DKHdDKJ䇉,(~2(Q'_l%?I䧉,(~/Y>Q/y%+&_R%HdDK~(~*◬(~ɯ/Y-Q_'߻/Y#Q5/Y+Q/Y'Qu/Y/Q/ Q Ȟ#=IdDK6',QI:V#[ؓT-/ʞl(~6$d[{_]%ۓT/ўdO19Q]IʆȮ$dDKv'%{$_=I/˞-#;Q}I*~ɾgORK' 9 QI$/9؞{_rh%'%%_r=I/9ž(~Q$DK'%ړt DKx{ ◜hOREN'%''_r=I/95QI*~$m◜iOq9+QI*~9$-vDKγ'iKO{8ȅ$DK.'3$QKI*~e$,DK')d$W&_r=I/ڞk(~/'Q%_2o›|8Q/H%Mc|TȦlfO y%[ؓ8HJ'%[%_=I/&Qm/Ξll(~$dG{NlOu)%Q]I en$dDK'%{&_=I/۞M'Q}IzLKd{_r=I?DK'i[@N{CI*~o/9̞(~$H{QmOREIX{CK%'j^rE.9^RdPKNNTr=@i>6}heə2Z֐s|h\ɹ~󴶈\ӳ6\(QE\sʔ\S%\3,ыu(§UWtJM*DDII4Z): z՘D{InL&+]%:_EIn=%& [=$ܵ"j\>B #;qLB({DHOԆ_m!yZWIH  y$GQǬH]ǭ?%/DGL{)+K򴕤*JRG~(}JR;Gd%#NtqDGtOt}K鐿$5DFf%iEn%C#/$3DcvK򢕤JR?F^TmW#tDEc%*Jҕ3_"$z-[IZFk-y]"S$:+2e"O4T b1G5:>i65>,1#9Ye5=9EyS!oN>-5Q%2gҹ9y{!H8dDoCN5䝉+Qΐw':DCޛh` yo!H,䃉v̓(Uȇ] 7Q'2_0!I$䣉z|,ъ'DB>>ƃ|*QtO' DA>h3|.]| _Hd!+I:|JR A(‰+VU+I b|='o$jM+IYJ_n-+I]v" &+I,f%|/qOo%f,n%Jҭ=Y"qGOLȓ$ݿZIZV2tĽ9D;q+I7䧉n\vJ]6YJ5YJ=5yV&+YI#tLV LU77&ZI:$tEVtK~%'sVnoɚV>ZYvc%鿚k%鎕g%C?%$nKɆV$Ԓ$]ȑMdĝ&J &J}%J$2qIJ<$3m$-d[+Iwdč!>q?Hvt@vtLvtGvN]xdW+Iwvd7+I7td}#qFtvC5Dz쓸5#&~V$$mɁ-rP&l%ފb%閊j%N&qEK7í$.#$%#$-=9:q+DtDtCtOOw7D+I75$+I2d+I0ĝ 95qBNtBNt{BHܕ37#,+l+I_9V8ȹ r^o%+IwB+I7Ľ8q@.t@.t@.\ W$ȕV$)$ؑkgĉ=JJi2&/1SL> &M %_ą?E"JO'&vg䳉i\@b|.1iKLՒ[I&_H̒Vȗ$ؑ/[Iu% '&[WsVV׬$ͨ[IH%H̟o&M"V.'ȷ$-ۉQhbJ|JRPKk%P,f%i@|/1I$[I$?4yuLdb,$?4_I,c%(qIN~DśJҰ#W\b,1H4HV4H~n%i:$+%f /$M$]/_ZI%$fɪI@++I2YJұub#kXI#kZI#kYI#k'&:9;::el#&FV"\`%\h%Û\d%)Y 'J%)rr ryrEb\ WYI W[Iʳ5Vȵ r]b"\o%i&7XI"11[AnJLR$M[$MI[$DDNt5AaE8HN){S ^+I }VV_4y0śbE=C'?YIjɟ$DNMT9+IM;yJRNb%WW*|m*PD4s^1h2_)%ٱh%SWJ>hA'DbO)#'3?WS|:Ql$LDIHsҒ,*%B$ % K/&zHDHh‰ DH"zH$H."|+Qo'Ah$I4仉,fE#K}dDG~VV:o!%x!$rhWRRȡ &ќ 9J!zhEQ2'XIɱƃ(:~5ȉ6(1V rJ & rZ 'z r:h!Y򁜝KIT \+ID@O 508K$%&rY 'zrE\i%鮟\'W'5[{rm⎞\g%F;!qNnLܭ7Ľ9%qKNnt'NnK܀63qMtsMNS{4/qLtLH&wM9É{aH<%YI:%'s[d⮖<%O[IB Mܺ%X7Sm)SnJA-y&qIMrwg''n0_$W&n'wGB➑Jҭ"y1qH1$/%ˉ@w⦏Jҽo/qgG^IБ򪸏#Mܾ%JHܬ)h[3yc *qENviw[dM.qoEORwRd )qDfN.YwId-qODfO ̑"oJ7'w[9䭉M 3q/Cޞ!Hܹ7,d} yg+qWBޝ!I܃&n=w `dP&̛w N2#}XÛ|8'LƁݫ>tĞ|&q>O>8' $'dĹ 3sPℜ|Jy8R|9_LNl$αW$.x%Ψ'gi3Y$qL8I&߶tnLM$΄w'dyiKa%?i;%K&`RWC4,sGB&?J'Le'tI~8$%3dY%Y!q2I~8<%Y1qHVJ1_$NʉCi!Y%q6HVM_%jS_'ܐEnL|"7%Iߛ-oIw"r[Б;ķrg +ͅܝBI|+!&8ķ#Co H[y4'%v~<ؽ'{Ó;stbN~u%5CbL-?%ω0y&=,y?9i,7L؋せ>#$/&&LK!y9$Jȿ;C$u俉]_bF^Ikf}UN^}%ZdΊLG'vM%oH7&vDdLi{i;2]bBOR =Ɍ) 3'vd^̚9̖'2Gb@ޔ,:W͉$>[mOj2gs=)og.+ KN|w&>=ɻ$N|2$>{z}8'_䃉O+2Oⳉ|(IDM||8)CK|$>AGcO='> '+?db''V=O%pďLb}&Mdڻ{JKLUt 5,X!wMXɗrb%Y8Lc;'_X&(ijcB5|{b N;kw'VM&ߟLm򃉿d$KN$KM#?u&ߝMM!?{A[e򓉟yӉ-&~&~z7OY%+Ldn|pdʼnM&~6N~1EV(Oˆ*?$N$j}d?e?u'I֘Z;YsOgd? Ŀ5u&=;oud%O[5`*Ɇ6VN6g_)xtdM')O6߼\e-&,l9}d['[O7/l3߳H&,l?!$;$3pÜ;>%ʎozUvIv2'us?W?{俟d^',}&}'L&ܓ'6&~'ƒ&'VC&C'LH>+9b`rɿѓߓc&ׄu#9nrmI\&רu,9irKN\S&u59mrMN\3&u>9k 9{"9g3%9ws'9o)9+`3.ps0h2x4d37ts9l;|=br\9OHK$WO7k&$ɵɽMr'!{ƉJn#$cϖ:SGnK/}ܑ=drOn]؋&wOܓ=mrO//{g@2Ƀ?dՓ'~LIƞ?ytoy,'^< ɓSS.<=w6߉Mm"Ow-߸}?'^Al23&M$'g򗉿mo.{2 '/L]/G2S'/N&Lw䥉d|O5' Ě@3+8H^38I^7$dd$Sk y}2d7 yc2vfL3dd#%&).Q8JfHƹV2c2ξq>̜3dd%&,.-u8KHƹ_d &oNad1&oM9ddU&s&<3y{23ddc'O;7ɇqf̗s#I'M|1'?D2O& ?w ɧq|:wgq|6wɸI>ddܧ$OƝKd$ %&b2w/%(r2q|%MWq'|-Vדq|#_7qG,{[ɸkKdd%Iƽ^d%%~0^2'1Y<wq_,;dd{&K%n4a2Oqǚ,{GɸM~dd&?Iƽpd'%~9Y2qOɸNVLƝxR2͓_$n=Y9/qG{dd'JFf u2dd50$k%sHNF ^"Y7ME^2dd a2d8HĞl$lbB6OFl1o![&Iɐ$Lmȶhr&v;'&'Iv%;%#JvNFk쒌)5R[2ddO裒=P%{%JNF쓌^+7MW_2ddaǒј%%CKNF-94[dtqahÓ%G$KLF/9:_rL2dtqh &'$QLNLFǘ199=drJ2dtih/ӓg&g$LLF癜49;hrN2dtyhSѯ&$qM.LF\V68=mrI2dtehw˓&W$NG'\8:qrM2dtuh?'7$NnYGܔ:ٿy=vrK2VdÓ;ѐ'w&3OJFOPܓ=ן=/m|r?e|@2A:dG'&c. y,ɘ/HH Bd21ː.93t,ɘKfM,^2[2ٓ1ӗ̑Mɘ Lޜ-ɘ1Lޚ9mɘULLYdd&Nl2_2j$c6h2s%c7x2|O$c8d2慓1S|*sɧ1|&g1,9sɘNLV2fo[I'&cf?N2&c?Y,$߳xC ~2HO[^AD24HLƻRx! xc!Y&0$?J[ ɏCěO.Dd,%% dy+w*Edw71nFd7_ZIёwIf20IJ;'x %Y'$ZIwW6KA2oI6L/FV$'㭘dd'l7g͒.M5x&2o$[%㝜ddlvm&OĻ=x'!$;&㍠dd#l%PK2#JvMƛEnx(=o%{XI왌7Rw2bJI{Mɾx)/>%[I TrP2ޡJN[U!VY%&ͫ7x+9,og%'}+7#NWrT2JN{_1x,96%%mx+ǒFYrb21KNJ[gx-9Jʹdגӓ>[rF2pKL;oYx .9J⽸d)w6]r~2ޯK.x.0%%㭼d\7K$K.K}x/"o&W&d%\k$$LMƻux0>&7$F+wbrs2cLnIƛɭx1Jdܑ7$;drW2ޢLN{=x2Jdܟ3f`2L8 LN{#x3y4&%q+E'i;Sx4y:&Mƛnj{+U?$x5S2qM^g$ރMMƛsxW6y>o&I_1R-&xZ#y!&Hƛɋxw7g2M^x7y9˓%x+8 'MƛDy8y%o'U'MNr2E2RNL{&sdۜ1o;'S%ddLwit2]2ޣNOƛ x:1o_'3%}dd̒wYw2[2NfOƛx;yS2OޜÓ$x7']';O%$N&H>_|6 Y !\2~WB`2~By+ B $~C%+|JD$ 'wI$_IHj%;)YIފ7/oZId+ߣ|Jwm$NHMHc%{=ZId1+|/C$~2~H"I~`%J%$~Id2~IT2~7JC+ߟ,m%;Ve$~Kd}.ɲV%I~j%cec鮢l g.uWͳטg &YI=5ZNIvxMN2Ndd9zNIwxNA2dd=>FNI6vxP;M %%J6wx?Q;-$sl ):|_R;m$޻l$nddM;$$dg'I%$JvMK$dw'[%{8I+3|OVW2.do'm%8I+7|oW_2nd'%8I#,9I=bAƒ%8I,9IfaN>KOߏ C-9I=kQNbKvx_[rL2NdoqNKwx\r;%'%KNvx]r;S$ދ ;/9=|^r;3$ӗ$.d}9NLuxo`rĻ&$(L.txarĻ$އ\ 314|brĻ˝$Ϙ\$d=U $\$NZ'N&%LO_$F'`&79I+39|frK2V'r&9I3I;@;&w9IK4I}=;I{&9I4INHMLߣ< k5yI}#NlMuxkX2dNMtxlĻh&$MuxmĻq$ޟ c7y1|oĻz$盼$dkໃם$/$d=[໌$w$N]'&'%VNO߿|$C'8'9I98|tI2S'J'9I{:I;/\'_9I ;I}7NNM߻| ;INN~txxS2d}/NO~ux/yĻ˓!'C&@OJߓ K=&|z2l2Nddݓ'#&OFJ# k>%|}2j2ddɼ'%c$ɘɪ/$c%n&$ɸI"d??kCrdD@&Lx(Q"$2i2F&%*2yҏƾdDW@L6&S%J2uc4L 1\JKd d䋵.]}2/g c2+dD@fN)9YȬdD AfOn2#QG9i\^%u,dDAAI 5Ty$9I %k+̟.N_$d܁[mYI2x~7ZI{G2rWdq'INc<d)hT K;I2N~ȲN]eWrKNZ'dy'IY!v`I$7z d%'IUʉ愬dHJVut5KVs񘬞RɩdM'I YI2jav1uYnf!9I.V%;IzH6pA6L/dd~$]M$>%:Ibf I2pt:IR9Cr|:pIN4dӒ _)d{'I,vdDCvr4撝$59d'ɮJ;BDvw<$q(y^ Cxdo'ImI2kjdd~$i!:I*AN>Ē9$cp$:IaNkÝ$uD[#e9I2pu+9IRkDqMMGd~]$H'ITȉN rRqɉf$z$i`$% l?BNOtM 'Er҉$7#g''rN2NG9IE,9I0PrЁ\cra"9IzM.vPK$#4A'&*rYr9N:+rdBJ'I*mtru"8I8ȵNrDEnH!#I4I2Hfrܒ׮[IW#۝$u_cD FrK$*$7Q{Dwy$]!$eȕ~p1#8I~~":INs #y"nոI'Iץ)'I##yIRFIay6Q$=&&;IB^ptAH^Ln䴁˓$5o'JD'&*8ZEu'I]yIX@tCi@HNs'IɻN8{N.|*IRqG>rې$=!$$G'I I21es $8Iw򫓤J$Z 1ɐɤ}'C%JB2tdD[HMV IN##$C2budDHFN髳(Fz2ZZ$'#ɘT=%$ZG2nIdDHOʾ^'$zH2ar'dD!I&N$$GI&o4O&KTd˥qLLIJdd.b4L<.Qc铓>.FfHdƤ˓%M 'c2;)QuB<,B]Y'sl̞;pv6#Q9[%s%zQD JNd~u&R2coNdd.T,$*,$YIRDXpM%$G E$ժNŜ$ɳ''Vdq6ƕIyTz%K't]Jq42e$2d9'I ȿ]K$ɿ,dc[z$H!"+&zZ䭾IRaKVr`hn*tĒU$d5'I1YIBFAɚR$$k;Ijw:Nu5/Y/yt`$%8I@6tF'dDL6I<&&`Y)1<"ܘlD*$l*"$-mu1.ldG'[2)D쬫I&$Q]~UdSk{[&{$c=%3+d̬m&$u}do&$E49(xfNu7OgPrD:92QVOщ֚xNu`xOwcɉN mrR=99lSɩxONxOқxO; &jpr^v\7Q(q@.\S mգrY▁\{re<'W%n"~MIMkZ\ =XNnH_<ܘ(M rsi'$8ȭ~{VvO{r߰;Ɠ{w%D-OKܞ^. $Sȃ~Sї;EC?y)qC^6KWw@UE[ĭy=@H7yLR@I%w$}#%nf7򁙤&ab|d&|A I"I"%nf]Eފ|i&) _I"_'v7fsȷ򝙤{3I?L)q#F~6A~1tGF~MlI$= #CL8 &Ȑ{42Tb Y#$v+Ȱ62\bۂ }{2!AFLǑd %AFMّ[d-#AL둱dM'AMdm B&L"dč!$3B&M![$dĭ""WBL3&d#&{BME(d$!BfLW%6V7ĝ&)BfNr?%\,{O2kb9qJfKwdv 3q[JJː$O܉ 2OF5SCMܱ%l|[W2b,% &6qBYpb7,%&FQ-Y,C%'6z^dbLJ3qKJldY6q/LKl%nɿB?㧒Cdm2Y1OD_&Kl7dY%qMVMl!d^Y#qOMLl*7dY'qMMl3d~ qM6Ll<7d$q'N6MlEdĞ"qoNLlN7d.&qNMlWdľ!qNv4Ev2MvNd]$ѓ][Zd73Idw3I9d=>LBWf"I'&~fnfؑ=9LRLJ`3I;b3ITȡ1rGT9LRW@4^9Lc$rL= ǚI>#ǙI'' f$rbbCd&X 'IZ>!$r+yrZj IKH093n,3Iى7rk&+9/QG$]r LҲLGMrqb\b&!#4UG.3t9A.7gGHtJ3IwDA6G1&&uf~z3I'ȍfMl&iܒh<ȭfQrܞ#wI@ȝfeLCsrO!IZf IGA򀙤F!yLcb򰙤CH9!I:$%*򸙤=D򄙤.f_o%I*~`&%Iz(CJ`3I!j&"f&%'_r(~Qf@$DK5T/9LRKN0/9Lҏ99QS$ T3I/9-Q$DK4M2T/9LRKM<3I/9Lc5rA%IP!%_rtr\(~ef_ry%WIB WI*~U\m&%$_rm%יI F`& 7IO&7%_rܒ(~ɭf_rDK0T;/LRK6ܓ(~ɽfܗ(~ff_`%I*~É5T/LRK0//LBu%$_򭙤|(~f_򃙤vDK~2tUC~N3I/L[%CL2 _2d%C%_2t%$_2l%%_2|r7Ȉ◌(~ȉ◌(~ɨ◌(~◌(~ɘ◌(~؉◌(~_NMdDKOdDK&LdDK&NdDK&MdDK&OdDKLdDKNdDKMdDKOdDKfLw>Q?$_DKfJdDK(~,̚(~ɟ/-Q/#Q9/+Q$_2w%$_DKMo̗(~,(~ɂ,(~‰,(~ɢ=Q/G%'_D%K&_DKJdDKIdDKK_;Q$_|QY!Q/o%KdDKVNdDKVMdDKVOdDKL$k%_v%$_n%%_~%$_a%%_q%$_i%%_y%[$_e%[%_u%$_m%%_}%;$_c%;I*~f,K%I snn&&{I*~ɞe&%{'_k&%%_(~Ɂf_rDK1(~aff_rD%GI*~Qm&%ǘI#&_r(~ f_r(~f)◜j&W,9LRKNO 3I/93Q$El3I9◜k&%%_r\`&A0Q$]!/$QK$DK.7T\a&)%W&_r\(~5f_rP\(~fIrC%7IBn2T/LRKnM63I/L҃QrG%wI#w%_rc&!7Q$= $'_򀙤K 򠙤<(~f_H%I*~cf!'_򄙤<&OI*~fR'L%ϚI\sHC3I/(Q/LBi%IM>7T//L=*Q$Go$DK3T/LRK~4(~f.'/j&Z73I/bQ!/*Q/&Qa/.Q/!Q/)Q/%QQ/-Q/#Q1/+Q/'Qq//Q/ Q /(Q/$QI/,Q/"Q)/*Q/&Qi/.Q/!Q/]%O1Q/9Q?%_2K%&_DKfKdDKHdDKJ/̝(~<5Qy/[%%_2"# $_` Y(Q/Y$QE/{%%_DKOdDKLz`T&K;z&LITdSb\&J<7&N?'dDKLVH<[&+&b_hO1Y)(*'dDLVK<&'*eF5Y3-=&k'JfN6Y76ϺڙlxM6Ldpq&8{C6M4d3sy&[$-5*\l(6'dDkM;gdD}MvH<';&zlS<9Qh]OɮfxOvOTdzOLtds~w&$}7/q@O90чD1NI C 99,q@OT-92љDyNIDc-:9.q7AOm91ѫ^() rji'%8ʝ g&wrV(9~hyr~'$nOȅ~\O!'zrIↅ\hef\\!W&:|rU^\(5rm'%nz`J6ܘMrs'$n|ȭܖ"'[!rgb/e鞈ܝ $nȽr_.ܟ& $nȃP⾉<8 $nȣXNIБO;ĝA~H 9!B~I_;#"bEBL*{%d=#&iBM<'d]$!BFLN)d}%%BFM`;,dĝ&#BLr{.dĽ''BM܄0d( C&Lܖ2d)$AC&Mܨ;5d+"eCLܺ{7d=,&CM̒9d]-!CfLޒ%w /)CfN?%~,[`2kb9q/LfKl7dĮ3qwLJl$n܉}"2O~5aDM8%v|;h2,Y q+ML%dĦY$qsMM.'bm&6Y#;$jcbΉ 5KX &vnb#{$gbމM7O|x37FKd69 QGqD/ANl̑C94CGK4V9"QY#{vDwANlޑc%96GKv9!QkzDANNlSE95GNK4Ė9#Q}3{DBNlse97HK"Ķ Q DOB.NlK 4cH.K4'!"Q+{DBNl&k 6HK+"!QDBnNl8[ 5HnK40$#QŐ;{D'CNlJ{ 7;IK46%y <د$%zpb<(pȣLX!'2J<$O%tbs<(yȳ]N\!'; ڇ$/%rb(ȫPZ"'Dj%o%:"vb(ȻR^5"'M|?%%z$qb#|(ȧUYY"'V|c%_%&ub|(ȷ]W]}"'_؇%?%(sbC(ȯY["CL> hɐ ث%C':+2LbӖ (p[2|"#$qɈ:%#'z-2Jbc1hG2dDEHl1+KNt_d/7QdDF&Hl (/L&Ncd14Q;dDcFHl)[Tc2uC#$6ɴ2LM&'Z52Cb[̘!L(Lg2sy#Jl=Y5Mlh2{#s$vɜv̕؞&Itd>5'ב&6ɼ-sMK4xd6Y Q{dDGNljEY4MhbmnDGOw%Y2M(Rpt $$ɲJ,'Jt߉qDIHO쒓m!Y1]N dDHVNlUE"Y5NVK4dĖ:Y#Q-5{dDHNlue#Y7NKdĶ; Q? dDI6NlēM$4#O6K4d<"QQ-{dDWINl֓m%6kOKd=!QcdDIvNl]&5OvK4d?#Qu={dDINl}'7OKdķu(90D/JN|c9$QC!@K4ķ #)92=DwJN|9&QcE@Kķ*91}DJNN|9%QSi@NK4ķ3+93DKN|9'Qƒsߍ@Kķ% ,0BʼnoT $ [ri;e\rE%W&\rՉof $J]rmuv\rC%7&ρܔ{͉ox $y;5Q/=Q;/3Q/;Q{/7Q/?Q/y0Q/y8QG/y4Q/yQ/y1Q/y9QW/y5Q/y=Q7/y3Q/y;Qw/y7Q/y?Q/0Q/8QO/4Q/Q/1Q/9Q_/5Q/bQ!/*Q/&Qa/.Q/!Q/)Q/%QQ/-Q/#Q1/+Q/'Qq//Q/ Q /(Q/$QI/,Q/"Q)/*Q/&Qi/.Q/!Q/]%O1Q/9Q?%_2K%&_DKfKdDKHdDKJ/̝(~<5Qy/[%%_2% $_`% %_p%$_h%O\J/G%'_D%K&_DKJdDKIdDKK_;Q$_|%+$_b%MdDKVNdDKVMdDKVOdDKLdDKNdDKMdDKOdDK6LdDK6NdDK6MdDK6OdDKLdDKNdDKMdDKOdDKvLdDKvNdDKvMdDKvOdDKLdDKNdDKMdDKODKLDKNDKMDKODKLDKNDKMDKODKNLDKNNDKNMDKNODKLDKNDKMDKODK.LDK.NDK.MDK.O%2Q/:Qk/6Q/>Q/1Q/9Q[/5Q/=Q;/3Q/;Q{/7Q/?Q/y0Q/y8QG/y4Q/yQ/y1Q/y9QW/y5Q/y=Q7/y3Q/y;Qw/y7Q/y?Q/0Q/8QO/4Q/(~~(~(~A(~!(~a(~(~KJDKIDKKDKNHDKNJDKNIDKNKDKHDKJDKIDKKDK.HDK.JDK.IDK.KDKHDKJDKIDKKDKnHDKnJDKnIDKnKDKHDKJDKIDKKDKHDKJDKIDKKDKHDKJDKIDKKDK^HDK^JDK^IDK^KDKHDKJDKIDKKDK>HDK>JDK>IDK>KDKHDKJDKIDKKDK~HDK~JDK~IDK~KdDKLdDKNdDKMdDKOdDKFLdDKFNdDKFMdDKFOdDKLdDKNdDKMdDKOdDK&LdDK&NdDK&MdDK&OdDKLdDKNdDKMdDKOdDKfLw>Q?$_DKfJ~2s%JdDKfMω̖(~̑(~ɜ̕(~_/;Qy/k%&_DKKdDKHdDKJdDKIdDK(~b#Q/Y"Q%/g%K%_t%$_l%%_DK(~/Y>Q/Y1Q&_DKVJdDKVIdDKVKdDKHdDKJdDKIdDKKdDK6HdDK6JdDK6IdDK6KdDKHdDKJdDKIdDKKdDKvHdDKvJdDKvIdDKvKdDKHdDKJdDKIdDKKdDKHDKJDKIDKKDKHDKJDKIDKKDKNHDKNJDKNIDKNKDKHDKJDKIDKKDK.HDK.JDK.IDK.KDKHDKJDKIDKKDKnHDKnJď3%Q[/-Q/#Q;/+Q/'Q{//Q/y Q/y(Q~<(~#<(~c<(~<(~S<(~3<(~s<(~ ◼(~K◼(~+◼(~k◼(~◼(~[◼(~;◼(~{◼(~|(~G|(~'|(~g|(~|(~W|(~7|(~w|(~(~O(~/(~o 1(~ɐ (~Љ (~ɰ (~◌(~Ɉ◌(~ȉ◌(~ɨ◌(~◌(~ɘ◌(~؉◌(~ɸ◌(~L(~ɄL(~ĉL(~ɤL(~L(~ɔL"S'_2M%&_2]%'_2C%3&_DK~(~/c%3%_2s%JdDKfMω̖(~̑(~ɜ̕(~_/;Qy/k%&_DKKdDKHdDKJdDKIdDK(~b#Q/Y"Q%/g%K%_t%$_l%%_DK(~/Y>Q/Y17/&KdDKVNdDKVMdDKVOdDKLdDKNdDKMdDa~%$_a%%_q%$_i%%_y%[$_e%[%_u%$_m%%_}%;$_c%;%_s%$_k%%_{%{$_g%{%_w%$_o%%_%$_r`%%_rp%$_rh%%_rx%G$_rd%G%_rt%$_rl%%_r|%'$_rb%'%_rr%$_rj%%_rz%g$_rf%g%_rv%$_rn%%_r~%$_ra%%/$QK/,Q/"Q+/*Q/&Qk/.Q/!Q/)Q/%Q[/-Q/#Q;/+Q/'Q{//Q/y Q/y(QrKIDKKDKHDKJDKIDKKDK^HDK^JDK^IDK^KDKHDKJDKIDKKDK>HDK>JDK>IDK>KDKHDKJDAI|'&_]%'_C%?&_S%?'_K%&_[%CL3 _2d%C%_2t(&Qa/.Q/!Q/)Q/%QQ/-Q/#Q1/+Q/'Qq//Q/ Q /(Q/$QI/,Q/"Q)/*Q/&Qi/.Q/!Q/]%O1Q/9Q?%_2K%&_DKfKdDKHdDKJ/̝(~<5Qy/[%%_2% $_`% %_p%$_h%OdDK(~,(~ɒ3Q/Y:Qe/Y6Q/W%N?,(~ ◬(~/_%+%_r%$_j%%_z%k$_f%k%_v%$_n%%_~%$_a%%_q%$_i%%_y%[$_e%[%_u%$_m%%_}%;$_c%;%_s%$_k%%_{%{$_g%{%_w%$_o%%_%$_r`%%_rp%$_rh%%_rx%G$.ɑVDKNDKMDKODKNLDKNNDKNM?''_rF%g&_rV%g'_rN%&_r^%'_rA%&_rQ%'_rI%&_rY%'_rE%W&_rU%W'_rM%&_r]%'_rC%7&_rS%7'_rK%&_r[%'_rG%w&_rW%w'_rO%&_r_%'_@%&_P%'_H%&_X%'_D%O&_T%O'_L%&_\%'_B%/&_R%/'_J%&_Z%'_F%o&_V%o'_N%&_^%'_A%&_Q%'_I%&_Y%'_E%_&_U%_'_M%&_]%'_C%?&_S%?'_K%&_[%CL; _2d%C%_2t%$_2l%%_2|%#$_2b%#%_2r%$_2j%%_2z%c$_2f%c%_2v%$_2n%%_2~%$_2a%%_2q%$_2i%%_2y%S$_2e%S%_2u%$_2m%%_2}%3$_2c%K!Q?&_2SJ̜(~ɟ/%QY/s%%_2{%s$_2g%s%_DKNdDK(~?IMo̗(~,(~ɂ,(~‰,(~ɢ=Q/G%'_D%K&_DKJdDKIdDKK_;Q$_|%+$_b%M◬(~ʉ◬(~ɪ◬(~◬(~ɚ◬(~ډ◬(~ɺ◬(~l(~Ɇl(~Ɖl(~ɦl(~l(~ɖl(~։l(~ɶl(~(~Ɏ(~Ή(~ɮ(~(~ɞ(~މ(~ɾ(~(~Ɂ(~(~ɡ(~(~ɑ"G'_rL%&_r\%'_rB%'&_rR%''_rJ%&_rZ%'_rF%g&_rV%g'_rN%&_r^%'_rA%&_rQ%'_rI%&_rY%'_rE%W&_rU%W'_rM%&_r]%'_rC%7&_rS%7'_rK%&_r[%'_rG%w&_rW%w'_rO%&_r_%'_@%&_P%'_H%&_X%'_D%O&_T%O'_L%&_\%'O/y1Q/y9QW/y5Q/y=Q7/y3Q/y;Qw/y7Q/y?Q/0Q/8QO/4Q/Q/1Q/9Q_/5Q/bQ!/*Q/&Qa/.Q/!Q/)Q/%QQ/-Q/#Q1/+Q/'Qq//Q/ Q /(Q/$L(~dL(~L(~TL(~4L(~tL(~ Ycq<{=J%{U)P( "(e IE!3R" {?ϳ?_sqljr$B o$7~#HI@HoFR5x7jT$F o$57~#HI@HoFru o$u7~#HI@HoF0x7F4$I o$M7~#iH54$E o$-7~#iHI@H $@H$M o$7oFrc o$m7~#iHM$C o$7oFrK o$7~#HI@Hn $@HoFr{ o$]7~##x7nHI@HzoFrW o$woF3x7^HI@H $@H$@HoF7x77~#HI@HoF20x7A'Hɐ@H $@HoFH o$oF2,x77~#y $de o$7~#YHG $@HoFI o$oFY o$7~#YH|HɆ@H6oF)x7/7~#Hɖ@HoF-x7$@HvoF+x7݁|Hɞ@H $@H $do o$7~#>x77~#HɁ@HoFr(x7ÁHO $@H~ $h o$7~#9Hɯ$d o$oF{ o$7~#9H $@HoFW o$7~#9HɅ@H$@H $@H.)?oF&x7 $$} o$7~#H܂d $$s o$Y7~#HI@HoF#x7 $=ٸg$t)WS-($t)C}_P$iiqis"IHu\׮L d*f.H@ܑfQ)5:~G'3d9+lhƞI@v(uRD sM^4 * *p E:*mر"hp%S ً2h5 Rr9 ȕTXrc/Oi4e) ))sHE* TES-F N*>Szj1Yu\MztFƐ&t)#mFkiii촢c8Sr-ٯ z} ɳ r#-&H{HtM'|:zQ]t%*Fԝu7zr/OhAa@?>I8 $LfH }Y C@o3,qc_14CCF@}$d>Y?OKqh_}DǾg3Q[ll|EN4ȵ!{ @|H݇@Լ?3/R! $<=p G4?Q3QPQ1qȯ:9Ir 9Ú糁$ߍ\ ɽ937ITIII IHI&CdDdA =+9ٶˑɅ&w5'MjW=$? D $PM1C.e\AJuE J4%Ӥ竨c/OHY|ʡ)Q!U𩊦` 45!6:hFS AՀݐFhSO4MՌu 欨hZ[Zu-: 7u#Qm! 7Ar3HGH'{gf@o2%v4]Ip#F;] Tx/𹟨}XQ}y6=H~d\;͞>Y F3]]@HOOSVA|AC~DG ?C~(5#8 IrS&f >ϓ>Ao _C/$K6u\iI~7KZsz|2M͕1~&|2<베 A=9! ɓ6u%*=̏O@'mA4I~ƹH ɷhM] \ zJ0!Wu%*) ))s9HyH^M%rUN6u/Wù:+$URՁ$߾겞1Ӏ5Dӈ4A,{54"Wk4Bc3m hn${[i;IMVhnttt[܆ ݸv%H7${wz@s'5⤽t^4|v( h xÌb(:(ه]}p@Fy5zFQh|dcЌ)|&ȳD<yE^y9;+LLfNA3h~YH y&fѱм\yd.p4 y"ԋg >})=|އ,#j9d?!$VYH#4kY ##]f=sfd#6h~ 8f']hvs}M{X ;reC=Fj>H!Oh@~9 99N_Y 'М7;| h '$"׹@ gêH4\I4$iѤOZstɈ&$3Y Yɉs.Hn@2|hh KBh K]QEҥrtgK1Ur)2@s9ٯ JHI|JOK\M:_\I^!3">h(URRR RR^MUM}4 WC4 qn 6%3x $[0VhZ깟 } }!~< 5 o_pb0>Cاy8Pr=Bԣa8d2Qg<,?ø5<>|?M3|֡YO͟@ %d3¸}Wd߅f7_ߠ~GdH:!ҧ֓ ᜝DBHSWK!*,H RzO]QU<u).#.Gss%亊R*O4eє'{|*B*Qae4UT%W{:@SZSr5>uԣD54 $EMHSH3jMsH HKFъ&ZuD]M />mnH&Fўҁux3|:B:QsgVn# vHWndi4w.\=I}f7{qr?HBc @3 !CCh G> B|Ah.]]=N, $rY|>dEgb5=5ɾ Q ωh6nlc[J؆f;\_1; $EQ| ك7h|˸A'4@s!4٧?;ρ$ߚ~(]= O9oS)i| 9K9<\'_ wR iʐ:iI 3 RWKF4dF5CI hrM.|rCM>UM@"p "h<1_řK\ȘWT r]H|˚+_!+ƕSUR*Mʠ)s94!H7*A*U9JT5WԀħShfH=[ꡩjisCf57$y:֔u 9%ZC𹞨6Dvдdbr I7zbr3fc 䞶qt|:t $ՙ~+HIԅ\xKU\Thb O/4M7G=Q} }zM?H H 4I~% av d&| $1*|22d$dGCe%CT ysOS3g!sd/"XQ2|&f25O!j*U|A^Lu:2 Mfyfv 79hr:k OG<YYL4RR4Aއ,#r4+cx~#4k1ZS4\f='TyK7㼅mll8E=;gλ=o t/c~H$9BAC~ĸn(8~Esrw4xƝ&${g /_D#yf/ J:͘.cLOT2ɄOfM6HAhreLhdLݧy#W~*,@TA ,1uE?Eq.8.)r:vQWfL;%񹊮§4() ))O JSRVES-{]u45𩉦hrѿŸ<ꡩH|hDZӔq5*lO HK|Zis>rFVB[4} ɷ$z7|;d'FڙoAs;+c Ew3"{S8߇h K~?H=`O#h !ég=|k<ɸpҎy>Oyg,38sϓyK8O@2WLdv&b*U|u |f2;o&Yd+[hf̝}d> !bY]4K!2\+IYY\f5|JXcZF |:C>' fy#7m[ȵg6rm|N*En5dr};r}|h~9H·bvs ({k8_9A='r9dNϢ rr dh?~?R5i3fO)u!{fL5gʔ:BTVɖ)cىʁsNH.r+Qy!ʏs )p '~r͔/\ٹ\j;ge |9^RrT}QM4eQTTae|S5 $<jUqՃǧ> 44ƹ fkiN=-jOk%:'W47Z.͛h}M\t'-$; 9[ID %tEsu'8d{Q=`o|eއ yCӟ\ D3 &jI޾~{(5?ȣs1j~z3O3Qѐ'qKqQ Ⱦw Zf ]Y=Լ hVkC4+I~B55c4k|SFdd=>ӟ/ڀf#>DmDڊ϶@ZqIvwv \{4d/d{' 5fHp>SgAs1f8~%7~'4q?ќ/94;[?h#w4S{6)]Ա$ye@ Y2֜M643v#\TM^ɗ9uSMA eNŒH _CSͥ$e.#W fr4W2W@̩+*Sae!p.h* QY 5dBSAs5.5CSҐQ4¹1 ) @CZ@Z֬k;סM@m vTxS t f-DuD Mghnç vB𹓨hz `O4I~ރsof^|㤽 } }σ@<<  y(3\/DΛF38\5cc G=O4ȳ S z 22Dv&H:6*>y t fRhބ̢oylC\AC08Yb*\]Rv#\tr C4+*j>| Y ?Euhֳ>g\_ 8o $yd>_|,o[ɵQl+Nv&א=o-E=܏@Ds(/fH}'fQ?~a\G:8_ќ I4;Q'u_94癝 8͛?o ɷuI;m,$vҡI%?d̒Za&HfHHVf#KjɉO.HnH2|D'@ԕPM!f0"YRg(bYRrq4h!>4FMSH3_CҊӚ:_! tFre r3η#Nh:Cn%mh@n]܁;9EHy#;{oO+wrf>NyM_ ~D y!D=a4C!PᣌbQAg8dO8 <ə0\cy)[zlrlKypQ !}d1d >2ҥ!p^Nh>@!d%gu _a?g-3 >>C8o j#dK BV6ف+Nfpc;=PϷ$߿C7|Oy?5QI# #/c8J'$>Q)O\3?,/*<<\ ߐ Kj@fMJ&}qed̚:_ɜ5uvdMF@ȕMr $䡞h+?>!p.H)5u/CSz.Ess9+*HwR4@BA\WJDU!WUH5|&5"{@o u\HԪs=4+!57"1&D5Cs 57'Q-ѴB͵ C|FH[Mr{48io[I~vdt ${ogrI{>]XQSO@o;w0n$Xw n <]Kԃ~g} |EfyY~\è1z5\#$JVAVC>58LO w>#@0Gy _* FƵ /lf[l%6vv N.n|f\{|s[yO=9ΏD>?@#@o9H+$~]w*l>ijBeKal3|̈O@H"+l8g *'\DAC >)BDùx gD]FKs9ٯ@s%%\ŸJU2Dù< J$תث|#JjTg5I=I󬍦N ɓjHǸ|h@ Ҙ&hi4!- -iiEjv>7M;47i܂#kΐ[q M Y;EԳȻd_ y>YNh>@!d%OU|NȏѬ $'@9 :5%5oy hhvg']݅@o_n|;^@~FzA!rGOŸqrch 4'1Y 9 3 ϒ/4М'F>QdO%iFϞ2E33|+Ȃ&k lSǞM*̙=E͹ɞM^4 BD $yBbhR4S"{ꚿ+ 䢿R$!KS $X $*\OUH5|CjUM-HmH|FSM=VB}N4 4b5&{@ܦhMsfӒՊ$ײcד 7@nc7iL-WG|:r+> +v|stcvħ{ .*\=!r/>A<s_ȃ~g &j!fG c%bk'i ? :z_ـf#Λ _|kڌf [ll~_3/o݁$oC}M=|(|G={C=9999 \?9g49JW9ߨ@.4?u&{:^ s$8z H{t 9R+̘#u39G f'k _hH9̑ڱ\hrCPs^zD@SRR"D\J/ùD w"~ASД,r$D噯 TT&{4U!Ո:A=5OmHŹ+>4FT$LS||ҒV֐k!|=6hn`7i>mM\hnH=8E;Sϭ$qrމ; w r7^4qO=w0}I~>H~@4 F3\A <y{qb8Q#p~3r4QO2;c>3\O|_}3g5>{sh/@^$KL@2'3 d:?*kT8=] qoR,*| !4sqf>d !@͒@c9}p圴+@qұ"jGZcF'tS4A1/ Hdmy {g+>ۨy;w]| -;red?Fc wȟugasq48At7;Χ9 r?ќE9j>@8 LJI I3'} 89Sg0ΙIYrv#k \NhrBrArCPO^r$W!Haə‹\h.%e\"J4%XOij.ˢ)G DUc jDUGSzjH>WRO=| iC4Iirc4M M!5{s4- -! ~-:G j iǹQ7ґNΐ[ ҅u;>]YQwH}Nru$]nrD =D݋>|<@} }93ħ_ T8 $ `F(a1'p4# Ok$dGIc57q<žxg%3:z9]Գ ͗8oA6vvdvv᳛5Q{8[f;*K}h@Bs͏h~Bs3Q9 9Ɗ:W 4'9I~bO3>zΒ/9y7 Rh.ɕJ@BAJ͕!W̘+u3JW\3笹Rg'Rg'"܌"' 0!WQH1|Д\8 $y^O@o;єh*@*2+ BTCSDDS ڐ:D] i@F\0Ҧhs mOKVT+՚\עr= ހF4mѴc7ѱDu Ӊ3oeF.hn'W@oDw[ ߍħ{ {깋ߍ'{!u~TM_r=4 g<̊JG؃1r=Ι0q$ 3X4p~ hY4㙝p~ h^dv^"j{e|^ $[DjDdOE*dQ}:QCf@fB`vD3oA&j6s$\i>XYHw;,Fz $ym)c,cˉZA>CVBVAVC>y cB>|H?X 9 rmͦ@_[_k3d ؊f N4즇_C=-QߡspQ|kIhu0{!:8[ӏGg4@| q4h~NSӐ?fO9 {jiiL=MIM9mMsf[< Xr#)F ϳ8M9|_d_"|^jfΓy QS!5 khyzf țD͂E=os&j\4Ig.೐za\ȵ%wq^{hGѬ@ Ռ#0㳖|>e~f] _h>'tcMD}Ih64@d'd>k0-we=+4r"0?Bs!u1qȯ|瓐F7 Kj@I9]TDed$*ΙI~eA5h64I栞yRg0yRrr%*#͏ QU"DES Mq4B.#\yRUTԽS2$t,T "T"rԝ[MUO jRO-4!u W.>> ا 4b6ƹ 3f5hM@_Эj  C@nF4mѴcoBMG4井S6|0ӕz@ r'ӱh܍sOH/=hz|/><ȁK?0j@S$Ar $ן dk0́ D3YLC8bN&j(5?yahC8'fMԓ<ձqG !Qll!j+mhCvPW6?_ك7->{9{4??ChQG ? h9@snw)Vis&ן,ss@%yS5i iFdțZOF3A2C@Mj64!9'g ߑr;ZF7y>4Iާ-@=Ib_Λz&(1D]J͗)r5_$**,OiUM9|URJ$ODUɛznTIQԠS R:hhA҈Q4ƹ QM44͙8 $ k\\m 7@nd\mѴi@7Cntħ|+6|u;]܁;tTA=wqBލ'+#s/5G } }!?f A̎!Ð$U{=J0N$І3gD3 @oOøR8B4g|'~N $FtÁ$O$s 1j>>DFhNANL 5Oj>_s亀ha?V%R}KI/u $yϗ+C geF4򥮖hK=7ɖ/??y yɞD@SBh K"NQZI]Jˈ*rJHIr]h@BSMHE*A*3_U UHM:$!k\ Mm|0GT}iO#4!MpnO3408 %Qд䢿u$߈'{ hnĹ-#&C:u3-h: ҙ[!A@nǹ+n;s+.rݍ'{1;7Qh W4}!2~|BAkoafp(GI(a$D@#=(F&HG3$d d,<yn!+!W j4A@>&Z'Y uh֣ !/p/ɵ94[ط2whvAv3|d/Q=~|9T#Q?A@~4GI~{㬄_ќ$y$~ck4? g RY4AAs7Q0cOH(mTtSrfdd $bfre $yFe'[ 'Zv49 9!ȞM4y' sQ"ES R\,^.Adr%$bKt w28Źh*@*B*A*C@jSRRR Ru WCRa=4 4dQac4M4E 5ͩE ɷӖBӚUw-\dooDr=܌4i'jH{+ηhsvCs';>w {Ra/7^}y>N_~dHx|f0!*|2G 5\A y'5(4!O5X>O|zͳhIDM&j W(^7ك3 HYh $6ف$$}$gGZy4BR{h'24!+͇Գ II~箥OxK\8ollK4ɵV6:$jd7gȷ$C\{>4C~O<9Ī;L'sQ4_!' '7DӐ? gp3/g3}߁$!׿T>HJS U@szH2B2A2SOBHqH\dύ&OYK|R`~4 h |FS$|Qj.Oq4RetD 'sE +є$URRτh\ROHUH5*NWk ֢䪃RϖQ! ! ҔQ4\؛CZM+4\:j >7pn܈-+t$y3[ Nh:mt !]!wNu>wCzӋ'=D$|~4M_ QgQf0!z2G< Fcs?>җ ~r4 I~M gO<HɡVhq<2'fd4QOf,qI5=4ϒk<{94*y"3Le+8OD3 2\S Sz2h^' 3Ѽx\Xo6d6=\<5r-$;ED-y %j)=d_YN ͇Uk؃㳖 >YG/ DǾD-hBA3h$.4|M=D}n|f/eQ|~Vj>HO"Qa4?\G4G93Qq~`N ќ4g?:K_D} hK=P&MTMZ4Фd(d"*3$ $kfC9 9 \D!W@i~4)X(uBS8}4E!Xq*ehJd29VUREi4eДESP*B DU $e|@BADՂԆjH]i@7܈5&$$)>u >!-i iETkȵD] 7ڢid@͐[ؕtb_t&׭$%{jM7vt;Q= wu7 Ÿ7^}8y>d y~5@4H!*|<yahw4s&Kh&_&+LbLF3SѼ44D7YDm4qf.d#fA _y'W"4y,w!Ky>d[fHVYjH]} 6@_ ᳎/  !Kf@BAu!a~D#!@23cL U8@ q\A~'Ӂ$8gIl ޿u5vhc_R8Up(NX©k5=>X8u=gBM4Y! ٩'$'$> yIky Sqe+$ SϖB$ UMQ4I>͋u)2^q+*IДBSReєCSMfb ɧg@V_\TƧ hNUV =]{\UHiU87BMHS1бde"Wk%uhGӆo ׍mqn D9)O1QI~߂#Νtf M43]~QƧ;]@ܻI իH@~+>{_#M>Fz?#}>DE Q g Q`)f%#Əҟa~q@%j<9r=ȋz h^>$M5%5W>h^ dʙ5)#H]}:xOCRK d,i: $UHjʈO&2SO4YdC\9 9!p øB?{f4I"{@ϝ"d/s1Sͥh.\NW@$$ 2h2rEROh*Պ VƧJ̕*ث|+F ɷӚTXyM=upESM}iiDTc4MM3587$V8$p- ׳Zڠr#->M=hn&-DuD hn6Vo'+;^M@0.V݌'a{$5/AH?C0T82\C 0هy(QcD=y$(Fry|ƢStiV3YVx4ϱ2g/">/A&2D$'ӱ)l~BOWk:3p y&dB6dv _砙96'jn!QP"4q^y8}2YCVR*j|>R'$?E{yXH s4_@M$Ϡ/llQ+fg'dߍk:\|cyQgOA9H94G98 rFSs:rJ8_$o1E ~O4!`4C Ag(5?BZq|^A'5\hȓ$o2D< Rx4ϡy/@^4/^A31$'TD{khu43 3hބ"-ې٬98%jwp^H+r1.7Mg%,CJ*VC>bk SVg<59/Im@nB%Լm ;!hf{ ߰;dⳏfy? fv~D&/Dc)+~Gs r\9r949/տͿQK%i i $y'*Cg'S},$d#*{n *'\hr|Rg9?Q^¹0]-(]-F$.EsY _KX>͕*Ib\Xrç<Q! !Up:&ε|mr4uY-s}`|i1MSF 5hCZM+HkȵpAs>7BBq&܄s@o97-tl鄦3Vr,w!v:; Mw4=.z7Q=Bs7˾h ]O5@ `r Aaj(QI~!>t~8< Hfy>!OB@ƒk)<ysD=yL$'/ oLb'sp*Wp5t8@3s&>IE8φᬛKy,;"4_K]fp)>AghV@>|J4 !k!)3A9 V|6لϗDmf~߆f{ Ivf\_C|Ed/Q=]~rYyafG4?R8g΍_Qj>8_Ɖ@.7*\i4s͟DEx'7WRr>De !J$v*,Wj:>5 Cd>Q 4FMHS¯!9 $jEI]eg&Elf`wwapwwwwm姣o3ys~ݕ|Gx2 1Koo!;P~!OgP~W8Ͽ1@̟7 sw G'Ž 0GxD9ɌHȜ$*Jwb!O2PC9jJIJjhb҂d!&Sp3NìU=d.;/瀘9F.+781y!s>Pb O~)JAS"()1A)#XbJALrhUVwZc諢(+ALeQܻUOUPR&r,JmS.J}h4ZAƐ 4dn5p (iG t (](zJO bzCLPB ? Qyy0 = yFF#8b@j8&@j(!PY}M'*Lv6xυyy>( @YAbk Rh g(+aZyVCȳkY Vς(σ(/(/W@y5:(o&(oA!.(1~}}$Sb>Ž{)g|| ޿V߀-|1?@̏pV?Up' _ gxb"rs 1!OŭIU(ϐ'yI!zO)KyRC4'(?2g b2CLPBl*'䂘ܠ%/JLp2C] ދVbS\w}XbJVRSb@LYPʁRFP*BJp+C*T<@g J,yjRZ(4? atA&pVBMh1!s 5(mVtEgPtbzΧ=!s/p}@ J?8cp h5b22e$53Fgd3Qw= b&58 4PC13AlP@3|hZ-XK f)Y}-3<E#YY8s\?s5sbAMPnrށpd~(O (,<uyhy eQ+p쯂נ!&ļc6ļyޅV>CO ϧ(//A Fk(j[f!??Ϡʯ7b?!/տr+ rI1rL31$>QK+̟A(_± 7p~@zƏ'P~_ߠpV~ g(~΃ I$[i#{$J }%~棠U=- xYQsVOOat>><_ _B_⮚o Ϸ;h=(?b~gh (82ʟ/F88y3'~ (o'R$^[OR7A9J }icFacm 1 9W 喐Ek!t t<] OWPA ~zAp@{~pŽ3<< f0(CPp8g$(@ yƀ2Ze<81a&5Lb*L!NP f&xgc61s!A| WkoaܿAA z<"b~ ;dFO(o@p%Ap? !&Qp? JbP  sRh 1@IJ PR*_褆4G'-ĤŝÑf>!O&dldQ19O|Wn# 1(b@~ @!(n+ }ŭጕJB_`KC_ep<@+ALe\T88@wdP穐yL1ZA_3!f̆9\~Cj!Z1a祰&YyÚdY 1(VC5e(!Mle ([mvg'.PvffApx@9 yA㠜$S4(g@9 9PC\z+@U(a<(7M%{6us!#P>̟@MZ}3 K(_ db1?BA2 ̿C?՟/P/` &<&AL$DĄ !&(1 bƄ_L%p)c|*PRC4%(AJF=SLxeJVPA_ArBL.Pr<W>d>WASb RZALqS2&̥! ĔU Ъ"x1! TEV.;׀<5&jC: gԖi1@i JPfpƚCL PZ ֠-ƽ(p\!s'P:@LW8ݠ@T {>/pb22A  1c@ ǁ2}(A}M1S!f Lh5 bfC3t\q!Qc !"g d^ 2PCbV򬅘u j#Mj3T-y+Tmg;dv@NNwAnV f?sC09"61s? 4(g@9 98sAE+ r\vu 1 6܁p~A}(O-OCgճ9yy ˢW ϫPi_( @i(;5Ƣk&{SfƢĴ xn J;ht(.tV ;(=`tzB^;Gw' c1*@3z 1C@*z3>2<#AhP@ Vp8ZM3bB413 &h G1 H @M 1DQ? @Yg~d^ Z-p+ f%YjP@bb(1n0 f;вbv f7${>8?a@sÐ(GA9Gq2V')9 8?g!9Cs H 1WDqW_W!1&[s;0܅{܇3z1`tOx< g9<\/u/{_\_BDq| }}" * K(_Co`L߁= b~_ W7wh 7?_X] I u‚yy"AI\0@(hhP%/u@@ю<ԏ]@l܈?)  o 4D: zC"%q̓?F<ˍw7[ȿw+}.O{5϶{Q0*4,=?0'yߣn'{Ϫ {'9 >>w&H%Z-G"}>Z-GKEh|>Z -GKh|>Z-GeѲh|>Z-+LH0H*kbDT(@b&m:RէO >V?V>nTrk$(#zOi˦^B=|?㋲Y{U:xHw׃t ^|}q<6s,Du璿8Wbk&͒0M Kl AuAY"KT@D ^u962ytvtj7ҙHH'lhnHGF:38 mݧtf6q6 چOIGHgf#g#1/g#iHof#=g#mll7^69%=SқHH/lhz#=e# ƑV}׳!@ Ɠ~\ldld6 wN@ f62p62چ[72кFFaCp}eld0Qlp_ֿȨFFZ72(lhnHFF39 m]od덌f62r62 چFFFF39oz62FW9'/aqmd2I6S2S2$lh)ldld6 LLf62q62 =<ęęldld6 ndu#̜†)霒FfFfaCp)ldld66~k,92^a,f6p6F3e6,f6p6چ;dsJ3Y8Y mfld1ş1YuwIJWYDd'<3IYij ?^IΟZAVG+ъh}>ZIVG+㣕h} >ZEVGUѪh}>Z0-x9WcR.jM׸R 5.5.8mÝr/5.8míqimqGؘ|pU<yBfoP~FFaCۈT6yll6 <38 mL'_F>F>aCب6ٰO6t(lllĨ=U SŘوlچF e#F g#F6ܺCFFmu#cf#_13g#S9%†~O ?@~39 m]of6s6 Fnl06( lm((@(`fgmtQFFaCpFZ7 (( lhn(@(`fgޖ4{lT덂tQFAFAaCpFAZ7 (((lh.)ll6 nl4QQHgl }B†ߠ2QQH6F!(dfgmp {ll6 ? F!38ͳQXQQFaFaaCp(L(lf0gmtQFaFaaCp”f6 s6kFFF3E8E mee""†)ERFFaCpE(Ell6{W%/{6hQ-jf(gmkѢt-ZFQFQaCpo7((*lh}Ѣf6r6 b M_rѳQLQQF1F1aCp(F(ffgmsJ1:3QQL69eb†QgU*nf8gmsJq:7QQ\698S((.lh.)ll6f?Yg%h(afgmu%ll6 wRSJ((!lh.%(%ll6RvFI-֢%ll6 mFIFIaCpFIU7 +%9% mebC۰QQJ;lR֕ ֹ6J((%lh3232چRR†Q#d#ȆP0V6Jq6J چO)E(efgQp]Nz6JFipm6QQZ6ܺQ֍f6Js6J چ[7JӺQFiFiaCp))ll6dsܳQc^r6O u6ʘ((#lh $&1QQF6}JO6ll6 hF3e>U{.{ȫwٺB>Ӛf"u_O+KkDY3e9:OyгuejSwnutz,1/A9/֞J>ꈇ^9-W@9DQRr/A9}m[Gt H ` +x=('h\QDmsE9F938免!Fyjk†޷([hV6s6 چ7-OEy39 ml7QQAU]"=BkL l<_F38 m}B}N۰QQA6uD`fgmue ָ7lTT*{Zf6*r6* چ^ۊچ†֍nT4QQQ6ܺQQFEF%ag~m^F%7DlTlT6 nTuJJ†7*F%38 m}K%F%38 9|\sgiݨlf2gm-*=Ie39 mÝS*9ʜ†ӪL٨lf2gjȦ [vy6(6P6٨٨"lh.U(UlTlT6 **f6p6چިB٨bf g␤lTUlTlT5QQU6\6R6٨٨*lhR)UlTlT6 nTlT5QQMظv=z]oT3QQM6WS6lTlT6 sjsjf6q6 چF٨ffgبFuZ7٨٨.lhnݨNFu39Յ míiݨnf:gmsJuFu395=^KųQCA}0QQC6\6jP6j٨٨!lhC6_0V6jp6jچ[7jP6j٨٨)lLD!<5UݨIFM3595 me&e†!lķ qkofFMFMaCp5)5lg#~c}#'ΎXxjhu|>Z=Gk5hM|>Z3Gk飵Zhm|>Z;Gu:h]|>Z7#w!v6xSzl}{9Śk\,qR kqJ6/6d#Xzg_W0k\8mSkqQKqY1=Wll6 ;$wHj٨٨%lh.(ll6 wmTQF-Fma1glVt]FmFmaCp?3M?3mf6gmt]FmFmaCp٨M٨mf6g1$=uTݨCF3u8u mýSދcfgmquB6lvlX٨٨#lhRQFF]ac<uww٨٨+lhz.]o5QQW6Q'd#Fwae.gmlԥl5QQOކVx6ꩺQ֍zf6q6 چF=F=38 mëC6l aegmYG٨gfg3f?.lWtQF}F}aCp٨O٨of>gmxunF+υ ae>gmf6s6HkԳ@m@60р@6gdgdhh lh. ( l4l46 ~F3 8 uo.l4TsJC:44ѐP65Qkhf!gmxl=3̆†֍f6r6 /ItgzQ=[F#F#aCxb#ȆWlhh$lh!/fF#F#aCpע(l4l46R8FcU7ӺFcFcaCpƜ†!ldວx +9 mí)l4l46wl=MB wTFFaCۈT6SV6p6چWFxp0V6p6چFF3M>{nݺZ45ԟ:zpB+ASΓ8G*l]S݂_ֹuyg1oj41Q9_)=߭kpεlVIZhh-lh.)ll6 ֔f6Zs6Z چ;l6њF(*}<mm(mll6 66f6p6چhCmll6 s66f6p6 }U?DF[5sJ[3m9m me-e†іF[F[aCpF[F[3m9턍퇏cgbevv†~ގ~F;F;aCphGhgfgmFcvƛO|egS9†~ڞ~F{F{aCpz†!f6s6:+Ff6:p6:چ[7:кFFaCp†сFFGaͺ<ƍltTsJG:t4ёQ6FGhf#gmltlt4ёQ6ult4ёIX^NtNdfgmultlt6 wщ7:$lhnDdfg%{6:љ֍f6:s6: چf6:s6: چ,ohV6:s6: چLlf3gx:z6х֍.f6p6چ;tsJ3]8] m]vk.f6p6چFF3]8]ntu†~ׯ+_W3]9] mÝS9†᱑>d#ȆUkjV6r6 sTPwghffgmntF7F7aCpF7Z7&lh.(ltlt6.n5]a=lw39݅ mÝS9†S}Jw39݅ mc#sFjjV6s6z?_|c<=Ԝ҃)=ll6 Wz難†уFFaCSۧ5 +==|>ZG h|>m6GFh|>m6GM&h|>m6GazJ+u${S=\zSjᮍzҵQOsk\OqچnI=5'q=iڨ']48B%l k?عޞ^jE^f6zq6z چF/F/38 mÝz^^†z?Zo2ы[8yl^w#zF6ћ[6\6zS6z-lh.)ll6 ^LoFo39}w{x6vcfgmll1чG6\6P6#lh.}(}ll6rS<}Cz6|QEkf/gmtF_F_aCp}z†7F_3}>OHGWD'<<[׏9ρykG*eaa†֍an 311L6\6Q6&lhB6lB5 +8Å-/Ql Wl l 711\6ܺ1֍f6s6 چ}l l 6 !A6d~SS۰11B8wx6F(6FP6F!lhnA3#8# mí#hafcgcmxloeMmHa/lT덑t1HHaCO)d{n†EGҵH3#9# mÝSF9eQF*hEefcgcmD*w{F%lh2)ll6 w-:EG-l_Ч[=՜2)ll6 w17F-lh2)ll6 hz_tќ1W}[gcbc ec11†l111F69e SƘ#lhF|ǐ O0V6p6 Ru<cc)cll6 w-:Eǚ+lhnKX3c9c mC3d#Fr߼2)X +c9ㄍ,c^MC-8Gll6 o--d#FTp +8 mececqq†Ս!A6^?8xaݍ{z6+6S6ƛ/lhnOx39 mÝS9e†!lĶ lgٰ11AX*ygcmG[-іh|> mG[h|>mGmѶh||KԸϾ{qk\8míqqřk\qqR wGg8s5.NjTqq[(3Osa Lnnf6fr6f چ{e&2LLaCp3zx†fR6f٘٘%l:qbY,2efcgcm=+~7{YY†~3~3,,aCp٘E٘efcgcR z6f+6fS6f٘٘-lh.)ll6 wNMf6fs6f چnM٘mfc6gc)*۶=s٘٘#lhzc]o111G69eS٘٘#lh.s(sll6^y\г1WՍn511W6 w511W69e.S٘٘+lhZt.ecyFڽWod*ؘ٘G٘gfcgcmucll6 ^]o711_6ܺ11|aca?׳@aCp v†73 8 m]o,l,0Pظy< սB3 9 mí iXhfc!gcmuc! l,l,6 f6r6y0\En,ucEE'ʆ""38 EEf6q6y*.(l,l,6{i'9<)l,l,6 wNYLf6s6 چbb39 m]o,l,6DހݳDaCpZ7XX"lhv .1D6\6P6XX*l?f6r6 چRR3K9K m].kѥf6r6 چRR3K9˄2׳L22aCۈT63l,l,6 eef6q6 چ2238˅b7fl,WtrraCp?OYN?OYnfc9gcmtrraCp?k[NXnfc9gc1cflPll0B6ܺ֍f6Vp6Vچ[7Vк aCpXAXafcgc;ȴ=+՜)+ll6 wSVXX)lhoW߮4R6JJ3+9w[,]?̆uu†Ჱ:6y>k֭bDxGyܓg{nmGh}C>a툏vG;Nh'}S>i팏vG;磝.h}K>e튏vG]ӂq1]1OrڡT;j5n8mýދaq;x!5Nptaq;x!5Np;haqS>jI翝f6vr6v چ6IF;ll6 ww)lh3;);ll6uo]==ll6 wmv%lh~{o2K6ܺ.na㵙{ɞjNMf6vs6v چ[7vӺnnaCpnZ7v-lh.)ll6?W~lQs:1G6\6P6#lhzc]o1G6\6P6+lȯث^Z7+lh){ll6 f6r6 چ^^3{9C?}>>zn}}†N}f6q6 چ>>38 m]l3_ظwy6+6S6/lhggll6 f6s6 چ{w?ecFrƳq@)raCpo788 lh>ݧ0qq@6{(ll6jvrW!6qPظ]u㠙†>[w>[wAAaCp)>堙†֍f6r6 F/=Ԝr)ll6 wrS88$lh.(ll6 nl2qqX8/MܳqXf6s6 چ8Lll6 Ôf6s6 چ[7S688"lP/8Z788"lh.G(Gll6 ##f6p6چ3G8G+vV[6Gll6 wq788*lh>(ݧ5qqT6\6R688&l ~gԢey6}cf6q6 چO9F)ll6 ccf6q6 چ8F8ffg㸰!<Clx6.q39Dž m#J6ll6 㔍f6s6 Fnl068F!޳uu'*ㄙDxG~ݓ0spŸ$Α?ݺtEq<'G~8Ӝ†t㴙Ӝ†֍Ӵn6qqZ65ii39gNw3\g\gll6 wq?Θ88#lh.g(gll6 wN9C8cf g㬰咙KK†߸Dٸdfg㲰1մ?zֳqY}v9>Clf2g㲰m\\6qqY6//ٸٸ,lh=f6.s64{Ӟ+jNB+f6p6چ޸BWl\l\6 w-zEٸٸ"lhrqUa1g3ȳqUqqUUaCps~g窙†EҵU3W9W m}*e㪙kFwxٸz㚙kk†֍kn\3qqM6ܺq֍kf6q6 چ޸Fٸffg㺰;ug{6q֍f6s6 چON)l\l\6 w-zEٸٸ.lhrqu6 # &=7|>-vGh|>#)iY9yE%eU5u M-m&^j*=r媎t uUǛk\=38 mýOwާgfg㞰mull6 ;j(ll6wl=CkQ of>g㾰m߉O}}aCpٸOٸof>g㾰mf6|l]{ɳu*すDxGyɳu~x'q:ztyyy u?0^ʘ4c<{Z=C}míi=xh!mwWm.ql|%uWm.ql|.߸q۸K6d n.qWm.ql,AL7~=lِ1xݸ={=!cp{j{dC=h=l>ٸscxfEݸ}}!c-döw_m>ql}h}l>ِ1}h}|Dl9eee,222j [ƞZƞYƞ[",c/,c/-cWז7([;Xeee,222klSKIf:}`OqS1~0V׸`\ォ| k\08a V81z}22x\S?d#Ge{?Pxm< 2鍚9c8l>@ml|Mm<6 xmO6bOɆShSlcD* E狞m<6 xmibuol|xK6d n-Vm-lx jodC6Bo6bxgl3kwdcΖSxm#2?7]tn;w;!c֍wjﰍwdCwjﰍh?cĈF476h!c^4jF4ِ1x hhl#l߈66dc۠כku11ދp{l=ِ1fܔxm'2S9{l=ِ1{_7>&o|!c~7>m|6> ׍n|Pm| 2ۈ!9ͼĈq0aNF C6d w\!RF C6d n#ڈQۈ6bȆO6b6b6/|4$c5s1zJZGsq/;Iav\ߋ=gx9/f~}ſ~##/^'1W|s''2'SN'O|"2`= ׃O$Bs'h'l#ls'#V?b#Vm#ۈ%2#baUۈ6bɆmBjF,ِ1Xh#Vm#L6RԾrpk㳰L6d qw?m|6>  m|Vm|&2B6,^!E)_Em lw/w/j_/dC{Z_/!c//vs_6sy6,8.=2jks[<,c1/˘e2kgŷ[,cDĖ$d䖱TԖ4.=?Ԉ 0ո=_'㸸'ߛf1`qA5Oָ8.>k\T1B6qij3Ep6\6\ !c.j.؆ ِ1xoz# lÅl7r6\6\ WA{Յͮ.ovUp6\Ɇ+j؆+ِ19.W WlÕlnBjF\Q1(2jc#ڈۈK6d n#.Wm#.l7.hw.F\l#.ِ1l\h#F\lÍl rd& ҺmandC0tM16lݹmandC069cxCZn؆ِ1mmadc_†;᮶m  wX76ܱ w!c~j؆;ِ1 wh]m U=CP6<Ȇ/pAymx`dCsS<6< !c~P6xA^j^؆7X!e& mxmxcdCu o olÛl܆7᭶mx ? mxmxc>d#6|  lÇln᣶m >Q6|ȆhGm%{&ӆ7|FK6#U6|ɆmBj؆/ِ1xuWm%2Іچ/lIUMxnău#Fl{jdCF|oWۈm'2ڈ' F:S;2dAwd6 !cmafW6Ɇ?j؆?ِ1 h_m ?71W P6ȆFjFِ1h#@m# 27l#lЯL@c#ԍ@^#eT6ɆtAfmbdC6@@l#lF m$ ǻ9Z51SSm$6 ?ۚ=ۚ@m#lwwj dCsJh#Fl#!p Qi# . z.FBl#!ِ16!\&THm$$2HHH6d n#!Pm#݆%DdeyɫݺDH.\ߋn]" A"sqOݺDpHw\܇]<'RD${>њzŞVbX}zAb Ab\Mõibĸ$&2L m$VHm$!;V 8DHm$QHm$!2HHB6d c&"Fl# ِ1xHHJ6^EUm#Tm#)ln$6m$6 019-ddvJ2dF2!c@@m$6 ׍dn$SHm$#2ɠdjɰd#bb${Za\m#9l|NIjɱdC6C6cɆFrh#Frl#Xq@ߛ)D)6R`)ȆaFcg ˎ'.e&F l#ِ1~)~)6R`)ȆHHI6sMY>RԍnTHm$2)aHHI6d NI ))6Rb)ɆFJh#FJl#H5uyMTTTjTdCh*؋RHm"2`H HE6d H HM6tKn#ES^4Fjl#5ِ1FjFj!cpjdCu#5Zm#5l8^~H#ְi6Fl# ِ1$i$i6`iȆ4ji4dC4F4FZq9Mnu#FZl#-ِ1FZFZ!cuJZNIHK6d kZh#FZ 0A9FqfG:9-c,c-c,c-cY,cY-c,c-c9,c9-cYrYr[XZY[ƾj/%Nz;\oS׸tƥ'cgVgVөk\:\Q1xoF5.q|Kk\:uKdR_|3e31ҋ5UzJHO6d N6cɆm6ҫm6ғ HmWHmd #_bbd}s7gPȀmd 2chmd62 F`oAm#l|ȠH6,Nn&#aȨH6d ^72ºQm##lFFh#FFl##ِ1xmdTȈmd"1hbd{n&LF&!cs3s3md62 f{62aȆb2A62aɆ@YMbN jdCt>]fFf!c֍jdCu#3Ym#3l09uZ#xf5 |f5Fl# ِ1YY6`YȆmd6md6 Y,jYdcD4&FVodFVFV!c~#+7md6 )YᜒUm#+lFVh#FVl#ϒk}*#0d36RZ~.F6l#ِ1lF6lF6!c5l6ͦ F6d >d6md6}]y41~#;7md6 a]m#;lndu#Fvl#;ِ1FvF+9%71r8ml\I8ğFF!c֍j9dCu#96r`9Ȇm6rm6r+Njbk؜p Sm#'lnu#FNl#'ِ1x/96rb9ɆFNwd㦣Ibb|')uwjaߑ ׍`Nm;l;!cpAߩm|m|G6d ^76SnW.n0ݺ\\j";߭ȥv\ߋn].xs~.7ap~.<^njnxs~n\rݗ1\rz jq=M"d ~giȭC6&U}V <5i!O#Fl#ِ1:)[OmSȇm#2`ȧG6d n#Om#l7|F>|F~Q`=Uc#?٨3hcjdCu#?6cɆm6m6 MC6cߓ |L66'2{njcߓ ^m{l{!cpC߫m|m .9kb6 @6 `ȆFX7 m6 (mP(m 27 @6 `ƛ{41 jdC6 B6 bɆ):FAl ِ1xQ(Q(D6t_(07ٰ}0F!lِ1;2>W!BF!!c m6 w6 m6 m)Q(Q(L6d ^7 úQXm0QlݺݺjdCFahFalXC澮&FohfN)B6l/|Q(m!2E`(Q(B6d >sJ"F!cpE"jEdaw>&FQ\FQ\FQFQ!cQ֍jEdCsJQ8U(m%2SBE6bFasD/Z 6aȆbjŰbdCbpRLmQlF1hF1l8hv &FqhqhqFq!cpšjűdCsJq8W(m'2SC6c%Ƭ~41J^EKm6J )%RBmQlF hF lِ1QBmQli1&FI NIx}M2PIFI!coϖߞ-Q(I6d >sJIFI!c9$QRm$QlV&F)N))6JaȆRpN)Q (E6d ^7JQJmQl|_QJmQlT%};5o&,8=*(Q(M6d ^7JúQZm4QlnuFil4ِ1xQ(Qn9~"χ)c9ǣeeeeeX%XeXXUX5Xu؏Zږ:zFƖ&f斱aP=o_2b+2W׸2Td OWӕQ׸2ƕ'c ʨk\\P1x\ָ2WeK+|cb56wdʒ&,K~FYl,ِ1We6beɆm6ʪm6ʒ Fejerd}mbu6aȆzF9lِ1n9[NmQl7*mS(m'E:T#(/zFyl<ِ1AA6cɆm6ʫm6ʓ (mW(mT }v$x慉QAW6*`ȆFX7*mT6* ۨmTPۨmT 2ߋmTPۨmT$:51*++mT6* TTQm"QlFEhFEl"ِ1xQڨQnݺVqMj?EnFv݁{9/{9߭\*=Ϻd^%1WTwW}7nv%JT"2Jjp=D"d >WT6*mT6* GxKFeFe!c**mT6* M+õieFe!cpj*dcq{bbT6@U6`UȆ{*pQۨB6d o_WQۨmT!2ӪmTQۨmT%'Ķ11mT6 ۨ mTUۨmT%2S9FUl*ِ1FUF5躏LjnTuF5lِ1jF5jF5!c9SmT6 [T6mT6:~guY]m:Ql99jձdCu:6cɆFuƏdcrߟS?#?mmH6d ދ{6~6~$27~Əj?b? QmGl8W 5DݨF F !c9Sjm6j ۨmPۨm 2Sj@56j`5ɆGD11j^&Ekm6j )5RSm&Ql|N 甚j5dCu&QSm&Qlkb&F-Q7jQKmQlF-hF-lِ1x/Z 6jaȆ)Zjd׍; ibFmoVۨm&2QڨQۨM6d >ԆsJmFm!c96Q[m6Ql46 QڨQۨC6d nQGmQlFhFlِ1:F:F]j1EuF]F]!c^.Em6 uaQWm.QlF]hF]l77GWMzF=hF=lِ1zF=zF=!c~7m6 ۨmSۨm'B?bb6C6cɆmԇ6m6 )R_m>QlF}hF}lXS\L \7m46 hm4Phm4 2hh@6d mm4Phm4$!#らPa5lCFC!cp j dC6B 6b ɆFChFClH8꼉ȹeiD6\r(ohD6d ]Fč6aȆjjhD6d hhL6+꧳&Fco4FcFc!cwwm46 a/Xm1јlFchFcl ٘=CM&F+NRQ&jM&dCpgD &jM&dCsJ84Qhm4!2S@M6`Mƕ}>eb4FSo4Uhm4%27~FSl)ِ1FSFS!cpMjMfdwǪ'Lf[ \зm46 ha|P3fF3!cp͠fjͰfdCfF3fFsQͱwh.l46m46 ׍n4Whm4'27~Fsl9ِ1{'͡jͱdcꆧ51ZПF wu)?j-dC04wp(y*z˼ٿhA6d ^7ZBmтl|NimPhax9y'y9Zj-"ſR݁'}}sqv$sǹ/sr}ie9ee'X[X;X{XXGX'XgXXWX7XwXXOϖ^ޖ>~_,c,c-c,c-cZƆXƆZ}iEqڳC߱l傾cJ]ZyU1ﱴ{,ZQ=1x VV k|^kk\+uk{dش3C+41ZutknhM6d pkFk!cpjdC6ZC6ZcmF+m6ZҟF1&L`16jm6dC6@m6`mȆ}6jm6dC6@m6`?ߥ01~?}6~6~"2'#ِ1x ֍6~6~"2c Im'l-x148ۣ-<ۣF[l-ِ1F[F[!c16ݜ>8:obhm6ڒ hhG6 8O`hhG6d >sJ;vF;!c9Sکm6ڑ ׍vF;vF{.&F{Q7ú^m=ўlF{hF{l=ِ1F{F{!cpjdcimO{01:uJN頶@6d nAmсlyyjdChhFl#ٸcLFGhFGl#ِ1x6:bɆ;}jdCt6:mt6:n jbtsJ'8tRmt"2:mt6: S:uJ'NF'!c9Imљlԣ3L΢ntuFgl3ِ1x FgFg!c֍jdCsJghFgl ٘}'M.FhFl ِ1x]6`]ȆFX7mt6 mtQmt%g_Xvkخj]dCsJW8tUmt%2]a誶J6d 誶F6JίxMmtSmt#2?GFhFlِ1x}6`}Ȇ>pN飶C6d mQm%O6fS }ɆC[}6b}Ɇװ}F_l/ِ1}}6b}Ɇm6m6 n|L~{~j~dCu6aȆ~觶G6d nOmџlvҳ|x?|Fl?ِ1x/6cɆ诶O6d mWoxn]:}/jE}X#~Q;\ܓ]~/Gu^_\=9نgio|:Fփ?׃te ^z0@`ȁP 2_ 6m 6B%יeb ~@@!cpjdCs@8W Tm $2Fi1D6~Ws cm 6 1Hmc1l|m:Mm 6 Ajdc{Mbb0ܷ1L6d nc01Xmc01l`hc`lc0ِ1sj_Ʊt{ujb*֦nW__Ɇm m++ِ1W6UmWlW!cƯjbCFݎnb s8 Qm !27~clcِ1x!!c9e1Dmc1l8MN %2Tmc(1lYYjCdC6BC6bCɆPhcP 0A9hh!c1֍jdCshhchlc ٸ;}cx1!cA߃1C6d ^71Fmc 1l| 1Fmc 1ls7pcx,xXlc,ِ1>XO7Vmc,1lnucXlc,ِ121G6zMq^Լ2l^N1G6d ck gƩm6Ƒ ׍qnSm#211O6_M77j㱍dCx؋Wm'211O6d nc<1^mc<1lO^V& !cwd&wd&mL6& )2Amc1l  D1C_D1Qmc"1lnLucDlc"ِ13j3j6&bɆDhcDlcaثD/: 6&aȆװv$lcِ1xݘ$I$!c5$hc$l7x!_7Mm7l7!cpAmmF6d n7h7߰Ȇmm1lS }Mdhcdlc2ِ12)6&cɆ{ɰ1ۘL6d >L6&mL6~'8Z51~]mwlw!cpCmmN6d o6~6~'2;QezSDݘ)!c)pklc ِ1xݘ)!cpS)jS6/yM5š}}n*՘1.\ߋnTX#L;0|n* SwnTxϧT\=_?v8= ibi? ׃ite >WLL`91\1 1 ׃i$B`1Mmc1l\Ӭ1]ؘmLWۘmL'2fg:|fgtlc:ِ1\16cɆmL6mL6f 3ľ o1Cmc1l|m:Mgm6f Mg  !c LѪ_4I:3Eݘ LL!csmgsmgm6f ׍nTۘm$23j3YdcQ{\&,ac1Kmc1l|1 ?fm6f ׍YnRۘm"2ӚmRۘm&7.{1[ؘ mVۘm&2?v61lYYjdC6C6cɆ)jduWE-LbNYj dCo,PXm, 2XX@6d ^7@ 6` F)ڃ31:CkE MH:OcBlc!ِ1:e!\,TXm,$2X7m,6  j Edc`u651WWm,6 ׍En,RXm,"2`XXD6d >,6m,66619e1Sm,6 a/Xmc1l|k1ZXL6d ^7C6mh·'8Xb9celelelelelelelele:zF&fV6vN.؟ݖ=}aP{߄FQD]j%p[qKp[B5N8-Q׸%-'co qK5n \Fum`b,{1K^RR!cpKjKdC6BK6bKɆm,6m,6 ǁDX2e2!cpˠej˰edC6A6aȆm,6m,6'RX.޻\P\XN6d nc9\mc9lrhcrlc9ِ1o?ˡj˱dD& Q7VBmclj+dC6V@+6V`+ȆV@+6V`+F&m߯ib{1+^JJ!c֍j+dC6VB+6Vb+Ɇ甕J*hMskU*U*!cpUjUdC6VA6VaȆ5YmRXm&3ySX-l6Vm6V )ᜲZmc5l|n5ܧ[XM6d o6Vm6֐"kDk6`kȆp=5jk5dCuc k6`kȆ55ZT11 kjkdC6Bk6bkɆm6֪m6֒ X mUXkxn]pCf1g?"0w⇾[|?=߭o..nzyqr&;; !c6ݠ@6d ncAmclnl66ml66)5MWaYH6nQw|fuFlc#ِ116lvߨH6d >lsFF!cبD6zw1I`Imclhq8؄ml"2߷;MjMdCMjdq͒&f .ʛ66cɆaF g d&flc3ِ1)66cɆfԭ@`&߹Rml6 [`Emc lnluclc ِ1xmlQ؂ml%Y/VJ6ĉO9o%]nlU؊ml%2yGJ6~yYJ6d olVV!cتF6,^ec`ئ F6d ^7Mmcl6hc6lcِ1xmlS؆ml'^:-eblowAoW؎ml'2 ·ml6 a]mc;l|خA6nhMAc;`ءA6d ^7vCmclj;dCucCmcl$T)l6vm6v  mT؉m$2ةI6d o6vm6v aĞ.gKmcl|N]j]dC.oR؅m"2SvA6va߲Ekb)l m''ِ1RsTln Ɵjb ?'Ɵnq߁)Ŝ)6vcɆnX7vm6v  mV؍m&2j=dq.c3m6 mQ؃m!2_=j{=dChclc/(C[{s){Ɇj{dC^؋U؋m%2{aثK6d ^7B{6b=O9L}nuc>lcِ1x6aȆ>X7m6 ׍}>}~禸6cɆpNٯO6d N)6cɆm6m6ثg11q֍jdC6@6`Ȇm6m6 r8q8H6:Llb딃prPm qljdC6B6bɆm6mχN0,xe;j;f;n;a;i;e;m;c;k;g;o`hdlbjfna ݴݲݶݱݵݳݷsj\y,h:5q5q|Muk!\Q1x|͇5q|q5asIob6C6cɆߗ8 ߗ8q8L6d n0qXm0qlξlV8m! 9515:q8B6d ^7qDmqlhlِ1qDm݆%̻u%[/"ݝGgv݁ue>\zpy+%JmsQ8WU/cuQ>vp׃@{GQ%2#BG6bȆ#?41wdwdm6 _c8l؎?q 8F6d >W1lِ1\q 8q 8N6.hy>q\o6cɆ}jDZdC6C6cɆ9mW8m 䝛#q9gVO $žP8m 2añh_3716N`'Ȇm6Nm6N 8mP8m$U8)8q8I6d 8 '6Nb'Ɇm6Nm6N 8 mT8m"c8xG|G)lِ1;;6NaȆ{S=q 8E6d )h)l48fE2 MӢnuil4ِ1:4\V8m&2q8q8M6d ދ6Nm6ΐw}gθOQ8m!2;kϐ [K|Fm qlFig 11g&l ِ1x8mQ8m%E+V8+)g:Yl,ِ1xqg6bgɆYX7Ϊm6Β gjgsddn 焍s9s9!cp砍sj簍sdC={Nmqln6Ωm6Γ-gngb6C6cɆm6Ϋm6Γ ?Cr>Cr^mxSm&qlnqpؠפ&Ml&ِ1M-A;pL[bq ۸E6d [;6naȆA6ʴvp-`Qq ۸E6d >܂6nm6n=&Ķ61nwnwnm6n Snumm!cC16ZNjڸm&2_ކ6nmܶpsǼD~2Eܱ0wÚ9I7vp\ܓ?|'d\47;o..{_w=wp=K<\FzwE= ]ݿ]2_܅돻jwq=Kd crw/<71"zpD mU۸m#ݎ}:赉qO`qOmql7m6 (o&=lِ1{={}6&};};}}!c>>#m6 ?u>u_m>ql|>q_m݆ܗܗy6,`,c-c,c!ǖ'PXe,2222a{a{iEYZYƢ-c-c,c1OXg˹/Tv|u vg݃ƙ7d V׸`\ォfk GqS1x 5.X]q 'cR0qd#^F6`ȆjdC6@6`Ȇ{Csg&CQ7ºPm!lLLjdC]>]>Txm<$2{mLab<<-6aȆGo~xD6d ##G#!c9HmB6{zuSL!aC6B!cp!FFB6d c3?1<m ׍h#Dm#xL6wmjb<t>cc!cpjdCu16cɆchcl ٨^x|VM'κa6Ȟ '!cpO'jO'dCO=O=QxmmD ׍X7"6"!c~#ڈPۈ6^\B)/Bmlnu lِ1  !cxxI6G^zx)l6^m6^ x mTxm$23 _m6^ }6^m6"2[\WMHNHHl#l| )jF$ِ1x݈u#Rm#ۈ$2 mDmDbƽcG7bb+oRxm"2 x xE6d nJmlxmRxm&6J뒉Z)Zm5l} {jdCpZm5ln6^m6ސyFxmQxm!27~l ِ1xx7!cpo7jo(1ub=ϛQbNsJFE6d >D9%Jm# ۈ"23{QjQFِ1:% ڈRۈpּ[7^*ݺP[vn^<}߾U;xkw`..{_oaexow\܇]uo=oq=xG;z\wxwjp=xGd >W"ީE1xxۈ&:}Ĉkh6Vۈ6ɆGmDcdC6hhl#lF4m'v^^m=lxjﱍdC6C6cɆ{=AMjdCu6>`Ȇ{@6d hl#lh&F7b`mĐ Mc4Fm#ۈ!2/>mĐ )1FF lX#&Gݞ.=6>bɆ$6>bɆGX7>m|6> iD6MO&'o|'O'!c~7>m|6> m|Rm|"2Æ ۈ%J5l堉+e2ƪmbdCUۈ6bɆc^xF,K6d oBjg:)[7>~gl3ِ1x gg!c֍jdCsghgl xÐL/;I_Ȇ_6`_Ȇa+__6`_Ȇm|6m|6 ׍//va00?3;˘e,e2nyZƼ,cޖ1˘e,e22o ZXZY[ƒXƒZƒYƒ[RXRZRYR[XҺ|?8- 8u⸢OI78n8hSǀ5.b}8hOָ8>aj\2g G|q!e m Ål`Y&+_m hafM lÅlovqE}چ B6d npQp6\c ebZQ W1evN᪶m .~tUp6\ɆYuuEϬmbdC6\ W Wl#.pl$absJ\8Uۈm%2͝1=𠴌p#54*p6ܠ 7 7lÍl|ﻩmandC6ܠ 7 7lÍl܆ᦶm 51]+uWp6Ɇ womcdCཨ;E6ܱ w!cpІچ;A6&mxmx`dCNP6<Ȇmx@j؆ِ1 hCm$.?s'S<6< O!c^3FS[M OlÓl܆'᩶mx p@tj؆(9uL /Q7`R6Ȇ /oxmxa^dCkX/R6ȆmxA^j^؆7%z[ox o olÛln4upذ=F魶mx 66 o!cpІچ7C6v~&>nm`>dCu  lÇl|NsچC6d nQ6|=հ/7|6| _!cpІچ/K6d ^7|aU6|ɆA6ppH4OR|CkۈG6VMxFˈv\ܓ]ݺp3Ƿ}sqvq2΋{_}zO<@/3\ \Ɂ?j?_mmcd#_p)KLl& wښIjFِ1h#@m# 2mm`dC0628c8l[ѹe l#lЃL@Q7aT6Ɇ@GmbdC࿡™$Pm#$2a|vYiCk#H@6QB#܄N@6l 6` Ȇ.M.MH@6d ^7@m#ln$u#Fl#!ٸxH(;΄j dCsJB8$THm$$2߷H-m$6 ׍n$THm$"?d:HD6ĉ'Ϻ'RHm$"2(m@pw!!!@H!hH)ݝRkRX_5oOע\o7Wa߬Y3{~32md62 ׍̰ndVȌmd&2aȬB6*My #K",wmd6 Y`Em# lndu#Fl# ِ1 wg 16`YGffbd{ZYVVFV!cO dUȊmd%2ȪJ6d Yachsu*FVl#Stw&F6N)6aȆF6X7md6 )Mm#lߔld7%F6l#;]'EFvFv!c~#a<5*Fvl#;ِ16;\fWȎmd'2ha#i{%*Fvl#(q*湉&FQ7rCm#l{j9dCu#96r`9ȆA6n7qpظ~m߯bhm6rδgbu#'96rb9Ɇm$ٜj9dCFNoTȉm$2E#16gjr~Ck#'li{q&F.Q7rKm#lnu#F.l#ِ1 )6raȆaˈtpx͍5or~Ck#lЯ11r;װ&#7l,D,nFn!cpjdCrgm6rcd`ASob 놫چ+J6d ^7\apUp6\Ɇ WombdC6\ W Wl#h]ЂQ&FgQȃm!2ȣC6d oFsJ^F^!co6m}E~|1wXA˘ee2eX|-c-cE,c~1Xee,2V2V2V2d+e XJ[B-ce,caøQmՆ_'77M]ps'cgn𙱛ƹF5Nད5 87q2qn|d(0'|p˧G6d n#Om#lF>h#F>l#ِ16m6򓍨;fbb6C6cɆ{7ʯO6d 函Q~F~!c(?_m#?Ql&AA&FaQ@mQlnuFlِ1\SP(m 2}F؆;8<]p66ܱ w!cpІچ;N6d >9]mp'27ܡ w wl pݳQP{16 bɆ甂pN)Q(H6d c3ÆLMbhm6 y~jlT(mx z⹠|.衶mx 6<6< !cpІچA6d ދz@jvC^ٺtk?[WDY=RD!Bvx ;0OuQH} ᄍxJv߭+y!=/'m\ eyz 끧{zIw_:T;=Z'$BT6Qabx%Ozmxa^dC=16 /!c\zmxa^dC=᥶mx"_}zoV6ɆmxCj؆7ِ1xu[m&2߷66 Ѯƛqu>9ż,C6q#_Q6|Ȇm@>j>؆ِ1xuGm!2mm`dgb/\mbdC |6| _!c} _؁mbdC/᫶m&wOݘQX+ V(m&2a(Q(L6d [6 cɆm6 m6 נv21uJN)Q(B6d N))E6`EȆFX7m6 6m6FA?`bs~ܥچG6d ;~ma~dCཨE6 ?!c~S6S(*FQX7m6 ׍nU(m%2Ea(Q(J6d n(QTm(O6wF/lCj؆?ِ1'B믶m S:_m'27  l#lmL76!c^4jFِ1s$@m# 2FFQlDwcb6A6aȆgm6 ׍bnS(m#2Q (Q $Oiib FF H6d ^7aT6Ɇ{@؋mbdC{FF Qlq (.l6m6 # ۞-N6l۳6cɆ{-Q(N6d o6m6J abh ؋P(m 2_j%dCu%6J`%Ȇ7J@%6J`%FkMLb$(Q(I6d  %6Jb%Ɇm6Jm6J %j% ѕoebFFD6d ^7`R6Ȇ{ ؋maAdCsJm"<#ǙDQ 6JaȆaEa{F)lِ1xQ 6JaȆF)hF)l#lcb FF0L6d ```l#lnúm ׍`h#Xm#!F7B6B!c)!yJFB6d ^7B`Q6BȆFm&o&601J jdCFiFi!cQ֍jdC6JC6Jcdcg.31BE/ {PPl#lݞPnOF(J6d n#U6BɆmBjFq-WߦuM22A2F!cQ֍2je2dCk2p [Fm QlLRhFl#ldwM0Q7`S6Ȇװap m 66°0!c^4 S@߇߇)kGeeeeeee,2V2V2V2V2V2V2iղնձE[ZY[XZYb,c8XeWcC^e:7y,ʪ+[Y{e3Oue\WV]뙹x2vٺUW*f.]uea*]eN|\җY#L ﺇww?kte >y-\ k@p8"N"d CjF9q~kZJdC{,JjdudbTFeoTVۨmT&2QڨQۨL6d >TsJeFe!cQڨQۈ EWd:[Ĉgr#l#l|)jFِ1x/{l#l|mDmD`UF71~ 7mT6 ׍*nTQۨmT!2U`ݨQۨB6d ^7@U6`UJ 71:)eѪdUU6bUɆmT6mT6  OUUۨmT%2?QڨQۨF6gv= Ĩ&jߨQ ۨF6d @5@5jF5!c9SmT6 ׍jF5jFuEreLӟFua~K֍jձdCgr36cɆװFul:ِ1FuF ayMߨj5dCրPۨm 27j~F lِ1RڨQۨI6cQSoԄ56jb5ɆFMX7jm6j ۨ mTۨm$2QڨQۈ$j4Kߠ)F$jF$ِ16a#6"H!c~#jF$ِ1Hh#Rm#ۈ"[EM݈"I~%|mD e((l#lFmD FAQjQF-QI %LZbR Sjm6j ak5l-ZF-!cpZjZdCh-hF-l6٠[Ż==6jcɆal;c$ƂW16jcɆmԆ6jm6j ۨ mVۨm!/<Ĩ#:ߨQۨC6d ^7QGmQlFhFlِ1xQڨQۈ&/|obD FF4M6d h hhl#l|_4FmDcdC6hhl..P?QڨQۨK6d ^7ºQWm.QlnԅuF]l.ِ1RڨQۨG6wΕva7~F=lِ1zF=zF=!cpzjzdC6A6a:>\Wۨm'2QڨQۨO6d n>Q_m>Ql|NmWۨm4 ):h k7m46 hm4Phm4 2hh@6d n@m݆pLCs&)ɭ$5բZDCsIj@4;0O:$5O~C7O.y&! !螷\$v!C+H}zЈA#X491sF9I#F4"2Fjk 1nj=fF C6d $ֈl#l{ 1j1F ِ1h#Fm#ۈ%7*9~Ĉu#֍XXl#l{,|mĒ [}XXl#l| mĪmbqd#;}Ĉ=f16Ⰽ8!c\qjqFِ18h#Nm#ۈ#2qFFO6-}Ĉ{ZpO+^m#ۈ'2Smē )pNWۈ6ɆmCjFc1G|yM tcxFcl1ِ1FcFc!c^1Em46 )j6}YO}~E~-&s455}cko`hd22eeeeeeeeeeeeelWcNMƝa שXS5k&׸&Td 5Qukk\q255 8_ָ&MF9j]eb44ܦjMdC{1M^LSFS!c٦poFSl)ِ1hhF6运h&fon hF6d 5Q3fF3!cp͠fjͰfdCuLmќl h&Fs-b6cɆm46m46 vsFs!cp͡jͱdcv7LbܧkhA6d nBmтlhj-dC6Z@-6Z`-gTbbpRm%ђlIvaKa.lhI6d n%Rm%ђlh mThm"u01Z ֍VjVdC~+VF+!cpVjVdC? h hM6:.N;IFo [m6Z ؈spذ}Fkl5ِ1x/6ZcɆp[C6ZcmJDzm`hhC6d oF6F!c֍6jm6dCsJhFl-x֞&F[a-Vm-іl]]jmdCu-m6bmɆ{ѶF[F;\ιҘ턍vF;vF;!c֍vjvdCu6aȆvF;v7d#k0166QlID077dC061Ro{6W166!2 7F{1b^싶6cɆ=jdCόg6cɆm6ګm6:KS\Mu)Ȇ!WF!c9S:mt6: `AmсlmtPmt$>6Q<vTmt$2a訶H6d otFGFG!cXv6:mt6:YT}$NpN餶 D6d ^7:ImщlntuF'lِ1 褶 llh|Looo66%2-ƷƷdCƷVm[l[!c9[h[od"'41: jdC6:C6:cɆFgX7:mt6: NGghFg !FlwPwjE';[twvγug);}w{]螗ynbD1w }׃.A.t!2].j]p=B"d Gt6mt6sU݄nF7nF7!cwwmt6 ׍nntSmt#2ݠnjݰd㷠`bt=fwQtWmt'2a讶N6d ^7ú]m;ѝl|ߢ;]m;уlz{衶A6d$A6lmOF!c֍j=dCW{@=6z`=FK31z:_Olwzm6z ׍nTm$2詶I6d ^7zB=6zb⿛oM^nuF/lِ1^x/KmыlF/hF/lِ1x/ 襶 M6nv=kvo=jdC6zC6zcɆm6zm6z ׍FoFs_[+x/|/Flِ1;};}6`}ȆϝNm6 S@}6`}F7+~o"{_}6b}Ɇװ}F_l/ِ1:/\Um%2SB}6bƤ|nbF?oSm#2S9F?lِ1~F?~F?!cp~jd3=31;)n'9U^]֍jdCWm'27~Fl?ِ1诶@6R|Xzcx2>O1@6d ^71@mc1ljdCuc1@mc݆0W0/81A!aᖱQі-cc,cc-c,c-c,c-c,c-cS,cS-c,c-c3,c3-c,c-cs,cs-c,c-߇H5α4P5@uk@q215. BqqH5N5n q5n q|w q5n AS1H̓`Ls$I$!cpIjIdCs$hc$lc2ؒLɢnLucdlc2ِ16&cɆmL6&mL6& ׍dɸjGM)nLuclc ِ1x1S6`SȆmL6mL6 ׍))T8ĵ찉1l$H>i6lȡC1ۘJ6d$|M%5Umc*1lThcTlc*ِ1T46AADݘ4i4!c~c7mL6 }M{_6aȆmL6mL65{p&t; 1ۘN6d ttt!c5t1ۘN6d oL6mL6fs2,q1CԍnPۘm 23`ݘ1ۘA6d >̀s  !cp3j3dgb6fB36fb3Ɇk&j3dCsL8Tۘm$2/c&1Smc&1l4(h=&,ac1Kmc1ln̂uc,lcِ12 )6faȆ,hc,lc6٘2bX Mlhcllc6ِ1̾h3Æ6fcɆlX7fm6f j9dzvss999!c1֍9js9dCoQۘm!2S@s6`sF*wcvsEݘ \\!c~#a jsdCuc.s6bsɆ甹\̇s||!cpj6߇_aX22222eleleleleleleleleleleleleleleleleleleleleleleG^aPۛvNE_-5n-5n8 `߼@]jk/k\P1xoָ >o415BZXH6d nc!Pmc!l|[翅j dC6B 6bFUel01g?೟EjEdC6A6aȆEo^XD6d -6m,6 יŻử6cɆm,6m,6 ׍Űn,VXm,&2ߋY m,VXl8Ĝ[@^uKWߗE,0O^Y'q^,;0OuK_Kw\<%˰T΋{D}ϗzSw^m-}RG,U,/cwϖwϖ,`)91RT-b)KI犥RdyV?8̦dj?`? kj?`? ?>Ȇmml4 [{L.{6aȆA, m,6 LLmcl| X XN680|9lܽG֍j˱dC=rc.WXm,'2XXN6d ^7C6c+[jb{Z+  !cp+j+dC6V@+6V`+Ȇ+j+d#aKLNOc%x͍5oCؕj+dCJ؋TXm$2쌑1~Ckc%l|NY mTXm"c"cXUjUdC*؋RXm"2_UjUdC6VA6VaƘߤX-հXXM6d ދjj!cujNYXM6d o6Vm6֐Bgםobk~5!c֍5jk5dCuc k6`kȆhclc-HLfbkصp Vmc-lX jkdCuc-k6bkɆ{ѵZ:Qvɭ=i넍u:u:!c֍uj밍udCupNmcln6֩m6֓G}3X/l6֫m6֓  16;Ȝ+U z!cuzNYXO6d o6֫m66e=2 ):elcِ1AmclF3?OdZ dCucAmclWtcaبH6d olFF!c~c#76ml66 p#Qmc#ltTc ؤ D6d װ66aȆMؤ D6d >l66ml66o_lbl66C66cɆml66ml66  mlV،ml&2j-dcY/L-hclc ِ1x[6`[Ȇml6ml6 ׍--VqȌ]&[E/[6b[Ɇml6ml6 }m{_[6b[Ɇ{ѭV6'koƙD6m6!c9eSml6 ׍mnlS؆ml#2۠mj۰dRcMv~vlc;ِ1vv!cuvNٮN6d nc;]mc;lLsi#4vfL~nlcِ1v\P؁m 2;`ءA6d ncCmclOp3Q&N1sNN!c$1Z;dCNoT؉m$27vB;6vbFuSZ41v9mw{v (٥ E6d ^7vKmclnuc.lcِ1vKmclTwMbSvm6v ìSb16|tvZdC\ws6vcɆnhcn ͙1oޚ3I?¯]x]ֈ~;0O.^y&GxTw\<%˽GG=׃=t*PCo4Ez}[G}za:c8\fp_:؃r cb+E`1xأK6>x{ cӆ^zY]j{dC}^X#m6  mU؋m%2gg/Wmc݆/w__z߆q|c-c,c?YZY[ƎXƎZƎYƎ[NXNZNYN[XZY[.X.Z.Y~]]]]]ݰbie>q~>!pOO]j~5n8u>uۇk>q2O]o?>˄&~ Ӕ'd~lc?ِ16cɆm6m6 Fjdcwm&>kbo!c$a-akm6 8mP8m 2@6`?gc ِ16~6~"2OOdC6~6~R 8H6<ӥC/㠨a8q8H6d n qPm qlAhAl ِ1xq8q8D6Zݨ8$l6m6 ? >R8m"2ߛ=wm6 8mR8m&WҸqXSuaa!cq֍jdC{1^aa!cpj#dvw51~7m6 8mQ8m!2|lِ1:qDmqld+{㨘S9Ql(ِ1(\U8m%2q8q8J6d n(qTm(qlԙo\&1aqLmqlnu1lِ1x/z 6aȆc1cq1;Džqq!cpǡjDZdCqoW8m'2ǡjDZdx E:'D/z'6N`'Ȇ)': lِ1x8  !c It߷71N^$EOm6N ׍nT8m$27N~Il$ِ1x8 mT8m"δqJ8mR8m"2EO^)lِ1r )6NaȆK<mR8m&]ZWhkbioV8m&2a8q8M6d n4qZm4qlihil UkxG |Gl ِ1aÜQ8m!2 3jg3dC6@g6`g;8+YX7Ϊm6Β ga/zVm,qlnuYl,ِ1Y9|uF-Ls9h9lِ1s9s9!cp砍sj簍sdC砍sj簍dC~k631 硍j籍dCy؋W8m'2q8q8O6d N9mW8m\ +,qAɽ^P۸m\ 2E/^lِ1\^P۸m\ 2qڸq۸H68vEE!cq֍jdC6.B6.bɆ@6.m\6. WOƙľ%/zImqln\u%lِ1K%K%!cq ڸqnqgsɭ}:j?E';[3?lw`.]Y>[ƾXsjƹ-;\u-~'v";56qmL綺568Faot[]nwjbnw[]nxMlِ1ww6`wȆ{;7q۸C6d >݁6m6 I'Dw7xoU۸m%2߿ m6 ׍nU۸m%2ߋ mU۸m#F6Qĸ'{oq۸G6d >܃s={=!c<܃yq۸G6d ^7A6aŸ hbw04)m6 )r_m>ql|Mum6 ߇6m6 &q<@mln#G#!cpGj_tL_E֍_6~6~%2+ƯƯdC6~6~UlƯƯjb8Nj &cQ7úXm1lchcl1ِ1cc!c~1Xm1l)㉰xxB6d n Dm lx'jO'dCk''SQO219)Sm<6 x mkاjOdCu)Tm)l 5x& ~3lِ1g3g3!c9Sm<6 Ϡgjϰdc 7>&s1%#^%913K$2+^B/6^bƪ3=31^1_m6^ ?{Rxm"2#^jJml+h+l5x׈"&ka5Zm5lID t&kl5ِ1koZm5lkhkl ߾g量&a Fm l|o6`oȆm6ިm6ސ i6ިm6ޒUR'11 ojodCH"bVm-l[h[l-ِ1[h[lw1+yy^&mmN6d ދ{6~6~'2i;;ِ1x]mwlgW!㝰xxG6d ~^ ׍O'Ogh=sE6>cɆ9~sgl3ِ1x gg!cB6^fuΩY7L1B6ll ِ1;;_;;_6`_Ȇm|6m|6 ?km|Qb>$pw<ZY\,c-cI,cI-c,c-c),c)-c,c-ci,ci-c,c-c,c-c,c-cY,cY-c,c-c9,c9-c,c-c<.>_/g3f}@$ouaTwbhko|#b=.hOָ.)׸.c/!hI-YL.7Jzj dC}sB7'THm$$2ߧKm$6 F j DdcqI2f61D.h?F"l#ِ1xg 쟅MHD6d n#Hm#lF"h#F"lÅl܊;cFEp6\6\ !c놋چ B6d >9Emp!2S\  l#1pp"XH m$VHm$&2HHL6d $VHm$&2HHB6;jHgb$qI6`IȆ$jI$dC$.hDm# lFh#Fl#)٘fTIa/Tm#)l=.=jIdC6BI6bIɆm$6m$6#߼H&l$6m$6 ׍dn$SHm$#2 H HF6d Hnq+9HFs.92E$0O.ٺArv߽frQ\}ᄍxJvγu=Oq=HARnf%7Rzփ껟׃te c=f  2)`=H׃$B Bm#l Riʻ&FJc=fJFJ!cp)j)dC돔pRm#%lFJh#FJl#س?G$&F* RHm"2#R#F*l#ِ1E*8RHm"2/1Jm#l|Hx:# vijjdC6RC6RcɆFjX7Rm6R w6Rm6ҐtH#4HHC6d n# Fm# lFh#Fl# ِ1HHK6:z&FZߙDҪm6Ғ H mUHm%2E^4FZl#-ِ1FZF:>?鄍tF:tF:!c^4Eөm6ґ ׍tnSHm#2SA6a"_}21һwӻwӫm6ғ HmWHm'2>_MHO6d n#=^m#=lO2G#72~#Fl#ِ1)62`Ȇ pNɠ@6d n#Am#l8q]`bdt)慈d"UFFF!cpjdC62B62bɆװjLdcNEKabdkLp Im#lZ& -F&l#ِ1LF&LF&!c^4Im#l\؃31232]jdCu#362cɆ2ýjdCsJfh#Ffl# |•oM,,jY,dCeeQȂmd!2Y`ȢB6d = Em# lЯ11 ~'0FVl#+ِ1x FVFV!c5lVͪJ6d ?&Um#+l|Llb#Ȧ F6d ~ <[Mm#l| amd6 ٠ljٰdc41֍jٱdCu#;6cɆFvX7md6 )١jٱd%_9DFF!copAʡA6d oFF!cȡI6lEs SEܜj9dCgrs396rb9Ɇ甜pNɩI6d N mTȉm"&F.Q7rKm#lIr)ٰ-rm6r as5l.\F.!cp\jdcO{>61r jdCSr)6rcɆFnX7rm6r j W:LKL W 7\6\ W!cpІچ+J6d ^7\apUp6\Ɇ+᪶m!E&,Gԍ0>22V2n+hyZƼ,cޖ1˘eee2V2o ZƊ[JXJZƂ,c,cXiXee,߇qG]M87X5 87q2禮qnƹQ1xo{#7us5΍j{#7X5^򑍄 ׾Fγu\)|j"{];0O};/|껟~Ss.<y=w= l-C/a=ȯq=Ow_=O~W;ȏA~r cut~ί׃$B ?_m#?Ql4̶\&Fq :[W@mQlFhFlِ1Z6 `ȆF؆;٘rd&XGuچ;N6d G>]mp'2mmcdChwh]m(H6njk&FA1sJAFA!c߻,~ﲠFAl ِ1R)6 bɆm6 m6#^51<ę\mzmx`dC<`顶mx 6<6< !c~P6 LJ\61 Q֍BjBdCu6 aȆm6 m6 (mR(mxN{zy[66 o!c :o;U olÛlnxú᭶mx )Іچ7C6Jo>چC6d kX lÇl܆᣶m S|  l×ltuW6|6| _!cuJ3Ffz}Ck%2S|⫶m 6|6|dc]C21 jdCFaoV(m&2_jdCFahFalxeK'L"b_-Q(B6d ~F<#SDmQl|N)"jE"dCsJhFlÏl:0|Y&mma~dCu ? ?lÏl܆᧶m 66dY651 EjEdCu(E6bEɆm6m6 )EjE A_?bb Іچ?O6d g6 !c~j؆?ِ1x66qmV&FjFِ1l#ljF@6d ^7lċc?ķoS(m#2Q (Q (F6d -װ6aȆA6adv=b װjF ِ1@h#Pm#$27am oBjFqa!L,qtFql8ِ1FqFq!c~87m6 )šjűdLcbh ؋P(m 2Q(Q(A6d ^7JQBmQln6Jm6J$J(|Fo6K fuIFI!cp%j%dC6JB%6Jb%Ɇ)%j% >L o~#Hm#"2maAdC6 l#l|N 66RdhbraRdaRjRdC}}R(m"2_ÖkRjRdCsJ)hF) `s&v>S+̙`X-""{W0?œI !X}w\<%xr癤`xσ<׃ov"zc~!te ^B`=Q; |"B"Bp=!2+Bl4(PT[Lb4,Q(M6d c5Fil4ِ1\Q6JcɆm6Jm6BFdb3jF(ِ1sP$Tm#%2߷jF(ِ1Ph#Tm#(C6?ppQF)eRFm QlnuFl ِ1R)e6`eȆ@e6`ad֛a;a.;ajaFِ10h#Lm# #2Sm [Aajavᆲw~EmǷ8ʺᖱr JʖXXUX5XuX XMXe,2V2V2V2mkgok`khkdZ,c.KYqy7ʊ,ʪk\Y\R1,\SU׸ƕ'c,ʪk\Y\R1WָWd#\_61E.,FF8N6d ~.\16±p!c)EZF8ِ1mmc zXebuOF9lِ1xoTNF2F9lِ1xoTNF2F9lِ1QNmQl\y;&Fyq& ?4ʫm6ʓ +/Z屍dCsJy1Z屍dC6C6cFĨ FX7*mT6* ׍ nTPۨmT 2`ݨQۨ@6d >T6*mT6*}UĨ(ߨQۨH6d c#a#կ$*FEl"ِ1>]EO'chmT6* jJdc˗DݨF%JF%!c*d JF%!c9S*mT6* ׍JF%JFeq G$MFehFel2ِ1U['chmT6* a#Aa&F}&T6mT6nf%5Ĩ\ÚQl4[7frXUm*Ql|_16bUɆmT6mT6 )UjUjdcC7z11Q ֍jjհjdCgr32F5lِ1\VSۨmT#2/QMmQlԀsJ F !c9QCmQl9vQl$HVm5ƏWdXSm&QlnԄuFMl&ِ1FMFM!c^&QSm&I6ZT#RԍHX7"6"H!c5l$\FmDbdC6"HHl#lyJ$mDu4ĈrSLE6l((l#l|)QjQFِ1(h#Jm# ۈ"2mDmDaFv$Ekm6j ׍ZnRۨm"2Ek^F-lِ1xQ ڨQ ۨM6O2Ĩ-~_ }mQ[m6QlnԆuFml6ِ1xݨ FmFm!cQڨQnqȫHOw5EԱ0O{_uyq:vՁO~7O.}Ձ GvnkE"A4} V; |sEZD4$Bhh#Zm#ۨK65Q= +C]F]!ci]6QۨK6d n.QWm.QlF]hF]l(ΣMz]z.]zjzdC=f=cSۨm#2/Im6 zjdc}Ĩ/F}X7m6 ׍nWۨm'2QڨQۨO6d ^ڨQh@6vVq@hm4Phm4 2hh@6d n@mрl|hhH6Mea&FCы6hCFC!cp j dCkӆpmPm!ѐlFCF#pmCLFn4uF#lِ1YFpHmшlF#hF#lِ1xhۈ!n+;Ĉu#֍l#lhF C6d >9%Fm#ۈ!2_@1j1F,X9VMXNXXl#l|#oĪmbdC6bXXl#lnBjFxp6M8|5>_Sۈ6Ȇ8oĩmaqdCsJS6Ⰽ8!cmĩmad#61Ŝxxl#lnúmē ׍xX76ⱍx!cpFF<јlu8ycE^Fcl1ِ1xh FcG}nGE/w3轏kBDHDA:3ލΘQF~qf-s_gY9繎w7lِ1F`3g nWW?U nF7!c1Mm݆|at';pw9RayYj=-^RcYj-6RYj-5?KRb ԆYj-HK-ReƸ|wqgNK3ur;=8wq2f>qǹS1tqU ms=ΝzbasW8w66d#A=nOcTm$2=wdzm6z  mTm$2詶E6-&F/qH/~KmыlF/hF/lِ1>]mg UZZ^dCs^F/^؆7Z±lbxoj؆7ِ1 oh[m&2 mxmxcdC oh[mM66|y_sL1}7و^j\OFol7ِ1FoFo!csT716R8rCk7ћl|L mVm!Ogcb}}6`}Ȇ}\Flِ1opp6hpbhm6 >F>F_Q,K&F_qH_}j}dC}w#m6 Ì)FYbhm6 7B}6m8^G6wnO-]qW_ޭǏ~j̏'e?|cR^~o~܍׼?]?Ux_?GA2G?91i${*VDFq=Q\Mbbܷ1@6d nc1@mc1lhclcِ1{L dclÇldkq9{#>p᣶m 6|6| !c}w|6| !cy᣶m $m\}1P{6bɆK(K16bɆM6Pmc 1lݺ@؆/وxP\WW|7}7Wm%2FbD%Iچ/K6d 7|aU6|ɆצІچ/1lTDgcطW"6aȆǔApL1D6d MAN2 lcِ1A A`cHH!c1e$SFm6F EGB#6Fbd#}}#l#lFm 76!cpFF1lILQ(hc(lcِ1Q(Q(!c1 QjQdCsQ(Qh1^Υ\t4Vm&2otpp؈z_m&211M6d hhchlc ٸucD1!c11jc1dC6@c6`cȆǔ11vàa{>LkԂ,`KmbM&ZjZ6R &[jS,4K-RnEZj3,(Km6RmE[j1K-Rkͳ|@qk:g[]г{\ 8(c1=.@q2q{\ qd =.P7l8jT+m낞m1K6d 3ŌUm%211K6d >6ƪm6Ƒ z1NqoSm#211G6d nc1Nmc1l|M51"; 61D}#Hm#"27ysFD6d R|)Hm#"2mmad#ю3V713.``l#lF0m 66`!c{FF݆%d#a O0֍bZx;8߭߿v0xkW_o~܍)?x5A]헕;^ q1Cէ}] !pvA91x?"B"Bp?!2_@!j!iE*6Amc1lhclcِ1ss6&`Ȇf'@6&`/uhbLt0N$6&bɆIF8N6d >ppl#l|L 66±d#GG6Mdhcdlc2ِ1dd!c5d1ۘL6d nc21Ymc21l?Z&)!c$1)jS)dCc8LQۘmL!2ߘmLQۘmL%R01T81ۘJ6d N )S6bSɆ7jSdCT4q}Ļu\лu6aȆ):e4lcِ1xߘ4i4!c1e1MmcA6R!FjFِ1x߈}#Bm#ۈ 2oDFFA6d n#ڈPۈ6.R/lbLsp.:]mc:1l|17mL6 oLWۘmL'2SC6cd#ނ&Fx.#iTۈ6"ɆF$jF$ِ1Hh#Rm#ۈ$2 mDmDb3ƮJ]ob}c36f`3ȆX@gPۘm 2?Wjߘs6`sȆ7m6 )s9jsX17{3F,mĒ ۈ6b6bX!cF,oĪmbdC6bXXlc.ٸd21:杤dv\\!coͅUۘm%2saߘ1ۘK6d ~\hc\ 1;IrL}̓yj"̏5|kO9uy?~͏Z=5p?O׼,/7~0?te >V̇`>91X11$Bp;c 6m8}Yչ/^08\{>GR[h-[jK,2KmR[iV[jk,:KmRhdm6[j[,-6KmRivUsu_8X=.8q2qqũ{\qqd 8u=.z\G;cqqx'>sZ#^|6}6^m#ۈ'2pF<O6d >/^m#ۈ'2Cjz?T&^ 6` Ȇfj dC6@ 6` Ȇm,6m,6nkXэ4w 7Sm,6 ) ᘲPmc!l|m,6 Xm,TXm,"EpEHmcl"hc"lcِ1|co,RXm,"2a#4cw'ީ.chm,6-_51 jdC].].VXm,&2XXL6d c#3F mZ%dy>ݒK:e \,QXm,!2K`XXB6d nc Dmc l1ИDmc l0&Rac)Tmc)lri)ٰ-m,6 E¹RR!cpKjKed}#X&):e2lcِ1xX2e2!cgVgVm,6 ᰑ3s7Z˰dc[Lb7m,6 ᰑd&*rlc9ِ1:e9\,WXm,'2Zr q}f>& 7VBmcl|cXXA6d >c  !c{?+j+dۥX)l6Vm6V X mTXm$2XXI6d >X mTXm"_nX%ޭ[ޭ[ XE6d >X6VaȆm6Vm6V 7V*Uj1~ߛ:e5\VXm&2XXM6d nc5Zmc5lo}cjlc ٠ߙkĘ)k6`kȆm6֨m6֐ E5!chclc-HE[kEX ZZ!cpkjkdC6Bk6bkɆA6tp0Vg*ZlchXsLu:hc:lcِ1u:u:!cupc:lcِ1LhuiY_Xm'~᥉^Eùzz!c3@3@֫m6֓ 7zz!c /֓ ۇ/֫m66Gn~nbl pAmcl| a7ml66 )AmclfLᰑa*lc#٠'lFF!c1e#S6ml66 mlT؈ml$2a㹛ϋ~Ckc#٨ثNo&OOOj?a? `Im'l'!c??mmD6d c3ƿ6}Ck'lccMM~&x?e&lcِ166aȆ|c&lcِ1M&MflYKKYmc3l|.E7ml66 )ᘲYmc3lpcf K^[F{_[dZx/m-vǓn7?~˻u[5ߢ[p?yu70~vf:3]}tgِ39 Y?@zcbl{^vv!cj۱dCp]mc;lv҉׭n;}A6lCP؁m 2o|olcِ1!c1eCmcl4Si{Z;6vb;ɆN7vm6v  mT؉m$2;j;]dcoT7L].hc.lcِ16vaȆ|c.lcِ1.hc.lc78Mb7vm6v i{Z6vcɆn7vm6v yحnq>ů·#̎=.=cRoZj,Ö/KvRR;nNZjYj,ӖKvR;o].Zj,˖KvRnaPK>cCW_=bǿ==dlٿzmٿGzǿ=pۣq{pC=N=Q=xK6j-cثK6d ~/x/߫K6d >^^!cp{j{}dcԚ͞c..]S؇m#27}j}dC}c6aȆm6m6&r/~7m6 ?'>'_mc?l|?߯O6d mW؏m /ux8 Tlِ1̘a86bɆm6m6 8mT8m"8$!7m6 CoR8m"2|!lِ1^!h!l0XVx妧LyyjdCaa!cuaN9q8L6d a/dNм+N mmB6d ݺ_w~Ql//j` )@mm![0188q8B6d 7qDmqlhlِ1:qDmqlt]GQQ!cpGjGdC6BG6bGɆQhQl٘= }О&1186aȆm6m6 C1c1!cpǠcjǰ_ƙ3cqq!cqhqlh؁;hbprBmqlYYj'dC6N@'6N`'Ȇװ'j'dcvG01N:0Ia4j'dCSN)'6Nb'Ɇm6Nm6N }6NmpH[[]q߭ fw`~ĸ(;/΋jdC]]T۸m\$2^sыjdC{ZjKdڦ6E/^R۸m\"2FbFٰq ۸D6d >߸6.aȆ)Kjd#k%6E߸ ee!cqjdC}26.cɆǔeњ018| p =ɾqEm qlY+Y+jW+dC{_W+!c{hW+jWdcZܛ2֘WE߸ UU!cuUNq۸J6d >\cUU!c8۳@6m\6__kqMa55k5!cuJWg 6aȆװ5lِ1r ڸq ۸N6UfJ㺸rOq۸N6d 7þq]m:qluhul:ِ1rڸqlq|YjS~cjc ;|w߱Ɇjc ߡ6~0=iݲn[jw,=KRR{hie=[jO,ߖ3KR{i^[jo,;KRh}>|\:2q7`q7pA=Np}Cnwz{ n{ nP1ww7BgMb|Λom6n ⌑$MM!c5Mq۸I6d ~_&qSm&qlw<`b6nA6naȆYYq ۸E6d >oͷ6naȆm܂6nm6n/9`q[|G mm!coom6n ۸ mV۸m&27߆6nm6 [\&7qGmql|q7m6 )wrGmql|qڸq۸K6V;6Mb.zEm6 ۸ mU۸m%2qڸq۸K6d n.qWm.ql[SN<`߸q۸G6d >߸6aȆm܃6m6 ?Opڸq۸O6~|ĸ/l܇6m6 އ{6cɆװ}l>ِ1|>q_m>ltmKҪsLbLyǔjdC}6`Ȇ\lِ1:@m݆%?F?knpuZv]}8CIُWu[ o~܍xukC)jP􃇰V<"EV NJ?66$2G m'18U3LĞ_pKm/l/!cpAmmE6d n/h/ȆAmm<"Hib<}6aȆ-#G#!cpGjGdC}Hml̽nwX| cc!cwdwdm<6 7cc!cxxB6u=8x"={={xB6d >jbhm6ސ 77!cxxK6wNM[h[l-ِ1xx [[!cjodC[;A'21މwp;lِ1wSxm#2`xxG6d 7A6aƉ-.g01 jﱍdC}=6cɆ{7ޫm6ޓ 7C6cȆw~FĘ)6>`Ȇee@6d !cpjd31> jdC}#6>bɆG7>m|6> m|Tm|"eĘ )6>aȆ>OjOdC}6>aȆ}6>m|6> ob|}36>cɆg7>m|6>  m|Vm|&2j6_O0 \{GBK-bZj-$ZRK-RsRXj)-TZjK-RKg2Xj-o,LZfK-RferXj9-o-\=/Mq3_9_'q%pE=NIύ?:q \w9u 8%$T[ЕύQBFB!cg[g[m$6 Hm$THm$$2%6m$p䕈l$jOݺDPD"Dv]/%$;0?wH}ٯq7Owp8<.tWMsqaW4vQ_}\|J.j.χ]\|E-!c}{hEmp%.z׹*p᪶m ?ꊞgvUp6\Ɇ W-\6\ W!c] W Wl#1p<8Xİo$VHm$&2aHHL6d ~bWtbFb!cyDbh#Fbl# pL}L$o$}#Fl# ِ1I\I6`IȆ1}c(Fl# ِ1HHJ6b821 IjIdC6BI6bIɆǔpLIHJ6d 7BI6bƅjib$cJ28$SHm$#2߷H-m$6 )Lm#l|o6Lm#ldܕ?Ϝ=Ϝ\m#9lFrh#Frl#9ِ1:%9\$WHm$'2Hp#p} 7 7lÍl܆ᦶm ?_択/rSp6ȆnІچlLB7RF F !cp+F l#ِ1|#oPHm 2)j)dp 5MFJh#FJl#%ِ1\4%THm$2HHI6d 7RB)6RbFdu51R9Ȇq6RaȆǔTpLI HE6d >H6RaȆm6Rm6Rjgb}#56RcɆm6Rm6R 7RFjFj!c5ljh#Fjl# Q~evL4N楶4dxâi6`iȆǔ4pLIHC6d >cJ4F!cHHK66;H+)i:%FZl#-ِ1xH FZFZ!cpijidC6Bi6bƳҶ7197CȆtj鰍tdC6A6aȆǔtpLIHG6d >6ҩm6ғyrH/IHHO6d ~-=ז^m#=l|.Eӫm6ғ FzF8PHk#sLq? d3ҲğF F!c{= j dC}#62`ȆFh#Fl##Xso悭Lb72md62 )ᘒQm##lFFh#FFl##ِ1xmdTȈm|C6n:Nhab|#l|m| ِ1I` ooȆm|m| ِ1oo662{TImdRȄmd"2`Ȥ D6d >62aȆmdRȄmd&헕;^Y mdVȌmd&2?$+:$Ffl#3ِ1x FfFf!cFfh#Ffl# ٘*IML,Fh#Fl# ِ1WEm# l|# ȢB6d 7@Y6`You.>}*ְY6FVl#+ِ1.ϲmd6  mdUȊmd%2')+Um#+ltzl~J6lF6!clp#F6l#ِ1|#odSȆmd#2f6mdpݼ^{_١j"̏ :I ʮvxR_I;Cvn؏'s~+;<;9jĭC#ryDρA2_j9p?Ad >V"rE 1x?mPȁm$GثS#ryDNFN!cyD'g !96rb9Ɇm6rm6r  mTȉm|K6{|d-[1ߪm|m|K6d ?Uloߪm|m|K6d 6Vm[l#٨mO5M\F.h#F.l#ِ1 )6raȆF.7rm6r ? ȥnq˺9E 8#||F~'M}:{~aK~F~!cv~ίO6d n#?_m#?lF~h#F~l٘4S 1Flِ1R)6 `ȆǔpL)Q(@6d S(Q(H6.U~Y9s.j>PlܺRPm Ql|RS m6 ?CR>CRPm QlFAhFAl&?3S)Q(D6d >(6 aȆF!7 m6 (mR(m&Rx51 ;mQlnV(m&2a(Q(L6d n0QXm0Ql|Q(Q(B6&~jWio"jE"dC}E6`EȆm6m6 (mQ(m%G욟QT[[Tm(QlFQhFQl(ِ1:(\U(m%2S(Q(F6;JQ(&E}bjŰbdCkbp [LmQlo}F1lِ1x(mS(m'5|+sjűdCpQ\m8Ql|RSm6 FqF ϜM&F aQBmQlF hF lِ1x(F F !c=F FIZMFIhFIl$ِ1WIURm$QlFIhFIl$ِ1R(Q(E6^8>V(%SJm6J RoR(m"2SJ1F)lِ1F)hF)l4(x¶QZ( mV(m&2a(Q(M6d 7JþQZm4Qlo6Jm6ʐ1Cc31ʈuJN)Q(C6d N))e6`eȆF7ʨm6ʐ (mQ(m%K4(9QV7FYFY!cuE-Q(K6d sYsYFY!cuJYhFYl;q[;a;h;ﰍȆ{_ߩm|m|G6d >|ǔ66#2;h;6/y}oޭ3/y}y{({"̏|{#W;xR_ޭ^W{7?~{5rt;q;cNCGr_rte >(~P"ʩE1<QNmQl8>(/l6ʫm6ʓ %V%V^mĨ"*jU*dC6@U6`UȆU|Fl ِ1\ QEm QlPiLoT}FUl*ِ1R)U6bUɆU|FUl*ِ1FUF5ŵmj`ߨQ ۨF6d nQMmQlwmT6 ?S ڨQ ۨN6#jCJaߨQۨN6d c3F l[ZձdCЪ{h6cɆաj6\0agv԰QReնXju-zZ}KRkd5ԚXj?ZjM-fZsKRkeXjm-vZ{KRduԺXj]-najPBiRN5W5=q5|ǿWd T5=q5|{\ uǿd}5Ϟ7j 56jb5ɆmԄ6jm6j j5UMFM!ckB56jbF_4%QKRۨm"2Q ڨQ ۨE6d 7jQKmQl|nT ڨQ ۨM6ⲕ?Q7џFmQ4OVۨm&2߯ km6j ۨ mVۨm&2_o׆6jm6ꐍ |ƺuDߨF:F!cQ:ju:dC6@u6`uȆǔ:F:F]y˩uAuAu6buɆmԅ6m6 ԅ{1u6buɆF]hF]l٠ӭ:\Sۨm#2QڨQۨG6d [Sۨm#2_ԃ6m6꓍b6C6cɆԇ~m6 SuJ}F}!cpjdX|? FF!cm46 o4Phm4 2S@ 6` Fҧ4`b4sцp.Pm!ѐl|Liǔj dCsцp.Pm!ѐl|.hhD6jU{pi;`hhD6d nHmшlF#hF#lِ1F#hF#l1٠&Fc7þXm1јl|Li ǔjdC6C6cɆǔFcFrG&F=csQ ۋM6`MȆF7m46 7F&F!cpM&jM6/yhޭ ߭v"~0?ݺɁcfEq̏'ɜ?wc?ݺ5Q})]CKk*M<7)]}4U;hASr c~h$B)Tm)ьl?ig&F3qG3xG3fF3!c}ۖ6aȆm46m46 hm4Shm4'38>kb4Ϟ5Ϟ5Whm4'26rsmjͱdCsp\m9ќlFshFslٸ8hF ad F !c16ץ*W16Z`-Ȇm6Zm6Z M[@-6Z`-Fu#-|%oThm$2 o [m6Z Ck Thm$2?ۣ%Rm%ъltTݣ?MVF+hF+lِ1@y6ZaȆF+7Zm6Z VF+VFk1@hhM6d ~\kx\kFk!cpjdCFkFq6^ΥL6FhFl ِ16F6F!cuJNihC6d 7@m6`mF?uob딶pVm-іl|7ڪm6ڒ oUhm%2mjmvdIКwMvo}F;lِ1vF;vF;!cvjvdCWA6a3LξaɆ9"<$F{l=ِ1h{/^m=ўlo}F{l=ِ1h@6)AotPmt 2~|~Flِ1\vPmt 2S:@6:`,UQy#Fgl3ِ1FgFg!cFg8謶L6d n3Ym3хllLj]`袶B6d n Em хlFhFl ِ1yhFl+xС7̻]s7﫫˾Um+ѕlFWhFWl+ِ1+\vUmt%2]j]nd(61 njݰndC6A6aȆ|F7lِ1F7hF70a{>KRnԼ,Z/KRmZj,KRhZj,o ԆZj,Km`F[jc,øSGy]̛]qs'cwqǹS1X ,wus=Νz{;q?YC~<6< !c㡶mx ϛ=Cm 2mxmx`dzϘgL$=6< O!c{ƞ𞱧چ'I6d 7S&Fw1o6cɆFw7mt6 5UwFw!cpݡjݱdMi!l6zm6z #1z Cmуl|Mzm6z 衶"Wx]z76 /!c\o{mxa^dCcS6 /!c{?^Іچ݆%:wݺ[Tia~ݺMǿ|Z=̏'eϿ[=Wwc?ݺT_kj}>dC>pGmчl|裶K6޴x ;m6  mUm%2諶K6d 7B}6b ~fO~oSm#2觶G6d nOmяl|觶O6{Mo}Fl?ِ1FF!ch8O6d n?_m?1l֮&qx!c81@6d >6`Ȇ@6`>d~xGv>†᣶m 6|6| !c1)>j>؆ِ1 hGmH6]y;co jdC6B6bɆm 6m 6 EB6bd[cio31|9}_ _l×l_̎چ/K6d >1Wm%2oBj 34vA& g>Rm "2`1D6d >碃6aȆǔA A`q` 7 ہN6cɆ`7m 6 o Vm &211# L ?1 ? ?lÏl| װ~j~؆ِ1 ?hOm#2mmadg?db;s˟lnmcdC6  lßl|Lcچ?O6d gmmcCF:zM!o }clcِ1!!!cpC!jC!dC}c1Dmc1lIL wJ6n./Fq1Tmc(1ljCdC6BC6bCɆPhcPlcyT֚9\96a̓]"`1 f1|co Sm 3O{| ; 1 N6i3jcsbp${˾1\mc81lphcplc8ِ1xpp!cpájñdc$[eb{#!cpclcِ1!chclc$T;+Ḻ̱j#dC}c$#6Fb#Ɇm6Fm6F 6Fm6 ^fb{}F@6d 6!cpFF@6d >@j(QܜJ1F5(1 E6dĬ}"5Jmc1l(hc(lcِ1Q(Qh᝷߰M~hx?ehlc4ِ12)6FcɆm6Fm6F aGC6Fm8^cְ5@c"Ewe?Nr`;qI$wǨ7?~;Ic5cq˺9ZkԂ,`KmbM&ZjZ6R &[jS,4K-RnEZj3,(Km6RmE[j1K-Rkͳ[} ucW(Ƶ@],kd >q-PHLg3x՝-kd >qx3ldOuĴ8cjcdC0.U^SW16bcɆ= GjcdCX8xpy&86Sm#2`1G6d >6aȆm6Ʃm6Fq-51Ęǔ l#l~_m  76 !c h#Hm#&'_;21E}#Xm#&2 ojF0ِ1`x/Xm#&2FF01lW?Q1^oWm'2S1exlc<ِ1xx!cxF٨7UnM1 sl#lFm   Q6BȆ)!FF1lux&7&1Amc1l;wr'mL6& a'5 !c1e1Amc1l*]4K1Q7&DD!c&&mL6& )2Qmc"1l|.:ژ1%Fib FF(J6d n#U6BɆ)pm 6B6B0Qx妧"L0100l#l|)ajaFِ1FS6ȆaFF1l1I<< >Ĉ6"HHl#lF$mD H7"6"H!cF$m W51f1eSfm6f ۘmPۘm 23`ߘ1ۘA6d 7f@36f`QdpJӏ11ĻuQݺ((l#l|# oDmDaQdC6((l#lFm$.R/<Ę))3:eLlc&ِ1xߘ LL!c1e&Sfm6f ۘ mTۘm"4 01f}YjYdC6fA6faȆ,7fm6f agA6fm8^mޭm^rw[7ۼuiYb`Zl? ;9v0xR˻ul՟m؏'s[7^k>h[<\:Ћsh8njV_h| jѸDh"q?&2_DCjF xyߘ&Fӆy(lS#b6b!cK mF C6d n#ڈQۈ6bȆm@1j1QsM9ó}clcِ11ljdCsp.:_mc>1l|va.|˿23;,x[j ,"KmR[j-Ԗ[j+,*KmR[k[j,O&KmRRjmԶ[j;,.Km|8qB*?us͚G=x5Np'c$f[ql[q{\8/{\8ύ`S8<œɽ31ż9Λ6ⱍx!csjF<ِ1*6ⱍx!cQ<m, :fb,}c 6` ȆT jlcِ1 6` Ȇ,6m,6T&]61yB8o^XH6d nc!Pmc!lo,}cBlc!ِ1XXD6 X$/m,6 wwHmcl|/f܋YXD6d ncHmcl8>J1X,|cblc1ِ1xX bb!c1e1Sm,6 7C6cKƞNkX"}%jK%dC6@K6`KȆb%jKzoMm75jѪWMRWRj-+="!!Ek?Zוy|hw׹y>絍l6hc6lÍlM 7X76ܰ 7!cpnІچF6d o~Mm p#2mmaFUR41^t;Eml6 a]mc;lnlucvlc;ِ1:e;]mc;N6FV&^~m  wX76ܱ w!c^j؆;ِ1 wh]m z}}f>چA6d |GCm 2?s9桶mx )Іچl|st11vwvwvm6v ׍nP؁m 2Sv9elcِ1sNQ|ʝy:;E;6vb;ɆةI6d >sNN!c9e'Smc'lqaa^E6L/R؅m"2 >O٥ E6d N)6vaȆvA6va&noV؍m&27v~cnlc7ِ1)6vcɆnhcnlcٸ{B M=^C6Jf9XoxI=!c֍=j{=dC6@{6`{ȆhclÓldwlM OQ7\%.;]^v>_|ʿ5b^s/H8(^7O.|`ɟek'W>\ݗ1xzES؇>!c}}>}~q--Lbb?ܷدO6d ~~~!cpjdC}~hc~lËl86Q=qsK5511m6 !b$16`Ȇm6m6 )jdcbJݏ661q֍jdCu 6bɆm6m6 õcb 6bƑξ8$!X7m6 ]]16l*R8m"2_kCjCdCuqHmqluԑ M9aal0ِ1aoqXm0qlahal0ِ1xq8q8B6ʕtqDԍ#nQ8m!2y#9H9q8B6d >s#!cq8q8J6I>II!cp'j'dC6NB'6NbdcDžU71a6 o!c9)j؆7ِ1x o olÛl6664agvX𵌝]Y.Z-c,c@Xe,2v2bb YƮZƮY-c-c7,c7-c[Hm0>T4S5G>pQ8\|磮q>P1^܋Q8\||5G]|K62zWW6|6| _!c_㫶m 6|6| _!cU6Nq*flbr=4 [h6NaȆm6Nm6N ͧ`|Jmqln6Nm6N :ݪqZͧa|Zm4ql|N9 jdCu46NcɆY= mV8m!fuX8#<hy㬨ga8q8K6d n,qVm,ql|}Ϫm6Β 8 mU8m# 5?qȆ9s9!c9SΩm6Α 8mS8m#2SA6aƘE11΋ ó ϫm6Γ 8mW8m'2E^yl<ِ1x8mW8m\ \ĸ q۸@6d >\s !cp j dC6.@6.`~dIV41S6ȆmA~j~؆ِ1? ?lÏl|N666y]4Eqz"xz`Įg.E\0OnE8\T;hw`."\\To.]߭E=?~=۵)f?\?te ^a=W;z?1\mmc.bb\r%{wEeyImqlǼk%K%!cpKjKdCKjC&F#`m C! P6Ȇ{cm`dC}Dmt(@8mbdCw6@!cpFF H6d n#T6F{[Wob AFFD6d o~#Hm#"2mmaAdCsJmǖ)w݃6`!c8D -F0L6d $N6`!c^4V6.KEq6.cɆeX7.m\6. a/zYm2ql|N m\V۸m9[mbFFB6d Mn&7Dm#!2!nm`!dC6Bl ٠A.㊰qڸq۸B6d N)W6`WȆ+߸q۸B6d o\6m\6BAG-ab9%)jF(ِ17PPl#l|N sJF(J6d ^7BPPl#l;L;{hXee,222g{d{l{b==i{n{a{i2eeeeee{G0QT[dS荢`oqQEQ1(u5.jk\qQk\8FQEk\} qG|wy~wyGmql|;jw;dC{1w^;!cpw;jwdޯmNlb{1w^]]!cq֍jwdCu.w6bwɆ{]vΏDx;/mݽdqEܳ0O}[wֈ{jSoO}ᄍxjv==A4-./!E>"A4}׃hXq=&2PDZD4$B ڈVۈ6bk6:#zҿT o#Fm#ۈ!2ۖ1j1F ِ1h#Fm#ۈ!2mĨm`xgb}}GW۸m'21}l>ِ1}}!cpjXĈ56zkGio#Vm#ۈ%2,{mĒ ½XXl#l|o6ڈUۈ6R]|eb<kpm@mlxjdC6@6`Ȇhl!;&Cc# g].jdC0sJwW wHCk!l|!ܷxxH6d oxۈ#?5=^qy_|mđ q߈Sۈ6Ȇ8oĩmaqdCu#ڈSۈ6sD?71m<6 xmA ??Ɇ)Bmm<'S67$x.l<6m<6 >6cɆalqpژ?Sxm<'2xxA6Ns^B<ѿPxm 2xxA6d 3u ib6@o6`oȆX7ިm6ސ h͛ l ِ1: Fm lVM[h[l-ِ1xx [[!cdDߒ ѷjodC[h[lX~]&;aNml|xxG6d +FKSexm#2?sNm݆}m|Z?v>_=#ޫ=91\)bЌk.ț V{\ޓ׃{Ѳn^!c>+FθmQ2A !c+ӆ]\ bhm|6> ?>@6>`Ɇ|!&GqGxGG!c>##>m|6> Qm#lGhG /ܗI/lY{>GbXXRX2˘2222222222222222e,e,e,e,e,e,e,e,eKX>!ѹ3&?N"C }o^]UK~Sq :#0_/WmnIC["A{ȁ=cȑbut"q>u 8%&I;.#{؁=KHL6d 3uwpڰ(Xm#1l|K@_bFb!c/1Xm#1lJ&Fc#. ;[^$jI$dC%qo뒨m$6 [āKHB6d ^7@I6`IƸ%ob$uےTm#)lV [JHJ6d YRz,FRl#)ِ1z;)Tm#)lLHm$SHm$#2 H HF6d >$sJ2dF2!c9%Lm# ԭ! 7jlA6d [-Tچp p@  26jl#9p~vH.l$6m$6 ܁IHN6d o$FrFr!c9%9\m#9lǩΚ)F F !c֍j)dC6R@)6R`)ȆF h#F l#%¹lb6RB)6Rb)ɆFJX7Rm6R H mTHm$2_6Rm6R551R9T'F*l#ِ1xHF*TF*!cߑI@#Jm#lTF*TFjs:%5\VHm&2HHM6d /VHm&2HHC6:U0椉 qi6`iȆaqoڎuMCk# l|SҨm6Ґ HmQHm%Kfq#7~#FZl#-ِ1xi6biɆHHK6d n#-Vm#-lux\NHmSHm#2`HHG6d n#Nm#lMmSHm'i #HHO6d oFzFz!c~#=7ҫm6ғ aC6c(p ld62md62 ׍ ndPȀmd 2`Ƞ@6d >d62md62>7~{(ld62md62 aQm##l{ьjdCkg62md62 kebdr39ș62aȆmd62md62 mdRȄmd"272A62aƻC~gbdFfFf!c~#372md62  mdVȌmd&2ȬB6*ݱ^#Emd6 ׍,ndQȂmd!2E^4Fl# ِ1x/ȢJ6cbdu#+Y6bYɆ{ѬͪJ6d n#+Um#+lFVh#FV G^_SG^]]}j_E'|Ouq4|v݁x O^m_ᄍxjvDo뾀 =׃ltK;bMϦp=Fw_ zljp=F"d 6mdSȆmd'E 01 c#;XnZەr]m#;l6ee')+Fvl#;ِ1FvFv!c3;]m#;lо\Iw##r>"Fl#ِ1#?rm6r mPȁm 2߷mPȁm$k=5)I IʩI6d pWW ۽,]8Sȇm#2mSg<&?FyfG~9,c-c,c-cE,cE-c,c-c%,c%-c,c-ce,c_YZY[*XƾUUUUUUUհմղնձj\-O_c85.?q5.?q|k\~\S1xk\~uˏk\~q2_]٘ܳU&FaQ@mQlfis6 `Ȇ{7*Q(@6d nQ@mQl;&FAa QPm QljdCkpMUPm Ql|MU(Q(D6^,h;rQ(Q(D6d OWR(m"2Q(Q(D6d 76 m6 '(,ۅzFal0ِ1x( FaFa!cpjdCu0QXm0Ql v*bxפ|פFlِ1cEcE6`EȆ"(Q(B6d ^7@E6`EɆ/L]]jEdC딢pRTm(Ql|RSm6 S(Q(F6_qlB7~F1lِ1{H{H6aȆm6m6 (mS(m'_fˆ)ɆjűdCu86cɆm6m6 (mW(m Hk9(!F X7Jm6J %`/ZBmQl(j%dCF hF l$X|vQR( mT(m$2%a(Q(I6d n$QRm$Ql|R(Q(E6BE&I5(%l6Jm6J (mR(m"2SJ9F)lِ1h)hF)l4Hrϒ~Mb4(Q(M6d >sJiFi!cpjdCpՍ:&QZm4Ql4wlM2b (Q(C6d II2F!c2p頻Fl ِ1x(mQ(c+m]Okʿ}ehZWv++S|uqTRw\<5[_W{[P ( _׃te >WsEY%2+Be"zPD6ʪm6ʑ^޼6('rp(Q(G6d e9e9rF9!cp堍rj對rdC6A6aFgVbbu<6cɆ1Q^mTsJEFE!c~"QQm"Qlϐ_LJ{JjJdCF%oTRۨmT"2`ݨQ ۨD6d ^ ڨQ ۨL6vhg5/V&jdCu26*cɆTI*mT6* )j*dc]=ƘUDݨF*F!c*pFl ِ1R)U6`UȆ«@U6`U7ebTu*U6bUɆFUX7mT6 ׍nTUۨmT%2?*QUm*Qldo#MjbR SmT6 ׍jnTSۨmT#2Q ڨQ ۨF6d W/ꊁlTSۨmT'mX0zQU7̜R>1QۨN6d [.U'RuFu!c9:SmT6 )աjձdB~41j}p_F lِ1xݨF F !cQ֍j5dCsJ hF l&ٸXޯ5ŜR)56jb5Ɇ QۨI6d װ56jb5ɆFMhFMlH>uiyCLZnԂuF-lِ1x/Z 6jaȆmԂ6jm6j ׍ZF-ZFmQ?X QڨQۨM6d MRmMRmFm!cpjdC0u#+Fڞ:2Fml٘o~01 @XGmQl|_QۨC6d oԁF:F!c9\16dm>fvtCk|ۉ0{>L]9,c-c ,cXƾ5}gkdklkbkjkfknkakikekmkckkkgko`hd222222r>L]qG 0.k\]\R1l+.8Vr]uk\]q2quaquqK5N5.qu5.ꑍܘQO׃6aȆQQQۨG6d SSۨm#2ߧzjd|ʝy:51v}ޮQۨO6d SWۨm'2þF}l>ِ1\gb8m]>SGڨm4 C;L}@hm4Phm4 2_o7j dC6@ 6` ȆT FlᾥE,LoD 7Ql77j`ߐ ~ooȆz)ߨm|m|K6b;=LoE-7UlƷƷjbߒ بQboj'OCk[l[!c9[8|-ѐlgKLbNi甆j dC6B 6b ɆalvHcT bhm46 ׍n4Thh;m]]mwPwjE'|~;;S|9#hN}}sq];\=_qk_;zD=h~#oA#2_4Fjp=hDd 6mצ"zЈD|hFjd#Tw;FcFc!cpjdC6C6cɆA64wp0? 3A FqxM&b?m46 i5{ZM6`MȆצMڴFl ِ1Vd< bhm46&FSQ7ºTm)єll {jMdC돦pTm)єll jMfdcV6珤ڴ\6Shm4#2S9F3lِ1 )6aȆ›A6a=۵11KóKm46 )\m9ќlFshFsl9ِ1FsF q瞭Lhj-dC6Z@-6Z`-ȆpNihA6d c+FwZ-dF3ҵ41Zor[or[m6Z -aRm%ђlm {іj-dC06b8m\ qhE6ƴtjbu6ZaȆm6Zm6Z w6ZaȆalvgCkњl[\SkbkM6l?Zm5њl<wzYW6sd/߷u==`\OOuibݺvT׮x^Eǩ^ޔ^b륾֋f{^j֋{^j֋DBzA6zaƎ˚]ћl>@譶M6d poFo!c7yzm6z zC6zc}Fl^21֍>j}>dCu}6`}Ȇm6m6 }>j}dm-mb辰諶K6d Ι뫶K6d >sJ_F_!cp}j}~di21ut?G6d nOmяlF?hF?lِ1~F?~F*euKAw߃诶O6d oFF!cpjdC6C6cOMϱb&o !c1֍jdC Pm 211H62o=᛽1Ϊn H,<_Ӝuq4kᄍxjvDo~=׃qtdUJCo+b`}ì?b8؎v0׃q@}8(bZ8\Ƒ㠍qj㰍dcȆKNnbp1^mc<1l|m:Mǫm6Ɠ mWm'2+C6cIE:L j dC0kN bhmL6& ۘmLPۘmL 2 jdM$51&DQLTۘmL$2C@ucDlc"ِ1DD!cΉD$Q11&3'3'mL6& iM{Z6&aȆmL6&mL6& ?_mLRۘmL&#vλ901U7ML6Vzv1Ymc21ldhcdlc2ِ1w'w'6&cɆdvs_<I/lYS,sLMMͰjiemckg2622elelebR2r J*jZ:c?NSzuTS5n qSո)7׸)Td ^7E]7jTS`qS7l̀s  !c hc lW>չlb*Ưn++ِ1__6~6~%2&WMjb )Bmm$Y Ę)LX7fm6f ۘ mTۘm$23aݘ1ۘI6d ^7fB36fbZ cˆF-W{WՒuc,lcِ1Y,Y,!cpYjYdCYjdcސwsll!cogogm6f ۘ mVۘm&2EgC6fcs'fb{_s9!c1֍9js9dC6@s6`sȆḿ6m6撍obs\\!c5loW _%1ۘK6d װs6bsɆm̅6m6摍:~lb<؋Sۘm#2ߘ7m6 Su1_mc>l<?,X XX@6d ~!c^tEm,6 Xm,PXmN6Zu&jc ak6~6~'2;dCjc ƠsD 6b Ɇװ vBlc!ِ1BB!csB 6bu=wMEn,uc"lcِ1Lit16aȆm,6m,6 )Ej6yajc&wmC-sd/uv)>_axP?p=XL<_L- b껿׃te ~&bx&bŸ,&2a=X׃$B}bhcblc >ˉ"M%bX%jK%dC%pDmc l|mMm,6 K%jKdci}EKRR!cpKjKdCuc)K6bKɆRhcRlc_Gn~2߹Lmcl| 6aȆ2X7m,6 ׍e2er6IYٮE6cɆ1PXXN6d r؁.WXm,'2XXA6fbuc+6V`+Ȇ X7Vm6V )+Bmcl J1c]GPR+aRmc%l|s%\XI6d ^7VºRmc%l|b%Rmc%l<^WtU7 Ȇ퀅UjUdCs*8RXm"2`X XE6d ncJmcl>ۮN6d olW؎ml'2i;]mc;N6M{~1]S:]mp'2nmcdC6ܡ w wlÝlnCj؆٘Hؚnxᡶmx =\16^E16< !c9)j؆ِ1:Pp~|[mۺء.\<*Tzus~[v;wfۺP{rHz;\;w';f+;οJ$u׃@sN8WT؉N!czةE6+!c+vb.lcِ1Kmcl|bܷإ E6d ߹ إ M6za~cXnn!cpحM6d G}nn!cs7[mc7llx™&1s=!cm6 mQ؃m!2S@{6`dg{bNsچ'I6d lxmxbdCT6<Ɇ'᩶m%11֍j{dCphN٫K6d ދ^^!c=^>ѥ~w;;6aȆ>X7m6 )Omcl|NmS؇m'fWy__mc?l|s?ܯO6d >s~~!c9e?_mc?E6DFYnbx9 )^j^؆ِ1xuKm "2S⥶mx 66d#}}k\6&a;lِ1!cpjdC6m6&㧗m8():Al ِ1"qPm ql8jdCAhAl٘w7~!lِ1:\R8m"27~!lِ1r8q8L6Ne/ֱ8,aX7m6 !bqXm0ql|N9 jdC{懡j#dCWѽ6G G G6`GȆ)G:lِ1r)G6`GȆ7@G6`GF5 cN71uQN9q8J6d ^7ºqTm(qlQhQl(ِ1xq8q8F6F'Y2:xv >k;q 8F6d M1M1c1!c~7m6 ǠcjǰdcoƮ11 ǡjDZdC m 6cɆ菫m6 8mW8m O[21N^EOm6N )]16rƕnK bhm6N '`/zBmql8mP8m$%;YnqR8 mT8m$2C@II!cp'j'dC6NB'6Nbdo-/71E/ {Qo olÛlnxú᭶mx 66 o!cpІچ0D=reeeeeeee2v2od ZƂ,c˖Xe,2v2v2nnaiݲEZn[·a睇K'W܋TP뱠Qj}58q2ߋ{1>k88X|58q2}`Q8Bj)ùqJO)S)!cSp/)lِ1Rzpio_ӽO8gwfuqtϨ\=xYQzpV}zpaAg{NVW1zp|,ܷ?q׃$B}YhYlHcE/~31Ήsp9lِ1xqֈsj簍sdC6A6aȆ砍sj簍d"G51΋wYyl<ِ1nN}ݛ'/ yl<ِ1xq$6cɆ{y1~ĸ X7.m\6. {~{Amqlhlِ1  ؆8#i&ط~j~؆ِ1S6Ȇ?8ma~dC6 ? ?l"{ų~51. jdCEo\T۸m\$2qڸq۸H6d n"qQm"O6*]$z/8mcdC36 !cwgj؆?ِ1:W6.a;ĸ$%X7.m\6. !b 6.aȆGKjKdC6.A6.adcZkb)jFِ1"E6!cFF@6d >@jF و .x$#P|# T6Ɇ{@؋mbdCF 76@!c@h#Pm#"L#H} l#lݳ YFD6d k l#lnAAjAF06}M`לbF0ٰ-6`!cpFF0L6d >9%Xm#&27``l2Xyl Lˢ {jdC6.C6.cɆm\6.m\6. )jj`!?!FFB6d 7B6B!c9%)!j!Fِ1mm`WX\+jW+dC؋^Q۸m\!2qڸq۸B6d n qEm J6mKݰh#eü,J6lφmbdCp#Tm#%2 mmbdC6BPPl#l~yԑ&FXuJFF6d 76°0!cpaFFF6d ދAajaUqyqUԍn\U۸m\%2E^Ul*ِ1UqUm*ql m\U۸m\#MzW}qM_-ݿe[R[D=U^+"\Dݗ1ET; DBjD׃Hh#Rm#۸M6"q[\q[m6qlm ml6ِ1mm!cmvs_<Ź/ד^0γ8,sܱݵݳE[b,c-c8#cXeeeOs K_-c,c-co,co-c,cX[>X>Z}z?NQEqQEQ1YjڻV15. ׸(q2ߛ{Qk\8QEk\w abQ۸m!2C@=;!cm6 ށ6m6EO&ԩĸ+]X7m6 !b}w6bwɆm܅6m6 ݅6m6-./jb6A6aȆ1{j{dC6A6aȆ{={F4p6MhI4mVۈ6ɆmDCjF4ِ1hh#Zm#ۈ&2 mDmDc1dg/|ob1FF C6d n#ڈQۈ6bȆm@1j1F ِ1O@1j1}1詙nMbNjdCp}}!c}jdC}h}l#l8G&FXuJF,K6d />Uۈ6bɆF,jF,ِ1x݈6b6bd=ۙĜ)6`ȆX7m<6 ~@mln<6m<6*zakNy m B-]m [P;xaw`. x_ 7bt~[{׃t_wR/\R}_za&U1^z𝝗j/q=xI"d KhKlذ߁&+ VWjWdCRxm"2+^jJml|Jml<~V&kQ7^úZm5ln"?^m6^ ?{ Vxm&2xۈ'ĈwMM'ʛmē ?#^m#ۈ'2nīmcdCFFm|6> `/Aml|Nm|P`88=F?Ǚ{Gb˘e,e2fsyX<-cI-c^1o˘e222g󷌥XY[-c,cAL=/y"G\ɢ̟S"w,8;zS9 W?1xԸ:q=׸D}1`K|/&;q=u 8%&~cXH m$VHm$&2_S%vGkjdCQbw%VHm$&2Hp!޴lbF.j.؆ ِ1 hEmp!2.nm`.dC} ᢶm$!ΚH"l$6m$6 M@sJ$F!cpI$jI$dC}sh#FlÕl sZoaWr [ʇj؆+ِ1MW WlÕl܆+᪶m  WhUmp#Ns)/rsGmandCsS6ܰ 7!c}:7wO禶m nІچN6Y %wa;@]mp'2S⮶m uWp6Ɇwh]m nxᡶmx  X7<6< !cpІچA6d nP6dC6|  lÇl܆᣶m a}  l×l]iM _w;zWm%2k⫶m }½/_ _l×l܆/᫶m$#]O#ӆȆdjɰddCdpLm#lM{djɰddCsJ2h#F2 G^FۺH.\?V7QHv\܃]%w?'}sq/vO[{?|G CϹoќDO}p=/coѷu~j~?(O-?!c᧶m*uob>j؆?ِ1xkچ?O6d c_m'2#  l#m)㒛)F F !c߻L~2F l#ِ1F F !c>"Bm#l.}_#HHI6d ^7RºRm#%l|?Rm6R H mTHm"ncb6RA6RaȆ#F*l#ِ1x 6RaȆTF*TFj8@uZw+jdCp1ОVjFj!c֍jdChjh#Fjl# t&Fa# Fm# l|NI4ji4dC6@i6`iȆm6Ҩm6ҒNumab6Bi6biɆ甴pNIHK6d >sJZFZ!c9%-Vm#-@6bx -m`dC0u3{"qjFِ1:%S6!c^4P6ґR&F:a#Nm#lttj鰍tdC6A6aȆm6ҩm6ғ^er11;EdVӫm6ғ ^m#=l|NIj鱍dCsJzh#Fzl#l\ccb5l \mbdCh E6@!cpFF H6d n#T62npbdsJ8dPȀmd 2`Ƞ@6d >dsJ F!c9%Am#D6>|a;#H66 !cuJ\maAdCk R6ȆFmd$SJ|덉Q|[~[Qm##l|+#ʨH6d >dsJFFF!cpjLdN712 3 3md62 `Im#lF&h#F&l#ِ1 Ȥn='|`9!̖,lPXe,e,2a尌EYƢ-c1\XXnXXe,e,e,eeeeeee|`qtNs k` V׸`\ォ| _L5N5.ָ`u 5.j`X5.!dBw/LC6B!cwB;j!j!Fِ1xl#lOmd& 8s#XSekjdCp1PoYm#3lndu#Ffl#3ِ1xoȬB6v[fS#Y`ȢB6d ;2YdQȂmd!2ߋbmd6 mdQȂmd%#ȪJ6d 7Y6bYɆ甬pNɪJ6d CYjYld#>21 ٠ljٰldCffSȆmd#2`Ȧ F6d ދf6md6BF ~`b}POm U6BɆF(jF(ِ1Ph#Tm##8ޱ51D/{00l#lO|m ׍0X76°0!c~# Sp||[̷uFvvn΋#{|e+껟~Žv^{׃pasFz  փp A8tvA891x= \-"׃p!czmmcd#Eonj=fFA6d n#ڈPۈ6"Ȇ-"`Pۈ6"Ȇh#Bm#ۈ$ 83 7u#l~>Rm#ۈ$2_FµiF$I6d cF3Rm#ۈ$2 mDmDb9ڼnbIr"Fl#ِ1FF!cp9j9dC6r@96r`Qd#c/kmbD3@QjQFِ1(h#Jm# ۈ"27`mD ?'66hQ#ZѰ߈Vۈ6Ɇ-EF4M6d n#ڈVۈ6Ɇ{hh#Zm#ۈ!c{ubb8svi ٨dd݈Qۈ6bȆm@1j1F ِ1l#l|N6b6bdО+:\61r֍j9dCTȉm$29aȩI6d ~>eNh#FNl#pO?M\,\,\j\dCu#6raȆalupXv~L˒& E6d o6rm6bF7NdhbĊuJ,\ĪmbdC0hcg πĪmbdCp#Vm#ۈ%2 mĪmb[>obvl?>B6rcɆFnX7rm6r a[m#7lFnh#Fnl#v䳋y|F>!c֍|j|dC|pOm#ln6m6qG U=ibu#?6cɆa6qpذ H~F~!c~#?7m6 mWȏm ׇ:Q@<-P(m 2R>O)Q(@6d >sJF!c8)FFA8ꘉQPԍnT(m$2$tAFA!c5lA-Q(H6d -mT(m"KsJ1bF1!cpŠbj60a{>Lq9%,c%-c,c-ce,ce-c,c-c,c-c,c-cU,cU-c,c-c5,c5-c,c-cu,cu-c,c-c ,c -c,c-cM,cM-c,7rQC{͟SqQW\]Wj))qq+N5N_q8W׸'cި8q59>*aK$+j%"]?_߭+{j%= ;+~ /a^⟾+y =/{tߗoWRJ»_R}KzPJ$91xS<%"JzPD=FIF)Qpw\Q 6JaȆR.Q (E6d >WբF)lِ1\Q (Q (M6z_vXGjdC{liFi!c}jdCkFiF6&FYY2F!c2(Q(C6d ^7QFm QlFhFl,x0#i&FYQ7ºQVm,Qln"QVm,QlFYhFYl,ِ1R(Q(G6QN`QNmQl(rj對rdCh9؋S(m#2Q(Q(O6ڤs0Q^(mW(m'2a(Q(O6d nTsJ F!cp jd҆N31*^"E+mT6* oT6*bɆaltp(Vw] bhmT6* ۨmTTۨmT"\&ZkbT6*A6*aȆJߨQ ۨD6d װ6*aȆ)Jjd6)`bTsJe8TVۨmT&2S*9Fel2ِ1FeFe!cpj*dcܜWn41^ EmT6 M@6mT6 U`/ZEm QlFhFl*8+LκaJ6]u#_쩪QۨJ6d n*QUm*QlnTuFUl*ِ1FUF5YdFLjnTuF5lِ16aȆᰑ(щb&F븯&Ԃ6jm6j{D1Ĩ-zڰQۨM6d 34vpذ}\[m6Ql| [akm6j ۨ mVۨm!]_q51wwm6 ԍƔ[ Flِ1:F:F!cpu:judcis&QWԍnUۨm%27~F]l.ِ1R)u6buɆF]F=qsefG6̗rQۨG6d 73F=lِ1x/Z6aȆF=hF=l>Ĩol4oI5 ǟ1F}F}!cgmᳶjdC6C6cɆmԇ6m6~(2h hh@6d /6Phm4 27~Flِ17 j 644$]h.\&!|ǫACsqvO~Ž?}{׃Ft1TCop=hDw_5491;;;;"zЈD|hm4Rhm4&y o9h,Fcl1ِ1x6cɆFcl1ِ11Xm1фlT[m$M`hhB6d 7hhB6d c6=f&F!chhJ6F|{Tԍn4Uhm4%26Uhm4%2S9FSl)ِ1=f1hhF6~̹oanJ3a)6aȆ=fjͰfdCu6aȆ@6m4pyy6,9ZXZZZYZ[XZY[:X:Z:Y:[ƺXƾuuu}iiemckgo26262626rKsqusj.pkqqkN5Np1\]לjkkqqkN5N}ssX㚫k\s< =dB-`Bmтln"[m6Z -BmтlonmPhm$}fRh mThm$2lThm$2hhI6d ^7ZB-6Zb7_mbsJ+8Rhm"2[F+lِ1VF+VF+!c h hM6-_)(hhM6d Vhm&2ߧk Zm6Z h mVhm!/^8h#iihC6d |Fm цly_ħFl ِ1o 6ڨm6ڒv;t}VԍnUhm%27~F[l-ِ1)m6bmɆ6ڪm6ڑ &2h|ټH܎lnhG6d >sJ;vF;!cpvjvdCsJ;hF;l=%_Ż6cɆ{mhO6d oF{F{!cpjd#0RV&FLLF!cp遲Flِ1FF!c5lhFl#٨KkbtFGotTmt$2E;^FGl#ِ1FGFG!c訶D6Ձ&F'ޗ7: 6:aȆN褶 D6d ̸|fImщlnt6:mt6:cj\`btttVmt&2~3~Fgl3ِ1x FgFg!cpj.dë}}]Ĝ)]6`]ȆFX7mt6 ׍.ntQmt!2袶lݙ&b dC0u3F' dCu X7Plj_`]Ɇap>&FWQ7ºUm+ѕl| amt6 ot]6b]Ɇ{ѮFWF7AO{݄nF7nF7!coo뺩mt6 ׍nntSmt#2 覶 N6^qjbt6C6cɆ̻=jݱdCS)6cɆmt6mt6z˔abFoPm 2=`衶A6d nCmуlFhF G^_ov~|[%Zėvn΋5ɗj_{KxT/w\܋]ӷu_{AO\lS=\S}{zГ-z}j=q=Id c=fO$2詶E6n_߸K'饶 E6d c=f/^F/!ci/hF/l7pp[[m7ћl {jdCu76zcɆFoFѼwi:}Ĝ)}6`}Ȇ;ޢFlِ1xv}6`}ȆFhFl/٘WԍnUm%2 Wm/їlnuF_l/ِ1x mUm#xRx[觶G6d >sJ?~F?!cp~j~dCuOmџlltd8G;:GFl?ِ1x/6cɆm6m6 mWm|E6V&W _m|m|E6d ^7u+Ȇ)_uWj_a_  Jm+lc-L  jdC6@6`Ȇm 6m 6 [01H6T7Dscq q@lc ِ1:S D&m 6 )2Pmc 1l|k 1Pmc 1lL $1D6d ^71Hmc1l hc lcِ1A A`QL jdC6C6cɆpN1L6d  m Vl8|݉09b9cek0p7o-c,c-cc,cYƾ`go`hdlbjf2626262elel|!T]V^#4DFC`o4D]7j}!7׸!Td S;c$LC[7j! Q׸!xJ66:~1T tC6bCɆK K1J6d Q3.~3 JCkc(1l| m Um|M6|WZF_kɆ{aodC C;c8l)'A Ɇb6VF6B2=\&apN1 F6d \p|.8Lmc1lfN)yNNCkc1ln 6m 6 ǁkEpp!c1֍jñdC Wm '211l}WZ&7n|7j`ߐ ~ooȆaQzZ`ߐ @ߨm|m W' 01F1֍j#dCp1sj#dC0u3Fn)7KCkc1lmPm$A [1RԍnTm$279c8l?>""A H!cp#j#dCsHhcHl[QqBUMooo66%2Ejbߒ (qt7&KCk[l[!cBߪm|m"^7V%{{1 E6d o(Q(!c~3ƪ!/\ (lcِ12 1 M6N>YEcn2l>T1M6d ^7Fú1Zmc41lnt\72&1M6d >6Fm6Ɛ GS5i8l1!c~c 7ƨm6Ɛ lppبfw^ϪQ bhm6Ɛ nhc G^ߙoG^WZ8DL"0w|+7њ;=>_|N u' /w\?v΋{tχT^Uԃ+/{xWq=~[|Od ;k;c8DaBЊ׃I66ƒ+mb14XX!c}FUm%2:>_1K6d nc,1Vmc,xs=%M6~6~ 2#8c8l'ِ1J/J dC=j?`F;01Ɖ861G6d 6aȆ1G6d ^7A6aƗP/ýj㱍dCxx!cp㡍j㱍dCIC6cȆEL bN j dCuc6&`Ȇgg1ۘ@6d ^7&@6&`]{7H6l##ِ1x#7~TlƏƏj?b? ?B?mmL'gkNcaݘ1ۘN6d ttt!cpӡjӱdCsthctlc8cLd#Qg1f.nPۘm 21ژ1ۘA6d nc1Cmc1l|2ژ1ۘI6G3Eݘ LL!c~c&7fm6f ۘ mTۘm$21ژ1lLľOp_'Ȇ`OOdC6~6~R l|N Im'lcabuc6faȆ,X7fm6f ô6faȆ,hc,lc6eU[e71fpkllc6ِ1s9ll!cpjdC6fC6fmχA'|9sqޝ{'98Q׸9͡'cɝ'w5n8Fs`o4G]7j7G]o.x61̸!טK6z7M^\\!cy.m6 s7Wmc.1l| mUۘm#9/1Ϲkl#SK6aȆ1ۘG6d ^71Omc1l|M5ژ1ۘO6.!Ę/pN1ۘO6d 7χ}||!c1֍jdCuc>1_mc>l񎭉@Xm,PXm, 2n1:52A !cp j dC6@ 6m8>|[7>*mʹ"~0w|gv⅝ gwg7bOgxVq=XHm 2zփ껿׃te L3ÁHn bh,`!91g g "zD,6m,6 Ǐv41 EjEdC{`XXD6d c.b"lcِ1xXXL6Numq,Xϼ6cɆaz&5lxZdC6C6cɆ}Y m,VXm,!~cDDXm,QXm,!2O` |O`lc ِ1xK6`KȆhclc)٨92T)KᜲTmc)l|mMm,6 ׍n,UXm,%2\ m,UXm,##:c X XF6d ncLmcl2hc2lcِ1xXm,SXm,'/Z<\Xm,WXm,'2E^trlc9ِ1:e9\,WXm,'2XXA6޽ueB+`Bmcl hc lcِ1  !cp+j+d@r=^'71V +j+dC6VB+6Vb+Ɇm6Vm6V X mTXm"&Mfbs*8RXm"27V~c*lcِ1:e\RXm"2jlRXm&kޙX-l6Vm6V ׍հnVXm&2XXM6d ^7VC6Vck?1[Ò{kĜ)k6`kȆ75jk5dC6@k6`kȆ@k6`kFAmX+X XXK6d ^7ºVmc-l| aתm6֒ ׍Z:HJyDX:u:!c֍uj밍udC6A6aȆ\mSXm's\nbzoWXm'2XXO6d NY)6cɆzhczlc}C]M nluclcِ1;;66`Ȇml66ml66  jd#.FF!cw7w7ml66 a/Qmc#lFhcFlc٠ӭD/ 66aȆۤ D6d ol&M&!cpMj_zf:E|[ __Ȇ)u/j` Eml!c~h_d2316 jdC WZ8c8l؎߬L6d olff!cpj-dQߚ[B6l[6`[ȆTTߢB6d ol-!c9e Emc l,zxcE^tVlc+ِ1x[Ɇ甭pN٪J6d nVhcVlc٠&6bF6ݍ) @~(Mmclmmj۰mdC6A6aȆml6ml6-Fk.vX7ml6 ׍nlW؎ml'27~cvlc;ِ1خnq̯曤':IV_"~0we{_½_~;0|yqtU_w\܋]7I{}B2=3vp/|`}ۼ~ۼC`;ȁpء׃$B`Cmc݆ܗ }Nzg8i9celelelelelee7A!aQ1q I)i?,c,c-c,c-cZ.Y.[j\}~9{,;NuۉkNq2溝׸Td ^vS]vjᝰT׸xE6tKKmcl.w߻ܥ E6d Dz R؅m"2vA6vaƍߥ01v;ylh8[>٭M6d ,x7|[mc7lnucnlc7ِ1nGM=yolcِ13==!cuڣC6d >6m6&K߿gb6B{6b{Ɇ/ /ګK6d ^7ºWmc/ln6m6i?Lab>oS؇m#2E^t>lcِ1x>}>!cp}jdAn~~!c9e?Sm6 ׍nW؏m'2د8@6lZ䖉q@6`Ȇm6m6 ׍nP8m 2~q@m٨oT7LD ֍6~6~#2S~soja ׍`Mm7l7!cwH~6~S 8H6qqP8mT8m$2q8q8H6d n qPm qln6m6=#ۤfb!C!!cororm6 8mR8m"2_6m6!CLânual0ِ10\V8m&2q8q8L6d >6m6Bݎ}{겉qD8mQ8m!2G`8q8B6d nqDmqlhl(K&Qޗql`m6 {v{vTm(qlQhQl(ِ1r8q8F6t_>梉qL6aȆ5959q 8F6d nqLmql|qLmql̹o'̎+smql[ Mn܇u}l>ِ1xݸ}}!cq֍jdC C8c8l9r"ڸm< 9Uびn?dö@xx@6d o<!c֍jdC ū;c8l16`F̝x(zч}xH6d oRGo..Wyqt#\=kzE=x cc2+Czo&xG6Vt}Xx/|/;lِ1x6aȆm6ީm6ޑ )U16ݍ) }Zﰍd~;3߫m6ޓ ~^m=l|=xxO6d ,ᳶjﱍd#ɥƘ!cgm೶jdCu6>`Ȇm|P`Dx$XƒX\-cn1w˘e22eX|-c,c-c~1X XJX*XjXXZXe,e,e,22dha'jQf؜Q)qڧsQp6\Ȇs6\6\$dNnb$$hDm# l|/&ڋIHB6d n# Dm# l|MHp%տEa&S\⪶m ꁾuUp6\ɆW8mbdC6\ W WlÍl|w}CM 719Mm p#27`ᦶm p66ܰ 7!cpnІچN6px.;j؆;ِ1nsg w#p6ɆmCj؆;ِ1xmmcd#I_چA6d =6< !cpІچA6d ^7<  lÓlP36< O OlÓl{mOچ'I6d nT6<Ɇ7< O O G^IFD#O[vI"E~%ERvO%w?'}sq/vD;G<'gy> ^}^pR;xA^j^xmxmxadꝦ11=7[o olÛl|mxcdC6 o olÛlo o olÇlDy#֦>pQ6|Ȇ=@m`>dC6|  lÇl|mm`dcck41|6f/0_ $_ _l×l|Nsچ/K6d nU6|ɆBjF2p=Ldn$u#F2l#ِ1V2w&SHm$#2 O“m$6 )ɠdjɰdڝk}FDhllwq'WHm$'2HHN6d YrYrFr!c}Fr؆߮t&ط~j~؆ِ1? ?lÏl|NsچG6d >A~j~؆?h0"}]L  o AMj؆?ِ1:S6 !c9)j؆?ِ1x66dc3w61Rp#F l#ِ1))6R`)ȆF X7Rm6R SR@)6R`)̎ߖ21R:9$%ٰ`NJFJ!cp)j)dC6RB)6Rb)Ɇm6Rm6R \lob࿿F*TF*!chNI HE6d n#Jm#lF*h#F*l#5(cH-l6Rm6R a/Zm#5l|SRm6R 6Rm6Ґ aژiDi6`iȆ4pNIHC6d ދh4F!cU1| Fl#-(V&FZ}UHm%2iaHHK6d ^7ºVm#-lFqgz'  8m`dCu#֍l#lFF@6d 76td#4&F:1sJ:tF:!cgmM16w-|=}"χ blbjf YƲ[-cHXXe,2cie嶌屌YZY[ X Z Y [ƊXƊZƊY· w!p@:)Xý`u 5.j{=k\0qTd (X]q 'c(ָ`u _HCؚ!b _FB6d pC6B!cm 6B6B6ye6 m]fX-2Ed0w| dV;lw`.~[v?w?{?*8<3Y螏u|uC/+E}zA A\Y\E-" YHJY,jYdP]T51=p%FVl#+ِ1FVFV!cpYjYdCsEVh#FVl#p?`*&F6Gd}D6lF6!cp٠ljٰldClp&ɦ F6d mdSȆm[iRu#֍PPl#l B=AmbdC=f(1C6BP!c9%U6bqMT01D00l#lnm )apN S6Ȇ0h#Lm# N66{Lndu#Fvl#;ِ1xFvFv!c9%;Smd6 )١jٱpC,kbwH;$jF8ِ1V8 W6ɆmCjF8ِ1mmcd#gĒ'JN6l؊yFA6d 7)jFِ1xl#l;h#Bm#ۈ$9G)#RԍHX7"6"H!c FF$I6d ^7"a݈Tۈ6"ɆF$m W7olxˡA6d n#Cm#l{j9dChh#Fl#l\OtF1#JoD((l#l(IFE6d I|$Jm# ۈ"2E((l#lzаdQ#ڹ5/F AjF4ِ1{hhl#l߈FF4M6d oDCjF hf? 1nmĐ 1Qۈ6bȆoĨm`1dCu#ڈQۈ6r zSa>NI6 +'j9dCp1a FN!c~#'7rm6r 9j9\dt~ DF.\F.!c ֍\j\dCF.oRȅm"2 ȥ ۈ%g枷>+EchF,K6d L,F&Vm#ۈ%2nĪmbdC6bXXl#7٨t5^#x>OɭM6d װ6rcɆ{ܰͭM6d ދ6rm6 :*GmQȃm!2F&F&Fl#ِ1a#Om#lnu#F>l#ِ1x/6aȆm6m6e5b=kTIX!!D!;b.UQ{Y{g*~}_筮+=sG_O׹ιs^Ĩ$lT6*mT6* ۨmTRۨmT"2S*9F%lِ1R ڨQ ۨL6hQYب mTVۨmT&2R>OQۨL6d n2QYm2QlnT6*mT6\N)nb/W媶m ?OqS\6\ W!cpІچ+J6d ^7\ W W 1U7I7IU`Q.\< A*v)ū8I*_~Sxv^*{^׃t#lܨWUSSU}zPvP׃@*U"zPD| mTUۨmo]Qps+6ܰ 7!c> njn؆ِ1 7hMm p#2t66ܰjd㲷LMjnTuF5lِ1xݨF5jF5!c}jp&Q ۨF6d ^7A6ad#;ob;(6ܱ w!cpІچ;N6d ^7apWp6ɆmCjvs_V{y6,1/X XM˘eeeeee2V22k55[[ƚX,cM-cf斱 Xe,2j9Ńj\[g8yFk8=C]R6ȆmxA^j^؆ِ1/ /lËlo66d&F oԀF F !c~7jm6j ׍nPۨm 25j5d_]g71j߭n]MFM!c}pFMl&ِ1FMFM!cQڨQ&[~q)`bx}:oO筶mx )pNV6Ɇo8xmxcdCuV6jC'd11j9Sjm6j ׍ZnRۨm"2ípkm6j ۨmRۨm&801j jdC061}fg6jcɆFmX7jm6j )j:d[e415lQۨC6d ދցh:F!cQ֍:ju:dCuQGmQl,qOd01 ujudCsJ]8Uۨm%2E^F]l.ِ19ujuzdkәzF=zF=!c9Sm6 ۨmSۨm#2SA6a>dn1Қ>b)>j>؆ِ1:S|6| !c8l$Jtp؈OÓ%m 6|6|d#k01^>Em6 wY~wY_m>QlnԇuF}l>ِ1F}F1hh@6d ^7@mрlm{j dC6@ 6`d+.W)pNU6|ɆgmbdCkX_U6|Ɇ{Q_hWm#_˨&mma~dCsS6 ?!c9)~j~؆ِ1S6YF}h(l46m46 ìSœ16hm4$2hhH6d >46m46ah$ְF#lِ1LhQeeW\$hD6d o4F#FF#!c9HmO6.inb_W6ɆmCj؆?ِ1x  lßlκ@666y5&k EcvI?_<_+u ˇJZ&ŵ|k +CcolşH81MWm۸^QzD}zЄa֦3m.^"A &4!2#>ZD\M&jMc7mbyjFِ11dF4@m# 2?0Am FFєl}>;1YFSl)ِ1ePSa[5Uhm4%21™FSl)ِ1ڴ)Tm)H6VY[#PF` jF ِ1@h#Pm#$21am ׍@h#Pm#hF6J zksN17Xql)6aȆaO16y[-a fF3!c~7m46 hm4Shm4'mkWO7~Fsl9ِ1ڴ3F\HQ[NCk9ќln4uFsl9ِ1x/hhA6 }ebpBmтlF hF lِ1F F !ch"Wco 6 !c$cS[ٰMmAjAFِ1 l#lFm;[|nbuJ0\mcdCu#֍``l#l|  װjF0ِ1`h#Xm#!Jqf)lLuyK-cFB6d ^7B`Q6BȆF!j!Fِ16Q6BƏAzlb FF(J6d N PPl#l|#ombdCh(j8hN;hi9#22nEZZ[XƢ,cm-c,c-c,c-c,c-cіXXeee,22222222og9%ոcK xd8ggT׸Ƶ'cި%Zk\K\ZR1%\ST׸Ƶ'cָad#Ym>01z; 6°0!c/ ajaFِ1xo{00l#lo66°VdñJ{ {Jmъl`+\F+lِ1xhF+VF+!cpVjp1`׈LpQ7aW6ɆF8jF8ِ1xppl#l|Mmmcdc-bMTjFِ1s\0Bm#ۈ 2S"mD FFI6҉&F mDmDbdCh$E#6"H!c9%)jF$ِ1 mDmDbF=41Z95SZm6Z ~Zm5њlƆ3ÆT bhm6Z h mVhm!džzh#'h'hhC6dd"mhC6d n Fm цlFhFl#l,<5#J)QpNRۈ6ȆEmDaQdCF76(!c^4 ڈRۈ6ڒەsS9F[l-ِ1xm6bmɆhhK6d c#3Æe؇2F[l(xᒉNhmShm#2v.۩m6ڑ hmShm#2QaI_/e vF{JgW{^m=ўlhjdCsJ{8Whm'2Qa>q16cƴ&?/]~ FX7:mt6: mtPmt 2`蠶@6d c3FqJZ6yu4[ڧo:B":E'|:d΋ޢAGsm]Gx;~G7O.uaQ};zЉy[1:z N ׃Nte cv:t91x=EtRA'!cImљlzd sܷ06: fRgFg!cpjdC6:C6:cɆΰ謶ۈ&g41žE4ܷVۈ6ɆEghjF4ِ1x {hhl#lnDúmĐsĈq)杝a;P6Fm#ۈ!21nĨm`1dC6bl#lnmt!I;.S9Fl ِ1 \tQmt!2>{B6d c#3v]mĒj=}{Ĉorc6bX!c FF,K6d o~#Vm#ۈ%2#Ϳ랻mt%sU]aUm+ѕlntuFWl+ِ1)]6b]ɆA68cPAfOCk+эlC&F7otF7nF7!cwvwvmt6 )MmэlƆ3Æ[U_mđG41D݈u#Nm#ۈ#2Smđ ۈ66Ⰽ8!cpqFFѝl8>Za~';ٸy&Fwl;ِ1xFwFw!c9;Smt6 بA6^=-GZݱdm31zgh=3j=dC0F3g + Flِ1FF!c^35wCkѓlo؃31zor{or{m6z #z Sm'ѓl|Szm6z p:A F/q}21z ֍^j^dCh/^F/!c~7zm6z mRm&>NE{^Fol7ِ1LaFol7ِ1FoFo!c~s/&A FXy&F|Gmчl|Sm6 mQm!2كMCkїl4tHS[MbN 甾j}dC0616Zs>y16b}Ɇ{ѾK6d ca{_F<8q&Q-&FnīmcdCp_4^m#ۈ'2mīmcdCF<76ⱍ~d#u#7~F?~F?!c~pF?lِ1~F?~F?!c~7m_·a[`hdlb26262eleleleleleleleleGxO Iɖ)i閱-G' l4ָ׸Td 7}suk\q2qa믮qqO5N5?q5?A;]s1@m Pm 2ߋbm 6  t6`Ȇ{71H6v͜u&@ac 1Pmc 1lojdC06\1RK4yZdCp=Pmc 1l cاm 6 )2Hmc1l|NAjAdCs 8 Rm &Vkb1X m Vm &211L6d nc01Xmc01l|N j!d&1 s!!cpC!jC!dC6@C6`CȆ}!jC6y}o`0}wnW.\<'m^{s⟾v߫o.)R;/{\=0aMePo??׃te   U;Pr cg:C3jCq=J"d c=P0QGÄa0a0!c01 F6d nc1Lmc1l0hc0lVIMD#~Pl?mm@6d oI~Plfa~E%(X7Fm6F mRm"21 1 E6d nc1Jmc1l>Y&h9wVm&2d4|dhlc4ِ1hh!cpj1d` iM~61ƈ1֍1jc1dC؋Qm!211C6d nc 1Fmc 1l$H31Ɗssƪm6ƒ ԍO16lG Um%211K6d 1oUm#mO7'zq1G6d ^71Nmc1l8hc8lcِ1x8qƏdϋU~?o##ِ1L/)FY1( ƏƏdC06*9c8lY&##ِ1x֍6~6Ɠ_<<0/xX7ƫm6Ɠ )͜16R6]%a x!c=p|xlc<ِ1xxOdh'?9)㔟Ȇ㔟6~6~"2SB16r<(Sk^ bhmmD6d >生6~6~"2 }1lR0 &N)6&`Ȇ ߘ1ۘ@6d nc1Amc1lhclc"h81l$J~Zj"ؖġC1ۘH6d 31l㥄16&bɆ1ۘH6d >LsD$|+c&mL6& ?OLRۘmL"2`ݘ1 ۘD6d ^7&1Imc1l:0yı&dbL6l?|1Ymc21l|N jdC&gm6&cɆaF5g ɻ4eZ)d㫬mbLoLQۘmL!21ژ1ۘB6d N)S6`SȆX7mL6 K21pcTlc*ِ1TT!c9e*SmL6 oLS6bDǛ#LiߘijӰidC6A6aȆ4X7mL6 ۘmLSۘmL'']Mr1]ؘmLWۘmL'2E^ttlc:ِ1x16cɆmL6mL6ft+fb oPۘm 2c|c lcِ12)36f`3Ȇߘ1ۘI6л&Lac&1Smc&1ln̄ucLlc&ِ1LL!cpcL 1?o1~g8]xRvO$ kj?|?ᄍx*vO$ {;}Ys_^{,-cs,cs-c,c-c ,c -c,c-cK,cK-c,c-c+,c+-c,c-ck,ck-c,c-c,c-cX6Y6[ƶXƶZƶYƶ[vX}EkWdJ,1͂,uYTd ̂l,g2g~x,l2yfg=l~KŻgg6fcɆ{ٰ癭1ۘM6d ̆ll!cg6fm6損guĘ#s`3Gmc1lńuclcِ199!cps9jsdkIƛs\\!cpsjsdC6Bs6bsɆm̅6m6摍U]=cb̓Sۘm#2S9e1l|hc|lc>ِ1xݘ|Q4} z :e\,PXm, 2gu|gulcِ1!c}p~lc!وEc˅)].TXm,$2AI/TXm,$2_.k؅j dC6B 6bK31֍EjEdC"؋.RXm,"2/q|/q"lcِ1E"Ebqm|]MŢn,ucblc1ِ1{{6cɆbX7m,6 X m,VXm,!j=X"X7m,6 ׍%n,QXm,!2XXB6d NY)K6`KɆŘKd\ ,UXm,%2_.kإjKdC--UXm,%2?Wj),s2e2!c՜1R&HLmclFug yEXm,'߻t'cӆXXN6l,WXm,'2_.kj˱dCkp \mc9lXj˱d# ^#:+D+6V`+ȆXXA6d ncBmcl|kZXI6o}^;cx}%|}Jlc%ِ1JJ!c^t%EWm6V ׍nTXm"y*X%*X7Vm6V )Jmcl]{UjUdCUpJmcllvnX-SVm6V ׍հnVXm&2SV9ejlc5ِ1)6Vck.ib5pFmc lhclc ِ1)k6`kȆm6֨m6֒r.r701֊9e-S֪m6֒ ok6bkɆZX7֪m6֒ kaVmc-lt bC+c`XXG6d ^7Nmclnuc:lcِ1xX:uzx^La&zQ7ú^mc=lzhczlc=ِ1zz!c^t=E׫m66;Pcؠ@6d /nP؀ml 2E7ml66 o{66`F>GMFhcFlc#ِ1x66bɆFX76ml66 Qmc݆#_̷uۺ__"œ~xOk/j|DUw0~Q_w\</m/pE}`W$zMܤp=Dw_}&GlR;؄&r cz փMjp=D"d cn=&MfqDd&f1Wlsff!c77ml66 wnbflc3ِ1t3\nV،ml!z9~";Yclc ِ1x-!c֍-j[-dCuc [6`=:*攭pN٪J6d c#a _؊ml%2تJ6d cn=V614+&6X7ml6 ׍mnlS؆ml#2_nkmj۰mdCs68lS؆ml'{"l.ll6ml6 ]mc;l|Nj۱dC{Z:evlcU~&acCmclnuclcِ1!c~c7vmps?/3dgv촜222222v2v2v2eeeeeee7I)iY9yE%eU50;UI\pZ_iXo׸Td ~N~NuۉkNq2q;a۩q;qI5NN8T׸xE6|Ěj\SR؅m"2vo.lcِ1].].!cp]jdc͌ 31vwVwwVwm6v ׍ݰnV؍m&2d7|dnlc7ِ1xoF6vc{Ɠ3L=bN=j{=dCuc{6`{Ȇm6m6 mQ؃m%]<ܯW|#~#Wmc/lY^,x^lc/ِ1^^!c9e/Sm6ƒ/{D6aȆm6m6 mS؇m#2`اO6fRMc\;2TQuc~lc?ِ1~~!cpjdCuc?6cBq@t6`Ȇ8q8@6d nq@mqlhl {. OE^Al ِ1{;G6bɆm6m6 8mT8m"Mv-8$l6m6 )rHmql!h!lِ1C!CƯdc\z{ &Ư~ܔ_Ɇjb #Ưjb UmWlW!c^a`16~6#Lânual0ِ1xq6cɆE}jdCprXm0qlW\UL#={#jG#dCs8Q8m!2G`8q8B6dԌa#zDmqlÝMb(8q8J6d >sQQ!cpGjGdCQoU8m#k蛧qL)rLmql|N9cjǰcdCs18S8m#2S91l8:q?q\8mW8m'2F2V [:q8N6d ^7úq\m8qljDZdg+'Dq'6N`'Ȇ8q8A6d nqBmqlnu G^o/>}[Efa.9&ov)߭ w77O?}[#~Sp=8IƔ3Nzpփ׃te c=I$2'j'q=8I"d c6Nm6N<*cb6NA6NaȆag +6NaȆm6Nm6N 8mR8m&,vi1OYil4ِ14\V8m&2_jdC}iGV8m!:5qF8mQ8m!237Ψm6ΐ 8mQ8m!2 ?Ϩm6Βu$)ab{ZgYY!cq֍jgdC]]U8m%2q8q8G6R8's8q8G6d nqNmql8sj簍sdCs98S8m'giz11΋9<|%lِ1xq 6.aȆm\6.m\6. `/zImqlS{&e[Sߺq۸L6d n2qYm2ql|N jdC{_ejW++D6@W6`W̳׍+n\Q۸m\1OQD >\s+UVԻyL߸ jWdC6BW6bWɆUX7m\6 uqKԍ[nR۸m"2߿om6n ۸mR۸m"2|-l6٘xkMmhml6ِ1mm!cp/ml6ِ1xq6ncw5Q:e41};plِ1cwcw6`wȆqqq۸C6d >܁s;]xp㮨waݸq۸K6d N )w6bwɆb½jwdC6Bw6bFS[ M{n܃u=lِ1x/z6aȆ{߸q۸G6d >܃s={dcUwawhw߱Ɇal;c8l$ߵ|b bhmmN6d nwhw߱Ɇmm;qlv&}n}n}}!c^>Em6 ۸mW۸m'2S9} G^3w= m@-]xRv`u`xv\kӇjq=xH"d o[jdCu6>`Ȇ7>jdC6>@6>` 31> jdC~~Tm|$2aH6d <#|Qm}>u"χIs<[ƒXƾ%%%XRZRYR[XZY[2Xƾeeeeeee尌崌岌嶌屌}ea'*=v֛rwQV?$ :KD.h?k\"k\"T1`K?1spKL6]>؅vbFb!c} g )R4A Fb!c( m$6 H m$VHm$!{71I$jI$dC/&qA/&QHm$!2I`HHB6d %qAQ$v o뾀3j_E'|D!o h:\<o뾀 ~S{:/ \=sk^RG$w?' )}''T )IɁߒjIq=HJ"d >W$sERF2,]519 q|2am$6 채8c8lxPּHm$#2?% :%F2l#ِ1d.Yp2dFr1!rXxe#aHHN6d ^7ú\m#9lLgjɱdCu#96c)ƉtH=K=KHA6d n#Bm#lF h#F l#ِ1.Yp ؆ HЬL Q7\`pQp6\Ȇm@.j.؆ ِ1x  lÅlnᢶm$Tcϙ)]dx K)6Rb)Ɇצ)4FJl#%ِ14%\THm$2_디j)Tdc̣K11R}Tp"F*l#ِ1~g*ߙJm#l|NITjTdCu#6RaG3ߗ bhmd6 ׍ndUȊmd#SMF6l6aȆ{lͦ F6d ^7Mm#l|#Ȧ N6&Fv1dsJvFv!c$176cɆaꆗ3Fh; Ȏmd'2aȮA6Ubm&F1sJF!c)9j9dCsJ8Pȁm 2_j9ds9:%'\Tȉm$2F2F4'ٰͩI6d a M*yȉm$2Sr9%FNl#K&Ĝ )6raȆ\ȥ E6d otQ2A \F.!c ֍\j66$yo$&%glJm+l+!cgh_gh_m|m|E6d n+h+dCʷڬ51>"/#m6 ?G^F^!c>s;A F^!c3/1mp"φqőr>G~XזB–"b▱RҖ2ro,c,cZ*ZƾUUZƪXƪZ,c,cs_Q[{W?NxQs;zT7m]>uˇk\>q2&7&75.8O]jJ`ߜO]/?ٸ5|LbjdC_~8Wȏm'2^;?^;F~l#?ِ1xoF6cF^ML\l)Q(@6d ^7 Q@mQl}}jdCQP(m|M6ZTe&עn| j_c_ hqf( dC66Vln| j_cƤ{U\jbgtAgT(m$2?K :KFAl ِ1xQ6 bɆFAX7 m6 SW($ m6 _T_THmQlۺBۺBjBdCh!؋R(m&JtQoQl8wjdCV(m&2E ^Fal0ِ1R m6Y`buE6`EȆm6m6 ׍"nQ(m!2?W(%F)X7Jm6J ׍RnR(m"2*Jm6J }{_6JacVSMFihFil4ِ1x( FiFi!cpjdC6JC6JceFibb6@e6`eȆFX7ʨm6ʐ (mQ(m!27~Fl,وrw$ FYl,ِ1x( FYFY!c~,7ʪm6ʒ ׍nU(m#~Xu`(Q(G6d F9F9rF9!cQ֍rj對rdCh9rFyq܀XLFyhFyl<ِ1R)6cɆýj屍dCu<6cߐMooo66!2-7j`ߐ Fml!c~o| Ql4ZpDZ&FQ7*QAmQlnTuFlِ1xQ6*`Ȇ7* j6y}kKd>{_BߪE|ka.w9&j`~[xUow\ySm$2 mxmxbƔ-ǦebTp]]m:Ql|MUmT6 ۨmTWۨmT'2ިFulËlIUCKy}:/ /lËl܆᥶mx x/ /lËl| ymxa5BZQCبmPۨm 2QڨQۨA6d Y Y F !cwVkwVkm6j  u31j:{QshOMtwMFM!cp5j5dCsJM8Tۨm$2ᰱ|]s'Q&^]:7 oNV6ɆmxCj؆7ِ1 oh[m&27a᭶m"{;k01j3j3jm6j SjuJ-ZF-!cpZjZdCZpRKmQl$5Ĩ-ְFml6ِ1xݨ FmFm!cpjdCu66jcu}Ĩ0-|qFlِ1RuRu6`uȆal:c|%OCkQlO짎Fl.^ʱ gbuF]F]!cߟ [F]l.ِ1xݨ F]F]!c9.Sm6ꑍ_kobg#sAg#Sۨm#2`ݨQۨG6d QoSۨm#2QڨQ!O11|Q6|Ȇ>j>؆ِ1xuGm!27|`᣶m'%O82Ĩ/zQۨO6d v}v}F}!cgmᳶjdC{_W}vov5բZDs/9Hk\\렁݁x _^m]x~7O~[ tCWi=-_-|ᾅځ/@s/+|"|q=%2_Bj؆ٸ$&#`eS6Ȇag qw~j~؆ِ1s?Om#2#`᧶m4$9^'h(l46m46 i5{Z 6b Ɇ FCl!ِ1FCF#CMFbNiFjFdC0kO16v916aȆFpNihD6d 6mצ6adc>߆nú᯶m W6Ɇ;~چ?O6d ^?|/_mhL6Vi۸ X6kjdCsJc84Vhm4&2S9Fcl1ِ1x/6cMȆyh" l lhB6d n Dm фl|ߢ \6Qhm4!2M`h 5?{U om`dCsJS6!c~#jFِ1xu#@m#hJ6¦&FS )|Tm)єln4uFSl)ِ1xh FSFS!c^)Em46֮' 01E/{@@l#lnºm 66@!cFF ьlecE^F3lِ16/LmьlF3hF3lِ1xhF3fFsQˊU521֍jͱdCu96cɆhhN6d ^7ú\m9тlD8BԍnPhm 27Z~F lِ1xhF F !cuJ Ni"˖51:%S6 !cpAFFD6d n#R6ȆmAAjAF0ٸ?bb9%)jF0ِ1 ``l#lF0m )pN V6B;&FSBm 6B6B!c}/m ! Q6BZsJ(SB6BP!cB\jF(ِ1x/ {PPl#l9l(|jc;ôfke EX"-c-cm,cQvNΖhXee,222gnaiemckӒjܴy^qj)uouoq-qkI5N}sK7T׸Ƶ'c%Zk\K\ZR1xoF-5%ƹ O+լeb9 ajaFِ1xo{00l#l| _FF6d n# S6Zv:7or[ CWOu/Rhm"2`h hE6d ^7ZJmъlF+hF+l#l8^jeb9jF8ِ1xu#\m#'2nmcdC}s86±Ao5T71"y8ll#lnDmD ۈ6"6"!cFFI6wtlbD~#jF$ِ1uۺHHl#lF$mD ׍HX7"6"d#d3u|ߚlϴ3x Fkl5ِ1xh FkFk!c~57Zm6Z ׍ְnVhmȫӷum`F-]xRvO[׆؎jv\F!c~7m6 ׍>nQm%a{NabN`_F_!cuJ_N髶K6d ~nv_xnv_F_!c֍j}x1ve31.}xxl#lxx~F<O6d ^7a݈Wۈ6ɆmCjF?qd515l?G6d c3Æqp?~F?!cg3~j~dC ~K8Vg·a[`hdlb26262eleleQvU.JqwJ)m)O@ݭXq9\J<ٟY3g>S-c,c^閱1oL,l\<˘e2go-Xsi֕C^_ 9[7>a2R]F+j:[7)$c\\[F뙹x|vo[7FH{3O.un$ծ#?4?SkkH<{^c璛:J<`3J}Gym}< ~Hbb{,c1!cu1C6d 7;͎Qm!2\16*u:!iZcd\cE XX!cuX1K6d >sXX!cQiy)bm#~iV#1NԍqnSm#2߷ǩm6Ƒ )2Nmc1lnTup8uO16aɆEㅍxx!cggƫm6Ɠ )2^mc<1lnTqpp~u$Ckc<1lpb1A)2Amc1lߘ j dC6&@6&`ȆaFW !~eI#lc"xdvMnLucDlc"ِ1DD!c~c"7&mL6& ׍nLTۘmL"{/nbLuc6&aȆ7&IjIdCuc6&aȆ+r&ӆ/dCkc1lH31& jdCd؋NVۘmL&21ژ1ۘL6d 3tp@16&cSUcbLϞMϞMQۘmL!21ژ1ۘB6d >Ls)!c\16r~cژmL%7SEݘ TT!cpSjSdCuc*S6bSɆFBihmL6Vܯ^ 1MؘmLSۘmL#21 ژ1 ۘF6d ^71Mmc1l֙O#|4lËl|O& ~楶mx 66 /!cp^ІچE6d 4PR6Ę.tX7mL6 ۘmLWۘmL'2Qic6cɆ1]mc:1lߛ3Dݘ  !cpc lcِ1xݘ  !cp3j3 ooebx 놷چ7M6d nV6ɆmxCj؆7ِ1 oh[mۘI6jkc3aݘ1ۘI6d >̄sLL!cuLN1ۘI6d ދ΄L,1n-^Dݘ,Y,!cpYjYdCuc6faȆm̂6fm6f胋lyabv0/%M6l/%1ۘM6d nc61[mc61llhcllc6ِ1lAO&>71@O Qۘm!21ژ1ۘC6d nc1Gmc1li~clc.(ѵr>Ll\tn\lc.ِ1\\!c~c.7m6 !> dc\lc9ՇCOLyߘyjydCp1ZydC6A6aȆypN1!q&>d#Vuy[dQ6|Ȇ>j>؆ِ1 lÇldٰ=磶c<k$2cޗ/jvn/>L/9ܭځ݁x|o|U}_7O_;\GszG1lw{홯1ۘO6d nc>1_mc>1lǜ|؆?XX:i&ˆ9(O6lI6 !c>j؆?ِ1x_m'2nmc ƥɟmb,uc 6` Ȇa6XX@6d ^7@mclhcl#lpM[&FqsSF蕵Ǔ7%@m# 2nm`dCu#֍l#li9%@m#XH6Rcb, ~BB!c/ 6b ɆBX7m,6 Xm,TXh|K0En8-Xd[l[b[j[f[n[a [B,c,c-c,c-c[,cm0vXele,2cH5kP􉮛?@q~* T׸@\e R>k\ *~X$l,6m,6 F`oHmcl|[EjEdC}"7/RXm,&,XX m,VXm,&2ߧ[ m,6 ͋a߼Xmc1lbhcblc ٨,L%o^%jK%dCuc K6`KȆX7m,6 !> 7/QXm,%qcKaXXJ6d nc)Tmc)lRhcRlc)ِ1xK6bƶ^^:gb,t>2e2!c癗癗m,6 `/LmclV̗ [1_ XN6^l1YcS9erlc9ِ1xXrr!c֍j˱dCpO)6c+Facx-j[-dCp1Z[-dCuc [6`[Ȇ߰al#l<q)#TԍPX7B6BP!c FF(J6d 6 hF(J6d 4Мml%%*=jC6B[Ɇml6ml6 [a/Umc+ltI|MԍmnlS؆ml#2 ئ F6d ncMmcliMmcF6upf#L66°0!cwhajaFِ10h#Lm# #2anmaƕchblkp ]mc;lnlucvlc;ِ1vv!c8ħvF8H4q &FmmcdC{p/<\m#'2mmcdC6¡pplchl)@1v9eSvm6v a|!cp;j;dCs8P؁mDo ]gbDFFA6d >D9%Bm#ۈ 2߈jFِ1h#Bm#ۈ$Uq)H8DmDbdC6"HHl#lnDºmD ۈ6"6"69OѾFΎ({<-c;-c,c-c{,c{-c,c-c,c-c,c-cG,cG-c,c-c',c'-c,c-cg,cg-c,c-c,c-c,c-cW,cW-c,Qf~͟SqQEQ1x5.J]p'c3QLnEE5NpOQhQ i+Mh1E/Zm#ۈ&2 mDmDcdCQ4썢6h!c/jN1B?;;;6vb;Ɇm6vm6v ?k>kSmc'lĝĝj;]dc{Nó&.Q7vKmcl|wݥ E6d 7}.].!c ֍]jd s &nonn!c֍jdC6vC6vcɆ7vm6w#l6m6 ׍=nQ؃m!2أC6d 4sH{6`{F)E&^o^^!c֍j{dC^oU؋m%2C|nU؋m#;7M}Y}Y}j}dC?>}>!cp}j}dC>oS؇m'we=&/~X7m6 /~/_mc?l~hc~lc?ِ1x~믍q@`q@mqljdCoP8m 2q8q8H6|kN1ql <<7.7Al ِ1x/z6bɆAX7m6 ?|>|Pm݆!sn$l!8R8da.Q~9qlِ1xq֍#jGdD61n%/t)G6bGɆgrm6 z~zTm(qlQhQl٘tu,XcjǰcdC%%S8m#2`8q 8F6d nqLmqlܿq\q{6cɆql8ِ1qq!cpǡjDZd#VQn{'D8  !cp/ lِ1\P8m 2<;Om6N gӓ8)l6Nm6N 8 mT8m$2'a8q8I6d n$qRm$ql ud5|qJ8mR8m"2EO^)lِ1S)S)!c5)=q 8M66xdXÞkjdC6NC6NcɆ7NjdCssV8m!VU|qFԍ3nQ8m!2S9l ِ133!c22Ψm6Β]58+_= wϪm6Β ìSZb8m{Vm,ql|N9 申jgdC딳prVm,qltܽϳq&91s9s9!cq֍sj簍sdC6A6aȆs8q8O6,X㼘S9yl<ِ1yy!c9 d- !l]yuaq.\ſNbmvٿuݿw\<7o:[wV۸ܡ{fʥnzwrG}zpX91:\GQ!c8ħ;]qš{w}w}w6bwɆaڸb8mċ^Y|1bhm6 ۸ mU۸m%2qڸq۸G6nĸ'z{pָq۸G6d ~F<#sOmqlw߭q۸G6d nqOmql\zEݸ}}!c9>Sm6 ۸mW۸m'2_އkjd@<=@ml,xlِ1@m<6 ?6`ƹ+x(l<6m<6 ~Pm!lxjdCsC8Uxm<%2OaxxF6̵a6$ ۆ3g3!c ֍gjϰgdC3؋>Sxm<#2_ 4Txm" hlbWpJml{W{WjWdCkWp Jml| S^m6^e;Shdb@Vxm&2S^9kl5ِ1kk!c8ħlVxm!7oh`boQxm!2OQxm!27~l ِ177[eRo{zfUxm%2oaxxK6d o[[!c8ħlUxm#̓~9RNo6aȆ$gީm6ޑ xmSxm#2_wjﰍdcx|j]Y'f>ޫm6ޓ ׍nWxm'27~{l=ِ1@u{l8^5MٞٞjdCpg-xlِ1x!cpjd#ab|k؏p Qm#l{яjdCo|o|Tm|$2ny89i: N>E|0w~X$}"v\<>3II}?ᄍx}}31k/OP,pq=Lw_~gϸ|&2+>ùZg\>׃gw]+_ \|Qm|!2m|!2+l ِ1wh-\16lonޗ`ޗ7w8mcks[Y[<,c1e,e,e,e,e,e,e,e,e,e,eXjXXZX:Xz؏ ,c=$>zr`WE˓׸X})BUtO _{|J_{L|%'cSǀ_lQ<]TLLFlh#Fll#6ِ1֮NׯVۈm&2ڈۈM6d ]plO]plF1aL8;8hGm#lnāu#Fl#ِ1xoFq6`qȆm6 狀/11 qjqdC0{,\16lUۈm%2qa݈ۈK6d ^7ºWm#.F6MVnhm  7X76ܰ 7!cpnІچF6d n pSp6FFKf41=ެ'ڛuWp6Ɇ/rDmcdC6ܡ w wlÝluچ;lt\t&F<1ăsJLbNI 甤jIdC6BI6bIɆ+r&F_{ZIdC6BI6bO>ab$s}' SEeH HF6d n#Lm#l|NIdjɰddC06b8m:'KZɰd &FrQ7ú\m#9lM{jɱdC6C6cɆHHA6~8“e O{)6R`)ȆMMHA6d NI))6R`)Ȇm6Rm6RH)FJX7Rm6R ))ᜒRm#%lM {єj)dCpOHHE6ns>hb"b+y6RaȆTpNI HE6d >sJ*TF*!c8ħzTj6~ jFu?jZvn/lj?g/:[?o.G~;[=׃t[ 2Zԃ԰VԸ/czփjq=HMd ^RC"RzDyyj4dқiDV4ji4dCg i6`iȆ (Fl# ِ14F4FZqOGӚi=zwUHm%2iaHHK6d ^7ºVm#-li>"FZl#HQ7O# Oөm6ґ ]@grөm6ґ Mi:tF:!cG:HHO6j&w&FzW0KO6Ro"FzFz!c֍j鱍dCu#=6cɆI{j鱍ξQԍaQmGlG!cj?b? QmGlG!c#?mmd AKOabd pAm#lndu#Fl#ِ1VAm#lFh#Fl'LD ֍6~6~"2 oᴑajKCk'l'!cp?A?mmD6d n'h'd*KbbdFFodTȈmd$2f'#|f'FFl##ِ1x/62bɆ):%FF a΋FΎLxdeeee尌崌岌嶌屌嵌峌巌l+j2V2V2V2eeeeee0 ƭibIOeR׸Le'c93k\&\2Q1xk\&u˄k\&q2ߧ2k\&ܦ&F66aȆF6X7md6 ׍lndSȆmd#27~#F6l#;LWJx&FvqvqvFv!cmd6 mdWȎmd'2S9%Fvl#ٸ-VQn&F1sJF!c֍j9dC6r@96r`9Ȇr}j9d#uXW9Ŝ)96rb9ɆȩI6d ININFN!c9%'Srm6r zUl#X\j\dCu#6raȆF.X7rm6r !> 4Rȅm& 6u[ԍܰnVȍm&2aȭM6d n#7[m#7lFnh#Fnl#8ʖLsJ ԋUȋm#޿潉OmSȇm#27~#F>l#ِ1|F>|F>!cp|jdvޙF~_m#?lyyjdC6C6cɆm6m6 ?uycbFF!cQ֍jdCP(m 2Q(Qnyȫ9[7y}Gٺp&)Q.\ſ*pw]9(vP\<>uae(w\<ؿ+yA=/A!EϜWH? G!/A!21 A!\ Bjp=(D"d {!{!BFak =71 jdCsEaX# m6 M õiaFa!c8ħ- m6)?kbqFaQ"jE"dCߡߡQ(m!2#>Flِ1xQ)E6`?;71~=ϰYmglg!c` Ɇϰn33ِ1x֍6~6y?61 EjEdCsJQ8U(m%27~FQl(ِ1@6m6~!m>Wzo_6~6~!2#y16~6~!2Q&F __Ȇ_/F1SBnRl{m6 SuJ1bF1!cN>16aȆ')')Q (N6NͰ⾉Q\w6cɆalupڸyO16cɆA6FVppڠ'Ck8Ql|N)jűd#q%ٺl] F !cQ֍j%dC06ʻb8m)'aZ%dCpO)%6J`'UhU~W__ɆaNA1bhmmJ6d owpmE16~6~%2ºƯFI1q&FIQ7JºQRm$QlnuFIl$ِ1FIFI!c8ħFIF)T.ioDQ 6JaȆװF)lِ1R )6JaȆm6Jm6J//01JQ֍jdC߽߽V(m&2a(Q(M6d }Ji}JiFQщ'eDQe6`eȆFX7ʨm6ʐ (mQ(m!2_Ök2jedc󗥮e]s&,ٰ-˪m6ʒ eaQVm,QlFYhFYl,ِ1FYF91a5S.ij~6aȆF9X7ʩm6ʑ (1d'CkQl(rj670-`hdlbjfnaiemckgok`khkdklkbkjkfknkakikekmkckkkgy?LyqOZ:5No D1T^]Wjp+qq+O5NkpMU^]Wjq5<*<\QAWAmQl| j dC_8UPۨmT 2_SUk jd7;,:kbT6*B6*bɆmT6*mT6* ׍nTTۨmT$2C|hFElXQ_m>Ql;;jdC~g}F}!cQ֍jd\E FF!c~7m46 بᴑUR'Ckрli  6` FK71uJCNihH6d n!Pm!ѐlhj dC{_ WCF#.LF.f؈l~F#lِ1FF#FF#!c֍FjFdCpOՍFjdoLƢn4uFcl1ِ1FcFc!c^1Em46 !> dFcl 8Wё&F׾Y<6!/nhB6d ދ6h&F!c9 Sm46 )MDm єl87.o61^)Em46 a5lSFS!c֍jMdC0koӆ큈jMfdnǤdb4#b,ьl!F3fF3!c ֍fjͰfdCF3o4Shm4#23ơm46951~97m46 ׍n4Whm4'2ahhN6d }5Whm `hhA6d nBmтlnTtp8pC#chm 27Z~F lyD֛-E-6Zb-͓]"_딖j-/-a/Rm%<%b9%SZm6Z2,\h%l6Zm6Z ׍VnRhm"2SZ9F+lِ1\öRhm&sJ6F[AmzUhm%2mahhK6d n-Vm-іli m6bF>zתNԍvnShm#2`hhG6d ދh;vF;!c9Sکmôǣeeeee7XWX7XwX^ޖ>~A!?,cZ mnay?L{qݲ2^5U{ukk\{q2Ƶ5=8^]מjګk\{{s`bbɳuj"]/u\<>u A};ᄍxٺp^렾pӑ?/6:z׃te ^:zQ#ɁZDG\:!> T:mt6:hbt6:A6:aȆakaF'lِ1}}6:aȆ.F'l3p>8(,lt6:mt6: ~Ym3љl|$6:cɆFgX7:mt6Y+G7"]v.mt6 hht#\1bhmt6 )]Em хlFhFl7qc ِ1}~S lwِ1@oja]ɆjAqLbN 甮j]dC0u+ӆso30wZ]dCkӮpmUm+ѕlntuFWl٨:uv>&F7aMmэl| Smt6 mtSmt#2`覶 N6F}]mtWmt'2?N6d ދvhwFw!c֍jݱd#o4sL{j=dCFoPm 2_kj=dC6z@=6z`{eb.za/dC0upڰ]mwlw!c^w؋;;ِ1;S~WI6)US)=Sm'ѓl j=dCFOoTm$2詶E6Kԍ^nRm"2KKmыl^j^dC6zA6zaWM21z~77zm6z ׍ްnVm&2a譶M6d n7[m7чlЯN519Sm6 ?_>_GmчlFhFlِ1x/}6`}FxTbb%%Um%2}a諶K6d N )}6b}ɆF_X7m6 dbu6aȆm6m6 ׍~nSm#2觶O6/8E͗\F~G/m6 )_m?џl{jdC6C6cg/kob ؋Pm 2~~lcِ1!cpjd(0(~_{'}jdC@@!c9e Sm 6 !> dc@lc٨?m^cLAbc1D6d ^71Hmc1l hc lcِ1yA A`1RX}FkD=Xmc01l`hc`lc0ِ1==6cɆ`X7m 6}K<4"~g'ݞ!jC!dCs8 Qm !2C`1B6d B6lC6`CFܡlCE PP!c1֍jCdC6BC6bCɆa:b$6K16b z?j` ׍?`Cml!c?j` l\oqqcCk ?͙Qfj$ WEia._.v݁xz=\GwO~LҟtM;?ŵO\{qą2zz_Ew_{Z=/r c/8W/adypÄa0a0!cap/|0lcِ105Lmc1lF}W>F ad̟^2166VlmmM6d ^7uoɆa]16u~C>F dG^]sS M1N6d w1N6d nc81\mc81ln<+gb8m:YYNm !X7Fm6F #`1Bmc1l|Nj#dCppcb #6Fm8zM/0wqcelelelelelelelelelelelele26262miemckgZ,c-cB{_FR`Ά̟H7;͎T׸ƍ'c7ָ7׸Td ^F7R]F7ja?(ո7F]+wcbRm"2_SkQjQdC(Rm"2+@6Fm6FK-zѰ71M6d hhh!cpjdC6FC6FccƜӞݲ41c1jc1dCk1pM5Fmc 1l|~ ܹ1C6d >6ƨm6ƒYfbsX8Um%2[ cc6bcɆXX7ƪm6ƒ ׍X8ߚ)D8q8!c1֍qj㰍qdC8؋Sm#2㠍qj㰍dz_;ca1O6d Ӌqp8սTsň1O6d nc<1^mc<1lxhcxlcp(.&Q7&1Amc1l|2S&mL6& )2Amc1lF(٘1ۘH6Zeo'c1ژ1ۘH6d 3vpڰǘ1ۘH6d S7b|?˟.F D!c~c"1Qmc"1lcS&9e$lcِ1x1 6&aȆA67tp(~+%3ƈ1 ۘD6d $hc$lc2(U&dQ7&ú1Ymc21ldhcdlc2ِ1FTW v^ nSZdCdhcdlc H21S)jS)dCoLQۘmL!2Sb|ELj1ۘB6d W݈41)jSdk3Sc1ژ1ۘJ6d ^7º1Umc*1lF%W }ɒƈ1ۘJ6d nc*1Umc*1l|jebLgr36aȆmL6mL6 a54i4!c^t1MmcE6rXcKK^R6ȆmxA^j^؆ِ1ozBR6ȆmxA^j^tmsc8#31ۘN6d oLtt!cSSmL6 )ӡjӱdcU451f3j3dC6f@36f`3Ȇ]΀.gm6f ۘmPۘmxu(s7S6 o!cpІچ7M6d nV6Ɇoh[mۘI6~glMb2Sfm6f L.36fb3Ɇm̄6fm6f ׍LvC^ٺx۷u`1.\܍]ٺYv0\<5=\G,ݟe ={>K}gz0Wg?To`6w6| jq=Md llٸ&2}61[mc61ll1GؘmQۘm!2??џ1ۘC6d 69!cps9jsd}̒s\\!cpsjsdCkӹpm:Wmc.1l{\j>؆ِ1?|6| !c}  l×ll{L _q&IU6|Ɇ/j؆/ِ1x/ {Q_ _l×lnBj؆xuܨUM ?Q7`S6ȆmA~j~؆ِ1x/{Q? ?lÏl܆᧶m'Lq1_ԍnWۘm'2+ӆ_oBLj1ۘO6d >̇s||!cpj sU21Eu_m'2nmcdCu  lßl܆?᯶m, A{kTX l,6m,6 .PXm, 2 `XX@6d nc@mc@6npN9#@a6@m# 2jFِ1h#@m# 266d#S'-+51~c!7m,6 ) ᜲPmc!lBhcBlc!ِ1xXm,TXh|?yatoq#EŖ%e喱 J*jZ:zXe,222222jjf m[vX",cRk(s 5.׸@q2qR13@u 5.jqx[D6}1CIcy"lcِ1"Hmclfk}#"lcِ1xoXXL6N阴&bWodY]L6!xblc1ِ1xoF6cɆaltbXm,&2h1Xmc1l$y&Q7Dmc lٳ%ٳ%jK%dC06*b8mбIcXm,!2@K6`KFnE31X^WPKƎ8Nn,UXm,%2ߋY bm,6 Z O-UXm,%2XXF6VEMeb/f܋Y XF6d 3vpx=/kÄbXm,#2`X XF6d >,6m,6W4;XX.~n'ݺj˱dCp\mc9lnTup8uO16cɆrhcrlc|zMnuc lcِ1̜ivk lcِ1LݨakCkcl|X"%kLA#U7L1"F7gr6 !cuJ\maAdC06b8mT8EZAFِ1x66dcp71VuJNYXI6d i#ÂՖ#Jlc%ِ1)+6Vb+ɆJ*A;pLU*hc*lcِ1:e\RXm"2QF16VaȆEWA6VaD|jj!c` j!c9+uJ16VcɆjvC^kٺl؁QXca.Q֭\kg:[9@k7O_螯Q5{eU szkE=X Z_Z2+¹bZ\֒]1?{V F %21Bk6bƢnbku2SXm#2XXG6d lض֩m6֑ XmSXm':X/l6֫m6֓ Mõzz!cp롍j뱍dC}zhczl#lF0m 66`!cpFF0L6d ^7``l#l4lL&Fmm`!dC6Bl#lݥ> O=m`!dCu#Q66Ϝ ll66ml66 `Amclnluclcِ1xmlP؀ml$G8_obl딍pQmc#l;;jdCuc#66bɆFhcFlcو4mMM&hc&lcِ13;^&M&!cpMjMdC{ᛠMjdLbN jdCuc366cɆml66ml66 )j-dcDҘ[D-!cp[-j[-dColQ؂ml!2d Emc J6ouSu#֍PPl#l hF(J6d ^7BaU6BɆPh#Tm#J6kS;UԍnlU؊ml%2_nkحjC0ijCsVhcVlc(Rcˆ4 [ݦ F6d ^7MmclVNZ6aȆ)۠mj۰0{Ip&FSm ׍0X76°0!cpaFFF6d ^7 00lc;XHjbluc;6cɆml6ml6 Ãl'j۱dCuc;]mc;N6[z-".pomcdCp#\m#'2Ea/m FF8ld|bgw3;6v`;ȆءA6d =؁m 2Sv@;6v`d }lbDwDwDmD`dCpgD#ȆhFA6d 7"6"!cmDmD`d7 a#RW'HHl#l߈FF$I6d oupڰTۈ6"ɆHh#Rm#n~? z#eyGeleleleleleleleeeeeeeeeeeeeeeeeeeeeee0QT8Oqy?(7G9J]p'cuQl]EE5NtQp.J]p'c( ָ(u_4H/lx&FxH4|HF4M6d 7Gþ9Zm#ۈ&2aomD FF4lI5C7cا vm6v  T؉m$24^NN!cy'Smc'lLlM]9 }:..].!cywm6v {16vaȆal21]jdcwHKbE6vcɆ9slnlc7ِ1x nn!c~c7[mc݆+H~nIE챋0w~X5bsuqt7OͿ=߃^Cg+f½ٽ껿׃te c=^%2+¹bZ^\{j{}di*31b+m6 muxU׶6p1\Shq)RJ8+P\ !DА!`@@ssq_w>=w1ǜ{͵6NcɆm6Nm6N j3d祘>EL3hl ِ1sgsg6`gȆm6Ψm6ΐ 8mQ8mόznbFF@6d c3@m# 24}jFِ1mm`gFKb;>51 gjgdCsY8U8m%2,|Yl,ِ1x8 mU8m/|db=@ T6ɆmBjF ِ1~g T6ɆmBj9hzD89s9!cp砍sj簍sdCu6aȆs9sF8t{6&FmmaAdCAp/#Hm#"2mmaAdCu#R6Γ2Tp8/pN9q8O6d n{m )pN V6ɆF0jF0ِ1i4Y2V6BF}料01BDu#Dm#!2mm`!dC!p#Dm#!2SBl#l,i|&F mmbdCsJ(SB6BP!cxO)jF(ِ1wFF(F6>㒉>ŬFuG"{S6ȆFajaFِ100l#lFm\  a&Q7.qAmqln\ulِ1  !c^qAmql!qY73;yEE!cpjdC{_EE!c~"qQm"ql:]o&%Q7.qImqll%x%lِ1K%K%!c9qImql\6.m\6w=ib\W+!c=W6`WȆX7m\6 )W+jWdk31WقjWdCUo\U۸m\%2Waݸq۸J6d n*qUm*N6ZWyfa#ًN6lNmcdC06;c8lcW6ɆWF8N6d n#W6K-8`b\s)w)ȺqMmql|߸q ۸F6d >\s5k5!c~qMmA6=&Fx8>KmD ÍMmd6EmD`dCu#֍l#lFmD#G61"6L݈$^"7˛mD ׍HX7"6"H!cpFF$I6d >DBjuQncVn71J]q۸N6d 7wlض஫m\6 a/z]m:ql{uv17}wᡃL 1|學q.\ū]3I7`e7w\܋}3I7=7p=I<eA b&I7q=Iw_돛pqS&7ɁMXnE&1;oB76nm8_}E.[sܶݱݵEYYƢ-c1XC#cSXeee,222`{e{m{cK%Y[>XrjqOYkn9_-q:K]nwjo}[w ׸[Td - -uk-q2_+݂5m>{jMb}om6n ۸ mV۸m&24w[m6qlmhml٘o7+L;7{;jw;dCw;!c;plِ1:qGmql9.x.|]l.ِ1]~q۸K6d ~.D9%Jm# ۈ"2S((lو|H&==={=!c6a3_16aȆ{pNq۸G6d vڸqۈ&}$,>Ĉ6hhl#lٳhYF4M6d ^7a݈Vۈ6Ɇhh#Zm#ۈ!wO/<0#8Ĩm`1dCF 7b6b!cp1FF C6d n#ڈQۈ6 !&E/z6cɆ):}l>ِ1}q_m>ql߸mW۸m< annb<u6`ȆX7m<6 S|!c@6`d>F,mĒ ;(;(Vm#ۈ%2N ~mĒ ׍Xh#Vm#xH6U&Ca!Pm!lChCl!ِ1<ŧCC!c~!Pm!lT|q&#Ny)6aȆm<6m<6 ׍Gn6ޫm6>̃y^ pN@6d ދ~!cpjdCuAm݆0W~axgG2#e22js[<,c1/˘e,e2k󳌥[XZY[2X2Z2Y2[ƲXƲZƲYƲ[>aUncŰy5?I/_u2/_2/4ϩc?1z;Zoϩc_b9qspKN6ЧqQmdTȈmd$2ȨH6d ^72ºQm##lFFh#FFl#8/q&F&a#Im#l{LjLdC{^x&LF&!c9%Im#lTk#Lb a3md62 ~Ym#3l| a3md62 ?#ȬB6v']"ld6md6 ׍,ndQȂmd!2S9%Fl# ِ1ȢJ6ZTU)YᜒUm#+lEzͪJ6d n#+Um#+l|_4+Um#+l)لlF6lF6!c ֍ljٰldClpMm#lF6h#F6l#;p&Fv 󗒝lRmd6 od6cɆE}jٱdCsJvh#Fvl31#MD7>S ln|gja S>6>6>#2l|lr)25CY7{sƤyF!cp9j9dCFoPȁm 2_6rmoarZ222222V2V2V2V2V2V2V2V2V2V2V2V2eeee XyXXEX%XeXXUX5arR,hC%).96Ark\N\rR1LNuˉk\Nq2r/5.'8׸T׸xE6Vx~Z9uO#٘_h\j\dC_.8Rȅm"2s9F.l#ِ1xߜ ȥ M6-m&Fn ۹6rcɆY YͭM6d n#7[m#7l|ȭC6ޕmGQȃm!2_o|F>!c֍|j|dC +:;c8l"Ck#lF>h#F>l#?qF~F~!cm6 a_m#?lF~h#F~l٠&FaQ@mQl|RS m6 (mP(m 2Q(Q(H6jLszӆ)ɆT(m$2lT(m$2Q(Q(H6d n QPm݆W!s.9l]!X- E0wextPH݁ǧl]!x ~!7tV΋{^H} zPywz\Q_׃te ^ C zP|mZM E01= C6 cEƺVgK("="jE"dC=fcQ(m!2Q(Q(B6d U(Q(J6rrEa(Q(J6d {Q{QFQ!cxO=_TTm(Ql|O(QTm(Ql,xQLԍbnS(m#2߷(-m6 `QLmQl,mS(m'?fbu86cɆm6m6 ?^>^\m8Ql(mW(m S9nQBԍnP(m 2SJ9F lِ1w%w%6J`%ȆF FI&FIs/$H]_JIFI!cuJIN)Q(I6d >sJIFI!cQ(Q(E6,̺(%RpN)Q (E6d nQJmQlF)hF)lِ1xQ (Q (M6/\b n&LhH֍jdCFioV(m&2Q(Q(M6d >6Jm6>'*lso|6>6>'2údC\msls!c5jceF;L2}e˨m6ʐ ׍2nQ(m!2Q(Q(C6d ^7@e6`e7C.0(+FYX7ʪm6ʒ e6beɆm6ʪm6ʒ ejerd#0&F9ga`*G6 ]c`"(Q(G6d -װ6aȆr(Q(G6d N)mS(m|A6jn}ct NSPln aBm l !cp_@_m|m|A6d o|m|Ql/KM51ʋX(~cFyl<ِ1x(FyFy!cp塍j屍dC.C6cF-&{,+XVPۨmT 2k+ [K\AmQl j dCmTPۨmT$&4tQiܔdh"QۨH6d ދVhEFE!c++mT6* ۨmTTۨmT"`J^7*mT6* ׍JnTRۨmT"2_TJjJdCkJF%JFeY~LFehFel2ِ1WeUYm2QlnTuFel2ِ12QYm2Qla&FQoTQۨmT!2@WQۨmT!2U`ݨQۨB6d NmTQۨmT%^D\?Ĩ*lT6mT6 VU6bUɆmT6mT6 ۨ mTUۨmT#f@ߨ7mT6 )RMmQl| [ amT6 aA6m#S/-c5-c,c-cu,cu-c,c-c ,c -c,c-c_YƚXƚZƚYƾ5}ckakikekmkckk2222~Ts4ϩا骫k\u\S1W5:qթ@_uuk\uq2߯k\uudi/761jިjm6j ۨmPۨm 2QڨQۨA6d ޮmPۨa89[wQ~K}]+dzu_>K/=>]|dzu_»i^.O8_Ԥ{~%]  ~MݯAM25a=vP׃@&QS-&5IAMhFMlh|MZbQ ۨE6d o_ Rۨm"2Q ڨQ ۨE6d nQKmQlU*tv;1kFml6ِ1:6?jm6j kutmFm!cFmFQj܋mL:nԁuFlِ1R)u6`uȆmԁ6m6 ׍:F:F]qpȜL-MbQ?m6 ׍nUۨm%2QڨQۨK6d ^7Bu6bFr}mb6A6aȆF=X7m6 W~WOmQlF=hF=l>O3Q_SuJ}F}!cQ֍jdCu>6cɆF}FK421֍j dC6@ 6` Ȇ=k=kh@6d }_hFl!X}z&FCQ7ºPm!ѐlFChFCl!ِ1!\6Thm4$2 j Fd#ģgW61֍FjFdC6A6aȆm46m46 FjdczO~ib4# LcFc!c^1Em46 h m4Vhm4&2f1Xm1p9&]5+1|甯66"2WWdC7R ln|m|фlllP%8[khB6d n Dm фlFhFl ِ1&F&FSE6SʛMEh FSFS!cSSm46 W)|TSFS!cpMjMfdǣ519O1uو9^i hF6d ^7Lmьl|j hF6d Nim4Shm|M6ns^_údCgrgrVl|kdCukhkdMMn4uFsl9ِ1xhFsFs!cp͡jͱdC6C6cߐb11uX7Qlv[g ߨm|m|C6d aQl77j`-F#41Z8)fZ;c!c F !cp鉶F lِ1xhF F !cF FKqxy-žhK/Rm%ђln즴$Rm%ђlnuFKl%ِ1x/hhE6_ebyhJmъl ;@Zm6Z ha{k+VF+!cVjdcL֢nuFkl5ِ1̜aFW +Fkl5ِ1xh FkFk!c~5Zm5цlwmmm6`mȆ)m:Fl ِ1xm6`mȆm6ڨm6ڒkhb딶pVm-іlFg sFX_16bmɆA6rvrpXZP_16bmɆF[v1ߚ3Iᘏg3ɷjE~?⨷V[sqOy&[+k^c{_{A;3ĺ7ډ+ک~;\ݗ1;wS;hA;r cvp/ZD;\ڑ?hhO6\cf|cb=f{Xګm6ړ [6cɆɶړ Z{F{!c>=^m=сl88 蠶@6d Gwpذ=:Amсl|?:mt6: ׍FFG#l@GsN1)ɆKjdC{^xGFG!cpjdCj6}h" xG'9:[ƺXƺZƺYƺ[zXzZzYz[XZY[ƾ }olbjfnaie26262el/s\ϩ8w 줮qpD5N053~Φu58͝`I]:׉jѝ`뤮qיliqOh2;þFgl3ِ1x͝6:cɆp묶L6d >u6:mt6/]tbt}s7wQmt!2袶B6d 7vQmt!2_Su6mt6L41֍j]dC6B]6b]ɆFWX7mt6 B]6bFr%%݄nF7nF7!c6aȆuu禮 F6d nMmѝl;x讶N6d ^7ú]m;ѝlFwhFwl;ِ1讶A6{@C=`CmуlFhFlِ1)=6z`=Ȇ=mPm$R8MnuFOl'ِ1FOFO!c^'E{m6z  mTm"V 襶 E6d I/ I/^F/!c ֍^j^dC^jdczMFohFol7ِ1FoFo!cp﫷Fol7ِ1x/譶C62GOGmчlFhFlِ1)}6`}ȆFhFl/٘9tPV[&F_Q7ºWm/їl j}dC6B}6b}Ɇm6m6 4骝419)#gm6 ׍~nSm#2觶G6d mSm'c26/ְFl?ِ1xFF!cpjdCu?_m?xxe;bl$Nm;l;!c32XSl|\|ِ1;h;ﰍdD!c9eSm 6 S|h_tlcِ1xm Pm $Qm61w 1H6d nc 1Pmc 1ln uc@lc ِ1x11D69c`1D6d o A !cpAjAdCuc1Hmc=ٸpn&LLjcߓ ~{ﱍɆ{_߫m|m|O6d ^76WL6:&`Q7ú1Xmc01ljdC6C6cɆ`hc` !!l]uyn1.\ܕ]} !v.~} !?~ŽؿdzuC=Cp=Joc1ΡU /c>b(# `(91x= P %2d(1Tmc(1l(ݪMa{a{ajðadCaF Sm #21 1 F6d nc1Lmc1l L}z^ca1N6d 7vS M1N6d o1[ Wm '21C6c#ʞeb=cPm 2_j#dCuc#6F`#Ȇm6Fm6F̮-}01F #j#dCgrG3#6Fb#Ɇ' ;Бj#dC돑H(xjc86 W1 E6d ^7F1Jmc1l(hc(lcِ1xmRm@6<,i|?dCggPl|dC6~6~PM6ƆWz1Za/:Zmc41l|2SFm6F  mVm&2SFC6Fccƫ~_cbuc c6`cȆ71jc1dC6@c6`cȆm6ƨm6~$跥LƏpGɆaޣa#|##ِ1<ŧl##ِ16~6ƒ-&.31Ɗ^t,EǪm6ƒ )c2Vmc,1lXhcXlc,ِ1Xv\a4ouc=-c,c-c,c-cS,cS-c,c?YƦ[~Ͱbi26262elelelelelelelelelewR2raQG%ihƍ5n88uk8q2q`qpG5N`q7l8~"a1^5xx!co<ƫm6Ɠ ᎇ{6cɆ㡍j㱍 d$&[Dݘ !c1֍ j dCuc6&`Ȇhclc"8sfDD!c1֍jdC{DD!cy"1Qmc"1lЯR41&9eS&mL6& L{16&aȆ$X7&mL6& sl1Imc1llx1YԍɰnLVۘmL&21ژ1ۘL6d nc21Ymc21lnL6&mL6 G3g1Eԍ)nLQۘmL!21ژ1ۘB6d )!cpS)jSdco7dbL{STT!c~c*7mL6 Sa1Umc*1l|2ژ1ۘF6}1M)2Mmc1lnLuc4lcِ1i4i4!c1 ژ1 lcL6@? ۏِ1x ֍6~6~"2S~sOj?a?  Im'lc:ꕻ߈Q&tQ7ú1]mc:1lnLuctlc:ِ1L/aJe+tlc:ِ12ژ1lw=k&^dcJb)Vln j?c? )?9gɆj?c3ƛglMb2Sfm6f UWN_6~6~%21=jb ¹W__Ɇm m+1l\IFpc`ݘ1 ۘE6d ~n<[7Kmc1l"},lcِ1Y,YldӺt6\Vۘm&2_̆ll!c9e6Sfm6f ?fC6fc F'7Q7~u7߰Ȇah1$@s looja  Mm7lc٨J}1G<<>,s%!c֍%jK%dCg @K6`f?]]~w߱Ɇmm;;ِ1<ŧ6~6~'2]mwlc)وu-_TX m,UXm,%2XXJ6d >,sRR!c~c)Tmc)ltYy&2g/jVȆmELmclXej˰edC6A6aȆe2erAo*kb,p\mc9ln,ucrlc9ِ1r\mc9lrhcraoaVX2eleleleOZ:zF&fV6v_]ݖ=}CÖ#ìZѝK?5yFm8c=ȧWWk \VP1+5nq+|[׸Td ָ+F˳01Vy%Wm6V /~/Rmc%lJhcJlc%ِ1XlTOą"&3d#ޫWxY7Plj` Cml!c5j`ޭ)bf41V ֍UjUdCs*8RXm"2 X XE6d >6Vm6V|&jg0&U^m_\E>Zmc5l|MVm6V V5jj!cXXC6ޯWC.ck`XXC6d nc Fmc l| _XC6d nc Fmc݆ןl:G<['umEgZğv ?;0t wT?w\܋v^?O\=kAY /k{_֪Z\ݗ1c-tV`-kɁY EUXZ!ctBk6bȆᒋ g219-̹l~c:lcِ1\6aȆuXXG6d >W6֩m6֓)m?kbzz!c֍j뱍dCp^mc=lzhczlcHJp.iì?6 ۏmP؀ml 2ؠ@6d cn= !c9eAmcl ɵQ?6FF!cpjdC0F;g +9_bhml66 ׍F&ā~&&ыn&M&!cpMjMdCS6ml66 ? ؤ L6kYԍͰnlV،ml&2E7^tflc3ِ1<ŧ)66cɆ;7C66cddƻ[D/[6`[Ȇml6ml6 mlQ؂ml!27@[6`s7KTMVhcVlc+ِ1XlؚjC6B[ɆV6HM)Mmclnluc6lcِ16Mmcl|NmlS؆ml'_;Lvhcvlc;ِ1ko]mc;l{j۱dC6C6c;kӓ21v;j;dCpCmcl|cءA6d hcl/Qz&___ja ÍE6lmmE6d OՍ66"276R I6֧ u5)zѝݩI6d mqXԍðnV8m&2q8q8L6d >saa!cpj6c3I>1gjqD-]맋LuD݁ǧx&\Q#o.͓9G;?}}9jy?1q ߖSӖ3YXee,2v2l Z,c,c-c,c-cW,cW-cᖱkXeee/Gv= nr)GżvkGU(׎R1Z(\+U׳x^;JL{,Gae;lGv*Ga;qGqsltK)8#s 9q 8F6d r S8m#2ߛ=fm6 A6aF?v~q\ԍnW8m'2q8q8N6d ^7úq\m8qlqhqlXշۏ'fupœ_w$.nP8m 2q8q8A6d ^7NqBmql h lo'͏}gϞ77ِ1 GoɆ߰n77ِ13Ixgb: tRm$ql|$c9q8I6d ^7NºqRm$ql|$qRm$qlPӳ8%S8q 8E6d 7Fٰ=q 8E6d v R8m"2_6Nm6Nn?8ܷ7;էƝێțrZm4qlnuil4ِ1r)6NcɆm6Nm6ΘƓ|l51Έt]3jg3fV06:8c8l^{Fm q׊nulٹ1r8q #/. . P6Ȇ)pm ׍X76!cpFFqlM:7~Yl,ِ1YY!cpgjgdCBg6bdW~#F116L$S Mu#Pm#$2=~m )pN T6ɆF m#&9qoS8m#2E^9lِ1\ÞS8m#2EA6aAdñhE_JٰI)Hm#"2AnmaAdC6 l#lFm']8/8q8O6d =y=yy!c9܀6nm6n񬫉qSԍnT۸m$27aݸq۸I6d N )76nb7ɆMhM a0w8qۖ;(=Xe,2v22k{h{d{l{b{j==[^X^Z,c,c-co,cw${anQ+x ̟---uk-q2q`qpE5N-R׸[ݢ'cw ָ[w ֹݧumobt>mm!c}pml6ِ1w6ncɆ{mQlmM;Awໃm6 w`|Gmqlo;jw;dC;;]8UYjdC}oW۸m'2qڸq۸O6d c#Qٸqx@6/(Zx 7jdCu6`Ȇ)> <!cxۈ%QܫfbĊc̱jF,ِ1x݈u#Vm#ۈ%2nĪmbdC{_FF,l*CC!cCa[<>Txm<$2axxH6d ^7B6bƅ]R`b<s#8emM'n"^m#ۈ'21㡍xxl٘Ujx\9LpxxA6d G}  !c@_@_m6^ /j/d|fײ/E/6^b/ɆKX7^m6^ S|xxI6d >6^m6>db$ FF@6d n#HPH6Ȇ8$m$` dCsJm";.lx%WpNy xE6d nJml|NyWjWdCuJml|*A4&kNy )6^cɆm6^m6^ x mVxm&27^C6^coFt7oĜ)o6`oȆ{7}xC6d n Fm lhl#lb(l$BjF"ِ1Dh#Qm#H$24P/m$ 2HTH6ޒK#-eb߯߯Uxm%2S9[l-ِ1[Vm-lx mUxm#hjbu6aȆϹ\ߩm6ޑ xmSxm#2_6ީm6ۋIFm$ H66$!c~# IjIFِ1xm$m$aFBg{A1ދ5{}xO6d o{{!cp{l=ِ1{W]ߚD!c~7>m|6> S|@6d gQ@6>m|мFFΎd}Gr˘e,e2fsyX<-c)-c^1oX*˘e2gKm󷌥eeeeeeee}f8%+25CW)7qɼQS9N%F5Nָd{dި7Sǀ5.b8?g T1lr* #7{(Frl#9ِ1xߜ6cɆ{ި7JHN6d Hp!Y=m&mm`.dCu  lÅl|.j.؆ ِ1 hEmHA6~kfc#7f oj)dC6R@)6R`)Ȇ)> 4PHm 2S@)6R`d#=51\E W WlÕlEWoچ+J6d >9Ump%27\ W WlÍl8~ _&lAnjn؆ِ1^7ڋqSp6ȆmAnjn؆ِ1xp66ܰ wm͟muF϶mcdC0h[g c j؆;ِ1 wh]mp'2aKV׵;?&chmcdcia7nnxᡶmx P6<Ȇ{Q؋zmx`dC0629c8lfҽiQd lÓlS$auSS<:Sm$216:~pпbhmxbdC:멶mx y~)jFJё51R9%%SRm6R )aRm#%l|SRm6R y^a#.d]MHi8E6}K-.\ܕ]l9K\ŏ~<[ラ{ᄍ7OVyqT oM|₡ܷ0]7}Fo7j޸xްVDxz୶m"bb3F3RHm"21S3F*l#ِ1TF*TF*!c>"6Ra>d>N)(vwOGm!2mm`>dC6|  lÇl|/Q6|ƮoU_o̪چ/K6d >9Wm%2 mmbdC6| _ _lÏl۱S&~nma~dCu ? ?lÏl|Oima~dC6 ? ?l#5X11R=pO+Fjl#5ِ1FjFj!cpjdChj؋VHm ?娉/)p⯶m )pNW6Ɇ-_m'21K6ҐS'?;Nke62c Q Sh05DDE5zNtwD "_7kݕ~ks~~bbu#96r`9ȆFX7rm6r 9`Cm#ln8cZ9d#WM⽌𽌜j9dCssTȉm$29g&>sNFN!c 瓁dd FNl#֛s\p3F.l#ِ1xF.\F.!c~#7rm6r ԍ ߏbhm6rI[mb{_WnFn!cwvrwvrm6r a[m#7ld#3FMw*]ZoSȇm#2_|j|dC<6m6~9}_)ᜒ_m#?l| am6 SuJ~F~!csC6cndcifnnᦶm )npNqSp6Ȇ 7omandCAnjnF8jQ@(mP(m 2E ^Flِ1xQ6 `ȆFhFl 9l}MFAhFAl ِ1ҰɆ/lAFA!cpjdCu QPm Ql]H;hQH#\#\HmQl|N)BjBdC6 A6 aȆF!hF!l0X>M¢nuFal0ِ1̜7\Xm0Ql( jdC6 C6 m_'0s^|C6lcm`>dCཨE}6| !c놏چC6d ^7|  l×lDksv{W _X7|6| _!c 놯چ/K6d /U6|ɆmBjFIU$FIl$ِ1FIFI!cp/FIl$ِ1x/Z(Q(E6ʦ_V S(7Jm6J (mR(m"2Q (Q (E6d ^7JA6Jay3Lb_4-Q(M6d4 ,M6lM`iFi!cpjdCj ?g&x>1S6Ȇ~j~؆ِ1 ?hOm#2mmaeK`b%%Q(m!2FvSʐ M)Q(C6d -װe6`eȆ2F2FYwť!MnuFYl,ِ1,\ÖU(m%2Qrv G}>Q(K6d n,QVm,O6藥bM Q7aW6Ɇ omcdCs?S6 !cpІچ?Ql_(7ʩm6ʑ {6aȆrj對rdC6A6aFzMFyhFyl<ِ1xQ6cɆm6ʫm6ʓ aC6c?σM FhFlِ1FQAmQlFhFlِ1xݨmTPۨmT$mJebTFEoTTۨmT$2E16lTTۨmT$2_T딊jdC6*B6*bdjbFF@6d ^7`P6Ȇm@jFِ1h#@m#ۨD6\4nQIa+5l%JF%!caJdöxQ ۨD6d |VImQl}%hF%l#lN?](lBjF ِ1F T6Ɇװp m BjFو|ڂ೶ l#ln4upذ~m ׍ X76 !c9%R6*-f]Ĩ,FeX7*mT6* ?O TVۨmT&2aݨQۨL6d mTVۨl8&)L~TQ.\<& 9>]\렊݁x:vUR~7㙜GW czûݗ1~g0 V; |"V D|66QcK!Fm MC4Dm#!2#B`m {_;L d#Dm#%SӻlmbwvB;;jF(ِ1Ph#Tm#%2#Bam ׍Ph#Tm#nqJv~ҋ<qG|pXee,2V2enaiղնձյճX[Xb-c -c,cqƖxXXe,2dK55F5.;zNabo6 ͆k\qaTd (L]p 'cwH;$ak\8` S׸0<o/jb)1dckJm p W6Ɇp7mcdC_8mDuF61"Dl#¬E ^7"`݈Pۈ6"ZQ"6"1h#Bm#ۨJ6{&FUQ7ºQUm*QlnTuFUl*ِ1xݨ FUFU!c9*QUm*I6ĈF$7"6"H!c FF$I6d ,8> Tۈ6"ɆF$mT#mb]nӆyRl8Q ۨF6d nQMmQlnTuF5lِ1jF5jFٸRI01(/Jm# ۈ"2mDmDaQdCF76(!cgQFFQl4ﷹDVx:|Ful:ِ1xQ6cɆ^iQ]m:QlnT6mT6jO^Ĩ!ߨQۨA6d nQCmQlnԀuF lِ1xݨmPۨm$Q{Ĩ)攚pNQۨI6d4hMa#ZSm&QlFMhFMl&ِ1FMF4ض3gl#ZԍhX76h!c FF4M6d n#ڈVۈ6ɆK66ZdBM5]RW-UKmQldg ^I-ZF-!cpZjZdCόkA6jaW=O1jQ֍jdCpR[m6QlyJmQۨC6d U}Qۨm!2_ԁ6m6꒍ xabkغp [Wm.Qlߨ judCH/4F]l.ِ1y]hF]luQ_m>рl?Ln4uFlِ1xhFF!c9Sm46 }56m46bƓpY&F߈jF,ِ1x݈u#Vm#ۈ%2nĪmbdCsJ,m4$/w9榉PSuJCFC!c֍j dC0K4upذPm!ѐlFChFC G^;)u`h.\<OH݁x:}5[wgd?W#xy#\7ɻDˆ^8G?.:G?N}p=/czAAq@sE+"p=#21㠍88l18_ϛE6cɆoh ohhL6d m]cm]cFc!cFcFm,F2jF2ِ1yQddl#lF2m$ ׍dh#Ym#hJ6>.x>CkhJ6d4"FZCk)єl9ISFSl)ِ1Fl4Uhm4#_01 ֍fjͰfdCu6aȆm46m46 ׍fF3fvaβaagv4222eee3X[X;X{XXGX'疱Ζ.n/,c-c=,c=-c_ZzYƾ Ӝj\+Vj:5}ss77W׸5'c󙛫k\s\S1ns\]לj5W׸xkA6dBӵt-6Z`-ȆT-F lِ1ҋ? Bmтl|/Bmђl<&FKQKFK!cg?M16>Z-dC6ZB-6Zb-Ɇ6Zm6Z_]cb6ZA6ZaȆ [m6Z )JmъlonmRhm|J6n̟}Xo ۟m|m|J6d4"Zo))ِ1^̧p/SOOɆalab m|m&!w-31Z֍jdCH#b[m6Z [}Zm5њlm mVhm!^ibhhC6d ދh6F!c֍6jm6dCsJhFl3g_&gb\|ِ1LaM?ِ1x7>S ln|m|іl8Q`VԍnUhm%2mahhK6d ^7ºVm-іln6ڪm6ڑ{nebu6aȆ5i5ihG6d nNmюln6کm6ړU1~9h/):F{l=ِ1xhF{F{!cpjdCô6ګm6: bbtp 3v μFlِ1xFF!cpjdCuAmёl &FGQ7:ºQm#ёlFGhFGl#ِ13qGFG!c=FGF'z71:o;o;mt6: O OImщlF'hF'lِ1x/ 褶nۺ;us"Ss[|v݁x/߭ws7mzЙyfkmuvo@g>9ׇww3 tV;Agr cz׃$B:C6:c]ƀA]71}.pߢFl ِ1.F.F!c].j].dC=fhFl+x>o]7]7]6b]Ɇ{̮쪶J6d ^7ºUm+ѕlFWhFWl aMnbO(mt6 ׍nntSmt#2 覶 F6d cv6mt6 ߕzB)_9 //Ȇn|ِ1SPln|m|ѝl$wnua讶N6d ^7ú]m;ѝlߔd7Fwl;ِ1FwFq:Cۢ{=ę@=@=6z`=Ȇ顶A6dO)=6z`=Ȇ)=j=dQ{=FOFO!c֍j=dC{=^xOFO!cp=j=/.w51sʗpNRmKlK!c~#aωs(ƗƗdC66TlRmKl٨L-ebh/؋Rm"2`襶 E6d nKmыl9I/hF/l+ϓ1L3366"2͜16:{G166"27Wj_a_ _A_m|m&NehkbsJo8Vm&2_kjdCVm&2SzC6zc}Ȇ0_>519Sm6 )M16_sQ >F!c֍>j}>dCuGmїlޭo }a諶K6d ^7ºWm/їlş꫶K6d ^7B}6bƸ}C+451oom6 HrpذOmяlF?hF?lِ1~F?~FA'EFF!cwvwvm6 SuJF!c9?_m?1l toeb 6@6`Ȇװvlcِ1!c11n;v"3r `זao,c-c#,c#-c,c-cZXƾ}oo2626262626262626262626r>@qK74:Tft 8@uk@q2qaqqH5NkpM5P]7jk@Xk@< "];1H A !cpAjAdC 8 Rm "2A6aɆN11m 6 ``!cororm 6 ׍`AoFCD<C6`CȆTCjlcِ1;Dmc1lhclkqJժ_;bdvj_c_ ׍aZmklk!c9k8|55ِ1s66'%jb Po Um %2?Wj( Coxd8|d`8}׃p '2Ytp82#?1׃$B%6m 6F 01F#j#dC=cPm 2hañZ#dCH1ʶ,˙#E1#6Fb#Ɇm6Fm6F  mTm$211E6 mߨ1JmRm"21 1 E6dw'p?1 E6d c6Fm6F㲔21F=Ѱ1M6d 6 צ6FcɆa֦1U(hlc4ِ1t41Zmc4-D}7Ʒjbߒ w~ ;UlF3ƿ6\>--ِ1oo66Ɛ!kibuc c6`cȆ1pN1C6d N up0g(lc ِ1x11lzǎb&wn|wjaߑ ׍`Nm;l;!cU1}Zaߑ Nm;lc,6r'M {ѱjcdCcXX!c!d m%2SBc6b]ϲ01Ɖ1֍qj㰍qdC6A6aȆ8X7Ʃm6Ƒ ׍q8qdŮ_}[3166Wlfa{xdC66Wljcƹf=cbsx8Wm'2a1O6d c#aüZ㱍dCsxhcxl39L6~6~ 2Y4uH~j?`? ?~Ȇj?`ɛ'jbL6&@6&`Ȇװvlcِ12)6&`Ȇhclc"tSMcߘ7&mL6& ìa16lG&NTۘmL$2S&9eDlc"ِ1D$D)3Dݘ$I$!c~c7&mL6& )2Imc1lƆ٘1 ۘL6>ɖ4&dac21Ymc21ljdC06*;c{]bhmL6& 1ژ1ۘB6t&ac 1Emc 1lnLuclc ِ1x1S6`SȆmL6mL6B (Ř*7jSdC{STT!c1֍jSdCBS6bĪ:~mbL4؋NSۘmL#2`ݘ1 ۘF6d ^71Mmc1l4hc4lc:|/LbNjӱdC6C6cɆmL6mL6 thctlc&3Dݘ  !cp3j3dCp2Cmc1l|k1Cmc1lc3aݘ1ۘI6d 5}Tۘm$2ߘ 7fm6f ō6fm6fr>Ę%FF1 ۘE6d nc1Kmc1l|NYjYdC,hc, t>D>f-cs,cs-c,c-c ,c -c,c-cK,cK-c,c-c?YVXVZVYV[XZY[6X~mmmmmmmhlm]÷u7[]f+x/:hm=[]f뙹x:1_mc>ll|ͳ gLn,uclcِ1!c=pelcِ1XXH6NqpXa~e!ٰBB!c9e!Sm,6 ׍n,TXm,$2_,6m,6ET{X$"X7m,6 ~Hmcl]{EjEdC"hc"lc1p?ٹY&b] װ6cɆY YXL6d >,sbb!c9e1Xmc1lL<ǐM%hclc ِ1xK6`KȆX7m,6 Xm,QXm,%YLcxl)|lRlc)ِ1Lha;BuRlc)ِ1xX RR!c9e)Tmc)l|A&2acLmcl]{ej˰edC6A6aȆm,6m,6wU ˅rr!c~c97m,6 Xm,WXm,'2Xm,WXmD6z^}V'o6~6~"27~Oj?a?  Im'l'!c6~R XA6:~!mBԍnPXm 2XXA6d ދ  !c J:Lݳݳj+dC+JJ!cp+j+dC6VB+6Vbƥu_=X%UpNY XE6d ^7VJmcl|NYUjUdCkU*Ujѐžj/Zmc5ljhcjlc5ِ1jj!c^t5Zmc5l~x`Wrck`XXC6d ]װk6`kȆ[[XC6d nc Fmc lD:Zlb6Bk6bkɆm6֪m6֒ ?k[ UXm%2SBk6bM8cXXG6d ncNmcl|NYuj밍udC6A6aFݫJ>X/l6֫m6֓ Suzz!cuzNYXO6d X@64w4>&ыn !c֍ j dCs8lP؀ml 2_n66ml6~&E>quo33ِ1:gNYmglg!c^g؋33ِ13vc6oR_MF(bZFs^<ŇkFv?|V껿~3&i#|#gXek&Gl}&߄&2`=ؤv ׃M@=&cnR؄&!cbImcl8yj&fGl}ff!cpjdCsf8WlV،ml&2جB6Rtzw&34cc ٰ-!caD -j[-dCuc [6`[Ȇ--V+W&Vac+Umc+l[g cޭjCuc+[Ɇ mlU؊ml#0&mئ F6d ^7Mmcl|bܷئ F6d >l6ml6"u~<.ll6ml6 a]mc;l|Nj۱dC6C6m8}YIhOzg8a9ce.n^>~A!aQ1q IدSӖ,cg,cg-c,c-c,c-c,c-cW>suA5?ʼdjvk\vP1쌑?G15nq;5n5n8׸P׸xI6cvoNlc'ِ1;6vb;Ɇwݹj;dC}NhcNlq4_n}M_6Ll\G֍_6~6~!2ᰑvg~Ckl!c mmB6d EmlcوZ^&.Q7vKmclY.,x.lcِ1z{\oR؅m"2SvA6vaabv/nawm6v # #l؈V؍m&2حM6d nc7[mc7lTxTZn&Q؃m!27~clcِ1==!c@{6`{ƲQڦlb56?dc"SZiU؋m%2ثK6d OU؋m%2ثG6;D>}>!cp}j}dC>؋S؇m#2EA6a+51;{QsV~Qrv G}e_mc?l~hc~lc?ِ1~~!cpjd#'^q@ԍnP8m 2q8q8@6d o!cA1qj Xk؃jdCT8m$2q8q8H6d n qPm qlmfS㐨`8q8D6d nqHmql|N9CjCdC6A6aFKC'aa!cssm6 8 mV8m&2q8q8B6-8"y8y8q8B6d /zQ8m!2_k#jG#dC{_G#jGdRÁ&QoQQ!c^(Em6 ׍nU8m%2q8q8F6971 ǠcjǰcdCu6aȆ1X7m6 )Ǡcjǰd#Z5198Sm6 ׍nW8m'2䌑?-qڏbhm6 6m6Ng?61Nq֍j'dC==P8m 2SN9 lِ1 vNovTan$'"NEa; kIv?>To.]÷u'=?'q=~+}i*֦µ+ݗ1҈]_~Wr c=_֯jz+1x+Ư)G{qJ\qJmql|ܷ8q 8E6d c=)S)!c)h)l4٠Mihil4ِ1~~6NcɆp&9q8M6d G6Nm6~#i~db&oodC`ooodC6~6~S l|N Mm7l ٘qFԍ3nQ8m!2ٷHrpذ\3!c~ 7Ψm6ΐ )g3jgd#{˛gE8 YY!cq֍jgdCu,g6bgɆ8 mU8m#z=ȼqN8mS8m#2q8q8G6d nqNmql9h9l&o\ !cq֍ j dCu6.`Ȇm\6.m\6.goOib\6.B6.bɆm\6.m\6. ۸m\T۸m\$2qڸq۸D6:Lrb&%aqImql|NKjKdCs%8\R۸m\"2q ڸq ۸L6nTtEq6.cɆeX7.m\6. ۸ m\V۸m\&2߸ m\V۸m\!nqEظm\Q۸m\!2/ |/l ِ1r)W6`WȆ7@W6m8·9KhOqqr5u M-ۖ;{?,c-c,c-c,c-cZƞXƞZƞY=m{a{i{e{m{c{k{g{o9*8|Us\U׸]'c*썮kU\R1sUukUq2wU]وvIM㚳o6䮑 kjװkdCόg6aȆ==q ۸F6d nqMmql\4nXN8s:N{ޭл/þq=Ow_>zp|jq=O"d }h}lٸ?21+m<6 ?@ml|?m<6 M@6`F򻪯ab<CC!c֍jdC}CG6m<6#›21~17m<6 Xm1lchcl1ِ1xx m<6m<65.]`b<{O^SS!c~)7m<6 j >χIx|bKiKeKmKcKkKgKo`hdseeeee尌崌岌嶌屌嵌ZY[,c,c-c,c]|) ەS ^RϿ$ou F)\PoϿk\ t)\Ͽk\ ׸ϿOFF.71>q!}CDml!cp@m|m|B6d nhOOȆm|m| l x˧KL.oNj)dCQJTHm$2HHI6d 76Rm6R􎭉JHmRHm"2 H HE6d ' zJm#lF*h#F* G^'a#DuaZ-"]x/߭K V;Hmw`.?uaeHw\<#߭K yj=OAn;K#z4Q4/coӸoӨ 91L=uЊHA!c}i4jid#5giFZFZ!c"-i6biɆZUHm%21Bi6bF=RN51҉G:HHG6d HrHq tF:!cp頍tj鰍tdC6A6a&ohb6C6cɆצ4Fzl#=ِ1x6cɆ6ҫm62Wo>ŸepA2md62 ~dY)ᜒYm#3lndu#Ffl#3ِ1x FfFf!c^43Ym#3l|;CL,Fh#Fl# ِ1WEm# lFh#Fl# ِ16 Em# l#7~#FVl#+ِ10YɆhVFV!cpYjYdC6BY6bFދkbdF6odSȆmd#2Emd6 mdSȆmd#27A6aƆebdw)fC2;ٰmHfWȎmd'2_fkjٱdC6C6cɆFvFQ}{9Ĝ)96r`9ȆFX7rm6r ccCm#l|NmPȁm$ v_) Mj9dCu#'96rb9Ɇr½j9dC6rB96rbFJElb\pKm#lF.h#F.l#ِ1F.Km#lF.h#F.l#7٘p*CۢM9F]7Vȍm&2 rm6r ׍ܰnVȍm&2ÆȭC62;Njkbh#F>l#ِ1sAKOm#lmSȇm'w$E6cɆFH chm6 a_m#?lF~h#F~lÍlrśn. 7tvچF6d 6ܰ 7!c놛چF6d ދAnjnFqޭo F&FoFF!cQ֍jdChF!c~Q@m݆㘂曤o n*ZP-]xjv$kjӱ& 5 ~A7.MRAx yA\ =?pyu B(B_׃Bte4" zP|(Bjp=(D"d >W6 m6 ?[NebsEa8WV(m&2# >Fal0ِ1~gaYXm0Ql, mV(l8e8=E 8r>GXQX1˘ee2V2eX|-c%-c,c-c~21X9XyXXEXee,2dlb XB-羸SmyjNƹ箮qƹS1.\wwus5Νj#rW8w\ܩ|s5]]Wl1KA1ި썊m6 =r"F!cm6 6m6E{k71Q֍jEdCU(m%2Q(Q(J6d ^7BE6bȆ{ !&F1Y1Y1bF1!c웋m6 (mS(m#2OQLmA6&u!j؆ِ1zC +pj؆ِ1x  lÃlnx@jFquz9kLFqhFql8ِ1xQ6cɆm6m6 (mW(mxa†'᩶mx hꌑ6چ'I6d '|OSm$2 mxmxb%ƻSz51JuJ N)Q(A6d oF F !cp%j%dCtJ@%6J`^d')`bx놗چE6d ox~Km "2mxmxa^dCu R6ƃL11:S6 o!c~j؆7ِ1:S6 o!c oh[m!4oؠ#ΕJm`>dC0sJ3Æ{ lÇl܆᣶m ?6|6| _q1*UL& mmbdC/7|6| _!cu/\mbdC6| _ _l$h4wEK^FIl$ِ1FIFI!c~$7Jm6J ( mT(m"ޯQJ`/ZJmQl &'ѝ(Q RF)!cQ ֍RjRdC6JA6Jaŷuu6JcɆ{Ұ-Q(M6d n4QZm4Ql- mV(m?;~n᧶m S6ȆmA~j~؆ِ1uS6ʐ F&FLL2F!c~ 7ʨm6ʐ SuJ2F!cQ(Q(K68'eE( FYFY!cpejedChY؋U(m%2* mU(mcztulb~j؆?ِ1x  lßlnú᯶m Іچ?QlLqp*QNa5l9rF9!cp堍rj對rdC6A6aȆm6ʩm6ʓ6ŜR)6cɆpN)Q(O6d TyTyFy!cp塍j屍 dcxQL FhFlِ1xݨF F!c~7*mT6* UڨQnWE"ƃ"QQ-]xjvU*T;0O.ۺpZQ}+ᄍxFvUW ysm|sjz@w_ :P; |"P D|66JdQjջ41* JjJdC}D%GTRۨmT"21+F%lِ1JF%JF M@a#T6ɆF jF ِ1x@@l#lF m]G6 l#lnm 66 !c= h#Hm#ۨL6ⲔZ=㑉QYQQYm2Ql[[jdC6*C6*cɆmT6*mT6KobTu U6`UȆ *jU*dCh؋VQۨmT!2NRڨQ&']#Xԍ`X76`!c FF0L6d ^7aV6ɆF0m7rQlZ} F}l>ِ1ڴ>\Wۨm'2QڨQh@6rj>F7cq71 njݰndCF78otSmt#2 覶 F6d >v6mtp;Pmc 1l 7m 6 ϢjAd㟙'd^c7yc lcِ12)6aȆ 7m 6 m Rm &J~?19o;gm 6 o Vm &2=e0=e`lc0ِ1)jԜl&F!om`!dC}#l#lom Ϣ!FFJ6J8Llb: w%^[J>m ? U6BɆaC5lF(J6d ~  mmbCƂ;`b }cC6`CȆ7m 6 ϢC,:Dmc1l|Mm Qm %g=*S딡jCdC6BC6bCɆהpM1J6d nc(1Tmc~?a0ax Ԇ[jKmaEZjQ(Km6Rk[j,ZcZj,8Km6RjMԦ[j3,,Km6~0qؚNab _DžF=N=. 0u =.z5UDžF=N=. 0u 8C^̳uw]aj"]>[7 :v0<Wl0D0f?>[7 as> <?mbCoa?>q?Ng_`8t0\`8ɁpE `81phcpl#l8>»&.lCjF8ِ1ph#\m#'2V JjF8ِ1K8m +\gb6F@#6F`#Ȇ//1A6d ~4^+Pm 2o1Bmc1l#1C6d >1!c1pclc ِ121K6JM}cca1K6d 7¾1Vmc,1l|M הjcdCkXhcXlcXT?11Ɖ1qj㰍qdC88oSm#211G6d nc1Nmc1l<{7Mbgj㱍dC0}3FxWm'211O6d >o6ƫm6&8(L hclcِ116&`ȆmL6&mL6&   D2ALMDhcDlc"ِ1W'g KwZZdC6&B6&bɆDhcDl#l}|&F mDmDcdC}#hhl#l|+}EmDcdC6hhl#l|D#F|'7&%NnF C6d ~{ =Fm#ۈ!21oĨm`1dC6bl#lۭN:%^ĪmbdC{p]-b]9GLW;nw`ÉbO}sjps>tο^8u 1G̀s ٟ :23`?v0@`3"f~0D̀6fm6fmu1Sؘ mTۘm$21ژ1ۘI6d nc&1Smc&1lg dcLlcg&,1Ĝs,Y,!cs\?fm6f ۘmRۘm"2&i1Kmc1lLx1۹oal&'.icllc6ِ1l5[mc61lc61ۘM6d i ٘1ۘC6Rt|\Ę#ĺ6m6 ?w2>w2Gmc1ló}clcِ199vuEnǻ8Z1Ro-Zj,ŖKmR[nVZj,ՖKmR[obm6Zj,͖KmRnvZj,ݖ̥qޥ _bn 7d >ͅ\u{\q2_o=n.8,7*CϿGݫ!ch{\#{Ӈ)(<17σs6cɆ|7m687X l,6m,6 Xm,PXm, 2hhlcِ1<],)G CkclxUlcxB.ͅj dCt >BB!c5e!\Sm,6 ) ᚲPmc!l\xHEo,RXm,"2ًa=r"lcِ1)6aȆ|3^XL6ZeX\,)6cɆ}jdC}c16cɆpXXB6qTX"l,6m,6 #Xm,!2XXB6d 7Dmc lYhcXS5eRlc)ِ1K6bKɆm,6m,6 .XXF6 i&21.2e2!c16J|xobhm,6 Xm,SXm,#2ˠej˰dEXrr!cyc97m,6 Xm,WXm,'2XXA6o0cFgl{_j+dC0}aj+dCwPXm 2a# fM Jk01Vj+dC{_+JJ!c𽯕pkJlc%ِ1F';Xm"ӶOzlċ~^E6v&pRXm"2a*a@(M U*!c5e\SVm6V m6V zkZ\îװ6VcɆpXXM6d nc5Zmc5lƆ3kJobhm6֐W/ 01ֈgrgrרm6֐ ߇އFmc l|_t ]XC6d nc Fmc lċr_cx-|Zlc-ِ1k6bkɆZ7֪m6֒ ha>4Zkud#c11 렍uj밍udC6A6aȆm6֩m6֑ XmSXm'Ϗ쯽^XmWXm'27yczlc=ِ1zz!c{j6yb 3y}/_"]>[ bw`~/웃'g/>~F46~ 곿 te Vl6l`91A-bH߰ؠH6Y꒻Q\nצ66bɆml66ml66 ZQmc#l jMdxNGw216Mpؤ D6d ncImclol}c&lcِ16A66aFK/^7joblkflV،ml&2جL6d oN66cɆml66ml6Y\ژ[Ě)[6`[Ȇml6ml6 #) j^6vm6vѹ=umbR؅m"2`إ E6d >o.].!cp]jd#D201vjdC࿡톿V؍m&2aحM6d >o6vmp078ٱ>KmvR;h[jG,1K7KvR;iN[jg,9KvRh].[jW,5KvRiy?q--97#P <]/s@y{uۃ{q2h=n8{1{=nq{|{uۃ׿dF#*{9){ɆU؋m%2h^lc/ِ15^xMWmc/l^hc^lc~RilnܧG6d l>l>}>!chm6 _o6m6[%51p/f~lc?ِ1~_mc?l~hc~lc?ِ1~ƯdL_32gd~Ulf0cϯdTȯjb yW__Ɇ~6~U8@6NW8 7m6 oP8m 2`8q8@6d 7@6`F) 11]LwyPm qlAhAl ِ1AA!cB6bƮ9J_/`b  R8m"2ߧ;m6 8mR8m"2CjdqS&aa0qXm0ql0=q8L6d n0qXm0qlahalX!qD8mQ8m!2G`8q8B6d #!cpG#jGd k8*l6m6 oU8m%2Ga8q8J6d aQ11+{3DŽc1c1!cYEm6 _װ6aȆ1h1 C^gjg~"~S.心looj'aϫ: vg77Op79Kqqqxq?q:2jppK:8qr c8q\-8IC6c'Ȇ˃E'Zqvj'dCk #Nm6N 8mP8m 2 qBmql8n]8)I7Nm6N Ϙ'yRm$ql'wOm6N 8 mT8m"r8%l6Nm6N SoR8m"2`8q 8E6d 6Nm6N ?z8-l6Nm6N 8 mV8m&2a8q8M6d ~q8q8C6˼t<㌘7yl ِ1uFm qlo}l ِ1r8q8K6:ze㬰q8q8K6dD"FbCk,ql|,ܷ8q8K6d n,qVm,qlw&999s9!c5\SΩm6Α soS8m#2_SA6aƏ8/y7Ϋm6Γ _}^mxMmqlo\6m\628xĸ.l\6m\6 o\W۸m\'2_S5ul:ِ1u zSסMb޸j7dC}76n`7Ȇgpq۸A6d >ހ6nm6n7$qS|'fJj7dC6nB76nb7ɆM7nm6n 7j76eymK펥vRgnݷXj-GcKK퉥R{f=^Xj/-?-WkK퍥R{g>Xj-O_gKoK0z響 -1݂-u{-q2n薺=8wKnwzpowKn6ٸ>&m &.kr)|ml6ِ1w6ncɆ׿pq۸M6d >݆6nm6Nyjĸ#7m6 ۸mQ۸m!2޾m6 ۸mQ۸m%gw͐q97w?dkv%e=?jwdC6Bw6bwɆm܅6m6 _o߅6m6ƎqO{oS۸m#2qڸq۸G6d {S۸m#2]qOm݆!ͳufng~'Y]9ٺߡ~;0O}wxWg<9;s;W96nCa?>q?Og_}'2_+õZ}jdc} 01polِ1ZjdCk-m<6 _>6m<6ڶx(C7m<6 o /axxI6d oTxm$2xxI6d 6^m6$bb)l m''ِ1̼5Æ?66$2'ƟƟdCp&Ɵ+tk5LWb}gWjWdC+W+!cy7^m6^ W+Wkq ~&k1okk!cy3FxπVxm&2kαjdC6^C6^coFwFm l: NyxC6d k7!cpo7jodcC{Lbx 獷jodC0qspذ}[l-ِ1[[!cpojowd㟙zlNNml:NyxG6d }Sxm#2alSxm' b*o:x/l6ޫm6ޓ _={{!cpjﱍdC}=^m=ld/}@a&|k!cy7>m|6> )AmlGAw&,΢6>bɆaa;;c8l>Qm#l#H6d n#Qm#l$3xIOo|Rm|"27>y'lِ1ğğ6>aȆ-m|RmE6P&Ky/Ȇה__dC_pKm/l/!cS6R L6>uܛhb|}36>cɆm|6>m|6> Ym3lo|6>m|p<y&iO=Wgo"];xg[os$y"h[}}s/jpo9xyN /b:2#9_ZE- _H׊//v/7w8RK`%\,DZbK-RKf%RXj)-5WK-RKcYj- ZFK-RbeԲYj-ZNK-:^re3'+yB?1xz?:q\O ⹢Ͽ{\<<\QSǀ_|q1ݟN]6cɆۈO6d n#>_m#>l|mWۈm$ L41 j dC}# 6` Ȇkj dCo j dPFbb$kJB$THm$$2HHH6d n#!Pm#!lFBh#FBlÅlTpq0? ۍ=.j.؆ ِ1 hEmp!2mm`.dCk ᢶm$"Fȕ{{Hm#lF"h#F"l#ِ1o:\L"DF"!cHHL6Jg#ӆƴ[N?'VHm$&2ߛMfm$6 İo$VHm$&2O 1Xm#1l,ڹ7s&F1o$F$F!cg뒸g뒨m$6 $o$QHm$!2I$jId#g*7I)dm?jIdCkJR$UHm$%2-8+-8FRl#)ِ1FRF21mbMLd6M HF6d l]2Wl]2dF2!c5%\Sm$6 Ϣɠdjɰd#e-~41; wHN6To1jɱdCFr8o$WHm$'2HHN6d 7C6c)Fx&71R{R{Rm6R pspذ03F l#ِ1)6R`)ȆgF FJس#k)EH FJFJ!cj)dC6RB)6Rb)ɆהFJ؆+~Rp):Ump%2N+Nچ+J6d 5Ump%2 mmbcri+T51R9s#q*QȻuӫfJm#lo}#F*l#ِ1TF*TF*!cy#Jm#ltw&Fjq^VHm&2zjWt?ZjFj!c5%5\SRm6R j4dnUHʿ}{=Fl# ِ1xHF4F!c͝16'Ck# lFh#Fl#-hq%{GY#7y#FZl#-ِ1FZFZ!cKw4716biɆהFZF:qd9JĚ)6aȆE}tj鰍tdC0}3FciF$&F:l#ِ1tF:tFzQ3Mo}#Fzl#=ِ1}_}_6cɆ$Fzl#=ِ1H@6I`l#:@6lC` F!c5%\S2md62 ì)516UuZ dCBmdPȀmd$9v EFFFF!c5%#\S2md62 96vHM FF!c5%#Qm##l,yذԗ&F&1odF&LF&!c LjLdC0}3ƚ+IM LF&!c5%Im#݆!d㟞b Eɬ.心l]f Afs$ue_W4\{3Ͼ9xrv}eЬ>ЬjYdCsDV8GdUȊmd%2Y+9c8lJ{mիlȊmd%2_+BY6bFDLMlod}#F6l#ِ1lF6lF6!c-1#|Ck#l|mdSȆmd':obd6C6cɆהpMɮN6d x8c8ldx9Qobhmd6 mdWȎm cIeb6r@96r`9ȆΡA6d qac2SZ9dC6r@96r`9Ɠ NabsW"96rb9ɆFN7rm6r ì)͝1M FN!cp9j9\d΍'11rY4Esm6r # #Km#l|g\j\dC6rm6rk s11r;3IɆ6rcɆgpͭM6d ~NnxNnFn!cȭn~K߼FcyG^K-R+` Yj-"ZQKVR+aJYj-,2ZYK{KVR``U*Yj-*ZUKVRay?Lq-9^l:y}u˃{\q2;9c8z<7ss^F^!cpyjydCtyjy|d6S'|pnΧG6d 39c8ļG6d n#Om#lF>h#F>l#?vegw&F~bF~x&˓_m#?lo}#F~l#?ِ1ܜ6cɆC6cF KLb(jdCT5UF!c m6 (mP(m$ҟ{酉QPt6 bɆFA7 m6 oT(m$2WaAhFAlBS//F!lِ1BF!BF!!cw*,Q(D6d ~R(Q(L668cE YFal0ِ1FaFa!cY0E m6 )j"d#ͣk>01y7m6 EQDmQl|M)ה"jE"dC6@E6`EFH} &FQqQqQFQ!cQjEdC6BE6bEɆaBE6bƗLbb-gbjŰbdC0wp8؁;]ZŰbdCS(m#2ŠbjŰd#uXS5Fql8ِ1SS6cɆm6m6 FqF c(!֔pM)Q(A6d nQBmQl:N)Q(A6d ~ [(Q(I6|w()l6Jm6J %QRm$Ql:$N)Q(I6d ~ [(Q(E6nF3ĚR )6JaȆm6Jm6J (mR(m"27JA6JaF-K(-l6Jm6J _Öװ6JcɆm6Jm6J ( mV(mx;l]Mg뾃+wjE};#S;< ;}w웃'g;>~Py}^VheFe!cpjdCװj*d#.51Q*jU*dCWWQۨmT!2NSmT6 *F*FUᛯgE&FUU}UUۨmT%2ߨ 7mT6 ۨ mTUۨmT%2EBU6bƭ]f~?Ĩ&֔jpMQ ۨF6d 7:9c$gtv5jF5!c5\SmT6 jF5jFu؀{2Ĩ.Fu7mT6 Q]m:Ql|ϼ:3QۨN6d n:Q]m:Ql|&F aQCmQlj5dC}56j`5ȆmԀ6jm԰7ajZQRmձZj,ZKRkl5ԚZj?Yj,Z KgKRkmZj,ZKRlYjԤWk:]ք]Tդ'c=ܚp=&85WSjWzg {\Mu׿Zdgbss-87Rۨm"2٧ab-ZF-!c\jm6j S ڨQ ۨM6*hj٨Fml6ِ1\͵6jcɆmԆ6jm6j ۨ mVۨm!=Ĩ#F7m6 ԁ{1u6`uȆ33QۨC6d >7ׁ6m6꒍cb6Bu6buɆ獺pިQۨK6d ~R]xR]F]!cQڨQۨG675ib6A6aȆהzpMQۨG6d >փh=zF=!cpzjdjabkׇkWۨm'2QڨQۨO6d >oԇF}F}!c5>Q_m>рlxg@̢ ,@mрl|Miהj dC6@ 6` Ȇm46m46) bb4kJC4Thm4$2hhH6d n!Pm!ѐlwFCv~4!œ߭$?Ehak~}GGw}RQ}}s߭G9smӃ F47}FA#F4"21ZD#ϘFjdï-Mbh jdC3fc8c6Vhm4&2_+nXm1јl|h m4Vhm4!wŭOob455Qhm4!2M`hhB6d 7Dm фl|lm4Qhm4%#*^8h*FS7M6bMɆFS7d FS!cpM Ck)єl|Mi m4UhmD6Ns͊}Ckюl|hvjvdC6A6aƛ71 jdCF{F{!cpjdCkJ{hF{lpPD蠶@6d c3FO/M F!c5\S:mt6: mtPmt$2<{ 訶H6d 7:¾Qm#ёl|_#H6d n#Qm#щlssOF'lِ1NF'NF'!c NjNdCF'hF'l38۴kvLⷶjdC6:C6:cɆa;kjdC6:C6:cndcri+nbMqkچF6d n pSp6ȆmAnjn؆ِ1mmadc_ĒG˚b}mcdC6ܡ w wlÝl|pچ;N6d npWpF}?L{<<,ey[j>Z7KRnYj=,Z/KRk[j,K-Ro Ԃ,`Km6RlXjKm0]Uhpxiשq]`q]pB=N{]nu{\q2ߋb{\P1x{\u?A{ CFp6P6<Ȇ?ymx`dC6<  lÃl7chCmnWWl]X=WgnU-]9u]av< ;g³U}Ͼ9xrvu缫we.hy~ {~Ig_k'tv'91x?"<"j>؆ِ1 lÇlQ6~;cĵi78mvSmt#2 覶 F6d nMmэlF7hF7l×lK>IF׹ӟ/وx,mycچ/K6d nU6|Ɇ _8ombdCk/᫶mt'ߑ(]<]<4mt6 N6d n;]m;ѝlݡjݱ ?q›R~N@?a!Om#2~oma~dC6 ? ?lÏl|OS6z' NabF8oPm 2g3O9Z=dC6z@=6z`=ȆFFOq>4N Szm6z o=6zb=ɆgўpI6d 7zB=6zbFӌc=v11zzzm6z G E6d nKmыlF/hF/l7u]&voW}m[m7ћlٺٺjdC{_WoFo!c57[m7чlTttR>b>j}>dCH$b$16`}ȆF7m6 >F>F_」?}]}6b}ɆSUm%2}m6 o6m6FLO31 h_m'2mmcdC6  lßl|M66~dcmM~b|e?~F?!c~6aȆaoSm#2觶 V&F69@m# 2Ew{6!cFF@6d n#P6FL||jb5%)jF ِ1x}#Pm#$2mmbdCh m'>ca诶O6d 7þ_m?џlc7m6 FT&ac1@mc1lo }clcِ15NjdC)j qg=#H̢Ap R6ȆSuJFD6d 5%Hm#"2mmad37nF0m 66`!c FF0L6d n#V6~Nnb k@ Tm $211H6d 7¾1Pmc 1l|m Tm "to1H\ )6aȆm 6m 6 Ao Rm "2EA6m8ޗy83Ia1.心`vI$ g}s/vps>:j   ξMCiA!@kE\+B"Bp?!2!FFJ6/ 9eb{vB=;oXX!c11G6j:n5'qp1G6d ~2^Sm#2aǩm6Ƒ _6Ʃm6Ɠ-594/l6ƫm6Ɠ ƫm6Ɠ mWm'211ۘ@6J_/xX1AؘmLPۘmL 2`ߘ1ۘ@6d >N !c{&@6&`ƒV11&딉:eDlc"ِ1oo6&bɆD7&mL6& ۘmLTۘmD\obD FF4M6d n#ڈVۈ6ɆF4jF4ِ1 mDmDc1dccn#]ƨm`1dCװ16Fm#ۈ!2װ1j1F ِ1cl#ljfw+X8oĪmbdCF,7b6bX!c FF,K6d 53kxk{_ٺIP$Iv._{$IvI;MgO}sO 9>p?s9Ջ 8ُS8|p?#2qPDZDq$BpFF1lecs06& 6&cɆgpƜ1ۘL6d 9wNVۘmL&2#&C6&cSƓ=7lbL38cNQۘmL!2#9blc ِ1xߘ)!c8l811)jSdËobLu^" !TT!c1jSdC}c*S6bSɆThcTlcٸaߎ@c7yc4lcِ1i4i4!c1 ijӰidC0628c8ltw5d itrrM♤jӱdCOOWۘmL'21ژ1ۘN6d c#3Fc1l|ngjdX 7m,6 vvpبvݺՊ~Ckcl|MYהj dC,6m,6/P􍅰o,TXm,$2]pm,6 Xm,TXm,$2Q㟔Xm,"9n51EjEdC{"E"!cyc7m,6 EjdLŢo,}cblc1ِ1QvU^ҫޑ{Ww#M:*B衆 !$-H@ ׳k<._֬gءA6d ^7vCmclhclc'f^;NN!cp;j;dC6vB;6vb;ɆA6vm6\jdb9)j؆+ِ1&]W WlÕl|ẪmbdCupUp6vN>[71v ]j]dCuc6vaȆm6vm6v mR؅m&{}u>UcحM6d ދnn!cpcnlc7ِ1nM_GmQ؃m!2{`أC6d N){6`{Ȇ==^qz튌S{^^!cp{j{dCuc/{6b{Ɇ^hc^ !}߭fݝgS"E'g<[CR;/V"wew{O}zKW:Ǖ7zփ껿׃te W;؏~r cb?+E`?1C6cFaV8 l6m6 8mP8m 2_jdC6@6`ndcc<[z41܄ 7hMm p#2#`ᦶm npSp6Ȇ{L7hMm 8H62ᓣqPzzPm qlnuAl ِ1r)6bɆm6m6E Ƅ21 CjCdC0޻9c8l9Nq$!lِ1C!C!!c!h!lYD&M8qX<'9 V8m6+)rXm0qجID 0\V8m6׍ahz51G#jG#dC.sG6`GȆm6m6 ?mQ8m%O7o.qTGa/zTm(qlnuQl(ِ1r)G6bGɆQhQl|أLc 1c1!c1\6aȆm6m6 8mS8m;mpu w wlÝlnú᮶m p66ܱ w!cpІچ;qlt+xF7~ql8ِ1Lᰱ-ÜJ|Ck8qlqhql8ِ1:8q\m8ql/ Jgb:tBmql|8q8A6d /zP8m 2'j'diI761Nq֍j'dC0o=gObhm6N ׍nT8m$23? mT8m">9uHabr}Ȇ)S)!cwvNwvNm6N 8mR8m"2_Þ6Nm6N*OH8-):il4ِ1xq6NcɆm6Nm6N j wN(n,xi\s lÃl|)j؆ِ1 hCm 2?wmxmx`dS<O OlÓl܆'᩶mx 6<6< O!c mxmxb^dc%^j^؆ِ1: S6 /!cu16146Ȇ᥶e|E~Y˘e2v2o;o ]Z.ZƂ,cKXe,2v2nbjf]ݰݴݲݶEZXM5.kH㈧/'o p58oq2筮q޸yS1 ?ou5Λjްyk7|ƒa>bMT>j>؆ِ13cGm!2fm`>dC᣶m!,? 8#l6Ψm6ΐ ׍3nQ8m!2q8q8C6d 76Ψm6Β z቉qV5YY!cwwΪm6Β 8 mU8m%2q8q%8lb Іچ/K6d ^7|aU6|Ɇg?j؆/ِ1 _hWm#E^C'g?~j~؆ِ1 ?hOm#2E`/꧶m 6669`֝"ΩE0O.֝yΩ;0O.ٺsp8w\<-xjt΋{~N}zO[$?te \Ɂ(_-!c  l<97Lb<ܷ8q8O6d >Wsyy!c><#Ϋm6Γ MC6cdk&Fmm`dC6l#lnm ׍h#@m#۸@6.nb\6.@6.`Ȇ!{ j dC=c^P۸m\ 2m\P۸mjtF 76@!cpFF H6d n#T6ɆmBjEqh-A&EQ7.ºqQm"qlYE,El"ِ1EE!c9"qQm"D6#Hԍ X76 !cߟ ?m 66 !cpAFFL6.u#֍``l#l hF0L6d n#V6Ɇ'7V6.oΚDݸ%K%!c߸%lِ1:\\R۸m\"27.A6.a!dqk"F!j!Fِ1xl#l|#om`!dCsJm?Z6BPPl#l|_4mbdCsJ(SB6BP!cpFF(F6&08maadCk0 S6ȆmAajaFِ1mmaƋa?fb\u26.cɆ{˰q۸L6d n2qYm2qlehel#l sZa#\ԍpX76±p!cFF8N6d {8|=\m#'2mmcW6p31W+jW+dC6@W6`WȆ)W:l ِ1rڸq۸J6z4^x*|Ul*ِ1UU!cuUNq۸J6d ދ^6m\6ˑQV21~7m\6 `qMmql߸kjװkdCs5h5l#l:|&FmDmD`dC6"l#lnDmD ۈ6"6"dقluu!cpסjױdCu:6cɆu Q [M߸j7dC6n@76n`7Ȇ X7nm6n ۸mP۸m$8qqiܔdö!ySm&qlMhMl&ِ1xݸ MM!c9&qSm&qlYaqKԍ[nR۸m"2_܂[jC6nA6naȆװ[jdc"kLۢ {jdCngm6ncɆm܆6nm6n ׍mF$zVnDºmD )pNTۈ6"ɆHoDmDbdCF$i8s{_t8W'w"E'>t:vp\<տ.v^U;~Ӳ'qI=cᄌ/˗^ݗ(9ZY[Ƣ-c1GXcXe,2`K=n{f{n{a222eeeeeee/QTRY*RSB=yY4e(uZU1kQEYע牂-J]٢EMҌ5.J]psl|[sTB~]l.ِ1Z.\+U۸m%2mm6  mU۸m#/^{㞨`ݸq۸G6d ^7qOmql={={j{dC{={}1,sLn܇u}l>ِ1{{6cɆpNq۸O6d VmW۸mDB7_016Kd]_%hhl#lnDúmD ۈ66h!c=hh#Zm#ۈ!}84Ĉb6b!cFF C6d n#ڈQۈ6bȆF m< W .4ll$I< I:7xm<6 #|@6lۀ6`Ȇm<6m<6 xm{6bɆ甇C#pߐ&#;$#J\ Oi#lِ1LaɒGjGdCu6aȆ#h#l#lԢH31bE XXl#lhF,K6d ^7ba݈Uۈ6bɆmBjcqx3CMchcl1ِ1Lcc!c֍jdC6C6cOFk 61O'jO'dCos31 ϠgjϰgdC3؋>Sxm<#2_>kgjϰgdC06z3gsA?,\?{6cɆxxN6d n9\m9l|9\m9lЛ-Mnu lِ1  !c9S^m6^ o6^m6 *'VoCԍ?`Cml!cp@mmA6d N?66 276PxI6ZRa_5KK!c~%7^m6^ KKRm%lKhKl87nY7̦+-Üį6^aȆ+X7^m6^ `Jml+h+ !?Uۼde O[]x/ٺ??;0OGwO~Ӳ}OxT?q=xM%kzE=x kk2+^ùk\^aZ-5I_C6^coȆo77!c7pl ِ1\V7jo7dC6@o6`o;.41:moɆ[[!cpojodC6Bo6boɆ[;wZJ*\Sxm#2S9;lِ1w;w;!cxxO6VL٥^ԍnWxm'2_}{{!c~=7ޫm6ޓ i6ޫm6>tD!cpjdCu6>`ȆG1]f31>: d^H6l/Tm|$2S>9Gl#ِ1xGG!cn}|I\,cI-c,c-c),c)-c,c-ci,ci-c,c-c,c.L-c-cY,cY-c,c-c9,c9-c,c-cy,cy-c,c_X0]ąI\ߧ$Ouk\T1`K?1EI\E}%qI|Kj_:>#c,  zggdCg.7Lm3l3!c}}m|m|F6d ggjaIFl51 IjIdC6BI6bIɆm$6m$6 ׍FRF2҃rɄdF2dF2!cpɠdjɰddCkd.hMLm#l|/&Lm#l\3MFrh#Frl#9ِ1x6cɆm$6m$6 )ɡjɱdce61R^4ESm6R wwpذ=JHA6d I I F !c9%Bm#l_j튌&FJQ7RºRm#%lnu#FJl#%ِ1xH FJFJ!c9%%Rm#%lԫd&F*a#Jm#ll]*t.F*l#ِ1>]*OJm#ln6Rm6R $IӘ]wS7Rm6R a/Zm#5lFjh#Fjl#5ِ1xH mVHm!G&FQ7Fm# lTog \7۞'16`iȆ4ji4dCu# Fm# l׭iEH FZFZ!cwMҺwMҪm6Ғ H mUHm%2ijitd㋝J1҉֍tj鰍tdC0sJ/g >ZE,I tF:!c9%Sҩm6ґ ?LmSHm'k-𭉑^HmWHm'27~#Fzl#=ِ1xHFzFz!cp額j鱍 d#CT412 j dCk p Am#lFh#Fl#ِ1xȠp!O 9Ep6\6\ !c놋چ B6d >9Emp!2mm`=312}ьp_4FFl##ِ1FFFF!c}ьp_4FFl##ِ1ȨD660# LjLdC62A62aȆLpNɤ D6d <%Im#݆.w?[ :AZv?g>>W;\<տlpWs~Ӳ?J8矫d{> {ú .72Ȭq=Lw_Ef̸d&2#2>"ZDf\2[d62md6zmbd}DGdQȂmd!2_d,jY,dC6@Y6`YȆ,F,FVѾxMYɆCY6bYɆg޳md6  mdUȊmd%2YjYldYMl.Ln6QdSȆmd#2`Ȧ F6d n#Mm#l|m Ȧ N6u]?GvFv!cp١jٱdCkpm]m#;lnd6md6ry!r=j9dCkpMCm#l|mMsm6r lh#Fl#'٨T5&FN . 96rb9Ɇm6rm6r ϕ\sm6r [6rm6r *AZDF.\F.!c5l.ͥ E6d n#Km#lmRȅm&FIlbkp [m#7lǹ]7sm6r  mVȍm&2ȭC6֏X7m6 ׍|nSȇm#2S9%F>l#ِ1xmSȇm|A6>4r61Bm l !cupdCu X7PlBm l#?٘jQ9cIaSIFI!cQ֍j%dC6JB%6Jb%Ɇm6Jmp*eͪmz s2JE0O9[W WK;0Ok9֕F)/eiݺRRR{yzsJiVҸ/c}AiҸ&2a=(Q׃$BFiF(,2*jXFl ِ1\Qe6`eȆm6ʨm6ʐ e2jed#e]OuA?UVm,QlݳݳjedC6Be6beɆA6ʪm6ʑI銔('F9X7ʩm6ʑ )RNmQlF9hF9lِ1x(mS(m'Ow"8_/Q(O6d ^7úQ^mԧwVC;ǩ؋bk\}\S1W5>qq}̸5>85U}udf0h pkh@6d n@mрl|kj dC `o@mѐl4xPvCFC!cp j dC 6b Ɇalqpؘ&sCk݆W#ɳu`h.\<l]#|A#sT߼l]#jjw\<զ~:y=ŵ{MWƆ^cQzX}zИa74191x"zИD|h j&dZnMKDm фl&F4Qhm4!2#>Fl ِ1;$M&jMd:&FSh M6bMɆm46m46 ׍n4Uhm4%2MjMfdXib4u6aȆm46m46 6]F3fF3!cŜ16.9zVOhm4'[L=m46 hm4Whm4'2ahhN6d c3FЖ]Zͱd#ҖW61Z}p%Bmтl|mM[m6Z M[i F !c16IR'd FKD| &FKoFKFK!cp-j-dChK؋Thm$2QZ-F '51u+X7R l|N )_m|m|E6d o|66"2nᰱUDJ]y?ъlLWSR&F+q&@6d ދvhF!c5l@6d FFGQI13FGFG!c9#S:mt6: aQm#ёlFGhFGl8x7v͡&F'otF'NF'!c ֍NjNdCsJ'8tRmt"2 褶 L6iLFghFgl3ِ1FgFg!c֍jdC* mtVmt!r]$E)]Em хl|N.j].dC6@]6`]ȆFhFl+$2UUm+ѕlFWhFWl+ِ1)]6b]Ɇװ]j]ndcyqE} DF7nF7!cpݠnjݰndCu6aȆ Mmѝlzyw&FwotFwFw!c~;7mt6 mtWmt'2讶A6ymb6z@=6z`=Ȇm6zm6z mPm 2Sz@=6zm8tWMo9S-]x/$yqj=S{$w}s⩝{׃^tχ}84K ^ ׃^te G}D/^"2^jp=E"d 6mRm&1~Z9-p譶M6d M@6zcɆm6zm6z M{C6zc}F?11G裶C6d ^7GmчlFhFlِ1xmQcmǷ8Z22626262e[`waᖱQі1q Iɖ)i閱Ab/뫮q}qK5N0 rp8kN}5/q}55/8W]hUmQ1&F?aOmяl|m6 mSm#2A6aɆCE6cɆaac\hƕ$Fl?ِ1FF!c?_m?1l0, o1@6d ^71@mc1lLglcِ1xm Pm $ӏ޻䦉1Pԍn Tm $2/q |/q@lc ِ1gg6bɆΜl Tm "ve iab uc6aȆۃz{ lcِ12)6aȆA A7d&H3166Qln|7j`ߐ Fml!cp@ߨm|m|K6r=ֹN1?%ߪm|m|K6d ^7u[ooɆm| m|--ِ1oo663lb `o Vm &2wdm 6 a/:Xmc01l`hc`lcHgK&Q71Dmc1l|N!jC!dC4Dmc1l|21lr?瞿}}ِ1x֍66#2wwdCAߩm|m %v&_cP jCdCPo Um %27~cPlc(ِ1gCjCad~&):e0lcِ1a0a0!c~c7m 6 ׍a0appV&po pp!c}p_tplc8ِ12)6cɆ6m 6F>%341FwFwFm6F mPm 2#`1A6d ދ6Fm6F~+r71F9e$SFm6F #kG [Kc11C6d 5}Qm!2c`1C6d NmQm%Gyfnc11K6d nXnXX!cpcXlc,ِ1X8QM41Ɖ}qp_t8lcِ1:e\Sm#2`1G6d >6Ʃmp/sua1.\<Cb+xoi>[7{>׃ td*b7A?&ݟ2 jp=@d >WL"&EL`1hclc"pxiL+DD!cgh3jdC6&B6&bɆ;'B6&bFE'hbL}$GLRۘmL"2߷-&mL6& `1Imc1lmLRۘmL&s?Ę,dX7&mL6& ׍ɰnLVۘmL&21ژ1ۘL6d nc21Ymc21lqM)9dlc ِ1x1S6`SȆmL6mL6 ۘmLQۘmL%111֍jSdCsT8LUۘmL%27~cTlc*ِ1^ThcTlcوu?RcXLijӰidCuc6aȆmL6mL6 iM6mL6~߶Ę.tX7mL6 O{6cɆmL6mL6 )ӡjӱd#鋖3:e\Pۘm 2Sf9e lcِ1x136f`3Ȇ hc lc&hl݈sMbN 甙j3dC딙p2Smc&1l,LxqLlc&ِ1xݘ mTۘi>L>E?7;fY12626262eleleleleleleleler J*j؏5u M͖,c[,c[-߇E5οdU3Y͂5n5n87K]f7j!!qpE5N`q7l;wi&l7φ}ll!cpjdC}l7Vۘm&2fC6fcsȆ{L61s9js9dC9p=Gmc1lhclcِ1^hclc.(M\hc\lc.ِ1\\!cy.m6 )sjsydc&ncLy~ü,:l^1ۘG6d 3Sۘm#2`ݘ1ۘG6d ޞmSۘm|O6U&b/{dCz{ﱍɆ{a/dCu{h{ﱍdcMxu|@y>ٰ}@y|lc>ِ1Rm>ٰMm6cɆalsp06ZdC6C6c F׭ D 6` Ȇ) :elcِ1) 6` Ȇ{B1/C?21:S7 4MyBlc!ِ1L/as 6b Ɇj dCuc!Pmc!lHkkHmclXEjEdCuc6aȆ7A6aƸ?LX,~dblc1ِ1F,Xmc1l] {jdC6C6cK_{n&Q7Dmc lX%jK%dC6@K6`KȆ%%R1XEDlrcRlc)ِ1xX RR!c9e)Sm,6 KjKedFi*u21u2NY XF6d ^7Lmcl]{ej˰edC{_ˠej6~pn] oǥ{:@"̟)"œ{=g~P;\<7l2?ᄍxZvLγu?{r:nom-ޗgw99rdr\a\-b9I{r {}eb{+^  !c17Vm6V XmPXm 2?[XXI6N,K4{sc#V>bJlc%ِ1xX JJ!c+Օj+dC돕J*Qobs*8RXm"2 X XE6d d|NJmcl*hc*lc5p=UE Lbb5ܷXXM6d nc5Zmc5l|?Vm6V X mVXmH6 Hް?ºƏƏdC6~6~TlƏƏj?b? ?B?mm!>񶦉Y7MYC6l/ˬQXm!2XXC6d ދ5!cXXK62n#LnucZlc-ِ1ZZ!cεpWcZlc-ِ1Z:1#&:]װ6aȆm6֩m6֑ ׍unSXm#2SA6aƇI*v=\îWXm'2 _׫m6֓ ׍nWXm'2X@6&7L bS6ml66 mlP؀ml 2`ؠ@6d dAmclg𬰡QԍnlT؈ml$2بH6d ^76ºQmc#lFhcFlcoMM{MjMdC66A66aȆml66ml66 )MjdVd1169e3S6ml66 Ymc3lfhcflc3ِ1:e3Ymc3e&O9ŜI >Im'l'!c?mmD6d n'h'Ȇ生6~63{MgblolQ؂ml!2آB6d /nQ؂ml!2[-jM]]jCV!cuVN٪J6d ^7Bo߇}߇fϖ_,cZƶ[~ZvYv[XZY[X,c-c,c-cG,cG-c,c㖱SӖ1˘e}mTNw`8m{6uۆk6q2q`ۦqpF5NƠW3]*xg2'15nqۨ|k6uۆ翟FNbY..Vl)زga[33ِ1ƬvtYObhmmL6d nghg_n?"}/j` Ϳ__Ȇaz9{9~('16~6~!2ߋEmlWQd01~uәWa; ƯƯdC mUmWlW!c16IRtlξl+ll(sMxcpml6 mt6cɆauj;JI v!c5vhcvl7ɿ7nxv}6~6~#2๙6~6~#2askI ߰Ȇml,Vd&N);6v`;ȆءA6d 34vpȷW?A6d ^7v@;6vm8y$Ix9b#vm6v [6vm6vݗt31v>b7#vm6v w6vcɆalwpI n!c>b7[mc7lxϚ/ #==j{=dC=cQ؃m!2(acfk]Z{=dCshclc/؛ZwL^hc^lc/ِ1^^!c~kr؋m%2SB{6bƦN[01~c7m6 `/Omcldû3AXZ}dCucOmcl8a&~ac?_mc?lnuc~lc?ِ1:3ƿI}Ckc?ln6m6); &aq@mql={jdC0hkg \7۞3'16`Ȇm6m6Ɛ$#g'31܄ 7hMm p#2mmandCw6ܰ 7!cpnІچqltqO㠰q8q8H6d n qPm ql0am6 8mT8m"Ƽnb!C!!c~7m6 ||Hmql!h!l0٨nMânual0ِ1aa!cs9jdC6C6cGF[vGqDmql|N9#jG#dC6@G6`GȆm6m6lbm71 GjGdC6BG6bGɆm6m6 8 mU8m#;=qL8mS8m#2naMrZZǰcdC6A6aȆcy 8q p'0:]pWp6Ɇ womcdCkXwuWp6ɆCjqq+Lqhql8ِ1qq!cpǡjDZdCsqhqlK4b8?q8A6d nqBmql|N9j'dC6N@'6N`'ɆO-51N:mjNʂ|Il$ِ1II!cp'j'dCsIhIlp3xe4:Nm6N ?=ÞR8m"2q 8q 8E6d qJmql8`bgOó6NcɆ$gNm6N 8 mV8m&2q8q OGj؆ِ1 lÃlچA6d ox@j؆'٘Albx:9I6+'2zmxbdCK Sm$2nxmxbdC'᩶mxᝧ?{_^pKm "2{_^j^؆ِ1 /hKm "2?mxmxmx[c;c;kYY-c-c @EXe,2v2b Y.[-cW,cW-c,c떱[ۖH؝O[W;#}ʜ_VW6o{e3O.:og慎\\[ϼ\<߿[ y۫xZvγuްvyk7|u>UML |wk>te ~Gk>@5!c~Q6ΐZ}=/C8?q8C6dl ٰmQ8m!2_+k3jg3dC33YQMnuYl,ِ1RYa[ΟU8m%2ga8q8K6d V: mU8m\ce~u _xZWm%2S|⫶m 6|6| _!cpІچ/G6R9.O}{? ?lÏl܆᧶m 66 ?!c9S6ΑW~Z8'spN9q8G6d nqNmql9h9lِ1s9s؆?xoL aW6Ɇ}j؆?ِ1]w lßl|mmcqO71 硍j籍dCﬞﬞW8m'2a8q8O6d ^7C6cdoyʼne ~QF@6d n#P6Ȇm@jFِ1h#@m#۸@661.q֍ j dCo\P۸m\ 2qڸq۸@6d  F )2g51Eu#Pm#$2jF ِ1x@@l#lnBjEcĸ(ְEl"ِ1xݸEE!cpjdCEhEl#lǗ)M 19%Hm#"2mmaAdC06j:c'FObhmaAdC{_AFFL6F]rsp#X 6`!c^4jF0ِ1Y`x?Xm#&2FF0ql )tu0Ÿ$K߸q ۸D6d ^7.qImql{KjKdC%h%l#l"w_?71Bh#Dm#!2!nm`!dCaCsl#lFmz]z31BŜ PPl#lF(m 6B6BP!c9%U6Fas00l#l|N sJFF6d n# S6ȆFm\&E;&eQ7.úqYm2qln\uel2ِ12\^V۸m\&2jp>iٯb װjF8ِ1]ppl#lF8m aáppl x[sT0㊨W`ݸq۸B6d ~F <#sEm qlhl ِ1++UdloMb_*q۸J6d o\UU!c5Uq۸J6d >\6m\6{gb\kkp {Mmqlw:鸦q ۸F6d nqMmql5h5l#lPibD~#jFِ1RhNPۈ6"Ȇ8DmD`dC6" LR:S3I]Я^Wna.\\<)ŵI+uݿniœ8$]_s.*4nzpփ׃te G܀}  2+n@7"nzpD܀6nm6nu+2NĸI6$yAG~o LMM!cMM!c=pOMl&ِ17oB76nb>M[n܂u-lِ1-uKmql馄316V*q@Obhm6n MoA6naSbb6nC6ncɆml6ِ1r)6ncɆ mV۸mDYĈkH6Tۈ6"ɆF$jF$ِ1 HHl#l߈6"6";d">01q֍;jw;dC6@w6`wȆX7m6 )w;jw6}qh" Gw-c,c-cіC#Xeee,2oK%ZƞZ~==a{i{e22222221(q qt3(u5.jQpqQEQ1(u5.j(X5. wFF51g:w3jwdC.sw6bwɆf½ٻjwdC6Bw6bF/unbu6aȆ{{7q۸G6d ݃={=!cqOmqldH31 jdC6C6cɆm܇6m6 {vڸqۈ&IVp@1hh#Zm#ۈ&27amD )pNVۈ6Ɇhh#Zm#ۈ!gbbĈv \oǨm`1dCu#֍l#lhF C6d n#ڈQۈ6 ǏR`b<u6`ȆX7m<6 ׍n6m<6VLx$l<6m<6 xm* Fx l|6>m|6> m|Pm| 2_~kjdChl#(<{Mb a?m|6> o|6>bɆ甏pNH6d >|6>m|pFF_;;\d1W˘e2ayYƼ-c>1_˘e2`Kn YƂ-c),c)-c!TԖ4PXe,e,2aa]a?@4):[|s D:q.^kK qsƹ'\QSǀ_2y&F@N6aȆm$6m$6 FQoLm#l|Km$SHm b_eb5Fj؆+ِ1 WhUmp%2_S5چ+J6d ^7\ W WlÍlqcNMp66ܰ 7!cpnІچF6d >9Mm p#2mmadn5p;76ܱ w!cpІچ;N6d npWp6Ɇwh]m v}9u  lÃl|j؆ِ1 hCm 2ߧ6<6< Oq0O21< OhSm$2Wg zWچ'I6d nT6<ɆOhSm"K)^pNR6Ȇyu^j^؆ِ1 /hKm "2^ІچM6M.&ްnxmxcdC z6 o!cpІچ7M6d ^7 o olÇlNG X7|6| !cxlچC6d nQ6|Ȇm@>j>؆/~\L _aU6|Ɇ{Q_؋mbdC{_pWm%2 mmm8y֙ugS~j~v^ܥl_ :7vgw`..w`eS}?7eqO}p={޼gt;z}zOw_\Ɂ?jh_m }V&F1 ibG_mUL P6Ȇ32jFِ1^x P6Ȇl#9(~귍Mn$u#Frl#9ِ1xHFrFr!c֍jɱdCu#9\m#9H6}&FUs6l8m3jF ِ1^x T6ɆF jF ِ1@h#Pm#" I31#?6 !cFFD6d 6 hFD6d n#R6ɆCkV21wrwr6`!c`m (󿥑'16`!cpFF0l$t@i#E a@j)dCu#)6R`)ȆF X7Rm6R K,Bm#l"AV\?Ϝ>ϜU-"+YIFVFXU^ {M( s. V((l#lfha;mD QpRۈ6ȆmDAQjQF61לwD 6aȆF6X7md6 mdSȆmd#2#A6aƘ7Ohbdw֍fl|{<8z ]m#;lFvh#Fvl#;ِ1oa]m#;lFvh#Fvl#l{-֦pmmD ۈ66h!cpFF4M6d >DCjF hSKLbF وITXmĐ wl#lF mĐ [@1j1F,p4=31b:%Sb6bX!c FF,K6d n#ڈUۈ6bɆXh#Vm#ۈ#{l;qdcguJFG6d n#ڈSۈ6Ȇ ǩmaqdC6⠍88l#l?YI&FnīmcdC Wۈ6ɆmCjF<ِ1xmīmc9FV!Sˌ51r֍j9dCu#96r`9Ȇװ96Fl#ِ1FF)q&F n$m$` dC6l#lFm$ H66dí_MNn$OCȩI6d N )96rb9Ɇ{ќͩI6d o6rm6rgkt%F.X7rm6r `Km#l\\j\dCu#Km#lܺ?uW#aȭM6d ^7rú[m#7l|N jdC6rC6rcyLW `bu#y6`yȆ<ȣC6d n#Gm#l|NmQȃm%z)F^;NMK6lX7m6 mSȇm#2ȧO6\y&F~1sJ~F~!c~#?7m6 }{_6cɆF~F1I5LFhFlِ1FF!c5l-Q(@6d ^7 @6 `ƀP((l6 m6 )RPm QlnuFAl ِ1FAF!18QHUHmQlF!hF!lِ1BF!BF!!cpBjd~ .jbvSL(RXm0QlFahFal0ِ1x/Z6 cɆFaFQ޵jb"pRDmQlFhFlِ1"F"F!cg{@E6`EF̕ K01~(7m6 ( mU(m%2\a#}Y!(m%2EjE6c9ebPD1bv g5I1bv^I*W"w8$8Щ}g2􊋹8+~q\ݗ1ڴ8tP\8Ɂp(Q׃$BsEqhFql:VpQ(Q(A6d 6e UBmQl|Q?Jm6J (mP(axzޗ^a(iy?G)XiXXYX9XyXXEX%XeXXUgjꖱZږ:-c,c-c ,c -c,c-cM,cM-c,})I5gUSN%E?\v?%5$q%~IxFƕ5$8Ը>=?q%q+I5NpIXJk\I<"wJ,mOrJF)lِ1oo6JaȆ{R7*Q (E6d V (Q (M6.v21JpoFil4ِ1x( FiFi!ctJÕTiFi!cpj2d 9\(#f2je2dC}s7Q(m!2e`(Q(C6d 76ʨm6ʒMmItbFYoU(m%2_ojedCu,e6beɆFYhFYlXyǻQ&F9oF9rF9!c93F4I rF9!cQ֍rj對rdCh9hF9l<٘CM(j屍dCFyoW(m'2Q(Q(O6d >6ʫm6* !NwM Aໃ*mT6* ;|wP F!cp j dC6*@6*`FSߜ~Ĩ(FEX7*mT6* WWQm"Ql|"ߨQۨH6d >T6*mT6*flbTr 0'D_ImQl|R S*mT6* W6*aȆmT6*mT6*%S8QYa+5leFe!cQ֍jdCsJe8TVۨmT&2_T6*mT6^XT*jU*dC6@U6`UȆmT6mT6 ۨmTQۨmT%>^vĨ*lT6mT6 ۨ mTUۨmT%2ߨ 7mT6 )UjUȆOL)93ϰȆ>{_m|m|F6d ^7>u3ϰȆ?gF5x&F5/Z VSۨmT#2`ݨQ ۨF6d nQMmQl| [ ڨQ ۨN6w>aQ])R]m:QlnTuFul:ِ1{٨Q ۨM6z QڨQۨM6d >ԆsJmFm!cpjdChmhFmlXpt&FaQGmQlFhFlِ1:F:F!c9QGmQlLst=cM {ѺjudC6Bu6buɆmԅ6m6 ۨ mUۨk8{_ujZv^yqw~v݁7l\}?}sq_v}{9w2ā^={={=ݯA=2߷-91V=UO-HzF=zF}ѺnM+C}F}!cx0Ɇh}F}!ci}X-m6 [ԇ6m62Nh l46m46 MiF!c֍j dCu@mѐl>&FCa!Pm!ѐl{ m46 ?>Pm!ѐln46m46\ޫ#61 FjFdCFpHmшlF#hF#lِ1FF#FFcA/Pmbb46C6cɆFcX7m46 aXm1јl|mhhB6_UDhm4Qhm4!2_4&jM&dCFo4Qhm4!2M&jMd~01 MjMdC05Uhm4%2MahhJ6d ^7BM6bƣ?\h&;fjͰfdCfpLmьl|l hF6d Nim4Shfx?%~ahnyG XKX+XkXX[X;X{NΖ/-c_YƺXƺZƾuu 9ոkYH3gVgVk\s\S1Lkqa*,$5598?{>{\]לjk\sX㚫k\s< 'T9Uh!z7jhA6d 7}s F !cިZm6Z hmPhm$M h)FKX7Zm6Z hb VKFK!c5UKjhI6d 76Zm6ZU/|WJͭ`Jmъl|ܧk hE6d nJmъlD+hF+l5٘>iZh mVhm&2f5|vFkl5ِ15\SVhm&2ߋi mVhm!K5L&7~Fl ِ1xhF6F!c֍6jm6dCsJhFl-٠RDmuLmF܂N jmdC{1m^L[F[!cuJ[NihK6d ދ6ڪm6ڑ~+x|F;lِ1xhF;vF;!c֍vjvdC6A6aFvf 41;fўl|{<8zXhhO6d mװ6cɆװF{l=ِ1hlu7j_`_ Bm l !c_m|m|A6d ^76P@6Hw51:8αdjdCsJ8tPmt 2蠶@6d L dFl#٠'lQjdC6:B6:bɆ甎pN騶H6d >t6:mt6:3e/=I41:9ND6l6:aȆmt6:mt6: ot6:aȆmt6:mt6: 71[=21:~37:mt6: }u{_6:cɆ_ _쬶L6d n3Ym3%xV񌭉%ƗƗdCuKX7Tl_m|m|I6d nKhK/6r~ylWp+"[\|v݁.r⎻:_ɏ[y|rq~}ٿ?g뾂+= ׃.tljbǯ^cv=fA2_vt 91x]"zЅD|m袶J65hy + ]6b]Ɇmt6mt6 ]\Um+ѕl7FWdc]߇;ib|-adC=װZmklk!cpdCpp@6VF661 ݠnjݰndCu6aȆF7X7mt6 )ݠnjݰdc/S gbtsJw8tWmt'2a讶N6d n;]m;ѝl|讶A6Pcbu=6z`=Ȇ{{A6d nCmуlmPm$|,h) I6d o[Tm$27z~FOl'ِ1FOF/Ѩt{W^F/^F/!c ֍^j^dCk^p Kmыl|NmRm& K-pN魶M6d ^7zú[m7ћl|N jdC mVm!6gGԍ>nQm!2wP>j}>dCsJ8Qm!2S@}6`}FÀ=9g}6MK6lżF_l/ِ1/\Um%2諶K6d mUm#Q=M619Sm6 C@꧶G6d >sJ?~F?!c觶O6ͨj_mWm'2a诶O6d ^7ú_m?џlFhFlcx9ڔQ#Lbk1@6d Ӌ6qpܿ%Obhm 6 ׍n Pm 2_ 6m 6?df1Pa/:Pmc 1l|2Sm 6 ׍n Tm $2?81D6.ԩ1H)2Hmc1l{m 6 ׍An Rm "2SA6m_70-bjfnaie2626262626262elelelele;T4t L,l\<|aS/w57ָ7׸Td ``uk`q2qaqqL5N V׸xB669"!o1B6d 5upظuObhm 6 C6`CȆ!!Pps?611֍jCdCp=Tmc(1lPhcPlc(ِ1P01aÄa0a0!cpàajðadCkapM5Lmc1l|= 1 N6D8rY=cS9eplc8ِ1pp!c~c87m 6 m Wm ]y ibuc#6F`#Ȇ{1A6d nc1Bmc1lmPm$\)l6Fm6F Ӎt#6Fb#Ɇ甑pN1I6d ^7FB#6FbF(cbr)flٰmRm"2`1 E6d ދ(Q(!cpQj6q~.>~e|];?g뾁5oŽshF}}sq_vqoٺo=F}Ͽ`4s0F;1MwokwVѸ/cs41G`491x11׃$B}hhchlc و"wݜ&+1!c>b c6`cȆ11C6d o11K6,s8K6}aV1GUm%2ca1K6d G}XX!cαX8&8Q71Nmc1l{qj㰍qdCs88Sm#21A6a(GL@;ƫm6Ɠ ׍nWm'211O6d xhcxlcٸܬgtM bbܷ1ۘ@6d ~Ff<#3Amc1lhclcِ12ژ1ls@[ o|K6 +yƷƷdC跰Vm[l[!cpBߪm|m|K6d n[h[odcY>&DQ7&º1Qmc"1lnLucDlc"ِ1DD!c~c"1Qmc"1l,uDĘaD6:e$lcِ1xݘ$I$!c5$1 ۘD6d ^7&A6&aƴ2c;M:J1&1֍jdC1jdC6&C6&cɆ{d1&oL)!c9e SmL6 ۘmLQۘmL!2mLQۘm|G6oItwwdC~';ﰍȆaltph,w Obhm|m|G6d o|m|1lz԰t{&T MJ6l7eTlc*ِ1x1S6bSɆTX7mL6 ׍T4Q+ۂoDݘ4i4!c93Æm~4lcِ1;wOSۘmL#2ӠijӰdRWLSLݘN6Z.16cɆE}jӱdC࿧LLWۘmL'2_L6mL6f\3cB71f1֍j3dCs 8Pۘm 2ߘ7fm6f ۘmPۘm$}딉1S| nf LL!cp3j3dCLoTۘm$2SfB36fbF lbgڳ6faȆװv,lcِ12 )6faȆ{Y,YlacSf9ellc6ِ1xݘ ll!c1֍jdC6fC6fcs#L9}sm6 ۘmQۘm!27~clcِ1s_s9jsdږl21g{g{m6 )s2Wmc.1l\hc\lc.ِ1\&|ȯ||!c9e>Sm6 a/:_mc>1lߘmWۘo{#-c -c,c-cK,cK-c,c-c+,c+-c,c-ck,ck-c,c-c,c-c,c-c[,c[-c,c-c;,c?XvZvYv[XZjuje[`:-5nq 5nq -5n-5n8׸-P׸-'cָ^w~y2g뾇+"0w;[=tv^^ܥltsW>\\{}sq_v'{G{=< 鞏>wCo~x/`!}׃B,$2cYXE,`!1BhcBlc%q&"acHmcl"xFf"lcِ1Zi\+-RXm,"2_+-6m,6vecXXL6d ^7úXmc1ln,ucblc1ِ1b[[21%XXB6d Dz,QXm,!21slc ِ1%%RQ~{Kc)\,UXm,%2XXJ6d ^7ºTmc)l|XXF6=.X&2Q7Lmcl|NYej˰edCϞ-Ϟ-SXm,#2EA6aɆX.l,6m,6 a/\mc9l]{j˱dC6C6c+F~mcbs 8PXm 2ȬPXm 27V~c lcِ1xXXI6\gykjb6VB+6Vb+Ɇa~ nqY?XI6d ^7VºRmc%lJ*&*acJmclha{&6acMmcl||3ߦ F6d >ls6m6!cp۠mj۰d# k.ll6ml6 )ᜲ]mc;l|k;ڮN6d ދn6ml6v '+xwbpCmclٞٞj;dCoP؁m 2ءnq8g~O{]wLAsq/v5~Pw\ܗ]}{;yz;\;w';| 犝j;q=Id G"vE`'1xةE6Ϻ잉KMw.].!cp]j]dC]pKmcl|bKmcl88 eb6vC6vcɆm6vm6v ??>?[mc7l mV؍m!{#=pN٣C6d ncGmcl|N=j{=dCucGmcl,,8bbuc/{6b{Ɇ¾s^lc/ِ1){6b{Ɇ^hc^ {_;{Ӌ|7],o2v2eeeeeeeeeeeeeeegyE/K˖_-cW,cW-c,c-cYjܤI2ok>\Q1xk>uۇk>q2q`ۧqpG5N5nq5nJu/!!ٯO6d 퇽~~!cpov~lc?ِ1~Əd>:MEo#~TlƏƏj?b? ~k6~6~$26~T8@6E:qY7ȆjdC6@6`ȆTlِ1>hl'QePBMD ֍6~6~"2-'[Oj?a? ?~'ȆOOj?aFuZcbt7u pܒ6bɆY=Y=q8H6d {A{AA!cpjCd#MCnu!lِ1^@mlhlِ1:\WMح&7!c֍7jo7dC؋Qxm!2hl-8ze:LbNy 男jodCz Vm-lnu[l-ِ1Bo6bIdcU11y/l%m$aIdCk$MRH6ȆFIjIFِ1xm$m$a>.Xx'wxxG6d w{_6aȆ):;lِ1A6aƤW71ދD}xO6d ^7ú^m=lnu{l=ِ1xx@6;nU E?}jdCg>3I6>`Ȇ|g >m|6> )jd!eb|t s�[n|Tm|$2_|딏jdCG؋~Tm|$2E?B6>mø=,c17˘e2iy[|,c1?˘e,22h [RXRZB,c,c-ci,c0XZXe,2iKgK84k]_.A{# ϩcov B}:q.AkKqspKF6>{>v,&F O,%SHm$#2 H HF6d n#Lm#l7Jm$SHmbqg݉41\xfW WlÕl7r Bچ+J6d npUp6\Ɇ+᪶m8NrM)npNqSp6Ȇᦶm W-WMm p#2ߋq66ܰ w>i =ӹ}:w wlÝlV lچ;N6d ^7apWp6Ɇbܡ w w !/ :yV sq/uP;;0bEg?=Ps\<鞿 m By'te gzSOr cYO(S-O!c>T69>f|bx ^j^؆ِ1 / /lËl|+ymxa^dC}᥶mxKC-zLo8kxmxcdCoV6ɆmxCj؆7ِ1V6|ߥ01| hGm!2>nm`>dC=1}6| !cp>ІچK6>}W)pNU6|ɆmBj؆/ِ1x _ _l×l| mmb~dcIbb\ma~dCkS?6S6ȆmA~j~؆ِ1 ?hOm'S8>Lab9)j؆?ِ1x  lßl|Nsچ?O6d nW6y'W`b5l\m`dCu#֍l#lnm 66d/):mb$sJr8$WHm$'2aHHN6d ^7ú\m#9lMm$WHmA m>bb9%)jF ِ1W T6ɆmBjF ِ1@h#Pm#"&FXuJFD6d ^7`R6ȆmAAjAFِ1 h#Hm#&:y{MTM{TjTdC0hSg U'16RaȆTpNI HE6d o6Rm6RƝebv)Lnj);ySRm6R SRuJjFj!cgRgRm6R H mVHm!WqlbiF4F!c93F1'16`iȆFX7Ҩm6Ґ )i4jiPq<񃰉3jF(ِ1y(3U6BɆ7BFF(J6d n#U6~eb~# ajaFِ1h S6Ȇ{0؋maadCsJm%+֬4w6MUHm%2_딴jidCu#-i6biɆFZh#FZl#l9mb`_#\W6Ɇ{p؋mcdC6¡ppl#l|#W6"7Wn|LHӌ ]:d݈Pۈ6"ȆmD@jFِ1:%S"6"!c9%ڈPۈ6"F;߈FF$I6d ދF^4Rm#ۈ$2_DuJF$I6d n#ڈTۈpIg$ ε,͙t$¶dL.\ߋs&){sIJ~:OgIJy:=OAz_R3C/a=Hq=HOw_sEz Az\ғa^-"=I{Fzv/7w8ő~L̖,(X6XvXe,2k[rX,c9-c,c-cy,cy-c,c-c,c-c,c-cE,cE-c,c-c%,}@5ܥ'NDk\uˀk\q2y2'e5.8׸ eP׸ e'c'q5.2ebd62B62bɆ翌p˨H6d eTȈmd$2ȨD62W7,Id{,62aȆ2LjLdC62A62aȆ Ȥ L6R wr&FfQ72úYm#3lFfh#Ffl#3ِ143wifVȌmd&2?ȬB6\wy)abd6@Y6`YȆ,pNɢB6d ǒmd6 mdQȂmd%OnzF419%+Smd6 ׍ndUȊmd%2E^4FVl#+ِ1FVFٸ?q\&FQnDmDaQdCu# ֍((l#l߈FFE6d ދFAQjQF6q텻bMlndu#F6l#ِ1xF6lF6!c ֍ljٰldCu#Mm#l왟6Z#aȮN6d Iv IvFv!cp١jٱdC{١jٱhRәF4mD ׍hX76h!c9%)jF4ِ1 mDmDc1dcnӘ1bNsJF C6d ݺ ݺl#lF mĐ ׍h#Fm#ۈ%*?plb FF,K6d ދ^4Vm#ۈ%2 mĪmbdC6bXXl#l86ql]<[mđ hbDZFG6d o~#Nm#ۈ#2E㠍88l#lt}J/3jF<ِ1x/{xxl#lF<mē ׍xh#^m#A6zRbNj9dC0u3Æ}'16r`9ȆpNɡA6d ދ6rm6F%ǛV_ u9BKPH6ȆO'm$` dCu#֍l#lFm$ە'&FN1sJNFN!c9Yj9dCppqQphǭR}Ck#'l mTȉm"^󾉑iܔ\dZʛKm#l|#ȥ E6d S7j:c8l6qQ$F.l#ِ1xmRȅm&i.zU[a[m#7l| asm6r l .w?wSI Fn!cȭC6<?_518m4?0ǻVM|uXZ?|j|dC|pOm#lnup؈迂?G6d ȧO6~u;$򨉑_6cɆm6m6 ԍ2Vx]'16cɆm6mp*ޗ9ٺMc" Es? ;0K;O˲偟\\{ ᄍ/7l]x y\ =ߘEvzE=(AA/AA2# B zPZDA\ ԃ}&QPm Ql|nӃn[LBbO*Q(D6d >WsE!BF!!cpBjBdCuxV6p- !8!AB 4R^P$X+P~3=}s|~e֬lkEMhFMlpp:ggF-lِ1ZF-ZF-!cm1]I |CkQl}صZjdcVFmFm!cpjdCHvcɆm7V[m6Ql/j:d#115\Sm6 ۨmQۨm!2ٛ;c{-'16`uȆ[ԁ6m6\F`é\21\5-WxMUmp%2N⪶m l, vp(E<Ckp%2Іچ+Ql&F]O )u6buɆmԅ6m6 VVWm.Ql|ި mUۨm:*4p76ܰ 7!cpnІچF6d acU)I 7lÍl|Mq6669a7,p[j ,Z#KRklyZjM,Z3KRkiZ[j^ZKRZj,ZKR:ZjZhu2/g_>9=q=q:]=x=8/|_b=u{\=q2q`qN6VR4e.fw87mcdCHF4wa6ܱ w!c}j؆;ِ1 wh]mۨO6҆obwF}gهMvK6cɆauup8*bڨm'2C}jdC6C6c ƛk&F7@mрlo4}Flِ1E E 6` Ȇ j dޅ5oLFChFCl!ِ1xhFCFC!c5!\Sm46 hm4Thm4".&F#16h#FF#!cggm46 )HmшlwFF#F؆8ԬX C\=6< !ck1ZچA6d O lÃl~fhCmhL6xbX)Xm1јlfM tpذ}ꨱFcl1ِ1xh FcFc!cw66m46<ɆŽM O><#I6l.ymxbdC z=6< O!cyj؆'ِ1x6<6<&dc˔471&jM&dC0}aW&F!cgrgrm46 a@M6`MQh*w43eSFS!cy)7m46 )MTm)єl|Mi m4Uhm4#ç>fb4}6aȆ7̛m46 )Lmьlo46m46ETyRhaFsa<6Whm4'2HsjͱdC6C6cɆFsF u1J&F 7ZBmтlo}F lِ1F F !chhI6e yl[7yFKl%ِ1FKFK!cp-j-dCE[B-6ZbFESh%QkQk hE6d nJmъlF+hF+lِ1xhmRhexȫu<[NZE0O|5Z݁9xwZÝHkom?i~5<5^t3e\#>^xٗ1 Mp?"2n[xEx~E"d  / /l 2</ /Fl ِ1Zm6`mȆ[ݢFl ِ1ohm6jm o%231 o olÛloxþ᭶mx pV6Ɇ7᭶mIb>wۻچC6d nQ6|Ȇm@>j>؆ِ1x6|6|dآF[8@1 mjmdC6Bm6bmɆהpMihK6d 7Bm6bƎ>21ډ22کm6ڑ Nmюlo}F;lِ1uvF;vF{2뉆矚>=ܧWhm'2ahhO6d 7þ^m=ўlo6ګm6:9ͳOh fp@6d nAmсl|a;mt6: j _1f靷L _1oyWm%2_S|⫶m 6|6| _!c mmb~d/}[76 ?!cچG6d 5Om#27 ? ?l#v_Lot}FGl#ِ1xFGFG!cjdC}#Qm#O6V,cbY΢j؆?ِ1R)a lßl܆?᯶m 66x#&FXSm 76!c=lm`dC6l#lTYmL@7aT6ɆI $mbdC6@@l#l|66Ndȥ7#vļ 6:aȆgNp D6d c3FWObhmt6: mtRd70Ax[j!ZgK-R ԺXj]-pKau"-(K-RzXj=-^ZoK-RXj}-~ZK-R` Yj-!QRl1NAb _D=Ng=. q2_qAQ1x =.Hl=bnssF0lB1 ׿``l#܏&b/jF3Mp``l#l5]ab(F!j!Fِ1u!ٺl#lom 6B6Bd*/61: jdC}36:cɆFg7:mt6:  mtVm_yZ*lBjF(ِ1Px-&Tm#%2ombdCOBjF٠;lga{a.6°0!cFFF6d O'Lm# #2Nmma]nW{dbt} ]6`]Ȇ>Em хl~x}Fl ِ1袶J6-.how%ӆ_^\nmt6 )]Um+ѕl|M הj]dC{خFWF8٘pq.F8jF8ِ1ph#\m#'2omcdC}#Wp<:z/ٺnPD7nvn]78[tS;fw`߃uS;~7f?iS;y79A'yzzg>Dٗ1x? B r c"jDϘFFѝlGxLFwhFwl;ِ1FwFw!cGw讶N6d 7mtWmD =jbD9"jF$ِ14jF$ِ1)#)#6"H!c mDmDbQd}L(q{=Jm# ۈ"2ߛFiFE6d ~3 ^Rۈ6ȆmDAQjQF4(E5LhD5%Zm#ۈ&2v4|vF4M6d >oDy#Zm#ۈ&2_Shhl#l䠹Ĉ6bl#l|MkJF C6d n#ڈQۈ6bȆm@1j1FbɴZI[=FF!c5\Szm6z mPm 2衶I6t.S mTm$2ߧj=dC6zB=6zb=Ɇ獞FOF/q;[#wL^b Szm6z )Kmыlzg/xūF/lِ1^F/^FoqEH5Mޢo}Fol7ِ1x FoFo!c}JoO魶M6d n7[m7K6Zh%#Vac6Vm#ۈ%2 mĪmbdCkJ,\Sb6bX!cpFF,G66y8NY#N876Ⰽ8!c`K[ٰ-mqjqFِ18h#Nm#ۈ#2}5ڈSۈ6Eu]1裶C6d 7Gmчl|>j}>dChhFl/٘Er }F_F_!cQvam˔$F_l/ِ1}6b}ɆהF_F?1$bg\&F?O)6aȆ)>F?lِ1)6aȆF?hF?l?و^tg,&F7þ_m?џlW3Æ ]Z$Fl?ِ16cɆm6m6Fe313Ixxl#loþmē pވWۈ6ɆCjv&ac1@mc1ljdCk Pm 2ߧ 6m 6:-ONb k@ Tm $2a1H6d k@@!cYt 1Pmc 1lW& ac1Hmc1l hc lcِ1x A !cpAjd#Obǂ68l;8m 6 _ o Vm &2a1L6d 6m 64ov"7m 6 m Qm !2C`1B6d 7@C6m #Rf FXj#-QhKm6Rg&Xj-IdKm6RfMfXj3-YlKm6RRg}mͷX3zǕixn(|n =n(8FCl4T7zC~{ =n(8_ {Pu׿q/WL%/Am#H 2_m$ H66!cp FF݆!ag*$:H ˌr9L-b]9xrv𿟭{0av=_Oj3L}Ͼ9xZv[7 as> tep~0\}~0ξp `891<<1$BphcplcؒݱGL9¼tp=j\WFm6F <c6Fm6FG5jbh8oVm&27Fychlc4ِ1hh!c5e41Zmc41lz&k1!ccdlc ِ12)c6`cȆה11X\a c11K6d kXX!c1jcdC}c,1Vmc,1lxuwbcxb|b8lcِ12)6aȆm6Ʃm6Ƒ q8qxQoż16cɆx7ƫm6Ɠ a=xx!c8mxQJє 3M hclcِ1̽g~k8Z-I !cL1ۘ@6d 7&@6&`Nc7&ycDlc"ِ1,:΢6&bɆהpM1ۘH6d mLTۘmL"[6Ę$lL6&mL6& c8ln1 ۘD6d Lk$I$!cpIjd%Ś2)6&cɆpޘ1ۘL6d nc21Ymc21ldhcdlc xXH&ac 1Emc 1lƆ3Ɨ2 '16`SȆ)pޘ1ۘB6d ~_hclc*٠/ŚSŚ2)S6bSɆSvTlc*ِ11S6bSɆThcTlc8Z&4ac1Mmc1lٺiٺijӰidCE6aȆ}M6mL67ϚŚ2)6cɆ)>etlc:ِ1xߘtt!cpӡjӱdcR=b6f@36f`3Ȇpޘ1ۘA6d nc1Cmc1l|MmPۘm$sL=Ę)֔pM1ۘI6d >ōLL!cp3j3dCLhcLlc٠MYIE6l$gm6f #Rۘm"2΂{YjYdC6fA6faFVp&l̆kll!c1jdC}c66fcɆm̆6fm6損.c:\015e\Sm6 Ϣs,:Gmc1ló}clcِ199Ɨd >&Ɨ荍/ƞg6-m|%%ِ1u/u/66$2~ _m|m|I6d ?&Ɨ\ksŚ2)s6bsɆהpM1ۘK6d αcs6bsɆ mUۘkx8+3I͆<mR.<O3I_A_|ew`󙤯J}}s$}Ws7OySỵ/cb\+`911"~0D1߬"aߘ1ۘoۘmWۘm7+w·6m69<[eb,p?EpXX@6d 7@mcl|?m,6 vl/7w8ű~EbKmR[f}c-VXj+-UjKmR[g6Xj-MfK[KmRf}gmvXj[j;-]nKm/ ]k5qvtP Pz-{BR1 =n!q B{B-"ǜz=HHmcl|[׿EjEdC6A6aȆ,6m,6 )Lbm,6 Űo,VXm,&2XXL6d >7/6m,6o~G18^B6R]|J%jK%dC6@K6`KȆm,6m,6 %%R1o61jKdCkR,UXm,%2XXJ6d 7BK6bȻVnb,sfedv2e2!cpˠej˰edC6A6aȆm,6m,6!11o>ooȆ}} ِ1o൘o66!2 7rqIM{3A,WXm,'2F -'mrlc9ِ1xXrr!cpˡj˱d7經I+kJ0ltřN+6V`+ȆהpMYXA6d 7VBmcl hc lc%p\H}X)֔pMYXI6d c##eϓ+6Vb+ɆJ7Vm6V J*Q}{Н&*~U06VaȆ*7Vm6V XmRXm"2î6Vm6V^c7Vycjlc5ِ1@g 'KVm6V X mVXm&2j5d#iX#o7֨m6֐ ?>Fmc l|X5jk5dC࿧6֨m6֒U\eb6Bk6bkɆ獵pXXK6d 7¾Vmc-lo6֪m6֑jb6A6aȆo7֩m6֑ XmSXm#2XXO6n-@ &zac=^mc=lj뱍dC6C6cɆm6֫m66W vlcِ1>eܧlP؀ml 2ؠ@6d ~}cAmcls(F76ml66 Ϣ,Qmc#l|gэjdC66B66b֎wM&M&!cpMjMdC}c66aȆml66ml66c7ܸ?,ll66ml66 Ϣ,Ymc3lfhcflc3ِ1fvu>[W.ٺoZķv~[8w~v݁9xg[~Ӳo9V}ο` !j8>"ޢ>[p?Bg_` [~l"El` 1ZآJ6 VoU[ZUmc+l|ojC3V8cnU؊ml%2تF6~4&઱Mmcl|o Mml6 mlS؆ml#2 ئ l4&G8;2}}ِ1x66#2_Skwjaߑ Nm;lc;٨MϿŚ)6cɆv7ml6 olW؎ml'2-@6ml6v2fInbP؁m 2EwYtlcِ1{v}cnlc7ِ1$$6vcɆgpݭM6d nqʓ{}{}{6`{Ȇה=pM٣C6d 7Gmclo6mp?ѼFΎD{hc>lcِ1bO!%?G6d >탳>}>!chOmclLϕ]r&~~~~!cy?m6 oW؏m'2jdcW71qjdC߭;[w@mqlm6 {v8q8H6ztY㠰q8q8H6d 7¾qPm qlZAx-Al ِ1x8mT8m@6.AAml!cy#aȫs]K}Ckl!cy8oِ16~6 z@㐰q8q8D6d 7qHmql|8CjCdC6A6aɆ[Mқaa!c=a=q8L6d n0qXm0qlahal٨$&O9)G6`GȆ5959q8B6d >o#!cpG#jGdG 爟6~6~&2 ?mmL6d V m3qll?ťs& 7NqBmqlo} lِ1x8  !c h l$XQ-O'='='6Nb'ɆI7Nm6N 8 mT8m$2'j'SdcNtGMSo})lِ1x8)S)!c5\SNm6N S)Si1zyE8 ii!cqjdC{pozZm4qlihil s}˲]&ll3!cpg3jg3dC} g6`gȆ8mQ8m%aovȹ8SΒ7Ϫm6Β 8 mU8m%2ga8q8K6d = mU8mB6|ڔX8v /j` y__Ȇmm ِ1__6~6Αm)x9x9lِ1}5sj簍sdCsprNmql|8mS8m'l,8/y7Ϋm6Γ )r^mĸ lِ1R虤 j dC6.@6.`Ȇpڸq۸H6/o3ĸ(E7.m\6. )rQm"qlEhEl"ِ1x߸m\T۸m\"Iblb\}6.aȆafQg g/m\6. ۸m\R۸m\"2q ڸq ۸L6.Y&ea2qYm2ql|޸ jdC7.6.cɆm\6.m\6k31{v{vm\6 ?t>tEm qlo\}l ِ1++Uq M1qmqSn=MM!cM߾q۸I6d n&qSm&qlMhMlوn&-܂k-[-!cpC6nA6naȆ5mR۸m&b[+W~Ӳݺ_9U}.y;t7~pte ~pW.wɁ= EU]!c~pڸq۸G6Vĸ'q۸G6d >cރ3={=!c\+m6 _mS۸m''4}q_oW۸m'2qڸq۸O6d n>q_m>ql}h}lHqp}˙= ' ?Pxm< 2_S5lِ1!chl7Ù~mmF6d 7~}7߰Ȇmmِ1oCqc11O=̌?Pm!lChCl!ِ1uCC!c5!Pm!lxn㑘7y#lِ1G#G#!cGjGdC6A6aK[jb<6C6cɆw>;m<6 x mss!c59\Sm<6 xm6x7/`xxA6d ~ x  !c5\S^m6^ )/j/?Fc݃mmA6d aPloj` Cml%٨SWMo}Kl%ِ1LtpذRm%lKhKl%ِ1xxE6Jzyx+αWjWdC+8oRxm"2 x xE6d 7^A6^a꤉ZװoVxm&27^ykl5ِ16^cɆgk&RL7hl ِ1o6`oȆm6ިm6ސ ?xxK6^{Z㭰xxK6d 71нo6boɆהpMyxK6d l[h[lٸ; Mw;h;lِ16aȆ;7ީm6ޑ )wjﰍd㗃QUn31;O1'=ٰWxm'2f^3xO6d ~{x{{!c}{h{l٠+pLo|}lِ1x!cjdCG}LGxGl#ِ1GG!cpjdC}#Qm݆?$N43IBEia߃'?vןpS}}sO:9S}s{_6/˛^ޗ$.}?GRK-RKaRYj-4ZZK-R`e2Yj-5K-RferXj9-\ZnK-Rg> /L_9̫צ&q3O4)Ct$.kI\к׿׵$.I\<׿׵$.ikI\PSǀ3OR1921'uAuOHJ6d WJֺjIdCXU/FRl#)ِ1FRF23C&F2~_b2t_b2dF2!cpɠdjɰddCp24'SHm$#2+%6m$6>#] 3a3h3ϰȆ悮ِ1x 6>6>#2Am|m$''v|$b$w'wA'WHm$'27y#Frl#9ِ1FrFr!cHHA6~e@#s5?¦  7Rm6R ))Bm#l|Mgj)dCh h#F l#%(g/L.[Jt%FJl#%ِ1FJFJ!cp)j)dC餄6Rm6R56cbr߭K傾[Jm#l|MIהTjTdCh*8RHm"2Tjd#COKTMbM gjdChj8VHm&27Ry#Fjl#5ِ1HHC6&F4.;i6`iȆiȆm$NHC6d kJ4F!cHHK6$v41ҊjidC}#-i6biɆM낞MHK6d c#[lUHm# H;(F:l#ِ1R8ٰ6aȆtpHHG6d 7A6aQKLbSҫm6ғ oWHm'2_S5%Fzl#=ِ1H@6OL4A\}ePȀmd 2fPȀmd 2`Ƞ@6d mdPȀmd$+_Hs712a3a3md62 _odTȈmd$2ߧdjdC}##Qm##lswLLF&h#F&l#ِ1u\гu62aȆmd62md62  Ȥ L6Fp{" 8om`.dCuqAuQp6\Ȇm@.j.؆ ِ1mm`YFت 6%L,bMה,jY,dC,pEm# l|Smd6 Y,jYdWA#YaȪJ6d dkJVFV!cpYjYdCe6md6 /11 ljٰldC࿵eeSȆmd#2 Ȧ F6d 7A6aFKjbd6C6cɆFv7md6 ἑ]m#;l|mdWȎm '59FF!cp9j9dC}#96r`9ȆgFFNrhwS9FNFN!c5%'\Srm6r  mTȉm$29j96y"c{l].("ZD.sI ў$A.sTrWuϥ>g<-;xfrsK}s~՞&~ 7{>|F>!c3Om#lt>MF~h#F~l#?ِ1xF~F~!cpjdC6C6c ZFsashsϱɆm|m|99ِ1ϡ6>6>'29FmQ@S }JF!c5\S m6 Q@mQlFvÜaw8QBZaKVR+fJXj%-RZiKVR+g*Xj-/,JZeKVRfUjXj5-ZZmKjյ,)H=$l̟SALALAu+{\Aq2_ = 8T'c߂ WP 8j4LB>B>BjBdC_!R(m"2Q(Q(D6d >6 m6 §>hb}06 cɆm6 m6 ͅ\Xm0QlFahFal٘|YS1&F17ss"F!c5\Sm6 (mQ(m!2NW(Q(J6 Z5(\S͢EɆfѢjEdC߭+ꂾ[WTm(Ql|M) הjEdC}(QTm(Ql4;&F17QLmQlbbjŰbdC}6aȆm6m6ҵibW(m'2LqjűdCW(m'2]8Q\m8Ql^/QB\-P(m 2EKYF lِ1x(F F !cp%j%dn<˛%$ÖT(m$2a{QIFI!cQj%dCkJIhFIl88 D(F)RF)!c}J)O)Q (E6d nQJmQl|R (Q (M6$ݙ"K6EKYFil4ِ1LppHwe)K}Ck4Ql|RSJm6J FiF3^41e2je2"7yFlyo2p(Q(cޛ-bpe2jed#Ή—eŚR)e6beɆהpM)Q(K6d n,QVm,QlFYF9[M MrF9hF9lyo7ʩm6ʙߊ|M)הrj對r"7A6a;Nw5\31 塍j屍"_S5Fylyǩgp-Q(oq*b5oԁF:F!cpu:ju:dCkJhFlÕlkp&. .چ+J6d @W@W WlÕl|uچ+J6d npUp6꒍w'|Ĩ+fѺpQۨK6d 7¾QWm.Qloԅ}F]l.ِ1F]؆ٸ!經IL 7 ssٰݜ릶m  ~Mm p#2mmandC6ܠ 7 7 aagyVRk`5YjZcKRkb5ԚYj-ZKKRXjޖRkg:XjR,@K0=ϩX=8=U=u{\=q2٨=8WOϝl,S_M wl?waLɅ]mp'2>[箶m p66ܱ w!cpWp6 \01ꋾQjdCss}87Wۨm'2v}}jdC}>Q_m>рlt&F5\dt֭=Jk4Phm4 2|Flِ1 6` Ȇ66m46 F ahhH6d 7¾Pm!ѐl|Miהj dCkJChFClȝ]rLFF#hF#lِ1,΢6aȆF#7m46 )Fj *p?hFg_3f3蠙A3L-H͠fjͰd\/"ۙͅFsFs!cp͡jͱdC6C6cɆFsF ~a^MLj-dC6Z@-6Z`-Ȇm6Zm6Z hmPhm$WqVh)l6Zm6Z Ϙ-Rm%ђl^phhI6d n%Rm%ъl{A &F+kJ+VF+!c VjVdCVpJmъlF+hF+l5p@B&Fkq-5Zm5њlo}Fkl5ِ1FkFk!cY5Zm5E6Fy+%wz^j^؆ِ1^ym/ /lËl^^j^؆ِ1 /hKm hC6B hv8F)mFm цlo}Fl ِ1xhF6F!cpm6jm oQ k†7᭶mx pV6Ɇ)p⭶mx 66 Q-eb>ІچC6d   lÇl܆᣶m Ϣ>ІچіlY˸&F[a-Vm-іl|Mi הjmdCkJ[Uhm%2hhG6N=ɇb6A6aȆF;7کm6ڑ _hoShm#2 Nmўl8^^a=l{F{!cjdC}=6cɆm6ګm6:}-. Flِ1uu6:`ȆF7:mt6: Ϣj _~/R11|Ś _ _l×l| )j؆/ِ1 _hWm%2 mmb~d?g6 ?!cy#a# *I ?lÏl܆᧶m )~ІچёlT[ż6:bɆ獎p訶H6d >otFGFG!c訶'<01w]w6 !cg3Ij؆?ِ16$9fb8lV0I6ɆI66lCsbFF@6d >oy#@m# 2}m`dC7l#l,|#й>l>T6ɆojF ِ1ה@@l#l|66NdL 01:y7:mt6: NotRmt"2`褶 D6d 7:A6:mYlXj-PK-Rbu-nZRԢ,hK-RazYj-XK-RcYj-xKm6Rd ԆXD=nRʧ9<[? qII1zܮd/7A{\8 =. q2_qAQ1* u _0وl#Xp V6Ɇpm $$Xm#&2 mmc!dckbwwm`!dC{B6B!c(F!j!Fِ1lmmm8|xٺΰ[tVlag:Y݁9xϳuU~Ӳl]gx;ygB霧:b^C/yP:s)5JA(}AA(@ PPBIBjFތ&F#`gS6Ȇg08cmaadC3f16°0!c9" S6G/IjbtqFgهMvK]6`]Ȇmt6mt6 mtQmt!2].j]dcIGbtuuUmt%2KWޗj]dC6B]6b]Ɇg̮FWF8H`|]#\ W6ɆF8jF8ِ132ppl#l}8mt#h11y7mt6 Ϣ,Mmэlot}F7lِ1 覶 ۈ uwXQ'#B7"6"!cpFFA6d Ol#lFmt'?O]otWmt'2_S5Fwl;ِ1gUjݱdC6C6cdLH7"a߈Tۈ6"ɆmDBjF$ِ1Hh#Rm#ۈ$2 mDmDbQdW޷QoDmD l\rpظSoDy#Zm#ۈ&2 mDmDc1dc֦=׌71b321l#lfMwH~}F C6d n#ڈQۈ6bȆo@1j1F[tS=ĵWF!c}JO顶A6d {{F!cp=j=d{VIq=M==]w{zm6z @g\t*I FO!cj=dCkJOhFOl"|~&F/O)6zaȆ襶 E6d nKmыlo6zm6zVmobvo&G^m*`{m6z ì)A?r?M6d n7[m7ћlo6zm6bkijbĊ FF,K6d 7ba߈Uۈ6bɆpmĒ a񏉁lĪmbqdnjbĉ{{=qjqFِ13q88l#lomđ 8h#Nm#C6V| &F7Gmчlhx]Flِ1om}om}6`}Ȇ@6m6AwN61: ۗl`m6 #J%t_F_!cp}j}dCkJ_hF_l&F?7Omяl~~j~dCF?8oSm#2~jdãX\MWxFl?ِ1)6cɆp诶O6d n?_m?O6 ܻ#^؈66ⱍx!chF<O6d ~]4^Wۈ6Ɇהxh#^m#@6>K3@&[[!cpjdC}c6`Ȇm 6m p<3LRD3cg)cZ@s?4b|&i 6@7Oss>AtίS7H̘>p?Dg_`~0|11A$B0sD>gn2 lc0٘XXC&`V k``!cs06cɆ׊p1L6d c#3F!+&chm 6A'6"7m 6 !o Qm !211B6d c#3l >sMbxޗM/0wq #Rf FXj#-QhKm6Rg&Xj-IdKm6RfMfXj3-YlKm6RRg}mͷX2z\G.s*zPㆪ{PR1x {Pu{Pq2G7d shnqC@6j~{&Flm$ H66!c/ j Fِ1h#Am#F6rNd1Lm Sm #2y0lcِ1jS Sm #21 1 N6^ξ2}Hcy8yplc8ِ1xpp!c1jñdCp'l Wm gӄgbp0'eٰ6Bmc1l)D {QvY]M)ŝ@q)n&BI @HDqR\[=n;ógڞ13g ۘmLWۘmL'2ޞmL6f61fò1ۘA6d Sf2Cmc1l̀=e lcِ1Ϭ:c1Cmc1l=P\Wc7fycLlc&ِ1˥dv4Smc&1ln̄ucLlc&ِ1L؆+N01\ WhUmp%2f>ꪶm  WX7\6\ W!cYpUp6ff':cb,8Rۘm"2Yfm6f ׍YnRۘm"2٘a<Zd&l5}Vۘm&27fycllc6ِ1ll!c-16[!ٿ1ۘC6R?PĘ)a;Gmc1lY9Y9js9dC=e)s6`sȆ9Qۘm% i9Ln̅uc\lc.ِ11s6bsɆ\X7m6 sjsyd{EiMywG[7Omc1ld{wg OύO\ZydCߣG7Omc1lñ6m6 gMṅuc|lc>ِ1|/:_mc>1lṅuc|lc>ِ1|Ǽ|pi Ckc>l̘@5P]]j dC06:c8l~klcِ1!c1}QCXm,$v]Pԍn,TXm,$2 aXXH6d SžPmc!lFg /2Blc٨x벉ȹa]D6^%@XXD6d ~?eHmclEEjEdCuc6and#ϩaݒƛnnᦶm o 7 7lÍl⦶m nppSp6u?#X,~rqz{6cɆm,6m,6 ?>Xmc1l,=eblc ٸ6X",Sm,6 K༱Dmc l|X%jK%dC0{-16n؜_Xm,%Ҧ 71o,YXJ6d }-UXm,%2XXJ6d nƥdK6m8^Z|@y׼[ L-b]9x^ݺe`tZwk627O˻L<I}up9_r:翤,Px}a|DzֲβkY[[6X,k FZememe-IJŲղjYfY [",k-k;,k;-k(Ze-Ʋk>78>揓qްyk7qTd aV8o\㼩y筮q޸yS1x5[]q!Igjv#l@>j>؆ِ1g>3 lÇl܆᣶m ᣶m%w{+X+l6֪m6֒ _STk6bkɆkjkdCuc-Vmc-l8621։up:lcِ1xX:u:!c}upn:lcِ1xXmSXm_}:cb 놯چ/K6d >oyWm%2)mbdC6| _ _lÏlLp^'pچG6d S8c$I`UOm#2~nma~dC=S6F7b/lCj؆?ِ1xO=_m'2nmcdC6  lc=٨횠`c7yczlc=ِ1>]Wg #/6cɆu_u_XO6d OX@6QbA༱Amcl| j dCuc66`Ȇml66ml6F/116!ckx m _kl#lFm C gžm ׍@X76@!cFF H6d >oBjFوp<0 R6ȆmAAjAFِ1 h#Hm#"2mmaƲ3ouFxQmc#l:e#N٨H6d ~ ^nT؈ml$2ب&/},ޭ mcdCF076`!cpFF0L6d >oCjv69߭gf n&8elRda߭&MvI;=#klRMop=LTр 'zZf::7f\6ٗ1x= f͸l&2 ?6El`31^fhcfl#lq &Fط!j!Fِ1kDFB6d >cjm !FFl8(jbluc [6`[Ȇml6ml6 ׍-nlQ؂ml!2#@[6` cibluc+[Ɇ{VSml6 Ϙ[ጹUmc+l߈31jW31BŞV(6C6BP!cpFF(J6d SBaO U6BɆ{J(ml#zuR[c`ئ F6d ncMmcll=e6lcِ1m6mFwbo#(F {ZajaFِ1V S6ȆFajaFِ1mmad^}hb{JF8N6d >Y4\m#'2mmcdCu#W6"F]__61"h#Bm#ۈ 2mDmD`dChE#6"!cmDmD`Ɇ%&v1olvv!cpۡj۱dCv8olW؎ml'2mlW؎m 71lg8u5.j8qRqqQ1lg8u5.j`S׸8v3/ t01v}]pn.lcِ1x.].!c͝16lޥ E6d  إ M6~~O&nQ7vú[mc7l[zwm6v ԍfL֯bhm6v ͻj=d-僪{7o|Q؃m!2٣C6d SGmcl6m6aS[Xa.t ^^!cp{j{dC0=3FR}Ckc/l6m6]'z>Sm6 t6aȆm6 ׍}>}~Q1d61;gQўdczw_mc?l~hc~lc?ِ1jCkc?l|mWoxݺ|qEnvy&9vp<OPn:^+Wמows~@}zpÆ?|)T/czpփjq=8Hd S8c "zpDW6m6;O8$Cp8q8D6d >c3!C!!c3VޜZCdCCjdï11;sqlnV8m&2q8q8L6d c3]mHU a!cq8q8B6{ <~8"X7m6 8mQ8m!2?q8B6d nqDmqlLסҶ&Qq/(|Tm(ql|8 獣jGdC 5{8c8l~Ql(ِ1Q1Qk&1aqLmql|/ ?q 8F6d 3tp8uCc?|Ckql|OqLmO6r^/ޭWjF<ِ1xh#^m#ۈ'2160ZF<ِ1x݈66ⱍdswwzDžqq!crjDZdC06Z8c8l/="">W16cɆm6m6N+秌8!fp=q8A6d ^7NqBmql> x lِ15 h l$i&I1oII!cq֍j'dCIN$'6Nb'ɆIhIl\(&)Q7NqJmql)h)lِ1S)S)!cYqJmql+8-8 8q8M6d qoV8m&2a8q8M6d ~4qZm4ql[|qF3Q8m!2q8q8C6d n qFm ql33YQ6}ѭL=Yl,ِ1,a8YY!c՝1{/W16bgɆgѳY92-O=㜰q8q8G6d ^7qNmql9h9lِ1xO9mS8m'/_hb=<)6cɆ?8q8O6d >yy!cyqV&aqAmqln\ulِ1  !cp jdcӅnc21.N.N.m\6. #捋jdC=")6.bɆqzڸq۸D65~lz㒨`ݸq ۸D6d q o\R۸m\"2`ݸq ۸D6d q ڸq ۸L6?,%qY̢,zYm2ql]]jdC6.C6.cɆ{ehel hx2mŸ"zSm\6 WqEm ql| ߸q۸B6d ^7@W6`WF!!7WuÜdvRm\6 q"_ڸm\%2Waݸq۸J6d ^7BW6bF5_11y7m\6 _^װ6aȆ5X7m\6 }]6m\6;&EO{uu!cq֍jױdC6C6cɆm\6m\@߇s[ۖ;{G?,k-kO,kO-k,k-k/,k/-k,k-ko,ko-k,kZ}}}}}j uyL3݀]ݰW6sD߭gzv^jwn*vC]nث9x vޭk uM:>B 3%fTݤ/c#o}&91x_ ETM!cy&qSm&ql8~㖘opKmql:6naȆnk[jC{[jdOV[eb3߆3V۸m&2ߛ fom6n K6mm!c=mQ5 L;n܁ulِ1xݸ;!coiށҼq۸C6d ~tڸq۸K6Z 㮳no{%۲q۸K6d ^7ºqWm.ql~]x]l.ِ1xݸ mU۸m#yC1{:={j{dC6A6aȆ{p޸q۸G6d ^7A6ay51;O6>*7}}!crjdC)u}}!cgC6cF 'B;ļ6`Ȇm<6m<6 Ϣ,@ml@ml,}{vCjdC=!)6bɆ{CSm<6 xm>6m<6413x3lِ1xx3g3!cpϠgjϰgdCuLmld8Qs㹸k{xN6d"G\m9lshsl9ِ1s 1kFQMb3xA6d ^7^Bml h lِ1xOymPxm$}_:gbK8oTxm$2}_m6^ x mTxm$2/j/Wdag21^ WjWdC{9Jml:Ny xE6d nJmlāQ&kS^ÞZm5lntupذ{xM6d ^7^úZm5lkhklyF7oDx7󴰈7pxxc17777[q#&kM[h[l-ِ1Fgg$chm6ޒ Uxm%2ojowdvSS6aȆ識Sީm6ޑ ׍wnSxm#2xlxͿ㣫7Ɵjb w'|O??Ɇm m''ِ1xOSmO 19Igjy'/X-R.<O;I_vI:I g/7ON_>zyǙb~{{:2jq=xOd ^C"zD6ޫm6> fp@6d ~^|Pm| 2{@6d >G|6>m|6>L?`jb|u#6>bɆ>=jdCu#6>bɆGhGlxs=㓨` D6d ^7>Iml'h'lِ1\OjdtSq)ya6 >#)&oP|Vm|&27>ygl3ِ1goYm3lF8B6>Z"X7m|6 ׍/n|Qm|!27yl ِ1xm|QbK}EmǷ89%}kYKdYKlYKbYKjYKfYKnYKaYKiYKeYKmYKcYKkYKgYKoYsee}gYdYlYbYjYfYnYaYiYeY՚㏓_J;~qJŸYMYSqS%ss47c%Q4c%5. q}}C6&* ߷} ِ1xo66!2 77dC@ߨm|m$$Ms| HaޑIH6C?h1j dC6B 6b Ɇm$6m$6 Hm$THm|K6f.b|o]ƷƷdC=[SUl[tMƷƷdC| m|-l$o \\л6aȆm$6m$6 ׍Dn$RHm$"2ߧKm$RHm$&{⪉Xԍİn$VHm$&2HHL6d ~]o'VHm$&2)j$dc0G(FaF=߷I6`IȆ钸}$jI$dC=% )I6`IȆ{Jh#Fl#)kV3C=&FRQ7ºTm#)l|M gѤjIdC=%))I6bIɆm$6m$6 i&F2 S7 -ͱdjɰddC6A6aȆm$6m$6 dF2dFrѣLREL.ٳ.ٳjɱdC6C6cɆ{JrSm$6 }%6m$6Rcx)DOI{J F !cp)j)dCh 8PHm 2NImPHm$#)aHHI6d jJjJFJ!cp)j)dC6RB)6Rb'חO11R ֍TjTdCu#6RaȆm6Rm6R Tjdmb6RC6RcɆm6Rm6R Ϣ,Zm#5lSC6RciA G1҈4ji4dCiF4F!cpi4ji4dC=% Fm# l_]:VԍnUHm%2FbF4-ٰMHK6d n#-Vm#-lFZh#FZl#1鄍tF:tF:!ctj鰍tdC6A6aȆm6ҩm6ғ66ib6C6cɆaltvpذ=b^m#=l|#=HHO6d >6ҫmpbޭg yN.j.v;x\Gu.𾚋ځ݁9xO<8:.b?)Ǧts9w s] zČ 곟׃ te seP;ȀAr ck 4ZD\2'mdPȀmd$35l1Q􊌰WdTȈmd$2ֈjdC"#62bɆmd62md6#N]NNm;l;!c]16F"_l|Θߩm|m|G6d >G|m|l>0ov|#e-e-ee{ZAZ!ZaZZQZ1ZqZ RҖ2-ke-k,k-k,k-k,k-kU,kU-k,k-k5,߇C5c#7)95.8׸5.//٨rCM.wrͫK6d n#/Wm#/l|./ܧ˫K6d >6m6l{&F>17ss>|F>!c|p?F>l#ِ1ܜ6aȆF>h#F>l#?٠/11;m ۏtWȏm'2aȯO6d ^7ú_m#?lF~h#F~l8_Yz LnuFlِ1FF!cQ֍jdC=Q@m=He{,jd#$z{ﱍɆp{߫m|m|O6d >~g66'21@6W(H6dI.M x |FAl ِ1Q6 bɆ{JAS m6 6 m6 sy($zJ!S m6 BR(m"2)`O)Q(D6d S A6 a=bbu06 cɆ{JaS m6 ׍°nV(m&2E C6 cEFI֪QDԍ"nQ(m!2E`(Q(B6d >oF"F!cpE"jEd#B1Q֍jEdCFQ8oU(m%2Ea(Q(J6d SBE6m8^*|.GݺbZS(fa迃wQL݁9xR_ϻu/>g<;x:缘8{jf8zMnuFyl<ِ1FyFy!cp﫼Fyl<ِ1uJyhFyl@{p&FaQAmQl|ި j dCu6*`ȆmT6*mT6* ~SĨ(lT6*mT6* ׍nTTۨmT$27*yFEl"ِ1oT6*mT6* Ӳ&F%aQImQl|_Q ۨD6d nQImQl|ިmTRۨmT&?aA E+mT6* ׍ʰnTVۨmT&2QڨQۨL6d S*C6*cUƩaݒg51U}*jU*dC6@U6`UȆmT6mT6 ׍*F*FUAT&FU5Ql>UUm*QlT=FUl*ِ1FUFU!cQڨQۨF6]`ŗQMoT6aȆmT6mT6 _Vװ6aȆA6aĨ.~ ]jձdC6C6cɆakjձdC߿mTWۨm M*̮QC\Ԁ)56j`5Ȇk=j5dC=)56j`5ȆF hF aa05-eYmYcYkYgYoYk`YkhYkdYklYɲIJԲ̲ܲ²ҲʲڲƲֲβ޲Ѳɲeeee05 pǩj٨5&8_SՄT55&q5|6 gW׸Td jWS]jWl$յ`Q ۨE6d >ՂQ-ZF-!c٨jm6j ZF-ZFmq^'cLڢnԆuFml6ِ1xݨ FmFm!cpjdCj:dL&FQ7QGmQl|n:ju:dCss87Qۨm!2u:ju6/yu[-w]ju"w[WֈjuWu[W_~Suu9>uq=G| zԃ}#S#SOȁgzpƬQ׃z$B3f=hF=l>ѦU!&F}a>Q_m>Ql|ƬgjdC6C6cɆ{E}hF}l٨J &F1c63fF!c3FD7Phm4 2hh@6d n@mѐlدa&FC@C8Q4Thm4$2hgj dC3fC8e4Thm4$2hhD6̿h$hhhD6d SO5Rhm4"26mMm46 Fjd2mMFchFcl1ِ1xh FcFc!c֍jdC l m4VhmD6vOI3hF3l9(ӶTр &Fso4Whm4'2O'ihN6d ^7ú\m9ќln46m46Zvnh!F X7Zm6Z ׍nPhm 2-`hhA6d hhI6W_n-u|G%(=""ܐlhI6d n%Rm%ђlFKhFKl%ِ1xOi mThm"ڮ `brҊl؊y+VF+!cpVjVdC=)6ZaȆ{J+hF+ly_ҶccLj}mh mVhm6kFkhFkly_[j6ܜ51ڈy 7ڨm6ژwrE }Qhm1FhFly'Wu Fm ּwZsLwۺ lhk޻1F[F[ޥalTvHo$_hm5]|m mUhm3y0ma۩m6ڙwD nNmμ['b֍vjv:׍vF;vF{V51ڋ֍jdCF{8oWhm'2ahhO6d n=^m=сl$ۘS*&FFFF!c֍jdCװ5lF!cpjǕkbtN`GFGE;}юjqkuTmt4ϏFGhFGlyxTo9)ȆwRmt2c7:mt6:gE nImo 獟6~6~6ϋj?c?EE ~3FgYLFghFgl3ِ1xO {JgFg!c:Fgl3ِ1x mtVlx9,qƃy' E-]9x"vI.j]Wv^tQ.oQm!2}`裶C6d >oF>F!cyGmїltSE&F_SžWm/їl]]j}dC6B}6b}ɆF_hF_lȚ][M~F?hF?lِ1~^p?~F?!cp~j~dC6A6a]ab6C6cɆ{JSm6 _)6cɆm6m6G&5 l 6m 6 o 6`ȆjdC6@6`FKeb )u@@!c}сp_t@lc ِ13jdC@hc@lcH$`jF& Q71Hmc1l =e lcِ116aȆ hc lc0846fM&`Q7ú1Xmc01l`hc`lc0ِ116cɆ`hc`lc٘t&ac1Dmc1lhclcِ11C6`CȆm 6m 6\~#*zPSm 6  m Um %211J6d PhcPlc17La0hc0lcِ1a0a0!cyc7m 6 m Sm 'Q]2ob =e8)6cɆakjñdCp8o Wm '2phcplc`dMhclcِ1!c1֍j#dCuc1Bmc1l?VI7c)#aO1I6d g>Tm$211I6d ~ ;1E6^r1JԍQnRm"2`1 E6d >(Q(!cQ(QhA;p]LѢnuchlc4ِ1x hh!cpjdCp&1Zmc41l WuL1nuclc ِ1ux2Fmc 1lhclc ِ111nXunX(bZXsDo{//dC6~6~Qlx//dC6~6~QO6%1^a1O6d nc<1^mc<1l|;xx!c8M1j㱍_Ɇgb*]+vjb <aCkWlW!cpBmmJ6d 絩3ƯodbַLļ7~S l3;mmF6d  Mm7l7!cY16fg;5d ߰ dcT#651& j dC=e)6&`Ȇ pޘ1ۘ@6d nc1Amc;h<1#L߅ߡ6~6~'2pذ} w߱Ɇmm;;ِ1М16rf Ckwlc"HkM;]w'mL6& O{6&bɆ{DS&mL6& ׍nLTۘmL"G8>jbLuc6&aȆaltvHu I$!cYtE'mL6& ׍InLRۘd>}alT4t L˚emememememememememeͲزIJԲ̲ܲ²nY󰬭yZV[ּ,kk,߇L5nvwO3&7ָ7׸Td >7Osdukdq2qaqqL5Np'kdMcv)jS)dC0ssg jmYYW16`SȆmL6mL6 L6mL6oi Ř*TX7mL6 S1lṅuc|lc>ِ1xO{||!cfχ6m6a'51֍j dC6@ 6` Ȇ{Sm,6 ׍v:߭gjyn! "E'b|n!|vBssyptB7Ou 9_> q=XD{N2}Epb/`}i-{Zz,"E,`1Xp#z9]@7Q{DD|1nچF6d >cMm p#21馶m a񗉁lmaƉnlb,sb8G,VXm,&2XXL6d >c.3bb!c9b1Xmc1l/$uL)c޻yn d,E7m,6 ϘKDmc ln,uclc ِ1%%R8UbLbOk)ZXJ6d ݗp\XJ6d >o,RR!c$KjKed#L [|@1 ˠej˰edCuc6aȆ2X7m,6 Xm,SXm,''-c7ycrlc9ِ16cɆm,6m,6 i-6m,6V5:`buc+6V`+Ȇ X7Vm6V Ϣ+,Bmcln6Vm6FUm†;᮶m  wX76ܱ w!c놻چ;N6d >Cj؆x?q`%&mxmx`dC೨E=6< !c놇چA6d mxmx`+FDI71Vyc%7Vm6V #1۞] =Rmc%lnucJlc%ِ1xOY mTXm"/}JXmRXm"2)`OY XE6d ^7VJmcln6Vm67ո/_6E[]q'c3n]{k7qTd aV8o\㼩y筮q޸w>†᣶m _om lÇl>>j>؆ِ1x6|6|dc䂻g71 kjkdC0t]16Ft|ȹW16bkɆZX7֪m6֒ _o6֪m6֑N\o>X'm]m]XG6d ^7Nmcl:hc:lcِ1xOYmSXm [|2϶g[}6| _!ck*_xM嫶m _S|6| _!cpІچ/G68j`b{چG6d ^7`S6Ȇ~j~؆ِ1xO66 `_ތ  lßlnú᯶m } lßl|66dG01֋o|^XO6d nc=^mc=lnuczlc=ِ1xOYmWXoxk:8|n0}U^lP`a迃w6A`݁9xR_mao}sɜm|o 'yOGP\|QA@03FRbhEz@"d jm^51l GC6@!c.{jF ِ1=@xO'Pm#$2#@@l#lԚz{$?GFD6d ~GFD6d >G9"Hm#"2# lc#ݝ>&Fac#Qmc#l|g̍jdCᔱQmc#lƙFF0, mcdC=%``l#lÞm [Cj&1Dܯľ&oImcll=e&lcِ1M&M&!cycImclM_jt+c)aO٬L6d"ff!cjdC66C66c!dgV41BDO =%Dm#!27Bm 6B6B!cY4Q6Mm"X7ml6 [6`[Ȇ{Sml6 ol6ml6 K\Y[E VV!c֍jC6B[ɆVhcVl#lru#֍PPl#lYP{F(J6d / EC6BP!cy#U6;{p&6g oS؆ml#2NSml6 ༱Mmclnl6ml6ȆOGL0S`O S6Ȇ'7 NnFF6d n# S6ȆmAajaF8U&F)ᰧmcdCu#֍ppl#l|FF8N6d n#W6"FW $bbD߂pAmD ۈ6"6"!cFFA6d n#ڈPۈ6./kkbl=e;)6cɆSj۱dCuc;6cɆaC6c;ȆMLhclcِ1~!cgwgwm6v ׍NR =ʘ;ż;6vb;Ɇ{NSvm6v ߣ T؉m$2ةۈ$i_bbD FF$I6d n#ڈTۈ6"Ɇ7"FF$I6d  mDmDbQdOW|)FE,mD ۈ66(!cY4 ΢QjQFِ1(h#Jm# ۈ&ft:uĈ=%hhl#l|hF4M6d n#ڈVۈ6Ɇghh#Zm#ۈ!u {>㐉#l@1j1F ِ1h#Fm#ۈ!27bmĐ 1FF k-h:=u&F~ ~F,k21xO=%Vm#ۈ5|ވFF,k<1xO6b6b6a_Y˲۲Dzײϲ߲vvвvȲvزvIJvԲv̲oY;nY;aY;iY;eY;mY;cY;kY;gY;oY`YhYdYlYbYjYfYn>L8ޗ?NqqqQ1x/N]p'c(Fqk\8׸8X5.^/yr[.[ [K-b]9xu`ۥv<)/|npg웃`O|n<|yv9ށ ݢ``7}׃ݰV;؍nr cyx7wE`71j=dSF71{=j{=dC6@{6`{Ȇ{+m6 _+6m6-71ٽpov^lc/ِ1^^!ckU؋m%2#B{6buD%v11֍}j}dC6A6aȆ>X7m6 ׍}>}~Q5w(~\~\~~!cpjdC{6cɆfC6cƃޮjb=)6`Ȇp~lِ1x8!cr8q8H6cqPԍnT8m$2 |Al ِ1EE6bɆm6m6eږ*`bu6aȆ{!Sm6 _װ6aȆm6m6\6}8,8 8q8L6d c3FOJbhm6 ðV8m&2EC6cGfb)Gu#!c}G#!cpG#jG#dC6@G6`GɆ%3:GQQ!cww뎪m6 U8m%2Æ/8q8F6۬qL8mS8m#2`8q 8F6d nqLmql|qLmO6\we.hbċY4΢jF<ِ1.Iv4W16ⱍx!cxxmē ϢFF|z2C! C@$IJ#EE  * ((D2"iygYL={׽ΪUջj:}6Vm6V;8'cX)6\{mcJnc1<14Xm:+i/lc%Rl86Vm6V cSV9e*nc1nuc*nc1nuc*nc1pXeHr#ݷMb5ѧmsbCNFF:.6t NmmsbC9%H7H6V_ iciXmX-6t iXmX-6t m5mjnc1n6Vm6ֈ|c/ZX#6N&t2~}nc1p aטm6ֈ )k:enc1XCm1XmK{ًVSuZZcZZcZZcv-lc-Nlȓx1uûgh7caQ6qĆ6Q6qĆutlcNlo6֙m6֋{/)W͋^Սn7Xm:XOm7Xm:XOm7Xm:멍f빍 b˰OblP66P66pĆll0ml:@ml0ml:) fb<ب):eFnc1pS6ml66 ml66ml66 ml66mltۈIʹ{;>,b[k3I`ہ><[ML&orއ'g.L?}&^6w>eXmVll6y=,߾`36zYl׃"Bzl"6"//-8ϋE[\lc Elhc lc El8Wls-c`b*6J^>=ccj*6t 1sVnc1VjcVnc1VjcVnc؞8f/66Ql3ml:Mb6nc1pNFmf۸mbCm6mv1stblWktmlc;]l8lsvvc~v߹lc;]lhc;lcFޗ9/^082sptrvquswptrvquse:Ǝ;N8N:N9N;8:9;.8.:.9.;Ʈ8Ʈ:}ɐޟS2hoaqeH1eaqeH17ʠQe!5N(ָ snbP0m:FCcXm6v ta!6t a)6;]ةz7i)6t wҾyNnc1oIf;bCN.1YN].].cDԶKl]f]bC9eSvm6v ߡe-696{nlc7[lonnc`Mnncj7lc7GlħNjUnc7~cnc1AcDlec#6t {hc#6t c+6ͫ'x19e/Sm6 ^Z7m6 {ѽk+6t 7R{6rƀK>ycZk}f}bC)A Q}f}bC@}f}bC@}fb֟[|͋_Սn7m:֍n7m:Om7m:fb88`q8 6t <?`q8 6t E^n1n6m6d8攃tN9hq8(6t i8hq8(6t An1=Hm48m=:&eTbRu6qĆgѳu6qĆCtrlqHlX7Q6qņnbVao68m:6sņao68m:6m6m#UOGulqDl#}G6pGĆuG6pGĆgdPG6pGa~W^nuQn;Qo58m~U1=J{ѣfG*)GfGcomٶEbS6Q6qǼT S91n[s1:38m~kS11j1n#Slbd^4fF1F&imd L:dmdrbC@FF&q3Yg4/qU7Ӻql8q3W1pN9Nfǹޞkt {l8q3W1qjqnㄷ/SBHnu nㄷ/b`8A  o_T~7Nm6Nx*8Am089u?[֝"NEt>~"pQ4'߾ ٺ;?iOzp۷ R~)׃S޾s):W2;8)oBq,} )j)nؘ5{Cվioql4qZlh4ql4qZlc=iic^ijinظ{ԄT/G3cxcDl|`Caq8#6t #>n1p ql qVlLQq̈́I{Rt8kq8+6t C-̞!39CUg ;@ se f_01hNk\0qst.6"M4Ȯld6md6 a7g7md:Nmd7md:Nmd7mD65͋lDQQfQF1o 9l#ۈ:ڈ66(c(j#l#!6Mѽ#GpsnFc}9>f9bC=al#ClAm0mƿ-YRu#DFl#mĆՍ~ OP!:. Cf!n#$6t ܋ Q!-6s ^he#ڈ6ۈ6ņ0[oGmDsbC9%)fF1pN66ȃ #Fو6b6bcx)+?0PbXmp1bC9%)1f1F1j#l#ۈ)./FKmĚmrbCKFF,+6t nĚmrbC~#ڈ5ۈ6ƷfĈ qabF'6t $.3ۈ6Ć6⨍88n#Nl8QqfqF /FněmsbCOFF</6t Somċ F<om$ He#H0H6ĆhLjp;l#H:֍Z76c:%H0H6F wHT6DDn#QlX7iH4H6ņkDM4H6ņ<$RfnC^9ٺ"<[v9"rExu9왣f9;[~9~N}x|xE<;A|ᶿޣAIo?׃$u I$$z$t #hdA1$QIfIF.1쑤7{1r)\f\bC@\f\bC>"#rm6r \fb#6@&>475rm6r m6rm6r FnZ7rm6r Fnj#Fnn#7v]GՍe#l#Olh#l#OlŰm:Gm3mņ4=ae#Lm6FXlxF&L׫a0:[5l6bC@aj#l6skP8l$SfF1HFF2,6t |=9̞uO6H6ņh2lmN؋_Om7m:)霒l#?_lX7Ӻl#?_lh#?l#?Q@l4ýԳ~~6 pĆu6 pĆ6 P6 pĆ6 m6 5ڧ|‹QPo6 rņFAo4(m:}{_6 rņu Ql QHl4<9"BQ(w ;@ m6 F!Z7 m6 m6 m6 F!jF!n#El,1c%F7Rhbm $3I)f)F1F bm Rnظ{()ރTF?X?Yl0QXlx0=[Pl0QXlh0Ql0QXlZ^ fFan#UlT?gT^TՋ^4l#H:>JK5H6Rņh*ES6RTc`H6R6R"b㶼wԘH*fw1(m:a5l"Fc`(BF"Fc`(Bm1(m_FnZ-((jQ(*6th(_Eņ|5(m:(Jm5(m:/`6m6 o+Ć%l6qĆbtRlQLl8sJ1bF1ccDlyZ:F1nov(a06sņsJq:7(m:VVl8Q\l"~+_jV6a7d4XIX)Xi 2cecccccc79*;nvUq1vcv;cw9ƪ:ƪ9ƪ;j8j:vrSBj\j孥c{N%97Ҽ龹ƕ58k\ ZJk\ ^JH17*A{W׸Rt Jƕ_ؐx1~O3H6Ć6Ҩ44n#MlR})l#H:H66Ҹb#W䩆B^asdݹYl$QRlh$Ql$QRlX7JҺQl$QRlo?~ *iQ(%63=QJӕt6JqĆ6JQ6JqĆu6JqĆu6JqS &5ʋQگ9I׿ 6(mNR.Mۥ6Js3U*֍Ҵn6(mNW~ V7Jmvۈ?[m@W7E}xڇg @k f7x ^?[w 7߾ ɵgw~e;?y}u=ze+#߾•2o e1A^ʈX=2fex=(#"t #zPl qxDbܨiqƍƍbC>FZ#n4۸۸Ql8WH6n6n:Hmhq#QVl<8u(~+K+kQ(+6t Q(kQ(+6t Q(kQ(+6t 19FYnh{ˣ7( K)'6\3(m:(Gm3(m:?.F9n1F~zB͔bXm6ʋ(tN)oQ(/6t 7~Fyn1FyjFyn1ď.5-mSaQۨ 6]*bܧGgqq1U }fq mGmgqq1}}fqֱSnz[b)b#fbfs {i/zbC9~:oq?q1fsuFi#wbUԥ5ۨm:)uRl.QWl{_]{_]F]cF]b ݣ&y1Pw>@ |lncS0xx@lX7uĆ66ꉍcazNgQۨ'6t hݨgQۨ'6t 7~F=n1zF=zF}^N/6"uFw7ۨm:F4/6\Dm6 mԧ6m6 F}jF}nAQ"PxoF{66 m?FĆwI`bXm?OUDw;׃'N'T0OzD8%OPO<N 7Wc0OE<N OPOm{GCm1mރX7кl~{bFl~{b`Cm1m >+1^UƫxlUnU}5}cDlj.ƫƫj{ƫƫjƫƫfroh%kkkfqohA ѺkkZkkZmFmf:x]xxlunu=%a[1"6,寋a::9u:n::@Smm{$fopoyÛScDlGހbXmm{A \A)omm{A j 7/FbUh_ڋ5m} /}W_F_ b`KF_F_ b`Km5aqG؛cccCcCcco;q wpt{1clclcx؇cc=ܖOո~3׸~= ӏ\p8_?sk\? bzq5>]s_Om7m} g#bW({] Fا bFFا bF؋yLb P}70m >4>4lc1bhc1lc1bhc1lc&I7չ7766ބv3~fƛƛb`&4xxA ߤ64xk&c1h1k i1lc 1TA ih1k ֍@[o<(1Rs[tNyl-n-7h-j-b[t-b66RGb R ڋ2m 9%6Q6q`N b`D A SO7d1 u`Z7m 6Cb``A 1l1 u#uc01lc01lCTB!^tEm 6 Ch/:lc1l1!!Fd3<.2t#11֍fCٸ>֍n 5m 1n ucPnc6sPjcPnc֍ZÔa0a0~ 1f1uÏϚ Ϛ 3m ú@èaføߐogi6xx ?>k6}mc`x֍66~Ïsfos:Eb7ޡmm?֍whxln\1;;fp:ŏujwḿ!1gg⇛m 6pZ7m 6{n1~ Nm 7m}Q1B#h1lc1EX7Fк1lc1E5}0m}Q?Am0mS$HlCGGi11nucHnc$9e$SFm6F)~ 7FR#6Fr]U7ޥu]wwwX?oK75xxcww66a.ƻ(|~CbR{_(Q(|~Ïs(:2m7Eװ6Fq ?Em2m$h5shh|ˏoo6mX7FӺ1lc41ch|YbQuc c6pcg?֍1n1mNC)c6pcg?c1fcxO~=>{{x^:=7ޣ63xxYIt}no>>c>S7xxY1nOmo>1gJnucXnc,cx6Z1"6\ٌ5m~ S9eXnc,c`1k1%8Ջ8q8PlnstNlnlnsfp1^Om7m{d5}7m{doxxGƏ6S6s)1Ah1lc1c`ݘ@ ʏ٨Ljs] ʏ~@mL0ۘm|I6>6>{!lCnCΏsʇtNlCnCΏuCjCxߥĘlL6&mL6&}~ S&9eDnc"w^t"E'mL6&}~ m"1lc"ޓ+1>R6>6>2c6>6>{r8|D甏6>6>{rh#j#IxĘzId1ۘk1p ;a'mL6&~ 1ژd1ۘk1pc1lc1d1lc21̃؋Nddߏ6&S6&s^~?f6"dG#w{Lqcاi鎱c3c3c;ƾprv}161cطcsc;9~p1c|B=2S44şK:Hs]1\7%TSjM5n Ək)tM5\7Kh qS5n >YIU1?6~ b`1?6g}>fs}Lm|lFEk﷫=$'fExuA>O>><><~Ow;׃O}BSV>5z)ҧt|c`=փO">S|ߥƧfrS=c#>bTncj8%1lc*1ߓ>b*S6rS=~ 1ژj1ۘזTݘF4i4xN }4GL3ۘmLk1nLuc4nc_ۏ6Q6qņ x1]={6>{6lc:1]lN6sņttctg I/gg Igg Ign|f<[5Ltwg><>_x=EGB_"~c`=lnc>W{KbWOO+7ۘṁjA ӚOk||8}tb|nc>W b|s:׋@w. 6p Ćuc 6p Ć6P 6p Ć6P 6p , PXHm,4Xm,A XhXghc!lc!21pmXhm#r˜{_Ne89X1cw?cKc9v[111111[[[[[eԸ猪0sZEo^dqx[$5NָE׸ERt Ѿy-5n8YDk"s[p^ۋXXLm,6Xm,A cYLXm,6y XLm,6Xm,A S6s5ڧ|bUFW__ņ6~6~5UlhWjW__ņJmj+bonfbz7l7n7877fb`l7nwq$i;mm.6t <;=bC}fs mNmn;Cln!ln!stNln!fp\b?ƟƟbC'mm)6t |Oϟfr ??66 C%  %$uc K6pK >{>{lc  b%%_bDzֱ˽9/:e1uJ ?F166:)9/Ćgd62&1VuoZ76 b6 b66aoMmm7ب_=Lbh??bClcDlȨvea1mm#6t ?R;mTՍn,5Xm,}-5Xm,X7Һlc) bv)lc)h66mD^66:W7Z1"6\k/1ƿƿfr {66R^e]F{ef˸epT):e2nc+@˨ef˸epTe2erѱWi#1֍f˹bC7Z1"64宋aX.6t XnX.6t ˩f˹pc+hXaXw1nuc nc9@+f+pXm6Vm6VA'lKJjcJnc1XIf+bCtkJnc1JjcJncGXl6Vm6V}tA vv*ncG֍UfUp]O6Vm6LHWt#l#H:UN*L7H6ņæa6ҹtc`/NmmscEW^tjnc5U~c57Vm6V]A iXmX w1pNYMm6X9?[wW+ukhXc-|x+lZ#֘q;><ڇg韭[CYc׸}}w׃p?HVՃ5ky=X S1`Z^A ki=Xk׃p?eA6֚m6։lۢy1֩;;֙m6։ m6֙m6։ c:nc1XGm3XmKU6s NNlc=. b`6s XOm7Xml=:&eTzWblٲAl̏7 6ml66 Z76ml66 @ f bCslcblTFF666R66r^ ilc# bF&1`~ؤog7ml66 ml66ml66 ml66ml66 ml66ml66Ý^ͪLfpq!Crfnc3y9e3S6ml66ÝA 76S66sJa6 [6p[Ć6P[Ćuc [Ćuc lc %1֍fv甭tNj a1VjcVnc+܇gRKM}m{_6qĆkmt lcMlol3ml:)ۨmf۸pWcZlf۹Phc;lc;Jbvv+=svjcv0w?F;;2xptrvquswptrvquse:Ǝ;N8N:N9N;8:9;.8.:.9.;Ʈ8Ʈ:ɐ7e2ToA{ s5.Cj5.ָ s5.CjQ25.׸ q:ָ Z25.;}%Ǝp(K wоync"6vP;6vp;}A vP;6vp;齗ةz7i)6t ;ii)6t ܋Ibvm6v m6vm6vBԜ)6vq¡,1nuc.nc+$uc6vq]!A |`lc[lZLOnnc`Mnncnnc`Mm6mx1 1m ==twncG&=tlc#^tlcWl,-#qثzѽk+6t S9e^nc1<RC6V{bC@{f{}!/>5s>}ƾp(K g b`/6qCA g/66$~U7Ӻlc?_lhc?lc?_l~~~c`o8bPkt {lq 8`q8 b`8@xTm6m6/T83n㠚S9An1nuAn1prSm6 甃A!x7{_7g e_6q¡,1atHlK6qdA \CfCn ֍C!Caqz]z1~07m6 7fbCq֍fbC@f6"gՎٺ#""fbiG"ExuG#fGqn?O㟭;B#G_y(1}QZ@zpփfGy=8P18Jm58mwz1޳Ʉ[f6q¡,1Z1"6Il|bXm6; 8F6qA +Q6qb#WBKLȤLLn#SlȤLLn#SlX72i462ņϬfRfqxߥzo0{oqp(K +8+qn82{Ziql8qwq8nq8!6R+o-ߋqBՍn08m:֍n08m:֍n08m:'f'.T/I6=Iצ'6Nr'á,1𾨓f'. 8Im48mw1IjInظq9;x1Nq֍SfSbCq֍SfSbC=StO)n1)j)n4'w8l6Nm6NCYbiixOnӴ8mq8 b`q8mq8#6n{G{1Ψ3tn1jn1jn1Y33Yx㬲q8kq8e{_gYYxlm6Κm6»g86Κm6Ή{;$9Ջ9s9c`8G9s9cs9s9cr8gq8%bWu<6sá,1yjyn<8trl ֍e}%NB)W6pWĆbڮm\6 m\6m\6 m\6m\6»?W:*]\5۸m\ q֍fW ڸJm\5۸m\w1Jm\5۸}#La%g#c,11rE;bc8Xc,1KrrvquscɎBXaXccccxra"rgVWl?leKfI:[r(K %ָlɱYb`˖j9qْ/[2qst.6.)./Fd썲'(Fvn#1yyfٹbC=l7Fvn#1pMnۈՎl&K(U7h݈2ۈ6ĆF-WDmDqQbCEFF%6t QFFClf#a!6t s$9Fn#1nu#Fn#1Fj#Fn#$6^bqMJfkF ߓJf m1nhm1Fmhn F4mmD pnF4-6t MmDmDsbC@FFFWLw.T;띭If7ŘEĸEx)?91;q;><>nl]L2{B1Ǹ}Ãn#1nu#F>n#1pNG|f|bC^4l#{V#Et_4l6bCu#l6bC9%L田F 06sbC6zz1dj#l#H:H66dcx6j1"6]XܠbXm$sbC@FF2_l>PJ,/F~e#?l#?_l8sJ~F~c`OF~F~c]fbjWbPhڋ0(m:(@m0(m:(@m0(m:fbcP$FAe Ql QPlxAxAFAcc=6 rņ6 R6 rF134(BtN)dQ($6t 7 ~F!n1p_-dQ($6t 7 Q6 q)bcҾHQg{R6Rcj#l#H:))tNI1H6RĆwP)f)Faz,WoFaQl0QXloFaFacFaFacFajFan#UlL׋~kKmrbCJFF**6t JmmrbC~#H5H6 58u(FZ7m6 m6m6 m6m6 FjFnؘ5;rתo; TTl5(m:SuJQFQc`/ZE6rEņu(Ql(QLlܲv(ְF1n1nuF1n1<1"6Ű(m:Ũbf6"cgjGN$"&"Ex߇G$8{hqnއ^8٬Qwއ'g$yqw^G}ޗM/Y})ḟ#1V1V1V1vccFXYX9XyXXEX%MʎcUc8nu1vcN]jꎱcU^x+%ԼVk%UJH1)A{zVk%Z l:%h+aq%xϓ&6Yg#MlDH4:åmqibC=4ǒfm mQifiF1N66ҸbC}ԋQRKutIFIcFIFIcFIFIc`?\(iQ(%6ҳm(h%mƺn2(m:(Em2(m:(Em2(m:S((-l؊$N轧A@! @zҋtI/{/JRtD}6Jm6J='L(Fia;D_Zm4Qll]ixFil4ِ1x( FiFi!cpj2f-cuEe`(Q(cD N))e6`e!)!)Q(cD n QFm QlY0moXÖkزjedCpamOYak{ʪm6ʒ )eRVm,Ql- mU(m#;'>bbu6aȆ{r-Q(G6d nQNmQln6ʩm6Ɇ01Epu]mp'2Ea/ꮶm p66ܱ w!cu;᮶mx}ѣ׿5u  l싊nxᡶmx}QP6<̾mx@j؆'0gbx Іچ'I6d ^7j>FEEi}MTEx~FEl"ِ1\XUQۨH6d n"QQm"QlvEhFElyʩZa&F%oTF%JF%VF%JF%V Ý16W= Q ۨdÊ|NmTRۨmT&ԫQY)RYm2QlFehFel2ِ1F-_yRڨmT&2S*C6*cdLV41| _hWm%2 mmbdCs/S|6| _!cpІچ/QlMU*F*F!cpU*jU*dC9VEm Ql9lhFl*H7:v7~FUl*ِ1FUFU!cpUjUdCu*QUm*QlPsĨ&F5X7mT6 a5l5jF5!cXV߱Q ۨF6d U ڨQnqȫl]@9[W X]-]x.}UT;0O.ٺpwW}sٝg{^]}ϫzPynK?㲄g j5w5Ԁj91~g (ZD \j׃F FM6jQsO˼dWlX|%j5dC{Z5VMFM!c>&#jm6j ۨ mTۨm"߬p̽QK`YKmQlnԂuF-lِ1ڴ\Rۨm"2Q ڨQ #j&'$3I~j~؆ِ1\G6lSچG6d >9Om#2_A~j~؆?٨u+|n&7a᯶m  X76 !cpІچ?O6d ommcư75{gbgk3е6jcɆ$Նgjm6j aQ[m6QlnԆ6jm6ơe"]j|m i=l#l|"[m`dCW aa_ߐq|# XX]Xeeee,2222jkb [",cM-c,c斱(X XKXee,222k[H57GUSXS5UH5Np1qR1*5.׸@q2a T׸@<z_61ľ}ܷR6Ȇ 8maAdC6 l#l|mmau]~yQGԍ:nQۨm!2F:F!c5UQۨC6d ~QhFl.8=ۙRF]hF]l.ِ1xݨ F]F]!cQ֍judCsJ]hF]l#l\`2&FSm a2Xm#&2nmcdCsJ0m#QW- 41ꉺQ֍zjzdCt>]=zF=!cv=ޮQۨG6d ^7A6aƎ11ꋺQ֍jdC06b1\-Rڨm'2ߧm6 ۨmWۨm4 iOhh@6d o4FF!cp j dC6@ 6`!dHNMM21BĜl#lnm !Q6BȆm@!j!FCH߷21 sj dCk9Pm!ѐln4uFCl!ِ1FCF#<,0W&F#Q7Hmшl."hhD6d ^7Hmшl|hhL6~r ahhL6d o4FcFc!cpFcl1ِ1WchFcl#lxs+#TԍPX7B6BP!c5l(\ÆmbdC߱ ߱ U6BɆF(m4!meM`hhB6d ^7Dm фlFhFl ِ1&F&Fp&ְap m a S6Ȇ0omaadC6 00l#lvyD&FSm ׍pX76±p!cpFF8N6d b8mD􎭉!QEmD`dC6"l#l| װjFِ16ڈPۈpj<[=x0gBM"Ek 4U;hjw`.uHzJ7}sk yS=oA3|xa5}D3G4Sf4/cz :hv ׃f@sE38W4ShA3!cLmiAQY7>lBG &tF$i*mDBjF" mDmDbZnj6"6"d#cǣE6cɆ-}jͱdC6C6cɆal>`b 6cQdc {~21fGFmD ׍(X76(!c8l|amA_*FE6d cFAQjQF qrqmޙ-D-6Z`-ȆF X7Zm6Z ׍nPhm 27Z@-6Z`-FV{Sεi+ˈeĪmbdCu#֍XXl#l|NsJF,K6d ^7bXXl#ll5gL8N88l#l߈FFG6d ^7`݈Sۈ6ȆFmēoĈ6⡍xxl#l|+}ūmcdC6⡍xxl#lF<o>"͎w<-cIdX[XeeeeeeeeeeeeeeeeeeeS@ `P0augZ+Sq %k\q Td >%/A]pK'c=q %P1xK5.A]H66\^HkDJTH6Ɇm$BjF"ِ1DDl#loN66$yVcIn$m$ H66$!cpIFFD6d ^7$$l#l׭ɢn$úm$ ɰoNVH6Ɇm$CjF2ِ1dh#Ym#hK6{/VԍnUhm%2mahhK6d n-Vm-іlF[hF[l#lj9X#EH6R6R!c=m H6R6R!cs)FF юlOyu/qN)Nmюl|mhG6d nNmюlmmShm'A#h/F{X7ګm6ړ )^m=ўl| a۫m6ړ hmWhmt ;ɗLFhFlِ1x/6:`Ȇ9~sFlِ1x蠶H61QmtTmt$2訶H6d \#|.Qm#ёlnt6:mtp<[3>.\<-?g:ߤv\<w:w}sgr^N{ ׃tϛ<٧JYaY};zЙΰv׃@3":zЙD|謶B6fXumm8#颶B6d n Em хl|V.j].dC}DhFl+ٸ!^x+|FWl+ِ1x]6b]Ɇmt6mt6  mtUmt#y{&F7qF<#MmэlL7xFF7lِ1ڴ\vSmt#2 覶 N6b:~$.ujݱdCsJw8tWmt'2a讶N6d n;]m;уl|5̡1+M^ԍdc9ȺCmуl|졶A6d nCmуl|m衶I6nϱ|Aط -zm6z rO^I6d n'Sm'ѓl|詶E6J|;55uȵ-Kmыln9c8lܽ=U ^F/!cp^j^dCsJ/hF/l7hN/MޢnuFol7ِ1:7\Vm&2譶M6d >6zm65(FaGmчlfNiᰑjIRm!2裶C6d ^7@}6`}Y01:)l_am6 ׍nUm%2諶K6d F_F?:`3m6 Omяl|ϼ3臨G6d ދ6m6>01 jdCu?6cɆýjdCFhFlS=iU&Ƨm|m|J6d )TmSlS!c)m|m|J6d o| m|)1lv4c11@6d nc1@mc1ljdCshclc pzc11H6d o @@!cpjdC6B6b#31~c7m 6 m Rm "2S9e lcِ1A A``ca1L6d > s``!c^t0Em 6 j!d#S;\<?g>w3~3{q_G3= ׃Qto|3j٭(Gw`}׃QR;(r csأ9Qjp=E"d >W6Fm6Fbǧ;mb6FC6FcɆm6Fm6F Guhh!cb41Zmc41l$S&ac 1Fmc 1l1jc1dCc1!c}11X"c}Ӭccc,?ңjcdCuc,c6bcɆ{̱1K6d nc,1Vmc,1l<(S1B&86aȆ-}qj㰍qdCuc6aȆm6Ʃm6Ɠ OŹxx!c5lxx!c1֍j㱍dCxhcxlcMM ߘ j dCoLPۘmL 2`ݘ1ۘ@6d nc1Amc9:馈&bN)m|m|N6d S7b16l"\msls!c9m|m|N6d \msl r֍icG__m|m|A6d ^7u //Ȇװ_5j_`_ ׍//66&_oBcxN2>'1ۘH6d {]NTۘmL$21ژ1ۘH6d ދN6&mL6&!gzĘ$zI1 ۘD6d ^7&1Imc1l|NIjIdCs$hc$lc28hEcsN1`' _Cژ1ۘL6d nc21Ymc21ldhcdlc2ِ1xݘ mLVۘmL!dP4cS9elc ِ11Emc 1l|2SmL6 S)jSdñ77Z1i||c*pn.4Umc*1l0SamL6 ׍nLUۘmL%2SBS6b_A ϖ01uKX7TlƗƗj_b_ RmKlK!c9KhK/idXķoMSۘmL#22 >O1 ۘF6d >Ls4i4!cpӠijӰd#K-Mbk:1ۘN6d oLtt!c1֍jӱdC6C6c3F41fpk lcِ1xݘ  !c1֍j3dC hc lc&٘%su3Eݘ LL!c5L1ۘI6d ^7fº1Smc&1l|2ژ1ۘE6~rc`ݘ1 ۘE6d >̂s,Y,!cpYjYdC6fA6faɆ_1[ؘ mVۘm&2Sf9ellc6ِ1lg>[mc61lߘ mVۘm!4GcX΁k9js9dCs8Qۘm!21ژ1ۘC6d nc1Gmc1l,-֪1Wsa1Wmc.1ln̅uc\lc.ِ12)s6bsɆ{ѹ\ܫ_zWte  J+\"2#"R ׃HWWj_a )cMXj dCpaa+P 6` Ȇal8c8l_#ɘ*lcِ1xXXH6/ob,6B 6b ɆXXH6d c.=BB!cp j 6}ľmǷ8Yϱ2222222222222222222e6vN.n^>~w_QzVع"-"u[k"q2~n-5n8"u[k"q2H]o1@Lb[ jdCb8-VXm,&2oblc1ِ1bhcblc 3wQcxy |ylc ِ1j \S-QXm,!2XXB6d 7XXJ6>mcS9eRlc)ِ1RTmc)l K7@m,6 )KjKedN_{mb,s>1/#)6aȆ¦ed6-SXm,#2`X XF6d _&Lmcl)ro,rr!c֍j˱dCr؋.WXm,'2SC6c+~`bp0 0  !cgٰ=+6V`+ȆpW=j+dC6V@+6V`+FiG6mhbJoTXm$2+aXXI6d >sJJ!cuJhcJlcdcӆ9#l/˺Jmcl."+ XE6d ncJmcl*hc*lc5䰐CLբX jdCuc56VcɆpNYXM6d >6Vm6֐ Y&g0a/NYXC6d N'ÆաW\SXm!2_îk5jk5dCk55Z?m[LnucZlc-ِ1ZVmc-lZxZlc-ِ1XXG6 zιN1Ȇ퇭שm6֑ )Nmcl| aשm6֑ )렍uj밍dcŹ?:e=\WXm'2>OYXO6d ދzz!cX@6F~ c76ml66 ׍ nlP؀ml 2Fzڐ<`b8l2?]R؀ml 2dAmcl 9ՍjdC66B66bɆ甍pN٨H6d ދn66ml66SPSYMdt_ 66aȆMpN٤ D6d װ66aȆM&Mfn~&fN )66cɆ]n.7ml66 aYmc3lfhcflc uw41>zN37ϊ[6`[ȆX7ml6 )[Emc l|NmlQ؂ml%~Pg&VQ7ºUmc+lVhcVlc+ِ1VUmc+l| تlP׳io|M6~So|55ِ1pkɆ'k;_m|m|M6d nkhk6qh4ٺo7jEֈo;0Oo`Gc?:yqtϿQop=FMǝ7on.ݦp=Fw_kmpmM`ȁ{mP6ml#2߷mlS؆ml'-[o27e;ٰj۱dC}vX#ml6 Mõvv!cs;]mc;l]K׍c1wslcِ1!cp;j;dC}hclc'82b&Nd'(vm6v );ᜲSmc'l|N 甝j;dC6vm6v Ŵebuc6vaȆ.X7vm6v mR؅m"201]jdyQ&nac7[mc7lnhcnlc7ِ1)6vcɆm6vm6=#=pN٣C6d o[Q؃m!2أC6d ncGmclf Lnuc^lc/ِ1^^!cνps^lc/ِ1I1j{}díL}nuc>lcِ1)6aȆ}اG6d اO6鷥Lnuc~lc?ِ1L݈upذ:_mc?l|NjdCs~hc~ aFfw<ZYƾ}g;n;a;i2v2v2v2v2v2v2v2v2v2eeeeG5u M-aPp+Qw@]wj{7:qp;@5N8P׸'cQ Ouf~'@ָx;H6n0SAl ِ18g +4X#U A!cpjdC6B6bFcvLtD1 CjCdC{!C!!cpCjCdC06 9cd7/2!l[~Q\&ƷAo}-yH06b16lGUּ_$bpBߪm|m|k/1x֍o66?-wqXaqXm0ql|}m6 5aa!cpj#d_ςYn{GĻ&G&G6`GȆ#pN9q8B6d ^7qDmqlhl(٘a75MQxFQl(ِ1QQ!cm6 8 mU8m#;'>bbs01\}1c1!cs9cjǰcdCs18S8m#2q 8q lXppb(;NSSln|wjaߑ Nm;l;!c8Cr@{ߩm|m'8\uƳ&7m6 a/z\m8ql8jDZdCp茁lW8m 8!ְ' lِ1  !c~7Nm6N ׍ IߌlbtfC$plU uIlyY6NB'6Nb'{"'a8q8i{10gHCk$=Hlެ&b{dC^m{l{!cwM|==ِ1Ɓg 5W\.*)Ncw41N~7Nm6NwE ^7NqJmqʼ/b9SNm6NwE N9)6Nm8yv+hj9[wVj"w4\V;8mw`.]߭; W"wgdOyqGVӸ1 otwF|+Ln3׃3XΨ9!b> #ΨE9!b qFm qlE߳31ΊγpYl,ِ1YY!cpgjgdC06J9c7W< 16bF ODy6aȆ99q8G6d nqNmqlF g S >Gq8O6mwmqud8{ɽqqM5Npa-mq568Faot[]nwj۰V׸xC6J{|lِ1^sGmqlhlِ1x|ڸq۸K6?˛&]{ws߻q۸K6d asw6bwɆm%MjwdCu.qWm.HM'Q7~u'ȆOnِ1LݨafMCk'l'!cO=1ve{={=!co݃q۸G6d S716eNCkql|Muڸq۸O6h'q_܇{16cɆz}l>ِ1}}!cqڸqlpMg^3ٸ{7~Vl|gdC0616,bhmmL6d o m݆/γuٺ_/jE9[ |_w񏂝g~o^)Αڻgdw~=׃_g=e_ޯbJw_=毰UW\~%211_"~W!c>WhW_dBqB1xx@6d ^X#m<6 u166?zbhm<6 nhl!وx&CL!5m<6 aPm!lFg =Y-U C!c!Pm!rQ7oݳ6~6~#2oodC0sJ3Æ9R0U ߰Ȇߠ6~6iҶmb<u6aȆ#X7m<6 ԍAGdZGdCG#Gd41~uwX7~Wl|wodC 16Ǽ>ý|Zc ׍ߡ6~6 }^Ej` Cml!cB*^/*dCj`]SSmOlO!cpBmmI6d o4upoT166$2S6TxL6 4u|Dx,l<6m<6 o<6cɆag xL6d ><6m<6Z'fb<6@O6`OȆm<6m<6 ԍg j7dLCk ln<6m<6XTx m&{Ny)6cɆ):{l=ِ1:=\Wxm'2xmWxm| 9=AS>u!cplِ1x6>`Ȇ)j6a߇e,eXZ˘e222222222222222fckgo+`+h+d+l+b+jqHYcuUGn& i'R]<7s UܴUL.]uvBЏG\,,ДЏノbc7|v݁bc7|]bychc4d_x<i4F4F!cutX#Ҩm6Ґ 6rm6r-21r~#7rm6r SruJ.\F.!c ֍\j\dCsJ.h#F.l#7ٸ$){t #sN1&oVȍm&2nrm6r  mVȍm&2SrC6rcndŵ#z717jLt513Й|j|dC0S7 T16aȆm6m6 |j6c;$ gI~vig_ ݁x:oϙWo.]3I=ϯq=(@|;ߎ5 ># ~\ ݗ1\p`jp=(@d oQ[P(A!cQ@mQloQPaQPm Ql| ,Q(H6d >WբFAl ِ1xQ(Q(D6n:sԍBd#׶F!BF!!c># m6 (mR(m"2# A6 aMdT&FaYv6 cMG!bQ֍j¦1R)6 cM!bQ(Q(B6JS9Flِ1EoQDmQl|,Q(B6d o6m6>nb6BE6bEɆދm6 ( mU(m%2Q(QnݗM^a(f>GqX XIX)XiXXYX9˘e2iy[[*X|,c-c,c-c*jꖱZ1?˘ee, ՘S1q^K\TLF`oTL]WjazXg rbhk\1\Q1x+k\1u+k\1q2q`+qWlsaO&Fqa8Q\m8Ql|߾8ܓ+Q(N6d 7}sqFq!c8Q\m8Qlu6cJިF lِ17xc16lP(m 2%`(Q(A6d ^7J@%6J`%={gb%%T(m$2%a(Q(I6d SŔT(m$2ߋ) mT(m"*.-7`(Q (E6d S ŔR(m"2Q (Q (E6d ^7JA6JaFVK61Jo*Q(M6d n4QZm4Ql|N) jdC6JC6JceȆO芌KeD/Ze6`eȆaVRUM_&U 2F!cQ֍2je2dC6@e6`eZo%ea(Q(K6d ^7ºQVm,QlFYhFYl,ِ1:,QVm,Ql0&F9Q7QNmQl-{rj對rdC6A6aȆ{rF9r؆;٘5~v.lCj؆;ِ1 wh]mp'2mmcdC6ܡ w wlÃlls|P!)p⡶mx P6<Ȇmx@j؆ِ1xmxmx`drΧAgڙnxº᩶mx ?=6< O!cu'\xmxbdC6< O OlËlz^†᥶mx  /X76 /!cBrCꥶmx )^ІچM6 VQu-o8xmxcdCoNV6Ɇ7j؆7ِ1x66doo'Şyyg^^mdC6|  lÇl|NsچC6d ^7|  l"XL]QQV6*bɆmT6*mT6* ۨmTTۨmT$2QڨQnqȫl]@ETRda.{窤vP\<l]%QTRJo.]Ĩ.lT6mT6 aQ]m:Ql|NjձdCu:Q]m:Qll/QC)5RCmQlZg 9S.U F !cp5j5dCj@56j`5ƙv~ib6jB56jb5ɆքWkm6j ۨ mTۨm$2lTۨm"O7j5QK)RKmQl|NZjZdC6jA6jaȆZF-Z؆i~[b~چG6d nS6ȆmA~j~؆ِ1 ?hOm'9mfb놿چ?O6d nW6ɆmCj؆?ِ1xmmcFk_71jghjdC6jC6jcɆmԆ6jm6j SjC6jcd1]LQ7`P6Ȇm@jFِ1y3P6Ȇh#@m#n}+}aߎovZdck ճշ5XZY[B-cM,capXeee,22ekakiXZ[Xb-cqxa=sJSXovH5N@T׸@\q |fqR1x 5.P]D6v5̜s$lAAjAFِ1 h#Hm#"2`om AFFQl\w*tިFlِ1:O:F!cg?u೟:ju:dC}shFl.xQW5U]F]!cpujudCsJ]8Uۨm%2SBu6bd-l01Eu#Xm#&2 Om )pN V6ɆmCjF=4ٻMzbíQۨG6d nQOmQlnԃuF=lِ1zF=zF}A?Q_a/Z_m>Ql|NjdC6C6cɆ{F}F1%S9Flِ1xhFF!cp j dChhFl#l,r#&Fӆy#l~6Dm#!2!nm`!dCN Q6BȆFm4$vh(攆pNihH6d ^7ºPm!ѐlFChFCl!ِ1xhm4Thm4"BؚYF,M#FF#!c֍FjFdCsJ#84Rhm4"2EA6m8y5v+hj9[Vj"wg=jw5~3s11tϽRߍλ: GZsiOhzJw_pan(9j׃PXB"Bq=%2/1U6 Ǐ)eb4&pDm фlh&jM&dC}DG4Qhm4!2#@M6`adG&W41œu #W^q6°0!cePٰ-6°0!c08maadC6 00l#lL6&FxNmcdCu#֍ppl#lF8m 66±?WmlbD͎pCmD 叀g#6"!cpFFA6d c#وPۈ6h*-•HSFS!c֍jMdCFSo4Uhm4%2_66m46;.h&F3X7m46 v36aȆF3X7m46 w66m46"Fސzj$|mD ׍HX7"6"H!cpFF$I6d >DBjFsQ#]}͝kX37'Fsl9ِ1\ضksavmhN6d n9\m9ќl|Nim4WhmDnO41D((l#lnDmD ۈ66(!cpQFFтl ~)\7Z~F lِ1F F !c5125U F !cp-j-deYibt sSZ j-dCp1j-dC딖pRm%ђlFKhFKl#l:Mhޗِ&I$hhl#lnDúmD ۈ66h!chh#Zm#hE6nϱ|A7Z~F+lِ1xhF+VF+!cgm೶VjVdCuJmC6xs#犁sŨm`1dCu#֍l#lhF C6d mĨm`Fo>fba[簭6ZcɆi ihM6d n5Zm5њl}khFkl ٨נmĜ)m6`mȆFX7ڨm6ڐ hmQhm!2S@m6`dV/MXQ7ba݈Uۈ6bɆmBjF,ِ1x XXl#lF,mđqɱbĉFFG6d n#ڈSۈ6ȆmAqjqFِ1:%ڈSۈ6Ev#޹57%l&xxl#l|)jF<ِ1xh#^m#ۈ'2FFaa0 x$Zƒ,cɖX;X{XXGX'XgXXWX7XwXXOX/XoXX_X?XاA!a$P~X!1%/A]pK'ck\%@5N5.ָuK5.j %k\Y01Dh#Qm#H$2aom$ *Qm#H$2DDl#lds$W31Ě* 6$!c$m$ H66$!cwM$$l#lxu6Hu#֍ddl#lRLUF2L6d >$9%Ym#H&2_S%CjvC^mgJZaֵբZD[s]߭k {jmӱֵ}sgr^{׃}Oo襈"O { E ׃r czAZD )$B}D m#3.fPNNmюlhvjvdC6A6aȆvF;vF{=C&F{Q7ú^m=ўl.iO6lL{F{!cwHwHګm6ړ hmWhmt W;~ z젶@6d >tsJF!cGetPmt 2߷mtPmt$:~$(FGX7:mt6: )_m*FGl#ِ1FGFG!ciGhFGl(E&F'Q7:Imщl|m M;mt6: mtRmt"2S:A6:aɆkכE FgFg!cqN]GZdCDgFg!cpj.d#dcL.ntuFl ِ1xF.F!c֍.j].dCk.F.FW1|{)>D޻{5kH"A"A  ^F F/\k_3{>ٟ󻝯}:bb < < Um %2E^tPlc(ِ1PP!c11p%a?ly*7\چ+J6d ^7\apUp6\ɆmBj؆+ِ1 WhUmF6u)`b Sm #2: >_1 F6d nc1Lmc1l|Nm Sm 'w{scE^tplc8ِ12)6cɆE}jñdCkp؆H¥QO& ~[禶m  7X76ܰ 7!c놛چF6d ^7ܠ 7 7lc(Cjh~y1ZSFuhh!c1֍jdCGg6FcɆhqば1ii!^/%dQm!211C6d nc 1Fmc 1lL dclc,x1Vca1Vmc,1l|N 由jcdCsX8Um%2,1Vmc,1l|˱ gbggSm#211G6d װ6aȆA6aFh8/1O6d >sxx!c1֍j㱍dCxSL bN j dCuc6&`ȆmL6&mL6& ׍  D16e~.Ř(DX7&mL6& ۘmLTۘmL$21ژ1ۘH6d NmLTۘh8f7IIj"M$8LR;dw`.]IpwkO}s$x'$\&=Q(mʸՆdQ&û?Y}'z0MYɁmʚv0׃@`2"&z0DL6&mL6kq3&dbLsMsMQۘmL!2+blc ِ1))!c))vs_bĹ/ד^08ZfMͰyZƼ,cޖ1˘elelele2ok ͳZ[XZƂ,c,c-c%R2r˹/S}T1MTukTq2;c8jTukTq2qSaqSqJ5N詰MU׸xF6r#Icx}|}4lcِ17 6aȆO4i4!ch1MmcA6{*C X7<6< !cod<72j؆ِ1 hCm 2<  lc:KݚLthctlc:ِ1xݘtt!c}p~tlc:ِ12ژ1ۘA6n᣶m >Q6|Ȇװ>p 룶m  hGm%-NtR56n? _))4|6| _!c|ytj؆/ِ1xuWm%2_Bj,1GғY[Dݘ,Y,!c1 ֍YjYdC3ς3Rۘm"2Yjd#Z~41f~c67fm6f ۘ mVۘm&2aݘ1ۘM6d N mVۘm!&8~Ę#X7m6 ۘmQۘm!27~clcِ1ws9js ?qqXO ?X76 ?!cp~ІچG6d ^7`S6Ȇ᧶m7A=M Q7aW6Ɇ{Q؋mcdC?76 !cpІچ?1ld)6y&\Q7º1Wmc.1ln̅uc\lc.ِ1\\!cu\hc\l#lTMQ7`P6ȆEhF@6d >9%@m# 2mm`F׺5\21916摍=4-mSۘm#21ژ1ۘG6d ^71Omc1lِ1v>\Wۘm'2jdceՋ31~c7m,6 ׍n,PXm, 2XX@6d /XnBuj%̷u Iuj "w[,T;Xhw`.]ۺpX w\<?-|/ y侹<34Mw?׃ 2+\vA91#?"p="2AFFl:wGc0/R-a"lcِ1E"E"!cpEjEdC}"hc"lc1pplX,ŰXXL6d G,bb!cpjdCuc1Xmc1L6lz42., gmcdCsm6`!ci026`!c8F-V6 :_L%bb ܷXXB6d >,s%!c֍%jK%dC-6m,6BFo;<)eb8ٷ!Imv1!j!Fِ1l#lMRFB6d >@!j!Rk$ab,{ZKRR!c3@3@m,6 X m,UXm,%2KjKedU511{ӟ2pM^6aȆ2X7m,6 )Lmcln,6m,6t+Fhb,w rïQs=;6cɆm,'mj˱dCr؋.WXm,'2Xnq>Eq>DǙs x>  !cv7g n[O+M  !cp+j+dC6V@+6V`adc%aFm Ӆ}00l#lo}sFF6d {m$ 7reb6VB+6Vb+ɆaImX Ckc%lJhcJlc%ِ1E+j+Udgǯ.21Vg?೟UjUdC{*U*!cpUjUdCWA6Vadɷmonúm a*\m#'2mmcdCtFF8l|6З&jjjj!cujNYXM6d VXm&2j5dgkbuc k6`kȆMmkȆmj[XC6d NY)k6`kȆ55F٨9SD&FnDmD`dCF7"6"!c9%)jFِ1h#Bm#XK6D&ZZZZ!cpkjkdCkZZ!cpkjkudcڂz71։u:NYXG6d o:u:!c֍uj밍udC6A6adcem_F$mD ׍HX7"6"H!c FF$I6d / mDmDbQd`lIוwR(oD~#Jm# ۈ"2QnDmDaQdCu# ֍((l#lFmD{V؝Ĉu#֍hhl#lnDúmD ۈ66h!cpFF4lPדX/zX7֫m6֓ ׍nWXm'2XXO6d o6֫mp|m]ڦVo6jA-b]x.u jœWw~[ 껿~Sؓyqt7\b7}|^1Ĩ~ 1te ~&P <(F ׃r czEĨEzC"d ^bl#l ;>x=#V؈6b6bX!c"ֈXXl#lF,mĒ ۈ6b6bd/ FLgjdC66B66bɆml66ml66 ?'mlT؈ml"٧ImlR؄ml"2_lMjMdC66A66aȆ&hc&lc38ɃLf mflc3ِ1x66cɆml66ml66  mlV،mđ cL8o~#Nm#ۈ#2Smđ ۈ66Ⰽ8!c}8h#Nm#B62:|5nE|~Emc l|N-j[-dC6@[6`[Ȇml6ml6'8`bludVV!c֍jC6B[Ɇ甭Vdc=O?^g؋33ِ1gak{~Vlj?c? YmglcG-eblsmdѷ5 6aȆ{mݦ F6d ncMmcl| ئ N6DŽfbluc;6cɆ߮N6d };|]mc;lmlW؎m ;g11vsvsvm6v ׍nP؁m 2;`ءA6d ncCmcl\r)NX7vm6v ˸~˸Smc'lj;dC6vm6vy>qib"⽦v] ]j]dCuc6vaȆ]pN٥ E6d ^7vA6vaFžn/[mc7lF7g {r.M n!c֍jdCnA01{=j{=dC{=!c~c7m6 S@{6m_χa|sڧG6d >>}>!cp}j}dC>hc>lc?XQɯyL~\p~lc?ِ1nImJ }Ckc?l7{jdC6C6cѻg+eb6`Ȇ::q8@6d nq@mqlo>mP8m$mu㠘S9Al ِ1zGg J5\716bɆ甃pN9q8H6d o6m6Tk=Z761^Em6 krkrHmqlnu!lِ1cCjdD\t01p/al0ِ1̜aal0ِ1aa!c90qXm0qlwlM#bN9#jG#dCόgG6`GȆm6m6 )G#jG6yPmm/P/jE'b/vI[ |b)xQ_p=8J|)L2􎊵Q6=Gq=8Jw_}QGU;8Qr c(1E(1x=8 mU8m#;qL`e8q 8F6d ,||LmqlY1X-m6 'p 8q 8N6TMq\ԍnW8m'2a8q8N6ddeb8l0a>q8N6d n8q\m8+x~3$}+ƯƯdC6~6~Uln Ưjb w m+qldM!M& 1s  !cp'j'dCpqBmql8mP8m$U11N 'j'dC{'^II!c516"/NZ'dCu$qRm$薻Ο}~51~6~6~#2߷ [ِ1S~S lnmqlLZK&)y wR8m"2~ >{?q 8E6d >s)S)!cpSjdcyE8 ii!cpjdC6NC6NcɆm6Nm6ΐ}V啉qi<8C6l?rFm ql={3jg3dC{_g3!cpg3jgdV[OM1Ί5Y=q8K6d ^7ºqVm,qlYhYl,ِ1x/z8q8G6ݟ]ij㜳0#Ωm6Α ׍snS8m#2E^9lِ1s9syQ=Ap&y=װ6cɆװyl<ِ1xq6cɆ6Ϋm6~' MsN1/RN61/R;;ِ1x֍6~6~'2;dCuwhw߱ dc@Ӊ*:\\P۸m\ 2v>kq۸@6d nqAmqlm\P۸m\$\sEE!cpjdCsEhElوctK㒨`ݸq ۸D6d m%m%K%!cpKjKdC6.A6.anĸanea)6.cɆeX7.m\6. ۸ m\V۸m\&27.C6.cWF41q֍+jW+dC2^]Q۸m\!2qڸq۸B6d o\6m\6tleqUD=?,c,c-cw,cw-c,c-c,c-c,c-cO,cO-c,c-c/,cZ^Z^Y^[}}}}}}sj\ܴ+FN73MukMq2o¾5&8? T׸ݤ'c&q759>m]f3g?"0Oku>?œ՜g?w7O.ooJ=C}=-痣>tzл%߂ςo-\nݗ1x=-["2ynA"nzpD|} ڸq ۸M6>V~rop[m6ql|o6ܛq۸M6d vV۸m&2+nC6ncwFΣw?K1w;jw;dCuw6`wȆm܁6m6 @w6`wF-] 㮘S9]l.ِ1][U۸m%2S9]l.ِ1rڸq۸G6z={X܃{j{dC6A6aȆ=X7m6 ׍{={}17IPn܇u}l>ِ1}}!cq֍jdCu>q_m>la 7~lِ1!cpjdChl!8_fL<&CCCC!cuCNyxH6d >6m<6 ;/sfb|;0Ot~~A}?ᄍx vI=GlyND1?#}aQ#ɁGX>E|#1x=m|Tm|"yݲ61> OjOdC6>A6>aȆm|6>m|6> m|Rm|6羴/]tw&ga3Ym3ٜ"b>3?>m|6>s_D n3Ym3ٜ"bghgl ٠B6X|/j_/dC6@_6`_Ȇm|6m|6 m|Qm|5g_r0U?WWs& j1WWs&Ӫeb _6m8}q;E 8#222222222222222222e,e,e22222222e,6^u=۵)d:ssA):[%}s<7c%o\:q\RO S251PSǀ_|1f # ⻠/F|l#>ِ1xoF6cɆ{.7ۈO6d Ň6m6 ʿZH`l8% m 6` Ȇm$6m$6 Hm$PHm$ 2_o'6m$6s'jb$u#! 6b Ɇm$6m$6 Hm$THm$$2HHD6"7SH]Ddvm"DF"!c  m$6 ? N䂞'RHm$"2HHL6I¥؅$vA{16cɆm$6m$6 ׍İn$VHm$&27C6cIƱv"V018)ۺ$dE72I6`IȆ)I:%Fl# ِ1:% \$QHm$!2HHJ6.gثl{# ?= :=FRl#)ِ1lWRFR!c֍jIdC%6m$6 Hjb$sJ28$SHm$#2E^4F2l#ِ1dF2dF2!c H HN6# .=LHN6d {r{rFr!c9%9Sm$6 Hm$WHm ݢf]`bpadc'wK)6R`)ȆF X7Rm6R D Q F !c3R@)6R`)F?8H)7Rj)dC?TJFJ!c9%%SRm6R )j)Td<߸D/ 6RaȆF*X7Rm6R ?3N傞RHm"2SRA6RaFWfL41R~#57Rm6R H mVHm&2aHHM6d n#5Zm#5laFHmQHm!2JҨm6Ґ ׍4nQHm!2MmQHm%ڵ)cb6Bi6biɆaltvp8CN&FZl#-ِ1FZFZ!cpijitd51҉tp#F:l#ِ1;j\;j6aȆtpNIHG6d ދ6ҩm6ғ [GXhbu#=6cɆm6ҫm6ғ HmWHm'2額j鱍 d#pGKM Fh#Fl#ِ1x/62`Ȇ pNɠ@6d Wh#F G^߹*Zx0}E|]x"v>WN;s5}w`'zy\w32=pO+g #}?_dT;ȈAFr c"#+2Ed #14#Qm##lq# Ȥ D6d Gd}D&LF&!cpLjLdC}D&h#F&lÅl8^8ppQp6\Ȇ .j.؆ ِ1sEmp!2Nmm`مmbd=ffQdVȌmd&2133Ffl#3ِ1x FfFf!c2C62cYƻL,Fh#Fl# ِ1xF,F!cpY,jY,dCsJh#Fl#+H}ُEYFVFV!c֍jYdCededUȊmd%2ȪF6yi#x >_ͦ F6d n#Mm#l|"\fSȆmd#2 Ȧ N6T&Fva#;]m#;l|NjٱdCsJv8dWȎmd'2_f6md6rj_GnbsJ8Pȁm 2>_͡A6d n#Cm#ln6rm6rf|kbTȉm$29aȩI6d oFNFN!cp9j9F/><}lb|/{_߫m|m|O6d S7;c8l866Fobhm|m|O6d o|66'2=F.1L\.rʥ E6d ދ悽h.\F.!c ֍\j\dC{_\j6\t;FqfGn9y,cy-c,c-c,c-c,c-cE,cE-c,c-c%,c%-c,c-ce,ce-c,c-c,c-c,c-cU,cU-c,c-c5,c5-c,7yߛN5.7qO7g G$knuˍk\nq2qa˭qqM5NkܰV׸xC6f#ͣC6d >_l#ِ1osAiOm#lq>8F>l#ِ1g|jdq@LjdCt>]~F~!c}p.F~l#?ِ1xmWȏm gHz2Q@(mP(m 27 ~Flِ1FF!c~Q@mQlv(((l6 m6 (mT(m$2Q(Q(H6d ^7 B6 b>,hb~ g?6 aȆBpN)Q(D6d -װ6 aȆF!hF!l0H|ȿ̘&FababaFa!cg?᳟jdCV(m&2Q(Q(B62n(QyXk"jE"dC6@E6`EȆm6m6 ?)mQ(m%&^9QT)ERTm(QlFQhFQl(ِ1FQQTm(QlFQhFQl٨zĜR )6aȆm6m6 `/ZLmQlF1hF1 G^ŝmsJyFy!c^A>A:F!cwwm6 u`\GmQlFhFl. &F]Q7ºQWm.Ql==judC6Bu6buɆmԅ6m6ꑍcFnb6A6aȆmԃ6m6 ۨmSۨm#2_SՃ6m6꓍+wlM]]jdC!Շ!Wۨm'2פ>|פF}l>ِ1^L}hF} G^?8+^ mZ]x"v?`w`.]ۺ``)ݺ=A}OYF^k AX~\ݗ1\4P;hAr cG(ZD\46m46 Ǐ31>! 6b ɆhhH6d >W4sECFC!c!Pm!шl|A_MFbmMm46 ׍Fn4Rhm4"2hhD6d c66m46R+Lb4sJc84Vhm4&2hhL6d jcjcFc!cichFcl ٨USMĜ)M6`MȆm46m46 M`Dm фl&F&FSъMahhJ6d Im46 [4M6bMɆ{ѦFSF3bD 6aȆF3X7m46 ׍fn4Shm4#2EA6a_;/syy6cɆ):Fsl9ِ1FsFs!c^9\m9тlLoxԂ&F oF F !cwHZwHZm6Z )-BmтlmmPhm$YuHSh)FKX7Zm6Z )-Rm%ђlFKhFKl%ِ1FKF+4!LVnuF+lِ1VjVdCsJ+8Rhm"2E[A6ZaFqGT51Zw[w[m6Z ׍ְnVhm&2hhM6d ދ6Zm6ڐCOZh#ְmFl ِ1xhF6F!cpm6jm6dCu Fm іl\( M.ۺ߻lhK6d oUhm%23o ۪m6ڒ mjmvdG7~F;lِ1uu6aȆm6کm6ڑ )vjdz31ڋ ګm6ړ o6cɆpNihO6d ^7C6cFr\}u11:֍jdC0h7g n[O+M F!cpjdCuAmёldsn(;=jdCuuTmt$2訶H6d n#Qm#щl˲\&F'N)6:aȆ]NjNdC6:A6:aȆNF'NFgQF9A&Fg1tsJgFg!cpFgl3ِ1FgFg!c謶B6NѠEԍ.ntQmt!2袶B6d n Em хl| Em ѕltz &FWa+Um+ѕl|Smt6 a5lWFW!c誶F6\;p&F71tsJ7nF7!c ֍njݰndCu6aȆnF7nFw1c'g:;\tWmt'2Emt6 ?vWmt'2?s;]m݆$ͿIV"~0OkMҏFv݁xRo~G~SyqtTq=A<'揇 ׃te o[P;Ar czփj=p=A"d gጁlPa8%s_o'ȳagq222222elelelelelele26262faiesMMMMMғj\lcB_ g׸Td s]Ouk\Oq2q=a멮q=qI5N5'q=5'z?kbp/Rm"2 襶 E6d nKmыlBzA6zaߥ01z jdCQoVm&2_GroFo!cRohFolٸ`Flِ1xF>F!c>pFlِ1>F>F_zHI뷘}E F_F_!cp}j}dCu/}6b}Ɇa#gL?jZ}~d#qySDF?~F?!cp~j~dC6A6aȆaldqpXݙwjZdgG:?\Wm'2ߛfm6 a/_m?џlnuFl'QhךLD ֍6~6~"2OOdCOIm'l'!cp?A?mm |{7dc'wK6`ȆpN1@6d > s!cpjd)`b @؋Tm $2a1H6d nc 1Pmc 1lgh2Pmc 1ltμt& b^D6l/Rm "211D6d nc1Hmc1lo1Ajdcu7_;&`o ``!cm 6  m Vm &2 m Vm !Ë1181&]Qm !27~clcِ1cCcC6`CȆ!!PA1T|?5~?5Tmc(1l|N 甡jCdCuc(C6bCɆ甡P؆+);չa Wa4 W WlÕl܆+᪶m  WX7\6\ W!c mmbFnC}11apk0lcِ1[ajðadC{_0a0!c-16O9g&0lc8ؽ<.l 6m 6 ׍n Wm '2m 6 h;{5e{e&plÍly͔&mmandCor6ܰ 7!c~ njn؆ِ1Rٰ-6ܰd`b6F@#6F`#ȆX7Fm6F ln[1m 23Æ@j#dㅋc)l6Fm6F ׍nTm$216twM H!cp#j#Q; 21F QjQ5 5Jmc1|!b16jTwZQ+ `1JmcN6211܅ wh]mp'2Fb6ú 뮶m p66ܱ w!c-16>O_+716ܱd#ËŞhg>Zmc41l jdC0sJmgMM h!cGj6yq~[W6n c"E'S;Cj}\7:cw`./n };71o.ߋ;I8c| c*X1Ww`,}׃U;Xr c3CĆUݐZcq=K"d XhcXlch/bU&81Ws8q8!c>WƩm6Ƒ mSm#2F1Nmc1l٧&xac<1^mc<1lx|uxlc<ِ1LQapY龉1O6d nc<1^mc<1lnˠ&ac1Amc1l j dC6&@6&`ȆmL6&mL6& oK'߶51&:ɆejdCuc"6&bɆalqp8N'&Dlc"ِ1x1ژ1ۘD6] bbL'g6&aȆ{I1 ۘD6d 3FKZژmL"2IjdcMwLb2S&mL6& ۘ mLVۘmL&2ٸac!SZdC6&C6&cS߇dbL3n)!c@@mL6 ìS9c8l2oobhmL6 A8ژ1nq>o·#oǙS-xLyXƦ[fX<-c^1oL˘e2626262g͵XY-c-c ,c -cAEŖ`Xelelel|T㎕=[u* qSqJ5N5n*qS5n*qSTrpԸu.&ٷ6715n*qS MU׸xF6x9Sm$2nxmxbdC6< O OlËl?ɴ&7`᥶mx  /X76 /!c~ ^j^؆ِ1<51 / /lÛlԦ517V6Ɇ7j؆7ِ172o olÛlnxCjLqj1Sō36fb3ɆLX7fm6f ۘ mTۘm$23j3 ѫlEך>†᣶m 6|6| !c^>j>؆ِ1ޗ᣶m>ܺ/E}6| _!c$1Z؆/ِ1 _hWm%2S| _ _lc٘؊D1 6faȆ,X7fm6f ۘmRۘm"2.8 ژ1 ۘM6{{v9Ę-lX7fm6f #ll!c~c67fm6f ׍lNo5sDݘ9!cuN1ۘC6d ^71Gmc1lhclÏleV)~nma~dC࿓'Om#2~j~؆ِ1 ?hOm'͘x6  lßlnú᯶m  X76 !cw[   G^s֕Ϳ gjs"w?:Kn7:kw`./n. sw`7U=0؛k^#P\~A@sEA1x=66yd}{ 11 yjydC̓Sۘm#2+b1m6 )2_mc>1l|hc|lc(Fq !cp j dC6@ 6` Ȇ;@ 6` F}11  j dCB؋.TXm,$2XXH6d ^7B 6bAdyM%:H1 h#Hm#"2AnmaAdChE6 !cpAFFlt ؔ&">">"E"!cpEjEdCI$6aȆm,6m,6 וw&`b,pXmc1l|Sm,6 X m,VXm,&2 _ m,VXm)v bb FF0L6d n#V6Ɇ`8mcdCp^V6eƔȓX"YYXB6d >,s%!c^t Em,6 )K%jKchEC6B!cp!FFB6d ^7B`Q6BȆh#Dm#XJ6byݳHYF$I6d />Tۈ6"ɆmDBjF$ِ1\ mDmDbQd#zu7_?#JQnjRۈ6ȆFQjQFِ1x((l#l|mDmDadcwE,01{ѰVۈ6ɆpmD بo&F4M6d ^7hhlc=mKLnuczlc=ِ1c=\WXm'2S9ezlc=ِ1xX@6nNR. Χϧܠ@6d ncAmcl|b\lP؀ml 2ؠۈ!/<abĈ9%)1j1F ِ1l#lF mĐ ۈ6b6bXo|FLXNXXl#`hF,k2D ދ^4Vm#ۈ5"?6ڈUۈ66 kgbluc#66bɆװvFlc#ِ1xFF!cghjMd#ImlR؄ml"2S69e&lcِ1M&M&!cu&hc&lc3(һ&fыnff!cpjdCpYmc3l mlV،mđqFmđ ۈ66Ⰽ8!cFFG6d >Aqjq8S&olQ؂ml!2_nk-j[-dCuc [6`[Ȇml6ml6oZ(f ŋkn-Bqw@ A $!@uy^Y{k&1aqLmql1h1lِ1x81c1!cpǠcjǰdcM9J6158\Sm6 )r\m8qlo}ql8ِ1q؆+٘x*)p⪶m o W WlÕlo¾᪶m ϢІچ+qlnxqB)'rBmqlo} lِ1x8  !caO@'6N`nd㯙^H&E๨چF6d >oyMm p#2nomandC} pSp6N7~8)I7Nm6N '6Nb'Ɇm6Nm6N 8 mT8m">[}ob}6NaȆSp8q 8E6d c3Fb$")lِ1r 8q 8M6n9LLrbi8V8m&2FR]:M6lۥjdCi8oV8m&2ߧ6Nm6nӥ613hw wlÝl|uچ;N6d =;]mp'2mmmxXqR;k[j,ey[j,5KR-K-R .[jW,`KvRnXj KvRmݱZA=.>nd 毓X7{qx;C6=&<{l~(l ِ1|g6`gȆg3p6:q8C6d >76Ψmp]}<|NȁXA"~pD6Ωm6Γ Ǐ^)nbyl<ِ1Z#? x/bhm6Γ 8mW8m'2#C6cF9't+gb\qAmql| j dCs8G\P۸m\ 2G_6.m\6.[lb\pqQm"ql"d ڙ>†᣶m 6|6| !c=m`>dC೨᣶m Ϧjb5)j؆/ِ1g3_ _l×l܆/᫶m Іچ/G6gE6 ?!cچG6d nS6ȆϾ ? ?lßl<@_)pMW6ɆgQ8mcdC?76 !cyW6ƻ}E 71D}#@m# 2om`dC{ P6ȆFmT}36@@l#lF m )pM T6ɆmBjFYvdSM 5%Hm#"2mmaAdC6 l#l0AFFql[u{l㲰qڸq۸L6d }e}ee!cpjdCehel ٨v| M+hl ِ1x߸+!cy 7m\6 ۸m\Q۸m zr#XpV6ɆmCjF0ِ1x}#Xm#&2?66dsSיWUU!c=Uq۸J6d n*qUm*ql| m\U۸m\#3Nĸ<56 EW6>-m\S۸m\#2`߸q ۸F6d ]5]5k5!cq ڸq ۸N6&VN㺘7yul:ِ1x߸uu!cqjױdC}:q]m:B6o~[>#D Q6BȆ)!pm Ϣ!p Q6BȆk 6B6BPqwF(7B6BP!c5%)jF(ِ1x}#Tm#%2FF(ql,5跄'Myd׵ws7nm6n ۸mP۸m 2qڸq۸A6d mP۸ax82㮰qڸq۸K6d"F2Ck.qlL.<Ӻq۸K6d n.qWm݆/yM/0wqYqRo[j,#K-R{lEZjQKR{nE[j1 K-R{i^[jqKR{o}>Zj'K/a\Bߴ7lg0u =.z׿0{\qad /Lp 'c}tqa׿{dEw6aȆ忧q۸G6d ~6{S۸m#2S݃6m6}?LabA܇AW۸m'2?m6 oW۸m'2s6ib 6cdqLpa#W6Ɇ qF8N6d n#W6ɆmCj_MbMyהjdCt9!c  m<6 xmQxmUxm<%2xxJ6d >>6m<65{eE xF6d ?mD )pMVۈ6Ɇghh#Zm#ۈ!8L7b`߈Qۈ6bȆF 1j1F ِ1x߈}#Fm#ۈ!2mĨm`/F jeb  u^S:/6^`/Ȇgp}xA6d nBml|xmPxmĒ!1 >&Fا}JF,K6d 7ba߈Uۈ6bɆmBjF,ِ1 mĪmb/FM{bbtSKQbcKK!cp/j/dC6^B/6^b/Ɇ mTxixu+WvÓMIWj̇'gٺWp|W|x*) ^Wk tG̗Cﵘ1_5]}װV;xkr c~jq?xM"d V6^m6ƜW7Onbĉ86Ⰽ8!cqjqFِ18h#Nm#ۈ#2AqjqmtL7b|g7jo7dCoFm lhl ِ1 Fm lֲ)&[7¾Vm-l|My הjodC6Bo6boɆm6ުm6ޑ$*>x\wdv`Nml|MyהwjﰍwdC6A6aȆ{mSxm'>=O_`b{8Wxm'2FR־ޓ [zxO6d n=^m=l|xmWxm| z,71>5\S>m|6> )Amlhlِ1GlckMo|}Gl#ِ16>bɆm|6>m|6> jxכݶoþmē x76ⱍx!cpFF<O6d n#ڈWۈ6>%nab|}6>aȆm|6>m|6> ? ?Iml'h'l3j@L|3<L6d ~o|Vm|&2aL6d n3Ym݆0!FF \Z"K-RKj%Ԓ[j),Z*K-RRKk[j,Z&K-RjXj,ZK-Rm}mqa%(V8]#S%pA__ \'_N..ߩc%b=U1lԞvsPHm$THm$$2_/FBl#!ِ1FBFB!c/!Pm#!lja7gMDF"h#F"l#ِ1xHF"DF"!c{Vm$6 gHHL6a/#HHL6d 7þXm#1lo$}#Fbl#1ِ1HHB6I\;@w$QHm$!2I`HHB6d n# Dm# lFh#Fl#)٘xcU# ?K钪m$6 H m$UHm$%2HHJ6d `Rh#FRl#XkNNLd.d.djɰddC'sA'SHm$#2 H HF6d 7A6aƶ\ἑ\m#9l|HjɱdCg]nrFr!cpɡjɱd1&F Nl? 7Rm6R ))Bm#lF h#F l#ِ1>%Bm#l8njHcbt)]~JFJ!cp)j)dCkJJTHm$2)j)Td#qWC7ПF*1O6RaȆm6Rm6R ToRHm"2?JmRHm&Z51R}JjOIHM6d ~bjtbjFj!cjdC6RC6Rciƻt'i}l^Fm# lo}#Fl# ِ14F4F!cy# Fm#݆!\֕ş v"0u_Wj_OuS8?]W+7}xu_kAZ97v.K+i# -]}[Ҫ -91$i$i"~D6Ҫm6ґH'-stj鰍tdC[n]:tF:!cp頍tj鰍tdC6A6aFk61һN~7;Fzl#=ِ1FzFz!c9"=\Iҫm6ғ 6ҫm62_.l=A odPȀmd 2_S25%Fl#ِ14ܛfPȀmd 2?mdPȀmd$9.# XF.jdCpQm##lFFh#FFl##ِ14#Qm##l ¢&F&qn D2md62 ì)16Fw4162aȆmd62md62 mdRȄmd&SO]dìFfFf!c22md62 ἑYm#3l|M mdVȌmd!KҍE,odQȂmd!2Y`ȢB6d n# Em# l|ȢJ6\+]U mdUȊmd%27y#FVl#+ِ16+fUȊmd%2YjY Aq551\>S\6\ !cpqAᢶm  -8 lÅlo@.j.F6q?21 ٠ljٰldC}#6aȆהlpMɦ F6d >f6md638#XS5%Fvl#;ِ1F;g ˎq#16cɆהpMɮN6d n#;]m#;l1僳Q>|F>!c/\m6 6aȆm6m6V^fbWȏm'2?bm6 =U~F~!c9?_m#?QlL=ТZ`(Q(@6d"F2CkQl|n.jdC}Q@mQlwfQ(Q(H6d 7 ¾QPm Qlo}FAl ِ1FAF!ASE YF!lِ1BF!BF!!cpBjBdCkJ!hF! C^ߘg릘~xZ7vÓ?[ |6ȯ'Z3R8?ߨ7o><G5tӮvaCs40]}EW6>-~a/Aa2a?(vP@03Cy81" ~PDܾ0QXm0Ql^m󴴛QD?G"F!c$1P(Q(B6d ~nQ[Q(m!2_+@E6`EF N11w+Q(J6d 7¾QTm(QlFQhFQl(ِ1uEjEbdENMLbbQ ?m6 T1S6aȆgbp,Q (F6d 6m6Dgg 71ggm6 oW(m'2Q(Q(N6d n8Q\m8QldQB%QBmQlIdFF lِ1F F !cyQBmQlt8Mӆy$ٰ(XIFI!c5$\SJm6J %QRm$QlFIhFIl(?XiMRL<*Q (E6d 7::c$K`F)lِ1x(F)RF)!cpRjd~aEŻJwV(m&27JyFil4ِ1x( FiFi!cpj2d FQFS}J2F!cpe2je2dC6@e6`eȆ')mQ(m%}F+gbkJYU(m%2Q(Q(K6d kJYFY!cFYF91fMrF9hF9lِ1rF9rF9!cp堍rj對rdC}QNm-p̿Ab/-ƷƷdCs} Vm[l[!cSߧ|--ِ1ƷƷjbƚbV41ʋ|Fyl<ِ1FyFy!cy<7ʫm6ʓ (mW(mT 'қDߨF F!c5\S*mT6* )RAmQl|MmTPۨmT$ng51*}JEOQۨH6d n"QQm"QlFEhFEl"ِ1"QQm"QlNvĨ$lT6*mT6* ۨmTRۨmT"2Q ڨQ ۨD6d OmTRۨmT&oT6mT6#w&V21{;ﰍȆߛ|owjaߑ )5;ﰍȆה66=SĨ&֔jpMQ ۨF6d 7QMmQloT}F5lِ1xߨmTSۨmT'eXĨ.Fu7mT6 G_~G_]m:QlFuhFul:ِ1QڨQۨA6j{)F g0 Pۨm 2EkYF lِ1F F !cp5j56t׷ׂ̾p-u?׵Zd nZԝ^jQg1<\ ZW <ƈu11jpQۨM6d ajdCp][m6QlFmhFml٘U{u:F:F!cym6 u<\GmQl|mQۨm%+S?Ĩ+X3judCp]Wm.Qloԅ}F]l.ِ1[]hF]lؾ|Lzoԃ}F=lِ1Q6aȆ//QۨG6d ԃ6m6꓍csQ_oWۨm'2QڨQۨO6d ԇkJ}F}!cpjdóhե>MFhFlِ1 6` Ȇm46m46 hm4Phm4$!1eb4kJC4Thm4$2hhH6d n!Pm!ѐlFChFClوܧPhm 2-`hhA6d kJ F !cYBmђl[-{ZJThm$2hhI6d 7Z¾Rm%ђlo6Zm6Z%>TobF+8oRhm"2_SZ5F+lِ1 6ZaȆF+hF+l5Z`sM1Fk̮f!dhhM6d m 6ZcɆFk7Zm6Z Ϣjơ4Cλib(Əo##ِ1#\S~TlGxfƏƏdC}GhGƹ+{eob|& iD6^{돗F͟6~6~"2OOdCkOpMIm'l'!c3󟠍6~6ڐ :{lb6pFm цl߂khC6d kJ6F!c83Fm іla訶H6d sać^SZdC6:B6:bɆFGhFGlhR&F'1otF'NF'!cG'褶 D6d nImщlNg dF'l3pdx&Fga3Ym3љlotr@謶L6d ~iuVmt&2~.g KtuB6~kXS5Fl ِ1xF.F!cs.pEm хlot}F aB~_;;ZRnzZj,ޖZKRo Zj,Km6RnFZj,іKm6RoM&Zj,ɖt7[3d"Mîd u_Wu{\Wq2_u_7e&F7n}6aȆ!!馶 F6d u_7nF7!cpݠnjݰdccM+6cɆgp6ꮶN6d T6cɆmt6mt6z}G01zj=dC6z@=6z`=ȆהpM顶A6d >7ssFO>1w>Lo}FOl'ِ1)=6zb=ɆFO7zm6z oTm"/01z ^j^dC Rm"2 襶 E6d EoRm&R/5[ mVm&2譶M6d n7[m7ћlFohFolوBM>bam6 /~/GmчlFhFlِ1>F>F_hm;}F_F_!cY/Em6 Ϣ},Wm/їlFMg Y}2Z}_FngM_Ě \S~Ql//j` _`Eml!c~}_~d `bs0_#Sm#2觶G6d nOmяl~F?~FQ!rLbMהjdCh8Wm'2?Em6 Fcdv!cpjdC}c6`Ȇm Pm $m&:Lb獁jdCk@ Tm $211H6d nc 1Pmc 1lcA.m 6 a= A !cm 6 ?w91L6Ƥv >&`1o ``!cpjdC`8o Vm &211B6^z1lqp٨ϵe1B6d k!!c!|clcِ1,:1nP֕ş PvÓ %~ ;0kHp4Q U_o><n(C|(c› ab1 ?0՗1c S;0r c~0 ajp?F"d >c6m 6 Rnb p1\mc81lG Wm '21splc8ِ111A6|{1BN;#6F`#Ȇ7Fm6F MGdlcِ1xmPm$̘x)H7Fm6F ?;>;Rmc$1lHhcHlc$ِ1H(|B Occ٘31Jmc1l|1 ?Fm6F MG(Q(!cpQjdSϞxŹh1M6d snaqoےE1M6d 7Fþ1Zmc41l| mVm!g1F1oQm!2?ϴƨm6Ɛ S}1!cs11X.M=1l/iicXlc,ِ1,:΢c6bcɆX7ƪm6ƒ X8QvMl+Mqقqقqj㰍qdC88oSm#211G6d 7A6aF41Ƌyc<7ƫm6Ɠ mWm'211O6d 7C6cF›gbL8oLPۘmL 2_S&5elcِ116&`Ȇ) jduj<61&|cDlc"ِ1xߘDD!c=D1ۘH6d nc"1Qmc"1l8sc1 ژ1 ۘD6d nc1Imc1l|MהIjIdC6&A6&a ڽ61&Yt2E'mL6& )2Ymc21loL}cdlc2ِ1,:ژ1nC~FS,jMԦ[j3,,Km6Rkjͳ[j ,"KmR[j-Ԗ[j+,*KmR[k[j,&aP[Ywހ7E7z׿)pqSpB=NMQ)M'c7)7STD1Tߞ1ۘJ6d MTT!cpSjSdCThcTlc٠741ymL6 ioLSۘmL#21 ژ1 ۘF6d ~3 ژ1 ۘN6V\Ę.t7mL6 oLWۘmL'2?bmL6 ۘmLWۘm ]F5:1CؘmPۘm 23`ߘ1ۘA6d 7f1Cmc1l|ޘmPۘm$ߔM71S<;>;Smc&1lō}cLlc&ِ1LL!cyc&1Smc&1l8njRĘ%Ypޘ1 ۘE6d 7f1Kmc1l,f<1 ۘE6d nc1Kmc1l] EMjdC6fC6fcɆpޘ1ۘM6d >ŏ6fm6損\Uc7yclcِ12)s6`sȆה9pM1ۘC6d >ó6m6 01:x.ٰ\lc.ِ1xߘ \\!cpsjsdC}c.1Wmc݆!_[mٺ_ijEO>ٺ_;+U;|x?g~WW~͇buk貺YMLbjdC6C6cɆᰑ A`MagK{$"|lc>ِ1|1Kr-MνdüN>[@mcl|\gj dC{po@mcl|Xm,PXm,$S9;kG[c aXXH6d 16lG.TXm,$21)cBlc!ِ1c!Pmc!l,yxX$~7{ EjEdC}c6aȆm,6m,6 )EjdcJo41sblc1ِ1` b!cYt1Em,6 )j%d-Ko,!2=XqDmc l|]g%jK%dC}c K6`KȆhclc)8__ 51jKdC..UXm,%2EYtRlc)ِ1xX m,UXm,#WS?`9edej˰edC}c6aȆ27m,6 e2erx$caXXN6d ;.WXm,'2aXXN6d nc9\mc9lĭlLcXXA6d OY)+6V`+Ȇ 7Vm6V XmPXm$ X)l6Vm6V 16Gn{b_Xm$2XXI6d >o6Vm6VlߴNRcx`6m*lcِ1xX*U*!c=*] XE6d 7VA6VaFQǯ11VWWm6V f5|?jj!cjdC6VC6VckF^No21ֈ5e \S֨m6֐ 5oQXm!2EYtlc ِ155ZdͶk)k)k6bkɆkvZlc-ِ1xX ZZ!cY mUXm#xX':7֩m6֑ uoSXm#2XXG6d ]:hc:lc=>Lzhczlc=ِ16cɆm6֫m6֓ SC6cD\M bMה j dC}c66`Ȇml66ml66 &Amcl,X5(tcil$EROcFlc#ِ1xFF!cpjdC06yF&sQ&&ckwD6wnZZilR؄ml"2E7Yt&lcِ1>eܧlR؄ml"276A66mlcRRRfmvXj;-]nKmRRgXjZj-CaK툥vR;f\-vR;e-L=n7NM 3fq+mV͸m'cd "olV͸m'c[ȆӍJ[ssWB6Oclc ِ1ܼ[6`[Ȇ׿-pۢB6d ~NآJ6hzablu/䶒 r[6b[ɆV7ml6  mlU؊ml%2تno߭P+<[|ojEO'w~=7̇'g^loٯTcS;?]7~k[;Cw}Ww~/c9cg,W;Ɂѿ}j~;1x?]mwlcH<=ۄm6m6!cb\+ml6 `ئ F6d ncMmcld.~+d;\5ml6 olW؎ml'2خN6d nc;]mc;l\y&7vCmclo}clcِ1!cw@;6v`;F'IC1vw۩I6d 7 Νj;dC6vB;6vb;ɆNhcNlcp@um cXSv5e.lcِ1x.].!cYtEwm6v mR؅m&mv+<2{6vcɆm6vm6v  mV؍m&2? mV؍m!}E ?#֔=pM٣C6d ]]=!cp{=j{=dC6m61㶕a9(MU؋m%2{aثK6d nc/Wmc/l|M mU؋mA6vF7j` # lj` ??66)r:XĻwS؇m#2`اG6d ncOmcl>hc>lc?p&~7þ_mc?lotvppL"~lc?ِ1~~!c~qrt*==6`Ȇ7m6 8mP8m 2j?Ɇo^ɫ}ʟpƟƟdC0g_1sTZb ?w'|O??ɆƟƟjbɦkbgAA!csу\Al ِ1AA!c}AhAlxx㐘7y!lِ1C!C!!c5\Sm6 8mR8m&:oeb}06cɆp8q8L6d n0qXm0ql\0qXm0qlWqO&7qDmqlhlِ1##!cyqDmqlo'㨰q8q8J6d n(qTm(qlQhQl(ِ1>(qTm(ql8~X}O{cjǰcdCS8m#2q 8q 8F6d >o6m6:;E8qq!cqjDZdCooW8m'2q8qp%W[8r*7\چ+J6d npUp6\Ɇ+j؆+ِ1 WhUm8A6zv '`8q8A6d ='6N`'Ȇ7Nj'dC6N@'6N`ndcݛhb nІچF6d ~Mm p#2_S⦶m ϢnІچ݆ᘓ2tt>t$'"NEO>gNqR݁p8'W|x*?t^k~StWL3tg[jZd]ԮXjUK횥vR B-MK향vRcݵŃzW~d:y{8<^Co\ !cq j dCt jd ;.=$=$6.bɆ_"}jdCE8o\T۸m\$2_S.B6.bd؟wV31<3\O OlÓlox¾᩶mx  O7<6< O!c}'᩶mx2u;w^|Km "2mxmxa^dC76 /!cp^ІچM6$M6$xUÛlJGo olÛl܆7᭶mx 66 o!c5V6.!s. 31.q KjKdC6.A6.aȆm\6.m\6. ۸m\R۸m+ab8mg}FLGk)&  lÇl܆᣶m Ϣ>pQ6|ȆhGm%K;~+7|چ/K6d ~ Ͼ|6| _!c چ/K6d 6|6| ?[׏_~b)~j~؆ِ1 ?hOm#2ߧ}چG6d A~j~؆?٠[}01ż  lßl|Mkچ?O6d 5_m'2_S  l#lԠR1oy#@m# 2mm`dC}#l#l<P61ߔMaby#jF ِ1@h#Pm#$2ombdCF mG5{:a2N\K/ǃ6 !cpAFFD6d 7`R6Ȇ h#Hm#۸L6$벺Y㲸2el2ِ1}_}_6.cɆ2jdCehel ٠&qx+!c}Oq۸B6d 7qEm qlhl#ld[o~#XpV6Ɇה`mcdCK%6`!cpFF݆!X˱7ٺ$b́^#UvÓٺ |І¿õO5kp~86U7}]_]^л&kpp?FW_O]O]S;5r c\+E\1y ڸq ۸N6F%)q]i]gZ6cɆq۸N6d n:q]m:ql|m\W۸m?XsD#B6B!c@C}!j!Fِ1#?B6B!csh#Dm#%}&F^?6l†mbdC0kJ'g A/~Ck#%2-~m )FF(qlLq)ㆸ lِ1q76n`7ȆהpMq۸A6d ܀6nm6nb6jabM8T۸m$29a{Ml&ِ1MM!cp7j7[dcmL[-h-lِ1-xuKmql-h-lِ1[-[my9=:>6ܧV۸m&2?Ӻ ϴnm6n vjV۸m&2EoC6ncwȆGz*Ÿ#)w>lِ1;@wQ۸m!2EYlِ1;;]ILb gѻjwdC]8U۸m%2wa߸q۸K6d ܅6mܵp&#Ύ0{݇6m6FoabFF8N6d 7aW6Ɇp87mcdC}#W6B_Hgb<==Pxm< 2xx@6d 7@mlhl!٨AKLb}gчjdCkC>6m<6uYmb6aȆm<6m<6 goWxna>< ng랓ӯ4u|x?߭{snSO?W_D5lW h1GD9"Z}q?/cޣwjѸDϘpƌV D,<ڈVۈ6buj<51bc#l? i#Fm#ۈ!2GF C6d VnmĐ ۈ6b6bdsa&  !cp/j/dC3 8cPxm 2?|mPxmĒ'01bŚ הXXl#l|MkJF,K6d n#ڈUۈ6bɆmBjKK/Ex KK!cj/dCkKTxm$26^m6^rKx%+lِ12Ȇ+W+!c WjWdCgZWjd1}obAAVxm&25kl5ِ1;^wVxm&2_S^C6^cqduߖVMG1ļ88l#lI8a#mđ 876Ⰽ8!c5%ڈSۈ6ސz%71ވ5 \Sިm6ސ 7oQxm!2o`xxC6d hl-,[6iM[h[l-ِ1̳u16lUxm%2?z Ͼުm6ޒ x mUxm#_9x'l6ީm6ޑ S};w;!c};OyxG6d nNml̷pМ&{q.Wxm'2{^jﱍdC{8oWxm'2sިib 6cƎǍJ}gb|pS̽~F3$lِ1x!cjdC069c8l\75e Gq|ELbMהjdC0碝16Gn{b_m|$2H6d c#3FbDԔ16>bd{M9Jw]ǫmcdC}#xxl#lF<mē y匁֔xxlNsJ1>O|'lِ1LaOjOdCOpIml|MהOjd޴Z, L6d 7>þYm3lo|}gl3ِ18ܫ)chm|c{# RKd%ԒXjI-dZrK-RKeXj_Yji-tZzK-RdeԲXjY-5K-Rae^Uѵ CH zB@BH( )л^U@zW:(#W޻ {" U9>o7>~?֬?X˘e,e,χqKG'N|xߜ{ʿN'?;:Oָd>k\2T1`K7Jz=u 8%'i'/Reì 6cɆ>hKHN6d n#9\m#9lw\1jɱdÿQ5L>oNj)dC~Rg?)6R`)ȆA6UqߟF$16R`)Ȇ{>7JHI6/5tgbt NI6}VC)6Rb)ɆQKQKHI6d _iü$FJl#%ِ1FJ؆٠nnᦶm cuSp6ȆaF+FLi?ip6Ȇn>hm8F :3pl Sچp o86؆l߈wp06&I  2Epm8TdE971R ֍TjTdCF*oRHm"2 H HE6d 1+s϶WV?Ϟ$F* G^>w"I[s'?ӚQ\]-.\ߋivnw`.œ%so I.o.i\G]}q=HM|a Ԯz`fS71\Z}SzAjXR 591L=(]wZq=HM"d ;hH !-<྅چA6d ~j؆ِ1 hCm 2mxmx`dlM OFSm$2nxmxbdC06]1L⩶mx iyBjF[/21i4ji4dC6@i6`iȆa֦e]16:t5jwZi4dC06b8ms]d 4FZq0;.#xN>'IHK6d n#-Vm#-l'N²\Ibhm6Ғ __Vm#-E6~>4ˇ?僾R6Ȇ-྅چE6d :ʋl؎R6Ȇ^j^F:qoM;CľE:oNm#lF:h#F:l#ِ1FN5q$16aȆalvH퓇q2F:l#=x M>]>]j鱍dC6C6cɆA6tph>bEHm'2SicE .ϑ$FzlÛlUwJ[ oX76 o!c~j؆7ِ1RM6l7[m&2pM6loxmxcȆ[t!L { j dC0\16nw~$162`Ȇaְ\16|:{Ȁmd 2iöAm#l>#E3^4FFl##ِ1O##ٰidTȈmd$2~*~*FFl##ِ1s46cIbhmd62(ڃ312 ֍LjLdC0[b8m!BȄmd"2+|+F&l#ِ1L/Ziüd=I LFfQsMFfh#Ffl#3ِ1{{62cɆmd62md62  mdVȌmd!MzM,b_4 ͢B6d o4spڰVEm# l,>,jY,dCgd{Y6`YF_11uJVNɪJ6d ~>LVt>LVFV!cq $FVl#+ِ1YjYld[ hbdsJ68dSȆmd#2M]16lmd6 `/Mm#llF6l؆p(uu  lÇlC6l[p>j>؆ِ1x  lÇl܆᣶m y6| _ _l×l|Nsچ/K6d ^7|aU6|Ɇϣ6|6|dcDG&FvыfhvFv!c֍jٱdC6C6cɆFvh#FvlÏl=6M ?o~Om#2~nma~dC?NS6Ȇ866d&ʾ51r9j9dCp` F!c~#7rm6r as@96r`dVl[N';I1E  lßl|Nsچ?O6d ^7aW6ɆmCjFN<יM j9dC6rB96rb9ɆȩI6d o6rm6r 7gebrgm6raȆasm6r ׍\nRȅm"2_6rm@'|ܖsʖ^ O,{n]nVW*f..twQʭ]񼖇y)f3%4X+k<껟kyZr cR("ZDQ7Om#l|-?m6 ׍|nSȇm#2_+6m6/bb76rlLwaLu#F~l#?ِ1::?\GWȏm'2aȯO6d @~h#F~lh;Q&FRP(m 2`(Q(@6d ^7 Q@mQl|N)mP(m :8u#֍l#lnm =l#lFm$r~((( jdC6 B6 bɆFAX7 m6 S B6 bƬ{Khb"ɒ,)D6vph!BF!!c5l!-Q(D6d oF!BF!!cQ(Q$V_hޫ(}jF ِ1xu#Pm#$2ݺ@ujF ِ1@h#Pm#";z8#k R6Ȇ1PR6Ȇ 8maAdC6 l#l~zb#Xԍ`X76`!c FF0L6d ދ^4Xm#&266dZ ;Q(Q(L6d LaLaFa!c~07 m6 jLa#Q6BȆ1RZ!Fِ172!l#lh#Dm#(B6M.Qĵ5{_EȆ"jE"dCpRa[.Q(m!2E`(Q(B6d >6m6BɆwR21BEu#Tm#%27Bam  U6BɆPh#Tm#(J64&FQN) )E6bEɆFQX7m6 ؈ui8m_xHCk(QlFQhFQl#lV&FanmaadCu# ֍00l#lnm )aFFN6ʮnw(#\66±p!c Am }ýppl#l 66±bdN>N01 ŠbjŰbdCphRLmQlF1hF1lِ1x(mS(m';(.苫m6 aQ\m8Ql|RSm6 6m6J z3qQB(mP(m 2|F lِ1x(F F !cQ(Q(I6w"SJ9FIl$ِ1L/~_N| NCk$QlFIhFIl$ِ1FIF٘6!W%Wb װjFِ1:%S"6"!c)yJFA6d >D@jF$XVn)H8DmDbdCF$7"6"H!c~#jF$ِ1F$i8">&)/Q.\܍]oJޢA)sq/O8w{ޓuqtKy)\.C/ԃf2_|K"jF4ِ1~g4Vۈ6Ɇ{hh#Zm#(M6vߜq1KFil4ِ1FiFi!cpjdCpՍ8(Qۈ!g#Θ1.7$cȆwEaF C6d n#ڈQۈ6bȆm@1j1F ِ1#ڈQۈ6bFó^41bžE,ܷUۈ6bɆbamĒ ۈ6b6bX!cpFF,G611\64l?+88l#lnmđ ۈ66Ⰽ8!cpqFF݆ܗuty6,xe,c DX9XyXXEX%XeXXUX5XuX XMX-'ږ:zFƖ&fIƜ0u=)^oW׸x\|_O5Nop&^]q'c5U6ʨm6FYW{nb$or7 j Fِ1xo{l#l|.%m$` dCu#HPH6ʒwO(+FYX7ʪm6ʒ !boʪm6ʒ ׍nU(m%2Q(QH$]W6O#QQCԍnPۨm 27b8m>̨QۨA6d nQCmQlmPۨm$&FMQ7jºQSm&Ql {њj5dCkؚp [Sm&QlFMF-Q{̬&F-aQKmQlۺZۺZjZdCu6jaȆEkA6jm8?{_8|]uq&Dsq/w]H8 'o..m'zPyz|Ы-AmXj~m\jݗ1L $Am\j׆{"jzPD| mVۨm!#?Olgbq0]1cא3dsWGmQl:ju:dCsE8WQۨm!2+@u6`u;rlbՅUۨm%2icu6buɆ-}judC6Bu6bܕMzg輦#b^OmQlnԃuF=lِ1xݨF=zF=!c=zF=zF}ǥLnԇuF}l>ِ1^x}wWۨm'2QڨQۨO6d UڨQh@6WPkOdvBF!c֍j dC ꤁Flِ1xhm4Phm4$g@x!|FCl!ِ1^xCPm!ѐln4uFCl!ِ1xhm4Thm4"O>ueԍFdt_rHmшln4uF#lِ1FF#FF#!chhL6#4xNn5Vhm4&2ahhL6d >4sJcFc!chhB6 D}5{_M6`MȆFX7m46 a5l&F!chhJ6Й&FSNi )M6bMɆo ohJ6d ^7ºTm)єl|)Tm)ьl: ݞf4fjͰfdCkfp LmьlhfjͰfdCsJ3hF3l9(2~&Fs14sJsFs!c99Sm46 )\m9ќlyJshFs 0|0gv2222e3疱v/,c,c-c,c-c],c]-c,c-c=,c=-c,c-c},c_Zƾ ӂj\no?b:kpMB]Zׂj`[B-ٶZk\ \ZP1-5q-7jk\ uk翖d~!mRh mThm$2[¾FKl%ِ1x-6Zb-Ɇm6Zm6Zv:v;hbQ+Rhm"2g|gF+lِ1VF+VF+!cwV[A6ZaW&71Z jdCu56ZcɆpNihM6d hhC6Fs`b{1m^L6F!ciM?Ibhm6ڐ hmQhm!2_o6ڨm6>%:_l01>6>6>Uldc^ W V8I OOɆ۟jb ׍OO6>6>#u3a3h3ϰȆaF+W 赃] MCk3l3!cm|m|F6d ^7>6>S l켝]s>}6>6>'2i#~nIbhm|m|N6d nshsϱɆm|m|9іl\/~71ڊ^-E۪m6ڒ l~ڤ-ٰI[F[!cpmjmdCsJ[hF[lٸF;Nmюl|jhG6d nNmюlF;hF;l=xYB7&F{a=^m=ўl|Sګm6ړ hmWhm'2jmWho ,٩83o뾀3j_E{}[|>v^{uqtP/w\ܓ]߭/ \:=Ѻ)Otw}? wP;Ar ci6׃$BsEhFl#pxcS;;6:bɆ訶H6d wTmt$2_t6:mt6:A>SzľE'oImщlNp褶 D6d Gt3I'NF'!cpNjd#︞]Lήi:Fgl3ِ1x FgFg!cpjdCsJghFgl X61~ 7mt6 %%Em хlFhFl ِ1 Em ѕl-<5]O[itUmt%2S9FWl+ِ1x/]6b]ɆK mtUmt#nzf51~7mt6 ׍nntSmt#2 覶 F6d >t6mt6 ]ot'N]m;ѝljݱdCsJw8tWmt'2SC6c=Ə+obFoPm 2C@sJF!cp=j=dC6z@=6z`=FۋgmbzϞj=dCTm$2詶I6d c#詶E6O'M~`襶 E6d >sJ/^F/!c^p𧻓F/lِ1F/hF/l7tE:41z jdC0sJW |Vm&2a譶M6d ދ6zm6G^219Sm6 !buJ>F!cp}>j}>dCpq&Gm%F%ƗƗdC} ϣRmKlK!c5p ƗƗdC_B_m|m|E6> J)_9+Ȇ1:+ȆWn|ِ1xWF_1,MF_hF_l/ِ1̜iXF_l/ِ1}}6b}ɆF_F?~v"L~F?hF?lِ16aȆF?X7m6 o6m6i' xebFoWm'2YöpŠuIbhm6 mWm'2SC6cF֏%ĚD!cuN1@6d > s!c^t1@mc1l,;T%bdcx6>k1H6d c+F5$@lc ِ1@5Pmc 1l|Nm ThO0,x }m26262626262626262626262626262elelelelelelelele;\0K m m uk q2y 5n8F`o4H]7jT`q7lluP,z71L6d ```!cpjdC6C6cCF?Zش1D??Dmc1l|nܧ1B6d nc1Dmc1l7m Qm %]1TPP!c9e(Sm 6  m Um %2CjC6y}ݺR7f̷u__Z-ksq/o뾆5k|[5_o..Ϸu_{7t/k^Fԃo`=F}2+Q;׃oȁ7P7jz 1E@ߨm|m #^1L`1Lmc1l0hc0lcِ102Lmc1l|ov1Lmc1l8_.cplc8ِ1gg6cɆm 6m 6 m Wm =2Uscnnlcِ1;#;#6F`#ȆpN1A6d c6Fm6F ab{Z#HH!c9e$SFm6F ׍nTm$2#j#Qdkk%~b=QjQdCF}6FaȆ==1 E6d o1 1 M6}1ZSFuhh!c~c47Fm6F  mVm&2SFC6FccƔmv01ƈ^t EǨm6Ɛ mQm!27~clc ِ111XA+ 1K6d >sXX!cpcjcdCXhcXlcX2@uLqbNqj㰍qdCp8q8!c9eSƩm6Ƒ 㠍qj㰍d<_41 㡍j㱍dCp2^mc<1l|2Sƫm6Ɠ mWmL 9L ߘ j dCuc6&`ȆX7&mL6& 8ژ1ۘH6]u?c1ژ1ۘH6d nc"1Qmc"1lՉՉjdCDhcDlc٠_hbL{_$I$!c8D N1 ۘD6d ^7&1Imc1l$hc$lc2٨9vZCMɢߘ jdCdoLVۘmL&2_LjdC6&C6&cߒ O_Tn8Vako66%2ºƷƷdCu[X7UlƷƷjbSF:7Ę"lL6mL6 S`1Emc 1l|2SmL6 oL6mL6[֦?Ę*攩pN1ۘJ6d v*|;Umc*1l|N 甩jSdC6BS6b(0Ę&lL6mL6 !b1Mmc1l4hc4lcِ1v1Mmc1l~G&tac:1]mc:1lms1IbhmL6 a1]mc:1lnL6mL6f!O>Ę!πgm6f Sfu  !c1֍j3dC3j3d#M=S41fpkLlc&ِ1̜i#(e'1ۘI6d nc&1Smc&1l|2ژ1ۘE6&/Rw&, S7f Ap6faȆ,X7fm6f ۘmRۘm"2Yjdy&l/:Vۘm&2 Nӝ)'1ۘM6d nc61[mc61l mVۘm8;MRxS7Iߑ[ N-;sq/뛤ȁOS!I.u݁;?$}w{'s}ߩw̡{^{K 99?׃9te G4qp:kH:r c1׃9$B99\96+L鹦4Wmc.1l|/|. 1ۘK6d >W̅b\lc.ِ1\vs_։s_Ozg8g9celelelelelelelelelelelelelelelelelelelele{m햱]ݖs_QUw<C|o S׸yͣ'c1ۘO6d 2ژ1X@6nPj@/ 6` Ȇ-m,6 Xm,PXm, 2XXH6bb, BB!c9e!Sm,6 ) ᜲPmc!lo^m,TXm,"{fb,,,RXm,"2_S-kEjEdC6A6aȆfA6a1y21povblc1ِ1yQyQ6cɆpNYXL6d ^7C6cKFX"}%jK%dCuc K6`KȆX7m,6 Xm,QXm,%k;#X*RX7m,6 SuRR!c֍jKdCRhcRlc%~ȭ&2Q7Lmcl|NYej˰edCuc6aȆ2hc2lc9,𸉱\a5rr!c8D T7m,6 ׍n,WXm,'2ˡj˱dcwQ]N+Ĝ)+6V`+Ȇ X7Vm6V ׍nPXm 2+j+dVl[N+JJ!c֍j+dCW+6Vb+Ɇm6Vm6VJ`Jmcl}RXm"2SV9e*lcِ1U*UjA_01V jdCVXm&2^{5^{jlc5ِ1j1|+cE^tlc ِ1Fmc lX5jk5dChclc-وrręk&ZQ7ºVmc-l^XK6d oZZ!cXXG6-c`XXG6d ^7Nmclnuc:lcِ1u:uzQ5bdwMzhczlc=ِ13zz!c֍j뱍dCszhczlc٠7l516 j dCuc66`Ȇml66ml66 mlP؀ml$M?}衉QaQmc#lnlucFlc#ِ1FF!cpjMdn?116 MjMdC&M&!cpMjMdC&hc&lc3H&ff!c 'wflc3ِ16%;gb8m)wғ֎$166cɆfhcf G^߻~>/{jE{dl>&v|[= ߫o..tw=^}Ͽ` c~"X\ݗ1x=-l!2+@["zD|mlQ؂m@6ܟfX/  Ȇِ16~6~ 2Amlc+_GiMnlucVlc+ِ1x VV!cpC6BF-]Kqbls[l^mS؆ml#2`ئ F6d |u|Mmcl6hc6lc;٘=jT&vimW؎ml'2N>'ٮN6d ^7ú]mc;l|خA6 Qcbp05퀧|P؁m 2߷-vm6v mP؁m 2Ew@;6v`;lHkbuc';6vb;ɆةI6d >sNN!cowB;6vbFrIob6vA6vaȆw]j]dC6vA6vaȆ.hc.lc7ػlQL&nN )6vcɆ ܭM6d >snn!c~c7[mc݆| |a9c9celeleeeeeeeeeG IOSӖ3-cg-cXY[.X.Z.Y.[ƮXƮZƮYƮ[·C5róN{{5nq{====׸=Td ^G]j{`ۣq{lW|˿>٫K6d ^^^!cp{j{dC6B{6bFwob6A6aȆ>X7m6 mS؇m#2اO6n̾qncþy~lc?ِ1"6cɆm6m6 jd㋙g/gboP8m 2C@6`Ȇm6m6 ׍A>LAAl ِ1"Sm6 8mT8m$2ߋ9mT8m"Z-dbs!8R8m"2`8q8D6d !!C!!cq8q8L6LJ11 jdCp8q8L6d ^7úqXm0qlahal<ݪqDSu#!c8D \lِ1##!cpG#jGd#˘ʿ71^(Em6 GaqTm(qlQhQl(ِ1:(qTm(qlyPE^1lِ1r )6aȆc8q 8F6d ދ6m6ڎLnuql8ِ1"Em6 ؈upXyqr\+=8m'28q\m8#X}cL6~6~$2C@6~TlnƏj?b? )?B?mm 2& ы  !c8D ԋP8m 2q8q8A6d ދ6Nm6N#?O41Nq֍j'dC!!T8m$2q8q8I6d ?&qRm݆#\[o?mOpW'" ?dw`.mOp%dnO?zp O_T6N=SRS/cNN91qJ-HS)Si`YMihil4ِ1xq6NcɆm6Nm6N j3dfg Ϟ!=q8C6d oig+%q8C6d 6=צg6`gȆm6Ψm6~&<gW07ga)?mmL6d 3Ymglg!cw33ِ13Y&Y1sYY!c9+ӆ Ϫm6Β ?YY!cYhYlUɕ_^/j` ~__Ȇmm ِ1 /9bfj9Lsnu9lِ1r)6aȆm6Ωm6Α 8mS8m'NKkyqyy!cp硍j籍dCpr^m q;_5nnk \nP1xotF75q7|/܋q7pA5N߀5Mqý pom6n ۸ mT۸m$2nMl&ِ1M-yXo߂[jCt>-[-!c-޾q ۸E6d ݂6nm6nίFŜr)6ncɆ1Кml6ِ1mm!cpj;dOfqG|#s~#sGmqln܁ulِ1^sGmqlhl.Hy&]o܅]]!c8D d]l.ِ1]]!cpwjw{dck7>&=Q7qOmql=h=lِ1:\S۸m#2ߧmS۸m'JT㾨aݸq۸O6d lW۸m'27~}l>ِ1j6yݺ>o3 ;_"~0wW^UWsq/o~wW~=WxU_q=x@<=o66}p=x@w_z<"E<1xxlhQ瓂L߄ߠ6~6~#2C@57߰Ȇ~{ZmmF6d oCQ"CC!cߟzCl!ِ1!\6~6~'2S~6~WxD6GwnHM#G#!c 둏ȆGjGdC6A6aȆm<6m<6ݟx,pNyxL6d jdCsc8zx!xxA6d 7^m6^ xmPxm 27^@/6^`K ?`b)Ɵn''ِ1OSmOlO!c=?jb S6TxI6p_61^֍j/dCsK8Txm$2/axxI6d n%Rm%lLqc&+^+^+W+!c9S^m6^ }{_6^aȆW+Wk~x-):kl5ِ1kk!c֍jdCa_C6^coȆ9ix#l6ިm6ސ a57!c~ 7ިm6ސ xmQxm%a3|51ފ9-Sުm6ޒ o6boɆ男pNyxK6d >6ުm6ޑ qNԍwnSxm#2S9;lِ1w;w;!cpwjﰍFB^61raMlmmE6d n/h/Ȇ`__dC{_Amm''nwx/{X7ޫm6ޓ a^m=lxjﱍdCg6ޫm6> z| X7>m|6> }}{_6>`Ȇm|6>m|6> o|6>m|6>ˣgE/6>bɆ>½jdCGo|Tm|$27>B6>maa{>L2222fsXRY-c-c1OXXZ˘e,e,e22222222ceYrX-c9-c|{>_d7JuJk\2_T!V'uO ^k\2_Ġ7+~8_$%E5O~[7kK$WHna.p]m]r_jJw\ܓ]<ۺ'W{yYlpՃ7 }3˿)w?)TZtp:޳YC:HA r cut ("ZD \R׃F FJO)}2THm$2_+Ekj)dCpJ_THm$2cI mTHmoOdو9j[!njn؆ِ16%{gb8mL\%m  7X76ܰ 7!cmmau#d¼&Cc:6؆l|ofjlA6d nm86؆ln8 چHE6u~ebu#6RaȆ#F*l#ِ1TF*TF*!c H p'9ZG]pWp6Ɇ womcdC{ho]mp'2ߛu66ܱdcg=S}oEMZm#5l|NI jdCu#56RcɆm6Rm6d62md62 :Q ,e2md62 a/Ym#3lFfh#Ffl#3ِ1FfF1ǭ^#7md6 ԍfNG~Y6`YȆmd6md6 S@Y6`YF~-51uJVNɪJ6d FVFV!c~#+7md6 U7L d#FVl#Xt}WLlF6h#F6l#ِ1̞y3W FPZٰldCu#6aȆ{lF6l؆0#l@>j>؆ِ1a}6| !c8m$Kv*phS'Ibhm`>dCg@>j>؆/٠'6| _ _l×ln4upq\=6|Ɇ_8mbdC/᫶k8&&i&);\dWna.&);\fW;nw`.MRvx~v7d{]}ϳzGP⃶z~b[~te cO?r c>~j~?hOmA6CY#ط+CF!c8D ^FF!c"96r`9Ȇ{F؆?8_Id &mmcdCu  lßl?|꯶m 66dYT61r=pO+FNl#'ِ1x FNFN!cp9j9dC6rB96rbw#`ȥ E6d lRȅm"2Sr9%F.l#ِ1^x.h#F. /\Nzg8m9#e,e,e,ee,2V2V2h [ [B,cE,c0Xeeeee,2i+eE[J[b,c8˹/ui~ҷ[[]rjk\nXrk\n\rS1*7\SV׸ܸ'c5UnXrk\n6m6 .kibp& aog&FF!cpjdCFoP(m 2Q(Q  6E hF@6d n#P6ȆFjFِ1mm`FϔmMт4 Vt\g(Q(H6d [!}oT(m$2Q(Q(H6d ^7 B6 bƾ($):F!lِ1x(F!BF!!c^E m6 (mR(m5NdbFF H6d \0> T6ɆmBjF ِ1mmbAdW)Aݳ YFD6d c+FesLlU(I l#l|N sJFD6d n#R6FU:v0`ܳ:%Xm#&2nmcdCu#֍``l#l|N 66dy;11 ~07 m6 ZZXm0QlF+ʋZ$Fal0ِ1FaFh }M!d`ZĊ?l#l|)!j!Fِ1l#l}h#Dm#(B6?fQD<-Q(m!2Flِ1R)E6`EȆFhFl#ltra;u)F(٘kH U6BɆPombdCg3@B6BP!coBPPl(x9ߘEyJQFQ!c8RYXE6bEɆ產pN)Q(J6d N) mU(mab aFFF6d 6 > S6Ȇ)ajaFِ1mmadÝޱ51])dițm h2]6ɆF8jF8ِ1x/mmm8?*xm]1r-Q.\M\8{}[W vw{{+y1=/Aq> 'z\Qw8htԹs$Aq\׃W(Aq!c8Q\m8Ql8*+C F !c=pOF lِ1F F !cp%j%d#׮3L9IIFIl$ِ1Yb%%6Jb%Ɇ-J™FIl$ِ1FIFX_󋙽g❝NFA6d o-"6"!cFFA6d n#ڈPۈ6"FMGzkbDl?HvСQO#Rm#ۈ$2_F¾3Rm#ۈ$2 mDmDbdCGBjF)/11JRp/F)lِ1"zgF)lِ13RZ)RF)!c=RF)RF٨whh%&FmDmDaQdCu# ֍((l#l߈FFE6d >DAQjQF4ڍ4F4mD !bmD wFhhl#lnDCjFi8!׋Lb [aKm6J a/ZZm4QlFihFil4ِ1x( mV(mĐۋgȽĈkQۈ6bȆF 1j1F ِ1x/{l#lF mĒo}Ĉu07%ּ#ly3Vm#ۈ%2 mĪmbdCu#֍XXl#l|N6b6b8Ck71D݈u#Nm#ۈ#2C@sJFG6d ^7`݈Sۈ6Ȇ@666\p;F̎x9e,c DX9XyXXEX%XeXXUX5XuX XMX-'ږ:zFƖ&fa?[_x-WxA^j^Fc1\4Vhm4&2l4Vhm4&2l ;m46 MC6cdR3&ްnxmxcdC6 o olÛl܆7᭶mx Іچ7фl$M&l;&jM&dCg5E&F!c9 Sm46 )M&jMdct4T[4M6bMɆ5Кm46 [4hSFS!chhF62{KS9F3lِ1sf9I3fF3!cĚĚm46 hm4Shm4'rob4sJs84Whm4'2FsFs!c99Sm46 )͡jͱdдO71Z-j-dCu-6Z`-ȆpNihA6d NimPhm$+uh)yh yhhI6d Ni )-6Zb-Ɇm6Zm6Z h mThm"67H$h%F+X7Zm6Z U@sJ+VF+!c9SZm6Z hmRhm&w901Z;y5HkisT6ZcɆFkX7Zm6Z o6ZcɆj mVhmo N23#8m`>dC7|6| !c3@| >j>؆ِ1:Q6ڐ#q'\Kebq)n!0ۨm6ڐ ׍6nQhm!2m`hhC6d >6ڨm6|FeMgb)yچ/K6d o~Wm%27|a᫶m a} _ _l-٠_hb56ڒTm6bmɆ甶pNihK6d ^7ºVm-іl|Ni mUhmGbb}Q?/꧶m cϱS6ȆmA~j~؆ِ1x66 4C_L8$ApqAQ1 R׸ \エo}sD5N{Ak\FEve+bb FF0L6d >/Xm#&2am FF0B6f9'" !j!Fِ1La{m ׍X7B6B!cp!FFJ6 tq4&F mmbdCkP U6BɆF(jF(ِ1x mmb[=,cbsJ;8Shm#2F;lِ1z\oShm#2vj6ywn]ۺZWhoa.8z^݁xrvoû^}ᄍxJvo{^}zЁ֩dusEx;~\:ݗ1XvcAȁX:=jp=@"d ^:@6:`Fw(lt6:mt6: M;µiGFG!c#6:bɆFGFͿM07f6°0!cm ?#Lm# #2aFFщlܵda&F'Q7:Imщl|ߢܷ褶 D6d >tsJ'NF'!cpNjpqP)uLpqm8<6\m#'2nmcdC%6±p!c}FF8љlt Y)Ym3љl==jdCFgotVmt&2j.d_MOAOn .dI]6`]Ȇal:c8lHvimt!2S9Fl ِ1.F.FW;Op/7~FWl+ِ1~gWUm+ѕlFWhFWl+ِ1FWF7i݀kݜsȆmF7lِ1x/ 6aȆmt6mt6 aA6aȬ珼nnbtu;6cɆ鮶N6d װ6cɆ;]m;уl_iy&FoFF!cp=j=dCpCmуl|衶ۈ /O9Ĉu#֍l#l|NsJFA6d >D9%Bm#ۈ 2S"l'WYo&FOMnOMnOFO!cp=j=dC6zB=6zb=Ɇnb =6zbdc53HLF$I6d e$|mD ߈Tۈ6"ɆF$m"R%E{}^j^dC{_W/^F/!cu16V{m"27zA6zaΎ51z~77zm6z U@6zm6z 6zcɆm6zm6ڎVM>@Gmчl|Sm6 mQm!2S@}6`Qd`_זfbD)QyJFE6d n# ڈRۈ6Ȇ{(؋FmDaQdC6((l/h>5Bӆ7 W}6b}Ɇ{ѾK6d n/Wm/їl|ϼ/Wm/яl\|;8|k/X~j~dCk~p OmяlF?hF?lِ1~F?~FҷIŹRR6cɆFX7m6 [~[_m?џl|NmWm O:e\ Pm 211@6d 1o Pm 2_ 6m 6^t֪1Pa/:Pmc 1l"Sm 6 )2Pmc 1l@hc@lc0ų& Q71Hmc1lAAjAdC6A6aȆm 6m p|3{_qLͿI ;j"]?$ `vVo.] `=iWOng =cQ! /c>bt0D`Cȁ=!jCp=B"d m Qb8ego'ȳagq mfZƆ[FXFZ,c,cі18xD$dT4t L,lw9s_R.uĊPPPukPq2jPukPq2yYo 5n(8׸ U׸x&g_$ѢpF4M6d n#ڈVۈ6ɆpmD ۈ66adcq}ūL41 àajðadCp1гajðadCuc6aȆJàajðQ21bh#Fm#ۈ!2_GutF C6d 79Fm#ۈ!2?K,ڈQۈ6bƦ~7Ĉ6bXXl#l|NsJF,K6d ^7ba݈Uۈ6bɆu6b6bd«61 ájñdC0{~3֤|Fbhm 6 ׍n Wm '2ájñdcZ51F}p~lcِ1x!c1֍j#dChclc$hyf&HQ7Fº1Rmc$1l j#dC딑p2Rmc$1lHhcHl#l8>⺱Ĉqp#Nm#ۈ#2FFG6d ^7`݈Sۈ6Ȇ66ⰍQd#|˲%Q(Q(!c~c7Fm6F mRm"2_Î6Fm6)=8#^)pNWۈ6ɆYƫmcdC6⡍xxl#lnCjhm{WE hh!c3@F3@Fm6F ;~;Zmc41l| ;1C6;~w1FSu1!c1jc1dC6@c6`cȆװc1jcd#fy6cE XX!c33Ǫm6ƒ )c2Vmc,1l mUm$T 󳉑 o$m$` dCu#֍l#lFm$ alc٘8P`1N)2Nmc1lqqj㰍qdC6A6aȆ8hc8lcK*61&1֍jdCp1P1Ymc21l|Og [bhmL6& ۘ mLVۘmL!{/xĘ"1ۘB6d nc 1Emc 1lFMg ,lc ِ1))TM]1USa/:Umc*1lThcTlc*ِ1TT!c)SjS6yMsޗ{M`F"l "E{:/LS;fw`.t~[77Oŵw⎿R9/4=tɏhzЛ.zǜq=Nw_p1P9]`:Ɂau1"rOpTbhEL`:1ӡjӱdnxW.3=+f`j3dC̀Pۘm 2?p

1Gmc1lhclcِ1^x3Fl~Y 9!cٝ16FeVMwCkc1ll3c56 [8Wmc.1l|Ok.˘1ۘK6d }3Fq::ZsdCuc.s6m8·90ۉ0vyE,c-cK,cK-c,c-c+,c+-c,c-ck,ck-c,c?Z~mmmllbjfna9{q ȗ5鍾~ ˗7W׸qjT5=qS1/g15{\㾧'c8gv@}=摍i&|7_mc>1l7{jdZ> {1cٸ5o5m,6 Xm,PXm, 2?aaLUUUjUdCs*8RXm"2 X XE6d c#3Æy]Xm&8ޱ51V^t5EWm6V 6VcɆpNYXM6d c#3Fq16Vm8>Z:¬fۺ55jk"]ο[k5vx*o_]kw\<%xwsBcwyq=_ZkwH6nf}QԍnlT؈ml$2E7^tFlc#ِ1x66bɆnW7ml66.}/*U$&X76ml66 ׍MnlR؄ml"26ml66 mlR؄mL6x6:[g|g|gɆϰn33ِ1x֍6~6~&2?g gdc{ŀ LbN jdC߫m߫mV،ml&2_ljdCgn66ml6 $21[-j[-dCs8lQ؂ml!2[`آB6d ~hclc+HH4Gc7~cVlc+ِ1VUmc+lVhcVlc+ِ1x mlU؊ml#Yý^$471ssml6 U@6ml6 `/Mmcl6hc6lc;٘{xӭLNN6 вݮN6d olvv!cpۡj۱dCخA6K"CԍnP؁m 2ءA6d ދ!cءn?a{>N9,c-cX~f;l;b;j;f;n;a;i;e;m;c;k;g;o`hdlbj9f'ոՓDž?N;Śj'\ST׸'cwVwwVwkN\vR1NuۉkNq2ߋ kNuۉ]d;;6vaȆ_{}]j]dCk]pMKmcl.hc.lc7٠SBMݢnucnlc7ِ1n[mc7lo jdC{1j_ȆǎA+w41~Eml!c|A4,//dC}/oEml!c8yib mmJ6vpºƯƯdCuWX7~UlƯƯjb ~6~UC6ڌ|fOWc{`أC6d ;{Q؃m!27~clcِ1^hclc/ޔu#Lnuc^lc/ِ1^^!cp{j{dCuc/Wmc/lNr/cُݺ}d#ٮ%_S؇m#2Y8c8l>٧G6d ncOmcl>hc>lc?xIQ&~~~~!c֍jdCp_mc?l|دnլiރ7oP8`a.Ň9;`z OcP;8`w`.ߋUR8/*?`)L8'훪PAAA?A2_돃jq=8Hd ^zpP- IAhAls1,Qh<;m6 U@6m6 M!C!!c>qHm!^76 MS lF3Æg16~6~#2oodC{Amm&;71m6 ׍ðnV8m&2q8q8L6d n0qXm0qlN4ط8-m6 8mQ8m!2q8q8B6d u8q8J6Vv`bQ؋U8m%2U8m%2߷8 W'G6bGɆ{ѣQ1Qp'D81c1!c}cp1lِ1:\S8m#2SA6a3Jdbb6C6cɆpN9q8N6d n8q\m8ql|r8q8A6*Yt㄰q8q8A6d ^7NqBmql8j'dCuqBmql}ƢY&I~T8m$27N~Il$ِ1II!c~$qRm$ql3LSb { aOm6N U@ȜR8m"2EO^)lِ1r 8q 8M6mO;&i1sii!cpjdC6NC6NcɆm6Nm6ΐCL3nul ِ1;g;g6`gȆ3pN9q8C6d n qFm ql<~Ů%&YQ7ºqVm,qlnuYl,ِ1YY!c^,qVm,qls 㜨`8q8G6d 99s9!c9SΩm6Α 砍sj簍 4ޫMnuylyCCpr^mBjE{~wwœwxrdۺ=]}eK,tл!7p=Aw_s 8WP; r cu q׃$Bs h l&ٸ2ipߓ&M7{T۸m$2+nqSm&ql|tnm6n ۸ mT۸m"^ wĸ%-X7nm6n ÕE6lDom6n ׍[nR۸m"2q ڸq ۸M6֮qq[< V۸m&2aݸq۸M6d SOV۸m&2qڸq۸C6u+sĸ#X7m6 ۸mQ۸m!2w`ݸq۸C6d mQ۸m%xqWwaqWm.ql {ѻjwdC6Bw6bwɆm܅6m67L{=h=lِ1{{6aȆm܃6m6 ۸mS۸m'm\q_)r_m>qln܇u}l>ِ1:>\W۸m'27C6cFYx71jdCoUxm<%2xxF6ͫ3̟m<6 )Lml3h3lِ1 x xN6]>ρ~sl9ِ1ss!cpϡjϱdCu9\m9l\rbbp)cdv  !cp lِ1Y  !cxxI6prx%|Kl%ِ1LwHbxm$2%|Kl%ِ1xx mTxmA6R4]*(KwG?ƶ$?66 2dC66Pl??66^ޓJkbWpJml| S^m6^ a_5+W+!cW+Wkx<;i#ko Vxm&25kl5ِ1x/6^cɆk148Fo`Fm l}{7jo7dC؋Qxm!2xxK6Y&[瞹Y<%ߪm6ޒ ppp,;x,[l-ِ1xx [[!cu[h[l٘?wDN7~;lِ1776aȆ{w}xG6d nNm݆曤':IzwC߫E0wwu^'Յ΋^}ᄍxJvo{^}z'w=Jo)z'}w ;T;׃?Ɂ??"O!cǟƟjbFF?A<{Pm| 2@6d nAml|m|Pm|$V'3Qԍn|Tm|$2_|돏jdC6>B6>bɆm|6>m|6>9Y$l|6>m|6> i9c D6d 6צ6>aȆצOj6羬I/lY{>GbXXR˘e2222e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e222228Kt;.)qPSqS?1 }%rK|>ڷSǀ5.[_"7T1l4s`py#9Fbl#1ِ1xߜ ͉6cɆm$6m$6 ȼ@6m$6,hb$6@I6`IȆm$6m$6 %qCoI6`IȆFh#Fl#)w“&FR7L'zTm#)l|NI 甤jIdCu#)I6bIɆm$6m$6\} *U31\D  lÅlnᢶm p6\6\ !c}:hEmp%a t71\EpuUmp%2nmbdC6\ W WlÕl| mmbCRH&dH HF6d n#Lm#lF2h#F2l#ِ1 H HN6b8MFrh#Frl#9ِ1FrFr!cU1 6cɆFrh#Frl#H=i鰦 Lnnp F !c~#7Rm6R ׍nPHm 2HlЯ621Bm l !cﵿpCkِ1/г/66 2~l|lmWR))ᜒRm#%lnu#FJl#%ِ1xH FJFJ!c~#%Rm#%l,ڶ+[&F*a#Jm#lHTjTdC6RA6RaȆHmRHm&21R;װljajdCAvCVHm&2M ESm6R j4dcCc?11҈4p#Fl# ِ1)i6`iȆ4HHC6d >6Ҩm6Ғ :QH+FZX7Ҫm6Ғ v-mt.Ybhm6Ғ H mUHm%2ijitdc_ïG 21҉5l:MHG6d W)6aȆtHHG6d ^7A6aɆBMnw{һIHO6d kWHm'2HHO6d ^7C6cٌk`bdu#62`Ȇ72 j dC62@62`ȆFh#Fl##'kQaQm##ld#_3t=VZdC62B62bɆmd62md62 zľh&/Im#l|#Ȥ D6d n#Im#l}&h#F& G^F# EdVla.jp\OZjœo2껟~Sm]fx3yf\=}GzYD=~ςA2Y`=Ȣv׃,@ Y"zD|mdQȂmd%.{ƕ21s沺s沪md6  mdUȊmd%2ȪJ6d >Wd6md6aobdI$6aȆ;ljٰldC6A6aȆצ٠ljٰdc!;^xv]m#;lFvh#Fvl#;ِ1FvFv!c9%;]m#;l,sPh#9`ȡA6d ߙwPȁm 2ȡA6d n#Cm#F6zŚnnᦶm p66ܰ 7!cpnІچF6d >AnjnFNQմ˓F9E FNFN!c^4'Esm6r  mTȉm$2EsB96rbOmBKԍ\nRȅm"27r~#F.l#ِ1\j.\F.!c9%Km#lTlj#ȭM6d ^7rú[m#7lFnh#Fnl#7ِ1ȭC6sG)yGm#lFh#Fl#ِ1uˇd#g6cɆp˯O6d {~8F~l#?ِ1xoȯ(@6n*|3fQ@{V{V@mQl"Q@mQlFhFlِ1xoT(Q(H6gypQP)RPm Ql|N)甂jdCkpMUPm Ql|N)mT(m"J($5)5)Q(D6d nQHmQl[B[BjBdC6 A6 a:(Siaa;Fal0ِ1Й6 cɆFaX7 m6 ( mV(m!)j9wQDԍ"nQ(m!27~Flِ1xQE6`EȆ"F"FQ17n21:)㔢d.E6bEɆݺjEdC6BE6bEɆ)EjEbd#K_31Q ֍bjŰbdC6aȆ..Q (F6d nQLmQlsa(.++Q(N6d SOW(m'2a(Q(N6d gጁlW(m ߷yQBԍnP(m 2%`(Q(A6d /ZP(m 2Q(Q(I6֕ V( 7Jm6J /R]Zg16Jb%Ɇm6Jm6J 匑we F)Qޱ51JQ ֍RjRdC䖂R(m"27J~F)lِ12p+QnחۺDjo뾄"T.\ߋۺ/Aά^k|iw`.Ws~[% _o.]|甯66"23WF1hՆ!M nTuFlِ1~gYAmQlnTuFlِ1RڨQۨH6eQQبmTTۨmT$2Ӫ*mT6* ׍nTTۨmT$2QڨQۨD6zGLsĨ$lT6*mT6* ۨmTRۨmT"2`ݨQ ۨD6d c3F]s|Ck5v7Lss66&2Ssj_c_ Zmklk!cM165:l\ۨL6V+ujms klT&&Fel2ِ1WeUYm2Ql|N jdC*gh6*cߐߏZsSs7j`ߐ So66!277dC{_o665I)Ĩ"٩٩QۨB6d n QEm QlFhFl ِ1x/ZU6`UFu;ujbTu*U6bUɆ甪pNQۨJ6d n*QUm*Ql|*QUm*Ql:8ކ&F5(KwGjdc[Y]MmQln^ٰ]MmQlۂjۂjjհjdCuQMmQl4()W&FuQ7úQ]m:QlnTuFul:ِ1xݨFuFu!cpաjձduޙ56˹5ȆYJ~F lِ1 g O F !cp5j5dCsJ hF lÝl:N`b9چ;N6d n;|]mp'2mmcdCupWp_·ajZemckg2V2ak`55yY[Ƽ-cM,cM-c,c-c-,c--c,c-c>61_X[˘e2` Sj>6Ot8_M8T׸դ'c= g G 鲸|pbhk\M\jR1>]MOWS]jWj翚T׸xE6·Ĩ%kZjZdC{1^L-ZF-!cjm6j mlRۨm&/Ĩ-zڰ7QۨM6d ^7júQ[m6QlFmhFml6ِ1xݨ mVۨm!b4!QGبmQۨm!2u`ݨQۨC6d >ԁsJ:F!cpu:judűĨ+lԅ6m6 ׍nUۨm%2ߧ m6 ۨ mUۨm#c46m46I*Th$l46m46 hm4Rhm4"2`hhD6d ^7A6a^dhǁ& ~w饶mx wzN/ /lËlnx᥶mx  /hKm hL6|umiX6kjdCFco4Vhm4&2_6kjdC6C6cdڗCTM oq7<[m&2S⭶mx  oX76 o!cpІچ7фlMx4нDԍ&n4Qhm4!2jm46 7{M6`MȆ=km4Qhm4%^ҙ54%_w%7m46 )MTm)єl|Ni 甦jMdC6BM6bF?%W51fp龎F3lِ1 )6aȆF3X7m46 SA6aF3͝s9Щ9(iC%CjͱdCp\m9ќlhjͱdCppeb 6c-F|ǾMhj-dC6Z@-6Z`-ȆϵmϵmhA6d ^7Z@-6Z`-T=sbl$+;86Zm6Z h mThm$2SZ9FKl%ِ1FKF+1vw=LVb_m hE6d nJmъl|NiVjVdCkVF+VFkQҡZa/Zm5њlm {jdCpZm5њlh mVhm+σM Q7|`Q6|Ȇm@>j>؆ِ1xuGm!2S|  l ٨@h#l6ڨm6ڐ )mFm цlFhFl ِ1FhFl×l/L _19Wm%2nmbdC6| _ _l×lnBjF[QӗmLnuF[l-ِ1xh F[F[!c5l[mhK6d ދ6ڪm6᪍O31 ?hOm#2~nma~dCu ? ?lÏlnA~j~؆?h5w_/8mcdC 4$ EEE{~objvٿyU7Ip3P}w\<%${{8e}_Nz/A9-c!PX;X{XXGXee,2222222aiEYZY[XZY[ƆX} /Wv2%4HkAXׂ ~Qy-Ꙍ 8+[ׂ5.H]pL6̟e#X66`!cavpF0L6d /zjF0ِ1x mmc!d#ф01Bh#Dm#!2,{m ׍X7B6B!cp!FFJ6^^<ib FF(J6d S716l9mbdCBPPl#l|>U6ڑ>NhmShm#2kکm6ڑ )Nmюln6کm6ړ[Oh/fýjdC06B16Ϲpbhm6ړ [~[^m=ўlmmWhmt  蠶@6d /a#9]|CkсljdCuAmёl,ִwCMbN甎jdCu#6:bɆ甎pN騶H6d n#Qm#F6^Uf&FajaFِ1:% S6°0!c^4 ajaFِ1gaFFщlln:Iɑ&F'Q7:ImщlƆ3ÆNjNdCsJ'8tRmt"2NjpQge+&FnmcdC0s3F"6Ɇp8mcdCkph#\m#L6߷yXMn7 ;mt6: :c8l HsJOFO!c֍j=dC딞FOF$H,61"Hh#Rm#ۈ$2nDmDbdCOE"6"H!c^4ڈTۈ6zi%l6zm6z mRm"2`襶 E6d nKmћlU&FooFoFo!c=pϼFol7ِ1x6zcɆFoFU8;<;Flِ1xF>F!cw{w{m6 ׍>F>F(hTM(1D9%Jm# ۈ"2mDmDaQdC{_Qp+Jm# ۈ"2_FAQjQvovo™ZD_sq/Wőj}œ󿿭 ~_k)SL8}/[ ~b짾p=Gw_}D?GS;A?r c1E1x觶O6r_xu_\_m?џl|?쯶O6d c=fF!cpjdYmb p1@6d 5i Pm 2#dlcِ1x91H6.xu1Pm Tm $2?c Nmc1lnuc8lcِ1x8q8!cqpc8lc<zE16cɆװvxlQvU^q ww-RhP !@@ @ $!šH鞵)39?9/e֬u"!cpEjEdCs"8,RXdxky.^ٺpkZbsD߳uj?yu_>g<ŷOi|n1s(s׃%tΗVT߹%곿׃%te ^@Kz,"E,` 1L=hᰑW9Xm,%] 11 KjKdC=Rc.UXm,%2XXJ6d 13F*eCkc)ll$q &2acLmcln,uc2lcِ1e2e2!cQ#22lc9('M\{j˱dCtZ\mc9l|mMm,6 ԍMCkc9l?5:`]6c+`XXA6d ^7VBmclnuc lcِ1LݨH' lc%٨Z4&Jo[TXm$2av{JJ!cp+j+dC06j8c|[ĉXE6N,,9XcSV9e*lcِ1x/ 6VaȆUpNY XE6d ncJmclrALbNY jdCuc56VcɆjX7Vm6V X mVXmmp6ܠ 7 7lÍlpچF6d ^7`pSp6ȆmAnjnѕ-eb6@k6`kȆa.UOqZ(N 5!c֍5jk5dC07RƉp'sl}G]p66ܱ w!c놻چ;N6d ~_;/]mp'2mmckkE/k6bkɆaD6+'Zlc-ِ1ZZ!cpkjk A//cbx5\zmx`dCu  lÃl|NsچA6d ox~CmXG64NԍunSXm#2_îkuj밍udC6A6aȆm6֩mмFFO{<[6X6Z6Y6[ƶXƶZƶYƶ[vXvZvYƼ,c-c{,cޖ1^>~A˘ee2v2o;b;j ZI5.ٮ{W6vYl{166cɆpN٬L6d ^76úYmc3l|7ml6ʎ;l[dCޢB6d nc Emc l|w ݢB6d ^7Emc l」{&VN )[6b[Ɇml6ml6  mlU؊ml%2Qa.vH'Vlch|*i5mLm{mj۰mdCyMmcl6hc6lcِ16aFt=&vQ7ú]mc;l{j۱dCvolW؎ml'2_nkj6y0Ր"vE찋0Oٺpءv<);gvC}wϾ9x vgvzC}wzv3vz곿׃te ^vzS`';Ɂw½j;q=I"d c=N.1{D 6vaȆm6vm6v [6vaȆצt.lËlwe>&^nxmxa^dC6 / /lËl=چE6d cz9Km M6&ЯcحM6d nc7[mc7lnhcnlc7ِ1x ndb{~=!c}=ܣC6d ncGmcl=j{ o11E o olÛlY&孶mx M[m&2 mxmxc>d#s01|DuGm!2{Z>j>؆ِ1xuGm!2߷>j>^nWl&^o^^!c_c8l.y0 n ^!c5^ݫK6d o^>Q0ˁ-}>}>!c;8c8lDoo?N }>!c9eSm6 mS؇m'޿_d_mW؏m'2~jdC~~!cpjdL11^Em6 Su!c~7m6 ÅMmȆmj;q8H6+~h4㠰q8q8H6d ,A,AA!c9 Sm6 ׍nT8mk866| _ _l×lnº᫶m  _X7|6| _!c}Q_/꫶m"Q'H>8$ְ!lِ1 6aȆalTspyy\;ljq8D6d ^7qHmG6:||O ?X76 ?!c놟چG6d kX? ?lÏl|}maƝU+:0\V8m&2q8q8L6d >saa!cpalßl ,z嵥&Ƃ6 lßlZ?毶m  X76 !c놿چ?qlۭVGD8#!cpG#jG#dCoQ8m!2q8q8J6&n>8EdöY}Tm(ql|N9 産jGdCsQ8U8m%2q8q ~WlZ#9@6l/P6Ȇm@jFِ1xu#@m# 2mm`dcc7.~El"ِ132326.bɆEX7.m\6. )rQm"qlS\LKyKyKjKdCu6.aȆm\6.m\6. _{6.adp&+bWF,K6d g c6bX!c9%)jF,ِ1Xh#Vm#۸L6k㲘S.9el2ِ1ee!cueNq۸L6d n2qYm2qlul:ِ1uX7m\6nՅ,Nnb} GP۸m 27`ݸq۸A6d G܀}  !c ߀qnoޗ^aiy?-m]=؟G,c-cO,cO-c,c-c[^X^Z^Y}}}}}&ո F wMe:5&q75&q7E LMukMq2q7aq7qI5NkptS]nO11nnm6n wKmql-h-lِ1xot F6naF6% oOobv&V۸m&2w^ﻭq۸M6d n6q[m6qlj;dy&؛fm6 ۸mQ۸m!2_o߁;jw;dCs8Q۸m%/d31:m]a[U۸m%2ߛ fm6 g.|]]!c𽘻p/]l8;A&=o܃={=!cgdgdm6 )rOmql|N{j?F;ׄ61O??ɆƟn''ِ1'STln Ɵjbugbkp {_m>ql}h}l>ِ1}{_m>qln܇u}l賣{?uz)!c5}x@6d n@mln`Ȇalqqbhm|6>Tw~Q\_W6>bɆH6d ^7>ºQm#ljOdcytyG0kOjOdCs'8|Rm|"2&|&'lِ1uOp'l3Q_CMϢ jdCu36>cɆ{ϰL6d n3Ym3llYsN1(^]F~l ِ1Em lhl ِ1//vIJ#xgG<}G|XXBX"XbXXRX2XrX ˘e,e,e;XjXXZX:XzXXFX&XfXXVX6˘e,e,e,e,/uzϕsEtsʿN&7z9u X&sE5Nָx)'㹢NɆoO^ߕ⻢5U|F|!cpjdC6C6cɆmć6m6'80} \Qߜ@m#lFh#Fl#ِ1FF!c(+m$6 Zd#HHH6d 7'tE}sBFB!cp j dC{ ]nBF"|!香DF"DF"!c$fS["am$6 &rE{6aȆF"X7m$6uib$6C6cɆpNIHL6d n#1Xm#1l^Į^j$dG?x11uJNIHB6d"=Fl# ِ1~WDm# lM{$jIdIFRFR!c~#)7m$6 ׍n$UHm$%27~#FRl#٠7 ,215l2M HF6d otv@߈H HF6d ^7Lm#lF2h#F2l#9x?##]}H]}H6cɆHHN6d ^7ú\m#9lM{jɱdcU+LM{j)dC06:c8lܾ_816R`)Ȇװ)6F l#ِ1F ؆ pT7E.pQp6\Ȇ om`.dC6\  lÅl܆ ᢶm$KOmpRH mTHm$2SR9%FJl#%ِ1x)6Rb)Ɇm6Rm6R zdsJFFF!c֍jdC62B62by 0129̅Ldva3F&l#ِ16\fRȄmd"2`Ȥ D6d >dsJ&LFf1ӭMb33̬L6d"/Ffl#3ِ1FfFf!cp#Ffl# xm)#S9%Fl# ِ1x/Y6`YȆmd6md6 mdQȂmd%S|kLjbdYFVFV!c$1н~Y6bYɆmd6md6  mdUȊmd#]= 31 ֍ljٰldCu#6aȆmd6md6 `Mm#J6OPiX*+j؆+ِ1~^?W WlÕl܆+᪶m }QW Wl#;z}fH#aȮN6d װ6cɆװ6Fvl#;ِ1xFvFMnu#Fl#ِ1La{DF!c֍j9dC6r@96r`9ɆyS mTȉm$29aȩI6d n#'Sm#'lFNh#FNl#ؗ~+#7rm6r ]16 ʼn E6d n#Km#l| SrmF}?Ln{ٺ~P.<ѷup>[~;d΃(R9`?)9ι?s>i />q=(Hg_돂pQP Ɂa:#iЊ(AA!c + m6 35h(#̆A!a0(Q(D6d nQHmQlF!hF!lِ1BF!BFa|+EQ6 cɆ°(Q(L6d c3Fa&N Fa!c>0# m6̾'L18m "dʺQDmQlFhFlِ1"F"F!cpE"jEd3[kEڴ(\U(m%2S9FQl(ِ13ƿʿJ816bEɆIm6\OS(m#2Q (Q (F6d xT716\'F1lِ1xQ 6a? [Mib\#ٰm&##ِ16~6~$2Sz8c|*'ƏƏdC0u#3Ʒo]](N6*֭˻&Fqg07'{m6 (mW(m'2mA~Ck8QlnuFql޶i&F N))%6J`%Ȇ{-Q(A6d Q3iL/'F lِ1F FI(e"2%s%FGo"j%dCu$%6Jb%Ɇaqbhm6J _C+ T(m"QC% jbu6JaȆm6Jm6J (mR(m"2Q (Q (M6:]8r'C~fN)M6a6JcɆm6Jm6J WWZm4Ql|4(Q(C6)QF\O)Q(m!2Q(Q(C6d n QFm Ql(2jedc ߛezJYFY!c^,E˪m6ʒ WWVm,Ql|N) 甲jerdէ 32326aȆ..Q(G6d ~p9xp9rF9!c9Sʩm6ʓ =J)Q(/z-Q(O6d >sJyFy!c9TsJ%JF%!cuJsgoqbhmT6* g[O6.obTsJe8TVۨmT&2WaexoheFe!cpjdC0u39ڟ'Fel (*%L*FhFl ِ1}UQۨmT!2_Vk*jU*dC06j;c8ln1QۨJ6v9rUS9FUl*ِ1xQU6bUɆmT6mT6 )516̣QڨmT#;p5MjF5hF5lِ1xݨF5jF5!cpՠjjհjdCu6aF11p﫺Ful:ِ1xݨFuFu!c~:7mT6 بǭ7iڨnF}?L {kbu66jcɆFmX7jm6j ۨ mVۨm&2aݨQۨC6w)L:b]vu6`uȆFX7m6 )uRGmQl_թC6lQۨm%//iobu.u6buɆmԅ6m6 ۨ mUۨm%2Sz8c|OXZuzdc\u21~7m6 )ROmQlF%gM'F=lِ1FhR)'F=l>HգQ_)R_m>QlnԇuF}l>ِ1xQ6cɆŠy}a+6c h pNih@6d n@mрl|oܛmh@6d VE [mhH6pDh(攆pNihH6d n!Pm!ѐln4uFCl!ِ1:믑5Thm4"!ob4sJ#84Rhm4"2hhD6d o4F#FF#!c_#%56aF>zXԍưn4Vhm4&2E^Fcl1ِ1FcFc!cpj&dcWjb4u M6`MȆ=k=khB6d >4sJ&F!c_#%56`?*ԭOOdCu'X7~R lOOj?a? EIm'l)8rELFShFSl)ِ1xM6bMɆ½jMdC0hg (Nj#ljhF696h&fh hF6d nLmьln4uF3lِ1\įfjͰd#nU ʼnhC6d n Fm цl|Ni6jmd#Xhbu-m6bmɆhhK6d n-Vm-іl.@6ڪm6ڑ9Qm|LvhvjvdCH̖Ȇm)Nmюl| a۩m6ڑ )Nmўl-Wh&F{-[ 6cɆF{X7ګm6ړ hmWhm'2hnpLLR:5L0$uբZDsD_ItP;`w`{&<g웃r\A};zБyOGt7::Lёξ+g#|?:t#91{Gt$2_vkӎjNdcG-41:Np/F'lِ1wC;;mt6: `ImщlF'NFgQ:!MӼ83ٰ8Fgl3ِ1x6:cɆmt6:mt6: EFgFCj[L.ntuFl ِ1=;]=;]6`]Ȇ;.j].dC6@]6`]F*FWX7mt6 ]aUm+ѕl|v]6b]Ɇmt6mt6OOebtu6aȆmt6mt6 ׍nntSmt#2 覶nozM/0wqteeeeeeeeleg@ `P0p/Qі1_-c,c-c,c-c,c9:uhxN7 ovW׸u'c;웻k\w\S1x5;qݩ=Ƶ'D31zzm6z =Cmуl|j=dC0_g ?ym$}nI6{EI6&puFOl'ِ1x FOFO!c֍j=dC=}OF/tB]336zaȆz}^j^dC6zA6zaȆ^o M6FtO[\ Vm&2g7gFol7ِ1)6zcɆFoX7zm6ϵ?+#l6m6 )}GmчlFhFlِ1\įF>F_1kk3BL {Ѿj}dCu/}6b}Ɇm6m6  mUm#_CM~F?hF?lِ1xF?~F?!c=~pF?lِ1)6aƪ!11 jdCߟ?_m?џl{jdCWm {&ac1@mc1l|c1@6d ^71@mc1l|Nji5Y3gɆ3j?c? ߇3gɆ生@Qru,ˣMn uc@lc ِ1x16bɆ{с1H6d k1Pmc 1l}%cnȆmi lcِ16aȆApN1D6d nc1Hmc1l~/"Uca1L6d ^7ú1Xmc01ln uc`lc0ِ1\įl Vm !gp"̇=!jC!dC؋Qm !2C`1B6d nc1Dmc1l[&PыPP!cpCjCdCkءp ;Tmc(1lPhcPlcٸ:Uc3̇m 6 : :Lmc1ln uc0lcِ1w#Sm 'vU큉1\)2\mc81ljñdC6C6cɆ"~ T7m p[ 6Q_g<wp>[ E}`2~{js8WP/cz0փj#p=Ad ^Fz0B-b#H"~ TFm6FYF\J)l6Fm6F  mTm$2 ;Gm6F _' H(1cBľc\Rm"21 1 E6d ^7F1Jmc1l|/| 1 M6R,1Zihh!ch1M6d 6 צ6FcɆpN1C6VvT(N ߰Ȇmmِ1ߠ6~6_."1USaG6%LYbNYjYdC6fA6faȆpg=YjYdC~fk?6faƦ߹61f1֍jdCp2[mc61llhcllc6ِ1xݘ la cs`ݘ1ۘC6d nc1Gmc1lhclcِ199\A]O%cE^t\lc.ِ1\\!c~c.7m6 EhN1nٺ)ٺa]-wsDw~j'ejg~o6`9n?)~wxWq=G2S|kzD=<ٟ<:21Az0Ts@"E`1\įyjdiΟk||!cgdgdm6 a1_mc>1l _ '|lcٸTYM\gj dC}G,PXm, 2N^'YX@6d k9elc!趪IyLBhcBlc!ِ1) 6b ɆBX7m,6 w. 6bH)Hmcl"hc"lcِ15E"E"!c_6aưnIó01w. \XL6d >,sbb!cb6]XL6d qR7m,6zX"%pNYXB6d"zFflc ِ1%%!c֍%jKdfnmgb,sR8,UXm,%2KaXXJ6d o,RR!cpKjKed#\v41@@m,6 |ө3Fm,'2lcِ1x 6aȆalspظ9lj XN6?q|[X.l,6m,6 a/\mc9l|NYj˱dCkp \mc9ldkquBcSV9e lcِ1Wg Bqbhm6V )+Bmcl|kZXI66/ocb6VB+6Vb+ɆJX7Vm6V X mTXm$25PRmc%lɲ<:ycXUjUdC֭֭RXm"2SV9e*lcِ1U*Ujo M➝jdCuc56VcɆjX7Vm6V o6VcndfW11D/{Q7 7lÍlFgg ۣQnjn؆ِ1xpuMm p#23w{njnxpcS9elc ِ1xX5!cpk5jk5dC5pFmc N6L wg/jd#I&ID﮶m }ý/w wlÝl܆;᮶m pWp6֒kb딵pVmc-lZhcZlc-ِ1ZVmc-l.@ucZlÃlt|&x|瘇چA6d nP6<Ȇ{Q؋zmx`dCཨE=6}1_!˘ee2v2v2` ƓjS_'Og3'ոߔEk'8FF!c%6%6ml66 l{166bɆml66mlp<<[qٺM&Mvg6b&sٺMM곿~S}n<|g)*%fQ6zY}7zξa=p`kbf\6aY-b3Ifhcflc p|rcآB6d >Wls-!cb +ml6 o[6`'J61YcVlc+ِ1x[6b[Ɇml6ml6 ?V6|wc ئ F6d ncMmcl6hc6lcِ1\IAަ N6*?5:`][l6cɆMN6lSml6 Mõvv!c9e;Sml6vc}C;`Cmcl|s\P؁m 2;`ءA6d k ;6v`;Fӊ7bbsN8T؉m$2Fb}g}Nlc'ِ1:e'\T؉m$2ةE6.\tK)Kmclnuc.lcِ1x.].!c5.ݥ "jU{py%/8xmxa^dCḦz Q/ /lËl܆᥶mx 66d5!Mnhcnlc7ِ1x nn!c9e7Svm6v  mV؍m!#=pN٣C6d LL=!c֍=j{=dCoQ؃mxWN}6 o olÛlnxú᭶mx  oX76 o!c_V6|Ĉ}31|s C6lQ6|Ȇ㣶m o  lÇl܆᣶m%ˤ-W娉W{aWmc/l|_t/ݫK6d >^^!c_{6bCM 219mgd SEDOmclٺ}ٺ}j}dC6A6aȆ>X7m6Lž>nbuc?6cɆدO6d >s~~!csAVgLnuAl ِ1xq6bɆ):Al ِ1\įlT8m=N8gb:mK6fK[hj؆/ِ1xuWm%2/|چ/K6d ~/Wm8D6ϩ^qHԍCnR8m"2`8q8D6d u}R8m"25P8q#A=61 ?hOm#2mma~dCཨE6 ?!c_S6?fq8,E}jdC6C6cɆm6m6 a5a؆?0;p&mmcdC?76 !c9)j؆?ِ1x  l72u㈰q8q8B6d ^7qDmql|rSm6 ׍#nQ8bx8y&)^ƃy&(qT-]9xoQvI8I: +Q?j?)U9 z =fz@g_sE+p= 2+\H"~ d#@m#$/js6@@l#lF m 66@!c_Tp[nǻ8,XNXNZB-c,c-cg,caspyXe,2e`X.Z.Yb-c-cW,cW-cXƮYƮ[nXD5n7D 5.H]p 'c~8AAk\8::H]p 'ck\/l$RF0m 66`!c/jF0ِ1`h#Xm#8F6~HqLU1c1!cpǠcjǰcdC6A6aȆm6m6 ub21 ǡjDZdC}q7W8m'2S9ql8ِ1\įlW8m ҎS!bN sJFB6d n#Q6BȆB[FB6d lȷˢILnu lِ1r)'6N`'ȆpN9q8A6d ^7NqBmqlxwib'b~^m&FXF5lF4M6d ~-^kVۈ6Ɇ)pmD ۈ66|LM-W-l#lF mĐ ׍X7b6b!cp1FF݆!fRg<;g.s~Q}/zpR+g]kKpmzI}/zpξ\I.\91xy ".zpD%x %l#ly䯠&Fӆ+bF˜ \mĒ ۈ6b6bX!cpFF,K6d ݞXݞXXl28ۥUMbq?.m\6. ?.ee!c2I.m\6. EhNq۸B6oԴqE |+!c -m\6 ׍+n\Q۸m\!2S9l*H#B & {HU@@z[!@hBxVg>^y7k{uq#UMbmzMm\6 ׍n\W۸m\'2qڸq۸N6d yw^W۸mSab֦n 6°0!cpaFFF6d n# S6ȆmAaja CӓqCԍnP۸m 2Sn9 lِ1xq76n`7Ȇ߸q۸I64̒O}8&q>D3;-xܶݱݵEXY"-c-c,c-cQGǖ'ghs Xe,222g{m%XZ-c,c-ÄS鸦)\qƅS1pu 5.j{pk\8qTd pu m0 -MjdCɽ ߓ{[m6ql| jdCm8V۸m!ơulِ1z\oQ۸m!2lِ1xݸ;]71 wjwdC`[wɆm+]l.ِ1r)w6bwɆ]X7m6"TJĈD~"6"!cFFA6d n#ڈPۈ6"ȆK%FmD`F1Mm{={=!cgdgdm6 )rOmqldm6"Ʈϝ51"Ž&^HHl#lnDºmD ׍HX7"6"H!c8ķHHl>٨<1q_aq_m>qlfic6 MMCk>ql}h}l>ِ1}{_m>l(_\>Pxm< 2`xx@6d >]>Txm<$2+_Ɇ|=Txm<$2axxH6d ^7ºPm!E6Ǐg%z(؋FmDaQdCGߌ6(!cFFE6d oD~#Jm# xD6bH`/Hml"}xD6d nHmlnӟSns~sJL~)BU' vO q{W gtj$15N/O >% F߇Oָd>docύl8LL `~[0Mm p#2-Oশm p66ܰ 7!cpnІچlq(pH.l$6m$6 wpڰ\m#9lFrh#Frl#9ِ1n`\m#9lGLoNj)dC}s`7PHm 2ߧKRm6R "Bm#N6~Mpq]pWp6ɆmCj؆;ِ1NtZ$16ܱ w!c놻چ;A6* o)#y}: lÃl|#{mx`dCx <6< !cpІچI6:i?&7j>؆ِ1M}6| !c8ķlm`s7M 6jlA6d pCmÁm8ȆIjlA6d {#Pp`F|-"LTu{Rm6R HmRHm"2`H HE6d 6PJm#K6/:&nmbdC࿓¾Wm%27|a᫶m )pNU6Ȇ՟L `:`:? ?lÏlچG6d o-6 ?!c=-?姶mU}u  lßl܆?᯶m 66 !c8ķꆿچ?@62hs# _; _;@m# 27`m P6Ȇ76dcu?N51R֍jdCu#56RcɆm6Rm6R ! T7Rm6Fz$C6@!cFF H6d k@@l#lmm!?G 5]Fԍ4nQHm!2g4ji4dC6@i6`iȆm6Ҩm6Ғr iHFdvfZFZ!c5lZMHK6d ދhZFZ!c9%-SҪm6ґ a(F:{J:{J:tF:!cggҩm6ґ ׍tnSHm#2`HHO6꧛Q'HF4;+_@HHO6d ދhzFz!cp額j鱍dC6C6cas612~#72md62 ?[>[Am#lFh#Fl#ِ1 F F٠&FAjAFِ1xu#Hm#"2_5lFD6d n#R62ȊLjdC06ڻb8mN6ȨH6d ^72ºQm##lFFh#FFl#412 LjLdCXޱIm#lF&h#F&l#ِ1:%\dRȄmd&qKgbdddVȌmd&2 2md62  mdVȌmd&2Ȭ&c4/h0E6`!cpFF0L6d n#V6ɆS6Aw&f61BĜl#l|+}m`!dChEC6B!cp!FFl.6PhV#x | Fl# ِ1:% \dQȂmd!2Y`ȢB6d 6МEm# l-Wv#S9%FVl#+ِ1)Y6bYɆ̳=jYdCpoՍjY60'|ls}f+c+k+g+o`h9&ոؚ?l7{l ׸lTd ^M]jlp˦qpF5N_68eS׸l|+<[F%<[ EEEw{.ȡjvýyy׳up U_P7޺PxC<Qln|'j` ~Od!{%F F !c9SJm6J ׍nP(m 2%`(Q(I6f?QRSSRm$QlnuFIl$ِ1:$\T(m$2C|FIF)zrKD(F)RF)!c{{J{{Jm6J ׍RnR(m"2SJ9F)lSq=Ojb TmSlS!c)m|m|J6d ^7>uSOdvE( FiFi!c94SJm6J ^^Zm4Qlj+M6ljƋm>_:L Lm3l3!c5gp ggdCsgpNLm3l3!cm|f|8y&|& QF-]pFQ;(cw`>܋LRJ-eW|LRYF}zPyayzeEQeW,e|( U;(AYr cP=W)~[$VDY\ʒ! Tʪm6ʑ{%7('֦ڴF9lِ1\Q6aȆ{r,Q(G6d (6aFڊ免FyFy!cQ֍j屍dC6C6cɆ6cƲUM ⾌ j dC~g F!c ˨Qۨ@6d nQAmQlt\Ĩ(FEX7*mT6* [T6*bɆFEX7*mT6* ۨmTTۨhe21jFQl8{4Pۨm 27j~F lِ1F F !cp5j5dWv&FMQ7jºQSm&QlnspڰFMl&ِ1FMFM!cuJMNQۨE6>:`ݨQ ۨE6d [ Rۨm"2iKf;gNCkQlZZjdc iL~~jdC0h{W d'km6j hqꇈV$QۨM6d ^7júQ[m6Q_Toí&Fװu6`u̝F"_ԁ:ju:#بц_Zu:#ۨmQۨm%Ӷ~`QWuaQWm.Qluu{m6 بqNq$QۨK6d ދօh]F=H5Ğy=g^OmQlnԃuF=lِ1ʮNA=Ibhm6 ! dF=l>X:ycQ_بmWۨm'2_ևkjdC0/Vrp(_O$16cɆ{Qh@6r8cb4h؋6Phm4 2 `hh@6d >4sJF!c~7m46p&FCQ7ºPm!ѐlFChFCl!ِ1FCFC!c8ķ攆j FdĪ_>}H`/HmшlF#hF#lِ1)6aȆHmјlƇb4u16cɆm46m46 a/Xm1јl|Ni j&dZ~_71M&jM&dC6@M6`MȆFX7m46 hm4Qhb|ȫgoٺp&i.|;k $MoMW|/w>]k׃ft͛Ϳ>?^3G4W7]}׃f4S;hA3r c1E41\\6aySnsh.phhN6d ZsZsFs!cggm46 hm4Whm =":dbPhm 2-`hhA6d ^7ZBmтlhj-di*\51Z9%SZm6Z ?>Rm%ђll j-dC6ZB-6Zb}3absJ+8Rhm"2 oVjVdC6ZA6ZaȆ[Vjd}h&FkQ7ZúZm5њlFkhFkl5ِ1̜RiüU'I Fk!c=pOFkl ٘sh#FX7ڨm6ڐ m`Fm цlh6jm6dCpohhK65}mahhK6d ^7ºVm-іl|Ni 甶jmdCpom6bzfԉ21ډ֍vjvdCShm#2`hhG6d ^7Nmўlnל'&F{,c{,c{F{!c֍jdCF{oWhm'2h7ګm6:iv% FX7:mt6: Ãmt mjdCu6:`ȆFX7:mt6:C f51:l0; ۍ6:bɆ{юH6d /vTmt$2a訶ny>0a9d9ǣeeeeeeeeees/-c,c-c,c_YZY[ƆXƆZƆYƆ[FXFZFYF[XZ·D5n׵i̟S'T5qfkqm_Z>_ ׸NTd ~I'xI'uk\'q2_SukN Ɇs#yxo]`޺jdC}sg7wVmt&2_owjdC0QgWT#Z(I Fqre1&F7w}s.F!c\16v/I .F!c 웻mt6 ׍.ntQmt%M}7(FW1tsJWFW!cmt6 ׍ntUmt%2誶F6œ'݄nF7nF7!cv F6d ^7Mmэlnnjݰd219;Smt6 vwFw!cpݡjݱdCu;6c=";LnuFlِ1)=6z`=Ȇp{=j=dCt=>]FO1x^{ ?=a詶I6d N )=6zb=Ɇ詶I6d n'Sm'ыl8ojX%쥶 E6d ~ok/xok/^F/!cp^j^dC6zA6zad] iMbN jdCu76zcɆm6zm6z ߣޣ[m7чlY&FQ7GmчlFhFlِ1x/}6`}Ȇm6m6>' Cg\ԍa\msls!cupdCg}\msls!cpCm|n| llPj_Ewgu_vý>~_o>'ٺ/`A_k*>+}/]}}aW/}Ɂ犾p׃$B/}6b_~R_ƗƗdC_}/66$21K//Ɇ_ºƗF?g51֍~j~dC}D?GSm#2`觶G6d 6~jdR·01 jdC诶O6d ~_Fx_FF!c9?Sm6C9.1@m Pm 2}}lcِ1!cIIm 6"eչ7Wj_a_ )_9+Ȇ`WWdC66R H6j]Ica1H6d Ft ٰ1H6d o @@!c~c 7m 6.+/xV$ X7m 6 Su A !cpAjAdCpo6aF{ԥʙ``!c{{m 6 )2Xmc01ln uc`lckΓQM!.F!d. o1B6d 5} Qm !2C`1B6d nc1Dmc1l$|zPcCa1J6d Ӌspڰ=9Tmc(1ln ucPlc(ِ12)C6b"=8c\)Ṡ [11 F6d 1 o Sm #2`1 F6d l0l0apj kEpp!c5p1N6d ~pxpp!c5p1A6-L.恏d!cp#j#dCs8Pm 2~j#d#M#E HH!cp#j#dC6FB#6Fb#ɆHX7Fm6F5{fH1F SE峌6FaȆQ1 E6d nc1Jmc1lm 6FaɆ@/ZE hh!cpjdC6FC6FcɆI I1C6vNϭM1@MC6Y"1!c9e Sƨm6Ɛ mQm!2C|hclc,٠'ۙc)c)c6bcɆm6ƪm6ƒ a5XX!c^t,EǪm?aYo`hd2626262elelele[L,l\<|B"bRwe-c?XƖ[·G5hO98S׸qƍ'chƩk8\Q175nq|q7FíOjb6C6cɆm6ƫm6Ɠ mWm'2oxlcٸ&Wl' =Y} j dC N NPۘmL 2&hlcِ1j\SMPۘmL$4̒1QSdb0zDD!cy"'mL6& ׍nLTۘmL$2C|hN1ۘD6{kbLr0Id#ƧWO7Imc1l$hc$lcِ1I$I$!c8ķlLRۘd|kl]ٺI"0lװZk^g뾆Wk~͇rk5ǯs@Co7&շ4Y}'z0u uv0׃@}dGLVd!c{H&{H&mL6gjbL}GLQۘmL!2/+ӆ)jS)dC L LQۘmL!2Mg S6`SɆO_ abL{STT!c>b*#mL6 ׍nLUۘmL%2C|1l=9&777j`ߐ [|{o66!277dC}o66EnobL6A6aȆmL6mL6 ?t4lcِ1xݘ4it<@$ckOؘN6Ϻ>ictlc:ِ132326cɆtX7mL6 ׍nLWۘm ^-1o1CԍnPۘm 2 chm6f ?;>;Cmc1l|s1lצߊľg}--ِ1-SUln| Ʒjbߒ ! NVm[lc&(Й&Lac&1Smc&1lܙܙj3dCuc&36fb3Ɇm̄6fm6fٜH31fWgWgm6f 6 6Kmc1l| ; agm6f `/:Kmc1lԟp|caݘ1ۘM6d ^7fú1[mc61llhcllc6ِ1l/:[mc61l\P9hclcِ1x1s6`sȆװsvlcِ199\ѡ1ߙsŜ2)s6bsɆ)s:e\lc.ِ1; wUۘm%21ژ1ۘG6"䊘1OؘmSۘm#2ߘ7m6 )2Omc1l{yjd_'VŜ2)6cɆazvNKNh$oZdCs|8Wۘm'2C|෡1X@6✧11aam,6  `@mcln,uclcِ1{.PXm,$c|+c]Em,6 Pmc!ln,ucBlc!ِ1Lia-$Blc.]MEXEjEdC//RXm,"2]Em,6 Xm,RXm,&W.X,pNYXL6d >,sbb!c}p_tblc1ِ1LicC+'XB62+X/!2|"%!c}%p_tlc ِ1xX%!ci#cT?eJCkc ltޙTKaTmc)ln,ucRlc)ِ1xX RR!c^4iÜvl;pt&wقߩm|m|G6d o|66#2EbD$wwdC06+NK8Y_QXF6vrc`X XF6d ncLmcl2hc2lcِ1dL dc2l{QM41 |A^m{l{!c9{8|==ِ1FƮN,;1)$I ﱍɆalx016p>y&=}j?Ewg3I?vý>~g~uܑe$p~͇dG5׃t붞\aCoطX-r\՗1\:Xv׃@f$¶(\׃$BpM dcr /ے;E { r71vdbA6&w*j;dC;!c^tEwm6v ;j;FLs:z?5p dC06:b8mC{%33ِ13S~Vl|_ghg_ȉEcbSL ٰE//dC/Eml!cgdb8m$& ِ1 /Ưdݹkb*Ưn++ِ1WUmWlW!c9+ƴᆰ6-uZb A}d&ƯN1N{&Nac'Smc'l>>j;dC06bvm6v );j;6yfg^ܝ}koj}7U;6õW77>lcِ1x>}>!cx}dOmclmS؇m'Nk{ac7~c~lc?ِ1v?\W؏m'2ᴱ)$~lc?ِ1v?_mc݆|+I·#3;X8h2v2eeeeeeeeo)i?s K˖+k떱0 M-0ƅrlk\P1xotF5qfkA[?qp;@5NXk<$<UqP8mT8m$2q8q8H6d o $nAl ِ1z qPm 'x[G-?Cp}8cw`>Xx>DQ_W|O{5׃t͟?TesoCﬨga=8gq=8KW_,gzp|mz8q׃$BsYhYlZ(4k&9q_9x_9s9!c=spO9lِ1_9aK9q8G6d 6=mS8m'I(8/Yyl<ِ1x8yy!c><#Ϋm6Γ ׍y15M bN j dCu6.`Ȇ pNq۸@6d ^7.@6.`F@~96ĸS̷qlVc6.bɆ纨q۸H6d ^7.ºqQm"qlEhElX{l&%מ(Ȇ\R۸m\"2߷$6.aȆ%X7.m\6. w^6.m\6. gbqYaqYm2qljdC}el2ِ1oj+dcÄƵgb\6@W6`WȆ{+q۸B6d ^7qEm ql|Nm\Q۸m\%#䊘hb\6BW6bWɆ߸q۸J6d n*qUm*qln\6m\6]S%/0ĸ&zkq ۸F6d N)6aȆm\6m\6 ۸m\S۸m\'U79`q]a5uu!cxrl.uu!cЮЮm\6 )סjױ0q2߿51„0h#Lm# #2anmaadC6 00l#l|+ S6nfr.z?ĸ!߸q۸A6d ڸm 2Sn9 lِ1xݸmP۸m$a1ĸ)MX7nm6n SnuMM!cq֍j7dCMhMlVVo[-[-!cxrl.-[-!cvNpnm6n ׍[-[vaa-xܶݱݵEXY"-c-c,c-cQGǖ'ghs Xe,222g{m%XZ-c,c-ÄS{})\F7 W׸p\©| _ƅN5NQ85.׸pq2a W׸p<&tb&m1݆mm!cgogom6n ۸ mV۸m&2nC6ncwƻqWwSwSw6`wȆwzlِ1ŷlQ۸m!2_o߁6m6Ǜ\qW)wrWm.qlaK6l ]]!c5]q۸K6d ^7Bw6bdïЎ51"  l#l7qFA6d ^7"`݈Pۈ6"ȆmD@j=hRM{߸{j{dC={=!c=޾q۸G6d >܃6m6"հĈgD3@"6"H!cuJ$\DmDbdCsJ$S"6"H!c mDmDbƺ3Mn܇u}l>ِ1x/z6cɆpNq۸O6d mW۸m< EwwjbPxm< 2`xx@6d n@ml|NymlCxC\Wp݆^8# QD՗1Q~((\ȁu""p="2#((l8~⏷ľ#oHml|xGjGdCs#8W<6m<6.TԍncbD9%)jF4ِ1x݈u#Zm#ۈ&2ѰnDmDcdC6hhl9H(s&sNy)6cɆm<6m<6 ?{6cɆ{s 1S\41^/j/dCpBml h lِ1xxmPxmĐ C\鯚1hF C6d ^7b`݈Qۈ6bȆ- tvPF C6d ދ@1j1F,X}ja&FnĪmbdCh,Ec6bX!c~#jF,ِ1 mĪmb/F/Ex KK!c9%S^m6^ x mTxm$2xxE6tOLW+h+lِ1W+W+!cxo)6^aȆW+WF(|i'lAqjqFِ18h#Nm#ۈ#2E`/mđ ۈ66ⰍdcgLaMb5zxM6d ~kxkk!cpjdCskhkl#lTlv&FEa/mē Wۈ6ɆxoīmcdCu#ڈWۈ6ސ &a Fm lnul ِ1ŷ~k{xC6d ~hl#l4̒O#gn~AH 6!cFF@6d {J=%Am#H 2m$m$`oL} {ѷjodCu-o6boɆ[X7ުm6ޒ )ojoD?ٯǛ.=dDDl#l|)jF"ِ1Dh#Qm#H$2M66wdaCMwxwjﰍwdC1A6aȆ):;lِ1=wjﰍdc{%E1ޓdb1YE>[^m=lnu{l=ِ1:=\Wxm'2_þ6ޫm>$ 9n䖱1w˘e2e󶌥XT1_˘e2`Km eY2Z2Y2[Ƃ-c!,!=?Y߶0NB}HB}H=埓_d!d!}c,?1,=u X㒅'Sǀ٘=M v Am7 7lÍl~t?چF6d >Mm p#2ݠ 7 7 C^Ɇ[%׿%Aj"̇]%'V~P$u|/ٺ!h%'_}>ã;\yr5OA ʸ՟k{,)O)p=HAW_pP;HA r c"+RE 1x=HmPHm?tw2phvWp6ɆtAgimcdC1 w wlÝlp66ܱ mG`ZC X7<6< !c놇چA6d ѩ+6<ȆІچI6 vxUS6<6< O!cj؆'ِ1@!L O OlÓl|N6<6< /˱!g21Ĝ/ /lËl܆᥶mx )^pNR6Ȇ/hKm & ^XbbxCEj؆7ِ1 o olÛl`o:V6Ɇoh[mHI6*6PRi{Z)6Rb)Ɇauoqι\=+I FJ!c֍j)dC6RB)6Rb>d~̦r>!}>!}>j>؆ِ1xuGm!2mm`>dC6|  lA6.x\dw!zQEjlA6d o8`Pp`!cNtm8 ِ1Ehá6R4#SR9%F*l#ِ1TF*TF*!c ֍TjTdC6RA6Rad~ nº᫶m )pNU6|ɆmBj؆/ِ1 mmb~dx'~j~؆ِ1=~!U? ?lÏl܆᧶m oA~j~؆?p EW6Ɇ?j؆?ِ1ޗ?W6ɆmCjFWk&FjFِ1h#@m# 2jFِ1h#@m#HM67VH-ES}jdCsJj8VHm&2_jdCFjh#Fjl#lq_u#֍@@l#lnºm [|FF H6d n#T6ҐtFi`/Fm# lFh#Fl# ِ1)i6`iȆm6Ҩm6Ғ=ϳM!=iC{{Ҫm6Ғ H mUHm%2iaHHK6d n#-Vm#-l/3Z&F:oF:tF:!cp頍tj鰍tdCktp Nm#lwtF:tFz|ԑ&FzWaKO6۾)3Fzl#=ِ1hz/^m#=lFzh#Fzl#=ِ1xHmWHmd ew&6412} p_4Fl#ِ1xF F!c p#Fl#ِ1xmdPȀmC6tj26uo#l,v o#Hm#"2?.(Gm ׍ X76 !cpAFFl=U&FFN)62bɆ1'0FFl##ِ1E ԋfTȈmd$2S2B62bƅ{MLLjLdC{_W&LF&!c ֍LjLdCu#Im#݆晤q̰Ȭ.|;ILlGKdV;lw`>Xy>Y}3ۯp_zWfx3yf\{\^ A0]} V; l`("X-"׃`!c2``l#lm1z.&Fط!j!Fِ1Nwn;ɗ$FB6d G>"Dm#!2#Bl# xǵiM,{,jY,dCu# Y6`YȆ³,jY,dC}Dh#Fl#+Rg&FV1dsJVFV!cx döaUm#+l|N 甬jYdC6BY6m8}s_4'ȳagqdjnaiemckgo+`+h+d+l+b+j+f+n2V2V2V2ee3XXYX9XyXXE˹/٨y_Pu)q`˦qpF5NlpM]jlp˦qpF5NQ6X㲩k\6sJAFA!cpjBdc]ID(F!BF!!c~7 m6 (mR(m"2E A6 aFs:dbu06 cɆFaX7 m6 )RXm0Qln6 m6 jbE~"F!cpE"jE"dCh؋Q(m!2E"jE wQAab놻چ;N6d Nqw wlÝlnú᮶m ??mmcdTIR11< hCm 2?|?چA6d ^7<`P6<Ȇᡶmx 3\AM OaT6<ɆmxBj؆'ِ1'T6<Ɇ OhSm"v7M /ox~Km "27`᥶mx S:Km "2mxmxaEF;ӯL11Q֍jEdCFQoU(m%2S9FQl(ِ1}HEjEbdn5(&++Q (F6d ^7QLmQlnuF1lِ1xQ (Q (N6=[װL*m6 (mW(m'2Q(Q(N6d N)mW(mxM[au&xmxcdCyg6 o!cpІچ7M6d >xCjF 1nko%D(F F !cQ֍j%dCF oP(m 2EK@%6J`%ƗYdbtk$#1B~FIl$ِ1x( FIFI!cp%j%dC6JB%6Jb-51JQ ֍RjRdCp1wrKm6J o6JaȆm6Jm6J79(aT(M6?[ɺQZm4Ql|N) jdC6JC6JcɆ{FivʘgOn5w>[WV2je"~:ueAݹ&źvp2vy 6˨~7OWT΃s^F}zPy՚o{ZeVY/AY:2* ʪ,915ZY%2_6ʪm6ʑig^('rj對rdCpaSV9aʩm6ʑ MjQNmQl|OQNmQlQ^|c|nj屍dCpQ^m.ebTkӊ۬QۨH6d ^7*ºQQm"Ql|ߢ"ܷQۨH6d ?&QQm"Ql\aν&F%ыVh%JF%!ci3FOY JF%!c~7*mT6* [T6*mT6*6Bx2|Fel2ِ1EeoQYm2QlnTuFel2ِ1x/ZڨQۨB6 Ĩ"FX7mT6 ۨmTQۨmT!2U`ݨQۨB6d n QEm Ql9QiaQڨQۨJ6d n*QUm*QlFUhFUl*ِ1FUF5kd Lj{jjհjdC{_W5jF5!cpՠjjհjdCF5hF5lÇlxu  lÇl܆᣶m U)௡m @>j>vÜ072V2V2oiemck ZY[XƂ,c -c,c-cXeee,222nEZƢ,cіRxW8_X|58_q2&>뫮qR1_xW]|q'c}:_X|5~dcV&{~j~؆ِ1xf? ?lÏl7򃽑چG6d A~j~FuQp_#_\21Q֍jձdC6C6cɆmT6mT6 ۨmTWۨm  i&F aQCmQloj5dCՀPۨm 2QڨQ'emr{p_m'2mcdC{p_m'2ߋ66dcsebFMoTۨm$2Sj9FMl&ِ1R)56jb5ɆFMhFMl٨I5tרE6l)6jaȆmԂ6jm6j UnRۨm"2ߋmRۨm&V?䁉Q[aQ[m6Ql|N jdCkp [[m6QlnԆ6jm6 z뱉QG|GNn:ju:dCuF:F!c9Sm6 oԁ6m6꒍&F]oԅF]F]!cwԅQۨK6d _Uۨm%2EBu6bd;m^d#Q>dcg!o P6Ȇom`dCu#֍l#lFm(@ombdCF 76@!c@m 66zdebu6aȆF=X7m6 ׍znSۨm#2EA6m8O6%擎}>"E't8W;ow`gÕH}ٯo?)=T΃s^_}zЀw\k ;׃te c6=f4 2+ZD\ j 1*.r/L  l#l:INm 66 !c l!٨帀IMlgj dC6B 6b ɆhhH6d G46m46 mh$l46m46 hm4Rhm4"2`hhD6d >46m46.jb43737Vhm4&2hhL6d abcFc!cpj`13۴3)L`Q7aV6ɆצpMm _C Ђ6`!c9%V6BȆhEC6B!cp!FFB6d o~#Dm#!2mm`d#s11BEu#Tm#%2 mbdCF(7B6BP!c9%U6>~ەh"&hhB6d ^7Dm фl{Dm фljhFl)XHob4i Tm)єlrpXyaJ<+=>hJ6d >4sJSFS!ch#&F76°0!ckhaZFF6d Wkm 66°fdTh LfF3hF3lِ1x 6aȆF3X7m46 ȼ@6m46Wɢ\a\m9ќlhjͱdCu96cɆFshFsl#ll2>ٓ,&FXuJF8N6d n#W6Ɇ*~ t?WF8N6d n#W6";MfbDFFA6d n#ڈPۈ6"ȆFjFِ1h#Bm#ۈ$ĈF$7"6"H!c=HgmD UFF$I6d n#ڈTۈ6Fc]ibDFFE6d n# ڈRۈ6ȆmDAQjQFِ1x/mDmDad:61uF եhhl#l|  װjF4ِ1hh#Zm#ۈ&2FF~a~xXb-cqxX+XkXeeeeeeee+XgXXWX7XwXXOX/XoXX_X?X@aZPXg|y̟S jT-5q-Ƶ5Ƶ58_3nP׸Ƶ'c-`kq-C6B~_sJKFK!chۈ'+Z4.bb;s!?l.ǫmcdC{1p/&^m#ۈ'2nīmcdC6⡍xx C^w|c߭kwZE0O>[ ֈVjl]+J}[Ͼ9xOu9o>p=hMa]%fxzž}koZ}[zКξk kv׃@sEk8WVhAk!czhH ~0JQ#AH66!c>"ֈl#lFm$ ߗm$m$`mFǍL6bmMۨm6ڐ hmQhm!2߷og6jm6dC{Zm6jmdRCMF[hF[l-ِ1\IiK6l'F[l-ِ1E[oVm-іl|Ni mUhm#821ډ9Sکm6ڑ ׍vnShm#2S9F;lِ1xhmShm'?XR&F{q@{ihO6d 6tpذmɷWhm'2_kjdCF{hF{lQ܁eLbNjdCEF!c֍jdCuAmёlOZ&C9訶H6d LGLGFG!cpjdCu#Qm#щls|廼I;|wP'NF'!c~7:mt6: UF'NF'!c 褶 l>7Wj_a_ ÅM_ DWWdCp1PWWdCu+h+dcljU21:93S:mt6: _{ wVmt&2a謶L6d n3Ym3хlE<>Em хl."zFl ِ1FEm хl| Em ѕl{Լz5]a誶J6d ^7ºUm+ѕl|_+J6d n+Um+эlt|&n覶 F6d ދvh7nF7!c9Smt6 mtSmt'~ ,?.lt6mt6 )]m;ѝlFwhFwl;ِ1x讶A6곸h 衶A6d }Pm 2Sz9Flِ1xmPm$ 71z =j=dCsJO8Tm$2詶I6d ^7zB=6zbƟ~ܵK<[ >[Kmыl|N^j^dCsJ/8Rm"2GKmћlluQ[SzuJoFo!c97Szm6z  mVm&2SzC6zc}FQ}FꣶC6d nGmчlFhFlِ1yhFl/{w$2+F_X7m6 }aWm/їlF_hF_l/ِ1x諶G6\Ni#~~dc?]87C[̀3g3|j3p=Ad c΀=  2߷mPۘm$01ff0Smc&1l.l,sbb!cbQh''KD/K6`KȆm,6m,6 ׍%n,QXm,!2K%jKd퀶;M119e)Sm,6 -tK6bKɆ*~ T7m,6 X m,UXm,#J6X& v2lcِ1xX2e2!cep2lcِ1x/ X XN68oLbNYj˱dCuc96cɆrX7m,6 /6m,6V zշ& q x  !c֍j+dC oPXm 2SV@+6V`+FZ'ib딕pRmc%l|_t%]XI6d nc%Rmc%ln6Vm6V㯂_c;jdC66B66bɆm6ml66 jMd%]Wss66aȆml66ml66 ?6&M&!c~cImclT:wjcS69eflc3ِ1ff!c֍jdCuc3Ymc3ŬM;^obl{Z[-J1--^1:e \lQ؂ml1+WmlQ؂ml%>lUԍnlU؊ml%2^{+|^{Vlc+ِ1\ů攭jCsVhcVlciMm{mj۰mdC6A6aȆ6X7ml6 ׍m6mv 6}X &vac;]mc;l|Nj۱dC6C6cɆװۡj۱d##S!ءA6d }P؁m 2Sv9elcِ1xmP؁m$t(3hSaw5NN!c֍j;dCuc';6vb;ɆEwB;6vb̞M]nuc.lcِ1waR؅m"25О.].!c إ M6=?-ݰحM6d >snn!c9e7Svm6v j64o:ٱ-c,c-c,c?YZ~b;l;b;j;f;n;a;i;e;m;c;k;g2v2v2v2v2v2v2v20{p|!ms#=pۣq{pC5N8Q׸='chk\P1ָ={Ɲq21}pn^lc/ِ1{6b{Ɇ׌m6 {j{jgME֍6~6~$2Gxj?b? U@uGɆp6~TG6:} &>q>x>}>!c֍}j}dC}>7S؇m#2SA6aFʿ/~X7m6 }?|~~!cpjdC6C6ckS\MNٺdĖ;_'lِ1ss6`Ȇm6m6 8mP8mD6v86M^Op/'Ȇap16n\wY Ȇ5 kOOdCOOj?aƠ;Cn41ggm6 aqPm qlAhAl ِ1x8mT8mL68go 6~6~&2?údC6~6~Vl|ghgCd#E9QMC"{^M֍CjCdCu6aȆ7CjCdCuqHm݆!_!pujZ/vI?|?$bw`}b?)Ϟݺ_9E}0IU꘡wX[g0a\i"E01x=8 mV8m!%6Nm6NGͫW{8%INm6N 8mR8m"2:Nm6N ׍S)SiCΫ^21N jdC6NC6NcɆiX7Nm6N 6Nm6ΐbb؋Q8m!2q8q8C6d ~ NrFm qln6Ψm6Β_uꪉqVԍnU8m%2q8q8K6d >sYY!cpgjgsdc/_31Ή^Eϩm6Α o6aȆ*~ /zNmql9h9lWW|&ƯƯƯjb UmWlW!c~Wo++ِ1__6~6ΓQÛq^o6cɆ=j籍dCyoW8m'2q8q۸@6▉qA`qAmql߸ j dC^^P۸m\ 2qڸq۸H6wNMbrS.m\6. ۸m\T۸m\$27.~El"ِ1E%AoZkb\6.A6.aȆm\6.m\6. `qImql%h%l2ޗŽ==6.cɆm\6.m\6. ۸ m\V۸m\&22qYm2qlD~&N)W6`WȆ{+q۸B6d n qEm qln\6m\6|$Lzhb\u0$]%.w>qUl*ِ1xݸ UU!c𽯫pUl*ِ1UodVsemmF6d Mm7l7!cpAmmF6d Loojm\eewM-m]=}Gǖ'g疱?-c/-c,c-co,co-c,cY[>X>Zsj9]skTt325qר]5]585uk5q2q`qwltw>uOw]m:qlyyjױdC}u7_W۸m\'2C6c7Fyab߭} lِ1xݸ  !c-16ulO, lِ1&7j76yn$]9xOٺunw`g~웃d?ٺ9]}&mǼeo7MٿM:2_G߄j7q=Id Wk 7"nzpD| mT۸m"mm⍉qK`qKmqlrpذ=~Kmql^[^[jCs-h-l6p8ꭉq[\ӹ gjdCu66ncɆ{۰Ǽq۸M6d vڸq۸C6?R_&aqGmql."F2Ckql;;jw;dC6@w6`wL]h]l.ِ15]]!cq֍jwdC]h]l:[M{bܷq۸G6d nqOmql@{Z6aȆ=h=l>vY8R㾨aݸq۸O6d n>q_m>ql|rSm6 ׍}d#擉&11?:??Ȇmmِ1x֍?66 2_ml\NHipRばxx@6d w>Pxm< 27~lِ1xxH6R0PaPm!l| am<6 )Pm!lChClhy$2&#o<#G#!c9Sm<6 )Hml#h#l1p=8㱰xxL6d n1Xm1lchcl1ِ1c{{tL'hl ِ1xO6`OȆ'pNyxB6d Nym%[&iMg}{gjϰgdCu6aȆ*~ 4 m'lpQ R싾/6^b/ɆRm%l|Ny 甗j/dC{/j/Wd# uYLWNٺWdɚY#g^m6^ o6^aȆxx xE6d >6^m6^Jfby Zm5l=w{^m6^ ׍װnVxm&2S^C6^coƩNɏe718m}!S&\^\ިFm lnul ِ1xo6`oȆhl-&߄so:-\Uxm%28a2jodCpzw[[!cxxG6]OnN;6aȆwjﰍwdC6A6aȆaldcb 6m8Eea=\G_j'g癤e?)/9 ׃t/cOx^CXk׃te o[W;x{r c>=^-=I{nDVjdCs8W|Pm| 2@6d nAmls&Gq #Qm#lGhGl#ِ1GG!c2>B6>m8Ӌ|7]~Ė$/,cI-c.d1WX XJX*XjXXZX:XzXXFX&Xfؗ,l얱\ܖ17X/]U9%r_"74)N?1K"7#ߩc-bDnhNָDn)PSǀ_b^ FbFb!c/m$6 _ N솮'VHm$&2cI m$VHm$![~qgDHm$QHm$!2_S%qCk$jI$dCpe $jI$dC@I6`_~1BKx_nhdCu X7Pl|N)_m|m|A6d >|m|lfwH=K=KHJ6d ^7ºTm#)l|NI 甤jIdCsJRh#FRlÅldb&_oچ B6d 979 lÅl@6\6\ !c9pQp6C=H319%Sm$6 ׍dn$SHm$#2ߋIbm$6 ׍dF2dFr1a]%LM{jɱdCFro$WHm$'27~#Frl#9ِ1Fr؆+ht1ߝ*+j؆+ِ1xpuUmp%2 mmbdCཨ+᪶m R$-cbu#)6R`)Ȇˆ 6)6R`)ȆKLKLHA6d ^7R@)6R`)ƅÖ51RuJJNIHI6d >sJJFJ!c_Սj)dCu#%Rm#%ly&F*Q7RJm#l.6ٰRHm"2 H HE6d NImRHm&RT01R5ljMHM6d oFjFj!cpjdC׌SC6RciFazFHmQHm!2F&zF&Fl# ِ16 \æQHm!2i4jid'C*&FZ7l]Z7l]ZFZ!cfO,Y FZ!c֍jidC6Bi6bƚM/T51҉~#7ҩm6ґ ԍ(g 'bҩm6ґ HmSHm#2EA6aFׄIwһ֥WHm'27~#Fzl#=ِ1)6cɆm6ҫm62;lL b+ʠ@6d odF F!c p#Fl#ِ1ȠH6~th_u#nOF7ݞjdCFFFF!c9%#S2md62 S2B62b+712 ֍LjLdCpa'%ٰLjLdCsJ&8dRȄmd"2mdRȄmd&C&E FfFf!c֍jdCu#362cɆȬnחd#q@_syK7j_E'tNQvyKxƗ웃t/K\9O=eFu ,ε骲ٷuUYg? Yd A\߳Ȣ׃,$BsEh#Fl#+p|EUwfY6bYɆצYaȪJ6d Gd}DVFV!cGVh#FVl#٘2YLlF6h#F6l#ِ1xF6lF6!cp٠ljٰldCu#Mm#l-+{r#XdjٱdCu#;6cɆ{̮N6d ȮA6r7oY #ȡA6d n#Cm#lFh#Fl#ِ1xmPȁm$S9#Sr9%FNl#'ِ1)96rb9Ɇm6rm6r iȩE6ܛpK\CRȅm"2`ȥ E6d n#Km#lF.h#F.l#7hC!&Fn1sJnFn!cpjdC6rC6rcɆ\Fn؆(/ϋML 719Mm p#2S⦶m p66ܰ 7!cmmayƳ҇yĜ)y6`yȆFX7m6 mQȃm!2 mQcx?y~0_;;Z22V2V2V2V2V2nyZƼ,cE-c,c-cޖRҖ2r Jʖ*j1aR4߉?7 {׸Td >_^uˋk\^q2ߧ k\^\R1xoָFr+5 71 |j|dC6A6aȆ~m6 F|jd F}9)Ɇ)ɯO6d n#?_m#?l޳޳jdC069c8l\Q7}d Fdk9Q&F*T6 `Ȇo.Q(@6d WkQ@mQlF.g#chm6 G01 jdC6 B6 bɆTᚪFAl ِ1~1МRPm Ql}fQH(mR(m"2Wa!BjBdCp6 aȆg(Q(L6Ngb{1^LaFa!c~07 m6 S uJaFa!c8ᰑ{}d FAo71{Ԋ{Ԋm6 (mQ(m!25P/ZDmQlnuFlÝlV&nmcdCpaܝl؊چ;N6d ^7apWp6ɆmCj؆٘?. &x>[硶mx Cm 27<`ᡶmx ox@j؆'h#-K[S OX7<6< O!cg[W>\\݁9xOp>[W~y7rڳ_~S7M<r=gמx9/B] =oo -go:2ްxxzMd cz[-o!ckpV6J7ZpQB%`QBmQl.줔 RBmQl"QBmQl|mZ(Q(I6v6v|()]ZFIl$ِ1x( FIFI!c_?Jm6J ׍FIF)18}&F)oQ v6JaȆ"bQJmQl|O*Q (E6d c}/|d RFiQkgzuor(Q(M6d ^7JúQZm4QlnuFil4ِ19.-󇏌Q(C6R&o߫QFԍ2nQ(m!2Q(Q(C6d q3^+Y 2F!c16ι.#Ck QlxQV( mU(m%2Q(Q(K6d ӋpHg16beɆFYX7ʪm6ʑɇ('rpN)Q(G6d ~^NmQl|N)rj對rdC06 :c|NG(m'M;^jbW(m'2Q(Q(O6d nj>؆ِ1x  lÇl܆᣶m Qc{#kyeee2V2V2V2V2V2` ճշ5YZY[Ƃ-c!PXXSXeee,2aEYƢ-Wk0N5_xK5N58_u5Ηjk/qk/88_X|5~d#Q'Ǎ &Gޣ槶m ~oS6ȆT~pM姶m S6&՝5 ۃK6cɆoQۨN6d ~{ux{uFu!cQڨQۨA6Fz-XSՀkj5dC6j@56j`5Ȇ*~ tok F !coՀ6jm6FaiN5132 lßl|Nsچ?O6d o~_m'2mmc5FrĨ)FMX7jm6j ۨ mTۨm$2Sj9FMl&ِ1RڨQۨE6irQyyٰ=XKmQlF-hF-lِ1xݨF-ZF-!coԂ6jmԲp[WVj"~:[WضkԶ;0On]mxk~m7O~'S9ym9A:Q?':Ы#֦uڴ}[ԁuzP@QA!cQGmQl&F]a.QWm.QljudCsE]X-m6 [ԅ6m65ncb3jFِ14M6!c3jFِ1x66@EH"L@a#T6Ɇ  m Uh"Pm#$2_BjF=)=71 zjzdCփSۨm#2S9F=lِ1xݨmSۨm'_BQڨQۨO6d vR IQۨO6d WkQ_m>Ql|mZڨQh@6^dXlb4h؋6Phm4 2 `hh@6d o4FF!ch"ۋKq$/ maAdChE6 !c9%)AjAFِ1xmma U{-319!Sm46 w6 6b Ɇm46m46 ) j Fdl;FF#FF#!cFp𣏕F#lِ1)6aȆ7A6aɆkYsWFcFc!cpjdC44Vhm4&27C6cdȣC61E/ {``l#lF0m )pN V6Ɇ`h#Xm#!.y{"F!j!Fِ1:%SB6B!cp!FFB6d αh#Dm#% LP>P>PPl#lF(m _k B6BP!cuJ(m4!ٓ6I[lDԍ&n4Qhm4!2S9Fl ِ1xhF&F!c9 Dm єl\ΩTh m4Uhm4%2_6kئjMdC6BM6bMɆ)MjM01Ս&FmmaadC6 00l#l|)ajaFِ1:% S67²n61uJ3Ni hF6d nLmьl߈p@oRo hF6d ^7A6aɆm11 ͡jͱdC{ysFs!cp﫹Fsl9ِ1xh'fb;pqbK/Oȿppl#lF8m W6Ɇph#\m#ۈ w\x!oDmD`dC6"l#lFmD ׍h#Bm#ۈ$=WwNkDog!-Tۈ6"ɆHoDmDbdCsJ$S"6"H!cpFF$E6*ѻVM(q> ^Rۈ6ȆQdö@Rۈ6Ȇ퉂DmDaQdC{_QFFM6>x=&Fӆy&)l8Jy Y76h!c FF4M6d ^7a݈Vۈ6Ɇ)FFz?0}?L {sJ;vF;!c^Nmўl؃31ڋ^=E۫m6ړ )^m=ўl|=jhO6d ^7C6cֿFAmtPmt 2`蠶@6d ^7:AmсlFhFl#٠^01:^#E;mt6: mtTmt$2訶H6d >t6:mt6:-n$F'X7:?;>Qa0a(BH!DAH6轌GgFYo}|nksy6aȆ{A1D6d > s A !cpAjd#y,]611֍jdC6C6cɆ):e`lc0ِ121p'.)p⮶m )pNqWp6ɆmCj؆;ِ1 wh]mB6=sfb q0ucٰͰC6`CȆ Sm 6 ?O Qm !2m Qm %&Po PP!c$cSPaچm 6 Ca1Tmc(1l m Umxj~g<: lÃl|oxmx`dC6<  lÃlnx@j؆'ٸ[&nxmxbdCgd<O OlÓl Oچ'I6d nT6*%N11uٺajðadC0؋Sm #2`1 F6d ދ6m 6P힉1\ԍn Wm '2pjñdCuc86cɆphcplc٠羉1BԍnPm 27Fm6F #6F`#Ȇm6Fmpi$%jT4~LHakFE0O=42mE.u0\<ŧLHxGH7O?LHxGH\F=KrwjG( Qw`(\F!1 ׃Q$B6Fm6F uY~lb~hh!c khlc4ِ1hh!cs41Zmc41lT]&c=1!c1C6d k1jc1dC}hclc,;sc3XX!cpcjcdCuc,c6bcɆm6ƪm6Ƒ]Y'l6Ʃm6Ƒ mSm#211G6d >6Ʃm6Ɠci1^)2^mc<1l{j㱍dCW6cɆ6ƫmp~%ҋ6[^sx[|,c 1?˘elele,2626262hn [fXB,c3-c,c-c90<|Xele,1?'/q J}/KK]p'c ^k8y/u5΋j?/X5 d#AM oy[m&2筶mx !h[m&2 mxmxc>dDpޚ>†᣶m 6|6| !c8_Q6|ȆT>ІچK6frF+_8mbdC6| _ _l×l|M Tj؆/ِ1 _hWmۘ@6b{c1ژ1ۘ@6d nc1Amc1lhclcِ1  D/^RMg?LO&mL6& a/:Qmc"1lDhcDlc"ِ1x1ژ1#8{1~p/Om#2~nma~dCpS6Ȇ᧶mLlb^j؆?ِ1]w lßlnú᯶m 66IdVIMInLuc$lcِ12 )6&aȆmL6&mL6& )IjdW)Ż&&6&cɆpN1ۘL6d >Lsdd!cpj}+#@S:%@m# 2?Am`dCu#֍l#l|N 66)d㟞J&Q71Emc 1l|N)jS)dC{_S)!c1ژ1ۘJ6Fn41USa1Umc*1lSwmL6 ?O LUۘmL%2SjSidi Ҙٺil4i4!c1 ֍ijӰidC6A6aȆmL6mL6FRiM@19%Pm#$27am )pN T6Ɇ5 66d-қtt!cutN1ۘN6d ދNtt!cpӡjӱ 1ფ2AFFD6dd"z'>Hm#"2mmaAdC% l#l4wlM`umcdCp_4Xm#&2 mmcdCu#VpaՠC^5p|Z s.Ouᛡv0\<ŧ{{n3wt:Ԯ{>C}gzBBaMe3BD{ GzBd \BHh#Dm#ۘI63.ٶ+1S3a1Smc&1lD GTۘm$2+fj1Smc&1l|m:ژ1ۘE69UgNcx: 6faȆY1 ۘE6d nc1Kmc1lmRۘm&<9rs9ll!c۟1ۘM6d nc61[mc61l|/|61[mc6J6.XsJ(SB6BP!c FF(J6d o~#Tm#%2 mmbsƪξĘ#ĺ6m6 wvrpt>1ۘC6d 9wQۘm!2E@s6`sƐ[L\hc\lc.ِ1:e.\Uۘm%2S9e\lc.ِ1611js0]m?ob^4 ajaFِ10|5Lm# #2ichbhmaadCsJm#oW&1_mc>1lfNᴱlGnJCkc>1l|hc|l#l6kU6¡ppl#l{8|m ׍pX76±p!cpFF8lK2"u"&1,s!c֍j dC0FW g16` Ȇnb  6`d##51"D݈u#Bm#ۈ 2mDmD`dCNPۈ6"ȆFa>y>0숴|celele,222m[f-ZVYV[,cZ:zF&fV6va"unS8 Fk\$qTd j$|g5R]"q'c=gxEI5N#aT׸H<-$!9JWX(濅p[XH6d /TXm,$2is`2;,Blc!ِ1BhcBlchsLEbnܧ[XD6d ^7Hmcl"hc"lcِ1xXm,RXm,&yt-cXS-kjdCuc16cɆa殮NXm,&2C6cQdnUĈr03lٰ}e2Jm# ۈ"2QnDmDaQdC06k8mt"ڈ6Ȇ566%d#t51~c 7m,6 %!cȮNEXHbhm,6 K%jKdO1˛KٺlRR!cpKjKdCRo,UXm,%27BK6bdob  װjF4ِ1 hhl#lF4l؈FmDcdC6hhlcxa[ &2 2a{h2lcِ1xX2e2!c8edFt2lcِ1x X ۈ!\ĈkQۈ6bȆF 1j1F ِ1x݈u#Fm#ۈ!2_@1j1r1ͲG*ٺlrr!c5r]XN6d Xm,'2Xnyk9[%֭bZ s\gVc s.Ͻw. _a>]u+=_+p=XIWBj*!^c1WYc*lcِ1U*U*!c8D T7Vm6V ?VA6VaFcZX mVXm&2_jj!c8D XXM6d >6Vm6F&ߝ11Ĝ88l#lnmđ !bmđ ۈ66Ⰽxqܓ uF<mē gWۈ6ɆmCjF<ِ1xh#^m#H 䍾WH3l#ln$m$ [$kF@6d -HPH6֐seX#X7֨m6֐ #k{֐ [۳Fmc lX5jk5dChclc-#&Z m-|Vmc-l] {ѵjkdCsZ8UXm%2SBk6bw#&:NY)6aȆaltpp(h"Xm#2:uj밍udC렍uj밍dce&z1szz!c$sj뱍dCpXXO6d ^7C6c)lfbl66@66`Ȇaltrpڰ=۠@6d } 066`Ȇhclc#(QcS69eFlc#ِ1x66bɆبH6d nc#Qmc#lcy&&acImclnluc&lcِ1:+|؄ml"2 ؤ L6藥Z:e3\lV،ml&2 76ml66 !bYmc3l| جB6 nmblolQ؂ml!2v-j[-dC0u+ƍ,lc ِ1xmlQ؂ml%u?}ٰU)[ᜲUmc+lnlucVlc+ِ1:e+\lU؊ml%2 mlU؊ml#)yM|7{n6m6!c$c m6aȆ mj۰mdCucMmcl| lbluc;6cɆ):evlc;ِ1x6cɆvA_:;\̆aZ!c~c7vm6v mP؁m 2;j;6/avZ222eleleleeeee7Q1q I)iY9yE%e+*bEN T;5n'q;| 翝׸Td 7}NuۉkNq2q;a۩q;ljv1&.(KL.-S ۥ E6d ncKmcl.hc.lcِ1jKmcl\IlMbMvm6v  mV؍m&2C@V؍m&2j=dc_abuc{6`{Ȇm6m6 {`߼Gmclhc !_ٺY;ٺ_[Eja.;[+tv)>]{p]_wW7O.uWxU_q=KxYS1b/+^\ݗ1^7W`/{Ɂ1j{q=K"d ^hc^lcxrp}M}}}2S؇m#2+Omcl{}j}dCs>hc>lc?X3y\&~7W؏m'2l?|l~lc?ِ1"_mc?l|د8@6rq@[6`Ȇgdm6 8mP8m 2߷?mP8m$6qP8mT8m$2q8q8H6d oAA!c9 qPm ql$ `㐘S9!lِ1x/z6aȆ1CjCdC!h!l0犻qX8 mV8m&2E^al0ِ1̞V[W _Ň,al0ِ1r8qlLzyP7N S~S looja ȆmjMm7l7!c^7h7߰#dTu yGDqG6`GȆm6m6 G`/zDmql8mQ8m%T\{`qT|W(QQ!cpGjGdCu(G6bGɆm6m63)087Ȇ cjǰcdC6A6aȆ{c=q 8F6d ދ6m6[febsq8W8m'2F2V [:q8N6d 8m'2EC6c'Fǁ{?$61N'j'dCu'6N`'Ȇ X7Nm6N 8mP8m$ VcMIhIl$ِ1LᴱBE?q8I6d {_'}T8m$27NB'6Nb.gb)S)!cq ֍SjSdCu6NaȆm6Nm6N>51NuiN9q8M6d  6NcɆa)\16l*pZm4ql= mV8m!8cbs8Q8m!23?Ϩm6ΐ !bqFm qlhl,({gU[&Y׻=YajgdC0ڻb8m^1:q8K6d ֝U8m%2q8q8G6 =qNԍsnS8m#2{>=q8G6d ^7qNmql8mS8m'I\8/ýj籍dCyy!c=pyl<ِ1y1]G'Dݸ !cuNq۸@6d ^7.qAmqlhl"٨|`b\t=BdcywŔjdCE؋^T۸m\$2?wr;q۸H6d uڸq۸D6RзVMKn\u%lِ1xݸ%K%!cq ֍KjKdC6.A6.a 7ofb\vn\&NJ΂k\V۸m\&2aݸq۸L6d NiqN' }Ck2ql|rڸqny8ws&)O5^9; ]-ws.OuqNjw.ww7OŝI8翫\{£` Cط-\ݗ1x=+\!2C@s+\!2 qEm ql(<&UUUU!c>*#m\6 ۸ m\U۸m\%2_\6m\p~%N|K/0oq\|eeeeeeeeeeC#cS3s K؟,c,c-co,co-c,c[[>X>ZrjsC4g`sM]wj]}5uk5q2q`qpF5Nkk]S׸kxN6"']?ĸ.:ul:ِ1uu!cpסjױdCku уq7DotF76n`7Ȇoq۸A6d lP۸m 2n@76n`7FGi3ĸ)l܄6nm6n ? T۸m$2ߛ fom6n )7j7[dт*%NĜr )6naȆ-X7nm6n ?w`nm6n )[jd#iMۢ {jdCp}[m6ql|N jdCsmhmlLȽĸ#;pNq۸C6d nqGmqlhlِ1;;]<ĵ=ĸ+攻pNq۸K6d o܅]]!c~.7m6 )wjw{dCW.41ߑ={=!cq֍{j{dCp={=!c^qOmqlK619>Sm6 ۸mW۸m'2g>|g}l>ِ1xݸmW۸m< ~[Zeb<6@6`ȆjdCph@mln<6m<6 kKM?D7Pl| \ِ1LAZZ` ׍??66t%ŸD!\>Txm<$2xxH6d )6bɆChCl8uZ#GjGdCH&b326aȆݺGjGdC<6m<6Р[ab<u16cɆ{ǰ}xL6d o!O6`OȆ`a̟m<6 xm5#^m6^ x mVxm&2xxC6]m&a Fm lnul ِ1x$o6`oȆaldib o6`oգn71ފgho3jodCu-o6boɆצo[l-ِ13[;1-L;MwbOzxG6d ^7Nml;h;lِ1;h;losp»MŜ7SVln jc !b9oɆm m7ld{w=&{Q7ú^m=lnu{l=ِ1{{!cpjﱍdʷ51>֍jdC6>@6>`ȆpN@6d H6t*z8~㣰H6d >|sGG!c5GH6d m|Th>y}/q~#~ XbXXRX2XrX ˘22222222222222222222222߇qKFȍFPoOIoՉܒO ^OָDn)'qP翧k\"T׸DnSǀd~ѭ_ 74}ِ1//66 2pCj_`_ F_@_m|m$& ]a#HHL6d 7'vC}sbFb!c32jdCu#1Xm#1l.tw#S9%Fl# ِ1xHF$F!c֍$jI$dCu# Dm# l =yc&FR7~^;:Tm#)lݳnݳjIdCu#)I6bIɆl$UHm$#Oq#,z,F2l#ِ1xHF2dF2!c ֍djɰddC~A6a*I#HHN6d c+f=^ZɱdC[ n]rFr!c9%9\m#9l|B)`/Bm#lnu#F l#ِ1"OHA6d ^7R@)6R`1aΘam86؆ll sm8 ِ1⯑56؆ln8 چHI67;s&FJNI ))6Rb)Ɇ+ }W*FJl#%ِ1xH FJFJ!c5lJh#FJl#p@Z &F*7~&7:Jm#lwR߭K HE6d n#Jm#lF*h#F*l#5٠7l/E/6RcɆ԰HHM6d gVHm&2SRC6RciƬwlbqotF"U˱/dgFm# l|_4 MHC6d ^7Fm# l4F4FZ6iEH FZFZ!c֍jidCpFZFZ!c9%-Vm#-lwlMtn,:7t?F:l#ِ1xHF:tF:!cB6d ^7@Y6`Y(PFVh#FVl#+ِ1FVFV!c֍jYdCFVh#FVl#٨޺}&F6a#Mm#lljٰldClpMm#lnd6md6$)ܺ?61jٱdC6C6cɆ{ͮN6d ^7C6c9%jbpCm#lFh#Fl#ِ1xFF!cFFN1ew1LFNh#FNl#'ِ1{m]16l96rb9ɆA6uqpڸޢk%>I6d ^7rB96rbF|%l6rm6r `/Km#l[зsm6r \jd#矾41r^47Esm6r )ᜒ[m#7lZW nv VZdCu#7[m#7lZw_&Fa#Gm#lnu#Fl#ِ1"Em6 #ȣK6hMF^h#F^l#/ِ1ouCWm#/lf+ӆ,F^l#/ِ1x mUȋm#]n/p鍉O`Om#lnu#F>l#ِ1W>Om#lmSȇmƽ31DpuMm p#2 ?m AFe,ֆF6d ^7ܠ 7 7a0_Z2V2eeeekXXQX1XqX XIX)Xi72o-c,c-cYƾUUUUUUUU|Kqߗ%q_R1KR]5Kq2C@ߗ%q_R1xָ/5K<'ί}0132jdCHƦd6 Wȏm'2}nm6 Oȯ(@6WN'MQ@ԍnP(m 2_SkjdCp]@mQlFhFl+Qi_ ֧٘\Y7R lF{W Ν&FankankaFa!cQ֍jdCFaoV(m&2Q(Ql-8ab|SLl>dC0t\16lVlj_c_ )_C_m|m]uEQD}ᄍx*v ߭+y=/AQG'r-WԵ0O/y}NuQ/AQ2߷( -(91xQ(Q׃$B(QTm(QlT iMbbQ ?m6 ?+kD1bF1!cpŠbjŰbdC 6m6Ko:Q\?GqFq!c}jűdC}DqGW(m'2Q(Q(A6rR%Ļ%`GQBmQlF hF lِ1x(F F !cG hF l$ٸ#i&FI$|NRRm$Ql|mZMKm6J !b %6Jb%ɆFIF)2e11JQ ֍RjRdCF)oR(m"2C@sJ)RF)!cpRjdϚCe51Jgh3jdCsJi8V(m&2NR>')Q(M6d n4QZm4 (36Mooo66!2Ss7j`ߐ !b9ooȆoo66ʐٜQ51e2je2dCge6`eȆ1P(Q(C6d n QFm Ql=0l{D.xNR>')Q(K6d ^7ºQVm,Ql{e˪m6ʒ ( mU(m|K6F7Lo׷p[ooɆƷn|--ِ1x/-EUlƷƷjbF51ʉQ֍rj對rdCu6aȆaNWʩm6ʑ U(Q(o]I2(/FyX7ʫm6ʛi"Q(Q(oj屍 m6ʫm6#{^2wwdCswpNNm;l;!c]16l_Nm;l;!c5wwjaߓ e&b=\|==ِ1p{ﱍɆadCjcO/{41*Q֍ j dCsJ8TPۨmT 2icGbhmT6* ) jd#Ӓm61* jdCu"6*bɆa攮Nd'HbhmT6* ׍FEF%qyQɵN16* )JjJdC6*A6*aȆa7:b8m~>F%lِ1JF%JFep>61*gmᳶjdChe؋VVۨmT&27*~Fel2ِ1RڨQۨB6KqE^Fl ِ1xݨF*F!c)U*jU*dCu QEm Ql܄31 UjUdCu*U6bUɆmT6mT6 ۨ mTUۨmT#wF߫_Ĩ&jߨQ ۨF6d ^7QMmQlF5hF5lِ1R ڨQ ۨN6V;OcbTu:6cɆQۨN6d :|[]m:QlnT6mT߇߇aGMZږ:z-c,c?Y[ƚXƚZƚY~5uuuu|ոAIN/c9_ 8P׸ՠ'cYlP׸ՠ'cjk\ \jP1~ Xjk\ {si &j\#=ݺpwZDMs.ٺpvP\<ŧw:[WTo.Մ=t_l9Cެ}ێ?ݗ1L=tp?E?u?E?׃6~6jҏĨ%kPKmQlkD-ZF-!cȮNEC>Q ۨE6d ׂ6jm6j ;`bvlmAzQ9jdCHWma+_6jcɆڰQۨM6d n6Q[m6Ql~菝M:nԁuFlِ1xݨF:F!c8D o_GmQl|NmQۨm%ylbu=1u.hB?eݨQۨK6d n.QWm.Ql ߃QۨK6d ^7Bu6boYQĨaF}a[ Wۨm'2߷m6 aQ_m>Ql,}hF}lhkYT&F@@F!c֍j dC6@ 6` ȆFFCsLk ] Ɇ 6b Ɇm46m46 hm4Thm4$2hl^0Z&ƏnƏj?b? #|gGɆaƏƏdCƏƏj?b³Tcb4I$6aȆF#X7m46 ? n7Rhm4"2OHm5{uMOp'ȆOnِ1⯁ِ1x/OFcQҌ.Wuo{|vd2럍6cɆ 1-jdCu16cɆFcFjhb4u M6`MȆKlKlhB6d c+ӆ Ѣhm4!2hhJ6ŸDh*l46m46 )MTm)єlҔlضYm46 )MjMfdc^Lhm4Shm4#2E^F3lِ1"Z4Shm4#2͠fjͰFeV? ?C?mmL6d nghgɆ16~6~&2Ymgl90y\Sh7m46 hm4Whm4'2C@6m46 hm4Whm {z,g-`hhA6d Ni)-6Z`-Ȇm6Zm6Z o6Zm6Z ljnba[-6Zb-ɆZm6Z h mThm$27ZB-6ZbȆa&F+Q7ZJmъlF+hF+lِ1VyJ+VF+!cpVjd#ipkahhM6d ;tVhm&2ahhM6d o6Zm6ڐŝZ51ڈ֍6jm6dCu m6`mȆFX7ڨm6ڐ ׍6F6F[1LF[hF[l-ِ1c8mUhm%2mahhK6d n-Vm݆pL;s&9vp&i.\<)gj;vv)>]j+C;ogşH8YY:zų{{oA{2?Ijv׃@sE{(ZD{\ړ׃F{FqAMbjdC{Z`蠶@6d jdCjd#&q]MNc#ٰ}巣FGl#ِ1Liv4FGl#ِ13ZGFG!cGGhFGljLNntuF'lِ1xF'NF'!cpNjNdC6:A6:aF:bbtvagajdCu36:cɆpN鬶L6d ot6:mtp~%ݗ^ab>GWX7XwXXOX/XoXX_X?X@/A1wP˘e26262626262626262626ݗ.Tt1}Oϩu5 8__E]ׅj1Кu5 8Y11P뢮q]וllMdoHW j]dC0_GW _ŇU-Y FW!cwVwVmt6 B]6bƸzkbttnjݰndC}s77wSmt#2 覶 F6d nMmѝlpיLav'7웻mt6 ?uWmt'2讶N6d 7w6mt6z !)Lj=dCu=6z`=Ȇ1КFlِ1FFOq~11zLI6loTm$2詶I6d ދhOFO!c9'Sm'ыlLK61zwV{wV{m6z ' 'KmыlnuF/lِ1xmRm&gt71zD^VwM6%v*rFol7ِ17\Vm&2C@uFol7ِ17[m7чldwZP7~Flِ1>F>F!cJߕꣶC6d 裶K6.oW mUm%2S9F_l/ِ1x F_F_!c諶G6"VĞ<'~觶G6d ^7Omяl`{W ۛ76aȆ~F?~FѣIFEFF!cuJN鯶O6d ^7ú_m?џlFhFlc(>#Mb_t1@6d nc1@mc1l1@6d ~^{1@mc1lƘ@mmB6d _7@~Qlf+ӆ_6~6~!2S~6~QD6< ~ gb  ؋Rm "2S9e lcِ1x A !c5 hc lc0٨xvr^&`Q7ú1Xmc01l`hc`lc0ِ1NNzVm &211p'_^:mb Іچ;N6d o~]mp'2nmcdCs;᮶m !]1DSu!!c1֍!jC!dCC!!c11nyk9[% "E 0Ot\G}Pv) Uo.{_C=Cq={ ܫn?CCpP}\<s1!c8D T7ƨm6Ɛ ׍11XQ~[+攱pN1K6d >sXX!cjcyjcdCuc,1Vmc,1llQ0f0l̍K|<8Nmc1l8 m8lcِ1q8q8!cp㠍qj㰍dcc E16cɆpN1O6d j㱍dC6C6m8s}a8ee2k`h[&Y&[,cS,cS-c,c閱 Xele,2626262jck ͳͷ[X",߇7y\a染\/7;^k88/X5 8/q2C@5K]p'ckyϛlԈ=|[y}:o olÛl܆7᭶mx !b j؆7ِ17᭶mҕL71|\}sgkb\km`>dCk*Q6|Ȇm@>j>؆ِ1x6|6| _AJab炾𹠯چ/K6d O |6| _!cpІچ/K6d  mmbM[\k*S7&\}!OPۘmL 21ژ1ۘ@6d = {6&`Ȇhclc"h?lE&DO7MTۘmL$27&~cDlc"ِ1"6&bɆDhcDlÏld{v(Ջ}?|WL:Om#2~nma~dCphOm#2E ? ?lßl-11Eu_m'2{j؆?ِ1 h_m'2S  lc٠7lMI$\p$lcِ1:e\LRۘmL"2C@ό'mL6& ۘmLRۘmL&]˶X1Ջda;Ymc21ldhcdlc2ِ1x16&cɆkO6&mL6F[ ,71\y.@6JDo8Z\> P6Ȇ{؋m`dCu#֍l#l66)d,;&/:NQۘmL!2S`ݘ1ۘB6d lLQۘmL!2_L6mLpj4=[7vS"E'ew1U`݁x qqh֘Sw\<[7{>׃itχIjCoXLwO`}#vFlۮz0L`Z4\׃i4iF pox#PpT6Ɇצpmm ZmbdC6@@lc:xa &td:|N2]mc:1l.߻1ۘN6d k36cɆצӡjӱ #o51Ĝ l#l =fFD6d 6 !cpAFFL6|wZXg,lCjF0ِ1x ``l#l6 m 66d=& ò  !c1֍j3dC oPۘm 2ӚmPۘmu#֍l#lFm )]16lOB6B!c^4Q6fgZ=,Ę)LX7fm6f w΄{36fb3Ɇװ3vLlc&ِ1L,1bS[MYn̂uc,lcِ1xݘ,Y,!co΂ 1 ۘE6d > ژ1 ۘM6T\{`vcaݘ1ۘM6d ^l^ll!c1֍jdCuc61[mc6J6\;MPa#U6BɆF(jF(ِ1x PPl#lnBjqm~%vsĜ2)s6`sȆḿ6m6 Su9!cps9jsdcI11Eds6bsɆ{ѹ1ۘK6d [s6bsɆ甹\Fhwҽ&FanmaadCu# ֍00l#lnm }Aajac}.1l|hc|lc>ِ1"6cɆ|F8XMp s&)l=<m 66±p!cgmY[F8N6d >Cj1u&]װ 6` ȆaNaU+Y !c9eSm,6 ) j Qmde变00jFِ1x݈u#Bm#ۈ 2mDmD`dCu#ڈPۈ߇|celele,222m[f-ZVYV[,cZ:zF&fV6va"%.Q)R͑oT׸H\"|?Gk\$qTd ~^;׎T׸H\"|5.R]"l컼n˜&B-BB!cp j dCkpMPmc!l|MXXD6o=w;ib,uc6aȆm,6m,6 !b5"E"!cpEjds'XX m,VXm,&2þyblc1ِ1̜iBXm,&2Xۈ"<댉%lDAQjQFِ1Q((l#l߈FFE6d oDAQjQvC^KٺuK%jK"œ~x-y,;0OѬD}ᄍx*glxϗ\=2bEyCoK_Kq=XJw_H&b$1z\ {̥jKq=XJ"d >W,6m,6FGs6hbDG4\DmDcdCςaVۈ6ɆmDCjF4ِ1\ mDmDcFMdb,6A6aȆaFGW zg16aȆfej˰edC6A6a1d^?R1e <3IWOHpt͏qN5]Ϻ 7='W'vNN913'3'"N~pDg ʛ v/ۛ^a𰼟R;iԼ,ӖKvR;o]Լ-%KRlZjW,5KvRiݲn[j~KvRo=ZA=nj6<W8u=΃za8{{qd >xC[筶mx {3so olÛl|oxmxcdC}V6.f}ĸ(E7.m\6. o\T۸m\$2ExEE!cy"7.m\6.1=.Hgb\r|qlؾȸq ۸D6d 6.aȆ_@}%lِ1K%K؆٠ #E}๨چC6d 7|`Q6|Ȇm@>j>؆ِ1 hGm۸L6MMR{.m\6. ۸ m\V۸m\&22|el2ِ1,z6.cd'Fe61| _hWm%2 mmbdC/7|6| _!c3s_hWm۸B6R kXS5l ِ1++!cm\16lU_Q۸m\!2[#ѿ ڸm\%MmX013Ul*ِ1UU!cy*7m\6 ب!q۸F6_wfb\}6aȆ)>5lِ1W[W [܎ZװkdCk5\S۸m\'mpv㺰qڸq۸N6d 7þq]m:qldcuW U?716cɆ)>ulX޵J1n7j7dC}76n`7Ȇa֔NNV=lq716n`7Ȇ 7nm6n[;4iĸ)l܄6nm6n {~{Sm&qlf~v"&Ml&ِ1N׮:z_^ڸi|nA"nEw[pvp|x>l-zpտe*$t}xõ'>^xY^Cտq?MW_0sNkn691Z)"][wq$B0)ۦ_16nc~dcW71 ?hOm#2_+Z᧶m (19;y m 66;dcp w;;!ci#~}&lِ1g.716`wȆm܁6m6?1qW߅gw6bwɆw]l.ِ12Nxڸm%2w6bƗ_L{o܃}=lِ1}݃uOmql=h=lِ1ڸm'''oj~q_ظmW۸m'2?Ӻ$6cɆm܇6m6 lThyZdcr/fb<6@6`Ȇafѯ16l_o  !cߟzmPxm$owRo/6^b/Ɇm6^m6^ oTxm$2/j/Wd61^=+} xE6d }6^aȆ+7^m6^ ϢWj`g1bM kJF0L6d O ``l#loþm 66dB5þVxm&2E_Ykl5ِ1ӁoyiKtM k!c}khkl ٘zoļo6`oȆyyxC6d ~.Qxm!2M77v·ޚg<2g‰꿵_} ؇ݺU_kgݐٍ wW]}߳޳Nȁwpxw$Bs;h;l=ٸqdǢMM➝jﱍdCs{8GWxm'2_+õ{l=ِ1=^m=B6f&F!om`!dC06ںb8m^m 7B6B!c3Q6BF1~e01BPh#Tm#%2ombdCPU6BɆהPh#Tm#@6r=S+8->m|6> Üwspڰ:AmlL@?m|6> m|Pm M0a# S6ȆFajaFِ100l#l|M 66°psaשۚF8m h8}ppl#loþm mmcj 71>}GOH6d =G=GG!cpjdCkGhGl(dLObgOjOdCk'|Rm|"2 D6d |6>m|6"Ȇ01"h#Bm#ۈ 2mDmD`dC6"l#loD@jF$h)֔HDmDbdC6"HHl#l|hF$I6d n#ڈTۈ6>3E gg!c{v>N>m|6> ##Ym3l\3Ym3E6//Ĉ(ORۈ6Ȇg(8FmDaQdCQ\4Jm# ۈ"2mDmDa_F~gnb|6@_6`_ȆakkqչZ_/dC8o|Qm|!2E@_6`dJF41Ś הhhl#l|ވFF4M6d n#ڈVۈ6ɆmDCjva}#=1-XZlKRcŵYj-,ZBK-RKb%ԒYj-ZJK-RKcYj- ZFK-RR0NIcЯR6b81~>'O?1nss 1`] @{>u b8|b8PSǀ_Lђfb46\/ɍI6l/ɍۈI6d t/FLl#&ِ1Ӂֿj1dC6bB16bb?{}MX>r(F,l#ِ1XF,XF,!cv,oRۈm"2 ڈ ۈM6IĈmlxƉ97^<.mVۈm&2ovvlFl!cjdC6bC6bcndc /Ǯ&hm p66ܰ 7!cpnІچF6d ~mmaqa;Ĉ#8pވۈC6d >Ɓh8F!cY4Em6 8F8F\Q0:kT #7y#F\l#.ِ1q6bqɆF\7m6 ą6m6⑍Z>Ĉ7L߈G6l Om#lFptۻZv̇c˺A}_} p_ ]k 蚗?sođ^H W? ٺl]$ 2.8@-" HAh#Fl#!po&FBZa%lMyyR$THm$$2_+Pm#!l|H׊j dC3fBh#FBl#8|1&F"H6aȆK@%RHm$"2`HHD6d >c&6m$6w;H$&m$6 İo$VHm$&2abzabFb!cHHB6Z'#~5}Dm# lL+F'QHm$!2ߛ&{$jI$dC$6m$6T4I4)ܛ&UHm$%2IaHHJ6d >o$FRFR!cY4)Tm#)l~Zd# H HF6d ;wrm$6 ༑Lm#lF2h#F2l#9XßɅFrFr!cjɱdCFr8o$WHm$'27C6c)F&rfbpBm#l;;j)dCkJ PHm 2HHI6r #HHI6d 7R¾Rm#%lFJh#FJl#%ِ1HHE6lJ)Jm#lo}#F*l#ِ1>%ܧRHm"2 H HM6vxol#aHHM6d 7RþZm#5lo}#Fjl#5ِ1FjF/cbsM44}J4F!c4ji4dC6@i6`iȆ7@i6`iFKֻ2H+֔pMIHK6d ~_Zx_ZFZ!c5%-\SҪm6Ғ FZF:1&F:7Nm#lo}#F:l#ِ1tF:tF:!cp頍tj鰍dxey-21ҋy#=7ҫm6ғ HmWHm'2_S5%Fzl#=ِ1wm額j鱍 dc|٥G  62`Ȇmd62md62  odPȀmd 272@62`jQ)ᚒQm##l|S2md62 gg62bɆהFFF&ZAw39gRȄmd"2 Ȥ D6d n#Im#lF&h#F&l#3ٸц&Ff72þYm#3l|M הjdCFf8odVȌmd&2Ȭl,2a?M]'G!n6~6~$2#ƏƏdC6~6~Tl6~6wx"f,p͢B6d {_Ymd6 mdQȂmd!2Ȣn{?Fp|Z6K'K-Rir[jy,Z>K-VR+h [jE,ϖZ1KVR+i~J[jZje,Z9K8Ij!?\=A=Nus'c=Ρqd >9`s{'Ddx?519+md6  mdUȊmd%2Se{jYdC6BY6m8fsfc۹F"ҿ(T}}:-Ed0߇u٠lj̇cwΐM}ٯÿn]6xͳy6~k=[7z?~?ODW_0rp:}ODd VE?6~6ח?ͼ.ld6md6 eo6cɆ/*Fvl#;ِ1^);]m#;ltf#ȡA6d Lnz&7Fl#ِ1996r`9ȆFh#Fl#'_&FNqIN$FNl#'ِ196rb9ɆהpMɩI6d ]pNh#FNl#H&F.a#Km#lqD 4oRȅm"2\j\dC}#Km#l]m;LbM הjdCVȍm&2aȭM6d >o6rm6i]SyĹ}xnGm#RE l]z.Fl#ٯ<|F>!c}J;W-F>l#ِ1)6aȆF>h#F>l#?٨)Y_,΢6cɆF~7m6 )ᚒ_m#?l|ȯ(@6R;Lb(jdC6 @6 `ȆהpM)Q(@6d ~jhFl ٸybcŽ^jdC6 B6 bɆm6 m6 )jBdcKLBo}F!lِ1BF!BF!!cy7 m6 BF!BFa>wGL¢o}Fal0ِ1FaFa!cy07 m6 ilV(m!?9!("GWāGWDmQlFhFlِ1"F"F!c5QDmQl<;8qEa(Q(J6d ~.ZU(m%2_S5FQl(ِ1R(Qll+ylĈZgq,S6Jm6J 8C8>}RRm$Ql|( 獒j%dCkJIT(m$2Q(Q(E60>QJQJmQlo}F)lِ1R )6JaȆm6Jm6~!Uz8ah__ȆŁEml!c5 ِ1__6~6J2j(-l6Jm6J ҰoV(m&2a(Q(M6d ~Q(Qnp̯澯 ֮g~"~U.|LүW_̇cu=+(~U__W|x]$ k+eYC1 ]}2Q;(Ar c QF- eHe2jedi[Re޴,ܛU(m%2? / {DYFY!c9,#ʪm6ʒ ( mU(m#[=x('rp(Q(G6d lA9lA9rF9!c9#ʩm6ʑ U(Q(O6,25Q(Q(O6d ~nQ[W(m'2a(Q(O6d (mW(o|ˮyӋ|7],hU*[jU,Z5KVRiղj[ju,Z=KRkh5[jM,Z3KRkiZ[jm,Z;KTꁐS*WA*Wzaֿ6gi W d *WA*Wz{\*{'Dd41*+:}6*bɆ׿pQۨH6d n"QQm"Ql"QQm"Ql8*MJb] +mT6* ۹b8m8M JF%!cpJjJdC{JF%JFeUrLbM הjdCp]Ym2Ql,26ܧVۨm&2QڨQۨM6d n6Q[m6QlЛVu\Ql8ou6`uȆYYQۨC6d nQGmQl|mQۨm%K뤞Y녉QW}Յg_u6buɆF]7m6 }Յg_u6buɆujuzd/MzzLn=zF=!c=l=QۨG6d O)6aȆmԃ6m6꓍wlbpR_m>Ql|gjdCkJ}Wۨm'27C6c Ɠkn{cb4} 6` Ȇm46m46 a=lF!cp j d ~kb4}! 6b Ɇ獆phhH6d 4kJCFC!cY!Pm!шlNZ51w5rw5Rhm4"2`hhD6d 4kJ#FF#!chhL6)5KXo46cɆFc7m46 h m4Vhm4&2EC6m8jb kW&jM"̇{_M&jṀcD}دÿ>[^&kt͏ܙ5k*戦7U_4/c~:hv@3fS8c6UhAS!cIBM6b虇{h&֊fph hF6d nLmьl|lgfjͰfdCkE3hF3l9pp=h.l46m46 7g6cɆm46m46 hm4Whm ަ೉BhmPhm 2hhA6d >cSF F !cp-j-d{hhI6d LnKz&FKl%ِ1xh FKFK!cp-j-VdcNٗDwh;VjVdCE+VF+!cpVjVdCVjdquK|B1Z}JkOihM6d8"F\Ck5њl|Mi הjdC}5Zm5цl=x%ƃX&FkJ6F!cWWۨm6ڐ .qm6`mȆm6jmd^}ǹmF[F[!c l@Vm-іlo}F[l-ِ1$mjmvdcuB51ډ5\Sکm6ڑ S}J;vF;!cpvjvdCF;hF;l=rmsLo}F{l=ِ1w lhO6d n=^m=ўlF{hF{ an~a`yGGKRbu~ԺYj-ZOKRRcYj-@Km6Rb ԆYj-HKm6R0妳dǩX:u=8;vu{\q2q`qp@=N{uP8OƫBGs%Mhbt6:B6:bɆсQm#ёl{{jdC_GhFGlD&F'aImщl{N{NjNdC}6:aȆ۝NjdcЂtn͒͝6:cɆTឪFgl3ِ1FgFg!c謶B6~Z&Fa Em хlot}Fl ِ1.F.F!cp].j]dBMbM הj]dCg]nWFW!cp]j]dCkJWhFWl7y} )MD 6~6~#27z7߰Ȇ ~/oodC}7h7߰ndcLnot}F7lِ1 )6aȆ)>F7lِ1nF7nFwQ+Q|SҘEFwFw!c5;\Smt6 otWmt'2讶A6/,o:פkCmуlo}Flِ1FF!cp=j=dj|қ=Ś)=6zb=ɆE{sўj=dChO8Tm$2? mTm"/KL/^j^dCkJ/Rm"2 襶 E6d nKmћlvN=Mb jdCkJoVm&2譶M6d ~IohFo C^gƚl$Ĝj"~W.|>nw`><>$Nw~͇'`l~Їb>>te >GsD>!2}`?>$BgZ}>j}dc}]6}Ɇ!mUm%2諶K6d n/Wm/їl|諶lZ>dڟL?D?66 2dC66Pl|Cml(\gcj9L~Ӽۣو빥6aȆg~p짶G6d ~n[Sm#21A6aFhA9Mo}Fl?ِ1ww6cɆF7m6 mWm v~631@ttlcِ1x!cpjdCkhclc ٱhyMo }c@lc ِ1Liv$?Pmc 1ljdC@hc@lc٨kLAyS ۃK6aȆ;AjAdC 8o Rm "2Ajd#9E01s`lc0ِ132326cɆהpM1L6d nc01Xmc01lm)cXS5elcِ1vQm !2>!jC!dCkhclc(٘;8&P7¾1Tmc(1lqPa;1J6d 7¾1Tmc(1l\t(1Tmc(1l4&07m 6 1Lmc1l~a[ajðadC{a0ap|[1c11N6d kpp!c1jñdCkphcplc+;&ac1Bmc1lhclcِ1!cYt1Bmc1lzL&Hac$1Rmc$1lHhcHlc$ِ1v$ÎTm$211E6:9_%@sRm"2?EGm6F 1Jmc1l(hc(lc4I21F}hO1M6d nc41Zmc41l\t4<1M6d >o6Fm6Ɛf%ʘcD1!c5e \Sƨm6Ɛ c1Fmc 1l|;1ny?0߿f=,Km6RlMԦZj, Km6RmͱZj,KmR[l-ԖZj, KmRaR@1~eb ׿7d Xu{Xq2_oǍ=n,8caq1Ƒ,ob6A6aȆsqj㰍qdC{qpO5Nmc1l|mSm'%wV41 㡍j㱍dC}c<6cɆTjxlc<ِ1xmWmL ޯϟdbL6&@6&`Ȇ pn1ۘ@6d >7Os !chclc"81*snUL܉LDD!c1jdC6&B6&bɆmL6&mL6& ؚ$x;Imc1loL}c$lcِ11 6&aȆmL6&mLp>5l\mold-&EL0>uٺj̇ݺɰ3LV_o><[7^k>)t-2aMCo#9bO` ]})jSp?Bd >cN3)L!2S)jSd#Lb ;TT!cb*\+mL6 ۘ mLUۘmL%2ߛN6mL6aq/cbL}c6aȆk;́k;Mmc1l|ƜWijӰidC6A6aF/ZĘٺdg릫mL6 oLWۘmL'21ژ1ۘN6d L6mL6f̭1C|7Á1ۘA6d 7ںb8m~} lcِ1  !cp3j3d# s11fgrg:336fb3Ɇg³j3dC6fB36fb3Ɇm̄6fm6f ^b[MbޘjdCp2_mc>1l|hc|lc>ِ12ژ1X@6=X pXX@6d ,k!cp j dC6@ 6` F3jgb,g BB!c5e!\Sm,6 Xm,TXm,$2.6m,6KNX$"7m,6 Eo,RXm,"2?X7m,6 E"Eb1#k&bqf/VXm,&2aXXL6d 7þXmc1lYbQ®S;KDX%!c%jK%dC}c K6`KȆה%%RAojb,R8o,UXm,%2ߧ,jKdCo,o,UXm,%2_SBK6bƭ+^X&27m,6 )Lmcl2hc2lcِ1ˠej˰dccW&rqrkrlc9ِ1rr!cyc97m,6 )ˡj˱d?ib6V@+6V`+ȆpXXA6d ncBmclo6Vm6VGO??Ɇg??66V3vX%l6Vm6V #."*U*!cpUjUdC}cJmc݆ᘿ3I򙤿JZ_vV8G_j߇L_pK}_} ؇}&/xR_ޗ]߽y}Ymy?KmR[om6Zj,͖KmRnvZj,ݖKmRoZj,ÖKnԎ[j'9[j]ߔZiŹjxnZVum5u1ìkm]1v[ju?[׵d >mjl2_VZ?!b!VwbFn-!cml6 ߷آJ6;)`bl%numl6  mlU؊ml%2تJ6d >n6ml6uKǬ;&֔mpM٦ F6d >ol6m6!c5e\Sml6 m6mvѭ&vac;]mc;lfh銁Y]mc;lol}cvlc;ِ1xmlW؎m –_0!l6vm6v o;6v`;Ȇ7vm6v mP؁mM6:!m7jc yoɆ߰o77ِ17Nw;E NN!cyc'7vm6v oT؉m$26vm6v 7Ϛ].].!cp]j]dCg_.].!cp]jd }lbknV؍m&2حM6d nc7[mc7ln ac{`أC6d ~.Q؃m!27yclcِ1==^q<c{aثK6d nc/Wmc/l߂۫K6d >6m6iW'\`b}sm6 )Omcl|Mה}j}dC6A6aF݉\hbk~W؏m'2~z~~!c}~OٯO6d nc?_mc?ql$/|Lhlِ1xu@mql|8jdC*<mP8m$78(l6m6 NAjdCkAT8m$2j6y2۾>[wN"Ewc|}>ٺC3R_Co><Tgk~H}~py]a0W0flt`aðV8a!cahal6qD8mQ8m!2#jG#dC6@G6`GȆ׊##Q'21sp8q8J6d sniRG6bGɆg̣p%9q8J6d ~~8qp'k.lCj؆;ِ1;o6m6NLb=gj'dCgZ'~ lِ1,z΢'6N`'Ȇה v0;dR;iԼ,ӖKvR;o]Լ-%KRlZjW,5KvRiݲn[j~KvRo=:?&ܿqpăzPC j'dC}$qRm$ql/_LSbn>SjSdCR8m"2q 8q 8E6d :mR8mxϟ76 /!c}/x略mx )^pMR6Ȇ᥶m&sW,o㴸{vZm4ql|M9 הjdC}46NcɆ: mV8m!΃iL3y|rlؾt9q8C6d 7qFm ql33jg3dC} qFm qlwk㬘7yYl,ِ1qg6bgɆY7Ϊm6Β Y9qzMsb{aϩm6Α )rNmql|8sj簍sdC9h9ldC6|  lÇlo@>j>eQ޵jb\6.C6.cɆ)>el2ِ1ڗڗ6.cɆ)j _rDKWS|>Wm%2꫶m 6|6| _!c mmm8bѰ`E\Qba>w+jẆc˿nj\Q_+o><[w^+k~tͧlj~wU_U_\/c~pjWq?Jd >G\"E\*1UhUl٨rrMkboz Mm\6 ?5k5!c57q ۸F6d nqMmql8o8vĸ.u7m\6 iuM u!cpסjױdCgZסjױdTϛ7  !co lِ1r)76n`7Ȇm܀6nm6n}q7&ܛT۸m$2qڸq۸I6d 7n¾qSm&ql|ozڸq۸E68*|ĸ%[p޸q ۸E6d nqKmqlo܂}-lِ1x߸mR۸m&}11n56\Snm6n i݆gZ6ncɆm7nm6n m؆xS6 ?!cچG6d ~mmaw~wĸ#7m6 ۸mQ۸m!2Qc&lِ1;;][Lo܅}]l.ِ1r)w6bwɆ]7m6 )wjw{dȲ]71q{j{dC=8S۸m#2qڸq۸G6d ~uڸq۸O6>rE߸}}!cpjdCpڈ÷ѥo:&}l>ِ1rڸqx@6z@o=Pm!lChCl!ِ1xxm[^ktw~63wR//q?xIW_kKK^/ZR-%/IKhKl?uk㕰 x xE6d ~+x+W+!c__m6^ ϘWj`Q[}ߚbsDF0L6d 7 {``l#lF0m 66dsR71^jdC6^C6^cɆm6^m6^ )j7dšBL7o}l ِ1EoEo6`oȆol ِ1hl-٘4wo&[[z[l-ِ1xx [[!cY-Eߪm6ޒ )ojowdfQa&;aNml;h;lِ1xx;w;!cpwjﰍd#?ż6cɆ{l=ِ1{{!cw6ޫm6BƕymT01Bh#Dm#!2=~m 6B6B!cY4Q6Bߖ21BPh#Tm#%2_SBm 6B6BP!cpFF(lp(ヰ@6d nAmlhlِ1=j05 Fa6°0!c=lÆmaadCa|#Lm# #27 00l#l8_%S/\pa(jF8ِ1x}#\m#'2Æ=lF8N6d 7RyFF8llLP-ǠX&GW0|$8@GG!c}GOH6d 7>¾Qm#l|m|Tm|"=.Hfb|'O'!c5\S>m|6> m|Rm|"27>A6>admqL,ځmDN6OۈPۈ6"ȆGmD`dChE#6"!cpFFI6B8oebD@#>HHl#l|MkJF$I6d n#ڈTۈ6"ɆO6"6"d㟙AL?;Vm|&2m\1ư?Ym3lghgl3ِ1ۈ"#&1%(8oDmDaQdCF76(!cpQFFE6d }Jm|!"~/!c{{m|6 m|Qm|!2_/j_h31-EhF4M6d >oDy#Zm#ۈ&2?߈jF4ِ1hh#Zm#n?F#iŲb[jnZK-Ro`%Zj,ĖZK-RKnRZj,ԖZK-RKoe2Zj,̖ڏZ߿/isK.q8sN#kTOIOun7#+>u bd] >YX1`5w1~;FV1l̬(𬎭m'$ ! NH ŵXN]YЮř\~YfF%71m$6 0Pm#!l7Jzj dC_Bh#FBlÅlTwlM cC/.dC/.j.؆ ِ1Qa#ꢶm =\ lÅl܆ ᢶb8䕈l$C^ٺDAhH-"]l] #'R;Hdw`.ݺD2$RDo..y.<t/4\9CCUppU}W\\nl9JlyWW\\ɁJAh+1ެ+᪶mogbu[ZGmandC 6ܰ 7!c> V 7 7lÍl|p66ܰ wt&mmcdC{,ppWp6ɆmCj؆;ِ1pWp6Q6|Ȇ)>p⣶m 6|6| !cmm`Ƈ'vlb$6C6cɆm$6m$6 o$6cɆװj$dc̴I$F$F!c~# 7m$6 Hm$QHm$!2_$6m$6UNjb$hR؋&UHm$%2HHJ6d >$sJRFR!cpIjI _Q:QWl&nmbdCs/S|6| _!c 놯چ/K6d nU6 nb$ gu6aȆm$6m$6 ׍dn$SHm$#2 H HN6sJ*TF*!c ֍TjTdC6RA6Ra}*H-pNIHM6d ދhjFj!cpjdC06wFjF1ڎiĜ)i6`iȆFX7Ҩm6Ґ W 4ji4dC4F4؆nL ?aS6Ȇ{Q?؋ma~dC?NS6ȆA~j~؆?0 _}ý/ lßlچ?O6d 76 !cmmcdru41ęx&)@m# 27`m ׍X76!cmm`iEiŜ)i6biɆFZX7Ҫm6Ғ iaVm#-lν/g d#FZl#VgQ#Mt5F̡C6aȆtHHG6d >sJ:tF:!co6ҩmpIo$51ǂWzX-ҫE0wer&)={wWo.. U6BɆPombdC06;c$7ƽXCk#J6-w|S*zѬͪJ6d c3{ Y6bYɆeO|md6 ׍ndUȊmd#{ jbdu#6aȆlȦ F6d >dsJ6lF6!c8gv@6aFTrGLFvh#Fvl#;ِ1)6cɆpNɮN6d EFvFx&5L0{|=Lm# #2mmaadC6 00l#l|N sJFN6jF8m uW6ɆpomcdCsJ8jF7tMbNj9dCu#96r`9ȆȡA6d c#aW16r`d51"h#Bm#ۈ 2E#`/mD YPۈ6"Ȇ'u#Bm#I6#Xk؜j9dC߱ cSm#'l|N 甜j9dC6rB96rbƑŽ&F.a#Km#lnu#F.l#ِ1\F.\F.!cwrA6rajdb6rC6rcɆm6rm6r  mVȍm&2Hnh#Fnl#lԚt&F7"amD  mTۈ6"Ɇװp mD 叄6"6"O-"]l]>wS;gw`.|2S|o..{O}zy^z=yY&?}2w??fhp`;_ ?Ɂȯ׃$B}D~h#F~lxvhoߛDQ6 `Ȇ{,Q(@6d >WsEF!cGhFl X*MnuFAl ِ1La#aþQ(H6d c3IAFA!c=FAF!%"(6&F!Q7 QHmQlj!|F!lِ1x(F!BF!!cQHmM6 _<|&F&P4&PF4M6d ~&)IVۈ6ɆF4jF4ِ1~g4m& F(anJaa)6 cɆFaX7 m6 ׍°nV(m&2Q(Q(B6\mobsJ8Q(m!2NRWm6 ׍"nQ(m!2Q(Qۈ!__:׷#$1j1F ِ1:%Sb6b!cp1FF C6d o@1j1FQQaw,LFQhFQl(ِ1x( FQFQ!cpEjEdCEjEXNuu61bŜ XXl#lF,mĒ egc6bX!cXh#Vm#n}0/8gGeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0qTx}ܦs_5.׸8q2qqũk\qqTd k8u5.j`S׸8<œ['nb FF<O6d 7þ9^m#ۈ'29mē FF(+l6ʪm6ʒ eaQVm,Ql|N) 甲jedC6Be6blb6A6aȆm6ʩm6ʑ ׍rnS(m#2SA6aFq[ CLFyhFyl<ِ1LyFy!cp塍j屍dC6C6cȆ}kĨ ְFlِ1xQ6*`Ȇ pNQۨ@6d NmTPۨmT$';epXT딊jdCp1a FE!cpjdC6*B6*m8yU2gfC^_~I*ET0wer*{9[W w{9[W J{^ ׃tkt yWY^^Y}+zPaW8Zq=Ld GT"*ET21~gehFel 6wQEU\QEm Ql|Q?mT6 ۨmTQۨmT!21@U6`Us};gbT% ǼUvǼ!UUۨmT%2YUUIUZUdC}DUGTUۨmT%2QڨQۨF6fƃ&F56;jjհjdCu6aȆF5X7mT6 Q ڨQ ۨN69.7~Ful:ِ1ڴ:;mT6 ۨmTWۨmT'2աjձd#$;rO61jQ֍j5dCu56j`5ȆmԀ6jm6j ۨmPۨm$OfqzQًRlnJMFM!cQ֍j5dC6jB56jb5ɆmԄ6jm6jUZO2Ĩ%F-X7jm6j Q QKmQlZZjZdC{ZZjdt3Lb [akm6j )R[m6QlnԆuFml6ِ1xݨ mVۨm!C\;fuDݨF:F!c9Sm6 a5l:F!c:F:F]MguF]F]!cQ֍judCu.u6buɆF]hF]l؃319Sm6 ۨmSۨm#2QڨQۨG6d QڨQۨO6{<aݨQۨO6d >ԇsJ}F}!c*gx4W16cɆ{F}FArh Ϋ5m46 hm4Phm4 2Qac@d*Flِ1~ j d#iĚ Ŝ) 6b Ɇm46m46 lsp؈)'W16b ɆFCF#quMFF#hF#lِ1o,4Hmшl߈upzCkшl|Nim4Rhm4&GvϿh,ưhhL6d ^7úXm1јln4uFcl1ِ1xh m4Vhl>0}&x4}ckfknkaki2e{X+XkXX[-c,c-c?Y:X:Z:Y:[ƺXƺZƺYƺ[zXzZzYz[~| ոŊ޿955 qM5 qM]&]&׸&Td 3pp8ɿqMpkB5N_X㚨k\<5%E&FS5QSFS!c𽘦p/FSl)ِ1WaceWW&*FSl)ِ1FS7d221 Qloߨm|m|C6d c3"߯bhm|m|C6d 7F3{XWlֈ66'2YTqo>W166'2q㟗2F+<&F+ S7Z K֍VjVdC0kF ?JmъlFg z(VoR}CkъlFzg ӽXCkњl;ahhM6d o[Vhm&25|Fkl5ِ1)6Zcm?hܷ0ml6F!c 16lGڨm6ڐ hAQhm!2hhK6'tVԍnUhm%27~F[l-ِ1xh F[F[!c +pmɆjmF?=A<'>'Aml!cuʗrِ1996~6~ 2ltmU eob(Ən##ِ1ٺٺ6~6~$2#ƏƏdC כ8c8lܨڦ_hG6f4{&F;|Nmюlm{vjvdCsJ;8Shm#279c8lض۩m6ړo7LnuF{l=ِ1x6cɆm6ګm6ړ ?_mWhmD6a'q'x'Ȇ生OOdCsOpNIm'l'!c1Z?aƣS lt6:mt6: )AmсlntuFlِ1\jdceg11:9#S:mt6: ׍ntTmt$2a訶H6d {GhFGlp.c&F'aImщlNjNdCu6:aȆu6:mt6:7s,pN鬶L6d n3Ym3љlntuFgl3ِ1FgFA_?ibtu ]6`]Ȇmt6mt6 ׍.ntQmt!2S@]6`]Ʈǎ[]E FWFW!c^+Emt6  mtUmt%2EB]6bƀG;cbt!-d7nF7!c ֍njݰndC6A6aȆmt6mt62Up.pN鮶N6d n;]m;ѝl9lwFwl;ِ1FwFa4LY[Flِ1)=6z`=ȆFX7zm6z =j=dLhbu'=6zb=ɆFOX7zm6z  mTm$2?詶E6Ʒܬe`襶 E6d 7Fٰ E6d װ6zaȆ^F/^FoQoWMޢnuFol7ِ1)6zcɆIcM zyZdC0621jF hb, 33ِ11ޮZ?c? )?9gɆm m>0}>x bhdl262626262626262626262626262626262626262626261!>lusٺ>QW>f.ݺ>p룮g}\܃]UW1sqov;}GvZ_s8'p_Ux^Kw_U;絾@p_U絾$Bp_hF_lhuM~+C?~F?!c~6aȆ~j~dC6A6aFQE51 jdC_m?џlgjdCojdegy!cpmlcِ1x!cpj_ƆWiB6lEml!c9K `~Ckl!c mmB6d nh_d;=&@6 Tm $2/q |/q@lc ِ1%sbhm 6 C21D6bk_1H|Kl A !c a[. Rm "2S9e lcِ1xm Rm &dl,`X7m 6 v0``!c5`1L6d N m VmJ6n40g%O,ƯƯdC.~W__ɆƯn++ِ1+Ư1ͽ_CD!!c!pclcِ1x/:C6`CȆhclc(٨!ML jCdCkءp ;Tmc(1l|N 甡jCdC6BC6bF%?mb {_0a0!cpàajðadC6A6aȆa0apqoRޘÅpp!cpájñdCsp8 Wm '211A6坳;cx6>k1A6d 1oPm 211A6d nc1Bmc1l4s<{cEG^tHlc$ِ1x/:#6Fb#Ɇm6Fm6F o6Fm6FGhb6FA6FaȆQpN1 E6d o(Q(!c^t1Jmc1l<(s&hbnhaX1M6d >shh!c^/bhm6F ׍huO&Q71Fmc 1l|N1jc1dC{_c1!cpc1jcdKpbgc6bcɆm6ƪm6ƒ ca1Vmc,1lXhcXlchK.&8Q71Nmc1l8hc8lcِ1q8q8!c~c1Nmc1l}qe"ca1O6d oxx!cg3j㱍dCsxhcxlcر/1AؘmLPۘmL 2`ݘ1ۘ@6d ^7&1Amc1lnL6&mL6&~8wc1ژ1ۘH6d nc"1Qmc"1l| ;a'mL6& }M6&mL6&RY:L41& IjIdCgr'36&aȆmL6&mL6& ۘmLRۘd83ٜIJP-s&i2@'EL0wd5Y`݁˙p֘w\ܛ]˙OVɸL{~tɫ} )9dO` }NQ;r c})pbZ\S)jSdcltŠSTT!cFLUۘmL%2+¹bTlc*ِ19T4QqY}Mi4}4lcِ1Lac6aȆL2Mmc1l|1 ژ1 ۘN6M9tdtlc:ِ1c:\LWۘmL'2߷-mL6 ӡjӱdZeǏK3Dݘ  !cp3j3dC oPۘm 27f@36f`3܄R21fp%2Smc&1lj3dCsL8Tۘm$21ژ1nݗU^ae>l\<|B"bR2r J*jZ:zF&fV6vίN}a͟,6 R׸Y͢'cg:3Y7 ׸YTd ^f7K]f7jYR׸YxM6rYĘ-۳z{llc6ِ176fcɆm̆6fm6f ۘ mVۘm!8>lb}7Qۘm!2ylcِ199!ch1Gmc1liMo jsdCs\8Uۘm%21ژ1ۘK6d ޞ mUۘm#]&ِ1^|3_mc>1l|NmWۘm,0ςx hb,Z@mc<1x 6` a׍n,PXm,0OE nc@mcl%"X() :eBlc!ِ1BB!cpBlc!ِ1xXXD6҂ME~|dٸy|Hmcl|NYEjEdC"؋.RXm,"2Ejd;E6cɆbX7m,6 )ᜲXmc1l|c1Xmc1l}_DK`Dmc ln,uclc ِ1xX%!c9e Dmc lxX*ְKvRlc)ِ13ɒ~ ;U R!c֍jKdCsRhcRlc٘xX&ej˰edC2e2!cpˠej˰edC6A6a 71 ˡj˱dCro,WXm,'2XXN6d o,6m,6V6M8cxGm|Gm lcِ1  !cp+j+dC hc lc%ٸ~&JQ7VºRmc%lJhcJlc%ِ1J/Rmc%ln6Vm6VU*U*!cgm೶UjUdC6VA6VaȆm6Vm6VibpZmc5l] {jdCsj8VXm&2EWC6Vm8y1S2ɳuk`X.\{n Xv\܃^yn _kw\ܛ]ٺ5Q5{vg bs-\kq=XKw_gm³kz`ZZ\֒kjkudcۄQ넍u:u:!cs1שm6֑ w6aȆu:uzѧ^M\gj뱍dC0=f#g ׫m6֓ XmWXm'2X@6J|xhW!c`ؠ@6d d-6ml66 mlP؀ml 2ؠH6<׼QԍnlT؈ml$2ݞw{6ml66 aQmc#lmlT؈ml"4,GIM7&M&!c~c76ml66 ׍MnlR؄ml"2mlR؄ml&iz516 jdCsf8lV،ml&2 6ml66 ׍fQsyL-bN-j[-dC6@[6`[Ȇ-pN٢B6d nc Emc lt8eUUmc+l|N 甭jCsV8lU؊ml%2تF6_&mpN٦ F6d d|NMmcl6hc6lcِ1x ئ N6fzV9d wml6 ׍nlW؎ml'2خN6d mlW؎m -7kxC;`Cmclhclcِ1x/;6v`;Ȇϫ6vm6v1\I6$x눱llwq;6vb;Ɇ甝pN٩I6d ;oT؉m$2ةn}}aen^>~AoCÖ-cXƎXƎZƎYƎ[NXNZNYN[XZY[.X.Z.Y.[ƮXƮZƮYjG e.gvywk.\vQ1xk.uۅk.q2vh5n8vK]vo7X3MNncVGjdC{1^nn!cpjdCnhcnlcLkbuc{6`{ȆX7m6 t{6`{ȆT{=j{dM^hc^lc/ِ1j/\SU؋m%2ثK6d >6m6kz\U'z{>lcِ1}>}>!cp}j}dCt}jdco%MjT31֍jdC~oW؏m'2دO6d ^7C6cƠ4nb6@6`Ȇm6m6 8mP8m 2q8q8H6/5Lib6B6bɆA m6 {6bɆm6m6~#o561~όόS lfRaoja pS lF]&o!q:UE^!lِ1x8!C!!cMq8D6d ދ6m6IWqX8 mV8m&2 vXm0ql8 jdC6C6m8yn! 9[;|w"]g~}j{wᄍ7x]>΋{t3ſhGCCG?w\/cz%Ad ^"P׃?H{??66;/3qDG\qDmql{QGm6 <{Dmql|/qDmql,W).eS㨨Ga8q8J6d S79c8l>yTm(ql|mzMm6 GjGcdm^+6|cbu6aȆЎm6 8mS8m#2SA6aF$21=pOql8ِ1̜a#aþq8N6d 8|~\m8ql|N9mW8m n8& aqBmqlnu lِ1  !cp'j'dcKk51N9$SNm6N haII!cuIN9q8I6d ?&qRm$ql,mMSnu)lِ13Sp/)lِ1:\R8m"2qJmql;̽V&io4p߽yw@8q8M6d n4qZm4qlnuil4ِ1x/z8q8C611Έ9 SΨm6ΐ ssFm ql83jg3dC6@g6`g& aqCmql|ܧq۸A6d >݀  !cqCmql=s}M7 {j7dCu&76nb7Ɇ曰oq۸I6d sڸq۸E6v;&-N-N-[-!cq ֍[jC6nA6naȆ۷[j6nuMٺpZmsq.ٺmv]9yq4kVo..lmxom\=/;O螁QzpG}zp;pvp׃;@tg:w"zpDmQ۸m%I+bqWwayWm.ql|.ܷq۸K6d cޅ]l.ِ1\qڸq۸G6N&5ĸܷ7#m6 ={=!cp{j{dC6A6aƄ5/jbpq_m>ql}xF}l>ِ1xy6cɆA܇6m6z _s7!cpo7jo7dChl-HxN<㭰xxK6d n-Vm-l[h[l-ِ1xxxG6?,ukNxmSxm#2xxG6d nNml|NymSxm'fB㽰xxO6d }Wxm'2xxO6d n=^m=l4S3wbヰ@6d ދ~!clِ1H6BoqdQm|Tm|$2H6d װ6>bɆ{яG_dxǻ&_b/__dC_Km/l/!cggmmE6d ^76Rnq8os&9Ty&o(o"]x/g5o=ſIvo..<7߸|{{Wz\ wl'x'\>Ojp=D"d >W|6>m|6> Ǐ_mb|sgX>m|6> ##Ym3lghgl3ِ13Ym݆/w__z߆q|#A~#e22js[<,c1/˘e2222kKfKnKaKiKeKmKc[,ci-c,c-c ?isJh翧s W b~3~:q ='~:q 'O ΤYgb$6B 6b ɆJ Z)FBl#!ِ1K`ǒPm#!l|Km$THm.p6\  lÅl]w`چ B6d Emp!2 ᢶm$"71wwm$6 ' F6aȆm$6m$6 $6m$6\ɆOH6|MTj؆+ِ1]wW WlÕl܆+᪶m )Іچ+F68VM)npNqSp6Ȇ݂ўچF6d n pSp6ȆmAnjn؆;7znú᮶m had*ֆ;N6d Nqw wlÝl|Nq66ܱ Qк:01d?uob놏چC6d \'=Q6|Ȇ>j>؆ِ1:Q65ӟ-<`b$66vML6Rno.m$VHm$&2E^4Fbl#1ِ1xH FbFb!c9%1Xm#1lhGIy$v$F!c}$p_4Fl# ِ1$F$F!cHHJ6֧C&FRga&d6'UHm$%2S9%FRl#)ِ1FRTm#)ln$6m$6|Fw׭~71|/U6|Ɇ)p⫶m 6o0m_ _l×lF]&᫶m$#EY,v`6aȆdH HF6d ދ&h2dF2!c9%Lm#lJsᨉ\a\m#9ln$u#Frl#9ِ1x6cɆm$6m$6RyH!ְ)6F l#ِ1xHF F !c֍j)dC)j)dcȈ/341R )j)dC6RB)6Rb)Ɇm6Rm6R 6Rm6RʎS&F*1sJ*TF*!c9%SRm6R )Jm#l|NImRHm&)_kyH-l6Rm6R ׍԰nVHm&2HHM6d M mVHm8䕆l$%+ F-"]F ݁l]8kQ4o..{F}zG|j͙K7ľܷS}?\zv91xEEzG"d >WA~j~؆?hq4E_66 !cpІچ?O6d ;6 !cW6Fdb>"jFِ1^x P6ȆFjFِ1x66d~+Mnu#FZl#-ِ1xH FZFZ!cpijidCijitdcYzǏKDHF:tF:!cp頍tj鰍tdC6A6aȆm6ҩm6ғvGzH/FzX7ҫm6ғ ?{OWHm'2HHO6d -=^m#=H6lwp3Pm#$2nmbdCp"Pm#$27@@l#xywE&FQ72Am#lFh#Fl#ِ1:%\dPȀmd 2_d62md62Rcbdu##62bɆmd62md62 )ᜒQm##lmdTh>y}adGe,22bb eeeY-c9,c\ܖHXX^Xe,e,eeee,2V2V2c+j|&ոms9e_&8eR׸Le'c}^~&u˄k\&q22(e5.8`ˤqD6J7L q. R6Ȇ>]FD6d (Hm#"2mmado>41^L0܋ V6Ɇ&b*mcdC06 :c8lw~Ck#&2$V62K,FfX72md62 ac3:Ffl#3ِ1)62cɆۙj1!Fm !Q6BȆT!pMm )!FFl/=318],d#Ǭ32Y6`YȆZ,dgQȂmd!2ȢB6d n# Em# J6)*bB^LF(J6d o~#Tm#%2 mmbdC6BPPl#+ٸ򬉑9l|hgȺUm#+ln|e%Um#+l;Yw,md6 e6md65F6Mm#lljٰldCpHx<_1Ϛ}Ck#lnd6md6ok\Úod'mĿjٱdC0Fg #~6cɆ7jٱdC6C6cadNq51Du#Lm# #2anmaadCF76°0!c5lmgp&FH8HF8N6d Ӌ6ppؘ*Iꓳ}Ck#'2nmcdC6¡ppl#XMb_4͡A6d 8|fCm#l|+ʡA6d n#Cm#A6NOcbD8װ߈ GmD`dCTTPۈ6"Ȇ8DmD`dC6"l#'(RLb#'ȩI6d ^7rºSm#'lnu#FNl#'ِ1FNvC^FcMih.\v grR;ew`..^y.(r~.7fu=ϥp=M|?Mx}DnGVܸ䦻/cgu1NkDbh 791Vn[-"7IAnh#Fnl#l nrD&FXFmD B$HHl#l|sEF$I6d n#ڈTۈ6򐍊{jb}DGQȃm!2g'|g'Fl#ِ1xy6`yȆ@y6`yF[6 w71򊺑֍jydC069c8loSȇm#2SA6aɆcbsJ~8Wȏm'2N>'ɯO6d ^7ú_m#?lmWȏm #:O( FX7 m6 -P(m 2Q(Q(@6d nQ@mQl܍wmGR7 ~FAl ِ1FAQPm Ql|N)甂jdC6 B6 bd&F!aQHmQl-{BjBdC6 A6 aȆBF!BF4anmn)Lha#ڈVۈ6ɆhoDmDcdCsJ4S6h!cwhhl0S3w&FaыhaFa!cpjdCFaFa!cQ(Q(B6޺7T!QD;)ϝQ(m!2Q(Q(B6d nQDmQl|QDmC6n<#8Ĩm`1dCF 7b6b!c9%)1j1F ِ1x݈6b6bdV:71:װFQa;DXTm(QlnuFQl(ِ1x/ZE6bEɆ@6m6bҚnºmĒ ۈ6b6bX!c퉅mĒ acXXa0}8w<-c,c-c%,c%-c,c-ce,ce-c,c-c,c-c,c-cU,cU-c,c-c5,c5-c,c-cu,cu-c,c-c ,c -c,c-߇G_ Ng5,#ʪ~Y\ݗ1AY%21Be"zPD, mU(m#w?:>8)5$!Ak@B$ݽ8 ݡŭE PYet~יOϻ߬Y3{y~]X\hm4Whm4'2?g99\m9тl +R&F aBmтll{j-dC6Z@-6Z`-ȆF hF l%٨|xD1[ŽFKl%ِ1٥-٥-6Zb-Ɇ-FKl%ِ1FKF+;.`h hE6d ^7ZJmъlF+hF+lِ1 h p%Gx*+j؆+ِ1xpuUmp%2 mmbdC\ W WlÍlDUC&mmandCO6ܰ 7!c~ njn؆ِ1mmaFI*flbsJk8Vhm&2&5&Fkl5ِ1xh FkFk!cpj6d# KW11ڈwwۨm6ڐ m`Fm цl{콍Fl ِ16F6F[qU`j&F[a-Vm-іl|/- ohK6d >sJ[F[!cpmjm w1ԑ9X,J O OlÓl Oچ'I6d nT6<ɆmxBj؆ֵ^1/x昗چE6d 76 /!cp^ІچE6d ދzA^j^F'q@Sng; _tRmt"27:~F'lِ1NF'NF'!c簝Nj o1N%=L o 76 o!c~j؆7ِ1:S6 o!c mxmxc>doA}Z>9|룶m 6|6| !c놏چC6d nQ6|Feq21|E _ _l×lچ/K6d nU6|Ɇ{Q_hWm#'^u ? ?lÏlچG6d >9Om#2~Іچ>u"χ` Y:[Ƃ-c],c]-c!n^ޖPXX_X?X@ `P0pXelelel|q{k/f7k?qTd _]q'cߩS寮qS1uk9> 0%pkmt6 uo]6b]ɆFWhFWl#ll<>F7B6B!c}om )!pN Q6BȆFmt#O<6mt6 `MmэlntuF7lِ1{ݠnjݰdw^obtsJw8tWmt'2a讶N6d ^7ú]m;ѝl|NmtWm ?!7zj=dC6z@=6z`=Ȇm6zm6z VHhFl'8)_߂LFOhFOl'ِ1FOSm'ѓl|N 甞j=dCς{B=6zbFdZ:^o Rm"2`襶 E6d ^7zKmыlmRm&v51z~77zm6z  mVm&2譶M6d n7[m7J6]?V*P8mbdCBᳶPPl#lF(m )FF(чl\(p믑M>b am6 }`Gmчl>>j}>dCuGmїli=MbN 甾j}dC6B}6b}ɆF_X7m6  mUm#tOWm6 mSm#2觶G6d /觶O6yv 51֍jdCFoWm'2诶O6d o6m6flM ~k@{_6`Ȇm 6m 6 o 6`Ȇ@r|:e \ Tm $2S9e@lc ِ1x@@!cpjAdL`b uc6aȆm 6m 6 m Rm "2SA6aF/?hb kp ;Xmc01l|k01L6d N`N``!cpj!d=6189d(yg>Ko Qm !2C`1B6d ^71Dmc1l|Nm Qm %&CE1C6bCɆχ E1J6d ދPP!c11nq0MR>Yп$ I Sfa.M0[>'z$ oSao.]΋{>L}χz0ycwDzE1w8jq=Nd >W sp '2gg81\mc8F6?^Zt&lAajaFِ19a00l#lFm aFF1l/V=(c;Gm6F ׍nPm 211A6d c6Fm6F[! BG#E9#6Fb#Ɇa;}16fbhm6F w2v#6Fb#ɆHhcHlch=iVL&(1s(Q(!c1 ֍QjQdCQp1Jmc1lmRe8eI/lY9F[X",c(8xXele,262626262kMMͰʹͲͶͱ͵ͳͷ---N5. )\F7 W׸p\©fvpԸ9ӎqS4^ m 5.jp8k\8qTd ^a W׸p<&_keb6FC6FcɆp1M6d nc41Zmc41lo mVm!{1FmQm!2߷Ǩm6Ɛ 51!cpc1jcЮmL7G9Bm#ۈ 2$CmD YPۈ6"Ȇ6"6"HQ( &nDºmD )pNTۈ6"ɆTpMmD  mDmDbcƳ]?11Ɗp/fXlc,ِ1x XX!c9e,Sƪm6ƒ cjc(O}'QnDmD Q߈Rۈ6ȆmDAQjQFِ1xmDmDaF\ijb8oSm#2S9e8lcِ1q8q8!cY8qxQL &x1sxx!c1֍j㱍dCkp ;^mc<1l|<1^mc<1l|}߀i&oM d#pܱrilcِ1xݘ !c:&FJ^%Ckc1l|NmLPۘmDe>ĈF476h!c FF4M6d Nhhl#l66dc41&:m<& SEeݘ1ۘH6d ^D^DD!c~c"7&mL6& ׍DF ٠ӭf1hF C6d >9%Fm#ۈ!2mĨm`1dC6blcHݸDsMIN%Id=?IjIdC6&A6&aȆmL6&mL6& )IjdV31&~c27&mL6& ۘ mLVۘmL&27&~cdlc2ِ1d1m͘6SkXNB6lǧmL6 #)ڦ 6Emc 1lnLuclc ِ1))TѱӖ.411֍jSdCT؋NUۘmL%2ߘ 7mL6 ?k mLUۘmĒ ځ[lbĊ FF,K6d S7|16lGĪmbdCu#֍XXl#lnBjFٸ{ KM8Q7`݈Sۈ6Ȇ8oĩmaqdCu#֍88l#l|mĩmm8>fKyGjO 1.\]`:ɁcZt\ӡjӱd幏21fb+fm6f #)vA6lۮ36f`3Ȇoo1ۘA6d >Ẁ6fm6fcO;Ę)LX7fm6f ?' Tۘm$23aݘ1ۘI6d ^7fB36fbƎ*MY,,Y,!c9}?Kmc1lǜ{YjYdCuc1Kmc1l }V\&l1̆sll!c1֍jdC6fC6fcɆ˘ mVۘm!_n1i[!6m6 w΁s6`sȆ-9!c=99\6m8Ę+ 皫1ۘkV"saݘ1ۘk֫"1ژ1ۘkV"SBs6bĘ'ypN1ۘG6d 5iSۘm#21ژ1ۘG6d >̃6m6操jb6C6cɆṁ6m6 a1_mc>1l|hc|lcp Qm@Xm,PXm, 2gm,6 ׍n,PXm, 2S@ 6` F&X(XXH6d /.TXm,$2XXH6d XXD6Ыb.cX7m,6 )Hmcl"hc"lcِ1xXm,RXd8|݉0gv,22222222222222222222222elelelelelee|Tv*`ָ׸Td ^X]jkbXkb\S1x[ kbu[%dïة KDoFK6`KȆb%jK%dC6@K6`KȆm,6m,6 /31֍jKdC6BK6bKɆKz{Rlc)ِ1R2$苴Leb m,6 52e2!cg3ej˰edCg,6m,6u/Ϛ˅rr!cpˡj˱dC6C6cɆrhcrlcL hc lcِ1)+6V`+ȆpNYXA6d ncBmclT\ʟߛ+3JJ!cuJNYXI6d nc%Rmc%lJhcJlcQcXUjUdCuc6VaȆ):e*lcِ1U*Uj/c3XM6$xG^&9fyjj!cVVm6V ׍հnVXm&2EWC6VckFc71ֈ֍5jk5dCuc k6`kȆX7֨m6֐ ׍55ZѰ11: ukFԇSEɺVmc-lX jkdC6Bk6bkɆ 6֪m6֑;ebupNmcl:hc:lcِ1u:u:!cXnz8_uI]֫E0O.n=Xv\<׋ۺWo.]߭[z=_#?Vs ؠp=@w_`6z{ jp=@"d >Wl66ml66e|a+FF!cpjdCsFX-6ml66 jMd#}l.ķuu66aȆc&lcِ1^&Imclnl66ml66u,ll66ml66 nf=66cɆml66ml66  mlV،ml!K|鲉E?-!c֍-j[-dCs8lQ؂ml!2S@[6`?,jblelelU؊ml%27|16lG!nU؊ml%2E^tVlc+ِ1x mlU؊ml#uc`ئ F6d ^7Mmcl|Nmj۰mdCl6ml6^k?abl6C6cɆ):evlc;ِ1vv!c$ۡj۱dc['21v;j;dC6v@;6v`;ȆءA6d o6vm6v,s));:eNlc'ِ1NN!cp;j;dCNhcNlc٨?].].!c~c7vm6v )Kmcl.hc.l;%߉=wjaߑ Nm;l;!cpAߩm|m|G6d n;h;ﰍdȥ9v7\V؍m&2حM6d װ6vcɆm6vm6c.{`b؋Q؃m!27~clcِ1x{6`{Ȇװ{=j{de {^^!c֍j{dCuc/{6b{Ɇ^hc^lc@sjb>؋S؇m#2`اG6d ncOmcl>hc>lc?0'E~~!cpjdCs~8W؏m'2mW؏m [~q@8mP8m 2|lِ1x8!c~q@mql|n/&AN9)6bɆ8q8H6d n qPm qln6mN0,x}o;b;j2v2v2eeeeeeeeeeeeeeeeeeeeee'ϖaQ˿_H tHwH]wjk!Xk!\Q1xotF5qo>k!u;dQ_aa!c0m6 wXm0qlahal{Ao561z{ﱍɆy~dCu{X7WljcGF/:38"l6m6 ׍#nQ8m!2#fm6 8mQ8m%ʟqT<< U8m%2q8q8J6d c3ƷBno/Ql(ِ1Qv~0օݺHĀ s嫤?E`a.]me~P;\<׋'T~Spn?zpџ0􎉹+1\ݗ1\S;81r cA"zpD|qLmql#_&q qa{ql8ِ1\Qrq]gKCk8qlqhql8ِ1qƏd&Əbm#\##ِ1x##~TlFmg u7]2^ Ɇ6~6N䯳6mqB%v%vBmql晎3Fe,^<^  !c 6=q8A6d nqBmqlZ8)8q8I6d ^7NºqRm$ql|O$:q8I6d IhIl٘>/&)aqJmqlIE u6NaȆ)X7Nm6N ׍S)SitY\(ia4qZm4qlnuil4ِ1x/z6NcɆm6Nm6ΐl.$)qF'p'pFm qlhl ِ1x83!cuhl,ٸ ttX딳jgdCgYY!cq֍jgdCu,qVm,ql,YNd&91s9s9!cq֍sj簍sdCu6aȆm6Ωm6ΓΧ}Z8/l6Ϋm6Γ 8mW8m'2a8q8O6d >6Ϋm6.gb\6.@6.`Ȇ pNq۸@6d ^7.qAmqln\6.m\6._->qQظm\T۸m\$2qڸq۸H6d n"qQm"ql}E%kiLK{KjKdCs%8\R۸m\"2q ڸq ۸D6d nqImql =It&ea2qYm2ql}./g kq۸B6d o\6m\6 ǁ3WUU!c@@m\6 ?O \U۸m\%2SBW6b]f61wwm\6 ׍kn\S۸m\#2S95lِ1k5ku8Q q]ԍn\W۸m\'2qڸq۸N6d n:q]m:ql߸m\W۸m $*1.qCظmP۸m 2_܀j7dC oP۸m 2qڸq۸I6(;xvX܄딛j7dC6nB76nb7ɆMX7nm6n ۸ mT۸m"Cab-oR۸m"2q ڸq ۸E6d nqKmql߸mR۸m&3O7q[ظ mV۸m&26|ml6ِ1ymm!cqڸq۸C6:9<&1܁s;!c^Em6 ׍;nQ۸m!2w;jw6dIZLDŽwr~|'"œ|xo7I??dw`.] w'7O.7I?{tTyS>Cg1W 犟wg\~/c>gGv3?׃"~g!cΟ6~p9޹/'ȳagqܵq2v222222222eW K+ko7w-c-cXe`h222r]q6-%s+z繫qwqK5N0>g5.8߅w5.qw݅5=cK]L{=h=lِ1x?|6aȆJZ=lِ1x?|ڸq۸O6ʶ\q!x>m6 qH?آbhm6 ۸mW۸m'2~>q_m>ltyȳ&Q7@mln966> b'lِ1L/댑m|"2|'lِ1O'OgblMϢ jdCpYm3l|N jdCsg8|Vm|!B_="~_K_6`_Ȇag V,ŋB6d >|s/!c֍/j_6\w>߉0wّx$%%%%%%eeeee}cjfnaiemc28OP*w=;?.oN=埓 \'Oָ.F \PoϿk\T1l?!ЅPm#!lFBh#FBl#!ِ1FBFB!cp j Ddcgdm&F"7'rA}s"DF"!c}D.h.F"l#ِ1R:&FJ^%Ck#l|.Hm#l vN&Fbm]bm]bFb!c֍jdC}sb7'VHm$&2HHB6j?ąDm# l|. ڧKHB6d >$sJ$F!c9% Dm# l$"B_#nIɆPI6bIɆFRX7m$6 H m$UHm$%2_o'uAjIddx*:%\$SHm$#2 H HF6d c3FH/F2l#ِ1F3Æ9-'gZɰdc?E/6cɆm$6m$6 \m#9lnTtZ7ƋHA66Mdb6R@)6R`)Ȇ. ݺj)dCsJ 8PHm 2]wg oPHm$tUR))ᜒRm#%lM {єj)dC디pRm#%l|HHE6ezS\#`H HE6d >sJ*TF*!cpTjTdC06 :c|S~#chm6RGmbbkp Zm#5lnu#Fjl#5ِ1x6RcɆalpp8G3/Z4d۷YiDHF4F!cpi4ji4dC4pFm# lF>g \IVHK6 ViaVm#-lFZh#FZl#-ِ1)i6biɆm6Ҫm6ґ ځebu#6aȆm6ҩm6ґ )Nm#lF:h#F:l#=X?VHP#HHO6d n#=^m#=lnu#Fzl#=ِ1x/6m8>@65ym]8dP`a.u\w32'gݺ p#g}sTv^ {׃t+ڨI?C/a=Ȩq=Hw_ #2zd ZDF\2A62?'^ F&۞712 LjLdCdrAdRȄmd"2_dLjLdC 16f;j֬bhmd62m?kbdpȬL6d ^72úYm#3l|/<3I2md62 {Fml#+HRa&FVg0d%ʪJ6d m]Vm]VFV!c֍jYdC068c8l؎B̪F6pobdu#6aȆlȦ F6d n#Mm#l lj6lFvwjTӃ#Lۂ.ۂjٱdCgd{6cɆmd6md6 kȮA6:pjbh؋Pȁm 27r~#Fl#ِ1FF!cp9j9d#W;61r:놙s DSm#'l𽌜j9dChN؋Tȉm$2ȩE6~8S%F.X7rm6r mRȅm"2 >C˥ E6d ~m.h#F.l#7XW=aH#aȭM6d n#7[m#7l|N jdC࿿ȭC66t*`bu#y6`yȆeẹC6d ^7Gm#lFh#Fl[Q;ƙߺ𳃾uAg}--ِ1x֍o66%2-|ƷƷdCg~ m|-lv# 7m6 oy6byɆ{ѼͫK6d o6m?&0=&o+`sUUUUUUUUհմղնq0m}hOԸ|S׸|'cߟ~*5.8`ߜO]j{|S׸|xO6v_~F~!c/?_m#?QlԤL..jdC0k*Og א.CkQlnuFlِ1>]hFlÅl$u`b \om`.dCu  lÅl܆ ᢶm  hEm(H6~p|kbtAT(m$2S>)Q(H6d >sJAFA!c~ QPm QlLLBF!hF!lِ1BF!BF!!cpBjBdC6 A6 aFȴnŜR)6 cɆ }jdCt>]aFa!c8ϕ:db 6 cEFʎ("FX7m6 E`QDmQl("jE"dCFhFl(ٸ{LnuFQl(ِ1FQFQ!cg?E᳟jEdCu(QTm݆#bd#avuM0բZD1s$IG\'z}[W Vb_~S8yqtϋy1\=mcZ 8}׃W;(Aqr czPփjq=(N"d oQ(Q(A6 |z?|#JPBmQlƆ3Æj%dC6J@%6J`%Ȇ%j%dB#%^xI^Rm$Ql|Q?Jm6J ( mT(m$21KB%6JbZvm,61J9SJm6J qH})RF)!cpRjRdCuQJmQlf8trQZԍҰnV(m&24|Fil4ِ1ڴ4@Km6J ?JC6JceF[J^fbQ(m!2 Fl ِ1x(F2F!cQ(Q(K6ɸ(+FYX7ʪm6ʒ SuJYFY!cQ֍jedCFYhFYl[$}+MrκaȆrj對rdCH*boʩm6ʑ {6aȆװ堍rj對dcԍZC=VE/Z6cɆ):Fyl<ِ1x(FyFy!cp塍j屍 dĞO>11*8?FTbQw{*mT6* S*uJ F!c j dCFhFl"HQk^ELf1u"?6*bɆ+mT6* ׍nTTۨmT$27*B6*b'`bTrٰ-*mT6* Q QImQlnTuF%lِ1xݨmTRۨmT&SYFXTjdCFeoTVۨmT&2QڨQۨL6d ^7*C6*cUȆcnfE^Fl ِ1*F*F!cpU*jU*dCu QEm QlH!]&FUa*QUm*Ql|_*QۨJ6d n*QUm*Ql߂;db U6bƝ9519SmT6 ׍jnTSۨmT#2Q ڨQ ۨF6d mTSۨmT'K'01 աjձdChuFu!c=pϼFul:ِ1xQڨQۨA6sȶĨ!lԀ6jm6j ۨmPۨm 2_րkj5dC6j@56j`5FSĨ07&ٰM56jb5ɆmԄ6jm6j ۨ mTۨm$2SjB56jb˰:|DݨF-ZF-!c~7jm6j ۨmRۨm"2Zjdck31juJmNQۨM6d U}Vۨm&2QڨQۨM6d ^7jC6jcu &FaQGmQl|N:ju:dC06j;c8lRƋQۨC6d ^7@u6m·azFƖ&f斱V1W˘eeee22222ayY:YƼ-c>1_˘χK5:lWָW׸Td >Յ_]uk\]q25.8׸U׸xG6>7C&F=D=D=zF=!cm6 ۨmSۨm#2QڨQnW}0}U߭E}vI>tP_݁x߷uݯw\<Շq:,k AX~\ݗ1\ zЀ4"E41A46m46QU`b4{, KCFC!c! 6b Ɇ4tm46 B 6bȆ١MFlgFjFdC6A6aȆF#X7m46 FjdҾY01֍jdCsJc84Vhm4&2hhL6d n1Xm1фlh"l46m46 ׍&n4Qhm4!2hhB6d ~QhFl)W﷠&FSы6hSFS!cpMjMdC6BM6bMɆuo m4Uhm4#.%?kb4u6aȆm46m46 C CLmьlݳfF3fFs0bᙵLFshFsl9ِ1{{6cɆm46m46 )͡jͱdcu35\/-Ĝ)-6Z`-ȆF X7Zm6Z hmPhm 2hhI6z=RԍnThm$2FR#hI6d oFKFK!cp-j-Vdܜg\61Z VjVdCu6ZaȆZVjVdC6ZA6Zad=8Up6\6\ W!c$1PpUp6\Ɇ+j؆+ِ1 WhUmp#5MnpSp6ȆKt%mandC6ڨm6ڒd9vh+l6ڪm6ڒ 99Vm-іlF[hF[l-ِ1xh mUhmGo.lCj؆;ِ1:S6ܱ w!cj؆;ِ1 wh]mhG6&+]8 :F;lِ1̜a;¨F;lِ16$8_p\ixܫbhm6ڑ )vjdNgbֵwAֵWhm'2ahhO6d oWhm'2h@68S:9Flِ1_g 4YxZdC{yF!cpjdV?FGQm#ёlntuFGl#ِ1FGFG!c~#Qm#A6,yycC P6<Ȇj؆ِ1:S<6< !cpІچI6^zկ6< O OlÓl|oxmxbdC'7<6< O!c9T6ȆzL /N/ /lËlS/xƩچE6d >x9Km "2 Rp||T> NPD'NvI^NNjœ?>wRNo.]΋{I};zM|s'1E_zιRMwcJ7}pV;xCj޸xІچ7C6㩗&XچC6d  lÇl}چC6d nQ6|Fծ 61|E {L_ _l×l_8mbdC6| _ _l×l܆/᫶m鍉'lA~j~؆ِ1 ?hOm#2S⧶m ? ? ? ǹ/wy6,` Y:[Ƃ-c],c]-c!n^ޖPXX_X?X@ `P0pXelelel}wF;ߚ?'[!.B58q2~ᯮqS1x5_]q'c8u_v~&FطjFِ1l#l7 QF@6d >@jF hVKOM@dmʺm z;Pm#$2߷jF ِ1x66 n41Du#Hm#"2mmaAdC6 l#l|o6R6: ޟ|01:;TA[gqB`gFg!cpjdC6:C6:cɆFgF0٘i&Fا tjF0ِ1o& V6Ɇ`omcdC࿡ mmc]ȆoF21}]ӝ.j].dCu ]6`]ȆFX7mt6 )].j]dUObbtFWotUmt%2 mt6  mtUmt%2]j]Q Sg0CFꃹcsl#lFm uQ6BȆFmt#+S5.40M`MmэlF7hF7lِ1xF7nF7!c 覶 N60-{讶N6d }uWmt'2讶N6d ^7C6c=FǯR$51z=sj=dCh؋Pm 2衶A6d mPm$o:η21z =j=dCsJO8Tm$2詶I6d n'Sm'ыl(K)Kmыl|襶 E6d nKmыl|ϼKmћl (re*a譶M6d ^7zú[m7ћl9loFol7ِ1FoF(p@Z4&FnmbdC6BPPl#l|Px>LF(J6d >BjFmZ}`裶C6d FF>F!c=>pϼFlِ1Gmїl8{̩MF_hF_l/ِ1` F_!c9/Sm6 ׍F_F?yM~F?hF?lِ1F?Omяl{~j~dCf6m6􎭉_@6vI^>{1D6d >Rm "211D6d c6m 6#J01s05m 6 11Xmc01l jdC6C6cCFeb 6@C6`CȆX7m 6 [ C6`CȆ!!PpsCs臒 D?Tmc(1lf#m 6 ׍n Um %211F66^w=&0Q71Lmc1l|/| 1 F6d > Sm #21 1 N6EO~&1l$HNN6'r_r1N6d nc81\mc81ln ucplc8ِ1pF٨\sۙM0N 00l#l|3 wmaadC0N S6Ȇ 00lcC\L.j#dC؋Pm 2SF9elcِ1xmPm$,s1R#a1Rmc$1lnucHlc$ِ12)#6Fb#ɆHhcHlcوhlAxacsN16F QjQdCGg6FaȆ-wGm6F o6FmpshN8#xEX"-cc-cQq hDXelelelele,2gfnaiemckgo[`[h[a©5I<$u)\p W׸p\©7 QƅN5N}s85.׸pq2a W׸p<&wz1Z mVm&2_ojdC{hh!cy41Zmc41lrI&1!c1֍1jc1dC}7Qm!211ۈ Ӳ'鐮!'DmD`dCu#֍l#l|NsJFA6d n#ڈPۈ6"ɆG61"Hh#Rm#ۈ$2nDmDbdCu#֍HHl#l|M mDmDbcF˚cXX!c𽘱p/fXlc,ِ1x XX!c11ۈ"tU9#JQRۈ6ȆFQjQFِ1x݈u#Jm# ۈ"2QFF1l,@Lq8hc8lcِ1>8O7Nmc1l|2SƩm6Ƒ ׍q8qx"N%cS9exlc<ِ12)6cɆ~ƫm6Ɠ ׍xa/L nLuclcِ12)6&`Ȇ ߘ1ۘ@6d mhcl#lgTU#ZO 'Vۈ6Ɇh8DmDcdCF476h!c9%ڈVۈ6& ځnbLsD8LTۘmL$2aݘ1ۘH6d nc"1Qmc"1l||"1Qmc"C6zt#F 1j1F ِ1u1ۺl#lhF C6d ^7b G^Fpm$eLRda.]m$:I`݁x.p^UI?~Sp~[7 I{> ׃tK)KCoxN2>'q=Lw_0{c'L`291x= dɸL&2_L6&mL6c*kbL}GLQۘmL!2#>blc ِ1x1V)jS)dC6@S6`SFt^SŻgSgS6bSɆal:c8lŋ1ۘJ6d nc*1Umc*1l mLUۘmĒ W:Ĉu#֍XXl#lj,-b6bX!c}XomĒ ׍Xh#Vm#ۈ#"\Ĉs0?XG6l?Xmđ ׍8X76Ⰽ8!cFFG6d ^7⠍88lcٸVUFMLinLuc4lcِ1^4>Mmc1l{ijewձww-w/BqR{HpD$$B$Xpw(P{ӵ\zͧ밿Y3{ﹱedC6A6a{y=461Y^nrr!c9e9Sm,6 )ᜲ\mc9l|NYm,WXm =W5:B<'Yw0Vm6V XmPXm 2SV9e lcِ1,&Bmclj8DX)~ce!+6Vb+Ɇm6Vm6V X mTXm$2+j+ Wqp+7\6\ W!cpІچ+J6d npUp6\ɆBj*qJ)Jmcl]{UjUdC*oRXm"2Uj 71gmL 7Q7`pSp6ȆEྨچF6d n pSp6Ȇ)nІچN6*dt*`b Іچ;N6d npWp6Ɇװp 뮶m  wh]mXM6ޅX-pNYXM6d nc5Zmc5lX jdCuc5Zmc5l/Ku01ֈ22֨m6֐ XmQXm!2S9elc ِ1xXmQXm%Ӌhb6Bk6bkɆm6֪m6֒ )kᜲVmc-lZhcZlchp릝MuXuj밍udC0vv@gdSXm#2XXG6d ncNmcl&zac=^mc=l| a׫m6֓ )ᜲ^mc=lzva'| {F&f˘elele2eX|-c~m햱1Xe,22222222v2v2v2v2d;՘qQ/6NDkuۀkq2bbm5n865uۀkq2_Sm5nmFA_q016 jdC}F7oT؈ml$2بH6d بD6:vImlR؄ml"2 >٤ D6d 7o}&M&!c ؤ L6r{RocXoojdC66C66cɆfX76ml66 6C66cdZ"Gobx8'07Ńl&z lÃl܆ᡶmx 6<6< !c߭6<6<-dcӮB[Emc lIԶlئ-j[-dC6@[6`[Ȇhc G^[F n+IEl0OmVX#l;0OmVxV7O.Hj=ߪ[q={^"NJs)zwS}=q=/c k@_:=Z'$BOhSm"#%^p᥶mx zY/ /lËl|Km "2+ / /lÛlҿ[ oX76 o!cod72j؆7ِ17ܷV6ɆצІچ7C6Ɩ*PG X7|6| !c=-壶m Q6|Ȇ᣶m[-p6| _ _l×lچ/K6d o~Wm%2 mmb~d#) 71M6 ?!c} ?&S6Ȇ ?oma~dC6 ? ?lc8wsmMmlS؆ml#2FRl#g6lcِ16aȆmlS؆ml's^_>.ll6ml6 a]mc;l{j۱dCvhcvlch5U£Mhclcِ1);6v`;ȆءA6d >6vm6FNUwcb^j؆?ِ1 h_m'27a᯶m )Іچ?@6R*8t FjFِ1h#@m# 2mm`dCFFH6\~(F jF ِ1\}@@l#lFF H6d n#T6v>N41v ;j;dCN؋T؉m$2ةI6d nc'Smc'l86:L61v ]j]dC6vA6vaȆ{]ݥ E6d ncKmcl܍-~[a[mc7lnhcnlc7ِ1x6vcɆm6vm6 51֍=j{=dC6@{6`{Ȇm6m6 o6m6'01:m !mU؋m%2ثK6d nc/Wmc/l^hc^lc(o{;3M}>~>lcِ1v\S؇m#27~c>lcِ1>hc>lc?xzuou'i'?Df,6[>ݯO6d װ6cɆ~X7m6 ׍~qID%~31~7m6 8mP8m 2_kjdC6@6`ԏՆG11:S7^8q8H6d NANAA!cq֍jdC딃A!Q4xqHa5!C!!cpCjCdC!oR8m"2Cjd#9jbr jdCggV8m&2q8q8L6d ދ6m6FdAnm S:%Hm#"2'm )AFF݆#曤`M?u#jG"œ{}t:8vp\<7IG`GqD}ᄍx*v :=?bs_s夗\sXB-cG-c,ca㖱p Xee,2v2eXb-c-cg,cg-c,cq K˖xU5B=%jWQ._,߂[y-fly-ꙌJ+[0ׂ5.X]qB6ritR#D mU8m#;.㘰q 8q 8F6d c3FG6aȆ1X7m6 ׍c1cF(4mPY7#La S6ȆX:Lm# #2mmaadC6 00l8xM={jDZdC0u3F6Ϊm6Α ' 01ΉodBȜS8m#2|9lِ1x89s9!c=s9sF;M8ы^4Nm#ۈ#2qnĩmaqdCu#֍88l#lnAqjqyQ`w 3@Ϋm6Γ 8mW8m'2_j籍dC6C6cu={L ߸ j dC prAmqlhlِ1h G^F#o.kV".E'"-.\;0OmEx/E7O.}]_ɱ;;л$%X.%\.ݗ1\q .zpǼ{Kjp=D"d >W\6.m\6.:3n:hb\v0Ɇee!c2+.m\6. ۸ m\V۸m\&2_\6.m\6F +}ĈxWۈ6ɆF<jF<ِ1xgxxl#l66ⱍ+d#n-A&羅9 xjЕmF+!cpW+jW+dC6@W6`WȆ;@W6`Wן2 61q֍jWdC6BW6bWɆm\6m\6 ׍U5ѶiEBMk,kYb6aȆm\6m\6 `qMmqlm\S۸m\'>F>8jb\pr]m:ql{jױdC~uu!cqڸqnq>i&-݂-[-!com6n ׍[nR۸m"2q ڸq ۸M6xĸ-mX7nm6n ۸ mV۸m&2oþml6ِ1x|ڸq۸C6ܝcqGظmQ۸m!2qڸq۸C6d >܁s;!c;;]Lۺзuw6bwɆm܅6m6 ۸ mU۸m%2SBw6b ^։11 {j{dC=؋S۸m#2qڸq۸G6d ڸq۸O6*^X㾘S9}l>ِ12Ɇ}}!cpjdC}h}l٠_8cb<p@ml|NyjdCp@mlhl!~8x(l<6m<6 ԍb8lxH6d n!Pm!lChCl٘.'&x$l<6m<6 `Hml| am<6 xm/}xN6d ދ>ss!c^9Em<6 xmK>K$2/a=x׃$BsKhKl|m܅wLWιl"n:+lِ1x ֈWjWdCWZRxm"2 x xM6J/=㵨axxM6d G}kk!ckxxM6d oxl3 Bۺ?66$2?Ojb ׍?aSmOlO!c'ƟէsoDx7!cpo7jo7dC6@o6`oȆo7jodc=&[g0g%}YG~[Vm-l} {ѷjodC[؋Uxm%2ÆxxG6jup䉉N[6aȆ{w}xG6d o;w;!cu;h;l=HrnLNn'%7]B֍jﱍdC{؋Wxm'2S9{l=ِ1xx@6[셉A`AmljdCu6>`Ȇm|6>m|6>yC( XAQm#l|N甏jdC06j:c8lCR~Ck#l| l&L3366"2Ss_ja ׍`Km/l/!cpAmm|"Yb_|$zO D6d nIml'|'lِ1x/ L6.Np㳰L6dL6lmgg!c^3E?m|6>  m|Vm|!k۴;㋰B6d o|/!cp_/j_/dCsh 0DǙ \{GBX"XbXXRX2XrX XJX*XjXXZX:XzXXFX&XfXXVX6XvXXNX.XnXX^7|.=/}^wc ƿ7ո=_'$O m]m:q \'q \PSǀ5.K.c/!pqxG#HHH6d >%tA_BFB!c9 m$6 F j Dda_ |21m$6 #}#Hm#l|/& ڋIHD6d %6m$6mӭ>]nbXm#1ln$u#Fbl#1ِ1FbFb!c9%1Xm#1l?(cDԍ$n$QHm$!2ًa{U.Fl# ِ1xI6`IȆ$F$FRQǁ&iIEH FRFR!c}.h.FRl#)ِ1xI6bIɆ甤FRF2>ý;D/ 6aȆa)ݝ16Fnb_Hm$#2 H HF6d ^7A6aFPH"풚ɅFrFr!c֍jɱdC6C6cɆQKm$WHm 3;LF h#F l#ِ1=16r>*#Gbhm6R )`Bm#ln6Rm6RG'rOabhJ؋THm$2)aHHI6d n#%Rm#%lFJh#FJ G^FۺoRjJ-"]x/m]*[کR'QS8/Vw?bwR{J}Szy3n6RwHRwHR~j\Rݗ1x=H AjԸ&2#R>"ZDj\Rj4dcY-f51҈i6MHC6d #Yqi6`iȆjFm# l|HmQHm%9X4VH mUHm%2iaHHK6d n#-Vm#-l|"-Vm#-lMt.]t.]tj鰍tdC{^x:tF:!c31өm6ґ )頍tj鰍dz+Ǐ#=\WHm'2= z=Fzl#=ِ1FzFz!cYM d#Fzl#؜PLYL ^LF5Fc F!cp j dC62@62`Ȇe62md62A;ܝanJFa)62bɆȨH6d {F{FFF!c9%#Qm##lV&F&bF&a{@Im#lF&h#F&l#ِ1xF&LF&!c Ȥ L6^dsjbd{VfFf!cpjdC62C62cɆװj,dc׉1AsY6 \fQȂmd!2ȢB6d n# Em# l| ȢJ6ƙ3(FVN )Y6bYɆmd6md6 YaUm#+lFVh#FVl#٨Q&F61dsJ6lF6!cp٠ljٰldCu#6aȆlF6lFv ZsŜ)6c4a5lvFv\M6C6c6١jٱd#lQ 9FF!cNrNrm6r ?kPȁm 2_6rm6r e&FN1sJNFN!c=pNɧG6d ^7Om#lF>h#F>l#ِ1x/ȧn}>DrGXAX!˘eeee[X1XqX XIX)XiXXYX9Xyw Jʖ*jꖱ-c5,c5-c,w?ƥ_5.5.?8׸W׸'cw[w[k\~\S1xk\~uˏd7&( m-m-Q(@6d _P(m 2 Flِ1xoT(Q(H6~$lQ9a(Q(H6d ^7 ºQPm Ql (Q(H6d nkAhFA G^sڎ$x]|[WDN"?o+Q.\<.Ѽ΋;~4A!s^ﺐyqT ~!7O.;7`蹈7梾.ݗ1x=pEr c \+EzB"d mm`ơOdbv0}DavF;7GV(m&2?0<Fal0ِ1}ao_Xm0Ql( mV(m!QDԍ"nQ(m!2+ߊm6 (mQ(m!2Q(Q(J6x8QT|]~]Tm(Ql|Q?m6 ( mU(m%2Q(Qlӥ_u[Q7u[ooɆoaƷƷdCkoaƷƷdC66U(F6Nuov"y xS >)Q (F6d ^7QLmQlnuF1lِ1bF1bFqǷQ\[6cɆm6m6 (mW(m'2/8Q\m8QlѲQB%`QBmQl|N)j%dC6J@%6J`%ȆF hF l$9BuLnuFIl$ِ1:$\T(m$2Q(Q(I6d n$QRm$Ql\uI6}E=Q (Q (E6d ^7JQJmQl|*Q (E6d U (Q (M66JEK^Fil4ِ1ww6JcɆm6Jm6J ^(Q(C6JCQ(Q(C6d ^7QFm Ql|N)2je2dCu QFm Ql4rjci%=Ν(Q(K6d e]oU(m%2( 7ʪm6ʒ ׍FYF9qpBMMr(rj對rdCh9؋S(m#2`(Q(G6d ދ6ʩm6ʓ=731 塍j屍dCu<6cɆm6ʫm6ʓ (mW(m|G6߉~;o|ِ1x֍66#2wwdCwwjaFuIL bQۨ@6d nQAmQlߨ j dC jdKėMnTuFEl"ِ1:"\TTۨmT$2aݨQۨH6d ^7*B6*b~>ڷ51* JjJdC6*A6*aȆmT6*mT6* S*A6*ao.EmgbThe؋VVۨmT&2S*9Fel2ِ1;•;•6*cɆFehFel p< ^QEبmTQۨmT!2EmT6 ׍*nTQۨmT!2QڨQۨJ628w419*SmT6 ׍nTUۨmT%2E^FUl*ِ1RڨQۨF6ΕpjbTjpRMmQlnTuF5lِ1jyJ5jF5!cjF5jFu~bbTu:6cɆFuX7mT6 )R]m:Ql|NmTWۨn8{MR/q?=ZvI NRœ{œ|=5Ww\<x7I{A TwC1k}׀{5jzPEPA !cQCmQl}=Mι| Tl/@56jb5Ɇaltspذ}USm&Ql| 犚j5dC=fMhFMlhY;soF-lِ1xQ 6jaȆF-X7jm6j ׂ6jmԲp}"φqQr>GX]X=X}XXCX#XcXXSX3XsX XKX+XkXX[X;X{NΖ.ns_jSa=}_T;:Ն_V׸ڸզ'cMmqqqM5N_m8V׸ڸզ'cRmXjk\mِ1RڨQh@6 ?h ]j dC44Phm4 2?'餶 D6d nImщlnt6:mt6:iF31:ig6L6d cv=fgFg!c93S:mt6: ׍FgFѥ_].F.F!cp].j].dCI$]6`]ȆFhFl+pjU]a/Um+ѕl'ƑEqO}Ck+ѕlntuFWl+ِ1x mtUmt#W\&F7X7mt6 ׍nntSmt#2 覶 F6d 覶 N6<LJ.ssN6d pwpwFw!cpݡjݱdC6C6c=Ɛo\.31z9Szm6z SzuJF!cp=j=dCsJhFl'(C-eb6zB=6zb=Ɇ ꩶI6d װ=6zb=Ɇ{ўFOva.a'8e9ǣeeeeeleleleG`P0O-c-c#,cXFZFYF[XZY[&X&Z&Y&[ƦXƦZ·E5v\\_^o^ ׸^Td >_/uk\/q2q`륮qpE5N_/Xzk\/<&jϸ-l6zm6z z5UoFo!cpjdCς{C6zc}Ƥ}DoF}6`}ȆgQm!2裶C6d ^7@}6`}FmA֘}z/\oUm%2}a諶K6d n/Wm/їl|諶G6tHW*pOOmяl~j~dCoSm#2觶O6W)֛EFF!cm6 ׍nWm'2SC6cLκaf@6d@+!c1֍jdCt>!c@f5Lb2Sm 6 m Tm $211H6d nc 1Pmc 1ldq1H|#3~#3Hmc1l{AjAdC6A6aȆA AƏdi?#?mmH6d aTlƏƏj?b? ?B?mm &􆭧1ً1lJ5ʶWn Vm &2S9e`lc0ِ1``!cpj!dw611֍!jC!dC6@C6`CȆ)C:elcِ121J6ܙ.*l 6m 6 Ca1Tmc(1ln ucPlc(ِ1x m Um #V8ޱ51 m 6 m Sm #21 1 F6d nc1Lmc݆#̷uOj?E'O8n'œp~[5~Rw\<x u?{ty72?ϸLw_gX~V;׃Ɂϰ3?Qj?cɆGxE1VjñdC Wm '211N6d c6m 6F݆}41F#j#dCuc#6F`#Ȇm6Fm6F #j#_Ƒtk۴EEml!ca__Ȇצ.__Ȇmm 1l >c7F~cHlc$ِ1x HH!cg#j#dCs6Fm6FFQ(Q(!cpQjQdCs(8Rm"21 1 M6R|;e~cSF9ehlc4ِ1~h9Zmc41l|N jdChhchlc وAc11C6d nc 1Fmc 1lhclc ِ1,&1Fmc 1l,.gc;c;c6bcɆWǪm6ƒ ?~?Vmc,1ln6ƪm6ƑNUwdbuc6aȆm6Ʃm6Ƒ `1Nmc1l8hc8lcxZS)dCS@S6`S#ESE/:S6bSɆmL6mL6 ۘ mLUۘmL%2SBS6m·aYnaie262elew\<|B"bR2r J˘ele2n[m[c[k[g[o9fո S"_i7{i7 ׸iTd 7O}4uk4q2k;c8j\*M5n8`q7lɫb1]ؘmLWۘmL'21ژ1ۘN6d 3spب;x=u2|Ckc:1l|mLWۘm JR1CO0O0Cmc1l7{j3dC0u3Æבkb*_aƯƯdCt}_6~6~%2apeL_l|NUmWlc6Ǹ8c1ژ1ۘM6d x6|f<[mc61ldv[g T8}Ckc61l|N mVۘm7m]7e]x/$yq{efw`.ߋ7eXsrV.ᄍx*Vj=M}`?vЛ#9sp=Cw_=cQ;r cP=sarz*V\s9jsF9\61~g ]mwlw!cp(a_lfhoU ߱Ɇϋ]mwlc.poMbm:s6bsɆ1ۘK6d cvw3W16bsɆQ@6m6摍Kabs> 6#9iC~6Omc1lۺyۺyjydC}6aȆ"4caݘ1ۘO6d o1[Wۘm'2gu>|gu|lc>ِ1|1,sRR!cXXF6R0p#c X XF6d }-SXm,#2 X XF6d o,6m,6hOLrhcrlc9ِ1xXrr!curNYXN6d gXXA6v\ScXXA6d o  !cp+j+dC6V@+6V`+scx/c%|/cJlc%ِ1xX JJ!cp+j+dCsJhcJlÕl &nmbdCu W WlÕlpچ+J6d Nq6\6\UdK&*acJmcl*hc*lcِ1xX*U*!c8m8c 6Vandcs!`M)npNqSp6Ȇ78mandC6ܠ 7 7lÍlp66ܰ w10oL wQ7apWp6ɆvmcdCs;S6ܱ w!c7ܡ w wlc5٠_ޚEX jj!c9e5SVm6V 6VcɆjcX#X7֨m6֐ }aȢ'MXC6d nc Fmc ln6֨m6֒FX+֪m6֒ k6bkɆXXK6d nc-Vmc-l[X':X7֩m6֑ ݝ16jD pQZ밍udC6A6aȆp@6֩m6֓[^^a^mc=lXj뱍dC߮߮WXm'2aouGXn"χ`9celele222iy[|,c1?6v˘e,2hiemckgo;`;h;d;l jq mFx^Hd VJ"6ym#1:c8l]HF&1o+ M&M&!c$em&ۖ66aȆMޤ D6d ncImcl:$&fV J66cɆfX76ml66 ׍ͰnlV،ml&23g 4lV،mx-Hfbx8X aP6<Ȇ=྽چA6d ^7<`P6<Ȇmx@j7ar)L-bv[6`[Ȇ߶-j[-dC06j:c8l^Z6)oʯbhml6 )[Emc lϱ\JcsN1_[Ɇ#jCsV8lU؊ml%2޷Nml6  mlU؊mx G3.)zQO؋zmxbdCu O OlÓlچ'I6d 7 O OlËl\8zD&^nxmxa^dCu / /lËl܆᥶mx ^ІچM6oNV6Ɇ/ymxcdCཨ7E6 o!c16)꙰᭶m D9or}Ȇ-چC6d nQ6|Ȇ>j>؆ِ1Fpkg x穝B6|OJ |6| _!c9)j؆/ِ1 _hWm%21615EU6Flb9)~j~؆ِ1S6ȆmA~j~؆ِ1x ? ?lcxYMm6hc6lcِ1LN/*6lcِ1m6m6!cA6a} fbl{_vv!c5vݮN6d olW؎ml'2E^tvlc٘:Шe9Lhclcِ1x;6v`;ȆX7vm6v mP؁m /21Ŝ lßl܆?᯶m  X76 !c.!lmcdNZmbFF@6d n#P6Ȇm@jFِ1h#@m#$6>29(lBjF ِ1F T6ɆmBjF ِ1@@lc'X\nlLbc'ةI6d ^7vºSmc'lNhcNlc'ِ1NSmc'le&.ы.].!cp]j]dCR؅m"2`إ M641v֍jdC6vC6vcɆSvm6v l8M69?C6iG{`Gmclhclcِ16$eb8l8qIC6d ѫOa#Yg'-)lQ؃m%9Z519e/Sm6 {{6b{Ɇ7j{dC 7z9c8ll_d^>ߧWEM}bN}j}dCuc6aȆ{}ݧG6d }d㟟 I!bhmp|Wͻ^曤mj"œ{ݜ$'fRZœ&i?(~7O[8Io9}yS{׃tϟ *V; p8p=8@w_zpZ\#H!bhm6#O}_8(l6m6 =16l?rPm qlAhAl ِ1 ՃjCdc̈io21 CjCdC~!C!!c1m6 Oy8q8L6j:qfx0(m6 qqXm0ql|02m6 #5-$01j #i "EaFD6d o~#Hm#"2Sm AmmaGFlώ'˛Gs {l(8q8B6d|!uDmql|N9#jG#dCsh ǹ/ty6,`!PQ1Xee,2v2a;iEYƢ-c1XiY9Xeeeeee,2v2v2v2v1_`qVu p>X]q 'c$eۀwփ5.׸`q2 k\0qTd >qx !%ܛ5 al#l|MT!j!Fِ1xo{l#l| 6B6BP~wvU61Bz;C6BP!c9͡jF(ِ1*B6BP!cpFF(qlm'C&Qa(qTm(qlnuQl(ِ1QQ!c9(qTm(ql~Yk;q8M6d ^7NúqZm4qlnuil4ِ1x8 mV8m.ojqF-]x/>ۺ3psy ug`e8gw\<x΋{~F}zpy-^-lg돳pqV}zpYXΪ,91^Y~V-,gIYhYlٸ{R?3s9s9!c>79lِ1Z?Df,6;W16aȆ;A6aqdc}OL\#Nԍ8X76Ⰽ8!c3qjqFِ1x88l#lf 6188l<;RLyG<0b$9q8O6d 3aM?_8m'2S9yl<ِ1yhyl(Z._.&6 j dCo\P۸m\ 2qڸq۸@6d o\6.m\6.\]MN7. 3o .m\6. )=16l8\T۸m\$2S.9El"ِ1xqڸq۸D6v,?ow7.~%lِ1xq 6.aȆm\6.m\6. KjdcTo41.;7ƨ w%'jdCI.$6.cɆm\6.m\6. )jxQ]h?^&FnīmcdC}xxl#lF<mē ۈ66ⱍ+doW++!cq֍+jW+dC؋^Q۸muxV6pHMwwwkqw)P܊+-)@q/&H @ XYpu_\=ٿY3{~n ?' mT۸m"}ĸ%):-lِ1:\R۸m"2q ڸq ۸E6d }[-[F[Kcbga{FF6d >9%Lm# #2?LJmaadCsJm&hb6nC6ncɆmX7nm6n ?{ V۸m&2 mV۸m>5>0ߎov[q2v2v2v222a====EYƞYƞ[Ƣ-c/,c/-c,c1ז7X[;{GXee0T|{|s wH5.׸pq2qƅk\8qTd >/\]q 'c}pX5.w 7 bb}7Q۸m!2lِ1ww6`wȆm܁6m6 Un&]޾ w6bwɆm܅6m6 5]]!c.qWm.ql4[Dݸ={=!c9Sm6 ݃t6aȆm܃6m6/{=M}h}l>ِ1}}!cpjdCs}h}lٸhքMhlِ1̜a obhm<6 `@mlhl!Xh>&CoPۈ6"Ȇ8DmD`dC~"l#l)lDBjF$ِ1x HHl#lnDºmD ׍Hh#Rm#xD6^n&# N#a1GjGdCpcS#am<6 xmW6m<6ȆGx 716KQdv8%Jm# ۈ"25ÆNFE6d >WD"Jm# ۈ"2mDmDafab<}3G'|xN6d n9\m9ln71^ WjWdC{^+W+!cpWjWdC6^A6^a1dML41bĜl#lF mĐ ۈ6b6b!cuJ m&!?.?x-kX7^m6^ )Zm5l|5zxM6d ~5Zm5l<ڹ)Ax7ިm6ސ ׍7nQxm!2xxC6d >6ިm6bƆa'M51bŜ XXl#l}X>WF,K6d kXXl#lF,m%Snbu-o6boɆ[X7ުm6ޒ (axK6d n-Vm-l:]&;q&uN@6d nAmlhlِ1xm|Pm|$gQa/Qm#lnGa#Qm#lGhGl#ِ1GF٠[31D݈u#Nm#ۈ#2ũmaqdC6⠍88l#lFm|">Bbb|'؋~Rm|"2aifM O'!cpOjOdC6>A6>azV,01>^3E?m|6> S>ugg!cpjdCkgv/0B1X˘e2nyZƼ,cޖ1XB˘e,e,e2oKbKjKfKnKaKi ZRYR[XZY҇0Z3N_͟SS/S9B߿s O ^ⅠSǀ5.^b/ո/:ⓍFͶxĈ!oۈO6d 7A}s|F|!cpjdCgdC6c.dv.HgQD_J?X lÅl16lvQp6\Ȇ .j.؆ ِ1xmm` FD /319Am$6 %At 6` Ȇ &Am$6 ׍FvC^d#~k:Ul+p?5wgja.}:~rU;p;0`/<[ g Ww}sqov[ ﹫zFSn0D7wnЁځn@pԃxΕ61":y;obhEzF"d cAnjn؆;q闇iWι;ȖtG^ٲ56ܱ w!cj؆;ِ1xw wlÝl܆;᮶mx'Zmbxg:!虎چA6d nP6<Ȇp&P6<Ȇ{LhCm$ ;~s'S<6< O!c9)j؆'ِ1wm=Cwm=6< O!cT6Gy=כ^nx᥶mx 66 /!c9 )^j^؆ِ1K/hKm &%4Xn-֦pmꭶmx Ag6 o!c9)j؆7ِ1x66 6&Om`>f*b~>j>؆Y܆᣶m hGmHH6}:f#7~#FBl#!ِ1) 6b Ɇ甄pNIHH6d NIm$THmI</7|6| _!c 놯چ/K6d ^7|aU6|Ɇ_hWmHD6jk\tH`Hm#lHDjDdC{^x"DF"!cpDjd# }SH,pNIHL6d ^7úXm#1lFbh#Fbl#1ِ1xH#Wu/0r'?8ma~dC6 ? ?lÏlچG6d nS6/01Eu_m'2/᯶m  X76 !cpІچ?lzn#I`HHB6d ^7Dm# lM{$jI$dC࿽HHJ62:~YjTԍn$UHm$%2k [KTm#)lLnt&7FRl#)ِ16)Tm#)lDLH&F2X7m$6 )Lm#lHdjɰddCdF2dFrtH1 ɡjɱdC%%WHm$'2HHN6d ~&79\m#9l&F 1sJ F !c~#7Rm6R )`/Bm#lMmPHm$m+R}{_)6Rb)Ɇg Rm6R ׍nTHm$27RB)6RbdQ#@ԍX76!c)yJF@6d ^7`P6ȆFmnM8#PT6Ɇm ׍@X76@!cpFF lYf&F*Q7RJm#lHTjTdCF*TF*!c9%Jm#lTh|Lκa2&9y&<˘Zm#5lfaOM Fj!c֍jdC6RC6RciȆWE-21҈֍4ji4dCFoQHm!2i`HHC6d FiHnq8&yksZv^ˊyq&Iv\ߋ ΋ʐV}ᄍ73Ii=Oiq=HG|z1҉i:6Mp=HGw_}D:GS;HA:r c"N-"HtF:tFz O5IϙC}A^m#=ln"6cɆpHHO6d n#=^m#݆/w__z߆q|#}`XXFX&Xe,22222222222222V2V2V2V2V2V2V2V2V2V2V2Vݗ qwy9/Ak\8? 5.׸ q2??Ok\qATd /ָ u _05~lӋ&Fm ::Xm#&2aom FF0l,U%#؛f3md62 ׍ ndPȀmd 22(Fl#ِ1lh#Fl##>~WLd#^Zg$\+.3md62 25UFFF!c9%#S2md62 mdTȈmd"5#2md62 eo62aȆF&X72md62 LjiRMK ʻ dQ6BȆm@!j!Fِ1h#Dm#!27Bl#l7LPQ7BaU6BɆP8mbdC6BPPl#lݳPh#Tm#L6_*-#ӆYd&62cɆmd62md62  mdVȌmd&2j,dx3.Y:% \dQȂmd!2?w̢B6d n# Em# lmdQȂmd%71: lY6bYɆFVX7md6  mdUȊmd%2ȪF6\!𮉑M`Mm#lndu#F6l#ِ1lF6lF6!c Ȧ N6&mzq=#S9%Fvl#;ِ1xFvFv!c}p_4Fvl#;ِ1Fvh#Fvl#٨QxbLFh#Fl#ِ1FF!cp9j9dC6r@96r`9Ɇ^S)9ᜒSm#'l|#'ȩI6d {N{NFN!cp9j9\dibas簹6raȆF.X7rm6r mRȅm"2_6rm6ry5O-G~.Fnl#7ِ1x FnFn!c^47Esm6r ׍FnFSQOLl][څ {_\RBo..l]!x y!\ =Ϥ^aQ zPX} zPAa\ [" E010QXm0Ql ;"m"F!cG(Q(B6d |NRDmQl|ߢQDmQl8^8\(*֦EڴFQl(ِ1x( FQFQ!cQ֍jEdC}DQhFQlNQGsN1+~AF1lِ1bF1bF1!cpŠbjŰbdCsJ1hF1l88q(.(Q(N6d oQ[W(m'2S9Fql8ِ1x(mW(m 4QowK -<[PBmQl|mZMKm6J ׍nP(m 2Q(Q(I6-Y,~()(Q(I6d >sJIFI!cp%j%dCsJIhFIlH|0SJ9F)lِ1x(F)RF)!c9SJm6J (mR(m&7;QZ( mV(m&2a(Q(M6d YwV(m&2SJC6Jm8sM|Eo7;XQ2V2V2V2V2V2V2V2V2V2V2V2eeeeeeeeeeeeeeeeee0e-IV&wTF<+Q׸2ƕ'cWָ2W׸2Td Qu+k\q2O qe5 ʒQV( mU(m%2Q(Q(K6d ;e6beɆ翲FYF9MrbMUʩm6ʑ (mS(m#2F9lِ1x\(Q(O6ޓ9Q^(mW(m'2_Skj屍dC6C6cɆ]6ʫm6*-_MhbT6*@6*`ȆFX7*mT6* `QAmQlnT6*mT6*\&21*vEޮQۨH6d ^7*ºQQm"QlFEhFEl"ِ1FEF%Qb>DݨF%JF%!cQ ֍JjJdC6*A6*aȆ)JjdA&FeQ7*úQYm2QlFehFel2ِ1FeFe!cQڨQۨB6f&FQ7QEm QlFhFl ِ1x/ZU6`UȆCmTQۨmT%_HfbTUFUFU!cUlWUFU!cpFUl*ِ1FUhFUl٨%&F5Q7QMmQlnTuF5lِ1xݨF5jF5!c~QMmQl$ڟg~!mT6 ìSpgFul:ِ1hu/Z]m:Ql|NmTWۨm z8hbsJ 8Pۨm 2_րkj5dCsJ 8Pۨm 2Sj@56j`ߑ9SNmb|'މwwdCp1ٺ66#2_|)ߩm|m|G6d ǿL d;ﰍdIkbFMoTۨm$25aݨQۨI6d oԄFMFM!cQڨQnqȫ9[wj<[WD{?8Fk-Zv^[W &U-Zv߭~-ݯe|G6{Rldߋ U[}kzPAmXj691xQ"jzPD|O6Q[m6QlsQG?G:F!csu9:ju:dC}DGQۨm!2QڨQۨK62p᲌&F]Gԅ}D]F]!cQ֍judC6Bu6buɆF]F=JJ!&F==z{6aȆmԃ6m6 ۨmSۨm#2ӪmSۨm'1q= 51gh3jdC~g}F}!cG}؁Wۨm'2K}hF}lcS)YLFhFlِ1FF!c^Em46 ) j dcX| d31~!7m46 ) Pm!ѐlFChFCl!ِ1x/hhD6$msbv om46 hm4Rhm4"2hhD6d nHmјlw`NahhL6d n1Xm1јlh jdCsJchFcl 81R&Fa Dm фlFhFl ِ1&F&F!chhJ6~?Թ/jl4%nhJ6d n)Tm)єl| am46 ?{o m4Uhm4#uI11uJ3Ni hF6d Ni)6aȆm46m46 ׍fF3fFsksN1ߕjN6L%̛m46 hm4Whm4'2E^Fsl9ِ1WshFslٸ^rpMnuF lِ1)-6Z`-ȆF X7Zm6Z ׍F FK?61Z:װY[KalKFK!c֍j-dChK؋Thm$2hhE6:_h%):F+lِ1VF+VF+!c ֍VjVdCsJ+hF+aE~;m,cm-c,c-c,c[:Z:Y:[ƺXƺZƺYƺ[zXzZzYz[XZY[XZY[ƆXƆZƆY~ |5ոPNsjq诺5| Ƶ558i ȴV׸ָƵ'cָ׸Td >5Ƶ_w/Th#6onhC6d 7}s6F!cpm6jm6dC_hFl-ظ%M{mX۪m6ڒ ԍWڪm6ڒ h mUhm%2o mUhm#};͈Vh'F;X7کm6ڑ ׍vnShm#2hhG6d >6کm6ړŽ7l˚텍F{F{!cw[[8c8l<嗒YhO6d n=^m=ўl|NimWhmt N=;qA;vF!cv@6d tPmt 2S:@6:`ߓ?-ұ=dC0u3Fܕ M ﱍɆn|==ِ166:ѹؚFGFG!cyjdC6:B6:bɆmt6:mtpdօm͜g:.ZD'sq/~l]'r`;I݁ǿuww}sqov[ N{ ׃tZ3NUC1;ûY};zЙΰv׃@3Y-3IAghFgl poL58w좶B6d 6צ]6`]Ȇ袶B6d n Em ѕlƽռ&FWQ7ºUm+ѕlntuFWl+ِ1x FWFW!c}FWF7xukD 6aȆmt6mt6 &P7nF7!c}nF7nFwik݅FwFw!cGg Sw>ZݱdCsJw8tWmt'2SC6c=GcbsJ8Pm 2_kj=dCsJ8Pm 2衶I6V;2SԍnTm$2E{^FOl'ِ1FOFO!cw{B=6zbFcO71z ֍^j^dCF/oRm"2 襶 E6d ދ6zm6zc541zj}>dC6@}6`}ȆalrpXw}ְ뼾C6d >6m6cW kUm%2諶K6d N )}6b}Ɇװ}j}~dcHu531~7m6 |3ÆW y~Ckяl|N~j~dCF?hF?l?(y}&Fb^O6w,ȗem6 a5lF!cpjdCu?_m?1lzQKc7~clcِ12)6`Ȇ1@6d ދ6m 6 O,H6ŋH68/ Tm $2S9e@lc ِ1x@@!c11D6&u$AjAdC{_ A !c1֍AjAdC hc lc0٨ڙ7@o Vm &2S9e`lc0ِ1x ``!c9e01Xmc01l׭:CD!!c1֍!jC!dC6@C6`CȆhclc(ٸeٳߛCo A1Tmc(1ln ucPlc(ِ1PP!c11F6 ܧ1Lo 6aȆ0X7m 6 m Sm #21 1 lP+].&bN)?mm@6d ^7~uȆmmِ1p))Epp!c1֍jñdC6C6cɆװájñdvປ#u#ȆFm6F ׍nPm 211A6d ^7F@#6FmÌ|G(hX8xD$dOi閱Y-c-cs,cs-c,c-cXXZ~--|f$ոot9HT׸ƍ'co$FkH\FR1x kHukHq2q#aq#5qGs.^2ƃ9[#Zďv^Lsٺ>~T;\܃7u?]wG7fsG{^yzD=((23 >v0 ׃Q@Qjp=E"d ^FA6Faƻ%-K K1M6d ~F4E2Omc1lñucِ12)6cɆṁ6m6 SC6m8b$ᘃ-g~_(E-sqWqq7ŵ~;0_b|G=׃t[VˣCox|||/`}׃,P;Xr czփj p=X@"d ߹XXH62ĽX\5 < Pmc!lFKg wM B!cm,6 Xm,TXmJ6n ?zX צmmJ6d ^7~uW__Ɇm m++ِ1WhW_Edcmu3/119S7Wޝnnx%"E"!c𳌋YEjEdCkEXXD6d ncHmclL2ɥ&bQ7úXmc1ln,ucblc1ِ1bb!c}bvlv~EmǷ8Xϱ222elelelelelelelelelelelelelelew6vN]ݖ=},\=?%g&%T/Ȇu-5n 8Ը{K5n qK|Mk\P1x߼ָ%KFT-oK6bKɆ翥p[XJ6d >-RR!ch)Tmc)lɜgJc X XF6d ~<˿Lmcl2hc2lcِ1xXm,SXm,'#x\a߼\mc9ln,ucrlc9ِ1rr!c}rodn֘ AmmF6d ~7x7߰Ȇb~{1mmF6d n7h7߰dóי+  !cgM16l9PXm 2+`XXA6d ,xBmclđrLJhcJlc%ِ1)+6Vb+Ɇ)+:eJlc%ِ1xXXE6/yFc X XE6d ~*~*U*!cpUjUdCucJmcl86'n61V jdCVS6VcɆm6Vm6V aWC6VckFkD9kv \îQXm!2S9elc ِ1xk6`kȆ{55ZqkzMnucZlc-ِ1xX ZZ!cuZNYXK6d >6֪m6֑/n71։֍uj밍udC6A6aȆ:X7֩m6֑ )렍uj밍dC)w녍zz!c^t=E׫m6֓ XmWXm'2SC6cFS~wabl66@66`Ȇml66ml66 )Amclnl66ml66gJl(ll66ml66 mlT؈ml$2بH6d بD6<^c ؤ D6d g oR؄ml"2_nkMjMdC&hc&lc3x,ngr7ml66 a/Ymc3l jdCfhcflc (FZ51֍-j[-dCs8lQ؂ml!2S9elc ِ1--V'Mbc+تJ6d }mU؊ml%2تJ6d ol6mlpݜ+'ٺI"~0w_*Fv݁xIٺaGn;翫l{>~UzD w|lS;؆6r csM-bHm6mvQɸ"W۝}yn; 6cɆخN6d nc;]mc;lvhcvlcpp8C;`Cmclj;dC}GP؁m 2#v@;6v`;Ž=abg v³;6vb;Ɇƈ$6;6vb;Ɇ;cNlc'ِ1NhcNl1dCuX7Plnj` CmlchTEM],.x.lcِ1ق]l.].!cp]j]dCߙmR؅m&Az8cbuc76vcɆnX7vm6v a/[mc7lnhcnlcٸ?zgM=0{am6 Q؃m!27~clcِ1أK6V<]yc ;m6 ׍nU؋m%2S9e^lc/ِ1v/Wmc/ltO)Omcln4wph@m|Ckcl>hc>lcِ1vOmcl䝟-`%cدO6d ^7ú_mc?ljdC6C6cj=87~lِ1q@mql8jdCv\s~FEo7;Zq2v2v2v2v2ee/ I)ߖӖ3s K˖+k떱,c7,c7-c,caۖW͟A7}Au;kAq25 8׸T׸'c q5  &!aqHmql!h!lِ1C!C!!cqHmqlk\&a7}aa!cpjdCkpMuXm0ql|/0qXm0ql'IVϛ&Q7qDmql}#}#jG#dCuG6`GȆ##QqH LQhQl(ِ1x8 QQ!cq֍jGdCGjGcdcjީ}Mc1h1lِ1c1c1!cpǠcjǰcdCuqLm'٠/ 11ƟSmOlO!c93OD&ƟƟdCt}?66$2'ƟqzLnuql8ِ1x8qq!c~87m6 8mW8mE6nL{Kԍ`Km/l/!cpAmmE6d O<=Wph_pِܾ1/h/dcq~yhb6N@'6N`'Ȇ߉?߉?q8A6d o  !cq8q8I6=kZTqR<9 T8m$2_Þkؓj'dC6NB'6Nb'Ɇ)'j'SdG&)Q7NqJmqlnu)lِ1b^M S)!cq 8qnqos<[7䥉qN=;sj簍sdCﬞﬞS8m#2`8q8G6d c6Ωm6ΓC'V8/8q8O6d oyy!cp硍j籍dCsyhyl;M^]^AwyAmqlwr/ɽq۸@6d ~N.m\6. qڸq۸H6ĸ(\I.m\6. K"EE!cq֍jdCsEhEl 9}[E/^%lِ1KdF%lِ1K%K%!cpKjd/WQˢn\uel2ِ1xq6.cɆm\6.m\6. ۸ m\V۸m\!s;~[ĸ"l\6m\6 ۸m\Q۸m\!2_^k+jW+dChl*hz?LUhUl*ِ1UqUm*ql {ѫjWdCWjWkd#ݪ*>ׄk5k5!co]Nm\6 )rMmql5h5l:p||g㺰qڸq۸N6d >\suu!cq֍jױdCuhulһRHGml!c5ƁiVm Ȇ?nِ1x? eoY& Q7nqCmql|߸q۸A6d nqCmql|NmP۸m$_w31npMl&ِ1̜aXMl&ِ1MM!c}ћM-*V&-Q7nqKmql|r Snm6n ۸mR۸m"20 s21„0h#Lm# #2mmaadCap#Lm# #27 00l6::w&mыކmm!cumNq۸M6d N )6ncɆ)j6߇A_a-ckgo{`{hEZY[ƞXƞZƢ,c,c-cіWkXeeeeee,22}pqH9sDƅN5N5.ָpu 5.jm ﶆk\8qTd ^a W׸pِ1}{_m>ql|NjdC{1j6u#l(Zsq/^ٺFBm#ۈ 2_D@jF$hsb&Fx EmDbdC}D$#"6"H!c3~F$I6d ^7"HHlgj8[{xD6d nHmln<6m<6S徕xS!dvsl9ِ16cɆ<6cɆm<6m<6:UjbD FF4M6d oD~#Zm#ۈ&2ѰnDmDcdCsJ4m  ɔx!z}xA6d /aКܳ~Ckl h lِ1 K}YMKhKl%ِ1x/6^b/Ɇ{ї}xI6d n%Rm%lrD&+aJmlfNiG~Cklnu+lِ1JmC6f6LĈSbl#lY[ |mĐ 1Qۈ6bȆF m&O;%ZԍװnVxm&2x 7^m6^ ׍װnVxm&2_6^m6ސ4kx#l6ިm6ސ o`Fm lx7jo7dCshl#l׭b  װjF,ِ1 XXl#l|NsJF,K6d ڱFF,lv{Mx jodCo[[!c֍jodC[h[l4#jX&;Q7Nml|NywjﰍwdC;oSxm#2wjﰍd'LxjﱍdCs{8Wxm'2S9{l=ِ1LHv@6ޫm6>1՚+bb|u6>`ȆX7>m|6> ׍n|Pm| 2E?@6>`31> jdCu#6>bɆm|6>m|6> o8c 6>bqdcpO71ℍ8h#Nm#ۈ#2߈qjqFِ188l#lwKFF݆p's&i9L'e|Rda.}= >{pI+'dg>{I}?z^$JzE׃te >W|sgϸ|&2a=׃$Bgvl//o8/os%Z,c1˘e2m%ZY[,c$d䖱Xe,e,e,e,e,e,}8ޟ Y9 oBۗN$:^b/ո/:qB=BѬSǀ5.^b/ո/:ⓍI?kb6C6cɆa& &F|l#>ِ1F|F|!c89c 6c.d&.ʿN뻨m`.dCu  lÅl|%ۻm`.dCk%hEmH@6>xriE#A(_G'Ej dCo B)Fl#ِ1xߜ  6` Ȇal8c8lLLV>F؆+ٸZyM WQ7\apUp6\Ɇ+j؆+ِ1ymPt^Ump%2sa# Ǒ;†چ+F6*`b놏چC6d kX lÇl|NsچC6d >@>j>FBp FBFB!c5lKg $M FB!c16ƽ?u\obhm$6 ) ᜒPm#!K6†/᫶m  _X7|6| _!c2u16t[xrLobhmbdCu _ _l#1ULDF"h#F"l#ِ1x/6aȆaFYg Hm$"2Q#2"F"l#1٨x-:Z#x>MHL6d n#1Xm#1ldcdg %JM Fb!co&u#FblÏlx`O ?X76 ?!cp~ІچG6d S7J;coxCk#2S6&xmcdC?76 !c16ʖtGYobhmcdCg  l# ٠S\-M$n$u#Fl# ِ1xHF$F!c93Ʀ*ZI$dC6@I6`IF6\keb$FRo$UHm$%2+)|+FRl#)ِ1FRFR!c~#)Tm#)lOamLdbNIdjɰddCsJ28$SHm$#2S*8cxocZɰddCu#Lm#lPC1֍jɱdC6C6cɆFrX7m$6 ɡjɱdcٶo71R֍j)dCPHm 2'ݔ&ÆO^y}Ck#l|NImPHa8䕒l?hy}=[v)"RE{WJX#R;0᭝gRݿS?\\{Sᄍ7ٺT=0W'C/@?P\zvA91h8!*y/M \Hh#@m#$O)(@8WmbdCpcL ٰ3jF ِ1V]^ٲCk#$2+@@l#}͵6RaȆ{TpH HE6d 3쎟JM TF*!co6Rm6R9t31R jdCu#56RcɆaFmg 5ZZdCkFjFQv01҈i6MHC6d ^7Fm# l44ji4dCsJh#Fl#-و7cbLnu#FZl#-ِ1^x g Robhm6Ғ ?CK UHm%2HHG6~izzDHF:tF:!c֍tj鰍tdCSHm#2SA6aƄWkb/>hzFz!c5nJobhm6ғ HmWHm'2_æ6ҫmp|7߇}FߎovYl`hd Z2[ƲXƲZƲYƲ[rXrZrYr[XZY[ X Z Y [ƊXƊZƊYƊ[JXJZJYJ[D5JJ!͟S؋ {1Ak\8'R׸ \エqAQ1k\/l5.&Fp(ݺPujF0ِ1`h#Xm#&2 mmcdC}s0md :e6 3 j dC}s7gPȀmd 2Ƞ@6d e62md62{LO<\SnFa᧌jdCu##62bɆkg3md62 f62md62ݏ}:$ۙz;F&l#ِ1xF&LF&!cpLjLdCsJ&h#F&l#l86`b!,FB6d 8>3t\W.ALr%cfff2(333332$sz}j*{3zrH:t]{wjDdCsJ"8$RHm$"2EA6aad0N S6ȆFajaFِ1xu#Lm# #2aFFN6pޯ)f,l_Gr.\m#'27am ;(;(\m#'2FF8l4sH,):%Fbl#1ِ1)6cɆm$6m$6 ׍FbF֒D7zI$F$F!cpI$jI$dCFo$QHm$!2HHJ6^8oo#x8)|8FRl#)ِ1xI6bIɆFRX7m$6 o$6m$6 y'kb$h2؋&SHm$#27~#F2l#ِ1xHF2dF2!c H HN6P?#H7m$6 ׍n$WHm$'2HHN6d ~FrF yU#)`HHA6d oF F !cp)j)dC6R@)6R`)FkH)zєMHI6d n#%Rm#%lFJh#FJl#%ِ1xHHE6ްnJ`/Jm#lHTjTdC6RA6RaȆF*h#F* "͵uWu?jZvྟںaov;u?ól?[C<Gg9׃t˵il0C/+RóZ}Szξ{AjԸ&2jq=HM"d H mVHm! +7sFHmQHm!2+"Fl# ِ1$i$i6`iȆ6 Fm# l\8=(#HHK6d n#-Vm#-l|O+-JHK6d ^7Bi6bƴˮmbuO_Nm#l|NItj鰍tdCu#6aȆ頍tj鰍d.]eb{ZVzFz!c֍j鱍dC6C6cɆFzh#Fzl#H0Ǜd62md6 -SM,9ŬS ŰY6`YȆ'bkrmd6 mdQȂmd!2Y,jYdCYE FVFV!cuJVNɪJ6d odUȊmd%2و.ABVF6;g&ְ6F6l#ِ16aȆF6X7md6 ԍo(bhmd6>{m7.FvX7md6 ׍ndWȎmd'2aȮN6d =ᜒ]m#;lл11r9j9dCh؋Pȁm 2_j9dC6r@96r`9F+&?kbsJN8Tȉm$29aȩI6d n#'Sm#'l|ȩn;|}\x䶌屌嵌峌巌UUUUUUEXƪYƪ[jXjKWBF7\b7ͥqpE5N_.8R׸\'c(rk\.\rQ1L pjcίR׸\xM6K1B#ȭM6d >_nFn!cpjdC06~pl4 6rcyF<9]db6@y6`yȆ՛ޫ7Fl#ِ1xoFy6`yȆalñqpʍ>6m6 #XSkjydC0Wpl,缋r16byɆb½jydCu#/y6bw'F>X7m6 )Om#lnu#F>l#ِ1xF>|F~14;EF~F~!c^4?Em6 a_m#?ld6Ƿ16cF41 jdC~F!c9S m6 lXñ1I16Q@mQl1Ԁ6jm԰Ww05-emckճշ55555555EYZ[XZY[:X:Z:Y:[ƺXƺZƺYSj\u]2Մ55&8ք{55&q5Մ55&8jWS]j^ckb6jA6jaȆZpQ ۨE6d nQKmQl7mRۨe\U\[ua\[-]9G6j<ں_~cB<G缶ɝO1:p}ց{uzPԁZD\׃:F:F]RCnu:. u6buɆFUۨm%2߷ m6 Bu6bd#iebD FF$I6d ^7"a݈Tۈ6"ɆF$jF$ِ1x݈6"6"zdiN619Sm6 ÏȆխQۨG6d ~oz˨QۨG6d nQOmQlyD&F}6cɆF}l>ِ1xݨF}F}!cpjd#=&Fa@mрlj dC6@ 6` ȆFFCb[ FCFC!c~!7m46 .!|]bCFC!chhD6|P瑉HKX#FF#!c<4yhhD6d o4F#FF#!cpFjdcucMƢn4uFcl1ِ11\6Vhm4&2_6kjdCsJchFcl OL&a^ބl8^IyqJ&F!c^4ña{&jM&dCFo4Qhm4!2M&jMdQg&FSo4Uhm4%2_4딦jMdC6BM6bMɆm46m46o;h&<`mxmm hF6d ~Mn3xMn3fF3!c^Em46 )͠fjͰdL^=6LhN6loz\m9ќln4uFsl9ِ1뙛37Whm4'2͡jͱdcR2jbh ؋Phm 2Eyb86̻&"F lِ1)-6Z`-Ȇm6Zm6Z7khhI6d c'cX蝹>Z-dCu%-6Zb-Ɇm6Zm6Z h%zVm hE6d }Rhm"2 h hE6d nJmE6J&F7`mD Q߈Rۈ6ȆmDAQjQFِ1(h#Jm# hM6;w`bu56ZcɆh hhM6d oFkFk!cpj6d墁S6nuFl ِ1)m6`mȆm6ڨm6ڐ hmQhm%o(h+^~F[l-ِ1F[F[!cpmjmdCmjmvdu»k턍vF;vF;!c~7کm6ڑ hmShm#2hhO6l.^hmWhm'27~F{l=ِ1F{F{!cNC6cFg 7:jdC6:@6:`Ȇmt6:mt6: jd@6MntuFGl#ِ1)6:bɆmt6:mt6: mtTh\\K^ \;Et0exMR'wvR;dw`sMR' N~]k:sI};zЙ~.] 1:zփ׃te ^:zY3Ɂ:=jq=L"d Gt6:mt6Yobt}DGtQmt!2袶B6d n Em хl/].j]dT]FWFW!c} ۭmt6 ֯+Imt6 ׍FWF7Wͳn^׍lW'mt6 ׍nntSmt#21F7lِ1xmtSfe٧h" ܋#r^ޖ>~A!aᖱQі1q Iɖ)DS\y4pDt5.׸hq2߷hu5.j_ _qѸES1::ָhu_w1k7ߚtC#]m;ѝl|;뮶N6d uQwFw!c}FwF`彨01z -=6z`=ȆFX7zm6z _?^?Cmуln6zm6zV;džyhOa{yOFO!c֍j=dC}sO7Tm$2{B=6zbFz\oRm"2`襶 E6d >sJ/^F/!c9KmћlvԿFoFo!cvoM6d n7[m7ћlFohFolhO01~7m6 ׍>nQm!2S9Flِ1裶K6'?1&F_Q7ºWm/їlF'e F_!c^/Em6 6m6/y 'l6m6gE ^7Om&Oa6G $Gm6F )#2Bmc1l|Nj#dCHѼﮡMnucHlc$ِ12)#6Fb#Ɇm6Fm6F ׍HvE^)5E^kFS["FE~>x֍5b(sg\[7 Q?~?^[7 Qs> ׃t_ݨ5T:Coa=>q=Mg_}hGV;hr cz01׃$B=hhchlc 4fXŽL15cȆ¥1jc1dCs8WQm!2d |dlc ِ1\11K6 m}&c ƪm6ƒ  mUm%211K6d nc,1Vmc,1l{~Lfcnn8lcِ1c-Ʃm6Ƒ )2Nmc1l|NmSm'VnVc<xlc<ِ1xx!cp㡍j㱍dCmWmL Ę II1ۘ@6d ,{LPۘmL 2S&9elcِ12ژ1ۘH69LnLucDlc"ِ1x16&bɆmL6&mL6& )jIdyJ21&I&I&mL6& $6&aȆmL6&mL6& ׍I$IdSmc&1lo j3dC6fB36fbF[z^c7f~c,lcِ12 )6faȆm̂6fm6f _1 ژ1 ۘM6:w .ibuc66fcɆ۳z{llc6ِ12)6fcɆgC6fcsF܊NO21~~m6 ۘmQۘm!2ߧm6 s9jsdcG5˕11^t.Em6 ۘ mUۘm%2F mib864q/bhm6 sjsydzUĘ'l̃6m6 ۘmSۘm#27~c1_mc>l:jhb,p@mclhclcِ1!c9e@mclHkX(BX7m,6 Xm,TXm,$2E^tBlc!ِ1x/XXD6]ٷwcX,EjEdC"E"!c5"]XD6d ^7A6m8y-6E>obX-E,0|O[ֈj?^[g웃n s׃%t΁jG,}_:2K`=Xv׃%@s8W,QX!czXXJ6n>X&R߹w.UXm,%2m)|mRlc)ِ1RR!cpKjKedc~_X&zepX XF6d c.2e2!c28,SXm,#2 _m,SXm,'M+tY\}9|rr!clrr!cs91m,6 Xm,WXm :.c+`XXA6d ^7VBmcl hc lcِ1tBmclXnHc+E1Vm6V  ۭVm6V )+ᜲRmc%lX mTXm"VX%*Q7xUjUdCȬȬRXm"2EW^t*lcِ1$UjdkhbS)FOȞDXXM6d ?ßH,bhm6V ׍հnVXm&2j5d#z'o721ֈ51֨m6֐ k`Fmc lhclc ِ155Z\53Z6cZlc-ِ1ZVmc-l|NY 电jkdC딵Z:/)D6aȆ:X7֩m6֑ XmSXm#2_6֩m6֓7=8cgbl$-&6֫m6֓ ߏn=zz!c9e=S֫m6֓ 롍j뱍 d옿i O O16ml66 )Amclhclcِ1ؠH6s4fca#,~ 66bɆװvFlc#ِ1FF!c^t#Qmc#lݵѦ&&ol&M&!c~c76ml66 n66aȆ&hc&lc3٘pmMbN jdCsf8lV،ml&2E7^tflc3ِ1x mlV،ml!u]("^ϵEآB6d ^7Emc l|N-j[-dChclc+H0d&VQ7ºUmc+lnlucVlc+ِ1x VV!cp[6~aw01xlmbmckgo;`;h;d;l;b;j;f;n;a;i;e;m;c;k;g;o`hdl?L ո:Sq1Ũk\ q1Td >/F]bp'c/1k\ 81Ũk\ e &ll6ml6 Mmcl|mj۰mdC{۠mj۰dOcu51 ۡj۱dCm_ۺ]mc;lnlucvlc;ِ1j;]mc;ld>ihc؋bvm6v );Cmclhclcِ1x߼ءI6}~twcxNj;dCsN8T؉m$2ةI6d cةE69]OOcx.Z]j]dC6vA6vaȆpw=]j]dC.hc. "_̵uE^vEbabw`=>=GwE}}s`co/>zyazEg7jq=Md "vzD6vm6%gb?s{;Z{6`{Ȇ٣C6d G}=!c{{6m6cKAL99j{dC}^GU؋m%2ثK6d ^7B{6bƘZ.hb!_COmclfmZña{}j}dC<yOmcl|bOmclTr&~o~~!c}pb~lc?ِ1x~~!cد8@6>bb{ O.q@mql}d9q8@6d nq@mqln6m6m38(UAA!c~ 7m6 [6bɆm6m6v'287h}Y=kdm6 )rHmql!h!lِ1C!Ca8˱G:0\V8m&2a8q8L6d n0qXm0qlahalHEfb؋Q8m!2GDݐ16`GȆm6d #!cpG#jGdِkb6BG6bGɆm6m6 2Ql(ِ1GjGcdc]v31^Em6 8mS8m#2`8q 8F6d ^7A6aFJ5`bϯϯW8m'2q8q8N6d =.ְ2ql8ِ1q k- &'Ĝr)'6N`'Ȇ=!ɕ16N`'Ȇm6Nm6N }6Nm6N RlbsI8T8m$2q8q8I6d >sII!c~$qRm$qlD8)S)!cׁՐ16NaȆ)X7Nm6N 8mR8m&;21Nq֍jdCq8M6d ^7NúqZm4ql|N9 mV8m!Oh7iqF8mQ8m!2q8q8C6d =װg6`gȆm6Ψm6Β?|fY&YN9 )g6bgɆ)g:Yl,ِ1gGvaa16bgɆm6Ϊm6Α 獥61Ήq֍sj簍sdC6A6aȆs8q8G6d nqNmql+kW8m'2S9yl<ِ1xq6cɆ7C6cF4N:ĸ X7.m\6. ׍ n\P۸m\ 27.~lِ1  Ev甃 Lo/m\6. a/5EE!c9"S.m\6. a/B6.bƽkMKn\u%lِ1xݸ%K%!c9=1Up_ڸm\"2%h% 暤sqL 5I+/E\0|O$]5esgeQ\Voί9>ܹ˲[}_Xq2v2v2v2v2v2v2v2v2v2v22222k{b{j{f{n{a{i{e2222222g]^'v)WľoE]Ůy U1kWvE]Ϯy 3vE]ٮy U6wE]*pބrdžYG_%Ǹq۸J6d ?z]%Ul*ِ1x?|W6bWɆrڸq۸F6F4aqM`?|Mmql|cq ۸F6d 6aȆ5h5l:ؚ`RLuhul:ِ1O]?%chm\6 ۸m\W۸m\'2_G_6m\6n1_cbu_~Cmql|\?P۸m 27n~ lِ1rڸq۸I6 RcbM؋T۸m$2y}Q5O džRj7dCMoT۸m$2SnB76nbFOZobs-8R۸m"2_܂[jC6nA6naȆm܂6nm6n#'+q_m>l.vDx!c~7m<6 xmRm%lnuKl%ِ1KK!cp/j/WdOswx%+X7^m6^ ׍WnRxm"2S^9+lِ1+h+ "_͵uWfk~W_"}?ӵuju•ȯ웃n _W\^9X~g ע5}M_õk׸&2oYd ׸&2j7dF?>gbEvoȆYQxm!2+l ِ1xo6`oȆ77[w}71ފ=pO[l-ِ1xx [[!c֍jodCu-Vm-lixٷ0l$-&?wjﰍwdC22Sxm#2|wjﰍwdCwjﰍdcߜ721ދp{l=ِ1=\Wxm'2xxO6d >6ޫm6>t@6\9fo!_AmljdCkpmAmln|6>m|6F赹z\31D88l#lhFG6d ދ^4Nm#ۈ#2qFF݆s3_q >^1o˘e2gX-cA`Xe,e,e,e,e,2MAq~ ]SZa {p8%B+~ly [ǩcDz+< GeǩcDz+< Geǩc:E66_7M pzKm "2Q襶mx ^?R6Ȇ{/hKm &G䶉-lxCj؆7ِ1Lذچ7M6d z[m&2s66 71| hGm!2}Q裶m  X7|6| !cmm`d#+†/᫶m 6|6| _!cJpW髶m Іچ/G6-8|/#/#Om#27`᧶m )~pNS6ȆmA~j~؆?!&mmcdC6  lßl܆?᯶m )Іچ?@6;Fm ? P6Ȇװp m ߣ:P6_b_^m T6Ɇ{@؋mbdCsJ mK-Ab+}maAdCsJS6 !cpAFFD6d n#R6:ߛ9pGF0L6d n#V6ɆmCjF0ِ1`h#Xm#!On쥉"F!j!Fِ1h#Dm#!2N($]'m !FFlJLxF ݿk#`ٗ6 EJ2K$>(W@ۻac''z>)?j;IA1A쓂B?Fg}?|| ^%\^CߜWw'+wZN~Ws7~WC=ߏݩt`op9ߋ9?qK_|+9?;+c}\5C]l~+@-;H)/WMWZ4ќc |^4u@hO~N\\g*K89 wꝋ>thBCt'b{v5qUawyчk?v4; o'֠oՉs3n#ޮD?+ck[|ߺMv+,y:\ 1ځ_}Q/WPav&'G$uo]\C\C3~M[VϿsZ>~BaetW&s?D72..C\?FsNkgr?~` jjjt{Mr%qSr}u܂?ݕh߇܏qX*8U;(iMGo9K)K_OBz8GΗ?P^t#]!A_??BQPp-j?I=?qcO߱ &IHIH;~}9-G@xaN ~i}Ĵ> nlZ('3-y*[<8-x݉??-Biwgjm59#g' '׎/'Tq/7 y܏jOh~\.g}.,8r[?(NQ [xǚ(h 3333̲bh1333[xcvx/O|U՝ՕgV:u2ҭb?|G@ӼǓoG$ CX,P$"D#:"6qK<Ⓚ$"1IHJ2"5iHK:ғd"3YJ6"7y(?(H! S8%(I)JS<H%*SJ5S{ס.OCʷ7?T)P;U@m=v #&E +/l;?/Hb_󺷒w}ͫ&Ziv#AvoD,oMZ熁Z_yM@z.oU%B?Ikg: _󥿧G_ DyҌדZiC@}hG{:БNt ]Fw'Mҏֿ"ޫџuɟ->pDmum࿦~Z _? -_'lb/f_O1 Lo鿒??= hڲ$ C}R+X.ϔmX iH@E&;"fȠ  (x MX0O|1`[?~~V'N (uObc1e)`z3k9*_I{g]5 hJܤu:oױAں,f?;yG"3Sy&3dd :o&l߮[4jԤCav6 3[ 6_Qﭫ֮cN+u{ѿm_=;`kЦIm䯅U7$/Y>)(S<ͧ#oP~6`y6`c݀]>ޖI@cySAo#z^@](ۢQv5휠hwCt, <2G?7H@ᒇ1'pW]Kֳӧ WǾq|7mڢQO^ h4ǟ_$ݟK.C? ، lFA=/g{< Zz~A"N#/пpF02_q41eĿi2S43a9,dYҿrVUjְugf3mlg;w9a/~ 8r$8͙9s:ƾr&w}G< Oys^W oy{>| _Ɵ 0p@9P !ZB#<H$"D#:"C\$$IBIAJR4%@F2,d%ANr<%)@A Q")AIJQ2@E*Q*@UQԤC]Q4iBSќiC[ўtBWѝC_/ dP1dX1 LdT 4b6s<泀,b1KX2'V&_cugf3mlg;n}rCG9qNpS g9y.pK\ Wunp[w}G< Oys^W oy{>| _Ɵ_ %tgMD "L|O b!.O$!)JAJR4%@F2,d%ANr<%)@A Q")AIJQ2@E*Q*@UQԤC]Q4iBSќiC[ўtBWѝC_џ@1! eHF11eD&1)LeәLf19eYB%,eYJVYZֱ ldVd^Aq#9INq3E.q+\׹Mnq;yC'<yK^7G~/|!(w-P(B#<H$"D#:"6qK<Ⓚ$"1IHJ2JAJR4%@F2,d%ANr<%)@A Q")AIJQ2@E*Q*@UQԤC]Q4iBSќiC[ўtBWѝC_џ@1! eHF11eD&1)LeәLf19eYB%,eYJVYZֱ ldVdWпc?0G81s4g89s\2W5s6w=<1Ox3󂗼5ox;'~3_7O``;BP& a Gx"HD& QFt'1El7`N|D$& IIFrRT& iIGz2Ld& YFvr\&yG~ PBE)FqJPR e)Gy*PJT ?PjT5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~g?2A fCpF0Qf cx&0ILf Stf0Yfs|E,f KYrVUjְugf3mlg;n}rCG9qNpS g9y.pK\ Wunp[w}G< Oys^W oy{>| _Ɵ . BPAHB0%@D"(D%$C\$$IBR$ICZґ d$BV$C^)BQQ)CYQ TTթAMjQ:ԥi@Cј&4iAKZњ6@G:љ.tAOzћ> dP1dX1 LdT1d\1,dYRd?5eF6-/leNv=e99Qq9Yq \Uq]q<ySy[|7>;W?<#8"4aK8D"2QJ4=1I,b#> HH"$#9)HI*R#=H&2d#;9I.r#?(H! S8%(I)JS<H%*SJ5SԢ6uK=Ӏ41MhJ3ӂ5mhK;Ӂt3]J7Ӄ7}K?3 3 c8#(F3c<$&3Lc:3,f3c> X",c9+X*~b5kX:ֳlb3[_6b7{>s_9!s8'8)Ns<%.s\:7-ns>x#<9/x+^󆷼=o|w>| %$ CXD$BTALb8%I@B$$%IAJR4%@F2,d%ANr<%)@A Q")AIJQ2@E*Q*@UQԤC]Q4iBSќiC[ўtBWѝC_џ@1! eHF11eD&1)LeәLf19eYB%,eYJVYZֱ ldVd^Aq#9INq3E.q+\׹Mnq;yC'<yK^7G~/|R#8"4aK8D"2QJ4=1I,b#> B/*IL %HMҒd #L 'Mü (LR┠$(MRT"L~*ըN jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/~d 2`$2L`"2`&2,`!X`%լa-X6lg~a+va/~ 8r$8r\"r&rS0E(J1S4e(K9ST2UT:5I-jSԣ> hH#ӄ49-hI+Zӆ=H':Ӆt;=I/zӇ? b0C03b4c83Lb2S43b6s<泀,b1KX2'Vc=&6lc;;.vc?0G81s4g89s\2W5s6w=<1Ox3󂗼5ox;'~3_7 Gz B9lw $MD "L|O b!.O$!)By]$ICZґ d$BV$C^)BQQ)CYQ TTթAMjQ:ԥi@Cј&4iAKZњ6@G:љ.tAOzћ> dP1dX1 LdT1d\1,dYRd?5eF6-/leNv=e99Qq9Yq \Uq]q<ySy[|7>;W#8"4aK8D"2QJ4=1I,b#> HH"$#9)HI*R#=H&2d#;9I.r#?(H! S8%(I)JS<H%*SJ5SԢ6uK=Ӏ41MhJ3ӂ5mhK;Ӂt3]J7Ӄ7}K?3 3 c8#(F3c<$&3Lc:3,f3c> X",c9+X*~b5kX:ֳlb3[_6b7{>s_9!s8'8)Ns<%.s\:7-ns>x#<9/x+^󆷼=o|w>|NL|GBЄ!,O"D!*ш &M$ !HL %HMҒd #L 'M (LR┠$(MRT"L~*ըN jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/~d 2`$2L`"2`&2,`!X`%լa-X6lg~a+va/~ 8r$8r\"r&r HH"$#9)HI*R#=H&2d#;9I.r#?(H! S8%(I)JS<H%*SJ5SԢ6uK=Ӏ41MhJ3ӂ5mhK;Ӂt3]J7Ӄ7}K?3 3 c8#(F3c<$&3Lc:3,f3c> X",c9+X*~b5kX:ֳlb3[_6b7{>s_9!s8'8)Ns<%.s\:7-ns>x#<9/x+^󆷼=o|w>|G!(w $MD "L|O b!.O$!)HN RԤ!-HO2d!+Nr!/O R((N JRҔ,(O*RTRԠ&MR4!hLҌ洠%hMҎt#Lҍ'Mҏ G2 a(F2ьa,&2La*Ә f2a.,a)X VXֲl`#~`'Wr(8 NrӜ,8.r\*׸ nr.<)x ^׼-x>|+&A pM+"Z"4a@8D"2QJ4=1I,bNB|D$& IIFrRT& iIGz2Ld& YFvr\&yG~ PBE)FqJPR e)Gy*PJT ?PjT5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~g?2A fCpF0Qf cx&0ILf Stf0Yfs|E,f KYrVUjְugf3mlg;n}rCG9qNpS g9y.pK\ Wunp[w}G< Oys^W oy{>| _\;$0AJ0!I(B#<H$"D#:"6qK<Ⓚ$"1IHJ2"5iHK:ғd"3YJ6"7yK>S0E(J1S4e(K9ST2UT:5I-jSԣ> hH#ӄ49-hI+Zӆ=H':Ӆt;=I/zӇ? b0C03b4c83Lb2S43b6s<泀,b1KX2'Vc=&6lc;;.vc?0G81s4g89s\2W5s6w=<1Ox3󂗼5ox;'~3_7 b; BPAHB0%@D"(D%$C\$$IBR$ICZґ d$BV$C^)BQQ)CYQ TTթAMjQ:ԥi@Cј&4iAKZњ6@G:љ.tAOzћ> dP1dX1 LdT1d\1,dYRd?5eF6-/leNv=e99Qq9Yq \Uq]q<ySy[|7>;W L|GBЄ!,O"D!*ш &M$ !HL %HMҒd #L 'M (LR┠$(MRT"L~*ըN jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/~d 2`$2L`"2`&2,`!X`%լa-X6lg~a+va/~ 8r$8r\"r&r HH"$#9)HI*R#=H&2d#;9I.r#?(H! S8%(I)JS<H%*SJ5SԢ6uK=Ӏ41MhJ3ӂ5mhK;Ӂt3]J7Ӄ7}K?3 3 c8#(F3c<$&3Lc:3,f3c> X",c9+X*~b5kX:ֳlb3[_6b7{>s_9!s8'8)Ns<%.s\:7-ns>x#<9/x+^󆷼=o|w>|. %$ CXD$BTALb8%I@B$$%IAJR4%@F2,d%ANr<%)@A Q")AIJQ2@E*Q*@UQԤC]Q4iBSќiC[ўtBWѝC_џ@1! eHF11eD&1)LeәLf19eYB%,eYJVYZֱ ldVd^Aq#9INq3E.q+\׹Mnq;yC'<yK^7G~/|p!(w $MD "L|O b!.O$!)HN RԤ!-HO2d!+Nr!/O R((N JRҔ,(O*RTRԠ&MR4!hLҌ洠%hMҎt#Lҍ'Mҏ G2 a(F2ьa,&2La*Ә f2a.,a)X VXֲl`#~`'Wr(8 NrӜ,8.r\*׸ nr.<)x ^׼-x>|+&A Fp#! Ehp'DdhD{bX&qG|D$& IIFrRT& iIGz2Ld& YFvr\&yG~ PBE)FqJPR e)Gy*PJT ?PjT5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~g?2A fCpF0Qf cx&0ILf Stf0Yfs|E,f KYrVUjְugf3mlg;n}rCG9qNpS g9y.pK\ Wunp[w}G< Oys^W oy{>| _h30AJ0!I(B#<H$"D#:"6qK<Ⓚ$"1IHJ2"5iHK:ғd"3YJ6"7yK>S0E(J1S4e(K9ST2UT:5I-jSԣ> hH#ӄ49-hI+Zӆ=H':Ӆt;=I/zӇ? b0C03b4c83Lb2S43b6s<泀,b1KX3;d?5eF6-/leNv=e99Qq9Yq \Uq]q<ySy[|7>;W7 L|GBЄ!,O"D!*ш &M$ !HL %HMҒd #L 'M (LR┠$(MRT"L~*ըN jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/~d 2`$2L`"2`&2,`!X`%լa-X6lg~a+va/~ 8r$8r\"r&rD+FE;GtD'tFtE7tGD/FE? G#00c00`>DLd|1S1 131 1sa>`!a1,2, *WXX؀[ bcNB^w؏8C8#?(8N$N4,~9p. nn~c'x %^5-=BRrGhAXCxD@DDBdDATDCt@LBlA\C|$@B$Bb$AR$Cr@JBjAZCzd@FdBfdAVdCv@NBnA^C~@ABaAQCq@IBiAYCyT@ETBeTAUTCu@MBmA]C}4@C4Bc4AS4Csh m ] = }1a0`(a8>(8'O10sLTLtLl\|yXEX/K ˱+ `-a=6`#&l|؆؁o{8c88S838q?<~\/˸븁۸xx_ w|888NN GO8q .2*:n&n6.>!WGD!FE1G D)FE9GTD%TFTE5TG D-FE=G4D#4F4E34G |m]=}0acbcHhXx| 1 >L4L ,XXK˰+_a bc6klfl7؊m؎; {a? 0{8888g\EK+k[;{xG)~3< xxxIa Q 1 q I ɑ) i Y ّ9 yQQQEQ Q%Q QeQQQ QUQ Q5Q QuQ M %>D+FE;GtD'tFtE7tGD/FE? G#00c00`>DLd|1S1 131 1sa>`!a1,2, *WXX؀[ bcNn^w؏8C8#?(8N$N4,~9p. nn~c'x %^5-=BrGhAXCxD@DDBdDATDCt@LBlA\C|$@B$Bb$AR$Cr@JBjAZCzd@FdBfdAVdCv@NBnA^C~@ABaAQCq@IBiAYCyT@ETBeTAUTCu@MBmA]C}4@C4Bc4AS4Csh m ] = }1a0`(a8>(8'O10sLTLtLl\|yXEX/K ˱+ `-a=6`#&l|؆؁o{8c88S838q?<~\/˸븁۸xx_ w|888NN GO8q .2*:n&n6.>!WGD!FE1G D)FE9GTD%TFTE5TG D-FE=G4D#4F4E34G |m]=}0acbcHhXx| 1 >L4L ,XXK˰+_a bc6klfl7؊m؎; {a? 0{8888g\EK+k[;{xG)~3< xxxa Q 1 q I ɑ) i Y ّ9 yQQQEQ Q%Q QeQQQ QUQ Q5Q QuQ M %>D+FE;GtD'tFtE7tGD/FE? G#00c00`>DLd|1S1 131 1sa>`!a1,2, *WXX؀[ bcNn^w؏8C8#?(8N$N4,~9p. nn~c'x %^5-=B2rGhAXCxD@DDBdDATDCt@LBlA\C|$@B$Bb$AR$Cr@JBjAZCzd@FdBfdAVdCv@NBnA^C~@ABaAQCq@IBiAYCyT@ETBeTAUTCu@MBmA]C}4@C4Bc4AS4Csh m ] = }1a0`(a8>(8'O10sLTLtLl\|yXEX/K ˱+ `-a=6`#&l|؆؁o{8c88S838q?<~\/˸븁۸xx_ w|888NN GO8q .2*:n&n6.>!WGD!FE1G D)FE9GTD%TFTE5TG D-FE=G4D#4F4E34G |m]=}0acbcHhXx| 1 >L4L ,XXK˰+_a bc6klfl7؊m؎; {a? 0{8888g\EK+k[;{xG)~3< xxxa Q 1 q I ɑ) i Y ّ9 yQQQEQ Q%Q QeQQQ QUQ Q5Q QuQ M %>D+FE;GtD'tFtE7tGD/FE? G#00c00`>DLd|1S1 131 1sa>`!a1,2, *WXX؀[ bcNn^w؏8C8#?(8N$N4,~9p. nn~c'x %^5-=BrGhAXCxD@DDBdDATDCt@LBlA\C|$@B$Bb$AR$Cr@JBjAZCzd@FdBfdAVdCv@NBnA^C~@ABaAQCq@IBiAYCyT@ETBeTAUTCu@MBmA]C}4@C4Bc4AS4Csh m ] = }1a0`(a8>(8'O10sLTLtLl\|yXEX/K ˱+ `-a=6`#&l|؆؁o{8c88S838q?<~\/˸븁۸xx_ w|888NN GO8q .2*:n&n6.>!W$5L\?zȥ!QC$ XH+KW0N-THйBJQPBzti9.gC;Bk}kM.SM&k49[d*4_4S򰩸F%oRMfNC"F_){8{^2;x9_mOWH-~d ~iL/_QӗD%tؐ¼~5,~=,~3,~  ~"KC)Ӿeyrp!uڷi;WPJn;(yC3/"[*lOapS +TH`~%4BwצgZ\$xXr70T8/ع_߭K[߭C?-2*~H<{awc'$Jr+2ĐCK$n5C"F_oBXWֻC6<EsaCvFW޻T)kmOUY^eזڴ~#rĐNJ9zOOE`!#_ܡ} W])K1#J7!oBbӿ 3ءc-:'oiam ~>B̨uBDp󷯳:-/ =fZ1cݎ% Z jH͐C׵ fHSC{[ŗ{!So2B>[ZJt1SA/;&ӂG3 o(55#a|Xc )}!Y2z)?+8><L_߂_"xHowczK*yU-Կ4U?-gKWH?J.k ׯ?%.tG ͐zsh% wCz!f&VBjo'F *u=]Czw )ϟۍuذa,xc ƍ~Z_NjVCw#?j/3ҿ|g˿~+QG3ɟ?^%oT $tt{0=C?_owſh5}?_l}k{6{G_ K8,c?%J;fyAe1w./?H*w7IY7wG϶_]|]W]9\Dz{._q.1TO+I.~{=n7]bukM.;lKɏQ~lKW\|Xq"]ᲘK|q%J%ʜzW}K"s|%J'=DF8-vI\)N$S9pqA'\ַ%J ;ReL?% Wvo~hV吋B߲.iU:tvBTh*WZ]C޿?n* }}NL*Snjj|zOpȱ%JLUEW-.TF>f*ͳk*vnKN7h%>Z*k*\wK{6D%J#]Oez93pɯŰ{G/s) %.>eks/] 4E.:d 7"*"RT%o*TJ~yyg.U=YWl?~L*O'vK) ?|KiN eKeKYgn>٥J=R^%ԥbĥʩK#wکmƺTV ڥʨI>ʥʞBi*4ŏomR]ЏRC!.5UlA.T>(de.uTZ7X>L*F.T.qGo* *|K:SMåʤnK##[KcuiR] IV].TWv.Umy6.-TrE G]>PRTYepKnJ\Z4YƦ.mTf2{*gItK;۷K{*tP`*ZnmN*7|mťJPFFEoUEwU\<\9\dyhE*mǶSeyyv饢`*zKz{sIU,FpqS #s鯢o`*e_=v2 |cd> 7Z_`S.tF.1]4..SU.TteJdʸP)O]f|ܫ]fRe`øQɧo\/qBW#y*w+f|=vY|.tYeOÃ/eJez˗*q?uY,U9O?vYkFG.UJp ]5Tw]VjW*uhFEZ8Uu*:ܸ^Q-'C.lP&Kr٨rbc#]VQM*z:Ye$GHϺlQ`^Ѭg\Qy]886w٪R@7Bm*;]eme^:UV%^ T0fp4t٭jG%~peJmpS n#v|y~pyc/Rv*uAR0c*wb]e* *ח.:c*)]4)].'Tfw\N^c S*:]rZCUQ}.W.gUw]~Ty&xTq9']~R s9fpJ7JvrQE3\~QY0nջ\.\<q\VI|ɟ\QCF*:rM.U"Y5*ePT\napm|(;*'#\tc{*+?5徊DLA.Uxvy18WO~=R%Kig"wyVo.UG]ި蠠[ĵ~N2;:w1Jŧ{ NRmSxg+O4U{J°]©s^EwH]"t *)5\"DVIK]+DUs+8sr.8ȭ]%һPѩ2.1UtavrKpv:8D*Ge\Ix*?w)2jPpRReOpRK)]O\Jg =v)[_.eUօ .hr*S2]ʫdCK]KEC-J*ƿJVsR[ڥ>=DRMHpɥJx5\tRZO'\jg7w\j< 6~tkVfU\tݨK=I*:xܥJJw̥JS:qi238=XहK:TJ%wi2fYp\e_p ץJpRN|!{pSqi(xZ%\ڨ* O]ک2^%NtP+KG=ZIGaKg U.]T KWMEK]\.=TTB^* \znKo]4/~*go.U *:(2P%8vG*SS\O3*U|eR& U.Thwxف*ƹ|c\FiHş'8\F\|2Z%NmQˡ.cUtu2N%x( *܁.Sz *:S]}\&^.Te<zP38 Ox2EE/trN_LS]-tm]fуLo2KlU.sT\]Pѩ&.T67F.UƓz*:P%fHE',V\5j|L/N,Qcu*S@eN#UvY5\VTI*:(J%8ڮj(JFF]֪:)Q*z [eʇ:Qe^pb*I%\6 Pn-*f x|r88-eJ8ru٦KlWsf*߬ʷ*'һTɩ.TR[*:JGzv٫B//SiXTBM*zNr@%ΜTj.TF7>arDEw\W)]~P飧.GU_;mCTc*:I帊6"Pi\N,Lw9r}prZECQѕ.YI }p(J4wIE'^WїgmV/\.<d\Tɭ.K*+o*7TztLI.Tuew\n NvRU'F]n ^Hr[EOQ \qRDc{*e .Tt`~Jf].TE _U3.U./vMEu']9TE'{rJ$\E]^hr*8R:QW*yu嵊RQѬ`[=N%^uyB.iwzQzKh=MFNmUNEWu.UZ*:%=w)8%..QT2*:DZM`&%ʕ"*I$E]\b *ǃ8v+*OE'㧻W4*觸$Tɯv.TzvIS]=%J:HL$WkK REW.Tj *.iT4VES^#qɠ%8QE~.TtKfz!%ॉ.YUV=\h%vqɡM%vG\*ңKn%qɫ\+|*oӢW)S.TzjRPE\ hBĥJ,\SM*j`RLE_\hSǥJmRReb!֥ʑ.U]ͥU\ʪ i5r*[? >Kygi.Tt_֥^/RIeytKe$K:RUEwE].UNO& P]jTK-]V ]꨼ EsU).Tå. TUf*4qiF' \, Nosiui=R4S]L)\Z<9NgzzRE|2T'F]Zl^HZE*K⸴U .TV7.Un/Fw頒Z]:hťNErr6FtK/tU@.T4 ]E'{B|8ĥUzx[ŋ_>*^Uץ.Uuů@/~]>Re.UuůP/~]x2\ŋ_UuůH/~]Fx2Zŋ_1*^Ue.UuDŋ_ *^|ůD/~]&x2Yŋ_Tu\ŋ_)*^LUe.UuůL/~]fx2[ŋ_9*^U /~]x2_ŋ_*^,Te.UuRŋ_%*^,Ue.UuYůJ/~]VxZŋ_TuYůZ/~]֩x^ŋ_ *^lTk/~]6xYŋ_-*^|ůV/~]x]ŋ_G^|ůN/~]vx[ŋ_=*^Ue.ߩx_ŋ_*^T吊.Uu9ů*^ůQ/~]xr\ŋ_*^T唊.Uu9ůY/~]~T圊.?xr^ŋ_UuůE/~]~Q咊.UuůU/~]xr]ŋ_*^T喊.Uuů]/~]xr_ŋ_*^Pץ.xJŋ_*^\ڪxNŋ_*^tPץ.TuůK/~]xMŋ_*^Pץ.TuůK/~]xOŋ_*^ Pe.x2Hŋ_*^ Qe.Tuů*^Pe.Tuů/~]ƪx2Nŋ_*^|ů/~]>Ue.Tuůg*^|ů/~]x2Mŋ_*^Pe.Tuů/~]x.Tuů/~]xHŋ_*^|ů/~]xLŋ_*^PewUVxZŋ_TuYůZ/~]֩x^ŋ_ *^lTk/~]6xYŋ_-*^|ůV/~]x]ŋ_*^|ůN/~]vx[ŋ_=*^Ue.ߩx_ŋ_*^T吊.Uu9ů*^ůQ/~]xr\ŋ_*^T唊.Uu9ůY/~]~T圊.?xr^ŋ_UuůE/~]~Q咊.UuůU/~]xr]ŋ_*^T喊.Uuů]/~]xr_ŋ_*^UD/~]&x2Yŋ_Tu\ŋ_)*^LUe.UuůL/~]fx2[ŋ_9*^U /~]x2_ŋ_*^,Te.UuRŋ_%*^,Ue.UuYůJ/~]VxZŋ_TuYůZ/~]֩x^ŋ_ *^lTk/~]6xYŋ_-*^|ůV/~]x]ŋ_*^|ůN/~]vx[ŋ_=*^Ue.ߩx_ŋ_*^T吊.Uu9ů*^ůQ/~]xr\ŋ_*^T唊.Uu9ůY/~]~T@.TuIŋ_*^ů/~].x.Tuů/~]xrMŋ_*^P妊.Tuů/~]xrOŋ_*^(~ɇ/p%I䣉|,Q'_DKH䓉|*QO'_`% %_DK>(~/|% '_H%_H䋉,(~ɗ/r%_I䫉|-Q'_X%H䛉,(~ɷ/v%K$_DK(~ɒ/Y:Q'_L%?HdDK~(~ɏ/Y.Q'_DKO䧉◬HȊ,Q/Y9Q'_J%HdDKVK䗉◬(~ɯ/Y#Q5/Y+Q/Y'Qu/Y/Q/ Q /(Q/$QM/,Q/"Q-/*Q/&Qm/.Q/!Q/)Q/%Q]/-Q/#Q=/+Q/'Q}//Q/9 Q/9(Q/9$QC/9,Q_'_rx%G$_rd%G%_rt%$_rl%%_r|%'$_rb%'%_rr%$_rj%%_rz%g$_rf%g%_rv%$_rn%%_r~%$_ra%%_rq%$_ri%%_ry%W$_re%W%_ru%$_rm%%_r}%7$_rc%7%_rs%$_rk%%_r{%w$_rg%w%_rw%$_ro%%_r%$_`%%_p%$_h%%_x%O$_d%O%_t%$_l%%_|%/$_b%/%_r%I䷉.Q'_DTDK(~ɟ/y%Q$_DK(~/G%L_;Q$_DK(~kyU䵉b2E%S&_DK^(~TL(~4L(~tL(~ ̘(~L̜(~,̚(~l̞(~̙(~\◼!Q7&_DKޜ(~[/;Q&_DKޞ(~<◼#Qw&_DKޝ(~{/yo%K̛(~|̟(~/`%JÉ|$Q&_DK>(~'/Y QO&_DK>(~ɂ,(~g/l%K,(~"|!Q/&_h%_Jˉ|%Q&./z%%_DK(~|+Qo'_D%I仉,(~R|/Q/~%$_DKM䇉(Q/q%?IdDK~(~ ◬(~/Y)Q/y%$_DKVMdDK~(~*Q5/Y3Q/Y;Qu/Y7Q/Y?Q /0Q/8QM/4Q/Q/1Q/9Q]/5Q>(~(~ɞ(~މ(~ɾ(~(~Ɂ(~(~ɡ(~ɯ/9Q/91Q/99QS/95Q/9=Q3/93Q/9;Qs/97Q/9?Q /0Q/8QK/4Q/Q/1Q/9Q[/5Q/=Q;=DKJDKIDKKDKHDKJDKIDKKDKHDKJDKIDKKDK^HDK^JDK~(~o/]%O1Q?%_DK^I/5Q%_DK(~?/W%N?7Q%_i_/ym%S$_2e%KL(~ԉL(~ɴL(~̐(~Ɍ̔(~̉̒(~ɬ̖(~̑(~ɜ̕(~/yc%oJ͉◼%Q/yk%oK̓(~;/yg%J݉◼'Q&_DKޟ(~HMdDKO|0Q%_DK>(~G/X%O,(~'/T%NdDKJ|"I䳉|.Q'_p%$_DK(~ɢ|)Q/'_DK(~/z%%_DK(~|+Qo'_D%I仉,(~R|/Q/~%$_DKM䇉(Q/q%?IdDK~(~ ◬(~/Y)Q/y%$_DKVMdDK~(~*Q5/Y3Q/Y;Qu/Y7Q/Y?Q /0Q/8QM/4Q/Q/1Q/9Q]/5Q/=Q=/3Q/;Q}/7Q/?Q/90Q/98QC/94Q/u%'_rD%G&_rT%G'_rL%&_r\%'_rB%'&_rR%''_rJ%&_rZ%'_rF%g&_rV%g'_rN%&_r^%'_rA%&_rQ%'_rI%&_rY%'_rE%W&_rU%W'_rM?Dxr]%']rC%7&\rS%7'[rK%m"%Yr{%w$Xrg%w٥T+'Q{*/Q%jSG(y,Q-(y"Q~'}.yU'y:pg&y6g5&y>^%y1U%y9L$ IDI~Ӫ>:?$FDHɟ}(WE"K?$MԆo_IH? W $N?z?DGhk{U{䵉NLȔ.Qܑ':2U#S'92M#&82]#'72Cp#3&z62S^#3'Z52KL#&:42[:#'ǒ9E3яyC #oL`M9Qy$.2wb oMZm:=byyG"LTU];QL$(D Eޗh75?,$ %DD>ȇH,"MtDcj|<O$ @!L>S|:QY(Q$DC>m.dDKCI3 N|1QŐE Rx!_N-+|5Ѯ%JDBKT(|3Q= V!N"dDB@wY2xE^ K'j DAI,,MQ %z DA~h!49<Ȋ,Q,}Y9Q#'J4 HtdWZ LdD@~'k$ɚ}V'$ɺy^m'$ɆtQޜllO"$q'N6'lfO_ByvlaOl&[ٓtLC'Vl&ړtLK/IM&;ؓtwLvLI:$;'n.$]I%%s$ޒ=wdO{^$Òd{XɾU=Id{Nw@{jA{Or=I{QrhfO:q;IOE#Iy$G&Q$*IC$$n ɱ$x{ $z${nɉ;;r=I7tT{i7r=Iwm$g$nș$ݣIwd{s_<{$m B{E[*r=I_%$@KM2{n剻$r=I7GJ{U[!r=Iw@č֞C|r=I9 rc^dO- ٞ;rKↅjO} -q{Bn'鮄aOƎܙ!wٓܝ ؓt@'ܗ ۓ!$n"ȃ$}%ٓt@N)GIA & c=Iw?yҞs~=I>yƞ{l|qM`Oҡ =IOSkg{Ψ+i{6$6%ΖI:I&HړtJLeOҙ0wǞ俉I[%UVyme2E2e TdLx-LxLx LxLx̐xӀ̘x̔x̜x̒x̚xy̖xg̞xȖxC̙x1̕x!ycb)1Oޜ'oIL3䭉 }<>y{b̓'HL֓w&ɻS݉yD@'J̛'G䣉qĜ8xb*|"1NHL|O&ɧӉm`bR,&ILa&fyjpbz,&_HLF/&ɢgČ3rb|%1LV&_K&'&bcĔC73d1Vb^|;1LH$&wsdT/Y*%&v҉\4.Y&1{K~%&jSGY\bB81K~~%'f]Od+Y11J~Q%+%&RʉSĴ)Y%1[J~$%&Fj)QL(Y=1J~$k$;ɚYNVbr$$2ɺL^b⒬$$)ɆIQbRl$ؓśly$ٓtJ6'il^$[ړp$[%&$}$ؓ4uHMI($'$M I NI@=I2%1Gv'鿚fO=1G'*왘#{ٓI#$Ⱦ$Бsd|9 4901F'`{!)6r=I3kĄ=I[Fr=IgĬ9Ҟ2rTbTmOҥ9ƞArlb"gORPBOL{I ɉ$Mrs[d{),r=I19͞y+rzbaO,9319Eβ'iNmO!9'1Eε'+9/1Dη'\`O01D.'i.\&ؓ'ړ4aD.KI"W$fȕ$MI%W'~5$=DΞ\oOҴ!1Cn'iܔ!7ۓ[I!&&hm$ː1{faȝ$me]9r=I_b=robbgO| ?1B'i!Q7&oDMޜ[7;l& mDMޞ<֚#QVw&:jD5Mޝh{E4yo&K̛(|n̟M2`@&JÉ|$&aD'L>' 0Y D{DK>(~ɂ,(~g/l%K, "|! /&_h%_Jˉ|%Q&_DK(~b|#Qo&_x%Jۉ,(~w/n%K&_T%KdDK(~2 Qe/a%?JdDK~(~O/Y>Q&_B%+&_DKVJdDK~(~*"QU/Y-Q_&_z%JdDKLdDKNdDKMdDKOdDK6LdDK6'iA6IdS{j/ܞCF=I/2QI*~։lcOҗ+=I}vloORKvHdG{_=IWdDKv')"&_=I,ݞcGӞ(~މcORKMd?{_=I 9 QI2/9؞r=I/94QI*~ɯ/9ܞaORKL({_rt%ؓTcI#%_r=I19!QII$DKN'%&_r=I/9ݞ@DKδ'%g%_r=I/9Ǟ(~y$m\`OqО\(~$DK.'%ٓ/ž\(~U$j{.55\kORBKz{BFr=I/1QI*~͉bORKn'K,-QI*~ܙ(~]$}xߛܝ(~=$}m#ړT/ߞ<(~Ƀ$!{.ÉQI*~ɋ$mFK◼lO1M%'%'/!}%'iE(~ɟIMlORK^I/$䯉͞ݞ̂#Qړؑ%_o{_{/=Iay͌◼6Q)/2Q%_DKJdDKIdDKKdDKfHdDKfJdDKfIdDKfKdDKHdDKJ ◼1Q7%_DKޒ(~܉◼5Q%_DKI$H䝉◼+Qw'_DKޛ(~/y%&_2_%'./`%JÉ|$Q&_DK>(~'/Y QO&_DK>(~ɂ,(~g/l%K,(~"|!Q/&_h%_Jˉ|%Q&_DK(~b|#Qo&_x%Jۉ,(~w/n%K&_T%KdDK(~2 Qe/a%?JdDK~(~O/Y>Q&_B%+&_DKVJdDK~(~*"QU/Y-Q_&_z%Jw'k$_f%k%_v%$_n%%_~%$_a%%=IG2d{>bɦlfOҗ+y%[ؓtF'%[%_=I/&QmI*~v$dDKv'%;&_=I/ٞcK%ړ I*~aORKLd/{_=I[FO%ړT/ߞ`O_r`%ٓI"'_r=I_ɡ$DK~mORKO{_r=I19*QI*~1kORK'(~ $]/9ɞlORKNIT{_rZ%ۓT3I3/9˞rv%ؓTsIZy◜oO6\(~Ʌ$pI*~ʼn\bOR{Wri%ٓTIY\iORHJj{_r=IxDK') 'Yr=I)F{>`MlORKn'Ûܚ(~m$}m#'_r=IvN{G/۞+rO%ړEgORKO{_`%ٓTI&$_=IAy,QIJQ$'/yʞXt%ؓgI*~s(~G/X%O,(~'/T%NdDKJ3|6Q%_DKNdDK(~/Y4Q/%_DK(~W/Z%_OdDK(~7/YJ1>$w5\h8u>S*6>A3 >/1ɍܔ(-VJrujUo{JnK%'zHrkErո|e-$w':FrO☄kQ$Y3+< ɃVB򐵮P:Gi56>>51,9#Y5e=93EyC!oL>M9Q$2wҹ%yk!oK8ކ̓k;- yg!Jt2݉*'&DBޟYȼv̗(U.| Q&DaB>IGh!K!|"Q}d JӉZ,h3B|&]&* DSA>((Vz :|JR A(ȢKVe+I b|5'%ju+IYJ_n +I]f" '-+I,a%|'qOk%f,i%,e%֞|/qGONȓ[I'XIZ$ݭe7䇉{s#+Id9+IwVnOd6lk{jĭ4Y)qMVcG~n%~b%iA~;&&noJVtI~i%rn%Η*qKH5$ޒ$}t7d=,YJ5YJ+YJ҇ qJ6Lܖ$}':%XI#&n9f;MLJIU.ly$XIg$ZIZ8vVCC~h%Ёd%pl%馏쒸#&nnVVn8ge%do+I7kd+*7qkFKܑ$}!$XI:(!ZIژw[M9Jҽ9J-9Jҝuo"GXI]"GZIK"GYIZщ{"rLVk%g%鸇o%!'&nIVnjVe)Vnaȩ;rZↅn%>a%+!g%nFV#+9Vғs$q7Jm ɅV&EVn"ʼn{rI▁\j%N\f%\n%k7"q;@L$}m#W[IS&XI:#&u{r+rxrwrS⤝ܜ8W'XI:E'ZI:3'%Npr9JY7Jҡ ;qMIZ{$-I>+I'~+Ii3y0qLtLtnLtJLM 'q+IVx'$o5/3g$Y+I򜕤C5|_3y!~yJk %+Io#$@~x6/WVF?&^' tFl%񡒼b%)#I*@xCJҋV gb+1Om%iJ8Ą>y,y|="1kOLL֓%SdČuԉx2MbLv'%fIv2Cbn̘82'3%Q2sb̒7'&lYr2{bȓ's&\p7ycb)1Mޜ&oILjs䭉)l5y{bš̓&HLOw&fɻ݉9h3yobƙ/1Lޟ_&&|d2b| 1wL>26Pb|81AL>&ML%f 1@bD>%JLO'sɂi\Pb|&1iK>%M>% '&d"V$ؑ/ZIu%&&[ɗsVVW$ͨZIH%_K̟'MbV.'7$-䛉QxbJ|JRPKm%P,a%i@|'1I$KZI$KYIӼ&Ltb|?1qI4_I~`%/!YJ#a⒜(,g%7a+IGd<#ibz`%iVh%i2J"Y)1uHVN[I($XI^"KVMVec5LY#1Gִ4Gֲ4Gֶ4GILޑusvd=+ISud}+I3td+I(01G6JLÑ$Exd+IG'W'ZI!%扙5 5y43u""$7ȶVvVVf0cbd%1JR NvILr]s[d7+IWbdw+I3Yd+IXdļ+1]E4KE49E4'EKLE3P+I_ȁVbGr/rpbvT"ZIZaV.ɯ$F<9J9JҬUV&19 rlbg%)![I: 'XI ɉ@d%79Jҏ39JƎ!%fjV&hVeșVcYYrvbc%) ZIKγ+| JJ҇7JR@.I̕KS$2+I3#r+I" +I *1A4Agk$Q3DJMnt-}erSbܜ XI ZI YI '& 'c D/J>ꧮ:|,т* SrGHf' 'T$NdDIJ3Ғ|6U%*JD3IN&$zHDHhɢ DHW"jH$_K.b|#Qo&Ax$J4ۉ,aE#I}仉dDGJtz{Vɞކ- 'Qΐ}$u2dDCO40DBL- +I5 98ѮC 94ѥ u9!' rC #9*ъe9&q!O9>Qt91Qkm99QbS$uDeANK4DAAHL+Iu9+B9'9yVb\8 &jrQ= 'JrI+ ZI|IK.K4D!@H?J]?:qOIk=Jҍy wrc⶝ܔ['7'n-{srk▜f%Nܞ'w$ɝmrW.m%ܓ&&n};hrƙ<`%~6qFHܵLY#Kܣ'nT;22u &qEMvw[dM!qoEfLRwRd %qDfM.wId#qODL ̕"oH7&wț9͉M ;q/Cޚ!oKܹ'nX< yg⮄+q3Bޝ!Iz&87 2od?qA>w L2%>`ɇ7#ć7X.|8' $W哉3|ĉ=t|,8' %g'䳉s3%Ngd 9YJy8B|1_LMl/%αɗ$.x$ΨW'kgi3Y,qL8I&ߴtnLOo%΄ɷ'dywKa%Yʟi{;%K'`'d7i*Yֿ玄NK~8)%?J| %NAɏ̓$qIOg&N/ Jbd,qyjRԑ8c$?O(UBjl8 $L|$J5'xdyY+q:GNőu'od9Y/qFO 'f''&F0ql8"&εfS,ẙl8"[&ΣVӧgMd6qDKgDdĉ1qCvJg;dIΉɮs[┆8!{$N`ȞWt8K!$NNȾs"d9 qALo9$qRAMK׉3' y92qz@J'996OO|''$NNJ|7'''S߻ɩowjrz49#}vLJ|>69;͗KM|%%ÒXķQrQ'8MJri[$,\HH|$W&Չov8rm[uh72rC1mܔnEnN|"$7[ߒmD7;wȝo7wrw '=ܛVBK|!'q/ȃoG&%;#ķXbOOW卉7%>ɛ-Oj2ws5)_g.y{̓<%H|zw&>+Mޕd$N|$>{q}O}'>ȼO+2_ⳉ̟$"H||0)C>L!N|$>/G{%K|'V~:OH{&LS LLdڻGJK>XWk&Y8B,Xbb5Y4/Mc$_XW&(ՉikjSB1|sb O[kɷ'VL&ߝL]S򽉿&KO$ߟGM򃉿Mdى;['?B~4,7`?'?[&Oyd%[NY6jLo^"vgd_&OY(aBKvLfyƹwcK_&,<ߓ2+uOddd?^'='LY$Ny%M&O'Ll$N$M%O&L&N<'M'{>w'9bWrɿѓc&'N qFrڒ0$'NQIXrZ2&Nijrڛ1>'gNY|rgArErgJrNrgSrWrg\r`rgerirgnrrrgwr{r jr\=Ho$NI&-{Orc2HM?Q$7'c23FnMƞ-m⧎ܞ_r!3{䮉ݓMY#7{侉^r2?d챓&~ث'L<=x2;$OL;y2A&]&yfy6߉&6*yay1ђ&훼zo&&;c򻉿a)c2&K+O_'v%ysb JYA5'g'V%"yn& $b_IȔ8KI^7-8IW2u2viL3dd#%')!QɌ8JfJƹV2s2ξYq>̚3dd%',.#uɜ8KJƹ_d &oLad1&oN9ddU&s'<3yk2<%\4y{2Nyq#g;qN+gɻqޛg{qn/gq3ddc'p֝| qf|(ɇ:{O>ٝ'K9d$H}A@2O&!T2&O'"Y0wBɸI>ɸOI>;ɸINMH2w/$(b2Eq|)Mɗq'|%VWq|-_דqG,{ɸkKdd%Jƽ^d%K$~0N2&1Y2wRɸL;dd{&OhL2O$5Y6qW(rɸM~{'ɸ;NOrdA'+$:Y1wϒqߝ;ddܛ'?OzJ2ߓ_$>Y5jɸO~ Y=@dth5'$k%aHNF琬"Y7D^2ddth3 'dd4;I2ZdӉ= ,I.lv%rbBJFl=!$Iې$OvNJvHFۓ8!;%JvNFG쒌(5=R[2ddtMh=G%{%JNFg쓌+7V_2ddt_hÒя%%1KNFV-94=[rX2Ó%G$KLFN/9:-_rL2zd4q&'$?LNLF199crJ2zd4i*ӓ^&g$LLFÙ39;-hrN2zd4yNѦ&$_M.LF\68lrI2zd4er˓&W$MLF\ߏN8:-qrM2zd4u薓6'7$NnLF#߳:9urzd4m,th;ч'w&!OJFgܝ=ǟ^=7M{r?S{r2d4CuhG'&OK\@x2f'1_<d)$O'c!y&ɳɘHKD|2f+1dq$/'c#M2A&cf$]2J'c$C2S?&c%S2\?'c&y%2_1S5s7ߒ1=;?13s@ɿ1+;D1s7sI1fWe7%M T2E2椒)1K.V1Lddv%$c+63btɘ#KOƬY2C2ђ1̔dd̾%$c>.53tlɘKfO,^2G291ӗ̕ ɘ LޘMɘ1Lޜ9-ɘULNysɘN>ddn'XIw'_H xd̉'&cF2foZI''cf?V2o'c?Y"$߱xC n2HL[Rx ^24HNƻ6B Bl2aH~%=d9+7']'x;"Y>K$?M VT$+&-gx"Y)ob$+'݌x[#Y%o$x#Y5x$%㭏x$Y=o$xW$Y#o$k&}ddawNuJn2KIֳxS%Y?$$mddߒl7^$ށI6I[1ɦxO&,o$']d +k-MU2IN;96xK'6$%Md{+w{Oc2IvJAxG(J⭡ddG얌7ݓQG2>Jx)+o(%{'㝥ddŔ워S2}Jx*90G%%㍩dCC$޳JKƛWɯ.Vrx2JHZɑVop%G%㝮dc&Xr\2 KOb V%'&㍲dcΒSZrěiixW-9=o%g$}dᖜwޒ\r{qɹxS.9/%'md_\h%]rQ2K.N[y%xO/4o%YI˗\+_re2LJ;xK0& &ZII\w arC2?LnLMV(&7'dǘܚ7ےcrۏx23oH&w%dEܓ*{erĻx3y g&&dÙmd$J;ɟ$H^Ic_nd-o&x7G?W$L;ɿVpo??N7.qd]fWeo6o 'S$dd.-'OƛTx9:o;'$ddLwt2C2ޣNfLƛLx:9o_'$}dd̖wٓw2G2NLƛ\x;yC2OޘÓ7%xyo2ލOޗ'ddQ̗w}d|0o'Jƻɇ~dϟ|4o'K;ǓO$$ $w $LH>M|: Y0 Y(!L2~WBd>sVG{E$~C+|JD$&wI$_JHl%;)XIފג/[Id1+ߣ|Jwm$LHOHe%{=o[Id +|'C$n2~H"I}%$~It2~Idnd+ߟJw$ZI]-ɏ\$~Kc+tᶖUnD.)Po{usϘ^d5'w$'IHA$d-'w$k;I&Y'|'Nn2ޜd='w$;I' |GOa2d#'w$;I(IAɦ{͒w%;I(IFɖN9JJ߅l /)IJɶN]Jsx7S}2ddOɎNJvrxWT]wN%&JvsxwU=$ށ '++|V}$ɕ +/|W$$d]cȒC$Y$^0'w%'GKHߡ$('w%G;I-9&|[rl2޷8'w%;I?.9Isɉ{蒓w%';I.9IwɩNKNKߝ _/9I|əNKrx_rv2'w&:I709I݂ w&:I0I]NCL.Iߙ\ W1I݋NgLpxcre2d]NLqxdr{'wS&'Lnpxer{0$ޕܜ O3%|fr{9ۜ$ݙ$~dɝ{B$%$dɽ{K$m$'w&&QMJߵ<$>'w&:I5y,|kx2~ 'w&O:Ig6yI]jgw&:I6yIݸNM^H߱ 7yI]NM^qxoj2^dNNpxqf2d]N;Nqx'r{w+''_N>pxGs{$| :$|gt{Ϝ$=|$~dɗ{$ޅ|$'wj'&NK͝|$'w|'?:I<)|Wxs2>'w':I5|g}2Z2^ddށ͓1dd7dd~yqwdܤy!2^5m92A & <]L(p]I4an#ܟ1̑h!ȟGLdyD/A:Pm62w $StNh*ȼNߜ$]NK.?$!;I*1ɹ$ & dnda'IYI{EY,+gId 'qYIegc4Y*Q}$ d'I?tdY'ɮNr2+j%o'Id?}z|;0|CVL$NC=Icb*dDsBVIV2$%:I%9IxLVOt)dԁCt.R$h YIRBIx,Y7Q$t$= $8I &QpNB&NM$U1dVNl$:l$![9I>$['ZMi IIүdd;c!;9IsNdDCvKH!~";IvLp 8HLғ%!:ce2L-$&wGKԆd'ۑ!1:eo2RH$#'YdDHFM| -Q-ѓFHtdDOJkddq#7٤Kz2^~$'e_ =$0|G2Q$' ?IɤW7'%*J2y8dDWILJN$S%JK2ubdD{IMiL1Ia%3$L2c҃Lb̜tݽ]$O?x'$N2k_]'-Y62{$L|#т?%\MLԡd|ɟ(K"%s' R2OQ_M)IZ7'Ij2_2K*IU:I dDJJ86F% ;IU"NE$dفGӓE+YI2p8YIRJ$ڑK}3IL}0q@>2tE>N O$IO$] Ts3."qoE4 $d 3I9vL_o򽙤gCh&i#?Iډ I##&$of!&{d=*IANܬad].mAOܾ=ؿ #&H 2r↎ &h 2z c&X2v⦏ &x2~6L!&D 2qƐL!&d-2yVL+!S&TM2uL=!&"tm2}v̐O!3&+L2s.B~$$ZȬ[NĞ -qIfOl?&nB](3CJܖ?'e_d 'qJة!&X[6dĭ+{b#qKOl7dnY(qWKNd-Y4CK=d /Y2C%K%~҉[`Lb,&%6ȿ7߉]!S!B6'"M/%6Jgrb爬&&j[izb/&k&6Zkvbw&&zm~bl&&6Fpqbl'&f[rybOl7'[&6Vtubl['&vv}bߊ쐸';I";I&;'v.fɮ--[{Gi&!+qONv}$}^d?3Id3Ih&)w&% r1r*9L#*rxba&+ GI QҀm&19&c$m$]h3IG91FN2T,$-S 9Lҕ<9-Q5$%$gIșM7r9LR A5ȕ#f.9^\h&iك\d&&8CG.1\ت#I Iڳ#W$ r;rU WI#טIWky:3IT}=rF3IWDAn6zGnI4V3I(LRAnO;$u N3IN]2m&9'ъ{$-3$# yL`bOi/$~&2I24ؑ$romLv'.Q$@$?(LRD~N섒_$5BW3I/oj 1р%C&:"2Tb (0R2l5"%M?%#&z$2Rb#((U2jY"%V艊c%c&&2Vb(8]W2n}"%_L؇%&(2QbCL($Y2i"%h䉪Lث%S&:+2UbӖL(4[2m"%q:̐%3&z-2Sbc̜(;̒XX!&*/D@fKt_d/c#s$vɟm3LJbω}aD?FNlyEkb̛h[dDul1GC#'62,M& %Z5pb[,ȢeXg#'6,q&L4od3Y:Qe{dDGKlF%J9Į4O#' ا&Mu kR#+'v*&%nbnA#&6Fl'$@ib+l=qE$[&6Vl%'$Bmbl }sC?$;&6N"l&!%(]$&IzOvO쭓=$ud&;L4Ln;':}$m#L;9L#*r`b#d&rؑ'I~.9L<9,QQ$$G$Jr(3I%9:kO1^c83I5&9LR\HNHD3I Ibl&i"Ij8ɩ-~r('gI#gI'g%OrrN%I6r $]/ @.2$}$єK$=V#%*SrąJr\r\.r6\k&KuZ\o&%7$Urc MfVrs; -fWro9 %Wr= w$:XroB wIzX@N|7Lcbro}f.f?3T$BDK4MJk3I LRKM;3I/>Q/LRK~Jg3I/L6k%Iz`Gx@dDKJdDKIdDKKdDKFHdDKFJdDKFIdDKFKdDKHdDKJdDKIdDKKdDK&HdDK&JdDG&Id_2Y%'_2E%S&_2U%S'_2M%&_2]%'_2C%3&_2S}!9Q%_DKfIdDK(~l̞(~/#Q?%_2g%s%_DK(~܉̓(~_/7Q%_2_%O̟(~,(~B,(~",(~b,(~,(~?/Y*Q/Y&Qe/Y.Q%_DKDOdDKVL俉/Q/Y9QU/Y5Q/Y=Q5/Y3Q/Y;Qu/Y7Q/Y?Q /0QC.8QM/4Q/Q(~Ɏf_X(~.fɮf&LRKHdO3I/+Q$d3I/7Q$dDK0T$=!%_rDK5tK3T/9LRKL(3If_rL%ǚI*~qo&%'I ɉ◜d&ǎ(~)fr◜(~f_rF%gI&gI*~ى◜c&%&_r◜o& Q $]/LU:LRK.M23I/qDFHdDKFJdDKFIdDKFKdDKHdDKJdDKI/'&_2^%'_2A%&_2Q%'_2I%&_2Y%'_2E%S&_2U%S'_2M%&_2]%'_2C%3&_2S%3'_DK~(~,̚(~/-Q/c%s$_DKLdDK(~_/;Qy/k%&_DKK#Q/Y Q/Y(Q/Y$QE/Y,Q/Y"Q%/g%K%_t%$_l%%_DK(~/Y>񨀬(~Ɋ7Q%_R%+'_J%&_Z%'_F%k&W/Y;Qu/Y7Q/Y?Q /0Q/8QM/4Q/Q/1Q$dg3Iy%Q]$dDKv7t@=$dDK2T/LRK5T/LRKH@3I/9Lcrp%IzMM03IWp3I/9"Q#$DK6Tc$ؑc/9LRKO3I/9LR`GNJd3IDKN5+f&%'_r◜(~YfNrDK5T/9LRK.0 \(~Efʼn\(~ɥf_rY%I*~_M0+/LAN3I/LR(CKz3I$!Q$U!7I*~͉b&%&_rn&(#Q;$]/LRK1ܛ(~}f/yL%yLRKJa3I/y$QG$13I/yLOL\x$i3Iy&Qg$EDK7tؑ$DK^2T/yLRK^5h(~f.5◼i&%oIHON3Isɻ◼g&o&%$_򡙤|(~lj|b&!4Q$&I*~|i&銞|(~f7f_m%ߙI*~`&%?IzDE~Jg3IDK~5t-Z򛙤 1(~ɐ (~Љ (~ɰ (~◌(~Ɉ◌(~ȉ◌(~ɨ◌(~◌(~ɘ◌(~؉◌(~ɸ◌(~L(~ɄL(~ĉL(~ɤL(~L(~ɔL(~ԉL(~ɴL(~̐(~Ɍ̔(~̉.Q'_2K%&_DKfKdDK(~)Q9/+Q?'_DKNdDK(~ɼ-Q/{"#Hd_A@% &_P% '_H%&_X%'_D%K&y=g 0Y*u=&$`l)1Y. %'aēd|%&+$-u1SޘxLVNdijI&%Q2Y#ԚZc%3Y'dhzgdDL6H<&&gQy88QDM=!&iY9*q/CNM 6w7DOn0tCnL9Q[7>DOnK[ĭ3@2tODNl {7G/qDOlK~y(qDNlG7Py,q'EOl%'TĞy*qoENl.gy6@Km my1@^Jčy5A^Kܑ[ĭy37AJܣy7[AKܵɇ Q>| $nȧ YΎ| _$nȗ=U^| $nȷ]]| ?$nɏ}S~!$n ɯ[ 1ـ"!C&nP2t➑ 4!&np2|.F!#&n'H2r⾒X!&n0h2zNj!c&n9X=2vޓ|!&nBx]2~nL؎!&nKD}2qLؠ!&nTd2y⎕Lز!S&n]T2uL!&nft2}⮖̐!3&noL2s>.C~%$v|Ȭ;_-q LfO?& M13+DJ?'_d>'qL0"&n;Gd4{,GV̟K" $ɂM%P,]"$ɢm&Xv,o"K$ɒ' 8Y*EN܉e[Qd-9Y.'E7'NlN$n]*Bnخ"Mܶ%Jwrb'&vj;zzbK'k&Z{|vb'&vz~~bۋl'&Fl#$ ibGlh扭1EA 2AJtdf&QmfdD{@Ol51FvJ dĆ%Q,];kdD@vOl=U3FJtdĦ'Q>}#%Zb#ȁ8rP '6!ء#% rxb,ȑ=;rT G'61#% r|b;5ȉ}=rR ''6)#%rzbˏ>ș?rV!g'692 $%Zr~b[\GȅArQ'!'6 %„\1$%ryb\Pȕ=DrUK!W'65R\U$%r}b{ܐYȍ}FrSo!7'6-ܚy$%r{b ܑbȝHrW!w'6%=rܛ؝$%ZrbL쟒=8J>IJĎ*,,[DDL챒]:JINĮ+.>ۯD E~LÒ}9!K~IS,-P!&[dDUEJՒ&iKMWd->b۸dDEFJ璑%KFMd#2z"c$zɘʋ%c'/2Nb󗌛(x]`2~ #$ɄZL&'12IbL(db2y1#S$ɔd1:ѡidDFK&!LfLkd29ѳ%6%LfM4og2[#']#M(Ȝ]i2W#NlO$j:2wb̓_dDqGع&%<6G#'N,& %=pbw,hȢmnX#'ޏ,&Ld8Y:e[dD%HK쉓%A8O$$'v .'MԆ}sR?$+'6*"I'%EzbKɚuVc$k'6:m'%ZG~b۝lɆwQ$'6&Blؑ'%Iybkl(ɖ=zU$['66Ғlص'%K}b쐨1Ɏ}|S$;'6.b'%N{b쑨:ɞ~W${'6>'%ZP:~rP%'1(Hɡ %Rrx[ʔrT;%G'y(Qɱ" %Tr| ZrR_%''(Zɩ4 %Wrz[ꕜrV%g' (cɹF %ZYr~z\H!E7*K-4 DsK.O|"Q+@Jt73k.6] DKO|{!Q@nJ7<[ܚ(~mܞ(~ܙ(~]ܝ(~=ܛ(~}ܟ(~<(~C<(~#<(~c<(~<(~S<(~3<(~s<(~ ◼(~K◼(~+◼(~k◼(~◼(~[◼(~;◼(~{◼(~|(~G|(~'|(~g|(~|(~W|(~7|(~w|(~(~O(~/(~o 1ŀ(~ɐ (~Љ (~ɰ (~◌(~Ɉ◌(~ȉ◌(~ɨ◌(~◌(~ɘ◌(~؉◌(~ɸ◌(~L(~ɄL(~ĉL(~ɤL(~L(~ɔL(~ԉL(~ɴL(~̐(~Ɍ̔(~̉.Q'_2K%&_DKfKdDK(~)Q9/+Q?'_DKNdDK(~ɼ-Q/{%HdDKHdDKJdDKI\JE/Y,Q/Y"Q%/g%K%_t%$_l%%_DK(~/Y>Q/Y1Q&_DNR%+'_J%&_Z%'_F%k&_V%k'_N%&_^%'_A%&_Q%'_I%&_Y%'_E%[&_U%['_M%&_]%'_C%;&_S%;'_K%&_[%'_G%{&_W%{'_O%&__%'_r@%&_rP%'_rH%&_rX%'_rD%G&_rT%G'_rL%&_r\%'_rB%'&_rR%''_rJ%&_rZ%'_rF%g&_rV%g'_rN%&_r^%'_rA%&_rQ%'_rI%&_rY%'_rE\(~U\(~5\(~u\(~ ܘ(~Mܜ(~-ܚ(~mܞ(~ܙ(~]ܝ(~=ܛ(~}ܟ(~<(~C<(~#<(~c<(~<(~S<(~3<(~s<(~ ◼(~K◼(~+◼(~k◼(~◼(~[◼(~;◼(~{◼(~|(~G|(~'|(~g|(~|(~W|(~7|(~MKDK~HDK~JDK~IDK~Kd)DKLdDKNdDKMdDKOdDKFLdDKFNdDKFMdDKFOdDKLdDKNdDKMdDKOdDK&LdDK&NdDK&MdDK&OdDKLdDKNdDKMdDKOdDKfLdDKfNw>QY/5Q?$_2[%'_DKHO̙(~\9Q$_2wq'Q&_2o%KdDK(~?/?Q/Y0Q/Y8QE/Y4Q/YLDK>NDK>MDK>ODKLDKNDKMDKODK~LDK~NDK~MDKz@dDKJdDKIdDKKdDKFHdDKFJdDKFIdDKFKdDKHdDKJdDKIdDKKdDK&HdDK&JdDK&IdDK&KdDKHdDKJ\/&Qi/.Q/!Q/)Q/]%OdDKfM̖(~1Q9/S%s&_2W%N/̝(~<5Qy/[%%_DK(~,(~ɂ,(~‰,(~ɢ,(~,(~ɒ3Q/Y:Qe/Y6Q/W%N?,(~ ◬xD%_R%+'_J%&_Z%'_F%k&_V%k'_N%&_^0Y?Q /0Q/8QM/4Q/Q/1Q/9Q]/5Q/=Q=/3Q/;Q}/7Q/?Q/90Q/98QC/94Q/9Q/91Q/99QS/95Q/9=Q3/93Q/9;Qs/97Q/9?Q /0Q{ʼn\(~ɥ\(~\(~ɕ\(~Չ\(~ɵ\(~ܐ(~ɍܔ(~͉ܒ(~ɭܖ(~ܑ(~ɝܕ(~݉ܓ(~ɽܗ(~<(~Ƀ<(~I%$_h%%_x%O$_d%O%_t%$_l%%_|%/$_b%/%_r%$_j%%_z%o$_f%o%_v%$_n%%_~%$_a%%_q%$_i%%_y%_$_e%_%_u" $>Гo/.Q/!Q/)Q/%Q_/-Q!/2Q/:Q~ (~ɰ (~◌(~Ɉ◌(~ȉ◌(~ɨ◌(~◌(~ɘ◌(~؉◌(~ɸ◌(~L(~ɄL(~ĉL(~ɤL(~L(~ɔL(~ԉL(~ɴL(~̐(~Ɍ̔(~̉.Q'_2K%&_DKfKdDK(~)Q9/+Q?'_DKNdDK(~ɼ-Q/{%HdDKHdDKJdDKIdDKKdDKHdDK(~R,(~2,(~r+Q'_DKOdDKVL俉/Q/Y9QU/Y5Q/Y=Q5/Y3Q/Y;Qu/Y7Q/Y?Q /0Q/8QM/4Q/Q/1Q/9Q]/5Q/=Q=/3Q/;Q}/7Q/?Q/90Q/98QC/94Q/9Q/1Q/9QQ/5Q/=Q1/3Q/;Qq/7Q/?Q /0Q/8QI/4Q/Q/1Q/9Q%_DKfI\iY/C%%_2{%LdDK(~ɜ̕(~ɟ/K%s'_2O%M$&_DKK#Q/Y Q/Y(Q/Y$QE/Y,Q/Y"Q%/g%K%_t%$_l%%_DK(~/Y>Q/Y1Q&_DKVJdDKVIdDKVKdDKHdDKJdDKIdDKKdDK6HdDK6JdDK6IdDK6KdDKHdDKJdDKIdDKKdDKvHdDKvJdDKvIdDKvKdDKHdDKJdDKIdDKKdDKHDKJDKIDKKDKHDKJ\/9&Qc/9.Q/9!Q/9)Q/9%QS/9-Q/9#Q3/9+Q/9'Qs/9/Q/ Q /(Q/$QK/,Q/"Q+/*Q/&Qk/.Q/!Q/)Q/%Q[/-Q/#Q;/+Q/'Q{//Q/y Q/y(Q/y$QG/y,Q/y"Q'/y*Q/y&Qg/y.Q ◼(~K◼(~+◼(~k◼(~◼(~[◼(~;◼(~{◼(~|(~G|(~'|(~g|(~|(~W|(~7|(~w|(~(~O(~/(~o 1݀(~ɐ (~Љ (~ɰ (~◌(~Ɉ◌(~ȉ◌(~ɨ◌(~◌(~ɘ◌(~؉◌(~ɸ◌(~L(~ɄL(~ĉLxC&MdDK&OdDKLdDKNdDKMdȺ{Md읽gGf;)TRvR i "u\~{ޯ=r->ToAQOF)$>\oAQ*OF$>RoAQOF$> (OF$>zo['~$>FoAQjOF$>NoAQOF$>AoAQOFi$>Ioۃ'~4 ,H|7J (-'~ *H|7J (m'~ .H|7J ('~t )H|7AQ:OF$>ko;'~$>AQzOF$>WoAQOF$>_oAQOF$> ('~$>epo{'~ 24H|7ʰ (OF$>eDoAQFOF$>{1Ș (c'~ 2>H|7ʄ (OF$>eRoAQOF$>eZo'~<$>ezoAQfOF$>evo9AQOF$>e~oAQOFY$>eqo'~, poAQ hoeAQOFY$> (OFy"H|7 ('~do5AQOFy*H|7AQOFy&H|7ʳAQOF$>ecoMAQ6OF$>eko'~l |o'~$> (/OFy%H|7ʫAQOF$> (OF$>eWo7'~'H|7ʛAQOF$> (oOF$>@oAQ noCAQ ~oAQ>ao#AQOF9$> (ǃ'~|$> (OF,H|7AQeoAQNOF*H|7ʩ (_OF&H|7ʷAQNOF9$>lo'~|$> (?OF9$>|o AQ~ soAQ~ koKAQ.OF-H|7ʕ (W'~$> (OF+H|7AQ r-H|7 (OF,H|7J ()'~ *H|7J K0J (i'~ >H|7J ('~d 9H|7J ߋdM~C] xWw IȎn:6H 2)THjz iw~Wq*= d$Lf$  +S9'7SyT>24D 1UL2Eb0ju~ԟuS)N=7)℥)TYSLU`WE2l|"L |3SFOu2sS5LjpWsdSRX0H } \_O jd۴'knQxAA6),A)OlAnG9],4sLd wV"HYL -1h< Rޚi]mk@OGr=Jϝ {jnLu'Ӄ]=^&?p =w3{Kd(yhF25hd ScqLG& #6Rk1)\T2yxL`j&g39d"l_@Bd=͙2Kf'02NF25\z3gDd'Le4^zdfIfd sOfE,&%L-e#d%t9V !#O +9*29d ku3ȳg= F6q훙ڂle91<yyyydv u2;bnd=o"{}[m2AE J=2|Az9l-3#A?<<I|x?i'd>%Y9c 14C3_鵨Y_I|DUr2!)WS7zgȜ=i> ϓ@'g"__ue72W4]?\52ב9O|''Yw5y=)ɓ6BR#i؞ITz2dD2qd YF&;A&'\Hn=/|gRBfSEbLHsqJI>vRR4f{2eɔ<_TuU%s3ͷ\LuVodja{]Rlo41=M$>3p;SMinF9W Z=6E!HG܉Hg ҕ+뺋L7TO{ }Տd wD2r/W: #s=Ɍ@F"52cɌC#y&k2)LEqAd:=3̤y'̡g.2,`j!SC4/AF" rel_ cq2Oг*zV3$2ky: =2ـl&vmf2[<Ǯmz>Hݼ@ϋ _%];ȼFdvB`j7]o"{}[ۜg?p7".=ȼGLF>!#Q?B#2"q#_p/Izb)f28Mz"=#=~ d~E2rKe7Nxl4uŮhF:/'?ʕxdHIRH=eR!44%]@&#dpYʆdGrpœdr=7KO>d \E*T1vH8RH)zJs2d"*Ϯ LUD*!]鹅jd#"H-js:LeA5`!S4= ؾEg1YBad)G84/CӼc\dg%UdV#Ok Szu3ȳ4n`F6!-VCqyyWlg=ӳمAn2{ȼIf/}-md?vDAE^?{ȇQq]p>3z>''l?|E)k[4Sgwlc||Ȯ#4%s:Nc>E>cs ⾤r)kC[4r9| G~)a*cA'tg~ Iߕ !^%;GBs ccJ+Hm? ;HO$~{I:_X5?S%c)J'5I*NTIϜ]Ɉd'3,4gE!i΁DrѓɃEќL S*e7"őĮH)4=eLCs d*"H nS]73u j\Wun%sRdj6RKO=>iDO iwۙjfHs`WKZ!jCs[܎H# TWN.2ݐL ӓb7S}c?2ȫs7̓8=d|/2wP2ud$2 ͮ1dƒdnFΉw|:er|BSd %r9|_9Ar]ߑ2?"縊'g"̯%2_￑\NƟd"7F:"/JJ:i&9I:yRќITZ$S HFNH$+ِAON2LaW^$SLd{! #E#s#ۋ3UMdJ)Ůdʐ)Ks9<=LU"S9u$U8OUzn!u+=1U5Bj=uG>Ҁdq]4An)ҌA҂-V4&&He{;=ҁlTg ];֍]iTO2x&<L Dgr2+2C <u@F"hM2cGf<2]ILMF055Hoݜ$s$~`T|c:A歽>ӂ3$~>8 $9A?1G 7.w?.X,B}Qd1Cd!(˘Z@CG@V"8jI֐YK)2O#z;,7لlfd+!#/E%vBlGv=3En o}/}4Em2 s;Ȼ!=}0a#:?2u 9|̧̝ܱϘI+_3i2g4Gd~@~r d~"3l̯͗+4_ewOEoN_$쉒,M$GR0IF itHz$UdNea*+SdGr 9ٕdГ7H|G Bi SE9s1nd8Rh.T)J#e)KHO%z*SLUoFnaW52iېHMka.z>HCi4avNؔL32in -ȴ 2iOOz:D3;3ՅI.SރLOӋL!ӗ~Lgj@ħ^"w3{LKf2Gpdwc$=d,S@Dd͓)Tdy>td2Y\ldSsiGf>BdyY$>ӕ2\RA>/#+]ǘzdjy5d"O!O#ggپ{Fdg3ߍ}+h~zKd^F^̯yvydv7ڍADr7!o!o#A]g~a> !r9C>bqc^Ogd> KN9I+"5 -rgx?ew|cy2E _Kev\a*9ȟ|5s̿ iN%K4LIϓ2mO*R#iItL'LeB2Mz3OIJIق$~>$rI\/W/L e*_Za,S>H ;CÂAWZ8'4e|Q^bdJ\2d"RDOe2U8aUfznA\̭ܱ SL-vfSuzL'iFܱL5AnG"МL ӒL+5҆\W;vggT'AOg2]ȝE{܋Lo2}% g A\= &s/!4ejx y2QhƐ ǑO~z&3d2SSidәLf!Cf.2dY,RyY®,EAgc:+ɬ"̓֐YKSdF gi^Of&6#[صW9!ɼĮWȼJvd:مyvë&S{y yO =9ęCާ0#l?J9|'ȧL}| %r]'Sïi9aY;G~Gz!繇 iDe2 rkL]g_27K*%JN&IFҰ+mוLz$D&3=Y$~lHvv9'SHtIQyc{~2R"HQF2ɔ@nBJr7J)a{Y2H"JHeW*%a*ojAş $$O&o 5L"S hO47"ӘL-3Քfd#-jIҚ6drvA״==tSwLO2]$ʝ4T7;Is/2᫠/ՏL 9w#hi! %3 ]Ɍy$2X2pr?S9$2)LME1 'Nf3YLNx'8'H9s>?/9$ -`Brq]yMB Ӽ+}̣l_,g q *d5$wuMB&~j6TZG ك<$iU] v?ܔ+c- w,ք')9d|=?|wȼH%ez^%=H5#PtA'1zSkܸ]4JQ<|+dylȼgryzs3G}0'̇SG:| #3 O| ?g 2_"'h>I+2_|kz3L%=:G< L"ͿKlo\*=3S"7=pטˮ'd6'GROJ> S!4铞0-ґId9#3gfW"'}od'\drUe{>#U3bWaz)JO1Fz[6H &zJ"HEqS;_QH*=7# 詎܊ƕndW-2A경H!i̮&HSܱloBZi{'l ; މd:%}.dsgpy wqݸAAvDzӛLNؗL?|dSi NxS{!Pv #QlMf 2#3 y"2 LA"8d@fr7f3 Ocj>,D1SK9R2 kYN 28'Y*d5'|d-483Yd==صM|vmECqi~H%2/#0*۷AkL _1~ \}ڃ G-2oy0u;dE1G3!rS<|'ȧld_9A$u|CϷdN wɜ#s̅ 3S_+=}+L]ewO#s\_nȐt*YgH:H*$5i2$}Ӳ+ HF$fA==3$9IO.$7yeW>v姧=BHaz(SłO0+rR)eȔ<帊H"R핃$~GTUNx3r R]Ց[^LM2^CO]zq7Ӏdq4v2M4C#-\W+NؚmLcW{:$>G?y `3`ӕ;nHw {s>H_?gMfr2+ E!qɌ@F25.fj W1gw~29$d2 SiF^9tf< 竳$>e1'֌ ῿5}|~c~ğ^ 9A:[pi,N?| O.ejSއqj=yJv'|J3s %rWL⺾}CϷF>= ؾYDb2Y,EA,'cJdV#OrkY=|ugO|Fs2_9+2k,'d~$sy^ O\d2r߸WW?C52!sJ$Ϝ92sһLIϓI9 !@&#̜9 SYldGr 9\l\WCӘ&dn)floNs zZ2ՊLkzڐic=ҁd:#]JN.Dz!>H_w?S4u2{P2ÐNfgd cqG& 3Lg T4z@g:4 9,fs9d<YDb!} 0"(YFf9d#8YřW Gk[ [ $~blb>H$~ m쫞M|ps 7c\ [+^sAn=/!/# };אב. كyA2 "yy?HrG1G>f'ȧL}Fs NeN0uȜ"5'oL,|OȏC3u]?/J%_f7 r]"!#|י!KҩdY6'ϒt*IF it0= d2rd&Ake#AsNBrӓL^2ؕ)TA #E*CnDs盘*4R)J#^Dse SU[j:o%sRH Hmva.b 4"ӘLv)iƙ3iyZiіvH{NtB3'B+;w!NO2=9s/XoGs25lDd0Sr!á o<If2CXcjB# O||AdN 'S׼poӜ g;=]:'~&s\f72Ww$k:i&dHIc)Ȥ̚2*ȮBHaz E9O1ƬIߙU)IR2HY= LU$S)Hi $~jV%H*[5H'7I| V I_ ?x+ې SA⧜otpA:\i o͈?cXa}a ?jTvN)=x3ՂH+5iˮv=tD:1ud+r'Swtg{'7zMdU  ^ޫC8Pz!!Ñp$F15CXz15k@LMdjdʮiL=Lgjg25 2sylgS Z,!zp,EAe22ɬ`cGg%V!$5Z)id ۟%2Mfzي2o9@Az%s:|A2u9Ncv}||||yN9I+^SL}||f2g?!3#r9y. sJ%2S\E~O"72א4K ْfeKړL $eͩ4'-S%}ӓd2+3ɊdcWv$\dr#yH ΖLFAR"HQ=7"ř*A&XI2ȔFʰ,=LU"STFIl*=72hNV6kSԦH=# zoHO#i܎4Ҝ;ւH+5=miWw{23.d"w"w-H9azE7>Ly2Wg{5܋ A3 1d$2ɌJ"O|?4OB&35ʮidA2ӑL$3l2sL#32 EL-z%ÇYr]#d"Ǹҏu] "!s//:d+||CϷL&sYCG~Gޫu d~g.2 =hBU2??5:/r$dHIO"GJT*RIe*lπd'=dA"r$n9r$9Brs@>Gڏ;vOϑ/ $ 97li I9h;u]\'2?"_%2'+Uwv\C#"7Lzd9fIA&%*g{LӒI3髜 LeD2ѓ,Le /Sٙ$rɅyʇG i.(j *E!7"^M܍LBJ#eh.KH"RH OV KxAnfuՐWo儷!5ZLFSԣ>Ҁdi̮&v)=4'ӂ iMO-۱=SH ?uy"w"w T2=^7>H_ dݼq]3̽d C>}pd2Fpc982陀D'W2S5 yy>]39,zfCf.yd}Ebv=Df 0SK` =s{܍:̮9r||gs zDN ' 97A o AI=I{ $|R?m$~S^U9+Ańqkz{x?«s="7kNϿ N%˕4I'H$-IϮ ~ɘ+Ʉd9 H6g'ɮ\97ˮLml"d+ yyyy yyyَ@^nNf'w~SoM2o"{ڇd#\;4KP? |:?>`C G91#1 )9%'<|E5oo9i Sg|G{~L]'2?#i̯%2r^;dO^\Cs7<7N: IȝJSI;d iJ;ITI4#Ld2#Yʊdc*;H.+7gRB&S)T1F8)܄d{)އ2,*O+"*LUefnagԭUBjH=>= H#Fc 3i]mNO ӒL+5SmLC#H'@:#]ȝ]lF;ރLO2Hzr~d#hHL BA#Bf(a>N8A ihdLI4p\O#$D A&i;`_mN,/~>8%ȼG6W, # ^>]}ӹ3̤gldsy|zYyYL!d SsKzyYFrkS*W$YKSdf:z% d6ҳ LϖVc6y_ "^& Wl'kd^'w7͵+Mk6= wȼ˕b{az>`LA"qc2ϑ/x$s9| O~C[4ve;{~ #r3G.03S\B.+UwO/ou2"7I*$dR )TH8v'3H$Ofj d! }:LϢg6Ss`ׇ(ۏq?bqcv}|d@DN$Wr_]"~9ˮcy. ?13/ȯ%2WqUN;?kuz R 7Kڜ I/iO 2)TH|IOLZv#@sF2Leɗ=d';HN$= OLCSLAR"4eS7")AMdJ"h.a,rA0U[*1UB*7Tu2"q5ək!iC.zH}7 ӐL#v5&d!͙jd֜ Җv4]ׁLuB`3»+;鹋L7;Wу=C/~ `@2wkSps/SC0ǮL@F3*H',9d,^9D&!)p*iz̃L'3L25d.2Wy>"d1x8HO. SuIQdYO IoǐǙz"HI(+O ?匟;HLO$9^Z)O# "MLmF0ym|-?y^E%^ҳ ^'EnpoҼ}M~r]y!F>`ׇ:Ǒ8d@DN 'Nط:M2gȏ:g3r__K\eo_w '\gI%YIN&IΟLI"HΜLHfz YlHv$I&ɃE!\{AR"HQr#y' s=%RK)Ù")OgH+3ULL2TGne625H-^d uz>HCqds;SMyu1՜L 2-ɴ"Ӛmȴ*1՞Lz:~LufW2];ލLwғ3"ӛL2}~L@@yS05{ g=!Af$(2 !i@LMdjS)LMyyt23hIf29d撙Gf>dr,FB #KG(erVydDV1y]kȬEBkgg8zd=M\fγs6v=OKez^aU2ζ1:b 29Mv%y yُwsȼJ?@>dvgd>A>e3v}|Aϗ@N=oou2'sLG. ?qi\B.72W8U~GOzbo2 ^:/rC I()T954dҒIHz2ғLfz0L6$;S9$Ln$ɇG BHa(b1HY7n9Z 6xSJ&ğ*$H ?QX)$(,$bA*$0~>X1HV b儩xU՛[ոՙmH j"^ԥHNiTcI@Z2 i ېiK]9sz:܁tf{+r'w.!9s{EOo2}E1 w<=ܟ42C c}d##hIfgMf ǒGf<' 35Idd =S5 ykL@f"8ld2y|O,g!׵b!/Ag)=0(SːL Ǒ'pͫ'5%۟XG3L=G6}#MLf l#pd=#fj dƑ]Dd2d!0 d&=d搙K<2yYHfe.IlsN۶m۶m۶m۶mcl۶w>͎ZFs~&"̷b̬e> k5d< f#lſ-Orml( 'w]8e({!k(!χ 0dP(A9OBSuZr0<ψ?w9QzEyT\y4(!(5?} sYyuh_s*{oj~Q"u_NnZP^1.(חekNor[8.(`PT^Y !f%\ /e9(+`pĬ5ua+6@y Y[DͷB6w t7({ k/샘:@9 [zbr 0 9 )ثҳ099c]s ːubV\u&܂:A]@< Iy E%7JX< Yρ!خ!%2y G5:y7Ay  ;0ֻP=Q6-wgC@GPc@̧3s| Y_Aנ|YB {b~?Aϰ~_o@Y( e8^F7[dV<Ȋ%:[1P'>( EÄĠ$ѓBL2PCV RAVjI'-(NzP2@匠d%3(Y@ J6P9a傘P9䅱ASi*:E@)*!A⠔JRSZ2]ueDqO]W/ Y@)cU}XJP2TT:(5rM`ֆ:u .>*7?! 4: 9(- %V6m!(a);AΠtǺALw؊b?A{l ( k081CAYauF2X1P&BILS f*(`ۧ3LPfA٠e.x1AYY !f8\ ۵ */e(+AYc5eY7@FQ;Dq).fQ7ZbS'F9w]'juπe(/n7{g{D5e\xCe(N91EI,09"|c0q9I9 Ygsq~C (<wvsb.]W5PC܄q (w=P<(kLyEyBw$T~ b@~b(?/^OB1/|b^xb^:ļ!uwcoB mP]P}p!d}PP>(ྀWPkQ~~u# b~_@~ oPB#d<:q!&DALt`LHEzIJ[b4{$ &9lE I Ԣ2 ĤAA@쑟LP9({d\Cvɑ=[E%?d (Na)JQ*UJ@LI`T.-){(E,uʋ⯍+E+@ʰ]U@ J5S(ڸ6ԩԇ: @iJ# L7㻎q](V (maAL{1!(! liWPAVwjOPz*}!@@萃 f0|އ@PQ0.{6ŌylhXPALL3TPAtPf2YV@\3 BYbZ1K!fſꬂ>F_duPg=>!fT 1[`KB6PqwB]0w:{ k/T~px0T>Qpx bC'af<Ym>1灨 su>WU?(_0M1!ubA}yCP'`۟@yHx<+9(5D]';KzQ[C$}eQc~n(:_5CNEQMPmP]P}P>CX8#Oc#ʧ7>:C%|%7P[d}1?X?B埠 ((C?` :T刌#r!&bCLەDb$3) $:)NJJJj+ Ĥ%d%deLAu 9!&(+?Q AVa*YEA)uCR20zY*Y!dUJP2(UNUS bRԂk-u`ԃrjY@i JpjYaZ6P-TnJ{b: :޻@LWP]=!(AJ_خ~0V@< B0P2Q5ꌅqx5b&2FuiPg:̀3,39Pg.̃AYY AYbP 堬e%(@Y bAz?@u6-0VPAvPv삘ݠe/~: ( 0s b:D?! u꜃sb.r .W@ 5|܄:@ Yw .l=u@CPA< c=pܟYza@y^!yb^ş^7@yS [6(.(>`?YA | 1XC+PBw|Ogߠʟ`532+NHq!&^Q J (AIJB' (I!+$'%dWSCLP\҃ d̠d?Yr6br@LN'7(yN^"?d:NثE!(A)JALiSbBrU*@LE1! (UAG:T&ԩJmPRO=Jj1@i YM@i Y@iJ bZ6cb #(Dqro,.o*gtuo)^ShQ~ſO!E8!ǽtٽ3v?y޹?4 =6 b(!k(#!kČ13bAxP&2}Le >fi5Pg&Y!f̅6 f!T^YAYYKAYrzJp e 썵F_~6Af~Bme(}/:1 0(G@9 1|uĜg@9 9sb.Ëu .rP|vC Pn[(wA0 ?:@y'(?? 379yyPy<c1o@7!-Pކwy C؊ cP>ʟBg9|ʗ8o@*1C#Ϡʯa?`o uoP:\xD+rJP &1$%)I+Ӕ*:)!&(!+ (i!+(sJ&P2dAVvY9EY_-%dy@ J>`5()u ALapXBL1SP) 1eNY)JyȪJEȪ~*RBj15rMcԩ J=S4!(@i c5)(͠Nsi{%d5(m@i cCVP: 0V J7bzALo1}ao?!k A !3a G@HPF2:b&@剰'AdP2LC PfBYWgC95ẏZuPg,?+ f%Ĭ0`c-ĬAcme( 6P0.ݠ쁬샱C9!Pr*cA9Y'): ssu 0Es b.rB5PC 1s[W(=GT~b!ybyP^Eҗ`^W@y1lכ(ox~*T Tb>sQI2(]/E7+/ ZZ7wſ?(AE'Ϗ{gQ;⿹WQߔ w`^  +;R#;N<Ȋ%Zk$*>d%$@VRJ1O I cԠ:i!&(AJF 43de]٠rvbrBL.PrCVP|P'?lE)1@) JPBbSbJVR! Ĕ(AJE؊J0zePRj?S6lE J=PFCP4M!bZV[Co~V=tNt J7J {>P/?3A e(Caۇ?a+F@H< Ѱ]cXPAgL1a)5VL:3L3 fC 1` BPy ,eg%Ĭʫ!k de(P6蛠fY[AYۡPvB]=eT1A: (T>uC:@9 @<Թ1aKs\*kP:(7@ -pxbr܃:Ayu–> $y g@y*?Pyb^^P^ʯ:dʛu@̻P=y|Y( )(C| c}1_Coow=c1?3T YAб?a(%Ĥ%5(iNZIJz P'#de%3uBL6P^ur䂘P9x J>PCSB8, J1*~J@LIPJRꔁ=_b*@劰] 2dU*dUSF Y@ Yu̺0V=?N!(@i J) CV PZ 괆6bhJ b:tѻ7>?(@ k0 e(d ᠌e${c4dC 5b&ɢwge([_+H,4PC!o(=Yg2G7(sE=/=).Z {u (Ka?/VVZZPA 1@9 PcsbNrS=(=sPRυA){((Šrq)JIPJR2ˁRTdU*Tj:d6jBZԆ:u@ J=PC!4ύ! 49iuZ P Tn J;PCt;*wPt(=AJoP}!(A@A3YC!k(AHFX!k (ca3b&2 ɠLe*(@ p8Yf22惟,Eg7!k d-e,eY 1@Y PBub66Af8[@ u*e7bX@s:1A9YGA9:' $Ĝ:A9Ys:1@/AːuPԹ PnB[sbr܃:E@< $2OA3,(XC K0Pzb^Ay7Ay c{]y!|1OO!3P> Pѿ7-(A!#u~_ Wd1'd1C?9n:E(P!+*sDX"rGK*Da2Qɽ:neB`JQ{@I-4V[ܻCӉ{zQD Q&{FQf03,Ya?g%;(9@ J.8AYy!&P  ((@)J PJv! (er9PCVJ%Sb@LU(!(5!^b@UzT}iBF&P)49(-NK, ĴvP=t: 3du+(@JPzQ1s uALP>u胡PBaC (PFC1e(ADP& 2Ag@L8^lȚ\ȚCPBE!k (K!k,Ue (kaց66-Pg+l7v1 1nP@^Ol}?9APA0: Y@9Y'IPNAi|b΂r΃r.r T Y :܀s ۠w{0}@#y'S< 3< a@y^!UA^:C7Λ(PPޅ:X|P*P P_5(X߂(1*g>MA!'(C@ 召'd/(Ȋ%&rP(J c% b+}S U= bRjd*gP(i(n(N( %C?~|^-w߳D8?yF=?ͨ4w7[ȿw+y'!ϴ} 4pT(aǑ1*=?7я ?OvD{0a~~}&y,},<9!*n @B5 |ˉsXG?TzwHTTJYa%G~\bI&.!QdBXw[ |<eӞz&B^ӹF okpk}4xu.ѾFLvסjTO1nP8ًUϘ  Պ'ojDG5~|GJw^x"oЍıЦ?O4Lr̫4{ne>4W83{rCSj$l5GوFbm9`5>aA``#A1lDhV"l$FΆφae#.g#1aˮt696jtOh5b-Fll6 7tfc\8K/aF|F|aCz#†f6s6/zl$P}# l$l$6 w9F_6l$l$6 f6p6چFF3 8 G.ZFBFBFB3 9 m)ehV6r6 چcr#lXHH(lh> ) l$l$62蜣wF"F"F"38 m_&kDf6q6 چHDl$l$6 DDf6q6 =g#Zo$f6s6 چ7ӾFbFbaCHLHlf#1g#mkĔf6s6]$$$f6p6چ7оFFaCIz#$$†$$f6p6 Ozv_:I՜)Il$l$6 kCn%5 O,҆†o$5T6FRF2a#o;HHFHff#g#m9c0Musy#lXHH&lh~HFF238Ʉ mÿ.F2Fra#|.gFrFrFr39Ʌ miHnf#9g#ml$l$7\6|6S6HH!l\[{Oj7RHH!lhW 3)8) mg#e#†Hq`l0RظA?r6R*6RR6RHH)lhZ4%]4R6|6RR6RHH)lh~HIHif#%g#[ɏHHEHef#g#m}#ll6 W*z+TT†᳑F*Fjǎ5flVtFjFjaCFj7RHH-lhyJjzFjFjaCSRS6RHH#lxzolQ}# ill6 44f6p6چ?sJ3i8i m_ol1V8S8icH+l,Hkf#-g#msJZ:5V6f6r6 چ+-e#tƧ -g#hHgf#g#m}#ll6 7ҙHH'lh>(ll6l]do6O7^6)f6s6 چ?sJz39 mg#=e# FOglA}8C}8 † od0A69%S2 lhz#e# };/e6ܣzhf##g#mD{S[Fa#hjhf##g#msJF:d4Q6s،f62~8&7g2UF&3pGyLŔ<7$e!g >nD>LcrS_~/92^p$e|G?3kn5F9jV2~Y86"3%"̼d" dld6Eh^#u/8YG"lhiznFFaCטY3,,†1P6*lpyg#k}` 176y5F`*lh6l uL +Y9Y mg#+e#†᳑FVF6aޛgLyȦF67&lh~FF638ل mßS9%ll†_ Fff#g#Wq6$C>Iv39م mg#;e#윍†od7]6|6S6+:uB!q_'K\?e_!# rhyZ-V @+ hEZxV"@+ JheZ|V!@U *hUZz8WmberjA =.=.8mßr/=.8mq9haq:C)lL_Ҫ'fwPr A%†l06r)lh>9)9ll6 ݜFNF.al?K\o2K6|6rQ6r%lh\l.38 m(ll6dNFnFnaCks-lhJ6FL +9 mÿNFnFa#{FuNS1G6|6P6#lh~CF3y8y my(yll6όlUsJ^:5W6 kf#/g#m덼tF^F^aCۈ՝ F^3y9ג|||f6q6 چGll6 o}#||†||f6q6 nIMg#Zof6s6 چ7ӾF~F~aCOof#?g#m}#?e#F8> g@wA) lf6 p6 چ(@ll6 nz †f#`l0QQPP̃qלf6 r6 چFAFA39 m_o덂f6 r6 چ?l4QQHX3n8(ll6 BBf6 q6 چ?sJ!38 m?-D(dfgK,~(֢Zœ†E ӵha39 mÿQ^(lf0gmE S6 (("l$S`ڒFFF3E8E mge""†)ERFFaC""f6p6 FFQu(UFQFQaC產tN)jf(gmsJQ:5QQT6|6R6((&l̾hgsF17ѾQF1F1aCF17((&lhyJ1zRF1F1aC(F(ffgq=ٖһ8ZZl7QQ\6|6+6 +9Ņ mU6ll6 mFqF a.C}(+m0QQB6gdJgd +%8% mñQ-FK۰QQB6f6Jp6J WkQR7Jo†o4QQR6Qf6Jr6J چRQFIF)aCV=ǝRw{(%l?(efgmS*C-efgm)yaegmEKQ6J(F!ٺ!^֕"D6Q:7xٺҴG6sP:7x|o˫>[WZ6֣_:y'}4=Ǽ4eTGze\?K>e_gj12muDX1 揰a emß+й2" (C(cf g۞:lUWˆf6r6 چݢnmX((+lhiY-ʚ((+lhGYFY3e9儍ږ(t(trIgި?ʙ(('lhuBuچrr†#uD938 m(ll6wk~gU^]m7QQ^6ږ6ll6 o}†f6s6*=K:ԹiznZFFaCF7*٨٨ lhz]oT0QQA6TlT0QQQHG8UߨHFE39 mÿnQT4QQQ69"S*٨٨(lh5f6*r6* -oeQIQQF%F%aC٨D٨dfgmlTlT2QQI6F%F%38%'mQYQQFeFeaC٨L٨lf2gmsJe:T6QQY6QQFeFaAnw6Fިbf gm#mX٨٨"lh}*>I3U8U m_VlT1QQU؈r-%6Qf6r6 چ7ҾQFUFUaCFU7٨٨*lhRQFUF5aƞw%lTS׾k_lTlT6 jjf6q6 چcQ.†jj†jjf6q6 S?b&giߨnf:gmlTlT7QQ]6-bm8՘DذQQ]6sꔍf6~?̫uF~gGx jh:Z^V?@k5 h&ZY<@k Zh6Z]>@u :h.Z[=!=BY>N5;kwW ՠ==8m5bm{\QKLajWCzSՠ= eòcw6j&j٨٨)lhwHj4QQS6|6jR6j٨٨)lhڨ&eZF\lR۵v-38 mÿg\3efgm۵v-38 mgeZRv6jQf6js6j چ-6SFmFmaC6fԎf{oU:"†ڜ†))ll6O ٨^'ľ^FFaCuz::†FXa6ju)ull6 7j!_?<††g.ezFt٨zzz†QQF=F=aCp}N0YW IaF=F=aC(ll6?|Q_]íO7QQ_6gdgd٨٨/lh>)ll6 ~}F}39 uo.v69Shh lhw50р@6bmpdaegm}e&\l4T5 ghh(lhmmC3 9 m]kE"lXhh(lhZ!eFF]l4R}l4l46 =mdfgm=zqylxS4†FF†FFf6q6  ;Fݺ/66јX6jFcFcaC6vfߟHYX +9 mg1elj➭ۡ MD4 & 3:>[D8x>F nI0nޖ} ]_17 >nD>[ׄ&cބroVhl^SuMC6~S6kMf~T86u6DT%†4" 4l45єLko2hhghffgml4l43ьL637gnffgml4l43ь\بݡef8cn\(c s39ͅ mg9e服†ќFsFsaChNhnf9g1&VLs6Zтf6Zp6ZچF F 3-8- mj f6Zp6ZچnڂF FKaĨ+lTll4ђR6|6ZR6Zhh)lhs-s-ll6 }-)-ll6^8}V!vVV†ъF+F+aChEhefgmsJ+F+387hhMhmf5gmll6њZ6Fkhmf5gmIZS6Zhh#lfx6jNiC6f6p6چFF3m8m mg e66†66f6p6 }8gb-e†{oKキ5іV6|6R6ښhh+lh}#cvMteN)F;F;aCﯶWۙhh'lhz]o3юN6bF F;38텍 Za^}/}}/†o7ў^6s†ўF{FaƎt6:9S: lhz]ot0сA6|6:P6: lhw:P6:(l,w6:9#S:(lh~HFG39 m_ot덎f6:r6: چ7:R6:$l<*udaF'7:ѾF'F'aCc)cF'F'aCmmF'F'aCע(ltlt6bfxYδot6љY693S:,lhZ3]v6љY6|6:S6:"lzK r6х.f6p6چ].~]ltlt6 NB.f6p6چc#M0U6ltlt6eп@g]ijf+gm덮tFWFWaCFW7*lh>])]ltlt6.nasnf6q6 چ?tsJ738݄ m?OFS&lh 6l,LS|X]۰э]ltWsJw:t7ѝ]6k_鵯f6s6 چFwFw39݅ mñ%FMmT6ltf~F|?Lx zh>Z_?@ h!mX6<@ Fh1m\6>@M &h)mZ6=!=d#Y:qjA׃ mԃz{\zH6usnaq=x!=NF=ڨ e1cz9=ד=ll6 f6zr6z چ?_O3=9= m#h6vO3=9{H~7WnD/38 mge^^†ыF/F/aCl2ы[(|%[o۽ll6 ޔf6zs6z چFoFo39 mg7eޜ>F~'\P[a#PH>f6p6چ݇o1чG6Fcfgm>tF`6y6f"o>[ח[5s77x|o˫>[חU >nDij$cޗ~r7zN~=[Oy~?6~Џ~f~O86k~f"~O65f?:W3я_xpߌwp637џ_6|6S6/lh:?]G7џ_6bm$_aFa#Ť:bטA?4aC@`fcgcmt1aCplfýB5s +8@uMk 5@@aCHhfc gcm.HWl l 6 c S$lO4gcbcecAA†៛禃l l 6 17$lhwQ6,lsGV```39 mgc0ec†11``aCע)l l 695-!zMk!!†)C2aCCzc!!†kskV6p6 41T )Cl l 6 o }c†11PPaCpl䋵fmX&lk~1L1100aC07&lh3311L6bmpaecgcqj75v6+6S6.lh~Np39Å minfc8gcm86rچᜍ_)lPt1aCpk{n†EGе3#8# mßSF9eFJIifc$gcmD+w{F)lh2)#ll6 -:EG%l[лQjNEQf6Fq6F چEll6 NEQf6Fq6F چ]t.:(hacePMmfc4gcmD+=ll6 NMf6Fs6F چqC0EOV6Fs6R111f6p6چCעcll6 o}c11†!lk#FL_]$†1Fѯ1V7X3c9c míEQ/'7U-aXXaCKkfc,gcm#F511Nh{f5qqqf6q6 چ7Ѿ188aCqtNgfcgcm5ZLg3Gذ11^X<|?)ll6 =C=ll6 f6s6 چ1i$#lX٘ l<5|C٘zc † oL011A69eS&٘٘ lhoO&٘٘(l/lg & A/ߘhfc"gcmO g'٘٘(lh>)lLlL6 A)lLlL67*:N dfcgcm7&lLlL6 IIf6&q6& چ$$38 OZ٘޷?9޷?ddaCp)bmzaɜ†11ddaC;1daʺ>7о1aCSzc))†@>Vw6l);y7#lX٘٘"lhoP6٘٘*laU81U=45ĞIjfc*gcm9FGذ11U6O3jfc*gcm}c*eclIꡟIFNL<wYf`Z0nޖW}&i5O }M|O`3./ЛIb$M7Lmstt3y?.ht3y?.Dh~?N٘nfcz0xM/0wqx?mV6;@ hmQ8@[- ЖhmU:@[ h mS9@m жhCޗ?R/ umv6;f7Cz0͐mJ37f7Cz f{P6f dibLn!nf6fr6f چe&2LLaC3zx†+ͤl411K5d¤EY,2efcgcm=+~7{YY†әE211K6|6fQ6f٘٘-lt0Illl39 mgc6ecٜ†)2llaCͳ)ll66%ȼ[Agc3s8s m_o̡9f6p6چ?̡s3s8s mgcec9ˏ=;sUߘK\3s9s m{\3s9s mßS9e†ER6٘٘'l{f|<<<38 mhߘgfcgcmbk1ll6 ~<<38󅍦?,k=&1_11||aC٘O٘ofc>gcmt1||aC||39 5{|l.gcbcec†. l,l,6 7XX lhzcec%l,T׾k_ l,l,6 o,}c†o,4P6|6R6XX7"7Ѿ""wOXDXdfcgcll,l,2 T6|6Q6XX,lT-⦏:)l,l,6 NYLf6s6 چbb39 m_o,l,6D_XXBXbfc gcm}c Kl,l,6 v =]bfc gcml,l,1T8`ܵ활f6r6 چRR3K9K m_.kѥf6r6 چRR3K9˄oӅXXFXffcgcmD+ef6q6 چ2238˄ mbeceFV;yrzrraC,SXX.lhzc9]o,7\6{m)l,l6|ٴ 3+8+ m+hXafcgcm}c+ll6 f6Vp6V \NX攕tNYifc%gcm)+yJ3+9+ mJەf6Vr6V چXIXifc%gcN뇥r6VUf6Vq6V FCmXXX%lh~XE*38 m(ll67HlV}c5ll6 7x|o+>[6כO "ٺ7lc^/ظ86Į#\? Gj666gm7سl`pms:Wl0 B_@`fcgc1kt5?8չFznFFaC~t†lllll6 f66r66 n:$lB? 6 Wㆻ~&wMM†_ DMf66q66 چ&&38 m_Glll2Y-gs66g 6سllll6 fzb͜†)露ffaCff39n-f6p6چnn1E6[ t--†ᳱVaco 9[[)lll6 f6r6 چ?lsV3[9[ mÿV6a]kM66aCmtNffcgcmllll3M66638ۅ'_vul7]6f6s6 چLvLv39ۅ mÿ`6y507过ٱ# vh{ھmv @; hGڱxv"@; Nhgڹ|v!@] .hWڵz8g?+>N;9zNvCz_A0m:0m08l6q񛳱S;NNaCF;h†o;ll6 ܝf6vr6v :SWgcz{.38 m_k]f6vq6v چo2K6.naՙkn5sn39 mimfc7gcm}c7ll6 ݔf6vs6i?:{Ԝ){ll6 ==f6p6چC{ll6 ==f6p6 k?8{UK^3{9{ mßS9e†ᳱ^^aCKkfc/gcx'ا'lh gfcgcmll3O6>>38.,دOofc?gcm{ll6 f6s6 چ w?ecF8tN9`fg〰m7ll6 <=O9`fg〰mpP688(lTo/lqPظ/^}㠙†?[w>[wAAaCSf6r6 چ7R688$lp69S88$lhy!zr!!aC8D8dfg㐰m}e㐙CƹzqgaSC88,lhz0]o6qqX6|6S688,lh~8L8lf0g㈰}gqD#o1qqD6|6P688"lh>G(Gll6 ##f6p6 VX6[6\f6r6 چ8JGll6 <(=O9jf(g㨰mll5qqLE>t6ucf6q6 چr3qqL6|6Q688&lhze㘙c†zw6Dzឥ9.l.q39Dž m#;>.lJ7qq\6|6S688.lh}8nfx0ᇼNgrgNU 3'pG7~='9aD0nޖu'>nD^O;8;''g}Q=8N^pCM^yP?[w|O~pR֘]bm9zUI3'y?8)h5I3'y?8)Dh}f6Nr6N ӟ.qJᔙSS†_8E{)38 m?8E)38 m_cl2qqZXwAo:c;8-ly.|J?iiaCq:qiiaCi7N88-lh4e㴙Ӝ3Ƴ;tug>י>3g8g m?8C?Θ88#lh>g(gll6 N9C8cf g㬰$n^s6Ϊ9,SΚ88+lhz,]o5qqV69,SΚ88+lh~8K8kf,g㜰~Wsssf6q6 چ8Gll6 ssf6q6 چl9938煍9۞:Kyyy39 mgl\V.=f6.s6. چ2OreeaC׾L׾lf2g㲰m86p6l\l\6p+jNB+f6p6چ޸BWl\l\6 -zEٸٸ"lhrqUagqUqqUUaCs~g窙†EҵU3W9W m*e㪙kF[l\Sktq55aC57ٸٸ&lh~߸F538ׄ m_o\l\3qq]蕢C3o\}㺙뜍†៧\)l\l\6 -zEٸٸ.lhrq`6|# F{(ll6 oܢ}㖙[[†[[f6nq6n nq[SݦTll6 NMf6ns6n چmm39 m?߾Mٸmf6g㎰7;;!L3w8w mge㎙;;†qqaC3w8w 5g㮚S9宙†K5qqW6]޸kf.g㮰m덻f6r6 eRrٸ=7ٸٸ'lhF aeg㞰m~{?ll6 {{f6q6 5geg㾺Nw^of>g㾰mtll6 oܧ}㾙†G>e㾙T v-꾌@f6p6چ;l4qZm4D6Ap"Hm#"2_GFD6d n#R6ȆmAAjAÒL3N3du ZwϨm6ΐ ?{v>{vFm qlhl ِ1xq8q8K648ط8 ;jgdC{gaoqVm,ql8q8K6d 8 mU8m#W?vqNM9s9!c9SΩm6Α ?{v>{vNmql|N9mS8m'i11΋~<7Ϋm6Γ ׍nW8m'2q8q8O6d >6Ϋm6.&eKXob\s8\P۸m\ 2qڸq۸@6d o\ !cp jdcיEݸEE!c΋pEl"ِ1EE!cpjKdkMK%h%lِ1xq 6.aȆKpNq ۸D6d %h%l2وs—Mehel2ِ1ee!cpjdCu2qYm2qlT8"wU&a qEm ql|N+jW+dCk+p {Em ql=++U1TkVWE/zW6bWɆUX7m\6 vvUm*qlUhUl8$s&5R51vi5lِ1:\\S۸m\#2E^5lِ15h5l:6:R㺘S9ul:ِ1r)6cɆpNq۸N6d ^7C6cd},61ytqytjF0ِ1`h#Xm#&2nmcdCh0m }\yXdb{7  !cp7j7dCu76n`7Ȇ Mfy7Ŝr)76nb7Ɇm܄6nm6n ao5MM!cnB76nbFty&-N)6naȆm܂6nm6n )rKmqln܂6nm6nl~51n96Snm6n ۸ mV۸m&2qڸq۸M6d o܆6nm66՘4ĸ;dja;jw;dCpgٰ;jw;dCw;!cpw;jwdcɸ41~.7m6 ׍nU۸m%2qڸq۸K6d o܅6m6ׇqqOԍ{nS۸m#2;ۂG6l[p6aȆm܃6m6 o܃6mܳ·O0!s<[XZB-c,c-capS3sXeee,2222e{k{g}X>Z>Yb-c-c_|qI;_OB5.׸q2!k\8Cz;D]Bp 'c5Uq!'"}Qw_kqldOLjdC0QSg zm6 5}}!cpj6/y=0օ48dzen-?Px`a.n#?P;x`w`.p[V~}=?!{d=!w!npi+f&C\׃11>~7>m|6> `Amln|ulِ1F ȑt&FӆYĐ ۇub6b!cR ٰ-b6b!cp1FF C6d {J cx9y's󝤏qS">E{IkGv^9yq4k|To..{_=q=D|B1>+>'\>ݗ1;Iw>|91x='O|"2+>A6>ad㮫4?b jF,ِ1x kDF,K6d n#ڈUۈ6bɆmBjgZgg!c~Ym3lghgl3ِ1gQ -L/bN/j_/dC࿓||Qm|!2m|6 w~6m|ps_4'ȳagqq.1WX\˘e2ayYƼ-c>1_X<˘e,e2` %%}gKdKlKbKjKfKnKaKiKeKmKs_LT@s) qq\PSu :b8.hoOָ8.k\T1`qA5O.dl651\ hEmp!2]\P좶m F..7rQp6\Ȇ{#hEmp%Լ761\]xfW WlÕlnº᪶m ypUp6\Ɇ+᪶m%#421 qjqdC6Bq6bqɆӉvm6 ƅ6m6ưGFn`bw\.چF6d OavܝچF6d c3?D=m )nІچN6ԭ.lCj؆;ِ1xpu]mp'27a᮶m p66ܱ H?Z51x9Cm 27<  lÓl,X|mӅ?邞uT6<Ɇ'j؆'ِ1a=6< O!cpІچ'E6z<%/8xmxa^dCkX/R6Ȇ/8xmxa^dCs᥶mxbx Іچ7M6d ^7aV6ɆmxCj؆7ِ13Іچ7C6>:GL aQ6|Ȇ>j>؆ِ1x  lÇl|N6|6| _kb:m~×lX!IZ_ _l×l܆/᫶m  _X7|6| _!c mmbZĈ'F$6m$6 } +eb$t%tA%THm$$2_&k؄j dC6B 6b Ɇm$6m$ppYb^j|;e|]ۿݺ;0dϋ;߭ߩwo..yyqtϿSp=HD53=DpO+' }׃DA"D$"2_&kDjp=HD"d ߙHHL6v"[Q#HHL6d n#1Xm#1lL EbFb!c31Xm#1lhta#13Fl# ِ14 \&QHm$!2F8 |F8Fl# ِ1xHm$QHm$%ab$u[IɆjIdCρ&ρ&UHm$%2IaHHJ6d ^7BI6bFzH&n3F2l#ِ1 )6aȆm$6m$6 ׍dF2dFrށ ~01~#97m$6 ԍFO\M Fr!cggm$6  .9\m#9l䜲}^#)`HHA6d ^7RBm#l|SRm6R ׍F FJrP|)))6Rb)Ɇ{єMHI6d ^7RºRm#%l|O+%Rm#%l4<\&F*ыh*TF*!cpTjTdC6RA6RaȆF*h#F*l#5p?ZaS5ljFj!cIRIRm6R {6RcɆ)j4d|ariDHF4F!cpi4ji4dC4pFm# l=4F4va9Fs"̎s6cɆFvX7md6 ׍ndWȎmd'2ȮA68Cas5lF!c֍j9dCh؋Pȁm 27r@96r`ߓ'X|)߫m|m|O6d ^7u{ﱍɆm|m|==ِ1x^m{ K^9ͻuCwr_rE䴋0wco|.'|v ANsq/ϻu9ϩ9w\܇]<ݺT{^S^z﫹ϥp=Ew_sE.8WR;ȅA.r c>"#rE 1L d#F.l#7٘X[@#Vl̢r?jdC6rC6rcɆܰZVȍm&2(7[m#7lw#sO<lȣC6d G}DwsܔdjdC\6 bɆC+C+Q(H6d Y(Q(D6:ѷLBF!hF!lِ1x(F!BF!!cw w m6 BjdcϏ90ٰQXm0QlnuFal0ِ1R)6 cɆm6 m6 EsEsE6`EȆFX7m6 )ERDmQl|N)mQ(m%WW%bhQ؋U(m%2* m6 SuJQFQ!cpEjEbd7ǚss6aȆm6m6 )RLmQl|N)mS(m'M(.z-Q(N6d >sJqFq!cpšjűdCkFqF Aǘ%63;%Ȇv5@%6J`%Ȇ=[~{F lِ1R)%6J`%ȆF FIG[%:$\T(m$2SJ9FIl$ِ1x( FIFI!c}ђFIF)Q9חtLR^]iOWZ]JWjp+qq+M5N}siXJk\iQlF}hF}l>ِ1F}F}!c5l}hF}lMb am46 hm4Phm4 2hh@6d ^7@ 6` FZVLν/PMC@y~CFC!c7%nhH6d ~vPCxvPCFC!cFCF#4mW?11~7m46 Hmшlm{FjFdC6A6aƜn F:mb466Zw /w$5Vhm4&2;#ژl؈6Vhm4&2S9Fcl1ِ1hhB6.{]S&Fo4F&F!c~ 7m46 hm4Qhm4!2hhJ6}wh*}FSl)ِ15Uhm4%2hhJ6d Ni m4Uhm4#U;pLfF3hF3lِ1xhF3fF3!c~7m46 w h hN6Ƭnp:Q5i4'qWk-hhN6d lO3g +ZͱdCu96cɆFsvcZwJc~j.\܍];I-j-Z{W XZ~ 7aNR x[y =w?/'ܗ9ZYZ[~uuuuuuuubiemckg22626262elelܗTg=;dJhK˖.;-U%ZR1KKR]Zy%3<-aekl-֒*絖ƵT׸iE6N R頉J[ut+VF+!c~[m6Z hmRhm"2 h hM6,\hт4Z1AF˗[m6Z h mVhm&2߷o [m6Z h mVhmL6r|Y VlٳadCugX7~Vl|ghg6d GL6l6l6jm6dC6@m6`mȆaltpXwc4뼿hC6d NhFl-pbϟ&F[Q7ºVm-іl|Ni 甶jmdCsJ[8Uhm%2mjmvdm2LJ)LvnuF;lِ1vF;vF;!cpvjvdC6A6a۞abp^m=ўlF{hF{l=ِ16cɆ{F{FqgAFF!c~7:mt6: w6:`ȆmtPmt$Ϲ(攎pN騶H6d }uTmt$2_t딎jdCsJGhFGl٨Kg DF'NF'!c ֍NjNdCu6:aȆNF'NFg1e7FgFg!c~37:mt6: ׍ΰntVmt&2謶B6μ8W &Fװ]6`]Ȇ.pN颶B6d ^7Em хl| Em ѕlx_o:誶J6d ~~Wx~WFW!c𽯮p﫫FWl+ِ1x誶F6;&zn F6d ~vP7xvP7nF7!c9Smt6 ׍nF7nFw1F טE6cɆΈv'66cɆFwX7mt6 ݡjݱdcoó&FqvPxvPF!cuJN顶A6d ^7zCmуlFhFl{//dC0fV M __Ȇ{_`///dCs//j`=G)zўI6d װ=6zb=Ɇ甞pN驶I6d n'Sm'ыltwŵ%z^ E6d Nn/Nn/^F/!c9Szm6z mRm&tl™FoFo!c~77zm6z )[m7ћl| 譶C6o:b93@ ۇm6 a5l>F!caam6 mQm%c}E/}6b}ɆF_X7m6 }aWm/їlF_hF_lh^g&F?,q?,q?~F?!c^Em6 `Omяl| 觶nׯݺ%V_"~0wcnݯFv݁'} g_wW7a<8翪{~5Sw ԃtt፬w?A\jq=O"d mWm = ;jdC6@6`Ȇp1@6d R&1@mc1l4үƦ&@5i Tm $21c@lc ِ1t \Tm $2#B6bƸKwC|ľ o1Hmc1l hc lcِ1A A !c@A6aci70MMoja  Mm7l7!copmoodCkߠ6~68݇,pN1L6d o ``!c1֍jdCs`hc`lcp4=&C6MB6l7elcِ1~C~C6`CȆm 6m 6 ׍!!vas>y̎s(Q(!c1 ֍QjQdCs(hc(lc4ٸ;}pchxhh!cA߃1M6d ^7Fú1Zmc41l|41Zmc41l}'0cx xlc ِ1>O7Fmc 1lnuclc ِ121K6zM^Լ2l^N1K6d ck gƪm6ƒ ׍nUm%211G6Lq7q7qj㰍qdC8؋Sm#211G6d nc1Nmc1lKVfA&xxxx!cwdwdƫm6Ɠ )2^mc<1lx!}_1Amc1lnLuclcِ13j3j6&`Ȇhclc"q+E/:6&bɆװvDlc"ِ1xݘDD!c5DhcDlcp<Ԑ1IoL6&aȆmL6&mL6& ۘmLRۘmL"21 ژ1 ۘL6詆>&dac21Ymc21l|N jdCd؋NVۘmL&2S&C6&cKg~wo;;ِ1ߡ6~6~'27~jc ]mwlc (p=M)nLuclc ِ15Emc 1lnLuclc ِ1))vwK^C[7jLUja.K}n*S{{[7V?~}ſ~n*S|*螯pC41WLs4ݟ42+Az0|ELS4!cz0 ژ1 ۘN6oiĘ.lL6mL6 ?3>3]mc:1l|jӱdC6C6c3ȆݝMbbܷ1ۘA6d 6צ36f`3Ȇצ3t lcِ1~ hc lc&hٷFĝLn̄ucLlc&ِ13Ṷ36fb3ɆLX7fm6f ׍L,=.c1 ژ1 ۘE6d 6faȆ,X7fm6f i͂6fm6f ^9Ę-l̆6fm6f k;k;[mc61ljdC̆6fm6損1GؘmQۘm!2_́9js9dC9p2Gmc1lߘmQۘm%56h;gc1ژ1ۘK6d \\\!cpsjsdCppcb s6bƄضѡLyb2Sm6 Su8Qи2-M3F5SNm-ϧ1ۘO6d |||!cpjdC|:+Ţ&1,s!c~c7m,6 Xm,PXm, 2 j d$ ?np[UPmc!l|Sm,6 o, 6b ɆB"1ຒ 頋頋6aȆ"X7m,6 ׍En,RXm,"2SA6aNWNŜ)6cɆ{Ű]XL6d }-VXm,&2j64agv,222222222eleleleleleleleleleleleleleOn^>~A0KƽoB@CiqK`[qKp[B5N8-Q׸%-'co k\P1ָ%KFti71p/fRlc)ِ1RR!cpKjKdC6BK6bȆ@SuMen,uc2lcِ1e2e2!cpˠej˰edC6A6adcb,].O(.WXm,'2XXN6d nc9\mc9lr qq@-c+`XXA6d  !cp+j+dCt+j+d#U601Vp/fJlc%ِ1xX JJ!cp+j+dCsJhcJlchbMU*hc*lcِ1U*U*!cpUjUdCϚ6Vm6Vvg?w7a|xP?p=XG|Dj|~4։zփu껿׃ute G}:u#2N`|N`Z:\֑׃u:uzqTۗ71֋=pOkzlc=ِ1336cɆpXXO6d 6]mWXml ^ANNAmcl|mM7ml66 mlP؀ml 2 jdPCMҖ116:mgV7י+YݨH6d ck ۧ7ml66 )ᜲQmc#lnl66ml66^F *ebl&olR؄ml"279c8l\r<|17166aȆ-6t&lcِ1&hc&lc3pzY|Cy ff!ca}?پL6d >lsff!c9e3Ymc3llcِ1x>}>!cاO67lbVcx~c?|~c~lc?ِ1)6cɆ):e~lc?ِ1~{'Mnulِ1!cpjdCg6m6<'3: \T8m$2?7 |nAl ِ1AA!cpj6aa{>!9-cG,cYƎZƎYƎ[NXNZNYN[Ƃ,cg,cg-c,c-c,c-c,c-cW,cW-c,c-c[ۖ;{aQ<߂e_C5585!u;k!q2585a:R/Lahal0ِ16cɆm6m6 721j#daA3&:TG6`GȆX7m6 8mQ8m!2_S6mpyw]տ;0|/xRw\矋;u^/\=oryRzG\qGw(G|}(91Q7{T-(GIQ1/)LcccjǰcdC0}叩m6 `8q 8F6d >W6m6K[xKfboqq!c}pql8ِ1qq!ctC6c'FyfOjbp)d8ɿ'6N`'Ȇal4wpp>M  !cp'j'dC6N@'6N`'Fx9$61N~$7Nm6N ?NII!cp'j'dC6NB'6NbƎ8%ޑ9ߑ9q 8E6d N)N)S)!c^EOm6N ?z 8q 8M6YQtB㴨a8q8M6d N9 )6NcɆm6Nm6N j OȂ@#H|*}*Hm#"2;kȆ%R6Ȇalrpm716 !cmmagF {~71ΈuN9q8C6d o3!cq֍3jg3dChl,3=[&Ya,qVm,qlYhYl,ِ1wrU8m%2gjgsdc'331 砍sj簍sdC6A6aȆ!9!9q8G6d o6Ωm6Γf51 硍j籍dCy؋W8m'2ZaÜZ籍dCsyhyl:x&aqAmqlhlِ1*ڸm\ 2qڸq۸H6ڜiVqQ[wzQm"ql|N甋jdC0sJig Oobhm\6. jKdcIw2zDݸ%K%!cq ֍KjKdC6.A6.aȆK%KeqCLehel2ِ1ee!cpel2ِ1rڸq۸B6箫qE^W6`WȆ+pNq۸B6d c3F,M +!cqڸq۸J6t+㪰qڸq۸J6d ^7ºqUm*ql-ᰱi;E7|Ck*ql9ЫU5{gyN1 נkjװkdCu6aȆaFyg TS!~Ckql|Nm\S۸m\'AK+|kb\6C6cɆm\6m\6 ׍n\W۸m\'2_\6m\6ɆgdJ5?F0m [ -V6ɆF0jF0ِ1x66dlcL✇j7dCހP۸m 216G5iq۸A6d nqCmql nm6n &NMM!cҭ16Fv Xpzdobhm6n )7j7[dcmM[❤[[jC[prKmqldP+g +"716naȆװ[j6/6$- j"Цwn nܶ;0dk9IMw?i+$Iŵwmxom\=/g4QQzpG}zpw\51 OM ;!2#@w6`wFc|mb}]GU۸m%2]jwdC068c[-q۸K6d n.qWm.qlMqONrNrOmql{j{dCs݃sS۸m#2mS۸g8e3;?E 8#r>}CXeee,2n{b{j{f{nEZ^Y^[XƢ,co-c,cіG'XeeܗqZ9Ka:8̳!TCƅk\q!Td 5^ Q׸\Bƅq!ƅP1Z)ָu }nsS#LbjdCo}}!cpjdC}h}lh\L3と`xx@6d ~&x&!c..m<6 =6m<6901tݖjdC}C7?Txm<$2G!|GCl!ِ1x%W=N:u)n ˰jF(ِ1Ph#Tm#%2Q6BɆF(m<"Ovmfb<t>#G#!cpGjGdCu6aȆ#h#l1٨Vh\Lκa6 cc!cpjdCO=O=Vxm<&2x#cG901D00l#l|? maadC36°0!cuJm.h쁉.~F8N6d n#W6ɆF8jF8ِ1ph#\m#xB6s*`b<u O6`OȆm<6m<6 xm&a Fm lx7jo7dCu o6`oȆm6ިm68gbD9% )QjQFِ1((l#l|< GmDaQdC(h#Jm#n[nPzɫwBo"E{8_V݁'}}sqvֽsg 2މ+ީ;\ݗ1xz|xESx;!cNmM6w9ꔉ-֦pmmD ?# Vۈ6ɆmDCjF4ِ1hh#Zm#xO6*= #Y{l=ِ1x6cɆm6ޫm6ޓ jﱍdc{J71>g?g?m|6> ׍n|Pm| 21?lِ1{jÕ1߈FF C6d 6kl#lY_F C6d >@1j1GBw{>|Tm|$2?#\|Tm|$2aH6d g dGlp4=uD 6>aȆO D6d nImlL d'l#l+٠ɖ&Fx1mĒ +~+Vm#ۈ%2 {jF,ِ1x mĪmbFĬ~LϢ jdCu36>cɆgX7>m|6> )j/d#í;318W3$}!Qm|!2;+__Ȇ|}Qm|!2B6d ^7@_6m8· f'8s<\,c17˘e2iy[|,cx1?X|˘e,2hK`Kh222222222228i-(ojl濿=_'㸺'⸢Oָ8⸢}=u X'qI15nwb -%chko.dc^261\\.}m lÅlFsg s0Kobhm`.dC}+]6\ !cp.Іچ J6.Hےb9(s? W WlÕlwAWWچ+J6d ̪+zfUmp%2 mmbqɆc##S9%F\l#.ِ1LhOÚZqdC}s\W7Uۈm%2)g d ؆٨:a&mmandCnhMm p#2mmandC6ܠ 7 7lÝl^p]چ;N6d o~]mp'2Ea/ꮶm p66ܱ A'o61< hCm 2_xuچA6d nP6<Ȇmx@j؆'pi_M&S<⩶mx ͜16J2DobhmxbdC6< O OlÓlF3ڧT6F`bx놗چE6d ox~Km "2_z5چE6d n R6F'z717V6ɆaFg cj؆7ِ1 oh[m&2 mxmxc>dcGGab놏چC6d ^7|`Q6|Ȇ8m`>dC6|  l×lS kL _o~Wm%2 mmbdCu _ _l×ldchug dOsW\4716|xd{:kĈ'lă6m6 ۈmSۈm#2`݈ۈG6d Q3'S|Ck#G6:뀕&S⧶m 66 ?!cp~ІچG6d >9OmnW|mi^j|.+z2-ZD|sq7vwýj=K8߭w>~|7a*8<>tC_2C_pW}\|O:W;z?1EІچ?@6R䜲pMfRp|Yom 66!cpFF@6d c#3E}QJ6=8u#֍@@l#l}DF H6d Z I6@!ci16g716dc*/41Mdö @m#lj dCu# 6` ȆFX7m$6юLb3!LHH6d >$sJBFB!cewձ ! $K!'@ {R];ݥXqעťhB)kޞE繾oþYf}Lp"F&l#ِ1xF&LFfrnfFoL6~LgVȌmd&2+3|+Ffl#3ِ1x FfFf!c֍j,dwI01$yȒ}!Fl# ِ1xY6`YȆFX7md6 pwPCk# l {dƮi&FVieUȊmd%2a@VFV!cpYjYdC0u16vH?Pׯbhmd6=EgzgjbdlpMm#lndu#F6l#ِ1 )6aȆMF6lSmd6?u]ԍndWȎmd'279c8lF_Ȏmd'2_fkjٱdC M8c8l$ |s$_Ȏm %N>7!FX7rm6r 9`/Cm#lnu#Fl#ِ1&w"=U FNљLnu#FNl#'ِ1ٜdö=Sm#'l j9dC0h3ÆLMίbhm6r5mov=%F.X7rm6r ׍\nRȅm"2Sr9%F.l#ِ1{oRMίbhm6r 1&FnܔdvSrm6r ϝϭM6d n#7[m#7lY[n-FnlÕlL:hjM WQ7\apUp6\Ɇ+j؆+ِ1x W WlÕl܆+᪶m!M#Z0#=SZdCpgb 6 bd&x. zmx`dC6<  lÃl܆ᡶmx Іچ݆W!s"{_zVmQH-]x/^uBjœ{n]!8kRBo.]ІچC6d ^7|`Q6|Ȇm@>j>؆/aAߙbm צj؆/ِ1{=_ _l×l|vj؆/ِ1x mmbS7lbg óu6 cɆFaX7 m6 +0VzaFa!cpj"dõTm;E:\Q(m!2_"jE"dCuE6`EȆ‹@E6`~dR?`bs~ܥچG6d ;~ma~dCཨE6 ?!c~S6S(*FQX7m6 ׍nU(m%2Ea(Q(J6d n(QTm(O6wF/lCj؆?ِ1'B믶m S:_m'27  l#lmL76!c^4jFِ1s$@m# 2FFQlT(&l6m6 /S(m#2`(Q (F6d nQLmH66@@l#lnºm  T6Ɇ@@l8Q\(mW(m'2F=[lضgm6 a/Z\m8Ql(mW(m (!z-Q(A6d N))%6J`%ȆF X7Jm6J o6Jm6JR711JpFIl$ِ17@JoT(m$2Q(Q(I6d o6Jm6J}+`(Q (E6d ^7JQJmQl-{RjRdCsJ)hF)l4<(-Ұ(Q(M6d /O f6JcɆҰ(Q(M6d ^7JC6JcAd=X#H66 !cmaAdCu#֍ l#lnAAjAF0(|u#XV6Ɇ)jF0ِ1xu#Xm#&2FF0Ql4w(#l6ʨm6ʐ oe6`eȆFX7ʨm6ʐ (mQ(mVmb^4!j!Fِ1=!ݞl#lFm 6B6BdZMLAYFY!cQ֍jedCkزp [Vm,QlLRYhFYl#ldwMPQ7BaU6BɆװp m 6B6BP!c^4U@߇߇)gGeeeeeeeeeeeeee,2ackgEYƢ-c-c ,c -c1XXe,221!rl<[Wzԕ'ݺrp+g\<xl]9XʩX9{3O.ٺrvS׮rx^ {>.ˬU#L ﺇww? kate >y-L ka@p"F"d AajaFyq\Wۨm'2QڨQۨO6d n>Q_m>Ql|NmWۨm4 ):h k7m46 hm4Phm4 2hh@6d n@m݆pLCs&)ɭ$5բZDCsIj@4;0O8$5O~C7O.y&! !1t[lY#xcw?׃21ĨzCd $>'Q D@1j1F,XõMXc3Vm#ۈ%2N kDF,K6d =VXXl#lF,mđ?`jbĉFFG6d =>{Sۈ6Ȇ-EFG6d 66Ⰽxobċ3jF<ِ1\}xxl#lF<mē ׍xh#^m#hD6"-}h$=FjFdCsJ#84Rhm4"2S9F#lِ1FF#FFc1G|yM tcxFcl1ِ1FcFc!c^1Em46 )j6}YO}~E~-&s455}cko`hd22eeeeeeeeeeeeelWcNMƝa שXS5k&׸&Td 5Qukk\q255 8_ָ&MF9\eb44ܦjMdC{1M^LSFS!c٦poFSl)ِ1hhF6运h&fon hF6d 5Q3fF3!cp͠fjͰfdCuLmќl h&Fs-b6cɆm46m46 vsFs!cp͡jͱdcv7LbܧkhA6d nBmтlhj-dC6Z@-6Z`-gbbpRm%ђlIvaKa.lhI6d n%Rm%ђlh mThm"Q DhF+VF+!cVpF+lِ1VF+VF+!cߟjmRhm&'ܝ$Zﷆ6ZcɆal;c8l>}Zm5њlm {jdC{j6dc"Fԍ6nQhm!27~Fl ِ1xhF6F!c9 Fm іl< ]rkOZhhK6d {[{[F[!c֍jmdCh[hF[l?[\iLvF;hF;lِ1xhF;vF;!c֍vjvdCsJ;hF;lO5@ߨm|m|C6d$"FRCkl!cA)=Z`ߐ Fml=٘xh/E}jdC{y{F{!cg3jdC6C6c%)&F:ܔdFlِ1)6:`Ȇ蠶@6d ދv6:mt6: Gvn(va;mt6: ׍ntTmt$27:~FGl#ِ1w,;B6:bF,c?IlbtsJ'8tRmt"2`褶 D6d ^7:Imщl|NmtRm|K6F6w4>&ƷƷƷjbߒ Vm[l[!c~[o|--ِ1-ƷFgqpCFgFg!cpjdCu36:cɆ3Ym݆wd#Ag{s;(;"{:N;sdyٺN}}sg뾃;=׃.t>71SE]`E}zЅA蠋A\׃.PD.t!2#@]6`]F9 *uкmt6  mtUmt%2_t돮j]dC}DWhFWl˖,MnF7hF7lِ1;;6aȆF7X7mt6 ׍nF7nFw[JU`bt=fwQtWmt'2a讶N6d ^7ú]m;ѝl|ߢ;]m;уlz{衶A6d$A6lmOF!c֍j=dCW{@=6z`=FK31z:_Olwzm6z ׍nTm$2詶I6d ^7zB=6zb⿛oM^nuF/lِ1^x/KmыlF/hF/lِ1x/ 襶 M6nv=kvo=jdC6zC6zcɆm6zm6z ׍FoFs_[+x/|/Flِ1;};}6`}ȆϝNm6 S@}6`}Ftfb7j}dCkؾp Wm/їl|Sm6 )}j}~dcR >71~7m6 )OmяlF?hF?lِ1~F?~FqzKLuF'~UduFl?ِ1~~6cɆ诶O6d >6m6 Sm 6 ׍n Pm 27~clcِ1xm P`>>0?ov |celelelelelelelelele{X8xD$dT4t L,l\<|aRsl${l: kpM5P]7jaxg G 9~ìbhk@\R1xk@uk@q2k@uAdc ߷db } 7Rm "2o lcِ1gg6aȆ{A A`=E ``!cߟ j`lc0ِ1j0\S Vm &2C6cCCD<C6`CȆ}!jC!dC6@C6`CȆm 6m 6 kb 6BC6bCɆ}jCdCPo Um %211F6==&0o 0a0!c~c7m 6 ׍an Sm #20hc0lc8X;E-c11N6d >p>pp!c^t8Em 6 ájñdv>bb//Pm 2#`1A6d ;Pm 211I6o5\71F~c$7Fm6F  mTm$211I6d nc$1Rmc$1l4ov\ÎRm"2EG^t(lcِ1x1 6FaȆFA6Fa\11F1֍jdChoVm&211M6d N mVm8ݺ}QٺaZv9[=?W;\<xl^}}snz0yagZ]2ƈb +ƨ\ݗ1x1:v0׃1@}GQ!c>b 1Fmc 1l &X c6bcɆ犱p1K6d >WsXX!cwVBc6bȆټMqnuc8lcِ1q8q8!c}qp&1G6d ^7A6a[=kbwiɆ"ȌWm'211O6d nc<1^mc<1lmWmL 1A?& !c~c7&mL6& ۘmLPۘmL 2 jdlˋ21&1֍jdCDD!c^t"E'mL6& ۘmLTۘmL"xM:abLI&U$I$!c9eS&mL6& ۘmLRۘmL"2S&A6&aƖ,O8fbLuc26&cɆu u1ۘL6d nc21Ymc21lnL6&mL6WO8jbLuc S6`SȆ)ߘ1ۘB6d nc 1Emc 1lnL6mL6 !eMd#AIdDTT!c$ak*ٰjSdC6BS6bSɆmL6mL6 : J|Ę&4X7mL6 `1Mmc1l|k1 ۘF6d nc1Mmc1l,؃31 Ntt!cwwmL6 a5tt!c~c:1]mc:1lܞaMǹuc lcِ1xݘ  !c9eSfm6f ۘmPۘm$?>c1ژ1ۘI6d {_3}Tۘm$2Sf9eLlc&ِ1{3j3YdAG11f YjYdCuc6faȆYpN1 ۘE6d ^7fA6faƔb.61f jdC016l1ۘM6d ^7fú1[mc61l mVۘm!g/E?ebas6`sȆX7m6 s`1Gmc1l|NmQۘm%=abuc.s6bsɆaFOUۘm%2saݘ1ۘK6d >̅6m6 :Ę'l̃6m6 e2Sۘm#27~c|k|lc>ِ1̜ad||!c9e>Sm6 ۘmWۘo> "EŖ%,c,c-c+,c+-c,c-ck,ck-c,c-c,c-c,c-c[,c[-c,c-c;,c;-c,c-c?ZXZj޴s-l:-5nq 5nq o^׸Td ~^{<@]j{-P׸x[H6>u8yP5BB!cp j dCB8-TXm,$2XXD6J*[?vHb/`)}{{T`)KɁߖjKq=XJ"d >W,6m,6~ ;f6E 7~Pl|X#~Pl?mm@6d nhedi@TQ&27 .SXm,#2? X XF6d G,32e2!c2hc2lc9٘;e&rbrqY7m,6 a\mc9lrhcrlc9ِ1xXm,WXm WOwoBi{Z+6V`+Ȇm6Vm6V XmPXm 2_6Vm6V,.11V:m4?dM67ּaWm6V +a/Rmc%lF3FHU J!c9e%Rmc%lfV9LUb SVm6V `/Jmcl| SVm6V XmRXm&cv|c7V~cjlc5ِ1x/6VcɆ):ejlc5ِ1xXXC6& 5X#;5jk5dCuc k6`kȆX7֨m6֐ ׍55Z~#X+ְkvZlc-ِ1xk6bkɆZX7֪m6֒ kjkudܒ[{11 렍uj밍udCuc6aȆ):e:lcِ1xXmSXm'}_f^XmWXm'27:c8lw9WZ뱍dCp^mc=lXmWXml  {dAS6u !c pclcِ1Pg 5z3=u׃=@s8WQ؃!csGmcl|A&^ d# B~{6b{ɆFU؋m%2ثK6d ^hc^ w_֋_" >9[X~]]]llbjfna2v2vݗ}TJ|C@ixgu|gu5n8>uۇk>q2_G}׸}Td 5n~} MN)O6lM~~!co?m6 mW؏m'2C6cL|8 jdCHZd֢P8m 2q8q8@6d 6m6~"9w'cIm'l'!cg?g?mmD6d n'h'ȆmmqlxK^&AQ7ºqPm qlAhAl ِ1AA!c~ qPm qlQ٥qH8mR8m"2|> >q8D6d 7{R8m"2q8q8L6ZsqwXjdCu06cɆbýjdC6C6cGjboQ8m!2q8q8B6d #!cuhl(V5]LbN9 産jGdCkأp {Tm(qlQhQl(ِ1Q1QoZq:DŽc1c1!cq ֍cjǰcdC1؋S8m#2SA6adb6C6cɆm6m6 aq\m8qln6m6N7hb ؋P8m 2_j'dCu'6N`'Ȇaldgb '6N`'FAS+|8)zѓ=q8I6d ^7NºqRm$ql8 j'dCu$qRm$ql?ңv&)aqJmql={SjSdCs)8R8m"2/qJmqlw-պb[7N~il4ِ1x8 ii!cpjdC6NC6NcgN׭Zg;jg;jg6`gȆs~l ِ17@oQ8m!2q8q8K6~qm&YQ7ºqVm,ql= {ѳjgdCu,g6bgɆ6Ϊm6Α sǴ01 砍sj簍sdC6A6aȆm6Ωm6Α o6Ωm6Γnmfb6C6cɆ{=q8O6d n#zEyw2Iضer`vvp׃@2".zpD|qڸq۸B6.qqiü}l|\Q۸m\!2Ӻm\6 ۸m\Q۸m\!2߷m\Q۸m\%{;~ĸ*q۸J6d ~F*<Um*qlU|Ul*ِ1~UhUl٨A71;kjװkdCHˆ^#66aȆm\6m\6 )נkjװdcDVǏKEݸuu!cF9UYZױdC{Zuu!c9:q]m:qlbeȺ& 7q۸A6d oqInm6n ۸mP۸m 2_ހ6nm6~!_6y>ES~_6~6~!2F}K__Ȇmm ِ1__6~6n 71n:;MݸI6lMl&ِ1xݸ MM!c~&7nm6n ۸ mT۸m"Q51n~7nm6n ۸mR۸m"2_ނk[jC6nA6nm8sE|E7;n[q2v2v2v2222eeeeeee7K+k[w?,c,cZ>Z}}}|6ոs[vt[NDwrokm\nS13mukmq2n趺568܆5&7߁};!cm6 Fw`otGmql|mQ۸m%AN jb {Wm.ql|.߿q۸K6d ^7ºqWm.ql|/.qWm.qlql|NjdCkpMu_m>ql|>q_m>l/U01s9jdCu6`Ȇxx@6d ދ>6m<6].g|fb<sC8kjϱdCu96cɆm<6m<6^.9x!l6^m6^ Pxm 2 x lِ1 vC^u!E]xbvkoj'cv Vw77O.y7xSp=xIӠćz/E=x KK2#^>K\^?C{ TxK!c%Rm%l:s)J`Jml++lِ1x VWjWdC6^A6^a#eV-bb6^C6^cɆD@gr_m6^ [6^cɆm6^m6ސ{^kb6@o6`oȆo`oFm lhl ِ1hl-hZD>&[a-Vm-lID T7ުm6ޒ x mUxm%2z mUxmN6f%5Ejc ^w߱Ɇ~{ZmmN6d ^7~6~WxG6~Ux'l6ީm6ޑ ~kSxm#2E^;lِ1w;w{qyŜ)6cɆ{X7ޫm6ޓ a5{{!c={d֛q@mmA6d S7aj` ׍?`Cml!cp@mm| š<8 A~lِ1:\|Pm| 2E?^lِ1x/lߣp>Oo ?66$2yNly~CkOlO!c$$mmI6d o m'<'(&G sS> әK6>baQm#<;1:#\|Tm|4OQD n#Qm#8롫xg/_ja q3ק\oW166"2__dC__jaȆcal8y g?m|6> `Iml{OjOdCuImll>}&go|gg!co}L6d ^7>úYm3ln|6>m|6Ysjb|q S̿ [1B6d /!cp_/j_/dCھ@_6m_/0 \D1XbXXRX2XrX XJX*XjXXZX:XzXXFX&XfXXVX6XvXXNX.Xn˘e,e,._Y727):[%b5U#g G{W15N7?1nk\k\T1l˖,&FB%tAQBFB!c9 m$6 %tAt 6b Ɇ{FBF"8$3\~"Hm#lF#g 쟅MHD6d n#Hm#lF"h#F"lÅl ;cFEp6\6\ !c놋چ B6d >9Emp!2S\  l#1pp"XH m$VHm$&2HHL6d $VHm$&2HHB6;jHgb$qI6`IȆ$jI$dC$.hDm# lFh#Fl#)٘fTIa/Tm#)l=.=jIdC6BI6bIɆm$6m$6#߼H&l$6m$6 ׍dn$SHm$#2 H HF6d Hnq+9HFs.92E$0O.ٺArv߽frQ\}ᄍxJvγu=Oq=HArnf%7Rzփ껟׃te c=f  2)`=H׃$B Bm#l Ryʻ&FJc=fJFJ!cp)j)dC돔pRm#%lFJh#FJl#س?G$&F* RHm"2#R#F*l#ِ1E*8RHm"2/1Jm#l|Hx:# vijjdC6RC6RcɆFjX7Rm6R w6Rm6ҐtH#4HHC6d n# Fm# lFh#Fl# ِ1HHK6:z&FZߙDҪm6Ғ H mUHm%2E^4FZl#-ِ1FZF:ϸ>?鄍tF:tF:!c^4Eөm6ґ ׍tnSHm#2SA6aEdbwﺧwAﺧWHm'2HHO6d |5=|^m#=lFzh#Fzl#peB&FodF F!c9%S2md62 )Am#lFh#Fl##pS ɆEjdC62B62bɆmd62md62 a3B62bƜb6$ְ6F&l#ِ13LZ&LF&!cpLjLdCh&h#F&l#3ٸ2ȱgbdvgd23262cɆFfX72md62 }e{_62cɆFfFl+/ߚYDY6`YȆˢB6d ^7Em# l{h#Fl#+٠_}cbduN`VFV!c֍jYdCkجp Um#+lL d#FVl#+^F6Mm#llA6x F6l#ِ16\fSȆmd#27A6aƑ&}ibdu#;6cɆFvX7md6 ׍ndWȎmd'2SC6c9ȆKy01r֍j9dCႾCm#lj9dCu#Cm#l֏ݰY7$396rb9ɆtAgrsm6r )9ᜒSm#'l|ȩE6L\nu#F.l#ِ1R.a[.Rȅm"2_k\j\dC6rA6ra7.|lb6rC6rcɆSrm6r ׍ܰnVȍm&27rC6rcduؙVbombdC6\ W WlÕlnº᪶m  WhUmC6LXC#y`ȣC6d n#Gm#l{1_XaX˘ee2`+f YƂ-ce,c!P~ƍjuw_'7Q`sS87\ܨ|s󟛺ƹF5Nད5 87q2`sS87{sG6&C^bgS"E'9[S;gw`.ߋ$w^u?w?dl]>xy>{zA[^~Qz_}z{ɯv׃@p_-"?IA~h#F~lhm۹7Ml]tFlِ1FF!cRX- m6 j w17L wvhw wlÝlp}چ;N6d npWp6ɆІچ;QlLbN)甂jdCwYeAFA!c9 S m6 (mT(mxԉ|Fdjbx3P6<ȆyCm 2mxmx`dCᡶm"wlbu6 aȆF!X7 m6 (mR(m"2Q(Q$CZy撉)zQO؋zmxbdC{w=6< O!c~j؆'ِ1x/ mxmxb^dc߳ye|/^bNsچE6d N/ /lËl|O iymxa^dC6 / /lÛl| & mxmxcdC0616|tvZ؆7ِ1xu[m&2S o olÇlH31|D  lÇl| װ>j>؆ِ1 hGm!2_@>j>؆/r93& mmbdC0xg c7 *ֆ/K6d >9Wm%2?w mmbƺ;eb6 C6 cɆ°(Q(L6d N) )6 cɆFaF˖,OEľh/ZDmQlLxFFlِ1R)E6`EȆ"F"؆(t`M ?aS6Ȇ~j~؆ِ1 ?hOm#2mmaEF Jo>jb6BE6bEɆFQX7m6 ( mU(m%2SBE6bd6  lßl|mcdC?76 !cmmcdjL76!c9%)jFِ1;l#ln@jF1~21osA*Q (F6d nQLmQl| [ am6 }6m6Fjsz016a6@!cpFF H6d o~#Pm#$266dRCY.,qFq!cpšjűdCFqoW(m'2SC6c%(!z-Q(A6d nQBmQlnuF lِ1x(mP(m$I3(QlV$j%dC6JB%6Jb%Ɇm6Jm6J SJB%6JbFGf21J~7Jm6J ?k+R(m"2Q (Q (E6d >6Jm6J~nQڹ56J ۇYJm6J UUZm4Ql| [aKm6J )j6c̙ۑL0g`R0O{_ApR;;0Os&)V }sɝg=R \鞿moVC/X V`\zvA091\ EEzL"d >WCjFQtWte~gYFm Ql,kD2F!c +ʨm6ʐ (mQ(m)>,h=f5B6B!c$!9IFB6d o-B6B!cp!FFQl,<S9FYl,ِ1x( FYFY!c9,Sʪm6ʒ 6ʪm6Bƽ71BwC]wC6BP!cpFF(J6d >9%Tm#%2߷6B6B6}YK/0oqs9,c-c,c-c,c-cU,cU-c,c-c5,c5-c,c-cᖱXX]X=Xe,2mok`khZ,cF.K9qy7ʉʩk\9\Q1\SS׸rƕ'cʩk\9\Q1WָrWad#|_61D&,FFF6d ~.L16°0!cA)EZaFِ1mma zXebuOFyl<ِ1xoT^F2Fyl<ِ1xoT^F2Fyl<ِ1T6*mT6*}Ĩ$JߨQ ۨD6d c#a#5$*F%lِ1>]%O'chmT6* Jjdc˗Eݨ FeFe!c*d Fe!c92S*mT6* ׍FeFq G$M*FhFl ِ1U['chmT6 a#A&F}&T6mT6j 1Ĩ!F X7jm6j ɭ!Z5dCkp [CmQlF FMuY&FMq )56jb5Ɇ7jj5dC6jB56jb5ɆmԄ6jm6j iib?ZjZdC0sJ3Fsw*F-lِ1R )6jaȆZF-ZFm"V&Fm [Z&?&r]M`mFm!cQ֍jdC6jC6jcɆ{FmF8X0jSMpQ7aW6Ɇװp m 66±p!c)FF8A6n\ԥ#¹N1Fٰ-#6"!cuJ\DmD`dC6"l#lFm!;pL:b_QۨC6d ^7QGmQl{:ju:dCFhFl.و>}.F]F]!cQ֍judCu.u6buɆF]hF] !zd#>yըQ.\<}g#ŵ'c9[W>Mw\<%?Uz{^׃H'ٹ})H8WD~$te _$|/R ׃Hr c"jD?"HHl#l$kqyP1tqU m=΃zb<`P86zm6z'G311zjdCsp.[m7ћl7jx:c8l6_m&2j>dX}L> >.}6`}Ȇ7FQm!2S<16Xգٳ_m!2o6mp՗l$ݢZD_ǿ[}O~n]_vǤW?}W/߭ y_5A? ~f_wCX~~te >S;A?r cP?!bEI.U ~#2T71~jdzažEo_m?џlFhFl?ِ1FF!cF؆/r OW?|Wm%2 mmbdC%mbdC_hWm@6_1@{6`ȆK K16`ȆM6@mc1lݺ؆وxT\WO|7}7Om#2FbD#IچG6d 7`S6Ȇצ~Іچ1lTDgcطW"6bɆǔpL1H6d MN2@lc ِ1@ 1 N6wÝ sQ/6cɆǔpL1N6d > cpp!cphcpl#lAom 66 !cFFD6d n#R6F :i1BmPm 211A6d 7F1Bmc1l|.:1I6˹Acsёj#dC01U^SZ#dC6FB#6Fb#Ɇ mTm"Rn}c`1 E6d 7F1Jmc1l(hc(lcِ12 1n|t"χ v9-1Z6RgZj- DK-Rd[j-)TKmaM"-Z6ReͶԢ-Kmk͵Yj]{>L0!{5ų.`u =.zc {\08`=.`q2_oqxM65|mb϶vA϶Vm&2ߋ bFm6F  mVm&2FC6Fcc=P#7ƨm6Ɛ mQm!211C6d mQmCg!om ϛC9Dm#!2)>m 6B6Bd#ю3V71ƊgǺgǪm6ƒ  mUm%211K6d ~x,1Vmc݆%qd#a0O0֍bZ8;8߭߿v0xkS_qo~܍)?85A(]헕;^ u1Cէ}]P pvA(91x?"B"Bq?%2_BjxiE*x6^mc<1lxhcxlc<ِ1ss6cɆfC6c/uhbLp0N 6&`Ȇ&}ajaFِ1x}#Lm# #2mmaadCk0h#Lm# ۘD6+uw&$7&1Imc1lIIjIdC6&A6&aȆǔI$IF8ٸQbZܛ2&FmmcdCI}ppl#l|jF8ِ1mmcF ϲmJdd!cpjdCkp ;Ymc21ldhcdlc h%M)).)jS)dCH,b S6`SȆǔ)pL1ۘB6d 1ژ1ۘJ6/q.abLsѩp.:Umc*1l|2SmL6 oLS6bSɆSjSidds{31w릹w릩mL6 Su4i4!c1 ijӰidCc4hc4l#l=8#B7"6"!cFFA6d >߈l#lFmL']S/lbLsp.:]mc:1l|17mL6 oLWۘmL'2SC6cd#ނ&Fx.#iTۈ6"ɆF$jF$ِ1Hh#Rm#ۈ$2 mDmDb3ƮJ]ob}c36f`3ȆX@gPۘm 2?Wjߘs6`sȆ7m6 )s9jsX17{3F,mĒ ۈ6b6bX!cF,oĪmbdC6bXXlc.ٸd21:杤dv\\!coͅUۘm%2saߘ1ۘK6d ~\hc\ 1;IrL}̓yj"̏5|kO9uy?~͏Z=5p?O׼,.7~0?te >V̇`>91X11$Bp;c 6m8}Yչ/^08\{>GR[h-[jK,2KmR[iV[jk,:KmRhdm6[j[,-6KmRivUsu_8X=.8q2qqũ{\qqd 8u=.z\G;cqqx'>sZ#^|6}6^m#ۈ'2pF<O6d >/^m#ۈ'2Cjz?T&^ 6` Ȇfj dC6@ 6` Ȇm,6m,6nkXN Fc銄ʛ) 6b ɆǔpLYXH6d ^ 6b Ɇm,6m,6 AKLE~"^XD6d ncHmcl|7m,6 11cw'ܩ.chm,6-_51 jdC].].VXm,&2XXL6d c#3F mZ%dyӾIM%bSm,6 %o,QXm,!2XXB6d hLYXJ6J_pGbcXXJ6dllؖKK6bKɆK\tRlc)ِ1R2ћfb,epLmclo,}c2lcِ1336aȆaldtplwe erĭ^D&r1X6cɆaltqpHwyI|Ckc9l|Sm,6 }-}crlcٸ>?3c+`XXA6d oPXm 2SV1e lcِ1 J J~b6VB+6Vb+Ɇm6Vm6V X mTXm$2o6Vm6V/^hb֭rA֭RXm"2oUjUdC6VA6VaȆ|c*lc5٘Y{RMbSVm6V X mVXm&2XXM6d 7VþZmc5liL5bLYǔ5jk5dC6@k6`kȆk\tlc ِ1|c Fmc lLo}cZlc-ِ1ZZ!cpkjkdC ?:c8l~Ckc-l4,9W&:acNmcl:hc:lcِ1:Nmclo4wpgbhm6֓qAmX/\tzlc=ِ1  6cɆ|czlc=ِ1ȆɆ6cޣu7?7168ؠ@6d װ66`Ȇǔ pL٠@6d 3tupTEY~CkclLFhcFlc#ِ1)66bɆml66ml66 pwpxsu_؈mD6*OOdC}'7~R l>O>Oj?a? hl_ D67}cc O٤ D6d &&M&!c&8ؤ D6d ncImclsqCmclhclcِ1ءI6Zy)v=j;dC}c';6vb;Ɇm6vm6v N.1%/{&.acKmcl݂]݂]j]dC]pKmcl|bKmcl_ku&n1 6vcɆv=jdC}c76vcɆ< mVm8WNqfRgXj-CaKK툥vR;fjNXj'-,SiK팥vR;g.Xj-KeK튥vRf]~w0{%I1uۃ{q2FbC=ζߣq{pC=N8Q='cy{<%1bfQL}{\.m6 ϛy>}>!c}j}dC6A6a_\`b}c?6cɆدO6d W؏m'2_o6m6:VdQ㘘ocjǰcdC6A6aȆ| ~C1lِ1c1cƯd̎s11~}W7~UlƯƯjb بaNv*ƯƯdC6~6~U8N6Ҥشda㸱IU)!4m6 8mW8m'2S1ql8ِ1|8q\m8ql4v41Nu N9q8A6d  !cp'j'dCk I1~ie'cy$0II!c)'j'dC6NB'6Nb'ɆNB'6Nm8^l$-߭ @S.?Ǐ~;0?߻uf؏'ؓ~p;%u?傞u?p?8EW_蟂R;8)r c{Sjp?8E"d ><mR8m&`qZMOpZm4ql|yjdC6NC6NcɆm6Nm6ΐ7b-ib! ǪϐSN3!cpg3jg3dCg3!cw@g6`gƆMb,ܷ8q8K6d n,qVm,qlYxYl,ِ1,qVm,ql<r|\8a=G6L/ÞS8m#2_ksj簍sdC6A6aȆm6Ωm6Γ"q^oW8m'2a8q8O6d 6=W'6cɆ硍j籍 d;@ӆyXٰ=,sAmqlo\}lِ13;3;6.`Ȇm\6.m\6.db\~EE!cg.g.m\6. E/¹EE!c=E%qmؠ6E/^R۸m\"2FbFٰq ۸D6d >߸6.aȆ)Kjd#k%6E߸ ee!cqjdC}26.cɆǔeњ018| p =ɾqEm qlY+Y+jW+dC{_W+!c{hW+jWdcZܛ2֘WE߸ UU!cuUNq۸J6d >\cUU!c8۳@6m\6__kqMa55k5!cuJWg 6aȆװ5lِ1r ڸq ۸N6UfJ㺸rOq۸N6d 7þq]m:qluhul:ِ1rڸqlq|YjS~cjc ;|w߱Ɇjc ߡ6~0=iݲn[jw,=KRR{hie=[jO,ߖ3KR{i^[jo,;KRh}>|F]:2q7`q7pA=Np}Cnwz{ n{ nP1ww7BgMb|Λom6n ⌑$MM!c5Mq۸I6d ~_&qSm&qlp<`b6nA6naȆYYq ۸E6d >oͷ6naȆm܂6nm6n/q[|G mm!coom6n ۸ mV۸m&27߆6nm6 _[\&7qGmql|q7m6 )wrGmql|qڸq۸K6Vx86Mb.zEm6 ۸ mU۸m%2qڸq۸K6d n.qWm.ql[SN<`߸q۸G6d >߸6aȆm܃6m6 ?Opڸq۸O6~|ĸ/l܇6m6 އ{6cɆװ}l>ِ1|>q_m>ltmKҪsLbLyǔjdC}6`Ȇ\lِ1:@m݆%?F?knpuZv]}8CIُWu[ o~܍xukC.jP􃇰V<"EV NJ?66$2G m'qlfkg=__dC66R l__ja #6R xD6&~#EHGo&c.{6cɆߑy ߑyxL6d >x 6cɆchcl H;Tx |l ِ1)O6`OȆ7m<6 xm`Ȇm|6>m|6>z<hb|6>B6>bɆG7>m|6> o|Tm|$2D67 11>1S>m|6> }}{_6>aȆ'7>m|6> km|Rm|&t78,g7>m|6> ϰo|Vm|&2L6d 7>C6>m·aZ"KRs[jI,Z2K-fRZj,ԖZK-RKoe2ZjXj,̖ZK-RnrZjZj\{>_ogN \ \ѳsʿN!V?1xKz?:q \'%pEs9u '2+qspKH6=X@#+%tEsj dC϶&tE϶&THm$$2HHH6d >7Jm$THhx+Hx՞4uDj"̏_ޭK$R;Hdw`~좾.՗1Z\\p?p!2Z .$B.Іچ J6\Zs?U#\W F !cF 8HHA6d 7R@)6R`)&01R )j)dCsєp.Rm#%lFJh#FJl#%ِ1xH mTHm"beHObl"ƥRHm"2SR1%F*l#ِ1|#oRHm"2 H HM6Z԰oVHm&2HHM6d >H 6RcɆװj4dcXu218mҐq~[NQHm!2S1%Fl# ِ1)i6`iȆFh#Fl#-Zo#X딴jidC}#-i6biɆm6Ҫm6Ғ H mUHm#_HH0#ҩm6ґ HmSHm#2S1%F:l#ِ1HHO6Jo[#xf'=|B#Fzl#=ِ1^[zFz!chz8MHO6d 7C6cȆ@#M 1Ń42 Kz62`Ȇg3md62  odPȀmd 2 jdcν 212FF8ȨH6d >dcJFFF!cpjdC}##Qm## ٸ8Q 77dCH,b$166!2 77dC66QD6rv^f&F&a#Im#lod}#F&l#ِ1|#odRȄmd"2_;Im#l_Vx&Ffa#3Ym#3l ̮ jdC}#362cɆj,dcƫ$Y,F,F!c,p+Fl# ِ1FEm# lod6md6\|Ua5lVFV!c]16lGeUȊmd%2ȪJ6d NRVh#FVl#H441)ljٰldCF6lF6!cF68Ȧ F6d >mdSfx9&y'iSC"Ewtu] ݁ǿv꫟~͏OWvxͳyvr5)d[=C/G꫟te 9r~|EPȁA!c~ȡI6vYg#Gj9dC0NCrm6r  mTȉm$2ȩl?Z&Ʒb-5Ul|-\|--ِ1ǿUl|m-ƷF.Q!۞Nk\F.\F.!c1%Srm6r \oRȅm"24Km#݆ܗu;Esҋ<qGny,Z>K-VR+h [jE,Z1KVR+iJ[je,wZ9KVRh`U*[jU,Z5KܗD< n:=.7q=.7q|s{\nrS1x {\nuˍ{\nq2=._8RU#ȣC6d >_QU+z;\oSȇm#2`ȧG6d 7Sȇm#2|jd+O*tYdjdCp_m#?lF~h#F~l#?ِ1F~F1i&F1cJF!c1S m6 )R@mQl|/Q@mQl\:r&FA\| ٸu/yFAl ِ1: \T(m$2 |FAl ِ1FAF!Mxf>&F!qSHmQl|Q7 m6 BoR(m"2Q(Q(L6,kbv0}0ٰݘ-Q(L6d 7 þQXm0QlFahFal0ِ1|0QXm0QlL.(ծ&F1(E6`EȆF7m6 (mQ(m!2Q(Q(J6 5?[)x'(|'FQl(ِ1FQFQ!cuJQN)Q(J6d ~(QTm(Ql$v|QL6aȆװF1lِ1x(F1bF1!cQ (Q (N6jV&Fq1-6cɆ|Fql8ِ1:8\W(m'2šjűd9OEMF hF lِ1F F !cQj%dC{%j%d. %FIFI!c𽯒p﫤FIl$ِ1FIFI!c1$QRm$Qlp| QJO)倫R(m"2`(Q (E6d >cJ)RF)!cRF)RFiQmQ(Q(M6d 7JþQZm4Qlo}Fil4ِ1x( mV(m!}b.gb2pRFm Ql|RSʨm6ʐ 2oQ(m!2Q(Q(K6>hPsojedC-늾[Vm,QljedC딲FYwdvy3&wwwjaߑ }}Sl|L)ߩm|m|G6d wwjm8^޼[g^nPjEwe?nG|v݁ǿ[=߫o~܍}}k=w:vƜ^91(W|Q#ʩ91x?(ES(A9!cyD9hF9l Ĩ"*jU*dC6@U6`UȆU|Fl ِ1\ QEm QlPiLoT}FUl*ِ1R)U6bUɆU|FUl*ِ1FUF5ŵmj`ߨQ ۨF6d nQMmQlwmT6 ?S ڨQ ۨN6#jCJaߨQۨN6d c3F l[ZձdCЪ{h6cɆաj6\0agv԰QReնXju-zZ}KRkd5ԚXj?ZjM-fZsKRkeXjm-vZ{KRduԺXj]-5w05Uj{4)_bǿWd >Հ_ u{\ q2_SՀkWd >Հ=_MQxd>Mg5Ɇ`j5dC6jB56jb5ɆT5ᚪFMl&ِ1s5j5Zd]Ĩ%Ԃ~jm6j ۨmRۨm"2`ߨQ ۨE6d >7mRۨm&qJ]˟ĨQlͰ怢S6jcɆkjdC6jC6jcɆ۵j:dOѮ&F7QGmQloԁ}Flِ1:F:F!c1QGmQldr*D&F]qvP]xvP]F]!cpujudC{1u^L]F]!cQڨQۨG6t&F=N)6aȆmԃ6m6 փ{6aȆ)zjdcj+>?F}F}!c{?ὟjdCpR_m>QlF}hF}l8_w&Fa@mрlj dC} 6` ȆǔFFCi? \!6Thm4$2S1FCl!ِ1\!6Thm4$266m46Z\Zh$F#7m46 hm4Rhm4"2hhD6d hhL6hXưo4Vhm4&2S1Fcl1ِ1FcFc!c11Xm1фlly\&dt&F!c&jM&dC&pDm фlFhF K^?ww~G"̏{|GrأYѯ~\GI}2珣h؏'p~GxT_q?hJ׼yr0yDS8hMq?hJW_)M~Д4"E4)1x?h m4Uhm4#~0L Lmьlfߢ3e3fF3!cp͠fjͰfdC6A6a ųgg6cɆ~Fsl9ِ19c6Whm4'2hhA6z:71Z8тl>4BmтlFgg uƴ.U F !cp-j-dCkF FKg@G&FK1h -6Zb-Ɇ[½j-dCZ{h-6Zb-Ɇh mThm"]>~O h hE6d ~&P+xG+VF+!c VjVdC}Jmњln8h-l6Zm6Z 33Zm5њlFkhFkl5ِ1|5Zm5цlshhC6d n Fm цl|Sڨm6ڐ 6F6F[-k]m:-\Uhm%2ojmdC}-m6bmɆF[hF[lhRabM&F;7NmюlF;hF;lِ1xhF;vF;!cvjdc8Ǚ&F{g0dk^r^m=ўl|_=mhO6d 7þ^m=ўl|LimWhmt z F7:mt6: ??>?Amсl| a;mt6: )jdsǡ&FGwxH6]b!Qm#ёl|LǔjdCuuTmt$2訶D6*81u`褶 D6d >tcJ'NF'!cpNjNdCcJ'hF'l35sanru&Y(Ym3љlFghFgl3ِ1|3otVmt&2謶B66[5銉E.otQmt!2袶B6d n Em хl|ϼ Em ѕlDa9RԺYj-5oKRzYj->Z_KRXj~@KmoXj-!Z6Rf Ԃ,HKm|q=^?o:yy7{{qd b<=8q2?qyP1x=CF!cp}>j}>dC6@}6`}ȆFhFl/~O31j}dC6B}6b}Ɇm6m6 7B}6bȆczO~oSm#2觶G6d >6aȆm6m6uZ/鯶O6d >6cɆ\Fl?ِ1VhFl×l/(.W6|6| _!cpІچ/K6d >1Wm%2 mmbF+oGab p1@mc1lhclcِ1!chclÏl96OS6Ȇma~dCcS6 ?!c᧶m $1Cbjb {@@!c1jdCsсp.:Pmc 1l|Lm Tm ">x190}cٰ4Hmc1lo }c lcِ1x A !cpAj ؀ 8W6Ɇװp 믶m 66 !cpІچ?@6zmO&FsL17ȆFxF@6d n#P6Ȇǔ8m`dC{FF1ls|,`7m 6  m Vm &211L6d 7C6cCbl?!df}CnC6`CȆ1B6d nc1Dmc1lo 6m 6\?Ml(tEmb.@76@󌗈pmD 66d6W61:)o %+\LwC6bCɆm 6m 6 o Um %211F6QLU&0g> Sm #27m 6 m Sm #2o 6m 6M.1N6d 7þ1\mc81lphcplc8ِ1phcpl#le&FGmaAdC{_Ap+Hm#"2mmaAdCcJm YcXÎkj#dCHak_#6F`#Ȇm6Fm6F mPm$>y[lbSF)#6Fb#ɆǔpL1I6d nc$1Rmc$1l| ;1nr(!5 1.+.wFFO'|'i ?J}Gٯq7_I(5es_ܗI/=%r>hKmbYjxKm6R &YjdKm6RfEXj-HKmeʹfYj-hK-RcZjs-y|˹/ԻnJBŸ Xq-ǵ`8Y0ׂ `xoq-:ǵ`=.yFngbp>ac*hlc4ِ1g7Zmc41l|=1C65#1jc1dC}c c6`cȆc|xlc ِ111Fو\>Eù&FSBm  B6B!cFFB6d 7mm`c׎Lo}cXlc,ِ1X6Vmc,1l~XxoXlc,ِ1x mUm#)Hcb}c6aȆǔqpL1G6d nc1Nmc1l|m1NmcJ6x}*梡p.m 6B6BP!c3B@jF(ِ1:%U6Ɠ1>/x7ƫm6Ɠ 'w6ƫm6&]f21&8ߘ1ۘ@6d  !c1eS&mL6& E'@6&`ƻwGEߘDD!cpjdC딉p2Qmc"1lDhcDl#l?^#L7|#Lm# #2_uJFF6d 76°0!cFmL"~gbL3O3ORۘmL"2`ߘ1 ۘD6d 7&1Imc1loL6&mL6^¦Fn/'.Kzfw-%46±p!cpFF8N6d 7aW6ɆװFF81lzM1lT^|Z%icdlc2ِ1dd!c1jdC6&C6&cSF$jO218q|ޝ폗S6`SȆa;8c8l_ژmL!2_L)jS)dC6@S6`SɆg떅&S9S9S6bSɆLSmL6 )S2Umc*1l|1ژ1ۘF6 |obLOOSۘmL#2EmL6 ۘmLSۘmL#2mLSۘmDO_4jbDFFA6dl .lض"6"!c1%)jFِ1mDmD`(0Ęfc:=_ wI6cɆt7mL6 oLWۘmL'21ژ1ۈ$'>Ĉ6"HHl#lF$mD H7"6"H!cF$m W|61f1eSfm6f ۘmPۘm 23`ߘ1ۘA6d 7f@36f`QdpJӏ21ĻuQݺ((l#l|# oDmDaQdC6((l#lFm$.)ib딙p2Smc&1lō}cLlc&ِ12)36fb3Ɇm̄6fm6f }Y>,Y,!cpYjYdC}c6faȆװYj6/y66/yy8߭mg1g0[-b]q?V;mw`~<)ݺpW|϶_}nǓ9߭ l5A4]-^.UjE9f4cF~4te >hhɁA4jѸD?hhl#l<[׼O#iü C6)1j1F ِ1X%z6Fm#ۈ!2mĨm`1dC6blc(9W&71Gmc1l|1s6`sȆ΁#9!cps9jsXSZbm צjF,ِ13±XXl#l| jF,ِ1#ڈUۈ6撍%s^7Ę+;ιjsdC}c.s6bsɆ\7m6 \ Ǚqs<-BKmR[b-ԖYj-JKmR[cYj- FK'KmRblmԶYj-NKmr>Lg:9fMWybjF<ِ1sxxl#l|MTjF<ِ1(ڈWۈ6SyH31j dCkpM@mcl}}j dCt@ 6` F*U ży!7/TXm,$2XXH6d 7¾Pmc!l|LYm,TXm," vgob,{6aȆ߻\߻\XD6d ,RXm,"2XXL6mb,pXmc1lo,}cblc1ِ1)6c?:c{?vpw(Rܥ[qbb-nE '@pI%! $8-VYs(k}V_w^w?~f j-dëS:z[>OEmc lhclc ِ1^Emc lhclÍlM 7X76ܰ 7!cpnІچF6d o~Mm p#2mmaeRt71^t+Eml6 Umc+lnlucVlc+ِ1:e+Umc+lLm{m{mj۰mdCuc6aȆ{mݦ F6d ncMmcl|yfbbl3o3oW؎ml'2Gm;|Gmvlc;ِ1cc6cɆvo!QQۡA6d ^7vCmcl|Nj;dCw@;6v`;FwhbNoT؉m$27v~cNlc'ِ1);6vb;Ɇ甝N.mcˆyc0UTTKmcly.n/|_Pv{"E'rI k^vɾ\S?uqQUo.]|`yIfi'W>\ݗ1xzES؇>!c}}>}~qMLbb?ܷدO6d ~~~!cpjdC}~hc~lÃl86U5aSCs9s9!cp砍sj簍sdCs9h9l<5,gR&yqVyxVyy!cp硍j籍dCy؋W8m'2硍j籍 dvKķuu6.`Ȇ pNq۸@6d nqAmqlhlÇlj>؆ِ1 hGm!2S|⣶m )>Іچ݆#ۺV^N\]$/RBLEvI\߭珋jœ}]+~Sݺ_T=ﳽ{VE =__/j_X|"|q=%2+| _ _lX݅LKظD6zn̵1/m\6. `q ۸D6d nqImql|qImG6";}#6 ?!cwH;$~j~؆ِ1x{L? ?lÏl66 71Ŝ lßl3چ?O6d nW6ɆmCjFhs{3yMa#P6Ȇom`dC6l#l|N 66@1R]@{F H6d T6ɆIF H6d ދBjFٸ4y$ omaAdCu#֍ l#l hFD6d >AAjAF0H柽嵜&FnmcdCor6`!c FF0L6d n#V6. 01. jdCprYm2ql߸ jdCehel#lLp|l&FSBm  Q6BȆ8m`!dCu#Q6BƱ3LPQ7BaU6BɆF(jF(ِ1xu#Tm#%2ECPPl x۲&_W0W0W6`WȆaz1wSڸm\!2qڸq۸B6d >\6m\6FCL0a# S6ȆyFF6d >9%Lm# #2mmadcƄMpa#W6ɆmCjF8ِ1ph#\m#'2^;W6&Ua*qUm*ql߸ jWdCsU8\U۸m\%2WjWkdnM7N51u5Nq ۸F6d ^7qMmql5h5lِ1x/z ڸq ۈ 3!lD@jFِ1h#Bm#ۈ 2MNjFِ1h#Bm#ۈ$]y)H8DmDbdC6"HHl#l߈FF$I6d >DBju󁰉q]<^W۸m\'2r>Oq۸N6d n:q]m:qluhul#l:~InbDFFE6d n# ڈRۈ6ȆD)QjQFِ1hm =<7qCxxCmql|Nj7dCu76n`7Ȇ va_'0іsX>Z·?=Hb8E(Fk\48pV׸h\㢩EqѸES1xo k\E&٘7w7w76nb7Ɇ翛pq۸I6d sT۸m$2qڸq۸E6fƄ&-s R۸m"2`ݸq ۸E6d ^7nqKmql7mR۸e6H]]N~Zms$_.߷uavp\<'6wdmmxom\bWoX#GĨ~ 1te ^b`=Q; @1j1Đ׃h#Fm#۸C6~]M;>;۸C6JP#!mQ۸m!2;-m6 ۸mQ۸m!2qڸq۸K6?~w&]G܅}]]!c.?m6 ۸ mU۸m%2qڸqۈ%O*/oLXcL()mĪmbdCwb6bX!cX7mĒ Bj=QbFL{bmzMm6 `qOmql=h=lِ1xݸmS۸m'Bcĸol5u>X,Keq_m>qlfNqbbhm6 [܇6cɆ-C6cOMό&|@mlxjdCo6cɆalrpژ7C)xm<'2xxA6Nv^B<ѿPxm 2xxA6d 3v2Ckl|NymPxm$o'Ƙ/KK!c~%7^m6^ بii&^ K!c8m821j/FIjOeb-l m77ِ166&2QicϤs׫I/dCkؿ66!CgGE@mmC6d nhȆazNu:!Ckl!c~hWdcg01^ WjWdC6^A6^aȆ+X7^m6^ ׍W+Wkqo@^71^ukNyxM6d /Vxm&2xxM6d n5Zm5lt> 01o7jo7dCu o6`oȆaltҋCk l|xxK6Y&[a-Vm-lnu[l-ِ13oɆ[[!c~-Vm-llvǮp㝰xxG6d oSxm#2iNRbhm6ޑ 9xnq̿O}`IW-_s$_.뛤ɁyU4ŵ;0O{I~y ʆt&ŵw_7O?/{y{xw=xjq=xOd 3Wtp68rNj׃$B=^m=l4&aAmlᴑA6e+/lِ1Li.bx16>`Ȇjda`8#<Gl#ِ1x6>bɆH6d n#Qm݆wvy6,=#e,e,e,eaKjKfKnKaKiKeKmKcKkKgKo`hdl222222222e,}qK\i~!O>>!?N)8Sb+F67Jŋq/F=K@}1`KH?1::ոO:D=K@%THm$$2b8mHHH6d >%t/FBl#!ِ1HHD6jak?#|[l̙ĭ\L"DF"!co9зu6aȆK@%RHm$"2DjdcbU51;[bmIHL6d +_Ɇ|%VHm$&2,{Xm#1l|HHB6|DHm$QHm$!2HHB6d >$sJ$F!c9% Dm# z]  2-TCmÁm8Ȇm8 چp p@ l8?r;gb$6BI6bIɆI@g$UHm$%27~#FRl#)ِ1HHF6~J$gMdF2h#F2l#ِ1xHF2dF2!cpɠdjɰddCu#Lm#llnK61 ɡjɱdCu#96cɆm$6m$6 SC6c)F Ox)O zBm#lnu#F l#ِ1ȤpߑIHA6d ~Q h#F l#%p9LbSRm6R H mTHm$2M ESm6R H mTHm"x\uHS9sTjTdC0kwtpڸ=duڷ Nj HE6d NI)6RaȆm6Rm6RE3~xZaZm#5lH jdCFjoVHm&2HHC6Cŕ>fb6@i6`iȆFX7Ҩm6Ґ HmQHm!2E@i6`iFE'qH+l6Ҫm6Ғ iaVm#-lH jidCkشFZF:A' 21 頍tj鰍tdCu#6aȆF:X7ҩm6ґ )頍tj鰍dc41 額j鱍dCFzoWHm'2E^4Fzl#=ِ1額j鱍 d3o7xl t6r F!cp j dC62@62`Ȇ F FFFFQm##ljdC62B62bɆmd62md62;j$E3}LjLdCu#62aȆ{Lͤ D6d ދf62md62 zE FfFf!c^43E3md62  mdVȌmd&2ȬnWd#$Wg׷u_jZWvI\p]_|ew`.p}[_Wo.]<ۺ=J}Ͽ ",gQ,d/czփ,jYp=Bd Gd}D,d!2_f6md61Sm71 c#+XfJrUm#+l6ee%)+FVl#+ِ1FVFV!c3+Um#+l(׶Lm&F6Gd}D6lF6!cG68dSȆmd#2 Ȧ F6d o Ȧ N6VO*|j]|~]m#;lήN=zZгhZٱdC6C6cɆ{FvFqUۛMb3̡A6d ^7rCm#l|v96r`9Ȇm6rm6rrܩ)I IʩI6d otqp<XZ9dCu#'96rb9Ɇald21j9\dWm01r ֍\j\dCp軓\j\dC6rA6raȆF.h#F.l#7o֙]uM6lVȍm&2575Fnl#7ِ1)6rcɆװjƅd5V]kb|-)_uj_c_ ׍aZmklk!cg_g_m|m|M6d ^76VC6oKyĜ)y6`yȆaF7W ix16`yȆL8;~"̎s5._>1{+L|F>h#F>l#ِ1z+ӆzm6 F`oOm#lF>h#F>l#?8\{ʭLF~h#F~l#?ِ1;$;$6cɆT*F~l#?ِ1*?_m#?QlzD&FaQ@mQl|ܧ+Q(@6d nQ@mQlo.mP(m$L:yQP vAFA!cQ֍jdC6 B6 bɆFAhFAlU&F!I!I!BF!!c3 3 m6 `QHmQln6 m6 ߜ[Ż6 cɆ):Fal0ِ1:0\V(m&2?0QXm0Ql>ؒ&FoF"F!cm6 (mQ(m!2Q(Q(J62y&FQ S̋ E6bEɆFQX7m6 ( mU(m%2Q(Q(F6?|QLԍbnS(m#2E^F1lِ1xQ 6aȆbF1bFqQ(Q(N6d ^7úQ\m8QlFqhFql8ِ1:8Q\m8Ql'JbQB(mP(m 2Q(Q(A6d >sJ F !c}F FIE}f%FIQRm$Ql|N) 甒j%dC6JB%6Jb%ɆL dFIlhHؚF)QJmQl]R]RjRdC{_W)RF)!cQ (Qn7ۺפ}chZ7vI?[ t7vɾ\S]H8 ߨ7o.]}7{ {W)hTC#J>4}\QZ4ɁPDiҸ&2j2daM2b(2je2dC]]Q(m!2Q(Q(C6d n QFm QlTrvpI&FYQ7ºQVm,Qle6beɆm6ʪm6ʒ [6ʪm6ʑ~?(ZȆw9rF9!ci96-Q(G6d  kN+I/GZ對rdC6A6aߒ _/x4VMko66%2-ƷƷdCo[ooɆm| m|-Qly9FT6mT6?c Ĩ&E}jjհjdCu6aȆF5X7mT6 )ՠjjհdb3{bbTsJu8TWۨmT'2?:<Ful:ِ1:\VWۨmT'2աjձd# 21jQ֍j5dCh ؋Pۨm 2QڨQۨA6d ^7j@56j`5F݀LFMhFMl&ِ17I57I56jb5ɆmԄ6jm6j ԍ\k{bkZ5ZdcBĨ%~'N`-ZF-!c}Zp_F-lِ1xQ 6jaȆaldspژ;3cjZ6oNaj[ckg2eeXXCX#XcXXSX3XsX XKX+XkXX[X;X{X؏NΖ.najS;]7Qۨm%eձQWv]F]!c𽘺p/F]l.ِ1x\u6buɆ:i#Z2F]ln=MzF=hF=lِ1z\oSۨm#2QڨQۨG6d T6aߑmN~;ﰍȆm|m|ِ1x7Sl \1Мwds'7jcߓ ^m{l{!cU]16j_Mͤbhm|m|O6d >|66꓍uĨ/pNQۨO6d n>Q_m>QlFMW=fH/F}l>ِ1xݨF}vΏ~0զ>y0E]x/w~~P;\<ٗ3.fw7O.v*=A}e@ԃ7P4/cGhv׃@kpm@- HphhH6BJ~Phm4Thm4$2hhH6d n!Pm!ѐldcRSW `hm4"8h$F#lِ1V#Hmшl|mMm46 hA6;/F#l1hLKab4u16cɆ{ưhhL6d h 6cɆ{ưhhB6fdqHDMi&F!c9 Sm46 )MDm фl|/ Dm єl{V&FSqviSxviSFS!c9)Sm46 h m4Uhm4%2hhF6>ܽL`LmьlF3hF3lِ1 )6aȆalwp[Z2F3l9٨4MjͱdCFso4Whm4'2E^Fsl9ِ1®N=%chm46ZQ͝-DhF F !cp-j-dC-~g F !c]1o<%chm6Z}klbtS̷u-ɆsZm6Z Rm%ђlh j-dC06b8m/~XKhm":01Z ֍VjVdCu6ZaȆm6Zm6Z `Jmњl&Fkڭ[m6Z lDppXB}/Fkl5ِ1FkFk!c2Z2Zm6ڐ3{uobﺷﺷQhm!2i#'9Ck цlFhFl ِ1FN%; 9hm%믔R{h 7ڪm6ڒ h mUhm%2hhK6d iU(^ F;A,Uh'vhhG6d ihG6d >W;dF;lِ1LnCkўldy3o۫m6ړ =\16 NRbhm6ړ hmWhm'2وqMASKƋ@6zoԬAtsJF!c9+&ICk#Xn]w8uWWf.;|wu3sd쟼ۺ鮮bU\<%߭kWwuteM !zk=|oܛvk=ȁ{k=H+CmѓlmWꇍdBOFO!c~'{m6z <=aSm'ѓl|詶E6bskKԍ^nRm"2`襶 E6d nKmыlmRm&:fsIXGEoFo!c8D t\oFo!c97Szm6z  mVm!]6LGut>F!cp}>j}>dC6@}6`}Ȇm6m6sZ+~D_F_!c~/7m6  mUm%2諶G6|jz11~7m6 ׍~nSm#2FFF?lِ1~F?~Fq ſtMwVͷuFRmM“m6 ׍nWm'2E^Fl?ِ1?_m?hb^MĻ?wR l;$?mmD6d 'OOdCk؟6~6Yu ob  ,@6N$rYam 6 m Pm 2`1@6d ^7@6`?ˎ.(1H6d 1o Tm $2E^t@lc ِ1xm Tm 2ISCAd A D ؋Rm 2ND nc1Hmc16Fm6FΧLQnuc(lcِ1̞yW QjQdCuc6FaȆ(hc(lc4XXy֪1ZSFuhh!c G Fm6F ׍ѰnVm&211l Neb*~{_mmJ6d sXwW e?KKċ++ِ1N3Nj++ِ1__6~p~y֖@op&M-7s$_.>7Ix~S;\<ٗ3.fw77O.Moz0yB#Hns8WQ1/cGWW #cz0EQ!cs 1Fmc 1lL^?IMb1?ƪm6ƒ MµXX!cpcjcdCsXhcXlc8靵pk1N`1Nmc1lfmiü[,^ q8!cp㠍qj㰍qdCuc1Nmc1lIwО&x6;j㱍dCpnWm'211O6d 91ۘ@6*/&qx !c= pOklcِ1  !c jdc9]uܔdc{)K6&bɆmL6&mL6& w2~w2Qmc"1l|NmLTۘh<ŝ}ў"φq1r>dT4閱Yٖ9?,cs-c,cZ[X-------74jܮp8MkIpM5I]&7j1PqpD5N5nq5nq|M5 ָI7 |Ę, 1ۘL6d nc21Ymc21l7 {jdC6&C6&cSFOxgbLk)pM5Emc 1lhclc ِ13))!cpS)jSdWcˆSƈv!TT!cpSjSdCALALUۘmL%2BS6bƪo7xTzmbL4i4!cip/f4lcِ12 )6aȆӠijӰFd^údC6~6~Wl7mmN6d >m;1ld.Kcaݘ1ۘN6d nc:1]mc:1lnLuctlc:ِ1xݘmLWۘm k/L.n 5|^]QC֍j3dC6f@36f`3Ȇm̀6fm6f π6fm6f9bm{fbg36fb3Ɇ 埩1ۘI6d nc&1Smc&1l mTۘm"1K}͂{_6faȆ,X7fm6f ۘmRۘm"21 ژ1 ۘM6ccߘ 7fm6f ìa{b8m_&^ l!c5l1ۘM6d nc61[mc61ljig1Gs`/:Gmc1l|cߘ1ۘC6d N)s6`sȆ)s9js?(C)9??Ȇ1?66 2dC66PۘK6x}csaݘ1ۘK6d nc.1Wmc.1ln̅uc\lc.ِ1\,6m,p~.ͷu/"œ|o5/œ}|C/~S/xRp=XH<ϝZnz c! w! LLj q=XHd ^zP-b! IB"cCA LEbXEjEdCEpHmcl|mMm,6 EjdcqDbb!cpjdCuc16cɆbhcblc GK~߹Dmc l|K6`KȆX7m,6 ׍%%R:QYKEK6bKɆ1PXXJ6d R؁.UXm,%2XXF631 ֍ej˰edCuc6aȆepNY XF6d 2hc2lc9٘o{@\a\mc9l|s9\XN6d ^7ú\mc9l|b9\mc9lxŭ^2X怅dv  !c9eSVm6V ׍nPXm 2XXI6U?3X)JX7Vm6V X mTXm$2+aXXI6d NY mTXm"跥LUV9}RXm"27V~c*lcِ1:e\RXm"2 X XM6e|^'X-^ ^XM6d nc5Zmc5ljhcjlc5ِ1jP5~&Q7Fmc lhclc ِ1\k\k6`kȆ;YmQXm%ꝯVԍnUXm%27~cZlc-ِ1x/k6bkɆ{ѵZva|0?3;YXo`hdlbsmmm[ZY[<,c,c-c,c-cG,cG-c,c-c',c'-caQ+rj[:S\#g;yƭ5n8N]jk:X֩k:\Q1ָuFx\01֋z^XO6d nc=^mc=l|׫m6֓ 롍j뱍 d~⼉AAmcl|wݠ@6d T66`Ȇml66ml66k;[ųFF!c5FڨH6d nc#Qmc#lFhcFlcicxf >3ޤ D6d >ls&M&!c9eS6ml66 ׍M&MfѪIOE66cɆ1PجL6d ~VfxVff!cfhcflc p@T/cآB6d nn-!c֍-j[-dC6@[6`ndް=ib nІچF6d ꆛچF6d o~Mm p#2mma[Ɇ|O[E[Ɇaltqpڰ}Umc+l|c+تJ6d VhcVlc٨3eLmb Sml6 ׍mnlS؆ml#2 ئ F6d ^7A6axz.vX7ml6 \16^Ex16cɆpNٮN6d NmlWnkmۺء.\<ɗ*Tzusd⟿껿~Sn;|;鞿nN1WsN߉N2tpbbh`'91\;"vzD6vm6v2NJKu%]pإ E6d R؅m"2߷-vm6v w6vm6vA)ެ-֦ᬱ[mc7l|s7?vm6v a[mc7l mV؍m![_,wfG){Gmcl==j{=dC6@{6`{Ȇ==؆;ٸy噼&S⮶m !b j؆;ِ1~;@6ܱ w!cmmc{F{Lnuc^lc/ِ1"Sm6 {a/Wmc/l|Ok/Wmc/lt[՝&>>>}>!c֍}j}dCs>8S؇m#2SA6aTabW؏m'2;m6 )ᜲ_mc?l|NmW؏mxQѩn31<Ĝ lÃlnxᡶmx )pNP6<Ȇmx@jԾOL.fٰv@mqlhlِ1!cw@6`FSK7bb딃prPm ql8q8H6d oAA!c~ qPm qlLiuqH`qHmql|rSm6 `qHmql|N9mR8m&nhbu06cɆ1P8q8L6d >saa!c=aϫM# # #jG#dC#prDmql|N9#jG#dCG#jGdDžQ'ךG:(\U8m%2Ga8q8J6d n(qTm(ql8 mU8m##HsqLۺ33jg"œ g'rO>Q3o.]g*=?gp=8K7zgE=8 Y?Y2yO+3[%:8Yr c}pZY\Βgjgsd#YeM8'sj簍sdC}9X#Ωm6Α 8mS8m#2_6Ωm6Γz~68/u?gj籍dC06b8m$$9Gm!2mm`?K/qQظm\T۸m\$27.~El"ِ1EE!cpj _QB1SM _19Wm%2쫶m { =U6|Ɇ)Іچ/ql )?P)&%Q7.qImqlٸq ۸D6d ;2\R۸m\"2q ڸq #ۧlz')~p⧶m !b^Om#2~nma~dCs᧶m;#L0172 lßlچ?O6d o~_m'26601ľh P6Ȇ= m`dCk P6ȆFm.~7t)n !Pm#$2mmbdCsJ S6@!c~#T6cKcb^4AjAFِ1 h#Hm#"2mmaAdCsJmF076`!c`m )pN V6Ɇ`h#Xm#۸L6藥F:2\\V۸m\&2E/^el2ِ1ee!cpjdKF!.ea;x6Dm#!2!j!Fِ1h#Dm#!2mm`dcˈMPN PPl#l|#ombdC6BPPl#l 6B6B+dL]`㊨W`ݸq۸B6d ދ^+!c+pl ِ1x/zڸq# LxWu&)ajaFِ100l#lnm 66°pA_q 11]6L'6±p!c^4jF8ِ16a6±p!c~#W6ѥp&UQ7ºqUm*qlUhUl*ِ1r)W6bWɆUhUl?{&5aqMmql5h5lِ1xݸ5k5!csA6adO!7"FFA6d oD~#Bm#ۈ 2nDmD`dCpSjFFI6Jd[)F$jF$ِ1F Tۈ6"ɆmDBjF$ِ1 mDmDm8?nI$:ոq.\<ɗ*T^uvɾ\uݿn)?uxϯu\oToC/JQpR(\EDzEd ^((\HAm QRĸ!pq۸A6d |vCmql h lِ1~ h /ܗI/lYі9nZnYn[b,cw,cw-c{8#cS3s Kߖ,c,c-co,co-c,cZ[>X>Z}嵜z?NѢEqѸES1YjڻFx15.׸hq2ߛ{k\48ѰEk\4nvkw fbMT۸m$2C@=MM!c&nm6n ބ6nm6nժĸ%-X7nm6n !b}6naȆm܂6nm6n ݂6nm6n j͂t61n jdCpmm!cpjdC}mhml#l8MI mQۈ6bȆm@1j1F ِ1h#Fm#ۈ!2mĨm`wO_6ĸ#l܁6m6 ۸mQ۸m!2qڸq۸C6d Sw;jwdcrSڛwŜr)w6bwɆ1jwdC}w6bwɆ{ѻ]F,8>ba$LXNXXl#ly_,|mĒ ׍XX7b6bX!c mĪmbSwocbs=8S۸m#2`ݸq۸G6d =={=!cqڸq۸O6gXD+㾘S9}l>ِ1;$;$6cɆ}X7m6 eb 6cn41jdCpnzakNy m B-]m [P;xaw`. x_ 7bt~[{׃t_wR/\R}_za&U1^z𝝗j/q=xI"d KhKlذ߁&+ VWjWdCRxm"2+^jJml|Jml<~V&kQ7^úZm5ln"?^m6^ ?{ Vxm&2xۈ'ĈwMM'ʛmē ?#^m#ۈ'2nīmcdCFFm|6> `/Aml|Nm|P`88=F?Ǚ{Gb˘e,e2fsyX<-cI-c^1o˘e222g󷌥XY[-c,cAL=/y"G\"͟S"w,8;zS9 W?1xԸ:q=׸D}1`K|/&;q=u 8%&~cXH m$VHm$&2_S%vGkjdCQbw%VHm$&2Hp!޴lbF.j.؆ ِ1 hEmp!2.nm`.dC} ᢶm$!ΚH"l$6m$6 M@sJ$F!cpI$jI$dC}sh#FlÕl sZoaWr [ʇj؆+ِ1MW WlÕl܆+᪶m  WhUmp#N})/rsGmandCsS6ܰ 7!c}:7wO禶m nІچN6Y %wa;@]mp'2S⮶m uWp6Ɇwh]m nxᡶmx  X7<6< !cpІچA6d nP6dC6|  lÇl܆᣶m a}  l×l]iM _w;zWm%2k⫶m }½/_ _l×l܆/᫶m$#]O#ӆȆdjɰddCdpLm#lM{djɰddCsJ2h#F2 G^FۺH.\?V7QHv\܃]%w?'}sq/vO[{?|G CϹoќDO}p=/coѷu~j~?(O-?!c᧶m*u71E lßl5_m'21a鯶m Іچ?l6mqMF h#F l#ِ1]pGwBm#lF h#F l#ِ1xHHI6\o}㾯RH mTHm$2)aHHI6d H )6Rb)Ɇm6Rm6RbqMT11R TjTdCTpJm#lHTjTdCsJ*h#F*l#5pH-;SÕHjFj!chO+Fjl#5ِ1xH FjFj!c^45Zm#5ll:^#HHC6d >sJ4F!cpi4ji4dC6@i6`iL601 ijidCsJZ8UHm%2S9%FZl#-ِ1H _Oo 6!c=l#l|)jFِ1x/mm`FGm)#HHG6d ~vP:wtvP:tF:!cp頍tj鰍tdC6A6aBzFza+6cɆHHHO6d >sJzFz!c9%=^m#=H6O116a6@!c^4jF ِ1@h#Pm#$2mmbFEG}A129%S2md62 ׍ ndPȀmd 2S29%Fl#ِ1Ƞ" o0$lAAjAFِ1:%S6 !c5l\maAdCu#R62)t(--ȨH6d }eTȈmd$2S29%FFl##ِ1FFF&AǛYY62aȆLȤ D6d n#Im#l|NmdRda{>LXfXXVX6Xe,e,e,2n崌EZƢ,cі\ܖXXe,2222V2V2V2V2V2V2Vr>L08_:95U0\Sk\0qTd >/X]q 'c k\L5N_0qQ!CȻ&F!j!Fِ1;j!l#lo}sFB6d 'Q62oX้Y25UfFf!c7ʬL6d ^72úYm#3l7 mdVȌmd!-񩉑Eԍ,ndQȂmd!2,wdmd6 d{1Y6`YȆmd6md6 zU mdUȊmd%2jYdCsJV8dUȊmd%2FVF6]]لlF6lF6!cw[w[md6 ׍lndSȆmd#2EA6ado?01B>](ܧ U6BɆPombdCu#֍PPl#lF(md'8ޱ51^4;Emd6 ?dWȎmd'2aȮN6d od6mdp||[̷u9Fvn΋#9r{|+껟~Žv^{׃0Z}&AaA}׃0 L ׃0r czAZDa$B S6ɆGx61E{ppl#lF8m [jm FF8A6fyfM#¹nFٰ}FA6d 6kl#lnj=fFA6d n#ڈPۈ6rߵyy)ENFN!cp9j9dC6rB96rb9Ɇm6rm6"F^ĈgE3"6"H!cpFF$I6d oD~#Rm#ۈ$2N mDmDbQd&=&F7`mD [D}((l#lFmD QFFM6{Ĉv)hQmɺmD ۈ66h!c9%)jF4ِ1 mDmDcơ=%Wtlbu#6raȆYYͥ E6d ^7rKm#l|\F.\Fn"UYbYb6rcɆFnX7rm6r (ᰱ%MCk#7l mVȍmĐo|ĈNQۈ6bȆazQۈ6bȆ7bFF C6d n#ڈQۈ6򐍁+7|5u#?l7m6 ׍|F>!c֍|j|dC|pOm#ln6m6qG U=ibu#?6cɆa6qpذ H~F~!c~#?7m6 mWȏm ׇ:Q@<-P(m 2R>O)Q(@6d >sJF!c8)FFA8ꘉQPԍnT(m$2$tAFA!c5lA-Q(H6d -mT(m"KsJ1bF1!cpŠbj60a{>Lq9%,c%-c,c-ce,ce-c,c-c,c-c,c-cU,cU-c,c-c5,c5-c,c-cu,cu-c,c-c ,c -c,c-cM,cM-c,7rQC1{͟SqQW\]Wj))qq+N5N_q8W׸'cި8q59>*aK$+j%"]?_߭+{j%= ;+~ /a^⟾+y =/{tߗoWRJ»_R}KzPJ$91xS<%"JzPD=FIF)Qpw\Q 6JaȆR.Q (E6d >WբF)lِ1\Q (Q (M6z_vXGjdC{liFi!c}jdCkFiF6&FYY2F!c2(Q(C6d ^7QFm QlFhFl,x0#i&FYQ7ºQVm,Qln"QVm,QlFYhFYl,ِ1R(Q(G6QN`QNmQl(rj對rdCh9؋S(m#2Q(Q(O6ڤs0Q^(mW(m'2a(Q(O6d nTsJ F!cp jd҆N31*^"E+mT6* oT6*bɆaltp(Vw]EڨmT$2QڨQۨD6ҹMĨ$lT6*mT6* `QImQl| [ a+mT6* S*A6*aFm:SĨ,pNQۨL6d >TsJeFe!cpjdC6*C6*cUƸ9r\ibTh؋VQۨmT!2lTQۨmT!2E^Fl ِ1*F*FUq=%WUuÜRl\GSUm*QlFUhFUl*ِ1xݨ FUFU!cpUjUjdóȌ:DݨF5jF5!coomT6 a#QL q_Mx-A jF5!c^QMmQlvBs_ԼH\l t]BH\]m:QlnTuFul:ِ1:\VWۨmT'2QڨQۨA6/үbXԀj5dCՀPۨm 2QڨQۨA6d >Ԁ6jm6j/Ϛ5Eݨ FMFM!cpFMl&ِ1FMFM!cp5j5Zde/``ݨQ ۨE6d 34qp(rEڨm"2Ek^F-lِ1R ڨQ ۨM6]|Ek^Fml6ِ1̜aipmFm!c5lmQۨM6d n6Q[m6Qltu|5Ĩ#  QۨC6d S7:c8l]nA@xZu:dC6@u6`uȆmԁ6m6꒍p&F]Q7ºQWm.Qlߨ judCsJ]8Uۨm%27Bu6b͕ٮebs0_ʉF=lِ1XK\oXZzjzdCh=؋Sۨm#2zjd#Ѽ%רO6sG6cɆՇm6 ۨmWۨm'2QڨQh@6Vͣ 7~Flِ1h/@mрlhj dC 46m4p||tNMRC(ZDCsqj =?WCx~C7bMRCxyC\=VLjS F4w7}:hv׃F@44RhA#!cHmјl-X4jdC}DcG4Vhm4&2_4jdCFcFQeoUL&n4uFl ِ1D dFl ِ1xM6`MȆFhFl)u&FSQ7ºTm)єln"zTm)єl|Ni 甦jMdCpL dFSlG&F3羅)Ȇ4Shm4#2jm46 ׍fn4Shm4#2Æhnqj/^08[hakikekmkckkkgko`hdlb22222eeeeeeee+@ `˹/ͩ%:uϩ5598M@_sukk\sq2?9<5598akqׂl8&F 7}s F !conhA6d >_ F !cBmђlΚcw&FKa%Rm%ђln"Rm%ђlFKhFKl%ِ1xh mThm"<|aJ)JmъlonVjVdC6ZA6ZaȆF+hF+l5xh|LFkhFkl5ِ1nkZm5њl|5ܧkhM6d n5Zm5цlDziH8 <Fl ِ16y_6F!c}m6jm6dC1hhK6ڕ7&F[Q7ºVm-іlh jmdCsJ[8Uhm%2hhG6O(p}f"q;a;4F;lِ1)6aȆm6کm6ڑ )vjd+|mbﺷﺷWhm'2E^F{l=ِ1x6cɆm6ګm6:KY݇72726:`Ȇ:jdC6:@6:`Ȇװjd.^QaQm#ёl{юjdC6:B6:bɆFGhFGl٠V{_D6l s@@!c𽯁@ 23pVScxGx|Gx lcِ1x A !cpAjAdC6A6aFQڃ31~c07m 6  m Vm &2S9e`lc0ِ1v01Xmc݆|sat'8c-c,c-cXFXFZƾ}g262eleleleleleleleleleGt LOYٖaPwYz̟ ukq2ߧ醨k\P1Ln 0A mkq27D]o(&PO7 Um %2/q(|/qPlc(ِ1Fû<4<(A P!co(1Tmc(5x_}k} {66&2j_c_ l )Q166&2ߋZmklcو s]cS9e0lcِ1sa0a0!c939;A a0!c1 1 N6 mb uc86cɆpX7m 6 G7G7\mc81lphcpl]iCk߈ ߨm|m|C6d o|o66!2SJ;c8lG bhm|m|C6d ދ~m| 1l\u(P!X7Fm6F M@Gm6F ԍR%X/A !c~c1Bmc1l5l]j&HQ7Fº1Rmc$1lh1"؈16Fb#Ɇm6Fm6F )#j#oFqG U5166Ulߪm|m|K6d c3Y?,A ooɆ ~ m|-1lLzlZecxy|y(lcِ1x1 6FaȆaRTp_ZQdCs(hc(lc48QܣgMκanhaPahlc4ِ1x hh!cQsȘ hlc4ِ121C6|]Ocs_akDc6`cȆ11C6d aZy=F&1C6d c1jc6y}gCy]i;1"S.\?HܜGk;0|9-}Gw?&\{}sqEx;/w{=]yWYC{S^}{2{mjz=91Au IC+{\'2#6WK6v ߮1VXwCc6bcɆ-1Vmc,1lX|uXlc,ِ1Xd41~6~6~Plha>\ʑ dC06*9c|~(mZ?`? ?@?mm#l\'֦t8lcِ1c\Sm#2nn8lcِ1xmSm'_@1c ǫm6Ɠ [6cɆm6ƫm6Ɠ ?'mWmL T11&9eS&mL6& ׍ nLPۘmL 2y|ylcِ1xݘmLPۘmL$w]c61&:m~"ٰM6&bɆ{щ1ۘH6d >D>DD!c~c"1Qmc"1lr?1I`1Imc1lnLuc$lcِ1xݘ$I$!c=I$Idr؇Mκa6' Fdd!c1֍jdCuc26&cɆdhcdlc ٘R&ыN)!c1֍)jS)dC؋NQۘmL!27@S6`S"/31oo릪mL6 [0~[0Umc*1l|N 甩jSdC6BS6bF*~|Lib2 SmL6 ׍inLSۘmL#21 ژ1 ۘF6d mLSۘmH611~t>{7H6l##ِ1x#7~TlƏƏj?b? ?B?mmL'k.caݘ1ۘN6d ttt!cpӡjӱdCsthctlc8Md#Qg1f.nPۘm 21ژ1ۘA6d nc1Cmc1l|2ژ1ۘI6G3Eݘ LL!c~c&7fm6f ۘ mTۘm$21ژ1lLľOp_'Ȇ`OOdC6~6~R l|N Im'lcnbuc6faȆ,X7fm6f ô6faȆ,hc,lc6eU[01fpkllc6ِ1s9ll!cpjdC6fC6fmχA'|9sqޝ{'98Q׸9͡'cɝ'w5n8Fs`o4G]7j7G]o.x61̸!טK6z7M^\\!cy.m6 s7Wmc.1l| mUۘm#9/1Ϲkl#SK6aȆ1ۘG6d ^71Omc1l|M5ژ1ۘO6.!Ę/pN1ۘO6d 7χ}||!c1֍jdCuc>1_mc>l񎭉@Xm,PXm, 2n1:5"A !cp j dC6@ 6m8>|[7>*mʹ"~0w|gv⅝ gwg7bOgxVq=XHm 2zփ껿׃te L3ÁHn bh,`!91g g "zD,6m,6 Ǐv41 EjEdC{`XXD6d c.b"lcِ1xXXL6Numq,Xϼ6cɆaz&5lXZdC6C6cɆ}Y m,VXm,!~cxDXm,QXm,!2O` |O`lc ِ1xK6`KȆhclc)٨12T)KᜲTmc)l|mMm,6 ׍n,UXm,%2\ m,UXm,##:c X XF6d ncLmcl2hc2lcِ1xXm,SXm,'/Z<\Xm,WXm,'2E^trlc9ِ1:e9\,WXm,'2XXA6޽ueB+`Bmcl hc lcِ1  !cp+j+d@r=^'71V +j+dC6VB+6Vb+Ɇm6Vm6V X mTXm"&Mfbs*8RXm"27V~c*lcِ1:e\RXm"2jlRXm&kޙX-l6Vm6V ׍հnVXm&2XXM6d ^7VC6Vck?['61ֈ9e S֨m6֐ ok6`kȆm6֨m6֐ 6֨m6֒)VVmc-lnucZlc-ِ1v-\îUXm%2kjkud&~01։֍uj밍udCuc6aȆm6֩m6֑ wXXO6椏X/XXO6d nc=^mc=l|S֫m6֓ ׍zgD]D !cw7w7ml66 mlP؀ml 276@66`FM']v116 jdCooT؈ml$2E7^tFlc#ِ1F&A[%616^tE7ml66  ImclMjMdC66A66aj:um/j` S~_6~6~!2 //dC//j`e6>}gbl66C66cɆA6ppذYmc3l jdC66C66c[Ȇǣ4嫿518 l6ml6 Emc l-j[-dCshclc+(Y&VыnVV!c~c+7ml6 )[ᜲUmc+lݞV6A;pMm9Ŝ9l]nAPl6lcِ1YY6aȆml6ml6 mlS؆ml'[.~楉]ԍnlW؎ml'2aخN6d olvv!c9e;]mc݆_7IOn5u~+Eja..~{jw`.ァᄍo~W=׃tcDdzf{;^߁2yy\v;\C-b;Hhc ǹ/"φqűr>.n^>~oCÖ#c㖱SӖ3-cg-cXY[.X.Z]]e9e'ո.ޯs)Xv=׸Td 7u;5n'q;5n5n'8;a۩q;l,I!^cvo.lcِ1]wKmcl|ec٥ E6d >6vm6v-Kabv Lg7Xqz|[mc7lYn,xnlc7ِ1x nn!cpj=d#du{=y=!cg:{3=j{=dC=p%Gmcl|NmQ؃m%Mޗ+l6m6 __Wmc/lnuc^lc/ِ1x mU؋m#*;~'}اG6d ދ>}>!c֍}j}dC6A6aƙ761 jdCs~8W؏m'2aدO6d nc?_mc?qlٴ*-ط?m6 8mP8m 2`8q8@6d hl7Q9ߨommF6d >6~6~#2oodCmql|L㠰q8q8H6d n qPm qlAhAl ِ1x8mT8m"{NGIw8$E}CjCdCR8m"2q8q8D6d =mR8m&B E8 aa!c5a=q8L6d n0qXm0ql|N9 mV8m!e㈰q8q8B6d ^7qDmqlhlِ1##Q iLν/c(ٰU8m%2(|Ql(ِ1QQ!c9(qTm(ql|E=Em6 kr krLmql1h1lِ11h1l8xqidql8ِ1:8\W8m'2q8q8N6d ^7C6c'F8=61Nu N9q8A6d Ӌ6upذ  !c8l$Jt: [%q8A6d o6Nm6N/{8aIԫ+ʛrRm$ql|rSNm6N ԍ{Z'dCsIhIl٘댉qJ왟{6NaȆm6Nm6N )rJmql)h)l4ٸWsyy!cp硍j籍 dcȦ__;`b\qAmql|q?.m\6. ۸m\P۸m\ 2s/l\P۸m\$R*ĸ(EX7.m\6. ׍n\T۸m\$2qڸq۸H6d n"qQm"'xUg5166Tl|'\''ِ1O؁''ِ1kSg dO?Kd#v|vD/z 6.aȆ-.}KjKdC6.A6.aȆ%h%l2p4=wEݸ ee!c~27.m\6. ۸ m\V۸m\&2qڸql,+Zњ&_ mmE6d o66"2__dCm݆|s ·NǙW,x\]mnaiemckg2v2222222222222o{c{k{g{o`9 ո[s"jX㮨k\P1wW5 qW|Muk\P1x|ָ+wWFufb\U]U۸m\%2?*<Ul*ِ1wW6bWɆܧs@6m\6fal1155q ۸F6d ^7qMmql|߿q ۸F6d uA\-&chm\6&̜eSsjc ԍ&=OIۤgXZc )9oɆaldp|*&chmm\'guĸaN6G.q]m:ql|Mum\6 ׍n\W۸m\'2aݸq۸A6n01n9Snm6n 7`qCmql h lِ1 MQ_M;;j7dC7MM!c^&Eom6n ۸ mT۸m"W;~ĸ%[߸q ۸E6d --[-!c~7nm6n aou-[mA'61n96Snm6n aq[m6qln܆uml6ِ1xݸ m^bVw;;󆢈a 6upظvOXZw;]E۸mQ۸m1o-|w6`wFuf/[abs]8U۸m%27~]l.ِ1x/zw6bwɆ]X7m6~wBs{.71q֍{j{dC#s={=!cp{j{dC=X7m6!z3ِ1sQlmmC6d >mql[ Mn܇u}l>ِ1xݸ}}!cq֍jdC C8c8l9r"ڸm< 9Uびn?dö@xx@6d o<!c֍jdC ū;c8l16`F̝x(zч}xH6d oRGo..Wyqt#\=kyzE=x cc2+Czo&xG6Vt}Xx/|/;lِ1x6aȆm6ީm6ޑ )U16ݍ. }Zﰍd~;3߫m6ޓ ~^m=l|=xxO6d ,ᳶjﱍd#ɥƘ!cgm೶jdCu6>`Ȇm|P`Dx$XƒX\-cn1w˘e22eX|-c,c-c~1X XJX*XjXXZXe,e,e,22dha'jQf9̟S"^yS9 W?1=u X> 'qj>؆ِ1Q6|F*Oib:m$_aIj؆/ِ1 _ _l×l܆/᫶m ?'6|6|ddcጽ{DHF2dF2!c=dL HF6d  'SHm$#2SA6aƵ;t71D2(9!uOHN6d n#9\m#9lݳݳjɱdCɡjɱ ?]]M ?o-6 ?!c9)~j~؆ِ1? ?lÏl|N66 `DN'6 !cu?\mcdCs?S6 !cmmc)3Iglb)F F !c9%SRm6R ׍nPHm 2_6Rm6R-ebt sHJaj)dC6RB)6Rb)Ɇm6Rm6R H mTHm"ݗH#TjTdCp1МJm#lF*h#F*l#ِ1TF*TFjQ~ZH mVHm&2ES^4Fjl#5ِ1:%5\VHm&23O mVHm!'11҈~# 7Ҩm6Ґ )iFm# lM{4ji4dC068c# A 4FZQpǭLb+-JHK6d ^7ºVm#-lnu#FZl#-ِ1NCk#-@6#@)pN P6ȆFjFِ1xl#l7LXfXXVX6Xe,e,e,2n崌EZƢ,cі\ܖXXe,2222V2V2V2V2V2V2Vr>L0ո Z1Nb/&k\0qTd s0|9X]q 'c(Fk\08Fk\0BFz_B6B!c=m l#lFb+ngVo2jY-"]m]f Afsqۺ̰ɬw\܋]Q1o=Ϭq=B|4zY\,껟׃,te ^@Yz|,jYp=B"d VmdQȂmd%jZUd{,Y6bYɆmd6md6  mdUȊmd%2+BY6bȆ W11>"#md6 mdSȆmd#2_Gg3I6lF6!cut6h#F6l#lxHJ&FnmbdC~"Tm#%21Cam )FF(l ,tK#7~#Fvl#;ِ1xFvFv!c9%;Smd6 )١jٱdc!FX7rm6r ׍nPȁm 2Sr9%Fl#ِ1ȡ#/1˲&Fx$ Cm i=00l#lFm )aFFN6r/Iya`ɆmcdCp1Мm W6Ɇ66±ѹos21"D݈u#Bm#ۈ 2nDmD`dCu#֍l#lnD@jFNx|J9)9Ɇ퀷j9dC6rB96rb9Ɇ{ќͩI6d ދ6rm6"TAo31"F$߈Tۈ6"Ɇ!DmDbdCDwH"6"H!c^4ڈTۈ6Fp K51kXhٰDmD KRۈ6Ȇ(oDmDaQdCFmDFkv3-F4jF4ِ1x/ {hhl#l߈FF4M6d ^7hhl#٘aܠ7M\N\d̰rϥ E6d 7ȅm"27r~#F.l#ِ1x/ ȥ M6NWiW[ԍܰnVȍm&2aȭM6d oFnFn!cpj|fy1b_4ƨm`1dCodb6b!cFF C6d n#ڈQۈ6Jw]cyOqUp6\ɆmBj؆+ِ1xp6\6\6T3$ $UբZD5s/΋#b&6~57O.yqtϫy5\=\Һi^uNuNuݯAu2#>Au\׃TWAu!c:Q]m:F6f)wEaMnppSp6Ȇ7GmandC6ܠ 7 7lÍl| pSp6jގ051jQ֍j5dCu56j`5Ȇ-jF lِ1xݨmPۨmt.pWp6ɆmCj؆;ِ1xpu]mp'2mmm8}Y߹/^08<,sxZjZƼ,c,c-cޖ:z1XCX#˘e222okjkf 5ZZXZZZYƂ,cXqMo͟7!z#ykqTd 'u5΃jf=ެyA5Nདq?O1|O1eUASzO OlÓl|چ'I6d >ySm$2c6<6([g^Km "2mxmxa^dCsS6 /!c R6j rDQ 6jaȆZߨQ ۨE6d ^7jQKmQlnԂ6jm6jƍab[W;ݺjdCt>]mFm!cpjdCu6Q[m6M68Stp[m&2S⭶mx )pNV6Ɇ7᭶m!SNjbsJ8Qۨm!2u`ݨQۨC6d [Qۨm!2QڨQۨK6*4s*`b6Bu6buɆal9c̖m6 ׍nUۨm%2SBu6bFIlbkzp [OmQl{zjzdCu6aȆF=hF=l>Xdb6C6cɆpNQۨO6d ދևh}F}!csC6c ]y׶g01 j dCsJ84Phm4 2hh@6d >46m46|Fcr71|:S|6| !cu\m`>dCpH䄻]HCk!2mm` F0`b4hC؋6Thm4$2!FCl!ِ1xhFCFC!cp j FdcJ Nj &F#aHmшln4uF#lِ1x/6aȆm46m46|W\.&S|⫶m  U6|Ɇװp 뫶m Іچ/G6jJ6$[VjM"œx6o뚒/V˝lk4;0O}[V~Ӱ?ۑyqtϛyS\=qAnf47}ìMC1Jd]dZp=hFd G4}D3f4#2+A6ad9la6!c`DȆhF@6d ~a<0@m# 21l9X v}w&Fsc6FsFs!c`ˠdö jhN6d c63IsFs!cishFsl#lxu#֍PPl#l| )jF(ِ1F(U6BɆ{Ph#Tm#nq>·ќ#vrGee,2aEY[:X:Z:Y:[ƺXƺZƢ-c1nXXee,22222222`o95ոcK xd8ggV׸ָƵ'cި5Zk\k\ZS15\SV׸ָƵ'cָad#Y>01z; 6°0!c/ ajaFِ1xo{00l#lo66°6dñF{{Fm цl`\Fl ِ1xhF6F!cpm6jmp1p׈NLpQ7aW6ɆF8jF8ِ1xppl#l|Mmmcdc-bMTjFِ1s\0Bm#ۈ 2S"mD FFI6҉&F mDmDbdCh$E#6"H!c9%)jF$ِ1 mDmDbmF=41ڊ9-Sڪm6ڒ ~Vm-іlƆ3Æ4bhm6ڒ h mUhm#džzh''h'hhG6d"mhG6d nNmюlF;hF;l#l,25#J)QpNRۈ6ȆEmDaQdCF76(!c^4 ڈRۈ6ړ?:kS9F{l=ِ1x6cɆhhO6d c#3Æe؇2F{l(xᒉAmtPmt 2.;mt6: mtPmt 2QaI_/e FGJgWGQm#ёljdCsJG8tTmt$2Qa>q16:bƴf,]~$F'X7:mt6: mtRmt"2`褶 D6d c3FqJZ6yu6[ڧo:C":E'|;΋ޢAgsTm]gx;~g7O.uaY};zЅy۞1z.׃.te cvt 91x=EtQA!c Em ѕlzd sܷ06 fRWFW!cp]j]dC6B]6b]Ɇ誶ۈ&g41žE4ܷVۈ6ɆEghjF4ِ1x {hhl#lnDúmĐ{Ĉq)杝a;P6Fm#ۈ!21nĨm`1dC6bl#lnmt#;.S9F7lِ1\tSmt#2 >{禮 F6d c#3Ə_y3춻 ۈ%5z.+ɍƪmbdCu#֍XXl#l߈FF,K6d c#3F=wCk#ۈ#w鰉'8oĩmaqdCu#֍88l#l|NsJFG6d 1 6GZqFw>OE6cɆ鮶N6d >tsJwFw!c~nICk;O6 npĈu#֍xxl#l|NsJF<O6d n#ڈWۈ6ɆmCjFk~ӆd _j=dCu=6z`=ȆpN顶A6d c38zTbhm6zIL)zm6z -16N:pZ=dC6zB=6zb=Ɇaz װe F/1c% E6dljE6lS[/^F/!cuJ/N饶 E6d cWD16za_߶-FoX7zm6z 6zcɆް譶M6d n7[m7чl8\;M>{>j}>dC0F3Æ>j}>dC6@}6`}Ȇa gϽhD16`}F`u㷛}sؾ9l_F_!cuJ_N髶K6d n/Wm/їlnx:c8lvۓ>Q F?[jbsJ?8Sm#2ᰑrb)'G6d ދh?~F?!cm6Ɖ3n11DHu#Am#H 2M j Fِ1h#Am#H 27`m'i K/l6m6 o6cɆm6m6 a_m|0{>9-c,c-cC,c[~ hnaiemckg262elelelelelelelelelele0щ 5n 5n8`<@]7jkXk\P1xku翁dcf`b 6B6bɆb½jdCt>@@!ch m 6;g1Hm Rm "2y lcِ1 WgM( lcِ1z{\oRm &:,}jdCs`8 Vm &2S9e`lc0ِ12)6cCF5Zmb 6@C6`CȆm 6m 6 m Qm !2S9el{A]J{1|66'2=dC66Wl|{Ov~0ll|o~;?E`a.œ|wv݁x*vOw7OiGs{C?&]2Coط PP2_  `(913P %21sPlc(r{̣KLa0hc0lcِ1c\ Sm #21 1 F6d nc1Lmc#Ь\&Ə?mmH6d G6~6~$2߷$?mmH6d tp0">Q dcƀ"Xhb 6C6cɆpX7m 6 a9\mc81l|m:6c#ƅco71F#j#dCoPm 2#`1A6d nc1Bmc1ld{<c7F~cHlc$ِ12)#6Fb#ɆHX7Fm6F [#6FbFS{Lcbuc6FaȆm6Fm6F mRm"21 1 M6Fn,c ;Gm6F C2C2Zmc41lhhchlc4ِ1hq0۴fcD1!c^t EǨm6Ɛ mQm!211K6oc9c9c6bcɆaƧ#ƪm6ƒ  mUm%2 7ƪm6Ƒ y׶gnb8؋Sm#2`1G6d nc1Nmc1lnuc8l'*SMķ?oR laԬJKCk'l'!cU16, lnOj?aƯnlbuc<6cɆaE8xlc<ِ1xg>^mc<1lnucxlgr\I&u8ga8gɆag ֙DZ?c? )?9gɆ~{_?mmL eJ9p1AS&u !c~c7&mL6& ۘmLPۘmL 21ژ1ۘH6::NobL$IH6%s`'mL6& )nL$x)q D!c@'@'mL6& )2Qmc"1l,8Ę$&IjIdCS&)6&aȆ$X7&mL6& ׍InLRۘmL&L2q193@& _LVۘmL&2S&9edlc2ِ1Ydd!cQac}-M(dlc :[/GSD1S6`SȆmL6mL6 Su)!c1֍)jSdRLbc*ߘ1ۘJ6d nc*1Umc*1l|N 甩jSdCST41fc7~c4lcِ1i4i4!c1 ֍ijӰidC6A6a$WnbL6C6cɆ{1ۘN6d oLtt!cpӡjӱd#ʟ#3D136f`3Ȇߘߘ1ۘA6d >̀s  !c~c7fm6fzn1Sؘ mTۘm$23aݘ1ۘI6d nc&1Smc&1l|c&ߘ1nq/曤qǧ$Eba.]7I/v>_{8/o.]7I{bs_VϹ/^ܗY9f[XZY[XZY[ƖXƖZƖYƖ[VXVZVYV[XZY[6X6Z~mmmmmm2j׮3ؔYb^Y*6 k,u=YTd ς,ueYTd ̂=,u{dW 41fwfwfm6f 1l|hc|lc>ِ1xݘ|Q,c z :e\,PXm, 2gu|gulcِ1!c}p~lc!وEOc˅].TXm,$2A)I/TXm,$2_.k؅j dC6B 6b/K71֍EjEdC"؋.RXm,"2/q|/q"lcِ1E"EbqmBq&bQ7úXmc1l==jdCuc16cɆm,6m,6ukb,uc K6`KȆX7m,6 Xm,QXm,!2_,%jKdbcL}QRa~ZQ.m,6 a5RR!cm,6 ++Tmc)l"ɮ&2 o,SXm,#2S9e2lcِ1_$^ XF6d c3bhm,6*]]il,,'Sm,6 a5rr!c5r]XN6d o,r rLXj+dC oPXm 2XXA6d }PXm$5=sRRmc%lJhcJlc%ِ1x/+6Vb+ɆJX7Vm6VUjobuc6VaȆUpNY XE6d ދ*U*!cu*NY XM66;NjgbSV)6VcɆjX7Vm6V )ᜲZmc5l|NY j5dM41ֈuNYXC6d nc Fmc l|NY5jk5dC6@k6`kFyeyZFkŜ)k6bkɆ7jkdCuc-k6bkɆXXG6:[NԍunSXm#2`XXG6d ^7Nmclnuc:lc=X~A!oÖ#c㖱-c'-c,c-cg,cg-c,c-c,c-c,c-cW,cW-c,W-i!}bwkN\vR1E;E;5n'q;5n5n'8;S]voوulbk]pMKmcl|]j]dC6vA6vaȆm6vm6v53.-Y YݭM6d ^7vú[mc7ljdCnV؍m!O:019eSm6 ׍=nQ؃m!2أC6d ncGmclpp&^^^^!cg{j{dC6B{6b{Ɇ甽pN٫G6 mb>oS؇m#2اG6d ncOmclnuc>lc?٘}*Mor'/D]^R֍jdC6C6cɆm6m6 ׍nW؏m  i^&OwP8m 27~lِ1!cpjd#g/s!C!!cpCjCdC6A6aq59 sS~#?mmF6d"mmF6d n7h7߰ȆazQwg ci 8L6;^l01q֍jdCaoV8m&2= Em6 SuaA_qU31^Em6 )GrDmqlnulِ12GȆ#QQwV51pQl(ِ1r)G6bGɆm6m6 GaqTm(ql _*&11s1c1!c9Sm6 )rLmql|N9cjǰdcı6>&qa8q\m8ql)X:N6lql8ِ1x8qq!cm6N׷fhb oP8m 27N~ lِ1  !cq֍j'6ynKb0mZ]xwrІ+Zb~wxWw\< /mﰏ]}$S;)IXNI\Nݗ1xy'Nzp"NE$1xy8q8E6?𨬉qJ8mR8m"2#B16lR8m"2q 8q 8E6d nqJmql˻eLӢ< gjdCpqZm4ql|q?Nm6N aqZm4qlԳR&a qFm ql78q8C6d n qFm ql|/ ?q8K6B6KqVi{Zg6bgɆYX7Ϊm6Β wy~wyVm,qlYhYl٘{fHq7~9lِ1s9s9!c~7Ωm6Α )rNmqlR8/pN9q8O6d N9)6cɆyX7Ϋm6Γ 8mW8m\ oەqAnυTw{.m\6. i]{Z6.`ȆX7.m\6. %v%vAmql4|9?qQ)rQm"qln\uEl"ِ1x/z6.bɆEX7.m\6.=[9Qĸw{. dž|p<|%lِ1xq 6.aȆm\6.m\6. `/zImqlSG&e[Sߺq۸L6d n2qYm2ql|N jdC{_ejW++D6@W6`W̳׍+n\Q۸m\1OQD >\s+UVԻyM߸ jWdC6BW6bWɆUX7m\6 uqKԍ[nR۸m"2߿om6n ۸mR۸m"2|-l6٘tk_mm!cpjdC{1^mm!c~67nm6k&ulbtw>;!c33m6 ||Gmql|N;jwdRL&]Q7ºqWm.ql|rSm6 ܅{1w6bwɆm܅6m6掷2Dݸ={=!c^Em6 `qOmql|N{j?xWY&j` vpHklj` Cml>86iMjdC}؋W۸m'2qڸq۸O6d >܇s}vg;4{ۺpWZso@݁xۺ?Po.{lPԃ6aȆuu xN6y߇㹨axxN6d >s KQhDZ LnuKl%ِ1KK!cp/j/dCkؗp Rm%l8>x%~U*6^aȆm6^m6^ S^u+W+!c ֍Wj?o笫S^O??Ɇ ''ِ1??66$27Ɵjb{p&_N氯C66"2E_ja )9/ȆaF g ۫Cmm&_u+7^~kl5ِ1xx kk!c֍jdCsk8Vxm!+/M7hl ِ1xo6`oȆ77jo7dCggQxm%#:{Vx mUxm%2?-<[l-ِ1[[!c֍joƁͿJ[olo!c7mmM6d c#mOD166&27;EŸw;w;!c~7ީm6ޑ `Nml|3l7oz#?=66!2??dCs?pNGml!c5?p ?{A' <41ދp{l=ِ1Rl{{!c֍jﱍdC6C6cƆOob|6>@6>`ȆX7>m|6> o|6>`Ȇm|6>m|6>۞gb|6>B6>bɆ  H6d ^7>ºQm#lyGl$ $_E|aa.œ8']\ sT⟾V/w 7O. xϿP/p=HN<;zE껟׃te @r@r$'2KߒE$ 91\6c)FOrH+)ȆrOHA6d ᰑA:rHCk#lܗ.ܗj)dCςSg)6R`)ƄaMnu#FJl#%ِ1xH FJFJ!c3%IRm6R ׍nTHm"'ֶsE# , z,F*l#ِ1TF*TF*!cpTjTdCςSg6Ra.d#]C]01\DpuEmp!2mm`.dC 7\6\ !c놋چ l8P=gb66vwSY6xF()bVHm&2_kjdCkpmZm#5l|mSRm6Ґ!3.9~H#-}4ji4dCi~g4F!c9% SҨm6Ґ ׍4nQHm%;ͬ^괉l$I#-̡ؖC.Ҫm6Ғ ׍nUHm%2iaHHK6d ^7ºVm#-ls>6줉N`Nm#lnu#F:l#ِ1x6aȆm6ҩm6ғi&Fz1sJzFz!cwHһwHҫm6ғ )ᜒ^m#=lFzh#Fzl#و=q# ?s, :s,Fl#ِ1xF F!cp j dCFodPȀmd$+ <󨉑QԍndTȈmd$2ȨH6d {F{FFF!c֍jLdaLF&LF&!cpLjLdC 8c8l' D6d }eRȄm|I6aaL/E/%ETl|KƗƗdC0u3FMCkKlK!cuwa#>?= Ϛ(ƗFf&S`uM̢ jdCu#362cɆ&d6gVȌmd&27|16Ȍmd!t#S9%Fl# ِ1FEm# lFh#Fl# ِ1)Y6`_[_茶rAO}ِ17_orR lfNqwpذ}WWdC딯:+d#ۻO11֍jYdCFVodUȊmd%2^+2SZYdC]fuA]fUȊmd#MPdM`/Mm#lndu#F6l#ِ1Lݨᰑw|/Ȇmd#2`Ȧ N6?,5x9l6$md6 a/]m#;lndu#Fvl#;ِ1Fv]m#;lЛMbNj9dCH!borsm6r  /g юw2%A6d ^7rCm#leLbN 甜j9dCSr)96rb9Ɇ甜pNɩI6d N )96rbȆ砛&o11ruJ.Nɥ E6dh.a#Km#ldã3F5T% E6d >sJ.\FnяM41r9%7Srm6r a[m#7lhyTZdCu#76rm8>cI0$9IC"J͊x ZDs⭜$5"AsT/:MR[;Ntqci>_<ɧy=σA^:[+押pȫyq=Kw_ /yzTv9c8D[thD1"zD {̼jyF-E3]ob|+G_ ۡ_m|m|M6d vpذ}dCооVlj_cFog[kb}D>GSȇm#2_|j|dC0}3>"OZ|dC=f>cSg8e;~ҋ<qG~,c-cX Y [ƊXƊZƊYƊ[JXJZJYJ[XZY[*XƾU}gdlbjsUUYjX-o6;{#3vnۺ׸Td Mn~Mn~uˏk\~q2=?|=5.?8þ9_qkWW6 `Ȇp+Q(@6d vvF!cި m6 |Կ ٰSPm QlnuFAl ِ16 bɆ{7*QlY LoD֍o66!2adQ8Q ooȆm|m| ِ1x֍o66 Ic3($))Q(D6d ~f!tf!BF!!c~7 m6 ׍BnR(m&^O;~QX<+ V(m&20|Fal0ِ1uu6 cɆ{°-Q(B62^3B0up "jE"dCQ(m!2E^Flِ1Ҋm6}Y`bu(E6bEɆm6m6 ׍nU(m%2?W(ySm$2 mxmxb5Ɣ-fmbp]Sm&Ql|MUjm6j ۨ mTۨm$2jިFMlËlIUSOKy}:/ /lËl܆᥶mx x/ /lËl| ymxaBZQKبmRۨm"2Q ڨQ ۨE6d Y-Y-ZF-!cwVkwVkm6j i w71j;{QshOmtwmFm!cpjdCsJm8Vۨm&2ᰱ|]$Q&^]:70oNV6ɆmxCj؆7ِ1 oh[m&27a᭶m!{k:k013긠3m6 SuJ:F!cpu:ju:dC:pRGmQl$5Ĩ+ְuF]l.ِ1xݨ F]F]!cpujudCu.u6b}Ĩ0-|qF=lِ1RR6aȆal:c|LCkQlO=짞F=l>Qڱ gbF}F}!cߟ[F}l>ِ1xݨF}F}!c9>Sm6}^hb4g#7pAg#7Phm4 2 `hh@6d o4Phm4 2h!O11|Q6|Ȇ>j>؆ِ1xuGm!27|`᣶m4$%sL8:h(zцmhH6d vCvCFC!cgm ᳶj dC{_ WCvov5բZD#s/9Hk]\렑݁x*_^m]#x~#7O}[t笫fw+|ពzKw_pW_r cj?| _ _lÏl\MzxpO~2ma~dC0}D3Æ;? ?lÏl9|N⧶m ~S6\/fb46C6cɆ=jdCpXm1јlFchFcl e&F14sJ&F!c;ƜyTo{ZM&dCsJ84Qhm4!2_6k&jM 1q_BL Q7aW6Ɇ omcdCp_m'2/᯶m4%G5}\TMµiSFS!c9)Sm46 )MTm)єlm {ѦjMfdCkhN6d ^7ú\m9ќln4uFsl9ِ1x/6cdckL@ы^4Pm#$2nmbdC6@@l#lnºm ovG,ih!zmhA6d -Phm 2hhA6d ^7ZBmђlTRmMLnuFKl%ِ1xh FKFK!c~%7Zm6Z ׍nThm"ѡllbu6ZaȆVh hE6d ^7ZJmъl| SZm6ƲC}M N l#lFm 66 !cpAFFL6sbN sJF0L6d >9%Xm#&2 mmcdCsJ0S6 Ω"8m`!dC6Bl#l|_4m`!dChEC6BPA'71BŜ PPl#l}P>WF(J6d ދ^4Tm#%2 Æmm·ôfkc EX"-cm-c,cQNΖ.hXee,2gn%X[·iM5nݼ k8ﺷvAﺷV׸ָƵ'c5[k\k\ZS155q7j {ad\ŧUj11D00l#l7 QFF6d >/Lm# #2mmamF;]h7mȆۡ׫ۨm6ڐ ׍6nQhm!2m`hhC6d n Fm N6/5|21Eppl#lnúm ׍pX76±p!c9jF٠j~üpA6|{ MnFA6d ^7"`݈Pۈ6"ȆmD@jFِ1x݈u#Bm#ۈ$;; 61"E HHl#lۺHm]F$I6d n#ڈTۈ6"ɆF$jF[lk_mu|ߖlȲ3DIF[l-ِ1xh F[F[!c~-7ڪm6ڒ ׍nUhkȫnӷu`N-]xrvO[׎؎jv\F>F!c~7m6 ׍>nQm%'+zѾK6d"F_l/ِ1x}6b}ɆF_X7m6=JF41 ~'F?lِ1:\Sm#2?7<7F?lِ1xF?~F٘m }hF@6d ~~w7Ͻw{'kٳPlc(ِ1Fٺch16moaY12626262626262626262626262mbjMMͰʹͲͶZ,c9\Xel^10s,RPٺa a6^=]E1I6n551R챌{,#6Fb#Ɇ#:zHlc$ِ1H7;Rmc$1lnTppl:!qZ#QdD(Q(!cu(1 E6d >s(Q(!cQñQdbhm6F2?R-1ZԍѰnVm&2߷ Gm6F )2Zmc41lnTvpl<4Z xI<c11C6d 1!c9e Sƨm6Ɛ ԍJ 糨)iZcd#&X1sXX!c~c,7ƪm6ƒ  mUm%21oBK$Z 8LsDD!c1[;Gh16&bƍ)t>&$Q7&1Imc1l$hc$lcِ1xݘ$I$!cħ~Zdǥ|bL6&C6&cɆmL6&mL6& ׍ɰnLVۘmL&2uɆ31&_n0ᣉ-kߵymxcdC6 o olÛl܆7᭶mx %> T76)dcV711֍)jS)dC6@S6`SȆalqpl~Lplc ِ1\@6mL6 z;cSaݘ1ۘJ6d 1oLUۘmL%2Saݘ1ۘJ6d nc*1Umc*C6L Q7|`Q6|Ȇm@>j>؆ِ1 hGm!2mm`F|3~|ebLuc6aȆipN1 ۘF6d N)6aȆ{i1 ۘN6F>Kcaݘ1ۘN6d nc:1]mc:1lnLuctlc:ِ1t J36Kg Kgm6f ۘmPۘm 21ژ1ۘA6d nc1Cmc1lГL}t3=36fb3Ɇm̄6fm6f ۘ mTۘm$2K|ߘ1ۘE6VKϧ&,qn':[7Kmc1l,hc,lcِ1x1 6faȆ1Kmc1lې&lŏll!c1ZdC6fC6fcɆpN1%!9&d#Fu/˹-nmbdCu _ _l×l|Nsچ/K6d ~ Ηl؞Up3I1ᘯZ]Ƿk>Gl?wvgw`./?xw~}.\᧾~=4>}C_Xw2f>v?91x=""q='2+\᯶m!Ώgb}Xm6 n=s6`sȆḿ6m6 s`ݘ1 J9p0Ȇ0iF@6d G>"@m# 2?[m`dCu#֍lc.ٸ8c׷Ln̅uc\lc.ِ1̜s6bsɆ\X7m6 ۘ mUۘm珼npt??nnJ و}YsqM T6ɆF jF ِ1xu#Pm#$2K|hN T6摍~<9Omc1lE ޗyjydCuc6aȆm̃6m̳pB}ѾEyG-c ,c -c,c-cK,cK-ce喱UՖ5Xelelelelele,22222nfEFsy65$OySAk\8 .5.׸ q2'^|'^D5Np݇ q݇ u |q`gU]||!ch>m6 7_mc>1lojd#Ne\21 j dCt >!cym,6 Xm,PXm,$>颉P a߼Pmc!ln,ucBlc!ِ1xXBB!cħj Ed=ob,uc6aȆm,6m,6 Xm,RXm,"27~c"lc1a싋gMbn1ܧ[XL6d s5!cħ5jkQفmb^4!j!Fِ1xl#lFm =l#l]@]&Fۆ}Pa> i#Tm#%2 {_jF(ِ1x PPl#l|  װjv!l]T(~n-k"E{7w[ kZvqſ[ +Z_kĿ}qtתZ\=Tݣ ul:Otn`}렃ujp=XGd ^zN-bHNmclvphHcXj뱍dC0sEKw dž_H rDXO6d X6cɆ{\@6\ HxA଱Amcl|?6ml66 o{66`Ȇצtlc#XyQgn'zFF!c1ZdCuc#66bɆ߰aFl#l<&FajaFِ1xu#Lm# #2_4Lm# #2K|hN S66ݲ$6=MjMdC66A66aȆml66ml66 `/ImcltJ,fX76ml66  mlV،ml&2جL6d 4PجB6A &ac Emc l;-;-j[-dC6@[6`[ȆX7ml6F >*ְ[vVlc+ِ1x VV!cpCpOՍjڣq¼kMpa#W6Ɇ^xF8N6d n#W6ɆmCj6мSbls68lS؆ml#26mj۰mdC6A6aȆmpN٦ ۈ SĈ6"l#l|NsJFA6d 7"6"!cpFFI6=޿*#R)pNTۈ6"ɆmDBjF$ِ1x݈u#Rm#ۈ$2 mDmDm89GѾFygG=-c;,c;-c,c-c{,c{-c,c-c,c-c,c-cG,cG-c,c-c',c'-c,c-cg,cg-c,c-c,c-c,c-cW,cW-YjNy+̟SqQEQ1x5.J]p'c3QLnEE5NpOQd iLbj۱dC6C6cɆ{7ڮN6d >mv1|?;;;6v`;Ȇm6vm6v ?k>kCmclj;dckvYc;aةI6d T؉m$2w¾yNlc'ِ1x N.\K`Kmclnuc.lcِ1].].!cħ]jd]z,41v jdCuc76vcɆm6vm6v %> n95#=أC6d ^7Gmcl=j{=dCpOՍ=j{dcy[g3+5 5٫K6d S{OU؋m%2ثK6d o^>qgu[#M}nuc>lcِ16aȆm6m6 ׍}nS؇m'>E6cɆ߯O6d o~~!cpjdu}qK11Fιq6`Ȇ{=q8@6d ^7q@mqlj6C^ٺatk׳uLrP-]ǷG}ݺAs.lAyP}ᄍxow~5;$~'C׃Cte G}!C"2 ?ER8!!cħ!CaHmg~ayXm0qlfhH ErEq8L6d G}aa!c>06cGFQ ꬙abq?L8B6|isySm6 =Q8m!2~~lِ1##Q1ĕk&Q8 G6bGɆK< K8#_=wϨm6ΐ ìSc86lo=q8C6d >s3!cuN9q8K6~إ&Y1sYY!cq֍jgdC6Bg6bgɆ8q8G6N+(㜘S99lِ1s9s9!c9SΩm6Α 8mS8m'W/abu<6cɆm6Ϋm6Γ 8mW8m'2K|hN9q۸@6濜%pグqڸq۸@6d N)6.`Ȇ. j dCu6.`FcSx'zEl"ِ1xݸEE!cq֍jdCpOՍjKd޴qIظm\R۸m\"2`ݸq ۸D6d nqImql.i}KjdHz61.^2E/m\6. ׍˰n\V۸m\&2_\jdC6.C6.cWFΙ ĸ"X7m\6 ۸m\Q۸m\!2qڸq۸B6d 34rplro|ڸm\%7>xjq݋&Mq':KsSm&qln܄uMl&ِ1MM!cħlT۸ie֕[w V[j"=]$}8`vp\<.7zwcgn}[{~ ׃tWN9FOCc Xnm\nݗ1x= m۸&2_G߆jq=M"d 4P=q۸C6_ewlِ1[+w Fj3Z ;!cpw;jw;dC6@w6`wɆMǼ gjwdCgd32w6bwɆ.ݺjwdC6Bw6bFu~qOԍ{nS۸m#2S9=lِ1{={=!c=6q۸O6v9LjdCgó6cɆaz_m>ql|>ܷqx@6&}V&a@mljdCokjϱd#o/561^~7^m6^ ׍nPxm 2/`xxA6d 4МBml8/x))/:Kl%ِ1//6^b/Ɇװ/Kl%ِ1:%\Txm"mOJ<#=#Jml|NyWjWdC6^A6^aȆJml\w(Px-װxxM6d":?Zm5lx jdC6^C6^coFK\cb~ޛFm lnul ِ1xo6`oȆFm l4 p&[oUxm%2?IzxK6d n-Vm-l|Sުm6ޑibsflVxxG6d ^7NmlxwjﰍwdCpOՍwjﰍdXsO_T71ދg{g{ޫm6ޓ #6k6cɆ{X7ޫm6ޓ xmWxm| 񝮧Aa?5!c^E?m|6> ?>Amlh pGs&)9}&#\|Tha.1IHl?Q݁x\vg>Y}sx.G='#\I\I}?z;?Ojp=Dd >W|s'O|"2Ojd#t~hb|pYm3lE80gl3ِ1\6>cɆaCkذg /!/ozqie2amckyYY\DĖ$d䖱-c)-c,c-ci,ci-c?XY~{_b?x)q1PS9| 1`?1>1`?1K /忧翘dhʙ1FLFL!c-1ׯTۈm$2ڈۈI6d ]pL/]pLF,ѷϣeLX^;X^hKm#lnĂu#F,l#ِ1xo F6baȆcm6#΋ϗ2166Slf;cwjaߑ ׍`Nm;l;!cߩm|mx)ibxxZo{mx`dCu  lÃl܆ᡶmx 6<6_m#>lvH HH@6d >$sJF!c~#7m$6 Hm$PHm$$eV&FBQ7ºPm#!l ;@m$6 ׍n$THm$$2HHD6< 21 DjDdCF"o$RHm$"27~#F"l#ِ1:%\$RHm$&|wwR#S9%Fbl#1ِ1FbFb!c86b8VpltiO:ĎCk#1lFbh#Fbl# xԠL$/DaI6`IȆm$6m$6 )IDm# lFcw ?Hm$%'lIEH FRFR!c^4)Em$6 H m$UHm$%27~#FRl#`&F2/{ɼ]&SHm$#266F2l#ِ1:%\$SHm$#2 H HN6ޫsF#aHHN6d >$sJrFr!c^49Em$6 %> d#Frl#ٸYy6HA6bxAW -y)6R`)ȆpNIHA6d >sJ F !cħzj)6C^ߓQգٺa^-{sqo}{/tn{㲋tw{7þ~OAJ-NLK)AJXR~J\Rݗ1x=H AJ$2)j)q=HI"d oE6cɆIIHO6d ދhzFz!cuJzNIny?9~78`yGFX&XfXXVX6XvXXNX.XnXX^X>X~XXAX!O–-cE,cE-c,cXƊ[JXJZJYJ[Xj\<'4N Tuˀk\q239e5.8׸ eP׸ e'c} p.e_Fz̵Mb.#ܧ˨H6d 7g}sFFF!c(#2md62 3vFF&0\&F&Q72Im#lF&h#F&l#ِ1z;\ogRȄmd"2K|7ʤ L6r w/#xHfjdCϐdϐdVȌmd&2aȬL6d ^^轊62cYFCjkbd,pEm# lndu#Fl# ِ1xF,F!c~# 7md64/gcbdggUȊmd%2.1+|.1FVl#+ِ1FVFV!c9%+Smd6KcabdsJ68dSȆmd#2`Ȧ F6d n#Mm#l|.ܧ˦ N6Rq%])ᜒ]m#;ljٱdCϚdϚdWȎmd'2S9%Fvl#٠[41ruJNɡA6d ^7rCm#lnu#Fl#ِ1\@sJFN1A,?_9E FNFN!c֍j9dC6rB96rb9Ɇm6rm6r+m|%F.X7rm6r mRȅm"2_k\j\dCsJ.8Rȅm&q~_#aȭM6d n#7[m#7lnu#Fnl#7ِ1\@hnFQ+ߙy# m6 RHmٸy1=Oj?a? # lnOj?a? ׍`Im'l0ҧ#Q(Q(L6d >sJaFa!c~07 m6 %> dFalgSw11~ϰYmglg!c1Ckglg!c1)l|N)?mm!5Euܔ"dC]J>]DmQl|RSm6 lDsplZT(m!2Fl(8'{&FQYwU(m%2ñqOh16bEɆA6splDQ(J6d >sJQF1~ؚٺbl]1bF1!cQ ֍bjŰbdC06ʺc86Jt-F1lِ1\@sJ1b/df61~/Eml!c~;c T7m6J'swJ}(!(Q(A6d -װ%6J`%ȆpN)Q(A6d nQBmQl|T()FIX7Jm6J ^~^Rm$QlnuFIl$ِ1)%)%6JbF^GƝbbF)oR(m"2`(Q (E6d nQJmQl| [ aKm6J/K]61J2M`ia[_9rF9!cʩm6ʑ 5U9rFy[11 塍j屍dC6C6cɆFyX7ʫm6ʓ %> [^m%Z F%FӔaMJbNJjJdCh%؋VRۨmT"2`ݨQ ۨD6d 4P/ZImQl4*4>&FeQ7*úQYm2QlFehFel2ِ1;@*wTVۨmT&2K|FeF3}^GL*{*{*jU*dC6@U6`UȆ*pNQۨB6d N)U6m8uet9[WVjU"=]߭ [AUs߼l]U8kTUo.=[Wփ{^׃jtϽyЫ&jp=Fw_kjpmZMȁA5XET1x=A5jFuQKϧEQVjձdCƈͶ] ۶kuFu!cpաjձdCkpmZ]m:Ql +;^8#SQۨA6d 6צ56j`5Ȇ5LRCmQlǬj5d#4sJ#FF#!c9Sm46 gE^Fcl1ِ11\6Vhm4&2ahhL6d i86lD4Vhm4!'nz وE'F-C֍&jM&dCu M6`MȆ&hhB6d g7Qhm4%B951~)7m46 ׍n4Uhm4%2MahhJ6d }5Uhm4# h hF6d nLmьlnwplbhm46 `Lm~A?,cZ mbjy?L[q3ubV5U[ukk\[q2Ƶ5-8mV]זjڪk\[{sy3{11ٺvPD;vv/u\<.׳u N}ᄍxoٺvp^kpӞ?-0ڋz׃te ^z^=ɁZD{\ړ%> Tګm6: dbt6:@6:`Ȇakذ}AmсljdCpO}Amёl8> 41: jdCwwTmt$2_+u3IGFG!c֍jNdc51:sNjNdC06Zc86Bh#Z NF'!c9S:mt6: mtRmJ6vq=_˯jb +W__ɆA+|jb %> ԋ+pU?S~soja ԍV go/gZa Mk6~6~#2oFgQyƫ8m|MFghFgl3ِ1:3\tVmt&2謶L6d ^7:úYm3хlw,袶B6d ~& j}>dC6@}6`}ƹ/7cbh_؋Um%2/F_l/ِ1F_F_!cp}j}~d(0'~_}~j~dCh?~F?!c9Sm6 %> dF?l?٨;yv#Mb?诶O6d ^7ú_m?џlFhFl?ِ1yv1b=kB=@mc1lhclcِ1==6`ȆX7m 69O;8(~gݞjdCs@8 Tm $2a1H6d H6l6bw\Yr 111֍AjAdCuc6aȆm 6m 6 }sLjmbhm 6  61?66 2dC{_?66 2ٸñqan#Ck p̟LRT(n5g+?"0v/ b/v݁xor=GwO~㱏LҟtM;7ŵO\{~Rzz_Ew_{Z=/r c/8W/dYH``!cp/|`lc0ِ1`5Xmc01lF]w6Z d#_7166VlmmM6d ^7uoɆau1Gs;PCkolcZw~&ܔ!dvSm 6 #l Qm !211B6d S711~?ZCdcɜ]BCE PP!c~c(7m 6 )C2Tmc(1l 1nyK/7w8fy?pH(hX8xD$d˘elele2626262626262k[X,cs-cy w̵{?abovܛqpF5N5nq5nqè 5n 5n8Q&q5nt~إ1\|7~7\mc81l|M5m 6 Fao4\mc81lF(1A6)vfwwcFhlcِ1##6F`#Ȇm6Fm6F mPm$3Oyu)l6Fm6F F5HH!c}pvHlc$ِ121E6gr~#%QpN1 E6d } cգ6FaȆ(X7Fm6F ׍Q(Qhʉ;E hh!c1֍jdCh؋Vm&2j1dj_:cc`1C6d Ӌrplnc9m!211C6d nc 1Fmc 1l8?J11VԍnUm%2_딱jcdCsX8Um%28@6ƪm6Ƒ'l6Ʃm6Ƒ )-16aȆaFwogD1G6d o6Ʃm6Ɠ absx8Wm'27~cxlc<ِ1Fk\<}Z㱍dC6ƫm6&bίR51&1֍ j dC6&@6&`ȆA6c86xW-x͏bhmL6&  jdĘ(lL6&mL6& a1Qmc"1lfNM-Dlc"ِ1u#@6&mL6&/=ϸLI$hc$lcِ1xݘ$I$!c1{9G1 ۘD6d nc1Imc1l|jabLgr'36&cɆmL6&mL6& a'5dd!c^t21Ymc2M6\Cs[ްV6ɆmxCj؆7ِ1ozBV6ɆmxCjy¶1ELQۘmL!27~clc ِ1)S)S6`SȆ))T1SYDTT!cpSjSdC.sS6bSɆmL6mL6|ƅjdb9)>j>؆ِ1 hGm!2mm`>dCs᣶mL#3&4N)6aȆe ijӰidC6A6aȆ4hc4 tsn9ltX-EL0`zn:;L;0_zMOQ9]}ᄍx ,iEA u 5.j 8k\qATd j|f5H]p 'cuAk\操ٟy_Ę/o1ۘO6d ;Wۘm'2c|E1ۘO6d ͇6m6'ngV:q/^X@6d -!c1Gh16` Ȇ/Zm,PXm,$~ZPԍn,TXm,$2l!|lBlc!ِ1  :v&qZ dC}BhcBlc٨p"&"# j!"E"!cEp/f"lcِ1E"E"!cpEjdnUX,býjdC0sJKw ƫٙ=blc1ِ1xX bb!c9e1Xmc1lɁB&uK-QXm,!2_,%jK%dC0u;c 矤bhm,6 ׍%%RԠ KEX RR!c9;cvkRlc)ِ1Lݨ0ǵGXJ6d NY m,UXm♫52 #3jF0ِ1:%S6`!c1'N-F0L6d ^7``lc;mkyMeb Sm,6 ovpl~ʢTXm,#2S9e2lcِ1x X XN6h.\Xm,WXm,'2_,j˱dC06jcxH-rlc9ِ1rhcrlcx _.cXXA6d"FCkclfNim!Z  !c~cBmc݆sk9[WV[ ;Еj+"=]<ٺpkJsgV7Gvq_i]Kr_{׃Ut;-o۰~vCo`=Xp=XEw_s*8WR;X*r c;ƷgE ׃U$B=*hc*lc5٘YMbmVjdC6VC6VcɆɶV jj!cpj5dRexM5hclc ِ1t \QXm!2XXC6d G6֨m6BF*z"l@!j!Fِ1h#Dm#!2mm`!dCu#Q6BFÛ`b FF(J6d n#U6BɆa]pl~!Tm#%2FF(lL-80o&Zac-Vmc-lX jkdCuc-k6bkɆZhcZlc84yNSu:u:!c֩m6֑ ׍unSXm#2렍uj밍d#.51 롍j뱍dC쬇{6cɆm6֫m6֓ 6֫m66 1169eS6ml66 ׍ nlP؀ml 2ؠ@6d >l66ml66]MOebluc#66bɆml66ml66 aQmc#l{FFغy&FajaFِ1x/{00l#lnm )aFFlƷf c`ؤ D6d װ66aȆa~;cMjMdCs&hc&lc3(ym|ɆnV،ml&2aجL6d j w džff!cufhcflc 0fx&1ls-!c֍-j[-dC6@[6`[Ȇhclc+X_$61֍jC6B[ɆR _VV!cت'w,F876±p!cpm  W6Ɇ{ph#\m#F62yw:m 6m6!c~c7ml6 ÓlcE46aȆm6mFhE  jFِ1b3dF4Bm#ۈ 2߈jFِ1x݈6"6"HBĈ~+Rm#ۈ$27"amD 1/jF$ِ1x mDmDmAoa,naiemckgo;`;h;d;l;b;j;f;n;a;i;e;m;c;k;g;o`hdlbjy?Lո).O%(7Gk\qQTd ~. R׸(\㢨|. Ek\qQTd EqQxN6ݲircxvj۱dC}v7oW؎ml'2hvlc;ِ1خA6jTCt;6v`;Ȇgvm6v S|h/flcِ1x߼ءI6upxc{NiENqlS)*Smc'lo j;dC{1;^NN!cɣL dcNlc˜&.o.].!cwۥ E6d ^7vKmclmReM6bĸ3nv.ٺݰFV;mw`.W{/nmؿ׳u=߭q=C|P̛?\%z{7G}z{=ܣv(mmb$$(.ŭ@)Zܵ@q ťR( .EB4<$,$!u9{8;˘cνڧq=8Md >WsiӸ&21OC6Ncg u}obs8WQ8m!2q8q8C6d n qFm ql|8mQ8m%.G-gb6Bg6bgɆK< K6Ϋm6߳11@h#Pm#$2 {jF ِ1@h#Pm#$2FF ql{&1\s !cp j dC񺠶q۸@6d ^7.@6.`Adcsv+61ijgAٳ l#l|N sJFD6d ^7`R6ȆMɒFFL67 #Xԍ`X76`!cpFF0L6d  76`!c9%V6BҖ+6mfb!FFB6d >9%Dm#!24Мm mm`d#˚A=/S̪-lt]4PPl#lnºm )pN U6BɆmBjE؀jb\u"6.bɆEX7.m\6. ۸m\T۸m\$2E/B6.bȆKi.uIk-[v.~㙤[2R[o.>vO癤[R[ܦ{^ bmywV۸ܦ/cmvp׃@6"nzpDǷj6}" x9ZY[",c,c(C#Xeeeeee,222k{e{m[,cw${{_P[6̟C5Vk\P1oG]wj!!qwpC5Nk;Q׸;xK62P}qWu]]!cpwjwdCm6 ۸ mU۸m#3Kĸ'z{7q۸G6d oS۸m#2m6 A6aɆ+21m6 ܇jdC.s6cɆ}Fr{~KLQ7"`݈Pۈ6"Ȇ8DmD`dCsJS"6"!c9%ڈPۈ6Y-[hb< < 9lِ1x/6>`Ȇm|6>m|6> ׍v\aooɼ1X ˘e2nyZRZƼ,cޖT1˘e222222222222222e,l򛪙?d^|M N!y'yNָd^ɼzNָɼPSǀ_ri~#b$_r/4%WHm$'2{/Frl#9ِ1FrFr!cpɡjɱ 1ѱ9*.nᢶm p6\6\ !c5ZSm`.dC6\  l#xH)z;F l#ِ1))6R`)Ȇ)> d#F l#ِ1aR@)6R`d61\z ]6\ W!c 놫چ+J6d W/ W WlÕl܆+᪶m/ab놛چF6d ^Mm p#2uB{njn؆ِ1mmad\nú᮶m p66ܱ w!cpІچ;N6d OmmcdW) b)j؆ِ1)/t~Cm 2mxmx`dC6<  lÓl4[9Ŭ<Ɇ ^O OlÓlچ'I6d p=6< O!cpІچ'l(H)攔pNIHI6d ~F&:#Rm#%l|SRm6R H mTHmx.-abxy߻Bw饶mx ?k兞5R6Ȇ^j^؆ِ1 /hKm &H[{_p[m&216l?^⭶mx 66 o!cgݽ o ol#(x6ً L*TF*!cuJ*NI HE6d ދh*TF*!cSA6Ra>dcuCniӛ>bom`>dCu  lÇl܆᣶m )>ІچK6-X8 +zQ_؋mbdC_NU6|ɆE}ᾨچ/K6d mmb~dcn%3&~j~؆ِ1X#姶m S@? ?lÏl܆᧶g8䕚l$ay}<[H.\ujR{|֥fjOm^cx.5<5iORw^Fi`F}z_MQ;HAr cG("ZD\Ґi4jid#RiFZFZ!c}p"FZl#-ِ1z7UHm%21Bi6b?H .-tj鰍tdCu#6aȆ)> T7ҩm6ґ HmSHm';H/zHHO6d H6cɆ{LHO6d n#=^m#=lt~FAmdPȀmd 2Ƞ@6d hh F!cGh#Fl##ٸ6FFFF!c~##72md62 ׍ndTȈmd$2jLdg6512 LjLdC62A62aȆF&X72md62 mdRȄmd&g=,ld62md62 a/Ym#3l|/<3 ϬL6d >d62md6ꭿq􉉑Ea5l,F!cввmd6 a5l,F!cg@Y6`YƞؤK#YFVFV!c֍jYdCsJV8dUȊmd%2SBY6bF+ߖ419%Smd6 h6/6aȆmd6md6 f6md6#ȮN6d ^7ú]m#;l|Smd6 mdWȎm 9T_saRr _JF!cp#Fl#ِ1h/Cm#l|NmPȁm|F6ޭC7>gja ׍`Lm3l3!cugpggdC06316>6rT.Ee 31r:y~Nۨ 3ϩI6d n#'Sm#'l j9dCk؜FNv0}?L.{}a`hdlbjfny?L.qn lr9u7%8&H.u˅k\.q2?# ɥqpE5N_.8R׸\'c ָ\ FbA_'4r i O?[m#7l| jdC}sn7Vȍm&2sC6rcy-#yz;Fl#ِ13y3y6`yȆm6m6 @y6`y!3$yřܼLn^F^!cv^ΫK6d 7}s^F^!c9%/Wm#/ltMݦ⮳&F>6aȆap;:c8ld.YoM"G6d O6#6F>l#ِ1ȧO6oNh?_mWȏm'2aȯO6d 3FaQ_16cɆm6m6 ,_Q@(mP(m 2θθFlِ1xQ6 `Ȇm6 m6 I>bb6 B6 bɆ):FAl ِ1FAFA!cpjBd{g41 9mRlnJ!BF!!cF!BF!!cpBjBdC6 A6 m8y6g뒙mբZDasqWvg C {|w}sqOge80E螗:X{WDE/Ep=(Bw_tPDEȁצEڴZD\ۣQDmQlo};LbO(*Q(J6d c=fQFQ!cpEjEdC{ZEjEbd#n51Q ֍bjŰbdCϺϺS(m#24E6aȆA6aَE(FqFq!c}pߢFql8ِ1xYv6cɆ{FqF [#i&F Q7JQBmQlF hF lِ1%%6J`%ȆF FI1ט%E( FIFI!c9$SJm6J ^~^Rm$Ql( mT(m"{8^obr>aRJfUR(m"2_RjRdCsJ)8R(m"2RjdclMbN) jdC6JC6JcɆm6Jm6J j2d*.-118bFxe(Q(C6d oF2F!cpe2je2dCsJhFlsѽ,41>\msls!c9m|m|N6d o|6>6>'2_~m|9Ql_uS(+އ]FYl,ِ1x( FYFY!cpejedCu,QVm,Ql|34MrnuF9lِ1h9/ZNmQlF9hF9lِ1xQ(Q(O6R;^*`bw dH=5)*>j屍dCkp [^m01/: //Ȇ` ?/66 2dCj_`4 ^7*mT6* ׍ nTPۨmT 2QڨQۨ@6d ~QAmQlܚ?bQQDz"|eEFE!c"ٰ6*bɆkkQۨH6d ~FEF%qbƛ6MD6-`ϦJjJdCh%؋VRۨmT"2F%lِ1JF%JFe61*X~cFel2ِ1xݨ FeFe!cuJeNQۨL6d mTVۨmT!.7Ĩ"lT6mT6 }U{_U6`UȆFX7mT6 a@U6`U~nbTUFUFU!c tUFU!cQ֍jUdC딪FUF51ՍՄjF5jF5!c}jp_F5lِ1jF5jF5!cpՠjjհd#ٜ+ 21pFul:ِ1R)6cɆװFul:ِ1:Q]m0705,i2V2V2V2V2V2V222222eeeekX 7V֖6vo-c-c,c-c,A5nDqGoj}p585WC]jWj)> 4P׸ՠ'cP׸xI6rKjިFMl&ِ1FMFM!cp5j5dCFMvC^_ug뾄їj_E<[%샾T;\<[%_o.t<΋{A-\RЫ%ZRZԢ/czP փZjp=Ed ^jA"jzPDԂ6jm6jV+6mĨ-jjdC}mFm!cpjdC6jC6jcuF`B711m6 Flِ1:\GQۨm!2ߛmQۨm%użjĨ+F]X7m6 )uRWm.QlF]hF]l.ِ1xݨ mUۨm#Ĩ'F=lِ1xݨF=zF=!cpzjzdCuQOmQlMSMF}hF}l>ِ1xݨF}F}!cm6 ۨmWۨm4 iz751uJNih@6d ^7@mрln4uFlِ1hhH66aR&FCQ7ºPm!ѐlFChFCl!ِ1g g 6b Ɇkm4Thm4"K#s{Xh$F#X7m46 hm4Rhm4"2_6kFjFdCuHmјltܪ:&FcQ7úXm1јlFchFcl1ِ1FcFc!c~1Xm1фlY/M&wdxߑihB6d ދ6h&F!cpM&jM&dCϬ66m46".Ҧnb|%支WWdC66R l@Wj_a_ ׍66Qm֗ lb4g³uM6bMɆm46m46 h m4Uhm4%2hhF6^jvj`h hF6d }J3}J3fF3!cJ5j hF6d nLmќltLr&Fs)n4'^÷326cɆFsX7m46 }5{_6cɆ)͡jͱƝ51ukX7VlLLj_c_ }} Vln| m|5тlqiBԍnPhm 2-`hhA6d nBmтlF hF lrTߢ&7n|7j`ߐ Üna:ooȆװ57j`ߐ Fml%٨bwB&FK:o$CCd0TxlhI6d }Thm$2-ahhI6d hhE6Zf>mE[m6Z ÍݔVdvSZm6Z ׍VnRhm"2E[A6ZaɆM={Zm6Z 5|HkFk!c16lo|mhM6d ~5Zm5цllu|Fԍ6nQhm!2S:8c8l{hm!2m`hhC6d o6ڨm6ڒUx^-|^F[l-ِ1:-\Uhm%27~F[l-ِ1F[F;,3:\Shm#2acS197W vF;!c\169W vF;!c~Nm݆p̷Lxs8㙤oLZķv⮟.Og8-U;\kwIᄍ?׷zО̆Ѯez\w=@;ګ=91^x{^-=IjmWhmt Q3 =11: 6:`Ȇ-:}jdCd[kȆmkFlِ1x蠶H6ebt}DGGtTmt$2#:8c8lꨶH6d 6:bɆFGhFGlو:9Ndw'NF'!cNp/F'lِ1NF'NF'!c}NF'Nvl{_4ozq],c]-c,c-c=,c=-c,c-c},c}-c,c-c,cYZY[ƾ `ck26ޗT9.Y ]vV׸θu'cQl?gY]:יjΰoqqL5NΰuV׸xB6ɴ7$E]`Em хlo.j].dC_8uQmt!2@]6`]FHI1+웻mt6  mtUmt%2ߛ fmt6 B]6bFȜk%DF7nF7!cpݠnjݰndCu6aȆTݠnjݰdALFwhFwl;ِ1D jݱdCϺwϺwWmt'2讶A6[UgOCmPm 2=`衶A6d nCmуl|NmPm$z30)詶I6d n'Sm'ѓl|N 甞j=dCϞ6zm6z){&F/Q7zKmыlF/hF/lِ1x/ 6zaȆm6zm6z+~[ mVm&27|Fol7ِ1x FoFo!cFoFk&FaGmчlFhFlِ1WGmчlmQm%.iq+' '諶K6d n/Wm/їl|N 甾j}dCu/Wm/яl68`觶G6d oF?~F?!cp~j~dC6A6aɆ{OSE ۳X6cɆFX7m6 mWm'2_6m6[tfb kp ;@mc1ln uclcِ1!c11lvQsN1~G6lِ1sߩm|m|G6d NSSl| w@1 */&@Q7º1Pmc 1l|N甁jdC1H6d ^7B6bFĤLAc;m 6 m Rm "2`1D6d o 6m 6jv,`X7m 6 a1Xmc01l`hc`lc0ِ1x m Vm|O6.>8=Ę.pN1ۘN6d ^7ú1]mc:1lthctlc:ِ1xݘmLWۘmD6 ۱&ONȆG~R lnOj?a? )?9'Ȇm1lxhc3`ݘ1ۘA6d ^7f1Cmc1lQ?Ckc1l|NmPۘmL6&gg/j~_g15! MVln j?c? )?9gɆj?c3FJ3&LN )36fb3Ɇa'haij3dC6fB36fb3ɆLhcL !_ٺdW'ٺ_`E-sqWvg~5_=>]|dzu_w7b橝g~=׃YtmNh?Л%,Xf,\fݗ1D >Yjp=Ed 5 1 ׃Y$BY,YƯdekb* +|'Яjb W__Ɇ_\ƯƯdC6~6~UۘM6}Y31[ԍٰnVۘm&2?[71ۘM6d O}>[mc61llhcllchm^L9bm:Mm6 ?blcِ12)s6`sȆs9jsƙF_ToodC0etppxbhmmF6d n7h7߰Ȇmm1lTĘ+g g1ۘK6d o̅\\!cιps\lc.ِ1\(;Lṅuc|lc>ِ1x16cɆṁ6m6 i͇6m6g*X X7m,6 o, 6` Ȇ) :elcِ1B]ʷ E/ 6b ɆXXH6d o,TXm,$2l,TXm,";-jlb,uc6aȆm,6m,6 S|]XD6d XXL6R0ycaXXL6d ~`1<[Xmc1ln,ucblc1ِ1b1d?KD/K6`KȆm,6m,6 K`/Dmc l|XXJ6X*l,6m,6 )KᜲTmc)ln,ucRlc)ِ1قRdcH9OT71~]mwlw!cpCmmN6d Oi~w߱Ɇ~6~WXF6]˦)_X&l,6m,6 Xm,SXm,#2S9e2lcِ1x X XN6Ryc5+dö_XN6d o,rr!cpˡj˱dCrhcrlc٠[31Vu NYXA6d ^7VBmcl|kZXA6d ncBmc070+-Xe2222elelelelelelelelelelelele/.n^>~A!aQaVRk~=ۘ.e̟JJu[kJq2_ kJu[UdYKD߼ ͫ6VaȆ\\ XE6d ncJmcl|[mRXmA6jrbQ\sF;|KmmA6d ~x??Ȇmmِ1h?dc߶Q3 EX jj!c9e5SVm6V X mVXm&2SVC6VckF)Nr~cn֐ov,*ZXC6d ZTk6`kȆTkjlc ِ1xXmQXm%/!VԍnUXm%2XXK6d UXm%2XnqOsXcKwvDt溮L3S-OsqWvg}j{|xg;o.cz;/{'/=kl:ޗu/w|:Xv׃u@鬃"֩E`1w:렍uj밍dHE2f\O6l?ұ^mc=l|Xj뱍dC}zGWXm'2+C6cv516} p~lcِ1x !cؠ@6d ncAmcl$9~aɆG6ml66 mlT؈ml$217sFlc#ِ1بD6$c&lcِ1M&M&!c~3F^(Z_166aȆ&hc&lc3xR`A?ocE7^tflc3ِ1ff!cxO)66cɆu mlV،ml!wht"X7ml6 [`/Emc l@-j[-dC[-j#w\M {ѭjC6B[Ɇml6ml6 d%&6acMmcln F6lM6m6!cp۠mj۰mdC6hc6lc;XUgOlR8.pNٮN6d ^7ú]mc;l|c;خN6d >l6ml6v/&acCmclwޡA6d ދ!cp;j;dI=ޘ;NN!cuNN٩I6d oT؉m$2fg'Smc'(3R/q~/x~/Ȇ`"?ؿ66"2_ja Amm"׾cb.؋R؅m"2k|k.lcِ1x.].!c إ M6r;~Yꩉ[ mV؍m&2Ew^tnlc7ِ1nn!c~c7[mc7l,jafhc7~clcِ1x{6`{Ȇ=pN٣C6d ncGmcl~w[(cثK6d ^7ºWmc/l| am6 ){j{}dc&>1s>}>!cggm6 ׍}nS؇m#2EA6aƇ܎/M⻶jdC6C6cɆدO6d ~1NĜr)6`ȆpN9q8@6d >s!c~q@mqls!C!!c93܏o(ZCdC!h!l0ٸ5w?qXԍðnV8m&2q8q8L6d Ӌvtp]ޚECk0ql= mV8m!-Kِ.8"X7m6 8mQ8m!2S9lِ1##v1G͙O3IGa8q.\w&(:vp\ŏ}8ܷ7;gƽțrFm qlnul ِ1r)g6`gȆm6Ψm6Κ&}n31Ίt]ڳjgfV06::c8l^{Vm,q׊nuYlٹ1r8q'(..W6Ɇ)p⯶m  X76 !cpІچ?qlLz7~9lِ1s9s9!cp砍sj簍sdCA6adw#G516L S*FF@6d {0@m# 2Sm ׍h#@m#8O6?Lb<8q8O6d ދyy!c5y=q8O6d ދ6Ϋm6Ɇcr#ً@a{RF H6d ^7aT6ɆmBjF ِ1@h#Pm#۸@6޴vqA`qAmql{ { j dCs8\P۸m\ 2qڸq"uzM 19%Hm#"2AnmaAdC6 l#lFm z|#Xԍ`X76`!cuJ0\mcdC6``l#lF0m򁕿 cb!FFB6d n#Q6BȆom`!dC6Bl#llskY&F jF(ِ1 PPl#l|#ombdC6BPPl">a~Mn\uEl"ِ1xݸEE!c9"S.m\6. ۸m\T۸m\"/M31. KjKdCu6.aȆUx %lِ1ٺK%KeAO61.92S.m\6. ۸ m\V۸m\&24jdCj+dc ǻVM+,xl ِ1++!c9 Sm\6 ۸m\Q۸m\%)Fz+qUԍn\U۸m\%27~Ul*ِ1UU!c~*qUm݆5F sٺk˸q.\ŏu;vp\<[w R57b5=Aۛ[2  փ0 Aaja׃0X"p=#2+ 00l:$vV&u+uu!cI:c8lahHڸm\'2Ӻuu!cpסjױdޣ;S 61n7j7dC= cP۸m 2Ӻnm6n 7j7pvj+F8m 66±p!cFF8N6d ~&)W6n]]!c.m6 Fwjw{d`iۙĻwS۸m#2=lِ1x|6aȆ{jdcEƠ˭LojdCu>6cɆ}X7m6 ۸mW۸mDlbD8mdcS197ɳjFِ1x݈u#Bm#ۈ 2jFِ1xmDmD`,Dx!c32jdCu6`Ȇhl#lЯ611"E݈u#Rm#ۈ$2S"mD ۈ6"6"H!cpFF$E6V/@#J秢6(!cFFE6d n# ڈRۈ6Ȇ(h#Jm# xH6^߸:aH]!HUuGd㰋cVgm<6 aPm!lChCl!ِ1L dClpPX-x7m<6 ׍Gn%#^E%1$/j/Xyb"[ĪmbdC=f,1c6bX!c>"jF,ِ1x mĪmb#ib߽+W+!c>#^m6^ ? >Jml|mRxm&4x-zװ|xM6d ^7^úZm5l@]kk!c95Zm5G6=4tnf#N؈66Ⰽ8!cpqFFG6d >9%Nm#ۈ#2S⠍88l xiQ &1s7!cpo7jo7dCs8Qxm!2o7jod51ފu[NyxK6d n-Vm-l[h[l-ِ1xxۈ'>kbċ9%)jF<ِ1x/{xxl#lF<mē ۈ66ⱍ!n&Fm$m$` dC6l#l@hF@6d ~h#Am#H$G:~[H߯&W6D!c9%)jF"ِ1W"JTH6ɆDh#Qm#xG6d0x';X7ީm6ޑ s}ϹSxm#2xxG6d NymSxm$w11$h#Im# H"2m$m$aIdCF76$!c~# HRH6ޓ*_ix/ְ{l=ِ1x6cɆ7jﱍdC6C6c_CvgH41>֍jdCo|Pm| 24P/Aml~l|P`y?|#ɼ1X ˘e2nyZRZƼ,cޖT1˘e222222222222222e,痬贌aޘ?d޼%F5N$:bո9u Xy{'yNָd^1PSǀ_rL޼7JzjɱdC}sro7'WHm$'2{(Frl#9ِ1k*g d#FrlÅld.† ᢶm  X7\6\ !c7Zom`.dC6\  l#Z OM);7Sm6R HmPHm 24МBm#loNmPHm+{mb~j؆+ِ1EW WlÕl|Nqsچ+J6d oBj؆p@Z(Mp66ܰ 7!c7o㦶m p66ܰ 7!cmmad#m͟muF϶mcdC0h;g c j؆;ِ1 wh]mp'2ak6ue<.chmcdcЅ顷nxᡶmx P6<Ȇ{Q؋zmx`dC062;c8lV҃e lÓl<[4nMSS<:Sm$2168~pbhmxbdC:멶mx y~)jFJщ51R9%%SRm6R )aRm#%l|SRm6R y^a#ǜf[]Hi8E6sK-.\ܕ]l9K\ŏ}<[ラ{ᄍ7OVyqT oMkrܷ0]7}Fo7j޸xްVDxz୶m"lb3F3RHm"21S3F*l#ِ1TF*TF*!c>"6Ra>dڨ6>N((nOAEOGm!2mm`>dC6|  lÇl|/Q6| M _o̪7zfWm%2S|⫶m 6|6| _!cpІچ/G6\|iO ?X76 ?!c놟چG6d 6 ?!cp~ІچlŞVjZm#5lFjh#Fjl#5ِ1FjFj!c^45ESm6Ґ ?FS?;# 1 $bDB$bDԬQTQjUڳMmjQjoj*_?{]~n\jٱdCsJv8dWȎmd'2߷W6cɆA6tƠdkQ F7Cbbu#96r`9ȆFX7rm6r 9`Cm#ln9cZ9d#WM⽌𽌜j9dCssTȉm$29g&>sNFN!c 瓁dd FNl#M\9I.Km#lnu#F.l#ِ1x 6raȆaFsgG16raN{ޭ61rp+Fnl#7ِ1;;;;6rcɆܰȭM6d a;sF.Q FeֻVyDFl#ِ1x6aȆ):%F>l#ِ19|jdn_NcbsJ~8Wȏm'2_kjdCp_m#?lF~؆؟.dZY&nnmandCsS6ܰ 7!c~ njn؆ِ1nІچQl;Nnb6 @6 `Ȇ{-Q(@6d oFF!cQ(Q(H6~|}dQ(Q(H6d4/lAa [Pm QlFAhFAl ِ1x(mT(m"~<`bR(m"2S 9F!lِ1BF!BF!!cQ(Q(L6~;{a(Q(L6d 34u@ V(m&27 ~Fal0ِ1Fav0׉0}>"b1Xq˘ee2mZJZJYJ[,c2XYX9XyXXee,2ldl Z,øS+}c_'w>3vW8w\ܩov}ƹN5N{1p/]]qs'c8wus_1ѱ<(""p+Q(B6d SQ(m!2ިFlِ1"F"FQΊZ71Q֍jEdCu(E6bEɆaFKg J+Q FQ!cpEjE6y3 ?|[W S(fa.]W6m6<Ab7S7<ɆyZmx ySm$2 mxmxbdC6< O Ol~(!%F lِ1R)%6J`%Ȇm6Jm6J (mP(mx /r'`6Ek䦨چE6d n R6ȆmxA^j^؆ِ1ެ᥶mxEjbx 놷چ7M6d >x9[m&2{Zj؆7ِ1o yCj؆8a ً1|Ȇs  lÇlچC6d ^7|`Q6|Ȇ᣶mcmNnob 놯چ/K6d ^7|aU6|Ɇ=j؆/ِ1 _hWm(I66upjbT(m$2Q(Q(I6d ^T(m$2EKB%6JbF $~jbF)RF)!cpRjRdC6JA6JaȆF)hF)l4X"Tm#%2vFF(F6wwv6°0!cpaFFF6d G>"Lm# #2aFF݆ܗܗy6,pHXXe,2cjfnհմղնձYZY-c-c ,c -c,c ƖDXe,222rK8ոi:p7qƅS1xo{pu 5.j! k\8qTd V 5.\]A6FD4uA6RxFDG):|ğFFA6d >E/Bm#ۈ 2#`mD FFiїSfYĈ}s$#6"H1x݈u#Rm#ۈ4kkF7Tۈ6"*[6"HHl p4U UDݨF*F!cQ֍*jU*dCu U6`UȆ*F*FxZW#JQ߈Rۈ6ȆFQjQFِ1(,8Jm# ۈ"2QFFM6ڮź&FӆyM6lFmDcdC6hhl#lnDúmD ۈ66qη>abĈ}1y_F C6d n#ڈQۈ6bȆoĨm`1dCςcl*htos&FUYUYUFU!c~*7mT6 #@uFUl*ِ1xݨ mTUۨmT#G|5QM`QMmQlF5hF5lِ1xݨF5jF5!cQ ڨQ ۨN6bH95Q])R]m:QlidFFul:ِ1FuFu!cpաjձXmg^4&FnĪmbdCu#֍XXl#lF,mĒ  mĪmb5F41jp陼F lِ1{M1{%56j`5ȆmԀ6jm6j ?3mPۨm$_9~<Ũ)FMX7jm6j SjuJMFM!c)5j5dC6jB56jbĨ%lԂ6jm6j üavY-ZF-!cZp𥳐F-lِ1:QKmQlL/;gm XֆkjdCFmoVۨm&2Fzְ6jcɆkC6jcuFQg?31ꈺQ֍:ju:dCsJ8Qۨm!2QڨQۨC6d nQGmG6Fuz&FmĩmaqdCu#֍88l#l|NsJFG6d >AqjqF]*­uF]QWm.QlnԅuF]l.ِ1:.\Uۨm%2ujuzdabu6aȆF=X7m6 )ROmQl|QOmO6D8Z51F<߈Wۈ6ɆF<jF<ِ1x݈u#^m#ۈ'2S⡍xxl>h17MbRSm6 ׍nWۨm'2^3Æ퍅jdC6C6m8>j` L!kEvxֈj ӱ~j w\<#{@}zАyNl57̄o q=hHw_! zА|h犆j q=hH"d c66m46kH`HmшlFFjFdC55Rhm4"2 om4Rhm$ _11; l#ln$m$ [$}l#ln$@ j Fc%O1(m46 h m4Vhm4&2S9Fcl1ِ1xhH$(M&m$bdCkDw&m$bdC6DDl#l|"HTH6Ɗ7Yv>~"̎s}fkkkgko`hd22222eeeeKX/Wޖ>~aSKS.{[_on׸Td ~>ssx>ssukk\sq2mpk\s\S1xָ-F?L1Z}pF lِ1\SPhm 2Fzp[m6Z Ŵ6Zm6ZgiRF-aoRm%ђlOSg |s(FKl%ِ1FKFK!cg?-j-VdzטVF+VF+!c炭sVjVdCsJ+8Rhm"2[A6Zav_ib|*۟jb #۟m|m|J6d )܋TmSlS!cvƧjbFRdsL֢nuFkl5ِ1҈{jdCֵoVhm&2E[C6ZcmƯfh#l6ڨm6ڐ m`/Fm цlnuFl ِ1hlWsX|)m|m|F6d o4vp8xSDbhm|m|F6d o|6>6>#2Am|m%8Nkbu-m6bmɆF[X7ڪm6ڒ ׍nUhm%2mjmvd#hfDhF;vF;!cwMwMکm6ڑ hmShm#2vjdcU\_N71ڋuJ{NihO6d ^7ú^m=ўlF{hF{l=ِ10jdAmSLκafd֙wPmt 2`蠶@6d nAmсlnt6:mt6:#V^;(FGX7:mt6: mtTmt$2f>3H6d g訶D6\]&F'qm'xm'NF'!c : :mt6: mtRmt"2E;A6:m8>|[#js؁~]xjv}{>;0Ouûns\:=Olrܣ ι Lw'.>Ϡw3}jq=Ld ^:C":zЙDZghFgl :&Fo[tQmt!2袶B6d | |Em хlmtQmt%']P&+&FWl+ِ1x]6b]ɆFWX7mt6  mtUmt#!|MiuE7nF7!c ֍njݰndC6A6aȆ{nF7ndR/_9 8|ِ1x֍/66 2Ssj_`_ ׍//66&[.FwX7mt6 ׍ntWmt'2Fz7;ٰM鮶N6d n;]m;уlжh^&Fq&Px&PF!cwvzwvzm6z #@sJF!cuJhFl'٨ cL&FOa'Sm'ѓlnuFOl'ِ1^xOSm'ѓlFOhFOlK;ry]M/Ŝ%STlhq۹{}CkKlK!cp_B_m|m|I6d ދ~ m|%ыlTߖ21z^E{m6z ׍^nRm"2 襶 E6d KmXʸ&WWWj_a_ ԍf^=Z_a_ _~+Ȇ{ѯ66z _ 251z97Szm6z a{5loFo!cw{w{m6z )j>dq/}Ĝ)}6`}Ȇa攦ׯ9(Flِ1xF>F!c裶K6=ַWԍnUm%2}a諶K6dO}Um%2}j}~dc܃a囚776aȆal$;c8l^G6d nOmяlF?hF?l?٠MnuFl?ِ1;;;;6cɆ):Fl?ِ1诶@6y:η21jdCkp ;@mc1lhclcِ1xm P`c;χh9celelekP07ᖱQіo-cc,cYZYƾ``hdlbjfnaie9f ոz%뛿Nk*y:jmt 5n 8׸ T׸ 'c5@qqH5N5n q5n .W$ۃz{ lcِ1A A !com 6 FAjdi'k6cɆۃz{`lc0ِ1776cɆ`hc`lc٠7lcM!o!jC!dCk!pM5Dmc1l|w1B6d nc1Dmc58SQ&νy5ٰdCukX7Vl|N)_m|m|M6d \khkdq滛CE1C6bCɆϕ ϕ1J6d ދPP!c~c(1Tmc(1lx&l 6m 6 `/:Lmc1l|w1 F6d ^7A6m8>|[7P~[ 2Q.\<5o뾁Q;\<ݿw뾡rZz}tq~3{L΋{p|;.!!q=Nw_`8t0\`8Ɂa-1"̼:HbhE `81{ájñd7Lhclcِ1x9#6F`#ȆA6tpp>fw(lcِ1c1Bmc1l̻-&HG}HH!cp#j#dC6FB#6Fb#Ɇm6Fm6F}[471F QjQdC6FA6FaȆv^\4G16FaȆ{Q(Qh15u,LbOk46Gm6F MGõhh!ci3FHe?>1M6d 6 mVm|K62Qcb|+oaƷƷdCo66%2 bhm|m|K6d n[h[o1dcH3zcD1!c9e Sƨm6Ɛ ìSœ16+?1C6d o6ƨm6##wwdCu;X7SlFeg(wwdC66SK6sIacE^tXlc,ِ1X1Vmc,1lF3Æ9Y-G16bcɆ由X8q׳LeLqnuc8lcِ1q8q8!c1֍qj㰍qdCuc1Nmc=hWL66'2Y$9c8l^}==ِ166'2=xqY:Ŝ2)6cɆxX7ƫm6Ɠ qp0o>(xlc<ِ121lĽqLahȆa)M1ҦdCAml!cc  !c51ۘ@6d >Ls !c1ژ1ۘH67TĘ(7&jdC0k&#'mL6& )2Qmc"1lDhcDlcp"LInLuc$lcِ1x1 6&aȆIpN1 ۘD6d culLRۘmL&~dKc1ژ1ۘL6d MdMdd!c1=.G16&cɆߘ mLVۘmL!tUJc1ژ1ۘB6d ^71Emc 1lߘ)jS)dC6@S6`SFw~bLSTT!c=p|Tlc*ِ1xݘ TT!cgSjSidcbQo61^tEmL6 ׍inLSۘmL#2`ݘ1 ۘF6d nc1Mmc1ldZj&t1Lstt!cpӡjӱdC6C6cɆk:1]mc:1l {|MLǹuc lcِ1  !cu N1ۘA6d 5ژ1ۘI6h1SԍnTۘm$2 fm6f ō36fb3Ɇ7fB36fbFu_zhbg#ςg#Rۘm"21 ژ1 ۘE6d >̂s,Y,!c~c1Kmc:"3rǏ9yEŖ%e喱,c+,c+-c,c-ck,ck-c,c-c,c?[6Z6Y6[ƶXƶZƶYƶ4k.|ۺp֛l\<geyqg\<n6~fl{3.mlXfkl7m6 ۘmWۘm'27ژ1X@66م3&Q7@mclhclcِ1Dz@mcl|NYm,PXm,$eN8eb,t0?ಐl~eBlc!ِ1) 6b ɆBX7m,6 SB 6bƢG*>ab,uc6aȆ^^XD6d ދ."E"!c~cHmcl,QcX.kjdC,,VXm,&2S9eblc1ِ1XXB6&cȎ&ac Dmc lX%jK%dCuc K6`KȆm,6m,6tT{{Tmc)ln4upذTmc)ln,ucRlc)ِ1XXF6Y`nc X XF6d ދ.2e2!cpˠej˰edC6A6aƻ*CLrhcrlc9ِ1x6cɆm,6m,6 o,6m,6~"=N>7~Oj?a? ?~'Ȇmmِ1{?A?mm X! X7Vm6V XmPXm 2EW^t lcِ1 hc lc%hzB &JJJJ!cpcJlc%ِ1JJ!cp+j+UdҺ_cbs*8RXm"2`X XE6d >s*U*!c5*hc*lc5٨OσMb_t5]XM6d nc5Zmc5ljhcjlc5ِ1x/XXC6?<+rFԍ5nQXm!2_îk5jk5dC֭֭QXm!2XXK6_q-61 kjkdC6Bk6bkɆ֪m6֒ )kjkudcs &NXmSXm#2XXG6d >s:u:!cp렍uj밍dU?kb6C6cɆ):ezlc=ِ1:e=\WXm'2XmWXml K;cE7^tlcِ1x !c9eS6ml66 a7@66`?o:Yo 7~Vl|3\33ِ1x/3EVl|NYmg 17I)̯^}&i#Q-b]x/}m5bFstI+Fh?|{׃MtϳWDCo#6>bo`}׃MlR;؄&r cs17El`1\ ؤ L6F|5xc#6>bflc3ِ1ff!cb3+6ml66  mlV،ml!):J;cl~awlc ِ10[Ȇ-!c֍-j[-dC}hclc+ëhcتJ6d -c3Æ1VV!c֍jCl6ml6 abl6olS؆ml#2`ئ F6d o [lS؆ml#2SA6agQ:?jbl6C6cɆخN6d >lsvv!cpۡj6羬s_'ȳagq찜ϱ2eleleleleleleeeeeeeeeeeW)io3s K˖+9:w}`isMe^2A5C ;5nq;fk⌑?G15nq;5n5n8׸P׸xI6i}&N1NN!co'vm6v s;6vb;ɆN/dh8m ٸ~mmB6d c3FڝkMq __Ȇ/n ِ1zh_]d#fӷzD.].!cg]j]dC]pKmcl|NmR؅m&,2oɆm߭M6d4na#[mc7lnhcnlc7ِ1nQQL=bߣC6d o=!cp{=j{=dC%6m6e.Mkl\mA{DثK6d nc/Wmc/l|n/ܧ۫K6d nc/Wmc/l867v01֍}j}dC6A6aȆ{}ݧG6d ދ6m6Wvkkbwd~c~lc?ِ1~~!cpjdC6C6cFN^〨`8q8@6d nq@mql8jdCjdc&A=װ6bɆY=G;q8H6d n qPm qlAhAlH95̦&!Q7qHmql!h!lِ1r)6aȆm6m66J21 jdCffV8m&2q8q8L6d n0qXm0ql<![qDppDmql|_=q8B6d =װG6`GȆ@G6`GɆ㥆M8 jGdCQ؋U8m%2Ga8q8J6d n(qTm(ql\s< kb6A6aȆ1X7m6 ׍cnS8m#2SA6aFjbsq8W8m'2a8q8N6d c##Z8m'2=mW8m ǣ>~kbu'6N`'Ȇ{>{>q8A6d >s  !cp'j'6y4mIX-NE0O?|[wֈj'{}z?'w\<#oN{~R}Oz+ V,UMk_wW\~/c1л@{Z=_"~W!c>WhW_Sd#0$㔘+N)lِ1)oqJmql<{SjSdCS)SiA/ii!cwNwNm6N LrZm4ql8 mV8mF6<>M)97߰Ȇ7߰Ȇmmِ1o1;.㌨g`8q8C6d oa3jg3dCoQ8m!2S@g6`gFѱR31Ίq֍jgdCu,g6bgɆYX7Ϊm6Β q8q8G6zyqN8mS8m#2q8q8G6d nqNmql9h9l\s%K%!c9S.m\6. ۸m\R۸m\&7*8Lˢ߸ jdCu26.cɆm\6.m\6. o\6.m\6_Uĸ"l\6m\6 qqEm ql|N+jW+dCW+jW6Üa'8j9eeeeewm]=Gǖ?-cO,cO-c,cYƞ[sjZo>؋ bkU\R1xotFW5*qWU\]5*8FWaqWwlĺ&q7rȆ5k5!cg3kjװkdC]]S۸m\#2q ڸq ۸N6v.W;W܇s}'2F>q_m>ljo\6`Ȇ`xx@6d x6`Ȇצjdɻ*ab<CC!c֍jdC}CG6m<6#"21~17m<6 Xm1lchcl1ِ1xx m<6m<65.]`b<{O^SS!c~)7m<6 jeeeX2[ƲXƲZƲYƲ[rXrZrYr[XZ\-c,c-cnB.}>_J) q)\PSu :K{.7Sǀ5.K.hSǀ5.Kk?@Sǀ'd#dZYK>qA!} ِ1OO6>6>!2 ''dC6>6>QHI6%&FJ7tA}sJFJ!c( Rm6R H mTHm$2SB)6RbFIzH%l6Rm6R HmRHm"2=I HE6d n#Jm#݆#dpWۺ԰H.\<֥R;0Oݺ԰2Vo.]֥< sWKm=fxӨ~\ݗ17i\7iz9cdNuƏbhE 14F4FZ3LFZh#FZl#-ِ1\ֈjidC}DZX-Ҫm6Ғ ijitd#SL)#\SHm#2Y$;cM8F:l#ِ1tF:tF:!cp頍tj鰍dc}7O41 額j鱍dCkpm^m#=lL{j鱍dCC6cƫtobdp2}62`Ȇa4qpذ(Am#lndu#Fl#ِ1xȠH6RcbdFFodTȈmd$2aȨH6d ^72ºQm##l|mȨD6nXh#ط-2md62 M16_sQ LF&!c ֍LjLdC62A62a.dEz%f01\Ĝ lÅl=چ B6d ,= vQp6\ȆhEmL6>~xY)ᜒYm#3lndu#Ffl#3ِ1x FfFf!c^43Ym#3l};CL,Fh#Fl# ِ1WEm# lFh#Fl# ِ16 Em# l#7~#FVl#+ِ10YɆhVFV!cpYjYdC6BY6bFދkbdF6odSȆmd#2Emd6 mdSȆmd#27A6aƆ΅|ebdw)fC2;ٰmHfWȎmd'2_fkjٱdC6C6cɆFvFQ}{9Ĝ)96r`9ȆFX7rm6r ccCm#l|NmPȁm$ v_) Mj9dCu#'96rb9Ɇr½j9dC6rB96rbFElb\pKm#lF.h#F.l#ِ1F.Km#lF.h#F.l#7٘p*CۢM9F]7Vȍm&2 rm6r ׍ܰnVȍm&2ÆȭC62;Njkbh#F>l#ِ1sAKOm#lmSȇm'w$E6cɆFH chm6 a_m#?lF~h#F~lÍlr%n. 7tvچF6d 6ܰ 7!c놛چF6d ދAnjnFqޭo&FoFF!cQ֍jdChF!c~Q@m݆㘂曤o n*ZP-]xjv$kjӱ& 5 ~A7.MRAx yA\ =?Xy B(B_׃Bte4" zP|(Bjp=(D"d >W6 m6 ?[nR(,p(Q(L6d G}DaFa!cpFal0ِ1xY(QnqJqzҋ<q|"b1Xq˘ee2mZJZJYJ[,c2XYX9XyXXee,2ldl Z,羸SmyNƹ箮qƹS1.\wwus5Νj#rW8w\ܩ|s5]]WlߥEDoTFE6`EȆFlِ1WE6`EȆ@E6`EƢ5GDEE( FQFQ!cw݋w݋m6 ( mU(m%2EjEbdýPx|F1lِ1x\ 6aȆm6m6 'P (Q ޏ:u  lÃlf!Æ8 lÃlچA6d ^7<  l8:융&Fqa8Q\m8Ql(jűdC6C6cɆm6m6<ưÀM OaT6<Ɇal4uHHSm$2O'੶mx 6<6<dݩ^w=˘%:\P(m 27J~F lِ1F F !cg:%j% /ѓ01DuKm "27`᥶mx 66 /!cmxmxadAmS|L oNo olÛlچ7M6d No olÛl|V6|F%+abs|R>j>؆ِ1̜a{Gm!2mm`>dC~|  l×l\I++lBj؆/ِ1x _ _l×l| )j؆/ِ1 _hWm(I6;~!()zђ-Q(I6d n$QRm$Ql( j%dC6JB%6Jbն+hbh)؋R(m"293Iqt'CkQlnuF)lِ1RF)RFiA&Fim]im]iFi!c^4EKm6J ( mV(m&2EKC6Jc~dcώ&~nma~dCA 6 ?!cp~ІچG6d gp@66 @od6 !c~j؆?ِ1:S6 !cmmceD6e`(Q(C6d n QFm Ql-{2je2dC{_e2jeQtLnMo~#@m# 27`m ׍X76!c^4P6ʒ)>Ne01ʊ5lY-Q(K6d n,QVm,QlFYhFYl,ِ1FYF9}ߦS9F9lِ1R)6aȆ**Q(G6d nQNmQl obL*Q(Q(O6d ^7úQ^mT6mT6ӳߺĨ.FuX7mT6 )ϫQۨN6d װ6cɆFuhFul#l$s+F,jF,ِ1[XXl#lnºmĒ ۈ6b6bd65ķu5u56j`5Ȇ''QۨA6d /ZPۨm 2QڨQۨI6譆 &FMQ7jºQSm&Ql|RSjm6j ?O Tۨm$27jB56jb,VMZyJ-ِ1E}oQ_m>QlnԇuF}l>ِ1F}FʸSMn4uFlِ1) 6` ȆFX7m46 hm4Phm4$Owdb4hC؋6Thm4$2~!~FCl!ِ1xhFCFC!cFCF#KMFF#hF#lِ1x6aȆm46m46 hm4Rhm$&o8HpSMI  j Fِ1l#lFm$ H66dKoMƢh jdC6C6cɆưhhL6d m m4Vhm$).0Ht0sJ"ٰVF"H6d o$~#Qm#H$2n$m$bdC<$BjF٨N{p&FX&5lFD6d Mk$$l#ln$m$ ׍$h#Im# H&;bb$o jF2ِ1[ddl#ln$úm$ FF2фl9~QvY]wP(P[! $@@$ww+R܊wbEC)oY gݿ;=z}Y׳%p)n:Mm p#27ᦶm p66ܰ 7!cvȆچN6yjb{~j؆;ِ1 w wlÝl܆;᮶m }Cj؆(6M [Cm 2j؆ِ1 hCm 2_S<  a0~.xxZj]-5/KR|-nRzXj=-^ZoKR YjZR`[j!@Km6R ,!PaPsPcouq]7|u= 8?#>#Eׅzk..d u=u'ڨ_M O17{¹Sm$2=쩶mx pT6<ɆmxBjFW1F>&FWݺw뺪mt6 _b8ldTlſJ6d n+Um+ѕl|/+Um+E6;%>چE6d 7`R6ȆmxA^j^؆ِ1x66 o1$wnd#AW51ƎD/چ7M6d p6 o!c}j؆7ِ1 oh[m!\7|6| !cmxm  7|6| !cmhGm%څtpWm%2 mmbdC):Wm%2Іچ/эlz~o<:?xtϖ~]tWt/c~:v@sDw8GtWAw!c;]m;O6JV}F[_66 !c9j؆?ِ1?j؆?ِ1mmc=>]hb=EF!cp=j=dCsD8GPm 2=j=dj#\[=E FOFO!cp=j=dCkJOTm$2/'Sm'ыllɁ&F/aKmыlF/hF/lِ1^F/^F/!c 襶 M6W=:[)[m7ћl| gjdC06j8c8l_R|Ck7ћl| mVm!ΗVG>oQm!2裶C6d >h>F!cp}>j}d#{ 61{j}dC6B}6b}ɆהpM髶K6d 6m6FLAW01Sl#lFm 66!ch#@m#G6ӷL~b~j~dC6A6aȆ~p觶G6d 7A6ad#ѮܕL@Ln |&7Pm#$2mmbdC}#@@l#loBjFx{}# l#l x_FFD6d n#R6Ȇ7 l?pBY诶O6d oWm'2_S5Fl?ِ1诶@6^Qic11@6d k!cpjdCkhcl#lom:Q #Xo``l#lF0m )pM V6ɆF0m11BFQ6BȆהm`!dC6Bl#l}!FF1l4[@@!cgrgrm 6 ca @@!cYt 1Pmc 1l3ob  8o Rm "2_S5e lcِ1x A !cpAjdzɳ61; 0`qL``!c1jdC࿧ Vm &2=e01Xmc0J6}#PPl#lo¾m P7B6BP!cY4U6FIǝYM0AadeJ^g6°0!cg3ajaFِ15l S6Ȇaà00lcXp{ L!o }clcِ1x!!cYtEm 6 )C!jCd#lbGәCuPx2Tmc(1lPhcPlc(ِ12)C6bCɆm 6m {#&apK-Ra"-(K-ReXjc-qxKm6Rb-8KmoMԦXjS-itKm6ReͶXN=.[)\p Wp©DžqDžS15U8 Wp©Džqxky.n0?L-b]9 ;gA' :>g<%;gs>L}·g8 &Ij `8g8  `891x?p '2Vm WmD Gx$61"h#Bm#ۈ 2mDmD`dCJZ)Bm#ۈ 2c6"6"d#`+~ Lhclcِ1E#E#6F`#ȆFkj#dC6Fm6FJ<)l6Fm6F <FCj(qp/>71F QjQdC(8Rm"2`1 E6d >o6Fm6FZ뱉1Z)2Zmc41l;2wdFm6F d41M6d 6Fm6ƐM/? yhb]]Qm!2EYtlc ِ11Fmc 1l|MmQm%'}W1V􍱰oUm%2ca1K6d kXX!c5e,1Vmc,1l,*D8q8!cyc7Ʃm6Ƒ mSm#211O6r&x1xx!c#iƫm6Ɠ mWm'27C6cFOUc1ژ1ۘ@6d >oL !cp j dC}c1Amc1lNT"*%c1ژ1ۘH6d a]b*Dlc"ِ1DD!c1ژ1ۈ!#f[~✉#l@1j1F ِ1x߈}#Fm#ۈ!2{_1j1F ِ1h#Fm#ۈ%=}ĈɍMmĒ  uUۈ6bɆF,jF,ِ1Xh#Vm#ۈ#v&FN)qjqFِ1y3Sۈ6Ȇ7FFG6d >oAqjq$G6_Idv$lcِ1I$I$!c5e\S&mL6& }M6&mL6Ft*o8dbċy#jF<ِ1F<߈Wۈ6ɆmCjF<ِ1mīmc:obLv Ldiܷ|ndlc2ِ1xߘ dd!cpjdC}c21Ymc21lxV7{M)b| 31ۘB6d nc 1Emc 1l))jS)dC}c 1Emc 1lNcsM1N%/)TT!cpSjSdCNNUۘmL%2ilLUۘmL#>8u1M1Mmc1l|cߘ1 ۘF6d ~ ; ^NSۘmL#2:٘1nptLڻ73ISOWna|y&i:'cp>g<%;xZG|O`oIj7C31C}g~0ξ f`91x?  23j3dci#~]gb6fB36fb3Ɇm̄6fm6f ۘ mTۘm$2٘1ۘE6.l1K1Kmc1l|Ɯ׏YjYdC6fA6faȆImRۘm&S&:obv[Ʈ 7)mVۘm&2Ӛ fm6f _̆6fcɆ6ib 6fcsFRKs99!cNNm6 9oQۘm!21ژ1nޗ" x\9Yj-BKmR[b-ԖYj-JKmR[cYj-- FKmRRbmԶYj-NKm/sEngBi¹y=n.8Fsl4W7z׿pqsqK=N0=.3ǍTwk7>a 1O1_mc>1l|hc|lc>ِ1xߘ||!c1jdj%N71 j dC6@ 6` Ȇ/Z/ZX@6d c#3Fל.KyQSXm,$Uo7X(ޥKsBlc!ِ1>BOPmc!l|MYהj dCkB,TXm,"W/8)`b,}c6aȆab:9c8ln\XD6d ,k"E"!c8m,66A|hb,)ubb!c}pnblc1ِ1xX bb!cyc17m,6/01K%jK%dCH"b$16`KȆm,6m,6 %o,QXm,%uWu0X*֔pMYXJ6d >o,RR!cpKjKdC .6m,6 BZL̢,LmclFgg s6/QZ˰edC6A6aȆ2hc2lc9(wou&r7þ\mc9l|Xj˱dC6C6cɆm,6m,6Vh<+XF1V s/ Bmclo;c8l>Bmcl^δj+dC -16?*pa_Xm$c+aXXI6d }TXm$2Z Vm6V ljqcU *1miFUdcG"y*U*!co"b_Xm"2_SV5e*lcِ1LpspذRJmclS\Lv5]XM6d >ojj!cpjdC06ܝ1[SCkc5lDraXF<>Fmc l>5>5jk5dCk5!cpk5jkd#A̐Ukųkk6bkɆ獵pXXK6d 7¾Vmc-lFKg _Xm#NXmSXm#2XXG6d ncNmcl:hc:lc=xvx_UMzhczlc=ِ16cɆm6֫m6֓ oWXoxgl]y~W?ElaٺaYgsd_3(~Vg<%;x~g9 tί'J1:A lP l/cbtA`ȁ6= jp?@"d  FnΊU=Lt#6ݨH6d nc#Qmc#l|׊jdComlT؈ml"Ǫ8$;7Uc&lcِ1M&M&!c MjMdCmlR؄ml&/>դY)ᚲYmc3lfhcflc3ِ1f8elV،ml&2جllE)5__Ȇmm ِ1]ap3$_l|Emlc (b?[D-!c{v{vml6 )[Emc lol6ml6 =Z[ż[ɆV7ml6 )[ᚲUmc+lVhcVlc(dpDf&6acMmcl6hc6lcِ1u6xMmcl:eMmcl̸{ɃF&vlkvv!cpۡj۱dCelelW؎ml'2ۡj۱d#C#;,΢;6v`;Ȇ__ݡA6d 7vCmcl|mP؁m$z=T) ީI6d 7v¾Smc'l| 獝j;dC6vB;6vbFI2dib}c6vaȆCCۥ E6d 7vKmcl|mRex?Eatoqc={,>KWKmvR;h[jG,o1KvR;iN[jg,9KvRh].[jW,5Kv~vXZXUisn6Gt~V y{nuۍ{nq2vh=n78{1=n7q| {nuۍ׿=dū&#+{9){ȆQ؃m!2hlcِ15xMGmclhclc/yZilnܫK6d l^l^^!ch/m6 _o6m651}p/f>lcِ1>Omcl>hc>lcِ1}>}ƯdM_32gd~Ulf0cϯdTȯjb yW__Ɇ~6~UO6N_/~7m6 oW؏m'2aدO6d 7C6cF! 51]Hwy@mqlhlِ1!c@6`99\+db  T8m$2ߧ;m6 8mT8m$2jCdqS&!aqHmql=q8D6d nqHmql!h!l0X!qX8 mV8m&2a8q8L6d aaa!cpj#d0k8"l6m6 #oQ8m!2G`8q8B6d av#Q1+{GQQ!cY(Em6 _װG6bGɆQhQ C^gjg~"~S.心looj'cϫ9 vg77Or79K1q1x1?1:2ppKީ_:81r cqL-HA6aɆEZqvjDZdCkq#m6 8mW8m'2 8q\m8ql8n]8! 7Nm6N Ϙ'yBmql'wOm6N 8mP8m$/8)l6Nm6N oT8m$2'a8q8I6d 6Nm6N z8%l6Nm6N 8mR8m"2`8q 8E6d ~q 8q 8M6nwȺT㴘7Nyil4ِ1iuZm4qlo}il4ِ1r8q8C6:rys㌰q8q8C6d$"FRCk ql| ܷ8q8C6d n qFm qlw&YYYY!c5,\SΪm6Β oU8m%2_SBg6bFҟzcb}6aȆa3FrS8m#2q8q8G6d 7A6aƞ#ozib6C6cɆ??q8O6d nqiìF=˚]L*q ۸E6d ݂-[-!c\nm6n F[jds/~31nqjdC6nC6ncɆojdC6nC6ncwƙw2>lbq]OeI9Olِ1;;!cpw;jw;dCw;jwdczob}.w6bwɆm܅6m6 ޅ{w6bwɆ mU۸kxwl]󄙻ٺIsֿEna}ww_gw7Ous=:Ubmл'==ٗ1=xqOȁ׊{pq{$Bs=h=l>X_Mbo>ܛq۸O6d V܇=}l>ِ1ZqvjdCצjdtbb<}6`Ȇ7m<6 xmµI&K1KK!cpKl%ِ1/6^b/ɆKhKl؟om?㕘7^y+lِ1̼#ig@^m6^ s|+W+!cpWjd?x-| |xM6d ~^Vxm&2_S^5kl5ِ1kV&1o7!cø;c8l>WFm lhl ِ177[s-.x+捷pxxK6d ~^Uxm%2z ުm6ޒ ȴ@6ުm6ޑU6ab6A6aȆ/~_;lِ1w;w;!cxxO6rV(0XS5{l=ِ16cɆהpMyxO6d {{h{l٠;LbgjdC0װnϪPm| 2a?m|6> m|Pm|$) db|}#6>bɆ獏pH6d ~/Gx/GG!cg >B6>ba.' 61_pKm/l/!c5/ِ17R l66>s&D'O'!cpOjOdC'8o|Rm|"2Oj6mI]k晤a[-osp噤nV;<gH<8(Vg<%;󚩜Go9t\Zs/CX+>óY}?~ξpv@kgV|Vg!c3Ym݆/kzM/0wq$ps$Yj-5K-RKf%RXj)-TZjKRKcYj- ZFK-RbeԲYj-ZNK-Rcu8Me@p?Fg_ tM ȁa֊HD6ld#2?e6h#F6l#;Hių}}6cɆpȮN6d Vtpxꪗ9N6d Vd6md6rN9DFF!cp9j9dC06Z;c7G*Fl#ِ1ȡI6>q)l6rm6r )9ᚒSm#'lfMtpx9Qbhm6r  mTȉm"㲹Kcb6rA6raȆΥ E6d qac2SZ\dC6rA6ra2ۊMebsW"6rcɆFn7rm6r ì)1U Fn!cpj恳hq8^l:}>uˇ{\>q2;;c8z||d ~Y>xY>uˇ{\>q2q`˧qlWOg)F~ldYO6l/ͯO6d >7ss~F~!cpjdCtjdS( pn.Q(@6d 3;c8l,Q(@6d nQ@mQlFhFl zy'&FAbFAtϲfʓRPm Qlo}FAl ِ1\6 bɆ B6 bF`KLBb(BjBdCT5U!BF!!c m6 (mR(m&2wQXt6 cɆFa7 m6 °oV(m&2WaahFal'&7o}ߨm|m|C6d nhooȆU |W7j`ߐ _|m| QlLmylG&F1h"F!cpE"jE"dCh8Q(m!2_S@E6`EF$obFQ8oU(m%27yFQl(ِ1R)E6bEɆm6m6葎Lb7b7bjŰbdC}6aȆm6m6 _6m676,Z΢6cɆaqڱwW16cɆ))Q(N6d 7C6c%F)k&F kJ F !cJJm6J (mP(m 2%j%di'&QR)%RRm$QlFIhFIl$ِ1uJIxRRm$Ql$QRm$Ql9)QJ(mR(m"27JyF)lِ1uJ)xRJmQlQJmQl\g11J54\SJm6J ( mV(m&2Q(Q(M6d >o6Jm6ʐ_QF(mQ(m!2-a˨m6ʐ (mQ(m!2Q(Qn׷ٺZ!/} Wo"0walݷG|v݁9x2v/߭og[7O|W*9V}ο,z<y++AYʪ~Yٗ1ZQ:(vP@eEY%2( mU(m#ۓdTQN̘`g(Q(G6d VkE9rF9!cp堍rj對rdC]6ʩm6#o^;7};ﰍȆ3|wjaߑ ;ﰍȆwFyF21ʋowE(Q(O6d oQ[W(m'2/l&FTkJ*F!cY EmT6 ۨmTQۨmT!2mTQۨmT%GngQU􍪰oTUۨmT%2*|FUl*ِ1uJUxRUm*QloT6mT6 =C-21jp﫚F5lِ1F5QMmQlF5hF5lِ1,Z ڨQ ۨN6nL3&FuTkJuFu!c#imT6 )R]m:QloT6mT6j &F 7jQCmQl|ިj5dC{5y F !cp5j5dw01j 5j5dC@ׄ@Tۨm$25aߨQۨI6d n&QSm0_SږZKVRo5Zj,ƖZKRknZZj,,-֖ZKRkou:Zj,,ΖnyXSz\^TKwYKjWzpk=ZW Zd Ղ_-u{\-q2q=^j zcpQ[͵\[m6QlfaijdC_mVۨm&26Q[m6QlT7ׅ6m6ꑍIcb6A6aȆzpިQۨG6d ~R=xR=zF=!cQڨQۨO675eb6C6cɆהpMQۨO6d >ևh}F}!cpjdjab4k7k7Phm4 2hh@6d >o4FF!c5@mѐlxgP̢ ,Pm!ѐl|Miהj dC6B 6b Ɇm46m46! bb4kJ#4Rhm4"2hhD6d nHmшlwFF#Fv5+Icv.֗gC'΃X}Ͼ9xJv5缱7 ?׶1=k"A~ٗ1x?h4Q;hAr c 1E4 1hhJ6:h*戦phhJ6d >c63fSFS!c)M6bMɆ׊FSF3qa&F3qY3xY3fF3!c fjͰfdC}6aȆgfF3fFs1Lo4}#9\m9ќlo4}Chm4'2\ؐ16cɆהFsF q9.طh!MBmтl|/ 16Z`-ȆהbM16Z`-Ȇm6Zm6ZFrWfb6ZB-6Zb-ɆFK7Zm6Z h mThm$2_SZB-6Zb~eb6ZA6ZaȆwJ|Rhm"2 h hE6d 7ZA6Za?Jz/bb7 ?/7?6~6~ 2Eِ1?We Ȇmm#X3'Qo(7Əj?b? # k_? [QmGlG!cWZ?b? )?B?mm&E&_id<"FkFk!cY5E[m6Z )Zm5њlFkhFkl ٘slsL6 mhC6d 7Fm цlFhFl ِ1WhFl-B{p&F[,[,?hhK6d 7¾Vm-іl|-hhK6d >o6ڪm6ڑIgih'F;7کm6ڑ # [ڑ NmюlF;hF;lِ1hhO6+M:=NihO6d oWhm'2&x&Whm'2jd#fM:N頶@6d ;c8l8~mYZdCF8otPmt 2蠶H6^_0,QmtTmt$27:mt6: mtTmt$2_S:B6:bȆ%NF'NF'!c16J |Dѯbhmt6: )ImщlF'hF'l'q7Sÿ41~6~6~R loOj?a? ER lOOj?aQYot6:mt6ƙ]ulbomnjn؆ِ1 7hMm p#2uװnjn؆ِ1 7hMm p'MO_pk;\S6ܱ w!cpІچ;N6d npWp6Ɇwh]m {#?R{_pCm 2mxmx`dC7<6< !cpІچ07aXiuԼ,5oKRԺYj~ZwKRazYj->Z_K-RgZjAZKmlXj-A`K-R ԆXjC-B=J&#ʘN]D{\u{\q2p{\P1^LEׅz{\㺨{\y Kb6򄳑چ'I6d ySm$2 mxmxbdC{Bjvgk6<[vj]"];߭ {DWv<[~Sy+<]+^t+{ouaCK/g /:2_+//ȁ1u᥶mxlgS01 oh[m&2 mxmxcdCJZ[m&2 mxmxc>dcbR>†᣶m >pQ6|ȆX|چC6d nQ6|Fu^|Ɇ6_ _l×l܆/᫶m )pMU6|Ɇ?| _ _l=(.M\vf7nF7!cpݠnjݰndC6A6aȆmt6mt6ۤSe61kiG7ma~dC6 ? ?lÏl|چG6d A~j~Fw{AI2ųųOFwl;ِ1OZݱdC6C6cɆ讶'j.3an'6 !cچ?O6d nW6Ɇ  lp qH*7zyFlِ1=16|Ym 2衶A6d >o6zm6zs!o=uJOxSm'ѓl|'詶I6d >hOFO!c詶E6g䑋K_ _Kmыl;2wdd ^F/!cp^j^dC6zA6zaƯJ3{k?jdCVm&2 zm6z )j>dZS1>C1y7m6 #m!2}`裶C6d 7@}6`}Ϗ7fhb6wUm%2N GWm/їlo뫶K6d 諶 %\:6l#lFm 66!c5%P621~=6aȆSwSm#2OmяlF?hF?l#l[w@n@@l#l| T6ɆF jF ِ1@h#Pm#"቉$֔ maAdC}# l#lFm ϢAFFџlx?ϏLo}Fl?ِ1xFF!cwt꯶O6d 7C6cȆR=!c1jdCװ;m 6 _ 6m 6{ǝwM`1Y4Xm#&2N )jF0ِ1 ה``l#lF0mǣO_ib!FFB6d n#Q6BȆF!j!Fِ1h#Dm#H6x3嚉1P)2Pmc 1l@hc@lc ِ1x@@!cYt 1Pmc 1lxн& q2^ Rm "211D6d 71Hmc1l|m Rdx8f{_/$ bZ`spC'cϿ<4?~S?ߕypt`B霷sC/TPBg?P:26 צjpU DBjFp|4& ajaFِ1i6 S6Ȇ^xFF6d >GAajaQc`CD!!co ߐ16`CȆ!p%1B6d c#n1J66fxacܳ3l.*PP!cLJe P!c1jCdCצCjC6}Y{_4ozq#~apK-Ra"-(K-ReXjc-qxKm6Rb-8KmoMԦXjS-itKm6ReͶXN=Yϖ0K8j Wp©|6 QDžN=N=.pu =.zp=.Ƣ4SaνY #Agu *&4m 6 _S T6aȆm 6m 6 àajðdmb sp87Wm '2hplc8ِ16$8Yp08Wbhm 6 m WmDIQ#;nbD5%)jFِ1lܓPۈ6"Ȇ"5UFA6d D@jP!c#!c$1Z#dC6F@#6F`#Ȇhclc$و}d^M&Hac$1Rmc$1l|M הj#dC{#HH!c11ۈ$;z#RpވTۈ6"ɆDH chmDbdCE{"6"H!cpFF$E6Op#JoXX!c11G6j9n5'qp1G6d ~2^Sm#2aǩm6Ƒ _6Ʃm6Ɠ_j }p1^mWm'2nƫm6Ɠ mWm'211ۘ@6\+tX1AؘmLPۘmL 2`ߘ1ۘ@6d >N !c{&@6&`ƒU51&딉:eDlc"ِ1oo6&bɆD7&mL6& ۘmLTۘmĐp?s)Օ xُWx|q?'2PDZD<$BpFF<1lycs06& 6&cɆgpƜ1ۘL6d 9wNVۘmL&2#&C6&cSݕ 6lbL38cNQۘmL!2#9blc ِ1xߘ)!c8l811)jSdÛobLu^" !TT!c1jSdC}c*S6bSɆThcTlcٸ~ c7yc4lcِ1i4i4!c1 ijӰidC0629c8ltW[5e itzrL♤jӱdCOOWۘmL'21ژ1ۘN6d c#3Fcܯ)chmL6f#/71fps lcِ1336f`3Ȇm̀6fm6f oPۘm$uNobʿcTۘm$2EgYtLlc&ِ1LL!cp3j3YdckKTMYô}c,lcِ1=³=³6faȆm̂6fm6f 1*SOG߭)chm6fWmbs͆sVۘm&2 fm6f _̆)6fcɆ}]Vۘm!:619:elcِ1̚2lcِ199!cI@s6m8sh#xg\{1l|ngjdX 7m,6 9c8lT?vžX@6d ,k!c @ 6` \X(B7m,6 .{ 6b Ɇm,6m,6 lrpب^Obhm,6-7ϚDX"E"QvU)Zܝ^][(.SE BB   =kN۵<˚5#c=pwvlc;ِ1x6cɆuv^CԍnP؁m 27v~clcِ1x!cs;j;d{jlb6vB;6vb;Ɇm6vm6v  mT؉m$2?ةp%t*W8mbdCwM\6\ W!c=\W몶m  WhUmE6:nkU%l6vm6v ׍]nR؅m"2 إ E6d ncKmcl\|Z&nac7[mc7l {jdCnn!cpj=dcأC6d ^7Gmcl|Sm6 {=j{de'W61 {j{dC6B{6b{Ɇ^X7m6 ׍^vC^[G'̼9탧$E쳋0O.yn;;0OZt^D>7O.|`?=t+k`?w?|:دv׃@s~8WW؏~!co6m6C'N^8 l6m6 8mP8m 2_jdC6@6`ndc}\{71܄ 7hMm p#2#`ᦶm npSp6Ȇ{L7hMm 8H62nV8(Y=Y=q8H6d ^7ºqPm ql|N9甃jdC6B6bƂz}bB C!C!!cg]16B Ckql!h!lِ1qHmqج?"Z8,Im6pN9q8l$"NrNm6Չahalp4= rG##!csG#jG#dC6@G6`GȆ6m6gYy8*zѣ=q8J6d ^7ºqTm(ql|N9 産jGdCu(qTm(ql :x,&1 cpw1lِ1}cjǰcdC6A6aȆm6m6ƝK hb놻چ;N6d ^7apWp6ɆmCj؆;ِ1 wh]m8N6:Ǖ=U4q\aq\m8qlnppXnVu>q8N6d n8q\m8ql|r8q8A6EF11No:q8A6d qoP8m 2=EOm6N ׍ IѸS'E8 II!cuJ/g 6ٖg16Nb'ɆIX7Nm6N 6Nm6N OlE'31N9́Sdv)lِ1;;;;6NaȆm6Nm6N aOA6NaF^'MlbprZm4ql8 jdC6NC6NcɆi؆;aY7<Ƌԃn{!چA6d N lÃl܆ᡶmx ;6<6< OA_Z}gbx)yچ'I6d nT6<ɆmxBj؆'ِ1x6<6< /_Tu / /lËl|)^j^؆ِ1~bhmxa^dCu R_c"meee2g;g󷌝X.X-c-cA`%Xe,2fl ]]]EXƮ[nXnZnYn["-cw,߇9aij揓{k78pV8o\㼩|󟷺yM5NmoX5>dcЇP k* lÇl|f죶m ?3ό}6| !cQ6ΐ$`b6@g6`gȆX7Ψm6ΐ 8mQ8m!2@g6`g8+TgYl,ِ1;jg;jg6bgɆm6Ϊm6Β 8 mU8m 61| _hWm%2nmbdC~|_ _l×l܆/᫶m#G-)~? ?lÏl܆᧶m ~S6ȆmA~j~vC^眿[Wx0gA"E'ew<`l98kSso.]\6m\6k?ĸ* 纪q۸J6d n*qUm*ql|rSm\6 WjWkdrdTLk߸kjװkdC5o\S۸m\#27~5lِ1r ڸq ۈ ͧ.r!lD@jFِ1h#Bm#ۈ 2nDmD`dC6"l:8o&uq:<[p]m:qluhul:ِ1xݸuu!c9:q]m:qlT;r~7n~ lِ1  !cq֍j7dC6n@76n`76COhbt07&ٰmHT۸m$2qڸq۸I6d ^7nºqSm&ql|N mT۸m"y[gbu6naȆ):-lِ1[-[-!c5-h-l6غn*Eo^ml6ِ1Ymm!cpjdCu6q[m6I6;&FnDmDbdCsJ$S"6"H!c~#jF$ِ1x mDmDm8q;vIxݿ$ܱ݁;0O )G߱}s≜g{~G}/n~%}{hXeeee,222g%XƞZƞY~=a{e{m2222222ݗ(])zme)QΞǼ,EUhEy-(XϢ, kQTd DlQx^&coiFqQK6f>2xqWwa?|Wm.ql|tm6 6]dw6bwɆ݅6m6WknqOԍ{nS۸m#2`ݸq۸G6d =={=!cu=h=l>^q{Y&}Q7úq_m>qljdCs}8W۸m'2_+݇6m6FLHoN%hq/yF4M6d ^7a݈Vۈ6ɆmDCjF4ِ1K4mĐ>bbĈbE1j1F ِ1x݈u#Fm#ۈ!2mĨm`1dCu#ڈQۈ6+:x@6%zIGu 6`Ȇm> mjdC6@6`Ȇm<6m<6;R7.Aml|6>`Ȇ@6d H6Pcb|u#6>bɆm|6>m|6> ׍n|Tm|$2S>B6>b6,bb|r~ȼl^ D6d >|s'O'!c ֍OjOdCuIm݆0>? 7;;_X[ƒXƒZƒYƒ[RXRZRYR[XZY\,c-c,c_Z2Z2Y2[ƲXƲZƲYƲ[rXrZrYr[Xƾua'zĻZA) ﯿOI?ğD.I׸D.c%b1`K?1ո>u 8}A6F/)y^ , , //Ȇ{/\PodCpAPl=//66"Smb$6C6cɆm$6m$6 H m$VHm$&2j$d%01I$jI$dC6@I6`IȆTI\К*Fl# ِ1^Lh#Fl#)ٸ{|믲IFRFR!c~#)7m$6 H m$UHm$%2SBI6bF\hb$h2؋&SHm$#2a{Lm#ld.djɰddCsJ2h#F2l#98eMn$u#Frl#9ِ1xHFrFr!c֍jɱdCsJrh#Frl#٨SfiMF h#F l#ِ1ٺ.l] F !c}.h.F l#ِ1xHmPHm$"21RﺧtAoTHm$2ES^4FJl#%ِ1FJFJ!cHHE6LTnu#F*l#ِ1^9m-{bhm6R }{_6RaȆF*h#F*l#5٠[%61R֍jdCvAVHm&2HHM6d ^7RC6RciW;5-)bu# i6`iȆa攞}vH^Zi4dCsJ8QHm!2.HHK6V7X4;#HHK6d oFZFZ!c֍jidC6Bi6bF˶ib6A6aȆװ6F:l#ِ1tF:tF:!c~#Nm#B6~r&mm`.dCu  lÅl|Nqsچ B6d npQp6ғ ځ{nbhzFz!cp額j鱍dChzFz!c9%=^m#=l=]`NG;62`Ȇmd62md62 )Am#lyJh#F !/]!~KtK/"œ{} |v݁x/ٺ/fyqtϿT/q=HBz]odtAQ}3z-2}jq=Hd Gd}DFd$2߷mdTȈmd"7~:$LȤ D6d 62aȆmd62md62 Ljd]QS72 ۇ3md62 ?{ gVȌmd&2ȬL6d ^72C62cYƅY\,ȢB6d ^7Em# lFh#Fl# ِ14 Em# lq)#Xd돬jYdC6BY6bYɆצY4FVl#+ِ1x mdUȊmd#'{y󚉑Mie{Z6aȆצ$F6l#ِ14\fSȆmd#2lF6lFvQ~]M. ]7@md6 mdWȎmd'2+;\fWȎmd'2߷mdWȎm j 51r֍j9dCkp Cm#lFh#Fl#ِ1xȡI6")ְ96FNl#'ِ17soTȉm$2ȩI6d n#'Sm#'lq# ȥ E6d ދ悽h.\F.!cuJ.Nɥ E6d ދ6rm6rM#XkjdCsJn8Vȍm&2ȭM6d ȭC6|GԍsJj=LbN 甼jydC6By6byɆF^X7m6 aBy6mh##fG>w<[ X Z Y [ƊXƊZƊYƊ[JXJZJYJ[XZY[*XƾUUUUUUUհմղնձ|&ո/4(k\>\Q1i884O]jk\>Xk\>\Q1xk\>uˇdc`{]6cɆp˯O6d n#?_m#?lF~h#F~lٸ}tԐ&F7}sF!c$c cjdC6 @6 `ȆTjd`bsJA8T(m$2a(Q(H6d n QPm Ql|MU(Q(D6.&($BpN)Q(D6d ~&<[HmQlq!̸F!lِ1R(Q(L6:Nq21 90S m6 VVXm0QlFahFal0ِ1x( mV(m!:6M"FhFlِ1L;Æx"F!c9Sm6 ׍"F"FQ231~(7m6 E6bEɆFQX7m6 EjEbdcwGcb6A6aȆ'('(Q (F6d _ S(m#2Q (Q (N6 |x5.jQ9cqaSqFq!cQ֍jűdC6C6cɆm6mp*aͬmz s2JE0O9[WWK;0Ok8֕F /aݺP{eVz%sJIT/c}AI$2%a=(Q׃$B돒FIF) ,2*JXF)lِ1\Q 6JaȆm6Jm6J Rjd#ш-51Jߟ*~Fil4ِ1gg6JcɆm6Jm6J ( mV(m!*6}QFԍ2nQ(m!2S9Fl ِ12F2F!cQ(Q(K6<ע8_/Q(K6d ^7ºQVm,QlFYhFYl,ِ1FYF9]#hbu6aȆF9X7ʩm6ʑ ,]S(m#2Q(Q(O6eb'Qlx$vFyFy!cp塍j屍dC6C6cɆm6ʫm6*N7Ĩ FX7*mT6* )RAmQl9IFlِ1QAm5F&uJo5(X%J_m|m|M6d ^7ukɆ| wVlNj_cFc/>O41*aWîQۨH6d QoTTۨmT$2E+^FEl"ِ1"QQm"Qlx[q&F%Q7*QImQlnTuF%lِ1R )6*aȆF%hF%l2٨j&Mʢߨ jdC6*C6*cɆ'2jdC6*C6*cUE7%abTq c Zz%QEm Ql16lTQۨmT!2S9Fl ِ1g dFl*plbbTu*U6bUɆߨQۨJ6d n*QUm*QlFngxXGڨmT#}dbTh5؋VSۨmT#2jmT6 ۨmTSۨmT#2acAbGב16aF&SaݨQۨN6d QoTWۨmT'2QڨQۨN6d n:Q]m:Ql,r|iQCWWCmQlD oPۨm 2QڨQۨA6d c#3F\r߭#chm6jSĨ)lԄ6jm6j 5aQSm&QlFMhFMl&ِ1xݨ FMF-1ڝęZLR-ZF-!ca8F-lِ1ZF-ZF-!cpZjd_ ]LFmhFml6ِ1xݨ FmFm!cpjdCp;q@kj:d08QGu`/ZGmQllAg _bhm6 ցu6`uȆFX7mԱ}߇kG=X}XXCX#XcXXSX3XsX XK7V֖6vNΖ.n^ޖԥwVC[ǩ؋ bk\]\R1Wu5.quq]̸5.85U]uzdf0Ũ'zpQۨG6d nQOmQl|zjzdC`oTOmQl4xQ_v}F}!cpjdC6cɆalvpؘ6ss~Ck݆Wɳu `h.\<l]|As߼l]jj w\<ٺnEAŵ {MS^CQzP}zАa74!91x "zАD|h犆j FdJNK#HmшlFF4Rhm4"2#>F#lِ1;$FjdZ&Fch 6cɆm46m46 ׍ưn4Vhm4&2j&dHdnb4u M6`MȆm46m46 6]F&F!cE16.9z^Ghm4%:qMŷ=o{4Uhm4%2hhJ6d ^7ºTm)єlFg %ԑ16bF'hb4JF3lِ1ڴ\6Shm4#2_6kfjͰfdC069c8l˕tgOZͰdcItLhjͱdC6C6cɆ{mhN6d c3ƿב16c-F2'61Z֍j-dCsJ 8Phm 27Z~F lِ1Ȇwg -#Y FK1oJ-řܖLnKFK!c֍j-dCsJK8Thm$2auj-oc߈ ߨm|m|C6d ^7uooȆ7n| ِ1F>+&\g166Z!'liÜkE6̖6ZaȆm6Zm6Z `JmъlnqwN)Y VFkqch-FkX7Zm6Z )Zm5њlnuFkl5ِ1yJkFm6dVkɗEۨm6ڐ hmQhm!2hhC6d n Fm іlЯ01ڊ֍jmdC6Bm6bmɆ甶pNihK6d [my[F;mhG6d nNmюl;vjdu[L}{F{l=ِ1x/6cɆװF{l=ِ1C6cFFMFIobt6:@6:`ȆpN頶@6d otFF!cpjdUҚE6:bɆFGX7:mt6: )Qm#ёlFGhFGl٠/ 21: NjNdC6:A6:aȆF'X7:mt6: ImљllYv&Fg1tsJgFg!c93S:mt6:  mtVmt&2j.d#{h&FnOnO.F!cp].j].dCsJ8tQmt!2_v6mt6Z)btu+]6b]Ɇmt6mt6 ׍ntUmt%2-FWF7Y֦mޛD 6aȆn覶 F6d nMmэlF7hF7l;٠獉]mtWmt'2讶N6d n;]m;ѝl|NmtWn8{_սͻ^LRWvI_X2wz;0O9~StWx{y\z=Д^O_Ox{~O\zݗ1x=zzГ"zE'1ڴ'Sm'ыljŧ&F/1WsE/^F/!coꥶ E6d nKmыl|m 襶 M6z~l6[?zGoFo!c֍jdC6zC6zcɆFohFo w_w_/o8}~o-cYY[ƾ MMMMMMMMͰ|ո|d8o}[uk\q2yO3^s꣮q}pC5N5q}5q}|ָ>}F* 11 }j}dCpWm/їlF_hF_l/ِ1諶G6q'~oG6d }cCe9g16aȆm6m6 ~jda&F7}sF!c֍jdCtg:6cɆFhFlc8vE7Mn uclcِ1{{6`Ȇ==1@6d wM dclc (+SHca1H6d 6bɆ甁pN1H6d > 6m 6%6rF-ƷƷdCu[X7UlƷƷjbߒ Vm[l;^l&wu9ٰNm;l;!cߩm|m|G6d n;h;ﰍȆm|m|1l,`c7~c lcِ1 #3Hmc1l{AjAdC6A6aF\{411֍jdCs`8 Vm &2v`jdC`dc{YMp{ﱍɆn|==ِ166'2^m{lc|M! C7@m 6 C`1Dmc1l!jC!dC 6m 6 U cX 딡jCdC6BC6bCɆ1J6d ^7BC6bŎ[D1 6aȆE}ajðadCs08 Sm #2?; 1 N6z.QQ1N6d nc81\mc81ln ucplc8ِ1x/:1A6 8!pN1A6dd%A6l-!cp#j#dCkHѪ_.Վ#HH!c~c$7Fm6F )#2Rmc$1l mTm"􆭛1J}{_6FaȆar.YZQdCuc6FaȆ(hc(lc4٨=Lhhchlc4ِ1h5Zmc41lnuchlc4ِ1:e41Zmc41lM1hclc ِ1=c=c6`cȆ71jc1dC6@c6`cF)z7+E}ѱjcdC딱p2Vmc,1lnucXlc,ِ121nqk!֍bZ8s^S;gw`.}n wfl8xǩ8\=ϕ.xw<ƫ`<91\11׃$B㡍j㱍 d6D1V j dC&gh6&`ȆmL6&mL6& wN6&mL6&4 KĘ(1ۘH6d o1[LTۘmL$2#&>bDlc"ِ1x1ژ1ۘD6f_{j1IԍInLRۘmL"2`ݘ1 ۘD6d nc1Imc1l$hc$lc2x;cWs9dd!c~c27&mL6& ۘ mLVۘmL&21ژ1ۘB6FQcbLuc S6`SȆ)pN1ۘB6d oL)!c))T~ &TN )S6bSɆTX7mL6 ۘ mLUۘmL%2Ӛ mLUۘmL#};+u1MԍinLSۘmL#2 §mL6 ۘmLSۘmL#2SA6aFijͻ51utN1ۘN6d >Lstt!c~c:7mL6 ׍t fɚg3Ĝ2)36f`3Ȇ)3:e lcِ1Y,  !c1ژ1n}}0ov̴|,l؏yEŖ%,cK-c,c-c+,c+-c?[VYV[XZY[6X6Z6Y6[ƶX3j+g?N3E kLukLq2fo5n&8C2C2S]f7jg7S]fQܭs?7ِ16~6~ 2}j?`? ?@?mm"f\5Ę%l̂6fm6f g,Y,!cpYjYdC{1Yjḑ^31f jdC6fC6fcɆٰo1ۘM6d >̆6fm6損|618 a{Ytlcِ1^3Gmc1lńuclcِ1z{1Gmc#SG?^̏j?b? 6~6~$2Ej?b? ׍6~6撍Ujbu djsdCHƦd6Uۘm%2Qaxbhm6 ۘ mUۘm#_db"~0Op I'su?d38O{K_㺭T<{_ /U,/c$KsjKq=XJd G,}R,%21BK6bF_X&—ej˰edCH&bo-SXm,#2 X XF6d ~nLmclXY֦&rG,}rr!c֍j˱dCW6cɆˡj˱d}X!pNYXA6d ncBmcl9 d lcِ1 JzELbb%ܷXXI6d nc%Rmc%l|?Vm6V X mTXmL6OV?údC6~6~Vlj?c? ?C?mm"k>-Y7MYE6l/ˬRXm"2 X XE6d ދ*U*!c X XM6o#ULբnucjlc5ِ1jj!cpWcjlc5ِ1j1#&]װk6`kȆm6֨m6֐ ׍5nQXm!2S@k6`kEʛkv-\îUXm%2 _ תm6֒ ׍nUXm%2XXG67LubS֩m6֑ XmSXm#2`XXG6d dNmclħ,^ԍnWXm'2XXO6d ^7ú^mc=lzhczlcOvEM { j dC66@66`Ȇml66ml66 ) jdV$2169e#S6ml66 Qmc#lFhcFlc#ِ1:e#Qmc#ltpT>csN1g666aȆ&X76ml66 mlR؄ml"2S6A66aM116~c376ml66  mlV،ml&2 E7ml66 ׍fA&-!c-pclc ِ1:e \lQ؂ml!2[-j[6ؾl|د,c,c-c;,c;-c]ݖ=}17A!aQ1˘eeeeee2i|f+ոS5?N[VU]jkVX㶪kV\R1mqJ:ޙY mۊkVq2U]Q#@1~w _6~6~!2F2lؖmmB6d 134|Z` EmlW`b*_aƯƯdC}oUmWlW!cި3F;JY __Ɇb~6~Uliܨ\Lߜtolِ1w[S lF]g ~7g16~6~#2ocb mml#Jd_&p=mj۰mdCt>6m6!c93F~Ckcl|M ئ N6?WcblwƋԃn{!nW؎ml'2vv!c 16b#vm6v [6vm6vݗt31v>b7#vm6v w6vcɆalspY n!c>b7[mc7lxϜ' #==j{=dC=cQ؃m!2acfkUZ{=dCshclc/؛ۀwL^hc^lc/ِ1^^!c2؋m%2SB{6bƆ[01~c7m6 `/Omcldû3APZ}dCucOmcl8a&~ac?_mc?lnuc~lc?ِ1:3ƿI|Ckc?ln6m6; &aq@mql={jdC0h+g 6ٖ=g16`Ȇm6m6D#~Hgb nІچF6d n pSp6Ȇ=smandC6ܠ 7 7l R&Aa qPm qlAhAl ِ1aT8m$2q8q8D6~>8$7CjCdC!oR8m"2|!lِ1C!CaQyOE8 aa!cpjdC s6cɆm6m6"ѳ761#plِ1r)G6`GȆm6m6 8mQ8m%Yfb6BG6bGɆm6m6 8 mU8m%2q8q8F6vr)}hqL8mS8m#2aZZǰcdC6A6aȆcy 8q p'/~j?]pWp6Ɇ womcdCkXwuWp6ɆCjqqLqhql8ِ1qq!cpǡjDZdCsqhqlK8B8?q8A6d nqBmql|N9j'dC6N@'6N`'ɆOͧ61N:mjN~ʂ|Il$ِ1II!cp'j'dCsIhIlp=hyT:Nm6N ?=ÞR8m"2q 8q 8E6d qJmql8obgOó6NcɆ$gNm6N 8 mV8m&2q8q KOGj؆ِ1 lÃlچA6d ox@j؆'٘Nlbx:9I6++2zmxbdCK Sm$2nxmxbdC'᩶mxa?{_^pKm "2{_^j^؆ِ1 /hKm "2?mxmxmx[c;c;kYY-c-c @EXe,2v2b Y.[-cW,cW-c,c떱[ۖH؝[W;=}ʜ_VW6o{e3O.:og慎]\[ϼ\<߿[ y۫xjvγuްvyk7|螷8ֆyk>52}`?v5r cyQ1x?mm`gF/qF?Q8m!2F2 xlضϨm6ΐ 3!cuhl,(Q}E&YQ7ºqVm,qlr,ٰ-Ϫm6Β ׍nU8m%2_+6Ϊm6|F12>gb:Ɔ/<﫶m )pNU6|ɆmBj؆/ِ1 _hWm#)'྽چG6d nS6ȆmA~j~؆ِ1mma辿\hbs98S8m#2q8q8G6d nqNmql9h9lßl<̳Q2&mmcdC> lßl]wچ?O6d N66dj煍yy!cwVwVϫm6Γ ׍nW8m'2硍j籍ᷴM~Q|(@m# 2mm`dC6l#lFm\ C\[rDݸ !c~7.m\6. ۸m\P۸m\ 2hl#ld3nºm o@@l#lFF H6d ^7@@l"XYݱgb\k؋p {Qm"qln\uEl"ِ1EE!c^"qQm"D6fi&FSm 66 !c՝1R#g16 !c h#Hm#&.9(,AsjF0ِ1x/ {``l#l,0<m ׍`h#Xm#۸D6Ą&b\%o\R۸m\"2`ݸq ۸D6d ދ^%K%!c~qImB6Zo^!Fm ׍X7B6B!c!9lFB6d n#Q6BFzřbN sJF(J6d n#U6BɆmBjF(ِ1 mmbad̲`ba9lFF6d >9%Lm# #2mmaadCu# S6. 㲨aݸq۸L6d ^7.úqYm2ql| {a/m\6. ׍eF8H伬Mp kppl#l]p{F8N6d n#W6ɆװFF8ql>2x~qEԍ+n\Q۸m\!2?#sq۸B6d n qEm qlhl*x2hw&U/z^U۸m\%27~Ul*ِ1*\^U۸m\%2SBW6bƍo{ 3155q ۸F6d ;t\S۸m\#2q ڸq ۸F6d nqMmA641"Dl#lD 4DmD`dCsJS"6"!cpFF݆pus&).WEE\0O*.yZS{$]_}s≜g{~]}ϯzpk |z7D= ݿ 2#n> \n7j7p=A"d ^n@76n`7ƚe'Wcb$#7ɆGby&Ml&ِ1^uM tnMl&ِ1MuSm&ql7j7[dcn@m&-Q7nqKmql|OӺq ۸E6dtSB*MYbhm6n MoA6naƸSlb6nC6ncɆml6ِ1r)6ncɆ mV۸mD5^ĈkH6Tۈ6"ɆF$jF$ِ1 HHl#l߈6"6";dBk>-31q֍;jw;dC6@w6`wȆX7m6 )w;jw6}qh" Gw-c,c-cіC#Xeee,2oK==n{n{a{i222eeeeeeegc?NQT9j%Dg:Qk\8z;J]p'c/ Qk\8QEk\ mbtg:w6bwɆ]ޅ.m6 ޅ{w6bwɆm܅6m6y_4ĸ'=X7m6 F`otOmql7{{j{dC=h=l>@fb6C6cɆm܇6m6 ۸mW۸m'2>q_m>M6-xcbD FF4M6d oD~#Zm#ۈ&2SmD )FF4C6o#1pmĐ ׍X7b6b!c^41j1F ِ1h#Fm#x@6?J@ԍn9%Vm#ۈ%2 mĪmbdCXh#Vm#xL66am<6 ׍nWs  !cp/j/dvϹ/E/6^b/Ɇ Kl%ِ1KK!c}KF"87ɇoOQD s-l&DDl#lFcg 1DDl#lF"m$ H66Wdo{nbWpJml|ܷx xE6d 6}צ6^aȆWjdc11^95S^m6^ M_õkk!c֍jdCg_C6^coƂbqf51ވ3o7jo7dC6@o6`oȆ)o:l ِ1xxmQxm%{v K~x+攷pNyxK6d n-Vm-l[h[l-ِ1[Fn[WL$76$!cpIFFD6d n# HRH6ȆװIFFltNԍwnSxm#2.|.;lِ1w;w;!cu;h;l=h'M{h{l=ِ1xx{{!c^=E߫m6ޓ ׍{QB!cpjdCkp Amlm|Pm|$E\iQa?5GG!cpGl#ِ1)6>bɆ甏Gv\h#xgK2js[<,c1/˘e2k[ƒ[RX,c XJX*Xe,e,e,e,2jKg [",c-c~G~a:%sʿN!V'\?kKbj:q.?T1l"&#Y_o' @djɰddC6A6aȆ{d7J HF6d >%6m$6\Ɇw961\xoz#W WlÕl܆+᪶m \КUmp%2Іچ+F6^97h&lAnjn؆ِ1 7hMm p#2S⦶m p66ܰ wAoob~j؆;ِ1 wh]mp'2mmcdCs;᮶mx:&01ІچK66woW6|6| _!c^j؆/ِ1ޗ/U6|ɆmBjvC^~ul]c:ԢZ]wi<[{:?Xw~}Ńg=Ss?\鞷U#}#a᯾ݗ1x=_r cz끿Z?$BW6kMk#1)i$'ŏ8˙\m#9lLtF&Frl#9ِ1^xr\m#9l|O+9\m#9le&&F Q7RBm#lnu#F l#ِ1xHF F !cH 9}&FUs6l8j3jFِ1^x P6ȆFjFِ1h#@m#$I31#?6@!cFF H6d 6 hF H6d n#T6ȆԕjU61wrwr6 !c m (󿥑'16 !cpAFFl$x|`#ea”j)dCu#%)6Rb)ɆFJX7Rm6R K,%Rm#%lؾQԸeT׸e'cָ׸Td eQFuˈk\Fq2qa˨qI6>FOyĈ}s$#6"H!c5U$\SEmDbdC6"HHl#lF$md"9x#`Ȥ D6d ˤ D6d n#Im#lLF&LFfqc葍~612֍jdCkpMYm#3lFfh#Ffl#3ِ1*3Ym#݆WsnHK7uB"^n],v^TSٺ,j=?Asq/o^y. ܥ͢Yw\ܗ]y. Y< YH\򰡗Uf{Yw?+Y jYq=Jd " ڈRۈ6n=O#;DP(6Fvl#;ِ1FvFv!c߂.#Fvl#;ِ1FvF4 [n5&FXFõiF4M6d n#ڈVۈ6ɆmDCjF4ِ1 mDmDc1dC}-51bs1d#&ն]cbşFF C6d ;c6b!cp1FF C6d omĨm`d5ĈXNUۈ6bɆF,jF,ِ1Xh#Vm#ۈ%2SbXXl#lT.ѳL#Y7wrƬ ɇՙ%)qjqFِ18h#Nm#ۈ#2-8mđ ۈ66ⰍdM61r֍j9dC ACm#lFh#Fl#ِ1xȡI6zVvSԍnTȉm$29aȩI6d װ96rb9Ɇm6rm6Fp׶01E݈u#^m#ۈ'2mīmcdC6⡍xxl#lF<m"n}ddbr0u#0F.\F.!cuJ.Nɥ E6d ދ悽h.\F.!c~#Km#la+6aȆ!b9%F>l#ِ1|F>|F>!cp|jd޴/~OOɯO6d ^7ú_m#?lF~h#F~l#?ِ1F~FԪ3?71 9S m6 `Q@mQl|*Q(@6d o6 m6 i*41 jdC6 B6 bɆװFAl ِ1x(mT(m"KoCeQ(Q(D6d >sJ!BF!!cQ֍BjBdC6 A6 aɆา&FaWaWaFa!cpjdC6 C6 cɆm6 m6 5QĹN1uHJK"F!cpE"jE"dCh؋Q(m!27@E6`EFUzתQTSuJQFQ!cpEjEdC6BE6bEɆ) mU(m#E2W?<(&b(Q (F6d nQLmQldcHEg 0yZCkQln6mp)ޗ9C"E7rI*${s&8\Wo..շ55555555ոWgVKm:p)R׸Rƕ'c3RW ׸RTd S8co$ƕ58å`+qWl-䷽)Lb+ jdCV(m&2JިFil4ِ1[ihFil ٸq(#f2je2dCu e6`eȆ)WRe6`eȆm6ʨm6ʒ6rq2؛- f˪m6ʒ ea\Vm,QlnuFYl,ِ1x\(Q(G66?5u QN`QNmQl|]˩m6ʑ ׍rnS(m#2堍rj對dcqF01ʋ~<7ʫm6ʓ )M16z+iObhm6ʓ ׍nW(m'2EC6cƔ&ʾ}dbTFoTPۨmT 27*~Flِ1 F F!c9QAmQl8qugbTTQm"QlAể*mT6* ۨmTTۨmT$2QڨQۨD6&F%Q7*QImQlJJjJdCF%JF%!c9QImQl4dnɆ91$'jdCpRYm2Ql|2߯QۨL6d n2QYm2Ql(M*b [amT6 ׍*nTQۨmT!2S9Fl ِ1: QEm QlU:*\TUۨmT%2QڨQۨJ6d n*QUm*QlFUhFUlȱiޓMjF5hF5lِ1jF5jF5!cjpF5lِ1R ڨQ l8tMĜS>S l|3ggdCu3X7>S lSAm|mT' ibThuFu!cQ֍jձdC6C6cɆװաjձd#IC65ĜR)56j`5ȆF X7jm6j |C F !c~QCmQlNdׇWԧ/c}pߢA}\iՇ{Z"zPDmWۨm4 m^h 24Phm4 2#ڀl؈6Phm4 2_6բFlِ1EhFl!٨3=rbn&FCa!Pm!ѐl|mMm46 ׍n4Thm4$2 j Fd̙vu41 FjFdCn7HmшlyFyFjFdCuHmјl^ިXh m4Vhm4&2_4jdC6C6cɆm46m46 zjShhB6d ^7Dm фlh&jM&dCk&F&FSدMFShFSl)ِ1:)\4Uhm4%27~FSl)ِ1xh m4Uhm4#7Lhm4Shm4#2Y4qpذ}>F3lِ1xhF3fF3!c h hN6p*&Fsw6Whm4'2_4jͱdC~gsFs!cuJshFs a._#xgG {B]Zׂjaj\3g G }_qIH'15q-ٳٳ׸Td ^ZB]Z%8ٴQ&FKQKFK!c%[m6Z F-aoRm%ђlFKhFKl=}R@&F+Q7ZJmъlFg OgZm6Z Z5U+VF+!cJmњl>sM֢on jdCt>]kFk!cpjdC ZC6Zcml͢M6FhFl ِ13mm6`mȆTmFl ِ1^LhFl-Sg3mEm6bmɆF[X7ڪm6ڒ ׍nUhm%2SBm6b}"hfoG6v~:VnShm#2ߋibکm6ڑ SuJ;vF;!c^Nmўlt[sHsH6cɆF{X7ګm6ړ ׍nWhm'2h@6+*SӟF1퉠QrcFlِ1\vPmt 2_vkjdCsJhFl Q!kO&_m|m|A6d n h //Ȇn|ِ1xBm l#p| S;: K;mt6: )Qm#ёlFGhFGl#ِ1611jNdM:N1:~7:mt6: mtRmt"2S:9F'lِ1 褶 L6ϖS:3ٰmHvVmt&2謶L6d otVmt&2謶B6|fh".袶B6d }uQmt!2~ |~Fl ِ1.F.ƗdYi3&ƗƗƗj_b_ ׍/aRmKlK!c~Ko|%%ِ1//6p::Uꟳu_"0wnWpMWv^ْ΋;~WtsE7nF7!cкA6a_Y>#}j_c_ _kɆ_j_c_ iZmkl;px.lt6mt6 ׍ntWmt'2a讶N6d >t6mt6z 3L9|C)=CmуlnuFlِ1FF!cGhFl'H}SԍnTm$2'FOl'ِ1FOFO!c~'Sm'ыltyfx|F/lِ1E/oKmыl^j^dC6zA6zaF2%_Ycb6zC6zcɆFoX7zm6z a{5loFo!c97[m7чlT?<2S9Flِ1xF>F!c9Sm6 Gmїlr&F_Q7ºWm/їlA}ểm6 )}Wm/їl|N mUm#я5anJ?a+6aȆװF?lِ1~F?~F?!c5l?hF?l?VcS9Fl?ِ1Xmc01ln uc`lc0ِ121n~byP0pH(h71q o-c,c-cS,cS-cYƦYƦ[fXfZfYf[XZY[X3jOe~q4DԸ! Q׸! 'ck\P1xkukq2_o5n PN&P7}PP!cި3[DCkc(1l|(1J6d > 6m 6E[ 1Lԍan Sm #2_oajðadC6A6aȆO 6m 6ɏ.l 6m 6 m Wm '2_S kjñdCp14ۏ71F9eSFm6F mPm 27F~clcِ1HѵZ&HQ7Fº1Rmc$1l {ёj#dC6FB#6Fb#Ɇ{ёH(A;ULQ(hc(lcِ1>(O7Jmc1l|NQjQdCuc1Jmc1lT?7ɇ&hb6F hh!c1֍jdCh؋Vm&211nqwg뾁]7jEsX#Q;\ߋ=gx;/fow7evo\=7 Co7N1tv|'21s\Ɛc1jcp=C"d G6ƨm6ƒ-eb돱2Um%2#1Vmc,1l jcdCcjcqdo벾GMqκaqdWg}8q8!c1֍qj㰍qdC}8GSm#2mSm'o9Kabuc<6cɆ{1O6d >sxx!cs<1^mc<1l1Q[L6&bɆLgd&mL6& ۘmLTۘmL$2S&B6&bߒ3wM`b|aoɆa;Ulߪm|m|K6d n[h[ooɆm| m|-1ll?rĘ$$X7&mL6& ׍InLRۘmL"21 ژ1 ۘD6d oL6&mL6&e6Ɇy;\LVۘmL&2aݘ1ۘL6d װ6&cɆdhcdlc ٘^v\{I(Q71Emc 1l":#3Emc 1lhclc ِ1x/:ژ1ۘJ6FpSĘ*ߘ1ۘJ6d >LsTT!cpSjSdCSjSFN<61u;X7Sl;~ِ1RܗiI ﰍȆ66֏)qĘ|W)ȆLSۘmL#27~c4lcِ1xݘ4i4!c1 ژ1 ۘN6jG-ᖉ1]ԍnLWۘmL'2S:c8lضmL6 x:|tt!c1ژ1ۘA68,uĘ=ԍdՊ}[ɺ1Cmc1l|_t1ۘA6d { {  !cu hc lc&=+&dc3aݘ1ۘI6d >̄sLL!cpcLlc&ِ1L,WͽNķfoRۘm"21 ژ1 ۘE6d ô,Y,!c9e1Kmc1l&lq^{6<=[mc61l| ;agm6f )2[mc61l mVۘm!:~619eSm6 ׍9nQۘm!2s`ݘ1ۘC6d nc1Gmc1l&vac;]mc;l||;3߮N6d >lsvv!cpۡj۱d#-k!l6vm6v );Cmcl|kڡA6d ދ6vm6v 4j;J1vuNN٩I6d lNlNN!c~c'7vm6v  mTi8{_y3I?~P.\ߋs&[v݁??o..~=׃]th|O ]b]껿 ׃]te >Ws.]"2#vA"vzDmR؅m&fߍX~-֦tnlc7ِ1nn!cnحM6d oحC661{=j{=dC6@{6`{ȆߣC6d G6m6֌jbs^8U؋m%2ثK6d >s^^!cثG6w11֍}j}dC{Z`߹Omcl|N}j}dCucOmc݆/}ѽE.sh;h2v2v2v2v2v2v2v2v2v2v2v2v2v2v2eeeeeدk떱,}O5n"]ON5n?q5n5n?8׸W׸'cָƐ>bbϐϐP8m 2lِ17{@mqlhlGx@&Ə7F?mmH6d nGhGɆT?5Տj?b? ?B?mm$ͣO8d@AA!cpjdCkpMuPm ql| qPm ٨*A-&OnOj?a? -'Ȇ`OOdCu'h'Cdz V519ql8nIYCjCdCϬϬR8m"2!lِ1C!CaG{&aQ7úqXm0ql":Xm0qlahal0ِ1r8q8B6’1iqGFKBd8q8B6d =װG6`GȆ)G:lِ1##QZl8 7m6 (QQ!c8l-ib8lʓ8m%2_6m6:18F6\\^П1Qe8q 8F6d N9)6aȆ):1lِ1c1cq`z{MRF6cɆd6W8m'27~ql8ِ1q x@Q& s&وItטXqBmqlnu lِ1  !cu h l$8]dʉ&IN9 )'6Nb'Ɇa?16lΞT8m$2SN9Il$ِ1I)F&)o)S)!cu)N9q 8E6d nqJmql)h)l4X6秌61N~47Nm6N 8 mV8m&2= EOm6N aOC6Ncgƴ >2u61Έ5=q8C6d g~Q8m!2g`8q8C6d N9mQ8m%#X][㬰q8q8K6d ^7ºqVm,qlnuYl,ِ1x8 mU8m#=*|8'OΩm6Α :OS8m#2q8q8G6d nqNmqlvt= L8j籍dCu<6cɆ88q8O6d yvC^?;EGٺLZvev݁׿ٺaGl.Gg=׃ tK?m}iUCط-.\.ݗ1x= \ 21/@".zpDεiIٸq۸H6rŬLuqQaeq۸H6d yֈjdC6.B6.bɆ犋E%FeJDݸ%K%!cq ֍KjKdC=%c^R۸m\"2Kj_Fܼ41~uX7~Qly_\mmB6d ^7~u__Ȇܷp@6~Q۸L6>\ [n㲨aݸq۸L6d ^7.úqYm2ql77jdCsehel p@uVqEظm\Q۸m\!2߷-m\6 ׍+n\Q۸m\!2[~ql\/i++ِ1x/+EUlƯƯjb qp\^R۸J6No`qUԍn\U۸m\%2S9Ul*ِ1x/zW6bWɆal;c轒2UlصcgBE^5lِ1xݸ5k5!cq ֍kjװkdC6A6a*Eq])r]m:qlhaےq۸N6d n:q]m:ql߸jױdcVLȴ >& Q7nqCmql|Nj7dC6n@76n`7Ȇ|Snm6~#ߴnwcb&`oodC`D#6mmF6d n7h7߰Ȇ}Mm7 a.;{#7-emc2eeeeeeO_Gǖ'S3s KXeeeee,2222~T]y#馘n了5&8܄{175&q7݄55&8׸T׸xE6_16ĸ%!!q ۸E6d 5utZ-lِ1[-[-!c[-[my=11n5mq۸M6d ޾ ۷6ncɆojdC}mhml٠R<01m6 )͜16lq۸C6d nqGmql|}m6~'(κadWg]mwlw!cgϺ;;ِ1pw߱ɆalTwI ߱?FFjb!z?`/dC0Fg 5lmmA6d Q3ƙX[>qlzVL&]ܻ;w6bwɆ}jwdCs]8U۸m%2.7m6 Ү61u=Nq۸G6d ދރ={=!cggm6 SA6aɆyĸSLqlxXY7m6 o܇6cɆ}X7m6 o܇6m6s9`b<u6`ȆX7m<6 `@mlFg)OKZdeb#Jml|x xE6d }Rxm"2?+h+l5Y_571^^5E_m6^ { ֽVxm&2xxM6d ^7^C6^coƅضooooo6`oȆX7ިm6ސ o`/Fm l=o7jod`U-61ފ9-Sުm6ޒ -[[!c֍jodCJ mUxm$M,?\HrY$a;(m$ a6Im# H"2In$m$aIdCFm#_Py7~;lِ1}Sxm#2_wjﰍwdCzmSxm'X]x//>}_{l=ِ1xx{{!c֍jﱍdC{h{lxU!E?m|6> I$}Pm| 2?[-@6d >|6>m|6>6Y7̙dl˺Qm#l|S>m|6> a/Qm#lm|Th? z#x$Z,c1˘e2mZ,c䖱Xe,222lKmKcKk ZY,cᖱXzX/]c_'@Bv tO N8@}K 1`s O ^\QSǀ_2uzd11}dh.F2l#ِ1dF2dF2!cpɠdjɰddCQ2h#F2lÕl0nf@7mbdCདk \6\ W!cpІچ+J6d ^7\ W WlÍl9vӚnbNqsچF6d @7 7lÍlRnRnjn؆ِ1^ᦶm͢O|=ӹmcdC϶g[6ܱ w!c놻چ;N6d mmm8yyɳuZxExE{󀽅ځ݁7/<[vІچC6d ^7|`Q6|Ȇ{Lcm`>dC6|  l×ll{B&S|⫶m 6|6| _!c~j؆/ِ1U68kS?6S6Ȇצ~pm꧶m 66 ?!cp~ІچO6u|s?S6 !c~j؆?ِ1 lßl܆?᯶m$'#Zu梉\a5lrFr!c֍jɱdCu#96cɆm$6m$6R|VB))Bm#lnu#F l#ِ1xHF F !c^4Bm#@6Z6(娉 8m`dC{_p+@m# 2mm`dC6l#lԦw b)jF ِ1xu#Pm#$2mmbdC@@l#lv]&FSm Ã=AdmaAdCF76 !c= h#Hm#HI6r jbhJ؋THm$2H 7Rm6R )6Rb)ɆSB)6RbF?H%F*X7Rm6R K֥RHm"2`H HE6d n#Jm#L6RM`g/jnJ0ٰ@V6ɆF0jF0ِ1`h#Xm#&2E``l#5-71R^45ESm6R ͜16̃TџHm&2SR9%Fjl#5ِ1xHHC6/wa93iFsMIHC6d NI)i6`iȆKKHC6d n# Fm# l\{Voi6biɆa&qHm%2iaHHK6d >6Ҫm6BƉ@&FH ?䆨m`!dC{!p"#2Ed 1xȠnޗ nǻ82ZidlbjfeE[b,c8XXNXe,e,e,e,e,e,eeeeeeeeee/ƕJC)qa˨qqH5N=OFdT׸e'cָ׸Td d5.e_$T؞&F mDmDbdC_$"6"H!cHmD ۈ6"6"Ld#s㫙K&ǒIm#l|-ˤ D6d n#Im#l[!Ljd#ǿ/obdu#362cɆmd62md62 K3s zffFf!csj,duG&Fa# Em# l|N,jY,dC{,Y*;Fl# ِ1,F,FVgT!#S9%FVl#+ِ1x FVFV!c^4+Emd6  mdUȊmd#7sLZ:MԍlndSȆmd#2`Ȧ F6d odF6lF6!c^4Mm#E6δxc%FQjQFِ1x݈u#Jm# ۈ"2QnDmDaQdCu# ڈRۈ6 _bbdu#;6cɆ!!ɮN6d n#;]m#;l|7;]m#;M6]nޫFz#Z؈66h!c FF4M6d >D9%Zm#ۈ&2Shhl#l Z@Z#F)1pNQۈ6bȆ[[mĐ ۈ6b6b!cmĨm`dc|LXa#ڈUۈ6bɆ{X؋ƪmbdC6bXXl#lF,mđ 2_#Ng6Ⰽ8!cM1<]HSۈ6Ȇ8oĩmaqdChm wnbgrs396r`9Ȇ{͡A6d n#Cm#ln6rm6rFC#Sr9%FNl#'ِ1LhaDI FN!c9%'Srm6r 9j9xQD#޹N1ShjF<ِ1o7xxl#lnúmē ۈ66ⱍ\dPr_|`bsJ.8Rȅm"2?˟ ϥ E6d %M 6Oy:'16raȆ\F.\Fnp̆[LN&V JޔjdCFnFn!cQa#r'16rcɆFnh#Fnl#H{:wL<k%#`ȧG6d n#Om#lnrp(^Obhm6 mSȇm'wk\lȯO6d N)6cɆaF9g Ɏ+ZdCjdw#ľh/Z@mQlFhFlِ1L(ᰱ~E~CkQlFhF !}C^+4VP-];?g AAsq/>l]A,[ŵwM9\lWHԃBRB/c>tPHȁA!X E1L=(ﰬmj{"DE`cޣFc/%{Xb3I2c^grc֬bb 56j`5.lb״jkZ56jb5Ɇ׊pQۨI6d n&QSm&Ql| mTۨm"]kbԂRۨm"2Q ڨQ ۨE6d c3ƿ+IObhm6j QKmQl گrQڨQۨM6d n6Q[m6Qln6ٰjm6j 6Q[m6Qlt_L:bMה:ju:dC6@u6`uȆa!^ /I :F!cu:ju Wp*ׯL WqM^rUp6\Ɇ'qmbdC  B16Jp6\Ɇ+᪶m%͇g^7Ĩ+)u>F]l.ِ1F]F]!cm6 uju 7Qgg&nbpچF6d n pSp6ȆA6tpXu>>m )nІچ݆0?y?Fv=Z}KRkdyXj-5OKRkfyYj-RZYjRkcYj-5K`ZjAZGaQ+r֕i̟S=WOWzՃ{\=Q1%Szգ'cWzWd#o+ES&bnvsچ;N6dlDs']mp'2/ޗ讶m p66ܱd#mDᨾ &F}ll''}dQ_m>Ql^_8YZdCyP_m>QlF}hF}lxq-h F7m46 o4Phm4 2Flِ1~@mѐlܻm@Phm4Thm4$2 ahhH6d 4kJCFC!cp j Fdh$fFpmhD6d l]#l]#FF#!c5\Sm46 .h UlbxچA6d ~-^P6<Ȇ)p⡶mx mxmx`ƖNljob4kJc4Vhm4&2YS16l:jhL6d 7þXm1јl]j Ox@q_ӹO1x ۃKj؆'ِ1wAO OlÓl|چ'I6d 7< O Ol ٘2e^&F7Dm фlo8c8ljhB6d LnLn&F!c=lhFl)٠7 xM.fF߻lhJ6d >o4FSFS!c5)\Sm46 )MjMfdWĔGLfo4}F3lِ15fy3fF3!c5\Sm46 fF3f؆]K'5L / 7Ȇm襶mx  Km "2mxmxa^dC᥶m4'>db4}96cɆFs7m46 hm4Whm4'2͡jͱd^֐˘-׾ٸy7Zm6Z hmPhm 2hhA6d ~]BmM6*:b&Gޣ歶mx 66 o!cpІچ7M6d 7 o o C^-߭M̳u-ZDKsֵ2Z;0On]Ki>-g<-;ֵ缥y],s#|g:2ߛځ>@-|u |H᣶m"^_bbeeRhm"2_+ZF+lِ1uV[Rhm"2 JmK6VDt&#|᫶m  _7|6| _!c9j؆/ِ1x6|6| ?q9"I&m 66 ?!cp~ІچG6d 7 ? ?l58іPFkhFkl5ِ1FkFk!c55\SZm6Z FkFL6⾌66jm6dCF8oQhm!2m`hhC6d ~ݢ Fm іlz&F[Oi )m6bmɆF[7ڪm6ڒ oUhm%2mjmvdcWM,΢6aȆm6کm6ڑ a=l;vF;!cyNmўlz-7yF{l=ِ1)6cɆm6ګm6ړ F{؆?Cߖ21ż  lßloþ᯶m )pMW6Ɇ h_m@6:`蠶@6d 7:Amсlot}Flِ1xmtPmK5b hF@6d"FJCk# 2mm`dC6l#l8^?∉(֔@mbdC}#@@l#l|jF ِ1@h#Pm#"U}[>#H 76 !cg3IAjAFِ1 h#Hm#"27 l#(r͠&FG1otFGFG!cY#E;mt6: ب匑ZdC6:B6:m0}?L=!ZR -ΖZK-RjEZj,(K-RԺ[j=,XKR-ޖZKRK[j, Km0͟SXqS1uٺ`u =.z׿`{\0qd a V`{=m&FCmD /Dm#1| _FbL15h#Dm#%~{b6 QF(J6d l](|.Tm#%2ombdC6BPPlٸ+ʋLNF'hF'lِ1xF'NF'!c NjNdC6:A6:aadW~eb aFFF6d ~-& ^ S6ȆFajaFِ1SaFFN6&Fexfppl#loþm  W6ɆӅCjFgرM΢ot}Fgl3ِ1{:g#:mt6: _ wVmt&2_S:C6:c]EEebtq .dyڈkc.F!c5 \Smt6 )]Em хl|袶ۈ /951"D߈}#Bm#ۈ 2mDmD`dC}#l#loD@jv:[Gy<[.<9;߭ gj]S{}j>]g<-;xju]9>]q?sD8C/R\;#g?H:2DD~Id VDµ"R-"H!c3ڈTۈ6 oMmtSmt#2 覶 F6d 6aȆݠnjݰ({`]L(1GDU#Jm# ۈ"2ߛF#Jm# ۈ"2?e|?eFE6d 7((l#lx/le-uGmDcdC{h7Vۈ6ɆwFjF4ِ1hh#Zm#ۈ!%H:#֔Ĩm`1dCÎÎQۈ6bȆ8oĨm`1dCkJ mt'9h11 ݡjݱdCkJwtWmt'2讶N6d n;]m;уlX?_m?1liqrJcXS5elcِ1x!c5e\Sm 6 Ϣjd̨21 jdC6B6bɆ@7m 6 m Tm "yt(1i ȆI~c lcِ1A A !c1AjAdCk hc lc0HfAMLo }c`lc0ِ1``!c1jdC}c01Xmc~0}?{<-0Km6RiF[jc,8Km6RhM&[jS,4Km6RiͲf[j_Zjs,,זT}·~07p&00ٗ1x?0a #2A"~0D|m Sm ';19G'G^m*;pp!cm 6 Z1\mc81lphcplcX!^c-x-xlcِ1!ck,#5j#dC錀6Fm6Fߥ01F:cHa1Rmc$1lHhcHlc$ِ12)#6Fb#Ɇg̑H(1lхļ1 6FaȆQp1 E6d nc1Jmc1l|MmRm&=du1Z)2Zmc41lh'1M6d khh!c5e41Zmc41lTr|#l6ƨm6Ɛ )c2Fmc 1lo}clc ِ1xmQm%>+ 1K6d kXX!cpcjcdC}c,1Vmc,1l[rmWƹ&81o8q8!c1qj㰍qdC{qp;Nmc1lNn&1Nmc1lTR4e c11O6d s3ƚΎVCkc<1l0aƫm6Ɠ x9SĘ pޘ1ۘ@6d >N !c5e\S&mL6& a'@6&`FFuGDD!cw ۭ6&bɆהpM1ۘH6d nc"1Qmc"1l|ҹDcXS&5e$lcِ11 6&aȆmL6&mL6& ۘmLRۘmL&,Ҵ1Yؘ mLVۘmL&2 C},I d!cyc27&mL6& ߗ8ژ1ۘB6 iq&Lk)!c=1ۘB6d >oL)!c1ژ1ۘJ6V:|1Uؘ mLUۘmL%2n*|nTlc*ِ1uѩTT!ck_SjSidc{7ͳ&4Lk4i4!c}4O1 ۘF6d 71Mmc1l4hc4lc:X~Ӆtt!cyc:7mL6 ۘmLWۘmL'2_SC6c3+F71f5e\Sfm6f 31Cmc1l hc lcِ1,:ژ1ۘI6)._c/sRf əj3dCH!b36fb3Ɇ3vLlc&ِ1L,qĘ%֔YpM1 ۘE6d 7f1Kmc1lô}c,lcِ1Y,Ylyt&l̆kll!cYt6Egm6f ٰoVۘm&21ژ1l޻%=&/66$2.%.ƗƗdC{/K//Ɇ@6TۘC6}۞&́k9!c5e\Sm6 sl|9!ca@s6m8LR=fhIDض_E|ea߃';0O^LW>_Ͼ9xZvg+9 t GMXZЛ+\\ٗ1Z1s~0| 爹jsq?K"d ~Mk.1Wmc.5ȲtޜM63I_ rdCkװG|55ِ1kZmklk!cp_C_m|m3kdi01<1ۘgV yoSۘm3뇈m̃6m6晕D;A6a-21;"|8QWۘm'2aߘ1ۘO6d 6cɆ|hc| {_͛^aX`y?BKmR[b-ԾԖYj-JKmR[cYj- FKmRbmԾԶYj--NKmޗyO9--P-'co d -u[{q2 ѧ^Ogb,B-TXm,$2_oBlc!ِ1BB!ck, j Edc_ûo co/EjEdC}c6aȆm,6m,6 ͋EjdcۀQ5{WxO)Xmc1lbhcblc1ِ1bb!cXXB6V^m&7Dmc l|MYה%jK%dC6@K6`KȆhclc)u݊My,ln]XJ6d nc)Tmc)lRhcRlc)ِ1R7d#aiٿ;&7b ܧ| ِ1uouo66!2 77dC66QXF6"ƎxX&,32e2!c`K2a[ږm,6 eo,SXm,#2 X XN6z2UcsM 5=8ӱ_crlc9ِ1)6cɆr7m,6 _]m,WXm  ɽΙ+Ě)+6V`+Ȇal:cLbyr lcِ1xX  !cXXI6qsX)fJlc%ِ1xX JJ!cp+j+dC{ؕJ*Qkb*8oRXm"2ad*U*!cpUjUdC}cJmcl7jj!c V Vm6V ἱZmc5ljK:;M5hclc ِ1k6`kȆ7֨m6֐ 55Z"[LZhcZlc-ِ1ZZ!cpkjkdC6Bk6bƭ_(X'l6֩m6֑ Nmcl:hc:lcِ1u:uzqtVv=îWXm'2ߧj뱍dC6C6cɆo6֫m66}_D !cYtE7ml66 Ϣ,Amclhclc#UcبH6d nc#Qmc#lol}cFlc#ِ1F&`gM&M&!cYtE7ml66 mlR؄ml"2 ؤn׷g13y[8e|]9xrv𿟭Νߪ|kw`߃oV}}s[xοUoq?L|Z=6677f6ٗ1x? f͸l&2jq?L"d Vl66ml6*CjblkVlQ؂ml!2ߛn=blc ِ1Θ[6`[Ȇml6ml6771VjlU؊ml%2ߛn{ӭjC6B[Ɇml6ml6#^ߤ(ob|']f66#2wwdCkwpMNm;l;!cpAߩm|ml#cXS5e6lcِ1x6m6!c mj۰mdC0611mj۰dLgDų6cɆgpݮN6d =6cɆo6ml6'y|.bb|/޳dCkpM^m{l{!c5{|==ِ1=flNMd#Idcg2ߊ|`lcِ1!cp;j;dC6v@;6v`;}a+Lb 獝j;dCN8oT؉m$2_Sv5eNlc'ِ1N.xTsc^.[Gz=pnޣq{pC=N=Q=xK66PZ&^17s^^!cy/m6  mU؋m%2ثG6kM}>hc>lcِ1|w)%?G6d >탳>}>!chOmclL˕Mr&~~~~!cy?m6 oW؏m'2jdcO71qjdC߭;[w@mqlm6 {v8q8H6zxY㠰q8q8H6d 7¾qPm qlZAx-Al ِ1x8mT8m@6B.AAml!cy#aȫ s\K}Ckl!cy8oِ16~6 z@㐰q8q8D6d 7qHmql|8CjCdC6A6aɆ[ՠMқaa!c=a=q8L6d n0qXm0qlahal٨8&O9)G6`GȆ5959q8B6d >o#!cpG#jGdeq8K6d n,qVm,qlo}Yl,ِ1,qVm, kUb&/7_ohmmB6d >o_6~6~!2 //dC6~6~Q8G6ҷLsRsj簍sdCe@ϩm6Α S}9s9!cyqNmqlT>|ba8q8O6d kyy!cp硍j籍dC}~Imql%h%lِ1K%Ketͪ11. jdCe8o\V۸m\&2q^߸q۸L6d n2qYm2ql\sqEܳs޳sEm ql++jW+dC} W6`WȆm\6m\621qjWdCU8o\U۸m\%2Wa߸q۸J6d >^6m\6fBMkbgkjװkdC@_@_S۸m\#2|5lِ1x߸m\S۸fF=7,-KvRRkݳ[j,,#KR{jn=Ԟ[j/,?,+KR{k[j,ڟ\zܥ$͟u]uu{uq2_ﺺ]=:8Flt]wz׿]WxA6(gqC7wCmqlj7dC6n@76n`7ȆCmP۸m$w؆7Ş&ST۸m$2o߄j7dC6nB76nb7Ɇm܄6nm6nj`bk-R۸m"2q ڸq ۸E6d nqKmql^[-[mѵGLbM הjdCkmV۸m&2o߆jdC߆6nm6vtqGظmQ۸m!2EYlِ1x߸;!c5qGm݆!_֕8g~%en=^F^U-Ws| v=xg~w>Ͼ9xZv[+<翪ܥs^=Ϟ ܅.}U;]r c{Bw"~pD܅6m6 Gx21ggm6 ϘyOmql|׊{j{dCfA6aFM$bb}>6cɆm܇6m6 ۸mW۸m'2qڸqx@6REr&=oFF96`ȆהpMyx@6d n@ml|xlp&oooja `Mm7l7!cpAmmF6d >omlܪ{LS3O=Txm<$2xxH6d ~!nPm!l|Mymqcg&s1>ss!c59\Sm<6 xm=^m=l&7>Amlo|}lِ1x!c}hl#\&Gq#Qm#lGhGl#ِ1GG!cnp̟gJ13IBEia߃'?vןpS}}sO:9S}s{_/˛^ޗ$.}?GRK-RKaRYj-4ZZK-R`e2Yj-5K-RferXj9-\ZnK-Rg> /L[1ԧצ&q3O4)Ct$.kI\к׿׵$.I\<׿׵$.ikI\PSǀ3OR141'uAuOHJ6d WJֺjIdCXU/FRl#)ِ1FRF2!^# /1 /1F2l#ِ1dF2dF2!cy8 m$6 A6a.ggdC?sA?S lo|gja Ϡ6>6f9>F1߂߂m$6 ἑ\m#9lFrh#Frl#9ِ1xHm$WHm n?\<|9aS )6R`)ȆהpMIHA6d >h F !cY4Bm#lЇ&FJ~- ڒRm#%lFJh#FJl#%ِ1FJFJ!ctRB)6RbF]vnbr߭K傾[Jm#l|MIהTjTdCh*8RHm"2Tjd#C%&Fj1hjFj!cY45ESm6R ἑZm#5l|H mVHm!# Nn4ji4dCHF4d6QHm!2_S5%Fl# ِ1xHmQHm%yt01ҊjidC}#-i6biɆM낞MHK6d c#HHG6.R΅;( zwP:tF:!c`#q:aөm6ґ ༑Nm#lo6ҩm6ғ~ >%=ܧWHm'2aHHO6d kJzFz!cy#=^m#=lliO#^ʠ@6d 716l/S͠@6d 72Am#l|ȠH6;nbdffTȈmd$2^ȨH6d O)62bɆFFh#FFl#٘AjLF&LF&!cg2g2md62 mdRȄmd"2=%Im#ly,pȬL6d 72þYm#3lFfh#Ffl#3ِ1,Ȭp!`E.ppQp6\Ȇ₾뢶m p6\6\ !cypQp6~JYĚ)Y6`YȆ)Y>%Fl# ِ1>% ܧdQȂmd!27@Y6`YɆ)&FV7¾Um#+l|M הjYdC6BY6bYɆ mdUȊmd#_cbd}#6aȆkk˦ F6d n#Mm#lod6md6J+^.ld6md6 odWȎmd'27y#Fvl#;ِ1,ȮA6 Ok11r9j9dC6r@96r`9ȆF7rm6r Ϣ9j9d&41r 9j9dCkJNTȉm$2ȩI6d 7rB96rm8E6Zvٺ\PD.\v=_;΃=I.\vgrK}sϾ9xZv}< 7c'~ 7{>|F>!c3Om#l޻LF~h#F~l#?ِ1xF~F~!cpjdC6C6c ZsashsϱɆm|m|99ِ1ϡ6>6>'29FmQ@S }JF!c5\S m6 Q@mQlFvÜaw8QBZaKVR+fJXj%-RZiKVR+g*Xj-/,JZeKVRfUjXj5-ZZmKjյ,)H=Dl̟SALALAu+{\Aq2_ = 8T'c߂ WP 8j4cMB>B>BjBdC_!R(m"2Q(Q(D6d >6 m6 =#<`b}06 cɆm6 m6 ͅ\Xm0QlFahFal٘tYSM"bn."jE"dCkJQ(m!2Q(Q(B6d ~QDmQlDvKQԹE ͢E6bEɆ[W}FQl(ِ1R)E6bEɆFQhFQlhv8WMbo}F1lِ1=6aȆF17m6 (mS(m'kM=6(.--Q(N6d .;26cɆ=+=+Q(N6d `qhFqlH:Xm[^-Q(A6d >h F !cQj%dC6J@%6J`%y71J=lI-Q(I6d c#a j%dC}$%6Jb%ɆהFIF)qp}21JQ RjRdCRpRJmQlF)hF)lِ1>QJmQl,N#El&Fi1hiFi!cᰑr )K}Ck4Ql|RSJm6J FiF^_41e2je2"7yFlyo2p(Q(cޛ-bpe2jed#Ή—eŚR)e6beɆהpM)Q(K6d n,QVm,QlFYF9[M MrF9hF9lyo7ʩm6ʙߊ|M)הrj對r"7A6a;Nw5\31 塍j屍"_S5Fylyǩgp-Q(oq*b5GTsDeFe!cpj*@qEg9Ĩ"lT6mT6wE~TQۨmT11޴ ܛVQۨmT11QڨQۨjbUFUFU_ [TUۨmT5}1xߨ FUFU_ mTUۨmT#q9bT6A6aȆF57mT6 ? F5lِ1jF5jFukՅFuFu!cpաjձdC}:6cɆmT6mT6jj89%Ĩ!lԀ6jm6j ۨmPۨm 2QڨQۨA6d l] hF l&X|&FM 56jb5Ɇ5FMl&ِ1,Z΢56jb5ɆgњFMF-1@MZ~ZV-ZF-!cpZjZdCF-8oRۨm"2Zjd[U6Fml6ِ1FmFm!cpjdC7jC6jcuF+ZĨ#:pިQۨC6d >oԁF:F!cpu:ju:dCkJhFlÕlkp&. .چ+J6d @W@W WlÕl|uچ+J6d npUp6꒍wǗ|Ĩ+fѺpQۨK6d 7¾QWm.Qloԅ}F]l.ِ1F]؆ٸ.֓IL 7 ssٰݜ릶m  ~Mm p#2mmandC6ܠ 7 7 aagyVRk`5YjZcKRkb5ԚYj^ZsKm|,VgXjm-vZ{KR`XjZ~z]hTOWOWzT=8FlTOWzT`qN6){fί&sn6;0W㮶m ?[sWp6ɆmCj؆;ِ1mmcɆ/EߨF}F}!c>m6 _>v}F}!cQڨQh@6 GywPQ:ˈ5m46 ?[>[@mрl|nnj dCp@ 6` ɆyP􍆰o4Thm4$2 ahhH6d 4kJCFC!c5!Pm!шlN&c&F#aHmшl|mgFjFdC}6aȆהFF#F؆x}RCP6<Ȇj؆ِ1 hCm 2ІچјlY,hhL6d ss{g S7,I Fc!cpjdC6C6cdl8 z=6< O!c5)j؆'ِ1 O OlÓl܆'᩶m4!4 41M&jM&dC6@M6`MȆm46m46 ߿hnWSu%ٺPDSv~)-4;0Ow»К~S7Oݺ7U4snzN^3L}~ЌξgfA3f4#2#9ZD3?A6a^d\/ژ^†᥶mx 66 /!cp^ІچE6d >GxA^j^Fs~ڊ>MLjͱdC6C6cɆm46m46 hm4Whm WqVh!l6Zm6Z Ϙ-Bmтl^phhA6d nBmM65?O[)pMV6Ɇ7j؆7ِ1?6 o!cpІچ7ђl8^g!^ ohI6d 7Z¾Rm%ђlFKhFKl%ِ1,h!#O︕;}N lÇlymچC6d e e lÇl܆᣶m"a?6;h%֔VpMi hE6d 7ZJmъlo}F+lِ1VF+V؆/٨_ޅowP _aU6|Ɇ _8ombdC_OU6|ɆmBj؆(Dߖ21 ?hOm#2w|wچG6d nS6ȆgQ?hOmhM6,euhhM6d kJkFk!c55\SZm6Z h mVhm!WC1m6jm6dC} m6`mȆo7ڨm6ڐ hhK6/wh+mF[l-ِ1xh F[F[!cjmdC6Bm6bƜ>sfb{vpNmюlٺvٺvjvdC}6aȆgvF;vF{~/R61ڋ5=\Sګm6ړ S}J{F{!cpjdC6C6cd?g6 !cy#a# *I lßl܆?᯶m )Іچ?сlT[ļ6:`Ȇp蠶@6d >otFF!c蠶 <771w\w6!cg3IjFِ16$9fb8lU?I6ȆI 66@l}nsbFF H6d >oy#Pm#$2}mbdC7@@l#l,|͠H#ȹ>l>R6ȆoAjAFِ1ה l#l|66dL 41:y#7:mt6: otTmt$2a訶H6d 7:B6:m[bZj,0K-Rlu",ZRԢ-KRzZj,8K-RmZj,K6Rh [L=nbʧ9<[?`qII1zd/7{\08`=.`q2_qS1*`u _و꛰l#D!p Q6BȆ!pm $$Dm#!2mm`dckbwwmbdC{B6BP!c(FjF(ِ1l mmm8|+̳u`.<9;u=A'sTg:g웃eٺNwRN9Ou<ż^atG=Rj#g? 0:2_+ 00ȁAaja_ 66°p#Mp1Gm Ϙp W6Ɇgp8cmcdCsD8mt&6Y#dc6:mt6:  mtVmt&2謶L6d 7:C6:c]"ޏz="뢶B6d ޗ./]6`]Ȇmt6mt6 Ϙ].j]8&FM'mD 7"6"!cgd"32jFِ1uh#Bm#J6:cbtFW8otUmt%2EYFWl+ِ1x FWFW!cy+Um+I6kO&FoDmDbdC6"HHl#l| )jF$ِ1Hh#Rm#F6~=&F77Mmэl|MהnjݰndCuW5mt6 mtSmDw?n41D߈}#Jm# ۈ"2mDmDaQdC6((l#lFmD _ZjbD FF4M6d q=a_a~Ck#ۈ&2 mDmDcdC6hhl#l|WoCMa#ڈQۈ6bȆ]f!,1j1F ِ1l#lF mt'37]=.鮶N6d 8cLb徻Fwl;ِ1FwFw!cݡjݱd#?'21zk_=൯j=dCpCmуlj=dC6z@=6z`dwf&FnO nOF,K6d 71Rsѩ'16bX!c FF,K6d BjFOELbSzm6z ߗޗSm'ѓlFOhFOl'ِ1x mTm"7LE6\0URm"2YS16~.C~CkыlF/hF/lِ1xmRmđǿY'FqjqFِ1x߈}#Nm#ۈ#2=lFG6d ?&mē z/퉇īmcdCgr6ⱍx!cFF<O6d 7⡍xxl7X6+E FoFo!c뢽ujdC࿵Vm&2wX7譶C6Ƹ9Q7laC6dl+݇lض}6`}Ȇm6m6 )}>j}d#bӃ^}E F_F_!c..m6 }Wm/їlo6m6 b61k_൯~j~dCkJ?Sm#27yF?lِ1~F?~F٠+pSa#HPH6Ȇ& j Fِ1ux]4Am#H 2_Sl?,omom6cɆm6m6 oWm'2诶np3I<4N"E'gpv0<;xm3I9@}Ͼ9x'P s:ezŌ9?te ~0P` Ɂjq?H"d 3GsHO[&chm 6yAe>db k V Rm "211Hmc1l|׊AjAdC069c8l|wn2 lc0xbS?E ``!c1jdC6C6cɆalrp;oZ6}YE.!s$ZjC-apKm6ReXjc-qxKm6RdMԦXjS-itKm6ReͶԾXj_Yjs--y|{_P@ߥ0NCD{u{q2qC`qCpB=N!p=D7z|C=n^Fo5HQ"6D!cpFF"H6d %/Qm#H$2m$m$bCF)O51 CjCdCsP87Um %2S {jCdC6BC6bYWab 33Sm #2`1 F6d쮣S;ZXqwhqCK@p@ $$! ݽHq/}^mܼnLuc4lcِ1 8c 6adl~31\6Iq%mj؆+ِ1~چ+J6d npUp6\Ɇ]چ+1l1]|d:tt!c2jӱdC=e:)6cɆ|fՍjӱd廚3ļ136f`3Ȇ]. ˥j3dCuc36f`3Ȇm̀6fm60&lAnjn؆ِ13nU7 7lÍlnᦶm ϢnІچ1l4?scEgYtLlc&ِ1Ö́?5Smc&1ln̄ucLlc&ِ1l_ژm"01fYpk,lcِ11 6faȆm̂6fm6f lla U Yl2<`&lgO1`g jdCϺφϺVۘm&2)aO1ۘM6d >ŏ=ellc٠_Habucs6`sȆ9pޘ1ۘC6d ^71Gmc1l|ޘmQۘm%<-Lkb[77=ݺjsdC ݻ;cO{rn|_ژm%2\=jsdCuc.1Wmc.1lp<&bq?e1Xmc1l|X jdCb8o,VXm,&23ow{*blc و*6exD|d %!c%pklc ِ1%%!cw̏7.!o\nRu{ݺMܥjK"w=-%yr-'R8m.Uowys׃etǥ,Pd\CoX?2\ٗ1=o{,S;X2r c$}ejp=XF"d ݝ16^H3W16aF7Fdb,sr8G,WXm,'2aXXN6d nc9\mc9lfh጑?پ V`|\x4Ⱥᡶmx ϘpP6<ȆM=൩چA6d nP6}a|ײƲֲgYXY[-kA`Zememe-ԲٲŲfYjY EX"-k,k-k;,kQhZe-ֲg>8>揓q>kq>Td |`Q8\|磮q>P1x5G]|p%Iej6+lBj؆/ِ1g3_ _l×l܆/᫶m /᫶m!w{+X#l6֨m6֐ _STk6`kȆk5jk5dCuc Fmc l8621֊pZlc-ِ1xX ZZ!c}pnZlc-ِ1xX mUXm5"^~:cb놟چG6d >oyOm#2)~ma~dC6 ? ?lßlLt^/pچ?O6d S8c$I`U_m'2nmcdC=W6F7b l@jFِ1xO =%@m# 2nm`dC6lc٨c7yc:lcِ1>]Wg #/6aȆu_u_XG6d OXXO6Qr^ἱ^mc=l|Xj뱍dCuc=6cɆm6֫m6G-616@!ck@x m _k@@l#lF m C gAm ׍ X76 !cFFD6d >oAAjAF0وt<0 V6ɆmCjF0ِ1`h#Xm#&2 mmc3ouxAmcl:eN٠@6d ~ ^nP؀ml 2ؠ!/y"ޭ օm`!dCF7B6B!cp!FFB6d >o@!j!v6:߭of nF8elTha߭FvI;=#klToq=Dt 'zZ&::7&\6ٗ1x=&Ml"2?6El`1^&hc&l#la֊&FطjF(ِ1 kDF(J6d >cjm FF(l8,fbluc366cɆml66ml66 ׍ͰnlV،ml&2#6C66c[ƑI ~ibluc [6`[Ȇ{Sml6 Ϙ[Emc l߈71-j[0W31ĞV66°0!cpaFFF6d S`O S6Ȇ{Jml%3{uR[cتJ6d nc+Umc+ll=eVlc+ِ1VF8{ހo")F {ZjF8ِ1V8 W6ɆF8jF8ِ1mmcd^}`bD{JFA6d >FY4Bm#ۈ 2mDmD`dCu#ڈPۈ6"F^]61"Hh#Rm#ۈ$2 mDmDbdCh$E#6"H!c mDmDbȆ%Lmbmj۰mdC6A6aȆmpئ F6d ئ N6nxiblkokoW؎ml'2EYtvlc;ِ1xvv!cpۡj۱d#.c!zSvm6v ̢16vYZ;dC8oP؁m 2);j;(jr]3֙QDmD ׍(X76(!cpQFFE6d ^7((l#lLp #ZԍhX76h!cg3jF4ِ1hh#Zm#ۈ&2m&mĐNTb#l@1j1F ِ1x݈u#Fm#ۈ!2mĨm`1dCu#ڈQۈ6bƏ.7Ĉ=%XXl#l  jF,ِ1, gXXl#lF,mđ [~2Ĉ6⠍88l#l|_4ƩmaqdCN6Ⰽ8!cJAqjqvؾ߇|cememememememeeeeeeeeeeeeeeeeeeeeeeee0T^o4So)^Fp6W׸x\Yg+k\<8Fp6W׸x\|?ָxuo'8@cا vm6v T؉m$2٘aqj;dC{1;j;]dc˪511v ֍]j]dCջKmcln4wwd~Ckcl|nmR؅m&i\-~{nlc7ِ1nn!cjdC=e7[mc7l h2& sl6m6 mQ؃m!2)516UuZ{=dC=eGmcl4{9ͨ&^SžWmc/l|n/ܧ۫K6d ~x/gWmc/ln6m6'9#Ne}j}dC6A6aȆalup0?PZ}dC>hc> K^7,wçE췋0Oϻu5~vI;x:wٯ=XZ:﷟}s[s׃t4KODx|}׃P;8r czP8q׃$Bq@mql߱m^g&A1GsAA!c 1m6 ̘u166Mwt_8m$2߷?mT8m"%q9GCdv!lِ1C!C!!c16bl}گbhm6 ׍C!Ca}4Y㰨a8q8L6d n0qXm0qlFkgl*al0ِ1a3]01{G#jG#dC8oQ8m!2٨aG6`GȆm6m6ZSo21 GjGdC{G^QQ!cY3Q;:ZGdC{ZGjGcd#A_ĻuU1c1!cpǠcjǰcdC0u3FFsCkqln6m6Ͻkb6C6cɆ{qSm6 hqcٿq8N6d n8q\m8ql\9?ed%& 1  !cq֍j'dCIN$'6N`'ȆaO@'6N`'ƎFH31Ny$7Nm6N ׍nT8m$2Or'9q8I6d ^7NB'6NbȆgԲi51Nq ֍SjSdC6NA6NaȆ⦅Om6N ϢSjdclɼO>&i\i\ii!cpil4ِ1x8 ii!c{hj3d L3=l ِ133!cpg3jg3dCO6Ψm6Βr+Timb=,)g6bgɆafNQϪm6Β ب߳~ɿq8K6d >6Ϊm6Α i|焍s9s9!cq֍sj簍sdC6A6aȆ{9h9l0}xܴݲݶݱݵaYgYoY{`Y{hYӲȲزIJԲ̲ܲ²ҲʲڲƲֲβeeeeeeWkn8߭ozyz7ԕ톽'n 8#P׳zfWs[wV*v^Sn Xnk n9pd)7fL~7}&}|[m6ql|o6ܛq۸M6d -[6ncɆXnC6ncwF՘71q֍;jw;dCuw6`wȆy~Klِ1hl.^j$SLκaqlT;vj]l.ِ1xݸ ]]!c}wjwdCu.qWm.ˇ񇸧dC66Pl|mmA6d ^76P۸G6λuqY7=a~Y7@m6 {S۸m#2NSm6 ?{vڸq۸O6"\'hb}8oW۸m'2qڸq۸O6d >އ}}!ck}MnMMAසm<6 SS!c֍jOdC6BO6bOɆShSlpg&3qLmlE t3lِ1g3g3!cpϠgjϰdcNoŞsg\m9lnm|6> {Pm| 2#>@6>`F051>֍jdC{ZGG!c֍jdCu#Qm#lIԍOn|Rm|"2` D6d nImlyO'Ogq0F Ǐ7(>m|6> Ym3l|3ܷL6d c#Kl|Vm|!yW-ab|u _6`_ȆX7m|6 _Em ln|6m|p|%ҋ6[ \XZ־%%%%%%X2X2Z־eeeeee尬崬岬j/me?La8%pϬ&pAϬ)8BNb9 1`Kb( 1`Kbո>u !C~ƅvQl}7j`ߐ Fml!coo66f9>lb$t0$$ߡVFBFB!cp j dC6B 6b Ɇm$6m$6%2]<6b|o]ƷƷdC=[SUl[tMƷƷdC| m|-l$o \\л6aȆm$6m$6 ׍Dn$RHm$"2ߧKm$RHm$&Xԍİn$VHm$&2HHL6d ~]o'VHm$&2)j$dcߕpG(FaF=ߧI6`IȆ钸}$jI$dC=% )I6`IȆ{Jh#Fl#)o^3C&FRQ7ºTm#)l|M gѤjIdC=%))I6bIɆm$6m$6 i&F2 S7 -ͱdjɰddC6A6aȆm$6m$6 dF2dFrѣlM.ٳ.ٳjɱdC6C6cɆ{JrSm$6 }%6m$6R~cx)DOI{J F !cp)j)dCh 8PHm 2NImPHm$#)aHHI6d jJjJFJ!cp)j)dC6RB)6Rb'WO11R ֍TjTdCu#6RaȆm6Rm6R Tjdeb6RC6RcɆm6Rm6R Ϣ,Zm#5lSC6RciƎ G1҈4ji4dCiF4F!cpi4ji4dC=% Fm# lx\]6VԍnUHm%2FbF4-ٰMHK6d n#-Vm#-lFZh#FZl#1鄍tF:tF:!ctj鰍tdC6A6aȆm6ҩm6ғ;5ib6C6cɆaltvpذ=b^m#=l|#=HHO6d >6ҫmpbޭo yN.j.v;x|Gu.𾚋ځ݁9xO<8:.b?)ťts9w s zČ 곟׃ te seP;ȀAr ck 4ZD\2'mdPȀmd$25l1Q􊌰WdTȈmd$2ֈjdC"#62bɆmd62md6#fv#wwdC068c8l:Y/sQEِ11Sl|Nm;l#yy[(F&S2Im#l|"ܷȤ D6d n#Im#l|O+Im#ltCs#Y?sR2 jdC0I8c8l~v,Ffl#3ِ1FfFf!ckFfF1YDO{J,F!c{hY=,jY,dCh8fQȂmd!27@Y6`YɆcyϪJ6d oaM_EJ6d >fhVFV!cpYjYld21 ֍ljٰldCF68odSȆmd#2)`Oɦ F6d n#Mm#l$.B# ~vjٱdC)uJvFv!cjٱdC)١jٱd=yBM]]j9dCIr$96r`9ȆFX7rm6r Ϣ9j9dcWBm51r:{l?)ENFN!cj9dC6rB96rb9ɆFNh#FNl#zR#7ry#F.l#ِ1h./Km#lF.h#F.l#ِ1xmRȅm&>Tvl[ԍܰnVȍm&2aȭM6d >oFnFn!cY47[m#݆00/9ّ|B–"b▵-k,k-ke,ke-k?XY[*X*Z*Y~UUUUUհ|&ո.87Sȇm#2|jdi<l~#F~l#?ِ1xF~F~!c֍jdC6C6crO+k`bu6 `Ȇm6 m6 ׍nP(m 2)jd#<`MYԍd346zFAl ِ1nA[Pm Ql|-gтjdC062ƛFAF!8KviJsHsH6 aȆBp(Q(D6d S RHmQl|/QHmQl=΋&FaS ÞRXm0Ql=Fal0ِ1xO) {JaFa!cR(Q(B6E`(Q(B6d SRDmQlnuFlِ1,Z(Q(J6JѷVMnuFQl(ِ1x( FQFQ!cy(7m6 ( mU(m#o\n3(&F1X7m6 QLmQlnuF1lِ1xO)mS(fxɫݺVwjQ\-]9x^߭+GqvI?g}s霿[Ws^׃tWBP/c9tPB%ȁgp,Q׃$B#S(Q(I6֗?ZIVC+Q(I6d >GsDIFI!c^QVj%dCצ%j%Ɇۺ11Ϻu^m{l{!c$fD'6߫m|m|O6d ^7u{ﱍɆg66JYouib6JA6JaȆ{J)SJm6J (mR(m"21KA6JaF]z(-l6Jm6J \tupذ}οFil4ِ1FiFi!cQ(Q(C6}z3QF\צe6`eȆY-Y-Q(C6d n QFm Ql|(mQ(m% NIwQV\)e6beɆdVʪm6ʒ i{Ze6beɆm6ʪm6~ o\8AAml!c?mm@6d ^7~uȆ6~6ʑmb6A6aȆ;rj對rdC6A6aȆm6ʩm6ʓ =yBG31ʋy<7ʫm6ʓ o6cɆ{JySʫm6ʓ FyFk61*Q֍ j dC6*@6*`Ȇ* j dC) jdFEFE!cy"7*mT6* ׍nTTۨmT$2QڨQۨD6*f9O-Q ڨQ ۨD6d ^7*QImQl|ިJjJdCR ڨQ lЯ31~6~6~Tl|_G/ƏƏdC6~6~Tl|QmGl2x̸Lb_2QۨL6d ^7*úQYm2QlFehFel2ِ1xO mTVۨmT!vKz,QE܇VQۨmT!2QڨQۨB6d n QEm QlnT6mT6͎ 21:a͍djUdC=*)U6bUɆmT6mT6 ׍FUF5ͨ˿RjbߨQ ۨF6d nQMmQlQ ۨF6d U ڨQ ۨN6M&Fu]WWۨmT'2QڨQۨN6d ~ [^VWۨmT'2muhFulhZqVwM:NQۨA6d g^Pۨm 2)5`OQۨA6d ^7j@56jm߇iG-ZmZZ]Z=Z}ZZCZ#ZcZZSZ3ZsZ ZKZ+ZkZOvN-k-k],k]-k,߇I5X`u/?N5lTF55&q5&q5qI5NQM8T׸դ'cWָWZd#yvED_-ZF-!c٨jm6j FlTKmQlՂ6jm6j{scփ3f=z#21A6aFZeb6C6cɆgpƬQۨO6d n>Q_m>QlWԇ6m6N011m46 ̘]1$&Flِ1FF!cp j d#gu51‰FCl!ِ1GC8[4Thm4$21)FCl!ِ1FCF#a&F#@#@#FF#!cߟjF#lِ1i#xmHmшl|hm4Rhm4&mkb46C6cɆFcX7m46 ׍ưn4Vhm4&2achFcl >/ɳL M&FhFl ِ1&F&F!cy 7m46 &F&FS‰*MuJSxTm)єl:)NihJ6d SžTm)єlFSF31fx7J̈́fF3fF3!cp͠fjͰfdC=)6aȆm46m46oQFshFsl9ِ1FsFs!cjͱdCIC6c-Fٶf01ZpF lِ1}>I F !c֍j-dCuBmђl߿cۼ$&FKQ7ZºRm%ђlnuFKl%ِ1xh FKFK!c𽯖FKF+Abh;F NJ VjVdC6ZA6ZaȆm6Zm6Z VF+VFk &Fk羨9)ɆVhm&2hhM6d SZÞZm5њl6Zm6ژz`LF##Fm Ƽ-bpm6jm6}mhmQhm1k| Fm y'75Lļ7~R ɼ+b𽯟Oj?a?wrE n'h';"?A?mm5]&0l.w۪m6ښ.E n-Vm-ּw)b1#W16bm{"EBm6b̻uw^>5h'akvjv:hmShm3։nuF;lyNuNmўl49ʶ&F{Q7ú^m=ўl|hjdCu=6cɆm6ګm6:drtA<>AmсlntuFlِ15lx AmсlFhFly~|A%vtAQm#]p=J|tɲ{z]E= ~WAW:2]a=v׃@+]"zЕDt6mt62X4 覶 f1i7X#mt62D nMmQm!2|Flِ1>F>F!c裶K6&j諶K6d ~//Wm/їlF_hF_l/ِ1F_F?qހo~F?~F?!c~j~dC)uJ?~F?!cp~jdcI ~71 jdCFF!cp﫿Fl?ِ1FbӒ3{ux2@mc1l|_t1@6d xxlcِ1,:1H6R-ڪ1Pԍn Tm $2)aO1H6d >o @@!c11D6]1HԍAn Rm "211D6d >o A !c11L6ft:};1X m Vm &211L6d >o ``!cpj!dv7@12!jC!dC6@C6`CȆm 6m 6 ?41J6f c11J6d nc(1Tmc(1l| 獡jCdC6BC6bFtb5DO{0a0!ckav0lcِ11 6aȆc9 1 N6?(T&c11N6d nc81\mc81ln ucplc8ِ1xm Wm Vi~!zSFm6F {#6F`#Ȇm6Fm6F _Î6Fm6F-kbuc$#6Fb#ɆHX7Fm6F Ϣ#,:Rmc$1l:e$1Rmc$1l\c`1 E6d ^7F1Jmc1l(hc(lcِ1=lRm&_1ZԍѰnVm&2N SFm6F  mVm&27FC6Fm8^|.S`ޭEQca迃n;Oc'xǨ7O}|`,?j]Mcb,cg,c`X\ƒ?7>7V-b,cI{XhcXlcXGWc8mqj㰍qdC6A6aȆ?qj㰍qdC6A6aFDzdbsx5ƫm6Ɠ mWm'2#N2^mc<1lkSg dcxlWśo ]ƯƯdC0ettp8x|dbhmmJ6d nWhW__Ɇ6u@6~Ul\ó9!cps9jsdדNsEO {\\!c1֍jsdC=e.)s6bsɆ{\hc\lcsj߃19F܂J6aȆٸ:D1_ԍnWۘm'21ژ1ۘO6d SÞ2_mc>1lṅ6m̷pn]xS+̻u `X.<;xGu 'd΃@}Ͼ9x vt߭[9_B:~sP[, g! |Ok!Zv׃@`!P-b! Ig̅B؆;cM wg0>#ֹmcdC3;16ܱ w!cΘj؆;ِ16Ȇچ;l{٫&"1G,s"E"!cpEjEdC3"8c.RXm,"2#A6aƼ"Sǖ61;{wK5RLcblc1ِ1Θ6cɆbX7m,6 X m,VXm,!S%,X"=%jK%dC}Y%jK%dC8o,QXm,!2OXXJ6>԰cXXJ6d ^7ºTmc)ln,ucRlc)ِ1R2z21yc7m,6 ༱Lmcl2hc2lcِ12hc2lc9٘Ys&rQ7ú\mc9ln,ucrlc9ِ1,΢6cɆrhcrlÃlT[vup!lx@j؆ِ1xuCm 2nxmx`dC೨ᡶmxDZlbx Іچ'I6d >zYSm$2nxmxbdC{_Іچ'lDtxc7Vyc lcِ1s+6V`+Ȇ X7Vm6V  J17I+JJ!cj+dCuc%+6Vb+ɆJhcJlËl.D]K/S6 /!coxoxmxa^dC6 / /lËlnxA^j^*؀,fbuc6VaȆSVUjUdC=e)6VaȆ*hc*lÛl9L oQ7aV6Ɇ.چ7M6d nV6ɆS o olc5Ksbuc56VcɆjX7Vm6V {6VcɆjhcja0}w<|-kk,kk-k~5Zememe-вdY mX6Z6YB-k-k[,kapZe-ҲͲݲòeYXb-kqP+beG?|58q2:c8jֵC5N?u5·jq>/ٸ?f+lBj؆/ِ1/U6|Ɇ m ?_hWmXC6VM.k:cXXC6d OacILJ~Ckc lnuclc ِ1hclc-K-kųk᳭k6bkɆZX7֪m6֒ X mUXm%2)kjk ?aˏYF~V?lچG6d ~M6 ?!c{چG6d nS6S L SaOW6Ɇ?j؆?ِ1xu_m'2)Іچ?@6:lbߛ pA7m ׍X76!cm ϢFFl4{9ͨ&:u6aȆm6֩m6֑ ׍unSXm#2)렍uj6/yw[]֭'˂j"wnz?֫;0Oݺ2Wo<ݺW9߿cۼ$^A }?_/ T; TvHoYJU @\IY 66 }4Y#+̆Aٰ}44Hm#"22wm  t6 !c9"R6F{D#^mcdCmcdCsD0#6`!c9"V66Ͻkbl66@66`Ȇg pܠ@6d ~N66`ȆmllP؀mq!9@FB6d SB`O Q6BȆ{J)!j!Fِ1Eml$cKjQ[l66bɆ{FS6ml66 mlT؈ml$276B66bFƴ616 MjMdCH,baoR؄ml"2)`O٤ D6d ncImcJ6jqF%#TPSB6BP!cy#jF(ِ1Ph#Tm#%2ECPPlc3xۘL͢nlucflc3ِ1LOaYmc3ll=eflc3ِ1fhcflc pĕ%Eԍ-nlQ؂ml!2[`آB6d nc Emc lnl6ml6FaY7S0Q7`S6ȆuϺmaadCap_4Lm# #27 00lc+ٸ3ͱgbl{[VV!c딭:eVlc+ِ1[ɆVhcVl#l {82=%ppl#lwr䆫mcdC6¡ppl#lF8mD_]ibD{JFA6d ^7"`݈Pۈ6"Ȇ8oDmD`dC6"l#ld/u@)&F-H[pjF$ِ1Hh#Rm#ۈ$2nDmDbdC6"HHlc8>&6SMmcl:eN٦ F6d ^7MmclvMmcl8>(.ll6ml6 OlW؎ml'2Fx;|Fxvlc;ِ1xmlW؎m .eУC;༱Cmcl=elcِ1=!cp;j;(E,&FQnDmDaQdC6((l#l|# oDmDaQdCQFFM6֋xɏbDY4΢jF4ِ1hh#Zm#ۈ&2E,mD ۈ661szѷMSb`OQۈ6bȆg8ƨm`1dC6bl#l|6b6bXQgF,mĒ ۈ6b6bX!cy#jF,ِ1 mĪmbq݂f[l21\6Ⰽ8󖁈{J)qjqFy@F76Ⰽ8恈{Jg"~&]ݖ=}CÖ#c㖵SӖ3s K˖+kS}/_<k\<8x5.׸xq2lqS1x5.^]5Nuu;u;"vE'[j;wvS}wϾ9x vwvsS}wgJv%.Xv.\vٗ1x=.]"2wyxZ.\v? إ M6^_>?ed}cحM6d nc7[mc7lW솽bnlc7ِ1nhcnlcȻj c؛fm6 mQ؃m!2V;=!c9bGmcl YMtbc{aثK6d nc/Wmc/lnuc^lc/ِ1x mU؋m#2]x/x>lcِ1>hc>lc?ٸ?WM=e~lc?ِ1w|z2C! CD$I%ɊH$A@Ab"P4< C,랿n}sngժ]ņrjcrncX>8}[Fc+hXaX!6t \f+bC֍f+bC JN}gDb7<+‘k_m4Xm:g#&af+bC^t%EWm6V 甕J*!bRs*:2Xm:֍Un2Xm:֍Un2Xm:SVQ6Vqb#Zb6>]l&ttn#]lX7iH7H6ņ6ҩttn#]l8Sfjk͢?bVuc56Vsņuc56Vsņ6Xm:֍jbWbE[7ֈ >u_cX#6t \îk5fk5bCuNYcX#6t 7Pk6pkFR^bU딵tlc-Vlhc-lc-Vlhc-lc-Vl]Km5Xmd#^u~.Y'6XXdT;C:u:cu:u:c:e]3Xm:먍uf븍bcKVbWuc=6sņ6S6sņ6S6sņzjcznc2tŽ  c==66pĆ66P66pĆsjcncب$&z16uFNh(6t \l딍fbC@fbC@f6"c6gr.$mO{m2}xڇL&:l2;v}xV?`l2߾ g&w׃ϸcYF>z3;3;f^6˷c`=Lfͼl:im"6El`1l66ml6K blQs:Wl1ml:Bml1ml:[\lc Elcn6ml6tϘتll6ml6 {̭j*6t j*6t j&6g$ߋM=?v6qĆkmf&6t S9e6nc1pslc]lLĜ.t;]n7ml:)露lc;]l߹wn7ml:Nml7e}7L. ;c;ccc{c{cccccccGcGcc㎱Sӎ3s Kˎ+{_2=!甡z ek\qRt qek\qRt 2hoaqeH17ʠ5.\2Cl^7A{f;bCLjV1bh c;6vp;Ć6vP;6vp;FzֱS;UoF;6vr;ņ}N74m:;i߼lc'Sli%6F6Vj)ce%6thv ԶlcKl8s.].c;wQ6vqFfcMpwm6v ݴm-6t im-6t \S6vm6I.bQo1m:>~ ף,{6p{Ćuc{6p{Ć6P{6p{Wy/^5s^^c`K^^c`/{6r{ņ^jc^ncs?bSk}t lcOl:%:lcOlhclcOlhclc_lsy1֍fbC֍fbC@fbC^t?lc?q@lx7Tq6pĆgг6pĆڋ08m:֍A՜r)6rņu 6rņXX48m:fCbGԤ^Cnu!n1l!z!n1prSm6 !j!nۭؐ^ê8LfbC}t_an18LfbC=as:Bm6 wyn1nun1jn;lqTՍn58m~U18JfG*Gi/zl(qV9(ql(q-۶^c1j1n[s1:38m~kS1pN9FcfǸcom*8Fm38md y^LՋf^4l#:Ȥ6262LcILLn#Slh#46{{#+8qZ7m6{{*)rl8q3W1p {am6{{*8Nm78mE*VqBՍn08mEU 'h8aq8틪o  o_T@'f'6"NgٺTInއ}֝Nt;><ڇO:o><><8[w~'I^Ny{q[SjX1+++Kqv:Ɗ8Ɗ:Ɗ9Ɗ;ޚS/9e 3$9㟓7_up(K $[?gAk\pl8e ָl,1e ?gAb#rDMJFvj#Fvn#1of}svFvcFvFvcFvFظl]ӼQFemD 0뛣6(c(j#l#ۈ:ڈ66bش;{1rq7G0m:ǚ#ca!6t f{96rp9ĆkFFHlR!U7Bn6BFHl^hLjp2q!c0]0d6BbC2qb<ňV6hhn#ZlގvF4-6t SmmD hj#l#ۈO< 1bj#l#ۈ:ʏrRݩ]j#ۈ:)1tN1ۈ6bĆP1f1FNqy1bXj#l#ۈ:֍XZ7b6bXc`݈u#l#ۈ:FF,'6}U6%F\_ 6⸍8c qavHF'6t GmęmqqbC9%ڈ3ۈ6ņox1U݈u#l#ۈ:֍xZ76⹍xcOxxn#^lX7⩍xxn#AlLOGb$( FF 6t FK?FĆ5 f F1n$к`m$ ) FF(6J=%FHm$m$rbCHFF"(6t \&5lF"(6t !H4Htۈօٺi-еf4;v}xٺis}ó-J?}9yN^;mu$Uh=H2I$ɷc`=H ׃$qc`D$$^D H2H6re$-ŋKEm2m:Em2m:hl#KlEm2m5ȭ֦鬑l#7[lh#7l#7[lX7rӺl#7[lX7rS6rsyFy"7Jѭ{gbZ{1)|f|bC@|f|bClLjP.F>n#1F>j#F>n#,6)+aj#l6bC32a^ m1p"LWa0:Sa0,6[gIde#H6H6ņF276dca{F2,6t Eddn#Șw^F~j#F~n#1pNOfbC֍fbC@fb3ն7(+@+`Q( 6t h(`Q( 6t Q(`Q( 6t QlQPl)>e^j (hQ((6t 7 ~FAn1p *hQ((6t fBbJBaPRlQHlX7 ѺQlQHlhQlQHlX7 Q6 q)bcO? +1RTBn#Elx&)IJ1H6RĆ6Rn#ElBmmpƽ{$FaN*,6"fbCقfbC@fbCmb06 sb9b^4fF1YT_F**6t ESi/jm F*jm罳ExwP0;Fn1p [am6 FZ7m6 FjFn2rj1/FQoFQFQcDC**6\嫨FQn1FQjFQn1}Q?Ql(QLl4eȜޗ|^1/&6\/a+fQ(&6t \bfŸbbC9Sm6 #b;w16q}{\/F0S<)nQ(.6t S9Fqn1fŹbClc_WSǰ(? &0%x9J:npr+1V1V1V1V1V1V1vccXeحc;p1vccccccXM0%ƥVZ*Mϩ??R^X@70׸ƕc`+Ak\ s+k\ q:F%hoT\JWBj_ :0׸|KPC/FOifiF1Ffm CJ!mqibC@iFFQRlhMjqؘ;U(Pmm"6t q q--bC9:bq q1--fpF%كbTVtRl2QYl8TsJeFecFeFecR)6*sw,h(qҺqƭƭbCLjҭbõ\lVnVc:VNlVnVcx61"6 <.SVr^/mmmfq mnfqq1p6ummbCĆmfqӥv5N6n6n:w#bXfs nnq;q1F6~ۏ]Vsw<݋q3aqq1wmm!6t qqbC收~ksJbXmm)6FF.ĸSٸڸlNnNc`ݸ֍;66:ڸڸlNnNcx5cDlLeŰڸ۸KlħNjUv.5E画66:w~.Ćw66:بď|fbXmm-6w+wSwmm-6t =n{fwsw ݴnmq7q1png~FbTQ6PU6pUĆFoT1ۨmT:oTU6pUĆBmT1ۨmT=:&eTbTUkتt [l*QUlx?LUz?LUFUcFUFUcUfUjbc[#v)1^EmT6 jtNfQۨ&6t ߨF7mT6 F5jF5nH϶-*~S9Fun1N{fչbC~:7mT6 mT6mT6j?FVY1͋QïⱆMԋf5bCQ֍f5bCkkm6j Am0ۨ9s&B$C{"q><>n>c}Gl>n>c}[l>n>c`otq}Fm@qILnmz&Fmn1nԦuFmn1nԦuFmn1pNMm6ۨm/6:3Bm/LLfs #Z`oq?q1fs mOmoq?hQ_lh>Ql>Q_lX7S6s|HƃtAņuAZ74xxPlhAjAņ664xxHl|{/C ou!ĆbVq hCCbC@QmBmfX8%֍hxl1n1x\ë1"6K^j1n1x\Ǩ6sۈz?[ЛGuәq"z%F{oF{F{.u=6s> hOm7hmh=l=,9xV)9Yggα 2F'8w]btRu6:qemt6:mt6: Dmt2mtsA 7:Q6:mDy⟭P{VW"^q>ӃIzm6z~A =haу1FjFn'FjFnч֍>f}>{7>f}>{FjFnU}Y7^ƫfrA o﫥#bgPu16^6^WW6^6^WX7^6^5xx ~Ck/1^S6^6^3xx ~C b`x֍6^6^Ђ8F6^6^Ђh5j5׸%fs)A o ʏXnf)w] ׹ )9u׹ xxlun 3o'1P6ޠ60xx̃ޜ#b#=U7^j n 3b: Nyl n 3bomoPomm}6E^F_n/1}_}m6¾hF_Z7m6¾hF_jF_0~~{tMt}ᶔ?~551~~׏׸~k\?^nhgq&5o*oRomm tA F ?FF)-/_Voro>]mImi&&1ƛƛfora/1_il?bRRF؋ bFF؋ bF[n&1R.ߢ.2xx A -[foqoz;}[o~l-n-Xo1o~xl-ncHjcnco XS1n ucncX7P6poCx[)o9mb66ކ~#{o=ܷ66ކ~#6ަ66xsJm1Pi/:lc 1 Hm 4m 9%uc 6raN b>@jc@ncԍchd1u#6Q6qn1 jc ncԍ ֍A A`QNb Vuc06sF{l1 6؋``gS6s}Ȑw̏Z7m 6gX7к1lc1?1֍!fC!ٸ>)C!fCX7jFb U6RC6rCn1PjcPnc( ?>k2>k2lc(1m 6m 6~Cb㟥zGlzln7;Yw66~ÏuZ71xx ?)Pmm u7aføaNc`F0a0\10jc0ncSX7Q6qqCb W7m ?֍n 7m ?i/:lc817/:n1c7F~cnc1nucnc1pka1~ 1a1H~)61lc$1Oc`IHH=ŏsH:4mSo6Fm6a%ƻnKƻfr~ xok..@Rmm1p]j]wQFѽQfQQtNe1o1p ;aGm6F~ 1e1}IjNMfܗMm1}1nuchnc4>@f1ܳZ7Ƙm6s~ chc1=1p2SƘm6s~ EPc6py 7ޣ{fqy ?>}&=)u{fqy ?oGmg>﫽fs9+?֍ixl}n}>c`xxl}nc,ϔcUKXX6=2c1o11pk<o11Of㹍xm6ƛm6&Sc7&~cnc?1֍ f xóQՏ-V x4ژ`1ﭓ*Rm|m|1pCƇƇxoƇƇxoƇƇfrK1Q٘HmL4ۘmL.8LsDDҏDڋN4ۘmL.[DjcDn#'Wb|l|Dm|dޓ@Qm|m|1pN)m|m|1GGfq~m1Ih/:lc1 cv]N2ۘmLhc1lc1 c$jc$nc2/1&tcdnc21L{fx/mL6&mL6&~ 7&S6&mDVr"w{Lqcاi鎱c3c3c;ƾprv}161cطcsc;9~p1c|B=2S44şK:Hs]1\7%TSjM5n Ək)tM5\7Kh qS5n >YIU1?6~ b`1?6g}>fs}Lm|lFEk﷫=$'fExuA>O>><><~Ow;׃O}BSV>5z)ҧt|c`=փO">S|ߥƧfrS=c#>bTncj8%1lc*1ߓ>b*S6rS=~ 1ژj1ۘזTݘF4i4xN }4GL3ۘmLk1nLuc4nc_ۏ6Q6qņ x1]={6>{6lc:1]lN6sņttctg I/gg Igg Ign|f=c;a3Nlw766:l;n;c`l;nc./1g{g{m69 ky.}\\8^t.Em69 sfsF퍇{ً7fsߋ  >bC w~o=1n|Om|o=1x1}6qlAyߘg1ۘg 8̣s<[ULtwg><>_x=EGB_"~c`=lnc>W{[bWOO+7ۘṁjA ӚOk||8}tb|nc>W b|s:׋@w. 6p Ćuc 6p Ć6P 6p Ć6P 6p ,@PXHm,4Xm,A XhXghc!lc!21pmXhm#r˜{_Ne89X1cw?cKc9v[111111[[[[[eԸ*?sZEo^dqx[$5NָE׸ERt Ѿy-5n8YDk"s[p^ۋXXLm,6Xm,A cYLXm,6y XLm,6Xm,A S6s5ۧ|bUFW__ņ6~6~5UlhWjW__ņJmj+bonfbz7l7n7877fb`l7nwq$i- ;mm.6t <;=bC}fs mNmn;Cln!ln!stNln!fp\b?ƟƟbC'mm)6t |Oϟfr ??66 C$  %$uc K6pK >{>{lc  b%%_bDzֱ˽9/:e1uJ ?F166:)9/Ćgd62*1VuoZ76 b6 b66aoMmm7ب_=Lbh??bClcDlȨvea1mm#6t ?R;TՍn,5Xm,}-5Xm,X7Һlc) bv)lc)h66mD^66:W7Z1"6\k/1ƿƿfr {66R^e]F{ef˸epT):e2nc+@˨ef˸epTe2erѱWijUXNrrcx-VEѲŰXm,:XNm,7Xm,:֍r s̋BՍn0Xm;ǂX7Vкlc b  s,6VP+6Vp+%Jec%lc%RloJJcJlc%Rlhc%lc% bR6VQ6Vq> lc b`XE*U*.VQ6Vqbcr k&btnm *LwmsbCafF1M66ҹpWZi/lc5* b`6Vs ֍մn6Xm 86VmvۈZ㟭;Wӫٺ5Z1X}x>n kָx{ó֭O1k߾ q|;_Zr[ZZ֚)Xz`-k~ փ5XZ2 Rk6rFzmQCԝ@@6qĆ6Q6qĆutlcNlG6֙m6ݥ^\Ogf빍pwi'YO'YoXw1\O{f빍pwim6֛m66S2*+16lNՌ 6GE7 6ml66 Z76ml66 @ f bCslcblTFF666R66r^ ilc# bF&~ؤog7ml66 ml66ml66 ml66ml66 ml66ml66Ý^ͪLfpq!Crfnc3y9e3S6ml66ÝA 76S66sJa6 [6p[Ć6P[Ćuc [Ćuc lc %1֍fv甭tNj a1VjcVnc+܇gRKM}m{_6qĆkmt lcMlol3ml:)ۨmf۸pWcZlf۹Phc;lc;Jbvv+=svjcv0w?Fȝ{cvhncG8%;h߼lc@;f;> F;f;bcKVbTN4m:֍n4m:{1;6vr;ņ6vR;6vr]!^]jNE]f]PX7vѺlc ֍]f] >Oe-6~-XY^njcnnc1nucnnc1njcnnc1n6vm6{d{{{m6CYblc#c b`/c+6Nߖ8FbU^ڋ5m:){露lc/WlZ~vnmx] ^c^>xǐcS9e>nc_8%Gm3mw 1G{}f} Gm3mVcio/6t o/6t |Fm?}Fm~nc1Om7mOy15=`q8eo08mO1nun*6P6pʟՋqP)rl qPlX7Һql qPlN9H)6rņsAjAn=qȯ3Ć벯CfCPѰ\:$6\˥CfCn Su!C!x7Y!j!n8y]x1~07m6 7fbCq֍fbC@f6"gՊٺ#""fbiG"ExuG#fGqn?O㟭;B#Gဤ_y(1}QZ@zpփfGy=8P18Jm58mwz1޳Ʉ[f6q¡,1Z1"6Il|bXm6; 8F6qA +Q6qb#WBKLȤLLn#SlȤLLn#SlX72i462ņϬfRfqxߥzo0{oqp(K +8+qn82{Ziql8qwq8nq8!6R+m-ㄪ'h8aq8!6t 'h8aq8!6t 'h8aq8!6t 7NP'6Np']^jmzMOm6NCYb}Q'}Q'6Nr']A q8iq8 B bI)qӔ!svbRu6NqĆu6NqĆ{Z)S)cS)SixOXqZ8Mm68m@f iql4qޓ~4ql4qFlܞbQg3c33c33c~g3fgY/Ye,ql,q6ҽfg 8Km58mw1pN9Km58mzw Hs=G{sf縍sbCq֍sf縍sbC@稍sf縍sbC9qlqK8yZ7Λm6·CYbyyx/q):yn<8u"o?׃Xu AA,@zKAYD,"BXj#l#ۈ=jĈKƻhe3ۈ6ĆA#VqF1nj=fF'6t +⨍88n#^lx#^ՍxZ76⹍xc#?6⹍xc`݈u#l#ۈ:֍xj#l#H߾zbN xGB2#l#H:FCcXm$p bC3 LnF 6t J66DQ廿z,HTt3l#H:H4H6ņsJ"S6DcHm$m$r9ƢÓ"/w9,dv?FNn#1aSl96rr9ņsJN:4m:Im4m$ iz>Ij"[$m$qIbCDFF$6t Dm$m$qIbC~#H2H6r[>Wl /Fd|vd~\f\bC@\f\bC~#7rm6r F.j#F.n#h66mD^ܪnu#Fnn#1Fnj#Fnn#1MfbC@f rMTGF>|F>c`GF>|F>c)6qĆh>j#F>n#,6:3Bm/FX틆hl#mņu#LFl#mņsJ)a0:)aj#l6ņlb$+FF2,6t Lm$m$sbClcDl 4oف ŰH6ņ6ddn#}tY^F~j#F~n#1pNOfbC֍fbC S6s4y_(z-`Q( 6t Q(`Q( 6t Q(`Q( 6t E P6 pMIFAjFAn1fbC; 'z m6 m6 m6 cfoZߋQH)RlQHloF!BF!ch!/ZlQHlo6 m6R}-|݋Imp)bC@)FF "6t SR蜒bm K6R6Rb#%Xx1 tFan1(LfbC@fbCFaFؘ1x#U֖JkK5H6Rņu#֍TTn#Ulh#H5H6RņF*jmkp$QDՍ"n1(m:(Bm1(m:(Bm1(m:֍"F"FQ1kvU/FQ߆wp*jQ(*6t \딢fEbC^(Em6 FQjFQnظu7~ˋQLa5l1bF1c`(FF1bF1cx61"6Ű(m:Ũbf6"cgjEN$"&"Ex߇G$8{hqnއ^8٬Qwއ'g$yqw^G}ޗM/Y})ḟ#1V1vccFXiM2r cc8*;nu1vcN]cUcUccc5c8j:})!O}WBKyJX >*c`S<%JH=1.A+[ se+Rt KW\J'Ml1rϊi%F؈qitK3H6Ć{,it%l#H:H66Ҹ4c`?Fmmq%ņ<8ZGf%bC@%f%bC@%f%bC~$Ql$qH(-l؊$N轧A@! @BBMz4EzE]ttϚG]+g{7ٷ5kf4&%6FIhMSe(Q(I6d n$QRm$QlFIhFIl$ِ13FIF)mqQRy_)F)lِ1:\GR(m"2c)XJm6J )Rjdf =51J;놱QlїV(m&2?[W+Q(M6d ^7JúQZm4QlFihFilXk(#FX7ʨm6ʘ7SuJ2F&bwHwHʨm6ʘ7(mQ(m%zr(+ְeFYl,ِ1\XSlڞjedCsJY8U(m%2EBe6bΉD(F9rF9!c^E˩m6ʑ (mS(m#2堍rj wa?L wQ7apWp6Ɇ{Qw؋mcdC6ܡ w wlÝl|mmcf_oF 61(ᾉQ^(mW(m'2Q(Q(O6d n6*`ȆmT6*mT6* ۨmTPۨmT 27*@6*`>Y+S ы^Gm1D nQ6|̳6>Q6|̳6>ІچQl}aZ_8?UQۨH6d V*w+mT6* ۨmTTۨmT$2?]ڨQۨdîrVQI`QImQ<1F%QImQ<1pg UbhmT6*"S*A6*a6`bTsJe8TVۨmT&2QڨQۨL6d c3FWT16*cɆFe؆/ٸu;Ӵ#M _aU6|ɆmBj؆/ِ1 _ _l×l܆/᫶mT!%k&Fa QEm QlFhFl ِ17ǪoUQۨmT!2[ڨQۨJ6ߍλĨ*ߨQۨJ6d n*QUm*QlFUhFUl*ِ1xݨ mTUۨmT#31Q ֍jjհjdCkjp [MmQl;w,mT6 }U6mTp<[9мhUoVWna.{_աjӱs:ݪw\<#xvٺWWԠ{^ҏ,!z5قlA ݯA 25j5p=Ad YQ׃$BQCmQlrZĨ2/$Vh,|ɮFMl&ِ1VMUSm&Ql j5dC6jB56jb7+sib=f-cRۨm"2`ݨQ ۨE6d 6צ6jaȆmԂ6jm6_ڭIhnb3I~LچG6d 6 槶m )~pNS6Ȇ~ІچO6j 8/ omcdCu  lßl܆?᯶m [CjFm1MǙ tmFm!c3IᙤjdCFmoVۨm&2jq(oH&Fxm`dC{ZpO+@m# 2߷jFِ1h#@m#n}+}7d|#2V2V2lgok` 555ZƚX,cᖱXSX3Xee,222mkeZ,cRsQo(TpMqR1\D 4k\ qTd k@u 5.j@X5.Ad#$mޗM o6 !c/AjAFِ1 h#Hm#"2_oAAjAFy_ެ~bbuu6`uȆ"bQGmQl|MUm6 _TڨQۨK6N;vQڨQۨK6d ^7ºQWm.QlnԅuF]l.ِ1RڨQ&9=,`8mcdC0tpذ= V6ɆF0jF0ِ1 mmcFUMznԃuF=lِ1>]=OWOmQl|]m6 ׍zF=zF}1ƴcLnԇuF}l>ِ1Xg yT16cɆ}jdC6C6c Ƶvh l46m46  `@mрlFhFlِ1FF(SgL19%Dm#!2!nm`!dCF7B6B!cp!FFѐl$L`C\FCl!ِ17o5Thm4$2 ahhH6d n!Pm!шl, ̕HԍFn4Rhm4"27m46 ׍Fn4Rhm4"2_46m46_;yuh,FcX7m46 aXm1јl|1hhL6d h%c\=u#֍PPl#l|  װjF(ِ1w,Cw,C6BP!c mmbMash"FX7m46 ׍&n4Qhm4!2hhB6d n Dm F6eb5l\ÆmaadChE6°0!c~# ajaFِ10h#Lm# '/]ѻ.p8mcdCu#֍ppl#lF8m mmcd:ckbDw";jjFِ1h#Bm#ۈ 2_F5lFA6d 6"6"6:e4ٺPDSvix?gBMgyqiMw\<#?g{T}ϛzЌ>9fzD w4491\ "zЌD|hm4ShmDzdT&F0Бdö mD bpFF$ijmDBjF"1#HHl9&Fsc6=fsFs!c}pߢFsl9ِ1FsFs!cFsF7:žL(QfGmDaQdCu# ֍((l#l}t6phWeЗuICk# ۈ"21((l8޶gLhj-dCu-6Z`-ȆF X7Zm6Z -j-d#+=)FK4k${l]KFK!cgh-3j-dCIZIKFK!c~%Rm%M6Xppb%#ZԍhX76h!chmD [D}hhl#l|N66VdcK١&F+6_ZsiONi hE6d cs6e9'u VF+!cpVjVdC6ZA6Za1drΧAgRLwb6b!c^41j1F ِ1h#Fm#ۈ!2Sbl5(XF)&Fkm װ6ZcɆWka+_6ZcɆ{ְmhM6d n5Zm5цlogm6F6F!c~ 7ڨm6ڐ hmQhm!2S@m6`dcq{cbĊ2b{jF,ِ1x݈u#Vm#ۈ%2SbmĒ ׍Xh#Vm#ۈ#>[pj#NS:%Nm#ۈ#27`mđ ׍8X76Ⰽ8!cmĩmad<01⅍xh#^m#ۈ'2{_jF<ِ1xh#^m#ۈ'2mīmmh##v|#DXeee,2bko`hdlbjfnaiemckgo26262626262626}q/ j\q k\8 pKP׸\|7&k\q Td ^`KP׸<% W11Ś*6D!cpFF"H6d >%/Qm#H$2DDl#l3#:t391x= Agθt&2_t6:mt6V]["tgdmt6 mtQmt!2_tբFl ِ1x袶J6.z:~*/ /ꪶJ6d Gt}DWFW!cp]j]dC6B]6bF^MtSmt#2?# 馶 F6d 6צ6aȆmt6mt6vI31wݻnFwl;ِ1)6cɆFwX7mt6 mtWm _ /shJ5ud1nPm 2;{m6z mPm 2_6zm6zs,{)-z}j=dC࿡W{m6z  mTm$2_6zm6zR;ߎ}~EME6dc"*GmQm!2S8c8l$_hjRT16`}Ȇm6m6 ׍>F>F_{7Luۗl&j}dCu/}6b}Ɇm6m6 /Wm/яlxu6'=~j~dCSm#23m6 ~jdO}GLFhFl?ِ1xFF!cp﫿Fl?ِ1x诶llOv7>Ƨjb }} >Uln| Ƨjb Bm|m ,5 l 6m 6 m Pm 27~clcِ121H6E-\(l 6m 6 a1Pmc 1l@hc@lc ِ1@ 1|{ȻLAAjAdC6A6aȆApN1D6d nc1Hmc1l|{<,`X7m 6 )2Xmc01l {jdC`hc`lcH8OH[cC`1B6d N)C6`CȆX7m 6 ׍!!Pq%j1T33Tmc(1lPhcPlc(ِ1o: 4Tmc(1l|k(1Tmc(1lL,؄31 àajðadC6A6aȆ0X7m 6 o 6m E>pwM}n26262626262elelelelelelelelelele+BaS;|Fp pukpq2_S k7׸Td 5n8qé 5n +#7#6F`#Ȇp1A6d nc1Bmc1lomPm$-lؖ4)#z{Hlc$ِ1z{$\oTm$211I6d ^7FB#6Fm8y}<[;#lgp&L-3s ֈ>;0O.ٺL}?}s^W&=L}?`ߌ|v7Jp=Ew_`Fz0(x{Z(\FQjdNhh!cpjdCp=Zmc41l| mVm!mSWc11C6d c1!c}1p~lc ِ1hclc,X~iP1l|Q}XX!c1֍jcdC=XeUm%211G6~]!cXqj㰍qdC8q8!c1֍qj㰍qdC6A6aɆ'Lxxrxlc<ِ1\XO6lkxlc<ِ1xxx!c~c<1^mc<1l?MO&oL !c~c7&mL6& ׍ nLPۘmL 21ژ1lltSDgs1|6>6>'2O|99ِ1x֍6>6>'2_~m|9x9ƴM/D֍/66 2_dCk/ //Ȇj_`Fo1Q<'LTۘmL$2ˉ.'mL6& ۘmLTۘmL$2E'B6&bƐ[[ibL$؋NRۘmL"2`ݘ1 ۘD6d >Ls$I$!c9e1Imc1lx뢉19?Ɇ!mLVۘmL&21ژ1ۘL6d nc21Ymc21lnL6&mL6O2L(cS9elc ِ11Emc 1l|2SmL6 S)jSdñ77Z1i||c*pN 1ۘJ6d }0S6bSɆTX7mL6 )SjS/gK_%_m|m|I6d nKhK//Ɇm| m|%%ِ1%Ɨ4}zMiAසmL6 ?OLSۘmL#2S9e4lcِ1i4itՖ&t5}MWۘmL'27~ctlc:ِ1xݘtt!cpӡjӱd#rfI}{3 5Cmc1lǹuc lcِ1xݘ  !c~c1Cmc1lܒMn̄ucLlc&ِ1v&\Tۘm$23aݘ1ۘI6d N mTۘm"WOi1KԍYnRۘm"2Sf9e,lcِ1Y,Y,!cpYjd/pĘ-l̆6fm6f )2[mc61l||631ۘM6d ŏ6fm6 z1Ga59!c9eSm6 ۘmQۘm!21ژ1ۘK6t|kĘ+ߘ1ۘK6d ^7º1Wmc.1l|N 甹jsdC\hc\lc9`٭}YQybNyjydC6A6aȆ):e_}z.\UJԃ`=J}+2 v__A_E|W$B+h+dcqmcMXj dCpaa+P 6` Ȇal8c8l_#ɘ*lcِ1xXXH6/ob,6B 6b ɆXXH6d c.=BB!cp j 6}ľmǷ8Yϱ2222222222222222222e6vN.n^>~w_QzVع"-"u[k"q2~n-5n8"u[k"q2H]o1@Lb[ jdCb8-VXm,&2oblc1ِ1bhcblc 3wQcxy |ylc ِ1j \S-QXm,!2XXB6d 7XXJ6>mcS9eRlc)ِ1RTmc)l K7@m,6 )KjKedN_{mb,s>1/#)6aȆ¦ed6-SXm,#2`X XF6d _&Lmcl)ro,rr!c֍j˱dCr؋.WXm,'2SC6c+~`bp0 0  !cgٰ=+6V`+ȆpW=j+dC6V@+6V`+FiG6mhbJoTXm$2+aXXI6d >sJJ!cuJhcJlcdcӆ9#l/˺Jmcl."+ XE6d ncJmcl*hc*lc5䰐CLբX jdCuc56VcɆpNYXM6d >6Vm6֐ Y&g0a/NYXC6d N'ÆաW\SXm!2_îk5jk5dCk55Z?m[LnucZlc-ِ1ZVmc-lZxZlc-ِ1XXG6 z{csb7֑ [SXm#2S9e:lcِ1v\îSXm#2SA6aB?s61֋uzNYXO6d 9Ͱ[4?+nlQ؂ml!2[`آB6d >ls-!c9e Emc lTyC{[E VV!cpC{_[VV!c5VhcVlkA]k 5ZsiOdC{__ý66&2ܯ~55ِ16py._0g뾁ߨE|ca.sX#Q;\<77gd@&=F}Ͽ`75{w&] ~to`}M6ml#21A"zD|bMmclly#csOܔdVml6 aخN6d 6צ6cɆ{v1w/]7R{j;dC6v@;6v`;Ȇm6vm6v ;j;d;sةI6d >sNN!c9e'Svm6v #ةE6ү+ӮKԍ]nR؅m"2`إ E6d ncKmcl~#@6vm6v TEnn!cpjdCsn8V؍m&2حC6&{Z|wcS9elcِ1oGmclhclcِ1==^qi2L01֍j{dC6B{6b{Ɇ;νj{dCp>'q@6m6 ,31֍}j}dCs>8S؇m#27~c>lcِ1>hc>lc?وߖ21֍jdC0u#a~~!c9e?Sm6 )j6߇¾E,8h;d2v2v2v2v2eeee{)iY9yE%˖+-c,c-c7,c7-c,߇9@5n^µ믘?ND;ku;kq2耺58w@]wjaj\ng G+<C[ ٸs¤{OM7:{jdC0616?`Y>T16bɆm6m6 8mT8m"91u8$l6m6 {6aȆm6m6 (䌑ZoEQ>sߊo} ƷƷ"؈upذVm[l[~m| m|-yHu[X7U8L6|b&aoaa!ca>q8L6d : T6cɆm6m6~= fmbQ8m!2S9lِ1x8#!cpG#jGdcև)C4132GjGdC6BG6bGɆg> g>q8J6d n(qTm(ql8OqiLFsd6aȆA m6 )rLmql1h1l;cL:;NNm;l;!cߩm|m|G6d n;h;ﰍȆ|~qlsb'2vX8q8N6d ދqq!c~87m6 3q\m8ql>cwXÞkj'dC6N@'6N`'Ȇ8q8A6d ^7N@'6N`'{G3jqo ɓdñU.II޳m6Nm6NE ^7NºqRm$qҼ,ba%.*Il{ؼYEMp{ﱍɆ{a/dC|5^m{l{!ckB\](U ﱍSfib)oR8m2ċnu)ly'^s)8R8m2ċ|r SNmp:<[W s4"NEni&9vp\<?[wDNi7.>0⨏8q=8cA2&CV[gw g9׃3Q;8sB}GQ8sB=hl,rggbg~YY!cpgjgdC6Bg6bgɆalrox chm6Α Ĺ41Ή5Ωm6Α ssNmql9h9lِ1{}Ckqlxu6q^8mW8m'2a8q8O6d c=yy!cq֍j籍 d#&ui]P۸m\ 2 j dC6.@6.`Ȇm\6.m\6.s9EE!cpjdC6.B6.bɆalspH*ved %s.OYLK;w.m\6.u"S.9%l9['bpKjKlK߸q ll`Ɩ̛)b\ِ16~6~ 2Aml!c͜1Q$U etE/z6.c͹KS.ueesR6.C6.c͹K<'wpذmB_V۸m\!]A7~l ِ1xqW6`WȆ+pNq۸B6d \Rڸm\5grh0qUظ m\U۸m\5grE n*qUm*q՜1UqUm*q՜13gyqlT+pu Go6~6~$2#ƏƏdC6~6~TlfN woN)*Ə5s^{USLk߸kjװk漶aVo+*5l9-b~7m\6"q ڸq ۸N6V][ek㺘S9ul:ِ1::\\W۸m\'2qڸq۸N6d ͱYu 1pM:7  !cwvnwvnm6n ۸mP۸m 2 h l&lfI}Mb&3q۸I6d ^7nºqSm&ql߸ j7dC߇ mT۸m"ngzqK`qKmql-h-lِ1[-[-!coނ6nmܲ>0}ۖxܱݵdgo2eWCoG-cX=====e222222}T>>"mq&6<{[]nwjZTl-mukmq2n趺568aqwlx&7߁};!c;p/lِ1;;!cqGmql7M.FwyWm.qlf/3Æzm6 #=K6l w6bwɆ]h]l'Û&OnOj?a? ׍`Im'l'!cQa<͚*OOdCu'h'{dcʖ'*6132{j{dC9vOmqln:c8l9ʜ*=lِ1qOmqlN9؋bm6 }}!cpjdCu>q_m>38eś&νgq/o33ِ1pgɆal9c8lYRlYmg !_g uݹ_"~0OŇs/j;Bw߼R#ŵw7./{ =r{ʢ _\++~U_q={_aJd c;c E$B}įƯjbFnK?㲅b<p@mlFCl!ِ1:{*[ZdC=ChCl7&oݳgmmF6d ^7~u7߰Ȇag s8`Za )Amm<"mx$#X7m<6 ׍GnU ??Ȇ??66$j&'ƟƟdC66Tlhᰑ/©bhmmI6d > m'lhXx m3>3g3!cpϠgjϰdcM Pb am<6 xmFm l}{7jo7dCpxxK6ֿn؄o[Vm-lnu[l-ِ1xx [[!cxxG6N;v4nSxm#2a;ᵨӞRxm#2xxG6d <Nmlm|6> S>@6>m~cX'1˘e,e,e,e,e,e,e,e,e,e,e,e,e,e,e22222V2V2V2V2V2V4՘㐗ßO@6g>rCܴM!2O9[?r3Ox:o<[bi'R]<#?g>rC#7m(=:jYX)=X}?}#=nXc#=nX-c#jciF"y:511i4ji4dC4FQHm!2yjFm# lFh#Fl1ƴcLOOO6>6>!2 ''dC6>6>Ql|hOdcW /jobuӺi6biɆJiZ)FZl#-ِ1FZFZ!c=FZ؆ ٸN{.n|o ͺm`.dC6\  lÅlpچ B6d mm`d.01\o&sUp6\ɆW8mbdCu W WlÕlnBjF:hzM21҉֍tj鰍tdC6A6aȆm6ҩm6ґ HmSHm'n:Hӻ}j鱍dC6C6cɆm6ҫm6ғ )額j鱍 d#Rj#Ƞ@6d odPȀmd 2Ƞ@6d g01 jd'fbdk،p Qm##l{ьjdC62B62bɆFFh#FFl#X+[# Ȥ D6d n#Im#l| S2md62 mdRȄmd&G3jY#ȬL6d }G?Ffl#3ِ1%*Ffl#3ِ1hfh#Ffl# Y7L,Fh#Fl# ِ1x/Y6`YȆ//ʢB6d n# Em# lC#?[ ˪J6d g%8FVl#+ِ1FVFV!c9%+Um#+lxs+#`Ȧ F6d odF6lF6!c^4Emd6 mdSȆmd'MzEFvFv!c5lvͮN6d ^7ú]m#;l|+;]m#;lЗVs9ľh/Cm#lnu#Fl#ِ1FF!c~#Cm#lL߻xQ#sN1gdr {NFN!c39Йܜj9dCk؜p Sm#'l|N mTȉm"?ZebF.oRȅm"2_\j\dCu#6raȆ\F.\FnqIR&FnbuM6#uϭM6d {_}Vȍm&2ȭM6d >6rm6ƋkGob)nyچF6d ^7`pSp6Ȇ)np⦶m )nІچlH#7~#Fl#ِ1}qCGm#l|_4ͣC6d N`h#Fl#/٨NZ51򊺑֍jydCu#/y6byɆF^X7m6 )yjy|d՘?jbsgr36aȆa)n#=bhm6 mSȇm#2EA6m8wI*$凫j"w$5"A~st3Iϯw\<#?g{_}zP%%wk}DGP/c"3 zP|ߢܷ(Q׃$B=fhFl 3# # >FAl ِ1~gAYPm Ql|(EAFA!c> QPm Qlޗu~%&F!羅ȆGmA=<<BjBdC}D!GR(m"2Q(Q(D6d G6 m6 >ɨ,Mb0( m6 Bu06 cMo!b90S m6 .Cu0QXm0Ql/&F1sJ"F!c}"pߢFlِ1~gYDmQl(mQ(m%?}(*l6m6 ?{/ U(m%2Q(Q(J6d n(QTm݆///o8Q}▱RҖ2r1w˘e2e󶌕UX*Z*Y*[|-cU,cU-c,c-c5,c5-c,c~1XmX@1bTR^K\TLF`oTL]WjazXg rbhk\1\Q1x+k\1u+k\1q2q`+qWlsaO&Fqa8Q\m8Ql|߾8ܓ+Q(N6d 7}sqFq!c8Q\m8Qlu6cJިF lِ17xc16lP(m 2%`(Q(A6d ^7J@%6J`%={gb%%T(m$2%a(Q(I6d SŔT(m$2ߋ) mT(m"*.-7`(Q (E6d S ŔR(m"2Q (Q (E6d ^7JA6JaFVK61Jo*Q(M6d n4QZm4Ql|N) jdC6JC6JceȆO芌KeD/Ze6`eȆaV’UM_&U 2F!cQ֍2je2dC6@e6`eZo%ea(Q(K6d ^7ºQVm,QlFYhFYl,ِ1:,QVm,Ql0&F9Q7QNmQl-{rj對rdC6A6aȆ{rF9r؆;٘5~v.lCj؆;ِ1 wh]mp'2mmcdC6ܡ w wlÃlls|P!)p⡶mx P6<Ȇmx@j؆ِ1xmxmx`drΧAgRL OQ7Qۨ@6d _&QAmC6]7|6| !cp>ІچC6d >9Gm!2>ІچQl,Ĩ(E+}ъjdC6*B6*bɆmT6*mT6* ۨmTTۨh8Uyx`U"*ET0O=[W sUR;dw`.{(*~%7.yl5g [b*~e\*ݗ1~~*zPTZDe\*׃Fe؆/p͙;uWU6|Ɇ}aU6|Ɇ-|ᾅچ/K6d U6oĨ#ٺ*dY?SmT6 UQۨmT!2_V3I*F!cQڨQۨJ6PKUaݨQۨJ6d oQ[TUۨmT%2_VkӪjUdCu*QUm*QltgZ(F56צ6aȆF5lِ1jF5jF5!cQ ڨQ ۨN6PabT6C6cɆߨQۨN6d >TsJuFu!cQڨQۨA66\^Ĩ!pNQۨA6d 3ƜMYFF)*F lِ1F F !cgh5j5dLʥ_:y5FMFM!c5՚j5dC6jB56jb5Ɇal>`b 56jbƓZnbsJ-8Rۨm"2Sj9F-lِ1ZF-ZF-!c~QKmG6rߖ~|꧶m 66 ?!cp~ІچG6d nS6Ɇo~{nú᯶m 66 !cpІچ?O6d oCjFmbWMZmĤFml6ِ1FmFm!cpjdCFmFp|y#@ԍX76!cpFF@6d g6!c9%Pp| }FExYXZƂ-c,c-c ,c!FƖPXXe,2akjkf5EYZXZZƢ-c,c1֖6XXe,}@qsvϜm(ہpqR1z;5.׸@q2fk\ qTd ^a T׸@<] 3kb AFFD6d n#R6Ȇ{ maAdC}sm!J1Ĩ#z:7QۨC6d |SGmQlO짎Flِ1x\ڨQۨK6';oebkpMUWm.QlF]hF]l.ِ1R)u6buɆ町F]F0?{!L`Q7aV6Ɇ'mcdCsJ0S6`!cpFF0Ql{lnípm6 ۨmSۨm#2`ݨQۨG6d nQOmQl}gbh}؋Wۨm'2S9F}l>ِ1F}F}!c^>Q_m>рlra{h pNih@6d ^7@mрlFhFlِ1x/h!˽a^! Q6BȆF!j!Fِ1:%SB6B!cmm` Ʊ];&>619!Sm46 ׍n4Thm4$2hhH6d ^7B 6bƃ;&F#qFl ِ1xM6`MȆ&F&F>"M0g0aȆաW\塶00l#l.lF6lˠ00l#l|3 $ajaFِ10h#Lm# 'S .$jF8ِ1xu#\m#'2mmcdC6¡ppl#llϕGw#fGmD`dCg#Yl#lFmD ~@6"6"d㢧11}p%Tm)єln4uFSl)ِ1xM6bMɆצMjMfd'K61 ֍fjͰfdC࿯ v3fF3!c ֍fjͰfdC͠fjͰH7$m&Fx FmDbdCu#֍HHl#lF$mD )FF$ќlHW&FsLɆmohN6d ڜlض]m46 hm4Whm4'2SC6cQd#][M(oD~#Jm# ۈ"2QnDmDaQdC6((l#lFm n")j)F ِ1h#Em#H!2+Rl=؞!^ahhO6d δ'vF{l=ِ1;$;$6cɆm6ګm6:+Kabt=fcvPmt 2S:9Flِ12:mt6: [t6:mt6:C?fbtu#6:bɆaXg 6wOCk#ёlFGhFGl#ِ1ڴ#Qm#щlr{"`褶 D6d 6צ6:aȆmt6:mt6: )Njd^µM΢ntuFgl3ِ18g G'*Fgl3ِ1AtYm3љlFghFgl وw?G}u};!ލ{}F BH DHH  ^F F/\k_3{>ٟ󻝯}m311֍!jC!dCucC6`CȆX7m 6 a@C6`dc:7Wx΃چ+J6d ދ^Ump%2 mmbdCupUp67t*7jCdCuc(C6bCɆm 6m 6  m Um #801w݇w݇m 6 ?_Sm #21 1 F6d > 6m 6;W^ᙉ1\a/:\mc81l|NjñdCpp!c5phcplÍl$ҸGM|[sSp6Ȇnjn؆ِ1xpuMm p#2nІچ1l<{[)o!c~c7Fm6F =~=Bmc1lhclc$he)cӆِI6O}ܐ1I6d >sHH!c1֍j#dCHhcHlÝl pu w wlÝl|Nqsچ;N6d o~]mp'2mmcƜ"MQν/!9l1 E6d ^7F1Jmc1lnuc(lcِ12 1 M6mv<61FuhN1M6d ^7Fú1Zmc41lh~hlc4ِ121C6N6p<618m?1d E䃌1jc1dC6@c6`cȆm6ƨm6Ɛ a񏉁lQm%/_qu61Ɗ~c,7ƪm6ƒ )c2Vmc,1l|N 由jcdC6ƪm6Ƒo{;6Lq̱q̱qj㰍qdC6A6aȆװv8lcِ18hc8lc<٨FE16cɆpN1O6d ^7ú1^mc<1l|21ۘ@6qg1A)2Amc1lnLuclcِ1  !c1ژ1ۘH6Ʀ.؅EݘDD!cpjdC6&B6&bɆ)j6Lr~T&i1I-b]xvIIjœWw~4 nMRIo.]$=d :~7YԃOVɸL/c$eSdr`&L`291x= dɸL&2j)dj'7S\S\S6`SȆ)p1ۘB6d nc 1Emc 1l|s 1Emc݆ܗXqy6,9Y<,c-c3,c1/˘ele2kemc[Z,c,c "bXele,222rTqh4US7U]7jag{$=U]7jkTX㦪kT\R1:z*qS5n*M4i4!cg`Z}c1ژ1ۘN6d ^7ú1]mc:1l|~:ܷ1ۘN6d >L6mL6f Ͽ.3Ĝ2)36f`3Ȇ X7fm6f 3`1Cmc1lǹ6fm6<ƪT Jbx 놧چ'I6d ^7n᣶m >Q6|Ȇװ>p 룶m  hGm%-Ot\56n? _)%4|6| _!c|ytj؆/ِ1xuWm%2_Bj,1gژDݘ,Y,!c1 ֍YjYdC3ς3Rۘm"2Yjd#01f~c67fm6f ۘ mVۘm&2aݘ1ۘM6d N mVۘm!'8~Ę#X7m6 ۘmQۘm!27~clcِ1ws9js ?qqXO ?X76 ?!cp~ІچG6d ^7`S6Ȇ᧶mAW=M Q7aW6Ɇ{Q؋mcdC?76 !cpІچ?1ld-.y&\Q7º1Wmc.1ln̅uc\lc.ِ1\\!cu\hc\l#lT]MQ7`P6ȆEhF@6d >9%@m# 2mm`Fz_11916摍7%mSۘm#21ژ1ۘG6d ^71Omc1lِ1v>\Wۘm'2jdce5J51~c7m,6 ׍n,PXm, 2XX@6d /XnBu똗%̷u Iuj "œw[,T;Xhw`.]ۺpX w\<?-|/ y┾>54Mw?׃ 2+\vA91#?"p="2AFFl2wc0/R-a"lcِ1E"E"!cpEjEdC}"hc"lc1ppb;X,ŰXXL6d G,bb!cpjdCuc1Xmc1L6l|82>, gmcdCsm6`!ci026`!c8FmV6 _L%bb ܷXXB6d >,s%!c֍%jK%dC-6m,6BFo:>.mb8ٷ!n~!!j!Fِ1l#lMRFB6d >@!j!Rkf$ib,{ZKRR!c3@3@m,6 X m,UXm,%2KjKed=U751yП28\IJ?ej˰edCuc6aȆepNY XF6d ^7A6aFku21;yGx9׸ٞj˱dCHʶY 6rr!c^t9Em,6 Xm,WXn88z"̎P9+,capXele,2e[m[cXZY[b-cq Mxfϖm햱]ݖaB9>u 55.ԸPqEnYB5.׸Pq2BqƅR13PL'T]Bq 'c k\ƅoh0(7c8m<m lcِ1z3FP-'* lcِ1  !cp+j+0N{&FmmaadCtap.Lm# #2`m mma+ ibf+JJ!c93F"_Xm$2XXI6d ~JhcJl#lE&FxmcdC{p7\m#'2mmcdCáppl#l\<ݭ#BԍX7"6"!c?8c8lAEmD`dC6"l#l|.ڈPۈ6V]~`bRXm"2_UjUdC{*U*!c X ۈ$?#RԍHX7"6"H!c$eS[$ٰMmjF$ِ1:%S"6"H!c~#ڈTۈ6Fq*71D݈u#Jm# ۈ"27`mD )QpNRۈ6ȆmDAQjQjA' \21VodVodVm6V X mVXm&2_ Wm6V X mVXm!ԟ5䞉FSu5!c~c 7֨m6֐ ׍5nQXm!2Xۈ&+oĈ6hhl#lnDúmD ׍hX76h!c}hh#Zm#ۈ!J ]pňF 7b6b!cFF C6d ^7b`݈Qۈ6bȆm@1j1Zqv]LnucZlc-ِ1xX ZZ!cpkjkdC6Bk6bu=9Lunuc:lcِ1xX:u:!cp렍uj밍udC:hc: G^cjn="E'~[:Xv\<9x u_w\<ݩG| yI*ddŊz AzKw_g3bbq=%2PDZD,$B ڈUۈ6Ɛ#J71ℍ8h#Nm#ۈ#2+`Sۈ6ȆmAqjqFِ18h#Nm#@6=wi z pؠ@6d ncAmclhclcِ1s  F~~}{FF!cFبH6d nc#Qmc#lnl66ml66S.<$m6ml66 `Imcl&hc&lcِ1M&MFE E6d ^7vKmcl| إ M64&nac7[mc7l|c7حM6d onn!cunhcn0{"r^>~A!a/#c_-c-c',cYNZNYN[XZY~]]]]]]]]j\?:m'u#~k\P1LQl;Q׸='cok\P1xoָ={Ɇ߽L&^ T{6b{Ɇ翽p۫K6d nc/Wmc/l7 mU؋m#' m6 ߦW16aȆ{}7ڧG6d ncOmclky&~\p?|._mc?ljdC6C6cɆ~Ao019Sm6 ìpptžq8@6d >s!c~q@mql \ѦqPa/zPm ql]]jdCu 6bɆ;mT8m"%~5qH{16aȆaGP6aȆm6m6 )Cjdckbsa8V8m&2f|>3>q8L6d n0qXm0ql|N9 mV8luo~"~Q.\< xu_~;0Oݺ_ӝ_w7O.Ϸu{Mi{wDM?2#>\G`yD-GHhl(寭|Mb8 +QQ!cgGjGdCςjqTm(ql=Q1qޠ⯃Lcnu1lِ1x81c1!cdma_ MU c1!cpǠcjǰ_ƛQ7B2D BmmJ6d nWhW__ɆƯn++ِ1~ƯjbF$ӕ`bsq8W8m'2q8q8N6d 86cɆq Q㄰q8q8A6d ~P8m 2Qa#b)q8A6d ^7N@'6N`yW7Mm7l7!c}oja )97߰Ȇooja'ƤuLhb'~II!cg'j'dCsI8T8m$2q8q8E6(q6qJԍSnR8m"2q 8q 8E6d nqJmql)h)l4{t_6d(6NcɆ{Ӱ=q8M6d u}V8m&2q8q8C6nvβT]XÞk3jg3dCu g6`gȆm6Ψm6ΐ g3jgd#ɽE51: YaYl,ِ1x8 YY!c^,EϪm6Β 8 mU8m#G% N8'ְ9lِ1\ÞS8m#27~9lِ1s9sdQⱩ 11~w)EɆ1ƏTmmN6d ^7~uw߱Ɇmm;;ِ1x]mwl<db&yN9)6cɆΫm6Γ 8mW8m'2EC6cȆoO31.8qlL5ڗn\P۸m\ 2S.9lِ1  !c9qAmqlĬst+㢨aݸq۸H6d mEmEE!cpjdC6.B6.bnĸan%a)6.aȆ%X7.m\6. ۸m\R۸m\"27.A6.aƳ#hb\u26.cɆe q۸L6d n2qYm2ql߸ m\V۸m\!;Whxr>Oq۸B6d u}]Q۸m\!2m\6 sڸq۸J6]Wt㪰qڸq۸J6d W_U۸m\%2qڸq۸J6d >\6m\6519Sm\6 o\6aȆ߸߸q ۸F6d nqMmql2㺰qڸq۸N6d uuu!cq֍jױdCuhu |>D=?,c7-c,c-cw,cw-c,c-c,c-c,c-cO,cO-c,c-cZ^X^Z^Y}}}}}sj\oW6ng73w׸Td 7߀} uk q2.x>q7pA5N Xnk {s|ۺ"u̜gzEaa.俋w}j'g˫;po.]<΋{{t/żzл)߄ςoM\nݗ1x= M$2ynB7"nzpD|}ڸq۸E6>T~biopKmql|oܛq ۸E6d v R۸m"2+nA6naF#w?K1n jdCu66ncɆm܆6nm6n nC6ncwFm] ㎘S9lِ1[Q۸m!2S9lِ1rڸq۸K6z9;X܅돻jwdC6Bw6bwɆ]X7m6 ׍]=1vS{n܃u=lِ1{={=!cq֍{j{dCuqOmqlLa 7~}l>ِ1}}!cpjdC}h}l8_vLɼ&!cuNyx@6d >#Cʟm<6 )Lml3h3lِ1g3gsA6x.sX7m<6 {{\m9l}{jϱdC6C6c %Jkb)ְ5jb ׍?aSmOlO!c'mmI6d o m'lk^ x! X7^m6^ #)#l؈Pxm 2xxA6d ^7^@/6^`/Ffzlbu%/6^b/ɆKX7^m6^ x mTxm$2/j/WdRt-aJxmRxm"2=1%oJml+h+lِ1+h+l/a21s_pNKm/l/!c_ja  Km/l/!cpAmm&6ZԍװnVxm&2S;c8l~kl5ِ1kZm5lkhkl Xay &nn7!c֍7jo7dC069c7Fbhm6ސ o7jodcL7>&[1s[[!c^-Eߪm6ޒ ׍nUxm%2_6ުm6ޑkn~_Dx;w;!cpwjﰍwdC;oSxm#2xnq{5k曤$Z{s$]oC' j9Iz~w\<?$ <'A`A}?zv׃@">zD|6>m|6>|~r51> jdC6>B6>bɆm|6>m|6> m|Tm|2t(Sl&'aImɜ"b>?>m|6>s_D nImɜ"b'h'l3٠BvX|jdC6>C6>cɆm|6>m|6>  m|Vm|1g݊Xr E?/s&b1//s&Ӫmb _6m8}u;E 8#ϑ22222222222222e,e,e,e[X&Xf˘e,e,e,e,e,e,e,e;Xn=j߶#}#$ou$ \Pk\%pAo{%pI?1L˴@5O 进%M.|K濄j dCQB%THm$$2(FBl#!ِ1xoHHD6~еp>hKD6lm$6 Hm$RHm$"2HHD6d Nm$RHm$&A_NPH,FbX7m$6 H m$VHm$&2HHL6d n#1Xm#1lDjV٧Y7̻IȆ$jI$dCA$qAA$QHm$!2= NHB6d n# Dm# llKc# ߋIbm$6 H m$UHm$%2IaHHJ6d o$6m$6F419)ۺdd E726aȆ):%F2l#ِ1:%\$SHm$#2 H HN6.ػ\# ?= :=Frl#9ِ1lWrFr!c֍jɱdC%6m$6R HfbsJ 8PHm 2ES^4F l#ِ1F F !cHHI6# .=LHI6d {J{JFJ!c9%%SRm6R H mTHm"ibf]`braTdcMvI6RaȆF*X7Rm6R D*Q*TF*!c3RA6RaF*?58H-7RjdC?TjFj!c9%5SRm6R j4dԗ^21҈^4 EӨm6Ґ ׍4nQHm!2f=3NHC6d >6Ҩm6ҒڇϘhbFZoUHm%2HHK6d ^7ºVm#-lFZh#FZl#h='hh&F:a#Nm#l|+JHG6d ^7Nm#l|_4Nm# ݾmPahooȆaltqp8} ~Ckl!cp@ߨm|m|C6d nhod51ҋp#Fzl#=ِ1;j];j6cɆpNIHO6d ދ6ҫm62 m_hbdu#62`Ȇmd62md62 mdPȀmd 2 jd#pG&KMFFh#FFl##ِ1x/62bɆ甌pNɨH6d WFh#FF G^ߺ*Vx0} E|]xv>WV[s5} b;zy|12=LpO+g }?_dR;ȄA&r c"+2Ed 14Im#la‹X#ȬL6d Gd}DfFf!cpjdC}Dfh#FflÅl8^8ppQp6\Ȇ .j.؆ ِ1sEmp!2Nmm`YƽEebd=fQdQȂmd!213Fl# ِ1xF,F!c鱗@Y6`YvLFVh#FVl#+ِ1x FVFV!cpYjYdCsJVh#FVl#HcEلlF6lF6!c ֍ljٰldCededSȆmd#2 Ȧ N6e)#x>_ͮN6d n#;]m#;l|";\fWȎmd'2ȮA6d &Fa#Cm#l|Nj9dCsJ8Pȁm 2_6rm6r_GfbsJN8Tȉm$2>_ͩI6d n#'Sm#'ln6rm6r}cbRȅm"2`ȥ E6d oF.\F.!cp\jF?ydb|'{_ߩm|m|G6d S7z8c8l<&.fѯbhm|m|G6d o|66#2wFnJ{p&Fn{_]}Vȍm&2Es^4Fnl#7ِ1x FnFn!cFnva.8χѝ#8#|B–"b▱RҖ2r Jʖ*jꖱZږaP<{_|F>!coom6 mSȇm#2_S6m6򓍸?,ؐ'_m#?l7 4̯O6d 8?|f_m#?lݳF~F8Pη&FoFF!c}pFlِ1>]OW@mQln6 m6 z&?((l6 m6 aQPm QlFAhFAl ِ1xQ(Q(D6n9Ncb6 A6 aȆm6 m6 (mR(m"2Bjdէc21 g?᳟jdCsJa8V(m&2_kjdCu0QXm0Ql$=_vLIx|Flِ1"O"F!c芨m6 (mQ(m%g7}QTa5lQFQ!cpEjEdC6BE6bEɆ6m6B풮W(&bpN)Q (F6d nQLmQl|(Q (F6d nQLmQlTvt=uMbN)jűdC6C6cɆ{-Q(N6d n8Q\m݆#o1̷u%j%"œw+P;(aw`.]ۺp(%w\<xz֕$QWoi$%w$%|mZMK$91x=( AI$2O$QRm$Ql H{#J>F)lِ1RF)RF)!ci)6-Q (E6d (mR(m&+E(-J=jdC6JC6JcɆm6Jm6J a񏉁lV(m!>sQF(mQ(m!21ޢFl ِ1R)e6`eȆ{2F2FYr O&FYoFYFY!cQ֍jedCkӲpmZVm,Ql|N) mU(m#T 31ʉ~7ʩm6ʑ {6aȆrpN)Q(G6d nQNmQll0(S9Fyl<ِ1996cɆpN)Q(O6d nTsJ F!c^QAmQl\:pQQaQQm"QlIVlئjdCsJE8TTۨmT$2jJdy㷥LJghJdeW־WRۨmT"2E+^F%lِ13Jp7F%lِ1W%hF%l2H0lZ&Fe|2|ZYm2QlIEd0Fel2ِ1R)6*cɆ٩ mTVۨmT!*118 ;UȆy+V~XEm Ql**jU*dCWWQۨmT!2QڨQۨJ6}z=FQUa5lUFU!cQ֍jUdC딪pRUm*QlFUhFUl( Е&F5bF5aFYeQMmQlߨjjհjdC6A6aȆmTSۨmT' f aQ]ԍnTWۨmT'2&:&Ful:ِ1FuFu!c=FuF Aǚ5{_n [ɺQCmQlnԀuF lِ1F F !c5l hF l&O[5Eݨ FMFM!c~3F9*FMl&ِ1:&\Tۨm$27jB56jb!"vuܔZdaz-ZF-!cQ ֍ZjZdCu6jaȆ7jA6jaɆwdFmQ[m6Ql;;jdC6jC6jcɆFmvaЉ0{>L9u-c,c-c ,c[ZY[ƚXƚZƚYƚ[ZXZZZYZ[XZY[:X:Z:Y:[ƺXƺZƺYƺ[zX~Sj"5ިk\\P1Wu5quՁ558u`quWlL}}judCՅUۨm%2¾F]l.ِ1F]F=MznԃuF=lِ1{H{H6aȆmԃ6m6 ۨmSۨm'G[;Q_بmWۨm'2QڨQۨO6d n>Q_m>Ql|MUڨQh@6.:ޱ51wMwMm46 @mрl]]j dC{1 j 6y}DS+̷ujZvI{[|v݁xrvo뾇bw뾇{=׃t?fy> C a=h q=hHw_돆pP! Ɂ j q=hH"d hhD6?h$F24Rhm4"2#>F#lِ1\6aȆFF#FFc]ƥڴ1\6Vhm4&2ahhL6d n1Xm1јll m4Vhm4!L#>D)MDm фlFhFl ِ1;M;M6`MȆצM&jMdv5Icb4sJS84Uhm4%2hhJ6d o4FSFS!cKBM6bFk{Lfn4uF3lِ1~g3&i hF6d o [4Shm4#2EA6aFgfb4Fso4Whm4'2ahhN6d ^7ú\m9ќlmm4Whm #|nmbaaPhm 2_j-dC6Z@-6Z`-Ȇ{F FK1MS -E-6Zb-Ɇ!i !ihI6d >sJKFK!c^%Rm%ъlfM1]I`h hE6d >sJ+VF+!cpVjVdC6ZA6ZaF]BʛEh FkFk!c$176ZcɆpNihM6d ދ6Zm6ڐUfbﺷﺷQhm!2m`hhC6d n Fm цlmmQhm%\+LRh+ְmF[l-ِ1xh F[F[!cpmjmdCu-Vm-юlLv.۹߻lhG6d oShm#23o۩m6ڑ vjd7~F{l=ِ1uu6cɆm6ګm6ړ )jd~kz71: : :mt6: ot6:`ȆpN頶@6d ^7:@6:`FJ}v51:֍jdC0hwg n[N/U FG!cpjdCu#Qm#щldwn$;=NjNdCuuRmt"2 褶 D6d nImљlϺl&FgN )6:cɆ3]jdC6:C6:cɆFgFQz9ACM.bN.j].dC]F.F!cp].j].dCu Em ѕl4_aQ&FWQ7ºUm+ѕlFWhFWl+ِ1FWFW!cFWF7 LnF7hF7lِ1:\tSmt#2_vknjݰndCuMmѝl uyŜ)6cɆFwX7mt6 ׍ntWmt'27C6c=ƔՆibpCmуl|_A6d |CmуḻFvc~p~T&X-~P.\<7I?vIVw7O.vj=A}'P?,0z>'#z~O\zݗ1EOoS'=ɁAOXzE'1}3Sm݆ܗد}"φqr>GoXX_X?X؏,c,c-c,c-cC,ca17H˘elelelelelelelelelelelܗ^TZb:p/8R׸^'c~zk\/\zQ1xk\/uk\/q2q`륮qכl!^{~Fol7ِ1FoFo!cpjdC譶C6\s.GmQm!2ިFlِ1:m6 @}6`}ƭ%Ě}E}6b}ɆF_X7m6 o}6b}Ɇm6m6WC:NZ'F?X7m6 mSm#2`觶G6d wgQ[m'I+8~/FX7m6 mWm'2诶O6d c#3ÆO̼][mH6\>{zdX)?mmH6d 7#ܛQmGlG!c^G؋##ِ1x֍6~6~"yEv:jb$Onِ16~6~"27~Oj?a?  Im'lc٨Sם&gal =nK1@6d > s!c9eSm 6 m Pm $LcE^t@lc ِ1x@@!cpjdCp> v@딁jAdK-\319B a{x lcِ1A A !cpAjAdCp~l Rm &61~c07m 6 _4_4Xmc01l`hc`lc0ِ1`hc`lcQ19 S_w9Dmc1l!jC!dCg g Qm !2S@C6`d~!OU|? rUp6\ɆW8mbdCu W WlÕl|Nq6\6\d#|ئoM o %OC1J6d nc(1Tmc(1ln ucPlc(ِ1x m Um #kww=&ajðadCH*bom 6 } {_6aȆaltp0?Zðdc^c11N6d ^7ú1\mc81l|k81N6d c3FI"U ؆81M 7a pSp6Ȇu亩mandC76ܰ 7!cf 7a[ ma#}ŕ!l6Fm6F ׍nPm 2٨a91A6d cg ہN#6F`#s&1R mTm$2#a1I6d S78c8ld+Z#dC6FB#6Fb;kR61܅ wh]mp7_D/wޗچ;n1:5k8IU wl|%!b~j(1bߍ1JmRm"2FR6Î"v(lcِ1Q(Q(!c16P+W16FaF!cG01F=p|hlc4ِ1x16FcɆa:) ZdC6Fm8>TmX-ƨE0Oŧp~[7<&.fѯ.u0\<9_mw.cw\<տwyqtǨ\=oɣ=U b XX2ca=v0׃@0sE}g S]>W1"z0DX8aoTx:&81Ws8q8!c>WƩm6Ƒ mSm#2F1Nmc1l8o+ Mxhcxlc<ِ1xx!c>3FᎳ\Ckc<1lxhcxlc;A-L hclcِ1٥٥6&`ȆmL6&mL6& ۘmLPۘmL$.OigbLt>{7a' 26&bɆDX7&mL6& hq|U D!c~c"1Qmc"1l,Ę$O'mL6& `/:Imc1ld#Oog V%1 ۘD6d ^7&A6&a꿛o{:e2\LVۘmL&21ژ1ۘL6d q3BW16&cɆmL6&mL6mS Ę"~g ݞ)jS)dCNNQۘmL!2Ywp]yD߼_ژmL!2?p 1Emc݆| _;Fߎ3;ZfMͰyZƼ,cޖ1˘elelele2ok ͳZ[XZƂ,c,c-c%R2r0S-w PiFf*FfM5n*8׸MU׸M'cPQ4l_ָM'c3@7U]oٸn&4x9Sm$2nxmxbdC6< O OlËlZ ٴ&7`᥶mx  /X76 /!c~ ^j^؆ِ1<11 / /lÛlԡ517V6Ɇ7j؆7ِ172o olÛlnxCjLqj1Sō36fb3ɆLX7fm6f ۘ mTۘm$23j3 ѻ\2V>†᣶m 6|6| !c^>j>؆ِ1ޗ᣶mye+zQ_؋mbdCH*b$16| _!cpІچ/K6d >Bj,1}o61f~c7fm6f ׍YnRۘm"21 ژ1 ۘE6d \p1Kmc1lzf1[ԍٰnVۘm&2FRՍjdCloVۘm&2j9d#j01戺1֍9js9dC9p2Gmc1lńuclcِ199؆وLgR ?Q7`S6Ȇ'NچG6d 76 ?!cp~ІچO6]1/lCj؆?ِ1xu_m'2nmcdCCjv:+][7$s"E'u~p~[7Oѯ.u0\<9_^m\X\7O.`Oj=sq={~PAW Gݗ17\ȁ("@-"׃!czmm`ƻwmb6A6aȆ1ۘG6d >W̃sِ1|Q21 j dC6@ 6` Ȇm,6m,6 w.6m,6-Otlb,6B 6b Ɇ{х]XH6d nc!Pmc!ln,6m,6F̳>Lrb AFFD6d ^7`R6Ȇ{ ؋maAdC6 lcqaⱩME}E}EjEdC6A6aȆ,Im,6 Xm,RXm,&CW&ܑ4XSubb!cubNYXL6d nc1Xmc1l|/|1Xmc1L6 u#֍``l#lF0m )pN V6Ɇ=&m,!sˎ)7DDmc l|NY%jK%dC؋.QXm,!2S@K6`!dc["z؋m`!dC6Bl#lnm )!FFl~F c7~cRlc)ِ17K7K6bKɆm,6m,6 ׍R2ArZX&ZZ XF6d ^7Lmcl]{ej˰edCucLmcli'}&rQ7ú\mc9ln,ucrlc9ِ1x6cɆrhcr0_ÄZXa [",c,c(jXe,2222kmmm[6[ƶX~mmmJ5v\G6B䆺 U׸P\B| ۡk\(8׸PXB5.׸Pq2Ba U׸P< ]>?mdCcXoj+dC0_wg a}|Ckcl hc lcِ1X#IWΫa #6°0!cFFF6d 79Lm# #2aFFlЉLb/f%܋YXI6dJ+6Vb+ɆJX7Vm6V ׍JF8(\6ELή&F8s3m z;\m#'2ߋ {1jF8ِ1ph#\m#ۈ U뷦!FjFِ1l#lFmD )FFl4=)WLUUUjUdC*oRXm"27V~c*lcِ1;jUjHū]MHQ7"a݈Tۈ6"ɆmDBjF$ِ1x݈u#Rm#ۈ$2S"HHl#lPnbD9FOӈ"/S QjQFِ1Q((l#lhFE6d >Aekۺ2uujvIŻ:[ jœp~[V껿~SmjxWj\=}y@a 5bs \kp=XCw_55!2#>bZ\֐k5jkhGo#Z{ =Vۈ6ɆE}jF4ِ1hh#Zm#ۈ&2+hhl#lxĈ=f 1c6b!cFF C6d G>"Fm#ۈ!2_@1j1ZbYk{kaGVmc-l|?֪m6֒ بo*Zlc-ِ1xX mUXm#iw+bNԍunSXm#2_uj밍udCs:8SXm#27A6aƍ]Bʇ6cɆm6֫m6֓ [j뱍dC6C6cd{LX19%Vm#ۈ%2SbmĒ ۈ6b6bX!cpFF,g-ZHj')qpmę qSۈ6^{8؋ƩmaqfWCAqjq1SCWM nluclcِ1v\nP؀ml 2`ؠ@6d mAmclߖ216 jdCsF8lT؈ml$2بH6d NmlT؈ml"6U~$zMݤ D6d ncImcl| S6ml66 Mjx`ి;#^؈66ⱍx!cpFF<O6d ^7a݈Wۈ6Ɇxh#^m#L6{Qv=^o]PԮ=kޫZjQ{{6Ab&DA"Dum=Ϋ<\|&1q oS8m#2_kcjǰcdCu6aȆm6m6>qoeb6C6cɆm6m6 ׍nW8m'2q8q8A6Ɯe`ㄘSN9 lِ1r)'6N`'Ȇ X7Nm6N 8mP8m$s':$\T8m$28 7Nm6N ׍nT8m$2EOB'6NbƚLSbN9SjSdCu6NaȆ)X7Nm6N { 8q p%<M W/ E]6\ W!c~j؆+ِ1xpuUmp%2Іچ+qlKB8㴨a8q8M6d /zV8m&2q8q8M6d n4qZm4qlxmmpuqFԍ3nQ8m!27~l ِ1j_16`gȆ33YqdbKE^Yl,ِ1Ya[.U8m%27~Yl,ِ1:,qVm,F6"˸ɐp@w6ܰ 7!c^ njn؆ِ1nwX7 7lÍl܆ᦶfa-x]]]]yX<-cW,cW-c^k1o˘e2g]ݰXnZnYn[-cA;{`}0TbGld:k;8~]]qs'cook;qTd 7箮qx;G63&9ʼ{l>vNmqlo>sj簍sdC9S8m#2A6m8^:oQJ/y٤w]j"œs?΋>Ϋ;0O~<\QWo.]w{~^}zpy;4,l] p}A}/zp vp׃ @{, jp=@"d ^.@6.`Ɇ#7J}aeq۸H6d 3WtqH^_16.bɆm\6.m\6. jKd՝\71.=.=.m\6. `qImqlKjKdCK%Kec QULbq?.m\6. _6.cɆm\6.m\6. ?zڸq #-}1!lx@j؆ِ1x  lÃl|ymx`dCuP6<ƌ2y<6< O!c9)j؆'ِ1xuSm$2E= O Ol X&ы^+!cpW+jW+dCu W6`WȆhl*~mLbN 甫jWdCsU8\U۸m\%2-*-Ul*ِ1U؆86s&mxmxa^dC6 / /lËl| װ^j^؆ِ1x/mxmxaȆGt319Sm\6 ?{v >{vMmql5h5lِ1xq ڸq &3cbx^j؆7ِ1xu[m&2 mxmxcdC{_Іچ7C64sS|6| !c^>j>؆ِ1x  lÇl6|6| _~KFnº᫶m  _X7|6| _!c5/\mbdCuU6F~ob ~ІچG6d nS6Ȇ?8ma~dC6 ? ?lßl*\(4_)pNW6ɆmCj؆?ِ1 h_m'2?W611 סjױdC࿧\\W۸m\'2qڸq۸N6d o\6m\6ngZʿĸ!l܀6nm6n ׍nP۸m 27n~ lِ1 F٠ӭVFF@6d n#P6ȆFjFِ1Fm$]yĸ)l܄6nm6n ao5MM!cp7j7dCMhMlyխ&-羨ql-䬴qKmqln܂u-lِ1omom6naȆ-h-l6٘TcOLۢ߸ jdCu66ncɆmX7nm6n ׍mF X]'M@L` |&0Pm#$2_uJF H6d ދ^4Pm#$2-T6VQ#HAR6Ȇ 8maAdCu#֍ l#lnAAjAq_618 S7 _>-dݸq۸C6d nqGmqlhlِ1qGm݆嘻}mjy'.w"E'$݅U;kw`.'|'.|[ߵ}s4_OZ=wq=G鰬yzDyw܃=\׃{S=!cqOmL6}D0 jF0ِ1l``l#lF0m M``l>x۔>`J1q֍jdCs݇}}!cpjdC6C6cF :x l<6m<6 #xm< 2zm<6 xmX>Z,c,c-羄Ps kf:(F!k\8!p Q׸\B| _ƅB5NXB5.dȖyC#LP1/Tm#%2?m ͆½PPl#l|M mmbFS{{6bɆ}jdCu!6bɆjCFhRsX#L66°0!c$g[adöEm 66°0!cpaFFltx{/ W6ުm6b7woOabĊXXb6bX!ccjF,ِ1Xh#Vm#ۈ%2_BjFXjI&F1`mđ [#Nm#ۈ#2mĩmaqdC8h#Nm#xG6LodT㝨`xxG6d >s;w;!cpwjﰍwdC6A6aƩ&钔cbw>jn{a0xxO6d >s{{!cpjﱍdC6ޫm6ɆWFS'hF<O6d|œ [Wۈ6ɆmCjF<ِ1xmīmcƽ?+LbNjdCs8|Pm| 2@6d nAmlTd:㣨aH6d nGnGG!cpjdCGhGl#l|V#AԍX76!cFF@6d n#HPH6Ȇm$@ j 'ԡQ;MOn|u'lِ1O'O'!c??m|6> m|Rm|&y l;iYo|6>cɆ7>jdCu36>cɆm|6>m|p0a俎3;Ė$d䖱TԖ4t/,c-c,c-c,c-cY,cY-c,c-c./-c,c-cy,c_Y| ʺɐȅ\$ou"dD.hSǀ5.K5. qw%rI|Mո?;u 8%&u?Xjb$6C6cɆ.hKHL6d n#1Xm#1l|K m$VHm$!ly#HHB6d ^7Dm# l$.)$jI$dC'6m$6zH*l$6m$6 ׍n$UHm$%2IaHHJ6d >$6m$6^# ?$ :$F2l#ِ1xHF2dF2!cpɠdjɰddC6A6aLlj7M.|. ڧKHN6d n#9\m#9lFrh#Frl#9ِ1ɡjɱdce=;31RgVSgVSm6R ?=Bm#lF h#F l#ِ1xHmPHm$K:'&FJoFJFJ!c~#%7Rm6R tA{)6Rb)Ɇm6Rm6RcF6:ӟF*a4dH HE6d >sJ*TF*!cpTjTdCTF*TFjx!EڅvA6RcɆm6Rm6R )ᜒZm#5ln6Rm6Ґ@S &FgJixLfӨm6Ґ HmQHm!2i`HHC6d HHK6";Z51ҊuJZNIHK6d bZbZFZ!c֍jidC6Bi6b $u<l LHG6d ^7Nm#lF:h#F:l#ِ1xHn.ukw뾀 /"œs[\~v݁x.O8_o.]<ݺ/=B}Ͽ =\hp^}z-Czwwjq=HO"d ^C6cF9bbdE F!cepA߭ˠ@6d n#Am#lFh#Fl##٨Q2`ݓ<&FF.62bɆmd62md62 LQm##l|/<#Qm##l|zQLLndu#F&l#ِ1 )62aȆצ4F&l#ِ1E&h#F&l#3Bq]Yb]Yb62cɆ#Ffl#3ِ1FfFf!cifh#Ffl# 2-٥L,b" \dQȂmd!2S:;c8loydȂmd!2ȢB6d n# Em# lLm6)O#nW 3JY6bYɆC C˪J6d odFVFV!c9%+Um#+l,0ޚ&F6Q7Mm#lndu#F6l#ِ1lF6lF6!cuJ6h#F6l#;zBT&Fva#;]m#;ljٱdCkp ]m#;lnd6md6\pNqQp6\Ȇ₾ᢶm  } Emp!2.Іچ l\赧MFh#Fl#ِ1xFF!c9%Srm6r 9j9d#c)攜pNɩI6d a㺣/Z9dCsJN8Tȉm$2ȩl<{}HWKQ7uK//ɆƗn|%%ِ1//66$2S6TE6+M\F.h#F.l#ِ1\F.\F.!c\p#F.l#ِ1\F.\Fnbz{'{'6rcɆ ɭM6d oFnFn!cuJnh#Fnl#pic&FQ7Gm#l|+ʣC6d n#Gm#lFh#Fl+Q4Cڣ;ƙ_ _A_m|m|E6d ^7u+Ȇ`WWdCWWj_ayF[UjbsJ^8Uȋm%2yaȫK6d oF^F^!c~#/Wm#r>DrG~XXAX!Xaז"b▱RҖ2ro,c,c-c,c-cU,cU-c,cZƪ[jXjZjY·G5Nm:{1^L>uˇk\>q2/5.8O]jk\>Xk\><'z}B#(F~l#?ِ16cɆjdC6C6cƀĻuu6 `Ȇb jdCkpMU@mQlo.mP(m$c((FAX7 m6 #(m$2 ¾FAl ِ1x(mT(m" NH~QH(mR(m"2`(Q(D6d ^7 QHmQlF!hF!l0٠gQXa/ZXm0QlFahFal0ِ1FaFa!c90QXm݆%ͻuSm[5܁Z-ksd\w뾆F|v݁x.眑yq4k|_ᄍxvh΋{An7|툡WczP⛑Mʻ_D}zPAX91L=a7M( j%dCHΈ$6%6Jb%Ɇm6Jm6J %j%Rdɏs51J9mJ GJm6J )RJmQl(RjRdC6JA6JaFkOhb{ZViFi!c#E"럥6JcɆFiX7Jm6J ( mV(m!  !(#++Q(C6d oF2F!cQ֍2je2dC6@e6`eF[FQVSuJYFY!cpejedC6Be6beɆ') mU(m#}o/kbsJ98S(m#2Q(Q(G6d >sJ9rF9!crF9rFy1vö'?免FyFy!cp塍j屍dC6C6cɆFyhFyl8̿aRO 77dCs}Fml!cS| ِ177j`9V61* pFlِ1 F F!c~7*mT6* ۨmTPۨmT${'2EݨFEFE!c9"S*mT6* )RQm"Ql|NmTTۨmT":\TRۨmT"2Q ڨQ ۨD6d nQImQl| [ ڨQ ۨL6MqoebT6*C6*cɆmT6*mT6* ۨ mTVۨmT&2_T6*mT6?{i U*F*F!c~ 7mT6 ?#\>UEm QlߨmTQۨmT%/8[vmq7~FUl*ِ1FUFU!cQ֍jUdCFUhFUl06r&F5Nn5Dh5jF5!c9SmT6 ۨmTSۨmT#27A6aߒ '+ߊ5p ƷƷdCf Vm[l[!c9[8|--ِ1-ƷFuukŜR)6cɆFuX7mT6 ׍nTWۨmT'2աjձdlY5DݨF F !ckkm6j ۨmPۨm 27j@56j`5Fl"Ũ7dvhMFM!c^&Ekm6j ۨ mTۨm$2QڨQnrL-m֭杤ZpZK-]x.NR-xFv-Zv)5$ՂRZo.]<{_=qs_j[ckgok`khkdklkbkjkfkn2eeeeee؏v,c-c,c-c,c-c],c]-ԦsJPq?ZDruMULGϬVWx^MULpmV׳x^MLg{Ԇg{VWx^MMpmXjk\m!#MĨ#fFlِ1:3Æiu6`uȆu:Flِ1:F:F]1V61 ujudCp]Uۨm%2~F]l.ِ1x?\ڨQۨG6VW`QOԃ{,6aȆ:F=lِ1xݨF=zF=!czF=zF}c|EݨF}F}!c~>7m6 ?_T>_T_m>Ql|NmWۨm4 {8 `hh@6d n@mрl|Nij dC6@ 6` ɆGj˼ FCFC!c~!7m46 hm4Thm4$2hhD64m?h$FpNihD6d nHmшlF#hF#lِ1FF#FFcq@&FcQ7úXm1јl|Ni jdC6C6cɆ{FcF?M&n4uFl ِ1&F&F!cuJNihB6d ^7@M6`MFچG%Ygb4u)M6bMɆ甦pNihJ6d ^7ºTm)єln46m46\_Zh=OOޥşF3fF3!cp͠fjͰfdCkfp Lmьln46m46ib476Ɇı-ʈ?jͱdC6C6cɆFsX7m46 nb 6cߑܼw;qw<66#27wjaߑ ;ﰍȆ߃Nm;l{}?U=bb|/za/dC66Wl|N)߫m|m|O6d n{h{ﱍdk1La_-Ȇaj-dCfiBmтl|Nij-dC࿵6Zm6Z!ѳph))-:FKl%ِ1xh FKFK!c9%SZm6Z -j-VdÜnebJJRhm"2 h hE6d ^7ZJmъln6Zm6Z?TcbFkoVhm&2SZ9Fkl5ِ1x6ZcɆFkhFkl sN1F)dhhC6d mװm6`mȆFX7ڨm6ڐ m6jmtͿkb nِ1S~Pl|gdCuhƅ%z|hb|'+iH6^wA6~6~$2#ƏƏdCsʏpNQmGlG!c=6~6ڒ ځ{jb딶pVm-іl[pmڪm6ڒ )mVm-іlκጁlUhm#oU!h'F;X7کm6ڑ ׍vnShm#2S9F;lِ1vF;vv~r~^׻u?jZOvxޭ Ov)O?ᄍxvD:/O{鞧޸GC1=}?G{'2+ùZD{\ړ׃F{Fr?$W(FGtFlِ1%ra["wPmt 2?|Flِ1{ZL dFl#(:S;;mt6: Qm#ёlntuFGl#ِ1xmtTmt"U<`褶 D6d ac/Y[_16:aȆmt6:mt6: ׍NF'NFg4R&FgotFgFg!cGg謶L6d n3Ym3љlNg dFgl xtX<&Fa Em хlntv@}tQmt!2mt6 <3F=v%chmt6lV*攮pN骶J6d ^7ºUm+ѕl|ߢ+\vUmt%2]a誶nq>L·_g8f9ǣeeeeeeeegX@ `P0pH(hX8xD$d0ݨM^Dz_nu5u58#iM]׍jnp릮qpF5N_78uS׸nxN6ulbt%v%vWmt'2;|Fwl;ِ16cɆmt6mt6zMQ;/7lb}s7Pm 2zިFlِ1\SPm 2衶I6s)`bu'=6zb=Ɇm6zm6z )=Sm'ѓlo j=^dmR*}DF/^F/!c9Szm6z ׍^nRm"2`襶 M6;01z jdC Vm&2譶M6d EnVm!i#l6m6 mQm!2裶C6d nGmїl!O&F_ װ}6b}Ɇ 쫶K6d n/Wm/їlF_hF_lH.UM]L~F?hF?lِ1x/6aȆ{~G6d c3xLfW ~d#Kwó&bN)?mmL6d nghgɆϰn33ِ1S?úFQk01;m 6cɆm6m6 mWm'2G?_m?1lTҠpcS9elcِ1x/:6`ȆE}jdCuc1@mc1l4t52uc ٰ=4Pmc 1l@hc@lc ِ1x@@!cwdB6bFIM8c7~c lcِ12)6aȆm 6m 6 m Rm &}8Ub ߟ삾?5Xmc01l| ;am 6 ?<>Lsdd!cpj)dcDߚSD/:S6`SȆ)pN1ۘB6d ^71Emc 1lmLQۘb9F#u1r4t L,l\z0jq=O"d c·6m6kg[X XX@6d nc@mcl216zU,gXm, 2XXH6vM铳й65߿]H6qwݺj dC=Bc.TXm,$2_.kӅj dC}BhcBlc٘;ۙDX"E"!c a{hc>lcِ1اl̫F7~jc #ljc ׍ߡ6~6ur9XAA6cɆ~X7m6 mW؏m'2د8@6lY8 X7m6 ԍ.nOq8@6d nq@mql|q@mql^$J&AAAA!cq֍jdC6B6bɆAhAlqs3ϔ5L?:NCml!c)t*Z` w|??Ȇj`FpV31=Cp!lِ1!/zHmql!h!lِ1:qHmqlt8,ð8q8L6d n0qXm0ql|N9 jdC6C6cGCL#nulِ1xqG6`GȆm6m6 6m6+8*QX7m6 8 mU8m%2q8q8J6d o6m6|u^8&l6m6 8mS8m#2q 8q 8F6d N9mS8m'Kuebkp {\m8qlٞٞjDZdC6C6cɆq Qdbㄨ'`8q8A6d ^7NqBmqlj'dC6N@'6N`'FUfb'II!cp'j'dCu$'6Nb'Ɇm6Nm6N^5L:8%)X7Nm6N aO5)S)!cSp)lِ1S)S؆+I&†+᪶m ? pUp6\ɆW8mbdCཨ+᪶jx9{_NwNÙZisdtֈjSp8w\< _$ U 7;#XΨ\ݗ1xqgzp8EQ8!c=33YsGjLYhYl,ِ1,\U8m%2Q#ߥ*ſbhm6Β gjg 7qkL 7pچF6d Gwpظ8*ݿbhmandCu 7 7lÍl܆ᦶf8 ;?E 8r>9yE%e˘e2v2v2efX|-c~1u Xeeee,2dckg ݷ=N53e?n6?wus5ΝjJp䮮qƹS1xs5]]qs'ckƹk8̃=Ȇsj簍sdC{,9lِ19rNmql|qNmql<[M7:{j籍dC0kb8l>|^m21.8!1u٨q%u5u6.`Ȇzlِ1r)6.`Ȇ  EP NEE6.bɆaltqpذyQm"ql|o"ܛq۸H6d ^7.B6.bȆĸSMD6̩{\R۸m\"27.~%lِ1xݸ%K%!c}K%KeQƨMjdC׾ }Ym2ql߸ jdCsehelÃlӮ&x'롶mx  X7<6< !c놇چA6d N6<6< OѢvnboxmxbdC6< O OlÓlچ'I6d nT6)}rcb\!qlI⨣+jW+dC6@W6`WȆm\6m\6 )W+jWdcCLn\uUl*ِ1UU!cpWjWdC6BW6b^dcz^N]~/Q<˱:C~Km "2mxmxa^dCཨE6 /!c9 R6e>Ջab\5k5!ckp5lِ1xݸ5k5!c55h5lÛlZ9oL oNo olÛl܆7᭶mx S:[m&2S o olÇlVL o~Gm!2S|⣶m )>pNQ6|ȆhGm%(=(7|a᫶m 6|6| _!c 놯چ/K6d g mmb~d؈˥21D ? ?lÏl܆᧶m  ?X76 ?!c~S6ƓZ=8w0?~c[=j؆?ِ1 h_m'2nmcdC?᯶m\'q)iĸ.߸߸q۸N6d uuu!c}]q۸N6d o\6m\6n ځeb}݀}P۸m 2_܀j7dCu76n`7Ȇm܀6nm6F01Dl#l|N sJF@6d D|_"@m# 2mmm8^Wڎ_$k~1ZY-nEܴ0O.׻u7Aj}kܴ;0O5S9/͛~ӰnMxoM\n=Ve [[ ׃[te --["2+nZ-\n[jdٳd2U21n=pOml6ِ13·3·6ncɆm܆6nm6n j@MM@G>"Pm#$24>m ?#Pm#$2߷66 171Ad6Hm#"2S:;c8lwxY_16 !cЂohAjAFِ1mmawƤZKwswsw6`wȆ;߸q۸C6d >܁s;!c9qGmql,JqKE^]l.ِ1̞Vgg /w6bwɆm܅6m6 ۸ mU۸m#lkb6A6aȆ={j{dC6A6aȆm܃6m6ƁlbuJ0\mcdC{ZpO+Xm#&2 -jmcdCh0m'Uq_Su}}!c3@3@m6 a/z_m>ql}h}l/p&ы>!c^Em<6 ׍n6m<6+bSt]cbm|6> ׍n|Pm| 2`@6d c#3Ƽ}TKm|$'$ _P(攏pNH6d /a#2~Q_16>bɆm|6>m|6> 팑d Fٸ2/˘ . j Fِ1xHu#Am#H 2m$m$` dCp}9c9%Am#D6jwN)' o|Rm|"216lz D6d N)6>aȆOpN L6&gggg!c֍jdCu36>cɆaldupȳw%n;v"χIx$%%e^Uմ CBB!!zޫ HJw#*{Dz"R |YǙ91k:{f9,TayZj^RXji-5_K-R`e2Yj-,oe,lZR8M_d~|nN=_'_;z:qd~c?1lF{pKN6RO^>V%#ˆo''('WHm$'2_/Frl#9ِ1FrFr!cQs@6m$6RFm01R9Sm6R }Bm#ldcPW idICk#l|6Jfj)dySCz&FJW0dykg5ܜRm#%l~j)dC \16mIbhm6R H mTHm &njn؆ِ1XX6ܰ 7!cSO$16ܰ 7!comaQlb8\6Lp CmÁm8Ȇ 7jlA6d 3oĻb8m_NCkÁm8ȆgQ7jl#hѫFMTo}#F*l#ِ1 6RaȆm6Rm6R l ܫϳ&nݺο-\ֹBi(>]-.|ۿ:w?fww~xD׳utR.ɇkޮG]}q?k>ކY&\+$V$Bpݳꊁ  lÓlL:>&8j؆'ِ1{=aT6<ɆmxBj؆'ِ1 OhSm"g}mbxgd32^j^؆ِ1x}Km "2芁V/ /lËlL R6Ʀn46 o olÛl܆7᭶mx M˺b8mtjZ$16 o!c]16N̹q2ֆ7l|H-'I 'IHM6d n#5Zm#5l'Nt²Ibhm6R __Zm#5C6~>4Ǐ??㇞Q6|Ȇ-|ๅچC6d zmٰGm!2>om`iƽ5 cbiE4F!cpi4ji4dC 9[b8mpNÒHm!2#OZidU-61{{Ӫm6Ғ H mUHm%2igJCk#-ldcOMW U/ڻ<[Zi _3ܕ&ombdC/7|6| _!cxK6lWm%2pݥK6lwmbȆ[4aLtbMgtj鰍tdC0\16nw~$16aȆa\16:{Hm#2ivNm#l=#EY4Fzl#=ِ1O#=ٰiWHm'2~*z~*Fzl#=ِ1$i8my &@6 F72md62 |iy$Fl#ِ1\\62`ȆafN&Ibhmd62* E;hbd62B62bɆͨH6d n##Qm##lFFh#FFl#hBkbd碙h&LF&!cy+ӆLjLdCdCdRȄmd"2H&xfIm#lt#اdjdCYm#3lF+z%L6d ,fh#Ffl# V/YĚ)Y6`YȆaFSW Y6`YȆg,p͢B6d ,F,؆pP熉'~j~؆ِ1Ώl؎6 ?!cy~j~؆ِ1 ?hOm'sK<;/lCj؆?ِ1 lßloþ᯶m W6u7 <21Y4+Emd6 odUȊmd%2ȪJ6d 7BY6bdcnby#jFِ1x}#@m# 2ߧ}JF@6d h#@m#F6NOl[# Ȧ F6d Ȇmd#27y#F6l#ِ16Mm#H6n5Ȳt#PpT6Ɇה@mbdC}#@@l#lF md's.pȮN6d n#;]m#;l|jٱdCFvh#Fvl#psN=>&F][][F!casasm6r oPȁm 2ߧ6rm@䴼#RcYjAZ~KlXjZAK-R+d[j-KVR+fJXj%-HKeE[j-K-RKRs><[7<[l]N?͜Ζ̇oz.'?T~f>儓qNuibý؇?pԻr{WNkg{\pK}su-]}!bR.\x]Ed WERȅ׵\$Bp.h#F.l#7(Qz'Ss]3%7|6Fnl#7ِ1̓<6rcɆpέM6d >6rm6 )x-`b}#y6`yȆ#Fl#ِ1xFW'X3|j|dC}#6aȆF>7m6 )|j A/61D}#Hm#"2AomaAdCg,A%Hm#"2mmaƨ7J01-F~l#?ِ1F~F~!cjdCF~F1^_+Fd/'K )E,Z@mQl|[a m6 Q@mQlo6 m6ƪab}jF0ِ1x}#Xm#&2ݺ`?ujF0ِ1`h#Xm#!;z8#{ Q6BȆ1PQ6BȆהm`!dC6Bl#l~zb#TP7B6BP!c FF(J6d >Y4Tm#%2?6B6BdZ Ͽ'Q(Q(H6d LALAFA!cy 7 m6 Ϣj0L0a# S6Ȇ1RZaFِ132a00l#l0h#Lm# (D6M.Qȵ5g_ȆBjBdCpR!a.R(m"2`(Q(D6d 6 m6ɆoR21E}#\m#'27m Ϣp W6Ɇהph#\m#(L6mMbRS m6 °oV(m&2p0$Fal0ِ1FaF(B21"D߈}#Bm#ۈ 2oDmD`dC}#l#l|M6"6""dv׺21E"jE"dC࿓[Nn"F!c"쫈Flِ1,Z(Q(J6;Q(Q(J6d )E6bEɆm6m6 FQF1aLb;b;bjŰbdCF18oS(m#2ߧbjŰbdCŠbjŰdLcb6C6cɆ((Q(N6d 7þQ\m8Qlo6m6JaG](!֔pM)Q(A6d 3pŠצ7&Q(A6d nQBmQlF hF l$٘6!W%V%$ÖT(m$2ߧj%dCߧߧT(m$2_SJB%6JbdcY}罉&FXS"mD pވTۈ6"ɆH8oDmDbdCFF݆R7晤R𤼔ZD)ny&-J;0}=\~)/eý؇{v}8׼Qt͏ލ[t}eA G'Ҋ=>CB5J}p?/ciSW ό NC (r c" QjQD(h#Jm# ۈ&Vmъ4Ɇ/.46h!c9"jF4ِ1yg4q=:b$E|ba>M|hO'vQgD}?_}^Ó^Oj5X[zE? AmկAm21b8C$uP@gYxmڸ&2_+jC6jcuƀۙu\6pWlX3 9Qۨm!2#9Flِ1ZQu6`uȆ׊:F:F]1γg:uŽ~u~u6buɆal4upڰXe]F]!csܢF]l.ِ1F]F=1w}&F=w蓮#f^OmQloԃ}F=lِ1xߨF=zF=!c3zF=zF}ǥLoԇ}F}l>ِ1Yx}8wWۨm'2QڨQۨO6d ~UڨQh@6SPL4dj dC} 6` Ȇ-IF!chhH6 M~~j dCg YxCFC!cj dC}!Pm!шl><} &F# 7 3}}J#FF#!cFjFdC6A6aȆF#hF#l1x>vL{tFcl1ِ1xh FcFc!c51\Sm46 FcFV/M؆L& 7ssKFK!cp-j-Vd]΃l F6ZaȆYmYm hE6d nJmъlVF+VFkIMFkhFkl5ِ1xh FkFk!c55\SZm6Z Ŵ6Zm6ڐQ5mYLxFm цlo4spڸuOpZm6dC6@m6`mȆm6jmOƬLOOO6>6>%2٘i{LCkSlS!cpƧƧdC}ShSO=uL Lm3l3!ci#zCW“ lo|gja Ϡ6>6>';og 6>'29dC6>6>WhK6Nzm,΢m6bmɆA6\?mҖl~ڤF[l-ِ1F[F[!c5-Vm-юl\|Lv|HTYG̳u_ /"̇{ j_wGW ~͇{w뾀 5tGnz|SD`?蠾p?@W_wwP;Ar ci7$BkEhFl#HwxcS==6:bɆ爎p訶H6d ~wTmt$2t6:mt6:!~SzĹE'xnImщlNp褶 D6d >Gt+I'NF'!cpNjd#]|Lή:|Fgl3ِ1x FgFg!cpjdCkJghFgl X51y 7mt6 K |X.F!cp].j].dC.F.FWQnL5|AѕlJz?j]dCkJWtUmt%2EYFWl+ِ1}]j]ndcC&F71otF7nF7!c njݰndC6A6aȆהnF7nFwAAVkbdüS&uWmt'27yFwl;ِ1)6cɆהFwF=ļ=6z`=Ȇ1КCmуlFhFlِ1FFOQYr=wh=gOFO!c{z{zm6z  mTm$2qlTm"Wʧ%F/7zm6z )Kmыl<ꥶ E6d ~ 襶 M6>]Ѣ'MFohFol7ِ1̚i3߽6zcɆFo7zm6z Ϣj>dϮ3BL>bMה>j}>dCphGmчlFhFlِ1\FlQm|I6zu fb|)l| m|%%ِ1辄RmKlK!c=pƗƗdC_B_m|m|E6> (J)_5+Ȇ1>+ȆWo|ِ1WF_1,LF_hF_l/ِ1̚iN_F_!cK6d >o6m6.T'l6m6 ߿޿Omяlo}F?lِ1F?hF?l?٘q€wQ&F1oFF!c=l W ڧ--24I F!cpjdCkJhFlcqXc`1@6d O)6`ȆהpM1@6d >6m 6eY(kk1H6d c+F4$@lc ِ1@x5Pmc 1l|Mm Thdy`Km6RRRf FXj#-QhKm6Rg&Xj-IdK[Km6RfMfXj3-YlK;Km6~A覆Dixn|n =n8̓ 6m 6cu.[T*C~{Plc(ِ12)C6bCɆm 6m 6 Pv·vn]3ٺЯ|]p?} {j_wgl_ۯp/<[5_׸|CR@Ez߈~ ߨ7|CW_k77j~ 91x?F-!2hoad1_6019b#m 6 m Sm #2?cXm 6 6m 6 獳{c8 Wm '2l8lplc8ِ1pp!cpájñdGo_jnb֍֍Pm 2gugulcِ12)#6F`#ȆgHa7LLk$<1I6d kHH!c1j#dC}c$1Rmc$1l|ScAC1Jmc1lQQjQdCRm"2?mRm&>]W-)>ehlc4ِ116FcɆm6Fm6F )j1dcY϶;c,:΢c6`cȆm6ƨm6Ɛ c1Fmc 1lhclc,٠_lb Um%2_S5eXlc,ِ1XX!cyc,1Vmc,1l,u n&8k8q8!c8D dc8lcِ12)6aȆq8qxQc/{ㅍxx!c}xO1O6d O)6cɆm6ƫm6&-gp&1oL !c1 j dC}c6&`ȆKmLPۘmL$ql1QؘmLTۘmL$21ژ1ۘH6d ~DxDD!cYt"1Qmc"1lЯ 41&Ik$lcِ1"ڧLRۘmL"2`ߘ1 ۘD6d nc1Imc1l;S&d1oLdd!cyc27&mL6& S&}dd!cpjoƅ/*7fb|+=jbߒ oaVm[l[!c-ߪm|m|K6d n[h[o)deOibL6@S6`SȆ)pޘ1ۘB6d O)S6`SȆ7@S6`Sƃ-kScbLkTLUۘmL%2v*vTlc*ِ12)S6bSɆmL6mL6 zc1 ژ1 ۘF6d 4i4!cpӠijӰidC{i4itv@=&Ӆtt!cY+FWg'1ۘN6d >oLtt!c1ژ1ۘA6:<}Tc~~ lcِ1>eܧPۘm 23`ߘ1ۘA6d ~.:ژ1ۘI6b1S}̈́g_36fb3Ɇa֔N!/%$4I L!cp3j3dCL,1yZ31fl1l^7Kmc1lô}c,lcِ1Y,Y,!c1 ژ1 ۘM6hgb碳ll!cߐl1ݙbZhZdC6fC6fcɆglv·c3$%7 <"0'kz&;rV$u݁pw<ߩwo>܋}x23IkμЛ#9psp?CW_0sDW |ԞQ I 9!2́9jsp?C"d mQۘm%Kf1׵V&=5Uۘm%2? m6 sa1ۘK6d nc.1Wmc݆/{_" |<9[j ,"KmR[j-Ԗ[j+,*KmR[k[j,&KmRRjmԶ[j;,.Km/̪;wjiy~7{[gb͇Wۘm'2?m6 7~7_mc>1le>1_mc>lTo۠&c8_m,6 ߷~߷@mclhclcِ1B|-&Bqn/TXm,$2_S5eBlc!ِ1) 6b ɆB"nb,{p\mc9lj˱dC}c96cɆrhcrlc٘8]T& k  !cj+dC}c+6V`+Ȇ hc lc% ˖&Jac%Rmc%lo}cJlc%ِ1++6Vb+Ɇm6Vm6VJ༱Jmcl}RXm"2_SV5e*lcِ1U*UjAo`b6VC6VcɆ5Y 5YXM6d jjj!cpj5dccjL5b]g5jk5dCk5!cyc 7֨m6֐ Ϣk5jkd#gkEX ZZ!c^ _{Zlc-ِ1k6bkɆZhcZlcsLuo}c:lcِ1xX:u:!cuj밍udCߧ6֩m6֓%GiqX/l6֫m6֓ G~G^mc=lo}czlc=ِ1X@6_M hclcِ1x !cp j dC66@66`Fe>zhblF8olT؈ml$2aبH6d nc#Qmc#lFhcFlcٸrbOLM&hc&lcِ1&x.Imcl&hc&lcِ1 ؤ L6:ҽ&fac3Ymc3lwr7ݬL6d dNřNm#I f!cجnKjZvd>&ṗٺag^}_}^ßv}8߫lk>`/<z[D?߂2[`?آv-@k(bZ[-j[Ȇkeb C~dCߡCAml!cp?@?mm@6d ~V1v>[E VV!cjC6B[Ɇml6ml6,[N'4:0}cٰ}yMmclol}c6lcِ16aȆml6ml6yYïMeblgZvv!cIIml6 olW؎ml'2l6ml6v4;\6̋v|P؁m 2?-vm6v mP؁m 2Ew@;6v`;lHmb}c';6vb;Ɇ獝pةI6d kNN!cgwB;6vbFrIkb6vA6vaȆw]j]dC6vA6vaȆ.hc.lc7ػlQ &nO )6vcɆApnlc7ِ1)6vcɆnv\}#?;;XRgXj-CaK툥vR;f~NXj'-,SiK팥vRR;g.Xj-KeK튥vRf]fʩSl:Q='c{P1x{uۃ{q2o=n^qss&^,^^^!c{{m6  mU؋m%2ثG6v@cاG6d 7Omcl>hc>lcِ1}>}~qD=sܼ6cɆ1PدO6d nc?_mc?l|nmW؏m _={A〘7ylِ1":?q8@6d nq@mqlo6m6ydbT8m$2C@kAA!cpjdCg1jCd_"u Ěr)6aȆ!7m6 ?q>qHmqlo6m6 Lahal0ِ1"7m6 ðoV8m&2q8q8B6:nU8")G>lِ1"^lِ1##!cpG#jGd#Әʿ31Y(Em6 GqTm(qlQhQl(ِ1>(qTm(qlyP&111c1!c5\Sm6 qLmql|=mS8m'A 'EE8qq!c8D 4W8m'2ᴱ~9Vz&q8N6d ~?qhqlGV/Ƙ? ?B?mmH6d l##ِ1x6~6~$2_S~6~T8A6J:Oʘ',z΢'6N`'Ȇ1,zBmql h lِ1,z8q8I6v<8)I7Nm6N ߇tއtRm$qlIhIl$ِ16Iv·~rn]t̳u?S"~0ٺOv=[܉?ٯp/nO?~p O_T6N3SR_S/cw;vp S@{SP)S"2#NA6NaFeODW71N jdCsi8GV8m&2q8q8M6d >G6Nm6ΐ51=C6l?<{Fm qlܢ+sWV?ICk ql|ozMϨm6ΐ 8mQ8mL6M]}\Ɇ33ِ1ygɆudCkj?cgƳ|gŚr)g6bgɆa֔N+o_6~6~!2 //dCk//j`FsD89s9!c5\SΩm6Α 8mS8m#2q8q8O6F՝&yy}dM?j籍dC6C6cɆ)>yl<ِ1y%&\k !c5\S.m\6. ۸m\P۸m\ 2E/@6.`9ukkb\t0CE*mirq۸H6d 7.¾qQm"ql={/m\6. ۸m\T۸m\"y&%=%=%K%!cpKjKdC}6.aȆהK%Kej:exuYm2qljdC6.C6.cɆehel ($\n&O)W6`WȆ1+jW+dC6@W6`WȆaldcb W6`WOĸ*9vsUl*ِ1UU!c=Uq۸J6d 7BW6bFy/K11y7m\6 !b㯩m\6 _g6aȆm\6m\6.31qjױdC\\W۸m\'2qڸq۸N6d >^6m\}?ܰ㦥vRmݱZj,گK7KR{l=ԞZjXj, KOKR{mZj,,K07yu!ֿpq7pA=N 8Pݠ'c,憺=8~w7L &<ýq۸I6d n&qSm&ql| ׿j7dC6nB76nbL[b} om6n ݂t6naȆ۷~-lِ1lt ڸq ۸M6:ibkmV۸m&2C@{jdC6nC6ncɆm܆6nm6>dxF|Flِ1x߸;!c;,lِ1;;]`Mb޸ 獻jwdCp]]!cpwjwdC6Bw6b3|L{o܃}=lِ1{={=!c}=Oq۸G6d ~Nwڸq۸O6ҕ(&}7þq_m>qlٸq۸O6d >o܇}}!cgC6m8uϳujwlݯگp/<[+濪P_?Tm)lShSl)ِ1xx m ה?66 2dC66Pl|3_\fLg3h3lِ13xLml3h3lِ1g3gstw>9ܧAml<@6d nAml|Aml\|תQ̢,Qm#l#<H6d >o|GG!cy#Qm~?F&RKa,5Rs<,5OKRR[j>ZK-k[j,Z&K-R-ZR Բ[j9~Z?n̟d):BN%G=OdA=nPW gdLC$b=u l]r=.?'ZDrn~G3rrvهl]rkJW|p׳u5OI/]3;KMo@ fS~ R՗1htgc%u@PD  2)j)d/?31RSΐRm#%l|Rm6R )O}چ'I6d }'d&>†᣶m S|>Gm!2>om`>dC6|  l# ٸؼWM444ji4dC6@i6`iȆm6Ҩm6Ґ )i4jid~HϟL돞LHK6d n#-Vm#-l|MI הjidC6Bi6bdAPǪl&E},꫶m ϢpU6|Ɇ߇އm a} _ _l#6jܝg9Lto}#F:l#ِ1tF:tF:!ct|#F:l#ِ1HHO6/(H/l6ҫm6ғ ~^m#=l|Hj鱍dC6C6cZdbd62@62`Ȇmd62md62  odPȀmd 2_S2@62`Q (kk˨H6d >fhFFF!cpjdC62B62bd?ziLL|#<Ȥ D6d 7b8mؾˤ D6d n#Im#l| Ȥ L6kYna#اdjdCpodVȌmd&272y#Ffl#3ِ1\}#@62md6Ew]"ld6md6 Ü7spڨj$B6d 7Em# l|mdQȂm _~†᧶m aOm#2FdL 6Nzڑ$ֆG6d ?hOm'4D†?᯶m 􍦮N=NҴGpZ؆?ِ1 lßl|666d5$ $ejY"̇<Wd;0gU_o>܋}?^k:% "@}p?/c3ΘjpP D@jF6Q&ʚĹE6md6 !b2md6 `Ȧ F6d >cf6md6bO"U01@h#Pm#$2ombdC߯W6@!cpFF l4^5Ә&FvqieWȎmd'2aȮN6d n#;]m#;lFvh#Fvl#ٸ?bb}#96r`9Ȇ1j9dCkJPȁm 2? mPa|:{_tozq#,ܖZK-R [j,`K-R ZjaZ!K-R+lEXjE,Z1KVR+iEZj,(K-R+mXjZ/9ui~ҿS9Srz{\Nr{\NrR1*'ST'c=UNr{\N"YѢKܳ ޳Km#ll6<ͥ E6d >傳Q.\F.!c(Km#l 7li}#r(Fnl#7ِ1FnFn!c(7rm6r 6rm6 Q9Z?ndbqۛ/ +,_Qȃm!2_S5%Fl#ِ1h#F>l#l,ThE6 !cpAFFD6d 7`R6Ȇה h#Hm#O6Blkbwlu?jdCVH~F~!cpjdC}#?_m#?Qlll]/LbRS m6 oP(m 2E YFlِ1FF0و^cN&FomcdC 6`!cpFF0L6d CjF8U&F,{m hjl[HCk#!2_SBm 6B6BPQoebl}J(xrm P7B6BP!c FF(J6d BjFAgżQ6 bɆY-Y-Q(H6d c#icrLCk QlFAhFAl#l4xÆ&Fkk0S(mbşFFF6d O 00l#l|M kJFF6d ~?Am"H{3($--Q(D6d l]!l]!BF!!c5\S m6 BF!BF8vZSp1cϐ3m pW6Ɇm ?[mmciW'(,O) O)Q(L6d J6VFal0ِ1R)6 cɆ)j1]T#La#ڈPۈ6"ȆFmD`dCߧDS"6"!c5%ڈPۈ6 w(7E)B6̟(E6`EȆal4wp}.!Ibhm6 "oQ(m!2E@E6m8*xl]Qs-Q.|pQ(vP|gi_}^}]׼]sڎ bb(׊b_ bte 3Gtp:k<KCȁA1E1ZQ (Q (N6?`Q\iFql8ِ1VqxU\m8QlFqhFql8ِ1FqF gW&F =I =I F !cwfP(m 2?(Wj%dC6J@%6J`%_=()) )Q(I6d ~nQ[T(m$2%a(Q(I6d n$QRm$I6Jm:k\#eiD赃] jF$ِ14ΝjF$ِ1Hh#Rm#ۈ$2<ڈTۈ6J}YsQJg6JaȆ1=;6JaȆC+C+Q (E6d ~U (Q ۈ" Ĉ6((l#loDmD QpވRۈ6Ȇה(h#Jm# ۈ&?_=y-lDCjF4ِ1"jF4ِ1yg4߻uמ}b͚{mWۨm'2jdѵn31w[w[m46 TS 6` Ȇ{mh@6d ދ66m46<·s:ebx9)j؆ِ1\E ԋzmx`dCu  lÃl|P6 fVӗ&Fs14sJsFs!c$sjͱdCg5g5Whm4'2hhA6f8h!pNihA6d WՍj-dCsJ 8Phm 2SZ@-6Z`-Fo?Mh)l6Zm6Z ׍nThm$2SZ9FKl%ِ1:%Rm%ъl|mG8<硕F+lِ1:\Rhm"2 h hE6d nJmњlT 0uahhM6d W)6ZcɆpNihM6d n5Zm5цll8ShE6d#ٮ%/RQhm!2m`hhC6d oQhm!2 Fm C6df G)>pNQ6|Ȇ om`>dCg3@|6| !cu᣶m%GN\hSLhK6l/`Uhm%2mahhK6d ^7ºVm-іl|Ni mUhm6l)S|_ _l×lچ/K6d o~Wm%2_BjF;A,hgl3/R#4/RShm#2S9F;lِ1xhF;vF;!c9NmG6~>'EྨچG6d ~OW6Ɇ8mcdC{p_m'2Іچ?@6`#@66!cFF@6d o~#@m# 2El#мw%yM@a#T6["@@l#м'b}@/m7E >BjvaЉ0=&rGe,2jko`hd u[ƺXƺZƺYƺ[zXzZ",c,cޖ>(X?X@ `P0AT+SXovD5N࿓'7H]p 'c9Ak\8qAx &mە,lCjF0ِ1 ``l#lo}sF0L6d 7CjF٘"眀&Fx. m`!dC0}3ÆTFB6d ^7B`Q6BȆm@!j!F((F(m B*Tm#%2nmbdC}s(m'ˏn^)^m=ўl[[jdCp^m=ўln6ګmp|u5jo:jA-]˿ `vū;~`)S8y=AG[MH7Q慨q=Hw_ceGt$2cX:Et#1x=mtTmt"u=z 褶 D6d 6צ6:aȆNZtRmt"2#:A6:aad7FW71lܛ S6Ȇ7; nvFF6d 00l#lnAajaFgjגMjE FgFg!c}pߢFgl3ِ1)6:cɆmt6:mt6Bɢ11Ź\ppl#lnúm K W6ɆCjF1.R}S9Fl ِ1{]{]6`]Ȇ.袶B6d ^7@]6`]㿚&FWg0]Ɇ"7mt6 tpx2%>J6d >tsJWFW!cp]j]ndw^&F7otF7nF7!cnpF7lِ1nF7nF7!cpݠnjݰdӺ451;S7 FcwFw!c^;Emt6 mtWmt'2_v6mt6zQYy!FX7zm6z Cmуl| a{m6z ThFl'H?mL j=dC6zB=6zb=Ɇ)=:FOl'ِ1:'Sm'A6_D@jF/ֳM^^^j^dC6zA6zaȆm6zm6z i@6zm6"҅Mjf 61"72HHl#lH5Rm#ۈ$27"amD ׍Hh#Rm#M6ʥX˷[6zcɆzýjdC 8c8lr?M6d o6zm6]kbFoQm!2lQm!2Em6 mQm%'}}́~﫯F_l/ِ1:/\Um%2諶K6d >6m6-ĈS((l#lFmD QRۈ6ȆmDAQjQF?bZ>&F? o#m6 `/OmяlF?hF?lِ1y?hF?l?ٸvH&FN)6cɆװFl?ِ1FF!cpjdIĹRR6`ȆX7m 6 [0~[0@mc1l|Nm Pm $O:e \ Tm $211H6d 1o Tm $2_ 6m 6t֪1H`/:Hmc1l"Sm 6 )2Hmc1l hc lc00ų&`Q7ú1Xmc01ljdC6C6cɆm 6m p|3{_qLͿI;!jC"]?$ !v!Q!o.]=PiWOg =PcU /c>b(t0T`(CɁ=jCq=J"d  m Uj8ego'ȳagq mnZFXFZFY,c-c1qxD$dT4ط閱Yٖ,cs,cs- 7m]ca;a;a7 ׸aTd Wոa7 ׸aTd 0uk0q2q`qM6/ξH01E? hhl#lF4mD ::Zm#ۈ&2 mDmDcWdb 6C6cɆ*bg6cɆpX7m 6 C6c1d }eb1FF C6d l#lo}sF C6d ~X mĒM5o+lBjF,ِ1 XXl#lnºmĒ  mĪmb#FͅWmb6F@#6F`#Ȇaf16fI3Ōbm 2#`1A6d ^7F@#6F`#gkb#HH!c1֍j#dCuc$#6Fb#Ɇ{ёH(Ѭ̨MQnuc(lcِ1x1 6FaȆ):e(lcِ1Q(QFp|uc'7FFG6d WՍ88l#lnmđ 'mĩmaFpVeK,51F jdChoVm&211M6d  mVmēS{p&FSmē YWۈ6ɆmCjF<ِ1x݈66ⱍ1dt661ƈ1֍1jc1dCggQm!2&w &wlc ِ1v 1Fmc 1lwZ:cX딱jcdCp1Ec6bcɆm6ƪm6ƒ aBc6bF΃m01Ɖ1֍qj㰍qdCggSm#2S9e8lcِ1x11H  2g#A HPH6ȆF j Fِ1h#Am#H 2_&@ j x1qVcS9exlc<ِ1YY6cɆm6ƫm6Ɠ ׍xvDݘ !c9 !cp j dCuc1Amc1l,r(1Q88Qmc"1lߘjdC6&B6&bɆDhcDlcrwO51&1 ֍IjIdC$oLRۘmL"23'mL6& ׍I$Id>CE16&cɆ*b 6&cɆA6j6up8ZQFs~Ckc21lnL6&mL6}T{_5f[aNV-[sq/Wőo;0Ok:7Oŵw[7Or^o[\=L~$G tcN=tݟt2zjq=Nd {ǥ2|C+b:IϧmLWۘm wK1cb ښ1ۘA6d  !c3g3gm6f ù6u@6fm6fGN\fbfgh36fb3Ɇal8c8lsҟژm$21ژ1ۘI6d nc&1Smc&1l-w{U&,6צ6faȆ1 ۘE6d >̂s,Y,!c9e1Kmc1lDO3c7f~cllc6ِ12)6fcɆaF]g y{ՍY l!c1ژ1l8PsmjP|G6~KwwdCwNm;l;!c͜16<ʝ Y ﰍȆaldvHO.chm|m!>yĘcl~p#ʈs6`sȆḿ6m6 ;c8lvK?`엟ژm!2act:nt16`sɆvj=31:{Qcc.ٰ5s6bsɆ½jsdC ;c8l?1ۘK6d ^7º1Wmc݆|s#oǙ[go[`[h[d2222222222222e'zF&ϖ͖-m햱azi8}\S{q9i0|y{u׸|M=\S}q=8͜1rC[5{q2}fg 7qo(Ifb3σSۘm#2_S̓kyjydC0,K1ݿkSF_clcِ1!cssm,6 Xm,PXm,$XX\Sl7MYXH6d nc!Pmc!lBhcBlc!ِ1B"e}cXXD6d ^ۋ6aȆg^g^XD6d ncHmc8^r)LD7~Plnj?`? Aml!c^؋lЯR21֍jdC6C6cɆm,6m,6 ?Y m,VXm,![KDX%!c\XB6d o,%!cM16g9>XJ6yf41֍jKdCuc)K6bKɆY YXJ6d 1aÜzY 2:YYLen,uc2lcِ1s@g -SXm,#2S9e2lcِ1&Lmcl {rvcX7m,6 ?3^/WXm,'2S9erlc9ِ1x/XXA6 ۜ&    !c9eSVm6V XmPXm 2g dc lc%٘P.yMX j+dCggTXm$2SV9eJlc%ِ1"'O8z.chm6VSO}VX%{^{^ XE6d >s*U*!cpUjUdC069c8lG~e Uj1[cEW^tjlc5ِ1j/Zmc5l|NY jdC06r9cwCkc݆#5߭/j8[h].\ߋۺ5FQ;Xcw`.ߋ'n %5껿~Syq=7/>v5{v9JzkE=X Z_Z21sZ\֒[k"zDp@6֪m6֑*=Ɣ1192Ȇuj밍udC6A6aȆuXXG6d G}:uƏdcm71~GɆ{ƏƏdC6~6~Tlf3}>!c5l3Æ}j}dC6A6aȆm6m6kvebW؏m'2aدO6d N)6cɆ)j6ypn]͚=xm&v.^|ۺ4v_u!2Po.]>q8C6d >s3!cpg3jgd-w-11Ίq֍jgdCu,g6bgɆm6Ϊm6Β gjgsd㗥VD89s9!cwvwvΩm6Α )rNmql=mS8m7exŦ^mbu<6c"_j籍] o6c["q8q۸@6\7uqAԍ n\P۸m\ 2a;lِ1xݸ !c8l821 jd##=61.q֍jdCk_k_T۸m\$2qڸq۸H6d o\6.m\6.Q&%%%K%!c=Kp%lِ1K%K%!cpKjd뗭&e2|{Ym2ql"7.m\6. ۸ m\V۸m\&2_^6.m\65p&ga-B6xvfu@q۸B6d < |rEm ql| {am\6 ۸m\Q۸m\%&UQ7ºqUm*ql߸ jWdC딫prUm*qlUhU|Dsru[ۖ;{Gǖ'g疱?,c,c-co,co-c,c-cZ>X>Z>Y·F5n79f3]xlwM]wjkoqpF5N58]S׸k]'cq5{<qĸ.''q۸N6d ]uu!cpסjױdCuhu G^=ܚ#D|w(CM~W.\ߋuCnw`.uÓ~Ww\<%{;7螷*[bic ߀ ݿ 2+n \nou  2+n@76n`7ƕɣF41nٛpoMl&ِ1\qֈj7dCkptSm&qlMhMlf3&-Q7nqKmql-a#zKmqln܂u-lِ1[-[mطvMymml6ِ1xݸ mm!cߟ ml6ِ1m}[&Q7qGmqlhlِ1xݸ;!chl.ë>L߸ jwdC]؋U۸m%2qڸq۸K6d n.qWm.qllab6A6aȆKKq۸G6d nqOmql=h=l>HowLbNjdCu>6cɆ):}l>ِ1xqڸqx@672@xm21 jdCu!6bɆ甇pNyxH6d ^7B6bL{jb<6A6aȆ*bm<6 xmĞ3gLml|NygjϰgdC6A6aȆg3gsт~4x.~y{6cɆm<6m<6 xm6^m6ސM7x7jo7dC؋Qxm!2E^l ِ177[Z51:-ٰ}Vm-lF3Æc!ѻg16boɆ[X7ުm6ޒ SBo6bƴ }"rD6aȆ}}xG6d ދ;w;!cpwj6Ǽ7$ 3?M{^-]|v\<.p^U~Sp~{׃?/QS~COQO׃?|OId >W E'?6T@66!e&|Amlhlِ1!cAmllZb&GQ7>ºQm#l|?>m|6> m|Tm|$2D6jf dI㓰 D6d 猁~K'lِ1\~Rm|"2_~6>m|ps_4'ȳagq$r-cI,cI-c.1WX2XrX TԖ4t L̖,l얱17XNX.XnXX^.сDn%rC5OIOu"7_"74c-b}DnhOָDn)PSǀ_bBAMnoNjdC}sb77'VHm$&2HHL6d c#NHHB6WﳤDHm$QHm$!2HHB6d %QHm$!2I$jId#dޙ O*I3nNRFR!c9%)Sm$6 ׍n$UHm$%2Hp!]*dTp 7\6\ !c놋چ B6d npQp6\Ȇ\  lÕlDM|4pu W WlÕlnº᪶m p6\6\ W!c+᪶m$#=>Km#7~#F2l#ِ1dF2dF2!cpɠdjɰddCsJ2h#F2l#9و)K61 ɡjɱdC6C6cɆalTq@'&WHm$'2ɡjɱd#Û541RodR)6R`)ȆHHA6d ^7RBm#lF h#F l AB_^ //Ȇ }dC~pC~PlF&FJ۷}ի&FJ1sJJFJ!c֍j)dCu#%)6Rb)ɆFJF*hۮlEZTF*TF*!c~#7Rm6R HmRHm"2"Jm#l8H\Ú?ɆjSm6R  Zm#5l|_45MHM6d o6Rm6Ґ H#74ji4dCsJ8QHm!27~#Fl# ِ1HHK6D?#iaHHK6d Ӌ;c8l$۵d?HK6d n#-Vm#-ln6Ҫm6ґ}]+H'ְ6F:l#ِ1\E 4SHm#27~#F:l#ِ1xHmSHm'ޫt 51һI~'Fzl#=ِ1kwC^m#=lFzh#Fzl#=ِ1xHmWHmd g3>uAԍ ndPȀmd 272md62 mdPȀmd 2 jd#w&FFodFFFF!c|AےȈmd$2ȨH6d n##Qm##lP$E3}LjLdCF&LF&!cpLjLdC3A62m8>L64ym]f("ZDfsq/Wx2dV;lw`.Wu~[`dVo.]o2{Y}3z;x?"Ax~\ݗ1x=A,d!2Y`=Ȣ׃,$BsEh#Fl#+وv3\Ս3 3Um#+lFVh#FVl#+ِ1FVFV!c"+Um#+l +е#xN >'ɦ F6d ߙ wfSȆmd#2 Ȧ F6d 6mdSȆmd' 1.³ýjٱdC6C6cɆmd6md6 )١jٱd#g˅E9DFF!cp3Fl#ِ1FF!cp9j9 78@+pu 7 7lÍl܆ᦶm p66ܰ 7!c9 pSp6roKyĜ)y6`yȆm6m6 mQȃm!2S@y6`yɆWlSLnu#F^l#/ِ1x/y6byɆȫK6d x^h#F^ 09Fs"̎|s<[ X Z Y [ƊXƊZƊYƊ[JXJZJYƾ}e`hd2V2eeeeeer>L>q?N5.q||׸|Td ^O]j{|S׸|xO6O^}__m#?l|jdCOm6 Fjd7cĻgg6 `Ȇ*b 6 `Ȇm6 m6 FjdGƘŜR)6 bɆ甂pN)Q(H6d *T6 bɆ甂FAF!LB]B]BjBdC6 A6 aȆ//Q(D6d nQHmQl L9l&P m6 _ _Xm0QlnuFal0ِ1FaFVsED(F"F!c~7m6 E`QDmQl(mQ(m%S*sb>N)J6l?RTm(Qlw늺߭+Q(J6d n(QTm(Ql|R(Q(F6rN:`(Q (F6d \|.XLmQlbnbjŰbdC6A6a<MۺۺjűdC?U TqFq!cQ֍jűdCpFqF QP}7%D(F F !cQ֍j%dC%h F !cp%j%dc] o51JpFIl$ِ1L/"eإ/J|Ck$QlFIhFIl$ِ1\q](m"U[`(Q (E6d Mn)Mn)RF)!c~7Jm6J 1:snZ6y}iKT&K(K/"]T?z?vٿy5u_i)3L弸N./_zPy#+c4w4|O4*vP׃@~giҸ&271j2d#e2F2F!c=2pOFl ِ1xQV2je2dC6@e6`eɆ_ZB31 ejedCI$e6beɆצeڴFYl,ِ1FYF9q3feGMr⽌rrj對rdCrpQNmQl|N)rj對rdCp֦6aF;bbu<6cɆA6vp(>ݡ KCk'Zmklk!c9k8|55ِ166&2acYsv-Y dcnRf61*;װFeak+mT6* }U{_6*cɆpNQۨL6d 2|VYm2 (5߈98| ِ1:NFml!c ߨm|m|C6d Fml XbL*❝**jU*dC6@U6`UȆmT6mT6 U`/ZEm QlTTs&FUQ7ºQUm*Ql|N 甪jUdC6BU6bUɆBU6bƮmxabT#twĨF6%q萛6aȆaE ۱6aȆ--Q ۨF6d ^7A6aFҟxebTu:6cɆFuX7mT6 ׍nTWۨmT'2QڨQۨA6OX睉Qiü[l7jm6j w@Pۨm 2QڨQۨA6d >Ԁ6jm6Ɇt&xúmcdCw{6ܱ w!cpІچ;N6d ^7ܡ w w|0=Zږ:z1XC˘eee22mkjkfknkakikekmkc󱌵ZY,cX|T~ɶx3ǩj5&89c8j\HNK~C[jWjj}W׸Td >Մ5_-.&F-_ Rۨm"2ߋbjm6j WKmQloM dF-l6xD&FmՆQmFm!cQ֍jdC6jC6jcɆFmhFmlS)M:FhFlِ1xݨF:F!c9Sm6 ۨmQۨm%.4&F]a.QWm.QlnԅuF]l.ِ1>]]OWWm.QlF]hF]lyߥB7~F=lِ1>]=OWOmQlnԃuF=lِ1zF=zvojG^ m]}X-EԷ0w5>-jœ{;_~S?uO8> aѶ] bh~oA2|A\ \@- HAhFlÃldf&+<\ᡶmx  P6<Ȇxmx`dC6<  l!Xu.wx>khH6d G4}DCFC!ciC84Thm4$2߷hm4ThmxJ&nxmxbdC6< O OlÓlnxº᩶mx 6<6Da5l&F!c~ 7m46 a5l&F!cpM&jM oqK!&8mx )pNV6Ɇ7j؆7ِ1 oh[mhJ6&>^h*FSX7m46 }5{_M6bMɆ›½jMdC56m46g/Lًwv߯;6aȆfpNi hF6d >4sJ3fF3!cp͠fjͰdϒWs\m9ќl|NijͱdCu96cɆ)͡jͱd#V׌M9ԂlȴVw F !cuJ NihA6d oF F !c8l821j-d#>oc&FKoFKFK!cp-j-dCڶڶThm$2-j-Vd~YʹN16ZGK6ZaȆm6Zm6Z )JmъlF+hF+l5٘u;&Fk/Vhm&2hhM6d >sJkFk!c5lkhFkl (xh#z6mhC6d ދh6F!cuJNihC6d o6ڨm6|Ɗ&>nm`>dC6|  lÇln᣶m )>ІچіlTx lb6Bm6bmɆ甶pNihK6d n-Vm-іl|-Vm-K6&S|⫶m  _X7|6| _!cpІچ/K6d ^7| _ _l٨wK϶&F;Q7NmюlnuF;lِ1\öShm#2EA6a~dp&'~†᧶m  ?X76 ?!c놟چG6d ^7 ? ?lßls?S6 !cs9j؆?ِ1 h_m'2Іچ?@6$">o l@jFِ1l#lFm 666o """]N?7I|@@s߼@o.]o=T@=w?/'ܗ Xeeeee,22nbjfnaiEZz[XZƢ,c,c-c,c-c,c-cC,cC-Qzr+;$ XłU,kATd ~Q|(H]ςDLZׂԕ-kATd qA &Q_,lCjF0ِ1La; 8Xm#&2 g``l#l 66hUz!Fm {= Q6BȆF!j!Fِ1h#Dm#%q//41BPh#Tm#%2לB6BP!c}y_F(J6d o mmbFzo~h/l6ګm6ړ ￵o6cɆpNihO6d ^7C6cƌ-&`bt{lF!c!|sg16:`Ȇ렶@6d ދv6:mt6: GzQmtTmt$2ᰑtq.e>H6d otFGFG!c訶D6 oa&F'1tsJ'NF'!c ֍NjNdCsJ'8tRmt"2 褶 #o*|3u# ֍00l#l|)ajaFِ1x/{00l#lݳ0h#Lm# L667L(a謶L6d caZugFg!c93S:mt6: ׍FgF8٨x#\ԍpX76±p!c9#?M`bhmcdCsJ8S6±p!c5l8mt!ۼiEa7]6`]Ȇa}16$Obhmt6 )]Em хlnt6mt6 }ii#bt% N&FWl+ِ1)]6b]Ɇ甮pN骶J6d n+Um+эl\:YM`MmэlF7hF7lِ1nF7nF7!c^Mmѝlz{ܷ&Fwga6$ K_6cɆa}16lvWmt'27~Fwl;ِ1WwhFwlx4{&FMnMnF!c֍j=dCFoPm 2E{@=6z`=:&sJ/^F/!c ֍^j^dC^F/^F$H,61"Hh#Rm#ۈ$2nDmDbdCOE"6"H!c^4ڈTۈ6zo'Pi[ mVm&2譶M6d ^7zú[m7ћlFohFol٠L>>j}>dC{}y>F!c~7m6 )}>j}dcIY&F_qvP_xvP_F_!c֍j}dCUm%2}j}(QvKt֛QbNsJFE6d n# ڈRۈ6ȆWFE6d 666y33I?~v.^/΋#'g[~~Syqty?\=5}ӷz~g_}zПv׃@=fcWA!c>?_m?1lvc+blcِ1~9@mc1l{jdC6@6`F +(1Pmc 1l|Ok 1H6d G 3@@!cs 1Pmc 1l\Xίc11D6d ~ x A !c9eSm 6 ׍A A`B߿E16cɆ1L6d > s``!c11B6D1DC`1Dmc1ln;c 1B6d nc1Dmc1lhclc(وz.z71N6d 6cɆo1N6d nc81\mc8C6v db8sSbȆl#l|1j1F ِ1x݈u#Fm#ۈ!2mĨm`d#7%nºmĒ ? c6bX!c FF,K6d n#ڈUۈ6FE1BԍnPm 211A6d ދ!cٝ16FgVMwCkc1lvZmcX딑j#dC0h[g /t])Ebhm6F ׍nTm$2#?1Z#QdcË31F~'w(lcِ1>(O7Jmc1l(hc(lcِ1B':~1 ۈ#mڭĈu#֍88l#l|NsJFG6d >9%Nm#ۈ#2QaÜ]ڈ6F ǁɞushF<Γ5녉/WF<O6d o~#^m#ۈ'2nīmcdCu#֍xxlc 88Q1F|;~;Fmc 1l|_t 1C6d ^71Fmc 1lF>g .?p16`cFЭc.51Ɗ1֍jcdCX؋Um%2ca1K6d nc,1Vmc,1l()c58avf8q8!c}qp_t8lcِ1x8q8!cp㠍qj㰍bŰDg)FsN1u#lLPH6ȆF j Fِ1y3OPH6Ȇ{؋&m$`t6Njb{xx!c1֍jZއ[+ww-^@N!,@! (E(.OMY9֧}/fb ɆBX7m,6 o, 6b4GדX$EXXD6d ]װ6aȆm,6m,6 )Hmc݆!ٺx5gj"};-,;0O䕝-g/}s>ٺt͢0[kb\9_Z13RzK~x\ٗ1x=X,Q;Xr czX׃%$B03FΎo\Ckc lzt)X*l,6m,6 KaTmc)lRhcRlc)ِ1fU*;=N 212˄e2e2!c ֍ej˰edC6A6aȆaF!guܯZ˰dH﬷e61s91m,6 i9rr!cr6]XN6d S78c8l8 4.N ԘuLnuc lcِ1xX  !c֍j+dC0u3Ʒ~#UZ+dJh?s+žJoRmc%lFg !+6Vb+Ɇm6Vm6V بmm'Jlc8آߛĜ )6VaȆ{U] XE6d >s*U*!cpUjd Zkbsj8VXm&2aXXM6d ^7VúZmc5ljhcjlÍl\l&mmandC76ܰ 7!c놛چF6d n pSp6֐.m)cXXC6d 3tvpبr[qbhm6֐ ׍5nQXm!2YTw2N 5؆;ٸc?†;᮶m  wX76ܱ w!c2}j؆;ِ1 wh]mXK6X+zѵ]XK6d s?Wg G'ڧi816bkɆm6֪m6֒ X mUXmx ziCa=Cm 2nxmx`dCsS<6< !c~j:1~Munuc:lcِ1v\îSXm#2XXG6d ncNmc݆00wvxZ222222222222emcXZY[XZ|-c,c~Ö1QXe,~OqveЫ)j'qk'8pT8O\<| ۞k'8F7T8O<'_jbkpM^mc=lzhczlc=ِ16cɆm6֫m666cx|lcِ1==66`Ȇml66ml66 F՜16[RĉH6ݟcblsF8lT؈ml$2aبH6d nc#Qmc#lnlucFlc(TqIؔ&&/+z&q4cV 66aȆml66ml66 Gf&M&!cpMjd񁴓Lb/f3܋٬L6d >lsff!c֍jdCpYmc3lTra"%-!cp[-j[-dC{[-!c֍-jxZ01uVN٪J6d nc+Umc+lVhcVlc+ِ1tE816bFSIimbl6؋nS؆ml#26mj۰mdC6A6aȆ__ܦ N6 ;51֍j۱dCv؋nW؎ml'27~cvlc;ِ1v;\nWnxky|nC-b]9x"vvI>[곿~Sp>[փs׃t5SԃT줳/czփj;q=Id T؉N!cs'1wm6vm&>%]إ E6d ncKmcl|bܷإ E6d 6צ6va^d+s?61DuKm "2mxmxa^dC=16 /!c )^j^n19Gnn!cpjdC6vC6vcɆnX7vm6$. c;m6 [}=!cp{=j{=dCoQ؃mxw}- ooxmxcdCHʗ7ٰ/o olÛl|m W'j؆7ِ1 oh[m!7e#>j>؆ِ1Q6|Ȇ>j>؆ِ1ܷQ6u;b11~c/7m6 a#paqchm6 a5^^!c~c/7m6]l'l6m6 a#N{|qbhm6 )Omcl>hc>lc?o&~ac?_mc?l ;@m6 o6cɆm6m6 O .=8 z=q8@6d N9)6`Ȇ8q8@6d 6 l C MAhAl ِ16bɆ甃pN9q8H6d ^7ºqPm K6LW6|6| _!c 놯چ/K6d ^7|aU6|ɆE}ᾨچ/qlDŻ \XkCjCdCH,bo,R8m"2QacsL'!lِ1x8!C؆ЫҍM ?Q7`S6Ȇ~j~؆ِ1a6 ?!c/?姶m&wBWXdbprXm0qlahal0ِ1r)6cɆýj 1ז 76 !ckmZچ?O6d ^7aW6Ɇ?jAoZibuG6`GȆm6m6 G`qDmqlhl(٘»@7㨳56 fQQ!c9(Sm6 )GrTm(qlQhQl#l$j]ѽkMbNJٰ|#@m# 2mm`dCu#֍l#lFmy~41ul: 6@!c밁:lF H6d 6@!c5l \mmz#&`1qXeee,2v2v2v2f;k;g EX"-cQ hXeee,2v2v2v2eee0AT28}&)HAoR׸ \エo}sD5N5.ָ u 5.j 8k\$o51ųY``l#lF0m z;Xm#&2j;c|n]816cd#v1Lmql1h1lِ1x81c1!cq ֍cj6y7M3qv;0O_;q?n?);;s~׃:ewVm tB5 ξߥߥvA91x="B"Bp=!2_+@!j! { M h lِ1I`  !cp'j'dCs 8WP8m$F8>kb6NB'6Nb'Ɇp8q8I6d n$qRm$qlnuIl#lD8Kabi((B6BP!cmbdCp>Tm#%2 mbF D8)S)!cq ֍SjSdC6NA6NaȆaT7].%N Siq=&i6= צ6NcɆatvH߆A816NcɆu? u?q8M6d ^7NúqZm4qlSgĜr)g6`gȆX7Ψm6ΐ g`qFm qlhl#llFL0a# S6ȆkajaFِ100l#l hFql-XqIqV8 mU8m%2ga8q8K6d ^7ºqVm,ql^^jgsd#AY.D/z6aȆ9X7Ωm6Α 8mS8m#2`8q's8)`bFF8N6d /E6±p!ckhZF8N6d n#W6Γ/jcbu<6cɆpN9q8O6d nul:ِ1uX7m\6nՅ,Nnb} GP۸m 27`ݸq۸A6d G܀}  !c ߀qnoޗ^aiy?-m]=؟G,c-cO,cO-c,c-c[^X^Z^Y}}}}}&ո< FwMe:5&q75&q7E LMukMq2q7aq7qI5NkptS]nO11nnm6n wKmql-h-lِ1xot F6naF mOobv&V۸m&2w^ﻭq۸M6d n6q[m6qlj;dy&؛fm6 ۸mQ۸m!2_o߁;jw;dCs8Q۸m%/d31:m]a[U۸m%2ߛ fm6 g.|]]!c𽘻p/]l8;~&=o܃={=!cgdgdm6 )rOmql|N{j?F;ׄ61O??ɆƟn''ِ1'STln Ɵjbuskbkp {_m>ql}h}l>ِ1}{_m>qln܇u}l轣[?uz)!c5}x@6d n@mln`Ȇalvqbhm|6>Tw~Q\_W6>bɆH6d ^7>ºQm#ljOdcyt~yG0kOjOdCs'8|Rm|"2&|&'lِ1uOp'l3QoCMϢ jdCu36>cɆ{ϰL6d n3Ym3llY{9~ pΣdEm l| B6d n Em lh abaow##e,e,e,e,e,e,e,e,e,e222e,e,e,e,e,e,e,e,e,e,e,e,e2222:O_zϕsEtsʿN&7z9u X&sE5Nָx)'㹢NɆo^ߕ⻢5U|F|!cpjdC6C6cɆmć6m6j'80c \Qߜ@m#lFh#Fl#ِ1FF!c(+m$6 Z#HHH6d 7'tE}sBFB!cp j dC{ ]nBF"l!馛DF"DF"!c$fS["am$6 &rE{6aȆF"X7m$6ib$6C6cɆpNIHL6d n#1Xm#1l^Į^j$d{?z11uJNIHB6d"=Fl# ِ1~WDm# lM{$jIdIFRFR!c~#)7m$6 ׍n$UHm$%27~#FRl#٠7 ,215l2M HF6d otr@߈H HF6d ^7Lm#lF2h#F2l#9x?yQKM>>jɱdCFro$WHm$'2aHHN6d ދ&hrF 1v*&F ыh F !c]16nr`Z)dCkp Bm#lF h#F lÅl7:" om`.dC 7\6\ !cp.Іچ B6d npQp6Rۧ5oH)l6Rm6R ))ᜒRm#%lH j)dC6RB)6Rbu=&F*ыh*TF*!c{MR{MRm6R `Jm#lF*h#F* C^ߑ!{ lwN-;sD߳u;nw2|>Ͼ9x vg뾃ߩws^$[ bH 곟׃te ^RzZ 5Ɂ԰H׃$BkpmZm#5l(X&FW~{Wt{4F!c3 i6`iȆ4pHHC6d >WsE4FZQeMu;Lnu#FZl#-ِ1xi6biɆFZX7Ҫm6Ғ _'I UHm#'>H߇;F:l#ِ1tF:tF:!cp頍tj鰍tdCI~#F:l#=h#M MbO+=6ӫm6ғ )ᜒ^m#=l|NIj鱍dCsJz8WHmd N512֍ j dCfpEfPȀmd 2`Ƞ@6d ^72Am#lt-&QԍndTȈmd$2S29%FFl##ِ1xFFFF!cpjLdOR{Zf&aIm#l| a3md62 ׍LndRȄmd"2S29%F&l#3ӭMb33̬L6d"/Ffl#3ِ1FfFf!cp#Ffl# xm)#S9%Fl# ِ1x/Y6`YȆmd6md6 mdQȂmd%S}OjbdYFVFV!c$1н~Y6bYɆmd6md6  mdUȊmd#]= 31 ֍ljٰldCu#6aȆmd6md6 `Mm#J6OPqX*+j؆+ِ1~^?W WlÕl܆+᪶m }QW Wl#;z]fH#aȮN6d װ6cɆװ6Fvl#;ِ1xFvFMnu#Fl#ِ1La{DF!c֍j9dC6r@96r`9ɆyS mTȉm$29aȩI6d n#'Sm#'lFNh#FNl#ؗ~+#7rm6r ]16 Ɖ E6d n#Km#l| SrmF}?Ln{<屌`kgo2V2V2V2V2V2V2eeeeeeeeeeeeeeeee0U>;[[]rjp˭qqM5N3w-V׸ܸ'c5Unʭq=8~p﬷M66'2{߫m|m|O6d >}66'2jcyFrsjtgb01~uX7~Pl|\oِ1+l~?mm%?z/#ȫK6d ~R^xR^F^!c͝16̇^rĉK6d n#/Wm#/lbg&F>1sJ>|F>!cp|j|dCHNJ>a;)6aȆ|ȧO6=&F~Q7ú_m#?l`~x]0F~l#?ِ1lNJ~F~!c~#?7mp?zPy~3 w{g}? G 2+j;c8DtC+Hp(Q(H6>TG0ɆmàFAl ِ1FAFA!cpjdC6 B6 b–bb}D!GR(m"2# >F!lِ1Z5JF816 aȆB(Q(L62Fƻ2(a6 +FaFa!cpjdC6 C6 cɆm6 m6 lŮMbbk"pmZDmQl|N)"jE"dC0돚N(*(m!2NR^')Q(J6 Pcbuߟ*ꊾ?UTm(QlFQhFQl(ِ16{Pppqc*&F1TsJ*F!c~ 7mT6 ۨmTQۨmT!2Sj8c8lGRʼnQۨJ69vjUFUFU!cQ֍jUdC6BU6bUɆFUX7mT6I9mbT{_W5jF5!cQ ֍jjհjdCF5oTSۨmT#2Qa㭏[oƉQn0~x԰մղնձյճշ5555lkbkjkfknkakikekmkckkkgko`hdlbgWul]yuW]]٪+9xou'eJgUW1sO^l]u]uc\[yڱ_54%jyZ :2jyA < 2yj@5"jy1L?\٨QۨI6m+sRXGׄj5dCׂkk56jb5Ɇfk½ٚj5dC0=O]g QCk&Qlrq|Ĩ%F-X7jm6j ׍ZnRۨm"2Q ڨQ ۨE6d ^7jQKmQlR:6(jm6j ׍ڰnVۨm&2Sj9Fml6ِ16>SlթQۨC6^_HĨ#FX7m6 ۨmQۨm!2QڨQۨC6d 3twv@816`u;hbF]oUۨm%2S9F]l.ِ1#$N F]!cݝ16ҤR4N F=-GS9F=lِ1xݨF=zF=!c~7m6 ÅzdVm6꓍?~sQ_)R_m>QlF}hF}l>ِ1l}7[_m>Ql.'*Z_m>рlx@) @mрlFhFlِ1xhFF!cu_#%khH6Cr{gb4sJC84Thm4$2hhH6d o4FCFC!c_#%56bF^zHԍFn4Rhm4"2E^F#lِ1FF#FF#!cpFjdcWjb4u16cɆ=k =khL6d >4sJcFc!c_#%56c?2ש7YYmglg!c3?mmL6d nghgɆ"~ ԋ3фlmM&FhFl ِ1xM6`MȆ&jM&dC0h{g (Nj#ʼnhJ6:6h*hhJ6d n)Tm)єln4uFSl)ِ1\įjMfd#nU ƉhM6d n5Zm5њl|Ni j6d#_Xhbu m6`mȆ6hhC6d n Fm цl.@6ڨm6ڒ9Qm|Lh jmdCH̖mɆm)Vm-іl| a۪m6ڒ )mVm-юl-[h&F;-v[ 6aȆF;X7کm6ڑ hmShm#2hnpL{LRM0$բZD{sD_IjW;how`{&=jbׂ{;6zaȆYY E6d >sJ/^F/!c ֍^jdsO 21z jdCsJo8Vm&2譶M6d k[m7чlLE^Flِ1xF>F!cp}>j}>dC6@}6`}Ɇc#P諶K6d ^7ºWm/їl|/K6d >sJ_F?jHAgL~F?hF?lِ1OSm#2E^F?lِ16aFn^_mWm'27m6 ׍nWm'2S9Flc٠7FĽ6`Ȇ1~blcِ1}H}H6`ȆpN1H6J.ey1Pԍn Tm $27~c@lc ِ1x/:6bɆ"~ T7m 6 ^]db r cٰm: Rm "2}} lcِ12)6aȆm 6m 6Ejb uc06cɆ`X7m 6 ׍n Vm &25j!d^CĞg>Dmc1l{!jC!dCucC6`CȆm 6m 6 |*zѡ1J6d nc(1Tmc(1l| ;am 6  m Um #W:޵jb {0a0!c{[{[m 6 ׍an Sm #270najðd5>019e8Sm 6 a1\mc81lphcplc8ِ1\įpvFg몛'̾>[7v#"FE'v֍NF;0O䕝֍a?)؟ٺps`$Q2~{jsH8WT/cz0փj#q=Id ^Fz0R-b$#I"~ TFm6FYF^J%l6Fm6F mRm"2;Gm6F _'(QhĈ}11Fh1M6d nc41Zmc41lnuchlc4ِ1^h>Zmc41lYt[c;1jc1dC1p1Fmc 1l|m:MǨm6Ɛ )c2Fmc 1lxS̳cFc6bcɆXX7ƪm6ƒ ׍nUm%25jcqd#bbs88Sm#211G6d ^71Nmc1l.@6Ʃm6~!7:x/ mmB6d Eml!c$/j` EEmlc<(6dc#Mb2Sƫm6Ɠ ׍nWm'211O6d k1^mc<1lFƻ 1Y72Ȇ{ j dC'k6&`Ȇ pN1ۘ@6d ^7&1Amc1l8~iĘ():eDlc"ِ12)6&bɆ{щ1ۘH6d k 6&bƩU+61&wL1 ۘD6d c3FxWNRۘmL"21 ژ1 ۘD6d >Ls$IdьLɢnLucdlc2ِ1x16&cɆmL6&mL6& Edq똦93Sv \NQۘmL!2Gx Gxlc ِ1x1S6`SȆmL6mLp&}#S-2626262elelelelelew<|B"bR2r J*j˘ele22a[gy?TqެTQ7U]7j翩pqSqJ5Np=U]7j"~ T㦪kTs  !cpk lc%ذܿRX mTXm$2+aXXI6d nc%Rmc%l.@J*Q8LUb SVm6V ?[ >[Jmcl|NYUjUdC6VA6Vaƾ / 41V{vV{vVm6V ׍հnVXm&2aXXM6d oVXmJ7_9pE6ܰ 7!c16lFmandCu 7 7lÍl| makFmM5bNY5jk5dCuc k6`kȆm6֨m6֐ Su5؆;hL21ܝY $&چ;N6d 6ܱ w!cpІچ;N6d o~]mXK6b3hVSuZZ!cpkjkdC{_kZZ!c_Սjk y{'ccj؆ِ1 hCm 2E=`/꡶mx P6֑ LJM61։^tEשm6֑ XmSXm#2XXG6d ދ:uvoxZ222222222222emcXZY[XZ|-c,c~Ö1QXe,~OqCwN3<5T>*VoS9yk'qTd k*Ou5Γjk'qk'88OX<5זX/o^XO6d >zz!cy=׫m6֓ Fao^mc=lLPqXlc6hlcِ1  !c֍ j dCpZSmP؀ml$I[cا6ml66 ?/>/Qmc#l|/f#܋٨H6d nc#Qmc݆!Mٺ3mW|6El0O=[ 6'vxmODlRMou9ߤ>p=LIP|U'[6b[Ɇ{̭ܪJ6d nc+Umc+l|?ml6 fƺۄm6m6!cp۠mj۰mdC6A6aȆ"N n6mvQa1Lbb;ܷخN6dova]mc;l|mMml6 )ᜲ]mc;l{Lj;dC;dlcِ1x!c_ءI6N^cSv9eNlc'ِ1;;6vb;Ɇ);:eNlc'ِ1N.qMM]bN]j]dCuc6vaȆ.X7vm6v aw5.]؆X˻L /1x9Km "2FbFԋl؈zmxa^dC6 / /lËl܆᥶m&w6 mb6vC6vcɆnX7vm6v )ᜲ[mc7lnhcnlcg}&1s=!cgrgrm6 ׍=nQ؃m!27~clÛlf& mxmxcdCu o olÛlnxú᭶mx EȆچ7C6&EkS_XaФچC6d  lÇl|om`>dC6|  lc/H\:mGM j{dC{^^!cW_m6 EثG6nzi<#l**'}j}dCS؇m#2اG6d ^7OmcldqcaدO6d o~~!c9e?Sm6 a?|~ѥ`XP^x^/=6`Ȇm6m6 a#^j&F2<8N !c9Sm6o:cbu 6bɆ8q8H6d N9)6bɆ"~ dAl×lww9i _1}Xڂ3eU6|Ɇ/j؆/ِ1;};}6| _!c7|j!QnNn"LCnu!lِ1x8!C!!cCp!lِ1\į!C؆zQH'lA~j~؆ِ1 ?hOm#2E`/꧶m EȆچqlo1K&a/zV8m&2q8q8L6d n0qXm0ql| {am6Ɇف31 h_m'27a᯶m )pNW6Ɇ omcGF̾G##!cq֍#jG#dC#prDmqlnu 1G3IT73IGjG"};x$;0O^LQXQ7O~$ .k3A}pP; |""p= 25l#lqO}#P66@!cpFF H6d n#T6Ɇ"~ d#Pm#noޗ^a#2v2v2b;a;i YZY-c-cHXee,2chd]]]afnayKոku 5.ָ u 5.j k\qATd  u 5.jk\qA`Kab FF0L6d n#V6Ɇ`8mcdC6``l}#i&1>WM6aȆm6m6 8mS8m#2q 8q 8N62DԎ}8.l6m6 a|\m8ql|N9jDZdCpq\m8B6K9>Lab9%)!j!Fِ1h#Dm#!2 o!j!Fِ1{B{B6Bd#/&01Nq֍j'dCs 8P8m 2SN9 lِ1x8 IMnuIl$ِ1II!c{HN{HNm6N EZIF((p RPv(|^;Tm#%2SBm ׍PX7B6BP!cavwwF(ql;)`bu6NaȆr )lِ1S)S)!cSiQ7nLihil4ِ1;NwV8m&2EO^il4ِ1\įzj3d#|v.&ы3!c~ 7Ψm6ΐ ׍3nQ8m!2 l#l}\&FanmaadCu# ֍00l#lFm a S6Β BZ:㬰q8q8K6d oYY!cpgjgdC6Bg6bF}Fhbs98S8m#2S99lِ1s9s9!c_8q'39n516a6±p!cgr3jF8ِ1x/{ppl#lF8m'zqܥql؊yy!cq֍j籍dCu<6cɆ):yl#ܳz=ALQ7"`݈Pۈ6"ݫ"vvFac1h#Bm#ۈ0w|<GmD`dcbD^4jF$ِ1x݈u#Rm#ۈ$2C$|CF$I6d n#ڈTۈ6FG371(h#Jm# ۈ"2#ID9%Jm# ۸@6ܒzt)hb\6.@6.`ȆX7.m\6. ߿q޿qAmql.@ F43b  װjF4ِ1hx-Zm#ۈ&2_DuJF4M6d n#ڈVۈ6b1m31bķb\ѷb6b!cp1FF C6d ^7b`݈Qۈ6bȆm@1j1v.uJuW'uIm;ZEsD_\T;hw` ɜG_}s_E9%:GV,J=wIM/%ٿ%:2Nr ^'vp ׃K@=%c^R%!ckh5KjXQ*Nf% c7sEF,K6d n#ڈUۈ6bɆmBjF,ِ1w{bw{b6bdlFV11.eq۸L6d 6.cɆ{p&q۸L6d k9elG}WUt}'F)$@ {+{*U.tD @Z /gb8罗_|o֬lt*WęWW6`WȆ{+q۸B6d ^7qEm ql|N+jWdZvϱs+W*\^U۸m\%2Waݸq۸J6d n*qUm*ql|*Jqۈ &wnQĈpMM݈ DmD`dC6"l#lFmD ۈ6"6"kd'[-㚨`ݸq ۸F6d >\s5k5!c~7m\6 `qMmql )W]8:%q>D3;"-xܴݲݶEYXƢ-cw-c,c-c1Gǖ'XS3Xe,222`{i{e{m{c{kKI5nR ͟S8?2#:?R]"q'c/k\$8F7T׸H\"| ۑ翛d#`X嚛7}7}76nb7Ɇߓ{'Ml&ِ1w76nb7Ɇ翛pq۸E6\3V&-݂-[-!c-޾q ۸E6d 7߂}-[-!cq ֍[jd#Kŧnkb6nC6ncɆo Vmm!c96Snm6n ׍۰nV۸mD+UHĈD~6(!cFFE6d n# ڈRۈ6ȆK%FmDawF w;;!cgdgdm6 )wrGmqldwm6Ǝϝ51Ž&^hhl#lnDúmD ׍hX76h!c8ķhhl.٨<1qWwaqWm.qlficqNCk.ql]h]l.ِ1]{Wm.ql+ւ_\S۸m#2`ݸq۸G6d >܃s={=!c~7m6§gb]އ]W۸m'2+_Ɇ|W۸m'2aݸq۸O6d ^7úq_m>C6k#F1Qۈ6bȆ3Ǩm`1dCu#֍l#l߈FF ltiQ-E^lِ1Q;xbw`>uOOW|} O todC/VU_X\bzvA,914Mc"bq=%2FF,lۖ߆&S1WUxm<#g㦛^38k9%Nm#ۈ'9.#^؈66ⱍx!cFF<O6d >9%^m#ۈ'2C|FF$9%Qm#H$2Ea/m#[VuNԍwnSxm#2Sڹb8m$xG6d nNmlwwjﰍdÑ=i{{!c֍jﱍdCs{8Wxm'2zޫma{>LfKnKasyX<-c^1oXJ˘eaKeY-cԖ@XXZXe,22bKo`h Y2Y2|?dM])Y(]0Y(]ÿs W,?1om]15nicy8H?1,=u X㒅'ÿ?7331B&n^7 7lÍl~Pt?چF6d n pSp6ȆmAnjnFry#HHN6d iTrFr!cpɡjɱdC{CnrF Q`OV21R9E(Sm6R )BQߜBm#l|.E(ڧKHA6d ~CPtC ؆;5GM wo~]mp'2mmcdC06ʻb8mi}p6Ɇ;j؆(7Ś'L PO<6< !c}Pmx O'P6<Ȇmx@j؆'8چ'I6d ^7Gm!2mm`>dCkS6Q6|Ȇ᣶m8Fߓ\41†pm8 ِ1  2#p&qm8 ِ1}P{CmÁm"Doeb K[Jm#lF*h#F*l#ِ1xHF*TF*!c8ķTj _1vn_51|EuWm%2j؆/ِ1x _ _l×l|Nsچ/G6cbma~dC76 ?!c} ?o᧶m i=-? ?lßlnG&nmcdC6  lßl܆?᯶m ! T76a_,jFِ1xl#lFF@6d 6Pm&+vRZԍ԰nVHm&2aHHM6d n#5Zm#5lmZm#5H6ѻL@W0F ٰRm ׍@X76@!c5l \mbdCpoՍ@@l# 9AoL4nu#Fl# ِ1=;@gϥQHm!2HHC6d n# Fm# lwzVw&FZW07R%0Ӫm6Ғ a5lZFZ!c^4-EӪm6Ғ )iᜒVm#-D6pA {JFD6d l]P(z.Hm#"2AnmaAdCu#֍ l#l V+v ~`7}16`!c^4jF0ِ1`h#Xm#&2 mmc!s61҉~#7ҩm6ґ ?[>[Nm#lF:h#F:l#ِ1tF:tF٠&F!j!Fِ1xu#Dm#!2_Æ5lFB6d n#Q6ғLHj鱍dC06ںb8mN6HHO6d ^7ú^m#=lFzh#Fzl#412 j dCXޱAm#lFh#Fl#ِ1:%\dPȀmd$  212g 2g 2md62 }e{_62bɆmd62md62 mdTȈmѽv bb^4jF(ِ1Ph#Tm#%2 mmbdCpo)jF٠;3abN sJFF6d 6°0!c^4 ajaFِ10h#Lm# D6f\ [Im#l| S2md62 ׍LndRȄmd"2C|hNɤ L6BK#Y)ᜒYm#3l|N jdC{yfFf!c8ķFfv|a{>L9ᖱl얱\ܖ<|B–"O,c,c-c%,cZJZ>jܲ{l͟SeQu˂k\q2qY`ˢqYpB5N_8eQ׸,e'c/ k\{s>nKV` """̇=[{pp^쿼ٺp8Å~{o]8k{tͷ}c^Vd=OVϊAV2Ya=Ȫv׃@ +Y"zDm'FVl#(Llb+C6lF6!cp٠ljٰldC6A6aȆuuϦ N6&FvQ7ú]m#;lFvh#Fvl#;ِ1FvFv!c>";Smd6r1R01r}p>Fl#ِ1[[Pȁm 2rm6r )9Cm#l)g&FNa#'Sm#'l]!9CѻBrm6r ׍nTȉm$2ȩE6ZScb{l.\F.!c9%Srm6r mRȅm"2?g.6>!2''dC'Dml٨wdX&F1aQLmQl|N)bjŰbdCu6aȆF1X7m6Y(.))Q(N6d ^7úQ\m8Ql|RSm6 ! dFqlh9䅃MnuF lِ1=%=%6J`%ȆF X7Jm6J )%RBm)ٸuTLOŞpSOOɆm| m|))ِ1x֍O6>6>%2ºƧFIA;pLnuFIl$ِ1R)%6Jb%ɆT/ T/Q(I6d [$U[Igdٖ/lb|&l|m|ِ13Lm3l3!c938|ِ1x ֍6>p>ST (Q.|pT#J;0}&\R_Ro>㇏iz&,p=(M<Gܣ Ң( _׃te >WJ491AOC+4I6Jceƴ=kbk2pmZFm Ql|(2je2dC=fcQ(m!2_2jed#my LMFYhFYl,ِ1x( FYFY!cpejedCpoՍjerdcry&F9q_F9x_F9rF9!crpF9lِ1^x9eS(m#2Q(Q(O6rx:_.ebu<6cɆ-}j屍dCu<6cɆm6ʫmpuy6, 9*Z*Y*[ƪXƪZƪYƪ[jXjZjYj[XZY[XZY[ƚXƚZƚYƚ[ZXZZZYZ[XZY[}@5ncL7N32325q| W׸ Td >U_uk\q2q`qWl8QY&FEVTTۨmT$2QڨQۨH6d >U_EFE!cpjJdcOyC{r+VRۨmT"2_SUkJjJdC6*A6*aȆK*mT6*j߽lĨ,TᚪFel2ِ1ݕݕ6*cɆ+}jdCpo_Fel 8M*SUBmT6 )UREm QlFhFl ِ1AUAU6`UFs:SĨ*UzFUl*ِ1xݨ FUFU!c9*SmT6 V{U6bFş,71F;Ql8ջ՗TSۨmT#27~F5lِ1jF5jF5!cpՠjjհdGV&FuQ7úQ]m:QlnqpڰFul:ِ1FuFu!cuJuNQۨA6b>d5`ݨQۨA6d [Pۨm 2iSFE;fLCkQlj5dc iL~~j5dC0h[W d'km6j hqǨ7-NdJCk&QlnԄuFMlMZb [ akm6j;D N)6ja=G"Q $16jaG"Q ڨQ ۨM6ly67j~Fml6ِ1{jVۨm&2QHCk6Ql {j:d#k01=:pϼFlِ1xݨF:F!c]16B:{|ڨm!2C|F:F]hQڨQۨK6d װu6buɆa_QTIbhm6 ua/ZWm.Qlds>ŵĨ'zzQۨG6d ^7QOmQl|NzjzdCF=oSۨm'97LnԇuF}l>ِ1F}F}!cpjdCpo)6c F|OE^Flِ1FF!c9Sm46 ! dFl!Ah(FCX7m46 hm4Thm4$2E^FCl!ِ1) 6bF}b>jb46A6aȆm46m46 ׍Fn4Rhm4"2hnWc5[I4;0?\{oׇX}ۯp_p}8׼1M7-wm &h~oA2M`=hv׃&@=fc6QhA!cm46s&}ꬉTM\Tm)єl77jMdC77Uhm4%2hhF6%Du\vh&~'i'i hF6d ^7Lmьln4uF3lِ1x )6aVݻlb4sJs84Whm4'2&9|&Fsl9ِ1xv6cɆm46m46Z{d(th!pNihA6d -6Z`-Ȇm6Zm6Z {-6Z`-#MnuFKl%ِ1FKFK!c9+ӆyOZ-dC{Z-VKF+1Cӳ붉JԍVnRhm"27Z~F+lِ1x 6ZaȆJmњlms&FkQ7ZúZm5њlnuFkl5ِ1)6ZcɆ7Zm6ڐuՊ11ڈ֍6jm6dCQhm!2m`hhC6d ^7Fm іloǬG&F[,c[,c[F[!c֍jmdCF[oUhm%2h 7ڪm6ڑir)h'F;X7کm6ڑ Ãm#mvjvdCu6aȆF;X7کm6ړ g71ڻl0ۓ ۍ6cɆ{mhO6d /Whm'2ahny>%0a9`9ǣeeeeeeeeeesޖ/-c},c}-c,c_Y[XZY[ƆXƆZƆYƆ[FXFZFYF[·@5nǕ)]̟ST5qfkqe&l]T6O׸Td ~IxIuk\q2_SukɆs#ykxo]P޺jdC}sG7wTmt$2_owjdC0QGWT#Z I F'q|Yq&F'7w}s'NF'!c\16nt'I NF'!c;mt6: ׍NntRmt&}(Fg1tsJgFg!c;;mt6: ׍ΰntVmt&2謶B6"'].F.F!cvB6d ^7Em хl..j]dmk219+Smt6 vWFW!cp]j]dCu+]6bB;s;LnntuF7lِ1 )6aȆp=njݰndCt>]7nFw1pN{3?a讶N6d N)6cɆ讶N6d n;]m;уl8ojX!졶A6d ~okxokF!cp=j=dC6z@=6z`=D] iMbN 甞j=dCu'=6zb=Ɇm6zm6z ߣޣSm'ыlY&F/Q7zKmыlF/hF/lِ1x/ 6zaȆm6zm6>'§\ԍa\msls!cupdCg}\msls!cpCm|n| l>lPj_Ewgu_vý>~_o>'ٺ/`Ao(>-7]}a[7Ɂp׃$B76zc_u~R_ƗƗdC_}/66$21K//Ɇ_ºƗFw61֍>j}>dC}DGQm!2}`裶C6d 6>j}dB31 }j}dC돾諶K6d ~_F_x_F_F_!c9/Sm69.OmSm#2׽׽F?lِ1~F?~F?!cIIm6" dѱ7Wj_a_ )_9+Ȇ`WWdC66R O6.bMqa诶O6d F?ٰO6d oFF!c~?7m6N.{R X7m 6 Su!cpjdCpo6`F{%ʘ@@!c{{m 6 )2Pmc 1ln uc@lcc֣MA.FAd#~'o1D6d 5} Rm "2`1D6d nc1Hmc1l9J&`Q7ú1Xmc01lma{s`lc0ِ1x ``!c9e0Sm 6{p&׹R!b>Dmc1l|c1B6d ^71Dmc1lٺ!ٺ!jCd#՜411֍jCdCkءp ;Tmc(1l^^jCdCkءp ;Tmc(1l[N\6Ȇ큏ajðadC6A6aȆapN1 F6d ~a6aFX.o711֍jñdC6C6cɆm 6m 6 ׍n Wm vO1µ՞b gGm6F #`1Bmc1lhclcِ1@6Fm6F _431F1֍j#dC6FB#6Fb#Ɇm6Fm6F ?4>4Rmc$1ll0⟟[\1lMb߼DQjQdCs(8Rm"21 1 E6d 6(QhAOb11FSFSFm6F  mVm&2_ÎkjdCh؋Vm> :Ì12626262eleleleT4ط閱Yٖ9,cs-c,c-c ,c -c,c[[~h[b9f ոõ?b4FFc`o4F]7j{17qcpC5N8Q׸1ƍ'co ƨk<%7urgc11K6d nc,1Vmc,1lXhcXlc,ِ17c6bgOu31ƹf?l8j;@ӍSm#2]p]p8lcِ1xo4F6aȆTj8lc<0~^&xN"6cɆo1O6d ^7ú1^mc<1lm9exlc٠1eì'8> !cp j dC6&@6&`Ȇ1Amc݆!ͳuɪW0?Wg&V.|߳u_k̇{^Wk7#G{_׸Lkjicz]ܼ1?׃te ~DxDL$2#&>bZD\&C2C2Qmc"1lu?8`c#&>b$lcِ1}-]16lwMLRۘmL"2O`O`$lcِ1o:`ݘ1 ۘL6|zdb0c؛ f'mL6& a1Ymc21lnLucdlc2ِ1@}d7dc54166Ql|[| ِ1x֍o66!2߷[| 1ld,t-Xc1ژ1ۘB6d nc 1Emc 1l|1vS6`SȆX7mL6 u'S]{ZTw5HS6bSɆ 1ۘJ6d ^7º1Umc*1lnLucTlcb9LinLuc4lcِ1|66#2C|෡1l$8O_eb΅Uۘm%27~c\lc.ِ1xݘ \\!c΅ 1ۘG6FV&dDj dC BB!c֍j dC0u+FBWdHCkc!l,sޙH`Hmcln,uc"lcِ1xX"E"!c^4iÜvl9px&ق߫m|m|O6d o|66'2EbD$dC06b˛N:Y[^XL6r.caXXL6d nc1Xmc1lbhcblc1ِ1dL dcblQM41~ AAml!c98ِ1FNz,>6!,I Ȇalx316~p>y&=}ŏj?Ewg3I?vý>~ʮg~y̡k6$p~͇dGG5׃%tkXACoطX-\՗1\:Xv׃%@f%$¶(\׃%$Bp{M dc /[;E 6~6~"2OOdCsOpNIm'l'!c^'h'dc~}#Mբnucjlc5ِ1jj!cpjdC6VC6VckF'61ֈ֍5jk5dC6@k6`kȆ5pNYXC6d nc Fmc l,)ܢhckaXXK6d NY )k6bkɆZX7֪m6֒ kjkud#oܼobupNmclnuc:lcِ1:/Nmcl| XXO6;-#cxFf=|Ffzlc=ِ1xXzz!c9e=S֫m6֓ XmWXml %W' X76ml66 mlP؀ml 2S69elcِ1xؠH6[Vu{Qa/Qmc#lFhcFlc#ِ1xFF!c7B66bF͂_\lٰx&lcِ1M&M&!c~c76ml66 }m66ml66ӳڼ,):eflc3ِ17koV،ml&2جL6d >l66ml6VӭM-nluclc ِ1)[)[6`[Ȇml6ml6 mlQ؂ml%ZtcXl딭jC0sJ;W ۫ml6 [a/Umc+l|تF6z0'F6%g؝9gdml6 ol6aȆ{mݦ F6d ol6ml6~&qieb,ְ?5j?c? haɓ$dCspNYmglg!c}џ6~6~!󓏉kN1/dv/j` ~__ȆaiQȜ$//dCs//j` wºƯƯdCk_W__Ɇa*NSʔIbhmmJ6d MɒƯjbƴZ1Rۅvv!c̷̷ml6 ب슁ڮN6d >l6mlp>ynyԿE]pw>[fw`>'ٺW||@^W|׳uktHjtbm;\z;]}>wq=Ǭq$1"~w!cz;d#䋼3XPlֈ?66 2Qicg&I ??Ȇ6PA66]j?~&cءA6d =;6v`;ȆX7vm6v [6vm6vtS mT؉m$21wsNlc'ِ1LYi"M$Nlc'ِ1t'Smc'lYе&...].!c]ps.lcِ1NΦ^$16vaȆצ]jdz!M⾌jdCnoV؍m&2Sb|\dICkc7l mV؍m!971֍=j{=dCuc{6`{ȆR _=!c~cGmcl8VM j{dCkؽp Wmc/ld#+<`Z{dCkؽ^va.%9v";g9ceO_CÖ#c㖱-c',c'-c,cXN[XZY[.X.Z.Y.[ƮXƮZ",c,c-c7,Yys'}pۧqpG5N>S׸}'c+n9^~5n8`ۧqlhD&~ac?_mc?l~hc~lc?ِ1Y7lغjdC~ƟdiLO'SmOlO!cxhO??Ɇaka{jb ׍??66-?Q8 o>q8@6d OwP8m 2_SkjdC6@6`<Ӗ71s_pNKm/l/!cO?__dC66R l__jaƔ̝dbT8m$2ߋ9bm6 [|)ᷡq8H6d Ow8q8D6 iUMCnu!lِ1==6aȆm6m6 Cjdj]6Kv2,6cɆaX7m6 Suaa!c90qXm0qldy8"z#=q8B6d c+?O$16`GȆ#8q8B6d >6m6 5G] rlv{m6 oG6bGɆQX7m6 ׍Q1Q,1lِ1r )6aȆ- T7m6 8mS8m'W3㸫5Mqakm6 8mW8m'2:m6 8mW8mM6^[S딿66&27dC딿:oɆ3ol8QYmLu'B{Nm6N 8mP8m 2q8q8A6d =mP8m$͖'E8 II!c{MN{MNm6N )'rRm$qlIhIlٸ<̝MS)h)lِ1x8)S)!cq ֍SjSdCJ6Nmp>yn|Z?v?~ pT#Q;|v}8Zدp?k?9zƞiQNzpZ}OzpiXN4914qZ-4Ii1@x/L3⾌33jg3dC{Zg3!cx3drFm ql|mz8q8K6T_ ? gjgdCu,g6bgɆ8q8K6d ^7Bg6b71Ή9SΩm6Α ׍snS8m#2S99lِ1x8mS8m'-> kN1ya[W8m'2\6m\6";~Ĉ6"l#lnDmD ۈ6"6"!ch#Bm#۸F6 >L7~5lِ1D9%Zm#ۈ&2FF4qli<3ĸ+]X7m6 wa/zWm.ql|N 画jwdCkػ]=Qxg.ǯ&=:<l)T}e|&=lِ1xݸ={=!cp{j{dCs=h= C^ͳujT0߀y>\Woa>ܝ}ﭻ9vp|y{>|_}ۯpޮgk~_}zC׼[4b1lՏ g3ǨzCd ~{ A 1xmĨm`;Wcb<!c+m<6 \@mlCjdQx(ż|xH6d c>=CC!cpjdC=ChClٸuMGGGjGdCs#86m<6 ?Xw꼉Lxm41^^E_m6^  JmlxWjWdCuJml851^ jdCu56^cɆ- [kk!c^C6^coFLƙo\{7d7!c֍7jo7dC࿧Qxm!2xxK6.9Oxab[؋Uxm%2oaxxK6d ^7ºVm-l|Ny mUxm$wzaH6l/oLTH6Ɇ)pm$ H66D!c}Dh#Qm#xG6(>LfKnKasyX<-c^1oXJ˘eaKeY-cԖ@XXZXe,22bKo`h Y2Y2|?d9sJCJC)BU' sO ־' Oָda^dahc,?1xߜ, ո:8gib[ZomandC 6ܰ 7!c- njn؆ِ1xmmm8JN6*}.yZe'WHna>kz.99pj$pvý%C-W?apt͓yr\R5Sʭ_C/EcI~ OA 2S~8A \R)\B-")HA h#F lÝld]&{_Guچ;N6d ~{:K]mp'2lmcdC};᮶mxn<Ӛnxᡶmx  X7<6< !c]16vt($ֆA6d 6<6< Ok[-ҙ†'᩶mx T6<Ɇ CgymxbdCs'᩶mx_ ڳ$%/8xmxa^dC6 / /lËl|NsچE6d >xA^j^؆7(ܢ0;_/V6Ɇo8xmxcdC{Չچ7M6d >xCjFJqpFMbO+%JHI6d s{KW 3Ibhm6R ׍nTHm$2H!u7 CQ6|Ȇ>j>؆ِ1 hGm!2mm`qB;sы:`/Pp`!c~ چp w:~CmÁm8Ȇ/r@ lwĜ )6RaȆm6Rm6R ׍TnRHm"2 H %wV߫Qu _ _l×l|Nsچ/K6d nU6|Ɇ_hWm#}ƺ|L ?Q7`S6ȆY Cma~dC6 ? ?lÏl|S6Ɇ0 L W0şl.چ?O6d ^7aW6Ɇޗچ?O6d nW6Ƙ{G41FP6Ȇm@jFِ1FP6Ȇm@jFj!U&Fj/VHm&2SR9%Fjl#5ِ1:%5\VHm&27RC6Rcdc4r&FnmbdCu#֍@@l#l@66@!cpFF lL4M{4ji4dC6@i6`iȆ4pNIHC6d n# Fm# l|yjb IۓVm#-lFZh#FZl#-ِ1xH FZFZ!cpiji kAFFD6d n#R6ȆװAp m mmadbCM`Wa &e&l]TVޔm }``l#lF0m ׍`h#Xm#HG6J;Lobh:tF:!c֍tj鰍tdCF:tF:!cH!Фbld@FXl7FFB6d ~]H:.Dm#!2!nm`!dC6Bl#=٨}īMMbSҫm6ғ '0}zO`zFz!cxMHO6d >6ҫm62s&D62`Ȇ2 j dCu#62`ȆFh#F 13Ic3IaQ-"]pw>؎Ȩv|*v}8:!g_}> P ;CW?׃P21CavA(91PDZD($BeBjFlL0o-6°0!c\16nt'I 0l#l}DFF6d GAajaF&+SD 62aȆF&X72md62 g{62aȆLF&LFf1*d*=MbN jdC`Ɇm Ffl#3ِ1)62cɆmd62mdphNzg8b9#222222222222V2V2V2V2V2V2eeeeSXIgRҖ2rs_P;/̟SQE]jY::e5. 8YE]j{,eQ׸,x '3.zpmcdC{po6\m#'2am FF8lQv=Q!-6IbK" %{֬[QU{.jצf\9zi~}?ss] +[W#ȯO6d ^7ú_m#?l|-?˯O6d n#?_m#?Ql]|tQ(Q(@6d *T6 `Ȇo.Q(@6d nQ@mQlKqIo\T(m$2Q(Q(H6d >sJAFA!cpjBdc]ID(F!BF!!c~7 m6 (mR(m"2E A6 aFs:dbu06 cɆFaX7 m6 )RXm0Qln6 m6 jbE~"F!cpE"jE"dCh؋Q(m!2E"jE wQAab놻چ;N6d Nqw wlÝlnú᮶m ??mmcdTIR11< hCm 2?|?چA6d ^7<`P6<Ȇᡶmx 3\M OaT6<ɆmxBj؆'ِ1'T6<Ɇ OhSm"v7M /ox~Km "27`᥶mx S:Km "2mxmxaEF;ӯL11Q֍jEdCFQoU(m%2S9FQl(ِ1}HEjEbdn5(&++Q (F6d ^7QLmQlnuF1lِ1xQ (Q (N6=[nQ\}{_6cɆm6m6 (mW(m'2_6m6F&iv0{ 6 o!cguj؆7ِ1 oh[m&2S o ol]7LnuF lِ1x(F F !c~7Jm6J %j%d܇n,21J:h5Jog![WRm$QlnuFIl$ِ1FIFI!cp%j%RdvD(F)RF)!c;6JaȆ7JRjRdC6JA6JaFC]abv0*&˟e(Q(M6d >sJiFi!cpjdChihFi C^e̳u{';+E2vI?|Pٺ2 v\b?;As<[Wveg웃tA*9/>ep=(KjMÿ7ʊ=pO,}i{ZezPZYx ZDY\ʒ?Be6bK/`b{^x9rF9!c)ٰMY6aȆצ`(Q(G6d U(Q(O6tq|(/P>7ByFy!cGy(Q(O6d S7Z8c8l>Q(O6d G6ʫm6*g71*Q֍ j dC0W16(g16*`ȆazHg *mT6* ۨmTPۨmT$a21*iEmVTۨmT$2aݨQۨH6d oQ[TTۨmT$2Æ٨QۨD6ΰx^E+^F%lِ14a#y|CkQlߨJjJdCJjd Ĩ,e eQۨL6d oQ[TVۨmT&2aݨQۨL6d ދV6*mT6qG"~61Q֍*jU*dC6@U6`UȆFX7mT6 ۨmTQۨmT%}zT|Ĩ*lT6mT6 ۨ mTUۨmT%2QڨQۨJ6d n*QUm*Ql$1E^F5lِ1W5UMmQlF5hF5lِ1xQ ڨQ !c&861|DuGm!2mm`>dCpF khm`>dC>Іچ݆0}?0_;;|-Uհմղնձյճ[,c Xe,2222jklkbkj 55[",c(X0T2=;s58_u5Ηjk/qTd ~^U8_\||8_u٘RO=\? ?lÏlo}چG6d Om#2 ? ?l:(/.EݨFuFu!cpաjձdC6C6cɆmT6mT6j 4QڨQۨA6d 7׀}s F !cjjm6j ۨmPۨm$emrĨ)pk=ܚj5dC~jk?56jb5Ɇpk=ܚj5dC{15j5ZdcsebF-oRۨm"2Sj9F-lِ1R )6jaȆF-hF-l6٨E5tרM6l)6jcɆmԆ6jm6j UnVۨm&2ߋ mVۨm!V?䁉QGu`QGmQl|N:ju:dCk:p [GmQlnԁ6m6 z뱉QW|GnnjudCuF]F]!c9.Sm6 oԅ6m6ꑍ&F=oԃF=zF=!cwԃQۨG6d _Sۨm#2EA6ad;m^d#Q>dcg!oW6Ɇ omcdCu  lßl܆?᯶m om`dCF76!cm 66@k[21Eu#Pm#$2nmbdCu#֍@@l#l 666y']IǾ[WVj"~: \GԷ;0OϳuJ׷}sO*9>q=s&F~g R \ =fAA@sE+"p="2+ l#l\ #X?#Xm#&2N mcdC6``l#l9`h#Xm#!?"z8km`!dC6Bl#l}DFB6d G@!j!F-㓙 FF!cp j dCu 6` ȆFFCq׽%]M~~j dC6B 6b Ɇa#16lVlhH6d n!Pm!шl6L `hhD6d 6m$6aȆ5m46 )FjPhzz21BE/ {PPl#lF(m U6BɆmBjFcB9ӘEh FcFc!ckh5jdCFco4Vhm4&2SC6cMmEJkb4Fo4Qhm4!2M`hhB6d ~ jhB6d ~} Dm єlpO714ihJ6d ӋF9c8l0_hm4%2S9FSl)ِ1xh m4Uhm phb~# ajaFِ150x -Lm# #25PS6ȆmAajaF3Qq LfF3hF3lِ1x 6aȆF3X7m46 ȼ@6m46Wɢ h.hhN6d o4FsFs!c֍jͱdCu9\m9N6oI#\S:%\m#'2mmcdCp+\m#'2mmcdc`ݦd31"D݈u#Bm#ۈ 2mDmD`dCu#֍l#lFmD ?abD~#jF$ِ1y$3Tۈ6"Ɇ*~ d#Rm#ۈ$2 mDmDbQd# .41D݈u#Jm# ۈ"2mDmDaQdC6((l#l66hqd`sκavɆRF4M6d khhl#lF4mD ׍hh#Zm#ny?0}?L {]F C6d ~b mĒ M MXQ7ba݈Uۈ6bɆF,jF,ِ1x݈u#Vm#ۈ%2bXXl#l] M8L|F&Nm#ۈ#2qnĩmaqdC 6Ⰽ8!cg㠍88l%٘5L59)-ɆThm$2lThm$2SZ9FKl%ِ1xh mThmē-B11sO6l6ⱍx!cxmē ׍xX76ⱍx!cpFF݆!Vu|ӱֵs"ZE'tkkD+Vvymi>g<姃ݺVRVs0ͮ3< b߾5ܷo>q=hMg_ֵֵV;hAkr c5+ZE51x=h mVhm$w?S l$@ j Fِ1xkDF@6d n#HPH6ȆKL666db&F6mצm6`mȆm6ڨm6ڐ ۷3I6F!c=6F6F[Qߡ&F[a-Vm-іl.줴%Vm-іl|ߢ-ܷhhK6d >6ڪm6ڑgqĜ)6aȆF;X7کm6ڑ )Nmюln6کm6ړG,mK)O=\Whm'2YF:c8lض۫m6ړ Mõi{F{!c~=^m=сlp@2&F1tsJF!c}pߢFlِ1xFF!c蠶H6'-QmtTmt$2F#|FFGl#ِ1FGFG!c訶D69]$ ;F'lِ1x 6:aȆ*~ dF'lِ1xmtRm|E6N׏MVJ_~+Ȇ&ȆmJm+l+!cJm+l+!cWFg1*Ŝ)6:cɆw;mt6: ׍ΰntVmt&2謶B6i"B6d =[Em хl| 袶B6d 袶J6=j^UԍntUmt%2]a誶J6d /vUmt%2誶F6n:cbtF7otSmt#2E^F7lِ1 )6aȆmt6mt6e?gbt6C6cɆpN鮶N6d n;]m;ѝlmtWm {Y\CmPm 2zm6z )=Cmуln6zm6z N41z =j=dCsJO8Tm$2詶I6d ^7zB=6zbƟ~ܵK<[ >[Kmыl|N^j^dCsJ/8Rm"2GKmћlluQ[SzuJoFo!c97Szm6z  mVm&2SzC6zc}FQ}FꣶC6d nGmчlFhFlِ1yhFl/{w$2+F_X7m6 }aWm/їlF_hF_l/ِ1x諶G6\Ni#~~dc&7t9qo1]|kznjӱdCtoLWۘmL'23̧mL6 ӡj6y}k#-k[o"~:S]ߪ|kw`g뾅ߪog뾅[9׃t}~qX?Coط-f \fٗ1\13fz0ǜ{j3p=A"d o1ژ1ۘI6/u`bs̈́aLlc&ِ1\y&ٰ-gm6f w΄36fb3Ɇ犙L,qУMYǜ{YjYdCWg뫳6faȆY1 ۘE6d nc1Kmc1l`c/c6/cllc6ِ1\IM6l'ellc6ِ12)6fcɆצjF351swpNNm;l;!cߩm|m|G6d q-ag166#2wcS9elcِ1Hg n',lcِ1xݘ9!cks9jsdFsEݘ \\!cιps\lc.ِ1x1s6bsɆ\vÜa;dgy|B"bR2r J*jZ:,c,c-c,c-c[,c[-c,c-c;,c;-c,c-G5n[iok<\Q1wS׸yͣ'c_S׸yͣ'cyS׸yxO6bB7Ę/l̇6m6 ͇t6cɆbýjdC6C6c Fdkb,..PXm, 2^YX@6d Wk  6` ȆT j d_gb,6B 6b Ɇm,6m,6 _ ^/TXm,$2 j EdcuL01 EjEdC6A6aȆm,6m,6 ׍E"Eb9gk&z{1\o/VXm,&2XXL6d >,sbb!cbQh堓L%]{%jK%dC6@K6`KȆX7m,6 ׍%%Rv@ݦKŜ)K6bKɆ}jKdCpK6bKɆm,6m,6]%fxffb,]Lmcln,uc2lcِ12Lmcl]m,SXm,'Cnv7&r1,srr!c֍j˱dCuc96cɆC6c+[cGmGm lcِ1xX  !c~c7Vm6V )+j+d#UBݓ41VuJNYXI6d /TXm$2XXI6d ^7VB+6VbW~_c;jdC66B66bɆm6ml66 jMd%]Wss66aȆml66ml66 ?6&M&!c~cImclTx&f1lsff!cpjdCuc366cɆfhcflcYw"=-j[-f*bp[-j[-f*buN٢bV"آJ6|X:cتJ6d VVV!c_)[6b[Ɇ甭V61f{֛D/ 6aȆml6ml6 ׍mnlS؆ml#2۠mj۰d#(6}X &vac;]mc;l|Nj۱dC6C6cɆװۡj۱d##S!ءA6d }P؁m 2Sv9elcِ1xmP؁m$t(3hSaw5NN!c֍j;dCuc';6vb;ɆEwB;6vb̞M]nuc.lcِ1waR؅m"25О.].!c إ M6=?-ݰحM6d >snn!c9e7Svm6v j64o:ٱ-c,c-c,c?YZ~b;l;b;j;f;n;a;i;e;m;c;k;g2v2v2v2v2v2v2v20{p|!ms#=pۣq{pC5N8Q׸='chk\P1ָ={Ɲq21}pn^lc/ِ1{6b{Ɇ׌m6 {j{jgME֍6~6~$2Gxj?b? U@uGɆp6~TG6:} &>q>x>}>!c֍}j}dC}>7S؇m#2SA6aFʿ/~X7m6 }?|~~!cpjdC6C6ckS\MNٺdĖ;_'lِ1ss6`Ȇm6m6 8mP8mD6v86M^Op/'Ȇap16n\wY Ȇ5 kOOdCOOj?aƠ;Cn41ggm6 aqPm qlAhAl ِ1x8mT8mL6jq4>&Ϣ?mmL6d ^7~ugɆm m33ِ1j?cFs<I9D6(6aȆ!X7m6 o6aȆ!h! C^}C^g~_"~:I~Q;Y  !cp'j'dsII!c9$qRm$ql{Amqlhl"HO951.uENq۸H6d n"qQm"ql߸jdC6.B6.biqIظm\R۸m\"2q ڸq ۸D6d o\%K%!cpKjd/71.{{.{{.m\6. ۸ m\V۸m\&2qڸq۸L6d ~ehel وP?L+brSm\6 W`/zEm qlhl ِ1xݸm\Q۸m\%uIĸaIJ6]x>qUl*ِ1xݸ UU!c𽯫pUl*ِ1UodVsemmF6d Mm7l7!cpAmmF6d Loojm\eewM-m]=}Gǖ'g疱?-c/-c,c-co,co-c,cY[>X>Zsj9]skTt325qר]5]585uk5q2q`qwltw>uOw]m:qlyyjױdC}u7_W۸m\'2C6c7Fyab߭} lِ1xݸ  !c-16ulO, lِ1&7j76yn$]9xOٺunw`g~웃d?ٺ9]}&mǼeo7MٿM:2_G߄j7q=Id Wk 7"nzpD| mT۸m"mm⍉qK`qKmqlrpذ=~Kmql^[^[jCs-h-l6p8ꭉq[\ӹ gjdCu66ncɆ{۰Ǽq۸M6d vڸq۸C6?R7/㎰qڸq۸C6d #q۸C6d ~x;!cpw;jwd|s\&]a.qWm.ql]xM]l.ِ1xݸ ]]!c~.qWm.ql|ݨ[M{bܷq۸G6d nqOmql@{Z6aȆ=h=l>hpr)}Q7úq_m>ql}h}l>ِ1:>\W۸m'2j?F']Mbb!)uj` Cml!cmmA6d NCmlٸ&a@ml||x@6d o<!c9@ml}`27~Cl!ِ1!\>Txm<$2S9Cl!ِ1C#HdMGxGjGdCs#8 m'lpQ R싾/6^b/ɆRm%l|Ny 甗j/dC{/j/Wd?uYLWNٺWdZY#g^m6^ o6^aȆxx xE6d >6^m6^Jfby Zm5l=w{^m6^ ׍װnVxm&2S^C6^coƩNɏe718m}!S&\^\ިFm lnul ِ1xo6`oȆhl-&߄so:-\Uxm%28a2jodCpzw[[!cxxG6]OnN;6aȆwjﰍwdC6A6aȆaldcb 6m8Eea=\G_j'g癤e?)/9 ׃t/cOx^CXk׃te o[W;x{r c>=^-=I{nDVjdCs8W|Pm| 2@6d nAmls&Gq #Qm#lGhGl#ِ1GG!c2>B6>m8Ӌ|7]~Ė$/,cI-c.d1WX XJX*XjXXZX:XzXXFX&Xfؗ,l얱\ܖ17X/]KR.d/NBU'rK|%1`K?1["7k\"Dnߩc/1xL{MFbh#Fbl#1ِ1 6cɆ'vCׂm$6 $6m$6-k3H"l$6m$6 5U$F!cIȆA$F!c}I$jI/FRKx_nhdCu X7Pl|N)_m|m|A6d >|m|lfwH=K=KHJ6d ^7ºTm#)l|NI 甤jIdCsJRh#FRlÅldb&_oچ B6d 979 lÅl@6\6\ !c9pQp6C=H319%Sm$6 ׍dn$SHm$#2ߋIbm$6 ׍dF2dFr1a]%LM{jɱdCFro$WHm$'27~#Frl#9ِ1Fr؆+hp1ߝ*+j؆+ِ1xpuUmp%2 mmbdCཨ+᪶m R$-cbu#)6R`)Ȇˆ 6)6R`)ȆKLKLHA6d ^7R@)6R`)ƅÖ51RuJJNIHI6d >sJJFJ!c_Սj)dCu#%Rm#%ly&F*Q7RJm#l.6ٰRHm"2 H HE6d NImRHm&RT01R5ljMHM6d oFjFj!cpjdC׌SC6RciFazFHmQHm!2F&zF&Fl# ِ16 \æQHm!2i4jid'C*&FZ7l]Z7l]ZFZ!cfO,Y FZ!c֍jidC6Bi6bƚM/T51҉~#7ҩm6ґ ԍ(g 'bҩm6ґ HmSHm#2EA6aFׄIwһ֥WHm'27~#Fzl#=ِ1)6cɆm6ҫm62;lL b+ʠ@6d odF F!c p#Fl#ِ1ȠH6~th_u#nOF7ݞjdCFFFF!c9%#S2md62 S2B62b+ibdu#62aȆNJ&a;)62aȆLpNɤ D6d / Ȥ L6z;M412֍jdCu#362cɆFfX72md62 _;3Ym#݆!/FDf lݗn /"0Ow.΃K/lݗ/gK7O>[%<_dsz! zYkSUeo몲~\ٗ1x=A,d!2g' E-" YH,F,FVx # ;md6 MUm#+l jYdC돬FVF61eoMlF6h#F6l#ِ1xF6lF6!cp٠ljٰldCu#Mm#l-+{r]?GvFv!c֍jٱdC=fvcfWȎmd'2mdWȎm mPȁm 2ȡA6d n#Cm#ln6rm6r}S)9ᜒSm#'l|N 甜j9dC6rB96rb9ɆጁlTȉm"wZK\CRȅm"2`ȥ E6d n#Km#lF.h#F.l#7hC&Fn1sJnFn!cpjdC6rC6rcɆ\Fn؆(/ϋML 719Mm p#2S⦶m p66ܰ 7!cmmayƳ҇yĜ)y6`yȆFX7m6 mQȃm!2 mQcx?y~0_;;Z22V2V2V2V2V2nyZƼ,cE-c,c-cޖRҖ2r Jʖ*j1aR4߉?7 {׸Td >_^uˋk\^q2ߧ k\^\R1xoָFr+5 71 |j|dC6A6aȆ~m6 F|jd F}9)Ɇ)ɯO6d n#?_m#?l޳޳jdC069c8l\Q7}d Fdk9Q&F*T6 `Ȇo.Q(@6d WkQ@mQlF.g#chm6 G01 jdC6 B6 bɆTᚪFAl ِ1~1МRPm Ql}fQH(mR(m"2Wa!BjBdCp6 aȆg(Q(L6Ngb{1^LaFa!c~07 m6 S uJaFa!c8ᰑ{}d FAo71{Ԋ{Ԋm6 (mQ(m!25P/ZDmQlnuFlÝlV&nmcdCpaܝl؊چ;N6d ^7apWp6ɆmCj؆٘?. &x>[硶mx Cm 27<`ᡶmx ox@j؆'h#-K[S OX7<6< O!cg[W>\\݁9xOp>[W~y7rڳ_~SrqΏ{9kyq\霗}\V.ط7}oXq=&21a71wo8Wxmxc%ƛy(!(Q(A6d vRJ I)Q(A6d W(Q(A6d 6-mP(m$;:>kb.- ]ZRm$QlnuFIl$ِ1\ů%6Jb%ɆFIhFIl>ط(;RjRdCp1P(Q (E6d U iR(m"2龌>2F)l4٨3Lκa`K79V(m&2a(Q(M6d ^7JúQZm4QlF^g ؜IG(m!)(#FX7ʨm6ʐ (mQ(m!2ٸazhC,Fl ِ1G|vQ(K6ew(+l6ʪm6ʒ ( mU(m%2E[8cZedCu,e6bobsJ98S(m#2^^{/Q(G6d >sJ9rF9!c1>]'y#chm6ʓ&/Q51ʋ˫m6ʓ (mW(m'2Q(Q(O6d >sJyFJdM bN j dCsJ8TPۨmT 2_T j dC 8c8lД3g16*`o01* jdCVVTۨmT$2"FEl"ِ1LhQ+L~Ck"Ql,\)qa&F%aQImQl|NJjJdC6*A6*aȆA6|[8c|Y JFeѺ&Fea2QYm2QlFehFel2ِ1xQ6*cɆ-+ RFel z9ʔ&FыVh*F!c~ 7mT6 ׍*nTQۨmT!27B16VqZUdRMFUhFUl*ِ1FUFU!cQ֍jUdC0616L9>QۨF664s1&F51TsJ5jF5!c{{mT6 ۨmTSۨmT#2H5xF5lÇlJu  lÇlچC6d nQ6|ȆUmmmo2V2V2V2V2V2V2V2V2o Z[Ƃ,cXXCX#Xeeee,222nEZƢ,cіRB5?'_q/GW]|q'c kK5N58_u5Ηjk/q??OܣQS6Ȇf?7ma~dCk*?S6ȆmmaS\LɆjձdC}su7WWۨmT'2׽:׽Ful:ِ1xݨmTWۨm O]jQCj5U F !cp5j5dCpF lِ1j@56j`5FaiN51jgdjgdjm6j )5RSm&Qlߨ j5dC6jB56jbFrĨ%F-X7jm6j ۨmRۨm"2Sj9F-lِ1R ڨQ ۨM6irQyy6ٰ=X[m6QlFmhFml6ِ1xݨ FmFm!coԆ6jmԶp[WV:ju"~:[WضԱ;0On]x~7O~'S9y9A]:Q?':Ы+֦uڴ.}[ԅuzP@UA]!c.QWm.Ql&F=aQOmQlzzjzdCsE=X-m6 [ԃ6m65ncbj؆?ِ1M6 !cj؆?ِ1x66Eh"La#P6Ȇ  m Uh"@m# 2_@jF q_F m ߳Y T6Ɇ@8mbdCu#T6꓍/qQ_بmWۨm'2 ;)ɆWۨm'25PݨQۨO6d 6mWۨmW7=A hFD6d ^7`R6Ȇ omaAdCu#R6"Rm\bbEjF0ِ1x/ {``l#l|N sJF0L6d oCjFxje&FSBm wl#lFm )!FFрlλ&Fa@mрl|jh@6d >4sJF!cFFCZuV+MFChFCl!ِ1FCFC!c{v{vm46  j FdȣC61^Em46 hm4Rhm4"2S9F#lِ1h%.y{*F(jF(ِ1:%SB6BP!cpFF(J6d αPh#Tm#hL6pי5Vhm4&2hhL6d ~1Xm1јl|hhB6'mzM`hhB6d >4sJ&F!c֍&jM&dCsJhFl)ٸShhJ6d m װM6bMɆm46m46 SBM6badcMM0a# S6ȆmAajaFِ1:% S6°0!cuJm4#oelb4fpLmьlF3hF3lِ1LጁޤLmьln46m46 nbb46C6cɆ̛=jͱdC{_WsFs!c~9\m9N6)w){_dĖ;_)jF8ِ1ph#\m#'27am )FF8A60#B߈Pۈ6"ȆmD@jFِ1h#Bm#ۈ 2FFI6z841"6׈$#1B>[mD ߈Tۈ6"ɆH8DmDbdC6"HHl#lTwQ}FmD Å-ȆmmD Rۈ6Ȇ((l#l|{Lh LR4pVnDmDcdCu#֍hhl#lnDúmD Shh ~a~xXb-cqxX+XkXeeeeeeee+XgXXWX7XwXXOX/XoXX_X?Xy0ֵr uekalI?7l] g7;z^l] xuW1sgO'vP׮x^s>ri_J7%4F=ُZ }bZ)F k1@p!c~8ڈQۈ6bF@01bE? XXl#l."z6Vm#ۈ%2 mĪmbdCp,mđ ǍqFmđ _ ׂ6Ⰽ8!c=8mđ ۈ66Ⰽd3>dbo-aGRm%ђlFKhFKl%ِ1xh FKFK!cp-j-xmGs\&FmīmcdC6⡍xxl#lF<mē CjF+iSZ9F+lِ1gg6ZaȆZVjVdC{,Vjd#NɏEh FkFk!cuJkNihM6d Vhm&2SZC6Zc d9GW71DHu#Am#H 2ߛM{ j Fِ1h#Am#H 2_&@ j FA'M6b hhC6d ^7Fm цl޳6޳6jm6dC6@m6`mF;_11ڊ֍jmdCu-m6bmɆm6ڪm6ڒ mjmvd lΘ턍vF;vF;!cuJ;NihG6d >sJ;vF;!c^Nmўl؃31ڋ^=E۫m6ړ )^m=ўl|=jhO6d ^7C6cֿFAmtPmt 2`蠶@6d ^7:AmсlFhFl#٠^01:^#E;m?:k[8E7.)(NHqw@K @H  nŋb1w>7szo֏1ǜk͵bɆm 6m 6 m Tm $2SB6bFwNlb uc6aȆ{A1D6d > s A !cpAjd#iLU_111֍jdC6C6cɆ):e`lc0ِ121p'ֈspwNqWp6Ɇw8mcdC6ܡ w wlÝl܆;᮶m !9S_71l1lf!jC!dCS)C6`CȆ Sm 6 } 6m 6 Ec7~cPlc(ِ1m(ٰMmC6bCɆ1J6d o 6m 6׃Qtcݛ^象7J|p((2`=v0 ׃Q@p#FE`1~Qjdc}G~h9Zmc41lF1M6d nc41Zmc41l mVm!z3虉1Fc`9Fmc 1l|1?ƨm6Ɛ !hslc ِ1x11K66|&X m,|6Vmc,1lXhcXlc,ِ1x XX!cpcjcqdcE741 㠍qj㰍qdC6A6aȆm6Ʃm6Ƒ )㠍qj㰍dckibsx8Wm'2E^txlc<ِ1xx!c$㡍j6}h" ,c-cޖIɖ1˘elele2626262oi ZfYƂ,c-cs,c\%T^pM奮q^yQ1?/u5΋j߼yE5Nq^ d#oL 7{ j dC8MPۘmL 2C5о !cp jdd`5ߙDD!cpjdCp1Qmc"1l|M5ژ1&5fbx9)j؆7ِ1 oh[m&2_Sy5چ7M6d nV6&nĘ$lL6&mL6& ۘmLRۘmL"21 ژ1 ۘD6d nc1Imc1l䉺_'cُ)ᓿjdCd؋NVۘmL&21ژ1ۘL6d oL6&mL6|ȆG)N&I1|^܋Q6|Ȇ>j>؆ِ1⯁}6| !cmm`dcY:<چ/K6d /|Wm%2nmbdC6| _ _lc #([bcS`ݘ1ۘB6d >Ls)!cpS)jS)dCshclc*(U$&TTTT!c9e*SmL6 )S2Umc*1lThcTlÏlts~?NS6ȆAs~j~؆ِ1xuOm#2S ? ?lc繚01MԍinLSۘmL#2S9e4lcِ145Mmc1lnL6mL6%.KabLtoLWۘmL'2ntjӱdCS)6cɆthctlcp@ZT& qn<[7Cmc1lǹuc lcِ1  !cp3j3 mj_)pNW6Ɇ omcdCs?S6 !cwM  lc&88wkp@Zc8#31ۘI6d N )36fb3Ɇ{љ1ۘI6d nc&1Smc&@67xLz#@P6ȆD@m`dC6l#lDm&􎭉(~.0ݺ@@l#l|_4mbdC6@@l#lnBjvC^ٺjtȫڿ5 Rea.i.4|f'|q͂wϲ}s/Ouqtg,\_4q,^1`Aݗ1x \ȁApA1\mmaFXwg51f>b6#fm6f #jdCslX-fm6f MgC6fcsFnbWYclcِ1x1s6`sȆḿ6m6 s9js`Q3a#,$jF0ِ1L芁mcdC6``l#l|/<V6Bƃr!bN sJFB6d ^7B`Q6BȆom`!dC6Blc.X}s\\!cΎN16bsɆ;ιjsdC\hc\lc1OؘmSۘm#2_̃yjydCs<8Sۘm#2ӆ?&1OmcJ6~&FECa/m ?_ WC6BP!c]\16z:"F(J6d >Bj|cbuc>6cɆ|X7m6 )]]16*{_ژm'21ژ1X@6v({~cX,j dC6@ 6` Ȇa攮Nw 캼16` Ȇm,6m,6Ȇwa^M0a# S6ȆgajaFِ1xu#Lm# #2mma FD#R/db,sB8,TXm,$2 aXXH6d otvpHZɹI}Ckc!l&Pmc!N6R_6@a#\ԍpX76±p!cpFF8N6d N ppl#lnCjv\h#͎w<Y[ƖX"-cK-c,cQ喱h J*Xelele,2gmmmmmmmm|&jg-j9E3LnEA5NFwV#5.׸q2mqOGk\qTd \0ָu"-q4MEb[EjEdC"E"!c]\16:+uS/bhm,6 .6m,6ևKWX,}jdCuc16cɆm,6m,6 ׍bkL-315ZXB6d ^7Dmc loA/i(E %!cy Dmc I6VLH 3F W"H!c FF$I6d c߿FWڨ+E Hl#l]Hh#Rm#XJ6"H{c7~cRlc)ِ1z{)\o/UXm,%2وQ"Rlc)ِ1xXXF6z>SL[-SXm,#2 X XF6d o,2e2!c~cLmcE6%ְQp mD )QpNRۈ6Ȇ`DȆhFE6d n# ڈRۈ6)gb,w0/-'m,6 ׍n,WXm,'2]N6lDm,6 ˡj˱hA;Lhkhhl#lnDúmD ׍hX76h!cuJ4m #[//{B[֭PXm 2_îkj+dCpa  !cp+j+6Vu^lJX-VE0O.un%?V;0O{To.;[{׃UtnK!SUCoطX-V*\Vݗ1\ Vz"VzD\mRXmĐxmfbĈmĐ ۈ6b6b!c8.N ٰĨm`1dCsE m&~n51Vs55Vm6V X mVXm&2C@ucjlc5ِ1c5Zmc5l4k55!c[QXm!2C@5jk5dCshcl#lduxQm#V)pNUۈ6bɆF,jF,ِ1"jF,ِ1Xh#Vm#ۈ#<-W'lAqjqFِ1q}88l#lFmđ ۈ66Ⰽx1nLx ->CWۈ6ɆF<jF<ِ1E<\ƫmcdC⡍xxlc-4a LnucZlc-ِ1g-ٰ=k6bkɆXXK6d ދ6֪m6֑o8?jbgh6aȆ{u]XG6d >s:u:!c9eNmcl{?bbp^mc=lF{W b-E z!c诇_XO6d X@6V8)`bls8lP؀ml 2N>'٠@6d j dCucAmcl X&Fac#Qmc#lFGW ۣjdC߇Qmc#lnl66ml6620169eS6ml66 `ImclMjMdC66A66aƛ=Wtnnbl66C66cɆfX76ml66 ìS:bЙ /$-E f!cpj-d~YESu-!c-pclc ِ1"[6`[Ȇװ[-jcB=>QL jC Umc+lnttpڸy_؊ml%2dg119eSml6 ׍mnlS؆ml#2_lmj۰mdC۠mj۰d#9=61foޮN6d$l~?}vlc;ِ1⯁]mc;lnl6ml6vMnuclcِ1:e\P؁m 27v~clcِ1xءI6KGcYِI6l_ ةI6d oNN!cp;j;dCuc'Smc}E>.w1Ws>߇>2ߛf`91"O-bH!mS؇m'O/g+~~!cb?6cɆ{ܯO6d >W6m6_6gb{!cwwm6 !b 6`ȆjdcxnžAoqPm qlAxFAl ِ1AA!c}A!QZ!MC!h!lِ1C!C!!c~7m6 )Cjd#AŜr)6cɆ{ð=q8L6d lV8m&2EC6cGƯ4=WM#hlِ1x/zG6`GȆaڸb8mV>:.16`GȆ##odcʫ' 51~:7߰Ȇmmِ1ljlئ6~6~#2E6~S 8J6.KQqTGaqTm(qlQhQl(ِ1x/zG6bGɆQ1uuwJS8m#2q 8q 8F6d ^7qLmql1h1l88w#L~ü{l=q8N6d n8q\m8ql={jDZdCqhql٘58 (ㄘSN9 lِ1ul  !c8D0 lِ1x/z8q8I6: 1~qR8 mT8m$2'a8q8I6d ^7NºqRm$qlIhIlpnkb6NA6NaȆaFGW Ƹ,E S)!c:)lِ1xq 8q 8M6w88 7Nm6N ׍ӰnV8m&2a8q8M6d n4qZm4ql^X3jg3dC9rFm qlfig6`gȆ{33Y1Չ&Y1sYY!c=pYl,ِ1"g6bgɆm6Ϊm6ΑwWmbsc#_:q8G6d 󬭝+ӆsj簍sdCpl9s9!cp砍sj簍d㯐߃|'E8yy!csj籍dCu<6cɆy~E}M bq۸@6d qo\P۸m\ 23/m\6. ۸m\P۸m\$W|lqQԍn\T۸m\$2_\딋jdCu"6.bɆm\6.m\6.Χ~&%s׸D6V4twt1׸q ۸D6d ދ^%K%!cs'๓KjKdC{_Kjd#}kĸ,eX7.m\6. ׍˰n\V۸m\&2aݸq۸L6d n2qYm2qlIw`˦&Waq(,+!cq֍+jW+dC06Njgq16`WȆ)W+jW6c~7g\셚3I"~0O{I\Gv݁x2qq]}}s]{U=| 0}p_*}׃\U;Ur c8D 4W\UU!cBW6bF͒,eb\]]S۸m\#2#>5lِ1k5k5!c5h5 w_bw_" u9nXnZnYn[XZY[XZ======i222222eee/ש]9?ahu,:~ku\S1ٺqqN5N5:q5:qש|tָw7F7:\GP۸m 2qڸq۸A6d nqCmql|tڸq۸I69.nMl&ِ1x|76nb7Ɇ1j7dCMhMl(8[-[-!c}[jC{-[-!c9qKmql<^XؙP㶘Sn9ml6ِ1xݸ mm!c}mm!c96q[m6ql5:|qGw`/zGmql|}m6 )wrGmql|NmQ۸m% C9wŜr)w6bwɆm܅6m6 ۸ mU۸m%2qڸq۸G6vĜr)6aȆ{߸q۸G6d o܃={=!c9qOmql|vE&};2ߑq۸O6d ^7úq_m>qlٸq۸O6d ދއ6m6=Y{&1>Pxm< 2jdP#MChCl!ِ1CPm!lSm<6 ׍Cd~w7j` ak?66 2\160 Ckl!c#x|(X>kGjGdC6A6aȆ1:#lِ1xxm6n6^t]x}V׸/cz:xv׃@pVxk!czxxC6Oy`Vx>C{xC6d G}7!cpo7jo7dC6@o6`oF2x+l6ުm6ޒ ׍nUxm%21™[l-ِ1LL d[l8tj&; |Nmlnu;lِ1\Sxm#2xxO6f x/=jﱍdCu=6cɆm6ޫm6ޓ [6ޫm6&*[)9oɆ߰n77ِ1"SVljcFGkb|u6>`ȆX7>m|6> m|Pm| 2H6.z~>㣨aH6d n#Qm#l|N甏jdCjOdcaG01> OjOdCs'8|Rm|"2_~kOjOdCkO'Ov\߇"7;w<%%%%%%9,c-c),c)-c,c-ci,ci-c,c-c,c-c,c-cY,cY-c,c-c9,c9-c,c-cy,cnn} oN xo FW-5.q1`Kb ո{%pK?1xKj?=u 8}E6갉rCWj_a_  Jm+l+!c+7}ِ1xoWFB11  j dC}sB77'THm$$2?# IHH6d ^7B 6bƚ519%Sm$6 ׍Dn$RHm$"2`HHD6d ^7A6a^T?nb$vډ6cɆ=K=KHL6d ^7úXm#1lNFbF01wϒwϒm$6 ׍$n$QHm$!2I`HHB6d ' Dm# lЯR21 IjIdC06:b8m^HJ6d uI%UHm$%2SBI6bƮG[D/ 6aȆF2X7m$6 !bdjɰddCu#Lm# ]q6ІCmÁm8Ȇ9:چp !_CkÁm8Ȇpm8d^ =ob$p\m#9lRwm$6 ׍n$WHm$'2_&6m$6R ehbpgrS3)6R`)Ȇ.ݺj)dC6R@)6R`)Ȇm6Rm6R zR)a/Rm#%lH j)dC{)yJFJ!c9%%Rm#%l1[+&F*F'k"/SRv6RaȆES}TjTdCu#6RaȆmMmRHm&mn<ઉZԍ԰nVHm&2aHHM6d lVHm&2SRC6RciFnzHqCgӨm6Ґ ׍4nQHm!2C74ji4dCi4ji6Ғ!.-\UHka.;[:Hv\<߳uiaeHiw\<)]G< Ŝ+^:1WsE:OA:2頃tjp=HGd SHA:!c"Nm#lH/ʐ^m#=lFzh#Fzl#=ِ1xVj鱍dCFzFQ" M&FQ72Am#l{ j dCk pmAm#lnd62md62Տ<{(g3md62 ׍ndTȈmd$2aȨH6d ~"#Qm##llẍ&F&1dsJ&LF&!cpLjLdC0u+F(QZLdCu#Im#l2},ld62md62  mdVȌmd&2aȬL6d od62md6|dbd6@Y6`YȆ,ȢB6d N)Y6`YȆFh#Fl#+Hϭ#x>_ͪJ6d n#+Um#+l {ѬjYdCu#+Um#+lزiFg&F6N)6aȆmd6md6 ׍lndSȆmd#2mdSȆmd'{.ld6md6 üiö ]m#;ldzgW  ^ZٱdCu#;]m#;l4Γ/MFh#Fl#ِ1x/96r`9Ȇ }+=Fl#ِ1xȡI62u+#Es^4FNl#'ِ1)96rb9Ɇawp|gI6d ^7rB96rbƅ C%l6rm6r ׍\nRȅm"2C@h.\F.!cwsA6raƂ񍉑[ mVȍm&2-nrm6r otrpyw$}a"_ȍm&2jFml!c577j`۴6IdbkpM_m#?ljdC s6cɆF~Fcwւ͒\sFtwt I!jdC06:b8m4m16 `Ȇ{-Q(@6d ^7 @6 `DNrRx |FAl ِ1x(FAFA!c~ 7 m6 (mT(m|K6L01u)n|K6lVm[l[!c}Nrߪm|m|K6d n[h[ooɆoo6p*d2[u|3ZD!sğ/ٺBp/A!sd/ٺBp(w\<x:0cSN]+Z'\ɸ"r0}[ zP( EV(Aa!czP(Q(B6*|&F(E6`EȆ5Flِ1"F"F!c@E6`EFG%~(*EFQl(ِ1y_QFQ!c>(#m6 ( mU(m#9w)Lb]b(Q (F6d nQLmQlnuF1lِ1QLmQl\k4xNR>')Q(N6d 6-צ6cɆ1jűdCFqhFqlXն$2%D(F F !c~7Jm6J !b9F lِ1F FI{á3%3ZIFI!c9$SJm6J ?') T(m$2Q(Qlf&wwwjaߑ )9;ﰍȆ1МwwdCwwjaƳ,ΏRF)RF)!cgRjRdCpnR(m"2Q (Q (M6#GNS~Tl|GƏƏdCƏQmGlG!c~GhGrd<D(F9rF9!c9Sʩm6ʑ ltᴱӉ16aȆrF9rFyaY 免FyFy!cQ֍j屍dC0sJW 216cɆFyhFyl8<ĨZȆN F!cp j dC0]16l?TAmQlFhFl"u8ųY[EFE!c^"E+mT6* aQQm"Ql|NmTTۨmT"tQI`/ZImQlnTuF%lِ1JyJ%JF%!cQ ڨQ ۨL6wn™FeFe!cQ֍jdC6*C6*cɆmT6*mT6{+abTFoTQۨmT!2U`ݨQۨB6d n QEm Ql|NmTQۨmT%+11Q֍jUdCTTUۨmT%2[>QۨJ6d ^7BU6m__T|ǣeeeeeeeeee'XCϖFƖ&_,c,c-c-,c--c,c-cm,cm-c,c-c,c-c,߇F5nЄf2k\5\Q1LkqWlk\5\Q1W 5qը|q59yU74n]u;W]-]xl]u8UW;nw`.;wqwi~u7O \g{^]}ϫ㞧׷,:WЫڛ5kݷ8PԠ/cz  C5ȁk@5"jzPDԀ6jm6jmiG`b5aeQۨI6d ׄ5FMl&ِ1FDW _ڨm$2kB56jbȆWcs31jdlx-ZF-!c$aٰZjZdC}D-GRۨm"2Q ڨQ ۨM6j{Ǯ&FmQ7júQ[m6QlnԆuFml6ِ1"ڷQۨM6d >Ԇ6jm6 Ǫ\mW41긞阺Ql4ǟnQۨm!2QڨQۨC6d {uAQۨm!2u:jud?LVĨ+judC6Bu6buɆ1PݨQۨK6d n.QWm.Qlbbs0uٰ-m6 ׃6aȆzߨQۨG6d ~QOmQlؽ|OF}l>ِ1xݨF}F}!cpjdCF}hF}l>|M^ԍdj dC6@ 6` Ȇm46m46 hm4PhmD6~ϟtœ&OnOj?a? |g'Ȇ`OOdCOOj?a Ƣsemb4I$ 6b ɆFCX7m46 ? n7Thm4$2O!Pm!39[+uLpgɆϰn33ِ1⯁33ِ1x/3F#Q¬#Wuoyrnd럍6aȆ -FjFdCu6aȆFF#FFc]i`b4u16cɆKl KlhL6d c+ӆI_hm4&2hhB6ÞFh"l46m46 )MDm фl҄lضYm46 )M&jMdc^Th m4Uhm4%2E^FSl)ِ1"Z4Uhm4%2MjM_FEV@mmB6d nh__Ȇ1_6~6~!2Eml?Elh7m46 hm4Shm4#2C@6m46 hm4Shm4'{ahhN6d Ni)6cɆm46m46 o46m46Z ,nfba[-6Z`-ȆZm6Z hmPhm 27Z@-6Z`-Ɇa&FKQ7ZºRm%ђlFKhFKl%ِ1yJKFK!cp-j-Vd#ip+`h hE6d ;tRhm"2`h hE6d o6Zm6Z3EZ51Z֍jdCu56ZcɆFkX7Zm6Z ׍FkF1 mM6FhFl ِ1c8mQhm!2m`hhC6d n Fm݆pL[s&9p&i.\<1gj[v>_j +C[ok)şL8m-]y:zijv{;oA;2?Ijv׃v@sE;(ZD;\ڑ׃vF;vF{q۩ALbhjdC{ZahhO6d jdCjd#:Q]LNcٰ}巃Flِ1Liv4Flِ13ZF!cGhFl#r ]MntuFGl#ِ1xFGFG!cpjdC6:B6:bF):bbtra'aNjNdCu6:aȆNpN餶 D6d ot6:mtp~%ݗ^al>GXWX7XwXXOX/XoXX_X?X@ `˘elele2ifnaiemckgoKgqnYY]:יj/ /ꬮqqL5NphMY]:יjquV׸xB6K6E| H.F!c+FCB+"Fl ِ1;];]6`]ȆT].j]dc\rj11g:]N\WFW!c+웻mt6  mtUmt%2誶F6jy^_nƉMe>!njݰndC}6aȆmt6mt6 ݠnjݰdykZ7~Fwl;ِ1xFwFw!c8D ꮶN6d n;]m;уl.k\&F>=Ȇj=dC6z@=6z`=Ȇ{A6d >6zm6z{&FOjOjOFO!czzm6z ׍nTm$2=j=^dYp^OwHUUg^dc{B"7zm6z a{5l/^F/!c8D T7zm6z a{A6zaFV51z~77zm6z  mVm&2To]jdCj>dq}y}>F>F!c9Sm6 ׍>nQm!2}>j}d#|e̅NL j}dCu/}6b}Ɇa spڰyWm/їl mUm#;\hOԍ~nSm#2_~j~dCu6aȆm6m6BiS_6/E}jdC6C6cɆ_?}jdCC6c#FD!c~c7m 6 ׍n Pm 211H6b|<(l 6m 6 d @@!cNWlm 6 )jAd#ȧq& ы A !c9eSm 6 ׍An Rm "2_6m 6 (eb uc06cɆm 6m 6 a``!cpj wL wapWp6Ɇ womcdCu w wlÝl|Nq66ܱ!dc61uN1B6d ^71Dmc1l|_t1B6d ^7@C6m8y 5gٺPPv?_3v0\<߳uCӴ?~S|xk(C|(tycy}gm=b1Lmc1lǧr_5.-}jñdCuc86cɆ1P1\mc81ln 6m 6F+^k<!X7Fm6F N;#6F`#Ȇm6Fm6F 71I6P}obkӑp%2Rmc$1lH}Hlc$ِ1"SFm6F )#j#Qdց[LQnuc(lcِ12 )6FaȆm6Fm6F mRm&Q#0-3~fhlc4ِ13p/chlc4ِ12)6FcɆhѯ_!cق1l1!c9e Sƨm6Ɛ !b1Fmc 1ln6ƨm6ƒR&X1sXX!c9e,Sƪm6ƒ W ϫUm%2cjcqd3!&8W0 qdc^lɳ6aȆƩm6Ƒ mSm#211O66Ux\c7~cxlc<ِ12)6cɆ1М2^mc<1lxhcx a."7;,`hMMX|-cS,cS-c~i閱1LXe,262dmc XZYB-c-c ,capaƍyۤ_%~' NyE5N5 8/u5΋j1PR8/\㼨y祮q^x@6E^ۑf1AMt6&`ȆmL6&mL6& !b 6&`Ȇp'@6&`FiLJ]}s'kL$E2n>HQט1ۘH6d T6&bɆmL6&mL6& ׍D؆7٠_71sAo\[m&2ߧtj؆7ِ1 oh[m&2ߋ66IdcfLI5ļg'mL6& ۘmLRۘmL"2$=IjIdCuc1Imc1l4:|bcا &mL6& a1Ymc21lՍjdCuc21Ymc2C62>tjEH;ᅤr⣶m  X7|6| !c8D O磶m >ІچK6Җnº᫶m =\_ _l×l܆/᫶m )Іچ/1lQ&\p |.8Emc 1l|2SmL6 !bgS6`SȆmL6mL6.[|W$ĘE_c*ٰ1ۘJ6d nc*1Umc*1lߘ jSdC絧BS6b~dmGW~~<#"7+* ma~dCཨE6 ?!c놟چG6d oA~j~4p[cEmL6 ׍inLSۘmL#2C@6mL6 SA6m8yM7gvC^;j"uav0\'1ۘI6d {3]Tۘm$2C5j3dCkәLFؙfיbN sJF@6d c3@m# 2 {ZjFِ1h#@m#$޻/6@@l#lFF H6d aɆm T6ɆmBj,Qc7f~c,lcِ1xݘ,Y,!c~c7fm6f i͂6fm6FMlbFFD6d n#R6ȆaN'AjAFِ1x/mmaƉ-jbuc66fcɆ;gýjdCkp ;[mc61llhcllc٘;m&Q71Gmc1lńuclcِ17oQۘm!2 mQۘmu#֍``l#l`^FF0L6d ^7aV6ɆF0m ?.#D6B6B!cFFB6d o~#Dm#!2!FF1l\_~&\1̅s\\!cpsjsdC딹p2Wmc.1l\hc\lcXڨZ.{My}Qccٰ#TԍPX7B6BP!c FF(J6d ^7BaU6BɆBPPlc>(4j1>ygg>|gjdCuc>6cɆ{1ۘO6d >̇6m6~Ac `XX@6d nc@mclՍj dCshcl#lȓC&Fˆ9F6|I_GI S6ȆmAajaFِ10-Lm# #2S 00lc!cX.k؅j dC0FW ʇ^Dž"Blc!ِ1) 6b Ɇ甅BF8٨2GMp}p}ppl#lnúm 66±p!cmmm߇A_DX222i[j[f-E[VXVZVYb,c-ck,c8Xelelelelelelelelelelelelel0Tr!7Gk\qTd #5.׸q2?kGk\qTd >Eqx[D6_Y?i ch"lcِ1E"E"!c5"ZXD6d Zm,RXm,&~_21֍jdC6C6cɆ1Кjblc1ِ1bع|X"l,6m,6 K`߼Dmc lfNiqXd/bhm,6 Xm,QXmD/yĈ6"HHl#lHnkF$I6d oD~#Rm#ۈ$27"HH !l?HٺPRv?_ڿgQZ˱dC{rr!cpˡj˱hqw)Lhq2Vۈ6ɆצpmmD ۈ66h!c}hh#Zm#XA6VrHB+`BmclL x&w lcِ1  !c~cBmcl >6&Jo%|޷Rmc%lX j+dCpJJ!cXXE6xm6񦉱U7̻gȆ&Wm6V XmRXm"2EW^t*lcِ1U*UF x[Mo~#Fm#ۈ!21j1F ِ1"mĐ )1FF ll);&jW0 dö@XXM6d ^7VúZmc5l9jZmc5ljhcjlc ٘0L5]{5jk5dC6@k6`kȆX7֨m6֐ _mQXmĒM#l$H3F,؞ЩCmĒ )pNUۈ6bɆ{X؋ƪmbdCF,mđo#z}hbĉ8mđ s,~s,Nm#ۈ#2ƩmaqdCsJmēc+mĈwaB>lِ1x8mQ8mx!+3oxᡶmx S<>Cm 2|چA6d 6<6oQQ!cq8qnp1#FPyL1(Z1nÿ>t ߇L1x1?f \15?q޻ ^3{poz\}~pa_mt`*q?x>x\-8IzlW8n|oE.O9,IKR;eXjg-syKR`]|-KvRb]ԮYj-MK향vRcݵYj-C{_Km "2 R6Ndgnbg,'  !c{N{Nm6N oP8m 2'j'd931N$Om6N o'6Nb'ɆI7Nm6N +qRm$M6M&XS⭶mx {ýچ7M6d 7aV6Ɇ7᭶m"ΡgH`8q 8E6d nqJmql|} Om6N S)Siuii!cpjdC}46NcɆ:wp4S e g,z΢g6`gȆ/:/:q8C6d 7qFm qlFFW 2l,Hjb},g6bgɆ)g>Yl,ِ1x8 YY!cqjgsdژqij6aȆ97Ωm6Α #lS8m#2W 4oS8m'Eλ9q^oW8m'2q8q8O6dx"q^mj>؆ِ1<3Q6|Ȇ7|چC6d 7|  l8rp&7.qAmqlo\}lِ1{..m\6. qAmql1`~Z0拌dEEE!c=Eq۸H6dx"6.bɆm\6.m\6| M _q. E}6| _!c چ/K6d nU6|ɆmBj%AoZ`b\+uImql%h%lِ16.aȆgKp޸q #FW?>2'lA~j~؆ِ1 ?hOm#27᧶m A~j~e1Y2Śr)6.cɆm\6.m\6. hael2ِ1Ƙ <&el hhroqE_gW6`WȆm\6m\6 WqEm qlF=W mIM +U2[VWa߸q۸J6d O )W6bWɆaξڸb8m{m}=716bWɆהpMq۸F6&5aqMmqlo\}5lِ1ƪNL[_obhm\6 S}5ku#kb\6C6cɆu7m\6 ì)]16. l~716cɆu7m\6n.[7nĸ!l܀6nm6n {~{CmqlfnV"& lِ1NW8z_^ڸa|1nB7"nEwpvp|x>lMԺpտiY+$p}xõ&':Vxi^Cտp?EW_0sNkn91Z)"mwq [$B01Ƣ^16naƮVob6nC6ncɆ׊pq۸M6d c+Ƥdy&&ml6ِ1m1oDL;hlِ1LhᴑUrCkqlFYW3Zw;dC6@w6`wFl5/dbgwY]]!c]q۸K6d c+ӆ-716bwɆaldu@]=`߸q۸G6d {_}S۸m#2qڸq۸G6d c+}#716aƉI/jb6C6cɆϴ=}}!cpjdC b8mxftje&}l٘TƩߋ!cYk 56`Ȇm<6m<6 |xm<$^KVx(捇pxxH6d >o7ù_@6阴&F$Cm pnP6Ȇm@jFِ1El#l,3*(~203@@l#l|6 QF H6d n#T6Ɇ T6Vtlb<{GpOHml#h#lِ1G#G#!cJ=6m<6Ȇ떕ʙA.,ll=D,Hm#"2'~m 66 !c8m821 l1rZoyk01ٰ]jdC]>]>Vxm<&2+A&cl1ِ1xx mܽ958zϾm<6 o<6cɆ5y5yxN6d >o<6m<6^C7 T71^/j/dC}/6^`/ȆpxxA6d S/j/dcdm01^|Kl%ِ1KK!cj/dC}%Rm%lT|BZ&+}6^aȆ+lِ1xx+W+!cYJmL6⬝W:f#X)pM V6Ɇ)pm `76`!cpFF0loi]]þ{jdCk8Vxm&2F<:+ob8mt.>|ޛNqxM6d Oy mVxm!SO}㍘7yl ِ14o4o6`oȆEs7jo7dCixn[l|-V-]p7_{ ηjȯe^l[8QU_o><>[^kwtS2NwS_w/c{V{Vߩ91"~D|xmSxm'w2P^ܳ޳^m=l|xjﱍdCk{VWxm'2ߛ6ޫm6B_\}#l#lFW WB6B!cFFB6d >c@!j!F(4v١MPa#U6BɆF(jF(ِ1#?B6BP!c5%U6>\Em ->sjdC0m]16l}Pm| 2?'jdC6>@6>`adzzV&FmmaadC}# 00l#l|FFF6d AajaF8ر˔NmLpa#W6Ɇ_4hF8N6d 7aW6ɆC 66±dc@aLbS>m|6> O~OQm#lGhGl#ِ1D6J}aȆm|6>m|6> )Oja7La#ڈPۈ6"ȆmD@jFِ1h#Bm#ۈ 2FFI6<[9*dbD5%)jF$ِ1Hh#Rm#ۈ$2E#,mD ۈ6"6"dcBzL>&g7>þYm3ljdCVm|&2? m|VmD Ku51>% S6(!cY4 ΢QjQFِ1h<Rۈ6ȆmDAQjQw_//!cZb8m\qna/&l ِ1_6`_Ȇg//F4ٸQ=LhD5%Zm#ۈ&27mD ۈ66h!cpFF~oab8GLK-RsXjZ\K-RK`%Yj-$ZRK-RKaRYj-4ZZK-R`e2Yj?Zj߿/I U^S 9OIOu w1Á{p.Sp=?=u b8b8P翧׿dĈil^l^Sm#&l|@_LFL!c/16bb1ɆmĄ6bm6bf*|6@Q,XF,!cpXjXdCXߎ ۈE6d n#Km#l>_;a_#il&g_U㘴[m#6l|ہ۱6bcɆFl7bm6b ۈ mVۈm ˽;nvsچF6d n pSp6ȆmAnjn؆ِ1Yᦶm!t#7y#Fl#ِ1,΢q6`qȆg8pۈC6d 7@q6`d`t&7᮶m ppWp6Ɇ;j؆;ِ1Y;᮶m%wl5ol~6F\l#.ِ1F\F\!cjqdCkJ\h#F\l#8y@]Sۈm#2ڈۈG6d 7Om#l|MmSۈg||s=[1"̇nj?˺A}_}p_ \k隗?}o߄^|W?>ٺl]|'2.8>_-">IA|h#F|l#poQ&FZa%lMyR$PHm$ 2_+@m#l|H׊j dC3fh#Fl#!8<&FBH 6b ɆK@%THm$$2 aHHH6d >c&6m$6w3H$"m$6 Do$RHm$"2a"za"DF"!cHHL6\;x#~5}Xm#1lL+{ m$6 MýibFb!cgdC6cIFJ{L$boMm$6 $o$QHm$!27y#Fl# ِ1,HHJ6n bTH m$UHm$%2ܤ;I6bIɆ獤pHHJ6d n#)Tm#)lX&F2a#Lm#lo$}#F2l#ِ1 6aȆdF2dFrѡq\>%9ܧ$WHm$'2-9-Frl#9ِ1)6cɆm$6m$6RcVnb6R@)6R`)ȆF 7Rm6R HmPHm 2_SR@)6R`);b?abkJJTHm$2)aHHI6d OI ))6Rb)Ɇm6Rm6R6H%F*7Rm6R ToRHm"2`H HE6d n#Jm#l͐ȿ#>%}Zm#5lo}#Fjl#5ِ1FjFj!cFjFQ/u/51҈5% \SҨm6Ґ Fm# l|MIה4ji4dC}# Fm# lD1`V􍴰oUHm%2iaHHK6d n#-Vm#-lFZh#FZl#8Vxi޴ MtbHtj鰍tdC6A6aȆהtpMIHG6d ][:h#F:l#=xfɑE&FzHzzHzFz!cp額j鱍dC}#=6cɆFzFAoZbbdkJdPȀmd 2ߧd j dCgy F!c5%Am#l$c`e&FF]62bɆmd62md62 mdTȈmd$2ȨD6.7z~ILodRȄmd"2_S25%F&l#ِ1 62aȆmd62md6~$7kPOG׼a lvo{[GɆmm##ِ16~6~$2>GhGdY]_412Y43E3md62 WfjdC62C62cɆmd62md8߿#RferXj9-\ZnK-Rg Xj-BZaKVRR+fJXj%-RϖZiKKVR+gw|~8:I^e89C9|sϡqd 9=΁{zg#qulK5&F17gss,F!cpY,jY,dC{,pOEm# lFh#F C^YͳuzlL[׳uYID~]VvjY"̇n]V AVqهݺ3dU_o><>[^kltͻe5dzC/`?Ȧp?FW_0tp:}M ȁ׊lPD6ld#2٠ljٰd#eO2m41 ١jٱdCo[vFv!cEeʮN6d WmdWȎm o'k!l6rm6r ?Á͡A6d ~?sx?sF!cȡI6t.SCӁ!ɩI6d >c愳ENFN!c5%'\Srm6r ȩE6>Y$6# ȥ E6d8"7rm6r ?rG.\F.!c ȥ M6.o&FnkJnFn!c{r{rm6r ܰoVȍm&27rC6rcy޴)L<><ϣcv".=[Gm#WE ~IxI|F>!c}J[W wpȖOm#l|Mה|j|dC}#Om#l혴{MbgjdC}#?6cɆהpMɯO6d OmWȏm &F1oFF!cpjdCkJP(m 2gQ@mQl8{1L^t{AFA!cpjdC6 B6 bɆהFAF!l&F!7 QHmQlF!hF!lِ1Q6 aȆF!hF!l0h'&Fa7 þQXm0QlFahFal0ِ1Q6 cɆ@6 m6l_H01qQ(m!2Q(Q(B6d nQDmQl|M)mQ(m%OgNt(*FQ7m6 E6bEɆהpM)Q(J6d 6m6~"51~"1bwl!~R lwm?mmD6d n'h'ȆϾ~6~R (F6&F17QLmQl|M)הbjŰbdCkJ1S(m#2Q (Q (N6[ x=[W\m8QlFqhFql8ِ18W(m'2Q(Q(A6>:61Js\F lِ1F F !c5\SJm6J Ϣ%j%d#()O)@ߧT(m$27JyFIl$ِ1R)%6Jb%Ɇm6Jm6J1* 輸y8뙤__"~0߇{p= <뙤_5E} ]"Kk3f8cQ_2/c~P2jep?(Cd >c"ʨE 1޴ QFm Ql4)ws ?؛{ӲjedCgea(Q(K6d >GsDYFY!cpejerd#]`4.Q6aȆ-(-(Q(G6d >GsD9rF9!cA6aƃ'jb6C6cɆ-sj屍dC}<6cɆ塍j6}{_4ozq-JZeKVRfjUjXj5-ZZmKVRgշXj -FZcKRkf5ZXj--VZkKRk/ǭ?$TA UP U'c+~ڽU=8 UP U'cW '"-<&FEq_bE/FEl"ِ1W6*bɆmT6*mT6* T6*mT6* ^喉QI+v%JF%!cv[W _yQ ۨD6d nQImQl|OU ڨQ ۨL6^TmXS*5Fel2ِ1~2oWVۨmT&2? b*mT6* )j*dcO¾ۦ515 \SmT6 UtU6`UȆRFl ِ1RڨQۨJ6+}&FUTkJUFU!cy*7mT6 Tg1U6bUɆהFUF5S<01 ՠjjհjdC}6aȆmT6mT6 ۨmTSۨmJ6D 71~ƯpUmWlW!cyW8o++ِ1,+EUl|MUmWl:8y5_t&Fu׼agQ,TWۨmT'2aߨQۨN6d >VhuFu!cY:Q]m:QlL#5`ߨQۨA6d sQ W +Χ.&F lِ1R)56j`5ȆmPۨm$KNQ7BMzmMFM!cQj5dCkJMTۨm$25j5Zd#)^QK̢,ZKmQl|R Sjm6j ۨmRۨm"2Q ڨQ ۨM6MLڮ{MLߨM6VOjdCֆVۨm&2QڨQۨM6d >ֆ6jm6ꐍ%SͨĨ#ξ:ju:dC}u6`uȆϾ:ju:dC{:F:F]K&F]Ln]z&F]l.ِ1.Uۨm%2ߧԅjudC6Bu6bF 61}J=OQۨG6d >փh=zF=!c5\Sm6 zjdq711ꋾQjdC6C6cɆF}l>ِ1F}FA51j dCF8o4Phm4 2_S5Flِ1,hhH6~w Ż:лm46 o4Thm4$2_S5FCl!ِ1xhm4Thm4"EȒ9h$7FjFdC}6aȆm46m46 ϢFj6y56ֵ5+Icv؇Acv{_oW|x|_k yc5oALn5sDx~՗1x?h4Q;hAr c 1E4 1$M&jMdcԌC=db4kESV4Uhm4%2hhJ6d >c63fSFS!c)Tm)ьl8o8ab46A6aȆ›fjͰfdC6A6aȆm46m46oSWh.l46m46 hm4Whm4'21)Fsl9ِ1FsF BhmPhm 2&=Bmтlo}F lِ1F FK1р싣M;ZKFK!csܢFKl%ِ1FKFK!csFKF+(yc>>ܧRhm"2Fhm"2_SZ5F+lِ1xhmRhm&i\ Z)Zm5њljdCK.qkFk!c=lkhFkl ٸ-Fn&Fa Fm цlw8Qhm!2m`hhC6d =IhFl-X&F[kJ[F[!c}J[OihK6d n-Vm-іl|h mUhm#/u6NvoShm#2v;6aȆm6کm6ڑ hmShg|?̭y#-`u:Yj-.oZWKRazYj[j->Z_KR` Yj-!PKm6RaFYj߿=tl8_{Wǵ'cv{nqqkO=N==q==q|O'xUH$ LFhFlِ1:8л:mt6: /~/Amсl|mtPmt$֛(lt6:mt6: /~/Qm#ёlot}FGl#ِ1~#Qm#щl ֭ib;F'lِ1SuRmt"2 褶 D6d 7:A6:aU)Y mtVmt&2a謶L6d n3Ym3љlFghFgl pP`E2XS5Fl ِ1nxEm хlFhFl ِ1袶lxmZWB 77~}7߰Ȇ́Mm7l7!c ِ1x Mm7l+٘|@J]a誶J6d tkJWFW!c}JWO骶J6d n+Um+эlL+&F77Mmэl|MהnjݰndC}6aȆmt6mt6 /͛.5@tWmt'2a讶N6d n;]m;ѝlFwhFwlٸҧ]\t&FkJF!cs\Flِ1,΢=6z`=ȆE{@=6z`=Ƣ,`b7Ӂ~oFOl'ِ1)=6zb=Ɇm6zm6z  mTm"SO&7zyF/lِ1 )6zaȆm6zm6z k 襶nٺ1>[;8>Ǥ"~0߇uj߇p]}_}هp=[ćkkDzVC#z97]}[7ɁAozE71VohFolz,&F famH}6`}Ȇm6m6 mQm!26m6 = ^&dC66Plj` Ϙ@mm%ko_-5cw{%^kr諶K6d >c3f_F_!csܢF_l/ِ1諶G6B y'F?7m6 ~Omяlo}F?lِ1~F?~FqpG3rŻK;лKm6 oWm'2诶O6d 6m66) 7m 6 16lG6`Ȇ1@6d >6m 6 ):7>e ٰ=4Pmc 1ls <1H6d >o @@!c11D6✚]dpc8;m 6 ?#3>#3Hmc1l|MהAjAdC6A6aƹAߖ215e0\Sm 6 a=``!ca1L6d 6m 6+lb }cC6`CȆ !#!jC!dC}cC6`CȆE@C6`CF;|Lo }cPlc(ِ11C6bCɆ E1J6d  m Um #Η31 àajðadCk0 Sm #2`1 F6d 6m 6e6T.l 6m 6 m Wm '211N6d >6m 6Fo6U!l6Fm6F mPm 2Î{j#dC6F@#6F`#FGK#\#~j#dC#HH!cyc$7Fm6F  mTm"9V&(O)6FaȆm6Fm6F 碣6FaȆQ(Qh̓Dca1M6d khh!cyc47Fm6F aGC6Fm/Ìc6RoM&Zj,ɖKm6RnͰfZj,ٖKm6Ro-Zj,ŖKmR[nVZj9?q8vYiXoǍ=n 8c7F7z׿1pqcpC=Nƨ{;Dd#ʛcXX!csnXlc,ِ1j,SUm%2_Bc6bFIMq8hc8lcِ1x8q8!c=81G6d 7A6aFs'+ㅍxx!cy<ǫm6Ɠ <^mc<1l|=1ۘ@6Tkcx&w=;Amc1loL}clcِ1  !cp jdc|!=&Dq;NTۘmL$2aߘ1ۘH6d >oLDD!cpj6yM"1W۾>[7 vIj"̇l$zn$qn W>M|O`2]7kPЛ,pq?LW_#3ف~Gfd&Ϙ9Y-b2Idhcdlc pohMc#0Emc 1l|׊)jS)dC6@S6`SȆS)jSdcA{%MoL}cTlc*ِ1{m:{mmL6 ϘSJ2Umc*1lThcTlch_\}<[7l=kYYl4i4!c1 ijӰidC6A6aȆהi4ite_31;}6cɆaFW OOWۘmL'21ژ1ۘN6d nc:1]mc:1l$p=& L z&w lcِ1Y x>Cmc1l hc lcِ1 LWLb&<1ۘI6d O )36fb3Ɇ-fsj3dC6fB36fbF>o'klbr0."E7fm6f w΂睳6faȆ,7fm6f O2 ژ1 ۘM6 dګ1[ٰoVۘm&21ژ1ۘM6d nc61[mc61llhcllcxB&>9d9!c}O1ۘC6d nc1Gmc1lFZOgnlc.?aߞ&\ sQ 7m6 oUۘm%21ژ1ۘK6d c#lUۘm#Jl-׬1O1Omc1l|2Sm6 ۘmSۘm#2_SA6aFgE61yc>7m6 )2_mc>1l|hc|lc>ِ1|kY +ۚ ęxf@mcl|MYהj dC6@ 6` Ȇ j dLS+71j dC}c! 6b Ɇ7j dC}c!Pmc!lLX$3EjEdC}c6aȆ"7m,6 ?˿XXL6XeJ'caXXL6d 7þXmc1lo,}cblc1ِ1XXB6V]L%bX%jK%dC%pDmc l%%jK%dCkhclc)ٸ}KKEX RR!c5e)\Sm,6 X m,UXm,%2c)Tmc)lvX&Z@}-SXm,#2 X XF6d >o,2e2!c5eLmclT=Lrhcrlc9ِ16cɆm,6m,6 r =z+  !cp+j+dC6V@+6V`+Ȇ hc lOA'pyO8o''ِ1'\STl|'ܧ''ِ1,'ƟJmn1+JJ!caۥdö]ZXI6d nc%Rmc%lo6Vmp>y&S>\IR.|hK/qI _o><>$_k;/oz/,XmZj,KmRlmԶZj,ߖKmRmZj,KvR;l<,1K75g ]ERUgZ*qn ۯRwUx][E]L0ZW g?VJVum3ë`g[l𺶊:׵UǭR8wƧU]ob3j8VXm&2Wyxjlc5ِ1jj!cpj5dhCkDX5!csVN]]XC6d >5!c355Z1&ZqƲNk6bkɆXyZlc-ِ1xX ZZ!cpkjkudkCLubMYהuj밍udCSXm#2XXG6d ~:hc:lc=و-k!L;OWXm'27yczlc=ِ1zz!cX@6|9 76ml66  j dC8olP؀ml 2E7@66`<Տ416{7:н66bɆ獍pبH6d nc#Qmc#lFhcFlch:Uc`ؤ D6d 76Imcl|MהMjMdC66A66aFB516g6;гu66cɆgpݬL6d ~fxff!c6C66c;L--t_-!cp[-j[-dC6@[6`[Ȇg--Vv^u&[Ś)[6b[Ɇ獭pتJ6d lkVV!cتF6VqT&ll6ml6 -\1;+ml6 molS؆ml#2۠mj۰d#_'ۅvv!c|cvlc;ِ1xvv!cpۡj۱[/M51p[molo!cyo8o77ِ1x66&2_S6VA6p4c;`ءA6d >o!cj;dC{N1$YcةI6d nc'Smc'lk'<کI6d nc'Smc'lM]bMה]j]dC6vA6vaȆm6vm6v ׶ إ M6bq~!lb}c76vcɆEwsjdCn8oV؍m&2حC6N9kb}c{6`{Ȇm6m6 [p{6`{Ȇg==^1M⾯t^^!c5e/\Sm6 ){ᚲWmc/l^hc^lc٨3!Q L}bMה}j}dC@ݧG6d O)6aȆm6m6d%_mW؏m'2?Ͼm6 ἱ_mc?l]jd!c8@q@mql|M9הjdC}q@m݆!:xg ZAn}x=Aqهu=[wv~͇glAxA5o[lܲ C]}̘]1lR;8!r c~pCjp?8D"d 7=mR8m&Y01 jdCpqXm0qlahal0ِ1Zq8q8B6#hJ88W#jG#dC0m\16l?-uDmql|<W#jG#dCgG#jG }ㆹV†ᡶmx iy3- lÃl|oj؆ِ16ȆچqlI>j㨰q8q8J6d up pZGdC6BG6bGɆ獣Q1ך\1a{1lِ1x81c1!cpǠcjǰcdC1h1l8gI8.fp=q8N6d ~uWm6 Ϣ,z\m8ql|M9mW8n|?̭GCO{<,IKR;eXjg-syKR`]|-KvRb]ԮYj-MK향vRcݵYj-Cw$W6?NxRz{'qd ySo3!cq3jg3dC} qFm ql^Þ{سjgdCkYU8m%27yYl,ِ1,z8q8G6V;ߴ8'l6Ωm6Α soS8m#2_S59lِ1x8mS8m']6Os8/֔pM9q8O6d8";q8O6d nS|6| !c5)>j>؆ِ1 lÇl~hGm۸@6^(_ax7z7 !cq j dC6.@6.`Ȇ) jdcwkczE߸EE!cqjdCprQm"qlE؆/伫ᨉ+lBj؆/ِ1=x_ _l×l܆/᫶m  _hWm۸D6JӻVMK%h%lِ1>ܧ\R۸m\"2^|^%lِ1>qImG6T~ib}ܧma~dC{[6 ?!cp~ІچG6d 7 ? ? C^ͳu1T0̳uj"̇nex>~Y݁]eտlu5q?B|fzzWD?տ2W`?vp+@s(Z[\6m\6Z-&qĸ*WUl*ِ1*\U۸m\%2ߛ^{ӫjWdC6BW6bȆágLko\}5lِ1̽~]16:n:qnڸm\#2q ڸq ۸F6d ~u ڸq ۸N6z[jQK-aUj/]_pW8|6򇳑O=N=8u=Οz{?q'#l'OY=#grȆڷm 66!cpFF@6d >@jF 8L@7aT6Ɇ9]F H6d n#T6ɆmBj#1k` MG.#1)'YIA6aȆ#7m<6 ?[>[Hml#h#l#lL Ln=m vvFD6d ~?s9Hm#"2 lmaF۾]}Ü=&J6cɆ{ {xL6d W>WjWdC33Rxm"21_A6^adT*51 ``l#l|o jF0ِ1`h#Xm#&2 mmco&ob}56^cɆm6^m6^ x mVxm&2_S^C6^coȆUoDx7!cިm6ސ ?7!c377[1qߞL˷[[!cjodC[8Uxm%2_SBo6bFYLw;h;lِ1w;w;!cwjﰍwdC6A6aF"sV}41ދy=7ޫm6ޓ a={{!cpjﱍdC |mWxms[ab!FFB6d {=Dm#!2mm`!dChmE-eb FF(J6d 5%Tm#%2 mmbdC6BPPlhНiQ&aAmlhlِ1!c{?@6>`adǍϪ61k9kmaadC{0 S6Ȇ7FFF6d >oAajaF8pr'#u_(dvQ6±p!cFF8N6d {ppl#lo41ppl#ZLa-H6\vNKjdCpQm#lo|}Gl#ِ1D6zx $7>OjOdCk'|Rm|"2 D6d >o|6>m|6"F!Y=ۈ 3m,!mD #Pۈ6"Ȇg8FmD`dC6"l#ldvĈF:}jF$ِ1 הHHl#lF$mD  mDmDb?3σX?v3L6d 7Zbǰ?Ym3lghgl3ِ1ۈ"!%(8oDmDaQdCF76(!cpQFFE6d }Jm|!"~/!c{{m|6 m|Qm|!2_/j_h31-EhF4M6d >oDy#Zm#ۈ&2?߈jF4ِ1hh#Zm#n?F#iŲb[jnZKRkų~[j ,Z"K-RKj%Ԓ[j),Z*K-RKk[j,Z&KGK-s$%GIb8bz9uxVǶpI I$;E"-b;wwwBm[Ѯܳz˚5/0?rS9NfߛSǀ5.Ab&DcSǀ5.Abv@T1l /5*00Pm#!lj dCQ@%THm$$2B 6b.d*ckbzq!zqQp6\Ȇƈ Q lÅl|%Ẩm`.dC6\   !Dd#a,{m% DDj"]?g9A"sq/%!'}sqovγu=Op=p{~I*zbpszJw_pcyWr`[λzJd Vr Dk%WW\\If] W WlÍlLO>&[ _GuچF6d [ zOMm p#2#`pSp6Ȇ 7hMm p' oob Іچ;N6d w wlÝl܆;᮶m ?ܡ w wlÃltv6<  lÃl|j؆ِ1 hCm 2߷6<6< O 4sYST6<Ɇu D{mxbdC6< O OlÓlnxBj؆Xq^†᥶mx )^pNR6ȆmxA^j^؆ِ1 /hKm &? ye&;? To olÛlYw z쭶mx [x} o olÛl| mxmxc>d#'>چC6d N lÇl܆᣶m  hGmHL6>vhy0Fzl#=ِ1x6cɆpNIHO6d Fzv1̙XЗE v_$e5"Asq/t^ 껟~Žş8/y=πAsmn)Rzw~te -@-\ȁIcL z}-^ \H:P62n512>"# 62bɆ犌pȨH6d cf=fFFF!cpjLdch&4\fRȄmd"2%ÆmK>F&l#ِ1~g&ߙIm#l|m ȤnݗU/^al>Ge,22l ZƲZƲYƲ[,cᖱXNX.XnXe,e,e,222V2V2V2V2V2V2m+f|%3ո)2/e5.3839e5.38Y]2jљaˬqH6R uxv)#Pp T6Ɇm p T6Ɇ3F'WnZF8`2&FAnmaAdCu#֍ l#lnm 66,dc݀˚YDF,F!coeˢB6d ~Q~Q,F!cpY,jY`dr˛F0m ׍`X76`!cpFF0L6d n#V6BF!Fm 7$}7Dm#!27B`m 6B6BPq*lBjF(ِ1P,8Tm#%27Bam bd Pl#+XM#E^4FVl#+ِ1F +dUȊmd%2ޗ>ɪJ6d ^7ºUm#+loqԿMԍlndSȆmd#27~#F6l#ِ1 )6aȆ|odSȆmd'Q01 ١jٱdCsJv8dWȎmd'2S9%Fvl#;ِ19c 6cadݞK41Ļa]00l#lFm 66°0!c9% )ajaF8٠_Hmb FF8N6d {8|=\m#'27am )nmc9F=11r9%Srm6r ׍nPȁm 27r~#Fl#ِ1Xg c>bhm6"F_gbDFFA6d ދF^4Bm#ۈ 2g5mD OFFlx{ &FN װ96rb9Ɇc~2FNl#'ِ1)96rb9Ɇm6rm6r#EM\F.h#F.l#ِ1xF.\F.!cp\j\dC6rm6r :-l6rm6r  mVȍm&2ȭM6d FnF$٨=sMLHoD~#Rm#ۈ$25mD a#6Rm#ۈ$2? mDmDbyFjjfbu#y6`yȆ)y:%Fl#ِ1:%\Qȃm!27@y6`yUGcb6By6byɆ{ѼͫK6d ^7ºWm#/lT^h#F^l#lYWݞ&F@{_QjQFِ1\ٰmEmDaQdCF76(!cpQFF݆W>s|p74ZD>sq/ٺ|̧v\ߋ{_`eȧw\ܛ]}< ?p 1;{LL~e~~\ݗ1\v7A~\a_-"?IF~F˿51 ># m6 `Y@mQl|(jdCFFAUUۘE(FAFA!c%Æ\eŋQ(H6d c3IAFA!c=FAF!5"0&F!Q7 QHmQlj!|F!lِ1x(F!BF!!cQHmQlVeĤL@7 m6 I* $V(m&2a(Q(L6d Y(Q(B6p{ӆ)EȆQ(m!2E`(Q(B6d ^7QDmQlFhFl(wsQT)ERTm(Ql9IQ^-Q(J6d ^7ºQTm(QlFQhFQl#l y}\&FxN DmDcdChNVۈ6ɆmDCjF4ِ1x mDmDcFޥC:ńbF1bF1!cQ ֍bjŰbdC6A6aȆ7A6a1d#YB~bbĈ9%)1j1F ِ1h#Fm#ۈ!2?2ƨm`1dC1FF݆0a/8kGeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0Tx}Զs_,b5.׸Xq2qŪk\,qTd kXu5.jbaU׸X<ő_NĈ6⠍88l#lo}sFG6d >s|9Nm#ۈ#2⠍88l8hn5=MLqTFql8ِ1x(FqFq!c8웋m6 ׍FqF H(!o.Q(A6d ^7JQBmQlF hF lِ1x(mP(m$w]z(FIsԙvH%6Jb%ɆFIX7Jm6J ( mT(m$2_o6Jm6J%kbMV*6Y)RF)!cpRjRdC6JA6JaȆJA6Jaw/71J94SJm6J ?) V(m&24|Fil4ِ1~ihFil swE&Fa QFm Ql(2je2dCu e6`eȆ2F2FYfҕq21ʊ5lY-Q(K6d n,QVm,QlFYhFYl,ِ1x/Z(Q(G6K>('l6ʩm6ʑ `QNmQl|N)rj對rdC6A6aƏ ?:(/l6ʫm6ʓ (mW(m'2a(Q(O6d >6ʫm6* F F!c32 j dC6*@6*`ȆmT6*mT6* ֪QQa+5lEFE!c~"7*mT6* )RQm"Ql|RڨQۨD6~Kvp˦&F%N)6*aȆ&bZJdC6*A6*aȆmT6*mTpl2n]e8TVla..l]eX#*T;0`r25*~e7fr22UԁsJ:F!cQ֍:ju:dCuQGmQl8qibu.u6buɆ町pNQۨK6d װu6buɆBu6bƧoo7mb6A6aȆF=X7m6 ׍znSۨm#2zjdcOZQ_)R_m>QlF}hF}l>ِ1F}F}!cF}F1P݋ DhFF!c9Sm46 lVup8>ƣhm4 2E@ 6` 8WkhH6d n!Pm!ѐlF5g M;<0 ^ FC!cwB 6bF҈5ӟ-419Sm46 hm4Rhm4"2]Ox16aȆFF#FFcquqMFchFcl1ِ1o,4Xm1јl߈qpyNjhL6d >46m46I}{_jb4Fo4Qhm4!2M`hhB6d ^7Dm фln46m4߾c"f,c-c-,c--c,c_[ƾ}kkmkckkkg2eeeXGX'XgXXWX7XwXXOX/XoX؏4נx?5555)8T]הja濒g~6y׸Td >555_3A_Xab4Q35Shm4#2ߋibm46 %16V=pdbhm46 hm4Shm|E6n͟/*+q+x+Ȇ`WWdC06;c8lЏ,Ck+l+!c66Euٷh.pNihN6d 77}ssFs!cp͡jͱdC0u3ÆZͱdY_51Z8Z a{F lِ1̜a#c4<[Z-dC0F g RnK/F lِ1ƮK%gCkђlޚgRԍnThm$27Z~FKl%ِ1GfXHx16Zb-Ɇ71МRm%ъlP׳h%މo߉o hE6d N|+N|+VF+!c͜168ކ/F+lِ1sVF+VvC^_uٺaZ-ksq/} kj_{{͜g뾦?ڻ{8/{5=}|m?6z8M/ߨ7|Cw_03A9/7|Cd 󼯆3CDn2Nj ߐԃ`gl166%qoVƷƷdC}ķF|--ِ13ƿlF3Ʃ^ZbɆ[TE6LhM6.Y7Zm6Z ìM;c'|^kFk!ce1k[I/Fkl5ِ1 5{12Fkl 8t'f޵&FQ7Fm цl|ߢ ܷhhC6d YY6F!c9 Sڨm6ڒK1`ֹoa`ے7?ضjmdC069c8l؎Uhm%2?hhK6d n-Vm-юlT/7o`hhG6d oF;vF;!c֍vjvdC Wڑ +p6aߑ4{zhxN|NwwdC0/16lNm;l;!cssߩm|m|G6d añ>,<^ ﰍeob|/n|==ِ1ٺٺ66'2=dC כ:c8lܨvbhm|m'3g-Ax>{ohO6d ދh{F{!c9=Sګm6ړ ՝16l[6cWi&FQ7:AmсljdC6:@6:`ȆvW;mt6~ Y ZX簉8<dCspNAml!c98ِ1J/FG31: jdCsJG8tTmt$2a訶H6d >WGsJ>F!cxaEc5wCkчlF]&Gm#wM336~6~$29a#SNj##ِ1#S~TlƏƏj?m_aZ226262elelelegP0pH(hX8xD$d/)i閱u/gW]+w¹3sqv/[V*^Žşq^ծkO`?O}y}O`?O-~jdCG61? 6cɆFWm'2m6 mWm 9Gzy l 6m 6 c!c~xIm 6  6m 6qZgb }6bɆjdCuc 6bɆm 6m 6~"^u' ٰ}T'Ȇa/1/OOdCu'X7~R lOOj?aF{LAbm1D6d ^ ^ A !cŜ16K^bhm 6 C21L6b4X1X|Kl0``!c`a[. Vm &2S9e`lc0ِ1x m Vm !fj"X7m 6 v!!c51B6d Nm QmL6n40g&O"dC.~gɆϰn33ِ13P1_CE PP!cpcPlc(ِ1x/:C6bCɆPhcPlc٨1MJLaajðadCkap ;Lmc1l|NajðadC6A6aF%?mb {_pp!cpájñdC6C6cɆpq_ߘ#!cp#j#dCs8Pm 211I6坳;cx6>k1I6d 1oTm$211I6d nc$1Rmc$1l4s<{cEG^t(lcِ1x/: 6FaȆm6Fm6F o6Fm6FIGhb6FC6FcɆpN1M6d ohh!c^t41Zmc41l<(s_&bnaX1C6d >s1!c1)_bhm6Ɛ ׍11XuO&XQ7º1Vmc,1l|N 由jcdC{_cXX!cpcjcqdòaIpbg6aȆm6Ʃm6Ƒ `1Nmc1l8hc8lc >{1 ۘF6d G4qpذ4i4!c48LSۘmL#2_L6mL6=cxN2>'1ۘN6d 6cɆ-}jӱdC=thctlcٸVR& Q7f1Cmc1l hc lcِ1x136f`3Ȇ L176Lb/|&\Tۘm$2|&||Llc&ِ12)36fb3Ɇm̄6fm̴p|e}EmǷ8fY126262626222222222222222222222222223ޘiոo>>s%fY7 ׸YTd Lg|3K]f7jk,Xfk,\fQ1x< ָY7 F751flޞ1ۘM6d >͆ll!cpjdC6fC6fcs4sD<s6`sȆ9o1ۘC6d nc1Gmc1l7mQۘm%~cf:c¾y\lc.ِ12)s6bsɆm̅6m6 Bs6bF71OԍynSۘm#2S9e1l|>ߟ1ۘO6d 3Wۘm'2SC6c ̳.^C3 ķo-PXm,0OE o,|Xuc 6` ̓bXm,PXm,$GEv41uBNYXH6d nc!Pmc!l|!_XH6d o,6m,6 c0YD6np#/RXm,"2S9e"lcِ1x/6aȆ"hc"lc1٨jdN&bo,bb!c֍jdCsb8,VXm,&2X m,VXm,!)oߝ6X"%XXB6d ^7Dmc ln,uclc ِ1XXJ6v`b,kإp Tmc)lf [ad:Ckc)ln,ucRlc)ِ1XXF6x:^l01epk2lcِ12Lmcl2hc2lcِ1e2erAMrhcrlc9ِ1x6cɆm,6m,6 ˡj˱d#cX!Q[Q[XA6d ncBmcl hc lcِ1xXXI6,_6RԍnTXm$2XXI6d /TXm$2+j+Udc37>&*acJmclY*m*lcِ1U*U*!cpUjd~GE:e5\VXm&2EW^tjlc5ِ1)6VcɆ{jvC^klX-֨E0w[2֨;0`s[wר7frn k| k鞿l(Co\ ;תZ\ݗ1Y۵Z%2ka=X׃$BsZhcZlc6qo&:acNmcl\{uj밍udC~:u:!cbNmcl-w@Ac1Yczlc=ِ1La9j뱍dC6C6cɆm6֫m66~AدCÖ,c[ƎXƎZƎYƎ[NXNZNYN[XZY[.X.Z.Y.[ƮXƮZƮYjG e)ovywk.\vQ1xk.uۅk.q2vh5n8vK]vo7X3LNncVGjdC{1^nn!cpjdCnhcnlcBkbuc{6`{ȆX7m6 t{6`{ȆT{=j{dUL^hc^lc/ِ1j/\SU؋m%2ثK6d >6m6kz\U'z{>lcِ1}>}>!cp}j}dCt}jdco%MkV71֍jdC~oW؏m'2دO6d ^7C6c4ab6@6`Ȇm6m6 8mP8m 2q8q8H6/5Leb6B6bɆA m6 {6bɆm6m6~%o511~όόUlfRajb  pUlF]&Ư!q:UE^!lِ1x8!C!!c1M8m"2EA6a+T8,l6m6 ÍMmɆmj;q8L6d oaa!cpj6~3gbܜ Zov^u7=yqtSw\ܛ]<.=M}w^4#~};ݗ1L=hp`ے]w\~'2CE$B=jcGƝN~8"#p8q8B6d #{QG6`GȆOy=q8B6d ~8q8J6ϫqTԍnU8m%216l{Rm$ql|rSNm6N a񏉁lT8m"} ~][㔨`8q 8E6d 8q 8E6d N9)6NaȆ:mR8m&ŏ:sqiql^\\ V8m&2q8q8M6d ^7NúqZm4ql= mV8m!C\ښgĜr)g6`gȆ99q8C6d o3!cpg3jgdp}s~gbuhBk%橑\ U8m%2q8q8K6d n,qVm,ql|,qVm,ql؃31Ή~7Ωm6Α 8mS8m#27~9lِ1s9syQcbLκaɆK6Ϋm6Γ aq^muw<#s_m>qlǼ{jdC C6cFEUab

jPԍns7!cpo7jo7dChl-HpN<㭰xxK6d n-Vm-l[h[l-ِ1xxxG6?,ukNxmSxm#2xxG6d nNml|NymSxm'fB㽰xxO6d }Wxm'2xxO6d n=^m=l4S+wbヰ@6d ދ~!clِ1H6BoqdQm|Tm|$2H6d װ6>bɆ{яGƟdǻ&ƟbOƟƟdCƟSmOlO!cggmmI6d ^76Tnq8/s&9y&/(/"]x/g5/=ſI v_o..<_|{{Wz\ wl'x'\>Ojp=D"d >W|6>m|6> Ǐ6Xmb|sgX>m|6> ##Ym3lghgl3ِ13Ym݆/w_/o8ő Hhs%Z,c1˘e2m%%%ZƒYƒ[RXRZRYR[XZ,ct XFX~7džZc/AN!'9c8jg)1`KN=u Xy'翄dcgiy31  j dCkAhPm#!l|%acIHH6d >%6m$6\ƀ]g`b.Іچ B6d KzEmp!2\Po䢶m pQp62Կл6aȆ}DjDdC6A6aȆXA6ad'8[M r Bk*W WlÕl]w چ+J6d npUp6\ɆWhUmp#~k&78mandCnAhOMm p#2mmandC6ܠ 7 7lÝlSSL wQ7apWp6Ɇal4rp0Sŋm S:]mp'2Sܡ w wlÃl-.;L Q7<`P6<Ȇj؆ِ1xuCm 2mxmx`debx^j؆'ِ1X$婶mx 6<6< O!cu'᩶mxӒ߾sS6 /!c /᥶mx 66 /!cmxmxadc~ؔ9,Ɇmc[m&27a᭶mx C!V6ɆE o olÇl|~M Q7|`Q6|Ȇ >j>؆ِ1xuGm!2_@>j>FbfL.;FX q6cɆ{İMHL6d ^7úXm#1l|NI m$VHm$!/ި¯&F ~^;I:Dm# l|_4 MHB6d n# Dm# ln$6m$6?o>)ٰMI6bIɆ甤pNIHJ6d o$UHm$%2IjI _uL _ 7|6| _!cu/\mbdC~Wm%2jlmbFu;bb$ ⿯,v2dF2!c~#7m$6 `/Lm#l|NIm$SHm$'.\8jb$Fro$WHm$'2aHHN6d o$FrFr!cpɡjɱd{71R5l MHA6d ^7RBm#lnu#F l#ِ1F h#F l#%:L'MFJh#FJl#%ِ1FJFJ!cp)j)dC{)j)TdcJ)Jm#l|NITjTdCsJ*8RHm"2SRA6RaFʗqZ11R jdCu#56RcɆm6Rm6R aSC6Rm8y! gJEQHca.4FQ;Hcw`.9[iw?{4Q4{>̥zižEZoV}zAZXҪ -91xH׃$BsEZh#FZlÏl48_'lA~j~؆ِ1 ?hOm#2~j~؆ِ1\mmad#x__21Eg  lßl|/mcdCu  lßlnCjF:q{&F:Q7Nm#lnu#F:l#ِ1tF:tF:!c}tF:tFz,ǥLnu#Fzl#=ِ1FzFz!cp額j鱍dC6C6cFCN^nbdu#62`Ȇg3md62 mdPȀmd 2Ƞ Q}7ibm ׍X76!c}om FFl"䶉QԍndTȈmd$2ȨH6d N)62bɆ)jLdcTDF&LF&!cpLjLdCsJ&8dRȄmd"272A62m8s^|"-YƲXƂ-c!PXVX6XvXe,22aiem屌嵌EYY[ X Z Y [ƊXƊZƢ-c,c1doBam?b ׸Td /3ϬqqL5NQfeV׸̸e'c/3q5.3F)(³ujF ِ1>] ܧ T6Ɇ{@mbdC6@@l#lxڇ&F؋ {1AjAFِ1D ] l#lFAg Sx16 !cwH l# 8ؙڏM,ndu#Fl# ِ1/16v:܎16`YȆ,pNɢB6d mdQȂm ?6``l#lFF0L6d k``l#l|N 66Aqͻ!d#Ǭ32!j!Fِ1XKB6l-qFB6d n#Q6BȆm@!j!F(HA&F؋ {1jF(ِ1x PPl#lF(m 6B6Bdj˳&FVbFVբ|%FVFV!clWVFV!cXf̪߱J6d OȪF6fq`bdF6lF6!c~#7md6 a#A1&F|=>k/F6l#ِ1xmdSȆmd'_:ݹ5N6 5md6  1؏eWȎmd'27md6 mdWȎm :u# ֍00l#lnm aS6ȆװaFFN6tl™  jF8ِ1L/aUI%[ZF8ِ1xu#\m#'2mmc9ڇקhb9hF!cg93j9dC{_9WF!cp9j9mڜ#¹5Fٰ}8Bm#ۈ 2zzFA6d >D9%Bm#ۈ 2mDmD`9F'4db9FNFN!c֍j9dCu#'96rb9Ɇm6rmpE6$cOs.@sE䲋0weo<[ ~0A.sqv"γu`GK}sᄍ7߭y.=υAnVnnD/#r>" 7}<{ppTFNċu׃@{ZVnܸ&2jH1y˥bm +CF$I6d  7"6"H!c"jF$ِ1Hh#Rm#C6*^Gy`Gm#l<6m6 G/pNɯO6d $?|N_m#?lnu#F~l#?ِ1x/ȯ(@6Fv>Q@ԍnP(m 2?[-Q(@6d nQ@mQlFhFl ٸ3ڎ&FAoFAFA!cpFAl ِ1R)6 bɆm6 m6 %LBF!hF!lِ1x/Z6 aȆm6 m6 Bjd㻹 01 jdCFaoV(m&2S 9Fal0ِ1~j"d#OaSED/ZE6`EȆm6m6 oE6`EȆFhFl(xdr&FQq(L;q▱RҖ2r Jʖ*jꖱZږ:zFƖ&R/7NgRs߽yw%V]bq'c k\K5N_,b5.׸Xq2. k\/lcٝL81/Nm#ۈ#2`mđ *Nm#ۈ#2ߋ66Ⰽdctd׈L&FqglFqcg]֍jűdC6C6cɆFqX7m6 C6c%F[lbt%>] F !c9SJm6J Kv F !cp%j%dR7A&FI>9[WlW尒j%dCu$%6Jb%Ɇm6Jm6J ( mT(m"VCQJԍRnR(m"2Q (Q (E6d oF)RF)!c=RF)RFi1&Fi  6JcɆm6Jm6J ( mV(m&2ߋ) mV(m!-4Y=QFSuJ2F!c~ 7ʨm6ʐ ӕte6`eȆFhF !w뮛r,QV-]w³e{{~,(ʪ~Y7fue=/eq=(GIG]gutݡ8E;$ I,h@ @)Bqwhqk-}<}Y+߽wu{7k{szD wfA3f4#21A"zЌDlm4Shm4'[fIhhN6d ~\sx\sFs!cp͡jͱdC}DshFslÕl +R& mmbdC=+1]6\ W!cpІچ+J6d ^7\ W Wl٨|hT1[F lِ1٥-٥-6Z`-Ȇ-F lِ1F FK;.-ahhI6d ^7ZºRm%ђlFKhFKl%ِ1hhE6^dy`h hE6d ^7ZJmъlF+hF+lِ13VF+V؆وzЊ&mmandCO6ܰ 7!c~ njn؆ِ1mmaɆ$3V61Z95SZm6Z ~Zm5њlnuFkl5ِ1FkF~~۫mĻmm6`mȆ6hhC6d |Fm цlFhFl-ٸ2 G5hhK6d Uhm%2S9F[l-ِ1F[؆;٘eM wb Aj؆;ِ1x w wlÝl܆;᮶m Іچ;юlt=87~F;lِ1vF;vF;!cpvjvdCuNmўl |Uўl$H~U=؟ȡC^m=ўlF{hF{l=ِ1F{F{!ch@6:~A`Amсl{jdCpAmсlnt6:mt6:\gbtuuTmt$2a訶H6d N)6:bɆmt6:mt6ІچC6d ^7|`Q6|Ȇm@>j>؆/Hlj-M _o~Wm%27|a᫶m 6|6| _!c^U6:^,FgX7:mt6: aYm3љl|N jdCu3Ym>u"χo ZƺXƂ,c]-c,cXXOXee,222222n`hdlbj G5n{omDf?u5Ώj{#?kq~Td ;U~w58?q28?u8G^ۺum?oa.m?ܓW;;0Om?~w~Su?yg iv AA}< P; zA1x?mm`dfM@V k@@l#l]@{F H6d V "Pm#$2mmb]Ƣ3k]`btk.pEm хl.j].dCu ]6`]Ȇmt6mt6F{AbN sJFD6d GAjAFِ1xu#Hm#"2mma]Fr)21 ]j]dC#LWFW!cwHwHmt6 ?B]6b?zCLnF7hF7lِ1L/a; F7lِ1[7Mmэlnt6mt6ƦA}L`o~#Xm#&2߷jF0ِ1 ``l#lnCjFwѿ:݅FwFw!c~;7mt6 ׍ntWmt'2O;]m;B6}~&FSBm ׍X7B6B!cFFB6d >@!j!Fa3Lb衶A6d nCmуlFhFlِ1o6zm6zC-)l6zm6z o=6zb=Ɇ甞pN驶I6d ,'Sm'J6Fu11Bo @1m ׍PX7B6BP!c FF(J6d oBjF/8̿j77z~F/lِ1^F/^F/!cp^j^dC6zA6zaad#mnabN sJFF6d - >k S6ȆmAajaFِ1mmaƅbbkp [m7ћl jdCggVm&2j>dNibsJ8Qm!2裶C6d ^7GmчlFhFl/L@Wm/їlF_hF_l/ِ1F_F_!c}ѾF_F?OӰ{Oԍ~nSm#27~F?lِ1~F?~F?!c~Omџl6ck>&F{_ ꯶O6d n?_m?џl|?诶O6d >6m6yGmkbuJ8\mcdCsJ8S6±p!cFF8N6d n#W6 z31@ԍn Pm 211@6d nc1@mc1l|Nm Pm $>(ְv@lc ِ1@5Pmc 1ljdC6B6bƛͭ{hb r s Qb(# `(91\1C"z0DPFpxi&FmDmD`dCGs#6"!cpFFA6d >WD@j0qXF~09Lmc1ln uc0lcِ1a0a0!cs1Lmc1l N6.z1N6d 0Ckc81l1N6d ^7C6c#F뉳ze21F9eSFm6F ׍nPm 2_j#dChc ǹ/Nzg8∴1262emcX&Xb-c-c,c-cS,cqi閱Yٖ9yEs_"e9E(Fk\$87gsQsƋqER1 Hu5.jk\$q翑dw=MHhcHlc$ِ17#6Fb#Ɇm6Fm6F #j#QdcR51F QjQdC(Q(!c5(1 E6d nc1JmcE6۵-x%(7GmDaQdCDwH6(!cwV;QjQFِ1SQFF1lJ6rF &hQ7Fú1Zmc41l|N jdCkpM5Zmc41lhlצObM1b/f ܋1C6d ^71Fmc 1l|N1jc1dChcl#llSI&FѰnDmDcdCF476h!cpFF4M6d oDCjX'WڻcE1c6bcɆ由pN1K6d nc,1Vmc,1lFC&1Vmc,1lT>SՅ8cS9e8lcِ1x8q8!c581G6d ?1O6> 1dfi<X}0w\t1O6d ^7ú1^mc<1l)hpѥЩƋ1O6d >6ƫm6bƁsgabĈ~#1j1F ِ1x݈u#Fm#ۈ!2_uJF C6d ދ@1j11{g6KȆnLPۘmL 2/q|/qlcِ1x16&`Ȇhcl#lVMXы^4Vm#ۈ%2SbmĒ ۈ6b6bX!cpFF,1ln\(<\cӆyc"ٸ|9lDlc"ِ1DD!cpjdCsDhcDlc8LIߘIjIdC6&A6&aȆIߘ1 ۘD6d nc1Imc1lL[3M&d֬S& jdCHʦd6MVۘmL&2aݘ1ۘL6d nc21Ymc21lt M)nLuclc ِ1x/:S6`SȆ7)jS)dCڦ@S6`qdvqnmđ  g Q$qjqFِ1x݈u#Nm#ۈ#2qFF1l=n~&TQ7º1Umc*1lߘ jSdCuc*S6bSɆ)SjS6yM3ե#5M'MSfa.D\>{v0׃@p1]-b:It QyV3\136f`3Ȇm mj3dC7̀7Pۘm 2+f@36f`31'^mbuc&36fb3Ɇ̄Ifm6f ׍nTۘm$23j3YdcGy&,UccZ,lcِ1̜匁۟1 ۘE6d c΂=,Y,!c1 ژ1 ۘM6?+\.zcSf9ellc6ِ1xݘ ll!cpjdCĕ6fm6損Z/ZĘa- ӏKs6`sȆ;9js9dCsdlcِ1hclcYtobsͅsUۘm5T׍nUۘm5Uۘ mUۘm5+W)sjsyd[lbs<8Sۘm#2Ӛm6 ۘmSۘm#2SA6aF{fl51 jdC6C6cɆߘ1ۘO6d nc>1_mc>l Qm@Xm,PXm, 2gm,6 ׍n,PXm, 2S@ 6` F&X(XXH6d /.TXm,$2XXH6d XXD6Z1rHo,6aȆEpNYXD6d ncHmcln,6m,psy>D?3;[Xb[j[f[n[a[i[e[m[c[k[g[o`hdlbjfnaie222222v2vr>bqs:0NE[ kbu[kbq2qa[qq[L5N5n1q5n1q-5n-ѹة KDoFK6`KȆb%jK%dC6@K6`KȆm,6m,6 /31֍jKdC6BK6bKɆKz{Rlc)ِ1R2$苴Leb m,6 52e2!cg3ej˰edCg,6m,6u/Ϛ˅rr!cpˡj˱dC6C6cɆrhcrlcL hc lcِ1)+6V`+ȆpNYXA6d ncBmclT\ʟߛ+3JJ!cuJNYXI6d nc%Rmc%lJhcJlcQcXUjUdCuc6VaȆ):e*lcِ1U*Uj/c3XM6$xG^&9fyjj!cVVm6V ׍հnVXm&2EWC6VckF䮺71ֈ֍5jk5dCuc k6`kȆX7֨m6֐ ׍55ZѰ11: ukFSE˺Vmc-lX jkdC6Bk6bkɆ 6֪m6֑;ebupNmcl:hc:lcِ1u:u:!cXnz8_uI]֫E0O.n=Xv\<׋ۺWo.]߭[z=_q?V} ؠp=@w_`6z{ jp=@"d >Wl66ml66e|a+FF!cpjdCsFX-6ml66 jMd#}l.ķuu66aȆc&lcِ1^&Imclnl66ml66u,ll66ml66 nf=66cɆml66ml66  mlV،ml!K|鲉E?-!c֍-j[-dCs8lQ؂ml!2S@[6`?/jblelelU؊ml%27|16lG!nU؊ml%2E^tVlc+ِ1x mlU؊ml#uc`ئ F6d ^7Mmcl|Nmj۰mdCl6ml6^k?abl6C6cɆ):evlc;ِ1vv!c$ۡj۱dc[>'21v;j;dC6v@;6v`;ȆءA6d o6vm6v,s));:eNlc'ِ1NN!cp;j;dCNhcNlc٨츋?].].!c~c7vm6v )Kmcl.hc.l;%wMĞwp;ﰍȆm|m|ِ166#2wnqRMb awm6v  mV؍m&2_kjdC6vC6vc{Ƹ1^=01^tEm6 {`Gmcl=j{=dCk==^Ѣz~L^hc^lc/ِ1x ^^!c֍j{dCuc/Wmc/ld951^tEm6 ׍}nS؇m#2اG6d ncOmclVMnuc~lc?ِ1~~!c9e?Sm6 o6m6-m8 l6m6 ?~?~@mqlnulِ1xq8q8H6|>7X딃jdCAoT8m$2q8q8H6d ^7B6mχA'|Cs<[ƾ`;f;n2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2eg078s:$Cp;qp;D5N5q5q7:{Cw׸CTd 75aՊLahal0ِ1x|͇6cɆp;q8L6d n0qXm0=٠^ߋpdC<|^m{l{!c=߫m|m|O6d n{h{ﱍ#d# 61G#jG#dCuG6`GȆo#jG#dC6@G6`GF}gbG6bGɆm6m6 hᰱm2Njq8J6d n(qTm݆#̷ud*j?E'ar~[m~;0O j8>A}}sT)[?{f̧? cb8c ׃cte 8zp=cP1c#2c9mS8m'cwHqiüd~l^2?q8N6d 3Wx;c8l\gE8m'2q8q8N6d n8q\m8#p8Xצ?mmH6d G6~6~$2QacݍiyץCkGlG!c>GhGd#M[mbggP8m 2yᰑy&˳Ckql|mzMOm6N 8mP8m$821N~$7Nm6N ׍nT8m$2: Nm6N q8q8E6&/8닉qJ8mR8m"2FRn)S)!cq ֍SjSdCuqJmql']6zg㴰q8q8M6d ^7NúqZm4ql= {jdC6NC6NcgF]8#88q8C6d n qFm qlnul ِ1: qFm qlN62qVSuYY!cpYl,ِ1x8 YY!cq8q8G6,s`2㜘S99lِ1x89s9!cq֍sj簍sdC6A6aF>?&71 硍j籍dC6C6cɆyX7Ϋm6Γ )硍j籍 d(  !c9S.m\6. ׍ n\P۸m\ 2 jd2{Omb\6.B6.bɆm\6.m\6. ۸m\T۸m\$2"qQm"qllqZoE/^%lِ1r )6.aȆm\6.m\6. ۸m\R۸m\&Ӳ'ĸ,l\6.m\6. ü匁_V۸m\&2qڸq۸L6d o\6.m\6j+qE)WrEm ql|N+jW+dCڮgmW6`WȆ++U8P`~F㪰qڸq۸J6d UUU!c)WjWdCsUhUl8zyMk]k]kjװkdCu6aȆkpNq ۸F6d nqMmqlD;Nbb\u:6cɆm\6m\6 ۸m\W۸m\'27C6c7F4Jjb6n@76n`7Ȇ)7: lِ1xq76n`7Ȇm܀6nm6nt)ĸ))7:Ml&ِ1MM!cq֍j7dC6nB76nbŰ01n~7nm6n ۸mR۸m"2q ڸq ۸E6d o܂6nm6n'eb6nC6ncɆ q۸M6d <6|r[m6qln܆6nm6N'qG)wrGmql{;jw;dCuw6`wȆh 1?o1$I-'s$_/MOOj?'g~w'~SMO?z3sY?ùg׃?@g(gq=D|ghg6lwI/lYw-sܳݷ========b22222eeeew{?-cY>X>Z}}}rjܪMKo.yk]\R1̾3>qwqK5Nw]uk]q2qwaqwwl;pR㞰qڸq۸G6d ߃={=!c=Vq۸G6d ߃6m6-Vj\ĸ/u;jdC06|1hZdC6C6cɆmW۸m< >]@ԍn{xD6d ~ۏ6aȆm<6m<6 >6m<6\*ab<coSS!c9)Tm)lL,"큲&3Q7Lmlnu l|6>m|6> `Aml|lِ1xH6966> b'lِ1L/댑m|"2|'lِ1O'OgblMϢ jdCpYm3l|N jdCsg8|Vm|!^9"~_K_6`_Ȇag V,ŋB6d >|s/!c֍/j_6\w>߉0wّx$%%%%%%eeeee}cjfnaiemc28OP*w=;?.oN=埓 \'Oָ.F \PoϿk\T1l?!ЅPm#!lFBh#FBl#!ِ1FBFB!cp j Ddc]"DF"!cuL .N}4^ DF"!c}DF"DFb1;]u]зu6cɆFbX7m$6 ͉]PߜXm#1lFbh#Fbl# ٨&F~ftf$F!c}$.h.Fl# ِ1)I6`IȆ$F$FRhn\ }MFYo'%KCo$UHm$%2IaHHJ6d n#)Tm#)l|m$6U31uJ2NI HF6d n#Lm#lFug,^ dF2!cV洜bhm$6 xob$hr؋&WHm$'2HHN6d ~vPrtvPrFr!cQkH/Frl#p4=h\BHmPHm 2ݺ.wRm6R ))Bm#lwݝ1PBm#lVA&FJ1sJJFJ!c^4%ESm6R SRuJJFJ!cuJJh#FJl#ٸMs]MTnu#F*l#ِ1 )6RaȆm6Rm6R (uN HM6ͷoZaS5ljFj!c֍jdCFjoVHm&2Qa‡=μ#chm6Ґ nf 11҈֍4ji4dC6@i6`iȆ)i:%Fl# ِ1|*KCk# l,:@65ym]8dP`a.u\w32'gݺ p#g}sTv^ {׃t+ڨI_C/a=Ȩq=Hw_ #2zd ZDF\2A6C3?9:OZLdݶ=gbd62A62aȆ䂾ɤ D6d 62aȆA69c8lvԬY%Ȅmd&:~,ᬑYm#3lndu#Ffl#3ِ1^xf8dVȌmd&2ya;* Ffl# qEԍ,ndQȂmd!2qbbhmd6 mdQȂmd!2㫍bhmd6!wuFԍo`Fml!cghghߨm|m|C6d o|o66!2 |7FV*@ACLκaJ6l?Um#+lۺ.ۺjYdCu#+Y6bYɆal4ppذUm#+l8&F6X7md6 `Mm#lF6h#F6l#ِ1 ljٰdcM31o o md6 edWȎmd'2ȮN6d ~mvh#Fvl#0qC9`/Cm#lj9dC6r@96r`9Ȇm6rm6r\eL6fI6l}NFN!c2r2rm6r 9a/Sm#'lFNh#FNl#L#`ȥ E6d n#Km#lZ. -F.l#ِ1\jdc [61r֍jdC6rC6rcɆpNɭM6d juˇk\>q2|.k\>\Q1xߜ5.q7k\>uˇdcPj˳&F~a#?_m#?l|jdC_~8Wȏm'2C6cFMz(++Q(@6d tpظx Bx16 `ȆFX7 m6 6 m6\F0Nj &Xoچ B6d ^7\`pQp6\Ȇm@.j.؆ ِ1xp6\6\dW\q&FAm]Am]AFA!cg?᳟jdCsJA8T(m$27 B6 b?M=($l6 m6 (mR(m"2Q(Q(D6d nQHmQlmtS 9Fal0ِ1>]aOWXm0Ql|0ܧ+Q(L6d RL dFalXED(F"F!c~7m6 E`QDmQl(mQ(m%Wx?(*FQX7m6 ( mU(m%2S>)Q(J6d ^7BE6m8>*F6&hW m]1X-E0O".yqUL݁x߷u`e(w\<xCG8s_ךg8w8Aq\׃W(Aq!c}FqF QM(+C F !cWKm6J (mP(m 2_6Jm6J =Zhb{%^xIFI!cGI(Q(I6d n$QRm$Ql, mT(m"kڵ-(%RpN)Q (E6d c#Y+6JaȆm6Jm6J ׍RF)RFi)%&FiQ7JúQZm4QlݳݳjdCkҰ-Q(M6d ( mV(m!n)kQF{V{VFm Ql[2[2je2dCu e6`eȆFhFl,㟦' ea(Q(K6d N) )e6beɆFYX7ʪm6ʒ ejerdcow419Y #ʩm6ʑ #+Q(G6d ^S(m#2_Ö6ʩm6ʓ7j Xmbhy؋W(m'2_j屍dCu<6cɆm6ʫm6*z>ĨS:7*2SAmQl|RS*mT6* ?_VPۨmT 27*@6*`FZ/ZgbTt6ƸdݨQۨH6d hE?^Qm"QlnTuFEl"ِ1xQڨQۨD6NDSxԳշ55555555ZZXZZZY,c-cm,cm-cv1˘e22mZ:|TәϩquaquqK5N_]8U׸ե'c.k\]\R1x k\]uzds/~9dbKsAKSۨm#2F=lِ1zF=zF=!cpzj6y' G^uݺZWoa.]oC'z}[W_~Sm]}xy}\=G 47} \@ ȁA(ZD\DhFl!pzciXm46  ahhH6d L!|Pm!ѐl|hhD6/>nb4=f#8k4Rhm4"2hhD6d ^7Hmшlhm4Rhm4&=Ȓ焉Xԍưn4Vhm4&2S9Fcl1ِ1FcFc!cpj&dcv/w\&Fa Dm фln4uFl ِ1&F&F!c@M6`MɆwz61^)Em46 h m4Uhm4%2hhJ6d ~{ShFSlw1s&F3Q7LmьlF3hF3lِ1;$;$6aȆ=km4Shm4'Y{h.l46m46 \m9ќlFshFsl9ِ1hp%+ꂉ*W8mbdCu W WlÕl܆+᪶m p6\6\d#SLnuF lِ1` F !c~7Zm6Z hmPhm$>㲉Rh mThm$2-ahhI6d }Thm$2hhE6~o؃31Z VjVdCH*bJmъlnuF+lِ1VF+V؆wnpچF6d ^|/Mm p#2? শm }AnjnFkA{h-FkX7Zm6Z :c8l8V)]݊NjhM6d ^7ZúZm5њlFkhFkl ٨|[&Fa Fm цlnuFl ِ16F6F!c9 Fm іl$˔α&F[a-Vm-іḻ̱jmdC6Bm6bmɆF[hF[lÝl61<;.@ lÃlnxᡶmx S<:Cm 2mxmx`d#WOM OaT6<Ɇ7<چ'I6d ox~Sm$2S< O OlËl/NR6Ȇ8gzmxa^dCsS6 /!c̽ / / 17IuIEtRda.y:Iv\<׋sS8/~'d_L8t7'~[+!tm?䭾޸xݗ1\ oo\Ɂ771x mxmxc>do>zib\m`>dCQ6|ȆGm`>dC6|  l×lTְ{kWU6|Ɇ;چ/K6d nU6|ɆmBjFgw~211: jdC6:C6:cɆpN鬶L6d mtVl8e}ќ"φq9-c@XXeee,22bai Yz[XZY[-c,c-c,c-cC,cC-caᖱ.=ŏjK|ko S8?\;?G5N58?u5Ώj??X5dcLmbmcdC?6 !cFj؆?ِ1mmcdY/?71onoox+FF@6d l#l|>m`dCu#P6Fڻ,u#֍@@l#lF m 66@!c@h#Pm#B6.yn\Sm]{ ]6`]Ȇmt6mt6 mtQmt!2S@]6`AdcfoAb.maAdCM,Hm#"27`m rmt%^*uOwmt6 ׍ntUmt%2]a誶J6d >t6mt6oW=mZM`Mmэl|禮 F6d nMmэlnt6mt6ɆG).$xN1u< & 6`!cpFF0L6d {0|=Xm#&2FF0ѝlLոPx"7~Fwl;ِ1FwFw!c֍jݱdCu;]m;B6B="l@!j!Fِ1W Q6BȆm@!j!Fِ1x6B6BdW)=s`F!c^E{m6z mPm 2_6zm6zy[=FOFO!c9'Szm6z  mTm$2詶% E6d nKmF6?,&FajaFِ10h#Lm# #2?& m )aFFћl$qa-FoX7zm6z 7ћl|ϼ73ﭶM6d mVm!?;sJz裶C6d"F2Ckчl|N>j}>dCuGmїl6bF諶K6d oUm%2E^F_l/ِ1}j}~d5ckbgm6aȆala+6;?F?lِ1~F?~F?!c~F?~v~j_-]xۺ ]\렿݁xOPm]Ĥ}sT {׃p7:p6.pݗ1L=vp89(9E: }DZD8$Bkph#\m#@6d\p6cx>>{1@6d >Pm 211@6d c6m 6 #J01s 5m 6 11Pmc 1ljdC6B6bFDsS21 AjAdCuc6aȆ-}AjAdCs hc lc0xV\M9LɆm1L6d oo ۑ6cɆ`X7m 6  m Vm !;cC`1B6d >Qm !2 ‡m 6 m Qm %}c&=|J6$xGu%9/9Um %211J6d ^7º1Tmc(1lPhcPl#lT&FXDuJFA6d ;#6"!cuJ\DmD`dC{ZFF1l|xˡj.&0 0 0a0!c^tEm 6 )2Lmc1ln 6m 6rS.1N6d ^7ú1\mc81l|NjñdCuc81\mc81lDi 19#Ȇ!cg#j#dC;#6F`#Ȇ7F@#6Fm8·a4'qsEqxI6RX9x1c11I6d  #6Fb#ɆpG=ܑj#dC}HhcHlc8ʓ&(((Q(!c1 ֍QjQdC}(7Rm"21 1 ۈ"Ӳ'鐮%'DmDaQdCu# ֍((l#l|NsJFE6d n# ڈRۈ6F n)mb6FC6FcɆhX7Fm6F ׍ѰnVm&2_S6Fm6Ɛۗ51c1jc1dC{1c^1!c1֍1jc1dCuc 1Fmc M6tr&FEa/mD ׍hX76h!c FF4M6d ^7hhlc,Xt+cXX!c}pnXlc,ِ1:e,\Um%2cjcqd#8EDJ&81s8q8!c9eSƩm6Ƒ ?Sm#2㠍qj㰍d_Exx!c9ebdlc2ِ1x1VjdC6&C6&cSFL^SĻgSgS6`SȆal:c8lŋ1ۘB6d nc 1Emc 1lmLQۘmđVt'FqjqFِ18[ĩmaqdCqp"Nm#ۈ#2qFF1ld:trI#cӆdS6bSɆTX7mL6 ׍nLUۘm2>c{>Z,@q)Nqw-^⮥HB! $wE <=]~|zξ˚5{)ِ1xX m,UXm,#WiX&2X7m,6 /{6aȆ{e] XF6d ncLmclAccݞ,WXm,'2S9erlc9ِ1)6cɆr sU+spc lcِ1  !c9eSVm6V db +6V`+FCTM7VBRmc%lJhcJlc%ِ1JJ!cXp%?:GL Wo~Ump%2 mmbdC6\ W WlÕl9+᪶m">;g Ĝ )6VaȆ{U] XE6d o*U*!c X p#{&pu 7 7lÍl|_ mandC6ܠ 7 7lÍl|mmadBFǡ&mmcdC6ܡ w wlÝl| װj؆;ِ1xp66ܱd]H?^MbNY jdC6VC6VcɆհXXM6d ^7VC6VckTcx/c |/clc ِ155!c9e S֨m6֐ ׍55Z1Hlώ&Zac-Vmc-lZhcZlc-ِ1)k6bkɆm6֪m6֑^nX'uXXG6d hgg tF:u:!cp렍uj밍udC6A6aFJzlb6C6cɆװvzlc=ِ1)6cɆ_mWXo9~"χPxlmmyXƶXƶZ<-c^m1ov˘elelele2gXXZY[XZY[ƎX-cGsu@5.iq`۠qp@5NAlAlP׸ m'c5ڠqp@5Nk mP׸ xH6+&Fac#Qmc#lojdC66B66bɆ7B66bFw\ibl66A66aȆl~6ml66 ͛`߼Imclnl66ml66\m.,ۛz{flc3ِ1ff!c֍jdCkf؆ٸ M Cm 2mxmx`dC6<  lÃlw<  lc P]H?cml6 #)ڶ ԶEmc lhclc ِ1xmlQbk+H>{1m3VvI kVv Vj_M8[|+tKXq. CS{'te 1a hUZxTD| mxmxb^dy;~41 ?6 /!cY/7륶mx ^Zxmxa^dCs᥶ml#'m=&6X7ml6 # ~#Mmcl|~ܷߦ F6d 6mlS؆mx {=u o olÛl|OiymxcdCg{36 o!c mxmxcFdbl6C6cɆخN6d olvv!cpۡj۱ `ɔՆ>bmצ>j>؆ِ1\m`>dC7|6| !cp>Іچl6!l6vm6v #)k{v [۳Cmcl  j;dC 6vm6v9/Oib6vB;6vb;ɆةI6d ދNN!c^t'Smc'l4ߚa&.acKmcl|N]j]dC.oR؅m"2SvA6vad#C'ǘچ/K6d nU6|Ɇ _ombdCs/᫶m gb놟چG6d nS6ȆmA~j~؆ِ1᧶m C+`b놿چ?O6d >?|_m'27a᯶m 66dMnhcnlc7ِ1x/6vcɆm6vm6v  mV؍m \&Fmm`dC6l#l hF@6d n#P6/bboQ؃m!2أC6d o=!cp{=j{d{zMnuc^lc/ِ1^^!cp{j{dC{j{}d'I3L}N}diH6aȆm6m6 mS؇m#2اO6YLcxF>߯O6d װ6cɆدO6d د8@6޸^]ۯ&gI͖@m6 a5!cq֍jdCuq@mqll&QL8jdC6B6bɆװAl ِ1A!1csLC9ԍCdxu/!4m6 xxHmqlnu!lِ1:qHmqls< kbkp {Xm0qlahal0ِ1xq6cɆahalHNgGo)~lِ1 G G6`GȆm6m6 G#jG@!&FnmbdC@N T6Ɇ mbdCsJ h8&)|}-~ZQs$^$;0OMQQUo.]<{~T}Ϗ91qXee,2v2nEZNYƢ,cіXeeeee,2v2o`hdlbjf^Qj?bSB[ RW <Q1lܛ R׳ <Q=1Z)V ue ZU6Ak\yF"n^jb'r#D쿅l#l|-m`!dC6Bl#l6B6Bcdc701 ǠcjǰcdCu6aȆfcjǰcdCc1cqя21 ǡjDZdC069c$K`$}\m8qlnuql8ِ1x8mW8mbOu31BE/ {PPl#l|%C6BP!cpFF(J6d n#U6N/y8!z=q8A6d S7;c$K`j'dCo'  !c^qBmF6ZqsJS6°0!cFFF6d o~#Lm# #2aFFqlN":㤰q8q8I6d 󼯻3ƨӎ:žq8I6d n$qRm$ql= mT8m G\Mpo~#\m#'2nmcdCF876±p!cmmcdswzo41"D݈u#Bm#ۈ 2nDmD`dCς#l#lh#Bm#ۈ$!{p&F mDmDbdCu#֍HHl#lF$mD )FF$qloabs)8R8m"2?s41F4߈Vۈ6ɆannigsZF4ِ1 hhl#l|N66qڍ˶1F mĐ ׍X7b6b!cFF C6d n#ڈQۈ6bɆ*m71bXh#Vm#ۈ%2?0UmĒ ۈ6b6bX!cpFF,qlt[E7N~il4ِ1s9ii!c^4EOm6N j3dNib6@g6`gȆX7Ψm6ΐ 8mQ8m!2q8q8K6noY}@60yuw~[wD^q.\<ɿϷu`oqA݁xro.A}/ᄍx*v~OEQ.zpQ}/zp犋pvp׃@=Ec^TE!c"qQm"qlԙq+l!ӆ0D6l6/m\6. \qImql%h%lِ1qImql$GLbq?.m\6. ׍˰n\V۸m\&2#.Ùel2ِ1xqڸq۸B6hb\q[3W]Jn4^Q۸m\!2qڸq۸B6d n qEm ql| qEm ql,p) 㪨Waݸq۸J6d n*qUm*qlUhUl*ِ1xݸ m\U۸m\#mV$ĸ&V%vMmql5h5lِ1xq 6aȆ{k5kucc&uN)6cɆ{q۸N6d yw^W۸m\'2סj6\03dgv(s@wnk \nP1y7y75q7|w׸Td >݀5MG a&M7߄}MM!c&nm6n 7a|Sm&qlMhMlCfb-R۸m"2o-lِ1xݸ-[-!cpdhlώ&mQ7núq[m6qlmhml6ِ1x|ͷ6ncɆmx䞬#M;hlِ1;;!c9Sm6 ߁6m6]\eb-q۸K6d n.qWm.ql]h]l.ِ1rڸq۸G6FgzY'ĸ'l܃6m6 `/zOmql=h=lِ1=h=l>٨{^wcMbNjdCHʈ'66cɆm܇6m6 jd~⌉@Su!c9Sm<6 Su!cpjd#|+㡰xxH6d S7a;hCl!ِ1CC!cpjGdcֺ(8㑰xxD6d o<#G#!c5#}xD6d nHml4nW&cы>cc!c3@3@m<6 ׍ǰn<6m<6Npx.}^}\m9l}{jϱdCs؋>Wxm<'2xxA6;& 1s  !c֍j/dCffPxm 2S^@/6^m8>l$LCmǍۺ?HDm/$˂?"0OmFv݁xrvvo.]31;ml0b_t Y7ޫm6ޓ a/^m=l|NyjﱍdC{h{l;A&o|!c~7>m|6> ׍n|Pm| 2H6 q&GqB jdCsG8|Tm|$2QaüZdCk؏G_d7xeb%ِ1SR ln_ja  Km/l[‹&'ы~'O'!cpOjOdCW?竟6>aȆ{O'OgqaȆߘgg!c$emgak{>m|6> a/Ym3lghgl XݦL/hl ِ1x_6`_Ȇm|6m|6 )_/j_64agv$p9 -c,c-cI,cI-c,c-c),c)-c,c-ci,ci-c,c-c,c-c,c-cY,cY-c,c-c9,c9-c,c-cy,cy-cX| zݍ-x׸.):[%boo1`K?1xKj:q \R'_o'pA5O ɆS> FBFB!c/ m$6  ]PߜPm#!l7Jm$THm$"RȅϜϜHm#lD.DjDdC{1\^L"DF"!c(Hm#lpnHp=jdCu#16cɆm$6m$6 )j$dcϼ˃<IDHF$F!cW咨m$6 I`Dm# l|NIm$QHm$%{l&Tԍn$UHm$%2ߧK钪m$6 IaTm#)l|NI m$UHm$#?ܷ+L`/Lm#lfacٻ*U dF2!cpɠdjɰddCu#Lm#lg/.\Hm$WHm$'2aHHN6d n#9\m#9lFrF 1ñH!l6Rm6R üOa#2"5#RE 51xHHC6UKbVZ#Xk4ji4dC0{Zݝ1%Fm# l|O+ i6`iȆ4F4FZICEӛiFZFZ!c֍jidC6Bi6biɆ-Bi6bFn:HuOuOHG6d SHm#213F:l#ِ1HHO6rH^?GzFz!cwӻwӫm6ғ HmWHm'2%@6ҫm62 '͔EDl^Cn4fPȀmd 2Ƞ@6d n#Am#lZh#Fl##=YMNd$Qm##ljdCgtAgTȈmd$2S2B62bF9ounbdr)nd"62aȆmd62md62 ׍LndRȄmd"2LjdE6!&FfneVȌmd&2ȬL6d n#3Ym#3l| ȬB6N \"ְY6Fl# ِ1,F,F!cpY,jY,dCk,F,FV1Μ)@1uJVNɪJ6d n#+Um#+l jYdC6BY6bF519%Smd6 mdSȆmd#2`Ȧ F6d >d6md6gh.pNɮn| amd6j"ȮnmdWȎm ʍ-U!l6rm6r w~wCm#lY[-Fl#ِ16Cm#l/K41r9%'Srm6r {96rb9ɆȩI6d ^7rB96rbFW ۍr11r^4Esm6r mRȅm"2Sr9%F.l#ِ1c\jd#Ӗ#ًŜ)6rcɆm6rm6r  mVȍm&2EsC6rcy&FQ7Gm#l|Sm6 y`Gm#lFh#Fl#/pOx lbu#/y6byɆm6m6 yaWm#/l|#/Wm#/ ٠_J@ߨm|m|C6d >|o66!277dCuho|dP&OSuJ>|F>!c֍|j|dC6A6aȆ{|F>|va_'|s< X Z Y\,c-cE,cE-cZƊYƊ[JXJZJYJ[XZY[ƾUUUUUUUU}oaie9&?ոy=4.m:5.?q5.?q5.5.?8ۚۚ_]jk\~Xk\~< cnMjdC~F!c m6 FjdIB31 Q֍jdCu 6 bɆ mjdC6 mp|U<+A׵̷uHđD!Bj"œK꼸ÁG ;0O )G}sTn]!x y!\\螿{ so. }X\\p=p!2_+Z .$B{,.Іچ Ql^8J&Fa G&nigs}DaFa!c3 3 m6 6 cɆFaF1yED(F"F!c"pFlِ1"F"F!cpE"jEdEEE6bEɆEFQl(ِ1FQFQ!cpEjEoF <]U71u[X7Ulߪm|m|K6d 6vߪm|m|K6d n[h[obdTf'01g:3bjŰbdCu6aȆF1X7m6 (mS(m'Knz41}pߢFql8ِ1FqFq!cpšjűdC%6m6JF-lِ1xݨF-ZF-!cZF-Zvs_|ٹ/^08j[ckgok`khkdklkbkjkfknkakikekmkckkkgko2222222222rKmq:L޹Tj{}_kW׸Td 3M5s656q| W׸Td V k\mu:d}eb{,uK:F!cododm6 ԁ{,u6`uȆ:F:F]Ks?71:ToK6lUۨm%2FR}_Wm.Ql7 {judC}s]hF]l88$ Mzb]m6 `\OmQlF=hF=lِ1RڨQۨO62&F}a>Q_m>QlfNajdCsJ}8Wۨm'2SC6c Fݘq ľ}K@mрlj dCg6g6Phm4 2hhH6qjb4u! 6b ɆaFg 4QZ dC딆pPm!ѐlhm4Thm4"h$F#X7m46 `HmшlFFjFdCuHmјl,K61Pn~CFcl1ِ1x6cɆưhhL6d n1Xm1фl[Y`&F14sJ&F!c֍&jM&dC&pDm фl|hhJ6;~wT)MTm)єlFShFSl)ِ1FSFS!c~)Tm)ьl\~?eQ&F3Q7LmьlF3hF3lِ1fF3fF3!c9Lmќl߾B1&Fsa9\m9ќlFshFsl9ِ1FsFs!cp͡jͱd_+ 31Z-j-dC-F F !c5l mhA6d o6Zm6Zoӧ޳uRh mThm$2G%|GFKl%ِ1%\öThm$27ZB-6ZbljMVVVjVdCu6ZaȆVpNi hE6d ^7ZA6ZaɆ/sJkFk!cwZC6Zcm(/mk؞цllYFm цlFhFl ِ16F6F!c9 Fm іlT=:4h 7ڪm6ڒ h mUhm%2hhK6d Ni mUhm#~{}9~ιgn6ۑ fu;vF;!cpvjvdCF;oShm#27A6aFibF{oWhm'2hhO6d ^7ú^m=ўlhmWhom4oۺ"~0O.mpvVw7O.Ϸu?{AMN+2 -:}׃te vvt 2`=׃$B=fhFl#HjsLb+CGFG!c$enGaku;mt6: ?{wTmt$2#:B6:bƙkbt6:A6:aȆtI:mt6: mtRmt"2Njdc>LbmM;mt6: aYm3љl|N jdCu3Ym3хltWz&Fa Em хlFhFl ِ1s.9I.F!c袶J6ZhbthW؋vUmt%2EqtQܓ&_mt%2]a誶J6d ^7B]6bUV.61 ֍njݰndCu6aȆmt6mt6 wv6mt6 aŪ-51\\mt6 ##]m;ѝlFwhFwl;ِ1FwF1׫LbNj=dCpCmуlFhFlِ1衶I6oK=FOFO!cz³zm6z a{5lOFO!c^'Sm݆| |0?3;zYmckgo`hd262626262egp/Qі1q Iɖ)azQ{(Wש{58K]z׋jk\/Xzk\/\zQ1 ָ^ 3n21z jdCkpM[m7ћlFohFol7ِ1FoF1o!&FQ>F!c}6`}Ȇm6m6 ׍>F>F_Qz`5&F_ }6b}ɆF_X7m6  mUm%2_o6m6$ҕ_kbSm#27~F?lِ1g&6aȆm6m6 U&FQ7ú_m?џl<@mc1ln uclcِ1>O7@mc1l|/f1@mc1l>v&cX 딁jdC6B6bɆm 6m 6 m Tm "Y߭ab  Rm "2E^t lcِ1A A !c~c1Hmc#p@-&ƏnƏj?b? ak6~6~$2#ƏƏdCƏƏj?baib vn &R 㕬6cɆpN1L6d nc01Xmc01l`hc`lc]ŷCD!!cpC!jC!dC!p2Dmc1l|Nm Qm %E\mb 6BC6bCɆ1J6d ^7º1Tmc(1ln 6m 6G+ؚYY6aȆm 6m 6 m Sm #21 1nOۺ w~'"œ'u^}7Ovk8 ?Oo.]<ۺ=I}g翼Op.Cgwg\~/cz3?@gX~V׃IL dgd#]Lᢏ+pp!cwφwφm 6 m Wm '21C6c#nB?#!c1֍j#dC6F@#6F`#Ȇ/dh5m 01~6~6~Qlnppذ=Eml!c/Eml!cp@mm$3"66kbHoTm$2#a1I6d }$|>Rmc$1l}H(шc1 1 E6d nc1Jmc1l|NQjQdC6FA6FaFjo?`bsh8Vm&2 ;Gm6F )2Zmc41l mVm!q9db6@c6`cȆm6ƨm6Ɛ mQm!2%@6ƨm6ƒacxGx,|GxXlc,ِ1ձXX!cooǪm6ƒ ׍X8ѩj1&8Q71Nmc1l8hc8lcِ1x16aȆm6Ʃm6Ɠ ǿ+/xX7ƫm6Ɠ mWm'2S9exlc<ِ1xqcM-GM nLuclcِ1:e\LPۘmL 2`ݘ1ۘ@6d g>ژ1ۘH61caݘ1ۘH6d DDD!cpcDlc"ِ1v"1Qmc"1lIBMI$hc$lcِ1xݘ$I$!ci16m1 ۘD6d >L6&mL6&Rk{01& jdCuc26&cɆaFcg ߳twNbhmL6& ׍dGSݛ41wvwvmL6 oLS6`SȆalvp;gީ1ۘB6d y?fbuc>6cɆ-}jdC·Wۘm'21ژ1X@6G9s톉@ԍn,PXm, 2E^tlcِ1!cp j d´}g2133m,6 Xm,TXm,$2y!|yBlc!ِ1S j Ed}{; 119) Edsjj!c}p_tjlc5ِ1XXC6Wql™kDX5!cb8l]I16`kȆm6֨m6֐ ׍55Z=Y?kųYZZ!c}ѵp_tZlc-ِ1xk6bkɆm6֪m6֑qk6DX:u:!c~3F~5}Ckcl:hc:lcِ1:uz}K}61֋~c=7֫m6֓ a^mc=lj뱍dC06r8c8l6maO0,xlmmyXƶXƶZ<-c^m1ov˘elelele2gXXZY[XZY[ƎX-cGs|䵁j\Ojf+ue`lIŻ;@,Yz^œ{)G+ *^Sgyq4mP׮ x^H_6'|B%txgu#|guoF26ymFpNQ6|Ȇ7|چC6d nQ6|Ȇ om`;d=W5jb6v@;6v`;ȆaFgg wzW16v`;Ȇm6vm6v ءI6_E6c vm6v aw5NN!cpcNlc'ِ1x/;6vbG-ab6vA6vaȆ]إ E6d ^7vKmcl.hc.l×l!+_8mbdC6| _ _l×lnº᫶m pqw_aWm#tjnO66 ?!cp~ІچG6d nS6ȆmA~j~؆?85yM aW6Ɇ7چ?O6d nW6Ɇ8mcrcKgbnn!c֍jdC6vC6vcɆ7vj hF@6d n#P6Ȇum`dCu#֍lcp< T#X7m6 mQ؃m!2>O٣C6d <"lc/٠.&^o^^!cp{j{dCpH ѯĥ&*^lc/ِ1F^? dWmc/ll|8k'}pN٧G6d gS؇m#27m6 lq}3oH6aF^519e?Sm6 ׍nW؏m'2E^t~lc?ِ1ȆB~.$nq{_ :6zoE0Ots~tIk;0O.8w\<co&逹qNq\=6[qC+¹ }׃T;8Ar czpփjq=8H"d"F#q8D6>Y}I㐰q8q8D6d Gppذ !C!!cpCjCdC7Wm61#rQ8,l6m6 w6cɆ{ðahal٨VęeL##8q8B6d ~x#!c}#8q8B6dԴDN@6m6s_L@ 6ljF ِ1x@@l#l|N sJF H6d ~a m%!=;F71:(ٰPpTm(qlIY:J6lQl(ِ1r)G6bGɆ産Qvs_|I/lYA9-c!c㖱P Xee,2aEYƢ-c1XiY9Xee,2v2v2v2v2v2v2v2v1_ qVu Ap>H]p 'c$eۀAwփ5.׸ q2k\qATd >qAx &%ܛ5 `a``l#l|M TjF0ِ1xo {``l#l| 66~w*!b!j!Fِ1xl#l|MT!j!Fِ1h#Dm#8F6ζ蓡SU㘰q 8q 8F6d ^7qLmql1h1lِ1r 8q 8N6\,򱚉q\{16cɆqX7m6 8mW8m'2ݺqF(J{&F8;(m ׍PX7B6BP!cpFF(J6d ;2FF(qlKݚ& 1s  !cq֍j'dC{1'^  !cp'j'0qkL0nF6Jn/<$Lm# #2( _m 66°0!cpaFFqlxhV:&IqoT8m$2'a8q8I6d = װ'6Nb'Ɇ)'j'p1t܄-%bN sJF8N6d o~#\m#'27am S¡ppl#l8obD`FA6d n#ڈPۈ6"ȆmD@jFِ1mDmD`dG641";HHl#l|NsJF$I6d n#ڈTۈ6"ɆHh#Rm#8E68Nhlb6NA6NaȆm6Nm6N 8mR8m"2SNA6NaQdcr=611D((l#l (xHFE6d N((l#lnDAQjQF4٨GSݛb )jF4ِ1x hhl#lnDúmD FCjF Hyi-L19%Fm#ۈ!2SbmĐ ۈ6b6b!cmĨm`d#}GK#VԍXX7b6bX!c9%)jF,ِ1 XXl#l߈6b6bdcimbNgm6NcɆiX7Nm6N ׍ӰnV8m&2j6y17_mX-ΨE0Oŧuq~[wQ;8cw`.? gwbOyqtϨ\=6ū bq?ΪY\ݗ1x=8 Y%2 ? ϪE,1x=8 mU8m#rO]xv>C;q8G6d fS8m#2QacȌf*9lِ1~9h9l#l`bĉFFG6d c3Nm#ۈ#2#`mđ ,A&m'}^1q޹0'W726cɆab8lܺZ籍dCsy8W8m'2߷8mW8mēRbbċi<66ⱍx!c~#jF<ِ1xh#^m#ۈ'27⡍xxl_ĸa~03lِ1̜a !c9S.m\6.  jdcsv71.~"7.m\6. aqQm"qlEhEl"ِ1xqڸq۸D6F5\&YOs/|{l: {Qrq ۸D6d |NrImql%h%lِ1r ڸq ۸L6 ĸ,eX7.m\6. zs]V۸m\&2q(*m! wR-V(Z)RK^ M@@Ǟ9뾾w띫ys_fzlP۸m 2qڸq۸I6qSظ mT۸m$27a߸q۸I6d >ބMM!c$7j7[d`/ڙ>ܧR۸m"2ߧ܂[jC6nA6naȆs ڸq #c|k}|L0q= {S6Ȇה0maadCLJ6°0!c5% S6n t41n jdC}66ncɆ߆wnm6n _ mV۸m>5>0ߎov[qRkݳ[j,Zi=[jO,ZR{nE[j/,+K-R{mb-;KRhYj,ϖÄS~N)\q_m>ql|MmW۸m< wޚ@xmOp?xJ7f=pT}~ξģp|v@kSVWxm<'2xxN6d 7þ\m9lsF4٨IFE4nmD _W6h!c FF4M6d 766d#=& 1  !c 7}xA6d 7^Bml h l%ٸS8/axxI6d kKK!cp/j/dC6^B/6^bew}ob6^A6^aȆ_m6^ xmRxm"2 x ۈ!mͼd#֔Ĩm`1dC6bl#lF mĐ Sbl5qqv&k7^þZm5l|My הjdC׾^k_6^cɆ߃x mVxm!vnJ1x#o7ިm6ސ 7oQxm!2xxC6d 6ިm6bƆa'M51bŚ הXXl#lyX}!cpjdC6>@6>`Ȇhl#u=sLbgяjdCpcD? яjdC6>B6>bɆm|6>m|6}j'FqjqFِ18x-Nm#ۈ#2mĩmaqdC6⠍88l㓘E?Y'lِ1mWH3mobhm|6> m|Rm|"2 L6ֻbY̢,Ym3l|S>m|6>  m|Vm|&2~6>m|}߇xķ\,f[jey[j>ZBKRKd%,5K-RKf%RXj)-K-RKeXji-tZ~/qYkFթsbzYxⅠ޿s?'!ㅸ'{/:qB<x!}1` A=?׿dQ-.219~m6 C_m#>lF|h#F|l#>ِ1;2j AW.HgQD_J?X lÅl16lvQp6\Ȇ .j.؆ ِ1mm` FD /319Am$6 _K%PHm$ 2/ LH@6d 7@ 6m8^r%^eZ8߭s%Ը.L]"\"]=x[Ojv%ֹUU}]gܛֹs>箸9۠!+ =71G9M}p?p/c}tv91 ^sM |ZnϘnІچN6r\aU&s0#N6%QW w wlÝl|pkچ;N6d >G9]mp'2mmcd#zV!G㡶mx 6<6< !c\I<6< !cP6<Žߥ01<Ś O OlÓl|Mkچ'I6d ][][O OlÓl|6<6< /1Qh^&^oxmxa^dC6 / /lËl|MkچE6d ޥ᥶mx ,^{So7V6Ɇ߭AymxcdCk7\S6 o!c mxmxc>fo)L ~/' Q6|.U7|6| _1 hGm1;W>Іچlu&FB1o$FBFB!c5%!\Sm$6 ) ᚒPm#!l|H%6y4{+ _8ombdC} _ _l×lo¾᫶m )Іچ/ll׸6#7y#F"l#ِ16aȆ'm$6 Hm$RHm$&I&Fb$kJbFb!cjdC6C6cɆFb؆ٸr{;M ?5Om#2mma~dC76 ?!cp~ІچO6~/?j؆?ِ1s  lßloþ᯶m 66$dUS~wIDHF$F!c$jI$dCh8&QHm$!2$F$FRR{Mo$}#FRl#)ِ1HlFjIdC& A&UHm$%2&6m$6)Y|DHF2dF2!c5%\Sm$6 ༑Lm#l| H HN6֕)Fra#9\m#9lYYjɱdC6C6cɆMm$WHm =~B))Bm#l|Hj)dCh 8PHm 2ES@)6R`)Fe =lb׾Rk_)6Rb)Ɇ-H -HHI6d 7R¾Rm#%l|H mTHmom O S6!cFF@6d 7l#lus\31ż@@l#l{!{jF ِ1x}#Pm#$2mmbȝeF=nb}#6RaȆTpH HE6d ~}#Jm#l|MImRHm&:;#owSKz<]˘Zm#5lfaOM Fj!cjdC6RC6RciȆWE-21҈4ji4dCF8oQHm!2i`HHC6d &Fm#݆嘴湯7ӪE0w_v$n΃=IZvK_tu곟~sttg PC/؛{t곟tte >GsD:t#2_+A"~D|HmSHm' d[>W{_6cɆ&b^m#=l|H׊j鱍dC6C6m8Y|mǷ8,2Xj-LZjeԲXjY-lZvK-ReXjy-|Z~KVR+dԊXjE-bZqKVR+e|%z\)w7NAb _D=N u =.zߟ O{\qAd ~/ u _05~lӋ&FXm >:Xm#&2lm FF0l,U%#6^͠@6d 72Am#l|6g j dCf3@62`,bbd$v>#[wQm##l|O2md62 )ᚒQm##lFFh#FFl#p L[&LF&!coLjLdC}#62aȆLF&LFxִ\&FK ʻ dQ6BȆm@!j!Fِ1h#Dm#!27Bl#l7LP7BaU6BɆהPmbdC6BPPl#lٳPh#Tm#L6_*-#ӆ٧d&62cɆmd62md62  mdVȌmd&2j,dx3.Y>% ܧdQȂmd!22 |2Fl# ِ1,F,F!cy# Em# l|{?7lVao6m6 UE YFlِ1uv m6 (mP(m 2ThFl 70gpa(Q(H6d O))6 bɆm6 m6 FAv w떘[WDQH-]9n][څ {_ܥRBoݺBRBsIqb ¢0}? Ga¸&2nQ(Q$BFaF1|ʮ^L"nm6 ?G"F!c$E}"jE"dC-@E6`EɆMboZMm6 oU(m%2Ea(Q(J6d >G6m6 Uj419b!Dm6 (mS(m#2Q (Q (F6d 6m6SK￘żQ6cɆ[-m6 )R\m8Qlo6m6Jie(73%Ȇ|_K[PBmQl|oZMKm6J oP(m 2Q(Q(I6-Y,~()捒p(Q(I6d kJIFI!cp%j%dCkJIhFIlH|0XSJ5F)lِ1x(F)RF)!c5\SJm6J (mR(m&7;QZ( mV(m&2a(Q(M6d ~4YZm4Ql|M) mV(m>5}a(cGYKVR`U*Yj-*ZUKVRa}gմjYj-:Z]KVRk`5Yj-&ZSKRkaZYSzܒToer7Ne2~_u+{\q2qe`+qep+C=NQ8Q2Ǖ'cWF,hwyeFYFY!cpejedCy( PVm,Ql|+ mU(m#YZQN=U9rF9!cp堍rj對rdCss987S(m#2A6a{2'11 塍j屍dC{pOU^mVh*F!c琪@U6`U8UFUFU!cUlWUFU!cUjUdC7BU6bF.ǧ01Q jjհjdC}6aȆF57mT6 ՠjjհd#<OUA?U]m:Qlf5{<6cɆVEmT6 )աjձdBVgMbMהj5dC{p[CmQl|Mהj5dCkJ hF l;1'xjީM3gSln"z;ﰍȆ)}wjaߑ a/Nm;l&hzҚ5żQ56jb5ɆFM7jm6j 5QSm&QloԄ6jmԴpU˼[wмn]-1)"jE{n]-Tj{_ِ1zg}F}!cG}8Wۨm'2K}hF}lcS)YLFhFlِ1FF!cYEm46 ) j dcX| d31y!7m46 ) Pm!ѐlFChFCl!ِ1,hhD6$msbv^ ohD6d nHmшlF#hF#lِ1FF#FFcvlZށ9MƢo4}Fcl1ِ1FcFc!cy17m46 )j&doKM&F&F!cpM&jM&dC6@M6`MȆFhFl))K<&FSuQc)ٰXtSFS!cpMjMdC{ئpTm)єl{ShFSl٨O/LS}J3fF3!c}J3Oi hF6d nLmьlo46m46 ] ͝kTsa/yͼFsl9ِ1FsFs!cY9Em46 _jm4Whm KnBoPhm 2_SZ5F lِ1xhF F !chhI6=_g&FKkkI6lmhI6d 7Z¾Rm%ђl|m gіj-dC6ZB-6ZbF[>ܧRhm"2 h hE6d 7ZJmъl|MimRhe>ô|ǣRkg:Xj[j-NZgKRfuzXj=-^ZoKRgXj-A`Km6Rf` FXӚz\(}9vVW>ZZךzߑi ߑiqqkM=N=5q=5q|k {\kuk׿6d_FmFm цl|nn6jm6dC6@m6`mȆ׿6F6F[qGKmXﱶUhm%2͝16lʵUhm%2hhK6d ~}-Vm-юl4#jXi`hhG6d 7NmюlF;hF;lِ1hhO6 ;-kb6C6cɆammQD_Jf&F{l=ِ1F{F{!c5=^m=сl|8đr&F6:`Ȇ~Flِ1ZLF!c5Am=8C"+ C߫m|m|O6d 7Z:c8l>]llo|jcߓ ^m{l#񌭉QmtTmt$2_#|_FGl#ِ1FGFG!cpj6/yu2օۚ9߭Nj"]=w:۫]:{{n]'x;~'7fu9>p?L<5T5:3ZݱdCkJwtWmt'2_SC6c=cbkJPm 2ߛ{j=dCkJPm 2衶I6V;2S􍞰oTm$2E{YFOl'ِ1FOFO!cg{B=6zbFcO71z ^j^dCF/8oRm"2 襶 E6d >6zm6zc541z?gϋT%(xG(Fٗ1=Q(Q"2n? 1 Q$B`1Jmc1l[}MjdC菆Vm&2h4|hhlc4ِ1^i41Zmc41l!^cc`1C6d WJc6`cȆm6ƨm6Ɛ 11Xw)LııjcdCpcdö1K6d kXX!ckcjcqdҎWqq8q8!c1qj㰍qdC6A6aȆ8hc8lc<۠!&xkxx!c5lxx!c5e<\Sƫm6Ɠ xq&&ac1Amc1lxblcِ1u  !c1ژ1ۘH6fQ&DLkDD!cpjdC6&B6&bɆߑmLTۘmL" p|DĘ$$7&mL6& ?> >>Imc1l|MהIjIdCk$hc$lc2HV&Mdhcdlc2ِ1,:΢6&cɆalvp0_&dlc2ِ12ژ1ۘB6n;)`bLALALQۘmL!2_S5elc ِ12)S6`SȆhcl'|fߍ11~}'7~R lOOj?a? )?5'Ȇm1lt1Uؘ mLUۘmL%2_S5eTlc*ِ1xߘ TT!c5e*1Umc*1ld3֬&4ac1Mmc1loL}c4lcِ1i4i4!c5e1Mmc1lD;~!m1]a=tt!c}jӱdC6C6cɆmL6mL6fmM^g1CoPۘm 23`ߘ1ۘA6d >ò  !c5e1Cmc1l q<&<.<.ٸ%&|7þ1_mc>1l|MהjdC6C6cɆ)j6/bI cp B/jE9u݁9ǿ}W_g7f><8:翨/,s޲_%z g ,`,PX!c j d#Cܛ MG+_c!0Oȗm,6 hq_YXH6d BBB!cp j _Í!G/21~{_W__ɆƯo++ِ1__6~6~%2ߛ m+lm]n%&"b"ʻ dXXD6d ."."E"!c"8e,RXm,"2XXL6z&}RcaXXL6d 7þXmc1lbhcblc1ِ1ubvlv~EmǷ8XϱR[f-~VXj+-UjKmR[g6Xj-MfKmRRfmvXj;-?,]nKmRgXz\[rXn8{YxP3"%%d ;c},Q%-'c=ZqKp[B=Ns㖨{-%_w&Rqm)Tmc)l|[ ׿jKdCR-UXm,%2BK6bƞ̉}41 ˠej˰edC//SXm,#2 X XF6d 7A6aƈ%7^mb,sr87/WXm,'2aXXN6d nc9\mc9lrhcrl7QarkL߄ߠ6~6~#27oja _ ^Mm7l7!cpAmm %4XX!l6Vm6V  na{i lcِ1xX  !c{+j+dg'`b6VB+6Vb+ɆהpMYXI6d OY )+6Vb+Ɇ獕J*1}ۼ7U*U*!cVVm6V XmRXm"2Ujdq!yfcXXM6d jjj!cpjdC{j0Qέ&]k6`kȆה5pMYXC6d >o5!cYt Fmc l^ckaXXK6d 7¾Vmc-l|S֪m6֒ )kjkudcKMuo}c:lcِ1u:u:!cuj밍udCk:hc:lc=xqʝ&zac=^mc=l|]gj뱍dC6C6cɆהz  !cp j dCklP؀ml 2 jdٰ[616 jdC66B66bɆml66ml66 _mlT؈ml"XImlR؄ml"2f ^3ߤ D6d 66aȆgM&Mf1q7xYYmc3l| gjdCf8olV،ml&276C66c1֪E-olQ؂ml!2_S5elc ِ1)[6`[Ȇml6ml6OG=9hbl7[Ɇ}m׾ml6 olU؊ml%27B8^ݼ[WOnw~'G~W.߃n΃v%'gw7f9]}`w&mpئ>p?Fg_k6`6Ϙ۠mjp?F"d Vl6ml6Mr#CvagخN6d \v\vv!cpۡj۱dC6C6c;ȆMbgj;dCs8GP؁m 2#v9blcِ1ءI6., cx`'|`Nlc'ِ1ѝdFtNlc'ِ1c'T؉m$2nةlxC?`Cml!cmmA6d 7}??Ȇmml4*&.....].!cw vw vm6v mR؅m"2.hc.lc7гcaحM6d 7vþ[mc7l| gjdCvC6vc{ыN=kb߇Gmcl]=]=j{=dC8oQ؃m!2_S@{6`{ꂧS؇m#2͝16ڮ>fF,؇m#2اG6d mS؇m'yg }/l6m6 oW؏m'27yc~lc?ِ1~q@q@mqlx}lِ1q6`Ȇ)j6߇>0ߎov|㐥vR;bԎYjZj-,IK픥vR;cYj- EK풥vRb]ԮYj-,MK향fݶ| ]ܸj {AR1w= q== 8a;qwlЯ^71 CjCdC6A6aȆm6m6 FCjd\2010m6 8 mV8m&2S{jdCbC6cGȆ{dib}G6`GȆg>g>q8B6d 7qDmql|M9mQ8m%'98*l6m6 oU8m%2Ga8q8J6d ~}(qTm(qlL;oqL8mS8m#2q 8q 8F6d nqLmqlo6m6$E;&ƟbmmI6d 4qpظ!l:ݟ:ݟjb SmOl8HyLl{&q7þq\m8qlo}ql8ِ1q6cɆm6m6"7&uob%_oِ166"2']<=Wph_pِܾ1/h/dcq~yhb6N@'6N`'Ȇ??q8A6d >o  !cq8q8I6=kZTqR9 T8m$2Þ{ؓj'dC6NB'6Nb'Ɇ)'j'SdG&)7NqJmqlo})lِ1b^M S)!cq 8qnݺݺ4Ema~}oj{{/h[}}spovpOusi:DLe4g4|< gjq?8Md J9c8DBq$B3ihil =SL3νi _ 0;uΨm6ΐ ?Cr>CrFm ql|83jg3dCshl,(ұB&YNYNYY!c9,#Ϊm6Β _: iU8m%2gjgsdc@߫I^;DqNmqlssj簍sdC}6aȆgs9syqҊ;^żq6cɆp8q8O6d nǽ11.$}jdC%vQm"qlo\}El"ِ1rڸq۸D6|sN_ĸ$fKpq ۸D6d 7Fٰq ۸D6d nqImql%h%l28?Ua߸q۸L6d >o\ee!cpjdC6.C6.cWƜߖ21W+jW+dC6@W6`WȆWl ِ1,zڸq۸J6Ϥ8㪰qڸq۸J6d ~}*qUm*ql| gѫjWdC7BW6bFUUr}61 נkjװkdC\S۸m\#2_S55lِ1k5kux(ua:q]m:ql|MהjױdC}:6cɆu?dcw.&???j` 16LochmmC6d 7}Ȇ66n.{ p51nqj7dC7n76n`7Ȇm܀6nm6n )7j7d#kn&Mq}&qSm&qlfMiasSm&qlMhMl&ِ1uћM-*V&-7nqKmql|r Snm6n ۸mR۸m"20e s21„0h#Lm# #2mmaadC700l#l|66°dc5Vz,z΢6ncɆ)>ml6ِ1>6ܧV۸m&2ߧ܆6nmܶ}߇ |㎥vRgݷXj-K-R{d=ԞXjO-(K홥R^Xj/-WZR{cZjo-w{K탥R>Yj-߇  ͟Sx"qDžS1x =.\q 'cg[᳭{\88p=.wȆ [_Xlِ1ltFw6`wȆ׿;pq۸C6d nqGmql5oϜMbn jwdC6Bw6bwɆpnq۸K6d >7߅6m6)719Ȇ={=!c5\Sm6 ۸mS۸m#2sڸq۸O6j3&}1o܇}}!ck5jdCk}W۸m'2sڸqnnHzn(Zsp^u`xv߃w@}Ͼ97;ws@}~VjKa=3C8c>TGD9"Rm#ۈ$2G?mD Hh#Rm#xD6Bx$ޭ{߭{xD6d nHmlo<}#lِ1xxmoDAQjQ3>Mg>3x3lِ1}g>3g3!c gjϰgdCk3h3l9ؿ8U[L5żDl^xN6d sss!c$jϱdC6C6cdct 51E߈}#Zm#ۈ&27mD h76h!c5%ڈVۈ6^ dbb 8Pxm 2.aКܳ~Ckl h lِ1 K}YMKhKl%ِ1/6^b/Ɇgїp}xI6d n%Rm%lrD&+aJmlfMiG~Cklo}+lِ1JmC6f6LĈSbl#l^[ mĐ Ϣ1pQۈ6bȆF m&O;%ZװoVxm&2^xxM6d 7^þZm5l|xxC6 kA㍰xxC6d >o7!cy 7ިm6ސ )o7joXA_kbĊ=l,ƪmbdCkJ,\Sb6bX!c5%)jF,ِ1kBj[71ފy-7ުm6ޒ _x oUxm%2oaxxK6d >o6ުm6ޑN3.hb}6aȆהwpMyxG6d >o;w;!cxxO6^^m=l|MyהjﱍdCk{Wxm'2{"ZqELo|}lِ1x!cjdChl#٠+pLGhGl#ِ1xGG!cpjdCpGFxuM8a#ڈSۈ6ȆoqjqFِ1ה88l#lgKFF݆O杤%浠$}S'Ov'spvw>I}?Ͼ97;x<;I9>p?Le[d b gg:2_+>õg>ϰ|Vg!cghg w_6ݗۗ^asķ\,f[jey[j>ZBKRKd%,5K-RKf%RXj)-K-RKeXji-tZ~/q?sʯ E߾s?'!ㅺ'qBQϩc/?1</z_9u z'qBQϩc/>٘C&F|a#>_m#>lfnqobhm6 ۈmWۈm'2~3_m#>B6jR. .m} lÅloᢶm _w E]6\ !c ᢶm$ IF< }tF!co B)Fl#ِ1ܜ  6` Ȇal8c8lLLV>F؆+ٸZyM W7\apUp6\Ɇ+j؆+ِ1ڮ}mW WlÕlig8^y#lmbndcô"n|njn؆ِ1`Pt/Mm p#2mmandC6ܠ 7 7lÝlW#j&ӆyXԝl2wWp6Ɇ=nچ;N6d 5]mp'2_S⮶mx61<ļ  lÃl|چA6d >zYCm 2~3E=6< Obbxwr=C;j؆'ِ1I6lcچ'I6d ][P][O OlÓl| mxmxb^dc7L /7`R6Ȇ^j^؆ِ1 /x}Km "27᥶mx^<116;dy[m&2͝16l"V6ɆmxCj؆7ِ1 چ7C6 ;>*`bچC6d {X lÇl|MkچC6d @>j>FBp FBFB!c=lKg $M FB!c16ƽ?u\obhm$6 ) ᚒPm#!K6†/᫶m  _7|6| _!c2u16t[xrLobhmbdC} _ _l#1ULDF"h#F"l#ِ1,΢6aȆaFYg }HD6d c3F-me#aHHN6d n#9\m#9lo$}#Frl#9ِ1,HHA6m+p{#)`HHA6d lO lO F !cxI,mb8ltw716R`)ȆהF vRK^_߭K 'Дj)"]=~+%)R{{wRٿS?\{SϾ97u)9O>)q?s=`%N^>ٗ1x? @ r cZq3CDU^jZFFH68RnCg#PpT6Ɇƙ@ag6@!c16W-zeM @l#l|66Td/7jbϏϏRHm"21S#F*l#ِ1=g;~*716RaȆA H HM6 NH-l6Rm6R ԰oVHm&216ָ~hMobhm6R MSC6RciF۵~H#i4Fl# ِ1xHF4F!cgvgvҨm6Ґ )i4jid#ތ21ҊjidC0[8c8l|Ck#-lZZx-FZl#-ِ1FZF:qH'F:7ҩm6ґ toSHm#24|4F:l#ِ1HHO6&ܸc_#}(}Eӫm6ғ 1wR2Ck#=lFzh#Fzl#=ِ16=^m#݆0׾>0v|#`K-RdXjZfK-RferXj9-\ZnK-Rg Xj-BZaKVR+fJXj%-RZiaX])s b൘ u =.z {\qAd ` R エ| =.HL6#8n]p(ݺ``l#lF0m 66`!c9V62^2tdbd362`Ȇ pnΠ@6d n#Am#l|6mdPȀmd$̙xѹ2݌dO62bɆFF72md62 Qm##lnFh#FFl#hاCMLb 3md62 L~$әi:)Npwwww`݂wX }擗>k=º_m#>lF|h#F|l#>ِ1ڈH@6]LZZj dC''PHm$ 2S9%Fl#ِ1x/HHH6n]MbSm$6 ׍n$THm$$2 aHHH6d ^7B 6bdcAzMpϜb6eq{/6±p!c~#jF8ِ1ὃ6±p!cmmcFSN=LDbSm$6 )Hm#lF"h#F"l#ِ1xHm$RHm$&o-IpXH m$VHm$&2HHL6d o$FbFb!cpj$d؋#61猓猓m$6 I`Dm# ln$u#Fl# ِ1Fh#Fl#)P(wҾ&FRы&hRFR!c~#)7m$6 ׍n$UHm$%2IjIdd31dp#F2l#ِ1xHF2dF2!cpɠdjɰddCNm$SHm$'yW5 01֍jɱdCFro$WHm$'2HHN6d n#9\m#9lнVMM{j)dC6R@)6R`)Ȇm6Rm6R )j)dc )E/)6Rb)ɆHHI6d n#%Rm#%ln6Rmp.\[wE^[?Eda ?dw`[OZm#5loSC6Rciƅ[eb6@i6`iȆm6Ҩm6Ґ i{Zi6`iȆFh#Fl#-٘ջMikӪm6Ғ )iᜒVm#-lnu#FZl#-ِ1#-Vm#-lԡLtbO+JHG6d ^7Nm#lF:h#F:l#ِ1xHmSHm'x#gmj^뗞ldjl~6cɆ#=|j鱍dChz؋WHm'2_6ҫm62S&;1 Ƞ@6d >dsJ F!cp j dCu#Am#l,/hBI&FFO0wH6;H˨H6d c'cvCFFF!c9%#S2md62 f'#Qm##l)&F&Q7Om#l{|j|dCF>oSȇm#2w>mE |F~8z+MF~h#F~l#?ِ1~~_m#?l|NjdC ?plsRM*lWȏm ?m  Ymb֡'"mP(m 2S 9Flِ1̞AbCkQly w2aFl ٠gQPaQPm QlnuFAl ِ1x(FAFA!c5<1i'mT(h\U\[窘#ںBp&)Q.]+kD!BvY<f!/d?U"g97/RBsJ/zEQ_׃te >W 091xY" zPDfQFaFǵ6E)SQ(m!2_"jE"dCsE8WQ(m!2F|Fl(KY7EEQE6bEɆ;΢jEdC6BE6bEɆ_^(Q(F61~>6aȆF1X7m6 i]F1bF1!ca6m6c~3(.FqX7m6 (mW(m'2a(Q(N6d ^7C6c%FBn71J~7Jm6J ?OR>ORBmQlF hF lِ1h(Q(I6}&FIQ7JºQRm$Ql|RSJm6J ( mT(m$2SJB%6JbƹEo"21JmRd+iR(m"2#Zl؈R(m"27J~F)lِ1R (Q (M6TK?lQZԍҰnV(m&27J~Fil4ِ1䖆[Zm4Ql| [(Q(C6j{Ke5e5e6`eȆ' |2je2dCsJ8Q(m!2e2jed#|{ežhY/ZVm,QlnuFYl,ِ1hY/ZVm,Ql- mU(m#[T6mTgw05,iemcյճշ55555555uuuuuuuոJ߭=dN5Dk\ uk\ q2ípkk\ \jP1xk\ uk\ q2_SՀ5_M=Ĩ)lԄ6jm6j 5WSm&QlFMhFMl&ِ1xoTڨQnùȫGskjnZD-spxm]-X#jԲ;0`yfϵuUg웃Fxy-9Am:糓9bo[mٯAm:2ߛ fk691x= Amڸ&2j:d01utXm6 u`QۨC6d o_Qۨm!2_+Ձ6m6"Fa~IuĈ6"HHl#lnDºmD ׍HX7"6"H!c mDmDbu\랼mbsJ]8Uۨm%2ku [[Wm.QluaQWm.QlF]hF]lXwMzbQ?m6 ?G=zF=!cQ֍zjzdC6A6aFG{LF}hF}l>ِ152526cɆmԇ6m6 jd#G*˷>01 j dCFo4Phm4 2]bj dCu@mѐl #XCx/j dCyhPm!ѐlhj dC6B 6b ǘDhF#FF#!c5l#mhD6d mװ6aȆFF#FFc1=uüֽ1pNIjdC0h'c6ߍ6cɆưhhL6d ^7C6cMF~۰3h7m46 SuJ&F!cpM&jM&dC6@M6`M=h&<`Zex-mhJ6d ~MnSxMnSFS!c^)Em46 )MjMfdLVG41ylьlF3lِ1xhF3fF3!c37gn hF6d ^7A6aƤ43Veh.zmhN6d ӋVplwLE Fs!c99Sm46 hm4Whm 5n&F aBmтlF%O Ʊ|Um}416Z`-ȆF X7Zm6Z hmPhm$h)zіmhI6d }Thm$2hhI6d n%Rm%ъl-"oMVhVjVdCF+oRhm"2 h hE6d nJmњl,vnh-FkX7Zm6Z _^Zm5њlh jdC6ZC6ZcmFEw=mDhF6F!c9 Sڨm6ڐ hmQhm!2hhK6UP(V~-|F[F[!cpmjmdC6Bm6bmɆ7Bm6bлk턍vF;vF;!c~7کm6ڑ hmShm#2hhO6l.a?hhO6d oF{F{!cpjdCם6ګm6:Aot6:`Ȇmt6:mt6: mtPmt 27:@6:`Fm'EFGFG!c9#S:mt6: mtTmt$2訶nù8&)&\vRdaNv<<皤Ng웃<$u缓w3C]bu3g3tAg\:iu{Z":zЙD mtVmt!#3{".袶B6d n Em хlFhFl ِ1}_@]6`]F)7]FWFW!c} ۭmt6 ֯+Imt6 ׍FWF7gͳn^׍lW'mt6 ׍nntSmt#21F7lِ1xmtSfe٧h" ܋#r^ޖ>~A!aᖱQі1q Iɖ)DQ\y4pDt5. ׸(q2߷(u5.j__qQEQ1:: ָ(u_w1k731LwFw!cpFwl;ِ1xoF6cɆC6c=FZCNm顶A6d ^7zCmуlj=dCuCmѓl$㵊ߙ==6̋E{ ۋ{m6z ׍nTm$2{¾FOl'ِ1x詶E6bunlb^pKmыlnuF/lِ1 )6zaȆ^F/^FojO-Sdb6zC6zcɆ۽zFol7ِ1FoFo!cpj>d=S#>裶C6d ^7Gmчl|N>j}>dCsJhFl/ȖĄ[ߛ}E F_F_!cNʗ16b}Ɇ{ѾK6d 諶g 4觶g1xF?~F?F?X7m6gE NmSm'jo&F1sJF!c 6cɆm6m6 jd!&ac1@mc1l{jdC؋Pm 2jdس!eZ71zEIH6l7f1H6d nc 1Pmc 1l m 6 jAdٛ}$ X7m 6 } {_6aȆApN1D6d dž@6m 6S5``!cpjdC6C6cɆ`1!ya1DSu!!c9eSm 6 )C2Dmc1l|Nm Qm %tWRc7~cPlc(ِ1PP!c1֍jCdCuc(1Tmc(1l gb c9Lmc1l|c1 F6d ^71Lmc1l0hc0lc8ٸ;SE16cɆ1N6d nc81\mc81l|c81\mc81l,<|#<٬A6l71A6d >s!c9eSFm6F SF@#6F`#F21F1֍j#dCsH8Tm$211I6d ^7FB#6Fm8y2ϧ0yExE"lOmRea9?^[7 ֈQjwsm(xG(7fxm(xG(\F9uSi Ѣ``4}a1Z`4Ɂh(bZh\Fj1dcӘaӛc<6kǐ ۅKc6`cȆ1p1C6d <<1!cb 1Fmc 1lD&X5iUm%211K6d nc,1Vmc,1lXhcXlcL&8qm8xm8q8!c8[Sm#2S9e8lcِ121O6r,&xq-xx-xx!cp㡍j㱍dC6C6cɆ_71ۘ@6T-' 1A\4^4Amc1lY&f1ۘ@6d >Ls !c9e1Amc1l w7= EݘDD!c~c"7&mL6& ۘmLTۘmL$2S&B6&bFmfibLϓLϓLRۘmL"2IE'mL6& ۘmLRۘmL"2Ijd㏭N41YoL6&cɆ?Gdlc2ِ1x16&cɆ'C6&cSG1151ۘB6d S7zb86/z?16`SȆX7mL6 ׍))TegbL˘ _1Umc*1lߘ jSdCuc*S6bSɆmL6mLpsa4w8ft L,l\<|B"bR2r J*jZ:zF&fVaQۯv i荦hM5n8F<1{) C/bhk4\Q1kHאLS׸iM'c7 ָi7 F#w+hbLtMWۘmL'2ߧ馫mL6 _w9^w9]mc:1l|n:1]mc:1l<M hc lcِ1> O7Cmc1lǹuc lcِ1xݘmPۘm$+&?scLxϱj3dC>LL!cy&gm6f ۘ mTۘm"mzMYߘYjYdCs,8Rۘm"21 ژ1 ۘE6d ~,hc,lc611[ԍٰnVۘm&2_oφjdCsl8Vۘm&2ߟ mVۘm!+:=]VĘ#1ۘC6d nc1Gmc1l|nܧ1ۘC6d ދ΁6m6撍u([Ę+zѹ1ۘK6d nc.1Wmc.1l~$بӈǵ1ۘK6d o̅6m6摍ߞ=1OؘmSۘm#21ژ1ۘG6d õ^[32~V.>^[3-~V;<{|zl?yߺ9Y}`7Bnc}nGVݸ즳/cvv`791c7\V؍n!czحC6X:*dz0IђأC6d ~x=!c>b#m6 cGmcls]`bU؋m%2#>b^lc/ِ1^^!cثG6Ƭb@cx >}j}dC0k nS؇m#2>x}j}dC}jdr,K 61~c?7m6 [6cɆ~X7m6 ׍~@x 6`ȆG|jdC6@6`Ȇhl ٸ{1Lb/ \T8m$27~Al ِ1AoqPm qlAhAl٘aw#LC~<`GգF!lِ1r)6aȆm6m6 8mR8m&{qqXSuaa!cq֍jdC6C6cɆm6m6i&ы#!cqD CkqlaC8m!2q8q8J6 ):X㨰q8q8J6d n(qTm(ql|_16bGɆ_= mU8m#r{qL`/zLmql1h1lِ1x81c1!cq 8q 8N6:?]Vx~8|~ql8ِ1qq!c5q16cɆm6m6N.o78!pN9q8A6d ~M qMq8A6d nqBmql|qBmql|d㤘SN9Il$ِ1II!c9$SNm6N 'j'Sd?8%)X7Nm6N xq 8E6d ^7NqJmql)h)l4޹qZԍӰnV8m&28-7d i!cq֍jdCsihil (hBI3L3hl ِ133!c5=q8C6d n qFm ql7s21ΊuYN9q8K6d N9 )g6bgɆaldpl,<; q8K6d n,qVm,ql8o,u}qNԍsnS8m#2q8q8G6d o9s9!cp砍sj簍d^88/^x&yl<ِ1r)6cɆ8q8O6d q8q۸@6j.S&Q7.qAmqln\ulِ1xq6.`Ȇm\6.m\6.7zN9ĸ({El"ِ1"\^T۸m\$2S.9El"ِ1"qQm"ql6ĸ$%X7.m\6. ׍Kn\R۸m\"2ña^E K%!cי_6.m\p.lI6T\tZesptMeX#.\;0`y}]eٿl? s~~Ν,/N/_W-c,c-c7,c7-c,c-cw,cw-c,c-c,c-c,c-c1'g疱W_,c-co,co-c,c-c,c\uݵKM "}+*vkW|^+zvkW|tV+vkW|}ָ+wO&=aqOmql߸{j{dC6A6aȆm܃6m6+~3{67~}l>ِ1>\W۸m'27~}l>ِ1}1xab<u6`Ȇxx@6d n@ml|@ml4p5x(CX7m<6 xmuI㕨`x xE6d ^7^Jml|NyWjWdCWj6~1]1WExV_"~0|O׫bw`W"/o5sptQ_p=xM|b 1^zփ׃te 6} צ^zY^f1"^zD6^m6ސX꜉Gٽ!f5&_Fm l|x7jo7dC}GQxm!2#@o6`oF>?ob{Zo[[!c֍jodCu-o6boɆ[h[lٸйγoa޷H5'I*~6aȆe|e|xG6d v6aȆ-A6aƢ8o.eb~{{!c{6}xO6d n=^m=l|NymWxm| ;v銉l\s81>Clِ15I5I6>`Ȇצlِ1xm|PmĒQksfbĊ~#jF,ِ1x/ {XXl#lhF,K6d ^7bXX 0g?̯GCƹg+xxYƼ-c>1_˘e2` YƂ-c!8xPXeC]SZa {p8%B+~ly [ǩcDz+< GeǩcDz+< Geǩc:E66_{o^? GچE6d zKm "2Q襶mx ^ІچM63m[66 o!c0ña{;ko olÛl?Gچ7M6d mxmxc>d#];ob>ІچC6d Gm!2>nm`>dCuQ6|FiV31| _hWm%2 mmbdC{hWm%27| _ _lÏlZpd&_8G_8GچG6d o~Om#2S⧶m 66 1"C7M aW6ɆmCj؆?ِ1 h_m'2S  l#lw31h#@m# 2+ =m a6@m# 2Gum?EW1#0n70n7Pm#$27am  T6Ɇ@h#Pm#"Z8/51W R6Ȇ 8maAdC6 l#lFmp71s9``l#lF0m 66`!cpFF0B6ꝼ0K#DԍX7B6B!cp!FFB6d ~PH8N(Dm#!2ECl#٠^q8F8F!cpq8jq8dC8pGm#lFh#Fl#.xل31 qjqdC6Bq6bqɆ甸pNۈK6d gڈۈG6VkoMxFו!e>ɗ>IymP΀wOg@$_Lo'EO O |3ֹj crO>+ ];yws8?d_oB]>1}?}cǼ\A1ayOsosD3|`+$'vszzmu]ݽ\=+̝!;9N 7qWWs4&oGq3釺Smq~|^鮿(?UW㟡4q vf{g  t=k{9;{uӕ=4}4u=ߥ+u/lxҺ?qz-j~d?|\q)W.Wc??J?./W} :^r2dx:q}o-=JO>6}^ܿIW*;.~% sN's k[vW_;{˕+ay ɯvhx.Wo:’xgˇүx5;/2)}!hhgA_?)5t5ww\?\ ~qÜkWkWWWk"W+WbWx|<;?ndJ4!s:Ǭxvqt~7qG)C_aO(=r_c#˟jp/^bȠ/<KA(3s>C?GφDwv9tbrE#<|D#~_N ~i]L}unO شPfZbro!pZpE{Bm?O;9l/_99Wv?Rǽܐ.7_Lr?f?9tvR_s!w.7Lܓ(48frHm>QQQί&?cY=M*]{Uȹz>mެ]dM4uwB>;Mt=gr,/_`okl/ws>$E2Q!4O戼jiٴuk6c֭4*Nd"FjԺY57j)Eڭڂq>?]SO fڑǯ/?_guwQrƚlu|S8cw?W5w.+LtYq]΃:uh/Ϲn(:'4 5S^cӈk/b?n~>srs9KO Ͽ^:} \xƿ h33clL13333333cfĐN̔n̛7lmnMHGuuuNF`}ہ/P@ (ĿW z)P^ P& a Gx"l"D#:1I,b#>?$G$#9)HI*R#=H&2d#;9I.r@S0E(O8%(I)JS<H%*ST:5I-jR4!1}T1P;U@mv #&P ?htrOn Q-ľ}cһehS>;j> XV׎ cGcrp`x@mW;7 *6g8Vۨ} [$`Lgkg8 ?K kW[ dqU)hO9 (њ6vDgЕnt' {ҋ/w+]]c{' ^>Xܵ?2ۿOu,/63O'H?;#k,wIقe5ݗρM_N0c(v@Do*hBA GFIX9Rs X 珟.nIBJ㚀{0=/Ч 3;SN김~@}_NOYN P'h۹I넅ul߮c-ugyw^=fbR&M:g` 7oбsgo׭Iz 5j.3ugd- {UkױUugY3:`mЦIm`c 5wu/߭!^},< _ ^ 3nql,@ L][4NXA@qeLFuj״s¢Vp@ށ^yhpg[*f )ED!z%8hqo-״iFMg&*Ԣi{JM  < B Op Xzb*)߇b$PH  }[x_ 08A2? =0qgvT1dVq7g{.`!X쟲3+X*Vc=&6lc;;.vlAq#9INq3@/s\:7 8v>'x#<9!W oy{>O| _eXIPPe k CXD$BT$C\H@B#IBe=P RԤ!-HO2d!+Nr!/O R(?Q┠$(MRT"LRԠ&MR4!hLҌ洠%hMҎt#Lҍ'M/t`0a g#h0qgd0iLg3l0yg Ybe,'`c+Yjְ6>z6Mlf [vv]f{~ rC;G9qNpS g9y.pK\ Wunp[w}OG< Oys^W oy{>O| _kMw $Yhp' he"D#:1I,b#>?$G$#9)HI*R#=H&2d#;9I.r#?(H! SD1S4e(K9ST2UJ5SԢ6uK=Ӏ41MhJ3ӂ5mhK b⟎t3]J7Ӄ7}K?3 b0C03b4c83Lb2S43b6s<泀,b1KX23+X*Vc=&6lc;;.vc?_9!s8'8)Ns<%.s\:7-ns>'x#<9/x+^󆷼='>|N݀ % AH& a Gx"HD& QFtbX&qG|~  Iď$& IIFrRT& iIGz2Ld& YFvr\&yG~ PBEb%)EiPrDePjT5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~g`0a g#h0qgd0iLg3l0yg Ybe,gVUf kYz6Mlf [vv]f{~~ rC;G9qNpS g9y.pK\ Wunp[w}OG< Oys^W oy{>O| _ƿ&A FpBP& a Gx"}@BT$C\?NIL %HMҒd #L 'M (L(N JRҔ,(O*RT*ըN jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(F2ьa,&2La*Ә f2a.,a)XϬ`%Xֲl`#`'~ 8~wr$8r\"r&~\>'x#<9/x+^󆷼='>|!(NBЄ!,O"D!*шN b!.$ !$!)HN RԤ!-HO2d!+Nr!/O R(?Q┠$(MRT"LRԠ&MR4!hLҌ洠%hMҎt#Lҍ'Mҏ ` 2`$2L`"2`&2,`!X Vլa-X6la+va/~Wr7~(8 NrӜ,8.r\*׸ nr.<)x ^׼-x>|+'!(NBЄ!,O"D!*шN b!.$ !$!)HN RԤ!-HO2d!+Nr!/O R(?Q┠$(MRT"LRԠ&MR4!hLҌ洠%hMҎt#Lҍ'Mҏ ` 2`$2L`"2`&2,`!X Vլa-X6la+va/~Wr7~(8 NrӜ,8.r\*׸ nr.<)x ^׼-x>|+&A FpBP& a Gx"HD& QFtbX&qG|~  Iď$& IIFrRT& iIGz2Ld& YFvr\&yG~ PBEb%)EiPrDePjT5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~g`0a g#h0qgd0iLg3l0yg Ybe,gVUf kYz6Mlf [vv]f{~ rC;G9qNpS g9y.pK\ Wunp[w}OG< Oys^W oy{>O| _'!(NBЄ!,O"D!*шN b!.$ aE?IBR$ICZґ d$BV$C^)BQ~)AIJQ2@E*Q*TթAMjQ:ԥi@Cј&4iAKZњ6@G:љ.tAOzћ>@1! eHF11eD&1)LeәLf19eYB%,edYZֱ ldVd^¯9oQq9Yq \Uq]q?<ySy[|W'R&A FpBP& a Gx"HD& QFtbX&qG|~  Iď$& IIFrRT& iIGz2Ld& YFvr\&yG~ PBEb%)EiPrDePjT5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~g`0a g#h0qgd0iLg3l0yg Ybe,gVUf kYz6Mlf [vv]f{~ rC;G9qNpS g9y.pK\ Wunp[w}OG< Oys^W oy{>O| __  $MD "L &M@IL %HMҒd #L 'M (L(N JRҔ,(O*RT*ըN jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(F2ьa,&2La*Ә f2a.,a)XϬ`%Xֲl`#`'~ 8~wr$8r\"r&r|+k#8!I(B#<H$"D#:1I,b#>?$G$#9)HI*R#=H&2d#;9I.r#?(H! SD1S4e(K9ST2UJ5SԢ6uK=Ӏ41MhJ3ӂ5mhK;Ӂt3]J7Ӄ7}K?3 b0C03b4c83Lb2S43b6s<泀,b1KX23+X*Vc=&6lc;;.vc?_9!s8'8)Ns<%.s\:7-ns>'x#<9/x+^󆷼='>|/: L $MD "L &M@IL %HMҒd #L 'M (L(N JRҔ,(O*RT*ըN jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(F2ьa,&2La*Ә f2a.,a)XϬ`%Xֲl`#`'~ 8~wr$8r\"r&r@1! eHF11eD&1)LeәLf19eYB%,edYZֱ ldVd^¯9oQq9Yq \Uq]q?<ySy[|W&A pO;}'4aK]D"2QJ4"6qK@1! eHF11eD&1)LeәLf19eYB%,edYZֱ ldVd^¯9oQq9Yq \Uq]q?<ySy[|W L $MD "L &M@IL %HMҒd #L 'M (L(N JRҔ,(O*RT*ըN jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(F2ьa,&2La*Ә f2a.,a)XϬ`%Xֲl`#`'~ 8~wr$8r\"r&r?$G$#9)HI*R#=H&2d#;9I.r#?(H! SD1S4e(K9ST2UJ5SԢ6uK=Ӏ41MhJ3ӂ5mhK;Ӂt3]J7Ӄ7}K?3 b0C03b4c83Lb2S43b6s<泀,b1KX23+X*Vc=&6lc;;.vc?_9!s8'8)Ns<%.s\:7-ns>'x#<9/x+^󆷼='>|/nx % AHB0%@D"(D%щALb8%$$?$$%IAJR4%@F2,d%ANr<%)@A Q"'Q)CYQ TBUQԤC]Q4iBSќiC[ўtBWѝC_џ dP1dX1 LdT1d\1,dYRYJV5eF6-leNv=e9/Aq#9INq3E.q+\׹Mnq;?yC'<yK^7G>/|!(NBЄ!,O"D!*шN b!.$ !$!)HN RԤ!-HO2d!+Nr!/O R(?Q┠$(MRT"LRԠ&MR4!hLҌ洠%hMҎt#Lҍ'Mҏ ` 2`$2L`"2`&2,`!X Vլa-X6la+va/~Wr7~(8 NrӜ,8.r\*׸ nr.<)x ^׼-x>|+"&A FpBP& a Gx"HD& QFtbX&qG|~  Iď$& IIFrRT& iIGz2Ld& YFvr\&yG~ PBEb%)EiPrDePjT5EmPzԧ iDcДf4-iEkЖvDgЕnt=EoЗ~g`0a g#h0qgd0iLg3l0yg Ybe,gVUf kYz6Mlf [vv]f{~ rC;G9qNpS g9y.pK\ Wunp[w}OG< Oys^W oy{>O| __4=0AJ0"4aK8D"2QJ4"6qK< HH"~$1IHJ2"5iHK:ғd"3YJ6"7yK>S0E(O8%(I)JS<H%*ST:5I-jSԣ> hH#ӄ49-hI+Zӆ=H':Ӆt;=I/zӇ? 3 c8#(F3c<$&3Lc:3,f3c> X",c9?b5kX:ֳlb3[6b7{>s_0G91s4g89s\2W5s6w=<1Ox3󂗼5ox;|3_7"a{ BP$ CXD$BT$C\H@B#IBR$ICZґ d$BV$C^)BQ~)AIJQ2@E*Q*TթAMjQ:ԥi@Cј&4iAKZњ6@G:љ.tAOzћ>@1! eHF11eD&1)LeәLf19eYB%,edYZֱ ldVd^¯9oQq9Yq \Uq]q?<ySy[|W L $MD "L &M@IL %HMҒd #L 'M (L(N JRҔ,(O*RT*ըN jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(F2ьa,&2La*Ә f2a.,a)bs_0G91s4g89s\2W5s6w=<1Ox3󂗼5ox;|3_7"! BP$ CXD$BT$C\H@B#IBR$ICZґ d$BV$C^)BQ~)AIJQ2@E*Q*TթAMjQ:ԥi@Cј&4iAKZњ6@G:љ.tAOzћ>@1! eHF11eD&1)LeәLf19eYB%,edYZֱ ldVd^¯9oQq9Yq \Uq]q?<ySy[|WL $MD "L &M@IL %HMҒd #L 'M (L(N JRҔ,(O*RT*ըN jRԡ.O҈4)hN ZҊִ-hO:҉t+Nzҋ/2 a(F2ьa,&2La*Ә f2a.,a)XϬ`%Xֲl`#`'~ 8~wr$8r\"r&r?$G$#9)HI*R#=H&2d#;9I.r#?(H! SD1S4e(K9ST2UJ5SԢ6uK=Ӏ41MhJ3ӂ5mhK;Ӂt3]J7Ӄ7}K?3 b0C03b4c83Lb2S43b6s<泀,b1KX23+X*Vc=&6lc;;.vc?_9!s8'8)Ns<%.s\:7-ns>'x#<9/x+^󆷼='>|/!(NBЄ!,O"D!*шN b!.$ !$!)HN RԤ!-HO2d!+Nr!/O Rh,FqJPR e)Gy*PJT UFujPZԦuG}АF4 MiFsZВV miG{:БNt ]FwzГ^}G0A fCpF0Qf cx&0ILf Stf0Yfs|E,f KYr~f+Yjְugfmlg;n}+9asc'9ipsepk\7mp{ycg</ykwgoEq#8!I(B#<H$"D#:1I,b#>?$G$#9)HI*R#=H&2d#;9I.r#?(H! SD1S4e(K9ST2UJ5SԢ6uK=Ӏ41MhJ3ӂ5mhK;Ӂt3]J7Ӄ7}K?3 b0C03b4c83Lb2S43b6s<泀,b1KX23+X*Vc=&6lc;;.vc?_9!s8'8)Ns<%.s\:7-ns>'x#<9/x+^󆷼='>|/%!(NBЄ`,v]D;%%E$TD.>+>gu\k!79'cx;%#b"b#"#"# "#R"R# "#2"2# "#r"r#"  JJ ʢʣ** jj ZCk6hvhN.n^>~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7~A0C1 1#!Fa4`,a<&`">$|ɘbcfbf3瘋/0 %`)a9V`%Va5:l؄؂o۰;-vbvcb~AaGq q'q qg#'ϸpWpp7ppwpp+7mnXI,)çz_~Yvm[; 3~~W&iBYCyYS3 isկno*?M;J̭~2mӧ,U`(?>~;io/mwꠇ[CaBCxǿ,MM;G6|(p㌈㍈C#B1Q925lP{""ul׮o+%oP*o_D&L'FWqc(Z c@ޭZiӮkd H߀9yǮ=nuk=w ww%G=|iw 5 @;btEA .|h_"Fr;Lit(eb׶D~ӳ?C5y+ [ַSv#Rq_\h< ;ԿOa+c|:x/vP{cgaBg\cc;lxw4̝]BH im ~=R}QB5BQ8I;SQ['vۑءHajBBmyx!Qqе!vsÒ{{Z/5Bۧl?lU?|S†2No̟d4x>Rmпek>G]&TF\Azv>o >:,f(Z  ~GI=׏û-ySW0WW|.o>[]brו/Wr)U0R?_M#{\Cԡ̡>sP_}n2}mhG7o7B1I;%nqۛw|F P5_4g7|yη*? cwOg>3ၡ+Kڛ K6 S?&tOǻ[OU_mלlJG PK*%<KDgow%b>]kO\$,u\l3dž/~ui^=twg>pO|űR9G]oZ)t2ϭ5n^*-?O.]qufum]vIrb/. UD*"KRg*7꫟\[ܳDs.IU=)sYd*JkKrRNu%ʁF9R%.TJjQ*f).iTb|谋 ~kCj\t, W12~慖 h*WY]C_+tKfE>K4='fM%Z&muɮ*vYXaKN]1[K.ͻ%JU%5[GExK^5%ʽZ_%Qt):oYWTbDƽcRXIԗ.ETt3`"&mťʡH%W J _^sKI!O2p;98ۥRF%/#RVKpCRNe٠jR^gNu2aO'TT n>v23?rr*t)l.UTbZ;x*UtATSs7)ǸTWS$]F s#]jq#\jpQ:̥ʺ?y8ĥʃv̱mZ:ȥJ+R_%hߥʅ:P%Q&H4ri2%DHT%F]vg*RPK mKKg[K+>)O\.U>\.TH%\XeJW]kh.92Dō2T%\(S WYrr;Ų;sTIu%]>TiJ\F̉l^,.U~ R2QcU.cUjeʄ2R r]&|8apv=:'rQv.SU!n|OT =˧*e}li* #tiE+ "EsU2.T*fvNd*8yDTvr)׋2GE\>W)o\/t |իs٫RW.T[.ߩb_%B8r@LpP].T8X]X#*mGJW=rAey%z1T.U-yj*;U.'UNs1m).s9¡WK]Ψ=\+*{.?m$8[\P 1sTѓl.TvIR)h3Qܸ3U@'.Ttȟ%Jp͘%Jorɨ&jt+5g.Ut%J}yU4R"l*%J|qɡÍ.9U&U>\*\r=).yTJ`%S Fqɯ4x ɥJKAκR]]X*] {RTxS}R\E7W.%TbjRRJpܥʘ!Ki=I.eTt1?q))إJ_|WY.]*<NwI.Tv;.Uݷ\\*tZͥJ]}h*JK #%*8pѥJY=p~ޥNs,ѥJϲR_F]G5O4T).TRWc.UԉK*w']A*Ղ/yK q˂CF*.T..*u} 9KG6*YtNEOWY!xzAF*ItbԥJ}]9\:.*?<  \DNrR^O] ?_*:0_SEp饒/8]إJ=Q OeZWEu\}_N~ PY2PE/r.U3_k|2!8U0e:32Tŧ{\!ep:2BD*Vhˇ*:Vхe^2E^sLe\>Qщ.'.TrJ* B*zeJ<=xV6.|=vrZs=ik2Wh/Tt*<|'je,T ,Rщz.UW:._Ћ.KTtXe9uYHU]D>p*uRe7*R ηv(ZE'!ʺ|RH/ĺQ飃Q*z*N%8B*Xeu٠N@lT. lRI/*zeǙ'.ߨNr٪A\]l.Ute7kuI.;Ur멦.ԖeҸQ^0]K.T!;PeP37.U괚!MrXEQUtTQW嘊NGs9(.'T%* ']N\V)ư.gTt rVeJ*?|q9I']~R W.U%tYe[ *σg.Ud/*:ʊxMrE%]A5=9r]%x`*S]nT׉Q[*үVSk.wT#~W\=!t1xwyU#zWE7cKx]~SaI'*NKEgi.Tt_ޥ^/REeytKU$K5:R]Ew]j.5UNO&R]jTK]U y]ꩼ EW). Tå.TUV*Y4qiN' \, Nodpiwi=ҺP]ZL \Z<9NzzZE̓2\'F]ڨl^HOVE*K;⹴W ׸.TV7.Un/t餒V]:hͥNEqr6FvG/tW@.=T4 SE'{¸8[ŋ*}TuůK?/~]x2@ŋ_*^ Re.xl2Dŋ_*^ Se.#Tuůˇ*^Re.cTuů8/~]ƫx2Aŋ_*^|ů$/~]>Ve.STuů'*^|ů4/~]x2Cŋ_*^Re.x2Gŋ_Uuů*^Se. TuYů"/~]x.KTuYů2/~]xBŋ_*^Re._xFŋ_*^Se.Tu٨ů*^lRe.[TuFŋ_*^lSe.uVŋ_*^Re.{Tu٫ů>/~]Se.Tu9ů!/~]xrDŋ_UuAŋ_*^S帊.'Tu9ů)/~]NxrFŋ_*^ů9/~]~R弊.?xrAŋ_*^ů%/~].xrEŋ_*^\S床.7Tuů-/~]nxrGŋ_*^S徊.Tuyů#/~]~U届.xDŋ_*^ů3/~]xBŋ_?Tuyů+/~]^x.oTuyů;/~]ryFŋ_*^S%.TuůK$/~]"xEŋ_*^DS%.1Tu=X*^V%.qUuůK|/~]xPŋ_D*^$V%.IU|pIůKr/~]RxRŋ_T*^V%.iUuIůKz/~]2xQŋ_L*^dV%.YUuɦůKv/~]rxSŋ_\*^V%.yUuɧůK~/~] xRPŋ_B*^Vץ.EUu)ůKq/~]JxRRŋ_R*^Vץ.eUu)ůKyQTPץ.TuůK/~]xRMŋ_*^Pץ.TuůK/~]xROŋ_*^4Pץ.TuiůK/~]xLŋ_*^Pץ.TuyOŋ_*^ůK/~]ڪx^riůK/~]:xIŋ_*^tQ /~]x]ŋ_*^Tץ.UuůK_/~]x_ŋ_*^ Te.Uu@ŋ_!*^ Ue.UuůH/~]>Te.UuůX/~]Ʃx2^ŋ_ *^LT#/~]&x.UuůT/~]>QS/~]x2]ŋ_*^Te.UuLŋ_9*^|ů\/~]Pe.UuYůB/~]xXŋ_/UuYůR/~]x\ŋ_*^T*/~]Vx.kTuYů:/~]֫xAŋ_*^|ů&/~]6xEŋ_oTu٪ů6/~]xCŋ_oUu٩ů./~]vxGŋ_*^S;/~]xr@ŋ_*^R尊.GTu^ŋ_Tu9ů1/~]xrBŋ_*^R崊.gTu9ůˏ*^S'/~]Ϋx.Tuů/*^\R岊.WTuů5/~]xrCŋ_*^R嶊.wTuů=/~]x@ŋ_*^Te.UuůX/~]Ʃx2^ŋ_ *^LT#/~]wnuX.UuůT/~]>QS/~]x2]ŋ_*^Te.UuLŋ_9*^|ů\/~]Pe.UuYůB/~]xXŋ_/UuYůR/~]x\ŋ_*^Te.UuJŋ_5*^Ue.Uu٠ůF/~]Ve.Uu٢ů7*^lUe.Uu١ů˷*^Te.Uu٣ů^/~]x.Uu9ůA/~]xrXŋ_#*^|ů*^U嘊.Uu9ůI/~]NxrZŋ_3*^UGrNŋ_Tu9ů*^\P墊.xrIŋ_*^\Q媊.Tuů /~]nxrKŋ_*^Q宊.Tuů/~]xHŋ__Uuyůo*^(~G/X%O,(~'/T%NdDKJ3|6Q%_DKNdDK(~/Y4Q/%_DK(~W/Z%_OdDK(~7/YQ/:Qi/6Q/>Q/1Q/9QY/5Q/=Q9/3Q/yC%oLM◼9Q$_2w%oMm◼=Qy/yG%L]◼;Q$_DKޗ(~/7Q/?Q$_DK>(~ɇ/H%Mc|(~/Y8QE/B%_LdDK(~ɗ/J%_M\%_DKK|3Q/V%NdDK(~w/Y2Q/^%K'_DKI,(~/Q%%_DK~(~4Q/Y1Q%_R%+'_DKVI◬(~j2Q/U%k$_f%k%_v%$_n%%_~%$_a%%_q%$_i%%_y%[$_e%[%_u%$_m%%_}%;$_c%;%_s%$_k}2-Q/#Q=/+Q/'Q}//Q/9 Q/9(Q/9$QC/9,Q_'_rx%G$_rd%G%_rt%$_rl%%_r|%'$_rb%'%_rr%$_rj%%_rz%g$_rf%g%_rv%$_rn%%_r~%$_ra%%_rq%$_ri%%_ry%W$_re%W%_ru%$_rm%%_r}%7$_rc%7%_rs%$_rk%%_r{%w${ȝܕ(~݉ܓ(~ɽܗ(~<(~Ƀ<(~É<(~ɣ<(~<(~ɓ<(~Ӊ<(~ɳ<(~◼(~ɋ◼(~ˉ&Q&_DK~(~/c%Jω◼(~_/k%K#Q&_DK(~/o%K5Ӿ*_DKHdDK^(~/*Q/&Qi/.Q/!Q/)Q/%QY/-Q/#Q9/+Q7$_DKޔ(~ɛ/yK%s'_DKޖ(~/'Qw$_DKޕ(~ɻ/yO%M}◼?Q>̛(~|̟(~/`%JÉ|$Q&_DK>(~'/Y QO&_DK>(~ɂ,jE>(~g/\%OdDKI |1QE/R%_N+|5Q%_DKK|3Q/V%NdDK(~w/Y2Q/^%K'_DKI,(~/Q%%_DK~(~4Q/Y1Q%_R%+'_DKVI◬(~j2Q/U%k$_f%k%_v%$_n%%_~%$_a%%_q%$_i%%_y%[$_e%[%_u%$_m%%_}%;$_c%;%_s%$_k%%_{%{$_g%{%_w%$_o%%_%$_r`%%_rp%$_rh%%_DKODKLDKNDKMDKODKNLDKNNDKNMDKNODKLDKNDKMDKODK.LDK.NDK.MDK.ODKLDKNȵDKODKnLtDKnN4DaKniDnKԳD+KHDKKz%w'WrOh%&Ur_V%KԦ%*y0ѝ)y8єG|#&zQX%'ZPD$O\$O%Nt$$Ml$%jL|$/$JKb$/%*Jr$I䷉ΧU#}u$H䏉)Q-?LQ$$DDH m!# &*ADH(~俉/L(k"Q) y]#OudDMGNsdD)GMtqdDGO4odDFfLldDFfNjdDFfMthdDuFfO4f%s$22g#s%j1DFޘ(țys"oI4]dIJAޚuy{"$+DgEޙȻ yw"IQ佉/>'J'2ok"%*&2Y"HJ䃉|(Q'Z#DYD>x"HAdDC>}ȧmt! &P!I49䳉|.ې'\‰,(g b!&DB[W5 j]!_K*.,P7 f0!'zD=BhE2|'с&d K%DAN6,(1Y6QY& DAAKlj:$Bisx4Y!Q5 YX +%rF ?OdDi@~ ȪdD3@~(*qOH57d=>Y;qkOIѓu7d;Y?qN6Hܭ 7dĽ9؞DINljO 8̞d6ž2qsM'阆lmOҭ4&qM'ƙl_&ۓtLv'옸)&;ٓtIvN]I%ړtKvKI%{$jɞ$-I%{'n]>$ݱ}7d?{O$} $FɁ$Ԓ`{n9!$- &9̞ 4uv$GؓtHL3IU$GۓtHIcI$%n$.I#'&I$⑓wv{nȩ$Ǒot{IHܬ3IG#gٓ- g'9$}!$&y$I"$Ʌ$Tb{KI"&e$.wI {nȕ$Bj{5r=I:{nsr=I75Ľ ɞ[r=Iw. ՞r[nO] Þ3qB'+=;qA'kO/q[A'i+CHDIK'閁!1)^9:%5-=#3b+>yC5?ySbҟ91Oޒ's'f[my|='1kOޑ'Lѓw%ɻ3=x;y_bڝ?1NMLsdĔ:@b&|01N>7'NL$fGc9qT8Db,&LwO%ɧdĤ6Y(1M>&M\%&d4Y$1+M&_LAESKgD3Jb~|51LM&_OL"s)㇒o&f bļ0vb:,&IL&|ɒ^T"%KL쒥i\Lb 1iKMՒ&hɏ3dĄ,qb$1JO̺&&[ 9Vbbj,1JVJLiSJb"1IJVM̍S䗉Pzb*1IHLw5d&Y;1IILeu3d%Y?1_I6HLS dĤ$81I6'741H6'ȕlnO<#"1H'HJL&II'il1$ٓ4QHOI$;ړ:dg{eKbʏjO5͞ >{b^aOU:31G')%{ۓ4gGILՑ}I#%&8r=Ihr`bdOɃ$͵CSlP{fa 5k{p{Y3r=IeĨ9ڞKr=ID9Ξ"'ؓI"'%$MiS3YT{br=IVt9ÞY*rfbreOҜ9۞BrNbkOW r^boO%rabR\dO\8qM.'iO.'iˆ\'"ۓ4=DH +I "WٓtKNLkI{ȵr=I!>ޞirCb6hO$)1wCn')g!ؓ4SCnMLАI!'c$;Iʐs.n{Ē{3, Ϟrb<`O yОd<+!ۓ4EBǏGI!ٓtUCOL'I\'O&&;S$Yi{63 =IyޞiIښ%{&ˉ) {f"oIZ$mF $C?ٓ91@^'i%1q@jO|=I {bvÞI\=IS$]$ _{2 DO^3ë'MdDOLTuƞ>Qԓ<:Q˓im<6Q“;>QM;1Q:9QY-:5Q9=Q9 93Q}8yC'oLMқ9u$*n2w&oMm=Q_y5yG&Lt]j;H$hDLޗm37Q22?Q)$dDL>ɇu1H%&McN|(~/Y8E/BbA"_LdDK(~ɗ/J%_Mk|=Q/F%LdDK(~ɷ/Y"Q$_DKLdDK(~҉|?Qe/A%&_DK~(~r8Q$_|%?MdDKVLg◬(~ʉ(~ɇ/H%Mc|(~/Y8QE/B%_LdDK(~ɗ/J%_Mk|=Q/F%LdDK(~ɷ/Y"Q$_DKLdDK(~҉|?Qe/A%&_DK~(~r8Q$_|%?MdDKVLg◬(~ʉQI''&_r=I9ٞ◜(~ɩ$DKN'%gؓ'g&_r=I=DKα'%ړؑ/9ߞm. Q I: ٓT/ĞDK.'%ۓ+/Ҟ\(~${ȵ\gORAOij{Sȍ$}/ٞbO҇75QIFnO{ȝ$&w%_r=IWDK' Ϟܟ(~$DK'%ۓt-MIQ{$X%ۓ'I'O&_=IDK')!ړT/yޞ◼(~ɋ$%{_DK~cOoDK~gOґ+=I/C%'iA(~ɟII^'%I$oݞÞ3Qٓ'_{I*~/yL◼6Q)/2Q%_DKJdDKIdDKKw&'_2C%3&_2S%3'_2K%&_2[%'_2G%s&_2W" oH䍉◼)Q7'_DKN䭉◼-Q'_2O%H䝉◼+Qw'_DKޛ(~/y%&_2_%'_ą7`%JÉ|$Q&_DK>(~'/Y QO&_DK>(~ɂ,(~g/l%K,(~"|!Q/&_h%_Jˉ|%Q&_DK(~b|#Qo&_x%Jۉ,(~w/n%K&_T%KdDK(~2,(~/Q%%_DK~(~4Q/Y1Q%2FR%+':DKVI◬(~j2Q/U%k$_f%k%_v%$_n%%_~%$_a%%_q%ؓTMIP!%_=I_'liO )ʞl(~6$dDKKd{{!C%;ړTI:4';'_=IץdDKv')!ۓT=/Ӟ(~$d{6IdDK'1?QI*~Ɂ$p/9؞m9$QCIBH'%Np{_rD%GړTI'G'_r=I96QI9>ޞyɉv${J]rC].9%QS_iu"oDcrf%g%XrOjYCr5rnq%%VrOUr"rOTrQD%'Sr*SrOrϸzD/JHԡJV]ё|6b}IkU'6p|Tl}g|^Tc%)QZu|%ժܖ($oKnOs׊Nq[&HNt1 *ZHfV$!y Q~!k]%!yV7HITDHFuDN"uJ'-y*Q$6.3V<򬕤<(󉾎`%#/ZIjKVJ9r#ITpV$]ߒ[ItcU#"ԡWK15JR?Fn%#Ha䟉J+IW俉/kJ2J^hLUy}"S%)2u"$j(2m}"%J'2}k"3$*&2cY"3% %2sG"$#2k5"%"2{#"s$!2g"s% DCޘ}țmys!oIt;dDsKDCޖ(p 'Qאw$ZD9CޕdȻU yO!M/}?Qy /Q] @B!L4'C„|8ѓ$D+B>(CD $DA>7ȧY0f%L MTs|>QP$d+Iu|1Q>Eɗ$U V+IjO _KVVDE@O4[V m+I=YJ?N⮟|J>YJ=>YJҭ=^⎞,'߷tN$XI['&nGVrVɏ$݀$mS+Iwd+I7dE+Ig[iRl%ǎJ2YJ҆"qwLVMߔf%ГJYJҝ/U↗%kZI%kYI&k'nf:{Xj;VAl-%YIO6tPK6t!G6Mrwds+I7d +IdK+Id]$:qHtHp$!7d JҡJ2JM%qGvMݬ$ّݭ$Б=qdJ]ۍVn>VUo֌엸##[IBHtPB1'%,r{+r[*r;) 99!qCNLݐ$Ԑ$ːS$Sw. 9J} 9J 93qWBJ܌$FVs$}'ZI %n4 rۊ $M$D-JҝJ JnrEv\ WYIFLt`GM'z+IW+IF+IgI;9qNntNntfNnK+I[srnrCrwܓ8&ZIZ}VNVΟf`l&K'&'bd|21K>%NӸd-LbҖ|61WK>g%Û|>13KNLȒE$ !/XI:#_4JML/%Xɗ$MXIQ%_4J?%_OLŬ$]NoXIZ7sdĔ(|Jҡ YJҀNb|71I4I4yM=+ISd &~b,c%iJ_BG%9Q YJoc+I'V\yF"YJҬ"YJd"9DRbꐬ1$?4QHVtD~a%# $%&/$du+IjW>Fbi%i^e%i:m%i#&zVVfVQab>l#&VNN64TC6KL3kd +IjdK+Ihd++IgdD"DIom$͑$M$͈adJc@쒘"&nVVfV&Ȟy+Wbm%ic%irk%iN엘"'fV$Ŏ +I_9$1Dì$]x_[I9"'&y"r!rY$Mcs@9JRCtAN$9J_orgr951eCNKԐӭ$MА3$ː3$Mǐ0 9JRAε%g%)*%'&Vr+rord\+!&HeVfFV&DVAȕrUbփ\m%i\c%)"ZI:"%f4 rh%Zl91IAn47An4%An4AnOL@;y8JJ҇J"'1@ML%$%$[Iz$XI~o򰕤I򈕤򨕤)X'' 򄕤b󉢞ɋV2򒕤6l%'It䷉ʝJRN~o%`'ԫ_1Q?%Ztg+++I(cDCN(߭$XIڊZIjɿ7w&TqZIj$5*zlD}MHdDYM^4*HE4&?i3.6%3!-2)$2%Yu1-0# 9U0+7$Cޘ{/OޔyɛwDKNt䭉 -ܒ' [2O%HԳ䝉V+Qƒw':XDJޛh\E+y_%&jU2T2D,"!A?bC|Of#^|O]u(X%UA>,2_O&NDI>3ɂ,h/g%l$KTf,($/MI |1:E?K|9Q-$EDH׭]ғm!F$$LtdD%Hhɷ YŠTGw-%ɒr,$Uydġ,~#$:DMGcG~(ȏ]Y.Q'7DFOlVEY1Q%:4R:#+[Ij.N~(*~"QUd5+I%e"[IȯMY#Qp5Y+Qg$m:򊬛zhV)a"%j$Q:M],q%E6,-2#:m$EdDGDKTCdD#DvHAdG+I[S!;'K!&[ҹ0==$}= +5&{'ZO!ZId~*h`[AVjrp]!$JrhK!%*DsBO&+ID$G&rT!G'rLBk%'%r| '$ rb '% rr XI.ȩʂh*鉂%șVrV g'rNs8?97Q5$ q0@.LD{@.NDW@.\hB\ȕr~ruf\'νzrm;)qNnNܤ[-9Jҝ8=qNHw;]6J5'qOMMJwč3yJ2y0qLJ7&$ɣ[`XΗo+Iz?[<ĝ_↎fW}ymLk;;2qF^G#Oܚwdd_A2ML"%,2Cފ̘"3%̉(2K⾉̚]"%쉛#2G➈̙:++qDސ!oL7%nsțw7-2w^5q Cޖs!oOܰy)] yWf;qBޓ Mq%n4dmř| 2&| q@>e J|'nG䣉o]x|"qOH6v'gS{HL|#W%둫5qķod/rc)݊ܜ&EnI|o"&%߉o@G%w$;n]27rO{ 7ܗBO| $_&LJ|w ')G ȣoĞ<'ydbNJՏHN3}8y6&%Ď?eRboL^NoÓg?i{Z?EUG]X&JEɟMJbIU&%KCn3#JMב$vq俉=_bF^3b?vHLk);+>>k:8*HN46!%6%'v2dľ̘إ{;2KbAfM.l=s8 #O s&vd!Y|7'oJ|7'>[d2ykSxm\','yJޑ$L|V+Hޝ$I|&>h$O|~yVdg?ID>;`S|(B>!I|^&>J>, Ou,XL>Xɧ?Ӊ,XBw3|6%Vݓ'Lpb-Y$/$V?Zkhbe#_XvI!zr/\3Hܓ$M['6 d쑒&~vInN^+egܚ=[rO={䎉Crg2]?'w'c/3Gro2}?d썓&~Ƀc'MWO+y4{䱉d|wH{wd2$OMM!O'Ll2%Mm"'U/b2%/M7y9L$Mww+3Sd|M479߅W&.%ߩN&Kw?? @kO2N&KE9 MH2)qn_[q&L56dd$6gDt8GJOYS2C2Σqf̔sdd}%$|,5ghl8gKfOY\2G29q̕s 8LޘM8cLޜs-8LNyfdy&oKƹhd&$|5yG2`w&6yW2rw'7y=΄&8y_2Ζ'9fg|8NO;@2Ó&sɸ H>dd)$LƽCdM$NE`28q|&w%gq|.w.q/,dd$_HPd%&.)R2/'N*J2&n+Z2',Y,h7qז|3qɸK{ɸKH`d!&M=cd2"q_|/wɸLddܟ&?Hkl2a&6Q2sq8Oqw,ɸNVH=ub2%;Y)wɸ7O~ddܿ'H}j2Ւqן2=@z2W 5$k&OHJFÐ!Y'-Dn2zdd4. f$N7Fh<'v dd"ɦ{Y2d] "Jľl&zb'CIFKl;!%I휔쐌'qbCvJF#윌(%Qk2zdd4K蚒=>%{&JJFC음*'-Vo2zdd4]辒ц%&KJFc-9$Zrh2zd4oɯ%'KHF_/9*^rt2Zd~ɱh &'-LNHFF19)crr2Zdɩh&ӒU&'LHF39+grv2ZdɹhJѝ&'MM.HF\5(lrq2Zdɥhn˒&'MHFߛ\8ʿpru2Zdɵh-''mNnHFܘF:ɿgurs2ZɭhY躓ۓ~'w$OLFCܕ<;-zr?Azro2>dɃh쓇𓇓'$OMFCɘM>#ɘM>cɘM>YɘNHLqd'Jlrd/' &c9Y(sg1+|61s|>sɘNNɘOM,yd̛'_NLzḓ'_mOɘOK}d'ߴOO~d'ND2Hc%@d3,^Adi,w'md+$㍅ddÐ0o5$?J{rVo>$?NƻOvD|2ޗH~7($ީHVL[ϒER2HVNƻϓFJ2H~a%FGj2HVK[/Hz2 I~e%HF2IL$Zx$Y;$$-ddg%J~2]I6H,Ɇx%(o$lbMLY2ޜI6Oƻ4Vo$[&}ddlwrmNm2IKƛRW2PJN;K>x)75%%Mdd`%6Tr`2ޏJJSx*9$oU%ZIg7_']d#$JJ;]x+9&}%&MdŒ$KNLeIx,99o%$=T+7ӒӒZrz2^KHləx-9+%g'-+s\r^2ޝKOtx.J⍻d\K^ri2K.x/<o%W$}d\w`rM2Lx0.&'mdܘ7$QLnN[-x15o6&%]v+;>drg2ސLJ;x2'U&&M>+w/6f@2LLCx3yJ(0y$y&&d /''x?`2O>w'#x?h2O>w'w$H HHH>;|* t2~A`2~AP2~Bd} $'2$ 'w7$XI~ V"HMH7|JwR$_W-%_$_bVG#HǑ,ّ|Jz$߶V$N2~HddI+E,e%JYINddޓ(2V?%XI=,Z%$YIΗV&tᶞWc6IӤQc5$mضm۶m۶m=\Ny\3z$ _&Y#|M{j$e$dd8ɺ{s$ޭ$dd=Ɇ{|$l$>d'w%&J6K=l$~d 'w%[:I(*|Ru2d'w*%:Iw)ILw<%;:I*I]QNJvI9 *IUNJpxVg2dd]ZNJqx'Wo2ޮdd^NJpxGXr{Ēw%'#KqxgYr{͒Ü$} -9"|Zr{֒$Ŗ$dnɱ{ߒ$ $'w%'&KNJU$>'w%:I/9-|w^rz2~ 'w%g:I/9I]~s$ $<'w &'L.HQ\$"'w&;I1$|gbri2^2'w/&;I1Iɕ{wA&W;I/2I❒ɵNLKM\ 2IɍNLnrxWfrs2>dɭNLnsxwgr=;w&w& MrxhrF{w&&-MsxirO$ޑ< G5y(|jXG$ٚ<$^dݯa'$!<$)'w&O'MIi<$9'w&;I?7y!|nb2%'w&/;I7yI❿ɫ{גw';I_8yIɛ{w'o;I8yIɻNMNK߭ 9IɇNqN>rxsq2>dɧNN>sxt/wX'_&Nrxvo$ީ| w;.|7w$$d]ē_$9$^7'w'C? 7OL߁ '=:|z2L2ddp{ۓw'#$OFL G>9||2J2>ddh{ѓy6OJH1U_HJ쓱MIqx2~rL3t52Q 'u D&I4ddѻL&KTd}LlMJdHi6cƹL]!Ȍk \%d_Vϐ?$dVWL)i3D@fNo"$ʇ$#Y-kr_l:̞4>OC%ɯf&s& 2W2EWdDSAqN$r̛կX2_ ;I~uCpTbs>oIJda'"Nj O&% x2rWN$%$yN.ȒRdDAv4@e$Бe$<:!%|rK_NZo'd'IY1v`I$7z de'IU*/Yِ$j$1Y=ѥ5SɚNJdBdm'I Y'ycdDBs \ЭJw(l$鏃l(^F""$;I %8I|J6uTŐ͒Z'':d trl$t lhi6ɧ%'d['Id;'IRN;Ȏ$i%;;Ijr.N8]-9v $y0I2<"3Q򐽒Ndd_'Is~$@9I(CtT$}%'!rHt=HuT Ü$&;I G&"rdxWrֈ$?qɌ";I N>$dQ9I 9IHNK.ؐNL'I9I20nGNOd$rXra|'I YD1E.r\$"8IFhN.MTU@˝$uV 'cɕN+rUe2DEq4pk$:'I5^ܐCFr?hrd>f'IM%9]!&*/rF ;Iɇ ɝ$ IU:I ro#%K $)"8IB :I*Cɑ DcFq DuT=<$EG ':4DqɓNKSNFF򴓤V<l^#9IzLLwW$邐(KiW /;Ij+NN^MTṕ-N8򆓤$) o%h;Nw$q$]} 9U*򡓤|$)!;IzC>IyOUI20@>w/$ DGJfqIRGq['I.٦+^}#?8IɏN @dc DH~q_W'I I2pb !IHOJd?U0 5.QlGFHdĤ딽H"WgQ"56dDHFOFc#11>+%zKIdd.x}N&HdODBL40H&I4&&_MhL(IK)]%2)9L(-J]Ēi%6y.2]$'' |]̐3ɌIW KIk?$Ndw2S$J s$3' vFfI/"&ZPd߁l:̞ߚ/[%s$RP2g %s%̝hJϟɎN dS4YWLvI<&:ndDLH<&{&JfW6ۙYLI<&:E~dDLH<'&hrP 99509$̜4n8&%Ý"surd&G%59&T:9.4&'$ϓ{rr&$S79-TE]79#񜟜7H79+䟜wJ79'q@M9?ч c o?rQ\wS $q@.۪G-<љ+DyNJD\ ׵".q[A{^ܐx"1Q7DNnIq[r'%n=~ֽ; Na+]rw'$JȽZܗ=!\AHܧ/y(qBN4ĝ y4Qݓ0q{U!O%njf L1t'E>5t-D>KR$ĽLR4@2tEN2o$]o ;3If~/򣙤 SFl&i'b&鎌ؒ Iz@Fp@M!hd&:qFIVawmdĶ>qd2Bb##%62ȉ:2JbG#%6[<2Fb#c%6;؉>2Nb׃#%?@2AbL$%6DĉC2IbgLC$%H[E2EbLg$S%6MԉG2MbL$%QI2Cb?̘$Kl'n0;,䏉;M2Sb)qIs!3'=,M(5 C%%cRľ #qJLlА7dN 'qJز!&n]|2,! &nfBp⮖,Eɢ[Xb,%Hl%7䟉dΗ,!K'n2= l^, "'nɿB߉㧒Cdm2Y)OD_&Ml7d_B"%nꉽ$F➚T"k%nډ%N.f"%n&A⾛lx"%nƉ(INl؊"%n=)Eޜl؜"[%n։]*Mnlخ"%n}+Ch&id&"I'&nfnfs{|d>;E1tOMl{$$=#$zrܙ(fv!f>C[c03I=2ri&)"G%JrHD{@5}F3tOO죑$IĆ9LR@N6|BNI4 T3IWD@N7a&s g&6Yfʇo3I-9L#Wr^ I $z rerLCFrib\f&r\n&iώ\.ȕf6U\m&i\c&_MMl$R!' f>N$]9EL%x[$63I=G0ԁ;$=:!w%rD+B5@3T3I ȃB򐙤a3I;DsB5uHKT(q3I{ 3I] y2H2AN*g$Y3IۋDB7ZF^H-E3I%3I y9H^1W[53IU yL/F!oI o%򶙤+L򎙤ئ$IkJ򁙤C3IDC>6I>I49S3I[33Ia 򂙤򒙤O^6TW/yLRK^Ku3I/yLf%oIzON3IW]3I/y/Q$DK>4T$DK>1TO/LRK>7//L4*Q$23I/6Q$DK~HG3I/)Q$3Iȯf&bQ!/*Q/&Qa/.Q/!Q/)Q/%QQ/-Q/#Q1/+Q/'Qq//Q/ Q /(Q$QIQdL(~L(~TL(~4L(~tL(~ ̘(~ /C%LdDK(~ɟ/9QY/K%&_DKfKdDK(~̙(~\̝(~<=Qy//Q/Y Q/Y(Q/Y$QE/Y,Q/G%K$_DKLdDKNdDKMdDKO_;(~Ɋ◬(~/o%+'_J%KdDKVKdDKHdDKJdDKIdDKKdDK6HdDK6J dDK6IdDK6KdDKHdDKJdDKIdDKKdDbC%;I*~Nfb5s%I&&__Wdw3I/#Q=$dDK6}$dDK3T/9LRK4P(~fǓC/9LE,9LRKO3I/92Q$=&GI*~1k&%%_r◜`&)7$'&_r;rr%I8ȩf_rZ%I*~◜i&e&%g'_r◜(~yf_rjDK.4tB.Jb3IW3I/4Q$DK0t@4T/LRKIDK3/LAn4LnJf3I/%Q[$63Ia&%w&_rm&1'Q{$=})/Q$]$DK2T/yLRK5AKq3I/y"Q'$)3Iy:Qg$CM93IG?yLRK^HE3I/y)Q$3Iɫ◼f&%'_򆙤◼i&y+Q$=&$_򮙤KM򞙤◼(~f_a%I*~f~'|j&%%_򹙤|a&)#_&_򕙤DKI[3I/.Q$3Iȏd&骆(~/f_򫙤*DKd@dDKJdDKIdDKKd!1n/)Q/%QQ/-Q/#Q1/+Q/'Q(~x◌(~L(~DL(~$L(~dL(~L(~TL(~4L(~tL(~ ̘(~/}%H䏉̔(~ɟ/s%3'_2K%IdDK(~l̞(~/#Q9/+Q/'Q'_2o%%_2% $_`% %_p%$_h%%_x%HdDK(~ɒ,(~҉,(~ɲ,(~+Q'_BQY1Q/O%MdDKVI◬(~j◬(~◬(~_IJdDKIdDKKdDK6HdDK6JdDK6IdDK6KdDKHdDKJdDKIdDKKdDKvHdDKv2T$YdDKv5/LM0T=/LRKNd3I/LRKKd3I/9 Q$ 3I!b&494Q$]=$DK4T/9LRK1cGM83I/9>Q$D3I9)Q$AS/9LүXr◜(~f_rf%gI:fs/9LRKK|3I/L҃$ra%IB '_rI%I*~e\n&}5LR0JL*3I:Qk$Z3I .Q$%DKn4Wd&%7'_rܚ(~mf_rDK4t%FJn3I/LBro%IzHO3I@A3I/y(Q$DK5T$CO 3IG?y2qM2T$NDK5/yLaG^0T/yLRK^N3I/yLңmZ%I$o$_򦙤◼e&#=y;Qw$=%&_򞙤k<򾙤|(~ɇf_Q%'_򉙤DK>3˛|n&%_$_򥙤+zU%_I&ߘI*~ɷ|g&%'_򃙤h&)Q$]N_/Lҵkof_2Ĥ%C&_2T%C'_2L%&_2\%'_2B%#&_2R%#'_2J%&_2Z%'_2F%c&_2V%c'_2N%&_2^%'_2A%&_2Q%'_2I%&_2Y%'_2E%S&_2U%S'_2M%&_2]%'_2C%3&_DK~(~/c%3%_DK(~̉̒(~_/5Q&_2[%'_DKHdDKJdDKI̛(~|̟(~dDKJdDKIdDKKdDK(~3ɒ'dDLvL,ɲdD'LO<7&J߉'dDKLVL<[&+%bhO1Y9(Oɪ&xFMVOTdSkf[&k9{MNdēmnm&%u3 lFdDM6qlhfgdD5MHqoN؜"NܤTd:Y)]Em'M[d_F"%--F֞"k%ډM.Nf"%m/Al"%zqb#l(Ȧ1Y 'dď*edDi@M욑>}FvHd>)'jdD@vM쬑 =FHT d^+9ndDfobh!m8r@ &A^ؘ#$ rhbh*ቭ:rD G&Qؼ#$J rlbh3JHF*$Q(O;DD>Ol/2JJtMf+&Q:oDDOl51K~JQĆ,%QL_;DCE|@lђ!U*WKNtVdĦ-6Q^dDEFHlu)KFNZd.5bd艦%c&*/2Vbϗ8_2n#%v6L&&j12Qb_L$ b2i(#%vƌL2&S&{dDFIl"ie.LOjdĶ21Q%=Cb1Q;O9LfNTpd4K#&6_-+MfOsoi2G#s&\̝ذ&$;57[dDGHeY(MN{d6Y4dDG&K$z?7Y2Q;dDHIle Y.'NOt_qDIHVH쒓m!Y)]N dDHVIl%Djb'h-uFZ$k&Zd'$FnbhmwA~$&Fl؈'$ IibGlh&扭yE$[&Vlج'$JKmbמlh/{C$;&N>'$Mkbgh8-~G${&^Γ'$OobhAo $Pr`A^rH %&ChJo G$*Srd{QrLD%&hSo' '$jUrb I~rJh%&Ӏh\o9 g$Wrf{Y&rN%&heoK $Yra" %>ߨ@.Iw,-< DKL|*咫@Iw5.> DKnL|)@nIvrk%%_r{%w$_rg%w%_rw%$_ro%%_r%$_`%%_p%$_h%%_x%O$_d%O%_t%$_l%%_|%/$_b%/%_r%$_j%%_z%o$_f%o%_v%$_n%%_~%$_a%%_q%$_i%%_y%_$_e%_%_u%$_m%%_}%?$_c%?%_s%$_k%%_2%C&_2T%C'_2L%&_2\%'_2B%#&_2R%#'_2J%&_2Z%'_2F%c&_2V%c'_2N%&_2^%'_2A%&_2Q%'_2I%&_2Y%'_2E%S&_2U%S'_2M%&_2]%'_2C%3&_DK~(~/c%3%_DK(~̉̒(~_/5Q&_2[%'_DKHdDKJdDKI̛(~|̟(~,(~B,(~",&%_x%HdDK(~ɒ,(~҉,(~ɲ,(~+Q'_B%+&_R%I俉dDKVI◬(~j◬(~◬(~Z◬(~:◬(~z◬(~l(~Fl(~&l(~fl(~l(~Vl(~6l(~vl(~(~N(~.(~n(~(~^(~>(~~(~(~A(~!(~a(~(~Q(~1(~q(~ ◜(~I◜(~)◜(~i◜(~◜(~Y◜(~9◜(~y◜(~\(~E\(~%\(~e\(~K re%W%_ru%$_rm%%_r}%7$_rc%7%_rs%$_rk%%_r{%w$_rg%w%_rw%$_ro%%_r%$_`%%_p%$_h%%_x%O$_d%O%_t%$_l%%_|%/$_b%/%_r%$_j%%_z%o$_f%o%_v%$_n%%_~%$_a%%_q%$_i%%_y%_$_e%_%_u%$_m}7.Q/!Q/)Q/%Q_/-Q!/2Q/:Qa/6Q/>Q/1Q/9QQ/5Q/=Q1/3Q/;Qq/7Q/?Q /0Q/8QI/4Q/Q/1Q%_DK(~/)Q?%_DKfNdDK(~ɬ5Q/=Q%_2G%s&/;Qy/{%&_2_%'_@% &_P% '_H%&_X%'_DKH䟉,(~R,(~2,(~r,(~ɿ/w%+$_b%+%_DK(~ʉ◬(~/Y5Q/Y=Q5/Y3Q/Y;Qu/Y7Q/Y?Q /0Q/8QM/4Q/Q/1Q/9Q]/5Q/==/3Q/;Q}/7Q/?Q/90Q/98QC/94Q/9Q/y1Q/y9QW/y5Q/y=Q7/y3Q/y;Qw/y7Q/y?Q/0Q/8QO/4Q/Q/1Q/9Q_/5Q/bQ!/*Q/&Qa/.Q/!Q/)Q/%QQ/-Q/#Q1/+Q/'Qq//Q/ Q /(Q/$QI/,Q/"Q)/*q DNdDKMdDKOdDKfLw>Q?$_DKfJO9Q/%Q$_2k%MdDKfOȏ(~ɜ̕(~܉̓(~/7Q/?Q/Y0Q/Y8QE/Y4Q/Y<(~ɣ<(~<(~ɓ<(~Ӊ<(~ɳ<(~◼(~ɋ◼(~ˉ◼(~ɫ◼(~◼(~ɛ◼(~ۉ◼(~ɻ◼(~|(~ɇ|(~lj|(~ɧ|(~|(~ɗ|(~׉||@OMDKODK~LDK~NDK~MDKf@dDKJdDQ2L%&_2\%'_2B%#&_2R%#'_2J%&_2Z%'_2F%c&_2V%c'_2N%&_2^%'_2A%&_2Q%'_2I%&_2Y%'_2E%S&_2U%S'_2M%&_2]%'_2C%3&_DK~(~/c%3%_DK(~̉̒(~_/5Q&_2[%'_DKHdDKJdDKI̛(~|̟(~,(~B,(~",(~b,(~?/Y"Q&_d%K%_t%$_l%%_|%J߉◬(~Ɋ◬(~/o%+'_J%KdDKVKdDKHdDKJdDKIdDKKdDK6HdDK6JdDK6IdDK6KdDKHdDKJdDKIdDKKdDKvHdDKvJdDKvIdDKvKdDKHdDKJdDKIdDKKdDKHDKJDKIDKKDKH\#Q(~1(~q(~ ◜(~I◜(~)◜(~i>NNODKLDKNDKMDKODK.LDK.NDK.MDK.ODKLDKNDKMDKODKnLDKnNDKnMDKnODKLDKNDKMDKODKLDKNDKMDKODKLDKNDKMDKODK^LDK^NDK^MDK^ODKLDKNDKMDKODK>LDK>NDK>MDK>ODKLDKNDKMDKODK~LDK~NDK~MDKv@dDKJdDKIdDKKdDKFHdDKFJdDKFIdDKFKdDKHdDKJdDKIdDKKdDK&HdDK&JdDK&IdDK&KdDKHdDKJdDKIdDKKdDKfHdDK~(~/C%Ldĕ&S%NdDKfI/̚(~_/-Q/[%s$_2g%s%_2w$'Q'_2o%%_2% $_`% %_p%$_h%%_x%HdDK(~ɒ,(~҉,(~ɲ,(~+Q'_B%+&_R%I俉◬(~*/QU/Y-Q/Y#Q5/Y+Q/Y'Qu/Y/Q/ Q /(Q/$QM/,Q/"Q-/*Q/&Qm/.Q/!Q/)Q/%Q]/-Q/#Q=/+Q/'Q}//Q/9 Q/9(Q/9$QC/9,Q/9"Q#/9*q DNDKMDKODKNLDKNNDKNMDKNODKLDKNDKMDKODK.LDK.NDK.MDK.ODKLDKNDKMDKODKnLDKnNDKnMDKnODKLDKNDKMDKODKLDKNDKMDKODKLDKNDKMDKO&/$_b%/%_r%$_j%%_z%o$_f%o%_v%$_n%%_~%$_a%%_q%$_i%%_y%_$_e%_%_u%$_m%%_}%?$_c%?%_s%$_k%%_2t%C&_2T%C'_2L%&_2\%'_2B%#&_2R%#'_2J%&_2Z%'_2F%c&_2V%c'_2N%&_2^%'_2A%&_2Q%'_2Iq4Q/H -9W{V_*93y{~{px2AYP+ El<Ʈֈg(W: @F"d,2L@&"d*2 <@Df"O!d.2yyy<,@"#E%d)2 * Y@V"u d-yYl@6"wd+ yَ@v"# "!# S3s d/ُ@DB"_#7ȷwȏ(r 9@~FN"_W7,r9\@D."*r ħ{% I$GR )THj$ IG2 LHf$ ɆdGr 7#9\Hn$ɇG B-Har+R)GJ %RHi R)GnC* JHe R܁܉܅TGj 5ZHmR܍G F=Ƚ}Hc~ i4GZ -VHk yiG: NHg! tGz =^HoQ!1 ٍA>E>C>G@"K+ 5r9||||A"?!ǐ g$r 9A~E~C"ߑ?O"r \A"אȿH|DI$E!ɑHJ$IE! HF$ɂdE!ّHN$ɃE!HAr R)܊E!őHIR)E!ې HERTEnG!w w"w!ՑHMRE!w#HCrr/ri4E!͑HKiED!HGytE!ݑHOayyE!!@d2 E!ÑHd2E! Dd2LE!ӑ'ȓL)d2E!O# "BydY,E^F^A^E^C!ˑJdYE!o"둷 FdقlE!"ۑN}C#cdك||||E!ȗWAkr9E~B!ǑI r9E!# ȟEr\E!!# ב6͉I$C#)H*$5IC#H&$3ɊdC#9H.$7ɋC#H!0R)C#%H)4R)C#!H%2R܎TC@DB#5$` xY ͜:A"2]wUHCI<Ӽ'J r/sC#I|Mh 4a?U͂$9sZpZI|=l @BM $MI|\i;=tB:#!]H7;Y<,B#K+ȫk2d9YBV#kב7:Md=6وlBA6#[6]d;ى|||||Bv#{Oϐϑ/>d?r 9|B# "!#? ?"GO18r9B~AN#g_ߐ9w_}s$W㕆xz-l Wz(IH2$9IBR#iH:$=ɈdB2#YH6$;#MO؛+sUN9Ս?;ɃE!HAr R)܊E!őHIR)E!ې HERTEnG!w w"w!ՑHMRE!w#HCrr/ri4E!͑HKiED!HGytE!ݑHOaWȡwI|hwE11jS3 Hb [9͜AASp!Q?=aa0H> Q Z 39cqtg tMkL&OE9?zuϦLg $2y ~fS3cO#,5:zu9/3 XWz YZ˩YA 'x Z_/=N\ZV_g[6MԼCfj [چlg{}|15 ϻCͧ|||e~{%+:ȜCtje!) 9?u:JO1|IV?Ş45gϯZg9Z#0<_Oֺ\B.#WX*5אoJs&Is㜤$Cqr jR294inz+ɀddLH q]œH6$;sp]7ss"09/5H*~ -tNsaJWQSt@JUɥ2HYRq@WEj*!uUvQs5w"wq]YR9L" íAfr}k55tGMcjGpǚR i[PiEA#*ڰöyv@WG]y.tJQ@>D>B>F>Av!=ȧg^d9||DF!oo#Q'r9DN! 3ȯoY;r\D.!+U7r)퍒I$C#)H*$5IC#H&$3ɊdC#9H.$7ɋC#H!0R)C#%H)4R)C#!H%2R܎TC@DB#5H-6RCF# H#^>1r?i4C#-H+5i!1 ٍA>E>C>G@"K+ 5r9||||A"?!ǐ g$r 9A~E~C"ߑ?O"r \A"אȿMn$HR$IDR!4HZ$ɀdD2!,HV$Ɂ܌Dr!H_< D!!Pd2DF!1Xd2LD&!)Td2yd?r 9|B# "!#? ?"GO18r9B~AN#g_ߐ9w!1 ٍA>E>C>G@"K+ 5r9||||A"?!ǐ g$r 9A~E~C"ߑ?O"r \A"אȿMn$HR$IDR!4HZ$ɀdD2!,HV$Ɂ܌Dr!H_< D!!Pd2DF!1Xd2LD&!)Td2y@>D>B>F>Av!=ȧg^d9||DFI<<$ "1{9E~bcAV7xW`ITZ $ x+]u6Ȥ힔?\O =;$HIH_< D!!Pd2DF!1Xd2LD&!)Td2y@>D>B>F>Av!=ȧg^d9||DF!oo#Q'r9DN! 3ȯoY;r\D.!+U7r)ˍI$C#)H*$5IC#H&$3ɊdC#9H.$7ɋC#H!0R)C#%H)4R)C#!H%2R܎TC@DB#5H-6RCF# H#^>1r?i4C#-H+5i$?R)BnA #E[H18R)BJ#eH9i4BAEC##MH39iB@Z#mȃH;=tB:#!]H7;-$ 5[\"JMQj!*$~ni|ek 24 eh g$WA猧4 RwU6H gU$UTC@DB#5H-6RCF# H#^>1r?i4C#-H+5iGH芧{$f?r HkTdW R `xax{(JNw[;{Gr 9GN ?#'S/i +r9G. "Ke r\GEnq$A"ɐH $% IA"H$# ɌdA"ِHf$' ɍA"H R)AnE"ŐH $R )A"mH"R TA"#Ր;;H &R A"H!i܏4A"͐H % yiA""H# !1 ٍA>E>C>G@"K+ 5r9||||A"?!ǐ g$r 9A~E~C"ߑ?O"r \A"אȿM7(IH2$9IBR#iH:$=ɈdB2#YH6$;ɉBr#yH>$?R)BnA #E[H18R)BJ#eH9i4BAEC##MH39iB@Z#mȃH;=tB:#!]H ݃${Ljz"#X7( )I|k j$qd sIDg2 GF #Qhd 2G& Idd 2LG@f O"3Yld2<<!1 ٍA>E>C>G@"K+ 5r9||||A"?!ǐ g$r 9A~E~C"ߑ?O"r \A"ׂ$E$5]׃$>r(IrؕIƵ3'EWADRѕI Ztn?$5$j5S2CJK$sKQY$fCs9H.$7ɋC#H!0R)C#%H)4R)C#!H%2R܎TC@DB#5H-6RCF# H#^>1r?i4C#-H+5i!1 ٍA>E>C>G@"K+ 5r9||||A"?!ǐ g$r 9A~E~C"ߑ?O"r \A"אȿMyn$HR$IDR!4HZ$ɀdD2!,HV$Ɂ܌Dr!BQOtctgjNRs_X4{>W&Ɯ9VPBy1'PByPAyʋP^2W 5(CyʛPނ6w =(CʇP>1O| 3(CʗP5o| ;(CʏP~3_ 7(CʟP7-ćJp(P"DAI%P@I %PR@I %P@I %P2@%P@ %Pr@ %P@ %P @)P@) PJ@) P@) P*@P@ PԀRJ-(ԁRJ=(4J#(4J3(͡J+(J;(tJ'(tJ7(ݡJ/(J?( 2 ( 20(á2((28(L2$(L24(ӡ̀2,(́2<(,"(,2(ˡ*(:(l&(l6(ۡ쀲.(쁲>(r!(r1(ǡr)(r9(\r%(\r5(1PC&[PnC.{PCy!GPCy)<%(/CyʫP^:7 -(oCyʻPރ>|#(CʧP>9/| +(_CʷP='(?CʯP~;? /(CJ [J|( A %JPAI % PAI%PRAI % PAI%P2A % PA%ROB%}.7|U(yT~L~(PH^MG WRJIG)PZeǔu~]hK/ʜ{.-ΩίdJRw:U#VE:lUVRJ4PjB6:PB>PBi1&PBi9PZBi56PBi=P:B3.PB;PzB7>PB?PBe0!PBe8PFBe41PBe< P&Be2)PBe:PfBe69PBe>PBYe1%PBYe9PVBYe55PBYe= P6Be3-PBe;PvBe7=PBe?PB90#PB98PNB943PB9< P.B2+PB%u(7܄r m(w܅r}(<c(O<<e(@ykP^7m(@y{Pއ|c(@gP>/|k(@wPg(@oP~?o(@ d[A%0(P"DBJ"($J2(ɡJ*(J:(dJ&(dJ6(١䀒J.(䁒J>(RJ!(RJ1(šRJ)(RJ9(TRJ%(TRJ5(աDC&ZPjC.zPCi!FPCi)fPCi%VPZCi-vPC#NP:C+nPC'^PzC/~PCe APCe(aPCe$QPFCe,qPCe"IP&Ce*iPCe&YPfCe.yPCYe!EPCYe)ePCYe%UPVCYe-uPCe#MP6Ce+mPCe']PvCe/}PC9 CPC9(cPC9$SPNC9,sPC"KP.C*kPb\rM(ܖyG:]1<yByN:RO_<֋c^~"}U(Ay~7v,Hy1oKq_}~w=(BP>)Ϡ| (_B P-|(?B P~+ߠ(B PăJ(aP¡D@%!DPCI%)dPCI%%TPRCI%-tPC%#LP2C%+lPC%'\PrC%/|PC) BP C)(bPC)$RPJC),rPC"JP*C*jPCRJM(ԆRJ](ԇJC(4JS(͠4JK(J[(JG(tJW(ݠtJO(J_(2@( 2P(à 2H(2X(㠌2D(L2T(ӠL2L(̆2\(̇B(,R(ˠ,J(Z(렬F(lV(۠lN(솲^(rA(rQ(ǠrI(rY(砜rE(\rU(נ@PnA PAPAy P!| (B P%| (BP~# (B P' (qK<($%JH(QPBI%1$PBI%9PRBI%54PBI%= P2B%3,PB%;R+9䂒J(yV) |U!1PA)PJA) PA)P*A PA%J (5ԂRJ(uԃRJ( 4J(M4J (-J(mJ(tJ(]tJ(=x70Rϕ _J_(ŻU eCRl~0.C^{}paR7~#xl}ߑe41PBe< P&Be2)PBe:PfBe69PBe>PBYe1%PBYe9PVBYe55PBYe= P6Be3-PBe;PvBe7=PBe?PB90#PB98PNB943PB9< P.B2+PB%u(7܄r m(w܅r}(<c(O<<e(@ykP^7m(@y{Pއ|c(@gP>/|k(@wPg(@oP~?o(@ [A%0(P"DBJ"($J2(ɡJ*(J:(dJ&(dJ6(١䀒J.(䁒J>(RJ!(RJ1(šRJ)(RJ9(TRJ%(TRJ5(աDC&ZPjC.zPCi!FPCi)fPCi%VPZCi-vPC#NP:C+nPC'^PzC/~PCe APCe(aPCe$QPFCe,qPCe"IP&Ce*iPCe&YPfCe.yPCYe!EPCYe)ePCYe%UPVCYe-uPCe#MP6Ce+mPCe']PvCe/}PC9 CPC9(cPC9$SPNC9,sPC"KP.C*kPb\rM(܆r](܇C(<S(Ay3(/@yKP^ Wu(o@y[Pކw}(@GP> O|s(_@WP o|{(?@OP~ _w)'!}ßP~?XqK<($;cKqLp~L<)DAI|h")`&J2CI!}6syæ}::ljx/ߍRMVc)_{z(d Jf(Yd Jv(9䄒 Jn(y䅒J~(RJa(ER Jq(%R Ji(eRJy(TR Je(UTR Ju(Pj@ P@ P@iP@i PZ@i P@i P:@P@ Pz@ P@ P@eP@ ePF@ eP@ eP&@eP@ ePf@ eP@ eP@YeP@Y ePV@Y eP@Y eP6@eP@ ePv@ eP@ eP@9P@9 PN@9 P@9 P.@P@ (ס܀r-(܁r=(<#(<sP P^U(AyPބ](AyP>|S(AP|[(AP~W(AP%'n%>P C % JB($JR(ɠ$JJ(JZ(頤JF(dJV(٠dJN(䆒J^(RJA(RJQ(ŠRJI(RJY(堔RJE(TRJU(ՠT PjA PAPAi PAiPZAi PAiP:A PAPzA PAePA ePAePFA e PAeP&A e PAePfA ePAePAY e PAYePVAY e PAYeP6A e RWT.}sU솯e/|>(zPJ!yC9?Q(ǜOC9_u9?u3R"|pU׳RaIq_=XջL㾸?Sk2+PB%u(7܄r m(w܅r}(<c(O<<e(@ykP^7m(@y{Pއ|c(@gP>/|k(@wPg(@oP~?o(@ [A%0(P"DBJ"($J2(ɡJ*(J:(dJ&(dJ6(١䀒J.(䁒J>(RJ!(RJ1(šRJ)(RJ9(TRJ%(TRJ5(աDC&ZPjC.zPCi!FPCi)fPCi%VPZCi-vPC#NP:C+nPC'^PzC/~PCe APCe(aPCe$QPFCe,qPCe"IP&Ce*iPCe&YPfCe.yPCYe!EPCYe)ePCYe%UPVCYe-uPCe#MP6Ce+mPCe']PvCe/}PC9 CPC9(cPC9$SPNC9,sPC"KP.C*kPb\rM(܆r](܇C(<S(Ay3(/@yKP^ Wu(o@y[Pކw}(@GP> O|s(_@WP o|{(?@OP~ _w(@_P@%RAHq__?s$(yI%1|U1I ~Lr() Jj(iJz(d Jf(Yd Jv(9䄒 Jn(y䅒J~(RJa(ER Jq(%R Ji(eRJy(TRIYe)s\*UUTR]RjHq_ ?RHqӬ4Iq_C/ GfCu5J(M4J (-J(mJ(tJ(]tJ(=J(}( 2(C 2(#2(c2(L2(SL2 (3̂2(s̃2( ,(K, (+(k(l([l(;삲({샲(r(Gr ('r(gr(\r(W\:PnB6;PB>PBy1'PByPAyʋP^2W 5(CyʛPނ6w =(CʇP>1O| 3(CʗP5o| ;(CʏP~3_ 7(CʟP7-ćJp(P"DAI%P@I %I? P-~"' RĞ4Dgy=&&w  RYͫw^HzaL)c̿3b4;m͒=[C>د nmblT`JDH-̧Ӣ|ZBȧ%iI|ZŖ%i)|ZJʧii|ZZΧi|ZFɧeiY|ZVͧeƋ}U?z>aĆ!O'@s4}M5A!J^ *DĖ_,9}adl޿'q$C %'Ilch~}z_':K ):W :~}v@EGdV 3Oh,__.QQ$Q 5 {߃OzoǑ;r8_7?x8HW^%:*TnEy(GOl#ۈz 1kh v j#ۈz FamD =g#lDmDpbK ,7FZ7"imD =wL#hclxK.g Hn#Rl1F$oDmDrbCFF$%6vnz֍(nDmDqQbCᝧt qmK_6?VQFc6((n#Jl1\QFFPl=bHl$6m$6 =wLw Zj#!Pl1<Cc$*g FBpm$6m$6L1r#HdH$6^4݋&2Hm$z w7m$6 =k#l#XlMVo1FbHlH,66sņõHlH,6^41l#1Dlw߿Hl$6m$6 =n$F$FpI~#Fn#cFj#Fn#xrKmH)I1%FRn#cx{1䥤}n;FRn#cFRn$5Hm$z wHJm$5Hm$ ɔdF2dF2)Bcm<j#Ll1u#]7m$6 ={]4l#\l/%#HnH.66sņõHnH.6FrF 1cME?H)~#F n#c׾Rk_)6Rp)ĆõHaH!61F FJq4Y䍑RHIm4Hmz w/ESm6R =k#%l#%Rl1u#%l#%JlVy?Hl6Rm6R =nF*TF*p}׾Rm6R =k#l#Zl~.z~#5o6Hmz wHM׍fbCឧ)6Rsņ=OIMm6HmßiԺi6piĆõHcH#61% =1Hmz wHcH+6gػ;iC l6Қm6Ҋ ={LIK)i6riņ]7u#FZn#c׾Ri6rƧ -otjHG׍tf鸍tbC躑l#Nl1F:HgH'6tF:tFz'jCFgH/6~O`zFzp_OIO_OIoH/61%==7Hmz Fzj#Fzn#$c׽12gg0mdz w@׍ f bCS2cJ Fp fbcSmꍑ1tLތQlxTPnd4mdzpЖQl2md62 ={LH)62rņ=Hmd4o#xsL&1=I.#YD&ރ9=I #Lted~3?ރ'r{2<9׃Ӿ/y2[x$egP5*~2|=,ϾGt t}U8cXdAfqpfzYD1 3l#3El4N YG2d1mdz 4 =7b"63 cf1mdz wb*6o8#kh*6"hjl#+Ul1W#hca*6FVFVpmd6md6;o=9oljF׍lfٸlbC躑l#Ml1cJ6zLf&6lF6lFv_Ȯ^'`d7mdz Fvj#Fvn#cFvnd7mdz Fvj#Fvj!c,mr>-O>O+ >O+ӊ>O+J>O+>O*>OӪqZSYMhcSuA9k\5Nq9ük\Y/=0q9C8=k\BSlL[ʇ9CfI)6f9bC`6rm6r =k#'l#'Sl1}sNj#FNn#8_ȥ֍\te%6\F.\F.pfsm6r =n6rm6rz=7FnN{M'Fnn#cksm6r =gRh#"VbC^Mm6mȣΩs|F>p׍|tg'6g/6ݜrϕ~#?o7mz wO׍fbCOm7mz wOm7m)@gޓR@l=)6 pĆofbC^-@0(mz_FFAѾ{czcT6 R6 rņõQ(hQ((6~ o4(mz R(hQ($6VϛBF!BF!pm6 m6 ={L)D)6 qĆ=-Dm2(mϽ◼1 ha-lQ(,6^0݋6(mz Faz}FancE S6 sEF<.QD(Bm1(mz FjFncǔ"RlQDl1cJjFnؐO8QT]*J}5(mz RSm6 ={L)J)E6rEņõQ(jQ(&6fOz>OkF>OkӚf>OkZV>Okv>O:N>OӺn|hYG|zSh׸hYM׸h׸hY/:4Fp9l_a]-k=k\y_ƨ!6~Xjtu5=0ۨmz =$5{Hjm6j =kQlQCl1ܽQ jF n(Vk1j|FMncפ4ۨmz |&=߮iQۨ)6FMF-1(])VycRF-n2ۨmz ZL-z-F-ncBcm~JRjQKl1cJ-jF-n7!V{k{km6j =ߨM6jsņ[7jڨ9<)aQۨ-6FmF.ƨ֍:tݨcQۨ#6:F:F֍16jQGl1֡6m6ꊍl6a7F]ߨKu6ruņõQڨkQۨ+6޺Q;4FFBRj.QWl1F]jF]n~fK1k5zfzbC#S#SlQOl1\zfzbC^߯Gm3ۨmk]Q_ScJ}F}pߣVGF}ncx6Zg F}p׍F}F,v 1{ؽu 6p ĆóA~om`рh 61_$V bCEP 6p FfVP l!Pl1s؆FCnc=Bcm\3FCncFCjFCnh hox߷x_M6qĆ#\Aǰhm4z Ghs`8cXm46 =klM^{[ט"<!to]cq,ypt~-B5g?C[yp<[ט>yc4z '5Q߷IuM~4g_^ oB71;h׃&@]h#(j_YaфMD]PM6pM_~|M>)]m46 =k)l)Tl137gnjєh*6FSF3QCLhGxfbff͸fbChFm43hm4z F3jF3nc6Q6qZ7uFsnc6S6sņ}jsf͹bCល66m46Z#j7F elBl1\-f-bCwقwlBl1nAm0hm_=-$-uf-bChIm4hmz FKjFKncǔFKF+Q y3{'xcR6ZQ6ZqĆõъheъh%6~o2hmz uVF+VFkѻ˛uh)1Fknc6ZS6Zsņõњhmњh-6њhmњh#6:jm6F6Fp_{oC_{ocцh#66F6F16fmbߦ<:ǔfmbCιږl-Vl1F[hkіh+6u#4l-Nl 1کe e3hmz whG׍vfvbCö6qĆõюhgюh/6Z͹toҞSڛm6ڋ =hO6sņõўhoўh/6{S6sƲl7FuL@)6:pĆ]7:uFnctlAl1ulQl<(uDպё6:rņˎ96:rņ,fcXmt6: =Hmt4mt3Z4Z7:uF'ncǔNlIl1ܽh'dщ$6NF'NFgQiߗ>Yl3Yl1ulљ,613=t6mtz FA[߫ǰmtSVW{7FntF.Fp]~FncFnt1mtz FjFnظt~]9lWzl+Ul1cJWzLjѕ*6yJWzl+Ul1<Bcm,HS믏X]aѕ&6~¿xctSǔnlMl1k_赯nfݸnbCFmt3mtz FIwhjðOχ9=|ZO˧i}|Z_ϧi|@6ȧ iC|P6̧ i#|H6ʧic|X6Χi|D6ɧMiS|T6-]ָQtqꮎy׸1ܽQw7n^5qz wܝ׸|.ku{5Nvѳ=1z_zaу!6FFp=Fnc>-4;aу)6n7FO}#ziѓ)6FOFOpm6zm6z ={-'l'Kl|:EϷ{m6z =klKl1\^f^bCEm2m9j|Qoޡ{rz;C!l7[l1|Fonctl7[l1FomF&>b#t}o]c_a=x̿};G3mz FIhe3F?nH11x17~/6SFpm6m6 =O6sņó<4FІaџ 6i ״m 6 =kc1lc1@l1.@w6pĆ=@)6pƼto1PHm 4m z t =7h1(6~c o 4m z gfAbf[l 6m 6 =kc1lc1Hl1\AfAbCEQ6q?''}7`uMk05lc01Xl1c`zLl1,6~c0o 6m z F~W]a1"6*k2;i3o!Vc1a1!6j }{Fm6F ={LA)#6Fp#Ć݋{f#b^]ެ1RSFcHHp#~cHnccǔ2lc$1Rl1#uёf#QbcePc1e1%6j 96FqĆ=ǔQfQbC!6bڇ(*3(ncؐ,Uc1m1-6^t4݋6mz wM׍fbC!6wQ'3hnc8Tc~cnccx{.16ƪa1#611֍16>nchs}cXXp׍tk1+61e,=5mz <4FOg 8"y`oqqz8q8p?G\}8q8pm6ƙm6Ɖ =ؘ$4Fa1/6u 1^7xxp׍to1/61e<=7mz {7mLrKeo !޽Ć߇oL0ۘmLz ^ v/ pmL6&mL6& =A fb_}ScN4ۘmLz Dz}cDncc6&R6&rņõ1ژh1ۘ$6׿6%koI'O2ۘmLz |nccjccz$u$Mg'S"<]!CֈfSxʫIJSTg{D΃|9׃iv{YI4uOҴ'iٟ׃i1c4`4Lz iifz0MD1`1lc/Ozџ ,>1çi|l6ǧi||-i|bħ-i|r§i|jƧi|zmi|fŧmi/e;_8MWfkktM5Nq7ݼMktYtzԛn^5nqz OMktB1Cl|uߧycP1#>c nccXfk,36fp3ĆϠf3bC+͠6fm6f\OScn?gm6f =}g͞i1ۘ)6k:3k:36fr3ņõ1ژi1ۘ%6^l$~aoY,jc,ncc6fQ6fqĆ=̢ǔYfYbCgQ6fqƨ[Ƙ'0;'0lc61[l1lߘm1ۘ-61e6=6ۘmz ljclncx9vs)7n̡9p?guN}9p)s1encc{99\jϕycU6Rs6rsņ]7uc\nccbk1s6rsņ}o.1lc.1Ol4aiy1)yfybCژGm3ۘmz w17m6 =ṇ6m6拍5\.o|jc|ncc9||p~c|ncc|q{YqEszc,P׾k_ 6p Ć]7ucnccn,0Xm,z jcncz.P 麱lc!{OXHm,4Xm,^Tc6R 6r WB"Qȋ?ꍱHXDm,2Xm,z Sm,6 =kclcHl1"jc"nc^cXlX,66sņ=]Lam,6 =kc1lc1Dl7LK%%pm,6m,6 =]BK6pKĆõXbX*6M~KRRWc{rm,6 =kc)lc)Tl1 RK6rF'XSef˸ebCᾞlcLl12XfX&6km˨ef˸bGI덱\XNm,7Xm,z wXN׍f˹bC麱lc9\l1\˩f˹bcWxcPǔlcBl1{k;F{3;smO>mO>O;ӎ>O;N>O;>O;.>OӮ>Z]ָvuNSm7q]8={-f;ݼmkvYo;=m7q]8=oN׸5Nco;o=0mz wovm6v ={o0mz Nة>gug}NNpF;hNncc;NNp׍N.do]꘲Svm6v =n.].p׍]te%6].]nگ~7nuLM)6vsņõm-6~c7o6mz njcnncؐ7n=p){1encc6P{6p{Ćõc+6 ycUt{6r{ņ>{5mz ^jc^ncc{ѽ^>q%zcS6Q6qĆ}x}x>ncc6Q6qĆýg/6$\1e?=7mz ~z}c~ncc)y~~p6m6:7Ɓ o8 6-{Wqlq@l1{{m6 ={r08mz w8@m08m_xcTǔrl qPl196qĆ]7Q6qF̗[y㼲q8oq8/6{78mz yzMyncyGO?Ƹ޳s!޳slqAl1u]7.m\6. ={L@)6.pĆ]7.P6.pFyRպq6.rņ=OHS.m\6. ={r\4۸m\z EjEnJk<Ƹ^C`]2۸m\z uKuKfKbCޯ}ޯ}lqIl1<ib1KfbXgm}qYS.ceep~enc{t/zl2qYl1cejenbԙ<Ƹl\6m\6 =+=;W6pWĆ݋^{+fW+bC[pڸbq۸*6ߘojq7m\6 =n\UUp׍tݸjq۸*6~*ql*qMlLѾ{Ժq6qĆ=OFSm\6 =F6qĆ=\6m\|9} vӧi}vקi}Ч=i}ԧ=Ӟi| >EO{٧^i}>MO{ۧχ5N+]SLSTx\L1q1|5Nb(Ƽ5.F8={-&^1q1|5Nq1t1q+뇃q]}Vf׹bCӽuupuncpS6s7Fؽ7ԵZ  pmܠ6nm6n =nܠ  p׍ MѲnxcTT79MMp)71Mnc6nR76nr7ņ=߾Im4۸mo6+㖺'Vݓ{lqKl1\CڸEm2۸mz wݸEm2۸m۫16=6۸mz fbC7nmmpf;b#LrUxcQn1۸mzp5FjqGl1~~m6 =kqlqWlԘ1twufwbC^K5۸mz wݸK׍fwbCG.ql.qOlLzc E7~0=ncGlqOl1\{f{bC7Q6u߻.u.Y}ރﭻOWw=xBݧ7?}9}ߺ9o~lPl?y3uCCp?fbCxHm<4xm<z CjCnNyc< }$6zfWG#nc={D{lHl1\GfGbC#Q6qvJ:X]xLw6sņý-m<6 =tl1Xl1cMrxMs'fO'bCSc'p{ncǔ''S]=O~)o<5xm<z wxJ׍fObQvU[I`)Zܵhqw(Ew+R<@ AB׳ЮEzY3g2qڸq۸@6d >\6.m\6.J`b\sE8\T۸m\$2qڸq۸H6d o\EE!cpjKdcT֛Dݸ%K%!cKp%lِ1K%K%!cpKjdʽ`Lehel2ِ1xq6.cɆpNq۸L6d ehel HkۢWkL+hl ِ1++!cpW+jW+dCu qEm qlT42O&Ua*qUm*ql|N 甫jWdCkثp {Um*ql=U51t#kWD/z 6aȆ5X7m\6 v vMmql5h5l:8 \)c:7q]m:ql|rSm\6 a/z]m:ql|:q]m:ql|nzqC)7rCmql|Nj7dCs 8P۸m 27j7 Qtǩ~A<8< l#lFm ׍ X76 !c^4R6nR.61n=pMl&ِ1MM!cq֍j7dCsMhMlZ M[bN[jC6nA6naȆװ-lِ1om[jd#q|X܆jdC6nC6ncɆpNq۸M6d ^7nC6ncwFp߃ywĜr)w6`wȆm܁6m6 ۸mQ۸m!27@w6`wFkNcbu sn]qd] 0]]!cul]]!cp]l.ِ1]=tOgDq6aȆ=X7m6 ۸mS۸m#27A6aƝ{0ĸ/}X7m6 Ým'-jdC6C6cɆ7C6m'|`9,c-c,c!ǖ'PXeeeee,222a{m{c{kEYƢ-c-c,c1OXgؗ8=&j\2Nt)X}`u 5.j~L5N`V׸`\ォ|M k\liΗ&皪%i< 9*3|&lِ1LoajdCkpM@mlh K^ͻu ^ټ[v"E{[{%=?}sqovqu=q=xDɽL6zփG׃Gte pp8H,Or|Cȁ#XE<1:HmB6<[έd"Q6BȆ!Fm`!dCtB6B!c"Q6;yعbc1&l@1/cc!c3GQ6cɆcX7m<6 C6cOP.D?O6`OȆX7m<6 xmCjKѼ/Ź/sm_m6^ S^uKK!c^%E_m6^ ?_xxE6=oʹ5g"%K8NiRxm"2 x xE6d ^7^Jmln6^m6"Ƶx3tĈp0{_dC{_jFِ16a#6"!cFFA6d ދF@jkA_Hgbtz}kl5ِ1x6^cɆm6^m6^ x mVxm!W{i`Ȇ@6d ^7>Amlhl#lL6j&FӆYĐ ۇub6b!cR ٰ-b6b!cp1FF C6d {J cx9y'0s󝤏qS">E{IkGv^9yq4k|To..{_=q=D|5>+>'\>ݗ1;Iw>|91x='O|"2+>A6>adk i21b#?b6bX!c>"ֈXXl#lF,mĒ ۈ6b6bd#E[)61> jdC }'gl3ِ1gg!cpj/dZ_Ĝ)_6`_Ȇ''B6d i}Qm|!2m|Qb8e?hNzg89\,c17˘e2iųy[|,c-c1?˘e,222222hKfKnKaKiKeKmKcKs_L \` ) qq\PSu :b8.hoOָ8.k\T1`qA5O.d\531\ hEmp!2]\P좶m F..7rQp6\Ȇ{#hEmp%Լ711\]xfW WlÕlnº᪶m ypUp6\Ɇ+᪶m%""661 qjqdC6Bq6bqɆӉvm6 ƅ6m6,GǬihbw\.چF6d OavܝچF6d c3Fz|Ck p#2Sܠ 7 7lÝl3#[]p66ܱ w!c놻چ;N6d o~]mp'2mmcdѶgbx^j؆ِ1E." lÃl|NsچA6d ox@j؆'(Pā:& =mx  OX7<6< O!c5'\zmxbdC6< O OlËlly>ymK)^pNR6Ȇװ^p 륶mx )^pNR6Ȇ/hKm ۈG66l jٯO؈mSۈm#2`݈ۈG6d n#Om#lxFj>؆ِ1 hGm!2>nm`>dCuQ6 :i_ԍnWۈm'2ڈۈO6d n#>_m#>lnć6m6|Ƃ'ׄU61|].[_ _l×lh~,چ/K6d nU6|Ɇ{Q_hWmH@6nxUb%#3Om$6  `/@m#lHj dC6@ 6`~d#gU41syGƏl^=:چG6d wG6l,~j~؆ِ1xuOm#2mmadc&{_j؆?ِ1xu_m'2mmcdC?᯶m 5`l@6udjFِ1.l#lFm 66dD7Y&FB{JB{JBFB!cg[g[m$6 Pm#!l|NIm$THm$"&.mb$r%rA%RHm$"2_&kDjDdC6A6aȆm$6m$p䕘l,5/y5w[v"E{ޭK $V;Hlw`.p[w?{Gq^{׃$t4Z[\qC/J~\ݗ1x=H$Q;HAr ci6M׃$$BI$jIdc'31 IjIdC6BI6bIɆ{̤Z$UHm$%21BI6bdudc =fF H6d 6 k@@l#l@pF H6d ^7@@l#0 #sHF6l$SHm$#24|4F2l#ِ1xHF2dF2!c H HN6:/&Frv6cɆpNIHN6d n#9\m#9ln$6m$6R&XB)`Bm#ln4vpظxRobhm6R ?>Bm#l[p)j)d#8ԥ)EH FJFJ!c֍j)dC디pRm#%ln6Rm6RT[篟H%~_M_M HE6d ދh*TF*!c ֍TjTdC{ZTjdљǶ61R^45ESm6R H mVHm&2HHM6d ^7RC6RciȆL4b aӨm6Ґ NNFm# l|/< OHC6d NImQHm%_ H+FZX7Ҫm6Ғ H mUHm%2_딴jidC﹦6Ҫmp0agv22222222222e,e,e,e,e,e,e{XXAX!XaXXQX1XqX XIX)Xi0^Nv:uKk\:q2f5|f5ƥ5.8F`oN]jtƥS׸txKO6*'S6#XSkj鱍dCp^m#=lFzh#Fzl#=ِ1FzF1,&F7g}s F!c0Fl#ِ1xoF62`Ȇ jdyf212֍jdCu##62bɆmd62md62 ׍FFF&pь&F& fRȄmd"2?9 :9F&l#ِ1n&Im#l|/&Im#l8,pNɬL6d OeVȌmd&2aȬL6d ^72C62cYF SBޤ51gVgVmd6 ?O>OEm# lFh#Fl# ِ1xȢJ669NHcbdFVodUȊmd%27~#FVl#+ِ1)Y6bYɆmd6md6YymHebdslFJ5[eSȆmd#2 Ȧ F6d װ6aȆlF6lFv|&FvodFvFv!c~#;7md6 ׍ndWȎmd'2ȮA6Zy%g&F S7r 9 ȡA6d ^7rCm#lnu#Fl#ِ1FFN(`Ձ#&FN װ96rb9ɆFNX7rm6r 9a/Sm#'l mTȉm|G6n:&wb\|ِ1x֍66#2wwdCu;h;6/y2 ߭a˥.\܍]ݺ\ف\j=?w?}sqovqwr{K}szyOzHhw? 7}\[ 7Ɂܰȭ׃$Bpw61j|F>!c֍|j|dC6A6aȆCmSȇm' [%߹06:Cf8^KȯO6d ^7ú_m#?lF~h#F~l#?ِ14?_m#?=p^^m{l{!cw뾇}==ِ166'2=F㋽&FaQ@mQlnuFlِ1FF!c~Q@mQlM{GKOQ(Q(H6d n QPm Ql|RS m6 jBd#O.MB sS s m6 #SsR(m"2  F!lِ1~g!hF!l0Lߖ21 jdCu06 cɆ߭+ ߭+Q(L6d o6 m6?djbqf"dG"F!cQ֍"jE"dCsJ8Q(m!2Q(Q(J66 1122m6 ׍nU(m%2S9FQl(ِ1R(Q(F6Ҭ K8(&zb-Q (F6d U }S(m#2_bjŰbdC6A6aFw{nM51@@m6 (mW(m'2S9Fql8ِ1R(Q(A6f5QB%`/ZBmQl|N)j%dC6J@%6J`%Ȇװ%j%dN11J:mgvJ #kʗJm6J {$lIFI!c9$SJm6J )%j%Rd×η21JuJ)N)Q (E6d >sJ)RF)!cQ ֍RjRdCRjdJ/cL^]OWF]Wj2p+qep+C5N}sXʨk\<%G,뭉QXjޑ)K6zWs/jedC_Y8U(m%2Q(Q(K6d 6ʪm6ʑ zQNԍrnS(m#2_orj對rdC{n9rF9!cިQNmQlPSXoj屍dCggW(m'2Q(Q(O6d n[*Ĩ,lT6*mT6* UUYm2Ql|mZM+mT6* ۨ mTVۨmT!KJ|wuQڨQۨB6d cVG*F!c}*p߾Fl ِ1VhFl*ٸ=!]tQU<'P>'PUm*QlFUhFUl*ِ1R)U6bUɆmT6mT6>21Q ֍jjհjdC6A6aȆjpNQ ۨF6d oQ ڨQ ۨN6PcbT~guFu!cmT6 ׍nTWۨmT'27C6c?)}Nlb(Ən##ِ1x/#ETl?mmH6d nGhGd̟6vgbu56j`5ȆpNQۨA6d nQCmQl|NmPۨm$ >qĨ)zњQۨI6d >ԄsJMFM!c9&Sjm6j ׍FMF-QnDݨF-ZF-!cpZjZdCh-؋Rۨm"2_Ԃ6jm6j_7j3Q[aQ[m6QlFmhFml6ِ1R)6jcɆFmF7L:FhFlِ1:F:F!cpu:ju:dC6@u6`uƻnb6Bu6buɆ{ѺQۨK6d oԅF]F]!cpujuzd#߼f]51 zjzdC6A6aȆzߨQۨG6d nQOmQlt Q_بmWۨm'2QڨQۨO6d >ԇsJ}F}!cpjdcmsk\21o(7pAPnh@6d n@mрlFhFlِ1@mѐl\| &FCmװ 6b Ɇm46m46 hm4Thm4$2 j Fd#t&F#ޗysqJcb416Zw /p$5Qhm4!2;#ڄl؈6Qhm4!2S9Fl ِ1hhJ68i7~FSl)ِ1xM6bMɆm46m46 h m4Uhm4#~>;W8ib4bh悾LmьlF g 烚m46 hm4Shm4#2_46m46j&Fsa9\m9ќln4uFsl9ِ1x6cɆ;im4Whm c4Labu=6cɆm6ګm6ړ hmWhm'2h@6uNXtjdC6:@6:`Ȇgg@6d ދv6:mt6:;G (lt6:mt6: aQm#ёl|߾#ܷ喝H6d NGhFGlH Am&F'1tsJ'NF'!cNp䀘F'lِ1:\tRmt"2S:A6:aF=:S,FgX7:mt6: ׍ΰntVmt&2a謶L6d >t6:mt6K{"lt6mt6 ]`Em хlntuFl ِ1.F.FWhbtkخp Um+ѕl|N 甮j]dCu+]6b]Ɇ7B]6bȆW71 ݠnjݰndCwwSmt#2mt6 ݠnjݰd iL{jݱdCguguWmt'2S9Fwl;ِ1xmtWm CohC=`Cmуlha#CmуlnuFlِ1x衶I6eu< m3ыl|lk+L^{^j^dCk^p Kmыl|N^j^dC6zA6zaF[\Lޢ {jdCVm&2Sz9Fol7ِ1FoF{+&GmQm!27~Flِ1)}6`}Ȇװ}>j}dɦ!#}s9/ٰ}hF_l/ِ1/\Um%2/F_l/ِ1F_F?!6'z~G6d ^7Omяl~j~dC6A6aFj0qd6d4L7L]7japqpF5N{1^0uk0q2q`q7lhnϭ &p7}pp!cm 6 ;;\mc81l7m Wm kNT+<!l6Fm6F mPm 2Fhlcِ1xmPm$9ܝ1)攑pN1I6d >sHH!c9e$SFm6F ׍H(ѡBMQnuc(lcِ1Q(Q(!c1 ֍QjQdC6FA6FaƊ\~eb6FC6FcɆF}jdCuc46FcɆhq?gƺ&141jc1dC߃1Fmc 1lnuclc ِ1hclc,Hn&&XXXX!c}pnXlc,ِ1x XX!c9e,1Vmc,1l4㜽y9eٰ2Nmc1l`Sm#2`1G6d nc1Nmc1lIoo6cɆ{1O6d nc<1^mc<1lxhcxlc8M j dCLLPۘmL 2S&9elcِ13j jdûc 41&pcDlc"ِ1xݘDD!cg&g&mL6& ׍D$îW11&^tE'mL6& a'5$I$!c1 ֍IjIdCkI$Idx!_cߘ 7&mL6& ۘ mLVۘmL&21ژ1ۘL6d nc21Ymc21lS }M)hclc ِ12)S6`SȆ{)1ۘB6d >L6mL6~#:Z51~oMm7l7!cpAmmF6d o6~6~#2oTQUzSEݘ TT!c𽯩pkTlc*ِ1xݘ TT!cpSjS6/yM3š}}n՘1.\ߋn4X#L;0|n w{n4xϧ4\=0v8= b?׃te >WLL`:91\11׃$B`:1]mc:1lӬ1CؘmPۘm 2fg|fg lcِ1\136f`3Ȇm̀6fm6f {3žLo1Smc&1l|m:Mgm6f MgµLL!cΙL,Ѫ_4I;Dݘ,Y,!csmgsmgm6f ׍YnRۘm"2Yjdc1{\&lac61[mc61l|1?fm6f ׍ٰnVۘm&2Ӛ mVۘm!7){1GؘmQۘm!2?v\Wۘm'2_̇jdC6C6cɆ|qZe[ sg6kFO@mclYYj dC6@ 6` Ȇ) j duW-LbNY甅j dCBo,TXm,$2XXH6d ^7B 6bF)ڃ319CkELH&Oc"lcِ1:e\,RXm,"2X7m,6 Ejdc`651WWm,6 ׍Űn,VXm,&2aXXL6d >,6m,6]6619e Sm,6 K`/Dmc l|k ZXB6d ^7@K6mh·'8Xj9celelelelelelelelewzF&fV6vN.n=}CaR{FRQT]j翥p[qKq[J5NR8-U׸-'co)qK5n)\Fvm`b,{1^2e2!cpˠej˰edC6A6aȆm,6m,6 ǁEXrr!cpˡj˱dC6C6cɆm,6m,6VUfkb]O(PXm 2XXA6d ncBmcl Jq@mc+aXXI6d JJJ!cp+j+dCt+j+Ud#u41VUp/f*lcِ1xX*U*!cpUjUdCs*hc*lc5h5Ljhcjlc5ِ1jj!cpjdCϚ6Vm6֐Q-V71k5jk5dCs8QXm!2ߧ[֨m6֐ k5jkdbȪ&ZoZZ!c=ܵpwZlc-ِ1xX ZZ!c~c-Vmc-lwt=ULu:hc:lcِ1u:u:!cp렍uj밍udC6A6m8^ݼ[ఙG̻uÙw"]wsqOw~{q[;翫{>2O?zE=Xz_z2#>bz\֓?'>'^-b=Izhczlc8k"*ĞAmcl j dCs8WlP؀ml 2_n66ml66g_QNNQmc#l|mM7ml66 mlT؈ml$2jMdpMӕ5169mgV7y[|Gԝ'Yݤ D6d ck ۧ7ml66 )Imclnl66ml66.mblfolV،ml&27;c8l\v<|)7166cɆ-6tflc3ِ1fhcflc pzE|Cy -!ca?ٿB6d >ls-!c9e Emc lhc>lc?穟7_ԍnW؏m'27~c~lc?ِ1x~~!cد8@67tR6x~|~lِ1r)6`Ȇ):lِ1A{YLnuAl ِ1AA!cpjdCg6m6'3:\R8m"2?7|n!lِ1C!C!!cpCj6aa{>a9G,cG-cZƎYƎ[NXNZNYN[XZ]]]]]]]]ݰYnZnYn[XZY[·9L5 g4wָw׸Td : T50qo> w׸Td OwָwGƚʹ71G#jG#dCKKQ8m!2q8q8B6d g\@6m6GؚGŚ(\SU8m%2Ga8q8J6d n(qTm(ql|Mu8qnןݺ?߭Zğvn΋WT;\ߋݺ?S}}sq.yqtT?q=8F6􎉹+1\ݗ1:\GS;81r ccpoZ1\ǠcjǰdޟS;2;26cɆa16lW8m'2+jq\m8ql|8mW8m {<8!Nj'dC'  !cp'j'dC需6Nm6Nˑ8S3'ɆqaOm6N hX}Z'dC6NB'6Nb'Ɇm6Nm6N]sMjb)oR8m"2_SjSdC6NA6NaȆm6Nm6N1M}qZ#s#sZm4qljdCi؋V8m&2f4qZm4qlYFD&Q7qFm ql|rSΨm6ΐ 8mQ8m!2E@g6`gFlT&Y.Sg6bgɆZdU8m%2QacLـcq8K6d ^7Bg6b+gb%)u_ja ~/Ȇ_nِ1x_9wF2 Ls9h9lِ1s9s9!c䞃=q8G6d ^7A6aOgmob6C6cɆm6Ϋm6Γ ?Cr>Cr^m-uKmql;w:nm6n li13r}Ckql|NmR۸m&{oMmmb$݆$V۸m&2_܆jdC 8lR9Ֆq۸M6d mV۸mx9y'ieQca.Ň5stopG݁'^NɚT107;o..{_w=wp=K<\FzwE= ]ݿ]2_܅돻jwq=Kd crw/<71"zpD mU۸m#ݎ6草qO`qOmql7m6 (o&=lِ1{={}.&};};}}!c>>#m6 ?u>u_m>ql|>q_m݆ܗ-ܗy6,`,c-c,c!ǖ'PXeeeee,222a{m{c{kEYƢ-c-c,c1OXg˹/Tv|u vg݃ƙ7d V׸`\ォfk GqS1x 5.X]q 'cR0qd#^6`ȆjdC6@6`Ȇ{Cs&CQ7ºPm!lLLjdC]>]>Txm<$2{mLab<<-6aȆGo~xD6d ##G#!c9HmB6zMSL!aC6B!cp!FFB6d c3Fbx|Ck#!2!FFl?ݽ9nX=t6cɆm<6m<6 ׍ǰn:&+aJml+h+lِ1+gJml|JmA6;jbDuJ\DmD`dCNPۈ6"ȆFjFِ1h#Bm#xM6;7^~kl5ِ1kk!cpjdCkhkl HQK&1s7!c^ Eߨm6ސ Su7!cxxK6u4>&[a-Vm-lx jodCu-o6boɆm6ުm6"ƴ!F|jb6C6cɆmć6m6 ׍nWۈm'2(SaBN)%3te*W)pNU6|ɆmBj؆/ِ1 _hWm%2S|⫶kx+Yö2/y5s[=@-"]xu ^Fv%%; w?{{q^{?,~' ?8W~te zGd ^`=SD"?hOm')}sM]jb;צf3ɟl8ּLW6ɆmCj؆?ِ1 h_m'2a␏ν,-chmcd]lbFF@6d G>"@m# 2 -$jFِ1t泛KZFB1c݈U &tBaۄNHH6d ~viBWtviBFB!c֍j dCu#! 6bƅh{\&F"ߙw&RHm$"2S9%F"l#ِ1E"oHm#ln$u#F"l#1!s_&Fb'N$=Wǟ|=Fbl#1ِ1\\6cɆFbX7m$6 ׍İn$VHm$!?̌h9HyHyHHB6d o$F$F!c֍$jI$dC0629c2Fl#)}MbO+)JHJ6d c3ÆHjIdC6BI6bIɆa;k;c8l̨HmyH6@N T6ɆF jF ِ1@@l#l>oJ ٰM T6!ab$?:k8!@H H)ݝRkRXoϬ{fZg}DFvFv!cy#a|kTZٱdC{p]m#;ldIg /~ZٱdĩZ&9DFF!cY4Esm6r oPȁm 2ٸaNg!}I6:S􍜰oTȉm$2FvKRoyXj,5OKey[j,5KR+l,`-Z KVR+mYjZK-R+kZF=˷7f7us=΍z3v{qnd >Mps'c8qnxG6CM|b׿|j|dC6A6aȆm6m6 L>h#F>lÝlD1]p66ܱ w!cFj؆;ِ1lg#w wlÝl|6r66ܱdc6 : 21 jdC}#?6cɆT*F~l#?ِ1k6m6<I'†ᡶmx 6<6< !c5)j؆ِ1mxmx`ȆKT^M,<)Q(@6d kJF!ce16kjR|CkQlF؆'٠) zmxbdC6< O OlÓl܆'᩶mx ϢІچ݆!ٺ0zk?[WDY=RDAva<[W:(vP|x?[WWO>5,C6q#oQ6|Ȇm@>j>؆ِ1x}Gm!2mm`dgb/ܛmbdC |6| _!cs _8mbdC/᫶m&wOݘQX<[W>[WXm0Qlo}Fal0ِ1 wV(m&2Q(Q(B6\KжQDS}J"F!c}JO)Q(B6d 7QDmQl,QDmG6/&x>w駶m N_";~j~؆ِ1,gQ? ?lÏl|66dcmۛEE( FQFQ!cQjEdC}(E6bEɆm6m69wo†?᯶m N";j؆?ِ1>S6 !cyW6FΫ|#@m# 2E,m O' P6ȆFm#U{11 ŠbjŰbdCS(m#2`(Q (F6d nQLmH6/6@@l#lo¾m Ϣp T6Ɇ@@l8Q\(mW(m'2Fv<[l؎gm6 Ϣ,Z\m8Ql|(mW(m (!fp-Q(A6d O))%6J`%ȆF 7Jm6J o6Jm6JR711J|FIl$ِ1;@JwT(m$2Q(Q(I6d >o6Jm6J~+`(Q (E6d 7JQJmQl|-gRjRdCkJ)hF)l4{<(-p(Q(M6d s.O f6JcɆp(Q(M6d 7JC6JcAd=#H66 !cmaAdC}# l#loAAjAF0(|uF&F7m  O V6ɆF0jF0ِ1x662d&Fa QFm Ql| <(Q(C6d 7QFm QlFhFl#l?̥z&FEC,m  Q6BȆm@!j!Fِ1h#Dm#(K64 (( 2(Q(K6d 7¾QVm,Ql|[a˪m6ʒ ?T(Q%YD#TP7B6BP!c=l(ÆmbdC6BPPl#l| 6B6B6aoa,Yj- ZEKVRbUԪYj-ZMKaEZj-:Z]K-RYj-ZCKcZjqZ!0l|. zaflݺ0օYO>[Em Ql|RSmT6 ϢU,ZEm Ql|RڨQۨJ6ԷQUUQUm*QloT}FUl*ِ1xߨ FUFU!cQڨQۨF6^rTQ͹O17V#`[EȾQMmQlF5hF5lِ1SS6aȆmTSۨmT'3{jbTFu8oTWۨmT'2O:OFul:ِ1R)6cɆFuhFulpkQ&F EO0?%F F !cgrkgrkm6j ak=l F !cp5j5d#fgʘ5żQ56jb5ɆY YQۨI6d >oԄFMFM!c5&QSm&QlL2 8ߨ7jm6j ZoRۨm"2Q ڨQ ۨE6d nQKmA6.lAi#B7"6"!c=lFmD`dCF7"6"!cpFFI6)hsI#9I6_QJR}JF$I6d {.#6"H!cpFF$I6d ~. mDmDbF'301j}JmOQۨM6d 6jcɆmԆ6jm6j Ϣj:dnhbԁQۨm!2 _ڨm!2QڨQۨC6d nQGmQl7yF]l.ِ1xߨ F]F]!cpujudCF]hF]l#l|󱧿%lDAQjQFِ1;@;@6(!cs(x.mD ۈ66hZ!~&F mDmDcdC}#hhl#loDþmD )FF4Qlt+&F=1oԃF=zF=!cpzjzdC6A6aȆmԃ6m6 :51}J}OQۨO6d n>Q_m>QlF}hF}l>ِ1RڨQh@6Stf!x^|^Flِ1FF!cp j dC6@ 6m8ihIJ`~rgnP-]y&!<mv|x?fbċ3xxmē )pMWۈ6ɆהxīmcdC6⡍xxl1٘ߣp&Fc tc tcFc!cpjdChc86Vhm4&2_SC6m8}Ӌ|7]M,hj5Ԛ[j-,Z+KRkkԾ[j,Z'K[KRjuԺ[j=,Z/KRk[j9:5wr)_&bO{\P1lFM= qM|k׿&&d ~Q㚨{\5%N}-TNnDwrm46 4g1M6bMɆf³٦jMdC_ShFSl٠BNF3lِ1l F6aȆm46m46 fF3fFs1Ż4÷5Whm4'2hhN6d n6cɆm46m46Z]01Zs𜮅F lِ1F F !cy7Zm6Z hmPhm$6Q#R[vKFK!c$aDž-ɆFKl%ِ1FKFK!cy%Rm%ъlD;^*`b}6ZaȆ[VjVdC6ZA6ZaȆJmњlt\pw&FkqVhm&2a{YkFk!cY5E[m6Z ᶆ6Zm6ڐ&F7Fm цl|h6jm6dC} m6`mȆה6F6F[0tɭ=iMF[hF[l-ِ1mm6bmɆF[7ڪm6ڒ Ϣmjmvd}\ιҘ턍vF;vF;!cvjvdC}6aȆהvF;v7d#k0166QlID077dC061Rx6W166!2 7F{18mE۫m6ړ g6cɆ3n3nhO6d n=^m=сl\r<ŕܧҁlؾ꠶@6d tkJF!cy7:mt6: Ϣjd#Ñ&51:a;a;mt6: otTmt$27:yFGl#ِ1{,;B6:bF,c=IlbtkJ'tRmt"2`褶 D6d 7:Imщl|MmtRm|K6F6w >&ƷƷƷjbߒ Vm[l[!cy[8o|--ِ1-ƷFgqpCFgFg!cpjdC}36:cɆ3Ym݆!Fٺ"0߳uAߩ|gw`><^lwٯ;^;5/SO^1cv3fA2].j]p?Bd @]"~ЅD|mtQmt%=,ʿ/+FWl+ِ1FWFW!cGW誶J6d >Gt6mt6MOl<6mt6 # #Mmэlot}F7lِ1xmtSmt'X&Fw1cvEwFw!cjݱdC};6cɆ-C6c=ȆψWO71z=j=dCHƞd6Pm 2=`衶A6d jhFl'h}Q;w&FObI6-ߛ{b3y_OFO!cj=dC6zB=6zb=ɆFOhFOlX3⭉K^oRm"2? {m6z mRm"2E{A6zaΣmb ߇[m7ћlFohFol7ِ1FoFo!c譶C6rq ebeeQm!2GGFlِ1s'}s'}6`}Ȇ)}>j}d^fb7j}dC{ؾpWm/їl|Sm6 )}j}~dcR>71y7m6 )OmяlF?hF?lِ1~F?~FqzK7O*/.FF!c{{m6 _m?џl|MmWm )>,h鉉1@|2~2@mc1lo }clcِ116`Ȇhc aaoqc=,Km6RnFZj,іKm6RoM&Zj,ɖKm6RnͰfZj,ٖKm6Roy?@qt_bO5{@R1q!oU m{@q2qaqqH=Ngaq7l ZLAbnAjAdC Rm "2ll lcِ1l41L6~^ca1L6d SO Vm &2S {jdC`hc`lcxc}cylcِ19xN7Dmc1lhclcِ1!!P8p[&Pac(1Tmc(1ln(<1J6d >o PP!cpCjCad#߼mb 08o Sm #27yc0lcِ1x0a0!cw 6m 6չeb 6C6cɆ''1N6d >pp!cYt81\mc81l_Lj#dC}c#6F`#ȆpG3j#dC6F@#6F`#Ɇ㮆&H1oHH!cp#j#dC6FB#6Fb#Ɇm6Fm6FUcÎ{QjQdC(8Rm"27Fyc(lcِ1(hc(lc4٘=՚+&h7Fþ1Zmc41l| jdC6FC6FcɆ)j6y}o~n_>lp^-{هlp^{؇;N߫o><%~{xͿW_q?C<3.zcZ1cW c|Q;r c9b #ƨE` 111K6"25邉1V?XX!cb,\+ƪm6ƒ cZ1Vmc,1lձX8q6yc`1G6d nc1Nmc1lb\IƩm6Ƒ q8qxqƖ}ϚgZKdMȌWm'211O6d nc<1^mc<1l|mWmL 9.cL j dC8oLPۘmL 21ژ1ۘ@6d 7&@6&`F^ ?ebL}c"6&bɆ-&sjdCD8NTۘmL$21ژ1ۘD6ztĘ$'w6&aȆהIpM1 ۘD6d nc1Imc1l|MmLRۘmL&[|<☉1YɰoLVۘmL&2}2}dlc2ِ1dd!c1ژ1ۘB6^5?W1E)oLQۘmL!27yclc ِ1))!c1ژ1ۘJ6q-;lbL% WM%?&rLUۘmL%2F־ [1ۘJ6d nc*1Umc*1lThcTlchӠćLioL}c4lcِ11 6aȆϾijӰidC6A6aZ38cNWۘmL'2Gx:Gxtlc:ِ1v:NWۘmL'27C6c39Ę! 7fm6f oPۘm 2_Sf5e lcِ1 Ls31f 3j3dC5LL!c5e&\Sfm6f ߗ1ژ1ۘE6|c1 ژ1 ۘE6d 7f1Kmc1l|MהYjYdC}c1Kmc1lL1х&lac61[mc61l\4aJjdC}c66fcɆglqRg~L9{9{9js9dC}cs6`sȆ9pޘ1ۘC6d ́6m6撍T^01抾1jsdC0F3ÆFs6bsɆ\7m6 )sjsydfb6A6aȆee1ۘG6d >õo41=BZXH6d nc!Pmc!l|[׿j dC6B 6bFUel01~~m,6 Xm,RXm,"2y"lcِ1lXXL6hz_gb,..VXm,&2XXL6d 7þXmc1l,f1Xmc݆!%ٺl%jK"̇'Y'q~8[/Q;Xbw`><ٿ߭[_bS/Q_%,kdԝWzKKW)K޳޳jKq?XJd ~-UXR!cb)Tmc)?dީ&7s(ٰݼdCo?dCspAml!cp?@?mm,#MZab,g2e2!c m,6 JLmcl| X XN6<0|ܹlܽGj˱dC3r8c.WXm,'2XXN6d 7C6c+[jbgZ+  !cp+j+dC6V@+6V`+Ȇ+j+d#KLNOc%x͍5o䗰+6Vb+Ɇgѕp]XI6d c##b$*Jlc%ِ1XXE6j3ǜE&*OY)6VaȆgUp] XE6d OY)6VaȆm6Vm6V1;IaZἱZmc5l|] gjdCpZmc5l|X mVXm!G̎obky5!c5jk5dC}c k6`kȆhclc-HLfb{صpVmc-l|X 獵jkdC}c-k6bkɆgѵZ:֞sLu:hc:lcِ1xX:u:!c}:OYXG6d 7A6aF#eb6C6cɆa捆Ȝ+U z!c}zOYXO6d >o6֫m66aabl pAmcl|c<ؠ@6d c#ac'2xOU !cؠH6ތcQ􍍰olT؈ml$276ycFlc#ِ166bɆUبD6~H:hImlR؄ml"2n{MjMdC&8olR؄ml"2_S6A66a7O616 jdC66C66cɆml66ml66 fV&ac Emc l|-j[-dC6@[6`[Ȇhclc+ٸwdƮiLb gѭjC6B[ɆϾ³jCVhcVlcȓ]7Lmol}c6lcِ1 )6aȆ67ml6 m6mva&vvvv!cpۡj۱dCp]mc;lvhcvlc٘3{cF,i ͖=|!c=ݡA6d 7vCmclhclc'8fMbM הj;dCH"b$16vb;Ɇ獝pةI6d >o6vm6v릴ibr0"$P۳Kmclo}c.lcِ1x.].!c=.hc.lc7٨J&>e7ܧV؍m&2٧:c8l.W16vcɆs sݭM6d 7vC6vm8<4p㝷晤[oT.|x}#?hw`><g~WG~͇dro*燣kKg9c&mߣ{p?CW_0߽:c8\fpݙ^_:؃r cb\+E`1أK6>x{ cӆy^rY!^j{dCs^#m6  mU؋m%2gg/Wmc݆/{_ozqc-OAK퐥vR;bԎYj-IK픥vR;cYj- EK풥vRb]ԮYj-/MK/ǕP>q>x>uۇ{>q2>}}d =nq|{>uۇ׿d/6Pl؆jdC~W؏m'2دO6d >6m6ߵq@o6`ȆhȆmD;q8@6d nq@mql|6:mP8mD6s&O'xOOdC Im'l'!cp?A?mmD6d n'h'd+]-?21qjdC6B6bɆm6m6 jCdE܍J.=MC!h!lِ1ww6aȆfӹCjCdC6A6aUk4nbprXm0qlo}al0ِ1YaxsXm0qlahalٸ]M#b8#jG#dC6@G6`GȆ!9!9q8B6d O9mQ8m%٪DqT)GrTm(ql|{am6 8 mU8m%2q8q8F6N7[g㘰q 8q 8F6d 7qLmql|=gcjǰcdCk1h1l8uLqhql8ِ1qq!cy87m6 q q<"Mb=gj'dCprBmqlo} lِ1L d l$H:hjۛ',z΢'6Nb'ɆI7Nm6N 'qRm$qlo6Nm6NrgZ]z8%l6Nm6N Ϣ,zJmql|M9הSjSdC%6Nm6NZWhkbi8oV8m&2a8q8M6d n4qZm4qlihil xUk㌸G Gl ِ1aÜQ8m!23jg3dC6@g6`g;8+Y7Ϊm6Β Ϣg,zVm,qlo}Yl,ِ1wmgjgsd?܍Z焍s9s9!cp砍sj簍sdC6A6aȆ7A6aFznmfb6C6cɆgp=q8O6d n{Amql|g j dC{ p{Amqlhl"x8klb\6.B6.bɆE7.m\6. ۸m\T۸m\$2Æٸq۸D6_5?gb\碗%K%!cq KjKdC6.A6.aȆ%h% C^?g뚘܊qωЯ]~~;0}xٺ.g~͇d~_*燣ke3~Um*qlիիjWdCWjWkd:ĸ&~o(m\6 # #zl؈^S۸m\#2q ڸq ۸F6d \6m\6Y?.eb\}:6cɆa;16r<${bhm\6 i]gZ6cɆהu SM7H~_ lِ1 'q۸A6d nqCmql|ozڸql|HOS~QlID ._6~6~!2 //dC6~6~Q۸I6&ĸ<4}&ٰ5j7dC}&76nb7Ɇ獛p޸q۸I6d n&qSm&qltpDĸ%[p޸q ۸E6d nqKmql|{ aom6n ۸mR۸ex?~amyKvRo=Zj,_-ǖKR{n~^Zj,זKR{oa}>ZjYj,ϖanS8eNN~'=68s~s[nwzgp6qqM=Ng1aqwlxxqGw|Gmql|׿;jw;dC8Q۸m!2_@w6`wFI'T11wޅཫq۸K6d ~U۸m%2wa߸q۸K6d ~sڸq۸G6ZlwqO|Omql|Mה{j{dCypOmqlo܃6m6?Vqi|/xlt=IyNw_m>ql|MהjdC{pOu_m>ql|>q_m>l/71  m<6 o#lِ1xx#G#!cYEm<6 xmBm݆!̳ua! M-7هloGv݁dÃ;oO><ٺ5M}%]No%/W%/|x 爗j/q?xId KK$2_+^B/6^bƪ3=31^1_m6^  ~Jml|x+W+!cpWjd_11^ jdCH"bgr_m6^ [6^cɆm6^m6ސ ={/51o7jo7dC7pxxC6d n Fm lL Fm l﬚:Vx mUxm%2FjodC6Bo6boɆϴBo6bYs͋61~p]mwlw!cYw8;;ِ1Lw߱Ɇjc= w;w;!cߩm6ޑ Ϣ,Nml;h;l=ȸQMu71>w~ @6d O)6>`Ȇgp@6d >~6>m|6$(SyO??Ɇa'uph|oͼ''ِ1$ITl|SmOlf6EH6d.m|Tm|4ߘ|獏jS>}GG-m|6>m|6"!g=t51Km/l/!cy#ac4*__dC66R l| Km/lp_6;@> Wޭ"䳌6>aȆOp D6d >~'O'!c L66g~N㳘7>ygl3ِ1;>w}Vm|&2aL6d 7>C6>c_ˬ9518i_ȆQm|!2g gl ِ1//!cھ@_6m_70 \Z"KRKl%ԒZj,Z K-RKmZj,ZK-RleԲZj,ZK-RmZjy,.}?_7g3.od`nSu :K0{xg G{W1=N7?1nt{\{\1l˖,&FB>%tAQBFB!c9 m$6 %tAt 6b ɆgFBF"8$3\~"tHm#lF3F&RHm$"2HHD6d n#Hm#B6nE1"l@.j.؆ ِ1xp}Emp!2_S\⢶m ).Іچ l8nj8H,l$6m$6 H m$VHm$&2?Ibm$6 H m$VHm$!w531m$6 'qAI6`IȆI\~;Fl# ِ1$F$FR19`#EY4FRl#)ِ1}HI]}HI6bIɆm$6m$6 H m$UHm$#Gy;LHm$SHm$#2`H HF6d n#Lm#l|?Lm#݆!d#=ϳuᔑ\-"]y.9t\ ݁d~߳fr燣i3'_})ه'p>[^kt+hVrC/)`?H)p?HAW_3f 8cP;HA r c~j)p?HA"d R@)6R`).Kjb3fJ8cTHm$2HHI6d H )6Rb)Ɇm6Rm6R=yMbbgYx*TF*!c9"\?Rm6R [+I*TF*!cSA6RaƇts11RwvA.MHM6d n#5Zm#5lo}#Fjl#5ِ1ygjh#Fjl# (Nqiļi6`iȆm6Ҩm6Ґ HmQHm!2_S@i6`iF_oH+;HZFZ!cpijidChZ8UHm%2HHG6'#HHG6d >h:tF:!ctj鰍tdCkJ:h#F:l#=x\ȗ|L.^.^j鱍dC6C6cɆ_M_MHO6d n#=^m#=lxL2G#72y#Fl#ِ1)62`Ȇה pMɠ@6d n#Am#l8\S ɆFjdC62B62bɆmd62md62 a3B62bƜb6$6F&l#ِ1whwh62aȆmd62md62 ϢLjd م?#=#Ym#3lod}#Ffl#3ِ1WfxYm#3l|M mdVȌmd!V򭉑EY༑Em# l^,^,jY,dC}# Y6`YȆ{mdQȂmd%koL.w ̪J6d 7¾Um#+l|amd6 a񏉁ldUȊmd#߷q+#87md6 ?[ >[Mm#l| amd6 ٠ljٰdc41jٱdC}#;6cɆFv7md6 )١jٱd%_9DFF!cwpAʡA6d >oFF!cȡI6BlEs E396rb9Ɇ邞ͩI6d kJNFN!c}JNh#FNl#0o01r \j\dCH¶KȆmKm#l| asm6r mRȅm&[|󱉑[ mVȍm&2>%7>%Fnl#7ِ1x FnFn!cy#7[m#7J6^iu鑉*7\چ+J6d npUp6\Ɇ+j؆+ِ1xp6\6\6m6v7;w+F^7m6 a=l^F^!c=l^ͫK6d 6mqs{7}?<3;]scB2E?p]}q?p/c]-w!c~mmcFl%ibwAWȏm'2ȯO6d WE~F~!cy8?_m#?A6<!pmx pP6<Ȇmx@j؆ِ1>P6 㚉Q@)R@mQl. ߻,Q(@6d kJF!cpj O:ψWM OL'6=6< O!c<驶mx 6<6< O!cyT6 Nj\61 QjdC} 6 bɆm6 m6 (mT(mxNІچK6\:+lBj؆/ِ1>%a# Bm )pMU6|Ɇ6|6|dc]C21 jdCFa8oV(m&2ߧjdCFahFalxeK'L"\<-Q(B6d LL"F!c5\Sm6 )E"jE ?Qe~†᧶m  ?76 ?!cp~ІچG6d nS6f|(*l6m6 oU(m%2Q(Q(J6d 6m6/lCj؆?ِ1?<3W6Ɇ 8omcdC}W6ƵՎ[|#om`dCkJ\S6!c{V=jFِ1x66bd#/db*TLmQlF1hF1lِ1S(m#2?*mS(m:U<`b=l mbdC6@@l#l|FF H6d ~mmbɆ㇥31ggm6 (mW(m'27yFql8ِ1R(Q(A6=&F 1h F !cp%j%dC}%6J`%ȆF hF l$HDMauIa;.Q(I6d n$QRm$QlFIhFIl$ِ1>$QRm$Ql{d.7JyF)lِ1wmwm6JaȆm6Jm6J )RjdݛhbvadbjdC}}V(m&2Ö{jdCkJihFi 1A晤QL0$nda>< GA݁d?$Ao><%g5R_ 隿m_ڭ^1՗1x? X `r c"V D|662d讂Rm11ʈ2𼳌Fl ِ1Y2je2dCkEVQ(m!2Q(Q!S|Xz"fjm`!dCߓIB6B!csxnm 6B6Bdcy7eŚR)e6beɆFY7ʪm6ʒ )eRVm,Ql,,QVm,J6-}m*ޣޣm 6B6BP!c5%)jF(ِ1E(jxz{_tozq#Yj- ZEKVRbUԪYj-ZMKaEZj-:Z]K-RYj-ZCKcZjqZ} w)Lap S0¨|OTa{\8ap S0¨| =.LN6bʕj#\bnNbmcdCօgd pl#lF3F'*F8N6d CjF91}B%VD('(Q(G6d >Q(G6d >Q(G6d *mS(m'nN5yQ^<[ޅ?4ʫm6ʓ ?[W^<['chm6ʓ )Ś"chm6ʓ (mW(mT i o2`ߨQۨ@6d 7*QAmQloT}Flِ1RڨQۨH6W7*yFEl"ِ18g WԸZdCt9QۨH6d >V6*mT6*Ǣ/_bbT}6*aȆ$16*aȆהJpMQ ۨD6d 7*A6*aƁlu,61* jdC[WYnQۨL6d  Ά-[$_ڨmT&2j*ds.41׮_iTQۨmT!2U`ߨQۨB6d TkJ*F!c߭mTQۨmT%7gQUUQUm*Ql{xg O*/^ZUdC6BU6bUɆהFUF5-Ѭ՜{X7fLnmT6 V2F5lِ1jF5jF5!c5QMmQllfV9&Fu7þQ]m:Ql\Ck:Ql|[amT6 ߗXڨQۨA6;n5Ĩ!.J F !c|F lِ1F F !cp5j5dy=Eg5=j5=jOFMl&ِ1̚\lq]QۨI6d ԄkJMFM!c5&QSm&Ql1vQl$HvmƏWXKmQloԂ}F-lِ1ZF-ZF-!cYQKmA6ZT#B7"6"!c=lFmD`dC6"l#lh#Bm#ۈ$7.Riܧy#l6jF$ِ1>%S"6"H!cpFF$I6d n#ڈTۈ6jI&Fmq.ZVۨm&2aߨQۨM6d >ֆhmFm!cy6Q[m6QlDueQGvOFlِ1xߨF:F!cQ:ju:dC}QGm݆!d#>l]]xQW-]~~﫮x6B~A] MuW|xJW]x몯y]蚟Hd^X+ZQD՗1~Q^((ȁ׊(VDED~E"d 66hYƘ3vhhl#l|o jF4ِ1hh#Zm#ۈ&2 mDmDcF5movmbsASۨm#21F=lِ1}JROmQl|ƬmSۨm'}&F}7þQ_m>Qloԇ}F}l>ِ1F}F}!cF}FǥLFhFlِ1FF!cp j dCFFCn/G 31Y!Em46 hm4Thm4$2ߛ6{ӆj dC46m46k bb4}6aȆo6aȆm46m46 Fj1pධ&F1oĨm`1dCh Ec6b!c5%)1j1F ِ1>%ڈQۈ6bhbĊ}J,ܧĪmbdC|#Vm#ۈ%2 mĪmbdC}#ڈUۈ6ƃ?71q88l#l|ވFFG6d 5%Nm#ۈ#2qFFO6ѳ&FXSmē x76ⱍx!cFF<O6d n#ڈWۈ6>ocb4hc86Vhm4&2ahhL6d 10aM67ּU Fc!c51Xm݆0WѽFΎ&.}GSKRkaZYj-6Z[KR`u:YjZj-,.ZWKRazYj->Z_KR47s״ zNMM= qM&&&d vpq _&5'c&5Q&xkJ6.h޾TMTm)єl|k ׿jMdC06œ16J,QvY[ .)Nw/P%XH !H` n;(P;Hqt-:}sz:/k{v_mt'2mtWm B0] wX76ܱ w!cwd;2j؆;ِ1 wh]mp'2ܡ w wlhԭ^؋bzm6z ׍nPm 2衶A6d mPm$^\:7~S)=Sm'ѓl|'I6d c3FE3lZ=dC6zB=6zbZL^bN%F/lِ13Y6zaȆalqpxG9W16zaȆ^F/^Fo lJMb1zm6z ׍;26zcɆm6zm6z  mVm! 8 ?裶C6d nGmчlf3W*IU >F!c^GmA6pl&ᡶmx 6<6< !cpІچA6d ox@jF_a}s}FTZF}6b}Ɇm6m6 Ü+uᰑ±Z}dCsJ_hF_lxrx?Oԍ~nSm#2E^F?lِ1n00m_m#2~jdX3=L .6cɆ7FWm'2S;c8l<wg%O6d o6mp5l$ bZǿ[7O~ݺI~\{دq7_[7^k>׃t\ޞ@W  T;@r cP=!byI,U  $2T71jAdj!zľ o1Hmc1l hc lcِ1A A !cw A؆'M OO OlÓl܆'᩶mx ? [究mx Іچ'1lYb&`>Vm &2.qx.Qm &2'w06``!cwC6c^d#or]L /l/l/ /lËlًlؚ^/ /lËlnx᥶mx M / /lc8VɰN&o1Dm 6 )C2Dmc1lNC7d !!cpC!jCd<`b u) % jCdC0utpx1J6d ^7º1Tmc(1lPhcPlÛl=E&ްnxmxcdC{ZpO[m&27a᭶mx 66 1&mm`>dCse lÇl I lÇl6|6|adcwx6&0ac1Lmc1lajðadCuc6aȆ0hc0lc8xnL9.9Pcplc8ِ1wZñdCuc86cɆ-m Wm ߧ+_eG c#`1A6d ^7F1Bmc1lhclcِ121I6wMzsHH!c)#j#Qdc]531F1 ֍QjQdCQp2Jmc1lF5g I_m"23mRm&;%&hga.hchlc4ِ12)6FcɆpN1M6d ދ6Fm6|F>Ω+/j؆/ِ1 _hWm%2nmbdC6| _ _lc ٠Vc11!cpc1jc1dCuc c6`cȆ{11X1nθ L {ѱjcdC0F{g _*U X!cpcjcdC6ƪm6Ƒs?X1NԍqnSm#2`1G6d nc1Nmc1l|NmSg> : 1Xele,2dd X&[B-cS,cS-c,c-capLXelelele,2ekͳͷ-p0~T>[u϶g[58?q2?O*chkq~Td ^`S8?\|ko䯶m 66h{L|F@6d n#P6Ȇm@jFِ1=h#@m#nDЏ^Vw&j1Q-b]qWMNT;hw`~"j׃@("P-"׃@!cG mKG*RoAp-Hm#"2mmaAdC 6 !c h#Hm#ۘD6~Ѩ}`EcӆyXt0wdݘ1 ۘD6d GL}$I$!c}IjIdC6&A6&ad7L`Q7aV6ɆF0jF0ِ14M6`!c}`h#Xm#!"}!j!Fِ1xu#Dm#!2mm`!dCkh#Dm#ۘL6_ۙ:;caݘ1ۘL6d NdNdd!cpjdCsdhcdl#l\/1=M#T6B6BP!c$>IF(J6d o~#Tm#%2SBPPlc ۽l&ac 1Emc 1lhclc ِ1v \NQۘmL!21ژ1ۘJ6)]Icxfu zfuTlc*ِ1TT!c9e*SmL6 oL6mL6 K\KD/: 6aȆ):e4lcِ141Mmc1lߘmLSۘmL''zq_1cxn zntlc:ِ1:e:\LWۘmL'2aݘ1ۘN6d >L6mL6F ڃ31Du#Lm# #2anmaadCF76°0!cpaFF1lw"acEg^t lcِ1x136f`3Ȇ X7fm6f )3j3pZoA#\<ﴆmcdCu#֍ppl#lF8m 66±dcl71f1֍j3dCH,b3fm6f +5+5Smc&1l|N mTۘmDwC>#B؈6"6"!cFFA6d "6"!cmDmD`Ȇ@YyLY{YjYdC0{_b8l؎L1 ۘE6d ދ΂,Y,!cfA6faƐ21f jdCuc66fcɆm̆6fm6f ׍lq&1oQۘm!2]16 ~Ckc1l{9js9dCs9jsH`d+snDºmD }E½HHl#lnDºmD ׍Hh#Rm#ۈ"|E%nbD^4 QjQFِ1IwQ Ck# ۈ"23{QjQFِ1(h#Jm# ۘK6;]WVc1ژ1ۘK6d o̅\\!c1֍jsdCs\hc\l#lKdǞ&F mDmDcdC6hhl#l߈FF4M6d n#ڈVۈ6摍 '1ow 6aȆ72Omc1lñuc\Woa~{_av0x2W_o~܍)?|5?dz.@ԃ,P_,/cbt@` ȁP, 2s/Xnqگ}"φq9b-c -c,c-cK,cK-cqx2r J*jZ:zϖM͖_,c[,c[-c,c-c;,c;-csu_Xb5.׸q2q1Ũk\ q1Td u5.j\G;cq1x%6kz#V|6}6Vm#ۈ%2ca?mĒ pUۈ6bɆXh#Vm#XH6\~X( :zBlc!ِ1B7Pmc!lBhcBlc!ِ1B"Q\ S6ҟ"h"f"E"!c9eSm,6 u"E"!cpEjdqR7c߷m,6 X m,VXm,&27~cblc1ِ1,k3vuCkc1ll>bDXm,QXm,!2r |rlc ِ1%%!c91RojW]Xm,%sX*)K:eRlc)ِ1xX RR!cpKjKdCp팁攥jK8QjТqFmđ #1[.ő r)Nm#ۈ#2E`/mđ ۈ66ⰍxяfbċuJ<\īmcdCu#֍xxl#lxjF<O6d c#3F0]9nT16ⱍedc[>LeXej˰edC06:;c8l$ٳ$E XF6d NY)6aȆLmcllX.rX7m,6 o,6cɆpNYXN6d ~g9\mc9l|wA( acBmcl hc lcِ1  !c~cBmcltxbGcxn znJlc%ِ1x+6Vb+Ɇm6Vm6V +aRmc%l̪=y&*NY)6VaȆm6Vm6V XmRXm"2`X XM64w&j1sjj!cpjdCj؋VXm&27VC6VckF*:X#X7֨m6֐ XmQXm!2XXC6d 3Æ9:W16`kFÒ||eb6Bk6bkɆm6֪m6֒ ok6bkɆaFsg qeg*Zlc٘/Mu]{uj밍udCggSXm#27~c:lcِ1ȆȆ6aƞ#u7=71֋~c=7֫m6֓ a5zz!c9e=S֫m6֓ )]16>,Uq_Xml 3cؠ@6d >ls !cp j dC06:c8lb+#ml6 g+Umc+l\ mc ·ml6 ׍mnlS؆ml#2_l]6m6!cKA6aF _eblw cc;ٰ ]mc;lYYj۱dC6C6cɆv=cvm6v ׍nP؁m 2ءA6d ^7v@;6v`;T쩮;NN!cw vw vm6v ;aSmc'l|b'Smc'lWkU߫&.o.].!c=]pOk.lcِ1x.].!c3wA6vm8·90a8cckgo;`;h;d2v2v2v2eeeewI)is K˖+k.=f7ո$3V?xu-pۭqqM5NH̖ٖ5n7q| ׸Td 75nQ۝^21{=j{=dC=j{=dC8Q؃m!2أK6Ƭ>W|r ^^!cy/m6 ׍nU؋m%2ثG6|zq霉Oԍ}nS؇m#2N`|N`>lcِ1>Omcl|اO6^6jX񬉱_5~~!c93ÆyW16cɆm6m6 ׍~Q&h3&Q7q@mql8jdC6@6`Ȇm6m6o11q֍jdCu 6bɆ߃8߃8q8H6d s8q8D6qHOpHmql|?q8D6d N9)6aȆr8qll WQ7~uW__Ɇ[+nݯjb UmWlW!c9WhW_d#t&aoaa!cq֍jdC6C6cɆ)j#dS8"l6m6 8mQ8m!2q8q8B6d ^7@G6`GƜAw11~(7m6 8 mU8m%2Q jGdC6BG6boeyMԍ`Mm7l7!cpAmmF6d c3Æ9)Za  Mm7lHbґLcFqllq\O1lِ1c1c1!c9Sm6 Ǡcjǰdcq\Suqq!cgMgMm6 8mW8m'2_6m6NG71N80 a4j'dCSN)'6N`'Ȇm6Nm6N }6Nmp;H[[;@W.?~;0?߻uën؏'؝zp;)u?邞u?'q=8IW_蟄T;8Ir c{'j'q=8I"d c6Nm6NJ3k8%֦`e8q 8E6d c5)lِ1S)S)!cpSjdctKvF/dcG"T{Zm4qlihil4ِ1ioqZm4qlݺi<ط8-Ψm6ΐ 8mQ8m!2~{?q8C6d 6=mQ8mA6:>.ebal**_Cml!cpmdC66Plj`gFim8+YX7Ϊm6Β ׍nU8m%2_jgdCYhYlqqi<,sl9q8G6d ^7qNmqlssj簍sdC6A6aFl n41΋pyl<ِ1~~6cɆ{=q8O6d u8q۸@6l }qA|_  !c$fD/  j dCo\P۸m\ 2_\6.m\6.mRXob\u"6.bɆEX7.m\6. ׍n\T۸m\$2S.B6.bF+:Sĸ2%{7u%lِ1~~6.aȆ.KjKdC.A6.a7e61.q֍jdCprYm2ql|N jdCp~gl\V۸m\!=>*X^k+jW+dC0.m\6 a5+!c9 qEm ql$:&Uq?*rUm*qln\uUl*ِ1UU!c9*qUm*qlq|YjqM)rMmqlkkjװkdC5o\S۸m\#2נkj6|}"χsqln܇u}l>ِ1x/z6cɆ)j6/y=  K^M̻uZ[O~ݺ26m<6$Wb'ƟƟdC}ğSmOlO!cO8W''ِ1x'Ɵ_dǀT41{ZY/Ȇmmِ166"2#6R xD6O]"x$#X7m<6 [<#G#!cpGjGdCuHmlȽvGX| cc!cwdwdm<6 aXm1ln<6m<6]L31gϞgϞm<6 )ODm ln m|Pm|$6=xfQm|Tm|$2aH6d ^7>ºQm#lGhGlp .3$OpN D6d }}Rm|"2` D6d ~Iml`㳨aL6d ^7>úYm3lghgl3ِ1x m|Vl:}"χIs<ZY\,cĖ$d17X XJX*XjXXZX:XzXXF7L̖,l얱o-c\{>_ocgN \ \ѳsʿN!V?1xKj?:q \'Nָn߻Lj?:rO*֭?H{7JHH6d lkBWlkBFB!cp j dCQBh#FB K^F-wa߭KE$RHda~n]" A"I}.W?wc?tW 珣kH}zB|K < =W~E}]p=p/c𵒋+Z+zBd ~E-!c}{hEmp%/|i*WGmbdC3]6\ W!cV W WlÕl|fWhUmHL6nob$u#16cɆFbX7m$6 Xm#1lH m$VHm$!݆56S?#I`HHB6d vWv$F!co %qEJHB6d >$6m$6LFRh#FRl#)ِ1FRFR!c9%)Sm$6 ׍FRF2q.'zĜ )6aȆ-}djɰddCsJ28$SHm$#2ߛMm$SHm$';]ܕ?Ϝ=Ϝ\m#9lFrh#Frl#9ِ1:%9\$WHm$'2Hp#5&njn؆ِ1 7hMm p#2=_䦶m nІچlL&F oF F !cp+F l#ِ1x)6R`)ȆF h#F l#%8ԸBpn&FJa#%Rm#%lM {єj)dC6RB)6Rb)ɆFJh#FJl#H,.&F*}c#ٰ}0.F*l#ِ1 )6RaȆTH HE6d n#Jm#lT=8#aHHM6d n#5Zm#5lH jdCkFjF1jm;i6KmiFNjɇEӨm6Ґ )iFm# l|NI4ji4dCu# Fm# llr|VSuJZFZ!c֍jidC6Bi6biɆm6Ҫm6ґgҶ3197CȆtj鰍tdC6A6aȆtpNIHG6d >6ҩm6ғyrH/IHHO6d ~-=ז^m#=lM{j鱍dCu#=^m#=l88SџF5lbO#Fl#ِ1= } F!c֍ j dCu#Am#l,ٱ's&FFodFFFF!c9%#S2md62 mdTȈmd$2jo lj?@ߨm|m|C6d"FCkl!cp@ߨm|m|C6d nhoLd#g5312 LjLdCu#62aȆLȤ D6d v&h#F&l#3h_X&Ffa#3Ym#3l ̮ jdCu#362cɆFfF1UsY,F,F!c,p+Fl# ِ1FEm# lnd6md6Ua5lVFV!c16lGeUȊmd%2ȪJ6d NRVh#FVl#Hzl~J6lF6!clp#F6l#ِ1x 6aȆ{lF6lvcwv15|+;]-"]q"#r~\r՗1#\P;ȁAr c"C-"9HAh#Fl#'5&g>uL j9dC0}DGg !96rb9Ɇm6rm6r  mTȉm|K6}|x_-[G| go66%2_| ߪm|m|K6d o66%2_~ m|-lTȶc&F.a#Km#l|N\j\dCu#6raȆmRe8e}ќ"φqőr>GX^X>X~XXAX!XaXXQX1XqX XIX)XiXXYw-c,c-c,c-c?X*Y*[ƪXƪZƪYƪ[}M5nG#SnQr[]rjѹ::5.78׸ܰV׸ܸ'c(7q5.7 Ayl#ِ1xF>|F>!c|po6F>l#ِ1xmSȇm'gRܧ3Ϻ'Wȏm'2_ojdC6C6cɆm6m6 OH31 9S m6 )R@mQl|N)jdC{1jdBՑ˙CAq jdC딂pRPm QljdC6 B6 b7|LBO!x類F!lِ1xQ6 aȆF!X7 m6 (mR(m&Rt/kbv0u0ٰݘ-Q(L6d ^7 úQXm0QlFahFal0ِ1xQ(Q(B6~jgi7~Flِ1x(F"F!cpE"jE"dC6@E6`Ea;d+ebU(m%2Q(Q(J6d N) )E6bEɆ6m6ĎR01}bp_F1lِ1\S(m#2`(Q (F6d ^7A6aF :(.z-Q(N6d oFqFq!cuJqN)Q(N6d ^7C6c%?=OEMF hF lِ1F F !cQ֍j%dC{%j%d5.B %FIFI!c𽯒p﫤FIl$ِ1FIFI!c9$QRm$Qlp| QJO)倫R(m"2`(Q (E6d >sJ)RF)!cRF)RFiQmQ(Q(M6d ^7JúQZm4QlnuFil4ِ1x( mV(m!G/gb2pRFm Ql|RSʨm6ʐ ׍2nQ(m!2Q(Q(K67(9QVeaQVm,Ql;e]wr˪m6ʒ ?\>\Vm,Ql|R(Ql*xNNm;l;!cwjaߑ )9;ﰍȆ߻Nm; K^ߛwbK^_ޭ^-{;;߭ֈ;0?w뾇W{~͏5^}Ϳ]󎧷ʘ+'r(p=(GW_}D9GS;(A9r czP(Q׃r$B}D9hF9lTsJUFU!c~*7mT6 ۨ mTUۨmT#>Y\ۤ61Q ֍jjհjdC6A6aȆK\ ~F5lِ13;ՠjjհdcݍSEݨFuFu!c16`_ڨmT'2VCQۨN6d oT6mTpshNqQrGMX-XmXX]X=X}XXCX#XcX؏f斱,c-,c--c,c-cm,cm-c,c-c,c-c,c-c],c]-ԠWmҤ0jjk\ \jP1W55q5|MUjk\ \jP1WָW5Fᱡ['71j:=3o$km6j ۨ mTۨm$2_SՄkj5dC%ք6jm6junkRS Q ۨE6d nQKmQlnԂuF-lِ1xoT ڨQ ۨM6b?QY7ҟFmQ4æOVۨm&2߯ km6j ۨ mVۨm&2_o׆6jm6ꐍ <ǻuDݨF:F!cQ֍:ju:dC6@u6`uȆ:F:F]yWuAuAu6buɆmԅ6m6 ԅ{1u6buɆF]hF]l٠ӭ:\Sۨm#2QڨQۨG6d [Sۨm#2_ԃ6m6꓍i-|b6C6cɆԇ~m6 SuJ}F}!cpjdhlM? FF!cm46 ׍n4Phm4 2S@ 6` Fҧ4`b4hC؋6Thm4$2S9FCl!ِ1x/ 6b Ɇ{цFCF#Q +ߙDhF#FF#!cpFjFdC6A6aȆ7A6a51֍jdCsJc84Vhm4&2hhL6d >46m46C>zmb4q36 ٰ(Dm фln4uFl ِ1xM6`MȆm46m4pyO~GX-~T.?w~$ǵ~;0?'s8?o~܍xw~G5׃t/' C#>7)]}׃4U;hASr czh׃$B)Tm)ьl kb4Ϟ5Ϟ5Whm4'26rsmjͱdC=fsc6Whm4'2hl8Y7ȆC?mmD6d c3FTZF*OOdC6~6~R l|mOF gG&F oF F !cp/F lِ1=Z F !c=Z@-6Z`-FO=h)l6Zm6Z  Rm%ђlnuFKl%ِ1xh mThm"s871Z VjVdC̵̵Rhm"2 h hE6d o6Zm6Z3Qws71Z jdC6ZC6ZcɆ):Fkl5ِ1xh mVhm!il^rh#)m:Fl ِ1xm6`mȆFX7ڨm6ڐ ׍6F6F[ѤBpnwLnuF[l-ِ1F[F[!c֍jmdCWBm6bƤ3LvκaȆ{a lhG6d /Shm#2`hhG6d >6کm6ړ}zh/F{X7ګm6ړ ??>?^m=ўl| a۫m6ړ )jdsǡ&Fwx@6Y|!Amсl|NjdCuuPmt 2蠶H6*>>Ua訶H6d >tsJGFG!cpjdCsJGhFGl07:K_E虜 D6d nImщlNjNdC6:A6:aƆ^+'_21:֍jdC6:C6:cɆmt6:mt6: w6:mt6]uü؅lA\?G>!2#@}6`dN_ϧCm 2Fb zmx`dC6<  lÃl܆ᡶm%~kLy+l6m6 ׍nUm%2_3I_F_!c}F_F?=q~F?~F?!c1m6 ?G?~F?!cG?hF?l?x֒Mb?쯶O6d n?_m?џlFhFl?ِ1xmWm /›&Q71@mc1lhclcِ1!c~c1@mc1l8V{Ln uc@lc ِ1@@!c^t Em 6 m Tm "+n1H22Hmc1l{AjAdC ؋Rm "2m Rmx{ibx Іچ'I6d nT6<ɆO8xmxbdC6< O Olc0w~M jdC6C6cɆm 6m 6 j /ѵѴ^}/WtچE6d ̎|fKm "2S⥶mx ^Іچ1lD ^o1D{C6`CȆX7m 6 C`/:Dmc1l|Nm Qm %g o1o1lt1J6d ^7º1Tmc(1ln ucPlc(ِ1P؆7pl]hbx~j؆7ِ1a6 o!cpІچ7M6d nV6|FS~q)&ٰQ6|Ȇm@>j>؆ِ1 lÇl|Q6D0a0!cpàajðadC6A6aȆ0hc0lc8٠VךÍOc8ٸѪşpp!cggm 6 m Wm '2ájñyR5[cbpEPm0OvnuclcyKoPm0O{| ;1I6m`*csbH${ɺ1Rmc$1lHhcHlc$ِ1x HH!cp#j#Qdc䃂e41F=Qp|(lcِ1(1Jmc1l(hc(lcِ1x1 1 M66Vxrc8sl4AAjA$td,&$oL$I$!c&&mL6& )2Imc1lmLRۘmwcm71Eu#Xm#&2 mmcdC`N V6ɆmCjF(rӓa&F7B`m SB:%Dm#!2!j!Fِ1xmm`Ɇ̓̓6&cɆdX7&mL6& ׍ɰnLVۘmL&2jPU&F۝4BɆK\]K?PPl#lF(m ׍PX7B6BP!c5l(mL!Pc06k^$mLQۘmL!21ژ1ۘB6d ^71Emc 1lhclc*(d|D&TgalL%~XI1Umc*1lfϼ3Ʃ;{,U T!cuTN1ۘJ6d nc*1Umc*1ltoբPL1M0 0Mmc1l~4x?e4lcِ12 )6aȆi4it8PC1]??]mc:1l|_t:1ۘN6d nc:1]mc:1l|k:1]mc:F6?}Ѩ}&FajaFِ1-0aۂ S6Ȇ08maadCsJm t@1Y7 k5)mPۘm 23`ݘ1ۘA6d ^7f1Cmc1l hc l#l42{Pz#\66±p!cpFF8N6d ^7aW6Ɇph#\m#ۘI6B/y$obsL8Tۘm$21ژ1ۘI6d ^7fº1Smc&1ln̄6fm6"ơ"fgbDw"ujFِ1F߈Pۈ6"ȆmD@jFِ1h#Bm#ۘE6\F_x1KSfu,Y,!c1 ֍YjYdCs,8Rۘm"21 ژ1 ۘM651f}jdC6fC6fcɆlX7fm6f agC6fm8^cޭm^|ny?k\ğ9v]$v8r0G`݁w]9?~͏O|ns|t7Pu)zHcF~$te GD>"R ׃Hr cz AZD$$BHh#Rm#ۈ"65Ĉr0/E 3s>"Jm# ۈ"2+@FmDaQdC6((l#lFm%%?Ę+\X7m6 s1Wmc.1l\8Uۘm%21ژ1ۈ&~|>-֦pmmD ?# Vۈ6ɆpmD ?hhlcX:wCLybs1ۘG6d ^71Omc1lñuc6cɆ/:~_t|lc>ِ1+U |!c1ژ1X@6rVS@ `@mclj dC؋.PXm, 2Fx@mc݆|9y̎9EŖ%8XelelelelelelelelelelelegF&f/-m햱]abƵx@)ƹ7kj\ ո1^ kC5NH̶cٶc5.׸q2q51o_2W15.׸q2b`Q׸<Œ3=01bE XXl#lX\bF,K6d kXXl#l76b6bdd^7Ln,ucBlc!ِ1j!\S-TXm,$2_{!|_{Blc!ِ1=B"kK&"7/}"E"!cpEjEdCuc6aȆE"Eb`ט:xc ^XL6d bbb!cp/fblc1ِ1b(^&o,%!c֍%jK%dCs8,QXm,!27@K6`KkX*}jKdC6BK6bKɆb½jKdC6BK6bqd;L8Q7`݈Sۈ6ȆmAqjqFِ1x88l#lFmēRt31E/{xxl#l߈FF<O6d ^7a݈Wۈ6Ɇ)FF_w~ιiח1ǜk;j;6vb;ɆNX7vm6v );ᜲSmc'lNhcNlc(R6\L]]j]dC.oR؅m"2Sv9e.lcِ1 إ M6z;߰hbv0/y&ʗJwm6v ?O V؍m&2_jdC{_j=dc&oQ؃m!27~clcِ1){6`{Ȇhclc/ٸs|rL^;K6g:TgXq^^!c֍j{dC6B{6b{Ɇ^hc^lÍldwlM 7Q7`pSp6Ȇ{Q7؋mandC6ܠ 7 7lÍlnAnjnvΏoG^]]## .cZ>s$_.>u`اv\<ٗ'.:}껿~Sݺ}S}{>?, [z~ߏ~2#>b~\jq=O"d oد8@6.ܶq@[6`Ȇ;;q8@6d nq@mql8mP8m Ǧ?&lfbghچ;N6d ^7apWp6ɆmCj؆;ِ1 wh]m8H6<}k1Al ِ1"FRCk qlAhAl ِ1r8q8D6&ԪX#㐨`8q8D6d ^7qHmql!h!lِ1\Z&qHmql{Lânual0ِ1Liaa!ca6=q8L6d ^7C6cG7Ch`bI$G6`GȆ-}#jG#dC6@G6`GȆ##QQLߙGE8 QQ!cgh]]1jGdCsQ8U8m%2GjGcdc/cgb6A6aȆc8q 8F6d ^7qLmqln6m6mT]8.ýjDZdCggW8m'2q8q8N6d ^7C6c'Fd^k'D8  !c~7Nm6N [p~[pBmql IwL5MIhIl$ِ19'9'6Nb'Ɇ9 9q8I6d >6Nm6NNGnb6NA6NaȆ::q 8E6d nqJmql)h)l4XqwUMb {aOm6N )rZm4ql8 jdCihi 0Ds<<-cg,cg-c,c-c,c-c,c^˖1o˘e2gX-cW-cA`5Xe,2v2v2v2fe ݶA5j^;V1<?u5΃jkqk8xu5΃j?X<5d#o7W21< OhSm$2ߋ{1j؆'ِ1 OhSm$2< O Ol h8I M3f | l ِ133!c Ϩm6ΐ ׍33YA[71Ί,Ϫm6Β )grVm,qlnuYl,ِ1;gjgsď.31Ή..ϩm6Α ׍snS8m#2q8q8G6d >6Ωm6ΓA<*\8/yX7Ϋm6Γ 8mW8m'2_oj籍dC6C6cFM+mb\p=1a{rAmql|N j dC6.@6.`Ȇ  E1zx4L‹‹jdC6.B6.bɆ{ыq۸H6d ^7.B6.b$41.o.o.m\6. )rImql%h%lِ1K%K؆xTM /76 /!cp^ІچE6d >x9Km "2S / / G^ͷu=L"^j"œ|[w.'r W"wdu=q={wGzb 7}oXq=&2ްxExzM"d >WxCju{ W\sqlv:^Ǽq۸B6d c^5l ِ1++!c++؆k!^G>Q6|Ȇ!m`>dC=1}6| !c>Q6|F6:s/S|6| _!cw|gj؆/ِ1 _hWm%2 mmb~d-51 ?hOm#27`᧶m 66 ?!c9S6ƂcJcbwj؆?ِ1"_m'2NW'j؆?ِ1x/mmcd$&F7`m ׍X76!c^4jFِ1mm`d#oV7rnºm  T6ɆF jF ِ1@h#Pm#۸J6ĸ*l\6m\6 SuUU!c~*7m\6 WjW 1iAbN sJFD6d Mn&7Hm#"2Sm ׍ h#Hm#&Ǐ801Eu#Xm#&2nmcdCu#֍``l#l 66kdU˛~eb\\\S۸m\#2E?HMCkql5h5lِ1r ڸq !901Bh#Dm#!23{!j!Fِ1l#lFmpd41BPh#Tm#%2 mmbdC6BPPl#l{Ph#Tm#۸N6v8_71 סjױdCuo\W۸m\'2S9ul:ِ1xݸm\W۸m jm}*qCSnu  !cq֍j7dC6n@76n`7Ȇ{ M9Ә7MM!cp7j7dCtMM!cp7j70ѕabN sJFF6d n# S6Ȇ0omaadCsJm"+;s[9-[-!c)[jC6nA6naȆm܂6nm6F&FnmcdC6¡ppl#lyJ8|m Cjm#;;6ncɆpNq۸M6d ^7núq[m6ql߸ mV۸m>u"a9eee,2v22e{h{d{l{b=Xb-c,c-cq-cX^Y^[XZY}}A5W7~uQ"5.׸q2"qEP1x5.B]"p'c(ָu171..m6 wwGmql|/܋q۸C6d nqGmqlM Mb/.܋q۸K6d ^7ºqWm.qln܅u]l.ِ1xotڸqn= Kws}[w/ u{j"œ|݃5=sd쟼ۺ{S{o.]u=p={^y.^#"aDݗ1x= R ׃Hr cz EDEDzI"d ^"HHl>eG51o>+Aq_m>qlo߶q۸O6d n>q_m>ql}h}l8xޙD6`Ȇ{pxx@6d n@mlhl#lVoL(cQL1~u66(!cwϢgQjQFِ1lܛRۈ6Ȇf((l!(13uW&C6}צ6bɆxxH6d n!Pm!ln<6m<6QKcb<26l,wexxD6d 3tspڸ{XZGdC#G#!c}G#GcS3X<{ =Vxm<&27~cl1ِ1x6cɆchcl >g~dD%%Dm lhl ِ1)O6`OȆhl#l蜷s#ZԍhX76h!cwV;jF4ِ1OEߟVۈ6ɆF4m<%Ӗڿ&x*l<6m<6 x m^ ɆװCmmC6 0166Ql??j` \16s>CH/??dC??j`Ʈ\Tmb6^A6^aȆm6^m6^ ׍WnRxm"2Wjd,ebpZm5l|_5}xM6d n5Zm5lkhkl (||x#l6ިm6ސ ׍7nQxm!2K/;^ 7!cuhl-Ngo[[!c֍jodCHΈ%6o6boɆ[;ݺCMw;h;lِ1;Nmld#oOW Χ:KŋxG6d ~;h; 1ZO?<Ƀ&_(_"œ|xo%Vx:\<'&_7,xw\<%'Mҿzy:~ b?ޫ{\ݗ1xzfh1}H՗C+=I{h{lhQ;SϳWMhlِ1Li#oV<^ !c+ӆ]bhm|6> ?>@6>`Ɇ<&GqGxGG!c>##>m|6> Qm#lGhG /nܗI/lY {>GBX"XbX˘2222222222222222e,e,e,e,e,e,e,e,ekX.N "C }jxڷ8OI/$=]1Q*^ mx1O YzOָ8PSǀ_B21:g ݳj dC0_7W ہ 6b Ɇ翄4%THm$$2B 6bF_;ncb$26o^9l-S~#Hm#lۺDm]"DF"!co9зu6aȆF"h#F"l#1{X?M؁v[m$6 Wba+_6cɆ=K@%VHm$&2_o'6m$6_21I$jI$dC6@I6`IȆ$pNIHB6d >$6m$6dy+]\21p~á6dC࿅pBum8 ِ1 Pp`!cphá6 G\[/IFRFR!c3@: I6bIɆHHJ6d >$6m$64%y# H HF6d ^7Lm#lF2h#F2l#ِ1xHm$SHm$'Frh#Frl#9ِ1xHFrFr!cpɡjɱdCFrF :Ö&F PHm 2)`HHA6d ;2)wdRm6R _HHI6&FJNI ))6Rb)Ɇm6Rm6R )6Rb)Ɇm6Rm6RU/>ebr炩`*TF*!c;b8mC{Hm"2_TjTdC6RA6Ra♿uzH-԰HHM6d oFjFj!c~#57Rm6R H mVHm!K71i4ji4dCu# i6`iȆm6Ҩm6Ґ i4jid#U?jb6Bi6biɆHHK6d oFZFZ!c5lZh#FZl#٠鄍tF:tF:!c֍tj鰍tdCu#6aȆtF:tFz1LFzh#Fzl#=ِ1x6cɆ{MHO6d vzh#Fzl#8vM ~6r:9Fl#ِ1 F F!cp j dCFh#Fl##xeMb##ȨH6d odFFFF!cpjdC62B62bFŝ5;tgbdh&LF&!c ֍LjLdCh&؋fRȄmd"2E3A62au={M̢ndu#Ffl#3ِ1x/62cɆmd62md62  mdVl+pȫۺ`J-+s$_.ip.揯;0Ok w+7O.mW_z%SeesEx~\ݗ1x=A,d!2#>"ZD\M@Y6`YFik}vY]slpK3 ȪJ6d  ۔Um#+lFVh#FVl#+ِ1xȪF6zkWv##>"F6l#ِ1#?md6 mdSȆmd#2߷mdSȆmd'k&>3c]|~]m#;l.NεWx16cɆmd6md6 ١jٱd69~gߙCm#lnu#Fl#ِ1#@sm6r mPȁm$__kS|~Sm#'l12y vx16rb9ɆFNX7rm6r ab 96rbFA+Ǭhbu#6raȆ1w'6raȆm6rm6r ׍\F.\FnA)ެ71r lɭM6d knknFn!c9%7Srm6r asC6rc_KjjZS딯66&2_údC޿޿Vln| m|5l$ߖ219%Sm6 ԍNbhm6 )yGm#l|#Gm#݆|Pv>Dy-x䳌巌}c+m+c+k+g2V2V2V2V2V2V2V2V2V2V2V2Vr>L^q7>vWԸU׸'cv^ΫqyqK5N5./qy5./qy| k\^uˋ|dc|[A+M|F>h#F>l#ِ1z+ӆzm6 F`oOm#lF>h#F>l#?8R{݋MF~h#F~l#?ِ1;$;$6cɆT*F~l#?ِ1*?_m#?Qlfde&FaQ@mQl|ܧ+Q(@6d nQ@mQlo.mP(m$oL:eQP vAFA!cQ֍jdC6 B6 bɆFAhFAlUE&F!I!I!BF!!c3 3 m6 `QHmQln6 m6 :Ϸ21 w w m6 S uJaFa!cuJaN)Q(L6d ~>LahFalٸwq L"("jE"dC!!Q(m!2Q(Q(B6d nQDmQl|e`M.%׋m6 ׍nU(m%2Q(Q(J6d n(QTm(Ql8 <`(Q (F6d ދh1bF1!c~7m6 ŠbjŰdc ۹&Fqa8Q\m8QlnuFql8ِ1FqFq!cuJqhFqlL(Q(Q(A6d nQBmQl|N)j%dC%j%d#m21JpFIl$ِ1R)%6Jb%Ɇm6Jm6J U7jFIF)шޱ51JRpF)lِ1&&6JaȆJRjRdCuQJm݆#o̷u=#ɟƼjyo"œoœ}uqTQow\<%߭o\J=Ri^iG}Di/Ai2+JùAi\Jjq=(M"d ^JC6Jce/oL11ʈ +ʨm6ʐ wY~wYFm QlFhFl ِ12F2FYQ!'eE( FYFY!c8D 4U(m%2Q(Q(K6d oQ(Q(G6F\qDkaz#6aȆצڴF9lِ16$eb8m0ގx16aȆm6ʩm6%n?XtX~ צߪm|m|K6d n[h[ooɆǷjbߒ Vm[l<وp=&FyLyLyFy!cp塍j屍dCsJy8W(m'27C6cFtQA`/ZAmQlߨ j dCu6*`Ȇ+@6*`Fa bbTt܊d|ZQm"QlnTuFEl"ِ1s9IEFE!c9"QQm"Ql۹;h`ݨQ ۨD6d Q oTRۨmT"2S*9F%lِ1^x%hF%l2ٸf#MʢnTuFel2ِ1xݨ FeFe!cQ֍jdCT6*mT6 [mQESuJ*F!cQ֍*jU*dC6@U6`UȆE]1*jUd|G 71ꆙS'&U6bUɆ`˥dö\QۨJ6d >TsJUFU!c9*QUm*Ql''EmT6 ׍jnTSۨmT#2`ݨQ ۨF6d >T6mT6fQ])R]m:Ql jձdCkp []m:QlnT6mT6jSԛ;Ĩ!F X7jm6j 5`/ZCmQlF hF lِ1xݨmPۨm$uG 41j 5j5dC$Մ$Tۨm$2QڨQۨI6d S7rb퉪%chm6j+GZ;6jaȆEk}ZjZdCF-oRۨm"2icvzϊ%chmԲc;χm9ǣeee;X}XFƖ&f斱V֖6v,c,c-c],c]-c,c-ԦwyJ[שj568kSm%V׸ڸզ'cWָW׸Td ^jW[]j9u~_GmQl::ju:dC{1u^L:F!c}:oQۨK6&ߕSXoׅjudC{1u^L]F]!c.m6 uV+F;d F=1=zzF=zF=!cv=ޮQۨG6d nQOmQl|MUm6#777wjaߑ Nm;l;!c~;o|ِ1\b9;ﰍds'Q_aQ_m>QlF}hF}l>ِ1N(fx16cɆpNQh@6yJWS9Flِ1FF!c5]1R!EZ dCu 6m8?|[W>|[=ZvI\߭:^{sd_.iH85Ww\<%xک\G{=׃tϗZ4N^CQ»P}zА AC\MµiC4$2+¹FCl*7ݎ&F#aHmшlF#hF#lِ1FF#FF#!c\16̏eCkјl!^X4jdC{ZVcFc!cic6mhL6d c+٨+^ Fф~h"FX7m46 M`oDm фl|?m46 M`Dm єl4X6kӦjMdCsJS84Uhm4%2S9FSl)ِ1^xShFSl8gGMfffjͰfdCsJ384Shm4#2 h hF6d nLmќl|?.έ\a\m9ќlFshFsl9ِ1)6cɆalwpYOL-Ck9тlTKlz&F Mn Mn F !c~7Zm6Z -`/BmтlFaW ?qd FK1U-ahhI6d n%Rm%ђl|%lhI6d c+Ɨd F+M MLVuٰ`N+VF+!c[[m6Z `JmъlF^W OjZd#LahhM6d ^7ZúZm5њlFkhFkl5ِ1x6ZcmFzOjhbƁ~_Fl ِ1FDOW x16`mȆm6ڨm6ڐ Fm іlջkXx׽-|׽F[l-ِ1F^N?͙tZmdC6Bm6bmɆA6jtp+Y/F[lp|l&F;oShm#2hhG6d nNmюldã+F)S(^ vF{A,Uh/hhO6d ihO6d >W{dF{l=ِ1LnCk=сld1Aw{6:`ȆazўNӇ_}yzx16:`Ȇmt6:mt6: lDppڸӶi%mt$bbt.pEm хlSmt6 mtQmt!2? Em ѕlLnxzB&FWa+Um+ѕlntuFWl+ِ1)]6b]Ɇmt6mt6K|j|Lnb amt6 ׍nntSmt#2`覶 F6d >t6mt6W=7\+obtu;6cɆa a{]m;ѝl|;讶N6d ~6rwhFw t>0{>L9=-c,c-c},c}-c,c-c,c?ZZY[ƆXƆZ~ laiemc2elelelelelelR1G^=̷uyG^z+[{e3O}[;C]z뙹x2O^m]PW*f.]vZO?MIro=[O絞te 7T;絞@=OOT絞$B詶E6v.mbrF/aF/lِ1x? ý6zaȆ{^饶 E6d VmRm&Q>l[ԍްnVm&2a譶M6d n7[m7ћl mVm!2vKIXGE>F!c8D t\>F!c9Sm6 mQm%ݎ5JWut_F_!cp}j}dC6B}6b}Ɇm6m6sV'~D?~F?!c~7m6 mSm#2觶O6}jz11~?7m6 ׍nWm'2F?FFl?ِ1FqIϬMwVͷuFRMCm 6 ׍n Pm 2E^tlcِ1v1@mc#hb~MŻ?wTl;$?mmH6d GƏƏdCk6~6uzob $ ,H6N&r]am 6 m Tm $2a1H6d ^7B6b?ʎ)$A1D6d 1o Rm "2E^t lcِ1xm Rm 6ISCd``D`؋Vm 6ND nc01Xmc016Fm6FΧLѢnuchlc4ِ1̞yWW jdCuc46FcɆhhchlc XTy֪1FSu1!c ƨm6Ɛ ׍1nQm!211l Heb"~{_mmB6d sXW οJċ ِ1N3Nj ِ1__6~p~y֖@ׯp&U-Ws$_.>7Ix~U;\<ٗ3.f_wW7O.Mүz0yBLnsX8WU/cG7W #cz0 EUX!cs,1Vmc,1lL`?IMqb1?Ʃm6Ƒ M8q8!cp㠍qj㰍qdCs8hc8lc<8噵p1^a1^mc<1lfmiü[,^ x!cp㡍j㱍dCuc<1^mc<1lI&6; j dCpnLPۘmL 21ژ1ۘ@6d 9ژ1ۘH6*/&DqDxDD!c=pOkDlc"ِ1DD!cjIdc7$01&ꆹ) 4S۬6&mL6& ۘmLRۘmL"2dd$lcِ12 ژ1ny=E .Ę*TSjTlc*ِ1TT!cg:S3jSdC6BS6bȆ#oLi.nL##g:R֍ijӰidC6A6aȆ1 ۘF6d 7O6mL6ntĘ.jӱdC{1^tt!c9e:SmL6 C6c)νd7Q7~u7߰Ȇmmِ17orS l|N Mm7lc]賗& Q7f1Cmc1l hc lcِ1xݘ  !c1ژ1ۘI6z_3]6LݘI6jxڷ36fb3Ɇm̄6fm6f ۘ mTۘm$2ߟ mTۘm"sGĘ% ΂gm6f ? ~?Kmc1l,hc,lcِ1x/: ژ1 ۘM6.;2/3c fm6f ׍ٰnVۘm&21ژ1ۘM6d nc61[mc61l$N1'Ocߘ7m6 ìa{b8m_&^ 9!c51ۘC6d nc1Gmc1lyhcE^t\lc.ِ1\1Wmc.1l|2Sm6 SBs6b :QS~sjc !b mmN6d ^7~uw߱Ɇmm;1lz>G&ِ196cɆ{1ۘO6d nc>1_mc>fe@mmA6d aPlj` @mm, Çϙib,/./.PXm, 2_.kj dC6@ 6` ȆϕZm,PXm,$51֍j dC0FwW Xm,$2XXH6d >,6m,p~.ͷuO?"œ|o5O?œ}'|CO~SOxT?q=XDD-xlmmmmejfnaiemcks[ZY[ƎXƎZƎYƎ[NXNZNYN[·YO5ș[;\6֛:y=85n=q׸Td ^^]jƭW׸x@6zXA7 !cp j dC pAmclomlP؀ml$M켍켍jdC{FF!c5FڨH6d nc#Qmc#l<$l~6ml66 65&M&!cpMjMdC7A66aFw1^gMfxflc3ِ1)66cɆpN٬L6d ^76C66cFk&>cblolQ؂ml!2C@uclc ِ1Y[Y[6`[Ȇ[-j[ȆҦy AmmE6d n_ֿ66"2__dC66R J6 S&Vac+Umc+lՍjCVolU؊ml%2تF63T~&mئ F6d c+ӆmj۰mdC6m6!cA6aFw/.?nblp]mc;lnlucvlc;ِ1vv!cخA6&;&Q7vCmcl"倰/NjA6d >s!cuhc G^;ͷu?o3]NvI\Sr.֫;v'cmNmTo.]u;=ߩ;q=E2vb+v.\vݗ1~g7W wŋu ׃]@s.8WR؅.!cz إ M6/.Ac+vùbnlc7ِ1[mc7l|b7ܷحM6d ߹حC6xcX=!c=pأC6d G}=!csGmcllpܹ}&^1s^^!cm6  mU؋m%2SB{6bndޖUnbNqsچF6d lmandCnuSp6Ȇᦶm#y11֍}j}dCphN٧G6d ދ>}>!c=}>}~ѹn͇w;;6cɆ~X7m6 )ᜲ_mc?l|NmW؏m q@ss@mql|s!c9q@mN6GZps;S6ܱ w!c놻چ;N6d >9]mp'2mmcFRn51lMdvAA!cpjdC6B6bɆ>mT8m"M+/XCjCdCp!C!!c~7m6 CjdcW[mMâ8 jdCprXm0ql8 jdCsahal8p&㈨G`8q8B6d #!c9Sm6 6m6}_E`bggU8m%2_딣jGdCsQ8U8m%28 mU8m#U/>8&):1lِ1x81c1!cpǠcjǰcdC1h1l8hekMYqql8ِ17I7I6cɆ8q8N6d o6m6N}-8!l6Nm6N l>=A6l۞P8m 2F>?q8A6d nqBmqlyBj͹qF3!c3p/l ِ1ƺ-iOqvċq8C6d Ow8q8K6ڎ,㬰q8q8K6d ^7ºqVm,qlnuYl,ِ1l&qVm݆#sۺW֝o-S8ga.]u`8vp\<ٗ]Gw}sNr]s{~׃tϽ_dcVL61|:S|6| !c8D ԋm`>dCu  lÇl|N6|6| _q?7M _/FWm%2E}a/꫶m U6|Ɇ7| _ _lÏl3L ?/E6 ?!cwg~j~؆ِ1a6 ?!cmmad31]sdö@W6ɆmCj؆?ِ1 lßl66ƚ hF@6d n#P6Ȇm@jFِ1mm`d#8ŀ11E@@l#l|#ombdCsJ S6@!c9%T6 e&UN )W6bWɆ{ѫq۸J6d n*qUm*qlUhUl#l4+eBL Lٰ<m o l#lFm 66`1͐)#L`N ``l#l|#omcdC6``l#l 66kd\]`㚨`ݸq ۸F6d ދ^5k5!ckp5lِ1x/z ڸq ! N|Wu")!j!Fِ1l#lnm 6B6BPA_q 51B]6L%B6BP!c^4jF(ِ16aC6BP!c~#U61p&uQ7úq]m:qluhul:ِ1r)6cɆuhul80.έ ㆰqڸq۸A6d nqCmqln܀u lِ1R7j7d#ĸ)7nj7dCMoT۸m$27aݸq۸I6d :lT۸mٖ`bFFF6d ;aw6°0!cpaFFF6d >AajavΏcno&w5nEܲ0O uqqK݁x/nK}oᄍxJvϿu [{~ ׃p+> sE8+w?׃p2pj׃p("\-"׃p!czmmcFxs61n6+nm6n ?C V۸m&2qڸq۸M6d yڸqny8zҋ<yG|;{H}Xeeeee,22c==Y^X^Zc{e{m{c{k{g222rKոnu5.ָu5.ja濮Wվ5ŋqEP1lܛP׸\"|5.B]"wl_swhwlِ1"m6 wwGmql|oqGmql,|:Vn&]Q7ºqWm.ql=ﻫq۸K6d n.qWm.ql|.qWm.qlTkqOظmS۸m#2C@6m6 ۸mS۸m#2A6adټt21";$p%Rm#ۈ$2 mDmDbdC6"HHl#lF$m'Clq_ظmW۸m'2qڸq۸O6d n>q_m>qlC6cƔgfl`b<s8kgjϰgdC3g3!c9LmldqyC}89<sl9ِ116lGzikJy ۺpWZKsq/Ϸu/aoR݁Ǘ{_//w\܋]mKx_K\^=Swq+1Ws++2+9c8WY:x+r cwv^wv^E1wدWjdc>Lb5 6^cɆ-x -xxM6d >Wkl5ِ1~khkl x|L7nul ِ1D 4Qxm!2>{xC6d Fm l smjn[a)o6boɆo[l-ِ1xx [[!c}[;і11މ֍wjﰍwdC6A6aȆ;X7ީm6ޑ xmSxm' ܑdf.7~{l=ِ1)6cɆ{}xO6d n=^m=l\;uヰ@6d 7=_@6d ^7>Aml|OAml,g&Ga#Qm#l|N甏jdCu#6>bɆm|6>m|6>s[mb|6>A6>aȆ&bIml{OjOdCs'h' 0009Hs<Z\,c,c17˘e2iKly[|,c$1?˘e,e,e,e,e,e,e,222hKg ep0I8>Jeg ѳIOkg}1`K%pG5󿧎k\w{1 Qc/!8#MFBh#FBl#!ِ1*;ZS%THm$$2(FBl#!ِ1FB؆ dŝF.7rQp6\Ȇm@.j.؆ ِ1xpuEmp!2]  l#(w&F"a#Hm#ln"Sm$6 Hm$RHm$"2A6adczCM W 3w\>uUp6\ɆtuGgnmbdC6\ W WlÕlnBj؆1;m&;_䦶m )npNqSp6Ȇ>چF6d oAnjn؆;xL wg0/y j؆;ِ1w wlÝluچ;N6d >Cj؆p(09u  lÃlnxᡶmx 6<6< !cpІچI6siӝ[鎾T6<Ɇ OoxmxbdCs'S<6< O!c~T6қ:%1\$VHm$&2jdC6C6cɆFbh#FblËl dC6|  lÇl| mm`d'Nmb}j؆/ِ1&]_ _l×l|}mbdC6| _ _l# ٸzRI6LHB6l%QHm$!2_$$jI$dCh؋&QHm$!2S@I6m8>JJ6%]FRv_.B9/jDRvn]Rx~R7bw{T}ϓzGOf9-_(~te m;O?r czEEzG"d 666 }{M G>_m'2#aW6Ɇ{LcmcdC}?᯶m$#N:ylR# H HF6d {]&SHm$#2 H HF6d G$6m$6 g}kb$6C6cɆFrX7m$6 ?GrFr!cpɡjɱdHl-|LF h#F l#ِ1#\PHm 27R~#F l#ِ1HHI6.21RΔp%Rm#%ln"JHI6d ^7RºRm#%lM mTHm"N9~H%l6Rm6R )Jm#lF*h#F*l#ِ1TF*TFj,M6Rm6FWns31ķۂl#ln4ppO`?n"@m# 2_uJF@6d ދ@jFў~[H#l6Ҩm6Ґ Fm# lFh#Fl# ِ14F4FZЫt.&FZ羨l؊yZFZ!c22Ҫm6Ғ )iᜒVm#-l|NI mUHmuS|L@ k@@l#l hF H6d n#T6ɆmBjF:~ѝџnRtbNItj鰍tdCu#6aȆtpNIHG6d >6ҩm6F/`b AFFD6d N l#l| װAjAFِ1x66dcro31ҋo o ҫm6ғ }{_6cɆpNIHO6d n#=^m#=lioM j dCFodPȀmd 2Ƞ@6d >d62md_χ0=&rGe,e,e,e,e,2fj EX"-c,cQhXe,e,e,e,e,e,22222g+`+h+d+l+b9&j/fŚ*5.׸`q2qS1x 5.X]q 'c/ָ`u _()K#Dl#lZFB6d 79Dm#!2mm`ƷO(T*FFl##ِ1D eTȈmd$2aȨH6d e62md62݇$F&X72md62 L&w;262aȆb2LjLdC62A62aa,ld62md62 M@FfFf!c9%3S2md62 Pfh#Ffl# צdΏM,Fh#Fl# ِ1Y໭Y6`YȆFX7md6 Y,jYP}CwGb.ӅmbdCF(7B6BP!c FF(J6d n#U6DwlM0ы^4Lm# #2maadCu# ֍00l#l666ye5qۺpW#ZDVsqWqq7őjY=\o•HVj^wz;/yV=ϊA89#W_k腋zAzNw_ :W; zA81x=66±wLcF3Bm#ۈ 2mDmD`dCZDmD`dC}DmD~ĈtI6l?tmD M#4Rm#ۈ$21#amD ۈ6"6"ldҨ^01$`GMm#lF6h#F6l#ِ1lF6lF6!cp٠ljٰ(W521ę@QL((l#lFmD Q߈Rۈ6ȆDAQjQF4٨N}-hoDmDcdCp"Zm#ۈ&2 mDmDcdCh4mĐ1=^51bs94lTy:`y*nĨm`1dC6bl#l|NsJF C6d >@1j1FvqxoEFvFv!cwVwVmd6 ׍ndWȎmd'2?2;]m#;l'KQ&FqXxXF!c֍j9dC06 ;c8l,0eȁm 27r@96r`9F7Ofdb딜pSm#'lmaj9dC9FNFN!cp9j9\dcʍ]01r9EME6=>\6raȆF.X7rm6r `Km#lF.h#F.l#7~KjnFn!c~#77rm6r a[m#7l|ȭۈ%/+ɍƪmbdCu#֍XXl#l|NsJF,K6d N6b6bo11: v^a{q;F^l#/ِ1x F^F^!cuJ^NɫK6d ^7By6bc*21򉺑֍|j|dC0a9c8l~$F>l#ِ1x6aȆm6m6Cg[z/am6 ?OWȏm'2S9%F~l#?ِ1g d#F~l#l;N:nbĉFFG6d 7#tFG6d k88l#l| mĩmaFbOZ51 =pϼFlِ1D T7 m6 ׍nP(m 2S @6 `ԯ u((l6 m6 l7upؘ{/FAl ِ1FAFA!cQ(Q(D6l+E!S 9F!lِ1:\R(m"2_BjBdC6 A6 aFR 41 w w m6 o4rpp߽yx16 cɆ°(Q(L6d >6 m6 &F1sJ"F!cwwm6 )ERDmQlFhF |>DSrG1XqX XIX)XiXXYX9XyXXEX%XeXXUX5XuX XMX-XmXX]X=X}XXCX#XcX0EƍXTp}ϩqEa+qEq+J5NggU׸'c(k\Q\R1xoTָW^y3%r1bv_.=r1bvw}sq/v+y1=/{t?x.CX+w8}?+W;(Aqr c8yE81{šjűd#nAew%\Q%6J`%Ȇ.Q(A6d >WբF lِ1\Q(Q(I6z^vXGj%dC{%lIFI!c}%j%dCkFIF)6&F)Y)Y)RF)!cR(Q (E6d ^7JQJmQlF)hF)l4x#i&FiQ7JúQZm4Qln"QZm4QlFihFil4ِ1R(Q(C6QFe`QFm Ql(2je2dCh؋Q(m!2Q(Q(K6Zq0QV( mU(m%2ea(Q(K6d n,QVm,QlFYhFYl٘fݽ76aȆ{r-Q(G6d >sJ9rF9!cp堍rj對daO31ʋ^ QۨI6d װ56jb5ɆmԄ6jm6jΎ;;6jaȆaFcg 4b,CkQlF-hF-lِ1ZF-ZFmcĨ-FmX7jm6j aQ[m6Ql|N jdCFmhFmlٸ2ˍL:^!KC9Qۨm!2k KK\GmQl{:ju:dCuQGmQldscb566uɆuN_F]l.ِ1Y[]F]!cpujudC6Bu6bF zabF=oSۨm#2Em6 `QOmQlzF=zvcoVſIEWoa.~TU_݁?U_~Ž&>> v})^Q@}zЀk4P;hAr cwvwvE41\hhH6^}P?GCFC!c>!#m46 ?GCFC!cGChFCl٨4̷ʪ&F#Q7Hmшln"Hmшll{FjFdCuHmјl<}ahhL6d 7=_mhL6d >4sJcFc!c8{"&Xm1фl^ݭ8sܔ&dTQySm46 i5{ZM6`MȆFX7m46 a񏉁l4Qhb8eI/lYM-s45uuu}elbjf222222222262626rKSq :qsj*濦pkqMqkJ5Np1T]הjk kqMqkJ5N}sSX㚪k\S<5#=dL`Lmьln"ꛛm46 Lmьlonm4Shm4'3g\hm4Whm4'2l4Whm4'2hhN6d ^7C6c-z/6_ebsJ 8Phm 2[F lِ1F F !chhI6/:P!HhhI6d Thm$2ߧk Zm6Z h mThm"/\0h%ii hE6d |Jmъly_+ħF+lِ1o 6Zm6Z6%u~ZԍְnVhm&27Z~Fkl5ِ1)6ZcɆ6Zm6ڐVfbql^$nC6lfQhm!2S9Fl ِ16F6F!c9 Fm іly{’oL]]jmdCh[؋Uhm%27~F[l-ِ1F[F;s9FFF;lِ1W;NmюlF;hF;lِ1NmўlԦ51ڋ~=7ګm6ړ a/^m=ўlF{hF{l=ِ1xhmWhmt tsȆjdCFotPmt 2f>3@6d ^7:@6:`4.71:a:a:mt6: ?~?Qm#ёlntuFGl#ِ1FGF'6c}MNbNNjNdCu6:aȆF'X7:mt6: mtRm|E6Jo|lo+Jm+l+!ca[WCk+l+!c_m|m|E6d n+h+d08G/a謶L6d װ6:cɆ7:jdChghFgl ٠=L.FhFl ِ1u]u]6`]ȆFX7mt6 mtQmt%o8Z51 ]j]dC{]yWFW!c)]j]dC6B]6bF|t31~7mt6 ׍nntSmt#2 覶 F6d nMm݆#ͷu|[5Zvn΋5j_{m_ᄍ?} {5/}mΆ^w1WtsEwAw2߷-t;91x"zНDjwhFwlٸsaۆLZ Flِ1s9IF!c1{m6z M{@=6z`=ɆL gj=dC=fOcTm$2=a詶I6d G6zm6z=O%^pN饶 E6d 6zaȆ{^襶 E6d ^7zA6za}LޢnuFol7ِ1֛lئjdCu76zcɆFohFol=b'Z}>F>F!c9Sm6 mQm!2}>j}d#yg"[}9}9}6b}Ɇ{ѾK6d n/Wm/їlF_hF_l٨jbZD6aȆF?X7m6 SuJ?~F?!cp~jdcVn43133m6 mWm'2诶O6d mAhFlc8X!bMM[[jdC0b'71@mc1l|NjdC{_jdeg&@@@@!c1֍jdC6B6bɆm 6m 6´gb  o Rm "211D6d > s A !c5 hc 0Nqf`9C,cXƆZƆYƾ }giem2eleGX8xD$dT4t LOYٖaSgY: ̟` `uk`q2ߧ k`\S1Lꌑn 0^ mk`q27X]oz&O7 Qm !2/q|/qlcِ1Fj:<<,(^ !!co1Dmc x_]}{o66!27j`ߐ l .Qx166!2ߋFmlc(و cmcS9ePlc(ِ1sPP!c93Ɨ9;^ P!c11F6 ib uc6aȆ0X7m 6 G7 G7Lmc1l0hc0l[ݩCkߊ-ߪm|m|K6d o| o66%2SJ:c8l[Qbhm|m|K6d ދ~ m|-1l\s(P.pX7m 6 M@m 6 ԍŻD$X/^ p!c~c81\mc81loY*&Q7F1Bmc1lh1bhm6F mPm 2SF@#6F`ߑclb|'l|m|ِ1x/ESlFqg cn{,IZaߑ ?Nm;lc$٘ҽԊ&HHHH!c~c$7Fm6F %16V >p9n_Z#dCsHhcHlc8YMQκan(aPa(lcِ1x(Q(!cQKH/(lcِ12 1 M6|]O9cs_hakD6FcɆѰ1M6d aJ=y<+Gŋ1M6d j6y}oCy]m{1"W.\?HܜGk;0r9͜}Ow?\{}sq/Ex;/{=?=SqWiCSA}2mj?z91AuC+\~ 2#~6~PC6vצ1FwCc6`cȆ-1Fmc 1l|ulc ِ111Ədݑ71~6~6~Tlha>\/ƏƏdC06*8c|y(uZ?b? ?B?mm%yj\+֦ctXlc,ِ1c,\Um%2n,nXlc,ِ1x mUm#_c ǩm6Ƒ [6aȆm6Ʃm6Ƒ ?'mSm'T/21Ƌ9e{7O#CʧmL6 `1Mmc1l4hc4lcِ1x/: ژ1 ۘN6~wGvcaݘ1ۘN6d ttt!cpӡjӱdCsthctlc8s1& "3vY7fm6f ۘmPۘm 21ژ1ۘA6d NmPۘm$nLn̄ucLlc&ِ1x136fb3Ɇm̄6fm6f ۘ mTۘmD6V&Ob_'/OOdCOIm'l'!cp?A?mmD6d >m1l|yje01f1 ֍YjYdCuc6faȆ7fYjYdCuc1Kmc1l*ﳚl5[mc61l9lvllc6ِ1ll!cpj6àa{>9s-c,c-c ,c?[ZY[ƖXƖZƖYƖ[VXVZVYV[XZY[6X6Z6Y~mmmmm3jg{ 5Ns7s5nqswrɝqspC5NQ׸9͡'c}9Q׸9xK6;ްbbu>3O5撍G1Wmc.1lo jsdC\8Uۘm%2Bs6bFfdbs__T_Sm6 a<_mc>1lṅuc|lc>ِ1xݘmWۘm, qckb,6@ 6` ȆA6:c8lLuNCkclhclcِ1v~6 6p~[3|3g"]\߭v݁xAu?Yg~Ž8g\=opf_) ,`/`!}.#RKŜ)K6bKɆצKtRlc)ِ1xX RR!cΥR2111 ˠej˰edC6A6aȆm,6m,6 ׍e2er{E˅rr!c^t9Em,6 Surr!cpˡj˱dWg+D+6V`+Ȇm6Vm6V XmPXm 2XXI6*MRcXXI6d nc%Rmc%lJhcJlc%ِ1J*cBk$&*1s*U*!c~c7Vm6V SVu*U*!c)v*UjIk}Ljhcjlc5ِ1xX jj!cpjdCuc5Zmc5l5,F)kFmc l|c XXC6d nc Fmc l|| Fmc ldM⽌𽌵jkdCuc-k6bkɆװkvZlc-ِ1xX mUXm#-6𫇉NԍunSXm#2`XXG6d ncNmclu:uz1'm&zozz!cp롍j뱍dCp^mc=ln6֫m66?&< X76ml66 ##Amclhclcِ1xؠH6Ro:QmlT؈ml$2Gx#|GxFlc#ِ1x/66bɆml66ml66 :*I`/Imcl]M]MjMdC&olR؄ml"2 ؤ lX{)nP_ķuo~Ql| \ ِ1__6~6~!27~6~QL6-cجL6d q3ÆjdCfolV،ml&2جB6<*[o?-döYEmc lL-L-j[-dColQ؂ml!2S@[6`w.,kblV؋nU؊ml%27~cVlc+ِ1)[6b[Ɇ mlU؊ml#S̙cF{1eŶml6 U UMmcl6hc6lcِ1m6mv^Evv!c֍j۱dCvolW؎ml'2SC6m8>aIjj~rZPaa..}{;v{|{8;w{Mxw\v=+*$sCo wN\vݗ1;;vz| 犝j;q=I"d ^vB;6vm8}Yܗy6,]9v[XZY[XZ~f;g2v2v2v2v2eeeO˹/uqmicXvk.\vQ1D 4R׸]'c ָ] ׸]Td 5nn$xMb jdCwnn!c=penlc7ِ1حC6n6s.Y73=dcEk=!cg{=j{=dCuc{6`{Ȇm6m6ڎ{`b}{6b{Ɇtm6 •^^!c9e/Wmc/l4X&>acOmcl}}j}dCuc6aȆ>hc>lc?٘Z&~o~~!c^t?Em6 ׍nW؏m'2د8@6N莉q@8mP8m 2S9lِ1x8!cpjdUnžAoPm qlAhAl ِ1x8AA!cB6byGkzUԍ_aUmWlW!c9W8++ِ1x֍_6~6~%2WhW_Cdog C!C!!cpCjCdC6A6aȆ!h!l0{&U&a/zV8m&2&0&al0ِ1aa!c5ahal8T8"X7m6 a5#!cpG#jG#dCshl((wGQQ!cq֍jGdC6BG6bGɆm6m6^_Hlbs}Ȇ1lِ1gg6aȆm6m6 )ǠcjǰdcO/žq/z\m8ql]]jDZdC6C6cɆ7C6c'gMN '6N`'Ȇ)': lِ1  !cq8q8I6"yqRSNuII!c^3ÆOm6N a#AEL ?j/Il$ِ1xq8q8E6Zl9ӆ)3x&o)S)!cu)N9q 8E6d S716^{ZSdCs)h)l4٘묉qZ왟{6NcɆm6Nm6N )rZm4qlihil ٸ2aķϘgqG{Fm qlhl ِ133!cpg3jgd#721ΊpYl,ِ1x/zg6bgɆm6Ϊm6Β gjgFM Mm7l7!coja  Mm7l7!cpAmm#r8'7sj簍sdCs98S8m#2|9lِ1r8qnۺ~jE~;|Ww=ae]}}sq/v;Gw=׃tj~;/yXΫy\ݗ1;;硃jq=8Od yy'2硍j籍 ddΏ=db\}G\P۸m\ 2qڸq۸@6d >W\s !cp jdc\?hb\qQm"ql|q?.m\6. ۸m\T۸m\$2s/l\T۸m\"ܒ(rĸ$%X7.m\6. ׍Kn\R۸m\"2q ڸq ۸D6d nqImx]㯟g3166Pl|\ِ1؁ِ1kSg d?d#y_11.^2E/m\6. [\6.cɆm\6.m\6. ׍ehzj61q֍+jW+dCo\Q۸m\!2qڸq۸B6d n qEm 'XVN5;M?E/'ETlmmI6d nOhO??ɆSmO 0#3;Zfn2v2v2v2v2v2v2v2v2eeeeeeeeeeeeeeeeeee|TntUԸ]U׸]'c*kU\R1*\S]U׸]'c*qW5*L lĸ&zk7q ۸F6d ~>5x>5k5!cm\6 ùO猁l\S۸m\'Mbb\kpMu]m:qln\uul:ِ1u]m:qlo169˹VDڸmE69/f/1甿66"216*Qx166"2Ss_ja Ho]D ۸A6{&ӆ98I  !c5 q۸A6d ^7nqCmqln܀u l&pl$ĸ)攛pNq۸I6d o܄MM!cp7j7dC6nB76nbF~u71n n nm6n ߂6naȆ{[q ۸E6d nqKmqlZ^7n~ml6ِ172726ncɆ۰߸q۸M6d )6ncwĸ#;pNq۸C6d o܁;!cq֍;jw;dCuw6`w{VYeb6Bw6bw"y.a5?bhm6wE n.qWm.q׼(bnU۸m#fԚlqO)rOmql߸{j{dC=؋S۸m#2`ݸq۸O6 ĸ/}X7m6 };26cɆm܇6m6 aݸqllzO˥&bogdCf [molo!c^o؋77ِ17Ao5,61֍jdCu6`ȆX7m<6 l QЫ5 CkldVMκa` Cl!ِ1x6bɆCX7m<6 la6xm<"m3vgE^#lِ1#Hmlno3=Zcsq/=5csq?=~Žz;/c=Ww$kDԃ'x+<~ <~xK6d  oo,Uxm%2_þkطjodC0К:c3ŋxG6+P8㝨`xxG6d o;w;!c֍wjﰍwdC0sJ3g/sJTZﰍd+ž{/^m=l| a߫m6ޓ xmWxm'2QF`ZﱍdcE+]G11>2>2>m|6> `Amlhlِ1̜Ra#ͽ2 ƋH6WN71>=pGl#ِ17I7I6>bɆ7>jdC>kD6TbIm|Rm|"2 >k D6d ^7>ImlO'Ov0O0 <{GB˘e,e2fsyX<-c-c^1o˘e222g%%XXZ-c,cA =/if5ixոIOhcO?1xKjOָ^k\T>{pKH6 ab$hPm#!l|K濄j dC6B 6b ɆqNm$THm󏟗7pu  lÅlnᢶm ӹx}: lÅl<hEmHD6Da&F"Nۉ6aȆbyDjDdC6A6aȆTDj WQ)_%jb9)j؆+ِ17\W WlÕl|Nqsچ+J6d npUp6&JL6&0yuaX-"]뗋m]b[$V;Hlw`./ۺ'Vo..`'Vĸx=|ЅB} =/Gx>K}p=/c ^j^x/(K- /!c / /lÛl<]]^&F}u뭶mx [x} o olÛl܆7᭶mx 7᭶mO!^01|>j>؆ِ1g>3 lÇl܆᣶m ?|  l×llL&ӆL%!䫶m )pNU6|ɆmBj؆/ِ1s_hWmHB6Dԍ$n$QHm$!2J$jI$dC{I^x$F!c9% Dm# l\;iOW#)H9-.]jIdC6BI6bIɆ=K=KHJ6d oH#Aڔl~pOm#2S⧶m )~pNS6Ȇ?hOm';a a;_m'2_uچ?O6d >9_m'2Іچ?lL:mƎ&F2 o$SHm$#2S9%F2l#ِ1xHF2dF2!cuJ2h#F2l#98R&Frg0g$'IHN6d n#9\m#9lFrh#Frl#9ِ1FrF uKmM7RxHHA6d 7))6R`)Ȇm6Rm6R HmPHm$ew)FJFJ!c^4%ESm6R SRuJJFJ!c=FJF*8b+#7R~#F*l#ِ1 )6RaȆ{TM HE6d c3Ͽ1Hm&{H-RýjdCu#56RcɆFjX7Rm6R (\x16Rcd01Ĝl#lnm P6Ȇ#FFlsH#4pNIHC6d 󬭑3Æ%ϻNjHC6d c#aHuao NjHC6d ~moQHm%|+#M EӪm6Ғ SuJZFZ!c~#-7Ҫm6Ғ H${Z421E@@l#l@t~F H6d n#T6Ɇ)FF l|j`bF:oSHm#2E^4F:l#ِ1tF:tF:!cp頍tj鰍 sy&FmmaAdCo 6 !cpAFFD6d pm'-o&51ҋ9%=Sҫm6ғ a^m#=lllj鱍dCu#=^m#=l>oM Fh#Fl#ِ1Laɘ96Ck#l| a3md62 S2@62m_'|`9!L̖,PXe,e,2aeEYƢ-c1얱\ܖXXX^X>X~Xeeeee|`q7Y9`qS1{`u 5.j{`k\0qTd qx ![#D!p Q6BȆpCnFB6d C6B!cp!FF݆#ۺ]UvZaEFv_.uj=\o2'g}sq/vEG&Fx$Cm i=ppl#lF8m )FF8A6G,I~a`#ȆGmD`dCp1МmD ߈Pۈ6"Ȇ6"6"Hѱwߟ01"E݈u#Rm#ۈ$2nDmDbdCu#֍HHl#lnDBjF6@#ٜ)Ȇ퀷ljٰldC6A6aȆ{lͦ F6d ދf6md6ƍAn11F߈Rۈ6Ȇ!DmDaQdCDwH6(!c^4 ڈRۈ6Fp61kXh4ٰDmD  KVۈ6ɆhoDmDcdCF4mĐkv=#F 1j1F ِ1x/{l#l߈FF C6d ^7bl#;٘iwq&Fv qJvafX9gWȎmd'2chmd6 a]m#;lmdWȎm g*5!FX7rm6r ׍nPȁm 27r~#Fl#ِ1FFNtfy9žhN/Sm#'lj9dCu#'96rb9Ɇm6rm6r \s11r)\j\dCk\p Km#l{\j\dCh.h#F.l#7٠ӭrFnFn!codrodrm6r  mVȍm&2EsC6rcdcEu41bXh#Vm#ۈ%27bamĒ Sb:%Vm#ۈ%2 mĪmbydz01ysJ>|F>!c9%Om#l\6#ȯO6d <%?|_m#?lF~h#F~l#?ِ1xmWȏmđ;O01WSۈ6Ȇ)qjqFِ18h#Nm#ۈ#2qFF݆曤ZP(`a.9/P;(`w`..^MRmPo..Yyqt y\ =oia^ANANA/([MڛZE!" b'BlGgj{Ԟ-}w~s?]:*}UaQU*UɁAUXET*1\QڨQp%ߔ* W8WmbdC}+#\6\ W!cpІچ+J6d mmbeoDݨF5jF5!cQ ֍jjհjdCLRMmQlnT6mT6F6:p7QmandC6ܠ 7 7lÍlnᦶm p666羬I/lY9<,c1/XuX ˘eeee2V2kkg[[XZY[,cM,cf斱 Xe,2j9ŝj\[k8Fk;8]]qs'cYw7뮮qƹS1xokƹσl)۽d<&727ŃlLYv@)چA6d >yCm 2<硶mx x@j؆'8&R6ȆmxA^j^؆ِ1/ /lËlo66d&FuoTFuFu!c~:7mT6 ׍nTWۨmT'2աjձd]g31j߭n] F !c}pF lِ1F F !cQڨQ&[~q)`bx}:oO筶mx )pNV6Ɇo8xmxcdCuV6jC'f61j9&Sjm6j ׍nTۨm$2í pkm6j ۨ mTۨm";01j ZjZdC061}fg6jaȆF-X7jm6j )Zjd[e41j5lmQۨM6d ދֆhmFm!cQ֍jdCu6Q[m6C68'2>†᣶m )>pNQ6|Ȇ{Q؋m`>dC<@>j>Fqm޵L:FhFlِ1R)u6`uȆmԁ6m6 )u:ju _TiM _N_ _l×l| )j؆/ِ16%:fb8lD|{d bhmbdC6| _ _l.L {ѺjudC]օ]Uۨm%2uaݨQۨK6d n.QWm.QlL)xĨ'lԃ6m6 ׍znSۨm#2E^F=lِ1zF=z؆8sS6 ?!c3@ ~j~؆ِ1a6 ?!c^S6Ɨ622/lCj؆?ِ1 lßl|Nsچ?O6d 66dn>F}F}!cuJ3dZdC6C6cɆF}F14 \6Phm4 2-16r16` Ȇhh@6d >46m46Kuh(zцmhH6d n!Pm!ѐlhj dCp֍&Pm݆#Fd#Q;u`h.\D̎s<,c--cᖱX+XkXXeeeeeeee,2mbuuZƺ[zXzZzYz[XZY[·iA5ؒg?N- - -5q-7j{׸Td jT-5q-Ƶ5Ƶ_HvVL000l#l| _FF6d (Lm# #2à00l%pl$obThm$2.>lhI6d ^7ZºRm%ђlFKhFKl#lOញ.F8jF8ِ1xu#\m#'2am ¡ppl#ll^#B"*Bm#ۈ 2. FmD`dCsJS"6"!c~#ڈPۈ6ZtbJhmRhm"2E[^F+lِ1 )6ZaȆVF+VFkQ>n&Fk1sJkFk!c[[m6Z psp0?*A Fk!cpj6d#ГWmmm6`mȆL@{m6`mȆm6ڨm6ڐ hmQhmDeETfbD9%)jF$ِ1uۺHHl#l߈FF$I6d ދFBjF[{NbbsJ[8Uhm%27~F[l-ِ1xm6bmɆalup0 Mhm#o5\21 vjvdCwe;vF;!cpvjvdC06 9c8l:녛hO6BUjګm6ړ a^m=ўl|NijdC06;c8ly]'n2F{l٘ϛDFF!cpjdCu6:`Ȇalpp=Zs7Ck݆#wPm]G(ZDGs/Ogyq[tT;hw`.:~Gh:##:yG\:=x3^'Q:I};zЉ{NA'Nt"2Njp=D"d cv6:mt6: ?La{NFgaLꬶL6d n3Ym3љlFghFgl3ِ1x6:cQdl&FطQjQFِ13( -Jm# ۈ"21`mD ׍(X76hA}N9żM6lFmDcdCu#֍hhl#lF4mD ׍hX76.d# }ebtsJ8tQmt!2_t.j].dC޻g]6`]Ȇaldsp+wv16`1dZE51b71l#lnmĐ 1߈Qۈ6bȆalrHo&chm`]FE+;lbtFWotUmt%2]a誶J6d >tsJWFW!c8_g 7cl bhmt6~r&n覶 F6d N7N7nF7!c9Smt6 wpp+WZݰXtsJwFw!cu1ơ׫fOCk;уlM9>>x>C롶A6d o4up8j bhm6z mPm 2E9c|^~p16z`=z=8&'&FOl'ِ1'ٰMm=6zb=Ɇ)=:FOl'ِ1 wg{_m"ק9.`襶 E6d / Rm"27z~F/lِ1^F/^Fos41z^7E{m6z AO*{m6z  mVm&27ܝ1>im!nba}6`}Ȇ)}:Flِ1>F>F!cᰑ-qlO16`}OC7;+放pN髶K6d c#a#žMCk/їl {Ѿj}dC06ܜ16lUm#'<*'F?X7m6 6aȆm6m6 `Omџl.P߈M&Fa?_m?џl|?诶O6d n?_m?џlj6a'|89A,cC,cC-c?ZƆYƆ[FXFZFYF[XZY[~MMMMMMMMͰʹl9&j(q5.ָ8u5.j87ǩk\qqTd ^`S׸8\qqx'w:#^؈66ⱍx!cxmē }xxl#l7QF<1lH79Lhclcِ1x<6`ȆalTvH/ bhm 6 @.kLbn ܧ1H6d > s@@!c9e Sm 6 )2Pmc 1lTXZI& ac1Hmc1l hc lcِ1A A !c9eSm 6 zVŜ2)6cɆm 6m 6  m Vm &2ߧ m p|ngf|[ܹA-s/ӷu?Sm?ᄍxgH8+~Pp=B5izCľx\ݗ1ct0D`Cȁ tE `1x9C6`CFg]bb 6BC6bCɆCcPlc(ِ1PP!cpCjCFXe-61~}ďQmGlG!c>GG##ِ1ŏp&QmGlG!c3Æ bhmm #3 a1Lm Sm #2`1 F6d c=0a0!c0o Sm 'nxk1\m Wm '27~cplc8ِ1xpp!cpájñd#sCw#D1#6F`#ȆpN1A6d ^7F1Bmc1l|bܷ1I6귟}c#a1I6d nc$1Rmc$1lHhcHlc$ِ1H(1bSog~(9Jmc1lQQjQdC6FA6FaȆm6Fm6F)\5-hX7Fm6F a/:Zmc41lhhchlc4ِ1h~##yy1C6d S7>pذ)0Fmc 1lhclc ِ11Fmc 1lϻ=tcE^tXlc,ِ1x XX!cpcjcdCuc,c6bFO51Ɖooǩm6Ƒ b8lX" bhm6Ƒ بafI 8lcِ1x8qx&Exx!c93FzvWpICkc<1l||<31O6d ^7ú1^mc<x9aLqOdqOj?a? )!9/[16~6~"2S~sOj?a? }~R ۘ@6J_)<~1AS&u !c~c7&mL6& ۘmLPۘmL 21ژ1ۘH6;NobL$H6%q`'mL6& )nL$~x)a D!c@'@'mL6& )2Qmc"1l,8Ę$&IjIdCS&)6&aȆ$X7&mL6& ׍InLRۘmL&L2q193@& _LVۘmL&2S&9edlc2ِ1Ydd!cQac},M dlc :K/GSD1S6`SȆmL6mL6 Su)!c1֍)jSdR~#Mbc*ߘ1ۘJ6d nc*1Umc*1l|N 甩jSdCST41fpc7~c4lcِ1i4i4!c1 ֍ijӰidC6A6aDWfbL6C6cɆ{1ۘN6d oLtt!cpӡjӱd#ʟZ 51f~c7fm6f 11Cmc1l|Nj3dC oPۘm$Dc1ژ1ۘI6d ^7fº1Smc&1lLhcLlc&ِ1L1Smc݆㘟7Iqq$?Ela.]7I?v)>_{8?o.]7I?{ls_Vܗ夗2r>l\<|B"bR2r J*jZ:zF/M͖-m햱s_fQUM %Yp^b6{YR׳Yx^EL,RWYx^EM=,R׸YM6yu\1[{6{6[mc61l {jdC=l8Vۘm&2yfollc٨tv_q&9js9dCucs6`sȆḿ6m6 ۘmQۘm%] L81Wؘ mUۘm%21ژ1ۘK6d nc.1Wmc.1l\hc\lcX%r>&<<xEݘ||!c!g16cɆṁ6m6 ׍nWۘm, Eҧ^@Su!cwVwVm,6 Xm,PXm, 2߷_m,6_01߻\BB!c䌑s^>zhxeoc7~c>lcِ1}>}>!cp}j}dCuc6aVabw~k~Gf?x*nW؏m'2دO6d nc?_mc?lnuc~l٠_H21}plِ1xq6`Ȇm6m6 8mP8m$ce|abA؋T8m$2/ |Al ِ1AA!cpjCdE깛C!C!!c9Sm6 8mR8m"2q8qlMxo+ٰUmWlW!c$1PUmWlW!cpBmmJ6d Ӌ9c8lL Ưaq$bqXԍðnV8m&27~al0ِ1a/zXm0ql|rSm6 qDG`/zDmql|N9#jG#dCuG6`GȆ=B6lDm6=~qToG6bGɆ産pN9q8J6d n(qTm(ql8 jGcd#֎+Ĝr )6aȆcpN9q 8F6d >s1c1!c9Sm6Džqq!c$c8ٰjDZdCu86cɆ_<__o{@}zwnIzE=xCC2a=xv׃@kӇpmP-!I-}jGdc@O&71#xxD6d ##G#!c6aȆm<6m<6jx,l<6m<6 ?cc!cpjdC}c8+gjϰgdC{^3g3!cgp3lِ16a:pb<u96cɆpNyxN6d ^7ú\m9l|Nyjϱd~R71^8;ٰBml|Nyj/dC6^@/6^`/ȆpNyxI6 L8;㥨/axxI6d n%Rm%lKhKl%ِ1%\þTxm".51^x+W+!cpWjWdCWpJmlnu+l19cb!z?`/dCPlj` ~??xӆ9Oq/O??Ɇ{?a/ƟƟdCsʟpNSmOlO!cQaПjbW'x-װxxM6d ^7^úZm5lnukl5ِ1)6^coK㍰xxC6d o7!c7pl ِ1 o o6`o-~nb6Bo6boɆ~ ~xK6d n-Vm-lnu[l/q`/#?3166R ln_ja ب쌑߶'yZa  Km/l"jdCu6>`Ȇ7>jdC6>@6>` 31> jdC~~Tm|$2aH6d <#|Qm}>u"χIs<[ƒXƾ%%%XRZRYR[XZY[2Xƾee}elbjfnaiem28OTj̬7e?N%rA5NIOu"ۉ\zNָD.)׸D.ϩc%b/ 1l=lm# _o'vAjdC0tASVpJ16cɆ{.7JHL6d n#1Xm#1lH"l$6m$6 Dm# ln$u#Fl# ِ1xoFI6m8>l$}g/"0OB}AѢ .u݁x vO}+bp~[_${y H ~ROAR2O zO AR\%uAoI"zD|H 犤jIddi֍%jb$sddTG9'SHm$#2c qptyي% HF6d ~K2tK2dF2!cg\гdjɰdcBMn$u#Frl#9ِ1xHFrFr!c39Im$6 ׍n$WHm '6cE# , z,F l#ِ1F F !cp)j)dCςSg)6R`.d#MC\01\DpuEmp!2mm`.dC 7\6\ !c놋چ l8P9gb46vwSb6xD+.bTHm$2_kӔj)dCkӔpmRm#%l|mSRm6RA3.9~H%-R}TjTdC~g*TF*!c9%SRm6R ׍TnRHm&;ͬZⴉl$J#5ؖġC.Rm6R ׍԰nVHm&2aHHM6d ^7RúZm#5lulI#7~#Fl# ِ1xHF4F!c~# 7Ҩm6Ґ HmQHm%oiŜ)i6biɆ!I!IHK6d >sJZFZ!cpijitd#\Mt.̱t.̱tj鰍tdCu#6aȆm6ҩm6ґ `Nm#l,x{̣&FzQ7ú^m#=lFzh#Fzl#=ِ1]л6cɆFzX7ҫm6213;lbd62@62`Ȇmd62md62 lqp0owgMCk#l|+ʠl&_^K؋~%%ِ1חpK//ɆaF}g͝ ƗƗdCHMn&Fw= Ϝ ƗFF2C`uMjdCu##62bɆ&d6gTȈmd$27169Ȉmd"t#S29%F&l#ِ1F&Im#lF&h#F&l#ِ1 )62a_[_茶rAO}ِ17_orR lfNqspذ}WWdC딯:+d#˻O112֍jdCFfodVȌmd&2^+_2CZdC]fvA]fVȌmd! jψ+"z,͢B6d ^7Em# lnTwp=q>ߗ bhmd6 ׍,ndQȂmd%SMJ6lY6bYɆ{ѬͪJ6d ^7ºUm#+l|#+ȪF6&F61dsJ6lF6!c$176aȆaꆗ3Æg㝅 bhmd6 ׍lndSȆmd'Y6#S9%Fvl#;ِ1yJvFv!c9%;Smd6 SuJvF1[LbSrm6r ##l؈Pȁm 2poQ&< bhm6r )9Cm#lwMbN 甜j9dCFNoTȉm$27Z8c|( FNl#'ِ1x FNvcro7IAor7+.<ȥ.\<)xs7I`ȥv\<狷s~n%\\{sᄍxOr{K}sz}Wl0r"7+r~n\rݗ1x= Anܸ&2Ճaj=Z*A ܸ&21s3FnlkQfKכ_; Qdvj_c_ ì?16lF}55ِ13366&25F!Ym֚yDy6`yȆy#Fl#ِ1Lȕ Fl#ِ1xy6m8}Y}Ozg8k9#e,eXXAX!XaXXQX1XqX XIX)XiXXYX9ط,c,c[*Z*Y*[ƪXƪZ\-c,cns_R[r{W?NyxRs=zTWm]^uˋk\^q2&7/&75./8W]jJyaߜW]/ٸ5޼L|b|j|dC_>8Sȇm#2^;^;F>l#ِ1xoF6aFMLߜlɯO6d ^7ú_m#?l}}jdCQ~Wȏm|C6{V2Q7uooȆal4up8Y#?LCkl!cp@ߨm|m|C6d ^7uodcҘ*,51 3@ 3@ m6 YY@mQl(jdCu6 `ƩS_lb }6 bɆ/*/*Q(H6d m]Am]AFA!c^ E m6 t%x(7L(D6@uJ!BF!!cwV wV m6 `/ZHmQlE S6 aɆO}E( FaFa!cpjdCu06 cɆϕ* ϕ*Q(B6~8hעy&FgaEȆ@"jE"dC~g?E6`EȆ{"-Q(B6d ދh"FQ;kEs`QFQ!cpEjEdCsJQ8U(m%2Q(Q(F6>z};lQLRRLmQl-{bjŰbdCu6aȆ{b-Q (N6*;g(7m6 ׍nW(m'2Q(Q(N6d n8Q\m8QltK2%L8 :F lِ1x(F F !cp%j%dCsJ 8P(m$O>()FIX7Jm6J ׍nT(m$2* Jm6J }{_%6JbcVSMRF)hF)lِ1x(F)RF)!cpRjRdC6JA6JaFibb6JC6JcɆFiX7Jm6J ( mV(m&27J~Fil وro$ Fl ِ1x(F2F!c~ 7ʨm6ʐ ׍2nQ(m%~\uea(Q(K6d FYFYFY!cQ֍jedCehYF9q\|O&F9aQNmQl|N)rj對rdC{_W9rF9!cQ֍rj對oF68[<[<[ooɆ~ƷƷdC66Ulߪm|m'qQ^ԍnW(m'2a(Q(O6d oFyFy!cpFy G^ߙo>wPwjE'|Ao뾃 wv)w;7Oq;\*=?_Fz3 ZݯA2`=vP׃ @=fcVPA!c+*mT6')B'fab|/adC^m{l{!c{X-Wl|֍66* mF31*>"5*mT6* ׍nTTۨmT$2g"|gFEl"ِ1FEF%џ71*Q ֍JjJdC6*A6*aȆF%X7*mT6* )RImQllq)8׶ :׶Fel2ِ1~geYYm2QlnTuFel2ِ1xݨ FeF+ 619 SmT6 ׍*nTQۨmT!2U`ݨQۨB6d ~>ex>e*FUQUEݨ FUFU!cpUjUdC딪pRUm*QlnTuFUlÕlt*}*ְp 몶m p6\6\ W!c9)j؆+ِ1x W WlX2~q&F5ыVh5jF5!cjp/F5lِ1R )6aȆF5X7mT6Ɲ/gb놛چF6d ދ^Mm p#2mmandC347 7 000oǙs<<,c1/XuX ˘eeee2V2kkg[[XZY[,cM,cf斱 Xe,2j9Ɲj\>:Sqr;58wq2qƹk;qTd ]]qs'cF?q߇5M 1yCm 2mxmx`dC<6< !cpІچI6l8&}/S=zSm$2_Sy5چ'I6d nT6<Ɇ{#Oymxb^dLz^b ymxa^dC6 / /lËl|/ xmxa^dCt^pKm ۨN6bMFuhFul:ِ1FuFu!cwϪwϪmT6 ZZ]m:Ql.H]QًC{jSkm6j ۨmPۨm 2Sj9F lِ1Ng %Z+A ؆7ҹ[S:[m&2 mxmxcdC6 o olÛlچ7Qlt`bgtAgTۨm$2_Ԅ딚j5dC6jB56jb5Ɇ)5:FMlH4߻Q&F-װ6jaȆF-X7jm6j ۨmRۨm"2`ݨQ ۨM6+N&FmgɆi勃6jcɆϕ ϕQۨM6d c3FW16jcɆԆ~jm6|FM8Go  lÇl|om`>dCu  lÇl|NsچQlb{8 :Flِ1xݨF:F!c:pFlِ1:F:؆/xzh?+7|چ/K6d ^7|aU6|Ɇ/j؆/ِ1x _ _l.(m锑&F]ыօh]F]!cm6 ?k Uۨm%2 mԵp|U|[w'"E'|q`uA]}'/ZS*o_O}ᄍxۺzǬp={>govGz~bOi~te o-p=#2+\1S6$) 71E+چ?O6d G8c8l؎W6Ɇ$j؆?ِ1x l>Qb>a&F}a>Q_m>Ql|O>ӪQۨO6d 6cɆmԇ6m6.?jb4sJ84Phm4 2Y~ᰱcG'h@6d >4sJF!ci6mhH6>]Pԍn4Thm4$27~FCl!ِ1~gCPm!ѐl𽌆j Fdhz 21i#6mhD6d >4sJ#FF#!c9Sm46 `/Hmјl8'L . jdC6C6cɆ-ÕkcFc!c֍jQW>MMo~#@m# 2Sm P6ȆFjF_h M3&Z&F!c֍&jM&dCu M6`MȆ{&m$[ϖ4h E6@!cFF H6d n#T6ɆF jFSfwĒLm {ѦjMdC/hSFS!cpMjMdCu)M6bF/+Th&F3X7m46 ׍fn4Shm4#27~F3lِ1xhF3fFsX&FsQ7ú\m9ќlhjͱdCu96cɆ):Fsl#l,[~>4 N R6ȆmAAjAFِ1 h#Hm#"2mmad;,`8mcdCsJ0S6`!cpFF0L6d >9%Xm#!!bN sJFB6d n#Q6BȆEChFB6d ދ^4Dm#%tҪ*P8mbdCsB6BP!c^4jF(ِ1sP6Tm#n;v"χia9#22nEZZY[:X:Z:Y:[Ƣ,cі.XWX7Xeeeeeeeee|TͽZS { { ukk\ q2[Ƶ58-B]Zׂj{7jq-F6ΕZFM#LaoS6Ȇ{0maadC_6°0!cpaFFђld5Lξ|ےlzz|qFKl%ِ1xh FKFK!c֍j-dC6ZB-6ZbdR/#\oW6ɆF8jF8ِ1xu#\m#'2amD zĈpGcor#6"!cFFA6d n#ڈPۈ6"ȆFjF+`7Z~F+lِ1uu6ZaȆm6Zm6Z ׍VnRhm&I&Y7̷FL<1Zm6Z ׍ְnVhm&27Z~Fkl5ِ1xh Fkvژomk6jm"œݺ6vU6v)>_߭k+Coc>_o{F}zIgV1"E ~GzIw_=f$1#"q=$2+"HH\"IA$m%F;lِ1x6aɆ7LnuF{l=ِ1̜쌑tsJ'NF'!cpNjd#Wr˘S]S6:cɆ/ /ꬶL6d ^7:úYm3љl {j(kKQFmD S:%Jm# ۈ"2?& mD ۈ66h+]I#Z؈66h!cpFF4M6d ދF^4Zm#ۈ&2Smt![׮E]`/Em хl.j].dC6@]6`]Ȇggۈ!iĈh Ec6b!cp1FF C6d o~#Fm#ۈ!2Sbmt%5葺@]a誶J6d ދvhWFW!cp]j]dCsJW8tUmt#[&F7X7mt6  Mmэl|NnjݰndCu6adc9J_)`b FF,K6d ދ^4Vm#ۈ%2nĪmbdCu#֍XXl;Ý11 ݡjݱdCFwotWmt'2mt6 ׍ntWm &31z~7zm6z ׍nPm 2=`衶A6d S7j;c8lQ2'I6 uE.w{m6z  mTm$27z~FOl'ِ1)=6zb lj_Y\Y6zaȆm6zm6z mRm"2Sz9F/l7ٸ_˲\&Fog0/\&zm6z  mVm&27z~Fol7ِ1x FoFQ[.9M>{>j}>dCH&bo m6 }`GmчlnuFl/sx&F_;}]Um%2_딾j}dCffUm%2}a諶G6f|9ۮ&F?h?h?~F?!cm6 ׍~nSm#2觶O6.8,&Fװ6cɆal4spذ=O6d ?|F_m?џldaxq1gZ60a{>Lx@ `!-c,c-c#,c#-c,c-cc,cc-c,c-c?Y&X&Z&Y&[ƦXƦZƦYƦ[fXfZ~N0+|[NySP̷uq 8ueW6s/(m]3SH&뙹x vO[WMq*gb8utwGNpqmZ''J )T:n,cSųgSgS6bSɆmL6mL6 )S2Umc*1ldm;W #OZSidv;c`ݘ1 ۘF6d nc1Mmc1lnLuc4lcِ1lăgCkc1laռnQthctlc:ِ1tt!c1֍jӱdCp|:ٰu6cd]|11<Ž6OxSm$2 mxmxbdC6< O OlÓlq6PT6fxĘ! X7fm6f ۘmPۘm 2Qic36f`3Ȇg٘1ۘI6kMn̄ucLlc&ِ1L1Smc&1ln̄ucLlc&ِ1L,oebuc6faȆm̂6fm6f ۘmRۘm"21 ژ1 ۘM6[caݘ1ۘM6d >̆sll!culN1ۘM6d ދΆl1~ɭޘsDݘ9!cps9js9dCucs6`sȆḿ6m6撍*xebu0%K6l%1ۘK6d nc.1Wmc.1l\hc\lc.ِ1\띤Esa?~kWꛃyb/y6z^xzॾ^x՗13;^//\ȁ1\ / /lc1pxi&bG,ablc1ِ1,۳Xmc1lbhcblc1ِ1x֍j od^M o 7ٰLꭶmx ްV6Ɇ-xmxcdCu o olc ٸ2KwwM%n,uclc ِ1̜K6`KȆX7m,6 Xm,QXmkpq=?n.وm`>dCu  lÇln᣶m !S|6|d>=&R߹w.UXm,%2Tmc)ln,ucRlc)ِ1Rvw__z߆q~}e喱UՖ51?Z:zF&f˘e,222222hie [XB,cQƜNT<MsO|58_q2w髮qR17|7|58_q2>R>k/ozX&l,6m,6 F`oLmcl|[ej˰edC}27/SXm,'$+s𪉱\Xm,WXm,'2ߧ[閫m,6 a߼\mc9lrhcrlc(ɌWLo^j+dCuc+6V`+Ȇ X7Vm6V !Wm6V7h?򒉱RԍnTXm$2XXI6d nc%Rmc%lX j+Udc牯\01V}Upn*lcِ1̫̫6VaȆ{U] XE6d +ȆRXm&o7P켉Z)ᜲZmc5lnucjlc5ِ1xX jj!c8@sjQ`QΔΚk55!c֍5jk5dC؋QXm!2X#=|bb~~j~؆ِ1S6Ȇ~j~؆ِ1:S6dïOkEk6bkɆ电pNYXK6d ]k6bkɆgՍjkudXcN넍u:u:!c9eS֩m6֑ XmSXm#2C T7֩m6֓ί[71 롍j뱍dC6C6cɆpNYXO6d S7b8mLQbhm66ᨉA`Amclhclcِ1  !c9eS6ml66 ;lbl66B66bɆ7=jdC딍pQmc#lf龎+B%Flc8|'YHc ؤ D6d ދn&M&!cwd6wd6ml66 n66aFBC#Lbc3جL6d nc3Ymc3l|N jdCpj Qùw?E6 !c~j؆?ِ1 h_m'23{jF٘M dÜ i#@m# 2 {_jFِ1xl#l| װjvΗwjwjE-b]9x,vwE`݁9xvmao_}s:8[| [?aVnVwnVߊV2+B[zl`ZV\!Umc+l}ddPcXlmj۰mdC0sEKW E4X=J m6!c6ئ F6d cn=6mv1wU{Lgj۱dCp]mc;l|/|; ߮N6d 6צ6c;Ɩ;wvP؁m 2؁m 2;`ءA6d  ;6v`dpKnºm ׍@X76@!ci @6@!c8@sJF l8("hSi{Z;6vb;Ɇm6vm6v  mT؉m$2Ew^tNlcAc`إ E6d ncKmcl.hc.lcِ1lKmcD6uv#H66 !c{hAZFD6d n#R6ȆFAjAnqm'v7\V؍m&2aحM6d nc7[mc7lq6Pح&b5Ng,lCjF0ِ1^x0 V6ɆmCjF0ِ1`h#Xm#C6o P=bN=j{=dCyGmclhclcِ1){6`!dc7!Fm )!pN Q6BȆ7BFFB6d n#Q6Bgo41BŜ PPl#lF(m ׍PX7B6BP!cpFF݆00/8fGeleleleee,2v2i;l;b;j;f;n;a;i;e;m;c;k;g;o`hdlbjfna>L8R-]o0u 5.jk\qak\8 S׸0\¨q6Pqax '_86±p!cpFF8N6d (\m#'2m%#/+ m6  mU؋m%2d/|d^lc/ِ1s{s{6bl·gM}nuc>lcِ1>Omclo}j}dCuc6aƻLjdCuc?6cɆm6m6 !7m68 l6m6 ׍nP8m 2q8q8@6d 89jd-e&AoAA!cq֍jdCAoT8m$2C T7m6"ƺd#B>mD ߈Tۈ6"ɆmDBjaѺơ8]s݈dc){w#m6 a/zXm0qlnual0ِ1sχsχ6m8_:bޭE/yn8Q8ba~nr`xD݁9xVnyD}د9xܟ(]sz;*~;ۣ׃te G}Q%2 ? EU8Q!c8@QlH\Mcb6aFqlkbw?L8N6^ru+yQm6 {{\m8qlqxql8ِ1q 19& 8'6N`'ȆK<KqNmqlzڜ&yq<?q8O6d Niayy!c9qCmql h lِ1xq76nm_߇_anZq2v2v2v2v2v22222eeeeee_K+k[;{G'gW7anRs>P`s)z7q7qI5Np1лu75&q7śśw׸Td ݄Mu[djhbrF[dy:[jCk[pMuKmql|Mu nm6n  R۸m&| 61nq֍jdC0[b8m uVQbhm6n ۸ mV۸m&2aݸq۸C6 ?/VJ?x;zlِ1xݸ;!cpw;jw;dCplQ۸c|yݺZUkaObn]vqؿw«W}گ9x\on]oW}zpWDm{,=տ=2`=vp׃{@{p}O-HgՃ{jd [41}jdC0o\16by1v(16cɆm܇6m6 ۸mW۸m< gwu715m<6 ##@mlw߭{x@6d n@mlT_ExCC!c9!Sm<6 xmkӇjGd{=.xf;zf#lِ16aȆ`Hml|ܷxL6.$yYğ&ca1Xm1l~cxcl1ِ1x6cɆpNyl$mLN&?mmC6d >66!2??dCuX7QxB6liR㉰xxB6d ^7Dm l''jO'dC%>O6`O/mgb<6BO6bOɆSX7m<6 OaTm)lnWxm<'2axxA6Jµa6$_ ۆ  !c֍j/dC ؋Pxm 2_j/_E֗nW} UlmmK6d n_h_ɆgWm_l%f&K/Fw^dxxI6d n%Rm%lKhKl%ِ1x/6^b}W>+W+!c9S^m6^ `Jml| a_m6^<ҽx-װxxM6d ^7^úZm5lnukl5ِ1l9kl p~P FSu7!co}7jo7dCk7p Fm l|Sިm6ޒU{Sdm`buGUxm%2S9[l-ِ1[[!c8@6ުm6ޑ[/ 31މ~7ީm6ޑ M@OSxm#27~;lِ1w;w{y7w߻fWxm'2axxO6d o{{!c8@6ޫm6>~mb|!cw>w>m|6> m|Pm| 2_|jdcm41>zQNH6 +_H6d ^7>ºQm#ljdCpG'qij==6>aȆZO}OjOdCu6>aȆm|6>m|6>xήYa?5gg!c^3E?m|6> ?>Ym3lghg 1_;I1]$}/j_"cW|sW|%2_j_od#:W417 F6d 7#6 F6d >W|s7o7!c{h\16l_nݗ/o8naiesŶű[<,cq-cX1`?1K4dh˙хFtFt!c-]16l_ۈN6d n#:]m#:l^ptt/8Ftl#eeLN jۈA6d ^7bCm#l7zj1dCpj1d!KLFLh#FLl#&ِ1K W #16bb1ɆFLX7bm6b ׍nTۈm"cJ\˃cyv,XF,!c ֍XjXdC6bA6baȆmĂ6bm6Fn+f71<ެڛuSp6Ȇ/r@mandC6ܠ 7 7lÍluچl_vb&Fl1ĆsJlFl!c֍jdC6bC6bcɆFlX7bm6 H31uJNۈC6d Qۈm!2ڈۈC6d ދƁh8؆;ٸTjhS&S⮶m p66ܱ w!cu;\mcdC6ܡ w wlÃl$V{cbx9)j؆ِ1 hCm 2 P6<Ȇg)jF\QvMbN 甸jqdC6Bq6bqɆF\X7m6 ??Wm#. ӳ?phá6dCཨ  26jlA6d 8hNqm8xd#rPLxFćsJ|F|!c~#>7m6 ۈmWۈm$ eV&FQ7@m#l <7@m$6 ׍n$PHm$ 2HHH6<41  j dCFBo$THm$$27~#FBl#!ِ1:%!\$THm$";7|0-H)Hm#lF"h#F"l#ِ16E;YpXxܢHm$"2HHL6^9;QV#k<8l**FbFb!cpjdCsJb8$VHm$&2ii?Hm$!Of11֍$jI$dCh؋&QHm$!2HHB6d o$F$FRkL&FR{I=]&UHm$%2އMHJ6d NI )I6bIɆm$6m$65H&F2X7m$6 )Lm#lM{djɰddCpl$SHm$'w8M41h^Sl<jɱdCsJr8$WHm$'2S9%Frl#9ِ1l^4Fr K^aujZ/v~$41҉~#7ҩm6ґ ?>Nm#lM{tj鰍tdCtpNm#݆0a#fGzw<2X2Z2Y2[ƲXƲZƲYƲ[rXrZrYr[XZY[ X Z~a+n+a+i+e+m+c>Lzq礌8sJ/ޟJߟJqqKO5N}sz7W׸ƥ'cָ׸Td OӥW׸x@6n=%Aet62`Ȇ oΠ@6d eQ F!cvΠH6۝-(FFX72md62 mdTȈmd$2_ogjdCpzjLd#i{7@2odRȄmd"2$|$F&l#ِ1xF&LF&!c*f@Ṳ L6:mUP#XogjdCu#362cɆFfX72md62 aYm#3lw-sl#g3΢B6d \b\b,F!cpY,jY,dCsJ8dQȂmd%WD=:U)YᜒUm#+lndu#FVl#+ِ1FVFV!c}p.FVl#Hx*&F61dsJ6lF6!c~#7md6 ?k >kMm#l|Nljٰdn.):%Fvl#;ِ1xFvFv!c֍jٱdCpjٱdcF|I1r֍j9dCu#96r`9Ȇm6rm6r mPȁm$GUꋉSԍnTȉm$2ȩI6d װ96rb9Ɇ甜pNɩE6j&F.Q7rKm#lF.h#F.l#ِ1xF.\F.!c8@h.\FnQK>FnFn!c~#77rm6r  mVȍm&2ȭC6hGoy6`yȆ''ȣC6d n#Gm#lFh#Fl#/5χA~ɐ_?G~ϏA~213A~\jq=O"d ~=?_m#?QllbpR_m>QlF}hF}l>ِ1xQ6cɆýjdM#"L.f؀l~Flِ1FF!c֍j dCpFFC5{y]&FCQ7ºPm!ѐlFChFCl!ِ1x/ 6b ɆghhD6YhTȵ/jȆNjm46 `/Hmшl|NiFjFdCsJ#84Rhm4& MƢm {jdCkp Xm1јln4uFcl1ِ1pڰ=Xm1фlnL&d#Ze1=1:dhhB6d ^7Dm фlh&jM&dC{My&FS1;&FSo4FSFS!c֍jMdCu)M6bMɆ½jMfdob46A6aȆm46m46 ԍN|~jz,AZͰfdCF3o4Shm47sf7~FslyKp\m9<%b^9Em46D >4sJsF Qjq7-F F !c֍j-dCsJ 8Phm 2_ökj-dc裬7-Ŝ)-6Zb-Ɇm6Zm6Z h mThm$2hhE6}: h hE6d W+W+VF+!cpVjVdCsJ+8Rhm&t7h-}oFkl5ِ1xh FkFk!cpjdCplVhm![&FQ7Fm цlnuFl ِ1x/m6`mȆ6pNin"vN?-c-c],c]-c,c-c=,c=-c,c-c},c}-c,c-c,c-c,c-cC,cC-cYƆYƆ[|-ո.{ ksj+TmᚪƵ5-8mV]זj翶pkqmqkK5Np濶^/y3{1uvj"c\렝݁9xvֵ3\;ogqֵZ;5o{to$}^ԃW_/czփjq=hOd "zОDq6P=h@6ĿgAmtPmt 2ivFlِ1~_F!c8@;mt6: 烳O|LFGhFGl#ِ1^pGFG!cRG8tTmt$2a訶D6Sx|ﲓF'lِ1Ni({ZNdCsJ'8tRmt"2 褶 lx|S XTl~ߟ~ߟjb O ?66$2C ԋ'љl8*g,pN鬶L6d S7Zb8m8VrDL6d 6 צ6:cɆFgX7:mt6sn"lt6mt6 SuJ.F!cp].j].dCu ]6`]Ƙ w71 ]j]dCvvUmt%2E^FWl+ِ1x FWF7QΔLn{njݰndCF7otSmt#2_vknjݰndC6A6a݂11^;Emt6 ka{Fwl;ِ1x/6cɆpN鮶A6+Q,Sz9Flِ1x=6z`=Ȇ衶A6d nCmѓl=8=a詶I6d 7}FOl'ِ1x=6zb=Ɇm6zm6z]ibF/oRm"2`襶 E6d ^7zKmыlF/hF/l7٠_fbsJo8Vm&27|Fol7ِ1FoFo!c^7E{m6,Gϫ0#KK죶C6d ^7Gmчl|Sm6 ׍>nQm%;+F_X7m6  mUm%2}a諶K6d n/Wm/яl8?(yՋ\Fn߾sɛ\6aȆ~pN駶G6d ދh?~F?!cp~jd՛M01^?Em6 ߣWm'2诶O6d n?_m?1lƙk@=@mc1l|_t1@6d > s!c8@6m 6J2(7jdCuc 6bɆm 6m 6 ==Pmc 1lL%Z& ڃ\mc81l|Ok81N6d c+FH%plo[/o CmmM6d G 珿66&2údC0돺N'r9PCkolcVg&\dvQFm6F M@6Fm6F mPm 2/ʘN^-#chm6FՋgbuc$#6Fb#Ɇ1I6d >sHH!c8m811j#6}w}Em8FY12626262626262626262626262iaiemckgo[`[h[d-y[ƖX|,cK-}E5y[5N(7;J]F7jk(XFk(\FQ1xk(uk(q2L TFk(<&iuص1Z Vm&2_SkjdChVm&2-@6Fm6Ɛf?#z171C6d 1!cpc1jc1dC6@c6`cƼ]201 cjcdCkpM5Vmc,1l|~,ܹ1K6d >6ƪm6ƑSfbs88Sm#2#ӆqj㰍qdCuc6aȆ8hc8lc<وw+]Lnucxlc<ِ1xxx!c^tp[1xZ&|ac>1_mc>1l|hc|lc>ِ1t>\Wۘm'2O2ژ1X@6h&X;j dCs8,PXm, 2XX@6d Xm,PXm,$):Pԍn,TXm,$2d!|dBlc!ِ1c!\,TXm,$2XXD6vMw=&"N"N"E"!c֍EjEdC"؋.RXm,"2Ej /ʅ+^nx᥶mx 66 /!c^ ^j^؆ِ1 /hKm XL6\dEcaXXL6d s+ӆWw^YXm,&2S9eblc1ِ1b؆71U+ޢnxú᭶mx  oX76 o!c 놷چ7M6d nV6 5N.gb,6@K6`KȆ/{K6`KȆX7m,6 Xm,QXmF+cb5\m`>dC>pGm!2mm`>dC>Іچly&Ro,RR!c9e)Sm,6 X m,UXm,%2KjK6߇>0?ovZ2222222g[k[g[o`hdlXƶXƶZƶYƶ[vX-c;-c,cAݖ`Xe,}_q-B4N"_|K5N/|58_q2f>ꫮqR1uk/fTX&eo^ XF6d .SXm,#2bF XF6d -6m,63'jgV:t:/WXm,'2hrlc9ِ1#KZ˱dC-6m,6V޿/VX! X7Vm6V ?{>{BmclFW zrs(16V`+Ȇ JQqB+FhJ'S+6Vb+ɆbV½j+dCOOTXm$2XXE6VLUb/f܋Y XE6d 3tpx SxoXm"2`X XE6d >6Vm6V49\X-~nݺjdCpZmc5lnTvp8sO(16VcɆjhcjlc zvȣL5nuclc ِ1̜i5!cQiü,J 5!cuhclÏlT}|&nbG6`|'Om#2_uچG6d c+F9ꉓFm  ?hOmXK6MfcX딵jkdC0]16R=WeeʜQbhm6֒ )kᜲVmc-lX mUXm#X'l6֩m6֑ Su:u:!c5\1}>!cym6 {16aȆal$ 31}jdc@^+E6cɆ9~sl~lc?ِ1x~~!c~c?_mc݆%d#Zݺp&9q.<σGnX#;0#]GW_}sǻu5?p=8H|L> zA7{P}zp{̃DBja8A-Kaa!c90Sm6 ?_t>_tXm0qln6m6Nk8"#!cpG#jG#dCw|g?p"K"{+jګ,j+GQ6=kQ[HbFbGBD>8{}{|O<~9s9!cp砍sj簍d=21΋q֍j籍dC6C6cɆyX7Ϋm6Γ )硍j籍@qlL@a#T6Ɇ;^FF H6d n#T6ɆF m\ %G2qA)rAmqlhlِ1<ŧv.m\6. ׍  E1soųgg6.bɆ甋pNq۸H6d ^7.ºqQm"ql޴?$l\T۸m\{OzfbFFD6d n#R6Ȇ7FFD6d >AAjAF0XtMM`a#V6Ɇ`8mcdCS6`!cރ``l#l~Yb+&Fj !<=Dm#!2!nm`!dCsJSB6B!cp!FFql86ಆDݸ%K%!cq ֍KjKdC6.A6.aȆ{K%KeRpR &eg0\&6.cɆm\6.m\6. }]{_6.cɆe1Tr31q֍+jW+dCguW6`WȆm\6m\6 )W+jWdEm61:m0 ۃW6bWɆ q۸J6d >\sUU!c9*qUm*qlHw Em\6 M@ѿq ۸F6d ^7qMmql|Nm\S۸m\'w_}q]-\W۸m\'27~ul:ِ1xݸuu!cpסjױPѢӃ^ܔPa{p"Tm#%2a{F(J6d  B6BP!cpFF(ql]i~sN1xlL?76n`7Ȇ7nj7dCs 8P۸m 27n@76n`ad mbgajaFِ1F6lS[FF6d ^7`S6ȆmAajaF88}d#iԍp=|S)jF8ِ1xu#\m#'2mmcdCsJ8m$7Tj6xM^j7dCpc[p7Ɇm Ml&ِ1x/z76nb7Ɇ mT۸i8sבG:$"BgȺAފ[j"]?_ʧ3I`vp\ŏ|:t V[~Ž ZF"H6d o$Bjjej:\|Pm| 2@6d >|s!c9Amldp-˪&G1|sGG!c^#E?m|6> m|Tm|$2j6#o;;x=I-c.d1W˘e2a%yYƼ-c),c>1_˘e,e222`KcKkKgKo`hdlb2qK2ox ̟S/JTs?'I\I?k\/$^h?k?M$^ϩc/)4F1z/m$6 ITm#)lFRh#FRl#)ِ1FR؆ ],eL Q7\`pQp6\Ȇm@.j.؆ ِ1 \6\ !cp.Іچ lOob$d^hLm#l|NIdjɰddCLm#l0ɠdjɰ WQߊ^|ۮj؆+ِ1xpuUmp%2wzwچ+J6d npUp6FT5k11DpuMm p#2^ }/覶m y=\7 7lÍl|Nq66ܰ wv_.M wQ7apWp6ɆmCj؆;ِ1 wh]mp'2ߧs66ܱ qyM N lÃl:?塶mx 6<6< !cpІچI6L ObVmdچ'I6d ox~Sm$2B{j؆'ِ1 OhSmHN6ynb$sJr8$WHm$'2?# IHN6d NI)6cɆm$6m$6FBFf11]zy߻R6Ȇ5BϚxmxa^dCu / /lËl܆᥶mx -hbx/o孶mx ԍ/V6ɆmxCj؆7ِ1Іچ7lrj>؆ِ1xuGm!2mm`>dCs᣶mLK?/E}6| _!cu/\mbdCp_Wm%26|6| ?1[Oo ? ?lÏln| [S6Ȇ)buچG6d nSpJI6V1>K ETHia.ݺ{j)=>_gRn3}sq/:[{cԜn>?}zOd ""q='21  l#pd&F*a#Jm#l|"ܷH HE6d T^ 6RaȆ{TF*TFj԰IL^R{߂KHM6d ^7RúZm#5l@u#Fjl#5ِ1FjFxT쉷(F1`Gm ?#@m# 21`m 664daL4Fh#Fl# ِ14F4F!c@@Өm6Ґ ?@i6`i1H+l6Ҫm6Ғ iaVm#-lnu#FZl#-ِ1xH mUHm# H۳ANHmSHm#2HHG6d ^7Nm#lF:h#F:l#=8oϯ1&Fza#=^m#=lM{j鱍dC{^xzFz!c9%=^m#=lTnOL b a3md62 ~Am#l| a3md62 ?#ȠH6v&^(ld62md62 ׍ndTȈmd$2S29%FFl##ِ1ȨD6XxI)Im#lE3yͤ D6d n#Im#l|_4Im#l.FfFf!c֍jdCpYm#3lFfh#Ffl# rAUM,N/% ٰdQȂmd!27md6 fY6`YȆ,F,dcNɝڄ_~ o|ِ1x֍/66 2_|)_m|m|A6d c#l|lp)8)mY7{=G yVFV!cpYjYdCFVodUȊmd%2_f6mdoaY222222222V2V2V2V2V2V2V2V2V2eeee+XXYX9XyXXEX%XeaQ$p+)YwS\QmdS׸le'c32l ׸lTd >e_6uˆk\6q2q`˦ql$war9O#;٘?DS6cɆpˮN6d 7g}svFv!c9;]m#;l[.9z;\oPȁm 2f5|f5Fl#ِ1FF!cvh#Fl#'x<`gs&FNq&7'6rm6rb6rC6rcɆFnX7rm6r l,ᰑpW Fn!cpjh#F>l#ِ1|F>|vC^ٺ$xۧuaȯ.\ܕ]ٺA~v/uϯw\Yz;/y~=ϏAisEx ~\ ݗ1x=(P;(Ar ci6-Q׃$B(mP(m$k-6* m6 aYPm QlFAhFAl ِ1VAhFAlwMBnuF!lِ16 aȆ)> |Q!BF!!c=BF!BFa1o}&FaQ7 úQXm0Ql|ߢ0ܷ(Q(L6d c]FaFa!c0QXm0QlvHQDԍ"nQ(m!2Q(Q(B6d {{"F!c~QDmQlL<ѵLnuFQl(ِ1R)E6bEɆ{/ {/Q(J6d o6m6]/7190)Fǵ3(Rm6 SuJ1bF1!c9Sm6 ׍bF1bFq1eg%&Fq1sJqFq!cpšjűdC6C6cɆFqF tIB%1uXglnP(m 27J~F lِ1F F !c9QBm%\v__~Ko|%%ِ1x֍/66$27Ɨj_b_ a6T(I6¯9)`b. ߇]Rm$QlnuFIl$ِ1FIFI!cQ(Q(E6k&F)Q7JQJmQl|_-Q (E6d nQJmQl(mR(m&R:^*`bv d@]U((>jdCkp [Zm4Ql( jdCFiWdڦO11딯:+Ȇ`"?د66"2WWdCWWj_ae$2^7ʨm6ʐ ׍2nQ(m!2Q(Q(C6d ~ QFm Qlܜ;bQVDz,|eYFY!c,ٰe6beɆk+ k+Q(K6d ~FYF9~l:G6M)G6-`׆rj對rdCh9؋S(m#2F9lِ1rF9rFy61ʋX(~cFyl<ِ1x(FyFy!cuJyN)Q(O6d -mW(mT  ϝ7Ĩ lT6*mT6* }U{_6*`ȆFX7*mT6* a+@6*`~lbTFEFE!c tEFE!cQ֍jdC딊FEF%1Uص1LJF%hF%lِ1h%/ZImQlF%hF%lِ1JF%JFed FeQYm2Ql|N jdCkp [Ym2Ql| [ڨQn~a~*xT}mfnaiemckgok`2222ee;XSX3XsX XKX+֖6vT77NU>]OWE]Wj*pqUpB5Nk\\P1~X㪨k\Q_m>QlF}hF}l>ِ1xQڨQh@6d&F;2 4Phm4 2E^Flِ1FF!cgV@ 6`ߐ n*߈98| ِ1oo66!24P77dCuhodcX˛ ٺl]CFC!cp j dC6B 6b Ɇm46m46궜Xh$F#X7m46 ~HmшlR{m46 hm4Rhm4&g>Q}FWMLcFc!c֍jdC{_WcFc!cuJchFcl[qzMoE֍o66%2?-<ƷƷdC{_½o66%2Bߪm|m4!-oZ-bb4u M6`MȆFX7m46 hm4Qhm4!2hl\z%gA;Q7u;ﰍȆakrpذ}wwdCk;ﰍȆm|m|єlJ6;W>sb75ҵ(<6Uhm4%2j m46 ׍n4Uhm4%2h m4Uhm4#f,z3L66aȆnJ3a)6aȆF3X7m46 ͠fjͰde&Fs=6cɆFsl9ِ176Whm4'2?[hhA66; h!F X7Zm6Z )m16܏=bhm6Z ׍nPhm 27Z@-6Z`-FnzתR/Rm%ђl|SZm6Z -aRm%ђlFKhFKlXt&F+Ni)6ZaȆalup:kD Ckъld#[{g yCkъlhmRhe894t&{8|]Y9/z;0|*g߫o.>O=߫{>nkIC+Zù5}5|'Pkָ&2 o [E51\j6d5jZ>&FcFl ِ1EoFm цllk ٰmQhm!2#@m6`mɆ?Lh jmdC0}Dg ۣCm6bmɆmF[l-ِ1xh mUhm#YC019ҎlؾnhG6d Shm#2hhG6d ohnޗ{M/0wqeeeeeeeeeeeeeX_X?X؏A!aᖱ,c#,c#-c?[FYҞj\O:eڋs׸Td SZ;c8jlګk\{\S1x5=q|ָƽv'11:;mt6: `Amсl|jdC_hFl#hz)7)FG7w}sGFG!cpjdC{lGFG!c5UGhFGlCx`褶 D6d nImщlntuF'lِ1Imљl)1{bY mtVmt&2Ym3љlYYjdC6:C6:c]ѳk51].j].dCu ]6`]Ȇmt6mt6 )].j]dL=Ƙ]E]6b]Ɇmt6mt6 )]Um+ѕlٳFWF75c/&F7X7mt6 mtSmt#2E^F7lِ1nF7nFww/[>21 ݡjݱdCϐtϐtWmt'2a讶N6d 讶A6:~7!l6zm6z mPm 2zm6z =j=d#]7M===6zb=Ɇm6zm6z )=Sm'ѓln6zm6zgcbu6zaȆ^襶 E6d nKmыlF/hF/l7pOPd۹N1U7ٰ=[m7ћlnuFol7ِ1FoFo!c5lohFolyWQ&Fװ}6`}ȆFX7m6 mQm!2}>j}k?8d j?`? >dC:Ȇװ?@?mm%}bbu/}6b}Ɇ甾pN髶K6d Oi}Ѿj}dCu/Wm/яlD[Os|X?~F?!cp~j~dCu6aȆ~F?~F:[ΛEFF!c~?7m6 mWm'2jƥ11~grgrTl?mmH6d #QmGlG!c#ƏQ011֍jdC==Pm 211@6d ^7@6m8y 4gȳu@v~k - ;0|#~k \To.?@= ~?7aCo  2#>b \׃A R !cIA6a"?Lz,' '1L6d  k``!cpjdC6C6cCFs)Ocb ucC6`CȆna)C6`CȆ-}!jC!dC=hclc(X;M {̡jCdC돡p1Tmc(1ln ucPlc(ِ1P0o&0ac1Lmc1lL0x&w0lcِ1$`:Lmc1l|1 1 N6/Plb Նj6cɆpX7m 6 m Wm '2ájñȆgEMn01~u'X7~R l,O,Oj?a? w;R lOOj?a#ƨЊZ51F^tEGm6F SFu!cp#j#dCshclc$x3MnucHlc$ِ1H1Rmc$1lHhcHlc$ِ1Hd/o33ِ1{[:c8l8޼_16~6~&246~6~&23(9wĸ%&(ы(Q(!c9eSFm6F mRm"21 1n~{?0wvceleleleleleleleT4د閱,c3,c3-c[fYf[XZY[XZY---f4ոN{T\dFh4Fkh\FS1z{4\oV׸Ѹƍ'c7ָ7׸Td ?ָ7cȆG)cĚj \SQm!2olc ِ1;Fmc 1l|=1K6ie1VԍnUm%2ca1K6d ^7º1Vmc,1ln6ƪm6Ƒٶ}1NmSm#2`1G6d ;Sm#2A6a*tcS9exlc<ِ1^x3^mc<1lnucxlc<ِ1;C6cƎ[Dݘ !cp j dC6&@6&`Ȇhclc"p<&EݘDD!cpjdCϚLϚLTۘmL$21ژ1ۘD6V^.i&$; NRۘmL"27&~c$lcِ1x1 6&aȆ)Ijd#SћǘŜ2)6&cɆdX7&mL6& ۘ mLVۘmL&2j_=a;i< ٰ(/j` ׍_`Eml!c98 ِ1__6~6 9znbLuc S6`SȆX7mL6 16*VpпbhmL6 )S)jSdcߊ11:{QSs'מ1ۘJ6d ^7º1Umc*1l|N 甩jSdCuc*1Umc*1l[xĘ&):e4lcِ116l?m2Mmc1l4hc4lcِ1xݘmLSۘf89[j<[+Eja..lݯFv݁狏tWj^̄sLL!cLhcLlwqWTmob.n;;ِ1sm16;hZc ]mwlw!cpCmm"11fggm6f `1Kmc1l|s1 ۘE6d nc1Kmc1l?"诖&l1̆sll!cm16l[6fcɆlX7fm6f ?5ژ1ۘC6 gw3cs`ݘ1ۘC6d ó9!cps9js9dC{Zs9jsdc411抺1֍jsdCs\\!cu\N1ۘK6d nc.1Wmc.1ldiչ&<ы΃ِ1||!cxO6cɆ7C6c FY6cb,uc 6` Ȇ,g m,6 ׍n,PXm, 2XXH6WMcE^tBlc!ِ1BB!c^t!Em,6 SB 6bF¹ggmb,6A6aȆEpNYXD6d ^7Hmcll"hc"l1̧#*~oِ1??66 24PdC{_@mm,&Ѯ%KW01 jdC6C6cɆpNYXL6d o,6m,6˯|^XE͊~ ٰ藨m,6 K`Dmc lhclc ِ1xXXJ6VLbSm,6 ׍n,UXm,%2Z m,6 X m,UXjy?0}?2{<[VXVZVYV[mmmmmmmmeaiemckgo;`;h;d;ly?2qodѡsZ\SgԖQsc+aXXI6d >sJJ!cp+j+dCsJhcJlc(Imbr *Q̛m +Vm6V V5*U*!c5*Z XE6d ^7VA6Vaƚ|nbuc56VcɆm6Vm6V ﯆6VcɆm6VmpӜ;Rg$3)ѡ T.\ܕ]ٺ?av/^ٺ?{΋{sO?Fe |_2_֨` 91w:k5jkp=XC"d hclc-=TlA&Z羅9ג ۏtUXm%2+¹bZlc-ِ1xk6bkɆ犵Z:1xMub~ܷ_XG6d ^7Nmcl|?֩m6֑ XmSXm'qߥ01;mzaQj뱍dC6C6cɆ{\XO6d >6֫m66Aһ6516ؠ@6d ncAmclhQhY W !cؠH6ݟ(zэݨH6d nc#Qmc#l@sFF!cg7B66bFm016 ֍MjMdC&؋nR؄ml"24:e&lcِ1~&hc&lc3WcE7^tflc3ِ1ff!cpjdCfhcflc hxEmlQ؂ml!2k [Emc lhclc ِ1xآJ6-+61blsV8lU؊ml%2تJ6d olU؊ml%2SBNc ئ F6d koS؆ml#2E^t6lcِ1m6mvƔ.oLvhcvlc;ِ1:e;\lW؎ml'27ml6 ?خlx8?ϵCmclnuclcِ1xmP؁m$,)l6vm6v ;a/Smc'lNhcNlc'ِ1xةE6O3nK`Kmcl]j]dCs.8R؅m"2 إ M6R>ڽ%Y[ mV؍m&2aحM6d װ6vcɆn1y`cS9elcِ13{3{6`{ȆX7m6 {=j{dcv&^]^]^^!cp{j{dC^oU؋m%2^hc^lcB_L}bN}j}dCs>8S؇m#2S9e>lcِ1xاO6rl™~~!c5~ݯO6d nc?_mc?ln6m6o":,jboP8m 2S9lِ1̜ac}GW !c^q@mqlܚ58(AX7m6 8mT8m$2E:c8ld.ZkUq8H6d ދ6m6 Kdbu6aȆm6m6 )rHmql!h! LO's̙ðZV8la.;tsV;8lw`.G>I: W"w{$: a=?ll{_/oz{_Xq2v2v2eeeeeeeee,2v2v2d X.Y.[ƮXƮZƮYƮ[B-c7,capM-m{_Pޣō38QW#x^;BULk#ptD]ώy3툺l2_G5=Qq-U@&QqF(<#sTm(ql|(c9q8J6d 7{U8m%2_+6m6+v|qLԍcnS8m#2q 8q 8F6d ^7qLmql1h1l8Pǝfupܜ_{8̎nW8m'2q8q8N6d ^7úq\m8qlqhqlo3=gϞ77ِ1 GoɆ߰n77ِ13 p+r51Nw:q8A6d rP8m 2'`8q8A6d r8q8I6ibIoT8m$2#zl؈T8m$2; Nm6N SNB'6NbƔwnbrۛSd]M9q 8E6d ^7NqJmql|N9SjSdC6NA6Nal> w:.iiK+bm16l=q8mkE ^7NúqZm4q܊|N9 mV8m!)8#]zl ِ1: \Q8m!2g`8q8C6d n qFm qlL8ѵ&YoYY!cpgjgdC6Bg6bgɆk6Ϊm6Α9z8a911nS8m#29lِ1r)6aȆ9h9l<ٸs/Wyq^mOu{~׃P/6p*A(A(}׃PXBBq=%2EzJ"d >WBj ѳA&MbqVj7dC0ߓtpq۸A6d uVj7dC6n@76n`adޣ9S71„0h#Lm# #21`m i=00l#l66°prb'F8m 66±p!cFF8N6d ~&)W6n/&Ma&qSm&qlIq۸I6d ^7nºqSm&ql|N mT۸m"Rqݻ4n ۧqKmqln܂u-lِ1xݸ-[-!c9qKmql>[Lۢn܆uml6ِ1xݸ mm!cumNq۸M6d ^7nC6nm8s?WCΎ;xܵݳݷEXX"-cQGhcS3sXeee,222g{c{k{g%X[-c,c-C5c׷7Nw3w3w5qw݁558Fw`otG]wjkXk<%wܩqW݅tw6bwɆ}jwdC]8U۸m%2Bw6bF321w݃q۸G6d 7߃}={=!cm6 A6a431>m6 ׍nW۸m'2aݸq۸O6d n>q_m>A6^aJG Fd GmD`dCu#֍l#l#oGmD`dCFm< cndb<u6`Ȇ<6m<6r94\xm{W"/w{ֽ%oGnm{/^KK2z ^%91x/"^zD{KF,H?r9LXo -b6bX!c3jF,ِ1x XXl#lnj6b6bWdcF!g51^_Y+lِ1x 6^aȆ}} xE6d c6^m6^ db=kcVxm&2axxM6d Oi.kl5ِ1xۈ#z8+'lAqjqFِ18h#Nm#ۈ#2Smđ )qFFlqo7~㍘S9l ِ177!c9 Sިm6ސ ׍77[ʤRo:-\Uxm%2xxK6d n-Vm-lx mUxm#W>kbs;8Sxm#2E^;lِ1w;w;!cpwjﰍx&f&FmīmcdC6⡍xxl#l@hF<O6d ~xh#^m#H W:~[H߯&W6!c9%) j Fِ1WJPH6Ȇh#Am#xO6V7x/{X7ޫm6ޓ s}ϹWxm'2xxO6d NymWxm$11Dh#Qm#H$2m$m$bdCF"76D!c~#HTH6> l!b|kp AmljdC!cpjd;$EGG!c~#7>m|6> S|H6d gQ@6>m|мFFΎ$}GR˘e,e2fsyX<-c-c^1oX ˘e2gKi󷌥XXZY[2X2Z2Y2[ƲXƾea6ě׸$ި)BU'vO ^x?k\oQoϩc?13qspKJ6V:~╉ԛFIQoTm#)loNjIdCQRo%UHm$%2sM匁l$UHm6Ep6\6\ !c놋چ B6d vFm lÅl܆ ᢶm$#P-̛s37zf2dF2!cpɠdjɰddCSm$6 ɠdjɰ WݲnEpچ+J6d 7z~Ump%2S\⪶m Іچ+F6?;p6ܠ 7 7lÍl|/ŸmandC6ܠ 7 7lÍlnAnjn؆;xx6p϶{g[6ܱ w!c^3Æw wlÝl܆;᮶m 1W16ܱ [wL Q7<`P6<Ȇ oxmx`dCཨE=6< !c16~ `rDeCk${wONT6<ɆaFg Z؆'ِ1<ŧzmxbdCpr@sچ'lglMbNIjɱdCFro$WHm$'2_$jɱdCpvp2ÙV16m8yyGjg`R0weo<[ElR;;0|#y量^o.͓Tv^/=y*;dy;-LWMwv[}q=/cz 끷ځ7@}7#"q=&2ްxmxc)ȆGxG)))6R`)Ȇ{LHA6d n#Bm#lHF ؆٨4R&F;C6 U_Q6|Ȇm@>j>؆ِ1 hGm!2 6|6| _3M¹ggL _o̪7zfWm%2S|⫶m 6|6| _!cpІچ/G6 o_|IO ?X76 ?!c놟چG6d 6 ?!cp~Іچl)ŞVJRm#%lFJh#FJl#%ِ1FJFJ!c^4%ESm6ɆxNW6Ɇ8mcdCp꯶m lA{Ș1bhmcIZ]:`bu#6RaȆF*X7Rm6R `Jm#ln4r=IHm&޹Zm#5lyyjdC3F3VHm&2p~3lؾH ㎜]^c ' ;jFِ1xu#@m# 27`m ԍF6Ґ}N|nb{_iW4F!cgvgvҨm6Ґ i`Fm# ldJSg "ZQvU]).-$X !!xR(V w)w(R@qy{fngwzO=e5k)I F.UWDF.\F.!cY4Esm6r mRȅm"216>kxObhm6r{׸t]nbhn8Vȍm&2ȭM6d >憳hnFn!c}J=g ^\4'16rcd_KL W5Ump%27\᪶m  W7\6\ W!c{\ٗچ+l;"#XS5%Fl#ِ1y6`yȆ)y>%Fl#ِ1{@y6`yFӾ1+֔pMɫK6d y6byɆ)y>%F^l#/ِ1{By6bndcfnoᦶm )npMqSp6Ȇ 78omandCAnjnF>x #ȧG6d >想h>|F>!cy#7m6 |F>|F~sȐF~F~!cba _jdC6C6cɆF~h#F~lT4&FqpxpF!c5\S m6 (mP(m 2jdcW71 QjdC0kJ3oFAl ِ1Q6 bɆm6 mnyG!KVR+j<,▚ey[j>Z KVRJ[je,5?KVR+oU-ZhU*[jAZK-~wqrt.3v{;qd >7ù]qs'cwxqǹS1l{ǹ٘8Imb_!R(m"2?)b m6 FlTHmQlF!hF!l0ToGE( FaFa!cQjdC0}3F^ $Fal0ِ1FavgC^!+OnE0}xٺ"pTD݁4~xxuE)m/bӳ=5/Ep?(J7.lu椺(]}۟AQ/AQ2Ea?(vP@{pTT-(EI) mU(m#=N0nQL|\ ~\LmQlbbjŰbdC6A6aȆ׊bF1b؆ٸ#Hd_yf0U{=6< !c7~xmx`dC6<  lÃl܆ᡶm'w)LbQ?m6 )R\m8QlFqhFql8ِ1Fq؆'ٸj@-=L O}Pԓl\GzmxbdC6< O OlÓl܆'᩶mx zBj؆وThlϮ&^oxmxa^dCk\S6 /!c3-/x奶mx Ɛ᥶mx~01yÛlV6ɆgQo8zmxcdC} o olÛloxCj؆;&>om`>dC}  lÇl3x᣶m 6|6|dcSKTMYYj%dC6J@%6J`%ȆKj%dCh hF l$(vyV&FIqQoT(m$2Q(Q(I6d n$QRm$Qlo6Jm6J%01JsR\F)lِ1R!ٰ 6JaȆm6Jm6J 6Jm6|Ɇ{_-'^w_چ/K6d /~Wm%2 mmbdC6| _ _l4٘ri7bMjdCH.Jia(6JcɆFil4ِ1Q(Q(C6Je`(Q(C6d -e6`eȆal;c8luQObhm6ʐ (mQ(m ehO ?76 ?!cy~j~؆ِ1? ?lÏl܆᧶m%}*(+7jedCgeyYFY!c𳯲쫬FYl,ِ1FYF9ѫCQ(Q(G6d >oF9rF9!cp堍rj對rdC{rF9rFyO&FyaTxzZ'uP|x2ܥVV_o><pt+ye/;v}_C/H xW? 2? AjA[AAjAAFFQlػς&Fa QEm Ql|oZMmT6 UQEm Qlab U6`dcZZY^&Fg'޳m 66`!c9"jF0ِ1x666}YE.9B-0KnU",Z Kiղj[ju,Z=K-Ro5Ԣ-Z#KRԚZjZo%XjZ/!-غ3"fClDžB=NQB=.q2$Cq!DžP1^)u _(&F(H&:llM-4B6BP!c/jF(ِ1 PPl#l| 6B6B0<ݨ&FmFajaF[|6 QFfv"mmaUɆcxĨ*FU7mT6 oTUۨmT%2UaߨQۨJ6d T6mT6\5޺bFF8N6d 7aW6Ɇ mcdC}#W6ku_ĨaLF6l/8Q ۨF6d nQMmQloT}F5lِ1jF5jFٸR_d31"}l#lFmD pވPۈ6"Ȇ 6"6"d}3Žgg6cɆpިQۨN6dOjձdC}:Q]m:Qlq &F 1oԀF F !cp5j5dC}56j`5ȆF hF l&و(3&FMԄkJMFM!cbDk њj5dC6jB56jb5ɆmԄ6jm6"ƶ=SoD¾mD H7"6"H!cpFF$I6d ~_b$m"7tInbg_W-ZF-!c1}%6jaȆmԂ6jm6j g\ ڨQ ۨM6Vv^yQ[ڰoVۨm&2ߧԆjdCߧԆߧVۨm&2QڨQۨC6MoL:FhFlِ1} WQۨm!2?Ͼm6 S@u6`uƌs41=l]QۨK6d >oԅF]F]!ch[Wm.Ql̼.QWm.Ql8~3`ߨQۨG6d ԃkJ=zF=!cpzjzdC6A6aQdctoebD QFFE6d 7`߈Rۈ6Ȇה(DmDaQdCkJm')ҍ*Q_oԇ6cɆF}7m6 S}J}F}!cQڨQh@6?Mo4}Flِ1xhFF!c5\Sm46 }56m46ƓPǻVMhq 76h!c FF4M6d 7a߈Vۈ6Ɇהhh#Zm#hH6_:jMا4j dC}! 6b ɆaHtpذݱPm!ѐlFChFC C^=u`h.|x?Z-dC6Z@-6Z`-ȆimPhm$ֻh)l6Zm6Z /~/Rm%ђl|Mi הj-dCssKhFKlٸ`nU&F+nۭ6ZaȆJ@VjVdCg1YL+VF+!c9vF+VFkVι&Fk7ZþZm5њlD vkFk!cgZûZm6Z Ϣj6dW3LXbb6@m6`mȆg6pmhC6d 7Fm цl|MimQhm|N6"\S>6>6>'27:c8lt)w'16>6>'27>jc ϡ6>6ڒ_ogb}-m6bmɆF[7ڪm6ڒ oUhm%2mjmvd#`^fDhF;vF;!c{M{Mکm6ڑ hmShm#2vjdcuTi_01ڋ}J{OihO6d 7þ^m=ўlF{hF{l=ِ1aC6cȆ׃JO51:8Ya; dAmсlot}Flِ1FF!c蠶H6\uDa訶H6d n#Qm#ёl;;jdCgjNd1|obtImщl~N~NjNdC6:A6:aȆgNF'Nv0N_E|aa><%}g/;0}Oٺ/5B}Ϳ3]4ISjcuvI73]}Bx?te >cv:t391x? EtVAg!c:C6:c]7]01s.ܢFl ِ1.F.F!cWWmt6 Ϙ].j]dKfbtvvUmt%21FWl+ِ1x FWFW!cp]j]ndr6 113np覶 F6d 7MmэlF7hF7lِ1 覶 N6+j])]m;ѝlot}Fwl;ِ1)6cɆFwhFwlH&F7zCmуlo}Flِ1Ҳ)=ȆoJF!cp=j=dt;61zwꩶI6d ~NOxNOFO!chM驶I6d O mTm"(%l6zm6z ^oRm"2? {m6z mRm|I6vhwXSkʗj_b_  '166$2%ƗƗdCƗj_bF%m)E{YFol7ِ1x FoFo!cpjdCߓ6zm6"k>YJ|+ȆaF3ׇz $WWdCWpJm+l+!cY+h+>dutmM>bMה>j}>dC{>pGmчl>>j}>dCkJhFl/pV&F_kJ_F_!c5%a5?^m%2}a諶K6d 7B}6bF571~j~dC}6aȆVi~j~dC}Omџl/|_<>_m?џlF3ÆjdC6C6cɆm6m6 z1@o Pm 2gggglcِ1>eܧ Pm 2_S@6``L@hc@lc ِ1v Tm $211H6d 7B6mo3Km6Rn}cFZj,іK[Km6Ro}oM~&Zj,ɖKm6RnͰfZj,ٖ 쾴YCisOeOQRA 'c7A7Ad T=nq =n `%)%arZcdCXhcXl;;߉ߩm|m|G6d 7};ﰍȆalTv;4lwwjaFQco>)hb88Sm#2?7Ʃm6Ƒ بaެZ㰍qdCk8hc8lc<ٸQ&|&x7þ1^mc<1lxhcxlc<ِ1xxx!c11l4O<&jcߓ S16l_^}==ِ166'2=q.WL bMה j dC}c6&`Ȇal9c8l;~Ckc1l|MmLPۘm@6޺v?AAml!c}J3FdWِ17~Plom1l쟲yҸ&Dac"1Qmc"1l|;a'mL6& )2Qmc"1loL6&mL6&j$x1Imc1lfa{e$I$!c5e\S&mL6& ۘmLRۘmL&O$<1YɰoLVۘmL&27&ycdlc2ِ12)6&cɆal01j)dymIebL6@S6`SȆɝɝ1ۘB6d c3ƿKI )!c7@S6`S*1Uؘ mLUۘmL%2Saߘ1ۘJ6d >oLTT!cpSjSid;5J}8G1i|c4lcِ14xf>Mmc1loL}c4lcِ1wӠijӰdcRo11Yt:EmL6 oLWۘmL'2aߘ1ۘN6d nc:1]mc:1ldZrܜ& ̀k  !cp3j3dC6f@36f`3Ȇk1Cmc1l w|mӿMō}cLlc&ِ1LL!c}LO1ۘI6d ~5ژ1ۘE61KYoRۘm"2?Ͼfm6f ô6faȆ7fA6faF9zhbF ߍ<[mc61llhcllc6ِ12)6fcɆlv07aX6RgͷXj -EbKmR[f-VXj?Yj+-UjKmR[g6Xj--_,MfKmRfmxky.<ٺ9p՛ls|x?u*燣u?cgӰÚucbӳ|n]sԽk^~kalX;y̡tm?x]m#1l\&\W Js6bsɆ1Wmc.1l\hc\lc.ِ1^i.1Wmc.1l4(!^cs6}cٰ=8&|'jdC6C6cɆ|7m6 C6c FX3Ǐ 6џ7R.k.'wlcِ1 6` Ȇm,6m,6 ߷XXH6~yͳ gLo,}cBlc!ِ1BB!c3eBlc!ِ1XXD6LvxXa~eٰ"E"!c5e\Sm,6 Eo,RXm,"2ߧ,6m,6T{X,b7m,6 ?>Xmc1l|] gjdCbhcblc p?9)Qc.{%jK%dC,,QXm,!2_S5elc ِ1XXJ6|m莃&Rac)Tmc)l|X 獥jKdC}c)K6bKɆm,6m,6Ncll2lcِ1LHtpذBu2lcِ1xX2e2!c5eLmcl|A&rac9\mc9l|]gj˱dC6C6cɆm,6m,6VU/01V+j+dC 8oPXm 2XXA6d ~Xl:#낭&Ob ?mmD6d >o獟6~6~"2OOdC%mleܧlP؀ml 2ߧl j dC jdci3cblF8nT؈ml$2aبH6d lkFF!c=FhcFlgQWg?j?c? S~6~6~&2Ej?c? )?C?mlx8LR2WIE-)d#~Q;|xIv_W7}g~5MtͳV$Co#69bo`]}MlR;؄&r cs17El`1Z ؤ L6F|5c#69bflc3ِ1ff!cb3\+6ml66  mlV،ml!:N;c;4cc ٰ-!cbD -j[-dC}c [6`[Ȇ--V;CQcLVhcVlc+ِ1̳yml6 olU؊ml%2gg+Umc+l<^Hc7yc6lcِ1x6m6!csmb6lcِ1 ئ N6>o0cخN6d >olvv!c5e;\Sml6 mlWnx*zM/0wq찼cRmZj,KvR;lԎZj, KvR;mnZj,KvRl]봃zܕ%C_=|81P'c/#Obh{vP1x{uہ{q2q;`ۡq;l4ӆMb ׿j;dCNT؉m$2? Ovm6v ;j;_<ϻ31~u0}Wq7~UlF3FKjMi __ɆƯo++ِ1~WhW_]d#bwzD.].!cwwm6v w.].!c5eKmcllm0؞&na&~nlc7ِ1R1Ɇnn!cpjdC6vC6vc{FGUfb{=!cyc7m6 mQ؃m!2/qGmcl,}m&^cjsK6&?ğ^^!cp{j{dCt{9^^!cp{j{}dqKc`اG6d ncOmcl|g}j}dC>hc>lc?٘}U&~,jUluQ9oW؏m'2دO6d nc?_mc?l~hc~lNkb}6`Ȇm6m6 q@mql|q@mqlviqPa=AA!c{Vm6 8mT8m$2q8q8D6OK6+8$!7m6 8mR8m"2_S5!lِ1C!Caѧ²*MLahal0ِ1{fV8m&2q8q8L6d n0qXm0ql<!KqD|#!cs#\lِ1Q8m!2?:mQ8m%441y(7m6 ϢG,zTm(qlo}Ql(ِ1Q1qmp}㘰q 8q 8F6d 7qLmqlo}1lِ1r 8q 8N6b]&qkqq!cqjDZdC061g$NI q!csq q[w^k~ooboܛ~]}#uM7~#2? iAmm"ywĹZq 6NaȆ-NsSjSdC3)8cR8m"26Nm6N 08-l6Nm6N wwZm4ql|8 WjdCsihilwj&bM)mmN6d mmN6d nwhw߱Ɇהߡ6~6ΐYqgD83!csxg Q8m!27yl ِ1r8q8K6rqV􍳰oU8m%2ga8q8K6d 7¾qVm,qlY9烌J焍s9s9!cp砍sj簍sdC6A6aȆm6Ωm6ΓT{+eIx_yvj籍dC߽߽W8m'2_S5yl<ِ1yѯ_&1o\ !cq j dC}6.`Ȇm\6.m\6.gNab\6.B6.bɆm\6.m\6. ۸m\T۸m\$2qڸq۸D6:Lr"&%aqImql|MהKjKdCk%\R۸m\"2q ڸq ۸L6nTpżq6.cɆe7.m\6. ۸ m\V۸m\&2?߸ m\V۸m\!qm#qEظm\Q۸m\!2/ /l ِ1r)W6`WȆ7@W6m8s}#W-f]nXj7-[mK펥vRgiݷXj-GcK/K퉥R{fm=^Xj/-WkK퍥R{g>XszZo8 b{UR1ltFW=*qW{{wd >]=]5\&5lF6l_]S۸m\#25lِ1gg6aȆm\6m\6 nb\ܼ߹y]m:qlo\}ul:ِ1|6cɆm\6m\6njջlbpA7Ȇ퇭om6n ۸mP۸m 2o lِ1qCmqlvw8 bnm6n oMM!cp7j7dC{M-AoHgb"ɒ= vĸE6&wQ7nm6n qKmql}tnm6n )[j?Ɯ61g1?66 2dCpCml!c5h?d#.'71n;g$ӸM6o#4nm6n q[m6qlmhml6ِ1rڸq۸C6Qt8߸7m6 ށgw6`wȆ;p޸q۸C6d ܁6m64sՈzkb]8oU۸m%2EY]l.ِ1qw6bwɆm܅6m6 z^>ܧS۸m#2qڸq۸G6d 7qOmql|MmS۸gxOl l]ٺ?IDr'Eia><߭iw`>< uS?WO7}k'w~M'}}d}տ}2a?vp@k}VW}!cgdC6cƭ?^@Z@ml|jdCp@ml|oxxH6W}O8x-m<6 oo<3g3!cpϠgjϰjߖ21p[molo!c7mmM6d 7}oɆm m7l{ 㹰xxN6d Oy)6cɆpxxN6d >>6m<6^v9jbk Pxm 2?zϾ^m6^ )/BmlBmlsux))/>Kl%ِ1%þTxm$2_S^5Kl%ِ1xxE6m r}JWoRxm"2`x xE6d 7^JmlW+Wk2ƂME_g@/Zm5lo}kl5ِ1kk!cy5Zm5lwoĚ)o6`oȆ)o>l ِ1,΢o6`oȆm6ިm6ޒc21:G-PV`[l-ِ1)o6boɆ[7ުm6ޒ Ϣojowd#P}Lwbaߩm6ޑ woSxm#2`xxG6d 7A6a{:x/֔pMyxO6d >o{{!cjﱍdC{QEu&O)6>`ȆהpM@6d 7>Amlo|6>m|񙥖RKaRYj-4ZZK-R`Xj-LZfK-RferXj9-\ZnKRc,|Z~KV9auJ{\2CNb( 1`Kb/ Z1`Kb"1h&g.>\}Hm|m|F6d n3h3ϰȆm|m|ِ1Ϡ6>6/mH.hnNHN6d >%wAQrFr!cpɡjɱdCssrh#Frl#(Aؚ)F F !cp)j)dCpAPHm 2HnWJYy+l]J8eTHia><߭K T;Hiw`>< wRΐR}Sگ?n]JxSyJR5wx9^*1cW? ]}?=J ȁaA3FT$VD*Rߗ H HM6?[sZH mVHm&2_+RZm#5l|H EjFj!c35Zm#5ld(34#4ji4dC0xg(Hm!2HHC6d n# Fm# l oI&FZa#-Vm#-l|oMӪm6Ғ ϘiጙVm#-lFZF:z@-=&\}\}6aȆaIppذP"F:l#ِ1xHF:tF:!cy#Nm#ltH/pHHO6d 7þ^m#=lo}#Fzl#=ِ14=^m#=lݸ21&Fqn[dPȀmd 2E16_sI F!c j dC62@62`.dy41\Ě lÅl>tچ B6d ] .Emp!2_S\  l##8Yd&FFdkJFFF!cjdC}##62bɆgьFFF&/ 512 LjLdCg_W&LF&!cpLjLdC{LF&LFf+CMb jdCHňf&662cɆmd62md62  mdVȌmd!{/EY༑Em# l\4 <͢B6d n# Em# l|mdQȂmd%[ <չɬdv Um#+l|amd6  mdUȊmd%27BY6bF=ibdkJ6dSȆmd#2`Ȧ F6d l.=6aȆהlF6lFvpnUL.7tʮN6d 7þ]m#;l+;<ʮN6d n#;]m#;lyx&FO)96r`9Ȇm6rm6r o96r`9Ȇm6rm6rҵ-\S̼luQLnNFN!c𳯜+FNl#'ِ1x FNFN!c8l811j9\d#VmM\b Srm6r \oRȅm"2EsY4F.l#ِ1y.h#F.l#7:c?61r;mlL]qHT7rm6r  mVȍm&2_Sr5%Fnl#7ِ1>%7[m#7J6* W8ombdCk+\S\6\ W!cpІچ+J6d ~ mmbyFN218m/2 k_dQȃm!2ȣC6d y\Qȃm!2E@y6`y?zq&F^1oF^F^!c1RZydCF^8oUȋm%2ȫp#-'p1& w zwچF6d ~Ͼ6ܰ 7!cچF6d >AnjnF>qޭ_sF&F>1oF>|F>!c|j|dCh>|F>!cy#Om#݆晤dfgn)5*_-"]?>I;0}gU#_}ه's>^kt6ܹx~]C# 9]}#A 2_+ ZD jd#jZQ6 bɆ爂p(Q(H6d ~YwT(m$21 B6 m8J}Ӌ|7]s [jE,Z1KR+nyZj^cJZj,5_KVRZj,ZKRhXjZ%KdUԂ-}q˷a:{ǹN=NuwwAuwW8wܩ|'"wus=Νz?w=Fi ٨F!lِ1}!8#R(m"2_ F!lِ1}!hF!l0XPa(Q(L6d ~{ax{aFa!cpjdC}0QXm0Ql|V("=+=+Q(B6d >7ss"F!cpE"jE"dC 6m6 xhb}(E6bEɆac8ln+Q(J6d >oFQFQ!cQ(Q(F62(;wQL(mS(m#27yF1lِ1bF1bF1!cpŠbjŰ 1e&mxmx`dC061R'%mx 'P6<Ȇmx@jFqTeLbRSm6 Q\m8QlFqhFql8ِ1w:šjű Oы)`bx چ'I6d >oxySm$2 mxmxbdC}T6ƃJO61> S6 /!cy ^j^؆ِ1> S6 /!c /hKm &6kؠ-+ +孶mx ì)[6 o!cpІچ7M6d ݏ7᭶m)zg(jb>ІچC6d >oyGm!2ߧ}چC6d nQ6J_Hs71JYEKm6J (mP(m 27JyF lِ1F FIqx`%,Z΢%6Jb%Ɇaaut'}Ck$Qlo}FIl$ِ1FIF)A&F)l])l])RF)!cYEKm6J (mR(m"2EKA6JadcώM _7|aU6|ɆAmbdC6| _ _l×lξጁlmbɆ_#&FiLiLiFi!cy47Jm6J SJ}JiFi!cQ(Q(C6:'eD(F2F!cpe2je2dCh8Q(m!2?*mQ(mc{vuhby~j~؆ِ1 ? ?lÏlo᧶m Ϣ~ІچQlLvx*QVa=lYFY!cpejedC6Be6beɆm6ʪm6ʑ63ĚR)6aȆהrpM)Q(G6d T9T9rF9!cp堍rj對dcD˄)LFyhFyl<ِ1x(FyFy!cy<7ʫm6ʓ U(QnW,ƃyQA-]?>[W:vP|xwWO>u5p?k{"=CU?tv?91??1Zmmcƣժw{ebT6*B6*bɆ爊pQۨH6d >cV3fEFE!cpj}Fm 76!c9"jFِ1h#@m#${(lBjF ِ1x}#Pm#$2mmbdCgZFF Ql4TrG&F%q_F%x_F%JF%!cg+g+mT6* ۨmTRۨmT"2Q ڨQ ۨL6.=v}aߨQۨL6d oTVۨmT&2E+YFel2ِ1$j z251D}#Hm#"2AomaAdC}# l#loAAjAFFnUęVxQEm QloT}Fl ِ1xߨF*F!cY QEm L6 2争,֔`mcdC 'Xm#&2 mmcdCϝCjvÜ_#xgG=ZVR ԪYjZuKVRjYj-:Z]KeշXjіZCKRkbXjM-XK-R,DK-~qŶtu _\B=.q2? g1!{\8--DBp 'c/u _((o]01B PPl#lf6wphx{->Flِ1,Z΢u6`uȆ:pިQۨC6d nQGmQlTXVIj8ߨ 7m6 ۨ mUۨm%2_S5F]l.ِ1uuju6y3[7(lYG̳uJRO-]?>[W:vP|x?kS_zo><=Ճ׼ ͡,5D? J}p?/c~DD~Ed ((H׊(h#Jm# ۨO6fu"1P_m>Ql;;jdC{poZ_m>QlF}hF}lș&F1c63fF!cj dC6@ 6` ȆYmm4PhmD1tHj-{߽GmDcdC}#hhl#l| jF4ِ1x߈66d#%=eb4FC8o4Thm4$2?h-m46 o4Thm4$2hhD6=YaHFo4Rhm4"2_S5F#lِ1xhF#FF#!cpFjdE',΢6cɆj jhL6d 7þXm1јl,1Xm1фlty>hhB6d >o4F&F!cpM&jM&dC6@M6`1dƾ)'31bsQbȆ/lF C6d 5%Fm#ۈ!2mĨm`1dC6bl)pL׌ziiqpkF=N{G]gulG] ;ŝH,$w)^]-~k>ڵ8{W_ggc͚ k\7\Q1 ָn nd#ce51Df7 7lÍlov}چF6d >Mm p#2mmaTw'G߭뮶N6d 7ᰑIzK3.Fwl;ِ1FwFw!cFw؆;HYkb]ӹ}:w wlÝlnú᮶m p66ܱ w!cmmcdcT=j21Fol7ِ1x mVm!6#FX7m6 mQm!2S9Flِ1s}>j}dc1}F_F_!cp}j}dC6B}6b}ɆF_hF_l(R1&F?1sJ?~F?!c^Em6 بa~5J] ~F?!c~Omџl,XE:&FQ7ú_m?џlFhFl?ِ1x/6cɆm6m6̾Y =w0m 6 m Pm 2S9elcِ121!a)[Y|) lÇl܆᣶m 6|6| !cNhGmH6ӷLjdC6B6bɆ1H6d ^7B6bd#˛L/<뫶m 6|6| _!c 놯چ/K6d ^7| _ _lÏlOcb놟چG6d \|.Om#2mma~dC~Іچ1l8^?1Hm Rm "27m 6 )2Hmc1l|Nm Rm &<_,l 6m 6 )2Xmc01l`hc`lc0ِ121']7H/7چ?O6d nW6Ɇ8mcdCuW641!pclcِ12)C6`CȆm 6m 6 {1Dmc1l4[CPP!c3CܡjCdCX 0Tmc(1l m Um #&^+l6ƪm6ƒ ?_4>_4Vmc,1l|4ƪm6ƒ 71G6/5c11G6d [8[8q8!c9eSƩm6Ƒ 㠍qj㰍`y}41`h#Xm#&2Sm 66`!c~#V6B@GcbBJ$Dm#!2/m )!pN Q6BȆm@!j!F(h#w&FnmbdCsJ(SB6BP!c FF(J6d ދBjxqx _ㅍxx!c^tL6&mL6&b1YԍɰnLVۘmL&27&~cdlc2ِ1dd!cpj)d#߫-ebL؋NQۘmL!21Ʊ>olc ِ1))!c~c 1Emc 1lDzwnbL6BS6bSɆߘ1ۘJ6d nc*1Umc*1lnL6mL6dbbL6A6aȆa:9c8ltݓ-{bhmL6 ۘmLSۘmL#2ӠijӰ01v.aFm ׍0X76°0!c0m 66°p–gMp;jF8ِ1Yppl#lnúm 66±Ao:ebDuJ\DmD`dC{pnbLw0a _jӱdC6C6cɆpN1ۘN6d 5ژ1ۈ$S)HoDmDbdCp#Rm#ۈ$2 mDmDbdCsJ$m WW}1Y7̙dӸW3yn lcِ1xݘ  !cp3j3dCuc1Cmc1l`~@&Lg>Tۘm$21ژ1ۘI6d ~r&b.#\\ݗ1x= \%2sa=1׃$B`.1Wmc.1lĶ=V&1_mc>1lL|hc|lc٘9>csX@6Lniclcِ1@mcl|?m,6 ù6fb  6`Qd#EqǥL(a# ڈRۈ6ȆϝDs'QjQFِ1x݈u#Jm# ۈ"2mDmDm8ݛ^aXhy?"bRXele,2k[n[a[i[e[m[c[k[g[o`222222222222ޗTわuZ(慰o^q q[H5NB-T׸-'co!kB\R1Lq{j2-"'}b,}"7/RXm,"2XXD6d >-"E"!c8f169ŻSMXm,&IuXX m,VXm,&2XXL6d ^7úXmc1ln,ucblc xrsL%hclc ِ1%%!c狖狖m,6 =KLi?ZKdãҭfgKŻ4wi.UXm,%2ߧ[ 閪m,6 )KᜲTmc)l|NY 甥jKhq&FѰnDmDcdC0{116lGFmDcdCsJ4S6h!c8j2/̯Leb Sm,6 -t6aȆ2X7m,6 `LmcC6rTĈ6bl#l D0F C6d n#ڈQۈ6bȆF 1j1F,٨M &FSbmĒ ߈Uۈ6bɆmBjF,ِ1FF,lBL]{j˱dC06:9c8l[dBXm,'2XXN6d ^7C6c+Fk21V֍j+dC oPXm 2XXA6d ncBmclӢcFglg_ؕj+dC0u3Æ3X+6Vb+Ɇu_ L[XI6d a#f] *k01V ֍UjUdC{_*U*!cUpk*lcِ1F:جXm&w̘rlĉ~^M6vsϺVXm&2aja .jlc5ِ1)6VcɆaFgg #ū6Vcklbk5p Fmc lX5jk5dC6@k6`kȆaltqoN)] 5Zڥ@_c8]XK6d ZZZ!c}ѵp_tZlc-ِ1Z:'lLu,:x:lcِ1x6aȆ:X7֩m6֑ ha>4Z밍dÿ11 롍j뱍dC6C6cɆm6֫m6֓ XmWXml /AmlP؀ml 276~clcِ1  !cg7 j6~1g!o\Q.\܅]ٺ_`EsD߾ (~Q_w\<)x~=׃toK2!QԃlTl/cb#tQ`#Ɂ6=jq=H"d F&&j]MMbm M7ml66 mlR؄ml"2+6b&lcِ16A66aƉJMτu216pجL6d nc3Ymc3lnlucflc3ِ16C66c/4lobls8lQ؂ml!2آB6d ov[6`[Ȇml6ml6~\ژ[Ŝ)[6b[Ɇml6ml6 #15epO] V!c~c+Umc+lI]Mmnluc6lcِ13;3;6aȆmpN٦ F6d ^7A6aƪLj۱dCuc;6cɆpNٮN6d nc;]mc;lm8}>!c5>ڧG6d ncOmcl {6ZYcӆy݁;!cqGmqltUo&]Q7ºqWm.ql]h]l.ِ1z.\oU۸m%2qڸq۸G6.Q㞳oFF.1݊?{j{dC6A6aȆm܃6m6 A6aF#G~ĸ/}X7m6 ۸mW۸m'2ýpm6 .xڸqnqws.9aywajEwv݁x"ٺ]}}s߾[;翫<{^1{ m|6> _!cpjdCuAmld-y#_@㣘S>9Gl#ِ1x6>bɆ甏pNH6d {GhGl٠'GD/ 6>aȆaְ16lU D6d װ6>aȆm|6>m|6>=2,gX7>m|6> aYm3lYYjdCg >C6>c@SK~/oِ1SR l mmE6d {__ja_DžgM/n|ul ِ1//!c~ 7m|6 ׍//v13I{5œIV"0w$ uv?DbQGmI_VK8߸|{ʪOz_\׃te G|}W|%2+¹ZW\_j_6}Y{_" xG}?G\X85Ŝ)6cɆmć6m6 ۈmWۈm'2ڈp!U71\6m.d`چ B6d npQp6\Ȇm@.j.؆ ِ1mm` #NHʟ=K=KH@6d n#@m#l7h&Fl#ِ1xHm$PHm$$s|ӧiԍdc:1-gm$6 &tE{ 6b ɆFBX7m$6 ?'HHD6wXH`Hm#ll]"Wt.F"l#ِ1xHF"DF"!cHHL6wtعN1&&w8?'VHm$&2S9%Fbl#1ِ1o]o6cɆm$6m$6vH"ְI6Fl# ِ1ٺ$l]$F!c9% Sm$6 I$jId#y1-IFWHJ6\c@ҤjIdCFRo$UHm$%2HHJ6d ^7BI6bFP˒51gϒgϒm$6 a{af2dF2!c~#7m$6 ɠdjɰdG41֍jɱdCu#96cɆm$6m$6 )ɡjɱ W3وj&Xuچ+J6d \WW\W WlÕl|Nqsچ+J6d npUp6R'.eRlbp)AdT"3#2md62 ͜16^'y},Ȍmd&2+2C62cYFpLM,ndu#Fl# ِ1,F,F!c-1#r}Ck# lmdQȂmd%_9obd6BY6bYɆ甬pNɪJ6d 39c8ldx9Qbhmd6  mdUȊmd#"2Iabd6A6aȆΦ F6d qacSZٰldC6A6aӒ; Lfbdse+jٱdCu#;6cɆaie.Fvl#;ِ1FvF[FG9D/96r`9ȆΡA6d ދ怽hF!cgvr@96r`9q9{ZLRNa{ihNFN!c^4'Esm6r ?>Sm#'ln6rmpw{#wv䲼#e,e,e,e,eeeeeeeeeeeX)Xi؏2r,c-c,c-c,c-cU,cU-c,E5eˀ_\b>ܷϥqpE5N0}s'g G̥qpE5NϞϞR׸\'c ָ\ Eu6rbvFdjdC}sn7Vȍm&2ȭM6d OȭC6j;LoSȇm#2_Sk|j|dC6aȆm6m6iO׾/}jdCu#?6cɆF~X7m6 0?_m#?Qlv|!홉Q@X@mQlFhFlِ1 wP(m 2_6 m6 YOj((zт-Q(H6d n QPm Ql-{тjdCsJAhFAlHxMB(BjBdCF!oR(m"2S 9F!lِ1BF!BFa:\QXf\f\Xm0QlnuFal0ِ1FaFa!c5lahFal`QDE`/ZDmQlLn{g 3Q(B6d ~F<#SDmQln6m6 )&FQ1sJQFQ!cSEjEdC6BE6bEɆFQhFQlx gbsJ18S(m#2Q (Q (F6d N))6aȆװŠbjŰd}EMFqhFql8ِ1xQ6cɆ):Fql8ِ18Q\m8Ql܌11J9SJm6J (mP(m 2Q(Q(A6d o6Jm6J?YQR( mT(m$2_Ökؒj%dC6JB%6Jb%Ɇm6Jmpny};[I~P.\܅]ٺ`AsD߾[?o.]d΋{A){9WJԃRRR/ctPJȁ-J}Rjp=(E"d (mR(m&;IW퐉QZae(Q(M6d >WsEiFi!cpjdC.KC6Jc?27a?ºƏƏdCgGɆLƏƏdCQmGl XYm{L2e\7ʨm6ʐ [e6`eȆ((Q(C6d 6-mQ(m%y}(+~_- _-Q(K6d oFYFY!cβpFYl,ِ1xQ(Q(G6[wQNWNmQl(rj對rdC~g9rF9!cp堍rj對Ȇ鹾I?^'Ȇmmِ1x/ER l|'h'dcº;#7F8o%.O6vs/)/Q(O6d ދhyFy!cp塍j屍dCFyhFylj2ֵZ7*~Fl1 F F%bp j fK6*@6*`J%^ebTsJE8TTۨmT$2E+^FEl"ِ1FEFE!c5lEhFElx9h}&F%Q7*QImQl,%xF%lِ1:\TRۨmT"2Jjdg>CEWeUYm2Ql|2ߨQۨL6d n2QYm2Ql mTVۨmT!wbS9Fl ِ1L䌑0U6`UȆ*pNQۨB6d ^7@U6`UɆcUaݨQۨJ6d oTFUFU!c=pϼFUl*ِ1FUF5q}{sMjF5hF5lِ1j t5jF5!cQ ֍jjհjdC6A6m7a[Q2V2V2V2V2V2V2V2222222222eeeeeeeeeeeee0թեNŹeuuk\uq2ípk\u\S1W5:qթyUW׸xA6&F 7׀}s F !c}O+Pۨm 2jF lِ1o?5j5d܉JMτ5EoTF56jb5Ɇ暰oQۨI6d n&QSm&QlFMhFMlXτ)&F-Q7jQKmQl|/܋Q ۨE6d q-q-ZF-!cQKmQlOYkQ[ب mVۨm&27j~Fml6ِ1sHsH6jcɆFmhFmlpQ_m>QlF}hF}l>ِ1j653Iv.]u j w}bo w\<)xw{@}zАo5! w! 44!91x "zАDlm4Thm4"M^Oigb4}D#G4Rhm4"21F#lِ1\VFjFdCsE#hF#l1ٸ8rCrx1|Fcl1ِ1xh FcFc!c֍jdC=fchFcl h\&FQ7hhB6d ^7!chm46 h"lZM&dCsJhFl)8qh*-ni4Uhm4%2 o*e FS!c9Sd FS!cpMjMfd01 ͠fjͰfdCu6aȆm46m46 )͠fjͰdco\5^ͅFsFs!c]6߻16cɆm46m46 ׍FsF Q~L~<؂l|{ iPhm 2E[^Thm 2}}Uhm 2hlYo,7j?c? #+_? [Ymglg!cWZ?c? )?C?mm$K%^iԍdÜ uFKl%ِ1x/-6Zb-Ɇ甖pNihI6d n%Rm%ъlDXqBXökVjVdCu6ZaȆm6Zm6Z }6Zm6Z gbg[OFkl5ِ1xh FkFk!cpFkl5ِ1xhhC6$|~sm`hhC6dljkC6lS[6F!cpm6jm6dCsJhFl-٠611ڊuJ[NihK6d oUhm%2?Vɕ16bmɆF[hF[lYl LvbSکm6ڑ )]16_.F;lِ1x6aȆm6کm6ړ.51 jdCF{F{!cpjdCsJ{hF{lpPX-蠶@6d c3F>[N-] F!c9S:mt6: mtPmt$e?{5訶H6d ^7:ºQm#ёl|_#H6d n#Qm#щl*9N+褶 D6d nImщlntuF'lِ1x 褶 L65鞪]3Fgl3ِ1FgFg!c5lgL6d n3Ym3хl4zR&u9S9Fl ِ1.F.F!cp].j].dCsJhFl+Xi mt6  mtUmt%27~FWl+ِ1FWvfyee2ayYzXzZzYƼ-c-c},c}-c,c-c,c>1_˘elele2626262626262626~nT*m8z&.;;}Ёځ;@pWpD|mmcd#S$=†ᡶmx 6<6< !c\+ymx`dC6<  lÓlL+_j؆'ِ1'cT6<ɆmxBj؆Ht2sYM /E6l?ymxa^dC6 / /lËl|NsچE6d 66dcNL&F6j=dC6z@=6z`=Ȇm6zm6z mPm$v89t?d#ԅ==6zb=Ɇm6zm6z =aSm'ѓl|N mTm"ݙ K%?^j^dCߟ%?%chm6z mRm"2r/hF/lÛl<&ӆy ЛlV6Ɇ7j؆7ِ1 oh[m&266d$31z~77zm6z <aۧe Fo!cpjdCFohFolٸ04X>j}>dC}F>F!c^Em6 ׍>F>F_$O\Lj}dCߑ+##chm6  mUm%2諶G6~]_'ϕ_iSm#2?[맶G6d }Sm#2SA6aFg:}bFoWm'2F#!O6d ^7ú_m?џln6m6_nJ l *1@6d NG7@mc1ln 1@6d 11!EC2\96|  lÇl܆᣶m 6|6| !c9Q6%11=6bɆ);Nm 6 ao Tm $211%YV&Wm%2E}w{|6| _!c 놯چ/K6d nU6Fxk}zfb9)~j~؆ِ1xuOm#2mma~dCཨ᧶m "I>.c`1D6d ^71Hmc1lc7m 6 ׍A A`T&`ac01Xmc01ln uc`lc0ِ1v0|``!cu`hc`lßl|t׃tϛUOv7BԃP/c6v0׃@s8WP!cz01I6/q))1Fm6F MGµHH!cp/|Hlc$ِ1x11E6m[1JԍQnRm"2( Ckc1lgQjQdC06R51QjdcSǟ51F;晝dTQY7Fm6F ??>Zs8q8!c=qpw8lcِ1xmSmϝ{,`omcdCH b$16`!cgςgjF0ِ1`h#Xm#!?|e"]s@!j!F(x!*#TԍPX7B6BP!cȄZF(ِ1 PPl#lnBjxVEㅍxx!cuxN1O6d 1oWm'211ۘ@6|^1A`/:Amc1lf[ =S/&q&i<4Gmc1l99js9dC6@s6`sȆaldsHod 9\q&\9wUۘm%2??埫1ۘK6d nc.1Wmc.1ln̅uc\lc٨yCoc6cɆ1ۘO6d nc>1_mc>1lF&g j}=~5Ckc>lJ*[cxk|klcِ1@mcl|Sm,6 3Z,PXmDKgM(N((l#lfN2FE6d n# ڈRۈ6Ȇ'666a4oqc=,c-cK,cK-cіeXeleleleleleleleleleleF&fV6vN.naRUo_-5n-5n!8 P]jXXq q[H5N}B7/T׸x[D6f݈pTb,6A6aȆa.+Dȹw16aȆEo^XD6d 7/}"EbjXUۚŚj1\S-VXm,&2aXXL6d \b\bb!cy1m,6 BZKcK`XXB6d aT)] %!c9e Sm,6 ?OXXJ6n&RQ7ºTmc)l|w)]XJ6d nc)Tmc)ld#3FʎCkc)M67s<^˚5oV؍m&2حC611{=j{=dCuc{6`{Ȇ){:elcِ1xأK6N[yjucثK6d nc/Wmc/lnuc^lc/ِ1x mUk8ut̫l>xJbZ>sݝgs>s4^uHZJd}sn>x>\=sJ؊~Qz_}zjq=Od >Ws~'2~hc~l(2|_˙!cpjdCpq@mqlhlÕllJok& mmbdC}+#\6\ W!c>j؆+ِ1x mmbF_ݽs01wVwVm6 ׍nT8m$2S9Al ِ1A!Q"&!aqHmql{wg P)8m"2q8q8D6d 8mR8m6돈41$sjf%"b90Sm65jfu"bq8q8B6MM#hlِ1##!cpG#jG#dCg@G6`GFb61^(Em6 ׍nU8m%2S9Ql(ِ1x8 mU8m#C?w4qL|:q 8F6dT"z1lِ1c1c1!cpǠcjǰ 7q#nnᦶm  7X76ܰ 7!cpnІچF6d n pSp6OlbqoW8m'2166fqcbhm6 8mW8m'2_6m6NELA'සNm6N o'6N`'ȆEO}j'dCuqBmql4+>!&IQ7NºqRm$qlfa#w.Q I!cq֍j'dC{'j'Sd;WLSν/sٰ8q 8E6d ))S)!cpSjSdCkS)SiQɖ:4\V8m&27N~il4ِ1ii!c~4qZm4N6vi(pw w~ȭ}ImcdCwNqWp6ɆmCj؆;ِ1wh]m 7&xxmx`dC6<  lÃl܆ᡶmx  hCm$[>H?M OQ77R8/\㼨|󟗺yE5N5 8/q2_o{祮q^x&K?|?bx57\SymxcdCό3co olÛl7|f쭶mx Іچ7qlHx㌰q8q8C6d ^7qFm qlhl ِ1x|8q8K6譆'&Y: Tg6bgɆQ; Q;q8K6d n,qVm,qlYhYlÇlj>؆ِ1xuGm!2m`>dC6|  l×l|1fQ&x mbdC6| _ _l×lچ/K6d nUp:ݺz^ƃ9[w8q.\<%߿[w>9vp\< gY}si28/9=?BEz~茶~ݗ1?p=#2#??\H66d#p?N01΋}pyl<ِ1\q6cɆ8q8O6d 6=mW8m Nj㮙†?᯶m 66 !c놿چ?O6d ^7  lZ\qAظm\P۸m\ 2-.m\6. `yAmql|qAm@6j9.#@P6Ȇm@jFِ1h#@m# 2mm`ƁQEݸEE!cgjdC6.B6.bɆ甋EF (yf]/nºm T @@l#lF m 66 O,~&FAnmaAdChE6 !cpAFFD6d ;AFFql|ĸ$%X7.m\6. %6.aȆ):%lِ1xq ڸq &C\L`Q7aV6Ɇ`omcdCp#Xm#&2S``l#li&Fmm`!dC!p_4Dm#!2SBm 6B6BP1LP19%Tm#%2_Æ5lF(J6d n#U6BɆPh#Tm#۸L62c1㲨aݸq۸L6d ދ^ee!cpjdCW/C6.cadczanm ׍0X76°0!cwajaFِ10h#Lm# ۸B6٧qEظm\Q۸m\!2qڸq۸B6d N)W6`WȆ++UѳqGW\W\W6bWɆm\6m\6 SuUU!c^*qUm*ql\̰fqM`qMmql߸kjװkdC5o\S۸m\#2SA6adմy[fb FF8N6d n#W6ɆF8jF8ِ1ph#\m#۸N68(q]-\W۸m\'2qڸq۸N6d ^7úq]m:ql|Nm\W۸m ĸ!߸q۸A6d nqCmqln܀u lِ1 MqݰM76MI6l76nb7Ɇm܄6nm6n ׍nT۸m$2SnB76nbFL6Dݸ-[-!cu-Nq ۸E6d nqKmql| { ڸq ۸M6/vĸ-z۰q۸M6d 6|v[m6qlmhml6ِ1xݸ mV۸mD܎g!FjFِ1l#l߈FFA6d oD@jv1wEc;purG-]x/3Iw;jw{BZQeww\<=x2癤;Q;{|}|eee,2m{`{h{d==Z,cXeee,22eeeO+k[;{w_"v黡ueF:{h$U1ˢ*Hb2"a=T׳Hql|tڸqۈ"EnibD9ṃƽKQjQFِ1x݈u#Jm# ۈ"2mDmDaQdC{,QFFM6z}h-/EmDcdCu#֍hhl#lF4mD ׍hh#Zm#x@6RddH9y@6ܓ;to>Pxm< 2F* lضm<6 xmTxm<$2SB6bȆO}C#ƘȆ+-=GjGdC0u3Æ'Km<6 ׍Gn$9%Qm#H$2m$m$bO_=~LShSl)ِ1ySS!c֍jOdC6BO6bi71 ϠgjϰgdC3؋>Sxm<#2_>kgjϰgdC06{3gF٠H{IpWs+W"21_Z+\^6^m6^ 01^端jdC~kk!c56^cɆm6^m6ސw<\|nbq0ߐ C7jo7dC6@o6`oȆm6ިm6ސ o7jod#U:W21ފ[xxK6d >s[[!cpojodCu-Vm-lɝKy㝨`xxG6d xwjﰍwdC;oSxm#2zmSxm'11ދ֍jﱍdC6C6cɆ{X7ޫm6ޓ )jﱍdc^?.ab|p~ȼl^@6d >|s!c֍jdCuAm݆0>? 7;;Xƒ[RXRZRYR[XZY[2X2Z2Y\,c-cY,cZƲZƲYƲ[rXrZrYr[XZY[ X>ta2'{īVQ) ﯿOI?ğd.)׸d.c%b1`K?1ո>u 8}B6.>YA,,OOȆ{O\Po''dC>qA>Ql=OO6>6ob$6C6cɆm$6m$6 Hm$WHm$'2ɡjɱde11R)j)dC6R@)6R`)ȆT)\К*F l#ِ1^L h#F l#%ٸwbr)FJFJ!c~#%7Rm6R H mTHm$2SRB)6RbF]jbh*؋RHm"2a{Jm#lT.TjTdCsJ*h#F*l#58ԺMԢnu#Fjl#5ِ1xH FjFj!c֍jdCsJjh#Fjl# hPɖM4Fh#Fl# ِ1ٺ4.l]4F!c}4.h.Fl# ِ1xHmQHm%n!"31ҺﺧuAoUHm%2E^4FZl#-ِ1FZFZ!cHHG6*өLtnu#F:l#ِ1>yWl#wbhm6ґ }{_6aȆF:h#F:l#=٠[%71ҋ֍j鱍dCwAWHm'2HHO6d ^7C6cg?jQC FX72md62 )16R{jG162`Ȇ pNɠ@6d \0Am#lboLFFh#FFl##ِ1x62bɆFFX72md62 mdTȈmd""˯ImdRȄmd"2_fkLjLdC62A62aȆLF&L؆ nz.† ᢶm  X7\6\ !c9).j.؆ ِ1 hEmL6hYf62cɆmd62md62 f62cɆFfF1h7&F;Y\tdQȂmd!2ȢB6d >dsJ,F!c)Y,jY6>u1[GݺO] O">0O9[)tvi?g>⟪o.]<3z?2~#g +}[dYz jYq=J"d oȪF6n.y7eM`Mm#l| ?md6 mdSȆmd#2#A6aF51;nd'QgWȎmd'2>{ϮN6d n#;]m#;lnd6md6r g71r39`GCm#lnu#Fl#ِ1FF!cih#Fl#'hR&FN 96rb9Ɇm6rm6r MsµiNFN!cȩE6N]5#rm6r Ms5I.\F.!ci.6ͥ E6d ۳\jd2׆]7@roVȍm&2ȭM6d >WnrͭM6d oȭC6vV &#FX7m6 a5lady^L|F>h#F>l#ِ1x/6aȆ):%F>l#ِ1x/ȧO627Lb am6 )ᜒ_m#?lF~h#F~l#?ِ1W~h#F~lX{ U|LnuFlِ1x(FF!c9S m6 ׍Fgd&g m|m|F6d N S>S ln|gja Am|m$#|QP)RPm QlFAhFAl ِ1x(FAFA!c5lAhFA aa(dGaXXQX1XqX XIX)XiXXYX9XyXXEX%XeX疱jꖱZږ:zS!Q!u+k\!q2F*6 g k\!\ Q1x+k\!u+k\!q2q`+qWl s[.7 Fal0ِ1W6 cɆm6 m6 ( mV(m!Ο|(""o.Q(B6dT1Ca{PDmQlFhFlِ1QDmQltLbN) 產jEdCu(E6bEɆm6m6 BE6bxĜR )6aȆgrm6 ?3.S(m#2SA6aF)]&Fq1sJqFq!cwԊwԊm6 (mW(m'2šjűdTIfQB(mP(m 2pذ/Q(A6d >sJ F !cQ(Q(I6>9Xa/&FIoFIFI!cpFIl$ِ1x( FIFI!c^$QRm$Qlh|LRF)hF)lِ16JaȆKRjRdC6JA6JaFw/&Dn11J;x,M6lt*Q(M6d ^7JúQZm4QlFihFil4ِ1FivC^eٺuLa֕]F2v)?gj2viؿyٺ2p(ew\<=߿[W2{^׃t?^׽:Cs0\)Kw_׃te oQ:(vP׃@,e"zPD|Q(Q(G6FDfXcbr2S(m#2+F9lِ1rF9rF9!cQNmQl$5'  .ʫm6ʓ {V{V^mWl9psϱɆጁl|9Ql4;.lQU|*vUFU!cpFUl*ِ1x/ZU6bUɆװUjUjdýúO01Q ֍jjհjdCu6aȆjpNQ ۨF6d ^7A6aFM51~:7mT6 ۨmTWۨmT'2wmT6 ۨmTWۨm {lQY7dsŕؖF F !cpذPCmQl|Nj5dCpS1j5dñwbQSԍnTۨm$27j~FMl&ِ1FMFM!c12aCk&Qll):vQK`/ZKmQljQ ۨE6d nQKmQlFng ٿx(Q ۨM6Eݨ FmFm!cpFml6ِ1FmFm!cpj:dcKM:]:]:ju:dCH%b~Flِ1:F:F!cٝ16 32Fl.H)m}LF]hF]l.ِ1xQu6buɆmԅ6m6 ׍nUۨm#SߵQOI$Sۨm#2}16lm6 ۨmSۨm#2QڨQۨO6OĨ/lԇ6m6 ׍nWۨm'2QڨQۨO6d g Qh@6; D/ 6` Ȇarpp̯(Flِ1h/@mрln4uF0a}x45}akbkjkfknkakike22eeeeeeeeeeeeeeeeee0 uqj(b½׸Td >5_Cukk\Cq2f>3nq qkH5NkpMP]fL1m46 hm4Rhm4"2F#lِ1~#5Rhm4&M21vcnhL6d n1Xm1јl`c\Fcl1ِ1 ^|ZzAޏbhm4pulZ|]x/ٺ//;0O:}WM_o.ߋn0{~ȭ}Iy?A3 Dԃ&4Q&4/csM9&jMp=hBd G4}D&4!2+Fl)٨׫gF&FS4Uhm4%2)M6bMɆhhJ6d IShFSlp8{L?G3fF3!cp͠fjͰfdCu6aȆF3hF3l9(1/kEhFsFs!cp͡jͱdC{a\m9ќlF g ˡ516c-9.G mj-dC6Z@-6Z`-ȆF X7Zm6Z (5M2F l%ȱUMbߢ%\Thm$2_kӖj-dCkӖpmRm%ђlF!g R^2FKlX^*.G%7Z~F+lِ1VF+VF+!c^E[m6Z (~2F+lKwEIM/E֍/66$2Ssʗj_b_ _~K//ɆA69c8ln{Wbhm|m&W\Zm Vhm&2ahhM6d >sJkFk!c16l_ol<69_WWdCu+X7R ln|Wj_a_ lᰑj)}Ck+l iҖm6ٺ6dl˺Fm цlFhFl ِ1xm6`mȆaF?grhm%;LnuF[l-ِ1)m6bmɆF[X7ڪm6ڒ ln댁Uhm#=/ιN1*lG6<|YF;lِ1vF;vF;!cpvjvdC6A6aZoahhO6d n=^m=ўl|NijdC࿅Whmt 2&/0A|iF!csjdC6:@6:`Ȇ蠶H6wh0Q<wTmt$2E;^FGl#ِ1#\vTmt$2vPGhFGl٨մWMNF'hF'lِ1 )6:aȆN褶 D6d nImљlPF7:~Fgl3ِ1x FgFg!c93S:mt6:  mtVmt!Et&Fa Em хlFhFl ِ1xF.F!cov6mt6y+.*攮pN骶J6d >tsJWFW!cp]j]dCu+Um+эlr I&馶 F6d nMmэl|NnjݰndCknF7nFwb?SntuFwl;ِ1FwFw!c֍jݱdC讶A6$lC=`Cmуlj=dC6z@=6z`=Ȇm6zm6z z^=FOFO!cp=j=dC6zB=6zb=Ɇ甞FOv1U˼e$o{Rea.ߋ5r^}'A/s4^3I量w\<=xZ}7M{fw7}a[7ɁAo(ZDo\zM{C6zc}FtVM01+m6 &P>F!cp}>j}>dCk>F>F_㞘}/\Um%2}a諶K6d n/Wm/їln6mp|ŕ}ҋ6[,o`hdl2elele[0pH(hX8xD$dT4t L,w_Q ~b맮qpG5N0 vp8kN5q558O]?h]cq~&Fa?_m?џl|m6 mWm'2C6cȆCyD<6`Ȇaac|H\Ǘ(lcِ1!cy1@mc1l(4(恰o1H6d ^7º1Pmc 1l@Lg@lc ِ1xm Tm "3ٻ1HԍAn Rm "2/q|/q lcِ1gg6aȆΜl Rm &eve nnb uc06cɆۃz{`lc0ِ12)6cɆ`d禎H3166Vln| j_c_ Zmklk!cp_C_m|m|C6-ƹN1?!ߨm|m|C6d ^7uooȆm|m| ِ1oo66U3db o Qm !2!wdm 6 C`/:Dmc1lhclc(Hok&PQ7º1Tmc(1l|N 甡jCdC 4Tmc(1l|21lvk8}}--ِ1x֍o66%2-ƷƷdCBߪm|m #vfc0 ajðadC0o Sm #27~c0lcِ1gàajðd~.):eplc8ِ1pp!c~c87m 6 ׍ppV&o!c}p_tlcِ12)#6F`#Ȇ䎀6Fm6F41FwFwFm6F  mTm$2#a1I6d ދ6Fm6F#v31F9eSFm6F #kG [Kc11K6d 5}Um%2ca1K6d N mUm#Gkyfnc11G6d n8n8q8!cqpc8lcِ1q8qxQM41Ƌ}p_txlc<ِ1:e<\Wm'2a1O6d >6ƫmp/su`1.\<&@&a+ݟ`>[7 {>׃te,r7Q?&DݟD2jq=Hd >WL"&EL`"1DhcDlcpxiMI+$I$!cgh3IjIdC6&A6&aȆ;'A6&aFf'$dbL}dGLVۘmL&2߷ -&mL6& a1Ymc21l mLVۘmL!sm8Ę"X7mL6 ׍)nLQۘmL!21ژ1ۘB6d nc 1Emc 1lkL9TdTlc*ِ1x1S6bSɆmL6mL6 ۘ mLUۘmL#c111 ֍ijӰidCs48LSۘmL#27~c4lcِ1^4hc4lc:وq;2cXLjӱdCuc:6cɆmL6mL6 iM6mL6f:ܾĘ! X7fm6f π{36f`3Ȇm̀6fm6f )3j3d#bZ \V+j+dӁ{ib{+^JJ!c17Vm6V X mTXm$2?[XXE6N,OJ`Jmclnuc*lcِ1U*U*!c*hc*lc5٨D71V9e5SVm6V X mVXm&2N>'YXM6d nc5Zmc5lQmGlG!c#?mmH6d nGhGɆ6~6Zx(`blVolU؊ml%2تJ6d /nU؊ml%2dyMm]m]mj۰mdC6m6!cu6N٦ F6d ^7A6mo߇}߇nO-cXvX~f22222222v2j;h;d;l;b;j;fs[<,clwipkv\S1xkvuێkvq2ո15RY;>qqN5NvX㶫kv33ِ1^j?c"O/sͿ a_6~6~!2n/j` h1 _߫Q __Ȇ/j`;2׆31v=pwlcِ1>OCmclfNiQ㯌؁m 2_S6vm6~%11~uCnKgrUl.f~Ulf]@bhmmJ6d ~WhW_Ƣo5Kab&)uoja ~7߰Ȇa&V ӏbhmmF6d ^7~6~Snqw,Y߿[;\q%I~W.\<%xٺɁ#nw`.ߋ'k<[;Qo|tq~ӳ}wxWq=I!cاO6MOPcدO6d ^7ú_mc?lf$>O6d ^7C6cT〰q8q8@6d ދ!c^3FȝZdC6@6`dchQsR†+᪶m p6\6\ W!cw\gj؆+ِ1 WhUm8H6:r~qP8mT8m$2q8q8H6d }06bɆm6m6c_eq31Cp!lِ1xq6aȆg>g>q8D6d nqHmqlTSkσ&aQ7úqXm0qlahal0ِ19aa!cpj#dDԼM#b8q8B6d >s#!cpG#jG#dC6@G6`GF vGQQ!cpGjGdC6BG6bGɆm6m6]\8&l6m6 Wwg Цz)Q c1!cpǠcjǰcdC߱<mS8m;/p76ܰ 7!c~ njn؆ِ1 a6ܰ 7!cgmnІچqlpjJ㸰q8q8N6d n8q\m8qlqhql8ِ1r8q8A6BE$O8!gOm6N 8mP8m 2SN9 lِ1 I]hiLN楚dc _9q8I6d n$qRm$qlIhIl$ِ1r8q8E6\Y78%NSjSdCaO簧6NaȆm6Nm6N ?=mR8m&}'Y,ii!c3IᙤjdC6NC6NcɆm6Nm6 Q&;چ;N6d >9]mp'2Ea/ꮶm Іچ;A6f#κa2z ˳j؆ِ1{%P6<Ȇj؆ِ1xmxmx`dcD 01<ޗ'T6<Ɇ<ޗچ'I6d nT6<ɆϹzBjv0/0^xx[XZ|,cs1?y˘ee,2v2h ][B,c˖0U5Xeeeeee,2v1!//L߽2gԕ^S}΋yG3/{=3O.y*楮b^*f.]d#ϸkY521|hcQ6|Ȇ8m`>dC6|  lÇl܆᣶mtpWm%2 mmbdC6| _ _l×l|N6|6|sdeTV51Ή9SΩm6Α 8mS8m#2q8q8G6d nqNmG6Q &mma~dC>? ?lÏl]w?چG6d N66dj؊J煍yy!cwVwVϫm6Γ ׍nW8m'2硍j ỢM ~?|_m'2mmcdC6  lßl܆?᯶m\ C\Dݸ !c~7.m\6. ۸m\P۸m\ 2hl#lTYnm ol#lFF@6d ^7l"XS۱gb\k؋p {Qm"qln\uEl"ِ1EE!c^"qQm"H6kË&FSm 66@!c1#G16@!c@h#Pm#"c.9$$AsAjAFِ1x/{ l#l,<m ׍ h#Hm#۸D6E*b\%o\R۸m\"2`ݸq ۸D6d ދ^%K%!c~qImL6~ۯL`a#V6ɆF0jF0ِ1s`6Xm#&2 mmc!dAמ=cM19%Dm#!2mm`!dC6Bl#l|N 6B6BPQa?+?01BsP6Tm#%2SBm 6B6BP!c mmb}QqYԍ˰n\V۸m\&2aݸq۸L6d װ6.cɆehel#ldL^va&FXÆ5lFF6d {|=Lm# #2mmaadCk0h#Lm# ۸B6(ĸ"X7m\6 \Q۸m\!2qڸq۸B6d n qEm ql<w4Ǜ Em\6 WaqUm*ql| {am\6 )WjWkd׽F\^S۸m\#2kw:m\6 ۸m\S۸m\#2q ڸq 'xFF8N6dT"S6±p!c9%)jF8ِ1ph#\m#nq894Lu"EOxjxqvi?gp]}ᄍxzvd3I=q=A|g U|z7D= ݿ 2#n> \n7j7p=A"d ^n@76n`7Vcb$ɒ=#7Ɇ{ry&Ml&ِ1> M tnMl&ِ1MuSm&ql7j7[dc';L[n܂u-lِ1-uKmqli7016U:a`bhm6n MoA6naƄjb6nC6ncɆml6ِ1r)6ncɆ mV۸mDAu]Ĉk6Pۈ6"ȆFjFِ1l#l߈6"6";db?41q֍;jw;dC6@w6`wȆX7m6 )w;jw6}qh" Gw-c,c-cQhC#Xeee,2g%X-cO-c,cI疱?,c/,c/-cZ^Y^[XZY[>|4I5}C#,1"3HL'R]"q'cv$\oGk\$qTd >E/R]"q'c/ָHu]QQL]L]l.ِ1˻]]!cٻpo]l.ِ1]=Q]fDݸ={=!cm6 F`otOmql7mS۸m'Y7L}h}l>ِ1}}!cpjdC݇6m6FU3o,P(a# ڈRۈ6Ȇ(oDmDaQdCsJS6(!c9% ڈRۈ6Fb jF4ِ1x݈u#Zm#ۈ&2Ea/mD ۈ66dDx!c֍jdCu6`Ȇm<6m<6:mBV21֍jdCu!6bɆCX7m<6 jGd5Sv11 GjGdC6A6aȆ{G}xD6d HmC6:~#8Ĩm`1dCsJ Sb6b!cp1FF C6d N6b6bdcLchcl1ِ1xx cc!c~17m<6 ׍cWߣD)ODm lhl ِ1''!c^ Dm K6tY-+F,jF,ِ1b᷃b6bX!c9%)jF,ِ1 mĪmbqdi qLn<mđ ׍8X76Ⰽ8!cuJ\ĩmaqdC6⠍88l#ltsa[ĈsJMPH6ȆF j Fِ1xl#lM66DQ{uMDQ7aHTH6Ɇ=d$m$bdC6DDl#lM66d8ckb<S؋>Uxm<%2x 7m<6 OaTm)lShS !gᕙ~Lǜ{~UZ3s^[ g{ ׃$).+K}D#w? ׃$2?k&$zDd 6Mk$$\H{$h#Im# xN6 x<a='yWl#<[\m9llsxsl9ِ1\6cɆ(m7HB@ FpPEZ(EBqw(^; EXI AkޞE繾:翹z~ʾYf={s/j/WdN ;Χ01^1_m6^ |'+W+!cpWjWdCWjq~jNS s-l&l#lFSg 1l#lFm$ H66Dqķ01#?6D!c}Dom$ M4Qm#H$2_$BjkŜ)6^cɆצkl5ِ1xx kk!cj7dcQɘsoę7L7!cpo7jo7dC7pFm ln6ިm6=BS21Ĝ$$l#lFm$ H66$!cpIFFL6fU#Yo$ddl#lF2m$ H66d!c5l2m%'bbu-o6boɆx xxK6d n-Vm-l|xxG6e-WS&;aNmlnu;lِ1x/6aȆ;h;l=٨xLˇM{h{l=ِ1{{!c5{}xO6d o6ޫm6>N ְlِ1Aml|NjdCsh aaou#2bsY-c1O˘e2cYRYR[-c@XXZXe,e,e,e,2bh eY2[Ʋ0)"O~Ÿ)?$ou _ 4ϩc?1xKj:q)})QSǀ_Ji&FJN)6Rb)Ɇm6Rm6R F)QoRm#%l|K mTHm y 11\yoz# lÅl܆ ᢶm \њEmp!2.Іچ J6{ߚp6\ W WlÕl܆+᪶m )pNqUp6\ɆmBj؆٠[-41D 7 7lÍl܆ᦶm p66ܰ 7!c9 pSp6ƥfnú᮶m z]mp'2mmcdCtІچ;A6ge&mxmx`dC*G*P6<Ȇmx@j؆ِ1mxmx`dckW~obx9)j؆'ِ1:OtSm$2 mxmxbdCuT6iS~2u / /lËlwA/چE6d n R6Ȇ᥶mx Ilbx 놷چ7M6d wV6ɆmxCj؆7ِ1 oh[m!#l@>j>؆ِ1x/{Q lÇl|}m`>dC6|   !/_:sl?zjW-.\ߋh<[{:_X|w~}Ńg|=Us_\螷S+sΆ#`᧾~ݗ1x=O?r cz끟Z~$BS6RZiU[#19i"7͍9Sm6R IȤRHm"2 OSm6R i6Rm6RRMjfbu#56RcɆFjX7Rm6R ׍԰nVHm&2j K71ðdñ$PKW6Ɇ^چ?O6d ^7aW6ɆmCjFkH pm ׍X76!ci@6!cpFFH6QϿ菾m ½@@l#lF)g -?m 664d#ʙi;wQHm!2i`HHC6d ^7Fm# l]bi4jid[%MbNI 甴jidCFZoUHm%2HHK6d ^7Bi6bAdj@!j!FFe&FFodFFFF!cuJFNɨH6d N)62bɆmd62md6BFSͫ41BEu#Tm#%2 mmbdC6BPPl#l|N 6B6BLdC# Ȥ D6d odF&LF&!c9%S2md62 f62md6F9=\900l#lnm 66°0!cpaFFlA,̰ȬL6d ދfhfFf!cuJfNɬL6d >d62md6l/M,Fh#Fl# ِ1xF,F!cpY,jY,dChh#Faa~xde[rXrZ",c,c-c(Xe,2kc嵌峌巌[JYJ[j\\NYE k\Vuˊk\Vq2qYa˪qYqJ5NQVeU׸e'cָƇlz219웳md6 5U6lF6!cp٠ljٰldC6A6aƓ&.FvX7md6 ]@g벫md6 mdWȎmd'2';]m#;N6nN;O&FnmcdCkp W6ɆmCjF8ِ1*Wpa +|qγu9H٫߭ˡ.\ߋi<[x\UGG:aw`.gr]껟~}Žgr{C}sz4Az9lN7S}szȩv׃@33TȉAN!c>"'Sm#'A6֔jt~#iÜ!Bm#ۈ 2+Z8c8l؎DmD`dCsE+"6"!cpFFl;I.##r>"F.l#ِ1xF.\F.!cp\j\dC}D.h#F.l#7Mκђ4r1I'#ȿ6rcɆm6rm6r v6rcɆm6rm6"F֚bm צjF$ِ1Hh#Rm#ۈ$2 mDmDbdCsJ$mDNٻĈr)nDvQjQFِ1~gRۈ6ȆmDAQjQFِ1EmD GB#ZS:%Zm#ۈ&2ѰnDmDcdC6hhl#l|N66QMg0ɍ!s6Qo\Ĩm`1dC6bl#l[pF C6d n#ڈQۈ6bF%jjbĊ FF,K6d XXXl#lF,mĒ FF,l>#y`ȣC6d ^7Gm#l| am6 mQȃmđGoebĉFFG6d n#ڈSۈ6ȆmAqjqFِ18h#Nm#K6\=aF^a4jydC딼pWm#/l {ѼjydCF^h#F^l#xv}M|nu#F>l#ِ1x6aȆOOɧG6d ^7A6aƝ3601򋺑֍jdCu#?6cɆpNɯO6d n#?_m#?Ql~͐&FQ7 Q@mQl(jdC6 @6 `ȆFFAq)}btܔdV m6 ]@sJAFA!cpjdC6 B6 biQHRRHmQlnuF!lِ1BF!BF!!cpBjdcg/}jbsJa8V(m&27 ~Fal0ِ1WaUXm0Ql( mV(m!=R("l6m6 (mQ(m!2_k"jE"dCuQDmQl .]UMFQhFQl(ِ1R)E6bEɆFQX7m6 ( mU(m#cʛs_s_6aȆm6m6 (mS(m#2Q (Q (N6&Fq:ԍ+-6cɆm6m6 a/Z\m8Ql(mW(m ]&F N))%6J`%Ȇm6Jm6J (mP(m 2QBmQl6pdQR%aQRm$QlFIhFIl$ِ1ưn+ (FIl$ِ1x( mT(i8ޗ9⡈xxsq7v&3IpMvow`..ϙxWx7aO<yzPyޝz\Q w|mZ :(vP ׃R@sE)8WR(A)!cQJmQlx KQZ( mV(m&2;J [*Q(M6d ( 6JcɆm6JmpexM/0wqeeeeeeeeeeeeXMX-XmXX]X=X}XاFƖ&f斱rvtSOu+k\q2?_/qep+C5N053abhk\\P1x?\ָ2Weƽ/QVeWVm,QljedCQYU(m%2+ mU(m#9ql97[NmQlnuF9lِ1o:JF9lِ1rF9rFyI1*~7*mT6* +v F!cQ֍ j dCuQAmQl, vK7*~FEl"ِ1̜a(FEl"ِ1xݨFEFE!c^"QQm"QlLk|c7*~F%lِ1xQ 6*aȆmT6*mT6* )Jjdq}xwPejdC TYm2QlFehFel2ِ1FeFWn21Q֍*jU*dCUUQۨmT!2ߨ7mT6 )U*jUd%%UuJ6̉!9WUۨmT%2_T딪jUdCU~UFU!cpUjUjdVdbTkjp [MmQlnTuF5lِ1R )6aȆ)ՠjjհd}Ĩ.):Ful:ِ1FuFu!cpաjձdC6C6c5FOW11j5j5dC6j@56j`5Ȇ7jj5dCsJ hF l301>s'pNDml!cO'j` ׍O`Dml!cO}m| Ql8^(0qQSք56jb5ɆFMX7jm6j ۨ mTۨm$2_ք6jm6jflbsJ-8Rۨm"2`ݨQ ۨE6d Z=6jaȆZF-ZFmF&Fma6Q[m6QlnԆuFml6ِ1xQ6jcɆmԆ6jm6ꐍg]fbsJ8Qۨm!23m6 ۨmQۨm!2E@u6`u1y uF]F]!cg{g{m6 }Յ{_u6buɆal01juzdcgw61 zjzdCsJ=8Sۨm#2QڨQۨG6d ދփ6m6꓍Ffb6C6cɆmԇ6m6 ۨmWۨm'2SC6c LG3h zmh@6d n@mрlFhFlِ1FvC^:U?[)E|ja.:ݝG}j{} OwS7alݧzАy>Lb577T4/c}pߢAC\i5{Z "zАDhm4Thm4"_h$F24Rhm4"2;#ڈl؈6Rhm4"2_6բF#lِ1E#hF#l1٨73=LFchFcl1ِ1ڴ1\6Vhm4&2ahhL6d ^7C6cMF.lb46@M6`MȆ7~oFl ِ1\M\M6`MȆFhFl)6Sv&FSa)Tm)єl|?m46 h m4Uhm4%2hhF6MfF3hF3lِ1xhF3fF3!c~7m46 MA6aFkJ541 ͡jͱdCp\m9ќlhjͱdCu9\m9тl|<&F aBmтlfaj-dCu-6Z`-ȆF hF l%xǁbLb%lhI6d Ni )-6Zb-Ɇ;[Ζj-dC딖FKv\FΎVxuuu}flbjf2eeeKXOX/XoXX_X?X@ `PaZQ4שxf|fƵ58Ը(wQָVƵ'cgZgZk\+\ZQ1xkk\+ukdTgLm3l3!cpAm|m|F6d ^7>u3ϰȆggjaɆi~.&Fgb9֙l^Ym3љl|N jdC6:C6:cɆltVmt!m E]`Em хlFhFl ِ1)]6`]Ȇ.F.FWt•g/M9ŬS ۆdWFW!cp]j]dC]FWFW!cp]j]nd{|OLnnjݰndC{_W7nF7!cmt6 mtSm|N6u6>'27>jc \ms !/߭C^e9[)B- sq/}$_|aw`.Hq⎻߮iOۺtq~}ؿ?g뾀 =׃tmij/^wcv=fwAw2_vt;91x"zНD|m讶A6dE  =6z`=Ȇm6zm6z =\Cmуl7FƗdcCF.F>F_Ѵ\Wך}F_F_!c֍j}dCkؾp Wm/їl|N mUm#'~pN駶G6d ^7Omяl|N~j~dCmSm'Ŷo_ԍnWm'2wPjdCsJ8Wm'2SC6cFT118m2l؊!c51@6d nc1@mc1l| ;1H6#/fb s@8 Tm $25Pmc 1l|N甁jdCuc 1Pmc 1lx]#Dc11D6d ^71Hmc1ln uc lcِ1A A`0Mbk01L6d Ӌ6wp8ȏbhm 6 ׍n Vm &2_ 6m 6ef1DC`/:Dmc1l|2Sm 6 ׍!n Qm !2?81J6.yw޵1T)C2Tmc(1l{Ċm 6 ׍n Um %2SBC6m_70,naiemck2626262626262elelelele L,l\<|B"aQܺn07 ָa7 ׸aTd 00uk0q2q`qpF5Na S׸axN68.o1N6d ppظsȏbhm 6 6cɆpdk?31F1֍j#dCp=Bmc1lhclcِ1H1҅Z#HH!cp#j#dCkpM5Rmc$1l|=1E6G0fECcSF9e(lcِ1Q(Q(!c~c7Fm6F mRm& cbuc46FcɆ{Ѱ1M6d nc41Zmc41l mVm!\#l6ƨm6Ɛ Ӎtc6`cȆ1pN1C6d ^7@c6`cFS/obu)fl,ٰmUm%2ca1K6d ދXX!cpcjc6r~~+e|]?g뾂5+=shJ}}sqvq/ٺ=J}Ͽ`s091GwO^wSq/cs1ǩ`91x11׃q$B}8hc8lc<4uyMb1Vj㱍dC}xX#ƫm6Ɠ a1^mc<1l|b<1^mc<1ln[h1Y7L1lO47^6&`ȆX7&mL6& `1Amc1l|s1Amc1l$=v|Ę(DX7&mL6& a9Qmc"1l|N甉jdC=DhcDlcxH1Ih|'$I$!c1 ֍IjIdC6&A6&aȆ!mLRۘmL&W[91Y[L6&cɆLgd&mL6& ۘ mLVۘmL&2S&C6&c_cwϜob|aɆa;Vl_m|m|M6d nkhkɆm| m|51l8⦋1Eԍ)nLQۘmL!2S`ݘ1ۘB6d nc 1Emc 1lߘmLQۘmL%}/Q51:m" vpN1ۘJ6d ^7º1Umc*1l| ;amL6 ׍T41SinLuc4lcِ1E tFf4lcِ1i4i4!c^t1Mmc1lx1]a1]mc:1l|NjӱdC6C6cɆEC6cߐ^%|bb|#7n| ِ1wrFml!ce16ڄZ`ߐ @ߨm|m m4)Wꁉ1BsSf M1ۘA6d ò  !c1֍j3dCuc1Cmc1l͵x&LQ7fº1Smc&1lfNiaۺ1ۘI6d 36fb3ɆLhcLlc(5cS7f6+gF֍YjYdC,Y,!cSfSfm6f SfA6faF9Q3.Eݘ ll!c9e6Sfm6f ŏ6fcɆm̆6fm6損hyĘ#7} nlcِ199!c~c7m6 )s9jsdß~61syjsdCkعp ;Wmc.1l|N 甹jsdC\hc\lcx_񃰉1O)2Omc1lñuc1l|qcۨA綘 ij= = 6` ȆpNYX@6d nc@mclhclc!8rLBhcBlc!ِ1v!\.TXm,$2XXH6d NYm,TXm,"s9c7~c"lcِ1)6aȆ{E]XD6d o,6m,YlyǷ%,c,c-c+,c+-c,c-ck,ck-c,c-c,c-c,c-c[,c[-c,c-c;,c;-c,c[v[XZY[jVZl:-5n1q5n1q-5n-5n18׸Ű-V׸Ÿ-'cָ^u~y2g뾅+o"0w;[-tv^:/{-y=w-/_2K%jKp=XBd Dz,QX!c%%R7G!MRhcRlc)ِ1RR!cRVZXJ6d VZ m,UXm|G6:VgM66#2wwdCu;X7SlwwjaƧoo3X&fb2lcِ12DzLmcl\{ej˰edC6A6aF/]gb,p\mc9lrhcrlc9ِ1xXrr!crhcrlc(h_+DX  !c9eSVm6V ?{>{Bmcl]mPXm$gWcXXI6d ދJJ!c^t%EWm6V X mTXm"i[)J)Jmcl":#JmclXUjUdC*hc*lc5pZX mVXm&2-3+(jlc5ِ1xX jj!c߂WC6Vckk55!c~3Æ5jk5dC؋QXm!2S@k6`kmF11֊pcZlc-ِ13$k3$k6bkɆm6֪m6֒ X mUXm#*\yNXmSXm#2:uj밍udC6A6aȆ䮃6֩m6֓Êv`bgr36cɆװvzlc=ِ1x/6cɆ{z؀obluc66`Ȇ~clcِ1R j dC66@66`§+T/bblt ӍdcL166bɆFX76ml66 S6uFF!c9e#Qmc#lL^IԍMnlR؄ml"2`ؤ D6d ol&M&!c=M&MfAoZ216uٺjdCff!c~c376ml66 S6C66c}/ 71u[ٺ-j[-dC0b8lҟU}Ckc l|N-j[-dChclc+hӞAa&V1lsVV!caaml6  mlU؊ml%2SBF5?Mmb_tݦ F6d ދn6m6!c9eSml6 )۠mj۰dX_71֍j۱dCuc;6cɆ{ݮN6d nc;]mc;lЯ&acCmcl||3ߡA6d >s!cp;j;d#k)l6vm6v );ᜲSmc'l|k'کI6d ދ6vm6v g~{b]pKmclٞ]ٞ]j]dC.oR؅m"2 إnq8{ gO{}]ۿOϙaov|{8k|ᄍ?{\v= >5vb7+vn\vݗ1\vz EV؍n!c>b7[mc7l\{/lcXk=j{=dC6@{6`{Ȇ{clcِ1hclc/phc>lcِ1)6aȆ>hc>lc?XRq/~X7m6 i}~~!c9e?Sm6 ׍~vltEnǻ8Xq2eeGaQ1q I)iY9yOK˖-cW,cW-cXƮYƮ[nXnZ~ոCw?c:8P׸'cwָw׸Td ^w@]wjkXk<$vq稉qPCrPm ql7:{jdC{AA!cpjȆ}?ِ16~6~ 2_ST?mm@6d 7mql<p{㐳n 6aȆm6m6 5!C!!c}C!CƏdfFŶ?#?mmH6d [6~6~$27~Əj?b? ׍6~6y Ygbv7u0pܒ6cɆY= Y=q8L6d {a{aa!cpj#d#M#nulِ1E tlِ1##!c9qDmql;eqGFȣ˺qTm(ql| {am6 SuQQ!cpGjGcd޹&1q oS8m#21cjǰcdCpH\ia]Ӟu(1lِ1qLmql$ 鼧t8H%i'{]\֍jDZdCpr\m8ql|rSm6 8mW8m wlp?8!+u>itBmqllj;A6lS  !c~7Nm6N <mP8m$ 4cbt0grOv'6Nb'ɆIX7Nm6N 8 mT8m$2_6Nm6NŧjbSprJmqlna)S)!c9SNm6N 8mR8m&;oobioV8m&2_jdC6NC6NcɆm6Nm6ΐ~̺K7~l ِ133!c}3p_l ِ1 qFm ql̸){WXÞkسjgdC{gYY!cq֍jgdC딳Y91*U ߴ71 砍sj簍sdCu6aȆ9X7Ωm6Α ׍s9syѫ7 -Myx~yl<ِ1yy!cp硍j籍dC6C6cF[Gĸ ߸q۸@6d ^7.qAmql j dC�m\P۸`8{_tyĜ $?Eda..ٺ^Oj?{{ v?Oo..?zpyٿڞj^л(-.}׃te ^.zpQ"Ɂ{̋PE\$2smZ@6.m\6.QҞ`b\=%X.m\6. w^5%lِ1K%K%!cqImqldmIR&eQ7.úqYm2qln\uel2ِ1xy6.cɆehelg?ELE֍6~6~&2g܃s={=!c~=l>p| X܇jdC}؋W۸m'2>|}l>ِ1:>q_m>l'lM9ȆU5x~lِ1@mlnfD?l ِ1 \|LmhҮį& AmmE6d n/h/Ȇצ_ja h$ xN6Rcb<soxA6]>ܭ0ㅨ/`xxA6d nBml h lِ1ưZ/|:]_"G16^`/Fnm/E//6^b/Ɇm6^m6^ )/Rm%lfRaZ/Wd#Co{Ĝ )6^aȆyy xE6d ^7^JmlW7Wj1|F ]Ma#HPH6Ȇ%u j Fِ1h#Am#H 2Cm$W~(N'm$bdCp#Qm#H$2J{_jF"ِ1)DDl5y _41^^5E_m6^ { ֽVxm&2xxM6d ^7^C6^co!wooooo6`oȆX7ިm6ސ o`/Fm l=o7jo$qVIbNIsJFD6d $$$l#ln$m$ += HRH6OWnb$;{Q_2ٰKVH6Ɇװp m$ ׍dX76d!c~#HVH6ޒo/|ZVoaVm-l{_oުm6ޒ Su[[!c}6ުm6ޑ )eb}現/Nmlnu;lِ1xx;w;!c~Nml sݪ^싾6cɆ$gޫm6ޓ -xWxm'2SC6cLae@6d N)6>`Ȇ{@6d ދ~6>m|IxX\-cn1w˘e2eX|-c~TԖ1Xe,222dKgKo` X2ZB-c,ca̖,}?ßWs6RhNI/n{7Sǀ5.Eb9E1`Kƥ@5N)'/&HR}j)dC6RB)6Rb)Ɇm6Rm6R F)j) sq0%.ovQp6\Ȇ{#m`.dC6\  lÅln@.j.؆+وq$g01\Ŝ W WlÕlj؆+ِ1{\{\6\ W!cWhUmp# [D 01>[ڧsSp6Ȇmu @϶mandCu 7 7lÍl|/ pSppr0߭gapWp0w;[{ wwsqOo^y=Ĺᄏ88{7wlp5<}>=@ϞyxzAd 7ExExzA"d Gx@j؆'xX%χlP OczSm$2_x᩶mx y7O OlÓl6<6< /qexJ$^􂳆چE6d / /lËl܆᥶mx M / /lÛl] [66 o!c 놷چ7M6d cz[m&2 mxmxc>dcw=41|Ĝ lÇl܆᣶m >Q6|Ȇ>ІچK68'&Xµچ/K6d 6kS_ _l×l܆/᫶m 6|6| ?1&S⧶m ~S6Ȇ?8ma~dC6 ? ?l#곗LTb aSm6R ׍TnRHm"2`H HE6d n#Jm#l9gMbNI jdCu#56RcɆFjX7Rm6R j &QL 19_m'2{_j؆?ِ1 h_m'2mmcd.SN P6ȆFjFِ1h#@m# 2??mm`d;Gg61Ŝ@@l#l $'Pm#$27am BjFww.m&Fыh4F!c4p#Fl# ِ1h/Fm# l|< Fm# ldyMnu#FZl#-ِ1ٺl]ZFZ!c֍jidC6Bi6bAd,r  l#lnm 66 !c^4R6ґkN`/Nm#lma(F:l#ِ1)6aȆtF:tFzxaɘsM9ŜMO6zw&F&"Kzf&šC֍LjLdC62A62aȆ):%F&l#ِ1 Ȥ #}ceyF76°0!c^4 ajaFِ1:% S6°0!cpaFF݆pLfs&iXfh$e&%cfvn^mđ FSۈ6ȆFqjqFِ18h#Nm#K6vLbN 甼jydCg³y6byɆᰑ"ŭ&FB=mZydCF^h#F^l#ȵxM|N#mV4)6aȆ7|j|dC0u3Fps小bhm6 ׍|F>|F~zwMjdCkp _m#?ldcXYg ΊTȏm'2jdcuF+(`FۊşFF!cpjdC0u3Zbbhm6 ׍FFAkea(Q(H6d n QPm Qlnqp؈/G16 bɆm6 m6 F:޵jbrSL(D6FBEiR(m"2_BjBdC0u3FTGQ BF!!cBF!BFaӞAaMb_0-Q(L6d n0QXm0Qlnwp0ȍ>Q(L6d n0QXm݆W!o+Q.\܍]uEQD݁Vy}Zڻ_~}ؿ?g{^D}ϋzPniFlِ1̽~_8Y_16` Ȇ硁Flِ1FFCfZP􍆰o4Thm4$2 ahhH6d ~QCxQCFC!cvChFClٸwaۀHhhD6d 7Hmшl|MiהFjFdC6A6a}X̢,Xm1јlٺٺjdCkJc4Vhm4&2]1Xm1N65>-p}w wlÝlZ;㮶m S>]mp'2pWp6#gb4kJ4Qhm4!2YS16l:jhB6d 7Dm фl]M&jM x@qùO1x ۃKj؆ِ1wA lÃl|چA6d 7<  l)٘2e9&FS7¾Tm)єlo8c8ljhJ6d LnSLnSFS!c=lShFSl٠7 .eF߻l hF6d >o4F3fF3!c5\Sm46 )͠fjͰdoG\Mo4}Fsl9ِ15ysFs!c59\Sm46 Fs؆']K'5L O 7<Ɇm詶mx Sm$2 mxmxbdC'᩶m  db}-6Z`-ȆF 7Zm6Z hmPhm 2-j-d~֐˘-׾%ٸy7Zm6Z h mThm$2hhI6d ~]%Rm%E6*:b&G ޣ楶mx 66 /!cp^ІچE6d 7 / / C^߭h&ٺVpwJ-]9xrvp?uൌVjSs[ DZ~+7O׳u9o>p?sqw/K2 oξpov791u ox[-o!c~ mxmxcƇ1繘}}6ZcɆ׊phhM6d ~ݢ56ZcɆCk mVhm/)#8Gm`>dC}  lÇl|sچC6d 7|  l×l\O3>+~{mbdC6| _ _l×l܆/᫶m  _hWmhC6-jhhC6d n Fm цl|Miה6jm6dC} Fm іl8CW&F[q_F[x_F[F[!cy-7ڪm6ڒ oUhm%2nhhG6Vf=SاvjvdC}6aȆF;7کm6ڑ vF;vF{13fLbmgjdC6C6cɆF{l=ِ1h#cFy76 ?!c5)~j~؆ِ1 ?hOm#2~ІچO6ӷL 1oy_m'2omcdCk?\S6 !cyW6:.n, F7:mt6: otPmt 2`蠶@6d 7:@6:`dMN>&FE,m #6Ȇm@jFِ1h#@m#$:bb5%)jF ِ1x}#Pm#$2=lF H6d n#T6FV}# l#l LRFD6d n#R6Ȇ h#Hm#H6\z3N7:yFGl#ِ1,΢6:bɆalrHwJZdC6:B6:ma~`{[ ns tλx>'.wv;~wٗ1x?Awt'2_+õZDwϘݡjݱd>ib6z@=6z`=Ȇm6zm6z ?zGF!cihFl#lxFW#BpՈPۈ6"ȆpPۈ6"ȆOOmD h#Bm#ۈ$5^ [lbD{#jF$ِ14M#6"H!c띑zgF$I6d n#ڈTۈ6F/RobD5% )QjQFِ16(!cy# QjQFِ1mDmDa=F{LFOhFOl'ِ1)=6zb=Ɇm6zm6z  mTm")LKmRm"2_Sz5F/lِ1^F/^F/!cp^jdKFoFo!c}JoO魶M6d n7[m7ћl| mVm!?r#)}>Flِ1)}6`}ȆwWm6 _mQm%n_+F_7m6 oUm%2ߧj}dC6B}6bdcV216a6h!cpFF4M6d D5%Zm#ۈ&2 mDmDc1dc㞇51bD߈}#Fm#ۈ!2F Ő mĐ ۈ6b6b!cWclX_31 ~j~dC}6aȆ~p觶G6d >6m6)_/W_mWm'2evLm'27yFl?ِ1诶ۈ%CĈXOUۈ6bɆ)pmĒ )pMUۈ6bɆF,m QKL 7m 6 \ rpp|aWm 2vvlcِ1FYl:#N<ISۈ6ȆFqjqFِ188l#lhm $-oJnb 6B6bɆII1H6d k@@!c}@hc@lc٨Ԁ) k A !c1AjAdCk Rm "2EA6aF21 jdC6C6cɆ`7m 6  m Vm !y;ta!d$1Dmc1lx}clcِ1x!!c5e1Dmc1ly&P7¾1Tmc(1lPhcPlc(ِ1x PP!c11n{?Ff=pKm6Re,1XKm6R`M&Yj-)TKm6RaʹfYj-9ڗ\K+Km6R[`y?0qoWo?aٺaٺa7 ad > 0u{0q2oa7 ad ~-fq=n^ƽe^ξbbċ/jF<ِ1׿xxl#lF<mē ۈ666y w>[W!G|nxfj"lp# ;0O}R;?~ӲݺWs-#0F~0?te F~0B`#ȁP 2G@#6F`#Ɩ=>bbt#F#6έ+;HH!cGGm6F #Z1Rmc$1lHhcHlcX!^c-x-x(lcِ1Q(Q(!ck,5QjQdC錂6Fm6F Rk1e40]T1M6d nc41Zmc41l|M הjdC3hhchl#lH$t.Ę,֔pM1ۘL6d >oLdd!cpjdC6&C6&cSĚE 41S)jS)dC0616ܐaϗ%Ckc 1l|ޘ)jS)dC%N6mL6 BZ1U)S2Umc*1l|;amL6 S1Umc*1loL6mL6l,ebL6A6aȆ1 ۘF6d ~]t.:Mmc1l4hc4lc:q1])2]mc:1l|2SmL6 oLWۘmL'21ژ1ۘA6V.߃) ac1Cmc1l|ޘj3dC6f@36f`3Ȇה L1Q&L̄kLL!cyc&7fm6f ۘ mTۘm$2EgB36fb=cbreN,a 9Kmc1l)D t]t,lcِ1vRۘm"21 ژ1 ۘM6y9.™Ś2)6fcɆl7fm6f ٰoVۘm&21ژ1ۘC6xĘ#֔9pM1ۘC6d >΁9!c19js9dC6@s6`_6{W9_:76${&}tƗƗdCEETl|%~%%ِ16Ɨj_bsF~Kibk\Uۘm%2_S5e\lc.ِ1;wUۘm%2v.1Wmc݆ᘯ$O4FLW$¶eJ-+s<_$}|v݁9x*vZgg+~Ӳgv><_Ẉs^8"6nYYCo`?>p?Gg_k1߬"1ژ1ۘoV_mWۘm, OsxzX D@mclo,}clcِ1c,PXm, 2 j 6}{_4ozqc,ŖKmRR[nVZj,ՖKmR[om6Zj,͖ڷKmRRnԾvZj,ݖ{_R5qvTP Pz-{BR1 =n!q B{B-"ǜz=HHmcl|[׿EjEdC6A6aȆ,6m,6>)Lbm,6 Űo,VXm,&2XXL6d >7/6m,6o"~G18^B6R]y>|%!cpK%jK%dC6@K6`KȆhclc)٘Wy_KEX RR!c5e)\Sm,6 X m,UXm,%2KjKedc|w+719 s2aYt2lcِ1e2e2!cpˠej˰edC6A6aߐee߈}7p77dC龁QlZ7Z7j`ߐ Fmlc9~IM{3A,WXm,'2F -'mrlc9ِ1xXrr!cpˡj˱d/經I+kJltř+6V`+ȆהpMYXA6d 7VBmcl hc lc%p\H{X)֔pMYXI6d c##eϓ+6Vb+ɆJ7Vm6V J*Q}[&*~U06VaȆ*7Vm6V XmRXm"2î6Vm6V^c7Vycjlc5ِ1 g 'KVm6V X mVXm&2j5d#iX#o7֨m6֐ ?>Fmc l|X5jk5dC࿧6֨m6֒U\eb6Bk6bkɆ獵pXXK6d 7¾Vmc-lo6֪m6֑mjb6A6aȆo7֩m6֑ XmSXm#2XXO6n-@ &zac=^mc=lj뱍dC6C6cɆm6֫m66W vlcِ1>eܧlP؀ml 2ؠ@6d ~}cAmcls(F76ml66 Ϣ,Qmc#l|gэjdC66B66bVwM&M&!cpMjMdC}c66aȆml66ml66c7ܸ?,ll66ml66 Ϣ,Ymc3lfhcflc3ِ1fvu>[W.ٺoZķvz[8w~v݁9xg[~Ӳo9V}ο` j:>"ޢ>[p?Bg_` [~l"El` 1ZآJ6 VU[ZUmc+l|ojC3V8cnU؊ml%2تF6#~4&઱Mmcl|o Mml6 mlS؆ml#2 ئ lx~ֽXwSlo|wjaߑ )5;ﰍȆm|m|lԦ_LbMהj۱dC}c;6cɆv7ml6 Ȗhb 6c;F\3Ϥ 71vg vg vm6v Ϣ;,Cmcl=;{vm6v _ mP؁m|O6x_;(^ܳ=g{ﱍɆהdCkpM^m{l{!c5{h{ﱍd#͸;F$/A;ƮdlNN!cp;j;dC6vB;6vb;Ɇm6vm6vVļ 6vaȆ]pإ E6d k.].!cp]jd˩&n~dyk˾[mc7lwwjdCn8V؍m&2nhcnlc8WIML=>=>=j{=dCkQ؃m!2{`أC6d 7@{6m8sh#xgG={-}~K퀥vRR;dԎXjG-cڏOqKgK턥vR;eXjg-_,syK킥vRd]ԮXjW-k$R!q-9%w%w%{\"qd l]"|.QqK'c9͉{\"8aKTD%[pT-c¹y^lc/ِ1ܼ{6b{Ɇm6m6  mU؋m#&>acOmclfnpp]'ВG6d >탳>}>!chOmclLϕmr&~~~~!cy?m6 oW؏m'2jdcwӯ71qjdC߭;[w@mqlm6 {v8q8H6tY㠰q8q8H6d 7¾qPm qlZAx-Al ِ1x8mT8m@6B.9dC0F3F#6έ[_16~6~ 27~j?`? Aml٠7 d11 CjCdC}6aȆCp8q8D6d nqHmqlV 4qX8 mV8m&2{jdC6C6cɆm6m6 QKLab#prDmql^#^#jG#dC8oQ8m!2q8q8J6>_~ϣGa8q8J6d 7¾qTm(qlo}Ql(ِ1>(qTm(qld^n&1aqLmql1h1lِ1,z ΢6aȆ}6m6~$4<31~3QmGlG!c5G##ِ16~6~$2_S~6~TnOg&g̳u?~R.&%7.qImqlf ppذ}V%lِ1K%K%!cpKjdWkb\6.C6.cɆp޸q۸L6d ~}2qYm2qlehel ٸxp㊸g gl ِ13IW3IW6`WȆ7m\6 ۸m\Q۸m\%s;oeb\}*W6bWɆ獫p޸q۸J6d 7¾qUm*ql| m\U۸m\#<&Ř,z ΢6aȆq ۸F6d ,5,5k5!cq ڸqny?0}?u{Xj-O\f$=͟u]uu{uq2_ﺺ]=:8Flt]wz׿]WxA6(OqC7wCmqlj7dC6n@76n`7ȆCmP۸m$w؆7Ş&ST۸m$2o߄j7dC6nB76nb7Ɇm܄6nm6nj`bk-R۸m"2q ڸq ۸E6d nqKmql^[-[mѭQG|MbM הjdCkmV۸m&2o߆jdC߆6nm6tqGظmQ۸m!2EYlِ1x߸;!c5qGm݆!_֕Itu {o;^F^U-Ws|_ v9xg~w>Ͼ9xZv[+<翪ܥs^=Obn]~pW}~pξ].91gwjwq?K"d Bw6bȆ#jijuu6aȆg{pƼq۸G6d V܃k={=!ck{jd#fW11qjdC6C6cɆm܇6m6 ۸mW۸m< )N9Ud#d㜁^jdCkWxm<'2_S5sl9ِ1ss!ck_ϡjϱd#c÷~31^j/dCPxm 2_S^5 lِ1xlxV|C?`Cml!c=pdC}7Plj`/F^ǜjb}%/6^b/ɆaF3Æj/dC6^B/6^b/Ɇ獗K+QzeΛ;^wRxm"27^y+lِ1W+W+!c x xM6V'Mעo}kl5ِ16^cɆpxxM6d >6^m6ސ4y:fb6@o6`oȆ7pxxC6d n Fm l77[ֲo[[!c }xK6d k[[!cg Bo6b %emb6A6aȆwpxxG6d 7Nml|MymSxm'2l{9)Ɇ{l=ِ15{{!c77ޫm6ޓ SC6c]`b|}6>`Ȇ7>m|6> o|Pm| 2ߧ|6>m|6>-_ [eb|׾>k_6>bɆm|6>m|6> m|Tm|$2j6|r>T:x0$}">E|0OL'~|R;dw`}}'d?i>t΃sI}?Ϲ/ޗM/}K#RRKnRZj,ԖZK-RKoe2Zj,̖RjeԲ[j9,Z.K-Rk[j[j\LIkB' yN!:y׵$.h]SǀZT$.hSǀZ׵$.c')~МgI]{ݓ'UHm$%2+%uAk]RFR!ck,I]ЪTm#)l[Rh#FRl#!^# /1 /1F2l#ِ1dF2dF2!cy8 m$6 A6a.ggdC?sA?S lo|gja Ϡ6>6Vg;>F1߂߂m$6 ἑ\m#9lFrh#Frl#9ِ1xHm$WHm ?\2r9aS )6R`)ȆהpMIHA6d >h F !cY4Bm#lT# ]mIHI6d n#%Rm#%lFJh#FJl#%ِ1o:)j)Td#41R֥rA߭K HE6d kJ*TF*!cY4ESm6R TF*TFj%&Fj1hjFj!cY45ESm6R ἑZm#5l|H mVHm!# Nn4ji4dCHF4d6QHm!2_S5%Fl# ِ1xHmQHm%y;iEH FZFZ!cjidCuAUHm%2-@6Ҫm6ґyTjcbsJNm#l)HlFtj鰍tdCF:8oSHm#2頍tj鰍d㨯&FzOI)6cɆFz7ҫm6ғ )ᚒ^m#=l|HmWHmd '| }e׾2md62 g T3md62  odPȀmd 2f62md62/62bɆod72md62 S2}JFFF!cȨD6f2]-# Ȥ D6d l]&l]&LF&!cpLjLdC࿧d62md6257Ϛż62cɆFf72md62  mdVȌmd&2E3C62c.dlby.j.؆ ِ1wr]\wr]6\ !cp.Іچ B6d >o@.j.FyUo&FdkJ,F!c}JOɢB6d O)Y6`YȆ,F,FVxU􍬰odUȊmd%2_S5%FVl#+ِ1FVFV!cgBY6bDF6lF6!cڲڲmd6 mdSȆmd#2٠ljٰdRWf51 ١jٱdC}#;6cɆpȮN6d >f6md6r“b|LFh#Fl#ِ1FF!cj9dChh#Fl#'p9㻉)MFNh#FNl#'ِ1)96rb9Ɇm6rm6r FNvr?ױ=ƃy.K-"]9x$hOK ݁9x*y]uϥ>g<-;xfrsK}s~&~ 7h#F>l#?h_vF~F~!cjdC6C6cɆm6m6>'&jc \msls!cpCm|m|N6d nshsϱd#CRاjdCkJP(m 27 yFlِ1}j69/q=,–ZKVR+nJZj,ҖZKVR+oU*Zj_Xj,ʖZKVRnհjZj,ږZKVRs ߳1N3232= q|+׿Wd WP Wz .{\Au+׿BdTҌ31   m6 WHmQlF!hF!lِ1lT(Q(L66 hQX°oV(m&2Q(Q(L6d >7ssaFa!cpj"dcgN41m6 )ERDmQlFhFlِ1u"F"FQv𺭡&FQbn-J6l7U(m%2n]QݺjEdCkJQU(m%2EjEbdTujcb}6aȆY-.Q (F6d 7QLmQlF1hF1l8(]kڱ&FqLnqLnqFq!cwAߑ)Q(N6d ~YqxYqFq!cC6c%F5j%5n F !cYEKm6J oP(m 2Q(Q(I6_~ϣQRaK=lIFI!cAWT(m$2%a(Q(I6d 6Jm6J_QJRoR(m"2ߧRjRdC6JA6JaȆ)RjdcIҝ)d31JY4EKm6J @g {WzOY_16JcɆ)>Fil4ِ1x( mV(m1>eJQ(Q(cޛ-by 7ʨm6ʘf|(2je2"Q(Q(K6(|nQV)eRVm,Ql|M) הjedC6Be6beɆO) mU(m3u('l6ʩm6ʙߊF9x}F9lyהrpM)Q(g+byQNmQ޼qW5Q(Q(oq*b5<\Sʫm6ʛw|-gj屍"_SC6cƻZ|Ļ +wVPۨmT 2j- j dCkJTPۨmT 2QڨQۨhUm@AaߨQۨhU(bQj]"aߨQۨhU(bpj6y}b[W2\2}x}]9xw뾀sj_bu_a?iI<8:_T2)jC`?>p?d%&b~P Jjp?d%&b~P!"4oB+VD%*wZx%hF%l2وI67u&Feqݢ2nQYm2Ql| jdCsDe8GTVۨmT&2QڨQۨb ]t)&Fa QEm QżH-Fly'U޴Fly'*F*FUޗ_=Ĩ*lT6mT6EUxݢFUlyFU7mT6EUhFUl|Q ڨQ ۨF6d 7QMmQl|Q N6aȆmT6mT6'G7XĨ.lT6mT6 ۨmTWۨmT'2aߨQۨN6d n:Q]m:QlTɩ&F aQCmQlF hF lِ1F F !cgj@56j`5ƚ;21j=lMQۨI6d 56jb5ɆgњpQۨI6d >ք6jm6jq:=o`bsՂWjm6j ۨmRۨm"27jyF-lِ1xߨmRۨm&_\$$6jcɆmԆ6jm6j ۨ mVۨm&2QڨQۨC6|hI7yFlِ1Qu6`uȆmԁ6m6 )u:jud]31uA%QۨK6d ;u6buɆgѺpQۨK6d n.QWm.Ql$; &F=1փh=zF=!cQzjzdC}6aȆmԃ6m6\9Lbb:ms]Ɇ\W WlÕl{_{_j؆+ِ1 WhUmp%2 mmmh##xgG}{<,ZCKRsԚXjZSKRZXj--5/Km|,5_KRkg,5K`ZjAZGaS{tQwџS}Շ_}u{\}q2SՇ{Wd >ՇQ}u{\}q2SՇ=XP왹nι٬nd\ چF6d l|Mm p#2mmandCᦶm4  `b4} 6` Ȇpnnh@6d } 6` ȆFhFl!({MkA F[z.#hhH6d l]Cl]CFC!c!m46 _mm4Thm4"&F#7Hmшlo4}F#lِ1)6aȆהFF#FFc;yی6FcFc!cY1Em46 ưo4Vhm4&2_SC6cdUy.L wۏ;]mp'2omcdC6ܡ w wlÝloCjFqn2/gM&F&F!c16N9`tؿbhm46 hm4Qhm4!2h 8C.P6<Ȇxmx`dC7<6< !cpІچєl3h*l46m46 h m4Uhm4%2hhJ6d ~bShFS C^֕͜H4̳u͠fj"l]38[4S;hfw`5w5Sfop?hNkc:zE?h~soAs:21C~М|hjq?hN"d hm4Whmxr hkbx Іچ'I6d nT6<ɆmxBj؆'ِ1 mxmxb-F+{751Z{V[{V[m6Z hmPhm 2hhA6d nBmђlc3fKFK!c{[)FKl%ِ1FK؆8o<L /x5Km "2^oxmxa^dC/R6ȆmxA^j^F+xB&F+q-Jmъlo}F+lِ1VF+VF+!cYJmM6Fy+-wzj؆7ِ1ymo olÛlj؆7ِ1 oh[mhM6~ l~8Z)Zm5њlo}Fkl5ِ1xh FkFk!cpj Ѡ޽ k>†᣶m >pQ6|Ȇ)>p⣶m 6|6| _Q-eb Іچ/K6d _ _ _l×l܆/᫶m ϢІچ/цl|*euhhC6d kJ6F!c5 \Sڨm6ڐ hmQhm%W'smF[F[!cjmdC7m6bmɆCk mUhm#`b{vpNmюlo}F;lِ1xhF;vF;!cpvjdcnyl71ڋ=l{mhO6d l]{l]{F{!cjdCh{hF{lÏl _kL ?5Om#2ߧ}چG6d nS6ȆmA~j~؆?٠71ųY~ lßlfrpBJ+ֆ?O6d nW6Ɇh_m@6LbjdCF8otPmt 27:yFlِ1xmtPm?g[F.jFِ13Il#lIp516ªS6ȆI 66@lCsbFF H6d >oy#Pm#$2}mbdC7@@l#l,|͐&FsM1 }ٰ=|m _76 !c5%)AjAFِ1mmaݙhbtFG8otTmt$2a訶H6d 7:¾Qm#ёlot6:mt #R :YjaZgKR ԺYj-ZiEYj=-^ZoKRb,~ZK-R`Yj-A`Km6~`qR>9SKMv%s| V`ォqS1 ׿`u =.zT{\0^BFDlܲ M/Dm#!2ovFB6d l#lFmt* m ߣ Q U6BɆgP8mbdCQ(jxȫٺ≦Wg:nI-]9xrv𿞭{D'Nv9uWi;~'7O׳u9>p?sxny 05~{̥h9G~ate VAaja0"p?#2mmaƯf41:93 6:cɆgp쬶L6d >cv3fgFg!c93Ym3хlX>jIRs06=>l[袶B6d n Em хlFhFl ِ1xmtQmt%Kl{U<[>[Um+ѕl/]{_mt6  mtUmt%21B]6bd#~fwMpN8M'\m#'2omcdCȄgd6±p!cFF8эlt&np覶 F6d >vh7nF7!c njݰndCF7hF7l;٨7?EFwFw!cpݡjݱdCp]m;ѝlFwhFwlpyMo}Flِ1)=6z`=Ȇ=jPm 2衶ۈ "~dbDFFA6d n#ڈPۈ6"ȆmD@jFِ1h#Bm#ۈ$Ĉ}#HHl#ldz3 #W Hl#lF$mD ۈ6"6"(]711(h#Jm# ۈ"2F v%l.DmDaQdCF76(!cpQFFѓlڔ&FOLOLOFO!c5%#e-=6zb=Ɇm6zm6z _ mTm"Eg2%}׾zm6z Sz}J/^F/!c{{m6z mRm&> Mmb킾[m7ћlo9cSm&2a譶M6d 6zm6/Rfb>pGmчl>>j}>dC6@}6`}ȆFhFl/Wmuv&F_aF_Qȫs?ؾj}dC0kJ3em%2諶K6d 7B}6bdo5431E߈}#Zm#ۈ&2ѰoDmDcdC{hVۈ6Ɇ@66AokbĈ{{b=1j1F ِ131l#lomĐ h#Fm#G6V| &F?7Omяlh?x]F?lِ1omom6aȆ@6m6nwN61; ۟l`m6 #J'tF!cpjdCkJhFl#lo~wKv#VX7b6bX!c.csjF,ِ1 XXl#loBj^,&&qk5@mc1l|MהjdC8o Pm 211ۈ#t'lAqjqFِ1u8x]4Nm#ۈ#2.ƩmaqdCkJm $Wccm m@lc ِ1@@!c1jdC6B6m8|&X13I1H-b]9xrvI׏AjSv>4Ng웃9 9`:){,fV /c~0jq?Ld  E V`!c9"3F]WCkc01l*u,!cX+blcِ19!jC!dCkV Qm !2a#{p16`Cnb }c(C6bCɆP7m 6  m Um %2acl*chm pe{nǻ8Yo FXj#-QhK-RcYj- DKm6RbMԦYj-LKm6Rc}i͵ԾYj_[j- ׁKa7 a7 ad 7L7z>z =n8ܥ3{0œ{/fx8ūmcdC6⡍xxl#l|_F<O6d n#ڈWۈ6\}R,fb 6C6cɆpn1N6d T6cɆm 6m 6FLOeb33Pm 2#`1A6d 7F1Bmc1l1j#dl&H sRF m#6Fb#ɆB@Tm$211I6d  #6Fb恎;@FwRm"2_SF5e(lcِ12 )6FaȆgQjdcAULb jdCHKɆm4Zmc41lo}chlc4ِ1hFE01h#Am#H 2g5޳m$ 76!cY4HPH6Ɛ'|lhb8Qm!21jc1dC}c c6`cjN);HNN)-ݝBH $!I(! ^zϾk}Yc{~Gn!c-1691ۘC6?ab{_s9!cyc7m6 ۘmQۘm!2٨aüZsd#uCLΞb%?s6bsɆu u1ۘK6d Sž2Wmc.1l|ޘ {\oxyCm 27<ᡶmx  hCmXG6I\bVcXXG6d 3otqpp J;[/bhm6֑ XmSXm#2u:uvÜg߇FOw<,k-k,kޖ5˚ememeϲoY mZֶXֶZւ,k,k-kZe-̲Ӳ˲۲nYEZ֢,kіxRs#Ni8y kyI5N?Ou5Γjk'qk'8?OX<5?/iF>^†᥶mx ?{=R6ȆmxA^j^؆ِ1o{A^j^zqOLzhczlc=ِ15zxM^mc=lj=ZXO6d ^7C6cȆc#9Mc7ml66 ׍ nlP؀ml 2ߧ6ml66 ׍  ؆7X_?&ްnxmxcdC776 o!c {چ7M6d nV6|0>bm`>dC0=3FDWu|6| !c놏چC6d S|  l×lt/†/᫶m _S|6| _!c 놯چ/K6d nU66kڭ 416yc#76ml66 uspذ=Qmc#lYYjdCtjMd#g{ļ 66aȆMpؤ D6d ^76Imcl&hc&lÏl8(b2O|~Om#2װ~j~؆ِ15S6ȆmA~j~؆?poy#Pm#$2mmbdCF hxkݺ1f0mS-vIݺ-lQ;bw`3R8b?Ťv-s׃tWJ:ٷֹU}zξVXl`+91VxU-b+[I·BAd#wT21ľEܷR6Ȇg X#6 !c3V l#l|66md[qc`ئ F6d ncMmclnluc6lcِ1 ئ N6Oj{ncaخN6d SÞ]mc;l|gj۱dCpFllW؎m ǿ",m 66`!c {JF0L6d S``lc٘ݻ_;D!cp;j;dC=e);6v`;Ȇm6vm6BF3wxF1BĞV Q6BȆBVFB6d ^7B`Q6BȆh#Dm#%+}#TPSB6BP!cY4΢jF(ِ1Ph#Tm#%2FF(F6 0%#L66°0!cpaFFF6d >Y4Lm# #2aFFl8^kbN8oT؉m$2ةI6d >oNN!c𽯝N.q=Ocx_{|_{.lcِ1, ΢6vaȆ.X7vm6v mR؅m&{p&nSvÞ[mc7lf^EM6d >onn!cح'k';s.zJ8)jF8ِ1xu#\m#'2mmcdCu#W6"ǯ61"D݈u#Bm#ۈ 2F8>#mD ۈ6"6"!c&Jdb jF$ܧ굖 LHa#ڈTۈ6"ɆF$jF$ِ1Hh#Rm#ۈ$2FF$E6~8{`h&F)QDmDaQdCRۈ6Ȇg(8FmDaQdC6((l#ldmC&F mDmDcdCp_4Zm#ۈ&2$wmD W*ڈVۈ}E>L;{,k{-k,k-k,k-k,k-kG,kG-k,k-k',k8Ze-vʲvڲvƲvֲvβv޲vvѲvɲvٲvŲvղv}qv]#f8Ũk\ q1TdPu5.jg8Ũk\ q1Td k\lv|QGt{6`{Ȇm6 lLna=!c==^}퓍{E ^^!coݫK6d S7Z8c;2ٿK6d >76m6%P'~{>lcِ1}>}>!c}j}dC=eOmcl &~ sl6m6 mW؏m'2)16WsZdC=e?_mc?ql4B&Sr@mql|ܧ;q8@6d ~g|@mqln6m6'q9$cg:FAA!cpjdC069c8lE A!cy qPm݆%Cw ĘgͻuS"E'aݺC!scjmL3=l ِ1,a83!c51{/16`gȆg33Y2-W}㬰q8q8K6d ^7ºqVm,qlYhYl,ِ1xO9 mU8m#_lb=)6aȆ?8q8G6d >9s9!cs9syqV&ya7p_Ag_03?1lGP; r cvq$B h l&poM&M1߄Ml&ِ1uMX#nm6n _+݄J76nb7ɆfoB76nbFW_cb3߂3R۸m"2ߛfom6n K-[-!c=[-[mQ- Mۢn܆uml6ِ1xݸ mm!coiކҼq۸M6d ~tڸq۸C6rR(㎳no{!Տٶq۸C6d ^7qGmql~xlِ1xݸmQ۸mA6򤹇b!ِ1??66 27j` ׍??66s.kgbu uldPw6 jwdC=.)w6bwɆS딻jwdCϞ݅6m6;ļq6aȆm܃6m6 Ϣ,zOmqlqOmql,k3v}jdC=>)6cɆ{}Sm6 ۸mW۸m< ,y4@ԍnO}'>'!c֍'jO'dC6@O6`OȆhl)WS㩸k{xJ6d"GTm)lShSl)ِ1S31{FSLgb3 xF6d ^7Lml3h3lِ1xOymzyj~;;:2wjp=xGd ^A"zD6ީm6ޓoab3{8cWxm'2x?ޫm6ޓ {ソWxm'2#C6cFA051>֍jdC{Z!c֍jdCuAmlQԍn|Tm|$2aH6d n#Qm#lyG'q90FIǏ7(>m|6> Iml|ܷ D6d c#[l|Rm|&ۢzT+ib|u36>cɆgX7>m|6> Ym3ln|6>m|p|%ҋ6[\_Y[־%%%%eeX2Y2[־eeee尬崬岬嶬屬b/}e?La8%rϬ&rAϬ)8BNb9 1`Kb( 1`Kbո>u "6|ʅvR l}Wj_a_  Jm+l+!c668>lb$v0$&ߡQFbFb!cpjdC6C6cɆm$6m$6&%fe&b|]dC=kSVlktMdC| m|5lo I\I\лI6`IȆm$6m$6 ׍$n$QHm$!2ߧKm$QHm$%xꊉTԍn$UHm$%2HHJ6d ~]o'UHm$%2)IjIddG(F2aF2=߯6aȆ钹}djɰddC=%)6aȆ{J2h#F2l#9iQ+S}&FrQ7ú\m#9l|MgjɱdC=%9)6cɆm$6m$6R i&F S7R -ͱj)dC6R@)6R`)Ȇm6Rm6R F FJѳ\2L.ٳ.ٳj)dC6RB)6Rb)Ɇ{JJSRm6R }6Rm6RZעҹDOI{J*TF*!cpTjTdCh*8RHm"2NImRHm&y#aHHM6d jjjjFj!cpjdC6RC6RciY//bbu# i6`iȆFX7Ҩm6Ґ HmQHm!27@i6`i5H+l6Ҫm6Ғ H mUHm%2EY4FZl#-ِ1o6Ҫm6ґ݃ib=%)6aȆ7tj鰍tdC6A6aȆ{J:h#F:l#=pl֌&FzQ7ú^m#=lIdF4Fzl#=ِ1FzFz!cp額j鱍 d疎 ld62md62  dPȀmd 2Ƞ@6d n#Am#l۳ɻE-#ȨH6d c3ÆیjdCFFFF!cY4#Qm#݆%/n]Sͻu.ppQp0Oc:9߭s\\w} wQ}7O4:蜻Ϲ 蜻DZ$fLgRLd/cp8}.A&\2_fצ"2zD>I&h#F&l#3xQL̢Wd"Ffl#3ِ1̰FdVȌmd&2aȬL6d n#3Ym#3 وpzjahooȆaltup_?k1ž ِ1 1Ql|Fml# |eO)FSEm# l|" ܷȢB6d n# Em# l|O+ Em# lr3#Y?sR jYdC0I:c8l~v,FVl#+ِ1FVFV!ckӬFVF61ȹ oDO{J6lF6!c{h=ljٰldCh68fSȆmd#27A6aɆc}ϮN6d oa _žN6d >fhvFv!cp١jٱdޙ;51r֍j9dCF8oPȁm 2)9`OɡA6d n#Cm#l$-bH# ~Nj9dC)9uJNFN!cj9dC)9j9\dϚL\]\]\j\dCIr$6raȆF.X7rm6r Ϣ\jdcomn01r;{l?)EnFn!cjdC6rC6rcɆFnh#Fnl#t #7y#Fl#ِ1h/Gm#lFh#Fl#ِ1xmQȃm%W;+F^X7m6 ׍nUȋm%27y#F^l#/ِ1,ȫn}}agG~ZZAZ!ڷ–"b▵R,k-ke,ke-k,k[[*X*Z*Y*[~UUUUհմ|&ո|bn|׸|Td ^O]jk\>Xk\>\Q1lָ|d굖 V 31~'7F~l#?ِ1F~F~!c}p.F~l#?ِ1lȯ(@6r\6 `Ȇ jdCss87P(m 2jdQi<Xl~FAl ِ1x(FAFA!cQ֍jdC6 B6 bƹO*ohbu6 aȆm6 m6 ׍BnR(m"2)BjoFCŪ:gQS7%nAiuߪm|m|K6d -Vm[l[!cY[8~--ِ11&ƷFa,[JsHsH6 cɆp(Q(L6d S ÞRXm0Ql|/0QXm0Ql&FSRDmQl=Flِ1xO){J"F!cR(Q(J6Ea(Q(J6d SžRTm(QlnuFQl(ِ1,Z(Q(F6JӷVMbnuF1lِ1x(F1bF1!cy7m6 (mS(m'iZv(.FqX7m6 Q\m8QlnuFql8ِ1xO)mW(nxɫݺ\1VwJjQB-]9x^߭+G v?֕g연}sT[Ws^׃tΏ8WRT/c9$tPR$%Ɂg̒p,Q׃$B#S(Q(E66U8QEQJC+R(m"2#J9F)lِ1x(E)RF)!ckRF)RwdcG71ϺuNm;l;!c$eD#6ߩm|m|G6d ^7u;ﰍȆg66Jovfb6JC6JcɆ{JiSJm6J ( mV(m&21KC6JceF=z(#l6ʨm6ʐ \tspذ}οFl ِ12F2F!cQ(Q(K6 ||=QV\צe6beɆY- Y-Q(K6d n,QVm,Ql|( mU(m#OIr`QN\)6aȆrdVʩm6ʑ i{Z6aȆm6ʩm6'׮^7^^m{l{!c=߫m|m|O6d ^7u{ﱍɆ66ʓ6+/kb6C6cɆ;j屍dC6C6cɆm6ʫm6* F 01*y7*mT6* oT6*`Ȇ{JS*mT6*  F FEkŀ~21*Q֍jdC6*B6*bɆ*½jdC)jJd#JF%JF%!cy7*mT6* ׍JnTRۨmT"2Q ڨQ ۨL6*)_mQڨQۨL6d ^7*úQYm2Ql|ި jdCRڨQlЯ71~6~6~Pl|_/dC6~6~Pl|Aml x/ Uľh/ZEm QlnTuFl ِ1*F*F!cRڨQۨJ6wOĨ*VamT6 ۨ mTUۨmT%2QڨQۨJ6d ^7BU6b6Ҙ՜װFF5aW5jF5!cR jjհjdC6A6aȆF5hF5l:XvLU(FuQoTWۨmT'2QڨQۨN6d ~ [^VWۨmT'2mTWۨm &s].wkm6j ۨmPۨm 2akm6j QCmQl44v;&FMqR^Tۨm$23 km6j Tۨm$25j56߇_Բ|ǣeeeeeeeeeeeeeeeeeeeGZ;Z{ZZGZ'ZgO.nԢW/S\S-1ՂQ-uk\-q2jk\-\jQ1lT F5qՂ56Hӣ[c&FmjW[m6Ql|6 gjdCQm8Vۨm&2j:dFuDݨF:F!cQ֍:ju:dC6@u6`uȆ@u6`uɆMnԅuF]l.ِ1\u6buɆpnQۨK6d ^7Bu6m8^|.G7Ճ"E'y'g||GA}\ϘY_->IgF}F6E< FF!c1m46 hm4Phm4 2 j d!' ŌΘ 6b Ɇaf̮?Pm!ѐlFChFCl!ِ1FCF#rzsDHmшl-m46 ϘHmшl^p#hF#l10xN1|NFcl1ِ1O5?Xm1јlڴ16mhL6d >o46m46 T˵31M&jM&dCu M6`MȆFX7m46  Dm єlZiF&FSa)Tm)єlFShFSl)ِ1M6bMɆ{JShFSlXyULf:Ni hF6d ~ ^4Shm4#2)`Oi hF6d |Q3hF3l9ydδKͅFsFs!cp͡jͱdC=9)6cɆm46m46ZoQF hF lِ1F F !cj-dCIZ@-6Z`-Fvee21ZpFKl%ِ1}>IKFK!c֍j-dCu%Rm%ъld<{d&F+Q7ZJmъlnuF+lِ1xhF+VF+!cVF+VFkA|+h;FIϑa%dkFk!cpjdC6ZC6ZcɆ{JkhFkl Xn]@ys_Ԝ6dVۨm6ڐ hmQhm!2)m`OihC6d S@m6`m?8sV##Vm-ּ-bpmjm}mh mUhm5k|-Vm-y'7;5Mż#7~TѼ+b׏j?b?wrE nGhG;"?B?mm3]&8\v.w۩m6ڙ.E nNmμw)bU1R#16a{"EA6aͻuMnbװ5l{F{nm6ګm6ڛwD ^7ú^m=޼['bh@6N^}M;`蠶@6d >otFF!c֍jdC6:@6:`F͹:jbtototTmt$2a訶H6d ~ ^vTmt$2訶d_Tv\&F';\vRmt2Ϗ|_ d1N^['NF'mt6:mt6:gG7X:9oҙl؊ygFg,9~sFglyX6:C6:cͳ" mtVmdu|񓸆 ^y^TOpIm'l'󼨈mmy^T)?A?mmt!頻`bt6@]6`]Ȇ{JSmt6 _t)]6`]ȆFhF 1]$e1;I]j]"NRW8wvU;jw`󝤮Jw}sTs׃nt&^"MԃnwSnt/cz փnjp=Fd ^zM-HA7hF7ly.-ޞfbt6C6cs"6kDwFw\mt6mt62D >Gt6mtp|%H|mǷ8zXӲ˲۲Dzײϲ߲66в6Ȳ6ز6IJ6Բ6̲6ܲ6²6Ҳ6ʲ6ڲ6Ʋ6ֲemexگ,k,k[&Z&Y҃jܓ#V4zָ׸Td zC]z׃jk\Xzk\\zP1xk\u_O9|[==NOFO!cj=dC{=lOFO!cp=j=^dcGjV01zwdzwdzm6z #)#ڋl؈Rm"2cXzm6z 6zm6zoi~71zjdCo[oFo!c516.,7 16zcɆK mVm!݌Odb=)}6`}Ȇa:c8lb_m!2裶C6d ^7@}6`}ƺj%O#b=/)}6b}ɆF_X7m6 }Wm/їl| mUm#]~O~Sm#2|F?lِ1~F?~F?!c觶O6'iv诶O6d ~/?_m?џlFhFl?ِ1FqW!c2jdC)u!cpjdcI71 jdC@@!c𽯁pk@lc ِ1@ r{u x2Hmc1l|_t1D6d xx lcِ1,:1L6,ں1Xԍn Vm &2)aO1L6d >o ``!c11B6.GicC`1B6d nc1Dmc1l|!jC!dCuc1Dmc1l|*Vfc11J6d nc(1Tmc(1l| 獡jCdC6BC6bF.l~b =e)6aȆm 6m 6 m Sm #2i1Lmc1l|&pac81\mc81lphcplc8ِ116cɆm 6m 6F.k41F2j#dCװ#5!cyc7Fm6F r1Bmc1l_l&Hac$1Rmc$1lHhcHlc$ِ1x HH!c11E6*"~1JQRm"23Gm6F mRm"2mRm&σZ ^=-hX7Fm6F ׍ѰnVm&2EGYthlc4ِ1uhhchlc ٠&Q71Fmc 1lnuclc ِ111!c8{JM1K6Oɺ&XQ7º1Vmc,1l:e,N1K6d nc,1Vmc,1l| mUkxguYbnPj?E'1[3~;0OY}}sT>?z05E3Ɖ^1q?׃qte ^z0N`ȁ1׃q$Bb1Nmc PpׇY/(/o{ ِ1__6~6~!2^ ِ1__6~6Ɠchbsx5ƫm6Ɠ mWm'2#N2^mc<1lkSg dcxlWsĘo ]ƯƯdC0etrpHp<>16~6~%2+ƯƯdCp^:c mmF6.ľi{My7߰Ȇ >oodC{6~6~#2acN̾]S ۘ@6VnO3r<c1ژ1ۘ@6d S&2Amc1l|ޘ j dC6&@6&`+/;]]mwlw!cO ۧWljc ya#^sݨ)chmmL$~P1Q|G DD!cp/|Dlc"ِ1xO{DD!c1֍jIdxWGTMInLuc$lcِ1.1 ۘD6d >N$I$!c1 ֍Ij6߇9/"-bYjYfYnYaYiYeYmYcYkYgYoY[`Y[hY[dY[lY[bY[jY[fY[nY[aY[iY[eYsYV[X-kk-kuL7v;qɢM5nM5n28͓&,jl, ыꭶmx _Syk*o olÛlxÞ⭶mx 66 qTCGGS|6| !c놏چC6d ^7|`Q6|Ȇ{᣶m% 61|ߛU6|Ɇ/j؆/ِ1/U6|ɆgQ_hWmH6XvL!cFjdC66B66bɆFX76ml66 Fv69߭sqnw6We&MvI;x~n6'gn&X6&7On&x7&\ڽsADO\?ξ/zGd S8c,%"V~$BϬA~j~؆?٘q+̆?ٰ}4_m'2w鯶m t6 !c9W6F7#^m`dCm`dCsD#6!c9"P66O}ebl66C66cɆgpܬL6d ~N66cɆmllV،mݍq9@@F H6d SaO T6Ɇ{J )jF ِ1E ml!JrE[l[6`[Ȇ{Sml6 mlQ؂ml!27@[6`E11jCH*baoU؊ml%2)[aO٪J6d nc+Umc+D6life#H S6 !cy#AjAFِ1 h#Hm#"2E lcr-D6m6!cav+o6lcِ1xO{6m6!cm6mvx+[caخN6d ^7ú]mc;lvhcvlc;ِ1xmlW؎m"snnúm ? uV6ɆEhF0L6d >oCjq{c!w=j;dC);u!cyc7vm6v ׍F`t"zJ)!j!Fِ1 Q6BȆm@!j!Fِ1h#Dm#%ֻ=%PPl#lnºm pU6BɆmBjFYJdSL0[pa.6°0!cpaFFF6d ^7`S6ȆmAajaNqyL=eNlc'ِ1uNxSmc'lnucNlc'ِ15NhcNlcp|PKmR؅m"2 O٥ E6d ..].!c إ M6Z_9g9c7vycnlc7ِ1xO {nn!c{=jdC6vC6vcd#LpQ7aW6ɆmCjF8ِ1F8W6Ɇ7¡ppl#l7ňhE#6"!cpFFA6d >FY4Bm#ۈ 2mDmD`dcΧ"nDžmD ϢpTۈ6"ɆmDBjF$ِ1, mDmDbQdOg11(h#Jm# ۈ"2mDmDaQdCF76(!cy# ڈRۈ6ͻͧmĈۏvAۏVۈ6[")ѰDmDc}pވVۈ6͛")FF>0}wG6m6aHbbu6`Ȇm6m6 ׍nP8m 2jdĬ,blss6bɆm6m6  >T8m$2ߛ=mT8m"xꊉqHCR8m"2!CjCdCu6aȆ{!h!l0iQ+S}&aQ7úqXm0qlݺݺjdCV8m&2q8q8B6zkWqDԍ#nQ8m!2)G`O9q8B6d ~ {^Q8m!2q8q8J6dBxN(|NQl(ِ1=)Eq8J6d SžrTm(ql|= mU8m#rFqL\)6aȆ{6aȆm6m6 8mS8m'W͚8.l6m6 [w[w\m8ql=ql8ِ16q n&L h lِ1x8  !cp'j'dC{'j'X'ka#V̢pUۈ6bɆaltupHǯdžmĒ _XXl#l|6b6bd#vvMnuIl$ِ1uIxrRm$qlnuIl$ِ1IhIl#lr߳#ιalđEg666Ⰽ8!cݜ1%? mđ ϢqpSۈ6Ȇ{Jmē 9#^xS6ⱍx!cFF<O6d ^7a݈Wۈ6ɆS⡍xxl#l$[ N' [OPH6ȆF j Fِ1h#Am#H 2) FFqlZm &)Q7NqJmqlnu)lِ1S^)S*ГRaҐ$(Dň`I ("b@L$*0 C,޿n}sNgժ]׈ jcncp+y1忍bdBsOgךm6֊ װkvZnc1pS֚m6֊ Z:yԄ:e]3Xm:XGm3Xm:XGm3Xm:aQ6qņ<c_7K{֋NIlc=^lhc=lc=^lNYO)6sņzjczncؘ?߲ 5T@ c  c  c``(6Dq/Fec#lc#QllFlFFcFFch$6ʳ^MjS6ml66 ):e&nc1&jc&nc1&jc&Kg3I^"6Ex;6x{ó$m;f}x|xDwo`|nYQ󷿅׃-Xz` [ā{Z[-f[x=""t [-f#҂ [\[6r[ņ6R[ņsV:Wl5ml:[fb32&{1)ۨmf۸mbCs1ml6 ml6ml6 ml6ml6qy1鴣H7H6ņkt[msbC9%)fF1p3H7H6ɿ׽cZnkf۹bC9e;Sml6 ;f۹bC@۩f6"}őḟcclclclclclclclcccccccc,1v1v1v1v1v1v1v1v1v1v1v1v1v1v1vqKԸG2ToA{ s5.Cj5.ָ s5.CjQ25.׸ q:Fek\vow0tcvhnc1UjcCl8cNkؕ)^7I{f;bCy'wm6v 杴oi)6t ܋Im4m[,=4KEm2m:F4LmĆkje%6t Sv9e.nc1ʻ]fbmNj[{6vsņno6m:֍ݴn6m:vS6vs{F|v{1~c7m6 {D?FĆQ=f{=bC֍=f{=bC@{=f{b+_tbcS9e^nc1nuc^nc1K{ѽf{bC~c/lc/Ol ڹ{15>g'6t oĈpg'6t g'6t g/6uUO~~c`O~~c~~c`/o8 6^8@fbCYfbC^Em6 jn~dLf^jN9H甃fbCq֍fbC{,{,m6 {уA!ѻ[jRF/!U7ѺqlqHlx=[wlqHlN9D)6qĆuqlqXlVa/aoaaca/zl0qXloaacajanHyz8н#fG#bC]z*i^nuqn㸷gbr)6sǽ=sװqn㸷gbq o_"o'T8A  o_Tq֍f'޾ o08mEU q8aqm#r.n ;IE48}xڇlIIc}Dᬣ8iO}Ãu'w~o2_R~)׃S޾s):W2;8)oBq,} )j)nؘ3wcͼվioql4qZlh4ql4qZlc=iic^ijin(+jR\#Yn1;1"6>m1fŰ8m:ghql qFly8cq8+6֮v$Y=HuVlx)n58m:wg6rgņu,g6rgņ6Rg6rFJ\UbSs9:38m:?Ѿ9n18Gsf縍sbC@稍sf縍bc 8^8/6*O`e%yycyyc`8Oyyc`q8oq۸ 6r=E#/U7.кqlqAlhqlqAlo\ c:qlqQl i]^b#[Su#1.Q:.hq۸(6t \\딋fbCq֍fbCw\6.m\6.ir߄ĸ}ؗĆE[6.qĆ%ڋ^2۸m\:ڸDm\2۸m\:)Kfb߁x1.kXes=R]6۸m\:֍˴n\6۸m\:ڸLm\6۸m\:ڸLm\6۸m\'5vR//z^1۸m\:F2^1۸m\:ڸBm\1۸m\:W+fWb㹾gTŸl\6m\6 {ѫjq۸*6t }*}Un1p {ڸjqm#r?F~ۍ0#wvd g#c,11rE;bc8Xc,1KrrvquscɎBXaXccccx80;}\ޟS0>C-̞!39CUg ;@ se f_01hNk\0qst.6"MȮld6md6 a7g7md:Nmd7md:Nmd7mDM+϶5ËlDQQfQF1o 9l#ۈ:ڈ66(c(j#l#!6ZOի#GpsnFc}9>f9bC=al#ClAm0mmYRu#DFl#mĆՍ6~ OP!:. Cf!n#$6t ܋ Q!-6s ^he#ڈ6ۈ6ņ0[oGmDsbC9%)fF1pN66ȃ #Fو6b6bcx);PbXmp1bC9%)1f1F1j#l#ۈ)./FKmĚmrbCKFF,+6t nĚmrbC~#ڈ5ۈ6/fĈ qabF'6t $.3ۈ6Ć6⨍88n#Nl8QqfqF /FněmsbCOFF</6t Somċ F<om$ He#H0H6ĆhLjp;l#H:֍Z76c:%H0H6F wHT6DDn#QlX7iH4H6ņkDM4H6ņ<$RfnC^9ٺ<[v9"rExu9왣f9;[~9~N}x|x%<;A|Ꮏ٣AIo?׃$u I$$z$t #hdA1$QIfIF.1Eռ\F.\F.c\F.\F.c`6rqĆ\F.\FnYaKIjm6rsņ6rS6rsņu#76rsņu#7l#7Gl \P/rîȣFZ7m6 m6m6 m6m6 yfϺ'm$sbC^4H6H6򋍌yg,\ȯl6m6 tNo/6t io/6t o( 6Z?Qk{^YYfbCQ֍fbC@fbC P6 pJSv>(7 fbC~ 7 m6  ҽfbCQ(hQ($6ya(;@  6 qĆu6 qĆ6 Q6 qĆuQl"6Ș#E)H1H6RĆgR虤n#Elh#H1H6RĆ{_)FF QXlwLbAb#Rʟl,lQ(,6t <[P-(lQ(,6t Q(lQ(,6t F]/Ql0*6~h3P/FESi/jm KmrbC^4fF1nRfFqs[k/|Q$w m6 װEFn1nuFn1n6m6#7bUFQo5(m:F4bUm6 m6m6 c0E6rFi8(y1z [1bF1c:]3(m:)RlQLlEEDὣaQ(.6>|={1~av?LqFqcR)6sņ7(m:g#׾:Fqa؍0Y)#1V1V1V1V1V1V1V1V1V1V1V1V1vccccFMc8nu1V1V1V1V1V1vc~RRn+TŸ˟S qC.,[aKk\ ^JH1ƕ5ƕ58{7*aq%x+!5NJk\ > y#M44n#Mlh#H3H6Ć!6Ҹ4c4j#l#()6rEj((;7Kٝ%6Jr%ņ6JR%6Jr%ņu$%6Jr%ņ`kf%Rbc;ߑ>])OWlQJlhQlQJlX7JѺQlQJlX7JѺQlQ;?dpR/.XZlL4D`iFi$t]l4Q;Sb`(MFiFit.`uFi!2ٺlK5w ]e1(}xڇg ֕5AcgPqއ''K?Ճ2 e;?ek=xsVV}ׅ+e~Y^ʷc`=(KAY:{,e"zPVDGFYnx?EbS}D9G3(m:h(gQ('6t +ѹF9n1p߾QlQ^l<8m(~+O+oQ(/6t Q(oQ(/6t Q(oQ(/6t 19Fynxcjg{1*uR* 6*pĆ6*P6*pĆ ˨`Qۨ 6t 1#bΟgT'Vbcy9%1*9"S*mT6* ߨhQۨ(6t QڨhQۨ(6t n4cDltJ }rcbXmT6*VKgMoZϋQIWD*mT6* F%Z7*mT6*  D dQۨ$6t S*9F%nX9luzFr߅Z9ޅZl2QYlh2Ql2QYloTFeFecEeڋV6ۨmT _*cXQE=_T>_Tl QEl8TsJ*Fc`ݨBF*FcgU*fU˶؋qqq bC@7P7mm 6t ߸o`qq1<uu bCqŨlT6mT6 OU秪mT6 VgrmT6 óQҏb8ZWǰڨmTg[VQڨfQۨ&6t QڨfQۨ&6t S9F5n1F5jF5nب*{p^jRSmT6 tNnQۨ.6t QڨnQۨ.6t S9FunF1#1nTuFZ7n4۸۸QlѰ\QlK7mm(6t \H)7mm(6t F ?FFe^jFn&QRŸIٸڸl&n&c`ݸ֍6n6n:}Dn2۸۸Ilb?xpxl&nf1wbܬ攛rbC]cDl+lfnfc`ݸ֍6n6n:s+_jfnnbܢo{淘mm"6t Eo-fp mBmbq q19ڜRVpё -1nU6n6n5۸۸UlX7nuV[[ņ6n6n5۸۸Ulom'l{u16n6nSUXŸM)96۸Ćm߸l6n6cmt6۸Ć!65cDlS)r3Ku16n6nލ^ە۩6n6n:r;=v۹ņuvZ7n7۸۸]lg~;3lvnx1j(5f5bC~7jm6j 7jf5bCwՠ6jm6jR2x1j5lMiQۨ)6t &FMn1FMjFMn1ӚFMF-mĨ'FKZE{ZfZbC9Sjm6j 7jZfZbCQڨeQۨ-6VgKŨtNmQۨ-6t Ek^Fmn1ߨMfbC@f:bTIb놷x#6GⱎFn1nԡuFn17:7:fu:bC{Pu6mDI:13Iw.;"]:hYoqnއLtָOu0wzPW9s#wzu՝uu~]^ʷc`=KA]:[ԥu"zPWDXRu6mD}wݽ/^0891vccn={c cc9w5v5q5u5s5wp=k{11ca#Gcc98:9;}'5nj{GʟS=ףp=sk\=q:ָz3׸zՓc`?\5qGk\=s;.~ŋqߝfwrw Jwҵҝfwrw mImiq'q1;;66C"H${1Ru.Z72۸۸Klv2۸۸Klr2۸۸KlEmeqQ_l;Pzܜ$F}u&>=[l>Q_lX7ӺQl>Q_lX7ӺQl>Q_l8ԧ6m6?r}/LLfwsw #Z`mq7q1fwsw mMmmq7qh27%=#6bn1Fcqq1mm#6t Ss=fp mCmcq@l6W7/FNNFcҀ) 6p Ć550hm4:h@m40hm+65)΋q^zfr {rƽƽbCq/mm+6t \Kmkq/Plދ s ~CFCc`hHFCFCc`ѐ 6r ņ56m46 b4pJ#93F#n1h#"lHlhlHlX7Q6q }fq }ngqq1}}fq mGmgqqweM^97 fs #Zň166:~~ņ667۸h,6b3 4l~ihFcZ7m46 װFcn1n4uFcn1FcjFcnظ [y1(M&fM&bC5kbфh"6t \6k&fM&bC@M&fMbHRv/FSe)l)TlX7Һl)TlISISFScFSjFSn^?Tb4S6Q6qĆh3ڋ63hm4:֍fn43hm4:hFm43hm4w{1+ͩf͹P՜}57hm4w1FsjFsn9{=6S6s-C$F Ղ}0hm9SZm6Zf~ iŰhmk17F e/n<@fpCYbS0xxޡZ1"6?g_^jnxrm<@m<`ޓh~oIoiђhe6ZR-6Zr-=A 1#bN.FKn%'7sJKjFKnAxAU7uAá,1pNy)ma_íok_5H?}y=x{DoCYb`u#<t bxsE}?Y#<t b`#ƣޞ%ƣjxm )l=bxsJc?Ƶg ^j=b=lF~Fߑ;;:8{1ccIS.c8ƞu={1ccEX7XwXXOX/XoXX_X?XKc8^u p(Nׁ5q G}Lsk\;wuwu0׸uu5u_GًQ:5UGFG9}sG7w4mtx#=l#gbבhёwTDF'NF'7=Ώr U.F'ns9NfNpomt6:mt6{V+SmOm{hvہ🼖Ez̋oE}x|xpEh_!zЍփnoTA7^ փnt3A78?ltݕFwFw8#;1mt6 wv6sLFwF8ztaу G}DF8zЙFnbڴlu&1z{]=6zr=Y Im4mg݃8sJOFOx=u'l' }QbRu6zq9 Em2m@X7zѺl  b^F/^Fox֯;l7 b3;隤Fon7<ћ֍f_m6zm6\K>nuFn<Ĉp}6p}y ֍>n1m繂{jFn/<=7=l/ b/]5mgvX7Һl/ b`Km5m2]3m2x&=lb`GF?~F?x.#~F?~Fl6m6oA ioџ1p?oџ1n6m6^W/~%od1"6yIu*\j%n%}5D{l%n%}5u%j%7eeeje7 ֍ixlene -stNylene -6^6^6xx~Oy\blBmb ְfŰxx~O b S^1xx~O bWW6^6^=NUeUjUWWa<)1"6VGހu16^6^= S^W6^6^= *ƫ 1^tEm 6h5knc1n ucnc1n 6m ps0Y5 뎱7cCcCccc#co:rtrv{1clclc=D$ɎcScS =ܶ4Pո 4׸ = 33\7p8 @sk@ bz{ q5n ^}5e5j5׸`.hLjب<ۂ_j5n5ا bר6^6^} xxl5nc<$1ym 6^LCDCd1{1A 1d1{1A 1d1x-%fsz;N3~lunuXo1o~ͯmm ͯSmm 5Us1XLm 6m 5Ul1 k ֍n 6m 5U`jc`n 7o9 :aA o1p o1fopC`N/1^tEm 6@C!fC!01n ucnc)A ܧBm 1m QSb Uuc(C6rCn1PjcPnc(ԍ Jm 5m 1j16*Jan uc0ncb`/:6qF{af160jc0n#?[S- #11֍fùٸ>֍n 7m 1n ucpnc6spjcpnc֍#~ 1a1uÏϚϚ0m@#f#7ߐogi4xx ?>k&}M77c`x֍766~Ïsʛƛforo:Eb7ޢomm?֍hxl-n-\1[[foqo:ŏu-j-!1FgGgGm6FHZ7Fm6F{ёi1~ Im4m}Q1Jh1lc1 EX7FѺ1lc1 E5}2m}Q?Em2mS$hlÆFGm11nuchnc49e4SFm6F)~ 7FS6FsomU7ަumwX?oM76xxc66a6|~CbQ{_c1|~Ïs:1m7Cװc6pc ?Cm1m$X5sXX|ˏoo5mX7Һ1lc,1cX8|YbSuc6qg?֍qn3mNG)6qg?㨍qf㸍wxG~ww>;;x^w:ww7ޡ61xxYIw׻t]wwƻnk..c.S5xxY1nKmk.1gJnucxnczl}n}ΏstNyl}n}Ώu}j}xߥĘlL6&mL6&}~ S&9ednc2w^t2E'mL6&}~ m21lc2ޓ+1>P6>6>0c6>6>{r8|@6>6>{rhj)xĘz)b1ۘk1p ;amL6~ 1ژb1ۘk1pc 1lc 1ST1lc*1̃؋NTTߏ6RS6rS^~?SfS6"dkG#w{Lsc#ǎ鎱Occc:>squ}161c+׎occ:8ƾs}1c'B"b=244͟K:Is]1\7-TjM5nƏkitM5\7 Khq5n>YIU!?4~ b`!?4g}>݇fr}Hm|hFEk﷫=#$GfExuA>#>#><><~w;׃}BcV>6z1tǼ|c`=փ">c|ߥfs=c#>btncz8%1lc:1ߓ>b:6s=~ 1ژn1ۘז3TݘA  xN } G0ۘmk1n̠uc nc_ۏ6fP36fp3ņ x1S={6>{6lc&1SlI36fr3ņ3LLcL' I_ '' IO'' I'n|b 6>:֍OilSnSc)S>5TlX7>6>5 =b|gn|f<{ĈV1bh ϸٳ l3n3x,ggfqsFeyYbQ6Ps6psĆucs6psĆs:1ۘm:ژCm1ۘm̅_s\\x.1gҳus6rs }ͥ{_s6rs )sfsƜ=W%m|m|.6t ӺbCgH>ϐ|n91fs_3$j_ /j71bW_j n xf5u Z70Y b//66才n#F>Řḷ6m6 {m|Mm|m55<5_m|m| Ϻ1f_s߈ʘFako66:F ooĆ661FlX761ۘ Iٞٞfp"ZOߵ1A1O{fp"|jc|n[Qk{^b|oiƷƷbCg~k-1o]ߚm|m|+6t Rߚm|m,^av8[~c7m,6ق ) 蜲lc1jcn;jM.1Sk;︍Ć663Nlh;j;︍Ćwwfqù/n|Ofsù )9{﹍IEߛm|m|N%^ f{﹍Ćt=KT7~0AlhjĆ6~6~0Allf?mDIʌ?H9X"~t>'x=IDX~6~2Xސ {{ӊ 6r Zlc!Ϋ1pb!ݷXhXՂhc!lc!Hl|{b,R~"E"c`XD"E"cE"E"cE"Eb88Db,V6S6s,cm,6m,6Y XLm,6Xm,A \.6m,vۈ2ޗS٭F.%9:~v1cw2?c9Ɩ;vpt11111111111111eԸ匪4sZ%o^bqKx["5Nָ%׸%Rt 웗оy-5n8YBks[翥p^ۋTXJm,5Xm,A cYJXm,6y XJm,5Xm,A 썖RK6r?:|dYF?gņ6~6~6YlhgjgņLml3 b/nb bzln87b b`lnWq$iQI_U֍_6~6~:lWnWctW__ņ6~6~5 yblFmf^7ڋf97:f^7j7߸Flf/y1~WstNlwnwc`֍6~6~:>;w߹ņfsczd}d2nc֍ef˸epH=[F=[fXw12jc2nQbu+9:a1uJ?F166:)9??Ćgd60!1TuOZ74 b4 b??66aoImi'بMbh__bClcDltȘN寋a1mm%6t _r;M\Սn,7Xm,}-7Xm,X7Ӻlc9 bv9lc9h9>mTn^66:W71"6\m71fs {ѿ66VR^]A{f+pT)+:e nc+@+f+pT J\3*KbTuc%+6Vr+ņocDl\iF+\jc%Rlhc%lc%RlX7VR+6Vrc^T֍66;ǂX7uα lns,661Wl :/*eclc bﰫﰫ6Vq> ֍Un2Xmx~jlcZlL]y^jc5XmX-6t p5pjnc1wwfbC^t5lc5*%1֨^t Eטm6]A 7~cnc U֍5fk5pWa55nC^kuz;[Vfk"֭5bZc}x:ٺ靵o><><Z5ky=XSzT=XG:󷿎׃up?e:Z֙`Ozփufx=XS1:jc:ncX-=*~ch=hznc1zjcznc1p?֛m6֋ zԋA謱lc. b$$66p hlc. b  Fѻ[jRF%F-۩¨z`Fnc1nlucFnc1፴h(6t 17R66r^[/&o[l2ml{mhclc b`66q^ Dml2mlv.{^,fzfnc1fjcfnc1fjcfnc1fjcfnc yآ-bw1[;$ml6A S9enc y~c lc Ulnٳ^asplc+Ulhc+lc+UlX7Һlc+UlX7R>1chfa1pNFmf۸mpvml6ml6}A |Fxlc.6&Zb^.^tN6ҹtc6a6ҹtcF:H7H6ņsJ:nmlҽ:e;]l7ml@۩f۹pWzml6ml6]A SS6mDa,7ّcclclclclclclclcccccccc,1v1v1v1v1v1v1v1v1v1v1v1v1v1v1vq?LԸYt甡z ek\qRt qek\qRt 2hoaqeH1eaq|+1vhvm6vCYb`߼;6vp;}A ab`oa)6췬BM/NNNc`INNc^Nlc'Slhc'lc' إ]tNeeuc6vq]!A he b]fbe[Fحl6vm6v nZ7vm6v m6vm6v njcnncGƋGnOnncO8%{{6p{=2A \o=f{= {=f{bc$^Ջ^^c){6r{ņ٨LjƎŰm:Km5mw y19eSm6CYb}>}>xP{}g b}>}~o%1֍fbC@fbCggm6 ~xZkfPoxTZ7m6hqlqPlҙ ۼ՜r)6rņu 6rņ딃trl qPl86m6ޑ=Hl.:dq8e ˥Cbõ\:dq8& b:]28mw1n6m6[6֣7~an1p08lq8,6t i8lq8,6t q8lqm#r.[Ho럭;""bn1F?v,[k>08[w?bvpk_86#o<ٺ#;?bΏzpΛ NjG1?QW1Q^zT Gi=8jq׃Q1x㘿=~LlLuIylq,û#bc⼤A-'.1n0ctqlq iql)6rEnl/TL462ņL462ņu#֍LLn#Slj&im]z1ff78mҏӻҏm6.uv6s}A ǩfǹb#1y1Nq֍f'bCq֍f'bCq֍f'bC~qlqޅ8֦'Ind8%uul$qޅ@'f'. 8Im48m 㔪h8eq8%6t h8eq8%6t :ENm6N m6Nm6N{rKijint8%8Mm68m18Mf f3b漷^8C7Θm6Έ m6Θm6Έ m6Θm6Έ ;Cm18mwz1*gfgPu}58mw1YjYn,{6sYjYnظӻS@bS9ڋ38m:֍sn38m:8Gm38m:)稍sf縍^b/yU7Ӻqlm6Λm6{N9O)6sA 積f繍 bQK$Ջ^ c  c  cY.P6.p^EjEnb8%iql"qY@f ֍E% 9#1.)KfKbC@KfKbC@KfKbC~qlqgŸl\6.m\6.CYbr)6.s}A qڸlq۸ 3b`ݸLm\6۸m\OyPb\Q+trl qEl*n1jn1jn*=qUSuUp(K Wiݸjq۸ bUUx}{ѫUna7d&[r{<;Ƣc9c!Xc,1s;c$X.XnXX^X>X1+++Kqv:Ɗ8Ɗ:Ɗ9Ɗ'g&/w sʖQd%/[21h˖%ָlɬϙc-9!K %?gAb゜bdO({2덲md6 'Ȟ̞'n.6t ͞pmd6 T٩fٹ(1pAfĈRu#֍((n#Jl^oƏz}EF%6t QnDmDqQbCEmDmDq9Flf/y1r(9f9bC9G2sm6r FZ7rm6r m6rm6Bbcdyi%F(Td m1=dܐF F֍F mFۈᎿًlDSfF1p7:FmDsbC@FF4-6t MmDmDmDy${gBٺdvcPYD[khÙc$'c~><>Z7m6 F>Z7m6 |tNg'6t EQ6qa\3*bվh6FXlX7´n6FXl86sac6fan#Yl\/FLm$m$sbC@FF2,6t F]?FƐ Vp] dn#Ylh#H6H6~Vȯl6m6 tNo/6t io/6t 0?l#?Q@l\MJ-@{fbC@fbC@fbC^QlQPl ܴ(l6 m6 /H/hQ((6t s }FAn1FAjFAn9nԜR)6 qĆF!o2(m:6 qĆF!jF!n#El]>W)ٞlOF "6t Bmmp)bC9%))f)F1αj#l#(,6RB(L7 m6 ´(lQ(,6t Q(lQ(,6t (Lm6(mz1RomTTn#UlX7RiH5H6Rņ6RTTn#UloRfF!NET(BF"Fc"F"Fc"F"Fc`(Bm1(msFZbmx afEbCuJQN)jQ(*6t E^FQn1n6m6~^f^bj [am6 F1Z7m6 óq#bsy .|] bF1c`/Z(fQm#r8&)^dT]LRq0*bB? X,[}xMw7;(v}xoΈ?~q}x|x6LRq7yޗyY}ޗ9c%cccececccccccUc78ƪ:ƪ9ƪ;nt1vcVmc5c5cccucw8:})!Ï}WBKyJX >*c`S<%JH=1.A+[ se+Rt KW\J'Ml6z*iS%F؈qitK3H6Ć{,it%l#H:H66Ҹ4c`?Fmmq%ņ<8ʋQRKutIFIcFIFIcFIFIc`?\(iQ(%6VgK(h'mfn2(m:(Em2(m:(Em2(m:S(eQ(-6qIfbCuti.mQ(-6t c)MXJm6J FiFmĨ'e(#6\˘m6ʈ ֕gʘm6ʈ FZ7ʘm6ʈ m6ʘm6zoU&1ʪQ֍fe딲tRl,QS1fe6Re6rFnIU]Ö3(m:F4=Ć)gQ('6t S9F9n1-Gm3(m?;>b " z)ZB $P$tBGz4EzE H*AyԵr~w;}XfLp}+(#FX7ʨm6ʐ e`/ZFm QlFhFl ِ1x(mQ(m ab놻چ;N6d ދ^]mp'2mmcdCwh]m0G7r!j؆1xuCm0"E=`/꡶mx}Q6<6< Oa~=6< O OlÓlnxº᩶mx  OX7<6< O!c=sOhSm2{6|sS6 /g.bp^ІچeE ^7`R6̞ /hKm (K6~(+l6ʪm6ʒ ( mU(m%2Q(Q(K6d >6ʪm6ʑc儍rF9rF9!cp堍rj對rdC6A6aȆm6ʩm6ʓIhbw07<ٰS^mLmbT*S6*bɆWEbEFE!cpjdC+B6*bsؕUN 51*~7*mT6*"ߨ7*mT6*"a/E JF%VsJ%hF%l2٘wƞLbN jdC6*C6*cɆal4tHoʕ"Fel2ِ1RڨQ&ngj-lxCj؆7ِ1 oh[m&2S⭶mx 66*d}mĨ"lT6mT6 ۨmTQۨmT!2Xͱ*jU*dCa@U6`>d#1V>چC6d nQ6|Ȇm@>j>؆ِ1x6|6|ds&FUQ7ºQUm*Ql| [amT6 Dz*eUFU!c𽯪FUvC^՜g2ٺjMjj"SwtPM݁xvU[wg<[W j{^ ׃tw[nD8[P-q=Nw_:tP]:Ɂ;C"zPDT6mT6jQ 5{Z%d#/Pۨm 2Ӫjm6j 5`QCmQlF hF l&nyc5LǬ {̚j5dCu&56jb5Ɇצ5ڴFMl&ِ1FM؆/`ձL _q&IU6|Ɇ¦6_a|6| _!c9)j؆/ِ1U6F[afv31D ? ?lÏln᧶m 66 ?!c} ?hOmۨE6X8] Q ۨE6d ~&ԁ6m6Fe{.eb9%)AjAFِ1>?16l 6 !cFFD6d >AAjAF]ʥ&F]Q7ºQWm.Ql|.ܧQۨK6d ޮ u6buɆF]hF]l٘ucQ&F=Q7QOmQlF3żLZzdCt>]=zF=!cpzjdC:mb6C6cɆߨQۨO6d n>Q_m>QlF}hF}l#lթ&FSm ׍`X76`!c~#jF0ِ1`h#Xm#h@6V&F\|.@mрlc 7m46 ׍n4Phm4 2hhH6;db4u! 6b Ɇ"bj dCu! 6b Ɇ) j FdNf01֍FjFdCF#o4Rhm4"2h7m46 }56m46BȆ\WO61BDu#Dm#!2_Æ5lFB6d l#ln@!j!FcAof_J1֍jdCu16cɆm46m46 h m4Vhm Azb  װjF(ِ1x/ {PPl#lFF(J6d n#U6kgb9% )ajaFِ1xu#Lm# #2mmaadC/AajaF8٨FؚpZF8N6d n#W6Ɇװp m aápp !&γuYs D-]x.ٺ&A&viYu^D~7O.ٺ&7Q&4{l< h ׃te ^BMzД|h 犦jMq=hJ"d >W46m46"L=h<2S#GMaۄPۈ6"Le1h#Bm#ۈ05B6"l#T FFьluL~2급L`Lmьl|ߢܷh hF6d nLmьlF&Lmќlya&FssnhN6d ^7ú\m9ќl|rphWe׏\Rhm4'21C6c-Eu>obF oPhm 2-`hhA6d ^7ZBmтlhmPhm$YF1Z:צ1_%0_ݓgZm6Z ?Ck Thm$2NNZm6Z -j-VdOU21Z ֍VjVdC~g+VF+!c}VpߢF+lِ1 h hM6rbbvhK5Z =jdC061{cShm&2hhM6d n5Zm5I6.gx&Ĉpw+Rm#ۈ$2E#a/mD ۈ6"6"H!c9%ڈTۈ6ڐopnbk6p Fm цl.|!Fm цlm{6jm6dC6@m6`mF4vVh mUhm%27~F[l-ِ1F[F[!c9-Vm-E6w&Fx/# mD ׍(X76(!c9% )QjQFِ1x݈66hqV11:%S6h!c~#jF4ِ1x݈u#Zm#ۈ&2FF4C6J/#F؈6b6b!cmĐ ۈ6b6b!cp1FF݆00o7;b-񈳌[,c,c$X{XXGX'XgXXWX7XeeeeeeeeesX@ `Pabu{jSqŪk\,qTd >/V]bq'c=XqR1x5.V]bG6_VĈk8Sۈ6ȆmAqjqFِ188l#lo66ⰍxE֣númē ۈ66ⱍx!cpFF<O6d ^7⡍xxl#l׭ n$m$  oNPH6Ȇm$@ j Fِ1h#Am#hG6-ZE`hhG6d ^7NmюlF;hF;lِ1vF;vF" c*1&Fm$m$bdC{p7Qm#H$2m$m$bdC.DDl#l|H|}/n$$8$m$aIdC{Ip7Im# H"2m$m$aIdChm'#h/F{X7ګm6ړ )^m=ўl| a۫m6ړ hmWhmt #;ɗLFhFlِ1x/6:`Ȇ9~sFlِ1x蠶H6>QmtTmt$2訶H6d \#|.Qm#ёlnt6:mtp<[=>.\<5?g:ߤv\<w:w}sOep^N{ ׃t?ѻ YaY};zЙΰv׃@3":zЙD|謶B6d೦EtQmt!2袶B6d E.F!c> Em ѕl\tU__Um+ѕl j]dC6B]6b]Ɇmt6mt6=8# 馶 F6d ~F<#Mmэl|m Mmt6 mtSm$vI31ŻɰLVH6Ɇd8$m$cdCu#֍ddl#lF2mt' +up 5u;d6ѲntWmt'2;mt6 mtWmt'2_v6mt6z-s!-z}j=dC࿡W{m6z mPm 2_6zm6z;ލyqEMI6uۇl&>j}>dCu}6`}Ȇm6m6 GmїlTXlW{}6b}Ɇ 髶K6d gUm%2EB}6bFz ~F?~F?!c֍~j~dC{_W?~F?!c~Om9?_so|6>6>'2}}99ِ1x֍6>6>'27>6>WO68~Yj_mWm'2诶O6d oFF!c9?_m?1lm`:c11@6d o !cpjdC6@6`ưm#31~c 7m 6 m Tm $2S9e@lc ِ1@ qy1HԍAn Rm "2S9e lcِ1x/:6aȆA A`Iw&`Q7ú1Xmc01l|2Sm 6 ׍n Vm &2j!dKUcxg|glcِ1!!!ctilcِ1hclc(٘PƱ gb 6BC6bCɆm 6m 6 ׍n Um %2 m Uj>0}ax }aiemckgo2elelelelelekT4t L,l\<7 w6ʓ a7{a7 ׸aTd T5nqè|= k0\Q1xk0ud#G71o8m 6 7\mc81lphcplc8ِ1x<1A6Z ^5~1BG!c1A6d nc1Bmc1ln6Fmpy.gGٺ/LZv9[_|aw`.]u_a ΋{H79Co#F»?R}Gz0HXF`$919H$2+FB#6FbF1iNQ(Q(!cpQjQdCQp=Jmc1l|mRm& F֮1Z mVm&21Gchlc4ِ1ho?Zmc41l|~41Zmc41l,O_dT)C6M^iclc ِ1x1!cs 2ƨm6Ɛ mQm%JUL1V?XX!c}pbXlc,ِ1x XX!cpcjcqd&8qr)!c1֍)jS)dCshclk1.0b&עn| j_c_ Zmklk!cp_C_m|m|M6d >| m|51l^cvTjSdCS)S6bSɆ甩pN1ۘJ6d nc*1Umc*1ldu|i1M}M{_6aȆiߘ1 ۘF6d ^71Mmc1l4hc4lc:وQtb&t5}MWۘmL'2aݘ1ۘN6d ^7ú1]mc:1lߘmLWۘm 36gKc3`ݘ1ۘA6d װ36f`3Ȇ X7fm6f Sf@36f`3ӯ#~^fbuc&36fb3Ɇ甙pN1ۘI6d nc&1Smc&1lLhcLlcp71f YjYdCs,8Rۘm"23gm6f Yjddbkp ;[mc61l|N jdC6fC6fcɆm̆6fm6損%Z51~c7m6 ׍9nQۘm!2S9elcِ1x/:ژ1ۘK6~_zkocS9e\lc.ِ1\\!cu\N1ۘK6d ~.1Wmc݆p<癤\f1gdZ<s]3I1O`݁xv3I1O}ᄍx/+Sy|Cy1XQop=¿{ߨ|7@}7P7jz 1x=Fmlc>0-qlB1_a1_mc>1l.՝O6lj|lc>ِ1 g k$Sژm'2#C6c Ȇ9Lhclcِ1x 6` Ȇ{\X@6d nc@mc݆/w_߿" B9Y[ƖXƖZƖYƖ[VXVZVYV[XZY[6X6Z6Y6[ƶXƾ}gjfnaiemckgBq>jb8-B-T׸-'cwkB\R1Zi!\+-T׸-'ch!q 5n!tX$Ep[XD6d >-"E"!com,6 /6m,6.s51m,6 5bb!cpjdC{j%dc619e Sm,6 /.K6`KȆ~dlc ِ1XXJ6j7&R3Ra;Tmc)l.lj[J6lSRR!c֍jKdCppeb K6b ιb,2o,SXm,#2`X XF6d ދ.2e2!c9eLmclwA&rga.'~_o'.WXm,'2 k{ [۳\mc9l|w9]XN6d nc9\mc9ldjD& o  !c֍j+dCs 8PXm 2_6Vm6V0K61V:m32+Ɇ+6Vb+Ɇ"bZ+dC6VB+6Vb+Ɇm6Vm6VO 7X%UX XE6d ^7VJmcl|NYUjUdCs*hc*lc5٠_ibv o&jdC0b8lXr=E j!c5j]XM6d ] mVXm!yS\vFԍ5nQXm!2Z֨m6֐ ?3^QXm!2S@k6`kF"O~01:)fc-ٰZZ!c9e-S֪m6֒ a5ZZ!c9e-Vmc-l,8cXuj밍udCS)6aȆ{u]XG6d ^7A6aVd=X/7j뱍dCuc=6cɆ6$ qKZ뱍dC6֫m66 @~c8Amclhclcِ1)66`Ȇ{  Fas9˿lK~dFlc#ِ1)66bɆװvFlc#ِ1بD6֮7$):e&lcِ1M&M&!c~c76ml66 mlR؄ml&l| a7=VdجL6d ^76úYmc3l|N jdCsfhcflc ٨01֍-j[-dC6@[6`[Ȇ-j[-dCk--Ʒd&ƷNf[ᵰǶӞr[ooɆ{_ߪm|m|K6d ;Vm[l[!cpBߪm|k8l]a}w5S.\<lwF|v݁xo}};w;7O. ΋{Vokt?=U|t+vVߊV2_nkӭj[q=Jd cn"El`+1VhcVlcofӾG&6瞖)ȆHoS؆ml#2#Mmcl|m Mml6 ۠mj۰dcDz^nE6cɆml6ml6 mlW؎ml'2#C6c;ƑI-jbIvblcِ1);6v`;ȆpN١A6d hclc'H@d&NQ7vºSmc'lnucNlc'ِ1NN!c8 ةE6P%l6vm6v mR؅m"2Sv9e.lcِ1].]n1޳MbN jdCnn!cpjdC6vC6vc{OnJ7#X7m6 mQ؃m!2;m6 أK6 +^X7m6 ){ᜲWmc/l j{dC{j{}dOԍ}nS؇m#2QWm6 )Omcl|NmSg>}/ȿoA!aQ1㖱,c,c-cg,cg-c,c-c,c-c,c?Z.[ƮXƮZ~]]ݰݴݲ|f?ոYwq/j~Xk~\S1xoF5n?q|׸Td Sr:c8j\)'{fbP8m 2ᰑaKxq8@6d nq@mqlhl vl )Aa qPm ql| =q8H6d n qPm qlFg_8m25*qH|;v!C!~alD9c8l؎R8m2!h!lyHu6aF=\8,ð8q8L6d > ۇ6cɆTal0ِ1aѷGL˚GĻ&G&G6`GȆ#pN9q8B6d ^7qDmqlhl(٘q5LQxFQl(ِ1QQ!cm6 8 mU8m#;&>lbs01\Q1c1!cs9cjǰcdCs18S8m#2q 8q lP\&b=\|==ِ1x֍66'2=dCp䌁pW8N6qܹN1g뎓;\_\n,W8m'2E^ql8ِ1xq6cɆ|8q8A6 Vk18!ְ' lِ1  !c~7Nm6N ׍ IߍdbtfC$plU'ɺqRm$qҼ,bp'j'g׍nT8m4=dcX3Fw󥈡ql5kZz8Aml!c^؋ِ1&?wM~Pldc3+VHCkly'YfDq 6Na;"`8q 8eމ1r )6Na;"_Sj6N; 0œ; iv[wIN;0O.֝+~ӳ 8#Ni\Θs6|;#~&'V?sB gzpƜ1xqg"zpƜ1xy8q8K6~g~YyVm,qlYhYl,ِ1YY!c%1+Zgsd#]'Ms<gsj簍sdC윃S8m#2q8q8G6d c3Ʃ޶:q8O6Lmb\6BW6bW͙\۸ m\U۸m\5grE qo\U۸m\5grE -gh^)bhm\6~"UoS$I?~'Ȇmmِ16~6~"2Sœ1S򥈡q͜^YTP7~5l9-b~3yۨJq ۸fk߸kjװk漶m\6m\6>kjlcb\su8\W۸m\'2_\jױdC6C6cɆ9v>kq۸A6.gㆰqڸq۸A6d  !cp7j7dCѿmP۸m${(:qS߄{76nb7ɆMX7nm6n 7aqSm&ql07j7[d SW01n~7nm6n ۸mR۸m"2q ڸq ۸E6d [-[vo߇}s;-c,c-cX~f{`{h22eOcS3s K+k_-co,co-c,c-c,c-߇M5ᩏL2n3w׸Td ֢ݦgknkm\nS1xotF56q| kmu;dW}n31m6 ܁{1w6`wȆm܁6m6 w;jwd#.]ebwy7'˻jwdC0{1m16l?{Wm.qli&]aq۸K6d ^7Bw6b?ļ41~ugX7~Vln j?c? ԍam16~6~&2?C?mm#cVql|}m6 ۸mW۸m'2j_ /+41~qŘ?w~__Ȇp{mmB6d c#a(?˔"//dC//jm8y<[W ]x.>쟳uw~U;\<$yWl).ᄍxzv~WxU_q=ye'/M7 ׃ o@0=f3ZoF"d Gml.)x6`ȆK|k!c3ƆaGoؐ5E !c߭{m!#m<6 بA'+xH6d c>6m<6~'=_^.lb.={dCuwX7~WlfN wp0S򧈡;;ِ1;#15O˚Dx#G#!c֍GjGdC0u3F Q)"#lِ1Hmnyc5L?D֍?66 2߷[ِ18g oNfs/"dCuh??e71蟰SmOlO!cpBmmI6d ?a#fbpŋ1RlSmOl1`ձLchcl1ِ1cc!c~3F(w~ xL6d ><6m<6|MQ51O'jO'dCO'!c~#㿽)bhm<6 )O'jOd歰 3OSS!cpOjOdC0uaڍSxm<%2OjOgd#)`b<6A6aȆgpNy xF6d ~{Llkxkl5ِ1\D WCk5l|Ny jdC{_jF郣WylI!{{!cn'^ {l;Y&E {!cpjﱍdCSC6cƓ\ ):lِ1:\|Pm| 2_|jdCjd#=r21>uGNH6d }}Tm|$27>~Gl#ِ1:#Qm>a0w<>}fKmsZXZY[2X2Z2Y2[ƲXƲZƲYƲ[rXrZ,c,c-cy,cy-c,c-c,c-c,cS9y99 0kls7M[?"s]q.O)V. 0%S7)ob <|jw`b 6>S lggja |m|lMnvj7t^;Fjl#5ِ1Z)Z+VHm&2HHM6d ǒHp!iwoōͺY lÅl܆ ᢶm .pQp6\ȆX\  lÕl&m2W7dj؆+ِ1 W WlÕlnº᪶m  WhUmHC6M&FQ7Fm# lFh#Fl# ِ14F4F!cpi4jid#`魽i}Z7oVm#-lFZh#FZl#-ِ1FZFZ!c9%-Vm#-lUj^cNHmSHm#2H7ҩm6ґ HmSHm#2nF:tFzn51ҋ5lzMHO6d ދhzFz!cp額j鱍dCu#=^m#=l, w ld62md62 mdPȀmd 2_d j dC62@62`ߍt(ld62md62 E@ϨH6d c3FH6d /ȨD6~j # Ȥ D6d ދfh&LF&!c22md62 mdRȄmd&evCg2md62 ÅęɆ%άL6d n#3Ym#3l|N mdVȌmd!cr]="FX7md6 Y`Em# l{,jY,dC6@Y6`YFco)FVQ7ºUm#+l| amd6 ׍ndUȊmd%2 mdUȊmd#&F6/ fSȆmd#2`Ȧ F6d n#Mm#lmdSȆmd'++[932ɆZ|=Fvl#;ِ1nLnvFv!c5lvͮN6d >d6md6rM21r~#7rm6r SruJF!c֍j9dCsJh#Fl#'ٸ8>k&FNbuI6-uϩI6d {_9}Tȉm$2ȩI6d >6rm6kgb)nyچF6d ^7`pSp6Ȇ)np⦶m )nІچl#7r~#F.l#ِ1}rCKm#l|_4ͥ E6d N`.h#F.l#7٨FZ51r֍jdCu#76rcɆFnX7rm6r )jGS|䣻/c"3z|"ܷȧ׃|$B=f>h#F>l#?[aG&F~G}D~F~!cp3F~l#?ِ1\VjdC}D~h#F~lٸ7ʋM} S7 [{x6 `Ȇ(Q(@6d nQ@mQl(mP(m4}D㑙6~gAQT(m4FAX7 m6 BsJA8T(m4]FAhFAl(N_LBbN)BjBdCE!BF!!cBpF!lِ1xQ(Q(L6:&?u(,l6 m6 ?{/ V(m&2Q(Q(L6d n0QXm݆///o8Q}b▱RҖ21w˘e2e+k+g+o`hdlUXƪZƪYƪ[jXjZ|-c~Z1c?NE%Gǩ荊ި58FQ6%eRָ"'cWָ"W׸"Td ^WD](;*MFQhFQl(ِ1}Q'WTm(Qlo. jEdC}sQhFQlXlЕ'&F1Q1bF1!coF:c8l^+Q (F6d ^7QLmQln6m6n}(.K,K,Q(N6d ^7úQ\m8Ql|/8܋)Q(N6d S(Q(A6U:K(F Q7JQBmQl|/܋)Q(A6d nQBmQln6Jm6J̴lb* TRm$QlFIhFIl$ِ1R)%6Jb%Ɇm6Jm6J !+ibh)؋R(m"27Z;c8l M<蓶TZRdCu6JaȆm6Jm6J J&FiQ7JúQZm4QlnuFil4ِ1FiFi!cuJihFil aM2nuFl ِ1x/Ze6`eȆm6ʨm6ʐ e2je w1k̬]p66ܱ w!cpІچ;N6d npWp6ɆmCj؆@kCS<:Cm 27<`ᡶmx 6<6< !c~P6<$nxº᩶mx ?=6< O!cu'\xmxbdC6< O OlËlz^†᥶mx  /X76 /!cBrCꥶmx )^ІچQl/pS9FYl,ِ1:,\U(m%2ea(Q(K6d ^7Be6bȆ3N41ʉ=rpϼF9lِ1rF9rF9!c~7ʩm6ʑ (mS(m'эO7(/FyX7ʫm6ʓ aQ^mW%Jvig*W}sig*{^I}+zP/Z}Ы,%V~KW2}WWY2ɁAeX*ET21x= mTVۨmx 9^71E {Lo olÛl|/o olÛl|mxcdCм o ol (p;L*>œB6p}sy8Fl ِ1ٺ*l]*F!ci8TQۨmT!2U*jU ѠǢ_>n᣶m [}  lÇl|mצ>j>؆ِ1x6|6|dSJ1iU6QۨJ6d U6bUɆmT6mT6 ׍FUF5w6Q ڨQ ۨF6d oTF5jF5!c9SmT6 ׍jF5jFuJL߰B&Fu1TsJuFu!cghm16fo4"bv16cɆmT6mT6 ?CmTWۨm g.Ĩ!lԀ6jm6j ?_Pۨm 2QڨQۨA6d c#~٨QۨI6hzt5Sj9FMl&ِ1R)56jb5ɆmԄ6jm6j 5j5 _W}U_ _l×l܆/᫶m 6|6| _!cpІچ/G6ijb놟چG6d nS6ȆmA~j~؆ِ1xmmaFk]11jghZjZdC6jA6jaȆmԂ6jm6j SjA6jad1]L Q7aW6ɆmCj؆?ِ1?3W6Ɇh_mn}+}aߎovXhmc յճշ[XZYB,c-c0Xeee,2222222ikckkE[b,߇ 7{׌Y?Nbk\8z;@]p 'cgq@5N5.ָu _ c*1&FmmbdC6@@l#l7 QF H6d 7BjFmqLڢ7 {jdC~jg?6jcɆԆ~jm6j ͵j:dCV&FTu6`uȆmԁ6m6 )uRGmQl|NmQۨmӻu#֍ l#l} >AFD6d >9%Hm#"2mmauFf21=ܺpF]l.ِ1F]F]!cQ֍judC6Bu6b@&F=ыփh=zF=!c9Sm6 ۨmSۨm#2EA6aHLbNjdCu>6cɆmԇ6m6 j`N%`a``l#lnúm S:%Xm#&2FF0рl۹}S9Flِ1xhFF!cp j dCu@mѐl<vckb4gi³4 6b ɆFCX7m46 ) Pm!ѐlmm4Thh8yXl]#X-E40Ovk@4;0O=[R~#7O.ٺF7RF=J{UmD/9W>"N{ʗECw?׃2 kuCȁ Q; zA1{!FFјl8~w X4jdC}DcG4Vhm4&2#>Fcl1ِ1xh%STu s6lXrUj U6BɆ–Adö U6BɆ;CLm 6B6B01%5L0$ >' S6ȆFajaFِ10h#Lm# #2mmadc7WmdbwCm g6±p!cpFF8N6d c#~W6h"-H&F!c֍&jM&dCFo4Qhm4!2_66m46;~>h*FSX7m46 vSM6bMɆFSX7m46 w66m46"Fwyzj|mD ׍X7"6"!cpFFA6d >D@jF3Q#]͜kX37#F3lِ1\ضk3avm hF6d nLmьl|Nim4Shm4'j `b4Fso4Whm4'2ahhN6d n9\m9ќlFshFsllcx9&F oF F !cp-j-dC06j8c7kZ-dC6Z@-6Z`-7Jh榴$K-6Zb-Ɇ"bS-6Zb-Ɇ)-:FKl%ِ1FKF+/ʋ51Z9̆d+r_)h hE6d ^7ZJmъlF+hF+lِ1W+hF+l5ٸ=/۲=L֢h jdCu56ZcɆZm6Z ׍FkF$H9&&Fx+mD ׍HX7"6"H!c^4jF$ِ1F$m!%v⚉FAqjqFkkq澾wY3{yF`#ȆX7Fm6F ׍nPm 2#j#dyqQ j#dCHoTm$2^{$^{Hlc$ِ1H(R.&( !9l>C(Q(!c9eSFm6F ׍QnRm"2EGA6Fa`qLѢnuchlc4ِ12)6FcɆѰ1M6d O_M>1G6d nc1Nmc1l8hc8lcِ168qxW'c7~cxlc<ِ12)6cɆpN1O6d -xhcxlccĘ 1ۘ@6d nc1Amc1l| ;a'mL6& }M6&mL6& +p1Qa1Qmc"1l|N甉jdCuc"6&bɆ)jIdĜ2 )6&aȆ$X7&mL6& ۘmLRۘmL"2Ijdc|]81YԍɰnLVۘmL&21ژ1ۘL6d nc21Ymc21l|2ژ1nq7Iko@S"E'b盤)pv0\<)x57ISݟb))OQ)L{Pڔ1 LwO`*}#1۔5U`*SɁTXEL`*1x= mLUۘmL#bfM>Ę&皦1 ۘF6d >WLs4i4!cpӠijӰidCӠij6Ds_'ȳagqL12jiems[X<,cy1/˘ele22k[d[l[b--[Ɩ[,c+,cs_SR{_b7׸Td 3uwp8#7׸Td ^7]]7jaq7l>3Gғ&  !cofm6f ? j3dC hc lÕlyT+&nmbdCȸod\6\ W!cpІچ+J6d BjLY53LL!c1֍j3dC3LL!c9e&1Smc&1ly1K)2Kmc1ln̂uc,lcِ1x1 6faȆ,hc,lc6XA1 S٢n̆ucllc6ِ1xݘ ll!cpjdC6fC6fcnd㗥;,Hkb nІچF6d ^7`pSp6ȆmAnjn؆ِ1x/mmada2"sbNqsچ;N6d ,廫mcdC6ܡ w wlÝlnCj2f#EL9ńuclcِ1Lᰱ,*ke1ۘC6d nc1Gmc1lYhclÃl!j؆ِ1x  lÃl| װj؆ِ1x6<6< OO/L Ocf/$K蟒OSm$2?G究mx  OX7<6< O!c5'᩶m%?Hz2kkcsaݘ1ۘK6d ^7º1Wmc.1l}}jsdCuc.1Wmc.1l<\&1_mc>E6;NZobx놗چE6d n R6Ȇ^j^؆ِ1x66 ol[ oX76 o!c^j؆7ِ1x o olÛl܆7᭶m, Y MX X7m,6 ׍n,PXm, 2XX@6d NYm,PXm*[~{#>j>؆ِ1Q6|Ȇ8m`>dC6|  lc!ZK&B72Bƻj dC6B 6b ɆBX7m,6 Xm,TXm)4O|6| _!cpІچ/K6d nU6|Ɇ _hWmXD6V)"qv"xv"E"!c~c7m,6 a5"E"!cXXL6> ^XaXmc1ln,ucblc1ِ1bb!c}bv8+Pۼ,a[B"lK,QXba.迋m`s5-_b)n K| ~t&癡'֦~pmꧾ~ݗ1\ ??\ȁ~p1x=66d#S?K}yj) K6bKɆm,6m,6 X m,UXm,%2#BK6bȆCd;(2G,}2e2!c>b?m,6 Xm,SXm,#2ˠej˰ 1`Q1L q?<_m'2?k믶m Ma᯶m Y7jȆچ?lxq|bb,rr!c9e9Sm,6 ׍n,WXm,'2o9\mc9@6"~;I)#Y7̾EHomIdP6Ȇ8m`dC$o6!c9%P6V_7%i cZVm6V Bmcl hc lcِ1xXmPXmgV46r?@pM^jF ِ1xu#Pm#$2Sm ׍@h#Pm#XI6MQY7;+FFeTXm$2FbͲlضYVm6V +a/Rmc%lJhcJ 00agvYXe XB-caՖ5pZ:Xe,2222emmmXƶZb-c,cq햱]ݖ=a9>u 25.Ը qEnY5.׸ q2qAQ13 L'H]p 'ck\oh$ט&*q>*x>*U*!cv7g A#bO+M U*!cpUjUdC6VA6Vadc4%F0m }``l#lo}sF0L6d {0m%Rkb!FFB6d 3twHoZZ!Fِ1h#Dm#!2(Q6B6ǯ.51BųP'Tm#%2 {jF(ِ1Ph#Tm#%2. mmbadɷmoanm a*Lm# #2mmaadCtaFFl|6ЗM&jjjj!cujNYXM6d VXm&2j5dgkbuc k6`kȆMmkȆmj[XC6d NY)k6`kȆ55F8٨9Sx&FnmcdCF876±p!c9%)jF8ِ1ph#\m#XK6D&ZZZZ!cpkjkdCkZZ!cpkjkudczs71։u:NYXG6d o:u:!c֍uj밍udC6A6ad#$_'&FmDmD`dCu#֍l#lnDmD F@jF$8]rXH#R߈Tۈ6"ɆF$jF$ِ1x݈u#Rm#ۈ$2 mDmDbƽZ7v11֋֍j뱍dCuc=6cɆm6֫m6֓ XmWXml d716֍ j dCuc66`Ȇml66ml66  j6ymt~[WۺZlTha.迋mF`Fs՝mwo}s/t^{׃(M%*%AQA} R; DAQjQD׃(h#Jm# ۈ&CO +^Ĉ6hhl#l|5"Zm#ۈ&2 mDmDcdC6hhlcJ¥Q+c17Yc&lcِ1M&M&!cpMjMdCI6A66aEnbl66C66cɆcflc3ِ1ff!cجB6N~ cx>CۢB6d ol-!cp[-j[-dC6@[6`1dq8#F1߈Qۈ6bȆ8Ĩm`1dC6bl#l|"ڈQۈ6_eblnnU؊ml%2S9eVlc+ِ1VV!cpQD}LXga^܎%c6bX!c FF,K6d n#ڈUۈ6bɆXh#Vm#F6:v$&zmݦ F6dĬF6lm6m6!cp۠mj۰mdC6A6aqdcE͋qdѷ5 qjqFِ1x/{88l#lFmđ a㠍88lc;/.vX7ml6 ˿~˿]mc;lv}vlc;ِ1xخA6v&wcb<Yc;aةI6d -N-NN!cwwwwm6v [ةE6fMcو5olJgR؅m"2`إ E6d >s.].!c إ M6D-Ew}jdC069c8lߓçwobhm6v ׍ݰnV؍m&2_6vm6 :GmQ؃m!27m6 {`Gmcl|أnz>최22v2v2v2v2v2eeeeW IoSӖ3s-c,c-c,c-cW,cW-c,c-c7,חiEg?{᳟׸Td 7wwp8{5n/q{| 翽׸Td 5n>w~;O5>}>!com6 mS؇m#2A6aƚJ~cb6cɆaltsHoSRZdC~W؏m'2د8@6ݽ2[)x.x>Q8m!2q8q8B6d >6mp|ۺBu@Eba.]ۺ_^/j'n//`ۺ_=E}(ǧ53;*֦G(}GaqT(GɁ{̣<q׃$B(qTm(qllWeO㘘+pLmqlY1,1lِ1cZS8m#2OqLmql??㸨a8q8N6d ^7úq\m8qlɨ?Up[a}Ck8qlqhqlWv̀a&ƯƯƯjb UmWlW!c+mmJ6d +Ư 5Q4%6'Ĝr)'6N`'Ȇm6Nm6N ?N  !c~qBmqlT8)l6Nm6N {'6Nb'Ɇaltp؈;9WDobhm6N ׍Iod[:Mw;S l|7ooodCsopNMm7l7!co)1e.~)yJmql))lِ1r )6NaȆm6Nm6NՋgbu46NcɆm6Nm6N 8 mV8m&2q8q8C6[W& ٰ(3!c^ EϨm6ΐ }{_g6`gȆm6Ψm6Β[2Ǟbkسp {Vm,qlnuYl,ِ1YY!c^,qVm,ql$?&9ga9G6l S8m#2`8q8G6d ދ9s9!cp砍sj簍dɲ<\ÞW8m'2_Þkj籍dCyoW8m'2~8ql4L8>e&9żH;pO'ת`b\ prAmqlYlِ1  !c^qAmqlxK]㢳Aƫ%EE!c9"S.m\6. ۸m\T۸m\$2S.B6.bF=ƶ41.q ֍KjKdC\\R۸m\"2q ڸq ۸D6d nqImqlVLN\&rYm2qln\uel2ِ1ee!c~2qYm2qlqln܇6m601~7m<6 xm6m<6Ceƕcb<<6aȆG#Gc,2GL^ԍdcYTj׶726cɆm<6m<6 x m@>'j:Iw\<?$}#God/(z̏q=Hw_}GG|T;Gr czփjq=H"d ^>B6>bF^1#61> OjOdC6>A6>aȆm|6>m|6> m|Rm|6羴/]tw&ga3Ym3ٜ"b>3?>m|6>s_D n3Ym3ٜ"bghgl ٠B6X|/j_/dC6@_6`_Ȇm|6m|6 m|Qm|5g[~0U?WWs& j1WWs&Ӫeb _6m8}r;E 8#222222222222222222e,e,e22222222e,6^u=۵)d:ssA):[%}s<7c%o\:q\RO S251PSǀ_|1f # ⻠/F|l#>ِ1xoF6cɆ{.7ۈO6d Ň6m6 ʿZH`l8% m 6` Ȇm$6m$6 Hm$PHm$ 2_o'6m$6 ~jb$u#! 6b Ɇm$6m$6 Hm$THm$$2HHD67QH]Ddvm"DF"!c  m$6 ? N䂞'RHm$"2HHL6'yHbjdC6C6cɆFbX7m$6 j$dX}-L$u. pp<}7L$F!cuJNIHB6d NI)I6`IȆm$6m$6'*HuOuOHJ6dĬ|%%Tm#)ln$u#FRl#)ِ1gIjIdd6Ĝ )6aȆ{dM HF6d n#Lm#ln$6m$6 HŸ &wAm$6 \m#9l|NIjɱdC6C6c)Fs 01R8װF ƻj)dCu#)6R`)Ȇ" z(F l#ِ1c)j)d#gnb)FJFJ!cߟJ~*FJl#%ِ1))6Rb)ɆFJF*QkoƘD/ 6RaȆF*X7Rm6R ?3N傞RHm"2SRA6RaFWcfM61R~#57Rm6R H mVHm&2aHHM6d n#5Zm#5l7,L#HHC6d }QHm!2i`HHC6d /HHK6zkS(H+l6Ҫm6Ғ qG.M FZ!cpijidC6Bi6b= ^`bF:tF:!cwҹwҩm6ґ )Nm#lMmSHm',ݱH/FzX7ҫm6ғ HmWHm'2HHO6d ^7C6cȆZ֍W F F!c^4E3md62 )Am#l F vs1U`N-;sD|[|wvIk8w;7O.bOJ=N}Ͽ #J]ge{ZVFψAF2:Ȩv׃@sEF8WdTȈAF!ciFh#FFl#8eӤQ&F&a#Im#lLjLdC62A62aȆLF&L؆ pp8=ppQp6\Ȇ .j.؆ ِ1sEmp!2Nmm`ymbd=ffQdVȌmd&2133Ffl#3ِ1x FfFf!c2C62cYƻL,Fh#Fl# ِ1xF,F!cpY,jY,dCsJh#Fl#+H="MFVh#FVl#+ِ1x FVFV!c22md6  mdUȊmd#You{&fWmd6 mdSȆmd#2߷W6aȆmd6md6k;U]mdWȎmd'2S9%Fvl#;ِ1)6cɆװ١jٱdב9Ĝ)96r`9ȆWsm6r mPȁm 29j9dY%:=9Ż~9~96rb9ɆFNX7rm6r 9aSm#'lFNh#FNl{KOߋjcߓ ԍ5QZcߓ ~{ﱍɆ~m|=l =8# \.rm6r `/Km#lnu#F.l#ِ1W.h#F. 0NqّrGX^X>X~XXAX!XaXXQX1XqX XIX)XiXXYX9XyXXEX%XeXXUX5XuX XMX-0M78{)r/5.78()(Q(I6d n$QRm$Ql|mZMKm6J ?JB%6JbĊ5;v51J=RpOF)lِ1RF)RF)!cpRjRdCppcb 6Jaeb6JC6JcɆ{Ұ(Q(M6d >sJiFi!c4QZm4Ql5rQFe`QFm QlnuFl ِ1ڴ \Q(m!2S@e6`eɆxM( jedC{e^xYFY!c9,Sʪm6ʒ ( mU(m#,5('rpN)Q(G6d ~C9xC9rF9!c9Sʩm6ʑ (mS(m''}Q^N`y;6cɆm6ʫm6ʓ )R^m#!oxZ >_Q ۨD6d"FCkQl|NJjJdCT6*mT6*dü+?xQۨL6d ~qexqeFe!cw+w+mT6* ۨ mTVۨmT!y?s3Ĩ"ְUFl ِ1xݨF*F!cuJNQۨB6d n QEm Ql;]rXQ9Qld}TahoTUۨmT%27~FUl*ِ1FUFU!c3ǪBU6bFC\kbTu6aȆIIQ ۨF6d nQMmQl|ϼQMmQliQ&FuޗɆc;KY7mT6 ׍nTWۨmT'2QڨQۨN6d mTWۨm |+5`ݨQۨA6d otsp'Oڨm 2_Ԁj5dCF hF l&{3 }.nRl>LQۨI6d ^7jºQSm&QlnԄuFMl&ِ1FMhFMlp_Xك&F-Q oRۨm"2εεF-lِ1ZF-ZF-!c~QKm|t"SrGX]X=X}FƖ&f斱V֖6vNΖ.n-c=,Ԧi_ڢ7 {W׸Td >Ն_muk\mq2qaqqM5N}smXjk\mQl|/>Q_m݆#mjX-~P.\<?{~;0O.^mA}}sn?zЀ,.dxi5 w |?491@- HX@ 6` ɆGxޙ EVj dC}DCG4Thm4$2+¹FCl!ِ1\hhD6_Qɯ&F#6mצ6aȆF#X7m46 hm4Rhm4"21A6aFa!w&O191Sm46 h m4Vhm4&2g1|gFcl1ِ1ڴ1Xm1фlԪƩL&bNi&jM&dC6@M6`MȆ&hhB6d ~vihFl)hE}Tԍn4Uhm4%2l $M6bMɆ-}jMdChShFSlul~YMfhfjͰfdCu6aȆF3X7m46 ͠fjͰdcםL<$):F'lِ1wKImщlF'hF'lِ1 褶 L6h9oY)Ym3љl|3謶L6d n3Ym3љlnt6:mt6fS4(0"FX7mt6 mtQmt!2袶B6d 袶J6=e$誶J6d N )]6b]Ɇװ]FWl+ِ1x mtUmt#;p&F71tsJ7nF7!c ֍njݰndCu6aȆnF7nFw1c՟O11uJwN鮶N6d /vWmt'2>N6d ~XwhFw 1?:I*Q#?Eha.迋盤aQGs?$+Ï`Q+?zЃyGz=D=w=|ߢܷv׃@="zzЃD>衶nqK7Nzg8i9eeeeee'@ `P0pϖQі1q Iɖ)is_zRn5\S= S]zדjp멮q=qI5N5'q=5'q=5_/?xM^^j^dC6zA6zaȆm6zm6z VH/hF/l78{&Foa7[m7ћl7 {jdCް[M6d V mVm!Öeb}s7Qm!2}`裶C6d Qm!2裶K6^0eV}a諶K6d n/Wm/їlnuF_l/ِ1]:c8lqIG-Ck/яl$.a `觶G6d nOmяlF?hF?lِ1,};N-Ckџl|<XjdC{lF!c^?Em6 ׍nWmD6 w[?OOdC6~6~R l ?mmD6d n'h'dGwO1l>niclcِ12)6`ȆpN1@6d nc1@mc1l43L{сjdCuc 6bɆm 6m 6 ,Sm 6ΙcOǻnb r)Ad" A !cpAjAdC6A6aȆ1L6]u,1L6d ~`~``!cpjdCj!dcbX;&b>\B6FvҤ!jC!dCo Qm !2?slUm%27~cXlc,ِ1̜R#aS~Ckc,1l=pcX G^֕Ϳ8qvoƑGF(ŵ'e;GwLṅuc|lc>ِ1:e>\Wۘm'2aݘ1ۘO6d nc>1_mc>E6b2YK /X76 /!c륶mx ox / /lËl܆᥶mxWcfM>ebx Іچ7M6d ^7aV6Ɇ7j؆7ِ1Іچ݆#oJ-3vx- pS䛋k,;0Op~[V껿~Sۛyqt\|?T5CG>>te FGr cQD@>j>B̽  BB!coom,6  \Pmc!lBhcBl×l8^6| _ _l×l|[mbdCW}U_ _l×l܆/᫶m,"v]Oc1s"lcِ1x6aȆEpNYXD6d ncHmclLbhcblc1ِ1bb!cpjdCj%dz>ݾK%%!c^t Em,6 Xm,QXm,!2K%jK ?<Ӽ&~†᧶m  ?X76 ?!c^~j~؆ِ1 ?hOmXJ6_mp|Jcxk)|kRlc)ِ1RR!c$KsjKdC6BK6bư;g01u2NY XF6d NY)6aȆm,6m,6 /6m,6ƴA;Gf11Eu_m'2mmcdCs?S6 !c8calmcƂ2Jeb,g,g,WXm,'2S9erlc9ِ1x/6cɆrFXαgb^4jFِ1h#@m# 2nm`dCsJm {V/nb oPXm 2zz lcِ1  !cX$+eM@qvP <;(Pm#$2nmbdCh E6@!cmmb+ubbuc%+6Vb+ɆJX7Vm6V +aRmc%ln6Vm0{>LU`Xe,2f[m[c EX"-c-c,c-cQh&fXele,22gnaiemc9&jܝ9ޭe: rAqAQ1z;5.׸ q2qAk\qATd >qAx[E6raƨ&*^۫6VaȆan}z&*lcِ1U*U*!coJmcL6,a &6`!c FF0L6d 7þ9Xm#&2FF0B6D&F؋ {1!j!Fِ13!7"B6B!cFFB6d ^7Bl#l*,2G#T U6BɆۡpm ń½PPl#lF(m]u# ֍00l#l0x{FF6d n# S6Ȇ0h#Lm# XM6홒O&jqVjxVjj!c~c57Vm6V aZmc5lj٭kDX5!cpk5jk5dCuc k6`kȆ55F8٠g=O#lJ1WnmcdC/6±p!c^4jF8ِ1FF݆#oJ֭k"E'bn-;ת;0O.^mZX֪Z7O.Ϸuk=_kq=XG|ޕ0։ups`}?AzXujp=XG"d >W6֩m6"F@pO&Fx,{mD ?"6"!cpFFA6d >WD@jF$X?O/#RnjTۈ6"ɆF$jF$ِ1x HHl#l| mDmDbˊfYlb zz!czXXO6d c3MZ뱍dCuc=^mc=l&Q76Amcl|?6ml66 )AmclmlP؀ml$7w (lblSnSnT؈ml$2بH6d oN6ml66 mlT؈mDnbD9% )QjQFِ1((l#lFmD ۈ66ho|VMhNhhl#`hF4m2D ދF^4Zm#ۈ6"?6ڈVۈ66 kcbluc66aȆװv&lcِ1x&M&!cghMjd#Y mlV،ml&2S69eflc3ِ1ff!cufhcflc (һ&ыn-!cp[-j[-dC-pEmc lmlQ؂mĐ1F mĐ ۈ6b6b!cFF C6d >@1j1V8S&VolU؊ml%2_nkحjCuc+[Ɇml6ml6bFwzĈ6bXXl#lF,mĒ ׍XX7b6bX!cpFF,l۽2[k&61ls6m6!c9eSml6 ׍mnlS؆ml#2 ئ ۈ#s61:%S6Ⰽ8!c8mđ ׍8X76Ⰽ8!c^4ڈSۈ6[Ŝ)6cɆvX7ml6 ׍nlW؎ml'2خA6y_|ab;!c~QvU]!ŋkqwoݵ)Ph&! $hB,!@uy^Y{p8q8A6d 7NqBmqlo6Nm6NI8)I7Nm6N '6Nb'Ɇm6Nm6N 8 mT8m">y`b}6NaȆSp8q 8E6d c3Fb$,)lِ1r 8q 8M6n:LLzbi8V8m&2F2]:M6lۥjdCi8oV8m&2ߧ6Nm6ƓR' Ocbg3j؆;ِ1,gQw wlÝl{Xw=چ;N6d npWp㌥vR;g.Xj-5OKR.Yj>g[jZd]ԮXjZvRfZjauK톥vReݶXA=.!~d毓X7{qx;C6=&<{l~(l ِ1|g6`gȆg3p6:q8C6d >76Ψmp]}<|NȁXA"~pD6Ωm6Γ Ǐ^)fbyl<ِ1Z#? xbhm6Γ 8mW8m'2#C6cF9w+kb\qAmql| j dCs8G\P۸m\ 2G_6.m\6.db\pqQm"ql"dۙ>†᣶m 6|6| !c=m`>dC೨᣶m Ϧjb5)j؆/ِ1g3_ _l×l܆/᫶m Іچ/G6eE6 ?!cچG6d nS6ȆϾ ? ?lßl< @_)pMW6ɆgQ8mcdC?76 !cyW6M}>nbFF@6d 7`P6Ȇpm h#@m#$0z(lBjF ِ1@h#Pm#$2_Sm 66 ԭɧAbM kJFD6d n#R6ȆmAAjAFِ1a l2(Y&ea2qYm2qljdC6.C6.cɆeQTyW++!cq+jW+dC8o\Q۸m\!2qڸq&ve&F7m 66`!c FF0L6d ~ mmc!dsSך!Fm aC6Dm#!2mm`!dChm\%3Mĸ<56 !O6m\6 o\U۸m\%2*Ul*ِ1x߸ m\U۸m\#ªqqMqMmqlo\}5lِ1x߸5k5!cq ڸq %6)`* mbdCPO U6BɆgP8mbdCߵBjF8;lby# ajaFِ1ה00l#lom 0h#Lm# ۸N6k&uauڻ6cɆm\6m\6 ۸m\W۸m\'2^6m\p<s{_ej^aI vÓ$݀P;aw`><ſi~͇q~877_9%wS̘7yS}o~pMn&91x? M$2_+nB76nbƽivq v[jCqKmql-h-lِ1qKmqljB?`J1nqjdCs݆mm!cpjdC6nC6ncwFrzqGظmQ۸m!2F2#9q۸C6d ~uiQ۸m!2qڸqnޗEnǻ8-爰Zj=KRZjі#KR{j=b,XKg^Zj,xKR{k[j,Kޗpqa[GNb6 QDžN=N_8\=.pq2_qDžS1>:pu _(ih#BpPۈ6"Ȇ叀GmD`dCgl6Bm#ۈ 2SE@j]Q)L99jwdCw]]!cqjwdCpF5M d]l#l4.)oB)lDBjF$ِ1#Ha;"Tۈ6"ɆmDBjF$ِ1Hh#Rm#۸G6ڿ:vXS5=lِ19=xNwOmql9{9{j{dC6A6aF#%H1J݇q۸O6d 7þq_m>ql|}m6 ab 6c8z@o碏6cɆalyc^qD}=g_O6`OȆEs'jO'dC6@O6`OȆg''Sxl=O6bOɆהpMyxJ6d >ss!cpϡjϱdCshsl#lk11>%S6Ⰽ8!cFFG6d n#ڈSۈ6Ȇ8h#Nm#xA6l{hsb^⛆/&^m6^ xmPxm 2xxA6d  h C^/%{ O^E0kLp4wT;xiw`><g^i꿴_}هtKx_K^5D/zČ ΘW+^WRx+!cJmO6fqmp#^mē ?Wۈ6ɆmCjF<ِ1#ڈWۈ6^'V,J?x-fp|xM6d ~n6^cɆm6^m6^ ?^C6^coƮ-lb} o6`oȆה7pMyxC6d n Fm lhl-88KY&[}梼%jodCk[Uxm%2xxK6d ~[h[ly&;1;w;!c$cٰwjﰍwdC6A6aȆw;w{q󯡧2XS5{l=ِ1)6cɆm6ޫm6ޓ xmWxm| O7T+ 7>m|6> ?[>[Amlhlِ1H {m F j Fِ1xH}#Am#H 2m$m$` dC6l#HW&G7>¾Qm#lGhGl#ِ16>bɆm|6>m|6>/$7>OjOdC'O'!c OjOdC6>A6>m8a4o:ّHlXjI,Z2K-RKiR[ji,Z:K-Rhe2[jY,Z6KRsԲ[j_Zj9,Z.K+K->Qҧ9l:%r_"W):[5b/+Z1`K?1xKz_:q\S'S%rE=NFw=W01 jdC_bW%VHm$&2HHL6d %6m$6\F'}p6\  lÅloᢶm ߳"pQp6\Ȇ3v6\6\$d{+21I$jI$dC}# I6`IȆF7m$6 )I$jIdc8^ԕ$+zHRFR!cjIdC6BI6bIɆm$6m$67\9]2WtNLm#lF2h#F2l#ِ1dF2dF2!cA6a^{tib$w&wE&WHm$'2=+=Frl#9ِ1FrFr!cHHA6wOLbHj)dCF 8oPHm 2?MpSm6R HmPHm$G^$61R:mt?diȾRm#%l|MI הj)dC6RB)6Rb)Ɇ))j)TdqSCX#+?OSm6R HmRHm"2_SR5%F*l#ِ1xHmRHm&Mξх4R|2)OHM6d n#5Zm#5lo}#Fjl#5ِ1Wjh#Fjl# وnxתFS}J4F!cӸӨm6Ґ 4oQHm!2HHK6ަ>/'HdjidC}#-i6biɆm6Ҫm6Ғ iji6y}j~l-l[|]~俟WP;|x?k_د9^/ 5ϱs ^:HW?"tN ȁ'I'It$B Nm#l&Fzqn[WHm'2ݺwҫm6ғ HmWHm'2H@6^ nvW62`Ȇmd62md62 JAm#l,<Am#l|bALod}#FFl##ِ1)62bɆ4FFl##ِ1EFh#FFl#Lq\2weRȄmd"2dLjLdC62A62aȆLjdc112sp'Ym#3lfM1"kE>L6d n#3Ym#3lFfh#Ffl# ٘}BJ&Fg0߯f!f6md6 ~Em# l|,jY,dCkJh#Fl#+X~l5Lod}#FVl#+ِ1x FVFV!cpYjYdCFVF6jJMlF6h#F6l#ِ1 6aȆ6F6l#ِ1xmdSȆm z*)p⪶m + W WlÕl\]ombdC}pUp6ƹ~p6ܠ 7 7lÍloᦶm )npMqSp6ȆgQ7hMm N69LbMהjٱdC016.;ƍȎmd'2_S5%Fvl#;ِ1FvƗd~\˃_%_m|m|I6d 7}K//Ɇm| m|%%ِ1%ƗFAr!l6rm6r mPȁm 2?7rm6r mPȁm$ɧ,;wSwSm#'l𞝜j9dCFN8oTȉm$2ߧ6rm6r F-> 71r \j\dCg_W.\F.!cp\j\dC6rA6ra_6J Jm+l+!c_m|m|E6d >o|獯66"2E6R M6*_0d#XSr5%Fnl#7ِ1x FnFn!cy#77rm6r j6䱼#Ro Zj_[j,–ZKVR+nJZj,ҖZKVR+oU*Zj,ʖZKVRnհjZzQ`Gg1y=.qy|׿<|F>!c9Om#lߢ#aȯO6dd"FrCk#?l|njdC}#?_m#?Ql;?M&FaQ@mQlo}Flِ1x(FF!cpjd&FA1hAFA!cpjdC6 B6 bɆהFAv6M6lk"̇'=~klj_Oft~8Z5V_W|xjik5蚻[͖C^!iA! C4>-~!/A!2`?(vPB@03Cy8g1" ~PDܾQHmQlyRꄉQX? GaFa!c$1P(Q(L6d ~nQ[V(m&2_+ C6 cEF[O11w+Q(B6d 7QDmQlFhFlِ1uE"jEdyNMLbQ?m6 TQWSE6bEɆg̢p,Q(J6d 6m6 bij6aȆF17m6 (mS(m#2Q (Q (N62bbFq8oW(m'2F2F8ٰ-Q(N6d n8Q\m8Ql|(mW(m }QiFil4ِ1FiFi!cpjdCߓ6Jm6ʐ>!QśeĚR)e6`eȆm6ʨm6ʐ )eRFm Ql| QFm Ql^%&FYa,QVm,QlFYhFYl,ِ1FYFY!cQ(Ql8^ FFml!cs} ِ1)SQl|hordcuQLr|<(Q(G6d nQNmQl|(rj對rdC6A6a. &Fy7þQ^mܧTPۨmT 2QڨQۨ@6d nQAmQl|[ڨQۨH6|'9oebT6*B6*bɆmT6*mT6* ۨmTTۨmT$2ߧT6*mT6*fi JF%JF%!cy7*mT6* #\ UImQl|ިmTRۨmT&O8]zuQ7*yFel2ِ1FeFe!cQjdCFehFel <:2&FLnxGh*F!c5 \SmT6 ۨmTQۨmT!27@U6`UFzǝMb[amT6 7*|ovUFU!c5*\SmT6 )UjUjd#Og015\SmT6 joTSۨmT#2`ߨQ ۨF6d 7A6aF;331QjձdCWWWۨmT'2QڨQۨN6d >oT6mT6jDQ7w5Ȇ56j`5ȆgpQۨA6d nQCmQlF hF 15M-o5$Մ;ךj5"̇'=:9I ߑ]S݁gjoLj~M7}xJ}Մ׼״_s{_/˛^ޗZsԶXju-zZ}KRkd5ԚXjM-fڷwZsKRkeԾ~Xjm--vZ{KRduԺXRzWIahZh-Z%zYשuS.>&YbVZpgVQ ۣZ-l2kWKjᙧ6`Y|.&Fmq6[p6jcɆaѝ16l?V[m6Ql|]km6j ۨ mVۨm!ӿhoY/QڨQۨC6d >ׁp:F!cym6 u:judcypuK]xRWm.Ql|]m6 oUۨm%2? mUۨm#֞ϳQOzoSۨm#27yF=lِ1EE6aȆהzF=zF}qc11ꋾQjdC6C6cɆהpMQۨO6d n>Q_m>рlxg@hm4Phm4 27yFlِ1FF!cp j d#4ev3MbMiהj dC6B 6b Ɇm46m46 hm4Thm4"G%gb4}6aȆהFpMihD6d nHmшl|mm4Rhm4&&;9bXưo4Vhm4&2hhL6d Oi )6cɆFchFcl HӠH5&F7Dm фl|Miה&jM&dC} M6`MȆFhFl)ExELξѝ4 WRi4Uhm4%2hhJ6d m M6bMɆFShFSl(A&F3cьl88ih)LmьlF3hF3lِ1xhF3fF3!cY^WG7}xZik#蚧֨C1]}?G;v#2_+ZD;ڑvF;vF{z4(mo^aghhO6ddlܞlض6cɆ]>^m=ўl3&^m=сlS8;;mt6: |KF!cjdC}AmёlTEFGFG!cΎ1Ÿmt$2訶H6d 7:B6:bF21:y7:mt6: ?:G'NF'!cpNjNdCpw:c 6:aF+'#21: jdC0}3zGgFg!c3LFgl3ِ1s9c8lZ}{Έ2Fgl u[]Ě)]6`]ȆF7mt6 [t;.j].dC} ]6m8/w8nZwKReXj}-,~ZKm6Rd ԆXjC-apKm6RelXjc-qxKm6Rdy?LWq㻕tQשq]aq]qJ=NH&b4q]qJ=N_WuUu'c+\{\Wu# ;^lbtKߗMmэlnnjݰndC_7uSmt#2 覶 N66lش]]m;ѝl|6gjݱdC{pO]m;ѝlFwhFwl{N=`衶A6d nCmуl|Mהj=dCss87Pm$rUS)FO7zm6z )=Sm'ѓlo}FOl'ِ1x FOF/XR 襶 E6d `/`/^F/!cp^j^dCp_䌁F/^FofΩ-MFohFol7ِ1FoFo!cpjdC6zC6zc}F_2hb{>pGmчl{>{>j}>dC6@}6`}Ȇm6m6 5)sllb6B}6b}ɆgѾpK6d >h_F_!c516fXdfbhm6~"9n51~kOpMIm'l'!cp?A?mmD6d 7~}'Ȇ 6~6t_i|ߏl^.OmяlF?hF?lِ1~F?~F?!cgdA6aFJ315?\Sm6 Ϣ,_m?џl\?<O6d 7C6cFS\Mγ/7 @6`Ȇm 6m 6 o Pm 2Ff1@mc1l831yc 7m 6 )2Pmc 1l@hc@lc ِ1@ ѧO PAߟ1D6d 6aȆ{{1D6d hc lc01ż16cɆm 6m 6 1Xmc01l`hc`lc٘svx&u!d?T}clcِ12)C6`CȆ7!jC!dChc C^C[Wn(C"EO{w>[7ؾv0|x?y"D1T}گݺU_ k m20p?FW_ap1L`ȁ0E `19 1 N6NJ6c jñdC0߽w@=bplc8ِ19Θ6cɆp\MwG 1A6d 7F1Bmc1l|o:$#6F`#Ȇhclc$ٸux&H7F¾1Rmc$1lܑܑj#dC6FB#6Fb#Ɇm6Fm6Fgk|YQjQdCQp1Jmc1l|o: MGm6F mRmL6>}8D~Vlܢ3Æ޶ Ckglg!c3?mmL6d >o m31l81&h7Fþ1Zmc41lLk4<1M6d O )6FcɆ-FC6FccF˃7180I1!cYt EǨm6Ɛ 1oQm!2c1jcdn˃MققjcdCX8oUm%211K6d 7Bc6bF01Ɖyc7Ʃm6Ƒ mSm#211G6d 7A6aFB01Ƌyc<7ƫm6Ɠ )2^mc<1l|j㱍dCxY:5x1Amc1loL}clcِ1vNPۘmL 21ژ1ۘH6F癉1QؘmLTۘmL$21ژ1ۘH6d LkDD!cpjIdc^,: ΢6&aȆהIpM1 ۘD6d 7&1Imc1l|mLRۘdy?|#ΎɖxLԦZj, Km6Rmͱ~Zj,KmR[l-ԖZj, KmR[mZj,Km0ǭ;w@{iqaqqL=NdMVɸM'co2\&{d&S1x {du׿)dc[j^S~{ oOQۘmL!2_olc ِ1))!ch 1Emc 1lSS<S6bSɆT7mL6 ۘ mLUۘmL%2? mLUۘmL#^NXĘ&47mL6 ioLSۘmL#2?bmL6 ۘmLSۘmL'a]F5*1]ؘmLWۘmL'2aߘ1ۘN6d 7þ1]mc:1l|ޘmLWۘm _I'1C<;>;Cmc1lò}c lcِ1  !cyc1Cmc1l8njĘ)捙pޘ1ۘI6d 7f¾1Smc&1l,f&<1ۘI6d nc&1Smc&1l] ELYYYjYdC6fA6faȆYpޘ1 ۘE6d >ô6fm6fUc7fycllc6ِ12)6fcɆהpM1ۘM6d >ŏ6fm6 018xٰlcِ1xߘ9!cps9js9dC}c1Gmc݆!_[mٺ_i/jEO>ٺ_;+Q;|x?g~W~͇fuk\-7׹V9b.]⛆/&爹?te ~0W`.sɁ爹p1$B3\hc\lc貪YyMLybyjydC6A6aȆᰑ(Q`MagqKbz$,[7_mc>1l|ƜgjdC{po:_mc>1l|mWۘm, S>;s{[c `XX@6d 16lG.PXm, 21)clcِ1c@mcl,~xX(~7{+j dC}c! 6b Ɇm,6m,6 ) j Edcˡo41Es"lcِ1a E"!cYtEm,6 )Ejdุ-o,&E3=h1Xmc1l|] gjdC}c16cɆbhcblc 8_n51%jK%dC..QXm,!2EYtlc ِ1xXm,QXm,%!0XEyRa{RR!cjKdC}c)K6bKɆRhcRlcpo:u:!cp렍uj밍udCu:uz1Fc&zkzz!cj뱍dC6C6cɆjX@6iԍ46"tsOIAmclol}clcِ1  !cn&Amcll\'ڝ46 ݢ66bɆgэpݨH6d O)66bɆ獍Fva70,lm~~ԶZj,KmRm~Zj,KvR;lԎZjZj, KvR;m[zܾm36nֿMV?rۤqpD=N=nq=nq7E6٤qpD=N=nq=n^6 '616;l&ğff!cy37ml66 Ymc3ln3Ymc3l~<7_m!/䶨ml6 -olQ؂ml!2آB6d nc Emc݆!_[WVzzyW_"~0O {įjO>ٺ_U}_}هǺq~8濪Fhc>lcِ1>hc>lc?8bQLjdC}c?6cɆm6m6 ~d÷SSM?>OCml!cN9t*Y ??Ȇ>wdC}h?dVS513lِ1x.z@mqlhlِ1>q@mql<)I: {IvSNUꟴ_}هLIxOIN5_q =s S]}qJȁSP)S"2?:mR8m&x8-l6Nm6N MOýii!cU1RӪCk4ql|8 mV8m?kMpwjmcdC0sD;g ˎW,ֆ;N6d 7apWp6ɆmCjvg}" xg,9KvRhyZj^vR|-5?KR - KvR B,5K-R Ԯ[j7,-Kvq^)a!?y{qd W{%u=΃z{q{88<=gF֑[M3sln9q8C6d ~rΨm6ΐ g,g6`gȆX@g6`gƣ8+fp6:q8K6d ;ÆϪm6Β 8 mU8m%2.,qVm,ql8&9=$o#ս_|9lِ1~oS8m#2_S59lِ1r8q8O6(fE㢸"El"ِ1k_}Qm"ql|޸獋jdCkEhElÓl~&x&>멶mx  O7<6< O!c چ'I6d O6<6< /ѼVn箘^| oxmxa^dC6 / /lËl|چE6d n R6F[^71FD/k:bxS.>*xV6ɆmxCj؆7ِ1 oh[m&2_S o ol?p`߸q ۸D6d nqImql%h%lِ1K%K؆٘Q&ӆy߇l|rQ6|Ȇm@>j>؆ِ1,gQ lÇl|M6|6| _Ǻ|ombdCg_Wm%2ombdC{X_hWm#?aKOS>Om#2mma~dC?OS6Ȇ?hOm'v&7᯶m )pMW6ɆmcdCk?᯶mkb_ 8om`dC6l#lom @jF u&F7m 66@!cFF H6d >oBjFxP;әAN 3opϹro\6.m\6 :ab\}]}]Q۸m\!2ߧ\+jW+dC} W6`WȆm\6m\6ɆT}bFF0L6d 5%Xm#&2^">/m 666y8B-gBH_LmZvIهl]9mȯ?p)f͔Gfد~.^5*]*Vл*戫pWq?JW_O]O]U;Ur c*\+E\*1yڸq۸F6>JZ.c8Ӻϴm\6 #| #|Mmql5h5lِ1Zq ڸq %p*P8GmbdC@C6BP!cG(mbdCFF(F6M0~/lٰ S6Ȇa֔N#^,FF6d Z-Lm# #2_S 00l:٘PR&uquxuu!cy:7m\6 )r]m:ql|Mm\W۸m  fkĸ!fpq۸A6d sa  !cp7j7dC6n@76n`7F]!mLMhMl&ِ1MxuSm&qlMhMl&ِ1M-oY=:>ܧR۸m"2?Ӻϴnm6n v jR۸m"2EoA6naɆGz*Ÿ-)>ml6ِ1;@nwV۸m&2EoYml6ِ1mۉL;bg;jw;dC8Q۸m!2w`߸q۸C6d ܁6mܱp&#Ύp{<",ZvRo=Ԣ,ZR{l=ԞZj,K-R{nYj/,+K-R{mZj,K-Rh}&zh;_p/\q 'c}{\88pnWp©| =.\A6g#BpnPۈ6"Ȇ87GmD`dC6"l#l.ڈPۈ6$/01]߾q۸K6d ߾ w6bwɆpnq۸K6d >݅6m6"FonbD FF$I6d 7"a߈Tۈ6"ɆH87GmDbdC}#ڈTۈ6_Hkb݃S۸m#2qڸq۸G6d 7qOmql=h=l>٨W&}1އ}}!c5>\Sm6 ۸mW۸m'2EC6cFeɻ2183o̔zxD6d nHml|am<6 ?xxL6nKc&c7þXm1ldcSWg ~qXbhm<6 ǰo&,,'!cn+蟒xm\݁~?[ ^g~͇f#5p?k~{z1bsD~CW_߽cbp?!21cA 1Yx mĒgxfb:F,0FF,K6d XXl#l|"Vm#ۈ%2 mĪmbƧ #MjϱdC6C6cɆgp|xN6d ~xۈ#Kebĉ5%)qjqFِ1ה88l#lFmđ ۈ66Ⰽd#a}?51^j/dC}/6^`/ȆהpMyxA6d xmPxm$e.7K؛{ӗj/dCHƈ$6/6^b/ɆK7^m6^ i6^m6^ г睉J< >JmlWWjWdCz Jml|MymRxmē~]R%ňF<76ⱍx!c$cDɆhF<O6d 7a߈Wۈ6Ɇהxh#^m#xM6zvjx-֔pMyxM6d 7^þZm5lo}kl5ِ1wﯡj7dcRmҙo77!cg::c8ln+{xC6d ~}Qxm!2xxK6fr22Vx mUxm%2ߧjodCpVm-l[h[lXwȡ9Lw\<}xG6d ^wR6aȆwpxxG6d Q@6ީm6ޓxܧ{ޓgv6 M./{{!cjﱍdC}=6cɆal9c8lR7{5e $Q Ě)6>`ȆaE;;c8ldTonE?@6d nAmlFNgĈ)chm|6Ȇ,eb$%NpEKm$ 76!cp FF@6d ٗ3ZS6d#:)(7>jdC0}3Æ>m|6> S>}GG!c5#\S>m|6> zj5㓸GG'lِ1x'O'!c OjOdC068c8lZQSdF&RsԒXjI-dZrK-RKeXji-/,tZzK-RdeԲXjY-lfeԾrXj9-\WZn/}>ϼ19BN?1;w|ߩc-b ;u O >%rC_:\KwNmHaۉɆʉ6cɆ׿nhKHL6d n#1Xm#1l{Ԝ1j }Ϫw.n|nvqCsچ B6d ݏEmp!2٘#?p6\Ȇg#74m`IȆ㦆mL$ξaIȆְܜDm# l$nG}WUlG!$=!N !B$tޛޕJHGzU.^EHx=k׵|߻s{֬Z*TF*!cZN5|d16RaȆm6Rm6pu 7 7lÍlfwwsq/"m;}3gLvqw}sq/O8{A eq7!4껟׃4te ^zF iȁaAyW ҽЊHA!cYu@sE4؆٘xl@Ү~&طj؆ِ1Fxmx`dC6<  lÃl܆ᡶmx 狳վ61<}72>O OlÓlnxº᩶mx Hp@3چ'I6d mxmxbiƆn8H+l6Ҫm6Ғ H mUHm%2YwpX35bhm6Ғ q| ?16bƁWf>WfFf!c^+ӆyL6t>L6lF6!c ,F6l#ِ1٠ljٰd[ `bdsJv8dWȎmd'2M]16lmd6 a/]m#;lFv؆p(uu  lÇlC6l[p>j>؆ِ1x  lÇl܆᣶m9eq6| _ _l×l|Nsچ/K6d ^7|aU6|Ɇϣ6|6|dcD&Fы怽hF!c֍j9dC6r@96r`9ȆFh#FlÏl9:L ?o~Om#2~nma~dC?NS6Ȇ866dԄ&˿11r 9j9dCpa FN!c~#'7rm6r asB96rbdfO8A1E  lßl|Nsچ?O6d ^7aW6ɆmCjF.,NM\\j\dC6rA6raȆ\ȥ E6d o6rm6r 7gebrgm6rcɆasm6r ׍ܰnVȍm&2_6rm@'|h#F>l#?HL;m&F~Q7ú_m#?l|-??m6 ׍nWȏm'2_+6m6 G_W(`l1u٘Ø*FF!cut.Q(@6d ^7 Q@mQl=FFAfþLb c)Q(H6d ^7 ºQPm QlnuFAl ِ1R(Q tp FjFِ1xu#@m# 2c {,jFِ1h#@m#(D6FnQQHo6 aȆm6 m6 ׍BnR(m"2_6 m6 wdb&)R<,)L6vthaFa!c5la-Q(L6d oFaFa!cQ(Q$+Wo޳(}jF ِ1xu#Pm#$2ݺ@ujF ِ1@h#Pm#"ۻ;#k R6Ȇ1PR6Ȇ 8maAdC6 l#l~jB#Xԍ`X76`!c FF0L6d ދ^4Xm#&266"djJ;Q(Q(B6d LL"F!c~7m6 E"jEȾUmMa#Q6BȆ1RZ!Fِ172!l#lh#Dm#(J6RL6QԵ5{_EɆǢjEdCpRQa[.U(m%2Ea(Q(J6d >6m6BɆw241BEu#Tm#%27Bam  U6BɆPh#Tm#(F64~&F1N))6aȆF1X7m6 ؈qi8m_xHCkQlF1hF1l#lL0Q7`S6ȆFajaFِ1xu#Lm# #2S 00l8(.#MFqhFql8ِ1A[\m8Ql|8*Q(N6d ދ6m6J: L0(!l6Jm6J !buJ F !cp%j%dCuQBmQl8XjTxF_>/Q(I6d oFIFI!cuJIN)Q(I6d /Z(Q(E6&F)aQJmQlRRjRdCu6JaȆF)hF)l4zΞ MbN) jdC0h W }m:58Y Fi!cpjdC6JC6Jcdc _^ab5l8\ÆmcdCpN W6Ɇ)jF8ِ1mmcdci}绉&FS"mD ߈Pۈ6"ȆoDmD`dCFF݆23曤2pZDsq7vI*{2je>Q2o..fwZ=/ep={~Nk; HSZ <|V/Hݏ a֦M]1\7#:0Y H\"ɁH8WDEDzI"d ^"HHl#l\\I&FF+ӈ"κ0KӈRۈ6Ȇ(GDmDaQdCQp3Jm# ۈ"21((l,xmSַL, {̲jedC6Be6beɆm6ʪm6ʒ U7bM dFYl#l8?mbDlߐ&$jF4ِ1hh#Zm#ۈ&2 mDmDcdChh#Zm#ۈ!RvĈ1p"Fm#ۈ!2ӊ}gF C6d n#ڈQۈ6bȆm@1j1F,Ĉu0kXъ~LDb6bX!c FF,K6d n#ڈUۈ6bɆmBjvs_ҹ/ړ^0γ8,s[[,c,c-c$X%XeXXUX5XuX XMX-ǖږ:zFƖ&fƜ?U])NqoS׸8\|_G5Noqp&N]p'c5Uqqrd#~u~71 堍rj對rdC6A6aȆrp+Q(G6d >6ʩm6F\U{fbċor7jF<ِ1xo{xxl#l|.ūmcdCu#ڈWۈ6ʓwN(/FyX7ʫm6ʓ !boʫm6ʓ ׍nW(m'2Q(QH ]V&O#ĄQۨA6d nQCmQlmPۨm$Q&FMQ7jºQSm&Ql {њj5dCkؚp [Sm&QlFMF-Q{̺&F-aQKmQlۺZۺZjZdCu6jaȆEkA6jm8?{_c8|]uq&Xcsq/w]H8 o..mzPyzVЫ-AmXj~m\jݗ1L ,Am\j׆{"jzPD| mVۨm!#>Ohkbq0]1}esWGmQl:ju:dCsE8WQۨm!2+@u6`uƸOsdbՅUۨm%2icu6buɆ-}judC6Bu6bƜMzg輦#b^OmQlnԃuF=lِ1xݨF=zF=!c=zF=zF}ǥLnԇuF}l>ِ1^x}wWۨm'2QڨQۨO6d UڨQh@6_kOdvBF!c֍j dC ꤁Flِ1xhm4Phm4$@x!|FCl!ِ1^xCPm!ѐln4uFCl!ِ1xhm4Thm4"M6eeԍFdt_rHmшln4uF#lِ1FF#FF#!chhL6ݽTxNn5Vhm4&2ahhL6d >4sJcFc!chhB6YD}5{_M6`MȆFX7m46 a5l&F!chhJ6ҙ&FSNi )M6bMɆo ohJ6d ^7ºTm)єl|)Tm)ьl2rݞf4fjͰfdCkfp LmьlhfjͰfdCsJ3hF3l9("~u&Fs14sJsFs!c99Sm46 )\m9ќlyJshFs 0|0?3;ZXhikekm2e3疱6v/,c-c,c-c,c-c],c]-c,c-c=,c=-c,c-c_Zƾ ӂj\bo6Z5U jq-pkA5Np-Tl[B-5q-|k׸Td 5Ƶ_KAh)l6Zm6Z -aRm%ђlon j-dC6ZB-6ZbF01ZިZm6Z  JmъlF+hF+lِ1;VjdCFkFk!c֍jdCsJk8Vhm&2ߋi mVhm|B6Fu`b|"b>{1m|m|B6d S7b8mܼ'0Y OOȆm|m| ِ1zhOO̺LOOO6>6>%2٘i[yICkSlS!cpƧƧdCuShSO}uL Lm3l3!ci#jW"C ln|gja ׍Ϡ6>6>';ne?r\O9|sϱɆA6rpHxK?d16>6>'29dC6>6>WhC6N,zmD/m6`mȆA6\?m҆l~ڤFl ِ16F6F!c9 Fm іl\l|Lb-hhK6d }Uhm%2hhK6d n-Vm-юl#:mt6: w{6:`Ȇjdcz3&FGo[tTmt$2#?:mt6: LQm#ёlFGhFGl7G?/kmjNd~+?!뤶 D6d ^7:ImщlF'hF'lِ1 褶 L6;&FgotFgFg!c:ó:mt6:  mtVmt&2_t6:mt6u-lbtq)ES0=]6`]Ȇ.pN颶B6d ދvh.F!c@]6`]ƶ'L j]dCu+]6b]Ɇmt6mt6 )]j]nd9Lnu7 sZLꦶ F6d otF7nF7!c9Smt6 )ݠnjݰdIE6cɆ1М]m;ѝlFwhFwl;ِ1FwFQ֢=3p糇Flِ1~=~=6z`=Ȇm6zm6z Ȳ@6zm6zSN[)FOX7zm6z )=Sm'ѓl|'ꩶI6d 詶E6>]ޢDžL^F/hF/lِ1̜i3߽6zaȆF/X7zm6z ^jdbӃLbN jdCph[m7ћlFohFol7ِ1\FlVm|I6zvbb|)l| m|%%ِ1yt_Tl| %\~%%ِ1ƗƗj_b_gz31sWpNJm+l+!c8D NJm+l+!c_m|m|E6d o|m|чl 8{CI裶C6d 34spڰ=飶C6d ~mxm>F!c~GmїldUbp諶K6d F_F_F_!c֍j}dC}j}~dcFD6aȆaְ-\1h綤xd16aȆm6m6 )~jd#OGcLnuFl?ِ1:?\Wm'2S9Fl?ِ1x/诶@6>1@ 6m ·'|s<Y[ƆXƾ}cjfnaiemckgo`hd26262626262626262elel|T襆in n 5n 8aWfV.\ߋۺaZksqwo뾆wk~=kxϿVq=E-5XQop=oor cz Z7|C"d ~77j`CFl`b }PG Um %211J6d 2 Um %2ߛ m Um #gw76101 F6d 00a0!cpàajðadC6A6aF߾H.1N6d ppp!c9e8Sm 6 ájñd;LbOk1A6d >s!c1֍j#dCuc1Bmc1l|Ucͷ#AA1Rmc$1lyHoHlc$ِ1g#g#6Fb#Ɇ-FB#6FbȆW.11Fu(N1 E6d o(Q(!cpQjQdCs(hc(lc4٘|ƣM&hыhh!cpjdChoVm&211C6W;c{c{c6`cȆ1pN1C6d nc 1Fmc 1lmQm%gϳ1V)c2Vmc,1l1K6d >sXX!c~c,1Vmc,1l݋&8ac1Nmc1l|2SƩm6Ƒ Su8q8!cp㠍qj㰍dcs+1^a1^mc<1lnucxlc<ِ1xxx!cC6cF˛kbL6&@6&`ȆmL6&mL6& ::Amc1lmLPۘmL$+ Lbk"1ۘH6d )6&bɆDX7&mL6& ۘmLTۘmL"5Li1I`1Imc1lߘIjIdCIp2Imc1l$hc$l[q ߊ5p ƷƷdCu[X7Uln| Ʒjbߒ Vm[lc2hYBsGdd!c~c27&mL6& S&udd!cdqTFSĜ2)S6`SȆNamL6 )S2Emc 1lhclc*٠ƛSTT!c8D T7mL6 ۘ mLUۘmL%2_N6mL67m>Ę&lL6mL6 M]16\7#:0Y i4!c~c7mL6 ׍i4it1iۦ3tt!cutN1ۘN6d ^7ú1]mc:1l|_t:1]mc:1lXG& 5}Pۘm 2Sb8me\d16f`3Ȇm̀6fm6f Sf@36f`3ƤekUĘaLa;nLlc&ِ1xݘ LL!cp3j3dCuc&1Smc&1lP3Ę%Eg}YjYdC0!ic3d16faȆm̂6fm6f Yj6|gIJg &;a+ߩE|ga.St}9iWl66ml6~ O%ACAml!cgh?gh?mm@6d nhȆ~6~PB6^`c[`آB6d ^7Emc lhclc ِ1--V}WS[]nl%W[6b[ɆVX7ml6 ?_ nU؊ml%2تF6R Mim{Z6aȆlIml6 ׍mnlS؆ml#2_l6ml6]6AM)6cɆ-}j۱dC6C6cɆ{vә;D!c~c7vm6v );CmclNQBbLNhcNlc'ِ1^NSmc'lNhcNlc'ِ1x mT؉m"{.%):e.lcِ16vaȆ]pN٥ E6d o6vmps^{"̎ݖshc>lcِ1x߼اO6k&~o~~!c8D _mc?l~hc~lc?ِ1xmW؏m ߝ}?8 όm6 !b9lِ1!cAѷełLbN9甃jdCu 6bɆ88q8H6d ^7B6bȆ^!&!aqHmql6aȆ!X7m6 8mR8m&c[31uaN9q8L6d V8m&2q8q8L6d n0qXm0qld]7&ы#!c~7m6 8mQ8m!2_6m6ُnbQ؋U8m%2S9Ql(ِ1xqG6bGɆ{ѣQ1P۱`bqLԍcnS8m#2C@1c1!c1N+.L{GZǰcdC6m6~$o5B#ƏƏdCpƏj?b? ׍aQmGlG!c9GhGd#ܹW8.z=q8N6d zjDZdC6C6cɆ{q  & Q7NqBmql==j'dC6N@'6N`'Ȇ@6Nmp~wLg j]ۿϷu?' D~Rw\ܓ]߭ '\N=?pʆIu׃te ~IxI$2_"NE$1xq8q8E6,-u)lِ1S)S)!c>qJmqlH!^㴱dó6NcɆa-b8m'q۸H6d n"qQm"qln\uEl"ِ1rڸq۸D6V&E'.m\6. s sImql%h%lِ1xݸm\R۸m\&GTHjb\prYm2qlٸq۸L6d n2qYm2qlF&qYm2qlxJޱ=L+̱+̱+jW+dC6@W6`WȆװWl ِ1xݸm\Q۸m\%,ĸ*߸q۸J6d _U۸m\%23 ̯m\6 ۸ m\U۸m\#'|k]kb\u6aȆٹٹq ۸F6d nqMmqlm\S۸f{>O0-xܰݴݲݶݱݵݳjo22eeeeeS3s؟Wז7,c,c-c,\WY麘ﺺ]5:8Faot]]wjbýw׸Td uX㮫ku< ׮;k01n=p lِ1  !cnm6n ۸mP۸m$'8_l01nM޾q۸I6d OwT۸m$2_o߄j7dCMhMlxkqK)rKmqlnm6n ۸mR۸m"2q ڸq ۸M6zun&72726ncɆmX7nm6n ܆{16ncɆm܆6nm6gboQ۸m!2C@6m6 ۸mQ۸m!2qڸq۸K6Fwcbu.w6bwɆm܅6m6 Su]]!c}]=tO11q֍{j{dCp={=!c~7m6 ڸqnׯ߭6mݯU-Wsq/>o~_~;0wWxU_w\ܓ]o~W=׃t{,CXއk׃te ^zp_>Ɂ}(Z}\ju>.4M Mm7l7!c8D T#~S l|O7oodC{ZAmm< %+q@xmTxm<$2pl^|xH6d n!Pm!lChClё}LGbNyGjGdCpxxD6d >+&3Ny)6aȆg~g~ xF6d nLml3h3l9x_MxjϱdCphsl9ِ1ss!c~9\m9'M?E֍?66$2_ װmmI6d g'3SmOlO!cuʟƟjb/ȆsC& Q7^Bml|Nyj/dCu/6^`/Ȇm6^m6^i3 }x)x xxI6d >sKK!c𽯗pKl%ِ1xxE6:\Rxm"2 x xE6d ^7^Jml9+h+l50'kk!c5k}xM6d okk!cpj7d#lz3&1s7!c}7p_l ِ1)o6`oȆ77[a/31ފ֍jodCs[8Uxm%2xxK6d n-Vm-وoqdK&_5 /Ȇmmِ1x7R l|/h/wdUmDx;w;!c~7ީm6ޑ `Nmlw;w{AOoEx{{!cp{l=ِ1{{!c{qiUE?^lِ1AmljdCh |>u"χIs<>YԖ1wX˘e222eKo`eeeeeeeX|-c9,c~1X.Xn!EGc~5Rո{ʿN!VuO ^ROָA5n`+~Y8H?1xKj=u mG ۺ|">0wct.z>;0wgۺ|Ѫ#~=Ӹ#=wKIo=2RAS_Ĕ껟׃te -Zb8l1B:HAJr cutJ("ZDJ\R׃FJF*Os|T2RHm"2_+EkTjTdCp*_RHm"2cImRHmoOhو>r݌h[!njn؆ِ16Rxkb8mH\%m  7X76ܰ 7!cmmau=dW&Cc:6؆l|ofjlA6d nm86؆ln8 چHM6w~ebu#56RcɆ#Fjl#5ِ1FjFj!cHp'T. womcdC;76ܱ w!cYw_7뮶m ͺCjFسb)OS4&KHC6d >sJ4F!c֍4ji4dC6@i6`d#わ;L _=P6<Ȇy  lÃl|)j؆ِ1 hCm$O$,<Ɇm੶mx  OX7<6< O!c 놧چ'I6d ދzBjFZR:#iaHHK6d ^7ºVm#-lFZh#FZl#-ِ1FZF:qxڶ)36\æSHm#2`HHG6d ދh:tF:!cuJ:h#F:lËlԤ=8K66 /!cu\xmxa^dCu / /lËl܆᥶m'+ޗ__^m#=lFzh#Fzl#=ِ1FzFz!c9%=^m#=lЯ|w|w62`Ȇmd62md62 )Am#lFh#FlÛlK2-zQo؋zmxcdCཨ7E6 o!c}yj؆7ِ1V62#~(FFX72md62 mdTȈmd$272md62 jLdy@&F&a#Im#lyJ&<%F&l#ِ1x 62aȆmd62md62!*}70,ld62md62  mdVȌmd&2aȬL6d >d62md6 :Q "eڲmd6 Y`/Em# lFh#Fl# ِ1,F,FV1ǭ^# 7md6 ԍfNG~Y6bYɆmd6md6 SBY6bFξ--fbdlpMm#lՍljٰldCF6odSȆmd#2nĚF6lFvJمFvFv!c=fN5[Yd16cɆFvX7md6 ١jٱ a&mm`>dCkXQ6|Ȇᴑ"XiR}&>nHCk!2?Q6|u=& mmbdC0u+FS7,ֆ/K6d >9Wm%27| _ _ 197I7I9$ZDsq/7I9z5Asq/orC}sᄍ'?{?;9~pO}p=/c~j~~SDA~j~FNQԄ&˛9žENXrm6r !b2rm6r 9aȩI6d c6rm6ƹ#*$†?᯶m  X76 !cچ?O6d nW6rӪf]%r=\j\dCu#6raȆm6rm6r mRȅm&:%&FnQ7rú[m#7lȭM6d >sJnFn!cFnvs_ֺ}ѝ"φqőr>G^X>X~XXAXeee,2d XƊZB-c,ca▱RҖpXee,2e+kXb-׹ ZS1_u˃k\q2qy`ˣqypC5NkOm#lxQ##kx11 F (D6ZqOF!lِ1oERHmQlF!hF!lِ1x(mR(m&<][ XjdCu06 cɆ{°-Q(L6d n0QXm0H63(F jF ِ1s@\0Pm#$2mmbdCsJ m_bbwςgAjAFِ1&N9Ud16 !c9%)AjAFِ1 h#Hm#&U|+#eìS36W=``l#lnúm ׍`X76`!c9%V6_\;'MDnk"|5Qm#H$2DSjF"ِ1x/{DDl#lM66$e11Ĝ$$l#lIjIFِ1xHu#Im# H"2H66Jd#_>ΙĜR )6*aȆammalF%lِ1JF%JF%!c9QImQlES*9Fel2ِ1xݨ FeFe!c92S*mT6* ׍FeF0S)UFQEm QlFhFl ِ1*F*F(]Hw Z@)BB]?5}4U;hjw`.)5~S7O.ϷuM=oMq={v9<>ᆡ! 8Wxte ^<`=P;xz1\mxmx`Ƴ:G;mb4fpLmьl"Lmьl|l hF6d 6mm4Shmx116Zm6Z"~0JhmRhm"2`h hE6d >sJ+VF+!cuJ+hF+l5Xַ&FkqCkxCkFk!cuJkNihM6d n5Zm5њlFkhFkl ٨쿹Qd')FQ7Fm цl"Sڨm6ڐ )mFm цlFhFl-ؾqY7̋TmF]KK!_jhK6d ^7ºVm-іl|-hhK6d >W[hF[lÛl|]oL o1x9[m&27a᭶mx  V6Ɇ)Іچ7юl;qjsN1uٰNmюlnuF;lِ1xhF;vF;!c9NmC6>(xGj>؆ِ1x  lÇl| mm`TfQH՞lLwVH^m=ўl|NijdCu=6cɆF{؆/^l&j؆/ِ19K_ _l×l܆/᫶m  _hWm#O;^:41?/(F7lِ1 )6aȆmt6mt6~yE6cɆ;jݱdC6C6cɆmt6mt6z=[SLA6l=6z`=Ȇ{A6d nCmуl| 衶I6Fe?UK=a詶I6d ~HOxHOFO!c5lOI6d S=j=^d#*k51z~7zm6z mRm"2_^j^dC^F/^F8٘~i>&FnmcdCsJ8S6±p!c9%)jF8ِ1mmcF:OC~31zor{or{m6z  mVm&2譶M6d w譶ۈ K6%ĈDod"6"!c.#3l#l߈FFA6d ^7"l٨jE&F/Qm!2m6 lDspXRm!27@}6`}殎51~/7m6 U@6m6 }6b}Ɇm6m6VL~BOmяl|Sm6 mSm#2SA6ad`_זabD)yJF$I6d n#ڈTۈ6"Ɇ{H؋FmDbdC6"HHl?h9`Bpӆ7 W6cɆ{O6d n?_m?џl|ϼ?_m?1l\x34lkcX jdCkp ;@mc1lhclcِ1@ŹRR6bɆ@X7m 6 [0~[0Pmc 1l|Nm Tm "O:e\ Rm "211D6d 1o Rm "2_ 6m 6>t֪1Xa/:Xmc01l"Sm 6 )2Xmc01l`hc`lcx?Ņ&Q71Dmc1l!!jC!dC6@C6`CȆm 6m p|3{_qLI ;СjC"]>]ocPsPxP7O.} |`t3s10\ݗ1x1 :v0 ׃a@{Z0a #2_ 6m p&ѹ/I/lYQ9-c-c1XH(Xele,2626262`o`hdlbjf26262626262elelܗ(q֥ _1uaGﰣ5. ׸(q2j\EE5N=O5. ׸(q2qQEk\Ɇ &F臣a?mD ۈ66h!cut4\GGmDcdC6hhlc8X<`_jLphcplc8ِ1\E ,xplc8ِ1xpp!cphcpl#lLa#ڈQۈ6bȆ1pmĐ 1oQۈ6bȆ6b6bX?M71bXh#Vm#ۈ%2SbmĒ ׍XX7b6bX!cwcXXlc٨Mhclcِ1ެ3ƌ5醷Q"Q !c1֍j#dCuc1Bmc1lOYsV&Ho?ۏTm$2#a1I6d ^7Fº1Rmc$1l mTm"^]gFΞobuc6FaȆQ1 E6d N)6FaȆm6Fm6Ȇ#L876Ⰽ8!cnĩmaqdCu#֍88l#l=8h#Nm#M6*._j1Z mVm&27F~chlc4ِ1hh!c5hhchl#lܛ؃31Ŝxxl#lxjF<O6d n#ڈWۈ6ɆF<m!dq1Fԍ1nQm!2?d <dlc ِ17c7c6`cȆװc1jcdzיc:e,\Um%2/1K6d nc,1Vmc,1l| ;1G6bv`1NԍqnSm#2?xImc1lnL6&mL6&ztĘ,ɰߘ1ۘL6d W٘1ۘL6d Q3Ҏ2;Q d!c1ژ1ۘB6j ^R1Eԍ)nLQۘmL!2)jS)dC04vpX1eOCkc 1lhclc*{q}c&TqTxTT!cpSjSdC06j;c8lԬ'mZSdC6BS6bȆ'u=&4ыN4i4!cpӠijӰidC6A6aȆL6mLp|kmݷ$¶Zķv..Wőo;0O䵝}Kw$k4΋{t)Л.zǜq=Nw_p1P9]`:Ɂa1"NtTD1"z0D|t q'o/3=+f`j3dC̀Pۘm 2?p

̹Do'̎-x̳ͷ---`[l[b[j[f[n[a[i[e[m[c[k[g2elelelelegfV6v0S[PF0wLo=ո\}0|y{u׸|M=\S}q=8^濼bhk}O5Np쌁5{<#7Ly|ytyjydCkypM5Omc1lfӮ~D16aȆm̃6m6操EĘ/l̇6m6 ۘmWۘm'27>1ۘO6d ͇|QLνl\]׋ 6` Ȇm,6m,6 @mclhclc!p(ł(Bԍdü'oBB!cp j dC6B 6b Ɇm,6m,6 lcs11 EjEdCEpHmcl}E}EjEdC6A6a?A?~Ȇnِ16~6~ 2Ej?`*EcaXXL6d nc1Xmc1lbhcblc1ِ1bqqDԍ%n,QXm,!2a%jK%dCo,QXm,!2a|6+Q %Rwϳ5Tԍn,UXm,%2KaXXJ6d RRR!c(Og s[ZKedUMDX2e2!c[ XF6d >,s2e2!cwM9e2lc9&ro,WXm,'2f>3^XN6d >,srr!c^t9\mc9lM==j+dCs 8PXm 2XXA6d 72 J1B+E+6Vb+Ɇ[ [XI6d >sJJ!cŜ16Np]Xm"9,J Jmcl|NYUjUdC6VA6VaȆalpp0Zdck;&jыjj!c}p_tjlc5ِ1)6VcɆalqH/2j G^k[G_w~[ѺF-b]˧ۺ5FQ;Xcw`.œTs~[_c N㼸㞛ˋk\=_e ``-}kaV`-kɁ-}jkq=XK"d S 9c k6bFŔ3192Ȇuj밍udC6A6aȆuXXG6d G}:uƏdcmV41~GɆ{ƏƏdC6~6~Tlfaz7Q F{.2U11~r[ٰm4ِ1x1R l|N )?mmD6d La{>N9,c-cX~f;l;b;j;f;n;a;i;e;m;c;k;g;o2v2v2v2v2vr>Nqt 3v5Nکq;qI5NT׸'cg?;᳟׸Td ָF׻;, 41vwVwwVwm6v .ڻ6vaȆTj.lcِ1].]nAE nn!c=pwnlc7ِ1x߼ͻ6vcɆbvC6vc;E|# F__ȆA6 :c8lLwtZ` Ϳ__ȆA;}L}g?w6=B~-Omclf ahg>lcِ1}>}>!cp}jdٚ]gFŻ&&6cɆ~X7m6 Su~~!cu~hc~ G^[Wy|[w @-]˧G:;`z OcP;8`w`. G}sIvq^{~׃tϓOSPCxO |O }?A$2a=8q׃$B qPm qlgqHw6aȆ*b 6aȆצ!lِ1xq8qlduwXצmmF6d ca|P2Q ߰Ȇmmِ1^oojaM==jdCu06cɆm6m6 8 mV8m!ES8~$8"-}#jG#dC6@G6`GȆm6m6 i6m6].'GE/zG6bGɆ*bgG6bGɆ-QQ!c^(qTm(qlT9\&1Q7qLmql|ܷ8q 8F6d N9)6aȆc1cqR9Džqq!c98Sm6 8mW8m'2_6m6NL08!l6Nm6N ׍nP8m 27N~ lِ1x8mP8m$G_hqR셟{'6Nb'Ɇ8q8I6d n$qRm$ql8 mT8m"mLXÞkSjSdCp1726NaȆ{S=q 8E6d >6Nm6NbqZ)rZm4qlihil4ِ1ii!cpj3d#P㌨g`8q8C6d 3!c9 SΨm6ΐ 8mQ8m%OFhkqVԍnU8m%2ga8q8K6d n,qVm,ql= mU8m#,8'9X7Ωm6Α ssNmql|N9sj簍sdC9h9ly/#6j㼨a8q8o1:<\W8m7j|<8q8o1yd#~͵Sי;mmN6d c#av:jc ׍a]mwlw!c8l8116~6.<ĸ X7.m\6. }~}Amqlhlِ1xqڸq۸H6fF:6.bɆ/=jdC6.B6.bɆm\6.m\6.Ž_sK9%K%!c߸q ۸D6d nqImql| { ڸq ۸L6rl™2٨yڙ5el2ِ1yee!c5eq۸L6d n2qYm2qlTӗwWDݸ+!c~ 7m\6 Su+!cpW+jW6aa{>U9,cXƮ[nXnZnYn[XZY[XZY[ƞXƞZƞYƞ[^Xe{o`h9*ոuwj\ rUukUq2¾]5*8WwU]wj櫰]U׸xF6wdx|5lِ1xot F6aȆm\6m\6 נkj6yapk1L%G4C-sqOwP;\<%uP?w\<5?{鞷._jicu_uݿu2+ùu\uu\'2+C6c7ɣF41npo lِ1\qֈj7dCkptCmql h l&Fм3&MQ7nºqSm&qlMa#zSm&qln܄uMl&ِ1M-ȧn;M[y--lِ1xݸ-[-!cߟ-lِ1[-[m}[K&mQ7núq[m6qlmhml6ِ1xݸ mm!cmhmlX˾WM;߸;jw;dC؋Q۸m!2qڸq۸C6d nqGmqllnb6Bw6bwɆK Kq۸K6d n.qWm.ql]h]lxwM{bN{j{dCu6aȆ):=lِ1xqڸq۸O676=㾰qڸq۸O6d o܇}}!cpjdC%އ6m6kzN|hb<6@6`ȆX7m<6 )@mln<6m<6Y?x(l<6m<6 U@=Txm<$2xxH6d ^7B6bF ab<6A6aȆ#X7m<6 xmSxm<#2 x xF6d nLmln<6m<6V]L9| l}xN6d ok{xN6d ^7C6c/FOibPxm 2~) ["Q  !cw^w^m6^ ׍ ƟdA-311$IpwllK!SmOlO!cpBmmI6d nOhO??ɆSmOl%;9K&KNy )/6^b/Ɇ)/:Kl%ِ1%\þTxm$2z mTxm"36++W+!co_o_m6^ `/Jml|NymRxm&#OE6^cɆ{װ}xM6d ދkk!cpj7d#=jbqal ِ1 g BgD16`oȆX7ިm6ސ S@o6`oƴ }soEo6boɆ} }xK6d ދ[[!cpojo6Ǽ3$Ej& }.\E\yqwS;xgw`. G}s⩜$/4,z_te K/\"2+"R ׃HAmm'&{=|^m=l{h{l=ِ1{{!c=^m=llZ&Q7>Aml|?>m|6> m|Pm| 2H6jg di㣰H6d 댁~KGl#ِ1#\~Tm|$2_~6>m|ps_4'ȳagq$qI-c,c-c.1WX XJX*gԖ4t L̖,l얱\17XnXX^X>X~!Ɂ~_$n%qC5OI/$n.$nhSǀ5.[Iо:qIR'翤d܃*Ixߜ I6bIɆnoNHJ6d n#)Tm#)lF֝&Tm#)l9{Ie# H HF6d n#Lm#l|-K HF6d ^7A6aF3W51g:3jɱdCsJr8$WHm$'2aHHN6d n#9\m#9B6TT" om`.dCu  lÅl܆ ᢶm ӹ@.j.؆+وp*+j؆+ِ1xpuUmp%2 mmbdCmWhUmHA6zt&F oF F !cp)j)dC6R@)6R`)ȆF FJSαlb6RB)6Rb)Ɇm6Rm6R ب持N(LHI6d ^7RB)6RbFK{521RodR©6RaȆTH HE6d ^7RJm#lF*h#F*l3AL^3ϰȆ }ggdC~>sC~>S lFƝ&gFjקC+&Fj1sJjFj!c֍jdCu#56RcɆFjFhۮZi4F4F!c~# 7Ҩm6Ґ HmQHm!2" Fm# l8H\ÚiɆjӪm6Ғ  Vm#-l|_4-MHK6d o6Ҫm6ґ H'7tj鰍tdCsJ:8SHm#27~#F:l#ِ1HHO6D_#aHHO6d Ӌ9c8lص%Hm'2HHO6d ^7C6cƾ&_hbdk p Am#l"S2md62 `Am#lnd62md62 S:ƅdtCۓQm##l3ΨH6d n##Qm##lnd62md629$F&X72md62 od62aȆmd62md62 ׍LF&LFf3_0#72~#Ffl#3ِ1F@g {mD162cɆmd62md62  mdVȌmd!t71},p_4Fl# ِ1FEm# lFh#Fl# ِ13,F,v;G^|[Ȫ.\np\OZjYS?yuuYFVj.+Y<+螿" ldw?g }׃ldS;ȆA6r cz փljp=F"d >Wd6md6h=+D9s9s6cɆmd6md6 mdWȎmd'2+C6c9FB41r$9sj9dC9~gF!cp9j9dCkFFN1а;9^xNSm#'lFNh#FNl#'ِ1FNFN!c9%'Sm#'l.wHh#`ȥ E6d ߙ wRȅm"2 ȥ E6d n#Km#F6zĚnnᦶm p66ܰ 7!cpnІچF6d >AnjnFnQ巗&21r֍jdChn؋Vȍm&2ȭM6d ދ6rm6򐍟&FQ7Gm#l1sJ>|F>!cp|j|dC6A6aȆ|F>|F~s#aȯO6d ދ懽h~F~!c~#?7m6 ?ȯnq>̹χќ#qfG9-c,c-cE,cE-c,c-c%,c%-c,c-ce,c[ZY[*X*ZƾUUU}ij2V2V2V2V2V2n9ոӷ_b+W׸Td >_u+k\q2q`+qp+@5NQX k\<$M9((濂p+Q(H6d >_AFA!cw '6 bɆ{FAF!qkU1sLBݳBݳBjBdCp1BjBdC6 A6 aȆ{BF!BFa3s΃LbN) jdCsJa8V(m&2_SkjdCsJahFalxUE&FII"F!cpE"jE"dCQ(m!2Q(Q(J6V&FQb6O AE6bEɆ//Q(J6d ^7ºQTm(QlFQhFQlHUsVMbnuF1lِ1xQ 6aȆb(Q (F6d o6m6 ߿pkQܹN1'p)Q(N6d uW(m'2Q(Q(N6d N)mW(m \ڤ|QBԍnP(m 2.X>,Q(A6d ~w 7tw F !cp%j%dc &FIm]Im]IFI!cߟ*~FIl$ِ1x( FIFI!c8 g dFIl(y(͛LRnuF)lِ1x(F)RF)!c}Rp_F)lِ1RF)RFilIFiQZm4Ql ppx:(m&2Q(Q(M6d c#3Fcv16JceF5z(#FX7ʨm6ʐ [~[Fm Ql(2je2dC06r:c8lZ͸2F G^oԩͿ\-ssqOۺAάY2ŵ>;0O5}+fZ;{wc;隻AYMڍzfWVԃU/c=pOAY\ʒwe"zPDXp@6ʪm6ʑ Ǐ=`b6A6aȆ=rj對rdC}D9X-ʩm6ʑ (mS(m'< (/l6ʫm6ʓ ?')W(m'2_kj屍dC6C6cƍ951*2*2*mT6* ?*G F!c9S*mT6* 3ZVPۨmT$oaݨQۨH6d }3Fɑoe*Y6Q FE!c9"S*mT6* [T6*mT6 6v=&❝/;;_m|m|A6d >|/66 2Ssj_`_  Bm ljC&F%Q7*QImQl|ﬤQ ۨD6d ^7*QImQl|NmTRۨmT&)2gu{Ĩ,lT6*mT6* iU{Z6*cɆFeX7*mT6* ۨ mTVۨmT! }sjbT6@U6`UȆmT6mT6 ׍*nTQۨmT!2#ۮڨm|I6r?uKKK//Ɇ/ƗƗdC66Tldcgsg eMϥص4OZ_bUeNͼebTuadVUۨmT%2 mT6 )URUm*QlZU FUl+Qk51sWpNJm+l+!cuWpWWdCu+X7R l|+WF5&%;;;;6aȆmT6mT6 ۨmTSۨmT#2E^F5l:٨ڹ~OLnTuFul:ِ1R)6cɆmT6mT6 }U6mT6j]5ĨA6$yQllK!7km6j  Ӌ ckm6j [P~[PCmQlnԀ6jm6jFe?|Ĩ)FMX7jm6j ׍nTۨm$25aݨQۨI6d n&QSm&Ql[ӆy90KioRۨm"2猁㩥Q ۨE6d nQKmQl|NmRۨm VM w>uWp6ɆqmcdC6ܡ w wlÝlnCjv0a{>Lm9u,cu-c,c-c ,c_[ƾ55555yXƚY<-c-c^V֖61oX;˘ee2gX·M5'9Cj6jk\m\jS1n3vY\1tW׸Td OWV׸ڸզ'c6q56ꐍ}&t11:pFlِ1^LSGmQl|:ju:dCp~[nb u6`u'z41ި.m6 ׍nUۨm%2QڨQۨK6d ^7Bu6bƠrMHmb6A6aȆF=X7m6 )ROmQlF=hF=l>pq$31 jdCu>6cɆ}jdC6C6c \*e21~7m46 5t 6` ȆFX7m46 hm4Ph`km]mZaV"0wt|[5-;0O~[5(Vw\<54΋{7tϿ˴hۮ7bow\/cwϾ}v ߐop=D|m| ѐllf&FC1W4sECFC!c33m46 #~#Pm!ѐlFChFClXu.g>x>khD6d G4}D#FF#!ci#84Rhm4"2߷hm4Rhm4&Uw)LƢn4uFcl1ِ1FcFc!c֍jdC6C6cMn.11M&jM&dC3737Qhm4!2M`hhB6d >46m46oOSTh m4Uhm4%2hhJ6d ^7ºTm)єln46m46x9Sm$2nxmxbdC6< O Ol9p{eahhN6d }5Whm4'2 o›m46 {h"O_Йًwvȍi/ /lËl|NsچE6d >x9Km "2mxmxa-%W71Zp鉶F lِ1)-6Z`-ȆF X7Zm6Z SZ@-6Z`-F-s9Щ%(eC^Cj-dC딖pRm%ђlh j-dCppcb -6ZbF|G>uMVhVjVdC6ZA6ZaȆϵmϵm hE6d ^7ZA6ZaTsbl&+;96Zm6Z h mVhm&2SZ9Fkl5ِ1FkF1Vwmľh/Fm цlFhFl ِ1)m6`mȆװm6jmdpcK&F[ыh[F[!c^-E۪m6ڒ SuJ[F[!c~-Vm-M6Vt<61Eu[m&2 mxmxcdCu o olÛl|N66vdR&ahhG6d >sJ;vF;!cpvjvdCvj A_11|Ĝ lÇln᣶m 6|6| !cmm`FsO^4ngbu=6cɆF{X7ګm6ړ a5l{F{!c^=^m=K6Wov|+lBj؆/ِ1xuWm%2nmbdCuU6Fn|L ?19Om#2?৶m 66 ?!cmmadr†?᯶m )pNW6ɆmCj؆?ِ1 h_mnqL&)JW`a.;}$S?yu7Ip3@}w\<5?${{8e}_Nz/9,cXXGX'XgXee,2222222nmEZ[XZY[ƆXƆZƆY} /uWv1%4PkX @~Qy-Ꙍ@8+[ 5.P]qD6"?/E7#H66 !cavpFD6d /zAjAFِ1xmmad#ġ21`h#Xm#&2,{m ׍`X76`!cpFF0B6^\8ab!FFB6d S716l9m`!dCBl#l|>Q6:_AmtPmt 2:mt6: )Amсlnt6:mt6:[M0(f;½َjdC0616ϹpD16:bɆ먶H6d ދv6:mt6: GfImtRmt"2(ᰑ|qŠ.mt"27:~F'lِ1xmtRmt&ˆ{5.,pN鬶L6d ^7:úYm3љl|N jdC6:C6:cdUEoĘnºm SB:%Tm#%2ECa/m { mmb]Fiebtu ]6`]Ȇal8c8l^B6d >tsJ.F!c袶#VvobFFF6d 38c ,(FF6d >9%Lm# #2_ÆAajaFWq(͛ƙ]ovuCiUm+ѕlfaq[KCk+ѕl|N 甮j]dCu+Um+эlSۏLnNAHhXTlmt6 )Mmэl|NnjݰndC6A6aų_O11~;7mt6 mtWmt'2讶N6d ދv6mt6zկx7̆da{髇Flِ1̞3Æj=dCFoPm 2mPm$8~) I6d ^7zºSm'ѓl j=dChOhFOl٠V䚇\ԡW>wKmыlnuF/lِ1^F/^F/!c9KmN6>t|u#h.pomcdCpN W6ɆpomcdC0u#3m&#ڵd[o6zcɆpN魶M6d ^7zú[m7ћl|譶ۈ ?_&FmDmD`dCu#֍l#lTFA6d ދF@jF ,71}>j}>dC6@}6`}ȆFX7m6 mQm%4xW}aWm/їl|ϼ/3﫶K6d oF_F_!c9/Wm/яl,i8k'꧶G6d ^7Omяlݞ~ݞ~j~dCuOmI6o)!z#R)pNTۈ6"ɆmDBjF$ِ1W$Tۈ6"ɆװFF݆#ۺۺp&.\V8r_݁xJ'ۺWo.] ǙQs<-c-c1XH(Xele,2626262`o`hdlbjf26262626262elel|(q:wu}s웣5. ׸(q215nCJ,(EE5Nk(R׸(\㢨75.J]M6b^v-zhEmDcdC{1p/&Zm#ۈ&2mD ۈ66dW&p pp!cp1N6d 7}pp!cpájñ1c\E#9C6loĨm`1dCގQۈ6bȆF 1j1F ِ1h#Fm#ۈ%yi/Ĉu#֍XXl#lYp,|mĒ ׍XX7b6bX!cpFF,1l,*#D!cp#j#dC؋Pm 2actzop16F`#FYǯ21FuHN1I6d ӋspYURKCkc$1lnucHlc$ِ1<iq]m"?1JN(7;6FaȆF}QjQdC6FA6FaȆalqp;Oe QFpo~&FqnĩmaqdCsJS6Ⰽ8!c9%)qjqFِ1B$G2F1l8Hha{2Zmc41lhhchlc4ِ1x hh!c9e4SFm6ɆgaMx6ⱍx!c~#jF<ِ1x݈u#^m#ۈ'2nīmcc9lj/M111jc1dCc1!c1֍1jc1dC06 8c8lvY\1辻1K6o+tፉ1VԍnUm%2E^tXlc,ِ1x XX!cpcjcqdnò 719{Qo#f'PnVSm#2Eǩm6Ƒ ׍qnSm#211H +\Mrb$8S7Ȇl#ln$m$ '=l#lMhF1lpw&xg>Wm'2a1O6d ^7ú1^mc<1l|c<1ۘ@6;&oL !c51ۘ@6d nc1Amc1l|N j6yM4%[[7xMTha.~[7:v0\<%p~[7?~Sxۺt͢-ŵ|"O#67IwNwO`}׃I$IL"2Ijp=D"d S16r9~*oZd#2dd!cs21'mL6& ۘ mLVۘmL&2وjQMU3Z5kg-5Z=CbE B"bרU?s9y_s[磯=:\K`XXB6d nc Dmc lnqH_XJ6~CVc1sRlc)ِ17o:-UXm,%2_.kӥjKdC0u3Æ@Xm,#{O XX&2X7m,6 ׍en,SXm,#2`X XF6d S7j9c|7& XN6v+\[,6cɆaltspذ\mc9lrhcrlc9ِ1_֦. bhm,6VcKR;cSV9e lcِ1x/+6V`+ȆpNYXA6d ncBmcll^QMbNY 甕j+dCuc%+6Vb+ɆJX7Vm6V X mTXmp6ܠ 7 7lÍlpچF6d ^7`pSp6ȆmAnjn*э-eb6VA6VaȆa攮NqV8A U*!c ֍UjUdC0딚_7$ p'wrm]p66ܱ w!c놻چ;N6d ~_;/]mp'2mmcߓ~|Lբ] {jdC0suspptICkc5ljhcjlc5ِ1j؆٠51<a=6< !c놇چA6d >x9Cm 27<`ᡶm!NUX#X7֨m6֐ a55!cpk5jk5dC6@k6mh##xg=k-c,c-c,c-c,c-c[,c[-c,c-c;,c^]1o˘elelelelele2v2g;hX-rGN}?'OQn᣶m i=- lÇln᣶m [}  lc7X+c7v~cnlc7ِ116ob6B{6b{Ɇd^lc/ِ1^Wmc/l^hc^lc٨tвM}{}j}dC}pOmcl}j}dCpaS>am6Jjb6C6cɆ߯O6d >s~~!c֍j _hG†/᫶m  _X7|6| _!c 놯چ/K6d / E}6|d#*Q|TMb {am6 #p@mqlFug v{16`ȆX7m6F>U6kb놟چG6d ^7`S6Ȇװ~p 맶m }/? ?l ٸX딃jdC6B6bɆ甃pN9q8H6d u}T8mE_,Xρ௶m _k6 !c놿چ?O6d ^7aW6 zr㐨`8q8D6d nqHmql8CjCdC6A6a-ql6m6 )rXm0ql|N9 jdC6C6cd#i^mb8sRȆjFِ1h#@m# 2nm`dC6l#l굧f)l^m _ a6@!c@m a6Pm#n~a0Ax[ƎXƎZB,c,c-cS0iXee,2iE[b,c-c,cK8eXe0AT2:y$ 7k\qATd 79H]p 'ck\D5N_5.dv7Y`,F0L6d n#V6Ɇpm u1|.CZQT3L#b?q8B6d nqDmqlnulِ1x8#vg&g™ZQs_wBG`柟; Q?j?k:; s~׃:Wo tB5 ξߥߥvA91x="B"Bp=!2_+@!j!1{u{Mc1h1lِ1a c1!cpǠcjǰcdCs18WS8m' ~r|8.l6m6 q\m8qlqhql8ِ1x8qF(وq|kPQmbdCuuU6BɆC}F(J6d ~-8^ U6NI31Nq֍j'dCu'6N`'Ȇm6Nm6N )M1n|Z.-A Iq=&I6= צ'6Nb'ɆatuH߆A16Nb'Ɇu? u?q8I6d ^7NºqRm$ql SĜr )6NaȆ)X7Nm6N `qJmql)h)l#lt&'L0a# S6ȆkajaFِ100l#l hFqlZ0㴰q8q8M6d ^7NúqZm4qlnuil4ِ16NcgF3\ 71Έ^ EϨm6ΐ ׍3nQ8m!2q8q8C6d ^7qFm N6fsSu#֍ppl#l|_4mcdC5ppl#lF8m%:/8+YX7Ϊm6Β )grVm,qlYhYl,ِ1YFXR#BԍX7"6"!cpFFA6d kl#lFmD~f<31"Hh#Rm#ۈ$2 mDmDbdCHNTۈ6"ɆD)jF٠/K]51(h#Jm# ۈ"2mDmDaQdChE6(!c(m#e'֜r8'E}sj簍sdC6A6aȆ9X7Ωm6Α ׍snS8mD7u-lDCjF4ِ1hh#Zm#ۈ&2ѰnDmDcdC0u3Æqhhl#lԣ&FxF&>#mĐ ۈ6b6b!cuJ \Ĩm`1dCh Ec6bd#|٘vL8j籍dCȜȜW8m'2a8q8O6d >syAOq=61.//m\6. ׍ n\P۸m\ 2qڸq۸@6d g~_P۸mĒM8#V}½XXl#l|<ǪmbdCsJ,Sb6bX!cpFF,ql3 㢘S.9El"ِ1EE!cuENq۸H6d n"qQm"ql #m\6FЃ&71⅍xh#^m#ۈ'2G8#mē 񰏈Wۈ6Ɇ-a݈Wۈ6E-Neb\}UG\U۸m\%2Waݸq۸J6d G\}UU!c _qnoޗ^afy?u M-m_;{-c,c-c,c-cO,cXƞZƞYƞ[}}ոFtMkw ָkw ׸kTdd"z&]58׸k]S׸k]'c5Vqwlls_71:썮m\6 w]m:qluhul:ِ1xotF6c7F%ldbp P۸m 2w^ﻡq۸A6d nqCmqlj7dS$qSބ{76nb7Ɇm܄6nm6n oMM!c9&Snm6n 01n9m-a[R۸m"2ߛfom6n g|-[-!c[p/-l68=a\&mo܆mm!cgdngdnm6n )r[m6ql|N jFW11 /Ȇ_nِ1SR ln_jawIƺ715q۸C6d nqGmql|ýq۸C6d ^7qGmql֣MM{ϺSdYɺqWm.ql| {am6 ۸ mU۸m%2waݸq۸G6 (qOSu={=!cu=Nq۸G6d o܃={=!cq֍{jdcH״׊ŷB@ q۸O6d >܇s}}!cpjdCkp {_m>7=^R&ߢn jc #=[molo!c9o877ِ1p_odczEzM}{jdCu6`Ȇm<6m<6 ??>?@mlsiPxmC#らo+#HmlnQxmk'jOȆbpD]Q7uȆ)u?j` Gml!cu?p?Sx*l<6m<6 ׍n#BmltگLbx 犗j/dC6^B/6^b/Ɇ犗pxxI6d wTxm":W+W+!c>#^m6^ xmRxm"2 x xM6F_"ywx_kjdCVxm&2_]kk!c51_m6ސ aboQxm!2o`xxC6d o7!cpo7jodcZ滖51:mg ޒ[&/,bUxm%216eTG $xK6d >s[[!ce1|16bFڑ;`bWU;w;!c{{ީm6ޑ ׍wnSxm#27~;l=Xj@!&{g/j~O6ya{l=ِ1)6cɆIzIzxO6d ~=x@6rU_wp7>~lِ1x!c^E?m|6> m|Pm|$VSLl8WQH6d o|Tm|$2H6d n#Qm݆007:ّe,e,e,e,e,e,e,e,e,e222e,e,e,e,e,eXfXXVX6XvX˘e,e,e,e[}?_D?|)+ߧK>s?'Չ\O %rEѧNָD)'q\Qϩc5}s"W71K61rk\њ+Ȇm|m|ِ166"2WFbQ}ƛ]yߜ͉6cɆm$6m$6 H m$VHm$&2(Fbl# ٠N21I$jI$dC}sW7'QHm$!2HHB6d &QHm$%-.qTH m$UHm$%2F26%%-FRl#)ِ1nRWTm#)ln$u#FRl#و}q&F2a#Lm#l|NIdjɰddC6A6aȆuOuO HN6zi,#X$jɱdCH&b{ݓm$6 'wE6cɆ{MHA6JrgBHmPHm 27R~#F l#ِ1xHF F !c~#7Rm6R z#Xækؔj)dC0Fg 􍈔j)dCu#%)6Rb)Ɇm6Rm6R7HCJCJ HE6d oF*TF*!c ֍TjTdCh*؋RHm&Sn_fbhj؋VHm&2au 'HM6d M װ6RcɆm6Rm6\ȆK.pچ B6d o~Emp!2mm`.dC6\  l# XuJFM4Fh#Fl# ِ1)i6`iȆ4HHC6d n# Fm# lPibhZ؋UHm%2$+$FZl#-ِ1xi6biɆm6Ҫmp<5&=0} "0O=[5?V;<;} +웃f|koA::ŢʵK'tpH>p=HGg_ zHtjp=HG"d 6Mצ6aƾ fbwwEWHm'21^m#=l|Hj鱍dCsEz8WWHmd V] FX72md62 `Am#lndu#Fl#ِ1u :I FFqqOM}]3md62 mdTȈmd$2ȨH6d ~$#72md62fw$2n3F&l#ِ1 )62aȆLpNɤ D6d >dsJ&L7dɾ&7n|7j`ߐ ?+z&ooȆ7n| ِ1x֍o662҇412֍jdCsJf8dVȌmd&2aȬL6d n#3Ym#3lܙSa#sO\B6l6md6 a5l,F!c֍,jY,dCsJ8dQȂmd%ßqMUwfY6bYɆL@eUȊmd%2ȪJ6d odUȊmd#Z;-ebdsJ68dSȆmd#2E^4F6l#ِ1lF6lF6!cp٠ljٰdco)7BMb#;ȮN6dd"/Fvl#;ِ1FvFv!cp١jٱd#Ga&FQ7rCm#lnu#Fl#ِ1FF!c~#7rm6\‰o+71\EpuUmp%2窶m p6\6\ W!c}QW/ꪶm$otibu#'96rb9Ɇװ96FNl#'ِ16'\Tȉm$29aȩE6}Kԍ\nRȅm"2]16lȥ E6d ^7rKm#lF.h#F.l#70o71r jdCu#76rcɆm6rm6r  mVȍm|K6qVo| 7Ula^T8A ooɆm| m|--ِ1:[NVm[alo䱼;X^X>X~XXAB–"b▱,c%,c%-c,c-ce,ce-c,c-c,c-c,c-cU,cU-c,c-c5,C5ʈQ)/5.8yG]jgẒqypC5NkAw51򉺑֍|j|dC|pOm#lFsgT bhm6 OOOm#ltPÿMF~h#F~l#?ِ1}H}H6cɆA6&tp0zɕ F~l#?ِ1F~FqeĜR)6 `Ȇm6 m6 #%;)ȆP(m 27 ~Fl JؚE(FAFA!cujdCHNJAa;)6 bɆ(Qnٺj{"~9xPGuѾW;<ŗZtKG:g{7O^ltm^}οszm(~!/A!:2_Bjp=(Dd 3Wup0Ȑ VD!\ \QHmQlxaw&Faga6 ۆAaFa!cpjdC6 C6 cɆm6 m6G_(""(Q(B6d G}D"F!cu16j(i bhm6 E`QDmQldL"(a6 +FQFQ!cpEjEdC6BE6bEɆm6m6 %OnbkbpmZLmQl|N)bjŰbdC0&OJ16aȆIm6B]OW(m'2Q(Q(N6d D016\Γ Fql8ِ1xQ6c? Ncb\ٰm&ِ16~6~ 2Sz:c|* dC0u#3ƗoSC(A6*kt&F g07 {Jm6J (mP(m 2}^RHCkQlnuF l$޲YL&FIN) )%6Jb%Ɇ{ђ-Q(I6d Q3ƴOM+ FIl$ِ1FIF)8M3sF%l&RjRdCu6JaȆa攖_\ bhm6J _C+R(m&Qûnbu46JcɆm6Jm6J ( mV(m&2Q(Q(C6:;t\&FfRl8#1ʨm6ʐ (mQ(m!2ׯ ׯFl ِ1FQFm Ql,#sR^O)Q(K6d n,QVm,QlFYhFYl,ِ1xQe6b`_31ʉ)rj對rdCh9؋S(m#2ׯׯF9lِ1R)6ac41ʋgdgdʫm6ʓ #\#\^mޤQE)UREm Ql]UཡU6`UȆmT6mT6 ԍVgwjokYM{=3Oͫ8 g*V^SzgjRr͘UkGԍ})ļV kgjٗ1V kjy91xS Q kHazF-ZFmaK3U:6\GVۨm&2\^ QۨM6d 7[Vۨm&2y;c8lr'cZ:d㺋C&FQ7QGmQlnԁuFlِ1:F:F!cQ֍:judc }Ĩ+uaGQWm.QlnԅuF]l.ِ1R)u6buɆQdN]F=C&F=Q7QOmQlF=hF=lِ1zF=zF=!c93Ɨ'QۨO6~+z&F}oԇF}F}!c9>Sm6 ب쌑?ڨm'2a9M*ڨm4 Rzt319Sm46 ׍n4Phm4 27~Flِ1\X1o@6lżFl!}ߗz Ŝ) 6b Ɇm46m46 6{ 6b ɆªhCa 6bFĜ)6aȆm46m46 ׍Fn4Rhm4"2Y|5Ҁ]Fjd=$OLbNi jdC6C6cɆưhhL6d kFcl O01֍&jM&dCh؋6Qhm4!2hhB6d n Dm єl3n@&FSQ7ºTm)єl޳޳jMdCsJS84Uhm4%25_Ck)#(b?? ?B?mmH6d ^7~uGɆmm##ِ1\įz6~6í}7oLhm4Shm4#27~F3lِ1W3Lmьlxq|d16aF}ƚE6cɆm46m46 ׍n4Whm4'25P\m9тlgoyuBԍnPhm 2hhA6d ^7ZBmтl|Nij-dybt}-Ɇj-dCHƶZ \KFK!c՝16l/nhI6d ^7ZºRm%ъl\lbsJ+8Rhm"2E[^F+lِ1h+/Jmъl.@uF+l5_qAh-l6Zm6Z #hm&27Z~Fkl5ِ15\öVhm!OOq218 ca~ yRڨm6ڐ m`Fm цlnuFl ِ1\į6jmdcch+;F[l-ِ1w{:c8lT;ǭZ16bmɆm6ڪm6ڒ )mVm-юl${cMvnuF;lِ1x6aȆm6کm6ڑ EF;vF{1+*ScbF{oWhm'2F2nO6lKjdCkp ^m=ўl|Nijd#C[-31:o1tpEb蠶@6d ^7:AmсlFhFlِ1Fvc:gխijy&#":E'eLRG蠣AGs_3I>g<7wq#}b5wCsO^I};zЉξA'\:_{wRA'!ci'6 L6h{O ;mt6: 73|nFgl3ِ1x6:cɆ{ΰntVmt!eB|~1͋ ۋmt6 ]Em хlFhFl ِ1\įltQmt%ߧsٷ*FWX7mt6 ߳޳Um+ѕl|+쪶J6d n+Um+эlsȝ[MnntuF7lِ1x 6aȆ`MmэlF7hF7l;8^&FwQ7ú]m;ѝlFwhFwl;ِ1xFwFw!cpݡj6}h" xG9zZzYz[XZY[XZY[ƆXƆZƆYƆ[FXFZ~lemc262e78xDؤc?T,oC|Ӱ+auk\q2{58=`C]z׃j顮q=דl\7m|zFOl'ِ1=6zb=Ɇ翞p멶I6d 3upu7A F/7Y}M^d#QJ^dpbY7zm6z ׍^nRm"2`襶 E6d o Rm&([<>[m7ћl|7ܧ뭶M6d n7[m7ћlo j>dc5 }ĵ>N>F!c{V{Vm6 )}GmчlnuFl/PÿLF_hF_l/ِ1)}6b}Ɇm6m6 EnUm#36?U:'z~G6d ^7OmяlF?hF?lِ1~F?~FH5/l6m6 ׍nWm'2pm6 )_m?1lqj)c11@6d S6`Ȇ{1@6d ~?x?@kb 6B6bɆ7jdCuc 6bɆ甁pN1D6M& q x A !cA ߃1D6d ~ x A !c9eSm 6R+d[mb uc06cɆ1L6d ދ``!c_Սj!d݌qL!κab !M!jC!dCQm !2S9elcِ1!!PQ툼q&PQ7º1Tmc(1ln ucPlc(ِ1x PP!c_1F6N50&̇=ajðadC0؋Sm #2`1 F6d nc1Lmc1l&pыpp!cpájñdCkp ;\mc81lphcplcوxת1B왏{#6F`#Ȇmm1A6d ^7F1Bmc1l#໑Gm6Fޏ:ծ~)攑pN1I6d oHH!cp#j#dCp#6Fm8<[W[6Rg<57|'tG6쑡+~s3?ٗ1x=փ~gr cz3?E$Bp?mm"|!Sc1 1 E6d nc1Jmc1l|s1 E6d ~d6Fa#t-chlc4ِ1hh!c1֍jdC{^hZL1bOk (ƨm6Ɛ ?1!c61C6d >s1/dcYs\&/9< (97|__Ȇ/n ِ1x֍_6~6~!25_6~6ƒܛ6ᣉ1V)c2Vmc,1lXhcXlc,ِ1x XX!c_1llJ]ė(Ư w++ِ1~pW__Ɇ WmmJ6d k~W_Fa:MS~6~6~#2oodC6~6~S l.@u7߰qd72Q|T&8g07ˌ#+gƩm6Ƒ _{Sm#2S9e8lcِ1x8qxxQcXj㱍dCsx8Wm'2E^txlc<ِ1\įlWmL 'V/[Ę 2dlcِ1._:Amc1lhclcِ12)6&`F ڃ31&1֍jdCDoLTۘmL$21ژ1ۘH6d k 6&bcbbLkIp ;Imc1lIIjIdC$oLRۘmL"21 ژ1n~Xz?0wvLwT4閱Yٖ?-cs,cs-c,c-c ,c -c,c-cK,cK-c,c-c+,c+-cnU1wj˘el0z?ɢM5nM5n287Y]&7jۓz{M5n28EMV׸xl+X*厜&bwdC0}s7g bhmmN6d nwhw߱Ɇmm;1l4{ޭߚSD<S6`SȆSz{lc ِ1SS6`SȆmL6mL6 *31mL6 ?;>;Umc*1lo jSdC6BS6bԖVO.hbLuc6aȆiߘ1 ۘF6d >Ls4i4!c_٘1 l k?k?mmA6d nh??Ȇmmِ1=j{PۘN6gK&t1Lstt!cpӡjӱdC6C6cɆ"~ T7mL6f{n[Ę!pN1ۘA6d nc1Cmc1l|wÝ1ۘA6d ~g3Cmc1ll{c3aݘ1ۘI6d N )36fb3Ɇm̄6fm6f ׍nTۘm"abuc6faȆm̂6fm6f ۘmRۘm"21 ژ1 ۘM6lbl؋Vۘm&21ژ1ۘM6d ŏll!c_)6fm8<[7Y>['EianݟSOs߼ٺ? T =Ͼ9xjv߭?O\9?>dߚQz0G}z0ξ{99!2՝19jsp=C"d kblc.hˇ:&\ac.1Wmc.1ljsdC}\GUۘm%2_a#^֮" $1ۘG6.}\^c1Yċs||!c1֍jdC~|qX pNYX@6d nc@mclx mlcِ1\įj dcD[ ;w.TXm,$2S9eBlc!ِ1t!\.TXm,$28)N 6bƫ#}hcb,s"8,RXm,"2F2=#Hmcl"hc"lcِ1xX"Eb{#7719e1Sm,6 ׍Űn,VXm,&27~cblc1ِ1bju21@@m,6 |ө3F-9* lc ِ1xK6`KȆalwpظ[Xm,% :-eb,6BK6bKɆ{ѥ]XJ6d >,sRR!c5R]XF6r:L)Lmclf﫫3ƨHvO16aȆepNY XF6d }-SXm,'V˅rr!c֍j˱dC6C6cɆ"~ o,WXm E-N5X!)+:e lcِ1u+u+6V`+ȆpNYXA6d ncBmclԻ`cgg%ggJlc%ِ1xX JJ!c֍j+dC+J؆٨rL 7ы^Mm p#2ahچF6d ^7`pSp6Ȇچl8?X%UpNY XE6d ^7VJmcl*hc*lcِ1:e\RXm~+ً;Hilr9ѻmcdC{_p]mp'2mmcdC;76ܱd#&ՀCƚ:e5\VXm&2XXM6d }VXm&25PX ]{!99桶mx 6<6< !c^j؆ِ1x/{Q lc p|XDcE^tlc ِ155!cpk5jk5dC؋QXc~F}?=k-c,c-c,c-c,c-c[,c[-c,c-c;,c^]1o˘elelelelele2v2g;hX-7qqf~S]zO^mc=lyyj뱍dC{1^zz!cp롍j6ym0}tynA-b]9x/ٺ ؠv<ŗ'|n|"bo}s9߀F: N~QԃlTl/c{::c8بv׃@}FGlT؈F!czبD6ί$ll66ml66 \Imcl|MjMdC&MfQaڀ+M>pجL6d cn=ff!cpjdCpYmc3lEmlQ؂ml!2آB6d nc Emc l.⤠foQ؂ml%*-}jCHR _VV!cV6ݪJ6d >lsV6q$11~c7ml6 wnkmj۰mdCuc6aȆ"~ dc6lc;h݄M oaV6Ɇ7j؆7ِ1xu[m&25 o olÇlL_?9?XaФچC6d  lÇl|om`>dC6|  lc7HV6CMݢ jdCnn!cW_wm6v EحC6.qji<#l**'=j{=dCQ؃m!2أC6d ^7GmcldyQc{aثK6d o^^!c9e/Sm6 a/|^>ѭpXPc^cxzeg}j}dC6A6aȆᰑ(QD aOqN >lcِ1)6a[21֍jdC~oW؏m'2_jdCp_mc?K6v5㌉a/٘&,CnmbdCu _ _l×lj؆/ِ1 _ _l٨0V&Q7q@mqlnulِ1u@mql.@ulÏl=Z,6 ? ?lÏl܆᧶m ~S6Ȇ"~ dOm8H6x &A/zT8m$2q8q8H6d n qPm ql| {am6Ɇف31 h_m'27a᯶m )pNW6Ɇ omcFǬMC!h!lِ1x8!C!!cu!N9q8D6d ^7qHm݆晤Dj晤PavI jGdCsQ8U8m%25jG^a #D)!pN Q6BȆm@!j!Fِ1[ Q6BȆ33m#\0qLԍcnS8m#2S91lِ1r )6aȆ1X7m6 7]`bu86cɆm6m6 CrCr\m8ql.@ׂm6BFnIG1BڡyPPl#l|N sJF(J6d ^7BaU6BɆaFg ݡj xqBԍnP8m 2 j'dC6N@'6N`'Ȇ"NJxR6N`'F41N 'j'dC; 9vRm$ql= {ѓj'dCpEOm6NQ\LS={SjSdC)oR8m"2`8q 8E6d ~)x)SFhL0Q7`S6ȆFajaFِ10h#Lm# #2E`/m&􅴌&ia4qZm4ql8 jdC6NC6NcɆm6Nm6ΐ{/qF)grFm ql|N93jg3dC6@g6`gȆ"~ dl#l݂-[-!cnm6nLq[Faot[m6ql|}om6n ͷa|[m6qln܆umlTYۘw;;!cx;dö|Gmql|N;jw;dCuw6`dcOuw01"o?HHl#lnDºmD ۈ6"6"H!c#}j]Q{}h&]a.qWm.qljwdCs]8U۸m%27]njw( zM(qI$Jm# ۈ"2QnDmDaQdCu# ֍((l#lm9%Jm# ۸G6*:O ib=oS۸m#2YvpXo\9ڸm#2qڸq۸G6d {S۸m' %W&}װ6cɆ}X7m6 )r_m>ql߸jdѼss6`Ȇa+_6`ȆX7m<6 ׍nTxm<$2xxH6d ^7ºPm!l#Fׇ{O{oSxS7þ{ S5A ]sz2Ћ}D #bW?׃21ĨzCd 6k\bHA m<#]?x&gpx xF6d i=Sxm<#2?<3lِ1@kgjϰdylt gjϱdCp\m9ljϱdC6C6cdcùJ61bE݈u#Vm#ۈ%2/mĒ ˈUۈ6bɆX8Īmbqd=eb qFFG6d ^7`݈Sۈ6Ȇ88ĩmaqdCpoوSۈ6^ˏ}xµoa{A6-`zj/dC oPxm 2/`xxA6d  /6^`/Fn_lb딗pRm%lnuKl%ِ1x/6^b/Ɇyx yxۈ'G|dSd-CC6ⱍx!cpFF<O6d kxxl#lhFAml|NjdC{_va{"χIsچF6d ~΃[(:Mm p'R=䨉. womcdC6ܡ w wlÝlF9W s:OZ؆;ِ1xpu]m e6_]چA6d =6< !c l7jv?}zp^V;;0l7m}؇l7kArNmpK.#' 9]}׃$W;HArr csmsmE$ 91@ FrlÇl&#|`eQ6|Ȇm@>j>؆ِ1M}6| !c8ķlm`37"L 6jlA6d pCmÁm8ȆIjlA6d {#Pp`du"M P:P:_ _l×l܆/᫶m  _X7|6| _!c8ķ _ _lÏl[iL ?Q7`S6Ȇ'}چG6d o~Om#2S⧶m Duuj؆?ِ1x  lßl|[mcdC{ZpO_m [汉 FjFِ1h#@m# 2mm`dCpoՍl#l*Sg&F`(v`(zvF H6d o~#Pm#$27am ! omb)Ɗ,gbu#)6R`)ȆF X7Rm6R HmPHm 2C|nPHm[^m#=l|+=JHO6d n#=^m#=lFzh#Fzl#lk#T U6BɆmBjF(ِ1Ph#Tm#%2C|hN U6ݙsJS6°0!c0m a S6ȆmAajaF1|M ق ق j dC pAm#lndu#Fl#ِ1@sJ FF2\MbN甌jdCsJF8dTȈmd$233md62 ! T72mda2Yeeeee尌崌岌嶌屌嵌峌巌}f+b+j+f2V2V2V2V2V2V2V2Vr>L&q^95NDo F5.qe5.e5.8I]2jLpˤq5Wy.Iƃy.W0l]8̇{2g o>Ӈu𚇫y8y25߲яzEϓdsJ6lFvqN%LFvh#Fvl#;ِ1BwdWȎmd'2aȮN6d n#;]m#;l!fsj9dCsJ8Pȁm 2ȡA6d ~\x\FN2r&FNы愽hNFN!cp9j9dC6rB96rb9Ɇ3+$FNl#rȰy+Ľgg6raȆɥ E6d o jRȅm"2C|ͥ M6^\8U#aȭM6d n#7[m#7lFnh#Fnl#7ِ1@6rm6򐍑劶QZÚ y6`yȆm6m6 )yGm#lm y6`yɆNJ%11^4/Em6 Ãm%mjydC6By6byɆm6m6171L>aNΧG6d ^7Om#l|#ȧG6d m-gZd#u:F~_m#?lf+ӆ혚jdCF~oWȏm'2وhqq/GMCk#?Ql,9&F$I\9gdcw2ߊ6 `ȆFX7 m6 )R@mQl|*Q(H6r^(():FAl ِ1336 bɆ甂pN)Q(H6d U}T(m"2SkbBdöRHmQl|*Q(D6d >sJ!BF!!c^E m6 켶QXԍ°nV(m&2=0=Fal0ِ1x( FaFa!cpjnL Lm3l3!c~3o|ِ1x ֍6>6>#27>gjaEF#Êw31E"jE"dCsJ8Q(m!2E`(Q(B6d ^7QDmQl|&FQqoOQxoOQFQ!cQ֍jEdC딢pRTm(Qlm E6bF/ebu6aȆ))Q (F6d ^7QLmQl|N)bjŰs51>{=6>6>'29dCusX7>Wln|jc 01Q֍jűdCsJq8W(m'2?S8܋LRIJ-%W|ϧLRIYR}KzPG֜ R(R_ ׃Rte >WJ91AHC+H6JaƴݓkbkpmZZm4Ql|( jdC=ficV(m&2_j2d#e9 LM2FhFl ِ1x(F2F!cpe2je2dCpoՍ2jedcry&FYq_FYx_FYFY!cβpFYl,ِ1^xYeU(m%2Q(Q(G6y:_.ebu6aȆ-}rj對rdCu6aȆm6ʩmpuy6,9*X*Z*Y*[ƪXƪZƪYƪ[jXjZjYj[XZY[XZY[ƚXƚZƚYƚ[ZXZZZYZ[XZY})O5nC}L7N32325_yu+k\yq2qa+qWl;QY&FVTPۨmT 2QڨQۨ@6d >U_ F!cp jdcOC{r+VTۨmT$2_SUkjdC6*B6*bɆK*mT6*߽lĨ$TF%lِ1ݕݕ6*aȆ+}JjJdCpo_F%l28MSC*mT6* )RYm2QlFehFel2ِ1AA6*cUF3:SĨ"UzFl ِ1xݨF*F!c9 SmT6 V{U6`UFş-71F[Ql8ջ֓TUۨmT%27~FUl*ِ1FUFU!cpUjUjd{f&F5Q7QMmQlnvpڰF5lِ1jF5jF5!cuJ5NQ ۨN6b>xjaݨQۨN6d [VWۨmT'2QiczU;OCk:Qljձdc iM~~j5dC0hW $'km6j hqȷOdHCkQlnԀuF lzLb [akm6j;D N )56jb5=G"Q D16jb5G"QڨQۨE6l`V7j~F-lِ1{jRۨm"2QӜHCkQl{Zjd#k01j=pϼFml6ِ1xݨ FmFm!c\16B8{ڨm&2C|FmFhQڨQۨC6d װu6`uȆa_,QD16`uȆ{:QۨK68ebh]؋Uۨm%2uaݨQۨK6d >ԅsJ]F]!c~.7m6ꑍuep&F=Q7QOmQlF=hF=lِ1zF=zF=!c8ķzjd_?Q_a/Z_m>QlF}hF}l>ِ1R)6cɆQ_m>рlƇb4u 6` Ȇm46m46  `/@mрl|Nij dr1_51  j dC6B 6b ɆFCX7m46 hm4Thh|ȫcoٺFp&i.|;k$oW|/w>]Fk׃t͛̽&C#ëX}zИAcX4191x"zИD~~j&dƜI_L{q;LIoڋ5U{jqqkO5N0_W g+s4~ˢ2ָƵ'c{H{Hګk\{\S1=\SW׸x@6ߘ{:uPmt 2;Flِ1z\owPmt 2:bhD16:`eU&E6:bɆalupڸ}OD16:bɆ掰oH6d ^7:ºQm#щl4^Ĝ )6:aȆ줶 D6d ^7:ImщlF'hF'l3ٸ<1,lt6:mt6: '3|OngFg!c֍jdCguguVmt!nS눗E)]Em хl|mt6 mtQmt!2]`袶J6ؙ#abtu+]6b]Ɇ甮pN骶J6d vUmt%2ߧ 麪mt6sBܛDF7nF7!cuJ7N馶 F6d otF7nF7!cpݠnjݰdyS&FwewewFw!c{[{[mt6 mtWmt'2讶A6&:jHibsJ8Pm 2=`衶A6d nCmуlj=dßZ51z֍j=dC6zB=6zb=Ɇ{ўI6d n'Sm'٘>}`&n|j_`_ S/66 2?; xvj_`_ Bm C^_gg뾄"T.|;ֈ/;0lݗpR}_}>><ɿ} /K\z5_uz^/W{^jp=Ed >WsE/^"2`=襶 lOl&Wb V66"2߷ [|ِ1x_m|m|E6d ֍66z7ݛ-FoX7zm6z a[m7ћlnuFol7ِ1@6zm6cb6@}6`}Ȇ}`oGmчl>>j}>dCsJ8Qm%Gs\諶K6d ~{_x{_F_!cp}j}dC࿓􅿓Um# ѡO`Omяl|N~j~dCF?oSm#2觶O6.|uQa诶O6d F?ٰO6d oFF!c~?7m6.yZ X7m 6 Su!cpjdCpo6`F{J@@!c{{m 6 )2Pmc 1ln uc@lc}LA.FAd#Ҿ#o1D6d 5} Rm "2`1D6d nc1Hmc1l=聊&`Q7ú1Xmc01lma{s`lc0ِ1x ``!c9e0Sm 6{p&׹R!b>Dmc1l|c1B6d ^71Dmc1lٺ!ٺ!jCdwΚq jCE PP!c5P1J6d ~PxPP!c5P1F6-Ma.恏ad0a0!cpàajðadCs08 Sm #20~ajðd#eR7Epp!cpájñdC6C6cɆpX7m 6FjG1F SE峌#6F`#Ȇ1A6d nc1Bmc1lm #6F`#Ɇ@/#E HH!cp#j#dC6FB#6Fb#ɆI I1E6O/-LQ@ME6ro'wc(lcِ12 )6FaȆm6Fm6F ! 1Jmc1lГحMjdC6FC6FcɆװvhlc4ِ1x/:6FmN0c,xM}mhdl2626262elelelelelele;\<|B"Ŗ,c?ZƖX·C5pϿ9Q׸1ƍ'ch ƨk\P17c5n qc|17cFMu+l6ƪm6ƒ  mUm%211K6d >X8q1yS]Mq#{ t6aȆ1G6d 8q8!c581O6!uOcxPNj㱍dC}x7Wm'2a1O6d 6М2^mc<1lPĘaFOkb> !cp j dC6&@6&`Ȇ1Amc݆!ͳuI7?Wg&V.|߳u_k̇{^Wk7#G{_׸Lkzi_z]ܼ1?׃te ~DxDL$2#&>bZD\&C2C2Qmc"1lu?8`c#&>b$lcِ1}-\16lwMLRۘmL"2O`O`$lcِ1o:`ݘ1 ۘL6|gr0c؛ f'mL6& a1Ymc21lnLucdlc2ِ1@}d7dc4166Ql|[| ِ1x֍o66!2߷[| 1l/p=Xc1ژ1ۘB6d nc 1Emc 1l|1vS6`SȆX7mL6 u&S]{ZTwG5HS6bSɆ 1ۘJ6d ^7º1Umc*1lnLucTlcr9LinLuc4lcِ1|66#2C|ۘK6❧41aam6 sa1Wmc.1ln̅uc\lc.ِ1{Uۘm#|+cEm6 44Omc1lñuc.}%LߘjdCχWۘm'2Em6 ۘmWۘm, 3*X pNYX@6d >,s!c}p_tlcِ1LQicmKׄ&XH6Һ7ϷX/$3| "BB!c}хp_tBlc!ِ1xXBB!cQi#mtj?KCkc!l,sޙX$EXXD6d ^7Hmcln,uc"lcِ1L/aN`WNXm|O6r6!,Q Ȇalx316~p>y&<=}ŏj?Ewg3I?vý>}Jg~i̡%7&p~͇$GG5׃%tkXACoطX-\՗1\:Xv׃%@f%$¶(\׃%$Bp{M dc /;E Im'lc%q{їMX j+dCpRmc%lJhcJlc%ِ1Xlx,w蚉Ogxj?c? Ymglg!c9g833ِ1x/3*1}`~&*Q7VJmcl*hc*lcِ1U*U*!cpUjd#EX jj!cpjdCsj8VXm&2XXC6{nQFԍ5nQXm!2_5jk5dCuc k6`kȆ{55Zc7o=01֊uZNYXK6d ^7ºVmc-l|_t-]XK6d ] mUXm#MX'YYXG6d ^7Nmcl|NYuj밍udC6A6aFn{11֋֍j뱍dC6C6cɆpNYXO6d o6֫m66ǖUkbl؋nP؀ml 2ؠ@6d ^76Amcl  FQ#&FW/j=H6l//ިH6d nc#Qmc#ljdC{_jMd+116u&N٤ D6d ~Mڛ66aȆml66ml66 )MjdtcaجL6d {f{ff!cpjdC66C66c~;")[:elc ِ1̜i*-j[-dC؋nQ؂ml!2_l6ml6 q71$IJ6v's*jCV!c^t+Eml6 [_Fl3y5/p //dC06ںb8mC{r% ِ1 S~Ql|_h__jcbSL+ٰEƯƯdCƯUmWlW!cgdb8m$2&++ِ1+Ư6܁31 ֍mj۰mdCkmp MmclfN1e~HCkcl$11mj۰dcZh")Lvhcvlc;ِ1}}6cɆalTr@OWmW؎ml'2SC6m8<[7Ƽxg~"~S.|; ֈ~;0Ólot+qm>0чkoo>܇}xٺ5M}w?X{Cw6MW_q=aNd cVup8{OPZz;1x=]mwlm`EM?\ mmA6d Gkj` بᴱNCkl!c=??66v !l6vm6v 'p|O!c֍j;dC;j;dob6vB;6vb;Ɇ{̝ܩI6d cVupڨ@F؉m$2_6vm6v=K%~CCۥ E6d ߹ wR؅m"2Qi(.lcِ1tKmclTsȚ- حM6d onn!c9+ƧID16vcɆnq@c{`أC6d ^7Gmcl/eٰQ؃m!27@{6`{Fcڒ+ثK6d װ{6b{ɆA6":b8ṃ'K6d mUk<Rao'̎}s<[e;h;d;l;b;j;f;n2v2v2v2eeeeeeeeeeeeeee|}T"96N5nq7{}׸}Td 3qŠs-S׸}'coq5n(W/l6m6 mW؏m'27 [7_mc?l|دl6m6,57ϚGD/zG6`GȆalqpVR3Q #!c~7m6 )G#jGdc} &Q%ݞjGdCGQQ!cq֍jGdCu(qTm(qlIἱ8&~3>3>q 8F6d >s1c1!cxoՍcjǰcdC6A6a=8EMxlؚjDZdC6C6cɆýjDZdC6C6c*bj01딿:oɆm m77ِ1:oN[molo!cߌ6V8A6N{zVkxo݉P޺j'dC6N@'6N`'Ȇm6Nm6N aO@'6N`'F%>6>&IQ7NºqRm$ql^^j'dCsI8T8m$2q8q8E6n$K>%c'㔰q 8q 8E6d ^7NqJmqlnu)lِ1RSj6yc'j]pOBx>Ո;0?C]V"?o>Ӈ'ukiOwZԃӰV_Ӹ/czpփjq=8Md 6= EV8i!c4qZm4ql 1K㌸/ /l ِ1uFm ql/ ٰQ8m!2_6Ψm6Β$F-8+YYl,ِ1x8 YY!c>,#Ϊm6Β ׍Y919űMsbN9sj簍sdCu6aȆspN9q8G6d ^7A6aF`dbw)8O6lj籍dCssW8m'2a8q8O6d n\6.m\6.QE71. jdCeo\V۸m\&2qڸq۸L6d ^7.C6.cWƎL21^ Em\6 Su+!cpW+jW+dC6@W6`WF =nbb\kثp {Um*ql\%rUm*ql77jWdCsUhUl8xxߚׄk5k5!cq ֍kjװkdC6A6aȆA6aFYib\uo\W۸m\'2 chm\6 )r]m:qln\6m\6nkqCԍnP۸m 2_܀j7dCu76n`7Ȇ Mѹz71n 7j7dC`&ٰ]j7dC0]16lOT۸m$27j76$>DXemcݵEYY[XƢ-c-c,c-cO,cO-c1g疱XXeee,222222`{o`9&j5N7QEA5N_"5.׸q2"`oqEP1k\E٠41nnm6n ? >Kmql-h-lِ1w ڸq ۸M6wĸ- q۸M6d ޾ ۷6ncɆ- dml6ِ1z6q[m6qlL܃s={=!c5=h=l>(3GcqߵN1'i T)D>{_m>qln܇u}l>ِ1}}!c9>q_m݆!ٺ$˛o<[\E<0>==P;x`w`>Ӈ켽]l~W|po׳u5p=k^a vzlhxGGzMW_3Gq=&2=V D66dr?cb<CC!c!+m<6 \Pm!lCjGdadx$zG|xD6d c>=#G#!cpGjGdC=#h#l1ٸM^MjdCsc8''11u3Ny xF6d nLml|/  xF6d ދ>6m<6 ?X{꼉\xm6^m6^rZmx-zװ}xM6d ;k;kk!c~57^m6^ ׍kAml|S>m|6> a?@6>m·ad17˘e2iy[ƒ[|,c˘e2o ZRXƂ,cTԖ4XZX:XzXe,2218$yMn)I)I㿧s W$?1{pKJ69wO#i_o' CjIdC$ C$UHm$%2/FRl#)ِ1xߜHnW2yg뒅Uv2dv?}6g뒑i3 W:Hfw`>܋l]0ےL}ٯp1{G<'IL3n]}navS;p|psZn$B pSp6F:hbu{ZGmcdCgi46ܱ w!cxȆچ;N6d GCj؆XtGPJC X7<6< !c놇چA6d Ѿ+΁6<ȆІچI6vI{yS6<6< O!cj؆'ِ1@aL O OlÓl|N6<6< /A{31Ĝ/ /lËl܆᥶mx )^pNR6Ȇ/hKm &e[fbxEj؆7ِ1 o olÛl`o:V6Ɇoh[mHN6(48_\i%{Z6cɆauoqƹ\=-Q Fr!c֍jɱdC6C6c>dNF>a}>a}>j>؆ِ1xuGm!2mm`>dC6|  lA6.4}T`g!zQEjlA6d o8`Pp`!cNtm8 ِ1Ehá6|F[zG+_8mbdC6| _ _l×lnº᫶m 6|6| ?q/lM ?Q7`S6Ȇ?8ma~dC6 ? ?lÏl|N66 {u  lßlU0tϪچ?O6d nW6Ɇ7  l#l8Pp sQȆm`dCu#֍l#l|+}m`dC6l#lwdXq#Po@@l#lF m o@@l#lF m C[v.eb)h F !c9%SRm6R SRuJ F !c~#Bm#D6f9O/kbFFD6d ^7`R6Ȇ- d#Hm#"2mmad#-oeb^4jF0ِ1`h#Xm#&2Sm 66dcx#eoO0ޞj)dC6RB)6Rb)ɆFJX7Rm6R H mTHm"K>>J`Jm#lF*h#F*l#ِ16\æRHm"26Jm#l8_,uogR2G,*#oLHM6d /VHm&2HHM6d ^7RC6RciF)睉L4b_4 MHC6d ^7Fm# l|# HHC6d ^7@i6`!d@741BL! <Q6BȆϣ Cхm`!dCu#֍l#lFm%xVSuJZFZ!c C LHK6d oi6biɆ甴FZF:q.D#7~#F:l#ِ1W:Nm#lnu#F:l#ِ1xHmSHg|8&y&i|&)=2ҫE0>gғWeޮG'9W_o>܇^k׃Pwg<ӻ*;C~gzJW_=f(1CBq=%2?#U DPh#Tm##ܸ&-EFF6d c+[r%m aS6Ȇ0h#Lm# @6^qeJB#133Fl#ِ1xF F!c p/}n+n+a+i+e+m+c+k+g9%8ϱs+M9e5.q5.q| 3k\&\2Q1 5.q7k\&u˄p1#ٿ7 QF8N6d 7f6±p!c9jF8ِ1mmcF߅712 jdCu#362cɆ2jdC62C62cYƒu.dbd6@Y6`YȆTY*Fl# ِ1xߜY6`YȆmd6md6m?51߂]ڬjYdC6BY6bYɆ甬pNɪJ6d n#+Um#+ll}&F6Q7Mm#lljٰldC6A6aȆ{lF6lFvQ^EƘEFvFv!c֍jٱdCsJv8dWȎmd'2١jٱdc,571?;8*ĞŨ؛$$B$B̈MkVjUgvmjn~}3:ub(/Q(J6d n(QTm(Ql- {ѢjEdCu(QTm(N6;ȏ#L wQ7apWp6Ɇ)p⮶m  wX76ܱ w!cܡ w wlÃlLr%Y1&mxmx`dCP6<Ȇj؆ِ1x6<6< Ox+h)lxBj؆'ِ1 OhSm$2j؆'ِ1x mxmxb^dlz% /oxmxa^dC76 /!cu\xmxa^dC6 / /lb)&F1Q7QLmQl(bjŰbdCsJ18S(m#2QLmQlۭųuu6cɆFqX7m6 ׍nW(m'27C6c%Fk;41Jp醙F lِ1F F !cp%j%dCF ؆7H,}uߚN^woaچ7M6d l7|[m&2 mxmxcdCs7᭶m$tHzQRԍnT(m$2%a(Q(I6d oFIFI!c^$QRm$Ql|ME&F)gEF)1͡L#wJm6J ׍RnR(m"2Q (Q (E6d nQJmQla(Q(M6d }'Fil4ِ1FiQZm4QlFihFil (rc#M2NA2dqMe6`eȆ2pN)Q(C6d n QFm Ql-mQ(cxȫynVKuea(Q.<ǃ w>[W,ݕgR':(kw`gn엵}sw5H<8:e,蜗_Qy^9UiSr/c=rpOA9\ʑ_C+S(A9!cG9hF9l<ؕ~vMb/< /Q(O6d 6e')Fyl<ِ1ڴ<6cɆC6cFݮ7*EXQۨ@6d 6*`ȆaF+g c^'16*`Ȇ F FEq}&FEQ7*ºQQm"Qlj3F{u$FEl"ِ1La{}@EFE!cpjJd#R&F%6JjJdCu6*aȆ-*}JjJdCppcb 6*aٙcbThe؋VVۨmT&2YF8c8lسڨmT&27*~Fel2ِ1EehFel hG/71ggmT6 [TU6`UȆFX7mT6 U*jUdIሀMnTuFUl*ِ1FUFU!cQ֍jUdC6BU6bF'21 ՠjjհjdC6A6aȆmT6mT6 ۨmTSۨmT'ɼFf;Ĩ.zQۨN6d U}UWۨmT'2QڨQۨN6d oT6mT6|Ƙ gM Q7|`Q6|Ȇm@>j>؆ِ1\ů Z>؆ِ1᣶cx?̹y#_{<,c5,c5-c,c-cu,cu-c,c-cXXCXe,2lkdklkb 555ZZXZZ,cᖱXe,~_qYks9 kK5Ngr}58_q2 k/qTd O kϏljx'pچG6d 7Om#2`o䧶m F~ІچQlMnԀuF lِ1F F !cp5j5dC6j@56j`5ɆBQSب mTۨm$2k¾FMl&ِ1E5E56jb5ɆmԄ6jm6j6nb{n-ZF-!ck?ൟZjZdC{n-ZF-!cZF-ZFmy41j~67jm6j )R[m6Ql|N jdCu6Q[m6QlԦL:}:k!:ju:dC6@u6`uȆ*~ T7m6 ԁ6m6꒍ˏivĨ+ߨQۨK6d >ԅsJ]F]!c5l]QۨK6d ^7Bu6b=Ĩ'#S//L=zF=!czpF=lِ1R)6aȆ7A6aƕDfQ_aQ_m>Ql ;@m6 ׇ6cɆ{F}؆?h{v{&?H乏#?ؑ{6 !c~j؆?ِ1xu_m'2mmcdQEGcb~#jFِ1xl#l|#om`dC6l={[21֍j dCu 6` ȆFX7m46  j 6y5$I\[Vj "< \G4;0Oϳu J7}sO9o> q=s&J~g T@\ =fA @sE +"q=$2+@@l#lT3#H?#Hm#"2NmaAdC6 l#l9 h#Hm#& ?/,z`8kmcdC6``l#l}DF0L6d GCjF#SFF#FF#!cpFjFdCu6aȆFF#FFcq"\M~~jdC6C6cɆaÝ16lVlhL6d n1Xm1фl1t*M`hhB6d 6m$M6`MȆ5Кm46 )M&jMhzz11BD/{l#lFm !Q6BȆm@!j!FSQpBLn4uFSl)ِ15ZSFS!c~)7m46 )MjMfdϢv71~7m46 ׍fn4Shm4#2 x5Shm4#2 h hN6;'2a4Whm4'2E#16V/ Obhm46 )\m9ќln46m46BFId61BE PPl#lZ(m UnmbdC6BPPl(ݴ,&F aBmтlhj-dCu-6Z`-Ȇaldmb -6Z`-Q4h)hhI6d oFKFK!c֍j-dCu%Rm%F6mq6#LS:%Lm# #2mmaadCp+Lm# #2mmadc`ݧ01Eu#\m#'2mmcdCu#֍ppl#lF8mD ?ebD~#jFِ1y3Pۈ6"Ȇ*~ d#Bm#ۈ 2mDmD`d#ќ.61"E݈u#Rm#ۈ$2 mDmDbdC6"HHl#l6"6"(qx`]QκavȆRFE6d k((l#lFmD ׍(h#Jm#ny?0}?L+{<-c1XXkXeee,2222222`bKuuu}igo`hy?L+qK*^ sj%TƵ58׸VƵR׸VƵ'ckƭ5V ׸VTd ~]q5FgobD;mgɆjF4ِ1*6h!c}hOmD ߿ mDmDc1dqSC|A#FԍX7b6b!cFF C6d ^7b`݈Qۈ6bȆ{h#Fm#ۈ%tWC!#V<# Uۈ6bɆF,jF,ِ1~XXl#lYXh#Vm#hM6*ukuasMeNJka;)6ZcɆ"b 6ZcɆpNihM6d ^7ZC6Zcqd#nyEM8b.Ǒ ۅ88l#l|/&ĩmaqdCu#֍88l#lFgxȫno} um\6v?gF݁9xJvkw[ڨ~7O~ 6ګm6:qĜ)6:`ȆFX7:mt6: )Amсlnt6:mt6:G,iKiO#\tTmt$2YF8c8lض;mt6: M;µiGFG!c~#Qm#щlxv&F'1tsJ'NF'!c}NpߢF'lِ1xF'NF'!c 褶 L6%/Y mtVmt&2F3|FFgl3ِ1FgFg!c謶H _`b$w%w%m$` dCF76!c_HPH6ȆFmt!d dbtFotQmt!2 軐 DEm хl"7mt6 ׍.F.F"٘a‷MD1$9%Qm#H$2'm$bdCu#֍DDl#lF"mt%agbtvvUmt%2몶J6d otUmt%2 mtUmt#cQ&F7X7mt6 ׍nntSmt#2Emt6 mtSmt'7_11~;7mt6 a/]m;ѝl|NjݱdC6C6c=ҟ*31z=j=dCsJ8Pm 2衶A6d o6zm6z..V)l6zm6z }{_=6zb=Ɇ甞pN驶I6d ^7zB=6zbȆk^F/^F/!c9Szm6z mRm"2^jdϋV- 뭶M6d >sJoFo!c97Szm6z #譶C68(P#)}:Flِ1)}6`}Ȇm6m6 )}>j}dOȭM{_}}Um%2諶K6d n/Wm/їl|ϼ/Wm/%{{8"Rԍ/aRmKlK!c~Ko|%%ِ1//66$276TG6\Ni#~~dcěCw9^mc<1luwƫm6Ɠ mWmL ' ^|=1A`/:Amc1l|N j dCk p ;Amc1l|NmLPۘm|E6mMD ֍66"2WWdCpWWdC_A_m|mL$-V&DQ7&º1Qmc"1lߘjdC6&B6&bɆ甉D$wS]1ɹe~Id}MRۘmL"21 ژ1 ۘD6d װ6&aȆE'A6&a֥M41&1֍jdCpa۳Ɇm{vdlc2ِ1d5Ymc21lߘ mLVۘmL!ڗmWcn_c ٘6ݐ&3 WS6`SȆ)ߘ1ۘB6d ^71Emc 1lhclc*٠;SEݘ TT!c1֍jSdCuc*S6bSɆT4QCw/zӜ{_ٺidYKmL6 `1Mmc1lnLuc4lcِ1i4id3{_5_m|m|M6d ~=kx=kɆm| m|55ِ1sl|51llqܛhbL}ktlc:ِ1x16cɆ̧=jӱdCthct C^ߘgv}}F-s<8z7jdٺo7웃fٺo9F}ο`s.mЛ!-f}?׃te >Ẁs  21gsZ \f[̀6fm6f K3\3ae1ۘI6d DI6lKj3dC3~LL!cb&1Smc&1l<@c1gs,lcِ1Y,Y,!c>b#fm6f ۘmRۘm&.'IlbĕeVۘm&2 ;)ɆVۘm&2Sf9ellc6ِ1t61[mc6-?s&ƷbN)ߪm|m|K6d ^7u[ooɆA6F;c8l|M$ƷƷdC66UۘC6Rcbs8Qۘm!2ژm!2s`ݘ1ۘC6d ~}1Gmc1l{ܿcsaݘ1ۘK6d 9wUۘm%27~c\lc.ِ1x1ژ1n~sy?|,o[`[h[d[l22222222222elezF&fV6vN.aQ-4N75nquwk<\Q1\ůvk<\Q1^[v)?}+웃f?ޕyptοWq=XG<`}zľ:oN}zξ:X֩`91\X׃u$Bs:hc:lQ[y?^j?`? Mk6~6~ 2xj?`? __Amlc=x<`Ȟ&zq m=^mc=lnuczlc=ِ1zo^mc=l|X@66Tp ;7blcِ1  !ckh5 j dC=hclc#sH)ו&FFFF!cpjdC돍pQmc#lmlT؈ml"f5bI)Imcl&hc&lcِ1x&M&!c ؤ l֦ /716=pOkflcYfhcflcY|S6ml66ml66ml6}tEԍ-nlQ؂ml!2^{ |^{lc ِ1\ů-j[-dCshclc+iL {ѭjC6B[ɆVX7ml6 ׍V61zc ئ F6d >ls6m6!cp۠mj۰mdCkm6mv)`blvolW؎ml'2ml6 )ᜲ]mc;lnl6ml6v;!ְ;vlcِ1x!c֍j;dC;j;dcf/&NQ7vºSmc'l};wm6v Uh|Nlc'ِ1x mT؉m"Q2jb.oR؅m"2Sv9e.lcِ1 )6vaȆ].]v7my؏},c,c?[Z~j;g;o`hdlb~Tp|!ms-pۭqqM5Nn8V׸ݸ'ch7vkn\vS1ָ{q41}=pnlcِ1{6`{Ȇ׌m6 {=j{ƊꎛgME֍6~6~$2Gxj?b? U@uGɆp6~TK6cGm/Gm^lc/ِ1x ^^!cy/m6 ){j{}d^hbuc6aȆ}>lcِ1}>}>!cp}jd)}&~ l~q|sϏ˓_mc?ljdC6C6cɆm6m6~"]&Ob/'OOdC0{ׯ9$OOdC5Im'l'!c^'h'dc&!ijuu6`Ȇ8q8@6d nq@mqln6m6~&9go 6~6~&2?údC6~6~Vl|ghgd#U9L$9y]C֍jdCu 6bɆ7jdCu qPm݆!_!0ujZ/v?|?$bw`}b?Ϟݺ_9E}IVr;$-}C׃Cte ^zpHȁA"zpD6m6%=e9nb{^aa!c{H{Hm6 UhmzXm0qlL daly=4&c#!c{V{Vm6 ׍#nQ8m!2G#jGdʔ[21q֍jGdCsQ8U8m%2q8q8J6d n(qTm(ql,ٻ&1Q7qLmql|N9cjǰcdC0616l9q 8F6d ~ qLmqlyy#zY㸸g8gql8ِ1qq!c~#aؼMG?q8N6d n8q\m8ql8ZLbN9j'dC6N@'6N`'ȆpN9q8A6d >6Nm6N-kTs8)INm6N 8 mT8m$2: Nm6N ׍I)Cĕc/S)S)!cpSjSdCu6NaȆOA6NaFssy_61N^4EOm6N 8 mV8m&2Nr^'9q8M6d ^7NC6NcgF.GGbbu g6`gȆm6Ψm6ΐ )grFm qlhl,P݋WM= {ѳjgdCgYY!c_틞U8m%2q8ql=+ƯƯdC6~6~UlmmJ6d nWhW_sdc𖧶nb9s9!c=sp9lِ1xq6aȆm6Ωm6ΓFibyoW8m'27~yl<ِ1336cɆm6Ϋm6.SX\ j dC6.@6.`Ȇ ߸q۸@6d nqAmqlЛVEE!cpjdCEo\T۸m\$2qڸq۸D6i8{&%qo%xo%K%!cpKjKdC6.A6.aȆ߸m\R۸m\&kyqYS.uee!c^2E/m\6. ۸ m\V۸m\&2j+dڮW63IWF=K!oܾq۸B6d ^7qEm ql| q۸B6d ~ qEm ٸ=lG&onoja o7~S looja ?ova70W-fn2v2v2v2v2v2v2v2eeeeeeeeeeO K+k[_w\Gw5<6NW}yF*8.] UukUq2qWaqWqJ5Np}U]wjkUX㮪kU<]#&5Ow ]S۸m\#2^|^5lِ1x| 6aȆk5kuQWwE߭q۸N6d ^7úq]m:qld#+g oӽ>q۸N6d ~uhu C^gg~sEna}wljdٺagn?|wxWq=A|1^z7 vC}ozpξ7: \nUH  2+n@76n`7ƀq[:zmb}MGT۸m$2#"16lT۸m$2&Ml&ِ1\qڸq۸E67ή|cbtnY-lِ1xݸ-[-!c1om6n ݂6nm6n ĸ-l܆6nm6n EHchm6n CrCr[m6qlmhml84qGظmQ۸m!2s^ӹq۸C6d ^7qGmql߸mQ۸m%_5^hط m6 ۸ mU۸m%25О]]!cqڸq۸G6,\95qOԍ{nS۸m#2qڸq۸G6d N)6aȆ=h=l}Ӊ$WupdC66Plnj` S6P۸O6.'Iĸ/l܇6m6 wއ6cɆ߸q۸O6d >܇6m6y/Jab<okjdCs8kh6>`Ȇm|6>m|6> m|Pm| 2/Am݆/k{_7w8őHjKf22bKaKiseeeeee}nfnaiemckss{_2$)u ?$n|K濿;埓Iܒ'cIz;u X㒸O ߩc-b/qwpKJ6;n#HHJ6d >%uC_RFR!ckIеjIdC{,IjIddcns71 ɠdjɰddCkdnhMLm#lA2a|Lm#lz_2h#F2l3/tӒ&gn|Zoِ1x ֍6>6>#2S>sgja )Am|m$'Y21{ϒ{ϒm$6 ׍n$WHm$'2S9%Frl#9ِ1Hp!.*ի.nhm g gEmp!25  lÅl|Nq6\6\d`O7LbNIj)dCu#)6R`)ȆbRj)dCu#Bm#lwngI#ES^4FJl#%ِ1x)6Rb)ɆHHI6d n#%Rm#%J6]wcb 놫چ+J6d ^7\apUp6\ɆmBj؆+ِ1x/ mmbȆ˚DHF*TF*!c0Ȇh*TF*!cSSm6R ׍TF*TFjqZХLbSRm6R )ᜒZm#5l@u#Fjl#5ِ1xH mVHm!s-)Fԍ4nQHm!2 MC6li6`iȆm6Ҩm6Ґ S@i6`iFMb aӪm6Ғ iaVm#-lFZh#FZl#-ِ15FZF:Qoeb6A6aȆI熞IHG6d Mװ6aȆF:h#F:l#=Tލ?[ =[^m#=lf鉶3IǓ:' Ck#=lnu#Fzl#=ِ1FzFzcL j dC0u#a j dC62@62`Ȇ{ F FF-~҃~>&FF7ݺnu62bɆȨH6d >dsJFFF!cpjLd[?#2md62 `Im#l|#Ȥ D6d >d62md62[ƿۓ }'Ffl#3ِ1FfYm#3l|N jdCFfFފmkYDF,F!clNJ,F!c9% Smd6 f6md6ގ{Mndu#FVl#+ِ1x FVFV!c֍jYdC mdUjxs4IY<[zs"<]\ss<[9Cs~S<}s9蜧lH^6tUۺl곟 ׃lte ^zM ȁEdSȆA6!c"Mm#l8>^.;jٱdCkFdWȎmd'2#>"Fvl#;ِ1#;]m#;lL}"&Fa#Cm#lnu#Fl#ِ1FF!cȡI6B;R%)9#FNl#'ِ1x FNFN!c3'1sm6r i6rm6r-[W-%l6rm6r mRȅm"2 ȥ E6d ^7rA6raƵ4-pNɭM6d >sJnFn!cpjdCpp@6rm6;d/#m6 ׍&Wm#/F6c3M)npNqSp6Ȇ78mandC6ܠ 7 7lÍlnAnjnF>&F>1sJ>|F>!c֍|j|dC6A6aȆA6m8s#Ύx}a+d+l+b+jsyX<-c^b▱1oXIX)XiXXYX9XyXXEX%XeXXUX5Xu˘0m-̟S~函Q~uˏk\~q2/5.?8t5.?q7k\~uˏdo՛FF!cpjdC~ k?6 `Ȇ{FFAQoMξٜd֔T(m$2Q(Q(H6d ~YAxYAFA!c916Fg>2FAl lk9&bM\S}ِ1x웿Pl@u //ȆalqH/>2F!q hV&F!aQHmQlF!hF!lِ1\SR(m"2ڏ3S m6 ^ވ61 jdC*, UXXm0Ql@uFal0ِ1:c 6 cEFКqbM"b/܋)Q(B6d oF"F!cuJN)Q(B6d ;16Nr|㚏Q(J6Vq&FQqZQxZQFQ!cpEjEdCpEm6 ׍nU(m_3?;pu w wlÝl. [1wWp6Ɇ;j؆;ِ1 wh]m _5yg<6< !cyymx`dC7<6< !c hCm$zekobx 놧چ'I6d l'|Sm$257<6< O!c~j؆(>`ܖ&xF >#㥶mx aKm "2_z5چE6d uKm (F6hQLa5l1bF1!c9%a#=ﺋrx~CkQl(bjŰbdCF1hF1l8X9b|a(Q(N6d ^7úQ\m8QlFqhFql8ِ1 gڲ}Ck݆!:_?߭+j%"<u%ȁ%Jxppu%騗'מo<7s~qܟ\{KzMܣv5ž7ܷV}o\xzv791x {Loo\I{ù[m(I6^kýn&FIG}DIFI!cRlNJIFI!cFIFI!ciIhFIl!^xwi)RjRdCu6JaȆ*~ (Q (E6d ^7JA6JažEiQV(m&2FiFi!c=pOFil4ِ1 wge<16JceFޝmbq [ɡFl ِ1x(F2F!cQ֍2je2dC06;c8lNt>2Fl,H_c&FYQ7ºQVm,QlFYhFYl,ِ1VBtz'16beɆaltp82#}d F9q4&F9aQNmQlF9hF9lِ1L/#տ^(m#2`(Q(O6&XoWS9Fyl<ِ1{yFy!c9j>؆ِ1 hGm!2W᣶cF?X XMX-XmXX]X=X}˘e,222h [Y[ƚXB,cM-c,c-c0Xe,2iƗj\U9{|=jk/88_X|58_q2qk/qTd ^|aU8_<$ L ?qGOm#2`짶m Om#2᧶m OqM21j8{#k jm6j 5`\CmQl^^j5dCuQCmQl>yj)&FM T56jb5ɆmԄ6jm6j U֚j5dC& mTۨm" Z3Ĩ%Q ۨE6d >ԂsJ-ZF-!c~7jm6j ۨmRۨm&;aݨQۨM6d n6Q[m6Ql|N jdCsJmhFml8s׋&F}H:dc:F!cpu:ju:dCuu6`uȆ)RڨQnW]l l]]X-EԵ0On]]r`vP<ǃuuٯ>ug<5J<8:u.G,CXփkz_׃zte oQ[S;A=r c__TO-HzF=zF}Q݋WgF}F}!cgdgdm6 aQۨO6d oQڨQ'V1t/zL8kmcdCkS6W6Ɇ{LcmcdCuW6V!31h#@m# 2'P|'PF@6d Wk}l#l|mmm` FB桻ob46@ 6` ȆYmYmh@6d >4sJF!chhH6D&FCa!Pm!ѐl.4$Pm!ѐl@uFCl!ِ1ڴ!Pm!H6^dZlb^4jF ِ1xu#Pm#$27am ׍@h#Pm#"ۊfH;#H_/ R6Ȇ{ ؋maAdCsJS6 !c~#R6.51Ŝ ``l#l|3wmcdC6``l#l|N 66Fd؎.31 FjFdC{_W#FF#!c9Sm46 o46m46 j]ab46C6cɆm46m46 ߳޳Xm1јlh m4Vhm4![cDM`/Dm фlFhFl ِ1)M6`MȆ&F&F٘8U[MQ7B`Q6BȆ)!pm 6B6B!cw@!j!FS؀h*GFSl)ِ1FSFS!ckmMᵶjMdC딦FSF33yיDhF3fF3!c9Sm46 ׍fn4Shm4#2SA6a ͅFsFs!c5lsmhN6d n9\m9ќl|h%oZ`b FF(J6d n#U6BɆ)pm SBPPlوy=4&Xj-dC6Z@-6Z`-Ȇapg &j-dCuBmђlxx`fhhI6d gThm$2j Zm6Z -j-0Oȭ&FsN1 #7K S6ȆmAajaFِ1x00l#l|N 66°pDIFF8N6d n#W6ɆmCjF8ِ1x66±q5xEFP&قl#l߈FFA6d >D9%Bm#ۈ 2mDmD`d2kĈ#5HHl#l.lI6l HHl#lޞHxoOF$I6d  mDmDbQd}7mbD9mgȆ u#Jm# ۈ"2QnDmDaQdCu# ֍((l#l|mDmDmô#2cYXZ-c,c-c,c-c,c-c .DXWX7XwXXOX/XoXX_ؗ~9je-kV^tsJF!c^Amёl؃31:^#E;mt6: )Qm#ёl|#ꨶH6d ^7:B6:bƖF>ImtRmt"2`褶 D6d ^7:ImщlF'hF'l3٠71:^3E;mt6:  mtVmt&2謶L6d >t6:mt6FV7hb$FF@6d ދ&^4Am#H 2Sm$ H66.d#E>?]21֍.j].dC6@]6`]Ȇ)]:Fl ِ1袶H$쭱#QS:%Qm#H$2Sᜒm$ H66D!cpFF"ѕlL葘;Uӆ]ɆmJ6d ~=+Um+ѕlzJWx=FWl+ِ1WWhFWl0o01~7mt6 ÅMme\޳H)j+GmUޛb  !$$d{ԮG]*~ny=ws}\oyuM6lS0a0!c~c7m 6 àajð w-nl;<[箶m o w wlÝl܆;᮶m  wh]mN6.1\ԍn Wm '2?#31N6d ppp!cpájñd#jS!Mlxnlcِ1x/:#6F`#ȆX7Fm6F #j#dǣWkbuc$#6Fb#Ɇ?~oHlc$ِ1x HH!c11E6gbuc6FaȆ7FQjQdC(Q(!cpQj6cF3II494DZj"œx$&+z,ŵFxI hmiI h=q(#A8~p` }׃1Q;r c8_c"z0D]11X6CLbs,1K6d {_c}Um%211K6d c6ƪm6u ~bbxj؆ِ1?<6< !c8_wzmx`dC}ᡶm#v63cx6>C1G6d nc1Nmc1lnuc8lcِ1q8qx랛ㅍxx!cp㡍j㱍dC6C6cɆx1Xb?M bN j dC؋NPۘmL 2:>_1ۘ@6d d1Amc݆/q^a|262mdlbMMZƦ[fXfZ,c,clXelele,2lgo --ZY>ssװ2<Ś<58Oq2<穮qyR1'܁T8O\<|5S]j>؆ِ1 hGmۘJ6oq̕Ę*TX7mL6 )S2Umc*1lThcTlc*ِ12ژ1ۘF68"1Mk2 k2Mmc1l|NijӰidCs48LSۘmL#21 ژ1 %ݜ߷21|:S|6| _!csچ/K6d ^7|aU6|Ɇ_hWmۘN6y.'MmbLuc:6cɆpN1ۘN6d 5}MWۘmL'2ӡjӱdcwӘ3D136f`3Ȇ=~7{ lcِ1y  !c1ژ1ۘI6?01S Tۘm$23aݘ1ۘI6d nc&1Smc&1lLhcLlÏl$wasS6 ?!c~~j~؆ِ1? ?lÏl]?hOmۘE6Ę%̂gdfm6f Sfu,Y,!c^tEgm6f ۘmRۘm'/?76 !c1;j؆?ِ1 h_m'2?/mmcdckb߭ ȏ~.@m# 2 jFِ1h#@m# 2FF݆ls&}͆;"fE'xڽ lv>^߳uݟw\<Njau]{>׃@绌h?(z@c~ te G>"P ׃@r cG \EzH"d >WBjy֝9M99js9dCH!b>blcِ1\1V9js9dCk99\mrsչp֘1ۘK6d G̅}\\!cpsjsdC}\hc\l#l4$$AjAFِ1L슁maAdC6 l#l|/<R6ƽ"e1yM`19%Xm#&2nmcdCF076`!cpFF01l:{LyB6&FEC`/m ?_ WC6B!c\166w-I l#l|N 6B6Bd?vTX X7m,6 ׍n,PXm, 2Sb8mTYe>X@6d nc@mcll SB&BNY) 6b Ɇm,6m,6 )]16 UZ dC6B 6bdûyP"&F mmbdCCPPl#lnºm 6B6BEd~Qi 519eSm,6 ׍En,RXm,"27b8m,%?XD6d W X#i.&FajaFِ10h#Lm# #2_uJFF6d ^7 00 aa_fG;-cK,cK-ce喱HXe,222cY-c DZ:zF&fV6va©}NS8䆫k\8qTd j8|g5\]q 'c=܎gxƅN5Na W׸p<-&PX,p[XL6d /VXm,&2i_$blc1ِ1bhcblc h{ܯM%bn ܧ[XB6d ^7Dmc lhclc ِ1xXm,QXm,%y=kT5RR!c֍jKdC0}s7W zIYObhm,6 KjKA_*kbDl6lؾ2mD ׍X7"6"!c56F]ObhmD`dCD@j2qe[ߘD 6aȆz{2lcِ1Fx7W bt,'16aȆe2er7G &rqn9<[\mc9lrhcrlc9ِ1x6cɆrF$0&FXF5lF$I6d >D9%Rm#ۈ$2$6jF$ِ1Hh#Rm#ۈ"O_4j7a^"6(!cFFE6d #E6lD6(!c~# ڈRۈ6$W616a6h!c FF4M6d ^7a݈Vۈ6Ɇ)FF4lnUpc8[[XA6d ]װ+6V`+Ȇ1RZ+dC6V@+6Vm8y4g<ٺZTXia.]lJ8T;Xiw`._+w\<Njwn%+|%1tϓnI%[ C/F[}ݏ 8WĨzCd \bH{h#Fm#ۈ%{\_Ĉp3Vm#ۈ%2 mĪmbdCp]XaʼnUۈ6bɆXh#Vm#XE6|ݜ?kb=*8kRXm"2 X XE6d *U*!c*hc*lc5hB71V jdCkհXXM6d 6VcɆjF&FSmđ ׍8X76Ⰽ8!c8D T76Ⰽ8!cpqFFO6Ζ\n}#^؈66ⱍx!cjF<ِ1xh#^m#ۈ'2mīmc dc|w Z|m$ ׍X76!c}rMPH6Ȇ%@ j F"2qLDQ7aHTH6Ɇ=d$m$bdCF"76D!c^4HTH6֐/9?jbghk6`kȆ{5]XC6d >s5!c9e Fmc ly?bb딵pVmc-lFGW C)QZkdC_ Vmc-l|c-Vmc-l:)`bs:8SXm#2N>'YXG6d uj밍udCucNmcl H&zac=^mc=lFgW ۣj뱍dC߇Y^mc=ln6֫m660169eS6ml66 `Amcl j dC66@66`ƫ]=Wtmibl66B66bɆFX76ml66 ìS:bЙܝэϥ,I F!cpjMd~YIS6u&M&!cMpc&lcِ1"66aȆװMjdëȮ)mL͢ jdC Ymc3lntvpڸ~b،ml&2j-d'/319e Sml6 ׍-nlQ؂ml!2_l-j[-dC[-j#5=61foުJ6dl~?}Vlc+ِ1⯁Umc+lnl6ml6UMmnluc6lcِ1:e\lS؆ml#27~c6lcِ1x ئ N6KgcYِN6l_ خN6d olvv!cpۡj۱dCuc;]mc}E>wWϼVj{dCs^X#m6 {aWmc/l| mU؋m#c5`b{>}>!cwwm6 !b 6aȆ}jdcdn/ž~o_mc?l~xFf~lc?ِ1~~!c}~QJә?!cpjdCoP8m 2S@6`Fo+119 Sm6 a/zPm ql8q8H6d ދ6m6_iz.51 CjCdC!؋R8m"2jRŸ8m"2SA6a/.fb&)uoja  Mm7l7!c8ٰMmmmF6d ދmql4^^&aoaa!cpjdCa؋V8m&27C6cGFabߕ:+uDmqlhlِ1x8#!cpG#jGdt21 Qa{Ql(ِ1QQ!c^(Em6 GjGcdc cLcbN9cjǰcdCH1a+_6aȆ1RZǰcdC1h1l84h&qa8q\m8qlnuql8ِ1x8qq!cpǡjDZdùzqB8mP8m 2]16Vp[YZ'dCu  !c~qBmql:V&IqoT8m$2'a8q8I6d ^7NºqRm$qlIhIlX1{&)N9)6NaȆr ~)lِ1:+ӆWNm6N SjdgV'Ŝr)6NcɆO=jdCpnV8m&2q8q8C6^Uqn{l~l ِ1̳NWΨm6ΐ !bug6`gȆm6Ψm6Βlbu,g6bgɆÞaϪm6Β ׍nU8m%27Bg6bƦ钖11Ήsp9lِ19qNmql|3?q8G6d nqNmqlLx[yȑ&yQ7úq^mqln܇6m6 kM?D7Pl| \ِ1LAVZ` ׍??66 BG\>Pxm< 2xx@6d )6`Ȇhl!8yjhCۇjdCH!b326bɆ!ݺjdC<6m<6`c]ib<u6aȆ{G}xD6d o<#G#!cG#Gcwǘ]6;jɆ0cc!c`` ?jdCp1ٰu6cɆm<6m<6 *X<'jO'dCu O6`OȆg~g~xB6d WQ@6m<6ET7m<6 n<%CO6bOɆ½jOdCu)Tm)lD9Xx㙨`x xF6d ^7LmlxgjϰgdCkg3gs10>&sqF9<#\m9l)XKlZjϱdC6C6cɆװϡjϱd_eLx!)/: lِ1 BmloPxm 2/j/?u=L?E֍?66$2Ssʟjb !b~O??Ɇ??6p˜iNusDtkPToZ_v?^ :K/sT/}+_aw~/xRp=xI|ܱvn4^t/^tmT/cz:xv׃@pTxK!czxxE6jMofx >C{ xE6d G}+W+!cpWjWdC6^A6^aF򙿭x-l6^m6^ ׍װnVxm&21_Ùkl5ِ1l;L dkl 8pFĕm& |Fm lnul ِ1 \Qxm!2xxK6f{Vi{Zo6boɆ[X7ުm6ޒ x mUxm%2߷x mUxmM6~jYdSsjc ׍a[molo!c8D 477ِ166ޑo=:x';X7ީm6ޑ ׍wnSxm#2xxG6d nNml\yq㽨axxO6d n=^m=l|NyjﱍdCjﱍdcQb231>jdCs8|Pm| 2_~kjdCkvÜ߇"7;w<>%%%9,c-ci,ci-c,c-c,c-c,c-cY,cY-c,c-c9,c9-c,c-cy,c[ZY[0NtH3()9 :[k\7Tc-5.q1`Kb ո{pl|kJd&gn| m|m|F6d n3h3ϰȆ{PoggdCggjaIf{H*l$6m$6 IPߜTm#)lLR7tF&FRl#)ِ1xH m$UHm$# ^tH&dpNI HF6d ^7Lm#ln$u#F2l#ِ1xHm$SHm$'fyV먉܍Nk'WHm$'2,z,Frl#9ِ1xHFrFr!c8m8cb 6c)wjuuH=K=KHA6d ^7RBm#lnu#F l#ِ1F FJAJqH)l6Rm6R qlC;ُ$FJl#%ِ1֥tC[Rm#%l|NI mTHm";8oebh*؋RHm"2`H HE6d Sm6R ׍TF*T؆lLZtx&Cp@  2?[pCgjlA6d k  2há6R5쬉ZSRuJjFj!cJvCߕJHM6d ^7RúZm#5l| HHC6?㼉ƍMQHm!2ݺ4nwҨm6Ґ HmQHm!2HHK6 &FZыhZFZ!c~#-7Ҫm6Ғ {i6biɆ甴FZF:1.\]译l4ݺpQ-"]xl]F AFsTe!g}s4Ou]{׃Ltϗtz\ w?d2d 91^x&I-"HLF&LFfP_&FfVjdC62C62cɆ̰ZdVȌmd&2_d62md661֍,jY,dC=fcfQȂmd!2_fk,jY,dCu# Em# l11ruJ.Nɥ E6d n#Km#lnu#F.l#ِ1~g.h#F.l#7٘>&Fna#7[m#7l潌vNMjdC Wb8m\kYdՒȍm&2j\msls!c9s8|99ِ13Nݣ ^Zc ׍ϡ6>6s^+l6m6 ׍nUȋm%2C@h^F^!cwBy6boOmSȇm#2-|nm6 otqpژPbSCk#ln6m6򓍮/ȯO6d ^7ú_m#?l|+?ʯO6d o6m6Fߚnnᦶm ?wSp6ȆaltuŠ~底$ֆF6d ^7ܠ 7 7a0_XQ2V2eeee+XQX1XqX XIX)XiXזro,c-c,cZƾUUUUUUUհ| qPq_P1 B]5 q2C@q_P1xָ/5 < ί71 32jdCHd6 P(m 2}n m6 OP(Q(H6L7 QPԍnT(m$2_SkjdCp]Pm QlFAhFAlKQ钚_ %٘~bn|%%ِ1Ng~pWlϗϗj_b_ 6T(D6^g~u2XSkBjBdCF!oR(m"2?Q(Q(D6d o6 m6 m;si(S7 ;K)V(m&2ic@(m&2E ^Fal0ِ1x( mV(m!;)M"""jE"dCuE6`EȆ"(Q(B6d nQDm٨WxxkN1u+ahWj_a_ utpڰ=Jm+l+!cp_A_m|m|E6d >|m|݆WQsnݺuEiE"E'x{ExFQ/ji3~(E(zմ^1<*Fwxu;w|ߢܷ(vP ׃b@}D1(ZD1\׃bF1bFqX'71Gq(Q(N6d 86cɆm6m6 'P(Q(A6<(&F (%6J`%ȆJm6J %`QBmQlF hF l$~()u/ ;j%dC6JB%6Jb%ɆFIX7Jm6J ?JB%6JbƕI31J$sRjRdCkRpmZJmQl(Q (E6d o6Jm6JmI%QZԍҰnV(m&27J~Fil4ِ1"SJm6J ( mV(m!}[(#ʨm6ʐ )eRFm Ql9IFl ِ12F2dd4166Vl|N)_m|m|M6d 支66&276V(K6p~D(+l6ʪm6ʒ ?{/ U(m%2C@uFYl,ِ1FYF9fmayLr9I9F9lِ1x(F9rF9!ca.Q(G6d nQNm E01{_o66!277dC7Fml!cp@ߨm|m'J (/FyX7ʫm6ʓ ׍nW(m'2S:b8m^*Q(O6d >WyhFylyv9ij_7`ݨQۨ`FhFly&bwv*wv*mT6*'l"QڨQlUvd&ƷƷƷjbߒ )9[ooɆaltqpڰ}[ooɆװBߪm|m|G6藥 ߉uwpwwdC66#27wjaߑ Aߩm|mT$?>k^Ĩ(FEX7*mT6* )RQm"Qldk7W Ý8J}Ck"Ql|NmTTۨmT"YmݙQIبmTRۨmT"2`ݨQ ۨD6d 3tsp'?AJ}CkQlnT6*mT6*3σMʮuQlNTVۨmT&2QڨQۨL6d iA6*cɆmT6*mT6󁰉QEE>LMw^k7ٺZpײ}s4Ϟuy{fgz߻f?vWq=aAgW ל)I q=|{({q=D|m|=Qll 8[ط +CmFm!c~66jcɆA6»b8m$Fml6ِ1x?\ڨQۨC6<lQGuFeGOm6 #+_uȆ|Qۨm!2#>Flِ1:F:F]Q?vT21ꊺQ֍judCu.u6buɆ1о}]F]!c9.QWm.Ql8bYĨzcF=єʺQOmQlF=hF=lِ1AԃQOmQlnԃ6m6꓍:?U5m6 ۨmWۨm'2C@uF}l>ِ1F}FOӳeԍdö@hh@6d o7Phm4 27~Flِ1YFFCjgTD&FC@C@CFC!c֍j dC6B 6b ɆFCF#{,j\Ȇ6aȆm46m46 hm4Rhm4"2hl^(&nj?`? |gȆ`dCj?`3Wkb4I$6cɆFcX7m46 ? n 7Vhm4&2O1Xm1#=GKLƏpGɆƏn##ِ1⯁##ِ1x/#ƏFQCMWuotft M6`MȆ -&jM&dCu M6`MȆ&F&FSldb4u)M6bMɆKl KlhJ6d c+ӆqbhm4%2hhF6BGh&l46m46 )LmьlҌlضYm46 )͠fjͰdc^\hm4Whm4'2E^Fsl9ِ1"Z4Whm4'2͡jͱFV? ?A?mmD6d n'h'Ȇ16~6~"2 Im'l0Y\3h7Zm6Z hmPhm 2C@6Zm6Z hmPhm${'-ahhI6d Ni )-6Zb-Ɇm6Zm6Z o6Zm6Z 珼laba[簭6ZaȆZm6Z hmRhm"27ZA6ZaɆaV&FkQ7ZúZm5њlFkhFkl5ِ1yJkFk!cpj6d#ipm`hhC6d ;mtQhm!2m`hhC6d o6ڨm6ڒS%Z51ڊ֍jmdCu-m6bmɆF[X7ڪm6ڒ ׍F[F;1@MvF;hF;lِ1c8mShm#2`hhG6d nNm݆pL{s&9p&i.\<9gj{v>^j+C{ooişlO8=Qi:zij{A2?Iv׃@sE(ZD\:׃FFGqۉ]Lb犎jdC{Za訶H6d 抎jdCjNd#:IͬLNNcٰ}巓F'lِ1Liv4F'lِ13NZ'NF'!cG'hF'l3zܪuM΢ntuFgl3ِ1x FgFg!cpjdC6:C6:c]FY:bbtqaa.j].dCu ]6`]Ȇ.pN颶B6d ot6mtp~%ݗ^aj>G7XwXXOX/XoXX_X?X@ ϖ!_,c,cᖱQі118xw_Rsw?b 翮׸Td ~QW~QWuk\Wq2C@k׸Td gs@5u_7i@}Ln 7@mt6 \16xR'16aȆYY F6d mtSmt'US]<w⺫mt6 a]m;ѝlFwhFwl;ِ1FwFާ71zۃlNcoA6d |CmуlFhFlِ1x衶I641z~'7zm6z ׍nTm$2C@kj=dC6zB=6zbrƗڧ3uٰKmыlF/hF/lِ1x/ 6zaȆ^F/^Fo1s/-Y YM6d @o@oFo!c֍jdCu7[m7чl*7|чl$I3F5sVd}6`}Ȇװ}Flِ1"}6`}Ȇװ}>j}d#z}E}6b}Ɇm6m6 W/T_F_!cF_F?q[M~F?hF?lِ1)6aȆF?X7m6 ׍~F?~F2\&FoFF!c֍jdC0;b8m޼鯶O6d o6m6.K6 X7m 6 Su!c1֍jdC6@6`Fьi.mb @@!cpjdC࿯=@@!cjAdcMAn uc lcِ1x16aȆ X7m 6 m RmL6~YYmglg!co dC0]16l33ِ13`^(xcE^t`lc0ِ12)6cɆ`X7m 6 aC6cCF3{411֍!jC!dC6@C6`CȆaltvpڰ}slcِ1!!Pų^&Pac(1Tmc(1l jCdCuc(C6bCɆ甡P/dc61~_:__Ȇ/n ِ1/p___Ȇ//jm8y 3g<ٺaP0av?^3v0\<߳uӴa?~|xk|tz5ss;+ww2?kںzNd >Wù]-w!cpwh]mN624]=Tc11N6d >W spp!cpájñdC}phcplc8rԾ&ac1Bmc1l)X?lj#dC6F@#6F`#ȆHnhtcط -Fm6F ׍nTm$2C@]HH!c11E6rLc`1 E6d ;Rm"21 1 E6d (hc(lc4p~@1ZMGÕhh!cgjdCphN1M6d >6Fm6Ɛm71ƈ1֍1jc1dCs8Qm!211C6d nc 1Fmc 1lDWlc>X}jcdC½jcdCsX8Um%27Bc6bdc@41<xCm 2S<⡶mx !bᡶmx  hCmG6oKĜ2)6aȆqpN1G6d ~^m<6Nmc1ln6Ʃm6Ɠ~- ]u,Ɠq'/2Wm'26>C1O6d nc<1^mc<1lxhcxlcPs}L ߘ j dCs8LPۘmL 2C@s !cp j6߇9>0|262mdlbMMZƦ[fXfZ,c,clXelele,2lgo --ZY,߇,ـSN\Ou5Γjk'qk'8!b穮qyR1x5S]چE6d n R6Ȇ1 / /lËl| R6&3J51&.טH6g]WkH1Qmc"1l|M5&mL6& ۘmLTۘmL$2j oAJfbx𹠷چ7M6d O 6 o!cpІچ7M6d  mxmxcƌ[\k*S7&i^}.ORۘmL"21 ژ1 ۘD6d =I{6&aȆ$hc$lc2h> d%&dO7MVۘmL&27&~cdlc2ِ1"6&cɆdhcdlc Ȟ&W/j;K))S6`SȆX7mL6 !b})jS)dChclÇl-31|DuGm!2{>j>؆ِ1 hGm!2S|  lc*٠7l#MT\pTlc*ِ1:e*\LUۘmL%2C@όmL6 ۘ mLUۘmL#ʵx1Ջ4a;Mmc1l4hc4lcِ1x1 6aȆkO6mL6|Fދ01|]y.K6J]|.諶m U6|Ɇ/j؆/ِ1x mmbwlMb_t:1ۘN6d ^7ú1]mc:1l٘1ۘN6d NmLWۘn<5Üay{n@gḚ0O.̀5b sTѬ1C}gᄍxvn3|3: b1?׃telu&9mT;Lr cz0փj3q=I"d ^fB36fb~d#M ?1WOm#2_چG6d cj᧶m 66YdmA{'sY9,Y,!c߻r,lcِ1⯁Rۘm"2_΂6fm6 Ys?S6 !cj؆?ِ1?W6ɆmCjFqpqu&Fmm`dCF76!c8 @6l3lF@6d n#P6fE16fcɆlX7fm6f a1[mc61l|Ok61[mc6H6*:~F#Pԍ@X76@!cpFF H6d 3trpڰ=T6Ɇ{@h#Pm#ۘC6nfcs`ݘ1ۘC6d 9eQۘm!2_΁k9js9dC6@s6`sOn11抺1֍jsdCuc.s6bsɆA8~p\lc.ِ1^\hc\l#lfm&FAnmaAdCe26 !cFFD6d ^7 l#l8yvF0m ׍`X76`!c~#jF0ِ1x66yd˶419eSm6 ۘmSۘm#2_̃yjydC6A6aƲ&5vmbwɆWm6 a/:_mc>1l[m6 )j/`{LQ7B`Q6BȆF!j!Fِ1xu#Dm#!2 6B6BdTBȽ&\杝d{;; 6` ȆX7m,6  `/@mcl|NYm,PXm,$O{&BQ7ºPmc!lBhcBlc!ِ1" 6b Ɇ甅BF(XGLP s&)lLys(s)LRF(J6d n#U6BɆgmjF(ِ1 mmb׭v\.RXm,"27ڹb8mT;2>'16aȆEpNYXD6d >,6m,6Fm*61aa6°0!cFFF6d n# S6ȆFf}nbRXelele,2eXb-c,c-cqxXe,222222222222}pqIK8s }s85.׸pq2k\885.׸pq2a W׸p<-&{/qX,zŰ7ZXL6d nc1Xmc1l|Mm,6 C6cKȆgn'L%n,uclc ِ1%%!c8D ZXB6d nc Dmc l4u$41 KjKdC}R7/UXm,%2Sڹb8mp><^ZKdC6BK6bd#ZG{61"h#Bm#ۈ 25mD ߈Pۈ6"Ȇh#Bm#nyk9[R~nL-b]xٺe92ev>^98527O[2=_r Z=g-`9w9)D0r\a\-b9IrF$HLHHHl#lYp$jF$ِ1Hh#Rm#ۈ$2+"HHl#lϋ&FmDmDaQdC0u+Ʊ d?VZQFِ1lܛRۈ6ȆmDAQjQF4ٸ&F8w ]FmDcdCkh6Vۈ6ɆmDCjF4ِ1}4m 1y?fb oPXm 2?]XA6d ncBmclXmPXm$CL=qR<[ TXm$27V~cJlc%ِ1"Rmc%ln6Vm6bFy5'^71b\uü{C6l?4mĐ ۈ6b6b!c^41j1F ِ1h#Fm#ۈ%^U+XoĪmbdCp3Vm#ۈ%2C@6b6bX!c9%ڈUۈ6V7;pXfl6VaȆ*X7Vm6V ?'YwVm6V XmRXm&^skOxX-zհ]XM6d nc5Zmc5lnucjlc5ِ1YjF٨K01F$/j8cđI:;qjqFِ188l#lhFG6d oAqjqFo!C!!cq8qnpa#ƃ2Pav=؇y&0-;0Laxa?l1>]k~#t};"G]}|U#!2F|FZlA8qnޗm߼{Ӌ|7]ޖsXjG-cvR;aNYj-3vR;g[j-K킥vRd]ԮXjW-kuK-RaݴnYj-;]{_MlV揓y q޸yS1< aou=Λzgo8x{7qd ㊁zyχlL13G6|6| !cb>dv(ꣶm }>Gm!2Q6$'38*X3jGdCU8m%2Ga8q8J6d 7BG6bƕOcbs187S8m#2?;ߎm6 coS8m#2;W d1l×l,ʕzL _5Wm%2?{k_ _l×lo¾᫶m  _hWm8N6Cx&q7þq\m8qlqhql8ِ1~8oW8m'2ǡjDZd#~%01N'j'dC6N@'6N`'Ȇ 7Nm6N unᴑa16N`'ƣ2NhbI8T8m$2$Il$ِ1x8 II!c]16̃ҏZ'Sdc"qJSoR8m"2ߧSjSdC}6NaȆ)7Nm6NJjbV8m&2a8q8M6d8"qZm4ql{H\1мqZm4qljX ׆d&7qFm qlhl ِ13!c}hlÏlDx^X#'ma~dCg~Om#2?~j~؆ِ1x66d?<_41ΊqjgdC},g6bgɆpEpVm,ql|8 獳jgsdcD׃}61ιc8G6l_dS8m#2Þ{sj簍sdCƈ#bqNmql9h9lßl?\_m'2omcdC6  lßl܆?᯶m't&y^R6cɆm6Ϋm6Γ ?>^mql}h}l>ِ1}}!cJ݇6m6 Gʗ61ldcS6jdC<]>Txm<$2+ bCk!lo<6m<6'Tx#a%>Rxm<"2_S5#lِ1xx#G#!cww?6m<6Sx,sjdCkc%SB6B!cFFB6d n#Q6^3 |֯eb{ؗpRm%l|} gїj/dCƈCeL E~>716^b/Ɇ)/j/Wdcscb+8oRxm"2|+lِ1+x.Jml7 _A6^m8zmֽ"^E0>˳uZ݁K{ '~͇ew^kZ}_~yʮ5C7ވ~^77te ~x7!2#9Zސo7jodFm 541ފ{v{vުm6ޒ oVm-l|x ׊jodC{ӷ[F(Wo¾m ha{JF(J6d 7BaU6BɆgPh#Tm##G6 00l#lom ?#Lm# #2_S 00l^0Lw`ȆהpM@6d nAml|Mm|PmD abD FF$I6d n#ڈTۈ6"ɆmDBjF$ِ1x߈6"6"dûܛ&G|kGG!cpjdCG8~Tm|$2D6&cb|}6>aȆ; D6d ~'x'O'!csO'OFp̿x'#JS>%Jm# ۈ"2E,mD Fs((l#lFm|& zmrY m|Vm|&2+EBobhm|6> Ym3l| m|VmD o~ĈkJ4\S6h!cy#jF4ِ1hh#Zm#ۈ&2 mDmDm0߿&xYjZLKReyZj-8Z\K-RK`%Yj-$ZRK-RKaRYj-4ZZK-R`e29?_~?s ߿OIOu w1Á>u b8bb8О߿O{1F6{L 7c\7a{IچF6d 9禶m nmandC6ܠ 7 7lÝl;Wpw݁f#w wlÝl܆;᮶m hm p66ܱd#{1 oc#&82ʋj1dCߎۈI6d 7b¾Sm#&lFLh#FLlÃl]p=6< !cpІچA6d nP6<Ȇb<  l#٠;lļ 6baȆgXp ۈE6d >Ƃh,XF,!c ڈ $bچ'I6d >oxySm$2oxmxbdCg1Іچ'lV&Fl׼aFlaejdC6bC6bcɆFl7bm6b )j8dco;=&F2=wGm#lFh#Fl#ِ1x߈F8F!c5%Gm#݆!ȆlƠ"~0ݺ~;0//z~͇Ýs}8?ĥk^ĭczq#.U_ĥ/cg:гuq~PD\%2qjqxd#9\kyX<+ٞr?KOm#l|{DWۈm'2.=[_m#>loć}#F|l#>ِ1ڈH@6(#ol@HH@6d 7@m#l  6` ȆFh#Fl#!٨3mAcLՄjBFB!c31OHH6d 7M 6b ɆIm$THm$"i11i"7MHD6d 7Hm#l|HDjDdCh"h#F"l#1ٸ:Z&Fba#1Xm#1lwr;&VHm$&27y#Fbl#1ِ1FbFt>M01I$jI$dC}# I6`IȆ$pHHB6d >o$6m$6 e_>H*)I>%FRl#)ِ1whIwhI6bIɆהpMIHJ6d n#)Tm#)ld5# H HF6d 7Lm#lF2h#F2l#ِ1 H HN6T#XS5%Frl#9ِ1xHFrFr!c}JrOIHN6d n#9\m#9llr&F 7RBm#lo}#F l#ِ1xHF F !cp)j)dWAyg)))j)dC}#%)6Rb)Ɇm6Rm6R o6Rm6R~uaJ)Jm#l^T^TjTdCkJ*RHm"2Tjd#rx׃}EH FjFj!cjdC6RC6RcɆm6Rm6ҐJ=H#4pHHC6d n# Fm# l|MIה4ji4dCߵ6Ҩm6Ғ'obuwuwUHm%2HHK6d 7¾Vm#-l|H mUHm#v&F:kJ:tF:!c}J:OIHG6d ~fSHm#2_SA6aFY/61;w%NHO6d n#=^m#=lFzh#Fzl#=ِ1FzFq>5KL od}#Fl#ِ1)62`Ȇ pȠ@6d n#Am#l0n?Myl|kK[8FFl##ِ1FFFF!cpjdCߧd62md62ͷy$fLpͤ D6d {_2md62 mdRȄmd"2 Ȥn{?Fp|/K-RjeԲ[j9,Z.K-Rk[j,Z!K'KVR+jԊ[j?[j%,_,Z)KVa$yus'c?9psP1xsP8qq29=N":pO+M /17{Km "2mxmxa^dC{*/R6ȆmxA^j^v·2gVg24:"2En]f Afهݺ̰3dV_o><./[^kw}5ޏ#?՗1}\1l_;v#??B?E$BGhG,d#ŏ231Y,jY,dCoY[,F!cEeʢB6d WmdQȂmd%ǝn*ld6md6 ?ՁͪJ6d ~?sVx?sVFV!cȪF6vs.MĆ!ɦ F6d >cfE6lF6!c5%\Smd6  Ȧ N6=V0f#ȮN6dX"7md6 ?GvFv!cȮA6J-iצ-&FkJF!c{r{rm6r oPȁm 27r@96r`9޴)L>'<ϩiv".=[Sm#'WE ~INxINFNs1x mTȉm"?vK\oRȅm"2ߧ\j\dCkJ.Rȅm"2\jdc{O01r jdC0V-Fnl#7ِ1)6rcɆFnh#Fnl#٨.qwy,΢y6`yȆF7m6 )yGm#l|ȣK6;Lb 獼jydC6By6byɆהpMɫK6d ~j^h#F^l#ٸz#Ľ^|j|dC6A6aȆm6m6 )|jdcKLo}#F~l#?ِ1F~F~!cy#?7m6 F~F:_Mo}Flِ1FF!cy7 m6 ilP(m$?:!QPFAl ِ1FAFA!cpjdCkJAhFAlx<5GH&F!7 QHmQl\<-Q(D6d kJ!BF!!c5QHmTyو#3Od㐻S6m6p&F1}J1>F1lِ1Q 6aȆהbpM)Q (F6d nQLmQl[vtI7yFql8ِ1x(FqFq!c58\Sm6 (mW(mL6*vq>&j?c? ?w=wdCkpMYmglg!cp?C?mm ?[*QB(mP(m 2%`(Q(A6d 7JQBmQl|QBm݆_}_e1]$E]pL/_̇fq= (~Q__W|x\q\$/k %^I1c3fI/AI2%a?(vP@3fI(ZDIJMKB%6JbF6$ 01Ji)7-Q (E6d ~^ RjRdCsD)8GR(m"2Q (Q (M67IQZQZm4QlققjdCsDi8GV(m&24QZm4Qlܙ3a\K&Fa QFm Qlܢ <(Q(C6d 7QFm Ql|Q(QnޗmEn8ZQR+oU*Zj,ʖگZKVRnհjZj,ږZKVRo5Zj,ƖZKRknZZj,֎RzJ{B.?NeE+ {\Yu+{\Yq2YZb8{˪{\YR1x+ {\Yu+{\Yq2qea+q1ʑ"]q('K,@%S(m#2_F9lِ1rF9rF9!c3rF9rFy+^71ʋvy.Q(O6d n|Wobhm6ʓ (mW(m'2S6ʫm6*ʗ~hbTkJTPۨmT 2oW j dCg1YL F!c5QAmQlk&FETkJEFE!cs𜮢FEl"ِ1;@*wTTۨmT$2_S*B6*bƀĨ$֔JpMQ ۨD6d >oTF%JF%!cJ,F%lِ1R ڨQ ۨL6~;&Fea2QYm2QloT}Fel2ِ1FeFe!cpj_FWTx W1o _6~6~%27~Ưjb ϢYW__Ɇה__6~6crwLlbTq` hHYB*F!cQ*jU*dCh8VQۨmT!2E@U6`Uq.obT}*U6bUɆa/jqׅڨmT%2_S5FUl*ِ1w?UjUjdFI<419X@oQ ۨF6d 7QMmQl|MהjjհjdC}QMmQl$51Y:EmT6 S}JuFu!cpաjձdC6C6c5iQu5ȆVj˾QCmQlj5dC6j@56j`5ȆgF FMF՞5WMxUSm&QloԄ}FMl&ِ1WMxUSm&Ql|[ڨQۨE6Z~Ĩ%ɭ@Rۨm"2ւ{ZjZdCZpRKmQlF-hF-l6ֻاԆjdChm8Vۨm&2_Sj5Fml6ِ1QڨQۨC6]q+u`ߨQۨC6d nQGmQl|[am6 ۨmQۨm%mkuaߨQۨK6d >oԅF]F]!c5.\Sm6 ϢujuzdwzתQO;;F=lِ1xߨF=zF=!c5\Sm6 zF=zF}Qh@^La&F}qQoWۨm'2aߨQۨO6d n>Q_m>Ql|mWۨo|ȫy|\IE40>}54;0}j~o`l]xy5crTC#«P}~АAC蠡ACϘ P-! I'im4Thm4"çX+F#lِ1FF#FF#!c1m46 FjdyHhhL6d ~7Vhm4&2hhL6d n1Xm1фl~JO&Fa Dm фlFhFl ِ1NM6`MȆm46m46 _LFShFSl)ِ13MܦjMdC})M6bMɆm46m46fYmb4ߡ5sКm46 [46aȆm46m46 [46m46V.b4p\m9ќlD OCk9ќl|MiהjͱdC}9\m9тl{!wXSZ5F lِ1--6Z`-Ȇ]j-dC{F FKqs<.g~>j}>dC}}6`}Ȇm6m6 )}>j}dchB 21j}dC0}K ۑ|_F_!cm6 Ϣ}j}~dl.61 OG6l.Sm#2?;m6 Omяlo6m6Xg/;jdCWm'2_S5Fl?ِ1FqLbMהjdC{p;@mc1l}m 6 )jdcZ E@@!cbGpɆn@lc ِ1x@@!csс@ QF'c`1D6d >o A !coQm 6 aA6aɆeM`hc`lc0ِ12)6cɆ`7m 6 )j!d#Ԡ&님C!!!cpC!jC!dC6@C6`CȆg!!PպՋCPP!cpCjCdC{ءp;Tmc(1lPhcPlch|qck5Lmc1l\t<1 F6d >o 0a0!cpàajðd#.)>eplc8ِ1pp!cs\tplc8ِ111A6y-ib}c#6F`#ȆהpM1A6d >o!c=hc07|~xF[jc,8Km6RhM&[jS,4Km6RiͲf[js,7s1!cy Ǩm6Ɛ @c6`cƑawhbugrǪm6ƒ oUm%211K6d nc,1Vmc,1l'p3qj㰍qdC}c6aȆqp1G6d nc1Nmc݆!dmy˳ua1.|/֍wgƫ;0uagW|x\_~n<|<ǟatݪ1GLs՟2 ;2&~0|Ɯg jp?@"d &@6&`ɆGxê1vjdCkDVLTۘmL$21ژ1ۘH6d 7mLTۘmL"s=[/abL}c6&aȆk;Ɂk;Imc1l|ƜWIjIdC6&A6&aFERĘٺdKg&mL6& ɰoLVۘmL&21ژ1ۘL6d L6&mL6 :r1E|7Ł1ۘB6d 7Zb8m~}lc ِ1))!cpS)jSd^٘1A[c83m6 oWۘm'2aߘ1ۘO6d ,|hc|lc٨unljMo,}clcِ1xX!cj dCkhclc!٠[u41yc!7m,6 S}BB!c77m,6 ) j EdZҷfb,}c6aȆהEpMYXD6d ncHmclE"EbױwgckXmc1lbhcblc1ِ16cɆהbѦ)K%%!cyc 7m,6 Xm,QXm,!2K%jKd#KSu31 KjKdC6BK6bKɆm,6m,6 RƟdN~71ƟpSmOlO!c5O''ِ1>OOSmOlO!cYOhO?edc󔛝c41 ˠej˰edCƈŶKȆmLmcl2hc2lcِ1xXm,SXf|8/L|&/]phK/᱿~$WW/7}g/5~͝}{_7|ޗsVZj,ՖKmR[om6Zj,͖KoKmRnvZj,ݖKmRoZj,ÖڑojzWW+۴~9<_b񺶜aֵ~fz-rg2ζ\ٖum9u6ka[q1V;|X!fpYXA6d >  !cp+j+dC6V@+6V`+ơz51Vj+dC0]16l?Rmc%l|^ j+dCg,+j+Udcw)LUeWm6V 3*U*!c UjUdC6VA6VaF=QŚ)6VcɆ[ [XM6d nc5Zmc5l>jskOqߟZXC6d >o5!cpk5jk5dC}c Fmc lq0V􍵰oUXm%2˵{k6bkɆ獵pXXK6d >6֪m6֑~#fbs{שm6֑ ༱Nmcl:hc:lcِ1u:uzh%&z7þ^mc=lo}czlc=ِ1)6cɆm6֫m66togeblmpg6ml66 Ϣ,Amcl j dCm66ml66Aw }čjdC66B66bɆml66ml66 ϢjMdcn5ǚĚ )66aȆMpؤ D6d lk&M&!c ؤ L6:UtT,ll66ml66 M]1;+7ml66 ͰolV،ml&2j-d#ws&[--!c-|clc ِ1x-!cp[-j/M21p[molo!cyo8o77ِ1x66&2_S6VJ6v5}dcتJ6d >olVV!cjC{حV610Yc ئ F6d ncMmclk<ڦ F6d ncMmclMbMהj۱dC6C6cɆml6ml6 ׶خA6bt~!lb}c;6v`;ȆEwsj;dC8oP؁m 2ءI6;eb}c';6vb;Ɇm6vm6v N[p;6vb;ɆgѝN.1❠xsL]⾯]t.].!c5e\Svm6v )Kmcl.hc.lc7٨96AsMbM הjdC@ݭM6d O )6vcɆm6vm6$EGmQ؃m!2?Ͼm6 {༱Gmcl]{=j{d㮹{^^!c@ӱWmc/l|M הj{dC}c/Wmc݆!̳uA/'"0c|y#Q;|xl\;?><ٺ5G}`]VO.'>>՗1̌v;>}#2`?ا}$B{}>}~9*_RcدO6d 6cɆm6m6 jdYYfbq@mqlܢ+ӆm6 ϘJr@mql,q@mqlllӠ^&Aa qPm qlL <:q8H6d 7=6bɆ@6m6IxYab6A6aȆa֔VN&!lِ1C!C!!cyqHmql=_U&ayql0=q8L6d 7þqXm0qlahal0ِ1q8q8B6"z11YEm6 i#jG#dC8Q8m!2_S@G6m8s/qKvRԎ[j',)KvRZj,5K`].Zj,˖KvRnZj7,-KvR0dOoZ۵CoqCQou=Λz?oy{7qd aV8o㼩|O {B!#K js}6| !cp>ІچC6d nQ6|Ȇ?hGm8J6*Nx=[wTm(ql|6: gjGdCsQ87U8m%2GjGcd#N% dbs187S8m#21lِ1c1c1!c=1h1l×l}yX-&7|᫶m }_ _l×l|Mkچ/K6d 7| _ _l8٘}GŽg޳jDZdCkqW8m'2a8q8N6d qhqlp$OfbpKd  !cqj'dCP8m 2'j'd#Gyw'żq'6Nb'Ɇ獓p8q8I6d 7N¾qRm$qlo6Nm6Nۻkb{Sp{Jmql|M9הSjSdC)8oR8m"2EOA6Na Vwii!cqjdCkiV8m&2j3dc&gĚr)g6`gȆK16`gȆm6Ψm6ΐ 33؆L ?O? ?lÏl|MkچG6d 5Om#2S6ΒCi8+ލ|ցލ|Vm,qlo}Yl,ِ1YY!c}YhYlؑ*&97qNmqlo}9lِ1>ܧS8m#2>qNmO6;j8db Іچ?O6d ~O?'_m'2mmcdC}W6ΓU㼰q8q8O6d O9)6cɆ>>q8O6d O9mW8m"C{b)jFِ1l#lFm h#@m#nl]el(Z_?߭/\;0/uqA}/دÿnx/.5BE.«Q}/~pE.\"91qq$BjKdzů71.%7q ۸D6d 6.aȆ%lِ1K%KepIa߸q۸L6d s_ W v돤.716.cɆm\6.m\6. i]6.m\6K'pĸ"l\6m\6 ~W6`WȆה+pMq۸B6d n qEm ql,|ĸ*WUl*ِ1UU!cqjWdC{ӫU5QM&51o\5k5!cpנkjװkdC}6aȆ5h5l:p\:q])r]m:qlL:<Ӻq۸N6d 7þq]m:qlo\6m\6ƃ1m716ncɆהmӄL;o܁}lِ1r)w6`wȆ7m6 ;;]Arhbu %]a]l.ِ1wjwdC6Bw6bwɆ]h] aa㞥lݷXj-GcK퉥R{f=^Xj!KK핥R{cB-0K흥nEXj-ZRdEYj-h WÀ7 /Hp 'c(FA{\8 =. q2qA{'D{d3i2'n\y&P㺧\m6 ۸mS۸m#2qڸq۸G6d >݃6m6ƙctcb FF0L6d ~N 6`!cpFF0L6d n#V6zKdbwhM6~Irq۸O6d 7þq_m>qlٺٺjdC6C6cQ@<}x@6d m<6 @ml32&@ml x!0]TxxH6d lClCC!c5!\Sm<6 C#qsrTLjHml|xGjGdCk#tcc!c\1 ܧ˳u5p?xN|[SszZ^te V<<991Z"~D<6m<6^S|{ib6^@/6^`/ȆxxxA6d ~? x?  !cBmB6wإk#D!pQ6BȆ!pom 6B6B!cp!FFl|JZҷ&K7^¾Rm%lKhKl%ِ1KK!c5%Rm%lYQiOJWoRxm"2+lِ1Rxm"2?zmRxm&lx-|@]Vxm&2axxM6d >kk!c55Zm5lTnb6@o6`oȆm6ިm6ސ 7oQxm!2xxK6坹VoVm-l|aߪm6ޒ x mUxm%2[h[l#l\sH#T6B6BP!cCwjF(ِ1Ph#Tm#%2ECPPl#l̯m)#L66°0!c5% )ajaFِ10h#Lm# #2mmaFwnL21 wjﰍwdC6A6aȆm6ީm6ޑ #x'=/@m a6\m#'2?jF8ِ1mmcd2 1Q}D EPۈ6"ȆFjFِ16a#6"!c@6"6"dcmY]}<[l6cɆ)>{l=ِ1xx{{!cy=^m=lt=wNj87>m|6> )Amlhlِ1ۈ$oebDf6o#lK籮PFF$I6d ~p$G8Rm#ۈ$2E#,mD ۈ6"6"d#4V&GqGGl#ِ1)6>bɆm|6>m|6> D6y`b|gɁ~'lِ1Lh'O'!cpOjOdC'h'l#l ڸ&F7mD QpވRۈ6ȆmDAQjQFِ1)QFFl8Xj|={6>cɆ L6d n3Ym3lo|6>m|6Ɇ&F8jF4ِ1 hhl#l|#oDmDcdC6hh0a?L f[j1-5K-iŶXj?Xjq-xZ|K-RKd%ԒXjI-dZrK-RKeXji-tZzK-Ra8^Ǚs^1S-׿>'O?1<o&>u bx.k />>u bx.oB=߿Ondcjgn^E7/tچF6d ~O'Mm p#2ܼl䦶m nІچN6=&waw wlÝlQwa#ꮶm {3\w wlÝl܆;᮶n|+&p+Ky6Bj1"̇{|fj1̇n]Lb~L7}x ׳u151q?kغ) =VxC}=p?/cbyr`{x~Ad WB{%>}p6#HHJ6d n#)Tm#)l|#)HHJ6d ~ HHF6vʐjLHm$SHm$#27y#F2l#ِ1dF2dF2!cdF2dFr1Z}MbMgjɱdC6C6cɆהpMIHN6d n#9\m#9lI+0BoPHm 2_SR5%F l#ِ1xHF F !cp)j) oaaC9M on?z[m&2 mxmxcdC} o olÛl܆7᭶m$[:H)֔pMIHI6d /THm$2H 7Rm6R Ϣ)j)TdcoLTb#H HE6d oRHm"2_SR5%F*l#ِ15l*h#F*l#5٨{$b&Fj7RþZm#5l|M gjdCVHm&2HHC62jQ+Ɵ[[Fm# l|MIה4ji4dC}# i6`iȆm6Ҩm6Ғ UV)iᚒVm#-l|M gѴjidC6Bi6biɆal61jitdcɧ31҉5%\Sҩm6ґ toSHm#2t+6aȆSA6a>d1O{71| hGm!2E},ꣶm _ lÇl^᣶m 01|ޗ/U6|ɆgQ_8mbdCpWm%2Іچ/l|SޠB&FzNRzNRzFz!cy#=7ҫm6ғ oWHm'2額j鱍 dvL bMה j dC}#62`Ȇ pȠ@6d ޗ3Am#lt8"&FF5FwkF˗3md62 ἑQm##l|MהjdC*mdThx9&y'y-}e"ZD&s$_I{D&Lvns<8:g?웃{rLs ?:牶Jc)GS>~ٗ1ѷp?#2;!11"Z9ysx1"p?#2-j?hOmL6),̰3dVȌmd&2_+2õ"Ffl#3ِ1Θ62cɆmd62md6Y?`jbdצYi,F!c_c8lض䳨md6 wfY6`YȆM@Y6m8}mǷ8ZoXj,@K-R Բ[j9,Zj,ܖZK-nEXj,HK-VR+h [jQZKmb,}J=2.s*ֿp˪qYqJ=NYጜUz׿p˪qYqJ=NYa˪qYO6R }dN)_pW6Ɇ鯶m pW6Ɇ3Æ'WnZF8P2&Fom`dC}#l#lom 66ldc=EʚDF6lF6!coe˦ F6d |Q6|Q6lF6!cp٠ljٰ@drŴ˛F m @76@!cpFF H6d n#T6FAFm 7}7Hm#"27m 66`q,lCjF0ِ1`x/8Xm#&27m 䌑cd `l#;XM#EY4Fvl#;ِ1F +dWȎmd'2ߗɮN6d 7þ]m#;lov,}5#9`ȡA6d >oFF!c5%\Srm6r <3ȡI6"S:>*`b6rB96rb9ɆהpMɩI6d kJNFN!c8/r@6rm6B-6ibgC!j!Fِ1h#Dm#!2mm`!dCkJ\SB6BPAV6BPPl#lYP{F(J6d >oy#Tm#%2_SBaU6r~{-cbkJ.Rȅm"2`ȥ E6d >oF.\F.!cȅmR^)_6 00l#l| hFF6d j|f5Lm# #2 00l#7L67ͭM6d ;6rcɆהpMɭM6d n#7[m#7l-!lb6@y6`yȆF7m6 mQȃm!2F-Gm#l[\MF^h#F^l#/ِ1F^F^!cpyjydC mUȋmڳF876±p!cg[᳭jF8ِ15l8 W6Ɇ66±ڥoDmD _Dl#l:%^DmD`dCFm#9#ȧG6d >想h>|F>!c|j|dCO6m6"mabDGmD ÅmE \F$I6d >oDy#Rm#ۈ$2 mDmDm8^oޭ++? ͯ.<ݺp̯v{_agȯ>gܓ}<P g<3 8gLL:e ~ ٗ1Zo 2# 9ZD jd}W|obsDA8GT(m$21 FAl ِ1ZQ6 bɆ? B6 bƺVWmcb}6 aȆa)37$^ BF!!c\I m6 i6 m6 aY޴51 QjdCW 6 cɆFa7 m6 Ϙj(Qz~01776(!cw;IQjQFِ1x߈}#Jm# ۈ"266"d#>ڛE6I)B6l'Flِ1x(F"F!cQ"jE"dC6@E6`EkLbM) הjEdCIբjEdC}(E6bEɆm6m6Ɛ7hbD$>IF4M6d ~ S6h!cpFF4M6d >oDCjF1Qqg&F1aQLmQlo}F1lِ1bF1bF1!cbF1bF [xo]L5%Fm#ۈ!2mĨm`1dC2wc6b!ch#Fm#n} 0/8kGVR+aJYj-2ZYKVR`U*Yj-*ZUKVRaմjYj-:Z]KVRk`5Yj-&R;]@n)VpUXbqR15U,UXb|.Xu_٘m=L8a#ڈSۈ6Ȇ887ǩmaqdC36Ⰽ8!c/ڈSۈ6F|^(.ޑ) W(m'2a(Q(N6d >7ssqFq!cQ(Q(A6ɵ{%\%6J`%ȆF 7Jm6J (mP(m 2%j%d%}(I6v:NiFIl$ِ1x( FIFI!cp%j%dC%j%RdcioGMVJmQlF)hF)lِ1RF)RF)!c}RF)RFiMbM) הjdC~J{?6JcɆC* C*Q(M6d _(Q(C6" 3(#l6ʨm6ʐ eQFm Qlo}Fl ِ1R(Q(K6N:n/&FYq [^ÖU(m%2Q(Q(K6d n,QVm,Ql|- mU(m#[%M:('l6ʩm6ʑ QNmQl|M)הrj對rdC6A6aϟbb6C6cɆm6ʫm6ʓ oW(m'2_SC6cF S CM FhFlِ1;2;26*`ȆmT6*mT6* ۨmTPۨmT$nUa+mT6* QQm"Ql|MהjdC)jJdwC[701*J:F%lِ1\D WCkQlF%hF%lِ1JF%Jv*wfn]eTVlauavP܍uQY}+Ͼ9';w*s^Y}+~PyN6gݫgݫ~ٗ1L?uϒ\sƋuP*@sD(ZDwV6mT6 .ƚUZQU6bUɆ?돪jUdC6BU6bUɆg̪FUF5q|ǛFo6o5#cݐ/USۨmT#20cT#SV'_cJx16aȆjpQ ۨF6d nQMmQlu͇Lڴ:(mT6 oTWۨmT'2aߨQۨN6d \FuhFulhAq5ļQ56j`5ȆMkF lِ1F F !cQڨQۨI6r>M35aߨQۨI6d 7j¾QSm&QlFMhFMl&ِ1FMF-tf\g9)ȆRۨm"2`ߨQ ۨE6d nQKmQlF-hF-l6XSԮMڢoԆ}Fml6ِ1ss6jcɆ QۨM6d UڨQۨC6:'qQG\ցװu6`uȆה:pMQۨC6d 7QGmQloԁ6m6 K\;guEߨ F]F]!c5.\Sm6 _օװu6buɆBu6b4cb6A6aȆF=7m6 zoSۨm#2zjdccĨ/֔pMQۨO6d n>Q_m>QlF}hF}l>ِ1F}hF}ltMo4}Flِ1) 6` ȆA6b:c8laӱbhm46 Ϣ j d~tPPm!ѐlFChFCl!ِ1jyO?2/^ FC!cgB 6bF3/215\Sm46 hm4Rhm4"2]Ox16aȆFF#FFcq qKLFchFcl1ِ1o,4Xm1јlfވqp9yƋhL6d 46m46IS(h"&phhB6d 7Dm фlo4}Fl ِ1xhm4Qhb>0}x4ԾԚ[j-,Z+K[K;K{KRkk~~[j,,Z'KRjuԺ[j=,Z/KR}/rT5U5'cgݛgݛ{\SR1WԦCהz׿5UxkF6+Mfb6jgfjͰfdC{1^L3fF3!c3ƪFCkьlF3hF3lq{YW߈ A| ِ1 QlFqg Q)l|hodcq#טŚ)6cɆpnnhN6d n9\m9ќloTvp0J/FslhaL5<ւlFohA6d 4tp; /F lِ1̼Qaxhm 2]ac?dϒLbhm6Z۲`b}%-6Zb-Ɇ獖phhI6d c3љw>=9^ FK!c8 g Thm"4l41Zg[g[m6Z ? >Jmъld#k3g **ŋ hE6d ~_Jm݆%oͻuunZķvI;[-ߪ|kw`o4s[-OxמogܓkO<8:ߪ|Gub}hBݕe?N};:21:tix1;r c}51"ws5^ p?D:c$we=وm&bv66'2#={ﱍɆa?:co)^ ﱍɆal;c8l>U=њlD,Ptid}Fkl5ِ1̵icg khM6d c3=_xPihm&2aoF;vF;!cvjvdC Gڑ #p6a?t~vxOOdC0)_c8l>dCA߃Aml!c&M!bhmmH6.-ذG7~}GɆ߭[ƏƏdC6~6~TldFSg 5+^ dcf㜿{21ڋ{jdCh{8Whm'2_S5F{l=ِ1̼Qaö%^m=сl|Cfbt}6:`Ȇp蠶@6d nAmсljxFl'}Eu? ~Aِ1\S~R l|M )?mmD6d c3FcƋёlj}>dCp?1&F=>o/Flِ1 &Gm3gM==6~6~&2y3FwkFCkglg!c5g33ِ16~@߇~ZKm6RRd ԆXjZjC-apKm6ReXjc-qxKm6RdMԦXjS-itKm6Rxɫyyu}agl}<wµ3sp7v[v.=_rk/OO^PP!c11F6dN׺kc7yc0lcِ150x ;Lmc1l|MהajðadC6A6aF%/xcb {_pp!cpájñdC6C6cɆהpq_ߚ#!cp#j#dCkPm 211I6盻{c6k1I6d 1oTm$211I6d nc$1Rmc$1l4{"cEGYt(lcِ1,: ΢6FaȆm6Fm6F o6Fm6FI_Fdb6FC6FcɆהpM1M6d >ohh!cYt41Zmc41l<,&bNaX1C6d k1!cQ/x16`cȆhclc,Xgcca1K6d kXX!c𽯱pkXlc,ِ1X8a%O1Ɖ{=qj㰍qdC6A6aȆqp1G6d 8hc8lc)vn$Mٟb?_I9T:džvЛ*LITٗ1SỶS~0|b*ܷ1$B3ThcTlcd&4ac1Mmc1l|/|6aȆ׊ip1 ۘF6d 4hc4lc:٨$϶)Ltx}tlc:ِ1ac6cɆ?Õdtlc:ِ1thctlcH71f$3}j3dC3  !c}pb lcِ19ژ1ۘI6Wq1S􍙰oTۘm$21ژ1ۘI6d >ōLL!cyc&1Smc&1lK%Uc Dfm6f ??> >?>Kmc1l|MהYjYdC6fA6fm8ҋ6[-c͵Yj-BKmR[b-ԖYj-JKmR[cYj- FKmRbmԶYj-NKmWi6=!s-f7d ~Og63[f7z{lf{lfS1<7sFo119z{lcِ17s6`sȆḿ6m6 ۘmQۘm%/9>lbs\87Uۘm%2¹y\lc.ِ1\\!ch.1Wmc.1lYLybnyjydCkِ12)6cɆp=jdC{jd#:יLb]gj dC !cp/flcِ1XXh_K14P|;h!vBBsWXB8o,TXm,4E 7¾Pmc!)1B"q`Tx0cNYSm,6 Xm,RXm,"2_m,6 Ejd~!-X77@[76cɆהpMYXL6d >.bb!cXXB6*YSDK༱Dmc lo,}clc ِ1)K6`KȆ7@K6`KF;KżK6bKɆR7m,6 o,UXm,%2_SBK6bƹڎLev] XF6d s [aT)FNŋ XF6d 7Lmcl|MYm,SXm,'S6r\mc9l|c9XXN6d nc9\mc9lrhcrlc٠BM hc lcِ1+6V`+Ȇm6Vm6V +j+d#cX)Q[ Q[XI6d nc%Rmc%lJhcJlc%ِ1XXE6-zP6JUoRXm"2 X XE6d / RXm"2Ujdc >&jac5Zmc5l^jxmjlc5ِ1jj!cpj5d~I 71ֈ5:elc ِ1,΢k6`kȆה5pMYXC6d >6֨mpO*߭[ ZvI;֭{kϋ9߭[ wתZ7dnZxתZ9wٜs:߹wSu/cwmwmש`91x?X:u#2_+A6aS(`b6C6cɆgp\XO6d ߹wWXm'2_+C6cF߲z216s\56ml66 ̘16lߠ@6d ncAmclhclc#(݅Mol}cFlc#ِ1}pبH6d nc#Qmc#lFhcFlcp_~"&&76Imclw{6٤ D6d >ol&M&!cycImclѨon&fqm^nV،ml&276ycflc3ِ1x ff!cf1柡gY1cآB6d lk-!c=-pOklc ِ1xmlQ؂ml%,_9*֔pM٪J6d nc+Umc+l|M הjC6BFS31@@ml6 )Mmcl|Mהmj۰mdC6A6a@~JŚ)6cɆlIml6 mlW؎ml'27C6c;Ɯs 21v8la!cj;dC6v@;6v`;Ȇaw@;6v`;F!])mbN8oT؉m$2ةI6d >NN!cvB;6vbFH.kb" qE6v$r6vaȆה]pM٥ E6d oR؅m"2 إn} }amKmRoZj,,ÖKwKKvR;nNZj,ӖKvR;o].Zj,˖KvRn>nq.s-pnޭqqM=N=n7q=n7q|6 gd ~M{`bq0!fwt,T#Gmcl|/f܋٣C6d ncGmcl|mQ؃m%]zMo}c^lc/ِ1x ^^!c}pn^lc/ِ15^hc^lc(bpcاG6d ~M^SS؇m#2اG6d 6m6/k{Z]/jdC6C6cɆm6m6 6m6}-6Y8 7m6 q@mqlhlِ1x8mP8m$] ZvI;~;0w{w]}}spOvGw9?g{FbAg_03ÁmK?p?EϘ@mm%w_e9cX+µQl(ِ1EU8m%2>Q&QQ!cQ1d~Lco}1lِ1LhaL1c1!ckc1lِ1q 8q 8N6r7&q7þq\m8qlqxql8ِ1qq!c58q\m8ql{\& uiP8m 2YS;c8l|ߐx16N`'Ȇ⦅Om6N )'j'd-8)l6Nm6N oT8m$2q8q8I6d n$qRm$qllma&)k)S)!c 16l=q 8E6d ~r ^R8m"2Æ8q 8M6&i7NþqZm4qliqZm4ql:4N9q8M6d _9hb\}"6.bɆm\6.m\6. ^6.bɆ7.B6.b}Zodb\ߣ_R۸m\"2_S.5%lِ1u%xrImql%h%l2٘lŅ&]Lehel2ِ1ee!cqjdCj+dE+w31k+l ِ1~W~W6`WȆ+p޸q۸B6d ~ {ڸq۸J6rڰqU􍫰o\U۸m\%2Wa߸q۸J6d 7¾qUm*qlUhUlxxqMko\S۸m\#2|5lِ1k5k5!cyqMmql1O{uuxr]m:qlo\}ul:ِ1r)6cɆm\6m\}s-KvRkݳ[j,#KR{j=Ԟ[j/,+KRR{k[j,'K/KoK}:N2s!ֿpq7pA=N=q7=q7|ýq7pA=Nt7`q7wl>w]d_㦰qڸq۸I6d OwT۸m$2_nMl&ِ1wڸq۸E6~&-1݂-[-!cq [jCs-87R۸m"2ߋmR۸m&{x&6|&ml6ِ1x߸ mm!cpjdC۷j6/y15݁;0w"E'[w:vpf;V;~=[w;s~twwW􃻰Uܥ/c.\+.91=]%2#Bw6bF*Ʒbb3=8cS۸m#2߷m6 Ϙ`q۸G6d V܃6m6S %jbwۛgH C6cɆq~}l>ِ1}}!cpjdcڤ31lِ1;2;26`Ȇgp|x@6d hl!٨ߢ*#LξauH6:tMϺ?Txm<$2!|Cl!ِ1xxCC!cxxD6P}=x$#7m<6 Hmlo<}#lِ1G#GcqmG}ü l~cl1ِ16cɆc7m<6 _<6m<6Ekb<ϐ<;O6`OȆak'jO'dC6@O6`OȆhl)hvq&SoKK!c5%Rm%lο3t`x xE6d nJmlo}+lِ1 x xM6NvZZm5l~kk!cjdCkkhkl ٠21ވ7jo7dC} o6`oȆ7ިm6ސ 77ƟdcL???66$2'ƟƟdC}O7TlƟƟjboF6SNkb6Bo6boɆהpMyxK6d n-Vm-l|} mUxm#iߍob6A6aȆm6ީm6ޑ xmSxm#27A6aɆ㇥n/01 jﱍdC6C6cɆm6ޫm6ޓ )jﱍdL\db|6>@6>`Ȇ>jdC6>@6>`Ȇm|6>m|6>f,11> jdCG8~Tm|$2>m|6> )jOd#΀GO'O'!cpOjOdCװ5'O'!cYImx4l }ِ17R l__ja 6py'y-󝤿"0O|}'o#V;܍;IÉo~=ݝ$ s7!M b ׊te ngngϸ|&21?C">~D| m|Vm|!/m"֊/3|Qm|!2F |Fl ِ1//!c//vᆲ}~E~-}Z"K-Rs\-57KR<-5/K-RKnԼ-Z*K-RKk|,5_K-Rhe,̖Z_;ysJ׿h翧s W 0p#g G,?=u O >'@?=u xO %@=:\]ɧ盻H(l$6m$6 _+% @J 6b ɆX=j dC_Bh#FBl#ȜRMDF"h#F"l#ِ1г6aȆgDh6JHD6d ݗDF"DFbQw#q=qz=Fbl#1ِ1}oXm#1lFbh#Fbl#1ِ1Kbh#Fbl# g#IJm$6 ?$=Dm# lFh#Fl# ِ1Hp!'~g"m`.dC.hOEmp!2mm`.dC6\  lÕlKM W7\apUp6\Ɇal4rp07Srċm _W WlÕl|Mq6\6\ 7Qߺ41Dp}Mm p#2nomandC} 7 7lÍl܆ᦶm ?n]̢puWp6Ɇڗ;ٰ/w wlÝl܆;᮶m _Cj؆ٸ1={L x5Cm 2j؆ِ1 hCm 2ІچI6TMl\S'ٰm,xmxbdC'7<6< O!cgH<3$j؆'ِ1'᩶mx/K /76 /!c^辠چE6d 7`R6ȆS / /l#)[;&FRccܤd#$Ƹ!FRFR!cY4)Em$6 o$UHm$%2_SBI6b4𛉑,,Lm#l|_4M HF6d n#Lm#lo$6m$6 i?찉9o>9ٰ-6cɆהpMIHN6d o$WHm$'2ɡjɱdV)F Bm#l:%NIHA6d ,)oPHm 2flPHmxb.࿯~_[m&27᭶mx ϢpV6Ɇoh[mHI6Nw񘉑R)ἑRm#%lo}#FJl#%ِ1)6Rb)Ɇm6Rm6RW6 uH%aSkTjTdC}#6RaȆF*7Rm6R o6Rm6R#rH-l6Rm6R H mVHm&2HHM6d gHHC68vNiĚ)i6`iȆה4pMIHC6d kJ4F!c5% Fm# l~wY#HHK6d 7¾Vm#-lFZh#FZl#-ِ15lZh#FZ K^FA"E'W:#ҩ;0w[g?웃{tSt9Vkֲ =o-|g:2>~Cd >G@>j>>ІچK6K_풉+lBj؆/ِ1 _hWm%2j؆/ِ1Z mmbFlbsDzjWHm'2 Oӫm6ғ oWHm'2額j鱍 dAkM od}#Fl#ِ1xF F!cp j dC jdcy&ǏKEFFFF!cpjdC62B62bɆmd62md62džv$F&72md62 {gRȄmd"2 Ȥ D6d ~-Im#G6"n~pOm#2~oma~dC~pOm#27 ? ?l#3~oe#aȬL6d n#3Ym#3l:%3NɬL6d ~ȬB6vNwE,odQȂmd!2ȢB6d dkJ,F!cy# Em#݆0a_q|#;ZR Ԃ,`K-RiXjZ.K-RmZjZR[j,Z!KeԊZjіZ1K-}M(1}UYUze{Y=.+qY|6 gd e=.e?(E01Żu: lßl|mcdC೑?6 !cpІچ?@6<>v##@l#l."bF@6d c3ƯiJ}wHx16!cgHl#8OLlod}#F6l#ِ116v:16aȆהlpMɦ F6d ~ Ȧ $c~.(lBjF ِ1@@l#l*^SmbdCkJ m &Fz<D6rX|G&Hm#"2 Ȇm$R6ȆmAAjAFِ1 h#Hm#&v7{1p/&Xm#&27m 66`!cpFF0l\xx\SLN6Y+ӘodȮN6d ־ [ʮN6d ;6cɆC6c9ƼlLb#ȡA6d >oFF!c8l$Hp"ph]ȁm 29j9d۳[51r:a7@r ǶB*!FNFN!cy3k+~96rb9Ɇ7rj9dC6rB96rb!dzgbFFB6d 7B`Q6BȆ8om`!dCװ!FFJ6rl™  jF(ِ1,acdkL/F(J6d 7BaU6BɆmBjF.Q i?ľh./Km#lq.x8F.l#ِ1W.Km#lF.h#F.l#lt>s^Úy#l>Jm S= ~S=Lm# #2_Sm 66°dhc~61rp#Fnl#7ِ1x FnFn!cjdC6rC6rm8^C6$xcOn]8Qcaݺ#\M|o}#F>l#ِ1)37$^ |F>!c}|pȧG6d N>h#F>l#l08Ĉ}#HHl#l#^DmDbdC}#HHl#lHh#Rm#O6N8abh~8Wȏm'216[35:gZdCF~8oWȏm'2_SC6cȆcebkJP(m 2OR')Q(@6d 7 Q@mQl|-mP(m$#;wȘ((FA7 m6 [[Pm QlFAhFAl ِ1FAF!q/fMBb(BjBdCF!BF!!c5\S m6 (mR(m&K'MFahFal0ِ1,Z΢6 cɆm6 m6 j(ü]RQFmD QpވRۈ6Ȇה(DmDaQdCEAQjQFQ+oȒ&F1h"F!cpE"jE"dCEF"F!cQ(Q(J6޹6\1QTwRwRTm(QlFQhFQl(ِ1FQFQ!c𽯢FQF4ضyt&FXSmD pވVۈ6ɆהhDmDcdC}#ڈVۈ6[o4(漆56 K6aȆF17m6 Ϣ,ZLmQlL dF1l#l #F 1j1F ِ1h#Fm#ۈ!2ݞ=1j1F ِ15l c>~kGVR+aJYj-2ZYKVR`U*Yj-*ZUKVRaմjYj-:Z]KVRk`5Yj-&R/g4NgnRsݳWy%Vbq'c {\K=N_,\b=.Xq2/ {\/ls]L8/Nm#ۈ#2mđ _Sk88l#l|/&ڈSۈ6]ŝsFu7m6 (mW(m'2a(Q(N6d ~MU(Q(A6j^0mVا+Jm6J )%RBmQlz.Q(A6d nQBmQl8j.(ܧ3֕$=|8FIl$ِ1x( FIFI!cp%j%dC6JB%6Jb=hb}6JaȆm6Jm6J QJmQl|QJmQlyfQZ|4HiFi!cpjdC6JC6JcɆbJC6JceF˥MkVnb)euJ2F!cy 7ʨm6ʐ ӕte6`eȆFhF K^e0?ݺPDYvI;x߯[WQV݁9w‰엵}spOv[Ws^rtΟ&ۙwJWNQN}~Pξߑ)S;(A9r cQN-HgrF9rFyfדEs免FyFy!c̕ߙ+Q(O6d nV6ɆmxCj؆7ِ1xu[m&2 mxmxc>d#鲸 [>چC6d o~Gm!2mm`>dCཨ᣶m^u _ _l×lچ/K6d >9Wm%2Іچ>u"χo ZƺXƂ,c]-c,cXXOX/XoXeeeeele,2626262626262nnai9ƏjdG9~k8F~7S8?\wTkq~Td mq~gqͷu :(_-.\<׋:'vow`.7:﾿bw=Ws=d7C/@ԃxw?׃2y`vA91x= @-"׃!c~8P6\;bJjF ِ1]@@l#l|EF H6d n#T6Eg֞"J]ZFl ِ1x]6`]ȆFX7mt6 mtQm7j q71Ĝ l#ly߿16l6 !cFFD6d n#R6"Ribt6B]6b]ɆG+j]dCttUmt%2_t6mt6:݄nF7nF7!c^avb7nF7!cnpF7lِ1xmtSmMӃzFF0L6d o 6`!c9%)jF0ِ1x66dc@݅FwFw!c~;7mt6 ׍ntWmt'2O;]m;B6}~&FSBm ׍X7B6B!cFFB6d >@!j!Fa3Lb衶A6d nCmуlFhFlِ1o6zm6zC-)l6zm6z o=6zb=Ɇ甞pN驶I6d ,'Sm'ыlIOcb1ԫ^j^dCu6zaȆF/X7zm6z ^jdqn&FooFoFo!cpjdC6zC6zcɆm6zm6BFھ' 61BŜ PPl#lY[(|m 6B6BP!c9%U6 n5"#ְ}Flِ1x}6`}Ȇ<<C6d ^7@}6`}+放pN髶K6d n/Wm/їlnuF_l/ِ1F_F?A[}+~﫟F?lِ1~F?~F?!cp~j~dC~jd㟞aPa诶O6d oFF!cpjdCFhFlcٸl4}M@5@mc1lhclcِ11@mc1l|Nm Pm0N S6Ȇ08maadCu# ֍00l#lFm $fca1H6d nc 1Pmc 1l@hc@lc ِ121D6J}1Ha5 A !cApk lcِ1;;6aȆm 6m 67; dx/!1Xmc01ln uc`lc0ِ1x ``!c9e01Xmc01l phb o Qm !2?felcِ1x/:C6`CȆhc 1C7IgA~4&5T-b]x?7ICo U;jw`.r~4:T}ᄍx*vS;/P=0u1&&ap=Fw_}0G S;0r cb+E `1;;àajðpҢ#Lpa#W6Ɇ臫mcdC6¡ppl#l|66±dxqF~p9\mc81ln ucplc8ِ1pp!cs81\mc81l N:!z1A6d 0Ckc1l1A6d ^7F@#6F`#FIzg41F9e$SFm6F ׍nTm$2_돑j#dCHhcH ǹ/Nzg8∰1262ickME[&Zb,c,c-cS,cS-c84t L,l\<|B"˹/TPn"Do{u5.ja?/g G9h9Eָ\"|_EA5N5.ָu(qQ&(ac1Jmc1l|QjQdC6FA6FaȆQ(Qh1Ǚhh!c}p~hlc4ِ1j4\SVm&211ۈ$Y<Ĉ}s$#6"H!cwH";$jF$ِ1;HHl#lHh#Rm#C6 %5Dcc`1C6d >s1!c51C6d ^hclc,xkS'1&X3ŌUm%2ca1K6d >sXX!c^t,1Vmc,E66tod#Jԍ(X76(!c~# QjQFِ1(h#Jm# ۈ"27((lc+RSMqqj㰍qdCs88Sm#211G6d c#!1O6*B1^)2^mc<1lnucxlc<ِ1v<\ÎWm'2mWmL F0Ęm24l>;6@n:MPۘmL 2`ݘ1ۘ@6d@8_pRiXܫbhmL6& ) jhqgѢ߈FF4M6d ^7a݈Vۈ6Ɇ)pmD FF41l|ޙ&D Da6&bɆKK1ۘH6d oLDD!c1ژ1ۈ!tl#F1Qۈ6bȆ8Ĩm`1dC6bl#lF mL" K4Ęa^D6s#_1 ۘD6d nc1Imc1l$hc$lcِ12 ژ1 ۘL6`<c7&~cdlc2ِ1dd!c~c27&mL6& ۘ mLVۘmL!֌nl1Ź5)dp|lc ِ1m ٰMmS6`SȆX7mL6 ۘmLQۘmL%:o9BcSaݘ1ۘJ6d ދNTT!cpcTlc*ِ1TF,٠&FnĪmbdC0uavIF,K6d ^7ba݈Uۈ6bɆF,mđͯĈu#֍88l#l߈FFG6d ^7`݈Sۈ6Ȇ)qFF݆#iۺ?ۺiĠij"œ'u^Ոijœ~k wbiOSiL{\+ bb:ܷq=Nw_ާgz0|1?EL`:1\1ژ1ۘA6J^8*c+fb lcِ1mdö:Cmc1lj3dCs hc lc&x=DëMn̄ucLlc&ِ1s9LL!c1֍j3dCuc&1Smc&1l8Ę|jl̂_Rۘm"2S<1w6faȆ{Yǜ1 ۘE6d ^7fA6faƐg˥Xobsl8Vۘm&2aݘ1ۘM6d nc61[mc61llQk^E6s6̾aqiclcِ1~9Gmc1l|b\Qۘm!2ӚmQۘm5kVM}}jsf*b1֍jsf*bpsjsf*b9e.1Wmc.1ly7MybNyjydC{Zو|ٌ&|ac>1_mc>1l|hc|lc>ِ1x16cɆṁ6m6ܫm71 j dC=!c֍j dCshclc!Db E 6b ɆE}хj dC6B 6b Ɇ7B 6bzUeb,"E"!c9eSm,6 Xm,RXm,"2Ej6\w;F̎Ŗs3^XI6d NY )+6Vb+Ɇm6Vm6V X mTXm"::jbUpJmclnuc*lcِ1:e\RXm"2 X XM6%ul&Fԋdc"Ǭ"^_XM6d jjj!c֍jdCjhcjlc وUw&Q7Fmc lnuclc ِ1xX5!cXXK6vw4>&Zga~n-وp*c(Y7֪m6֒ kaVmc-lZhcZlc-ِ1sZ:2BbLubS֩m6֑ XmSXm#2XXG6d ^7A6m8>Zo_3?n=zvI=֭{'z}[껿~Su=_q=@쮉3ِ166#2wwdC66SM6\*㾉[aw5nn!cpjdCkp [mc7lnhcnlc?Ҿ&ы=!c~c7m6 {`Gmcl| أK6ZVPW mU؋m%2{aثK6d ^7ºWmc/ln6m6 ;&>ы>}>!c֍}j}dC6A6aȆm6m6 sҪ_ԍnW؏m'2دO6d >s~~!c~171͟!cm6 ׍nP8m 27@6`Ɇ^bb딃prPm ql8jdC6B6bɆAhA0Dsra#,c,c-c?ZNXNZNYN[XZY[.X.Z.Y.[ƮXƮZƮYƮ[nXnZnYn[X~l9ոǾ0Nw5q558F`otH]wjCR׸Cx;L6/ZqX8 mV8m&2þal0ِ1w6cɆm6m6'Vk{Wl߫m|m|O6d ^7u{ﱍɆm|m|=ql3M#hlِ1x8#!cߛ9olِ1##QQ~PyߙGsQQ!cpGjGdC068c8ll|*bhm6 8 mU8jm]߭D 87YJZvI=[œxo~OPw\<x {)C+}?1c#2OqL-HXA6aƈ=Rebw0/'̏m6 ^%uDx16cɆm6m6 8mW8mH6/ή`b(֦?µj?b? ?>GɆalvpXwcZxu)lQmGlH:k6'Yb'Yb'6N`'Ȇa8c8lx^8m 2_kj'dC6N@'6N`'Ʃ%L8 j'dCu$'6Nb'ɆN=j'dCA6Nm6N)n bb6NA6NaȆT@[wJmqlnu)lِ1x8mR8m&nIUOb6NC6NcɆiX7Nm6N a/zZm4qlihil ȶBg{g{g6`gȆm6Ψm6ΐ ׍3nQ8m!2_6Ψm6Β BG%11ΊuYN9q8K6d qoU8m%2ga8q8K6d ^7Bg6beLfbs98S8m#2`8q8G6d ^7qNmql9h9l\s%K%!cpKjKdC6.A6.aFشI:31. jdC0sy:c6.cɆm\6.m\6. j+dZ&Job\s8\Q۸m\!2S9l ِ1+Y+!c~ qEm ql8ĸ*l\6m\6 zzUm*qlyUgq= E3?w m݆ܗ};E 8|{Gǖ'g疱_,cZ^X^Z^Y^[~n{o2e/GߖOϖ/s_R[i/͟]܅=]uk]q2ٷvp8ǿw5.qw|.ܷqwqK5N5.qw5.s_bb6A6aȆ{q۸G6d VJ6aȆ{={}QT Żag|_m>qlƆ3FCk>ql}h}l>ِ1Sjdݧ˃61֍jdCu6`ȆpNyx@6d n@ml|)񓘢&Ca!Pm!l[[jdCkpMPm!l|Nym<6m<6IE_=Px&3X7m<6 ׍gn6^m6^tJxmRxm"2`x xE6d S78c8lD}8XTx16^aȆ+h+l5XZa/Zm5l{{jdC0u3NjxM6d o6^m6~#wQM Mm7l7!cmmF6d c3Ʀcwo/oodCu7h7߰7dp:&1s7!cpo7jo7dC0sJg }gY/CZo7dC6@o6`oFL[h[l-ِ1[[!cpojodC6Bo6bS/Oobs;8Sxm#2xxG6d nNml~lSxmN6S[CwQ7~uw߱Ɇװ5jc lmQbhmmN6d ]mwl=و,x7x/l6ޫm6ޓ 6cɆazQ?g%xm'2j6ya;Dyۺ?LZvI^PguS@kaw`.;㌢֥]\{}sT_/O8I<ʹ563}ğz'}׃?a=SO\$2ՃhStZz'1x=SmOl/wM66"2rpذ:__dC 8c8lmy=5 lL d/dcd[!c1?m|6> ?_~Pm| 21?@6>`ɆJgj61>#1?m|6> ~Qm#l𼨏jdC06;c8lLӣZF.5~v5166Vl|oodC [molo!cY16:^WGD6v=&';'a[ |Rm|"2E}1XZOdC}}Rm|"2 L6V?YaYm3l|S>m|6> )Ym3l|N j/d{'ڛ_~)~_l ِ1̜%Bx16`_Ȇ/pNB6d ^7Em݆|·;F3;DĖ$d䖱TԖ4t L̖,o,cY-c,c-c9,c9-c,c-cy,cZ| JgG \PϿs:K_4c%b( 1`K?1A8c?:7'dp71wwm$6 Hm$THm$$2HHH6d n#!Pm#!l~~ȅ͉\PߜHm#l|. ڧKHD6dyzѥҰWIHm$"2ߧKm$RHm$&C+ݩ؅[}[Xm#1ln$u#Fbl#1ِ1xߜ͉6cɆm$6m$6Ooeb$qgn&qAgn&QHm$!2ߧK钨m$6 )IDm# l|NIm$QHm$%ȵHjlDvRa4FRFR!c֍jIdC6BI6bIɆI]z;FRl#8ޢʄz~&F2NI)6aȆm$6m$6 ب1ŋ HF6d aÜ3^ dFr1SMM{jɱdC6C6cɆJJHN6d S7*:c| Hm 41R)j)dC[n] F !c9%SRm6R 37Rm6R :*H)攔pNIHI6d ދhJFJ!cuJJNIHI6d NI mTHm"2wJԍTnRHm"2SR9%F*l#ِ1TF*TF*!c1)Ց16Ra6 61R5ljMHM6d ^7RúZm#5lH jdC06 8c8lYud F7۬!&FQ7Fm# lFh#Fl# ِ1:% \QHm!2a# WU#chm6ҒEGabFZoUHm%2HHK6d >sJZFZ!cpijitdvzDHF:tF:!cp頍tj鰍tdCsJ:8SHm#2HHO6O H/l6ҫm6ғ HmWHm'2aHHO6d ދhzv2wG^~[$"2E'zCn]L v.Ƞw\<xG{Fml#+H\&FVg0d%ʪJ6d m]Vm]VFV!c֍jYdC068c8l؎B̪F6pobdu#6aȆlȦ F6d n#Mm#l lj6lFvwjdӃMۂ.ۂjٱdCgd{6cɆmd6md6 kȮA6:wjbh؋Pȁm 27r~#Fl#ِ1FF!cp9j9d#W;21r:놙s DSm#'l𽌜j9dChN؋Tȉm$2ȩE6~8S%F.X7rm6r mRȅm"2 >C˥ E6d ~m.h#F.l#7XW=a1&FnQ7rú[m#7lFnh#Fnl#7ِ1)6rcɆ#7[m#7ltk8T#FX7m6 ˘~˘Gm#lnu#Fl#ِ1La{>L>2V2b+h+d+l+b+j+f+n+a+i+e+m+c+k+g+o`hdlbjfnaiemaQ)q`˧qpG5N?T>uˇk\>q295.8F`˧ql Nxy/l6m6 _m#?l|jdC_~h#F~l٨I5\y\y6 `ȆaT!](/Flِ1x(FF!c}F؆ HxpmvQp6\Ȇ .j.؆ ِ1 hEmp!2.Іچ Ql+((+肾+Q(H6d |SPm Ql|N)甂jdCFAhFAl٘p񧻩BF!BF!!cpBjBdC6 A6 aȆm6 m6 VcҺnnbsJa8V(m&2ߧ+ m6 t6 cɆ|#JPBmQlƆ3Æj%dC6J@%6J`%Ȇ%j%dB#%^xI^Rm$Ql|Q?Jm6J ( mT(m$21KB%6JbZ,61J9SJm6J vH})RF)!cpRjRdCuQJmQlf11*8_FTbQw{*mT6* S*uJ F!c j dCFhFl"HQk^ELf1u"?6*bɆ+mT6* ׍nTTۨmT$27*B6*b'`bTrٰ-*mT6* Q QImQlnTuF%lِ1xݨmTRۨmT&SYFXTjdCFeoTVۨmT&2QڨQۨL6d ^7*C6*cUȆcnfE^Fl ِ1*F*F!cpU*jU*dCu QEm QlH1]&FUa*QUm*Ql|_*QۨJ6d n*QUm*Ql߂;db U6bƝ9519SmT6 ׍jnTSۨmT#2Q ڨQ ۨF6d mTSۨmT'K'01 աjձdChuFu!c=pϼFul:ِ1xQڨQۨA6rw϶Ĩ!lԀ6jm6j ۨmPۨm 2_րkj5dC6j@56j`5FSĨ07&ٰM56jb5ɆmԄ6jm6j ۨ mTۨm$2SjB56jb:|DݨF-ZF-!c~7jm6j ۨmRۨm"2Zjdck31juJmNQۨM6d U}Vۨm&2QڨQۨM6d ^7jC6jcu@&FaQGmQl|N:ju:dC06j;c8lRƋQۨC6d ^7@u6m·azFƖ&f斱V֖1WXX[X;˘eeeee2auyYƼ-c>1_Sj\u:395.qu5.qu| 翺W׸Td >Յ_]uk\]q2quaquWl|n/Lz{z.{zjzdC_=8Sۨm#2QڨQۨG6d nQOm݆#d#a>ȫ[WVj"œm]}蠾A}s_/oû__}ᄍx*vy}=AVu:Y@ԃ4P4/c+491x=hE4PhA!c߃hm4Phm4$-<^h(X=j dCsECX#m46 ?i4Thm4$2_G76m46 NjCD6aȆm46m46 ׍Fn4Rhm4"2#A6aƥ}9ab4u16cɆpNihL6d n1Xm1јlFchFcl ٘Dhm4Qhm4!2M`hhB6d n Dm фl&F&FSᕯoMm {ѦjMdC6BM6bMɆm46m46 hhF6] M~h&F3X7m46 hm4Shm4#2|F3lِ1g͠fjͰda3kϙͅFsFs!cm46 hm4Whm4'2SC6c-Jgj`bsJ 8Phm 2-`hhA6d nBmтlF hF l%?)&FKQ7ZºRm%ђlIEd0FKl%ِ1x-6Zb-Ɇm6Zm6Zrsgqh%l6Zm6Z ׍VnRhm"2jZm6Z hmRhm&7wFkFk!c$1PhhM6d ^7ZúZm5њlFkhFklÕl{ܻ[L Wo~Ump%2/誶m  ypUp6\Ɇ\ W Wl ٠_abu m6`mȆaE}16hm!2m`hhC6d n Fm іl{t-hhK6d ^7ºVm-іlF[hF[l-ِ1hhG6eRmhhG6d ~X;xX;vF;!cpvjvdCuNmF6NO&mmandC7NqSp6Ȇgv3mandC6ܠ 7 7l=٘7Wڻ&F{q>L{t>L{F{!c9avQ{F{!c8l$HpѥҰWIhm'2SC6c(p 렶@6d ^7:Amсl|蠶@6d nAmёldq&FG1tsJGFG!c)>9i<{x16:bɆ;=jdC6:B6:bƭOA<41:NpF'lِ1xF'NF'!cpNjNdCF'hF'lÝl,Y&x'讶m  wX76ܱ w!cu;\mcdC6ܡ w wlÃl_!lx@j؆ِ1P6<Ȇ oxmx`dCsᡶmx b )j؆'ِ1SO OlÓl|Nsچ'I6d '᩶i8&.}7Ij"œ|!7I{Ý:'z} מּw\<냩GwOb0s9܋ǔw /2+\v91x=""p="2# / /lÛl S/M o6kSo olÛl| j؆7ِ1x o olÛl܆7᭶mv}mb>j>؆ِ1w'>pQ6|Ȇm@>j>؆ِ1 hGm%g-W6|6| _!cpІچ/K6d >9Wm%2_Bjvs_6I/lY~.=2` uYƺZƺYƂ-c-c!^ޖPXX_X?XXelelelelelele,262626Q;|rIo͟?[!~k8S8?\秮q~Q1kϟl ?w_}{ lßl|چ?O6d _m'2  l#l4+%&Fsԍ6U oeP6Ȇpm }l#ln@jF H{nºm 66@!cpFF H6d 7mmb]ƅX >]k* ٸ|!Fl ِ1.F.F!cp].j].dCsJhFl#ll4#H} l#lɂomaAdCF76 !cP66d7?]NWFW!c֍j]dCu+]6b]Ɇ甮FWF7MK11~7mt6 w6aȆmt6mt6 ׍nF7nF0p(Ņ)Fnd#`ܱ`F0L6d n#V6ɆumcdCu#V6 KdbtFwotWmt'2讶N6d ^7ú]m;ѝlnt6mt6BFȾӲ'11Bh#Dm#!2 {_!j!Fِ1h#Dm#!2!FFуlq*ERx.>졶A6d ދhF!cp=j=dCkFFO6|+詶I6d >sJOFO!cp=j=dC6zB=6zb?=ORĜ )6zaȆ7z^j^dC6zA6zaȆ{A6zaư2-W21z֍jdCu76zcɆa{m6z  mVm 5Kcb FF(J6d n#U6BɆχ ÄmbdCsJ(m!Ioئ51֍>j}>dCooQm!23m6 a@}6`}ƏΜ+l6m6 # m%2S9F_l/ِ1x mUm#1͟''l6m6 o6aȆ{~G6d ~nv?hF?l?hCؚųY[F!cp88ʯďO6d n?_m?џl|?_m݆#d#Z P`a.#n98BBx:`w`.v~[7>1w\<x} | ߁f5# ?w? ׃02^s66hZaaS D|mmmaƂ+fb g6bɆ½jdC6B6bɆ{́@ R& c A !c==m 6 `1Hmc1l hc lc0(hn\&`ac01Xmc01ln uc`lc0ِ1`o1Xmc01l|N m Vm ! K>19~ٰMC6`CȆa-a;R`lcِ1x!!cpC!jCdcuGcb uc(C6bCɆ‡½jCdC{C^PP!cpCjCad_oFadc"G%'ajðadC6A6aȆ0X7m 6 m Sm5pN W6Ɇ;~gF8N6d N ppl#l|O+W6/~9T.1N6d ދpp!c9e8Sm 6 ׍pq`Q2w #D1#6F`#ȆX7Fm6F )#2Bmc1ln6Fm6FȶD61F:cc$ٰ=1I6d }$|>Rmc$1lۂp|Hlc$ِ1HhcH 0w>D?3;"\{(hXelele,2626262mhMMMMZ,c,c-c3,c3-c,c-cs,cs-c,c-c ,c -c\{>Lո&.X9E/k\8F7P׸\"o}sEA5N_qQd#C31F QjQdCQp=Jmc1l|w1 E6d 76Fm6Fs]< )abVm&2a1M6d 7}hh!cpjH1-{J}H>AF$I6d ^7"a݈Tۈ6"ɆH8DmDbdC6"HHlc p?Y&ac 1Fmc 1lnuclc ِ1x1!c5hclc,_CYc11K6d 3ŌUm%2ca1K6d ^7Bc6bQdN*gbD^4 QjQFِ1x݈u#Jm# ۈ"2QnDmDaQdCu# ڈRۈ6Ƒ?H71NmSm#2ߧƩm6Ƒ Su8q8!c11O6c_שdbsx8Wm'2S9exlc<ِ1xx!c11ۘ@61Aԍ nLPۘmL 2S&9elcِ1x16&`ȆmLPۘmD5jbD jF4ِ1 hhl#l߈FF4M6d >DCjDA;pMbN甉jdCuc"6&bɆmL6&mL6& O6&mL6bՕ01bD݈u#Fm#ۈ!2.~[mĐ 1Qۈ6bȆF ckH!Ij"œ{:@'L;0Oԅ΋0I}'ᄍx*vo&{>I}'z0y}I3ecMI&$w2f/v,dɸL&2a=1׃$BdqWň]uM))jS)dC}GLQۘmL!2#j1Emc 1lhclc*و!^cxl*|lTlc*ِ1 g Wx16bSɆmL6mL6 SjSXњ71bE݈u#Vm#ۈ%2 {XXl#l|"[ĪmbdCu#ڈUۈ6FC'4216VǑ VǩmaqdCu#֍88l#lnmđ ׍8h#Nm#ۘF6U|UQc`ݘ1 ۘF6d > OSۘmL#2E^t4lcِ1i4it1qUOLwA3]mc:1l|NjӱdCst8LWۘmL'2SC6c3Ȇ471f$3  !cp3j3dCs 8Pۘm 2吉lPۘm$.3otA1Smc&1lLhcLlc&ِ1LL!c1ژ1ۘE6|tD1 6faȆm̂6fm6f ۘmRۘm"2N2 ژ(}kť8ݵ{R(!$-$ARg ]{sofZg}6VbȆN;LUbMYהUjUdC*8RXm"27Vyc*lcِ1xXmRXm&{&X-j7Vm6V 碫6VcɆm6Vm6V SVC6VcdBFKL WapUp6\ɆmBj؆+ِ1a]6\ W!c mmbkƻ~ڛkĚ)k6`kȆm6֨m6֐ k༱Fmc lo6֨m6֒ e&Zq_Zx_ZZ!cpkjkdCkZUXm%2kjkudczMu:hc:lcِ1u:u:!c5e\S֩m6֑ XmSXm' bnX/pXXO6d shgg j뱍dC6C6cɆm6֫m66}AmlP؀ml 2n{ j dCklP؀ml 2|Amc070 =,͖KRjm-5KmiԼ,.KmmXjKmRoZj,ÖKvRԎUsuH=.iqaۨqqH=NAlAlTm'c=FڨqqH=N{mTxD6)&&acImcl|nMjMdC66A66aȆ7A66aF ;v416 jdCllV،ml&27ùyflc3ِ1x mlV،ml!\=E췷-!cp[-j[-dC}c [6`[ȆT[-j[ 71n Eq#Mm p#2mmandC6ܠ 7 7lÍlwܠ 7 7lc+ؼ~&VqoU؊ml%2FRm%mVlc+ِ1VV!cتn6p#=:bWmj"̇'l6#l;0߳uߦW|x*Ϗv~8|tKX~! C]껫;te s` hUZϘptWpD|mmcdYȉ;41<?<6< !cYx6롶mx [xmx`dCkᡶml'{&n=.v7ml6 ?#>#]mc;l~;<߮N6d 7mlW؎mx {=} O OlÓlLiymxbdCT6<Ɇ'᩶m կ'cءA6d >o!cyc7vm6v mP؁mx|6{S/7R6Ȇ-Km "27᥶mx 66dCOcةI6dlI6lcNN!cw ܩI6d ~NhcNlc٘:&.acKmcl|]j]dC.8R؅m"2EwA6vaFmmb6vC6vcɆהpM٭M6d >onn!c5e7[mc7M62t[̢pV6ɆmxCj؆7ِ1 o olÛl|M66 rPL 7|`Q6|Ȇm@>j>؆ِ1 hGm!2?6|6| _ȊE'o¾᫶m  U6|Ɇ _8ombdC6| _ _lc>,DcأC6d >=!cp{=j{=dC6@{6`{ɆdcثK6d nc/Wmc/l| gѽj{dC6B{6bƝ律ļ6aȆm6m6 ༱Omcl>hc>lc?^caدO6d nc?_mc?l~hc~lc?ِ1~hc~l& diH6`Ȇm6m6 8mP8m 2q8q8H6UL Al ِ1 T8m$27yAl ِ1AhAlx~519FO8D6fXl!lِ1R8m"2`8q8D6d 7A6a&i8,p8q8L6d n0qXm0ql|{am6 8 mV8m!S?V18\SL8B6g_gxOlِ1=G=G6`GȆ7m6 S@G6`GF=ǷsMb{am6 8 mU8m%27yQl(ِ1x8 mU8m#]&1. p9q 8F6d c 6aȆm6m6 ϢǠcjǰ ?!&~oma~dC?OS6Ȇma~dCk᧶gx8y&<}/~ZqI=t:8vp|x?$q?nSW_kxy_-IK-R;e[j-K-R XjZiEYjg-syK킥m].Yj1eK튥kYjW-xKZşzWQ.+,2-_7u?u1óYu??3agWw6Sg1<{'l(.%&Fym 66!cpFF@6d n#P6Fܥ#.31[ < T6Ɇ[F H6d n#T6Ɇ@h#Pm#8A66}r㄰q8q8A6d 7NqBmqll<=q8A6d >mP8m$9.㤰q8q8I6d c3FOm6N oT8m$2'j' QIZM 1Y4Hm#"2?c { l#lFm 66SdK^p51NYEOm6N v)lِ1)xvJmql|=mR8m C\Ǯ51Ś ה``l#loþm pV6ɆF0m&Ƚ8-l6Nm6N |acYǗ:žq8M6d n4qZm4ql|= mV8m C\~L1oy#Dm#!2!om`!dCF7B6B!cmm`ds{o21BE}#Tm#%2ombdCC6BP!c.CPPl#lfwaFm 076°0!cpaFFF6d Aaja1;}qF)grFm qlcg;Ψm6ΐ gqFm qlo6Ψm6Z6#\p76±p!cFF8N6d >oy#\m#'2ÆCjFHWw3w#BoDl#lfᰱ;v*FA6d D5%Bm#ۈ 2_S"l#lzv#R؈6"6"H!c FF$I6d 7"a߈Tۈ6"ɆmDBjFX(J;L(a# ڈRۈ6ȆUUmD ۈ66(!cpQFFqlt[e/㬘7yYl,ِ1gg6bgɆgѳp=q8K6d >6Ϊm6Α z.㜰q8q8G6d 7qNmql9h9lِ1s9syqk뚓Myhyl<ِ1q6cɆgp=q8O6d 6Ϋm6. O32 gd.m\6. uuAmqlo\}lِ1hl#l M~=&FE,mD h76h!c FF4M6d 7hhl"({hL  w\T۸m\$2qڸq۸H6d O)6.bɆm\6.m\6. zļq 6.aȆ)>%lِ1K%K%!csK%KvbF!gbH6Ii<[gW?F}cW|x*W 1ke擣twY˰\V_˸\/c2\+.\291yΘ".~pD| m\V۸m\!uf ^uĸa W6`WȆ׊+pq۸B6d n qEm ql|qڸqۈ%I+d1#V?b#Vm#ۈ%2oĪmbdCsD,\Ib6bX!c9"ڈUۈ6FȝZnL8繅y'PxjPW1Nm#ۈ#2mĩmaqdC6⠍88l#l3ڈSۈ6+4ĸ*U7m\6 ۸ m\U۸m\%2qڸq۸J6d 7BW6bdmuӊ]bл6ⱍx!cpFF<O6d >oy#^m#ۈ'2E㡍xxl1i ا\kjװkdC58^S۸m\#2?;m\6 k5kv0w8qqRiݲn[jw,=KR{h=[jO,3KR{i^[jZjo,;KRhe}>[j_ 0ש]mXtIuu{uq2_uwd ]uu{uq2_w]XߣXX`㆘o lِ1w76n`7Ȇpnq۸A6d nqCmqlH31n&nm6n 7|Sm&qlo܄}Ml&ِ1M-Q4p{P`߸q ۸E6d nqKmql|n[jCs-h-l6x4r_֏a&ma6q[m6qlmhml6ِ1r)6ncɆoC6ncw·g71gBQ۸m!2qڸq۸C6d nqGmql|MmQ۸m%#/ezY'ĸ+l܅6m6 Ϣw,zWm.ql]h]l.ِ1]h]l٨{^wL{bMה{j{dCHʈ#66aȆm܃6m6 {jd~✉q_S}}}!c5>\Sm6 S}}}!cpjdV&a@mloajdC6@6`Ȇm<6m<6Y=#MChCl!ِ16bɆCl!ِ1C#Ѹ_9F^21YEm<6 |#G#!cGjGdC6A6aɆҲ]61jdCc8ol ِ1 Dm l,?o8XS5Sl)ِ1SS!cjOdCkShSl&3LBgjϰgdC38>Sxm<#2EY3lِ1g3gs5159\Sm<6 oG=+lِ16^aȆ{mRxm&m|WZװoVxm&2#^9kl5ِ15Vxm&2?x mVxmI6^։}S<[g!lݟjb Ojb ?aSmOlO!c'Ɵէ oDx7!cpo7jo7dC6@o6`oȆo7jodc=&[g0zK6xϳ|[l-ِ1,΢o6boɆgѷp}xK6d ?&Vm-lc8x-ީm6ޑ Ϣ,Nml|xwjﰍwdCw;w{8|}6LxO6Jnq 6cɆgp}xO6d k{{!cy=^m=l>8?sヘ7>ylِ16>`Ȇ7>m|6> m|Pm|$Qc!jdCkG|Tm|$2QaZdC{؏G_d7xeb%C ~__dCk_pMKm/l/!cmmE6d n/h/Od#KTMObgOjOdC6>A6>aȆ__ D6d >~6>m|6>#.{cb|6>C6>cɆ=ɆmL6d >~gg!cpj/dcwV~gb|6@_6`_Ȇ/pB6d n Em l|Mm|Qby?|# \Z"K-RKj%Ԓ[j),Z*K-RKk[j,Z&K-RjeԲ[j9,Z.K-Rk}csa'u'`{) q \PSu :K%pAc%b=u O Nz:\ _Mhb$6B 6b Ɇ׿.hKHH6d >7'tAssBFB!c(!Pm#!lo$F$F!c5% Dm# lTqID&FR7¾Tm#)l. :KHJ6d >o$FRFR!c5%)Tm#)lO&F21&h2dF2!c}Jwg Qgd>W16aȆm$6m$6 dF2dFrH&Fra#9\m#9lo$}#Frl#9ِ1FrFr!c{ԒC6c) Ir2#HHA6d s?Ag 4rQZ)dCF 8oPHm 2)j)daщ\S),΢)6Rb)ɆFJ7Rm6R H mTHm$2HnW*0yٺT[RHea><ɿl]*[کROGMpKMW|x*n]*xSy*R5s.zjC/ $ $ 5]}԰V;HAjr c9"5#RE 51HHC6VKbVZ#؛{4ji4dC0gZݝ1%?Fl# ِ1V-Ҩm6Ґ i4jid2G71 ijidC}#-i6biɆm6Ҫm6Ғ [6Ҫm6ґ># = =F:l#ِ1Yx:xNm#l|Lgtj鰍tdCkJ:h#F:l#=ٸ#i&FzH6cɆuOuOHO6d n#=^m#=lFH@6$<4S#s5 }Q#䭏k yИAm#lFh#Fl#ِ1 F F!c2@62`Ơ=Gjbdt0%#ٰ]jdCFF8odTȈmd$2= =FFl##ِ1ȨD6JySv#sM1}#ٰ}AIm#lF&h#F&l#ِ1xF&LF&!c Ȥ L6gsD,3ӭjdC62C62cɆmd62md62 a3C62cYc621=l͢B6d n# Em# lFh#Fl# ِ16 Em# l3Y>%+ܧdUȊmd%2ȪJ6d >odFVFV!cpYjYldF wĚ )6aȆmd6md6 lodSȆmd#2_SA6awhRgbdkJvdWȎmd7ߦ|amd6D n#;]m#;|&bY4;]m#;l-,7T#ȡA6d IIF!crrm6r as@96r`9TA#XSr5%FNl#'ِ1yNxfSm#'l| 獜j9dC}#'Sm#'lx(#EsY4F.l#ِ1\F.\F.!c5%\Srm6r s,Km#ldz, {#XSr5%Fnl#7ِ1FnFn!cpjdChnh#Fnl#ٸ}GQp')>%F>l#ِ1xF>|F>!cp|j|dCh>h#F>a_oa[QR+h\,–ZKVR+nJZj,ҖZKVR+o}gU*Zj,ʖZKVRn}oհjZj,O=^^KNE{\~uˏ{\~q2qa˯qqO=NW'cƎxFlِ1~x_@mQl|n.jdCQhFl yzLo}FAl ِ1x(FAFA!c(~FAl ِ1j6y2 v< ZٺB$X"x[!BvÓ?+vP|x?ミ3R_Bo><~׼.tbCE7w .j.\^E-!c3hEm(L6X~B%ӆ# ig[-jdC* TXm0Qlܾ0G6 m6iO[("F7m6 oE6`EȆm6m6 (mQ(m%?>F5lِ1F5hF5l:Xuuov11QjձdC}:6cɆהpMQۨN6d T6mTp<y&y8^-{IOF;0?癤oSO|&{xͿW_q?A<}t7j1k~ j՗1Yx x^C5ȁPD  2_+j@56j`5ƝĨ\+@5Ɇy[> TSm&QlF7g ۣQ56jb5Ɇ׊pQۨI6d >cք6jm6jn-kgmbԂRۨm"2#j9F-lِ1xߨF-ZF-!cZF-Zvx" xGm9Xju-zZ}KRkd5ԚXjM-fZsKRkeXjm-vZ{KKRduԺXj]-nZwKޗukש68N=6qf3?gSzlj{\mjS1W=6q|TWuF9zĨ#X3:ju:dCԁQۨm!2?cXm6 u:judCW~obu\lQۨK6d"zF]l.ِ1lTFu6buɆF]F=qxH~oSۨm#2F=lِ1zF=zF=!c5QOmQlL[e`MF}hF}l>ِ1̚a6cɆהpMQۨO6d ԇ6m6 61s𔶁Flِ1=$ =$ 6` ȆAFlِ1FFCxkP ahhH6d 7z8c8l|X[_hm4$2ߧ4j dCFChFCl-ҧO&F#7Hmшl|hFjFdC55Rhm4"2FjdcmYXrcʍ6cɆphhL6d >o4FcFc!cpj&d݊ F015 \Sm46 &o4Qhm4!2ߧ4&jM&dC&F&FSk#MbMi הjMdC6BM6bMɆm46m46 MjMfd#GGDhF3fF3!cp͠fjͰfdC6A6aȆהfF3fFsaΘcLFshFsl9ِ1FsFs!cp͡jͱdC6C6c-Fq 31Z-j-dC-F F !c=l mhA6d >o6Zm6Zoӧ޷mRh mThm$2G%GFKl%ِ1%öThm$27ZB-6Zbc&{[fRhm"2`h hE6d kJ+VF+!c h hM6$G5GFkl5ِ1FkFk!c55\SZm6Z ߣhhC6FhƹIma͖m6`mȆm6ڨm6ڐ hmQhm!2_S@m6`mFՋA*L31ڊ|F[l-ِ1F[F[!cpmjmdCF[F;ױg氺ٰVShm#2hhG6d >oF;vF;!cyNmўl8&F{1oF{F{!cpjdC}=6cɆF{v~0M`A-I؇wv>[ܯv݁~vW7}?k7Y7HlC8-:~:՗1ss:~ЁtZD:Ϙjd#]11:# 6:bɆɆmH6d {G{GFG!c9#Qm#щlK(\ 褶 D6d =I'=I'NF'!cpNjNdC}ImљlM3kYM;ýigFg!c31;mt6: )Ym3љlot6:mt6._k5"lt6mt6 mtQmt!2 Fl ِ1xmtQmt%Z`bthW8vUmt%2Eq|a&~_mt%2]a誶J6d 7B]6bƭUGV,21 njݰndC}6aȆmt6mt6 wv6mt6 Ū-11\\mt6 ##]m;ѝlFwhFwl;ِ1FwF1ěW=Ě)=6z`=Ȇ)=>Flِ1FF!c5Cmѓlߖ21z =j=dC Sm'ѓl|a{m6z Ϣ=j=6aFΎ^xXj}-~ZKm6Rdh ԆXjC-aOϖpKm6ReXjc-qxKm6RdMԦXjS-E=Ղv\VN ͽ=q|׿^ ^d zKz׋z׿^R^xM6֞q3x[ mVm&2S{jdC6zC6zcɆ mVm!^zjbQ8Qm!2~Flِ1>F>F!c裶K6j]K+}~F_l/ِ1x F_F_!cp}j}dCF_F?CRL~^~^~j~dCF?8oSm#2äF?lِ1~F?~FAJ/F7m6 ?|]F!cjdCkJhFlcV&g0/f@6d@+y!c1jdCt9!c@fصMb2Sm 6 m Tm $211H6d nc 1Pmc 1ldr1H<#3>#3Hmc1l|gAjAdC6A6aȆA AƏdi?#?mmH6d aTlƏƏj?b? ?B?mm &t191lJ5(n+7m 6 )2Xmc01l`hc`lc0ِ1`ѻeo711!jC!dC6@C6`CȆ)C>elcِ121J6ܞ>*l 6m 6 C1Tmc(1lo }cPlc(ِ1x m Um #;51w*1 F6d nc1Lmc1l0hc0lcِ1a0av~2m[?Eda><Gv݁k8 ?Oo><g~'5 > 32?gd~V_q?ϰv3?a?Y-g~&28116~6 Ǐv119b8 6cɆ==1N6d nc81\mc81l|m Wm  kb6F@#6F`#Ȇ7Fm6F mPm 2#F@#6F`~y //dC0}3Æ_6~6~!2ߛ_6~6~!2 /H1?tS&H1oHH!c1j#dC߽߽Tm$2k$1Rmc$1l4%l6Fm6F mRm"2_SF5e(lcِ1Q(Qh)21F5e4\SFm6F w督6FcɆהpM1M6d >6Fm6Ɛ11c1jc1dC6@c6`cȆm6ƨm6Ɛ ob c6`cƲ~r1V#<#ob*_ƯƯdCts_6~6~%2ad++ِ1+Ưle&lac61[mc61l;;jdC :c8lTƑZdCklhcl C^gu)7"̇'^Ē:?^ojO|7eX:WٯTyG75 9taCo#9b`]}Ϙs9G`sȁA3CD]YZsp?C"d >Ǵ6m6~'=Gls]w6~6~'2O G(u ߱Ɇa֊6v_l}QCmm%.u1WMUc\lc.ِ11s6bsɆafw*\lc.ِ16j\ِ1,:΢6cɆṁ6m6 ۘmWۘm, =㦉@x|!cp j dC3/3/PXm, 2~j@mcl/wwW&B>żp!p|8x Pmc!lBhcBlc!ِ1 6b ɆϴB 6bƱ[Y11E|c"lcِ16aȆהEpMYXD6d ~XXL6/7o=cEYtblc1ِ1xX bb!cpjdCbhcblc h@01K%jK%dC}c K6`KȆה%pMYXB6d 7@K6`KFyhb,6BK6bKɆϾ³jKdC6BK6bKɆ獥R2᱉LXm,SXm,#2`X XF6d OY)6aȆ̗A6aƒn}xbb,6C6cɆpXXN6d nc9\mc9lrhcrlc٠_zfbeePXm 2+`XXA6d ncBmcl|MYmPXm$X)J7Vm6V oTXm$27VycJlc%ِ1>e%Rmc%lďpthb6VA6VaȆm6Vm6V UoRXm"2ӆ3Jmcll)>X-֔pMYXM6d kjj!cpjdCjhcjlÕl 7U W7\6\ W!c{]=®j؆+ِ1 W WlÕl WhUmXC6闷&7Fmc l|MYה5jk5dCk5!c5e Fmc l<831֊jkdC0g_p80qchm6֒ X mUXm%2kjkudcÑ~41։֩m6֑ 6aȆupXXG6d ncNmcl[X/z7֫m6֓ ݝ16jqQZ뱍dC6C6cɆ< g6R?KyLb_}m3)v]lO>66ml669}5Llbl66C66cɆo[nV،ml&27yxflc3ِ1f"M&11WڢB6d 7Emc lol}clc ِ19c5elÍld >|p~2ybl چF6d ~n6ܰ 7!cچF6d n pSp6qKablpܪJ6d ~mU؊ml%2Qac奓HU V!c5e+\Sml6s,\S6a|~6lcِ1 )6aȆw'6aȆml6ml6Ɇcp;E6ܱ w!cچ;N6d >oy]mp'2?ukچ;A6 .="wZC 7<6< !cچA6d nP6<Ȇ hCmN6r.)>evlc;ِ1EE6cɆgpݮN6d c3F;?6ml6<Ɇ"\S3dr|Sm$2 mxmxbdC} O OlÓldÿ3ÆgdN!bhmxb;O[M!ءA6d k!cp;j;dC0}#3ÆyM#7vm6Fߞk\S6 /!c /x᥶mx 66 /!cy ^j^N6YUͳ;NN!caÕn")U N!cp;j;dC%6vm6v#'{%ξv]j]dC{]pKmcl|c<إ E6d >.]n1uQKsnn!cyc77vm6v ݰoV؍m&2ح&_ebx5)j؆7ِ1 oh[m&2ްoxmxcdC06\1=}!lxmxc>d޴6|  lÇl܆᣶m 6|6| !cp>ІچK6Lm||r^W6|6| _!c _x᫶m 6|6| _!c5)jR{xGmclo}clcِ1==!c=|clc/hk뚓Mb gѽj{dC6B{6b{Ɇu u߫K6d 7¾Wmc/l8 T'>7m6 mS؇m#2>e>e>lcِ1Ȇ?O!bhm6 6/pدO6d nc?_mc?l D216UYߤ_؏m'2ᰑӋ㓖6m6MZ515\Sm6 g6`Ȇ7jdC {9c8lh_dA߳WEMbM9הjdC} 6bɆgуp=q8H6d d㟟 I!bhmp<sWͽ^晤CnCj"̇'ts>tE:8dw`><9$!?dS?gkNO0]'iʮ.nkaVV_ø/c~pjq?8Ld ~pX-0IZHb16cGȆ/ib6@G6`GȆa9q8B6d nqDmql GG6`GƘ^/eb6BG6bGɆ;ΣjGdC3Q8cU8m%2?QhQl٨VęeLccp8q 8F6d nc6aȆ-)1lِ1R9A8q #/8116_X?ama~dC76 ?!c5)~j~؆ِ1; ? ?l81qܹɆ6cɆd־m6 )r\m8ql|M9mW8nx7Enǻ8--IK-R;e[j-K-R XjZiEYjg-syK킥m].Yj1eK튥kYjW-xKW5_'q\ Vu_q'c$eǀw=8q2~qS1{/l4{BJ&FlltȆj6!c=USm`dCQ6!c/P6Fm[@T6Ɇ@87mbdC{@ T6ɆmBj qE '  !cqj'dC6N@'6N`'Ȇה Iˢ)'YIxsRm$qlo}Il$ِ1II!c߭; mT8mtlbwwmaAdC}# l#lFm Lm">RqJ)rJmqlo})lِ1Y)xsJmql)h)l#lvZo-#iiG(!m _ / V6ɆmCjF0ِ1`h#Xm#8M6[wS;8gw`><9^l9Ω97}x G<]l[Z;/<]}W;8yr c,ZyΓyq%01...m\6. n6.`Ȇalrpؘ!,c٩q۸@6d ~yڸqۈ&=#;ѢoDþmD ϘpƌVۈ6Ɇh8GDmDcdCp6lDmDcFߩkdb\t?=Ɇ#EE!c57o8:El"ِ1r)6.bɆ-.B6.bFr)t11.%8m^R۸m\"27.y%lِ1K%K%!cyqImC6sw51b6oĐ g b6b!c53Æl#l|MkJF C6d >o@1j1e{Y9}żq6.cɆp޸q۸L6d n2qYm2ql|޸ m\V۸m\!.{qynɽB6Fm(_Q۸m\!2 l ِ1++!c5 qEm K6 Ĉ}#XXl#l>XxmĒ ۈ6b6bX!cpFF,G6'lAqjqFِ1x߈}#Nm#ۈ#2E,mđ OmĩmaWɆu^51}UOq۸J6d O )W6bWɆm\6m\6 *qUm*O6fmcbċwjF<ِ1הxxl#lx||F<O6d Cj5x&5aqMmqlo\}5lِ1w7l6aȆϾA6m8CѾFΎxܰnZj,ۖKvRo=Zj,ǖKR{n^Zj,זG]gulmM$]kqw-V(Z)RK^,h@@gZt{yz9>gf=yc{k}}}Y>[ƾXA5ηI;?I|$B]"p'ck\EA5N_"5.׸q2ߧ5.B]"wl ~X'lِ1xotFw6`wȆ;pq۸C6d nqGmqlЯRt11]޾q۸K6d n.qWm.ql|Mum6 wjw{d}ĸ'=X7m6 )rOmql|ܧq۸G6d nqOmqlӻĸ/l܇6m6 ۸mW۸m'2qڸq۸O6d >܇6m6gmIx l<6m<6 )16;@ &lِ1x6`Ȇm<6m<6meb<Co3~xH6d o&FnDmDbdC~"᳟HHl#l|NsJF$I6d 'ڈTۈ6_51 GjGdC#o<6m3Mn|ulِ1x!cpjdChl#ؗk^Y&GN)6>bɆm|6>m|6> m|Tm|$2jOdccsw61>^E?m|6> ÍD6lD?m|6> m|Rm|"2 ۈ#u&FqnĩmaqdC೶88l#lFmđ ۈ66ⰍdçBh_MϢ {jdC06:c8l^?m|&2L6d n3Ym3lso|E^l ِ1: \|Qm|!2B6d m|Qb> "/os%Z,c1˘e2m%ZY[,c$d䖱Xe,e,e,e,e,e,}8#kU9 55LwlDԍ$n$QHm$!2I`HHB6d ދ&h$F!c^Om$QHm$%,H*FRX7m$6 ÍIɆ%NHJ6d ~&7i(:Tm#)l| HHF6"'G31 ֍djɰddCsJ28$SHm$#27~#F2l#ِ1:%Lm#l-A/RFrh#Frl#9ِ1~~6cɆm$6m$6 Mm$WHm yB))Bm#lHj)dCh ؋PHm 2ES@)6R`)F[ ;db{_)WJFJ!c)قj)dCu#%)6Rb)ɆFJFx8uu#֍l#lyJ|m ׍X76!cmm`dccF 76@!cmbdCu#֍@@l#lF m"#vyJԍTnRHm"27R~#F*l#ِ1F*Jm#l|NImRHm&::#nF=w*2VHm&2Y4qp?ҳ2}Ck#5lnu#Fjl#5ِ1FjFza'M4nu#Fl# ِ1xi6`iȆFX7Ҩm6Ґ ùQ@6ҨmpIk!+-|F>!cp|j|dCߕmSȇm'ygNcbu#?6cɆ):%F~l#?ِ1F~F~!cȯnqȫ9[z0k5)ZDsq/>l]P[ {_\Po..l]x y\ =ĸv^AQ zPP} zPAA\ [" E 1 QPm Ql {Bm!BF!!cG!(Q(D6d |NRHmQl|ߢQHmQl8^8\(,֦ڴFal0ِ1x( FaFa!cQ֍jdC}DahFalNQ'sN1+~AFlِ1"F"F!cpE"jE"dCsJhFl(8q(*(Q(J6d oQ[U(m%2S9FQl(ِ1x( mU(m#S8狉Qow -<[PLmQl|mZ Mm6 ׍bnS(m#2Q (Q (N6-Q$~(.(Q(N6d >sJqFq!cpšjűdCsJqhFqlH\[.&F 1sJ F !cQ֍j%dCsJ 8P(m 2Q(Q(I6ntWQ(Q(I6d ^7JºQRm$Ql|$,Q(I6d >6Jmp|>0(eGiXXYX9XyXXEX%XeXXUX5wꖱZږ:zFƖ&f斱Ô8UΛ͟S)|WJ]JWjk\)XJk\)\JQ1xoT F5q=RƕR׸Rx+M6լ&Fia4QZm4QlFihFil4ِ1wJT6mT6#N|';ﰍȆ&buߩm|m|G6d NSSlwjaFGדĨ.ߨQۨN6d ^7úQ]m:QlߨjձdCu:Q]m݆W s9yj5"]~Mj5=[W_~Žţ8/y =AM :$Ы)U~/&}׃T;AMr c>&#jE&1VMhFMlXR/&F-6jaȆAԂ jm6j `QKmQlF-hF-l6sK3EQ6jcɆFmX7jm6j ۨ mVۨm&2#jC6jcuFj++uaQۨm!2QڨQۨC6d nQGmQl|OQGmQl]8Ĩ+Յm6 wօu6buɆuaZWm.Ql/ujuzd "'zF=zF=!cpzjzdCh=؋Sۨm#2SA6aƐVybbF}oWۨm'2S9F}l>ِ1F}F}!c^>Q_m>рlJ&F7Phm4 2hh@6d n@mрlFhFl!p;:5w&FCQ7ºPm!ѐlFChFCl!ِ1x 6b Ɇ甆FCF#q㷥LFF#hF#lِ1FF#FF#!cpFjFdCuHmјl/ع/jl4&nhL6d n1Xm1јl| am46 ?{o m4Vhm4!NOcb4&pDm фl|Sm46 hm4Qhm4!2M&jMd1|&FSb+ՔlK7Uhm4%2hhJ6d ދ6hSFS!c𽯦FSF3qDhF3fF3!c9Sm46 ׍fn4Shm4#2͠fjͰdcዕT-hb4waͳdjͱdCu96cɆ{mhN6d n9\m9тlv|ͿBSZuJ F !cp-j-dCu-6Z`-ȆF v0>LKw5Ƶ_+O_Jͭ`JmъlonVjVdC6ZA6ZaȆVF+VFka{׊X[ﱶVhm&2M16lʵVhm&2hhM6d hhC6zw5Fԍ6nQhm!2m`hhC6d n Fm цl|NimQhm%oؖ61 mjmdC06sp(~|~pXovjvdCvpNmюl|/܋ihG6d >6کm6'-Ծ=dC0u3F M ﱍɆn|==ِ166ړQ9ؚ텍F{F{!cyjdC6C6cɆm6ګmp`EmMg:.ZDsq/~l]r`;A݁ǿuww}sqov[{׃t\=VeC1;»Q};zБv׃@#Q-#IAGhFGlpoL8w 줶 D6d 6צ6:aȆ褶 D6d nImљlֽj&FgQ7:úYm3љlntuFgl3ِ1x FgFg!c}FgFpUSE]D]6`]Ȇmt6mt6  &P.F!c}.F.FWqۢk]FWFW!cG#g S6s.Z]dCsJW8tUmt%2SB]6bGcbtsJ78tSmt#2_vknjݰndCsJ78tSmt#2 覶 N6=2]ԍntWmt'2E^Fwl;ِ1FwFw!cwݻC6c=Fc51z֍j=dCFoPm 2衶A6d ދ6zm6zc71z6zm6z[ kVm&2譶M6d N )6zcɆװj>dcP%411~7m6 |3ÆWv x}Ckчl|N>j}>dCFhFl/(ںMM9ż,ӗl9Y/Um%2_kؾj}dC6B}6b}ɆF_hF_lp3&F?oF?~F?!c9Sm6 OmяlmSm'ǪPџlċC?Iןluq!_鯶O6d >sJF!c֍jdCu?_m?1lLk{1@} {_6`ȆjdCuc6`Ȇ@QcOƷ11o 1H6d > s@@!c1֍jdCs@hc@lc٠[311֍AjAdCuc6aȆm 6m 6 ׍A A`q%ɫg71~c`lc0ِ1x ``!cpjdCuc01Xmc01l,8Wc7m 6 ׍!n Qm !211B6d nc1Dmc1lW#]N&P1 sPP!c1֍jCdC6BC6bCɆ甡P01|䝝Man uc0lcِ1x0a0!cpàajðadCka0apA;p]Mκad}6cɆpX7m 6 m Wm '2áj6a_aFXeleleleleleleleleleleleGT4t LOYٖ9y-c-c ,cXZY3jܺI;nFhFk\FP17#5nq#ƍ5nƍ5n8׸ƍP׸89[A)A-sq/^l{?`w`.ݺ.{9{yF=P w`$}? T;Hr c}PH$2#j#Qd=mb%%Rm"2?? 1 E6d ~(~(Q(!c(hc(lc4[C&hQ7Fú1Zmc41l|4Fm6F  mVm&2j1dWRc{c{c6`cȆƖcȆm9?Fmc 1l|N1jc1dC{c1jcdqcX6Vmc,1lnucXlc,ِ1XX!c11G6;t0'qpN1G6d 7VƑ [1G6d >s8q8!c11O6N:~/l6ƫm6Ɠ [6cɆ-}j㱍dCuc<1^mc<1l89&1Ls !cp j dC6&@6&`ȆL6&mL6&CQ51&1֍jdCOOTۘmL$2S&9eDlc"ِ12ژ1ۘD6R缙c1 ژ1 ۘD6d ދN$I$!c%16̗㽿1 ۘD6d >L6&mL6&o 9dd!c9e2S&mL6& )2Ymc21lnL6&mL6~$fhGQ7~uGɆmm##ِ1#S~Tl|_GhG)d}9GL)hclc ِ12)S6`SȆX7mL6 )S)jSd#97g31 SjSdCuc*S6bSɆmL6mL6 )SjSid# iLib ; amL6 ?NSۘmL#21 ژ1 ۘF6d nc1Mmc1llmfMnLuctlc:ِ1xݘtt!c~c:7mL6 )ӡjӱdcYc1ژ1ۘA6d ò  !c1֍j3dCuc1Cmc1l&L1̄sLL!cp3j3dC6fB36fb3Ɇm̄6fm6~";? ?A?mmD6d n'h'Ȇmmِ1'h'Ydtcfm6f `1Kmc1l,hc,lcِ1621Yjdc[>3M٢ߘ jdCuc66fcɆ{ٰ1ۘM6d ^7fC6fcsw}klĘ#9pN1ۘC6d ^71Gmc1lńuclcِ1dL dclc./h|L,\x\lc.ِ1Fg ۧHm6 ׍nUۘm%2F?ژ1ۘG6.Evv1OԍynSۘm#2S9eI;C6c FH۾ LG _c0o@ 6` Ȇal4wpظ{Xm, 2|||lcِ1/d/pm//dCuX7~Ql//j` M6~QXH6ִ[;bcsN1uc!xײn,TXm,$2?˸e\XH6d 6]j dC6B 6bF$Xbb,uc6aȆ"X7m,6 Xm,RXm,"2߷Xm,RXd&w_t_z߆q|cK,cK-c,cZƖ[VXVZVYV[XZY[6X6Z6Y6[ƶX~mmmniemckgobqylmsZqfYL5rlXkb\S1LkꌁX]jTj-5n18͋a[qlӼ/71%pmlc ِ1K6`KȆ%p[XB6d -6m,6ݙl[ab,6BK6bKɆ/gm,6 X m,UXm,%2KjKedc21y웗m,6 ׍en,SXm,#2 X XF6d o X l%jWaWhW__Ɇ] ]++ِ1^̯p/W__Ɇm m+lx_oZcXXN6d ,3Æ5j˱dCuc96cɆ/6m,6V?\fBXmPXm 2SV9e lcِ1:e\PXm 27V@+6V`+ƴr?`b6VB+6Vb+Ɇ/Z /ZXI6d nc%Rmc%ln6Vm6V FM&*acJmcl*x~j*lcِ1U*U*!c5*hc*lc5t(cXîkjdCsj8VXm&27V~cjlc5ِ1x/XXC6nns^Fԍ5nQXm!2k`XXC6d NY)k6`kȆ55Zm&ZQ7ºVmc-lZhcZlc-ِ1xX ZZ!c9e-Vmc-l 0cXXG6d ދ:u:!cp렍uj밍udCs:hc:lc=|خMzhczlc=ِ1zz!c9e=S֫m6֓ ׍z|Hw  !cp j dC66@66`Ȇ76@66`Ɩݖcbl66B66bɆ7=jdCk؍p Qmc#lmlT؈ml"OęML&M&!c^tE7ml66 `ImclmlR؄ml&E[&fQ76úYmc3l|N jdCsf8lV،ml&2جB6>􀉱Eol[6`[Ȇ-j[-dCuc [6`[Ȇ--vC^u9[Zov^ 8fw`..^y7Qᄍ7x<}o{[鞏[D#VGl}VߊV2+B[z ElU؊V!cb+Umc+lTm4&6ga^+6m6!c22ml6 mlS؆ml#2 ئ N6/bvlc;ِ1x6cɆvqaϽdi;قl!c1;Ȇ!cءA6d oءl8eb.n;;ِ1x֍6~6~'2údC6~6~WI6~/c8˿ߩI6d ~`'<[Smc'lNhcNlc'ِ1wvB;6vbF-n}jdCgwó6vcɆݰحM6d >6vm6UO~#;=j{=dCuc{6`{Ȇ=pN٣C6d mQ؃m%]#?bbs^8U؋m%2M16Zڟfzobhm6  mU؋m%2_6m6̺hb6A6aȆ>X7m6 `Omcl>hc>lc?xSűgb~oW؏m'27m6 a_mc?l|دn}#͎xa;f2v2v2v2eeeeeeeeeeeeeeou M-maPi\+58w@]wjkXk\P1x|ָwZ5㠰q8q8H6d n qPm qlAhAl ِ1xot8q8D6ʴ|p6争qH͇`|Hmql!h!lِ1\SR8m"2ߋ9mR8m&IㆉqXԍðnV8m&20|al0ِ1x8 aa!c90qXm0ql8\f}[&aqDmqlnulِ1x8#!c##Q1oԾ&Qa(qTm(qlQhQl(ِ1QQ!cq8ql~oِ1̜a'"΅~Ckl!c}?>j` CmlHytl{&1Q7qLmqlnu1lِ1xq 6aȆm6m6$'Ƶob)Ɵn''ِ1??66$2'm-ib8l?xƋ6nl| 'ƟqX??41 ǡjDZdCW8m'27~ql8ِ1x8mW8m m7.S⑉qB<9P8m 2_Þkj'dC6N@'6N`'Ȇ)'j'd&IQ7NºqRm$qlnuIl$ِ1"^M I!cq8qnq/s<[䕉qV= ;jgdCﬞﬞU8m%2ga8q8K6d c6Ϊm6Α'8's8q8G6d o9s9!cp砍sj簍sdCs9h9l<3oޘ]Ewy^mm;E/^El"ِ1ыdFEl"ِ1EE!cpjKd/WQKn\u%lِ1xq 6.aȆm\6.m\6. ۸m\R۸m\&:~[ĸ,l\6.m\6. ۸ m\V۸m\&2_^kjdCehel hfL+hl ِ1qEm ql{+jW+dCW+jWd#Gr|11 WjWdC \U۸m\%2S9Ul*ِ1U5x)5aqMmql|NkjװkdCu6aȆk5kdcwо.&bodC0uk S/=Zc ׍a[molo!c~ohodӞ>3\Mn\uul:ِ1uq]m:qluhul:ِ1rڸq۸A6r:fb7  !c93Æ  !cp7j7dC7j7duzLn܄uMl&ِ1:&\T۸m$2qڸq۸I6d ^7nB76nb?=-/㖰q ڸq ۸E6d nqKmql|߸q ۸E6d o܂6nm6nrV[mbm؋V۸m&2_܆jdCpr[m6ql|rڸqn}E~&;{H#cS3Xeee,2222c{c{k}}}Y>[ƾXA5i?q"P׸\"EqEP1u5.jk\q;d񆭯qGwwGmql7{;jw;dC8Q۸m!2qڸq۸K6{&]7߅}]]!cpwjwdC}]7U۸m%2Bw6b*O\{1=a܃s={=!cp{j{dC{1{jd&ckb}oW۸m'2ýpm6 )r_m>ql|/>q_m݆snǃ9[x.\ߋz{{nX7fz_kѯFCc>=CC2+Bz{xD6d G<}#G#!c3GjGdCuHmlu3X{ =Vxm<&2xxL6d ^7úXm1ln<6m<6a=ץ119 Sm<6 xm<6m<6^x&3X7m<6 ׍gn9%Vm#ۈ%2SbmĒ v,m#ޗhA^7~;lِ1;Nmlnu;lِ1xxxO6:LR2^ԍnWxm'2S9{l=ِ1x6cɆ{h{l07>~lِ1)6>`ȆpN@6d S701jdeLFc EGG!c֍jdCu#6>bɆ{яG'A;pELO'h'lِ1x'O'!cpOjOdCp'OFpUSEM8a#ڈSۈ6Ȇ7FFG6d >9%Nm#ۈ#2&g8ٜIZl}=v">E{x_$}gvŜg>Y}?ᄍ7x<癤Vϸ|{-Ic~w }_\E _ȁXE| 1 Em݆/K/0oq 9[\,c ,c17˘e2iy[|,c -cDĖ1?˘e,e,e,e,e,e,e,2hKeKmKcKkKgK8%G|#v2N[0?sW/?1xj?:q<Ь?k\05.^qspO6&w_؈mWۈm'29c8lw&p.ZdC6C6cɆ|猁lWۈm&K~K:m  X7\6\ !c}{0om \  l#H2%Ma| m$6 %Cj dC}s07'PHm$ 21!Yٸ  6`dJW41\EpuUmp%2nmbdC]ymW WlÕl}{g Gj؆٘0GL 0v Cm7 7lÍlY[z즶m p66ܰ 7!cpnІچN6Z̭|riü,N6l/mcdC[~]mp'2S⮶m )pNqWp6j>؆ِ1a}6| !c9)>j>؆ِ1mm` ƻCm״kb$6B 6b Ɇaְ͝16o|_#716b Ɇalpp汩HH6d >$sJB؆/٠_Hob Іچ/K6d ^7|aU6|ɆA6Jrpoim  _X7|6|DdㇰCcW601 DjDdCh"؋&RHm$"2169~Ck#lFugKyZd*L9lb6Fbl#1ِ1FbFb!c16s+716cɆU֍j ?EσM ?Q7`S6ȆmA~j~؆ِ1L(oM ?lÏl ?hOm':y?|⯶m W6Ɇalup(#Km 66$dNq571֍$jI$dCu# I6`IȆa攲GqFobhm$6 Hm$QHm$%]TIaTm#)l𽯤jIdC6BI6bIɆFRF2ߩ219%Sm$6 )Lm#lfN)obhm$6 ׍dF2dFrq˅\ԍn$WHm$'2HHN6d ^7ú\m#9lMm$WHm K|wBԍnPHm 2'|'F l#ِ1<<*ib8ltw716R`)ȆF vC^)F׳u)aR-"]}5"AJsq/y.%;uúŵw?{ٿK yJ=OA.zu0# Aj1"ZLbЊ D|66@2;bsEF H6d 7 [;m hص%716@!c"T6RTJ? ?Jm#lLTjTdC0j:c8lHm"2a*h#F*l#5=8}L#HHM6d ^7RúZm#5lntpXSiHM6d 6M mVHm!EoqN7#Xk4ji4dCu# i6`iȆIIHC6d >6Ҩm6ҒxӇ},H+FZX7Ҫm6Ғ 7sp0/Ck#-lZZ -FZl#-ِ1FZF:q䟦VO#`HHG6d ^7Nm#l=t=tj鰍tdCsJ:h#F:l#=sMaEӇMHO6d S7pMM Fz!cp額j鱍dCkFzv\0/͎ w<-c! PXe,e,22222222222222V2V2V2V2V2V2V2V2V2V} qVxWk^L܋ R׸ \エ= @D5N5.ָ u 5.j X5.dïa31߭ V6ɆmCjF0ِ1`h#Xm#&2``l#l\e"C~FB6d 79Dm#!2mm`!dCQmd vϞx2 dO62`ȆFX72md62 kgPȀmd 2mdPȀmd$ͺeQ3vFFF!c֍jdC62B62bɆ甌FFF(pl$jb,F(J6d 8>3U6BɆP8mbdCh(mgCfbuJ\maadCu# ֍00l#lnm ׍0h#Lm# D6֌t^9 Ldc&ߑu}LjLdCF&odRȄmd"2vP&LjLdCu#Im#N69:pN W6Ɇp8mcdC6¡ppl#lnCjFfLFfh#Ffl#3ِ1FfF]q%k1f) M1ffff-3[fmbfff9Fuv}lj?\qHoߩS}l߫m|m|O6d n{h{ﱍd{41m$6 aXm#1ln$u#Fbl#1ِ1Fbh#Fbl# XW0;Io#E^4Fl# ِ1xI6`IȆFX7m$6 ׍$F$FRufIFRTm#)ln$u#FRl#)ِ1FRFR!cf'6m$6Y Ldn$u#F2l#ِ1x 6aȆm$6m$6 Hm$SHm$'tU#E^4Frl#9ِ1FrFr!cpɡjɱdCFrh#Frl#sݚ&F ыh F !c~#7Rm6R HmPHm 2)j)6~0]j?E~k~j?Gs~{ƃ6x6})ivtC/+R½RSz{̔AJ$2)j)q=HI"d ~HHE6LTo0# H HE6d >WsE*TF*!cIRIRm6R m*h#F*l#58wk|#LFjh#Fjl#5ِ1FjFj!c5pM+Fjl#5ِ1xH mVHm!S.|{FFm# l|NI4ji4dCu# i6`iȆ?@i6`iFmH+ִ5jidCu#-i6biɆm6Ҫm6Ғ ׍FZF:~kbsґ_,UNm#l7HHG6d ދh:tF:!cctF:tFzqRƙE6cɆpNIHO6d n#=^m#=ln6ҫm62%k3Ɠ`I\ j dC06zb86l8dPȀmd 2S29%Fl#ِ19; jdL212I2I2md62 ׍ndTȈmd$2aȨH6d >d62md62 MML9d"a3md62 O@fRȄmd"2 Ȥ D6d ^72A62aƻjL512֍jdC)qJfFf!cp}#Ffl#3ِ1FLQO32md6tL,6 <͢B6d jj,F!c֍,jY,dC0u'cZYd2[01֍jYdCu#+Y6bYɆFVX7md6 nOV8dUȊmd#)LlF6h#F6l#ِ1x/ 6aȆSljٰldC6A6aFd&>mbdsJv8dWȎmd'2aȮN6d n#;]m#;l8%;]m#/?̧w09,iemckgo+`+h+d+l+b+j+f+n+a+i+e+m+c+k+g+o`hdlUUU&ո. k^N9nC]rjpˡq9pA5NQP׸'céqG8C]r/'=$}&FNa#'Sm#'l| 翜j9dC6rB96rb9Ɇal|ب٩j6rm6rʹ:%l6rm6r ߫7Wo.\F.!c(rm6r 'cck+ lRȅm&tGE&FnqLSVȍm&2yϸ'ccaS}Ck#7l|-&7\ɭM6d ^7rú[m#7l\9~7KLl#ِ17=1c6a#BV=tF~y{7I6cɆpNɯO6d c#'FЇȏm'2y_'/HTȯ(@6YebFoP(m 2`(Q(@6d ^7 Q@mQldzuO dž'I6 m8y4ֹ*0󈹶 I E0qk QP݁xxfϵuaYP xǍٸ }^׃B;Z^ZC# _H zPBA!B"21 ZD!\ xlaF!l01M) m6 6 cɆp(Q(L6d ~La~_aF7l41>#m6 wE6`EȆm6m6 ^(Q(J6v_>&~D>E6bEɆFQX7m6 i]FQFQ!ca6m6|=(&F1X7m6 (mS(m#2`(Q (F6d ^7A6aFcm51~87m6 OROR\m8QlFqhFql8ِ1X(Q(A6zLnuF lِ1qJ xRBmQlF hF lِ1R(Q(I6,xxQ,$]QRm$Ql~hIa#ZRm$Ql( j%dCsJIhFIl٘T;MRnuF)lِ1xQ 6JaȆ?'RjRdCǰRjd&}QZ\[^[Zm4QlsrK-Q(M6d >sJiFi!cQ(Q(C6"]~QFe6`eȆFX7ʨm6ʐ e6`eȆ{2F2FYq߻;Q3Ql˸d(Q(K6d sRñ;)ZedCu,e6beɆFYhFYlXݵDQ6aȆ_-_-Q(G6d ^7QNmQlzrF9rFys41ʋup]Fyl<ِ1FyQ^m滑F#lِ1x6aȆF#hF#l1(_hPXo46cɆSjdC6C6cɆm46m46s*sMy6!5lКDm фl&&jM&dCh؋6Qhm4!2S@M6`MƩ-xnb40u)ٰ}ySFS!c֍jMdC3737Uhm4%2MjMfdcBi+db4h3؋6Shm4#2Exb86̧~I fF3!c9Sm46 hm4Shm4'կٗ&Fsa9\m9ќlFEO Ƒ}Obhm46 ׍n4Whm4'2hhA6?kE[^F lِ1W BmтlF hF lِ1F FKq@51Z~%7Zm6Z -aRm%ђlFKhFKl%ِ1FKF4Xꝉ-F4jF4ِ1u:hhl#l߈FF4M6d n#ڈVۈ6Z zH1Z ֍VjVdCsJ+8Rhm"2 h hE6d nJmњl`ZZm5њlFkhFkl5ِ1FkFk!cFkF2>&Fa Fm цlh6jm6dC6@m6`mȆm6ڨm6ڒM[Vh mUhm%27~F[l-ِ1F[F[!cNBm6bF7gh'7vjvdC6A6aȆm6کm6ڑ vjd#wEhF{F{!c9=Sګm6ړ hmWhm'2hnù8&)&sJF!c9Cmѓlz?=FOFO!cxFOl'ِ1FOFO!cp=j=^d-S%^襶 E6d ^7zKmыl|N^j^dCsJ/hF/l7Țظ_E FoFo!cvʧ16zcɆ{ްM6d 譶c k裶c1xF>FFX7m6wE ~裶K6v N&LbN 甾j}dCco3%m6  mUm%27B}6b}BM~F?hF?lِ1x/6aȆ{~G6d ^7A6aF'JGkbҟln_m?џlFhFl?ِ16cɆF̍[ X7m 6 } k_6`ȆpN1@6d dž@6m 6L@hc@lc ِ1@@!cpjdCs@hc@lc`b )q A !c9eSm 6 )2Hmc1l|Nm Rm &tWc7~c`lc0ِ1``!c1֍jdCuc01Xmc01lgb c9Dmc1l|}c\1B6d ^71Dmc1lhclc(ٸ[CE1C6bCɆ1J6d nc(1Tmc(1l|}c(1Tmc(1l?x s0a0!c9eSm 6  6m 6]}w Nib uc86cɆpN1N6d nc81\mc81ln 6m p.aOn.\[7D1.lsn#FGsmG7fmG\F>qi `z`$}#a1R`$#ɁH(bZH\F#j#Qdcè!aә<69£Ȇ¥QjQdCs(8WRm"2d|d(lcِ1\1 1 M6b lUcX ״Fm6F  mVm&211M6d nc41Zmc41lyunlFcn nlc ِ1[Qm!2S9elc ِ121K6R&Xq-Xx-XX!cpcjcdC6Bc6bcɆ mUm#'II1G6d ,gSm#2S9e8lcِ121O6Lnucxlc<ِ1x16cɆm6ƫm6Ɠ )㡍j㱍 d9301&I&I&mL6& 6&`ȆmL6&mL6& ׍  D'xĘ(7&jdCџ?Qmc"1lߘjdCkjId]G61&cIv$lcِ1Lݨ2)?1 ۘD6d ^7&1Imc1lnL6&mL6& g-C^c8/c21l|hc|lc>ِ1x/:6cɆ{|1=+ qx@mcl|}c\XX@6d ~ .PXm, 2 j 6kbm?n! "E~ϭ[kBvflﯭ[g꽿оƃ6x6B>_"|Tk_Co#>bz/`}׃E,R;X"r cb+E,`1x=Xm,RXm,&}i5cX\ ;m,6 Xmc1lbhcblc1ِ1b1wFab,=8k,QXm,!21clc ِ18,QXm,!2_ _m,QXm,%uZTTmc)l~|-%Tmc)l\ {̥jKdC6BK6bFJX&2X7m,6 ׍en,SXm,#2 X XF6d ~l X XN6=m\ԍn6cɆazHO džD6cɆpNYXN6d o,6m,6Vu ^Nkbuc<  !ckdVkdVm6V +`/Bmcl} J u71VzS)+F/Rmc%l~"?Ckc%lnucJlc%ِ1xX mTXm"9~Jîǰ<*U*!c~c7Vm6V XmRXm"2 X XM6721V{]M6_cVXm&2_Z ׾Vm6V )ᜲZmc5l8e5Zmc5lI}i&&o5!c֍5jk5dC6@k6`kȆS@k6`kksbl$'6֪m6֒ ߏn-ZZ!c9e-S֪m6֒ kjkud jX'OY'O1֩m6֑ )Nmcl:hc:lcِ1XXO6|iKcndcJ^mc=lv=<]XO6d nc=^mc=l]mWXml g_vn! ؠ@6d ol !cu p]tlcِ1xmlP؀ml$/ls6m6!cp۠mj۰mdC}6hc6lc;xٓ]Mj۱dCsv8lW؎ml'2خN6d cw&]mc;llq&qx!cp;j;dCk;!c^tCmc݆s׏ں)""~0{~;0q|?x0{=[#?}^pbL 꽿׃e ~N~N$2? ?vE`'1x= mT؉m" /90J?ђإ E6d ~.x.].!c>b#vm6v cKmclq]gbV؍m&2#v>bnlc7ِ1nn!cحC6F- mGCCGmclش'c{6`{Ȇyxlcِ1hclc/٨T;M j{dC{^^!c֍j{dCuc/Wmc/l87P}2'>'w_"9<>}>!cϑ?Gf>lcِ1}>}>!cاO6~cX Rm6 a_mc?l|b?\دO6d nc?_mc?qlnLL~ü`ѣFlِ1r)6`Ȇm6m6 8mP8m$ <}~qP)6bɆAX7m6 8mT8m$2q8q8D6RgD/z6aȆ!Q7d C!!cp Ckql!h!l0x2tMahal0ِ1aa!cub]T8m&20qXm0ql1&ы#!cpG#jG#dCuG6`GȆhl(xILգգjGdC6BG6bGɆacXCk(qlQhQl1⦄LcbN9cjǰcdCZǰcdC6A6aȆ׾A6aɆoɖM4198Sm6 8mW8m'2S9ql8ِ1xq8q8A6nMnu lِ1y'Ĺ2 lِ1x8  !cp'j'dcZV&IQ7NºqRm$ql|}Xߐ16Nb'ɆIX7Nm6N )'j'Sddqm&L31N SjSdC6NA6NaȆaOcSjSdC6NA6Na}= 8N9 SNm6N )6NcɆaldpl?=>q8M6d n4qZm4ql8,uuqFԍ3nQ8m!2q8q8C6d o3!cpg3jgdLmbU8m%2S9Yl,ِ1xqg6bgɆ7Bg6bFTeH<8'9X7Ωm6Α ׍snS8m#27~9lِ1s9syZIoߞW8m'2?=aϫm6Γ )r^m"(.E7qWgh_T}eg}%wz/,lbjfnaiemckgo{`{h======d{i{e{m{c{k{gծ/n^lJ%n _RWKx^DUL%8]R׳Kx^DLJ`elv*/wI].2p>Rdž9L6 qYm2ql~L6lee!c~2/m\6. 2qYm2qll2臯~l ِ1rEm ql8 ِ1}\5Gと`xx@6d o<!cpjdCǰjdQ}U 21֍jdC]>]>Txm<$2xxH6d o<6m<6߿`'ĩmaqdChE6Ⰽ8!c8xmđ ۈ66ⰍGdsw&#Q7Hml#h#lِ1G#G#!cpGjd#[ s71֍jdCsc8Jml|MgMbM5\zxM6d ^7^úZm5lnukl5ِ1xx mVxm!871x-!*gIijFm lZ7Z7jo7dCo`Fm l| Fm l,R&[wUxm%2?6} Mߪm6ޒ x mUxm%2SBo6bF}\db#.Nwdc|ȓߩm6ޑ _^Nml<6}xG6d ^7A6ad#Mݮ߈FF<O6d ދ^4^m#ۈ'2Ea/mē ׍xh#^m#nù?̩Kq>^1o˘e2gX-cA`Xe,222f }}P92E]3l\|_d#CuE~Ï޺"1kY ZvEײ1kY ZvEײ1`"M zEKm "2"P襶mx ^?R6Ȇ{/hKm &]G覉-lxCj؆7ِ1Lذ}چ7M6d zG[m&2_s66 71| hGm!2}"P裶m  X7|6| !cmm`d#唺†/᫶m 6|6| _!cJV髶m Іچ/G6;x=/#/#Om#27`᧶m )~pNS6ȆmA~j~؆?.&mmcdC6  lßl܆?᯶m )Іچ?@6'Fm  P6Ȇa1lF@6d ~h#@m#$MG&F`?o70m T6Ɇ{@؋mbdCsJ m ͝DM ׾6 !c9%)AjAFِ1 h#Hm#"2mmadc;ߛ=GF0L6d n#V6ɆmCjF0ِ1`h#Xm#!ul义"F!j!Fِ1h#Dm#!2N($]'m !FFJ6j&F mmbdC6BPPl#l8%mbdC6BPPl#xY31 j dC6@ 6` ȆpNIH@6d fHHH6iMFBh#FBl#!ِ1FBFB!c֍j dCFBh#FBl#l0acX&Wٰm 66°0!cFFF6d ^7 00l#ld)vxh;#\O W6Ɇ7FF8N6d ׾6±p!c~#W }8׎oO0+"}+;/HOl./?&_&?79A9ZN$?֟}S}S盜gAHo bL&9ұJ㲋o o:D.W_c\[Gr';71/WP\_ޮ`>^j} ]\^^BW1+WQ7{3{97⾠-ø: u5No*?~½uo;#>_P;7_Ow߻LA_K?KJZW`/r9˴  tzGB+>٦x͟Qgg8fĞ?##.,L'Fl.W£G"G|}:-jӂ#U;:-yBO8-taB/ʹ~o!pZpŜZ^E\%\ElIU&O7HBI_4L$_<I.D?4|H>Gg"Y_\$WH]Wh"O'Dݯ1-Qfir~gµFr MP KWAu+Y6Q-5:箉۽/7<wu./_`moktyIW9pܙ"4ժqThRQmY;nvyZ6n,2F-#?H^ek5k|TGNa՟٣ yFZQg珬/|dYGF9~f5VspCw?Wzy͙,\tg \΋:fUQ޺yDj4ƓпH+C=r.Wޮ-}ޏ=U弓},,?[P?7>G~/֒r@-6A:/]2;@D\G2L)i@3nLN0<T s ZI\0Ζ؛wf`0p~r Nkv0чУzp̤_ ykXv,"[@h!%.(4OT3Xugx ~ k0Sk:0C`-0z}*Y257DGWDcy@E]\^ a*"K8"X0/:"TَO&1%E8=1Oh+'0T hp    TinyOS 2.0 David Gaywhite David Gay156Microsoft PowerPoint@פ@= @0OQGSg  )'    """)))UUUMMMBBB999|PP3f333f3333f3ffffff3f̙3ff333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffff3ffff̙fff3fffff3fff333f3f3ff3ff33f̙̙3̙ff̙̙̙3f̙3f333f3333f3ffffff3f̙3f3f3f333f3333f3ffffff3f̙3f3ffffffffff!___www#Cc4'A x(xKʦ """)))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___www⵴ܳܳⴻݭܴܻ⵴܊݋ܳݵⴴ⻋݊⻴ܴݻܻⴋݼݴݴ՜.+,D՜.+,       B On-screen ShowIntel CorporationfH\ cVerdanaTimesSymbol Courier New WingdingswhiteMicrosoft Office Excel Chart7TinyOS 2.0: A wireless sensor network operating systemSensor NetworksSome Typical DevicesSensor Networks ChallengesOutlineTinyOS and nesCTinyOS in a nutshellnesC in a seashell The BasicsThe Basics Lets Get StartedThe Basics Interfaces,The Basics Interfaces and Split-Phase Ops,The Basics Interfaces and Split-Phase OpsThe Basics Configurations The Basics The Basics%The Basics Advanced Sensing, Tasks%The Basics Advanced Sensing, Tasks$The Basics - TinyOS Execution Model$The Basics - TinyOS Execution Model$The Basics - TinyOS Execution ModelThe Basics - SummaryAdvanced NetworkingAdvanced Networking)Advanced Networking External Types&Advanced Networking Dissemination&Advanced Networking Dissemination"Dissemination How does it work?*Advanced Networking Starting Services#Advanced Networking - Collection#Advanced Networking - Collection#Advanced Networking - Collection'Networking: packet abstract data type 'Networking: packet abstract data type #Advanced Networking - CollectionBasic Networking Basic Networking - InterfacesBasic NetworkingBasic NetworkingBasic Networking'Basic Networking Buffer ManagementNetworking - SummaryNetworking Component Structure*Messaging: networking component structure*Messaging: networking component structureManaging PowerUsing Low-power ListeningPower Management effectsPower Management effectsPower Management effectsPower Management effects,For Experts: implementing device drivers A simple light sensorServices with Multiple ClientsServices with Multiple ClientsServices with Multiple ClientsServices with Multiple Clients A Fix: Parameterised InterfacesServices with multiple clientsServices with multiple clientsServices with Multiple ClientsServices with Multiple ClientsResource Management Resource Management (continued) Resource Management (continued) Resource Management (continued) Resource Management (continued) Resource Management (continued) Resource Management (continued) Resource Management (continued)'Resource management for A/D conversion'Resource management for A/D conversionPower ManagementPower ManagementPower Management with Arbiters$Resource & Power Management SummaryLow-level code and concurrencynesC support for concurrencyConcurrency exampleData Race DetectionData race fixedConcluding Remarks#Reflection Components vs Threads#Reflection Components vs ThreadsReflection Static Allocation%Reflection TinyOS Goals Revisited Reflection Status"Other OSes for Mote-class Devices+What we didnt see, Where to find out more Last Words Slide 92  Fonts UsedDesign TemplateEmbedded OLE Servers Slide Titles\ 8@ _PID_HLINKSA|!http://www.tinyos.net/dist-2.0.0!_= David GayDavid Gay  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  !!!!!!!!! ! ! ! ! !!!!!!!!!!!!!!!!!!! !!!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:!;!!?!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""" " " " " """"""""""""""""""" "!"""#"$"%"&"'"(")"*"+","-"."/"0"1"2"3"4"5"6"7"8"9":";"<"=">"?"@"A"B"C"D"E"F"G"H"I"J"K"L"M"N"O"P"Q"R"S"T"U"V"W"X"Y"Z"["\"]"^"_"`"a"b"c"d"e"f"g"h"i"j"k"l"m"n"o"p"q"r"s"t"u"v"w"x"y"z"{"|"}"~""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""######### # # # # ################### #!#"###$#%#&#'#(#)#*#+#,#-#.#/#0#1#2#3#4#5#6#7#8#9#:#;#<#=#>#?#@#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#[#\#]#^#_#`#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y#z#{#|#}#~##################################################################################################################################$$$$$$$$$ $ $ $ $ $$$$$$$$$$$$$$$$$$ $!$"$#$$$%$&$'$($)$*$+$,$-$.$/$0$1$2$3$4$5$6$7$8$9$;$<$=$>$?$@$A$C$D$E$F$G$H$I$$Root EntrydO)PicturesgE Current UserB$SummaryInformation($TPowerPoint Document(#=DocumentSummaryInformation8:$tinyos-2.1.2+dfsg/apps/BaseStation/000077500000000000000000000000001207233610700171405ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/BaseStation/BaseStationC.nc000066400000000000000000000100551207233610700220020ustar00rootroot00000000000000// $Id: BaseStationC.nc,v 1.7 2010-06-29 22:07:13 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The TinyOS 2.x base station that forwards packets between the UART * and radio.It replaces the GenericBase of TinyOS 1.0 and the * TOSBase of TinyOS 1.1. * *

On the serial link, BaseStation sends and receives simple active * messages (not particular radio packets): on the radio link, it * sends radio active messages, whose format depends on the network * stack being used. BaseStation will copy its compiled-in group ID to * messages moving from the serial link to the radio, and will filter * out incoming radio messages that do not contain that group ID.

* *

BaseStation includes queues in both directions, with a guarantee * that once a message enters a queue, it will eventually leave on the * other interface. The queues allow the BaseStation to handle load * spikes.

* *

BaseStation acknowledges a message arriving over the serial link * only if that message was successfully enqueued for delivery to the * radio link.

* *

The LEDS are programmed to toggle as follows:

*
    *
  • RED Toggle:: Message bridged from serial to radio
  • *
  • GREEN Toggle: Message bridged from radio to serial
  • *
  • YELLOW/BLUE Toggle: Dropped message due to queue overflow in either direction
  • *
* * @author Phil Buonadonna * @author Gilman Tolle * @author David Gay * @author Philip Levis * @date August 10 2005 */ configuration BaseStationC { } implementation { components MainC, BaseStationP, LedsC; components ActiveMessageC as Radio, SerialActiveMessageC as Serial; MainC.Boot <- BaseStationP; BaseStationP.RadioControl -> Radio; BaseStationP.SerialControl -> Serial; BaseStationP.UartSend -> Serial; BaseStationP.UartReceive -> Serial.Receive; BaseStationP.UartPacket -> Serial; BaseStationP.UartAMPacket -> Serial; BaseStationP.RadioSend -> Radio; BaseStationP.RadioReceive -> Radio.Receive; BaseStationP.RadioSnoop -> Radio.Snoop; BaseStationP.RadioPacket -> Radio; BaseStationP.RadioAMPacket -> Radio; BaseStationP.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/BaseStation/BaseStationP.nc000066400000000000000000000176331207233610700220300ustar00rootroot00000000000000// $Id: BaseStationP.nc,v 1.12 2010-06-29 22:07:14 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * @author Phil Buonadonna * @author Gilman Tolle * @author David Gay * Revision: $Id: BaseStationP.nc,v 1.12 2010-06-29 22:07:14 scipio Exp $ */ /* * BaseStationP bridges packets between a serial channel and the radio. * Messages moving from serial to radio will be tagged with the group * ID compiled into the BaseStation, and messages moving from radio to * serial will be filtered by that same group id. */ #include "AM.h" #include "Serial.h" module BaseStationP @safe() { uses { interface Boot; interface SplitControl as SerialControl; interface SplitControl as RadioControl; interface AMSend as UartSend[am_id_t id]; interface Receive as UartReceive[am_id_t id]; interface Packet as UartPacket; interface AMPacket as UartAMPacket; interface AMSend as RadioSend[am_id_t id]; interface Receive as RadioReceive[am_id_t id]; interface Receive as RadioSnoop[am_id_t id]; interface Packet as RadioPacket; interface AMPacket as RadioAMPacket; interface Leds; } } implementation { enum { UART_QUEUE_LEN = 12, RADIO_QUEUE_LEN = 12, }; message_t uartQueueBufs[UART_QUEUE_LEN]; message_t * ONE_NOK uartQueue[UART_QUEUE_LEN]; uint8_t uartIn, uartOut; bool uartBusy, uartFull; message_t radioQueueBufs[RADIO_QUEUE_LEN]; message_t * ONE_NOK radioQueue[RADIO_QUEUE_LEN]; uint8_t radioIn, radioOut; bool radioBusy, radioFull; task void uartSendTask(); task void radioSendTask(); void dropBlink() { call Leds.led2Toggle(); } void failBlink() { call Leds.led2Toggle(); } event void Boot.booted() { uint8_t i; for (i = 0; i < UART_QUEUE_LEN; i++) uartQueue[i] = &uartQueueBufs[i]; uartIn = uartOut = 0; uartBusy = FALSE; uartFull = TRUE; for (i = 0; i < RADIO_QUEUE_LEN; i++) radioQueue[i] = &radioQueueBufs[i]; radioIn = radioOut = 0; radioBusy = FALSE; radioFull = TRUE; if (call RadioControl.start() == EALREADY) radioFull = FALSE; if (call SerialControl.start() == EALREADY) uartFull = FALSE; } event void RadioControl.startDone(error_t error) { if (error == SUCCESS) { radioFull = FALSE; } } event void SerialControl.startDone(error_t error) { if (error == SUCCESS) { uartFull = FALSE; } } event void SerialControl.stopDone(error_t error) {} event void RadioControl.stopDone(error_t error) {} uint8_t count = 0; message_t* ONE receive(message_t* ONE msg, void* payload, uint8_t len); event message_t *RadioSnoop.receive[am_id_t id](message_t *msg, void *payload, uint8_t len) { return receive(msg, payload, len); } event message_t *RadioReceive.receive[am_id_t id](message_t *msg, void *payload, uint8_t len) { return receive(msg, payload, len); } message_t* receive(message_t *msg, void *payload, uint8_t len) { message_t *ret = msg; atomic { if (!uartFull) { ret = uartQueue[uartIn]; uartQueue[uartIn] = msg; uartIn = (uartIn + 1) % UART_QUEUE_LEN; if (uartIn == uartOut) uartFull = TRUE; if (!uartBusy) { post uartSendTask(); uartBusy = TRUE; } } else dropBlink(); } return ret; } uint8_t tmpLen; task void uartSendTask() { uint8_t len; am_id_t id; am_addr_t addr, src; message_t* msg; am_group_t grp; atomic if (uartIn == uartOut && !uartFull) { uartBusy = FALSE; return; } msg = uartQueue[uartOut]; tmpLen = len = call RadioPacket.payloadLength(msg); id = call RadioAMPacket.type(msg); addr = call RadioAMPacket.destination(msg); src = call RadioAMPacket.source(msg); grp = call RadioAMPacket.group(msg); call UartPacket.clear(msg); call UartAMPacket.setSource(msg, src); call UartAMPacket.setGroup(msg, grp); if (call UartSend.send[id](addr, uartQueue[uartOut], len) == SUCCESS) call Leds.led1Toggle(); else { failBlink(); post uartSendTask(); } } event void UartSend.sendDone[am_id_t id](message_t* msg, error_t error) { if (error != SUCCESS) failBlink(); else atomic if (msg == uartQueue[uartOut]) { if (++uartOut >= UART_QUEUE_LEN) uartOut = 0; if (uartFull) uartFull = FALSE; } post uartSendTask(); } event message_t *UartReceive.receive[am_id_t id](message_t *msg, void *payload, uint8_t len) { message_t *ret = msg; bool reflectToken = FALSE; atomic if (!radioFull) { reflectToken = TRUE; ret = radioQueue[radioIn]; radioQueue[radioIn] = msg; if (++radioIn >= RADIO_QUEUE_LEN) radioIn = 0; if (radioIn == radioOut) radioFull = TRUE; if (!radioBusy) { post radioSendTask(); radioBusy = TRUE; } } else dropBlink(); if (reflectToken) { //call UartTokenReceive.ReflectToken(Token); } return ret; } task void radioSendTask() { uint8_t len; am_id_t id; am_addr_t addr,source; message_t* msg; atomic if (radioIn == radioOut && !radioFull) { radioBusy = FALSE; return; } msg = radioQueue[radioOut]; len = call UartPacket.payloadLength(msg); addr = call UartAMPacket.destination(msg); source = call UartAMPacket.source(msg); id = call UartAMPacket.type(msg); call RadioPacket.clear(msg); call RadioAMPacket.setSource(msg, source); if (call RadioSend.send[id](addr, msg, len) == SUCCESS) call Leds.led0Toggle(); else { failBlink(); post radioSendTask(); } } event void RadioSend.sendDone[am_id_t id](message_t* msg, error_t error) { if (error != SUCCESS) failBlink(); else atomic if (msg == radioQueue[radioOut]) { if (++radioOut >= RADIO_QUEUE_LEN) radioOut = 0; if (radioFull) radioFull = FALSE; } post radioSendTask(); } } tinyos-2.1.2+dfsg/apps/BaseStation/Makefile000066400000000000000000000002331207233610700205760ustar00rootroot00000000000000COMPONENT=BaseStationC CFLAGS += -DCC2420_NO_ACKNOWLEDGEMENTS CFLAGS += -DCC2420_NO_ADDRESS_RECOGNITION CFLAGS += -DTASKLET_IS_TASK include $(MAKERULES) tinyos-2.1.2+dfsg/apps/BaseStation/README.txt000066400000000000000000000041771207233610700206470ustar00rootroot00000000000000README for BaseStation Author/Contact: tinyos-help@millennium.berkeley.edu Description: BaseStation is an application that acts as a simple Active Message bridge between the serial and radio links. It replaces the GenericBase of TinyOS 1.0 and the TOSBase of TinyOS 1.1. On the serial link, BaseStation sends and receives simple active messages (not particular radio packets): on the radio link, it sends radio active messages, whose format depends on the network stack being used. BaseStation will copy its compiled-in group ID to messages moving from the serial link to the radio, and will filter out incoming radio messages that do not contain that group ID. BaseStation includes queues in both directions, with a guarantee that once a message enters a queue, it will eventually leave on the other interface. The queues allow the BaseStation to handle load spikes more gracefully. BaseStation acknowledges a message arriving over the serial link only if that message was successfully enqueued for delivery to the radio link. The LEDS are programmed to toggle as follows: RED Toggle - Message bridged from serial to radio GREEN Toggle - Message bridged from radio to serial YELLOW/BLUE Toggle - Dropped message due to queue overflow in either direction When using a CC2420 radio, several default preprocessor configurations are defined in the Makefile: * CC2420_NO_ACKNOWLEDGEMENTS - Prevents the base station from falsly acknowledging packets * CC2420_NO_ADDRESS_RECOGNITION - Allows the base station to sniff packets from any transmitter Other combinations can be defined to meet your application's needs: * CC2420_NO_ADDRESS_RECOGNITION only - Sniff all packets, but acknowledge packets only if they are sent to the base station's address * Removing all preprocessor definitions in the Makefile - Only accept packets destined for the base station's address, and acknowledge those packets Tools: support/sdk/java/net/tinyos/sf/SerialForwarder See the TinyOS Tutorial on Mote-PC serial communication and SerialForwarder on docs.tinyos.net for more details. Known bugs/limitations: tinyos-2.1.2+dfsg/apps/BaseStation15.4/000077500000000000000000000000001207233610700174505ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/BaseStation15.4/BaseStationC.nc000066400000000000000000000076301207233610700223170ustar00rootroot00000000000000// $Id: BaseStationC.nc,v 1.2 2010-06-29 22:07:14 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The TinyOS 2.x base station that forwards packets between the UART * and radio.It replaces the GenericBase of TinyOS 1.0 and the * TOSBase of TinyOS 1.1. * *

On the serial link, BaseStation sends and receives simple active * messages (not particular radio packets): on the radio link, it * sends radio active messages, whose format depends on the network * stack being used. BaseStation will copy its compiled-in group ID to * messages moving from the serial link to the radio, and will filter * out incoming radio messages that do not contain that group ID.

* *

BaseStation includes queues in both directions, with a guarantee * that once a message enters a queue, it will eventually leave on the * other interface. The queues allow the BaseStation to handle load * spikes.

* *

BaseStation acknowledges a message arriving over the serial link * only if that message was successfully enqueued for delivery to the * radio link.

* *

The LEDS are programmed to toggle as follows:

*
    *
  • RED Toggle:: Message bridged from serial to radio
  • *
  • GREEN Toggle: Message bridged from radio to serial
  • *
  • YELLOW/BLUE Toggle: Dropped message due to queue overflow in either direction
  • *
* * @author Phil Buonadonna * @author Gilman Tolle * @author David Gay * @author Philip Levis * @date August 10 2005 */ configuration BaseStationC { } implementation { components MainC, BaseStationP, LedsC; components ActiveMessageC as Radio; components Serial802_15_4C as Serial; MainC.Boot <- BaseStationP; BaseStationP.RadioControl -> Radio; BaseStationP.SerialControl -> Serial; BaseStationP.UartSend -> Serial; BaseStationP.RadioReceive -> Radio.Receive; BaseStationP.RadioSnoop -> Radio.Snoop; BaseStationP.RadioPacket -> Radio; BaseStationP.RadioAMPacket -> Radio; BaseStationP.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/BaseStation15.4/BaseStationP.nc000066400000000000000000000124711207233610700223330ustar00rootroot00000000000000// $Id: BaseStationP.nc,v 1.2 2010-06-29 22:07:14 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * @author Phil Buonadonna * @author Gilman Tolle * @author David Gay * Revision: $Id: BaseStationP.nc,v 1.2 2010-06-29 22:07:14 scipio Exp $ */ /* * BaseStationP bridges packets between a serial channel and the radio. * Messages moving from serial to radio will be tagged with the group * ID compiled into the TOSBase, and messages moving from radio to * serial will be filtered by that same group id. */ #include "AM.h" #include "Serial.h" module BaseStationP { uses { interface Boot; interface SplitControl as SerialControl; interface SplitControl as RadioControl; interface Send as UartSend; interface Receive as RadioReceive[am_id_t id]; interface Receive as RadioSnoop[am_id_t id]; interface Packet as RadioPacket; interface AMPacket as RadioAMPacket; interface Leds; } } implementation { enum { UART_QUEUE_LEN = 12, RADIO_QUEUE_LEN = 12, }; message_t uartQueueBufs[UART_QUEUE_LEN]; message_t * ONE_NOK uartQueue[UART_QUEUE_LEN]; uint8_t uartIn, uartOut; bool uartBusy, uartFull; task void uartSendTask(); void dropBlink() { call Leds.led2Toggle(); } void failBlink() { call Leds.led2Toggle(); } event void Boot.booted() { uint8_t i; for (i = 0; i < UART_QUEUE_LEN; i++) uartQueue[i] = &uartQueueBufs[i]; uartIn = uartOut = 0; uartBusy = FALSE; uartFull = TRUE; call RadioControl.start(); call SerialControl.start(); } event void RadioControl.startDone(error_t error) { } event void SerialControl.startDone(error_t error) { if (error == SUCCESS) { uartFull = FALSE; } } event void SerialControl.stopDone(error_t error) {} event void RadioControl.stopDone(error_t error) {} uint8_t count = 0; message_t* ONE receive(message_t* ONE msg, void* payload, uint8_t len); event message_t *RadioSnoop.receive[am_id_t id](message_t *msg, void *payload, uint8_t len) { return receive(msg, payload, len); } event message_t *RadioReceive.receive[am_id_t id](message_t *msg, void *payload, uint8_t len) { return receive(msg, payload, len); } message_t* receive(message_t *msg, void *payload, uint8_t len) { message_t *ret = msg; atomic { if (!uartFull) { ret = uartQueue[uartIn]; uartQueue[uartIn] = msg; uartIn = (uartIn + 1) % UART_QUEUE_LEN; if (uartIn == uartOut) uartFull = TRUE; if (!uartBusy) { post uartSendTask(); uartBusy = TRUE; } } else dropBlink(); } return ret; } uint8_t tmpLen; task void uartSendTask() { uint8_t len; message_t* msg; atomic { if (uartIn == uartOut && !uartFull) { uartBusy = FALSE; return; } } msg = uartQueue[uartOut]; tmpLen = len = call RadioPacket.payloadLength(msg); if (call UartSend.send(uartQueue[uartOut], len) == SUCCESS) { call Leds.led1Toggle(); } else { failBlink(); post uartSendTask(); } } event void UartSend.sendDone(message_t* msg, error_t error) { if (error != SUCCESS) failBlink(); else atomic if (msg == uartQueue[uartOut]) { if (++uartOut >= UART_QUEUE_LEN) uartOut = 0; if (uartFull) uartFull = FALSE; } post uartSendTask(); } } tinyos-2.1.2+dfsg/apps/BaseStation15.4/Makefile000066400000000000000000000006641207233610700211160ustar00rootroot00000000000000COMPONENT=BaseStationC CFLAGS += -DCC2420_NO_ACKNOWLEDGEMENTS CFLAGS += -DCC2420_NO_ADDRESS_RECOGNITION BUILD_EXTRA_DEPS += seriallisten15-4 CLEAN_EXTRA = seriallisten15-4.o seriallisten15-4 seriallisten15-4: seriallisten15-4.o gcc -o $@ $< $(TOSDIR)/../support/sdk/c/sf/libmote.a seriallisten15-4.o: seriallisten15-4.c gcc -c -o $@ -I$(TOSDIR)/../support/sdk/c/sf -I$(TOSDIR)/lib/serial -I$(TOSDIR)/types $< include $(MAKERULES) tinyos-2.1.2+dfsg/apps/BaseStation15.4/seriallisten15-4.c000066400000000000000000000105041207233610700226210ustar00rootroot00000000000000#include #include #include #include "serialsource.h" static char *msgs[] = { "unknown_packet_type", "ack_timeout" , "sync" , "too_long" , "too_short" , "bad_sync" , "bad_crc" , "closed" , "no_memory" , "unix_error" }; void stderr_msg(serial_source_msg problem) { fprintf(stderr, "Note: %s\n", msgs[problem]); } enum { TOS_SERIAL_802_15_4_ID = 2, }; int main(int argc, char **argv) { serial_source src; int iframes = 0; if (argc != 4) { fprintf(stderr, "Usage: %s - dump packets from a serial port\n", argv[0]); exit(2); } if (strncmp(argv[1], "tframe", strlen("tframe")) == 0) { iframes = 0; } else if (strncmp(argv[1], "iframe", strlen("iframe")) == 0) { iframes = 1; } else { fprintf(stderr, "Usage: %s - dump packets from a serial port\n", argv[0]); exit(3); } src = open_serial_source(argv[2], platform_baud_rate(argv[3]), 0, stderr_msg); if (!src) { fprintf(stderr, "Couldn't open serial port at %s:%s\n", argv[2], argv[3]); exit(1); } for (;;) { int len, i, plen; short fcf; const unsigned char *packet = read_serial_packet(src, &len); int intraPan = 0; if (!packet) exit(0); else if (packet[0] != TOS_SERIAL_802_15_4_ID) { printf("bad packet (serial type is %02x, not %02x)\n", packet[0], TOS_SERIAL_802_15_4_ID); } plen = packet[1]; printf("Received packet of length %i: \n", plen); if (plen != len) { printf("Packet format error: read packet length (%hhx) is different than expected from frame (%hhx).\n", plen, len); } i = 2; // Read in FCF and i+=2 fcf = packet[i+1] << 8 | packet[i]; i += 2; { if ((fcf & 0x7) == 0x01) { printf(" Frame type: data\n"); } else if ((fcf & 0x7) == 0x02) { printf(" Frame type: acknowledgement\n"); } else { printf(" Frame type: other\n"); } printf(" Security: %s\n", (fcf & (1 << 3)) ? "enabled":"disabled"); printf(" Frame pending: %s\n", (fcf & (1 << 4)) ? "yes":"no"); printf(" Ack request: %s\n", (fcf & (1 << 5)) ? "yes":"no"); printf(" Intra-PAN: %s\n", (fcf & (1 << 6)) ? "yes":"no"); intraPan = (fcf & (1 << 6)); } { char seqno = packet[i++]; printf(" Sequence number: 0x%hhx\n", seqno); } { char addrLen = (fcf >> 10) & 0x3; short saddr = 0; long long laddr = 0; // 16- and 64-bit destinations have a PAN ID if (addrLen == 2 || addrLen == 3) { short destPan = packet[i++] << 8 | packet[i++]; printf(" Destination PAN: 0x%02hx\n", destPan); } switch (addrLen) { case 0: printf(" Destination address: none\n"); break; case 1: printf(" Destination address: invalid? (0x01)\n"); break; case 2: saddr = (packet[i] << 8 | packet[i+1]); i += 2; printf(" Destination address: 0x%04hx\n", saddr); break; case 3: { int j; for (j = 0; j < 8; j++) { laddr = laddr << 8; laddr |= packet[i++]; } printf(" Destination address: 0x%016llx\n", laddr); break; } default: printf(" Destination address: parse serror\n"); } } { char addrLen = (fcf >> 14) & 0x3; short saddr = 0; long long laddr = 0; if (!intraPan) { // Intra-PAN packet short srcPan = packet[i] << 8 | packet[i+1]; i += 2; printf(" Source PAN: 0x%02hx\n", srcPan); } switch (addrLen) { case 0: printf(" Source address: none\n"); break; case 1: printf(" Source address: invalid? (0x01)\n"); break; case 2: saddr = (packet[i] << 8 | packet[i + 1]); i += 2; printf(" Source address: 0x%04hx\n", saddr); break; case 3: { int j; for (j = 0; j < 8; j++) { laddr = laddr << 8; laddr |= packet[i++]; } printf(" Source address: 0x%016llx\n", laddr); break; } default: printf(" Source address: parse serror\n"); } } if (iframes) { printf(" I-Frame: %s\n", (packet[i++] == 0x3f)? "yes":"no"); } printf(" AM type: 0x%02hhx\n", packet[i++]); if (i >= plen) { printf("Packet format error: read packet is shorter than expected.\n"); } else { printf(" Payload: "); for (; i < plen; i++) { printf("0x%02hhx ", packet[i]); } printf("\n\n"); putchar('\n'); } free((void *)packet); } } tinyos-2.1.2+dfsg/apps/Blink/000077500000000000000000000000001207233610700157635ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/Blink/BlinkAppC.nc000066400000000000000000000051321207233610700201110ustar00rootroot00000000000000// $Id: BlinkAppC.nc,v 1.6 2010-06-29 22:07:14 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Blink is a basic application that toggles a mote's LED periodically. * It does so by starting a Timer that fires every second. It uses the * OSKI TimerMilli service to achieve this goal. * * @author tinyos-help@millennium.berkeley.edu **/ configuration BlinkAppC { } implementation { components MainC, BlinkC, LedsC; components new TimerMilliC() as Timer0; components new TimerMilliC() as Timer1; components new TimerMilliC() as Timer2; BlinkC -> MainC.Boot; BlinkC.Timer0 -> Timer0; BlinkC.Timer1 -> Timer1; BlinkC.Timer2 -> Timer2; BlinkC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/Blink/BlinkC.nc000066400000000000000000000055541207233610700174600ustar00rootroot00000000000000// $Id: BlinkC.nc,v 1.6 2010-06-29 22:07:16 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implementation for Blink application. Toggle the red LED when a * Timer fires. **/ #include "Timer.h" module BlinkC @safe() { uses interface Timer as Timer0; uses interface Timer as Timer1; uses interface Timer as Timer2; uses interface Leds; uses interface Boot; } implementation { event void Boot.booted() { call Timer0.startPeriodic( 250 ); call Timer1.startPeriodic( 500 ); call Timer2.startPeriodic( 1000 ); } event void Timer0.fired() { dbg("BlinkC", "Timer 0 fired @ %s.\n", sim_time_string()); call Leds.led0Toggle(); } event void Timer1.fired() { dbg("BlinkC", "Timer 1 fired @ %s \n", sim_time_string()); call Leds.led1Toggle(); } event void Timer2.fired() { dbg("BlinkC", "Timer 2 fired @ %s.\n", sim_time_string()); call Leds.led2Toggle(); } } tinyos-2.1.2+dfsg/apps/Blink/Makefile000066400000000000000000000000521207233610700174200ustar00rootroot00000000000000COMPONENT=BlinkAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/Blink/README.txt000066400000000000000000000012461207233610700174640ustar00rootroot00000000000000README for Blink Author/Contact: tinyos-help@millennium.berkeley.edu Description: Blink is a simple application that blinks the 3 mote LEDs. It tests that the boot sequence and millisecond timers are working properly. The three LEDs blink at 1Hz, 2Hz, and 4Hz. Because each is driven by an independent timer, visual inspection can determine whether there are bugs in the timer system that are causing drift. Note that this method is different than RadioCountToLeds, which fires a single timer at a steady rate and uses the bottom three bits of a counter to display on the LEDs. Tools: Known bugs/limitations: None. $Id: README.txt,v 1.4 2006-12-12 18:22:48 vlahan Exp $ tinyos-2.1.2+dfsg/apps/CoapBlip/000077500000000000000000000000001207233610700164155ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/CoapBlip/CoapBlipC.nc000066400000000000000000000140731207233610700205400ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "StorageVolumes.h" #include #include "tinyos_coap_resources.h" configuration CoapBlipC { } implementation { components MainC; #ifdef SIM components BaseStationC; #endif components LedsC; components CoapBlipP; components LibCoapAdapterC; components IPStackC; CoapBlipP.Boot -> MainC; CoapBlipP.Leds -> LedsC; CoapBlipP.RadioControl -> IPStackC; CoapBlipP.Init <- MainC.SoftwareInit; #ifdef RPL_ROUTING components RPLRoutingC; #endif #ifdef COAP_SERVER_ENABLED components CoapUdpServerC; components new UdpSocketC() as UdpServerSocket; CoapBlipP.CoAPServer -> CoapUdpServerC; CoapUdpServerC.LibCoapServer -> LibCoapAdapterC.LibCoapServer; CoapUdpServerC.Init <- MainC.SoftwareInit; LibCoapAdapterC.UDPServer -> UdpServerSocket; #if defined (COAP_RESOURCE_TEMP) || defined (COAP_RESOURCE_HUM) || defined (COAP_RESOURCE_ALL) components new SensirionSht11C() as HumTempSensor; #endif #ifdef COAP_RESOURCE_TEMP components new CoapReadResourceC(uint16_t, KEY_TEMP) as CoapReadTempResource; components new CoapBufferTempTranslateC() as CoapBufferTempTranslate; CoapReadTempResource.Read -> CoapBufferTempTranslate.ReadTemp; CoapBufferTempTranslate.Read -> HumTempSensor.Temperature; CoapUdpServerC.ReadResource[KEY_TEMP] -> CoapReadTempResource.ReadResource; #endif #ifdef COAP_RESOURCE_HUM components new CoapReadResourceC(uint16_t, KEY_HUM) as CoapReadHumResource; components new CoapBufferHumTranslateC() as CoapBufferHumTranslate; CoapReadHumResource.Read -> CoapBufferHumTranslate.ReadHum; CoapBufferHumTranslate.Read -> HumTempSensor.Humidity; CoapUdpServerC.ReadResource[KEY_HUM] -> CoapReadHumResource.ReadResource; #endif #if defined (COAP_RESOURCE_VOLT) || defined (COAP_RESOURCE_ALL) components new VoltageC() as VoltSensor; #endif #ifdef COAP_RESOURCE_VOLT components new CoapReadResourceC(uint16_t, KEY_VOLT) as CoapReadVoltResource; components new CoapBufferVoltTranslateC() as CoapBufferVoltTranslate; CoapReadVoltResource.Read -> CoapBufferVoltTranslate.ReadVolt; CoapBufferVoltTranslate.Read -> VoltSensor.Read; CoapUdpServerC.ReadResource[KEY_VOLT] -> CoapReadVoltResource.ReadResource; #endif #ifdef COAP_RESOURCE_LED components new CoapLedResourceC(KEY_LED) as CoapLedResource; CoapLedResource.Leds -> LedsC; CoapUdpServerC.ReadResource[KEY_LED] -> CoapLedResource.ReadResource; CoapUdpServerC.WriteResource[KEY_LED] -> CoapLedResource.WriteResource; #endif #ifdef COAP_RESOURCE_ALL components new CoapReadResourceC(val_all_t, KEY_ALL) as CoapReadAllResource; components new SensirionSht11C() as HumTempSensorAll; components CoapResourceCollectorC; CoapReadAllResource.Read -> CoapResourceCollectorC.ReadAll; components new CoapBufferTempTranslateC() as CoapBufferTempTranslateAll; CoapResourceCollectorC.ReadTemp -> CoapBufferTempTranslateAll.ReadTemp; CoapBufferTempTranslateAll.Read -> HumTempSensorAll.Temperature; components new CoapBufferHumTranslateC() as CoapBufferHumTranslateAll; CoapResourceCollectorC.ReadHum -> CoapBufferHumTranslateAll.ReadHum; CoapBufferHumTranslateAll.Read -> HumTempSensorAll.Humidity; components new CoapBufferVoltTranslateC() as CoapBufferVoltTranslateAll; CoapResourceCollectorC.ReadVolt -> CoapBufferVoltTranslateAll.ReadVolt; CoapBufferVoltTranslateAll.Read -> VoltSensor.Read; CoapUdpServerC.ReadResource[KEY_ALL] -> CoapReadAllResource.ReadResource; #endif #ifdef COAP_RESOURCE_KEY components new CoapFlashResourceC(KEY_KEY) as CoapFlashResource; components new ConfigStorageC(VOLUME_CONFIGKEY); CoapFlashResource.ConfigStorage -> ConfigStorageC.ConfigStorage; CoapBlipP.Mount -> ConfigStorageC.Mount; CoapUdpServerC.ReadResource[KEY_KEY] -> CoapFlashResource.ReadResource; CoapUdpServerC.WriteResource[KEY_KEY] -> CoapFlashResource.WriteResource; #endif #ifdef COAP_RESOURCE_ROUTE components new CoapRouteResourceC(uint16_t, KEY_ROUTE) as CoapReadRouteResource; CoapReadRouteResource.ForwardingTable -> IPStackC; CoapUdpServerC.ReadResource[KEY_ROUTE] -> CoapReadRouteResource.ReadResource; #endif #endif #ifdef COAP_CLIENT_ENABLED components CoapUdpClientC; components new UdpSocketC() as UdpClientSocket; CoapBlipP.CoAPClient -> CoapUdpClientC; CoapUdpClientC.LibCoapClient -> LibCoapAdapterC.LibCoapClient; CoapUdpClientC.Init <- MainC.SoftwareInit; LibCoapAdapterC.UDPClient -> UdpClientSocket; CoapBlipP.ForwardingTableEvents -> IPStackC.ForwardingTableEvents; #endif #ifdef PRINTFUART_ENABLED components PrintfC; components SerialStartC; #endif } tinyos-2.1.2+dfsg/apps/CoapBlip/CoapBlipP.nc000066400000000000000000000101131207233610700205440ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "blip_printf.h" #ifdef COAP_CLIENT_ENABLED #include "tinyos_net.h" #endif module CoapBlipP { uses { interface Boot; interface SplitControl as RadioControl; interface Leds; #ifdef COAP_SERVER_ENABLED interface CoAPServer; #ifdef COAP_RESOURCE_KEY interface Mount; #endif #endif #ifdef COAP_CLIENT_ENABLED interface CoAPClient; interface ForwardingTableEvents; #endif } provides interface Init; } implementation { #ifdef COAP_CLIENT_ENABLED uint8_t node_integrate_done = FALSE; #endif command error_t Init.init() { return SUCCESS; } event void Boot.booted() { #ifdef COAP_SERVER_ENABLED uint8_t i; #endif call RadioControl.start(); printf("booted %i start\n", TOS_NODE_ID); #ifdef COAP_SERVER_ENABLED #ifdef COAP_RESOURCE_KEY if (call Mount.mount() == SUCCESS) { printf("CoapBlipP.Mount successful\n"); } #endif // needs to be before registerResource to setup context: call CoAPServer.bind(COAP_SERVER_PORT); call CoAPServer.registerWellknownCore(); for (i=0; i < NUM_URIS; i++) { call CoAPServer.registerResource(uri_key_map[i].uri, uri_key_map[i].urilen - 1, uri_key_map[i].mediatype, uri_key_map[i].writable, uri_key_map[i].splitphase, uri_key_map[i].immediately); } #endif } #if defined (COAP_SERVER_ENABLED) && defined (COAP_RESOURCE_KEY) event void Mount.mountDone(error_t error) { } #endif event void RadioControl.startDone(error_t e) { printf("radio startDone: %i\n", TOS_NODE_ID); } event void RadioControl.stopDone(error_t e) { } #ifdef COAP_CLIENT_ENABLED event void ForwardingTableEvents.defaultRouteAdded() { struct sockaddr_in6 sa6; coap_list_t *optlist = NULL; if (node_integrate_done == FALSE) { node_integrate_done = TRUE; inet_pton6(COAP_CLIENT_DEST, &sa6.sin6_addr); sa6.sin6_port = htons(COAP_CLIENT_PORT); coap_insert( &optlist, new_option_node(COAP_OPTION_URI_PATH, sizeof("ni") - 1, "ni"), order_opts); call CoAPClient.request(&sa6, COAP_REQUEST_PUT, optlist, 0, NULL); } } event void ForwardingTableEvents.defaultRouteRemoved() { } event error_t CoAPClient.streamed_next_block (uint16_t blockno, uint16_t *len, void **data) { return FAIL; } event void CoAPClient.request_done(uint8_t code, uint8_t mediatype, uint16_t len, void *data, bool more) { //TODO: handle the request_done }; #endif } tinyos-2.1.2+dfsg/apps/CoapBlip/Makefile000066400000000000000000000043771207233610700200700ustar00rootroot00000000000000COMPONENT=CoapBlipC # uncomment this for network programming support # BOOTLOADER=tosboot #CFLAGS += -DCC2420_DEF_CHANNEL=21 #CFLAGS += -DRF230_DEF_CHANNEL=16 #CFLAGS += -DCC2420_DEF_RFPOWER=4 # Enable Low Power Listening #CFLAGS += -DLOW_POWER_LISTENING #CFLAGS += -DLPL_SLEEP_INTERVAL=512 # disables support for the AM stack, which somewhat reduces code size # and compresses packet formats. If you want to use other tinyos # protocols which are AM-based, you should not include this. #CFLAGS += -DIEEE154FRAMES_ENABLED # lib6lowpan contains inet_ntop6 and inet_pton6 to process ascii # representations of IPv6 addresses. You can remove them to save some # code if you don't use them # CFLAGS += -DNO_LIB6LOWPAN_ASCII # you can compile with or without a routing protocol... of course, # without it, you will only be able to use link-local communication. PFLAGS += -DRPL_ROUTING -DRPL_STORING_MODE -I$(LOWPAN_ROOT)/tos/lib/net/rpl #PFLAGS += -DRPL_OF_MRHOF -DRPL_ROOT_ADDR=1 # if you set this, the stack won't use dhcp to assign addresses -- it # will use this prefix combined with TOS_NODE_ID PFLAGS += -DIN6_PREFIX=\"fec0::\" # printf debugs. works only on telosb/tmote sky. # CFLAGS += -DNEW_PRINTF_SEMANTICS -DPRINTFUART_ENABLED # uncomment this line if you are having problems displaying the new printf semantics # CFLAGS += -DPRINTF_BUFFER_SIZE=1024 ################ CoAP Server ############################### CFLAGS += -DCOAP_SERVER_ENABLED # port where server is listening CFLAGS += -DCOAP_SERVER_PORT=61616L #set max uri length CFLAGS += -DMAX_URI_LENGTH=5 # set available resources. # Don't forget to change CFLAG: NUM_URIS!!!!! CFLAGS += -DNUM_URIS=1 #CFLAGS += -DCOAP_RESOURCE_TEMP #CFLAGS += -DCOAP_RESOURCE_HUM #CFLAGS += -DCOAP_RESOURCE_VOLT #CFLAGS += -DCOAP_RESOURCE_ALL #TEMP + HUM + VOLT #CFLAGS += -DCOAP_RESOURCE_KEY CFLAGS += -DCOAP_RESOURCE_LED #CFLAGS += -DCOAP_RESOURCE_ROUTE # timeout in milliseconds for sending PreACK CFLAGS += -DCOAP_PREACK_TIMEOUT=500 #CFLAGS += -DINCLUDE_WELLKNOWN ################ CoAP Client ################################ #CFLAGS += -DCOAP_CLIENT_ENABLED # client destination port CFLAGS += -DCOAP_CLIENT_PORT=61617L # client IPv6 destination address CFLAGS += -DCOAP_CLIENT_DEST=\"fec0::100\" CFLAGS += -I. include $(MAKERULES) tinyos-2.1.2+dfsg/apps/CoapBlip/README000066400000000000000000000004361207233610700173000ustar00rootroot00000000000000A CoAP application based on the TinyOS blip stack and libcoap. Prepare libcoap: $ cd ../../support/sdk/c/coap $ autoconf $ ./configure $ make To build, use the 'blip' make target extra $ make blip coap ... See http://docs.tinyos.net/index.php/CoAP for further steps... tinyos-2.1.2+dfsg/apps/CoapBlip/tinyos_coap_resources.h000066400000000000000000000073421207233610700232150ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _COAP_TINYOS_COAP_RESOURCES_H_ #define _COAP_TINYOS_COAP_RESOURCES_H_ #include #define SENSOR_VALUE_INVALID 0xFFFE #define SENSOR_NOT_AVAILABLE 0xFFFF //uri properties for uri<->key conversion typedef struct key_uri { uint8_t key; char uri[MAX_URI_LENGTH]; uint8_t urilen; uint8_t mediatype; uint8_t writable:1; uint8_t splitphase:1; uint8_t immediately:1; } key_uri_t; //user defined resources enum { #if defined (COAP_RESOURCE_TEMP) || defined (COAP_RESOURCE_ALL) KEY_TEMP, #endif #if defined (COAP_RESOURCE_HUM) || defined (COAP_RESOURCE_ALL) KEY_HUM, #endif #if defined (COAP_RESOURCE_VOLT) || defined (COAP_RESOURCE_ALL) KEY_VOLT, #endif #ifdef COAP_RESOURCE_KEY KEY_KEY, #endif #ifdef COAP_RESOURCE_LED KEY_LED, #endif #ifdef COAP_RESOURCE_ALL KEY_ALL, #endif #ifdef COAP_RESOURCE_ROUTE KEY_ROUTE, #endif COAP_NO_SUCH_RESOURCE = 0xff }; typedef nx_struct val_all { nx_uint8_t id_t:4; nx_uint8_t length_t:4; nx_uint16_t temp; nx_uint8_t id_h:4; nx_uint8_t length_h:4; nx_uint16_t hum; nx_uint8_t id_v:4; nx_uint8_t length_v:4; nx_uint16_t volt; } val_all_t; typedef nx_struct config_t { nx_uint8_t version; nx_uint8_t EUI64[8]; nx_uint8_t KEY128[16]; } config_t; key_uri_t uri_key_map[NUM_URIS] = { #ifdef COAP_RESOURCE_TEMP { KEY_TEMP, "st", sizeof("st"), COAP_MEDIATYPE_APPLICATION_OCTET_STREAM, 0, 1, 0}, #endif #ifdef COAP_RESOURCE_HUM { KEY_HUM, "sh", sizeof("sh") , COAP_MEDIATYPE_APPLICATION_OCTET_STREAM, 0, 1, 0}, #endif #ifdef COAP_RESOURCE_VOLT { KEY_VOLT, "sv", sizeof("sv") , COAP_MEDIATYPE_APPLICATION_OCTET_STREAM, 0, 1, 0}, #endif #ifdef COAP_RESOURCE_KEY { KEY_KEY, "ck", sizeof("ck") , COAP_MEDIATYPE_APPLICATION_OCTET_STREAM, 1, 1, 0}, #endif #ifdef COAP_RESOURCE_LED { KEY_LED, "l", sizeof("l") , COAP_MEDIATYPE_APPLICATION_OCTET_STREAM, 1, 1, 1}, #endif #ifdef COAP_RESOURCE_ALL { KEY_ALL, "r", sizeof("r") , COAP_MEDIATYPE_APPLICATION_OCTET_STREAM, 0, 1, 0}, #endif #ifdef COAP_RESOURCE_ROUTE { KEY_ROUTE, "rt", sizeof("rt") , COAP_MEDIATYPE_APPLICATION_OCTET_STREAM, 0, 1, 0}, #endif }; #endif tinyos-2.1.2+dfsg/apps/CoapBlip/volumes-at45db.xml000066400000000000000000000002351207233610700217120ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/CoapBlip/volumes-stm25p.xml000066400000000000000000000002351207233610700217610ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/MViz/000077500000000000000000000000001207233610700156115ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/MViz/MViz.h000066400000000000000000000016751207233610700166600ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * @author David Gay * @author Kyle Jamieson * @author Phil Levis */ #ifndef MVIZ_H #define MVIZ_H #include "AM.h" enum { /* Default sampling period. */ DEFAULT_INTERVAL = 1024, AM_MVIZ_MSG = 0x93 }; typedef nx_struct mviz_msg { nx_uint16_t version; /* Version of the interval. */ nx_uint16_t interval; /* Samping period. */ nx_uint16_t origin; /* Mote id of sending mote. */ nx_uint16_t count; /* The readings are samples count * NREADINGS onwards */ nx_uint16_t reading; nx_uint16_t etx; nx_uint16_t link_route_value; nx_am_addr_t link_route_addr; } mviz_msg_t; #endif tinyos-2.1.2+dfsg/apps/MViz/MVizAppC.nc000066400000000000000000000033131207233610700175640ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * MViz demo application using the collection layer. * See README.txt file in this directory and TEP 119: Collection. * * @author David Gay * @author Kyle Jamieson * @author Philip Levis */ #include configuration MVizAppC { } implementation { components MainC, MVizC, LedsC, new TimerMilliC(), new MVizSensorC() as Sensor, RandomC; //MainC.SoftwareInit -> Sensor; MVizC.Boot -> MainC; MVizC.Timer -> TimerMilliC; MVizC.Read -> Sensor; MVizC.Leds -> LedsC; MVizC.Random -> RandomC; // // Communication components. These are documented in TEP 113: // Serial Communication, and TEP 119: Collection. // components CollectionC as Collector, // Collection layer ActiveMessageC, // AM layer new CollectionSenderC(AM_MVIZ_MSG), // Sends multihop RF SerialActiveMessageC, // Serial messaging new SerialAMSenderC(AM_MVIZ_MSG); // Sends to the serial port components CtpP as Ctp; MVizC.RadioControl -> ActiveMessageC; MVizC.SerialControl -> SerialActiveMessageC; MVizC.RoutingControl -> Collector; MVizC.Send -> CollectionSenderC; MVizC.SerialSend -> SerialAMSenderC.AMSend; MVizC.Snoop -> Collector.Snoop[AM_MVIZ_MSG]; MVizC.Receive -> Collector.Receive[AM_MVIZ_MSG]; MVizC.RootControl -> Collector; MVizC.CtpInfo -> Ctp; MVizC.LinkEstimator -> Ctp; } tinyos-2.1.2+dfsg/apps/MViz/MVizC.nc000066400000000000000000000144101207233610700171230ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * MViz demo application using the collection layer. * See README.txt file in this directory and TEP 119: Collection. * * @author David Gay * @author Kyle Jamieson * @author Philip Levis */ #include "MViz.h" module MVizC @safe(){ uses { // Interfaces for initialization: interface Boot; interface SplitControl as RadioControl; interface SplitControl as SerialControl; interface StdControl as RoutingControl; // Interfaces for communication, multihop and serial: interface Send; interface Receive as Snoop; interface Receive; interface AMSend as SerialSend; interface CollectionPacket; interface RootControl; // Miscalleny: interface Timer; interface Read; interface Leds; interface CtpInfo; interface LinkEstimator; interface Random; } } implementation { task void uartSendTask(); static void startTimer(); static void fatal_problem(); static void report_problem(); static void report_sent(); static void report_received(); uint8_t uartlen; message_t sendbuf; message_t uartbuf; bool sendbusy=FALSE, uartbusy=FALSE; /* Current local state - interval, version and accumulated readings */ mviz_msg_t local; uint8_t reading; /* 0 to NREADINGS */ /* When we head an Oscilloscope message, we check it's sample count. If it's ahead of ours, we "jump" forwards (set our count to the received count). However, we must then suppress our next count increment. This is a very simple form of "time" synchronization (for an abstract notion of time). */ bool suppress_count_change; // // On bootup, initialize radio and serial communications, and our // own state variables. // event void Boot.booted() { local.interval = DEFAULT_INTERVAL; local.origin = TOS_NODE_ID; // Beginning our initialization phases: if (call RadioControl.start() != SUCCESS) fatal_problem(); if (call RoutingControl.start() != SUCCESS) fatal_problem(); } event void RadioControl.startDone(error_t error) { if (error != SUCCESS) fatal_problem(); if (sizeof(local) > call Send.maxPayloadLength()) fatal_problem(); if (call SerialControl.start() != SUCCESS) fatal_problem(); } event void SerialControl.startDone(error_t error) { if (error != SUCCESS) fatal_problem(); // This is how to set yourself as a root to the collection layer: if (local.origin % 500 == 0) call RootControl.setRoot(); startTimer(); } static void startTimer() { call Timer.startPeriodic(local.interval); reading = 0; } event void RadioControl.stopDone(error_t error) { } event void SerialControl.stopDone(error_t error) { } // // Only the root will receive messages from this interface; its job // is to forward them to the serial uart for processing on the pc // connected to the sensor network. // event message_t* Receive.receive(message_t* msg, void *payload, uint8_t len) { if (uartbusy == FALSE) { mviz_msg_t* in = (mviz_msg_t*)payload; mviz_msg_t* out = (mviz_msg_t*)call SerialSend.getPayload(&uartbuf, sizeof(mviz_msg_t)); if (out == NULL) { return msg; } else { memcpy(out, in, sizeof(mviz_msg_t)); } uartbusy = TRUE; uartlen = sizeof(mviz_msg_t); post uartSendTask(); } return msg; } task void uartSendTask() { if (call SerialSend.send(0xffff, &uartbuf, uartlen) != SUCCESS) { uartbusy = FALSE; } } // // Overhearing other traffic in the network. // event message_t* Snoop.receive(message_t* msg, void* payload, uint8_t len) { mviz_msg_t *omsg = payload; report_received(); // If we receive a newer version, update our interval. if (omsg->version > local.version) { local.version = omsg->version; local.interval = omsg->interval; startTimer(); } // If we hear from a future count, jump ahead but suppress our own // change. if (omsg->count > local.count) { local.count = omsg->count; suppress_count_change = TRUE; } return msg; } /* At each sample period: - if local sample buffer is full, send accumulated samples - read next sample */ event void Timer.fired() { if (!sendbusy) { mviz_msg_t *o = (mviz_msg_t *)call Send.getPayload(&sendbuf, sizeof(mviz_msg_t)); if (o == NULL) { fatal_problem(); return; } memcpy(o, &local, sizeof(local)); if (call Send.send(&sendbuf, sizeof(local)) == SUCCESS) sendbusy = TRUE; else report_problem(); } reading = 0; /* Part 2 of cheap "time sync": increment our count if we didn't jump ahead. */ if (!suppress_count_change) local.count++; suppress_count_change = FALSE; call Timer.stop(); call Timer.startPeriodic(local.interval); if (call Read.read() != SUCCESS) fatal_problem(); } event void Send.sendDone(message_t* msg, error_t error) { if (error == SUCCESS) report_sent(); else report_problem(); sendbusy = FALSE; } event void Read.readDone(error_t result, uint16_t data) { uint16_t val; if (result != SUCCESS) { data = 0xffff; report_problem(); } local.reading = data; call CtpInfo.getEtx(&val); local.etx = val; call CtpInfo.getParent(&val); local.link_route_addr = val; local.link_route_value = call LinkEstimator.getLinkQuality(local.link_route_addr); } event void LinkEstimator.evicted(am_addr_t addr){} event void SerialSend.sendDone(message_t *msg, error_t error) { uartbusy = FALSE; } // Use LEDs to report various status issues. static void fatal_problem() { call Leds.led0On(); call Leds.led1On(); call Leds.led2On(); call Timer.stop(); } static void report_problem() { call Leds.led0Toggle(); } static void report_sent() { call Leds.led1Toggle(); } static void report_received() { call Leds.led2Toggle(); } } tinyos-2.1.2+dfsg/apps/MViz/MVizSensorC.nc000066400000000000000000000004001207233610700203070ustar00rootroot00000000000000/** * The default sensor for MViz is a simple sine wave. * * @author Philip Levis */ generic configuration MVizSensorC() { provides interface Read; } implementation { components new SineSensorC() as DemoChannel; Read = DemoChannel; } tinyos-2.1.2+dfsg/apps/MViz/Makefile000066400000000000000000000004541207233610700172540ustar00rootroot00000000000000COMPONENT=MVizAppC CFLAGS += -I$(TOSDIR)/lib/net/ -I$(TOSDIR)/lib/net/ctp -I$(TOSDIR)/lib/net/4bitle -I. BUILD_EXTRA_DEPS = MVizMsg.class MVizMsg.java: MViz.h mig -target=null -java-classname=MVizMsg java MViz.h mviz_msg -o $@ MVizMsg.class: MVizMsg.java javac MVizMsg.java include $(MAKERULES) tinyos-2.1.2+dfsg/apps/MViz/README.txt000066400000000000000000000030721207233610700173110ustar00rootroot00000000000000README for MViz Author/Contact: tinyos-help@millennium.berkeley.edu Description: MViz is a sample application for the MViz network visualization tool. The MViz application is a multihop collection network. Nodes whose (ID % 500) == 0 are collection roots. The application samples a platform's DemoSensorC and routes those values to the collection roots. The roots send the packets to the serial port, which the MViz java application then visualizes. To run this application, install the TinyOS application on several nodes, one of whom is a root. Then run the tos-mviz script with MVizMsg as a parameter: tos-mviz [-comm source] MVizMsg This will cause the MViz java tool to parse the fields of MVizMsg and make them displayable. As nodes send readings to the base station, they will be displayed in the GUI. By default, the TinyOS program uses an artificial demonstration sensor that just generates a sine wave (MVizSensorC). To change the sensor that the MViz application uses, change the wiring in MVizAppC to your sensor of choice. Tools: The Java application lives in support/sdk/java/net/tinyos/mviz. It is invoked by the tos-mviz script, which is part of a TinyOS tools distribution. The top-level Java class is net.tinyos.mviz.DDocument. To display a mote image, the tool looks for a mote.gif in either the local directory (default) or a directory specified with the -dir parameter. Known bugs/limitations: Under Ubuntu Linux, the MViz Java visualization can be painfully slow. Notes: MViz configures a mote whose TOS_NODE_ID modulo 500 is zero to be a collection root. tinyos-2.1.2+dfsg/apps/MViz/mote.gif000066400000000000000000000041351207233610700172470ustar00rootroot00000000000000GIF89a('!&).)*/$&*,/.52$./#-8313-'/5 =>(33:7<4$65'4: 98B9J>-4:A2+6AL;,:?);E&?=D;/:E%B:,>=#D63:A"C@/=B3=>2 SC0JH4IC$RHPC6SK=OO_N;QJ8TE+YNCMNAPK%^R*]LIOFASR5[QJSD2\W8ZVHUJ>XW=ZR2aK/aUFXKCYRJUVB[L*gTFYXmYQURQWM?_XUYJQ[Ks^;eUI_XN]W7jXDdUV[XHa_M_^:i^PaOObVS__f[KUbW5r_Hha\`WUd_Red`cRQha\c_\fVBqbfcVNmdRljXlZUldYkkXna_jk,hPrn^mgjj\dkglkXNzcL{i|hT\tmeqfctb[us`sronfmpbjs_kqgdtnhaXzvsnmjspEldxlxs`oekxmb{w_jzrlswhmxxZUtvszwixwom|vtzqj~}f~t~mYZrnv~zsex|}{j_s}gmtywois~|xzwyye|ā{ʿƷȿ!Created with The GIMP! ,(' H*I #&\HK&[Xa @Aq)8LŠ>@"B1x1C "~0‹&Ia`8|PRd "xEH- PK%J(*u`kPT(X ;TC!$2RNjJb4#LDQEd3p`&baHDBR~qH! }UXIX ~`EU,0` !Yub<6 2,7xW"\1c4P42qB,\AU!g .b %!POBH!Nq qLAb8ds0HrU"/E%H E& &x8ArmH@-a 6~# 4h`$A"X %,`b(@L@c7pG!K 1l<8" |#-J-D!X"&A 3" (`G b t A,~PQ±8ڣV<Ì$( (,X 1tDJmA 9~Y 6@}\0!1P#~"ܪJ! $A4" .tqD3T2! 1 o"`ARa{& : Sensor; MultihopOscilloscopeC.Boot -> MainC; MultihopOscilloscopeC.Timer -> TimerMilliC; MultihopOscilloscopeC.Read -> Sensor; MultihopOscilloscopeC.Leds -> LedsC; // // Communication components. These are documented in TEP 113: // Serial Communication, and TEP 119: Collection. // components CollectionC as Collector, // Collection layer ActiveMessageC, // AM layer new CollectionSenderC(AM_OSCILLOSCOPE), // Sends multihop RF SerialActiveMessageC, // Serial messaging new SerialAMSenderC(AM_OSCILLOSCOPE); // Sends to the serial port MultihopOscilloscopeC.RadioControl -> ActiveMessageC; MultihopOscilloscopeC.SerialControl -> SerialActiveMessageC; MultihopOscilloscopeC.RoutingControl -> Collector; MultihopOscilloscopeC.Send -> CollectionSenderC; MultihopOscilloscopeC.SerialSend -> SerialAMSenderC.AMSend; MultihopOscilloscopeC.Snoop -> Collector.Snoop[AM_OSCILLOSCOPE]; MultihopOscilloscopeC.Receive -> Collector.Receive[AM_OSCILLOSCOPE]; MultihopOscilloscopeC.RootControl -> Collector; components new PoolC(message_t, 10) as UARTMessagePoolP, new QueueC(message_t*, 10) as UARTQueueP; MultihopOscilloscopeC.UARTMessagePool -> UARTMessagePoolP; MultihopOscilloscopeC.UARTQueue -> UARTQueueP; components new PoolC(message_t, 20) as DebugMessagePool, new QueueC(message_t*, 20) as DebugSendQueue, new SerialAMSenderC(AM_CTP_DEBUG) as DebugSerialSender, UARTDebugSenderP as DebugSender; DebugSender.Boot -> MainC; DebugSender.UARTSend -> DebugSerialSender; DebugSender.MessagePool -> DebugMessagePool; DebugSender.SendQueue -> DebugSendQueue; Collector.CollectionDebug -> DebugSender; } tinyos-2.1.2+dfsg/apps/MultihopOscilloscope/MultihopOscilloscopeC.nc000066400000000000000000000170451207233610700257200ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * MultihopOscilloscope demo application using the collection layer. * See README.txt file in this directory and TEP 119: Collection. * * @author David Gay * @author Kyle Jamieson */ #include "Timer.h" #include "MultihopOscilloscope.h" module MultihopOscilloscopeC @safe(){ uses { // Interfaces for initialization: interface Boot; interface SplitControl as RadioControl; interface SplitControl as SerialControl; interface StdControl as RoutingControl; // Interfaces for communication, multihop and serial: interface Send; interface Receive as Snoop; interface Receive; interface AMSend as SerialSend; interface CollectionPacket; interface RootControl; interface Queue as UARTQueue; interface Pool as UARTMessagePool; // Miscalleny: interface Timer; interface Read; interface Leds; } } implementation { task void uartSendTask(); static void startTimer(); static void fatal_problem(); static void report_problem(); static void report_sent(); static void report_received(); uint8_t uartlen; message_t sendbuf; message_t uartbuf; bool sendbusy=FALSE, uartbusy=FALSE; /* Current local state - interval, version and accumulated readings */ oscilloscope_t local; uint8_t reading; /* 0 to NREADINGS */ /* When we head an Oscilloscope message, we check it's sample count. If it's ahead of ours, we "jump" forwards (set our count to the received count). However, we must then suppress our next count increment. This is a very simple form of "time" synchronization (for an abstract notion of time). */ bool suppress_count_change; // // On bootup, initialize radio and serial communications, and our // own state variables. // event void Boot.booted() { local.interval = DEFAULT_INTERVAL; local.id = TOS_NODE_ID; local.version = 0; // Beginning our initialization phases: if (call RadioControl.start() != SUCCESS) fatal_problem(); if (call RoutingControl.start() != SUCCESS) fatal_problem(); } event void RadioControl.startDone(error_t error) { if (error != SUCCESS) fatal_problem(); if (sizeof(local) > call Send.maxPayloadLength()) fatal_problem(); if (call SerialControl.start() != SUCCESS) fatal_problem(); } event void SerialControl.startDone(error_t error) { if (error != SUCCESS) fatal_problem(); // This is how to set yourself as a root to the collection layer: if (local.id % 500 == 0) call RootControl.setRoot(); startTimer(); } static void startTimer() { if (call Timer.isRunning()) call Timer.stop(); call Timer.startPeriodic(local.interval); reading = 0; } event void RadioControl.stopDone(error_t error) { } event void SerialControl.stopDone(error_t error) { } // // Only the root will receive messages from this interface; its job // is to forward them to the serial uart for processing on the pc // connected to the sensor network. // event message_t* Receive.receive(message_t* msg, void *payload, uint8_t len) { oscilloscope_t* in = (oscilloscope_t*)payload; oscilloscope_t* out; if (uartbusy == FALSE) { out = (oscilloscope_t*)call SerialSend.getPayload(&uartbuf, sizeof(oscilloscope_t)); if (len != sizeof(oscilloscope_t) || out == NULL) { return msg; } else { memcpy(out, in, sizeof(oscilloscope_t)); } uartlen = sizeof(oscilloscope_t); post uartSendTask(); } else { // The UART is busy; queue up messages and service them when the // UART becomes free. message_t *newmsg = call UARTMessagePool.get(); if (newmsg == NULL) { // drop the message on the floor if we run out of queue space. report_problem(); return msg; } //Serial port busy, so enqueue. out = (oscilloscope_t*)call SerialSend.getPayload(newmsg, sizeof(oscilloscope_t)); if (out == NULL) { return msg; } memcpy(out, in, sizeof(oscilloscope_t)); if (call UARTQueue.enqueue(newmsg) != SUCCESS) { // drop the message on the floor and hang if we run out of // queue space without running out of queue space first (this // should not occur). call UARTMessagePool.put(newmsg); fatal_problem(); return msg; } } return msg; } task void uartSendTask() { if (call SerialSend.send(0xffff, &uartbuf, uartlen) != SUCCESS) { report_problem(); } else { uartbusy = TRUE; } } event void SerialSend.sendDone(message_t *msg, error_t error) { uartbusy = FALSE; if (call UARTQueue.empty() == FALSE) { // We just finished a UART send, and the uart queue is // non-empty. Let's start a new one. message_t *queuemsg = call UARTQueue.dequeue(); if (queuemsg == NULL) { fatal_problem(); return; } memcpy(&uartbuf, queuemsg, sizeof(message_t)); if (call UARTMessagePool.put(queuemsg) != SUCCESS) { fatal_problem(); return; } post uartSendTask(); } } // // Overhearing other traffic in the network. // event message_t* Snoop.receive(message_t* msg, void* payload, uint8_t len) { oscilloscope_t *omsg = payload; report_received(); // If we receive a newer version, update our interval. if (omsg->version > local.version) { local.version = omsg->version; local.interval = omsg->interval; startTimer(); } // If we hear from a future count, jump ahead but suppress our own // change. if (omsg->count > local.count) { local.count = omsg->count; suppress_count_change = TRUE; } return msg; } /* At each sample period: - if local sample buffer is full, send accumulated samples - read next sample */ event void Timer.fired() { if (reading == NREADINGS) { if (!sendbusy) { oscilloscope_t *o = (oscilloscope_t *)call Send.getPayload(&sendbuf, sizeof(oscilloscope_t)); if (o == NULL) { fatal_problem(); return; } memcpy(o, &local, sizeof(local)); if (call Send.send(&sendbuf, sizeof(local)) == SUCCESS) sendbusy = TRUE; else report_problem(); } reading = 0; /* Part 2 of cheap "time sync": increment our count if we didn't jump ahead. */ if (!suppress_count_change) local.count++; suppress_count_change = FALSE; } if (call Read.read() != SUCCESS) fatal_problem(); } event void Send.sendDone(message_t* msg, error_t error) { if (error == SUCCESS) report_sent(); else report_problem(); sendbusy = FALSE; } event void Read.readDone(error_t result, uint16_t data) { if (result != SUCCESS) { data = 0xffff; report_problem(); } if (reading < NREADINGS) local.readings[reading++] = data; } // Use LEDs to report various status issues. static void fatal_problem() { call Leds.led0On(); call Leds.led1On(); call Leds.led2On(); call Timer.stop(); } static void report_problem() { call Leds.led0Toggle(); } static void report_sent() { call Leds.led1Toggle(); } static void report_received() { call Leds.led2Toggle(); } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscope/README.txt000066400000000000000000000027411207233610700226060ustar00rootroot00000000000000README for MultihopOscilloscope Author/Contact: tinyos-help@millennium.berkeley.edu Description: MultihopOscilloscope is a simple data-collection demo. It periodically samples the default sensor and broadcasts a message every few readings. These readings can be displayed by the Java "Oscilloscope" application found in the ./java subdirectory. The sampling rate starts at 1Hz, but can be changed from the Java application. You can compile MultihopOscilloscope with a sensor board's default sensor by compiling as follows: SENSORBOARD= make You can change the sensor used by editing MultihopOscilloscopeAppC.nc. Tools: The Java application displays readings it receives from motes running the MultihopOscilloscope demo via a serial forwarder. To run it, change to the ./java subdirectory and type: make java net.tinyos.sf.SerialForwarder -comm serial@: # e.g., java net.tinyos.sf.SerialForwarder -comm serial@/dev/ttyUSB0:mica2 # or java net.tinyos.sf.SerialForwarder -comm serial@COM2:telosb ./run The controls at the bottom of the screen allow you to zoom in or out the X axis, change the range of the Y axis, and clear all received data. You can change the color used to display a mote by clicking on its color in the mote table. Known bugs/limitations: None. See also: TEP 113: Serial Communications, TEP 119: Collection. Notes: MultihopOscilloscope configures a mote whose TOS_NODE_ID modulo 500 is zero to be a collection root. tinyos-2.1.2+dfsg/apps/MultihopOscilloscope/java/000077500000000000000000000000001207233610700220255ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/MultihopOscilloscope/java/ColorCellEditor.java000066400000000000000000000034221207233610700257160ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; /* Editor for table cells representing colors. Popup a color chooser. */ public class ColorCellEditor extends AbstractCellEditor implements TableCellEditor { private Color color; private JButton button; public ColorCellEditor(String title) { button = new JButton(); final JColorChooser chooser = new JColorChooser(); final JDialog dialog = JColorChooser.createDialog (button, title, true, chooser, new ActionListener() { public void actionPerformed(ActionEvent e) { color = chooser.getColor(); } }, null); button.setBorderPainted(false); button.addActionListener (new ActionListener () { public void actionPerformed(ActionEvent e) { button.setBackground(color); chooser.setColor(color); dialog.setVisible(true); fireEditingStopped(); } } ); } public Object getCellEditorValue() { return color; } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { color = (Color)value; return button; } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscope/java/Data.java000066400000000000000000000042101207233610700235360ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import java.util.*; /* Hold all data received from motes */ class Data { /* The mote data is stored in a flat array indexed by a mote's identifier. A null value indicates no mote with that identifier. */ private Node[] nodes = new Node[256]; private Oscilloscope parent; Data(Oscilloscope parent) { this.parent = parent; } /* Data received from mote nodeId containing NREADINGS samples from messageId * NREADINGS onwards. Tell parent if this is a new node. */ void update(int nodeId, int messageId, int readings[]) { if (nodeId >= nodes.length) { int newLength = nodes.length * 2; if (nodeId >= newLength) newLength = nodeId + 1; Node newNodes[] = new Node[newLength]; System.arraycopy(nodes, 0, newNodes, 0, nodes.length); nodes = newNodes; } Node node = nodes[nodeId]; if (node == null) { nodes[nodeId] = node = new Node(nodeId); parent.newNode(nodeId); } node.update(messageId, readings); } /* Return value of sample x for mote nodeId, or -1 for missing data */ int getData(int nodeId, int x) { if (nodeId >= nodes.length || nodes[nodeId] == null) return -1; return nodes[nodeId].getData(x); } /* Return number of last known sample on mote nodeId. Returns 0 for unknown motes. */ int maxX(int nodeId) { if (nodeId >= nodes.length || nodes[nodeId] == null) return 0; return nodes[nodeId].maxX(); } /* Return number of largest known sample on all motes (0 if there are no motes) */ int maxX() { int max = 0; for (int i = 0; i < nodes.length; i++) if (nodes[i] != null) { int nmax = nodes[i].maxX(); if (nmax > max) max = nmax; } return max; } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscope/java/Graph.java000066400000000000000000000155651207233610700237450ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.font.*; import java.awt.geom.*; import java.util.*; /* Panel for drawing mote-data graphs */ class Graph extends JPanel { final static int BORDER_LEFT = 40; final static int BORDER_RIGHT = 0; final static int BORDER_TOP = 10; final static int BORDER_BOTTOM = 10; final static int TICK_SPACING = 40; final static int MAX_TICKS = 16; final static int TICK_WIDTH = 10; final static int MIN_WIDTH = 50; int gx0, gx1, gy0, gy1; // graph bounds int scale = 2; // gx1 - gx0 == MIN_WIDTH << scale Window parent; /* Graph to screen coordinate conversion support */ int height, width; double xscale, yscale; void updateConversion() { height = getHeight() - BORDER_TOP - BORDER_BOTTOM; width = getWidth() - BORDER_LEFT - BORDER_RIGHT; if (height < 1) height = 1; if (width < 1) width = 1; xscale = (double)width / (gx1 - gx0 + 1); yscale = (double)height / (gy1 - gy0 + 1); } Graphics makeClip(Graphics g) { return g.create(BORDER_LEFT, BORDER_TOP, width, height); } // Note that these do not include the border offset! int screenX(int gx) { return (int)(xscale * (gx - gx0) + 0.5); } int screenY(int gy) { return (int)(height - yscale * (gy - gy0)); } int graphX(int sx) { return (int)(sx / xscale + gx0 + 0.5); } Graph(Window parent) { this.parent = parent; gy0 = 0; gy1 = 0xffff; gx0 = 0; gx1 = MIN_WIDTH << scale; } void rightDrawString(Graphics2D g, String s, int x, int y) { TextLayout layout = new TextLayout(s, parent.smallFont, g.getFontRenderContext()); Rectangle2D bounds = layout.getBounds(); layout.draw(g, x - (float)bounds.getWidth(), y + (float)bounds.getHeight() / 2); } protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; /* Repaint. Synchronize on Oscilloscope to avoid data changing. Simply clear panel, draw Y axis and all the mote graphs. */ synchronized (parent.parent) { updateConversion(); g2d.setColor(Color.BLACK); g2d.fillRect(0, 0, getWidth(), getHeight()); drawYAxis(g2d); Graphics clipped = makeClip(g2d); int count = parent.moteListModel.size(); for (int i = 0; i < count; i++) { clipped.setColor(parent.moteListModel.getColor(i)); drawGraph(clipped, parent.moteListModel.get(i)); } } } /* Draw the Y-axis */ protected void drawYAxis(Graphics2D g) { int axis_x = BORDER_LEFT - 1; int height = getHeight() - BORDER_BOTTOM - BORDER_TOP; g.setColor(Color.WHITE); g.drawLine(axis_x, BORDER_TOP, axis_x, BORDER_TOP + height - 1); /* Draw a reasonable set of tick marks */ int nTicks = height / TICK_SPACING; if (nTicks > MAX_TICKS) nTicks = MAX_TICKS; int tickInterval = (gy1 - gy0 + 1) / nTicks; if (tickInterval == 0) tickInterval = 1; /* Tick interval should be of the family A * 10^B, where A = 1, 2 * or 5. We tend more to rounding A up, to reduce rather than increase the number of ticks. */ int B = (int)(Math.log(tickInterval) / Math.log(10)); int A = (int)(tickInterval / Math.pow(10, B) + 0.5); if (A > 2) A = 5; else if (A > 5) A = 10; tickInterval = A * (int)Math.pow(10, B); /* Ticks are printed at multiples of tickInterval */ int tick = ((gy0 + tickInterval - 1) / tickInterval) * tickInterval; while (tick <= gy1) { int stick = screenY(tick) + BORDER_TOP; rightDrawString(g, "" + tick, axis_x - TICK_WIDTH / 2 - 2, stick); g.drawLine(axis_x - TICK_WIDTH / 2, stick, axis_x - TICK_WIDTH / 2 + TICK_WIDTH, stick); tick += tickInterval; } } /* Draw graph for mote nodeId */ protected void drawGraph(Graphics g, int nodeId) { SingleGraph sg = new SingleGraph(g, nodeId); if (gx1 - gx0 >= width) // More points than pixels-iterate by pixel for (int sx = 0; sx < width; sx++) sg.nextPoint(g, graphX(sx), sx); else // Less points than pixel-iterate by points for (int gx = gx0; gx <= gx1; gx++) sg.nextPoint(g, gx, screenX(gx)); } /* Inner class to simplify drawing a graph. Simplify initialise it, then feed it the X screen and graph coordinates, from left to right. */ private class SingleGraph { int lastsx, lastsy, nodeId; /* Start drawing the graph mote id */ SingleGraph(Graphics g, int id) { nodeId = id; lastsx = -1; lastsy = -1; } /* Next point in mote's graph is at x value gx, screen coordinate sx */ void nextPoint(Graphics g, int gx, int sx) { int gy = parent.parent.data.getData(nodeId, gx); int sy = -1; if (gy >= 0) { // Ignore missing values double rsy = height - yscale * (gy - gy0); // Ignore problem values if (rsy >= -1e6 && rsy <= 1e6) sy = (int)(rsy + 0.5); if (lastsy >= 0 && sy >= 0) g.drawLine(lastsx, lastsy, sx, sy); } lastsx = sx; lastsy = sy; } } /* Update X-axis range in GUI */ void updateXLabel() { parent.xLabel.setText("X: " + gx0 + " - " + gx1); } /* Ensure that graph is nicely positioned on screen. max is the largest sample number received from any mote. */ private void recenter(int max) { // New data will show up at the 3/4 point // The 2nd term ensures that gx1 will be >= max int scrollby = ((gx1 - gx0) >> 2) + (max - gx1); gx0 += scrollby; gx1 += scrollby; if (gx0 < 0) { // don't bother showing negative sample numbers gx1 -= gx0; gx0 = 0; } updateXLabel(); } /* New data received. Redraw graph, scrolling if necessary */ void newData() { int max = parent.parent.data.maxX(); if (max > gx1 || max < gx0) // time to scroll recenter(max); repaint(); } /* User set the X-axis scale to newScale */ void setScale(int newScale) { gx1 = gx0 + (MIN_WIDTH << newScale); scale = newScale; recenter(parent.parent.data.maxX()); repaint(); } /* User attempted to set Y-axis range to newy0..newy1. Refuse bogus values (return false), or accept, redraw and return true. */ boolean setYAxis(int newy0, int newy1) { if (newy0 >= newy1 || newy0 < 0 || newy0 > 65535 || newy1 < 0 || newy1 > 65535) return false; gy0 = newy0; gy1 = newy1; repaint(); return true; } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscope/java/Makefile000066400000000000000000000010461207233610700234660ustar00rootroot00000000000000GEN=OscilloscopeMsg.java Constants.java all: oscilloscope.jar oscilloscope.jar: Oscilloscope.class jar cf $@ *.class OscilloscopeMsg.java: ../MultihopOscilloscope.h mig -target=null -java-classname=OscilloscopeMsg java ../MultihopOscilloscope.h oscilloscope -o $@ Constants.java: ../MultihopOscilloscope.h ncg -target=null -java-classname=Constants java ../MultihopOscilloscope.h NREADINGS DEFAULT_INTERVAL -o $@ Oscilloscope.class: $(wildcard *.java) $(GEN) javac *.java clean: rm -f *.class $(GEN) veryclean: clean rm oscilloscope.jar tinyos-2.1.2+dfsg/apps/MultihopOscilloscope/java/Node.java000066400000000000000000000066021207233610700235610ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Class holding all data received from a mote. */ class Node { /* Data is hold in an array whose size is a multiple of INCREMENT, and INCREMENT itself must be a multiple of Constant.NREADINGS. This simplifies handling the extension and clipping of old data (see setEnd) */ final static int INCREMENT = 100 * Constants.NREADINGS; final static int MAX_SIZE = 100 * INCREMENT; // Must be multiple of INCREMENT /* The mote's identifier */ int id; /* Data received from the mote. data[0] is the dataStart'th sample Indexes 0 through dataEnd - dataStart - 1 hold data. Samples are 16-bit unsigned numbers, -1 indicates missing data. */ int[] data; int dataStart, dataEnd; Node(int _id) { id = _id; } /* Update data to hold received samples newDataIndex .. newEnd. If we receive data with a lower index, we discard newer data (we assume the mote rebooted). */ private void setEnd(int newDataIndex, int newEnd) { if (newDataIndex < dataStart || data == null) { /* New data is before the start of what we have. Just throw it all away and start again */ dataStart = newDataIndex; data = new int[INCREMENT]; } if (newEnd > dataStart + data.length) { /* Try extending first */ if (data.length < MAX_SIZE) { int newLength = (newEnd - dataStart + INCREMENT - 1) / INCREMENT * INCREMENT; if (newLength >= MAX_SIZE) newLength = MAX_SIZE; int[] newData = new int[newLength]; System.arraycopy(data, 0, newData, 0, data.length); data = newData; } if (newEnd > dataStart + data.length) { /* Still doesn't fit. Squish. We assume INCREMENT >= (newEnd - newDataIndex), and ensure that dataStart + data.length - INCREMENT = newDataIndex */ int newStart = newDataIndex + INCREMENT - data.length; if (dataStart + data.length > newStart) System.arraycopy(data, newStart - dataStart, data, 0, data.length - (newStart - dataStart)); dataStart = newStart; } } /* Mark any missing data as invalid */ for (int i = dataEnd < dataStart ? dataStart : dataEnd; i < newDataIndex; i++) data[i - dataStart] = -1; /* If we receive a count less than the old count, we assume the old data is invalid */ dataEnd = newEnd; } /* Data received containing NREADINGS samples from messageId * NREADINGS onwards */ void update(int messageId, int readings[]) { int start = messageId * Constants.NREADINGS; setEnd(start, start + Constants.NREADINGS); for (int i = 0; i < readings.length; i++) data[start - dataStart + i] = readings[i]; } /* Return value of sample x, or -1 for missing data */ int getData(int x) { if (x < dataStart || x >= dataEnd) return -1; else return data[x - dataStart]; } /* Return number of last known sample */ int maxX() { return dataEnd - 1; } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscope/java/Oscilloscope.java000066400000000000000000000100751207233610700253310ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import net.tinyos.message.*; import net.tinyos.util.*; import java.io.*; /* The "Oscilloscope" demo app. Displays graphs showing data received from the Oscilloscope mote application, and allows the user to: - zoom in or out on the X axis - set the scale on the Y axis - change the sampling period - change the color of each mote's graph - clear all data This application is in three parts: - the Node and Data objects store data received from the motes and support simple queries - the Window and Graph and miscellaneous support objects implement the GUI and graph drawing - the Oscilloscope object talks to the motes and coordinates the other objects Synchronization is handled through the Oscilloscope object. Any operation that reads or writes the mote data must be synchronized on Oscilloscope. Note that the messageReceived method below is synchronized, so no further synchronization is needed when updating state based on received messages. */ public class Oscilloscope implements MessageListener { MoteIF mote; Data data; Window window; /* The current sampling period. If we receive a message from a mote with a newer version, we update our interval. If we receive a message with an older version, we broadcast a message with the current interval and version. If the user changes the interval, we increment the version and broadcast the new interval and version. */ int interval = Constants.DEFAULT_INTERVAL; int version = -1; /* Main entry point */ void run() { data = new Data(this); window = new Window(this); window.setup(); mote = new MoteIF(PrintStreamMessenger.err); mote.registerListener(new OscilloscopeMsg(), this); } /* The data object has informed us that nodeId is a previously unknown mote. Update the GUI. */ void newNode(int nodeId) { window.newNode(nodeId); } synchronized public void messageReceived(int dest_addr, Message msg) { if (msg instanceof OscilloscopeMsg) { OscilloscopeMsg omsg = (OscilloscopeMsg)msg; /* Update interval and mote data */ periodUpdate(omsg.get_version(), omsg.get_interval()); data.update(omsg.get_id(), omsg.get_count(), omsg.get_readings()); /* Inform the GUI that new data showed up */ window.newData(); } } /* A potentially new version and interval has been received from the mote */ void periodUpdate(int moteVersion, int moteInterval) { if (moteVersion > version) { /* It's new. Update our vision of the interval. */ version = moteVersion; interval = moteInterval; window.updateSamplePeriod(); } else if (moteVersion < version) { /* It's old. Update the mote's vision of the interval. */ sendInterval(); } } /* The user wants to set the interval to newPeriod. Refuse bogus values and return false, or accept the change, broadcast it, and return true */ synchronized boolean setInterval(int newPeriod) { if (newPeriod < 1 || newPeriod > 65535) return false; interval = newPeriod; version++; sendInterval(); return true; } /* Broadcast a version+interval message. */ void sendInterval() { OscilloscopeMsg omsg = new OscilloscopeMsg(); omsg.set_version(version); omsg.set_interval(interval); try { mote.send(MoteIF.TOS_BCAST_ADDR, omsg); } catch (IOException e) { window.error("Cannot send message to mote"); } } /* User wants to clear all data. */ void clear() { data = new Data(this); } public static void main(String[] args) { Oscilloscope me = new Oscilloscope(); me.run(); } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscope/java/Window.java000066400000000000000000000222221207233610700241370ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import javax.swing.table.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; import java.util.*; /* The main GUI object. Build the GUI and coordinate all user activities */ class Window { Oscilloscope parent; Graph graph; Font smallFont = new Font("Dialog", Font.PLAIN, 8); Font boldFont = new Font("Dialog", Font.BOLD, 12); Font normalFont = new Font("Dialog", Font.PLAIN, 12); MoteTableModel moteListModel; // GUI view of mote list JLabel xLabel; // Label displaying X axis range JTextField sampleText, yText; // inputs for sample period and Y axis range JFrame frame; Window(Oscilloscope parent) { this.parent = parent; } /* A model for the mote table, and general utility operations on the mote list */ class MoteTableModel extends AbstractTableModel { private ArrayList motes = new ArrayList(); private ArrayList colors = new ArrayList(); /* Initial mote colors cycle through this list. Add more colors if you want. */ private Color[] cycle = { Color.RED, Color.WHITE, Color.GREEN, Color.MAGENTA, Color.YELLOW, Color.GRAY, Color.YELLOW }; int cycleIndex; /* TableModel methods for achieving our table appearance */ public String getColumnName(int col) { if (col == 0) { return "Mote"; } else { return "Color"; } } public int getColumnCount() { return 2; } public synchronized int getRowCount() { return motes.size(); } public synchronized Object getValueAt(int row, int col) { if (col == 0) { return motes.get(row); } else { return colors.get(row); } } public Class getColumnClass(int col) { return getValueAt(0, col).getClass(); } public boolean isCellEditable(int row, int col) { return col == 1; } public synchronized void setValueAt(Object value, int row, int col) { colors.set(row, value); fireTableCellUpdated(row, col); graph.repaint(); } /* Return mote id of i'th mote */ int get(int i) { return ((Integer)motes.get(i)).intValue(); } /* Return color of i'th mote */ Color getColor(int i) { return (Color)colors.get(i); } /* Return number of motes */ int size() { return motes.size(); } /* Add a new mote */ synchronized void newNode(int nodeId) { /* Shock, horror. No binary search. */ int i, len = motes.size(); for (i = 0; ; i++) if (i == len || nodeId < get(i)) { motes.add(i, new Integer(nodeId)); // Cycle through a set of initial colors colors.add(i, cycle[cycleIndex++ % cycle.length]); break; } fireTableRowsInserted(i, i); } /* Remove all motes */ void clear() { motes = new ArrayList(); colors = new ArrayList(); fireTableDataChanged(); } } /* A simple full-color cell */ static class MoteColor extends JLabel implements TableCellRenderer { public MoteColor() { setOpaque(true); } public Component getTableCellRendererComponent (JTable table, Object color, boolean isSelected, boolean hasFocus, int row, int column) { setBackground((Color)color); return this; } } /* Convenience methods for making buttons, labels and textfields. Simplifies code and ensures a consistent style. */ JButton makeButton(String label, ActionListener action) { JButton button = new JButton(); button.setText(label); button.setFont(boldFont); button.addActionListener(action); return button; } JLabel makeLabel(String txt, int alignment) { JLabel label = new JLabel(txt, alignment); label.setFont(boldFont); return label; } JLabel makeSmallLabel(String txt, int alignment) { JLabel label = new JLabel(txt, alignment); label.setFont(smallFont); return label; } JTextField makeTextField(int columns, ActionListener action) { JTextField tf = new JTextField(columns); tf.setFont(normalFont); tf.setMaximumSize(tf.getPreferredSize()); tf.addActionListener(action); return tf; } /* Build the GUI */ void setup() { JPanel main = new JPanel(new BorderLayout()); main.setMinimumSize(new Dimension(500, 250)); main.setPreferredSize(new Dimension(800, 400)); // Three panels: mote list, graph, controls moteListModel = new MoteTableModel(); JTable moteList = new JTable(moteListModel); moteList.setDefaultRenderer(Color.class, new MoteColor()); moteList.setDefaultEditor(Color.class, new ColorCellEditor("Pick Mote Color")); moteList.setPreferredScrollableViewportSize(new Dimension(100, 400)); JScrollPane motePanel = new JScrollPane(); motePanel.getViewport().add(moteList, null); main.add(motePanel, BorderLayout.WEST); graph = new Graph(this); main.add(graph, BorderLayout.CENTER); // Controls. Organised using box layouts. // Sample period. JLabel sampleLabel = makeLabel("Sample period (ms):", JLabel.RIGHT); sampleText = makeTextField(6, new ActionListener() { public void actionPerformed(ActionEvent e) { setSamplePeriod(); } } ); updateSamplePeriod(); // Clear data. JButton clearButton = makeButton("Clear data", new ActionListener() { public void actionPerformed(ActionEvent e) { clearData(); } } ); // Adjust X-axis zoom. Box xControl = new Box(BoxLayout.Y_AXIS); xLabel = makeLabel("", JLabel.CENTER); final JSlider xSlider = new JSlider(JSlider.HORIZONTAL, 0, 8, graph.scale); Hashtable xTable = new Hashtable(); for (int i = 0; i <= 8; i += 2) xTable.put(new Integer(i), makeSmallLabel("" + (Graph.MIN_WIDTH << i), JLabel.CENTER)); xSlider.setLabelTable(xTable); xSlider.setPaintLabels(true); graph.updateXLabel(); graph.setScale(graph.scale); xSlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { //if (!xSlider.getValueIsAdjusting()) graph.setScale((int)xSlider.getValue()); } }); xControl.add(xLabel); xControl.add(xSlider); // Adjust Y-axis range. JLabel yLabel = makeLabel("Y:", JLabel.RIGHT); yText = makeTextField(12, new ActionListener() { public void actionPerformed(ActionEvent e) { setYAxis(); } } ); yText.setText(graph.gy0 + " - " + graph.gy1); Box controls = new Box(BoxLayout.X_AXIS); controls.add(clearButton); controls.add(Box.createHorizontalGlue()); controls.add(Box.createRigidArea(new Dimension(20, 0))); controls.add(sampleLabel); controls.add(sampleText); controls.add(Box.createHorizontalGlue()); controls.add(Box.createRigidArea(new Dimension(20, 0))); controls.add(xControl); controls.add(yLabel); controls.add(yText); main.add(controls, BorderLayout.SOUTH); // The frame part frame = new JFrame("Oscilloscope"); frame.setSize(main.getPreferredSize()); frame.getContentPane().add(main); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } /* User operation: clear data */ void clearData() { synchronized (parent) { moteListModel.clear(); parent.clear(); graph.newData(); } } /* User operation: set Y-axis range. */ void setYAxis() { String val = yText.getText(); try { int dash = val.indexOf('-'); if (dash >= 0) { String min = val.substring(0, dash).trim(); String max = val.substring(dash + 1).trim(); if (!graph.setYAxis(Integer.parseInt(min), Integer.parseInt(max))) error("Invalid range " + min + " - " + max + " (expected values between 0 and 65535)"); return; } } catch (NumberFormatException e) { } error("Invalid range " + val + " (expected NN-MM)"); } /* User operation: set sample period. */ void setSamplePeriod() { String periodS = sampleText.getText().trim(); try { int newPeriod = Integer.parseInt(periodS); if (parent.setInterval(newPeriod)) { return; } } catch (NumberFormatException e) { } error("Invalid sample period " + periodS); } /* Notification: sample period changed. */ void updateSamplePeriod() { sampleText.setText("" + parent.interval); } /* Notification: new node. */ void newNode(int nodeId) { moteListModel.newNode(nodeId); } /* Notification: new data. */ void newData() { graph.newData(); } void error(String msg) { JOptionPane.showMessageDialog(frame, msg, "Error", JOptionPane.ERROR_MESSAGE); } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscope/java/build.xml000066400000000000000000000006201207233610700236440ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/MultihopOscilloscope/java/oscilloscope.jar000066400000000000000000000451041207233610700252250ustar00rootroot00000000000000PK 6 META-INF/PK 6--META-INF/MANIFEST.MFManifest-Version: 1.0 Created-By: 0.92-gcc PK 6[yColorCellEditor$1.class}RmOA~=NZ***J8`iו.9v22.FH/y}f !ܩN̅ǽ X aj$V:49a+FkR( BuCiUJء*Z넙y̲%V^*&!Dӡ05I2(*?䀰{DD+tn<dGnF" (B <j=#ZL,u?H&x]ZBTavTc7l&wB#n_}rml4W,Z֟6P,C xIp>5IӨ]gm2 ᨚaYXd?E\`C?D?pEUMnsY6|PK 6´I<ColorCellEditor$2.class}TkOA=CK(@,J؂oAP &FM05۲apIv?D2Rν39_x/p˄ 6n 6J1ʦZ`c;RT"bڞCx*Tq5л%һBˀ6C0r ӻ2)Uk-* a˭HU dtUΐ`d$^7EMT[Th0'DM3N-ՌBBAc+s b"r} 8⑅OL^XSUё_F$"aHu>4xG5h3@Hb q.yɮ7VbpRAA;01'BX5#raiG/N-6NDe"S߳·KF:&t`ȸIߐ>?Qh,̝=B;w;WkQQO8A'oVâQQ6{V>#E7):"frP&ұTMSiu_*PK 6#ColorCellEditor.classUiOQ= T((ȢN(kh!o2% IIQŮ@wϹ˜' VE\UtbBAJEXIS*0+7cOTDTn)x `N #g)X2ғfh =٧wl;7K[Y%)@/ oұMPsew?y:wBa%o 4 cU4r{eb}XqۂaA-ΏL7lŪ[,j&i=_ɕLqRmm˅eVM265_@$D 8 ܴu7-P7C䫖{w]Ą0 Ы=$%CĶ8'EǦ6w3'_jXĒ eȊUbY;*RR]8`uE9O)TGNM$Ǐb6sp A]/u f|2 +h+ ЩESX_[ È~]W['I &%ަZ"/"?GxSΡЯַo$BsmœE;nKg x7~)Z)(crS^ʘf1$(k0hb6ZF_8EPPt POG>lAD'OsD(ybceȕEU p9!%,8u_*] PK 64MP!Constants.class=jP5jݸpv/P Q!ʍ^J$M^]\}@;3s߿ } :&&zu[T]2P$4xBh/s mhA==ĄvZ!,m=E5gtRc*S>CwbHh1 q|E`:Ap5-@j0bZ|BS&p ]=@/&V3Ra+:؂Ú֧HToaև98BG6Q6LCglAh׿`jU4ӟXV+O$A|JVxBǿʤAzbM@yuއHk̓'b#x̸|sPK 6GX,  Graph.classW |[e77֬k6t8؀4i1G>tkn.,MjvPQQn y< (*|36g~;|;;;|>,p8hƕZkpxQ|uaX?/Zp?.`8rD'<7z17yQO ً[pO i ܁ϊ>' KDvy{|A)2W}QV|ɋ{ecW4|Ջz\}2/4"Q!!u7qЋo|؃GcB'4#lMK b4%Z3g#3v`^pV౵5b7<=ӹ9-f-eF;iEP2t`vBmmj?&ۓH&ٞtIӊMd.-kZN;zPԌiBղ3sȜڗΙD6cFj6c=A4nҥ0a'K|ym_!L{5K ?j٢\F?OnNnk,þN &۠\(?2`IB C "3JH+lIBnp|<6ʵTxk0 !<":,U N1>k2þ+fHS/uY,ë^b-69z{';϶Zre]+ހȶcV., gd#=%M.ӇpPh?Q£*2D]!",:fFUX$7mBi:ZÌpoPP,k V"@O݌d ? W٬ &#_@"ʄ"+ɈWoKq!*&Ld~ui+"_Sh{1կEWE[#RJ~5WF~ލhcϻ9 k?V"7{8#L!0jnꌸ71ӪX'kvra-d.fn43nQF.aFx;L.u\ݸkF6?Jy3񢃈tqbpNvJ߅!Yޡ0AQ[Bݍua2Pܬvb ?Z&r#fr fr+eM5 Hҳq,0bXRB8wܤ؄Kvj˲论]ڒ߼$Ez4b`[ K\xVqs'[ qzh7R~,4)o/zMvU<(DserZj4:Dhk_OpzfngSob{Ŗ'T- ]貇Y_c*w7p ?}jS v]e0pw3q^PK 6PGraph$SingleGraph.classmS[OA-e(jY[A`unź%E`›M4 &>h|WKg%hw\7ӟ~t:kGk00kc'IV~=6PƷ/D8 ⬊ J `巜*yHXA՜XamE7l x2qsge0 o1Hԑ|wz[i͗hEݕFCDQ}|TIOģ`Zr$1̱{9ű[@]*F8.`TŘUs\„eLrL+s\8L\ghz~FeV&H vE3,_pm:HSJ,7E5sIEv3J./$c9rܰ)$.z"T2MR#+ TeqԌZ^NODKa#.CO/^'_Tv_ Č$:m"˄ϡv%:6zMkp;4}`AAMhY)ui sp|n[tNz0$Nx]֧igeʓХ# .oC .m4ZߐoIw4{zY0OpCF}v5p?PK 6H{ Node.classmSOQ^m*P eYh(Ţ5PŊhJJKH⑃W/iHp1A ē/x{4t͏{T^)fJBWЫO>M ,plXX2e3qkY2>cpLnA4❴͠w@\!gG)5I-Cx`%KsViژ˓ǽb eL,"G; |x1 CM˥5l /  >Zh_A؇|h6WB6$0QL-ZY[ҧ $WWlk-.2臠Җ8@&ˁd7eHRZꖚ*!NK'*ob \V<Շ8dԷ\'6'4 v*x^f`XMp!]j~:~WTUqlwpm(HP0HˌKE$ ڦҪ2Yݹ)-%+5'wTG3K)i腆~\cS$.c< BW7 7#m.q#AAt֓1Gi`s]KrȨ(r7*$NT6jݡ)nSvm)J`L|sk憙)v)軖] \[P3p Vx[8e '1AuRvI ʥkVq_?mq媒s,R+46!f_E%;M&j ^y2Zm__:r=EsRV A{9" gL7ޟzYO hH"kc#<x2hN<Bgl#m#J oSvE@9nQ+/#'F62oF[=3gF'?CW#R!9YL]g :$wD =MXql~;8BF@\z}ިa?wߡS8CWgz6~Y$$h B`:{%f1Oަ>XBn<Ӽ$.vu7st"HD~dz>BK Q?6֨$9R[!+uPK 6ܼ9OscilloscopeMsg.classW]pW>ג%qKid!)$Pȭ1uQF^8)m)Mm(mG 3t`t<@>1P<ʫU̹{s~{-"EpN*(B+47ܜ,7 M'=z'ΎсQu8 e_grJ(ɴ?*!*F(|FNC}ǒ+lRNkFȤe)5"LNV_((|o-,(Ra4HKt5н&*1zRTF.HdV-TpZ ^sZrRs*`R.ϭ1wGԒ&4Ur9ѧL%m,TA]jJ}Vɪ; R2P6\e zōEUjllL&8$zC B2od8*NSR61Xׅ‚^NەxoIe>ܲ4w&^'; p3ȯo)ā EHqaAs"KW.ା}v4NcN*O=FM\"0 /Sd00vH)yivD,o5!Á½)u>nNR]ǹK,^/"Â"EiLkS~F?iOps1HT<8͚%ά_&ҧ7NfMΨ_U=h #mD_6u{v/ޫrtn?G5r!<unPd.{vN]<ԇ< / ̞ޙ9}B&̬+R"O jvy>QipnF. y#o Ҟꥭy|C|%"y(axS 9N!':NYhTKGذPa`bF597`In% O*)S;?bKDqdȴl*OyDA[S/BBIhi}pn <=A^ gE, XMh)/PK 6 wEWindow$2.classmP]KA=~fTfI`nZaRQ:: ~@?*S ܹw=3@2ƲXac!2n0{!}Rz ~,' /`! I%ƣny/0k=HvސO˧{@M s8Ņ4 s)A9P%z KD x0\=׽5C_rOZP'Ci$dS~ xt5G!,Yň 9hI mn ^D_'o +R &w‹oPK 6]Window$3.classuQn@=vRҖ#*u# `'U2;I~VH,!cRs93| Cjpq.wj{ぇxⱋ@}) QJ6'Qv4z[_Ȩcf*k?JOw^*+Vx%Sg(P'$Јw(ኟi7zJ Z6Q}m(KP/Fw-GO|\u.|l#pbŮ貋~.ך^"2UK%<3z?:a̐X4 Xh&{6ZnXɔP&  +Ռ`,J 7JhZ{V9״d%XGۜm%\^|kɫ;5udi9JV%8/?h#|ymRPK 6yGWindow$4.classmPJ@=>Ҧ@"] wPT(.tS $V?K.W~x'Օ{9M HcMX3ΐUrpz>H5J?R#BsŐ}PtgQG^/W"< 3l5ܡ7o>R9r'Bf*-=cBņ UThYTJu/yPJO9!C_qWĊ$CWX>}/b\Ȓ Pm?4_0W#gO(k5>|_RDΝPK 6][;Window$5.classmPN1=50DcX 0n\iL ф@5Cra4.Ŀ0&si,mdPqM [vrz" C{'(\1ؽRI}P~ >CC+M"僀*EBja,՘9Bb.W*W&N^8Zª23.lbU_?eQJDDZ:]C3vp5{X)=F cU4|3;<}>CXKo(N)/k+;U_SOp;._|C7o 9- a +䴂iÓBN ~,hHC?ЄgD
_ ّR:\rX&i2'baYf2!tEGƘO,4.Qi&ɋXY`Y'nT~l&+e/dHqȚw=DJcfm3[t-2GP>fu< [v7"e녭lsX.uCOo"aDL*@̏ge J 4l7Jx&eZ!';̬fLțL%eN :QGN.XJjK8.n J ȳ6>KRVZShN[!/8h+ٽL,]ݸKBvD1Ljt mө.h.L@^F+81!4 mHIX5M٨q0= g3S9\NڮӐ֖"K{z~#\2u%1s`]>=\fKL^R.U;ȅ=+(ӕbܲ"Cl:uzZZ˥IqZw]$&/q 8q*85w>t:zdF$>F5lkzRpJJZ^Gl؛[ɎmFn_F56uwSB`D|ZQڧEW鴟:N)<4k?S1/5;ݩ7]- uʳ4NtI-ovt}nq>A)CtBt%gmzzNoq: bWt:LGtzY;~I6ʥ֟:`pPY&GɌϛ0ό𰙟0TJ7npf +t4蓃1?Wlh-VNǴ\Q1tr(tNwН\fnӶN4Q3?`rƨ慽EmV̻`H!;dxa]s'Y4k&C6G 9ظcs%EJ l )kMy `un5l^s ia';ofgB>7sp2leNsݖ9IgӜi!wORf3X&ίm7)!O>( 7EF&ñ ?uKY5v9lhf=?Шf.duNf򠜆k9{.r>tutw֐LEK3g4MN}Y,m)RLsNnY-ޖZ;KۻsV;Q+UټK_rKs1fkd T-VIrp!W>@s{rvV,֪sfFgZI^gNnqo5>&~~pi?rftW~]ɛ]A!f 9ܐ'Ľ6[dG_߸ox7|tF$9#߲W\(A8(FP]-Sh)@ղju мwW̻zK ,:ƫ gz&c ,EMD#.J<686V-QiF:3=^\Eqg5=Nĥ,6LaW;i1ʘ ~~R71͌p ?Cs..V?env!gg < /D5ry⸋Zv+ǔ+wXgqOaEp~_hc( lNVSV&ƬBd3h~ Uh=棨`Nm ͆[9SXgc}NLk:N^aWol#絶Ϸq[%tVV)Y TWpHlzZl/.OU^@?K*ZZ0+2.l]j@mZ!ؖ]*!yq[;׶: uT#X\K36쯹oрa5g=N7]E[y] 5x7 6.ȏ؈!gbhGxn|v)7; @h4+6FϋιS/8 E3^&HG0J~&cjƳ {&<-h+YɎ|&4kM%bƚMPTjQ@US5Σ89}3&Ɋh%Dq:)gk[Tpu_*abK΄JVģhWbcC[SF $nl|aR>gzRVI[8Xq|Fù׻/~98m|^M< .{1PK 6Wj%Window$MoteColor.classeQ]KA=ۚ}0"* |uuVwgՋAs?*;(܏sϽܙO%А6eguбɠCCfKq35wϛ!TXs+d[x«+ ./?eǺRܲ,RovE+(7jaQ`M';wĥ[|eB8&Ͱ4긞t2' Gn T!1U)I}_ 95,XN}>XZ zxPڼr& O_A0`71j#k"?&'_+NՀM(ZRRXWF V/PK 6 4 Window$MoteTableModel.classV[WgC.ˆjXE1m tZd cÄN&^?vŗ>Pĵ g9gﳿIadZq ɊU1 b> 191u=%c1zΙ(nޔV|QUb 6euGRiN|*>Sa+͗];{׸g$UJ:*E|Tv/K7HcM;Ew`.)P2rJ)eʋ j-Zydٖ;-*JAp\ ecYә4ft[t Vnjy~FɰɜXv퍸rvFDyr7e 7=̆RwͼTɨPWʐY* s IT^ߌ0 ;gqeGJ+}b8i%Sr:%p~U'oX§p#8N-\ix}ll#24|.S㊩9cd3i"zU0{ἊE KXp_hT|!Vo1Z)cfd"WG^C~ ?JZb{3JmJl١eltdeӓ/98[q#゙H +|kTj2:NMrT6;>MEmLYG>o5qḺxfs-1X ᚅrX¾xtca]dӲuc.ܝ7Ԥa قv7Py*b::a5fpߤ^"#ULdAx贝2P*HrgPВx 5֗DT=HNӤVyk*r -GV-we?XW)A(Zɫp">FsJgJ#b +yB{= DpFأ>]<%hS ^~پX8ͷOEyDőNf?InQ&=uLRxo}[j8ج6AT¥z 2%<ğ#%?PK 6 META-INF/PK 6--'META-INF/MANIFEST.MFPK 6[yColorCellEditor$1.classPK 6´I<qColorCellEditor$2.classPK 6#ColorCellEditor.classPK 64MP!%Constants.classPK 6{< 6 Data.classPK 6GX,  Graph.classPK 6P6Graph$SingleGraph.classPK 6H{ Node.classPK 6F^ROscilloscope.classPK 6ܼ9 OscilloscopeMsg.classPK 6G %K(Window$1.classPK 6 wEt*Window$2.classPK 6]+Window$3.classPK 6yG-Window$4.classPK 6][;8/Window$5.classPK 6[T) 1 0Window.classPK 6Wj%}>Window$MoteColor.classPK 6 4 @Window$MoteTableModel.classPKGEtinyos-2.1.2+dfsg/apps/MultihopOscilloscope/java/run000077500000000000000000000002451207233610700225600ustar00rootroot00000000000000#!/bin/sh if cygpath -w / >/dev/null 2>/dev/null; then CLASSPATH="oscilloscope.jar;$CLASSPATH" else CLASSPATH="oscilloscope.jar:$CLASSPATH" fi java Oscilloscope tinyos-2.1.2+dfsg/apps/MultihopOscilloscope/oscilloscope.py000077500000000000000000000014721207233610700241630ustar00rootroot00000000000000#!/usr/bin/env python import sys import tos AM_OSCILLOSCOPE = 0x93 class OscilloscopeMsg(tos.Packet): def __init__(self, packet = None): tos.Packet.__init__(self, [('version', 'int', 2), ('interval', 'int', 2), ('id', 'int', 2), ('count', 'int', 2), ('readings', 'blob', None)], packet) if '-h' in sys.argv: print "Usage:", sys.argv[0], "serial@/dev/ttyUSB0:57600" sys.exit() am = tos.AM() while True: p = am.read() if p and p.type == AM_OSCILLOSCOPE: msg = OscilloscopeMsg(p.data) print msg.id, msg.count, [i<<8 | j for (i,j) in zip(msg.readings[::2], msg.readings[1::2])] #print msg tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/000077500000000000000000000000001207233610700215525ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/Makefile000066400000000000000000000001601207233610700232070ustar00rootroot00000000000000COMPONENT=MultihopOscilloscopeAppC CFLAGS += -I$(TOSDIR)/lib/net/ -I$(TOSDIR)/lib/net/lqi include $(MAKERULES) tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/MultihopOscilloscope.h000066400000000000000000000017721207233610700261120ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * @author David Gay * @author Kyle Jamieson */ #ifndef MULTIHOP_OSCILLOSCOPE_H #define MULTIHOP_OSCILLOSCOPE_H enum { /* Number of readings per message. If you increase this, you may have to increase the message_t size. */ NREADINGS = 5, /* Default sampling period. */ DEFAULT_INTERVAL = 1024, AM_OSCILLOSCOPE = 0x93 }; typedef nx_struct oscilloscope { nx_uint16_t version; /* Version of the interval. */ nx_uint16_t interval; /* Samping period. */ nx_uint16_t id; /* Mote id of sending mote. */ nx_uint16_t count; /* The readings are samples count * NREADINGS onwards */ nx_uint16_t readings[NREADINGS]; } oscilloscope_t; #endif tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/MultihopOscilloscopeAppC.nc000066400000000000000000000046451207233610700270310ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * MultihopOscilloscope demo application using the collection layer. * See README.txt file in this directory and TEP 119: Collection. * * @author David Gay * @author Kyle Jamieson */ configuration MultihopOscilloscopeAppC { } implementation { components MainC, MultihopOscilloscopeC, LedsC, new TimerMilliC(), new DemoSensorC() as Sensor; //MainC.SoftwareInit -> Sensor; MultihopOscilloscopeC.Boot -> MainC; MultihopOscilloscopeC.Timer -> TimerMilliC; MultihopOscilloscopeC.Read -> Sensor; MultihopOscilloscopeC.Leds -> LedsC; // // Communication components. These are documented in TEP 113: // Serial Communication, and TEP 119: Collection. // components CollectionC as Collector, // Collection layer ActiveMessageC, // AM layer new CollectionSenderC(AM_OSCILLOSCOPE), // Sends multihop RF SerialActiveMessageC, // Serial messaging new SerialAMSenderC(AM_OSCILLOSCOPE); // Sends to the serial port MultihopOscilloscopeC.RadioControl -> ActiveMessageC; MultihopOscilloscopeC.SerialControl -> SerialActiveMessageC; MultihopOscilloscopeC.RoutingControl -> Collector; MultihopOscilloscopeC.Send -> CollectionSenderC; MultihopOscilloscopeC.SerialSend -> SerialAMSenderC.AMSend; MultihopOscilloscopeC.Snoop -> Collector.Snoop[AM_OSCILLOSCOPE]; MultihopOscilloscopeC.Receive -> Collector.Receive[AM_OSCILLOSCOPE]; MultihopOscilloscopeC.RootControl -> Collector; components new PoolC(message_t, 10) as UARTMessagePoolP, new QueueC(message_t*, 10) as UARTQueueP; MultihopOscilloscopeC.UARTMessagePool -> UARTMessagePoolP; MultihopOscilloscopeC.UARTQueue -> UARTQueueP; components new PoolC(message_t, 20) as DebugMessagePool, new QueueC(message_t*, 20) as DebugSendQueue, new SerialAMSenderC(AM_LQI_DEBUG) as DebugSerialSender, UARTDebugSenderP as DebugSender; DebugSender.Boot -> MainC; DebugSender.UARTSend -> DebugSerialSender; DebugSender.MessagePool -> DebugMessagePool; DebugSender.SendQueue -> DebugSendQueue; Collector.CollectionDebug -> DebugSender; } tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/MultihopOscilloscopeC.nc000066400000000000000000000170541207233610700263660ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * MultihopOscilloscope demo application using the collection layer. * See README.txt file in this directory and TEP 119: Collection. * * @author David Gay * @author Kyle Jamieson */ #include "Timer.h" #include "MultihopOscilloscope.h" module MultihopOscilloscopeC { uses { // Interfaces for initialization: interface Boot; interface SplitControl as RadioControl; interface SplitControl as SerialControl; interface StdControl as RoutingControl; // Interfaces for communication, multihop and serial: interface Send; interface Receive as Snoop; interface Receive; interface AMSend as SerialSend; interface CollectionPacket; interface RootControl; interface Queue as UARTQueue; interface Pool as UARTMessagePool; // Miscalleny: interface Timer; interface Read; interface Leds; } } implementation { task void uartSendTask(); static void startTimer(); static void fatal_problem(); static void report_problem(); static void report_sent(); static void report_received(); uint8_t uartlen; message_t sendbuf; message_t uartbuf; bool sendbusy=FALSE, uartbusy=FALSE; /* Current local state - interval, version and accumulated readings */ oscilloscope_t local; uint8_t reading; /* 0 to NREADINGS */ /* When we head an Oscilloscope message, we check it's sample count. If it's ahead of ours, we "jump" forwards (set our count to the received count). However, we must then suppress our next count increment. This is a very simple form of "time" synchronization (for an abstract notion of time). */ bool suppress_count_change; // // On bootup, initialize radio and serial communications, and our // own state variables. // event void Boot.booted() { local.interval = DEFAULT_INTERVAL; local.id = TOS_NODE_ID; local.version = 0; // Beginning our initialization phases: if (call RadioControl.start() != SUCCESS) fatal_problem(); if (call RoutingControl.start() != SUCCESS) fatal_problem(); } event void RadioControl.startDone(error_t error) { if (error != SUCCESS) fatal_problem(); if (sizeof(local) > call Send.maxPayloadLength()) fatal_problem(); if (call SerialControl.start() != SUCCESS) fatal_problem(); } event void SerialControl.startDone(error_t error) { if (error != SUCCESS) fatal_problem(); // This is how to set yourself as a root to the collection layer: if (local.id % 500 == 0) call RootControl.setRoot(); startTimer(); } static void startTimer() { if (call Timer.isRunning()) call Timer.stop(); call Timer.startPeriodic(local.interval); reading = 0; } event void RadioControl.stopDone(error_t error) { } event void SerialControl.stopDone(error_t error) { } // // Only the root will receive messages from this interface; its job // is to forward them to the serial uart for processing on the pc // connected to the sensor network. // event message_t* Receive.receive(message_t* msg, void *payload, uint8_t len) { oscilloscope_t* in = (oscilloscope_t*)payload; oscilloscope_t* out; if (uartbusy == FALSE) { out = (oscilloscope_t*)call SerialSend.getPayload(&uartbuf, sizeof(oscilloscope_t)); if (out == NULL) { fatal_problem(); return msg; } else { memcpy(out, in, sizeof(oscilloscope_t)); } uartlen = sizeof(oscilloscope_t); post uartSendTask(); } else { // The UART is busy; queue up messages and service them when the // UART becomes free. message_t *newmsg = call UARTMessagePool.get(); if (newmsg == NULL) { // drop the message on the floor if we run out of queue space. report_problem(); return msg; } //Prepare message to be sent over the uart out = (oscilloscope_t*)call SerialSend.getPayload(newmsg, sizeof(oscilloscope_t)); if (out == NULL) { fatal_problem(); return msg; } memcpy(out, in, sizeof(oscilloscope_t)); if (call UARTQueue.enqueue(newmsg) != SUCCESS) { // drop the message on the floor and hang if we run out of // queue space without running out of queue space first (this // should not occur). call UARTMessagePool.put(newmsg); fatal_problem(); return msg; } } return msg; } task void uartSendTask() { if (call SerialSend.send(0xffff, &uartbuf, uartlen) != SUCCESS) { report_problem(); } else { uartbusy = TRUE; } } event void SerialSend.sendDone(message_t *msg, error_t error) { uartbusy = FALSE; if (call UARTQueue.empty() == FALSE) { // We just finished a UART send, and the uart queue is // non-empty. Let's start a new one. message_t *queuemsg = call UARTQueue.dequeue(); if (queuemsg == NULL) { fatal_problem(); return; } memcpy(&uartbuf, queuemsg, sizeof(message_t)); if (call UARTMessagePool.put(queuemsg) != SUCCESS) { fatal_problem(); return; } post uartSendTask(); } } // // Overhearing other traffic in the network. // event message_t* Snoop.receive(message_t* msg, void* payload, uint8_t len) { oscilloscope_t *omsg = payload; report_received(); // If we receive a newer version, update our interval. if (omsg->version > local.version) { local.version = omsg->version; local.interval = omsg->interval; startTimer(); } // If we hear from a future count, jump ahead but suppress our own // change. if (omsg->count > local.count) { local.count = omsg->count; suppress_count_change = TRUE; } return msg; } /* At each sample period: - if local sample buffer is full, send accumulated samples - read next sample */ event void Timer.fired() { if (reading == NREADINGS) { if (!sendbusy) { oscilloscope_t *o = (oscilloscope_t *)call Send.getPayload(&sendbuf, sizeof(oscilloscope_t)); if (o == NULL) { fatal_problem(); return; } memcpy(o, &local, sizeof(local)); if (call Send.send(&sendbuf, sizeof(local)) == SUCCESS) sendbusy = TRUE; else report_problem(); } reading = 0; /* Part 2 of cheap "time sync": increment our count if we didn't jump ahead. */ if (!suppress_count_change) local.count++; suppress_count_change = FALSE; } if (call Read.read() != SUCCESS) fatal_problem(); } event void Send.sendDone(message_t* msg, error_t error) { if (error == SUCCESS) report_sent(); else report_problem(); sendbusy = FALSE; } event void Read.readDone(error_t result, uint16_t data) { if (result != SUCCESS) { data = 0xffff; report_problem(); } if (reading < NREADINGS) local.readings[reading++] = data; } // Use LEDs to report various status issues. static void fatal_problem() { call Leds.led0On(); call Leds.led1On(); call Leds.led2On(); call Timer.stop(); } static void report_problem() { call Leds.led0Toggle(); } static void report_sent() { call Leds.led1Toggle(); } static void report_received() { call Leds.led2Toggle(); } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/README.txt000066400000000000000000000033061207233610700232520ustar00rootroot00000000000000README for MultihopOscilloscopeLqi Author/Contact: tinyos-help@millennium.berkeley.edu Description: MultihopOscilloscope is a simple data-collection demo. This variant, MultihopOscilloscopeLqi, works only on platforms that have the CC2420. Rather than use CTP, it uses MultihopLqi (lib/net/lqi), which is much lighter weight but not quite as efficient or reliable. The application periodically samples the default sensor and broadcasts a message every few readings. These readings can be displayed by the Java "Oscilloscope" application found in the ./java subdirectory. The sampling rate starts at 1Hz, but can be changed from the Java application. You can compile MultihopOscilloscope with a sensor board's default sensor by compiling as follows: SENSORBOARD= make You can change the sensor used by editing MultihopOscilloscopeAppC.nc. Tools: The Java application displays readings it receives from motes running the MultihopOscilloscope demo via a serial forwarder. To run it, change to the ./java subdirectory and type: make java net.tinyos.sf.SerialForwarder -comm serial@: # e.g., java net.tinyos.sf.SerialForwarder -comm serial@/dev/ttyUSB0:mica2 # or java net.tinyos.sf.SerialForwarder -comm serial@COM2:telosb ./run The controls at the bottom of the screen allow you to zoom in or out the X axis, change the range of the Y axis, and clear all received data. You can change the color used to display a mote by clicking on its color in the mote table. Known bugs/limitations: None. See also: TEP 113: Serial Communications, TEP 119: Collection. Notes: MultihopOscilloscope configures a mote whose TOS_NODE_ID modulo 500 is zero to be a collection root. tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/java/000077500000000000000000000000001207233610700224735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/java/ColorCellEditor.java000066400000000000000000000032621207233610700263660ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; /* Editor for table cells representing colors. Popup a color chooser. */ public class ColorCellEditor extends AbstractCellEditor implements TableCellEditor { private Color color; private JButton button; public ColorCellEditor(String title) { button = new JButton(); final JColorChooser chooser = new JColorChooser(); final JDialog dialog = JColorChooser.createDialog (button, title, true, chooser, new ActionListener() { public void actionPerformed(ActionEvent e) { color = chooser.getColor(); } }, null); button.setBorderPainted(false); button.addActionListener (new ActionListener () { public void actionPerformed(ActionEvent e) { button.setBackground(color); chooser.setColor(color); dialog.setVisible(true); fireEditingStopped(); } } ); } public Object getCellEditorValue() { return color; } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { color = (Color)value; return button; } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/java/Data.java000066400000000000000000000040451207233610700242120ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import java.util.*; /* Hold all data received from motes */ class Data { /* The mote data is stored in a flat array indexed by a mote's identifier. A null value indicates no mote with that identifier. */ private Node[] nodes = new Node[256]; private Oscilloscope parent; Data(Oscilloscope parent) { this.parent = parent; } /* Data received from mote nodeId containing NREADINGS samples from messageId * NREADINGS onwards. Tell parent if this is a new node. */ void update(int nodeId, int messageId, int readings[]) { if (nodeId >= nodes.length) { int newLength = nodes.length * 2; if (nodeId >= newLength) newLength = nodeId + 1; Node newNodes[] = new Node[newLength]; System.arraycopy(nodes, 0, newNodes, 0, nodes.length); nodes = newNodes; } Node node = nodes[nodeId]; if (node == null) { nodes[nodeId] = node = new Node(nodeId); parent.newNode(nodeId); } node.update(messageId, readings); } /* Return value of sample x for mote nodeId, or -1 for missing data */ int getData(int nodeId, int x) { if (nodeId >= nodes.length || nodes[nodeId] == null) return -1; return nodes[nodeId].getData(x); } /* Return number of last known sample on mote nodeId. Returns 0 for unknown motes. */ int maxX(int nodeId) { if (nodeId >= nodes.length || nodes[nodeId] == null) return 0; return nodes[nodeId].maxX(); } /* Return number of largest known sample on all motes (0 if there are no motes) */ int maxX() { int max = 0; for (int i = 0; i < nodes.length; i++) if (nodes[i] != null) { int nmax = nodes[i].maxX(); if (nmax > max) max = nmax; } return max; } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/java/Graph.java000066400000000000000000000147621207233610700244110ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.font.*; import java.awt.geom.*; import java.util.*; /* Panel for drawing mote-data graphs */ class Graph extends JPanel { final static int BORDER_LEFT = 40; final static int BORDER_RIGHT = 0; final static int BORDER_TOP = 10; final static int BORDER_BOTTOM = 10; final static int TICK_SPACING = 40; final static int MAX_TICKS = 16; final static int TICK_WIDTH = 10; final static int MIN_WIDTH = 50; int gx0, gx1, gy0, gy1; // graph bounds int scale = 2; // gx1 - gx0 == MIN_WIDTH << scale Window parent; /* Graph to screen coordinate conversion support */ int height, width; double xscale, yscale; void updateConversion() { height = getHeight() - BORDER_TOP - BORDER_BOTTOM; width = getWidth() - BORDER_LEFT - BORDER_RIGHT; if (height < 1) height = 1; if (width < 1) width = 1; xscale = (double)width / (gx1 - gx0 + 1); yscale = (double)height / (gy1 - gy0 + 1); } Graphics makeClip(Graphics g) { return g.create(BORDER_LEFT, BORDER_TOP, width, height); } // Note that these do not include the border offset! int screenX(int gx) { return (int)(xscale * (gx - gx0) + 0.5); } int screenY(int gy) { return (int)(height - yscale * (gy - gy0)); } int graphX(int sx) { return (int)(sx / xscale + gx0 + 0.5); } Graph(Window parent) { this.parent = parent; gy0 = 0; gy1 = 0xffff; gx0 = 0; gx1 = MIN_WIDTH << scale; } void rightDrawString(Graphics2D g, String s, int x, int y) { TextLayout layout = new TextLayout(s, parent.smallFont, g.getFontRenderContext()); Rectangle2D bounds = layout.getBounds(); layout.draw(g, x - (float)bounds.getWidth(), y + (float)bounds.getHeight() / 2); } protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; /* Repaint. Synchronize on Oscilloscope to avoid data changing. Simply clear panel, draw Y axis and all the mote graphs. */ synchronized (parent.parent) { updateConversion(); g2d.setColor(Color.BLACK); g2d.fillRect(0, 0, getWidth(), getHeight()); drawYAxis(g2d); Graphics clipped = makeClip(g2d); int count = parent.moteListModel.size(); for (int i = 0; i < count; i++) { clipped.setColor(parent.moteListModel.getColor(i)); drawGraph(clipped, parent.moteListModel.get(i)); } } } /* Draw the Y-axis */ protected void drawYAxis(Graphics2D g) { int axis_x = BORDER_LEFT - 1; int height = getHeight() - BORDER_BOTTOM - BORDER_TOP; g.setColor(Color.WHITE); g.drawLine(axis_x, BORDER_TOP, axis_x, BORDER_TOP + height - 1); /* Draw a reasonable set of tick marks */ int nTicks = height / TICK_SPACING; if (nTicks > MAX_TICKS) nTicks = MAX_TICKS; int tickInterval = (gy1 - gy0 + 1) / nTicks; if (tickInterval == 0) tickInterval = 1; /* Tick interval should be of the family A * 10^B, where A = 1, 2 * or 5. We tend more to rounding A up, to reduce rather than increase the number of ticks. */ int B = (int)(Math.log(tickInterval) / Math.log(10)); int A = (int)(tickInterval / Math.pow(10, B) + 0.5); if (A > 2) A = 5; else if (A > 5) A = 10; tickInterval = A * (int)Math.pow(10, B); /* Ticks are printed at multiples of tickInterval */ int tick = ((gy0 + tickInterval - 1) / tickInterval) * tickInterval; while (tick <= gy1) { int stick = screenY(tick) + BORDER_TOP; rightDrawString(g, "" + tick, axis_x - TICK_WIDTH / 2 - 2, stick); g.drawLine(axis_x - TICK_WIDTH / 2, stick, axis_x - TICK_WIDTH / 2 + TICK_WIDTH, stick); tick += tickInterval; } } /* Draw graph for mote nodeId */ protected void drawGraph(Graphics g, int nodeId) { SingleGraph sg = new SingleGraph(g, nodeId); if (gx1 - gx0 >= width) // More points than pixels-iterate by pixel for (int sx = 0; sx < width; sx++) sg.nextPoint(g, graphX(sx), sx); else // Less points than pixel-iterate by points for (int gx = gx0; gx <= gx1; gx++) sg.nextPoint(g, gx, screenX(gx)); } /* Inner class to simplify drawing a graph. Simplify initialise it, then feed it the X screen and graph coordinates, from left to right. */ private class SingleGraph { int lastsx, lastsy, nodeId; /* Start drawing the graph mote id */ SingleGraph(Graphics g, int id) { nodeId = id; lastsx = -1; lastsy = -1; } /* Next point in mote's graph is at x value gx, screen coordinate sx */ void nextPoint(Graphics g, int gx, int sx) { int gy = parent.parent.data.getData(nodeId, gx); int sy = -1; if (gy >= 0) { // Ignore missing values double rsy = height - yscale * (gy - gy0); // Ignore problem values if (rsy >= -1e6 && rsy <= 1e6) sy = (int)(rsy + 0.5); if (lastsy >= 0 && sy >= 0) g.drawLine(lastsx, lastsy, sx, sy); } lastsx = sx; lastsy = sy; } } /* Update X-axis range in GUI */ void updateXLabel() { parent.xLabel.setText("X: " + gx0 + " - " + gx1); } /* Ensure that graph is nicely positioned on screen. max is the largest sample number received from any mote. */ private void recenter(int max) { // New data will show up at the 3/4 point // The 2nd term ensures that gx1 will be >= max int scrollby = ((gx1 - gx0) >> 2) + (max - gx1); gx0 += scrollby; gx1 += scrollby; if (gx0 < 0) { // don't bother showing negative sample numbers gx1 -= gx0; gx0 = 0; } updateXLabel(); } /* New data received. Redraw graph, scrolling if necessary */ void newData() { int max = parent.parent.data.maxX(); if (max > gx1 || max < gx0) // time to scroll recenter(max); repaint(); } /* User set the X-axis scale to newScale */ void setScale(int newScale) { gx1 = gx0 + (MIN_WIDTH << newScale); scale = newScale; recenter(parent.parent.data.maxX()); repaint(); } /* User attempted to set Y-axis range to newy0..newy1. Refuse bogus values (return false), or accept, redraw and return true. */ boolean setYAxis(int newy0, int newy1) { if (newy0 >= newy1 || newy0 < 0 || newy0 > 65535 || newy1 < 0 || newy1 > 65535) return false; gy0 = newy0; gy1 = newy1; repaint(); return true; } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/java/Makefile000066400000000000000000000010461207233610700241340ustar00rootroot00000000000000GEN=OscilloscopeMsg.java Constants.java all: oscilloscope.jar oscilloscope.jar: Oscilloscope.class jar cf $@ *.class OscilloscopeMsg.java: ../MultihopOscilloscope.h mig -target=null -java-classname=OscilloscopeMsg java ../MultihopOscilloscope.h oscilloscope -o $@ Constants.java: ../MultihopOscilloscope.h ncg -target=null -java-classname=Constants java ../MultihopOscilloscope.h NREADINGS DEFAULT_INTERVAL -o $@ Oscilloscope.class: $(wildcard *.java) $(GEN) javac *.java clean: rm -f *.class $(GEN) veryclean: clean rm oscilloscope.jar tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/java/Node.java000066400000000000000000000063161207233610700242310ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Class holding all data received from a mote. */ class Node { /* Data is hold in an array whose size is a multiple of INCREMENT, and INCREMENT itself must be a multiple of Constant.NREADINGS. This simplifies handling the extension and clipping of old data (see setEnd) */ final static int INCREMENT = 100 * Constants.NREADINGS; final static int MAX_SIZE = 100 * INCREMENT; // Must be multiple of INCREMENT /* The mote's identifier */ int id; /* Data received from the mote. data[0] is the dataStart'th sample Indexes 0 through dataEnd - dataStart - 1 hold data. Samples are 16-bit unsigned numbers, -1 indicates missing data. */ int[] data; int dataStart, dataEnd; Node(int _id) { id = _id; } /* Update data to hold received samples newDataIndex .. newEnd. If we receive data with a lower index, we discard newer data (we assume the mote rebooted). */ private void setEnd(int newDataIndex, int newEnd) { if (newDataIndex < dataStart || data == null) { /* New data is before the start of what we have. Just throw it all away and start again */ dataStart = newDataIndex; data = new int[INCREMENT]; } if (newEnd > dataStart + data.length) { /* Try extending first */ if (data.length < MAX_SIZE) { int newLength = (newEnd - dataStart + INCREMENT - 1) / INCREMENT * INCREMENT; if (newLength >= MAX_SIZE) newLength = MAX_SIZE; int[] newData = new int[newLength]; System.arraycopy(data, 0, newData, 0, data.length); data = newData; } if (newEnd > dataStart + data.length) { /* Still doesn't fit. Squish. We assume INCREMENT >= (newEnd - newDataIndex), and ensure that dataStart + data.length - INCREMENT = newDataIndex */ int newStart = newDataIndex + INCREMENT - data.length; if (dataStart + data.length > newStart) System.arraycopy(data, newStart - dataStart, data, 0, data.length - (newStart - dataStart)); dataStart = newStart; } } /* Mark any missing data as invalid */ for (int i = dataEnd < dataStart ? dataStart : dataEnd; i < newDataIndex; i++) data[i - dataStart] = -1; /* If we receive a count less than the old count, we assume the old data is invalid */ dataEnd = newEnd; } /* Data received containing NREADINGS samples from messageId * NREADINGS onwards */ void update(int messageId, int readings[]) { int start = messageId * Constants.NREADINGS; setEnd(start, start + Constants.NREADINGS); for (int i = 0; i < readings.length; i++) data[start - dataStart + i] = readings[i]; } /* Return value of sample x, or -1 for missing data */ int getData(int x) { if (x < dataStart || x >= dataEnd) return -1; else return data[x - dataStart]; } /* Return number of last known sample */ int maxX() { return dataEnd - 1; } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/java/Oscilloscope.java000066400000000000000000000076771207233610700260150ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import net.tinyos.message.*; import net.tinyos.util.*; import java.io.*; /* The "Oscilloscope" demo app. Displays graphs showing data received from the Oscilloscope mote application, and allows the user to: - zoom in or out on the X axis - set the scale on the Y axis - change the sampling period - change the color of each mote's graph - clear all data This application is in three parts: - the Node and Data objects store data received from the motes and support simple queries - the Window and Graph and miscellaneous support objects implement the GUI and graph drawing - the Oscilloscope object talks to the motes and coordinates the other objects Synchronization is handled through the Oscilloscope object. Any operation that reads or writes the mote data must be synchronized on Oscilloscope. Note that the messageReceived method below is synchronized, so no further synchronization is needed when updating state based on received messages. */ public class Oscilloscope implements MessageListener { MoteIF mote; Data data; Window window; /* The current sampling period. If we receive a message from a mote with a newer version, we update our interval. If we receive a message with an older version, we broadcast a message with the current interval and version. If the user changes the interval, we increment the version and broadcast the new interval and version. */ int interval = Constants.DEFAULT_INTERVAL; int version = -1; /* Main entry point */ void run() { data = new Data(this); window = new Window(this); window.setup(); mote = new MoteIF(PrintStreamMessenger.err); mote.registerListener(new OscilloscopeMsg(), this); } /* The data object has informed us that nodeId is a previously unknown mote. Update the GUI. */ void newNode(int nodeId) { window.newNode(nodeId); } synchronized public void messageReceived(int dest_addr, Message msg) { if (msg instanceof OscilloscopeMsg) { OscilloscopeMsg omsg = (OscilloscopeMsg)msg; /* Update interval and mote data */ periodUpdate(omsg.get_version(), omsg.get_interval()); data.update(omsg.get_id(), omsg.get_count(), omsg.get_readings()); /* Inform the GUI that new data showed up */ window.newData(); } } /* A potentially new version and interval has been received from the mote */ void periodUpdate(int moteVersion, int moteInterval) { if (moteVersion > version) { /* It's new. Update our vision of the interval. */ version = moteVersion; interval = moteInterval; window.updateSamplePeriod(); } else if (moteVersion < version) { /* It's old. Update the mote's vision of the interval. */ sendInterval(); } } /* The user wants to set the interval to newPeriod. Refuse bogus values and return false, or accept the change, broadcast it, and return true */ synchronized boolean setInterval(int newPeriod) { if (newPeriod < 1 || newPeriod > 65535) return false; interval = newPeriod; version++; sendInterval(); return true; } /* Broadcast a version+interval message. */ void sendInterval() { OscilloscopeMsg omsg = new OscilloscopeMsg(); omsg.set_version(version); omsg.set_interval(interval); try { mote.send(MoteIF.TOS_BCAST_ADDR, omsg); } catch (IOException e) { window.error("Cannot send message to mote"); } } /* User wants to clear all data. */ void clear() { data = new Data(this); } public static void main(String[] args) { Oscilloscope me = new Oscilloscope(); me.run(); } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/java/Window.java000066400000000000000000000207401207233610700246100ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import javax.swing.table.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; import java.util.*; /* The main GUI object. Build the GUI and coordinate all user activities */ class Window { Oscilloscope parent; Graph graph; Font smallFont = new Font("Dialog", Font.PLAIN, 8); Font boldFont = new Font("Dialog", Font.BOLD, 12); Font normalFont = new Font("Dialog", Font.PLAIN, 12); MoteTableModel moteListModel; // GUI view of mote list JLabel xLabel; // Label displaying X axis range JTextField sampleText, yText; // inputs for sample period and Y axis range JFrame frame; Window(Oscilloscope parent) { this.parent = parent; } /* A model for the mote table, and general utility operations on the mote list */ class MoteTableModel extends AbstractTableModel { private ArrayList motes = new ArrayList(); private ArrayList colors = new ArrayList(); /* Initial mote colors cycle through this list. Add more colors if you want. */ private Color[] cycle = { Color.RED, Color.WHITE, Color.GREEN, Color.MAGENTA, Color.YELLOW, Color.GRAY, Color.YELLOW }; int cycleIndex; /* TableModel methods for achieving our table appearance */ public String getColumnName(int col) { if (col == 0) return "Mote"; else return "Color"; } public int getColumnCount() { return 2; } public synchronized int getRowCount() { return motes.size(); } public synchronized Object getValueAt(int row, int col) { if (col == 0) return motes.get(row); else return colors.get(row); } public Class getColumnClass(int col) { return getValueAt(0, col).getClass(); } public boolean isCellEditable(int row, int col) { return col == 1; } public synchronized void setValueAt(Object value, int row, int col) { colors.set(row, value); fireTableCellUpdated(row, col); graph.repaint(); } /* Return mote id of i'th mote */ int get(int i) { return ((Integer)motes.get(i)).intValue(); } /* Return color of i'th mote */ Color getColor(int i) { return (Color)colors.get(i); } /* Return number of motes */ int size() { return motes.size(); } /* Add a new mote */ synchronized void newNode(int nodeId) { /* Shock, horror. No binary search. */ int i, len = motes.size(); for (i = 0; ; i++) if (i == len || nodeId < get(i)) { motes.add(i, new Integer(nodeId)); // Cycle through a set of initial colors colors.add(i, cycle[cycleIndex++ % cycle.length]); break; } fireTableRowsInserted(i, i); } /* Remove all motes */ void clear() { motes = new ArrayList(); colors = new ArrayList(); fireTableDataChanged(); } } /* A simple full-color cell */ static class MoteColor extends JLabel implements TableCellRenderer { public MoteColor() { setOpaque(true); } public Component getTableCellRendererComponent (JTable table, Object color, boolean isSelected, boolean hasFocus, int row, int column) { setBackground((Color)color); return this; } } /* Convenience methods for making buttons, labels and textfields. Simplifies code and ensures a consistent style. */ JButton makeButton(String label, ActionListener action) { JButton button = new JButton(); button.setText(label); button.setFont(boldFont); button.addActionListener(action); return button; } JLabel makeLabel(String txt, int alignment) { JLabel label = new JLabel(txt, alignment); label.setFont(boldFont); return label; } JLabel makeSmallLabel(String txt, int alignment) { JLabel label = new JLabel(txt, alignment); label.setFont(smallFont); return label; } JTextField makeTextField(int columns, ActionListener action) { JTextField tf = new JTextField(columns); tf.setFont(normalFont); tf.setMaximumSize(tf.getPreferredSize()); tf.addActionListener(action); return tf; } /* Build the GUI */ void setup() { JPanel main = new JPanel(new BorderLayout()); main.setMinimumSize(new Dimension(500, 250)); main.setPreferredSize(new Dimension(800, 400)); // Three panels: mote list, graph, controls moteListModel = new MoteTableModel(); JTable moteList = new JTable(moteListModel); moteList.setDefaultRenderer(Color.class, new MoteColor()); moteList.setDefaultEditor(Color.class, new ColorCellEditor("Pick Mote Color")); moteList.setPreferredScrollableViewportSize(new Dimension(100, 400)); JScrollPane motePanel = new JScrollPane(); motePanel.getViewport().add(moteList, null); main.add(motePanel, BorderLayout.WEST); graph = new Graph(this); main.add(graph, BorderLayout.CENTER); // Controls. Organised using box layouts. // Sample period. JLabel sampleLabel = makeLabel("Sample period (ms):", JLabel.RIGHT); sampleText = makeTextField(6, new ActionListener() { public void actionPerformed(ActionEvent e) { setSamplePeriod(); } } ); updateSamplePeriod(); // Clear data. JButton clearButton = makeButton("Clear data", new ActionListener() { public void actionPerformed(ActionEvent e) { clearData(); } } ); // Adjust X-axis zoom. Box xControl = new Box(BoxLayout.Y_AXIS); xLabel = makeLabel("", JLabel.CENTER); final JSlider xSlider = new JSlider(JSlider.HORIZONTAL, 0, 8, graph.scale); Hashtable xTable = new Hashtable(); for (int i = 0; i <= 8; i += 2) xTable.put(new Integer(i), makeSmallLabel("" + (Graph.MIN_WIDTH << i), JLabel.CENTER)); xSlider.setLabelTable(xTable); xSlider.setPaintLabels(true); graph.updateXLabel(); graph.setScale(graph.scale); xSlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { //if (!xSlider.getValueIsAdjusting()) graph.setScale((int)xSlider.getValue()); } }); xControl.add(xLabel); xControl.add(xSlider); // Adjust Y-axis range. JLabel yLabel = makeLabel("Y:", JLabel.RIGHT); yText = makeTextField(12, new ActionListener() { public void actionPerformed(ActionEvent e) { setYAxis(); } } ); yText.setText(graph.gy0 + " - " + graph.gy1); Box controls = new Box(BoxLayout.X_AXIS); controls.add(clearButton); controls.add(Box.createHorizontalGlue()); controls.add(Box.createRigidArea(new Dimension(20, 0))); controls.add(sampleLabel); controls.add(sampleText); controls.add(Box.createHorizontalGlue()); controls.add(Box.createRigidArea(new Dimension(20, 0))); controls.add(xControl); controls.add(yLabel); controls.add(yText); main.add(controls, BorderLayout.SOUTH); // The frame part frame = new JFrame("Oscilloscope"); frame.setSize(main.getPreferredSize()); frame.getContentPane().add(main); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } /* User operation: clear data */ void clearData() { synchronized (parent) { moteListModel.clear(); parent.clear(); graph.newData(); } } /* User operation: set Y-axis range. */ void setYAxis() { String val = yText.getText(); try { int dash = val.indexOf('-'); if (dash >= 0) { String min = val.substring(0, dash).trim(); String max = val.substring(dash + 1).trim(); if (!graph.setYAxis(Integer.parseInt(min), Integer.parseInt(max))) error("Invalid range " + min + " - " + max + " (expected values between 0 and 65535)"); return; } } catch (NumberFormatException e) { } error("Invalid range " + val + " (expected NN-MM)"); } /* User operation: set sample period. */ void setSamplePeriod() { String periodS = sampleText.getText().trim(); try { int newPeriod = Integer.parseInt(periodS); if (parent.setInterval(newPeriod)) return; } catch (NumberFormatException e) { } error("Invalid sample period " + periodS); } /* Notification: sample period changed. */ void updateSamplePeriod() { sampleText.setText("" + parent.interval); } /* Notification: new node. */ void newNode(int nodeId) { moteListModel.newNode(nodeId); } /* Notification: new data. */ void newData() { graph.newData(); } void error(String msg) { JOptionPane.showMessageDialog(frame, msg, "Error", JOptionPane.ERROR_MESSAGE); } } tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/java/build.xml000066400000000000000000000006201207233610700243120ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/java/oscilloscope.jar000066400000000000000000000447251207233610700257030ustar00rootroot00000000000000PK Vq5 META-INF/PK Vq5'Y00META-INF/MANIFEST.MFManifest-Version: 1.0 Created-By: 0.92-gcc-4.0 PK Vq5,ColorCellEditor$1.class}RmOA~=8{\~Ԙ&*&tɱ.ejGgL/ٙyynO;؜DX `)2VBA3j S#^F ˽C>⧙9 {х.; u;0ӻB*i_2d5Pj= TQ_xp[{Q~0ObF)kF ё|F|t2_B6K({Bj.;:.{ F_4Jg1Љاc#;KaZi\3eN: nP 7PK Vq5cѢ/ColorCellEditor.classTiOQ= 㰴QE.Rp-P`*`Hi!e<ߐD?xmi hw.s:?}`/U#.0̨JTHRх9y cyyੂg 2 El; }=H" CGPbbi&_xn X0-S,@e o `6C k8Coδ~;B<].\^+v!9#zMaU!VO-_lCfZy _5ESTaNykemT"0JqEʬL/Ki̋ɣ[S\u 1#y5<Ǣ!coSa]N 5O2A۰,dˆrW/ixe +ȶIJKȪ53\\ 0rQFH6)$tfKkEFeZ$mQvr(Lʙ&#\N;o r怞#m%M(.0_6u&G_$|Rda[t;B'dcbUw*8 ~u}/HTѵKT)3hVM z{):GbjRA1Aʌ6 -)AK994Jct%~~B=E00G3u.իEX<Z#D LK;:{mvx=;iRwH ӯ.>5PK Vq58>1!Constants.class=Ok@5j{ࡷփ"&Z6v)M< zy̾߿) tLtMuo؋hFhSuʄB p >V^lBY{e7SZn"y Dci~e?4ދo|HO&h/wPWttA&s ;[\~ΰ`:s4Y[ZPK Vq5 )sɃ Data.classmR]OQ=ҺE*-lMx/,e%%mQy`L|A)F#1깷ǝ33??d& tp =Bч065$#D€k`X^,mzvִWU٥J._(*Ҿꬂs9XQ=bl/mf'-Jp25W؞g WTTGr頜JHz/<au4hAH蘁q3]4ŢzV,x殟ʖ+ˇ^rCZ9ϑ\RBeW//%SAG^K 6B:ڠ)P܈@uO}โv6h"2B(+oҏRQ5HcaRj}'YQMҢӺ1])1]tgMv[:_XN\Kk<Ьft1YB9eEكbo5Mk/)!l m`n}d@Of}si:ӴYa:` BS`5buIJX9" zn mO|Ihq-MC>?Zp?)d 8|Xǧ707PO ɇqV^܁ωB>//KTv |Q)ݲG}Iv|ه{Wu|͇\}2/!u!'CķDQdzP:ITOZ1(0iJ٬k[lv*P &7Sٜʭ5 w9jkWt |suH|H\]Ѧ:ڗ6EW-Wm[~:DO hs Y*@gpM !ZLZ }fJxbxz-Vg e@"cAG[idșfb[l"`ZjS:X"ede:Mkn>`"b5IMtgkKep0Z- xQD*;WCNR@3@G. TPWƂ0iz Ѩg&Rto_:eizsS q՜*Qʖ(v}d%MV*)k̙\Z…@ 8:n5!>ɩw]"j{mnuB6* %dLO>~`q|c؜N:\Jtgl{ϟH^ H@7:^6 ^53/p@9=bx]~%ao .2Џ V6te?O"f/O$c3"m jmF Ac ) $I$_4tvl2o_;V9 qޙSr5n=VnK(PϩG FXB X ,rB^3lMKjt%+9^9qV?J[GkkF,ݟ3Y=Xކ5V7-/8c\G ,VD2v,RmJ'ӬmYliJؑ+0:Zӂźg3MɈQ87bl->s{:N{{J.0lbU(yƗ]T`DVD;[.>}}m+N,tIhf{6xs KzQ"r^SW9ȇ=^78#)ckmq-CA\`ʼnڋ2u'J;LQ**GCU۱ o9jbŝaj٦pwIKEٸ.{c(SBCCxCSGMM@LZ+V m 3ۊ*,gVPg8:ŴpXUiyL_³r1掻~rjSUc+ PCUadO</?mO]c]=Yy_rIIP]H-ǜ抸uUO47BGHNneo^J洜$< .B%3_NM#f[A⪞ZH4-!%'zgˈUނ *S-?e? }QQ;LFԀGq Ɉn[q!*&M` aNnJv1E`r@EH;DހF-жD<مh(Toc @C>̫?5x8-L6%jڌx;VbX1;pNsXݵyf-0 oɥW>\؎q50ƵxߦX:u+oMvPfN_UBI.I;1> y!*=j;J.Q"+J{Lk5n)@hnf::e.*mMYLf+x<s~Yl)Fm7.uq^Q9M8[l.2qΘm>F,<`?~ZXφf~)O@NbP-%Cw B7[:;>`q`>cG8qt碟8PK Vq5_{ Node.classmSOQ.UP Yh(Ţ5PŊhJJKH⑃W/iHp1A ē/x{47~a U89/'qJEڣ*cb43-Vl`|٢Lv5,18r&7 9M ^!'md3(B(=+(=)bEbhDyi*MsyW,[fBq./iiQ-,($_2^08CBQr)k7Ae‹sÇ}hχAW!Z 턕5H(G&-S8+DERXWCEsWiKnB|aq]DoJ."8A'I)A\w`1Ba .wS}a{ E" pS6'4 v*xp ^fwU0,&Eeyzߵvk\;a;6~p$(fFmBd#) V"{wnJMj t䚓m;P꣙~F`+zhW0+M,`\K+`c{FƱQ[O/ zy2;8xUOq{vP+Ӵv !a<"ӵBQڵӵ}6E o4NjXĈˁr,nygPK Vq5hVOscilloscope.classUmSW~6 Y %R`*j[^ll"$t5Mw7 ڗя8)atگQ٤RuLνsϿ~ )| LS"8r!'i3mŵq]7tǤhfA7E܊S--bI?;">0a Ԋ|+ btIE_4Dʎ4$r3e;^<,4ShT0}SC47e5 [Vj4hY r=˱iwuvqr"+U3G=IH?t)Mgw?Ag 7]9prGp7qXEz I\duW3t$&"?2=G%\ҋt+"|W<}{-[m+7$k8*kcRȞ#C5$cZB|;z@YFlVib;=6cg_.:k!+R6苎-pvwcxKsPK Vq5T=<OscilloscopeMsg.classW]p>ג%DM~d)Bb?r"*c7Xkyrc i&iB mCgiǦ!Cۧv"̟Nqinp@p.jg@g]=/Y<z m>~G{}_^+q󪋼;9}(ʧ9Ugd L1d2ָ 't" =덡> сQs8 U9ߗWә\ߢI)o8kC4$YEMC='e/-G%*'glNɨKAJn(N|NίB _=sƒ;U t9lL=|-y9,BV VQS@zNV11|n$#WLJE๹2=掔(!dII9 f-sGR}.i"jJMPRC,% WIj{9^qcQS3Ӆ7hIEY\mYy}L^J'ΎTF\ `opjaqT"ouSv%2<>SLn.$R|7{h7p 7 268` ?bټo J:)g9~ާ`pF?VDQ']'.CBF(Ԥ2QOʜ/nwD,-Aʼn½Im>n̵V\ǸKޭ/$Â"EiTS~F?iOss,"JmTK唔ʦ T^$,} WCtvpA I5sJ z]C/4fY ^'O/ !--*PaZ} l؝<*M֧3ᘚ꽧_Y؛)fUSԅK^\h vR/1f0b%xzc[.RG02& 5Sݫswۀ9MLDimjKX#[ ni[>P6F #mD>X65vޯqunG 5r <t.Pd.{V=hyy^E2{7iz\UrD*5N-| JUW|E\F"nF"nF-6ާݕK[y*uz38~]i%2Ch ݃9&1 :Eg0>EHf̎(0y`zif{c͂%w.SH8>-0F k'aҿfmС7\YF+wvہ7^w:2wv<;X9Y~;tu+]M#h7RczW$_CEq j)  Window.classX xTdd (NbD@!"$I@їcLg&$*m֥.jmZRܺh[KֶZWz{/L2u8sѭwKj8A{4xpgV!9! ]|)dܭaW*pB~)WBX ~a@L P^!9 0T?i-fQx\COBRz3s*,)y*^Pӿ*xI"<$ŗeT/ KWa9S7zM>{CC+To m⸷4GChс#'Ӱl"><*(p5T"*S|B4)4^CO1B5 MҐâ4MMa°SiT ?Ft*`chB4KvV  ^HjN9 |ɬٜ'-0q#13 莛Ɉ'JLO,Ofz)PM}LxkR'o1 FAv'gQK$,|#c{D$?PF(h7Ed >А% G\^2Fo*n5vZ0[cf<"owDJ7^s \pűD,9BEuo3+%ffg_oUe%zl6 9n ܕM3~Ӱcmنe=X2!09M58H\u)VS)d_<^ywCmMWfl_Pz⦑n1WbTyef%L_*bdB0;mzCm' L%[+.ZW/c$9D$u\kdжČx2ʫto:.rp>aR(Ԁt:tc3z\ sN p Pe^tLۓ}YA^[bf"ÁFhNh·Gk2'vukN62s?4r #)컄O̼qJˀʣfvMĽӌtv"[>-u޾^GrjVXq:S06!n<`yf6BUo*fbjqAZMF_<{/-%[ mˇ f,0n".fk4GeCF]CKM50f 3e tT2>:7dz LܺpP_Vr;+Vje5tX dT۱04V"e}Ξ[pVHoo5F,lxd,J`>/ۋ\jm,]kZg&SBڢ)dWEjS&MxU2mÈ9G"xZx.]8gDu=H%c˕w|&܎9ǻ %$VtN-^}MM~ug)қ壗',o&m{survqt`s _@kqiEfsd:SOYE/9i!-eNjbwǡ=d# ~M(APm"ru(u]_wںPwnX`ͽ`sca&'zyY_ga\}(ϱ0<21w8qruՃ•@gOς;y~'!C8?9?T]U&*UI&[˦|8G;?ŵjI}:p_A^CUު{( VЅ60G53rfef 90+ tP_3Z us<2Ÿ,yH'0,ZWk0F'wcAC/.\lFommyYDBn,f%TGZXXw͍e޹+rh K X9UJmQjJ_z%Wκtr*}X8е~s;J@6x-'ca} ([8>PK+,>PPdhcNKNȢ]5ϳ~r>,%b6gb{2/W^gdşB}]eVE̓^¥B\z+^|hRRb, a.i3ƲJQ?Kl. .R 7^܄G[!rTۨS˰V.tKiOډyx.֒%gdH۴v3眽7+Nõ(#(ȋC1ÝP1"fTGb>3&(Q\`BR'|SnSm|*؁˲2%ToZ➊kԜkUSi1{NATJJUSHcMe޻]6(yfV}HaҲ˵yt޲-Є`Vf6GfLgܘM%܌=bpߗ5]I]Dz+݊lWA 1D ]t}_ :gOהgܵFMg3f-[nkH* L}̶z q9h ZslmV7XCO+I]XsJUKt5>*4$qXd !k8A oa`aVb1u18D6Ü 384i5cA<%Jx -+"m׬,]E=hH`HxGIk8( S*[hwhy6dn!UKcY'~(7͎Xӹxg I*K5ev?͑ۚhuCb޵ 2gˆk9射QqivQBǜ5,;ZoI( kvt<6W L3,c/C CFBɂЁXLFMPp/O^|K.# 'c_P"E=΢Z}K*Y¦ fmIF䳇 㗽"ɧtNϱF2vq}'ʳ_% ޳"%0t?q#zrݦL:{0ȮR_4]}]~T42%GρPK Vq5 META-INF/PK Vq5'Y00'META-INF/MANIFEST.MFPK Vq5,ColorCellEditor$1.classPK Vq5S$h%ZWColorCellEditor$2.classPK Vq5cѢ/ColorCellEditor.classPK Vq58>1!<Constants.classPK Vq5 )sɃ M Data.classPK Vq5$EN1  Graph.classPK Vq5DcRGraph$SingleGraph.classPK Vq5_{ Node.classPK Vq5hV"Oscilloscope.classPK Vq5T=< OscilloscopeMsg.classPK Vq53[ )Window$1.classPK Vq5#'[W*Window$2.classPK Vq5`,Window$3.classPK Vq5Z.Window$4.classPK Vq5Q/Window$5.classPK Vq5I>)  1Window.classPK Vq5k%>Window$MoteColor.classPK Vq5?Window$MoteTableModel.classPKDtinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/java/run000077500000000000000000000002451207233610700232260ustar00rootroot00000000000000#!/bin/sh if cygpath -w / >/dev/null 2>/dev/null; then CLASSPATH="oscilloscope.jar;$CLASSPATH" else CLASSPATH="oscilloscope.jar:$CLASSPATH" fi java Oscilloscope tinyos-2.1.2+dfsg/apps/MultihopOscilloscopeLqi/oscilloscope.py000077500000000000000000000014721207233610700246310ustar00rootroot00000000000000#!/usr/bin/env python import sys import tos AM_OSCILLOSCOPE = 0x93 class OscilloscopeMsg(tos.Packet): def __init__(self, packet = None): tos.Packet.__init__(self, [('version', 'int', 2), ('interval', 'int', 2), ('id', 'int', 2), ('count', 'int', 2), ('readings', 'blob', None)], packet) if '-h' in sys.argv: print "Usage:", sys.argv[0], "serial@/dev/ttyUSB0:57600" sys.exit() am = tos.AM() while True: p = am.read() if p and p.type == AM_OSCILLOSCOPE: msg = OscilloscopeMsg(p.data) print msg.id, msg.count, [i<<8 | j for (i,j) in zip(msg.readings[::2], msg.readings[1::2])] #print msg tinyos-2.1.2+dfsg/apps/Null/000077500000000000000000000000001207233610700156365ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/Null/Makefile000066400000000000000000000000511207233610700172720ustar00rootroot00000000000000COMPONENT=NullAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/Null/NullAppC.nc000066400000000000000000000046671207233610700176530ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Null is an empty skeleton application. It is useful to test that the * build environment is functional in its most minimal sense, i.e., you * can correctly compile an application. It is also useful to test the * minimum power consumption of a node when it has absolutely no * interrupts or resources active. * * @author Cory Sharp * @date February 4, 2006 */ configuration NullAppC{} implementation { components MainC, NullC; MainC.Boot <- NullC; } tinyos-2.1.2+dfsg/apps/Null/NullC.nc000066400000000000000000000047161207233610700172050ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Null is an empty skeleton application. It is useful to test that the * build environment is functional in its most minimal sense, i.e., you * can correctly compile an application. It is also useful to test the * minimum power consumption of a node when it has absolutely no * interrupts or resources active. * * @author Cory Sharp * @date February 4, 2006 */ module NullC @safe() { uses interface Boot; } implementation { event void Boot.booted() { // Do nothing. } } tinyos-2.1.2+dfsg/apps/Null/README.txt000066400000000000000000000010451207233610700173340ustar00rootroot00000000000000$Id: README.txt,v 1.4 2006-12-12 18:22:48 vlahan Exp $ README for Null Author/Contact: tinyos-help@millennium.berkeley.edu @author Cory Sharp Description: Null is an empty skeleton application. It is useful to test that the build environment is functional in its most minimal sense, i.e., you can correctly compile an application. It is also useful to test the minimum power consumption of a node when it has absolutely no interrupts or resources active. Tools: None. Known bugs/limitations: Hahaha. Seriously. tinyos-2.1.2+dfsg/apps/Oscilloscope/000077500000000000000000000000001207233610700173625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/Oscilloscope/Makefile000066400000000000000000000000611207233610700210170ustar00rootroot00000000000000COMPONENT=OscilloscopeAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/Oscilloscope/Oscilloscope.h000066400000000000000000000017111207233610700221710ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ // @author David Gay #ifndef OSCILLOSCOPE_H #define OSCILLOSCOPE_H enum { /* Number of readings per message. If you increase this, you may have to increase the message_t size. */ NREADINGS = 10, /* Default sampling period. */ DEFAULT_INTERVAL = 256, AM_OSCILLOSCOPE = 0x93 }; typedef nx_struct oscilloscope { nx_uint16_t version; /* Version of the interval. */ nx_uint16_t interval; /* Samping period. */ nx_uint16_t id; /* Mote id of sending mote. */ nx_uint16_t count; /* The readings are samples count * NREADINGS onwards */ nx_uint16_t readings[NREADINGS]; } oscilloscope_t; #endif tinyos-2.1.2+dfsg/apps/Oscilloscope/OscilloscopeAppC.nc000066400000000000000000000020701207233610700231050ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Oscilloscope demo application. Uses the demo sensor - change the * new DemoSensorC() instantiation if you want something else. * * See README.txt file in this directory for usage instructions. * * @author David Gay */ configuration OscilloscopeAppC { } implementation { components OscilloscopeC, MainC, ActiveMessageC, LedsC, new TimerMilliC(), new DemoSensorC() as Sensor, new AMSenderC(AM_OSCILLOSCOPE), new AMReceiverC(AM_OSCILLOSCOPE); OscilloscopeC.Boot -> MainC; OscilloscopeC.RadioControl -> ActiveMessageC; OscilloscopeC.AMSend -> AMSenderC; OscilloscopeC.Receive -> AMReceiverC; OscilloscopeC.Timer -> TimerMilliC; OscilloscopeC.Read -> Sensor; OscilloscopeC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/Oscilloscope/OscilloscopeC.nc000066400000000000000000000070701207233610700224510ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Oscilloscope demo application. See README.txt file in this directory. * * @author David Gay */ #include "Timer.h" #include "Oscilloscope.h" module OscilloscopeC @safe() { uses { interface Boot; interface SplitControl as RadioControl; interface AMSend; interface Receive; interface Timer; interface Read; interface Leds; } } implementation { message_t sendBuf; bool sendBusy; /* Current local state - interval, version and accumulated readings */ oscilloscope_t local; uint8_t reading; /* 0 to NREADINGS */ /* When we head an Oscilloscope message, we check it's sample count. If it's ahead of ours, we "jump" forwards (set our count to the received count). However, we must then suppress our next count increment. This is a very simple form of "time" synchronization (for an abstract notion of time). */ bool suppressCountChange; // Use LEDs to report various status issues. void report_problem() { call Leds.led0Toggle(); } void report_sent() { call Leds.led1Toggle(); } void report_received() { call Leds.led2Toggle(); } event void Boot.booted() { local.interval = DEFAULT_INTERVAL; local.id = TOS_NODE_ID; if (call RadioControl.start() != SUCCESS) report_problem(); } void startTimer() { call Timer.startPeriodic(local.interval); reading = 0; } event void RadioControl.startDone(error_t error) { startTimer(); } event void RadioControl.stopDone(error_t error) { } event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) { oscilloscope_t *omsg = payload; report_received(); /* If we receive a newer version, update our interval. If we hear from a future count, jump ahead but suppress our own change */ if (omsg->version > local.version) { local.version = omsg->version; local.interval = omsg->interval; startTimer(); } if (omsg->count > local.count) { local.count = omsg->count; suppressCountChange = TRUE; } return msg; } /* At each sample period: - if local sample buffer is full, send accumulated samples - read next sample */ event void Timer.fired() { if (reading == NREADINGS) { if (!sendBusy && sizeof local <= call AMSend.maxPayloadLength()) { // Don't need to check for null because we've already checked length // above memcpy(call AMSend.getPayload(&sendBuf, sizeof(local)), &local, sizeof local); if (call AMSend.send(AM_BROADCAST_ADDR, &sendBuf, sizeof local) == SUCCESS) sendBusy = TRUE; } if (!sendBusy) report_problem(); reading = 0; /* Part 2 of cheap "time sync": increment our count if we didn't jump ahead. */ if (!suppressCountChange) local.count++; suppressCountChange = FALSE; } if (call Read.read() != SUCCESS) report_problem(); } event void AMSend.sendDone(message_t* msg, error_t error) { if (error == SUCCESS) report_sent(); else report_problem(); sendBusy = FALSE; } event void Read.readDone(error_t result, uint16_t data) { if (result != SUCCESS) { data = 0xffff; report_problem(); } if (reading < NREADINGS) local.readings[reading++] = data; } } tinyos-2.1.2+dfsg/apps/Oscilloscope/README.txt000066400000000000000000000026551207233610700210700ustar00rootroot00000000000000README for Oscilloscope Author/Contact: tinyos-help@millennium.berkeley.edu Description: Oscilloscope is a simple data-collection demo. It periodically samples the default sensor and broadcasts a message over the radio every 10 readings. These readings can be received by a BaseStation mote and displayed by the Java "Oscilloscope" application found in the java subdirectory. The sampling rate starts at 4Hz, but can be changed from the Java application. You can compile Oscilloscope with a sensor board's default sensor by compiling as follows: SENSORBOARD= make You can change the sensor used by editing OscilloscopeAppC.nc. Tools: To display the readings from Oscilloscope motes, install the BaseStation application on a mote connected to your PC's serial port. Then run the Oscilloscope display application found in the java subdirectory, as follows: cd java make java net.tinyos.sf.SerialForwarder -comm serial@: # e.g., java net.tinyos.sf.SerialForwarder -comm serial@/dev/ttyUSB0:mica2 # or java net.tinyos.sf.SerialForwarder -comm serial@COM2:telosb ./run The controls at the bottom of the screen allow you to zoom in or out the X axis, change the range of the Y axis, and clear all received data. You can change the color used to display a mote by clicking on its color in the mote table. Known bugs/limitations: None. $Id: README.txt,v 1.6 2008-07-25 03:01:45 regehr Exp $ tinyos-2.1.2+dfsg/apps/Oscilloscope/java/000077500000000000000000000000001207233610700203035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/Oscilloscope/java/ColorCellEditor.java000066400000000000000000000034221207233610700241740ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; /* Editor for table cells representing colors. Popup a color chooser. */ public class ColorCellEditor extends AbstractCellEditor implements TableCellEditor { private Color color; private JButton button; public ColorCellEditor(String title) { button = new JButton(); final JColorChooser chooser = new JColorChooser(); final JDialog dialog = JColorChooser.createDialog (button, title, true, chooser, new ActionListener() { public void actionPerformed(ActionEvent e) { color = chooser.getColor(); } }, null); button.setBorderPainted(false); button.addActionListener (new ActionListener () { public void actionPerformed(ActionEvent e) { button.setBackground(color); chooser.setColor(color); dialog.setVisible(true); fireEditingStopped(); } } ); } public Object getCellEditorValue() { return color; } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { color = (Color)value; return button; } } tinyos-2.1.2+dfsg/apps/Oscilloscope/java/Data.java000066400000000000000000000042401207233610700220170ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import java.util.*; /* Hold all data received from motes */ class Data { /* The mote data is stored in a flat array indexed by a mote's identifier. A null value indicates no mote with that identifier. */ private Node[] nodes = new Node[256]; private Oscilloscope parent; Data(Oscilloscope parent) { this.parent = parent; } /* Data received from mote nodeId containing NREADINGS samples from messageId * NREADINGS onwards. Tell parent if this is a new node. */ void update(int nodeId, int messageId, int readings[]) { if (nodeId >= nodes.length) { int newLength = nodes.length * 2; if (nodeId >= newLength) { newLength = nodeId + 1; } Node newNodes[] = new Node[newLength]; System.arraycopy(nodes, 0, newNodes, 0, nodes.length); nodes = newNodes; } Node node = nodes[nodeId]; if (node == null) { nodes[nodeId] = node = new Node(nodeId); parent.newNode(nodeId); } node.update(messageId, readings); } /* Return value of sample x for mote nodeId, or -1 for missing data */ int getData(int nodeId, int x) { if (nodeId >= nodes.length || nodes[nodeId] == null) return -1; return nodes[nodeId].getData(x); } /* Return number of last known sample on mote nodeId. Returns 0 for unknown motes. */ int maxX(int nodeId) { if (nodeId >= nodes.length || nodes[nodeId] == null) return 0; return nodes[nodeId].maxX(); } /* Return number of largest known sample on all motes (0 if there are no motes) */ int maxX() { int max = 0; for (int i = 0; i < nodes.length; i++) { if (nodes[i] != null) { int nmax = nodes[i].maxX(); if (nmax > max) max = nmax; } } return max; } } tinyos-2.1.2+dfsg/apps/Oscilloscope/java/Graph.java000066400000000000000000000156561207233610700222240ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.font.*; import java.awt.geom.*; import java.util.*; /* Panel for drawing mote-data graphs */ class Graph extends JPanel { final static int BORDER_LEFT = 40; final static int BORDER_RIGHT = 0; final static int BORDER_TOP = 10; final static int BORDER_BOTTOM = 10; final static int TICK_SPACING = 40; final static int MAX_TICKS = 16; final static int TICK_WIDTH = 10; final static int MIN_WIDTH = 50; int gx0, gx1, gy0, gy1; // graph bounds int scale = 2; // gx1 - gx0 == MIN_WIDTH << scale Window parent; /* Graph to screen coordinate conversion support */ int height, width; double xscale, yscale; void updateConversion() { height = getHeight() - BORDER_TOP - BORDER_BOTTOM; width = getWidth() - BORDER_LEFT - BORDER_RIGHT; if (height < 1) { height = 1; } if (width < 1) { width = 1; } xscale = (double)width / (gx1 - gx0 + 1); yscale = (double)height / (gy1 - gy0 + 1); } Graphics makeClip(Graphics g) { return g.create(BORDER_LEFT, BORDER_TOP, width, height); } // Note that these do not include the border offset! int screenX(int gx) { return (int)(xscale * (gx - gx0) + 0.5); } int screenY(int gy) { return (int)(height - yscale * (gy - gy0)); } int graphX(int sx) { return (int)(sx / xscale + gx0 + 0.5); } Graph(Window parent) { this.parent = parent; gy0 = 0; gy1 = 0xffff; gx0 = 0; gx1 = MIN_WIDTH << scale; } void rightDrawString( Graphics2D g, String s, int x, int y) { TextLayout layout = new TextLayout(s, parent.smallFont, g.getFontRenderContext()); Rectangle2D bounds = layout.getBounds(); layout.draw(g, x - (float)bounds.getWidth(), y + (float)bounds.getHeight() / 2); } protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; /* Repaint. Synchronize on Oscilloscope to avoid data changing. Simply clear panel, draw Y axis and all the mote graphs. */ synchronized (parent.parent) { updateConversion(); g2d.setColor(Color.BLACK); g2d.fillRect(0, 0, getWidth(), getHeight()); drawYAxis(g2d); Graphics clipped = makeClip(g2d); int count = parent.moteListModel.size(); for (int i = 0; i < count; i++) { clipped.setColor(parent.moteListModel.getColor(i)); drawGraph(clipped, parent.moteListModel.get(i)); } } } /* Draw the Y-axis */ protected void drawYAxis(Graphics2D g) { int axis_x = BORDER_LEFT - 1; int height = getHeight() - BORDER_BOTTOM - BORDER_TOP; g.setColor(Color.WHITE); g.drawLine(axis_x, BORDER_TOP, axis_x, BORDER_TOP + height - 1); /* Draw a reasonable set of tick marks */ int nTicks = height / TICK_SPACING; if (nTicks > MAX_TICKS) { nTicks = MAX_TICKS; } int tickInterval = (gy1 - gy0 + 1) / nTicks; if (tickInterval == 0) { tickInterval = 1; } /* Tick interval should be of the family A * 10^B, where A = 1, 2 * or 5. We tend more to rounding A up, to reduce rather than increase the number of ticks. */ int B = (int)(Math.log(tickInterval) / Math.log(10)); int A = (int)(tickInterval / Math.pow(10, B) + 0.5); if (A > 2) { A = 5; } else if (A > 5) { A = 10; } tickInterval = A * (int)Math.pow(10, B); /* Ticks are printed at multiples of tickInterval */ int tick = ((gy0 + tickInterval - 1) / tickInterval) * tickInterval; while (tick <= gy1) { int stick = screenY(tick) + BORDER_TOP; rightDrawString(g, "" + tick, axis_x - TICK_WIDTH / 2 - 2, stick); g.drawLine(axis_x - TICK_WIDTH / 2, stick, axis_x - TICK_WIDTH / 2 + TICK_WIDTH, stick); tick += tickInterval; } } /* Draw graph for mote nodeId */ protected void drawGraph(Graphics g, int nodeId) { SingleGraph sg = new SingleGraph(g, nodeId); if (gx1 - gx0 >= width) { for (int sx = 0; sx < width; sx++) sg.nextPoint(g, graphX(sx), sx); } else { for (int gx = gx0; gx <= gx1; gx++) sg.nextPoint(g, gx, screenX(gx)); } } /* Inner class to simplify drawing a graph. Simplify initialise it, then feed it the X screen and graph coordinates, from left to right. */ private class SingleGraph { int lastsx, lastsy, nodeId; /* Start drawing the graph mote id */ SingleGraph(Graphics g, int id) { nodeId = id; lastsx = -1; lastsy = -1; } /* Next point in mote's graph is at x value gx, screen coordinate sx */ void nextPoint(Graphics g, int gx, int sx) { int gy = parent.parent.data.getData(nodeId, gx); int sy = -1; if (gy >= 0) { // Ignore missing values double rsy = height - yscale * (gy - gy0); // Ignore problem values if (rsy >= -1e6 && rsy <= 1e6) { sy = (int)(rsy + 0.5); } if (lastsy >= 0 && sy >= 0) { g.drawLine(lastsx, lastsy, sx, sy); } } lastsx = sx; lastsy = sy; } } /* Update X-axis range in GUI */ void updateXLabel() { parent.xLabel.setText("X: " + gx0 + " - " + gx1); } /* Ensure that graph is nicely positioned on screen. max is the largest sample number received from any mote. */ private void recenter(int max) { // New data will show up at the 3/4 point // The 2nd term ensures that gx1 will be >= max int scrollby = ((gx1 - gx0) >> 2) + (max - gx1); gx0 += scrollby; gx1 += scrollby; if (gx0 < 0) { // don't bother showing negative sample numbers gx1 -= gx0; gx0 = 0; } updateXLabel(); } /* New data received. Redraw graph, scrolling if necessary */ void newData() { int max = parent.parent.data.maxX(); if (max > gx1 || max < gx0) { recenter(max); } repaint(); } /* User set the X-axis scale to newScale */ void setScale(int newScale) { gx1 = gx0 + (MIN_WIDTH << newScale); scale = newScale; recenter(parent.parent.data.maxX()); repaint(); } /* User attempted to set Y-axis range to newy0..newy1. Refuse bogus values (return false), or accept, redraw and return true. */ boolean setYAxis(int newy0, int newy1) { if (newy0 >= newy1 || newy0 < 0 || newy0 > 65535 || newy1 < 0 || newy1 > 65535) { return false; } gy0 = newy0; gy1 = newy1; repaint(); return true; } } tinyos-2.1.2+dfsg/apps/Oscilloscope/java/Makefile000066400000000000000000000010061207233610700217400ustar00rootroot00000000000000GEN=OscilloscopeMsg.java Constants.java all: oscilloscope.jar oscilloscope.jar: Oscilloscope.class jar cf $@ *.class OscilloscopeMsg.java: ../Oscilloscope.h mig -target=null -java-classname=OscilloscopeMsg java ../Oscilloscope.h oscilloscope -o $@ Constants.java: ../Oscilloscope.h ncg -target=null -java-classname=Constants java ../Oscilloscope.h NREADINGS DEFAULT_INTERVAL -o $@ Oscilloscope.class: $(wildcard *.java) $(GEN) javac *.java clean: rm -f *.class $(GEN) veryclean: clean rm oscilloscope.jar tinyos-2.1.2+dfsg/apps/Oscilloscope/java/Node.java000066400000000000000000000066661207233610700220510ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Class holding all data received from a mote. */ class Node { /* Data is hold in an array whose size is a multiple of INCREMENT, and INCREMENT itself must be a multiple of Constant.NREADINGS. This simplifies handling the extension and clipping of old data (see setEnd) */ final static int INCREMENT = 100 * Constants.NREADINGS; final static int MAX_SIZE = 100 * INCREMENT; // Must be multiple of INCREMENT /* The mote's identifier */ int id; /* Data received from the mote. data[0] is the dataStart'th sample Indexes 0 through dataEnd - dataStart - 1 hold data. Samples are 16-bit unsigned numbers, -1 indicates missing data. */ int[] data; int dataStart, dataEnd; Node(int _id) { id = _id; } /* Update data to hold received samples newDataIndex .. newEnd. If we receive data with a lower index, we discard newer data (we assume the mote rebooted). */ private void setEnd(int newDataIndex, int newEnd) { if (newDataIndex < dataStart || data == null) { /* New data is before the start of what we have. Just throw it all away and start again */ dataStart = newDataIndex; data = new int[INCREMENT]; } if (newEnd > dataStart + data.length) { /* Try extending first */ if (data.length < MAX_SIZE) { int newLength = (newEnd - dataStart + INCREMENT - 1) / INCREMENT * INCREMENT; if (newLength >= MAX_SIZE) { newLength = MAX_SIZE; } int[] newData = new int[newLength]; System.arraycopy(data, 0, newData, 0, data.length); data = newData; } if (newEnd > dataStart + data.length) { /* Still doesn't fit. Squish. We assume INCREMENT >= (newEnd - newDataIndex), and ensure that dataStart + data.length - INCREMENT = newDataIndex */ int newStart = newDataIndex + INCREMENT - data.length; if (dataStart + data.length > newStart) { System.arraycopy(data, newStart - dataStart, data, 0, data.length - (newStart - dataStart)); } dataStart = newStart; } } /* Mark any missing data as invalid */ for (int i = dataEnd < dataStart ? dataStart : dataEnd; i < newDataIndex; i++) { data[i - dataStart] = -1; } /* If we receive a count less than the old count, we assume the old data is invalid */ dataEnd = newEnd; } /* Data received containing NREADINGS samples from messageId * NREADINGS onwards */ void update(int messageId, int[] readings) { int start = messageId * Constants.NREADINGS; setEnd(start, start + Constants.NREADINGS); for (int i = 0; i < readings.length; i++) { data[start - dataStart + i] = readings[i]; } } /* Return value of sample x, or -1 for missing data */ int getData(int x) { if (x < dataStart || x >= dataEnd) { return -1; } else { return data[x - dataStart]; } } /* Return number of last known sample */ int maxX() { return dataEnd - 1; } } tinyos-2.1.2+dfsg/apps/Oscilloscope/java/Oscilloscope.java000066400000000000000000000101221207233610700236000ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import net.tinyos.message.*; import net.tinyos.util.*; import java.io.*; /* The "Oscilloscope" demo app. Displays graphs showing data received from the Oscilloscope mote application, and allows the user to: - zoom in or out on the X axis - set the scale on the Y axis - change the sampling period - change the color of each mote's graph - clear all data This application is in three parts: - the Node and Data objects store data received from the motes and support simple queries - the Window and Graph and miscellaneous support objects implement the GUI and graph drawing - the Oscilloscope object talks to the motes and coordinates the other objects Synchronization is handled through the Oscilloscope object. Any operation that reads or writes the mote data must be synchronized on Oscilloscope. Note that the messageReceived method below is synchronized, so no further synchronization is needed when updating state based on received messages. */ public class Oscilloscope implements MessageListener { MoteIF mote; Data data; Window window; /* The current sampling period. If we receive a message from a mote with a newer version, we update our interval. If we receive a message with an older version, we broadcast a message with the current interval and version. If the user changes the interval, we increment the version and broadcast the new interval and version. */ int interval = Constants.DEFAULT_INTERVAL; int version = -1; /* Main entry point */ void run() { data = new Data(this); window = new Window(this); window.setup(); mote = new MoteIF(PrintStreamMessenger.err); mote.registerListener(new OscilloscopeMsg(), this); } /* The data object has informed us that nodeId is a previously unknown mote. Update the GUI. */ void newNode(int nodeId) { window.newNode(nodeId); } public synchronized void messageReceived(int dest_addr, Message msg) { if (msg instanceof OscilloscopeMsg) { OscilloscopeMsg omsg = (OscilloscopeMsg)msg; /* Update interval and mote data */ periodUpdate(omsg.get_version(), omsg.get_interval()); data.update(omsg.get_id(), omsg.get_count(), omsg.get_readings()); /* Inform the GUI that new data showed up */ window.newData(); } } /* A potentially new version and interval has been received from the mote */ void periodUpdate(int moteVersion, int moteInterval) { if (moteVersion > version) { /* It's new. Update our vision of the interval. */ version = moteVersion; interval = moteInterval; window.updateSamplePeriod(); } else if (moteVersion < version) { /* It's old. Update the mote's vision of the interval. */ sendInterval(); } } /* The user wants to set the interval to newPeriod. Refuse bogus values and return false, or accept the change, broadcast it, and return true */ synchronized boolean setInterval(int newPeriod) { if (newPeriod < 1 || newPeriod > 65535) { return false; } interval = newPeriod; version++; sendInterval(); return true; } /* Broadcast a version+interval message. */ void sendInterval() { OscilloscopeMsg omsg = new OscilloscopeMsg(); omsg.set_version(version); omsg.set_interval(interval); try { mote.send(MoteIF.TOS_BCAST_ADDR, omsg); } catch (IOException e) { window.error("Cannot send message to mote"); } } /* User wants to clear all data. */ void clear() { data = new Data(this); } public static void main(String[] args) { Oscilloscope me = new Oscilloscope(); me.run(); } } tinyos-2.1.2+dfsg/apps/Oscilloscope/java/Window.java000066400000000000000000000213101207233610700224120ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import javax.swing.table.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; import java.util.*; /* The main GUI object. Build the GUI and coordinate all user activities */ class Window { Oscilloscope parent; Graph graph; Font smallFont = new Font("Dialog", Font.PLAIN, 8); Font boldFont = new Font("Dialog", Font.BOLD, 12); Font normalFont = new Font("Dialog", Font.PLAIN, 12); MoteTableModel moteListModel; // GUI view of mote list JLabel xLabel; // Label displaying X axis range JTextField sampleText, yText; // inputs for sample period and Y axis range JFrame frame; Window(Oscilloscope parent) { this.parent = parent; } /* A model for the mote table, and general utility operations on the mote list */ class MoteTableModel extends AbstractTableModel { private ArrayList motes = new ArrayList(); private ArrayList colors = new ArrayList(); /* Initial mote colors cycle through this list. Add more colors if you want. */ private Color[] cycle = { Color.RED, Color.WHITE, Color.GREEN, Color.MAGENTA, Color.YELLOW, Color.GRAY, Color.YELLOW }; int cycleIndex; /* TableModel methods for achieving our table appearance */ public String getColumnName(int col) { if (col == 0) { return "Mote"; } else { return "Color"; } } public int getColumnCount() { return 2; } public synchronized int getRowCount() { return motes.size(); } public synchronized Object getValueAt(int row, int col) { if (col == 0) { return motes.get(row); } else { return colors.get(row); } } public Class getColumnClass(int col) { return getValueAt(0, col).getClass(); } public boolean isCellEditable(int row, int col) { return col == 1; } public synchronized void setValueAt(Object value, int row, int col) { colors.set(row, (Color)value); fireTableCellUpdated(row, col); graph.repaint(); } /* Return mote id of i'th mote */ int get(int i) { return (motes.get(i)).intValue(); } /* Return color of i'th mote */ Color getColor(int i) { return colors.get(i); } /* Return number of motes */ int size() { return motes.size(); } /* Add a new mote */ synchronized void newNode(int nodeId) { /* Shock, horror. No binary search. */ int i, len = motes.size(); for (i = 0; ; i++) { if (i == len || nodeId < get(i)) { motes.add(i, new Integer(nodeId)); // Cycle through a set of initial colors colors.add(i, cycle[cycleIndex++ % cycle.length]); break; } } fireTableRowsInserted(i, i); } /* Remove all motes */ void clear() { motes = new ArrayList(); colors = new ArrayList(); fireTableDataChanged(); } } /* End of MoteTableModel */ /* A simple full-color cell */ static class MoteColor extends JLabel implements TableCellRenderer { public MoteColor() { setOpaque(true); } public Component getTableCellRendererComponent (JTable table, Object color, boolean isSelected, boolean hasFocus, int row, int column) { setBackground((Color)color); return this; } } /* Convenience methods for making buttons, labels and textfields. Simplifies code and ensures a consistent style. */ JButton makeButton(String label, ActionListener action) { JButton button = new JButton(); button.setText(label); button.setFont(boldFont); button.addActionListener(action); return button; } JLabel makeLabel(String txt, int alignment) { JLabel label = new JLabel(txt, alignment); label.setFont(boldFont); return label; } JLabel makeSmallLabel(String txt, int alignment) { JLabel label = new JLabel(txt, alignment); label.setFont(smallFont); return label; } JTextField makeTextField(int columns, ActionListener action) { JTextField tf = new JTextField(columns); tf.setFont(normalFont); tf.setMaximumSize(tf.getPreferredSize()); tf.addActionListener(action); return tf; } /* Build the GUI */ void setup() { JPanel main = new JPanel(new BorderLayout()); main.setMinimumSize(new Dimension(500, 250)); main.setPreferredSize(new Dimension(800, 400)); // Three panels: mote list, graph, controls moteListModel = new MoteTableModel(); JTable moteList = new JTable(moteListModel); moteList.setDefaultRenderer(Color.class, new MoteColor()); moteList.setDefaultEditor(Color.class, new ColorCellEditor("Pick Mote Color")); moteList.setPreferredScrollableViewportSize(new Dimension(100, 400)); JScrollPane motePanel = new JScrollPane(); motePanel.getViewport().add(moteList, null); main.add(motePanel, BorderLayout.WEST); graph = new Graph(this); main.add(graph, BorderLayout.CENTER); // Controls. Organised using box layouts. // Sample period. JLabel sampleLabel = makeLabel("Sample period (ms):", JLabel.RIGHT); sampleText = makeTextField(6, new ActionListener() { public void actionPerformed(ActionEvent e) { setSamplePeriod(); } } ); updateSamplePeriod(); // Clear data. JButton clearButton = makeButton("Clear data", new ActionListener() { public void actionPerformed(ActionEvent e) { clearData(); } } ); // Adjust X-axis zoom. Box xControl = new Box(BoxLayout.Y_AXIS); xLabel = makeLabel("", JLabel.CENTER); final JSlider xSlider = new JSlider(JSlider.HORIZONTAL, 0, 8, graph.scale); Hashtable xTable = new Hashtable(); for (int i = 0; i <= 8; i += 2) { xTable.put(new Integer(i), makeSmallLabel("" + (Graph.MIN_WIDTH << i), JLabel.CENTER)); } xSlider.setLabelTable(xTable); xSlider.setPaintLabels(true); graph.updateXLabel(); graph.setScale(graph.scale); xSlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { //if (!xSlider.getValueIsAdjusting()) graph.setScale((int)xSlider.getValue()); } }); xControl.add(xLabel); xControl.add(xSlider); // Adjust Y-axis range. JLabel yLabel = makeLabel("Y:", JLabel.RIGHT); yText = makeTextField(12, new ActionListener() { public void actionPerformed(ActionEvent e) { setYAxis(); } } ); yText.setText(graph.gy0 + " - " + graph.gy1); Box controls = new Box(BoxLayout.X_AXIS); controls.add(clearButton); controls.add(Box.createHorizontalGlue()); controls.add(Box.createRigidArea(new Dimension(20, 0))); controls.add(sampleLabel); controls.add(sampleText); controls.add(Box.createHorizontalGlue()); controls.add(Box.createRigidArea(new Dimension(20, 0))); controls.add(xControl); controls.add(yLabel); controls.add(yText); main.add(controls, BorderLayout.SOUTH); // The frame part frame = new JFrame("Oscilloscope"); frame.setSize(main.getPreferredSize()); frame.getContentPane().add(main); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } /* User operation: clear data */ void clearData() { synchronized (parent) { moteListModel.clear(); parent.clear(); graph.newData(); } } /* User operation: set Y-axis range. */ void setYAxis() { String val = yText.getText(); try { int dash = val.indexOf('-'); if (dash >= 0) { String min = val.substring(0, dash).trim(); String max = val.substring(dash + 1).trim(); if (!graph.setYAxis(Integer.parseInt(min), Integer.parseInt(max))) { error("Invalid range " + min + " - " + max + " (expected values between 0 and 65535)"); } return; } } catch (NumberFormatException e) { } error("Invalid range " + val + " (expected NN-MM)"); } /* User operation: set sample period. */ void setSamplePeriod() { String periodS = sampleText.getText().trim(); try { int newPeriod = Integer.parseInt(periodS); if (parent.setInterval(newPeriod)) { return; } } catch (NumberFormatException e) { } error("Invalid sample period " + periodS); } /* Notification: sample period changed. */ void updateSamplePeriod() { sampleText.setText("" + parent.interval); } /* Notification: new node. */ void newNode(int nodeId) { moteListModel.newNode(nodeId); } /* Notification: new data. */ void newData() { graph.newData(); } void error(String msg) { JOptionPane.showMessageDialog(frame, msg, "Error", JOptionPane.ERROR_MESSAGE); } } tinyos-2.1.2+dfsg/apps/Oscilloscope/java/build.xml000066400000000000000000000006101207233610700221210ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/Oscilloscope/java/oscilloscope.jar000066400000000000000000000455011207233610700235040ustar00rootroot00000000000000PK8 META-INF/PKPK8META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMu +h8*8(x%irrPK_FFPK|8ColorCellEditor$1.class}RmOA~=8{\~Ԙ&*&tɱ.ejGgL/ٙyynO;؜DX `)2VBA3j S#^F ˽C>⧙9 {х.; u;0ӻB*i_2d5Pj= TQ_xp[{Q~0ObF)kF ё|F|t2_B6K({Bj.;:.{ F_4Jg1Љاc#;KaZi\3eN: nP 7PKS$h%ZWPK|8ColorCellEditor.classTiOQ= 㰴QE.Rp-P`*`Hi!e<ߐD?xmi hw.s:?}`/U#.0̨JTHRх9y cyyੂg 2 El; }=H" CGPbbi&_xn X0-S,@e o `6C k8Coδ~;B<].\^+v!9#zMaU!VO-_lCfZy _5ESTaNykemT"0JqEʬL/Ki̋ɣ[S\u 1#y5<Ǣ!coSa]N 5O2A۰,dˆrW/ixe +ȶIJKȪ53\\ 0rQFH6)$tfKkEFeZ$mQvr(Lʙ&#\N;o r怞#m%M(.0_6u&G_$|Rda[t;B'dcbUw*8 ~u}/HTѵKT)3hVM z{):GbjRA1Aʌ6 -)AK994Jct%~~B=E00G3u.իEX<Z#D LK;:{mvx=;iRwH ӯ.>5PKcѢ/PK|8Constants.class=N@ϥ@*l\p.h Ő4%[3ʼniS +>e3lw9 .m\:9"(ձJDQK/h鯼 ~]Mw#~cjNw ($adJ>X;NTև\e)Y.>D]HP&-}F-mf@̎ٹ1 @ЭmcڬCs6PKe@л!PK|8 Data.classmR[O`~+2q," YC PF#c#[Q`LBF#1}[D4}o?>D&: tFp ]tGу(B64 #ȠX+ iJ._(*ҁ`VA̹\U-0]AS6_3o@K` (N&Ǝ<i0{{FHMu91/P""~d{CE&D AJxG Ǩ8hC,&ժ6 T+\ K^qUr;G \'wt?&9sSX ;rL1ďHchdAqc t :v-D iXqfޤ'#j|r?@=?Ƅfŵc4XօKM M"5k<% RкuzZ[A0=\Eeg.nNiy p!1Cn@%uf 術hW9]QXp`v uXSK,#X|JQu^<6@Oμ )o~.{Po{2s'񔑶|_PK6PK|8Graph$SingleGraph.classmS[OA-#a((*jY/U&R*&uݴuK`›Dm1AmI$ɜfmC}q8!I!N CNk8Ti ߐg8줞=6P&w/D_qAEF0R0Xe`]c_rܜC ,xA jΔF= '>szd0ٞ1HSԅ||Z(GNCDQ}|\iOģ`Jr!n\B'!T111BO1*81-2gp#'op܄5|э0C|-OA0F3-?]Xtm:HCR,%5Vs5lW,RmqZofISXFwĐ ؖeiX?0NZAͨtz-"2z"UMVV7z@WOhlQe Tψ=U4*$!d8I7h[m|8Zo I?1*`(4н -#2.m`t.w䇕ҁ}/6 mLy:ur.o] .gH~$>`[p;Xw<bXq\~2F"bPKtPK|8 Graph.classW |S&77 J&ZQ-MPu¥4钔 /`96dS{{9^>9{ss~ss/x)/p2. [\)`!p\g ͸Zp^L^_ yDf݃Eopnpbv U;ev,wᛮGvuķ4|ۋ:\2#`{e;{ư9vXqЋ|?B>"~ &œ] siVGI3ݘ023+V65\m^Ү@(ؘJfF2H \e,].<(ڼrY}E WGYֺ1|Oˢ5k&>jWGڗldy ]s-8OࠅW3FT5f2]OR unx,Kw]Db&|}1#kMf:O%;PJ1|i447zY16x@ zɨ3uVP㝙"<Z3m5TTG K8:#gQFőߖM;!LɮdC$" &d1ӛJZaZtߔhc@pLq#1;e]5֛ -mvҺ·Zo22f- ;PLT_\ye$'xTxLZ:P\:q?t "|SHASP\ZLH,II b4%J3Ay,CI1t c[џ~t8OW^^kϵ쑗5^`kW5R~l`*19(>o( $(q;蔙pΠPC*?W̹n(5 M%u\>յDx1 AT"YA'a.ߎbc4;=2f}Vs%'|W̊&SP e`/ i-+Vimrhc9m{ǭk෱\YW>⊷ehc+( T2-%6:l׃p`&aC&3D]A|,:,ۥ2T,j8rz|1%C 5 54ck+im;-&&P1j31k4Ҷy^nʎ3jŌq8$$rX&wŏaVXu]~_݉; 8'0gKsG[>R=1-d{֘QRRVtLRZ9Uur69+ۧ0 {$S/5}` ݋ Uˡz/;No74/S$~g"՛r8t1 ڔLaͯq=ܢ+܂ԥǯҺ_M/ܻ 9 {8er/s8Sc~O=FMaCG3b3NČ3f1JՌ\lb<S73+/bQRWpf JR[*w܍m`|܀9e7Tpn$M SkCA3||m!uu&`;{-l6zu;{m̡/c"^ֆ``mlAWQ^-<ʞ1ZmT+5 Ku I fbX³ZJg;ު'XObO7?,9\𮕛 "ߏ9,:2 VӕR㨥ٽly ,?wQVRqWXTJ{hfn&> sScY 34M +o1Ȗ$/QI,; gNBFTɲZfE;^Yy3[ gvD;lHOeP'l, j;Ӣ , &K}7Ѽq*Y3>1>8iE@Ać(}htV\49тY\&k#S8[NErZ)ml1ٳwCKsWiK\B3|ay[Do #@I)E\P 1Ba YT8<E v('rIo?5]=G]B]Ÿ[9-Лi<wLAG  %^ y d_!ndJlyHa>YCM$n"]@>^ 0E18l<TښQ$6DK ERZ>v!L PKeRPK|8OscilloscopeMsg.classW]p>ג%yײcI١E@ZSX J"(Z \8@) B')iK)ӎڧvPڧitk~wʫxܽ~9g?{O{C"Eht;Oܜ47q ='j'o 4Y|MzCw==>~Cy<|Atㆇ^psr#n^uTKܼE7Wy<@nzMo1=%bs#gԺ/jZNe2S{tbnj^`VT#?ȹ/'U>T\:.Rdz8q]u?OpB E=dMKe8Cz?c<\W ^1ܟ8ZI fSjfb$)ZRɨrznEkJN_W|>u4|%R%o@5lN%>9ꅖ1]FA+f6čVsQy͂ҌJ)skuz]cUFK\J* sEP\4S*jɘ-UPAOiL*Y )u^NZԦ,ߨ+^ퟍ›^ޤDzVvjv^_!WHeLgwi)K.V-n4`7PX0ʩv \1?/Wl6 -3HiHosnFضaK!QuߎlZsDD/ЬFvtbnHFM"}e6C?q\M˫!VBi#by!' G{A>b.B#H4$~SH?wE:ħFJN3gr&g7S_$.j!Utvh1j}z٢1#{)4ujYN-b;m39~{ %|t8W c1 ?6k\X:wT{sbW4܁ n$F;.祥I{փ2<1m)N,A֨=xįrZS1;m ԧP3m%epݕ}-@ZGni{OS6N:~ mTդ"msH{'ֹw#jw:ꐇ JT*̅vabԎ{S#O !ſJNPK^XGPK|8Window$1.classmQ[KAFWWWN/f\!]ѝtdQWz3k=73_daaA VicƎ]ʨz̐ > 1J7㐶bN7}q!MܢˑɡrmHGPKc XPK|8Window$2.classmQJ1=mj/ }\UV}NMfe7mK}(q' dfrrfd5p`,lXd辌j T`rDرTR0=CtC- ;" 2P7"| ¡2TsO+Bi4LsnQsi f]Lk)"zBJ'6J*i^3t?+ѽ1CeƂI%/&"' eߤH3JjWsH4fQPKRMj%PK|8Window$MoteTableModel.classV[WW\&#^5[k5Z:$# L?vŗ>PĵߞZs}9kWO؏Q@Nŵ(ȉ庈v1*#QnD0!">ҨGqD-v|Ϣ CTPsIVxݓLbaU1 4WqͪH\J;0oU J!T|X, =7wtzrv\TX "I.U$˶K :o Ji-Mθ1%@[M9{Ęޓ eÞN\Dz闩lWA 1@ 4U( \3TzuFf͢>U٨Uj,%$MTHlĠk39F|Њ`{nmwU1T\z%#epzE S4-7ҐQ ǐ%& 5B? [FEüE8""\ql9AdӈH㔆i8*hXx ?:Ɏ ۜX1mOl6qL̑DncM1Y%5K9射03"?$ oaqyÒ4R;?`ڞ&*O^5gWMǃ]esp :;26Ad '' 0-PpE/O]|K 'c_P2"=Zy(2YƖ ?WA ACh'nK& NfY$Ѿwm]-5c;y4/󳴞SZC7Þr鷯I>Gm[ϒ`ƟB:{f"zw^#*J 9"P $.]'G<:z+ϱ!k:λх7վƮ:v2p?h77y 1{nC13[hO4/./7{%v}/@I9޺D}5oIW8606t;G 6.I+ȮuRǾ[,zq/qSBPKlFPK|8 Window.classX |1@+$,TH@@4 HXqfwݐ֣jmZ2AֻgֻUdk5_wf̥S4 KA<Ջsp_ 5xa 'd;ܩa _pB~+^!x5L x@&!NA<,=Q ם3wR=U M'XJIQ\8DwlF93[8u\kY`d6DXWio;:.rp>al/TuCsuGY-&ܨB:DCipF\ D*b] /vw؋ .3fGJNuH%Z7m{ϵyd}[!JS:-٫ތVF,Yڲ E 9uSTQUݿLKzuE=Vρi!c $ ҕ:~8\I\%T Zf 9OOq%K>T^A[,Щ[tgFz[Ʃe!2whFk!::U:Etj:Mtڈkuڄ/u:Gk踌tf x :ζlN=ԇV;?ďtV:ia uFQZF- t"Κ%u:k&먛c)`Rl3@884{fGƌxLLisF<8d +u܄ SFV2+{;̤0vPKKN;tN4+غhvt 1x WƵϹmT_p(eF$[w ӂ2y/^(43kSVf-z)#,\r8'1 !+Nej1F+MQs4=BQAwN \3v2 V;Yg9J~/$VmA*v藃s`rTpm=D**^!.: ͑2p*uW2kST&.]PAdmAUGL6}޲I8S ddd7(8R<-m_B٥!j'Ukhِ12;oMH+mqٜmRuFn; d|l]slʗڸN'q0bBK{Kuhd9wsKrbv l=r]8emFʻ\B>unGcϫsNۏK-^}fIIxMⱐ;]̿7Plҝ䖽c8YUS|82})Ǥem3RN K`si![~En{nc~ܖLGso+ᶶT姈TCR;czݼ00<1~,`Mc*[=O," oZk¨P-(fYqu< 짣gIg]'CI W:i g[P?T]ռ&,“ cC! ,fGhv27:lQ,&,&2|܇ :2ОΚf`j,>2k,g10þ>TY%0~sv+P3,̩Z},f腾Cdw(+8Qkn0*aY,-,-bEUU޹+h K -XՇյJM,j!roz%, {̲ršy^ k-ŀ,m<_ޯZ8Z-l=F?)\WpVZ8vدH[;VYlM¬[\1X9vG$ t(5 E{a:SBe%_mHگ:~ !yq; 1ZQ|ЄY$E-QN)'%\H\Jrr/n)iÉq*9:.BM=w3ݸv<}xg>T;wQq/}Ԋh<@xRxNt$]~^xLJ<3'W< g^xóozv-Oo{;/\$gp:2qbkT5knfW8sM7uXE|W>׮Pq0>|Zp㮝եp=K+.C[u!GB Bd! \ʁ4 Go_cWwkPؒZ- 2L*f8bT vʟ%_TJ*vZ;egR^?Y5S.rw' \"/cbg\\tEf&/d&hJi"&TCi2s0pR>+r*!߂r0z4;G1By( ,|ml v>[9]u#fYP(#vwCt;3}_/؋Ú-<|Sno Nop-[ onrntPK PK8 META-INF/PK8_FF=META-INF/MANIFEST.MFPK|8,ColorCellEditor$1.classPK|8S$h%ZWColorCellEditor$2.classPK|8cѢ/rColorCellEditor.classPK|8e@л!Constants.classPK|86 Data.classPK|8t Graph$SingleGraph.classPK|8I5 ' XGraph.classPK|8V} Node.classPK|8eROscilloscope.classPK|8^XG!OscilloscopeMsg.classPK|8c X)Window$1.classPK|8[W+Window$2.classPK|8z+*-Window$3.classPK|8B"Z/Window$4.classPK|8T(aQ0Window$5.classPK|8RMj%@2Window$MoteColor.classPK|8lF3Window$MoteTableModel.classPK|8  9Window.classPK@Ftinyos-2.1.2+dfsg/apps/Oscilloscope/java/run000077500000000000000000000002451207233610700210360ustar00rootroot00000000000000#!/bin/sh if cygpath -w / >/dev/null 2>/dev/null; then CLASSPATH="oscilloscope.jar;$CLASSPATH" else CLASSPATH="oscilloscope.jar:$CLASSPATH" fi java Oscilloscope tinyos-2.1.2+dfsg/apps/Oscilloscope/oscilloscope.py000066400000000000000000000014711207233610700224350ustar00rootroot00000000000000#!/usr/bin/env python import sys import tos AM_OSCILLOSCOPE = 0x93 class OscilloscopeMsg(tos.Packet): def __init__(self, packet = None): tos.Packet.__init__(self, [('version', 'int', 2), ('interval', 'int', 2), ('id', 'int', 2), ('count', 'int', 2), ('readings', 'blob', None)], packet) if '-h' in sys.argv: print "Usage:", sys.argv[0], "serial@/dev/ttyUSB0:57600" sys.exit() am = tos.AM() while True: p = am.read() if p and p.type == AM_OSCILLOSCOPE: msg = OscilloscopeMsg(p.data) print msg.id, msg.count, [i<<8 | j for (i,j) in zip(msg.readings[::2], msg.readings[1::2])] #print msg tinyos-2.1.2+dfsg/apps/Powerup/000077500000000000000000000000001207233610700163655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/Powerup/Makefile000066400000000000000000000000541207233610700200240ustar00rootroot00000000000000COMPONENT=PowerupAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/Powerup/PowerupAppC.nc000066400000000000000000000044071207233610700211210ustar00rootroot00000000000000// $Id: PowerupAppC.nc,v 1.5 2010-06-29 22:07:17 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Configuration for the PowerUp application. * * @author Cory Sharp */ configuration PowerupAppC{} implementation { components MainC, PowerupC, LedsC; MainC.Boot <- PowerupC; PowerupC -> LedsC.Leds; } tinyos-2.1.2+dfsg/apps/Powerup/PowerupC.nc000066400000000000000000000044251207233610700204600ustar00rootroot00000000000000// $Id: PowerupC.nc,v 1.6 2010-06-29 22:07:17 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * This module turns on Led0 when the system boots. * * @author Cory Sharp */ module PowerupC @safe() { uses interface Boot; uses interface Leds; } implementation { event void Boot.booted() { call Leds.led0On(); } } tinyos-2.1.2+dfsg/apps/Powerup/README.txt000066400000000000000000000006301207233610700200620ustar00rootroot00000000000000$Id: README.txt,v 1.4 2006-12-12 18:22:48 vlahan Exp $ README for Powerup Author/Contact: tinyos-help@millennium.berkeley.edu @author Cory Sharp Description: Powerup turns on the red LED on powerup. It is useful to test that the build environment is functional and that an application correctly installs on a piece of hardware. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/PppRouter/000077500000000000000000000000001207233610700166645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/PppRouter/Makefile000066400000000000000000000012511207233610700203230ustar00rootroot00000000000000COMPONENT=PppRouterC # PFLAGS += -DENABLE_SPI0_DMA # PFLAGS += -DCC2420_DEF_CHANNEL=21 # use rpl PFLAGS += -DRPL_ROUTING -DRPL_STORING_MODE -I$(LOWPAN_ROOT)/tos/lib/net/rpl # PFLAGS += -DRPL_OF_MRHOF # and ppp PFLAGS += -I$(TOSDIR)/lib/ppp PFLAGS += -I$(TOSDIR)/lib/fragpool # this works around fragmentation in the RX buffer pool PFLAGS += -DPPP_HDLC_RX_FRAME_LIMIT=1 -DPPP_HDLC_TX_FRAME_LIMIT=8 # if you set this, the stack won't use dhcp to assign addresses -- it # will use this prefix combined with TOS_NODE_ID PFLAGS += -DIN6_PREFIX=\"fec0::\" # derive short address from the dhcp address assignment, if possible PFLAGS += -DBLIP_DERIVE_SHORTADDRS include $(MAKERULES) tinyos-2.1.2+dfsg/apps/PppRouter/PppRouterC.nc000066400000000000000000000033741207233610700212600ustar00rootroot00000000000000 #include #include "ppp.h" configuration PppRouterC { } implementation { components PppRouterP; components MainC; PppRouterP.Boot -> MainC; components LedsC as LedsC; PppRouterP.Leds -> LedsC; components PppDaemonC; PppRouterP.PppControl -> PppDaemonC; components PppIpv6C; PppDaemonC.PppProtocol[PppIpv6C.ControlProtocol] -> PppIpv6C.PppControlProtocol; PppDaemonC.PppProtocol[PppIpv6C.Protocol] -> PppIpv6C.PppProtocol; PppIpv6C.Ppp -> PppDaemonC; PppIpv6C.LowerLcpAutomaton -> PppDaemonC; PppRouterP.Ipv6LcpAutomaton -> PppIpv6C; PppRouterP.PppIpv6 -> PppIpv6C; PppRouterP.Ppp -> PppDaemonC; #if defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) components PlatformHdlcUartC as HdlcUartC; #else components DefaultHdlcUartC as HdlcUartC; #endif PppDaemonC.HdlcUart -> HdlcUartC; PppDaemonC.UartControl -> HdlcUartC; // SDH : don't bother including the PppPrintfC by default // components PppPrintfC, PppC;; // PppPrintfC.Ppp -> PppDaemonC; // PppDaemonC.PppProtocol[PppPrintfC.Protocol] -> PppPrintfC; // PppPrintfC.Ppp -> PppC; components IPStackC, IPForwardingEngineP, IPPacketC; IPForwardingEngineP.IPForward[ROUTE_IFACE_PPP] -> PppRouterP.IPForward; PppRouterP.IPControl -> IPStackC; PppRouterP.ForwardingTable -> IPStackC; PppRouterP.IPPacket -> IPPacketC; #ifdef RPL_ROUTING components RPLRoutingC, RplBorderRouterP; PppRouterP.RootControl -> RPLRoutingC; RplBorderRouterP.ForwardingEvents -> IPStackC.ForwardingEvents[ROUTE_IFACE_PPP]; RplBorderRouterP.IPPacket -> IPPacketC; #endif // UDP shell on port 2000 components UDPShellC; // prints the routing table components RouteCmdC; #ifndef IN6_PREFIX components Dhcp6ClientC; PppRouterP.Dhcp6Info -> Dhcp6ClientC; #endif } tinyos-2.1.2+dfsg/apps/PppRouter/PppRouterP.nc000066400000000000000000000062301207233610700212670ustar00rootroot00000000000000 #include #include #include #include #include #include "pppipv6.h" #include "blip_printf.h" module PppRouterP { provides { interface IPForward; } uses { interface Boot; interface Leds; interface SplitControl as IPControl; interface SplitControl as PppControl; interface LcpAutomaton as Ipv6LcpAutomaton; interface PppIpv6; interface Ppp; interface ForwardingTable; interface RootControl; interface Dhcp6Info; interface IPPacket; } } implementation { event void PppIpv6.linkUp() {} event void PppIpv6.linkDown() {} event void Ipv6LcpAutomaton.transitionCompleted (LcpAutomatonState_e state) { } event void Ipv6LcpAutomaton.thisLayerUp () { } event void Ipv6LcpAutomaton.thisLayerDown () { } event void Ipv6LcpAutomaton.thisLayerStarted () { } event void Ipv6LcpAutomaton.thisLayerFinished () { } event void PppControl.startDone (error_t error) { } event void PppControl.stopDone (error_t error) { } event void IPControl.startDone (error_t error) { struct in6_addr dhcp6_group; // add a route to the dhcp group on PPP, not the radio (which is the default) inet_pton6(DH6ADDR_ALLAGENT, &dhcp6_group); call ForwardingTable.addRoute(dhcp6_group.s6_addr, 128, NULL, ROUTE_IFACE_PPP); // add a default route through the PPP link call ForwardingTable.addRoute(NULL, 0, NULL, ROUTE_IFACE_PPP); } event void IPControl.stopDone (error_t error) { } event void Boot.booted() { error_t rc; #ifndef PRINTFUART_ENABLED rc = call Ipv6LcpAutomaton.open(); rc = call PppControl.start(); #endif #ifdef RPL_ROUTING call RootControl.setRoot(); #endif #ifndef IN6_PREFIX call Dhcp6Info.useUnicast(FALSE); #endif call IPControl.start(); } event error_t PppIpv6.receive(const uint8_t* data, unsigned int len) { struct ip6_hdr *iph = (struct ip6_hdr *)data; void *payload = (iph + 1); call Leds.led0Toggle(); signal IPForward.recv(iph, payload, NULL); return SUCCESS; } command error_t IPForward.send(struct in6_addr *next_hop, struct ip6_packet *msg, void *data) { size_t len = iov_len(msg->ip6_data) + sizeof(struct ip6_hdr); error_t rc; frame_key_t key; const uint8_t* fpe; uint8_t* fp; if (!call PppIpv6.linkIsUp()) return EOFF; // get an output frame fp = call Ppp.getOutputFrame(PppProtocol_Ipv6, &fpe, FALSE, &key); if ((! fp) || ((fpe - fp) < len)) { if (fp) { call Ppp.releaseOutputFrame(key); } call Leds.led2Toggle(); return ENOMEM; } // copy the header and body into the frame memcpy(fp, &msg->ip6_hdr, sizeof(struct ip6_hdr)); iov_read(msg->ip6_data, 0, len, fp + sizeof(struct ip6_hdr)); rc = call Ppp.fixOutputFrameLength(key, fp + len); if (SUCCESS == rc) { rc = call Ppp.sendOutputFrame(key); } call Leds.led1Toggle(); return rc; } event void Ppp.outputFrameTransmitted (frame_key_t key, error_t err) { } } tinyos-2.1.2+dfsg/apps/PppRouter/README.blip000066400000000000000000000147541207233610700205040ustar00rootroot00000000000000 blip-2.0 development tree This tree contains support for a stack built on top of: draft-6lowpan-hc-06 for IPv6 header compression draft-roll-rpl-17 for IPv6 routing linux ppp for communicating with external networks - from the peoplepower osian stack - merged in from the osian-squashed-ppp branch dhcpv6 for doing address assignment We track trunk, periodically re-merging. In the future this release will be integrated with trunk. TOSROOT=/home/sdawson/svn/blip-rpl-devel TOSDIR=/home/sdawson/svn/blip-rpl-devel/tos MAKERULES=/home/sdawson/svn/blip-rpl-devel/support/make/Makerules Some of the apps are tight on code space (PppRouter). You should use mspgcc4 (http://mspgcc4.sourceforge.net/) to compile, since it generates 5-10% code size reductions when used with -Os. Address assignment ======================================== The stack either assigns IPv6 addresses statically at compile time, or dynamically using DHCPv6. It is configured to use static addressing out of the box. By default, each mote configures itsself with three addresses: two link-local addresses and one global address on the prefix fec0::/64. == Static Address Mode == Static addressing is selected by defining the IN6_PREFIX macro at compile time; this is set by default for PppRouter and UDPEcho. The 802.15.4 interface is assigned three addresses: Link-local address 1 is configured from the unique EUI-64 obtained from the DS2411 serial chip. If you want to figure out what address a mote has, you can install the apps/tests/TestEui app (make epic msp-hack) and then look at the printf output: "stty -F /dev/ttyUSB0 57600 && tail -f /dev/ttyUSB0" Link-local address 2 is chosen based on the panid and nodeid as specified in RFC4944. The default panid is 0x22, so if you install an image with ID=1, the corresponding link-local address would be fe80::22:ff:fe00:1. Note that the Unique/Local bit in the IPv6 Interface Identifier is not set for addresses derived from the 16-bit id, but is set when using the EUI-64. For instance, if my EUI-64 is 00:17:3B:00:11:0F:FD, the corresponding IPv6 link-local address is fe80::2:173B:11:0FFD. The U/L bit has been toggled. Finally, a global address is configured using the prefix defined at compile time. The default prefix is fec0::/64, so if the node id is 1, the ipv6 address is fec0::1. You can disable all global addresses by defining IN6_NO_GLOBAL in your Makefile. Summary: IN6_NO_GLOBAL : disable global addresses, only link-local IN6_PREFIX : configure a global address using the specified prefix. == DHCPv6 Address Mode == If IN6_PREFIX is not set, blip instead assumes that you wish to assign addresses using DHCP. This requres running a DHCPv6 server somewhere in your network; I use dibbler with a small patch to reduce the size of the messages. In this architecture, motes configure themselves only with link-local address 1 (based on the EUI-64) on boot. They send DHCPv6 solicitations to the link-local dhcpv6 all-agents multicast group to find neighboring servers or relay agents. Each router also runs a DHCPv6 relay agent, which forwards address solications up the routing tree to the edge where the DHCPv6 server is presumed to be located. Once the DHCPv6 server has assigned the mote a global address (based on its configuration), the mote will attempt to assign itsself a 16-bit address based on the assigned address; it then starts running the routing protocol (RPL). The only way to find out what address a mote has received is by looking in the DHCP logs; the allocation request contains the mote's EUI-64, so it is possible to configure the server to maintain a consistent mapping between EUI-64's and short addresses. Compile and install PppRouterC ======================================== PppRouterC is an application which advertises itsself as a RPL DODAG root. It also has a second ppp interface which allows it to route packets between the 6lowpan network and other networks. $ cd $TOSROOT/apps/PppRouter $ make epic blip Then install it on a mote with ID 1 -- static addressing is default. You should then be able to initiate a ppp connection with that mote using: $ pppd debug passive noauth nodetach 115200 /dev/ttyUSB0 nocrtscts nocdtrcts lcp-echo-interval 0 noccp noip ipv6 ::23,::24 $ ifconfig ppp0 add fec0::100/64 as root. A few notes - Once this link is up, you need to assign it a routable address on the prefix; that's what the second command does. The ppp stack has some trouble on the tmote and epic platforms due to timing issues. You may want to try out different baud rates; you can do this by mirroring tos/platforms/telosa/TelosSerialP.nc in your app directory and changing the baud rate defines in there. I've found that 38400 is a pretty good compromise. We may go back to a DMA solution for this in the future to fix this problem at higher baud rates. == More good stuff == Once you have a ppp connection working, you can use the udp shell on the ppp node to look at the routing table: Type the following command, then type "route\n" $ nc6 -u fec0::1 2000 route destination gateway iface ff02::1:2/128 :: ppp fec0::f6/128 fe80::22:ff:fe00:f6 pan fec0::a4/128 fe80::22:ff:fe00:a4 pan ::/0 :: ppp In this example, the other nodes have been assigned dhcpv6 addresses, and RPL provisioned downward routes in the forwarding table using the DAOs. UDPEcho ======================================== The stock image for motes not needing ppp is UDPEcho -- make and install it the same way $ cd $TOSROOT/apps/UDPEcho $ make epic blip install.2 bsl,/dev/ttyUSB1 Since we're not using DHCP here, we give it a new address based on TOS_NODE_ID. You can use the udp shell to inspect his routing table, as well: $ nc6 -u fec0::2 2000 route destination gateway iface ::/0 fe80::22:ff:fe00:2 pan As you can see, RPL has provisioned a default route through the PPP edge router. For more fun, you can ping the link-local all-nodes multicast group to see who your neighbors are: $ nc6 -u fec0::f6 2000 ping6 ff02::1 fe80::22:ff:fe00:e0 icmp_seq=0 ttl=1 time=52 ms fe80::22:ff:fe00:a4 icmp_seq=0 ttl=1 time=83 ms ... fe80::22:ff:fe00:e0 icmp_seq=9 ttl=1 time=46 ms fe80::22:ff:fe00:a4 icmp_seq=9 ttl=1 time=76 ms 10 packets transmitted, 20 received Finally, if you're using DHCP the 'leases' command will show you your lease: leases lease on fec0::f6 iaid: 1 valid: 3265 t1: 3600 t2: 5400 duid: 00:01:00:01:14:7a:bc:51:00:50:8d:ca:5a:06 tinyos-2.1.2+dfsg/apps/PppRouter/RplBorderRouterP.nc000066400000000000000000000024601207233610700224240ustar00rootroot00000000000000 /** * When packets leave a RPL domain, we're need to remove and RPL * headers which have been inserted and/or reencapsulate the packet. * This component hooks into the forwarding path to do this by * converting any RPL TLV options in IPv6 hop-by-hop options header to * PadN options. * * @author Stephen Dawson-Haggerty */ #include #include #include module RplBorderRouterP { uses { interface ForwardingEvents; interface IPPacket; } } implementation { event bool ForwardingEvents.initiate(struct ip6_packet *pkt, struct in6_addr *next_hop) { return TRUE; } event bool ForwardingEvents.approve(struct ip6_packet *pkt, struct in6_addr *next_hop) { int off; uint8_t nxt = IPV6_HOP; if (pkt->ip6_inputif == ROUTE_IFACE_PPP) return FALSE; /* remove any RPL options in the hop-by-hop header by converting them to a PadN option */ off = call IPPacket.findHeader(pkt->ip6_data, pkt->ip6_hdr.ip6_nxt, &nxt); if (off < 0) return TRUE; call IPPacket.delTLV(pkt->ip6_data, off, RPL_HBH_RANK_TYPE); return TRUE; } event void ForwardingEvents.linkResult(struct in6_addr *dest, struct send_info *info) { } } tinyos-2.1.2+dfsg/apps/RadioCountToLeds/000077500000000000000000000000001207233610700201065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/RadioCountToLeds/Makefile000066400000000000000000000010501207233610700215420ustar00rootroot00000000000000COMPONENT=RadioCountToLedsAppC BUILD_EXTRA_DEPS = RadioCountMsg.py RadioCountMsg.class CLEAN_EXTRA = RadioCountMsg.py RadioCountMsg.class RadioCountMsg.java RadioCountMsg.py: RadioCountToLeds.h mig python -target=$(PLATFORM) $(CFLAGS) -python-classname=RadioCountMsg RadioCountToLeds.h radio_count_msg -o $@ RadioCountMsg.class: RadioCountMsg.java javac RadioCountMsg.java RadioCountMsg.java: RadioCountToLeds.h mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=RadioCountMsg RadioCountToLeds.h radio_count_msg -o $@ include $(MAKERULES) tinyos-2.1.2+dfsg/apps/RadioCountToLeds/README.txt000066400000000000000000000013471207233610700216110ustar00rootroot00000000000000README for RadioCountToLeds Author/Contact: tinyos-help@millennium.berkeley.edu Description: RadioCountToLeds maintains a 4Hz counter, broadcasting its value in an AM packet every time it gets updated. A RadioCountToLeds node that hears a counter displays the bottom three bits on its LEDs. This application is a useful test to show that basic AM communication and timers work. Tools: After compiling, RadioCountMsg.java and RadioCountMsg.py files will be created. RadioCountMsg.java is a Java class representing the message that this application sends. RadioCountMsg.py is a Python class representing the message that this application sends. Known bugs/limitations: None. $Id: README.txt,v 1.5 2007-07-10 20:01:58 klueska Exp $ tinyos-2.1.2+dfsg/apps/RadioCountToLeds/RadioCountToLeds.h000066400000000000000000000041701207233610700234430ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef RADIO_COUNT_TO_LEDS_H #define RADIO_COUNT_TO_LEDS_H typedef nx_struct radio_count_msg { nx_uint16_t counter; } radio_count_msg_t; enum { AM_RADIO_COUNT_MSG = 6, }; #endif tinyos-2.1.2+dfsg/apps/RadioCountToLeds/RadioCountToLedsAppC.nc000066400000000000000000000056571207233610700243730ustar00rootroot00000000000000// $Id: RadioCountToLedsAppC.nc,v 1.5 2010-06-29 22:07:17 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "RadioCountToLeds.h" /** * Configuration for the RadioCountToLeds application. RadioCountToLeds * maintains a 4Hz counter, broadcasting its value in an AM packet * every time it gets updated. A RadioCountToLeds node that hears a counter * displays the bottom three bits on its LEDs. This application is a useful * test to show that basic AM communication and timers work. * * @author Philip Levis * @date June 6 2005 */ configuration RadioCountToLedsAppC {} implementation { components MainC, RadioCountToLedsC as App, LedsC; components new AMSenderC(AM_RADIO_COUNT_MSG); components new AMReceiverC(AM_RADIO_COUNT_MSG); components new TimerMilliC(); components ActiveMessageC; App.Boot -> MainC.Boot; App.Receive -> AMReceiverC; App.AMSend -> AMSenderC; App.AMControl -> ActiveMessageC; App.Leds -> LedsC; App.MilliTimer -> TimerMilliC; App.Packet -> AMSenderC; } tinyos-2.1.2+dfsg/apps/RadioCountToLeds/RadioCountToLedsC.nc000066400000000000000000000106401207233610700237160ustar00rootroot00000000000000// $Id: RadioCountToLedsC.nc,v 1.7 2010-06-29 22:07:17 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "Timer.h" #include "RadioCountToLeds.h" /** * Implementation of the RadioCountToLeds application. RadioCountToLeds * maintains a 4Hz counter, broadcasting its value in an AM packet * every time it gets updated. A RadioCountToLeds node that hears a counter * displays the bottom three bits on its LEDs. This application is a useful * test to show that basic AM communication and timers work. * * @author Philip Levis * @date June 6 2005 */ module RadioCountToLedsC @safe() { uses { interface Leds; interface Boot; interface Receive; interface AMSend; interface Timer as MilliTimer; interface SplitControl as AMControl; interface Packet; } } implementation { message_t packet; bool locked; uint16_t counter = 0; event void Boot.booted() { call AMControl.start(); } event void AMControl.startDone(error_t err) { if (err == SUCCESS) { call MilliTimer.startPeriodic(250); } else { call AMControl.start(); } } event void AMControl.stopDone(error_t err) { // do nothing } event void MilliTimer.fired() { counter++; dbg("RadioCountToLedsC", "RadioCountToLedsC: timer fired, counter is %hu.\n", counter); if (locked) { return; } else { radio_count_msg_t* rcm = (radio_count_msg_t*)call Packet.getPayload(&packet, sizeof(radio_count_msg_t)); if (rcm == NULL) { return; } rcm->counter = counter; if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(radio_count_msg_t)) == SUCCESS) { dbg("RadioCountToLedsC", "RadioCountToLedsC: packet sent.\n", counter); locked = TRUE; } } } event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) { dbg("RadioCountToLedsC", "Received packet of length %hhu.\n", len); if (len != sizeof(radio_count_msg_t)) {return bufPtr;} else { radio_count_msg_t* rcm = (radio_count_msg_t*)payload; if (rcm->counter & 0x1) { call Leds.led0On(); } else { call Leds.led0Off(); } if (rcm->counter & 0x2) { call Leds.led1On(); } else { call Leds.led1Off(); } if (rcm->counter & 0x4) { call Leds.led2On(); } else { call Leds.led2Off(); } return bufPtr; } } event void AMSend.sendDone(message_t* bufPtr, error_t error) { if (&packet == bufPtr) { locked = FALSE; } } } tinyos-2.1.2+dfsg/apps/RadioSenseToLeds/000077500000000000000000000000001207233610700200735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/RadioSenseToLeds/Makefile000066400000000000000000000007421207233610700215360ustar00rootroot00000000000000COMPONENT=RadioSenseToLedsAppC BUILD_EXTRA_DEPS = RadioSenseMsg.py RadioSenseMsg.class RadioSenseMsg.py: RadioSenseToLeds.h mig python -target=$(PLATFORM) $(CFLAGS) -python-classname=RadioSenseMsg RadioSenseToLeds.h radio_sense_msg -o $@ RadioSenseMsg.class: RadioSenseMsg.java javac RadioSenseMsg.java RadioSenseMsg.java: RadioSenseToLeds.h mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=RadioSenseMsg RadioSenseToLeds.h radio_sense_msg -o $@ include $(MAKERULES) tinyos-2.1.2+dfsg/apps/RadioSenseToLeds/README.txt000066400000000000000000000014101207233610700215650ustar00rootroot00000000000000README for RadioSenseToLeds Author/Contact: tinyos-help@millennium.berkeley.edu Description: RadioSenseToLeds samples a platform's default sensor at 4Hz and broadcasts this value in an AM packet. A RadioSenseToLeds node that hears a broadcast displays the bottom three bits of the value it has received. This application is a useful test to show that basic AM communication, timers, and the default sensor work. Tools: After compiling, RadioSenseMsg.java and RadioSenseMsg.py files will be created. RadioSenseMsg.java is a Java class representing the message that this application sends. RadioSenseMsg.py is a Python class representing the message that this application sends. Known bugs/limitations: None. $Id: README.txt,v 1.5 2007-07-10 20:03:30 klueska Exp $ tinyos-2.1.2+dfsg/apps/RadioSenseToLeds/RadioSenseToLeds.h000066400000000000000000000042121207233610700234120ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef RADIO_SENSE_TO_LEDS_H #define RADIO_SENSE_TO_LEDS_H typedef nx_struct radio_sense_msg { nx_uint16_t error; nx_uint16_t data; } radio_sense_msg_t; enum { AM_RADIO_SENSE_MSG = 7, }; #endif tinyos-2.1.2+dfsg/apps/RadioSenseToLeds/RadioSenseToLedsAppC.nc000066400000000000000000000060021207233610700243260ustar00rootroot00000000000000// $Id: RadioSenseToLedsAppC.nc,v 1.5 2010-06-29 22:07:17 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "RadioSenseToLeds.h" /** * Configuration for the RadioSenseToLeds application. RadioSenseToLeds samples * a platform's default sensor at 4Hz and broadcasts this value in an AM packet. * A RadioSenseToLeds node that hears a broadcast displays the bottom three bits * of the value it has received. This application is a useful test to show that * basic AM communication, timers, and the default sensor work. * * @author Philip Levis * @date June 6 2005 */ configuration RadioSenseToLedsAppC {} implementation { components MainC, RadioSenseToLedsC as App, LedsC, new DemoSensorC(); components ActiveMessageC; components new AMSenderC(AM_RADIO_SENSE_MSG); components new AMReceiverC(AM_RADIO_SENSE_MSG); components new TimerMilliC(); App.Boot -> MainC.Boot; App.Receive -> AMReceiverC; App.AMSend -> AMSenderC; App.RadioControl -> ActiveMessageC; App.Leds -> LedsC; App.MilliTimer -> TimerMilliC; App.Packet -> AMSenderC; App.Read -> DemoSensorC; } tinyos-2.1.2+dfsg/apps/RadioSenseToLeds/RadioSenseToLedsC.nc000066400000000000000000000104451207233610700236730ustar00rootroot00000000000000// $Id: RadioSenseToLedsC.nc,v 1.7 2010-06-29 22:07:17 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "Timer.h" #include "RadioSenseToLeds.h" /** * Implementation of the RadioSenseToLeds application. RadioSenseToLeds samples * a platform's default sensor at 4Hz and broadcasts this value in an AM packet. * A RadioSenseToLeds node that hears a broadcast displays the bottom three bits * of the value it has received. This application is a useful test to show that * basic AM communication, timers, and the default sensor work. * * @author Philip Levis * @date June 6 2005 */ module RadioSenseToLedsC @safe(){ uses { interface Leds; interface Boot; interface Receive; interface AMSend; interface Timer as MilliTimer; interface Packet; interface Read; interface SplitControl as RadioControl; } } implementation { message_t packet; bool locked = FALSE; event void Boot.booted() { call RadioControl.start(); } event void RadioControl.startDone(error_t err) { if (err == SUCCESS) { call MilliTimer.startPeriodic(250); } } event void RadioControl.stopDone(error_t err) {} event void MilliTimer.fired() { call Read.read(); } event void Read.readDone(error_t result, uint16_t data) { if (locked) { return; } else { radio_sense_msg_t* rsm; rsm = (radio_sense_msg_t*)call Packet.getPayload(&packet, sizeof(radio_sense_msg_t)); if (rsm == NULL) { return; } rsm->error = result; rsm->data = data; if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(radio_sense_msg_t)) == SUCCESS) { locked = TRUE; } } } event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) { call Leds.led1Toggle(); if (len != sizeof(radio_sense_msg_t)) {return bufPtr;} else { radio_sense_msg_t* rsm = (radio_sense_msg_t*)payload; uint16_t val = rsm->data; if (val & 0x0004) call Leds.led2On(); else call Leds.led2Off(); if (val & 0x0002) call Leds.led1On(); else call Leds.led1Off(); if (val & 0x0001) call Leds.led0On(); else call Leds.led0Off(); return bufPtr; } } event void AMSend.sendDone(message_t* bufPtr, error_t error) { if (&packet == bufPtr) { locked = FALSE; } } } tinyos-2.1.2+dfsg/apps/Sense/000077500000000000000000000000001207233610700160015ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/Sense/Makefile000066400000000000000000000000521207233610700174360ustar00rootroot00000000000000COMPONENT=SenseAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/Sense/README.txt000066400000000000000000000007001207233610700174740ustar00rootroot00000000000000README for Sense Author/Contact: tinyos-help@millennium.berkeley.edu Description: Sense is a simple sensing demo application. It periodically samples the default sensor and displays the bottom bits of the readings on the leds of the node. Have a look at tinyos-2.x/doc/html/tutorial/lesson5.html for a general tutorial on sensing in TinyOS. Tools: None. Known bugs/limitations: None. $Id: README.txt,v 1.4 2006-12-12 18:22:49 vlahan Exp $ tinyos-2.1.2+dfsg/apps/Sense/SenseAppC.nc000066400000000000000000000044111207233610700201440ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:22:49 $ * @author: Jan Hauer * ======================================================================== */ /** * * Sensing demo application. See README.txt file in this directory for usage * instructions and have a look at tinyos-2.x/doc/html/tutorial/lesson5.html * for a general tutorial on sensing in TinyOS. * * @author Jan Hauer */ configuration SenseAppC { } implementation { components SenseC, MainC, LedsC, new TimerMilliC(), new DemoSensorC() as Sensor; SenseC.Boot -> MainC; SenseC.Leds -> LedsC; SenseC.Timer -> TimerMilliC; SenseC.Read -> Sensor; } tinyos-2.1.2+dfsg/apps/Sense/SenseC.nc000066400000000000000000000054351207233610700175120ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:22:49 $ * @author: Jan Hauer * ======================================================================== */ /** * * Sensing demo application. See README.txt file in this directory for usage * instructions and have a look at tinyos-2.x/doc/html/tutorial/lesson5.html * for a general tutorial on sensing in TinyOS. * * @author Jan Hauer */ #include "Timer.h" module SenseC { uses { interface Boot; interface Leds; interface Timer; interface Read; } } implementation { // sampling frequency in binary milliseconds #define SAMPLING_FREQUENCY 100 event void Boot.booted() { call Timer.startPeriodic(SAMPLING_FREQUENCY); } event void Timer.fired() { call Read.read(); } event void Read.readDone(error_t result, uint16_t data) { if (result == SUCCESS){ if (data & 0x0004) call Leds.led2On(); else call Leds.led2Off(); if (data & 0x0002) call Leds.led1On(); else call Leds.led1Off(); if (data & 0x0001) call Leds.led0On(); else call Leds.led0Off(); } } } tinyos-2.1.2+dfsg/apps/TCPEcho/000077500000000000000000000000001207233610700161515ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/TCPEcho/HttpdP.nc000066400000000000000000000064251207233610700177050ustar00rootroot00000000000000 module HttpdP { uses { interface Leds; interface Boot; interface Tcp; } } implementation { static char *http_okay = "HTTP/1.0 200 OK\r\n\r\n"; static int http_okay_len = 19; enum { S_IDLE, S_CONNECTED, S_REQUEST_PRE, S_REQUEST, S_HEADER, S_BODY, }; enum { HTTP_GET, HTTP_POST, }; void process_request(int verb, char *request, int len) { char reply[24]; memcpy(reply, "led0: 0 led1: 0 led2: 0\n", 24); printfUART("request: '%s'\n", request); if (len >= 10 && request[0] == '/' && request[1] == 'r' && request[2] == 'e' && request[3] == 'a' && request[4] == 'd' && request[5] == '/') { if (request[6] == 'l' && request[7] == 'e' && request[8] == 'd' && request[9] == 's') { uint8_t bitmap = call Leds.get(); call Tcp.send(http_okay, http_okay_len); if (bitmap & 1) reply[6] = '1'; if (bitmap & 2) reply[14] = '1'; if (bitmap & 4) reply[22] = '1'; call Tcp.send(reply, 24); } } call Tcp.close(); } int http_state; int req_verb; char request_buf[150], *request; char tcp_buf[100]; event void Boot.booted() { http_state = S_IDLE; call Tcp.bind(80); } event bool Tcp.accept(struct sockaddr_in6 *from, void **tx_buf, int *tx_buf_len) { if (http_state == S_IDLE) { http_state = S_CONNECTED; *tx_buf = tcp_buf; *tx_buf_len = 100; return TRUE; } printfUART("rejecting connection\n"); return FALSE; } event void Tcp.connectDone(error_t e) { } event void Tcp.recv(void *payload, uint16_t len) { static int crlf_pos; char *msg = payload; switch (http_state) { case S_CONNECTED: crlf_pos = 0; request = request_buf; if (len < 3) { call Tcp.close(); return; } if (msg[0] == 'G') { req_verb = HTTP_GET; msg += 3; len -= 3; } http_state = S_REQUEST_PRE; case S_REQUEST_PRE: while (len > 0 && *msg == ' ') { len--; msg++; } if (len == 0) break; http_state = S_REQUEST; case S_REQUEST: while (len > 0 && *msg != ' ') { *request++ = *msg++; len--; } if (len == 0) break; *request++ = '\0'; http_state = S_HEADER; case S_HEADER: while (len > 0) { switch (crlf_pos) { case 0: case 2: if (*msg == '\r') crlf_pos ++; else if (*msg == '\n') crlf_pos += 2; else crlf_pos = 0; break; case 1: case 3: if (*msg == '\n') crlf_pos ++; else crlf_pos = 0; break; } len--; msg++; // if crlf == 2, we just finished a header line. you know. fyi. if (crlf_pos == 4) { http_state = S_BODY; process_request(req_verb, request_buf, request - request_buf - 1); break; } } if (crlf_pos < 4) break; case S_BODY: // len might be zero here... just a note. default: call Tcp.close(); } } event void Tcp.closed(error_t e) { call Leds.led2Toggle(); call Tcp.bind(80); http_state = S_IDLE; } event void Tcp.acked() { } } tinyos-2.1.2+dfsg/apps/TCPEcho/Makefile000066400000000000000000000010461207233610700176120ustar00rootroot00000000000000COMPONENT=TCPEchoC # uncomment this for network programming support # BOOTLOADER=tosboot # radio opts CFLAGS += -DCC2420_DEF_CHANNEL=15 # CFLAGS += -DCC2420_DEF_RFPOWER=4 # CFLAGS += -DNO_LIB6LOWPAN_ASCII # if this is set, motes will send debugging information to the address # listed. # CFLAGS += -DREPORT_DEST=\"2001:470:1f04:56d::64\" # sim/test harness # CFLAGS += -I../IPBaseStation # CFLAGS += -DDBG_TRACK_FLOWS -DDBG_FLOWS_REPORT # printf debugs. works only on telosb/tmote sky # CFLAGS += -DPRINTFUART_ENABLED include $(MAKERULES) tinyos-2.1.2+dfsg/apps/TCPEcho/README000066400000000000000000000011441207233610700170310ustar00rootroot00000000000000 A simple application which verifies the 6loWPAN stack is functioning correctly. A mote running this will respond to ICMP Echo requests (0x80), and provide a UDP echo service on port 7 (a la rfc862). It also provides a TCP echo service on port 7, and a simple HTTP server on port 80. The only resource supported is '/read/leds'. This functionality can be used to verify that the TCP stack is functional. To build, use the 'blip' make target extra. IE, $ make blip ... For more information on setting up an IPv6 network, please see the tutorial: http://docs.tinyos.net/index.php/BLIP_Tutorial tinyos-2.1.2+dfsg/apps/TCPEcho/TCPEchoC.nc000066400000000000000000000047311207233610700200300ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include <6lowpan.h> configuration TCPEchoC { } implementation { components MainC, LedsC; components TCPEchoP; TCPEchoP.Boot -> MainC; TCPEchoP.Leds -> LedsC; components new TimerMilliC(); components IPDispatchC; TCPEchoP.RadioControl -> IPDispatchC; components new UdpSocketC() as Echo, new UdpSocketC() as Status; TCPEchoP.Echo -> Echo; components new TcpSocketC() as TcpEcho; TCPEchoP.TcpEcho -> TcpEcho; components new TcpSocketC() as TcpWeb, HttpdP; HttpdP.Boot -> MainC; HttpdP.Leds -> LedsC; HttpdP.Tcp -> TcpWeb; TCPEchoP.Status -> Status; TCPEchoP.StatusTimer -> TimerMilliC; components UdpC; TCPEchoP.IPStats -> IPDispatchC.IPStats; TCPEchoP.RouteStats -> IPDispatchC.RouteStats; TCPEchoP.ICMPStats -> IPDispatchC.ICMPStats; TCPEchoP.UDPStats -> UdpC; components RandomC; TCPEchoP.Random -> RandomC; components UDPShellC; } tinyos-2.1.2+dfsg/apps/TCPEcho/TCPEchoP.nc000066400000000000000000000111671207233610700200460ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include #include #include #include #include #include "UDPReport.h" #include "PrintfUART.h" #define REPORT_PERIOD 75L module TCPEchoP { uses { interface Boot; interface SplitControl as RadioControl; interface UDP as Echo; interface UDP as Status; interface Tcp as TcpEcho; interface Leds; interface Timer as StatusTimer; interface Statistics as IPStats; interface Statistics as RouteStats; interface Statistics as ICMPStats; interface Statistics as UDPStats; interface Random; } } implementation { bool timerStarted; nx_struct udp_report stats; struct sockaddr_in6 route_dest; #ifndef SIM #define CHECK_NODE_ID #else #define CHECK_NODE_ID if (TOS_NODE_ID == BASESTATION_ID) return #endif event void Boot.booted() { CHECK_NODE_ID; call RadioControl.start(); timerStarted = FALSE; call IPStats.clear(); call RouteStats.clear(); call ICMPStats.clear(); printfUART_init(); #ifdef REPORT_DEST route_dest.sin6_port = hton16(7000); inet_pton6(REPORT_DEST, &route_dest.sin6_addr); call StatusTimer.startOneShot(call Random.rand16() % (1024 * REPORT_PERIOD)); #endif dbg("Boot", "booted: %i\n", TOS_NODE_ID); call Echo.bind(7); call TcpEcho.bind(7); call Status.bind(7001); } event void RadioControl.startDone(error_t e) { } event void RadioControl.stopDone(error_t e) { } event void Status.recvfrom(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip_metadata *meta) { } event void Echo.recvfrom(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip_metadata *meta) { CHECK_NODE_ID; call Echo.sendto(from, data, len); } enum { STATUS_SIZE = sizeof(ip_statistics_t) + sizeof(route_statistics_t) + sizeof(icmp_statistics_t) + sizeof(udp_statistics_t), }; event void StatusTimer.fired() { if (!timerStarted) { call StatusTimer.startPeriodic(1024 * REPORT_PERIOD); timerStarted = TRUE; } stats.seqno++; stats.sender = TOS_NODE_ID; call IPStats.get(&stats.ip); call RouteStats.get(&stats.route); call ICMPStats.get(&stats.icmp); call UDPStats.get(&stats.udp); call Status.sendto(&route_dest, &stats, sizeof(stats)); } /* * Example code for setting up a TCP echo socket. */ bool sock_connected = FALSE; char tcp_buf[150]; event bool TcpEcho.accept(struct sockaddr_in6 *from, void **tx_buf, int *tx_buf_len) { *tx_buf = tcp_buf; *tx_buf_len = 150; return TRUE; } event void TcpEcho.connectDone(error_t e) { } event void TcpEcho.recv(void *payload, uint16_t len) { if (call TcpEcho.send(payload,len) != SUCCESS) call Leds.led2Toggle(); } event void TcpEcho.closed(error_t e) { call Leds.led0Toggle(); call TcpEcho.bind(7); } event void TcpEcho.acked() {} } tinyos-2.1.2+dfsg/apps/TCPEcho/UDPReport.h000066400000000000000000000035171207233610700201540ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef _UDPREPORT_H #define _UDPREPORT_H #include nx_struct udp_report { nx_uint16_t seqno; nx_uint16_t sender; ip_statistics_t ip; udp_statistics_t udp; icmp_statistics_t icmp; route_statistics_t route; } ; #endif tinyos-2.1.2+dfsg/apps/UDPEcho/000077500000000000000000000000001207233610700161535ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/UDPEcho/Makefile000066400000000000000000000027611207233610700176210ustar00rootroot00000000000000COMPONENT=UDPEchoC # uncomment this for network programming support # BOOTLOADER=tosboot # radio options # CFLAGS += -DCC2420_DEF_CHANNEL=26 # CFLAGS += -DRF230_DEF_CHANNEL=26 # CFLAGS += -DCC2420_DEF_RFPOWER=4 -DENABLE_SPI0_DMA # enable dma on the radio # PFLAGS += -DENABLE_SPI0_DMA # you can compile with or without a routing protocol... of course, # without it, you will only be able to use link-local communication. PFLAGS += -DRPL_ROUTING -DRPL_STORING_MODE -I$(TOSDIR)/lib/net/rpl # PFLAGS += -DRPL_OF_MRHOF # tell the 6lowpan layer to not generate hc-compressed headers # PFLAGS += -DLIB6LOWPAN_HC_VERSION=-1 # if this is set, motes will send debugging information to the address # listed. BLIP_STATS causes blip to record statistics. # you can log this information using the util/Listener.py script # PFLAGS += -DREPORT_DEST=\"fec0::100\" -DBLIP_STATS # if you're using DHCP, set this to try and derive a 16-bit address # from the IA received from the server. This will work if the server # gives out addresses from a /112 prefix. If this is not set, blip # will only use EUI64-based link addresses. If not using DHCP, this # causes blip to use TOS_NODE_ID as short address. Otherwise the # EUI will be used in either case. PFLAGS += -DBLIP_DERIVE_SHORTADDRS # this disables dhcp and statically chooses a prefix. the motes form # their ipv6 address by combining this with TOS_NODE_ID PFLAGS += -DIN6_PREFIX=\"fec0::\" # PFLAGS += -DNEW_PRINTF_SEMANTICS -DPRINTFUART_ENABLED include $(MAKERULES) tinyos-2.1.2+dfsg/apps/UDPEcho/README000066400000000000000000000006201207233610700170310ustar00rootroot00000000000000 A simple application which verifies the 6loWPAN stack is functioning correctly. A mote running this will respond to ICMP Echo requests (0x80), and provide a UDP echo service on port 7 (a la rfc862). To build, use the 'blip' make target extra. IE, $ make blip ... For more information on setting up an IPv6 network, please see the tutorial: http://docs.tinyos.net/index.php/BLIP_2.0 tinyos-2.1.2+dfsg/apps/UDPEcho/UDPEchoC.nc000066400000000000000000000060321207233610700200300ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include configuration UDPEchoC { } implementation { components MainC, LedsC; components UDPEchoP; UDPEchoP.Boot -> MainC; UDPEchoP.Leds -> LedsC; components new TimerMilliC(); components IPStackC; UDPEchoP.RadioControl -> IPStackC; components new UdpSocketC() as Echo, new UdpSocketC() as Status; UDPEchoP.Echo -> Echo; UDPEchoP.Status -> Status; UDPEchoP.StatusTimer -> TimerMilliC; components UdpC, IPDispatchC; UDPEchoP.IPStats -> IPDispatchC; UDPEchoP.UDPStats -> UdpC; #ifdef RPL_ROUTING components RPLRoutingC; #endif components RandomC; UDPEchoP.Random -> RandomC; // UDP shell on port 2000 components UDPShellC; // prints the routing table components RouteCmdC; #ifndef IN6_PREFIX components DhcpCmdC; #endif #ifdef PRINTFUART_ENABLED /* This component wires printf directly to the serial port, and does * not use any framing. You can view the output simply by tailing * the serial device. Unlike the old printfUART, this allows us to * use PlatformSerialC to provide the serial driver. * * For instance: * $ stty -F /dev/ttyUSB0 115200 * $ tail -f /dev/ttyUSB0 */ components SerialPrintfC; /* This is the alternative printf implementation which puts the * output in framed tinyos serial messages. This lets you operate * alongside other users of the tinyos serial stack. */ // components PrintfC; // components SerialStartC; #endif } tinyos-2.1.2+dfsg/apps/UDPEcho/UDPEchoP.nc000066400000000000000000000072701207233610700200520ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include #include #include #include #include "UDPReport.h" #include "blip_printf.h" #define REPORT_PERIOD 10L module UDPEchoP { uses { interface Boot; interface SplitControl as RadioControl; interface UDP as Echo; interface UDP as Status; interface Leds; interface Timer as StatusTimer; interface BlipStatistics as IPStats; interface BlipStatistics as UDPStats; interface Random; } } implementation { bool timerStarted; nx_struct udp_report stats; struct sockaddr_in6 route_dest; event void Boot.booted() { call RadioControl.start(); timerStarted = FALSE; call IPStats.clear(); #ifdef REPORT_DEST route_dest.sin6_port = htons(7000); inet_pton6(REPORT_DEST, &route_dest.sin6_addr); call StatusTimer.startOneShot(call Random.rand16() % (1024 * REPORT_PERIOD)); #endif dbg("Boot", "booted: %i\n", TOS_NODE_ID); call Echo.bind(7); call Status.bind(7001); } event void RadioControl.startDone(error_t e) { } event void RadioControl.stopDone(error_t e) { } event void Status.recvfrom(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip6_metadata *meta) { } event void Echo.recvfrom(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip6_metadata *meta) { #ifdef PRINTFUART_ENABLED int i; uint8_t *cur = data; call Leds.led0Toggle(); printf("Echo recv [%i]: ", len); for (i = 0; i < len; i++) { printf("%02x ", cur[i]); } printf("\n"); #endif call Echo.sendto(from, data, len); } event void StatusTimer.fired() { if (!timerStarted) { call StatusTimer.startPeriodic(1024 * REPORT_PERIOD); timerStarted = TRUE; } stats.seqno++; stats.sender = TOS_NODE_ID; stats.interval = REPORT_PERIOD; call IPStats.get(&stats.ip); call UDPStats.get(&stats.udp); call Leds.led1Toggle(); call Status.sendto(&route_dest, &stats, sizeof(stats)); } } tinyos-2.1.2+dfsg/apps/UDPEcho/UDPReport.h000066400000000000000000000034641207233610700201570ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef _UDPREPORT_H #define _UDPREPORT_H #include nx_struct udp_report { nx_uint16_t seqno; nx_uint16_t sender; nx_uint16_t interval; ip_statistics_t ip; udp_statistics_t udp; } ; #endif tinyos-2.1.2+dfsg/apps/UDPEcho/tests/000077500000000000000000000000001207233610700173155ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/UDPEcho/tests/echotest.pl000066400000000000000000000016661207233610700215010ustar00rootroot00000000000000#!/usr/bin/perl use strict; use warnings; use FileHandle; use IPC::Open2; if (@ARGV != 1) { print "Usage: echotest.pl \n"; exit(1); } my $alpha = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"; my $testbuf = ""; while (length($testbuf) < 1280 - 40 - 8) { $testbuf .= $alpha; } open2(*READER, *WRITER, "nc6 -u $ARGV[0] 7"); my $trials = 0; while (1) { my $len = int(rand(1000)); print $len . "\n"; print WRITER substr($testbuf, 0, $len) . "\n"; my $rin = ''; vec($rin,fileno(READER),1) = 1; my $found = select($rin, undef, undef, "6"); if ($found == 1) { my $foo; sysread READER, $foo, 1280; if ($foo eq $testbuf) { print "WARNING: payload mismatch\n"; } } else { print "FAILURE: len: $len\n"; } $trials++; print "TRIAL: $trials\n"; sleep(.05); } # need to kill off the nc6 process print WRITER eof; tinyos-2.1.2+dfsg/apps/UDPEcho/tests/seqtest.pl000077500000000000000000000021341207233610700213450ustar00rootroot00000000000000#!/usr/bin/perl # make sure we don't break on any length boundaries use strict; use warnings; use FileHandle; use IPC::Open2; if (@ARGV != 1) { print "Usage: seqtest.pl \n"; exit(1); } my $alpha = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"; my $testbuf = ""; while (length($testbuf) < 1280 - 40 - 8) { $testbuf .= $alpha; } open2(*READER, *WRITER, "nc6 -u $ARGV[0] 7"); my $trials = 0; while (1) { my $len; for ($len = 1; $len < 1000; $len++) { print $len . "\n"; print WRITER substr($testbuf, 0, $len) . "\n"; my $rin = ''; vec($rin,fileno(READER),1) = 1; my $found = select($rin, undef, undef, "6"); if ($found == 1) { my $foo; sysread READER, $foo, 1280; if ($foo eq $testbuf) { print "WARNING: payload mismatch\n"; } } else { print "FAILURE: len: $len\n"; } $trials++; print "TRIAL: $trials\n"; sleep(.05); } } # need to kill off the nc6 process print WRITER eof; tinyos-2.1.2+dfsg/apps/UDPEcho/util/000077500000000000000000000000001207233610700171305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/UDPEcho/util/Listener.py000066400000000000000000000027121207233610700212710ustar00rootroot00000000000000 import socket import UdpReport import re import sys import time import threading port = 7000 stats = {} class PrintStats(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.daemon = True def run(self): while True: self.print_stats() time.sleep(3) def print_stats(self): global stats print "-" * 40 for k, v in stats.iteritems(): print "%s: %i/%i (%0.2f ago) (%0.2f%%)" % (k, v[0], v[3] - v[2] + 1, time.time() - v[1], 100 * float(v[0]) / (v[3] - v[2] + 1)) print "%i total" % len(stats) print "-" * 40 if __name__ == '__main__': s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) s.bind(('', port)) ps = PrintStats() ps.start() while True: data, addr = s.recvfrom(1024) if (len(data) > 0): rpt = UdpReport.UdpReport(data=data, data_length=len(data)) print addr[0] if not addr[0] in stats: stats[addr[0]] = (0, time.time(), rpt.get_seqno(), rpt.get_seqno()) cur = stats[addr[0]] stats[addr[0]] = (cur[0] + 1, time.time(), cur[2], rpt.get_seqno()) tinyos-2.1.2+dfsg/apps/UDPEcho/util/Makefile000066400000000000000000000003571207233610700205750ustar00rootroot00000000000000# -*- makefile -*- UdpReport.py: ../UDPReport.h mig -DMIG -I$(TOSROOT)/tos/lib/net/blip -I$(TOSROOT)/tos/chips/cc2420 -I$(TOSROOT)/support/sdk/c/blip/include python -python-classname=UdpReport ../UDPReport.h udp_report -o UdpReport.py tinyos-2.1.2+dfsg/apps/UDPEcho/util/UdpReport.py000066400000000000000000000446251207233610700214410ustar00rootroot00000000000000# # This class is automatically generated by mig. DO NOT EDIT THIS FILE. # This class implements a Python interface to the 'UdpReport' # message type. # import tinyos.message.Message # The default size of this message type in bytes. DEFAULT_MESSAGE_SIZE = 21 # The Active Message type associated with this message. AM_TYPE = -1 class UdpReport(tinyos.message.Message.Message): # Create a new UdpReport of size 21. def __init__(self, data="", addr=None, gid=None, base_offset=0, data_length=21): tinyos.message.Message.Message.__init__(self, data, addr, gid, base_offset, data_length) self.amTypeSet(AM_TYPE) # Get AM_TYPE def get_amType(cls): return AM_TYPE get_amType = classmethod(get_amType) # # Return a String representation of this message. Includes the # message type name and the non-indexed field values. # def __str__(self): s = "Message \n" try: s += " [seqno=0x%x]\n" % (self.get_seqno()) except: pass try: s += " [sender=0x%x]\n" % (self.get_sender()) except: pass try: s += " [interval=0x%x]\n" % (self.get_interval()) except: pass try: s += " [ip.sent=0x%x]\n" % (self.get_ip_sent()) except: pass try: s += " [ip.forwarded=0x%x]\n" % (self.get_ip_forwarded()) except: pass try: s += " [ip.rx_drop=0x%x]\n" % (self.get_ip_rx_drop()) except: pass try: s += " [ip.tx_drop=0x%x]\n" % (self.get_ip_tx_drop()) except: pass try: s += " [ip.fw_drop=0x%x]\n" % (self.get_ip_fw_drop()) except: pass try: s += " [ip.rx_total=0x%x]\n" % (self.get_ip_rx_total()) except: pass try: s += " [ip.encfail=0x%x]\n" % (self.get_ip_encfail()) except: pass try: s += " [udp.sent=0x%x]\n" % (self.get_udp_sent()) except: pass try: s += " [udp.rcvd=0x%x]\n" % (self.get_udp_rcvd()) except: pass try: s += " [udp.cksum=0x%x]\n" % (self.get_udp_cksum()) except: pass return s # Message-type-specific access methods appear below. # # Accessor methods for field: seqno # Field type: int # Offset (bits): 0 # Size (bits): 16 # # # Return whether the field 'seqno' is signed (False). # def isSigned_seqno(self): return False # # Return whether the field 'seqno' is an array (False). # def isArray_seqno(self): return False # # Return the offset (in bytes) of the field 'seqno' # def offset_seqno(self): return (0 / 8) # # Return the offset (in bits) of the field 'seqno' # def offsetBits_seqno(self): return 0 # # Return the value (as a int) of the field 'seqno' # def get_seqno(self): return self.getUIntElement(self.offsetBits_seqno(), 16, 1) # # Set the value of the field 'seqno' # def set_seqno(self, value): self.setUIntElement(self.offsetBits_seqno(), 16, value, 1) # # Return the size, in bytes, of the field 'seqno' # def size_seqno(self): return (16 / 8) # # Return the size, in bits, of the field 'seqno' # def sizeBits_seqno(self): return 16 # # Accessor methods for field: sender # Field type: int # Offset (bits): 16 # Size (bits): 16 # # # Return whether the field 'sender' is signed (False). # def isSigned_sender(self): return False # # Return whether the field 'sender' is an array (False). # def isArray_sender(self): return False # # Return the offset (in bytes) of the field 'sender' # def offset_sender(self): return (16 / 8) # # Return the offset (in bits) of the field 'sender' # def offsetBits_sender(self): return 16 # # Return the value (as a int) of the field 'sender' # def get_sender(self): return self.getUIntElement(self.offsetBits_sender(), 16, 1) # # Set the value of the field 'sender' # def set_sender(self, value): self.setUIntElement(self.offsetBits_sender(), 16, value, 1) # # Return the size, in bytes, of the field 'sender' # def size_sender(self): return (16 / 8) # # Return the size, in bits, of the field 'sender' # def sizeBits_sender(self): return 16 # # Accessor methods for field: interval # Field type: int # Offset (bits): 32 # Size (bits): 16 # # # Return whether the field 'interval' is signed (False). # def isSigned_interval(self): return False # # Return whether the field 'interval' is an array (False). # def isArray_interval(self): return False # # Return the offset (in bytes) of the field 'interval' # def offset_interval(self): return (32 / 8) # # Return the offset (in bits) of the field 'interval' # def offsetBits_interval(self): return 32 # # Return the value (as a int) of the field 'interval' # def get_interval(self): return self.getUIntElement(self.offsetBits_interval(), 16, 1) # # Set the value of the field 'interval' # def set_interval(self, value): self.setUIntElement(self.offsetBits_interval(), 16, value, 1) # # Return the size, in bytes, of the field 'interval' # def size_interval(self): return (16 / 8) # # Return the size, in bits, of the field 'interval' # def sizeBits_interval(self): return 16 # # Accessor methods for field: ip.sent # Field type: int # Offset (bits): 48 # Size (bits): 16 # # # Return whether the field 'ip.sent' is signed (False). # def isSigned_ip_sent(self): return False # # Return whether the field 'ip.sent' is an array (False). # def isArray_ip_sent(self): return False # # Return the offset (in bytes) of the field 'ip.sent' # def offset_ip_sent(self): return (48 / 8) # # Return the offset (in bits) of the field 'ip.sent' # def offsetBits_ip_sent(self): return 48 # # Return the value (as a int) of the field 'ip.sent' # def get_ip_sent(self): return self.getUIntElement(self.offsetBits_ip_sent(), 16, 1) # # Set the value of the field 'ip.sent' # def set_ip_sent(self, value): self.setUIntElement(self.offsetBits_ip_sent(), 16, value, 1) # # Return the size, in bytes, of the field 'ip.sent' # def size_ip_sent(self): return (16 / 8) # # Return the size, in bits, of the field 'ip.sent' # def sizeBits_ip_sent(self): return 16 # # Accessor methods for field: ip.forwarded # Field type: int # Offset (bits): 64 # Size (bits): 16 # # # Return whether the field 'ip.forwarded' is signed (False). # def isSigned_ip_forwarded(self): return False # # Return whether the field 'ip.forwarded' is an array (False). # def isArray_ip_forwarded(self): return False # # Return the offset (in bytes) of the field 'ip.forwarded' # def offset_ip_forwarded(self): return (64 / 8) # # Return the offset (in bits) of the field 'ip.forwarded' # def offsetBits_ip_forwarded(self): return 64 # # Return the value (as a int) of the field 'ip.forwarded' # def get_ip_forwarded(self): return self.getUIntElement(self.offsetBits_ip_forwarded(), 16, 1) # # Set the value of the field 'ip.forwarded' # def set_ip_forwarded(self, value): self.setUIntElement(self.offsetBits_ip_forwarded(), 16, value, 1) # # Return the size, in bytes, of the field 'ip.forwarded' # def size_ip_forwarded(self): return (16 / 8) # # Return the size, in bits, of the field 'ip.forwarded' # def sizeBits_ip_forwarded(self): return 16 # # Accessor methods for field: ip.rx_drop # Field type: short # Offset (bits): 80 # Size (bits): 8 # # # Return whether the field 'ip.rx_drop' is signed (False). # def isSigned_ip_rx_drop(self): return False # # Return whether the field 'ip.rx_drop' is an array (False). # def isArray_ip_rx_drop(self): return False # # Return the offset (in bytes) of the field 'ip.rx_drop' # def offset_ip_rx_drop(self): return (80 / 8) # # Return the offset (in bits) of the field 'ip.rx_drop' # def offsetBits_ip_rx_drop(self): return 80 # # Return the value (as a short) of the field 'ip.rx_drop' # def get_ip_rx_drop(self): return self.getUIntElement(self.offsetBits_ip_rx_drop(), 8, 1) # # Set the value of the field 'ip.rx_drop' # def set_ip_rx_drop(self, value): self.setUIntElement(self.offsetBits_ip_rx_drop(), 8, value, 1) # # Return the size, in bytes, of the field 'ip.rx_drop' # def size_ip_rx_drop(self): return (8 / 8) # # Return the size, in bits, of the field 'ip.rx_drop' # def sizeBits_ip_rx_drop(self): return 8 # # Accessor methods for field: ip.tx_drop # Field type: short # Offset (bits): 88 # Size (bits): 8 # # # Return whether the field 'ip.tx_drop' is signed (False). # def isSigned_ip_tx_drop(self): return False # # Return whether the field 'ip.tx_drop' is an array (False). # def isArray_ip_tx_drop(self): return False # # Return the offset (in bytes) of the field 'ip.tx_drop' # def offset_ip_tx_drop(self): return (88 / 8) # # Return the offset (in bits) of the field 'ip.tx_drop' # def offsetBits_ip_tx_drop(self): return 88 # # Return the value (as a short) of the field 'ip.tx_drop' # def get_ip_tx_drop(self): return self.getUIntElement(self.offsetBits_ip_tx_drop(), 8, 1) # # Set the value of the field 'ip.tx_drop' # def set_ip_tx_drop(self, value): self.setUIntElement(self.offsetBits_ip_tx_drop(), 8, value, 1) # # Return the size, in bytes, of the field 'ip.tx_drop' # def size_ip_tx_drop(self): return (8 / 8) # # Return the size, in bits, of the field 'ip.tx_drop' # def sizeBits_ip_tx_drop(self): return 8 # # Accessor methods for field: ip.fw_drop # Field type: short # Offset (bits): 96 # Size (bits): 8 # # # Return whether the field 'ip.fw_drop' is signed (False). # def isSigned_ip_fw_drop(self): return False # # Return whether the field 'ip.fw_drop' is an array (False). # def isArray_ip_fw_drop(self): return False # # Return the offset (in bytes) of the field 'ip.fw_drop' # def offset_ip_fw_drop(self): return (96 / 8) # # Return the offset (in bits) of the field 'ip.fw_drop' # def offsetBits_ip_fw_drop(self): return 96 # # Return the value (as a short) of the field 'ip.fw_drop' # def get_ip_fw_drop(self): return self.getUIntElement(self.offsetBits_ip_fw_drop(), 8, 1) # # Set the value of the field 'ip.fw_drop' # def set_ip_fw_drop(self, value): self.setUIntElement(self.offsetBits_ip_fw_drop(), 8, value, 1) # # Return the size, in bytes, of the field 'ip.fw_drop' # def size_ip_fw_drop(self): return (8 / 8) # # Return the size, in bits, of the field 'ip.fw_drop' # def sizeBits_ip_fw_drop(self): return 8 # # Accessor methods for field: ip.rx_total # Field type: short # Offset (bits): 104 # Size (bits): 8 # # # Return whether the field 'ip.rx_total' is signed (False). # def isSigned_ip_rx_total(self): return False # # Return whether the field 'ip.rx_total' is an array (False). # def isArray_ip_rx_total(self): return False # # Return the offset (in bytes) of the field 'ip.rx_total' # def offset_ip_rx_total(self): return (104 / 8) # # Return the offset (in bits) of the field 'ip.rx_total' # def offsetBits_ip_rx_total(self): return 104 # # Return the value (as a short) of the field 'ip.rx_total' # def get_ip_rx_total(self): return self.getUIntElement(self.offsetBits_ip_rx_total(), 8, 1) # # Set the value of the field 'ip.rx_total' # def set_ip_rx_total(self, value): self.setUIntElement(self.offsetBits_ip_rx_total(), 8, value, 1) # # Return the size, in bytes, of the field 'ip.rx_total' # def size_ip_rx_total(self): return (8 / 8) # # Return the size, in bits, of the field 'ip.rx_total' # def sizeBits_ip_rx_total(self): return 8 # # Accessor methods for field: ip.encfail # Field type: short # Offset (bits): 112 # Size (bits): 8 # # # Return whether the field 'ip.encfail' is signed (False). # def isSigned_ip_encfail(self): return False # # Return whether the field 'ip.encfail' is an array (False). # def isArray_ip_encfail(self): return False # # Return the offset (in bytes) of the field 'ip.encfail' # def offset_ip_encfail(self): return (112 / 8) # # Return the offset (in bits) of the field 'ip.encfail' # def offsetBits_ip_encfail(self): return 112 # # Return the value (as a short) of the field 'ip.encfail' # def get_ip_encfail(self): return self.getUIntElement(self.offsetBits_ip_encfail(), 8, 1) # # Set the value of the field 'ip.encfail' # def set_ip_encfail(self, value): self.setUIntElement(self.offsetBits_ip_encfail(), 8, value, 1) # # Return the size, in bytes, of the field 'ip.encfail' # def size_ip_encfail(self): return (8 / 8) # # Return the size, in bits, of the field 'ip.encfail' # def sizeBits_ip_encfail(self): return 8 # # Accessor methods for field: udp.sent # Field type: int # Offset (bits): 120 # Size (bits): 16 # # # Return whether the field 'udp.sent' is signed (False). # def isSigned_udp_sent(self): return False # # Return whether the field 'udp.sent' is an array (False). # def isArray_udp_sent(self): return False # # Return the offset (in bytes) of the field 'udp.sent' # def offset_udp_sent(self): return (120 / 8) # # Return the offset (in bits) of the field 'udp.sent' # def offsetBits_udp_sent(self): return 120 # # Return the value (as a int) of the field 'udp.sent' # def get_udp_sent(self): return self.getUIntElement(self.offsetBits_udp_sent(), 16, 1) # # Set the value of the field 'udp.sent' # def set_udp_sent(self, value): self.setUIntElement(self.offsetBits_udp_sent(), 16, value, 1) # # Return the size, in bytes, of the field 'udp.sent' # def size_udp_sent(self): return (16 / 8) # # Return the size, in bits, of the field 'udp.sent' # def sizeBits_udp_sent(self): return 16 # # Accessor methods for field: udp.rcvd # Field type: int # Offset (bits): 136 # Size (bits): 16 # # # Return whether the field 'udp.rcvd' is signed (False). # def isSigned_udp_rcvd(self): return False # # Return whether the field 'udp.rcvd' is an array (False). # def isArray_udp_rcvd(self): return False # # Return the offset (in bytes) of the field 'udp.rcvd' # def offset_udp_rcvd(self): return (136 / 8) # # Return the offset (in bits) of the field 'udp.rcvd' # def offsetBits_udp_rcvd(self): return 136 # # Return the value (as a int) of the field 'udp.rcvd' # def get_udp_rcvd(self): return self.getUIntElement(self.offsetBits_udp_rcvd(), 16, 1) # # Set the value of the field 'udp.rcvd' # def set_udp_rcvd(self, value): self.setUIntElement(self.offsetBits_udp_rcvd(), 16, value, 1) # # Return the size, in bytes, of the field 'udp.rcvd' # def size_udp_rcvd(self): return (16 / 8) # # Return the size, in bits, of the field 'udp.rcvd' # def sizeBits_udp_rcvd(self): return 16 # # Accessor methods for field: udp.cksum # Field type: int # Offset (bits): 152 # Size (bits): 16 # # # Return whether the field 'udp.cksum' is signed (False). # def isSigned_udp_cksum(self): return False # # Return whether the field 'udp.cksum' is an array (False). # def isArray_udp_cksum(self): return False # # Return the offset (in bytes) of the field 'udp.cksum' # def offset_udp_cksum(self): return (152 / 8) # # Return the offset (in bits) of the field 'udp.cksum' # def offsetBits_udp_cksum(self): return 152 # # Return the value (as a int) of the field 'udp.cksum' # def get_udp_cksum(self): return self.getUIntElement(self.offsetBits_udp_cksum(), 16, 1) # # Set the value of the field 'udp.cksum' # def set_udp_cksum(self, value): self.setUIntElement(self.offsetBits_udp_cksum(), 16, value, 1) # # Return the size, in bytes, of the field 'udp.cksum' # def size_udp_cksum(self): return (16 / 8) # # Return the size, in bits, of the field 'udp.cksum' # def sizeBits_udp_cksum(self): return 16 tinyos-2.1.2+dfsg/apps/UDPEcho/volumes-at45db.xml000066400000000000000000000003141207233610700214460ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/UDPEcho/volumes-stm25p.xml000066400000000000000000000003211207233610700215130ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/000077500000000000000000000000001207233610700160665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/LinkBench/000077500000000000000000000000001207233610700177235ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/LinkBench/BenchmarkAppC.nc000066400000000000000000000052731207233610700227120ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ #include "Messages.h" configuration BenchmarkAppC {} implementation { components MainC; Comm.Boot -> MainC.Boot; components BenchmarkCoreC as Core; components BenchmarkAppP as Comm; Comm.BenchmarkCore -> Core; Comm.CoreControl -> Core; Comm.CoreInit -> Core; components LedsC; Comm.Leds -> LedsC; #ifdef TOSSIM components SerialActiveMessageC as Medium; components new SerialAMReceiverC(AM_CTRLMSG_T) as RxCtrl; components new SerialAMReceiverC(AM_SETUPMSG_T) as RxSetup; components new SerialAMSenderC(AM_SYNCMSG_T) as TxSync; components new SerialAMSenderC(AM_DATAMSG_T) as TxData; #else components ActiveMessageC as Medium; components new AMReceiverC(AM_CTRLMSG_T) as RxCtrl; components new AMReceiverC(AM_SETUPMSG_T) as RxSetup; components new DirectAMSenderC(AM_SYNCMSG_T) as TxSync; components new DirectAMSenderC(AM_DATAMSG_T) as TxData; #endif Comm.RxCtrl -> RxCtrl; Comm.RxSetup -> RxSetup; Comm.TxSync -> TxSync; Comm.TxData -> TxData; Comm.Control -> Medium; Comm.Packet -> Medium; } tinyos-2.1.2+dfsg/apps/tests/LinkBench/BenchmarkAppP.nc000066400000000000000000000135461207233610700227310ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ module BenchmarkAppP @safe() { uses { interface Boot; interface Receive as RxCtrl; interface Receive as RxSetup; interface AMSend as TxSync; interface AMSend as TxData; interface SplitControl as Control; interface BenchmarkCore; interface StdControl as CoreControl; interface Init as CoreInit; interface Packet; interface Leds; } } implementation { bool core_configured, core_finished; uint8_t resp_request, resp_idx; message_t bpkt; event void Boot.booted() { call Control.start(); } event void Control.startDone(error_t error) { if (error != SUCCESS) call Control.start(); else { call CoreInit.init(); core_configured = core_finished = FALSE; } } event void Control.stopDone(error_t error) { call Control.start(); } task void sendData() { datamsg_t* msg = (datamsg_t*)(call Packet.getPayload(&bpkt,sizeof(datamsg_t))); call Packet.clear(&bpkt); if ( resp_request == CTRL_STAT_REQ && core_finished ) { msg->type = DATA_STAT_OK; msg->data_idx = resp_idx; msg->payload.stat = *(call BenchmarkCore.getStat(resp_idx)); call TxData.send(AM_BROADCAST_ADDR, &bpkt, sizeof(datamsg_t)); // RESPONSE profile information } else if ( resp_request == CTRL_PROFILE_REQ && core_finished ) { msg->type = DATA_PROFILE_OK; msg->data_idx = resp_idx; msg->payload.profile = *(call BenchmarkCore.getProfile()); call TxData.send(AM_BROADCAST_ADDR, &bpkt, sizeof(datamsg_t)); } } task void sendSync() { syncmsg_t* msg = (syncmsg_t*)(call Packet.getPayload(&bpkt,sizeof(syncmsg_t))); call Packet.clear(&bpkt); // RESPONSE the setup acknowledgement if applicable if ( resp_request == CTRL_SETUP_SYN && core_configured ) { msg->type = SYNC_SETUP_ACK; msg->edgecnt = call BenchmarkCore.getEdgeCount(); msg->maxmoteid = call BenchmarkCore.getMaxMoteId(); dbg("Benchmark","sendSync sending... %d\n",TOS_NODE_ID); call TxSync.send(AM_BROADCAST_ADDR, &bpkt, sizeof(syncmsg_t)); } } event void TxSync.sendDone(message_t* bufPtr, error_t error) { } event void TxData.sendDone(message_t* bufPtr, error_t error) { } event message_t* RxSetup.receive(message_t* bufPtr, void* payload, uint8_t len) { setupmsg_t* msg = (setupmsg_t*)payload; dbg("Benchmark","RxSetup.receive SETUP%d\n",TOS_NODE_ID); call BenchmarkCore.setup(msg->config); return bufPtr; } event message_t* RxCtrl.receive(message_t* bufPtr, void* payload, uint8_t len) { ctrlmsg_t* msg = (ctrlmsg_t*)payload; switch ( msg->type ) { case CTRL_RESET : dbg("Benchmark","RxCtrl.receive RESET %d\n",TOS_NODE_ID); call BenchmarkCore.reset(); call Control.stop(); break; case CTRL_SETUP_SYN : dbg("Benchmark","RxCtrl.receive SETUP_SYN %d\n",TOS_NODE_ID); if( core_configured ) { resp_request = msg->type; post sendSync(); } break; case CTRL_START : dbg("Benchmark","RxCtrl.receive START %d\n",TOS_NODE_ID); if( core_configured ) { dbg("Benchmark"," ---- START CORE%d\n",TOS_NODE_ID); call CoreControl.start(); } break; case CTRL_STAT_REQ: dbg("Benchmark","RxCtrl.receive STAT_REQ %d\n",TOS_NODE_ID); if ( core_finished ) { dbg("Benchmark","------- CORE FINISHED\n"); resp_request = msg->type; resp_idx = msg->data_req_idx; post sendData(); } else dbg("Benchmark","------- CORE NOT FINISHED\n"); break; case CTRL_PROFILE_REQ: dbg("Benchmark","RxCtrl.receive PROFILE_REQ %d\n",TOS_NODE_ID); if ( core_finished ) { resp_request = msg->type; resp_idx = msg->data_req_idx; post sendData(); } break; default: break; } return bufPtr; } event void BenchmarkCore.finished() { core_finished = TRUE; } event void BenchmarkCore.setupDone() { core_configured = TRUE; } event void BenchmarkCore.resetDone() { core_configured = core_finished = FALSE; } } tinyos-2.1.2+dfsg/apps/tests/LinkBench/BenchmarkCore.h000066400000000000000000000131651207233610700226050ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ #ifndef BENCHMARK_CORE_H #define BENCHMARK_CORE_H #if MAX_EDGE_COUNT <= 8 typedef uint8_t pending_t; #elif MAX_EDGE_COUNT <= 16 typedef uint16_t pending_t; #elif MAX_EDGE_COUNT <= 32 typedef uint32_t pending_t; #elif MAX_EDGE_COUNT <= 64 typedef uint64_t pending_t; #else #error "MAX_EDGE_COUNT is set too high! The current limit is 64!" #endif typedef pending_t edgeaddr_t; enum { MAX_TIMER_COUNT = 4, // Policy flags GLOBAL_USE_ACK = 1<<0, GLOBAL_USE_BCAST = 1<<1, GLOBAL_USE_MAC_LPL = 1<<2, GLOBAL_USE_MAC_PLINK = 1<<3, // Sending flags SEND_ON_REQ = 0, SEND_ON_INIT = 1, SEND_ON_TIMER = 2, STOP_ON_ACK = 1<<0, STOP_ON_TIMER = 1<<1, NEED_ACK = 1, INFINITE = 0, }; typedef struct flag_t { uint8_t start_trigger : 3; // When to start sending messages uint8_t stop_trigger : 2; // When to stop an infinite sending loop uint8_t need_ack : 1; // ACK is needed? uint8_t inf_loop_on : 1; // Whether an infinite sending loop is active uint8_t reserved : 1; // Reserved for future expansion } flag_t; typedef struct timerset_t { uint8_t start; uint8_t stop; } timerset_t; typedef struct num_t { uint8_t send_num; // How many messages to transmit in general uint8_t left_num; // How many messages are left to transmit } num_t; // Base types for message counting / message sequence values #ifdef USE_32_BITS typedef uint32_t seq_base_t; typedef nx_uint32_t nx_seq_base_t; #else typedef uint16_t seq_base_t; typedef nx_uint16_t nx_seq_base_t; #endif typedef struct edge_t { uint16_t sender; // Sender end of the edge uint16_t receiver; // Receiver end of the edge timerset_t timers; // Timers associated to this edge flag_t policy; // Sending policies, settings, triggers num_t nums; // Message counters edgeaddr_t reply_on; // The edge bitmask used when sending on reception seq_base_t nextmsgid; // The message id to send (on send side)/consecutive to receive (on receive side) } edge_t; // Stats type typedef nx_struct stat_t { nx_seq_base_t triggerCount; nx_seq_base_t backlogCount; nx_seq_base_t resendCount; nx_seq_base_t sendCount; nx_seq_base_t sendSuccessCount; nx_seq_base_t sendFailCount; nx_seq_base_t sendDoneCount; nx_seq_base_t sendDoneSuccessCount; nx_seq_base_t sendDoneFailCount; nx_seq_base_t wasAckedCount; nx_seq_base_t notAckedCount; nx_seq_base_t receiveCount; nx_seq_base_t consecutiveCount; nx_seq_base_t duplicateCount; nx_seq_base_t forwardCount; nx_seq_base_t missedCount; nx_seq_base_t wrongCount; nx_uint8_t remainedCount; } stat_t; typedef nx_struct profile_t { nx_int32_t min_atomic; nx_int32_t min_interrupt; nx_int32_t min_latency; nx_int32_t max_atomic; nx_int32_t max_interrupt; nx_int32_t max_latency; nx_uint32_t rtx_time; nx_uint32_t rstart_count; nx_uint32_t rx_bytes; nx_uint32_t tx_bytes; nx_uint32_t rx_msgs; nx_uint16_t debug; } profile_t; typedef nx_struct timersetup_t { nx_uint8_t isoneshot; nx_uint32_t delay; nx_uint32_t period_msec; } timersetup_t; // Where the MAC settings are located in the mac_setup_t type? enum { // Extend the size of this struct if necessary for new MAC-s. MAC_SETUP_LENGTH = 2, LPL_WAKEUP_OFFSET = 0, PLINK_RETRIES_OFFSET = 0, PLINK_DELAY_OFFSET = 1 }; typedef nx_uint16_t mac_setup_t[MAC_SETUP_LENGTH]; // Basic setup type typedef nx_struct setup_t { nx_uint8_t problem_idx; // The problem we should test nx_uint32_t pre_run_msec; nx_uint32_t runtime_msec; // How long should we run the test? nx_uint32_t post_run_msec; nx_uint8_t flags; // Global flags ( such as BCAST, ACK, LPL, PLINK ) timersetup_t timers[MAX_TIMER_COUNT]; // Mac protocol-specific settings mac_setup_t mac_setup; } setup_t; #endif tinyos-2.1.2+dfsg/apps/tests/LinkBench/BenchmarkCore.nc000066400000000000000000000051041207233610700227500ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ #include "BenchmarkCore.h" interface BenchmarkCore { /** * Requests a statistics indexed by 'index' * @return the stat */ command stat_t* getStat(uint16_t idx); /** * Requests the profile information * @return the mote stat structure */ command profile_t* getProfile(); /** * Requests the current edge count * @return the edge count of the current problem */ command uint8_t getEdgeCount(); /** * Requests the maximal mote id present in the current benchmark * @return the maximal mote id */ command uint8_t getMaxMoteId(); /** Configures the benchmark core with 'conf' */ command void setup(setup_t conf); /** Indicates the successfull configuration of the benchmark */ event void setupDone(); /** Resets the benchmarking core component */ command void reset(); /** Indicates the finish of the reset operation */ event void resetDone(); /** Indicates the finish of the benchmark */ event void finished(); } tinyos-2.1.2+dfsg/apps/tests/LinkBench/BenchmarkCoreC.nc000066400000000000000000000071221207233610700230550ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ #include "Messages.h" configuration BenchmarkCoreC { provides { interface StdControl; interface BenchmarkCore; interface Init; } } implementation { components BenchmarkCoreP as Core; components new DirectAMSenderC(AM_TESTMSG_T) as TxTest; components new AMReceiverC(AM_TESTMSG_T) as RxTest; Core.RxTest -> RxTest; Core.TxTest -> TxTest; components ActiveMessageC; Core.Packet -> ActiveMessageC; Core.Ack -> ActiveMessageC; #ifdef LOW_POWER_LISTENING #if defined(RADIO_RF230) || defined(RADIO_CC1000) || defined(RADIO_CC2420) || defined(RADIO_CC2520) || defined(RADIO_CC2420X) || defined(RADIO_RFA1) Core.LowPowerListening -> ActiveMessageC; #else #error " * NO PLATFORM SUPPORT FOR LOW POWER LISTENING LAYER *" #endif #endif #ifdef PACKET_LINK #if defined(RADIO_CC2420) components CC2420ActiveMessageC; Core.PacketLink -> CC2420ActiveMessageC; #elif defined(RADIO_RF230) || defined(RADIO_CC2520) || defined(RADIO_CC2420X) Core.PacketLink -> ActiveMessageC; #else #error " * NO PLATFORM SUPPORT FOR PACKET LINK LAYER *" #endif #endif #ifdef TRAFFIC_MONITOR #if defined(RADIO_RF230) components RF230RadioC; Core.TrafficMonitor -> RF230RadioC; #elif defined(RADIO_CC2420X) components CC2420XRadioC; Core.TrafficMonitor -> CC2420XRadioC; #elif defined(RADIO_CC2420) components CC2420ActiveMessageC; Core.TrafficMonitor -> CC2420ActiveMessageC; #endif #endif components new TimerMilliC() as Timer; Core.TestTimer -> Timer; components LedsC; Core.Leds -> LedsC; components new VirtualizeTimerC(TMilli,MAX_TIMER_COUNT) as TTimer; components new TimerMilliC() as TTimerFrom; TTimer.TimerFrom -> TTimerFrom; Core.TriggerTimer -> TTimer; components RandomMlcgC; Core.Random -> RandomMlcgC; Core.RandomInit -> RandomMlcgC; components CodeProfileC; Core.CodeProfile -> CodeProfileC; Core.CodeProfileControl -> CodeProfileC; StdControl = Core; BenchmarkCore = Core; Init = Core; } tinyos-2.1.2+dfsg/apps/tests/LinkBench/BenchmarkCoreP.nc000066400000000000000000000513501207233610700230740ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ #define _DEBUG_MODE_ #include "BenchmarkCore.h" #include "Benchmarks.h" #define SET_STATE(s) atomic { call Leds.set(s); state = s; } #if defined(_DEBUG_MODE_) #define _ASSERT_(cond) if(!(cond || profile.debug)){ profile.debug = __LINE__; } #else #define str(s) s #define _ASSERT_(cond) str() #endif module BenchmarkCoreP @safe() { provides { interface Init; interface StdControl as Test; interface BenchmarkCore; } uses { interface Receive as RxTest; interface AMSend as TxTest; interface Timer as TestTimer; interface Timer as TriggerTimer[uint8_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements as Ack; #ifdef LOW_POWER_LISTENING interface LowPowerListening; #endif #ifdef PACKET_LINK interface PacketLink; #endif #ifdef TRAFFIC_MONITOR interface TrafficMonitor; #endif interface CodeProfile; interface StdControl as CodeProfileControl; interface Leds; interface Random; interface Init as RandomInit; } } implementation { enum { // Mote states STATE_INVALID = 0x0, STATE_IDLE = 0x1, STATE_CONFIGURED = 0x2, STATE_PRE_RUN = 0x3, STATE_RUNNING = 0x4, STATE_POST_RUN = 0x5, STATE_FINISHED = 0x6, // Sendlock states UNLOCKED = 0, LOCKED = 1, }; uint8_t state, sendlock; setup_t config; message_t pkt; edge_t* problem; uint8_t c_edge_cnt,c_maxmoteid; stat_t stats[MAX_EDGE_COUNT]; profile_t profile; // pre-computed values for faster operation pending_t tickMask_start[MAX_TIMER_COUNT]; pending_t tickMask_stop [MAX_TIMER_COUNT]; pending_t outgoing_edges; // Bitmask specifying edges with pending send requests pending_t pending; // Last edge index on which we have sent message uint8_t eidx = 0xFF; task void sendPending(); /** CLEAN THE STATE MACHINE VARIABLES **/ void cleanstate() { SET_STATE( STATE_INVALID ) // Disassociate the problem problem = (edge_t*)NULL; c_edge_cnt = c_maxmoteid = 0; outgoing_edges = 0; // Clear configuration values memset(&config,0,sizeof(setup_t)); memset(stats,0,sizeof(stat_t)*MAX_EDGE_COUNT); memset(&profile,0,sizeof(profile_t)); memset(tickMask_start,0,sizeof(pending_t)*MAX_TIMER_COUNT); memset(tickMask_stop,0,sizeof(pending_t)*MAX_TIMER_COUNT); pending = 0x0; eidx = 0xFF; sendlock = UNLOCKED; call Packet.clear(&pkt); call Ack.noAck(&pkt); SET_STATE( STATE_IDLE ) } /** START THE NEEDED TRIGGERING TIMERS **/ void startTimers() { uint8_t i; uint32_t now; for(i = 0; i< MAX_TIMER_COUNT; ++i) { // If the current timer is unused, do not start it if ( tickMask_start[i] == 0 && tickMask_stop[i] == 0 ) continue; now = call TriggerTimer.getNow[0](); if ( config.timers[i].isoneshot ) call TriggerTimer.startOneShotAt[i]( now + config.timers[i].delay, config.timers[i].period_msec); else call TriggerTimer.startPeriodicAt[i]( now + config.timers[i].delay, config.timers[i].period_msec); } } /** STOP THE TRIGGERING TIMERS **/ void stopTimers() { uint8_t i; for(i = 0; i< MAX_TIMER_COUNT; ++i) call TriggerTimer.stop[i](); } /** INITIALIZE THE COMPONENT **/ command error_t Init.init() { cleanstate(); call RandomInit.init(); return SUCCESS; } /** REQUEST BECHMARK RESULTS **/ command stat_t* BenchmarkCore.getStat(uint16_t idx) { _ASSERT_( idx < MAX_EDGE_COUNT ) _ASSERT_( state == STATE_FINISHED ) _ASSERT_(idx < c_edge_cnt ) return stats + idx; } /** REQUEST PROFILE INFORMATION **/ command profile_t* BenchmarkCore.getProfile() { return &profile; } /** REQUEST EDGE COUNT **/ command uint8_t BenchmarkCore.getEdgeCount() { _ASSERT_( state >= STATE_CONFIGURED ) return c_edge_cnt; } /** REQUEST MOTE COUNT **/ command uint8_t BenchmarkCore.getMaxMoteId() { _ASSERT_( state >= STATE_CONFIGURED ) return c_maxmoteid; } /** RESETS THE CORE **/ command void BenchmarkCore.reset() { call Test.stop(); cleanstate(); signal BenchmarkCore.resetDone(); } /** START THE REAL BENCHMARK */ void startBenchmark() { dbg("Benchmark","BenchmarkCore startBenchmark\n"); // If this node sends initial message(s) if ( pending ) post sendPending(); // Start the trigger timers startTimers(); // Start the test timer dbg("Benchmark","BenchmarkCore start TestTimer\n"); call TestTimer.startOneShot(config.runtime_msec); } void postNewTrigger(pending_t sbitmask) { uint8_t i = 0; pending_t blogd; _ASSERT_( sbitmask > 0 ) _ASSERT_( state == STATE_RUNNING || state == STATE_IDLE || state == STATE_POST_RUN ) _ASSERT_( ((~outgoing_edges) & sbitmask) == 0 ) atomic { // Check which edges need to be backlogged blogd = pending & sbitmask; pending |= sbitmask; } // Count backlog values for ( i = 0; blogd; ++i, blogd >>= 1) { if ( blogd & 0x1 ) ++(stats[i].backlogCount); } // Count trigger values for ( i = 0; sbitmask; ++i, sbitmask >>= 1) { if ( sbitmask & 0x1 ) { ++(stats[i].triggerCount); if ( problem[i].nums.send_num == INFINITE ) problem[i].policy.inf_loop_on = 1; } } } /** SETUP THE BENCHMARK **/ command void BenchmarkCore.setup(setup_t conf) { uint8_t idx; dbg("Benchmark","BenchmarkCore.setup\n"); _ASSERT_( state == STATE_IDLE || state == STATE_CONFIGURED ) _ASSERT_( conf.runtime_msec > 0 ); // Do nothing if already configured or running or data is available if ( state == STATE_CONFIGURED ) return; // Save the configuration config = conf; // Setup the problem // WARNING: This is a very dirty hack by intent. Benchmarks are preceded by a // separator edge having sender = INVALID_SENDER and receiver = problem number. // That separator edge we are now looking for! idx = 0; while ( problemSet[idx].receiver != 0 && // do not run past the last edge (PROBLEMSET_END) ! ( problemSet[idx].sender == INVALID_SENDER && problemSet[idx].receiver == config.problem_idx ) ) { ++idx; } // In case we haven't found any benchmark with the requested id, kill the mote. if ( problemSet[idx].receiver == 0 ) { SET_STATE( STATE_INVALID ) return; } else { problem = problemSet + idx + 1; } c_maxmoteid = 1; // Initialize the edges for( idx = 0; problem[idx].sender != INVALID_SENDER; ++idx ) { edge_t* edge = problem + idx; // Clean values that are changed during operation edge->policy.inf_loop_on = 0; edge->nums.left_num = edge->nums.send_num; edge->nextmsgid = START_MSG_ID; // Count the maximal mote id if ( edge->sender > c_maxmoteid ) c_maxmoteid = edge->sender; if ( edge->receiver > c_maxmoteid && edge->receiver != ALL ) c_maxmoteid = edge->receiver; // If the sender is not this node, continue if( edge->sender != TOS_NODE_ID ) continue; // Set this bit because it is an outgoing edge from this mote outgoing_edges |= 1<policy.start_trigger == SEND_ON_INIT ) { postNewTrigger( 1<policy.start_trigger == SEND_ON_TIMER ) { tickMask_start[edge->timers.start] |= 1 << idx; } // Set the timer masks if this node needs to stop on timer ticks if ( edge->policy.stop_trigger & STOP_ON_TIMER ) tickMask_stop[edge->timers.stop] |= 1 << idx; } c_edge_cnt = idx; SET_STATE( STATE_CONFIGURED ) signal BenchmarkCore.setupDone(); } /** START THE CURRENTLY CONFIGURED BENCHMARK */ command error_t Test.start() { _ASSERT_( state == STATE_CONFIGURED ) dbg("Benchmark","BenchmarkCore Test.start\n"); // Start the code profiler call CodeProfileControl.start(); #ifdef TRAFFIC_MONITOR // save the current time. profile.rtx_time = call TrafficMonitor.getActiveTime(); profile.rstart_count = call TrafficMonitor.getStartCount(); profile.rx_bytes = call TrafficMonitor.getRxBytes(); profile.tx_bytes = call TrafficMonitor.getTxBytes(); profile.rx_msgs = call TrafficMonitor.getRxMessages(); #endif // setup the applied MAC protocol #ifdef LOW_POWER_LISTENING if ( config.flags & GLOBAL_USE_MAC_LPL ) call LowPowerListening.setLocalWakeupInterval(config.mac_setup[LPL_WAKEUP_OFFSET]); #endif #ifdef PACKET_LINK if ( config.flags & GLOBAL_USE_MAC_PLINK ) { call PacketLink.setRetries(&pkt,config.mac_setup[PLINK_RETRIES_OFFSET]); call PacketLink.setRetryDelay(&pkt,config.mac_setup[PLINK_DELAY_OFFSET]); } #endif // If a pre-benchmark delay is requested, make a delay if ( config.pre_run_msec > 0 ) { SET_STATE ( STATE_PRE_RUN ) call TestTimer.startOneShot( call Random.rand32() % config.pre_run_msec ); } else { SET_STATE( STATE_RUNNING ) startBenchmark(); } return SUCCESS; } /** STOP A TEST */ command error_t Test.stop() { uint8_t i = 0; dbg("Benchmark","BenchmarkCore Test.stop\n"); _ASSERT_( state == STATE_PRE_RUN || state == STATE_RUNNING || state == STATE_POST_RUN ) call TestTimer.stop(); SET_STATE( STATE_FINISHED ); stopTimers(); // cleanup the MAC #ifdef LOW_POWER_LISTENING if ( config.flags & GLOBAL_USE_MAC_LPL ) call LowPowerListening.setLocalWakeupInterval(0); #endif #ifdef PACKET_LINK if ( config.flags & GLOBAL_USE_MAC_PLINK ) { call PacketLink.setRetries(&pkt,0); call PacketLink.setRetryDelay(&pkt,0); } #endif // compute the remained statistic for ( i = 0; pending; ++i, pending >>= 1) { if ( pending & 0x1 ) ++(stats[i].remainedCount); } // Stop the code profiler call CodeProfileControl.stop(); // Compute the mote-statistics profile.min_atomic = call CodeProfile.getMinAtomicLength(); profile.min_interrupt = call CodeProfile.getMinInterruptLength(); profile.min_latency = call CodeProfile.getMinTaskLatency(); profile.max_atomic = call CodeProfile.getMaxAtomicLength(); profile.max_interrupt = call CodeProfile.getMaxInterruptLength(); profile.max_latency = call CodeProfile.getMaxTaskLatency(); #ifdef TRAFFIC_MONITOR // save the curent time. profile.rtx_time = call TrafficMonitor.getActiveTime() - profile.rtx_time; profile.rstart_count = call TrafficMonitor.getStartCount() - profile.rstart_count; profile.rx_bytes = call TrafficMonitor.getRxBytes() - profile.rx_bytes; profile.tx_bytes = call TrafficMonitor.getTxBytes() - profile.tx_bytes; profile.rx_msgs = call TrafficMonitor.getRxMessages() - profile.rx_msgs; #endif signal BenchmarkCore.finished(); return SUCCESS; } event void TestTimer.fired() { dbg("Benchmark","BenchmarkCore TestTimer.fired\n"); switch(state) { case STATE_PRE_RUN: SET_STATE( STATE_RUNNING ) startBenchmark(); break; case STATE_RUNNING: // Stop the trigger timers stopTimers(); // check if we need a post-run state if ( config.post_run_msec > 0 ) { SET_STATE( STATE_POST_RUN ) call TestTimer.startOneShot(config.post_run_msec); break; } // break; missing: fallback to STATE_POST_RUN ! case STATE_POST_RUN: call Test.stop(); break; default: _ASSERT_( 0 ) } } event void TriggerTimer.fired[uint8_t id]() { // start on timer tick if ( tickMask_start[id] != 0 ) { postNewTrigger(tickMask_start[id]); post sendPending(); } // stop on timer tick if ( tickMask_stop[id] != 0 ) { uint8_t i = 0; pending_t temp = tickMask_stop[id]; for ( i = 0; temp; ++i, temp >>= 1) { if ( (temp & 0x1) && (problem[i].policy.stop_trigger & STOP_ON_TIMER) ) { // This works for INFINITE and also for non-INF edges problem[i].policy.inf_loop_on = 0; problem[i].nums.left_num = problem[i].nums.send_num; } } } } event message_t* RxTest.receive(message_t* bufPtr, void* payload, uint8_t len) { testmsg_t* msg = (testmsg_t*)payload; // helper variables stat_t* stat = stats + msg->edgeid; edge_t* edge = problem + msg->edgeid; dbg("Benchmark","RxTest.receive\n"); // In case the message is sent to this mote (also) if ( state == STATE_RUNNING || state == STATE_POST_RUN ){ ++(stat->receiveCount); // If the message id is ok if ( msg->msgid == edge->nextmsgid ) { ++(stat->consecutiveCount); } else { ++(stat->wrongCount); // If we got a message with a lower id than consecutive -> duplicate if ( msg->msgid < edge->nextmsgid ) ++(stat->duplicateCount); // If we got a message with a higher id than consecutive -> we have missed messages else { ++(stat->forwardCount); stat->missedCount += msg->msgid - edge->nextmsgid; } } // Set the next consecutive message id edge->nextmsgid = msg->msgid + 1; // Check whether we have to reply if ( edge->reply_on & outgoing_edges ) { // in case of "reply-to broadcast message" policy, the reply_on bitmask could // contain edges whose source is not this mote. // that is why, a filter is applied (outgoing_edges). postNewTrigger(edge->reply_on & outgoing_edges ); post sendPending(); } } return bufPtr; } event void TxTest.sendDone(message_t* bufPtr, error_t error) { testmsg_t* msg = (testmsg_t*)(call Packet.getPayload(bufPtr,sizeof(testmsg_t))); bool validSend = TRUE, wasACK = FALSE, sendMore = TRUE; // helper variables stat_t* stat = stats + msg->edgeid; edge_t* edge = problem + msg->edgeid; dbg("Benchmark","TxTest.sendDone\n"); _ASSERT_( sendlock == LOCKED ) _ASSERT_( state == STATE_RUNNING || state == STATE_POST_RUN || state == STATE_FINISHED ) if ( state == STATE_RUNNING || state == STATE_POST_RUN ) { _ASSERT_( edge->sender == TOS_NODE_ID ) _ASSERT_( pending & (1 << msg->edgeid) ) ++(stat->sendDoneCount); if ( error == SUCCESS ) { ++(stat->sendDoneSuccessCount); // If ACK is not requested if ( edge->policy.need_ack == 0 && (config.flags & GLOBAL_USE_ACK) == 0 ) { ++(edge->nextmsgid); // If ACK is requested and received } else if ( call Ack.wasAcked(bufPtr) ) { ++(edge->nextmsgid); ++(stat->wasAckedCount); wasACK = TRUE; // Otherwise ACK requested but not received } else { ++(stat->notAckedCount); validSend = FALSE; } } else { ++(stat->sendDoneFailCount); validSend = FALSE; } // If message is NOT considered to be sent if ( ! validSend ) { ++(stat->resendCount); } else { // Decrement the number of messages that are left to send // and restore the original value if necessary // this works for INFINITE and also for non-INF edges if ( edge->nums.send_num != INFINITE && --(edge->nums.left_num) == 0 ) { // Restore the value edge->nums.left_num = edge->nums.send_num; sendMore = FALSE; } // Check if we need to stop sending on ACK if ( wasACK && (edge->policy.stop_trigger & STOP_ON_ACK) ) { // This works for INFINITE and also for non-INF edges edge->policy.inf_loop_on = 0; edge->nums.left_num = edge->nums.send_num; sendMore = FALSE; } // If the infinite sending loop has been stopped if ( edge->nums.send_num == INFINITE && !edge->policy.inf_loop_on ) { sendMore = FALSE; } } // Remove the pending bit if applicable if ( !sendMore ) { atomic { pending &= ~ (1 << msg->edgeid ); } } else { ++(stat->triggerCount); } sendlock = UNLOCKED; if ( pending ) post sendPending(); } } task void sendPending() { pending_t pidx; am_addr_t address; uint8_t oldlock; testmsg_t* t_msg; // safe locking atomic{ oldlock = sendlock; sendlock = LOCKED; } // In case we have any chance to send if ( oldlock == UNLOCKED && state == STATE_RUNNING && pending ) { dbg("Benchmark","sendPending-1\n"); // find the next edge on which there exist any request do { pidx = 1 << (++eidx); if ( pidx == 0 ) { eidx = 0x0; pidx = 0x1; } } while ( !(pending & pidx) ); _ASSERT_( problem[eidx].sender == TOS_NODE_ID ) // Compose the new message call Packet.clear(&pkt); t_msg = (testmsg_t*)(call Packet.getPayload(&pkt,sizeof(testmsg_t))); t_msg->edgeid = eidx; t_msg->msgid = problem[eidx].nextmsgid; // Find out the required addressing mode address = ( config.flags & GLOBAL_USE_BCAST ) ? AM_BROADCAST_ADDR : problem[eidx].receiver; dbg("Benchmark","sendPending address %d\n",address); // MAC specific settings #ifdef LOW_POWER_LISTENING if ( config.flags & GLOBAL_USE_MAC_LPL ) call LowPowerListening.setRemoteWakeupInterval( &pkt,config.mac_setup[LPL_WAKEUP_OFFSET]); #endif #ifdef PACKET_LINK if ( config.flags & GLOBAL_USE_MAC_PLINK ) { call PacketLink.setRetries(&pkt,config.mac_setup[PLINK_RETRIES_OFFSET]); call PacketLink.setRetryDelay(&pkt,config.mac_setup[PLINK_DELAY_OFFSET]); } #endif dbg("Benchmark","sendPending-2\n"); // Find out whether we need to use ACK if ( (config.flags & GLOBAL_USE_ACK) || problem[eidx].policy.need_ack ) { call Ack.requestAck(&pkt); } else { call Ack.noAck(&pkt); } dbg("Benchmark","sendPending-3\n"); // Send out switch ( call TxTest.send( address, &pkt, sizeof(testmsg_t)) ) { case SUCCESS : dbg("Benchmark","sendPending-4\n"); ++(stats[eidx].sendSuccessCount); break; case FAIL : dbg("Benchmark","sendPending-5\n"); ++(stats[eidx].sendFailCount); ++(stats[eidx].resendCount); sendlock = UNLOCKED; post sendPending(); break; default : dbg("Benchmark","sendPending-6\n"); _ASSERT_( 0 ) break; } ++(stats[eidx].sendCount); } } } tinyos-2.1.2+dfsg/apps/tests/LinkBench/Benchmarks.h000066400000000000000000000046621207233610700221610ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ #ifndef BENCHMARKS_H #define BENCHMARKS_H #include "BenchmarkCore.h" #include // Every benchmark can be numbered when defining it // This number is hidden in a separator edge right between the // benchmark's own edges #define _BMARK_START_(id) {INVALID_SENDER,(id),{0,0},{0,0,0,0,0},{0,0},0,0}, #define _BMARK_END_ , #define PROBLEMSET_END {INVALID_SENDER,0,{0,0},{0,0,0,0,0},{0,0},0,0} #define INVALID_SENDER AM_BROADCAST_ADDR #define ALL AM_BROADCAST_ADDR #define REPLY_ON(POS) (1<<(POS)) #define NUM(QTY) {(QTY), (QTY)} #define NO_REPLY 0 #define START_MSG_ID 1 #define NO_TIMER {0,0} #define TIMER(X) ((X)-1) edge_t problemSet[] = { #ifndef EXCLUDE_STANDARD #include "StandardBenchmarks.h" #endif #ifndef EXCLUDE_USERDEFINED #include "UserdefinedBenchmarks.h" #endif PROBLEMSET_END }; // problemSet END #endif tinyos-2.1.2+dfsg/apps/tests/LinkBench/Makefile000066400000000000000000000022051207233610700213620ustar00rootroot00000000000000COMPONENT=BenchmarkAppC # MAC protocol usage CFLAGS += -DLOW_POWER_LISTENING #CFLAGS += -DPACKET_LINK # use 32-bit length statistics ? (default is 16 bits) #CFLAGS += -DUSE_32_BITS # the maximum edge count that is present in all benchmarks CFLAGS += -DMAX_EDGE_COUNT=8 # exclude the standard benchmarks (or a part of it) from the problemset # for low-memory platforms like telosa it might be necessary #CFLAGS += -DEXCLUDE_STANDARD #CFLAGS += -DEXCLUDE_STANDARD_THROUGHPUT #CFLAGS += -DEXCLUDE_STANDARD_COLLISION #CFLAGS += -DEXCLUDE_STANDARD_FORWARDING # exclude the user defined benchmarks from the problemset CFLAGS += -DEXCLUDE_USERDEFINED # codeprofile, tossim support CFLAGS += -Icodeprofile CFLAGS += -Itossim #CFLAGS += -DTRAFFIC_MONITOR #CFLAGS += -I$(SZTETOSDIR)/lib/cc2420traffic # channel settings ifneq (,$(DEF_CHANNEL)) CFLAGS += -DCC2420_DEF_CHANNEL=$(DEF_CHANNEL) CFLAGS += -DRF230_DEF_CHANNEL=$(DEF_CHANNEL) CFLAGS += -DRFA1_DEF_CHANNEL=$(DEF_CHANNEL) endif ifneq (,$(findstring USE_32_BITS,$(CFLAGS))) CFLAGS += -DTOSH_DATA_LENGTH=97 else CFLAGS += -DTOSH_DATA_LENGTH=90 endif include $(MAKERULES) include Makefile.Pdetect tinyos-2.1.2+dfsg/apps/tests/LinkBench/Makefile.Pdetect000066400000000000000000000033121207233610700227510ustar00rootroot00000000000000# microcontroller identification ATM128_PLATFORMS = iris mica mica2 mica2dot micaz btnode3 ucmini ucdual ucmote900 MSP430_PLATFORMS = epic eyesIFX eyesIFXv1 eyesIFXv2 shimmer shimmer2 shimmer2r span telosa telosb tinynode z1 PXA27X_PLATFORMS = intelmote2 M16C62P_PLATFORMS= mulle CORTEX_PLATFORMS = sam3u_ek sam3s_ek ifneq ($(findstring $(PLATFORM),$(ATM128_PLATFORMS)),) MCU ?= ATM128 else ifneq ($(findstring $(PLATFORM),$(MSP430_PLATFORMS)),) MCU ?= MSP430 else ifneq ($(findstring $(PLATFORM),$(PXA27X_PLATFORMS)),) MCU ?= PXA27X else ifneq ($(findstring $(PLATFORM),$(M16C62P_PLATFORMS)),) MCU ?= M16C62P else ifneq ($(findstring $(PLATFORM),$(CORTEX_PLATFORMS)),) MCU ?= CORTEX else MCU ?= UNKNOWN endif CONTROLLER_$(MCU) = $(MCU) CFLAGS += -DCONTROLLER_$(MCU) # radio chip identification RFA1_PLATFORMS = ucmini ucdual ucmote900 RF230_PLATFORMS = iris mulle CC1000_PLATFORMS = mica mica2 mica2dot btnode3 CC2420_PLATFORMS = micaz telosa telosb shimmer shimmer2 shimmer2r epic span intelmote2 z1 sam3u_ek TDA5250_PLATFORMS= eyesIFX eyesIFXv1 eyesIFXv2 XE1205_PLATFORMS = tinynode CC2520_PLATFORMS = sam3s_ek ifneq ($(findstring $(PLATFORM),$(RF230_PLATFORMS)),) RCHIP ?= RF230 else ifneq ($(findstring $(PLATFORM),$(CC1000_PLATFORMS)),) RCHIP ?= CC1000 else ifneq ($(findstring $(PLATFORM),$(CC2420_PLATFORMS)),) RCHIP ?= CC2420 else ifneq ($(findstring $(PLATFORM),$(TDA5250_PLATFORMS)),) RCHIP ?= TDA5250 else ifneq ($(findstring $(PLATFORM),$(XE1205_PLATFORMS)),) RCHIP ?= XE1205 else ifneq ($(findstring $(PLATFORM),$(CC2520_PLATFORMS)),) RCHIP ?= CC2520 else ifneq ($(findstring $(PLATFORM),$(RFA1_PLATFORMS)),) RCHIP ?= RFA1 else RCHIP ?= UNKNOWN endif RADIO_$(RCHIP) = $(RCHIP) CFLAGS += -DRADIO_$(RCHIP) tinyos-2.1.2+dfsg/apps/tests/LinkBench/Messages.h000066400000000000000000000062731207233610700216530ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ #ifndef MESSAGES_H #define MESSAGES_H #include "BenchmarkCore.h" enum { // AM Type identifiers AM_TESTMSG_T = 101, AM_CTRLMSG_T = 102, AM_SYNCMSG_T = 103, AM_SETUPMSG_T = 104, AM_DATAMSG_T = 105, // Control / Response message types SETUP_BASE = 0, CTRL_SETUP_SYN = 5, SYNC_SETUP_ACK = 6, CTRL_START = 10, CTRL_RESET = 20, CTRL_STAT_REQ = 30, DATA_STAT_OK = 31, CTRL_PROFILE_REQ = 40, DATA_PROFILE_OK = 41 }; typedef nx_struct testmsg_t { nx_uint8_t edgeid; // On which edge this message is intended to propagate through nx_seq_base_t msgid; // The auto-increment id of the message on the preset edge } testmsg_t; typedef nx_struct ctrlmsg_t { nx_uint8_t type; // Control type nx_uint8_t data_req_idx; // The requested stat-edge pair index in the requesting stage } ctrlmsg_t; typedef nx_struct syncmsg_t { nx_uint8_t type; nx_uint8_t edgecnt; // How many edges are in the current benchmark? nx_uint8_t maxmoteid; // How many motes are in the current benchmark? } syncmsg_t; typedef nx_struct setupmsg_t { nx_uint8_t type; setup_t config; } setupmsg_t; typedef nx_struct datamsg_t { nx_uint8_t type; // Response type nx_uint8_t data_idx; // The requested stat-edge pair index in the requesting stage nx_union { stat_t stat; // The requested stat structure in the requesting stage profile_t profile; // The profile of the mote } payload; } datamsg_t; #endif tinyos-2.1.2+dfsg/apps/tests/LinkBench/README000066400000000000000000000152511207233610700206070ustar00rootroot00000000000000LinkBench application README 1. Authors/Contacts: ----------------- veresskrisztian@gmail.com (Krisztian Veress, SZTE University, Szeged, Hungary ) 2. Description: ------------ This application's main goal is to provide a universal framework that is able to conduct reproducible tests/benchmarks in order to analyze and measure the radio- communication generated by the applied benchmark. The focus is on the radiocommunication, hence benchmarks are given by communica- tion links in a directed graph representation. For specifying benchmarks, see UserdefinedBenchmarks.h. 3. TinyOS network requirements: ---------------------------- To use the framework, one needs - a BaseStation mote with TOS_NODE_ID = 0. WARNING! When programming the BaseStation TOSH_DATA_LENGTH must be set to 110! - multiple 'test motes' with TOS_NODE_IDs 1,2,3, ... based on the required mote count of the benchmark to be run One should take note that mote's channels are set to the same value (based on the DEF_CHANNEL env variable), so when using different radio chips, compile time de- finitions such as -DRF230_DEF_CHANNEL = $(DEF_CHANNEL), and -DCC2420_DEF_CHANNEL = $(DEF_CHANNEL), ... are preset in the Makefile. To change this channel, set the DEF_CHANNEL variable to the required number: - in Unix systems : export DEF_CHANNEL=22 - in Windows : set DEF_CHANNEL=22 4. Quick Install Guide: -------------------- a, Connect one mote the your PC, and program it to be a BaseStation. Check on which port it is connected ( with motelist for example), and remember it. b, Connect as much motes as you would like to program to be benchmark 'test motes'. c, Either program them as you like, or execute the minstall.sh script: ./minstall.sh -i /dev/ttyUSBX where /dev/ttyUSBX is the device on which the BaseStation lives. d, Go to the javasrc directory and type: ant This will compile and assemble the Java sources. e, Got to the javabin directory created by the previous command, and execute: chmod +x *.sh ./linkbench.sh --help 4. Programming the motes: ---------------------- To program the 'test motes', simply execute the make command with appropriate options. Examples: - iris mote connected to MIB510 programmer on the first USB slot, assign TOS_NODE_ID=1 Unix : make iris install,1 mib510,/dev/ttyUSB0 Windows: make iris install,1 mib510,COM1 - telosa/telosb motes, assign TOS_NODE_ID=2 and 3 make telosa install,2 make telosb install,3 - ... 4./a 32-bit statistics support: -------------------------- Statistics are generally 16-bit integers. If overflows are experienced, you should consider setting the USE_32_BITS compile-time flag in the Makefile: CFLAGS += -DUSE_32_BITS 4./b Defining and using benchmarks: ------------------------------ To define your own benchmarks, do it in the UserdefinedBenchmarks.h file where additional information is available on how you can do that. After doing that, count the maximum of edges used in all your benchmarks, and set it in the Makefile: CFLAGS += -DMAX_EDGE_COUNT=8 You can exclude benchmark sets by setting the EXCLUDE_STANDARD or EXCLUDE_USERDEFINED flag in the Makefile. 5. Compiling the PC program: ------------------------- The application comes shipped with a PC-based control program located in the javasrc directory. The program depends on the tinyos.jar (TinyOS Java components) file, which comes with your TinyOS development libraries. In order to successfully compile, the code needs mig-generated classes, so make sure you have made a 'make ' for any target before compiling Java sources. Also you gonna need the ant (at least 1.7) utility which is a make system for Java. If everything is prepared, just type: ant in the javasrc directory. This will create a javabin directory in the root directory of the project. Then, executing either of the followings in the javabin folder: java -jar linkbench.jar --help sh linkbench.sh --help ./linkbench --help (if you have chmod-ed linkbench.sh to be executable) which will give you details on how this application can be used. 6. Using the application: ---------------------- To use the application, power-on all programmed 'test-motes', plug in the BaseStation mote to your PC, and set the MOTECOM variable to point to the BaseStation mote. Examples: - iris BaseStation mote connected to MIB510 programmer on the first USB slot export MOTECOM=serial@/dev/ttyUSB1:iris - telosb BaseStation mote connected on the second USB slot export MOTECOM=serial@/dev/ttyUSB2:telosb Then, execute the following: java -jar linkbench.jar -b 10 ./linkbench -b 10 which will eventually execute the 0th benchmark, and print the results on your screen. For more options, see java -jar linkbench.jar --help ./linkbench --help 7. Status indicators on 'test-motes': ---------------------------------- The code is written in a way so that the status of each 'test mote' can be tracked during the whole process. 0. All LEDs off : motes are in invalid state. This can only occur if you specify a benchmark to be run that is not available in the benchmark database. Do not worry, just reset them (java Benchmark -r), or simply run a benchmark which is available. 1. LED 1 on : mote is reset, standing by, waits for running a benchmark. 2. LED 2 on : mote received configuration, waits for handshake with the PC program 3. LED 1,LED 2 on : mote successfully configured, handshake is done 4. LED 3 on : benchmark is currently running 5. LED 3,LED 1 on : mote is in so-called 'lastchance' state -- being a pre-stop phase of the benchmark 6. LED 3,LED 2 on : mote finished the benchmark, statistics are ready 7. LED 3,LED 2 on : mote is uploading values to PC Motes should not be in states 2,3 and 5 for LONG TIME, if it happens, you can reset them by invoking either of the followings: java -jar linkbench.jar ./linkbench -r ( Note that this will reset ALL motes! ) 8. Known limitations: ---------------- - Configuration and data uploading is done in a one-hop manner, so 'test-motes' must be in the radio reception range of the BaseStation. tinyos-2.1.2+dfsg/apps/tests/LinkBench/StandardBenchmarks.h000066400000000000000000000306671207233610700236460ustar00rootroot00000000000000/** * Standard Benchmark Database file * ------------------------------------------------------------------------ * This is a no-modify file, keep it untouched. */ /* Throughput problems * ---------------------- * * In these problems, edges are present with continous message sending policies * meaning that motes try to send messages as fast as they can. * Such edges next to each other influence each other's behaviour. * * All of these benchmarks can be run with 4 motes (not all requires 4). */ #ifndef EXCLUDE_STANDARD_THROUGHPUT /** One-edge throughput **/ _BMARK_START_(10) { 1, 2, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** Two-edge throughput **/ _BMARK_START_(11) { 1, 2, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 2, 1, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** Three-edge, circle-style throughput **/ _BMARK_START_(12) { 1, 2, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 2, 3, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 3, 1, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** One broadcast flooding mote **/ _BMARK_START_(13) { 4, ALL, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** Two broadcast flooding motes **/ _BMARK_START_(14) { 4, ALL, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 3, ALL, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** Three broadcast flooding motes **/ _BMARK_START_(15) { 4, ALL, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 3, ALL, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 2, ALL, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** Two parallel throughput links **/ _BMARK_START_(16) { 1, 2, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 3, 4, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** Two parallel throughput links, one with ACK request**/ _BMARK_START_(17) { 1, 2, NO_TIMER , { SEND_ON_INIT, 0, NEED_ACK, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 3, 4, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** One throughput link next to one broadcast flooding mote **/ _BMARK_START_(18) { 1, 2, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 3, ALL, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** Hidden terminal problem (2 motes flooding the same mote) **/ _BMARK_START_(19) { 1, 2, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 3, 2, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** Hidden terminal problem (3 motes flooding the same mote) **/ _BMARK_START_(20) { 1, 4, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 2, 4, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 3, 4, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ #endif // EXCLUDE_STANDARD_THROUGHPUT /* Collision problems * ---------------------- * * In these problems, communication is based on timers. Since all 4 timers that * are supported can be highly customized, different timer configurations could * result different scenarios. * If the sending windows match, collision occur, thus the name of these benchmarks. * * All of these benchmarks can be run with 4 motes. */ #ifndef EXCLUDE_STANDARD_COLLISION /** Two parallel timer-based links **/ _BMARK_START_(30) { 1, 2, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 3, 4, {TIMER(2), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /** Two parallel timer-based links, broadcasting **/ _BMARK_START_(31) { 4, ALL, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 3, ALL, {TIMER(2), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /** Three parallel timer-based links, broadcasting **/ _BMARK_START_(32) { 4, ALL, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 3, ALL, {TIMER(2), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 2, ALL, {TIMER(3), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /** Three parallel timer-based links, direct links **/ _BMARK_START_(33) { 1, 2, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 2, 3, {TIMER(2), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 3, 4, {TIMER(3), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /** Three timer-based links having a common destination **/ _BMARK_START_(34) { 1, 4, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 2, 4, {TIMER(2), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 3, 4, {TIMER(3), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /** One timer-based link influenced by a parallel flooding link **/ _BMARK_START_(35) { 1, 2, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 3, 4, NO_TIMER, { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** One timer-based link influenced by a parallel flooding link (broadcast) **/ _BMARK_START_(36) { 1, 2, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 4, ALL, NO_TIMER, { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ #endif // EXCLUDE_STANDARD_COLLISION /* Forwarding problems * ---------------------- * * In these problems, communication initiation is based on timers. Additionally, networks * are created such a way that messages are to be forwarded, so if any mote hears a message, * it should forward it on at least one link. * * All of these benchmarks can be run with 6 motes (not all requires 6). */ #ifndef EXCLUDE_STANDARD_FORWARDING /** M2 forwards to M1 what it hears from M1 **/ _BMARK_START_(50) { 1, 2, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(1), START_MSG_ID }, { 2, 1, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /** M2 forwards to M1 what it hears from M1. Also, a flooding broadcast disturbance edge is present. **/ _BMARK_START_(51) { 1, 2, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(1), START_MSG_ID }, { 2, 1, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 4, ALL, NO_TIMER, { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** A message chain with 4 motes. M1 initiates, M2,M3 forwards to a sink mote, M4. **/ _BMARK_START_(52) { 1, 2, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(1), START_MSG_ID }, { 2, 3, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), REPLY_ON(2), START_MSG_ID }, { 3, 4, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /** A message chain with 6 motes. M1 initiates, M2,M3,M4,M5 forwards to a sink mote, M6. **/ _BMARK_START_(53) { 1, 2, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(1), START_MSG_ID }, { 2, 3, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), REPLY_ON(2), START_MSG_ID }, { 3, 4, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), REPLY_ON(3), START_MSG_ID }, { 4, 5, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), REPLY_ON(4), START_MSG_ID }, { 5, 6, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /** Two distinct, parallel forwarding chains: M1->M2->M3 and M4->M5->M6. **/ _BMARK_START_(54) { 1, 2, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(1), START_MSG_ID }, { 2, 3, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 4, 5, {TIMER(2), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(3), START_MSG_ID }, { 5, 6, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /** A "message collector" binary tree: M1, M2 transmits to M4, M4 forwards these messages to M5. M3 also transmits to M5. M5 forwards those messages that are heared either from M4 or M3 to M6. **/ _BMARK_START_(55) { 1, 4, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(3), START_MSG_ID }, { 2, 4, {TIMER(2), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(3), START_MSG_ID }, { 3, 5, {TIMER(3), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(4), START_MSG_ID }, { 4, 5, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), REPLY_ON(4), START_MSG_ID }, { 5, 6, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /** A "noisy message collector" binary tree: M1, M2 transmits to M4, M4 forwards these messages to M5. M3 also transmits to M5. M6 acts as a disturbance mote, continously broadcasting. **/ _BMARK_START_(56) { 1, 4, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(3), START_MSG_ID }, { 2, 4, {TIMER(2), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(3), START_MSG_ID }, { 3, 5, {TIMER(3), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 4, 5, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 6, ALL, NO_TIMER, { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** A near complete binary tree message collector network. There are three chains : M1 -> M4 -> M6, M2 -> M5 -> M6, and M3 -> M5 -> M6. **/ _BMARK_START_(57) { 1, 4, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(3), START_MSG_ID }, { 2, 5, {TIMER(2), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(4), START_MSG_ID }, { 3, 5, {TIMER(3), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(4), START_MSG_ID }, { 4, 6, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 5, 6, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /** A "message disseminator" binary tree: M6 transmits to M5 which duplicates these messages towards M4 and M3. M3 is a sink, while M4 also forwards the messages to M1 and M2. **/ _BMARK_START_(58) { 6, 5, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(1) | REPLY_ON(2), START_MSG_ID }, { 5, 4, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), REPLY_ON(3) | REPLY_ON(4), START_MSG_ID }, { 5, 3, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 4, 1, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 4, 2, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /** A "noisy message disseminator" binary tree: M5 sends messages to M4 and M3. M3 is a sink, while M4 forwards the messages to M1 and M2. M6 acts as a disturbance mote, continously broadcasting. **/ _BMARK_START_(59) { 5, 4, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(2) | REPLY_ON(3), START_MSG_ID }, { 5, 3, {TIMER(2), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 4, 1, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 4, 2, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 6, ALL, NO_TIMER, { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** A near complete binary tree message dissemination network. There are three chains : M6 -> M4 -> M1, M6 -> M5 -> M2, and M6 -> M5 -> M3. **/ _BMARK_START_(60) { 6, 4, {TIMER(1), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(2), START_MSG_ID }, { 6, 5, {TIMER(2), 0}, { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), REPLY_ON(3) | REPLY_ON(4), START_MSG_ID }, { 4, 1, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 5, 2, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID }, { 5, 3, NO_TIMER, { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ #endif // EXCLUDE_STANDARD_FORWARDING tinyos-2.1.2+dfsg/apps/tests/LinkBench/UserdefinedBenchmarks.h000066400000000000000000000237201207233610700243330ustar00rootroot00000000000000/** * User Defined Benchmark Database file * ------------------------------------------------------------------------ * * This is a user-modifiable file, keep it clean, and stay to the rules below. * * Instructions for how to define a benchmark: * 1, All benchmarks MUST begin with a _BMARK_START_(X) macro, where X is its unique identifier. * Note that if multiple benchmarks have the same id, only the first is seen by the program, * others are ignored -- thus only eating expensive memory. * Valid ids are from [200,...,255], lower values are reserved for standard benchmarks. * * 2, All benchmarks MUST end with a _BMARK_END_ macro. * 3, Between these macros, the edges (allowed communication links between two) * separate motes) of the modeled network are enlisted. * * Each edge is a 7-element structure : * { SENDER, RECEIVER, TIMER_DESC, POLICY_DESC, MSG_COUNT, REPLY, 'START_MSG_ID' } * * 4, SENDER: - any positive number, denoting the mote id * RECEIVER: - any positive number other than the sender, denoting the mote id, * - 'ALL', denoting all motes. This automatically implies * that on this edge, broadcasting is used * * TIMER_DESC: * - 'NO_TIMER', if timers are not used on this edge * - {START_TIMER_DESC, STOP_TIMER_DESC} otherwise * * START_TIMER_DESC: * STOP_TIMER_DESC: * - '0', if sending/stopping is not initiated by a timer * - 'TIMER(X)', representing the Xth timer, ex: TIMER(2) * * POLICY_DESC: * - { SEND_TRIG, STOP_TRIG, ACK, 0, 0 } * SEND_TRIG: - 'SEND_ON_REQ', to send only if implicitly required (see below) * - 'SEND_ON_INIT', to send message on benchmark start, * - 'SEND_ON_TIMER', to send message on timer event ( * see START_TIMER_DESC) * STOP_TRIG: - '0', if no message sending stopper is required * - 'STOP_ON_ACK', if message sending is required to stop on an ACK * - 'STOP_ON_TIMER', if message sending is req. to stop on a timer event ( * see STOP_TIMER_DESC) * ACK: - '0', if acknowledgements are not requested * - 'NEED_ACK', if acknowledgements are requested * * MSG_COUNT: - NUM(X), denoting X message(s) to send, where X can be from [1,..,255]. * - NUM(INFINITE), denoting continous message sending. * * REPLY: - 'NO_REPLY', if message is not required to send on reception * - 'REPLY_EDGE(X)', if message is to send on reception on edge X. * - 'REPLY_EDGE(X) | REPLY_EDGE(Y) | ...', if message is to send on reception * on edge X AND on edge Y also. * (the edge ids count from zero in the current benchmark) * * By specifying the edges, the required mote count is implicitly determined by the maximal mote id * present either in the sender or receiver sections of the edge descriptions. (This can aslo be * overridden with a command line option (-mc) of the PC program. ) * * In the following example, the implied mote count is 1: * _BMARK_START_(202) * { 1, ALL, NO_TIMER , ... } * _BMARK_END_ * * However, if someone would like to increase this number (ex. to 4), there is a naughty trick: * _BMARK_START_(202) * { 4, ALL, NO_TIMER , ... } * _BMARK_END_ * * You are encouraged to use this motecount-force, rather than depending on the command-line option. * * For complete examples, see the demo benchmarks below. * These benchmarks are only for demo and reference purposes, so do not hesitate to erase them / comment them out to reduce the memory overhead. * */ // Send 10 messages (Mote1 -> Mote 2) when the test starts, and that's it. _BMARK_START_(200) { 1, 2, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(10), NO_REPLY, START_MSG_ID } _BMARK_END_ // Send 10 messages (Mote2 -> Mote 1) when the test starts, and that's it. _BMARK_START_(201) { 2, 1, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(10), NO_REPLY, START_MSG_ID } _BMARK_END_ /* Send 10 broadcast messages when the test starts. * Note: try this benchmark with different motecount options on the PC side * - if motecount is set to 1 (default for this benchmark), no reception is seen in receiver side stats, * - if motecount is set to 2 (-mc 2): 10 reception (Mote 2 is now present, hearing Mote 1), * - if motecount is set to 5 (-mc 5): 40 reception (Mote 2,3,4,5 are present, hearing Mote 1), * - ... */ _BMARK_START_(202) { 1, ALL, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(10), NO_REPLY, START_MSG_ID } _BMARK_END_ // Send 10 messages when the test starts, and request acks. _BMARK_START_(203) { 1, 2, NO_TIMER , { SEND_ON_INIT, 0, NEED_ACK, 0, 0 }, NUM(10), NO_REPLY, START_MSG_ID } _BMARK_END_ // Send a message and request ack for it. If not acked, fallback at most 5 times. _BMARK_START_(204) { 1, 2, NO_TIMER , { SEND_ON_INIT, STOP_ON_ACK, NEED_ACK, 0, 0 }, NUM(5), NO_REPLY, START_MSG_ID } _BMARK_END_ // Mote 1 sends 3 messages to Mote 2. // Mote 2 sends messages to Mote1, stops when ack received and sends at most 7 messages if no ack received. _BMARK_START_(205) { 1, 2, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(3), NO_REPLY, START_MSG_ID }, { 2, 1, NO_TIMER , { SEND_ON_INIT, STOP_ON_ACK, NEED_ACK, 0, 0 }, NUM(7), NO_REPLY, START_MSG_ID } _BMARK_END_ // Start sending continously messages when the test starts. Message sending stops when the test stops. _BMARK_START_(206) { 1, 2, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /** * Mote 1 starts contin. sending msgs to Mote 2 when the test starts. (1st edge) * Also Mote 1 is sending cont. broadcast msgs. (2nd edge) * Mote 3 sends at most 100 messages to Mote 1, request acks, and if it receives an ack, stops. (3rd edge) * * Note that this way the broadcast messages (2nd edge) are heared by Mote 2 and Mote 3, so the receiver side * statistics will be the double of the sender side ones on the 2nd edge. (Since every broadcast message sent by Mote 1 is heared by two motes!) */ _BMARK_START_(207) { 1, 2 , NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 1, ALL, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID }, { 3, 1 , NO_TIMER , { SEND_ON_INIT, STOP_ON_ACK, 0, 0, 0 }, NUM(100), NO_REPLY, START_MSG_ID } _BMARK_END_ // Send one message on every timer tick. Timer1 is used. _BMARK_START_(208) { 1, 2, {TIMER(1),0} , { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /* 1st edge: Send at most 10 messages on every timer tick. If ack received, stop sending. Timer1 is used. * 2nd edge: Send one broadcast message to every node when Timer2 tickens. */ _BMARK_START_(209) { 1, 2, {TIMER(1),0} , { SEND_ON_TIMER, STOP_ON_ACK, 0, 0, 0 }, NUM(10), NO_REPLY, START_MSG_ID }, { 1, ALL, {TIMER(2),0} , { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /* Start cont. sending messages on every timer tick of Timer1, and stop sending if Timer2 tickens. * By changing the type (oneshot/periodic) and frequency of the timers, different traffic patterns are * likely to be generated. */ _BMARK_START_(210) { 1, 2, {TIMER(1),TIMER(2)} , { SEND_ON_TIMER, STOP_ON_TIMER, 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /* Mote 1 sends 3 messages on every timer tick of Timer1. * Mote 2 starts cont. sending messages when the test starts and stops it if Timer2 tickens * or receives an ack, whichever comes first. */ _BMARK_START_(211) { 1, 2, {TIMER(1), 0} , { SEND_ON_TIMER, 0, 0, 0, 0 }, NUM(3), NO_REPLY, START_MSG_ID }, { 2, 1, {0,TIMER(2)} , { SEND_ON_INIT, STOP_ON_TIMER | STOP_ON_ACK , 0, 0, 0 }, NUM(INFINITE), NO_REPLY, START_MSG_ID } _BMARK_END_ /* Mote 1 sends 2 messages to Mote 2 on every Timer1 ticks. It stops (only sends one message) if Mote 2 * acknowledges the message. * If Mote 2 hears a message, it replies on edge 1 ( see REPLY_ON(1) of the 1st edge ), which means it * will send one message to Mote 3 (2nd edge). * Since REPLY_ON(2) is present in the 2nd edge, every time Mote 3 hears a message, it should reply on the * 3rd edge: sends one message to Mote 1. */ _BMARK_START_(212) { 1, 2, {TIMER(1),0}, { SEND_ON_TIMER, STOP_ON_ACK, 0, 0, 0 }, NUM(2), REPLY_ON(1), START_MSG_ID }, { 2, 3, NO_TIMER , { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), REPLY_ON(2), START_MSG_ID }, { 3, 1, NO_TIMER , { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), NO_REPLY, START_MSG_ID } _BMARK_END_ /* 1st edge : Mote 1 -> Mote 2: Exactly 2 messages on Timer1 ticks, request acks. * - every time Mote 2 hears a message from this edge, it should reply on the 3rd edge ( see REPLY_ON(2) ) * 2nd edge : Mote 3 -> Mote 2: One message on every Timer2 ticks, stop either on Timer3 ticks or on acks. * - note that in this case the STOP_ON_X policies are useless, since * on this edge only one message is to be sent, so no use to 'stop' it... * - every time Mote 2 hears a message from this edge, it should reply on the 3rd edge ( see REPLY_ON(2) ) * 3rd edge : Mote 2 broadcasts exactly one message. * - if anyone (Mote 1,Mote 3) hears it, it should reply on the 4th edge ( REPLY_ON(3) ). Since the 4th edge's * sender is 3, this only applies for Mote 3. * 4th edge : Mote 3 -> Mote 1: Exactly 4 messages to transmit. * - note that this edge has SEND_ON_INIT, so 4 messages are also transmitted when the test starts, * not just when Mote 3 replies for messages it gets on the 3rd edge! */ _BMARK_START_(213) { 1, 2, {TIMER(1),0}, { SEND_ON_TIMER, 0, NEED_ACK, 0, 0 }, NUM(2), REPLY_ON(2), START_MSG_ID }, { 3, 2, {TIMER(2),TIMER(3)}, { SEND_ON_TIMER, STOP_ON_TIMER | STOP_ON_ACK, 0, 0, 0 }, NUM(1), REPLY_ON(2), START_MSG_ID }, { 2, ALL, NO_TIMER , { SEND_ON_REQ, 0, 0, 0, 0 }, NUM(1), REPLY_ON(3), START_MSG_ID }, { 3, 1, NO_TIMER , { SEND_ON_INIT, 0, 0, 0, 0 }, NUM(4) , NO_REPLY, START_MSG_ID } _BMARK_END_ tinyos-2.1.2+dfsg/apps/tests/LinkBench/codeprofile/000077500000000000000000000000001207233610700222165ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/LinkBench/codeprofile/CodeProfile.nc000066400000000000000000000043771207233610700247460ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ interface CodeProfile { /** * Retrieve the longest/shortest interrupt handling time in microseconds * * @return the maximum/minimum value */ command int32_t getMaxInterruptLength(); command int32_t getMinInterruptLength(); /** * Retrieve the longest/shortest atomic section's time in microseconds * * @return the maximum/minimum value */ command int32_t getMaxAtomicLength(); command int32_t getMinAtomicLength(); /** * Retrieve the maximum/minimum elapsed time in microseconds between two task. * * @return the maximum/minimum value */ command int32_t getMaxTaskLatency(); command int32_t getMinTaskLatency(); } tinyos-2.1.2+dfsg/apps/tests/LinkBench/codeprofile/CodeProfileC.nc000066400000000000000000000045711207233610700250450ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ #if defined(TOSSIM) && ! defined(MHZ) #define MHZ 8 #endif configuration CodeProfileC { provides { interface StdControl; interface CodeProfile; } } implementation { #if defined(CONTROLLER_ATM128) components new AlarmMicro32C() as Alarm; #elif defined(CONTROLLER_MSP430) components Msp430CounterMicroC as Counter16; components new AlarmMicro16C() as Alarm16; components new TransformCounterC(TMicro,uint32_t,TMicro,uint16_t,0,uint32_t) as TCounter; TCounter.CounterFrom -> Counter16; components new TransformAlarmC(TMicro,uint32_t,TMicro,uint16_t,0) as Alarm; Alarm.AlarmFrom -> Alarm16; Alarm.Counter -> TCounter; #endif components CodeProfileP; CodeProfileP.Alarm -> Alarm; StdControl = CodeProfileP; CodeProfile = CodeProfileP; } tinyos-2.1.2+dfsg/apps/tests/LinkBench/codeprofile/CodeProfileP.nc000066400000000000000000000114701207233610700250560ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ #define ATOMIC_PERIODIC_TIME 4096 #define _MAX_(a,b) (((a) < (b)) ? (b) : (a)) #define _MIN_(a,b) (((a) > (b)) ? (b) : (a)) module CodeProfileP @safe() { provides { interface StdControl; interface CodeProfile; } uses { interface Alarm as Alarm; } } implementation { int32_t max_mil; // Maximum Interrupt Length int32_t max_mal; // Maximum Atomic Length int32_t max_mtl; // Maximum Task Latency int32_t min_mil; // Mininum Interrupt Length int32_t min_mal; // Mininum Atomic Length int32_t min_mtl; // Mininum Task Latency uint32_t mtl_offset; uint32_t mal_offset; norace bool alive; command int32_t CodeProfile.getMaxInterruptLength() { return max_mil; } command int32_t CodeProfile.getMaxAtomicLength() { atomic {return max_mal;} } command int32_t CodeProfile.getMaxTaskLatency() { return max_mtl; } command int32_t CodeProfile.getMinInterruptLength() { return min_mil; } command int32_t CodeProfile.getMinAtomicLength() { atomic {return min_mal;} } command int32_t CodeProfile.getMinTaskLatency() { return min_mtl; } task void measureTask() { uint32_t t1 = call Alarm.getNow(); uint32_t t2 = call Alarm.getNow(); // The difference between two consecutive getNow() call can be // significantly greater than zero, if interrupt(s) occured in between. That // difference is proportional to the running time of the // interrupt handler. max_mil = _MAX_((int32_t)(t2-t1),max_mil); min_mil = _MIN_((int32_t)(t2-t1),min_mil); // The difference between the posting time of this task (mtl_offset) // and the first expression's execution time ( t1 ) is the time // between two measureTask tasks. // This way, interleaving tasks' running time is measured. max_mtl = _MAX_((int32_t)(t1-mtl_offset),max_mtl); min_mtl = _MIN_((int32_t)(t1-mtl_offset),min_mtl); if ( alive ) { mtl_offset = call Alarm.getNow(); post measureTask(); } } command error_t StdControl.start() { alive = TRUE; min_mil = min_mtl = 0x7fffffffL; max_mil = max_mtl = -(0x7fffffffL-1L); // Atomic Length Measurement Init atomic { max_mal = -(0x7fffffffL-1L); min_mal = 0x7fffffffL; call Alarm.stop(); mal_offset = call Alarm.getNow(); call Alarm.startAt(mal_offset, ATOMIC_PERIODIC_TIME); } mtl_offset = call Alarm.getNow(); post measureTask(); return SUCCESS; } command error_t StdControl.stop() { call Alarm.stop(); alive = FALSE; return SUCCESS; } async event void Alarm.fired() { // Get the time int64_t delay = (int64_t)call Alarm.getNow(); atomic { // When the alarm should have been fired? // This is also the base of the next fire target. mal_offset += ATOMIC_PERIODIC_TIME; // Compute the shift between now and the target delay -= mal_offset; max_mal = _MAX_((int32_t)delay,max_mal); min_mal = _MIN_((int32_t)delay,min_mal); } if ( alive ) call Alarm.startAt(mal_offset,ATOMIC_PERIODIC_TIME); } } tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/000077500000000000000000000000001207233610700213545ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/benchmark/000077500000000000000000000000001207233610700233065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/benchmark/cli/000077500000000000000000000000001207233610700240555ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/benchmark/cli/BenchmarkCli.java000066400000000000000000000412511207233610700272450ustar00rootroot00000000000000/** Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ package benchmark.cli; import benchmark.common.*; import java.io.FileNotFoundException; import java.io.PrintStream; import org.apache.commons.cli.*; public class BenchmarkCli { private BenchmarkController ctrl; public BenchmarkCli() { ctrl = new BenchmarkController(); } /** * Print out the help information */ public static void printHelp(final Options opt) { HelpFormatter f = new HelpFormatter(); System.out.println("Usage scenarios:"); Options opt0 = new Options(); opt0.addOption(opt.getOption("h")); System.out.println(); System.out.println("1. Print help information."); System.out.println("--------------------------------------------------------------------"); f.printHelp(150, "linkbench", "", opt0, "", true); // Batch - usage Options opt1 = new Options(); opt1.addOption(opt.getOption("F")); opt1.addOption(opt.getOption("o")); opt1.addOption(opt.getOption("tossim")); System.out.println(); System.out.println("2. Running benchmarks with pre-defined configurations in batch mode."); System.out.println("--------------------------------------------------------------------"); f.printHelp(150, "linkbench", "", opt1, "", true); // Reset - usage Options opt2 = new Options(); opt2.addOption(opt.getOption("r")); opt2.addOption(opt.getOption("tossim")); System.out.println(); System.out.println("3. Reset all motes."); System.out.println("--------------------------------------------------------------------"); f.printHelp(150, "linkbench", "", opt2, "", true); // Download - usage Options opt3 = new Options(); opt3.addOption(opt.getOption("dload")); opt3.addOption(opt.getOption("mc")); opt3.addOption(opt.getOption("xml")); System.out.println(); System.out.println("4. Only download data from the motes (if data available)."); System.out.println("--------------------------------------------------------------------"); f.printHelp(150, "linkbench", "", opt3, "", true); // Command-line usage Options opt4 = new Options(); opt4.addOption(opt.getOption("b")); opt4.addOption(opt.getOption("t")); opt4.addOption(opt.getOption("rs")); opt4.addOption(opt.getOption("lc")); opt4.addOption(opt.getOption("tr")); opt4.addOption(opt.getOption("ack")); opt4.addOption(opt.getOption("bcast")); opt4.addOption(opt.getOption("xml")); opt4.addOption(opt.getOption("mac")); opt4.addOption(opt.getOption("mc")); opt4.addOption(opt.getOption("tossim")); System.out.println(); System.out.println("5. Running a specific benchmark with command-line arguments"); System.out.println("--------------------------------------------------------------------"); f.printHelp(88, "linkbench", "", opt4, "", true); } /** * Construct the Options opt appropriate for * the Apache CLI command-line interpreter. */ private static void initOptions(Options opt) { // Batch related options Option batchfile = OptionBuilder .withArgName("file") .hasArg() .withDescription("The batch file with configuration parameters for multiple benchmark runs") .create("F"); Option batchoutput = OptionBuilder .withArgName("file") .hasArg() .withDescription("The output XML file name. [default: results.xml]") .create("o"); // Problem id option Option problem = OptionBuilder .withArgName("number") .hasArg() .withDescription("The benchmark to be used") .withLongOpt("benchmark") .create("b"); // Time- related options Option randomstart = OptionBuilder .withArgName("number") .hasArg() .withDescription("Random start delay in millisecs. [default: " + BenchmarkCommons.DEF_RANDSTART + " msec]") .withLongOpt("randomstart") .create("rs"); Option runtime = OptionBuilder .withArgName("normal") .hasArg() .withDescription("The benchmark running time in millisecs. " + "[default: " + BenchmarkCommons.DEF_RUNTIME + " msec]") .withLongOpt("time") .create("t"); Option lastchance = OptionBuilder .withArgName("number") .hasArg() .withDescription("The grace time period after test completion for" + " last-chance reception. [default : " + BenchmarkCommons.DEF_LASTCHANCE + " msec]") .withLongOpt("lastchance") .create("lc"); Option trtimers = OptionBuilder .withArgName("timer config list") .hasArg() .withDescription("Trigger timer configuration " + "index:isoneshot,maxrandomdelay,period. [default : 1:" + TimerParser.DEF_TIMER_ONESHOT + "," + TimerParser.DEF_TIMER_DELAY + "," + TimerParser.DEF_TIMER_PERIOD + " ]") .withLongOpt("triggers") .create("tr"); Option mac = OptionBuilder .withArgName("MAC params") .hasArg() .withDescription("MAC along with parameters: mactype:param1,param2,...,paramN [ mactypes: lpl,plink ]") .create("mac"); Option xml = OptionBuilder .withArgName("file") .hasArg() .withDescription("Produce xml output") .create("xml"); Option mcount = OptionBuilder .withArgName("number") .hasArg() .withDescription("How many motes are in the network.") .withLongOpt("motecount") .create("mc"); Option reset = OptionBuilder .withArgName("moteid") .hasArg() .withDescription("Reset the mote. If moteid set to 0, all motes are reset.") .withLongOpt("reset") .create("r"); opt.addOption(problem); opt.addOption(randomstart); opt.addOption(runtime); opt.addOption(lastchance); opt.addOption(xml); opt.addOption(mac); opt.addOption(mcount); opt.addOption(trtimers); opt.addOption(batchfile); opt.addOption(batchoutput); opt.addOption(reset); opt.addOption("h", "help", false, "Print help for this application"); opt.addOption("ack", false, "Force acknowledgements. [default : false]"); opt.addOption("bcast", "broadcast", false, "Force broadcasting. [default : false]"); opt.addOption("dload", "download", false, "Only download data from motes."); opt.addOption("tossim", false, "MUST be used if TOSSIM is in use."); } public boolean doReset(final boolean is_tossim, final int moteid) { if ( moteid == 0 ) System.out.print("> Reset all motes ... "); else System.out.print(String.format("> Reset mote %2d ... ",moteid)); try { if ( moteid == 0 ) ctrl.reset(!is_tossim); else ctrl.resetMote(moteid); System.out.println("OK"); return true; } catch (BenchmarkController.MessageSendException ex) { System.out.println("FAIL"); return false; } } public boolean doSync() { System.out.print("> Synchronize motes ... "); try { ctrl.syncAll(); System.out.println("OK"); return true; } catch (BenchmarkController.CommunicationException ex) { System.out.println("FAIL"); System.out.println(" " + ex.getMessage() ); return false; } } public boolean doDownloadStat(final int maxMoteId) { System.out.print("> Downloading data ... "); try { ctrl.download_stat(); System.out.println("OK"); return true; } catch (BenchmarkController.CommunicationException ex) { System.out.println("FAIL"); System.out.println(" " + ex.getMessage() ); return false; } } public boolean doDownloadProfile(final int maxMoteId) { System.out.print("> Downloading profile ... "); try { ctrl.download_profile(); System.out.println("OK"); return true; } catch (BenchmarkController.CommunicationException ex) { System.out.println("FAIL"); System.out.println(" " + ex.getMessage() ); return false; } } public boolean doSetup(final SetupT st, final boolean is_tossim) { System.out.print("> Setting up motes ... "); try { ctrl.setup(st,!is_tossim); System.out.println("OK"); return true; } catch (BenchmarkController.MessageSendException ex) { System.out.println("FAIL"); return false; } } public boolean doRun(final boolean is_tossim) { System.out.print("> Running benchmark ... "); try { ctrl.run(!is_tossim); System.out.println("OK"); return true; } catch (BenchmarkController.MessageSendException ex) { System.out.println("FAIL"); return false; } } public void doPrintXml(final String filename) { PrintStream ps; try { ps = new PrintStream(filename); ps.println(BenchmarkCommons.xmlHeader()); this.ctrl.getResults().printXml(ps); ps.println(BenchmarkCommons.xmlFooter()); ps.close(); } catch (FileNotFoundException ex) { System.out.println("Cannot open " + filename + " for writing!"); } } public void doPrint() { this.ctrl.getResults().print(System.out); } public static void main (String[] args) { try { // Make the options and parse it Options opt = new Options(); BenchmarkCli.initOptions(opt); BasicParser parser = new BasicParser(); CommandLine cl = parser.parse(opt, args); // Help request -- if present, do nothing else. // ----------------------------------------------------------------------- if ( cl.hasOption('h') ) { BenchmarkCli.printHelp(opt); System.exit(0); } // Reset request -- if present, do nothing else. // ----------------------------------------------------------------------- else if ( cl. hasOption('r') ) { BenchmarkCli cli = new BenchmarkCli(); if ( cli.doReset( cl.hasOption("tossim"), Integer.parseInt(cl.getOptionValue("r")) ) ) System.exit(0); else System.exit(1); } // Download request // ----------------------------------------------------------------------- else if ( cl.hasOption("dload") ) { int maxmoteid = cl.hasOption("mc") ? Integer.parseInt(cl.getOptionValue("mc")) : 1; if ( maxmoteid < 1 ) throw new MissingOptionException("Invalid number of motes specified!"); // Do what needs to be done BenchmarkCli cli = new BenchmarkCli(); if ( cli.doSync() && cli.doDownloadStat(maxmoteid) && cli.doDownloadProfile(maxmoteid) ) { // Dump results to XML or STDOUT if ( cl.hasOption("xml") ) cli.doPrintXml(cl.getOptionValue("xml")); else cli.doPrint(); System.exit(0); } else System.exit(1); } // Batch request // ----------------------------------------------------------------------- else if ( cl.hasOption('F') ) { String bfile = cl.getOptionValue('F'); String ofile = cl.hasOption('o') ? cl.getOptionValue('o') : "results.xml"; BenchmarkBatch rbb = new BenchmarkBatch(ofile); if ( rbb.parse(bfile) && rbb.run( cl.hasOption("tossim") ) ) { System.exit(0); } else System.exit(1); } // Command line control // ----------------------------------------------------------------------- else if ( cl.hasOption('b') ) { short problemidx = (short)Integer.parseInt(cl.getOptionValue('b')); if ( problemidx < 0 ) throw new MissingOptionException("Invalid problem specified!"); int startdelay = cl.hasOption("rs") ? Integer.parseInt(cl.getOptionValue("rs")) : BenchmarkCommons.DEF_RANDSTART; if ( startdelay < 0 ) throw new MissingOptionException("Invalid random start time specified!"); int runtimemsec = cl.hasOption('t') ? Integer.parseInt(cl.getOptionValue("t")) : BenchmarkCommons.DEF_RUNTIME; if ( runtimemsec <= 0 ) throw new MissingOptionException("Invalid runtime specified!"); int lchance = cl.hasOption("lc") ? Integer.parseInt(cl.getOptionValue("lc")) : BenchmarkCommons.DEF_LASTCHANCE; if ( lchance < 0 ) throw new MissingOptionException("Invalid last chance time specified!"); int maxmoteid = cl.hasOption("mc") ? Integer.parseInt(cl.getOptionValue("mc")) : 1; if ( maxmoteid < 1 ) throw new MissingOptionException("Invalid number of motes specified!"); // Trigger timer parsing TimerParser tp = new TimerParser(BenchmarkStatic.MAX_TIMER_COUNT); if ( cl.hasOption("tr") ) { for ( String s : cl.getOptionValues("tr") ) { tp.parse(s); } } // Trigger timer parsing MacParser mac = new MacParser(); if ( cl.hasOption("mac") ) { for ( String s : cl.getOptionValues("mac") ) { mac.parse(s); } } // Mac protocols may have flags set short flags = mac.getFlags(); if ( cl.hasOption("ack") ) flags |= BenchmarkStatic.GLOBAL_USE_ACK; if ( cl.hasOption("bcast") ) flags |= BenchmarkStatic.GLOBAL_USE_BCAST; // Create the setup structure SetupT st = new SetupT(); st.set_problem_idx(problemidx); st.set_pre_run_msec(startdelay); st.set_runtime_msec(runtimemsec); st.set_post_run_msec(lchance); st.set_flags(flags); st.set_timers_isoneshot(tp.getIos()); st.set_timers_delay(tp.getDelay()); st.set_timers_period_msec(tp.getPeriod()); st.set_mac_setup(mac.getMacParams()); // Do what needs to be done boolean tossim = cl.hasOption("tossim"); BenchmarkCli cli = new BenchmarkCli(); if (cli.doReset(tossim,0) && cli.doSetup(st,tossim) && cli.doSync() && cli.doRun(tossim) && cli.doDownloadStat(maxmoteid) && cli.doDownloadProfile(maxmoteid) ) { // Dump results to XML or STDOUT if ( cl.hasOption("xml") ) cli.doPrintXml(cl.getOptionValue("xml")); else cli.doPrint(); System.exit(0); } else { System.exit(1); } } else { throw new MissingOptionException("Invalid program arguments, use --help for help!"); } } catch (Exception e) { System.err.println(); System.err.println("Error : " + e.getMessage()); System.err.println(); System.exit(1); } } } tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/benchmark/common/000077500000000000000000000000001207233610700245765ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/benchmark/common/BenchmarkBatch.java000066400000000000000000000304661207233610700303060ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ package benchmark.common; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.PrintStream; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.yaml.snakeyaml.Yaml; public class BenchmarkBatch { private List setups; private List motecounts; private String outputfile; private final String S_CONFIG = "config"; private final String S_CONFIG_BMARK = "bmark"; private final String S_CONFIG_MOTEC = "motes"; private final String S_CONFIG_RANDSTART = "randstart"; private final String S_CONFIG_TIME = "time"; private final String S_CONFIG_LC = "lchance"; private final String S_TIMERS = "timers"; private final String S_TIMER_PREFIX = "t"; private final String S_FORCES = "forces"; private final String S_FORCES_ACK = "ack"; private final String S_FORCES_BCAST = "bcast"; private final String S_MAC = "mac"; class WrongFormatException extends Exception { public WrongFormatException(String message) { super(message); } } /** * Construct an object being able to conduct batch benchmark runs. * @param outputfile the file where we should output the results */ public BenchmarkBatch(final String outputfile) { this.outputfile = outputfile; this.setups = new ArrayList(); this.motecounts = new ArrayList(); } private void checkUnknownTags(final Set reference, final Set check) throws WrongFormatException { Set difference = new HashSet(check); difference.removeAll(reference); if ( ! difference.isEmpty() ) { throw new WrongFormatException("Unknown tags found : " + difference.toString()); } } /** * Parse a YAML-formatted configuration file, and save it for further processing. * * @param configfile the file * @return TRUE if no error detected, FALSE otherwise * @throws WrongFormatException */ public boolean parse(final String configfile) throws WrongFormatException { try { System.out.print("> Parsing configuration file ... "); int num = 0; for (Object doc : new Yaml().loadAll(new FileInputStream(new File(configfile)))) { ++num; // whole benchmark section // --------------------------------------------------------------------- Map bmark = (Map) doc; // Format checking if ( bmark == null ) throw new WrongFormatException("Check your configuration file's format, it is incorrect!"); else { String ref[] = { S_CONFIG, S_TIMERS, S_FORCES, S_MAC }; checkUnknownTags(new HashSet(Arrays.asList(ref)), bmark.keySet()); if ( !bmark.containsKey(S_CONFIG) ) throw new WrongFormatException("No '" + S_CONFIG + "' section found in benchmark description : " + num); } // config section - it MUST exist (previously we checked it!) // --------------------------------------------------------------------- Map bconfig = (Map) bmark.get(S_CONFIG); // Format checking { String ref[] = { S_CONFIG_BMARK, S_CONFIG_MOTEC, S_CONFIG_TIME, S_CONFIG_LC, S_CONFIG_RANDSTART }; checkUnknownTags(new HashSet(Arrays.asList(ref)), bconfig.keySet()); if ( !bconfig.containsKey(S_CONFIG_BMARK) || !bconfig.containsKey(S_CONFIG_TIME) ) throw new WrongFormatException("The '" + S_CONFIG_BMARK + "' and '" + S_CONFIG_TIME + "' values are mandatory!"); // Value check if ( bconfig.containsKey(S_CONFIG_BMARK) && bconfig.get(S_CONFIG_BMARK) < 0) throw new WrongFormatException("All '" + S_CONFIG_BMARK + "' values must be non-negative!"); if ( bconfig.containsKey(S_CONFIG_TIME) && bconfig.get(S_CONFIG_TIME) <= 0) throw new WrongFormatException("All '" + S_CONFIG_TIME + "' values must be positive!"); if ( bconfig.containsKey(S_CONFIG_MOTEC) && bconfig.get(S_CONFIG_MOTEC) < 1) throw new WrongFormatException("All '" + S_CONFIG_MOTEC + "' values must be positive!"); if ( bconfig.containsKey(S_CONFIG_LC) && bconfig.get(S_CONFIG_LC) < 0) throw new WrongFormatException("All '" + S_CONFIG_LC + "' values must be non-negative!"); if ( bconfig.containsKey(S_CONFIG_RANDSTART) && bconfig.get(S_CONFIG_RANDSTART) < 0) throw new WrongFormatException("All '" + S_CONFIG_RANDSTART + "' values must be non-negative!"); } // timers section // --------------------------------------------------------------------- List< Map> > btimers = bmark.containsKey(S_TIMERS) ? (List< Map> >) bmark.get(S_TIMERS) : null; TimerParser tp = new TimerParser(BenchmarkStatic.MAX_TIMER_COUNT); // Format checking if (btimers != null) { for (Map> timerspec : btimers) { for (byte i = 1; i <= BenchmarkStatic.MAX_TIMER_COUNT; ++i) { if (timerspec.containsKey(S_TIMER_PREFIX + i)) { List timervalues = (List) timerspec.get(S_TIMER_PREFIX + i); if (timervalues.size() != 3) { throw new WrongFormatException("All timer specification must contain exactly 3 values!"); } tp.setSpec((byte)(i-1), timervalues.get(0).shortValue(), timervalues.get(1).longValue(), timervalues.get(2).longValue()); } } } } // MAC parameter section // --------------------------------------------------------------------- List< Map> > macparams = bmark.containsKey(S_MAC) ? (List< Map> >) bmark.get(S_MAC) : null; MacParser mp = new MacParser(); // Format checking if (macparams != null) { for (Map> macspec : macparams) { for ( String key : macspec.keySet() ) { mp.parseAll(key, toIntArray(macspec.get(key)) ); } } } // forces section // --------------------------------------------------------------------- List forceopts = bmark.containsKey(S_FORCES) ? (List) bmark.get(S_FORCES) : null; // Format + value checking if ( forceopts != null ) { String ref[] = { S_FORCES_ACK, S_FORCES_BCAST}; checkUnknownTags(new HashSet(Arrays.asList(ref)), new HashSet(forceopts)); } short flags = mp.getFlags(); if ( forceopts != null ) { if ( forceopts.contains(S_FORCES_ACK) ) flags |= BenchmarkStatic.GLOBAL_USE_ACK; if ( forceopts.contains(S_FORCES_BCAST) ) flags |= BenchmarkStatic.GLOBAL_USE_BCAST; } // Create a SetupT for the current benchmark SetupT setup = new SetupT(); setup.set_problem_idx(bconfig.get(S_CONFIG_BMARK).shortValue()); setup.set_pre_run_msec( bconfig.containsKey(S_CONFIG_RANDSTART) ? bconfig.get(S_CONFIG_RANDSTART) : BenchmarkCommons.DEF_RANDSTART); setup.set_runtime_msec(bconfig.get(S_CONFIG_TIME).shortValue()); setup.set_post_run_msec( bconfig.containsKey(S_CONFIG_LC) ? bconfig.get(S_CONFIG_LC) : BenchmarkCommons.DEF_LASTCHANCE); setup.set_mac_setup(mp.getMacParams()); setup.set_flags(flags); setup.set_timers_isoneshot(tp.getIos()); setup.set_timers_delay(tp.getDelay()); setup.set_timers_period_msec(tp.getPeriod()); // update our attributes this.setups.add(setup); this.motecounts.add( bconfig.containsKey(S_CONFIG_MOTEC) ? bconfig.get(S_CONFIG_MOTEC) : 1); } System.out.println("OK"); System.out.println(" " + configfile + " : " + this.setups.size() + " benchmark(s) successfully parsed."); return true; } catch (FileNotFoundException ex) { System.out.println("FAIL"); System.out.println(" File named " + configfile + " not found!"); } catch (WrongFormatException ex) { System.out.println("FAIL"); System.out.println(" " + ex.getMessage()); } catch (Exception ex) { System.out.println("FAIL"); System.out.println(" Wrong configuration file format! The file must be YAML-formatted."); System.out.println(" " + ex.getMessage()); } return false; } /** * Run the previously parsed benchmark configurations. */ public boolean run(final boolean is_tossim) { PrintStream ps = null; try { ps = new PrintStream(this.outputfile); ps.println(BenchmarkCommons.xmlHeader()); BenchmarkController ctrl = new BenchmarkController(); ctrl.reset(!is_tossim); int i = 0; int total = this.setups.size(); int progress = 1; // Run each benchmark sequentially for (SetupT s : setups) { ctrl.updateMoteCount(this.motecounts.get(i++)); System.out.print("\r> Progress : " + (progress * 100 / total ) + "% (" + progress + "/" + total + ")" ); try { ctrl.reset(!is_tossim); ctrl.setup(s,!is_tossim); ctrl.syncAll(); ctrl.run(!is_tossim); ctrl.download_stat(); ctrl.download_profile(); } catch (BenchmarkController.MessageSendException ex) { ctrl.getResults().setError(ex.getMessage()); } catch (BenchmarkController.CommunicationException ex) { ctrl.getResults().setError(ex.getMessage()); } ++progress; ctrl.getResults().printXml(ps); } ps.println(BenchmarkCommons.xmlFooter()); ps.close(); System.out.println(); System.out.println("> Batch processing successfully finished!"); return true; } catch (FileNotFoundException ex) { System.out.println(" File named " + outputfile + " cannot be created!"); System.out.println("> Batch processing failed!"); return false; } catch (Exception ex) { System.out.println(" " + ex.getMessage()); System.out.println("> Batch processing failed!"); return false; } } private static int[] toIntArray(List list) { int[] ret = new int[list.size()]; int i = 0; for (Integer e : list) ret[i++] = e.intValue(); return ret; } } tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/benchmark/common/BenchmarkCommons.java000066400000000000000000000272211207233610700306730ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ package benchmark.common; import java.util.Vector; public class BenchmarkCommons { public static final short DEF_RANDSTART = 0; public static final short DEF_RUNTIME = 1000; public static final short DEF_LASTCHANCE = 20; private static final String nl = System.getProperty("line.separator"); /** * Compute the overall running time of the benchmark defined by the argument * @param config The benchmark configuration * @return the overall running time in msecs */ public static long getRuntime(final SetupT config) { return config.get_pre_run_msec() + config.get_runtime_msec() + config.get_post_run_msec(); } /** * Get the XML header for results generation * @return the XML header as one string */ public static String xmlHeader() { return "" + "" + nl + ""; } /** * Get the XML footer for results generation * @return the XML footer as one string */ public static String xmlFooter() { return ""; } /** * Generates a multi-line String representation of a benchmark * configuration passed as an argument. * * @param config The configuration * @return the string representation */ public static String setupAsString(final SetupT config) { String out = "> Problem: \t" + config.get_problem_idx() + nl; out += " Runtime: \t[max (" + config.get_pre_run_msec() + "ms) + " + config.get_runtime_msec() + "ms + " + config.get_post_run_msec() + " ms]" + nl; out += " F.Ack/Bcast: \t"; out += ( config.get_flags() & 0x1 ) > 0 ? "On/" : "Off/"; out += ( config.get_flags() & 0x2 ) > 0 ? "On" : "Off"; out += nl; out += " Timers: \t["; short ios[] = config.get_timers_isoneshot(); long delay[] = config.get_timers_delay(); long period[] = config.get_timers_period_msec(); for (int i=0; i< BenchmarkStatic.MAX_TIMER_COUNT; ++i) { out += (ios[i] == 1 ) ? "1shot " : "period "; out += delay[i] + "ms/"; out += period[i] + "ms"; if (i != BenchmarkStatic.MAX_TIMER_COUNT-1) out += " | "; } out += "]" + nl; out += MacParser.macAsString(config.get_flags(),config.get_mac_setup()); return out; } /** * Generates an XML representation of a benchmark * configuration passed as an argument. * * @param config The configuration * @return the XML representation */ public static String setupAsXml(final SetupT config) { String out = ""+nl; out +="" + config.get_problem_idx() + ""+nl; out +="" + config.get_pre_run_msec() + ""+nl; out +="" + config.get_runtime_msec() + ""+nl; out +="" + config.get_post_run_msec() + ""+nl; out +="" + (((config.get_flags() & BenchmarkStatic.GLOBAL_USE_ACK ) > 0 )? "On" : "Off") + ""+nl; out +="" + (((config.get_flags() & BenchmarkStatic.GLOBAL_USE_BCAST ) > 0 ) ? "On" : "Off") + ""+nl; out += MacParser.macAsXml(config.get_flags(),config.get_mac_setup()); short ios[] = config.get_timers_isoneshot(); long delay[] = config.get_timers_delay(); long period[] = config.get_timers_period_msec(); for (int i=0; i< BenchmarkStatic.MAX_TIMER_COUNT; ++i) { out += ""+nl; } out += ""; return out; } /** * Generates a multi-line String representation of the results of a benchmark * * @param stats the collection of the results * @return the string representation */ public static String statsAsString(final Vector stats) { String hdr = " -----------------------------------------------------------------------------------------------------------------" + nl + " Statistics :\t[ Tri Blg Res | send Succ Fail | sDone Succ Fail | Ack NAck | Recv Exp Wrng Dupl Frwd Miss | Rem ]"; String ret = ""; for (int i = 0; i < stats.size(); ++i) { StatT s = stats.get(i); String str = String.format(" Edge(%2d) :\t[ %2$3d %3$3d %4$3d | %5$4d %6$4d %7$4d | %8$5d %9$4d %10$4d | %11$3d %12$4d | %13$4d %14$4d %15$4d %16$4d %17$4d %18$4d | %19$3d ]", i, s.get_triggerCount(), s.get_backlogCount(), s.get_resendCount(), s.get_sendCount(), s.get_sendSuccessCount(), s.get_sendFailCount(), s.get_sendDoneCount(), s.get_sendDoneSuccessCount(), s.get_sendDoneFailCount(), s.get_wasAckedCount(), s.get_notAckedCount(), s.get_receiveCount(), s.get_consecutiveCount(), s.get_wrongCount(), s.get_duplicateCount(), s.get_forwardCount(), s.get_missedCount(), s.get_remainedCount()); ret += str + nl; } return hdr + nl + ret; } /** * Generates an XML representation of the results of a benchmark. * * @param stats the collection of the results * @return the XML representation */ public static String statsAsXml(final Vector stats) { String ret = ""+nl; for ( int i = 0; i< stats.size(); ++i ) { StatT s = stats.get(i); ret += ""; ret += "" + s.get_triggerCount() + ""; ret += "" + s.get_backlogCount() + ""; ret += "" + s.get_resendCount() + ""; ret += "" + s.get_sendCount() + ""; ret += "" + s.get_sendSuccessCount() + ""; ret += "" + s.get_sendFailCount() + ""; ret += "" + s.get_sendDoneCount() + ""; ret += "" + s.get_sendDoneSuccessCount() + ""; ret += "" + s.get_sendDoneFailCount() + ""; ret += "" + s.get_wasAckedCount() + ""; ret += "" + s.get_notAckedCount() + ""; ret += "" + s.get_receiveCount() + ""; ret += "" + s.get_consecutiveCount() + ""; ret += "" + s.get_wrongCount() + ""; ret += "" + s.get_forwardCount() + ""; ret += "" + s.get_duplicateCount() + ""; ret += "" + s.get_missedCount() + ""; ret += "" + s.get_remainedCount() + ""; ret += "" + nl; } ret += ""; return ret; } /** * Generates a String representation of the profile information of a benchmark * * @param profiles the computed profiles * @return the string representation */ public static String profilesAsString(final Vector profiles) { String hdr = " Profiles :\t[ Dbg | MaxAtom MaxInt MaxLat | MinAtom MinInt MinLat | RxTxTime RStartCnt RxMsgs Rx_B Tx_B ]"; String ret = ""; for (int i = 0; i < profiles.size(); ++i) { ProfileT p = profiles.get(i); String str = String.format(" Mote(%2d) :\t[ %2$3d | %3$7d %4$6d %5$6d | %6$7d %7$6d %8$6d | %9$10d %10$10d %11$10d %12$10d %13$10d ]", i+1, p.get_debug(), p.get_max_atomic(), p.get_max_interrupt(), p.get_max_latency(), p.get_min_atomic(), p.get_min_interrupt(), p.get_min_latency(), p.get_rtx_time(), p.get_rstart_count(), p.get_rx_msgs(), p.get_rx_bytes(), p.get_tx_bytes()); ret += str + nl; } return hdr + nl + ret; } /** * Generates an XML representation of the profile information of a benchmark * * @param profiles the computed profiles * @return the XML representation */ public static String profilesAsXml(final Vector profiles) { String ret = ""+nl; for ( int i = 0; i< profiles.size(); ++i ) { ProfileT p = profiles.get(i); ret += ""; ret += "" + p.get_max_atomic() + ""; ret += "" + p.get_max_interrupt() + ""; ret += "" + p.get_max_latency() + ""; ret += "" + p.get_min_atomic() + ""; ret += "" + p.get_min_interrupt() + ""; ret += "" + p.get_min_latency() + ""; ret += "" + p.get_rtx_time() + ""; ret += "" + p.get_rstart_count() + ""; ret += "" + p.get_rx_msgs() + ""; ret += "" + p.get_rx_bytes() + ""; ret += "" + p.get_tx_bytes() + ""; ret += "" + p.get_debug() + ""; ret += ""+nl; } ret += ""; return ret; } /** * Generates a String from the error which may have occured during the benchmark * @param s the error * @return the ready-for-output representation */ public static String errorAsString(final String s) { return " Error :\t" + ((s.compareTo("") == 0) ? "No errors." : s); } /** * Generates an XML tag from the error which may have occured during the benchmark * @param s the error * @return the ready-for-output XML representation */ public static String errorAsXml(final String s) { return "" + s + ""; } /** * Parses a parameter from an array based on its offset and length in bytes. * @param a underlying byte array * @param offset where does it start? * @param bytes how long? * @return the parameter * * Generated interfaces force us to use short for parameter 'a' but it is * a byte array in real. */ private static final long parseMacParameter(final short[] a, final byte offset, final byte bytes) { long l = 0; for(int i= offset; i< bytes; ++i) { l |= (byte)(a[i]) & 0xFF; l <<= 8; } return l; } }tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/benchmark/common/BenchmarkController.java000066400000000000000000000320531207233610700314020ustar00rootroot00000000000000/** Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ package benchmark.common; import java.util.concurrent.locks.*; import java.util.concurrent.TimeUnit; import net.tinyos.message.*; /** * The class that is able to communicate with the LinkBenchmark * TinyOS application. * * This class is responsible for sending and receiving control/data messages * to/from the motes via a BaseStation mote. * * It is designed to be minimal and full, so everything is functional yet user- * friendlyness must be implemented elsewhere. */ public class BenchmarkController implements MessageListener { private MoteIF mif; // Needed for proper downloading final Lock lock = new ReentrantLock(); final Condition answered = lock.newCondition(); private boolean handshake; private static int currentMote = 1; private static short currentData = 0; // Public to be able to set it easily public static final short MAXPROBES = 6; public static final short MAXTIMEOUT = 2000; private BenchmarkResult results; // These values are updated during the synchronization phase private int maxMoteId = 2; private int edgecount = 0; public class MessageSendException extends Exception {}; public class CommunicationException extends Exception { public CommunicationException(String message) { super(message); } }; /** * Contruct a controller. * * @param motecount How many motes are used? */ public BenchmarkController() { mif = new MoteIF(); mif.registerListener(new SyncMsgT(),this); mif.registerListener(new DataMsgT(),this); maxMoteId = 2; results = new BenchmarkResult(); } /** * Set the maximal mote id in the network. * * @param maxMoteId The new value */ public void updateMoteCount(final int maxMoteId) { this.maxMoteId = maxMoteId; this.edgecount = 0; } /** * Get the results * @return an object containing the current results */ public BenchmarkResult getResults() { return this.results; } /** * Send a RESET control message to the network. * It is a broadcast message, so every mote should receive it. * * @param use_bcast Whether send one broadcast message or iterate through the motes * @throws MessageSendException if an error occured (message is failed to send) */ public boolean reset(final boolean use_bcast) throws MessageSendException { CtrlMsgT cmsg = new CtrlMsgT(); cmsg.set_type(BenchmarkStatic.CTRL_RESET); try { if (use_bcast ){ mif.send(MoteIF.TOS_BCAST_ADDR,cmsg); } else { currentMote = 1; while ( currentMote <= maxMoteId ) { mif.send(currentMote++,cmsg); } } Thread.sleep((int)(500)); } catch(Exception e) { throw new MessageSendException(); } return true; } /** * Send a RESET control message to only one mote. * * @param moteId The mote to be resetted * @param use_bcast Whether send one broadcast message or iterate through the motes * @throws MessageSendException if an error occured (message is failed to send) */ public boolean resetMote(final int moteId) throws MessageSendException { CtrlMsgT cmsg = new CtrlMsgT(); cmsg.set_type(BenchmarkStatic.CTRL_RESET); try { mif.send(moteId,cmsg); Thread.sleep((int)(500)); } catch(Exception e) { throw new MessageSendException(); } return true; } /** * Send a SETUP control message to the network. * It is a broadcast message, so every mote should receive it. * * @param config The benchmark configurationT * @throws MessageSendException if an error occured (message is failed to send) */ /** * Send a SETUP control message to the network. * It is a broadcast message, so every mote should receive it. * * @param config The benchmark configurationT * @param use_bcast Whether use one broadcast message or iterate through the motes * @throws MessageSendException if an error occured (message is failed to send) */ public void setup(final SetupT config, final boolean use_bcast) throws MessageSendException { this.results.setConfig(config); // Create an appropriate setup message SetupMsgT smsg = new SetupMsgT(); smsg.set_config_problem_idx(config.get_problem_idx()); smsg.set_config_pre_run_msec(config.get_pre_run_msec()); smsg.set_config_runtime_msec(config.get_runtime_msec()); smsg.set_config_post_run_msec(config.get_post_run_msec()); smsg.set_config_flags(config.get_flags()); smsg.set_config_timers_isoneshot(config.get_timers_isoneshot()); smsg.set_config_timers_delay(config.get_timers_delay()); smsg.set_config_timers_period_msec(config.get_timers_period_msec()); smsg.set_config_mac_setup(config.get_mac_setup()); smsg.set_type(BenchmarkStatic.SETUP_BASE); try { if (use_bcast ){ mif.send(MoteIF.TOS_BCAST_ADDR,smsg); } else { currentMote = 1; while ( currentMote <= maxMoteId ) mif.send(currentMote++,smsg); } Thread.sleep((int)(500)); } catch(Exception e) { throw new MessageSendException(); } } /** * Synchronize all motes in the network having mote id from 1 to * the 'motecount' value specified either in the constructor or set by the * setMoteCount setter method. * * By synchronizing, we can detect failed motes (not answering), improperly * configured motes (wrong answers), and get the real motecount based on the * active benchmark configured in the network. * * @throws CommunicationException if synchronization error happens */ public void syncAll() throws CommunicationException { currentMote = 1; while ( currentMote <= maxMoteId ) { if ( !sync(currentMote) ) { throw new CommunicationException( "Synchronization Error with Mote ID: " + currentMote + "." + " -- Possible reasons: Bad benchmark ID, Mote not operational, not configured (Only LED 1 On), or badly configured (No LEDS On)" ); } else ++currentMote; } } /** * Send a SETUP_SYN control message to the specified mote. * It is a direct addressing message, so only the specified mote should * receive, and answer it. * * The handshake is probed MAXPROBES times using MAXTIMEOUT waiting for each. * * @param moteId The mote's id whom to send the synchronization request. * @return TRUE if the mote answered to our sync request, FALSE otherwise */ public boolean sync(final int moteId) { // Create a SYNC-request control message CtrlMsgT cmsg = new CtrlMsgT(); cmsg.set_type(BenchmarkStatic.CTRL_SETUP_SYN); lock.lock(); handshake = false; for( short probe = 0; !handshake && probe < MAXPROBES; ++probe ) { try { mif.send(moteId,cmsg); answered.await(MAXTIMEOUT,TimeUnit.MILLISECONDS); } catch(Exception e) { break; } } lock.unlock(); return handshake; } /** * Send a START control message to the network. * It is a broadcast message, so every mote should receive it. * * @param use_bcast Whether use one broadcast message or iterate through the motes * @throws MessageSendException if an error occured (message is failed to send) */ public void run(final boolean use_bcast) throws MessageSendException { // Create a START control message CtrlMsgT cmsg = new CtrlMsgT(); cmsg.set_type(BenchmarkStatic.CTRL_START); try { if (use_bcast ){ mif.send(MoteIF.TOS_BCAST_ADDR,cmsg); } else { currentMote = 1; while ( currentMote <= maxMoteId ) mif.send(currentMote++,cmsg); } // Wait for test completion + 100 msecs Thread.sleep( (int)(BenchmarkCommons.getRuntime(this.results.getConfig()) + 100) ); } catch(Exception e) { throw new MessageSendException(); } } /** * Download the statistics from the motes. * * @throws CommunicationException */ public void download_stat() throws CommunicationException { for ( currentMote = 1; currentMote <= maxMoteId ; ++currentMote ) { for ( currentData = 0; currentData < edgecount; ++currentData ) { if ( !requestData(currentMote,currentData,BenchmarkStatic.CTRL_STAT_REQ) ) { throw new CommunicationException( "Download Error with Mote ID: " + currentMote + ", stat index: " + currentData + "." ); } } } } /** * Download the profile information from the motes. * * @throws CommunicationException */ public void download_profile() throws CommunicationException { for (currentMote = 1; currentMote <= maxMoteId; ++currentMote) { if (!requestData(currentMote, currentData, BenchmarkStatic.CTRL_PROFILE_REQ)) { throw new CommunicationException( "Download Debug Error with Mote ID: " + currentMote + "."); } } } /** * Send a data requesting control message to a specific mote with a specified * data index. Data can be either the statistics on a specific edge, or the debug * information on the mote. * * @param moteId The mote we are targeting * @param dataidx The index of the data (only used when statistics are downloaded) * @param type BenchmarkStatic.CTRL_STAT_REQ or BenchmarkStatic.CTRL_DBG_REQ * @return TRUE if data has been received, FALSE otherwise */ private boolean requestData(final int moteId, final short dataidx, final short type) { // Create a download request control message CtrlMsgT cmsg = new CtrlMsgT(); cmsg.set_type(type); cmsg.set_data_req_idx(dataidx); lock.lock(); handshake = false; for( short probe = 0; !handshake && probe < MAXPROBES; ++probe ) { try { mif.send(moteId,cmsg); answered.await(MAXTIMEOUT,TimeUnit.MILLISECONDS); } catch(Exception e) { break; } } lock.unlock(); return handshake; } /** * The event which is triggered on message reception. We can receive messages * in two situations: * - either in the synchronization phase (sync acknowledgements) * - or in the downloading phases (stats or debug info) * * @param dest_addr The source mote id of the message * @param msg The message received */ public void messageReceived(int dest_addr,Message msg) { lock.lock(); // Received a SyncMsgT if ( msg instanceof SyncMsgT ) { SyncMsgT smsg = (SyncMsgT)msg; if ( smsg.get_type() == BenchmarkStatic.SYNC_SETUP_ACK ) { handshake = true; edgecount = smsg.get_edgecnt(); if ( smsg.get_maxmoteid() > maxMoteId ) maxMoteId = smsg.get_maxmoteid(); // update the results structure this.results.cleanResize(maxMoteId, edgecount); answered.signal(); } // Received a DataMsgT } else if ( msg instanceof DataMsgT ) { DataMsgT rmsg = (DataMsgT) msg; switch (rmsg.get_type()) { case BenchmarkStatic.DATA_STAT_OK: // Process the message only if this message is the answer for our query // This prevents us from makeing corrupt statistics. if (currentData == rmsg.get_data_idx()) { this.results.appendStatFromMessage(currentData, rmsg); } break; case BenchmarkStatic.DATA_PROFILE_OK: this.results.appendProfileFromMessage(currentMote, rmsg); break; } handshake = true; answered.signal(); } lock.unlock(); } } tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/benchmark/common/BenchmarkResult.java000066400000000000000000000235721207233610700305430ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ package benchmark.common; import java.io.PrintStream; import java.util.Calendar; import java.util.Vector; /** * This class holds all the results of a benchmark run along with the computed * statistics and any error which may occur during the test run. * */ public class BenchmarkResult { private SetupT config; private Vector stats; private Vector profiles; private String error; /** * Basic constuctor of a result holder. */ public BenchmarkResult() { this.init(null); } /** * Construct a result holder with a known configuration. * @param config the configuration */ public BenchmarkResult(final SetupT config) { this.init(config); } /** * Helper function for constructors * @param config the configuration */ private void init(final SetupT config) { this.config = config; this.stats = null; this.profiles = null; this.error = ""; } /** * Clean the result holder object and make it ready for a new benchmark. * * @param motecount the new benchmark's motecount * @param edgecount the new benchmark's edgecount */ public void cleanResize(final int motecount, final int edgecount) { if ( this.stats != null ) { this.stats.clear(); this.profiles.clear(); } this.stats = new Vector(edgecount); this.profiles = new Vector(motecount); // Initialize the elements for (int i = 0; i< edgecount; ++i ) { this.stats.add(new StatT()); } // Initialize the elements for (int i = 0; i< motecount; ++i ) { this.profiles.add(new ProfileT()); } this.error = ""; } /** * Set the configuration of the benchmark for the results holder object. * @param config the configuration */ public void setConfig(final SetupT config) { this.config = config; } /** * Get the actual benchmark result's configuration * @return the configuration */ public SetupT getConfig() { return config; } /** * Set an error indicating that an error occured durint the test run. * @param error the string representation of the error */ public void setError(final String error) { this.error = error; } /** * Get the error which may have occured. * @return the string representation of the error */ public String getError() { return this.error; } /** * Append new profile information to existing ones from a message. * Note that the message does not contain the sender's id, that is why * we must explicitly specify it for this function. * * @param idx the mote's id to which this information belongs * @param msg the message holding the information */ public void appendProfileFromMessage(final int idx, final DataMsgT msg) { // Get the new Profile from the message ProfileT p = new ProfileT(); p.set_max_atomic(msg.get_payload_profile_max_atomic()); p.set_max_interrupt(msg.get_payload_profile_max_interrupt()); p.set_max_latency(msg.get_payload_profile_max_latency()); p.set_min_atomic(msg.get_payload_profile_min_atomic()); p.set_min_interrupt(msg.get_payload_profile_min_interrupt()); p.set_min_latency(msg.get_payload_profile_min_latency()); p.set_rtx_time(msg.get_payload_profile_rtx_time()); p.set_rstart_count(msg.get_payload_profile_rstart_count()); p.set_rx_bytes(msg.get_payload_profile_rx_bytes()); p.set_tx_bytes(msg.get_payload_profile_tx_bytes()); p.set_rx_msgs(msg.get_payload_profile_rx_msgs()); p.set_debug(msg.get_payload_profile_debug()); this.profiles.set(idx-1, p); } /** * Append new statistics to existing ones from a message. * Note that the message does not contain the sender's id, that is why * we must explicitly specify it for this function. * * @param idx the mote's id to which this information belongs * @param msg the message holding the information */ public void appendStatFromMessage(final int idx, final DataMsgT msg) { // Get the new Stat from the message StatT s = new StatT(); s.set_triggerCount(msg.get_payload_stat_triggerCount()); s.set_backlogCount(msg.get_payload_stat_backlogCount()); s.set_resendCount(msg.get_payload_stat_resendCount()); s.set_sendCount(msg.get_payload_stat_sendCount()); s.set_sendSuccessCount(msg.get_payload_stat_sendSuccessCount()); s.set_sendFailCount(msg.get_payload_stat_sendFailCount()); s.set_sendDoneCount(msg.get_payload_stat_sendDoneCount()); s.set_sendDoneSuccessCount(msg.get_payload_stat_sendDoneSuccessCount()); s.set_sendDoneFailCount(msg.get_payload_stat_sendDoneFailCount()); s.set_wasAckedCount(msg.get_payload_stat_wasAckedCount()); s.set_notAckedCount(msg.get_payload_stat_notAckedCount()); s.set_receiveCount(msg.get_payload_stat_receiveCount()); s.set_consecutiveCount(msg.get_payload_stat_consecutiveCount()); s.set_wrongCount(msg.get_payload_stat_wrongCount()); s.set_duplicateCount(msg.get_payload_stat_duplicateCount()); s.set_missedCount(msg.get_payload_stat_missedCount()); s.set_forwardCount(msg.get_payload_stat_forwardCount()); s.set_remainedCount(msg.get_payload_stat_remainedCount()); // Get the current stat StatT s1 = this.stats.get(idx); // Make a new stat - this will be the merginf of the current and the new one. StatT news = new StatT(); news.set_triggerCount( s1.get_triggerCount() + s.get_triggerCount()); news.set_backlogCount( s1.get_backlogCount() + s.get_backlogCount()); news.set_resendCount( s1.get_resendCount() + s.get_resendCount()); news.set_sendCount( s1.get_sendCount() + s.get_sendCount()); news.set_sendSuccessCount( s1.get_sendSuccessCount() + s.get_sendSuccessCount()); news.set_sendFailCount( s1.get_sendFailCount() + s.get_sendFailCount()); news.set_sendDoneCount( s1.get_sendDoneCount() + s.get_sendDoneCount()); news.set_sendDoneSuccessCount( s1.get_sendDoneSuccessCount() + s.get_sendDoneSuccessCount()); news.set_sendDoneFailCount( s1.get_sendDoneFailCount() + s.get_sendDoneFailCount()); news.set_wasAckedCount( s1.get_wasAckedCount() + s.get_wasAckedCount()); news.set_notAckedCount( s1.get_notAckedCount() + s.get_notAckedCount()); news.set_receiveCount( s1.get_receiveCount() + s.get_receiveCount()); news.set_consecutiveCount( s1.get_consecutiveCount() + s.get_consecutiveCount()); news.set_wrongCount( s1.get_wrongCount() + s.get_wrongCount()); news.set_duplicateCount( s1.get_duplicateCount() + s.get_duplicateCount()); news.set_missedCount( s1.get_missedCount() + s.get_missedCount()); news.set_forwardCount( s1.get_forwardCount() + s.get_forwardCount()); news.set_remainedCount((short)(s1.get_remainedCount() + s.get_remainedCount())); this.stats.set(idx, news); } /** * Print the current result's configuration into a character stream. * * @param stream the stream */ public void printConfig(PrintStream stream) { stream.println(BenchmarkCommons.setupAsString(this.config)); } /** * Print the current results with debug and error information into a character * stream. * * @param stream the stream */ public void print(PrintStream stream) { stream.println(BenchmarkCommons.setupAsString(this.config)); stream.println(BenchmarkCommons.statsAsString(this.stats)); stream.println(BenchmarkCommons.profilesAsString(this.profiles)); stream.println(BenchmarkCommons.errorAsString(this.error)); } /** * Print the current results with debug and error information into a character * stream with XML formatting. * * @param stream the stream */ public void printXml(PrintStream stream) { Calendar calendar = Calendar.getInstance(); stream.println(""); stream.println(BenchmarkCommons.setupAsXml(this.config)); stream.println(BenchmarkCommons.statsAsXml(this.stats)); stream.println(BenchmarkCommons.profilesAsXml(this.profiles)); stream.println(BenchmarkCommons.errorAsXml(this.error)); stream.println(""); } } tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/benchmark/common/MacParser.java000066400000000000000000000127761207233610700273330ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ package benchmark.common; import java.util.regex.Pattern; import java.util.regex.Matcher; public class MacParser { private int macparams[]; private short flags; public class MacParserException extends Exception { public MacParserException(String msg) { super(msg); } } public MacParser() { this.macparams = new int[BenchmarkStatic.MAC_SETUP_LENGTH]; this.flags = 0; for (int i = 0; i < BenchmarkStatic.MAC_SETUP_LENGTH; ++i) { this.macparams[i] = 0; } } public void parse(final String spec) throws MacParserException { Pattern pattern = Pattern.compile("^(\\w+):([\\d+,]+)$"); Matcher matcher = pattern.matcher(spec); if (matcher.find()) { this.parseAll(matcher.group(1),matcher.group(2).split(",")); } else { throw new MacParserException("Invalid MAC parameter specification, see help!"); } } public void parseAll(final String type, final String[] params) throws MacParserException { int[] iparams = new int[params.length]; for(byte i=0; i< params.length; ++i) iparams[i] = Integer.parseInt(params[i]); this.parseAll(type, iparams); } public void parseAll(final String type, final int[] params) throws MacParserException { this.parseLPL(type, params); this.parsePacketLink(type, params); if ( (this.flags & (this.flags - 1)) != 0) throw new MacParserException("Only one MAC protocol is allowed!"); } public static String macAsString(final short flags, final int[] params) { String nl = System.getProperty("line.separator"); return LPLasString(flags,params) + nl + PacketLinkasString(flags,params) + nl; } public static String macAsXml(final short flags, final int[] params) { String nl = System.getProperty("line.separator"); return "" + LPLasXml(flags,params) + PacketLinkasXml(flags,params) + "" + nl; } private void parseLPL(final String type, final int[] params) throws MacParserException { if ( type.equals("lpl") ) { if (params.length != 1) { throw new MacParserException( "LPL MAC requires exactly one parameter ( Wakeup interval (ms) )!"); } flags |= BenchmarkStatic.GLOBAL_USE_MAC_LPL; this.macparams[BenchmarkStatic.LPL_WAKEUP_OFFSET] = params[0]; } } private static String LPLasString(final short flags, final int[] params) { String ret=""; if ((flags & BenchmarkStatic.GLOBAL_USE_MAC_LPL) != 0) { ret = " LPL: \t\t" + params[0] + " ms"; } return ret; } private static String LPLasXml(final short flags, final int[] params) { String ret=""; if ((flags & BenchmarkStatic.GLOBAL_USE_MAC_LPL) != 0) { ret = ""; } return ret; } private void parsePacketLink(final String type, final int[] params) throws MacParserException { if ( type.equals("plink") ) { if (params.length != 2) { throw new MacParserException( "Packet Link MAC requires exactly two parameters ( Retries (ms) + Delay (ms) )!"); } flags |= BenchmarkStatic.GLOBAL_USE_MAC_PLINK; this.macparams[BenchmarkStatic.PLINK_RETRIES_OFFSET] = params[0]; this.macparams[BenchmarkStatic.PLINK_DELAY_OFFSET] = params[1]; } } private static String PacketLinkasString(final short flags, final int[] params) { String ret=""; if ((flags & BenchmarkStatic.GLOBAL_USE_MAC_PLINK) != 0) { ret = " Packet Link: Retries: " + params[0] + " ms, Delay: " + params[0] + " ms"; } return ret; } private static String PacketLinkasXml(final short flags, final int[] params) { String ret=""; if ((flags & BenchmarkStatic.GLOBAL_USE_MAC_PLINK) != 0) { ret = ""; } return ret; } public int[] getMacParams() { return macparams; } public short getFlags() { return flags; } }tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/benchmark/common/TimerParser.java000066400000000000000000000077521207233610700277110ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Krisztian Veress * veresskrisztian@gmail.com */ package benchmark.common; import java.util.regex.Pattern; import java.util.regex.Matcher; public class TimerParser { private short ios[]; private long delay[]; private long period[]; private byte maxtimer = 0; public static final short DEF_TIMER_ONESHOT = 1; public static final short DEF_TIMER_DELAY = 0; public static final short DEF_TIMER_PERIOD = 100; public class TimerParserException extends Exception { public TimerParserException(String msg) { super(msg); } } public TimerParser(final byte maxtimercount) { this.maxtimer = maxtimercount; this.ios = new short[maxtimercount]; this.delay = new long[maxtimercount]; this.period = new long[maxtimercount]; for (int i = 0; i < maxtimercount; ++i) { this.ios[i] = DEF_TIMER_ONESHOT; this.delay[i] = DEF_TIMER_DELAY; this.period[i] = DEF_TIMER_PERIOD; } } public void parse(final String spec) throws TimerParserException { Pattern pattern = Pattern.compile("(\\d+):(\\d+),(\\d+),(\\d+)"); Matcher matcher = pattern.matcher(spec); if (matcher.find()) { int trigidx = Integer.parseInt(matcher.group(1)); if (trigidx < 1 || trigidx > this.maxtimer) { throw new TimerParserException("Valid timer indexes are : [1.." + this.maxtimer + "]!"); } --trigidx; this.ios[trigidx] = (byte) Integer.parseInt(matcher.group(2)); this.delay[trigidx] = Integer.parseInt(matcher.group(3)); this.period[trigidx] = Integer.parseInt(matcher.group(4)); if ( this.period[trigidx] < 0 || this.delay[trigidx] < 0 || this.ios[trigidx] < 0 || this.ios[trigidx] > 1) { throw new TimerParserException("Trigger timer " + (trigidx + 1) + " is invalid!"); } // at time 0, only one-shot timers are allowed to fire if ( this.period[trigidx] == 0 && this.ios[trigidx] != 1) { throw new TimerParserException("Only one-shot timers are allowed with 0 ms period!"); } } else { throw new TimerParserException("Invalid spec timer specification!"); } } public void setSpec(final byte idx,final short ios,final long delay, final long period) { this.ios[idx] = ios; this.delay[idx] = delay; this.period[idx] = period; } public short[] getIos() { return ios; } public long[] getDelay() { return delay; } public long[] getPeriod() { return period; } }tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/build.xml000066400000000000000000000147671207233610700232140ustar00rootroot00000000000000 LinkBench ANT script Clean task aborted by user. tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/000077500000000000000000000000001207233610700234025ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/README.TXT000066400000000000000000000033501207233610700247410ustar00rootroot00000000000000Howto run the LinkBench application ----------------------------------- I. Windows users: --------------------- 1, You should start a command line tool by clicking on Start->Run and entering cmd.exe . 2, Then, navigate to the directory where this (README.TXT) file is located. 3, Type the following in the command line for more instructions : java -jar linkbench.jar --help II. Unix/Linux users: --------------------- 1, Open a terminal (xterm, gnome-terminal, etc) and navigate to the directory where this (README.TXT) file is located. 2/a, Type the following in the command line for more instructions : java -jar linkbench.jar --help 2/b, First make the bmark.sh file executable, and start the application after : chmod u+x linkbench.sh ./linkbench.sh --help Troubleshooting: ---------------- 1, Problem : The linkbench.jar file does not exist. Solution: Maybe you forgot to compile the sources, or deleted that file. You should re-compile the Java sources (and possibly the TinyOS sources). For instructions, see the README file in the root directory of the application. 2, Problem : There is no such command as 'java'. Solution: You must install the Java SDK 1.6 to be able to compile and run this application. Once you have it, follow the instruction in the README file in the root directory of the application. 3, Problem : I have read all READMEs, instructions, but I cannot overcome my specific problem. Solution: Write me an email (verkri@inf.u-szeged.hu) describing your system ( platform, JDK version, TinyOS version, where you have installed the application, etc). tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/assets/000077500000000000000000000000001207233610700247045ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/assets/benchmark.css000066400000000000000000000046231207233610700273550ustar00rootroot00000000000000body { font: 13px sans-serif; background-color: #DDDDDD; margin: 0px 5px 0px 5px; } div.title { font: 15px sans-serif; font-weight: bold; background-color: #798EF9; text-align: center; margin-top: 0; margin-bottom: 0; padding: 1px 1px 1px 1px; color: #000000; } div.title_light { font: 15px sans-serif; font-weight: bold; text-align: center; margin-top: 0; margin-bottom: 0; padding: 1px 1px 1px 1px; color: #000000; } div.debuglist, div.error { margin-top: 5px; text-align: center; } table.testresult { margin-bottom: 10px; border: 0px; border-spacing: 0px; border-padding: 0px; width: 100%; } table.summary, table.data { margin: 2px 0px 0px 0px; border: 1px solid #888888; width: 100%; border-spacing: 1px; border-padding: 0px; } .rt { background-color: white; text-align: right; font: 11px sans-serif; padding-right: 5px; } .rt_data { background-color: white; text-align: center; font: 13px sans-serif; font-weight: bold; } .rcv { color: #770202; } .snd { color: #027702; } .cprofile { color: #33469A; } .rprofile { color: #554666; } .title_send { background-color: #ACF979; font: 13px sans-serif; font-weight: bold; text-align: center; border-style: solid; border-width: 0px 0px 1px 0px; } .title_rcv { background-color: #FFA579; font: 13px sans-serif; font-weight: bold; text-align: center; border-style: solid; border-width: 0px 0px 1px 0px; } .title_cprofile { background-color: #5579BC; font: 13px sans-serif; font-weight: bold; text-align: center; border-style: solid; border-width: 0px 0px 1px 0px; } .title_rprofile { background-color: #887999; font: 13px sans-serif; font-weight: bold; text-align: center; border-style: solid; border-width: 0px 0px 1px 0px; } .sub { background-color: #FFF3A0; font: 11px sans-serif; text-align: center; } div.top { text-align : center; font: 18px sans-serif; font-weight: bold; margin-bottom: 10px; } span.debug_ok { color: #027702; padding-left: 5px; padding-right: 5px; font-weight: bold; } span.debug_fail, div.error { color: #770202; padding-left: 5px; padding-right: 5px; font-weight: bold; } a { font: 11px verdana, arial, helvetica, sans-serif; } a:link { color: #0011BB; text-decoration: none; } a:visited { color: #0011BB; text-decoration: none; } a:hover { color: #605040; text-decoration: underline; } tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/assets/benchmark.xsl000066400000000000000000000253261207233610700273760ustar00rootroot00000000000000 RadioTest result report
Testcase
Statistics ()
  send() sendDone()   receive()
Edge Rem Triggered Backlog Resend Total SUCC FAIL Total SUCC FAIL ACK noACK Total Consecutive Wrong Duplicate Forward Missed
Code Profile Radio Profile
Mote Min/Max Atomic Min/Max Interrupt Min/Max Latency RxTx Time Radio Start cnt Total Msg cnt Rx Bytes Tx Bytes Debug
Problem :
Rand start : ms
Runtime : ms
Lastchance : ms
Forces : ack bcast none
Timer() : 1sh per | /
LPL : ms Packet Link : Retries :
Delay :
/ / / OK FAIL ()
tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/batchfiles/000077500000000000000000000000001207233610700255065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/batchfiles/batch_all.yml000066400000000000000000000020551207233610700301440ustar00rootroot00000000000000config: {bmark: 10, time: 1000 } --- config: {bmark: 11, time: 1000 } --- config: {bmark: 12, time: 1000 } --- config: {bmark: 13, time: 1000 } --- config: {bmark: 14, time: 1000 } --- config: {bmark: 15, time: 1000 } --- config: {bmark: 16, time: 1000 } --- config: {bmark: 17, time: 1000 } --- config: {bmark: 18, time: 1000 } --- config: {bmark: 19, time: 1000 } --- config: {bmark: 20, time: 1000 } --- config: {bmark: 30, time: 1000 } --- config: {bmark: 31, time: 1000 } --- config: {bmark: 32, time: 1000 } --- config: {bmark: 33, time: 1000 } --- config: {bmark: 34, time: 1000 } --- config: {bmark: 35, time: 1000 } --- config: {bmark: 36, time: 1000 } --- config: {bmark: 50, time: 1000 } --- config: {bmark: 51, time: 1000 } --- config: {bmark: 52, time: 1000 } --- config: {bmark: 53, time: 1000 } --- config: {bmark: 54, time: 1000 } --- config: {bmark: 55, time: 1000 } --- config: {bmark: 56, time: 1000 } --- config: {bmark: 57, time: 1000 } --- config: {bmark: 58, time: 1000 } --- config: {bmark: 59, time: 1000 } --- config: {bmark: 60, time: 1000 } tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/batchfiles/batch_collisions.yml000066400000000000000000000026521207233610700315550ustar00rootroot00000000000000config: {bmark: 30, time: 1000} --- config: {bmark: 30, time: 1000} forces: [ack] --- config: {bmark: 30, time: 1000} timers: - t2: [0, 50, 100] --- config: {bmark: 30, time: 1000} timers: - t2: [0, 50, 100] forces: [ack] --- config: {bmark: 31, time: 1000} --- config: {bmark: 31, time: 1000} timers: - t2: [0, 50, 100] --- config: {bmark: 32, time: 1000} --- config: {bmark: 32, time: 1000} timers: - t3: [0, 50, 100] --- config: {bmark: 32, time: 1000} timers: - t2: [0, 33, 100] - t3: [0, 66, 100] --- config: {bmark: 33, time: 1000} --- config: {bmark: 33, time: 1000} forces: [ack] --- config: {bmark: 33, time: 1000} timers: - t3: [0, 50, 100] --- config: {bmark: 33, time: 1000} timers: - t3: [0, 50, 100] forces: [ack] --- config: {bmark: 33, time: 1000} timers: - t2: [0, 33, 100] - t3: [0, 66, 100] --- config: {bmark: 33, time: 1000} timers: - t2: [0, 33, 100] - t3: [0, 66, 100] forces: [ack] --- config: {bmark: 34, time: 1000} --- config: {bmark: 34, time: 1000} forces: [ack] --- config: {bmark: 34, time: 1000} timers: - t3: [0, 50, 100] --- config: {bmark: 34, time: 1000} timers: - t3: [0, 50, 100] forces: [ack] --- config: {bmark: 34, time: 1000} timers: - t2: [0, 33, 100] - t3: [0, 66, 100] --- config: {bmark: 34, time: 1000} timers: - t2: [0, 33, 100] - t3: [0, 66, 100] forces: [ack] --- config: {bmark: 35, time: 1000} --- config: {bmark: 35, time: 1000} forces: [ack] --- config: {bmark: 36, time: 1000} tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/batchfiles/batch_forwarding.yml000066400000000000000000000046021207233610700315360ustar00rootroot00000000000000config: {bmark: 50, time: 1000} timers: - t1: [0, 0, 100] --- config: {bmark: 50, time: 1000} timers: - t1: [0, 0, 100] forces: [ack] --- config: {bmark: 50, time: 1000} timers: - t1: [0, 0, 50] --- config: {bmark: 50, time: 1000} timers: - t1: [0, 0, 50] forces: [ack] --- config: {bmark: 50, time: 1000} timers: - t1: [0, 0, 25] --- config: {bmark: 50, time: 1000} timers: - t1: [0, 0, 25] forces: [ack] --- config: {bmark: 50, time: 1000} timers: - t1: [0, 0, 10] --- config: {bmark: 50, time: 1000} timers: - t1: [0, 0, 10] forces: [ack] --- config: {bmark: 51, time: 1000} timers: - t1: [0, 0, 100] --- config: {bmark: 51, time: 1000} timers: - t1: [0, 0, 50] --- config: {bmark: 51, time: 1000} timers: - t1: [0, 0, 25] --- config: {bmark: 51, time: 1000} timers: - t1: [0, 0, 10] --- config: {bmark: 52, time: 1000} timers: - t1: [0, 0, 100] --- config: {bmark: 52, time: 1000} timers: - t1: [0, 0, 50] --- config: {bmark: 52, time: 1000} timers: - t1: [0, 0, 25] --- config: {bmark: 52, time: 1000} timers: - t1: [0, 0, 10] --- config: {bmark: 53, time: 1000} timers: - t1: [0, 0, 100] --- config: {bmark: 53, time: 1000} timers: - t1: [0, 0, 50] --- config: {bmark: 53, time: 1000} timers: - t1: [0, 0, 25] --- config: {bmark: 53, time: 1000} timers: - t1: [0, 0, 10] --- config: {bmark: 54, time: 1000} --- config: {bmark: 54, time: 1000} forces: [ack] --- config: {bmark: 54, time: 1000} timers: - t2: [0, 50, 100] --- config: {bmark: 54, time: 1000} timers: - t2: [0, 50, 100] forces: [ack] --- config: {bmark: 55, time: 1000} --- config: {bmark: 55, time: 1000} forces: [ack] --- config: {bmark: 55, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 33, 100] - t3: [0, 66, 100] --- config: {bmark: 55, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 33, 100] - t3: [0, 66, 100] forces: [ack] --- config: {bmark: 56, time: 1000} --- config: {bmark: 56, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 33, 100] - t3: [0, 66, 100] --- config: {bmark: 57, time: 1000} --- config: {bmark: 57, time: 1000} forces: [ack] --- config: {bmark: 57, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 33, 100] - t3: [0, 66, 100] --- config: {bmark: 57, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 33, 100] - t3: [0, 66, 100] forces: [ack] --- config: {bmark: 58, time: 1000} --- config: {bmark: 58, time: 1000} forces: [ack] --- config: {bmark: 59, time: 1000} --- config: {bmark: 60, time: 1000} tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/batchfiles/batch_lpl.yml000066400000000000000000000047201207233610700301640ustar00rootroot00000000000000config: {bmark: 30, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 0, 100] wakeup: 0 --- config: {bmark: 30, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 0, 100] wakeup: 30 --- config: {bmark: 30, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 0, 100] wakeup: 70 --- config: {bmark: 30, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 0, 100] wakeup: 130 --- config: {bmark: 30, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 50, 100] wakeup: 0 --- config: {bmark: 30, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 50, 100] wakeup: 30 --- config: {bmark: 30, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 50, 100] wakeup: 70 --- config: {bmark: 30, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 50, 100] wakeup: 130 --- config: {bmark: 35, time: 1000} wakeup: 0 --- config: {bmark: 35, time: 1000} wakeup: 30 --- config: {bmark: 35, time: 1000} wakeup: 70 --- config: {bmark: 35, time: 1000} wakeup: 130 --- config: {bmark: 50, time: 1000} wakeup: 0 --- config: {bmark: 50, time: 1000} wakeup: 30 --- config: {bmark: 50, time: 1000} wakeup: 70 --- config: {bmark: 50, time: 1000} wakeup: 130 --- config: {bmark: 53, time: 1000} wakeup: 0 --- config: {bmark: 53, time: 1000} wakeup: 30 --- config: {bmark: 53, time: 1000} wakeup: 70 --- config: {bmark: 53, time: 1000} wakeup: 130 --- config: {bmark: 53, time: 1000} timers: - t1: [0, 0, 20] wakeup: 0 --- config: {bmark: 53, time: 1000} timers: - t1: [0, 0, 20] wakeup: 30 --- config: {bmark: 53, time: 1000} timers: - t1: [0, 0, 20] wakeup: 70 --- config: {bmark: 53, time: 1000} timers: - t1: [0, 0, 20] wakeup: 130 --- config: {bmark: 55, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 33, 100] - t3: [0, 66, 100] wakeup: 0 --- config: {bmark: 55, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 33, 100] - t3: [0, 66, 100] wakeup: 30 --- config: {bmark: 55, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 33, 100] - t3: [0, 66, 100] wakeup: 70 --- config: {bmark: 55, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 33, 100] - t3: [0, 66, 100] wakeup: 130 --- config: {bmark: 58, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 33, 100] - t3: [0, 66, 100] wakeup: 0 --- config: {bmark: 58, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 33, 100] - t3: [0, 66, 100] wakeup: 30 --- config: {bmark: 58, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 33, 100] - t3: [0, 66, 100] wakeup: 70 --- config: {bmark: 58, time: 1000} timers: - t1: [0, 0, 100] - t2: [0, 33, 100] - t3: [0, 66, 100] wakeup: 130 tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/batchfiles/batch_throughputs.yml000066400000000000000000000015201207233610700317640ustar00rootroot00000000000000config: {bmark: 10, time: 1000} --- config: {bmark: 11, time: 1000} --- config: {bmark: 12, time: 1000} --- config: {bmark: 10, time: 1000} forces: [ack] --- config: {bmark: 11, time: 1000} forces: [ack] --- config: {bmark: 12, time: 1000} forces: [ack] --- config: {bmark: 10, time: 1000} forces: [bcast] --- config: {bmark: 11, time: 1000} forces: [bcast] --- config: {bmark: 12, time: 1000} forces: [bcast] --- config: {bmark: 13, time: 1000} --- config: {bmark: 14, time: 1000} --- config: {bmark: 15, time: 1000} --- config: {bmark: 16, time: 1000} --- config: {bmark: 16, time: 1000} forces: [ack] --- config: {bmark: 17, time: 1000} --- config: {bmark: 18, time: 1000} --- config: {bmark: 19, time: 1000} --- config: {bmark: 19, time: 1000} forces: [ack] --- config: {bmark: 20, time: 1000} --- config: {bmark: 20, time: 1000} forces: [ack] tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/batchfiles/generate_batch.sh000066400000000000000000000040541207233610700310000ustar00rootroot00000000000000#!/bin/bash # This shell script is useful for generating hundreds of benchmarks # based on specific needs without the need of typing 1 billion words. # # Modify the code of main() as you like. # Here is an example how to generate a bunch of descriptions main() { A_BMARK="" TIME=10000 TIMER1=(0 0 100) #TIMER2=(0 33 100) #TIMER3=(0 66 100) #ACK=yes #ACK=yes WAKEUP=400 TIMES="100 500 1000 2000" for t in $TIMES; do for BMARK in `seq 100 105`; do TIMER1[2]=$t #for WAKEUP in $A_WAKEUP; do print_bmark >> $1 done done } # Print a YAML-correct benchmark description based on env vars print_bmark() { # start benchmark echo "---" # config section if [[ -z $TIME || -z $BMARK ]]; then echo "Undefined BMARK or TIME value!" exit 1 fi echo -n "config: {bmark: $BMARK, time: $TIME" echo -n ${MOTES:+", motes: $MOTES"}; echo -n ${RANDSTART:+", randstart: $RANDSTART"}; echo -n ${LCHANCE:+", lchance: $LCHANCE"}; echo "}" #timers section GOTTIMER=0 if [[ -n $TIMER1 && ${#TIMER1[*]} -eq 3 ]]; then GOTTIMER=1 TIMERV[0]="t1: [${TIMER1[0]}, ${TIMER1[1]}, ${TIMER1[2]}]" fi if [[ -n $TIMER2 && ${#TIMER2[*]} -eq 3 ]]; then GOTTIMER=1 TIMERV[1]="t2: [${TIMER2[0]}, ${TIMER2[1]}, ${TIMER2[2]}]" fi if [[ -n $TIMER3 && ${#TIMER3[*]} -eq 3 ]]; then GOTTIMER=1 TIMERV[2]="t3: [${TIMER3[0]}, ${TIMER3[1]}, ${TIMER3[2]}]" fi if [[ -n $TIMER4 && ${#TIMER4[*]} -eq 3 ]]; then GOTTIMER=1 TIMERV[3]="t4: [${TIMER4[0]}, ${TIMER4[1]}, ${TIMER4[2]}]" fi if [[ $GOTTIMER -eq 1 ]]; then echo "timers:" echo ${TIMERV[0]}${TIMERV[1]}${TIMERV[2]}${TIMERV[3]} | sed 's/\]t/\]\nt/g' | sed 's/\(t[0-9]\):/ - \1:/g' fi unset GOTTIMER unset TIMERV # forces section FORCES=${BCAST}${ACK} echo -n ${FORCES:+"forces: "} FORCESV="[${BCAST:+bcast}, ${ACK:+ack}]" echo -n $FORCESV | sed 's:, \]:\]:g' | sed 's:\[, :\[:g' | sed 's:\[\]::g' echo -ne ${FORCES:+'\n'} unset FORCES unset FORCESV # wakeup section echo -en ${WAKEUP:+"wakeup: $WAKEUP\n"}; } main $1 tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/batchfiles/sample_batch_config.yml000066400000000000000000000040221207233610700321760ustar00rootroot00000000000000# Benchmark batch configuration sample file # ----------------------------------------- # # This file describes multiple benchmarks to be run in sequence with the LinkBenchmark # TinyOS application along with its supporting PC-side Java application. # # The content of this file is YAML-formatted with a reduced key set and value sets. # Benchmark definitions must be separated with 3 dashes ('---') in a separate line. # # The example below demonstrates ALL options that can be specified in the correct # format: # --- # config: {bmark: 10, motes: 6, time: 1000, randstart: 30, lchance: 20} # timers: # - t1: [1, 10, 100] # - t2: [0, 20, 200] # - t3: [1, 30, 300] # - t4: [0, 30, 300] # forces: [ack, bcast] # mac: # - lpl: [ 200 ] # - plink: [ 200 100 ] # --- # # All values must be integers. The mandatory options are: config, config.bmark, # and config.time, so the most simple description is: # config: {bmark: X, time: Y} # # If some options are not explicitly specified, but are required for the benchmarks, # the default values are used. Use the command line Java code's help to get these values. # # # See below some dummy examples for your pleasure! config: {bmark: 10, motes: 3, time: 1000, randstart: 30} --- config: {bmark: 10, time: 20, lchance: 100} mac: - lpl: [ 200 ] - plink: [ 200 100 ] --- config: {bmark: 10, time: 200, motes: 5} forces: [ack] --- config: {bmark: 10, motes: 3, time: 3000} forces: [bcast] --- config: {bmark: 15, time: 1000, randstart: 30} --- config: {bmark: 30, time: 322} timers: - t1: [1, 50, 200] - t2: [1, 500, 100] --- config: {bmark: 30, time: 1000} timers: - t1: [0, 0, 200] - t2: [0, 0, 100] forces: [bcast] mac: - plink: [ 200 100 ] --- config: {bmark: 34, time: 1000} timers: - t1: [0, 10, 100] - t2: [0, 20, 200] - t3: [0, 30, 300] forces: [ack] --- config: {bmark: 50, time: 1000} timers: - t1: [0, 10, 100] forces: [ack] --- config: {bmark: 50, time: 1000} timers: - t1: [0, 10, 100] forces: [bcast] --- config: {bmark: 53, time: 1000} forces: [ack] --- config: {bmark: 10, time: 1000} tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/batchfiles/tos_metric.yml000066400000000000000000000002201207233610700303730ustar00rootroot00000000000000config: {bmark: 10, time: 1000 } --- config: {bmark: 11, time: 1000 } --- config: {bmark: 19, time: 1000 } --- config: {bmark: 20, time: 1000 } tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/lib/000077500000000000000000000000001207233610700241505ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/lib/commons-cli-1.2.jar000066400000000000000000001046031207233610700273700ustar00rootroot00000000000000PK B^; META-INF/PK B^;0>[fMETA-INF/MANIFEST.MFMLK-. K-*ϳR03rCq,HLHU% yRKRSt*M t 4K|3+KRs<4yxPK B^;META-INF/maven/PK B^;META-INF/maven/commons-cli/PK B^;'META-INF/maven/commons-cli/commons-cli/PK B^;org/PK B^; org/apache/PK B^;org/apache/commons/PK B^;org/apache/commons/cli/PK B^;n5META-INF/maven/commons-cli/commons-cli/pom.propertiesSU((/H-*L-Rv+TO.Q06P0222T qV020*K-*ϳ53J//-LM+MJIML J* RmV%&iPK B^;gfy .META-INF/maven/commons-cli/commons-cli/pom.xmlWS6~Btvャ+'F7-i$ ޕIhZDK}Z/UJ^1U&_~|{>9QsG39+AFL3>H)}g0U++r-Op8ݎѱ`!czYqnVq|R|eq8V6;JBeV!NL;27YUQ(i<1] Qό]ߤ%GdĴ| >)2̙\WQML5)Ҟ?9İ]e`AԎB@%aĊB@nDԀ0wފ0"c.Gꅹ@t`*D1m_,Liy16 cMPtgH°/o nޚF--Y}ݼ! ȕ>kRg;,evC& &`I v ? F {2(!/oq=z7%3̊@ϟ,;2ٴ0Em#Y%/K1t L/a0$c-pc5qȍ؈Ovrۚ;y& 6t/TQt۝`AlT7NH2/pU:]LCC8f`xB˂105,'c0}0?a1WVX=F5.Fq) *m%QL%tk3UwJ^B 7Ʋ#ܭYۡ︵.CW %ͲwxAtɳycw g ^ a-hMO(a^  Dx$a>p2/J"}[l93g(50q?kW—>d0vŒFkf <ª@g-fO<0#*f=W}i٘& uHY553a  \AU2X9[32r?Gp}Y9$o[a(v%OsA4Wba4{g. DrX!C*tLsZ<q09\h@2?p*G o#䛭>p9 ɻh{6 >dADB8Tlw}EJ& %¿cqy \)nZ=LnOBAki\U&!3%YL"._iWK뮒@B&ϯݺkckQEEW 3{r kkd*D2~m`)%` ,ߤVFsGy*Yw~5 l s5niPK B^;Yl/ (org/apache/commons/cli/CommandLine.classW>2dB%`ɒlTjPh Qb7˫bI]vgP+bKVk_؇W),D-ւiֶk? Cޙl.yܹws{}epDC<8R1G561|RC7>%gT|s*>Gjx>Z/hhcbE _—W4,W5b5|]~yRSB[BѷE;hfDg*<+SC !3ϋl-^ <⤊S* f&n$l<6ArT2kIkș~?rYdqx"g T"'kn':\2 #9kf{|Tm>k2NTf"l&!dLQiݤ$*XJɉ+ON]V0I*  eMi>3+IJo62Ys`Ԕ65,3jDV.Sr\[V |SgMͅ^i`i\Xs@, ]K*rbzOsQXfưR5TYHeRZ]Veஐ(=f\c$",v9ۜI͌T$g^4G\Jr/ @%ľgW^^ jX$ku++X%&bYm܉\.Tu)٬؏Ŵ  n[Hw`&cL+mI2Q(kMEu_~ 2Kk:n9՞Zu:8 t=:nFĘk8x.FvWs>TqQ/_ἂˬ_ +z~: ?RtQWo [vb|;@𖎿frbNLGͅOȳ6~>-6nkqJ_^IZi|Y˜23ڒHAf:n}Ә{26Lv; 4aL`ٺTk~!iji1J$UU ܃bFҜY%e:JM.WN[By3ZC}I9+ ;DR ()`"5XȀƳSiŗ2RN wq; m^&KbӈIS$Ft)ˎ7Ju殐^/9X5m7?[k (峙;B᳽4uSg!v⫩j-6nC`(=|6{sYF.0KmQFFp[(#z@ˣjsT UGb䜀zyC=EgH#b6͊AWa0s e$8G^az.^apa\dz7w@w1dld  "^鷪aInñPf &忈ohʻM7!W L畚⎦NҤ,5V(5_s=_>k*FԃcgbԩzL_&)Z9{g3pD|O\DGhG=Q,B5^ϛ1,fJJR:qT钮+ÌHTڻκ}%昛ڇ$&Cv'GHDzQD"РEYU PBPDe[XwEPK B^;t&org/apache/commons/cli/GnuParser.classTMtU^2I #IR$-Hi04ęv= F7#֍;.\Ig*ir{}D/FO"8$R݅X);byZ a 5`J )8,U akQv77]7u۸4/oyenrn9 E}'b4/\/mMn:Uc{S-\˅"-ӫ20~E f8 rmnZ'zohܔ _pFbrcKH}ܮ%䑴LR,N.MlBŞ- /#KqO<8!22b ΩxSpA< .xs*Jb\V>(b+ɫ з/[4:=?'چU$@ Isk/vv~N#|b6JY!F-@Ya~v~̊TOשb+7(=z"ofoO(wJ3 C0B'OL4=2hd4}lAV~% &a92Fh`? D'h>Yy=7&)-W4)#=}Q:;i.dŷo!д-Z<=®8OhgقpOnTS`MLaCDu}bϱ}"۩^d6>Y$4hoz_>Hzt?5~m=I"IӤzB,U&=*.7X/Xo>߸-+@z2AD?I+%<5;H5*5[G<3ڤ`0nx§=UZ6ӨXQfCٛnޣ0uCuPa0 av_"aŞ}>*6h'u=2, #*rkquz-)WrJ¸SVrdc(ltb:vpt;l: }^+i|.Ѭ6_1G;`GqpB GD[{,"ȼ7Oea~GYg(vWKKXNkb$ۤTmk$Y.tg6ͳ?72\`ȿjmFX$')m,vf~PK B^;\HU\,*org/apache/commons/cli/HelpFormatter.classY |Օ%&8yH$ !Bby C2I&&83.֪ i]WQ(R]ŭ>[ujZkݶ}IϹ7_f d[7_w{ιjgܸ?Cn~O3'~Gw~į_Nqo /~ǝ߻7tO.Z~p E9͍ba7Nq1P."! 8WL"Jm[L~(S=,!#JLc27mr73b8)$pJ rf67UN1NQC =7u>wr3:iNcJelNiv>/"E\M[, !bH?HD֡d46 X\ oIk67-Y\@4XCl0 &ׅ#* Zbln\fS[iKW7Uj|uG˚6j\t/5\^G{`m9ڲ,cYj٦Ki]p=ڕ%YG:H@9NDr`9z`2-ncklkFH9@fLLIɎ {Z4v K 'cd `4P@\'5ĺHBch o鏰)cux栖Qj{CHugl`?Z/NV-k5D=!C|u.Q8Ѹ}5V'1 ßkiXLSYgrRu] tiQ\D \O*|3xRf+'VQMeVgBLT51`O4*XAk"[6egCndl8vop!tzz-'eYJK^qE%>%eQ3&[ +rUVaV{go8^4Ґf2xD{/Uŏm`E[ .)P;C޴~}ۨߟwS S0OTLξixF/!WzɌpFokFo[ZOlJsir>P^]zWC C laG< W> OЧF^ЗcvQL: r_R;jI2C+ p`3Ȃ儦TͨW_uĭ(p=3FB,&pcZr.RBeJ`ꯤ v&SVPD4 6 gsQ5frQ<-h@КgrkN Z6s ?H$+q.Sܙ, rWn l Кwr 䞜@\@> sd5,roN l 7eN؄ @6', —R >@ j}ًkr.~;(1@%ң8yciGuL,8mk2}e,Y,gZ)>LI|Ϛ6q}w;8YbYao5uc8cuv& 9BG0;#w7@# ZC2@ hf4Ac[' .2L%v!d9r"+Q4`҈r4(+pҌv, e&9en[!)Bφf[l| 4vXBVC#XtSB=HDOcb~7Jx7 cn p#3v䫦lQSQSv|iƲmq5՘Y5l⺇pqH(3ك{I_fe]XYRНrCRfa)rn K8,Lɖ\bm-0VeDf3jepY\=X+r6Q4(rwY }}8-r D9I*We·_-|QK멠`CYYPk(I𤢯Ǹz@7oL7u\xg!pJ% ƂI!kUwåO ҷTk>% OME'!3q(RPHltU!J4rRKiH-!CU>$ԧSAzꑴ2)DOi+Ζv?/ebU@3PK B^;5org/apache/commons/cli/MissingArgumentException.classRn@=Bh˭!n8 xRABJ*Uݸb;$H|M[Bs_5簨i5jX²B7 XScEm-2 Z(]>ޑp(0qtu*}"Cn0ݷw<ݝ4e<lW08~ЧLycEɄ4-$ļ@DDp?cp°lы2[E]d؉'^H9ܚcb Z{:DNPXzQl2a1*8VxD+j, DxȰGH-xҸ_ s$ ݯQ鯪O 022a( ۠|V>*"E#ڨ 0dhr,\po(QnTFvFhAt~2C7h)%X|++Z(:QxLe͌ F/PK B^;yO3org/apache/commons/cli/MissingOptionException.classTRA=Y%.I6^QAP (%>-aK%YXojr*?o{6+Vsw7&Iaz2}!KeBknI-w$@aP0,֑0.csiԆKS3ԍEӥX979}޵p|!8nrYRa J5eeabAwݤBzʲsid׹ *g󦞮T4C:B8F;)]hkq7}j,^}Ƭ 試;jpY#۔0]HٔmõDLJvO1]߼_TЁNWѣ cY6S2m<*x ``1'aRS/UUFNB7}Ĉ Oc'{vhKh` W8!#0j@G#+xÇaOW@m3,xPJE(%! >@RQ;hXTE,kdH'fxn&4//Mm?Glg) |,})UC1^:(?IbPK B^;;NY #org/apache/commons/cli/Option.classX |Sۤ -  QmҪ "/--J 0@Krܘt>csD9Dg[Z7M{ޛ%νI[gy~g>jI4@8ē1£9Cw$Onx_I~QnfoTxGo;~ɇ?)IhɍzLq@e2Z*QKt/A}ݝݝ:"[0qg;C#]tl[GʌtV&Sۥ&@ko6H ,%@o@6 Tt3Id?Kd)B\גm5ܡgzif xXM=;v,i*nk7M$[# ֞&D"JdW 44yJFnHsU$һMIi%l5B'O%"FfUKkѸ5 h2#}$k.rbWF[TLѲRz/kl$4[M޷I 2c)h<9@""E.1dSj/dq\'$Ƭ3IZvdN&mi,z'+h0cv&VϚv6veմ,[2Z0A$Y=0&٥;Z,&wO72genEW=њz~!&6:y|K}\2/rR^:شՍҡJg*Scpְ~D r 4'HEaGN{yF7,Jeu4eRHL;t\:mdz9lG4kI? 3COgk2Q +[M9Hps7G23b=R kkd݌-U9=L^nT&RlV}*6pOllU0v}.M ꎯT{?w{[$ҳiMFZ>حc>GY8Z&x iR)#$|2oI2;؟K&[p},n"ȩ\B(kպ A5hEYPeC*BVre8˃@`x,jY{9'|/P_ŭ ÝHXbq%ڂo/`61.ت N𾔙ITMH~vC\48gF,0D*SLS`[Ѥf4F.e2 iLmrDb-1f> X40Z{&q|l3e$ |_DE'_mR1jIĬ|>26*f9nUJ F<tԐ\ "fHE!/KN&.\0N!L) zuY|Yօ㝚R(o:u|\Ɉ9OY7T:B⎐t%![r7~wi[VH5HjI݃++j'%Vz1ՐK#\]jH v?T"xYm.sESJW.wig0.a ҝEf8(8⼞_v[ 6 `J޺7YSKeIVbYeѷ SKʸB~:ЗO8IR=.t/N;MG#fj G0V _Z7Xq#"]FŸfև]t܋vV c֪zV,"c1[@Nl?`n(\V?9#{܈qgٴ^ 8U܋q?f!44#X"*82 9w>My÷hJʵ+ `+JLyA F^r8>:拗"^.±Qj+3VGc0Ʊ ZQ:9t_Y](8{"oZZ'3g`(u5Ly.P)W=PUKח#\ØcwoGʴ"&/ew=7;{#hWkcM0B0hɺ5a&y/*5 yv0Z"ixT[Pd/V "9QRcQeVҀJ JBqr"NQ]Y3z*˱]Y~TdոX( e<;sb%eJ.-v+ j-(&'/' ocX0bwѓoBk2TLP,-THO>e3 XhXDM xQjNj|'mIySv",l2`)S͎[VZ9 ]1`|+)LU V( m7wXVq A ePU>;WP+rےZ2R._3+Q\Y?}q왋pWS/n۶cd@ͬ\I %cWUv=kNAۣ%cG.L˒+PK B^;$ڠ *org/apache/commons/cli/OptionBuilder.classVKoW3c2ĉ!gCx:-^ 8I!44)&ęfl .(T"En[uI .;|q{??/3q%x3IxKR-5)KqC S4R:W3RX!̆\楸)EF)RKq+Gz_ \(KΛD̦EΦ 4Xcv.KcI @رnlǚSF0m9cg4AŐVcV(Qs МXL*Xy:f6EɜNy35g%R\HeĘ/ٙ!`œ =֨9QRfftlnj9I7:́}hZsIveLvXٶt֛+ ΙUo<^7@g|n[ҲJvIŤńl7sdC4CjbUUPDhX- OVVaeE*ϡ;tW`l-g#r,H۝mJ>x'e-fæۡ1csM}|\}hr_eakQ yeqzCuUkڪUD"Jb4jxI} v ,mB^&_Ƈ捦mzu_DEφ|^8 )$ĪS;(瘎`rn e2~nڱxNA8S~䏣 ͮ;JN:J@cb "qKY@7)>-$Ӕ=!uY¨11;'b04e<--sl%un.rGQq N>ŋ\/)^[RJ7Ej ZX2\xS#x5S&V~TOЗe ܡdWdEWr:ʠN /8UQK$^R0ОZˎnyҷd Mh⡆4&5d0= ' i乙v5ri0Ҝ,ET}bQqFG4f%{$Цa5$dnrrabGqdQ rTG ˯ T͍iXy u' 3"gԠ/ ko=cJ=iȵ7Qڲi$`@AȞ]fUa8ϸ"FG]V)Ҍt]rl>\"LRpQ!J: z+d>e w c{P6й}v*8ZE.F.m16 tv j\?'w`x0]yX8$Mf,ʴ~OC$$F*m0v*q^щ"˅*a!ǿ9m!~s-m(O5%~qSzPqP؋:3DPK B^;O~>$org/apache/commons/cli/Options.classWkwWW,[NY5ԩ#9I m㶐yU,;Kc{YGЖ7}q>ł`ZV,kιw=}=ww];0T>̴s%'Y 0ڪ+ alC8(JA#$ᬆħT>gX/w/Q9<&eq9|I_z_ t۾oH+ߔTb&[2!<#'φm^\شl:~H㨎K|1:?R s:~WtK:*q'4\ֱ+%~-k-e,|n# <jI6`zb̈́WKQwpiwX6ۯ|QcaxZ= ˸Lq.N2l@^=]VQw4vtP;[8µVpmJn~!9S]P.oajV>kIO^!:꘳iS* dm+i֤aZ_p/`V +QB71v?/z^渟At~l!zF#$g C8=J?wq~볔'!Vt 캊ң㆚+mJ![GHGHq FIH$֍cuфvސ7&yGU J'<6<^d^f_UŪ~y`lu؄pɧ; v77<K,[,[ ]nY,'=CIבdy;uy. y3%G"Q=U^n|}m~.rD \@ZSIz= d\}. ]f^g3V_Js;VT"XBRABť`9P 5799}xf!嚵Xc:OТ tZvgk PK B^;y E#org/apache/commons/cli/Parser.classW |[U6MһvK#݋1uPf7ƺ^v.kIHҹ i("E V&2ED Dy""ݛfir9~}G>x/bga/yq "Η"{᫸!a5!I׽(|CͲMn[UXoCb{÷p!;{2%^paؙ;x'6p 5E7P]+F5!kEf,4j7fQ(.Ja݇PODH)D8VCrY#t9AeZ0cF""œOĤ$[kUf“l6sw0%CA5!}0挤ˆ2U8>Úp"iq'u\s1>ChC( 6y3~c=X[?x/x JGQˢpf{:'p8)^'xM_jL?':[:\v𶎿 O]/x_#|AYJW9xCad跙q]-9bE5[Wԕ /2ø,-;FiytaMyt5*OԌ,>խr*mu8f"2pdpڸQP]6.):4F몀Tc%|R*TE*U cKqa: 7l21e#{H3ܜ4rԝFB!Z"/ai dtA]^XMքu9[~!@4bkcu23* 5Ee}U&Áo]Q}qYĬzSYu'X"6RvÕŶ&>Yʇ=a4,̆I"RKsmԤIO.pr6F=(!6ȢEӭ؊(.~,f",EX}NYN3= ,4!iCF;%Z0 M޻1sK0E&כH0hmmbF0銮HBOvFeDf8U413=E 7BP-Ԥi,QwlpeyZiJ2S  vʏ9'v>=WsUçYjEڜu@+9S+᳸rr*#2 ^8uTX>MN"̶،)2+ b۽ȹ{md,̵̮Ckpx Z,[SQYr Zm b񤜑YLrlShwįxGJ|u6-6e&1P,TiE9DQV{^ư8p۵WeZߕĘ#+HO={ܹ÷"ªbGEP,<}(HͯaOfljH_ Tg/6& q}|/ݾIvcLmjR|$Π\w$&(-<.;QhFEZ=-.;T3*B}Seh2 ;Y `*ʼnܝ0=Xq:nBnfo!o#nGwB܉˰;pД>܊<ţxF^Sx=~лor+?^P%5/xEU Y/SM&<$_!􃈳8K3289ٛ™~=M8Pzڻ۠e!W{U=eiCp&- 9Č&0}b6J9Y䣌$ʻq<+n=dL嵮^LUrV&jRR3X%#y-tTz|ߦwPQ0G)DrEyЪqiV}K\ŤPV*ΤaP$A (eE^Y.2\Z3];HGRI,%ԺaӇWs[eU9tUIWgtSJEo73PbiJ%gR7JSe9oOUXۋ}ZGz{d^q||uZ+da6# Z UǦt: BT ajdZ@5N5Aj%ZlPsiz)Qw0XH5`eBY9OS;+iLޏc$NӒ8LL An$92xra\.z$wBILՀJbIG] bڌralv Q|u)z9TWu5z+xut\a!`W:dp%è2;U!3G 拖eWPK B^;H 1org/apache/commons/cli/PatternOptionBuilder.classVwUMBC1hSHAAR6T K5͖FEZ|LPxG?QgnڤT?ܙΝ;w^35܋u!E%Ƙ>1|؋'8{Pwtg%11%RңHJd6J=y_O@Qn- Ցhw<^>d3:R_dwN0nZzfR5Guc4L(Nz:NiFtOVKsѨj)j4 !U$%IX92Pj_!a]ĄMז(EG `V3:xB-?0KиN+3Vk;b6 Ms7b]ϦGz'-4א]tfo\ ժV]xOI%DBìJLJa膌m>>q;niY&똬gɝL6ppJi!.d|ecrɘ"* v GWFלM+26ΐVVq5""22|5cN#mt[F'ZnU>}?Z~KiJnĔqODf軭D~gAY΢e73Gͤ9}\I6كI%m|vxL ifrPpgF &c=Dedn 0,05E}q l~|F# RWLR&U&m-ˤ2)R"9$KīZ.-}Tn[ >C]n`&0%:iGm^:>G6?m_u17--/jZ2EӪ(]yeëHT(N@A(`OpWn6>D4h(ڡLU 1am25ߊ|]9|[r|-9|<rLQ՜<<_rs`"윯r]Q_r 簷_u K;ip }9n9 X6>Ӹ;;Ic(~Cay_EM-]OIH<P+FƗ[x oxSy_iA 汊J 1l! XG "x :**jM4Askav Iˆ(#PK B^;ﲊ (org/apache/commons/cli/PosixParser.classVkl=^Y&Kb}@@ 4ޅچzlwYy y>EHe*GUDj_3ή ,AΜ{ss_37qdE8Z il?Ď8QanǏ?p {)bDD>QXrnLq9%٤ąnG,= NF)d`>=/JjFp{`sG W+KCTaU'Z:`]WNVܩp 4=;ҳh;€vs ?c $:`,^SEh2>bSdk\J"qT fMay69Oۂ<}N$T1b צ"U*H_ ŵ̉-Qn =Uq!lJ; 7{sscHQhmЃ >HJX_/QCp}$^|7I^^xic//p,5:NIjl,EJaEFS6Hۖ@[fl%ʯp7 ڔ߁qF&[Ĭ#˅  ɽt7%q|vQ櫎DGL>Ua\I/.Ō KG 4ZؿZ{%oEy,g5 yR&LHhZW,Ɗq *]z9,w?H?1%_V5` ʧKot8 +>Fs rlb4h,vXīct_Rō!yu\]Os+T.4JZ0g;#jtk2[q|Ŀar6(U+J*O)Վ# /nZ oY92NǃD ld aaa0MPK B^;24T(org/apache/commons/cli/TypeHandler.classVYsU:BHHe2ȆI$jg'0gzW}E%RVL|NOgҙLj={s=ǟ܀4l5CxXC"EJdiLq,&D:$MJ""9ʐV񈊌q W45㈀8&!iSN3ܭ9vx6NrGX: _ T|-7 -:M6l.v2KCP Z醭tʜ4mxۂiລPsY/L3|eW͋-gb@P'}m{: ޡ١ֱksvP50PXj;u l d=+ UW*tڴ-`օ\'?`md!RVB\(ܡ1^mTS 3.ޅѾ$Hwc`D%qT),T@*мwpױځ']爦ҕAT9u⧪'M銋+kl>pOgk*ϱ}aj8Toiݸk\gЂ¤CifK;"hE/,VkhسŹ Vb,H1 />'%2R1t7Uv &뛯`O d[5dI'.#h'ӬuEeԷ^hd>>f"h°E"gnh`vb KUPK B^;Wi=!org/apache/commons/cli/Util.class}Rn@=8\RR%H<!UZ^9[9vd;H|J^(Ĭk",Μ3;׷c*6MlUm울cbOw+hUpT*}P; QI@t<+S+F:R Csž#&IǍ(L7PT I@ Oϓ )m'"c:!RFZPsaB供F$q4]Bi+ZNOWp Cۭ྅h[xBui,M$oқ1eee;0h/`_):rnFֺ<5ܠDyX@]za9Vy`P"CB 61rb&zh'' =Fޘ{c+ 5^ԐesRs%i/0Vu7PK B^; AMETA-INF/PK B^;0>[f+META-INF/MANIFEST.MFPK B^;AMETA-INF/maven/PK B^;AMETA-INF/maven/commons-cli/PK B^;'AMETA-INF/maven/commons-cli/commons-cli/PK B^;Acorg/PK B^; Aorg/apache/PK B^;Aorg/apache/commons/PK B^;Aorg/apache/commons/cli/PK B^;n5META-INF/maven/commons-cli/commons-cli/pom.propertiesPK B^;gfy .META-INF/maven/commons-cli/commons-cli/pom.xmlPK B^;Dbn5org/apache/commons/cli/AlreadySelectedException.classPK B^;^EP(t org/apache/commons/cli/BasicParser.classPK B^;Yl/ ( org/apache/commons/cli/CommandLine.classPK B^;2xҔ.torg/apache/commons/cli/CommandLineParser.classPK B^;t&org/apache/commons/cli/GnuParser.classPK B^;C`,org/apache/commons/cli/HelpFormatter$1.classPK B^;WT#a;lorg/apache/commons/cli/HelpFormatter$OptionComparator.classPK B^;\HU\,*org/apache/commons/cli/HelpFormatter.classPK B^;51org/apache/commons/cli/MissingArgumentException.classPK B^;yO33org/apache/commons/cli/MissingOptionException.classPK B^;;NY #7org/apache/commons/cli/Option.classPK B^;$ڠ *Corg/apache/commons/cli/OptionBuilder.classPK B^;8mn (Iorg/apache/commons/cli/OptionGroup.classPK B^;$_,Norg/apache/commons/cli/OptionValidator.classPK B^;O~>$Rorg/apache/commons/cli/Options.classPK B^;3&|+Yorg/apache/commons/cli/ParseException.classPK B^;y E#Zorg/apache/commons/cli/Parser.classPK B^;H 1forg/apache/commons/cli/PatternOptionBuilder.classPK B^;ﲊ (#morg/apache/commons/cli/PosixParser.classPK B^;24T($torg/apache/commons/cli/TypeHandler.classPK B^;ut8zorg/apache/commons/cli/UnrecognizedOptionException.classPK B^;Wi=!|org/apache/commons/cli/Util.classPK!! ~tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/lib/snakeyaml-1.7.jar000066400000000000000000007567701207233610700271630ustar00rootroot00000000000000PK  = META-INF/PK  =R8cf|META-INF/MANIFEST.MFMLK-. K-*ϳR03r,J,K-BV+$xRKRSt* 3R|RxJ3sJe]lz񆖼\\PK  =com/PK  = com/google/PK  =com/google/gdata/PK  =com/google/gdata/util/PK  =com/google/gdata/util/common/PK  ="com/google/gdata/util/common/base/PK  =org/PK  = org/yaml/PK  =org/yaml/snakeyaml/PK  =org/yaml/snakeyaml/events/PK  = org/yaml/snakeyaml/introspector/PK  =org/yaml/snakeyaml/constructor/PK  =org/yaml/snakeyaml/composer/PK  =org/yaml/snakeyaml/parser/PK  =org/yaml/snakeyaml/nodes/PK  =org/yaml/snakeyaml/error/PK  =org/yaml/snakeyaml/reader/PK  =org/yaml/snakeyaml/tokens/PK  =org/yaml/snakeyaml/scanner/PK  =org/yaml/snakeyaml/resolver/PK  =org/yaml/snakeyaml/serializer/PK  =org/yaml/snakeyaml/emitter/PK  =org/yaml/snakeyaml/util/PK  =org/yaml/snakeyaml/representer/PK  =;/com/google/gdata/util/common/base/Escaper.classeA0E ȆƵ+2q JiHi x(c!&b$/o?_=+Bv7]*~LsXҨCT<64ϵ'go<ǬOc^2!fZ%SwNa+)܂@0Lfq= PK  =ညV6com/google/gdata/util/common/base/PercentEscaper.classVipSX0!JXlK28 DԂ1M:aT~Z4!mЖ ItJHc.326tiڸ}0ft<˹|gO{*e8s`a;wB.ρ(A'4r!!U*CLLXc؉:̐sJi9s cG֎@M, ltul_ %Uc(etchͩFnknM!/p<vmQ쾞@$lu;"e:}ݑM1W:v2D3նsZ.+(놞[+Px- (AWm +?G{v*&] B%Љ|s<5JZhhPͩ|NO(N=jV ukf"ٸ2 YdבP3p3b%|gb$ g 5Y)DWԹ#9rdԃ|]eh#"QcP_LĴ}y͈k&"[}͔$E3I3tGUm9V,,pǓYeTe\ۥņbV-j Kvp"LjCj2K)r' ՠ8}qYe 3Y|jz0kanƠ/H哃>#|H:\/^]u}.ҪU`[4HhX)wE.[,Mh%).ԅXB-.Q;z]Te|x'9pI<ŲoY|E]mw߳2cCS[2dT4QK#Ʀ{W-ZҼz RQкUT~erƪT7rSuޛvȥJWi45`;͞1vf(y98q x88ᯛ؍Q$ 9g)1gY3X@qXMk䯫5ij٬{RzRJ-NPCر0Q&ogb6z9M9E@B jOϡ)P*fAF%T^eQV<۳(?^bn'xϳ^`/AhI%JWbYY b(WJ@L<˽$Gǜ,~yVsL_\KL*.L6Yx"9 dͷyaYVt[!ۮI A}q[`V)gQXywFaGǰvź^lZHk_"\ζO}M&GQzu;#(R`\]c&b1"Pݓ4p }mcx*yrs9m=/˨y?f|,%6x}uo6P,hr}/2ޟ "al~>%ߕ_5ߊ` s7po"~ς?ӟgZ'oq6_1 ;.QK фwEB]'"6a"Ta)a]8"Q.N 8%*gK%l,ߗquroeDARj o6b}[̶j+֝w%xo%0#4;*PK  =MVA{u8com/google/gdata/util/common/base/UnicodeEscaper$2.classQN@KX"ф !(4.ɹȹC~]Ѐ%H|bIά.6\8XvJ %1VC08-ӗ <dt%z!!U"H $3rZcIȾ BɃHOrBGF%'vmEY0naVP_O\TIs jIv[Gt/MD }wnk?4L_z+,aaؤs`<x:NYd잚i?L}eLi]g"nNyυ/X=wL_m=X"j1A,mL}PK  =W! 8com/google/gdata/util/common/base/UnicodeEscaper$1.classVoeٝvza֖mejme*"RE Tjq;0E~y0c1&ML4H b41gsfzEd7?~|P$ʲ/0,25*ԁ()c*EQ,Gd9ED(x= /F2DYYLD`qy?bR!,v;H\vk(G F)^nu9U:t\?g,.fKbEGaw¬t'l;-#S,讞acgM1X%,[Ltvn_!=@P,Fh2mcour(?)gؐ׭zٔ9")5ٶQZzb0gmu?'<7J%NR#OՄ,u1砗+o0_"-e_f.U#59e ͋E7~}r3p[=drjv2|T֥e(%ka~ѝ" Ku9!%[O`AϫѬ 9jPG|, l 8tqu|7u KoӭwӖMe\sy5֤6*[gXMdYͬTK%ːոRdsJɬ,0.P[(e xȁf}o狀!~zЋcjA tҳC?. -FIޯ?iձyďœÃsN!칄0a7 fbV_pΜPa>_jxo8Ƽ:֍u)qsƕP;(Oĕs ]B$p<|uceD.~lZa f<?""Af]Xg\;.]B<~XuΠUBz⡸r w(8ȧ!`GPCPgu_h^X Hu4P#k(4`bp(R&)ɗ{u#J JKW3eڀi#~>\;=?h G7m:N4u v ` w{(cS_m+5€8ǘ * m I4Qۙ rM2\/ty!@] XOt^=Wy~:&j1cwyԧ밸>[Nಱbw!ƙDv1@FFXh /a#x+51K}-r_{Kszғf>Gq7SO;\s՛M~4};&&dC%+y_ES aІǽF/8B[h0ywa oSQ>MzPK  =N6com/google/gdata/util/common/base/UnicodeEscaper.classW}pTWۼ,6l]B Ɇ6ŠaIu%v6//6oZ;UKj46H?Mnj:33o7a{=s=wλWaXA !`ȉe^ *9 ,2(pXAF!{Tψg#2>`e<_cxto [_×d|Y* 1U O51?11?e|Ç4aT7| ߖVa踌|;!AJHX>5[h ##ᮞaږUL[\JvHLC &aq❔iT-K3mv:4_wnvWS> x.MmztCU^!,!ۧXn{H$r#m\.2iV m#w$g ֶSTmԼf%j[jbFm"%KΦ;LܦkQ[H* gnFs@k+) TQpZ"[>;,}ffp쾢v}M.XN ^>fVN|ZT`#\Yot%yq%Ntu>.mkh%%h˹#sqpAEFc4虂: OBLP[=q{rj8SAE A7:0:i2@G/:P‡;nC}Sn)xE[\)x;á[&Pm OA~cť'i)ǝhQa|ރ:t%.>G +XK ?oӝBlqbWb4o 9,EU_?%עAa]G:cAOw?Իqp(_U3,V!o ˜1l.fP yFyqn`XXcXOMr'ƱԱsl 9sgݮg[< gT&Ql |q^ /2ire~(x8~'#qyg9%~I[\_5o-9<,cVE+Jڃ$)w'ӗGыۄ>oc>`AP;,x w_瀹~R^zؕ(ԡ9e-?E,VM#xm}іiu+#/ fųޅ >I!*Z6 QT q6<&IQG}@s V2Cph`xd=`P‚O b{O 2))Q{H5Zru Ir@4ocAz8IJ:Fi ҳX/ctۤ!KzNt6ޛ!3x*)Q`[CtZRK 7=PuXIraIWe]$ 5g)ͱ&."2m|S#OAvJ]P3VFr%Dw˥rYyJQkuF߿PK  =ApZ+org/yaml/snakeyaml/Yaml$EventIterable.classSMo@}c'um$-%|CSHJ^*"Ep(ā&m]N+8 uvJ)Bvf{3>;gx袂;x`02,N}q$q W]FƉ$,wE+Za4u H&ۡHSǏ&h]c$/^sdf{N6J^haiZNyͶy||yr3C61O3$NT` *|1 ʀw: D3_ /R-",$n঱ w~9PK  =:(Ӕ)org/yaml/snakeyaml/Yaml.classX xT>'K^^$$!h̄aP@[$  |Iap23Lh}ѶZZ7,$j\jj[[ۺխjݴu9y3/5ߗw{{}{׽{ +s >/+~Z.~$o( ^?wB*/ xށw1Aw f)阣` 0PPQ0_X` Xj,VaN"Kq2?(X` MX+Xf*tgІ VTPM~jORa;Tp <%*SXs p.<[;];OUЃPnN4%2p؈5x܈HBɟ1# 7bs# a|CF[rGSK@H` #x"ߝ|C"F 3,bN~9'[h}D !,/jL[ ٞdW#y aRs0lumJ#zh oeNboU g|8 s3g,˳`$^UIQ Kĥhh i|[JWCMƦO $bs l]nM\6!/ 7SX-C%ss)mc[cY}zluxСVRf{hSŖIIȄ:wˉkl&Y6pe EXޤ߹FCP<C &B?L8a q[>,MiP޺0[sED0{Pdp5 CP $%JL-n%[nf-ږGmˣCX>HU ÜNJ-~ߝpjtxwajx[,d@)p#U6*>H.[+|s7fe[ JKx9~KW|ýԿϡV\J?JʏͱOP.zu#..`:Gm*%BGYXmөgIm-H#SGG<-k0@{ f |jVʺDsRLәiŇ{FIhS=:㾣XjY2,es$"I=Kv5ʻ >'ll=*vR\Mk{e.GEb'\CV%po]G+τhEhF]3!XBm)e:na}R[̃)[GJo$e3`2-/A7|+#% mi $ˈI91?8vf yd3b㧰B!N|s+1y`|b, 4c4a"`* (M۰_VxVx=cA=<鈭챽Ydvlb4ضtzCJmݜ\!*P Gptt,:ukoӻ#gYsu8溕bp]{߁c|en.8Luږ&PfB[U!C*UZZJbSAKJj3갣̵ &.|7dzfVy\\Ԥ[v7=γ-7+NI_H-ð]dʜ9g LƇ`:>cʚtZ%}Ge{v|Xv[vV*:̢ꉻIM:/C! N~hZ7K̲靝v{P<Sj$=7 (7]j{Pc@4.1MՍ.}m8BUb)Xze_Ccn%R}eʇҬ&?s~ =Ԯ:nZ&jP̿n6~J\J+PK  =BXav!org/yaml/snakeyaml/Loader$3.classS[OA-jk(rB[-!T0$66/H57Q3lms|s曳~ `{Ѓ L(ILo"Ii f&3V=a{H+%WWOH+t\{5>=ҽZ~Mpљ"k8R^y,X W,1l {{+V7US'Wk  >p ͝>)C, i= H$dz_ =CBk.dѢh Ed6D]/b"+}$bizFyO@l2yV:BrNk!h ܂~܎iɪ\r7~H}D*sSᄉn fZ̈)᠃:qWd7"o".FCQGa7utO?PK  = ra0org/yaml/snakeyaml/DumperOptions$LineBreak.classT[SF˖,%J5-PJmsq čiH&Ȓ#˙igѾ4$L;;ڞ84Þ=|;՟?}`0\"&D\1 _>7DdeH.a oM~)c m Q y~xw%Jo0&k0neYW]eP2;V5픒{ZL,mWvꕪlT]öj E» lgnV͖ZԬR2:U"kq|k9cYͬs~XCWazRНZaH^e,9#V!Z2,M1ɴ E= 猒u`ηcI bv\aA7LݱJ:L,KqIEeؠ͙!SMD׬ze)b S/)]&| MM~(*Hb[;[˺R7m6izFs]FQ0yb^͵%`(x1e0a #sDzz`NW!X4mKomF]0>d$91/R_-XR3  HC ևԸ爫?PR]_.@,Pzh D(}xi )~Hie\y! p18\k4M4eƿ/ EGGgnL[y={vW   {5 Đ{1c^ft\d;_%l Gt  ZD@+Jn\3қqz]WI=NZevQ]ܢO04F6IdKȶ?cTeEzF{ZW5Ol(P-Hyە7yݱɥ2lԂn%HhVLUN]ϒR:)(& vŵG?=z"c:5Ckk9]DBL KULiBͺjuQ5dBÓD5/̙Hউ]MڴBvǘc$cwv-慦RL8m ppD?M aPUH٩]ѹG:~tmM>w&nZ(yNԢS oX<0iStNSX:[l^xwaOcbAyC;}OMm9O5oPIj0x০WPHZEWr= ~pnjcp5N& d˙#K{TZ$>6'ըJ0gA8eMHJ0 /2J"Sl< sM6)fi)zӘ%&ڔ[ɟ¸PK  =|v7?'org/yaml/snakeyaml/JavaBeanParser.classToP= DOl٤Ř $QMF| vdJq&~?i)As;~.rXă PeȰ-N32ex 1vO0toFpڼcRfEl"ySJ%RU^_4cְNYQUB_lgɵnPooL a ψԘpw/l[(ϴ[Љtp6cKPK  =qEY 'org/yaml/snakeyaml/JavaBeanLoader.classVkSF= EN@)I-ԅRMY:Jrɯj;-cf:+)~>X9ݻ0 װ)c[Ǘ2Bؖ##dHkaJؓFX,9 2F-<÷0-meWQYܵX&P0 '0 B^ ^m1,s9~Za(c|zTvN+if8cZP 1'Csp;}G{q̸R4CNybk&/Un*[NG\c[c; U]畊[-P3]d5e2+].zæcZ̒^ֈ_ W:DR[ƁQ25jS3쒨nG(\LILGVqϬfHֱ o+ aJ"$b'0DB qcXy\uɵ`b 3\BL5m@H;:WTn"*g-C4Hk#-|I̊S jȢM/:f[E'ZcziyqA08 (IJE t r Wp( %[ Ě9:j anE>T^V\.} mlndr 1AǙwD´ͱx UoY$= b1~r[n Yi| ),g;׺!nWx%=yFYH$7#zʮcE1H׺)&[qŨ|CD 7?c% sL`‚EBpU mAtJ苶3T*B ky$!_s}y4 B-h Z(WЌܐpOQXGJN=*:H u$&x"XoZXl:DJ}%紺}UZ؄l=誦Xcses^a<2`V,<'sFw4f<PK  =N42org/yaml/snakeyaml/events/SequenceStartEvent.classRMo1}lMHRBK4~Ъ+AHAD \R1ۍB\?;U+Byf=?~~6ZXQ#*GfX tRt1cFb'!iLlœ4_|Ǒu@qOfJW40|;Et {iS$ȷCCIIX VEȦOQ7 UJ.V:au7/uo-wtd.\bQ:=B4H$dg[{#M(v seE-MЮYBa?gz3"* > ߺCLI⏞nGd =vYz\5fx.  ^UP3r(,r?0V(5\wqLγ/l}t.";c⹀2na3Xqۨ:PK  =J;+org/yaml/snakeyaml/events/ScalarEvent.classT[OA=nm] XE "0I8MY]d%}AD?} Ɨ]go?\z]/7yvQ3p&ytL*,`KZ(ri'wVTlߐv1kmݶ*+-T)BݑoM kn$ޱ˽+prXχ*US9h>$MVΒeS-enXTH{I*[jL*f#jM T."{@hty'2٠^G|!3iɟŝQgei'UVU4يc)[&w(_9K"0p@\k9kq]:}6#I7p t3:Ԛ=hXXR40AڝO[i>*QiLc@ lsRtĝawE%{&kT7oPK  =Б4org/yaml/snakeyaml/events/CollectionStartEvent.classSNQ=d-_VAKaoLH0)!.bx $>qf[UbL3s;3Ǘo气A/i\fM) h63|ax,&-rW*rڂ@ʩN Ķ@뿫G-!][zDH,:<8*t.fɺk58 LGZ54©o<}!kr eI34ӿБ9sSt9z %h 4&$w9X[wU!b-DE%3|[E'7?#LH"tZaa.,HDYA$OҋzgΫ&oR6̯>Ed@^46Mwo؂]a&j`c10զ].[2Pulhxnț2p[Jz@RX$ Eide5%v!lҖ1̥Y$Z3 tR@ELMU7* .Ɋ :IkJeN2(J5 SI&IN!4$Y(ä% )dAw d@9@<܂i!B/ /:#~,&iq7zC`X;p(> ]쀆|J? )Y-HP Dbi- e[B8tN:(I_il"A %p$VPK  =9f1org/yaml/snakeyaml/events/MappingStartEvent.classSrR1=@UmV,h8Jud] >&ƍnqQ7:C}{K~CU q;:!Hi<&L6;oűhDB*=lFzcEXC鑴+a >3&B7A $a=KZGY꘾Un} X$f1&&]N"1$,8R}GŮSNXcJ=rso"Ls<R*Q幽C(8lgM*B_؄|پ|m;d-.V8]-E(Bl99||ݗ9;I6 I=CedKy0N u)2﷦E2ń!7ұO٘+%$JqC(96Yx+ %|x+pWլ>[[Ӯ֧|*HKeiqd-ӯt;bU K$۠hblX?h}G+̒mPX%mE킏ۤS%=xe&C XFv,PK  =홄 /org/yaml/snakeyaml/events/MappingEndEvent.classSJA}i׸19"J^ڤֱGzFҋ?J(W^5=o/ֱ41)0%0MHmhMJ#[yC#/T)k[ޓҡ\8"xՠ m割p#hJHZϤPF(d+mNwLk%*tIBVС,zl՗aX߫%ăJرKݠ 6ծvmv.od=He1QBK VWH .0OX쬘 )ɏ} [OQIbXz=ƀ^>3lY!BF 8=G;Om] w/Mc68AIj@U>BYztN2Ӣ?j]w(g)T;fHxK7gkqW7PK  =h(org/yaml/snakeyaml/events/Event$ID.classTmOP~uE&xQ6P&*)jdeVvvߣ3/񜻫h6y>s{积 ױh` XfX11d&oH121\4fmb1撉q&2Ld й{..^wi-][עx'w \)]\k**BDCo4D`/_z4J([ԩ_q_5ݠSV-4BWT-~V#TZ/8Fx&{}]^醏ĦO+̵T\\l/UH-泇S6DqRYDe_Yy/ E7yuF3L gfu0.- +uZ4ũlLG;i-Iy<1YC8cc!0fecg0dqFÑ}]k֗qm[iPJ޹Ðo~q b(N+UW`*a _?C/ҥKawJ%őR$ )JcJ+E_wLT'mϤTT HLYo٢P9BS6Z8zr "ZLZpC{g $FǼk8-=b PK  =Ħut.org/yaml/snakeyaml/events/StreamEndEvent.classR]KA=fiV ~Eҳ֋Co;Ԧ*꥗z z;"ܯ3;ܟ߯og8Avkѱ9l˻`*PyAŵy_ґ.9bA9`H,[܎]!xw@dAKKœ=Z.Ci&X؞[i{Ra6*2D]KO5d8A`Ccl`4m[ڀ ٓ ƹfZW,&Cn4CdO\[jANXB> Eӝ!;_}䔗"LkNL[I0YT>{tY#JQO@HJM 5X T~B M#üOql MU~ I_ְ~PK  = >*org/yaml/snakeyaml/events/AliasEvent.classRN1=W|5H@taBձtFH7ntc𣌷vޞ{r}}{~4L0IS.;RhR;j{HK.n_ r}-`pAK0jRSO`-hr4ЉdȰPQ|}$bV$SYFiEtL&f&ދIJ;5(*{T%kԮL(d#'K'M +"DRKo|g6W7Y$f1W_ě[YUGgW cϘo`M`:ZP *Dxb /PK  =5&z2org/yaml/snakeyaml/events/DocumentStartEvent.classT]OA=v)l*" @VT䡄HH/%3=cy?,d#̪b-Yx)b`r0`y=t <`Ʈ1 &XK nܒaHX]d(FfQ"^b्PzΑ;Qqrx-f%*W.7Ft-W &g~q䬆>FxMq4zS{(`7-qtp"/%{8xtR2Q?q['T(EVzK ]z YxJ{}+E4ݽvIt&5!v&/cM6–lu3zq fNCxfYa#gce)&zfX;'CWB^%J(r; k "MxÄ| 7+ՙ`cyT>UǼNkGSh-A4n9Q E \@=T\ɪ,ulv*¥?]G*73o|h~ 6ec*'T%*Fx5HQt*q%XZ$NuJΜA{#IXD~+cC ? z{v.U>IEt83%t,:75 9M| nHVwTcmKI"^,Lr[._Hїmv u6&|{Ae<PUBxJA؜(a?\C"=>Hoe\F*{Pj^,o `/,s-:tcڪ"~uVd-+4a wwmp?s/rAW V9mU4PK  ="G;e0org/yaml/snakeyaml/introspector/BeanAccess.classSmOP~֭]){c "6^T>AM I$åYZm$+(EG$&9ϹeyTTu$"̪N5Q!#!+#%u[= V]u α{Ah>s_mdլm_;hkj k/#rt|aLrR;c'lcN)7=F/tfa.Y+wCW;(>8";Mn0}M{o\8p>CbEB۲!<8$Covv]7'.x L3Om`O Ф6&4Cl:-$!/T?>!f1I'$2+3C>='F$0C"yGD.@MqBs D׉)(O]B-Ư2ސ4JW/?\]d"4ܗKD(v tE20b2(:SRhbL6~S&-ȰH'PK  =+ 3org/yaml/snakeyaml/introspector/PropertyUtils.classX xTofy@ (ĐdШ!RYk % "1<ތo&BUk֥jij%1Ң֖.jW/vof}o2LL"}w9 G^}ا~`_)Z9\Skq]/ rQMX$ŏ[>?n~Sp3AyC~܉pχ{|II}wO)xçAy'gg<u'`b(pPU9? 'p҇_TpX nkIJzjֹӶSDkI Zr@iejVikfWͳ%|$i0%^mW1ej0V"ԣxT(t-ggprt5sE4(n+Լ[ݛF3ޛ8_bFz\Dva=vfi.-oKDeufӝ6ȧqlNӺ&t@{h;k +3: ݒ x89r,3NVk5˪Z4q$MADxIl ,9#/^y u*z*jIZKqI$#F?YQ$i&3V`ATf͞L 37NcpJ2²6?yH;)-(e1oh*9'.? %zkZ4S z$2mPJe~ $8WS`eQdREv FX$P;MmMǦe1jr^7ʜfRX+aX}|IHXQ}a mUmw#=KKuU+UJ_QqgxZNW񴊯4#V ox)x^w*~3.JKUg ~_5^T eYTO 4')߹xN_Aeڲ5h 11boOP14RC32̐o*#b>-yl:TlBeRoGUT56%U9 rW[LR҉PAU"B 3n%4n`qt*2&Ţj65Kɐ&<cz[6}&̴f:§mKFi)UtT&[ժTeժU*Wl|3L-n\O%fθXz#ͭ}.b#6ޕE)sHuPtLHmC7 z4XE[3Is%{"ne;CDOScݯ( TkV3tS"lrHo685 c7pglOc%*/9Ra$*Fjͮv_UK&uRk5cq5y˽垻<..iVRaL<+ `-' ۂ e$x)B+ڇw07G_eD_!tX ҅Ue'b3A>n޹X 鲣˜栁1m$NK؇Sqwq>>3ܭۋ|gد^T7]lc؃^lr3s)6c J)b+H㱱[;Ι7y J=Ot]3BrP0Dx<=w=xɻ^jt-Gli(ebHinqž!*Dir\abU" ]$A_G.wHPu԰UNb^y81xm_`mC5g^٬;&g%lyIG3CpFuQ}{8R7!4:I0놰Xn-CN>P!4`k#ߩP%Pcj'څ4Nhe4s?Ҹ=΢ q1y:N>_YGLKQIMn=tpzf,nRv{qi&C~ub}X_j dU dU ķHcD3qp!Ѭ˄{aFÈ!eQ zFtw*+Qwbbɹڶe#7kK[֖-r&vfT;hY*RJw \;^H:r*Y AafOFWk(Z:<ܐ! ]HܚX!`ΝL9Eɧ7S-t+ߖ#"+®5yj>Q2LPK  =՜M5org/yaml/snakeyaml/introspector/GenericProperty.classTnW]3'5챃ʥ$`r\DePULxJU_~PTj}ߴ]sƤ8qJx̞}Y{ϟO؇"YqNT\}Qb X"(=|+ᲆ+Zr5,Wc3[5JֵT#KfkBl6fU~d #}!7`]qĹ F9e۱@.FBsms7P_eE۱nj-yJOX/ӵSPYfȒxn z^˵˷zr5RV&aw8$*06@!3|}=R5A?ԙX^^wJf9N$Sv'lnrr\|mOht{{1A g~FZ01)t{j@hr5[jmaS؏Qc :fqj[O89ZPG:>5qCMȾHٽp_m{i(o`2{f7J2uW2ׇl>|(o}m o^$Ҟ41 =߲B{HgAssTeʯ qob8Lq#`$H0#BZGp|I)8N[ߊ`,uY H0$17ߠ._WP̷^B-cHL', ס)D3RęWgKK ")_pw9"tZ%Jگ A>cp1h29~C@lzP)y%TVcwIʐiq\n!B8 op"X,,).\qAIWaӔs3iF{¥e"!^Q;uri-H̿PK  =s 3org/yaml/snakeyaml/introspector/FieldProperty.classTkSP=i mCxX@jI) (dʥCISF~FgȌ~G9Rhw{{7Sx"qLeRE7at|]Lq/A pL(:0Ȥט:-0gI*~YrD;^B,B^hYͧ!f0-noR'ɴQB)ԝS@&#,V A+4( :zD!WyIc|xUi/ŧb ѲPK  =qP^D.org/yaml/snakeyaml/introspector/Property.classTmOP~ڕ"0_a/6 ~*.]g?A&(㹷n1˲{}9yM˚ד mV>ЬzPٙZ:{dԫ9*Nr)U5cKa[flJXfES)~sɔ6rde4CE'7NGRkjXZY3l!P޷ l;L,->إ`:mӑiT\Q--o I-eS@>mOCzBU0#"K7#}VuӨ heH's7,+%~o "{f*h:kBj1DNF2IGZK%c2^ay0*cc ؖd;2h77f믙VUѴ`o2|4Zh!_-k^<Ͼ8~o!71z< "ZL(2a$A лB-nm/tqOPX+,xHx~PK  =(5org/yaml/snakeyaml/introspector/PropertyUtils$1.classRMo1}lɲд|4-_.E'Dmғy7"΀B(8BP*3oy~|c\ŵ:jp>Bn1ߵ8}Wlt Iֵ( ImiѹexP=z~LT^1<<-Г/`&+IcoGc\hBgӯG|BnC븂9L!EJN& [ L>$pvLYU5j?PK  =@5C%4org/yaml/snakeyaml/introspector/MethodProperty.classU[wD6v,GU&^H8Bu I[.N\)7ޤjg%<8uΡxsQf$ŹXݙݙY/x:u=7pS9pxx7X@Çl0m 51i4>4>幨cK5M6wƋ+_Gˋҫ)黪@JZuڐboj+L n#[U0[eK٬GI QtV~n=z"v|zMY%?r7I_`2԰| ++2ݱ-&:*1Sq1脢=;NmK+#Wݖɻ6+&;!57V b50p `C aTqׄÔ)T*P_*2hmq)X~ /(s%M=տw3!mfۼuX,``HTS0L})v' ㍀ՋO`6F~YZ֌i0Zf; 9K rIrI+ɇԘszei"pHh> L_ (ţ9¬WԦ6{+RAadP2}f)Z˹>$BթZ->HױW HWѴcE'SZX|\w>݆=[5Mf[wEݩ}ɮ]\f۩V$qӒ%$&+%ꎃ)ef$V}RG FUЭkPCA?k%N_ ?Rc):rxld)?o ƮduWCѾR^FNI<^ xBŗ@NUp[ŇHO@󷰊c# ~_5UeդA{rL8fjUpG'gK6nSu"'F Vf"ntl|xvbF`_'e=W\<7|`EǮFp.&}-iZVWvc e2 ,nn*THvLevU}sdKvOS`I'+dW,orۂT8!;(2't#Tʃ>~qANNwlv~q_wF*Uq q:l4Hm@!ճ]Nm"2e ѿ0C\q!4ioˀx ÀD\=Ôn3:x ķ ݋ ,<` 7TcwV)>r+z`'\@4RkEiM-yhcø_>vmBkݵy,d[Rkؓct"fϐYp}U[ p,1N -ѹVfm #{{ױu8PN8@/ u$xظGAp"| ~$CcD(qatôm DwRge wߤ/^f'dJ tg!Y2 \(&L~,0eH0tOuM>bA'80'mL2ݝs y(ױӸ\4Qfb([^1yж# ^織t(}{+r׸"m>6Vf.n^0Iu /8QQa`rҲ#4-vEE|J_`ꉄ?!r#ȋx"\K=܆x'.zX,{b.mXC DGTb~r'p?rtY}TPK  =߹C @org/yaml/snakeyaml/constructor/Constructor$ConstructScalar.classW xTϛͼ<$Y6Q&2! %hG gqElmŊvӸDE Nh*uZ7mvofWz{a~}{{08 .2nQ` &6d.wȸS]2!SF^A{»2WX{ C2ث` nva'GĒP0 Q x^T0Le<-$>A'<+T?Cx^, N8qD_t" G^req~UakN4 ^Wxo:#oxۉsEo; [0=Ge/2>' rX*M ~P\KXVEṕHsP b%ch,Œpt FC&5CX$ GJ+˘o?䏝M(-,Ek֊pNȮxp6Snk_@0SRFT_(G*Z43`F g0w@Bluײf4ZJk7lc""=Ą`0) ћ9!V-' MCLI>CăzG-/Mҋ?b&呖p\0g@@BF& $vrB3}䱭mL>2T#F]L 5iJ1L 52Oea?SR:`F&%S&!dg7j ؚYuRQ7XfjbzU@8i&[<.a)A=e/" C-k :mt}unpPi)C9:>swz彰lVH/8Fg f6hSO!*~?L^,d̖O38|1'YBlrj5t(b-PLo^7ZOy_9a2Tw?zPq%-WpʫR̀00,MƢ;ʀk+ p7sh5VI"X* !Y&JNR$풪EjF̙{;B YB;lnƨQn-scN=Ka lш0J#)2ƕKTç2Vi F(MsB8 #Ga-˨4]D@,"8bo MR]k8˸=Oc ZT40nuHw,ns,Z06Ȧl$.!L3 K/=KxV,[OYC0o-7HIncc[X4s叮n,ѨH8ȭ)(ǟ}k}5O2xɄVE_<~U,,sPRX4\4aP.IoQPk$bqU]PR.Jvϲ\ C > 0OPrbA.djj15bѐRXLj-\*xĪ&| _<@d`_[#-F [ ؍2;;mƫd_["~㇨&k}ʥY\[[m>F? }] tS!v՗WL6&l:|6umhTE,s貪z9&,fдDhjfAL̑wg{NpčHf<䌁 #; <6i$JPq7=|̫i@{U졠41=!3t,3֔$`kǺ\;P vT2ف\(&`:0?j<ց\ 7c"H`d;"GoZh$CFymv.rwZ+yJNLv99,WVyۡl++oWQ&`tC4tWcYwc“yvfU쒙2} 6kQb},f]n܅3Li 9E>˙4 Ow9QKfA c)>COx8a2ydnXNz(O-F\LppN!MatQvyŐ8^xcocW}%ɴ\zvR5Z7s?FB.\p|jsDPpba3|[A2"ljvl3-氳.e2ibL]˹TmlpGCKel*QOl̂EYdۉ"ًDZ]V>JzV`V:쁨=F 9 &^˖vGM*uf ɟ"0:`XwE7t=)\SlyNC,J`Y7eM_ށ2:0?(ϊLhVU՘+v`M*C#+9IQ /\Hi@$3L0rEYj>ifvqYc cJ'*fvrfM1mNwci_8O0~efYN )&gF{slV*x<\Rm4q]q׀ISXN< Ma潞%ۤ^n`[A2M|V+e=7;;drY;Dl&~ޭ~ٗPK  =$VOEorg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlSet.classU[OA* B,Z@ R|[nE|h|~hI$QQ3BIL3g|??~B)ÃdtGBX/a@  J BȨ] "*eZ [;Z-$l U-#;=0s+j$9C]LBfcJN<1#TSK$.,S89]f4Z' /Eʪ SVxd3nᔪ@pNq di"(Ya8 q#c&&P҃ᠠ 'a\KT0(ԄtZD^ 1PDZ*LT0 'pӤq,OfWLvʨ9{0$RqLࡑG]> T?9dJqK࢜a_i# dxRKhW*r{D QF?@wQveh&YA6`oqtENVz?#<#(FuXq)d-{G@{syh3܄? \C ]=T-A^EGɢ kۅW"}>cm;)r): o;(:} '_PK  =ktje Dorg/yaml/snakeyaml/constructor/Constructor$ConstructYamlObject.classVmSW~jXXWEIfcl/D6mW twI?_:̤863m?GuzBV&˽{<޳Ͽ`OE<Rp i XTBl=r>#+5Ӈ2Ve<R9WA)PX|#[.e<!niĊe{N%Yt\Vp-;>[6$d~k>#:XTY'ᩎs{~r=I%6i7^ }!ZDe_v& c~$oL=6eڔj8=h}d/R1k>O Biaz[|^a},l]`nzsh 1\xYs ^)H OxF8?PK  =v2org/yaml/snakeyaml/constructor/Constructor$1.classRMo@}qb M 7M*3KJizꥧflv.8BgY Z *33oۏ/buh)Zx`a/Ns1=ITiR6c1wc=*i0]̰O/HQfoW'ܦJz zDq=IfXa*Zc0CSX!S]QhLɑ̧f`+v#FA+. kfA;qM.ϝ+x QOkig(GgR$g2l>-|Qi?$`- ɷuq*7J+f|>'uIF5NWMB gGxS?~y J͹U,Ijp&T9߱HvrM ,ݽ*X&6M|%AoHCOPK  =gForg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlBool.classS[OA-]JxGAm[ (MLL >Ԑb2]Ǻ̘-_bWhxy06\B.ޓΖbH1XuCvK_v["_< t]y8 2Mg`9sथ:aD'aӮxi2O5?i7%oK[o zKc2PZWP a#X}&)i:'I[!=E]}~C곱)ҙ%=Jt:F1 ptTEfߑ]܅R4഍hx}^-]E\%\6L9i4e'Z1Q -iM#N)Q5W$N$mjjb_e kV%̠tCEղ8Aҙ[Tx:yo%FhN_RO&N.M%ݍo\IDW}ȽjG|padrr7MZCulHTz=p2qs<+f[}%g`dPG5auA!w۰]AEsP]a՚ʈ>QTZiGlkqmՀT㘪 M^Qz:Mv"t&.r0S`\)(K GD}U5LKޒw𮂛xam$3Ϸ'"'خz7)9K f+> :>ꔋ\'Sܒp[g-s_Kw x\ġjr$jդy^p$#"*xza͚S IZ0=[mx,}F !">D^C7"To%Fz)hIGcNa4rixN*zVIwSm-w)MrQ A5K2I蛺2Oe꺞&~MnJeiۨB=һ['4QM`4io3X=4bzi V );kgOfbu݇oއE}#Ro@4W~Mk+h{X[F+X?C)oZ`C2 Ă G!fcSu9s|C?lঅ0p?VJX^nT@} M6mo$8p`^՘e;F/|EVg@Ewdq>" _(7b@9> PQϗq~ ۇroǁ|2ADQU_6G,Ov?;Ywdt._cBќwBݕ#qpyvvFz"A׹5ElX(pCX^K^?1B l5TyB2r|:a yKQXi}h>ֺs+Q:*1;=Le2A Pޖ7԰4ẔjTX爳p~4CXSh}e`śRR~HfNw4 /ܒMC`cnʠzF9##ѱ@}b#DM-S6W R40Q*ڱD(͕kXWHe՜(>Ш G5`AF-kcVvս6 ܜbݡCT7{#落?be:g]xxI Y óX*m}7zg\*wn~9`E {b'%wňq+ܣZ.5d_%/FReIͭ/:Km'hIȒCZr,YF O,ga \Af@K4ג2`19n}rByےrʒȠ%Cfɰp`DNX2*- <(rOX >dIH[}dIX"бnCL_`Ͱm;{AuG### '+7lDNQ-7W}玗e;t_Kګ28sǷ՜Q5y/0佖O/yؙ]eOh峥T2hLy] H/: 6\ J6mv\KߢK^rDyi_[j.p5ߧ>:~w ֎fkDݝ- trFo{}=N^*b&l:xrbQ}1/ۤk*޲9jSeYs2a|/`?Ūʎyarv-|[3)E:^P~vh.ɥWͳUǜX WW Ƈ4U"++3;6nYh9]Ht/[{2æmP4mQl`c,g|(KӁX=w~2p:++5so<e^};cG<6Ҥ0׽rnR5r9:x%O'm<;F7oSM>cGYQ{HTG?=)t4Z]8'9s ςOݯdt>uh@4pxBsI}q>,ht]y>VjHl JܘI,Ob7goIB[2&UĪ$X3K)Ԧ{ۦPӯ7c(c^܆:BnQ܁1܉'O /a7=&}+RJڤwdۃL#ܭ߃",$.a{g~s4v { .c`eܖWk wӸs i4}Dv8pd {Eh޺?ptTԑ.oѫ3%z *VN?0<+O.5/W-शY^%1Pv7WsO~,Fr ƽ칄/x-ŰڻDx^8\VjV [=?#hVsQJylNYZ˽ti -,<(=NIJzЍ ܋zGgO>Ez25qJq# 1(^ ѥelIDy#.EB>3gy &J)kXB ~hdJ((>KbK#7Sapiz5 WIL/04 ,[E)GQ y9#|?OrIiP܉juu"u2^ wKYY )NI_Cd="jak޲SƒPXX8k,+]E:Bٍ,JL iܾc4iɀFcpuN#40 ޚլ')y+YW~k}c#ײ~֏^qez'?~RC ?PK  =jO0org/yaml/snakeyaml/constructor/Constructor.classX_ΰ8F@1_! M4 j@23#M>>Ӿkl mLOﹳ,˲s=sqϽw?Ѝ0r&ۼ`ƀWDL \6Q+pLxLlD^_2y_ |D3,x6\kjbƯ&o؋2qߖw󦁷L|o |O|_D c3u.c?1S? `6x_C@.^!:3'r4lZi\$N*PP\;c$%oh_$8߫~ԝA 5 OYz\2gdB!k/pzG3f%< *5IV5Uni4WTl.Ǹ4.װu~%am꜂w4޴4NKjDٽ5hNK#ׂO2\7z+~`w? P*( e? O2_YE*ھ{%[l|s.q ƨUbu  ۳>Zxx0&GSJQdԮ"L5" ؉h[ ט/*DAgq$.n$s|pT6) .t*w !̢}$~p=Dcd%fͩYR., -qw_0)Kh3h֧KϣEq@ncz+ʠ~l[F$JY=j~,,"K&ql8Y]edMȟ&87LZi<)S\r%ǢL݋/%a4 'a(x..$V'*Ll%%XGF}1('(t#if{*'?PK  =/z24org/yaml/snakeyaml/constructor/BaseConstructor.classY xTu>GFO,d@"$!@`I`$<hfŎ/;;^q06XMۤM閴Nm6MtҸyӛѓ46|w޳s E٥pŠ؝G1S\v _Uy(ߘ3)HIL*MrsWpK3#ri>Up)MY>Ҕ+-y|ZKL z!RV)Ukxp[pVun oPZGdr4Ҵ)ܮ&m|j-"G4lf4+^];C׳KdNinf4=|_C7in7ke{=]n^iSE>7Ka#: 8pi͟D$1-]bZi__P bhG1?u6k|Ly/ԯ hOP|5 wkv-+ZW6]y2Lv x g[:O}zj;@rH8-w`OEN޴gC2J $2,vwhq,Z:3'AXֶ}M4; ۭi6Iv2v ϱ4ia?6+'ucRpT:zd1D FMӆ@( ".f7p$S)܆@(odʮƔۣ֞E;}{$6_4 cs2' h/ώ)YkEgeEf){5uO*(=ZOnpҕ9F0Ԡԁ< z-%օ>-gZ(:BoQ Z4w_ .H=” ע>.۔T'$F–黿)OA8[LIğ-7sNmƱ#2FX1&@WX3rTh䁨k봽>T-rt0UTbnɦ3(_iEnCuR7¼a#7ꇝb[+[*opTq=TbbS?5tv,7t;3kOځkc8\ewYuβ_ϐ,`bp3Ü\~J4T9Tmd˯ v F%ʕ S#EVgJ&p02\@-৯av~(E5M ugxuk\s]vY\A*5sFQ )#ćuqFT1NQx$=i2M +}IW_n2ӟn][;zsNSZAvk[Y`7nlIy2(%w]*05cA !zE[GLO(i:Gdu:=,p,0GO Ě/Şp""*JcLC7}z9ƻrLCt8eX/t VVipXt^3TQ>iUzQctqʇJϨ|3t=zSi>*nʷziՇ|'=]B *c)$|4*?Z%|o8.Kr-=*?o>ҫy OO2Ud*OqOлnmFT~?0L,?'2&_6=U I_ )?/y_%^?9T8TӢQ(յZ($RIKJӠJATz4cԈP*ǧGP[ J_J?~iؙW3Wy_f~UVf ^(Y't5%P$|~!,S,K39Åy] sE|h QQWxo6L 63x Yu[d9-bi!nNzPS)J!|eWu=?jy}<'%WnF:1ϟH>%!{}"R}Qgo4|H)px*ʮli{6NylqFSV)Ppc^&]izYK.h!@ +æCjez\SL7ÈY&9(Fq"ʧIR\fo?m2Rq[wbBյ5l)Gjn]EiXO` 1~w{UDs\v rCݼ|tճT8tǟ C݉^>KT.h$Dm`"7 ZCԎ&jBQ'm.]=ժ!"}/q:aYVIC\m!d&PMͤM& 4t17ٖJZ.Q#Kbzt" ]1  1.7`%4qlz6hyt&t tEGG1J¯̠dKU|1 Z^9XLҧl:Oe xԠ3"nrwE[_~eSel:Fo֬ZQQ̒3e $<A 0kXZ6v<S>Ёut T",>^Bd1}D>s0iL#4dx덝_F/G.צG1Aq4fAq*NѭAb.\W G1Q[5FuYԮ1k.ZEXW˧!,@t@Wj4@RyځFWU-5 sЄzZvۑX<\M/ 4 B]+}nLHNUI[0wRjLhTטhϑ=%9X$O}Pek(7I?ߢJcx-·i'};?u^7#>9Hu:g3,riX =IWqH#}. ddp7! LeU$itM:HY࿯Zg pt?̀$&fei" #[ oO_ӿK`ǘj|޴>}d5395Q3 'hѻ)fZ.Rs)>HjQyjgvS 9f3`f#(>b<٘_1>/j?aŸZoVXX3G;[ېb[1{4Mb*o*Auή8U,dV]T¹4h!RV-]Jl,tYn2YMcO-]02`#P-8(ɻ:ҠmЛj1j2ϑw&HOC@.N[(M抭9^Wm1N4TSh[a_Wp`c Sk #"p,7԰ijI-4>Gr.tL]3fG- 6xet*gZ[9]8GK-ٗZ/5O%w:AYfeT_t=J̮t7q ^O5tvө?&  tCpe ڲLzT3C'g7w cc1d)ΚG$z0x-NE3bnw V|^:%/q)ZT'Ea7i),Ou(;J(x["Ylz :nZ~Z7Q( =!z#$}6>q'L [?n.205 g7״|F9)b#\ow0v[x,GAX?^ț9)|7<&ru5o.)J"16U\PK  ={h6 Gorg/yaml/snakeyaml/constructor/SafeConstructor$ConstructUndefined.classT[oA(K*jUVQl^jL* jce.d,_ >xPZ%$̹97Wyd,ܲ`#L 6nѲk{6bo!oa!<~wŨ*fJ[FEm^ ɓ.E>w =p&^Тb$[Z}NVEU絔BCj )"U>F$?=W5Qٓ  kqoy[tKB.ʾ51$d X/6SHvf( 苦"pu[Y@_*CaՕvB ՠ]tk{ռ:X + B6c=gNׅu7()b}"vJG}=w2"zo:`XPbB"4`.mд*uO ,4H2SK]ϽKt&}Gt˘#I+k{"!]$S$;:Hu0MŹo#?{s}hN16y0PK  => Aorg/yaml/snakeyaml/constructor/Constructor$ConstructMapping.classX xgy~J#fd^lj%Yb;+IKrd$0ZMV> MKzBZa`e$vh)m hKJC!H j%M,yyf>|G;u܂|c:Vଆsq_б (Y J|QG5Vix\G"vP1G]?jzz/e O;Ri|U!|M : go)oW9|?4|_*5@GX+a/*E~gJjkx :^/5JǵJSW5ѯp%RWGRV~*MR*^5^Rj*R:2VJuz]f㧚ѤAPgV ZRp=4oU,dӹX6n9 x2*hτ35` jI'7o!u]8``K92O dJLE-3Уi27ZTU4*I3=|v4wj5fr}_V,KH:5bqN7*6GsJ{S5@MnzZJ?in4 ʇZ4L;M1kO\eOdw2@?bJSki2ߐАEr!Q%,elq|t U`8\&ۘLeƴ˥3*)cjHǡ}i˲aq Y.+ Y)aj6OA!`TBu_lH&TN'ȴe&k Y+ Y/WA64)G $h5C63^֐-9ܲ͐ke&; )4mi4MrkH\/Xv\0wrVZи:F4\H*Rҥ݆>CnPbf$ 5ѐ^3d6eR5&y!& y_Ѩ1fŐFCޮgW VG*Iܐ[6Ih2lHRR횤 #nN394A =n,m|T]Ðwg7phDML{gҿ%%:)V-me}0S<ldT!vO:5:g9i♾c)u5"܎\\l3GM3:Z=u\cu%N{ 7ObPz.x̎%ضވq:3N0¹r7ݩ1̟zl.pB2)Tw%;nv&BjB{&@950!օ]d,,Y,>NZ:fD>AJJb anBݣeD N@Prr Lu\.ifhoᾲ$yʛpî`YIۼs ȝ~=72r@u/7kŲϽ{ut#+` дn5'▙3] j]1Dzų!fTdIIr(X6]:(c4(̘Tz 4vүVOBuWgjJcIMz8Gjx$- d-~Gy`kdx;i{=͙ E}2gܳ娙k2 /iblWMǥDf ,СY܆H9}ewDuCq1˶qBl{૆ JUR-dyy, g9k}Y643"@#n ^W ե:GZ>_d e> {cB]oC _?-GyKyh'9c!F>_k[iΣ`1ziG-i.QQhh ITއ%x?p6=3؏ƒc,>;=581|gICx “S xbHRMaPۑ1pVJj,r8ʈ#oxWwnFN]B-`J|>MbfXfQT݌mEcјUCywR yEϵ)T9DZP9 Nj&UъVD^^vK籆n]<XW?d M)E|?c z eb+x ^xMkY.V$>MJ($ZIIP,G^e<(s gdyq/_,gQ%k$KeY _T(U?B6Mv˫N G, -`~/;s8̆} }*švk^uaroUlw8nPnp?9C`b }J:9y62j:LyCr!K;b k0Ef8.U;(4VNw,jR|#o/UESQfw &S>HkI]b>Ascm7voT<}!gEe }*qVVp^~gg9]-8C|o+PK  =5cEorg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlSeq.classUkSg~ ,,[ xhZ," V6`56l^u7E_~Q(3-:= d:9%ys{NϿopv ΪENbT$0։W1 i>SpA\RpY\;&zEϥ\W0`|oт-?lwD3] \O/D~<ɾW, g1R D0"7!+$膞)nX UI }8$^Ynj× P"e4|ۄ&1S'oQ ?:} ^E Z16ƀ~qkrHJiPet:; 4RCjP^/=H2h_ѯߣH 8ܝj嘧3џ1Ol>$H!#A 'Y^V^G=jb`U (' {b&b&b1r7xوe'qcsQOPK  =5oEorg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlInt.classUKpU=o~I4DI:$ 8a =3I'CōURʝe(&uek\rr羞`2H\{Oy?{)tF+be_2|9(>$ఌMxVD"wNs\z;|A7a)T씒Vҵ)× eJ+;a}Ȭdcڦ˰7Q(C(S. M96+y!\[cr} D/c#k{ Jֶ 'ckoH;VwڜMAZItOd除:͒Qj[NF.5ik.!D1%8X].Wq%ݺܕppaEc8.`L p E/eyRP@ajTod8< eHĥYUR0)i N3GDoqu w7BKohЇ?t&$jCevfv̙;w~ / /,,X5 6<+{f'q2HʼnIݶ(Ϲ$iwN Y/ fdwՑDtB/ScY(8D9D#Bǒ#SRGS{X4/ĵpCqB #dU:\ݎzڗ3dy]1llk3eBP [QaF\H? O3UJGx]FW`APhd-fOX:la;_V~"-eg̱ (4,<@wP3?ţc0_R~h#>Ma>-W[PK  =DHagGorg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlFloat.classUOld}cB֌(VMAh%+vQ 'qSIǸR&M.bBqBl_qxӵfLz"q xD]_A90,Q)lpܛ7é؉U܃# nXuQsx=S<^pTŋ(QH((BǴ2fT\+t f1ވkrKT̃.2*l,8G* b$PXXɮ?{kiִucm<}2qŮ5h42G_0>d^% C*HɭrQ5 Vlo&K(ǪrNsxɰJKTw4('cpAs\>o]-Y4`&Iin|^}s6XylǟlOqQ#2٩$X yTL)-Dp2B$Iҹ9YC0@ E]Z}nƶ͸<i^ՇQ.L35{bQHK>ٟVbt0D"(JBi}rT ̤Wr풗tE^bb w.y5t h!vq /Ǘz5 rc%| ?S 3,W#OppCeB5D&.HHC~E_3؇= IKYx2n҂!_?!1*>I w}t+}FӔnPK  =^SԭForg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlNull.classKAǿϜ9m4g/5 !}H9W==R?PiA-A|*Ξ ٙݙwvo9cBLLX(bGȋ 5QH;/btPK  =mW 6org/yaml/snakeyaml/constructor/SafeConstructor$1.classRn@}qb 7Mz%j49&n7am"΀B> 1kA+! 3;<ϗcuxh)gᚇ{xaa7Jxz6 0S\҉^jOc4Piw.}fXJ X|,)1ܤH:5z_Hr5zTTm0#]X`yOEW,7EkgK@Rg|[x0@~mͰg쑝8=9_!gCSJY&25p|&a2l!)B҅I/iތ&9M*.KqڙxY lEbݯ@@&! E@|}^*C}4IyC3"57pUTYw. z},jԾPK  =RkEorg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlMap.classU[OAjJ""ZbirBE >1.]'WL$2ٖVMb93{wnL@рN~DdD%=bb'~ eȈTaHbDF5H0ൟkV7ikWF6f jiClIۆKf6G8(hDJW0{&L!:1!jئLc֍ZV|T0 pӤq,O'g| {6 yѲn2<&U3AҶxp#?/1yOP2TsB⇾JJ$0R]7 /37 ȓ^aݚ\eМ-f;ÖP/x'l=p˕07d٣5Oru`>R(a((h{rcHrR:mˎu ܈4x Ao 6CYc0AWw>rȄi& +'7h\9tL⮎ k&a]G}l0ftElHn&c(Of$h41LEA#R?A}ߠߑQsihVO7|CQ)V)4kX7rx٤@$ϑU%;E_XzV$fdboȑ4yl=Nw!$N R6\JS+IaW5%x'f~PK  =~z6org/yaml/snakeyaml/constructor/AbstractConstruct.classTRP-H @bGg ޝL)#>7eFfއrܤ0-x{v{?,cKuL鸇i 5Hb*H[nj9G ,hXL%Fd/kXo]2 \P yz$/yvt#LnȰd«ONJH{DGܩ/0XE%j E@>1 l~p~~[sc$S`+àtk7kbb a 1<N5V~aw8rfNwxH+N p1hRU"5luCG*hF.AtoJ39Az´{HΑ!&H}?식0FhnfJJ?A:7@7L#wzH5pN Gzr pܔ8i!A!X)2- cZ9Dܓ#LPK  =@M19org/yaml/snakeyaml/constructor/ConstructorException.classRNA=gLu1!vBbFM `ESZzHu5{W ?Cz:mI a}O:{n?I0ydX=፴ uyflNLh]bkcDJ7yuM7p[o[:b氝'Kpnuc 5OsЈ a%V pZARC Q`i֐YPT9 8wPqQGX'Tg0 J,,podLL؉4\td1!)&'QX=ӝF pZF%W)BX:?DLϰ3ʐ{)ZWHP֚PKb.rXLd2͛d 1% =υ"9NVrU4nXLV)- ,+X88racMbx L mX_f*e2G3܎ yeYP[w~})Dܺ; |HZ$UZʧ݀KޝC$n3e̸ WWצP5粯riTDM6:&YݭH^I};T#$puhr *j5]zm,Jg[W .fD R%s~"W:Tt=ww9\89ɝWTiPGUh*tRTQZ4-Ej%Zoi%UNwj]j=Z)GԂԊ'F.ZO~jzD+vf:F[8m%A/ɻ.+I.Nݻa6n{B;x:flA%{Rиξ5IkUb|q/3RqQ9"4 6팋ƣu0qumKG7T>Wo΅QyY^A/hL`]}7'K3֠{9U,? 5 )LDХ%HKHM,/YZQgXq`Ի0f3HYIZ>IO(# adG8c[Ѣ LX l\E)]bX=[~P'E\[V Ẅ n▂wCS(IYͺ I8s}M^$Mr9cYXi8*aˢٜKy#V1nKDG38U > {K\GH5k oD,?e[)K5!8ǰ95߷ nV\1FcV&O %*'ۭ-c<).!`]}D6u P# F+9LwC$8*+WU˥-;I>vاΡ&ݼ-RT/°^j,ba(3qMv.o?] ilO']XkDy@+=A}t[{ ^z6D+(oKO@x|頿{SːRRcB2܇wVw:U S&j/2Ǻ?;u¬ 0!5 @!}ŚBMe<Ł(U26ۉ#sHH!(26ǤF֖XTXC)FGjN}!95mߍQ9Nb鈲3 2̂l|&q]·2dW]eƂ:kg7vgv%w%IjCԧ|څxg= S;xтx" |/WW D4UQqkI#dZh3@ʝKxX<=aOgE!LP~<@M7WI$ѵ#8X Ѷ?[*UoJUtU'2Du8ι*rrQhj=-R6t۴dtj#Vz/J??,_ AkEއKAƣh4UgfRr_sC'~XLxٴIU3~n?`R8^4ruEo@ϜczM]%}Z]iʚfP-8Sd$cVZӬXslyMf3;'-#\͖IrȌ_Nm`@Qr䔥И˩-{hö)'V7H&qq)hFYF{WwG c$XyU+Ź-V~zOp*<$?hu}-/IQїDNi\@4<ߙ) ;Bn:b8FeDvc~<>Py7Řa+OJoa|knRËY쳆ߝEI{J{~aw~ͨ κ%PFPz`/2Ħbؑ1*G]mb0#s?f7ثmc8M X}j +#K Nopdm{s!\#9t#`Ap (X0B%m~e?s 6Nyz2񭌸m~o}f̫ ޺QT.om!6b/*4k嵗:vGU(U`q&>А:q@I\Ra0Π |,s1OE%,/cxװYGqx 7taLtяIn<+=8*BJe'dX/De,O=4ebPC\#2(ne8$rxD.OȐxAVdxߔI,KOSRY&빽bZbtC-86᝸RbJq.[Ta.4lKHa(b35itrlPH4;F,-ԗW=땾8LяY{$x!tZ\bdc]E$MY޹ ڵ1PA)<$`g-ɧ -]$Y?3@G [WS͜0g.,J11Yog2yE.g"lȳ\a0"W1" wMH3tEYE\\Yr f̑@JVer=d;V|ى e6ʍDn&--I7+3VR`+n CԵxog1(%%@RveuҸ}.G/\ڥtdH^Ra܊tK|)$ؑL ҇%qߖ .%IUקZC6*F!SGƚA`v$?.jMT ?PK  =֘Aorg/yaml/snakeyaml/constructor/CustomClassLoaderConstructor.classTkOA=.]Wy`eT|khF ~nײ!Y"#D?wnAd}{MUjP05,db9 *nM7b70U:0c\1t)dvm0 fmA)0\]+¨8dIi8{gQvaĽZب;k$2o ~CzG¹f)?ҖD* PC-?:XNvXV,Sw](QHeK,!mE:.w vkm) O'oMPt*n1dsKvVneFN`r!Nwq/}ymWX^Q3T8S+u#jU7-x cT (r߭v|.#P[8 @?:뽂Aݚ.D,d0 v E a:=s>=EҪI,1$ɳ@ah |;Ҟ։+J'}DlB}?ENeTѺ>LT y,/- (ۅ7Me4C"5}s6bJq;^@3fc2{Q]O#_"Оn_#,oPK  =D@% *org/yaml/snakeyaml/composer/Composer.classY xTo23o2y! 80!!"$BY$Cl"A5~s[|an-m-ÏvpC):a$}BClOCqX>LN/߇dxX;e'~L~*p{?N{JfO~Y9/E~͋2ʇU a^Yu~b!P;9Qw}Ny+x_f{D0?hk̨)5bk>wN?[COOq)c6-LD-5'[? ޸E:D~F>rp3͈ZcB3#J#5F;׊-Q# K.#F%ؐ-,Fcf"cb*7Cx"aʫ~6$Ef0zbUC4<^fWpр@ G͵MfᛲձYot%[ÉC3nCfhZDaŬD'W %n 6;h{#q ,IC*u/qE-΂m]^s4I4CڡM0K"a#9ǎb̀*$tGͭ}T *2FG940Mü>&OFărfAh2 5S# p 9%F<9Yp5dkkhcâNl,Z8i21OdވzP>򆏍)} TOtT /1xĠS,2ۓXT@6F aU@&h jɸiʥ 6ͱT1.dzJe)|*VJ´ᤨFR]T 44˥5F?s3.񈂀F2]&Fr]cHW7#ᐑ4vqx"x;I*Lųt5Ni fvA+seؚeîPo ڬNX'_L\D`~ ʥ ooQ;]\Ώ9ށ+6g|kTUpjnRAlTLjێ0lrPp3E,OlQ {1^뜽pnҎU/4*ٞyk#G-.̿ Jű\[]Bm5UHq5,n];KXZڏ*?zzCN[QX]wc 9[;q<{YatJ[L#Kɸ[Α-ۭs9$kߤ/ Bj6-sw3SYP,?Pt?˄ǝ8f\\f\=Xwz[%«Xkz6I~Ov/Nfgjjק/ex АK tO" \:GPx_< ?I"O37xx?o_6.@gHOgIл":;qE7++q7wBdfW:x4 q)$|G^8B]qdǜփӛߛl^h"ly\H~x9{̼LBv_W^#'77)KLw2I0A#ӇXig zbQW35ʏa9z+Mo]cyko[guW[ֵԟv|qui룶]>?PK  =Xi3org/yaml/snakeyaml/composer/ComposerException.classKK@bj}GkU JԅZp4ul2S&S\ .%ޤōgν仐-,`6ca$kRv0R*\"9T1U?p/]X#UkyzM*a6)7ʿj NU 1_*q֎\zHNs§wt음4U+ @++:6ɐ,?)e4EWMBM d[|zCp:+?Ʊ y8Rrje 'U`0Bj7Q$tyTMP&|PK  =d[A*org/yaml/snakeyaml/Yaml$NodeIterable.classS]K@=75&[k*V -">X>01$[Z*D# 9s=ޙ\[,(ᙃ2 /-"DF" #t@| QmH$w¨#ߋq(S/浽5ƒ*nf?U jshT=BiՎ +O32 {,i9WKˤ2EK>]&q=uoR_Ѽok\zs6r<_}o{ {Ir(pHB.u1  QfHݖwWl )~eKk`?SiuO,¶ʻ}&jFkOLxc:Mg92V$N$ ## ctL 4@iYrNe!7'}iǖ)PK  =G=~. org/yaml/snakeyaml/Dumper.classWkSg~$,jUjՆ R[\ آHxiu 즻{OBLi?:_y7!lPy<9=p?яVy5G;މCnjZ]PjUKq!.k\ՐWiGnq7nR{J}u5|G>ny E  W\Iۗ.f׌+vHdn hN788U^)I7WxFqIҬ%|δMTJj/fmi@lY-+ҽf[GYRWZ7 )SXulalMP+pIѰmޒʅ!u@, ?%oe?o9w%5|ϺmۖexdRlGkNoz*my>9[Koǁp# whc-p;yu(])PFWb*'TH)izpU 9Zޛ*|ǜ@zvART#a{ SOJ} ^29y+5kD`,ԃK1j*ZǢ9qmu^Wy5P+tCAT4\T,$v`{AiL[ 4#M$V8PK  =6|;T!org/yaml/snakeyaml/Loader$1.classSQOAj^Ŋhh^BRS!%ѷu\w-&(&2^iZJ]nwfogO+XOa mKal,` y I,-,Yx̐ ?-3TTXw?fFت(^smכ s+pCĶ /^Y[^ (2YQyLvHPdv6*jhOj|ؙ*Guwz$ rIS1d/a!97=b6&tbz؃px$/|"(_k%$UXO E ^$uNzx/ Cc0@7htb$n0eX٬g`għ>?bR;Rڬ@9_}zǺ ܍Q{2_PK  ="|$`!org/yaml/snakeyaml/Loader$2.classSmOA~=ZN[PA mA=hHjIDIiݵMM?8{=i r3/fE5ܦ C,<igqNI{Fh͔JGN0L1\%$GI33:(*lc?zx8>1suϾ#>?nP[ފ'JO|"J',]C=:iPK  =Q.ZB Eorg/yaml/snakeyaml/parser/ParserImpl$ParseImplicitDocumentStart.classVmSU~nfB@*B@-P^ 4l$ٍ,3[Ee~sF:{݄D֩_ιsϞ{}g2:0$rSy˘- SAaF Û[mxGBBF#xAmXqI K2ZfVda*aM Φn$Lk#QP3]UV|vN ݙ`x;ҳ1Ӝ)|[֒%IKjb_Q Ct'fj7Z7 ndU愝dKFL[f"=mBY_n0tWú` 'a謪۲L+*n:5Qa˟F=G71 1ޢ;wP!o4 tǫ[궪] ^+b|U:SbȚxL.HKP ]2 )0`*>V4nMUxhH3*EB鈄m|pͻ鬩ex\>vF;rR [y("ѬjlDooqDa/L%Q) R4nAVW fkhUdSwR.bE1з) 8)=[`ұs˫%0<6)ymj9R#"R9L=K,?V\fqk95+bkmļ@N(up@k>wj,K!W5CWh &ùHoXFyU$ ]D:O#X($f=@n] |{E;.' .Uܵ0^X$zlzoP> BJvq&yqѰR@=C4F9%$lyGsxq=mG}hgxԕh #.' 3 b}T|?%r]}41@b#}ȻD/@g$zAzP Rbs~޾=!*"J!(a]u7Qo'o awIr8Bg(lۈ?PK  ='@9org/yaml/snakeyaml/parser/ParserImpl$ParseBlockNode.classS]O@=ݥP*[Gݒ݈ODM@xmLlݴ]"J ?xg`T/sϝ33h÷Q cXhaɂG+kV:iv~I"ea?79'IPhªUA,]XAHZDi\?I0)P^osoK^E?*0[UHW_;]ehp7]]XgTeq#PK  ={ Korg/yaml/snakeyaml/parser/ParserImpl$ParseFlowSequenceEntryMappingKey.classUvFVvDQ[ lE 6yO"HFi( h>@Ì&sŸշofg{_E5'}$kCC~pB>pi WqF99₆1L5bJŴp2_4V\sYFV*4q:qv@.ݑܼ@r«K+͕ϙ x̛x3A EN離Ӕ%_1 ],WJ1@҉]E䗲TWoZ̑lWyWa`L"|O-KW`6s: pKKѬ\`Q9Ъ^ӷn}<~ۼkxu;lU|2**ft\U#RΔ')kbטqPv_yiR#A157qKǷNAǏ|` L>H3cՅ 2q\h{HG@"˕M8ڴ,bn ,Qmm %л(ùUbtYwՋ+qBQ\:d-Ik9gvMl3дw vff, V\4J'9n6ϼT( o`m^F1PWQfLa` ߢxXE/)G?D:S{VcRHkPHC+L/xlmh|s2z"}(H>BdH=EXZ%[_1?^cSc!jc o=oo`Ͻ8QP~À;JY/ԕc##g1I]hP a+K!19I I!|D^BsPK  =C>org/yaml/snakeyaml/parser/ParserImpl$ParseFlowMappingKey.classWkpUMmjCHJKB( FR|M6m ~/fБOu#xn֐6ssv~@;^a؂Žj܌nN$Tb`p5\^osc"bubC).7q@Q_,1*8 aЍHH0,!: c0FSCsHH2`aҊnz`#d'IlHF<}sWf)uWf_{$QjCZLIF=!YSxPgiٞ(t"5SeoM*h*ҺdWLzHMF[wڰbh(k^%; o^wX1u{BD?{C!EF+X~,!-%%h ncm2tLq#q/(R)>SfBqLi(TψUᨄc2qE"uM(0|^ aS'-D2$I1S{ZZ[QZB? sX΍\ikp {ˬ^Qg:c ,d9vr,|4u0CdXlvQK!y+EW{-#]EMMҵ\ޕC_>*pz-̉ZhK{9e~y8aqZ 'YOAytNX 5Xk[^T - p:߁+xዐ8|;8`>?ET1MsZ&]3Ycj㸶v u0g s03 rffBMEka8.E]f~Qq, 6u9]OH,97M>m6ͻ9Q9qrђ3j'\N#KgX?uKWq8˿Ç|%sY %vX/lN𿬺XEE "Ũ ZagXKЉ Vdy I~VEQ7/->E5PK  =ݍ)R ?org/yaml/snakeyaml/parser/ParserImpl$ParseBlockMappingKey.classW[GRҖ0 DTXle3B$즻.~Cط>iZܿzfw j_朙9\_;n|8TK` a#2עG pLL0.8S!N#&`I_󼧫Zua RvѺ'Qv1}7$ZyJG R4H \ٮua"vے 8%I|um_ᔠmKxyB8RMqLt(AnZ`mWH^|1$I^IDC@XF'IIc @.#q-I.@gH+ 5ԤC,o:^IMQ*]u t5z8ߣڲ %-XpZwUЍ[+?#%<%@f@$ hL7lu-axhMe<%cKxl -ą-n--6ę1.6=Ԏ(Wa@h]ڇcRTi?\,  H4(nJYt5KGt?F;4{) W().GiRtRݤ}TT?Bh"`IE%)t̓"چ**aie?Q (jIHPK  =JD+x Gorg/yaml/snakeyaml/parser/ParserImpl$ParseIndentlessSequenceEntry.classV[WU$0kK jå @AjZSfҙ K|@eU˽'å4@—}9gηjȇ\nঊf4Lt=&,5b*Dŧ3&x'-L37U<9dU̩B[*!xvSkr-(};tR!R2Hv*xw 'h,9S^YΜ`mx,9(.HK3f勲 9eyΚ,LJ+Q6tjɱeO Բ(WIMM@ ]@o-YM!oUAA`N; !&'5H.;_m^]Wu Э {K 9wߨjdXF1H<EZ4 @R YBj Γ-{358ZӍ![*KgFF)VoS-F1ִP4gDZBN2K'zzބ撔;QԄU>ǹdJvI !VC߈ ptBDܑ V{hvf oPB3DIJ;טG"jpU &?B:+-!1 } MTDݕʅ+h*+hDUTFkM F?nuIlcf7ά>KўsӼ8@_d+\E ѡt tbVs"VnG/*e}D6c^$Ȫk @ alL1j'*XdnR*|n#~*G}kLcJO#M[}7PK  =<0O Borg/yaml/snakeyaml/parser/ParserImpl$ParseBlockSequenceEntry.classW{Eͦahk"(-$)%mQހj uڐt7l6(*oxE}?gvii6|3g72;/7!p 0N 0C*ԣlaLQ9&8sH8BNy!z$%uFjUb%WT!lpr6B8D-T TdTdt#nT67pn;NSKi!N%rfJ xG S>g ={Jr3k$(ͮedbA125Mae|^`U@+39J r#)gLL FD򵎕&Cg9Yw/sNJi!(Sz { S `8QeQ.e[= '5P*؆8)l\}A9#")SőE6C:ai&4y8* Ӹ1H xkw/u7&Þ4sm;2}{*xp8ޯt;"-G$E_isBӵqE3lVR\1l+Wamٱ1PɼŲ9K86,)A L쉔9f6^pVLikTRq|/8+h^ uʭs5CQp{ @c#]l0C ,K-G%q*v0D>M&,'7tyL}~ KM׻Vɰ1)%>[p| 7{. ʂl[pt#S+s+'Z^z{-kS# _ טQ% GFuP/3[ͧ>'b@JcDW^z.'d5t-ςwbW()w_{^3t^VGHOAd;^DcݻV9P6˭g=UwCI~"?ERhE;GGZ)袱v%b|7ͳ~ mџ\GMͯMPU7n pq][Lao{xR`El\@bh,iV$Ӓ,:]d|e]H hI6?6MlY<j~md":ߗw$:AyO-E#_4L) *\SbN O㖲I Eidfd/ň>Kٔ׻[iP٣.j73s?~~I wҐa:A^$எQrZP0a=ܶLaUsm3pxMD@H,={NL[0`H-G͵ sQ)  `x3 ,ERPbGNUWĒ%C:@]."%{3LUȞ=I<4i1axy|'isj!si:bɠf+zgL7S畊Xq!st)'؇R[ UhJ: Q[sk9BhρP?p5~)oJ&a\bԩ iYU(Bif4SH'(}hv@MtB(\U^t }M E{G(ߐؐRG_K]}Agt@dB.'ͤF!UTɁCDIݤ+H]y#|>Si:I;k6,_PK  =W=org/yaml/snakeyaml/parser/ParserImpl$ParseDocumentStart.classWYtUnte()DJ"ih uLKhę ;+JK@|s]xqd![ >.|aQKh$l\& ,b(C7n櫀[8+ ?D\!b .B:_EUd\i}4 ZęVu"JqqE8 M6e\zD8npw]yW1anKXv˽A{cUMQ]k ҉@(3;;R+ Z!eUSQ Q}rp>N4s)*!MUAB5M!Ҽtpds"KG}$p<e+5W3?qjpҕnEeeUvP+N%E(!\0M+s#}9Ƿ$Z'/(2I:qщm I"KAJ|.74$4a Q{%%eAbwQ@9vhҥa G~w%S\251?fP.s1Cw&TϧhFKWd.UjOfr1D}6wNv6+D97ú|[Fe3od:( 1j;~Yre^cA8'`dݪ$aS}_QHB9Qk<oHCXҤĕKUHx@B(9'|9pʶ(t! .dhϤ%'][P_(嗁\$m)3)T0''s[ ch8Xp;!DK욪*[VRT׭&"R-fb~*Qv&i,$ ji: \7PDa:,ނ7Q6]0+=|,w$Pdh?U16C`&-69.Vl cwSLT8e3pj:x# s=Ns 6˻8r6:\n2ugz+mfߕ0J|1{sr~AY0^ZN? ȼ 0* $ml+|U6:JG3ǼFn𸫘IGcXЎϱ _` ĕ ;5[=! ?~f~a+[R<0ZYH#-V $B:Tbb$=Jlg#<&mc_qɷ'%MJXІmrSy`CīS 2cu ikoqr#i i52J6z;hPK  =LY Morg/yaml/snakeyaml/parser/ParserImpl$ParseFlowSequenceEntryMappingValue.classVmWE~fXVhVCnRV5bJV>#ĢH:0YWTFp ,( 0=~H0FtƅUeɇzϷPQ xqiY 5La$Y&QnOG KJ۰P;USZ ZC}&qӴkc>< HKH󴛦52ȯxh?@~יGG0~q"ٶ ρ- h/-E6_ Mw1@mnBXy)IF -ǃB_bVl;xu(pq6'1y; ?;y)/1"MX˟7ܐ,F \KDn6m0h !³%h :;ږe.M7WhRes'2H Pڙ&!PK  =\f3*org/yaml/snakeyaml/parser/ParserImpl.classZ{`?$7˫X R@iBR 4&%IB8NQZ**:1tηsso&Ms{Ig9Zc&Wz7Dc*0it1ӐS7|i 4ԩ̌ҩ7Fk()cXb͢xDŽ,L x4LLvDF$ S*C%: 4M jSf91ۉ2 'ga5i4sB +t-ӳez6J u:͕2<~ga4N48:ƣĉFY-^ !ˆT& kt:cdzu:-jЬljps{48uAP\aN&5\SP^js2 1?pNk1I9{'rj'qZ:Nčnp[4 "QB/6PP7>vXYi^obI6z'N5%p(76[[ JPswV@Cʒή)w^4dUbN֬QIsJ}wpT@5W"p8mNu`LֲGij`Ӄ zvQ9(heF_t|kȘQ:dQ3̪(?˻[U&\o)8;V2Q䑓;C+ w왳&d)mp 'sBQdp/i,0/}{%sawlox#I)U yٚ5£]ΨV pf,d˰\}r&uqhrZ9l+.Uf 0i8[#wJJcJwmݘvcA4wi#b[W.8dftLRF$%-Q~:_0 do6S=FXžW!d8a<'M靑u feG^9Jgyrh=Z O >s ҏ=EO0MzvJ 6h+m3Y: zZY۽`7\7Tn'\7q&NohiGcsj7g; x[ lB؎|U-7ЂVRt]1cVMrsj+trk, D]t@S3Q3IvY$?g*M)|dsC|0UGb9&NMk׫T6]fr͌-xa`rj0Z }+U x6&-6l5$2+2hl[-FM ' K+1,>KZ H; HQk8sE6|7P|83X8BLl9$`.lq–fn'B15_Ol+E0jkl17| := :Ū״tqM<=ꤾcBC$Tr`!(IYNm-[ȇ8lO֘U˛"[S_|̩+G"ĢsP`3Sܮ0S߄ɶTpama{â`!O<,d[ UЬ#c)H4tt ;t :ܓ3-"Y8 ŕAϪBuRNNu'T$+TwZ*.K]*FnR#' W,;a従R[!!ӏ-&yyK!-uG) ZXT)#TxXބr{͒\Sl x_#%H .ְ_˜{(U6"Y-+uP\^ L>J|^RhlV+>9|"$N e 4YfRWK7d{Uk<4jogA}:,+f'(upo]D{ ttSyV !h0kױ7y3KR]<ڋ]<9dl.J~ XWׅu=B>//ȘYR^YڱoMͩl4R}dJYX)Q8cRz3Gߩ:oˉ8]c P[:HKǴ?3Zl+>nHx3{%LvXcz(a/Q]`sh]LKILjFSTT ڮjͷ΄md{?4=Ccs !JF.VUJwPV>vPizhVA.YJG GT壕 }b<˨']̯`Eat4r^U}LAECz{%2=Ȫ-wIv걇dPB6Rc}sy֍fno!nt8fbЫb:a1[k0W쥾 ta'2l!z<1jt?uCaұ~qPBDe5ك7]^QɎɗIe(S椝NY} l6He9M:(;odN=P]4 >Ұ iolW1F8ˏp`PT #+F:]9F(kIof ǴPs*jYfvZGFWJ D6:Fb\WM{@ Dsv*cl#g*~F;mQ'(*~vkhވQi8 i,Lb8V`0d'-8zSi+JLQJ_a}=`9(B*+=R;H ; ķ7,{f;.mI[9h,O@% ,0>ߋrBErK(G3W};>OcqPX#ZJvϔaH7$t#&z|Lu#r\ x2h|S<.ZZDiLor>pYg&$@3(qg{\nW yNdˣztBL|sRW1`w.RA$VO695]n -t O2Xry[etv BCbڝ)mDNTǂ2Wy\Hsg1C^1ZJ T]{ەD6c97RybF;>F'cU]9FK[ >@OW6o<32֞,HN%U11KkT9k=&v5k2"m"tVV'4\eYlPΎ'P0PZ "sG&!F%[)`"1%ZEl"v[k͸9X>YLzٞ,sŋoǞ}}$=x>kfn oěx˾Kc7uX|c >uL |_uLDGq&/I';9%Tfkq:'=9j{SWEt}Ž,۹+bJZ˸_]O9&1Nz G5uc<4Z(0O'?y̅Olп;/h˽y oٰq5Wz 2帔{a{t_*1(: H[R<"^kHQad2,IMwM)4]2#Rhp$JE"4PgsJ,)S'!Rfz=RrH'zYmoB 3T&l蔊 *Yr%,(g&>)bKO)2G_?-2%'I  O?{I3闏 /2?|ĭ=ߡP:C0~ "+?7#Ə H#y?mu gxf0m NrnlF?cx'õ bx:û^1 A1 a0a>~2MPK  =l{rz$ ?org/yaml/snakeyaml/parser/ParserImpl$ParseDocumentContent.classVmwE~&It3X+ (%4A6i@"/m Fnm 6d7gw#?=J[=|GyIhܙνϽl Iunj .jxC@+J|lWt\uezC:0 ndQOJ Su0vє#<_zp;Yj;vpa:ez!5Kȥn{MzbEѺk֊lu+S*)0Hյmk#}IVEŢjw-l~:*"CXgXëuf5p/&j.'+)Qftze~x'pMv8ஆ{ WnS:\JԪXVs%V`jX x%p| a:C.*gcZͥpL],pL,Õ(3fo82 Wm\TC@A2,y'E;Gס$~kSZ~:8ILߧ:R^@(q!{9/ I<3 dͩlƒ?6u +OE7[MvKՖCV4q0:d7Sa'iq'΂eCDBiO"OHvN M2 CiL@:QG?N..Rگj$6mhfchGFz~zߣL{0<S.^[-> f;x}Gm,JFf)RMRNb(`6MQfԩCcKJ*~D}e ULkzxv&C_xtBfg6N K$5 "Bgi7MI=}HѷP> CG?.@ 4u2b!B6}DշiCGgtT'>p#~U~kpuWq c((N՝.MT5yfQQ(ē+8Or  0I$:ד D~PK  =A;org/yaml/snakeyaml/parser/ParserImpl$ParseDocumentEnd.classVVWMafE0I@6(@h@! =gYnq%.}E?N}ߥӹ"I{ϝ;w%||!K&1e\pTLwB )˗R|SWt̪ЍԺⶊ;**gm͝;3ӨOu۱B>מJ~̹S!sΒLյr*)B:42Z; &A8 F\n˃Q;| ṛv!oeEgt8AqP> (Svq`]]V ?.^; '_g% )8dۑ?`$`~EHp+@]d%:cgZO-*SkkcO){躖^G}Itd }ԍ~AҸA ԇe:?Ll"] Tat:p#D<]4Pȍ_ 5K0YR`tWq1&PK  =Dorg/yaml/snakeyaml/parser/ParserImpl$ParseBlockMappingFirstKey.classUR@6-B THxA+c20s &etFˌC9M+L ɷ9{.PӐ@ZC0!I S04QP13ry⡊G*33=Q2c./[V·&gNۮ,0dюdv+ޞU]Up|!Kw3Å-uc\,;Y䕊m/c}u-p߷)TSBZ^$cL#:rX-W\FolK1b o#&,] aby1m˫ Ze~:G\5tBRjOTS :aQUXŚuaֲY:1A!)/f8-w,3`H]6B`{ThIee9.b=SiZ*zŨs\UTQ m%+خon:D<}含KB㭀e"sw"L3dB!!Mp54Л.. ӻK&DЛ"i7C;}=E#Jt]Ї~ȧںPB+ MMtE*1q qu3f7/Iу?gxw (*>.^kjkj"&SXI4V[&iBedAM>=n\ˮrqũ=~`\U/:sl_!i60'?7̖ ֚IBqm5*ҔDcfU.8>;>!qS~vU6~rjvz~HS?dfڙ-Sn4!Bxqݘ :'B$gRPRlj]x \Hg,;]vp7֤(W-B\}^htA+{ !× 9m:Π_GRcT<s:池bQUx' @7:00w3$exc61ulj<- ,qp*iYS<հ|˔ aJ<~2ƒ->szx<}jBD~/EU#TOrD7ҥ7$l8d1Jqz,MDOu )Z=K)$l3>biRԡa!_C! _AhN:s{PݯJ|z>%wԐP\ +^hjI2.2r{et01b6J qL“WquI$&PK  =D] @org/yaml/snakeyaml/parser/ParserImpl$ParseFlowMappingValue.classVmWE~f7a2Hm 4$h7I ֶ46 L%ai?£l-Tzg)~sg>oȣ( qn$(ɔXEt\y2-ɌI$7+>45|*C_TarkƆ4Zmv,{2eJ%|o50K6y5Tp3"P*$3D3Nj zq-1kKw.OwM7ܜkqCMRMg( j "K,k/UbhSm p|8LpXXQCÖQÅohN͸&,!{ASv:e7%K:N` s6D? /_l!E!O) Sχx(.ҷ#%n8= \B'- {x?z'פvY S +`\J*òRcڏza8x(}¦]| 3!3Ehf'6z;ҕѕ\jn5 CNvvvFTFe MtT0+,5XDY32p%e5de%%22`1 8HAZ?'1/]?)+5YX@,V PK  =V[t&org/yaml/snakeyaml/parser/Parser.classj@ƿ1hyBҥ\ XMWٵЇ*nVa~]~G$NvPDŽFQ&aCx:g ]9cC_q4\j0B0,"B5o3cB}!a'IxgGsȤJ|Ğ&</N* |j5A_weѽPK  =T~\Korg/yaml/snakeyaml/parser/ParserImpl$ParseFlowSequenceEntryMappingEnd.classUmS@~.-_P/JZ BA˔o!6ItF-Q{it,43!{w>Yd35tQZ){3!R㼼ڬ#j:eS^oEwTG DZM@DȄ2i06;l'0FX4*~ !Hliuf34H*gHBi& ݄aUCY@4 bgȦ>AGx]P]~%]{wGd= } ' 1pu`t GSX{ǚ) &ŷy#9Z%h6S7PK  =" Aorg/yaml/snakeyaml/parser/ParserImpl$ParseFlowSequenceEntry.classWsUMʦ "Ha[jB*"-h)Mm4v7ppE@u7AFZe7C|pnH8u:=~}O~4bTU/h6/ڱSFG1Z ^GH=b^A>q@F>z+^BXÛbBao#xxмXqK !q1E5Fde2XC1S7hN=u|ojt@NJ;ӌاB+Uq}KDw$,cA %L-LMEx?K v,}'*rwfWL]6KGO;&|,amLSPPP:$0*Q v)0aH)ø X &q\ gbD'N%UM=J~Uʹc)3DtЍ`f0Zb0c$=G9V'B>aXDnpY5&n) Z,|/օݐa _2T=ޮ'|u S\~QOS^DiV55R,R3qf* yꂪIEI|EMԒ "C<2":@]XhuAn%,Н:NqY̒Y6/ڻ)+6IYYT I=ɰ4- wn S:%D OCXsm@ZCvpY^G,񦡷DvwѼX4ZjMDc)ܴCda42it/%^ ,/;Ox!QvǒG%_tẃ{seG(f8-^j3( *3SX )MaVNaVOٟ`l6̘[0sn]dbf{ V\T̠pMc,«ςMFJFTJB ^H'JU:t}Y:+>e .d]-;;}$}+^0ޥqV)-&κroYs+alҧ~H'EjwՎ_>?PK  =ɴ-\;org/yaml/snakeyaml/parser/ParserImpl$ParseStreamStart.classU[S@6B`i Ee ڄIRFI:adx6 LJsv;={}CF.Eo++oU\ ޣ8'H;|E+=+/heQcEhV3?4u!Bu}@;GNكqp7(vh`7&l,uh([V } zH~i4m__PK  =̦,org/yaml/snakeyaml/parser/ParserImpl$1.classM 0h5Z zťg.Djk ^ͅPbZna~c{O "ƒLn % ӽNڴղ7᝵Δqη9Ä06wQ)nO (ZڕIGXXʬ!0  0}+7ԪPK  =1Corg/yaml/snakeyaml/parser/ParserImpl$ParseFlowMappingFirstKey.classUR@6-B \*ETTe`KȔВt6)[錂QlZqdZȟ=gOmחoxAh+-5#!TҸ!`h b\C+&r[wUL24[0]Q0N^̅g E wʥ):1m;?ːL;\g.CGvg KY:K\r_3FeP IYr8X(qϳ9*x#>J- wbDk9g,IA&-ZP=l3֤Rq /C+\*٠ی\ VilYꎿǶ.q::}S:1bVC :"3LWNvձJ:0s2dVF;ƶe ([.v4\E" ًXT}nųj]>Ճy&C`V%uvtCKתU2x!W|d V}n)i)^B " \41Ȕ+Cw" :m?١9EYh7A;J:@=\0PM.uh%GFP@4`H>@g4Q3>}|E+i@Gۻ#((Ѯ@3pSj. % {t0b*}V?*#!* aǃK:.e$b-OJPK  =Ћ Aorg/yaml/snakeyaml/parser/ParserImpl$ParseBlockMappingValue.classUmWE~fXb@SLv5mm T#᭡-˘, M|@? (nP1;wf{ޙb#S0IdbB6.h=8q'<ͳ̀+ƠZ qWXL0ng<\CAfz%2ņ[1ͺ9fMZt=Pldqvl@*ٝIjE :XWEQ5.kuZ9QlXf}tmQJ`(prްjsfi;ޢ}8ʝw8QFZm,r|6KW3<oԔ#0 y2y E,uIUwdJY@hi3̓77fmNü,jX;"Da)L븅e(c=|)p5NvZhS5-(5X:֡t|*aW̓Q7,_ A_ve D\y݃S=MRf^N02RHr戒EYIu;{UUV-< ׍Ԫ@_E!_7x/(򌳾csquͭoZCR?gŃ]\0p| r)GO'6'!T2gAC/*v6^m[a}bġA 1$MSv K0-r?Q/r5`ds$퐛U!tJ9MO@tx@A>,c1D9xF0ŐçPK  =*org/yaml/snakeyaml/Yaml$YamlIterable.classR]K@=7iƶ~]wuJM諊/ Eaݡ;nL$M"Gw~4 wΜ{ϙyxe%;(ξ[XO¨Jd,(&LOĹ "dKBse;ߝMvl$ul;{8 ~(4;EUz5eKն iGƇ02ю"8,i;WLۤ2 D/tDe8{i}xB {C &~<.(vAܕ{J54'.paajouC0z3M ~"0c 8v+XZ7 z!5^+ye(j/h_r72<\g7Џ7T%^B~&#[JIڍ6E C-?BCl%;(R3|ؓ#v|hs`#`e.ҷ2|i99 =Y(Y$$͗Kw`)#KgU A~ 0O[#(R[)-]:Tե[7zMnD d ޤj-a7Z-a DRҦm_1Ջ+/wZå\ f PK  =4K6](org/yaml/snakeyaml/nodes/NodeTuple.classRn@= nKBBskryJ^R>:*8vKD $HT7(ĬFDfgfϙ3_~dQq/ b #B %qB5]Wdd ~t!pܞ~f-ݳ J Ϧ+O:CzhXҁiSgץCEXsaڼ=6eԆ1"${c``3=;cXZ8BlДiֈ}j 2e‘-Ok` { [3Z3i} i634[}ס*XJ <L]Ճ6Yꡂx` 9Mwhw/Ȑ)i/K`.F{rdzsXlmHd7(Keriqn n'`'ZIܨNq,ATD ;aA%L 2G.i}vd!#y$\"3e'Ԧ*ZPK  =>A ;"org/yaml/snakeyaml/nodes/Tag.classWxG'i+ٖmd́-KB'f,$ hn}Z{36%BH!H bHOHOHBfvu7Y=OXÚýjpH AƷ}\2 `)i OOI4p̏xFg,>? _%|iV9>e+2|d|o&ߒm..+{\~_qc??g2~/d_5[.'\A‹\9cQ.Y_$#KxI?$S¿$[P?<ҿ91Gݧ LF[7] }qTٮYv,<eXd耚2BSBi%L(}um$G. h8%/Ca:72#kd[7G$@h,<@Kj{m(._b^p8D#]bn{5MhzTM7[_&G5>Cd[7t?%[7ug–r>WosR7lj\c긡qjlWmZgBe5ɰ|.nW]E\YH8^Yv=Z[]vh@r2ՅUN \i+nܲ4դT)U`T1 FR8/-slNlde)l19͜ b:DWOnzJ54mog6Qdhf̸17^m3K)ud{,kTR*8}qK4zMhT^JozNkfᵫ"Eףg^xW ?- E"3?x–He\ ͽIa_9q4G=vt+4l˱55E;W&pi>2̢N"˗ Ys{J?Vf(Kg ~O$$p1R/j0H_'=d“'w{2 O+%,)g0FjlDa>Q?(MA~w{>f= !q>] ?FPKXJgG cB.BFp%jr~kUd(oPvl([1{l sNbAk$,Mb'5~ch!Nv"D1#!ոοt; lak.¶@`#< qa\B0.%]8#9Aa!1Z`m 7.: _Z͏Hdnw8Mq4Dc1ŀPLaɓ3+&qch΃M9K]⍸;yǀz+]_"mc\;4B),ɓXgO9DCh8SO#EғJތVK"7^]OǢ(VF]3i`KW[іIۑvl9ݒ8nQ@c1ND7Va ZIYMzWE  Gp&Y88/`^ݬ=l6ӱ#A/ۈ>v!6ϕqP v^h}ޗ+Ust/PK  =CzI*org/yaml/snakeyaml/nodes/MappingNode.classWwUݙɼ Lnaf&#T&v2ͤ3{躾]_]{$9sGu!nݺ[U2u}11DEY1$Ä fNj$ʭ`JcX' UN@8%GxP8IiN*WS8R Oa9+UeݩDfa5#zoސfmW~>\vU*" pѠY6c=Y+uXMŸ;a:-߯OMāzIa*méX'"qu6.s(}1;-V5Ua|x#SʋX&u6Ls5z,Q2\nd5P|~9x [ g4L|l5'1|3Fc}/X=>CPQrzT-ޚLc /Ĥo¦e4bǼNQBR\Nΐq*™쨔_dAe:J^޴TK |aܢ N|.R)i5&2F5齺3}i>3ry&v' 8USb\-'bᖌ&~'s!i P*uk6 +cK#'뫹 -uwD:Z:rso>Grs;?%r! c;.$8^VvlFhV&^C>$uG]>%{!MJ{B@ţnMbi-8K'Á='o4'[sݑ:gx҃Vϸ/z Ƶz&j( 9K" ؖ:jŲ2T_-ٿ{`dZh}xrYN-,~I1]P3dOØߟ >gPLAQN-wLn$c/PTqWT'1 hkS*Nᴊ$Te1WU z]˚sL7/Jf=BINIΚ4KD0]ceT\5SVqVT8nVUJ8/AR -i;Ci.1$x76u3 r,ݪǝ@ѮUfř@!(#|J(M60B5:Hv2 IKС"]B"Eir]TE7?Erqc䟡8BD\W(U(~ҀqqbǝDH{eheN(6RG q[ڝe(\ i 2Z\v  8Bi+)'"nZs&ٰUTKowĉ6Dn6mB x6N Y2, FDEh仺GAw'YX3`[-O6$f6a Sk,Ep n/C᧥yݭ_Rck<pt `5y^&詡:|$D }[|&^ñf3BߐO)w4i?М~QT;x /=@gckdma0" /wPK  =wwv)org/yaml/snakeyaml/nodes/ScalarNode.classUmSU~.yd]ERXJ@ZPB[iDzIvm]0?:fڙљt'3>>s6^? ~1Ot% |#ϲ$2/sY\Ƽ+:t\u,eŷ3Ç/3X]  k .=۲J^Zx,YLm6HۧDIs<'ZztK' y~K+^>?(ݕӞnd)0xrcsV䆫UsK;+$etD$_U F2XhWmQ}wۮ u:ɐ?QduMNduUbrv5S¶+1+~#ڷf1,3f ܧًp?W=ѦS 10 0k;9^o8n՜U|;kXC\91-jl6m*$M.2xf8sl}9$'cXr"o%  @[Cֻ=ս'v5n!MɃBѐrsMk z<g?+|}S41J6/L%.ܤU 8Nh>6YL $b:E(HVHn}\r  hdX*Id)S?e#4]g1Eit1fjZ<8':bj))3k#U mBi%A+rb癖sOd;}|m_.ӝ7&vdͺvVh҃7vr';Mr'c|僴4ng}f>RV PK  =: +org/yaml/snakeyaml/nodes/SequenceNode.classVSU]ylyJRHI DZ(  sIaa٥ ŲߜPϽ C'{_1|F?ސf0Z0%,Hß|y+L!;X]Ǘ a} с??#OPDk8[ .X{M†M޶ЙPvC( )Yt~<3\杉IRjQ)t%GYrCGc5Lִ=eKOۆ 0 ^U d4Cs&O^ReZylz|ܔibL$䐡=BikM58ѬWecufvr9^I5ȗ(E3{Tw[{rx MbTʆCj0COuV)^f?m4'r]3M¬f3sd UK+N epQRڰ+*"bhўa00稖ݨ|FlɖKwnus3XQR.\sfʫoJlriW5Jhjzk7n;i0ӌ1͎YdL(7%cTHe &#g5 ɰ`K vd.åS(c3 j*izAO s_K d|ij4InTHܤ OLʘCgN4N6u⹒V3< ׷4Ad|̵Uc5+40Rh=Fb/dOrMuw{ i &6rTX^xCC`~_5,'ED-T徧890\o~6jtbw~rq=ý!XO;BJw>Z]CJ#_"Bt/'Ct?k~#R8EX08C j  Z_ Z4ɇKi\$F~$9a,uqa.EQ\-)!U-2&h6 uӵ|2>Qmz"" GE"1:ÿsc'mBy!C&.!HWH5D)/7)Mc dQK-ʴJZTs|J!?B!:t%}DE{\S~VwRsPK  =^)@,org/yaml/snakeyaml/error/YAMLException.classNA6,f1{"!0g#KѐC 6-qa9D,!p(Q HU]Sy}`YQ22od%B(~]P{m}a TqչC5wzs!+ uU=TF! 'wBO /h"N/ ֽ@kPfB@'WMq a[쿶:4t!v0MX(uSH{&L32edanP["=@]8BF6QJLy vk{ޓfmd)uqf$aM c%YKZ~UZ5ggS"9@C-l sLVPK  =߁ o 2org/yaml/snakeyaml/error/MarkedYAMLException.classVMoe~^כ&iZ4&:@6mZRi\S{7״T\zE\qN$*!H~bI6<|m-yJ@:g*i k[k%txt WVl6 -ۼkIr]-٫[Ѱpgvcz 1 >]\#sF/Kt|ӾW}!_+pZ 2j{ՔC:8聃&-}X%MP SPC-y@q }e|ITV#mG~=K<_1KF2 ׅuF 0D8;Zdfms7"JsPK  =u _ #org/yaml/snakeyaml/error/Mark.class}VoTU5Ӂ)(L)tY  V A}ym_;}Sʤ&bBb\ SƸRʝ&/ . Es95=6a+Έ%#A e8q6eĹ0c4LX.F=NxU쯙x! qX&&%k"'vĤ)k 뚕[T\sܩ<;.ϔ=[ȗ\ IS`$$: :FI5c &l5V9BҴST-SRoXsTѵfm)ٞWR7ˢ579EϳYӼO?OXu풂D:^ ;.s֍NDt`bJd[9QmCb9OD}e'=[YY*2]=脔 &9 e/k8!ѡ.>1A-lGk;&ԝh50Asح j)k񮮮x"(b q!~%)w%>F+b9n|(o3.'1Yogg]a'u Oْl ZXZk{dƆG2}# jm5 N[ŧ/KN[^F"N e'\UyOnI 2V; wT}M(Pk;h7$$;H6/"PM"dL_ UZ2A2zĠq)?(: (NR)BR! IIIӓ4{@alt&]}&`) J]shASmju[zz 8j>DXǿF#=ڂE ]!`]~ P"^_0k{/Qi =`w8|BuD/.64q7Dq*|׌>ؽfޔ|mk^@/z88K1\I;8w>@q>7Dȟşq1?hbo"I$C2-R7mJr5k>VTIV!#ݸN( f$7AuʹlY[4tFCOͭKPWx1g06L,˹xgIL8WUXP9~z(_EJ~FUnܿZj?RMɚ`u5S+PK  =2Korg/yaml/snakeyaml/Loader.classW[SGVF 0dUrAE"!.HDIVs2̬3Dr3WsSTR覲U{~T*{a/ú>;_Ͽ`_+8d#:ܐ 52ed,)hSunVЈenfMaEʸ`lX2)ª7t㎌5Q>$4_e;2[_0 i2{2;s5dfg%ڔLǵs)ײ%IXvZ[#1[L,s&7OIn3ʬ2>>];Gw]=̖$H%46Lp4 "" ;fs+̾꭭-ân)aK`}7;=ts"bh ӵ-'<~,ośfX⦾kE z@F7śJu%ܔNY+Yt{֧IC>2<ɐK마`۹+3˹F3YˮJ,t: qHm&~% he9s4?BP!85+>=o^}1U5P+Z&g _e O3E.R/ uXR@G2Q#xC&F 5D n Gq =N#>Ѡ"5^@$Ƕ<6p/>ΔORGa{91)bTIl |ېd }yy4SS|R0~?vҽ6'c5zzE PK  =hvҸ-org/yaml/snakeyaml/reader/UnicodeReader.classS]sZU].!ҒFSGBKhI$$|P1{3p7|]_⃝dvڷ>:s8#3g^{Ovq? &/KXa|Ga!hEZFn D,c,}+#g9Q{P͎kE#Ui} au%6__rt( J' vb4,, LFq-+ZekVtjx٩͊Z>pj{V[ ]vF̵mど,W۶)B};Oώfho өt4F z d7lz(pkB:-fS V)~]3;e @tڲ>:-Ji*ժ=X G4%uk报[e:qQGY:Nᴎ xKέK lO狞Y.`M]Im"vpw]l39 b8cH!M8 95r } Du)iUAUO;\g j9~ ǨgzG;Xg.c둤XiПWMK%Ll(eDq7:Ǔz QױNIҕQ-6δp)$M]Kd-n#k&mL 2+c6hGMb%3v2I ԳN<%=2~ez B{!Od|dcT4NmM Wq@’LZMjJQ$36ըRƄ:$&ᡥ"㺰Ǘ2A }!|%c 9Ӹ!Y'|-c7Copo#]J߲TEx[ŠfhH/RSe y,@/tHkt\4ƄP,(î')k[w % R??KS)jD+D4DU{6Q{f&˝7s$>-r)|MCPO'V~1U͠)̋A}ybmkmע*D1 h aX Z@:H6..x\>' P7rNYq}zW!H@uT=9Tj`sAu?nrXTU3[8" afT,g;Fr,B/D$V|Ά7B*:b\DIp+u4j+.aY|e"d@H:u3UK.LyO{n6 '|o~SϱRJ2G=B/b(s#5`g-n$uHc- eUyZY#K?CGt͊9^Szr3ki1,Ý(x+W-GӃ qxa |ñ:,=G6gycXDyl]RKo,P?Ȼ‡)e}N3qK=.`|?nz+%kA60[K+:ofoU;̏5]z&YvwO^#U,D#d <7bzP]je?x:(g?`]d^b.%|D5|2$OUR:@OR{^ņ3?iy]F%zufᴏIAm򵩱fur[hv>/R2 ?uO)O\圇r/^[l[]VkY8QPK  =TylU/org/yaml/snakeyaml/reader/ReaderException.classSNQ]AJ-:\Ķ\*WRS|i㡜v3~&R& >79m@|su5{|  $f1+9 )p"kP=u<ɇXҰC+E3w"Eg" Dͳ;g;%!x)g-ێ0St_^K_Q Ğv0>L7Z??^6%QԈVԮnk4`*Ħ- &bFM\I1\:V++3^(55Z&`UÚ5l Ze4X Ĭٶ%LL˂oaKqځb :tP8쁉}Bn,ujKrR,#&`76/#[e^< +Y8@P^!ZpX#!PX_HDf<,V^A*grs1 iLXXc]siSؚV97g,!5"cmC6yPK  =eP .org/yaml/snakeyaml/tokens/DirectiveToken.classUksF=k˖mL>! qЦ'0uqӦ@b/FĖ<NIJi?~]I83}={^p?%0qcd&B b2%䄵]z 7DMC!q+E 9CHӵnV 61\rpK$;ƯtaT{RNTo4hKo/7A-01t\@߹TV+y~D(Lf,a8Td~ @IѾd%E}C?" DhͧǤpv7^@Ov쵈94.| 02CV9gbm}x?PK  =eA*(org/yaml/snakeyaml/tokens/Token$ID.class}S[EƟKByhZmH cӢ]m$74/T|0~v:::xaq`X`g=0 ~6;XvfY=Y0|0Ϭ(,0U%Bybul(G 5fSaR2 9fGay|w32Еn׬V˦BYIXZX|Jl3٤_)7ZQ>9{<1s:::bj Ĥh?N֍lic@((wӖ|=g,rx.ᦳ$(zEGyٔW,[5 M۪Kx,p۪X-?)< ?H%x{4WPuܶvkx~E+xy@ׅO >~y= !;>'P%ԟ{^B@@L+&$&-GLOLDSbq2O# q⮙AqŽmč{ !nwSܘ+n\ܻfD܄I7eFM{ό%'.a<.=%KoEOs).ŒrW,4@j$\ N\'\.nz\$'D\LLqB4!E/T6bt}%|!|$>|ӃPK  =EMi6org/yaml/snakeyaml/tokens/FlowSequenceStartToken.classRJP=Sccc|շXHҪ[EK!Pݴtm/&x*\~87)nYs`?^c݂ flb*!}ntL8-5uU}}'J*Pr`]Ii/jKl#-!hDnH88 zu/oہ; 4~HȄ6F(#&֕L85Bʩl:DJU*")ԘjՑuWr#qm'-9Z/a?|9c|8K&wcS0 F 1 SLi4 懴zf<#řBg'!_ q\D6~ ̝~PK  =E\e.org/yaml/snakeyaml/tokens/FlowEntryToken.classR]KA=ۖ}YFjlD Km0%Џ"8ι.,Nb;&vMdF Wf 1z#!e \jsʥ6qCn4t3rͥ)hDnP8  /x#9nƐ #.#5p"SIpz&bNv|_k !?RS'Z>ɮhjoGm,!ac9Bs3GhPXd#8b`J;Y28y|rZA%CMc*h"EBfJ[!jb/3΄Ϟԧ|1lj l\fPK  =5O&d.org/yaml/snakeyaml/tokens/StreamEndToken.classR]KA=ۖ}YFjҳ,X/c~@?*3D;瞻ܯOg8``;u5gH{_0\[8|;QBGBP:\sʕ.!q7OHs˥)h^P8"v,] (2V(b0EПZkob!6l7l< 9.W_&Zp,ōX{OR6Q`(/-4g:|}f E6Ha/5)s O7'`aE_ )*N_4&l(R䦴5f!2LiI}ʗ[ٌePK  =ws^_(org/yaml/snakeyaml/tokens/KeyToken.classMO@߅JQD1C 1I#zp_`&b¿R/&(q234 G 즱=& +/kr3}ġ| t$ 堶\i3'M/aG5.\zI<;{ d-R( MQqF51a#CSYlMUf| 6gty>%rz6j`&PK  =[Ge/org/yaml/snakeyaml/tokens/BlockEntryToken.classR]KQ=W77m2$$4CوJ ^luz zW)Haf3||8^ 6XŖm9ĩ;EAṁ^-+t% dK>]0/-aW6zdZA{.Ft ~X{GrV@!F\Fj# I @DaM}!CAJK迋vhSwHĵld>Gna 3Gfg831EP_ Lh&RV=o΄ Ϛ|1du@Ffts_PK  =Rj_*org/yaml/snakeyaml/tokens/ValueToken.classN@ƿ-JH 13h &MЋ"6Jx|(Bb,=LM2_Ngf+زmĐ;C?9gu"9t8p㐏t5SيCq3~@b'AK_gI3cÿI4ax0]7qe1짨aD8Ch7`xm C![cDW6ah"ĕ6(k-j3}x#Gmq;n_.jҾfj plf(" kc!a5 ul81+W~.YMʹ [)@z︁ lP^Ça71 JKדQ_L!SfQ=I^?8|{ ffȃP@b4FFyQE 6)liOH<|bZ13/Ю"ftNPK  =x++org/yaml/snakeyaml/tokens/AnchorToken.classTn@=8qb  %Msib.\Dh)%U$$^*5qک_VUEiP*2ݙ33g/Ô<6Bv.i=MTLT2g G~ˁ +/\醯:m_ O|9CYB)_9\ ]W ƾߧKmWwѱPG؋{rj?947`؝C!){':uBB]asN; 867a7fe\ŋMM5 %ܨhoƐjPLKJ=bJƣb뀰?V=3/OLЍX ӝ^_(SE}ic62\?lN bhZf)->5^SQ 0o '9' {$@ߓAڮ/H}!?et l 7ɫw ,"k)S[wJikI%T!D6:܊cLm`2I0V2j R0Jp.M5^M&r$7H>$@|2YxPK  = a-org/yaml/snakeyaml/tokens/BlockEndToken.class]KQU۲2 k#*-XnOzuήA ٣A{1gw`>>a+ ),`ĺ!qxNxB8+5}ի>[ <їړJz%T6\nߕLpp+UKܺ6pB9Q|,\PK  =vf0org/yaml/snakeyaml/tokens/DocumentEndToken.classJAƿce,# +Q6Ȃ&~6ufנn.z*:3JDDg|o !p\G cinA H:K{ 9 ;iJ^ 7R7MFЁE' "B7p=HN(5B*͓ TQo+c;.6 N|>(lewѯ36}u[^fO;q/ 6pL 1^K%u#!C孞rO*qMG"\Iy<䉴~2t4SD>* <dX\H΢mI,CiylQTF$.bfV 9W0RD0KɁ%xx ʝއѩrړ.]Z%h +Ea.unu O5*?/P_-݀Cv 4~H7ۢ e9Q9,GVD1V nv/Qr+ '!=waoyPK  =Ph_i3org/yaml/snakeyaml/tokens/FlowMappingEndToken.classRJAk55шAD|/QBb>&C\WEQb$B0:Ꞛ*Ϸw;XLcuQtQ"dBZ[D:> s7%a*yvws)u]\FLↈ.ͽ :U^iܖ*OTކuurI*tj~%,Epjvf-Zb /PJH$d5+k豯*;ݐ'R!tZ zG/lROr_ 𲘓]pv76_Av`c3ie个t4.<0 \QLvi97gbu] lƄxPK  =}ug5org/yaml/snakeyaml/tokens/FlowMappingStartToken.classR]KA=miIHhF(:+kѿ^ή5;g΁|{Pa1&ƞ} YX%uʑ'9|,JHJ帶d\1P0Z#nf]޷ ɴ{\Z1}w,hCO3\]Ի GK1hɑ9̡Cl0Y sR*(]4D39MK-Z\ :g0-p\-C'=C/6DӨSN(jԙG)kg`*$e8HPU_ h4X'UmPhSؚV(Yox>="2fW/PK  =6.e2org/yaml/snakeyaml/tokens/DocumentStartToken.classRMKQ=W''m̲$$ġ XK63f W&hGED5q΁ )Lb9[&ĉ)xb(J*+Ra}θ% / ɫZ1m=1 ~j?Pz{v(TX t%QE0ןrMlbN`9'Uc$@r9%ɴ?Q=yj':kNXX@ \9*u_ K/899Ggc13\k/E4&,DW\i f5zf L\%h/|$}n76":hX1w$n$Utv\PK  =BSgo(org/yaml/snakeyaml/tokens/TagToken.classS[OAv۲AR+]*ؤ!aC]mfw+5ZM( .wg~ VstyQ! J0 *JV YL:1bݕMoۦﶄ[tlQeH/Z/3Y N)]i<͠ Jon9ert3RwwͥR[^|1 Q1YW  fm4sd&A[8>e8Jv>7m4M_ZNX9b:3$jdZs!my‹ Dm,ՙ| k` <RqR,1u<1PE20{g` Xa<5;&*dX;uo%uyCe/IEƖO{FS}ΝFo{{G#4ҏӇ p5Fyn</'0J W5 {|\"嗅R˄t{{L*Catx96zȵFA +bO$_@IuV dլRstt1p<(( -nDQ*QWmgjm)9zMPK  ='x*i6org/yaml/snakeyaml/tokens/BlockMappingStartToken.classRNP= V|"1Ān1F4A7Jmm1ԍ ?2-čDy{N2olb*!yntJ8/յŝgɸJʾW3.5 F%HBג!Z#Z^S(WCЈnܐp<8 z /hwPQCeB*ԝ~5F~g1FH8UTOdA;/ NinGk=$ֱA8[68F a{^B?|9|8K&wݽWs017 iLXa]ri3p3odc>k0%Eⷉ@l PK  =( +org/yaml/snakeyaml/tokens/ScalarToken.classU[OAUr)˭-Ep(jL$mlvK»?5RM(ٵRs9g7(Ѓzq7J=a愹| !<"x,B/ *zȭ/\]Kc7?|r2 /a&m/!u i,$&Ȇ&\tVgHty-GzW-Eq!009D:e/*T2 }4dc[h+MZQ# ) H+.}D67 :F0;| %ۯC= RDwhq?!y,{gx$Z<3 #!)2WR(1ɋN5|H.f$p৶\I;4ȳyŞ&x̋&M\ij;S0zc3>̌QޅSSCӋՋ镡PK  =<$(org/yaml/snakeyaml/TypeDescription.classVSU- ِnB V>6 4?Z@Ki~-! J}S>8}r<6 Dg={n (2VЋOyXA<3>Em2Bxؽ~A%#AVa;l= #ϓ0 S.hOtaz9(,hiMB,oGf%ۙ+_]%m=O\qC/ks ˻D;s[/oF2u#=}*19z*l>=s`떐mߔ]^lv'Lʱn-ILɳb^Q_̀: L{R 莀<{TTj=o+csm$QQ1' ;I8I@A#f$@[M%n Vy;ekbbnw .mq(HT:\Uk=M 0@!A OkN8CZA D {4p]ToꦷVL( &>[t ~T&[Z $ٗ}[B^:Sn-z^%=ti!T FѲxx 8Hxf-H? a6'!W]dül: d\OAJВ>@ uZr ?5~Aj' !] a Nl18QU[ڷj*2Rc!rsZ"ZÍUqcUӀk}Wpp(gK`1mGV1#f )Ҁt,j)COiM"`Dvfœ!jZsPĐIprІrT4JIC(TGu)ՔQ/+Q[ۂ7[!|JWi{ɝ ϐ6(J@,0rQ-nnt=͒6C!&`_/qޭu4ꏿiO8y졼+:d#nj1AG*'\*e/BT`^c!YA ;.ؗ|"gMR^>1/M7-W28ݙ\Έ_V|)mHY.I봘ݶ)b\ߢ݃SH|4ٶ=^Tyo'&fWK9{mg+c1irB=nc}N-sj}#?ȂslÒLWhs258a +02.PK  =R5org/yaml/snakeyaml/scanner/ScannerImpl$Chomping.classRMo@}k;vc6@G@(0=@ƬRTS/ā#~ .;ofw{3ڏ߽*t\2aDb*n`r`hwqaPDslO[ڽ89x8iğy, 4(ljXeПSѐ 5sVQTt({ *i{}fbߜ@W&^Q]A=7'TXԏRSe/8 Hj*9*,az@Q\_Cyޠ._r h)%'ҝDž)*ģmR6++8CѤ;-\PK  =yI%52w,org/yaml/snakeyaml/scanner/ScannerImpl.class |E?TUwOg20!r W 0$H&1@PtUQP(z뺺xTsd {_LuwuSO}s=xNNay T"T;@'|= v!N5:xz9Ȥ"XssNH#a$;QTv1D˧t7TP1B*&R1TLb*Ө(b:3I,*fSQL*RQBE)eṬb>'Q BTy,_%|i,˨X+d?tUNCTTRQ^ZzֹOh0XK OkE#="&脕LT69i:? |3M z 5? Yl99K<NE| ~.Q'l:N8x};N8\鄳7WQN8\?Z'\uԨ[p _˨~+F'\M,-;ӝ4u~Vc[EŭTFE]wwtwG{_$ :~NukTrGp?t'HO)"4zF9'L_E*^_:M t_]'=M;=D'?#T|;KzJ_P1G"^uuPhfN0, .4]8pBGe1hEIESDS=u^p"E.tG}u~HE.4j4鈰ALC7C pa",E.r))1R{2(]]|kC6,@tQɺ"]L Eu>ZbPTil6⛲y+gX:Ar:ψfDwy|O mO`0ca3V.1djьe  Qv1 }k@ScǿvDQS'T. 4 &!9\Ѽ3pR?7HRZSm`YRװv&Om͈FgW/ihv|>JU'm,ns1 ԭJ|6:0ڈFt 5}*?aHCLmhlZT@ u߬( 4jks}kv22bE㡱C*7&eȥ&19nd-FUyI|~oYSjoCDK*=5= >z6+@(2嬬Vq xt쟹;Q)>! "ȝaEЈZ2[CMU{ :ZoV5xM 4kz@2b$F`C4<:دzۈ ꐭD90?R[%hb=gZ"ľp]ToSaZytx05IbS(@omo]%3$h&uh#5xOm5xQ4!tq57w*6=Y,-Ӱhpxg4u8OUT% _4բLN~S C^WYӑʀUϨl!L"a{RX2$OhV=}DbZ*';L򢈠_5'/eljj:1m.% CfNXpdCv3M%O\oF)o{jU7xi{(Ґ%dR̺*Ү`k<"B\m l"[3/DvO뚤 bv6X_H'n"B*%&=eUƀ@ZsdueLgk"q&ŋ1d T&{UV4_ᒱ63HV`9nhz֑Zb56 C@};2-ˑ=x=mgm$LZ_Ev#Y dg/S l./ Ӣ(*oMʲ!'5Z=b|A70ڦF)i1({֖7240g0qp1$ay|V 2tJbɿNzB1lDYqƏC4kWPŠXk.9lUԠ\ ( {M> צϩ^i'Ǵ:@Q.uy)dgYQiIQ;ޱ\ S^Xn$_qڋh*e;|zj\ͧFb\-4mOҢ;3*'qYNKfN 1k=1f /%AYP h֓)v9F;nD%@0qk}~?}"iiX)RbQ4$ *3}Q|'R.L.6X)+sT,b 9hAg,f23}blc[V4VcbKtx950 8DK1W`ݍsRQrcDgKD"bXbQi렻atw3PqmTA!jr=Bww=TK*b/hQj|DX nC,v%bCT2!V4SJ PYT`]8"UTx]b Q5wn£ixe$!=PM3LHe^iqNá+e=t_HCǿ‡%ֹzQO.~.KԡE=[ R"&IoDeZZYTSN6ףV+fїLK4դx(%! Ι2h1J15X&jVjtZ! F*@jL4jmp%6.qa3&dFU)!]b8Analgv#8̟Xnt3e r3,K1ӉcCQ؅߈wLH́FGXnkۘw\Y2~|;o;5m4{#6 >oc+U]nuU{PbWc|׍t6n5,Zcd9&^aE[.%LE=,A`ŅL>G4d)w_]}R.!/xUVAC^^!q.MK+y.q>>|8O>7O6hU.q l'Eb$سdOg0R Obϱ^Y.{B*vNd{KL񬮬Y[[_W*z 76Qǜ?vӊϘ9kv%e柴`aKV,õ_g[LؾSS_Y *q96୽~䦯n1"`Y.q9b^a(p@԰;Go% S#aog\5ƞp'E#2C(WՒ"6<ҡd(kc+i3tGV }uHymE!7Lʉ{wQ YlRfa(a#[̮ۖv?]d]?bYC\׊\g̣jV ua#O! b'rB&6R`nRXDJƇ9X NQH5jX6&YKPő/0,5^L7✬N { ZA. :EyT6!nuDCv%]=Ld\ezLEn n . ͞*oSC_($;\\!46-AZ"IHGQFSѺ42d`ILE}Iq@vBWFx=4 /j[u P_0bD&]6d[TWS/7dP x|5Iwe.rwc|݅0o:0OC++.ZP!u=> DIL M FuȲ_<\bh踷0 Ų|f8Ү)q^pv>v姌?5o'o.qP<%a {=z:##?𗂿AH=@=zŸ؈/{@giRfqV1uN[\wk(k bF9)2O:MEȨ * F xqҜzefu9Ԍ gbwZH2t"/[l6]k6:<5tbb(t] n7uBd{=PgT#yfl a߿##PF,LSK Z=ډq؏/h׸>Y2FiyXf`>)'H l\YzRx<{ݦq75VEg̵:W*:u HcS>zgd[cC\:/[TRrZ%e3-9^6)Occ4; -"eU䡨{1*d`{hq"5jA[abqKt,/ {~u֑F⍪y;G.iY 3:n5X1Ahfsʓ|hQyvw.kB6ydV` dqԒx)*p(GtRؙAeSOT@ feF#1#FZ/}H0#> 2&/$pA?{ ns6g<7D^KYcv'oYмE[b_Bf2Xs(Z,[NB@VWWC>pClE\ zTC}dz'G:Q8oq@3-gC_0C!^ {)#dalaU&`^:~7VsT.!ãTSw(_j QZ~蓬Fͷcq=~gp0:` <!x3g@,5 0e D|(/A[w*ֳ9Z:se؆5 82n=n# q#Hk^JrR_~$l9 {]/ae j/~H lPhuxFTdQMET -0/#*FQ1>DFBޏ1x"̧b, .ߗr J„PT&2(;HSf2CR`d L%mV&hE-ёp0{?P̩peVlJexga IougBMt}/?<F;3<xLX @ _x%?XY 6~61T6i,ű\֋17Œh֟ail<,$kC.fۙl Y :+څel1[~d[{9l5UVVE=>V-mbh %1b^4mY&cM&c˨E~ iCo$㮂jUR`R?Q WSB4-i퀕JrÒsp.RpZ=| Szk`.!.E28]M*ĮƕŬ.gl;`;g4,P*菽\v NƚuעVu3QsB rm|y[HċjzTm SZц!*+Ax(CܼejbW20bRѰ$ud.{PGB{R4Cp.{Tb3(q"Fkk#F_y=zv1FR4K_FaR0 ɉԗ^A #y Wça{h/EMz-qv)<)Drj.e_J^~X*jI9;"7N A7ag~~V E} 9Ŏe+_*]J+x [t} ,0_! _C-g߅3p95ȪQL DIZ @1e`:vs9Ṯt&̰]+8N_^gZ) }QK L@2 |Qv f7ᝀ"3{p*2FgDb4[˩ H8*]6(/BPN!(Fn3%gP-96ԥBT՗`r2D~2+.z "v:ņ:džzvԷEzk$PTUTڢC݅ZPnM˥.K̄> -s%HA>lqn@ 0oDiP7,3mLJ ]n#]n7o"m#=+;lZh*dDҏϭ.uByKߊyb{qR;LL{a:Szt7_ ;Ny"4¡$ s_ع-%X/+å53L3%ja oE0߂.6߁ɝH$Ơvs5,1Ygc.^&&EJU&&)#%<<<{}AA28Ÿ5)OCy.E"56L1@(b_"񭽩;\j+f̷gO rcn={5j&D\*$ to̮mHȱeӹ!#]eL S?m^xD!O%!!bO B+,G_U*g* Ut;Gg +ٳr8&ЫG7HccI n0A<|B]yz7|L87[ό9ۏGTPINvcsOV򬛠Kĕ8p)= ITd*nX$_/lSOJxQI7a&{'SI?{QX0E6j57/ YYNL=Ot'q ѡ6$1kW)C9T֭2t%z*` ӕXRe8p22FDCuHcXԿfoƒӥGL =&PNDǡǣ `R㔉8I0W ʔ-}Ff KW(GeJq&+pʳa27d${j'R+CϞy挧cHe?5fqƨ,xfkVN/0l4QEGLԌճ6h4Qm 4qk/=DsWhvuDjWú| D*Ɯ-0F8ޥf~;ൊdGnĴ6Vś11A,XM{͐Y [ 󕭰H(upr!ܡ\L(3r%Wb?ʵR#QFG,{2DYI#dl@TEA}sAt6Q8А:) [d䖮OVm'rԢSemg*H'5lm@jBBRNl|nY= N+k8"'4#&W~rt(Zn^i~EA9R!AفF`r3)xe4+vX.WVnAv*=}p+ALSџUKAxG逿*!RyWߔ ʓl<-m* 0TP>@%/Z8k:^r( l\$xl"?fBT2 !b͇tNFFL4!. MP5!*ߑ@4% t# щ~TJvQ)RF_$T 6ёs>wAk|gv>]DNxTx&/YG-XV軹H~a=8f[ ȳjwQ롙VgrO&'!\\LKm1ϓ]2Nk%B<4`8=uf_5|s뀯+0,JrlJ;|T`*( VyW!Qy Ҕ7`&*[ ߆ ʻPDyC0P;񇘸|cX|O1q9+EplW[[Lh (ßGL ~QŘ3*4?,C }i'+SUv`TmUcم]fTvۥew)#1? cO1R RXnŎ`8 nӃe@|ۓT}qlI9ftiX f/ؗ+Ax@otXֳo.ja=MXlB }io)Kd|* 8^ {᧪.knRV#?sGߕf%:on;Qe (]";;T @MEq`HQ u(d O͂1j6LTs` ej,PuԫcY=V\u,`Z]:Ueu&΂̩ 4V ~ZT$]`ʑ~70֊o80U= \HRE0J] jLW!nˡQ=%$pmf;pc?sV;|>4>2G cl8kPfg0z]>ZvP}Q߰˹If!3T_I9Fi^F䝑Me1Dba7)մ56/ )$! 7QFZv A7@Q+J]@92vv.=ˀ;WnS,!_t% 0/(wq+@}Q?q<>jSS&3ت~_Wo| od0Adn춷v. 79pr3ܥUqŎ677']}Km?eGÆ3䰔eGhT6%m[#џ Fl9.Tigi &-|L|8jhf"fZn*7"zimL~H6sW S?KJ vB[;UjromimT{wEF tC ݹ ,d:ng$:5Tʯr($\!f}3 LZ)_}kZ[)SY5!@K]KxOK4-j!OK@ ӵ آe6-n`6FhxM;}m,|Vm&d6Zb[&Գ2t(0#x6Cn6 VL( jY릞Y;𘕎)ZQߚU-){Iߣ_krrb4nybmqsGHyQdGhx:f qAj)'oX>"t.2+Y_l'<ʴ%JVõ0V[Ӵr-Rm1,іfԖ hN۴S` <>ӪK@[zղtku,K;֍*,g|RKZalytE>s: N6ހCX2Bb823Ό /ʁ !2vD%d5(imF=-P<5`X4'`y3 hg#ӼcLEGbRFiUzd ᕫeʀ^Jud1kd 2?++džW8_ DžW3d+eeAxe^9_VFߌ? k]jamnWgyL)˥0|8Fa,X +` 8VC+T½Pfw` |kj>Xa,c@={sޗ'c Ïl"XPK  =p_~1y)org/yaml/snakeyaml/scanner/Constant.classS]oG=c{-)pBHlv6Td:k }?їTKH؟3l62wϜ{篿| ` wd|aqEUɄr-8\䟳r<%qIBǛy,JTYuu9WwZ[6̭9޼eٚi״VG RRºyyN*筊<ɞJ_VUy2{v_fz;s|x0D8H+b=0] eںiy4 O[M!^n5mZ Νd6d>uf`yeKC_2{Q5mX֢>7Z7;V mWRp3 FBIA 1 ~?fWTh^O,(s<;p49ȓִFSmoߴ΃o>nrřKdsK[ՕRyN^őkCcߧ'S_~5`ﵼ7\w#nfSXǻ\L)#b>b8!.KxBcc?8S8a}|L( QI)E@GQN?K6-uW1x)|g~B( \ Ղ5fL )W3hF$=z^Ջz, K ?#f@7W)p\x0O@ȝ14Ic6O#pI} PK  =:A*org/yaml/snakeyaml/scanner/SimpleKey.classSNQ]Ԃ.Eeܔ*P-!ԁv &$~q32/{^̏_ ,l<a*T<ɚg@{eO'9N^$Ocƃo'=ɳS滭oPߜ#47_sXw8 U۾~~NfPK  =Yu 1*org/yaml/snakeyaml/resolver/Resolver.classW x\U_fy/ׅ:BKC($i4M@2I3ij%v2f^J#TPq+"*U-CI)EE L&6U{ν?.|@zp WqEmx͍x+nf d2 Naޥ¼Gj'm¼Oҿ_F> 5!̇SÇ0p_*>nz?O{pxP9X1]fBKp!4x(>yX1.~0x~':~kt /9~_7*~w?:? o:e])bC'YvSJN;VrLMƖKllt'C@S@GDmMV]M˶V(0[-PhJOibI SH_ T-feVS"Hj 푸OP: i|;k](TRWnNjF@5/\(wbTB.t|4KmzLmgB iID icq͒bb\0Q`xcI2os:ނe*Jji,\S\&wQ玝_y%:g9ͣi#Š)ǚl?DQF>xAO)eo-%VB!'Q@.lYG8ӛ/Y'`x QL}tO ZbM iM ?JkCF*dl3n3sbfn/.lwhOǾ` VdH |1H k.NsDŽf]I-#O]j2+a)*JN$h _oj"1ApO-vW#P yBd.o;|D oݹ>{r\ߛ7ٽStM; )`a!(GPw\j8\ګ.c;.WYh4bVv6A?6甗9 9B<wWG1iO%^=K`wVi^o\<=_ɒ 2Xe3X=#K/LY'c('@:fb-jHZa\v{KKpc95ʜyK&-xl$6 >)S̱UG,?rKzy#Xd;I0q`ye}pai?qꝎ.yy;q\^㨼 n^u>5oLiGq1-;rִcu)_CuX`9YusXq YmKYoլ&ⵆnIDk*rob]LDo'&P>"- 9NI5UC#AXi#ܔڅˑ băHspE6W=ʬ1ZP:>e"}xVwz+Q[9@d'qM9Iy\>a`jZPsf \8tV.*Ž)fP_1mܖ E9 d S@ 0XT5Dyq "Wk\7VrjxȰN5;h>׼j-z%jj M0ZM} N1J1Oi&e+aN'2LGPX*տ93JO:P2ܢdc~&V_NW'TTTZOPnJ75OPK  =kad 2org/yaml/snakeyaml/DumperOptions$ScalarStyle.classVmSU~n󲛰^Z*j@^xh[B-iU,!lMRL*82j9rJ nl8F3mb'KoZV+\m6 3@_E3J˼٭=ӨQ@;:v7clwCSim L—e89~0&33b鏅j4;F1#p#73$=S=#c\y !%w"PS!r &hdϾO.Ris_) 1J*͏}n 氋@K.,?!0~86T8!s /7K nBx| #r86BȔY q(% TچO27hH¿N͇nxN19 Fڐ}h_4}-]ljےpV=oPZKjyi ^fK7J[86W75Y{1FCPK  =aN:&org/yaml/snakeyaml/DumperOptions.classWipw-[W#$UҦUdǪۤI`NkPl-卲jevWiՖrL4=i-u @?r `0wjZEd>/O n#Q((3<,1na2[e]!&?239L]2Fn0ƫ2^21AjJ>S 2vRNuP[j籤j zM"f,;vP䒚T$}i>$<+!1HYHo'ZQsYM]& ]b5ɏW1&?TUM/WsTԩF?`i4r쎔H팔ԐpܙяѻhNuHѴfBkhI75M0"5D3kх5ȼgҞ֐`dKG\CkI#H݉. OO_OK&<\%ӟ%#C'/Kxqex/'1Zo |1OceM|;GV!ǜ[[qXpJbeCgΞul}'O!$?' J_ u;pj(m׭UwhUv2 -w)G꽞NƲqZh0Dzfg6| џ/uBĥߏtCW!{Ĺ7{ Cn+L֠G!AȨ $ Z?|X(2yXnuDKכ NăxUXԆICn, 3%"%~aY,+u U[;*(@iBuhKSNZv i8/`N/@[~1qϘ8 ^din'&QilaհAj% I8i?b\rdK0N _|2o[P=:/yZxg{|fhl dԓބ# O$F -Dx ~4Sϧ=z({fS41Mc?z PK  =* ,0org/yaml/snakeyaml/serializer/Serializer$1.classRKo@q+B[j<""KO{l٬:)#w~g@B~bւ=3jjQp"So^fR*&J#F|<&zqNJUZ-VoXEgI#%G_N|_ \wg,\C`) h`Ԩp(u }$3*I*^"25ڄ_PK  =Qi!.org/yaml/snakeyaml/serializer/Serializer.classX{|TwL<B  րHR$@j%$Nfҙ Q"Vwmnwյ"jGk+c]Un7LrI{~9w}Ϲ3ϽW3&\<Ox*9E=o*[&^;j]E}_(_(/Koob^6G& }~lb>~Rgb ?X6U/Wf""z[ x D$G=Bgb#^3$&1ԣB1գH=,(6D3,RL=f)7NT*Cf72.mJX2Ab@vS);H<2IgH@]c-ӫ{it>rm ޘL8u٫(kO%X34$\;8iwRY=1(1%\Th'nx&ɥNZxbȖx<1%1=82&Av:8)zr}&ڡƜ]D}(ʙxg8'sS}. ҝ9iseOmuP2l>xKy50`cT>.;z٥󽁊XPr9n g Zx@v*q Z}Ԏ*uCG~Ԍ%߳:0=v"zƇA[Zݤ #깴ʺڝ[X+ˍRV03'F~6SdJ5?A-STTFD*kIxߦٳՔso iH%Fܴ %o ْbrȒnBLzМ?iOL5uZ'[,J%1[A7ڣ2VaN$U8R oA!I 6X2d19΀s6aF-f1ɐ՞ >Ȓwɻ{,CO ƑCFyTҧ y%wsW0-,FY*OwĐ YIۿ}(][-[v)ES]Xdsv+[y uR&P+jkY#?7lL$l^f.BC1rr9z_l ~c>'6qKb̲HUqmj(TΘм𫽭:+`GڀM׸y*t[<#tVGmt+ɢInsP7jRR՟6űYmf^l7ܩڂP*(Aץ ٯ `HM17խn9sP\8UR`[H G&Lq{,O1;A>@ʳro]Jg(ྫ|,wnP{LTEyeyTn^Odfp\S3-d]ԩ"ܘ?}V:E AyثȭՈ.?QewePNiJŽ)#(yp ==*G0 o&Bs):=jZהU>ׯ=&cdߞ:YYhlvPP6w}dVkKm1ת,_G5;1-O~g_90SdGc >xҘw//a~ga,|LSՊuf ht`7r#AƸoz8oEjQc%si=sMf`0p3Ɩ!>s `gHMVT<$RyYøJW7e| EuFmNxb0^ ^>."VP8^zG\B&F`ǿYs#sg1=̹ys'3Cy?+Ӹ8䨿ܐ_@&W.+s.bUEqn!ƇMϯ7C籖]ƺUQ=t[X߶"kvk ܋xpيj!/cLϽshFŗ[y\~8ߗ[(-i@67Fd…ZwTC:]XYY[沪T,e5YZr5+fƳue:XE>H~GgvO0'ǸĘ8V'prӾ>~|<*IPޢ{X$ 9j|4%b#J-.Y|cD9΅ec,%=ɟiC:+;/" [RJIT[.o[4vw𸬼h~bzRYZ|C%# 3 #S_gA!W)kgg8W[+N!CO=/< xCxbᢔQK_F|E1ُǥ _>|CxBSr?| 3xN%|S.[ f_`6u.DY]I UԵ}++a _y8.Γ̜3r Ҥ 1GXոG /&^B\b/W?ŗY, Ч;Uҫ.]C[!3T^ R^Pcr48(<ܑj }~Ys ~m/߮>-PK  =4v-67org/yaml/snakeyaml/serializer/SerializerException.classPJA^D$NpZd!xg:X ǜG;acF,-b  ,!,O\F4:L9{n{Ow\]f -̠V9PK  =&oyorg/yaml/snakeyaml/Yaml$3.classS[OAm֊AB[-&@Ҥ%lm&"Q}A3 639ߜ9;% Bnc"DXhK~Cbڏ?]N~Up'7 HMD<<>\Y tY/F,5@EG8G+kb-M>* 4]ME*:w$jlSklv&63^_;W`*LFsLn^N+:S$gReR`8Nh";ZR;#e:M5<]/͒7&*'t~܀ z-4 .6C࿛ 6.<(S%%V;w .8,Xh%ԉ˯r${9r''C/GEUVs2sdXQBJM(t:G4w]i4Vя;#8ʼnS*;Ź<8Y)VuNq>oPK  =b ?org/yaml/snakeyaml/emitter/Emitter$ExpectFlowMappingValue.classU[SPNR oJ-7r j_43I'M~>/pF?qOZ3fxw9?~~ *?Gd@E n"R 2,HF䎂qH]aRpO} kԓ`9~`Zz6v/]Wx'MAB&ghʙ6_.npwذҒs nЫƐ>_/c9{KFh[U&mZF).EOZ{@x3`F,uGҟ$,:e3V no "ڄQ0a4JOSy)w ڞkzp5ʞiӮk ; +b4AIoT[C^zZaq%!G҆IgH#Iph=Ő $kB+ܠڒ_=|߫'H_:D;tU S> \>F! ֢d+~_!(! ': ĥHI:֤$^JSX_Uv/D0Ľ=Gdc,~VH%ZGH4AK}3ciރJnAL@PK  =3=Corg/yaml/snakeyaml/emitter/Emitter$ExpectFirstBlockMappingKey.classSmkP~nZ.F77u7]ZNpv0܇IAA^Ҥ$t?KP xNTprϓ{_mč9+ʸi▅"j,&&&Z䝎ݶ w(Ǿr_$Q=t.Pih[%P@=;T\|¡2g"XN'jl(Np[N&:=UVh×qQ&x*f ufluC5It&n#\IbL,:nx զMYfmO6la4[K&^_^<6ОE, < 8e0v{k'C&2fz[;p- \&Pu/}T鍕zA8 >%.yi9Cy*$KTm ΃/홪a^-眯(h~Qg~X5*ƛ? }p)0fkqs>̿ O*ux\OЈR<-2|EЀgg6& %y#h!x$tYvQw8}ưm=wiwa#l'x{iu0̔Ӧ,Zt\2O .>+M{ Y0M= : cH1Y=0,sLmV E53~Θ#k4uT}ԝ+"#@ZIF44H4ے*RB"0 "}М׫Ys_dԘEvX&?{ؒ.lDB7x>j%a!&tDeQщ>pXs*7 [`^˷ܬ{bG]k9.'!-%݉ ~J\S:;ઊ_%~*^*^oPq E,X +2Sl}72@SS}yeIm [*n\t[k3t:B`!lb5g2Ş}nӵv*iF,V; QWM|?UK;66gaF<{\6Z8'' u3uۧ҃ugxӢ"_*uYUϵҵ@_4~'/ [01Bupct?˨l :0_uZtH8߰1W#8ArXTsqW\+B^N⮔{? P׊F'tS~UlTm:OPbyd{0;nŰ OD7q-Z9&n<$ّM6qr&_e,˕Nree<ٗ?Yn\ۿ5D1cYQ]32O`_)עI=0>M Sݸu]1I1;}e>LZ}!XL)_ J?b]9y/WԶ\QnqfShJ PQ!ⱛg湇EkQeZZQNm8Ʋ[pz#p/YR;_[(&R( j݅yjI'| ~Q]2v ) ]A.b ] &]6dۇ0ܴy2p՝^ѫ.ș`>PS,zpZ5%,q%|Sqؒ%eyqmݽFDm {pjs(ޫz^@}Q{|w-̯6o W5eT] &V8B)к7=?QFPMB#.nQa~Ma`jS1;D?B"  8¥燎'=1$dG8/_@O0Ս6CPLX0s5gWIND2 PK  =;S":org/yaml/snakeyaml/emitter/Emitter$ExpectStreamStart.classU_SQ]@5Of( JE@ll|\.}>Cf tBi4=={ιs9g@;2eN eđtA-n fI webދ{KJ,2d<"ᡄG K ',ߨRWf܌4E˚+ ӑN fWs%3F^-&#1 kwm][5meK׹VR-R܈#dpG>9]%᱄U0d;I' ZB,IΌخQ5|CyQZ'ꡪ` 0,v! k ֑fs}uۊAZHl Đ8iFZ&֓^t$pM)W~`EYӋUT&dx!x6`jTby Ͱ/;;pJfrOdlӃ :ƚ9]g\Ce *R@LR^Hį N.N:WT^`dΖ 9rRgoW}m4E yEj`AЃ4>`>hPnD*qĹ' ?'kWĞ8nB B%voN~"h>`SG^"qRu,cAtsN0QdPK  =q"`H ?org/yaml/snakeyaml/emitter/Emitter$ExpectFlowSequenceItem.classVsU$tQjiDiIkjjf{MMvf?w|ggq?FFG٤m,aa|={o9{?} G[i9c/8Npin}*!~ˬކX‘pxOl4fQ*kl0(A\|;L1-~ g'~7?[M/B߇-;LF|2L΁fD jkG)N;S"Kyd$PK  =*c:org/yaml/snakeyaml/emitter/Emitter$ExpectDocumentEnd.classUmSW~nٰy1@ jR+DD# H%,&Osg)3VGuz&*Q㇜}9= ^DDF&U\Y_Uq¸O,n(VхٙQ[*z0Ưoe1Yw++mn,-N)^)\K)}KVLϓN*ӄiZ7#0ogUЬ]=9ӒJA:+zLޜmU1oC\޶49ۨVe`Yҙ-+ rbGp \3gږ`A=TgLԿG{/6ҁb팁002ifKPcV|&ivӓ V\J#jʦa6O^=4tϦJû6tm&Ť^U}wIou0 tqےr&/ 5u1?Ň=bUҋ1D0D$&AM &&B QGd+P)}(8;z~nO^#D+gf-NԠ P0XCH>Y^{}=uDzOLXC_ u 1tReEb1QBZlŒx'ahgBI4A!1QhMKhakHu }rFH& )'H+PK  =bi>org/yaml/snakeyaml/emitter/Emitter$ExpectBlockMappingKey.classVSWݛBXIDZZ6j(4j$5ZZmV6 uggvӾcna4dr=s|߻0 ܍'`B> I\>S0%\KQW$r3^S0 \gzhz~k.0+WӶ.A <ԤEҿdf0͐Fy`9uVCbv"{EH1tkQLɷa #f9][ jٶ7k/Hb(MdD(`eeҦ!tl_ N3uS?7t'qJ2* n(CS4|d$b*nc4Y]v jSq_ CIV=*K":UZbQeU|oU+*ԙCn9zdfHk(l2|7 C~z@FӐp(h&{^von#0-m- c9(0U^ HU^bv9^y'h"&EglR{1N1fugYFz^n_2jxac.lg6 =ph܇:bK7%`0tkG {O1s = O'!zx }| vdFqw҅4!2DE<$ _pE/t=FA2M?ѽ6]KѦ12-ߑZn vpLncx|MOcvJn!nrwX6xx? ʷj<[/NH,CcH%t!!$I2A(RPK  =\ᚅ;m Borg/yaml/snakeyaml/emitter/Emitter$ExpectFirstFlowMappingKey.classV[oEvvۺBii'vJC6q['$ܺvgͮ]E_TA≇>P$9s9ߜW4ޕq&r^ч~1A 1$ Y # . yAdB 2⊈8),W)"e Y͎by*'W=inRWXLkEbV;>n|~+t4Ղwҩ3ǰo3fԙcE0 1Q.pNTW:n /FuYDV{^EԹjd$HSI[^+ -{v6K[IoTYa/n@a nOi?hTwFHL{H{q9 Buo“D \4Ɋ! Y'ȋ"Qr&n#صax5Hy==px JqooC]ÁpSZ?PK  =6s(c Dorg/yaml/snakeyaml/emitter/Emitter$ExpectFirstFlowSequenceItem.classVsU$t˲PbGt$IJ VM1Z5Bn h+7gg48>8IFQ|s=_χOdΨYxG9Ɠ*ENyfc0Ջ_`pQ% fT1e0(0CX2# ˦$[MokVڳUPr}M#mS'a6.Ħ%)phrV5b&-aʯפϚZݒ]! \ -iKx'=QDxt3EIm"q'~!Zc* {qIb `_v?#"[=þ{a)i@[ؿ?Fڊ/}[8=x&D ޤ=r< &&^nX4Wڑ(R?cD ˨rXey"Mɻ* VƒM @d|·հF_n/>~g]HJa|=s~/H+Bd\9!# %Pn 2)iLpW(o d:{g%~_YA] d`^}OXBX>KI^˃ i-Ƿblk#imkV< ݾ0Bt!8i.i YW5dȚZ=cP$Е=U47gRI7i[ J04kyaQ$qͱ3""K9]-h%[7%|_Eҩ&I2\%6gV6(ʥUuCUǀF$a6 v9 m,A%P"lak˚S,+X`k a0 L|XAyˏ6gFE)HtN_/Xcײը/Ҟ gOoƎ NpUI7ҭ"BA+ ]׻4_"VleYj|C^tKfI$=\'Fn $m`M$f.ظϊ2mEM5RgH#$JHiNlZe%&'Rpζ\.'fX/E_|P*n8zN=t->C{|re!|o$]6~EC!]3B =}qonc Z&f p 1o$1,6۹̄V{C;~O;SzCo2Ie?."w@ɬS:@Yff]bEDlMcO<-3lw҄3& fmYdžƒ9f+0ksswlALiKY_ \dk' 4 Uk:*]5K,A㭐,Yw4'hdiPH7Y's8v4ibMz<ǩϨ1jڣ?k>FhqJ)ՔӞCϩ~㰶JLkYg׳:L:l,g~PK  = 5@org/yaml/snakeyaml/emitter/Emitter$ExpectBlockSequenceItem.classUkS@=e|+Ti򐂊XPet[+JR3ur0P޽goΞ{f﷟zFxxK4$THWT̙9ޙ7eD/ : d{1 Pa$-e O5<0AĐzyHDH40~9WhvĐqaHy{ajm+w|!KY-mcB b[?i +p-l~n4ÝMÃ@{5"DAI%Y s `؊u56IIexN$|KlزZFOm2 ㅁ8ed<԰h% ,ca?;wè%ٛB`l{S[4cŦg[<0^)>S벽}ܲDdʳ%xWڎ*l ^ִ9)K^=J t!n%;B')ZJY>CɟCH+4vJCeba#WF%#+WJz./{ 9z+& W L LbZ^۱>} %!s[+J9Xg㗌vƩ,ByfpQ{,hF)LC PK  =lC$Forg/yaml/snakeyaml/emitter/Emitter$ExpectBlockMappingSimpleValue.classT]O@=.JuE²+]D@CLE֐P&0m7mW!1~$?eS6Hs{s?|PƂnaȄ6L ;& M()O] 1F2̖?زy͵C5E"iHOF ù$#k ES0tU'7j"x7\d*5Hn:SC^]8т;+^VUXn`ֲ`a(L)6m.9I `J"Ih{%5DzY?[H㢅Nt)Moa,Lb'N>Cϙ~ьf i%ven]>?k5wҷWNx2 c|H,{O\q5 HpwxZ4ٽ9 Ԉk'.u3(Y,Y$Wob? l ɢs,V-:jVfZGZi覱0* Ѓ^ y}R6+?Aˤt]?@Keh;@{l).| K{A=Fv,6wF_< 7S]1f>phQՁM oőY\^_&O?H;>Qh?PK  =8B80i(org/yaml/snakeyaml/emitter/Emitter.class||E{3l6md5$P K@) jTNYγ{gwv~-,>fμyՙg~0 ;C8.H"$V;n%sí\tnG.:q3pѕnNUtv".z8iY\/i\;E:Eǭ\d\ .s1)l0.;!\t9\bc1iǭ\ Ew&po$l +B..tfJBb6/1.23bC.rtF]…NmJ(obQu+X.TT;DC25gEO.b7b]qBZ'Gq&qhz]wBbpq~g$9a\Kb࠸˸lp+ĕ\\WkZFw^zrF.nr&Ofn¸n6.pbClgt;x;.>f[qCvc.Ix!:aDK/y!rC<;aFCs '|,;K!vo[΁:C?9_yCf1UP]˫:䯮6)]Y䫭^>WK%U~kD?d Bg>GTnW U][ lB{kDe9$BC"(#$7B)lovX3.ER6L)mW7̬iK'BR$<.cEK|u4ޅ1lV_̯5 Du{ICW1꒼gO///UP·ʗPQESRXGu٭U/+Ju#À ?r q/.(@ `јWS]nЇAȣrϴF1 '9:_C S>rkje|t?`#m|eZ֝Thr4; p[Y*JMeszned u0S`ǹZ2u^| t_2aM0%C&QlW/gc XjjJo-l5_$$ypZ hs1$j*+U$:B']FCZ F`;3k+Yqfl^[۴Q,}z4h_m-R[|1*N-OU1}5brkFӷ@ze}̅XQYfRUoZ_]f `)?_u*zqѸLvYiYaY8m<6N-T KYW .? 0;I*|A) dGۦ t-P竨 }Υ\[S[_<ďRk憹e5[}*jKZ-t2yvlMW*H4@ !%DdFcM &lBMImYec}yI <}ZD g)1!U`-#JvcM3Uk0Q.XK+'TԱXŸ,30I" 7 eMT)ԡp\mmnjF,%~(_]X@ʣȒbnx $|# ޮObZLs\a$fdĚJ,#d8}lz 0aRUT]3#jz@V w31!bFmCӆ6MkgfLh"aLoRډdm<!Ht`#slH87tm1 ;G j_oPNzj8Gd :#=hkGAؼ|q*&gIMc]bG-. y&م‰q\bwqaֻw/x›HrqE!h..<׸Ћ$liL@rj:&_CjTZS]XWG\Br}A8؅cڱ\r1GeKo\2Yz\=mZvO19䒝"ew./s9!C"p=KZp>{Q'Ro1=>/Ajf`!eyMCKfa\ w,ge=ېidLAH53j§se2<3\r$Ku6F .^lH:. >§yĘ6n-¨G~0Gy?`$X(."r7{YinֽÅȜJr<js ,l0hn$7'0.9vIr2+f b0rq,E.Y,tK.|;,ÝkkkXXNI-'`*L%Aԟ!gYi=F)H$?圊򔾩}s/q],9.\iUe)d9:ܟBhZD)-gy>|\ "yBh[WWS,Yܥ͞YR[Qm rK BT.Dr)eKJ:A\G(2+-pp.RzB;Q5 |֯_?*̛̛Ğ =OFyc=nK22%Bvi8HֲH="e划޳r'uɳe ,_>!/E &=z,|6ކ{< @.]蒫dOEs W^t Ҵe|7?~zk|E}n#krUq. f-gLXZԋ- =:h*R\&Փ<++kcA}j)iZ^?THqTX~4Z_}ź+9)~S⨰~A<@zN. 62 _^qBO0z񎆚A]dmM-QAz˒Gְ_ f5iʨyoWLUce4nU֟ 5R6#?Eme2Sc8$=7=EK#e=06{iQh!%WXɈfy$ډۼC0H67/(WAz"s(,޸ޒg΂(Zr__f~E(5X79wf ^[OP6 5̋h:=i95[9xvag-.,(Oy,{ K!#B/T$O }=uu*vm; ;BQ6sGFvKkj%Ix @~T RO`={~ jj;Ϣ8P | l 6~8Iq= GzUq\?ުzzUOyV=0b?/uتt].YTw]hq&Σr> _g >dC}C2p?tnt_샮ڙcz!  .qѝ \p7)#R@}͞)k0AjUw@2׉m!#q>I };Oi:2ʜ&?Y\ b`F>[hB Mf۠=lp; m0p'Lf({` s`,` ? 4!e0\ #p<p֓<³ޅ#x>+x )A"< @X`QQ :%#< #z`s l^ :Cl>>(3k>fhF? ^7Q^/MMS{s MCR .&ŢiIp$>7BS} rH~yuFqǰ:c㎼/Hc8"> :?4`|Lg O>yEsH7i&lp%}]+GԍA(w"̥jS^dIٛ!\"rfɽ4OC5C&讷!k>\#Z ޠ T~EdM= Hc" Jg"> J ozm/[Ur} VPK5W@C)ۭ㼓k*o?{ L(ti"=f<H!=Cݻny6> I^p9(EL ڣza da, FL0T%3u6H \O~A6 !bC=SIJ2gTpb0j 72XBl ҧGaT }QbN gQ5T3-0'8k9fna^3e ݋ZMj-d? 1d|0p8 FF勡/x)Bp ^ ZxGFE 2Cl!6jsknC-aVX-N (= q;w$gטX(,'o]{o8:[k*]&^ʈ V~('VR6 vZ']ֻ#)};lQ^\ϣfW*%[2cɁZ>Ҥe/:&oUko[AFw;! ~tvAOM?@yo9Cs^4rjHٚ(O|@|H|D|L|J|v rSN+Tl م9 lpH#ȁbdOD6VOؑ!V^kUZ,b|h'.9}lãA#7CO| i 6* [kmJp%Fx'ZK\\b'q{yp.d23BaEckBw= Z{:}]bB%n :2ŭ0PAW0ądZAA1@:Y?II  5Bt!XGb뗌¢#H2G~ciěPy^: p,K# Jրigq. ]`6myt0m4.fHBB4C'q7{;` şaؼ ݰB<b/4}NAN<MHg% 53^p/=hLm;l% -nn(9!G> /07w{v2#Y:K:E3+ڬkWPW%^#־N"ԛ&ކ3ſ`xAxj >sǰ^|ŧ$Jms"ŗS| {7^ÛGxG&؞ KXC nP._Eqi j9`:BShAͣ֕GTU=h2\Bo,Ӏ8Ri_m h5R`%Ӊ%dy:lk9(7 %M¤y6mML n/}[tw t!ZͻQk{ ܱ9r=EAd> a>9ΓSuڍUX)uWˋlQmQay6HRD̈CDqb"x<ΐ3!U@/9 0P΅y&a\3墰onps3(o-B6n!_/[EGſ3(:Qno1%:fӭws߷v>—-"o1i_A3Ae)җ5r o'vS-:כ ue$G"=z} sI0Q #L;*:`>j Wb PK{Y &r-T WpEZ8l9E4Ѡ kbQ$#LLZXLJzf6D+7+ Yʫò\Ǻ.w(ZlOpymwR>J!2!cdSfz݇H6~H˞]VcTK-lmÁ<;NfIԲ^O" N$nQGHX?!2%\?$a-:O4j%/4QjyH ~e[GRXO  Nbҕ08 qfry &5& =A2[ddϟjMC.(5> *_5k1hSgPЕoYt(QaIYuMҁ~ϖ'Uj+WBvTt;1V5cGu7tu/S;p']8UijSRU Vx:ՃI=Tk$N:='` O"d+d'2dRJӋ<퓐gtbA' K Бq]tX㫦SK_@,״um"+I foc' Ypf] d^sN8 Sto;uoX96SlecQc߱=!xu^; ʨd/bΖ5mfǶÄ79դ%)׷uZ̉zʩ!<)#8;l_-#S;MVf.b{ulu<[\HgttIoa44 lPX%%9vg'7?EBZC٣ʏ*?NtP!O$#<3@= e9SoN`;<^իz ~R]ԛ8BE6.TR.#u|׫pTc |KS_kV}oNHV?'G,ԯbuLMˠVDZ?Rɷ1Aؼ ZA[Pba,:b 16 (6,C˭x1м܊Pⷂ$^u{XnEd}\.Cxwn貒-uו~#fm^K)ՙ~K>v5b`eF,Tao=,N8` PZk -{~3(/22;dfdPG"9CP`vm 9 }k/`Vabp:{̸!q5fciw~M@ b,f c|_;w[` |9ktn/!+WB{~2m4lPh#w$rh ɭI(ZI q,mhc4ȦO58=1sG"R V [@)l!ዐZD]Aѥ9<0fAHdu?%$HVg!Y=du|0XE8 0|X $el~c9ac6&q1v`7c'~ q2pLt 8A3$05e#d&㉠I- eL~ e2`Z5Y322#XSPmX,+3dl*[X1Nm%:=|ߊ㲂w{](0.&&YGZ< }>ݼñucH>OPt_ ?&X]6*'#$FDܠu7 mMFBU'nxƂXhWu}`︶{&x\{!fb۶H~pM~ŸӶo* ҕgNbp'j]`;7ۉG&SuI$k7§ZD;>9y$,a_Dœ w$,ae$,a_Eº0HX [Ȱ7"`Ip1io#)i 0ߛ@ߨ=G{{S`lfZ9nNn0R2<U0.B0 ^!̀LLp<.//!bXQ}/ԗ$_j)TۨoAzc:jqTS@Ϧ:IT_Mu;'S=Hu';S݅Tw NN:PK  =2RY;org/yaml/snakeyaml/emitter/Emitter$ExpectDocumentRoot.classTOP=++ "9S3LI,]ehC+ XBI;s;*2!ByUHCA!A@Ʃu5yxCAk/ $6Cj S-n{f!L˳LmX)!-ϊ {^Ƞm.738q6(]#ౕA. jo^h{n1&0Z\_C!̉zo׶6Y=2OL Ҡ@ hc5i Wl"u x3Wt!pLŕ/\j74C{6v=c{;Q&)!CzÄiY<r*}7:{) mx)iϿĢE!\uNq\[*}2]*nkB$:괒hV˕/ȟh%a4ďc&0Ś 1ZPQ-ٹ9Ǘozڰpw͚ YoDSLBۂgC(7a89ӉF[yjjnr0 *"TaϦ#F,q0I(PI>+a'2VޑrP) ;czrkH&1NخW,8D5fIY3T;v˫uG:e'Q@엎lΑ] 9w,Y4`s7W,5r5u^8^^")Y8% dct|ǖ#<+v#//Ė)+ TDH`27\>qㅞi{d[* rbz1';Z, y';sb\!fF3yd@L2;ݏ$<FD` 7JdP7uNMg1x~@YGI:jʃh GoA|n⨺AåXF+mwY֨6;fڢrԆwTk/:/o'0?ajnjIh\_>043hh6n3͐+'|F@W9 0#CTux`,Tie Oog߉bbf~*Lހ)Yx@ v"E+B]؇xс<:Ct6\3<_bلxU5/`=?k&y5DIVCBjz!Vzaq}Ը$z1?a=OQX[_CbE`RULY)U`($L*"i͍GS |EXPsQchT| I?w܉*;P͠Zl 4#xF""F"FFz IuU!Z 84ꄮjӨ3|L<|dOG&iIxtL_A)nQ$aQZ)(M q c8q\ D"!YA0?qj^1&tD-"S"Ӣ>c7"x<\]ۨwv gwvElr&O-eYLW#R> Q@^,q%P߮b+AixR^e}wo_Jr֙fٱ\7?U8?RK M,EΨ>-KirKvsW(z´mm?Mzi_$@qQgI[)BzvH*w0koq ^ $Hʲ%O|PK  =z(org/yaml/snakeyaml/util/UriEncoder.classU[WUN2akB#Md ihb.(O&05aM&־jTg&$X<>}柷S*& qc7qKP/UF&e++wUȪXENǚW *Fo*嵥{°ka)wj{oU#U:d0?jWC&%Y:nXVVv\Q#]<)ǖF'jn;X3e{HK* # kI[𭂢-⒂-q8d ]t;k# '~Į_P[q/g~K]K$ގ-dV?ѥ*0һSatm W8w#O,9}ɰxTW)D"v;z@X_ >hjy߱Ȇ:+hzRlg7)36@S%u8{fOC[5{[Ų|r·mAG'(oL%LMLxS`x!Ҟz$'Əi̤4u1 gpFnA\E|L}PCxCO!0k yC4_xHCD{$wx1&}0H#R'Eh^ȏݫP6$~45FE ԝ# BpE,JXi/IDCf<׻ːYMK ڡ!_!#;c#BH&h#c~/PK  =_(org/yaml/snakeyaml/util/ArrayStack.classRmoP~. LM[AHH24hXY-K7Ae&{ssϏ_Wp2n)v g8qWdܗ!vTjCnt}6.,1$Vk2aJ@xj[~AҊ]N56_w[UӭMSw-qoy %m=޲ ERe"i^U?qR6o77զYsbSm'"_# ;NaQӧace{=k{l(|eg0P);]fļX[b7RP:2y!;9@:>#+0} sb(wBƗk!#{&HرF5fPK  = wt\70org/yaml/snakeyaml/DumperOptions$FlowStyle.classTmsU~.yMXZHiK1H%V(5mIle!&Puf.qqlpWPu`t̏b<${}s^zOK!(IK JJͺ$TPQfYk,T$ n& 3Y>JU; V=D~1ǎ%mo8fcu*<6N?[rw޷~`{ngg\ՍDVUX+0?4t[l5^6w-te!;itۣlu۵nwۻ_3w9ErV}obx^R4mӷ<uͶwoSF+kηF/MO6!.& AקTv-+04͍lxob8;40HWPe^9NV1ix]iUl'5>1. 5`[L޵=g5Sl|=sI=|KC@)װ 5 {Vgy7`A4ϵKZ}h5*@Xo|Q3;84Ow-n[=ő"a ?֘TʚnKK:GXi K$'܇XI<8ĉ>=9hw^"D:7Ѫ!N+Sl"BA"9}x~7(O{ct 4>YH)cƫ2!(>VKc|X ɞc_ c_hN`ƕ0 #$RCdChS?0g3r B= DN3>=YOJ}*&6TA&F3$eY+BxO"h^󥙿PK  =o^n,org/yaml/snakeyaml/Loader$YamlIterable.classR]k@=ni쮵ZіBЇJf:5M$ *[,xfBRs=s=̯?~x6ᣉƻᎇ Rr@ѤIS]=Ne9ɕ`Jf%2G/jTnlUEJH&Qʷzq&ԩ. 7Mڞ@c;ۧNS|r8TK9L,H&{2&$bgƢN|;E 3LӅ d ֦o>z1cO§3l3mW>4~s oA_Jpf 36m|,pQ6_5 /(s5K ׏!ppr`?GpQE,".3TqBԈO"B՚2bdr7_l!jY%4k2T5X{K>s?PK  =GgJDorg/yaml/snakeyaml/representer/SafeRepresenter$IteratorWrapper.classSkP=/i5Ƶ:Ԫ]&Fʠ(1?>kfTg/%jׁEsϽCܯ.ieq|/qF6%zC Z lX$a𼿧Fmֻr? XSHTŬwlafYfX[kPz6+#n2ѮԡKbgqZFfGv+4ULxfD$ND)g8#",W F!Gd1nÐfx4M6zU)#4}Ztڹ"2'cn%klHnLR8,JT4ܔJ,Iz,iN1P䡨 (pƥW(`co^{ȺlvoN{ZgZP2mf!JTr`?:. %Ҩ6 a$_%3% [(%_-sKϨUuDWC}GrTtrR]35SrM+A9Byhkk3}鿇{鿏m1\*~`;,-3k°FM3-u WF1K1a11 jzT<\(=Èah4 NtͧYzJ0Ut͔-MrESiLɤ1e?[gftz:3ﰋy~4Y1*un@8\ZAhkC$-\n eȋqLU0a# 9DeP̑% di|1q2'< ʼn5J͉\CGp"WP͑5IcX8Pˑw8u1sdٸ294_BE+G)})-(kъ{'0!8v\?JQX.I ͢8ZgQM`,n%p,J 5 @8["QH șaSYאYqQP J68Hf tO7{/:7@Ymlݗў Yx*oB7*/4)gaZ(d\v}rϤ9tf%ɪ,;Dn6͝!wD"'UP뼂?ױ8D-T>8̩'K'} }A  n'!8 PK  =: Borg/yaml/snakeyaml/representer/SafeRepresenter$RepresentDate.classVYpSUf777m "Ki61bU( .HC*mrқ;( .03e4tt/388:θਨnBS|z\7!*= zѧ~ |KP e.e ɸK2ȸG`Єa ^*#"#*H] 1#T\s`? `!)a\ )=3O7{6 mnR)}4XsDW>ߜ+י fDXWTL̖ZFD[}%bZ"^X8{Ah?вU7OHCsuB柈Er&y1j_y!>ш.UZw;s/]<{mޒfM&z7 n#,c,jऋf}s\y_f ,nXת(3lf4] ~Av+? *`۪~^uJs注xĴhg # 'A+`5(r2XDmp| K$=)ئ`3GA[sptmeS&4ÿV9Uxrhxgb!soX߹*?yt/l?D/sYpxdLo91M.|F5-y-įT ZL.!jQQ-VQ051=I~:Mn ndo+0 kc؃R$NLU(t:ׂF^Z neʊ }ۘzLbShLodʁM;5n| >%1PK  =u"ECorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentArray.classT]OA=.vݖREU I^|..5iRW|0>fc;-%1if~3;ݟ}p wcP1!*4@:90}";%cv7i:$G9B\$(RDV2㸌i^i+iyfUƥ>FR PK  =a;Dorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentNumber.classU[OAn[W)ĻJ rQQhiVcXb햄_|0/1Qh|0'̶rBl93g}/_4Ee8!㤌Vmۮ߬r m MWaLqJ#O rSSUaPzu]5SF9T5\qCMRpC WedsE#^$M0-#[VʒfbDbe.$1JvxrV@tz?Si!F Iղl}IͥL`̿ n_gxCQKXOL^guB7P׶ T>0O h"\ GO(xgE2CU^T(Q dX GDGyqKDC{D |[*r(msAJ2Y~<9;( s8@hF|!}L}ǙOdY1?rn/lOpgpc֤~!!3PK  ==Forg/yaml/snakeyaml/representer/SafeRepresenter$RepresentIterable.classT[OAv-oUvQ|jBh 2eVw&+5X(™imI%{fs{7X"EYb)۸.ٸע6xĐN>qqaFmX")TؕU¾𕟼dXq'pG2|%7;Mmf@B-l`[D>!?` PJF끈cI&kSܦ"&=ExPmܓdt#EI&Ibv 0epa'jɷNan$p\瘆QBF1بrxB4^o r13X\L[&/ nDxfDXo1,]g"dR\A |gK~!?wjQ)wO}CTm'ukaH.7zz4Z``]! 9ES+"H8@$7{\a u "X]\Aua<4=XRݧp/`θDfaPK  =\pForg/yaml/snakeyaml/representer/SafeRepresenter$RepresentIterator.classTmOA~/}"Hk=| _BR!ZRzxՄF!Q|GgTZ ngvnyffgo?LQt\qcR^ a"!CøҐ`i` 4)/[;|۱.+拊/ oxyY۵9)Cd WCd+qg7(CD8<|cujUBɤ fcpU-eke}KL'"Z˴JdC'cMl Z`;V =ة?ێ?Gzѫ%Ԗq#Ue~5$%َk64L s]+YsEf fGA];6pE&a̴WCǞ*/J '%]t(/Eb%u2 ZY׷%AE&fGCj {mSF!_>zq96 5AiڇHWBO~`VC:R8O.6>_Gy ЗE3#!}1RipH.KcndR\U|G1H2I|QBPK  =-Aorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentSet.classURA=0 D]e4 JRX@$P)~j)Ze`?ޞ@HTz}sp:B R]Αz8SO7[>Ku1$a# F1Ԙ+afr&_OG kٜ0n\$0t$I/etϯ/\/I,ir_:$Q&mgu]&0?y.Nr[ Is=[\Kp \1"q NBEUgN򦖎 nfd8˖MO筸ixVxmfwc_1RɨR2F&ܓZD&[Ӛ4=nyEi4hm=HJX Sqw)L+b*あ T<#H0 G<cXd5jLR>n2(+܈T,t''*uZr֦iCSIKH -$OT -B>Yq!^@Ѡ.a aV]:Ћg2icӋƠuʹ룽fW(, kKFZph B m8bOpƻvP09v0OjI9x[J\oPmQp'~HjEj%"S$*Wjں~rM~W o+JgA:!d"B9PK  =ZUGorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentByteArray.classTkoA=vkZa.PY>hƤ Ii> t[]h`2Y @Ν;9ΝOC :t,hXqK1,㾎xDRG i +i0D#[2dKMٰı<%{)7``5X RА5̟hX5 gо.6dc[?xZYp;=;  s_PK  =pVBorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentEnum.classmoP*e2|sӪ&e-{351- Y PL[LV(K4,s8wnV>91``IDzw $qπJ}Nu::JT *ZIt;N2>C CG2p@978vhf\#h۽}I=_-4EÖ|=xJ5U(!3<]ea( qO3CQ8nPYI|n&tvm?Op f4nF򅧚/*&LdL\B0fbcEcUf'!wE}qLa&]+$C<=aTqJˉj QjO0Gv\Zr^S')]=,"(S h,[sXO4Jo_bLCNvvvFޢԂԼĒDFc IJDļt}kMtT0+/?%XHZ32p%e22ȠE;"}zFt@b`L lPK  =;Eorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentBoolean.classn@M86Mcih C-'h Rڈ&M . S@!p  BMHI*B;븫@AN 0B> ઊ2J22 W5oex6)•+^/\wf__L3,=\bVm0Q3mk [Yw@ QLDYqKpA{b] x8f.A"U׸w>7,nwzkW86$V7ỦݡMi;$`tݶxlO [ hАpdT4j5A X\/};pԗS;'B~ CȞ&Y SpYJn B,ôZPK  =ȧ;Dorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentString.classUNAlt]z [^QZoh[xiY,[n$&[EbC,P-T \vs9g/]?[C#z8^#~NOh<p40QΪSqNy3kE;ZP[;9!Q21ci%R Q|F))Зh1 6~"% JұM+ϠOX#^* 28P6R^  nzs| ʇ&3s"kXP)Q1-n/2x ƅjތPpʣψ).EĮ0".BYTsTrҒŲLвA>cuĸ:u\Et\:⚊:&ѩbJu$T$upC4n%: 0дQ2 אoڒQ2`w-F}[˅a{x">}oj<3Vaˎ)=Qh;djzydg%`U-OeaeHprlթrlOə֌*h$_W>/#[L10Cg 1\0/G}3lխCyg gh7-$d&ʹ58Hq#H2&BF{P]fXgx>64x6uw{hž5y| u1Y2,P[Kɭڰ7]a xGcw +G)?#Dx/Cx6Fl?2 @8NO QGCr<-y  PK  =3 4org/yaml/snakeyaml/representer/BaseRepresenter.classXy`^$$$(as,("7h4% I쮻$hk֫UVmmT@LZia}W{ofvv&$|}{ i V{@A{e< l-xXAZ<"G)`q !a%1|Ybf8()q`y&Y1qXAWe< fE5/)#B7dA )[ mQ+|W?d3(hOłǷg /dRR_53zVOLVBiVm-HBQѝr]B&kВ -]ԒtD<Զ̥ .?_Kĺ±H(Mu#W;.m t[Eh$#lu"uM:EWG]嶓R\CV̞OX]hWdNT'\$ Aŧp?/xScsЬ*'%*~'j/TE;$9CekZHBݲLFVlѫ\U?t*>@H.yze ›$* xD )gS5ͱ6I! L* bYªT$)xA*R,R4Ea '<2U*ʦJ*6BrR/er]7茘w7uPJɤ.60ޱ٠39t1YD)Qr̮X=kɾ#iF2kV[؛ټ{|In:zGq0lM;Ǯf][l#'W̟jO#ۜ4(F|L]9σ1-mcϏ ORgx0A\XoNګؘGbD'jG~}+Umbg~(ly0JX6ޣE8o4/DŽjoU=IXT2 lDBW׾OT"k]\TUgF:Psi4U~΀~Ha?ANC9 sZ4c*yؔ!ıZgr݄SpWK^/(‚X J[k1%!1s>!s" `hu+8DngI'yB]it&̂N9]N`pd;b9Wj9V31GƿCa7|8kj6G>Aʝ@u0Yf4wH0S8 DUhBO$Ѡ#* 9j:DWØ^>{?NyRK.+Ê@}I؂ ñ8!XO.d-a-c7ȱl#IBdx O/5xK~dЪ~(B&@ ~{o/B셨!O !I?LQCoy3G1ęѢsdf?7Au'cn{M$Guc 3y~\ :주2L0֊/:15c:l1oic϶l5W~cfސ)æ*vm=ºK+U홢4jBn΁aԵW18x{M4H'o 9NYN4ȵCXGvȟ.f ƢXQ*Oa.D;S!o2[Åo=KWQC( - ~GC4p kkˬ \ ]K\M_p-:, xO0L?ɋkߌ2ɵ7VIKҔI^F+&|d3p G98v!p>.Wn\Oi]][1fs2̢V%8e\Ck-^#zt t 38<8ZWR1kVYP4bFFҎǢ<ܐ-Hʐ iS4XLqP#{@3ls?!z.%qw]0g0c<|4|tu']N י`j3כA7pY;dn"jY8ف*#6ԥL}H8XpęE3-wK,[_U$JYS(y}Ҽ%1#1I%n4=35CxXζEDu] %Jtn8LϹFacHx﵅6۽tȒ(a2;F)xAn+(cbG̗]A`݆ױ{iu|viPK  =Y;Borg/yaml/snakeyaml/representer/Representer$RepresentJavaBean.classTmOA~=9zP|*^_DQ>n˦w/JD2Mm(4rs3<3{~`)Ѐ% DQ#tGe sY6Gn*ϧ{O <qm)IBPK  =|;/J M0org/yaml/snakeyaml/representer/Representer.classX xT=7̛S6 AC DY b@Ap&3qZں/U+A( .A*ͥ[Z+=d']/~>G qppՏئN?.^|C^SǷpGý: ܧ~x@^o?me!m {t=cQ&v.?v㻒1)qi{%}TO)UI͝j>-/<'7]>R ^z/_/kC xi8qءc^tSHÏe΍~-k언y 0jQ;~bJ$섀* ' k'm+Q6`뭆OFZ+̡;)L+cʭVs2jVm+Ъ@j+7sSJ#uvrXѦU PrAi.-Qy7ypRc-vT T3s9Q2MQ+ӄT3 sK`5<ޞXbr/NL hdN?:݊w&+Q [L&;ey$`ET^{9ž;@Iסɿ)iUY/H?j{$9);3I)06EkAf7,oJ53Kڨ3rJ@d^5+7a G9`NaU|YI& ֒$ן.J? 5W f:>Q  LFO3_|lH'qB%ܚ+4C !t7n& Q(FH4( 1ZCX-0{di4lGhHCL $b^]zDLL2d1%b"!‡ 3VS 1MLg، 1C8aHK 佁kq!J%:eb& ܈8P ?ofA\gm0(#ʚlocPY9߳ÍòøZRzsL9Yw"|Fn5R/$ KFaeWS}q x]\M򍚑è&iŒ`L ^BN"3FG%鼔,t+y8zJsP 3)cN(I9͘@NouJCQ 3cpoV02HF,Gna_lhȧ3WHhqQJE"3F瀓j"* TVmlJsEl.gd6Kz ŢI+MAtD#Du"!}veXs%pަ1e@:F`s" WglsRKyʾ~ TvPTH&A"PALugb:QJFu5'2 !dݥzF VIOiY ǽj䧈̔oiѹstP,]PeXрWre{ Ck=7vx\Xwy8p n8;*8kHM-M`kW:a= 0˻=(;PtW=G^(|"G oǘVl1B}TRM4m^1i]kȠaa4z_VvLúCӆ]aJ&1 w1;Ka]Nj0KL𦞨#Z)u Ѻx݈:܂p7>OQB' 8 /l9xGH~%2(QE_ ?y'SK7)GfAY2HY+ַp@Mnٳ !Lbr:6S#c eDT4S']'*meΔ4Js㚯[юG ^5SۏV,݆Gc*O4mR}M-1#0"`;fnQֆ ]?2;Iݘx?3E#Ue7=G̦By|LąbĥP jp-.u7V܄;\5)؅Z@U \jըPm8qw Aؽz {3rˬ4ݦK4+َMknSމyAZ1^8z;WM#͂ʔbReV3%'K S _|+M]^pz +cQ+RY ^hq;)I GouF/jPGqTNPuݭPwaCyjGv z̆Ŏ=%(s2QPfzH.+[3'{Xc,HFe> b<ʖ%ۍ5qvh؇<'kO <'fK /^V1Lz>s$zZyY,W-G\UߋT o ̥u|*y:0[#e7McJ^~ʌ=XIŨt=YNKd]/Zh2++Y'BlVWͬ/"ª^ ǫiUYϾB;3G5'U3ub+&R 'm˝lI#h B~AxSm r`.喑ΈL2J i*F+Kc \$y{JӴ}Yž%ճ.u6bfK'PK  =META-INF/maven/PK  =META-INF/maven/org.yaml/PK  ="META-INF/maven/org.yaml/snakeyaml/PK  =3-)META-INF/maven/org.yaml/snakeyaml/pom.xmlZs6޿)_2sVB!mI A)ؖ{L+ɖב͗V?Vծ,7rD<2=A(K888 t9tZP^V.g00S(AO&3Kʒ&]M.?|EpanMfBβ,q䢂b1t} kb0-sGO.Z$8I]aws`G!DeF,>9M|qo^6}07j2wo&ŹttDj=<99r&) N {O.0<(,n#{gfp|AAaℌq|Y;#)`Z\$&Kl$1y\JHZ@*JwcL#9W!O$Z!- \.t SqLCP%gUMej/_5ϒ\K+t,“tVzn?mJeEʨVbiWltJW!;q7>IDm椶E|#,FL29VaegNQ&6ݚY!^?ڠU$d3-[%Ar&OB0e[TS+"bKuj;̅ chP8%-ؒ7 %S*KlT9&r\Х=$Qp[aթ'R`+ƯGŌ1c O'O TnFLNy ]O%+c汗YT(ej2eC$}9S4aB)ݦ0Xn٥>K\JC" 0$E}9GkIAW`ˊ"dN9ٟ!)*;8@+tv5#=ZHL|%RnӭIh-p&]gP*ScQV*O{j1!=&ѯ+,&m`9M k)ڣ EVe0~U=7!p!UUIWF:}S "_Xp(}^KFx436{Hp̻}(s1kK!/ -{IkÐP%ùpQV7-upjSV%74;& g<--C.pMZŤ;{N}Lr;IA)Pb$e۫eգnx3(_8F- b/4x|l6{sz7Wc ~k># yAT4]{<}ݪa6e\hǛ[2'Uwx!6(VjG)S 7.ћrK*#=}y_7Wݏv~7EvP?Mڝ}u\y0ENm>I1uŢ;qޞm+j$[y՜FW` {`UlXH]FÌB[_(#)g~X]&E_jKFo_؊aCp#0{.f؏XAdZ(>pybǙ`dGjXۘze;kyڢb P!9Ԓ^ZP~OX4&#X&PyYR_fz}[S0/OP|!!R #b,5vꛪ Y |)(4,"pIXrrIO1 ۄ~H68[8d(g|OGMpl?PK  =gj0META-INF/maven/org.yaml/snakeyaml/pom.propertiesSvOK-J,IMQHTM,KR(Up,MW04R042225Wp 6020P0204*K-*ϳ53J//-L/J׫LJ,*LKL.%fPK  = AMETA-INF/PK  =R8cf|'META-INF/MANIFEST.MFPK  =Acom/PK  = Acom/google/PK  =A com/google/gdata/PK  =A9com/google/gdata/util/PK  =Amcom/google/gdata/util/common/PK  ="Acom/google/gdata/util/common/base/PK  =Aorg/PK  = A org/yaml/PK  =A1org/yaml/snakeyaml/PK  =Aborg/yaml/snakeyaml/events/PK  = Aorg/yaml/snakeyaml/introspector/PK  =Aorg/yaml/snakeyaml/constructor/PK  =Aorg/yaml/snakeyaml/composer/PK  =AOorg/yaml/snakeyaml/parser/PK  =Aorg/yaml/snakeyaml/nodes/PK  =Aorg/yaml/snakeyaml/error/PK  =Aorg/yaml/snakeyaml/reader/PK  =A-org/yaml/snakeyaml/tokens/PK  =Aeorg/yaml/snakeyaml/scanner/PK  =Aorg/yaml/snakeyaml/resolver/PK  =Aorg/yaml/snakeyaml/serializer/PK  =Aorg/yaml/snakeyaml/emitter/PK  =AMorg/yaml/snakeyaml/util/PK  =Aorg/yaml/snakeyaml/representer/PK  =;/com/google/gdata/util/common/base/Escaper.classPK  =ညV6com/google/gdata/util/common/base/PercentEscaper.classPK  =MVA{u8]com/google/gdata/util/common/base/UnicodeEscaper$2.classPK  =W! 8(com/google/gdata/util/common/base/UnicodeEscaper$1.classPK  =N6com/google/gdata/util/common/base/UnicodeEscaper.classPK  =ApZ+!org/yaml/snakeyaml/Yaml$EventIterable.classPK  =:(Ӕ);#org/yaml/snakeyaml/Yaml.classPK  =BXav!1org/yaml/snakeyaml/Loader$3.classPK  = ra0=4org/yaml/snakeyaml/DumperOptions$LineBreak.classPK  =b-9 .8org/yaml/snakeyaml/DumperOptions$Version.classPK  =Jw-"<org/yaml/snakeyaml/Loader$EventIterable.classPK  =|v7?'D>org/yaml/snakeyaml/JavaBeanParser.classPK  =qEY '@org/yaml/snakeyaml/JavaBeanLoader.classPK  =u0JEorg/yaml/snakeyaml/events/StreamStartEvent.classPK  =N42 Gorg/yaml/snakeyaml/events/SequenceStartEvent.classPK  =J;+DIorg/yaml/snakeyaml/events/ScalarEvent.classPK  =Б4Lorg/yaml/snakeyaml/events/CollectionStartEvent.classPK  =1%Oorg/yaml/snakeyaml/events/Event.classPK  =9f1Rorg/yaml/snakeyaml/events/MappingStartEvent.classPK  =#)Torg/yaml/snakeyaml/events/NodeEvent.classPK  =B,$0Vorg/yaml/snakeyaml/events/SequenceEndEvent.classPK  =홄 /Xorg/yaml/snakeyaml/events/MappingEndEvent.classPK  =Ak-Zorg/yaml/snakeyaml/events/ImplicitTuple.classPK  =h(]org/yaml/snakeyaml/events/Event$ID.classPK  =Ħut.O`org/yaml/snakeyaml/events/StreamEndEvent.classPK  = >*borg/yaml/snakeyaml/events/AliasEvent.classPK  =Om 2corg/yaml/snakeyaml/events/CollectionEndEvent.classPK  =5&z2Georg/yaml/snakeyaml/events/DocumentStartEvent.classPK  =H)06horg/yaml/snakeyaml/events/DocumentEndEvent.classPK  ="G;e0Ljorg/yaml/snakeyaml/introspector/BeanAccess.classPK  =+ 3lorg/yaml/snakeyaml/introspector/PropertyUtils.classPK  =՜M5worg/yaml/snakeyaml/introspector/GenericProperty.classPK  =s 3{org/yaml/snakeyaml/introspector/FieldProperty.classPK  =qP^D.~org/yaml/snakeyaml/introspector/Property.classPK  =(5{org/yaml/snakeyaml/introspector/PropertyUtils$1.classPK  =@5C%4org/yaml/snakeyaml/introspector/MethodProperty.classPK  =],org/yaml/snakeyaml/Loader$NodeIterable.classPK  =6:H֊org/yaml/snakeyaml/Yaml$1.classPK  =+N'Morg/yaml/snakeyaml/JavaBeanDumper.classPK  =߹C @org/yaml/snakeyaml/constructor/Constructor$ConstructScalar.classPK  =$VOE3org/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlSet.classPK  =ktje Dorg/yaml/snakeyaml/constructor/Constructor$ConstructYamlObject.classPK  =v2torg/yaml/snakeyaml/constructor/Constructor$1.classPK  =gForg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlBool.classPK  =λ, Forg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlOmap.classPK  =*ݏ]FCorg/yaml/snakeyaml/constructor/BaseConstructor$RecursiveTuple.classPK  =7w "4org/yaml/snakeyaml/constructor/SafeConstructor.classPK  =jO0org/yaml/snakeyaml/constructor/Constructor.classPK  =/z24org/yaml/snakeyaml/constructor/BaseConstructor.classPK  ={h6 Gorg/yaml/snakeyaml/constructor/SafeConstructor$ConstructUndefined.classPK  => Aorg/yaml/snakeyaml/constructor/Constructor$ConstructMapping.classPK  =5cEUorg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlSeq.classPK  =5oEorg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlInt.classPK  ='.org/yaml/snakeyaml/constructor/Construct.classPK  =1ϳEorg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlStr.classPK  =DHagGorg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlFloat.classPK  =^SԭForg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlNull.classPK  =mW 6org/yaml/snakeyaml/constructor/SafeConstructor$1.classPK  =RkEorg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlMap.classPK  =d}^"Hborg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlBinary.classPK  =~z6 org/yaml/snakeyaml/constructor/AbstractConstruct.classPK  =@M19 org/yaml/snakeyaml/constructor/ConstructorException.classPK  =&* Korg/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlTimestamp.classPK  =W%/: G$org/yaml/snakeyaml/constructor/SafeConstructor$ConstructYamlPairs.classPK  =󐁼 :Borg/yaml/snakeyaml/constructor/Constructor$ConstructSequence.classPK  =֘A%org/yaml/snakeyaml/constructor/CustomClassLoaderConstructor.classPK  =D@% *(org/yaml/snakeyaml/composer/Composer.classPK  =Xi3C5org/yaml/snakeyaml/composer/ComposerException.classPK  =d[A*6org/yaml/snakeyaml/Yaml$NodeIterable.classPK  =G=~. 9org/yaml/snakeyaml/Dumper.classPK  =6|;T!>org/yaml/snakeyaml/Loader$1.classPK  ="|$`!Aorg/yaml/snakeyaml/Loader$2.classPK  =Q.ZB ECorg/yaml/snakeyaml/parser/ParserImpl$ParseImplicitDocumentStart.classPK  ='@9]Horg/yaml/snakeyaml/parser/ParserImpl$ParseBlockNode.classPK  ={ KJorg/yaml/snakeyaml/parser/ParserImpl$ParseFlowSequenceEntryMappingKey.classPK  =C>}Norg/yaml/snakeyaml/parser/ParserImpl$ParseFlowMappingKey.classPK  =ݍ)R ?dTorg/yaml/snakeyaml/parser/ParserImpl$ParseBlockMappingKey.classPK  =JD+x GYorg/yaml/snakeyaml/parser/ParserImpl$ParseIndentlessSequenceEntry.classPK  =<0O Bz^org/yaml/snakeyaml/parser/ParserImpl$ParseBlockSequenceEntry.classPK  =ZE dorg/yaml/snakeyaml/parser/ParserImpl$ParseFlowMappingEmptyValue.classPK  =W=gorg/yaml/snakeyaml/parser/ParserImpl$ParseDocumentStart.classPK  =LY MPnorg/yaml/snakeyaml/parser/ParserImpl$ParseFlowSequenceEntryMappingValue.classPK  =\f3*rorg/yaml/snakeyaml/parser/ParserImpl.classPK  =l{rz$ ?:org/yaml/snakeyaml/parser/ParserImpl$ParseDocumentContent.classPK  =5}G5org/yaml/snakeyaml/parser/ParserImpl$ParseBlockSequenceFirstEntry.classPK  =A;Worg/yaml/snakeyaml/parser/ParserImpl$ParseDocumentEnd.classPK  =DCorg/yaml/snakeyaml/parser/ParserImpl$ParseBlockMappingFirstKey.classPK  =Ą)/^org/yaml/snakeyaml/parser/ParserException.classPK  =F/org/yaml/snakeyaml/parser/ParserImpl$ParseFlowSequenceFirstEntry.classPK  =D] @Sorg/yaml/snakeyaml/parser/ParserImpl$ParseFlowMappingValue.classPK  =ӏ*org/yaml/snakeyaml/parser/Production.classPK  =V[t&Worg/yaml/snakeyaml/parser/Parser.classPK  =T~\Kuorg/yaml/snakeyaml/parser/ParserImpl$ParseFlowSequenceEntryMappingEnd.classPK  =" Aorg/yaml/snakeyaml/parser/ParserImpl$ParseFlowSequenceEntry.classPK  =ɴ-\;org/yaml/snakeyaml/parser/ParserImpl$ParseStreamStart.classPK  =̦,Ϋorg/yaml/snakeyaml/parser/ParserImpl$1.classPK  =1Corg/yaml/snakeyaml/parser/ParserImpl$ParseFlowMappingFirstKey.classPK  =Ћ Aorg/yaml/snakeyaml/parser/ParserImpl$ParseBlockMappingValue.classPK  =*org/yaml/snakeyaml/Yaml$YamlIterable.classPK  =s$$+ %org/yaml/snakeyaml/nodes/NodeId.classPK  =gukG-org/yaml/snakeyaml/nodes/CollectionNode.classPK  =4K6](org/yaml/snakeyaml/nodes/NodeTuple.classPK  =>A ;"org/yaml/snakeyaml/nodes/Tag.classPK  =CzI*org/yaml/snakeyaml/nodes/MappingNode.classPK  =3  #org/yaml/snakeyaml/nodes/Node.classPK  =wwv)norg/yaml/snakeyaml/nodes/ScalarNode.classPK  =: +Horg/yaml/snakeyaml/nodes/SequenceNode.classPK  =^)@,xorg/yaml/snakeyaml/error/YAMLException.classPK  =߁ o 2Worg/yaml/snakeyaml/error/MarkedYAMLException.classPK  =u _ #org/yaml/snakeyaml/error/Mark.classPK  =2KPorg/yaml/snakeyaml/Loader.classPK  ={``org/yaml/snakeyaml/Yaml$2.classPK  =hvҸ-org/yaml/snakeyaml/reader/UnicodeReader.classPK  =y,org/yaml/snakeyaml/reader/StreamReader.classPK  =TylU/org/yaml/snakeyaml/reader/ReaderException.classPK  =浒b0org/yaml/snakeyaml/tokens/StreamStartToken.classPK  =eP .Vorg/yaml/snakeyaml/tokens/DirectiveToken.classPK  =j4uorg/yaml/snakeyaml/tokens/FlowSequenceEndToken.classPK  =eA*(1org/yaml/snakeyaml/tokens/Token$ID.classPK  =EMi6 org/yaml/snakeyaml/tokens/FlowSequenceStartToken.classPK  =E\e.<org/yaml/snakeyaml/tokens/FlowEntryToken.classPK  =5O&d.org/yaml/snakeyaml/tokens/StreamEndToken.classPK  =ws^_(org/yaml/snakeyaml/tokens/KeyToken.classPK  =[Ge/Borg/yaml/snakeyaml/tokens/BlockEntryToken.classPK  =Rj_*org/yaml/snakeyaml/tokens/ValueToken.classPK  =b5S i7org/yaml/snakeyaml/tokens/BlockSequenceStartToken.classPK  =x++Yorg/yaml/snakeyaml/tokens/AnchorToken.classPK  = a-org/yaml/snakeyaml/tokens/BlockEndToken.classPK  =p**yorg/yaml/snakeyaml/tokens/AliasToken.classPK  =vf0org/yaml/snakeyaml/tokens/DocumentEndToken.classPK  =U1 ( org/yaml/snakeyaml/tokens/TagTuple.classPK  =Ph_i3"org/yaml/snakeyaml/tokens/FlowMappingEndToken.classPK  =}ug5P$org/yaml/snakeyaml/tokens/FlowMappingStartToken.classPK  =6.e2 &org/yaml/snakeyaml/tokens/DocumentStartToken.classPK  =M<2%'org/yaml/snakeyaml/tokens/Token.classPK  =BSgo(+org/yaml/snakeyaml/tokens/TagToken.classPK  ='x*i6-org/yaml/snakeyaml/tokens/BlockMappingStartToken.classPK  =( +{/org/yaml/snakeyaml/tokens/ScalarToken.classPK  =<$(2org/yaml/snakeyaml/TypeDescription.classPK  =榉x(08org/yaml/snakeyaml/scanner/Scanner.classPK  =(C1T9org/yaml/snakeyaml/scanner/ScannerException.classPK  =R5R;org/yaml/snakeyaml/scanner/ScannerImpl$Chomping.classPK  =yI%52w,=org/yaml/snakeyaml/scanner/ScannerImpl.classPK  =p_~1y)sorg/yaml/snakeyaml/scanner/Constant.classPK  =:A*vorg/yaml/snakeyaml/scanner/SimpleKey.classPK  =Yu 1*zorg/yaml/snakeyaml/resolver/Resolver.classPK  =-C,Xorg/yaml/snakeyaml/resolver/Resolver$1.classPK  =V+/horg/yaml/snakeyaml/resolver/ResolverTuple.classPK  =kad 2org/yaml/snakeyaml/DumperOptions$ScalarStyle.classPK  =aN:&dorg/yaml/snakeyaml/DumperOptions.classPK  =* ,0org/yaml/snakeyaml/serializer/Serializer$1.classPK  =Qi!.ۗorg/yaml/snakeyaml/serializer/Serializer.classPK  =4v-67org/yaml/snakeyaml/serializer/SerializerException.classPK  =&oyyorg/yaml/snakeyaml/Yaml$3.classPK  =m2//org/yaml/snakeyaml/emitter/ScalarAnalysis.classPK  =b ?Uorg/yaml/snakeyaml/emitter/Emitter$ExpectFlowMappingValue.classPK  =3=Corg/yaml/snakeyaml/emitter/Emitter$ExpectFirstBlockMappingKey.classPK  =gw*org/yaml/snakeyaml/emitter/Emitter$1.classPK  =oR$<org/yaml/snakeyaml/emitter/Emitter$ExpectDocumentStart.classPK  =9#l6iorg/yaml/snakeyaml/emitter/Emitter$ExpectNothing.classPK  =;S":)org/yaml/snakeyaml/emitter/Emitter$ExpectStreamStart.classPK  =q"`H ?xorg/yaml/snakeyaml/emitter/Emitter$ExpectFlowSequenceItem.classPK  =*c:org/yaml/snakeyaml/emitter/Emitter$ExpectDocumentEnd.classPK  =bi>|org/yaml/snakeyaml/emitter/Emitter$ExpectBlockMappingKey.classPK  =\ᚅ;m Bgorg/yaml/snakeyaml/emitter/Emitter$ExpectFirstFlowMappingKey.classPK  =6s(c Dorg/yaml/snakeyaml/emitter/Emitter$ExpectFirstFlowSequenceItem.classPK  =D @<org/yaml/snakeyaml/emitter/Emitter$ExpectBlockMappingValue.classPK  =`-@org/yaml/snakeyaml/emitter/EmitterState.classPK  =V =*org/yaml/snakeyaml/emitter/Emitter$ExpectFlowMappingKey.classPK  =|11org/yaml/snakeyaml/emitter/EmitterException.classPK  =|'E[org/yaml/snakeyaml/emitter/Emitter$ExpectFirstBlockSequenceItem.classPK  = 5@org/yaml/snakeyaml/emitter/Emitter$ExpectBlockSequenceItem.classPK  =HE1org/yaml/snakeyaml/emitter/Emitter$ExpectFlowMappingSimpleValue.classPK  =lC$F"org/yaml/snakeyaml/emitter/Emitter$ExpectBlockMappingSimpleValue.classPK  =8B80i(org/yaml/snakeyaml/emitter/Emitter.classPK  =2RY;org/yaml/snakeyaml/emitter/Emitter$ExpectDocumentRoot.classPK  =㞻sAGorg/yaml/snakeyaml/emitter/Emitter$ExpectFirstDocumentStart.classPK  =~„)!org/yaml/snakeyaml/util/Base64Coder.classPK  =z(k'org/yaml/snakeyaml/util/UriEncoder.classPK  =_(j+org/yaml/snakeyaml/util/ArrayStack.classPK  = wt\70.org/yaml/snakeyaml/DumperOptions$FlowStyle.classPK  =o^n,1org/yaml/snakeyaml/Loader$YamlIterable.classPK  =GgJD3org/yaml/snakeyaml/representer/SafeRepresenter$IteratorWrapper.classPK  =̈sP4 6org/yaml/snakeyaml/representer/SafeRepresenter.classPK  =: B>=org/yaml/snakeyaml/representer/SafeRepresenter$RepresentDate.classPK  =u"ECCorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentArray.classPK  =a;D4Forg/yaml/snakeyaml/representer/SafeRepresenter$RepresentNumber.classPK  = AIorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentMap.classPK  ==F`Lorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentIterable.classPK  =\pFNorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentIterator.classPK  =-AQorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentSet.classPK  =ZUGUorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentByteArray.classPK  =pVBWorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentEnum.classPK  =_՟BHZorg/yaml/snakeyaml/representer/SafeRepresenter$RepresentNull.classPK  = @.n\org/yaml/snakeyaml/representer/Represent.classPK  =;EM]org/yaml/snakeyaml/representer/SafeRepresenter$RepresentBoolean.classPK  =ȧ;D_org/yaml/snakeyaml/representer/SafeRepresenter$RepresentString.classPK  =3 4corg/yaml/snakeyaml/representer/BaseRepresenter.classPK  =Y;Boorg/yaml/snakeyaml/representer/Representer$RepresentJavaBean.classPK  =|;/J M0yrorg/yaml/snakeyaml/representer/Representer.classPK  =A~META-INF/maven/PK  =A~META-INF/maven/org.yaml/PK  ="A&META-INF/maven/org.yaml/snakeyaml/PK  =3-)fMETA-INF/maven/org.yaml/snakeyaml/pom.xmlPK  =gj0META-INF/maven/org.yaml/snakeyaml/pom.propertiesPKUJtinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/linkbench.sh000066400000000000000000000002511207233610700256710ustar00rootroot00000000000000#!/bin/bash EXEC="linkbench.jar" if [ -f $EXEC ]; then java -jar $EXEC $@ else echo -e "No \033[1m$EXEC\033[0m file found. Have you built the Java application?"; fi tinyos-2.1.2+dfsg/apps/tests/LinkBench/javasrc/dist-addon/tos_metric.sh000066400000000000000000000143031207233610700261070ustar00rootroot00000000000000#!/bin/bash # TinyOS software metric generator script # This script's purpose is to run the LinkBench application with # arbitrary benchmarks, but using always different TinyOS svn revisions. # PROGNAME=`basename $0` PROGVERSION=0.1 # default values MPLATFORM=iris TOSSVNDIR=$TOSROOT LINKBDIR=".." START_DATE=`date +%Y-%m-%d` STOP_DATE=`date +%Y-%m-%d` DATE_STEP='1 month' BENCH_FILE="batchfiles/${PROGNAME%.*}.yml" LOGFILE=${PROGNAME%.*}.log SHORTOPTS="hvF:" LONGOPTS="help,version,svn:,step:,benchfile:,start:,stop:" usage() { echo " Usage: $PROGNAME [options] [LinkBench root dir] Executes a TinyOS metric using different SVN revisions and the LinkBench TinyOS application. Revisions are going from 'start date' until 'stop date'. Date format is YYYY-MM-DD. Stop date is defaulted to the current date. Step size can be configured using the --step option. Options: -h|--help show this output -v|--version show version information -F|--benchfile the benchmark batch file to use [ default : $BENCH_FILE ] --start set the start date in format: YYYY-MM-DD --stop set the stop date in format: YYYY-MM-DD --svn
set the TinyOS root directory [ default : $TOSROOT ] --step set the step size in format : [1-9][0-9]* day|month|year examples: 10 day, 2 day, 2 month, 1 year " } check_params() { echo -e " SVN repository : \033[1m$TOSSVNDIR\033[0m" if [[ ! -d $TOSSVNDIR || ! -r $TOSSVNDIR || ! -w $TOSSVNDIR || ! -x $TOSSVNDIR ]]; then echo " '$TOSSVNDIR' is not a good location as SVN root directory!" exit 1 fi echo -e " LinkBench dir. : \033[1m$LINKBDIR\033[0m" if [[ ! -e $LINKBDIR/BenchmarkAppC.nc || ! -d $LINKBDIR/javasrc || ! -e $LINKBDIR/javasrc/build.xml ]]; then echo " '$LINKBDIR' does not seem to be the LinkBench application's root directory!" exit 1 fi echo -e " Benchmark file : \033[1m$BENCH_FILE\033[0m" if [[ ! -e $BENCH_FILE ]]; then echo " '$BENCH_FILE' does not exist!" exit 1 fi check_date $START_DATE if [ $? -gt 0 ]; then echo " '$START_DATE' is not a valid date!" exit 1 fi check_date $STOP_DATE if [ $? -gt 0 ]; then echo " '$STOP_DATE' is not a valid date!" exit 1 fi date1_le_date2 $START_DATE $STOP_DATE if [ $? -gt 0 ]; then echo " '$START_DATE' is in the future compared to '$STOP_DATE'!" exit 1 fi if [ `echo $DATE_STEP | grep -c '[1-9][0-9]* \(day\|month\|year\)'` -eq 0 ]; then echo " '$DATE_STEP' is not a valid time step!" exit 1 else DATE_STEP=`echo $DATE_STEP | grep -o '[1-9][0-9]* \(day\|month\|year\)'`; fi # count how many iterations we will have STEP_TOTAL=0 DATE_TMP=$START_DATE date1_le_date2 $DATE_TMP $STOP_DATE while [ $? -eq 0 ]; do ((STEP_TOTAL++)) DATE_TMP=`date -d "$DATE_TMP +$DATE_STEP" +%Y-%m-%d` date1_le_date2 $DATE_TMP $STOP_DATE done unset DATE_TMP echo -e " Date interval : \033[1m$START_DATE\033[0m -> \033[1m$STOP_DATE\033[0m with \033[1m$DATE_STEP\033[0m increment ( total of $STEP_TOTAL step(s) )" } # check if valid date check_date() { if [ `echo $1 | grep -E -c '[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}'` -eq 0 ]; then return 1; fi declare -i year month day eval $(echo $1 | sed 's:\([0-9]*\)-\([0-9]*\)-\([0-9]*\):year=\1 month=\2 day=\3:') return `cal $month $year | grep -c -w $day >/dev/null` } # check if $1 < $2 chronologically date1_le_date2() { if [[ `echo "$(date -d $1 +%s) <= $(date -d $2 +%s)" | bc` == "1" ]]; then return 0 else return 1 fi } check_last() { RET=$? DOFAIL="no" [ "$1" = "--fail" ] && DOFAIL="yes" && shift cat $3 >> $LOGFILE if [ $RET -eq 0 ]; then echo -ne "[\033[1m $1 \033[0m]" return 0 else echo -ne "[\033[1m $2 \033[0m]" [ $DOFAIL = "yes" ] && return 1 cat $3 rm $3 exit 1 fi } # # PARSE COMMAND LINE # ARGS=$(getopt -s bash --options $SHORTOPTS --longoptions $LONGOPTS --name $PROGNAME -- "$@" ) eval set -- "$ARGS" while true; do case $1 in -h|--help) usage; exit 0;; -v|--version) echo "$PROGNAME version $PROGVERSION"; exit 0;; -F|--benchfile) shift; BENCH_FILE=$1;; --svn) shift; TOSSVNDIR=$1;; --step) shift; DATE_STEP=$1;; --start) shift; START_DATE=$1;; --stop) shift; STOP_DATE=$1;; --) shift ; break ;; *) shift ; break ;; esac shift done # parse mandatory parameters if [[ $# -gt 0 ]]; then LINKBDIR=$1; fi # check for the established parameters if they are valid or not check_params SVNBIN=/usr/bin/svn TMP=`tempfile` trap '{ rm -f "$TMP"; }' EXIT # make executable the linkbench.sh script chmod +x linkbench.sh echo "-------------------------------------------------------------------------------------------" # while we do not run past the stop date STEP_CURRENT=0 NEXT_DATE=$START_DATE rm -f $LOGFILE while [ $STEP_CURRENT -lt $STEP_TOTAL ]; do ((STEP_CURRENT++)) # we can initiate the next svn update, to save as much time as we can. START_DATE=$NEXT_DATE NEXT_DATE=`date -d "$START_DATE +$DATE_STEP" +%Y-%m-%d` printf "(%2d/%2d) - %s : " $STEP_CURRENT $STEP_TOTAL $START_DATE | tee -a $LOGFILE # (1) update the svn repository ( cd $TOSSVNDIR; $SVNBIN update -r {$START_DATE} > $TMP 2>&1 ) check_last "Rev: `tail -1 $TMP | tr -cd '[:digit:]'`" "SVN ERROR" $TMP # (2) re-make the nesc code ( cd $LINKBDIR; ./minstall.sh --compileonly > $TMP 2>&1 ) check_last --fail "COMPILE OK" "COMPILE ERROR" $TMP || { echo ""; continue; } # (3) program the motes ( cd $LINKBDIR ; ./minstall.sh --progonly > $TMP 2>&1 ) check_last --fail "PROGRAM OK" "PROGRAM ERROR" $TMP || { echo ""; continue; } sleep 2 # (4) run the benchmark ./linkbench.sh -F $BENCH_FILE -o result-${START_DATE}.xml > $TMP 2>&1 check_last "RUN OK" "RUN ERROR" $TMP sleep 2 ./linkbench.sh -r > $TMP 2>&1 check_last "RESET OK" "RESET ERROR" $TMP # (5) clean ( cd $LINKBDIR; make clean 2>&1 | tee -a $LOGFILE > $TMP ) check_last "CLEAN OK" "CLEAN ERROR" $TMP echo "" done rm $TMP exit 0 tinyos-2.1.2+dfsg/apps/tests/LinkBench/scripts/000077500000000000000000000000001207233610700214125ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/LinkBench/scripts/make-tossim-network.py000066400000000000000000000015201207233610700257020ustar00rootroot00000000000000from TOSSIM import * import sys import time t = Tossim([]) r = t.radio(); t.addChannel("Benchmark", sys.stdout) sf = SerialForwarder(9002) th = Throttle(t,10); start = time.time(); m1 = t.getNode(1) m2 = t.getNode(2) # Set up a hidden terminal problem, where 1 and 3 # are closely synchronized, but cannot hear each other. m1.bootAtTime(345321); m2.bootAtTime(345335); r.add(0, 1, -60.0); r.add(1, 0, -60.0); r.add(0, 2, -60.0); r.add(2, 0, -60.0); r.add(1, 2, -60.0); r.add(2, 1, -80.0); noise = open("meyer-short.txt", "r") lines = noise.readlines() for line in lines: str = line.strip() if (str != ""): val = int(str) m1.addNoiseTraceReading(val) m2.addNoiseTraceReading(val) m1.createNoiseModel() m2.createNoiseModel() th.initialize(); while(1): th.checkThrottle(); t.runNextEvent(); sf.process(); tinyos-2.1.2+dfsg/apps/tests/LinkBench/scripts/meyer-short.txt000066400000000000000000000076331207233610700244420ustar00rootroot00000000000000-41 -41 -41 -41 -41 -41 -41 -91 -41 -41 -41 -41 -41 -48 -41 -41 -41 -83 -98 -80 -80 -79 -79 -79 -79 -98 -79 -80 -79 -80 -80 -80 -83 -83 -83 -83 -82 -82 -41 -82 -82 -82 -82 -82 -82 -41 -94 -93 -93 -87 -89 -90 -45 -92 -85 -98 -80 -80 -79 -78 -79 -79 -79 -97 -94 -83 -81 -80 -82 -81 -81 -84 -84 -86 -98 -89 -79 -79 -79 -79 -79 -79 -57 -79 -79 -79 -79 -79 -79 -79 -41 -84 -96 -97 -79 -90 -98 -79 -79 -79 -79 -79 -79 -92 -83 -83 -82 -81 -83 -80 -85 -82 -81 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -98 -98 -79 -79 -79 -79 -79 -78 -97 -91 -96 -91 -82 -82 -82 -82 -82 -82 -77 -82 -82 -82 -82 -82 -82 -98 -79 -79 -79 -79 -79 -79 -94 -98 -96 -81 -82 -82 -82 -82 -82 -91 -91 -93 -91 -91 -91 -91 -93 -91 -91 -91 -91 -91 -92 -91 -91 -87 -84 -79 -79 -79 -79 -79 -78 -94 -79 -79 -79 -79 -80 -79 -94 -98 -82 -83 -82 -82 -83 -83 -82 -41 -81 -98 -98 -98 -86 -82 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -90 -79 -79 -79 -78 -78 -79 -79 -79 -78 -79 -79 -79 -98 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -90 -82 -81 -82 -82 -81 -81 -82 -82 -82 -80 -82 -81 -81 -81 -42 -61 -96 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -98 -98 -98 -98 -41 -41 -98 -99 -84 -98 -41 -98 -98 -98 -85 -98 -96 -96 -91 -87 -98 -96 -99 -98 -90 -88 -86 -88 -96 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -84 -93 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -80 -80 -80 -79 -80 -80 -80 -80 -79 -79 -80 -80 -73 -80 -80 -80 -79 -78 -80 -80 -80 -80 -80 -79 -80 -74 -40 -40 -91 -40 -40 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -91 -91 -90 -97 -40 -40 -91 -91 -40 -40 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -96 -79 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -41 -40 -40 -40 -98 -80 -79 -79 -79 -79 -80 -80 -80 -80 -79 -80 -79 -40 -40 -40 -79 -79 -79 -79 -79 -79 -79 -79 -80 -80 -80 -79 -92 -83 -82 -83 -82 -82 -82 -83 -82 -81 -82 -82 -82 -90 -92 -82 -82 -83 -83 -83 -83 -83 -82 -82 -83 -83 -82 -42 -40 -40 -70 -82 -68 -80 -79 -80 -79 -80 -78 -80 -80 -80 -96 -80 -79 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -60 -79 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -99 -80 -80 -80 -80 -80 -79 -80 -80 -80 -79 -80 -80 -99 -84 -83 -83 -83 -84 -83 -83 -83 -84 -84 -84 -84 -84 -48 -79 -80 -80 -80 -80 -79 -80 -79 -80 -80 -79 -80 -91 -91 -91 -92 -91 -92 -94 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -58 -99 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -98 -80 -92 -92 -87 -98 -98 -86 -98 -98 -95 -98 -97 -99 -97 -41 -72 -87 -84 -84 -83 -82 -84 -78 -78 -79 -79 -79 -83 -85 -94 -83 -86 -87 -96 -84 -86 -88 -98 -96 -95 -85 -90 -98 -98 -98 -80 -80 -95 -98 -98 -96 -98 -98 -80 -99 -96 -80 -98 -96 -94 -98 -96 -99 -80 -80 -80 -80 -80 -45 -80 -91 -80 -80 -80 -82 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -40 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -40 -97 -84 -84 -84 -84 -84 -84 -84 -85 -84 -81 -84 -85 -97 -85 -85 -86 -85 -85 -82 -85 -85 -85 -85 -85 -85 -87 -86 -85 -86 -86 -85 -84 -86 -84 -85 -86 -86 -70 -86 -86 -86 -86 -86 -86 -86 -86 -86 -86 -86 -86 -41 -94 -41 -40 -97 -80 -40 -91 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -40 -93 -93 -40 -40 -93 -93 -98 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -40 -40 -93 -85 -85 -82 -82 -83 -86 -85 -86 -84 -85 -82 -83 -84 -85 -40 -40 -78 -40 -98 -98 -98 -99 -41 -80 -80 -78 -81 -79 -81 -81 -79 -81 -81 -81 -81 -96 -98 -80 -93 -80 -96 -98 -98 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -98 -80 -80 -81 -80 -80 -80 -80 -80 -80 -81 -80 -80 -99 -90 -84 -82 -86 -85 -85 -85 -85 -86 -86 -85 -86 -86 -98 -96 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -81 -80 -48 -90 -89 -79 -93 -91 -95 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -95 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -96 -98 -98 -99 -71 -98 -98 -99 -98 -98 -98 -98 -98 tinyos-2.1.2+dfsg/apps/tests/LinkBench/scripts/minstall.sh000066400000000000000000000136161207233610700236000ustar00rootroot00000000000000#!/bin/bash # Install the desired nesC code to currently connected motes. Automatic mote # detection works only with telosa,telosb, and iris motes (but can be easily extended). # PROGNAME=${0##*/} # default values START_ID=1 VERBOSE=yes PROGONLY=no COMPILEONLY=no IGNOREUSB=0 LOGFILE=${0%.*}.log SHORTOPTS="hqi:" LONGOPTS="help,quiet,startid:,ignoreusb:,progonly,compileonly" usage() { echo " Usage: $PROGNAME [options] [ platform ] Compiles TinyOS code and programs multiple motes in parallel. Note that by default, mote on /dev/ttyUSB0 is ignored (used to be a BaseStation). Options: -h|--help show this output -q|--quiet stay quiet --startid start the TOS_NODE_ID count from 'num' [ default : $START_ID ] -i|--ignoreusb ignore the mote on port /dev/ttyUSBX [ default : $IGNOREUSB ] --progonly do not compile, only program --compileonly do not program, only compile " } array_find() { key=$1; shift for i; do [ "$i" = $key ] && return 0; done; return 1; } # detect mote USB devices # tested for telosa/telosb/iris motes detect_motes() { TMP=`tempfile` ( for udi in `hal-find-by-capability --capability serial | sort` do parent=`hal-get-property --udi ${udi} --key "info.parent"` grandpa=`hal-get-property --udi ${parent} --key "info.parent"` serial=`hal-get-property --udi ${grandpa} --key "usb_device.serial"` vendor=`hal-get-property --udi ${parent} --key "usb.vendor_id"` product=`hal-get-property --udi ${parent} --key "usb.product_id"` device=`hal-get-property --udi ${udi} --key "linux.device_file"` desc=`hal-get-property --udi ${parent} --key "usb.interface.description"` echo $serial $vendor $product $device $desc >> $TMP; [ $VERBOSE != "no" ] && echo "Detected : $serial $vendor $product $device $desc" done ) if [[ `cat $TMP | wc -l` == "0" ]]; then [ $VERBOSE != "no" ] && echo "No devices found." rm $TMP return 1 fi TELOS_B=`sort $TMP | grep '1027 24577.*Rev.B' | awk '{print $4}'` TELOS_A=`sort $TMP | grep '1027 24577.*Rev A' | awk '{print $4}'` MIB520=`sort $TMP | grep '1027 24592' | awk '{print $4}' | sed -n '1~2p'` for device in `cat $TMP | awk '{print $4}' | sort`; do # fall over if we should ignore the current device echo $device | grep -q "/dev/tt.USB$IGNOREUSB" if [ $? -eq 0 ]; then [ $VERBOSE != "no" ] && echo -e "Skipping device on \033[1m/dev/ttyUSB$IGNOREUSB\033[0m" continue fi # else, go ahead array_find $device $TELOS_B && PRPLAN="$PRPLAN telosb $device " && PLATFORMS="$PLATFORMS telosb" array_find $device $TELOS_A && PRPLAN="$PRPLAN telosa $device " && PLATFORMS="$PLATFORMS telosa" array_find $device $MIB520 && PRPLAN="$PRPLAN $1 $device " && PLATFORMS="$PLATFORMS $1" done rm $TMP return 0 } # compile the application's code compile_code() { QUEUE="" for platform in `echo $@ | tr ' ' '\n' | sort | uniq`; do [ $VERBOSE != "no" ] && echo -e "Compile job for : \033[1m$platform\033[0m" make $platform 1>$LOGFILE-$platform 2>&1 & # push the last make command's PID to the queue QUEUE="$QUEUE $!" done # wait for completion wait $QUEUE; ERROR=$? # assemble logs for platform in `echo $@ | tr ' ' '\n' | sort | uniq`; do cat $LOGFILE-$platform >> $LOGFILE rm $LOGFILE-$platform done if [ $ERROR -ne 0 ]; then echo "Error : Compilation failed !" echo "----------------------------" cat $LOGFILE rm $LOGFILE exit 1 else [ $VERBOSE != "no" ] && echo "Compilation succeeded." rm $LOGFILE fi } # programs motes in parallel defined by the progamming plan # plan is to be given in ... form program_motes() { QUEUE="" PLATFORM_SET="" ERROR=0 tnid=$START_ID while [ $# -ne 0 ]; do platform=$1; device=$2; shift 2 PLATFORM_SET="$PLATFORM_SET $platform " [ $VERBOSE != "no" ] && echo -e "Programming job for : \033[1m$platform\033[0m on \033[1m$device\033[0m with TOS_NODE_ID \033[1m$tnid\033[0m." case "$platform" in iris) make $platform reinstall,$tnid mib520,$device 1>$LOGFILE-$platform-$tnid 2>&1 & ;; telosa|telosb) make $platform reinstall,$tnid bsl,$device 1>$LOGFILE-$platform-$tnid 2>&1 & ;; *) [ $VERBOSE != "no" ] && echo " (UNKNOWN PLATFORM)" > $LOGFILE-$platform-$id; ERROR=1 break; ;; esac ((tnid++)) # push the last make command's PID to the queue QUEUE="$QUEUE $!" done wait $QUEUE; ((ERROR+=$?)) # assemble logs tnid=$START_ID for platform in $PLATFORM_SET; do cat $LOGFILE-$platform-$tnid >> $LOGFILE rm $LOGFILE-$platform-$tnid ((tnid++)) done if [ $ERROR -ne 0 ]; then echo "Error : Programming failed !" echo "----------------------------" cat $LOGFILE rm $LOGFILE exit 1 else [ $VERBOSE != "no" ] && echo "Programming succeeded." rm $LOGFILE fi } # # PARSE COMMAND LINE # ARGS=$(getopt -s bash --options $SHORTOPTS --longoptions $LONGOPTS --name $PROGNAME -- "$@" ) eval set -- "$ARGS" while true; do case $1 in -h|--help) usage; exit 0;; -q|--quiet) VERBOSE=no;; --startid) shift; START_ID=$1;; -i|--ignoreusb) shift IGNOREUSB=$1;; --progonly) PROGONLY='yes';; --compileonly) COMPILEONLY='yes';; --) shift ; break ;; *) shift ; break ;; esac shift done # detect the motes connected detect_motes $1 if [[ $? -ne 0 || $PLATFORMS = "" || $PRPLAN = "" ]]; then [ $VERBOSE != "no" ] && echo "Nothing to do. Quitting." exit 1 fi # compile the application if [ $PROGONLY != 'yes' ]; then compile_code $PLATFORMS fi # program the motes if [ $COMPILEONLY != 'yes' ]; then program_motes $PRPLAN fi exit 0 tinyos-2.1.2+dfsg/apps/tests/LinkBench/scripts/mstats.awk000066400000000000000000000031721207233610700234340ustar00rootroot00000000000000function line_filter() { gsub(/[^0-9]/," "); gsub(/ +/," "); sub(/^ /,""); } BEGIN { FS="[<|>| ]"; skip=1; cnt=0; } // { if ($3 == benchmark) { bidx=$3; statstr=profstr=timerstr=""; skip = 0; } else skip = 1; } // { pre_runtime = $3; } // { runtime = $3; } // { post_runtime = $3; } /On<\/ack>/ { ack=1; } /Off<\/ack>/ { ack=0; } /On<\/bcast>/ { bcast=1; } /Off<\/bcast>/ { bcast=0; } // { if ($3!="") skip=1; } /<\/testresult>/ { if (!skip) { if (svn) { printf "RES.stats(:,:,%d,%d) = [%s];\n",++cnt,svn,statstr; printf "RES.profiles(:,:,%d,%d) = [%s];\n",cnt,svn,profstr; printf "RES.timers(:,:,%d,%d) = [%s];\n",cnt,svn,timerstr; } else { printf "RES.stats(:,:,%d) = [%s];\n",++cnt,statstr; printf "RES.profiles(:,:,%d) = [%s];\n",cnt,profstr; printf "RES.timers(:,:,%d) = [%s];\n",cnt,timerstr; } }} END { printf "RES.config.bidx = %d;\n",bidx; printf "RES.config.pre_runtime = %d;\n",pre_runtime; printf "RES.config.runtime = %d;\n",runtime; printf "RES.config.post_runtime = %d;\n",post_runtime; printf "RES.config.bcast = %d;\n",bcast; printf "RES.config.ack = %d;\n",ack; printf "RES.name = 'RES';\n"; } tinyos-2.1.2+dfsg/apps/tests/LinkBench/scripts/mstats.sh000066400000000000000000000032651207233610700232670ustar00rootroot00000000000000#!/bin/bash PROGNAME=${0##*/} LOGFILE=${0%.*}.log SHORTOPTS="hr:o:" LONGOPTS="help" # default values RESULT_NAME="R" OUTPUT="results.m" usage() { echo " Usage: $PROGNAME [options] < XML file(s) > Creates statistics based on XML files. Output is a MATLAB data script. Options: -h display this help message -r set the output MATLAB variable name -o set the output file name " } # # PARSE COMMAND LINE # ################################################## ARGS=$(getopt -s bash --options $SHORTOPTS --longoptions $LONGOPTS --name $PROGNAME -- "$@" ) eval set -- "$ARGS" while true; do case $1 in -h|--help) usage; exit 0;; -r) shift; RESULT_NAME=$1;; -o) shift; OUTPUT=$1;; *) shift ; break;; esac shift done # # HANDLE ERRORS # ################################################## if [ $# -eq 0 ]; then echo "No XML files specified! See help (-h)!" exit 1 fi rm -f $OUTPUT # Make statistics for all files separately SVN=1; for f in $@; do if [[ ! -e $f || ! -f $f || ! -r $f ]]; then echo "$f does not exist, is not a file, or not readable!" exit 1 fi # get the list of available benchmarks in the file BENCHS=$(grep benchidx $f | tr -cd '[0-9]\n' | sort -n | uniq) echo -n "Processing $f ... " for bidx in $BENCHS; do echo -n "$bidx " if [ $# -gt 1 ]; then gawk -f mstats.awk benchmark=$bidx svn=$SVN $f | sed "s:RES:${RESULT_NAME}_$bidx:g" >> $OUTPUT SVN=$(($SVN+1)) else gawk -f mstats.awk benchmark=$bidx $f | sed "s:RES:${RESULT_NAME}_$bidx:g" >> $OUTPUT fi done echo "done" done tinyos-2.1.2+dfsg/apps/tests/NxFloat/000077500000000000000000000000001207233610700174415ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/NxFloat/Makefile000066400000000000000000000005671207233610700211110ustar00rootroot00000000000000COMPONENT=TestSerialAppC BUILD_EXTRA_DEPS += TestSerial.class CLEAN_EXTRA = *.class TestSerialMsg.java CFLAGS += -I$(TOSDIR)/lib/T2Hack TestSerial.class: $(wildcard *.java) TestSerialMsg.java javac -target 1.4 -source 1.4 *.java TestSerialMsg.java: mig java -target=null $(CFLAGS) -java-classname=TestSerialMsg TestSerial.h test_serial_msg -o $@ include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/NxFloat/README.txt000066400000000000000000000017451207233610700211460ustar00rootroot00000000000000README for NxFloat Author/Contact: tinyos-help@millennium.berkeley.edu Description: NxFloat is a version of the TestSerial application modified to use floating point numbers. It tests communication over the serial port and nx_float support. The java application sends packets to the serial port at 1Hz: the packet contains an incrementing counter. When the mote application receives a counter packet, it displays the bottom three bits on its LEDs. (This application is similar to RadioCountToLeds, except that it operates over the serial port.) Likewise, the mote also sends packets to the serial port at 1Hz, these packets contain a sequence number multiplied by 3.2. Upon reception of a packet, the java application prints the counter's value to standard out. Java Application Usage: java TestSerial [-comm ] If not specified, the defaults to sf@localhost:9002 or to your MOTECOM environment variable (if defined). Tools: Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/NxFloat/TestSerial.h000066400000000000000000000002531207233610700216710ustar00rootroot00000000000000 #ifndef TEST_SERIAL_H #define TEST_SERIAL_H typedef nx_struct test_serial_msg { nx_float counter; } test_serial_msg_t; enum { AM_TEST_SERIAL_MSG = 0x89, }; #endif tinyos-2.1.2+dfsg/apps/tests/NxFloat/TestSerial.java000066400000000000000000000067231207233610700223730ustar00rootroot00000000000000/* tab:4 * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Java-side application for testing serial port communication. * * * @author Phil Levis * @date August 12 2005 */ import java.io.IOException; import net.tinyos.message.*; import net.tinyos.packet.*; import net.tinyos.util.*; public class TestSerial implements MessageListener { private MoteIF moteIF; public TestSerial(MoteIF moteIF) { this.moteIF = moteIF; this.moteIF.registerListener(new TestSerialMsg(), this); } public void sendPackets() { int counter = 0; TestSerialMsg payload = new TestSerialMsg(); try { while (true) { System.out.println("Sending packet " + counter); payload.set_counter(counter); moteIF.send(0, payload); counter++; try {Thread.sleep(1000);} catch (InterruptedException exception) {} } } catch (IOException exception) { System.err.println("Exception thrown when sending packets. Exiting."); System.err.println(exception); } } public void messageReceived(int to, Message message) { TestSerialMsg msg = (TestSerialMsg)message; System.out.println("Received packet sequence number " + msg.get_counter()); } private static void usage() { System.err.println("usage: TestSerial [-comm ]"); } public static void main(String[] args) throws Exception { String source = null; if (args.length == 2) { if (!args[0].equals("-comm")) { usage(); System.exit(1); } source = args[1]; } else if (args.length != 0) { usage(); System.exit(1); } PhoenixSource phoenix; if (source == null) { phoenix = BuildSource.makePhoenix(PrintStreamMessenger.err); } else { phoenix = BuildSource.makePhoenix(source, PrintStreamMessenger.err); } MoteIF mif = new MoteIF(phoenix); TestSerial serial = new TestSerial(mif); serial.sendPackets(); } } tinyos-2.1.2+dfsg/apps/tests/NxFloat/TestSerialAppC.nc000066400000000000000000000061001207233610700226030ustar00rootroot00000000000000// $Id: TestSerialAppC.nc,v 1.2 2010-06-29 22:07:20 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Application to test that the TinyOS java toolchain can communicate * with motes over the serial port. The application sends packets to * the serial port at 1Hz: the packet contains an incrementing * counter. When the application receives a counter packet, it * displays the bottom three bits on its LEDs. This application is * very similar to RadioCountToLeds, except that it operates over the * serial port. There is Java application for testing the mote * application: run TestSerial to print out the received packets and * send packets to the mote. * * @author Gilman Tolle * @author Philip Levis * * @date Aug 12 2005 * **/ #include "TestSerial.h" configuration TestSerialAppC {} implementation { components TestSerialC as App, LedsC, MainC; components SerialActiveMessageC as AM; components new TimerMilliC(); App.Boot -> MainC.Boot; App.Control -> AM; App.Receive -> AM.Receive[AM_TEST_SERIAL_MSG]; App.AMSend -> AM.AMSend[AM_TEST_SERIAL_MSG]; App.Leds -> LedsC; App.MilliTimer -> TimerMilliC; App.Packet -> AM; } tinyos-2.1.2+dfsg/apps/tests/NxFloat/TestSerialC.nc000066400000000000000000000077411207233610700221560ustar00rootroot00000000000000// $Id: TestSerialC.nc,v 1.2 2010-06-29 22:07:20 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Application to test that the TinyOS java toolchain can communicate * with motes over the serial port. * * @author Gilman Tolle * @author Philip Levis * * @date Aug 12 2005 * **/ #include "Timer.h" #include "TestSerial.h" module TestSerialC { uses { interface SplitControl as Control; interface Leds; interface Boot; interface Receive; interface AMSend; interface Timer as MilliTimer; interface Packet; } } implementation { message_t packet; bool locked = FALSE; uint16_t counter = 0; event void Boot.booted() { call Control.start(); } event void MilliTimer.fired() { counter++; if (locked) { return; } else { test_serial_msg_t* rcm = (test_serial_msg_t*)call Packet.getPayload(&packet, sizeof(test_serial_msg_t)); if (rcm == NULL) {return;} if (call Packet.maxPayloadLength() < sizeof(test_serial_msg_t)) { return; } rcm->counter = counter * 3.2; if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(test_serial_msg_t)) == SUCCESS) { locked = TRUE; } } } event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) { if (len != sizeof(test_serial_msg_t)) {return bufPtr;} else { test_serial_msg_t* rcm = (test_serial_msg_t*)payload; if ((int)rcm->counter & 0x1) { call Leds.led0On(); } else { call Leds.led0Off(); } if ((int)rcm->counter & 0x2) { call Leds.led1On(); } else { call Leds.led1Off(); } if ((int)rcm->counter & 0x4) { call Leds.led2On(); } else { call Leds.led2Off(); } return bufPtr; } } event void AMSend.sendDone(message_t* bufPtr, error_t error) { if (&packet == bufPtr) { locked = FALSE; } } event void Control.startDone(error_t err) { if (err == SUCCESS) { call MilliTimer.startPeriodic(1000); } } event void Control.stopDone(error_t err) {} } tinyos-2.1.2+dfsg/apps/tests/TestAdc/000077500000000000000000000000001207233610700174155ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestAdc/Makefile000066400000000000000000000000531207233610700210530ustar00rootroot00000000000000COMPONENT=TestAdcAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestAdc/README.txt000066400000000000000000000014061207233610700211140ustar00rootroot00000000000000README for TestAdc Author/Contact: tinyos-help@millennium.berkeley.edu Description: TestAdc is an application for testing the ADC subsystem. It requires a generic platform dependent DemoSensorC, DemoSensorNowC and DemoSensorStreamC components that provide the following interfaces: Read (DemoSensorC), ReadStream (DemoSensorStreamC) and ReadNow and Resource (DemoSensorNowC). It requests data via the three data collection interfaces and switches on leds 0, 1 and 2 when the conversion results are signalled from the ADC subsystem: LED0 denotes a successful Read operation, LED1 denotes a successful ReadNow operation, LED2 denotes a successful ReadStream operation. Please refer to TEP 101 for more information on the ADC abstraction. tinyos-2.1.2+dfsg/apps/tests/TestAdc/TestAdcAppC.nc000066400000000000000000000054401207233610700220350ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:22:49 $ * @author: Jan Hauer * ======================================================================== */ /** * Tests the AdcC subsystem and switches on leds 0, 1 and 2 * if the test is successful: * LED0 denotes a successful Read operation, * LED1 denotes a successful ReadNow operation, * LED2 denotes a successful ReadStream operation. * * Requires a platform-specific DemoSensorC component that provides * Read, a platform-specific DemoSensorStreamC component that provides * ReadStream and a platform-specific DemoSensorNowC component that provides * ReadNow and Resource * * @author Jan Hauer */ configuration TestAdcAppC { } implementation { components MainC, TestAdcC, new DemoSensorC() as Sensor, new DemoSensorNowC() as SensorNow, new DemoSensorStreamC() as SensorStream, LedsC; TestAdcC -> MainC.Boot; TestAdcC.Leds -> LedsC; TestAdcC.Read -> Sensor; TestAdcC.ReadNow -> SensorNow; TestAdcC.ReadNowResource -> SensorNow; TestAdcC.ReadStream -> SensorStream; } tinyos-2.1.2+dfsg/apps/tests/TestAdc/TestAdcC.nc000066400000000000000000000063641207233610700214020ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2008-05-20 18:16:15 $ * @author: Jan Hauer * ======================================================================== */ /** * Tests the AdcC subsystem and switches on leds 0, 1 and 2. * if the test is successful: * LED0 denotes a successful Read operation, * LED1 denotes a successful ReadNow operation, * LED2 denotes a successful ReadStream operation. * * @author Jan Hauer */ module TestAdcC { uses interface Read as Read; uses interface ReadNow as ReadNow; uses interface Resource as ReadNowResource; uses interface ReadStream as ReadStream; uses interface Boot; uses interface Leds; } implementation { #define BUF_SIZE 100 uint16_t buf[BUF_SIZE]; bool streamSuccess; event void Boot.booted() { streamSuccess = FALSE; call Read.read(); call ReadStream.postBuffer(buf, BUF_SIZE); call ReadStream.read(10000); call ReadNowResource.request(); } event void Read.readDone(error_t result, uint16_t data) { if (result == SUCCESS) call Leds.led0On(); } event void ReadNowResource.granted() { call ReadNow.read(); } async event void ReadNow.readDone(error_t result, uint16_t data) { if (result == SUCCESS) call Leds.led1On(); call ReadNowResource.release(); } event void ReadStream.bufferDone( error_t result, uint16_t* buffer, uint16_t count ) { streamSuccess = TRUE; } event void ReadStream.readDone(error_t result, uint32_t actualPeriod) { if (result == SUCCESS && streamSuccess) call Leds.led2On(); } } tinyos-2.1.2+dfsg/apps/tests/TestDhv/000077500000000000000000000000001207233610700174475ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestDhv/DhvInject.java000066400000000000000000000036401207233610700221730ustar00rootroot00000000000000 import java.io.*; import net.tinyos.message.*; import net.tinyos.util.*; public class DhvInject implements MessageListener { MoteIF mote; DhvInject(DhvMsg dhvmsg) { mote = new MoteIF(PrintStreamMessenger.err); mote.registerListener(dhvmsg, this); } public synchronized void messageReceived(int dest_addr, Message message) { // do nothing for now } void sendDhvDataMsg(int key, long version, short[] data) { int totalsize = DhvMsg.DEFAULT_MESSAGE_SIZE + DhvDataMsg.DEFAULT_MESSAGE_SIZE + DhvData.DEFAULT_MESSAGE_SIZE; DhvMsg dm = new DhvMsg(totalsize); dm.set_type((short)3); DhvDataMsg ddm = new DhvDataMsg(dm, DhvMsg.DEFAULT_MESSAGE_SIZE); ddm.set_key(key); ddm.set_version(version << 16); ddm.set_size((short)data.length); DhvData dd = new DhvData(ddm, DhvDataMsg.DEFAULT_MESSAGE_SIZE); dd.set_data(data); try { mote.send(MoteIF.TOS_BCAST_ADDR, dd); } catch(IOException e) { System.err.println("Cannot send message"); } } public static void main(String args[]) { int i; System.out.println("Usage: java DhvInject [key] [version] [hex data delimit space in quotes]"); int k = Integer.parseInt(args[0], 16); long v = Long.parseLong(args[1]); String hexdata[] = args[2].split(" "); short d[]; if(hexdata.length > 16) { System.err.println("Data too long, keep it <= 16 bytes please"); } d = new short[hexdata.length]; for(i = 0; i < d.length; i++) d[i] = Short.parseShort(hexdata[i], 16); System.out.println("Key: " + k); System.out.println("Version: " + v); System.out.print("Data: "); for(i = 0; i < d.length; i++) { System.out.print(d[i] + " "); } System.out.println(); DhvInject dhvinject = new DhvInject(new DhvMsg()); dhvinject.sendDhvDataMsg(k, v, d); } } tinyos-2.1.2+dfsg/apps/tests/TestDhv/Makefile000066400000000000000000000036451207233610700211170ustar00rootroot00000000000000COMPONENT=TestDhvC BUILD_EXTRA_DEPS = DhvMsg.py DhvDataMsg.py DhvMsg.class DhvDataMsg.class DhvData.class DhvInject.class DhvTestMsg.class CFLAGS += -I$(TOSDIR)/lib/net #CFLAGS += -DLOW_POWER_LISTENING #CFLAGS += -DLPL_DEF_LOCAL_SLEEP=512 #CFLAGS += -DLPL_DEF_RX_SLEEP=512 #CFLAGS += -DDELAY_AFTER_RECEIVE=20 CFLAGS += -I$(TOSDIR)/lib/net/dhv -I$(TOSDIR)/lib/net/dhv/interfaces #CFLAGS += -I$(TOSDIR)/lib/net/dhv -I$(TOSDIR)/lib/net/dhv/interfaces #CFLAGS += -I$(TOSDIR)/lib/net/drip CONSTANTS += -DTOSH_DATA_LENGTH=32 CFLAGS += $(CONSTANTS) CLEAN_EXTRA += DhvMsg.py DhvDataMsg.py DhvData.py DhvMsg.java DhvDataMsg.java DhvData.java DhvMsg.class DhvDataMsg.class DhvData.class DhvInject.class DhvTestMsg.class DhvTestMsg.java DhvMsg.py: mig python -target=$(PLATFORM) -python-classname=DhvMsg $(CFLAGS) $(TOSDIR)/lib/net/dhv/Dhv.h dhv_msg -o $@ DhvDataMsg.py: mig python -target=$(PLATFORM) -python-classname=DhvDataMsg -python-extends=DhvMsg $(CFLAGS) $(TOSDIR)/lib/net/dhv/Dhv.h dhv_data_msg -o $@ DhvData.py: mig python -target=$(PLATFORM) -python-classname=DhvData -python-extends=DhvDataMsg $(CFLAGS) $(TOSDIR)/lib/net/dhv/Dhv.h dhv_data -o $@ DhvTestMsg.class: DhvTestMsg.java javac DhvTestMsg.java DhvMsg.class: DhvMsg.java javac DhvMsg.java DhvDataMsg.class: DhvDataMsg.java javac DhvDataMsg.java DhvData.class: DhvData.java javac DhvData.java DhvTestMsg.java: mig java -target=null -java-classname=DhvTestMsg $(CFLAGS) $(TOSDIR)/lib/net/dhv/Dhv.h dhv_test_msg -o $@ DhvMsg.java: mig java -target=null -java-classname=DhvMsg $(CFLAGS) $(TOSDIR)/lib/net/dhv/Dhv.h dhv_msg -o $@ DhvDataMsg.java: mig java -target=null -java-classname=DhvDataMsg -java-extends=DhvMsg $(CFLAGS) $(TOSDIR)/lib/net/dhv/Dhv.h dhv_data_msg -o $@ DhvData.java: mig java -target=null -java-classname=DhvData -java-extends=DhvDataMsg $(CFLAGS) $(TOSDIR)/lib/net/dhv/Dhv.h dhv_data -o $@ DhvInject.class: javac DhvInject.java include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestDhv/README000066400000000000000000000032421207233610700203300ustar00rootroot00000000000000 Title: TestDhv Application Author: Thanh Dang, Sweungweon Park adopted from TestDip 1. SETTING UP THE TEST You need to first generate the code for compilation. The gentest.py script reads in the Master files and creates TestDhvC.nc (the configuration) and TestDhvP.nc (the module). It takes two parameters, the total number of items and the number of new items. The items that are random are chosen randomly. If you want 128 total items in the dissemination set, where 96 of those 128 items are new, you would type: python gentest.py 128 96 After the configuration and module have been generated, you can use the normal compilation method (e.g. make telosb). 2, READING THE LEDS When an node receives a new item, it toggles LED0. When a node completes all items, it turns all LEDs on. 3. SERIAL MESSAGES typedef nx_struct dhv_test_msg_t { nx_am_addr_t id; nx_uint8_t count; nx_uint8_t isOk; } dhv_test_msg_t; When a node receives a new item, it sends a dhv_test_msg_t through the serial interface. id is the node id count is how many new items it has received so far isOk will be true if the data value was as expected 4. PACKET INJECTOR You can also use the injector to send data packets via a basestation. The syntax to do that is: java DhvInject [key] [version] [data in quotes delimited by space] key is the data key in hexadecimal version is the version number in decimal data is the actual data in quotes delimited by space For example, if you want to send key 10, version 2, and data "ab cd ef". You would type: java DipInject 0a 2 "ab cd ef" For this specific test application, your data needs to be "ef be". You will need a SerialForwarder running for this work. tinyos-2.1.2+dfsg/apps/tests/TestDhv/TestDhv.h000066400000000000000000000001341207233610700211770ustar00rootroot00000000000000#ifndef __TESTDHV_H__ #define __TESTDHV_H__ /*enum { AM_DHV_TEST_MSG = 0xAB };*/ #endif tinyos-2.1.2+dfsg/apps/tests/TestDhv/TestDhvC-Master.nc000066400000000000000000000012661207233610700227130ustar00rootroot00000000000000#include "TestDhv.h" configuration TestDhvC { } implementation { components TestDhvP; components LedsC as LedsC; TestDhvP.Leds -> LedsC; components DisseminationC; TestDhvP.StdControl -> DisseminationC; /* components new DisseminatorC(uint32_t, 0x1) as Dissem1; TestDhvP.DisseminationValue1 -> Dissem1; TestDhvP.DisseminationUpdate1 -> Dissem1; */ // ... DISSEMINATORS components MainC; TestDhvP.Boot -> MainC; components SerialActiveMessageC; components new SerialAMSenderC(AM_DHV_TEST_MSG); TestDhvP.SerialSend -> SerialAMSenderC; TestDhvP.SerialControl -> SerialActiveMessageC; components ActiveMessageC; TestDhvP.AMControl -> ActiveMessageC; } tinyos-2.1.2+dfsg/apps/tests/TestDhv/TestDhvC.nc000066400000000000000000000236431207233610700214650ustar00rootroot00000000000000#include "TestDhv.h" configuration TestDhvC { } implementation { components TestDhvP; components LedsC as LedsC; TestDhvP.Leds -> LedsC; components DisseminationC; TestDhvP.StdControl -> DisseminationC; /* components new DisseminatorC(uint32_t, 0x1) as Dissem1; TestDhvP.DisseminationValue1 -> Dissem1; TestDhvP.DisseminationUpdate1 -> Dissem1; */ components new DisseminatorC(uint16_t, 1) as Dissem1; TestDhvP.DisseminationUpdate1 -> Dissem1; TestDhvP.DisseminationValue1 -> Dissem1; components new DisseminatorC(uint16_t, 2) as Dissem2; TestDhvP.DisseminationUpdate2 -> Dissem2; TestDhvP.DisseminationValue2 -> Dissem2; components new DisseminatorC(uint16_t, 3) as Dissem3; TestDhvP.DisseminationUpdate3 -> Dissem3; TestDhvP.DisseminationValue3 -> Dissem3; components new DisseminatorC(uint16_t, 4) as Dissem4; TestDhvP.DisseminationUpdate4 -> Dissem4; TestDhvP.DisseminationValue4 -> Dissem4; components new DisseminatorC(uint16_t, 5) as Dissem5; TestDhvP.DisseminationUpdate5 -> Dissem5; TestDhvP.DisseminationValue5 -> Dissem5; components new DisseminatorC(uint16_t, 6) as Dissem6; TestDhvP.DisseminationUpdate6 -> Dissem6; TestDhvP.DisseminationValue6 -> Dissem6; components new DisseminatorC(uint16_t, 7) as Dissem7; TestDhvP.DisseminationUpdate7 -> Dissem7; TestDhvP.DisseminationValue7 -> Dissem7; components new DisseminatorC(uint16_t, 8) as Dissem8; TestDhvP.DisseminationUpdate8 -> Dissem8; TestDhvP.DisseminationValue8 -> Dissem8; components new DisseminatorC(uint16_t, 9) as Dissem9; TestDhvP.DisseminationUpdate9 -> Dissem9; TestDhvP.DisseminationValue9 -> Dissem9; components new DisseminatorC(uint16_t, 10) as Dissem10; TestDhvP.DisseminationUpdate10 -> Dissem10; TestDhvP.DisseminationValue10 -> Dissem10; components new DisseminatorC(uint16_t, 11) as Dissem11; TestDhvP.DisseminationUpdate11 -> Dissem11; TestDhvP.DisseminationValue11 -> Dissem11; components new DisseminatorC(uint16_t, 12) as Dissem12; TestDhvP.DisseminationUpdate12 -> Dissem12; TestDhvP.DisseminationValue12 -> Dissem12; components new DisseminatorC(uint16_t, 13) as Dissem13; TestDhvP.DisseminationUpdate13 -> Dissem13; TestDhvP.DisseminationValue13 -> Dissem13; components new DisseminatorC(uint16_t, 14) as Dissem14; TestDhvP.DisseminationUpdate14 -> Dissem14; TestDhvP.DisseminationValue14 -> Dissem14; components new DisseminatorC(uint16_t, 15) as Dissem15; TestDhvP.DisseminationUpdate15 -> Dissem15; TestDhvP.DisseminationValue15 -> Dissem15; components new DisseminatorC(uint16_t, 16) as Dissem16; TestDhvP.DisseminationUpdate16 -> Dissem16; TestDhvP.DisseminationValue16 -> Dissem16; components new DisseminatorC(uint16_t, 17) as Dissem17; TestDhvP.DisseminationUpdate17 -> Dissem17; TestDhvP.DisseminationValue17 -> Dissem17; components new DisseminatorC(uint16_t, 18) as Dissem18; TestDhvP.DisseminationUpdate18 -> Dissem18; TestDhvP.DisseminationValue18 -> Dissem18; components new DisseminatorC(uint16_t, 19) as Dissem19; TestDhvP.DisseminationUpdate19 -> Dissem19; TestDhvP.DisseminationValue19 -> Dissem19; components new DisseminatorC(uint16_t, 20) as Dissem20; TestDhvP.DisseminationUpdate20 -> Dissem20; TestDhvP.DisseminationValue20 -> Dissem20; components new DisseminatorC(uint16_t, 21) as Dissem21; TestDhvP.DisseminationUpdate21 -> Dissem21; TestDhvP.DisseminationValue21 -> Dissem21; components new DisseminatorC(uint16_t, 22) as Dissem22; TestDhvP.DisseminationUpdate22 -> Dissem22; TestDhvP.DisseminationValue22 -> Dissem22; components new DisseminatorC(uint16_t, 23) as Dissem23; TestDhvP.DisseminationUpdate23 -> Dissem23; TestDhvP.DisseminationValue23 -> Dissem23; components new DisseminatorC(uint16_t, 24) as Dissem24; TestDhvP.DisseminationUpdate24 -> Dissem24; TestDhvP.DisseminationValue24 -> Dissem24; components new DisseminatorC(uint16_t, 25) as Dissem25; TestDhvP.DisseminationUpdate25 -> Dissem25; TestDhvP.DisseminationValue25 -> Dissem25; components new DisseminatorC(uint16_t, 26) as Dissem26; TestDhvP.DisseminationUpdate26 -> Dissem26; TestDhvP.DisseminationValue26 -> Dissem26; components new DisseminatorC(uint16_t, 27) as Dissem27; TestDhvP.DisseminationUpdate27 -> Dissem27; TestDhvP.DisseminationValue27 -> Dissem27; components new DisseminatorC(uint16_t, 28) as Dissem28; TestDhvP.DisseminationUpdate28 -> Dissem28; TestDhvP.DisseminationValue28 -> Dissem28; components new DisseminatorC(uint16_t, 29) as Dissem29; TestDhvP.DisseminationUpdate29 -> Dissem29; TestDhvP.DisseminationValue29 -> Dissem29; components new DisseminatorC(uint16_t, 30) as Dissem30; TestDhvP.DisseminationUpdate30 -> Dissem30; TestDhvP.DisseminationValue30 -> Dissem30; components new DisseminatorC(uint16_t, 31) as Dissem31; TestDhvP.DisseminationUpdate31 -> Dissem31; TestDhvP.DisseminationValue31 -> Dissem31; components new DisseminatorC(uint16_t, 32) as Dissem32; TestDhvP.DisseminationUpdate32 -> Dissem32; TestDhvP.DisseminationValue32 -> Dissem32; components new DisseminatorC(uint16_t, 33) as Dissem33; TestDhvP.DisseminationUpdate33 -> Dissem33; TestDhvP.DisseminationValue33 -> Dissem33; components new DisseminatorC(uint16_t, 34) as Dissem34; TestDhvP.DisseminationUpdate34 -> Dissem34; TestDhvP.DisseminationValue34 -> Dissem34; components new DisseminatorC(uint16_t, 35) as Dissem35; TestDhvP.DisseminationUpdate35 -> Dissem35; TestDhvP.DisseminationValue35 -> Dissem35; components new DisseminatorC(uint16_t, 36) as Dissem36; TestDhvP.DisseminationUpdate36 -> Dissem36; TestDhvP.DisseminationValue36 -> Dissem36; components new DisseminatorC(uint16_t, 37) as Dissem37; TestDhvP.DisseminationUpdate37 -> Dissem37; TestDhvP.DisseminationValue37 -> Dissem37; components new DisseminatorC(uint16_t, 38) as Dissem38; TestDhvP.DisseminationUpdate38 -> Dissem38; TestDhvP.DisseminationValue38 -> Dissem38; components new DisseminatorC(uint16_t, 39) as Dissem39; TestDhvP.DisseminationUpdate39 -> Dissem39; TestDhvP.DisseminationValue39 -> Dissem39; components new DisseminatorC(uint16_t, 40) as Dissem40; TestDhvP.DisseminationUpdate40 -> Dissem40; TestDhvP.DisseminationValue40 -> Dissem40; components new DisseminatorC(uint16_t, 41) as Dissem41; TestDhvP.DisseminationUpdate41 -> Dissem41; TestDhvP.DisseminationValue41 -> Dissem41; components new DisseminatorC(uint16_t, 42) as Dissem42; TestDhvP.DisseminationUpdate42 -> Dissem42; TestDhvP.DisseminationValue42 -> Dissem42; components new DisseminatorC(uint16_t, 43) as Dissem43; TestDhvP.DisseminationUpdate43 -> Dissem43; TestDhvP.DisseminationValue43 -> Dissem43; components new DisseminatorC(uint16_t, 44) as Dissem44; TestDhvP.DisseminationUpdate44 -> Dissem44; TestDhvP.DisseminationValue44 -> Dissem44; components new DisseminatorC(uint16_t, 45) as Dissem45; TestDhvP.DisseminationUpdate45 -> Dissem45; TestDhvP.DisseminationValue45 -> Dissem45; components new DisseminatorC(uint16_t, 46) as Dissem46; TestDhvP.DisseminationUpdate46 -> Dissem46; TestDhvP.DisseminationValue46 -> Dissem46; components new DisseminatorC(uint16_t, 47) as Dissem47; TestDhvP.DisseminationUpdate47 -> Dissem47; TestDhvP.DisseminationValue47 -> Dissem47; components new DisseminatorC(uint16_t, 48) as Dissem48; TestDhvP.DisseminationUpdate48 -> Dissem48; TestDhvP.DisseminationValue48 -> Dissem48; components new DisseminatorC(uint16_t, 49) as Dissem49; TestDhvP.DisseminationUpdate49 -> Dissem49; TestDhvP.DisseminationValue49 -> Dissem49; components new DisseminatorC(uint16_t, 50) as Dissem50; TestDhvP.DisseminationUpdate50 -> Dissem50; TestDhvP.DisseminationValue50 -> Dissem50; components new DisseminatorC(uint16_t, 51) as Dissem51; TestDhvP.DisseminationUpdate51 -> Dissem51; TestDhvP.DisseminationValue51 -> Dissem51; components new DisseminatorC(uint16_t, 52) as Dissem52; TestDhvP.DisseminationUpdate52 -> Dissem52; TestDhvP.DisseminationValue52 -> Dissem52; components new DisseminatorC(uint16_t, 53) as Dissem53; TestDhvP.DisseminationUpdate53 -> Dissem53; TestDhvP.DisseminationValue53 -> Dissem53; components new DisseminatorC(uint16_t, 54) as Dissem54; TestDhvP.DisseminationUpdate54 -> Dissem54; TestDhvP.DisseminationValue54 -> Dissem54; components new DisseminatorC(uint16_t, 55) as Dissem55; TestDhvP.DisseminationUpdate55 -> Dissem55; TestDhvP.DisseminationValue55 -> Dissem55; components new DisseminatorC(uint16_t, 56) as Dissem56; TestDhvP.DisseminationUpdate56 -> Dissem56; TestDhvP.DisseminationValue56 -> Dissem56; components new DisseminatorC(uint16_t, 57) as Dissem57; TestDhvP.DisseminationUpdate57 -> Dissem57; TestDhvP.DisseminationValue57 -> Dissem57; components new DisseminatorC(uint16_t, 58) as Dissem58; TestDhvP.DisseminationUpdate58 -> Dissem58; TestDhvP.DisseminationValue58 -> Dissem58; components new DisseminatorC(uint16_t, 59) as Dissem59; TestDhvP.DisseminationUpdate59 -> Dissem59; TestDhvP.DisseminationValue59 -> Dissem59; components new DisseminatorC(uint16_t, 60) as Dissem60; TestDhvP.DisseminationUpdate60 -> Dissem60; TestDhvP.DisseminationValue60 -> Dissem60; components new DisseminatorC(uint16_t, 61) as Dissem61; TestDhvP.DisseminationUpdate61 -> Dissem61; TestDhvP.DisseminationValue61 -> Dissem61; components new DisseminatorC(uint16_t, 62) as Dissem62; TestDhvP.DisseminationUpdate62 -> Dissem62; TestDhvP.DisseminationValue62 -> Dissem62; components new DisseminatorC(uint16_t, 63) as Dissem63; TestDhvP.DisseminationUpdate63 -> Dissem63; TestDhvP.DisseminationValue63 -> Dissem63; components new DisseminatorC(uint16_t, 64) as Dissem64; TestDhvP.DisseminationUpdate64 -> Dissem64; TestDhvP.DisseminationValue64 -> Dissem64; components MainC; TestDhvP.Boot -> MainC; components SerialActiveMessageC; components new SerialAMSenderC(AM_DHV_TEST_MSG); TestDhvP.SerialSend -> SerialAMSenderC; TestDhvP.SerialControl -> SerialActiveMessageC; } tinyos-2.1.2+dfsg/apps/tests/TestDhv/TestDhvP-Master.nc000066400000000000000000000043661207233610700227340ustar00rootroot00000000000000 module TestDhvP { uses interface Leds; uses interface StdControl; /* uses interface DisseminationUpdate as DisseminationUpdate1; uses interface DisseminationValue as DisseminationValue1; */ // ... INTERFACES uses interface Boot; uses interface AMSend as SerialSend; uses interface SplitControl as SerialControl; uses interface SplitControl as AMControl; } implementation { typedef nx_struct dhv_test_msg_t { nx_am_addr_t id; nx_uint8_t count; nx_uint8_t isOk; } dhv_test_msg_t; message_t testMsg; uint8_t okBit = 1; uint16_t data; uint8_t count = 0; /* uint8_t newCount = N; */ // ... NEWCOUNT void bookkeep(); event void SerialControl.startDone(error_t err) { if(err != SUCCESS){ call SerialControl.start(); return; } call AMControl.start(); } event void AMControl.startDone(error_t err) { if(err != SUCCESS){ call AMControl.start(); return; } call StdControl.start(); if(TOS_NODE_ID == 1) { data = 0xBEEF; dbg("TestDhvP","Updating data items\n"); /* call DisseminationUpdate1.change(&data); */ // ... CHANGES } } event void SerialControl.stopDone(error_t err) { } event void AMControl.stopDone(error_t err) {} event void Boot.booted() { call SerialControl.start(); dbg("TestDhvP", "Booted at %s\n", sim_time_string()); } /* event void DisseminationValue1.changed() { uint16_t val = *(uint16_t*) call DisseminationValue1.get(); if(val != 0xBEEF) { return; } bookkeep(); } */ // ... EVENTS void bookkeep() { dhv_test_msg_t* dhvTestMsgPtr; if(count < newCount) { count++; } dbg("TestDhvP", "Got an update, %u complete now at %s\n", count, sim_time_string()); call Leds.led0Toggle(); dhvTestMsgPtr = (dhv_test_msg_t*) call SerialSend.getPayload(&testMsg, 0); dhvTestMsgPtr->id = TOS_NODE_ID; dhvTestMsgPtr->count = count; dhvTestMsgPtr->isOk = okBit; call SerialSend.send(0, &testMsg, sizeof(dhv_test_msg_t)); if(newCount == count) { dbg("TestDhvP","Dissemination COMPLETE!\n"); call Leds.set(7); } } event void SerialSend.sendDone(message_t* message, error_t err) { } } tinyos-2.1.2+dfsg/apps/tests/TestDhv/TestDhvP.nc000066400000000000000000000532331207233610700215000ustar00rootroot00000000000000 module TestDhvP { uses interface Leds; uses interface StdControl; /* uses interface DisseminationUpdate as DisseminationUpdate1; uses interface DisseminationValue as DisseminationValue1; */ uses interface DisseminationUpdate as DisseminationUpdate1; uses interface DisseminationValue as DisseminationValue1; uses interface DisseminationUpdate as DisseminationUpdate2; uses interface DisseminationValue as DisseminationValue2; uses interface DisseminationUpdate as DisseminationUpdate3; uses interface DisseminationValue as DisseminationValue3; uses interface DisseminationUpdate as DisseminationUpdate4; uses interface DisseminationValue as DisseminationValue4; uses interface DisseminationUpdate as DisseminationUpdate5; uses interface DisseminationValue as DisseminationValue5; uses interface DisseminationUpdate as DisseminationUpdate6; uses interface DisseminationValue as DisseminationValue6; uses interface DisseminationUpdate as DisseminationUpdate7; uses interface DisseminationValue as DisseminationValue7; uses interface DisseminationUpdate as DisseminationUpdate8; uses interface DisseminationValue as DisseminationValue8; uses interface DisseminationUpdate as DisseminationUpdate9; uses interface DisseminationValue as DisseminationValue9; uses interface DisseminationUpdate as DisseminationUpdate10; uses interface DisseminationValue as DisseminationValue10; uses interface DisseminationUpdate as DisseminationUpdate11; uses interface DisseminationValue as DisseminationValue11; uses interface DisseminationUpdate as DisseminationUpdate12; uses interface DisseminationValue as DisseminationValue12; uses interface DisseminationUpdate as DisseminationUpdate13; uses interface DisseminationValue as DisseminationValue13; uses interface DisseminationUpdate as DisseminationUpdate14; uses interface DisseminationValue as DisseminationValue14; uses interface DisseminationUpdate as DisseminationUpdate15; uses interface DisseminationValue as DisseminationValue15; uses interface DisseminationUpdate as DisseminationUpdate16; uses interface DisseminationValue as DisseminationValue16; uses interface DisseminationUpdate as DisseminationUpdate17; uses interface DisseminationValue as DisseminationValue17; uses interface DisseminationUpdate as DisseminationUpdate18; uses interface DisseminationValue as DisseminationValue18; uses interface DisseminationUpdate as DisseminationUpdate19; uses interface DisseminationValue as DisseminationValue19; uses interface DisseminationUpdate as DisseminationUpdate20; uses interface DisseminationValue as DisseminationValue20; uses interface DisseminationUpdate as DisseminationUpdate21; uses interface DisseminationValue as DisseminationValue21; uses interface DisseminationUpdate as DisseminationUpdate22; uses interface DisseminationValue as DisseminationValue22; uses interface DisseminationUpdate as DisseminationUpdate23; uses interface DisseminationValue as DisseminationValue23; uses interface DisseminationUpdate as DisseminationUpdate24; uses interface DisseminationValue as DisseminationValue24; uses interface DisseminationUpdate as DisseminationUpdate25; uses interface DisseminationValue as DisseminationValue25; uses interface DisseminationUpdate as DisseminationUpdate26; uses interface DisseminationValue as DisseminationValue26; uses interface DisseminationUpdate as DisseminationUpdate27; uses interface DisseminationValue as DisseminationValue27; uses interface DisseminationUpdate as DisseminationUpdate28; uses interface DisseminationValue as DisseminationValue28; uses interface DisseminationUpdate as DisseminationUpdate29; uses interface DisseminationValue as DisseminationValue29; uses interface DisseminationUpdate as DisseminationUpdate30; uses interface DisseminationValue as DisseminationValue30; uses interface DisseminationUpdate as DisseminationUpdate31; uses interface DisseminationValue as DisseminationValue31; uses interface DisseminationUpdate as DisseminationUpdate32; uses interface DisseminationValue as DisseminationValue32; uses interface DisseminationUpdate as DisseminationUpdate33; uses interface DisseminationValue as DisseminationValue33; uses interface DisseminationUpdate as DisseminationUpdate34; uses interface DisseminationValue as DisseminationValue34; uses interface DisseminationUpdate as DisseminationUpdate35; uses interface DisseminationValue as DisseminationValue35; uses interface DisseminationUpdate as DisseminationUpdate36; uses interface DisseminationValue as DisseminationValue36; uses interface DisseminationUpdate as DisseminationUpdate37; uses interface DisseminationValue as DisseminationValue37; uses interface DisseminationUpdate as DisseminationUpdate38; uses interface DisseminationValue as DisseminationValue38; uses interface DisseminationUpdate as DisseminationUpdate39; uses interface DisseminationValue as DisseminationValue39; uses interface DisseminationUpdate as DisseminationUpdate40; uses interface DisseminationValue as DisseminationValue40; uses interface DisseminationUpdate as DisseminationUpdate41; uses interface DisseminationValue as DisseminationValue41; uses interface DisseminationUpdate as DisseminationUpdate42; uses interface DisseminationValue as DisseminationValue42; uses interface DisseminationUpdate as DisseminationUpdate43; uses interface DisseminationValue as DisseminationValue43; uses interface DisseminationUpdate as DisseminationUpdate44; uses interface DisseminationValue as DisseminationValue44; uses interface DisseminationUpdate as DisseminationUpdate45; uses interface DisseminationValue as DisseminationValue45; uses interface DisseminationUpdate as DisseminationUpdate46; uses interface DisseminationValue as DisseminationValue46; uses interface DisseminationUpdate as DisseminationUpdate47; uses interface DisseminationValue as DisseminationValue47; uses interface DisseminationUpdate as DisseminationUpdate48; uses interface DisseminationValue as DisseminationValue48; uses interface DisseminationUpdate as DisseminationUpdate49; uses interface DisseminationValue as DisseminationValue49; uses interface DisseminationUpdate as DisseminationUpdate50; uses interface DisseminationValue as DisseminationValue50; uses interface DisseminationUpdate as DisseminationUpdate51; uses interface DisseminationValue as DisseminationValue51; uses interface DisseminationUpdate as DisseminationUpdate52; uses interface DisseminationValue as DisseminationValue52; uses interface DisseminationUpdate as DisseminationUpdate53; uses interface DisseminationValue as DisseminationValue53; uses interface DisseminationUpdate as DisseminationUpdate54; uses interface DisseminationValue as DisseminationValue54; uses interface DisseminationUpdate as DisseminationUpdate55; uses interface DisseminationValue as DisseminationValue55; uses interface DisseminationUpdate as DisseminationUpdate56; uses interface DisseminationValue as DisseminationValue56; uses interface DisseminationUpdate as DisseminationUpdate57; uses interface DisseminationValue as DisseminationValue57; uses interface DisseminationUpdate as DisseminationUpdate58; uses interface DisseminationValue as DisseminationValue58; uses interface DisseminationUpdate as DisseminationUpdate59; uses interface DisseminationValue as DisseminationValue59; uses interface DisseminationUpdate as DisseminationUpdate60; uses interface DisseminationValue as DisseminationValue60; uses interface DisseminationUpdate as DisseminationUpdate61; uses interface DisseminationValue as DisseminationValue61; uses interface DisseminationUpdate as DisseminationUpdate62; uses interface DisseminationValue as DisseminationValue62; uses interface DisseminationUpdate as DisseminationUpdate63; uses interface DisseminationValue as DisseminationValue63; uses interface DisseminationUpdate as DisseminationUpdate64; uses interface DisseminationValue as DisseminationValue64; uses interface Boot; uses interface AMSend as SerialSend; uses interface SplitControl as SerialControl; } implementation { typedef nx_struct dhv_test_msg_t { nx_am_addr_t id; nx_uint8_t count; nx_uint8_t isOk; } dhv_test_msg_t; message_t testMsg; uint8_t okBit = 1; uint16_t data; uint8_t count = 0; /* uint8_t newCount = N; */ uint8_t newCount = 8; void bookkeep(); event void SerialControl.startDone(error_t err) { call StdControl.start(); if(TOS_NODE_ID == 1) { data = 0xBEEF; dbg("TestDhvP","Updating data items\n"); /* call DisseminationUpdate1.change(&data); */ call DisseminationUpdate18.change(&data); call DisseminationUpdate61.change(&data); call DisseminationUpdate21.change(&data); call DisseminationUpdate53.change(&data); call DisseminationUpdate17.change(&data); call DisseminationUpdate19.change(&data); call DisseminationUpdate11.change(&data); call DisseminationUpdate36.change(&data); } } event void SerialControl.stopDone(error_t err) { } event void Boot.booted() { call SerialControl.start(); dbg("TestDhvP", "Booted at %s\n", sim_time_string()); } /* event void DisseminationValue1.changed() { uint16_t val = *(uint16_t*) call DisseminationValue1.get(); if(val != 0xBEEF) { return; } bookkeep(); } */ event void DisseminationValue1.changed() { uint16_t val = *(uint16_t*) call DisseminationValue1.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue2.changed() { uint16_t val = *(uint16_t*) call DisseminationValue2.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue3.changed() { uint16_t val = *(uint16_t*) call DisseminationValue3.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue4.changed() { uint16_t val = *(uint16_t*) call DisseminationValue4.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue5.changed() { uint16_t val = *(uint16_t*) call DisseminationValue5.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue6.changed() { uint16_t val = *(uint16_t*) call DisseminationValue6.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue7.changed() { uint16_t val = *(uint16_t*) call DisseminationValue7.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue8.changed() { uint16_t val = *(uint16_t*) call DisseminationValue8.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue9.changed() { uint16_t val = *(uint16_t*) call DisseminationValue9.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue10.changed() { uint16_t val = *(uint16_t*) call DisseminationValue10.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue11.changed() { uint16_t val = *(uint16_t*) call DisseminationValue11.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue12.changed() { uint16_t val = *(uint16_t*) call DisseminationValue12.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue13.changed() { uint16_t val = *(uint16_t*) call DisseminationValue13.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue14.changed() { uint16_t val = *(uint16_t*) call DisseminationValue14.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue15.changed() { uint16_t val = *(uint16_t*) call DisseminationValue15.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue16.changed() { uint16_t val = *(uint16_t*) call DisseminationValue16.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue17.changed() { uint16_t val = *(uint16_t*) call DisseminationValue17.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue18.changed() { uint16_t val = *(uint16_t*) call DisseminationValue18.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue19.changed() { uint16_t val = *(uint16_t*) call DisseminationValue19.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue20.changed() { uint16_t val = *(uint16_t*) call DisseminationValue20.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue21.changed() { uint16_t val = *(uint16_t*) call DisseminationValue21.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue22.changed() { uint16_t val = *(uint16_t*) call DisseminationValue22.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue23.changed() { uint16_t val = *(uint16_t*) call DisseminationValue23.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue24.changed() { uint16_t val = *(uint16_t*) call DisseminationValue24.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue25.changed() { uint16_t val = *(uint16_t*) call DisseminationValue25.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue26.changed() { uint16_t val = *(uint16_t*) call DisseminationValue26.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue27.changed() { uint16_t val = *(uint16_t*) call DisseminationValue27.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue28.changed() { uint16_t val = *(uint16_t*) call DisseminationValue28.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue29.changed() { uint16_t val = *(uint16_t*) call DisseminationValue29.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue30.changed() { uint16_t val = *(uint16_t*) call DisseminationValue30.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue31.changed() { uint16_t val = *(uint16_t*) call DisseminationValue31.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue32.changed() { uint16_t val = *(uint16_t*) call DisseminationValue32.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue33.changed() { uint16_t val = *(uint16_t*) call DisseminationValue33.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue34.changed() { uint16_t val = *(uint16_t*) call DisseminationValue34.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue35.changed() { uint16_t val = *(uint16_t*) call DisseminationValue35.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue36.changed() { uint16_t val = *(uint16_t*) call DisseminationValue36.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue37.changed() { uint16_t val = *(uint16_t*) call DisseminationValue37.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue38.changed() { uint16_t val = *(uint16_t*) call DisseminationValue38.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue39.changed() { uint16_t val = *(uint16_t*) call DisseminationValue39.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue40.changed() { uint16_t val = *(uint16_t*) call DisseminationValue40.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue41.changed() { uint16_t val = *(uint16_t*) call DisseminationValue41.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue42.changed() { uint16_t val = *(uint16_t*) call DisseminationValue42.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue43.changed() { uint16_t val = *(uint16_t*) call DisseminationValue43.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue44.changed() { uint16_t val = *(uint16_t*) call DisseminationValue44.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue45.changed() { uint16_t val = *(uint16_t*) call DisseminationValue45.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue46.changed() { uint16_t val = *(uint16_t*) call DisseminationValue46.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue47.changed() { uint16_t val = *(uint16_t*) call DisseminationValue47.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue48.changed() { uint16_t val = *(uint16_t*) call DisseminationValue48.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue49.changed() { uint16_t val = *(uint16_t*) call DisseminationValue49.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue50.changed() { uint16_t val = *(uint16_t*) call DisseminationValue50.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue51.changed() { uint16_t val = *(uint16_t*) call DisseminationValue51.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue52.changed() { uint16_t val = *(uint16_t*) call DisseminationValue52.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue53.changed() { uint16_t val = *(uint16_t*) call DisseminationValue53.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue54.changed() { uint16_t val = *(uint16_t*) call DisseminationValue54.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue55.changed() { uint16_t val = *(uint16_t*) call DisseminationValue55.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue56.changed() { uint16_t val = *(uint16_t*) call DisseminationValue56.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue57.changed() { uint16_t val = *(uint16_t*) call DisseminationValue57.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue58.changed() { uint16_t val = *(uint16_t*) call DisseminationValue58.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue59.changed() { uint16_t val = *(uint16_t*) call DisseminationValue59.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue60.changed() { uint16_t val = *(uint16_t*) call DisseminationValue60.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue61.changed() { uint16_t val = *(uint16_t*) call DisseminationValue61.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue62.changed() { uint16_t val = *(uint16_t*) call DisseminationValue62.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue63.changed() { uint16_t val = *(uint16_t*) call DisseminationValue63.get(); if(val != 0xBEEF) { return; } bookkeep(); } event void DisseminationValue64.changed() { uint16_t val = *(uint16_t*) call DisseminationValue64.get(); if(val != 0xBEEF) { return; } bookkeep(); } void bookkeep() { dhv_test_msg_t* dhvTestMsgPtr; if(count < newCount) { count++; } dbg("TestDhvP", "Got an update, %u complete now at %s\n", count, sim_time_string()); call Leds.led0Toggle(); dhvTestMsgPtr = (dhv_test_msg_t*) call SerialSend.getPayload(&testMsg, 0); dhvTestMsgPtr->id = TOS_NODE_ID; dhvTestMsgPtr->count = count; dhvTestMsgPtr->isOk = okBit; call SerialSend.send(0, &testMsg, sizeof(dhv_test_msg_t)); if(newCount == count) { dbg("TestDhvP","Dissemination COMPLETE!\n"); call Leds.set(7); } } event void SerialSend.sendDone(message_t* message, error_t err) { } } tinyos-2.1.2+dfsg/apps/tests/TestDhv/gentest.py000066400000000000000000000041271207233610700214760ustar00rootroot00000000000000#!/usr/bin/python import sys import re import os import random print "Usage: python gentest.py [numitems] [newitems]" items = sys.argv[1] newitems = sys.argv[2] print "Generating Configurations" fin = open("TestDhvC-Master.nc", "r") fout = open("TestDhvC.nc", "w") lines = fin.readlines() for line in lines: if(line.find("... DISSEMINATORS") != -1): for i in range(1, int(items)+1): fout.write(" components new DisseminatorC(uint16_t, ") fout.write(str(i)) fout.write(") as Dissem" + str(i) + ";\n") fout.write(" TestDhvP.DisseminationUpdate" + str(i)) fout.write(" -> Dissem" + str(i) + ";\n") fout.write(" TestDhvP.DisseminationValue" + str(i)) fout.write(" -> Dissem" + str(i) + ";\n\n") else: fout.write(line) fin.close() fout.close() print "Generating Modules" fin = open("TestDhvP-Master.nc", "r") fout = open("TestDhvP.nc", "w") lines = fin.readlines() for line in lines: if(line.find("... INTERFACES") != -1): for i in range(1, int(items)+1): fout.write(" uses interface DisseminationUpdate as DisseminationUpdate") fout.write(str(i) + ";\n") fout.write(" uses interface DisseminationValue as DisseminationValue") fout.write(str(i) + ";\n\n") elif(line.find("... NEWCOUNT") != -1): fout.write(" uint8_t newCount = " + str(newitems) + ";\n") elif(line.find("... CHANGES") != -1): for i in random.sample(range(1, int(items)+1), int(newitems)): fout.write(" call DisseminationUpdate" + str(i) + ".change(&data);\n") elif(line.find("... EVENTS") != -1): for i in range(1, int(items)+1): fout.write(" event void DisseminationValue" + str(i)) fout.write(".changed() {\n") fout.write(" uint16_t val = *(uint16_t*) call DisseminationValue" + str(i) + ".get();\n") fout.write(" if(val != 0xBEEF) { return; }\n") fout.write(" bookkeep();\n") fout.write(" }\n\n") else: fout.write(line) tinyos-2.1.2+dfsg/apps/tests/TestDip/000077500000000000000000000000001207233610700174425ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestDip/DipInject.java000066400000000000000000000036371207233610700221670ustar00rootroot00000000000000 import java.io.*; import net.tinyos.message.*; import net.tinyos.util.*; public class DipInject implements MessageListener { MoteIF mote; DipInject(DipMsg dipmsg) { mote = new MoteIF(PrintStreamMessenger.err); mote.registerListener(dipmsg, this); } public synchronized void messageReceived(int dest_addr, Message message) { // do nothing for now } void sendDipDataMsg(int key, long version, short[] data) { int totalsize = DipMsg.DEFAULT_MESSAGE_SIZE + DipDataMsg.DEFAULT_MESSAGE_SIZE + DipData.DEFAULT_MESSAGE_SIZE; DipMsg dm = new DipMsg(totalsize); dm.set_type((short)3); DipDataMsg ddm = new DipDataMsg(dm, DipMsg.DEFAULT_MESSAGE_SIZE); ddm.set_key(key); ddm.set_version(version << 16); ddm.set_size((short)data.length); DipData dd = new DipData(ddm, DipDataMsg.DEFAULT_MESSAGE_SIZE); dd.set_data(data); try { mote.send(MoteIF.TOS_BCAST_ADDR, dd); } catch(IOException e) { System.err.println("Cannot send message"); } } public static void main(String args[]) { int i; System.out.println("Usage: java DipInject [key] [version] [hex data delimit space in quotes]"); int k = Integer.parseInt(args[0], 16); long v = Long.parseLong(args[1]); String hexdata[] = args[2].split(" "); short d[]; if(hexdata.length > 16) { System.err.println("Data too long, keep it <= 16 bytes please"); } d = new short[hexdata.length]; for(i = 0; i < d.length; i++) d[i] = Short.parseShort(hexdata[i], 16); System.out.println("Key: " + k); System.out.println("Version: " + v); System.out.print("Data: "); for(i = 0; i < d.length; i++) { System.out.print(d[i] + " "); } System.out.println(); DipInject dipinject = new DipInject(new DipMsg()); dipinject.sendDipDataMsg(k, v, d); } }tinyos-2.1.2+dfsg/apps/tests/TestDip/Makefile000066400000000000000000000034301207233610700211020ustar00rootroot00000000000000COMPONENT=TestDipC BUILD_EXTRA_DEPS = DipMsg.py DipDataMsg.py DipMsg.class DipDataMsg.class DipData.class DipInject.class CFLAGS += -I$(TOSDIR)/lib/net CFLAGS += -I$(TOSDIR)/lib/net/dip -I$(TOSDIR)/lib/net/dip/interfaces #CFLAGS += -I$(TOSDIR)/lib/net/drip CONSTANTS += -DTOSH_DATA_LENGTH=32 #CONSTANTS += -DDIP_JOINTEST CFLAGS += $(CONSTANTS) # LPL FLAGS #CFLAGS += -DLOW_POWER_LISTENING #CFLAGS += -DLPL_DEF_LOCAL_WAKEUP=512 #CFLAGS += -DLPL_DEF_REMOTE_WAKEUP=512 #CFLAGS += -DDELAY_AFTER_RECEIVE=20 CLEAN_EXTRA += DipMsg.py DipDataMsg.py DipData.py DipMsg.java DipDataMsg.java DipData.java DipMsg.class DipDataMsg.class DipData.class DipInject.class DipMsg.py: mig python -target=$(PLATFORM) -python-classname=DipMsg $(CFLAGS) $(TOSDIR)/lib/net/dip/Dip.h dip_msg -o $@ DipDataMsg.py: mig python -target=$(PLATFORM) -python-classname=DipDataMsg -python-extends=DipMsg $(CFLAGS) $(TOSDIR)/lib/net/dip/Dip.h dip_data_msg -o $@ DipData.py: mig python -target=$(PLATFORM) -python-classname=DipData -python-extends=DipDataMsg $(CFLAGS) $(TOSDIR)/lib/net/dip/Dip.h dip_data -o $@ DipMsg.class: DipMsg.java javac -target 1.4 -source 1.4 DipMsg.java DipDataMsg.class: DipDataMsg.java javac -target 1.4 -source 1.4 DipDataMsg.java DipData.class: DipData.java javac -target 1.4 -source 1.4 DipData.java DipMsg.java: mig java -target=$(PLATFORM) -java-classname=DipMsg $(CFLAGS) $(TOSDIR)/lib/net/dip/Dip.h dip_msg -o $@ DipDataMsg.java: mig java -target=$(PLATFORM) -java-classname=DipDataMsg -java-extends=DipMsg $(CFLAGS) $(TOSDIR)/lib/net/dip/Dip.h dip_data_msg -o $@ DipData.java: mig java -target=$(PLATFORM) -java-classname=DipData -java-extends=DipDataMsg $(CFLAGS) $(TOSDIR)/lib/net/dip/Dip.h dip_data -o $@ DipInject.class: javac -target 1.4 -source 1.4 DipInject.java include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestDip/README000066400000000000000000000045601207233610700203270ustar00rootroot00000000000000 Title: TestDip Application Author: Kaisen Lin (kaisenl@cs.ucsd.edu) 1. SETTING UP THE TEST You need to first generate the code for compilation. The gentest.py script reads in the Master files and creates TestDipC.nc (the configuration) and TestDipP.nc (the module). It takes two parameters, the total number of items and the number of new items. The items that are random are chosen randomly. If you want 128 total items in the dissemination set, where 96 of those 128 items are new, you would type: python gentest.py 128 96 After the configuration and module have been generated, you can use the normal compilation method (e.g. make telosb). 2, READING THE LEDS When an node receives a new item, it toggles LED0. When a node completes all items, it turns all LEDs on. 3. SERIAL MESSAGES typedef nx_struct dip_test_msg_t { nx_am_addr_t id; nx_uint8_t count; nx_uint8_t isOk; } dip_test_msg_t; When a node receives a new item, it sends a dip_test_msg_t through the serial interface. id is the node id count is how many new items it has received so far isOk will be true if the data value was as expected 4. PACKET INJECTOR You can also use the injector to send data packets via a basestation. The syntax to do that is: java DipInject [key] [version] [data in quotes delimited by space] key is the data key in hexadecimal version is the version number in decimal data is the actual data in quotes delimited by space For example, if you want to send key 10, version 2, and data "ab cd ef". You would type: java DipInject 0a 2 "ab cd ef" For this specific test application, your data needs to be "ef be". You will need a SerialForwarder running for this work. 5. TIMING With a single sender and single receiver on a table using TelosB nodes, it takes approximately: 3.5 minutes for a node to receive 128 out of 128 items. 4.0 minutes for a node to receive 240 out of 240 items. With a single sender and two receivers on Mirage MicaZ nodes, it takes approximately: 2 minutes for both nodes to receive 96 out of 96 items. With 128 items or more, MicaZ nodes don't receive anything. Memory limitation? 6. BASESTATION If you are using the Basestation application to sniff what packets are being sent in the air, you will need to adjust the packet size to match the test application. You can add the following to your Makefile: CFLAGS += -DTOSH_DATA_LENGTH=XX where XX is your payload size tinyos-2.1.2+dfsg/apps/tests/TestDip/TestDip.h000066400000000000000000000001231207233610700211630ustar00rootroot00000000000000#ifndef __TESTDIP_H__ #define __TESTDIP_H__ enum { AM_TESTDIP = 0xAB }; #endif tinyos-2.1.2+dfsg/apps/tests/TestDip/TestDipC-Master.nc000066400000000000000000000012611207233610700226740ustar00rootroot00000000000000#include "TestDip.h" configuration TestDipC { } implementation { components TestDipP; components LedsC as LedsC; TestDipP.Leds -> LedsC; components DisseminationC; TestDipP.StdControl -> DisseminationC; /* components new DisseminatorC(uint32_t, 0x1) as Dissem1; TestDipP.DisseminationValue1 -> Dissem1; TestDipP.DisseminationUpdate1 -> Dissem1; */ // ... DISSEMINATORS components MainC; TestDipP.Boot -> MainC; components SerialActiveMessageC; components new SerialAMSenderC(AM_TESTDIP); TestDipP.SerialSend -> SerialAMSenderC; TestDipP.SerialControl -> SerialActiveMessageC; components ActiveMessageC; TestDipP.AMControl -> ActiveMessageC; } tinyos-2.1.2+dfsg/apps/tests/TestDip/TestDipP-Master.nc000066400000000000000000000043641207233610700227200ustar00rootroot00000000000000 module TestDipP { uses interface Leds; uses interface StdControl; /* uses interface DisseminationUpdate as DisseminationUpdate1; uses interface DisseminationValue as DisseminationValue1; */ // ... INTERFACES uses interface Boot; uses interface AMSend as SerialSend; uses interface SplitControl as SerialControl; uses interface SplitControl as AMControl; } implementation { typedef nx_struct dip_test_msg_t { nx_am_addr_t id; nx_uint8_t count; nx_uint8_t isOk; } dip_test_msg_t; message_t testMsg; uint8_t okBit = 1; uint16_t data; uint8_t count = 0; /* uint8_t newCount = N; */ // ... NEWCOUNT void bookkeep(); event void SerialControl.startDone(error_t err) { if(err != SUCCESS) { call SerialControl.start(); return; } call AMControl.start(); } event void AMControl.startDone(error_t err) { if(err != SUCCESS) { call AMControl.start(); return; } call StdControl.start(); if(TOS_NODE_ID == 1) { data = 0xBEEF; dbg("TestDipP","Updating data items\n"); /* call DisseminationUpdate1.change(&data); */ // ... CHANGES } } event void SerialControl.stopDone(error_t err) { } event void AMControl.stopDone(error_t err) { } event void Boot.booted() { call SerialControl.start(); dbg("TestDipP", "Booted at %s\n", sim_time_string()); } /* event void DisseminationValue1.changed() { uint16_t val = *(uint16_t*) call DisseminationValue1.get(); if(val != 0xBEEF) { return; } bookkeep(); } */ // ... EVENTS void bookkeep() { dip_test_msg_t* dipTestMsgPtr; if(count < newCount) { count++; } dbg("TestDipP", "Got an update, %u complete now at %s\n", count, sim_time_string()); call Leds.led0Toggle(); dipTestMsgPtr = (dip_test_msg_t*) call SerialSend.getPayload(&testMsg, 0); dipTestMsgPtr->id = TOS_NODE_ID; dipTestMsgPtr->count = count; dipTestMsgPtr->isOk = okBit; call SerialSend.send(0, &testMsg, sizeof(dip_test_msg_t)); if(newCount == count) { dbg("TestDipP","Dissemination COMPLETE!\n"); call Leds.set(7); } } event void SerialSend.sendDone(message_t* message, error_t err) { } } tinyos-2.1.2+dfsg/apps/tests/TestDip/gentest.py000066400000000000000000000041271207233610700214710ustar00rootroot00000000000000#!/usr/bin/python import sys import re import os import random print "Usage: python gentest.py [numitems] [newitems]" items = sys.argv[1] newitems = sys.argv[2] print "Generating Configurations" fin = open("TestDipC-Master.nc", "r") fout = open("TestDipC.nc", "w") lines = fin.readlines() for line in lines: if(line.find("... DISSEMINATORS") != -1): for i in range(1, int(items)+1): fout.write(" components new DisseminatorC(uint16_t, ") fout.write(str(i)) fout.write(") as Dissem" + str(i) + ";\n") fout.write(" TestDipP.DisseminationUpdate" + str(i)) fout.write(" -> Dissem" + str(i) + ";\n") fout.write(" TestDipP.DisseminationValue" + str(i)) fout.write(" -> Dissem" + str(i) + ";\n\n") else: fout.write(line) fin.close() fout.close() print "Generating Modules" fin = open("TestDipP-Master.nc", "r") fout = open("TestDipP.nc", "w") lines = fin.readlines() for line in lines: if(line.find("... INTERFACES") != -1): for i in range(1, int(items)+1): fout.write(" uses interface DisseminationUpdate as DisseminationUpdate") fout.write(str(i) + ";\n") fout.write(" uses interface DisseminationValue as DisseminationValue") fout.write(str(i) + ";\n\n") elif(line.find("... NEWCOUNT") != -1): fout.write(" uint8_t newCount = " + str(newitems) + ";\n") elif(line.find("... CHANGES") != -1): for i in random.sample(range(1, int(items)+1), int(newitems)): fout.write(" call DisseminationUpdate" + str(i) + ".change(&data);\n") elif(line.find("... EVENTS") != -1): for i in range(1, int(items)+1): fout.write(" event void DisseminationValue" + str(i)) fout.write(".changed() {\n") fout.write(" uint16_t val = *(uint16_t*) call DisseminationValue" + str(i) + ".get();\n") fout.write(" if(val != 0xBEEF) { return; }\n") fout.write(" bookkeep();\n") fout.write(" }\n\n") else: fout.write(line) tinyos-2.1.2+dfsg/apps/tests/TestDissemination/000077500000000000000000000000001207233610700215345ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestDissemination/Makefile000066400000000000000000000004511207233610700231740ustar00rootroot00000000000000COMPONENT=TestDisseminationAppC ### For Drip: CFLAGS += -I$(TOSDIR)/lib/net -I%T/lib/net/drip ### For DIP: #CFLAGS += -I$(TOSDIR)/lib/net -I%T/lib/net/dip -I%T/lib/net/dip/interfaces ### For Dhv #CFLAGS += -I$(TOSDIR)/lib/net -I%T/lib/net/dhv -I%T/lib/net/dhv/interfaces include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestDissemination/README.txt000066400000000000000000000013551207233610700232360ustar00rootroot00000000000000README for TestDisseminationAppC This application will disseminate 2 constant data objects to all nodes every 20 seconds. Nodes whose TOS_NODE_ID mod 4 equals 1 will act as disseminators, and all others will act as receivers. Every 20 seconds: * The disseminator toggles its led0 and led1. Sim debugging msg: Timer fired. * The disseminator sends a new 32-bit value and a new 16-bit value. * When a receiver receives the correct 32-bit value, it toggles led0. Sim debugging msg: Received new correct 32-bit value * When a receiver receives the correct 16-bit value, it toggles led1. Sim debugging msg: Received new correct 16-bit value Thus, in a successful test, you should see all nodes toggling both led0 and led1 roughly in unison. tinyos-2.1.2+dfsg/apps/tests/TestDissemination/TestDisseminationAppC.nc000066400000000000000000000056441207233610700263010ustar00rootroot00000000000000/* * Copyright (c) 2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * TestDisseminationAppC exercises the dissemination layer, by causing * the node with ID 1 to inject 2 new values into the network every 4 * seconds. For the 32-bit object with key 0x1234, node 1 toggles LED * 0 when it sends, and every other node toggles LED 0 when it * receives the correct value. For the 16-bit object with key 0x2345, * node 1 toggles LED 1 when it sends, and every other node toggles * LED 1 when it receives the correct value. * * See TEP118 - Dissemination for details. * * @author Gilman Tolle * @version $Revision: 1.6 $ $Date: 2007-04-18 04:02:06 $ */ configuration TestDisseminationAppC {} implementation { components TestDisseminationC; components MainC; TestDisseminationC.Boot -> MainC; components ActiveMessageC; TestDisseminationC.RadioControl -> ActiveMessageC; components DisseminationC; TestDisseminationC.DisseminationControl -> DisseminationC; components new DisseminatorC(uint32_t, 0x1234) as Object32C; TestDisseminationC.Value32 -> Object32C; TestDisseminationC.Update32 -> Object32C; components new DisseminatorC(uint16_t, 0x2345) as Object16C; TestDisseminationC.Value16 -> Object16C; TestDisseminationC.Update16 -> Object16C; components LedsC; TestDisseminationC.Leds -> LedsC; components new TimerMilliC(); TestDisseminationC.Timer -> TimerMilliC; } tinyos-2.1.2+dfsg/apps/tests/TestDissemination/TestDisseminationC.nc000066400000000000000000000106331207233610700256320ustar00rootroot00000000000000#include /* * Copyright (c) 2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * TestDisseminationC exercises the dissemination layer, by causing * the node with ID 1 to inject 2 new values into the network every 4 * seconds. For the 32-bit object with key 0x1234, node 1 toggles LED * 0 when it sends, and every other node toggles LED 0 when it * receives the correct value. For the 16-bit object with key 0x2345, * node 1 toggles LED 1 when it sends, and every other node toggles * LED 1 when it receives the correct value. * * See TEP118 - Dissemination for details. * * @author Gilman Tolle * @version $Revision: 1.6 $ $Date: 2007-04-18 04:02:06 $ */ module TestDisseminationC { uses interface Boot; uses interface SplitControl as RadioControl; uses interface StdControl as DisseminationControl; uses interface DisseminationValue as Value32; uses interface DisseminationUpdate as Update32; uses interface DisseminationValue as Value16; uses interface DisseminationUpdate as Update16; uses interface Leds; uses interface Timer; } implementation { event void Boot.booted() { uint32_t initialVal32 = 123456; uint16_t initialVal16 = 1234; call Value32.set( &initialVal32 ); call Value16.set( &initialVal16 ); call RadioControl.start(); } event void RadioControl.startDone( error_t result ) { if ( result != SUCCESS ) { call RadioControl.start(); } else { call DisseminationControl.start(); if ( TOS_NODE_ID % 4 == 1 ) { call Timer.startPeriodic( 1024 * 20 ); } else { call Timer.startPeriodic( 1024 ); } } } event void RadioControl.stopDone( error_t result ) { } event void Timer.fired() { uint32_t newVal32 = 0xDEADBEEF; uint16_t newVal16 = 0xABCD; if ( TOS_NODE_ID % 4 == 1 ) { call Leds.led0Toggle(); call Leds.led1Toggle(); call Update32.change( &newVal32 ); call Update16.change( &newVal16 ); dbg("TestDisseminationC", "TestDisseminationC: Timer fired.\n"); } else { const uint32_t* newVal = call Value32.get(); if ( *newVal == 123456 ) { call Leds.led2Toggle(); } } } event void Value32.changed() { const uint32_t* newVal = call Value32.get(); if ( *newVal == 0xDEADBEEF ) { call Leds.led0Toggle(); dbg("TestDisseminationC", "Received new correct 32-bit value @ %s.\n", sim_time_string()); } else { dbg("TestDisseminationC", "Received new incorrect 32-bit value.\n"); } } event void Value16.changed() { const uint16_t* newVal = call Value16.get(); if ( *newVal == 0xABCD ) { call Leds.led1Toggle(); dbg("TestDisseminationC", "Received new correct 16-bit value @ %s.\n", sim_time_string()); } else { dbg("TestDisseminationC", "Received new incorrect 16-bit value: 0x%hx\n", *newVal); } } } tinyos-2.1.2+dfsg/apps/tests/TestDissemination/test.py000066400000000000000000000023621207233610700230700ustar00rootroot00000000000000# This script is a simple TOSSIM test of dissemination. # It builds a 15x15 grid of nodes and has nodes start # disseminating two values (based on the TinyOS app). # It prints out when nodes receive new values, including # the dissemination key and sequence number. You should # be able to see how the implementation can resolve # multiple concurrent changes within the network as # well as more than one value being updated at a time. import TOSSIM import sys t = TOSSIM.Tossim([]) m = t.mac(); r = t.radio(); t.init() #t.addChannel("LedsC", sys.stdout); #t.addChannel("AM", sys.stdout); #t.addChannel("TestDisseminationC", sys.stdout); t.addChannel("Dissemination", sys.stdout) t.addChannel("TestDisseminationC", sys.stdout) #t.addChannel("Gain", sys.stdout); #t.addChannel("TossimPacketModelC", sys.stdout); print (dir(TOSSIM.Tossim)) f = open("topo.txt", "r") lines = f.readlines() for line in lines: s = line.split() if (len(s) > 0): if (s[0] == "gain"): r.add(int(s[1]), int(s[2]), float(s[3])) for i in range(0, 225): m = t.getNode(i); for j in range (0, 100): m.addNoiseTraceReading(-105) m.createNoiseModel() m.bootAtTime((t.ticksPerSecond() / 50) * i + 43); while (t.time() / t.ticksPerSecond() < 600): t.runNextEvent() tinyos-2.1.2+dfsg/apps/tests/TestDissemination/topo.txt000066400000000000000000035461301207233610700232720ustar00rootroot00000000000000gain 0 1 -64.71 gain 1 0 -66.06 gain 0 2 -73.89 gain 2 0 -76.19 gain 0 3 -76.00 gain 3 0 -77.08 gain 0 4 -78.29 gain 4 0 -80.34 gain 0 5 -78.62 gain 5 0 -78.56 gain 0 6 -85.98 gain 6 0 -87.32 gain 0 7 -89.50 gain 7 0 -90.94 gain 0 8 -87.98 gain 8 0 -91.27 gain 0 9 -87.39 gain 9 0 -95.08 gain 0 10 -91.14 gain 10 0 -97.22 gain 0 11 -92.22 gain 11 0 -102.50 gain 0 12 -92.81 gain 12 0 -94.20 gain 0 13 -97.17 gain 13 0 -101.94 gain 0 14 -100.65 gain 14 0 -101.66 gain 0 15 -62.81 gain 15 0 -66.58 gain 0 16 -65.54 gain 16 0 -71.44 gain 0 17 -76.31 gain 17 0 -80.11 gain 0 18 -75.68 gain 18 0 -80.57 gain 0 19 -82.46 gain 19 0 -88.08 gain 0 20 -81.28 gain 20 0 -88.10 gain 0 21 -83.45 gain 21 0 -89.38 gain 0 22 -86.26 gain 22 0 -90.65 gain 0 23 -96.95 gain 23 0 -98.52 gain 0 24 -90.15 gain 24 0 -93.34 gain 0 25 -90.04 gain 25 0 -95.90 gain 0 26 -96.92 gain 26 0 -104.22 gain 0 27 -91.70 gain 27 0 -96.60 gain 0 28 -85.74 gain 28 0 -85.97 gain 0 29 -88.62 gain 29 0 -90.39 gain 0 30 -66.50 gain 30 0 -73.29 gain 0 31 -68.53 gain 31 0 -71.88 gain 0 32 -75.06 gain 32 0 -75.76 gain 0 33 -79.28 gain 33 0 -81.43 gain 0 34 -73.35 gain 34 0 -76.13 gain 0 35 -79.19 gain 35 0 -82.91 gain 0 36 -87.39 gain 36 0 -91.26 gain 0 37 -90.99 gain 37 0 -97.40 gain 0 38 -90.15 gain 38 0 -94.09 gain 0 39 -86.79 gain 39 0 -95.06 gain 0 40 -92.29 gain 40 0 -95.54 gain 0 41 -88.74 gain 41 0 -87.33 gain 0 42 -93.23 gain 42 0 -99.07 gain 0 43 -90.40 gain 43 0 -93.83 gain 0 44 -94.08 gain 44 0 -101.10 gain 0 45 -70.35 gain 45 0 -77.35 gain 0 46 -68.58 gain 46 0 -72.05 gain 0 47 -73.92 gain 47 0 -75.09 gain 0 48 -82.51 gain 48 0 -83.26 gain 0 49 -84.46 gain 49 0 -89.26 gain 0 50 -81.81 gain 50 0 -83.48 gain 0 51 -88.29 gain 51 0 -93.65 gain 0 52 -87.09 gain 52 0 -89.69 gain 0 53 -93.87 gain 53 0 -97.02 gain 0 54 -91.41 gain 54 0 -93.97 gain 0 55 -89.63 gain 55 0 -89.11 gain 0 56 -97.35 gain 56 0 -101.87 gain 0 57 -92.95 gain 57 0 -96.55 gain 0 58 -97.22 gain 58 0 -97.52 gain 0 59 -92.54 gain 59 0 -92.09 gain 0 60 -82.20 gain 60 0 -91.03 gain 0 61 -83.71 gain 61 0 -84.45 gain 0 62 -74.70 gain 62 0 -72.95 gain 0 63 -76.59 gain 63 0 -78.81 gain 0 64 -84.10 gain 64 0 -90.54 gain 0 65 -83.52 gain 65 0 -85.51 gain 0 66 -90.36 gain 66 0 -91.33 gain 0 67 -89.59 gain 67 0 -91.79 gain 0 68 -90.14 gain 68 0 -94.93 gain 0 69 -94.30 gain 69 0 -96.30 gain 0 70 -95.50 gain 70 0 -95.97 gain 0 71 -93.20 gain 71 0 -97.23 gain 0 72 -98.34 gain 72 0 -99.94 gain 0 73 -89.24 gain 73 0 -92.21 gain 0 74 -100.35 gain 74 0 -99.43 gain 0 75 -79.83 gain 75 0 -84.80 gain 0 76 -84.30 gain 76 0 -89.39 gain 0 77 -81.90 gain 77 0 -82.99 gain 0 78 -88.31 gain 78 0 -93.90 gain 0 79 -83.26 gain 79 0 -88.47 gain 0 80 -87.48 gain 80 0 -90.48 gain 0 81 -92.57 gain 81 0 -96.48 gain 0 82 -93.29 gain 82 0 -98.18 gain 0 83 -96.25 gain 83 0 -98.41 gain 0 84 -92.62 gain 84 0 -91.97 gain 0 85 -92.01 gain 85 0 -96.79 gain 0 86 -90.02 gain 86 0 -96.44 gain 0 87 -94.44 gain 87 0 -98.14 gain 0 88 -91.48 gain 88 0 -94.82 gain 0 89 -97.82 gain 89 0 -103.30 gain 0 90 -83.08 gain 90 0 -87.91 gain 0 91 -86.18 gain 91 0 -92.08 gain 0 92 -82.16 gain 92 0 -88.98 gain 0 93 -75.92 gain 93 0 -80.10 gain 0 94 -84.66 gain 94 0 -87.40 gain 0 95 -87.74 gain 95 0 -89.73 gain 0 96 -92.09 gain 96 0 -101.04 gain 0 97 -85.64 gain 97 0 -87.42 gain 0 98 -90.12 gain 98 0 -92.36 gain 0 99 -95.73 gain 99 0 -97.11 gain 0 100 -96.65 gain 100 0 -97.95 gain 0 101 -94.62 gain 101 0 -99.55 gain 0 102 -93.46 gain 102 0 -98.36 gain 0 103 -94.20 gain 103 0 -100.27 gain 0 104 -99.97 gain 104 0 -108.52 gain 0 105 -83.69 gain 105 0 -86.76 gain 0 106 -88.66 gain 106 0 -89.06 gain 0 107 -88.92 gain 107 0 -89.23 gain 0 108 -89.58 gain 108 0 -89.50 gain 0 109 -85.98 gain 109 0 -89.36 gain 0 110 -89.08 gain 110 0 -98.82 gain 0 111 -87.18 gain 111 0 -86.88 gain 0 112 -91.17 gain 112 0 -94.34 gain 0 113 -92.74 gain 113 0 -95.03 gain 0 114 -95.97 gain 114 0 -95.44 gain 0 115 -98.89 gain 115 0 -99.01 gain 0 116 -93.11 gain 116 0 -95.66 gain 0 117 -94.41 gain 117 0 -94.11 gain 0 118 -89.61 gain 118 0 -90.92 gain 0 119 -101.92 gain 119 0 -108.29 gain 0 120 -92.82 gain 120 0 -96.57 gain 0 121 -88.74 gain 121 0 -93.52 gain 0 122 -87.45 gain 122 0 -91.98 gain 0 123 -94.35 gain 123 0 -99.22 gain 0 124 -87.01 gain 124 0 -89.86 gain 0 125 -93.08 gain 125 0 -99.28 gain 0 126 -91.88 gain 126 0 -94.72 gain 0 127 -93.03 gain 127 0 -95.50 gain 0 128 -96.73 gain 128 0 -101.80 gain 0 129 -90.31 gain 129 0 -92.59 gain 0 130 -94.27 gain 130 0 -97.83 gain 0 131 -98.45 gain 131 0 -101.79 gain 0 132 -98.59 gain 132 0 -97.94 gain 0 133 -97.74 gain 133 0 -102.27 gain 0 134 -105.15 gain 134 0 -106.54 gain 0 135 -89.80 gain 135 0 -93.49 gain 0 136 -89.29 gain 136 0 -93.42 gain 0 137 -88.19 gain 137 0 -95.24 gain 0 138 -94.32 gain 138 0 -94.89 gain 0 139 -92.78 gain 139 0 -96.62 gain 0 140 -93.46 gain 140 0 -98.13 gain 0 141 -87.62 gain 141 0 -84.26 gain 0 142 -90.09 gain 142 0 -93.48 gain 0 143 -97.46 gain 143 0 -103.58 gain 0 144 -92.85 gain 144 0 -97.33 gain 0 145 -91.62 gain 145 0 -99.49 gain 0 146 -103.07 gain 146 0 -106.94 gain 0 147 -91.93 gain 147 0 -92.90 gain 0 148 -102.46 gain 148 0 -101.76 gain 0 149 -101.78 gain 149 0 -104.74 gain 0 150 -89.31 gain 150 0 -93.10 gain 0 151 -87.86 gain 151 0 -90.59 gain 0 152 -89.90 gain 152 0 -92.45 gain 0 153 -93.04 gain 153 0 -94.80 gain 0 154 -86.27 gain 154 0 -89.93 gain 0 155 -89.78 gain 155 0 -92.02 gain 0 156 -94.00 gain 156 0 -95.47 gain 0 157 -92.95 gain 157 0 -96.90 gain 0 158 -92.08 gain 158 0 -95.53 gain 0 159 -95.54 gain 159 0 -101.37 gain 0 160 -89.60 gain 160 0 -92.59 gain 0 161 -97.11 gain 161 0 -102.54 gain 0 162 -99.69 gain 162 0 -104.83 gain 0 163 -102.74 gain 163 0 -109.79 gain 0 164 -101.66 gain 164 0 -108.08 gain 0 165 -89.63 gain 165 0 -93.11 gain 0 166 -99.58 gain 166 0 -102.81 gain 0 167 -91.32 gain 167 0 -95.27 gain 0 168 -90.31 gain 168 0 -93.15 gain 0 169 -95.27 gain 169 0 -99.24 gain 0 170 -97.19 gain 170 0 -100.39 gain 0 171 -93.43 gain 171 0 -97.71 gain 0 172 -98.86 gain 172 0 -101.32 gain 0 173 -92.67 gain 173 0 -99.78 gain 0 174 -90.28 gain 174 0 -93.44 gain 0 175 -103.07 gain 175 0 -107.37 gain 0 176 -99.53 gain 176 0 -102.79 gain 0 177 -93.76 gain 177 0 -100.03 gain 0 178 -98.62 gain 178 0 -98.33 gain 0 179 -102.31 gain 179 0 -101.44 gain 0 180 -98.75 gain 180 0 -107.33 gain 0 181 -86.38 gain 181 0 -88.98 gain 0 182 -89.95 gain 182 0 -93.63 gain 0 183 -88.32 gain 183 0 -92.28 gain 0 184 -106.56 gain 184 0 -113.27 gain 0 185 -98.43 gain 185 0 -109.01 gain 0 186 -99.76 gain 186 0 -105.92 gain 0 187 -101.88 gain 187 0 -105.77 gain 0 188 -100.13 gain 188 0 -106.43 gain 0 189 -92.18 gain 189 0 -93.21 gain 0 190 -97.73 gain 190 0 -102.67 gain 0 191 -103.20 gain 191 0 -106.84 gain 0 192 -101.92 gain 192 0 -104.27 gain 0 193 -101.26 gain 193 0 -102.58 gain 0 194 -104.41 gain 194 0 -106.52 gain 0 195 -96.68 gain 195 0 -97.33 gain 0 196 -95.39 gain 196 0 -100.36 gain 0 197 -99.58 gain 197 0 -99.68 gain 0 198 -94.39 gain 198 0 -99.00 gain 0 199 -90.59 gain 199 0 -95.31 gain 0 200 -97.96 gain 200 0 -104.02 gain 0 201 -102.83 gain 201 0 -108.80 gain 0 202 -95.03 gain 202 0 -100.13 gain 0 203 -96.73 gain 203 0 -100.94 gain 0 204 -99.15 gain 204 0 -100.01 gain 0 205 -93.63 gain 205 0 -98.23 gain 0 206 -100.43 gain 206 0 -106.13 gain 0 207 -98.98 gain 207 0 -104.11 gain 0 208 -99.68 gain 208 0 -107.41 gain 0 209 -104.73 gain 209 0 -112.03 gain 0 210 -92.69 gain 210 0 -100.17 gain 0 211 -94.45 gain 211 0 -97.15 gain 0 212 -98.56 gain 212 0 -104.27 gain 0 213 -94.09 gain 213 0 -99.14 gain 0 214 -92.36 gain 214 0 -102.79 gain 0 215 -93.41 gain 215 0 -99.24 gain 0 216 -91.47 gain 216 0 -101.21 gain 0 217 -92.85 gain 217 0 -102.86 gain 0 218 -92.76 gain 218 0 -95.57 gain 0 219 -93.30 gain 219 0 -96.59 gain 0 220 -96.08 gain 220 0 -95.46 gain 0 221 -97.65 gain 221 0 -102.71 gain 0 222 -97.78 gain 222 0 -98.64 gain 0 223 -98.88 gain 223 0 -102.99 gain 0 224 -101.52 gain 224 0 -106.10 gain 1 2 -60.34 gain 2 1 -61.28 gain 1 3 -78.59 gain 3 1 -78.32 gain 1 4 -70.73 gain 4 1 -71.42 gain 1 5 -81.73 gain 5 1 -80.32 gain 1 6 -86.54 gain 6 1 -86.52 gain 1 7 -91.21 gain 7 1 -91.29 gain 1 8 -91.82 gain 8 1 -93.75 gain 1 9 -90.75 gain 9 1 -97.09 gain 1 10 -87.63 gain 10 1 -92.36 gain 1 11 -101.54 gain 11 1 -110.46 gain 1 12 -97.79 gain 12 1 -97.83 gain 1 13 -86.73 gain 13 1 -90.15 gain 1 14 -95.92 gain 14 1 -95.58 gain 1 15 -67.09 gain 15 1 -69.51 gain 1 16 -65.65 gain 16 1 -70.20 gain 1 17 -76.69 gain 17 1 -79.14 gain 1 18 -74.78 gain 18 1 -78.31 gain 1 19 -82.78 gain 19 1 -87.04 gain 1 20 -78.61 gain 20 1 -84.08 gain 1 21 -85.41 gain 21 1 -89.99 gain 1 22 -91.84 gain 22 1 -94.88 gain 1 23 -83.19 gain 23 1 -83.40 gain 1 24 -92.71 gain 24 1 -94.54 gain 1 25 -91.96 gain 25 1 -96.48 gain 1 26 -91.27 gain 26 1 -97.22 gain 1 27 -95.33 gain 27 1 -98.88 gain 1 28 -97.34 gain 28 1 -96.21 gain 1 29 -93.85 gain 29 1 -94.28 gain 1 30 -73.57 gain 30 1 -79.00 gain 1 31 -76.43 gain 31 1 -78.42 gain 1 32 -72.56 gain 32 1 -71.90 gain 1 33 -78.27 gain 33 1 -79.06 gain 1 34 -76.16 gain 34 1 -77.58 gain 1 35 -84.15 gain 35 1 -86.52 gain 1 36 -88.81 gain 36 1 -91.33 gain 1 37 -88.27 gain 37 1 -93.33 gain 1 38 -90.98 gain 38 1 -93.57 gain 1 39 -90.38 gain 39 1 -97.29 gain 1 40 -93.43 gain 40 1 -95.32 gain 1 41 -90.42 gain 41 1 -87.66 gain 1 42 -91.70 gain 42 1 -96.18 gain 1 43 -94.72 gain 43 1 -96.80 gain 1 44 -88.49 gain 44 1 -94.16 gain 1 45 -82.05 gain 45 1 -87.70 gain 1 46 -73.09 gain 46 1 -75.21 gain 1 47 -76.98 gain 47 1 -76.80 gain 1 48 -79.52 gain 48 1 -78.92 gain 1 49 -85.50 gain 49 1 -88.96 gain 1 50 -75.56 gain 50 1 -75.88 gain 1 51 -90.29 gain 51 1 -94.30 gain 1 52 -84.90 gain 52 1 -86.15 gain 1 53 -99.60 gain 53 1 -101.40 gain 1 54 -86.33 gain 54 1 -87.53 gain 1 55 -97.25 gain 55 1 -95.38 gain 1 56 -89.68 gain 56 1 -92.86 gain 1 57 -89.59 gain 57 1 -91.84 gain 1 58 -95.39 gain 58 1 -94.34 gain 1 59 -94.76 gain 59 1 -92.96 gain 1 60 -81.65 gain 60 1 -89.13 gain 1 61 -79.47 gain 61 1 -78.85 gain 1 62 -78.81 gain 62 1 -75.71 gain 1 63 -78.89 gain 63 1 -79.75 gain 1 64 -83.38 gain 64 1 -88.47 gain 1 65 -80.88 gain 65 1 -81.52 gain 1 66 -81.43 gain 66 1 -81.04 gain 1 67 -87.38 gain 67 1 -88.23 gain 1 68 -82.48 gain 68 1 -85.91 gain 1 69 -96.96 gain 69 1 -97.61 gain 1 70 -98.81 gain 70 1 -97.93 gain 1 71 -90.32 gain 71 1 -93.00 gain 1 72 -99.66 gain 72 1 -99.91 gain 1 73 -94.02 gain 73 1 -95.64 gain 1 74 -89.52 gain 74 1 -87.24 gain 1 75 -78.55 gain 75 1 -82.16 gain 1 76 -75.94 gain 76 1 -79.69 gain 1 77 -82.22 gain 77 1 -81.95 gain 1 78 -85.59 gain 78 1 -89.83 gain 1 79 -79.42 gain 79 1 -83.28 gain 1 80 -88.69 gain 80 1 -90.34 gain 1 81 -86.94 gain 81 1 -89.50 gain 1 82 -92.55 gain 82 1 -96.08 gain 1 83 -88.73 gain 83 1 -89.54 gain 1 84 -85.61 gain 84 1 -83.60 gain 1 85 -95.43 gain 85 1 -98.86 gain 1 86 -98.63 gain 86 1 -103.70 gain 1 87 -94.25 gain 87 1 -96.60 gain 1 88 -101.87 gain 88 1 -103.86 gain 1 89 -96.47 gain 89 1 -100.61 gain 1 90 -83.32 gain 90 1 -86.79 gain 1 91 -89.51 gain 91 1 -94.06 gain 1 92 -87.00 gain 92 1 -92.46 gain 1 93 -86.77 gain 93 1 -89.59 gain 1 94 -90.14 gain 94 1 -91.53 gain 1 95 -92.62 gain 95 1 -93.25 gain 1 96 -93.00 gain 96 1 -100.60 gain 1 97 -87.26 gain 97 1 -87.69 gain 1 98 -89.98 gain 98 1 -90.88 gain 1 99 -98.07 gain 99 1 -98.10 gain 1 100 -89.03 gain 100 1 -88.98 gain 1 101 -100.98 gain 101 1 -104.56 gain 1 102 -94.95 gain 102 1 -98.49 gain 1 103 -97.33 gain 103 1 -102.04 gain 1 104 -95.24 gain 104 1 -102.43 gain 1 105 -83.70 gain 105 1 -85.41 gain 1 106 -84.89 gain 106 1 -83.94 gain 1 107 -81.23 gain 107 1 -80.18 gain 1 108 -87.84 gain 108 1 -86.41 gain 1 109 -84.47 gain 109 1 -86.49 gain 1 110 -88.09 gain 110 1 -96.47 gain 1 111 -95.89 gain 111 1 -94.24 gain 1 112 -89.96 gain 112 1 -91.78 gain 1 113 -92.50 gain 113 1 -93.45 gain 1 114 -86.84 gain 114 1 -84.95 gain 1 115 -89.85 gain 115 1 -88.61 gain 1 116 -99.20 gain 116 1 -100.39 gain 1 117 -89.24 gain 117 1 -87.58 gain 1 118 -92.43 gain 118 1 -92.39 gain 1 119 -101.76 gain 119 1 -106.78 gain 1 120 -88.13 gain 120 1 -90.53 gain 1 121 -92.48 gain 121 1 -95.90 gain 1 122 -95.94 gain 122 1 -99.12 gain 1 123 -87.64 gain 123 1 -91.16 gain 1 124 -90.23 gain 124 1 -91.73 gain 1 125 -90.49 gain 125 1 -95.33 gain 1 126 -86.45 gain 126 1 -87.95 gain 1 127 -94.62 gain 127 1 -95.74 gain 1 128 -94.56 gain 128 1 -98.27 gain 1 129 -94.69 gain 129 1 -95.61 gain 1 130 -93.38 gain 130 1 -95.60 gain 1 131 -95.10 gain 131 1 -97.09 gain 1 132 -94.22 gain 132 1 -92.21 gain 1 133 -94.95 gain 133 1 -98.13 gain 1 134 -93.26 gain 134 1 -93.29 gain 1 135 -96.90 gain 135 1 -99.24 gain 1 136 -94.46 gain 136 1 -97.24 gain 1 137 -91.58 gain 137 1 -97.27 gain 1 138 -91.18 gain 138 1 -90.41 gain 1 139 -91.03 gain 139 1 -93.52 gain 1 140 -88.81 gain 140 1 -92.12 gain 1 141 -94.65 gain 141 1 -89.93 gain 1 142 -95.33 gain 142 1 -97.36 gain 1 143 -96.18 gain 143 1 -100.95 gain 1 144 -101.50 gain 144 1 -104.63 gain 1 145 -90.40 gain 145 1 -96.92 gain 1 146 -95.25 gain 146 1 -97.76 gain 1 147 -95.79 gain 147 1 -95.41 gain 1 148 -98.56 gain 148 1 -96.51 gain 1 149 -102.71 gain 149 1 -104.31 gain 1 150 -93.18 gain 150 1 -95.62 gain 1 151 -87.69 gain 151 1 -89.07 gain 1 152 -92.22 gain 152 1 -93.42 gain 1 153 -93.21 gain 153 1 -93.62 gain 1 154 -89.90 gain 154 1 -92.21 gain 1 155 -94.73 gain 155 1 -95.61 gain 1 156 -96.65 gain 156 1 -96.76 gain 1 157 -98.16 gain 157 1 -100.76 gain 1 158 -92.22 gain 158 1 -94.32 gain 1 159 -95.92 gain 159 1 -100.40 gain 1 160 -98.73 gain 160 1 -100.37 gain 1 161 -96.94 gain 161 1 -101.02 gain 1 162 -99.57 gain 162 1 -103.35 gain 1 163 -102.70 gain 163 1 -108.40 gain 1 164 -99.05 gain 164 1 -104.12 gain 1 165 -89.74 gain 165 1 -91.87 gain 1 166 -94.82 gain 166 1 -96.70 gain 1 167 -93.14 gain 167 1 -95.74 gain 1 168 -93.06 gain 168 1 -94.56 gain 1 169 -93.64 gain 169 1 -96.25 gain 1 170 -94.01 gain 170 1 -95.85 gain 1 171 -98.37 gain 171 1 -101.29 gain 1 172 -90.64 gain 172 1 -91.75 gain 1 173 -94.15 gain 173 1 -99.91 gain 1 174 -101.05 gain 174 1 -102.86 gain 1 175 -96.90 gain 175 1 -99.85 gain 1 176 -94.96 gain 176 1 -96.87 gain 1 177 -97.27 gain 177 1 -102.19 gain 1 178 -98.58 gain 178 1 -96.93 gain 1 179 -92.41 gain 179 1 -90.19 gain 1 180 -98.67 gain 180 1 -105.90 gain 1 181 -95.59 gain 181 1 -96.84 gain 1 182 -96.53 gain 182 1 -98.86 gain 1 183 -98.93 gain 183 1 -101.54 gain 1 184 -100.53 gain 184 1 -105.89 gain 1 185 -103.38 gain 185 1 -112.61 gain 1 186 -97.26 gain 186 1 -102.06 gain 1 187 -102.57 gain 187 1 -105.11 gain 1 188 -96.84 gain 188 1 -101.79 gain 1 189 -102.45 gain 189 1 -102.12 gain 1 190 -98.45 gain 190 1 -102.04 gain 1 191 -101.47 gain 191 1 -103.76 gain 1 192 -97.64 gain 192 1 -98.63 gain 1 193 -93.77 gain 193 1 -93.74 gain 1 194 -100.07 gain 194 1 -100.82 gain 1 195 -94.05 gain 195 1 -93.36 gain 1 196 -105.96 gain 196 1 -109.57 gain 1 197 -91.17 gain 197 1 -89.92 gain 1 198 -91.04 gain 198 1 -94.30 gain 1 199 -99.46 gain 199 1 -102.83 gain 1 200 -99.49 gain 200 1 -104.20 gain 1 201 -92.11 gain 201 1 -96.73 gain 1 202 -97.28 gain 202 1 -101.03 gain 1 203 -100.67 gain 203 1 -103.53 gain 1 204 -100.52 gain 204 1 -100.02 gain 1 205 -98.45 gain 205 1 -101.70 gain 1 206 -101.39 gain 206 1 -105.74 gain 1 207 -96.98 gain 207 1 -100.75 gain 1 208 -104.54 gain 208 1 -110.92 gain 1 209 -95.36 gain 209 1 -101.31 gain 1 210 -99.74 gain 210 1 -105.86 gain 1 211 -101.86 gain 211 1 -103.21 gain 1 212 -96.08 gain 212 1 -100.44 gain 1 213 -98.26 gain 213 1 -101.95 gain 1 214 -97.85 gain 214 1 -106.93 gain 1 215 -91.45 gain 215 1 -95.93 gain 1 216 -98.65 gain 216 1 -107.04 gain 1 217 -95.80 gain 217 1 -104.45 gain 1 218 -99.60 gain 218 1 -101.06 gain 1 219 -102.86 gain 219 1 -104.80 gain 1 220 -104.37 gain 220 1 -102.40 gain 1 221 -98.47 gain 221 1 -102.18 gain 1 222 -110.67 gain 222 1 -110.19 gain 1 223 -94.35 gain 223 1 -97.10 gain 1 224 -102.77 gain 224 1 -105.99 gain 2 3 -57.98 gain 3 2 -56.76 gain 2 4 -69.28 gain 4 2 -69.03 gain 2 5 -73.84 gain 5 2 -71.48 gain 2 6 -81.84 gain 6 2 -80.88 gain 2 7 -81.01 gain 7 2 -80.15 gain 2 8 -88.80 gain 8 2 -89.79 gain 2 9 -89.58 gain 9 2 -94.97 gain 2 10 -91.00 gain 10 2 -94.79 gain 2 11 -94.15 gain 11 2 -102.13 gain 2 12 -94.16 gain 12 2 -93.26 gain 2 13 -96.92 gain 13 2 -99.39 gain 2 14 -96.85 gain 14 2 -95.57 gain 2 15 -79.81 gain 15 2 -81.29 gain 2 16 -72.57 gain 16 2 -76.18 gain 2 17 -62.99 gain 17 2 -64.50 gain 2 18 -65.15 gain 18 2 -67.74 gain 2 19 -74.26 gain 19 2 -77.58 gain 2 20 -77.50 gain 20 2 -82.03 gain 2 21 -80.36 gain 21 2 -84.00 gain 2 22 -75.88 gain 22 2 -77.98 gain 2 23 -86.54 gain 23 2 -85.82 gain 2 24 -92.60 gain 24 2 -93.49 gain 2 25 -89.18 gain 25 2 -92.75 gain 2 26 -88.12 gain 26 2 -93.12 gain 2 27 -94.73 gain 27 2 -97.35 gain 2 28 -101.25 gain 28 2 -99.18 gain 2 29 -94.45 gain 29 2 -93.93 gain 2 30 -73.62 gain 30 2 -78.11 gain 2 31 -71.31 gain 31 2 -72.36 gain 2 32 -66.74 gain 32 2 -65.14 gain 2 33 -72.01 gain 33 2 -71.86 gain 2 34 -74.42 gain 34 2 -74.91 gain 2 35 -86.60 gain 35 2 -88.03 gain 2 36 -85.77 gain 36 2 -87.34 gain 2 37 -86.98 gain 37 2 -91.09 gain 2 38 -84.79 gain 38 2 -86.44 gain 2 39 -82.95 gain 39 2 -88.92 gain 2 40 -99.61 gain 40 2 -100.56 gain 2 41 -91.48 gain 41 2 -87.78 gain 2 42 -89.99 gain 42 2 -93.53 gain 2 43 -96.09 gain 43 2 -97.22 gain 2 44 -96.13 gain 44 2 -100.86 gain 2 45 -75.88 gain 45 2 -80.59 gain 2 46 -80.72 gain 46 2 -81.89 gain 2 47 -74.76 gain 47 2 -73.64 gain 2 48 -76.60 gain 48 2 -75.05 gain 2 49 -77.04 gain 49 2 -79.55 gain 2 50 -81.49 gain 50 2 -80.87 gain 2 51 -94.88 gain 51 2 -97.94 gain 2 52 -80.39 gain 52 2 -80.69 gain 2 53 -82.02 gain 53 2 -82.88 gain 2 54 -90.11 gain 54 2 -90.37 gain 2 55 -102.07 gain 55 2 -99.25 gain 2 56 -103.60 gain 56 2 -105.83 gain 2 57 -90.83 gain 57 2 -92.14 gain 2 58 -94.72 gain 58 2 -92.72 gain 2 59 -96.20 gain 59 2 -93.46 gain 2 60 -88.01 gain 60 2 -94.54 gain 2 61 -78.56 gain 61 2 -77.00 gain 2 62 -80.02 gain 62 2 -75.97 gain 2 63 -82.93 gain 63 2 -82.84 gain 2 64 -80.37 gain 64 2 -84.51 gain 2 65 -79.39 gain 65 2 -79.08 gain 2 66 -85.54 gain 66 2 -84.22 gain 2 67 -82.71 gain 67 2 -82.62 gain 2 68 -87.33 gain 68 2 -89.82 gain 2 69 -86.03 gain 69 2 -85.74 gain 2 70 -90.27 gain 70 2 -88.45 gain 2 71 -91.95 gain 71 2 -93.69 gain 2 72 -92.30 gain 72 2 -91.60 gain 2 73 -100.50 gain 73 2 -101.17 gain 2 74 -98.27 gain 74 2 -95.05 gain 2 75 -94.07 gain 75 2 -96.74 gain 2 76 -81.46 gain 76 2 -84.25 gain 2 77 -83.25 gain 77 2 -82.05 gain 2 78 -90.56 gain 78 2 -93.86 gain 2 79 -88.05 gain 79 2 -90.96 gain 2 80 -91.73 gain 80 2 -92.43 gain 2 81 -85.63 gain 81 2 -87.25 gain 2 82 -81.84 gain 82 2 -84.43 gain 2 83 -89.08 gain 83 2 -88.95 gain 2 84 -90.65 gain 84 2 -87.70 gain 2 85 -97.58 gain 85 2 -100.06 gain 2 86 -98.77 gain 86 2 -102.89 gain 2 87 -93.93 gain 87 2 -95.34 gain 2 88 -99.93 gain 88 2 -100.98 gain 2 89 -98.08 gain 89 2 -101.27 gain 2 90 -85.25 gain 90 2 -87.79 gain 2 91 -90.67 gain 91 2 -94.27 gain 2 92 -90.05 gain 92 2 -94.57 gain 2 93 -85.54 gain 93 2 -87.42 gain 2 94 -86.81 gain 94 2 -87.26 gain 2 95 -91.80 gain 95 2 -91.49 gain 2 96 -92.41 gain 96 2 -99.07 gain 2 97 -91.50 gain 97 2 -90.98 gain 2 98 -83.97 gain 98 2 -83.92 gain 2 99 -88.67 gain 99 2 -87.75 gain 2 100 -90.74 gain 100 2 -89.75 gain 2 101 -95.35 gain 101 2 -97.99 gain 2 102 -94.57 gain 102 2 -97.17 gain 2 103 -101.20 gain 103 2 -104.97 gain 2 104 -101.40 gain 104 2 -107.65 gain 2 105 -89.99 gain 105 2 -90.77 gain 2 106 -88.62 gain 106 2 -86.73 gain 2 107 -81.29 gain 107 2 -79.30 gain 2 108 -92.16 gain 108 2 -89.79 gain 2 109 -95.23 gain 109 2 -96.31 gain 2 110 -92.84 gain 110 2 -100.28 gain 2 111 -89.84 gain 111 2 -87.25 gain 2 112 -90.25 gain 112 2 -91.12 gain 2 113 -90.56 gain 113 2 -90.56 gain 2 114 -92.21 gain 114 2 -89.38 gain 2 115 -89.42 gain 115 2 -87.24 gain 2 116 -98.27 gain 116 2 -98.52 gain 2 117 -100.22 gain 117 2 -97.62 gain 2 118 -90.83 gain 118 2 -89.85 gain 2 119 -99.26 gain 119 2 -103.33 gain 2 120 -92.08 gain 120 2 -93.54 gain 2 121 -94.99 gain 121 2 -97.47 gain 2 122 -90.18 gain 122 2 -92.41 gain 2 123 -93.97 gain 123 2 -96.55 gain 2 124 -93.71 gain 124 2 -94.27 gain 2 125 -91.74 gain 125 2 -95.64 gain 2 126 -96.24 gain 126 2 -96.79 gain 2 127 -101.23 gain 127 2 -101.41 gain 2 128 -96.73 gain 128 2 -99.50 gain 2 129 -88.62 gain 129 2 -88.60 gain 2 130 -94.65 gain 130 2 -95.93 gain 2 131 -97.03 gain 131 2 -98.08 gain 2 132 -96.71 gain 132 2 -93.76 gain 2 133 -98.57 gain 133 2 -100.80 gain 2 134 -93.25 gain 134 2 -92.34 gain 2 135 -88.07 gain 135 2 -89.47 gain 2 136 -87.68 gain 136 2 -89.52 gain 2 137 -100.73 gain 137 2 -105.48 gain 2 138 -91.41 gain 138 2 -89.69 gain 2 139 -94.33 gain 139 2 -95.88 gain 2 140 -90.93 gain 140 2 -93.30 gain 2 141 -96.91 gain 141 2 -91.26 gain 2 142 -92.69 gain 142 2 -93.77 gain 2 143 -89.11 gain 143 2 -92.93 gain 2 144 -96.76 gain 144 2 -98.95 gain 2 145 -98.91 gain 145 2 -104.49 gain 2 146 -94.57 gain 146 2 -96.14 gain 2 147 -94.07 gain 147 2 -92.74 gain 2 148 -98.48 gain 148 2 -95.49 gain 2 149 -102.45 gain 149 2 -103.11 gain 2 150 -93.92 gain 150 2 -95.42 gain 2 151 -86.90 gain 151 2 -87.34 gain 2 152 -93.74 gain 152 2 -94.00 gain 2 153 -88.51 gain 153 2 -87.98 gain 2 154 -94.87 gain 154 2 -96.25 gain 2 155 -96.28 gain 155 2 -96.22 gain 2 156 -95.97 gain 156 2 -95.15 gain 2 157 -93.64 gain 157 2 -95.29 gain 2 158 -98.28 gain 158 2 -99.43 gain 2 159 -98.44 gain 159 2 -101.98 gain 2 160 -101.74 gain 160 2 -102.44 gain 2 161 -103.05 gain 161 2 -106.19 gain 2 162 -105.88 gain 162 2 -108.73 gain 2 163 -103.69 gain 163 2 -108.45 gain 2 164 -99.50 gain 164 2 -103.63 gain 2 165 -94.93 gain 165 2 -96.12 gain 2 166 -97.36 gain 166 2 -98.30 gain 2 167 -88.88 gain 167 2 -90.54 gain 2 168 -92.29 gain 168 2 -92.85 gain 2 169 -100.00 gain 169 2 -101.67 gain 2 170 -96.00 gain 170 2 -96.91 gain 2 171 -98.59 gain 171 2 -100.57 gain 2 172 -88.78 gain 172 2 -88.95 gain 2 173 -92.17 gain 173 2 -96.98 gain 2 174 -93.48 gain 174 2 -94.35 gain 2 175 -92.05 gain 175 2 -94.05 gain 2 176 -100.99 gain 176 2 -101.97 gain 2 177 -97.45 gain 177 2 -101.43 gain 2 178 -106.73 gain 178 2 -104.14 gain 2 179 -102.10 gain 179 2 -98.94 gain 2 180 -96.32 gain 180 2 -102.61 gain 2 181 -92.01 gain 181 2 -92.32 gain 2 182 -94.90 gain 182 2 -96.29 gain 2 183 -95.43 gain 183 2 -97.10 gain 2 184 -90.57 gain 184 2 -94.98 gain 2 185 -94.70 gain 185 2 -102.99 gain 2 186 -90.71 gain 186 2 -94.57 gain 2 187 -93.67 gain 187 2 -95.26 gain 2 188 -93.49 gain 188 2 -97.49 gain 2 189 -95.68 gain 189 2 -94.41 gain 2 190 -100.75 gain 190 2 -103.40 gain 2 191 -91.95 gain 191 2 -93.30 gain 2 192 -101.25 gain 192 2 -101.30 gain 2 193 -94.01 gain 193 2 -93.04 gain 2 194 -103.76 gain 194 2 -103.57 gain 2 195 -97.16 gain 195 2 -95.52 gain 2 196 -95.14 gain 196 2 -97.81 gain 2 197 -94.64 gain 197 2 -92.45 gain 2 198 -96.56 gain 198 2 -98.88 gain 2 199 -98.24 gain 199 2 -100.66 gain 2 200 -100.80 gain 200 2 -104.56 gain 2 201 -93.51 gain 201 2 -97.18 gain 2 202 -98.90 gain 202 2 -101.70 gain 2 203 -101.39 gain 203 2 -103.31 gain 2 204 -97.32 gain 204 2 -95.88 gain 2 205 -102.60 gain 205 2 -104.91 gain 2 206 -98.35 gain 206 2 -101.76 gain 2 207 -100.34 gain 207 2 -103.17 gain 2 208 -101.36 gain 208 2 -106.79 gain 2 209 -108.10 gain 209 2 -113.10 gain 2 210 -97.66 gain 210 2 -102.84 gain 2 211 -97.78 gain 211 2 -98.19 gain 2 212 -90.88 gain 212 2 -94.30 gain 2 213 -95.86 gain 213 2 -98.61 gain 2 214 -98.86 gain 214 2 -107.00 gain 2 215 -99.61 gain 215 2 -103.15 gain 2 216 -91.92 gain 216 2 -99.37 gain 2 217 -99.96 gain 217 2 -107.67 gain 2 218 -99.57 gain 218 2 -100.08 gain 2 219 -103.83 gain 219 2 -104.82 gain 2 220 -101.93 gain 220 2 -99.01 gain 2 221 -97.56 gain 221 2 -100.33 gain 2 222 -95.97 gain 222 2 -94.54 gain 2 223 -101.97 gain 223 2 -103.78 gain 2 224 -97.93 gain 224 2 -100.21 gain 3 4 -62.83 gain 4 3 -63.79 gain 3 5 -72.96 gain 5 3 -71.82 gain 3 6 -74.02 gain 6 3 -74.28 gain 3 7 -84.73 gain 7 3 -85.09 gain 3 8 -91.65 gain 8 3 -93.85 gain 3 9 -92.12 gain 9 3 -98.73 gain 3 10 -86.26 gain 10 3 -91.27 gain 3 11 -86.98 gain 11 3 -96.18 gain 3 12 -97.09 gain 12 3 -97.40 gain 3 13 -84.54 gain 13 3 -88.24 gain 3 14 -97.71 gain 14 3 -97.64 gain 3 15 -79.43 gain 15 3 -82.13 gain 3 16 -76.26 gain 16 3 -81.09 gain 3 17 -63.48 gain 17 3 -66.20 gain 3 18 -66.79 gain 18 3 -70.59 gain 3 19 -68.37 gain 19 3 -72.91 gain 3 20 -76.21 gain 20 3 -81.96 gain 3 21 -71.28 gain 21 3 -76.13 gain 3 22 -89.46 gain 22 3 -92.78 gain 3 23 -86.70 gain 23 3 -87.19 gain 3 24 -85.78 gain 24 3 -87.89 gain 3 25 -93.37 gain 25 3 -98.16 gain 3 26 -87.31 gain 26 3 -93.52 gain 3 27 -91.31 gain 27 3 -95.14 gain 3 28 -89.62 gain 28 3 -88.78 gain 3 29 -94.43 gain 29 3 -95.13 gain 3 30 -80.55 gain 30 3 -86.26 gain 3 31 -81.94 gain 31 3 -84.21 gain 3 32 -77.41 gain 32 3 -77.03 gain 3 33 -77.89 gain 33 3 -78.95 gain 3 34 -71.07 gain 34 3 -72.77 gain 3 35 -83.82 gain 35 3 -86.47 gain 3 36 -79.10 gain 36 3 -81.90 gain 3 37 -82.19 gain 37 3 -87.52 gain 3 38 -85.26 gain 38 3 -88.12 gain 3 39 -86.17 gain 39 3 -93.36 gain 3 40 -92.20 gain 40 3 -94.37 gain 3 41 -96.70 gain 41 3 -94.21 gain 3 42 -89.38 gain 42 3 -94.14 gain 3 43 -95.36 gain 43 3 -97.71 gain 3 44 -96.68 gain 44 3 -102.63 gain 3 45 -79.84 gain 45 3 -85.76 gain 3 46 -78.75 gain 46 3 -81.15 gain 3 47 -70.82 gain 47 3 -70.91 gain 3 48 -77.81 gain 48 3 -77.49 gain 3 49 -79.19 gain 49 3 -82.92 gain 3 50 -76.83 gain 50 3 -77.41 gain 3 51 -78.86 gain 51 3 -83.15 gain 3 52 -92.00 gain 52 3 -93.52 gain 3 53 -90.56 gain 53 3 -92.63 gain 3 54 -83.05 gain 54 3 -84.53 gain 3 55 -86.87 gain 55 3 -85.27 gain 3 56 -90.42 gain 56 3 -93.86 gain 3 57 -95.02 gain 57 3 -97.55 gain 3 58 -90.39 gain 58 3 -89.62 gain 3 59 -93.67 gain 59 3 -92.15 gain 3 60 -87.07 gain 60 3 -94.82 gain 3 61 -77.03 gain 61 3 -76.69 gain 3 62 -84.73 gain 62 3 -81.90 gain 3 63 -80.29 gain 63 3 -81.43 gain 3 64 -85.73 gain 64 3 -91.09 gain 3 65 -84.56 gain 65 3 -85.47 gain 3 66 -85.57 gain 66 3 -85.46 gain 3 67 -83.80 gain 67 3 -84.92 gain 3 68 -89.73 gain 68 3 -93.44 gain 3 69 -90.42 gain 69 3 -91.35 gain 3 70 -90.41 gain 70 3 -89.80 gain 3 71 -92.63 gain 71 3 -95.59 gain 3 72 -93.61 gain 72 3 -94.13 gain 3 73 -98.45 gain 73 3 -100.34 gain 3 74 -94.70 gain 74 3 -92.70 gain 3 75 -87.02 gain 75 3 -90.91 gain 3 76 -82.44 gain 76 3 -86.45 gain 3 77 -80.54 gain 77 3 -80.55 gain 3 78 -82.78 gain 78 3 -87.29 gain 3 79 -88.74 gain 79 3 -92.87 gain 3 80 -85.30 gain 80 3 -87.23 gain 3 81 -80.46 gain 81 3 -83.30 gain 3 82 -80.89 gain 82 3 -84.70 gain 3 83 -80.78 gain 83 3 -81.87 gain 3 84 -88.69 gain 84 3 -86.96 gain 3 85 -87.78 gain 85 3 -91.47 gain 3 86 -90.67 gain 86 3 -96.01 gain 3 87 -92.16 gain 87 3 -94.78 gain 3 88 -94.08 gain 88 3 -96.34 gain 3 89 -101.41 gain 89 3 -105.82 gain 3 90 -93.07 gain 90 3 -96.82 gain 3 91 -87.50 gain 91 3 -92.32 gain 3 92 -82.07 gain 92 3 -87.81 gain 3 93 -83.62 gain 93 3 -86.72 gain 3 94 -85.68 gain 94 3 -87.34 gain 3 95 -87.59 gain 95 3 -88.50 gain 3 96 -93.32 gain 96 3 -101.20 gain 3 97 -90.29 gain 97 3 -90.99 gain 3 98 -95.59 gain 98 3 -96.75 gain 3 99 -81.45 gain 99 3 -81.75 gain 3 100 -87.80 gain 100 3 -88.02 gain 3 101 -100.32 gain 101 3 -104.17 gain 3 102 -98.82 gain 102 3 -102.64 gain 3 103 -95.80 gain 103 3 -100.79 gain 3 104 -90.90 gain 104 3 -98.37 gain 3 105 -89.83 gain 105 3 -91.82 gain 3 106 -84.27 gain 106 3 -83.59 gain 3 107 -82.56 gain 107 3 -81.78 gain 3 108 -90.24 gain 108 3 -89.09 gain 3 109 -84.60 gain 109 3 -86.89 gain 3 110 -89.80 gain 110 3 -98.45 gain 3 111 -91.15 gain 111 3 -89.78 gain 3 112 -88.91 gain 112 3 -91.00 gain 3 113 -89.84 gain 113 3 -91.05 gain 3 114 -91.74 gain 114 3 -90.13 gain 3 115 -89.46 gain 115 3 -88.50 gain 3 116 -90.05 gain 116 3 -91.52 gain 3 117 -94.74 gain 117 3 -93.35 gain 3 118 -94.43 gain 118 3 -94.66 gain 3 119 -90.57 gain 119 3 -95.86 gain 3 120 -89.18 gain 120 3 -91.86 gain 3 121 -86.27 gain 121 3 -89.97 gain 3 122 -80.52 gain 122 3 -83.97 gain 3 123 -91.04 gain 123 3 -94.83 gain 3 124 -87.69 gain 124 3 -89.46 gain 3 125 -92.04 gain 125 3 -97.16 gain 3 126 -86.20 gain 126 3 -87.96 gain 3 127 -90.92 gain 127 3 -92.32 gain 3 128 -83.41 gain 128 3 -87.39 gain 3 129 -87.62 gain 129 3 -88.82 gain 3 130 -91.57 gain 130 3 -94.06 gain 3 131 -93.70 gain 131 3 -95.97 gain 3 132 -89.26 gain 132 3 -87.52 gain 3 133 -100.60 gain 133 3 -104.05 gain 3 134 -97.23 gain 134 3 -97.54 gain 3 135 -82.97 gain 135 3 -85.58 gain 3 136 -90.58 gain 136 3 -93.63 gain 3 137 -90.40 gain 137 3 -96.37 gain 3 138 -91.26 gain 138 3 -90.76 gain 3 139 -92.36 gain 139 3 -95.13 gain 3 140 -91.50 gain 140 3 -95.09 gain 3 141 -83.35 gain 141 3 -78.92 gain 3 142 -95.32 gain 142 3 -97.62 gain 3 143 -91.53 gain 143 3 -96.58 gain 3 144 -87.68 gain 144 3 -91.08 gain 3 145 -96.56 gain 145 3 -103.35 gain 3 146 -92.75 gain 146 3 -95.54 gain 3 147 -94.44 gain 147 3 -94.33 gain 3 148 -89.27 gain 148 3 -87.49 gain 3 149 -88.44 gain 149 3 -90.31 gain 3 150 -88.41 gain 150 3 -91.13 gain 3 151 -88.99 gain 151 3 -90.65 gain 3 152 -97.28 gain 152 3 -98.75 gain 3 153 -93.67 gain 153 3 -94.35 gain 3 154 -93.44 gain 154 3 -96.03 gain 3 155 -87.33 gain 155 3 -88.49 gain 3 156 -93.72 gain 156 3 -94.11 gain 3 157 -91.88 gain 157 3 -94.76 gain 3 158 -87.27 gain 158 3 -89.65 gain 3 159 -97.77 gain 159 3 -102.53 gain 3 160 -98.42 gain 160 3 -100.33 gain 3 161 -94.47 gain 161 3 -98.82 gain 3 162 -92.15 gain 162 3 -96.21 gain 3 163 -95.86 gain 163 3 -101.83 gain 3 164 -99.17 gain 164 3 -104.51 gain 3 165 -92.33 gain 165 3 -94.73 gain 3 166 -97.71 gain 166 3 -99.86 gain 3 167 -95.70 gain 167 3 -98.58 gain 3 168 -96.72 gain 168 3 -98.49 gain 3 169 -103.41 gain 169 3 -106.30 gain 3 170 -95.97 gain 170 3 -98.09 gain 3 171 -87.49 gain 171 3 -90.69 gain 3 172 -92.16 gain 172 3 -93.54 gain 3 173 -86.99 gain 173 3 -93.03 gain 3 174 -84.89 gain 174 3 -86.97 gain 3 175 -99.92 gain 175 3 -103.14 gain 3 176 -100.49 gain 176 3 -102.68 gain 3 177 -94.51 gain 177 3 -99.70 gain 3 178 -100.01 gain 178 3 -98.64 gain 3 179 -96.95 gain 179 3 -95.00 gain 3 180 -96.00 gain 180 3 -103.50 gain 3 181 -99.87 gain 181 3 -101.40 gain 3 182 -91.17 gain 182 3 -93.78 gain 3 183 -90.45 gain 183 3 -93.33 gain 3 184 -89.44 gain 184 3 -95.08 gain 3 185 -98.95 gain 185 3 -108.45 gain 3 186 -100.11 gain 186 3 -105.19 gain 3 187 -93.48 gain 187 3 -96.29 gain 3 188 -94.17 gain 188 3 -99.39 gain 3 189 -94.35 gain 189 3 -94.29 gain 3 190 -101.91 gain 190 3 -105.77 gain 3 191 -94.54 gain 191 3 -97.11 gain 3 192 -93.33 gain 192 3 -94.59 gain 3 193 -93.81 gain 193 3 -94.06 gain 3 194 -98.24 gain 194 3 -99.27 gain 3 195 -95.61 gain 195 3 -95.19 gain 3 196 -96.32 gain 196 3 -100.21 gain 3 197 -97.59 gain 197 3 -96.61 gain 3 198 -90.14 gain 198 3 -93.67 gain 3 199 -94.27 gain 199 3 -97.91 gain 3 200 -91.58 gain 200 3 -96.55 gain 3 201 -91.27 gain 201 3 -96.16 gain 3 202 -94.53 gain 202 3 -98.55 gain 3 203 -92.91 gain 203 3 -96.04 gain 3 204 -90.13 gain 204 3 -89.91 gain 3 205 -95.27 gain 205 3 -98.79 gain 3 206 -103.81 gain 206 3 -108.43 gain 3 207 -98.53 gain 207 3 -102.57 gain 3 208 -101.25 gain 208 3 -107.90 gain 3 209 -101.73 gain 209 3 -107.95 gain 3 210 -105.37 gain 210 3 -111.77 gain 3 211 -94.39 gain 211 3 -96.01 gain 3 212 -88.04 gain 212 3 -92.67 gain 3 213 -109.11 gain 213 3 -113.07 gain 3 214 -99.65 gain 214 3 -109.00 gain 3 215 -103.55 gain 215 3 -108.30 gain 3 216 -98.92 gain 216 3 -107.59 gain 3 217 -97.51 gain 217 3 -106.44 gain 3 218 -95.64 gain 218 3 -97.37 gain 3 219 -95.62 gain 219 3 -97.84 gain 3 220 -93.52 gain 220 3 -91.83 gain 3 221 -101.99 gain 221 3 -105.97 gain 3 222 -96.15 gain 222 3 -95.94 gain 3 223 -105.89 gain 223 3 -108.92 gain 3 224 -101.60 gain 224 3 -105.09 gain 4 5 -61.94 gain 5 4 -59.83 gain 4 6 -69.56 gain 6 4 -68.85 gain 4 7 -78.17 gain 7 4 -77.56 gain 4 8 -86.72 gain 8 4 -87.96 gain 4 9 -80.95 gain 9 4 -86.59 gain 4 10 -87.41 gain 10 4 -91.45 gain 4 11 -82.77 gain 11 4 -91.00 gain 4 12 -81.35 gain 12 4 -80.69 gain 4 13 -90.19 gain 13 4 -92.92 gain 4 14 -95.50 gain 14 4 -94.46 gain 4 15 -80.59 gain 15 4 -82.32 gain 4 16 -77.51 gain 16 4 -81.37 gain 4 17 -71.33 gain 17 4 -73.08 gain 4 18 -72.97 gain 18 4 -75.80 gain 4 19 -73.21 gain 19 4 -76.79 gain 4 20 -65.83 gain 20 4 -70.61 gain 4 21 -78.00 gain 21 4 -81.89 gain 4 22 -87.54 gain 22 4 -89.90 gain 4 23 -73.48 gain 23 4 -73.00 gain 4 24 -86.23 gain 24 4 -87.37 gain 4 25 -93.20 gain 25 4 -97.02 gain 4 26 -82.41 gain 26 4 -87.66 gain 4 27 -91.51 gain 27 4 -94.37 gain 4 28 -96.78 gain 28 4 -94.97 gain 4 29 -91.53 gain 29 4 -91.27 gain 4 30 -78.59 gain 30 4 -83.33 gain 4 31 -83.32 gain 31 4 -84.62 gain 4 32 -81.01 gain 32 4 -79.66 gain 4 33 -69.02 gain 33 4 -69.12 gain 4 34 -68.80 gain 34 4 -69.53 gain 4 35 -76.21 gain 35 4 -77.89 gain 4 36 -77.91 gain 36 4 -79.73 gain 4 37 -82.44 gain 37 4 -86.80 gain 4 38 -83.64 gain 38 4 -85.54 gain 4 39 -85.76 gain 39 4 -91.98 gain 4 40 -84.60 gain 40 4 -85.79 gain 4 41 -90.33 gain 41 4 -86.88 gain 4 42 -98.18 gain 42 4 -101.97 gain 4 43 -89.90 gain 43 4 -91.29 gain 4 44 -94.66 gain 44 4 -99.64 gain 4 45 -87.22 gain 45 4 -92.18 gain 4 46 -84.60 gain 46 4 -86.03 gain 4 47 -74.35 gain 47 4 -73.47 gain 4 48 -75.68 gain 48 4 -74.38 gain 4 49 -81.94 gain 49 4 -84.70 gain 4 50 -67.66 gain 50 4 -67.28 gain 4 51 -78.52 gain 51 4 -81.84 gain 4 52 -82.58 gain 52 4 -83.13 gain 4 53 -82.46 gain 53 4 -83.56 gain 4 54 -82.26 gain 54 4 -82.78 gain 4 55 -92.95 gain 55 4 -90.38 gain 4 56 -96.75 gain 56 4 -99.23 gain 4 57 -89.63 gain 57 4 -91.19 gain 4 58 -94.45 gain 58 4 -92.71 gain 4 59 -97.98 gain 59 4 -95.49 gain 4 60 -93.44 gain 60 4 -100.23 gain 4 61 -78.57 gain 61 4 -77.26 gain 4 62 -86.74 gain 62 4 -82.94 gain 4 63 -79.37 gain 63 4 -79.54 gain 4 64 -86.47 gain 64 4 -90.86 gain 4 65 -79.96 gain 65 4 -79.90 gain 4 66 -89.42 gain 66 4 -88.34 gain 4 67 -82.96 gain 67 4 -83.11 gain 4 68 -86.07 gain 68 4 -88.81 gain 4 69 -85.09 gain 69 4 -85.05 gain 4 70 -89.38 gain 70 4 -87.81 gain 4 71 -88.85 gain 71 4 -90.84 gain 4 72 -87.53 gain 72 4 -87.08 gain 4 73 -87.85 gain 73 4 -88.77 gain 4 74 -98.03 gain 74 4 -95.06 gain 4 75 -85.17 gain 75 4 -88.09 gain 4 76 -87.73 gain 76 4 -90.77 gain 4 77 -90.70 gain 77 4 -89.75 gain 4 78 -76.25 gain 78 4 -79.80 gain 4 79 -79.07 gain 79 4 -82.23 gain 4 80 -87.22 gain 80 4 -88.18 gain 4 81 -80.56 gain 81 4 -82.42 gain 4 82 -92.55 gain 82 4 -95.40 gain 4 83 -91.60 gain 83 4 -91.71 gain 4 84 -86.36 gain 84 4 -83.67 gain 4 85 -80.39 gain 85 4 -83.12 gain 4 86 -94.09 gain 86 4 -98.46 gain 4 87 -89.41 gain 87 4 -91.06 gain 4 88 -90.88 gain 88 4 -92.18 gain 4 89 -91.45 gain 89 4 -94.90 gain 4 90 -87.99 gain 90 4 -90.77 gain 4 91 -87.05 gain 91 4 -90.90 gain 4 92 -81.34 gain 92 4 -86.11 gain 4 93 -90.64 gain 93 4 -92.77 gain 4 94 -92.62 gain 94 4 -93.31 gain 4 95 -85.63 gain 95 4 -85.56 gain 4 96 -82.12 gain 96 4 -89.03 gain 4 97 -93.85 gain 97 4 -93.58 gain 4 98 -95.76 gain 98 4 -95.96 gain 4 99 -86.80 gain 99 4 -86.13 gain 4 100 -93.13 gain 100 4 -92.39 gain 4 101 -84.96 gain 101 4 -87.84 gain 4 102 -89.49 gain 102 4 -92.34 gain 4 103 -93.18 gain 103 4 -97.20 gain 4 104 -92.42 gain 104 4 -98.92 gain 4 105 -87.05 gain 105 4 -88.07 gain 4 106 -85.96 gain 106 4 -84.31 gain 4 107 -85.66 gain 107 4 -83.91 gain 4 108 -83.20 gain 108 4 -81.08 gain 4 109 -90.00 gain 109 4 -91.33 gain 4 110 -86.47 gain 110 4 -94.15 gain 4 111 -93.15 gain 111 4 -90.81 gain 4 112 -94.97 gain 112 4 -96.09 gain 4 113 -90.56 gain 113 4 -90.80 gain 4 114 -96.33 gain 114 4 -93.75 gain 4 115 -84.87 gain 115 4 -82.94 gain 4 116 -96.77 gain 116 4 -97.27 gain 4 117 -90.97 gain 117 4 -88.62 gain 4 118 -91.09 gain 118 4 -90.36 gain 4 119 -92.97 gain 119 4 -97.29 gain 4 120 -90.68 gain 120 4 -92.39 gain 4 121 -86.98 gain 121 4 -89.71 gain 4 122 -87.18 gain 122 4 -89.66 gain 4 123 -90.98 gain 123 4 -93.80 gain 4 124 -83.85 gain 124 4 -84.67 gain 4 125 -87.04 gain 125 4 -91.19 gain 4 126 -90.76 gain 126 4 -91.56 gain 4 127 -92.92 gain 127 4 -93.34 gain 4 128 -95.27 gain 128 4 -98.28 gain 4 129 -94.80 gain 129 4 -95.03 gain 4 130 -90.50 gain 130 4 -92.02 gain 4 131 -91.01 gain 131 4 -92.30 gain 4 132 -100.45 gain 132 4 -97.75 gain 4 133 -95.24 gain 133 4 -97.72 gain 4 134 -93.58 gain 134 4 -92.92 gain 4 135 -85.40 gain 135 4 -87.05 gain 4 136 -93.01 gain 136 4 -95.09 gain 4 137 -94.73 gain 137 4 -99.73 gain 4 138 -90.47 gain 138 4 -89.00 gain 4 139 -88.86 gain 139 4 -90.65 gain 4 140 -80.34 gain 140 4 -82.96 gain 4 141 -88.08 gain 141 4 -82.67 gain 4 142 -97.26 gain 142 4 -98.59 gain 4 143 -93.76 gain 143 4 -97.83 gain 4 144 -97.83 gain 144 4 -100.27 gain 4 145 -93.80 gain 145 4 -99.63 gain 4 146 -93.94 gain 146 4 -95.76 gain 4 147 -100.23 gain 147 4 -99.16 gain 4 148 -96.47 gain 148 4 -93.72 gain 4 149 -94.79 gain 149 4 -95.70 gain 4 150 -96.80 gain 150 4 -98.54 gain 4 151 -96.29 gain 151 4 -96.98 gain 4 152 -102.26 gain 152 4 -102.76 gain 4 153 -87.19 gain 153 4 -86.91 gain 4 154 -87.94 gain 154 4 -89.56 gain 4 155 -92.60 gain 155 4 -92.79 gain 4 156 -93.30 gain 156 4 -92.72 gain 4 157 -97.50 gain 157 4 -99.40 gain 4 158 -100.64 gain 158 4 -102.04 gain 4 159 -95.55 gain 159 4 -99.34 gain 4 160 -90.88 gain 160 4 -91.82 gain 4 161 -97.11 gain 161 4 -100.49 gain 4 162 -97.46 gain 162 4 -100.55 gain 4 163 -95.64 gain 163 4 -100.65 gain 4 164 -98.64 gain 164 4 -103.02 gain 4 165 -98.53 gain 165 4 -99.96 gain 4 166 -98.69 gain 166 4 -99.88 gain 4 167 -92.94 gain 167 4 -94.85 gain 4 168 -99.10 gain 168 4 -99.90 gain 4 169 -91.35 gain 169 4 -93.27 gain 4 170 -87.54 gain 170 4 -88.69 gain 4 171 -89.42 gain 171 4 -91.65 gain 4 172 -102.50 gain 172 4 -102.92 gain 4 173 -96.85 gain 173 4 -101.92 gain 4 174 -93.90 gain 174 4 -95.02 gain 4 175 -98.97 gain 175 4 -101.22 gain 4 176 -102.38 gain 176 4 -103.60 gain 4 177 -94.44 gain 177 4 -98.66 gain 4 178 -101.56 gain 178 4 -99.23 gain 4 179 -101.63 gain 179 4 -98.71 gain 4 180 -104.74 gain 180 4 -111.27 gain 4 181 -95.65 gain 181 4 -96.21 gain 4 182 -97.81 gain 182 4 -99.45 gain 4 183 -94.34 gain 183 4 -96.26 gain 4 184 -99.88 gain 184 4 -104.55 gain 4 185 -95.71 gain 185 4 -104.24 gain 4 186 -93.75 gain 186 4 -97.86 gain 4 187 -96.59 gain 187 4 -98.43 gain 4 188 -89.94 gain 188 4 -94.20 gain 4 189 -105.33 gain 189 4 -104.31 gain 4 190 -101.32 gain 190 4 -104.22 gain 4 191 -95.05 gain 191 4 -96.65 gain 4 192 -95.86 gain 192 4 -96.15 gain 4 193 -103.24 gain 193 4 -102.52 gain 4 194 -107.56 gain 194 4 -107.62 gain 4 195 -94.54 gain 195 4 -93.15 gain 4 196 -90.23 gain 196 4 -93.15 gain 4 197 -97.91 gain 197 4 -95.97 gain 4 198 -96.33 gain 198 4 -98.90 gain 4 199 -102.85 gain 199 4 -105.53 gain 4 200 -91.59 gain 200 4 -95.60 gain 4 201 -101.87 gain 201 4 -105.79 gain 4 202 -94.73 gain 202 4 -97.79 gain 4 203 -89.72 gain 203 4 -91.89 gain 4 204 -95.24 gain 204 4 -94.05 gain 4 205 -96.40 gain 205 4 -98.95 gain 4 206 -98.41 gain 206 4 -102.07 gain 4 207 -95.04 gain 207 4 -98.12 gain 4 208 -96.25 gain 208 4 -101.93 gain 4 209 -94.39 gain 209 4 -99.64 gain 4 210 -109.37 gain 210 4 -114.80 gain 4 211 -93.33 gain 211 4 -93.99 gain 4 212 -102.59 gain 212 4 -106.26 gain 4 213 -104.48 gain 213 4 -107.48 gain 4 214 -95.17 gain 214 4 -103.56 gain 4 215 -97.71 gain 215 4 -101.49 gain 4 216 -97.85 gain 216 4 -105.55 gain 4 217 -100.98 gain 217 4 -108.94 gain 4 218 -104.69 gain 218 4 -105.45 gain 4 219 -97.26 gain 219 4 -98.51 gain 4 220 -95.51 gain 220 4 -92.85 gain 4 221 -97.45 gain 221 4 -100.46 gain 4 222 -101.03 gain 222 4 -99.85 gain 4 223 -101.32 gain 223 4 -103.39 gain 4 224 -90.26 gain 224 4 -92.79 gain 5 6 -64.26 gain 6 5 -65.65 gain 5 7 -65.82 gain 7 5 -67.32 gain 5 8 -77.72 gain 8 5 -81.06 gain 5 9 -79.57 gain 9 5 -87.32 gain 5 10 -86.51 gain 10 5 -92.66 gain 5 11 -88.43 gain 11 5 -98.77 gain 5 12 -88.98 gain 12 5 -90.43 gain 5 13 -92.84 gain 13 5 -97.67 gain 5 14 -94.10 gain 14 5 -95.17 gain 5 15 -82.23 gain 15 5 -86.06 gain 5 16 -79.84 gain 16 5 -85.80 gain 5 17 -74.98 gain 17 5 -78.84 gain 5 18 -74.48 gain 18 5 -79.43 gain 5 19 -63.34 gain 19 5 -69.02 gain 5 20 -56.75 gain 20 5 -63.63 gain 5 21 -63.08 gain 21 5 -69.07 gain 5 22 -75.38 gain 22 5 -79.84 gain 5 23 -76.83 gain 23 5 -78.46 gain 5 24 -83.92 gain 24 5 -87.16 gain 5 25 -80.25 gain 25 5 -86.17 gain 5 26 -88.28 gain 26 5 -95.63 gain 5 27 -88.33 gain 27 5 -93.30 gain 5 28 -86.92 gain 28 5 -87.21 gain 5 29 -95.22 gain 29 5 -97.06 gain 5 30 -87.59 gain 30 5 -94.44 gain 5 31 -81.28 gain 31 5 -84.69 gain 5 32 -81.15 gain 32 5 -81.91 gain 5 33 -74.39 gain 33 5 -76.59 gain 5 34 -74.87 gain 34 5 -77.71 gain 5 35 -72.51 gain 35 5 -76.30 gain 5 36 -73.50 gain 36 5 -77.43 gain 5 37 -69.75 gain 37 5 -76.22 gain 5 38 -77.56 gain 38 5 -81.56 gain 5 39 -83.53 gain 39 5 -91.86 gain 5 40 -86.13 gain 40 5 -89.44 gain 5 41 -86.74 gain 41 5 -85.39 gain 5 42 -96.05 gain 42 5 -101.95 gain 5 43 -85.34 gain 43 5 -88.83 gain 5 44 -89.77 gain 44 5 -96.85 gain 5 45 -84.58 gain 45 5 -91.65 gain 5 46 -84.45 gain 46 5 -87.98 gain 5 47 -86.88 gain 47 5 -88.11 gain 5 48 -78.24 gain 48 5 -79.05 gain 5 49 -76.31 gain 49 5 -81.18 gain 5 50 -73.52 gain 50 5 -75.24 gain 5 51 -68.33 gain 51 5 -73.75 gain 5 52 -78.74 gain 52 5 -81.40 gain 5 53 -81.21 gain 53 5 -84.42 gain 5 54 -84.20 gain 54 5 -86.82 gain 5 55 -77.83 gain 55 5 -77.36 gain 5 56 -76.99 gain 56 5 -81.58 gain 5 57 -97.62 gain 57 5 -101.29 gain 5 58 -91.69 gain 58 5 -92.05 gain 5 59 -97.74 gain 59 5 -97.36 gain 5 60 -87.79 gain 60 5 -96.68 gain 5 61 -88.87 gain 61 5 -89.67 gain 5 62 -77.11 gain 62 5 -75.41 gain 5 63 -82.31 gain 63 5 -84.59 gain 5 64 -78.77 gain 64 5 -85.27 gain 5 65 -80.19 gain 65 5 -82.24 gain 5 66 -82.32 gain 66 5 -83.35 gain 5 67 -86.06 gain 67 5 -88.31 gain 5 68 -79.27 gain 68 5 -84.12 gain 5 69 -82.56 gain 69 5 -84.63 gain 5 70 -88.59 gain 70 5 -89.12 gain 5 71 -88.94 gain 71 5 -93.04 gain 5 72 -94.58 gain 72 5 -96.24 gain 5 73 -88.67 gain 73 5 -91.70 gain 5 74 -92.34 gain 74 5 -91.48 gain 5 75 -84.36 gain 75 5 -89.39 gain 5 76 -90.86 gain 76 5 -96.01 gain 5 77 -82.63 gain 77 5 -83.78 gain 5 78 -85.60 gain 78 5 -91.25 gain 5 79 -80.81 gain 79 5 -86.08 gain 5 80 -83.32 gain 80 5 -86.38 gain 5 81 -83.93 gain 81 5 -87.91 gain 5 82 -83.85 gain 82 5 -88.80 gain 5 83 -85.51 gain 83 5 -87.73 gain 5 84 -83.14 gain 84 5 -82.55 gain 5 85 -81.45 gain 85 5 -86.29 gain 5 86 -97.90 gain 86 5 -104.38 gain 5 87 -85.72 gain 87 5 -89.48 gain 5 88 -83.10 gain 88 5 -86.50 gain 5 89 -94.71 gain 89 5 -100.26 gain 5 90 -91.99 gain 90 5 -96.88 gain 5 91 -79.43 gain 91 5 -85.38 gain 5 92 -89.51 gain 92 5 -96.39 gain 5 93 -85.24 gain 93 5 -89.48 gain 5 94 -81.41 gain 94 5 -84.21 gain 5 95 -83.02 gain 95 5 -85.07 gain 5 96 -83.87 gain 96 5 -92.89 gain 5 97 -89.35 gain 97 5 -91.18 gain 5 98 -92.07 gain 98 5 -94.37 gain 5 99 -87.74 gain 99 5 -89.19 gain 5 100 -94.04 gain 100 5 -95.40 gain 5 101 -90.12 gain 101 5 -95.11 gain 5 102 -84.73 gain 102 5 -89.68 gain 5 103 -85.16 gain 103 5 -91.28 gain 5 104 -91.50 gain 104 5 -100.11 gain 5 105 -96.28 gain 105 5 -99.41 gain 5 106 -89.06 gain 106 5 -89.52 gain 5 107 -76.32 gain 107 5 -76.68 gain 5 108 -86.67 gain 108 5 -86.65 gain 5 109 -87.85 gain 109 5 -91.29 gain 5 110 -84.42 gain 110 5 -94.21 gain 5 111 -83.61 gain 111 5 -83.37 gain 5 112 -83.46 gain 112 5 -86.69 gain 5 113 -89.24 gain 113 5 -91.59 gain 5 114 -92.00 gain 114 5 -91.52 gain 5 115 -89.57 gain 115 5 -89.75 gain 5 116 -88.24 gain 116 5 -90.85 gain 5 117 -90.67 gain 117 5 -90.42 gain 5 118 -85.87 gain 118 5 -87.24 gain 5 119 -93.47 gain 119 5 -99.90 gain 5 120 -89.63 gain 120 5 -93.45 gain 5 121 -93.58 gain 121 5 -98.42 gain 5 122 -88.37 gain 122 5 -92.96 gain 5 123 -89.32 gain 123 5 -94.25 gain 5 124 -88.84 gain 124 5 -91.76 gain 5 125 -91.19 gain 125 5 -97.45 gain 5 126 -89.13 gain 126 5 -92.03 gain 5 127 -88.88 gain 127 5 -91.41 gain 5 128 -83.30 gain 128 5 -88.43 gain 5 129 -88.27 gain 129 5 -90.61 gain 5 130 -92.09 gain 130 5 -95.72 gain 5 131 -93.72 gain 131 5 -97.12 gain 5 132 -94.08 gain 132 5 -93.49 gain 5 133 -93.56 gain 133 5 -98.15 gain 5 134 -93.57 gain 134 5 -95.02 gain 5 135 -90.37 gain 135 5 -94.12 gain 5 136 -84.69 gain 136 5 -88.89 gain 5 137 -94.43 gain 137 5 -101.53 gain 5 138 -88.13 gain 138 5 -88.76 gain 5 139 -88.55 gain 139 5 -92.45 gain 5 140 -92.02 gain 140 5 -96.75 gain 5 141 -88.95 gain 141 5 -85.65 gain 5 142 -97.73 gain 142 5 -101.18 gain 5 143 -91.39 gain 143 5 -97.57 gain 5 144 -89.78 gain 144 5 -94.33 gain 5 145 -96.24 gain 145 5 -104.17 gain 5 146 -96.57 gain 146 5 -100.49 gain 5 147 -89.76 gain 147 5 -90.79 gain 5 148 -92.29 gain 148 5 -91.65 gain 5 149 -96.57 gain 149 5 -99.59 gain 5 150 -92.48 gain 150 5 -96.33 gain 5 151 -86.68 gain 151 5 -89.48 gain 5 152 -86.37 gain 152 5 -88.98 gain 5 153 -84.18 gain 153 5 -86.00 gain 5 154 -90.72 gain 154 5 -94.45 gain 5 155 -92.43 gain 155 5 -94.73 gain 5 156 -101.02 gain 156 5 -102.55 gain 5 157 -93.60 gain 157 5 -97.61 gain 5 158 -85.44 gain 158 5 -88.95 gain 5 159 -92.50 gain 159 5 -98.40 gain 5 160 -93.48 gain 160 5 -96.53 gain 5 161 -93.32 gain 161 5 -98.80 gain 5 162 -92.01 gain 162 5 -97.21 gain 5 163 -92.19 gain 163 5 -99.31 gain 5 164 -92.78 gain 164 5 -99.26 gain 5 165 -93.94 gain 165 5 -97.47 gain 5 166 -90.69 gain 166 5 -93.98 gain 5 167 -90.19 gain 167 5 -94.20 gain 5 168 -99.75 gain 168 5 -102.66 gain 5 169 -93.09 gain 169 5 -97.11 gain 5 170 -92.90 gain 170 5 -96.16 gain 5 171 -94.28 gain 171 5 -98.62 gain 5 172 -93.50 gain 172 5 -96.03 gain 5 173 -93.39 gain 173 5 -100.57 gain 5 174 -91.54 gain 174 5 -94.76 gain 5 175 -91.70 gain 175 5 -96.06 gain 5 176 -89.07 gain 176 5 -92.40 gain 5 177 -92.55 gain 177 5 -98.88 gain 5 178 -89.65 gain 178 5 -89.42 gain 5 179 -100.01 gain 179 5 -99.20 gain 5 180 -92.98 gain 180 5 -101.62 gain 5 181 -98.96 gain 181 5 -101.62 gain 5 182 -103.32 gain 182 5 -107.06 gain 5 183 -97.73 gain 183 5 -101.76 gain 5 184 -98.18 gain 184 5 -104.95 gain 5 185 -93.99 gain 185 5 -104.62 gain 5 186 -90.40 gain 186 5 -96.62 gain 5 187 -91.45 gain 187 5 -95.39 gain 5 188 -94.50 gain 188 5 -100.86 gain 5 189 -93.18 gain 189 5 -94.26 gain 5 190 -97.47 gain 190 5 -102.47 gain 5 191 -93.27 gain 191 5 -96.97 gain 5 192 -93.12 gain 192 5 -95.53 gain 5 193 -91.20 gain 193 5 -92.59 gain 5 194 -95.73 gain 194 5 -97.90 gain 5 195 -88.61 gain 195 5 -89.33 gain 5 196 -96.71 gain 196 5 -101.74 gain 5 197 -93.03 gain 197 5 -93.19 gain 5 198 -93.98 gain 198 5 -98.65 gain 5 199 -95.11 gain 199 5 -99.89 gain 5 200 -98.45 gain 200 5 -104.56 gain 5 201 -92.34 gain 201 5 -98.36 gain 5 202 -102.51 gain 202 5 -107.67 gain 5 203 -96.69 gain 203 5 -100.96 gain 5 204 -99.08 gain 204 5 -99.99 gain 5 205 -90.48 gain 205 5 -95.14 gain 5 206 -100.24 gain 206 5 -106.00 gain 5 207 -98.27 gain 207 5 -103.46 gain 5 208 -92.62 gain 208 5 -100.40 gain 5 209 -96.62 gain 209 5 -103.98 gain 5 210 -93.56 gain 210 5 -101.09 gain 5 211 -90.33 gain 211 5 -93.09 gain 5 212 -102.69 gain 212 5 -108.47 gain 5 213 -99.65 gain 213 5 -104.76 gain 5 214 -101.41 gain 214 5 -111.90 gain 5 215 -97.63 gain 215 5 -103.52 gain 5 216 -92.88 gain 216 5 -102.68 gain 5 217 -97.38 gain 217 5 -107.45 gain 5 218 -98.88 gain 218 5 -101.75 gain 5 219 -98.06 gain 219 5 -101.41 gain 5 220 -107.00 gain 220 5 -106.44 gain 5 221 -93.52 gain 221 5 -98.64 gain 5 222 -94.12 gain 222 5 -95.05 gain 5 223 -98.19 gain 223 5 -102.35 gain 5 224 -100.26 gain 224 5 -104.90 gain 6 7 -63.86 gain 7 6 -63.96 gain 6 8 -70.51 gain 8 6 -72.46 gain 6 9 -79.58 gain 9 6 -85.93 gain 6 10 -77.10 gain 10 6 -81.85 gain 6 11 -86.87 gain 11 6 -95.81 gain 6 12 -88.98 gain 12 6 -89.04 gain 6 13 -93.23 gain 13 6 -96.67 gain 6 14 -90.41 gain 14 6 -90.09 gain 6 15 -79.42 gain 15 6 -81.86 gain 6 16 -76.68 gain 16 6 -81.25 gain 6 17 -83.29 gain 17 6 -85.76 gain 6 18 -71.53 gain 18 6 -75.07 gain 6 19 -70.71 gain 19 6 -75.00 gain 6 20 -69.54 gain 20 6 -75.04 gain 6 21 -62.84 gain 21 6 -67.44 gain 6 22 -68.87 gain 22 6 -71.93 gain 6 23 -69.01 gain 23 6 -69.24 gain 6 24 -75.55 gain 24 6 -77.40 gain 6 25 -78.04 gain 25 6 -82.58 gain 6 26 -79.52 gain 26 6 -85.48 gain 6 27 -80.62 gain 27 6 -84.19 gain 6 28 -88.87 gain 28 6 -87.76 gain 6 29 -89.43 gain 29 6 -89.87 gain 6 30 -87.30 gain 30 6 -92.75 gain 6 31 -87.35 gain 31 6 -89.36 gain 6 32 -81.95 gain 32 6 -81.32 gain 6 33 -79.97 gain 33 6 -80.78 gain 6 34 -78.55 gain 34 6 -79.99 gain 6 35 -65.42 gain 35 6 -67.81 gain 6 36 -74.53 gain 36 6 -77.07 gain 6 37 -68.79 gain 37 6 -73.87 gain 6 38 -78.99 gain 38 6 -81.60 gain 6 39 -85.63 gain 39 6 -92.56 gain 6 40 -86.10 gain 40 6 -88.01 gain 6 41 -89.74 gain 41 6 -86.99 gain 6 42 -94.15 gain 42 6 -98.65 gain 6 43 -88.85 gain 43 6 -90.95 gain 6 44 -96.14 gain 44 6 -101.83 gain 6 45 -92.73 gain 45 6 -98.40 gain 6 46 -86.84 gain 46 6 -88.97 gain 6 47 -73.11 gain 47 6 -72.95 gain 6 48 -78.44 gain 48 6 -77.86 gain 6 49 -80.68 gain 49 6 -84.15 gain 6 50 -79.65 gain 50 6 -79.98 gain 6 51 -74.13 gain 51 6 -78.16 gain 6 52 -77.83 gain 52 6 -79.10 gain 6 53 -72.74 gain 53 6 -74.56 gain 6 54 -80.54 gain 54 6 -81.77 gain 6 55 -89.26 gain 55 6 -87.40 gain 6 56 -89.32 gain 56 6 -92.51 gain 6 57 -86.68 gain 57 6 -88.95 gain 6 58 -95.39 gain 58 6 -94.35 gain 6 59 -92.03 gain 59 6 -90.25 gain 6 60 -85.56 gain 60 6 -93.06 gain 6 61 -90.91 gain 61 6 -90.31 gain 6 62 -81.28 gain 62 6 -78.20 gain 6 63 -90.99 gain 63 6 -91.87 gain 6 64 -86.02 gain 64 6 -91.12 gain 6 65 -78.58 gain 65 6 -79.24 gain 6 66 -85.62 gain 66 6 -85.26 gain 6 67 -84.44 gain 67 6 -85.30 gain 6 68 -85.52 gain 68 6 -88.98 gain 6 69 -79.90 gain 69 6 -80.56 gain 6 70 -86.08 gain 70 6 -85.21 gain 6 71 -90.74 gain 71 6 -93.44 gain 6 72 -90.26 gain 72 6 -90.52 gain 6 73 -90.63 gain 73 6 -92.26 gain 6 74 -94.42 gain 74 6 -92.16 gain 6 75 -87.47 gain 75 6 -91.10 gain 6 76 -85.15 gain 76 6 -88.91 gain 6 77 -86.87 gain 77 6 -86.63 gain 6 78 -82.89 gain 78 6 -87.15 gain 6 79 -83.67 gain 79 6 -87.55 gain 6 80 -83.41 gain 80 6 -85.08 gain 6 81 -81.37 gain 81 6 -83.94 gain 6 82 -92.84 gain 82 6 -96.39 gain 6 83 -84.02 gain 83 6 -84.85 gain 6 84 -88.28 gain 84 6 -86.29 gain 6 85 -88.47 gain 85 6 -91.91 gain 6 86 -90.52 gain 86 6 -95.60 gain 6 87 -88.40 gain 87 6 -90.77 gain 6 88 -91.01 gain 88 6 -93.02 gain 6 89 -94.82 gain 89 6 -98.97 gain 6 90 -88.70 gain 90 6 -92.19 gain 6 91 -87.20 gain 91 6 -91.76 gain 6 92 -83.60 gain 92 6 -89.08 gain 6 93 -83.20 gain 93 6 -86.04 gain 6 94 -78.88 gain 94 6 -80.29 gain 6 95 -90.87 gain 95 6 -91.52 gain 6 96 -84.75 gain 96 6 -92.37 gain 6 97 -87.80 gain 97 6 -88.24 gain 6 98 -91.05 gain 98 6 -91.96 gain 6 99 -89.63 gain 99 6 -89.68 gain 6 100 -90.56 gain 100 6 -90.53 gain 6 101 -86.78 gain 101 6 -90.38 gain 6 102 -90.14 gain 102 6 -93.70 gain 6 103 -92.33 gain 103 6 -97.06 gain 6 104 -90.48 gain 104 6 -97.69 gain 6 105 -92.73 gain 105 6 -94.47 gain 6 106 -93.88 gain 106 6 -92.95 gain 6 107 -93.64 gain 107 6 -92.61 gain 6 108 -87.52 gain 108 6 -86.11 gain 6 109 -89.54 gain 109 6 -91.57 gain 6 110 -86.53 gain 110 6 -94.93 gain 6 111 -88.83 gain 111 6 -87.20 gain 6 112 -93.19 gain 112 6 -95.02 gain 6 113 -88.28 gain 113 6 -89.24 gain 6 114 -90.74 gain 114 6 -88.87 gain 6 115 -92.87 gain 115 6 -91.65 gain 6 116 -90.16 gain 116 6 -91.38 gain 6 117 -87.01 gain 117 6 -85.37 gain 6 118 -88.25 gain 118 6 -88.23 gain 6 119 -88.07 gain 119 6 -93.11 gain 6 120 -96.05 gain 120 6 -98.47 gain 6 121 -89.97 gain 121 6 -93.41 gain 6 122 -96.25 gain 122 6 -99.44 gain 6 123 -87.89 gain 123 6 -91.42 gain 6 124 -87.96 gain 124 6 -89.48 gain 6 125 -94.47 gain 125 6 -99.33 gain 6 126 -85.50 gain 126 6 -87.01 gain 6 127 -94.52 gain 127 6 -95.65 gain 6 128 -87.04 gain 128 6 -90.77 gain 6 129 -88.79 gain 129 6 -89.73 gain 6 130 -89.70 gain 130 6 -91.93 gain 6 131 -92.81 gain 131 6 -94.82 gain 6 132 -100.42 gain 132 6 -98.44 gain 6 133 -94.28 gain 133 6 -97.47 gain 6 134 -83.37 gain 134 6 -83.42 gain 6 135 -96.58 gain 135 6 -98.94 gain 6 136 -88.67 gain 136 6 -91.47 gain 6 137 -97.06 gain 137 6 -102.77 gain 6 138 -88.30 gain 138 6 -87.54 gain 6 139 -90.09 gain 139 6 -92.59 gain 6 140 -93.80 gain 140 6 -97.13 gain 6 141 -92.22 gain 141 6 -87.53 gain 6 142 -91.18 gain 142 6 -93.23 gain 6 143 -90.64 gain 143 6 -95.42 gain 6 144 -92.08 gain 144 6 -95.23 gain 6 145 -96.05 gain 145 6 -102.59 gain 6 146 -97.59 gain 146 6 -100.11 gain 6 147 -95.99 gain 147 6 -95.63 gain 6 148 -90.78 gain 148 6 -88.74 gain 6 149 -88.08 gain 149 6 -89.70 gain 6 150 -106.79 gain 150 6 -109.25 gain 6 151 -89.86 gain 151 6 -91.26 gain 6 152 -89.66 gain 152 6 -90.88 gain 6 153 -92.34 gain 153 6 -92.77 gain 6 154 -89.29 gain 154 6 -91.62 gain 6 155 -93.73 gain 155 6 -94.63 gain 6 156 -93.40 gain 156 6 -93.54 gain 6 157 -97.80 gain 157 6 -100.42 gain 6 158 -91.64 gain 158 6 -93.76 gain 6 159 -92.69 gain 159 6 -97.19 gain 6 160 -96.29 gain 160 6 -97.95 gain 6 161 -91.58 gain 161 6 -95.67 gain 6 162 -91.88 gain 162 6 -95.69 gain 6 163 -95.67 gain 163 6 -101.39 gain 6 164 -101.77 gain 164 6 -106.86 gain 6 165 -92.46 gain 165 6 -94.61 gain 6 166 -96.68 gain 166 6 -98.58 gain 6 167 -91.73 gain 167 6 -94.35 gain 6 168 -89.97 gain 168 6 -91.48 gain 6 169 -94.62 gain 169 6 -97.25 gain 6 170 -99.21 gain 170 6 -101.08 gain 6 171 -82.75 gain 171 6 -85.69 gain 6 172 -92.03 gain 172 6 -93.16 gain 6 173 -98.59 gain 173 6 -104.37 gain 6 174 -91.69 gain 174 6 -93.52 gain 6 175 -89.50 gain 175 6 -92.46 gain 6 176 -94.80 gain 176 6 -96.73 gain 6 177 -98.64 gain 177 6 -103.58 gain 6 178 -95.47 gain 178 6 -93.85 gain 6 179 -96.91 gain 179 6 -94.70 gain 6 180 -98.17 gain 180 6 -105.42 gain 6 181 -92.59 gain 181 6 -93.86 gain 6 182 -97.82 gain 182 6 -100.17 gain 6 183 -94.56 gain 183 6 -97.19 gain 6 184 -100.29 gain 184 6 -105.66 gain 6 185 -97.52 gain 185 6 -106.76 gain 6 186 -101.02 gain 186 6 -105.84 gain 6 187 -92.72 gain 187 6 -95.27 gain 6 188 -94.07 gain 188 6 -99.03 gain 6 189 -97.80 gain 189 6 -97.49 gain 6 190 -101.35 gain 190 6 -104.95 gain 6 191 -101.62 gain 191 6 -103.93 gain 6 192 -103.00 gain 192 6 -104.01 gain 6 193 -104.51 gain 193 6 -104.50 gain 6 194 -95.10 gain 194 6 -95.87 gain 6 195 -99.05 gain 195 6 -98.37 gain 6 196 -96.04 gain 196 6 -99.68 gain 6 197 -94.80 gain 197 6 -93.57 gain 6 198 -99.14 gain 198 6 -102.42 gain 6 199 -94.17 gain 199 6 -97.56 gain 6 200 -98.45 gain 200 6 -103.17 gain 6 201 -98.96 gain 201 6 -103.59 gain 6 202 -87.62 gain 202 6 -91.39 gain 6 203 -95.93 gain 203 6 -98.81 gain 6 204 -96.46 gain 204 6 -95.98 gain 6 205 -94.64 gain 205 6 -97.90 gain 6 206 -89.58 gain 206 6 -93.95 gain 6 207 -102.49 gain 207 6 -106.29 gain 6 208 -94.28 gain 208 6 -100.67 gain 6 209 -99.24 gain 209 6 -105.21 gain 6 210 -97.84 gain 210 6 -103.98 gain 6 211 -92.65 gain 211 6 -94.02 gain 6 212 -98.41 gain 212 6 -102.80 gain 6 213 -106.39 gain 213 6 -110.10 gain 6 214 -95.04 gain 214 6 -104.14 gain 6 215 -98.05 gain 215 6 -102.55 gain 6 216 -96.47 gain 216 6 -104.88 gain 6 217 -95.10 gain 217 6 -103.77 gain 6 218 -83.58 gain 218 6 -85.06 gain 6 219 -102.00 gain 219 6 -103.96 gain 6 220 -100.58 gain 220 6 -98.63 gain 6 221 -100.77 gain 221 6 -104.50 gain 6 222 -95.62 gain 222 6 -95.16 gain 6 223 -98.14 gain 223 6 -100.91 gain 6 224 -101.04 gain 224 6 -104.28 gain 7 8 -66.01 gain 8 7 -67.86 gain 7 9 -75.45 gain 9 7 -81.71 gain 7 10 -79.81 gain 10 7 -84.46 gain 7 11 -81.18 gain 11 7 -90.02 gain 7 12 -82.26 gain 12 7 -82.21 gain 7 13 -80.82 gain 13 7 -84.16 gain 7 14 -91.71 gain 14 7 -91.28 gain 7 15 -88.94 gain 15 7 -91.28 gain 7 16 -86.26 gain 16 7 -90.73 gain 7 17 -83.32 gain 17 7 -85.68 gain 7 18 -69.79 gain 18 7 -73.24 gain 7 19 -75.69 gain 19 7 -79.87 gain 7 20 -75.90 gain 20 7 -81.29 gain 7 21 -59.29 gain 21 7 -63.79 gain 7 22 -63.38 gain 22 7 -66.34 gain 7 23 -60.53 gain 23 7 -60.67 gain 7 24 -77.16 gain 24 7 -78.91 gain 7 25 -79.99 gain 25 7 -84.42 gain 7 26 -84.12 gain 26 7 -89.98 gain 7 27 -80.48 gain 27 7 -83.95 gain 7 28 -75.60 gain 28 7 -74.40 gain 7 29 -95.10 gain 29 7 -95.44 gain 7 30 -89.32 gain 30 7 -94.67 gain 7 31 -97.48 gain 31 7 -99.39 gain 7 32 -81.40 gain 32 7 -80.66 gain 7 33 -80.18 gain 33 7 -80.89 gain 7 34 -90.60 gain 34 7 -91.94 gain 7 35 -80.02 gain 35 7 -82.31 gain 7 36 -77.10 gain 36 7 -79.54 gain 7 37 -73.73 gain 37 7 -78.71 gain 7 38 -76.04 gain 38 7 -78.55 gain 7 39 -83.28 gain 39 7 -90.11 gain 7 40 -87.23 gain 40 7 -89.04 gain 7 41 -85.26 gain 41 7 -82.41 gain 7 42 -80.32 gain 42 7 -84.72 gain 7 43 -88.32 gain 43 7 -90.32 gain 7 44 -88.27 gain 44 7 -93.85 gain 7 45 -91.34 gain 45 7 -96.91 gain 7 46 -88.13 gain 46 7 -90.17 gain 7 47 -81.86 gain 47 7 -81.60 gain 7 48 -82.61 gain 48 7 -81.92 gain 7 49 -81.90 gain 49 7 -85.27 gain 7 50 -78.55 gain 50 7 -78.78 gain 7 51 -76.00 gain 51 7 -79.92 gain 7 52 -77.72 gain 52 7 -78.88 gain 7 53 -71.25 gain 53 7 -72.97 gain 7 54 -83.97 gain 54 7 -85.10 gain 7 55 -78.54 gain 55 7 -76.58 gain 7 56 -84.01 gain 56 7 -87.10 gain 7 57 -83.14 gain 57 7 -85.31 gain 7 58 -94.57 gain 58 7 -93.43 gain 7 59 -82.31 gain 59 7 -80.43 gain 7 60 -95.30 gain 60 7 -102.70 gain 7 61 -87.50 gain 61 7 -86.81 gain 7 62 -81.91 gain 62 7 -78.72 gain 7 63 -85.70 gain 63 7 -86.48 gain 7 64 -81.62 gain 64 7 -86.62 gain 7 65 -82.35 gain 65 7 -82.90 gain 7 66 -77.49 gain 66 7 -77.02 gain 7 67 -76.30 gain 67 7 -77.06 gain 7 68 -79.07 gain 68 7 -82.42 gain 7 69 -82.61 gain 69 7 -83.17 gain 7 70 -82.05 gain 70 7 -81.09 gain 7 71 -77.62 gain 71 7 -80.22 gain 7 72 -84.17 gain 72 7 -84.33 gain 7 73 -83.24 gain 73 7 -84.77 gain 7 74 -88.48 gain 74 7 -86.12 gain 7 75 -89.99 gain 75 7 -93.52 gain 7 76 -89.18 gain 76 7 -92.83 gain 7 77 -81.35 gain 77 7 -81.01 gain 7 78 -82.32 gain 78 7 -86.48 gain 7 79 -89.19 gain 79 7 -92.97 gain 7 80 -82.67 gain 80 7 -84.24 gain 7 81 -80.10 gain 81 7 -82.57 gain 7 82 -86.62 gain 82 7 -90.08 gain 7 83 -91.60 gain 83 7 -92.33 gain 7 84 -77.17 gain 84 7 -75.09 gain 7 85 -87.65 gain 85 7 -90.99 gain 7 86 -92.69 gain 86 7 -97.67 gain 7 87 -89.58 gain 87 7 -91.85 gain 7 88 -88.62 gain 88 7 -90.53 gain 7 89 -84.87 gain 89 7 -88.93 gain 7 90 -87.90 gain 90 7 -91.30 gain 7 91 -90.49 gain 91 7 -94.95 gain 7 92 -94.24 gain 92 7 -99.62 gain 7 93 -88.29 gain 93 7 -91.03 gain 7 94 -75.86 gain 94 7 -77.17 gain 7 95 -92.99 gain 95 7 -93.53 gain 7 96 -87.29 gain 96 7 -94.81 gain 7 97 -84.07 gain 97 7 -84.41 gain 7 98 -91.31 gain 98 7 -92.12 gain 7 99 -96.04 gain 99 7 -95.99 gain 7 100 -84.41 gain 100 7 -84.27 gain 7 101 -87.55 gain 101 7 -91.05 gain 7 102 -79.81 gain 102 7 -83.27 gain 7 103 -94.31 gain 103 7 -98.94 gain 7 104 -90.45 gain 104 7 -97.56 gain 7 105 -95.46 gain 105 7 -97.10 gain 7 106 -98.31 gain 106 7 -97.27 gain 7 107 -89.61 gain 107 7 -88.48 gain 7 108 -85.45 gain 108 7 -83.94 gain 7 109 -95.86 gain 109 7 -97.79 gain 7 110 -89.53 gain 110 7 -97.83 gain 7 111 -90.26 gain 111 7 -88.52 gain 7 112 -86.68 gain 112 7 -88.41 gain 7 113 -87.02 gain 113 7 -87.88 gain 7 114 -94.72 gain 114 7 -92.75 gain 7 115 -85.02 gain 115 7 -83.70 gain 7 116 -90.42 gain 116 7 -91.53 gain 7 117 -97.25 gain 117 7 -95.51 gain 7 118 -91.47 gain 118 7 -91.35 gain 7 119 -101.34 gain 119 7 -106.28 gain 7 120 -93.16 gain 120 7 -95.48 gain 7 121 -90.48 gain 121 7 -93.82 gain 7 122 -98.08 gain 122 7 -101.17 gain 7 123 -93.58 gain 123 7 -97.01 gain 7 124 -89.81 gain 124 7 -91.24 gain 7 125 -92.17 gain 125 7 -96.93 gain 7 126 -88.41 gain 126 7 -89.82 gain 7 127 -95.02 gain 127 7 -96.05 gain 7 128 -89.76 gain 128 7 -93.39 gain 7 129 -88.62 gain 129 7 -89.46 gain 7 130 -96.46 gain 130 7 -98.59 gain 7 131 -92.73 gain 131 7 -94.63 gain 7 132 -92.53 gain 132 7 -90.44 gain 7 133 -89.86 gain 133 7 -92.95 gain 7 134 -96.54 gain 134 7 -96.50 gain 7 135 -101.93 gain 135 7 -104.19 gain 7 136 -96.04 gain 136 7 -98.73 gain 7 137 -91.21 gain 137 7 -96.82 gain 7 138 -88.46 gain 138 7 -87.60 gain 7 139 -98.29 gain 139 7 -100.69 gain 7 140 -94.54 gain 140 7 -97.77 gain 7 141 -94.33 gain 141 7 -89.54 gain 7 142 -97.95 gain 142 7 -99.90 gain 7 143 -88.96 gain 143 7 -93.65 gain 7 144 -88.55 gain 144 7 -91.60 gain 7 145 -96.01 gain 145 7 -102.45 gain 7 146 -85.09 gain 146 7 -87.52 gain 7 147 -100.43 gain 147 7 -99.96 gain 7 148 -103.92 gain 148 7 -101.79 gain 7 149 -96.73 gain 149 7 -98.25 gain 7 150 -88.46 gain 150 7 -90.82 gain 7 151 -90.17 gain 151 7 -91.47 gain 7 152 -89.76 gain 152 7 -90.87 gain 7 153 -91.27 gain 153 7 -91.60 gain 7 154 -86.31 gain 154 7 -88.54 gain 7 155 -98.56 gain 155 7 -99.36 gain 7 156 -92.64 gain 156 7 -92.67 gain 7 157 -94.98 gain 157 7 -97.49 gain 7 158 -95.24 gain 158 7 -97.25 gain 7 159 -89.73 gain 159 7 -94.13 gain 7 160 -90.87 gain 160 7 -92.42 gain 7 161 -93.02 gain 161 7 -97.02 gain 7 162 -95.29 gain 162 7 -98.99 gain 7 163 -92.54 gain 163 7 -98.16 gain 7 164 -91.22 gain 164 7 -96.20 gain 7 165 -100.19 gain 165 7 -102.23 gain 7 166 -95.93 gain 166 7 -97.73 gain 7 167 -94.83 gain 167 7 -97.34 gain 7 168 -97.79 gain 168 7 -99.20 gain 7 169 -97.38 gain 169 7 -99.91 gain 7 170 -93.64 gain 170 7 -95.40 gain 7 171 -96.71 gain 171 7 -99.55 gain 7 172 -91.71 gain 172 7 -92.74 gain 7 173 -91.09 gain 173 7 -96.77 gain 7 174 -90.96 gain 174 7 -92.69 gain 7 175 -98.01 gain 175 7 -100.87 gain 7 176 -97.52 gain 176 7 -99.35 gain 7 177 -95.69 gain 177 7 -100.52 gain 7 178 -92.16 gain 178 7 -90.43 gain 7 179 -92.58 gain 179 7 -90.28 gain 7 180 -98.39 gain 180 7 -105.54 gain 7 181 -91.91 gain 181 7 -93.07 gain 7 182 -101.67 gain 182 7 -103.92 gain 7 183 -89.56 gain 183 7 -92.08 gain 7 184 -100.50 gain 184 7 -105.77 gain 7 185 -97.47 gain 185 7 -106.61 gain 7 186 -91.74 gain 186 7 -96.46 gain 7 187 -97.59 gain 187 7 -100.04 gain 7 188 -102.37 gain 188 7 -107.23 gain 7 189 -96.39 gain 189 7 -95.98 gain 7 190 -93.20 gain 190 7 -96.70 gain 7 191 -91.44 gain 191 7 -93.65 gain 7 192 -91.73 gain 192 7 -92.63 gain 7 193 -91.07 gain 193 7 -90.96 gain 7 194 -98.86 gain 194 7 -99.54 gain 7 195 -90.88 gain 195 7 -90.10 gain 7 196 -96.48 gain 196 7 -100.01 gain 7 197 -99.44 gain 197 7 -98.11 gain 7 198 -98.31 gain 198 7 -101.48 gain 7 199 -96.92 gain 199 7 -100.21 gain 7 200 -94.56 gain 200 7 -99.18 gain 7 201 -101.66 gain 201 7 -106.19 gain 7 202 -91.21 gain 202 7 -94.88 gain 7 203 -96.56 gain 203 7 -99.34 gain 7 204 -100.25 gain 204 7 -99.67 gain 7 205 -92.18 gain 205 7 -95.35 gain 7 206 -97.28 gain 206 7 -101.55 gain 7 207 -91.89 gain 207 7 -95.58 gain 7 208 -93.16 gain 208 7 -99.45 gain 7 209 -100.08 gain 209 7 -105.94 gain 7 210 -92.63 gain 210 7 -98.67 gain 7 211 -96.59 gain 211 7 -97.86 gain 7 212 -94.76 gain 212 7 -99.04 gain 7 213 -94.03 gain 213 7 -97.64 gain 7 214 -102.76 gain 214 7 -111.76 gain 7 215 -98.45 gain 215 7 -102.85 gain 7 216 -100.12 gain 216 7 -108.42 gain 7 217 -98.09 gain 217 7 -106.66 gain 7 218 -98.80 gain 218 7 -100.18 gain 7 219 -99.51 gain 219 7 -101.37 gain 7 220 -100.33 gain 220 7 -98.27 gain 7 221 -94.30 gain 221 7 -97.92 gain 7 222 -96.57 gain 222 7 -96.00 gain 7 223 -94.99 gain 223 7 -97.66 gain 7 224 -101.39 gain 224 7 -104.53 gain 8 9 -67.95 gain 9 8 -72.35 gain 8 10 -76.49 gain 10 8 -79.30 gain 8 11 -75.97 gain 11 8 -82.96 gain 8 12 -89.25 gain 12 8 -87.36 gain 8 13 -89.97 gain 13 8 -91.46 gain 8 14 -86.69 gain 14 8 -84.42 gain 8 15 -92.27 gain 15 8 -92.77 gain 8 16 -93.69 gain 16 8 -96.31 gain 8 17 -81.76 gain 17 8 -82.27 gain 8 18 -86.69 gain 18 8 -88.29 gain 8 19 -87.33 gain 19 8 -89.67 gain 8 20 -84.90 gain 20 8 -88.44 gain 8 21 -74.83 gain 21 8 -77.48 gain 8 22 -67.83 gain 22 8 -68.94 gain 8 23 -71.81 gain 23 8 -70.10 gain 8 24 -65.55 gain 24 8 -65.45 gain 8 25 -73.18 gain 25 8 -75.76 gain 8 26 -78.32 gain 26 8 -82.33 gain 8 27 -82.13 gain 27 8 -83.75 gain 8 28 -89.93 gain 28 8 -86.88 gain 8 29 -83.14 gain 29 8 -81.63 gain 8 30 -90.02 gain 30 8 -93.52 gain 8 31 -80.81 gain 31 8 -80.87 gain 8 32 -100.95 gain 32 8 -98.36 gain 8 33 -84.07 gain 33 8 -82.93 gain 8 34 -76.65 gain 34 8 -76.14 gain 8 35 -84.38 gain 35 8 -84.82 gain 8 36 -71.81 gain 36 8 -72.40 gain 8 37 -80.35 gain 37 8 -83.48 gain 8 38 -69.26 gain 38 8 -69.92 gain 8 39 -77.91 gain 39 8 -82.90 gain 8 40 -80.35 gain 40 8 -80.31 gain 8 41 -80.91 gain 41 8 -76.22 gain 8 42 -87.44 gain 42 8 -90.00 gain 8 43 -89.60 gain 43 8 -89.75 gain 8 44 -88.73 gain 44 8 -92.47 gain 8 45 -96.58 gain 45 8 -100.30 gain 8 46 -91.18 gain 46 8 -91.37 gain 8 47 -89.35 gain 47 8 -87.24 gain 8 48 -85.92 gain 48 8 -83.38 gain 8 49 -83.49 gain 49 8 -85.02 gain 8 50 -76.56 gain 50 8 -74.94 gain 8 51 -74.42 gain 51 8 -76.49 gain 8 52 -77.66 gain 52 8 -76.97 gain 8 53 -82.68 gain 53 8 -82.55 gain 8 54 -76.01 gain 54 8 -75.28 gain 8 55 -83.82 gain 55 8 -80.01 gain 8 56 -89.65 gain 56 8 -90.89 gain 8 57 -89.78 gain 57 8 -90.10 gain 8 58 -88.07 gain 58 8 -85.08 gain 8 59 -87.86 gain 59 8 -84.13 gain 8 60 -96.97 gain 60 8 -102.52 gain 8 61 -92.98 gain 61 8 -90.44 gain 8 62 -90.12 gain 62 8 -85.08 gain 8 63 -91.40 gain 63 8 -90.33 gain 8 64 -83.99 gain 64 8 -87.14 gain 8 65 -80.32 gain 65 8 -79.03 gain 8 66 -81.70 gain 66 8 -79.38 gain 8 67 -76.70 gain 67 8 -75.62 gain 8 68 -77.93 gain 68 8 -79.44 gain 8 69 -82.34 gain 69 8 -81.06 gain 8 70 -78.90 gain 70 8 -76.08 gain 8 71 -93.37 gain 71 8 -94.12 gain 8 72 -88.14 gain 72 8 -86.45 gain 8 73 -90.04 gain 73 8 -89.73 gain 8 74 -89.66 gain 74 8 -85.45 gain 8 75 -93.75 gain 75 8 -95.44 gain 8 76 -100.53 gain 76 8 -102.34 gain 8 77 -95.98 gain 77 8 -93.78 gain 8 78 -93.73 gain 78 8 -96.03 gain 8 79 -92.36 gain 79 8 -94.29 gain 8 80 -87.44 gain 80 8 -87.16 gain 8 81 -79.53 gain 81 8 -80.16 gain 8 82 -81.01 gain 82 8 -82.61 gain 8 83 -87.22 gain 83 8 -86.10 gain 8 84 -86.71 gain 84 8 -82.78 gain 8 85 -83.24 gain 85 8 -84.73 gain 8 86 -85.93 gain 86 8 -89.07 gain 8 87 -87.67 gain 87 8 -88.09 gain 8 88 -82.50 gain 88 8 -82.56 gain 8 89 -95.49 gain 89 8 -97.70 gain 8 90 -95.59 gain 90 8 -97.13 gain 8 91 -91.57 gain 91 8 -94.18 gain 8 92 -92.46 gain 92 8 -96.00 gain 8 93 -96.18 gain 93 8 -97.07 gain 8 94 -86.22 gain 94 8 -85.68 gain 8 95 -88.43 gain 95 8 -87.13 gain 8 96 -93.10 gain 96 8 -98.77 gain 8 97 -90.35 gain 97 8 -88.85 gain 8 98 -85.65 gain 98 8 -84.61 gain 8 99 -88.71 gain 99 8 -86.81 gain 8 100 -88.38 gain 100 8 -86.40 gain 8 101 -90.34 gain 101 8 -91.98 gain 8 102 -90.80 gain 102 8 -92.41 gain 8 103 -92.91 gain 103 8 -95.69 gain 8 104 -94.65 gain 104 8 -99.91 gain 8 105 -100.04 gain 105 8 -99.83 gain 8 106 -101.53 gain 106 8 -98.65 gain 8 107 -93.83 gain 107 8 -90.85 gain 8 108 -93.83 gain 108 8 -90.47 gain 8 109 -95.12 gain 109 8 -95.21 gain 8 110 -88.48 gain 110 8 -94.93 gain 8 111 -92.22 gain 111 8 -88.64 gain 8 112 -89.43 gain 112 8 -89.31 gain 8 113 -91.92 gain 113 8 -90.93 gain 8 114 -95.79 gain 114 8 -91.96 gain 8 115 -89.81 gain 115 8 -86.64 gain 8 116 -95.22 gain 116 8 -94.48 gain 8 117 -83.30 gain 117 8 -79.70 gain 8 118 -94.74 gain 118 8 -92.77 gain 8 119 -89.62 gain 119 8 -92.71 gain 8 120 -92.29 gain 120 8 -92.76 gain 8 121 -95.62 gain 121 8 -97.11 gain 8 122 -101.43 gain 122 8 -102.68 gain 8 123 -95.31 gain 123 8 -96.90 gain 8 124 -89.14 gain 124 8 -88.71 gain 8 125 -86.50 gain 125 8 -89.41 gain 8 126 -99.24 gain 126 8 -98.80 gain 8 127 -100.88 gain 127 8 -100.06 gain 8 128 -93.21 gain 128 8 -94.99 gain 8 129 -89.92 gain 129 8 -88.91 gain 8 130 -93.00 gain 130 8 -93.28 gain 8 131 -91.30 gain 131 8 -91.36 gain 8 132 -83.59 gain 132 8 -79.66 gain 8 133 -100.41 gain 133 8 -101.65 gain 8 134 -96.62 gain 134 8 -94.73 gain 8 135 -96.80 gain 135 8 -97.21 gain 8 136 -91.10 gain 136 8 -91.95 gain 8 137 -92.60 gain 137 8 -96.37 gain 8 138 -100.55 gain 138 8 -97.84 gain 8 139 -101.95 gain 139 8 -102.50 gain 8 140 -92.78 gain 140 8 -94.16 gain 8 141 -91.73 gain 141 8 -85.08 gain 8 142 -88.75 gain 142 8 -88.85 gain 8 143 -93.82 gain 143 8 -96.66 gain 8 144 -90.66 gain 144 8 -91.86 gain 8 145 -94.18 gain 145 8 -98.77 gain 8 146 -88.83 gain 146 8 -89.41 gain 8 147 -98.11 gain 147 8 -95.80 gain 8 148 -90.56 gain 148 8 -86.57 gain 8 149 -95.81 gain 149 8 -95.48 gain 8 150 -95.05 gain 150 8 -95.55 gain 8 151 -96.15 gain 151 8 -95.60 gain 8 152 -97.86 gain 152 8 -97.13 gain 8 153 -104.90 gain 153 8 -103.38 gain 8 154 -90.57 gain 154 8 -90.95 gain 8 155 -94.99 gain 155 8 -93.94 gain 8 156 -93.48 gain 156 8 -91.67 gain 8 157 -99.40 gain 157 8 -100.07 gain 8 158 -99.99 gain 158 8 -100.16 gain 8 159 -100.79 gain 159 8 -103.34 gain 8 160 -95.17 gain 160 8 -94.87 gain 8 161 -107.96 gain 161 8 -110.11 gain 8 162 -90.81 gain 162 8 -92.66 gain 8 163 -98.51 gain 163 8 -102.28 gain 8 164 -99.31 gain 164 8 -102.45 gain 8 165 -99.50 gain 165 8 -99.70 gain 8 166 -101.33 gain 166 8 -101.28 gain 8 167 -98.37 gain 167 8 -99.04 gain 8 168 -102.91 gain 168 8 -102.48 gain 8 169 -95.58 gain 169 8 -96.26 gain 8 170 -99.06 gain 170 8 -98.98 gain 8 171 -94.43 gain 171 8 -95.42 gain 8 172 -90.87 gain 172 8 -90.06 gain 8 173 -100.15 gain 173 8 -103.98 gain 8 174 -99.28 gain 174 8 -99.16 gain 8 175 -98.21 gain 175 8 -99.22 gain 8 176 -95.91 gain 176 8 -95.89 gain 8 177 -90.43 gain 177 8 -93.41 gain 8 178 -102.88 gain 178 8 -99.31 gain 8 179 -95.11 gain 179 8 -90.96 gain 8 180 -102.93 gain 180 8 -108.22 gain 8 181 -96.15 gain 181 8 -95.47 gain 8 182 -98.78 gain 182 8 -99.19 gain 8 183 -104.35 gain 183 8 -105.02 gain 8 184 -99.97 gain 184 8 -103.39 gain 8 185 -98.47 gain 185 8 -105.76 gain 8 186 -98.12 gain 186 8 -100.99 gain 8 187 -97.62 gain 187 8 -98.22 gain 8 188 -98.12 gain 188 8 -101.13 gain 8 189 -98.72 gain 189 8 -96.46 gain 8 190 -104.13 gain 190 8 -105.78 gain 8 191 -97.36 gain 191 8 -97.72 gain 8 192 -100.96 gain 192 8 -100.02 gain 8 193 -103.20 gain 193 8 -101.24 gain 8 194 -101.80 gain 194 8 -100.63 gain 8 195 -96.85 gain 195 8 -94.22 gain 8 196 -92.90 gain 196 8 -94.58 gain 8 197 -97.65 gain 197 8 -94.47 gain 8 198 -97.58 gain 198 8 -98.91 gain 8 199 -94.35 gain 199 8 -95.78 gain 8 200 -105.14 gain 200 8 -107.91 gain 8 201 -96.24 gain 201 8 -98.93 gain 8 202 -102.32 gain 202 8 -104.14 gain 8 203 -93.56 gain 203 8 -94.49 gain 8 204 -100.49 gain 204 8 -98.06 gain 8 205 -99.78 gain 205 8 -101.10 gain 8 206 -89.03 gain 206 8 -91.45 gain 8 207 -101.36 gain 207 8 -103.20 gain 8 208 -98.55 gain 208 8 -102.99 gain 8 209 -100.27 gain 209 8 -104.29 gain 8 210 -108.91 gain 210 8 -113.10 gain 8 211 -104.83 gain 211 8 -104.25 gain 8 212 -106.41 gain 212 8 -108.84 gain 8 213 -101.18 gain 213 8 -102.94 gain 8 214 -99.35 gain 214 8 -106.49 gain 8 215 -101.68 gain 215 8 -104.23 gain 8 216 -94.87 gain 216 8 -101.33 gain 8 217 -98.42 gain 217 8 -105.15 gain 8 218 -94.90 gain 218 8 -94.42 gain 8 219 -105.68 gain 219 8 -105.69 gain 8 220 -97.39 gain 220 8 -93.49 gain 8 221 -95.10 gain 221 8 -96.88 gain 8 222 -97.36 gain 222 8 -94.95 gain 8 223 -99.67 gain 223 8 -100.49 gain 8 224 -89.24 gain 224 8 -90.53 gain 9 10 -68.43 gain 10 9 -66.82 gain 9 11 -85.12 gain 11 9 -87.70 gain 9 12 -79.23 gain 12 9 -72.93 gain 9 13 -88.47 gain 13 9 -85.55 gain 9 14 -93.00 gain 14 9 -86.32 gain 9 15 -99.73 gain 15 9 -95.81 gain 9 16 -107.28 gain 16 9 -105.50 gain 9 17 -90.87 gain 17 9 -86.98 gain 9 18 -89.83 gain 18 9 -87.02 gain 9 19 -95.30 gain 19 9 -93.24 gain 9 20 -88.79 gain 20 9 -87.93 gain 9 21 -79.27 gain 21 9 -77.52 gain 9 22 -74.42 gain 22 9 -71.13 gain 9 23 -72.24 gain 23 9 -66.12 gain 9 24 -71.01 gain 24 9 -66.51 gain 9 25 -65.04 gain 25 9 -63.21 gain 9 26 -83.59 gain 26 9 -83.20 gain 9 27 -87.43 gain 27 9 -84.64 gain 9 28 -84.29 gain 28 9 -76.83 gain 9 29 -90.30 gain 29 9 -84.39 gain 9 30 -90.38 gain 30 9 -89.47 gain 9 31 -92.27 gain 31 9 -87.93 gain 9 32 -96.84 gain 32 9 -89.85 gain 9 33 -95.01 gain 33 9 -89.47 gain 9 34 -91.08 gain 34 9 -86.17 gain 9 35 -88.00 gain 35 9 -84.04 gain 9 36 -77.88 gain 36 9 -74.06 gain 9 37 -78.59 gain 37 9 -77.31 gain 9 38 -76.14 gain 38 9 -72.39 gain 9 39 -76.79 gain 39 9 -77.37 gain 9 40 -82.40 gain 40 9 -77.95 gain 9 41 -83.54 gain 41 9 -74.44 gain 9 42 -85.02 gain 42 9 -83.16 gain 9 43 -91.24 gain 43 9 -86.98 gain 9 44 -90.57 gain 44 9 -89.90 gain 9 45 -94.34 gain 45 9 -93.66 gain 9 46 -100.14 gain 46 9 -95.92 gain 9 47 -100.38 gain 47 9 -93.86 gain 9 48 -90.91 gain 48 9 -83.97 gain 9 49 -89.12 gain 49 9 -86.24 gain 9 50 -87.77 gain 50 9 -81.75 gain 9 51 -80.95 gain 51 9 -78.62 gain 9 52 -93.19 gain 52 9 -88.10 gain 9 53 -79.23 gain 53 9 -74.69 gain 9 54 -83.77 gain 54 9 -78.64 gain 9 55 -82.72 gain 55 9 -74.51 gain 9 56 -87.99 gain 56 9 -84.82 gain 9 57 -84.17 gain 57 9 -80.09 gain 9 58 -90.96 gain 58 9 -83.57 gain 9 59 -90.68 gain 59 9 -82.54 gain 9 60 -92.11 gain 60 9 -93.26 gain 9 61 -98.01 gain 61 9 -91.05 gain 9 62 -96.59 gain 62 9 -87.15 gain 9 63 -100.11 gain 63 9 -94.63 gain 9 64 -92.91 gain 64 9 -91.66 gain 9 65 -86.68 gain 65 9 -80.97 gain 9 66 -95.62 gain 66 9 -88.90 gain 9 67 -92.05 gain 67 9 -86.56 gain 9 68 -83.06 gain 68 9 -80.15 gain 9 69 -88.88 gain 69 9 -83.19 gain 9 70 -85.64 gain 70 9 -78.42 gain 9 71 -85.83 gain 71 9 -82.18 gain 9 72 -95.21 gain 72 9 -89.11 gain 9 73 -91.41 gain 73 9 -86.69 gain 9 74 -92.09 gain 74 9 -83.48 gain 9 75 -103.38 gain 75 9 -100.66 gain 9 76 -89.56 gain 76 9 -86.96 gain 9 77 -98.60 gain 77 9 -92.00 gain 9 78 -99.29 gain 78 9 -97.19 gain 9 79 -104.73 gain 79 9 -102.25 gain 9 80 -100.48 gain 80 9 -95.79 gain 9 81 -88.14 gain 81 9 -84.36 gain 9 82 -87.57 gain 82 9 -84.77 gain 9 83 -88.41 gain 83 9 -82.88 gain 9 84 -87.79 gain 84 9 -79.44 gain 9 85 -92.22 gain 85 9 -89.31 gain 9 86 -86.89 gain 86 9 -85.61 gain 9 87 -94.48 gain 87 9 -90.49 gain 9 88 -93.04 gain 88 9 -88.70 gain 9 89 -101.08 gain 89 9 -98.88 gain 9 90 -97.86 gain 90 9 -95.00 gain 9 91 -100.38 gain 91 9 -98.59 gain 9 92 -103.01 gain 92 9 -102.14 gain 9 93 -96.28 gain 93 9 -92.76 gain 9 94 -95.82 gain 94 9 -90.87 gain 9 95 -93.05 gain 95 9 -87.34 gain 9 96 -90.81 gain 96 9 -92.07 gain 9 97 -95.93 gain 97 9 -90.02 gain 9 98 -97.06 gain 98 9 -91.62 gain 9 99 -92.21 gain 99 9 -85.90 gain 9 100 -91.64 gain 100 9 -85.25 gain 9 101 -92.21 gain 101 9 -89.45 gain 9 102 -95.06 gain 102 9 -92.26 gain 9 103 -87.76 gain 103 9 -86.13 gain 9 104 -97.65 gain 104 9 -98.50 gain 9 105 -100.45 gain 105 9 -95.83 gain 9 106 -101.48 gain 106 9 -94.19 gain 9 107 -97.04 gain 107 9 -89.65 gain 9 108 -98.19 gain 108 9 -90.42 gain 9 109 -104.60 gain 109 9 -100.28 gain 9 110 -96.69 gain 110 9 -98.73 gain 9 111 -93.22 gain 111 9 -85.23 gain 9 112 -95.57 gain 112 9 -91.05 gain 9 113 -93.55 gain 113 9 -88.16 gain 9 114 -99.69 gain 114 9 -91.46 gain 9 115 -98.81 gain 115 9 -91.24 gain 9 116 -94.63 gain 116 9 -89.49 gain 9 117 -87.80 gain 117 9 -79.80 gain 9 118 -99.12 gain 118 9 -92.74 gain 9 119 -102.25 gain 119 9 -100.93 gain 9 120 -94.30 gain 120 9 -90.37 gain 9 121 -93.34 gain 121 9 -90.43 gain 9 122 -95.92 gain 122 9 -92.76 gain 9 123 -102.25 gain 123 9 -99.42 gain 9 124 -97.79 gain 124 9 -92.96 gain 9 125 -93.52 gain 125 9 -92.02 gain 9 126 -104.41 gain 126 9 -99.56 gain 9 127 -99.34 gain 127 9 -94.12 gain 9 128 -91.48 gain 128 9 -88.86 gain 9 129 -97.03 gain 129 9 -91.62 gain 9 130 -98.17 gain 130 9 -94.05 gain 9 131 -92.84 gain 131 9 -88.49 gain 9 132 -94.76 gain 132 9 -86.41 gain 9 133 -98.67 gain 133 9 -95.51 gain 9 134 -92.24 gain 134 9 -85.94 gain 9 135 -105.62 gain 135 9 -101.62 gain 9 136 -103.53 gain 136 9 -99.97 gain 9 137 -97.58 gain 137 9 -96.93 gain 9 138 -100.70 gain 138 9 -93.58 gain 9 139 -100.11 gain 139 9 -96.26 gain 9 140 -100.24 gain 140 9 -97.22 gain 9 141 -97.35 gain 141 9 -86.30 gain 9 142 -97.87 gain 142 9 -93.56 gain 9 143 -103.87 gain 143 9 -102.30 gain 9 144 -97.79 gain 144 9 -94.59 gain 9 145 -94.09 gain 145 9 -94.27 gain 9 146 -95.69 gain 146 9 -91.87 gain 9 147 -97.87 gain 147 9 -91.15 gain 9 148 -101.34 gain 148 9 -92.95 gain 9 149 -96.50 gain 149 9 -91.76 gain 9 150 -103.29 gain 150 9 -99.39 gain 9 151 -103.99 gain 151 9 -99.04 gain 9 152 -103.55 gain 152 9 -98.40 gain 9 153 -101.64 gain 153 9 -95.71 gain 9 154 -102.60 gain 154 9 -98.57 gain 9 155 -100.98 gain 155 9 -95.53 gain 9 156 -102.06 gain 156 9 -95.84 gain 9 157 -96.68 gain 157 9 -92.94 gain 9 158 -100.79 gain 158 9 -96.55 gain 9 159 -98.35 gain 159 9 -96.50 gain 9 160 -95.20 gain 160 9 -90.49 gain 9 161 -96.49 gain 161 9 -94.23 gain 9 162 -99.75 gain 162 9 -97.20 gain 9 163 -99.76 gain 163 9 -99.12 gain 9 164 -102.77 gain 164 9 -101.50 gain 9 165 -103.96 gain 165 9 -99.75 gain 9 166 -101.27 gain 166 9 -96.81 gain 9 167 -105.03 gain 167 9 -101.29 gain 9 168 -99.79 gain 168 9 -94.95 gain 9 169 -107.12 gain 169 9 -103.39 gain 9 170 -99.68 gain 170 9 -95.19 gain 9 171 -103.32 gain 171 9 -99.91 gain 9 172 -105.69 gain 172 9 -100.46 gain 9 173 -104.77 gain 173 9 -104.20 gain 9 174 -97.84 gain 174 9 -93.32 gain 9 175 -96.82 gain 175 9 -93.43 gain 9 176 -102.62 gain 176 9 -98.20 gain 9 177 -103.94 gain 177 9 -102.52 gain 9 178 -105.69 gain 178 9 -97.71 gain 9 179 -97.82 gain 179 9 -89.26 gain 9 180 -107.41 gain 180 9 -108.30 gain 9 181 -103.20 gain 181 9 -98.11 gain 9 182 -102.12 gain 182 9 -98.11 gain 9 183 -108.84 gain 183 9 -105.11 gain 9 184 -101.88 gain 184 9 -100.90 gain 9 185 -98.79 gain 185 9 -101.67 gain 9 186 -95.82 gain 186 9 -94.29 gain 9 187 -100.68 gain 187 9 -96.88 gain 9 188 -91.54 gain 188 9 -90.15 gain 9 189 -99.47 gain 189 9 -92.80 gain 9 190 -105.06 gain 190 9 -102.31 gain 9 191 -110.69 gain 191 9 -106.64 gain 9 192 -101.93 gain 192 9 -96.58 gain 9 193 -100.85 gain 193 9 -94.49 gain 9 194 -97.82 gain 194 9 -92.23 gain 9 195 -104.82 gain 195 9 -97.78 gain 9 196 -105.62 gain 196 9 -102.89 gain 9 197 -100.77 gain 197 9 -93.18 gain 9 198 -103.72 gain 198 9 -100.65 gain 9 199 -104.31 gain 199 9 -101.34 gain 9 200 -103.04 gain 200 9 -101.41 gain 9 201 -110.66 gain 201 9 -108.94 gain 9 202 -102.35 gain 202 9 -99.76 gain 9 203 -91.41 gain 203 9 -87.94 gain 9 204 -100.03 gain 204 9 -93.19 gain 9 205 -104.05 gain 205 9 -100.96 gain 9 206 -100.06 gain 206 9 -98.08 gain 9 207 -100.60 gain 207 9 -98.04 gain 9 208 -104.54 gain 208 9 -104.58 gain 9 209 -102.10 gain 209 9 -101.71 gain 9 210 -103.86 gain 210 9 -103.65 gain 9 211 -107.39 gain 211 9 -102.41 gain 9 212 -102.41 gain 212 9 -100.44 gain 9 213 -96.53 gain 213 9 -93.88 gain 9 214 -103.49 gain 214 9 -106.23 gain 9 215 -102.94 gain 215 9 -101.09 gain 9 216 -110.21 gain 216 9 -112.26 gain 9 217 -109.91 gain 217 9 -112.23 gain 9 218 -106.16 gain 218 9 -101.28 gain 9 219 -112.86 gain 219 9 -108.46 gain 9 220 -107.23 gain 220 9 -98.92 gain 9 221 -106.14 gain 221 9 -103.51 gain 9 222 -99.22 gain 222 9 -92.40 gain 9 223 -101.26 gain 223 9 -97.67 gain 9 224 -110.25 gain 224 9 -107.14 gain 10 11 -65.87 gain 11 10 -70.06 gain 10 12 -78.92 gain 12 10 -74.22 gain 10 13 -89.35 gain 13 10 -88.03 gain 10 14 -83.16 gain 14 10 -78.09 gain 10 15 -97.30 gain 15 10 -94.99 gain 10 16 -95.52 gain 16 10 -95.34 gain 10 17 -89.76 gain 17 10 -87.47 gain 10 18 -95.99 gain 18 10 -94.78 gain 10 19 -90.26 gain 19 10 -89.80 gain 10 20 -84.99 gain 20 10 -85.73 gain 10 21 -83.82 gain 21 10 -83.67 gain 10 22 -88.57 gain 22 10 -86.88 gain 10 23 -72.80 gain 23 10 -68.28 gain 10 24 -67.05 gain 24 10 -64.15 gain 10 25 -69.70 gain 25 10 -69.48 gain 10 26 -68.73 gain 26 10 -69.94 gain 10 27 -78.88 gain 27 10 -77.69 gain 10 28 -90.15 gain 28 10 -84.29 gain 10 29 -79.51 gain 29 10 -75.20 gain 10 30 -98.70 gain 30 10 -99.39 gain 10 31 -98.93 gain 31 10 -96.19 gain 10 32 -94.85 gain 32 10 -89.46 gain 10 33 -89.04 gain 33 10 -85.10 gain 10 34 -94.58 gain 34 10 -91.28 gain 10 35 -90.19 gain 35 10 -87.83 gain 10 36 -93.77 gain 36 10 -91.56 gain 10 37 -85.53 gain 37 10 -85.86 gain 10 38 -74.51 gain 38 10 -72.36 gain 10 39 -76.05 gain 39 10 -78.23 gain 10 40 -77.83 gain 40 10 -74.99 gain 10 41 -75.61 gain 41 10 -68.11 gain 10 42 -87.66 gain 42 10 -87.41 gain 10 43 -86.47 gain 43 10 -83.82 gain 10 44 -87.88 gain 44 10 -88.82 gain 10 45 -102.79 gain 45 10 -103.71 gain 10 46 -99.66 gain 46 10 -97.04 gain 10 47 -94.63 gain 47 10 -89.72 gain 10 48 -90.39 gain 48 10 -85.05 gain 10 49 -90.97 gain 49 10 -89.69 gain 10 50 -94.23 gain 50 10 -89.82 gain 10 51 -86.05 gain 51 10 -85.32 gain 10 52 -95.44 gain 52 10 -91.95 gain 10 53 -89.57 gain 53 10 -86.64 gain 10 54 -85.46 gain 54 10 -81.94 gain 10 55 -78.86 gain 55 10 -72.25 gain 10 56 -80.73 gain 56 10 -79.17 gain 10 57 -87.68 gain 57 10 -85.20 gain 10 58 -87.57 gain 58 10 -81.79 gain 10 59 -92.72 gain 59 10 -86.18 gain 10 60 -97.05 gain 60 10 -99.80 gain 10 61 -105.47 gain 61 10 -100.12 gain 10 62 -98.44 gain 62 10 -90.60 gain 10 63 -100.67 gain 63 10 -96.79 gain 10 64 -97.43 gain 64 10 -97.78 gain 10 65 -91.17 gain 65 10 -87.07 gain 10 66 -94.66 gain 66 10 -89.54 gain 10 67 -88.47 gain 67 10 -84.58 gain 10 68 -88.50 gain 68 10 -87.20 gain 10 69 -93.80 gain 69 10 -89.72 gain 10 70 -87.03 gain 70 10 -81.41 gain 10 71 -83.64 gain 71 10 -81.60 gain 10 72 -87.04 gain 72 10 -82.55 gain 10 73 -87.91 gain 73 10 -84.79 gain 10 74 -93.05 gain 74 10 -86.04 gain 10 75 -100.27 gain 75 10 -99.15 gain 10 76 -99.62 gain 76 10 -98.63 gain 10 77 -92.12 gain 77 10 -87.12 gain 10 78 -96.47 gain 78 10 -95.98 gain 10 79 -90.60 gain 79 10 -89.73 gain 10 80 -94.42 gain 80 10 -91.34 gain 10 81 -91.90 gain 81 10 -89.72 gain 10 82 -89.42 gain 82 10 -88.23 gain 10 83 -86.90 gain 83 10 -82.98 gain 10 84 -98.49 gain 84 10 -91.75 gain 10 85 -86.23 gain 85 10 -84.92 gain 10 86 -92.12 gain 86 10 -92.44 gain 10 87 -86.37 gain 87 10 -83.99 gain 10 88 -91.57 gain 88 10 -88.83 gain 10 89 -97.24 gain 89 10 -96.64 gain 10 90 -100.55 gain 90 10 -99.29 gain 10 91 -100.26 gain 91 10 -100.07 gain 10 92 -99.36 gain 92 10 -100.09 gain 10 93 -95.13 gain 93 10 -93.22 gain 10 94 -99.03 gain 94 10 -95.69 gain 10 95 -95.17 gain 95 10 -91.07 gain 10 96 -90.47 gain 96 10 -93.34 gain 10 97 -91.71 gain 97 10 -87.40 gain 10 98 -96.36 gain 98 10 -92.52 gain 10 99 -83.60 gain 99 10 -78.90 gain 10 100 -87.74 gain 100 10 -82.95 gain 10 101 -87.49 gain 101 10 -86.33 gain 10 102 -89.30 gain 102 10 -88.11 gain 10 103 -88.74 gain 103 10 -88.71 gain 10 104 -87.55 gain 104 10 -90.01 gain 10 105 -105.95 gain 105 10 -102.93 gain 10 106 -90.18 gain 106 10 -84.49 gain 10 107 -98.35 gain 107 10 -92.57 gain 10 108 -103.69 gain 108 10 -97.53 gain 10 109 -99.58 gain 109 10 -96.86 gain 10 110 -93.02 gain 110 10 -96.67 gain 10 111 -90.12 gain 111 10 -83.74 gain 10 112 -102.92 gain 112 10 -100.00 gain 10 113 -86.01 gain 113 10 -82.22 gain 10 114 -99.18 gain 114 10 -92.55 gain 10 115 -96.08 gain 115 10 -90.11 gain 10 116 -90.56 gain 116 10 -87.02 gain 10 117 -95.38 gain 117 10 -88.98 gain 10 118 -88.93 gain 118 10 -84.15 gain 10 119 -95.41 gain 119 10 -95.69 gain 10 120 -106.35 gain 120 10 -104.02 gain 10 121 -100.83 gain 121 10 -99.52 gain 10 122 -100.17 gain 122 10 -98.62 gain 10 123 -99.97 gain 123 10 -98.75 gain 10 124 -99.37 gain 124 10 -96.14 gain 10 125 -101.06 gain 125 10 -101.17 gain 10 126 -96.89 gain 126 10 -93.65 gain 10 127 -100.87 gain 127 10 -97.25 gain 10 128 -92.03 gain 128 10 -91.01 gain 10 129 -96.15 gain 129 10 -92.34 gain 10 130 -88.90 gain 130 10 -86.38 gain 10 131 -101.45 gain 131 10 -98.70 gain 10 132 -94.60 gain 132 10 -87.86 gain 10 133 -100.53 gain 133 10 -98.97 gain 10 134 -93.46 gain 134 10 -88.76 gain 10 135 -109.96 gain 135 10 -107.57 gain 10 136 -98.73 gain 136 10 -96.77 gain 10 137 -104.93 gain 137 10 -105.89 gain 10 138 -105.07 gain 138 10 -99.55 gain 10 139 -93.45 gain 139 10 -91.20 gain 10 140 -107.64 gain 140 10 -106.22 gain 10 141 -98.82 gain 141 10 -89.37 gain 10 142 -97.49 gain 142 10 -94.78 gain 10 143 -89.54 gain 143 10 -89.57 gain 10 144 -98.04 gain 144 10 -96.44 gain 10 145 -97.39 gain 145 10 -99.18 gain 10 146 -89.16 gain 146 10 -86.94 gain 10 147 -93.35 gain 147 10 -88.23 gain 10 148 -99.47 gain 148 10 -92.68 gain 10 149 -96.53 gain 149 10 -93.39 gain 10 150 -109.46 gain 150 10 -107.17 gain 10 151 -104.69 gain 151 10 -101.34 gain 10 152 -99.85 gain 152 10 -96.32 gain 10 153 -100.00 gain 153 10 -95.68 gain 10 154 -91.90 gain 154 10 -89.47 gain 10 155 -97.76 gain 155 10 -93.91 gain 10 156 -100.23 gain 156 10 -95.61 gain 10 157 -93.09 gain 157 10 -90.95 gain 10 158 -103.09 gain 158 10 -100.45 gain 10 159 -96.12 gain 159 10 -95.86 gain 10 160 -97.28 gain 160 10 -94.18 gain 10 161 -96.29 gain 161 10 -95.64 gain 10 162 -96.68 gain 162 10 -95.74 gain 10 163 -94.85 gain 163 10 -95.81 gain 10 164 -100.33 gain 164 10 -100.66 gain 10 165 -94.15 gain 165 10 -91.54 gain 10 166 -101.30 gain 166 10 -98.44 gain 10 167 -97.45 gain 167 10 -95.31 gain 10 168 -103.09 gain 168 10 -99.86 gain 10 169 -98.13 gain 169 10 -96.00 gain 10 170 -87.38 gain 170 10 -84.49 gain 10 171 -106.33 gain 171 10 -104.53 gain 10 172 -95.06 gain 172 10 -91.44 gain 10 173 -98.02 gain 173 10 -99.05 gain 10 174 -93.23 gain 174 10 -90.30 gain 10 175 -100.69 gain 175 10 -98.90 gain 10 176 -106.54 gain 176 10 -103.72 gain 10 177 -96.54 gain 177 10 -96.73 gain 10 178 -95.00 gain 178 10 -88.62 gain 10 179 -97.96 gain 179 10 -91.00 gain 10 180 -106.54 gain 180 10 -109.04 gain 10 181 -100.86 gain 181 10 -97.38 gain 10 182 -109.96 gain 182 10 -107.56 gain 10 183 -100.44 gain 183 10 -98.31 gain 10 184 -96.74 gain 184 10 -97.36 gain 10 185 -98.70 gain 185 10 -103.19 gain 10 186 -98.51 gain 186 10 -98.58 gain 10 187 -100.99 gain 187 10 -98.79 gain 10 188 -100.41 gain 188 10 -100.62 gain 10 189 -97.43 gain 189 10 -92.36 gain 10 190 -101.88 gain 190 10 -100.73 gain 10 191 -102.33 gain 191 10 -99.89 gain 10 192 -95.21 gain 192 10 -91.47 gain 10 193 -98.96 gain 193 10 -94.20 gain 10 194 -96.20 gain 194 10 -92.23 gain 10 195 -94.79 gain 195 10 -89.36 gain 10 196 -108.45 gain 196 10 -107.34 gain 10 197 -102.76 gain 197 10 -96.78 gain 10 198 -108.62 gain 198 10 -107.15 gain 10 199 -94.86 gain 199 10 -93.49 gain 10 200 -102.33 gain 200 10 -102.30 gain 10 201 -101.69 gain 201 10 -101.57 gain 10 202 -98.78 gain 202 10 -97.80 gain 10 203 -105.78 gain 203 10 -103.91 gain 10 204 -100.95 gain 204 10 -95.72 gain 10 205 -100.76 gain 205 10 -99.27 gain 10 206 -100.70 gain 206 10 -100.32 gain 10 207 -92.17 gain 207 10 -91.20 gain 10 208 -96.82 gain 208 10 -98.46 gain 10 209 -109.66 gain 209 10 -110.87 gain 10 210 -110.20 gain 210 10 -111.58 gain 10 211 -101.53 gain 211 10 -98.15 gain 10 212 -107.40 gain 212 10 -107.03 gain 10 213 -112.63 gain 213 10 -111.59 gain 10 214 -103.13 gain 214 10 -107.47 gain 10 215 -97.91 gain 215 10 -97.66 gain 10 216 -106.28 gain 216 10 -109.94 gain 10 217 -101.02 gain 217 10 -104.94 gain 10 218 -95.94 gain 218 10 -92.66 gain 10 219 -101.77 gain 219 10 -98.97 gain 10 220 -99.14 gain 220 10 -92.44 gain 10 221 -100.28 gain 221 10 -99.25 gain 10 222 -98.56 gain 222 10 -93.34 gain 10 223 -103.57 gain 223 10 -101.59 gain 10 224 -103.87 gain 224 10 -102.36 gain 11 12 -72.28 gain 12 11 -63.40 gain 11 13 -76.23 gain 13 11 -70.72 gain 11 14 -82.64 gain 14 11 -73.37 gain 11 15 -100.17 gain 15 11 -93.67 gain 11 16 -106.22 gain 16 11 -101.85 gain 11 17 -100.34 gain 17 11 -93.86 gain 11 18 -101.16 gain 18 11 -95.77 gain 11 19 -99.36 gain 19 11 -94.70 gain 11 20 -90.26 gain 20 11 -86.81 gain 11 21 -97.19 gain 21 11 -92.85 gain 11 22 -87.88 gain 22 11 -82.00 gain 11 23 -91.46 gain 23 11 -82.75 gain 11 24 -75.62 gain 24 11 -68.53 gain 11 25 -80.67 gain 25 11 -76.26 gain 11 26 -75.32 gain 26 11 -72.34 gain 11 27 -76.24 gain 27 11 -70.87 gain 11 28 -80.90 gain 28 11 -70.85 gain 11 29 -88.60 gain 29 11 -80.11 gain 11 30 -102.30 gain 30 11 -98.81 gain 11 31 -98.01 gain 31 11 -91.08 gain 11 32 -94.66 gain 32 11 -85.08 gain 11 33 -94.68 gain 33 11 -86.55 gain 11 34 -97.72 gain 34 11 -90.22 gain 11 35 -96.10 gain 35 11 -89.55 gain 11 36 -94.83 gain 36 11 -88.42 gain 11 37 -94.91 gain 37 11 -91.04 gain 11 38 -86.52 gain 38 11 -80.19 gain 11 39 -82.98 gain 39 11 -80.97 gain 11 40 -80.21 gain 40 11 -73.18 gain 11 41 -86.32 gain 41 11 -74.63 gain 11 42 -82.66 gain 42 11 -78.22 gain 11 43 -79.58 gain 43 11 -72.73 gain 11 44 -82.00 gain 44 11 -78.75 gain 11 45 -100.68 gain 45 11 -97.41 gain 11 46 -110.85 gain 46 11 -104.04 gain 11 47 -102.97 gain 47 11 -93.87 gain 11 48 -106.70 gain 48 11 -97.17 gain 11 49 -92.08 gain 49 11 -86.61 gain 11 50 -105.17 gain 50 11 -96.56 gain 11 51 -96.40 gain 51 11 -91.49 gain 11 52 -92.80 gain 52 11 -85.12 gain 11 53 -85.07 gain 53 11 -77.95 gain 11 54 -87.89 gain 54 11 -80.18 gain 11 55 -77.58 gain 55 11 -66.78 gain 11 56 -89.00 gain 56 11 -83.25 gain 11 57 -91.00 gain 57 11 -84.33 gain 11 58 -82.92 gain 58 11 -72.94 gain 11 59 -88.65 gain 59 11 -77.92 gain 11 60 -108.32 gain 60 11 -106.88 gain 11 61 -101.29 gain 61 11 -91.75 gain 11 62 -100.29 gain 62 11 -88.26 gain 11 63 -97.32 gain 63 11 -89.26 gain 11 64 -96.87 gain 64 11 -93.03 gain 11 65 -98.77 gain 65 11 -90.48 gain 11 66 -89.15 gain 66 11 -79.85 gain 11 67 -95.53 gain 67 11 -87.45 gain 11 68 -88.36 gain 68 11 -82.87 gain 11 69 -90.94 gain 69 11 -82.67 gain 11 70 -82.21 gain 70 11 -72.40 gain 11 71 -94.34 gain 71 11 -88.10 gain 11 72 -88.96 gain 72 11 -80.28 gain 11 73 -91.64 gain 73 11 -84.33 gain 11 74 -94.95 gain 74 11 -83.76 gain 11 75 -103.92 gain 75 11 -98.61 gain 11 76 -105.93 gain 76 11 -100.74 gain 11 77 -104.43 gain 77 11 -95.25 gain 11 78 -105.98 gain 78 11 -101.29 gain 11 79 -97.02 gain 79 11 -91.96 gain 11 80 -92.76 gain 80 11 -85.48 gain 11 81 -96.70 gain 81 11 -90.33 gain 11 82 -93.40 gain 82 11 -88.02 gain 11 83 -93.49 gain 83 11 -85.38 gain 11 84 -90.75 gain 84 11 -79.82 gain 11 85 -93.36 gain 85 11 -87.86 gain 11 86 -94.15 gain 86 11 -90.29 gain 11 87 -86.23 gain 87 11 -79.66 gain 11 88 -93.64 gain 88 11 -86.71 gain 11 89 -92.17 gain 89 11 -87.38 gain 11 90 -103.40 gain 90 11 -97.96 gain 11 91 -105.11 gain 91 11 -100.74 gain 11 92 -110.35 gain 92 11 -106.89 gain 11 93 -98.52 gain 93 11 -92.42 gain 11 94 -103.05 gain 94 11 -95.51 gain 11 95 -92.30 gain 95 11 -84.01 gain 11 96 -96.77 gain 96 11 -95.45 gain 11 97 -98.55 gain 97 11 -90.05 gain 11 98 -95.57 gain 98 11 -87.54 gain 11 99 -95.49 gain 99 11 -86.60 gain 11 100 -97.37 gain 100 11 -88.40 gain 11 101 -91.48 gain 101 11 -86.14 gain 11 102 -91.01 gain 102 11 -85.63 gain 11 103 -89.57 gain 103 11 -85.36 gain 11 104 -88.83 gain 104 11 -87.10 gain 11 105 -100.58 gain 105 11 -93.37 gain 11 106 -101.30 gain 106 11 -91.42 gain 11 107 -101.42 gain 107 11 -91.45 gain 11 108 -103.00 gain 108 11 -92.64 gain 11 109 -103.38 gain 109 11 -96.48 gain 11 110 -113.95 gain 110 11 -113.41 gain 11 111 -100.45 gain 111 11 -89.87 gain 11 112 -103.25 gain 112 11 -96.14 gain 11 113 -95.34 gain 113 11 -87.36 gain 11 114 -99.04 gain 114 11 -88.23 gain 11 115 -91.46 gain 115 11 -81.30 gain 11 116 -91.95 gain 116 11 -84.23 gain 11 117 -101.72 gain 117 11 -91.13 gain 11 118 -100.56 gain 118 11 -91.60 gain 11 119 -98.49 gain 119 11 -94.58 gain 11 120 -107.28 gain 120 11 -100.76 gain 11 121 -104.94 gain 121 11 -99.45 gain 11 122 -103.69 gain 122 11 -97.95 gain 11 123 -109.87 gain 123 11 -104.46 gain 11 124 -106.97 gain 124 11 -99.55 gain 11 125 -95.60 gain 125 11 -91.52 gain 11 126 -103.37 gain 126 11 -95.93 gain 11 127 -97.79 gain 127 11 -89.98 gain 11 128 -101.24 gain 128 11 -96.03 gain 11 129 -103.44 gain 129 11 -95.44 gain 11 130 -98.37 gain 130 11 -91.66 gain 11 131 -95.31 gain 131 11 -88.38 gain 11 132 -99.73 gain 132 11 -88.80 gain 11 133 -96.23 gain 133 11 -90.48 gain 11 134 -97.98 gain 134 11 -89.09 gain 11 135 -102.37 gain 135 11 -95.78 gain 11 136 -104.37 gain 136 11 -98.23 gain 11 137 -105.59 gain 137 11 -102.36 gain 11 138 -98.03 gain 138 11 -88.32 gain 11 139 -108.12 gain 139 11 -101.69 gain 11 140 -104.01 gain 140 11 -98.40 gain 11 141 -100.36 gain 141 11 -86.72 gain 11 142 -101.60 gain 142 11 -94.71 gain 11 143 -100.80 gain 143 11 -96.64 gain 11 144 -100.93 gain 144 11 -95.14 gain 11 145 -91.46 gain 145 11 -89.06 gain 11 146 -103.69 gain 146 11 -97.27 gain 11 147 -97.57 gain 147 11 -88.27 gain 11 148 -104.48 gain 148 11 -93.51 gain 11 149 -103.36 gain 149 11 -96.04 gain 11 150 -113.85 gain 150 11 -107.36 gain 11 151 -109.54 gain 151 11 -101.99 gain 11 152 -104.89 gain 152 11 -97.16 gain 11 153 -103.93 gain 153 11 -95.42 gain 11 154 -104.92 gain 154 11 -98.31 gain 11 155 -109.06 gain 155 11 -101.02 gain 11 156 -107.24 gain 156 11 -98.43 gain 11 157 -98.41 gain 157 11 -92.09 gain 11 158 -109.48 gain 158 11 -102.65 gain 11 159 -103.63 gain 159 11 -99.19 gain 11 160 -97.97 gain 160 11 -90.68 gain 11 161 -104.84 gain 161 11 -99.99 gain 11 162 -99.95 gain 162 11 -94.82 gain 11 163 -102.91 gain 163 11 -99.69 gain 11 164 -108.99 gain 164 11 -105.13 gain 11 165 -108.72 gain 165 11 -101.92 gain 11 166 -103.66 gain 166 11 -96.62 gain 11 167 -106.23 gain 167 11 -99.91 gain 11 168 -107.10 gain 168 11 -99.67 gain 11 169 -101.15 gain 169 11 -94.83 gain 11 170 -107.90 gain 170 11 -100.82 gain 11 171 -104.29 gain 171 11 -98.29 gain 11 172 -105.01 gain 172 11 -97.20 gain 11 173 -102.65 gain 173 11 -99.48 gain 11 174 -109.57 gain 174 11 -102.45 gain 11 175 -106.82 gain 175 11 -100.84 gain 11 176 -102.95 gain 176 11 -95.94 gain 11 177 -102.22 gain 177 11 -98.21 gain 11 178 -97.80 gain 178 11 -87.24 gain 11 179 -104.30 gain 179 11 -93.15 gain 11 180 -108.86 gain 180 11 -107.17 gain 11 181 -97.38 gain 181 11 -89.70 gain 11 182 -108.77 gain 182 11 -102.18 gain 11 183 -108.09 gain 183 11 -101.77 gain 11 184 -103.77 gain 184 11 -100.21 gain 11 185 -102.09 gain 185 11 -102.39 gain 11 186 -103.66 gain 186 11 -99.54 gain 11 187 -98.42 gain 187 11 -92.03 gain 11 188 -104.03 gain 188 11 -100.05 gain 11 189 -103.10 gain 189 11 -93.84 gain 11 190 -104.88 gain 190 11 -99.54 gain 11 191 -102.87 gain 191 11 -96.24 gain 11 192 -107.92 gain 192 11 -99.99 gain 11 193 -95.50 gain 193 11 -86.55 gain 11 194 -107.11 gain 194 11 -98.95 gain 11 195 -113.12 gain 195 11 -103.50 gain 11 196 -107.95 gain 196 11 -102.64 gain 11 197 -105.02 gain 197 11 -94.84 gain 11 198 -113.33 gain 198 11 -107.67 gain 11 199 -102.34 gain 199 11 -96.79 gain 11 200 -105.39 gain 200 11 -101.17 gain 11 201 -100.78 gain 201 11 -96.47 gain 11 202 -102.13 gain 202 11 -96.95 gain 11 203 -102.91 gain 203 11 -96.85 gain 11 204 -103.83 gain 204 11 -94.41 gain 11 205 -104.96 gain 205 11 -99.28 gain 11 206 -99.01 gain 206 11 -94.44 gain 11 207 -104.61 gain 207 11 -99.46 gain 11 208 -103.12 gain 208 11 -100.57 gain 11 209 -101.88 gain 209 11 -98.90 gain 11 210 -111.60 gain 210 11 -108.79 gain 11 211 -112.06 gain 211 11 -104.49 gain 11 212 -110.98 gain 212 11 -106.42 gain 11 213 -103.11 gain 213 11 -97.88 gain 11 214 -113.93 gain 214 11 -114.09 gain 11 215 -106.83 gain 215 11 -102.39 gain 11 216 -106.47 gain 216 11 -105.93 gain 11 217 -107.35 gain 217 11 -107.08 gain 11 218 -105.44 gain 218 11 -97.98 gain 11 219 -103.50 gain 219 11 -96.52 gain 11 220 -110.39 gain 220 11 -99.50 gain 11 221 -104.75 gain 221 11 -99.53 gain 11 222 -112.32 gain 222 11 -102.91 gain 11 223 -102.05 gain 223 11 -95.88 gain 11 224 -110.10 gain 224 11 -104.40 gain 12 13 -62.91 gain 13 12 -66.29 gain 12 14 -63.35 gain 14 12 -62.97 gain 12 15 -95.89 gain 15 12 -98.27 gain 12 16 -100.73 gain 16 12 -105.24 gain 12 17 -85.74 gain 17 12 -88.15 gain 12 18 -96.93 gain 18 12 -100.42 gain 12 19 -96.23 gain 19 12 -100.46 gain 12 20 -100.57 gain 20 12 -106.01 gain 12 21 -91.62 gain 21 12 -96.17 gain 12 22 -88.55 gain 22 12 -91.56 gain 12 23 -80.48 gain 23 12 -80.66 gain 12 24 -79.53 gain 24 12 -81.32 gain 12 25 -68.48 gain 25 12 -72.95 gain 12 26 -71.39 gain 26 12 -77.29 gain 12 27 -58.78 gain 27 12 -62.30 gain 12 28 -69.38 gain 28 12 -68.22 gain 12 29 -75.03 gain 29 12 -75.42 gain 12 30 -92.43 gain 30 12 -97.82 gain 12 31 -90.87 gain 31 12 -92.83 gain 12 32 -89.89 gain 32 12 -89.19 gain 12 33 -94.64 gain 33 12 -95.40 gain 12 34 -89.57 gain 34 12 -90.95 gain 12 35 -91.02 gain 35 12 -93.36 gain 12 36 -87.20 gain 36 12 -89.68 gain 12 37 -90.18 gain 37 12 -95.20 gain 12 38 -72.17 gain 38 12 -74.73 gain 12 39 -77.22 gain 39 12 -84.09 gain 12 40 -73.37 gain 40 12 -75.22 gain 12 41 -81.34 gain 41 12 -78.54 gain 12 42 -73.05 gain 42 12 -77.49 gain 12 43 -81.91 gain 43 12 -83.95 gain 12 44 -80.83 gain 44 12 -86.46 gain 12 45 -95.71 gain 45 12 -101.32 gain 12 46 -92.40 gain 46 12 -94.48 gain 12 47 -97.17 gain 47 12 -96.95 gain 12 48 -90.01 gain 48 12 -89.37 gain 12 49 -91.11 gain 49 12 -94.53 gain 12 50 -92.74 gain 50 12 -93.02 gain 12 51 -94.72 gain 51 12 -98.69 gain 12 52 -82.69 gain 52 12 -83.90 gain 12 53 -84.95 gain 53 12 -86.71 gain 12 54 -87.07 gain 54 12 -88.24 gain 12 55 -75.40 gain 55 12 -73.49 gain 12 56 -72.51 gain 56 12 -75.65 gain 12 57 -75.17 gain 57 12 -77.39 gain 12 58 -76.87 gain 58 12 -75.78 gain 12 59 -72.58 gain 59 12 -70.74 gain 12 60 -102.09 gain 60 12 -109.53 gain 12 61 -99.79 gain 61 12 -99.14 gain 12 62 -100.71 gain 62 12 -97.57 gain 12 63 -94.12 gain 63 12 -94.94 gain 12 64 -86.39 gain 64 12 -91.44 gain 12 65 -97.46 gain 65 12 -98.05 gain 12 66 -86.78 gain 66 12 -86.36 gain 12 67 -84.96 gain 67 12 -85.77 gain 12 68 -82.60 gain 68 12 -85.99 gain 12 69 -80.06 gain 69 12 -80.67 gain 12 70 -83.58 gain 70 12 -82.66 gain 12 71 -84.65 gain 71 12 -87.30 gain 12 72 -80.16 gain 72 12 -80.36 gain 12 73 -82.62 gain 73 12 -84.20 gain 12 74 -81.34 gain 74 12 -79.03 gain 12 75 -93.05 gain 75 12 -96.63 gain 12 76 -96.15 gain 76 12 -99.85 gain 12 77 -93.72 gain 77 12 -93.42 gain 12 78 -88.85 gain 78 12 -93.05 gain 12 79 -97.08 gain 79 12 -100.90 gain 12 80 -98.51 gain 80 12 -100.12 gain 12 81 -88.96 gain 81 12 -91.48 gain 12 82 -90.79 gain 82 12 -94.29 gain 12 83 -89.24 gain 83 12 -90.01 gain 12 84 -83.08 gain 84 12 -81.03 gain 12 85 -91.77 gain 85 12 -95.15 gain 12 86 -84.64 gain 86 12 -89.66 gain 12 87 -90.63 gain 87 12 -92.94 gain 12 88 -79.01 gain 88 12 -80.97 gain 12 89 -77.66 gain 89 12 -81.75 gain 12 90 -100.16 gain 90 12 -103.59 gain 12 91 -88.46 gain 91 12 -92.96 gain 12 92 -90.84 gain 92 12 -96.26 gain 12 93 -95.04 gain 93 12 -97.82 gain 12 94 -93.52 gain 94 12 -94.87 gain 12 95 -89.51 gain 95 12 -90.10 gain 12 96 -97.96 gain 96 12 -105.52 gain 12 97 -91.83 gain 97 12 -92.21 gain 12 98 -87.00 gain 98 12 -87.85 gain 12 99 -83.36 gain 99 12 -83.35 gain 12 100 -90.17 gain 100 12 -90.08 gain 12 101 -89.11 gain 101 12 -92.65 gain 12 102 -86.88 gain 102 12 -90.39 gain 12 103 -94.27 gain 103 12 -98.94 gain 12 104 -86.69 gain 104 12 -93.85 gain 12 105 -102.70 gain 105 12 -104.37 gain 12 106 -98.18 gain 106 12 -97.19 gain 12 107 -101.81 gain 107 12 -100.72 gain 12 108 -99.26 gain 108 12 -97.80 gain 12 109 -89.44 gain 109 12 -91.42 gain 12 110 -90.07 gain 110 12 -98.41 gain 12 111 -92.18 gain 111 12 -90.49 gain 12 112 -89.23 gain 112 12 -91.00 gain 12 113 -84.99 gain 113 12 -85.89 gain 12 114 -90.19 gain 114 12 -88.26 gain 12 115 -98.43 gain 115 12 -97.15 gain 12 116 -89.35 gain 116 12 -90.51 gain 12 117 -86.59 gain 117 12 -84.89 gain 12 118 -84.00 gain 118 12 -83.92 gain 12 119 -89.02 gain 119 12 -94.00 gain 12 120 -91.80 gain 120 12 -94.16 gain 12 121 -94.96 gain 121 12 -98.35 gain 12 122 -90.74 gain 122 12 -93.88 gain 12 123 -96.81 gain 123 12 -100.29 gain 12 124 -90.68 gain 124 12 -92.15 gain 12 125 -96.81 gain 125 12 -101.61 gain 12 126 -90.46 gain 126 12 -91.92 gain 12 127 -89.43 gain 127 12 -90.51 gain 12 128 -85.02 gain 128 12 -88.70 gain 12 129 -88.72 gain 129 12 -89.60 gain 12 130 -86.92 gain 130 12 -89.09 gain 12 131 -94.98 gain 131 12 -96.93 gain 12 132 -94.20 gain 132 12 -92.16 gain 12 133 -90.15 gain 133 12 -93.28 gain 12 134 -95.31 gain 134 12 -95.30 gain 12 135 -98.92 gain 135 12 -101.22 gain 12 136 -101.77 gain 136 12 -104.51 gain 12 137 -93.27 gain 137 12 -98.92 gain 12 138 -99.20 gain 138 12 -98.38 gain 12 139 -94.80 gain 139 12 -97.25 gain 12 140 -97.38 gain 140 12 -100.66 gain 12 141 -102.51 gain 141 12 -97.76 gain 12 142 -96.96 gain 142 12 -98.95 gain 12 143 -90.84 gain 143 12 -95.57 gain 12 144 -89.05 gain 144 12 -92.14 gain 12 145 -89.92 gain 145 12 -96.40 gain 12 146 -86.30 gain 146 12 -88.78 gain 12 147 -93.71 gain 147 12 -93.29 gain 12 148 -91.83 gain 148 12 -89.73 gain 12 149 -97.16 gain 149 12 -98.72 gain 12 150 -96.79 gain 150 12 -99.19 gain 12 151 -91.68 gain 151 12 -93.02 gain 12 152 -93.76 gain 152 12 -94.92 gain 12 153 -97.99 gain 153 12 -98.36 gain 12 154 -99.30 gain 154 12 -101.57 gain 12 155 -91.70 gain 155 12 -92.55 gain 12 156 -103.10 gain 156 12 -103.18 gain 12 157 -93.78 gain 157 12 -96.34 gain 12 158 -93.10 gain 158 12 -95.16 gain 12 159 -99.71 gain 159 12 -104.15 gain 12 160 -93.82 gain 160 12 -95.42 gain 12 161 -91.62 gain 161 12 -95.65 gain 12 162 -96.44 gain 162 12 -100.19 gain 12 163 -90.61 gain 163 12 -96.27 gain 12 164 -94.52 gain 164 12 -99.55 gain 12 165 -98.29 gain 165 12 -100.37 gain 12 166 -94.17 gain 166 12 -96.01 gain 12 167 -97.84 gain 167 12 -100.40 gain 12 168 -94.98 gain 168 12 -96.44 gain 12 169 -100.79 gain 169 12 -103.36 gain 12 170 -94.87 gain 170 12 -96.68 gain 12 171 -90.91 gain 171 12 -93.80 gain 12 172 -96.06 gain 172 12 -97.13 gain 12 173 -99.91 gain 173 12 -105.64 gain 12 174 -88.07 gain 174 12 -89.84 gain 12 175 -91.95 gain 175 12 -94.85 gain 12 176 -94.58 gain 176 12 -96.45 gain 12 177 -97.48 gain 177 12 -102.35 gain 12 178 -92.96 gain 178 12 -91.28 gain 12 179 -94.17 gain 179 12 -91.91 gain 12 180 -99.64 gain 180 12 -106.83 gain 12 181 -97.03 gain 181 12 -98.24 gain 12 182 -90.78 gain 182 12 -93.08 gain 12 183 -106.72 gain 183 12 -109.29 gain 12 184 -101.85 gain 184 12 -107.17 gain 12 185 -96.69 gain 185 12 -105.87 gain 12 186 -100.02 gain 186 12 -104.79 gain 12 187 -101.40 gain 187 12 -103.89 gain 12 188 -95.77 gain 188 12 -100.67 gain 12 189 -93.93 gain 189 12 -93.56 gain 12 190 -93.87 gain 190 12 -97.42 gain 12 191 -92.19 gain 191 12 -94.44 gain 12 192 -96.47 gain 192 12 -97.42 gain 12 193 -99.47 gain 193 12 -99.40 gain 12 194 -99.67 gain 194 12 -100.39 gain 12 195 -100.21 gain 195 12 -99.48 gain 12 196 -97.61 gain 196 12 -101.19 gain 12 197 -97.55 gain 197 12 -96.26 gain 12 198 -92.62 gain 198 12 -95.85 gain 12 199 -101.85 gain 199 12 -105.18 gain 12 200 -101.33 gain 200 12 -106.00 gain 12 201 -95.97 gain 201 12 -100.55 gain 12 202 -98.04 gain 202 12 -101.75 gain 12 203 -97.87 gain 203 12 -100.69 gain 12 204 -97.84 gain 204 12 -97.31 gain 12 205 -96.40 gain 205 12 -99.61 gain 12 206 -100.67 gain 206 12 -104.99 gain 12 207 -99.82 gain 207 12 -103.56 gain 12 208 -90.40 gain 208 12 -96.73 gain 12 209 -99.08 gain 209 12 -104.99 gain 12 210 -95.15 gain 210 12 -101.23 gain 12 211 -100.48 gain 211 12 -101.80 gain 12 212 -107.38 gain 212 12 -111.71 gain 12 213 -100.10 gain 213 12 -103.76 gain 12 214 -107.67 gain 214 12 -116.71 gain 12 215 -98.07 gain 215 12 -102.51 gain 12 216 -98.94 gain 216 12 -107.30 gain 12 217 -94.14 gain 217 12 -102.75 gain 12 218 -104.65 gain 218 12 -106.07 gain 12 219 -98.58 gain 219 12 -100.49 gain 12 220 -96.12 gain 220 12 -94.11 gain 12 221 -103.72 gain 221 12 -107.39 gain 12 222 -94.78 gain 222 12 -94.26 gain 12 223 -95.43 gain 223 12 -98.15 gain 12 224 -93.65 gain 224 12 -96.84 gain 13 14 -72.53 gain 14 13 -68.77 gain 13 15 -102.11 gain 15 13 -101.12 gain 13 16 -100.22 gain 16 13 -101.35 gain 13 17 -103.33 gain 17 13 -102.35 gain 13 18 -91.29 gain 18 13 -91.40 gain 13 19 -93.59 gain 19 13 -94.44 gain 13 20 -103.94 gain 20 13 -106.00 gain 13 21 -90.79 gain 21 13 -91.96 gain 13 22 -87.21 gain 22 13 -86.83 gain 13 23 -84.25 gain 23 13 -81.05 gain 13 24 -85.33 gain 24 13 -83.74 gain 13 25 -77.68 gain 25 13 -78.78 gain 13 26 -71.77 gain 26 13 -74.30 gain 13 27 -66.18 gain 27 13 -66.32 gain 13 28 -61.94 gain 28 13 -57.40 gain 13 29 -67.16 gain 29 13 -64.17 gain 13 30 -105.50 gain 30 13 -107.51 gain 13 31 -98.88 gain 31 13 -97.45 gain 13 32 -95.63 gain 32 13 -91.55 gain 13 33 -98.43 gain 33 13 -95.80 gain 13 34 -89.91 gain 34 13 -87.92 gain 13 35 -101.47 gain 35 13 -100.43 gain 13 36 -90.49 gain 36 13 -89.59 gain 13 37 -89.64 gain 37 13 -91.28 gain 13 38 -79.95 gain 38 13 -79.12 gain 13 39 -87.26 gain 39 13 -90.75 gain 13 40 -87.85 gain 40 13 -86.32 gain 13 41 -81.94 gain 41 13 -75.76 gain 13 42 -85.72 gain 42 13 -86.79 gain 13 43 -73.23 gain 43 13 -71.89 gain 13 44 -80.09 gain 44 13 -82.34 gain 13 45 -104.23 gain 45 13 -106.46 gain 13 46 -98.70 gain 46 13 -97.39 gain 13 47 -97.18 gain 47 13 -93.58 gain 13 48 -101.87 gain 48 13 -97.84 gain 13 49 -87.51 gain 49 13 -87.55 gain 13 50 -96.94 gain 50 13 -93.84 gain 13 51 -88.48 gain 51 13 -89.07 gain 13 52 -93.82 gain 52 13 -91.65 gain 13 53 -90.30 gain 53 13 -88.68 gain 13 54 -91.20 gain 54 13 -88.99 gain 13 55 -85.27 gain 55 13 -79.98 gain 13 56 -83.94 gain 56 13 -83.70 gain 13 57 -80.87 gain 57 13 -79.70 gain 13 58 -87.83 gain 58 13 -83.36 gain 13 59 -83.92 gain 59 13 -78.70 gain 13 60 -104.10 gain 60 13 -108.16 gain 13 61 -97.60 gain 61 13 -93.57 gain 13 62 -89.28 gain 62 13 -82.76 gain 13 63 -94.21 gain 63 13 -91.65 gain 13 64 -95.68 gain 64 13 -97.35 gain 13 65 -89.64 gain 65 13 -86.85 gain 13 66 -94.15 gain 66 13 -90.35 gain 13 67 -85.85 gain 67 13 -83.27 gain 13 68 -89.29 gain 68 13 -89.31 gain 13 69 -83.80 gain 69 13 -81.04 gain 13 70 -86.85 gain 70 13 -82.55 gain 13 71 -81.80 gain 71 13 -81.07 gain 13 72 -87.75 gain 72 13 -84.57 gain 13 73 -87.98 gain 73 13 -86.18 gain 13 74 -85.98 gain 74 13 -80.29 gain 13 75 -106.51 gain 75 13 -106.71 gain 13 76 -97.85 gain 76 13 -98.18 gain 13 77 -102.35 gain 77 13 -98.67 gain 13 78 -99.57 gain 78 13 -100.39 gain 13 79 -93.86 gain 79 13 -94.31 gain 13 80 -92.71 gain 80 13 -90.94 gain 13 81 -95.32 gain 81 13 -94.46 gain 13 82 -100.43 gain 82 13 -100.55 gain 13 83 -82.19 gain 83 13 -79.58 gain 13 84 -92.52 gain 84 13 -87.10 gain 13 85 -91.72 gain 85 13 -91.73 gain 13 86 -84.58 gain 86 13 -86.23 gain 13 87 -90.10 gain 87 13 -89.04 gain 13 88 -89.31 gain 88 13 -87.89 gain 13 89 -87.90 gain 89 13 -88.62 gain 13 90 -94.08 gain 90 13 -94.14 gain 13 91 -105.86 gain 91 13 -106.98 gain 13 92 -94.26 gain 92 13 -96.30 gain 13 93 -97.72 gain 93 13 -97.13 gain 13 94 -107.81 gain 94 13 -105.78 gain 13 95 -91.18 gain 95 13 -88.39 gain 13 96 -92.00 gain 96 13 -96.19 gain 13 97 -100.89 gain 97 13 -97.90 gain 13 98 -94.19 gain 98 13 -91.67 gain 13 99 -99.99 gain 99 13 -96.60 gain 13 100 -88.26 gain 100 13 -84.79 gain 13 101 -96.06 gain 101 13 -96.22 gain 13 102 -93.08 gain 102 13 -93.20 gain 13 103 -90.61 gain 103 13 -91.90 gain 13 104 -87.65 gain 104 13 -91.43 gain 13 105 -103.10 gain 105 13 -101.40 gain 13 106 -98.50 gain 106 13 -94.13 gain 13 107 -102.79 gain 107 13 -98.32 gain 13 108 -102.36 gain 108 13 -97.51 gain 13 109 -94.56 gain 109 13 -93.16 gain 13 110 -93.68 gain 110 13 -98.65 gain 13 111 -99.53 gain 111 13 -94.46 gain 13 112 -97.15 gain 112 13 -95.54 gain 13 113 -95.74 gain 113 13 -93.26 gain 13 114 -94.32 gain 114 13 -89.01 gain 13 115 -97.81 gain 115 13 -93.15 gain 13 116 -83.09 gain 116 13 -80.87 gain 13 117 -92.02 gain 117 13 -86.95 gain 13 118 -90.13 gain 118 13 -86.67 gain 13 119 -99.17 gain 119 13 -100.77 gain 13 120 -96.90 gain 120 13 -95.89 gain 13 121 -96.78 gain 121 13 -96.79 gain 13 122 -96.37 gain 122 13 -96.13 gain 13 123 -97.33 gain 123 13 -97.43 gain 13 124 -97.30 gain 124 13 -95.38 gain 13 125 -103.35 gain 125 13 -104.78 gain 13 126 -96.53 gain 126 13 -94.60 gain 13 127 -99.54 gain 127 13 -97.23 gain 13 128 -99.81 gain 128 13 -100.11 gain 13 129 -99.91 gain 129 13 -97.42 gain 13 130 -93.12 gain 130 13 -91.92 gain 13 131 -90.81 gain 131 13 -89.38 gain 13 132 -89.69 gain 132 13 -84.27 gain 13 133 -91.90 gain 133 13 -91.65 gain 13 134 -102.32 gain 134 13 -98.94 gain 13 135 -98.14 gain 135 13 -97.06 gain 13 136 -98.12 gain 136 13 -97.48 gain 13 137 -108.55 gain 137 13 -110.82 gain 13 138 -98.69 gain 138 13 -94.49 gain 13 139 -104.76 gain 139 13 -103.83 gain 13 140 -101.08 gain 140 13 -100.98 gain 13 141 -95.67 gain 141 13 -87.54 gain 13 142 -98.17 gain 142 13 -96.78 gain 13 143 -103.20 gain 143 13 -104.55 gain 13 144 -97.68 gain 144 13 -97.39 gain 13 145 -100.84 gain 145 13 -103.94 gain 13 146 -96.20 gain 146 13 -95.29 gain 13 147 -101.47 gain 147 13 -97.67 gain 13 148 -98.06 gain 148 13 -92.59 gain 13 149 -102.17 gain 149 13 -100.36 gain 13 150 -106.84 gain 150 13 -105.86 gain 13 151 -104.50 gain 151 13 -102.47 gain 13 152 -100.17 gain 152 13 -97.95 gain 13 153 -102.95 gain 153 13 -99.94 gain 13 154 -100.20 gain 154 13 -99.10 gain 13 155 -106.79 gain 155 13 -104.25 gain 13 156 -98.80 gain 156 13 -95.50 gain 13 157 -104.49 gain 157 13 -103.67 gain 13 158 -99.25 gain 158 13 -97.93 gain 13 159 -96.20 gain 159 13 -97.26 gain 13 160 -94.61 gain 160 13 -92.83 gain 13 161 -99.76 gain 161 13 -100.41 gain 13 162 -95.43 gain 162 13 -95.80 gain 13 163 -94.98 gain 163 13 -97.26 gain 13 164 -99.96 gain 164 13 -101.61 gain 13 165 -105.57 gain 165 13 -104.28 gain 13 166 -97.35 gain 166 13 -95.81 gain 13 167 -100.93 gain 167 13 -100.11 gain 13 168 -100.96 gain 168 13 -99.04 gain 13 169 -94.34 gain 169 13 -93.53 gain 13 170 -101.66 gain 170 13 -100.09 gain 13 171 -101.02 gain 171 13 -100.53 gain 13 172 -98.20 gain 172 13 -95.90 gain 13 173 -96.56 gain 173 13 -98.91 gain 13 174 -106.31 gain 174 13 -104.70 gain 13 175 -100.01 gain 175 13 -99.53 gain 13 176 -94.33 gain 176 13 -92.83 gain 13 177 -100.53 gain 177 13 -102.03 gain 13 178 -95.00 gain 178 13 -89.94 gain 13 179 -103.32 gain 179 13 -97.68 gain 13 180 -102.14 gain 180 13 -105.95 gain 13 181 -103.85 gain 181 13 -101.68 gain 13 182 -100.74 gain 182 13 -99.66 gain 13 183 -102.57 gain 183 13 -101.76 gain 13 184 -103.75 gain 184 13 -105.69 gain 13 185 -103.25 gain 185 13 -109.05 gain 13 186 -102.87 gain 186 13 -104.25 gain 13 187 -100.94 gain 187 13 -100.05 gain 13 188 -93.89 gain 188 13 -95.41 gain 13 189 -98.99 gain 189 13 -95.24 gain 13 190 -96.65 gain 190 13 -96.82 gain 13 191 -100.49 gain 191 13 -99.36 gain 13 192 -96.67 gain 192 13 -94.24 gain 13 193 -90.01 gain 193 13 -86.56 gain 13 194 -92.51 gain 194 13 -89.85 gain 13 195 -103.26 gain 195 13 -99.15 gain 13 196 -100.62 gain 196 13 -100.82 gain 13 197 -98.42 gain 197 13 -93.75 gain 13 198 -104.17 gain 198 13 -104.01 gain 13 199 -97.02 gain 199 13 -96.97 gain 13 200 -105.66 gain 200 13 -106.95 gain 13 201 -88.27 gain 201 13 -89.46 gain 13 202 -99.57 gain 202 13 -99.90 gain 13 203 -97.74 gain 203 13 -97.19 gain 13 204 -100.38 gain 204 13 -96.47 gain 13 205 -95.05 gain 205 13 -94.88 gain 13 206 -98.71 gain 206 13 -99.65 gain 13 207 -91.78 gain 207 13 -92.13 gain 13 208 -96.12 gain 208 13 -99.07 gain 13 209 -102.36 gain 209 13 -104.89 gain 13 210 -98.81 gain 210 13 -101.52 gain 13 211 -98.40 gain 211 13 -96.33 gain 13 212 -109.27 gain 212 13 -110.21 gain 13 213 -104.27 gain 213 13 -104.54 gain 13 214 -96.85 gain 214 13 -102.51 gain 13 215 -102.25 gain 215 13 -103.31 gain 13 216 -100.38 gain 216 13 -105.35 gain 13 217 -100.84 gain 217 13 -106.07 gain 13 218 -109.93 gain 218 13 -107.97 gain 13 219 -93.54 gain 219 13 -92.07 gain 13 220 -101.16 gain 220 13 -95.77 gain 13 221 -101.73 gain 221 13 -102.02 gain 13 222 -104.47 gain 222 13 -100.56 gain 13 223 -99.81 gain 223 13 -99.14 gain 13 224 -96.88 gain 224 13 -96.69 gain 14 15 -91.81 gain 15 14 -94.58 gain 14 16 -99.37 gain 16 14 -104.27 gain 14 17 -95.52 gain 17 14 -98.31 gain 14 18 -91.41 gain 18 14 -95.28 gain 14 19 -89.75 gain 19 14 -94.36 gain 14 20 -86.27 gain 20 14 -92.09 gain 14 21 -90.67 gain 21 14 -95.59 gain 14 22 -92.06 gain 22 14 -95.45 gain 14 23 -93.18 gain 23 14 -93.73 gain 14 24 -90.18 gain 24 14 -92.35 gain 14 25 -83.93 gain 25 14 -88.78 gain 14 26 -73.09 gain 26 14 -79.37 gain 14 27 -68.77 gain 27 14 -72.66 gain 14 28 -67.27 gain 28 14 -66.49 gain 14 29 -65.81 gain 29 14 -66.58 gain 14 30 -96.45 gain 30 14 -102.22 gain 14 31 -100.02 gain 31 14 -102.35 gain 14 32 -93.72 gain 32 14 -93.40 gain 14 33 -91.12 gain 33 14 -92.26 gain 14 34 -90.56 gain 34 14 -92.33 gain 14 35 -89.60 gain 35 14 -92.31 gain 14 36 -90.31 gain 36 14 -93.17 gain 14 37 -84.99 gain 37 14 -90.39 gain 14 38 -85.28 gain 38 14 -88.21 gain 14 39 -82.88 gain 39 14 -90.13 gain 14 40 -80.94 gain 40 14 -83.17 gain 14 41 -83.68 gain 41 14 -81.26 gain 14 42 -73.39 gain 42 14 -78.21 gain 14 43 -75.98 gain 43 14 -78.40 gain 14 44 -74.06 gain 44 14 -80.07 gain 14 45 -97.48 gain 45 14 -103.47 gain 14 46 -99.05 gain 46 14 -101.51 gain 14 47 -95.11 gain 47 14 -95.27 gain 14 48 -89.67 gain 48 14 -89.41 gain 14 49 -85.46 gain 49 14 -89.26 gain 14 50 -85.70 gain 50 14 -86.36 gain 14 51 -94.63 gain 51 14 -98.98 gain 14 52 -89.17 gain 52 14 -90.76 gain 14 53 -87.94 gain 53 14 -90.08 gain 14 54 -83.23 gain 54 14 -84.78 gain 14 55 -82.00 gain 55 14 -80.46 gain 14 56 -77.08 gain 56 14 -80.59 gain 14 57 -78.19 gain 57 14 -80.79 gain 14 58 -73.71 gain 58 14 -73.00 gain 14 59 -78.37 gain 59 14 -76.91 gain 14 60 -102.15 gain 60 14 -109.97 gain 14 61 -92.73 gain 61 14 -92.46 gain 14 62 -97.33 gain 62 14 -94.57 gain 14 63 -90.56 gain 63 14 -91.76 gain 14 64 -96.00 gain 64 14 -101.43 gain 14 65 -96.53 gain 65 14 -97.51 gain 14 66 -90.29 gain 66 14 -90.25 gain 14 67 -85.54 gain 67 14 -86.73 gain 14 68 -87.11 gain 68 14 -90.89 gain 14 69 -92.49 gain 69 14 -93.48 gain 14 70 -82.67 gain 70 14 -82.13 gain 14 71 -83.26 gain 71 14 -86.29 gain 14 72 -82.10 gain 72 14 -82.69 gain 14 73 -83.51 gain 73 14 -85.47 gain 14 74 -79.24 gain 74 14 -77.31 gain 14 75 -97.64 gain 75 14 -101.60 gain 14 76 -96.08 gain 76 14 -100.16 gain 14 77 -97.02 gain 77 14 -97.10 gain 14 78 -100.92 gain 78 14 -105.50 gain 14 79 -90.62 gain 79 14 -94.82 gain 14 80 -94.18 gain 80 14 -96.17 gain 14 81 -87.17 gain 81 14 -90.07 gain 14 82 -89.15 gain 82 14 -93.03 gain 14 83 -84.86 gain 83 14 -86.01 gain 14 84 -84.74 gain 84 14 -83.08 gain 14 85 -91.55 gain 85 14 -95.32 gain 14 86 -86.22 gain 86 14 -91.62 gain 14 87 -82.38 gain 87 14 -85.07 gain 14 88 -83.05 gain 88 14 -85.39 gain 14 89 -86.35 gain 89 14 -90.83 gain 14 90 -97.07 gain 90 14 -100.89 gain 14 91 -103.54 gain 91 14 -108.43 gain 14 92 -96.14 gain 92 14 -101.95 gain 14 93 -95.59 gain 93 14 -98.76 gain 14 94 -95.85 gain 94 14 -97.58 gain 14 95 -84.81 gain 95 14 -85.78 gain 14 96 -91.40 gain 96 14 -99.35 gain 14 97 -90.41 gain 97 14 -91.18 gain 14 98 -94.63 gain 98 14 -95.87 gain 14 99 -98.53 gain 99 14 -98.91 gain 14 100 -92.08 gain 100 14 -92.37 gain 14 101 -89.49 gain 101 14 -93.41 gain 14 102 -85.58 gain 102 14 -89.46 gain 14 103 -89.46 gain 103 14 -94.52 gain 14 104 -82.14 gain 104 14 -89.67 gain 14 105 -92.74 gain 105 14 -94.80 gain 14 106 -105.21 gain 106 14 -104.60 gain 14 107 -96.50 gain 107 14 -95.79 gain 14 108 -95.08 gain 108 14 -93.99 gain 14 109 -91.20 gain 109 14 -93.56 gain 14 110 -93.72 gain 110 14 -102.44 gain 14 111 -93.61 gain 111 14 -92.31 gain 14 112 -87.13 gain 112 14 -89.28 gain 14 113 -99.13 gain 113 14 -100.41 gain 14 114 -84.09 gain 114 14 -82.54 gain 14 115 -86.03 gain 115 14 -85.14 gain 14 116 -85.27 gain 116 14 -86.81 gain 14 117 -86.78 gain 117 14 -85.46 gain 14 118 -88.49 gain 118 14 -88.79 gain 14 119 -90.88 gain 119 14 -96.24 gain 14 120 -99.71 gain 120 14 -102.46 gain 14 121 -93.10 gain 121 14 -96.87 gain 14 122 -96.09 gain 122 14 -99.61 gain 14 123 -100.89 gain 123 14 -104.74 gain 14 124 -96.91 gain 124 14 -98.75 gain 14 125 -91.64 gain 125 14 -96.83 gain 14 126 -98.61 gain 126 14 -100.44 gain 14 127 -97.77 gain 127 14 -99.23 gain 14 128 -99.74 gain 128 14 -103.79 gain 14 129 -94.08 gain 129 14 -95.35 gain 14 130 -92.91 gain 130 14 -95.47 gain 14 131 -85.30 gain 131 14 -87.63 gain 14 132 -90.04 gain 132 14 -88.38 gain 14 133 -86.41 gain 133 14 -89.92 gain 14 134 -84.07 gain 134 14 -84.45 gain 14 135 -102.62 gain 135 14 -105.30 gain 14 136 -100.21 gain 136 14 -103.33 gain 14 137 -97.23 gain 137 14 -103.27 gain 14 138 -99.91 gain 138 14 -99.47 gain 14 139 -96.65 gain 139 14 -99.48 gain 14 140 -90.95 gain 140 14 -94.61 gain 14 141 -100.87 gain 141 14 -96.50 gain 14 142 -93.26 gain 142 14 -95.63 gain 14 143 -91.87 gain 143 14 -96.99 gain 14 144 -93.55 gain 144 14 -97.02 gain 14 145 -88.93 gain 145 14 -95.79 gain 14 146 -91.13 gain 146 14 -93.98 gain 14 147 -89.18 gain 147 14 -89.14 gain 14 148 -91.49 gain 148 14 -89.78 gain 14 149 -89.87 gain 149 14 -91.82 gain 14 150 -105.49 gain 150 14 -108.27 gain 14 151 -104.50 gain 151 14 -106.23 gain 14 152 -98.90 gain 152 14 -100.44 gain 14 153 -102.05 gain 153 14 -102.80 gain 14 154 -101.01 gain 154 14 -103.66 gain 14 155 -91.68 gain 155 14 -92.91 gain 14 156 -100.73 gain 156 14 -101.19 gain 14 157 -94.41 gain 157 14 -97.35 gain 14 158 -104.61 gain 158 14 -107.05 gain 14 159 -94.75 gain 159 14 -99.57 gain 14 160 -94.13 gain 160 14 -96.10 gain 14 161 -96.79 gain 161 14 -101.20 gain 14 162 -98.55 gain 162 14 -102.68 gain 14 163 -88.43 gain 163 14 -94.48 gain 14 164 -93.55 gain 164 14 -98.96 gain 14 165 -97.15 gain 165 14 -99.62 gain 14 166 -99.58 gain 166 14 -101.80 gain 14 167 -103.16 gain 167 14 -106.11 gain 14 168 -102.86 gain 168 14 -104.70 gain 14 169 -99.02 gain 169 14 -101.97 gain 14 170 -102.13 gain 170 14 -104.32 gain 14 171 -94.72 gain 171 14 -97.99 gain 14 172 -96.84 gain 172 14 -98.30 gain 14 173 -93.84 gain 173 14 -99.94 gain 14 174 -92.23 gain 174 14 -94.38 gain 14 175 -88.77 gain 175 14 -92.06 gain 14 176 -96.05 gain 176 14 -98.30 gain 14 177 -94.51 gain 177 14 -99.76 gain 14 178 -86.09 gain 178 14 -84.79 gain 14 179 -83.99 gain 179 14 -82.11 gain 14 180 -100.30 gain 180 14 -107.87 gain 14 181 -98.06 gain 181 14 -99.65 gain 14 182 -104.01 gain 182 14 -106.68 gain 14 183 -96.46 gain 183 14 -99.41 gain 14 184 -102.26 gain 184 14 -107.96 gain 14 185 -93.83 gain 185 14 -103.40 gain 14 186 -94.18 gain 186 14 -99.33 gain 14 187 -98.42 gain 187 14 -101.30 gain 14 188 -100.58 gain 188 14 -105.87 gain 14 189 -90.88 gain 189 14 -90.90 gain 14 190 -98.17 gain 190 14 -102.10 gain 14 191 -102.53 gain 191 14 -105.16 gain 14 192 -92.39 gain 192 14 -93.72 gain 14 193 -91.60 gain 193 14 -91.92 gain 14 194 -96.42 gain 194 14 -97.52 gain 14 195 -105.28 gain 195 14 -104.93 gain 14 196 -103.65 gain 196 14 -107.61 gain 14 197 -105.11 gain 197 14 -104.20 gain 14 198 -101.40 gain 198 14 -105.00 gain 14 199 -90.17 gain 199 14 -93.88 gain 14 200 -93.00 gain 200 14 -98.04 gain 14 201 -98.09 gain 201 14 -103.04 gain 14 202 -103.98 gain 202 14 -108.07 gain 14 203 -90.14 gain 203 14 -93.35 gain 14 204 -94.55 gain 204 14 -94.39 gain 14 205 -94.01 gain 205 14 -97.60 gain 14 206 -99.44 gain 206 14 -104.13 gain 14 207 -97.99 gain 207 14 -102.10 gain 14 208 -103.50 gain 208 14 -110.22 gain 14 209 -102.25 gain 209 14 -108.53 gain 14 210 -99.34 gain 210 14 -105.80 gain 14 211 -96.94 gain 211 14 -98.64 gain 14 212 -99.95 gain 212 14 -104.66 gain 14 213 -101.27 gain 213 14 -105.30 gain 14 214 -98.72 gain 214 14 -108.14 gain 14 215 -102.36 gain 215 14 -107.18 gain 14 216 -104.13 gain 216 14 -112.86 gain 14 217 -93.75 gain 217 14 -102.75 gain 14 218 -103.85 gain 218 14 -105.65 gain 14 219 -99.86 gain 219 14 -102.14 gain 14 220 -91.69 gain 220 14 -90.06 gain 14 221 -99.29 gain 221 14 -103.34 gain 14 222 -95.31 gain 222 14 -95.16 gain 14 223 -96.85 gain 223 14 -99.95 gain 14 224 -94.48 gain 224 14 -98.05 gain 15 16 -65.56 gain 16 15 -67.68 gain 15 17 -78.52 gain 17 15 -78.54 gain 15 18 -76.75 gain 18 15 -77.86 gain 15 19 -93.55 gain 19 15 -95.40 gain 15 20 -90.75 gain 20 15 -93.80 gain 15 21 -88.51 gain 21 15 -90.67 gain 15 22 -87.69 gain 22 15 -88.31 gain 15 23 -91.98 gain 23 15 -89.77 gain 15 24 -92.59 gain 24 15 -92.00 gain 15 25 -87.69 gain 25 15 -89.78 gain 15 26 -97.84 gain 26 15 -101.36 gain 15 27 -96.79 gain 27 15 -97.92 gain 15 28 -101.04 gain 28 15 -97.49 gain 15 29 -101.61 gain 29 15 -99.62 gain 15 30 -70.70 gain 30 15 -73.71 gain 15 31 -70.38 gain 31 15 -69.95 gain 15 32 -77.23 gain 32 15 -74.16 gain 15 33 -82.27 gain 33 15 -80.64 gain 15 34 -86.96 gain 34 15 -85.97 gain 15 35 -79.43 gain 35 15 -79.38 gain 15 36 -83.02 gain 36 15 -83.12 gain 15 37 -89.66 gain 37 15 -92.29 gain 15 38 -96.36 gain 38 15 -96.53 gain 15 39 -94.49 gain 39 15 -98.98 gain 15 40 -92.25 gain 40 15 -91.72 gain 15 41 -99.54 gain 41 15 -94.36 gain 15 42 -92.54 gain 42 15 -94.61 gain 15 43 -97.40 gain 43 15 -97.06 gain 15 44 -99.78 gain 44 15 -103.02 gain 15 45 -68.56 gain 45 15 -71.79 gain 15 46 -74.38 gain 46 15 -74.07 gain 15 47 -83.35 gain 47 15 -80.74 gain 15 48 -79.50 gain 48 15 -76.47 gain 15 49 -89.85 gain 49 15 -90.88 gain 15 50 -87.83 gain 50 15 -85.72 gain 15 51 -91.60 gain 51 15 -93.18 gain 15 52 -86.08 gain 52 15 -84.90 gain 15 53 -89.06 gain 53 15 -88.44 gain 15 54 -91.94 gain 54 15 -90.73 gain 15 55 -92.69 gain 55 15 -88.39 gain 15 56 -91.02 gain 56 15 -91.77 gain 15 57 -101.69 gain 57 15 -101.52 gain 15 58 -100.91 gain 58 15 -97.44 gain 15 59 -99.43 gain 59 15 -95.21 gain 15 60 -73.76 gain 60 15 -78.82 gain 15 61 -79.54 gain 61 15 -76.50 gain 15 62 -86.33 gain 62 15 -80.80 gain 15 63 -85.30 gain 63 15 -83.74 gain 15 64 -88.00 gain 64 15 -90.67 gain 15 65 -72.79 gain 65 15 -71.00 gain 15 66 -94.63 gain 66 15 -91.83 gain 15 67 -87.89 gain 67 15 -86.32 gain 15 68 -95.92 gain 68 15 -96.93 gain 15 69 -91.23 gain 69 15 -89.46 gain 15 70 -91.87 gain 70 15 -88.56 gain 15 71 -93.11 gain 71 15 -93.37 gain 15 72 -102.47 gain 72 15 -100.29 gain 15 73 -95.92 gain 73 15 -95.11 gain 15 74 -94.64 gain 74 15 -89.94 gain 15 75 -89.82 gain 75 15 -91.01 gain 15 76 -89.80 gain 76 15 -91.12 gain 15 77 -83.42 gain 77 15 -80.74 gain 15 78 -82.96 gain 78 15 -84.78 gain 15 79 -92.15 gain 79 15 -93.59 gain 15 80 -86.82 gain 80 15 -86.05 gain 15 81 -88.62 gain 81 15 -88.76 gain 15 82 -91.48 gain 82 15 -92.60 gain 15 83 -94.33 gain 83 15 -92.71 gain 15 84 -91.27 gain 84 15 -86.85 gain 15 85 -97.89 gain 85 15 -98.89 gain 15 86 -105.04 gain 86 15 -107.68 gain 15 87 -95.42 gain 87 15 -95.34 gain 15 88 -98.36 gain 88 15 -97.93 gain 15 89 -98.44 gain 89 15 -100.15 gain 15 90 -80.83 gain 90 15 -81.88 gain 15 91 -91.23 gain 91 15 -93.35 gain 15 92 -87.56 gain 92 15 -90.60 gain 15 93 -85.58 gain 93 15 -85.98 gain 15 94 -94.58 gain 94 15 -93.55 gain 15 95 -92.95 gain 95 15 -91.15 gain 15 96 -94.75 gain 96 15 -99.93 gain 15 97 -99.14 gain 97 15 -97.14 gain 15 98 -93.97 gain 98 15 -92.44 gain 15 99 -93.45 gain 99 15 -91.06 gain 15 100 -94.96 gain 100 15 -92.48 gain 15 101 -97.72 gain 101 15 -98.88 gain 15 102 -97.81 gain 102 15 -98.92 gain 15 103 -94.03 gain 103 15 -96.32 gain 15 104 -99.80 gain 104 15 -104.57 gain 15 105 -87.42 gain 105 15 -86.71 gain 15 106 -83.76 gain 106 15 -80.38 gain 15 107 -97.84 gain 107 15 -94.37 gain 15 108 -90.04 gain 108 15 -86.19 gain 15 109 -89.70 gain 109 15 -89.30 gain 15 110 -90.07 gain 110 15 -96.03 gain 15 111 -99.00 gain 111 15 -94.92 gain 15 112 -97.18 gain 112 15 -96.57 gain 15 113 -92.55 gain 113 15 -91.06 gain 15 114 -97.10 gain 114 15 -92.78 gain 15 115 -96.37 gain 115 15 -92.71 gain 15 116 -95.20 gain 116 15 -93.97 gain 15 117 -102.86 gain 117 15 -98.78 gain 15 118 -97.68 gain 118 15 -95.21 gain 15 119 -106.04 gain 119 15 -108.63 gain 15 120 -92.04 gain 120 15 -92.02 gain 15 121 -89.65 gain 121 15 -90.65 gain 15 122 -96.76 gain 122 15 -97.51 gain 15 123 -94.78 gain 123 15 -95.87 gain 15 124 -87.88 gain 124 15 -86.96 gain 15 125 -93.85 gain 125 15 -96.27 gain 15 126 -91.11 gain 126 15 -90.18 gain 15 127 -97.59 gain 127 15 -96.28 gain 15 128 -98.40 gain 128 15 -99.69 gain 15 129 -101.75 gain 129 15 -100.25 gain 15 130 -99.95 gain 130 15 -99.74 gain 15 131 -95.63 gain 131 15 -95.19 gain 15 132 -100.74 gain 132 15 -96.31 gain 15 133 -102.29 gain 133 15 -103.04 gain 15 134 -103.69 gain 134 15 -101.30 gain 15 135 -90.17 gain 135 15 -90.09 gain 15 136 -96.67 gain 136 15 -97.02 gain 15 137 -97.63 gain 137 15 -100.89 gain 15 138 -99.97 gain 138 15 -96.77 gain 15 139 -94.47 gain 139 15 -94.54 gain 15 140 -94.92 gain 140 15 -95.82 gain 15 141 -94.80 gain 141 15 -87.66 gain 15 142 -93.64 gain 142 15 -93.25 gain 15 143 -95.48 gain 143 15 -97.82 gain 15 144 -97.85 gain 144 15 -98.56 gain 15 145 -104.26 gain 145 15 -108.36 gain 15 146 -97.64 gain 146 15 -97.73 gain 15 147 -96.82 gain 147 15 -94.01 gain 15 148 -103.09 gain 148 15 -98.61 gain 15 149 -99.81 gain 149 15 -98.99 gain 15 150 -96.27 gain 150 15 -96.29 gain 15 151 -89.77 gain 151 15 -88.72 gain 15 152 -96.52 gain 152 15 -95.30 gain 15 153 -92.42 gain 153 15 -90.41 gain 15 154 -95.36 gain 154 15 -95.25 gain 15 155 -98.62 gain 155 15 -97.08 gain 15 156 -93.60 gain 156 15 -91.29 gain 15 157 -101.37 gain 157 15 -101.54 gain 15 158 -95.83 gain 158 15 -95.51 gain 15 159 -102.16 gain 159 15 -104.22 gain 15 160 -99.99 gain 160 15 -99.20 gain 15 161 -101.42 gain 161 15 -103.07 gain 15 162 -99.28 gain 162 15 -100.64 gain 15 163 -104.51 gain 163 15 -107.79 gain 15 164 -105.77 gain 164 15 -108.42 gain 15 165 -94.86 gain 165 15 -94.56 gain 15 166 -94.51 gain 166 15 -93.97 gain 15 167 -94.84 gain 167 15 -95.02 gain 15 168 -99.79 gain 168 15 -98.86 gain 15 169 -95.29 gain 169 15 -95.48 gain 15 170 -96.03 gain 170 15 -95.46 gain 15 171 -101.50 gain 171 15 -102.01 gain 15 172 -87.52 gain 172 15 -86.21 gain 15 173 -97.86 gain 173 15 -101.20 gain 15 174 -96.21 gain 174 15 -95.59 gain 15 175 -100.00 gain 175 15 -100.52 gain 15 176 -102.00 gain 176 15 -101.49 gain 15 177 -108.83 gain 177 15 -111.33 gain 15 178 -102.19 gain 178 15 -98.13 gain 15 179 -106.53 gain 179 15 -101.88 gain 15 180 -96.18 gain 180 15 -100.98 gain 15 181 -99.17 gain 181 15 -98.00 gain 15 182 -97.79 gain 182 15 -97.70 gain 15 183 -92.23 gain 183 15 -92.42 gain 15 184 -98.00 gain 184 15 -100.93 gain 15 185 -97.70 gain 185 15 -104.50 gain 15 186 -102.94 gain 186 15 -105.32 gain 15 187 -100.02 gain 187 15 -100.13 gain 15 188 -97.82 gain 188 15 -100.34 gain 15 189 -97.67 gain 189 15 -94.92 gain 15 190 -100.22 gain 190 15 -101.38 gain 15 191 -109.02 gain 191 15 -108.89 gain 15 192 -104.14 gain 192 15 -102.70 gain 15 193 -107.21 gain 193 15 -104.76 gain 15 194 -108.70 gain 194 15 -107.04 gain 15 195 -93.77 gain 195 15 -90.65 gain 15 196 -97.38 gain 196 15 -98.57 gain 15 197 -98.59 gain 197 15 -94.92 gain 15 198 -98.69 gain 198 15 -99.53 gain 15 199 -94.31 gain 199 15 -95.26 gain 15 200 -94.20 gain 200 15 -96.49 gain 15 201 -93.30 gain 201 15 -95.49 gain 15 202 -103.91 gain 202 15 -105.24 gain 15 203 -92.59 gain 203 15 -93.03 gain 15 204 -99.55 gain 204 15 -96.63 gain 15 205 -107.25 gain 205 15 -108.07 gain 15 206 -102.91 gain 206 15 -104.84 gain 15 207 -104.28 gain 207 15 -105.63 gain 15 208 -106.04 gain 208 15 -109.99 gain 15 209 -101.46 gain 209 15 -104.99 gain 15 210 -102.08 gain 210 15 -105.77 gain 15 211 -95.78 gain 211 15 -94.71 gain 15 212 -93.85 gain 212 15 -95.79 gain 15 213 -102.49 gain 213 15 -103.75 gain 15 214 -93.03 gain 214 15 -99.69 gain 15 215 -102.08 gain 215 15 -104.14 gain 15 216 -96.54 gain 216 15 -102.51 gain 15 217 -101.75 gain 217 15 -107.98 gain 15 218 -98.86 gain 218 15 -97.89 gain 15 219 -97.99 gain 219 15 -97.51 gain 15 220 -106.66 gain 220 15 -102.26 gain 15 221 -103.93 gain 221 15 -105.21 gain 15 222 -104.96 gain 222 15 -102.05 gain 15 223 -98.82 gain 223 15 -99.15 gain 15 224 -94.01 gain 224 15 -94.81 gain 16 17 -67.84 gain 17 16 -65.73 gain 16 18 -74.73 gain 18 16 -73.71 gain 16 19 -78.96 gain 19 16 -78.67 gain 16 20 -77.90 gain 20 16 -78.82 gain 16 21 -92.90 gain 21 16 -92.93 gain 16 22 -84.84 gain 22 16 -83.33 gain 16 23 -102.98 gain 23 16 -98.64 gain 16 24 -93.78 gain 24 16 -91.06 gain 16 25 -98.03 gain 25 16 -97.99 gain 16 26 -99.79 gain 26 16 -101.18 gain 16 27 -100.66 gain 27 16 -99.66 gain 16 28 -90.51 gain 28 16 -84.84 gain 16 29 -107.06 gain 29 16 -102.94 gain 16 30 -72.82 gain 30 16 -73.70 gain 16 31 -71.88 gain 31 16 -69.32 gain 16 32 -74.26 gain 32 16 -69.06 gain 16 33 -76.90 gain 33 16 -73.14 gain 16 34 -89.62 gain 34 16 -86.50 gain 16 35 -88.67 gain 35 16 -86.49 gain 16 36 -84.25 gain 36 16 -82.22 gain 16 37 -80.29 gain 37 16 -80.80 gain 16 38 -92.22 gain 38 16 -90.26 gain 16 39 -83.96 gain 39 16 -86.32 gain 16 40 -95.75 gain 40 16 -93.09 gain 16 41 -98.57 gain 41 16 -91.26 gain 16 42 -97.38 gain 42 16 -97.31 gain 16 43 -101.05 gain 43 16 -98.57 gain 16 44 -105.90 gain 44 16 -107.02 gain 16 45 -79.70 gain 45 16 -80.80 gain 16 46 -68.58 gain 46 16 -66.15 gain 16 47 -78.00 gain 47 16 -73.27 gain 16 48 -89.10 gain 48 16 -83.95 gain 16 49 -88.28 gain 49 16 -87.18 gain 16 50 -86.80 gain 50 16 -82.56 gain 16 51 -89.02 gain 51 16 -88.47 gain 16 52 -86.39 gain 52 16 -83.08 gain 16 53 -94.91 gain 53 16 -92.16 gain 16 54 -92.87 gain 54 16 -89.53 gain 16 55 -96.53 gain 55 16 -90.10 gain 16 56 -98.87 gain 56 16 -97.49 gain 16 57 -100.61 gain 57 16 -98.31 gain 16 58 -94.47 gain 58 16 -88.86 gain 16 59 -104.20 gain 59 16 -97.85 gain 16 60 -90.83 gain 60 16 -93.76 gain 16 61 -86.23 gain 61 16 -81.06 gain 16 62 -87.15 gain 62 16 -79.50 gain 16 63 -84.31 gain 63 16 -80.62 gain 16 64 -83.29 gain 64 16 -83.82 gain 16 65 -88.75 gain 65 16 -84.84 gain 16 66 -92.41 gain 66 16 -87.48 gain 16 67 -99.88 gain 67 16 -96.18 gain 16 68 -97.00 gain 68 16 -95.88 gain 16 69 -94.55 gain 69 16 -90.65 gain 16 70 -99.85 gain 70 16 -94.41 gain 16 71 -90.79 gain 71 16 -88.93 gain 16 72 -98.08 gain 72 16 -93.77 gain 16 73 -94.29 gain 73 16 -91.35 gain 16 74 -102.57 gain 74 16 -95.75 gain 16 75 -80.94 gain 75 16 -80.00 gain 16 76 -85.94 gain 76 16 -85.13 gain 16 77 -88.64 gain 77 16 -83.82 gain 16 78 -90.24 gain 78 16 -89.92 gain 16 79 -89.34 gain 79 16 -88.65 gain 16 80 -88.94 gain 80 16 -86.04 gain 16 81 -88.50 gain 81 16 -86.51 gain 16 82 -91.23 gain 82 16 -90.21 gain 16 83 -91.13 gain 83 16 -87.38 gain 16 84 -102.70 gain 84 16 -96.14 gain 16 85 -99.33 gain 85 16 -98.20 gain 16 86 -93.96 gain 86 16 -94.47 gain 16 87 -101.43 gain 87 16 -99.23 gain 16 88 -106.64 gain 88 16 -104.08 gain 16 89 -99.55 gain 89 16 -99.14 gain 16 90 -87.19 gain 90 16 -86.11 gain 16 91 -86.46 gain 91 16 -86.45 gain 16 92 -85.13 gain 92 16 -86.05 gain 16 93 -86.86 gain 93 16 -85.13 gain 16 94 -90.78 gain 94 16 -87.62 gain 16 95 -96.22 gain 95 16 -92.29 gain 16 96 -88.66 gain 96 16 -91.71 gain 16 97 -101.09 gain 97 16 -96.96 gain 16 98 -97.09 gain 98 16 -93.43 gain 16 99 -91.82 gain 99 16 -87.30 gain 16 100 -96.34 gain 100 16 -91.74 gain 16 101 -99.19 gain 101 16 -98.22 gain 16 102 -102.09 gain 102 16 -101.08 gain 16 103 -101.05 gain 103 16 -101.20 gain 16 104 -98.62 gain 104 16 -101.26 gain 16 105 -92.06 gain 105 16 -89.23 gain 16 106 -85.83 gain 106 16 -80.32 gain 16 107 -86.73 gain 107 16 -81.12 gain 16 108 -92.16 gain 108 16 -86.18 gain 16 109 -91.00 gain 109 16 -88.47 gain 16 110 -93.65 gain 110 16 -97.48 gain 16 111 -98.09 gain 111 16 -91.89 gain 16 112 -98.70 gain 112 16 -95.96 gain 16 113 -95.43 gain 113 16 -91.82 gain 16 114 -96.05 gain 114 16 -89.61 gain 16 115 -95.79 gain 115 16 -90.01 gain 16 116 -97.48 gain 116 16 -94.12 gain 16 117 -98.67 gain 117 16 -92.45 gain 16 118 -104.50 gain 118 16 -99.91 gain 16 119 -93.42 gain 119 16 -93.88 gain 16 120 -95.05 gain 120 16 -92.90 gain 16 121 -86.63 gain 121 16 -85.50 gain 16 122 -86.90 gain 122 16 -85.52 gain 16 123 -97.87 gain 123 16 -96.84 gain 16 124 -98.44 gain 124 16 -95.39 gain 16 125 -94.95 gain 125 16 -95.24 gain 16 126 -96.80 gain 126 16 -93.74 gain 16 127 -101.63 gain 127 16 -98.19 gain 16 128 -94.74 gain 128 16 -93.90 gain 16 129 -94.28 gain 129 16 -90.65 gain 16 130 -99.68 gain 130 16 -97.34 gain 16 131 -102.79 gain 131 16 -100.23 gain 16 132 -96.31 gain 132 16 -89.75 gain 16 133 -102.09 gain 133 16 -100.71 gain 16 134 -105.65 gain 134 16 -101.13 gain 16 135 -90.63 gain 135 16 -88.41 gain 16 136 -91.45 gain 136 16 -89.68 gain 16 137 -94.06 gain 137 16 -95.20 gain 16 138 -92.79 gain 138 16 -87.46 gain 16 139 -100.59 gain 139 16 -98.53 gain 16 140 -96.02 gain 140 16 -94.78 gain 16 141 -102.97 gain 141 16 -93.71 gain 16 142 -92.45 gain 142 16 -89.93 gain 16 143 -103.18 gain 143 16 -103.39 gain 16 144 -99.78 gain 144 16 -98.36 gain 16 145 -96.81 gain 145 16 -98.78 gain 16 146 -102.93 gain 146 16 -100.88 gain 16 147 -93.46 gain 147 16 -88.53 gain 16 148 -99.44 gain 148 16 -92.83 gain 16 149 -99.41 gain 149 16 -96.46 gain 16 150 -103.69 gain 150 16 -101.57 gain 16 151 -97.15 gain 151 16 -93.98 gain 16 152 -92.07 gain 152 16 -88.71 gain 16 153 -102.03 gain 153 16 -97.89 gain 16 154 -94.46 gain 154 16 -92.22 gain 16 155 -93.75 gain 155 16 -90.08 gain 16 156 -99.38 gain 156 16 -94.94 gain 16 157 -96.54 gain 157 16 -94.59 gain 16 158 -105.03 gain 158 16 -102.58 gain 16 159 -100.56 gain 159 16 -100.49 gain 16 160 -104.32 gain 160 16 -101.40 gain 16 161 -102.76 gain 161 16 -102.29 gain 16 162 -99.55 gain 162 16 -98.78 gain 16 163 -104.23 gain 163 16 -105.38 gain 16 164 -103.77 gain 164 16 -104.28 gain 16 165 -93.66 gain 165 16 -91.24 gain 16 166 -96.83 gain 166 16 -94.16 gain 16 167 -102.02 gain 167 16 -100.07 gain 16 168 -94.48 gain 168 16 -91.43 gain 16 169 -95.13 gain 169 16 -93.19 gain 16 170 -92.07 gain 170 16 -89.36 gain 16 171 -93.11 gain 171 16 -91.48 gain 16 172 -100.05 gain 172 16 -96.61 gain 16 173 -97.28 gain 173 16 -98.49 gain 16 174 -109.06 gain 174 16 -106.31 gain 16 175 -99.17 gain 175 16 -97.56 gain 16 176 -91.39 gain 176 16 -88.75 gain 16 177 -104.68 gain 177 16 -105.04 gain 16 178 -99.60 gain 178 16 -93.41 gain 16 179 -99.11 gain 179 16 -92.34 gain 16 180 -101.75 gain 180 16 -104.43 gain 16 181 -94.25 gain 181 16 -90.94 gain 16 182 -102.02 gain 182 16 -99.81 gain 16 183 -101.59 gain 183 16 -99.65 gain 16 184 -95.48 gain 184 16 -96.29 gain 16 185 -104.58 gain 185 16 -109.25 gain 16 186 -101.74 gain 186 16 -101.99 gain 16 187 -100.27 gain 187 16 -98.25 gain 16 188 -99.47 gain 188 16 -99.86 gain 16 189 -103.18 gain 189 16 -98.30 gain 16 190 -108.05 gain 190 16 -107.08 gain 16 191 -109.43 gain 191 16 -107.17 gain 16 192 -105.45 gain 192 16 -101.88 gain 16 193 -106.46 gain 193 16 -101.88 gain 16 194 -108.37 gain 194 16 -104.57 gain 16 195 -99.79 gain 195 16 -94.54 gain 16 196 -100.01 gain 196 16 -99.07 gain 16 197 -98.73 gain 197 16 -92.93 gain 16 198 -99.99 gain 198 16 -98.70 gain 16 199 -101.50 gain 199 16 -100.31 gain 16 200 -95.89 gain 200 16 -96.05 gain 16 201 -106.55 gain 201 16 -106.61 gain 16 202 -102.43 gain 202 16 -101.62 gain 16 203 -105.27 gain 203 16 -103.58 gain 16 204 -98.20 gain 204 16 -93.16 gain 16 205 -98.78 gain 205 16 -97.47 gain 16 206 -107.27 gain 206 16 -107.08 gain 16 207 -96.08 gain 207 16 -95.30 gain 16 208 -113.17 gain 208 16 -115.00 gain 16 209 -104.67 gain 209 16 -106.06 gain 16 210 -100.51 gain 210 16 -102.07 gain 16 211 -100.32 gain 211 16 -97.12 gain 16 212 -108.25 gain 212 16 -108.07 gain 16 213 -97.81 gain 213 16 -96.95 gain 16 214 -102.85 gain 214 16 -107.37 gain 16 215 -100.99 gain 215 16 -100.92 gain 16 216 -100.46 gain 216 16 -104.30 gain 16 217 -102.03 gain 217 16 -106.13 gain 16 218 -99.84 gain 218 16 -96.75 gain 16 219 -101.08 gain 219 16 -98.47 gain 16 220 -101.06 gain 220 16 -94.54 gain 16 221 -95.11 gain 221 16 -94.26 gain 16 222 -103.15 gain 222 16 -98.11 gain 16 223 -106.92 gain 223 16 -105.12 gain 16 224 -103.00 gain 224 16 -101.67 gain 17 18 -66.97 gain 18 17 -68.05 gain 17 19 -70.08 gain 19 17 -71.91 gain 17 20 -77.99 gain 20 17 -81.01 gain 17 21 -85.61 gain 21 17 -87.75 gain 17 22 -86.28 gain 22 17 -86.88 gain 17 23 -87.26 gain 23 17 -85.03 gain 17 24 -92.45 gain 24 17 -91.84 gain 17 25 -95.38 gain 25 17 -97.45 gain 17 26 -86.70 gain 26 17 -90.19 gain 17 27 -93.15 gain 27 17 -94.26 gain 17 28 -102.52 gain 28 17 -98.95 gain 17 29 -95.34 gain 29 17 -93.32 gain 17 30 -74.99 gain 30 17 -77.97 gain 17 31 -70.51 gain 31 17 -70.05 gain 17 32 -67.03 gain 32 17 -63.93 gain 17 33 -62.76 gain 33 17 -61.11 gain 17 34 -73.39 gain 34 17 -72.37 gain 17 35 -80.74 gain 35 17 -80.66 gain 17 36 -82.08 gain 36 17 -82.16 gain 17 37 -85.23 gain 37 17 -87.84 gain 17 38 -88.85 gain 38 17 -88.99 gain 17 39 -93.07 gain 39 17 -97.54 gain 17 40 -93.49 gain 40 17 -92.94 gain 17 41 -95.16 gain 41 17 -89.95 gain 17 42 -98.59 gain 42 17 -100.62 gain 17 43 -90.06 gain 43 17 -89.69 gain 17 44 -99.56 gain 44 17 -102.79 gain 17 45 -74.26 gain 45 17 -77.47 gain 17 46 -75.22 gain 46 17 -74.89 gain 17 47 -74.64 gain 47 17 -72.01 gain 17 48 -76.82 gain 48 17 -73.77 gain 17 49 -77.56 gain 49 17 -78.57 gain 17 50 -79.72 gain 50 17 -77.59 gain 17 51 -83.84 gain 51 17 -85.40 gain 17 52 -83.94 gain 52 17 -82.74 gain 17 53 -91.07 gain 53 17 -90.43 gain 17 54 -97.27 gain 54 17 -96.03 gain 17 55 -95.30 gain 55 17 -90.98 gain 17 56 -92.50 gain 56 17 -93.23 gain 17 57 -91.19 gain 57 17 -91.00 gain 17 58 -99.73 gain 58 17 -96.23 gain 17 59 -99.42 gain 59 17 -95.17 gain 17 60 -82.50 gain 60 17 -87.53 gain 17 61 -77.58 gain 61 17 -74.52 gain 17 62 -83.03 gain 62 17 -77.48 gain 17 63 -79.55 gain 63 17 -77.96 gain 17 64 -82.37 gain 64 17 -85.01 gain 17 65 -83.91 gain 65 17 -82.10 gain 17 66 -88.72 gain 66 17 -85.89 gain 17 67 -95.26 gain 67 17 -93.66 gain 17 68 -87.95 gain 68 17 -88.94 gain 17 69 -98.25 gain 69 17 -96.46 gain 17 70 -93.14 gain 70 17 -89.81 gain 17 71 -96.36 gain 71 17 -96.60 gain 17 72 -92.31 gain 72 17 -90.11 gain 17 73 -97.57 gain 73 17 -96.74 gain 17 74 -89.30 gain 74 17 -84.58 gain 17 75 -85.85 gain 75 17 -87.02 gain 17 76 -81.20 gain 76 17 -82.50 gain 17 77 -85.71 gain 77 17 -83.00 gain 17 78 -85.12 gain 78 17 -86.91 gain 17 79 -88.61 gain 79 17 -90.03 gain 17 80 -90.82 gain 80 17 -90.03 gain 17 81 -86.22 gain 81 17 -86.33 gain 17 82 -88.66 gain 82 17 -89.76 gain 17 83 -90.23 gain 83 17 -88.59 gain 17 84 -91.10 gain 84 17 -86.65 gain 17 85 -91.48 gain 85 17 -92.46 gain 17 86 -99.69 gain 86 17 -102.30 gain 17 87 -95.03 gain 87 17 -94.94 gain 17 88 -99.99 gain 88 17 -99.53 gain 17 89 -97.01 gain 89 17 -98.70 gain 17 90 -89.34 gain 90 17 -90.37 gain 17 91 -81.33 gain 91 17 -83.43 gain 17 92 -86.84 gain 92 17 -89.85 gain 17 93 -82.45 gain 93 17 -82.82 gain 17 94 -86.97 gain 94 17 -85.91 gain 17 95 -90.31 gain 95 17 -88.50 gain 17 96 -92.56 gain 96 17 -97.71 gain 17 97 -86.72 gain 97 17 -84.70 gain 17 98 -90.28 gain 98 17 -88.72 gain 17 99 -98.13 gain 99 17 -95.71 gain 17 100 -89.03 gain 100 17 -86.53 gain 17 101 -106.18 gain 101 17 -107.31 gain 17 102 -105.47 gain 102 17 -106.57 gain 17 103 -93.36 gain 103 17 -95.63 gain 17 104 -99.48 gain 104 17 -104.22 gain 17 105 -97.22 gain 105 17 -96.49 gain 17 106 -88.40 gain 106 17 -85.00 gain 17 107 -94.93 gain 107 17 -91.43 gain 17 108 -95.30 gain 108 17 -91.42 gain 17 109 -94.01 gain 109 17 -93.58 gain 17 110 -86.09 gain 110 17 -92.02 gain 17 111 -89.12 gain 111 17 -85.02 gain 17 112 -92.38 gain 112 17 -91.74 gain 17 113 -100.17 gain 113 17 -98.67 gain 17 114 -90.76 gain 114 17 -86.42 gain 17 115 -93.31 gain 115 17 -89.63 gain 17 116 -99.59 gain 116 17 -98.34 gain 17 117 -100.05 gain 117 17 -95.95 gain 17 118 -105.24 gain 118 17 -102.75 gain 17 119 -101.40 gain 119 17 -103.97 gain 17 120 -95.00 gain 120 17 -94.95 gain 17 121 -86.12 gain 121 17 -87.10 gain 17 122 -93.02 gain 122 17 -93.75 gain 17 123 -91.99 gain 123 17 -93.06 gain 17 124 -87.33 gain 124 17 -86.39 gain 17 125 -92.19 gain 125 17 -94.59 gain 17 126 -87.59 gain 126 17 -86.64 gain 17 127 -93.52 gain 127 17 -92.19 gain 17 128 -93.25 gain 128 17 -94.51 gain 17 129 -98.47 gain 129 17 -96.95 gain 17 130 -97.34 gain 130 17 -97.11 gain 17 131 -95.54 gain 131 17 -95.08 gain 17 132 -96.39 gain 132 17 -91.93 gain 17 133 -100.59 gain 133 17 -101.32 gain 17 134 -99.14 gain 134 17 -96.73 gain 17 135 -90.33 gain 135 17 -90.22 gain 17 136 -89.55 gain 136 17 -89.89 gain 17 137 -98.30 gain 137 17 -101.55 gain 17 138 -92.61 gain 138 17 -89.39 gain 17 139 -94.10 gain 139 17 -94.14 gain 17 140 -94.46 gain 140 17 -95.33 gain 17 141 -95.70 gain 141 17 -88.54 gain 17 142 -91.79 gain 142 17 -91.38 gain 17 143 -91.38 gain 143 17 -93.70 gain 17 144 -94.17 gain 144 17 -94.86 gain 17 145 -93.66 gain 145 17 -97.73 gain 17 146 -95.52 gain 146 17 -95.59 gain 17 147 -104.11 gain 147 17 -101.28 gain 17 148 -105.70 gain 148 17 -101.20 gain 17 149 -91.65 gain 149 17 -90.81 gain 17 150 -96.08 gain 150 17 -96.07 gain 17 151 -99.28 gain 151 17 -98.21 gain 17 152 -86.20 gain 152 17 -84.95 gain 17 153 -97.50 gain 153 17 -95.46 gain 17 154 -91.46 gain 154 17 -91.33 gain 17 155 -92.13 gain 155 17 -90.57 gain 17 156 -99.01 gain 156 17 -96.68 gain 17 157 -98.23 gain 157 17 -98.38 gain 17 158 -94.26 gain 158 17 -93.91 gain 17 159 -97.33 gain 159 17 -99.36 gain 17 160 -94.57 gain 160 17 -93.76 gain 17 161 -96.91 gain 161 17 -98.54 gain 17 162 -98.00 gain 162 17 -99.34 gain 17 163 -102.89 gain 163 17 -106.14 gain 17 164 -105.76 gain 164 17 -108.38 gain 17 165 -96.82 gain 165 17 -96.50 gain 17 166 -97.94 gain 166 17 -97.38 gain 17 167 -95.05 gain 167 17 -95.21 gain 17 168 -94.95 gain 168 17 -94.00 gain 17 169 -98.19 gain 169 17 -98.36 gain 17 170 -95.09 gain 170 17 -94.49 gain 17 171 -99.10 gain 171 17 -99.58 gain 17 172 -101.53 gain 172 17 -100.20 gain 17 173 -92.26 gain 173 17 -95.57 gain 17 174 -96.74 gain 174 17 -96.10 gain 17 175 -104.94 gain 175 17 -105.44 gain 17 176 -100.85 gain 176 17 -100.32 gain 17 177 -100.10 gain 177 17 -102.57 gain 17 178 -98.68 gain 178 17 -94.59 gain 17 179 -95.08 gain 179 17 -90.41 gain 17 180 -96.24 gain 180 17 -101.03 gain 17 181 -103.79 gain 181 17 -102.59 gain 17 182 -97.02 gain 182 17 -96.91 gain 17 183 -99.96 gain 183 17 -100.13 gain 17 184 -102.61 gain 184 17 -105.52 gain 17 185 -97.95 gain 185 17 -104.73 gain 17 186 -95.00 gain 186 17 -97.36 gain 17 187 -93.39 gain 187 17 -93.47 gain 17 188 -110.20 gain 188 17 -112.70 gain 17 189 -93.52 gain 189 17 -90.74 gain 17 190 -102.30 gain 190 17 -103.44 gain 17 191 -102.01 gain 191 17 -101.86 gain 17 192 -101.47 gain 192 17 -100.01 gain 17 193 -95.11 gain 193 17 -92.64 gain 17 194 -112.28 gain 194 17 -110.59 gain 17 195 -93.38 gain 195 17 -90.24 gain 17 196 -96.70 gain 196 17 -97.87 gain 17 197 -105.14 gain 197 17 -101.44 gain 17 198 -99.36 gain 198 17 -100.17 gain 17 199 -100.95 gain 199 17 -101.87 gain 17 200 -99.61 gain 200 17 -101.87 gain 17 201 -98.97 gain 201 17 -101.14 gain 17 202 -93.34 gain 202 17 -94.64 gain 17 203 -98.24 gain 203 17 -98.66 gain 17 204 -101.51 gain 204 17 -98.57 gain 17 205 -97.29 gain 205 17 -98.09 gain 17 206 -97.35 gain 206 17 -99.26 gain 17 207 -95.92 gain 207 17 -97.24 gain 17 208 -100.99 gain 208 17 -104.92 gain 17 209 -104.24 gain 209 17 -107.74 gain 17 210 -100.35 gain 210 17 -104.03 gain 17 211 -104.95 gain 211 17 -103.85 gain 17 212 -104.41 gain 212 17 -106.32 gain 17 213 -98.26 gain 213 17 -99.51 gain 17 214 -93.80 gain 214 17 -100.44 gain 17 215 -103.00 gain 215 17 -105.04 gain 17 216 -95.28 gain 216 17 -101.23 gain 17 217 -101.54 gain 217 17 -107.74 gain 17 218 -99.99 gain 218 17 -99.01 gain 17 219 -104.14 gain 219 17 -103.63 gain 17 220 -101.13 gain 220 17 -96.71 gain 17 221 -98.27 gain 221 17 -99.53 gain 17 222 -109.10 gain 222 17 -106.16 gain 17 223 -95.99 gain 223 17 -96.29 gain 17 224 -107.65 gain 224 17 -108.43 gain 18 19 -67.62 gain 19 18 -68.36 gain 18 20 -70.26 gain 20 18 -72.21 gain 18 21 -78.11 gain 21 18 -79.17 gain 18 22 -86.29 gain 22 18 -85.81 gain 18 23 -99.10 gain 23 18 -95.79 gain 18 24 -91.20 gain 24 18 -89.51 gain 18 25 -96.51 gain 25 18 -97.50 gain 18 26 -90.59 gain 26 18 -93.01 gain 18 27 -94.36 gain 27 18 -94.38 gain 18 28 -95.02 gain 28 18 -90.37 gain 18 29 -94.36 gain 29 18 -91.25 gain 18 30 -80.73 gain 30 18 -82.64 gain 18 31 -76.34 gain 31 18 -74.81 gain 18 32 -78.83 gain 32 18 -74.65 gain 18 33 -64.81 gain 33 18 -62.07 gain 18 34 -74.08 gain 34 18 -71.98 gain 18 35 -75.85 gain 35 18 -74.69 gain 18 36 -85.54 gain 36 18 -84.54 gain 18 37 -86.67 gain 37 18 -88.20 gain 18 38 -95.06 gain 38 18 -94.13 gain 18 39 -95.52 gain 39 18 -98.91 gain 18 40 -87.91 gain 40 18 -86.27 gain 18 41 -99.15 gain 41 18 -92.86 gain 18 42 -92.93 gain 42 18 -93.89 gain 18 43 -93.87 gain 43 18 -92.42 gain 18 44 -97.57 gain 44 18 -99.71 gain 18 45 -81.91 gain 45 18 -84.03 gain 18 46 -85.40 gain 46 18 -83.99 gain 18 47 -75.96 gain 47 18 -72.25 gain 18 48 -74.73 gain 48 18 -70.60 gain 18 49 -78.68 gain 49 18 -78.61 gain 18 50 -77.68 gain 50 18 -74.47 gain 18 51 -82.97 gain 51 18 -83.45 gain 18 52 -85.03 gain 52 18 -82.75 gain 18 53 -89.98 gain 53 18 -88.25 gain 18 54 -94.41 gain 54 18 -92.09 gain 18 55 -82.63 gain 55 18 -77.23 gain 18 56 -94.57 gain 56 18 -94.21 gain 18 57 -88.72 gain 57 18 -87.45 gain 18 58 -101.43 gain 58 18 -96.85 gain 18 59 -102.63 gain 59 18 -97.30 gain 18 60 -83.17 gain 60 18 -87.12 gain 18 61 -85.35 gain 61 18 -81.20 gain 18 62 -79.41 gain 62 18 -72.77 gain 18 63 -75.83 gain 63 18 -73.17 gain 18 64 -74.30 gain 64 18 -75.85 gain 18 65 -77.69 gain 65 18 -74.79 gain 18 66 -87.62 gain 66 18 -83.71 gain 18 67 -81.45 gain 67 18 -78.77 gain 18 68 -86.30 gain 68 18 -86.21 gain 18 69 -84.72 gain 69 18 -81.84 gain 18 70 -90.47 gain 70 18 -86.06 gain 18 71 -92.59 gain 71 18 -91.75 gain 18 72 -98.97 gain 72 18 -95.68 gain 18 73 -95.67 gain 73 18 -93.75 gain 18 74 -96.00 gain 74 18 -90.20 gain 18 75 -87.73 gain 75 18 -87.82 gain 18 76 -90.69 gain 76 18 -90.90 gain 18 77 -77.98 gain 77 18 -74.19 gain 18 78 -80.40 gain 78 18 -81.11 gain 18 79 -76.78 gain 79 18 -77.11 gain 18 80 -86.92 gain 80 18 -85.04 gain 18 81 -90.54 gain 81 18 -89.58 gain 18 82 -86.07 gain 82 18 -86.08 gain 18 83 -89.41 gain 83 18 -86.69 gain 18 84 -93.34 gain 84 18 -87.80 gain 18 85 -92.34 gain 85 18 -92.24 gain 18 86 -97.29 gain 86 18 -98.83 gain 18 87 -91.26 gain 87 18 -90.09 gain 18 88 -95.24 gain 88 18 -93.70 gain 18 89 -93.27 gain 89 18 -93.88 gain 18 90 -83.16 gain 90 18 -83.11 gain 18 91 -81.82 gain 91 18 -82.83 gain 18 92 -86.63 gain 92 18 -88.57 gain 18 93 -92.52 gain 93 18 -91.81 gain 18 94 -88.04 gain 94 18 -85.90 gain 18 95 -86.36 gain 95 18 -83.47 gain 18 96 -92.56 gain 96 18 -96.64 gain 18 97 -98.77 gain 97 18 -95.66 gain 18 98 -90.75 gain 98 18 -88.12 gain 18 99 -92.16 gain 99 18 -88.66 gain 18 100 -98.61 gain 100 18 -95.02 gain 18 101 -94.31 gain 101 18 -94.36 gain 18 102 -99.24 gain 102 18 -99.25 gain 18 103 -98.53 gain 103 18 -99.71 gain 18 104 -95.05 gain 104 18 -98.71 gain 18 105 -86.69 gain 105 18 -84.88 gain 18 106 -95.68 gain 106 18 -91.20 gain 18 107 -89.04 gain 107 18 -84.47 gain 18 108 -88.44 gain 108 18 -83.48 gain 18 109 -89.79 gain 109 18 -88.28 gain 18 110 -90.22 gain 110 18 -95.08 gain 18 111 -82.92 gain 111 18 -77.74 gain 18 112 -85.65 gain 112 18 -83.94 gain 18 113 -91.94 gain 113 18 -89.35 gain 18 114 -91.98 gain 114 18 -86.56 gain 18 115 -92.92 gain 115 18 -88.16 gain 18 116 -92.77 gain 116 18 -90.43 gain 18 117 -97.87 gain 117 18 -92.68 gain 18 118 -98.34 gain 118 18 -94.77 gain 18 119 -90.86 gain 119 18 -92.35 gain 18 120 -89.76 gain 120 18 -88.63 gain 18 121 -92.48 gain 121 18 -92.37 gain 18 122 -90.99 gain 122 18 -90.64 gain 18 123 -93.87 gain 123 18 -93.86 gain 18 124 -100.08 gain 124 18 -98.06 gain 18 125 -93.51 gain 125 18 -94.83 gain 18 126 -89.76 gain 126 18 -87.72 gain 18 127 -95.32 gain 127 18 -92.91 gain 18 128 -89.61 gain 128 18 -89.79 gain 18 129 -95.21 gain 129 18 -92.60 gain 18 130 -96.64 gain 130 18 -95.33 gain 18 131 -91.84 gain 131 18 -90.30 gain 18 132 -97.03 gain 132 18 -91.50 gain 18 133 -107.57 gain 133 18 -107.21 gain 18 134 -103.31 gain 134 18 -99.81 gain 18 135 -91.59 gain 135 18 -90.40 gain 18 136 -95.87 gain 136 18 -95.12 gain 18 137 -96.37 gain 137 18 -98.54 gain 18 138 -93.66 gain 138 18 -89.36 gain 18 139 -91.52 gain 139 18 -90.48 gain 18 140 -89.43 gain 140 18 -89.22 gain 18 141 -96.21 gain 141 18 -87.97 gain 18 142 -89.18 gain 142 18 -87.68 gain 18 143 -102.76 gain 143 18 -104.00 gain 18 144 -98.36 gain 144 18 -97.96 gain 18 145 -101.98 gain 145 18 -104.97 gain 18 146 -94.81 gain 146 18 -93.79 gain 18 147 -98.43 gain 147 18 -94.52 gain 18 148 -95.07 gain 148 18 -89.49 gain 18 149 -98.96 gain 149 18 -97.04 gain 18 150 -94.07 gain 150 18 -92.99 gain 18 151 -95.60 gain 151 18 -93.45 gain 18 152 -99.39 gain 152 18 -97.06 gain 18 153 -97.22 gain 153 18 -94.11 gain 18 154 -91.66 gain 154 18 -90.44 gain 18 155 -93.64 gain 155 18 -91.00 gain 18 156 -99.22 gain 156 18 -95.81 gain 18 157 -93.75 gain 157 18 -92.82 gain 18 158 -100.82 gain 158 18 -99.39 gain 18 159 -94.64 gain 159 18 -95.60 gain 18 160 -102.61 gain 160 18 -100.72 gain 18 161 -96.67 gain 161 18 -97.22 gain 18 162 -96.69 gain 162 18 -96.95 gain 18 163 -97.63 gain 163 18 -99.80 gain 18 164 -101.52 gain 164 18 -103.06 gain 18 165 -99.22 gain 165 18 -97.82 gain 18 166 -105.42 gain 166 18 -103.77 gain 18 167 -92.93 gain 167 18 -92.00 gain 18 168 -90.28 gain 168 18 -88.25 gain 18 169 -95.44 gain 169 18 -94.52 gain 18 170 -98.05 gain 170 18 -96.37 gain 18 171 -106.39 gain 171 18 -105.79 gain 18 172 -95.87 gain 172 18 -93.45 gain 18 173 -95.29 gain 173 18 -97.53 gain 18 174 -96.46 gain 174 18 -94.74 gain 18 175 -104.02 gain 175 18 -103.44 gain 18 176 -104.22 gain 176 18 -102.60 gain 18 177 -102.00 gain 177 18 -103.39 gain 18 178 -103.02 gain 178 18 -97.85 gain 18 179 -100.53 gain 179 18 -94.78 gain 18 180 -101.27 gain 180 18 -104.97 gain 18 181 -101.59 gain 181 18 -99.31 gain 18 182 -99.21 gain 182 18 -98.01 gain 18 183 -95.75 gain 183 18 -94.83 gain 18 184 -97.42 gain 184 18 -99.25 gain 18 185 -98.41 gain 185 18 -104.11 gain 18 186 -98.53 gain 186 18 -99.81 gain 18 187 -102.64 gain 187 18 -101.64 gain 18 188 -100.97 gain 188 18 -102.38 gain 18 189 -99.11 gain 189 18 -95.25 gain 18 190 -106.06 gain 190 18 -106.12 gain 18 191 -99.52 gain 191 18 -98.29 gain 18 192 -103.98 gain 192 18 -101.44 gain 18 193 -103.25 gain 193 18 -99.70 gain 18 194 -104.31 gain 194 18 -101.53 gain 18 195 -99.24 gain 195 18 -95.01 gain 18 196 -96.32 gain 196 18 -96.41 gain 18 197 -100.59 gain 197 18 -95.82 gain 18 198 -101.39 gain 198 18 -101.12 gain 18 199 -99.79 gain 199 18 -99.63 gain 18 200 -93.24 gain 200 18 -94.42 gain 18 201 -101.23 gain 201 18 -102.31 gain 18 202 -100.90 gain 202 18 -101.12 gain 18 203 -99.40 gain 203 18 -98.74 gain 18 204 -104.88 gain 204 18 -100.86 gain 18 205 -97.54 gain 205 18 -97.26 gain 18 206 -103.96 gain 206 18 -104.79 gain 18 207 -106.60 gain 207 18 -106.85 gain 18 208 -96.59 gain 208 18 -99.43 gain 18 209 -93.27 gain 209 18 -95.69 gain 18 210 -99.32 gain 210 18 -101.91 gain 18 211 -103.07 gain 211 18 -100.90 gain 18 212 -104.25 gain 212 18 -105.09 gain 18 213 -96.15 gain 213 18 -96.32 gain 18 214 -97.43 gain 214 18 -102.98 gain 18 215 -99.50 gain 215 18 -100.45 gain 18 216 -104.68 gain 216 18 -109.54 gain 18 217 -91.23 gain 217 18 -96.36 gain 18 218 -108.01 gain 218 18 -105.94 gain 18 219 -95.18 gain 219 18 -93.60 gain 18 220 -95.60 gain 220 18 -90.10 gain 18 221 -109.21 gain 221 18 -109.39 gain 18 222 -99.37 gain 222 18 -95.35 gain 18 223 -99.86 gain 223 18 -99.09 gain 18 224 -107.33 gain 224 18 -107.03 gain 19 20 -65.14 gain 20 19 -66.35 gain 19 21 -72.10 gain 21 19 -72.42 gain 19 22 -79.82 gain 22 19 -78.60 gain 19 23 -88.34 gain 23 19 -84.29 gain 19 24 -84.29 gain 24 19 -81.86 gain 19 25 -87.26 gain 25 19 -87.50 gain 19 26 -96.68 gain 26 19 -98.36 gain 19 27 -94.31 gain 27 19 -93.60 gain 19 28 -93.55 gain 28 19 -88.16 gain 19 29 -94.33 gain 29 19 -90.49 gain 19 30 -85.04 gain 30 19 -86.20 gain 19 31 -78.25 gain 31 19 -75.97 gain 19 32 -79.66 gain 32 19 -74.73 gain 19 33 -69.76 gain 33 19 -66.28 gain 19 34 -68.33 gain 34 19 -65.49 gain 19 35 -71.74 gain 35 19 -69.84 gain 19 36 -73.94 gain 36 19 -72.19 gain 19 37 -84.62 gain 37 19 -85.41 gain 19 38 -81.49 gain 38 19 -79.81 gain 19 39 -90.39 gain 39 19 -93.03 gain 19 40 -85.35 gain 40 19 -82.98 gain 19 41 -90.78 gain 41 19 -83.75 gain 19 42 -89.93 gain 42 19 -90.14 gain 19 43 -87.94 gain 43 19 -85.75 gain 19 44 -97.70 gain 44 19 -99.10 gain 19 45 -87.89 gain 45 19 -89.28 gain 19 46 -85.35 gain 46 19 -83.20 gain 19 47 -81.89 gain 47 19 -77.44 gain 19 48 -82.49 gain 48 19 -77.62 gain 19 49 -76.01 gain 49 19 -75.20 gain 19 50 -80.82 gain 50 19 -76.87 gain 19 51 -77.06 gain 51 19 -76.80 gain 19 52 -84.93 gain 52 19 -81.90 gain 19 53 -86.21 gain 53 19 -83.74 gain 19 54 -92.42 gain 54 19 -89.36 gain 19 55 -83.24 gain 55 19 -77.10 gain 19 56 -99.34 gain 56 19 -98.25 gain 19 57 -92.55 gain 57 19 -90.53 gain 19 58 -86.47 gain 58 19 -81.15 gain 19 59 -92.73 gain 59 19 -86.66 gain 19 60 -82.40 gain 60 19 -85.61 gain 19 61 -84.22 gain 61 19 -79.34 gain 19 62 -80.80 gain 62 19 -73.43 gain 19 63 -89.30 gain 63 19 -85.89 gain 19 64 -78.64 gain 64 19 -79.46 gain 19 65 -82.57 gain 65 19 -78.94 gain 19 66 -88.27 gain 66 19 -83.62 gain 19 67 -86.20 gain 67 19 -82.78 gain 19 68 -85.51 gain 68 19 -84.67 gain 19 69 -90.80 gain 69 19 -87.18 gain 19 70 -88.90 gain 70 19 -83.75 gain 19 71 -97.28 gain 71 19 -95.70 gain 19 72 -104.37 gain 72 19 -100.35 gain 19 73 -103.76 gain 73 19 -101.11 gain 19 74 -87.37 gain 74 19 -80.82 gain 19 75 -81.02 gain 75 19 -80.37 gain 19 76 -92.53 gain 76 19 -92.00 gain 19 77 -90.99 gain 77 19 -86.46 gain 19 78 -85.56 gain 78 19 -85.53 gain 19 79 -87.14 gain 79 19 -86.74 gain 19 80 -85.37 gain 80 19 -82.75 gain 19 81 -85.96 gain 81 19 -84.25 gain 19 82 -93.31 gain 82 19 -92.58 gain 19 83 -94.78 gain 83 19 -91.32 gain 19 84 -83.42 gain 84 19 -77.15 gain 19 85 -91.59 gain 85 19 -90.75 gain 19 86 -96.62 gain 86 19 -97.42 gain 19 87 -86.45 gain 87 19 -84.53 gain 19 88 -97.75 gain 88 19 -95.47 gain 19 89 -95.70 gain 89 19 -95.56 gain 19 90 -88.72 gain 90 19 -87.93 gain 19 91 -91.44 gain 91 19 -91.72 gain 19 92 -98.84 gain 92 19 -100.03 gain 19 93 -93.63 gain 93 19 -92.18 gain 19 94 -82.12 gain 94 19 -79.24 gain 19 95 -81.69 gain 95 19 -78.05 gain 19 96 -90.69 gain 96 19 -94.02 gain 19 97 -86.10 gain 97 19 -82.25 gain 19 98 -89.65 gain 98 19 -86.28 gain 19 99 -93.79 gain 99 19 -89.55 gain 19 100 -86.85 gain 100 19 -82.53 gain 19 101 -94.40 gain 101 19 -93.71 gain 19 102 -97.65 gain 102 19 -96.92 gain 19 103 -101.11 gain 103 19 -101.55 gain 19 104 -91.38 gain 104 19 -94.30 gain 19 105 -93.34 gain 105 19 -90.79 gain 19 106 -97.29 gain 106 19 -92.07 gain 19 107 -92.07 gain 107 19 -86.76 gain 19 108 -92.87 gain 108 19 -87.17 gain 19 109 -89.57 gain 109 19 -87.32 gain 19 110 -91.26 gain 110 19 -95.37 gain 19 111 -88.07 gain 111 19 -82.16 gain 19 112 -94.62 gain 112 19 -92.17 gain 19 113 -88.24 gain 113 19 -84.91 gain 19 114 -98.78 gain 114 19 -92.62 gain 19 115 -101.24 gain 115 19 -95.74 gain 19 116 -97.73 gain 116 19 -94.66 gain 19 117 -97.41 gain 117 19 -91.49 gain 19 118 -96.18 gain 118 19 -91.87 gain 19 119 -98.09 gain 119 19 -98.84 gain 19 120 -94.28 gain 120 19 -92.42 gain 19 121 -98.40 gain 121 19 -97.56 gain 19 122 -96.07 gain 122 19 -94.98 gain 19 123 -87.57 gain 123 19 -86.82 gain 19 124 -91.60 gain 124 19 -88.84 gain 19 125 -87.73 gain 125 19 -88.31 gain 19 126 -97.11 gain 126 19 -94.34 gain 19 127 -91.97 gain 127 19 -88.82 gain 19 128 -92.72 gain 128 19 -92.16 gain 19 129 -98.18 gain 129 19 -94.84 gain 19 130 -97.78 gain 130 19 -95.73 gain 19 131 -95.03 gain 131 19 -92.75 gain 19 132 -98.77 gain 132 19 -92.49 gain 19 133 -98.94 gain 133 19 -97.85 gain 19 134 -101.49 gain 134 19 -97.25 gain 19 135 -98.91 gain 135 19 -96.98 gain 19 136 -93.25 gain 136 19 -91.76 gain 19 137 -91.23 gain 137 19 -92.66 gain 19 138 -97.72 gain 138 19 -92.67 gain 19 139 -88.74 gain 139 19 -86.96 gain 19 140 -93.24 gain 140 19 -92.29 gain 19 141 -95.38 gain 141 19 -86.40 gain 19 142 -88.85 gain 142 19 -86.62 gain 19 143 -101.06 gain 143 19 -101.56 gain 19 144 -95.76 gain 144 19 -94.62 gain 19 145 -95.03 gain 145 19 -97.29 gain 19 146 -91.22 gain 146 19 -89.46 gain 19 147 -102.14 gain 147 19 -97.49 gain 19 148 -102.57 gain 148 19 -96.25 gain 19 149 -101.93 gain 149 19 -99.26 gain 19 150 -101.16 gain 150 19 -99.33 gain 19 151 -88.20 gain 151 19 -85.31 gain 19 152 -98.93 gain 152 19 -95.86 gain 19 153 -92.85 gain 153 19 -88.99 gain 19 154 -94.43 gain 154 19 -92.48 gain 19 155 -94.96 gain 155 19 -91.58 gain 19 156 -98.58 gain 156 19 -94.43 gain 19 157 -99.31 gain 157 19 -97.64 gain 19 158 -90.33 gain 158 19 -88.16 gain 19 159 -97.95 gain 159 19 -98.17 gain 19 160 -95.00 gain 160 19 -92.37 gain 19 161 -99.22 gain 161 19 -99.02 gain 19 162 -99.67 gain 162 19 -99.19 gain 19 163 -100.19 gain 163 19 -101.62 gain 19 164 -102.99 gain 164 19 -103.79 gain 19 165 -96.43 gain 165 19 -94.29 gain 19 166 -87.69 gain 166 19 -85.30 gain 19 167 -97.12 gain 167 19 -95.46 gain 19 168 -96.15 gain 168 19 -93.38 gain 19 169 -94.12 gain 169 19 -92.46 gain 19 170 -100.92 gain 170 19 -98.49 gain 19 171 -102.13 gain 171 19 -100.79 gain 19 172 -97.75 gain 172 19 -94.60 gain 19 173 -98.07 gain 173 19 -99.56 gain 19 174 -105.28 gain 174 19 -102.82 gain 19 175 -99.51 gain 175 19 -98.19 gain 19 176 -102.63 gain 176 19 -100.28 gain 19 177 -97.42 gain 177 19 -98.06 gain 19 178 -99.89 gain 178 19 -93.98 gain 19 179 -101.95 gain 179 19 -95.46 gain 19 180 -96.28 gain 180 19 -99.24 gain 19 181 -100.14 gain 181 19 -97.12 gain 19 182 -100.77 gain 182 19 -98.84 gain 19 183 -84.19 gain 183 19 -82.53 gain 19 184 -95.61 gain 184 19 -96.70 gain 19 185 -101.19 gain 185 19 -106.15 gain 19 186 -94.23 gain 186 19 -94.77 gain 19 187 -93.12 gain 187 19 -91.39 gain 19 188 -97.11 gain 188 19 -97.79 gain 19 189 -103.27 gain 189 19 -98.67 gain 19 190 -106.62 gain 190 19 -105.93 gain 19 191 -100.73 gain 191 19 -98.76 gain 19 192 -95.51 gain 192 19 -92.23 gain 19 193 -100.22 gain 193 19 -95.93 gain 19 194 -95.10 gain 194 19 -91.59 gain 19 195 -102.85 gain 195 19 -97.88 gain 19 196 -96.03 gain 196 19 -95.38 gain 19 197 -97.76 gain 197 19 -92.24 gain 19 198 -98.46 gain 198 19 -97.46 gain 19 199 -102.68 gain 199 19 -101.78 gain 19 200 -99.17 gain 200 19 -99.61 gain 19 201 -98.52 gain 201 19 -98.87 gain 19 202 -99.99 gain 202 19 -99.47 gain 19 203 -98.51 gain 203 19 -97.10 gain 19 204 -104.15 gain 204 19 -99.39 gain 19 205 -104.50 gain 205 19 -103.48 gain 19 206 -96.45 gain 206 19 -96.54 gain 19 207 -103.27 gain 207 19 -102.78 gain 19 208 -105.97 gain 208 19 -108.08 gain 19 209 -101.39 gain 209 19 -103.06 gain 19 210 -107.02 gain 210 19 -108.88 gain 19 211 -96.89 gain 211 19 -93.97 gain 19 212 -100.23 gain 212 19 -100.32 gain 19 213 -104.53 gain 213 19 -103.96 gain 19 214 -106.46 gain 214 19 -111.27 gain 19 215 -92.85 gain 215 19 -93.06 gain 19 216 -113.44 gain 216 19 -117.56 gain 19 217 -106.76 gain 217 19 -111.14 gain 19 218 -102.49 gain 218 19 -99.68 gain 19 219 -105.63 gain 219 19 -103.31 gain 19 220 -101.86 gain 220 19 -95.62 gain 19 221 -102.86 gain 221 19 -102.30 gain 19 222 -98.71 gain 222 19 -93.95 gain 19 223 -98.53 gain 223 19 -97.01 gain 19 224 -100.35 gain 224 19 -99.30 gain 20 21 -73.78 gain 21 20 -72.89 gain 20 22 -80.64 gain 22 20 -78.22 gain 20 23 -77.19 gain 23 20 -71.94 gain 20 24 -83.59 gain 24 20 -79.95 gain 20 25 -92.31 gain 25 20 -91.35 gain 20 26 -90.96 gain 26 20 -91.43 gain 20 27 -90.07 gain 27 20 -88.15 gain 20 28 -83.96 gain 28 20 -77.37 gain 20 29 -92.14 gain 29 20 -87.09 gain 20 30 -89.99 gain 30 20 -89.95 gain 20 31 -98.31 gain 31 20 -94.83 gain 20 32 -78.13 gain 32 20 -72.01 gain 20 33 -77.48 gain 33 20 -72.80 gain 20 34 -63.16 gain 34 20 -59.11 gain 20 35 -67.80 gain 35 20 -64.70 gain 20 36 -77.10 gain 36 20 -74.15 gain 20 37 -83.55 gain 37 20 -83.14 gain 20 38 -84.95 gain 38 20 -82.07 gain 20 39 -86.37 gain 39 20 -87.81 gain 20 40 -97.97 gain 40 20 -94.39 gain 20 41 -87.91 gain 41 20 -79.68 gain 20 42 -94.72 gain 42 20 -93.73 gain 20 43 -100.95 gain 43 20 -97.55 gain 20 44 -104.28 gain 44 20 -104.48 gain 20 45 -89.22 gain 45 20 -89.40 gain 20 46 -87.81 gain 46 20 -84.45 gain 20 47 -84.86 gain 47 20 -79.20 gain 20 48 -78.80 gain 48 20 -72.73 gain 20 49 -78.12 gain 49 20 -76.11 gain 20 50 -78.16 gain 50 20 -73.01 gain 20 51 -79.12 gain 51 20 -77.65 gain 20 52 -84.66 gain 52 20 -80.43 gain 20 53 -85.55 gain 53 20 -81.88 gain 20 54 -88.84 gain 54 20 -84.57 gain 20 55 -94.18 gain 55 20 -86.84 gain 20 56 -91.70 gain 56 20 -89.40 gain 20 57 -92.30 gain 57 20 -89.09 gain 20 58 -93.73 gain 58 20 -87.21 gain 20 59 -101.56 gain 59 20 -94.29 gain 20 60 -93.48 gain 60 20 -95.49 gain 20 61 -92.74 gain 61 20 -86.65 gain 20 62 -88.04 gain 62 20 -79.46 gain 20 63 -84.48 gain 63 20 -79.87 gain 20 64 -95.39 gain 64 20 -95.01 gain 20 65 -85.35 gain 65 20 -80.51 gain 20 66 -85.56 gain 66 20 -79.70 gain 20 67 -83.25 gain 67 20 -78.62 gain 20 68 -86.22 gain 68 20 -84.18 gain 20 69 -87.93 gain 69 20 -83.11 gain 20 70 -94.63 gain 70 20 -88.27 gain 20 71 -89.42 gain 71 20 -86.64 gain 20 72 -100.13 gain 72 20 -94.90 gain 20 73 -91.39 gain 73 20 -87.53 gain 20 74 -101.44 gain 74 20 -93.70 gain 20 75 -89.33 gain 75 20 -87.47 gain 20 76 -86.08 gain 76 20 -84.35 gain 20 77 -96.36 gain 77 20 -90.62 gain 20 78 -84.98 gain 78 20 -83.75 gain 20 79 -82.17 gain 79 20 -80.56 gain 20 80 -88.71 gain 80 20 -84.89 gain 20 81 -85.82 gain 81 20 -82.90 gain 20 82 -86.07 gain 82 20 -84.14 gain 20 83 -87.08 gain 83 20 -82.41 gain 20 84 -89.83 gain 84 20 -82.35 gain 20 85 -99.60 gain 85 20 -97.56 gain 20 86 -97.75 gain 86 20 -97.34 gain 20 87 -89.32 gain 87 20 -86.20 gain 20 88 -89.95 gain 88 20 -86.47 gain 20 89 -99.70 gain 89 20 -98.37 gain 20 90 -95.87 gain 90 20 -93.87 gain 20 91 -91.75 gain 91 20 -90.82 gain 20 92 -88.76 gain 92 20 -88.75 gain 20 93 -83.17 gain 93 20 -80.52 gain 20 94 -90.23 gain 94 20 -86.15 gain 20 95 -86.25 gain 95 20 -81.41 gain 20 96 -85.65 gain 96 20 -87.78 gain 20 97 -92.40 gain 97 20 -87.35 gain 20 98 -85.87 gain 98 20 -81.29 gain 20 99 -87.26 gain 99 20 -81.82 gain 20 100 -88.10 gain 100 20 -82.57 gain 20 101 -91.45 gain 101 20 -89.55 gain 20 102 -95.41 gain 102 20 -93.48 gain 20 103 -95.70 gain 103 20 -94.94 gain 20 104 -100.61 gain 104 20 -102.33 gain 20 105 -100.91 gain 105 20 -97.16 gain 20 106 -96.06 gain 106 20 -89.64 gain 20 107 -90.50 gain 107 20 -83.97 gain 20 108 -90.15 gain 108 20 -83.25 gain 20 109 -89.74 gain 109 20 -86.29 gain 20 110 -89.07 gain 110 20 -91.98 gain 20 111 -95.48 gain 111 20 -88.35 gain 20 112 -86.43 gain 112 20 -82.77 gain 20 113 -88.89 gain 113 20 -84.36 gain 20 114 -92.11 gain 114 20 -84.75 gain 20 115 -97.81 gain 115 20 -91.10 gain 20 116 -92.00 gain 116 20 -87.73 gain 20 117 -94.43 gain 117 20 -87.30 gain 20 118 -98.44 gain 118 20 -92.92 gain 20 119 -98.35 gain 119 20 -97.90 gain 20 120 -99.08 gain 120 20 -96.01 gain 20 121 -92.26 gain 121 20 -90.21 gain 20 122 -96.62 gain 122 20 -94.32 gain 20 123 -90.70 gain 123 20 -88.75 gain 20 124 -95.13 gain 124 20 -91.17 gain 20 125 -87.88 gain 125 20 -87.25 gain 20 126 -96.68 gain 126 20 -92.69 gain 20 127 -97.08 gain 127 20 -92.73 gain 20 128 -88.85 gain 128 20 -87.09 gain 20 129 -92.07 gain 129 20 -87.52 gain 20 130 -93.99 gain 130 20 -90.73 gain 20 131 -95.80 gain 131 20 -92.31 gain 20 132 -93.74 gain 132 20 -86.26 gain 20 133 -85.93 gain 133 20 -83.63 gain 20 134 -102.84 gain 134 20 -97.40 gain 20 135 -105.01 gain 135 20 -101.88 gain 20 136 -92.83 gain 136 20 -90.14 gain 20 137 -101.00 gain 137 20 -101.22 gain 20 138 -92.79 gain 138 20 -86.54 gain 20 139 -100.54 gain 139 20 -97.55 gain 20 140 -96.92 gain 140 20 -94.77 gain 20 141 -95.53 gain 141 20 -85.35 gain 20 142 -92.49 gain 142 20 -89.05 gain 20 143 -92.98 gain 143 20 -92.28 gain 20 144 -98.39 gain 144 20 -96.05 gain 20 145 -94.20 gain 145 20 -95.25 gain 20 146 -95.97 gain 146 20 -93.01 gain 20 147 -97.42 gain 147 20 -91.56 gain 20 148 -102.83 gain 148 20 -95.30 gain 20 149 -103.12 gain 149 20 -99.25 gain 20 150 -100.49 gain 150 20 -97.45 gain 20 151 -96.78 gain 151 20 -92.69 gain 20 152 -101.77 gain 152 20 -97.49 gain 20 153 -99.81 gain 153 20 -94.75 gain 20 154 -93.85 gain 154 20 -90.69 gain 20 155 -101.96 gain 155 20 -97.38 gain 20 156 -98.43 gain 156 20 -93.08 gain 20 157 -98.77 gain 157 20 -95.90 gain 20 158 -100.61 gain 158 20 -97.23 gain 20 159 -99.80 gain 159 20 -98.81 gain 20 160 -99.49 gain 160 20 -95.66 gain 20 161 -95.40 gain 161 20 -94.00 gain 20 162 -95.65 gain 162 20 -93.96 gain 20 163 -103.24 gain 163 20 -103.47 gain 20 164 -107.03 gain 164 20 -106.63 gain 20 165 -101.00 gain 165 20 -97.66 gain 20 166 -98.19 gain 166 20 -94.60 gain 20 167 -100.48 gain 167 20 -97.61 gain 20 168 -93.82 gain 168 20 -89.84 gain 20 169 -99.09 gain 169 20 -96.23 gain 20 170 -94.38 gain 170 20 -90.75 gain 20 171 -97.06 gain 171 20 -94.52 gain 20 172 -98.43 gain 172 20 -94.07 gain 20 173 -98.96 gain 173 20 -99.25 gain 20 174 -92.45 gain 174 20 -88.78 gain 20 175 -100.40 gain 175 20 -97.87 gain 20 176 -97.27 gain 176 20 -93.71 gain 20 177 -104.89 gain 177 20 -104.33 gain 20 178 -105.15 gain 178 20 -98.04 gain 20 179 -102.12 gain 179 20 -94.42 gain 20 180 -104.97 gain 180 20 -106.72 gain 20 181 -100.49 gain 181 20 -96.26 gain 20 182 -104.49 gain 182 20 -101.35 gain 20 183 -95.92 gain 183 20 -93.05 gain 20 184 -97.74 gain 184 20 -97.62 gain 20 185 -95.67 gain 185 20 -99.43 gain 20 186 -100.11 gain 186 20 -99.44 gain 20 187 -100.80 gain 187 20 -97.86 gain 20 188 -102.02 gain 188 20 -101.49 gain 20 189 -105.70 gain 189 20 -99.90 gain 20 190 -102.57 gain 190 20 -100.68 gain 20 191 -93.15 gain 191 20 -89.97 gain 20 192 -106.39 gain 192 20 -101.90 gain 20 193 -105.19 gain 193 20 -99.70 gain 20 194 -101.84 gain 194 20 -97.12 gain 20 195 -105.49 gain 195 20 -99.32 gain 20 196 -103.13 gain 196 20 -101.27 gain 20 197 -99.37 gain 197 20 -92.65 gain 20 198 -102.83 gain 198 20 -100.62 gain 20 199 -100.00 gain 199 20 -97.90 gain 20 200 -96.64 gain 200 20 -95.87 gain 20 201 -93.70 gain 201 20 -92.84 gain 20 202 -98.14 gain 202 20 -96.42 gain 20 203 -101.37 gain 203 20 -98.76 gain 20 204 -105.79 gain 204 20 -99.82 gain 20 205 -106.51 gain 205 20 -104.28 gain 20 206 -101.28 gain 206 20 -100.16 gain 20 207 -102.25 gain 207 20 -100.55 gain 20 208 -104.35 gain 208 20 -105.25 gain 20 209 -99.20 gain 209 20 -99.67 gain 20 210 -95.26 gain 210 20 -95.91 gain 20 211 -100.40 gain 211 20 -96.28 gain 20 212 -102.39 gain 212 20 -101.28 gain 20 213 -109.42 gain 213 20 -107.64 gain 20 214 -106.75 gain 214 20 -110.36 gain 20 215 -99.79 gain 215 20 -98.79 gain 20 216 -101.25 gain 216 20 -104.16 gain 20 217 -106.09 gain 217 20 -109.27 gain 20 218 -101.87 gain 218 20 -97.86 gain 20 219 -103.62 gain 219 20 -100.09 gain 20 220 -104.25 gain 220 20 -96.81 gain 20 221 -98.51 gain 221 20 -96.75 gain 20 222 -106.82 gain 222 20 -100.87 gain 20 223 -99.19 gain 223 20 -96.47 gain 20 224 -102.96 gain 224 20 -100.71 gain 21 22 -64.50 gain 22 21 -62.96 gain 21 23 -78.56 gain 23 21 -74.19 gain 21 24 -78.95 gain 24 21 -76.20 gain 21 25 -89.72 gain 25 21 -89.65 gain 21 26 -89.71 gain 26 21 -91.07 gain 21 27 -95.18 gain 27 21 -94.15 gain 21 28 -93.57 gain 28 21 -87.87 gain 21 29 -89.68 gain 29 21 -85.52 gain 21 30 -86.61 gain 30 21 -87.46 gain 21 31 -92.92 gain 31 21 -90.33 gain 21 32 -81.71 gain 32 21 -76.47 gain 21 33 -84.95 gain 33 21 -81.16 gain 21 34 -80.08 gain 34 21 -76.93 gain 21 35 -70.80 gain 35 21 -68.59 gain 21 36 -65.01 gain 36 21 -62.95 gain 21 37 -69.32 gain 37 21 -69.80 gain 21 38 -79.54 gain 38 21 -77.55 gain 21 39 -85.47 gain 39 21 -87.80 gain 21 40 -80.99 gain 40 21 -78.30 gain 21 41 -87.56 gain 41 21 -80.21 gain 21 42 -100.15 gain 42 21 -100.06 gain 21 43 -95.14 gain 43 21 -92.64 gain 21 44 -102.17 gain 44 21 -103.26 gain 21 45 -85.91 gain 45 21 -86.99 gain 21 46 -92.13 gain 46 21 -89.66 gain 21 47 -93.13 gain 47 21 -88.37 gain 21 48 -84.02 gain 48 21 -78.84 gain 21 49 -80.88 gain 49 21 -79.75 gain 21 50 -79.44 gain 50 21 -75.17 gain 21 51 -79.22 gain 51 21 -78.65 gain 21 52 -72.51 gain 52 21 -69.17 gain 21 53 -76.28 gain 53 21 -73.50 gain 21 54 -84.94 gain 54 21 -81.56 gain 21 55 -87.91 gain 55 21 -81.46 gain 21 56 -82.45 gain 56 21 -81.04 gain 21 57 -84.91 gain 57 21 -82.58 gain 21 58 -96.15 gain 58 21 -90.51 gain 21 59 -96.66 gain 59 21 -90.28 gain 21 60 -96.76 gain 60 21 -99.66 gain 21 61 -92.22 gain 61 21 -87.03 gain 21 62 -83.24 gain 62 21 -75.56 gain 21 63 -89.90 gain 63 21 -86.18 gain 21 64 -83.46 gain 64 21 -83.96 gain 21 65 -83.33 gain 65 21 -79.38 gain 21 66 -86.50 gain 66 21 -81.53 gain 21 67 -83.92 gain 67 21 -80.19 gain 21 68 -82.77 gain 68 21 -81.62 gain 21 69 -87.53 gain 69 21 -83.59 gain 21 70 -93.05 gain 70 21 -87.59 gain 21 71 -91.75 gain 71 21 -89.86 gain 21 72 -96.94 gain 72 21 -92.60 gain 21 73 -100.63 gain 73 21 -97.66 gain 21 74 -99.41 gain 74 21 -92.55 gain 21 75 -97.10 gain 75 21 -96.13 gain 21 76 -90.71 gain 76 21 -89.87 gain 21 77 -88.91 gain 77 21 -84.07 gain 21 78 -83.94 gain 78 21 -83.59 gain 21 79 -87.83 gain 79 21 -87.11 gain 21 80 -75.97 gain 80 21 -73.04 gain 21 81 -79.00 gain 81 21 -76.98 gain 21 82 -81.28 gain 82 21 -80.23 gain 21 83 -82.60 gain 83 21 -78.83 gain 21 84 -92.54 gain 84 21 -85.95 gain 21 85 -86.29 gain 85 21 -85.13 gain 21 86 -98.22 gain 86 21 -98.70 gain 21 87 -92.06 gain 87 21 -89.82 gain 21 88 -93.79 gain 88 21 -91.20 gain 21 89 -96.02 gain 89 21 -95.58 gain 21 90 -90.08 gain 90 21 -88.98 gain 21 91 -94.48 gain 91 21 -94.45 gain 21 92 -89.35 gain 92 21 -90.23 gain 21 93 -90.42 gain 93 21 -88.66 gain 21 94 -86.40 gain 94 21 -83.20 gain 21 95 -85.39 gain 95 21 -81.44 gain 21 96 -88.52 gain 96 21 -91.54 gain 21 97 -93.02 gain 97 21 -88.86 gain 21 98 -85.22 gain 98 21 -81.53 gain 21 99 -95.95 gain 99 21 -91.40 gain 21 100 -96.92 gain 100 21 -92.29 gain 21 101 -94.65 gain 101 21 -93.65 gain 21 102 -93.52 gain 102 21 -92.48 gain 21 103 -91.77 gain 103 21 -91.90 gain 21 104 -89.25 gain 104 21 -91.86 gain 21 105 -97.02 gain 105 21 -94.15 gain 21 106 -99.75 gain 106 21 -94.21 gain 21 107 -94.77 gain 107 21 -89.14 gain 21 108 -84.19 gain 108 21 -78.18 gain 21 109 -92.17 gain 109 21 -89.61 gain 21 110 -89.04 gain 110 21 -92.84 gain 21 111 -86.13 gain 111 21 -79.90 gain 21 112 -90.75 gain 112 21 -87.98 gain 21 113 -93.93 gain 113 21 -90.29 gain 21 114 -94.00 gain 114 21 -87.53 gain 21 115 -90.14 gain 115 21 -84.33 gain 21 116 -99.68 gain 116 21 -96.29 gain 21 117 -95.59 gain 117 21 -89.35 gain 21 118 -93.49 gain 118 21 -88.87 gain 21 119 -98.43 gain 119 21 -98.87 gain 21 120 -96.08 gain 120 21 -93.90 gain 21 121 -94.19 gain 121 21 -93.03 gain 21 122 -97.34 gain 122 21 -95.94 gain 21 123 -99.75 gain 123 21 -98.68 gain 21 124 -96.56 gain 124 21 -93.48 gain 21 125 -95.91 gain 125 21 -96.17 gain 21 126 -97.91 gain 126 21 -94.82 gain 21 127 -94.18 gain 127 21 -90.72 gain 21 128 -89.11 gain 128 21 -88.24 gain 21 129 -96.24 gain 129 21 -92.58 gain 21 130 -92.07 gain 130 21 -89.70 gain 21 131 -98.23 gain 131 21 -95.63 gain 21 132 -92.85 gain 132 21 -86.27 gain 21 133 -97.09 gain 133 21 -95.68 gain 21 134 -97.43 gain 134 21 -92.88 gain 21 135 -91.96 gain 135 21 -89.71 gain 21 136 -93.48 gain 136 21 -91.68 gain 21 137 -96.02 gain 137 21 -97.13 gain 21 138 -95.97 gain 138 21 -90.61 gain 21 139 -104.47 gain 139 21 -102.37 gain 21 140 -92.24 gain 140 21 -90.97 gain 21 141 -85.68 gain 141 21 -76.38 gain 21 142 -96.42 gain 142 21 -93.87 gain 21 143 -96.18 gain 143 21 -96.36 gain 21 144 -93.39 gain 144 21 -91.94 gain 21 145 -96.18 gain 145 21 -98.12 gain 21 146 -93.94 gain 146 21 -91.87 gain 21 147 -105.64 gain 147 21 -100.67 gain 21 148 -99.35 gain 148 21 -92.71 gain 21 149 -98.09 gain 149 21 -95.11 gain 21 150 -91.68 gain 150 21 -89.54 gain 21 151 -102.58 gain 151 21 -99.38 gain 21 152 -98.63 gain 152 21 -95.24 gain 21 153 -100.00 gain 153 21 -95.83 gain 21 154 -91.58 gain 154 21 -89.31 gain 21 155 -95.50 gain 155 21 -91.81 gain 21 156 -100.27 gain 156 21 -95.80 gain 21 157 -95.60 gain 157 21 -93.62 gain 21 158 -100.09 gain 158 21 -97.61 gain 21 159 -97.89 gain 159 21 -97.79 gain 21 160 -95.63 gain 160 21 -92.69 gain 21 161 -96.81 gain 161 21 -96.30 gain 21 162 -103.34 gain 162 21 -102.55 gain 21 163 -95.01 gain 163 21 -96.13 gain 21 164 -102.27 gain 164 21 -102.75 gain 21 165 -102.50 gain 165 21 -100.05 gain 21 166 -99.75 gain 166 21 -97.05 gain 21 167 -98.38 gain 167 21 -96.40 gain 21 168 -103.03 gain 168 21 -99.94 gain 21 169 -98.64 gain 169 21 -96.67 gain 21 170 -100.57 gain 170 21 -97.84 gain 21 171 -93.62 gain 171 21 -91.96 gain 21 172 -95.98 gain 172 21 -92.51 gain 21 173 -98.80 gain 173 21 -99.98 gain 21 174 -97.76 gain 174 21 -94.99 gain 21 175 -99.66 gain 175 21 -98.02 gain 21 176 -102.07 gain 176 21 -99.40 gain 21 177 -99.07 gain 177 21 -99.40 gain 21 178 -102.82 gain 178 21 -96.60 gain 21 179 -107.80 gain 179 21 -101.00 gain 21 180 -98.16 gain 180 21 -100.80 gain 21 181 -101.88 gain 181 21 -98.55 gain 21 182 -93.39 gain 182 21 -91.15 gain 21 183 -102.77 gain 183 21 -100.79 gain 21 184 -100.69 gain 184 21 -101.47 gain 21 185 -90.34 gain 185 21 -94.98 gain 21 186 -98.48 gain 186 21 -98.70 gain 21 187 -91.42 gain 187 21 -89.37 gain 21 188 -97.66 gain 188 21 -98.02 gain 21 189 -96.49 gain 189 21 -91.58 gain 21 190 -94.90 gain 190 21 -93.91 gain 21 191 -99.44 gain 191 21 -97.15 gain 21 192 -96.67 gain 192 21 -93.08 gain 21 193 -102.09 gain 193 21 -97.48 gain 21 194 -103.06 gain 194 21 -99.23 gain 21 195 -101.49 gain 195 21 -96.21 gain 21 196 -102.19 gain 196 21 -101.22 gain 21 197 -99.09 gain 197 21 -93.26 gain 21 198 -100.43 gain 198 21 -99.11 gain 21 199 -93.15 gain 199 21 -91.93 gain 21 200 -103.50 gain 200 21 -103.62 gain 21 201 -94.14 gain 201 21 -94.18 gain 21 202 -102.92 gain 202 21 -102.08 gain 21 203 -101.86 gain 203 21 -100.14 gain 21 204 -104.73 gain 204 21 -99.65 gain 21 205 -100.91 gain 205 21 -99.58 gain 21 206 -101.91 gain 206 21 -101.68 gain 21 207 -103.97 gain 207 21 -103.16 gain 21 208 -104.38 gain 208 21 -106.17 gain 21 209 -99.82 gain 209 21 -101.18 gain 21 210 -108.45 gain 210 21 -109.99 gain 21 211 -99.21 gain 211 21 -95.98 gain 21 212 -104.37 gain 212 21 -104.15 gain 21 213 -99.10 gain 213 21 -98.21 gain 21 214 -100.21 gain 214 21 -104.71 gain 21 215 -97.96 gain 215 21 -97.85 gain 21 216 -101.17 gain 216 21 -104.98 gain 21 217 -103.49 gain 217 21 -107.56 gain 21 218 -100.75 gain 218 21 -97.63 gain 21 219 -98.86 gain 219 21 -96.22 gain 21 220 -100.40 gain 220 21 -93.85 gain 21 221 -94.82 gain 221 21 -93.95 gain 21 222 -107.49 gain 222 21 -102.42 gain 21 223 -105.64 gain 223 21 -103.81 gain 21 224 -105.10 gain 224 21 -103.74 gain 22 23 -69.22 gain 23 22 -66.39 gain 22 24 -76.34 gain 24 22 -75.13 gain 22 25 -79.78 gain 25 22 -81.25 gain 22 26 -83.88 gain 26 22 -86.78 gain 22 27 -85.25 gain 27 22 -85.75 gain 22 28 -86.88 gain 28 22 -82.71 gain 22 29 -92.21 gain 29 22 -89.59 gain 22 30 -89.94 gain 30 22 -92.32 gain 22 31 -90.86 gain 31 22 -89.80 gain 22 32 -86.51 gain 32 22 -82.81 gain 22 33 -89.67 gain 33 22 -87.42 gain 22 34 -79.20 gain 34 22 -77.58 gain 22 35 -75.80 gain 35 22 -75.13 gain 22 36 -72.33 gain 36 22 -71.80 gain 22 37 -68.06 gain 37 22 -70.07 gain 22 38 -62.73 gain 38 22 -62.28 gain 22 39 -79.03 gain 39 22 -82.90 gain 22 40 -79.23 gain 40 22 -78.07 gain 22 41 -83.12 gain 41 22 -77.31 gain 22 42 -87.19 gain 42 22 -88.63 gain 22 43 -92.32 gain 43 22 -91.35 gain 22 44 -103.53 gain 44 22 -106.15 gain 22 45 -87.52 gain 45 22 -90.13 gain 22 46 -88.17 gain 46 22 -87.24 gain 22 47 -87.33 gain 47 22 -84.10 gain 22 48 -82.05 gain 48 22 -78.40 gain 22 49 -82.32 gain 49 22 -82.73 gain 22 50 -78.29 gain 50 22 -75.56 gain 22 51 -81.12 gain 51 22 -82.08 gain 22 52 -70.41 gain 52 22 -68.61 gain 22 53 -74.96 gain 53 22 -73.72 gain 22 54 -74.89 gain 54 22 -73.05 gain 22 55 -75.81 gain 55 22 -70.89 gain 22 56 -89.89 gain 56 22 -90.02 gain 22 57 -90.42 gain 57 22 -89.62 gain 22 58 -92.17 gain 58 22 -88.08 gain 22 59 -91.70 gain 59 22 -86.85 gain 22 60 -96.14 gain 60 22 -100.58 gain 22 61 -100.63 gain 61 22 -96.97 gain 22 62 -88.20 gain 62 22 -82.05 gain 22 63 -91.86 gain 63 22 -89.67 gain 22 64 -90.19 gain 64 22 -92.23 gain 22 65 -80.59 gain 65 22 -78.18 gain 22 66 -85.73 gain 66 22 -82.30 gain 22 67 -80.58 gain 67 22 -78.38 gain 22 68 -79.56 gain 68 22 -79.95 gain 22 69 -86.35 gain 69 22 -83.95 gain 22 70 -79.68 gain 70 22 -75.75 gain 22 71 -86.26 gain 71 22 -85.90 gain 22 72 -88.61 gain 72 22 -85.81 gain 22 73 -94.08 gain 73 22 -92.64 gain 22 74 -93.44 gain 74 22 -88.12 gain 22 75 -92.42 gain 75 22 -92.99 gain 22 76 -93.57 gain 76 22 -94.26 gain 22 77 -82.62 gain 77 22 -79.31 gain 22 78 -90.50 gain 78 22 -91.69 gain 22 79 -87.36 gain 79 22 -88.17 gain 22 80 -82.78 gain 80 22 -81.38 gain 22 81 -85.81 gain 81 22 -85.32 gain 22 82 -87.35 gain 82 22 -87.85 gain 22 83 -80.72 gain 83 22 -78.49 gain 22 84 -80.38 gain 84 22 -75.33 gain 22 85 -93.02 gain 85 22 -93.40 gain 22 86 -92.61 gain 86 22 -94.63 gain 22 87 -85.86 gain 87 22 -85.17 gain 22 88 -95.95 gain 88 22 -94.90 gain 22 89 -94.10 gain 89 22 -95.19 gain 22 90 -100.07 gain 90 22 -100.50 gain 22 91 -95.34 gain 91 22 -96.84 gain 22 92 -92.88 gain 92 22 -95.30 gain 22 93 -90.08 gain 93 22 -89.86 gain 22 94 -93.85 gain 94 22 -92.19 gain 22 95 -89.01 gain 95 22 -86.59 gain 22 96 -88.62 gain 96 22 -93.18 gain 22 97 -84.14 gain 97 22 -81.52 gain 22 98 -86.53 gain 98 22 -84.38 gain 22 99 -87.13 gain 99 22 -84.11 gain 22 100 -88.19 gain 100 22 -85.09 gain 22 101 -89.90 gain 101 22 -90.43 gain 22 102 -88.54 gain 102 22 -89.04 gain 22 103 -92.05 gain 103 22 -93.71 gain 22 104 -91.17 gain 104 22 -95.32 gain 22 105 -91.60 gain 105 22 -90.27 gain 22 106 -85.91 gain 106 22 -81.91 gain 22 107 -100.33 gain 107 22 -96.24 gain 22 108 -77.62 gain 108 22 -73.14 gain 22 109 -90.19 gain 109 22 -89.17 gain 22 110 -91.42 gain 110 22 -96.76 gain 22 111 -81.76 gain 111 22 -77.06 gain 22 112 -86.66 gain 112 22 -85.43 gain 22 113 -85.86 gain 113 22 -83.76 gain 22 114 -89.42 gain 114 22 -84.48 gain 22 115 -88.81 gain 115 22 -84.53 gain 22 116 -91.63 gain 116 22 -89.78 gain 22 117 -89.90 gain 117 22 -85.19 gain 22 118 -93.65 gain 118 22 -90.57 gain 22 119 -100.61 gain 119 22 -102.59 gain 22 120 -100.88 gain 120 22 -100.24 gain 22 121 -93.81 gain 121 22 -94.19 gain 22 122 -98.83 gain 122 22 -98.96 gain 22 123 -92.67 gain 123 22 -93.14 gain 22 124 -93.24 gain 124 22 -91.70 gain 22 125 -94.15 gain 125 22 -95.94 gain 22 126 -91.20 gain 126 22 -89.65 gain 22 127 -94.26 gain 127 22 -92.33 gain 22 128 -91.39 gain 128 22 -92.05 gain 22 129 -100.47 gain 129 22 -98.35 gain 22 130 -90.52 gain 130 22 -89.69 gain 22 131 -92.71 gain 131 22 -91.65 gain 22 132 -95.83 gain 132 22 -90.78 gain 22 133 -97.31 gain 133 22 -97.43 gain 22 134 -98.34 gain 134 22 -95.33 gain 22 135 -96.40 gain 135 22 -95.69 gain 22 136 -98.07 gain 136 22 -97.81 gain 22 137 -92.15 gain 137 22 -94.80 gain 22 138 -92.34 gain 138 22 -88.52 gain 22 139 -98.19 gain 139 22 -97.63 gain 22 140 -92.54 gain 140 22 -92.81 gain 22 141 -94.55 gain 141 22 -86.79 gain 22 142 -92.10 gain 142 22 -91.08 gain 22 143 -87.62 gain 143 22 -89.34 gain 22 144 -93.92 gain 144 22 -94.01 gain 22 145 -96.43 gain 145 22 -99.90 gain 22 146 -105.46 gain 146 22 -104.93 gain 22 147 -96.41 gain 147 22 -92.98 gain 22 148 -98.86 gain 148 22 -93.76 gain 22 149 -97.56 gain 149 22 -96.12 gain 22 150 -88.04 gain 150 22 -87.43 gain 22 151 -97.14 gain 151 22 -95.48 gain 22 152 -91.24 gain 152 22 -89.40 gain 22 153 -94.13 gain 153 22 -91.50 gain 22 154 -96.37 gain 154 22 -95.63 gain 22 155 -88.12 gain 155 22 -85.96 gain 22 156 -93.39 gain 156 22 -90.46 gain 22 157 -89.59 gain 157 22 -89.14 gain 22 158 -93.99 gain 158 22 -93.04 gain 22 159 -98.53 gain 159 22 -99.97 gain 22 160 -95.25 gain 160 22 -93.84 gain 22 161 -90.11 gain 161 22 -91.14 gain 22 162 -93.40 gain 162 22 -94.14 gain 22 163 -97.82 gain 163 22 -100.48 gain 22 164 -98.38 gain 164 22 -100.40 gain 22 165 -93.60 gain 165 22 -92.68 gain 22 166 -99.97 gain 166 22 -98.81 gain 22 167 -102.47 gain 167 22 -102.02 gain 22 168 -98.82 gain 168 22 -97.27 gain 22 169 -99.30 gain 169 22 -98.86 gain 22 170 -98.01 gain 170 22 -96.81 gain 22 171 -96.74 gain 171 22 -96.62 gain 22 172 -101.10 gain 172 22 -99.16 gain 22 173 -86.15 gain 173 22 -88.86 gain 22 174 -103.31 gain 174 22 -102.07 gain 22 175 -95.57 gain 175 22 -95.47 gain 22 176 -94.25 gain 176 22 -93.12 gain 22 177 -100.05 gain 177 22 -101.91 gain 22 178 -98.75 gain 178 22 -94.06 gain 22 179 -97.42 gain 179 22 -92.16 gain 22 180 -91.86 gain 180 22 -96.04 gain 22 181 -100.51 gain 181 22 -98.72 gain 22 182 -100.20 gain 182 22 -99.48 gain 22 183 -98.37 gain 183 22 -97.93 gain 22 184 -100.22 gain 184 22 -102.53 gain 22 185 -98.68 gain 185 22 -104.86 gain 22 186 -97.26 gain 186 22 -99.01 gain 22 187 -90.81 gain 187 22 -90.30 gain 22 188 -100.10 gain 188 22 -102.00 gain 22 189 -93.79 gain 189 22 -90.42 gain 22 190 -96.66 gain 190 22 -97.20 gain 22 191 -101.09 gain 191 22 -100.33 gain 22 192 -104.28 gain 192 22 -102.22 gain 22 193 -87.22 gain 193 22 -84.15 gain 22 194 -99.66 gain 194 22 -97.37 gain 22 195 -103.04 gain 195 22 -99.30 gain 22 196 -100.78 gain 196 22 -101.35 gain 22 197 -100.97 gain 197 22 -96.67 gain 22 198 -97.30 gain 198 22 -97.51 gain 22 199 -99.77 gain 199 22 -100.09 gain 22 200 -103.58 gain 200 22 -105.24 gain 22 201 -97.45 gain 201 22 -99.01 gain 22 202 -104.03 gain 202 22 -104.73 gain 22 203 -95.93 gain 203 22 -95.75 gain 22 204 -102.16 gain 204 22 -98.62 gain 22 205 -93.78 gain 205 22 -93.98 gain 22 206 -103.08 gain 206 22 -104.39 gain 22 207 -94.57 gain 207 22 -95.30 gain 22 208 -99.32 gain 208 22 -102.64 gain 22 209 -91.95 gain 209 22 -94.85 gain 22 210 -101.03 gain 210 22 -104.10 gain 22 211 -103.07 gain 211 22 -101.37 gain 22 212 -98.95 gain 212 22 -100.27 gain 22 213 -98.59 gain 213 22 -99.23 gain 22 214 -102.05 gain 214 22 -108.08 gain 22 215 -91.98 gain 215 22 -93.41 gain 22 216 -100.43 gain 216 22 -105.78 gain 22 217 -91.52 gain 217 22 -97.13 gain 22 218 -97.98 gain 218 22 -96.39 gain 22 219 -101.62 gain 219 22 -100.51 gain 22 220 -101.07 gain 220 22 -96.05 gain 22 221 -103.94 gain 221 22 -104.60 gain 22 222 -101.62 gain 222 22 -98.09 gain 22 223 -101.55 gain 223 22 -101.26 gain 22 224 -110.75 gain 224 22 -110.92 gain 23 24 -66.45 gain 24 23 -68.06 gain 23 25 -80.45 gain 25 23 -84.75 gain 23 26 -75.67 gain 26 23 -81.39 gain 23 27 -86.08 gain 27 23 -89.41 gain 23 28 -89.31 gain 28 23 -87.97 gain 23 29 -80.48 gain 29 23 -80.69 gain 23 30 -90.66 gain 30 23 -95.88 gain 23 31 -81.59 gain 31 23 -83.37 gain 23 32 -85.72 gain 32 23 -84.85 gain 23 33 -81.34 gain 33 23 -81.91 gain 23 34 -86.22 gain 34 23 -87.43 gain 23 35 -80.22 gain 35 23 -82.37 gain 23 36 -79.02 gain 36 23 -81.32 gain 23 37 -62.26 gain 37 23 -67.10 gain 23 38 -63.26 gain 38 23 -65.63 gain 23 39 -72.45 gain 39 23 -79.15 gain 23 40 -75.30 gain 40 23 -76.98 gain 23 41 -81.15 gain 41 23 -78.17 gain 23 42 -85.14 gain 42 23 -89.41 gain 23 43 -89.20 gain 43 23 -91.06 gain 23 44 -81.11 gain 44 23 -86.57 gain 23 45 -90.74 gain 45 23 -96.18 gain 23 46 -86.60 gain 46 23 -88.50 gain 23 47 -84.87 gain 47 23 -84.47 gain 23 48 -91.91 gain 48 23 -91.09 gain 23 49 -81.30 gain 49 23 -84.54 gain 23 50 -77.97 gain 50 23 -78.06 gain 23 51 -77.49 gain 51 23 -81.28 gain 23 52 -72.97 gain 52 23 -74.00 gain 23 53 -73.38 gain 53 23 -74.97 gain 23 54 -79.66 gain 54 23 -80.65 gain 23 55 -79.82 gain 55 23 -77.73 gain 23 56 -79.49 gain 56 23 -82.45 gain 23 57 -88.04 gain 57 23 -90.07 gain 23 58 -81.75 gain 58 23 -80.48 gain 23 59 -82.82 gain 59 23 -80.80 gain 23 60 -93.31 gain 60 23 -100.58 gain 23 61 -86.13 gain 61 23 -85.30 gain 23 62 -88.72 gain 62 23 -85.40 gain 23 63 -83.83 gain 63 23 -84.47 gain 23 64 -88.85 gain 64 23 -93.72 gain 23 65 -82.74 gain 65 23 -83.16 gain 23 66 -77.54 gain 66 23 -76.94 gain 23 67 -78.73 gain 67 23 -79.36 gain 23 68 -80.01 gain 68 23 -83.23 gain 23 69 -74.14 gain 69 23 -74.58 gain 23 70 -83.26 gain 70 23 -82.16 gain 23 71 -82.87 gain 71 23 -85.35 gain 23 72 -84.42 gain 72 23 -84.44 gain 23 73 -89.37 gain 73 23 -90.77 gain 23 74 -89.31 gain 74 23 -86.82 gain 23 75 -95.16 gain 75 23 -98.56 gain 23 76 -88.35 gain 76 23 -91.88 gain 23 77 -90.70 gain 77 23 -90.22 gain 23 78 -82.93 gain 78 23 -86.95 gain 23 79 -82.45 gain 79 23 -86.10 gain 23 80 -86.68 gain 80 23 -88.11 gain 23 81 -82.39 gain 81 23 -84.74 gain 23 82 -74.83 gain 82 23 -78.15 gain 23 83 -88.96 gain 83 23 -89.55 gain 23 84 -77.89 gain 84 23 -75.67 gain 23 85 -82.58 gain 85 23 -85.78 gain 23 86 -88.98 gain 86 23 -93.83 gain 23 87 -86.42 gain 87 23 -88.55 gain 23 88 -85.73 gain 88 23 -87.50 gain 23 89 -89.86 gain 89 23 -93.78 gain 23 90 -88.90 gain 90 23 -92.16 gain 23 91 -83.65 gain 91 23 -87.98 gain 23 92 -93.60 gain 92 23 -98.85 gain 23 93 -92.72 gain 93 23 -95.33 gain 23 94 -87.36 gain 94 23 -88.53 gain 23 95 -87.77 gain 95 23 -88.18 gain 23 96 -84.85 gain 96 23 -92.24 gain 23 97 -78.52 gain 97 23 -78.73 gain 23 98 -85.79 gain 98 23 -86.46 gain 23 99 -79.08 gain 99 23 -78.89 gain 23 100 -88.04 gain 100 23 -87.77 gain 23 101 -90.36 gain 101 23 -93.72 gain 23 102 -85.56 gain 102 23 -88.88 gain 23 103 -85.93 gain 103 23 -90.42 gain 23 104 -88.59 gain 104 23 -95.57 gain 23 105 -89.74 gain 105 23 -91.23 gain 23 106 -89.65 gain 106 23 -88.48 gain 23 107 -77.13 gain 107 23 -75.87 gain 23 108 -85.05 gain 108 23 -83.41 gain 23 109 -87.88 gain 109 23 -89.68 gain 23 110 -86.61 gain 110 23 -94.78 gain 23 111 -89.70 gain 111 23 -87.84 gain 23 112 -83.98 gain 112 23 -85.58 gain 23 113 -88.14 gain 113 23 -88.86 gain 23 114 -86.35 gain 114 23 -84.24 gain 23 115 -82.34 gain 115 23 -80.88 gain 23 116 -86.89 gain 116 23 -87.87 gain 23 117 -83.78 gain 117 23 -81.91 gain 23 118 -95.34 gain 118 23 -95.08 gain 23 119 -86.45 gain 119 23 -91.25 gain 23 120 -96.96 gain 120 23 -99.15 gain 23 121 -94.91 gain 121 23 -98.12 gain 23 122 -91.45 gain 122 23 -94.41 gain 23 123 -90.50 gain 123 23 -93.80 gain 23 124 -88.35 gain 124 23 -89.64 gain 23 125 -92.16 gain 125 23 -96.79 gain 23 126 -84.90 gain 126 23 -86.18 gain 23 127 -95.97 gain 127 23 -96.88 gain 23 128 -95.19 gain 128 23 -98.68 gain 23 129 -79.68 gain 129 23 -80.39 gain 23 130 -86.40 gain 130 23 -88.40 gain 23 131 -95.23 gain 131 23 -97.00 gain 23 132 -92.54 gain 132 23 -90.32 gain 23 133 -86.80 gain 133 23 -89.75 gain 23 134 -92.41 gain 134 23 -92.23 gain 23 135 -95.89 gain 135 23 -98.01 gain 23 136 -91.07 gain 136 23 -93.63 gain 23 137 -88.83 gain 137 23 -94.31 gain 23 138 -96.41 gain 138 23 -95.42 gain 23 139 -88.55 gain 139 23 -90.82 gain 23 140 -89.47 gain 140 23 -92.57 gain 23 141 -87.39 gain 141 23 -82.46 gain 23 142 -90.28 gain 142 23 -92.10 gain 23 143 -94.86 gain 143 23 -99.41 gain 23 144 -95.68 gain 144 23 -98.60 gain 23 145 -94.81 gain 145 23 -101.12 gain 23 146 -90.37 gain 146 23 -92.67 gain 23 147 -96.34 gain 147 23 -95.74 gain 23 148 -90.47 gain 148 23 -88.20 gain 23 149 -95.16 gain 149 23 -96.55 gain 23 150 -89.48 gain 150 23 -91.70 gain 23 151 -90.53 gain 151 23 -91.70 gain 23 152 -94.34 gain 152 23 -95.32 gain 23 153 -102.25 gain 153 23 -102.45 gain 23 154 -94.62 gain 154 23 -96.72 gain 23 155 -93.87 gain 155 23 -94.54 gain 23 156 -91.34 gain 156 23 -91.24 gain 23 157 -88.31 gain 157 23 -90.70 gain 23 158 -87.75 gain 158 23 -89.64 gain 23 159 -89.00 gain 159 23 -93.27 gain 23 160 -90.79 gain 160 23 -92.21 gain 23 161 -90.44 gain 161 23 -94.30 gain 23 162 -95.78 gain 162 23 -99.35 gain 23 163 -91.05 gain 163 23 -96.53 gain 23 164 -100.35 gain 164 23 -105.21 gain 23 165 -93.43 gain 165 23 -95.34 gain 23 166 -94.70 gain 166 23 -96.37 gain 23 167 -96.18 gain 167 23 -98.56 gain 23 168 -90.78 gain 168 23 -92.06 gain 23 169 -99.94 gain 169 23 -102.33 gain 23 170 -89.84 gain 170 23 -91.46 gain 23 171 -89.46 gain 171 23 -92.17 gain 23 172 -95.72 gain 172 23 -96.62 gain 23 173 -95.92 gain 173 23 -101.47 gain 23 174 -90.76 gain 174 23 -92.35 gain 23 175 -87.82 gain 175 23 -90.54 gain 23 176 -88.72 gain 176 23 -90.42 gain 23 177 -94.91 gain 177 23 -99.60 gain 23 178 -95.72 gain 178 23 -93.86 gain 23 179 -103.38 gain 179 23 -100.94 gain 23 180 -91.26 gain 180 23 -98.27 gain 23 181 -100.15 gain 181 23 -101.18 gain 23 182 -95.87 gain 182 23 -97.99 gain 23 183 -101.72 gain 183 23 -104.11 gain 23 184 -94.27 gain 184 23 -99.41 gain 23 185 -92.95 gain 185 23 -101.96 gain 23 186 -92.72 gain 186 23 -97.31 gain 23 187 -88.99 gain 187 23 -91.30 gain 23 188 -92.70 gain 188 23 -97.43 gain 23 189 -93.31 gain 189 23 -92.76 gain 23 190 -96.38 gain 190 23 -99.75 gain 23 191 -95.34 gain 191 23 -97.42 gain 23 192 -91.17 gain 192 23 -91.94 gain 23 193 -92.12 gain 193 23 -91.88 gain 23 194 -89.45 gain 194 23 -89.98 gain 23 195 -93.09 gain 195 23 -92.18 gain 23 196 -100.75 gain 196 23 -104.15 gain 23 197 -87.95 gain 197 23 -86.48 gain 23 198 -96.40 gain 198 23 -99.44 gain 23 199 -93.81 gain 199 23 -96.96 gain 23 200 -89.36 gain 200 23 -93.85 gain 23 201 -94.37 gain 201 23 -98.77 gain 23 202 -96.58 gain 202 23 -100.11 gain 23 203 -91.48 gain 203 23 -94.12 gain 23 204 -87.50 gain 204 23 -86.79 gain 23 205 -91.53 gain 205 23 -94.56 gain 23 206 -93.43 gain 206 23 -97.57 gain 23 207 -106.98 gain 207 23 -110.54 gain 23 208 -94.92 gain 208 23 -101.07 gain 23 209 -98.35 gain 209 23 -104.08 gain 23 210 -95.48 gain 210 23 -101.39 gain 23 211 -96.59 gain 211 23 -97.72 gain 23 212 -92.65 gain 212 23 -96.80 gain 23 213 -94.14 gain 213 23 -97.61 gain 23 214 -94.19 gain 214 23 -103.05 gain 23 215 -87.52 gain 215 23 -91.78 gain 23 216 -91.02 gain 216 23 -99.19 gain 23 217 -100.88 gain 217 23 -109.32 gain 23 218 -99.64 gain 218 23 -100.88 gain 23 219 -100.52 gain 219 23 -102.25 gain 23 220 -99.23 gain 220 23 -97.04 gain 23 221 -95.72 gain 221 23 -99.21 gain 23 222 -92.82 gain 222 23 -92.12 gain 23 223 -100.88 gain 223 23 -103.42 gain 23 224 -102.60 gain 224 23 -105.60 gain 24 25 -59.04 gain 25 24 -61.72 gain 24 26 -74.64 gain 26 24 -78.75 gain 24 27 -82.20 gain 27 24 -83.92 gain 24 28 -84.09 gain 28 24 -81.14 gain 24 29 -86.12 gain 29 24 -84.71 gain 24 30 -86.22 gain 30 24 -89.82 gain 24 31 -83.58 gain 31 24 -83.74 gain 24 32 -83.82 gain 32 24 -81.33 gain 24 33 -86.42 gain 33 24 -85.38 gain 24 34 -87.66 gain 34 24 -87.25 gain 24 35 -80.55 gain 35 24 -81.09 gain 24 36 -79.67 gain 36 24 -80.35 gain 24 37 -72.69 gain 37 24 -75.92 gain 24 38 -70.10 gain 38 24 -70.86 gain 24 39 -66.69 gain 39 24 -71.77 gain 24 40 -63.62 gain 40 24 -63.68 gain 24 41 -81.37 gain 41 24 -76.78 gain 24 42 -80.11 gain 42 24 -82.76 gain 24 43 -84.69 gain 43 24 -84.93 gain 24 44 -84.86 gain 44 24 -88.70 gain 24 45 -92.56 gain 45 24 -96.38 gain 24 46 -91.76 gain 46 24 -92.05 gain 24 47 -90.57 gain 47 24 -88.55 gain 24 48 -87.31 gain 48 24 -84.87 gain 24 49 -87.46 gain 49 24 -89.08 gain 24 50 -83.52 gain 50 24 -82.00 gain 24 51 -77.92 gain 51 24 -80.09 gain 24 52 -79.71 gain 52 24 -79.12 gain 24 53 -74.87 gain 53 24 -74.84 gain 24 54 -66.56 gain 54 24 -65.93 gain 24 55 -75.22 gain 55 24 -71.51 gain 24 56 -70.58 gain 56 24 -71.92 gain 24 57 -81.76 gain 57 24 -82.18 gain 24 58 -87.73 gain 58 24 -84.85 gain 24 59 -83.09 gain 59 24 -79.45 gain 24 60 -89.97 gain 60 24 -95.62 gain 24 61 -96.88 gain 61 24 -94.43 gain 24 62 -90.92 gain 62 24 -85.98 gain 24 63 -88.52 gain 63 24 -87.55 gain 24 64 -97.37 gain 64 24 -100.62 gain 24 65 -83.19 gain 65 24 -81.99 gain 24 66 -82.97 gain 66 24 -80.75 gain 24 67 -78.33 gain 67 24 -77.34 gain 24 68 -85.12 gain 68 24 -86.72 gain 24 69 -75.16 gain 69 24 -73.98 gain 24 70 -76.93 gain 70 24 -74.21 gain 24 71 -78.45 gain 71 24 -79.31 gain 24 72 -88.37 gain 72 24 -86.78 gain 24 73 -85.40 gain 73 24 -85.18 gain 24 74 -84.80 gain 74 24 -80.69 gain 24 75 -92.68 gain 75 24 -94.46 gain 24 76 -91.93 gain 76 24 -93.83 gain 24 77 -89.33 gain 77 24 -87.23 gain 24 78 -95.98 gain 78 24 -98.39 gain 24 79 -92.20 gain 79 24 -94.23 gain 24 80 -86.24 gain 80 24 -86.06 gain 24 81 -89.08 gain 81 24 -89.81 gain 24 82 -82.90 gain 82 24 -84.60 gain 24 83 -87.17 gain 83 24 -86.14 gain 24 84 -70.76 gain 84 24 -66.92 gain 24 85 -79.81 gain 85 24 -81.40 gain 24 86 -81.54 gain 86 24 -84.77 gain 24 87 -85.58 gain 87 24 -86.09 gain 24 88 -90.02 gain 88 24 -90.17 gain 24 89 -90.66 gain 89 24 -92.96 gain 24 90 -99.12 gain 90 24 -100.76 gain 24 91 -94.10 gain 91 24 -96.81 gain 24 92 -95.48 gain 92 24 -99.11 gain 24 93 -87.93 gain 93 24 -88.92 gain 24 94 -92.52 gain 94 24 -92.07 gain 24 95 -95.28 gain 95 24 -94.08 gain 24 96 -80.13 gain 96 24 -85.90 gain 24 97 -85.22 gain 97 24 -83.81 gain 24 98 -85.42 gain 98 24 -84.48 gain 24 99 -79.22 gain 99 24 -77.42 gain 24 100 -89.10 gain 100 24 -87.21 gain 24 101 -86.06 gain 101 24 -87.80 gain 24 102 -91.30 gain 102 24 -93.01 gain 24 103 -83.38 gain 103 24 -86.25 gain 24 104 -93.88 gain 104 24 -99.25 gain 24 105 -91.18 gain 105 24 -91.07 gain 24 106 -97.38 gain 106 24 -94.59 gain 24 107 -87.94 gain 107 24 -85.06 gain 24 108 -94.32 gain 108 24 -91.06 gain 24 109 -94.95 gain 109 24 -95.14 gain 24 110 -90.34 gain 110 24 -96.88 gain 24 111 -91.33 gain 111 24 -87.84 gain 24 112 -94.11 gain 112 24 -94.09 gain 24 113 -84.48 gain 113 24 -83.59 gain 24 114 -88.11 gain 114 24 -84.38 gain 24 115 -87.03 gain 115 24 -83.96 gain 24 116 -85.17 gain 116 24 -84.53 gain 24 117 -90.57 gain 117 24 -87.08 gain 24 118 -90.85 gain 118 24 -88.97 gain 24 119 -95.01 gain 119 24 -98.19 gain 24 120 -90.41 gain 120 24 -90.98 gain 24 121 -102.79 gain 121 24 -104.38 gain 24 122 -89.54 gain 122 24 -90.88 gain 24 123 -89.68 gain 123 24 -91.37 gain 24 124 -90.09 gain 124 24 -89.76 gain 24 125 -92.20 gain 125 24 -95.21 gain 24 126 -92.40 gain 126 24 -92.05 gain 24 127 -93.67 gain 127 24 -92.96 gain 24 128 -92.70 gain 128 24 -94.58 gain 24 129 -95.53 gain 129 24 -94.62 gain 24 130 -86.41 gain 130 24 -86.79 gain 24 131 -89.22 gain 131 24 -89.38 gain 24 132 -90.10 gain 132 24 -86.26 gain 24 133 -94.60 gain 133 24 -95.93 gain 24 134 -96.65 gain 134 24 -94.85 gain 24 135 -97.23 gain 135 24 -97.74 gain 24 136 -99.39 gain 136 24 -100.33 gain 24 137 -94.22 gain 137 24 -98.07 gain 24 138 -91.71 gain 138 24 -89.10 gain 24 139 -88.96 gain 139 24 -89.62 gain 24 140 -95.93 gain 140 24 -97.42 gain 24 141 -96.75 gain 141 24 -90.21 gain 24 142 -88.40 gain 142 24 -88.60 gain 24 143 -88.31 gain 143 24 -91.24 gain 24 144 -93.78 gain 144 24 -95.08 gain 24 145 -96.26 gain 145 24 -100.95 gain 24 146 -98.05 gain 146 24 -98.73 gain 24 147 -106.25 gain 147 24 -104.03 gain 24 148 -91.79 gain 148 24 -87.90 gain 24 149 -102.86 gain 149 24 -102.63 gain 24 150 -93.96 gain 150 24 -94.57 gain 24 151 -98.40 gain 151 24 -97.94 gain 24 152 -97.05 gain 152 24 -96.41 gain 24 153 -93.78 gain 153 24 -92.36 gain 24 154 -95.92 gain 154 24 -96.40 gain 24 155 -90.44 gain 155 24 -89.49 gain 24 156 -101.70 gain 156 24 -99.99 gain 24 157 -100.66 gain 157 24 -101.43 gain 24 158 -98.00 gain 158 24 -98.27 gain 24 159 -92.03 gain 159 24 -94.68 gain 24 160 -87.28 gain 160 24 -87.08 gain 24 161 -101.86 gain 161 24 -104.10 gain 24 162 -96.95 gain 162 24 -98.90 gain 24 163 -97.51 gain 163 24 -101.37 gain 24 164 -89.73 gain 164 24 -92.97 gain 24 165 -100.27 gain 165 24 -100.56 gain 24 166 -92.58 gain 166 24 -92.63 gain 24 167 -95.43 gain 167 24 -96.19 gain 24 168 -99.39 gain 168 24 -99.05 gain 24 169 -91.19 gain 169 24 -91.96 gain 24 170 -97.46 gain 170 24 -97.47 gain 24 171 -92.87 gain 171 24 -93.96 gain 24 172 -97.62 gain 172 24 -96.90 gain 24 173 -95.43 gain 173 24 -99.36 gain 24 174 -95.12 gain 174 24 -95.09 gain 24 175 -101.41 gain 175 24 -102.52 gain 24 176 -95.64 gain 176 24 -95.72 gain 24 177 -96.26 gain 177 24 -99.34 gain 24 178 -101.93 gain 178 24 -98.45 gain 24 179 -100.73 gain 179 24 -96.67 gain 24 180 -100.55 gain 180 24 -105.94 gain 24 181 -103.89 gain 181 24 -103.31 gain 24 182 -94.48 gain 182 24 -94.99 gain 24 183 -98.19 gain 183 24 -98.96 gain 24 184 -104.52 gain 184 24 -108.04 gain 24 185 -98.58 gain 185 24 -105.97 gain 24 186 -91.84 gain 186 24 -94.81 gain 24 187 -97.04 gain 187 24 -97.74 gain 24 188 -86.24 gain 188 24 -89.35 gain 24 189 -100.41 gain 189 24 -98.25 gain 24 190 -91.90 gain 190 24 -93.65 gain 24 191 -94.35 gain 191 24 -94.81 gain 24 192 -96.82 gain 192 24 -95.98 gain 24 193 -96.44 gain 193 24 -94.58 gain 24 194 -94.69 gain 194 24 -93.61 gain 24 195 -100.36 gain 195 24 -97.83 gain 24 196 -98.93 gain 196 24 -100.71 gain 24 197 -96.38 gain 197 24 -93.29 gain 24 198 -100.04 gain 198 24 -101.47 gain 24 199 -96.61 gain 199 24 -98.14 gain 24 200 -94.37 gain 200 24 -97.25 gain 24 201 -90.29 gain 201 24 -93.07 gain 24 202 -104.39 gain 202 24 -106.30 gain 24 203 -102.69 gain 203 24 -103.72 gain 24 204 -94.40 gain 204 24 -92.07 gain 24 205 -93.49 gain 205 24 -94.91 gain 24 206 -109.51 gain 206 24 -112.03 gain 24 207 -95.00 gain 207 24 -96.94 gain 24 208 -99.77 gain 208 24 -104.31 gain 24 209 -95.93 gain 209 24 -100.04 gain 24 210 -107.75 gain 210 24 -112.04 gain 24 211 -96.43 gain 211 24 -95.95 gain 24 212 -103.19 gain 212 24 -105.72 gain 24 213 -105.78 gain 213 24 -107.64 gain 24 214 -100.18 gain 214 24 -107.42 gain 24 215 -98.17 gain 215 24 -100.82 gain 24 216 -102.14 gain 216 24 -108.70 gain 24 217 -97.88 gain 217 24 -104.70 gain 24 218 -89.93 gain 218 24 -89.56 gain 24 219 -100.56 gain 219 24 -100.67 gain 24 220 -101.49 gain 220 24 -97.68 gain 24 221 -100.76 gain 221 24 -102.63 gain 24 222 -103.44 gain 222 24 -101.11 gain 24 223 -101.95 gain 223 24 -102.87 gain 24 224 -95.30 gain 224 24 -96.69 gain 25 26 -61.27 gain 26 25 -62.70 gain 25 27 -70.73 gain 27 25 -69.76 gain 25 28 -89.00 gain 28 25 -83.36 gain 25 29 -83.31 gain 29 25 -79.22 gain 25 30 -99.61 gain 30 25 -100.53 gain 25 31 -94.95 gain 31 25 -92.43 gain 25 32 -93.99 gain 32 25 -88.82 gain 25 33 -90.58 gain 33 25 -86.86 gain 25 34 -93.10 gain 34 25 -90.02 gain 25 35 -87.96 gain 35 25 -85.82 gain 25 36 -84.33 gain 36 25 -82.34 gain 25 37 -78.74 gain 37 25 -79.28 gain 25 38 -77.58 gain 38 25 -75.66 gain 25 39 -57.85 gain 39 25 -60.25 gain 25 40 -72.69 gain 40 25 -70.07 gain 25 41 -69.09 gain 41 25 -61.82 gain 25 42 -77.70 gain 42 25 -77.67 gain 25 43 -85.36 gain 43 25 -82.92 gain 25 44 -87.00 gain 44 25 -88.15 gain 25 45 -99.63 gain 45 25 -100.77 gain 25 46 -90.77 gain 46 25 -88.37 gain 25 47 -95.78 gain 47 25 -91.09 gain 25 48 -90.56 gain 48 25 -85.44 gain 25 49 -89.85 gain 49 25 -88.79 gain 25 50 -87.63 gain 50 25 -83.44 gain 25 51 -91.79 gain 51 25 -91.28 gain 25 52 -79.68 gain 52 25 -76.41 gain 25 53 -82.75 gain 53 25 -80.03 gain 25 54 -74.44 gain 54 25 -71.13 gain 25 55 -81.40 gain 55 25 -75.01 gain 25 56 -80.25 gain 56 25 -78.90 gain 25 57 -77.22 gain 57 25 -74.96 gain 25 58 -84.14 gain 58 25 -78.58 gain 25 59 -88.02 gain 59 25 -81.71 gain 25 60 -96.32 gain 60 25 -99.29 gain 25 61 -98.19 gain 61 25 -93.06 gain 25 62 -97.33 gain 62 25 -89.71 gain 25 63 -100.71 gain 63 25 -97.06 gain 25 64 -95.46 gain 64 25 -96.03 gain 25 65 -86.40 gain 65 25 -82.52 gain 25 66 -88.64 gain 66 25 -83.75 gain 25 67 -83.03 gain 67 25 -79.36 gain 25 68 -72.62 gain 68 25 -71.54 gain 25 69 -90.98 gain 69 25 -87.12 gain 25 70 -75.33 gain 70 25 -69.93 gain 25 71 -80.36 gain 71 25 -78.54 gain 25 72 -84.66 gain 72 25 -80.39 gain 25 73 -85.08 gain 73 25 -82.18 gain 25 74 -92.22 gain 74 25 -85.43 gain 25 75 -93.15 gain 75 25 -92.26 gain 25 76 -92.68 gain 76 25 -91.91 gain 25 77 -90.53 gain 77 25 -85.75 gain 25 78 -102.49 gain 78 25 -102.21 gain 25 79 -92.13 gain 79 25 -91.47 gain 25 80 -88.05 gain 80 25 -85.19 gain 25 81 -94.26 gain 81 25 -92.31 gain 25 82 -90.63 gain 82 25 -89.65 gain 25 83 -89.71 gain 83 25 -86.00 gain 25 84 -86.17 gain 84 25 -79.65 gain 25 85 -89.71 gain 85 25 -88.62 gain 25 86 -82.21 gain 86 25 -82.76 gain 25 87 -95.78 gain 87 25 -93.62 gain 25 88 -92.72 gain 88 25 -90.20 gain 25 89 -93.63 gain 89 25 -93.26 gain 25 90 -98.56 gain 90 25 -97.52 gain 25 91 -99.29 gain 91 25 -99.32 gain 25 92 -97.24 gain 92 25 -98.19 gain 25 93 -88.93 gain 93 25 -87.24 gain 25 94 -93.82 gain 94 25 -90.69 gain 25 95 -88.22 gain 95 25 -84.34 gain 25 96 -90.43 gain 96 25 -93.52 gain 25 97 -96.09 gain 97 25 -92.00 gain 25 98 -91.54 gain 98 25 -87.92 gain 25 99 -82.15 gain 99 25 -77.67 gain 25 100 -84.34 gain 100 25 -79.77 gain 25 101 -84.26 gain 101 25 -83.33 gain 25 102 -95.87 gain 102 25 -94.90 gain 25 103 -89.76 gain 103 25 -89.96 gain 25 104 -102.87 gain 104 25 -105.55 gain 25 105 -104.53 gain 105 25 -101.73 gain 25 106 -97.97 gain 106 25 -92.50 gain 25 107 -101.49 gain 107 25 -95.93 gain 25 108 -91.88 gain 108 25 -85.93 gain 25 109 -98.94 gain 109 25 -96.45 gain 25 110 -92.55 gain 110 25 -96.42 gain 25 111 -91.22 gain 111 25 -85.06 gain 25 112 -89.39 gain 112 25 -86.69 gain 25 113 -89.94 gain 113 25 -86.37 gain 25 114 -86.14 gain 114 25 -79.73 gain 25 115 -77.19 gain 115 25 -71.44 gain 25 116 -90.18 gain 116 25 -86.86 gain 25 117 -89.88 gain 117 25 -83.70 gain 25 118 -91.22 gain 118 25 -86.66 gain 25 119 -92.68 gain 119 25 -93.19 gain 25 120 -100.41 gain 120 25 -98.30 gain 25 121 -98.00 gain 121 25 -96.91 gain 25 122 -90.04 gain 122 25 -88.70 gain 25 123 -99.10 gain 123 25 -98.10 gain 25 124 -94.69 gain 124 25 -91.68 gain 25 125 -94.73 gain 125 25 -95.06 gain 25 126 -93.70 gain 126 25 -90.68 gain 25 127 -95.64 gain 127 25 -92.25 gain 25 128 -95.30 gain 128 25 -94.49 gain 25 129 -97.48 gain 129 25 -93.89 gain 25 130 -97.02 gain 130 25 -94.72 gain 25 131 -91.83 gain 131 25 -89.30 gain 25 132 -83.90 gain 132 25 -77.38 gain 25 133 -95.06 gain 133 25 -93.71 gain 25 134 -93.24 gain 134 25 -88.76 gain 25 135 -94.81 gain 135 25 -92.64 gain 25 136 -98.79 gain 136 25 -97.06 gain 25 137 -99.10 gain 137 25 -100.28 gain 25 138 -96.04 gain 138 25 -90.75 gain 25 139 -95.70 gain 139 25 -93.67 gain 25 140 -97.24 gain 140 25 -96.04 gain 25 141 -95.63 gain 141 25 -86.41 gain 25 142 -97.96 gain 142 25 -95.47 gain 25 143 -97.67 gain 143 25 -97.93 gain 25 144 -91.61 gain 144 25 -90.23 gain 25 145 -92.77 gain 145 25 -94.78 gain 25 146 -90.90 gain 146 25 -88.90 gain 25 147 -93.32 gain 147 25 -88.43 gain 25 148 -97.18 gain 148 25 -90.61 gain 25 149 -100.17 gain 149 25 -97.26 gain 25 150 -98.72 gain 150 25 -96.65 gain 25 151 -95.51 gain 151 25 -92.38 gain 25 152 -97.74 gain 152 25 -94.42 gain 25 153 -93.86 gain 153 25 -89.76 gain 25 154 -103.73 gain 154 25 -101.53 gain 25 155 -89.60 gain 155 25 -85.97 gain 25 156 -101.54 gain 156 25 -97.15 gain 25 157 -89.14 gain 157 25 -87.22 gain 25 158 -98.81 gain 158 25 -96.40 gain 25 159 -97.08 gain 159 25 -97.05 gain 25 160 -90.18 gain 160 25 -87.31 gain 25 161 -94.33 gain 161 25 -93.89 gain 25 162 -98.12 gain 162 25 -97.39 gain 25 163 -93.51 gain 163 25 -94.69 gain 25 164 -101.90 gain 164 25 -102.46 gain 25 165 -106.40 gain 165 25 -104.01 gain 25 166 -108.92 gain 166 25 -106.29 gain 25 167 -99.36 gain 167 25 -97.45 gain 25 168 -104.51 gain 168 25 -101.49 gain 25 169 -97.57 gain 169 25 -95.67 gain 25 170 -92.98 gain 170 25 -90.31 gain 25 171 -101.53 gain 171 25 -99.94 gain 25 172 -98.13 gain 172 25 -94.73 gain 25 173 -99.34 gain 173 25 -100.59 gain 25 174 -98.77 gain 174 25 -96.07 gain 25 175 -90.01 gain 175 25 -88.44 gain 25 176 -97.39 gain 176 25 -94.79 gain 25 177 -101.76 gain 177 25 -102.17 gain 25 178 -95.83 gain 178 25 -89.67 gain 25 179 -98.29 gain 179 25 -91.55 gain 25 180 -105.76 gain 180 25 -108.48 gain 25 181 -93.95 gain 181 25 -90.68 gain 25 182 -97.87 gain 182 25 -95.69 gain 25 183 -103.23 gain 183 25 -101.33 gain 25 184 -95.73 gain 184 25 -96.58 gain 25 185 -101.46 gain 185 25 -106.17 gain 25 186 -97.38 gain 186 25 -97.67 gain 25 187 -93.87 gain 187 25 -91.89 gain 25 188 -97.61 gain 188 25 -98.05 gain 25 189 -104.39 gain 189 25 -99.54 gain 25 190 -92.00 gain 190 25 -91.08 gain 25 191 -98.94 gain 191 25 -96.72 gain 25 192 -95.48 gain 192 25 -91.96 gain 25 193 -100.65 gain 193 25 -96.11 gain 25 194 -94.17 gain 194 25 -90.41 gain 25 195 -111.14 gain 195 25 -105.93 gain 25 196 -109.15 gain 196 25 -108.25 gain 25 197 -101.07 gain 197 25 -95.30 gain 25 198 -102.72 gain 198 25 -101.47 gain 25 199 -104.43 gain 199 25 -103.29 gain 25 200 -94.49 gain 200 25 -94.68 gain 25 201 -97.91 gain 201 25 -98.01 gain 25 202 -102.12 gain 202 25 -101.35 gain 25 203 -102.96 gain 203 25 -101.31 gain 25 204 -101.60 gain 204 25 -96.59 gain 25 205 -95.40 gain 205 25 -94.13 gain 25 206 -96.47 gain 206 25 -96.31 gain 25 207 -97.10 gain 207 25 -96.36 gain 25 208 -100.61 gain 208 25 -102.47 gain 25 209 -101.12 gain 209 25 -102.55 gain 25 210 -101.82 gain 210 25 -103.43 gain 25 211 -103.42 gain 211 25 -100.26 gain 25 212 -109.67 gain 212 25 -109.52 gain 25 213 -102.09 gain 213 25 -101.27 gain 25 214 -101.92 gain 214 25 -106.49 gain 25 215 -95.92 gain 215 25 -95.89 gain 25 216 -104.80 gain 216 25 -108.67 gain 25 217 -100.49 gain 217 25 -104.63 gain 25 218 -104.61 gain 218 25 -101.55 gain 25 219 -101.53 gain 219 25 -98.96 gain 25 220 -96.24 gain 220 25 -89.75 gain 25 221 -100.44 gain 221 25 -99.63 gain 25 222 -100.82 gain 222 25 -95.82 gain 25 223 -104.12 gain 223 25 -102.36 gain 25 224 -107.79 gain 224 25 -106.49 gain 26 27 -71.35 gain 27 26 -68.96 gain 26 28 -81.53 gain 28 26 -74.47 gain 26 29 -76.37 gain 29 26 -70.85 gain 26 30 -109.29 gain 30 26 -108.78 gain 26 31 -100.26 gain 31 26 -96.31 gain 26 32 -95.32 gain 32 26 -88.72 gain 26 33 -98.40 gain 33 26 -93.25 gain 26 34 -91.94 gain 34 26 -87.42 gain 26 35 -93.33 gain 35 26 -89.76 gain 26 36 -86.53 gain 36 26 -83.11 gain 26 37 -83.95 gain 37 26 -83.06 gain 26 38 -83.35 gain 38 26 -80.00 gain 26 39 -75.47 gain 39 26 -76.44 gain 26 40 -74.79 gain 40 26 -70.74 gain 26 41 -72.02 gain 41 26 -63.31 gain 26 42 -66.75 gain 42 26 -65.29 gain 26 43 -79.81 gain 43 26 -75.95 gain 26 44 -84.03 gain 44 26 -83.76 gain 26 45 -100.92 gain 45 26 -100.64 gain 26 46 -96.66 gain 46 26 -92.83 gain 26 47 -100.68 gain 47 26 -94.55 gain 26 48 -99.88 gain 48 26 -93.33 gain 26 49 -95.50 gain 49 26 -93.01 gain 26 50 -87.01 gain 50 26 -81.38 gain 26 51 -93.33 gain 51 26 -91.40 gain 26 52 -85.50 gain 52 26 -80.80 gain 26 53 -88.40 gain 53 26 -84.26 gain 26 54 -78.95 gain 54 26 -74.22 gain 26 55 -82.98 gain 55 26 -75.16 gain 26 56 -73.72 gain 56 26 -70.95 gain 26 57 -82.01 gain 57 26 -78.32 gain 26 58 -84.62 gain 58 26 -77.62 gain 26 59 -85.09 gain 59 26 -77.35 gain 26 60 -97.14 gain 60 26 -98.68 gain 26 61 -99.93 gain 61 26 -93.37 gain 26 62 -99.88 gain 62 26 -90.83 gain 26 63 -99.25 gain 63 26 -94.17 gain 26 64 -92.86 gain 64 26 -92.01 gain 26 65 -95.62 gain 65 26 -90.31 gain 26 66 -97.58 gain 66 26 -91.26 gain 26 67 -84.69 gain 67 26 -79.59 gain 26 68 -85.15 gain 68 26 -82.64 gain 26 69 -86.01 gain 69 26 -80.72 gain 26 70 -87.95 gain 70 26 -81.13 gain 26 71 -75.17 gain 71 26 -71.92 gain 26 72 -77.70 gain 72 26 -72.00 gain 26 73 -86.00 gain 73 26 -81.67 gain 26 74 -86.35 gain 74 26 -78.14 gain 26 75 -105.85 gain 75 26 -103.53 gain 26 76 -95.83 gain 76 26 -93.63 gain 26 77 -92.01 gain 77 26 -85.81 gain 26 78 -92.52 gain 78 26 -90.82 gain 26 79 -89.29 gain 79 26 -87.20 gain 26 80 -90.53 gain 80 26 -86.23 gain 26 81 -89.25 gain 81 26 -85.86 gain 26 82 -88.32 gain 82 26 -85.91 gain 26 83 -94.99 gain 83 26 -89.86 gain 26 84 -94.44 gain 84 26 -86.49 gain 26 85 -82.94 gain 85 26 -80.42 gain 26 86 -84.65 gain 86 26 -83.77 gain 26 87 -82.15 gain 87 26 -78.56 gain 26 88 -89.85 gain 88 26 -85.90 gain 26 89 -102.38 gain 89 26 -100.58 gain 26 90 -109.26 gain 90 26 -106.80 gain 26 91 -98.37 gain 91 26 -96.97 gain 26 92 -95.05 gain 92 26 -94.57 gain 26 93 -95.22 gain 93 26 -92.10 gain 26 94 -89.95 gain 94 26 -85.40 gain 26 95 -91.68 gain 95 26 -86.37 gain 26 96 -92.42 gain 96 26 -94.08 gain 26 97 -96.09 gain 97 26 -90.57 gain 26 98 -89.75 gain 98 26 -84.70 gain 26 99 -97.67 gain 99 26 -91.76 gain 26 100 -84.17 gain 100 26 -78.18 gain 26 101 -90.73 gain 101 26 -88.36 gain 26 102 -91.03 gain 102 26 -88.63 gain 26 103 -89.74 gain 103 26 -88.51 gain 26 104 -91.60 gain 104 26 -92.85 gain 26 105 -98.50 gain 105 26 -94.27 gain 26 106 -104.34 gain 106 26 -97.45 gain 26 107 -94.98 gain 107 26 -87.99 gain 26 108 -96.76 gain 108 26 -89.39 gain 26 109 -102.28 gain 109 26 -98.36 gain 26 110 -89.26 gain 110 26 -91.69 gain 26 111 -89.77 gain 111 26 -82.18 gain 26 112 -87.72 gain 112 26 -83.59 gain 26 113 -98.63 gain 113 26 -93.63 gain 26 114 -97.39 gain 114 26 -89.55 gain 26 115 -88.44 gain 115 26 -81.27 gain 26 116 -88.17 gain 116 26 -83.42 gain 26 117 -96.79 gain 117 26 -89.19 gain 26 118 -92.94 gain 118 26 -86.96 gain 26 119 -92.91 gain 119 26 -91.98 gain 26 120 -98.74 gain 120 26 -95.20 gain 26 121 -105.07 gain 121 26 -102.55 gain 26 122 -95.65 gain 122 26 -92.88 gain 26 123 -104.54 gain 123 26 -102.11 gain 26 124 -93.59 gain 124 26 -89.15 gain 26 125 -92.42 gain 125 26 -91.32 gain 26 126 -97.01 gain 126 26 -92.56 gain 26 127 -93.73 gain 127 26 -88.91 gain 26 128 -89.59 gain 128 26 -87.36 gain 26 129 -92.99 gain 129 26 -87.97 gain 26 130 -87.19 gain 130 26 -83.46 gain 26 131 -97.70 gain 131 26 -93.74 gain 26 132 -94.15 gain 132 26 -86.21 gain 26 133 -91.57 gain 133 26 -88.80 gain 26 134 -93.84 gain 134 26 -87.94 gain 26 135 -107.15 gain 135 26 -103.54 gain 26 136 -102.21 gain 136 26 -99.04 gain 26 137 -97.97 gain 137 26 -97.72 gain 26 138 -101.05 gain 138 26 -94.33 gain 26 139 -93.23 gain 139 26 -89.78 gain 26 140 -105.53 gain 140 26 -102.90 gain 26 141 -97.02 gain 141 26 -86.37 gain 26 142 -93.43 gain 142 26 -89.52 gain 26 143 -101.61 gain 143 26 -100.43 gain 26 144 -92.97 gain 144 26 -90.16 gain 26 145 -94.90 gain 145 26 -95.48 gain 26 146 -94.32 gain 146 26 -90.89 gain 26 147 -95.54 gain 147 26 -89.22 gain 26 148 -95.51 gain 148 26 -87.51 gain 26 149 -95.22 gain 149 26 -90.88 gain 26 150 -103.26 gain 150 26 -99.75 gain 26 151 -105.09 gain 151 26 -100.53 gain 26 152 -110.86 gain 152 26 -106.12 gain 26 153 -96.70 gain 153 26 -91.17 gain 26 154 -105.00 gain 154 26 -101.37 gain 26 155 -103.14 gain 155 26 -98.09 gain 26 156 -106.83 gain 156 26 -101.00 gain 26 157 -97.60 gain 157 26 -94.26 gain 26 158 -99.91 gain 158 26 -96.06 gain 26 159 -98.99 gain 159 26 -97.53 gain 26 160 -86.21 gain 160 26 -81.91 gain 26 161 -97.89 gain 161 26 -96.03 gain 26 162 -105.26 gain 162 26 -103.10 gain 26 163 -96.26 gain 163 26 -96.02 gain 26 164 -97.23 gain 164 26 -96.36 gain 26 165 -94.66 gain 165 26 -90.85 gain 26 166 -105.23 gain 166 26 -101.17 gain 26 167 -103.67 gain 167 26 -100.33 gain 26 168 -105.98 gain 168 26 -101.53 gain 26 169 -107.51 gain 169 26 -104.18 gain 26 170 -102.76 gain 170 26 -98.66 gain 26 171 -100.40 gain 171 26 -97.39 gain 26 172 -99.08 gain 172 26 -94.25 gain 26 173 -98.44 gain 173 26 -98.26 gain 26 174 -98.46 gain 174 26 -94.32 gain 26 175 -106.39 gain 175 26 -103.39 gain 26 176 -93.24 gain 176 26 -89.21 gain 26 177 -95.98 gain 177 26 -94.96 gain 26 178 -98.69 gain 178 26 -91.10 gain 26 179 -94.79 gain 179 26 -86.63 gain 26 180 -110.89 gain 180 26 -112.18 gain 26 181 -100.90 gain 181 26 -96.21 gain 26 182 -101.69 gain 182 26 -98.09 gain 26 183 -97.21 gain 183 26 -93.88 gain 26 184 -95.60 gain 184 26 -95.02 gain 26 185 -100.53 gain 185 26 -103.82 gain 26 186 -105.77 gain 186 26 -104.63 gain 26 187 -100.79 gain 187 26 -97.38 gain 26 188 -100.54 gain 188 26 -99.54 gain 26 189 -95.11 gain 189 26 -88.84 gain 26 190 -106.23 gain 190 26 -103.87 gain 26 191 -103.29 gain 191 26 -99.64 gain 26 192 -101.75 gain 192 26 -96.79 gain 26 193 -102.39 gain 193 26 -96.42 gain 26 194 -96.52 gain 194 26 -91.33 gain 26 195 -97.86 gain 195 26 -91.22 gain 26 196 -109.40 gain 196 26 -107.07 gain 26 197 -99.02 gain 197 26 -91.82 gain 26 198 -103.27 gain 198 26 -100.59 gain 26 199 -99.26 gain 199 26 -96.69 gain 26 200 -96.45 gain 200 26 -95.21 gain 26 201 -106.24 gain 201 26 -104.91 gain 26 202 -104.56 gain 202 26 -102.37 gain 26 203 -104.80 gain 203 26 -101.72 gain 26 204 -107.66 gain 204 26 -101.22 gain 26 205 -104.29 gain 205 26 -101.59 gain 26 206 -103.45 gain 206 26 -101.86 gain 26 207 -97.51 gain 207 26 -95.34 gain 26 208 -107.11 gain 208 26 -107.54 gain 26 209 -101.50 gain 209 26 -101.50 gain 26 210 -102.43 gain 210 26 -102.61 gain 26 211 -109.52 gain 211 26 -104.93 gain 26 212 -101.21 gain 212 26 -99.63 gain 26 213 -108.96 gain 213 26 -106.71 gain 26 214 -101.19 gain 214 26 -104.33 gain 26 215 -100.70 gain 215 26 -99.24 gain 26 216 -100.81 gain 216 26 -103.26 gain 26 217 -100.58 gain 217 26 -103.29 gain 26 218 -98.98 gain 218 26 -94.50 gain 26 219 -99.98 gain 219 26 -95.98 gain 26 220 -104.45 gain 220 26 -96.53 gain 26 221 -101.37 gain 221 26 -99.13 gain 26 222 -104.14 gain 222 26 -97.71 gain 26 223 -103.45 gain 223 26 -100.27 gain 26 224 -108.00 gain 224 26 -105.28 gain 27 28 -65.62 gain 28 27 -60.95 gain 27 29 -75.93 gain 29 27 -72.80 gain 27 30 -98.24 gain 30 27 -100.12 gain 27 31 -93.40 gain 31 27 -91.84 gain 27 32 -91.04 gain 32 27 -86.84 gain 27 33 -98.86 gain 33 27 -96.10 gain 27 34 -94.30 gain 34 27 -92.18 gain 27 35 -93.57 gain 35 27 -92.39 gain 27 36 -96.02 gain 36 27 -94.99 gain 27 37 -86.33 gain 37 27 -87.83 gain 27 38 -88.93 gain 38 27 -87.97 gain 27 39 -80.87 gain 39 27 -84.23 gain 27 40 -81.26 gain 40 27 -79.60 gain 27 41 -72.93 gain 41 27 -66.61 gain 27 42 -70.28 gain 42 27 -71.22 gain 27 43 -74.81 gain 43 27 -73.33 gain 27 44 -78.48 gain 44 27 -80.59 gain 27 45 -106.81 gain 45 27 -108.91 gain 27 46 -95.08 gain 46 27 -93.65 gain 27 47 -90.48 gain 47 27 -86.75 gain 27 48 -101.92 gain 48 27 -97.76 gain 27 49 -91.95 gain 49 27 -91.85 gain 27 50 -88.33 gain 50 27 -85.09 gain 27 51 -92.95 gain 51 27 -93.41 gain 27 52 -95.96 gain 52 27 -93.65 gain 27 53 -87.42 gain 53 27 -85.66 gain 27 54 -83.47 gain 54 27 -81.13 gain 27 55 -83.30 gain 55 27 -77.87 gain 27 56 -83.70 gain 56 27 -83.32 gain 27 57 -76.66 gain 57 27 -75.36 gain 27 58 -80.13 gain 58 27 -75.52 gain 27 59 -76.88 gain 59 27 -71.53 gain 27 60 -103.97 gain 60 27 -107.90 gain 27 61 -101.48 gain 61 27 -97.31 gain 27 62 -97.07 gain 62 27 -90.41 gain 27 63 -92.67 gain 63 27 -89.98 gain 27 64 -91.91 gain 64 27 -93.45 gain 27 65 -89.23 gain 65 27 -86.31 gain 27 66 -87.30 gain 66 27 -83.37 gain 27 67 -90.22 gain 67 27 -87.51 gain 27 68 -93.96 gain 68 27 -93.85 gain 27 69 -86.25 gain 69 27 -83.35 gain 27 70 -80.80 gain 70 27 -76.37 gain 27 71 -84.64 gain 71 27 -83.77 gain 27 72 -76.47 gain 72 27 -73.16 gain 27 73 -84.62 gain 73 27 -82.68 gain 27 74 -90.43 gain 74 27 -84.60 gain 27 75 -103.10 gain 75 27 -103.16 gain 27 76 -95.62 gain 76 27 -95.81 gain 27 77 -96.68 gain 77 27 -92.86 gain 27 78 -93.13 gain 78 27 -93.82 gain 27 79 -88.18 gain 79 27 -88.48 gain 27 80 -94.16 gain 80 27 -92.26 gain 27 81 -91.12 gain 81 27 -90.13 gain 27 82 -87.74 gain 82 27 -87.72 gain 27 83 -86.75 gain 83 27 -84.01 gain 27 84 -77.79 gain 84 27 -72.23 gain 27 85 -80.07 gain 85 27 -79.94 gain 27 86 -80.19 gain 86 27 -81.70 gain 27 87 -82.05 gain 87 27 -80.84 gain 27 88 -90.88 gain 88 27 -89.32 gain 27 89 -81.52 gain 89 27 -82.11 gain 27 90 -96.01 gain 90 27 -95.94 gain 27 91 -97.32 gain 91 27 -98.31 gain 27 92 -96.76 gain 92 27 -98.67 gain 27 93 -95.82 gain 93 27 -95.09 gain 27 94 -96.37 gain 94 27 -94.20 gain 27 95 -90.08 gain 95 27 -87.16 gain 27 96 -89.08 gain 96 27 -93.13 gain 27 97 -93.74 gain 97 27 -90.61 gain 27 98 -88.95 gain 98 27 -86.29 gain 27 99 -86.49 gain 99 27 -82.97 gain 27 100 -95.54 gain 100 27 -91.94 gain 27 101 -87.69 gain 101 27 -87.71 gain 27 102 -80.35 gain 102 27 -80.34 gain 27 103 -88.92 gain 103 27 -90.07 gain 27 104 -84.68 gain 104 27 -88.32 gain 27 105 -98.95 gain 105 27 -97.12 gain 27 106 -102.05 gain 106 27 -97.55 gain 27 107 -97.93 gain 107 27 -93.33 gain 27 108 -94.18 gain 108 27 -89.19 gain 27 109 -95.05 gain 109 27 -93.52 gain 27 110 -100.42 gain 110 27 -105.25 gain 27 111 -90.57 gain 111 27 -85.37 gain 27 112 -89.90 gain 112 27 -88.16 gain 27 113 -91.88 gain 113 27 -89.27 gain 27 114 -97.90 gain 114 27 -92.45 gain 27 115 -90.20 gain 115 27 -85.41 gain 27 116 -83.11 gain 116 27 -80.75 gain 27 117 -88.35 gain 117 27 -83.14 gain 27 118 -91.29 gain 118 27 -87.70 gain 27 119 -98.05 gain 119 27 -99.52 gain 27 120 -102.95 gain 120 27 -101.80 gain 27 121 -98.04 gain 121 27 -97.91 gain 27 122 -91.13 gain 122 27 -90.75 gain 27 123 -96.69 gain 123 27 -96.65 gain 27 124 -94.02 gain 124 27 -91.97 gain 27 125 -96.29 gain 125 27 -97.58 gain 27 126 -92.34 gain 126 27 -90.28 gain 27 127 -95.04 gain 127 27 -92.61 gain 27 128 -89.99 gain 128 27 -90.15 gain 27 129 -91.89 gain 129 27 -89.26 gain 27 130 -93.56 gain 130 27 -92.22 gain 27 131 -94.74 gain 131 27 -93.18 gain 27 132 -86.91 gain 132 27 -81.36 gain 27 133 -90.01 gain 133 27 -89.63 gain 27 134 -92.36 gain 134 27 -88.84 gain 27 135 -95.87 gain 135 27 -94.65 gain 27 136 -101.11 gain 136 27 -100.33 gain 27 137 -103.18 gain 137 27 -105.32 gain 27 138 -96.86 gain 138 27 -92.53 gain 27 139 -89.12 gain 139 27 -88.06 gain 27 140 -99.02 gain 140 27 -98.78 gain 27 141 -94.45 gain 141 27 -86.19 gain 27 142 -97.39 gain 142 27 -95.87 gain 27 143 -97.73 gain 143 27 -98.95 gain 27 144 -95.99 gain 144 27 -95.57 gain 27 145 -90.32 gain 145 27 -93.29 gain 27 146 -83.38 gain 146 27 -82.34 gain 27 147 -99.33 gain 147 27 -95.40 gain 27 148 -93.77 gain 148 27 -88.17 gain 27 149 -95.10 gain 149 27 -93.15 gain 27 150 -100.17 gain 150 27 -99.06 gain 27 151 -102.49 gain 151 27 -100.32 gain 27 152 -97.90 gain 152 27 -95.54 gain 27 153 -100.65 gain 153 27 -97.51 gain 27 154 -102.09 gain 154 27 -100.85 gain 27 155 -103.70 gain 155 27 -101.04 gain 27 156 -102.36 gain 156 27 -98.93 gain 27 157 -97.08 gain 157 27 -96.12 gain 27 158 -84.91 gain 158 27 -83.45 gain 27 159 -91.91 gain 159 27 -92.84 gain 27 160 -92.33 gain 160 27 -90.41 gain 27 161 -92.91 gain 161 27 -93.43 gain 27 162 -91.21 gain 162 27 -91.44 gain 27 163 -95.49 gain 163 27 -97.64 gain 27 164 -95.40 gain 164 27 -96.92 gain 27 165 -104.83 gain 165 27 -103.40 gain 27 166 -103.36 gain 166 27 -101.69 gain 27 167 -99.34 gain 167 27 -98.39 gain 27 168 -96.64 gain 168 27 -94.58 gain 27 169 -90.33 gain 169 27 -89.39 gain 27 170 -92.79 gain 170 27 -91.08 gain 27 171 -101.47 gain 171 27 -100.85 gain 27 172 -96.89 gain 172 27 -94.45 gain 27 173 -95.35 gain 173 27 -97.56 gain 27 174 -99.97 gain 174 27 -98.23 gain 27 175 -96.07 gain 175 27 -95.46 gain 27 176 -96.22 gain 176 27 -94.58 gain 27 177 -98.00 gain 177 27 -99.37 gain 27 178 -96.11 gain 178 27 -90.92 gain 27 179 -95.98 gain 179 27 -90.20 gain 27 180 -96.73 gain 180 27 -100.41 gain 27 181 -95.00 gain 181 27 -92.70 gain 27 182 -104.24 gain 182 27 -103.02 gain 27 183 -98.60 gain 183 27 -97.66 gain 27 184 -103.12 gain 184 27 -104.93 gain 27 185 -98.70 gain 185 27 -104.38 gain 27 186 -99.19 gain 186 27 -100.44 gain 27 187 -99.83 gain 187 27 -98.81 gain 27 188 -96.45 gain 188 27 -97.84 gain 27 189 -103.72 gain 189 27 -99.84 gain 27 190 -99.63 gain 190 27 -99.67 gain 27 191 -89.25 gain 191 27 -87.99 gain 27 192 -89.86 gain 192 27 -87.29 gain 27 193 -89.05 gain 193 27 -85.48 gain 27 194 -95.64 gain 194 27 -92.85 gain 27 195 -109.60 gain 195 27 -105.35 gain 27 196 -98.43 gain 196 27 -98.49 gain 27 197 -101.59 gain 197 27 -96.78 gain 27 198 -105.12 gain 198 27 -104.83 gain 27 199 -94.69 gain 199 27 -94.51 gain 27 200 -103.27 gain 200 27 -104.42 gain 27 201 -95.40 gain 201 27 -96.46 gain 27 202 -104.69 gain 202 27 -104.88 gain 27 203 -100.77 gain 203 27 -100.08 gain 27 204 -95.74 gain 204 27 -91.69 gain 27 205 -94.27 gain 205 27 -93.96 gain 27 206 -100.05 gain 206 27 -100.86 gain 27 207 -97.78 gain 207 27 -98.00 gain 27 208 -96.39 gain 208 27 -99.21 gain 27 209 -104.83 gain 209 27 -107.22 gain 27 210 -104.59 gain 210 27 -107.16 gain 27 211 -100.48 gain 211 27 -98.28 gain 27 212 -101.95 gain 212 27 -102.76 gain 27 213 -100.61 gain 213 27 -100.75 gain 27 214 -102.30 gain 214 27 -107.83 gain 27 215 -100.00 gain 215 27 -100.92 gain 27 216 -103.13 gain 216 27 -107.97 gain 27 217 -97.38 gain 217 27 -102.48 gain 27 218 -98.22 gain 218 27 -96.13 gain 27 219 -94.10 gain 219 27 -92.49 gain 27 220 -96.24 gain 220 27 -90.71 gain 27 221 -99.99 gain 221 27 -100.15 gain 27 222 -97.55 gain 222 27 -93.51 gain 27 223 -98.50 gain 223 27 -97.70 gain 27 224 -104.01 gain 224 27 -103.68 gain 28 29 -65.43 gain 29 28 -66.97 gain 28 30 -101.83 gain 30 28 -108.38 gain 28 31 -89.28 gain 31 28 -92.39 gain 28 32 -94.22 gain 32 28 -94.69 gain 28 33 -97.31 gain 33 28 -99.22 gain 28 34 -86.71 gain 34 28 -89.25 gain 28 35 -89.23 gain 35 28 -92.72 gain 28 36 -85.03 gain 36 28 -88.67 gain 28 37 -91.37 gain 37 28 -97.55 gain 28 38 -83.80 gain 38 28 -87.52 gain 28 39 -76.65 gain 39 28 -84.69 gain 28 40 -80.88 gain 40 28 -83.89 gain 28 41 -74.02 gain 41 28 -72.37 gain 28 42 -68.29 gain 42 28 -73.90 gain 28 43 -63.63 gain 43 28 -66.83 gain 28 44 -67.95 gain 44 28 -74.74 gain 28 45 -99.48 gain 45 28 -106.26 gain 28 46 -85.21 gain 46 28 -88.45 gain 28 47 -91.76 gain 47 28 -92.70 gain 28 48 -90.88 gain 48 28 -91.40 gain 28 49 -89.48 gain 49 28 -94.06 gain 28 50 -91.73 gain 50 28 -93.16 gain 28 51 -89.03 gain 51 28 -94.16 gain 28 52 -82.04 gain 52 28 -84.40 gain 28 53 -83.44 gain 53 28 -86.36 gain 28 54 -81.95 gain 54 28 -84.28 gain 28 55 -79.75 gain 55 28 -79.00 gain 28 56 -80.11 gain 56 28 -84.41 gain 28 57 -71.05 gain 57 28 -74.42 gain 28 58 -69.62 gain 58 28 -69.69 gain 28 59 -72.35 gain 59 28 -71.67 gain 28 60 -88.26 gain 60 28 -96.86 gain 28 61 -94.71 gain 61 28 -95.22 gain 28 62 -89.87 gain 62 28 -87.89 gain 28 63 -92.66 gain 63 28 -94.65 gain 28 64 -93.12 gain 64 28 -99.33 gain 28 65 -85.81 gain 65 28 -87.57 gain 28 66 -90.86 gain 66 28 -91.60 gain 28 67 -85.08 gain 67 28 -87.05 gain 28 68 -88.41 gain 68 28 -92.96 gain 28 69 -82.86 gain 69 28 -84.63 gain 28 70 -79.85 gain 70 28 -80.09 gain 28 71 -80.70 gain 71 28 -84.51 gain 28 72 -79.05 gain 72 28 -80.42 gain 28 73 -72.07 gain 73 28 -74.81 gain 28 74 -81.87 gain 74 28 -80.72 gain 28 75 -88.43 gain 75 28 -93.17 gain 28 76 -96.44 gain 76 28 -101.30 gain 28 77 -95.07 gain 77 28 -95.92 gain 28 78 -94.54 gain 78 28 -99.90 gain 28 79 -92.64 gain 79 28 -97.62 gain 28 80 -87.38 gain 80 28 -90.15 gain 28 81 -84.97 gain 81 28 -88.65 gain 28 82 -84.02 gain 82 28 -88.68 gain 28 83 -91.18 gain 83 28 -93.11 gain 28 84 -81.09 gain 84 28 -80.21 gain 28 85 -74.95 gain 85 28 -79.50 gain 28 86 -82.46 gain 86 28 -88.64 gain 28 87 -74.52 gain 87 28 -77.99 gain 28 88 -70.38 gain 88 28 -73.50 gain 28 89 -81.21 gain 89 28 -86.47 gain 28 90 -100.66 gain 90 28 -105.25 gain 28 91 -97.61 gain 91 28 -103.28 gain 28 92 -90.19 gain 92 28 -96.77 gain 28 93 -96.30 gain 93 28 -100.25 gain 28 94 -90.71 gain 94 28 -93.22 gain 28 95 -91.87 gain 95 28 -93.62 gain 28 96 -91.99 gain 96 28 -100.71 gain 28 97 -85.99 gain 97 28 -87.54 gain 28 98 -87.65 gain 98 28 -89.67 gain 28 99 -89.74 gain 99 28 -90.89 gain 28 100 -82.57 gain 100 28 -83.64 gain 28 101 -83.62 gain 101 28 -88.32 gain 28 102 -86.15 gain 102 28 -90.81 gain 28 103 -78.51 gain 103 28 -84.34 gain 28 104 -86.40 gain 104 28 -94.72 gain 28 105 -97.46 gain 105 28 -100.30 gain 28 106 -96.97 gain 106 28 -97.14 gain 28 107 -88.09 gain 107 28 -88.16 gain 28 108 -92.93 gain 108 28 -92.62 gain 28 109 -92.47 gain 109 28 -95.61 gain 28 110 -88.71 gain 110 28 -98.21 gain 28 111 -84.71 gain 111 28 -84.18 gain 28 112 -91.02 gain 112 28 -93.96 gain 28 113 -89.10 gain 113 28 -91.17 gain 28 114 -89.12 gain 114 28 -88.35 gain 28 115 -86.66 gain 115 28 -86.54 gain 28 116 -87.77 gain 116 28 -90.08 gain 28 117 -89.06 gain 117 28 -88.52 gain 28 118 -78.37 gain 118 28 -79.45 gain 28 119 -76.79 gain 119 28 -82.93 gain 28 120 -94.70 gain 120 28 -98.23 gain 28 121 -92.42 gain 121 28 -96.96 gain 28 122 -92.62 gain 122 28 -96.92 gain 28 123 -94.73 gain 123 28 -99.37 gain 28 124 -93.96 gain 124 28 -96.58 gain 28 125 -91.34 gain 125 28 -97.31 gain 28 126 -89.19 gain 126 28 -91.80 gain 28 127 -94.60 gain 127 28 -96.84 gain 28 128 -88.16 gain 128 28 -93.00 gain 28 129 -90.73 gain 129 28 -92.78 gain 28 130 -89.11 gain 130 28 -92.44 gain 28 131 -85.92 gain 131 28 -89.03 gain 28 132 -88.65 gain 132 28 -87.77 gain 28 133 -84.85 gain 133 28 -89.14 gain 28 134 -89.58 gain 134 28 -90.74 gain 28 135 -97.36 gain 135 28 -100.82 gain 28 136 -90.88 gain 136 28 -94.78 gain 28 137 -100.14 gain 137 28 -106.96 gain 28 138 -99.09 gain 138 28 -99.44 gain 28 139 -95.48 gain 139 28 -99.09 gain 28 140 -92.90 gain 140 28 -97.34 gain 28 141 -91.84 gain 141 28 -88.25 gain 28 142 -93.78 gain 142 28 -96.93 gain 28 143 -94.24 gain 143 28 -100.13 gain 28 144 -88.38 gain 144 28 -92.64 gain 28 145 -96.14 gain 145 28 -103.78 gain 28 146 -84.97 gain 146 28 -88.60 gain 28 147 -81.60 gain 147 28 -82.34 gain 28 148 -92.37 gain 148 28 -91.44 gain 28 149 -89.43 gain 149 28 -92.16 gain 28 150 -93.62 gain 150 28 -97.18 gain 28 151 -97.12 gain 151 28 -99.62 gain 28 152 -97.01 gain 152 28 -99.33 gain 28 153 -97.74 gain 153 28 -99.27 gain 28 154 -93.95 gain 154 28 -97.38 gain 28 155 -91.19 gain 155 28 -93.19 gain 28 156 -91.02 gain 156 28 -92.26 gain 28 157 -91.19 gain 157 28 -94.91 gain 28 158 -88.32 gain 158 28 -91.54 gain 28 159 -85.78 gain 159 28 -91.38 gain 28 160 -97.16 gain 160 28 -99.91 gain 28 161 -92.81 gain 161 28 -98.01 gain 28 162 -97.10 gain 162 28 -102.01 gain 28 163 -91.23 gain 163 28 -98.05 gain 28 164 -90.28 gain 164 28 -96.47 gain 28 165 -95.16 gain 165 28 -98.41 gain 28 166 -90.26 gain 166 28 -93.26 gain 28 167 -96.95 gain 167 28 -100.68 gain 28 168 -103.13 gain 168 28 -105.75 gain 28 169 -95.63 gain 169 28 -99.37 gain 28 170 -100.82 gain 170 28 -103.78 gain 28 171 -92.45 gain 171 28 -96.50 gain 28 172 -95.66 gain 172 28 -97.89 gain 28 173 -96.08 gain 173 28 -102.97 gain 28 174 -88.21 gain 174 28 -91.15 gain 28 175 -93.86 gain 175 28 -97.93 gain 28 176 -93.65 gain 176 28 -96.68 gain 28 177 -89.24 gain 177 28 -95.27 gain 28 178 -94.31 gain 178 28 -93.78 gain 28 179 -92.37 gain 179 28 -91.27 gain 28 180 -101.93 gain 180 28 -110.28 gain 28 181 -99.35 gain 181 28 -101.73 gain 28 182 -104.75 gain 182 28 -108.20 gain 28 183 -94.19 gain 183 28 -97.92 gain 28 184 -94.60 gain 184 28 -101.08 gain 28 185 -94.87 gain 185 28 -105.22 gain 28 186 -91.24 gain 186 28 -97.17 gain 28 187 -92.94 gain 187 28 -96.59 gain 28 188 -92.93 gain 188 28 -99.00 gain 28 189 -99.03 gain 189 28 -99.82 gain 28 190 -94.35 gain 190 28 -99.05 gain 28 191 -100.04 gain 191 28 -103.45 gain 28 192 -91.40 gain 192 28 -93.51 gain 28 193 -97.31 gain 193 28 -98.41 gain 28 194 -91.68 gain 194 28 -93.55 gain 28 195 -104.63 gain 195 28 -105.06 gain 28 196 -103.40 gain 196 28 -108.14 gain 28 197 -99.57 gain 197 28 -99.44 gain 28 198 -93.82 gain 198 28 -98.21 gain 28 199 -87.93 gain 199 28 -92.42 gain 28 200 -94.12 gain 200 28 -99.95 gain 28 201 -91.74 gain 201 28 -97.47 gain 28 202 -101.55 gain 202 28 -106.42 gain 28 203 -100.77 gain 203 28 -104.75 gain 28 204 -96.04 gain 204 28 -96.67 gain 28 205 -91.42 gain 205 28 -95.79 gain 28 206 -94.43 gain 206 28 -99.91 gain 28 207 -97.78 gain 207 28 -102.67 gain 28 208 -99.56 gain 208 28 -107.06 gain 28 209 -94.66 gain 209 28 -101.72 gain 28 210 -103.39 gain 210 28 -110.63 gain 28 211 -99.36 gain 211 28 -101.84 gain 28 212 -97.50 gain 212 28 -102.99 gain 28 213 -97.27 gain 213 28 -102.09 gain 28 214 -97.50 gain 214 28 -107.70 gain 28 215 -95.11 gain 215 28 -100.71 gain 28 216 -102.56 gain 216 28 -112.07 gain 28 217 -100.13 gain 217 28 -109.90 gain 28 218 -95.82 gain 218 28 -98.40 gain 28 219 -94.06 gain 219 28 -97.12 gain 28 220 -95.19 gain 220 28 -94.34 gain 28 221 -99.00 gain 221 28 -103.83 gain 28 222 -96.68 gain 222 28 -97.32 gain 28 223 -93.13 gain 223 28 -97.01 gain 28 224 -92.08 gain 224 28 -96.42 gain 29 30 -92.91 gain 30 29 -97.92 gain 29 31 -90.78 gain 31 29 -92.35 gain 29 32 -92.63 gain 32 29 -91.55 gain 29 33 -90.85 gain 33 29 -91.21 gain 29 34 -94.91 gain 34 29 -95.91 gain 29 35 -95.52 gain 35 29 -97.47 gain 29 36 -90.30 gain 36 29 -92.39 gain 29 37 -85.08 gain 37 29 -89.71 gain 29 38 -81.14 gain 38 29 -83.30 gain 29 39 -86.26 gain 39 29 -92.75 gain 29 40 -82.23 gain 40 29 -83.70 gain 29 41 -76.18 gain 41 29 -72.99 gain 29 42 -77.36 gain 42 29 -81.42 gain 29 43 -64.72 gain 43 29 -66.37 gain 29 44 -59.36 gain 44 29 -64.60 gain 29 45 -97.62 gain 45 29 -102.84 gain 29 46 -93.09 gain 46 29 -94.78 gain 29 47 -103.68 gain 47 29 -103.07 gain 29 48 -97.03 gain 48 29 -96.00 gain 29 49 -88.19 gain 49 29 -91.22 gain 29 50 -87.94 gain 50 29 -87.83 gain 29 51 -91.35 gain 51 29 -94.93 gain 29 52 -85.87 gain 52 29 -86.69 gain 29 53 -85.30 gain 53 29 -86.68 gain 29 54 -84.03 gain 54 29 -84.81 gain 29 55 -96.39 gain 55 29 -94.09 gain 29 56 -82.28 gain 56 29 -85.03 gain 29 57 -73.82 gain 57 29 -75.65 gain 29 58 -70.75 gain 58 29 -69.27 gain 29 59 -79.56 gain 59 29 -77.34 gain 29 60 -97.41 gain 60 29 -104.47 gain 29 61 -94.95 gain 61 29 -93.91 gain 29 62 -95.09 gain 62 29 -91.56 gain 29 63 -98.55 gain 63 29 -98.99 gain 29 64 -89.46 gain 64 29 -94.12 gain 29 65 -94.60 gain 65 29 -94.81 gain 29 66 -90.11 gain 66 29 -89.30 gain 29 67 -86.11 gain 67 29 -86.53 gain 29 68 -89.64 gain 68 29 -92.65 gain 29 69 -92.89 gain 69 29 -93.11 gain 29 70 -79.72 gain 70 29 -78.41 gain 29 71 -73.11 gain 71 29 -75.37 gain 29 72 -80.58 gain 72 29 -80.40 gain 29 73 -81.23 gain 73 29 -82.42 gain 29 74 -74.82 gain 74 29 -72.12 gain 29 75 -101.68 gain 75 29 -104.87 gain 29 76 -96.62 gain 76 29 -99.94 gain 29 77 -99.64 gain 77 29 -98.95 gain 29 78 -98.75 gain 78 29 -102.57 gain 29 79 -91.16 gain 79 29 -94.59 gain 29 80 -90.84 gain 80 29 -92.07 gain 29 81 -89.57 gain 81 29 -91.71 gain 29 82 -88.82 gain 82 29 -91.93 gain 29 83 -90.56 gain 83 29 -90.94 gain 29 84 -95.37 gain 84 29 -92.94 gain 29 85 -84.51 gain 85 29 -87.51 gain 29 86 -82.65 gain 86 29 -87.28 gain 29 87 -83.48 gain 87 29 -85.40 gain 29 88 -78.78 gain 88 29 -80.35 gain 29 89 -86.35 gain 89 29 -90.06 gain 29 90 -97.98 gain 90 29 -101.03 gain 29 91 -97.16 gain 91 29 -101.28 gain 29 92 -96.80 gain 92 29 -101.84 gain 29 93 -98.28 gain 93 29 -100.68 gain 29 94 -97.76 gain 94 29 -98.72 gain 29 95 -85.75 gain 95 29 -85.96 gain 29 96 -95.12 gain 96 29 -102.29 gain 29 97 -92.94 gain 97 29 -92.94 gain 29 98 -93.15 gain 98 29 -93.62 gain 29 99 -93.99 gain 99 29 -93.59 gain 29 100 -88.05 gain 100 29 -87.57 gain 29 101 -77.69 gain 101 29 -80.84 gain 29 102 -85.27 gain 102 29 -88.39 gain 29 103 -90.24 gain 103 29 -94.53 gain 29 104 -76.37 gain 104 29 -83.14 gain 29 105 -98.71 gain 105 29 -100.00 gain 29 106 -93.78 gain 106 29 -92.40 gain 29 107 -90.81 gain 107 29 -89.33 gain 29 108 -92.89 gain 108 29 -91.03 gain 29 109 -97.09 gain 109 29 -98.69 gain 29 110 -92.39 gain 110 29 -100.35 gain 29 111 -89.28 gain 111 29 -87.21 gain 29 112 -98.55 gain 112 29 -99.94 gain 29 113 -86.55 gain 113 29 -87.06 gain 29 114 -83.14 gain 114 29 -80.82 gain 29 115 -85.12 gain 115 29 -83.46 gain 29 116 -89.20 gain 116 29 -89.97 gain 29 117 -86.06 gain 117 29 -83.97 gain 29 118 -90.06 gain 118 29 -89.59 gain 29 119 -84.03 gain 119 29 -88.63 gain 29 120 -100.43 gain 120 29 -102.40 gain 29 121 -96.47 gain 121 29 -99.47 gain 29 122 -97.30 gain 122 29 -100.05 gain 29 123 -91.17 gain 123 29 -94.26 gain 29 124 -97.98 gain 124 29 -99.06 gain 29 125 -100.45 gain 125 29 -104.86 gain 29 126 -92.26 gain 126 29 -93.33 gain 29 127 -92.60 gain 127 29 -93.29 gain 29 128 -88.03 gain 128 29 -91.32 gain 29 129 -93.02 gain 129 29 -93.51 gain 29 130 -91.47 gain 130 29 -93.26 gain 29 131 -92.33 gain 131 29 -93.89 gain 29 132 -88.10 gain 132 29 -85.67 gain 29 133 -92.49 gain 133 29 -95.24 gain 29 134 -90.63 gain 134 29 -90.24 gain 29 135 -99.48 gain 135 29 -101.40 gain 29 136 -95.15 gain 136 29 -97.50 gain 29 137 -91.92 gain 137 29 -97.18 gain 29 138 -95.96 gain 138 29 -94.75 gain 29 139 -95.28 gain 139 29 -97.35 gain 29 140 -99.68 gain 140 29 -102.56 gain 29 141 -96.06 gain 141 29 -90.92 gain 29 142 -92.51 gain 142 29 -94.12 gain 29 143 -87.16 gain 143 29 -91.50 gain 29 144 -92.14 gain 144 29 -94.85 gain 29 145 -92.89 gain 145 29 -98.98 gain 29 146 -91.52 gain 146 29 -93.60 gain 29 147 -95.66 gain 147 29 -94.86 gain 29 148 -91.79 gain 148 29 -89.31 gain 29 149 -92.61 gain 149 29 -93.79 gain 29 150 -103.26 gain 150 29 -105.27 gain 29 151 -98.12 gain 151 29 -99.07 gain 29 152 -97.61 gain 152 29 -98.38 gain 29 153 -97.49 gain 153 29 -97.48 gain 29 154 -97.85 gain 154 29 -99.73 gain 29 155 -100.15 gain 155 29 -100.61 gain 29 156 -94.01 gain 156 29 -93.70 gain 29 157 -99.16 gain 157 29 -101.33 gain 29 158 -96.15 gain 158 29 -97.82 gain 29 159 -88.60 gain 159 29 -92.66 gain 29 160 -92.39 gain 160 29 -93.60 gain 29 161 -104.93 gain 161 29 -108.58 gain 29 162 -93.07 gain 162 29 -96.43 gain 29 163 -88.37 gain 163 29 -93.64 gain 29 164 -93.96 gain 164 29 -98.61 gain 29 165 -106.95 gain 165 29 -108.66 gain 29 166 -100.18 gain 166 29 -101.64 gain 29 167 -97.44 gain 167 29 -99.62 gain 29 168 -101.82 gain 168 29 -102.89 gain 29 169 -100.30 gain 169 29 -102.48 gain 29 170 -98.34 gain 170 29 -99.76 gain 29 171 -93.22 gain 171 29 -95.72 gain 29 172 -99.07 gain 172 29 -99.76 gain 29 173 -94.94 gain 173 29 -100.27 gain 29 174 -101.93 gain 174 29 -103.31 gain 29 175 -97.63 gain 175 29 -100.15 gain 29 176 -97.80 gain 176 29 -99.28 gain 29 177 -93.79 gain 177 29 -98.28 gain 29 178 -94.98 gain 178 29 -92.91 gain 29 179 -91.47 gain 179 29 -88.82 gain 29 180 -98.76 gain 180 29 -105.56 gain 29 181 -99.06 gain 181 29 -99.89 gain 29 182 -98.19 gain 182 29 -100.10 gain 29 183 -93.29 gain 183 29 -95.47 gain 29 184 -96.99 gain 184 29 -101.92 gain 29 185 -97.94 gain 185 29 -106.74 gain 29 186 -97.29 gain 186 29 -101.67 gain 29 187 -101.95 gain 187 29 -104.06 gain 29 188 -89.10 gain 188 29 -93.62 gain 29 189 -93.81 gain 189 29 -93.05 gain 29 190 -99.34 gain 190 29 -102.50 gain 29 191 -86.02 gain 191 29 -87.88 gain 29 192 -98.25 gain 192 29 -98.81 gain 29 193 -93.92 gain 193 29 -93.47 gain 29 194 -97.10 gain 194 29 -97.43 gain 29 195 -95.31 gain 195 29 -94.18 gain 29 196 -97.88 gain 196 29 -101.07 gain 29 197 -96.53 gain 197 29 -94.85 gain 29 198 -101.29 gain 198 29 -104.13 gain 29 199 -95.73 gain 199 29 -98.68 gain 29 200 -105.98 gain 200 29 -110.25 gain 29 201 -92.02 gain 201 29 -96.21 gain 29 202 -93.33 gain 202 29 -96.65 gain 29 203 -97.48 gain 203 29 -99.92 gain 29 204 -99.70 gain 204 29 -98.78 gain 29 205 -88.67 gain 205 29 -91.49 gain 29 206 -98.88 gain 206 29 -102.81 gain 29 207 -100.92 gain 207 29 -104.26 gain 29 208 -96.11 gain 208 29 -102.06 gain 29 209 -95.04 gain 209 29 -100.56 gain 29 210 -107.23 gain 210 29 -112.93 gain 29 211 -109.16 gain 211 29 -110.08 gain 29 212 -98.62 gain 212 29 -102.55 gain 29 213 -96.55 gain 213 29 -99.81 gain 29 214 -101.96 gain 214 29 -110.62 gain 29 215 -97.60 gain 215 29 -101.65 gain 29 216 -100.96 gain 216 29 -108.92 gain 29 217 -99.29 gain 217 29 -107.52 gain 29 218 -101.00 gain 218 29 -102.03 gain 29 219 -95.80 gain 219 29 -97.31 gain 29 220 -92.15 gain 220 29 -89.75 gain 29 221 -99.26 gain 221 29 -102.54 gain 29 222 -98.45 gain 222 29 -97.54 gain 29 223 -92.30 gain 223 29 -94.63 gain 29 224 -101.81 gain 224 29 -104.61 gain 30 31 -64.42 gain 31 30 -60.98 gain 30 32 -76.02 gain 32 30 -69.93 gain 30 33 -81.57 gain 33 30 -76.93 gain 30 34 -82.66 gain 34 30 -78.65 gain 30 35 -94.55 gain 35 30 -91.49 gain 30 36 -99.14 gain 36 30 -96.23 gain 30 37 -95.23 gain 37 30 -94.86 gain 30 38 -93.81 gain 38 30 -90.97 gain 30 39 -95.77 gain 39 30 -97.25 gain 30 40 -105.25 gain 40 30 -101.71 gain 30 41 -100.05 gain 41 30 -91.85 gain 30 42 -101.67 gain 42 30 -100.72 gain 30 43 -110.49 gain 43 30 -107.13 gain 30 44 -103.85 gain 44 30 -104.09 gain 30 45 -63.98 gain 45 30 -64.20 gain 30 46 -77.89 gain 46 30 -74.57 gain 30 47 -77.81 gain 47 30 -72.20 gain 30 48 -86.08 gain 48 30 -80.05 gain 30 49 -95.09 gain 49 30 -93.11 gain 30 50 -85.13 gain 50 30 -80.01 gain 30 51 -93.06 gain 51 30 -91.64 gain 30 52 -95.99 gain 52 30 -91.81 gain 30 53 -95.73 gain 53 30 -92.10 gain 30 54 -96.38 gain 54 30 -92.16 gain 30 55 -92.27 gain 55 30 -84.96 gain 30 56 -97.61 gain 56 30 -95.35 gain 30 57 -97.15 gain 57 30 -93.97 gain 30 58 -97.61 gain 58 30 -91.13 gain 30 59 -99.59 gain 59 30 -92.36 gain 30 60 -79.22 gain 60 30 -81.27 gain 30 61 -78.68 gain 61 30 -72.64 gain 30 62 -82.01 gain 62 30 -73.47 gain 30 63 -78.58 gain 63 30 -74.01 gain 30 64 -90.88 gain 64 30 -90.53 gain 30 65 -90.10 gain 65 30 -85.30 gain 30 66 -88.16 gain 66 30 -82.35 gain 30 67 -94.86 gain 67 30 -90.28 gain 30 68 -91.56 gain 68 30 -89.56 gain 30 69 -103.52 gain 69 30 -98.74 gain 30 70 -93.32 gain 70 30 -87.00 gain 30 71 -96.75 gain 71 30 -94.00 gain 30 72 -105.93 gain 72 30 -100.73 gain 30 73 -103.47 gain 73 30 -99.65 gain 30 74 -101.12 gain 74 30 -93.42 gain 30 75 -82.69 gain 75 30 -80.88 gain 30 76 -82.96 gain 76 30 -81.27 gain 30 77 -88.84 gain 77 30 -83.15 gain 30 78 -87.23 gain 78 30 -86.03 gain 30 79 -87.23 gain 79 30 -85.66 gain 30 80 -87.20 gain 80 30 -83.42 gain 30 81 -93.41 gain 81 30 -90.54 gain 30 82 -86.92 gain 82 30 -85.03 gain 30 83 -92.11 gain 83 30 -87.49 gain 30 84 -95.34 gain 84 30 -87.90 gain 30 85 -94.10 gain 85 30 -92.10 gain 30 86 -99.70 gain 86 30 -99.33 gain 30 87 -102.47 gain 87 30 -99.39 gain 30 88 -97.15 gain 88 30 -93.71 gain 30 89 -100.46 gain 89 30 -99.17 gain 30 90 -84.95 gain 90 30 -82.99 gain 30 91 -79.82 gain 91 30 -78.94 gain 30 92 -87.53 gain 92 30 -87.57 gain 30 93 -87.00 gain 93 30 -84.39 gain 30 94 -87.48 gain 94 30 -83.44 gain 30 95 -95.62 gain 95 30 -90.82 gain 30 96 -91.53 gain 96 30 -93.70 gain 30 97 -93.13 gain 97 30 -88.13 gain 30 98 -97.93 gain 98 30 -93.39 gain 30 99 -96.40 gain 99 30 -91.00 gain 30 100 -99.17 gain 100 30 -93.69 gain 30 101 -99.89 gain 101 30 -98.04 gain 30 102 -106.82 gain 102 30 -104.92 gain 30 103 -97.42 gain 103 30 -96.69 gain 30 104 -104.51 gain 104 30 -106.27 gain 30 105 -86.55 gain 105 30 -82.83 gain 30 106 -86.47 gain 106 30 -80.08 gain 30 107 -90.19 gain 107 30 -83.71 gain 30 108 -86.17 gain 108 30 -79.31 gain 30 109 -91.64 gain 109 30 -88.23 gain 30 110 -87.37 gain 110 30 -90.32 gain 30 111 -96.00 gain 111 30 -88.92 gain 30 112 -96.93 gain 112 30 -93.31 gain 30 113 -96.69 gain 113 30 -92.20 gain 30 114 -96.68 gain 114 30 -89.35 gain 30 115 -97.89 gain 115 30 -91.22 gain 30 116 -106.88 gain 116 30 -102.65 gain 30 117 -98.80 gain 117 30 -91.70 gain 30 118 -101.07 gain 118 30 -95.60 gain 30 119 -101.07 gain 119 30 -100.66 gain 30 120 -88.82 gain 120 30 -85.79 gain 30 121 -86.45 gain 121 30 -84.45 gain 30 122 -93.01 gain 122 30 -90.75 gain 30 123 -92.65 gain 123 30 -90.74 gain 30 124 -93.96 gain 124 30 -90.03 gain 30 125 -91.54 gain 125 30 -90.95 gain 30 126 -94.14 gain 126 30 -90.20 gain 30 127 -91.14 gain 127 30 -86.83 gain 30 128 -92.87 gain 128 30 -91.15 gain 30 129 -99.13 gain 129 30 -94.62 gain 30 130 -95.74 gain 130 30 -92.52 gain 30 131 -101.19 gain 131 30 -97.74 gain 30 132 -105.97 gain 132 30 -98.53 gain 30 133 -106.06 gain 133 30 -103.80 gain 30 134 -104.56 gain 134 30 -99.16 gain 30 135 -85.71 gain 135 30 -82.62 gain 30 136 -89.42 gain 136 30 -86.77 gain 30 137 -93.91 gain 137 30 -94.17 gain 30 138 -97.24 gain 138 30 -91.03 gain 30 139 -97.44 gain 139 30 -94.49 gain 30 140 -99.25 gain 140 30 -97.13 gain 30 141 -96.87 gain 141 30 -86.72 gain 30 142 -104.93 gain 142 30 -101.53 gain 30 143 -104.53 gain 143 30 -103.87 gain 30 144 -101.57 gain 144 30 -99.27 gain 30 145 -100.88 gain 145 30 -101.96 gain 30 146 -96.97 gain 146 30 -94.05 gain 30 147 -99.95 gain 147 30 -94.14 gain 30 148 -109.82 gain 148 30 -102.34 gain 30 149 -104.59 gain 149 30 -100.76 gain 30 150 -91.90 gain 150 30 -88.91 gain 30 151 -101.17 gain 151 30 -97.12 gain 30 152 -95.86 gain 152 30 -91.62 gain 30 153 -91.71 gain 153 30 -86.69 gain 30 154 -96.00 gain 154 30 -92.88 gain 30 155 -92.87 gain 155 30 -88.32 gain 30 156 -103.77 gain 156 30 -98.45 gain 30 157 -93.52 gain 157 30 -90.69 gain 30 158 -107.71 gain 158 30 -104.37 gain 30 159 -98.78 gain 159 30 -97.83 gain 30 160 -102.86 gain 160 30 -99.07 gain 30 161 -97.57 gain 161 30 -96.22 gain 30 162 -104.20 gain 162 30 -102.56 gain 30 163 -101.52 gain 163 30 -101.78 gain 30 164 -109.96 gain 164 30 -109.60 gain 30 165 -104.88 gain 165 30 -101.57 gain 30 166 -96.82 gain 166 30 -93.27 gain 30 167 -95.01 gain 167 30 -92.18 gain 30 168 -98.85 gain 168 30 -94.92 gain 30 169 -106.53 gain 169 30 -103.71 gain 30 170 -95.31 gain 170 30 -91.72 gain 30 171 -98.27 gain 171 30 -95.76 gain 30 172 -100.04 gain 172 30 -95.72 gain 30 173 -99.80 gain 173 30 -100.13 gain 30 174 -105.05 gain 174 30 -101.43 gain 30 175 -101.44 gain 175 30 -98.95 gain 30 176 -107.68 gain 176 30 -104.16 gain 30 177 -101.62 gain 177 30 -101.11 gain 30 178 -100.98 gain 178 30 -93.90 gain 30 179 -98.92 gain 179 30 -91.27 gain 30 180 -105.00 gain 180 30 -106.80 gain 30 181 -98.15 gain 181 30 -93.97 gain 30 182 -100.92 gain 182 30 -97.83 gain 30 183 -94.89 gain 183 30 -92.06 gain 30 184 -97.46 gain 184 30 -97.39 gain 30 185 -100.72 gain 185 30 -104.51 gain 30 186 -94.04 gain 186 30 -93.41 gain 30 187 -97.66 gain 187 30 -94.76 gain 30 188 -106.55 gain 188 30 -106.06 gain 30 189 -99.51 gain 189 30 -93.75 gain 30 190 -95.84 gain 190 30 -94.00 gain 30 191 -101.69 gain 191 30 -98.55 gain 30 192 -101.20 gain 192 30 -96.75 gain 30 193 -107.72 gain 193 30 -102.26 gain 30 194 -110.12 gain 194 30 -105.44 gain 30 195 -96.66 gain 195 30 -90.53 gain 30 196 -94.46 gain 196 30 -92.64 gain 30 197 -98.66 gain 197 30 -91.98 gain 30 198 -98.66 gain 198 30 -96.48 gain 30 199 -100.68 gain 199 30 -98.62 gain 30 200 -105.42 gain 200 30 -104.69 gain 30 201 -102.99 gain 201 30 -102.17 gain 30 202 -101.85 gain 202 30 -100.16 gain 30 203 -103.27 gain 203 30 -100.70 gain 30 204 -104.47 gain 204 30 -98.54 gain 30 205 -106.29 gain 205 30 -104.10 gain 30 206 -103.15 gain 206 30 -102.07 gain 30 207 -109.31 gain 207 30 -107.65 gain 30 208 -111.83 gain 208 30 -112.77 gain 30 209 -110.25 gain 209 30 -110.77 gain 30 210 -102.09 gain 210 30 -102.78 gain 30 211 -98.73 gain 211 30 -94.65 gain 30 212 -97.01 gain 212 30 -95.94 gain 30 213 -89.86 gain 213 30 -88.12 gain 30 214 -98.32 gain 214 30 -101.96 gain 30 215 -107.38 gain 215 30 -106.43 gain 30 216 -92.92 gain 216 30 -95.87 gain 30 217 -99.33 gain 217 30 -102.55 gain 30 218 -108.88 gain 218 30 -104.91 gain 30 219 -101.85 gain 219 30 -98.35 gain 30 220 -105.44 gain 220 30 -98.03 gain 30 221 -101.81 gain 221 30 -100.08 gain 30 222 -103.17 gain 222 30 -97.25 gain 30 223 -100.60 gain 223 30 -97.92 gain 30 224 -107.10 gain 224 30 -104.89 gain 31 32 -67.64 gain 32 31 -65.00 gain 31 33 -73.14 gain 33 31 -71.94 gain 31 34 -73.79 gain 34 31 -73.23 gain 31 35 -78.91 gain 35 31 -79.29 gain 31 36 -83.83 gain 36 31 -84.36 gain 31 37 -86.79 gain 37 31 -89.86 gain 31 38 -87.80 gain 38 31 -88.40 gain 31 39 -96.40 gain 39 31 -101.33 gain 31 40 -94.03 gain 40 31 -93.93 gain 31 41 -96.50 gain 41 31 -91.75 gain 31 42 -104.91 gain 42 31 -107.41 gain 31 43 -98.42 gain 43 31 -98.50 gain 31 44 -99.76 gain 44 31 -103.44 gain 31 45 -72.21 gain 45 31 -75.87 gain 31 46 -61.04 gain 46 31 -61.17 gain 31 47 -71.32 gain 47 31 -69.14 gain 31 48 -77.36 gain 48 31 -74.76 gain 31 49 -79.83 gain 49 31 -81.30 gain 31 50 -81.24 gain 50 31 -79.57 gain 31 51 -89.19 gain 51 31 -91.20 gain 31 52 -88.79 gain 52 31 -88.04 gain 31 53 -89.82 gain 53 31 -89.63 gain 31 54 -89.10 gain 54 31 -88.32 gain 31 55 -93.83 gain 55 31 -89.96 gain 31 56 -89.98 gain 56 31 -91.16 gain 31 57 -94.41 gain 57 31 -94.67 gain 31 58 -97.97 gain 58 31 -94.93 gain 31 59 -103.57 gain 59 31 -99.78 gain 31 60 -75.00 gain 60 31 -80.49 gain 31 61 -71.69 gain 61 31 -69.09 gain 31 62 -76.71 gain 62 31 -71.62 gain 31 63 -82.03 gain 63 31 -80.90 gain 31 64 -79.51 gain 64 31 -82.61 gain 31 65 -80.96 gain 65 31 -79.61 gain 31 66 -80.19 gain 66 31 -77.82 gain 31 67 -84.87 gain 67 31 -83.73 gain 31 68 -86.86 gain 68 31 -88.31 gain 31 69 -92.37 gain 69 31 -91.03 gain 31 70 -99.09 gain 70 31 -96.22 gain 31 71 -89.66 gain 71 31 -90.36 gain 31 72 -100.52 gain 72 31 -98.77 gain 31 73 -98.68 gain 73 31 -98.30 gain 31 74 -86.03 gain 74 31 -81.76 gain 31 75 -78.91 gain 75 31 -80.53 gain 31 76 -77.94 gain 76 31 -79.69 gain 31 77 -84.00 gain 77 31 -81.74 gain 31 78 -88.42 gain 78 31 -90.66 gain 31 79 -78.50 gain 79 31 -80.37 gain 31 80 -84.19 gain 80 31 -83.85 gain 31 81 -88.77 gain 81 31 -89.34 gain 31 82 -91.24 gain 82 31 -92.79 gain 31 83 -90.22 gain 83 31 -89.04 gain 31 84 -100.92 gain 84 31 -96.92 gain 31 85 -96.93 gain 85 31 -98.36 gain 31 86 -105.16 gain 86 31 -108.23 gain 31 87 -91.65 gain 87 31 -92.01 gain 31 88 -97.89 gain 88 31 -97.90 gain 31 89 -91.08 gain 89 31 -93.22 gain 31 90 -92.56 gain 90 31 -94.05 gain 31 91 -86.34 gain 91 31 -88.89 gain 31 92 -82.40 gain 92 31 -85.88 gain 31 93 -92.89 gain 93 31 -93.72 gain 31 94 -84.37 gain 94 31 -83.77 gain 31 95 -86.20 gain 95 31 -84.84 gain 31 96 -84.27 gain 96 31 -89.88 gain 31 97 -88.13 gain 97 31 -86.56 gain 31 98 -86.76 gain 98 31 -85.66 gain 31 99 -82.52 gain 99 31 -80.56 gain 31 100 -93.20 gain 100 31 -91.16 gain 31 101 -99.93 gain 101 31 -101.51 gain 31 102 -97.01 gain 102 31 -98.57 gain 31 103 -95.11 gain 103 31 -97.83 gain 31 104 -93.21 gain 104 31 -98.42 gain 31 105 -72.90 gain 105 31 -72.62 gain 31 106 -85.23 gain 106 31 -82.29 gain 31 107 -91.06 gain 107 31 -88.02 gain 31 108 -81.82 gain 108 31 -78.40 gain 31 109 -85.15 gain 109 31 -85.18 gain 31 110 -82.34 gain 110 31 -88.73 gain 31 111 -88.27 gain 111 31 -84.63 gain 31 112 -86.85 gain 112 31 -86.67 gain 31 113 -93.81 gain 113 31 -92.76 gain 31 114 -95.19 gain 114 31 -91.31 gain 31 115 -94.45 gain 115 31 -91.23 gain 31 116 -93.05 gain 116 31 -92.25 gain 31 117 -98.78 gain 117 31 -95.13 gain 31 118 -102.87 gain 118 31 -100.84 gain 31 119 -96.02 gain 119 31 -99.05 gain 31 120 -95.21 gain 120 31 -95.62 gain 31 121 -88.07 gain 121 31 -89.51 gain 31 122 -82.46 gain 122 31 -83.64 gain 31 123 -99.05 gain 123 31 -100.58 gain 31 124 -85.41 gain 124 31 -84.93 gain 31 125 -80.85 gain 125 31 -83.71 gain 31 126 -94.57 gain 126 31 -94.07 gain 31 127 -87.24 gain 127 31 -86.37 gain 31 128 -102.78 gain 128 31 -104.51 gain 31 129 -92.19 gain 129 31 -91.12 gain 31 130 -94.43 gain 130 31 -94.65 gain 31 131 -97.62 gain 131 31 -97.62 gain 31 132 -92.68 gain 132 31 -88.68 gain 31 133 -105.48 gain 133 31 -106.66 gain 31 134 -96.28 gain 134 31 -94.33 gain 31 135 -91.82 gain 135 31 -92.17 gain 31 136 -84.73 gain 136 31 -85.52 gain 31 137 -88.24 gain 137 31 -91.94 gain 31 138 -91.12 gain 138 31 -88.35 gain 31 139 -93.71 gain 139 31 -94.21 gain 31 140 -97.30 gain 140 31 -98.63 gain 31 141 -89.78 gain 141 31 -83.08 gain 31 142 -90.94 gain 142 31 -90.98 gain 31 143 -87.54 gain 143 31 -90.32 gain 31 144 -89.31 gain 144 31 -90.46 gain 31 145 -96.55 gain 145 31 -101.08 gain 31 146 -105.82 gain 146 31 -106.34 gain 31 147 -92.78 gain 147 31 -90.40 gain 31 148 -100.73 gain 148 31 -96.68 gain 31 149 -97.60 gain 149 31 -97.21 gain 31 150 -91.40 gain 150 31 -91.85 gain 31 151 -91.23 gain 151 31 -90.62 gain 31 152 -97.09 gain 152 31 -96.29 gain 31 153 -91.41 gain 153 31 -89.83 gain 31 154 -89.41 gain 154 31 -89.74 gain 31 155 -90.16 gain 155 31 -89.06 gain 31 156 -99.45 gain 156 31 -97.58 gain 31 157 -94.09 gain 157 31 -94.69 gain 31 158 -90.77 gain 158 31 -90.88 gain 31 159 -95.37 gain 159 31 -97.86 gain 31 160 -91.88 gain 160 31 -91.52 gain 31 161 -99.13 gain 161 31 -101.22 gain 31 162 -96.81 gain 162 31 -98.61 gain 31 163 -97.68 gain 163 31 -101.39 gain 31 164 -101.76 gain 164 31 -104.84 gain 31 165 -96.92 gain 165 31 -97.06 gain 31 166 -92.89 gain 166 31 -92.78 gain 31 167 -89.79 gain 167 31 -90.40 gain 31 168 -97.47 gain 168 31 -96.98 gain 31 169 -98.97 gain 169 31 -99.59 gain 31 170 -87.72 gain 170 31 -87.57 gain 31 171 -88.88 gain 171 31 -89.82 gain 31 172 -99.67 gain 172 31 -98.79 gain 31 173 -90.44 gain 173 31 -94.21 gain 31 174 -95.04 gain 174 31 -94.86 gain 31 175 -95.00 gain 175 31 -95.96 gain 31 176 -96.36 gain 176 31 -96.28 gain 31 177 -99.74 gain 177 31 -102.67 gain 31 178 -95.54 gain 178 31 -91.91 gain 31 179 -106.67 gain 179 31 -102.46 gain 31 180 -85.45 gain 180 31 -90.69 gain 31 181 -93.19 gain 181 31 -92.45 gain 31 182 -97.28 gain 182 31 -97.62 gain 31 183 -104.83 gain 183 31 -105.45 gain 31 184 -103.35 gain 184 31 -106.71 gain 31 185 -94.36 gain 185 31 -101.60 gain 31 186 -104.72 gain 186 31 -107.53 gain 31 187 -106.02 gain 187 31 -106.56 gain 31 188 -98.75 gain 188 31 -101.71 gain 31 189 -99.78 gain 189 31 -97.46 gain 31 190 -97.59 gain 190 31 -99.19 gain 31 191 -90.87 gain 191 31 -91.17 gain 31 192 -99.69 gain 192 31 -98.69 gain 31 193 -102.36 gain 193 31 -100.34 gain 31 194 -109.86 gain 194 31 -108.63 gain 31 195 -101.75 gain 195 31 -99.06 gain 31 196 -99.24 gain 196 31 -100.86 gain 31 197 -98.67 gain 197 31 -95.43 gain 31 198 -92.15 gain 198 31 -93.42 gain 31 199 -93.64 gain 199 31 -95.02 gain 31 200 -102.62 gain 200 31 -105.33 gain 31 201 -99.26 gain 201 31 -101.89 gain 31 202 -101.46 gain 202 31 -103.22 gain 31 203 -93.74 gain 203 31 -94.61 gain 31 204 -95.49 gain 204 31 -93.00 gain 31 205 -96.89 gain 205 31 -98.15 gain 31 206 -106.49 gain 206 31 -108.85 gain 31 207 -103.26 gain 207 31 -105.05 gain 31 208 -108.54 gain 208 31 -112.92 gain 31 209 -93.70 gain 209 31 -97.66 gain 31 210 -98.95 gain 210 31 -103.08 gain 31 211 -100.29 gain 211 31 -99.65 gain 31 212 -96.98 gain 212 31 -99.36 gain 31 213 -98.13 gain 213 31 -99.83 gain 31 214 -96.98 gain 214 31 -104.07 gain 31 215 -96.46 gain 215 31 -98.95 gain 31 216 -99.30 gain 216 31 -105.70 gain 31 217 -98.60 gain 217 31 -105.26 gain 31 218 -99.68 gain 218 31 -99.15 gain 31 219 -97.23 gain 219 31 -97.18 gain 31 220 -100.43 gain 220 31 -96.47 gain 31 221 -100.75 gain 221 31 -102.46 gain 31 222 -106.68 gain 222 31 -104.20 gain 31 223 -101.83 gain 223 31 -102.60 gain 31 224 -113.64 gain 224 31 -114.87 gain 32 33 -68.44 gain 33 32 -69.88 gain 32 34 -69.30 gain 34 32 -71.37 gain 32 35 -78.16 gain 35 32 -81.19 gain 32 36 -81.61 gain 36 32 -84.78 gain 32 37 -80.57 gain 37 32 -86.28 gain 32 38 -89.21 gain 38 32 -92.46 gain 32 39 -88.19 gain 39 32 -95.76 gain 32 40 -87.80 gain 40 32 -90.35 gain 32 41 -94.09 gain 41 32 -91.98 gain 32 42 -94.26 gain 42 32 -99.39 gain 32 43 -102.15 gain 43 32 -104.88 gain 32 44 -99.24 gain 44 32 -105.57 gain 32 45 -73.26 gain 45 32 -79.57 gain 32 46 -63.36 gain 46 32 -66.13 gain 32 47 -62.58 gain 47 32 -63.05 gain 32 48 -70.62 gain 48 32 -70.67 gain 32 49 -76.93 gain 49 32 -81.04 gain 32 50 -72.10 gain 50 32 -73.07 gain 32 51 -73.11 gain 51 32 -77.77 gain 32 52 -75.17 gain 52 32 -77.07 gain 32 53 -81.31 gain 53 32 -83.77 gain 32 54 -84.09 gain 54 32 -85.95 gain 32 55 -91.61 gain 55 32 -90.39 gain 32 56 -90.50 gain 56 32 -94.32 gain 32 57 -95.16 gain 57 32 -98.06 gain 32 58 -93.77 gain 58 32 -93.37 gain 32 59 -85.31 gain 59 32 -84.16 gain 32 60 -77.77 gain 60 32 -85.90 gain 32 61 -73.52 gain 61 32 -73.56 gain 32 62 -68.85 gain 62 32 -66.40 gain 32 63 -72.21 gain 63 32 -73.72 gain 32 64 -69.50 gain 64 32 -75.24 gain 32 65 -80.87 gain 65 32 -82.16 gain 32 66 -80.93 gain 66 32 -81.20 gain 32 67 -87.75 gain 67 32 -89.25 gain 32 68 -90.12 gain 68 32 -94.21 gain 32 69 -89.38 gain 69 32 -90.68 gain 32 70 -89.60 gain 70 32 -89.37 gain 32 71 -94.96 gain 71 32 -98.30 gain 32 72 -89.81 gain 72 32 -90.71 gain 32 73 -92.37 gain 73 32 -94.64 gain 32 74 -91.62 gain 74 32 -90.00 gain 32 75 -76.77 gain 75 32 -81.04 gain 32 76 -69.67 gain 76 32 -74.07 gain 32 77 -82.44 gain 77 32 -82.83 gain 32 78 -77.82 gain 78 32 -82.71 gain 32 79 -91.48 gain 79 32 -95.99 gain 32 80 -84.14 gain 80 32 -86.44 gain 32 81 -81.11 gain 81 32 -84.32 gain 32 82 -90.87 gain 82 32 -95.06 gain 32 83 -89.62 gain 83 32 -91.08 gain 32 84 -89.08 gain 84 32 -87.73 gain 32 85 -85.99 gain 85 32 -90.07 gain 32 86 -97.95 gain 86 32 -103.66 gain 32 87 -93.14 gain 87 32 -96.14 gain 32 88 -95.32 gain 88 32 -97.96 gain 32 89 -94.69 gain 89 32 -99.48 gain 32 90 -84.99 gain 90 32 -89.12 gain 32 91 -80.54 gain 91 32 -85.74 gain 32 92 -76.37 gain 92 32 -82.48 gain 32 93 -89.53 gain 93 32 -93.00 gain 32 94 -93.39 gain 94 32 -95.44 gain 32 95 -85.81 gain 95 32 -87.09 gain 32 96 -87.67 gain 96 32 -95.92 gain 32 97 -91.57 gain 97 32 -92.65 gain 32 98 -90.29 gain 98 32 -91.83 gain 32 99 -94.77 gain 99 32 -95.45 gain 32 100 -89.99 gain 100 32 -90.59 gain 32 101 -94.19 gain 101 32 -98.42 gain 32 102 -92.46 gain 102 32 -96.66 gain 32 103 -95.41 gain 103 32 -100.77 gain 32 104 -93.89 gain 104 32 -101.73 gain 32 105 -85.74 gain 105 32 -88.11 gain 32 106 -86.30 gain 106 32 -86.00 gain 32 107 -83.41 gain 107 32 -83.01 gain 32 108 -86.73 gain 108 32 -85.96 gain 32 109 -84.41 gain 109 32 -87.09 gain 32 110 -81.94 gain 110 32 -90.97 gain 32 111 -87.23 gain 111 32 -86.24 gain 32 112 -90.73 gain 112 32 -93.20 gain 32 113 -87.46 gain 113 32 -89.06 gain 32 114 -88.55 gain 114 32 -87.31 gain 32 115 -92.41 gain 115 32 -91.83 gain 32 116 -93.92 gain 116 32 -95.77 gain 32 117 -88.81 gain 117 32 -87.80 gain 32 118 -92.06 gain 118 32 -92.67 gain 32 119 -101.29 gain 119 32 -106.97 gain 32 120 -90.25 gain 120 32 -93.31 gain 32 121 -78.16 gain 121 32 -82.24 gain 32 122 -85.17 gain 122 32 -89.00 gain 32 123 -82.82 gain 123 32 -86.99 gain 32 124 -89.25 gain 124 32 -91.41 gain 32 125 -85.46 gain 125 32 -90.95 gain 32 126 -89.97 gain 126 32 -92.12 gain 32 127 -88.04 gain 127 32 -89.81 gain 32 128 -95.15 gain 128 32 -99.51 gain 32 129 -91.68 gain 129 32 -93.25 gain 32 130 -92.85 gain 130 32 -95.72 gain 32 131 -93.07 gain 131 32 -95.71 gain 32 132 -95.37 gain 132 32 -94.02 gain 32 133 -95.59 gain 133 32 -99.42 gain 32 134 -101.29 gain 134 32 -101.98 gain 32 135 -88.34 gain 135 32 -91.34 gain 32 136 -84.36 gain 136 32 -87.79 gain 32 137 -85.01 gain 137 32 -91.36 gain 32 138 -93.14 gain 138 32 -93.01 gain 32 139 -84.13 gain 139 32 -87.27 gain 32 140 -89.79 gain 140 32 -93.76 gain 32 141 -95.58 gain 141 32 -91.52 gain 32 142 -97.43 gain 142 32 -100.11 gain 32 143 -88.84 gain 143 32 -94.26 gain 32 144 -96.43 gain 144 32 -100.21 gain 32 145 -90.95 gain 145 32 -98.13 gain 32 146 -95.85 gain 146 32 -99.01 gain 32 147 -97.06 gain 147 32 -97.33 gain 32 148 -90.70 gain 148 32 -89.30 gain 32 149 -98.71 gain 149 32 -100.96 gain 32 150 -91.27 gain 150 32 -94.37 gain 32 151 -91.43 gain 151 32 -93.46 gain 32 152 -85.77 gain 152 32 -87.62 gain 32 153 -83.35 gain 153 32 -84.41 gain 32 154 -98.24 gain 154 32 -101.20 gain 32 155 -96.27 gain 155 32 -97.81 gain 32 156 -85.73 gain 156 32 -86.50 gain 32 157 -94.19 gain 157 32 -97.45 gain 32 158 -95.64 gain 158 32 -98.39 gain 32 159 -91.31 gain 159 32 -96.44 gain 32 160 -90.41 gain 160 32 -92.70 gain 32 161 -94.31 gain 161 32 -99.04 gain 32 162 -91.10 gain 162 32 -95.54 gain 32 163 -89.34 gain 163 32 -95.69 gain 32 164 -94.27 gain 164 32 -99.99 gain 32 165 -87.44 gain 165 32 -90.22 gain 32 166 -93.10 gain 166 32 -95.63 gain 32 167 -91.93 gain 167 32 -95.19 gain 32 168 -87.10 gain 168 32 -89.25 gain 32 169 -85.09 gain 169 32 -88.35 gain 32 170 -92.91 gain 170 32 -95.41 gain 32 171 -86.30 gain 171 32 -89.88 gain 32 172 -95.28 gain 172 32 -97.05 gain 32 173 -98.79 gain 173 32 -105.20 gain 32 174 -92.62 gain 174 32 -95.08 gain 32 175 -102.77 gain 175 32 -106.36 gain 32 176 -95.60 gain 176 32 -98.16 gain 32 177 -98.03 gain 177 32 -103.60 gain 32 178 -97.85 gain 178 32 -96.86 gain 32 179 -98.50 gain 179 32 -96.93 gain 32 180 -95.63 gain 180 32 -103.51 gain 32 181 -88.45 gain 181 32 -90.36 gain 32 182 -89.89 gain 182 32 -92.87 gain 32 183 -97.00 gain 183 32 -100.26 gain 32 184 -93.10 gain 184 32 -99.11 gain 32 185 -91.88 gain 185 32 -101.75 gain 32 186 -88.45 gain 186 32 -93.91 gain 32 187 -91.12 gain 187 32 -94.30 gain 32 188 -89.32 gain 188 32 -94.92 gain 32 189 -92.20 gain 189 32 -92.52 gain 32 190 -98.78 gain 190 32 -103.02 gain 32 191 -99.92 gain 191 32 -102.87 gain 32 192 -95.71 gain 192 32 -97.35 gain 32 193 -101.74 gain 193 32 -102.37 gain 32 194 -94.88 gain 194 32 -96.29 gain 32 195 -95.02 gain 195 32 -94.98 gain 32 196 -94.93 gain 196 32 -99.20 gain 32 197 -102.01 gain 197 32 -101.41 gain 32 198 -95.76 gain 198 32 -99.68 gain 32 199 -94.89 gain 199 32 -98.91 gain 32 200 -92.82 gain 200 32 -98.18 gain 32 201 -94.01 gain 201 32 -99.27 gain 32 202 -98.58 gain 202 32 -102.99 gain 32 203 -91.36 gain 203 32 -94.87 gain 32 204 -100.97 gain 204 32 -101.12 gain 32 205 -104.68 gain 205 32 -108.58 gain 32 206 -96.61 gain 206 32 -101.61 gain 32 207 -97.42 gain 207 32 -101.84 gain 32 208 -105.67 gain 208 32 -112.69 gain 32 209 -99.99 gain 209 32 -106.59 gain 32 210 -96.22 gain 210 32 -103.00 gain 32 211 -87.77 gain 211 32 -89.78 gain 32 212 -99.43 gain 212 32 -104.45 gain 32 213 -99.19 gain 213 32 -103.53 gain 32 214 -90.69 gain 214 32 -100.42 gain 32 215 -100.23 gain 215 32 -105.36 gain 32 216 -96.83 gain 216 32 -105.88 gain 32 217 -94.74 gain 217 32 -104.05 gain 32 218 -95.92 gain 218 32 -98.03 gain 32 219 -98.58 gain 219 32 -101.18 gain 32 220 -97.06 gain 220 32 -95.74 gain 32 221 -98.20 gain 221 32 -102.56 gain 32 222 -100.51 gain 222 32 -100.68 gain 32 223 -101.85 gain 223 32 -105.26 gain 32 224 -95.25 gain 224 32 -99.13 gain 33 34 -58.99 gain 34 33 -59.63 gain 33 35 -74.75 gain 35 33 -76.33 gain 33 36 -72.77 gain 36 33 -74.50 gain 33 37 -85.01 gain 37 33 -89.27 gain 33 38 -85.46 gain 38 33 -87.27 gain 33 39 -82.07 gain 39 33 -88.19 gain 33 40 -88.46 gain 40 33 -89.57 gain 33 41 -88.88 gain 41 33 -85.33 gain 33 42 -87.20 gain 42 33 -90.90 gain 33 43 -91.10 gain 43 33 -92.39 gain 33 44 -95.15 gain 44 33 -100.03 gain 33 45 -78.75 gain 45 33 -83.61 gain 33 46 -76.25 gain 46 33 -77.57 gain 33 47 -75.06 gain 47 33 -74.09 gain 33 48 -63.00 gain 48 33 -61.61 gain 33 49 -63.69 gain 49 33 -66.35 gain 33 50 -74.05 gain 50 33 -73.58 gain 33 51 -81.61 gain 51 33 -84.83 gain 33 52 -84.76 gain 52 33 -85.21 gain 33 53 -83.74 gain 53 33 -84.75 gain 33 54 -85.79 gain 54 33 -86.20 gain 33 55 -88.47 gain 55 33 -85.80 gain 33 56 -87.89 gain 56 33 -90.27 gain 33 57 -91.32 gain 57 33 -92.79 gain 33 58 -96.79 gain 58 33 -94.94 gain 33 59 -89.83 gain 59 33 -87.24 gain 33 60 -77.90 gain 60 33 -84.59 gain 33 61 -80.10 gain 61 33 -78.70 gain 33 62 -67.05 gain 62 33 -63.15 gain 33 63 -67.50 gain 63 33 -67.57 gain 33 64 -72.33 gain 64 33 -76.62 gain 33 65 -79.13 gain 65 33 -78.98 gain 33 66 -87.53 gain 66 33 -86.35 gain 33 67 -90.45 gain 67 33 -90.50 gain 33 68 -90.41 gain 68 33 -93.05 gain 33 69 -87.85 gain 69 33 -87.71 gain 33 70 -86.53 gain 70 33 -84.85 gain 33 71 -91.30 gain 71 33 -93.20 gain 33 72 -88.45 gain 72 33 -87.90 gain 33 73 -90.74 gain 73 33 -91.56 gain 33 74 -88.13 gain 74 33 -85.06 gain 33 75 -78.43 gain 75 33 -81.26 gain 33 76 -75.72 gain 76 33 -78.67 gain 33 77 -77.15 gain 77 33 -76.09 gain 33 78 -75.67 gain 78 33 -79.12 gain 33 79 -80.97 gain 79 33 -84.03 gain 33 80 -84.39 gain 80 33 -85.24 gain 33 81 -81.16 gain 81 33 -82.92 gain 33 82 -91.07 gain 82 33 -93.82 gain 33 83 -84.99 gain 83 33 -85.01 gain 33 84 -84.62 gain 84 33 -81.82 gain 33 85 -88.07 gain 85 33 -90.71 gain 33 86 -84.18 gain 86 33 -88.45 gain 33 87 -91.33 gain 87 33 -92.89 gain 33 88 -94.49 gain 88 33 -95.69 gain 33 89 -93.41 gain 89 33 -96.75 gain 33 90 -83.88 gain 90 33 -86.56 gain 33 91 -79.95 gain 91 33 -83.71 gain 33 92 -83.48 gain 92 33 -88.15 gain 33 93 -83.44 gain 93 33 -85.47 gain 33 94 -83.34 gain 94 33 -83.94 gain 33 95 -78.04 gain 95 33 -77.88 gain 33 96 -87.88 gain 96 33 -94.69 gain 33 97 -87.94 gain 97 33 -87.57 gain 33 98 -94.73 gain 98 33 -94.83 gain 33 99 -87.99 gain 99 33 -87.23 gain 33 100 -96.30 gain 100 33 -95.45 gain 33 101 -95.40 gain 101 33 -98.18 gain 33 102 -90.81 gain 102 33 -93.56 gain 33 103 -93.92 gain 103 33 -97.84 gain 33 104 -105.94 gain 104 33 -112.34 gain 33 105 -85.08 gain 105 33 -86.00 gain 33 106 -81.60 gain 106 33 -79.86 gain 33 107 -85.90 gain 107 33 -84.06 gain 33 108 -85.35 gain 108 33 -83.13 gain 33 109 -87.77 gain 109 33 -89.00 gain 33 110 -87.26 gain 110 33 -94.85 gain 33 111 -84.43 gain 111 33 -81.99 gain 33 112 -85.37 gain 112 33 -86.39 gain 33 113 -92.75 gain 113 33 -92.90 gain 33 114 -91.77 gain 114 33 -89.09 gain 33 115 -91.62 gain 115 33 -89.59 gain 33 116 -84.81 gain 116 33 -85.21 gain 33 117 -94.53 gain 117 33 -92.07 gain 33 118 -97.22 gain 118 33 -96.39 gain 33 119 -91.47 gain 119 33 -95.69 gain 33 120 -88.48 gain 120 33 -90.09 gain 33 121 -86.92 gain 121 33 -89.55 gain 33 122 -90.51 gain 122 33 -92.90 gain 33 123 -89.54 gain 123 33 -92.27 gain 33 124 -83.88 gain 124 33 -84.60 gain 33 125 -86.80 gain 125 33 -90.85 gain 33 126 -90.65 gain 126 33 -91.35 gain 33 127 -81.62 gain 127 33 -81.95 gain 33 128 -90.07 gain 128 33 -92.99 gain 33 129 -92.05 gain 129 33 -92.18 gain 33 130 -98.89 gain 130 33 -100.31 gain 33 131 -87.48 gain 131 33 -88.67 gain 33 132 -91.76 gain 132 33 -88.97 gain 33 133 -96.09 gain 133 33 -98.47 gain 33 134 -94.30 gain 134 33 -93.54 gain 33 135 -91.51 gain 135 33 -93.06 gain 33 136 -91.50 gain 136 33 -93.49 gain 33 137 -96.79 gain 137 33 -101.69 gain 33 138 -88.47 gain 138 33 -86.90 gain 33 139 -83.82 gain 139 33 -85.51 gain 33 140 -88.38 gain 140 33 -90.90 gain 33 141 -95.34 gain 141 33 -89.84 gain 33 142 -90.76 gain 142 33 -92.00 gain 33 143 -88.06 gain 143 33 -92.03 gain 33 144 -91.26 gain 144 33 -93.60 gain 33 145 -96.51 gain 145 33 -102.24 gain 33 146 -92.48 gain 146 33 -94.20 gain 33 147 -101.41 gain 147 33 -100.23 gain 33 148 -93.57 gain 148 33 -90.72 gain 33 149 -93.71 gain 149 33 -94.52 gain 33 150 -87.18 gain 150 33 -88.82 gain 33 151 -87.21 gain 151 33 -87.79 gain 33 152 -91.85 gain 152 33 -92.25 gain 33 153 -91.81 gain 153 33 -91.43 gain 33 154 -84.94 gain 154 33 -86.46 gain 33 155 -89.85 gain 155 33 -89.95 gain 33 156 -97.05 gain 156 33 -96.38 gain 33 157 -95.98 gain 157 33 -97.79 gain 33 158 -87.85 gain 158 33 -89.16 gain 33 159 -91.10 gain 159 33 -94.79 gain 33 160 -91.68 gain 160 33 -92.52 gain 33 161 -85.78 gain 161 33 -89.06 gain 33 162 -98.44 gain 162 33 -101.43 gain 33 163 -94.64 gain 163 33 -99.55 gain 33 164 -100.10 gain 164 33 -104.38 gain 33 165 -93.09 gain 165 33 -94.42 gain 33 166 -92.48 gain 166 33 -93.57 gain 33 167 -92.96 gain 167 33 -94.77 gain 33 168 -92.16 gain 168 33 -92.86 gain 33 169 -95.33 gain 169 33 -97.14 gain 33 170 -92.77 gain 170 33 -93.82 gain 33 171 -91.58 gain 171 33 -93.71 gain 33 172 -87.15 gain 172 33 -87.48 gain 33 173 -90.08 gain 173 33 -95.05 gain 33 174 -90.93 gain 174 33 -91.95 gain 33 175 -92.89 gain 175 33 -95.05 gain 33 176 -90.91 gain 176 33 -92.04 gain 33 177 -88.90 gain 177 33 -93.03 gain 33 178 -101.87 gain 178 33 -99.44 gain 33 179 -89.39 gain 179 33 -86.38 gain 33 180 -95.13 gain 180 33 -101.57 gain 33 181 -92.49 gain 181 33 -92.94 gain 33 182 -93.27 gain 182 33 -94.81 gain 33 183 -93.07 gain 183 33 -94.88 gain 33 184 -93.93 gain 184 33 -98.49 gain 33 185 -101.02 gain 185 33 -109.45 gain 33 186 -87.57 gain 186 33 -91.58 gain 33 187 -98.03 gain 187 33 -99.77 gain 33 188 -92.85 gain 188 33 -97.01 gain 33 189 -95.11 gain 189 33 -93.99 gain 33 190 -97.50 gain 190 33 -100.30 gain 33 191 -95.93 gain 191 33 -97.43 gain 33 192 -96.01 gain 192 33 -96.21 gain 33 193 -105.40 gain 193 33 -104.58 gain 33 194 -99.09 gain 194 33 -99.06 gain 33 195 -94.67 gain 195 33 -93.18 gain 33 196 -89.04 gain 196 33 -91.86 gain 33 197 -90.87 gain 197 33 -88.83 gain 33 198 -100.41 gain 198 33 -102.88 gain 33 199 -91.58 gain 199 33 -94.15 gain 33 200 -93.83 gain 200 33 -97.74 gain 33 201 -94.24 gain 201 33 -98.06 gain 33 202 -90.99 gain 202 33 -93.95 gain 33 203 -90.48 gain 203 33 -92.54 gain 33 204 -99.82 gain 204 33 -98.53 gain 33 205 -100.67 gain 205 33 -103.12 gain 33 206 -99.81 gain 206 33 -103.37 gain 33 207 -97.58 gain 207 33 -100.56 gain 33 208 -95.29 gain 208 33 -100.87 gain 33 209 -105.16 gain 209 33 -110.31 gain 33 210 -98.16 gain 210 33 -103.49 gain 33 211 -100.13 gain 211 33 -100.69 gain 33 212 -92.56 gain 212 33 -96.13 gain 33 213 -102.97 gain 213 33 -105.87 gain 33 214 -93.31 gain 214 33 -101.59 gain 33 215 -96.97 gain 215 33 -100.66 gain 33 216 -103.36 gain 216 33 -110.96 gain 33 217 -94.57 gain 217 33 -102.43 gain 33 218 -95.48 gain 218 33 -96.15 gain 33 219 -95.12 gain 219 33 -96.27 gain 33 220 -104.33 gain 220 33 -101.57 gain 33 221 -95.66 gain 221 33 -98.58 gain 33 222 -102.82 gain 222 33 -101.54 gain 33 223 -99.07 gain 223 33 -101.03 gain 33 224 -99.35 gain 224 33 -101.78 gain 34 35 -64.54 gain 35 34 -65.48 gain 34 36 -74.32 gain 36 34 -75.41 gain 34 37 -70.68 gain 37 34 -74.31 gain 34 38 -83.38 gain 38 34 -84.55 gain 34 39 -80.37 gain 39 34 -85.85 gain 34 40 -88.70 gain 40 34 -89.17 gain 34 41 -86.91 gain 41 34 -82.72 gain 34 42 -93.35 gain 42 34 -96.41 gain 34 43 -93.69 gain 43 34 -94.34 gain 34 44 -100.35 gain 44 34 -104.60 gain 34 45 -83.73 gain 45 34 -87.95 gain 34 46 -82.93 gain 46 34 -83.63 gain 34 47 -70.03 gain 47 34 -68.42 gain 34 48 -61.96 gain 48 34 -59.93 gain 34 49 -69.52 gain 49 34 -71.55 gain 34 50 -72.63 gain 50 34 -71.52 gain 34 51 -73.72 gain 51 34 -76.30 gain 34 52 -79.07 gain 52 34 -78.89 gain 34 53 -81.98 gain 53 34 -82.36 gain 34 54 -85.80 gain 54 34 -85.59 gain 34 55 -93.63 gain 55 34 -90.33 gain 34 56 -98.18 gain 56 34 -99.92 gain 34 57 -95.31 gain 57 34 -96.13 gain 34 58 -92.99 gain 58 34 -90.51 gain 34 59 -93.66 gain 59 34 -90.43 gain 34 60 -83.46 gain 60 34 -89.52 gain 34 61 -81.62 gain 61 34 -79.58 gain 34 62 -75.18 gain 62 34 -70.65 gain 34 63 -74.71 gain 63 34 -74.14 gain 34 64 -72.06 gain 64 34 -75.72 gain 34 65 -73.52 gain 65 34 -72.73 gain 34 66 -79.86 gain 66 34 -78.05 gain 34 67 -77.87 gain 67 34 -77.29 gain 34 68 -81.83 gain 68 34 -83.84 gain 34 69 -83.98 gain 69 34 -83.21 gain 34 70 -80.98 gain 70 34 -78.67 gain 34 71 -91.66 gain 71 34 -92.92 gain 34 72 -96.16 gain 72 34 -94.97 gain 34 73 -94.02 gain 73 34 -94.21 gain 34 74 -93.87 gain 74 34 -90.18 gain 34 75 -87.34 gain 75 34 -89.53 gain 34 76 -79.14 gain 76 34 -81.46 gain 34 77 -79.24 gain 77 34 -77.55 gain 34 78 -80.98 gain 78 34 -83.79 gain 34 79 -80.65 gain 79 34 -83.09 gain 34 80 -83.47 gain 80 34 -83.69 gain 34 81 -82.27 gain 81 34 -83.40 gain 34 82 -87.79 gain 82 34 -89.90 gain 34 83 -87.41 gain 83 34 -86.79 gain 34 84 -93.69 gain 84 34 -90.26 gain 34 85 -90.97 gain 85 34 -92.97 gain 34 86 -91.26 gain 86 34 -94.90 gain 34 87 -90.03 gain 87 34 -90.95 gain 34 88 -89.05 gain 88 34 -89.62 gain 34 89 -97.36 gain 89 34 -100.07 gain 34 90 -83.27 gain 90 34 -85.32 gain 34 91 -79.22 gain 91 34 -82.33 gain 34 92 -84.54 gain 92 34 -88.57 gain 34 93 -80.34 gain 93 34 -81.74 gain 34 94 -82.21 gain 94 34 -82.17 gain 34 95 -86.35 gain 95 34 -85.55 gain 34 96 -84.57 gain 96 34 -90.75 gain 34 97 -91.22 gain 97 34 -90.22 gain 34 98 -85.60 gain 98 34 -85.07 gain 34 99 -89.40 gain 99 34 -88.00 gain 34 100 -85.74 gain 100 34 -84.26 gain 34 101 -87.29 gain 101 34 -89.44 gain 34 102 -91.43 gain 102 34 -93.54 gain 34 103 -94.66 gain 103 34 -97.95 gain 34 104 -100.50 gain 104 34 -106.27 gain 34 105 -86.82 gain 105 34 -87.11 gain 34 106 -86.54 gain 106 34 -84.16 gain 34 107 -84.79 gain 107 34 -82.32 gain 34 108 -83.34 gain 108 34 -80.48 gain 34 109 -85.88 gain 109 34 -86.47 gain 34 110 -88.05 gain 110 34 -95.00 gain 34 111 -90.51 gain 111 34 -87.43 gain 34 112 -87.44 gain 112 34 -87.82 gain 34 113 -98.74 gain 113 34 -98.25 gain 34 114 -83.89 gain 114 34 -80.57 gain 34 115 -96.51 gain 115 34 -93.85 gain 34 116 -90.00 gain 116 34 -89.77 gain 34 117 -90.53 gain 117 34 -87.44 gain 34 118 -96.35 gain 118 34 -94.89 gain 34 119 -91.99 gain 119 34 -95.58 gain 34 120 -91.76 gain 120 34 -92.73 gain 34 121 -91.67 gain 121 34 -93.67 gain 34 122 -86.99 gain 122 34 -88.75 gain 34 123 -83.56 gain 123 34 -85.65 gain 34 124 -85.74 gain 124 34 -85.82 gain 34 125 -94.38 gain 125 34 -97.80 gain 34 126 -83.18 gain 126 34 -83.24 gain 34 127 -87.45 gain 127 34 -87.14 gain 34 128 -93.98 gain 128 34 -96.27 gain 34 129 -90.54 gain 129 34 -90.04 gain 34 130 -96.65 gain 130 34 -97.44 gain 34 131 -91.74 gain 131 34 -92.30 gain 34 132 -97.93 gain 132 34 -94.50 gain 34 133 -93.72 gain 133 34 -95.46 gain 34 134 -85.54 gain 134 34 -84.14 gain 34 135 -91.76 gain 135 34 -92.67 gain 34 136 -91.22 gain 136 34 -92.57 gain 34 137 -83.25 gain 137 34 -87.52 gain 34 138 -81.20 gain 138 34 -79.00 gain 34 139 -85.05 gain 139 34 -86.11 gain 34 140 -90.04 gain 140 34 -91.93 gain 34 141 -91.38 gain 141 34 -85.24 gain 34 142 -94.72 gain 142 34 -95.33 gain 34 143 -95.73 gain 143 34 -99.07 gain 34 144 -95.67 gain 144 34 -97.37 gain 34 145 -89.94 gain 145 34 -95.03 gain 34 146 -95.42 gain 146 34 -96.51 gain 34 147 -90.02 gain 147 34 -88.22 gain 34 148 -91.37 gain 148 34 -87.89 gain 34 149 -102.03 gain 149 34 -102.21 gain 34 150 -93.90 gain 150 34 -94.91 gain 34 151 -90.88 gain 151 34 -90.83 gain 34 152 -88.10 gain 152 34 -87.87 gain 34 153 -95.02 gain 153 34 -94.00 gain 34 154 -90.53 gain 154 34 -91.42 gain 34 155 -82.71 gain 155 34 -82.17 gain 34 156 -87.51 gain 156 34 -86.20 gain 34 157 -91.39 gain 157 34 -92.57 gain 34 158 -90.02 gain 158 34 -90.70 gain 34 159 -90.04 gain 159 34 -93.10 gain 34 160 -91.38 gain 160 34 -91.59 gain 34 161 -94.69 gain 161 34 -97.34 gain 34 162 -94.40 gain 162 34 -96.76 gain 34 163 -96.86 gain 163 34 -101.13 gain 34 164 -94.14 gain 164 34 -97.79 gain 34 165 -92.13 gain 165 34 -92.83 gain 34 166 -93.85 gain 166 34 -94.30 gain 34 167 -88.28 gain 167 34 -89.45 gain 34 168 -93.41 gain 168 34 -93.48 gain 34 169 -94.98 gain 169 34 -96.17 gain 34 170 -92.81 gain 170 34 -93.23 gain 34 171 -95.02 gain 171 34 -96.52 gain 34 172 -95.30 gain 172 34 -94.99 gain 34 173 -86.11 gain 173 34 -90.44 gain 34 174 -99.01 gain 174 34 -99.39 gain 34 175 -94.22 gain 175 34 -95.73 gain 34 176 -93.62 gain 176 34 -94.10 gain 34 177 -95.09 gain 177 34 -98.58 gain 34 178 -97.19 gain 178 34 -94.12 gain 34 179 -101.42 gain 179 34 -97.77 gain 34 180 -89.94 gain 180 34 -95.74 gain 34 181 -97.51 gain 181 34 -97.33 gain 34 182 -101.03 gain 182 34 -101.94 gain 34 183 -96.65 gain 183 34 -97.84 gain 34 184 -89.89 gain 184 34 -93.82 gain 34 185 -94.36 gain 185 34 -102.16 gain 34 186 -98.67 gain 186 34 -102.04 gain 34 187 -95.60 gain 187 34 -96.71 gain 34 188 -93.68 gain 188 34 -97.20 gain 34 189 -96.52 gain 189 34 -94.76 gain 34 190 -93.71 gain 190 34 -95.87 gain 34 191 -94.49 gain 191 34 -95.36 gain 34 192 -98.38 gain 192 34 -97.94 gain 34 193 -99.05 gain 193 34 -97.60 gain 34 194 -101.48 gain 194 34 -100.81 gain 34 195 -91.79 gain 195 34 -89.66 gain 34 196 -100.37 gain 196 34 -102.56 gain 34 197 -97.68 gain 197 34 -95.01 gain 34 198 -94.27 gain 198 34 -96.11 gain 34 199 -99.89 gain 199 34 -101.83 gain 34 200 -93.44 gain 200 34 -96.72 gain 34 201 -102.96 gain 201 34 -106.14 gain 34 202 -95.70 gain 202 34 -98.02 gain 34 203 -97.13 gain 203 34 -98.56 gain 34 204 -100.35 gain 204 34 -98.43 gain 34 205 -101.27 gain 205 34 -103.09 gain 34 206 -95.38 gain 206 34 -98.31 gain 34 207 -102.48 gain 207 34 -104.83 gain 34 208 -103.40 gain 208 34 -108.34 gain 34 209 -99.44 gain 209 34 -103.96 gain 34 210 -97.17 gain 210 34 -101.86 gain 34 211 -99.50 gain 211 34 -99.42 gain 34 212 -99.39 gain 212 34 -102.33 gain 34 213 -95.36 gain 213 34 -97.63 gain 34 214 -102.46 gain 214 34 -110.11 gain 34 215 -98.57 gain 215 34 -101.62 gain 34 216 -100.65 gain 216 34 -107.61 gain 34 217 -107.70 gain 217 34 -114.93 gain 34 218 -92.61 gain 218 34 -92.64 gain 34 219 -103.24 gain 219 34 -103.75 gain 34 220 -93.66 gain 220 34 -90.26 gain 34 221 -95.46 gain 221 34 -97.74 gain 34 222 -97.35 gain 222 34 -95.44 gain 34 223 -104.60 gain 223 34 -105.92 gain 34 224 -98.85 gain 224 34 -100.64 gain 35 36 -73.45 gain 36 35 -73.60 gain 35 37 -70.85 gain 37 35 -73.53 gain 35 38 -80.25 gain 38 35 -80.47 gain 35 39 -80.19 gain 39 35 -84.73 gain 35 40 -85.80 gain 40 35 -85.32 gain 35 41 -87.53 gain 41 35 -82.40 gain 35 42 -92.54 gain 42 35 -94.65 gain 35 43 -103.11 gain 43 35 -102.82 gain 35 44 -92.66 gain 44 35 -95.96 gain 35 45 -86.97 gain 45 35 -90.25 gain 35 46 -83.04 gain 46 35 -82.78 gain 35 47 -81.53 gain 47 35 -78.97 gain 35 48 -73.91 gain 48 35 -70.93 gain 35 49 -70.28 gain 49 35 -71.36 gain 35 50 -61.79 gain 50 35 -59.73 gain 35 51 -71.70 gain 51 35 -73.34 gain 35 52 -77.99 gain 52 35 -76.86 gain 35 53 -78.75 gain 53 35 -78.18 gain 35 54 -78.99 gain 54 35 -77.83 gain 35 55 -81.23 gain 55 35 -76.99 gain 35 56 -91.11 gain 56 35 -91.91 gain 35 57 -89.24 gain 57 35 -89.12 gain 35 58 -85.37 gain 58 35 -81.94 gain 35 59 -97.66 gain 59 35 -93.49 gain 35 60 -90.21 gain 60 35 -95.32 gain 35 61 -93.36 gain 61 35 -90.37 gain 35 62 -82.33 gain 62 35 -76.85 gain 35 63 -77.16 gain 63 35 -75.65 gain 35 64 -77.85 gain 64 35 -80.56 gain 35 65 -74.19 gain 65 35 -72.45 gain 35 66 -83.49 gain 66 35 -80.73 gain 35 67 -74.03 gain 67 35 -72.51 gain 35 68 -84.86 gain 68 35 -85.92 gain 35 69 -80.71 gain 69 35 -78.98 gain 35 70 -83.36 gain 70 35 -80.10 gain 35 71 -92.09 gain 71 35 -92.40 gain 35 72 -90.90 gain 72 35 -88.77 gain 35 73 -91.03 gain 73 35 -90.27 gain 35 74 -95.58 gain 74 35 -90.93 gain 35 75 -85.08 gain 75 35 -86.33 gain 35 76 -84.00 gain 76 35 -85.37 gain 35 77 -82.58 gain 77 35 -79.95 gain 35 78 -84.03 gain 78 35 -85.90 gain 35 79 -81.10 gain 79 35 -82.59 gain 35 80 -83.06 gain 80 35 -82.33 gain 35 81 -82.23 gain 81 35 -82.42 gain 35 82 -81.20 gain 82 35 -82.36 gain 35 83 -79.93 gain 83 35 -78.37 gain 35 84 -85.53 gain 84 35 -81.16 gain 35 85 -83.92 gain 85 35 -84.97 gain 35 86 -85.89 gain 86 35 -88.58 gain 35 87 -88.42 gain 87 35 -88.39 gain 35 88 -93.61 gain 88 35 -93.23 gain 35 89 -93.28 gain 89 35 -95.05 gain 35 90 -86.53 gain 90 35 -87.64 gain 35 91 -88.27 gain 91 35 -90.44 gain 35 92 -84.94 gain 92 35 -88.03 gain 35 93 -84.15 gain 93 35 -84.60 gain 35 94 -84.62 gain 94 35 -83.64 gain 35 95 -79.49 gain 95 35 -77.75 gain 35 96 -91.39 gain 96 35 -96.62 gain 35 97 -84.04 gain 97 35 -82.09 gain 35 98 -88.75 gain 98 35 -87.27 gain 35 99 -86.73 gain 99 35 -84.39 gain 35 100 -91.60 gain 100 35 -89.17 gain 35 101 -92.14 gain 101 35 -93.34 gain 35 102 -99.04 gain 102 35 -100.21 gain 35 103 -96.37 gain 103 35 -98.71 gain 35 104 -91.93 gain 104 35 -96.75 gain 35 105 -92.85 gain 105 35 -92.19 gain 35 106 -86.77 gain 106 35 -83.44 gain 35 107 -81.51 gain 107 35 -78.09 gain 35 108 -81.54 gain 108 35 -77.74 gain 35 109 -81.07 gain 109 35 -80.72 gain 35 110 -83.08 gain 110 35 -89.09 gain 35 111 -85.21 gain 111 35 -81.19 gain 35 112 -86.19 gain 112 35 -85.63 gain 35 113 -88.65 gain 113 35 -87.22 gain 35 114 -86.11 gain 114 35 -81.85 gain 35 115 -85.53 gain 115 35 -81.92 gain 35 116 -82.92 gain 116 35 -81.74 gain 35 117 -96.58 gain 117 35 -92.55 gain 35 118 -84.88 gain 118 35 -82.47 gain 35 119 -98.81 gain 119 35 -101.45 gain 35 120 -93.16 gain 120 35 -93.19 gain 35 121 -89.21 gain 121 35 -90.26 gain 35 122 -91.38 gain 122 35 -92.19 gain 35 123 -90.07 gain 123 35 -91.21 gain 35 124 -99.40 gain 124 35 -98.53 gain 35 125 -85.62 gain 125 35 -88.09 gain 35 126 -84.46 gain 126 35 -83.58 gain 35 127 -94.92 gain 127 35 -93.67 gain 35 128 -86.96 gain 128 35 -88.30 gain 35 129 -86.04 gain 129 35 -84.59 gain 35 130 -95.86 gain 130 35 -95.70 gain 35 131 -99.48 gain 131 35 -99.09 gain 35 132 -99.98 gain 132 35 -95.61 gain 35 133 -94.89 gain 133 35 -95.69 gain 35 134 -96.33 gain 134 35 -93.99 gain 35 135 -97.25 gain 135 35 -97.21 gain 35 136 -87.17 gain 136 35 -87.58 gain 35 137 -86.65 gain 137 35 -89.97 gain 35 138 -88.72 gain 138 35 -85.57 gain 35 139 -94.01 gain 139 35 -94.13 gain 35 140 -92.53 gain 140 35 -93.47 gain 35 141 -91.08 gain 141 35 -84.00 gain 35 142 -89.77 gain 142 35 -89.43 gain 35 143 -88.69 gain 143 35 -91.08 gain 35 144 -92.49 gain 144 35 -93.25 gain 35 145 -94.01 gain 145 35 -98.16 gain 35 146 -97.36 gain 146 35 -97.50 gain 35 147 -94.70 gain 147 35 -91.95 gain 35 148 -99.39 gain 148 35 -94.96 gain 35 149 -109.47 gain 149 35 -108.71 gain 35 150 -95.42 gain 150 35 -95.49 gain 35 151 -90.56 gain 151 35 -89.57 gain 35 152 -93.31 gain 152 35 -92.13 gain 35 153 -94.40 gain 153 35 -92.43 gain 35 154 -92.19 gain 154 35 -92.13 gain 35 155 -100.83 gain 155 35 -99.34 gain 35 156 -84.97 gain 156 35 -82.71 gain 35 157 -88.97 gain 157 35 -89.19 gain 35 158 -90.78 gain 158 35 -90.51 gain 35 159 -95.40 gain 159 35 -97.51 gain 35 160 -95.69 gain 160 35 -94.95 gain 35 161 -99.87 gain 161 35 -101.57 gain 35 162 -91.93 gain 162 35 -93.34 gain 35 163 -92.15 gain 163 35 -95.47 gain 35 164 -95.55 gain 164 35 -98.25 gain 35 165 -99.40 gain 165 35 -99.15 gain 35 166 -89.30 gain 166 35 -88.81 gain 35 167 -102.24 gain 167 35 -102.47 gain 35 168 -95.77 gain 168 35 -94.90 gain 35 169 -102.31 gain 169 35 -102.55 gain 35 170 -90.71 gain 170 35 -90.18 gain 35 171 -90.95 gain 171 35 -91.51 gain 35 172 -91.40 gain 172 35 -90.14 gain 35 173 -98.46 gain 173 35 -101.85 gain 35 174 -92.90 gain 174 35 -92.33 gain 35 175 -98.96 gain 175 35 -99.54 gain 35 176 -103.35 gain 176 35 -102.89 gain 35 177 -98.02 gain 177 35 -100.56 gain 35 178 -99.83 gain 178 35 -95.82 gain 35 179 -97.77 gain 179 35 -93.18 gain 35 180 -95.55 gain 180 35 -100.40 gain 35 181 -97.56 gain 181 35 -96.44 gain 35 182 -99.42 gain 182 35 -99.39 gain 35 183 -94.99 gain 183 35 -95.23 gain 35 184 -94.00 gain 184 35 -96.98 gain 35 185 -96.06 gain 185 35 -102.91 gain 35 186 -100.10 gain 186 35 -102.53 gain 35 187 -92.64 gain 187 35 -92.80 gain 35 188 -96.94 gain 188 35 -99.51 gain 35 189 -99.03 gain 189 35 -96.33 gain 35 190 -105.53 gain 190 35 -106.74 gain 35 191 -103.22 gain 191 35 -103.14 gain 35 192 -97.90 gain 192 35 -96.52 gain 35 193 -96.66 gain 193 35 -94.26 gain 35 194 -99.92 gain 194 35 -98.30 gain 35 195 -98.43 gain 195 35 -95.36 gain 35 196 -92.79 gain 196 35 -94.03 gain 35 197 -93.13 gain 197 35 -89.51 gain 35 198 -104.82 gain 198 35 -105.71 gain 35 199 -101.99 gain 199 35 -102.98 gain 35 200 -99.09 gain 200 35 -101.42 gain 35 201 -92.46 gain 201 35 -94.70 gain 35 202 -94.02 gain 202 35 -95.40 gain 35 203 -94.83 gain 203 35 -95.32 gain 35 204 -96.84 gain 204 35 -93.98 gain 35 205 -100.38 gain 205 35 -101.26 gain 35 206 -91.92 gain 206 35 -93.90 gain 35 207 -95.22 gain 207 35 -96.62 gain 35 208 -92.44 gain 208 35 -96.44 gain 35 209 -107.58 gain 209 35 -111.16 gain 35 210 -106.44 gain 210 35 -110.19 gain 35 211 -98.64 gain 211 35 -97.62 gain 35 212 -97.54 gain 212 35 -99.54 gain 35 213 -101.41 gain 213 35 -102.72 gain 35 214 -94.26 gain 214 35 -100.97 gain 35 215 -93.83 gain 215 35 -95.93 gain 35 216 -99.35 gain 216 35 -105.37 gain 35 217 -91.12 gain 217 35 -97.40 gain 35 218 -98.59 gain 218 35 -97.67 gain 35 219 -97.54 gain 219 35 -97.11 gain 35 220 -102.40 gain 220 35 -98.06 gain 35 221 -103.15 gain 221 35 -104.48 gain 35 222 -103.28 gain 222 35 -100.43 gain 35 223 -100.66 gain 223 35 -101.04 gain 35 224 -102.94 gain 224 35 -103.79 gain 36 37 -59.09 gain 37 36 -61.62 gain 36 38 -77.04 gain 38 36 -77.11 gain 36 39 -74.69 gain 39 36 -79.09 gain 36 40 -80.86 gain 40 36 -80.23 gain 36 41 -84.81 gain 41 36 -79.53 gain 36 42 -95.06 gain 42 36 -97.03 gain 36 43 -86.11 gain 43 36 -85.66 gain 36 44 -93.47 gain 44 36 -96.62 gain 36 45 -81.88 gain 45 36 -85.01 gain 36 46 -87.29 gain 46 36 -86.89 gain 36 47 -83.93 gain 47 36 -81.23 gain 36 48 -78.93 gain 48 36 -75.81 gain 36 49 -70.53 gain 49 36 -71.46 gain 36 50 -68.21 gain 50 36 -66.01 gain 36 51 -70.88 gain 51 36 -72.37 gain 36 52 -70.94 gain 52 36 -69.66 gain 36 53 -77.41 gain 53 36 -76.69 gain 36 54 -82.57 gain 54 36 -81.26 gain 36 55 -77.07 gain 55 36 -72.67 gain 36 56 -86.75 gain 56 36 -87.40 gain 36 57 -84.76 gain 57 36 -84.49 gain 36 58 -92.96 gain 58 36 -89.39 gain 36 59 -94.10 gain 59 36 -89.78 gain 36 60 -87.86 gain 60 36 -92.82 gain 36 61 -89.75 gain 61 36 -86.61 gain 36 62 -81.67 gain 62 36 -76.05 gain 36 63 -74.19 gain 63 36 -72.53 gain 36 64 -82.20 gain 64 36 -84.76 gain 36 65 -77.49 gain 65 36 -75.60 gain 36 66 -67.32 gain 66 36 -64.42 gain 36 67 -77.07 gain 67 36 -75.40 gain 36 68 -82.24 gain 68 36 -83.16 gain 36 69 -78.39 gain 69 36 -76.52 gain 36 70 -89.10 gain 70 36 -85.69 gain 36 71 -90.70 gain 71 36 -90.87 gain 36 72 -91.70 gain 72 36 -89.42 gain 36 73 -81.03 gain 73 36 -80.12 gain 36 74 -94.70 gain 74 36 -89.91 gain 36 75 -90.70 gain 75 36 -91.79 gain 36 76 -83.57 gain 76 36 -84.79 gain 36 77 -82.91 gain 77 36 -80.13 gain 36 78 -81.49 gain 78 36 -83.21 gain 36 79 -81.48 gain 79 36 -82.82 gain 36 80 -87.26 gain 80 36 -86.39 gain 36 81 -81.86 gain 81 36 -81.90 gain 36 82 -83.13 gain 82 36 -84.15 gain 36 83 -73.67 gain 83 36 -71.96 gain 36 84 -83.37 gain 84 36 -78.85 gain 36 85 -81.13 gain 85 36 -82.04 gain 36 86 -88.64 gain 86 36 -91.18 gain 36 87 -84.61 gain 87 36 -84.45 gain 36 88 -91.56 gain 88 36 -91.03 gain 36 89 -86.49 gain 89 36 -88.10 gain 36 90 -92.64 gain 90 36 -93.60 gain 36 91 -86.15 gain 91 36 -88.18 gain 36 92 -86.93 gain 92 36 -89.88 gain 36 93 -96.62 gain 93 36 -96.93 gain 36 94 -85.31 gain 94 36 -84.18 gain 36 95 -83.20 gain 95 36 -81.31 gain 36 96 -79.00 gain 96 36 -84.08 gain 36 97 -75.49 gain 97 36 -73.39 gain 36 98 -79.68 gain 98 36 -78.05 gain 36 99 -94.09 gain 99 36 -91.60 gain 36 100 -81.90 gain 100 36 -79.32 gain 36 101 -87.87 gain 101 36 -88.93 gain 36 102 -85.90 gain 102 36 -86.92 gain 36 103 -96.19 gain 103 36 -98.38 gain 36 104 -91.12 gain 104 36 -95.80 gain 36 105 -84.92 gain 105 36 -84.11 gain 36 106 -85.21 gain 106 36 -81.73 gain 36 107 -91.53 gain 107 36 -87.96 gain 36 108 -86.92 gain 108 36 -82.97 gain 36 109 -89.58 gain 109 36 -89.08 gain 36 110 -88.26 gain 110 36 -94.12 gain 36 111 -90.30 gain 111 36 -86.13 gain 36 112 -93.08 gain 112 36 -92.37 gain 36 113 -85.92 gain 113 36 -84.34 gain 36 114 -89.41 gain 114 36 -85.00 gain 36 115 -85.62 gain 115 36 -81.87 gain 36 116 -93.07 gain 116 36 -91.75 gain 36 117 -96.71 gain 117 36 -92.53 gain 36 118 -92.21 gain 118 36 -89.65 gain 36 119 -95.13 gain 119 36 -97.63 gain 36 120 -90.86 gain 120 36 -90.74 gain 36 121 -89.27 gain 121 36 -90.18 gain 36 122 -98.19 gain 122 36 -98.85 gain 36 123 -94.19 gain 123 36 -95.19 gain 36 124 -88.01 gain 124 36 -87.00 gain 36 125 -95.22 gain 125 36 -97.55 gain 36 126 -80.49 gain 126 36 -79.46 gain 36 127 -83.74 gain 127 36 -82.34 gain 36 128 -90.44 gain 128 36 -91.63 gain 36 129 -96.86 gain 129 36 -95.26 gain 36 130 -95.79 gain 130 36 -95.48 gain 36 131 -93.40 gain 131 36 -92.87 gain 36 132 -94.22 gain 132 36 -89.70 gain 36 133 -97.62 gain 133 36 -98.27 gain 36 134 -98.15 gain 134 36 -95.66 gain 36 135 -94.90 gain 135 36 -94.72 gain 36 136 -91.01 gain 136 36 -91.27 gain 36 137 -93.04 gain 137 36 -96.21 gain 36 138 -97.06 gain 138 36 -93.76 gain 36 139 -90.38 gain 139 36 -90.35 gain 36 140 -88.69 gain 140 36 -89.49 gain 36 141 -86.95 gain 141 36 -79.72 gain 36 142 -97.38 gain 142 36 -96.89 gain 36 143 -87.22 gain 143 36 -89.47 gain 36 144 -95.79 gain 144 36 -96.40 gain 36 145 -98.19 gain 145 36 -102.19 gain 36 146 -90.31 gain 146 36 -90.30 gain 36 147 -94.41 gain 147 36 -91.51 gain 36 148 -98.48 gain 148 36 -93.90 gain 36 149 -106.01 gain 149 36 -105.09 gain 36 150 -96.63 gain 150 36 -96.55 gain 36 151 -86.69 gain 151 36 -85.55 gain 36 152 -85.79 gain 152 36 -84.46 gain 36 153 -92.67 gain 153 36 -90.56 gain 36 154 -89.92 gain 154 36 -89.71 gain 36 155 -90.26 gain 155 36 -88.62 gain 36 156 -89.91 gain 156 36 -87.51 gain 36 157 -97.51 gain 157 36 -97.59 gain 36 158 -94.42 gain 158 36 -94.00 gain 36 159 -103.35 gain 159 36 -105.31 gain 36 160 -103.12 gain 160 36 -102.24 gain 36 161 -91.35 gain 161 36 -92.91 gain 36 162 -96.38 gain 162 36 -97.65 gain 36 163 -92.22 gain 163 36 -95.40 gain 36 164 -100.07 gain 164 36 -102.62 gain 36 165 -102.71 gain 165 36 -102.32 gain 36 166 -92.22 gain 166 36 -91.58 gain 36 167 -98.55 gain 167 36 -98.64 gain 36 168 -99.00 gain 168 36 -97.98 gain 36 169 -95.41 gain 169 36 -95.50 gain 36 170 -93.03 gain 170 36 -92.35 gain 36 171 -88.50 gain 171 36 -88.91 gain 36 172 -89.30 gain 172 36 -87.90 gain 36 173 -92.04 gain 173 36 -95.28 gain 36 174 -87.33 gain 174 36 -86.62 gain 36 175 -94.39 gain 175 36 -94.82 gain 36 176 -93.32 gain 176 36 -92.71 gain 36 177 -90.37 gain 177 36 -92.76 gain 36 178 -93.91 gain 178 36 -89.75 gain 36 179 -92.13 gain 179 36 -87.39 gain 36 180 -93.54 gain 180 36 -98.25 gain 36 181 -91.22 gain 181 36 -89.95 gain 36 182 -91.72 gain 182 36 -91.54 gain 36 183 -101.06 gain 183 36 -101.15 gain 36 184 -91.27 gain 184 36 -94.11 gain 36 185 -96.81 gain 185 36 -103.52 gain 36 186 -97.04 gain 186 36 -99.33 gain 36 187 -90.59 gain 187 36 -90.60 gain 36 188 -100.56 gain 188 36 -102.98 gain 36 189 -95.30 gain 189 36 -92.45 gain 36 190 -93.82 gain 190 36 -94.89 gain 36 191 -100.51 gain 191 36 -100.28 gain 36 192 -101.31 gain 192 36 -99.77 gain 36 193 -97.32 gain 193 36 -94.77 gain 36 194 -93.32 gain 194 36 -91.55 gain 36 195 -98.77 gain 195 36 -95.56 gain 36 196 -102.21 gain 196 36 -103.30 gain 36 197 -94.54 gain 197 36 -90.77 gain 36 198 -89.65 gain 198 36 -90.39 gain 36 199 -101.85 gain 199 36 -102.70 gain 36 200 -99.19 gain 200 36 -101.38 gain 36 201 -93.05 gain 201 36 -95.14 gain 36 202 -95.55 gain 202 36 -96.78 gain 36 203 -96.37 gain 203 36 -96.71 gain 36 204 -91.55 gain 204 36 -88.53 gain 36 205 -99.84 gain 205 36 -100.56 gain 36 206 -95.09 gain 206 36 -96.93 gain 36 207 -96.41 gain 207 36 -97.66 gain 36 208 -95.08 gain 208 36 -98.93 gain 36 209 -99.44 gain 209 36 -102.86 gain 36 210 -102.55 gain 210 36 -106.15 gain 36 211 -101.04 gain 211 36 -99.88 gain 36 212 -94.57 gain 212 36 -96.41 gain 36 213 -95.60 gain 213 36 -96.77 gain 36 214 -98.92 gain 214 36 -105.48 gain 36 215 -93.42 gain 215 36 -95.38 gain 36 216 -96.34 gain 216 36 -102.21 gain 36 217 -100.88 gain 217 36 -107.02 gain 36 218 -101.97 gain 218 36 -100.91 gain 36 219 -90.63 gain 219 36 -90.05 gain 36 220 -96.02 gain 220 36 -91.53 gain 36 221 -95.89 gain 221 36 -97.08 gain 36 222 -104.10 gain 222 36 -101.10 gain 36 223 -97.81 gain 223 36 -98.05 gain 36 224 -99.64 gain 224 36 -100.34 gain 37 38 -71.69 gain 38 37 -69.22 gain 37 39 -79.91 gain 39 37 -81.77 gain 37 40 -84.74 gain 40 37 -81.58 gain 37 41 -78.93 gain 41 37 -71.11 gain 37 42 -85.20 gain 42 37 -84.63 gain 37 43 -91.08 gain 43 37 -88.10 gain 37 44 -95.96 gain 44 37 -96.58 gain 37 45 -84.81 gain 45 37 -85.40 gain 37 46 -92.54 gain 46 37 -89.60 gain 37 47 -91.61 gain 47 37 -86.37 gain 37 48 -88.90 gain 48 37 -83.24 gain 37 49 -81.77 gain 49 37 -80.17 gain 37 50 -79.37 gain 50 37 -74.63 gain 37 51 -75.75 gain 51 37 -74.70 gain 37 52 -61.97 gain 52 37 -58.16 gain 37 53 -65.05 gain 53 37 -61.79 gain 37 54 -74.32 gain 54 37 -70.47 gain 37 55 -85.91 gain 55 37 -78.97 gain 37 56 -87.64 gain 56 37 -85.76 gain 37 57 -86.28 gain 57 37 -83.48 gain 37 58 -96.07 gain 58 37 -89.96 gain 37 59 -93.60 gain 59 37 -86.74 gain 37 60 -93.36 gain 60 37 -95.78 gain 37 61 -87.20 gain 61 37 -81.52 gain 37 62 -95.40 gain 62 37 -87.24 gain 37 63 -84.50 gain 63 37 -80.30 gain 37 64 -77.15 gain 64 37 -77.17 gain 37 65 -77.00 gain 65 37 -72.58 gain 37 66 -77.83 gain 66 37 -72.39 gain 37 67 -73.43 gain 67 37 -69.22 gain 37 68 -70.46 gain 68 37 -68.84 gain 37 69 -79.35 gain 69 37 -74.94 gain 37 70 -94.14 gain 70 37 -88.20 gain 37 71 -88.30 gain 71 37 -85.93 gain 37 72 -90.83 gain 72 37 -86.02 gain 37 73 -86.00 gain 73 37 -82.55 gain 37 74 -97.66 gain 74 37 -90.33 gain 37 75 -96.04 gain 75 37 -94.60 gain 37 76 -88.29 gain 76 37 -86.97 gain 37 77 -88.22 gain 77 37 -82.90 gain 37 78 -89.02 gain 78 37 -88.20 gain 37 79 -88.58 gain 79 37 -87.38 gain 37 80 -85.21 gain 80 37 -81.80 gain 37 81 -76.63 gain 81 37 -74.13 gain 37 82 -83.62 gain 82 37 -82.10 gain 37 83 -83.13 gain 83 37 -78.89 gain 37 84 -81.09 gain 84 37 -74.03 gain 37 85 -79.62 gain 85 37 -77.99 gain 37 86 -86.39 gain 86 37 -86.39 gain 37 87 -86.12 gain 87 37 -83.42 gain 37 88 -93.76 gain 88 37 -90.70 gain 37 89 -91.35 gain 89 37 -90.43 gain 37 90 -96.20 gain 90 37 -94.62 gain 37 91 -89.20 gain 91 37 -88.69 gain 37 92 -95.70 gain 92 37 -96.10 gain 37 93 -98.67 gain 93 37 -96.44 gain 37 94 -83.33 gain 94 37 -79.66 gain 37 95 -96.05 gain 95 37 -91.63 gain 37 96 -88.61 gain 96 37 -91.15 gain 37 97 -87.05 gain 97 37 -82.42 gain 37 98 -85.08 gain 98 37 -80.91 gain 37 99 -92.72 gain 99 37 -87.69 gain 37 100 -86.41 gain 100 37 -81.30 gain 37 101 -90.85 gain 101 37 -89.37 gain 37 102 -94.23 gain 102 37 -92.71 gain 37 103 -88.75 gain 103 37 -88.41 gain 37 104 -91.45 gain 104 37 -93.58 gain 37 105 -96.00 gain 105 37 -92.66 gain 37 106 -91.41 gain 106 37 -85.40 gain 37 107 -93.47 gain 107 37 -87.36 gain 37 108 -85.39 gain 108 37 -78.90 gain 37 109 -91.25 gain 109 37 -88.22 gain 37 110 -84.46 gain 110 37 -87.79 gain 37 111 -92.62 gain 111 37 -85.91 gain 37 112 -94.26 gain 112 37 -91.02 gain 37 113 -92.00 gain 113 37 -87.88 gain 37 114 -97.32 gain 114 37 -90.37 gain 37 115 -89.00 gain 115 37 -82.71 gain 37 116 -88.45 gain 116 37 -84.58 gain 37 117 -93.64 gain 117 37 -86.92 gain 37 118 -85.94 gain 118 37 -80.84 gain 37 119 -100.02 gain 119 37 -99.99 gain 37 120 -94.55 gain 120 37 -91.90 gain 37 121 -90.01 gain 121 37 -88.38 gain 37 122 -91.92 gain 122 37 -90.04 gain 37 123 -92.29 gain 123 37 -90.75 gain 37 124 -94.99 gain 124 37 -91.44 gain 37 125 -86.84 gain 125 37 -86.62 gain 37 126 -88.75 gain 126 37 -85.19 gain 37 127 -94.62 gain 127 37 -90.68 gain 37 128 -92.71 gain 128 37 -91.36 gain 37 129 -88.95 gain 129 37 -84.82 gain 37 130 -94.83 gain 130 37 -91.99 gain 37 131 -91.10 gain 131 37 -88.02 gain 37 132 -96.29 gain 132 37 -89.23 gain 37 133 -92.42 gain 133 37 -90.53 gain 37 134 -99.42 gain 134 37 -94.40 gain 37 135 -96.65 gain 135 37 -93.93 gain 37 136 -104.50 gain 136 37 -102.22 gain 37 137 -97.65 gain 137 37 -98.29 gain 37 138 -87.59 gain 138 37 -81.76 gain 37 139 -95.30 gain 139 37 -92.73 gain 37 140 -91.30 gain 140 37 -89.56 gain 37 141 -96.35 gain 141 37 -86.58 gain 37 142 -96.71 gain 142 37 -93.69 gain 37 143 -94.70 gain 143 37 -94.41 gain 37 144 -94.06 gain 144 37 -92.13 gain 37 145 -92.50 gain 145 37 -93.97 gain 37 146 -90.14 gain 146 37 -87.59 gain 37 147 -96.00 gain 147 37 -90.56 gain 37 148 -93.57 gain 148 37 -86.46 gain 37 149 -95.43 gain 149 37 -91.97 gain 37 150 -98.88 gain 150 37 -96.26 gain 37 151 -92.64 gain 151 37 -88.96 gain 37 152 -96.84 gain 152 37 -92.98 gain 37 153 -96.12 gain 153 37 -91.47 gain 37 154 -92.75 gain 154 37 -90.00 gain 37 155 -94.40 gain 155 37 -90.23 gain 37 156 -94.30 gain 156 37 -89.36 gain 37 157 -103.37 gain 157 37 -100.91 gain 37 158 -96.99 gain 158 37 -94.03 gain 37 159 -94.90 gain 159 37 -94.33 gain 37 160 -96.89 gain 160 37 -93.47 gain 37 161 -98.44 gain 161 37 -97.46 gain 37 162 -108.26 gain 162 37 -106.99 gain 37 163 -99.67 gain 163 37 -100.32 gain 37 164 -100.75 gain 164 37 -100.77 gain 37 165 -97.48 gain 165 37 -94.55 gain 37 166 -102.31 gain 166 37 -99.14 gain 37 167 -98.94 gain 167 37 -96.49 gain 37 168 -95.41 gain 168 37 -91.84 gain 37 169 -95.29 gain 169 37 -92.84 gain 37 170 -94.74 gain 170 37 -91.53 gain 37 171 -91.64 gain 171 37 -89.51 gain 37 172 -98.99 gain 172 37 -95.04 gain 37 173 -93.74 gain 173 37 -94.45 gain 37 174 -94.01 gain 174 37 -90.76 gain 37 175 -97.46 gain 175 37 -95.34 gain 37 176 -89.96 gain 176 37 -86.81 gain 37 177 -94.60 gain 177 37 -94.45 gain 37 178 -107.95 gain 178 37 -101.25 gain 37 179 -101.04 gain 179 37 -93.76 gain 37 180 -96.68 gain 180 37 -98.85 gain 37 181 -93.66 gain 181 37 -89.85 gain 37 182 -102.17 gain 182 37 -99.45 gain 37 183 -100.55 gain 183 37 -98.10 gain 37 184 -96.98 gain 184 37 -97.28 gain 37 185 -97.84 gain 185 37 -102.01 gain 37 186 -94.71 gain 186 37 -94.45 gain 37 187 -99.40 gain 187 37 -96.88 gain 37 188 -97.75 gain 188 37 -97.64 gain 37 189 -100.21 gain 189 37 -94.82 gain 37 190 -102.47 gain 190 37 -101.00 gain 37 191 -94.05 gain 191 37 -91.28 gain 37 192 -101.40 gain 192 37 -97.33 gain 37 193 -101.16 gain 193 37 -96.08 gain 37 194 -99.08 gain 194 37 -94.78 gain 37 195 -105.03 gain 195 37 -99.27 gain 37 196 -98.35 gain 196 37 -96.91 gain 37 197 -96.39 gain 197 37 -90.08 gain 37 198 -98.10 gain 198 37 -96.31 gain 37 199 -102.67 gain 199 37 -100.98 gain 37 200 -96.67 gain 200 37 -96.32 gain 37 201 -95.99 gain 201 37 -95.55 gain 37 202 -98.07 gain 202 37 -96.76 gain 37 203 -97.23 gain 203 37 -95.04 gain 37 204 -103.31 gain 204 37 -97.75 gain 37 205 -97.35 gain 205 37 -95.53 gain 37 206 -96.77 gain 206 37 -96.07 gain 37 207 -102.28 gain 207 37 -101.00 gain 37 208 -103.47 gain 208 37 -104.79 gain 37 209 -101.42 gain 209 37 -102.31 gain 37 210 -98.18 gain 210 37 -99.24 gain 37 211 -104.76 gain 211 37 -101.05 gain 37 212 -97.44 gain 212 37 -96.75 gain 37 213 -108.28 gain 213 37 -106.92 gain 37 214 -102.49 gain 214 37 -106.52 gain 37 215 -104.73 gain 215 37 -104.16 gain 37 216 -98.32 gain 216 37 -101.65 gain 37 217 -99.38 gain 217 37 -102.98 gain 37 218 -102.23 gain 218 37 -98.63 gain 37 219 -100.21 gain 219 37 -97.09 gain 37 220 -106.59 gain 220 37 -99.56 gain 37 221 -105.56 gain 221 37 -104.21 gain 37 222 -99.83 gain 222 37 -94.28 gain 37 223 -102.45 gain 223 37 -100.14 gain 37 224 -99.12 gain 224 37 -97.29 gain 38 39 -58.16 gain 39 38 -62.48 gain 38 40 -68.27 gain 40 38 -67.57 gain 38 41 -83.21 gain 41 38 -77.86 gain 38 42 -76.64 gain 42 38 -78.53 gain 38 43 -86.84 gain 43 38 -86.33 gain 38 44 -94.63 gain 44 38 -97.71 gain 38 45 -97.68 gain 45 38 -100.74 gain 38 46 -95.18 gain 46 38 -94.71 gain 38 47 -87.21 gain 47 38 -84.44 gain 38 48 -88.33 gain 48 38 -85.13 gain 38 49 -90.79 gain 49 38 -91.65 gain 38 50 -78.77 gain 50 38 -76.49 gain 38 51 -74.85 gain 51 38 -76.27 gain 38 52 -65.13 gain 52 38 -63.78 gain 38 53 -65.37 gain 53 38 -64.58 gain 38 54 -73.80 gain 54 38 -72.42 gain 38 55 -81.83 gain 55 38 -77.37 gain 38 56 -77.07 gain 56 38 -77.65 gain 38 57 -82.82 gain 57 38 -82.48 gain 38 58 -80.34 gain 58 38 -76.69 gain 38 59 -86.01 gain 59 38 -81.62 gain 38 60 -90.04 gain 60 38 -94.92 gain 38 61 -86.69 gain 61 38 -83.48 gain 38 62 -89.13 gain 62 38 -83.44 gain 38 63 -87.34 gain 63 38 -85.61 gain 38 64 -79.57 gain 64 38 -82.06 gain 38 65 -80.72 gain 65 38 -78.76 gain 38 66 -79.81 gain 66 38 -76.84 gain 38 67 -79.89 gain 67 38 -78.14 gain 38 68 -75.19 gain 68 38 -76.03 gain 38 69 -70.24 gain 69 38 -68.29 gain 38 70 -82.10 gain 70 38 -78.62 gain 38 71 -84.10 gain 71 38 -84.20 gain 38 72 -83.58 gain 72 38 -81.23 gain 38 73 -92.40 gain 73 38 -91.42 gain 38 74 -82.08 gain 74 38 -77.22 gain 38 75 -93.06 gain 75 38 -94.09 gain 38 76 -95.26 gain 76 38 -96.41 gain 38 77 -88.11 gain 77 38 -85.25 gain 38 78 -88.94 gain 78 38 -90.58 gain 38 79 -86.14 gain 79 38 -87.41 gain 38 80 -75.94 gain 80 38 -75.00 gain 38 81 -81.41 gain 81 38 -81.38 gain 38 82 -82.83 gain 82 38 -83.78 gain 38 83 -85.04 gain 83 38 -83.25 gain 38 84 -80.22 gain 84 38 -75.62 gain 38 85 -81.55 gain 85 38 -82.38 gain 38 86 -86.36 gain 86 38 -88.83 gain 38 87 -84.91 gain 87 38 -84.67 gain 38 88 -89.30 gain 88 38 -88.70 gain 38 89 -85.75 gain 89 38 -87.29 gain 38 90 -94.93 gain 90 38 -95.82 gain 38 91 -92.38 gain 91 38 -94.33 gain 38 92 -91.37 gain 92 38 -94.24 gain 38 93 -93.28 gain 93 38 -93.50 gain 38 94 -97.60 gain 94 38 -96.39 gain 38 95 -83.01 gain 95 38 -81.05 gain 38 96 -81.40 gain 96 38 -86.41 gain 38 97 -86.41 gain 97 38 -84.25 gain 38 98 -82.99 gain 98 38 -81.29 gain 38 99 -85.37 gain 99 38 -82.81 gain 38 100 -83.96 gain 100 38 -81.31 gain 38 101 -83.01 gain 101 38 -83.99 gain 38 102 -88.27 gain 102 38 -89.21 gain 38 103 -90.88 gain 103 38 -92.99 gain 38 104 -87.53 gain 104 38 -92.13 gain 38 105 -99.23 gain 105 38 -98.35 gain 38 106 -88.88 gain 106 38 -85.34 gain 38 107 -94.17 gain 107 38 -90.53 gain 38 108 -91.14 gain 108 38 -87.12 gain 38 109 -92.53 gain 109 38 -91.96 gain 38 110 -85.07 gain 110 38 -90.86 gain 38 111 -82.41 gain 111 38 -78.17 gain 38 112 -95.50 gain 112 38 -94.72 gain 38 113 -81.43 gain 113 38 -79.78 gain 38 114 -84.13 gain 114 38 -79.65 gain 38 115 -85.54 gain 115 38 -81.71 gain 38 116 -87.81 gain 116 38 -86.41 gain 38 117 -90.28 gain 117 38 -86.03 gain 38 118 -91.10 gain 118 38 -88.47 gain 38 119 -88.29 gain 119 38 -90.72 gain 38 120 -97.62 gain 120 38 -97.43 gain 38 121 -91.50 gain 121 38 -92.33 gain 38 122 -83.52 gain 122 38 -84.11 gain 38 123 -91.33 gain 123 38 -92.25 gain 38 124 -87.04 gain 124 38 -85.96 gain 38 125 -93.60 gain 125 38 -95.85 gain 38 126 -91.11 gain 126 38 -90.01 gain 38 127 -91.14 gain 127 38 -89.66 gain 38 128 -81.71 gain 128 38 -82.83 gain 38 129 -93.08 gain 129 38 -91.41 gain 38 130 -89.72 gain 130 38 -89.34 gain 38 131 -90.80 gain 131 38 -90.19 gain 38 132 -88.59 gain 132 38 -83.99 gain 38 133 -92.81 gain 133 38 -93.39 gain 38 134 -91.24 gain 134 38 -88.68 gain 38 135 -95.53 gain 135 38 -95.27 gain 38 136 -100.36 gain 136 38 -100.55 gain 38 137 -98.87 gain 137 38 -101.96 gain 38 138 -96.19 gain 138 38 -92.82 gain 38 139 -93.38 gain 139 38 -93.28 gain 38 140 -101.50 gain 140 38 -102.22 gain 38 141 -90.18 gain 141 38 -82.88 gain 38 142 -93.70 gain 142 38 -93.14 gain 38 143 -89.20 gain 143 38 -91.38 gain 38 144 -93.38 gain 144 38 -93.92 gain 38 145 -82.71 gain 145 38 -86.64 gain 38 146 -93.53 gain 146 38 -93.44 gain 38 147 -92.92 gain 147 38 -89.95 gain 38 148 -94.23 gain 148 38 -89.58 gain 38 149 -85.02 gain 149 38 -84.03 gain 38 150 -101.39 gain 150 38 -101.24 gain 38 151 -94.15 gain 151 38 -92.94 gain 38 152 -95.56 gain 152 38 -94.17 gain 38 153 -95.22 gain 153 38 -93.03 gain 38 154 -94.01 gain 154 38 -93.73 gain 38 155 -99.20 gain 155 38 -97.49 gain 38 156 -101.97 gain 156 38 -99.50 gain 38 157 -89.15 gain 157 38 -89.15 gain 38 158 -98.13 gain 158 38 -97.63 gain 38 159 -93.49 gain 159 38 -95.38 gain 38 160 -85.09 gain 160 38 -84.13 gain 38 161 -93.12 gain 161 38 -94.61 gain 38 162 -98.74 gain 162 38 -99.93 gain 38 163 -96.81 gain 163 38 -99.92 gain 38 164 -92.45 gain 164 38 -94.92 gain 38 165 -99.04 gain 165 38 -98.58 gain 38 166 -95.81 gain 166 38 -95.09 gain 38 167 -98.48 gain 167 38 -98.48 gain 38 168 -93.73 gain 168 38 -92.64 gain 38 169 -94.52 gain 169 38 -94.54 gain 38 170 -96.40 gain 170 38 -95.65 gain 38 171 -86.76 gain 171 38 -87.09 gain 38 172 -98.49 gain 172 38 -97.01 gain 38 173 -94.63 gain 173 38 -97.79 gain 38 174 -89.88 gain 174 38 -89.09 gain 38 175 -93.91 gain 175 38 -94.26 gain 38 176 -96.57 gain 176 38 -95.89 gain 38 177 -92.91 gain 177 38 -95.23 gain 38 178 -100.59 gain 178 38 -96.36 gain 38 179 -102.79 gain 179 38 -97.97 gain 38 180 -97.61 gain 180 38 -102.25 gain 38 181 -95.77 gain 181 38 -94.43 gain 38 182 -100.41 gain 182 38 -100.16 gain 38 183 -97.16 gain 183 38 -97.18 gain 38 184 -95.44 gain 184 38 -98.20 gain 38 185 -90.31 gain 185 38 -96.94 gain 38 186 -93.37 gain 186 38 -95.58 gain 38 187 -93.25 gain 187 38 -93.19 gain 38 188 -99.41 gain 188 38 -101.76 gain 38 189 -93.34 gain 189 38 -90.42 gain 38 190 -93.37 gain 190 38 -94.36 gain 38 191 -101.28 gain 191 38 -100.98 gain 38 192 -101.34 gain 192 38 -99.74 gain 38 193 -96.18 gain 193 38 -93.56 gain 38 194 -99.11 gain 194 38 -97.27 gain 38 195 -92.96 gain 195 38 -89.67 gain 38 196 -93.57 gain 196 38 -94.59 gain 38 197 -90.26 gain 197 38 -86.42 gain 38 198 -98.51 gain 198 38 -99.18 gain 38 199 -92.73 gain 199 38 -93.51 gain 38 200 -101.98 gain 200 38 -104.09 gain 38 201 -100.54 gain 201 38 -102.56 gain 38 202 -100.55 gain 202 38 -101.71 gain 38 203 -99.90 gain 203 38 -100.17 gain 38 204 -92.13 gain 204 38 -89.04 gain 38 205 -102.19 gain 205 38 -102.84 gain 38 206 -94.10 gain 206 38 -95.86 gain 38 207 -94.75 gain 207 38 -95.93 gain 38 208 -101.17 gain 208 38 -104.95 gain 38 209 -92.65 gain 209 38 -96.00 gain 38 210 -102.66 gain 210 38 -106.18 gain 38 211 -103.28 gain 211 38 -102.03 gain 38 212 -102.88 gain 212 38 -104.65 gain 38 213 -95.79 gain 213 38 -96.89 gain 38 214 -102.17 gain 214 38 -108.66 gain 38 215 -104.51 gain 215 38 -106.39 gain 38 216 -90.74 gain 216 38 -96.53 gain 38 217 -102.63 gain 217 38 -108.69 gain 38 218 -102.17 gain 218 38 -101.03 gain 38 219 -93.82 gain 219 38 -93.16 gain 38 220 -103.09 gain 220 38 -98.53 gain 38 221 -104.16 gain 221 38 -105.28 gain 38 222 -98.43 gain 222 38 -95.35 gain 38 223 -96.97 gain 223 38 -97.13 gain 38 224 -95.63 gain 224 38 -96.26 gain 39 40 -69.82 gain 40 39 -64.80 gain 39 41 -70.90 gain 41 39 -61.22 gain 39 42 -85.74 gain 42 39 -83.31 gain 39 43 -87.60 gain 43 39 -82.76 gain 39 44 -89.80 gain 44 39 -88.56 gain 39 45 -96.35 gain 45 39 -95.09 gain 39 46 -95.07 gain 46 39 -90.27 gain 39 47 -99.49 gain 47 39 -92.40 gain 39 48 -90.45 gain 48 39 -82.93 gain 39 49 -90.70 gain 49 39 -87.24 gain 39 50 -91.37 gain 50 39 -84.77 gain 39 51 -81.58 gain 51 39 -78.68 gain 39 52 -81.28 gain 52 39 -75.61 gain 39 53 -71.00 gain 53 39 -65.88 gain 39 54 -68.84 gain 54 39 -63.13 gain 39 55 -76.09 gain 55 39 -67.30 gain 39 56 -84.23 gain 56 39 -80.49 gain 39 57 -83.22 gain 57 39 -78.56 gain 39 58 -88.18 gain 58 39 -80.21 gain 39 59 -90.98 gain 59 39 -82.27 gain 39 60 -97.50 gain 60 39 -98.07 gain 39 61 -97.77 gain 61 39 -90.24 gain 39 62 -97.82 gain 62 39 -87.80 gain 39 63 -101.19 gain 63 39 -95.14 gain 39 64 -92.88 gain 64 39 -91.05 gain 39 65 -89.42 gain 65 39 -83.14 gain 39 66 -87.17 gain 66 39 -79.87 gain 39 67 -85.61 gain 67 39 -79.54 gain 39 68 -75.97 gain 68 39 -72.49 gain 39 69 -80.61 gain 69 39 -74.34 gain 39 70 -82.47 gain 70 39 -74.67 gain 39 71 -85.22 gain 71 39 -80.99 gain 39 72 -85.33 gain 72 39 -78.66 gain 39 73 -91.06 gain 73 39 -85.76 gain 39 74 -90.79 gain 74 39 -81.61 gain 39 75 -102.57 gain 75 39 -99.27 gain 39 76 -96.06 gain 76 39 -92.89 gain 39 77 -98.72 gain 77 39 -91.54 gain 39 78 -96.50 gain 78 39 -93.83 gain 39 79 -93.51 gain 79 39 -90.46 gain 39 80 -88.86 gain 80 39 -83.60 gain 39 81 -92.49 gain 81 39 -88.14 gain 39 82 -88.72 gain 82 39 -85.34 gain 39 83 -78.97 gain 83 39 -72.86 gain 39 84 -85.35 gain 84 39 -76.43 gain 39 85 -85.52 gain 85 39 -82.03 gain 39 86 -83.78 gain 86 39 -81.93 gain 39 87 -85.63 gain 87 39 -81.07 gain 39 88 -93.98 gain 88 39 -89.06 gain 39 89 -89.64 gain 89 39 -86.86 gain 39 90 -103.38 gain 90 39 -99.94 gain 39 91 -99.99 gain 91 39 -97.62 gain 39 92 -103.60 gain 92 39 -102.15 gain 39 93 -95.65 gain 93 39 -91.56 gain 39 94 -95.69 gain 94 39 -90.17 gain 39 95 -93.03 gain 95 39 -86.74 gain 39 96 -91.43 gain 96 39 -92.12 gain 39 97 -87.38 gain 97 39 -80.89 gain 39 98 -89.64 gain 98 39 -83.62 gain 39 99 -86.25 gain 99 39 -79.36 gain 39 100 -83.73 gain 100 39 -76.76 gain 39 101 -94.21 gain 101 39 -90.88 gain 39 102 -85.14 gain 102 39 -81.77 gain 39 103 -90.90 gain 103 39 -88.69 gain 39 104 -93.07 gain 104 39 -93.35 gain 39 105 -100.91 gain 105 39 -95.72 gain 39 106 -99.56 gain 106 39 -91.69 gain 39 107 -97.30 gain 107 39 -89.34 gain 39 108 -106.23 gain 108 39 -97.89 gain 39 109 -97.19 gain 109 39 -92.29 gain 39 110 -98.60 gain 110 39 -100.06 gain 39 111 -90.32 gain 111 39 -81.75 gain 39 112 -95.63 gain 112 39 -90.53 gain 39 113 -94.20 gain 113 39 -88.23 gain 39 114 -95.87 gain 114 39 -87.07 gain 39 115 -87.61 gain 115 39 -79.46 gain 39 116 -93.02 gain 116 39 -87.30 gain 39 117 -92.57 gain 117 39 -83.99 gain 39 118 -93.25 gain 118 39 -86.29 gain 39 119 -93.75 gain 119 39 -91.85 gain 39 120 -97.62 gain 120 39 -93.11 gain 39 121 -105.83 gain 121 39 -102.35 gain 39 122 -96.75 gain 122 39 -93.01 gain 39 123 -110.06 gain 123 39 -106.66 gain 39 124 -97.49 gain 124 39 -92.08 gain 39 125 -90.09 gain 125 39 -88.01 gain 39 126 -96.92 gain 126 39 -91.50 gain 39 127 -83.98 gain 127 39 -78.18 gain 39 128 -97.19 gain 128 39 -93.99 gain 39 129 -88.27 gain 129 39 -82.28 gain 39 130 -92.12 gain 130 39 -87.42 gain 39 131 -86.69 gain 131 39 -81.76 gain 39 132 -91.33 gain 132 39 -82.42 gain 39 133 -91.84 gain 133 39 -88.10 gain 39 134 -95.33 gain 134 39 -88.45 gain 39 135 -102.43 gain 135 39 -97.85 gain 39 136 -94.18 gain 136 39 -90.05 gain 39 137 -93.31 gain 137 39 -92.09 gain 39 138 -101.14 gain 138 39 -93.45 gain 39 139 -95.93 gain 139 39 -91.50 gain 39 140 -96.80 gain 140 39 -93.20 gain 39 141 -94.03 gain 141 39 -82.40 gain 39 142 -88.23 gain 142 39 -83.34 gain 39 143 -94.27 gain 143 39 -92.12 gain 39 144 -101.30 gain 144 39 -97.52 gain 39 145 -92.32 gain 145 39 -91.93 gain 39 146 -85.14 gain 146 39 -80.74 gain 39 147 -102.29 gain 147 39 -94.99 gain 39 148 -93.66 gain 148 39 -84.69 gain 39 149 -91.80 gain 149 39 -86.49 gain 39 150 -104.51 gain 150 39 -100.04 gain 39 151 -106.46 gain 151 39 -100.92 gain 39 152 -99.67 gain 152 39 -93.95 gain 39 153 -95.06 gain 153 39 -88.56 gain 39 154 -104.80 gain 154 39 -100.20 gain 39 155 -102.69 gain 155 39 -96.66 gain 39 156 -96.52 gain 156 39 -89.72 gain 39 157 -98.16 gain 157 39 -93.85 gain 39 158 -94.78 gain 158 39 -89.97 gain 39 159 -98.97 gain 159 39 -96.54 gain 39 160 -95.86 gain 160 39 -90.58 gain 39 161 -104.14 gain 161 39 -101.30 gain 39 162 -98.53 gain 162 39 -95.40 gain 39 163 -96.72 gain 163 39 -95.50 gain 39 164 -99.85 gain 164 39 -98.01 gain 39 165 -102.17 gain 165 39 -97.38 gain 39 166 -103.20 gain 166 39 -98.17 gain 39 167 -101.22 gain 167 39 -96.91 gain 39 168 -94.71 gain 168 39 -89.29 gain 39 169 -104.81 gain 169 39 -100.51 gain 39 170 -98.81 gain 170 39 -93.74 gain 39 171 -100.30 gain 171 39 -96.31 gain 39 172 -86.34 gain 172 39 -80.54 gain 39 173 -102.05 gain 173 39 -100.90 gain 39 174 -94.52 gain 174 39 -89.41 gain 39 175 -96.63 gain 175 39 -92.66 gain 39 176 -102.85 gain 176 39 -97.85 gain 39 177 -100.07 gain 177 39 -98.07 gain 39 178 -101.44 gain 178 39 -92.88 gain 39 179 -93.41 gain 179 39 -84.28 gain 39 180 -99.10 gain 180 39 -99.42 gain 39 181 -104.45 gain 181 39 -98.79 gain 39 182 -97.83 gain 182 39 -93.25 gain 39 183 -107.96 gain 183 39 -103.65 gain 39 184 -103.42 gain 184 39 -101.87 gain 39 185 -95.15 gain 185 39 -97.46 gain 39 186 -104.87 gain 186 39 -102.76 gain 39 187 -107.21 gain 187 39 -102.83 gain 39 188 -99.39 gain 188 39 -97.42 gain 39 189 -102.05 gain 189 39 -94.81 gain 39 190 -101.02 gain 190 39 -97.69 gain 39 191 -101.49 gain 191 39 -96.87 gain 39 192 -101.35 gain 192 39 -95.42 gain 39 193 -95.99 gain 193 39 -89.05 gain 39 194 -100.67 gain 194 39 -94.52 gain 39 195 -98.89 gain 195 39 -91.27 gain 39 196 -107.36 gain 196 39 -104.06 gain 39 197 -103.33 gain 197 39 -95.16 gain 39 198 -105.07 gain 198 39 -101.42 gain 39 199 -104.30 gain 199 39 -100.76 gain 39 200 -102.05 gain 200 39 -99.84 gain 39 201 -109.42 gain 201 39 -107.11 gain 39 202 -96.66 gain 202 39 -93.49 gain 39 203 -98.86 gain 203 39 -94.81 gain 39 204 -104.31 gain 204 39 -96.90 gain 39 205 -107.28 gain 205 39 -103.61 gain 39 206 -97.17 gain 206 39 -94.61 gain 39 207 -92.46 gain 207 39 -89.32 gain 39 208 -97.01 gain 208 39 -96.47 gain 39 209 -105.84 gain 209 39 -104.87 gain 39 210 -115.09 gain 210 39 -114.30 gain 39 211 -110.46 gain 211 39 -104.90 gain 39 212 -104.92 gain 212 39 -102.37 gain 39 213 -99.39 gain 213 39 -96.17 gain 39 214 -96.11 gain 214 39 -98.27 gain 39 215 -107.80 gain 215 39 -105.37 gain 39 216 -101.78 gain 216 39 -103.26 gain 39 217 -105.12 gain 217 39 -106.86 gain 39 218 -98.40 gain 218 39 -92.95 gain 39 219 -103.39 gain 219 39 -98.42 gain 39 220 -98.65 gain 220 39 -89.76 gain 39 221 -100.35 gain 221 39 -97.15 gain 39 222 -99.46 gain 222 39 -92.06 gain 39 223 -103.57 gain 223 39 -99.41 gain 39 224 -102.23 gain 224 39 -98.54 gain 40 41 -71.45 gain 41 40 -66.79 gain 40 42 -73.93 gain 42 40 -76.53 gain 40 43 -78.40 gain 43 40 -78.59 gain 40 44 -78.03 gain 44 40 -81.81 gain 40 45 -97.71 gain 45 40 -101.47 gain 40 46 -96.59 gain 46 40 -96.81 gain 40 47 -89.86 gain 47 40 -87.78 gain 40 48 -97.68 gain 48 40 -95.19 gain 40 49 -94.28 gain 49 40 -95.84 gain 40 50 -85.82 gain 50 40 -84.24 gain 40 51 -84.25 gain 51 40 -86.36 gain 40 52 -84.66 gain 52 40 -84.01 gain 40 53 -80.47 gain 53 40 -80.38 gain 40 54 -62.98 gain 54 40 -62.30 gain 40 55 -68.86 gain 55 40 -65.10 gain 40 56 -72.24 gain 56 40 -73.52 gain 40 57 -80.99 gain 57 40 -81.35 gain 40 58 -78.66 gain 58 40 -75.71 gain 40 59 -84.64 gain 59 40 -80.95 gain 40 60 -96.14 gain 60 40 -101.73 gain 40 61 -100.65 gain 61 40 -98.14 gain 40 62 -89.03 gain 62 40 -84.03 gain 40 63 -94.76 gain 63 40 -93.72 gain 40 64 -86.73 gain 64 40 -89.92 gain 40 65 -91.64 gain 65 40 -90.38 gain 40 66 -84.47 gain 66 40 -82.20 gain 40 67 -84.18 gain 67 40 -83.13 gain 40 68 -72.84 gain 68 40 -74.38 gain 40 69 -74.00 gain 69 40 -72.75 gain 40 70 -68.49 gain 70 40 -65.72 gain 40 71 -71.34 gain 71 40 -72.14 gain 40 72 -78.87 gain 72 40 -77.22 gain 40 73 -79.46 gain 73 40 -79.18 gain 40 74 -82.68 gain 74 40 -78.51 gain 40 75 -98.36 gain 75 40 -100.08 gain 40 76 -97.18 gain 76 40 -99.02 gain 40 77 -96.45 gain 77 40 -94.29 gain 40 78 -97.85 gain 78 40 -100.19 gain 40 79 -98.07 gain 79 40 -100.03 gain 40 80 -86.20 gain 80 40 -85.95 gain 40 81 -85.89 gain 81 40 -86.56 gain 40 82 -78.01 gain 82 40 -79.65 gain 40 83 -77.87 gain 83 40 -76.79 gain 40 84 -79.64 gain 84 40 -75.75 gain 40 85 -78.62 gain 85 40 -80.15 gain 40 86 -83.44 gain 86 40 -86.61 gain 40 87 -81.03 gain 87 40 -81.49 gain 40 88 -85.09 gain 88 40 -85.19 gain 40 89 -83.87 gain 89 40 -86.11 gain 40 90 -101.07 gain 90 40 -102.66 gain 40 91 -96.57 gain 91 40 -99.22 gain 40 92 -93.42 gain 92 40 -96.99 gain 40 93 -94.51 gain 93 40 -95.44 gain 40 94 -89.86 gain 94 40 -89.36 gain 40 95 -83.69 gain 95 40 -82.43 gain 40 96 -84.57 gain 96 40 -90.28 gain 40 97 -84.96 gain 97 40 -83.49 gain 40 98 -89.95 gain 98 40 -88.95 gain 40 99 -87.94 gain 99 40 -86.08 gain 40 100 -73.58 gain 100 40 -71.63 gain 40 101 -85.97 gain 101 40 -87.65 gain 40 102 -81.94 gain 102 40 -83.59 gain 40 103 -78.89 gain 103 40 -81.71 gain 40 104 -91.19 gain 104 40 -96.49 gain 40 105 -96.59 gain 105 40 -96.41 gain 40 106 -96.63 gain 106 40 -93.78 gain 40 107 -94.86 gain 107 40 -91.92 gain 40 108 -97.99 gain 108 40 -94.67 gain 40 109 -94.01 gain 109 40 -94.14 gain 40 110 -93.38 gain 110 40 -99.87 gain 40 111 -94.26 gain 111 40 -90.72 gain 40 112 -92.44 gain 112 40 -92.36 gain 40 113 -85.42 gain 113 40 -84.46 gain 40 114 -91.35 gain 114 40 -87.57 gain 40 115 -89.50 gain 115 40 -86.37 gain 40 116 -80.98 gain 116 40 -80.29 gain 40 117 -84.78 gain 117 40 -81.22 gain 40 118 -81.82 gain 118 40 -79.89 gain 40 119 -92.18 gain 119 40 -95.31 gain 40 120 -103.55 gain 120 40 -104.06 gain 40 121 -98.72 gain 121 40 -100.26 gain 40 122 -93.99 gain 122 40 -95.27 gain 40 123 -92.61 gain 123 40 -94.23 gain 40 124 -94.70 gain 124 40 -94.32 gain 40 125 -90.86 gain 125 40 -93.81 gain 40 126 -83.72 gain 126 40 -83.32 gain 40 127 -88.02 gain 127 40 -87.25 gain 40 128 -89.88 gain 128 40 -91.70 gain 40 129 -89.13 gain 129 40 -88.16 gain 40 130 -84.90 gain 130 40 -85.22 gain 40 131 -83.03 gain 131 40 -83.12 gain 40 132 -91.99 gain 132 40 -88.09 gain 40 133 -89.66 gain 133 40 -90.94 gain 40 134 -93.61 gain 134 40 -91.76 gain 40 135 -97.54 gain 135 40 -97.99 gain 40 136 -94.90 gain 136 40 -95.78 gain 40 137 -94.65 gain 137 40 -98.45 gain 40 138 -94.95 gain 138 40 -92.28 gain 40 139 -94.82 gain 139 40 -95.42 gain 40 140 -91.92 gain 140 40 -93.34 gain 40 141 -96.44 gain 141 40 -89.84 gain 40 142 -93.37 gain 142 40 -93.51 gain 40 143 -95.65 gain 143 40 -98.52 gain 40 144 -92.51 gain 144 40 -93.75 gain 40 145 -85.49 gain 145 40 -90.12 gain 40 146 -87.23 gain 146 40 -87.85 gain 40 147 -87.34 gain 147 40 -85.07 gain 40 148 -90.79 gain 148 40 -86.85 gain 40 149 -88.05 gain 149 40 -87.77 gain 40 150 -96.93 gain 150 40 -97.48 gain 40 151 -92.14 gain 151 40 -91.62 gain 40 152 -98.67 gain 152 40 -97.97 gain 40 153 -92.74 gain 153 40 -91.26 gain 40 154 -98.16 gain 154 40 -98.58 gain 40 155 -93.38 gain 155 40 -92.37 gain 40 156 -102.01 gain 156 40 -100.24 gain 40 157 -88.05 gain 157 40 -88.75 gain 40 158 -84.61 gain 158 40 -84.81 gain 40 159 -95.98 gain 159 40 -98.57 gain 40 160 -86.29 gain 160 40 -86.03 gain 40 161 -95.40 gain 161 40 -97.58 gain 40 162 -93.47 gain 162 40 -95.36 gain 40 163 -89.92 gain 163 40 -93.73 gain 40 164 -90.70 gain 164 40 -93.87 gain 40 165 -98.37 gain 165 40 -98.61 gain 40 166 -101.22 gain 166 40 -101.21 gain 40 167 -100.45 gain 167 40 -101.16 gain 40 168 -96.04 gain 168 40 -95.64 gain 40 169 -99.65 gain 169 40 -100.37 gain 40 170 -97.43 gain 170 40 -97.38 gain 40 171 -95.45 gain 171 40 -96.48 gain 40 172 -94.81 gain 172 40 -94.03 gain 40 173 -94.44 gain 173 40 -98.31 gain 40 174 -96.95 gain 174 40 -96.87 gain 40 175 -103.93 gain 175 40 -104.98 gain 40 176 -89.50 gain 176 40 -89.52 gain 40 177 -91.01 gain 177 40 -94.04 gain 40 178 -98.01 gain 178 40 -94.48 gain 40 179 -95.32 gain 179 40 -91.21 gain 40 180 -97.53 gain 180 40 -102.86 gain 40 181 -97.90 gain 181 40 -97.26 gain 40 182 -99.64 gain 182 40 -100.08 gain 40 183 -99.82 gain 183 40 -100.54 gain 40 184 -105.27 gain 184 40 -108.74 gain 40 185 -95.72 gain 185 40 -103.05 gain 40 186 -99.77 gain 186 40 -102.68 gain 40 187 -93.12 gain 187 40 -93.76 gain 40 188 -96.77 gain 188 40 -99.82 gain 40 189 -90.14 gain 189 40 -87.92 gain 40 190 -95.75 gain 190 40 -97.45 gain 40 191 -97.87 gain 191 40 -98.27 gain 40 192 -94.33 gain 192 40 -93.43 gain 40 193 -90.22 gain 193 40 -88.30 gain 40 194 -91.90 gain 194 40 -90.77 gain 40 195 -98.03 gain 195 40 -95.44 gain 40 196 -105.32 gain 196 40 -107.04 gain 40 197 -91.55 gain 197 40 -88.41 gain 40 198 -103.92 gain 198 40 -105.29 gain 40 199 -95.86 gain 199 40 -97.33 gain 40 200 -97.46 gain 200 40 -100.27 gain 40 201 -93.67 gain 201 40 -96.39 gain 40 202 -94.11 gain 202 40 -95.97 gain 40 203 -100.10 gain 203 40 -101.07 gain 40 204 -94.19 gain 204 40 -91.81 gain 40 205 -99.15 gain 205 40 -100.50 gain 40 206 -99.08 gain 206 40 -101.55 gain 40 207 -94.65 gain 207 40 -96.53 gain 40 208 -99.65 gain 208 40 -104.13 gain 40 209 -105.97 gain 209 40 -110.02 gain 40 210 -92.71 gain 210 40 -96.94 gain 40 211 -103.70 gain 211 40 -103.16 gain 40 212 -97.24 gain 212 40 -99.71 gain 40 213 -99.33 gain 213 40 -101.13 gain 40 214 -102.29 gain 214 40 -109.48 gain 40 215 -99.47 gain 215 40 -102.06 gain 40 216 -96.78 gain 216 40 -103.28 gain 40 217 -97.49 gain 217 40 -104.25 gain 40 218 -101.11 gain 218 40 -100.68 gain 40 219 -104.64 gain 219 40 -104.69 gain 40 220 -105.08 gain 220 40 -101.22 gain 40 221 -93.84 gain 221 40 -95.66 gain 40 222 -99.75 gain 222 40 -97.37 gain 40 223 -103.83 gain 223 40 -104.69 gain 40 224 -104.87 gain 224 40 -106.20 gain 41 42 -69.60 gain 42 41 -76.84 gain 41 43 -62.66 gain 43 41 -67.50 gain 41 44 -69.94 gain 44 41 -78.37 gain 41 45 -94.07 gain 45 41 -102.49 gain 41 46 -97.71 gain 46 41 -102.59 gain 41 47 -91.00 gain 47 41 -93.58 gain 41 48 -81.82 gain 48 41 -83.98 gain 41 49 -90.34 gain 49 41 -96.55 gain 41 50 -84.92 gain 50 41 -88.00 gain 41 51 -78.76 gain 51 41 -85.53 gain 41 52 -74.57 gain 52 41 -78.58 gain 41 53 -73.39 gain 53 41 -77.95 gain 41 54 -69.72 gain 54 41 -73.69 gain 41 55 -65.62 gain 55 41 -66.51 gain 41 56 -63.27 gain 56 41 -69.20 gain 41 57 -64.75 gain 57 41 -69.77 gain 41 58 -72.61 gain 58 41 -74.32 gain 41 59 -73.59 gain 59 41 -74.55 gain 41 60 -89.20 gain 60 41 -99.44 gain 41 61 -83.25 gain 61 41 -85.40 gain 41 62 -91.67 gain 62 41 -91.33 gain 41 63 -89.23 gain 63 41 -92.85 gain 41 64 -88.36 gain 64 41 -96.21 gain 41 65 -85.71 gain 65 41 -89.11 gain 41 66 -83.81 gain 66 41 -86.19 gain 41 67 -82.41 gain 67 41 -86.02 gain 41 68 -81.05 gain 68 41 -87.25 gain 41 69 -77.47 gain 69 41 -80.89 gain 41 70 -62.21 gain 70 41 -64.09 gain 41 71 -68.59 gain 71 41 -74.04 gain 41 72 -67.16 gain 72 41 -70.16 gain 41 73 -74.43 gain 73 41 -78.81 gain 41 74 -80.68 gain 74 41 -81.17 gain 41 75 -95.23 gain 75 41 -101.61 gain 41 76 -91.24 gain 76 41 -97.74 gain 41 77 -90.52 gain 77 41 -93.02 gain 41 78 -90.44 gain 78 41 -97.45 gain 41 79 -86.75 gain 79 41 -93.37 gain 41 80 -79.63 gain 80 41 -84.04 gain 41 81 -84.36 gain 81 41 -89.69 gain 41 82 -76.55 gain 82 41 -82.85 gain 41 83 -74.61 gain 83 41 -78.18 gain 41 84 -75.70 gain 84 41 -76.46 gain 41 85 -75.24 gain 85 41 -81.42 gain 41 86 -70.32 gain 86 41 -78.15 gain 41 87 -73.76 gain 87 41 -78.88 gain 41 88 -80.01 gain 88 41 -84.76 gain 41 89 -79.64 gain 89 41 -86.53 gain 41 90 -86.79 gain 90 41 -93.03 gain 41 91 -83.12 gain 91 41 -90.43 gain 41 92 -92.47 gain 92 41 -100.69 gain 41 93 -87.65 gain 93 41 -93.23 gain 41 94 -87.88 gain 94 41 -92.03 gain 41 95 -83.29 gain 95 41 -86.69 gain 41 96 -83.53 gain 96 41 -93.89 gain 41 97 -85.12 gain 97 41 -88.31 gain 41 98 -84.59 gain 98 41 -88.25 gain 41 99 -75.95 gain 99 41 -78.74 gain 41 100 -80.18 gain 100 41 -82.89 gain 41 101 -84.41 gain 101 41 -90.75 gain 41 102 -73.06 gain 102 41 -79.37 gain 41 103 -77.31 gain 103 41 -84.78 gain 41 104 -79.52 gain 104 41 -89.48 gain 41 105 -94.75 gain 105 41 -99.23 gain 41 106 -86.57 gain 106 41 -88.38 gain 41 107 -80.87 gain 107 41 -82.58 gain 41 108 -91.98 gain 108 41 -93.32 gain 41 109 -90.94 gain 109 41 -95.73 gain 41 110 -89.74 gain 110 41 -100.88 gain 41 111 -84.86 gain 111 41 -85.98 gain 41 112 -86.08 gain 112 41 -90.65 gain 41 113 -82.52 gain 113 41 -86.22 gain 41 114 -72.49 gain 114 41 -73.36 gain 41 115 -78.76 gain 115 41 -80.28 gain 41 116 -74.58 gain 116 41 -78.54 gain 41 117 -81.26 gain 117 41 -82.36 gain 41 118 -81.66 gain 118 41 -84.38 gain 41 119 -87.58 gain 119 41 -95.37 gain 41 120 -92.59 gain 120 41 -97.76 gain 41 121 -93.11 gain 121 41 -99.30 gain 41 122 -90.16 gain 122 41 -96.10 gain 41 123 -82.21 gain 123 41 -88.49 gain 41 124 -87.92 gain 124 41 -92.19 gain 41 125 -84.25 gain 125 41 -91.85 gain 41 126 -90.24 gain 126 41 -94.49 gain 41 127 -82.18 gain 127 41 -86.06 gain 41 128 -80.79 gain 128 41 -87.26 gain 41 129 -88.01 gain 129 41 -91.69 gain 41 130 -80.38 gain 130 41 -85.35 gain 41 131 -88.54 gain 131 41 -93.29 gain 41 132 -77.86 gain 132 41 -78.62 gain 41 133 -86.01 gain 133 41 -91.95 gain 41 134 -86.85 gain 134 41 -89.65 gain 41 135 -86.16 gain 135 41 -91.26 gain 41 136 -86.67 gain 136 41 -92.22 gain 41 137 -96.50 gain 137 41 -104.96 gain 41 138 -92.72 gain 138 41 -94.71 gain 41 139 -93.04 gain 139 41 -98.29 gain 41 140 -95.78 gain 140 41 -101.86 gain 41 141 -85.30 gain 141 41 -83.35 gain 41 142 -92.10 gain 142 41 -96.89 gain 41 143 -84.95 gain 143 41 -92.48 gain 41 144 -83.57 gain 144 41 -89.46 gain 41 145 -84.93 gain 145 41 -94.21 gain 41 146 -88.24 gain 146 41 -93.52 gain 41 147 -79.41 gain 147 41 -81.79 gain 41 148 -88.46 gain 148 41 -89.17 gain 41 149 -86.22 gain 149 41 -90.59 gain 41 150 -97.18 gain 150 41 -102.38 gain 41 151 -89.13 gain 151 41 -93.27 gain 41 152 -94.76 gain 152 41 -98.72 gain 41 153 -88.41 gain 153 41 -91.58 gain 41 154 -90.93 gain 154 41 -96.01 gain 41 155 -84.14 gain 155 41 -87.79 gain 41 156 -96.92 gain 156 41 -99.80 gain 41 157 -90.58 gain 157 41 -95.95 gain 41 158 -88.10 gain 158 41 -92.96 gain 41 159 -90.07 gain 159 41 -97.31 gain 41 160 -89.66 gain 160 41 -94.06 gain 41 161 -85.63 gain 161 41 -92.47 gain 41 162 -85.96 gain 162 41 -92.51 gain 41 163 -88.55 gain 163 41 -97.01 gain 41 164 -90.99 gain 164 41 -98.82 gain 41 165 -97.03 gain 165 41 -101.92 gain 41 166 -100.05 gain 166 41 -104.70 gain 41 167 -93.32 gain 167 41 -98.68 gain 41 168 -97.92 gain 168 41 -102.18 gain 41 169 -92.58 gain 169 41 -97.95 gain 41 170 -92.31 gain 170 41 -96.92 gain 41 171 -93.75 gain 171 41 -99.43 gain 41 172 -93.29 gain 172 41 -97.17 gain 41 173 -88.44 gain 173 41 -96.97 gain 41 174 -87.31 gain 174 41 -91.88 gain 41 175 -93.09 gain 175 41 -98.80 gain 41 176 -83.84 gain 176 41 -88.51 gain 41 177 -83.19 gain 177 41 -90.87 gain 41 178 -87.25 gain 178 41 -88.37 gain 41 179 -82.17 gain 179 41 -82.71 gain 41 180 -95.07 gain 180 41 -105.06 gain 41 181 -98.10 gain 181 41 -102.12 gain 41 182 -94.52 gain 182 41 -99.61 gain 41 183 -95.97 gain 183 41 -101.34 gain 41 184 -90.40 gain 184 41 -98.52 gain 41 185 -87.61 gain 185 41 -99.60 gain 41 186 -84.76 gain 186 41 -92.33 gain 41 187 -89.00 gain 187 41 -94.30 gain 41 188 -96.84 gain 188 41 -104.55 gain 41 189 -85.24 gain 189 41 -87.68 gain 41 190 -91.27 gain 190 41 -97.62 gain 41 191 -87.41 gain 191 41 -92.46 gain 41 192 -89.88 gain 192 41 -93.64 gain 41 193 -92.41 gain 193 41 -95.14 gain 41 194 -81.60 gain 194 41 -85.12 gain 41 195 -103.56 gain 195 41 -105.62 gain 41 196 -103.85 gain 196 41 -110.23 gain 41 197 -98.17 gain 197 41 -99.69 gain 41 198 -89.94 gain 198 41 -95.96 gain 41 199 -89.35 gain 199 41 -95.49 gain 41 200 -93.52 gain 200 41 -100.99 gain 41 201 -94.20 gain 201 41 -101.58 gain 41 202 -91.82 gain 202 41 -98.34 gain 41 203 -90.79 gain 203 41 -96.41 gain 41 204 -85.28 gain 204 41 -87.55 gain 41 205 -90.02 gain 205 41 -96.03 gain 41 206 -94.95 gain 206 41 -102.07 gain 41 207 -91.95 gain 207 41 -98.48 gain 41 208 -98.63 gain 208 41 -107.77 gain 41 209 -89.92 gain 209 41 -98.63 gain 41 210 -97.18 gain 210 41 -106.06 gain 41 211 -101.08 gain 211 41 -105.19 gain 41 212 -92.52 gain 212 41 -99.65 gain 41 213 -96.42 gain 213 41 -102.87 gain 41 214 -85.10 gain 214 41 -96.94 gain 41 215 -91.80 gain 215 41 -99.04 gain 41 216 -94.92 gain 216 41 -106.08 gain 41 217 -92.06 gain 217 41 -103.47 gain 41 218 -97.58 gain 218 41 -101.80 gain 41 219 -89.37 gain 219 41 -94.08 gain 41 220 -87.53 gain 220 41 -88.32 gain 41 221 -84.88 gain 221 41 -91.35 gain 41 222 -89.37 gain 222 41 -91.64 gain 41 223 -92.89 gain 223 41 -98.41 gain 41 224 -89.04 gain 224 41 -95.02 gain 42 43 -64.27 gain 43 42 -61.86 gain 42 44 -77.25 gain 44 42 -78.44 gain 42 45 -97.94 gain 45 42 -99.11 gain 42 46 -94.98 gain 46 42 -92.61 gain 42 47 -95.26 gain 47 42 -90.60 gain 42 48 -95.91 gain 48 42 -90.82 gain 42 49 -91.27 gain 49 42 -90.24 gain 42 50 -93.44 gain 50 42 -89.27 gain 42 51 -95.01 gain 51 42 -94.53 gain 42 52 -89.70 gain 52 42 -86.46 gain 42 53 -78.87 gain 53 42 -76.19 gain 42 54 -77.38 gain 54 42 -74.10 gain 42 55 -73.21 gain 55 42 -66.85 gain 42 56 -70.85 gain 56 42 -69.54 gain 42 57 -66.69 gain 57 42 -64.46 gain 42 58 -72.51 gain 58 42 -66.97 gain 42 59 -77.59 gain 59 42 -71.31 gain 42 60 -99.88 gain 60 42 -102.87 gain 42 61 -104.85 gain 61 42 -99.75 gain 42 62 -101.46 gain 62 42 -93.87 gain 42 63 -97.91 gain 63 42 -94.29 gain 42 64 -96.37 gain 64 42 -96.97 gain 42 65 -85.44 gain 65 42 -81.59 gain 42 66 -85.17 gain 66 42 -80.31 gain 42 67 -87.10 gain 67 42 -83.46 gain 42 68 -82.59 gain 68 42 -81.54 gain 42 69 -90.59 gain 69 42 -86.76 gain 42 70 -76.98 gain 70 42 -71.61 gain 42 71 -77.92 gain 71 42 -76.12 gain 42 72 -77.53 gain 72 42 -73.29 gain 42 73 -76.62 gain 73 42 -73.75 gain 42 74 -82.43 gain 74 42 -75.67 gain 42 75 -90.87 gain 75 42 -90.00 gain 42 76 -106.13 gain 76 42 -105.39 gain 42 77 -89.37 gain 77 42 -84.62 gain 42 78 -97.22 gain 78 42 -96.97 gain 42 79 -92.24 gain 79 42 -91.62 gain 42 80 -89.83 gain 80 42 -87.00 gain 42 81 -95.25 gain 81 42 -93.33 gain 42 82 -88.08 gain 82 42 -87.13 gain 42 83 -88.52 gain 83 42 -84.84 gain 42 84 -81.40 gain 84 42 -74.91 gain 42 85 -89.53 gain 85 42 -88.47 gain 42 86 -78.05 gain 86 42 -78.63 gain 42 87 -75.93 gain 87 42 -73.80 gain 42 88 -82.60 gain 88 42 -80.11 gain 42 89 -83.94 gain 89 42 -83.59 gain 42 90 -102.76 gain 90 42 -101.75 gain 42 91 -101.51 gain 91 42 -101.57 gain 42 92 -99.40 gain 92 42 -100.38 gain 42 93 -98.05 gain 93 42 -96.39 gain 42 94 -98.44 gain 94 42 -95.34 gain 42 95 -94.43 gain 95 42 -90.58 gain 42 96 -96.43 gain 96 42 -99.55 gain 42 97 -92.25 gain 97 42 -88.19 gain 42 98 -91.15 gain 98 42 -87.56 gain 42 99 -86.26 gain 99 42 -81.80 gain 42 100 -84.01 gain 100 42 -79.47 gain 42 101 -83.52 gain 101 42 -82.62 gain 42 102 -86.14 gain 102 42 -85.19 gain 42 103 -84.69 gain 103 42 -84.91 gain 42 104 -91.28 gain 104 42 -93.99 gain 42 105 -95.15 gain 105 42 -92.38 gain 42 106 -105.67 gain 106 42 -100.24 gain 42 107 -90.63 gain 107 42 -85.10 gain 42 108 -101.89 gain 108 42 -95.98 gain 42 109 -98.98 gain 109 42 -96.52 gain 42 110 -97.51 gain 110 42 -101.41 gain 42 111 -92.85 gain 111 42 -86.71 gain 42 112 -94.80 gain 112 42 -92.13 gain 42 113 -90.67 gain 113 42 -87.13 gain 42 114 -92.00 gain 114 42 -85.62 gain 42 115 -84.36 gain 115 42 -78.64 gain 42 116 -93.72 gain 116 42 -90.44 gain 42 117 -85.38 gain 117 42 -79.23 gain 42 118 -87.43 gain 118 42 -82.90 gain 42 119 -94.44 gain 119 42 -94.98 gain 42 120 -100.05 gain 120 42 -97.97 gain 42 121 -97.86 gain 121 42 -96.81 gain 42 122 -92.03 gain 122 42 -90.72 gain 42 123 -91.86 gain 123 42 -90.89 gain 42 124 -99.72 gain 124 42 -96.74 gain 42 125 -93.59 gain 125 42 -93.95 gain 42 126 -89.51 gain 126 42 -86.51 gain 42 127 -96.45 gain 127 42 -93.08 gain 42 128 -85.67 gain 128 42 -84.89 gain 42 129 -89.23 gain 129 42 -85.66 gain 42 130 -90.99 gain 130 42 -88.72 gain 42 131 -91.42 gain 131 42 -88.93 gain 42 132 -94.11 gain 132 42 -87.62 gain 42 133 -88.24 gain 133 42 -86.93 gain 42 134 -91.25 gain 134 42 -86.80 gain 42 135 -103.54 gain 135 42 -101.40 gain 42 136 -105.23 gain 136 42 -103.52 gain 42 137 -98.82 gain 137 42 -100.03 gain 42 138 -94.78 gain 138 42 -89.52 gain 42 139 -98.09 gain 139 42 -96.09 gain 42 140 -93.43 gain 140 42 -92.26 gain 42 141 -96.01 gain 141 42 -86.81 gain 42 142 -92.56 gain 142 42 -90.10 gain 42 143 -93.31 gain 143 42 -93.59 gain 42 144 -89.75 gain 144 42 -88.40 gain 42 145 -91.72 gain 145 42 -93.76 gain 42 146 -92.84 gain 146 42 -90.87 gain 42 147 -96.17 gain 147 42 -91.31 gain 42 148 -92.84 gain 148 42 -86.31 gain 42 149 -97.80 gain 149 42 -94.92 gain 42 150 -98.96 gain 150 42 -96.92 gain 42 151 -103.99 gain 151 42 -100.88 gain 42 152 -92.09 gain 152 42 -88.80 gain 42 153 -94.53 gain 153 42 -90.46 gain 42 154 -93.07 gain 154 42 -90.90 gain 42 155 -99.24 gain 155 42 -95.65 gain 42 156 -94.94 gain 156 42 -90.57 gain 42 157 -99.11 gain 157 42 -97.23 gain 42 158 -104.72 gain 158 42 -102.34 gain 42 159 -96.21 gain 159 42 -96.21 gain 42 160 -96.27 gain 160 42 -93.42 gain 42 161 -96.79 gain 161 42 -96.38 gain 42 162 -92.12 gain 162 42 -91.42 gain 42 163 -95.92 gain 163 42 -97.14 gain 42 164 -97.68 gain 164 42 -98.26 gain 42 165 -101.08 gain 165 42 -98.72 gain 42 166 -93.01 gain 166 42 -90.40 gain 42 167 -102.74 gain 167 42 -100.86 gain 42 168 -98.77 gain 168 42 -95.78 gain 42 169 -105.33 gain 169 42 -103.45 gain 42 170 -98.89 gain 170 42 -96.26 gain 42 171 -107.11 gain 171 42 -105.56 gain 42 172 -100.76 gain 172 42 -97.39 gain 42 173 -99.77 gain 173 42 -101.05 gain 42 174 -90.57 gain 174 42 -87.89 gain 42 175 -98.28 gain 175 42 -96.74 gain 42 176 -96.31 gain 176 42 -93.74 gain 42 177 -90.60 gain 177 42 -91.03 gain 42 178 -98.38 gain 178 42 -92.26 gain 42 179 -100.38 gain 179 42 -93.67 gain 42 180 -103.61 gain 180 42 -106.36 gain 42 181 -104.18 gain 181 42 -100.94 gain 42 182 -100.56 gain 182 42 -98.41 gain 42 183 -105.16 gain 183 42 -103.28 gain 42 184 -104.37 gain 184 42 -105.25 gain 42 185 -100.78 gain 185 42 -105.52 gain 42 186 -97.83 gain 186 42 -98.15 gain 42 187 -98.57 gain 187 42 -96.62 gain 42 188 -104.58 gain 188 42 -105.04 gain 42 189 -91.16 gain 189 42 -86.34 gain 42 190 -98.46 gain 190 42 -97.56 gain 42 191 -90.68 gain 191 42 -88.49 gain 42 192 -100.39 gain 192 42 -96.89 gain 42 193 -108.75 gain 193 42 -104.24 gain 42 194 -102.00 gain 194 42 -98.27 gain 42 195 -102.20 gain 195 42 -97.01 gain 42 196 -104.30 gain 196 42 -103.43 gain 42 197 -102.43 gain 197 42 -96.69 gain 42 198 -97.06 gain 198 42 -95.84 gain 42 199 -103.56 gain 199 42 -102.45 gain 42 200 -106.70 gain 200 42 -106.92 gain 42 201 -102.35 gain 201 42 -102.47 gain 42 202 -90.83 gain 202 42 -90.09 gain 42 203 -98.39 gain 203 42 -96.76 gain 42 204 -106.39 gain 204 42 -101.41 gain 42 205 -93.35 gain 205 42 -92.11 gain 42 206 -96.90 gain 206 42 -96.77 gain 42 207 -97.58 gain 207 42 -96.86 gain 42 208 -100.76 gain 208 42 -102.65 gain 42 209 -98.45 gain 209 42 -99.91 gain 42 210 -105.90 gain 210 42 -107.54 gain 42 211 -102.43 gain 211 42 -99.30 gain 42 212 -103.61 gain 212 42 -103.49 gain 42 213 -104.43 gain 213 42 -103.64 gain 42 214 -100.63 gain 214 42 -105.22 gain 42 215 -92.83 gain 215 42 -92.83 gain 42 216 -97.64 gain 216 42 -101.55 gain 42 217 -102.15 gain 217 42 -106.32 gain 42 218 -91.31 gain 218 42 -88.28 gain 42 219 -101.78 gain 219 42 -99.24 gain 42 220 -103.57 gain 220 42 -97.11 gain 42 221 -101.02 gain 221 42 -100.24 gain 42 222 -96.39 gain 222 42 -91.42 gain 42 223 -98.13 gain 223 42 -96.40 gain 42 224 -99.64 gain 224 42 -98.38 gain 43 44 -58.94 gain 44 43 -62.54 gain 43 45 -101.63 gain 45 43 -105.20 gain 43 46 -97.11 gain 46 43 -97.15 gain 43 47 -89.76 gain 47 43 -87.50 gain 43 48 -86.90 gain 48 43 -84.22 gain 43 49 -90.05 gain 49 43 -91.43 gain 43 50 -93.76 gain 50 43 -92.00 gain 43 51 -89.54 gain 51 43 -91.47 gain 43 52 -90.79 gain 52 43 -89.96 gain 43 53 -83.99 gain 53 43 -83.71 gain 43 54 -90.05 gain 54 43 -89.18 gain 43 55 -78.18 gain 55 43 -74.23 gain 43 56 -73.33 gain 56 43 -74.42 gain 43 57 -66.03 gain 57 43 -66.20 gain 43 58 -62.23 gain 58 43 -59.10 gain 43 59 -70.00 gain 59 43 -66.12 gain 43 60 -101.80 gain 60 43 -107.20 gain 43 61 -101.61 gain 61 43 -98.92 gain 43 62 -98.94 gain 62 43 -93.76 gain 43 63 -97.36 gain 63 43 -96.14 gain 43 64 -86.80 gain 64 43 -89.81 gain 43 65 -88.71 gain 65 43 -87.27 gain 43 66 -89.54 gain 66 43 -87.08 gain 43 67 -85.40 gain 67 43 -84.17 gain 43 68 -89.98 gain 68 43 -91.34 gain 43 69 -80.07 gain 69 43 -78.64 gain 43 70 -84.16 gain 70 43 -81.20 gain 43 71 -84.21 gain 71 43 -84.82 gain 43 72 -70.15 gain 72 43 -68.31 gain 43 73 -79.23 gain 73 43 -78.77 gain 43 74 -78.67 gain 74 43 -74.32 gain 43 75 -100.91 gain 75 43 -102.45 gain 43 76 -95.95 gain 76 43 -97.61 gain 43 77 -93.51 gain 77 43 -91.17 gain 43 78 -92.76 gain 78 43 -94.92 gain 43 79 -103.13 gain 79 43 -104.92 gain 43 80 -89.50 gain 80 43 -89.07 gain 43 81 -88.90 gain 81 43 -89.38 gain 43 82 -85.93 gain 82 43 -87.39 gain 43 83 -79.50 gain 83 43 -78.23 gain 43 84 -85.39 gain 84 43 -81.31 gain 43 85 -88.82 gain 85 43 -90.17 gain 43 86 -78.64 gain 86 43 -81.62 gain 43 87 -86.76 gain 87 43 -87.03 gain 43 88 -76.96 gain 88 43 -76.88 gain 43 89 -78.26 gain 89 43 -80.32 gain 43 90 -94.68 gain 90 43 -96.08 gain 43 91 -96.25 gain 91 43 -98.72 gain 43 92 -97.69 gain 92 43 -101.07 gain 43 93 -92.42 gain 93 43 -93.17 gain 43 94 -91.05 gain 94 43 -90.36 gain 43 95 -95.26 gain 95 43 -93.81 gain 43 96 -93.67 gain 96 43 -99.19 gain 43 97 -95.15 gain 97 43 -93.49 gain 43 98 -89.18 gain 98 43 -87.99 gain 43 99 -85.71 gain 99 43 -83.66 gain 43 100 -88.38 gain 100 43 -86.25 gain 43 101 -91.97 gain 101 43 -93.47 gain 43 102 -85.35 gain 102 43 -86.81 gain 43 103 -85.42 gain 103 43 -88.06 gain 43 104 -81.61 gain 104 43 -86.73 gain 43 105 -97.57 gain 105 43 -97.21 gain 43 106 -92.24 gain 106 43 -89.20 gain 43 107 -97.41 gain 107 43 -94.28 gain 43 108 -104.29 gain 108 43 -100.79 gain 43 109 -88.91 gain 109 43 -88.85 gain 43 110 -97.63 gain 110 43 -103.94 gain 43 111 -91.86 gain 111 43 -88.14 gain 43 112 -93.70 gain 112 43 -93.44 gain 43 113 -90.40 gain 113 43 -89.26 gain 43 114 -87.90 gain 114 43 -83.93 gain 43 115 -88.22 gain 115 43 -84.91 gain 43 116 -90.56 gain 116 43 -89.67 gain 43 117 -90.16 gain 117 43 -86.42 gain 43 118 -82.40 gain 118 43 -80.29 gain 43 119 -82.61 gain 119 43 -85.55 gain 43 120 -102.93 gain 120 43 -103.25 gain 43 121 -95.83 gain 121 43 -97.18 gain 43 122 -91.54 gain 122 43 -92.64 gain 43 123 -95.47 gain 123 43 -96.91 gain 43 124 -95.82 gain 124 43 -95.25 gain 43 125 -99.18 gain 125 43 -101.95 gain 43 126 -87.38 gain 126 43 -86.79 gain 43 127 -93.41 gain 127 43 -92.45 gain 43 128 -86.06 gain 128 43 -87.70 gain 43 129 -102.30 gain 129 43 -101.15 gain 43 130 -90.76 gain 130 43 -90.89 gain 43 131 -94.31 gain 131 43 -94.22 gain 43 132 -89.72 gain 132 43 -85.64 gain 43 133 -91.29 gain 133 43 -92.38 gain 43 134 -88.39 gain 134 43 -86.35 gain 43 135 -104.90 gain 135 43 -105.16 gain 43 136 -98.10 gain 136 43 -98.80 gain 43 137 -95.38 gain 137 43 -99.00 gain 43 138 -95.71 gain 138 43 -92.85 gain 43 139 -95.99 gain 139 43 -96.40 gain 43 140 -87.30 gain 140 43 -88.54 gain 43 141 -92.30 gain 141 43 -85.51 gain 43 142 -94.77 gain 142 43 -94.72 gain 43 143 -89.26 gain 143 43 -91.95 gain 43 144 -86.19 gain 144 43 -87.24 gain 43 145 -94.08 gain 145 43 -98.52 gain 43 146 -102.50 gain 146 43 -102.93 gain 43 147 -84.08 gain 147 43 -81.62 gain 43 148 -89.74 gain 148 43 -85.61 gain 43 149 -91.48 gain 149 43 -91.01 gain 43 150 -103.38 gain 150 43 -103.74 gain 43 151 -104.42 gain 151 43 -103.73 gain 43 152 -101.57 gain 152 43 -100.69 gain 43 153 -97.97 gain 153 43 -96.31 gain 43 154 -98.83 gain 154 43 -99.07 gain 43 155 -95.27 gain 155 43 -94.08 gain 43 156 -89.35 gain 156 43 -87.39 gain 43 157 -94.30 gain 157 43 -94.82 gain 43 158 -96.55 gain 158 43 -96.57 gain 43 159 -93.59 gain 159 43 -96.00 gain 43 160 -97.43 gain 160 43 -96.99 gain 43 161 -93.92 gain 161 43 -95.92 gain 43 162 -86.82 gain 162 43 -88.53 gain 43 163 -91.86 gain 163 43 -95.48 gain 43 164 -94.48 gain 164 43 -97.47 gain 43 165 -102.06 gain 165 43 -102.11 gain 43 166 -98.44 gain 166 43 -98.24 gain 43 167 -107.17 gain 167 43 -107.69 gain 43 168 -95.76 gain 168 43 -95.18 gain 43 169 -99.82 gain 169 43 -100.36 gain 43 170 -98.00 gain 170 43 -97.77 gain 43 171 -99.83 gain 171 43 -100.68 gain 43 172 -94.98 gain 172 43 -94.02 gain 43 173 -98.22 gain 173 43 -101.91 gain 43 174 -98.66 gain 174 43 -98.39 gain 43 175 -95.40 gain 175 43 -96.27 gain 43 176 -94.88 gain 176 43 -94.71 gain 43 177 -92.79 gain 177 43 -95.63 gain 43 178 -86.44 gain 178 43 -82.72 gain 43 179 -95.97 gain 179 43 -91.68 gain 43 180 -103.78 gain 180 43 -108.93 gain 43 181 -103.74 gain 181 43 -102.91 gain 43 182 -98.81 gain 182 43 -99.06 gain 43 183 -99.30 gain 183 43 -99.83 gain 43 184 -102.78 gain 184 43 -106.06 gain 43 185 -90.40 gain 185 43 -97.55 gain 43 186 -101.80 gain 186 43 -104.52 gain 43 187 -98.10 gain 187 43 -98.56 gain 43 188 -98.56 gain 188 43 -101.43 gain 43 189 -95.65 gain 189 43 -93.24 gain 43 190 -95.60 gain 190 43 -97.11 gain 43 191 -90.97 gain 191 43 -91.19 gain 43 192 -97.33 gain 192 43 -96.24 gain 43 193 -96.43 gain 193 43 -94.32 gain 43 194 -96.77 gain 194 43 -95.44 gain 43 195 -104.96 gain 195 43 -102.18 gain 43 196 -102.08 gain 196 43 -103.62 gain 43 197 -101.00 gain 197 43 -97.67 gain 43 198 -103.04 gain 198 43 -104.22 gain 43 199 -103.12 gain 199 43 -104.41 gain 43 200 -107.94 gain 200 43 -110.57 gain 43 201 -93.15 gain 201 43 -95.68 gain 43 202 -100.56 gain 202 43 -102.23 gain 43 203 -96.55 gain 203 43 -97.33 gain 43 204 -90.73 gain 204 43 -88.16 gain 43 205 -99.46 gain 205 43 -100.63 gain 43 206 -96.79 gain 206 43 -99.07 gain 43 207 -94.14 gain 207 43 -95.83 gain 43 208 -97.02 gain 208 43 -101.32 gain 43 209 -96.99 gain 209 43 -100.86 gain 43 210 -110.87 gain 210 43 -114.92 gain 43 211 -100.56 gain 211 43 -99.83 gain 43 212 -101.23 gain 212 43 -103.52 gain 43 213 -103.92 gain 213 43 -105.53 gain 43 214 -98.43 gain 214 43 -105.43 gain 43 215 -106.01 gain 215 43 -108.41 gain 43 216 -104.57 gain 216 43 -110.88 gain 43 217 -100.52 gain 217 43 -107.10 gain 43 218 -98.52 gain 218 43 -97.90 gain 43 219 -92.95 gain 219 43 -92.81 gain 43 220 -97.73 gain 220 43 -93.68 gain 43 221 -93.89 gain 221 43 -95.52 gain 43 222 -94.61 gain 222 43 -92.04 gain 43 223 -97.08 gain 223 43 -97.76 gain 43 224 -98.63 gain 224 43 -99.77 gain 44 45 -109.29 gain 45 44 -109.28 gain 44 46 -98.19 gain 46 44 -94.63 gain 44 47 -103.88 gain 47 44 -98.03 gain 44 48 -100.70 gain 48 44 -94.43 gain 44 49 -94.58 gain 49 44 -92.36 gain 44 50 -102.17 gain 50 44 -96.82 gain 44 51 -92.79 gain 51 44 -91.13 gain 44 52 -87.10 gain 52 44 -82.68 gain 44 53 -93.07 gain 53 44 -89.20 gain 44 54 -96.55 gain 54 44 -92.09 gain 44 55 -86.59 gain 55 44 -79.04 gain 44 56 -83.51 gain 56 44 -81.02 gain 44 57 -79.11 gain 57 44 -75.69 gain 44 58 -83.35 gain 58 44 -76.63 gain 44 59 -72.30 gain 59 44 -64.83 gain 44 60 -101.71 gain 60 44 -103.52 gain 44 61 -104.13 gain 61 44 -97.85 gain 44 62 -103.02 gain 62 44 -94.25 gain 44 63 -104.51 gain 63 44 -99.70 gain 44 64 -96.09 gain 64 44 -95.50 gain 44 65 -93.93 gain 65 44 -88.89 gain 44 66 -92.76 gain 66 44 -86.70 gain 44 67 -101.16 gain 67 44 -96.34 gain 44 68 -91.90 gain 68 44 -89.67 gain 44 69 -92.22 gain 69 44 -87.20 gain 44 70 -80.66 gain 70 44 -74.10 gain 44 71 -85.02 gain 71 44 -82.03 gain 44 72 -76.10 gain 72 44 -70.68 gain 44 73 -83.75 gain 73 44 -79.70 gain 44 74 -80.03 gain 74 44 -72.09 gain 44 75 -101.17 gain 75 44 -99.11 gain 44 76 -100.87 gain 76 44 -98.94 gain 44 77 -96.41 gain 77 44 -90.48 gain 44 78 -89.98 gain 78 44 -88.55 gain 44 79 -102.58 gain 79 44 -100.77 gain 44 80 -96.93 gain 80 44 -92.91 gain 44 81 -101.18 gain 81 44 -98.06 gain 44 82 -90.36 gain 82 44 -88.23 gain 44 83 -96.68 gain 83 44 -91.82 gain 44 84 -89.31 gain 84 44 -81.63 gain 44 85 -90.43 gain 85 44 -88.18 gain 44 86 -94.65 gain 86 44 -94.04 gain 44 87 -79.68 gain 87 44 -76.36 gain 44 88 -83.80 gain 88 44 -80.12 gain 44 89 -77.57 gain 89 44 -76.03 gain 44 90 -101.18 gain 90 44 -98.98 gain 44 91 -99.61 gain 91 44 -98.48 gain 44 92 -97.80 gain 92 44 -97.59 gain 44 93 -99.65 gain 93 44 -96.80 gain 44 94 -99.15 gain 94 44 -94.87 gain 44 95 -97.31 gain 95 44 -92.27 gain 44 96 -97.07 gain 96 44 -99.00 gain 44 97 -94.92 gain 97 44 -89.67 gain 44 98 -94.67 gain 98 44 -89.89 gain 44 99 -96.84 gain 99 44 -91.19 gain 44 100 -92.82 gain 100 44 -87.10 gain 44 101 -92.66 gain 101 44 -90.56 gain 44 102 -84.90 gain 102 44 -82.77 gain 44 103 -89.44 gain 103 44 -88.48 gain 44 104 -82.25 gain 104 44 -83.78 gain 44 105 -101.25 gain 105 44 -97.30 gain 44 106 -97.39 gain 106 44 -90.77 gain 44 107 -108.46 gain 107 44 -101.74 gain 44 108 -101.22 gain 108 44 -94.12 gain 44 109 -96.86 gain 109 44 -93.21 gain 44 110 -97.76 gain 110 44 -100.47 gain 44 111 -98.51 gain 111 44 -91.19 gain 44 112 -95.45 gain 112 44 -91.59 gain 44 113 -95.95 gain 113 44 -91.22 gain 44 114 -99.14 gain 114 44 -91.58 gain 44 115 -94.29 gain 115 44 -87.39 gain 44 116 -90.74 gain 116 44 -86.27 gain 44 117 -85.45 gain 117 44 -78.12 gain 44 118 -88.59 gain 118 44 -82.88 gain 44 119 -87.10 gain 119 44 -86.45 gain 44 120 -101.98 gain 120 44 -98.71 gain 44 121 -107.68 gain 121 44 -105.44 gain 44 122 -97.55 gain 122 44 -95.05 gain 44 123 -101.23 gain 123 44 -99.08 gain 44 124 -101.09 gain 124 44 -96.93 gain 44 125 -99.26 gain 125 44 -98.44 gain 44 126 -99.51 gain 126 44 -95.33 gain 44 127 -99.11 gain 127 44 -94.55 gain 44 128 -99.59 gain 128 44 -97.64 gain 44 129 -99.54 gain 129 44 -94.79 gain 44 130 -87.71 gain 130 44 -84.25 gain 44 131 -88.05 gain 131 44 -84.36 gain 44 132 -93.71 gain 132 44 -86.03 gain 44 133 -88.20 gain 133 44 -85.70 gain 44 134 -89.89 gain 134 44 -84.26 gain 44 135 -109.26 gain 135 44 -105.92 gain 44 136 -96.49 gain 136 44 -93.60 gain 44 137 -105.93 gain 137 44 -105.95 gain 44 138 -94.04 gain 138 44 -87.59 gain 44 139 -102.90 gain 139 44 -99.72 gain 44 140 -95.92 gain 140 44 -93.56 gain 44 141 -96.27 gain 141 44 -85.89 gain 44 142 -93.85 gain 142 44 -90.21 gain 44 143 -99.21 gain 143 44 -98.31 gain 44 144 -92.61 gain 144 44 -90.07 gain 44 145 -95.16 gain 145 44 -96.01 gain 44 146 -93.67 gain 146 44 -90.51 gain 44 147 -90.06 gain 147 44 -84.01 gain 44 148 -89.27 gain 148 44 -81.55 gain 44 149 -95.53 gain 149 44 -91.46 gain 44 150 -101.56 gain 150 44 -98.33 gain 44 151 -103.94 gain 151 44 -99.65 gain 44 152 -106.80 gain 152 44 -102.32 gain 44 153 -93.49 gain 153 44 -88.23 gain 44 154 -100.25 gain 154 44 -96.89 gain 44 155 -96.48 gain 155 44 -91.70 gain 44 156 -97.19 gain 156 44 -91.63 gain 44 157 -101.33 gain 157 44 -98.26 gain 44 158 -95.90 gain 158 44 -92.33 gain 44 159 -99.06 gain 159 44 -97.87 gain 44 160 -94.08 gain 160 44 -90.04 gain 44 161 -93.53 gain 161 44 -91.93 gain 44 162 -94.08 gain 162 44 -92.20 gain 44 163 -89.11 gain 163 44 -89.14 gain 44 164 -90.46 gain 164 44 -89.85 gain 44 165 -101.47 gain 165 44 -97.92 gain 44 166 -100.21 gain 166 44 -96.42 gain 44 167 -101.72 gain 167 44 -98.65 gain 44 168 -103.58 gain 168 44 -99.40 gain 44 169 -104.67 gain 169 44 -101.62 gain 44 170 -101.09 gain 170 44 -97.27 gain 44 171 -102.48 gain 171 44 -99.74 gain 44 172 -101.54 gain 172 44 -96.98 gain 44 173 -101.41 gain 173 44 -101.50 gain 44 174 -98.55 gain 174 44 -94.69 gain 44 175 -101.96 gain 175 44 -99.23 gain 44 176 -97.65 gain 176 44 -93.89 gain 44 177 -95.62 gain 177 44 -94.86 gain 44 178 -91.90 gain 178 44 -84.58 gain 44 179 -101.55 gain 179 44 -93.66 gain 44 180 -110.36 gain 180 44 -111.92 gain 44 181 -105.39 gain 181 44 -100.97 gain 44 182 -105.03 gain 182 44 -101.69 gain 44 183 -101.40 gain 183 44 -98.34 gain 44 184 -100.39 gain 184 44 -100.08 gain 44 185 -93.48 gain 185 44 -97.03 gain 44 186 -102.32 gain 186 44 -101.46 gain 44 187 -99.59 gain 187 44 -96.45 gain 44 188 -100.58 gain 188 44 -99.86 gain 44 189 -100.42 gain 189 44 -94.41 gain 44 190 -101.47 gain 190 44 -99.38 gain 44 191 -90.89 gain 191 44 -87.51 gain 44 192 -107.11 gain 192 44 -102.43 gain 44 193 -102.00 gain 193 44 -96.30 gain 44 194 -101.50 gain 194 44 -96.58 gain 44 195 -107.30 gain 195 44 -100.93 gain 44 196 -107.24 gain 196 44 -105.19 gain 44 197 -106.98 gain 197 44 -100.05 gain 44 198 -112.43 gain 198 44 -110.02 gain 44 199 -102.17 gain 199 44 -99.86 gain 44 200 -100.29 gain 200 44 -99.32 gain 44 201 -105.82 gain 201 44 -104.76 gain 44 202 -96.35 gain 202 44 -94.43 gain 44 203 -94.35 gain 203 44 -91.54 gain 44 204 -105.72 gain 204 44 -99.56 gain 44 205 -96.47 gain 205 44 -94.05 gain 44 206 -92.02 gain 206 44 -90.70 gain 44 207 -91.52 gain 207 44 -89.62 gain 44 208 -96.72 gain 208 44 -97.42 gain 44 209 -103.29 gain 209 44 -103.56 gain 44 210 -107.32 gain 210 44 -107.77 gain 44 211 -107.72 gain 211 44 -103.40 gain 44 212 -107.94 gain 212 44 -106.64 gain 44 213 -99.08 gain 213 44 -97.10 gain 44 214 -105.19 gain 214 44 -108.60 gain 44 215 -105.83 gain 215 44 -104.64 gain 44 216 -97.02 gain 216 44 -99.74 gain 44 217 -103.99 gain 217 44 -106.97 gain 44 218 -104.53 gain 218 44 -100.32 gain 44 219 -102.77 gain 219 44 -99.04 gain 44 220 -106.27 gain 220 44 -98.62 gain 44 221 -96.60 gain 221 44 -94.64 gain 44 222 -99.87 gain 222 44 -93.71 gain 44 223 -99.93 gain 223 44 -97.01 gain 44 224 -107.47 gain 224 44 -105.02 gain 45 46 -66.94 gain 46 45 -63.40 gain 45 47 -68.78 gain 47 45 -62.94 gain 45 48 -81.44 gain 48 45 -75.19 gain 45 49 -86.75 gain 49 45 -84.56 gain 45 50 -92.13 gain 50 45 -86.80 gain 45 51 -91.54 gain 51 45 -89.90 gain 45 52 -98.70 gain 52 45 -94.29 gain 45 53 -95.20 gain 53 45 -91.35 gain 45 54 -97.42 gain 54 45 -92.97 gain 45 55 -92.63 gain 55 45 -85.10 gain 45 56 -105.76 gain 56 45 -103.28 gain 45 57 -100.51 gain 57 45 -97.11 gain 45 58 -97.41 gain 58 45 -90.71 gain 45 59 -104.93 gain 59 45 -97.48 gain 45 60 -67.82 gain 60 45 -69.64 gain 45 61 -71.66 gain 61 45 -65.39 gain 45 62 -77.06 gain 62 45 -68.30 gain 45 63 -86.21 gain 63 45 -81.42 gain 45 64 -83.73 gain 64 45 -83.16 gain 45 65 -85.93 gain 65 45 -80.91 gain 45 66 -96.48 gain 66 45 -90.45 gain 45 67 -90.43 gain 67 45 -85.63 gain 45 68 -98.45 gain 68 45 -96.23 gain 45 69 -97.02 gain 69 45 -92.01 gain 45 70 -96.02 gain 70 45 -89.48 gain 45 71 -98.15 gain 71 45 -95.18 gain 45 72 -100.33 gain 72 45 -94.92 gain 45 73 -98.98 gain 73 45 -94.94 gain 45 74 -92.20 gain 74 45 -84.28 gain 45 75 -68.61 gain 75 45 -66.57 gain 45 76 -80.00 gain 76 45 -78.09 gain 45 77 -83.04 gain 77 45 -77.12 gain 45 78 -81.38 gain 78 45 -79.96 gain 45 79 -92.91 gain 79 45 -91.12 gain 45 80 -88.12 gain 80 45 -84.12 gain 45 81 -93.63 gain 81 45 -90.53 gain 45 82 -91.66 gain 82 45 -89.54 gain 45 83 -96.82 gain 83 45 -91.98 gain 45 84 -99.85 gain 84 45 -92.20 gain 45 85 -105.98 gain 85 45 -103.75 gain 45 86 -96.48 gain 86 45 -95.89 gain 45 87 -100.19 gain 87 45 -96.89 gain 45 88 -94.04 gain 88 45 -90.38 gain 45 89 -98.34 gain 89 45 -96.82 gain 45 90 -77.60 gain 90 45 -75.42 gain 45 91 -83.95 gain 91 45 -82.84 gain 45 92 -80.26 gain 92 45 -80.07 gain 45 93 -86.83 gain 93 45 -84.00 gain 45 94 -91.21 gain 94 45 -86.95 gain 45 95 -95.23 gain 95 45 -90.20 gain 45 96 -96.03 gain 96 45 -97.98 gain 45 97 -92.56 gain 97 45 -87.33 gain 45 98 -94.86 gain 98 45 -90.10 gain 45 99 -95.63 gain 99 45 -90.00 gain 45 100 -98.85 gain 100 45 -93.14 gain 45 101 -99.35 gain 101 45 -97.27 gain 45 102 -104.89 gain 102 45 -102.78 gain 45 103 -103.66 gain 103 45 -102.72 gain 45 104 -103.40 gain 104 45 -104.94 gain 45 105 -89.69 gain 105 45 -85.75 gain 45 106 -87.09 gain 106 45 -80.49 gain 45 107 -83.41 gain 107 45 -76.71 gain 45 108 -87.21 gain 108 45 -80.13 gain 45 109 -93.02 gain 109 45 -89.38 gain 45 110 -87.89 gain 110 45 -90.62 gain 45 111 -91.64 gain 111 45 -84.33 gain 45 112 -96.54 gain 112 45 -92.70 gain 45 113 -93.29 gain 113 45 -88.58 gain 45 114 -96.58 gain 114 45 -89.04 gain 45 115 -92.24 gain 115 45 -85.35 gain 45 116 -103.23 gain 116 45 -98.78 gain 45 117 -100.88 gain 117 45 -93.57 gain 45 118 -104.20 gain 118 45 -98.50 gain 45 119 -96.23 gain 119 45 -95.60 gain 45 120 -86.62 gain 120 45 -83.36 gain 45 121 -86.23 gain 121 45 -84.00 gain 45 122 -89.89 gain 122 45 -87.41 gain 45 123 -94.65 gain 123 45 -92.52 gain 45 124 -87.16 gain 124 45 -83.01 gain 45 125 -88.41 gain 125 45 -87.60 gain 45 126 -96.71 gain 126 45 -92.55 gain 45 127 -90.48 gain 127 45 -85.94 gain 45 128 -105.21 gain 128 45 -103.27 gain 45 129 -92.26 gain 129 45 -87.53 gain 45 130 -101.52 gain 130 45 -98.08 gain 45 131 -99.44 gain 131 45 -95.77 gain 45 132 -106.20 gain 132 45 -98.55 gain 45 133 -107.51 gain 133 45 -105.03 gain 45 134 -109.69 gain 134 45 -104.07 gain 45 135 -93.25 gain 135 45 -89.94 gain 45 136 -82.28 gain 136 45 -79.40 gain 45 137 -91.16 gain 137 45 -91.20 gain 45 138 -91.72 gain 138 45 -85.29 gain 45 139 -100.01 gain 139 45 -96.84 gain 45 140 -100.56 gain 140 45 -98.23 gain 45 141 -99.80 gain 141 45 -89.43 gain 45 142 -98.37 gain 142 45 -94.74 gain 45 143 -95.62 gain 143 45 -94.73 gain 45 144 -93.73 gain 144 45 -91.21 gain 45 145 -105.16 gain 145 45 -106.03 gain 45 146 -101.95 gain 146 45 -98.81 gain 45 147 -101.56 gain 147 45 -95.52 gain 45 148 -103.24 gain 148 45 -95.53 gain 45 149 -101.40 gain 149 45 -97.35 gain 45 150 -96.98 gain 150 45 -93.76 gain 45 151 -97.39 gain 151 45 -93.12 gain 45 152 -94.86 gain 152 45 -90.40 gain 45 153 -96.24 gain 153 45 -91.00 gain 45 154 -93.91 gain 154 45 -90.57 gain 45 155 -98.65 gain 155 45 -93.88 gain 45 156 -104.28 gain 156 45 -98.74 gain 45 157 -99.74 gain 157 45 -96.69 gain 45 158 -98.89 gain 158 45 -95.34 gain 45 159 -102.23 gain 159 45 -101.06 gain 45 160 -99.92 gain 160 45 -95.90 gain 45 161 -102.92 gain 161 45 -101.34 gain 45 162 -109.45 gain 162 45 -107.58 gain 45 163 -106.49 gain 163 45 -106.54 gain 45 164 -103.56 gain 164 45 -102.98 gain 45 165 -96.58 gain 165 45 -93.05 gain 45 166 -92.63 gain 166 45 -88.85 gain 45 167 -106.13 gain 167 45 -103.08 gain 45 168 -103.68 gain 168 45 -99.53 gain 45 169 -99.69 gain 169 45 -96.64 gain 45 170 -97.98 gain 170 45 -94.17 gain 45 171 -96.82 gain 171 45 -94.09 gain 45 172 -102.72 gain 172 45 -98.18 gain 45 173 -101.65 gain 173 45 -101.76 gain 45 174 -100.84 gain 174 45 -96.99 gain 45 175 -100.25 gain 175 45 -97.54 gain 45 176 -102.72 gain 176 45 -98.98 gain 45 177 -100.60 gain 177 45 -99.86 gain 45 178 -101.94 gain 178 45 -94.64 gain 45 179 -108.43 gain 179 45 -100.55 gain 45 180 -101.29 gain 180 45 -102.86 gain 45 181 -100.41 gain 181 45 -96.01 gain 45 182 -105.36 gain 182 45 -102.04 gain 45 183 -102.47 gain 183 45 -99.42 gain 45 184 -98.08 gain 184 45 -97.78 gain 45 185 -96.32 gain 185 45 -99.89 gain 45 186 -101.49 gain 186 45 -100.64 gain 45 187 -99.29 gain 187 45 -96.17 gain 45 188 -97.98 gain 188 45 -97.27 gain 45 189 -108.07 gain 189 45 -102.09 gain 45 190 -103.39 gain 190 45 -101.32 gain 45 191 -98.72 gain 191 45 -95.36 gain 45 192 -96.91 gain 192 45 -92.24 gain 45 193 -106.20 gain 193 45 -100.52 gain 45 194 -105.69 gain 194 45 -100.79 gain 45 195 -96.30 gain 195 45 -89.95 gain 45 196 -97.79 gain 196 45 -95.75 gain 45 197 -95.73 gain 197 45 -88.82 gain 45 198 -104.52 gain 198 45 -102.13 gain 45 199 -97.91 gain 199 45 -95.62 gain 45 200 -105.46 gain 200 45 -104.52 gain 45 201 -98.20 gain 201 45 -97.16 gain 45 202 -103.23 gain 202 45 -101.32 gain 45 203 -105.93 gain 203 45 -103.14 gain 45 204 -107.82 gain 204 45 -101.67 gain 45 205 -98.18 gain 205 45 -95.77 gain 45 206 -100.51 gain 206 45 -99.21 gain 45 207 -110.24 gain 207 45 -108.36 gain 45 208 -100.64 gain 208 45 -101.36 gain 45 209 -109.97 gain 209 45 -110.27 gain 45 210 -99.07 gain 210 45 -99.53 gain 45 211 -94.63 gain 211 45 -90.33 gain 45 212 -106.80 gain 212 45 -105.51 gain 45 213 -108.53 gain 213 45 -106.57 gain 45 214 -95.70 gain 214 45 -99.13 gain 45 215 -103.39 gain 215 45 -102.21 gain 45 216 -102.06 gain 216 45 -104.80 gain 45 217 -100.37 gain 217 45 -103.36 gain 45 218 -105.28 gain 218 45 -101.09 gain 45 219 -102.29 gain 219 45 -98.58 gain 45 220 -102.12 gain 220 45 -94.49 gain 45 221 -104.42 gain 221 45 -102.47 gain 45 222 -102.84 gain 222 45 -96.70 gain 45 223 -105.65 gain 223 45 -102.75 gain 45 224 -112.44 gain 224 45 -110.00 gain 46 47 -63.29 gain 47 46 -60.98 gain 46 48 -75.27 gain 48 46 -72.55 gain 46 49 -78.03 gain 49 46 -79.36 gain 46 50 -88.45 gain 50 46 -86.65 gain 46 51 -78.29 gain 51 46 -80.18 gain 46 52 -87.42 gain 52 46 -86.54 gain 46 53 -91.79 gain 53 46 -91.47 gain 46 54 -95.28 gain 54 46 -94.37 gain 46 55 -91.55 gain 55 46 -87.55 gain 46 56 -86.87 gain 56 46 -87.93 gain 46 57 -100.73 gain 57 46 -100.86 gain 46 58 -92.85 gain 58 46 -89.68 gain 46 59 -98.59 gain 59 46 -94.67 gain 46 60 -72.65 gain 60 46 -78.01 gain 46 61 -68.60 gain 61 46 -65.87 gain 46 62 -67.99 gain 62 46 -62.76 gain 46 63 -74.83 gain 63 46 -73.58 gain 46 64 -83.25 gain 64 46 -86.22 gain 46 65 -81.53 gain 65 46 -80.04 gain 46 66 -82.19 gain 66 46 -79.69 gain 46 67 -89.91 gain 67 46 -88.64 gain 46 68 -91.44 gain 68 46 -92.75 gain 46 69 -90.98 gain 69 46 -89.51 gain 46 70 -94.54 gain 70 46 -91.54 gain 46 71 -91.92 gain 71 46 -92.49 gain 46 72 -103.20 gain 72 46 -101.32 gain 46 73 -96.06 gain 73 46 -95.55 gain 46 74 -103.50 gain 74 46 -99.11 gain 46 75 -75.89 gain 75 46 -77.39 gain 46 76 -72.34 gain 76 46 -73.96 gain 46 77 -72.62 gain 77 46 -70.24 gain 46 78 -76.39 gain 78 46 -78.51 gain 46 79 -87.14 gain 79 46 -88.88 gain 46 80 -83.97 gain 80 46 -83.50 gain 46 81 -88.30 gain 81 46 -88.74 gain 46 82 -96.64 gain 82 46 -98.06 gain 46 83 -91.15 gain 83 46 -89.84 gain 46 84 -88.43 gain 84 46 -84.31 gain 46 85 -97.87 gain 85 46 -99.18 gain 46 86 -96.14 gain 86 46 -99.08 gain 46 87 -96.87 gain 87 46 -97.10 gain 46 88 -104.72 gain 88 46 -104.60 gain 46 89 -102.90 gain 89 46 -104.92 gain 46 90 -79.31 gain 90 46 -80.67 gain 46 91 -72.85 gain 91 46 -75.28 gain 46 92 -77.57 gain 92 46 -80.91 gain 46 93 -81.36 gain 93 46 -82.06 gain 46 94 -84.04 gain 94 46 -83.32 gain 46 95 -84.69 gain 95 46 -83.20 gain 46 96 -84.87 gain 96 46 -90.35 gain 46 97 -87.96 gain 97 46 -86.26 gain 46 98 -94.63 gain 98 46 -93.41 gain 46 99 -92.03 gain 99 46 -89.94 gain 46 100 -95.58 gain 100 46 -93.41 gain 46 101 -102.20 gain 101 46 -103.66 gain 46 102 -92.30 gain 102 46 -93.73 gain 46 103 -97.68 gain 103 46 -100.27 gain 46 104 -97.82 gain 104 46 -102.90 gain 46 105 -77.78 gain 105 46 -77.37 gain 46 106 -87.26 gain 106 46 -84.19 gain 46 107 -83.39 gain 107 46 -80.22 gain 46 108 -81.35 gain 108 46 -77.80 gain 46 109 -86.02 gain 109 46 -85.93 gain 46 110 -89.35 gain 110 46 -95.61 gain 46 111 -84.17 gain 111 46 -80.40 gain 46 112 -94.32 gain 112 46 -94.02 gain 46 113 -86.97 gain 113 46 -85.80 gain 46 114 -88.94 gain 114 46 -84.93 gain 46 115 -91.49 gain 115 46 -88.14 gain 46 116 -97.52 gain 116 46 -96.60 gain 46 117 -89.71 gain 117 46 -85.93 gain 46 118 -95.81 gain 118 46 -93.65 gain 46 119 -95.56 gain 119 46 -98.46 gain 46 120 -84.96 gain 120 46 -85.24 gain 46 121 -83.93 gain 121 46 -85.24 gain 46 122 -84.06 gain 122 46 -85.12 gain 46 123 -87.55 gain 123 46 -88.95 gain 46 124 -84.89 gain 124 46 -84.27 gain 46 125 -89.64 gain 125 46 -92.36 gain 46 126 -86.31 gain 126 46 -85.68 gain 46 127 -93.71 gain 127 46 -92.71 gain 46 128 -90.84 gain 128 46 -92.44 gain 46 129 -97.17 gain 129 46 -95.97 gain 46 130 -95.09 gain 130 46 -95.18 gain 46 131 -102.22 gain 131 46 -102.09 gain 46 132 -96.24 gain 132 46 -92.12 gain 46 133 -108.38 gain 133 46 -109.43 gain 46 134 -96.09 gain 134 46 -94.00 gain 46 135 -90.71 gain 135 46 -90.93 gain 46 136 -86.10 gain 136 46 -86.76 gain 46 137 -88.88 gain 137 46 -92.46 gain 46 138 -89.52 gain 138 46 -86.63 gain 46 139 -86.43 gain 139 46 -86.80 gain 46 140 -90.76 gain 140 46 -91.95 gain 46 141 -92.79 gain 141 46 -85.96 gain 46 142 -92.61 gain 142 46 -92.52 gain 46 143 -92.14 gain 143 46 -94.79 gain 46 144 -97.73 gain 144 46 -98.74 gain 46 145 -92.49 gain 145 46 -96.89 gain 46 146 -97.01 gain 146 46 -97.40 gain 46 147 -98.23 gain 147 46 -95.73 gain 46 148 -102.02 gain 148 46 -97.85 gain 46 149 -100.68 gain 149 46 -100.17 gain 46 150 -88.83 gain 150 46 -89.15 gain 46 151 -90.00 gain 151 46 -89.26 gain 46 152 -93.69 gain 152 46 -92.77 gain 46 153 -95.11 gain 153 46 -93.40 gain 46 154 -89.32 gain 154 46 -89.51 gain 46 155 -98.03 gain 155 46 -96.80 gain 46 156 -101.63 gain 156 46 -99.63 gain 46 157 -92.39 gain 157 46 -92.87 gain 46 158 -101.84 gain 158 46 -101.82 gain 46 159 -91.85 gain 159 46 -94.21 gain 46 160 -93.44 gain 160 46 -92.96 gain 46 161 -91.53 gain 161 46 -93.49 gain 46 162 -99.03 gain 162 46 -100.69 gain 46 163 -98.92 gain 163 46 -102.50 gain 46 164 -102.53 gain 164 46 -105.48 gain 46 165 -91.31 gain 165 46 -91.32 gain 46 166 -90.64 gain 166 46 -90.40 gain 46 167 -83.22 gain 167 46 -83.70 gain 46 168 -88.51 gain 168 46 -87.88 gain 46 169 -91.92 gain 169 46 -92.41 gain 46 170 -90.77 gain 170 46 -90.50 gain 46 171 -92.75 gain 171 46 -93.56 gain 46 172 -96.85 gain 172 46 -95.85 gain 46 173 -98.46 gain 173 46 -102.10 gain 46 174 -97.68 gain 174 46 -97.38 gain 46 175 -97.00 gain 175 46 -97.82 gain 46 176 -101.04 gain 176 46 -100.84 gain 46 177 -99.67 gain 177 46 -102.46 gain 46 178 -110.82 gain 178 46 -107.06 gain 46 179 -104.89 gain 179 46 -100.55 gain 46 180 -97.45 gain 180 46 -102.56 gain 46 181 -87.89 gain 181 46 -87.02 gain 46 182 -94.99 gain 182 46 -95.20 gain 46 183 -90.03 gain 183 46 -90.52 gain 46 184 -93.97 gain 184 46 -97.21 gain 46 185 -97.71 gain 185 46 -104.81 gain 46 186 -98.26 gain 186 46 -100.95 gain 46 187 -98.83 gain 187 46 -99.24 gain 46 188 -94.65 gain 188 46 -97.48 gain 46 189 -97.57 gain 189 46 -95.12 gain 46 190 -101.40 gain 190 46 -102.86 gain 46 191 -93.37 gain 191 46 -93.55 gain 46 192 -96.22 gain 192 46 -95.09 gain 46 193 -96.32 gain 193 46 -94.18 gain 46 194 -98.25 gain 194 46 -96.89 gain 46 195 -100.16 gain 195 46 -97.35 gain 46 196 -98.60 gain 196 46 -100.09 gain 46 197 -85.54 gain 197 46 -82.17 gain 46 198 -97.84 gain 198 46 -98.99 gain 46 199 -85.80 gain 199 46 -87.05 gain 46 200 -92.75 gain 200 46 -95.33 gain 46 201 -99.40 gain 201 46 -101.90 gain 46 202 -96.76 gain 202 46 -98.39 gain 46 203 -99.68 gain 203 46 -100.43 gain 46 204 -94.23 gain 204 46 -91.61 gain 46 205 -102.05 gain 205 46 -103.17 gain 46 206 -101.38 gain 206 46 -103.62 gain 46 207 -98.28 gain 207 46 -99.93 gain 46 208 -99.93 gain 208 46 -104.19 gain 46 209 -97.81 gain 209 46 -101.64 gain 46 210 -97.75 gain 210 46 -101.75 gain 46 211 -94.24 gain 211 46 -93.48 gain 46 212 -95.63 gain 212 46 -97.88 gain 46 213 -98.80 gain 213 46 -100.38 gain 46 214 -96.44 gain 214 46 -103.41 gain 46 215 -99.70 gain 215 46 -102.07 gain 46 216 -100.76 gain 216 46 -107.03 gain 46 217 -95.29 gain 217 46 -101.82 gain 46 218 -103.42 gain 218 46 -102.76 gain 46 219 -99.99 gain 219 46 -99.82 gain 46 220 -98.81 gain 220 46 -94.72 gain 46 221 -98.17 gain 221 46 -99.76 gain 46 222 -101.47 gain 222 46 -98.86 gain 46 223 -101.69 gain 223 46 -102.33 gain 46 224 -104.06 gain 224 46 -105.17 gain 47 48 -60.30 gain 48 47 -59.88 gain 47 49 -79.26 gain 49 47 -82.90 gain 47 50 -78.80 gain 50 47 -79.29 gain 47 51 -79.95 gain 51 47 -84.14 gain 47 52 -81.04 gain 52 47 -82.46 gain 47 53 -82.58 gain 53 47 -84.56 gain 47 54 -90.37 gain 54 47 -91.77 gain 47 55 -92.51 gain 55 47 -90.82 gain 47 56 -91.97 gain 56 47 -95.33 gain 47 57 -86.74 gain 57 47 -89.18 gain 47 58 -93.89 gain 58 47 -93.02 gain 47 59 -95.54 gain 59 47 -93.93 gain 47 60 -78.02 gain 60 47 -85.69 gain 47 61 -64.67 gain 61 47 -64.24 gain 47 62 -63.68 gain 62 47 -60.76 gain 47 63 -68.81 gain 63 47 -69.85 gain 47 64 -76.31 gain 64 47 -81.58 gain 47 65 -80.81 gain 65 47 -81.62 gain 47 66 -73.34 gain 66 47 -73.14 gain 47 67 -85.31 gain 67 47 -86.34 gain 47 68 -92.72 gain 68 47 -96.34 gain 47 69 -87.48 gain 69 47 -88.32 gain 47 70 -93.99 gain 70 47 -93.29 gain 47 71 -93.08 gain 71 47 -95.95 gain 47 72 -97.30 gain 72 47 -97.72 gain 47 73 -88.69 gain 73 47 -90.49 gain 47 74 -93.52 gain 74 47 -91.43 gain 47 75 -76.82 gain 75 47 -80.62 gain 47 76 -67.42 gain 76 47 -71.35 gain 47 77 -77.55 gain 77 47 -77.47 gain 47 78 -68.37 gain 78 47 -72.79 gain 47 79 -80.89 gain 79 47 -84.93 gain 47 80 -73.16 gain 80 47 -75.00 gain 47 81 -79.50 gain 81 47 -82.24 gain 47 82 -85.84 gain 82 47 -89.56 gain 47 83 -82.82 gain 83 47 -83.81 gain 47 84 -90.81 gain 84 47 -88.99 gain 47 85 -93.81 gain 85 47 -97.42 gain 47 86 -90.55 gain 86 47 -95.79 gain 47 87 -92.98 gain 87 47 -95.51 gain 47 88 -85.49 gain 88 47 -87.66 gain 47 89 -92.06 gain 89 47 -96.37 gain 47 90 -82.91 gain 90 47 -86.57 gain 47 91 -75.61 gain 91 47 -80.34 gain 47 92 -70.84 gain 92 47 -76.49 gain 47 93 -80.88 gain 93 47 -83.88 gain 47 94 -89.23 gain 94 47 -90.80 gain 47 95 -79.61 gain 95 47 -80.43 gain 47 96 -83.90 gain 96 47 -91.68 gain 47 97 -78.11 gain 97 47 -78.72 gain 47 98 -83.30 gain 98 47 -84.38 gain 47 99 -95.52 gain 99 47 -95.74 gain 47 100 -98.43 gain 100 47 -98.56 gain 47 101 -87.27 gain 101 47 -91.03 gain 47 102 -90.39 gain 102 47 -94.12 gain 47 103 -102.24 gain 103 47 -107.13 gain 47 104 -96.34 gain 104 47 -103.72 gain 47 105 -79.68 gain 105 47 -81.58 gain 47 106 -85.01 gain 106 47 -84.24 gain 47 107 -80.57 gain 107 47 -79.71 gain 47 108 -76.48 gain 108 47 -75.23 gain 47 109 -85.46 gain 109 47 -87.67 gain 47 110 -87.76 gain 110 47 -96.32 gain 47 111 -82.61 gain 111 47 -81.14 gain 47 112 -87.26 gain 112 47 -89.26 gain 47 113 -88.50 gain 113 47 -89.62 gain 47 114 -96.89 gain 114 47 -95.18 gain 47 115 -90.09 gain 115 47 -89.03 gain 47 116 -98.62 gain 116 47 -99.99 gain 47 117 -100.16 gain 117 47 -98.68 gain 47 118 -94.36 gain 118 47 -94.50 gain 47 119 -91.00 gain 119 47 -96.21 gain 47 120 -81.80 gain 120 47 -84.39 gain 47 121 -86.30 gain 121 47 -89.91 gain 47 122 -84.51 gain 122 47 -87.87 gain 47 123 -78.66 gain 123 47 -82.36 gain 47 124 -85.31 gain 124 47 -87.00 gain 47 125 -92.79 gain 125 47 -97.81 gain 47 126 -86.71 gain 126 47 -88.38 gain 47 127 -87.44 gain 127 47 -88.75 gain 47 128 -84.56 gain 128 47 -88.46 gain 47 129 -93.62 gain 129 47 -94.72 gain 47 130 -85.28 gain 130 47 -87.67 gain 47 131 -89.83 gain 131 47 -92.00 gain 47 132 -95.42 gain 132 47 -93.60 gain 47 133 -94.69 gain 133 47 -98.04 gain 47 134 -97.59 gain 134 47 -97.81 gain 47 135 -87.54 gain 135 47 -90.06 gain 47 136 -84.72 gain 136 47 -87.68 gain 47 137 -87.16 gain 137 47 -93.03 gain 47 138 -93.94 gain 138 47 -93.35 gain 47 139 -85.40 gain 139 47 -88.07 gain 47 140 -90.01 gain 140 47 -93.51 gain 47 141 -88.13 gain 141 47 -83.60 gain 47 142 -89.02 gain 142 47 -91.24 gain 47 143 -89.03 gain 143 47 -93.98 gain 47 144 -92.08 gain 144 47 -95.40 gain 47 145 -90.70 gain 145 47 -97.41 gain 47 146 -93.43 gain 146 47 -96.13 gain 47 147 -91.56 gain 147 47 -91.37 gain 47 148 -98.65 gain 148 47 -96.78 gain 47 149 -98.40 gain 149 47 -100.19 gain 47 150 -91.11 gain 150 47 -93.74 gain 47 151 -91.07 gain 151 47 -92.63 gain 47 152 -87.18 gain 152 47 -88.56 gain 47 153 -82.82 gain 153 47 -83.41 gain 47 154 -90.72 gain 154 47 -93.22 gain 47 155 -83.23 gain 155 47 -84.30 gain 47 156 -83.41 gain 156 47 -83.71 gain 47 157 -79.12 gain 157 47 -81.90 gain 47 158 -92.92 gain 158 47 -95.20 gain 47 159 -88.03 gain 159 47 -92.69 gain 47 160 -86.11 gain 160 47 -87.93 gain 47 161 -91.61 gain 161 47 -95.87 gain 47 162 -90.15 gain 162 47 -94.12 gain 47 163 -99.55 gain 163 47 -105.44 gain 47 164 -104.14 gain 164 47 -109.39 gain 47 165 -87.11 gain 165 47 -89.42 gain 47 166 -92.12 gain 166 47 -94.18 gain 47 167 -94.12 gain 167 47 -96.91 gain 47 168 -94.62 gain 168 47 -96.30 gain 47 169 -84.54 gain 169 47 -87.34 gain 47 170 -89.18 gain 170 47 -91.21 gain 47 171 -86.92 gain 171 47 -90.03 gain 47 172 -84.45 gain 172 47 -85.75 gain 47 173 -95.27 gain 173 47 -101.21 gain 47 174 -88.51 gain 174 47 -90.50 gain 47 175 -102.26 gain 175 47 -105.39 gain 47 176 -90.69 gain 176 47 -92.79 gain 47 177 -90.55 gain 177 47 -95.65 gain 47 178 -94.82 gain 178 47 -93.36 gain 47 179 -93.55 gain 179 47 -91.51 gain 47 180 -96.80 gain 180 47 -104.21 gain 47 181 -86.34 gain 181 47 -87.77 gain 47 182 -96.31 gain 182 47 -98.83 gain 47 183 -85.18 gain 183 47 -87.97 gain 47 184 -88.40 gain 184 47 -93.94 gain 47 185 -92.03 gain 185 47 -101.44 gain 47 186 -83.41 gain 186 47 -88.40 gain 47 187 -94.64 gain 187 47 -97.36 gain 47 188 -96.62 gain 188 47 -101.74 gain 47 189 -93.36 gain 189 47 -93.22 gain 47 190 -98.45 gain 190 47 -102.22 gain 47 191 -83.96 gain 191 47 -86.44 gain 47 192 -92.96 gain 192 47 -94.13 gain 47 193 -89.64 gain 193 47 -89.79 gain 47 194 -97.54 gain 194 47 -98.47 gain 47 195 -89.87 gain 195 47 -89.35 gain 47 196 -98.67 gain 196 47 -102.47 gain 47 197 -97.64 gain 197 47 -96.57 gain 47 198 -88.87 gain 198 47 -92.31 gain 47 199 -95.45 gain 199 47 -99.00 gain 47 200 -92.71 gain 200 47 -97.60 gain 47 201 -91.80 gain 201 47 -96.59 gain 47 202 -88.98 gain 202 47 -92.91 gain 47 203 -96.76 gain 203 47 -99.81 gain 47 204 -96.68 gain 204 47 -96.37 gain 47 205 -92.38 gain 205 47 -95.81 gain 47 206 -99.21 gain 206 47 -103.75 gain 47 207 -92.34 gain 207 47 -96.29 gain 47 208 -98.21 gain 208 47 -104.77 gain 47 209 -94.71 gain 209 47 -100.83 gain 47 210 -94.04 gain 210 47 -100.34 gain 47 211 -92.77 gain 211 47 -94.30 gain 47 212 -91.02 gain 212 47 -95.56 gain 47 213 -97.51 gain 213 47 -101.38 gain 47 214 -97.68 gain 214 47 -106.94 gain 47 215 -99.28 gain 215 47 -103.95 gain 47 216 -93.16 gain 216 47 -101.74 gain 47 217 -100.62 gain 217 47 -109.45 gain 47 218 -99.85 gain 218 47 -101.49 gain 47 219 -94.98 gain 219 47 -97.11 gain 47 220 -92.47 gain 220 47 -90.68 gain 47 221 -102.43 gain 221 47 -106.32 gain 47 222 -96.28 gain 222 47 -95.97 gain 47 223 -106.29 gain 223 47 -109.23 gain 47 224 -101.64 gain 224 47 -105.05 gain 48 49 -60.16 gain 49 48 -64.22 gain 48 50 -61.79 gain 50 48 -62.71 gain 48 51 -81.78 gain 51 48 -86.40 gain 48 52 -85.04 gain 52 48 -86.89 gain 48 53 -82.00 gain 53 48 -84.40 gain 48 54 -85.83 gain 54 48 -87.64 gain 48 55 -89.59 gain 55 48 -88.32 gain 48 56 -87.58 gain 56 48 -91.36 gain 48 57 -83.53 gain 57 48 -86.39 gain 48 58 -94.46 gain 58 48 -94.01 gain 48 59 -96.50 gain 59 48 -95.30 gain 48 60 -73.64 gain 60 48 -81.72 gain 48 61 -77.11 gain 61 48 -77.10 gain 48 62 -71.20 gain 62 48 -68.70 gain 48 63 -60.42 gain 63 48 -61.88 gain 48 64 -61.99 gain 64 48 -67.68 gain 48 65 -69.28 gain 65 48 -70.52 gain 48 66 -75.01 gain 66 48 -75.23 gain 48 67 -78.32 gain 67 48 -79.77 gain 48 68 -83.77 gain 68 48 -87.80 gain 48 69 -84.94 gain 69 48 -86.19 gain 48 70 -81.68 gain 70 48 -81.40 gain 48 71 -87.46 gain 71 48 -90.75 gain 48 72 -92.40 gain 72 48 -93.25 gain 48 73 -96.98 gain 73 48 -99.20 gain 48 74 -88.52 gain 74 48 -86.85 gain 48 75 -79.79 gain 75 48 -84.01 gain 48 76 -75.57 gain 76 48 -79.92 gain 48 77 -80.63 gain 77 48 -80.97 gain 48 78 -71.69 gain 78 48 -76.53 gain 48 79 -76.85 gain 79 48 -81.31 gain 48 80 -75.00 gain 80 48 -77.25 gain 48 81 -80.85 gain 81 48 -84.01 gain 48 82 -77.90 gain 82 48 -82.04 gain 48 83 -85.28 gain 83 48 -86.69 gain 48 84 -96.83 gain 84 48 -95.42 gain 48 85 -89.99 gain 85 48 -94.02 gain 48 86 -89.63 gain 86 48 -95.30 gain 48 87 -89.93 gain 87 48 -92.89 gain 48 88 -90.19 gain 88 48 -92.79 gain 48 89 -99.46 gain 89 48 -104.20 gain 48 90 -76.65 gain 90 48 -80.73 gain 48 91 -84.65 gain 91 48 -89.80 gain 48 92 -75.38 gain 92 48 -81.44 gain 48 93 -85.24 gain 93 48 -88.67 gain 48 94 -75.48 gain 94 48 -77.47 gain 48 95 -83.62 gain 95 48 -84.86 gain 48 96 -82.41 gain 96 48 -90.61 gain 48 97 -84.48 gain 97 48 -85.50 gain 48 98 -79.31 gain 98 48 -80.81 gain 48 99 -83.89 gain 99 48 -84.52 gain 48 100 -93.33 gain 100 48 -93.88 gain 48 101 -89.88 gain 101 48 -94.06 gain 48 102 -94.75 gain 102 48 -98.90 gain 48 103 -89.20 gain 103 48 -94.51 gain 48 104 -89.69 gain 104 48 -97.49 gain 48 105 -80.63 gain 105 48 -82.95 gain 48 106 -76.71 gain 106 48 -76.36 gain 48 107 -74.79 gain 107 48 -74.34 gain 48 108 -79.45 gain 108 48 -78.63 gain 48 109 -79.90 gain 109 48 -82.53 gain 48 110 -79.58 gain 110 48 -88.56 gain 48 111 -86.85 gain 111 48 -85.80 gain 48 112 -84.41 gain 112 48 -86.82 gain 48 113 -85.84 gain 113 48 -87.38 gain 48 114 -88.27 gain 114 48 -86.98 gain 48 115 -91.04 gain 115 48 -90.40 gain 48 116 -86.43 gain 116 48 -88.23 gain 48 117 -103.12 gain 117 48 -102.06 gain 48 118 -90.91 gain 118 48 -91.47 gain 48 119 -93.80 gain 119 48 -99.43 gain 48 120 -82.43 gain 120 48 -85.44 gain 48 121 -84.01 gain 121 48 -88.04 gain 48 122 -83.93 gain 122 48 -87.71 gain 48 123 -79.57 gain 123 48 -83.69 gain 48 124 -76.28 gain 124 48 -78.39 gain 48 125 -80.47 gain 125 48 -85.92 gain 48 126 -91.32 gain 126 48 -93.42 gain 48 127 -84.43 gain 127 48 -86.15 gain 48 128 -74.49 gain 128 48 -78.80 gain 48 129 -89.42 gain 129 48 -90.95 gain 48 130 -87.75 gain 130 48 -90.56 gain 48 131 -90.15 gain 131 48 -92.74 gain 48 132 -92.45 gain 132 48 -91.05 gain 48 133 -88.55 gain 133 48 -92.33 gain 48 134 -93.87 gain 134 48 -94.51 gain 48 135 -88.75 gain 135 48 -91.69 gain 48 136 -88.40 gain 136 48 -91.78 gain 48 137 -91.67 gain 137 48 -97.96 gain 48 138 -86.61 gain 138 48 -86.44 gain 48 139 -80.76 gain 139 48 -83.85 gain 48 140 -86.72 gain 140 48 -90.64 gain 48 141 -86.26 gain 141 48 -82.15 gain 48 142 -88.05 gain 142 48 -90.68 gain 48 143 -86.00 gain 143 48 -91.37 gain 48 144 -94.86 gain 144 48 -98.59 gain 48 145 -94.72 gain 145 48 -101.85 gain 48 146 -85.92 gain 146 48 -89.03 gain 48 147 -90.52 gain 147 48 -90.74 gain 48 148 -96.58 gain 148 48 -95.13 gain 48 149 -92.22 gain 149 48 -94.43 gain 48 150 -81.29 gain 150 48 -84.33 gain 48 151 -90.64 gain 151 48 -92.62 gain 48 152 -93.47 gain 152 48 -95.27 gain 48 153 -91.68 gain 153 48 -92.69 gain 48 154 -88.39 gain 154 48 -91.30 gain 48 155 -83.15 gain 155 48 -84.64 gain 48 156 -91.47 gain 156 48 -92.20 gain 48 157 -83.65 gain 157 48 -86.85 gain 48 158 -89.75 gain 158 48 -92.45 gain 48 159 -87.51 gain 159 48 -92.59 gain 48 160 -86.87 gain 160 48 -89.11 gain 48 161 -95.87 gain 161 48 -100.55 gain 48 162 -92.84 gain 162 48 -97.23 gain 48 163 -91.96 gain 163 48 -98.27 gain 48 164 -94.56 gain 164 48 -100.23 gain 48 165 -93.29 gain 165 48 -96.02 gain 48 166 -87.95 gain 166 48 -90.43 gain 48 167 -88.66 gain 167 48 -91.87 gain 48 168 -89.85 gain 168 48 -91.95 gain 48 169 -80.66 gain 169 48 -83.88 gain 48 170 -89.78 gain 170 48 -92.23 gain 48 171 -91.53 gain 171 48 -95.05 gain 48 172 -90.96 gain 172 48 -92.68 gain 48 173 -86.53 gain 173 48 -92.89 gain 48 174 -93.67 gain 174 48 -96.09 gain 48 175 -96.73 gain 175 48 -100.28 gain 48 176 -97.47 gain 176 48 -99.99 gain 48 177 -97.89 gain 177 48 -103.41 gain 48 178 -93.70 gain 178 48 -92.66 gain 48 179 -87.76 gain 179 48 -86.15 gain 48 180 -92.09 gain 180 48 -99.92 gain 48 181 -96.32 gain 181 48 -98.18 gain 48 182 -90.59 gain 182 48 -93.52 gain 48 183 -91.74 gain 183 48 -94.95 gain 48 184 -88.23 gain 184 48 -94.19 gain 48 185 -89.14 gain 185 48 -98.97 gain 48 186 -94.93 gain 186 48 -100.33 gain 48 187 -87.18 gain 187 48 -90.32 gain 48 188 -90.62 gain 188 48 -96.17 gain 48 189 -95.57 gain 189 48 -95.84 gain 48 190 -92.13 gain 190 48 -96.32 gain 48 191 -88.42 gain 191 48 -91.32 gain 48 192 -95.68 gain 192 48 -97.27 gain 48 193 -102.50 gain 193 48 -103.08 gain 48 194 -94.76 gain 194 48 -96.11 gain 48 195 -93.34 gain 195 48 -93.24 gain 48 196 -91.35 gain 196 48 -95.57 gain 48 197 -95.68 gain 197 48 -95.03 gain 48 198 -86.90 gain 198 48 -90.77 gain 48 199 -94.57 gain 199 48 -98.54 gain 48 200 -89.06 gain 200 48 -94.37 gain 48 201 -91.08 gain 201 48 -96.30 gain 48 202 -99.36 gain 202 48 -103.72 gain 48 203 -94.80 gain 203 48 -98.27 gain 48 204 -94.35 gain 204 48 -94.46 gain 48 205 -92.47 gain 205 48 -96.32 gain 48 206 -93.69 gain 206 48 -98.64 gain 48 207 -94.04 gain 207 48 -98.41 gain 48 208 -94.31 gain 208 48 -101.28 gain 48 209 -96.49 gain 209 48 -103.04 gain 48 210 -96.48 gain 210 48 -103.21 gain 48 211 -90.30 gain 211 48 -92.25 gain 48 212 -97.03 gain 212 48 -102.00 gain 48 213 -96.80 gain 213 48 -101.09 gain 48 214 -90.91 gain 214 48 -100.59 gain 48 215 -90.21 gain 215 48 -95.29 gain 48 216 -96.24 gain 216 48 -105.23 gain 48 217 -95.87 gain 217 48 -105.12 gain 48 218 -91.15 gain 218 48 -93.21 gain 48 219 -95.88 gain 219 48 -98.42 gain 48 220 -94.96 gain 220 48 -93.59 gain 48 221 -96.74 gain 221 48 -101.05 gain 48 222 -97.52 gain 222 48 -97.64 gain 48 223 -99.29 gain 223 48 -102.65 gain 48 224 -96.62 gain 224 48 -100.45 gain 49 50 -65.74 gain 50 49 -62.59 gain 49 51 -74.22 gain 51 49 -74.78 gain 49 52 -78.96 gain 52 49 -76.75 gain 49 53 -78.33 gain 53 49 -76.68 gain 49 54 -86.39 gain 54 49 -84.14 gain 49 55 -85.15 gain 55 49 -79.82 gain 49 56 -96.79 gain 56 49 -96.50 gain 49 57 -92.03 gain 57 49 -90.82 gain 49 58 -94.06 gain 58 49 -89.55 gain 49 59 -92.39 gain 59 49 -87.14 gain 49 60 -85.74 gain 60 49 -89.77 gain 49 61 -80.57 gain 61 49 -76.50 gain 49 62 -76.91 gain 62 49 -70.35 gain 49 63 -74.31 gain 63 49 -71.72 gain 49 64 -64.17 gain 64 49 -65.80 gain 49 65 -66.52 gain 65 49 -63.70 gain 49 66 -75.66 gain 66 49 -71.82 gain 49 67 -81.68 gain 67 49 -79.07 gain 49 68 -80.65 gain 68 49 -80.63 gain 49 69 -83.55 gain 69 49 -80.75 gain 49 70 -84.32 gain 70 49 -79.99 gain 49 71 -92.03 gain 71 49 -91.26 gain 49 72 -86.36 gain 72 49 -83.15 gain 49 73 -92.99 gain 73 49 -91.15 gain 49 74 -91.74 gain 74 49 -86.01 gain 49 75 -84.41 gain 75 49 -84.57 gain 49 76 -88.15 gain 76 49 -88.44 gain 49 77 -82.53 gain 77 49 -78.81 gain 49 78 -77.56 gain 78 49 -78.34 gain 49 79 -74.99 gain 79 49 -75.39 gain 49 80 -74.17 gain 80 49 -72.36 gain 49 81 -77.25 gain 81 49 -76.35 gain 49 82 -86.95 gain 82 49 -87.03 gain 49 83 -89.35 gain 83 49 -86.70 gain 49 84 -93.65 gain 84 49 -88.19 gain 49 85 -92.84 gain 85 49 -92.80 gain 49 86 -92.60 gain 86 49 -94.21 gain 49 87 -89.89 gain 87 49 -88.78 gain 49 88 -94.52 gain 88 49 -93.05 gain 49 89 -97.43 gain 89 49 -98.12 gain 49 90 -78.49 gain 90 49 -78.51 gain 49 91 -81.81 gain 91 49 -82.90 gain 49 92 -85.33 gain 92 49 -87.34 gain 49 93 -80.14 gain 93 49 -79.50 gain 49 94 -80.64 gain 94 49 -78.58 gain 49 95 -84.74 gain 95 49 -81.91 gain 49 96 -73.00 gain 96 49 -77.15 gain 49 97 -83.37 gain 97 49 -80.34 gain 49 98 -86.30 gain 98 49 -83.74 gain 49 99 -87.04 gain 99 49 -83.61 gain 49 100 -88.09 gain 100 49 -84.58 gain 49 101 -97.46 gain 101 49 -97.58 gain 49 102 -93.80 gain 102 49 -93.89 gain 49 103 -93.25 gain 103 49 -94.50 gain 49 104 -90.96 gain 104 49 -94.70 gain 49 105 -82.66 gain 105 49 -80.92 gain 49 106 -84.45 gain 106 49 -80.05 gain 49 107 -84.08 gain 107 49 -79.58 gain 49 108 -77.45 gain 108 49 -72.56 gain 49 109 -90.70 gain 109 49 -89.26 gain 49 110 -90.84 gain 110 49 -95.76 gain 49 111 -89.00 gain 111 49 -83.90 gain 49 112 -83.61 gain 112 49 -81.97 gain 49 113 -87.74 gain 113 49 -85.22 gain 49 114 -83.23 gain 114 49 -77.89 gain 49 115 -89.10 gain 115 49 -84.41 gain 49 116 -89.94 gain 116 49 -87.68 gain 49 117 -96.05 gain 117 49 -90.93 gain 49 118 -90.78 gain 118 49 -87.29 gain 49 119 -87.42 gain 119 49 -88.98 gain 49 120 -91.50 gain 120 49 -90.45 gain 49 121 -85.25 gain 121 49 -85.22 gain 49 122 -90.85 gain 122 49 -90.57 gain 49 123 -88.05 gain 123 49 -88.11 gain 49 124 -92.16 gain 124 49 -90.21 gain 49 125 -80.52 gain 125 49 -81.90 gain 49 126 -88.32 gain 126 49 -86.35 gain 49 127 -91.90 gain 127 49 -89.57 gain 49 128 -90.66 gain 128 49 -90.92 gain 49 129 -97.51 gain 129 49 -94.98 gain 49 130 -94.70 gain 130 49 -93.46 gain 49 131 -94.75 gain 131 49 -93.28 gain 49 132 -101.90 gain 132 49 -96.44 gain 49 133 -97.17 gain 133 49 -96.89 gain 49 134 -91.90 gain 134 49 -88.48 gain 49 135 -99.62 gain 135 49 -98.50 gain 49 136 -93.24 gain 136 49 -92.56 gain 49 137 -95.28 gain 137 49 -97.52 gain 49 138 -88.32 gain 138 49 -84.09 gain 49 139 -86.61 gain 139 49 -85.65 gain 49 140 -84.43 gain 140 49 -84.29 gain 49 141 -87.59 gain 141 49 -79.42 gain 49 142 -85.23 gain 142 49 -83.80 gain 49 143 -88.01 gain 143 49 -89.33 gain 49 144 -90.24 gain 144 49 -89.91 gain 49 145 -94.28 gain 145 49 -97.34 gain 49 146 -90.70 gain 146 49 -89.76 gain 49 147 -102.21 gain 147 49 -98.37 gain 49 148 -101.58 gain 148 49 -96.07 gain 49 149 -94.73 gain 149 49 -92.88 gain 49 150 -96.54 gain 150 49 -95.52 gain 49 151 -91.71 gain 151 49 -89.64 gain 49 152 -92.58 gain 152 49 -90.32 gain 49 153 -89.44 gain 153 49 -86.40 gain 49 154 -92.36 gain 154 49 -91.22 gain 49 155 -91.88 gain 155 49 -89.31 gain 49 156 -96.79 gain 156 49 -93.45 gain 49 157 -98.60 gain 157 49 -97.74 gain 49 158 -90.98 gain 158 49 -89.62 gain 49 159 -99.46 gain 159 49 -100.49 gain 49 160 -90.40 gain 160 49 -88.58 gain 49 161 -95.03 gain 161 49 -95.65 gain 49 162 -88.01 gain 162 49 -88.34 gain 49 163 -94.94 gain 163 49 -97.19 gain 49 164 -101.55 gain 164 49 -103.17 gain 49 165 -92.33 gain 165 49 -91.00 gain 49 166 -94.00 gain 166 49 -92.43 gain 49 167 -89.58 gain 167 49 -88.73 gain 49 168 -86.52 gain 168 49 -84.57 gain 49 169 -89.10 gain 169 49 -88.26 gain 49 170 -98.79 gain 170 49 -97.18 gain 49 171 -97.65 gain 171 49 -97.12 gain 49 172 -91.54 gain 172 49 -89.20 gain 49 173 -96.72 gain 173 49 -99.03 gain 49 174 -92.03 gain 174 49 -90.38 gain 49 175 -96.34 gain 175 49 -95.83 gain 49 176 -93.97 gain 176 49 -92.43 gain 49 177 -96.12 gain 177 49 -97.58 gain 49 178 -98.21 gain 178 49 -93.11 gain 49 179 -105.18 gain 179 49 -99.50 gain 49 180 -100.56 gain 180 49 -104.34 gain 49 181 -99.43 gain 181 49 -97.22 gain 49 182 -90.49 gain 182 49 -89.37 gain 49 183 -97.70 gain 183 49 -96.85 gain 49 184 -91.75 gain 184 49 -93.65 gain 49 185 -90.73 gain 185 49 -96.50 gain 49 186 -94.10 gain 186 49 -95.45 gain 49 187 -95.60 gain 187 49 -94.67 gain 49 188 -90.01 gain 188 49 -91.50 gain 49 189 -95.03 gain 189 49 -91.24 gain 49 190 -90.85 gain 190 49 -90.98 gain 49 191 -99.23 gain 191 49 -98.06 gain 49 192 -99.61 gain 192 49 -97.14 gain 49 193 -96.87 gain 193 49 -93.39 gain 49 194 -97.04 gain 194 49 -94.34 gain 49 195 -94.87 gain 195 49 -90.71 gain 49 196 -94.25 gain 196 49 -94.40 gain 49 197 -91.66 gain 197 49 -86.95 gain 49 198 -94.40 gain 198 49 -94.21 gain 49 199 -99.23 gain 199 49 -99.15 gain 49 200 -97.39 gain 200 49 -98.64 gain 49 201 -100.31 gain 201 49 -101.47 gain 49 202 -99.55 gain 202 49 -99.85 gain 49 203 -94.42 gain 203 49 -93.83 gain 49 204 -99.14 gain 204 49 -95.19 gain 49 205 -101.82 gain 205 49 -101.61 gain 49 206 -107.53 gain 206 49 -108.43 gain 49 207 -102.23 gain 207 49 -102.55 gain 49 208 -98.78 gain 208 49 -101.70 gain 49 209 -101.12 gain 209 49 -103.61 gain 49 210 -95.99 gain 210 49 -98.65 gain 49 211 -96.08 gain 211 49 -93.98 gain 49 212 -104.57 gain 212 49 -105.48 gain 49 213 -97.75 gain 213 49 -97.99 gain 49 214 -98.60 gain 214 49 -104.22 gain 49 215 -97.06 gain 215 49 -98.08 gain 49 216 -98.44 gain 216 49 -103.38 gain 49 217 -96.47 gain 217 49 -101.67 gain 49 218 -96.61 gain 218 49 -94.61 gain 49 219 -95.97 gain 219 49 -94.45 gain 49 220 -97.33 gain 220 49 -91.91 gain 49 221 -102.80 gain 221 49 -103.05 gain 49 222 -99.70 gain 222 49 -95.76 gain 49 223 -91.02 gain 223 49 -90.32 gain 49 224 -103.28 gain 224 49 -103.04 gain 50 51 -56.09 gain 51 50 -59.79 gain 50 52 -71.44 gain 52 50 -72.37 gain 50 53 -70.05 gain 53 50 -71.53 gain 50 54 -78.03 gain 54 50 -78.93 gain 50 55 -82.99 gain 55 50 -80.80 gain 50 56 -88.97 gain 56 50 -91.83 gain 50 57 -83.95 gain 57 50 -85.89 gain 50 58 -85.54 gain 58 50 -84.17 gain 50 59 -94.22 gain 59 50 -92.10 gain 50 60 -86.93 gain 60 50 -94.10 gain 50 61 -82.54 gain 61 50 -81.61 gain 50 62 -72.54 gain 62 50 -69.13 gain 50 63 -73.64 gain 63 50 -74.19 gain 50 64 -62.62 gain 64 50 -67.39 gain 50 65 -62.12 gain 65 50 -62.44 gain 50 66 -71.11 gain 66 50 -70.42 gain 50 67 -75.22 gain 67 50 -75.75 gain 50 68 -75.82 gain 68 50 -78.94 gain 50 69 -82.82 gain 69 50 -83.15 gain 50 70 -79.33 gain 70 50 -78.13 gain 50 71 -86.42 gain 71 50 -88.79 gain 50 72 -87.92 gain 72 50 -87.85 gain 50 73 -83.94 gain 73 50 -85.24 gain 50 74 -90.21 gain 74 50 -87.62 gain 50 75 -87.73 gain 75 50 -91.03 gain 50 76 -82.73 gain 76 50 -86.15 gain 50 77 -78.29 gain 77 50 -77.72 gain 50 78 -76.75 gain 78 50 -80.67 gain 50 79 -67.26 gain 79 50 -70.81 gain 50 80 -70.89 gain 80 50 -72.23 gain 50 81 -67.41 gain 81 50 -69.66 gain 50 82 -75.38 gain 82 50 -78.60 gain 50 83 -83.87 gain 83 50 -84.37 gain 50 84 -74.46 gain 84 50 -72.14 gain 50 85 -87.55 gain 85 50 -90.66 gain 50 86 -86.37 gain 86 50 -91.12 gain 50 87 -90.97 gain 87 50 -93.01 gain 50 88 -97.14 gain 88 50 -98.81 gain 50 89 -92.46 gain 89 50 -96.28 gain 50 90 -86.10 gain 90 50 -89.26 gain 50 91 -88.03 gain 91 50 -92.26 gain 50 92 -82.11 gain 92 50 -87.26 gain 50 93 -73.71 gain 93 50 -76.22 gain 50 94 -79.23 gain 94 50 -80.31 gain 50 95 -80.42 gain 95 50 -80.73 gain 50 96 -75.37 gain 96 50 -82.66 gain 50 97 -80.57 gain 97 50 -80.68 gain 50 98 -76.28 gain 98 50 -76.86 gain 50 99 -83.96 gain 99 50 -83.68 gain 50 100 -84.58 gain 100 50 -84.21 gain 50 101 -89.79 gain 101 50 -93.06 gain 50 102 -89.99 gain 102 50 -93.22 gain 50 103 -89.88 gain 103 50 -94.27 gain 50 104 -90.98 gain 104 50 -97.86 gain 50 105 -90.39 gain 105 50 -91.79 gain 50 106 -81.22 gain 106 50 -79.95 gain 50 107 -75.46 gain 107 50 -74.09 gain 50 108 -74.67 gain 108 50 -72.93 gain 50 109 -81.24 gain 109 50 -82.95 gain 50 110 -81.84 gain 110 50 -89.90 gain 50 111 -75.94 gain 111 50 -73.97 gain 50 112 -85.79 gain 112 50 -87.29 gain 50 113 -87.14 gain 113 50 -87.77 gain 50 114 -87.35 gain 114 50 -85.15 gain 50 115 -86.59 gain 115 50 -85.04 gain 50 116 -84.10 gain 116 50 -84.98 gain 50 117 -92.12 gain 117 50 -90.14 gain 50 118 -90.26 gain 118 50 -89.91 gain 50 119 -95.54 gain 119 50 -100.24 gain 50 120 -86.46 gain 120 50 -88.54 gain 50 121 -89.65 gain 121 50 -92.76 gain 50 122 -90.04 gain 122 50 -92.90 gain 50 123 -89.04 gain 123 50 -92.24 gain 50 124 -91.83 gain 124 50 -93.02 gain 50 125 -81.61 gain 125 50 -86.14 gain 50 126 -85.50 gain 126 50 -86.68 gain 50 127 -88.80 gain 127 50 -89.61 gain 50 128 -88.79 gain 128 50 -92.19 gain 50 129 -89.22 gain 129 50 -89.83 gain 50 130 -87.16 gain 130 50 -89.05 gain 50 131 -90.10 gain 131 50 -91.77 gain 50 132 -87.63 gain 132 50 -85.31 gain 50 133 -81.77 gain 133 50 -84.63 gain 50 134 -98.72 gain 134 50 -98.44 gain 50 135 -84.85 gain 135 50 -86.87 gain 50 136 -89.59 gain 136 50 -92.05 gain 50 137 -93.35 gain 137 50 -98.73 gain 50 138 -93.10 gain 138 50 -92.01 gain 50 139 -87.33 gain 139 50 -89.50 gain 50 140 -88.83 gain 140 50 -91.83 gain 50 141 -80.92 gain 141 50 -75.89 gain 50 142 -91.39 gain 142 50 -93.10 gain 50 143 -83.69 gain 143 50 -88.14 gain 50 144 -86.44 gain 144 50 -89.25 gain 50 145 -80.43 gain 145 50 -86.63 gain 50 146 -89.01 gain 146 50 -91.21 gain 50 147 -94.01 gain 147 50 -93.31 gain 50 148 -96.98 gain 148 50 -94.61 gain 50 149 -91.33 gain 149 50 -92.61 gain 50 150 -97.04 gain 150 50 -99.16 gain 50 151 -92.22 gain 151 50 -93.28 gain 50 152 -87.19 gain 152 50 -88.07 gain 50 153 -88.75 gain 153 50 -88.84 gain 50 154 -89.33 gain 154 50 -91.33 gain 50 155 -89.99 gain 155 50 -90.56 gain 50 156 -93.91 gain 156 50 -93.71 gain 50 157 -93.14 gain 157 50 -95.42 gain 50 158 -86.13 gain 158 50 -87.92 gain 50 159 -89.08 gain 159 50 -93.25 gain 50 160 -92.21 gain 160 50 -93.53 gain 50 161 -90.52 gain 161 50 -94.28 gain 50 162 -91.50 gain 162 50 -94.97 gain 50 163 -88.67 gain 163 50 -94.05 gain 50 164 -104.71 gain 164 50 -109.46 gain 50 165 -96.55 gain 165 50 -98.36 gain 50 166 -89.64 gain 166 50 -91.21 gain 50 167 -87.55 gain 167 50 -89.84 gain 50 168 -89.71 gain 168 50 -90.89 gain 50 169 -88.84 gain 169 50 -91.14 gain 50 170 -91.68 gain 170 50 -93.21 gain 50 171 -93.55 gain 171 50 -96.16 gain 50 172 -87.96 gain 172 50 -88.75 gain 50 173 -85.22 gain 173 50 -90.67 gain 50 174 -90.87 gain 174 50 -92.37 gain 50 175 -92.98 gain 175 50 -95.60 gain 50 176 -88.54 gain 176 50 -90.14 gain 50 177 -91.92 gain 177 50 -96.52 gain 50 178 -93.79 gain 178 50 -91.83 gain 50 179 -100.93 gain 179 50 -98.39 gain 50 180 -95.19 gain 180 50 -102.10 gain 50 181 -90.47 gain 181 50 -91.41 gain 50 182 -97.65 gain 182 50 -99.67 gain 50 183 -88.09 gain 183 50 -90.38 gain 50 184 -92.87 gain 184 50 -97.91 gain 50 185 -92.32 gain 185 50 -101.23 gain 50 186 -86.55 gain 186 50 -91.04 gain 50 187 -90.15 gain 187 50 -92.37 gain 50 188 -91.85 gain 188 50 -96.48 gain 50 189 -91.54 gain 189 50 -90.90 gain 50 190 -87.05 gain 190 50 -90.32 gain 50 191 -91.90 gain 191 50 -93.88 gain 50 192 -94.91 gain 192 50 -95.58 gain 50 193 -92.18 gain 193 50 -91.84 gain 50 194 -99.94 gain 194 50 -100.38 gain 50 195 -90.40 gain 195 50 -89.39 gain 50 196 -90.73 gain 196 50 -94.03 gain 50 197 -89.70 gain 197 50 -88.13 gain 50 198 -92.46 gain 198 50 -95.40 gain 50 199 -102.88 gain 199 50 -105.94 gain 50 200 -99.88 gain 200 50 -104.27 gain 50 201 -93.17 gain 201 50 -97.47 gain 50 202 -98.85 gain 202 50 -102.28 gain 50 203 -89.61 gain 203 50 -92.16 gain 50 204 -90.63 gain 204 50 -89.82 gain 50 205 -100.40 gain 205 50 -103.33 gain 50 206 -92.51 gain 206 50 -96.55 gain 50 207 -87.21 gain 207 50 -90.66 gain 50 208 -98.38 gain 208 50 -104.44 gain 50 209 -99.33 gain 209 50 -104.96 gain 50 210 -96.68 gain 210 50 -102.48 gain 50 211 -89.32 gain 211 50 -90.36 gain 50 212 -97.58 gain 212 50 -101.63 gain 50 213 -94.35 gain 213 50 -97.72 gain 50 214 -98.99 gain 214 50 -107.75 gain 50 215 -99.24 gain 215 50 -103.40 gain 50 216 -96.28 gain 216 50 -104.35 gain 50 217 -96.50 gain 217 50 -104.83 gain 50 218 -95.38 gain 218 50 -96.53 gain 50 219 -97.90 gain 219 50 -99.53 gain 50 220 -87.31 gain 220 50 -85.02 gain 50 221 -97.56 gain 221 50 -100.95 gain 50 222 -96.62 gain 222 50 -95.81 gain 50 223 -94.63 gain 223 50 -97.07 gain 50 224 -98.63 gain 224 50 -101.54 gain 51 52 -66.65 gain 52 51 -63.88 gain 51 53 -74.60 gain 53 51 -72.40 gain 51 54 -85.05 gain 54 51 -82.25 gain 51 55 -79.21 gain 55 51 -73.33 gain 51 56 -93.23 gain 56 51 -92.39 gain 51 57 -98.14 gain 57 51 -96.39 gain 51 58 -82.83 gain 58 51 -77.77 gain 51 59 -94.05 gain 59 51 -88.25 gain 51 60 -83.56 gain 60 51 -87.03 gain 51 61 -84.68 gain 61 51 -80.06 gain 51 62 -86.29 gain 62 51 -79.18 gain 51 63 -76.39 gain 63 51 -73.24 gain 51 64 -76.80 gain 64 51 -77.88 gain 51 65 -66.54 gain 65 51 -63.17 gain 51 66 -62.41 gain 66 51 -58.02 gain 51 67 -70.17 gain 67 51 -67.01 gain 51 68 -80.44 gain 68 51 -79.86 gain 51 69 -83.70 gain 69 51 -80.34 gain 51 70 -85.12 gain 70 51 -80.23 gain 51 71 -88.88 gain 71 51 -87.56 gain 51 72 -92.23 gain 72 51 -88.46 gain 51 73 -97.64 gain 73 51 -95.25 gain 51 74 -92.38 gain 74 51 -86.10 gain 51 75 -88.85 gain 75 51 -88.46 gain 51 76 -86.23 gain 76 51 -85.96 gain 51 77 -86.33 gain 77 51 -82.06 gain 51 78 -85.41 gain 78 51 -85.64 gain 51 79 -80.33 gain 79 51 -80.18 gain 51 80 -77.13 gain 80 51 -74.77 gain 51 81 -75.27 gain 81 51 -73.82 gain 51 82 -75.19 gain 82 51 -74.72 gain 51 83 -80.84 gain 83 51 -77.64 gain 51 84 -81.95 gain 84 51 -75.94 gain 51 85 -81.58 gain 85 51 -81.00 gain 51 86 -87.64 gain 86 51 -88.69 gain 51 87 -93.41 gain 87 51 -91.75 gain 51 88 -90.61 gain 88 51 -88.60 gain 51 89 -93.26 gain 89 51 -93.39 gain 51 90 -85.52 gain 90 51 -84.99 gain 51 91 -88.95 gain 91 51 -89.48 gain 51 92 -88.68 gain 92 51 -90.13 gain 51 93 -83.53 gain 93 51 -82.34 gain 51 94 -77.18 gain 94 51 -74.56 gain 51 95 -83.46 gain 95 51 -80.08 gain 51 96 -77.07 gain 96 51 -80.66 gain 51 97 -82.02 gain 97 51 -78.43 gain 51 98 -87.33 gain 98 51 -84.22 gain 51 99 -89.82 gain 99 51 -85.84 gain 51 100 -87.38 gain 100 51 -83.32 gain 51 101 -88.51 gain 101 51 -88.07 gain 51 102 -93.58 gain 102 51 -93.12 gain 51 103 -93.69 gain 103 51 -94.39 gain 51 104 -98.01 gain 104 51 -101.19 gain 51 105 -95.61 gain 105 51 -93.31 gain 51 106 -87.16 gain 106 51 -82.19 gain 51 107 -96.52 gain 107 51 -91.46 gain 51 108 -85.58 gain 108 51 -80.14 gain 51 109 -84.76 gain 109 51 -82.78 gain 51 110 -89.53 gain 110 51 -93.90 gain 51 111 -82.69 gain 111 51 -77.03 gain 51 112 -88.75 gain 112 51 -86.55 gain 51 113 -87.27 gain 113 51 -84.20 gain 51 114 -86.47 gain 114 51 -80.58 gain 51 115 -92.18 gain 115 51 -86.93 gain 51 116 -92.41 gain 116 51 -89.60 gain 51 117 -93.91 gain 117 51 -88.24 gain 51 118 -93.68 gain 118 51 -89.63 gain 51 119 -91.88 gain 119 51 -92.89 gain 51 120 -93.18 gain 120 51 -91.58 gain 51 121 -90.84 gain 121 51 -90.25 gain 51 122 -94.71 gain 122 51 -93.88 gain 51 123 -87.16 gain 123 51 -86.67 gain 51 124 -90.58 gain 124 51 -88.08 gain 51 125 -88.65 gain 125 51 -89.49 gain 51 126 -85.22 gain 126 51 -82.70 gain 51 127 -92.48 gain 127 51 -89.59 gain 51 128 -83.47 gain 128 51 -83.17 gain 51 129 -86.96 gain 129 51 -83.88 gain 51 130 -89.54 gain 130 51 -87.75 gain 51 131 -89.60 gain 131 51 -87.58 gain 51 132 -90.59 gain 132 51 -84.58 gain 51 133 -98.15 gain 133 51 -97.31 gain 51 134 -92.92 gain 134 51 -88.95 gain 51 135 -87.79 gain 135 51 -86.11 gain 51 136 -92.19 gain 136 51 -90.96 gain 51 137 -96.90 gain 137 51 -98.59 gain 51 138 -87.83 gain 138 51 -83.04 gain 51 139 -92.95 gain 139 51 -91.43 gain 51 140 -85.63 gain 140 51 -84.94 gain 51 141 -87.24 gain 141 51 -78.52 gain 51 142 -86.01 gain 142 51 -84.03 gain 51 143 -86.92 gain 143 51 -87.68 gain 51 144 -96.95 gain 144 51 -96.08 gain 51 145 -85.52 gain 145 51 -88.03 gain 51 146 -97.55 gain 146 51 -96.05 gain 51 147 -87.57 gain 147 51 -83.18 gain 51 148 -93.88 gain 148 51 -87.82 gain 51 149 -101.92 gain 149 51 -99.52 gain 51 150 -98.69 gain 150 51 -97.12 gain 51 151 -99.02 gain 151 51 -96.40 gain 51 152 -83.88 gain 152 51 -81.07 gain 51 153 -98.65 gain 153 51 -95.05 gain 51 154 -95.06 gain 154 51 -93.36 gain 51 155 -88.93 gain 155 51 -85.80 gain 51 156 -91.43 gain 156 51 -87.54 gain 51 157 -93.08 gain 157 51 -91.67 gain 51 158 -93.70 gain 158 51 -91.79 gain 51 159 -88.74 gain 159 51 -89.22 gain 51 160 -88.49 gain 160 51 -86.12 gain 51 161 -93.22 gain 161 51 -93.29 gain 51 162 -99.77 gain 162 51 -99.54 gain 51 163 -101.49 gain 163 51 -103.19 gain 51 164 -98.25 gain 164 51 -99.31 gain 51 165 -102.68 gain 165 51 -100.79 gain 51 166 -94.75 gain 166 51 -92.62 gain 51 167 -95.90 gain 167 51 -94.49 gain 51 168 -91.93 gain 168 51 -89.42 gain 51 169 -95.43 gain 169 51 -94.03 gain 51 170 -95.20 gain 170 51 -93.04 gain 51 171 -94.22 gain 171 51 -93.13 gain 51 172 -99.19 gain 172 51 -96.30 gain 51 173 -84.01 gain 173 51 -85.76 gain 51 174 -100.52 gain 174 51 -98.32 gain 51 175 -93.75 gain 175 51 -92.69 gain 51 176 -100.06 gain 176 51 -97.97 gain 51 177 -99.11 gain 177 51 -100.02 gain 51 178 -94.06 gain 178 51 -88.41 gain 51 179 -100.40 gain 179 51 -94.18 gain 51 180 -107.26 gain 180 51 -110.48 gain 51 181 -99.73 gain 181 51 -96.97 gain 51 182 -92.72 gain 182 51 -91.04 gain 51 183 -99.51 gain 183 51 -98.11 gain 51 184 -95.97 gain 184 51 -97.32 gain 51 185 -98.49 gain 185 51 -103.71 gain 51 186 -89.57 gain 186 51 -90.37 gain 51 187 -90.93 gain 187 51 -89.46 gain 51 188 -96.78 gain 188 51 -97.71 gain 51 189 -95.06 gain 189 51 -90.72 gain 51 190 -96.57 gain 190 51 -96.14 gain 51 191 -104.84 gain 191 51 -103.12 gain 51 192 -103.97 gain 192 51 -100.95 gain 51 193 -96.57 gain 193 51 -92.54 gain 51 194 -95.56 gain 194 51 -92.31 gain 51 195 -99.50 gain 195 51 -94.80 gain 51 196 -99.39 gain 196 51 -98.99 gain 51 197 -104.91 gain 197 51 -99.65 gain 51 198 -98.94 gain 198 51 -98.19 gain 51 199 -98.06 gain 199 51 -97.42 gain 51 200 -98.81 gain 200 51 -99.51 gain 51 201 -92.22 gain 201 51 -92.82 gain 51 202 -90.93 gain 202 51 -90.67 gain 51 203 -99.90 gain 203 51 -98.75 gain 51 204 -102.13 gain 204 51 -97.63 gain 51 205 -91.33 gain 205 51 -90.56 gain 51 206 -97.27 gain 206 51 -97.62 gain 51 207 -96.58 gain 207 51 -96.35 gain 51 208 -100.96 gain 208 51 -103.32 gain 51 209 -101.13 gain 209 51 -103.06 gain 51 210 -102.26 gain 210 51 -104.38 gain 51 211 -98.42 gain 211 51 -95.77 gain 51 212 -101.04 gain 212 51 -101.40 gain 51 213 -90.09 gain 213 51 -89.77 gain 51 214 -94.19 gain 214 51 -99.26 gain 51 215 -100.35 gain 215 51 -100.82 gain 51 216 -99.36 gain 216 51 -103.74 gain 51 217 -107.35 gain 217 51 -112.00 gain 51 218 -97.54 gain 218 51 -94.99 gain 51 219 -99.46 gain 219 51 -97.40 gain 51 220 -101.48 gain 220 51 -95.50 gain 51 221 -104.88 gain 221 51 -104.58 gain 51 222 -98.57 gain 222 51 -94.08 gain 51 223 -99.55 gain 223 51 -98.29 gain 51 224 -100.21 gain 224 51 -99.43 gain 52 53 -62.43 gain 53 52 -62.98 gain 52 54 -82.74 gain 54 52 -82.70 gain 52 55 -73.29 gain 55 52 -70.17 gain 52 56 -80.26 gain 56 52 -82.19 gain 52 57 -82.33 gain 57 52 -83.34 gain 52 58 -89.75 gain 58 52 -87.45 gain 52 59 -95.55 gain 59 52 -92.51 gain 52 60 -87.75 gain 60 52 -93.99 gain 52 61 -84.76 gain 61 52 -82.90 gain 52 62 -81.95 gain 62 52 -77.60 gain 52 63 -80.72 gain 63 52 -80.34 gain 52 64 -81.47 gain 64 52 -85.32 gain 52 65 -70.59 gain 65 52 -69.98 gain 52 66 -68.21 gain 66 52 -66.58 gain 52 67 -69.01 gain 67 52 -68.61 gain 52 68 -64.36 gain 68 52 -66.55 gain 52 69 -77.96 gain 69 52 -77.36 gain 52 70 -74.79 gain 70 52 -72.66 gain 52 71 -81.82 gain 71 52 -83.26 gain 52 72 -86.25 gain 72 52 -85.25 gain 52 73 -91.35 gain 73 52 -91.72 gain 52 74 -90.90 gain 74 52 -87.39 gain 52 75 -94.39 gain 75 52 -96.77 gain 52 76 -89.92 gain 76 52 -92.41 gain 52 77 -82.39 gain 77 52 -80.88 gain 52 78 -89.17 gain 78 52 -92.16 gain 52 79 -81.18 gain 79 52 -83.79 gain 52 80 -78.91 gain 80 52 -79.31 gain 52 81 -71.36 gain 81 52 -72.68 gain 52 82 -76.36 gain 82 52 -78.66 gain 52 83 -69.93 gain 83 52 -69.50 gain 52 84 -78.36 gain 84 52 -75.11 gain 52 85 -76.33 gain 85 52 -78.51 gain 52 86 -82.59 gain 86 52 -86.40 gain 52 87 -85.95 gain 87 52 -87.05 gain 52 88 -82.94 gain 88 52 -83.69 gain 52 89 -89.20 gain 89 52 -92.09 gain 52 90 -91.18 gain 90 52 -93.41 gain 52 91 -80.71 gain 91 52 -84.01 gain 52 92 -89.22 gain 92 52 -93.44 gain 52 93 -82.42 gain 93 52 -84.00 gain 52 94 -84.18 gain 94 52 -84.32 gain 52 95 -78.33 gain 95 52 -77.71 gain 52 96 -82.50 gain 96 52 -88.86 gain 52 97 -70.12 gain 97 52 -69.30 gain 52 98 -80.36 gain 98 52 -80.01 gain 52 99 -78.57 gain 99 52 -77.35 gain 52 100 -88.74 gain 100 52 -87.44 gain 52 101 -82.00 gain 101 52 -84.34 gain 52 102 -85.26 gain 102 52 -87.56 gain 52 103 -96.69 gain 103 52 -100.15 gain 52 104 -91.85 gain 104 52 -97.80 gain 52 105 -94.18 gain 105 52 -94.65 gain 52 106 -84.05 gain 106 52 -81.85 gain 52 107 -87.93 gain 107 52 -85.63 gain 52 108 -90.92 gain 108 52 -88.25 gain 52 109 -83.23 gain 109 52 -84.00 gain 52 110 -86.16 gain 110 52 -93.30 gain 52 111 -77.94 gain 111 52 -75.05 gain 52 112 -86.69 gain 112 52 -87.26 gain 52 113 -85.61 gain 113 52 -85.31 gain 52 114 -80.76 gain 114 52 -77.63 gain 52 115 -86.58 gain 115 52 -84.10 gain 52 116 -84.81 gain 116 52 -84.76 gain 52 117 -85.48 gain 117 52 -82.58 gain 52 118 -89.55 gain 118 52 -88.26 gain 52 119 -88.85 gain 119 52 -92.63 gain 52 120 -95.76 gain 120 52 -96.91 gain 52 121 -97.96 gain 121 52 -100.14 gain 52 122 -81.06 gain 122 52 -82.99 gain 52 123 -90.25 gain 123 52 -92.52 gain 52 124 -89.63 gain 124 52 -89.89 gain 52 125 -82.59 gain 125 52 -86.19 gain 52 126 -81.31 gain 126 52 -81.55 gain 52 127 -80.49 gain 127 52 -80.36 gain 52 128 -76.68 gain 128 52 -79.14 gain 52 129 -81.13 gain 129 52 -80.81 gain 52 130 -82.58 gain 130 52 -83.55 gain 52 131 -83.21 gain 131 52 -83.95 gain 52 132 -98.87 gain 132 52 -95.62 gain 52 133 -92.57 gain 133 52 -94.50 gain 52 134 -95.94 gain 134 52 -94.73 gain 52 135 -90.94 gain 135 52 -92.04 gain 52 136 -93.71 gain 136 52 -95.24 gain 52 137 -92.54 gain 137 52 -96.99 gain 52 138 -83.97 gain 138 52 -81.95 gain 52 139 -86.90 gain 139 52 -88.14 gain 52 140 -84.62 gain 140 52 -86.70 gain 52 141 -89.29 gain 141 52 -83.33 gain 52 142 -92.73 gain 142 52 -93.52 gain 52 143 -90.47 gain 143 52 -93.99 gain 52 144 -88.88 gain 144 52 -90.77 gain 52 145 -86.33 gain 145 52 -91.60 gain 52 146 -92.36 gain 146 52 -93.62 gain 52 147 -94.34 gain 147 52 -92.72 gain 52 148 -92.20 gain 148 52 -88.91 gain 52 149 -92.01 gain 149 52 -92.37 gain 52 150 -96.54 gain 150 52 -97.74 gain 52 151 -93.36 gain 151 52 -93.50 gain 52 152 -94.31 gain 152 52 -94.27 gain 52 153 -87.72 gain 153 52 -86.89 gain 52 154 -89.39 gain 154 52 -90.46 gain 52 155 -86.11 gain 155 52 -85.76 gain 52 156 -84.68 gain 156 52 -83.55 gain 52 157 -87.70 gain 157 52 -89.06 gain 52 158 -94.33 gain 158 52 -95.18 gain 52 159 -84.19 gain 159 52 -87.43 gain 52 160 -93.21 gain 160 52 -93.60 gain 52 161 -97.87 gain 161 52 -100.70 gain 52 162 -91.16 gain 162 52 -93.70 gain 52 163 -98.74 gain 163 52 -103.20 gain 52 164 -102.37 gain 164 52 -106.20 gain 52 165 -86.54 gain 165 52 -87.42 gain 52 166 -89.73 gain 166 52 -90.36 gain 52 167 -92.58 gain 167 52 -93.94 gain 52 168 -95.69 gain 168 52 -95.94 gain 52 169 -88.33 gain 169 52 -89.69 gain 52 170 -93.22 gain 170 52 -93.82 gain 52 171 -85.96 gain 171 52 -87.64 gain 52 172 -84.05 gain 172 52 -83.92 gain 52 173 -94.31 gain 173 52 -98.83 gain 52 174 -93.37 gain 174 52 -93.94 gain 52 175 -94.48 gain 175 52 -96.18 gain 52 176 -92.80 gain 176 52 -93.47 gain 52 177 -93.53 gain 177 52 -97.20 gain 52 178 -90.15 gain 178 52 -87.26 gain 52 179 -93.92 gain 179 52 -90.46 gain 52 180 -95.85 gain 180 52 -101.84 gain 52 181 -89.69 gain 181 52 -89.69 gain 52 182 -94.45 gain 182 52 -95.55 gain 52 183 -98.68 gain 183 52 -100.05 gain 52 184 -98.54 gain 184 52 -102.65 gain 52 185 -91.50 gain 185 52 -99.48 gain 52 186 -96.14 gain 186 52 -99.69 gain 52 187 -93.52 gain 187 52 -94.81 gain 52 188 -90.26 gain 188 52 -93.96 gain 52 189 -93.89 gain 189 52 -92.32 gain 52 190 -85.78 gain 190 52 -88.12 gain 52 191 -97.17 gain 191 52 -98.22 gain 52 192 -91.72 gain 192 52 -91.47 gain 52 193 -97.94 gain 193 52 -96.67 gain 52 194 -102.33 gain 194 52 -101.84 gain 52 195 -95.66 gain 195 52 -93.72 gain 52 196 -98.45 gain 196 52 -100.82 gain 52 197 -89.90 gain 197 52 -87.40 gain 52 198 -97.55 gain 198 52 -99.57 gain 52 199 -93.97 gain 199 52 -96.10 gain 52 200 -97.95 gain 200 52 -101.41 gain 52 201 -97.60 gain 201 52 -100.97 gain 52 202 -93.10 gain 202 52 -95.61 gain 52 203 -97.56 gain 203 52 -99.17 gain 52 204 -93.42 gain 204 52 -91.68 gain 52 205 -93.22 gain 205 52 -95.22 gain 52 206 -94.13 gain 206 52 -97.24 gain 52 207 -90.61 gain 207 52 -93.14 gain 52 208 -94.94 gain 208 52 -100.07 gain 52 209 -96.95 gain 209 52 -101.65 gain 52 210 -102.09 gain 210 52 -106.97 gain 52 211 -102.21 gain 211 52 -102.32 gain 52 212 -100.06 gain 212 52 -103.18 gain 52 213 -95.83 gain 213 52 -98.27 gain 52 214 -92.04 gain 214 52 -99.88 gain 52 215 -102.98 gain 215 52 -106.22 gain 52 216 -94.71 gain 216 52 -101.86 gain 52 217 -97.78 gain 217 52 -105.19 gain 52 218 -96.57 gain 218 52 -96.78 gain 52 219 -91.64 gain 219 52 -92.34 gain 52 220 -84.25 gain 220 52 -81.03 gain 52 221 -101.04 gain 221 52 -103.50 gain 52 222 -99.52 gain 222 52 -97.79 gain 52 223 -102.22 gain 223 52 -103.73 gain 52 224 -102.00 gain 224 52 -103.98 gain 53 54 -63.15 gain 54 53 -62.56 gain 53 55 -67.46 gain 55 53 -63.78 gain 53 56 -81.73 gain 56 53 -83.10 gain 53 57 -75.06 gain 57 53 -75.52 gain 53 58 -86.33 gain 58 53 -83.47 gain 53 59 -92.22 gain 59 53 -88.62 gain 53 60 -83.48 gain 60 53 -89.16 gain 53 61 -91.27 gain 61 53 -88.86 gain 53 62 -87.28 gain 62 53 -82.37 gain 53 63 -84.20 gain 63 53 -83.26 gain 53 64 -85.19 gain 64 53 -88.48 gain 53 65 -80.68 gain 65 53 -79.52 gain 53 66 -75.66 gain 66 53 -73.48 gain 53 67 -68.64 gain 67 53 -67.68 gain 53 68 -60.03 gain 68 53 -61.67 gain 53 69 -67.39 gain 69 53 -66.24 gain 53 70 -73.78 gain 70 53 -71.10 gain 53 71 -77.56 gain 71 53 -78.45 gain 53 72 -83.05 gain 72 53 -81.49 gain 53 73 -87.43 gain 73 53 -87.25 gain 53 74 -90.35 gain 74 53 -86.28 gain 53 75 -89.34 gain 75 53 -91.15 gain 53 76 -87.70 gain 76 53 -89.64 gain 53 77 -83.62 gain 77 53 -81.56 gain 53 78 -88.69 gain 78 53 -91.12 gain 53 79 -84.79 gain 79 53 -86.85 gain 53 80 -79.74 gain 80 53 -79.58 gain 53 81 -80.05 gain 81 53 -80.81 gain 53 82 -74.91 gain 82 53 -76.64 gain 53 83 -72.65 gain 83 53 -71.66 gain 53 84 -75.26 gain 84 53 -71.46 gain 53 85 -77.49 gain 85 53 -79.11 gain 53 86 -84.25 gain 86 53 -87.51 gain 53 87 -88.60 gain 87 53 -89.15 gain 53 88 -84.93 gain 88 53 -85.13 gain 53 89 -85.90 gain 89 53 -88.24 gain 53 90 -88.11 gain 90 53 -89.78 gain 53 91 -95.48 gain 91 53 -98.22 gain 53 92 -91.27 gain 92 53 -94.93 gain 53 93 -86.23 gain 93 53 -87.25 gain 53 94 -89.90 gain 94 53 -89.49 gain 53 95 -84.24 gain 95 53 -83.07 gain 53 96 -75.61 gain 96 53 -81.41 gain 53 97 -81.47 gain 97 53 -80.10 gain 53 98 -80.63 gain 98 53 -79.72 gain 53 99 -88.48 gain 99 53 -86.70 gain 53 100 -86.23 gain 100 53 -84.37 gain 53 101 -79.75 gain 101 53 -81.53 gain 53 102 -87.90 gain 102 53 -89.64 gain 53 103 -91.86 gain 103 53 -94.77 gain 53 104 -82.63 gain 104 53 -88.03 gain 53 105 -96.07 gain 105 53 -95.99 gain 53 106 -87.98 gain 106 53 -85.23 gain 53 107 -93.64 gain 107 53 -90.79 gain 53 108 -83.55 gain 108 53 -80.32 gain 53 109 -83.44 gain 109 53 -83.66 gain 53 110 -85.14 gain 110 53 -91.72 gain 53 111 -84.89 gain 111 53 -81.44 gain 53 112 -84.04 gain 112 53 -84.05 gain 53 113 -83.69 gain 113 53 -82.84 gain 53 114 -82.09 gain 114 53 -78.40 gain 53 115 -83.41 gain 115 53 -80.37 gain 53 116 -85.43 gain 116 53 -84.83 gain 53 117 -92.53 gain 117 53 -89.07 gain 53 118 -87.99 gain 118 53 -86.15 gain 53 119 -100.33 gain 119 53 -103.55 gain 53 120 -93.60 gain 120 53 -94.20 gain 53 121 -91.68 gain 121 53 -93.31 gain 53 122 -91.27 gain 122 53 -92.65 gain 53 123 -92.00 gain 123 53 -93.71 gain 53 124 -91.14 gain 124 53 -90.84 gain 53 125 -87.00 gain 125 53 -90.05 gain 53 126 -89.75 gain 126 53 -89.44 gain 53 127 -86.86 gain 127 53 -86.17 gain 53 128 -82.60 gain 128 53 -84.51 gain 53 129 -79.71 gain 129 53 -78.83 gain 53 130 -82.98 gain 130 53 -83.39 gain 53 131 -86.07 gain 131 53 -86.26 gain 53 132 -88.96 gain 132 53 -85.15 gain 53 133 -86.83 gain 133 53 -88.20 gain 53 134 -86.60 gain 134 53 -84.83 gain 53 135 -98.18 gain 135 53 -98.72 gain 53 136 -93.32 gain 136 53 -94.30 gain 53 137 -94.14 gain 137 53 -98.03 gain 53 138 -86.92 gain 138 53 -84.34 gain 53 139 -92.80 gain 139 53 -93.49 gain 53 140 -84.92 gain 140 53 -86.43 gain 53 141 -90.33 gain 141 53 -83.82 gain 53 142 -93.24 gain 142 53 -93.46 gain 53 143 -92.40 gain 143 53 -95.37 gain 53 144 -90.77 gain 144 53 -92.10 gain 53 145 -91.83 gain 145 53 -96.55 gain 53 146 -89.36 gain 146 53 -90.07 gain 53 147 -94.66 gain 147 53 -92.48 gain 53 148 -92.36 gain 148 53 -88.51 gain 53 149 -84.47 gain 149 53 -84.27 gain 53 150 -96.11 gain 150 53 -96.74 gain 53 151 -89.71 gain 151 53 -89.29 gain 53 152 -93.69 gain 152 53 -93.09 gain 53 153 -89.38 gain 153 53 -87.99 gain 53 154 -86.58 gain 154 53 -87.09 gain 53 155 -96.52 gain 155 53 -95.60 gain 53 156 -92.68 gain 156 53 -90.99 gain 53 157 -94.96 gain 157 53 -95.75 gain 53 158 -89.66 gain 158 53 -89.95 gain 53 159 -91.40 gain 159 53 -94.08 gain 53 160 -100.09 gain 160 53 -99.93 gain 53 161 -84.54 gain 161 53 -86.82 gain 53 162 -93.94 gain 162 53 -95.92 gain 53 163 -94.44 gain 163 53 -98.33 gain 53 164 -96.70 gain 164 53 -99.97 gain 53 165 -99.24 gain 165 53 -99.57 gain 53 166 -94.61 gain 166 53 -94.69 gain 53 167 -100.37 gain 167 53 -101.17 gain 53 168 -94.66 gain 168 53 -94.36 gain 53 169 -91.32 gain 169 53 -92.13 gain 53 170 -92.59 gain 170 53 -92.63 gain 53 171 -85.71 gain 171 53 -86.84 gain 53 172 -88.37 gain 172 53 -87.68 gain 53 173 -87.28 gain 173 53 -91.24 gain 53 174 -88.72 gain 174 53 -88.72 gain 53 175 -99.33 gain 175 53 -100.47 gain 53 176 -91.19 gain 176 53 -91.30 gain 53 177 -90.92 gain 177 53 -94.03 gain 53 178 -95.50 gain 178 53 -92.05 gain 53 179 -95.51 gain 179 53 -91.49 gain 53 180 -94.77 gain 180 53 -100.20 gain 53 181 -98.19 gain 181 53 -97.64 gain 53 182 -96.48 gain 182 53 -97.02 gain 53 183 -89.63 gain 183 53 -90.43 gain 53 184 -98.13 gain 184 53 -101.69 gain 53 185 -90.79 gain 185 53 -98.21 gain 53 186 -93.01 gain 186 53 -96.01 gain 53 187 -86.83 gain 187 53 -87.56 gain 53 188 -93.91 gain 188 53 -97.06 gain 53 189 -95.89 gain 189 53 -93.76 gain 53 190 -92.54 gain 190 53 -94.33 gain 53 191 -86.09 gain 191 53 -86.58 gain 53 192 -92.36 gain 192 53 -91.55 gain 53 193 -85.72 gain 193 53 -83.90 gain 53 194 -93.86 gain 194 53 -92.82 gain 53 195 -105.87 gain 195 53 -103.37 gain 53 196 -93.86 gain 196 53 -95.67 gain 53 197 -99.26 gain 197 53 -96.21 gain 53 198 -87.72 gain 198 53 -89.18 gain 53 199 -90.98 gain 199 53 -92.54 gain 53 200 -87.28 gain 200 53 -90.18 gain 53 201 -97.46 gain 201 53 -100.28 gain 53 202 -87.29 gain 202 53 -89.24 gain 53 203 -96.28 gain 203 53 -97.34 gain 53 204 -92.44 gain 204 53 -90.14 gain 53 205 -86.36 gain 205 53 -87.81 gain 53 206 -99.88 gain 206 53 -102.43 gain 53 207 -93.45 gain 207 53 -95.42 gain 53 208 -95.53 gain 208 53 -100.10 gain 53 209 -97.91 gain 209 53 -102.05 gain 53 210 -100.80 gain 210 53 -105.12 gain 53 211 -96.17 gain 211 53 -95.72 gain 53 212 -93.97 gain 212 53 -96.53 gain 53 213 -95.29 gain 213 53 -97.18 gain 53 214 -97.23 gain 214 53 -104.50 gain 53 215 -99.54 gain 215 53 -102.22 gain 53 216 -101.08 gain 216 53 -107.67 gain 53 217 -93.49 gain 217 53 -100.34 gain 53 218 -97.62 gain 218 53 -97.28 gain 53 219 -88.92 gain 219 53 -89.06 gain 53 220 -102.31 gain 220 53 -98.54 gain 53 221 -98.69 gain 221 53 -100.59 gain 53 222 -94.41 gain 222 53 -92.12 gain 53 223 -101.90 gain 223 53 -102.85 gain 53 224 -104.30 gain 224 53 -105.72 gain 54 55 -63.57 gain 55 54 -60.49 gain 54 56 -73.85 gain 56 54 -75.81 gain 54 57 -77.89 gain 57 54 -78.93 gain 54 58 -82.60 gain 58 54 -80.34 gain 54 59 -86.13 gain 59 54 -83.12 gain 54 60 -95.82 gain 60 54 -102.09 gain 54 61 -89.71 gain 61 54 -87.89 gain 54 62 -93.19 gain 62 54 -88.88 gain 54 63 -82.30 gain 63 54 -81.96 gain 54 64 -85.53 gain 64 54 -89.41 gain 54 65 -82.82 gain 65 54 -82.24 gain 54 66 -80.22 gain 66 54 -78.63 gain 54 67 -74.76 gain 67 54 -74.39 gain 54 68 -72.29 gain 68 54 -74.51 gain 54 69 -68.60 gain 69 54 -68.04 gain 54 70 -64.87 gain 70 54 -62.77 gain 54 71 -80.40 gain 71 54 -81.87 gain 54 72 -78.55 gain 72 54 -77.59 gain 54 73 -81.66 gain 73 54 -82.06 gain 54 74 -85.44 gain 74 54 -81.96 gain 54 75 -93.60 gain 75 54 -96.01 gain 54 76 -89.50 gain 76 54 -92.03 gain 54 77 -93.48 gain 77 54 -92.01 gain 54 78 -84.03 gain 78 54 -87.06 gain 54 79 -87.08 gain 79 54 -89.73 gain 54 80 -85.61 gain 80 54 -86.05 gain 54 81 -76.47 gain 81 54 -77.82 gain 54 82 -82.83 gain 82 54 -85.16 gain 54 83 -81.13 gain 83 54 -80.74 gain 54 84 -74.14 gain 84 54 -70.92 gain 54 85 -68.38 gain 85 54 -70.59 gain 54 86 -78.28 gain 86 54 -82.13 gain 54 87 -79.51 gain 87 54 -80.66 gain 54 88 -80.71 gain 88 54 -81.50 gain 54 89 -93.66 gain 89 54 -96.59 gain 54 90 -92.67 gain 90 54 -94.94 gain 54 91 -88.15 gain 91 54 -91.49 gain 54 92 -98.01 gain 92 54 -102.27 gain 54 93 -92.47 gain 93 54 -94.09 gain 54 94 -89.25 gain 94 54 -89.43 gain 54 95 -83.69 gain 95 54 -83.12 gain 54 96 -85.73 gain 96 54 -92.12 gain 54 97 -80.15 gain 97 54 -79.37 gain 54 98 -78.71 gain 98 54 -78.39 gain 54 99 -81.45 gain 99 54 -80.27 gain 54 100 -79.89 gain 100 54 -78.63 gain 54 101 -83.65 gain 101 54 -86.02 gain 54 102 -84.35 gain 102 54 -86.68 gain 54 103 -85.48 gain 103 54 -88.98 gain 54 104 -84.97 gain 104 54 -90.95 gain 54 105 -98.61 gain 105 54 -99.12 gain 54 106 -91.99 gain 106 54 -89.83 gain 54 107 -96.63 gain 107 54 -94.37 gain 54 108 -88.01 gain 108 54 -85.37 gain 54 109 -106.37 gain 109 54 -107.18 gain 54 110 -87.41 gain 110 54 -94.59 gain 54 111 -87.06 gain 111 54 -84.20 gain 54 112 -83.33 gain 112 54 -83.94 gain 54 113 -81.04 gain 113 54 -80.77 gain 54 114 -90.59 gain 114 54 -87.49 gain 54 115 -77.28 gain 115 54 -74.83 gain 54 116 -78.63 gain 116 54 -78.62 gain 54 117 -85.22 gain 117 54 -82.35 gain 54 118 -85.36 gain 118 54 -84.11 gain 54 119 -91.99 gain 119 54 -95.80 gain 54 120 -92.22 gain 120 54 -93.41 gain 54 121 -89.50 gain 121 54 -91.72 gain 54 122 -97.25 gain 122 54 -99.22 gain 54 123 -91.50 gain 123 54 -93.80 gain 54 124 -90.21 gain 124 54 -90.51 gain 54 125 -84.22 gain 125 54 -87.86 gain 54 126 -85.10 gain 126 54 -85.38 gain 54 127 -86.11 gain 127 54 -86.02 gain 54 128 -83.03 gain 128 54 -85.53 gain 54 129 -81.17 gain 129 54 -80.88 gain 54 130 -86.03 gain 130 54 -87.03 gain 54 131 -86.72 gain 131 54 -87.50 gain 54 132 -89.05 gain 132 54 -85.84 gain 54 133 -92.93 gain 133 54 -94.90 gain 54 134 -86.64 gain 134 54 -85.46 gain 54 135 -94.96 gain 135 54 -96.09 gain 54 136 -94.46 gain 136 54 -96.03 gain 54 137 -93.14 gain 137 54 -97.62 gain 54 138 -86.44 gain 138 54 -84.45 gain 54 139 -89.20 gain 139 54 -90.48 gain 54 140 -84.55 gain 140 54 -86.66 gain 54 141 -90.67 gain 141 54 -84.75 gain 54 142 -92.43 gain 142 54 -93.25 gain 54 143 -89.63 gain 143 54 -93.19 gain 54 144 -87.86 gain 144 54 -89.78 gain 54 145 -90.99 gain 145 54 -96.30 gain 54 146 -90.31 gain 146 54 -91.62 gain 54 147 -87.30 gain 147 54 -85.71 gain 54 148 -88.75 gain 148 54 -85.48 gain 54 149 -98.57 gain 149 54 -98.96 gain 54 150 -96.45 gain 150 54 -97.68 gain 54 151 -89.02 gain 151 54 -89.20 gain 54 152 -91.34 gain 152 54 -91.33 gain 54 153 -97.70 gain 153 54 -96.90 gain 54 154 -88.59 gain 154 54 -89.69 gain 54 155 -93.06 gain 155 54 -92.73 gain 54 156 -92.06 gain 156 54 -90.97 gain 54 157 -93.70 gain 157 54 -95.09 gain 54 158 -87.43 gain 158 54 -88.32 gain 54 159 -96.22 gain 159 54 -99.50 gain 54 160 -93.78 gain 160 54 -94.20 gain 54 161 -95.16 gain 161 54 -98.02 gain 54 162 -87.31 gain 162 54 -89.89 gain 54 163 -90.61 gain 163 54 -95.10 gain 54 164 -92.62 gain 164 54 -96.48 gain 54 165 -93.42 gain 165 54 -94.34 gain 54 166 -93.73 gain 166 54 -94.40 gain 54 167 -97.30 gain 167 54 -98.69 gain 54 168 -104.00 gain 168 54 -104.29 gain 54 169 -89.31 gain 169 54 -90.71 gain 54 170 -92.08 gain 170 54 -92.71 gain 54 171 -91.79 gain 171 54 -93.51 gain 54 172 -95.10 gain 172 54 -95.01 gain 54 173 -92.46 gain 173 54 -97.01 gain 54 174 -86.26 gain 174 54 -86.87 gain 54 175 -88.52 gain 175 54 -90.25 gain 54 176 -87.17 gain 176 54 -87.87 gain 54 177 -90.90 gain 177 54 -94.61 gain 54 178 -86.91 gain 178 54 -84.06 gain 54 179 -90.74 gain 179 54 -87.31 gain 54 180 -98.37 gain 180 54 -104.39 gain 54 181 -102.30 gain 181 54 -102.35 gain 54 182 -90.41 gain 182 54 -91.54 gain 54 183 -94.42 gain 183 54 -95.82 gain 54 184 -94.33 gain 184 54 -98.48 gain 54 185 -95.26 gain 185 54 -103.28 gain 54 186 -98.13 gain 186 54 -101.72 gain 54 187 -94.13 gain 187 54 -95.45 gain 54 188 -95.61 gain 188 54 -99.35 gain 54 189 -95.69 gain 189 54 -94.16 gain 54 190 -87.77 gain 190 54 -90.15 gain 54 191 -90.08 gain 191 54 -91.16 gain 54 192 -89.45 gain 192 54 -89.23 gain 54 193 -92.76 gain 193 54 -91.52 gain 54 194 -94.36 gain 194 54 -93.91 gain 54 195 -98.33 gain 195 54 -96.43 gain 54 196 -100.80 gain 196 54 -103.20 gain 54 197 -86.45 gain 197 54 -83.99 gain 54 198 -98.95 gain 198 54 -101.01 gain 54 199 -99.60 gain 199 54 -101.76 gain 54 200 -97.07 gain 200 54 -100.56 gain 54 201 -90.35 gain 201 54 -93.75 gain 54 202 -92.60 gain 202 54 -95.14 gain 54 203 -99.69 gain 203 54 -101.34 gain 54 204 -95.95 gain 204 54 -94.24 gain 54 205 -100.94 gain 205 54 -102.97 gain 54 206 -91.30 gain 206 54 -94.44 gain 54 207 -96.80 gain 207 54 -99.36 gain 54 208 -97.62 gain 208 54 -102.78 gain 54 209 -88.97 gain 209 54 -93.71 gain 54 210 -99.92 gain 210 54 -104.83 gain 54 211 -101.58 gain 211 54 -101.72 gain 54 212 -91.08 gain 212 54 -94.24 gain 54 213 -94.99 gain 213 54 -97.47 gain 54 214 -104.44 gain 214 54 -112.31 gain 54 215 -105.05 gain 215 54 -108.32 gain 54 216 -95.54 gain 216 54 -102.72 gain 54 217 -94.87 gain 217 54 -102.32 gain 54 218 -99.65 gain 218 54 -99.90 gain 54 219 -98.13 gain 219 54 -98.87 gain 54 220 -92.74 gain 220 54 -89.56 gain 54 221 -90.30 gain 221 54 -92.80 gain 54 222 -95.39 gain 222 54 -93.69 gain 54 223 -91.82 gain 223 54 -93.37 gain 54 224 -100.88 gain 224 54 -102.90 gain 55 56 -57.63 gain 56 55 -62.67 gain 55 57 -65.54 gain 57 55 -69.67 gain 55 58 -76.96 gain 58 55 -77.78 gain 55 59 -70.83 gain 59 55 -70.90 gain 55 60 -90.95 gain 60 55 -100.31 gain 55 61 -84.28 gain 61 55 -85.54 gain 55 62 -81.28 gain 62 55 -80.05 gain 55 63 -82.43 gain 63 55 -85.17 gain 55 64 -86.13 gain 64 55 -93.09 gain 55 65 -87.35 gain 65 55 -89.86 gain 55 66 -81.69 gain 66 55 -83.18 gain 55 67 -76.24 gain 67 55 -78.97 gain 55 68 -70.25 gain 68 55 -75.56 gain 55 69 -62.21 gain 69 55 -64.73 gain 55 70 -61.55 gain 70 55 -62.55 gain 55 71 -68.72 gain 71 55 -73.28 gain 55 72 -74.39 gain 72 55 -76.51 gain 55 73 -82.20 gain 73 55 -85.69 gain 55 74 -81.61 gain 74 55 -81.21 gain 55 75 -94.39 gain 75 55 -99.89 gain 55 76 -86.67 gain 76 55 -92.28 gain 55 77 -81.25 gain 77 55 -82.87 gain 55 78 -84.46 gain 78 55 -90.57 gain 55 79 -85.71 gain 79 55 -91.44 gain 55 80 -85.80 gain 80 55 -89.33 gain 55 81 -81.68 gain 81 55 -86.12 gain 55 82 -78.41 gain 82 55 -83.82 gain 55 83 -78.38 gain 83 55 -81.06 gain 55 84 -69.66 gain 84 55 -69.53 gain 55 85 -70.19 gain 85 55 -75.49 gain 55 86 -79.36 gain 86 55 -86.30 gain 55 87 -77.26 gain 87 55 -81.48 gain 55 88 -71.99 gain 88 55 -75.86 gain 55 89 -80.11 gain 89 55 -86.12 gain 55 90 -89.50 gain 90 55 -94.85 gain 55 91 -93.31 gain 91 55 -99.73 gain 55 92 -84.73 gain 92 55 -92.07 gain 55 93 -85.18 gain 93 55 -89.88 gain 55 94 -87.91 gain 94 55 -91.18 gain 55 95 -83.90 gain 95 55 -86.41 gain 55 96 -89.75 gain 96 55 -99.23 gain 55 97 -81.04 gain 97 55 -83.34 gain 55 98 -78.47 gain 98 55 -81.24 gain 55 99 -81.85 gain 99 55 -83.75 gain 55 100 -75.61 gain 100 55 -77.43 gain 55 101 -75.32 gain 101 55 -80.77 gain 55 102 -74.70 gain 102 55 -80.11 gain 55 103 -81.13 gain 103 55 -87.72 gain 55 104 -84.65 gain 104 55 -93.72 gain 55 105 -97.33 gain 105 55 -100.92 gain 55 106 -94.20 gain 106 55 -95.13 gain 55 107 -95.84 gain 107 55 -96.66 gain 55 108 -89.88 gain 108 55 -90.32 gain 55 109 -85.89 gain 109 55 -89.78 gain 55 110 -84.29 gain 110 55 -94.54 gain 55 111 -86.22 gain 111 55 -86.45 gain 55 112 -87.79 gain 112 55 -91.48 gain 55 113 -76.62 gain 113 55 -79.43 gain 55 114 -80.42 gain 114 55 -80.40 gain 55 115 -77.37 gain 115 55 -78.01 gain 55 116 -73.50 gain 116 55 -76.57 gain 55 117 -76.77 gain 117 55 -76.98 gain 55 118 -81.61 gain 118 55 -83.44 gain 55 119 -88.95 gain 119 55 -95.85 gain 55 120 -91.37 gain 120 55 -95.65 gain 55 121 -84.24 gain 121 55 -89.54 gain 55 122 -85.73 gain 122 55 -90.79 gain 55 123 -94.37 gain 123 55 -99.76 gain 55 124 -85.10 gain 124 55 -88.48 gain 55 125 -86.77 gain 125 55 -93.49 gain 55 126 -85.01 gain 126 55 -88.37 gain 55 127 -81.49 gain 127 55 -84.48 gain 55 128 -79.65 gain 128 55 -85.24 gain 55 129 -78.98 gain 129 55 -81.77 gain 55 130 -82.04 gain 130 55 -86.13 gain 55 131 -80.35 gain 131 55 -84.21 gain 55 132 -83.52 gain 132 55 -83.39 gain 55 133 -84.13 gain 133 55 -89.18 gain 55 134 -85.12 gain 134 55 -87.03 gain 55 135 -99.72 gain 135 55 -103.93 gain 55 136 -93.24 gain 136 55 -97.90 gain 55 137 -92.60 gain 137 55 -100.17 gain 55 138 -90.68 gain 138 55 -91.78 gain 55 139 -88.27 gain 139 55 -92.64 gain 55 140 -85.63 gain 140 55 -90.82 gain 55 141 -91.15 gain 141 55 -88.32 gain 55 142 -85.83 gain 142 55 -89.73 gain 55 143 -87.20 gain 143 55 -93.84 gain 55 144 -78.80 gain 144 55 -83.81 gain 55 145 -85.35 gain 145 55 -93.75 gain 55 146 -84.09 gain 146 55 -88.47 gain 55 147 -92.92 gain 147 55 -94.41 gain 55 148 -88.00 gain 148 55 -87.82 gain 55 149 -86.18 gain 149 55 -89.66 gain 55 150 -99.02 gain 150 55 -103.34 gain 55 151 -99.71 gain 151 55 -102.97 gain 55 152 -94.73 gain 152 55 -97.80 gain 55 153 -91.79 gain 153 55 -94.08 gain 55 154 -95.20 gain 154 55 -99.38 gain 55 155 -87.57 gain 155 55 -90.33 gain 55 156 -84.79 gain 156 55 -86.79 gain 55 157 -88.68 gain 157 55 -93.16 gain 55 158 -83.80 gain 158 55 -87.77 gain 55 159 -85.83 gain 159 55 -92.19 gain 55 160 -91.99 gain 160 55 -95.50 gain 55 161 -86.15 gain 161 55 -92.11 gain 55 162 -84.32 gain 162 55 -89.98 gain 55 163 -82.27 gain 163 55 -89.85 gain 55 164 -86.04 gain 164 55 -92.98 gain 55 165 -85.15 gain 165 55 -89.15 gain 55 166 -90.96 gain 166 55 -94.71 gain 55 167 -91.96 gain 167 55 -96.44 gain 55 168 -89.77 gain 168 55 -93.14 gain 55 169 -90.55 gain 169 55 -95.04 gain 55 170 -88.39 gain 170 55 -92.11 gain 55 171 -95.46 gain 171 55 -100.26 gain 55 172 -87.47 gain 172 55 -90.46 gain 55 173 -83.40 gain 173 55 -91.04 gain 55 174 -85.86 gain 174 55 -89.55 gain 55 175 -87.85 gain 175 55 -92.67 gain 55 176 -83.92 gain 176 55 -87.71 gain 55 177 -86.41 gain 177 55 -93.20 gain 55 178 -85.90 gain 178 55 -86.14 gain 55 179 -84.16 gain 179 55 -83.82 gain 55 180 -88.04 gain 180 55 -97.14 gain 55 181 -97.11 gain 181 55 -100.24 gain 55 182 -90.53 gain 182 55 -94.74 gain 55 183 -94.93 gain 183 55 -99.42 gain 55 184 -83.39 gain 184 55 -90.63 gain 55 185 -95.35 gain 185 55 -106.45 gain 55 186 -95.94 gain 186 55 -102.61 gain 55 187 -95.52 gain 187 55 -99.92 gain 55 188 -85.56 gain 188 55 -92.38 gain 55 189 -92.12 gain 189 55 -93.66 gain 55 190 -84.32 gain 190 55 -89.78 gain 55 191 -90.85 gain 191 55 -95.02 gain 55 192 -91.41 gain 192 55 -94.27 gain 55 193 -86.89 gain 193 55 -88.74 gain 55 194 -97.16 gain 194 55 -99.79 gain 55 195 -94.12 gain 195 55 -95.30 gain 55 196 -95.38 gain 196 55 -100.87 gain 55 197 -100.94 gain 197 55 -101.56 gain 55 198 -90.31 gain 198 55 -95.45 gain 55 199 -93.62 gain 199 55 -98.86 gain 55 200 -97.41 gain 200 55 -103.99 gain 55 201 -86.16 gain 201 55 -92.65 gain 55 202 -86.91 gain 202 55 -92.53 gain 55 203 -86.32 gain 203 55 -91.05 gain 55 204 -92.80 gain 204 55 -94.18 gain 55 205 -86.80 gain 205 55 -91.92 gain 55 206 -87.90 gain 206 55 -94.12 gain 55 207 -87.85 gain 207 55 -93.50 gain 55 208 -89.18 gain 208 55 -97.43 gain 55 209 -92.52 gain 209 55 -100.34 gain 55 210 -89.91 gain 210 55 -97.91 gain 55 211 -95.99 gain 211 55 -99.22 gain 55 212 -92.99 gain 212 55 -99.23 gain 55 213 -94.26 gain 213 55 -99.83 gain 55 214 -97.58 gain 214 55 -108.53 gain 55 215 -88.61 gain 215 55 -94.96 gain 55 216 -97.16 gain 216 55 -107.42 gain 55 217 -94.11 gain 217 55 -104.64 gain 55 218 -93.91 gain 218 55 -97.24 gain 55 219 -94.40 gain 219 55 -98.21 gain 55 220 -87.59 gain 220 55 -87.49 gain 55 221 -90.78 gain 221 55 -96.36 gain 55 222 -90.75 gain 222 55 -92.13 gain 55 223 -90.97 gain 223 55 -95.60 gain 55 224 -86.76 gain 224 55 -91.85 gain 56 57 -68.74 gain 57 56 -67.82 gain 56 58 -75.17 gain 58 56 -70.94 gain 56 59 -80.84 gain 59 56 -75.87 gain 56 60 -92.41 gain 60 56 -96.72 gain 56 61 -90.68 gain 61 56 -86.89 gain 56 62 -92.06 gain 62 56 -85.78 gain 56 63 -91.59 gain 63 56 -89.28 gain 56 64 -89.92 gain 64 56 -91.83 gain 56 65 -90.31 gain 65 56 -87.77 gain 56 66 -82.21 gain 66 56 -78.65 gain 56 67 -89.65 gain 67 56 -87.33 gain 56 68 -82.58 gain 68 56 -82.84 gain 56 69 -77.39 gain 69 56 -74.87 gain 56 70 -71.91 gain 70 56 -67.86 gain 56 71 -71.97 gain 71 56 -71.48 gain 56 72 -74.59 gain 72 56 -71.66 gain 56 73 -82.64 gain 73 56 -81.08 gain 56 74 -81.67 gain 74 56 -76.23 gain 56 75 -99.26 gain 75 56 -99.71 gain 56 76 -97.66 gain 76 56 -98.23 gain 56 77 -97.55 gain 77 56 -94.12 gain 56 78 -93.47 gain 78 56 -94.54 gain 56 79 -86.92 gain 79 56 -87.61 gain 56 80 -88.86 gain 80 56 -87.34 gain 56 81 -86.46 gain 81 56 -85.84 gain 56 82 -85.74 gain 82 56 -86.10 gain 56 83 -78.48 gain 83 56 -76.12 gain 56 84 -79.14 gain 84 56 -73.96 gain 56 85 -81.72 gain 85 56 -81.98 gain 56 86 -71.93 gain 86 56 -73.82 gain 56 87 -78.22 gain 87 56 -77.40 gain 56 88 -78.97 gain 88 56 -77.79 gain 56 89 -82.53 gain 89 56 -83.49 gain 56 90 -100.32 gain 90 56 -100.63 gain 56 91 -96.50 gain 91 56 -97.88 gain 56 92 -90.85 gain 92 56 -93.14 gain 56 93 -92.81 gain 93 56 -92.46 gain 56 94 -92.80 gain 94 56 -91.02 gain 56 95 -93.02 gain 95 56 -90.47 gain 56 96 -86.88 gain 96 56 -91.31 gain 56 97 -85.27 gain 97 56 -82.52 gain 56 98 -89.42 gain 98 56 -87.14 gain 56 99 -81.07 gain 99 56 -77.92 gain 56 100 -77.03 gain 100 56 -73.80 gain 56 101 -80.49 gain 101 56 -80.89 gain 56 102 -80.49 gain 102 56 -80.86 gain 56 103 -82.92 gain 103 56 -84.46 gain 56 104 -93.68 gain 104 56 -97.71 gain 56 105 -97.62 gain 105 56 -96.16 gain 56 106 -92.57 gain 106 56 -88.45 gain 56 107 -99.88 gain 107 56 -95.66 gain 56 108 -92.28 gain 108 56 -87.67 gain 56 109 -92.35 gain 109 56 -91.20 gain 56 110 -89.85 gain 110 56 -95.06 gain 56 111 -90.78 gain 111 56 -85.96 gain 56 112 -83.52 gain 112 56 -82.16 gain 56 113 -86.70 gain 113 56 -84.47 gain 56 114 -86.76 gain 114 56 -81.70 gain 56 115 -83.91 gain 115 56 -79.50 gain 56 116 -88.83 gain 116 56 -86.86 gain 56 117 -88.97 gain 117 56 -84.14 gain 56 118 -82.77 gain 118 56 -79.56 gain 56 119 -86.42 gain 119 56 -88.27 gain 56 120 -102.42 gain 120 56 -101.65 gain 56 121 -101.89 gain 121 56 -102.14 gain 56 122 -100.65 gain 122 56 -100.66 gain 56 123 -98.79 gain 123 56 -99.14 gain 56 124 -95.77 gain 124 56 -94.10 gain 56 125 -98.41 gain 125 56 -100.08 gain 56 126 -92.26 gain 126 56 -90.58 gain 56 127 -90.77 gain 127 56 -88.72 gain 56 128 -90.10 gain 128 56 -90.64 gain 56 129 -87.79 gain 129 56 -85.54 gain 56 130 -90.31 gain 130 56 -89.35 gain 56 131 -88.29 gain 131 56 -87.11 gain 56 132 -90.70 gain 132 56 -85.53 gain 56 133 -91.77 gain 133 56 -91.77 gain 56 134 -86.72 gain 134 56 -83.59 gain 56 135 -98.35 gain 135 56 -97.52 gain 56 136 -99.00 gain 136 56 -98.61 gain 56 137 -98.30 gain 137 56 -100.82 gain 56 138 -92.41 gain 138 56 -88.46 gain 56 139 -96.75 gain 139 56 -96.06 gain 56 140 -95.12 gain 140 56 -95.26 gain 56 141 -95.37 gain 141 56 -87.48 gain 56 142 -91.28 gain 142 56 -90.14 gain 56 143 -96.63 gain 143 56 -98.22 gain 56 144 -92.63 gain 144 56 -92.59 gain 56 145 -90.29 gain 145 56 -93.64 gain 56 146 -84.95 gain 146 56 -84.29 gain 56 147 -82.95 gain 147 56 -79.39 gain 56 148 -81.73 gain 148 56 -76.50 gain 56 149 -92.32 gain 149 56 -90.75 gain 56 150 -88.60 gain 150 56 -87.86 gain 56 151 -101.78 gain 151 56 -99.99 gain 56 152 -95.29 gain 152 56 -93.31 gain 56 153 -102.97 gain 153 56 -100.20 gain 56 154 -101.49 gain 154 56 -100.63 gain 56 155 -86.61 gain 155 56 -84.32 gain 56 156 -94.40 gain 156 56 -91.35 gain 56 157 -96.39 gain 157 56 -95.82 gain 56 158 -97.77 gain 158 56 -96.70 gain 56 159 -94.27 gain 159 56 -95.58 gain 56 160 -90.18 gain 160 56 -88.65 gain 56 161 -89.80 gain 161 56 -90.70 gain 56 162 -89.34 gain 162 56 -89.95 gain 56 163 -92.12 gain 163 56 -94.65 gain 56 164 -96.95 gain 164 56 -98.85 gain 56 165 -102.17 gain 165 56 -101.13 gain 56 166 -95.84 gain 166 56 -94.54 gain 56 167 -100.79 gain 167 56 -100.22 gain 56 168 -98.12 gain 168 56 -96.44 gain 56 169 -97.37 gain 169 56 -96.81 gain 56 170 -94.16 gain 170 56 -92.83 gain 56 171 -99.67 gain 171 56 -99.42 gain 56 172 -93.42 gain 172 56 -91.36 gain 56 173 -95.23 gain 173 56 -97.82 gain 56 174 -91.50 gain 174 56 -90.14 gain 56 175 -90.29 gain 175 56 -90.06 gain 56 176 -95.67 gain 176 56 -94.41 gain 56 177 -93.21 gain 177 56 -94.95 gain 56 178 -96.21 gain 178 56 -91.40 gain 56 179 -92.48 gain 179 56 -87.09 gain 56 180 -102.70 gain 180 56 -106.75 gain 56 181 -101.85 gain 181 56 -99.93 gain 56 182 -104.53 gain 182 56 -103.69 gain 56 183 -96.21 gain 183 56 -95.64 gain 56 184 -98.64 gain 184 56 -100.82 gain 56 185 -93.60 gain 185 56 -99.66 gain 56 186 -91.53 gain 186 56 -93.16 gain 56 187 -98.72 gain 187 56 -98.08 gain 56 188 -96.36 gain 188 56 -98.13 gain 56 189 -96.44 gain 189 56 -92.94 gain 56 190 -85.73 gain 190 56 -86.14 gain 56 191 -95.93 gain 191 56 -95.05 gain 56 192 -98.13 gain 192 56 -95.94 gain 56 193 -93.97 gain 193 56 -90.77 gain 56 194 -93.10 gain 194 56 -90.69 gain 56 195 -96.88 gain 195 56 -93.01 gain 56 196 -101.79 gain 196 56 -102.23 gain 56 197 -99.03 gain 197 56 -94.60 gain 56 198 -101.26 gain 198 56 -101.35 gain 56 199 -102.68 gain 199 56 -102.87 gain 56 200 -95.75 gain 200 56 -97.28 gain 56 201 -97.86 gain 201 56 -99.30 gain 56 202 -94.33 gain 202 56 -94.90 gain 56 203 -95.99 gain 203 56 -95.67 gain 56 204 -95.12 gain 204 56 -91.45 gain 56 205 -96.34 gain 205 56 -96.41 gain 56 206 -96.53 gain 206 56 -97.71 gain 56 207 -94.87 gain 207 56 -95.47 gain 56 208 -102.13 gain 208 56 -105.33 gain 56 209 -98.23 gain 209 56 -101.01 gain 56 210 -100.12 gain 210 56 -103.07 gain 56 211 -100.26 gain 211 56 -98.44 gain 56 212 -100.62 gain 212 56 -101.81 gain 56 213 -103.99 gain 213 56 -104.51 gain 56 214 -95.54 gain 214 56 -101.45 gain 56 215 -98.86 gain 215 56 -100.16 gain 56 216 -95.38 gain 216 56 -100.60 gain 56 217 -95.56 gain 217 56 -101.04 gain 56 218 -91.82 gain 218 56 -90.10 gain 56 219 -89.50 gain 219 56 -88.27 gain 56 220 -108.65 gain 220 56 -103.51 gain 56 221 -100.17 gain 221 56 -100.71 gain 56 222 -96.95 gain 222 56 -93.29 gain 56 223 -93.77 gain 223 56 -93.35 gain 56 224 -93.47 gain 224 56 -93.52 gain 57 58 -60.85 gain 58 57 -57.55 gain 57 59 -81.94 gain 59 57 -77.89 gain 57 60 -112.44 gain 60 57 -117.67 gain 57 61 -100.65 gain 61 57 -97.78 gain 57 62 -95.36 gain 62 57 -90.00 gain 57 63 -96.71 gain 63 57 -95.32 gain 57 64 -87.22 gain 64 57 -90.05 gain 57 65 -87.25 gain 65 57 -85.63 gain 57 66 -81.87 gain 66 57 -79.23 gain 57 67 -90.28 gain 67 57 -88.88 gain 57 68 -81.00 gain 68 57 -82.19 gain 57 69 -72.99 gain 69 57 -71.39 gain 57 70 -75.99 gain 70 57 -72.85 gain 57 71 -64.18 gain 71 57 -64.61 gain 57 72 -67.94 gain 72 57 -65.93 gain 57 73 -78.18 gain 73 57 -77.54 gain 57 74 -75.72 gain 74 57 -71.19 gain 57 75 -93.38 gain 75 57 -94.75 gain 57 76 -93.91 gain 76 57 -95.39 gain 57 77 -96.91 gain 77 57 -94.40 gain 57 78 -89.70 gain 78 57 -91.68 gain 57 79 -97.93 gain 79 57 -99.53 gain 57 80 -90.24 gain 80 57 -89.64 gain 57 81 -93.94 gain 81 57 -94.25 gain 57 82 -87.85 gain 82 57 -89.14 gain 57 83 -87.37 gain 83 57 -85.92 gain 57 84 -81.31 gain 84 57 -77.05 gain 57 85 -76.63 gain 85 57 -77.80 gain 57 86 -79.35 gain 86 57 -82.16 gain 57 87 -69.13 gain 87 57 -69.23 gain 57 88 -78.88 gain 88 57 -78.61 gain 57 89 -74.14 gain 89 57 -76.02 gain 57 90 -95.70 gain 90 57 -96.93 gain 57 91 -88.49 gain 91 57 -90.78 gain 57 92 -95.35 gain 92 57 -98.56 gain 57 93 -94.55 gain 93 57 -95.11 gain 57 94 -93.14 gain 94 57 -92.27 gain 57 95 -88.98 gain 95 57 -87.36 gain 57 96 -85.19 gain 96 57 -90.54 gain 57 97 -91.75 gain 97 57 -89.92 gain 57 98 -88.93 gain 98 57 -87.57 gain 57 99 -87.99 gain 99 57 -85.77 gain 57 100 -79.30 gain 100 57 -76.99 gain 57 101 -75.70 gain 101 57 -77.02 gain 57 102 -70.90 gain 102 57 -72.19 gain 57 103 -78.72 gain 103 57 -81.18 gain 57 104 -81.41 gain 104 57 -86.35 gain 57 105 -98.15 gain 105 57 -97.61 gain 57 106 -95.97 gain 106 57 -92.76 gain 57 107 -95.31 gain 107 57 -92.01 gain 57 108 -89.18 gain 108 57 -85.50 gain 57 109 -93.49 gain 109 57 -93.25 gain 57 110 -94.81 gain 110 57 -100.93 gain 57 111 -85.66 gain 111 57 -81.76 gain 57 112 -87.82 gain 112 57 -87.38 gain 57 113 -88.82 gain 113 57 -87.50 gain 57 114 -87.31 gain 114 57 -83.16 gain 57 115 -87.97 gain 115 57 -84.48 gain 57 116 -85.83 gain 116 57 -84.77 gain 57 117 -84.57 gain 117 57 -80.66 gain 57 118 -81.76 gain 118 57 -79.47 gain 57 119 -87.01 gain 119 57 -89.77 gain 57 120 -103.52 gain 120 57 -103.67 gain 57 121 -103.97 gain 121 57 -105.15 gain 57 122 -96.22 gain 122 57 -97.14 gain 57 123 -102.18 gain 123 57 -103.45 gain 57 124 -94.54 gain 124 57 -93.80 gain 57 125 -94.18 gain 125 57 -96.77 gain 57 126 -90.77 gain 126 57 -90.00 gain 57 127 -97.14 gain 127 57 -96.01 gain 57 128 -87.80 gain 128 57 -89.26 gain 57 129 -93.19 gain 129 57 -91.86 gain 57 130 -84.36 gain 130 57 -84.32 gain 57 131 -84.24 gain 131 57 -83.98 gain 57 132 -79.98 gain 132 57 -75.72 gain 57 133 -89.05 gain 133 57 -89.97 gain 57 134 -86.72 gain 134 57 -84.50 gain 57 135 -97.27 gain 135 57 -97.35 gain 57 136 -98.91 gain 136 57 -99.44 gain 57 137 -94.03 gain 137 57 -97.47 gain 57 138 -93.67 gain 138 57 -90.64 gain 57 139 -90.14 gain 139 57 -90.37 gain 57 140 -90.91 gain 140 57 -91.98 gain 57 141 -93.11 gain 141 57 -86.15 gain 57 142 -92.13 gain 142 57 -91.90 gain 57 143 -89.04 gain 143 57 -91.55 gain 57 144 -91.51 gain 144 57 -92.39 gain 57 145 -95.14 gain 145 57 -99.41 gain 57 146 -91.18 gain 146 57 -91.44 gain 57 147 -87.78 gain 147 57 -85.14 gain 57 148 -93.94 gain 148 57 -89.64 gain 57 149 -95.85 gain 149 57 -95.20 gain 57 150 -95.84 gain 150 57 -96.02 gain 57 151 -91.40 gain 151 57 -90.53 gain 57 152 -99.96 gain 152 57 -98.91 gain 57 153 -97.78 gain 153 57 -95.94 gain 57 154 -95.42 gain 154 57 -95.48 gain 57 155 -90.01 gain 155 57 -88.64 gain 57 156 -92.41 gain 156 57 -90.27 gain 57 157 -94.87 gain 157 57 -95.22 gain 57 158 -98.33 gain 158 57 -98.18 gain 57 159 -93.25 gain 159 57 -95.48 gain 57 160 -88.87 gain 160 57 -88.25 gain 57 161 -89.95 gain 161 57 -91.77 gain 57 162 -85.51 gain 162 57 -87.04 gain 57 163 -91.03 gain 163 57 -94.47 gain 57 164 -89.29 gain 164 57 -92.10 gain 57 165 -95.39 gain 165 57 -95.26 gain 57 166 -102.41 gain 166 57 -102.03 gain 57 167 -102.63 gain 167 57 -102.97 gain 57 168 -102.03 gain 168 57 -101.28 gain 57 169 -95.29 gain 169 57 -95.64 gain 57 170 -98.67 gain 170 57 -98.26 gain 57 171 -92.83 gain 171 57 -93.50 gain 57 172 -88.30 gain 172 57 -87.16 gain 57 173 -93.53 gain 173 57 -97.04 gain 57 174 -85.32 gain 174 57 -84.87 gain 57 175 -97.93 gain 175 57 -98.62 gain 57 176 -94.30 gain 176 57 -93.96 gain 57 177 -88.07 gain 177 57 -90.73 gain 57 178 -93.37 gain 178 57 -89.47 gain 57 179 -85.47 gain 179 57 -80.99 gain 57 180 -98.12 gain 180 57 -103.10 gain 57 181 -98.18 gain 181 57 -97.18 gain 57 182 -97.86 gain 182 57 -97.94 gain 57 183 -107.17 gain 183 57 -107.53 gain 57 184 -96.01 gain 184 57 -99.12 gain 57 185 -99.84 gain 185 57 -106.81 gain 57 186 -100.19 gain 186 57 -102.74 gain 57 187 -94.75 gain 187 57 -95.03 gain 57 188 -101.84 gain 188 57 -104.53 gain 57 189 -98.88 gain 189 57 -96.30 gain 57 190 -92.78 gain 190 57 -94.12 gain 57 191 -93.35 gain 191 57 -93.39 gain 57 192 -84.19 gain 192 57 -82.93 gain 57 193 -90.77 gain 193 57 -88.49 gain 57 194 -88.83 gain 194 57 -87.33 gain 57 195 -104.47 gain 195 57 -101.52 gain 57 196 -94.52 gain 196 57 -95.88 gain 57 197 -99.40 gain 197 57 -95.90 gain 57 198 -108.39 gain 198 57 -109.39 gain 57 199 -100.30 gain 199 57 -101.41 gain 57 200 -99.15 gain 200 57 -101.60 gain 57 201 -91.49 gain 201 57 -93.85 gain 57 202 -91.38 gain 202 57 -92.88 gain 57 203 -103.06 gain 203 57 -103.66 gain 57 204 -107.46 gain 204 57 -104.71 gain 57 205 -88.02 gain 205 57 -89.01 gain 57 206 -94.35 gain 206 57 -96.45 gain 57 207 -95.88 gain 207 57 -97.40 gain 57 208 -95.28 gain 208 57 -99.40 gain 57 209 -99.61 gain 209 57 -103.30 gain 57 210 -101.41 gain 210 57 -105.28 gain 57 211 -103.99 gain 211 57 -103.09 gain 57 212 -93.31 gain 212 57 -95.42 gain 57 213 -103.85 gain 213 57 -105.29 gain 57 214 -100.09 gain 214 57 -106.92 gain 57 215 -99.05 gain 215 57 -101.27 gain 57 216 -100.40 gain 216 57 -106.53 gain 57 217 -99.82 gain 217 57 -106.22 gain 57 218 -100.47 gain 218 57 -99.67 gain 57 219 -100.39 gain 219 57 -100.08 gain 57 220 -93.19 gain 220 57 -88.96 gain 57 221 -95.43 gain 221 57 -96.89 gain 57 222 -92.95 gain 222 57 -90.21 gain 57 223 -99.36 gain 223 57 -99.86 gain 57 224 -99.23 gain 224 57 -100.20 gain 58 59 -56.55 gain 59 58 -55.81 gain 58 60 -90.99 gain 60 58 -99.52 gain 58 61 -90.71 gain 61 58 -91.15 gain 58 62 -88.04 gain 62 58 -85.99 gain 58 63 -92.87 gain 63 58 -94.78 gain 58 64 -89.08 gain 64 58 -95.22 gain 58 65 -81.34 gain 65 58 -83.03 gain 58 66 -88.23 gain 66 58 -88.90 gain 58 67 -89.09 gain 67 58 -90.99 gain 58 68 -78.57 gain 68 58 -83.06 gain 58 69 -83.10 gain 69 58 -84.80 gain 58 70 -76.15 gain 70 58 -76.32 gain 58 71 -68.69 gain 71 58 -72.43 gain 58 72 -65.53 gain 72 58 -66.82 gain 58 73 -63.12 gain 73 58 -65.79 gain 58 74 -63.97 gain 74 58 -62.75 gain 58 75 -86.39 gain 75 58 -91.06 gain 58 76 -89.69 gain 76 58 -94.48 gain 58 77 -97.33 gain 77 58 -98.12 gain 58 78 -90.85 gain 78 58 -96.14 gain 58 79 -89.04 gain 79 58 -93.95 gain 58 80 -90.95 gain 80 58 -93.65 gain 58 81 -87.19 gain 81 58 -90.80 gain 58 82 -83.65 gain 82 58 -88.24 gain 58 83 -83.01 gain 83 58 -84.87 gain 58 84 -83.38 gain 84 58 -82.43 gain 58 85 -76.53 gain 85 58 -81.00 gain 58 86 -71.85 gain 86 58 -77.97 gain 58 87 -76.19 gain 87 58 -79.59 gain 58 88 -78.59 gain 88 58 -81.64 gain 58 89 -73.88 gain 89 58 -79.07 gain 58 90 -92.87 gain 90 58 -97.40 gain 58 91 -93.39 gain 91 58 -98.99 gain 58 92 -95.33 gain 92 58 -101.84 gain 58 93 -98.35 gain 93 58 -102.22 gain 58 94 -95.63 gain 94 58 -98.07 gain 58 95 -84.70 gain 95 58 -86.38 gain 58 96 -88.21 gain 96 58 -96.86 gain 58 97 -95.70 gain 97 58 -97.18 gain 58 98 -85.25 gain 98 58 -87.20 gain 58 99 -83.51 gain 99 58 -84.59 gain 58 100 -81.68 gain 100 58 -82.68 gain 58 101 -80.05 gain 101 58 -84.68 gain 58 102 -75.90 gain 102 58 -80.49 gain 58 103 -70.14 gain 103 58 -75.91 gain 58 104 -82.00 gain 104 58 -90.25 gain 58 105 -93.98 gain 105 58 -96.75 gain 58 106 -96.77 gain 106 58 -96.87 gain 58 107 -89.12 gain 107 58 -89.12 gain 58 108 -96.36 gain 108 58 -95.98 gain 58 109 -93.12 gain 109 58 -96.20 gain 58 110 -96.92 gain 110 58 -106.36 gain 58 111 -87.40 gain 111 58 -86.80 gain 58 112 -90.81 gain 112 58 -93.67 gain 58 113 -94.51 gain 113 58 -96.50 gain 58 114 -84.40 gain 114 58 -83.56 gain 58 115 -89.33 gain 115 58 -89.15 gain 58 116 -76.47 gain 116 58 -78.72 gain 58 117 -84.57 gain 117 58 -83.96 gain 58 118 -85.07 gain 118 58 -86.08 gain 58 119 -79.85 gain 119 58 -85.93 gain 58 120 -102.63 gain 120 58 -106.08 gain 58 121 -97.24 gain 121 58 -101.71 gain 58 122 -93.96 gain 122 58 -98.19 gain 58 123 -87.42 gain 123 58 -91.99 gain 58 124 -93.98 gain 124 58 -96.54 gain 58 125 -87.65 gain 125 58 -93.55 gain 58 126 -87.48 gain 126 58 -90.03 gain 58 127 -89.24 gain 127 58 -91.41 gain 58 128 -87.16 gain 128 58 -91.92 gain 58 129 -87.51 gain 129 58 -89.49 gain 58 130 -86.13 gain 130 58 -89.39 gain 58 131 -82.03 gain 131 58 -85.07 gain 58 132 -85.97 gain 132 58 -85.02 gain 58 133 -82.67 gain 133 58 -86.89 gain 58 134 -85.17 gain 134 58 -86.26 gain 58 135 -95.59 gain 135 58 -98.98 gain 58 136 -97.35 gain 136 58 -101.18 gain 58 137 -95.59 gain 137 58 -102.33 gain 58 138 -90.46 gain 138 58 -90.74 gain 58 139 -93.83 gain 139 58 -97.38 gain 58 140 -92.90 gain 140 58 -97.27 gain 58 141 -94.31 gain 141 58 -90.65 gain 58 142 -91.53 gain 142 58 -94.62 gain 58 143 -86.13 gain 143 58 -91.95 gain 58 144 -88.81 gain 144 58 -93.00 gain 58 145 -85.07 gain 145 58 -92.64 gain 58 146 -90.36 gain 146 58 -93.93 gain 58 147 -91.28 gain 147 58 -91.95 gain 58 148 -88.20 gain 148 58 -87.20 gain 58 149 -79.65 gain 149 58 -82.30 gain 58 150 -96.52 gain 150 58 -100.01 gain 58 151 -95.91 gain 151 58 -98.34 gain 58 152 -94.40 gain 152 58 -96.65 gain 58 153 -92.42 gain 153 58 -93.89 gain 58 154 -89.27 gain 154 58 -92.63 gain 58 155 -93.78 gain 155 58 -95.72 gain 58 156 -87.45 gain 156 58 -88.63 gain 58 157 -85.51 gain 157 58 -89.16 gain 58 158 -78.08 gain 158 58 -81.23 gain 58 159 -94.48 gain 159 58 -100.02 gain 58 160 -88.32 gain 160 58 -91.01 gain 58 161 -80.92 gain 161 58 -86.05 gain 58 162 -89.00 gain 162 58 -93.84 gain 58 163 -88.10 gain 163 58 -94.85 gain 58 164 -89.09 gain 164 58 -95.21 gain 58 165 -90.94 gain 165 58 -94.12 gain 58 166 -99.42 gain 166 58 -102.35 gain 58 167 -84.28 gain 167 58 -87.93 gain 58 168 -97.14 gain 168 58 -99.69 gain 58 169 -97.83 gain 169 58 -101.50 gain 58 170 -96.50 gain 170 58 -99.39 gain 58 171 -94.33 gain 171 58 -98.31 gain 58 172 -85.01 gain 172 58 -87.17 gain 58 173 -89.42 gain 173 58 -96.23 gain 58 174 -89.73 gain 174 58 -92.59 gain 58 175 -97.58 gain 175 58 -101.58 gain 58 176 -95.90 gain 176 58 -98.86 gain 58 177 -87.01 gain 177 58 -92.98 gain 58 178 -87.03 gain 178 58 -86.44 gain 58 179 -89.74 gain 179 58 -88.57 gain 58 180 -93.62 gain 180 58 -101.90 gain 58 181 -97.12 gain 181 58 -99.43 gain 58 182 -94.07 gain 182 58 -97.46 gain 58 183 -96.09 gain 183 58 -99.75 gain 58 184 -96.16 gain 184 58 -102.57 gain 58 185 -93.51 gain 185 58 -103.79 gain 58 186 -89.91 gain 186 58 -95.76 gain 58 187 -93.31 gain 187 58 -96.89 gain 58 188 -98.16 gain 188 58 -104.15 gain 58 189 -90.17 gain 189 58 -90.89 gain 58 190 -95.58 gain 190 58 -100.22 gain 58 191 -89.73 gain 191 58 -93.08 gain 58 192 -89.59 gain 192 58 -91.63 gain 58 193 -87.70 gain 193 58 -88.73 gain 58 194 -91.44 gain 194 58 -93.25 gain 58 195 -99.78 gain 195 58 -100.13 gain 58 196 -101.34 gain 196 58 -106.01 gain 58 197 -88.72 gain 197 58 -88.53 gain 58 198 -100.60 gain 198 58 -104.92 gain 58 199 -96.28 gain 199 58 -100.70 gain 58 200 -94.71 gain 200 58 -100.47 gain 58 201 -94.47 gain 201 58 -100.14 gain 58 202 -93.49 gain 202 58 -98.29 gain 58 203 -97.03 gain 203 58 -100.94 gain 58 204 -96.56 gain 204 58 -97.12 gain 58 205 -87.16 gain 205 58 -91.46 gain 58 206 -90.21 gain 206 58 -95.62 gain 58 207 -92.27 gain 207 58 -97.10 gain 58 208 -90.78 gain 208 58 -98.21 gain 58 209 -94.54 gain 209 58 -101.53 gain 58 210 -96.14 gain 210 58 -103.31 gain 58 211 -102.43 gain 211 58 -104.84 gain 58 212 -98.83 gain 212 58 -104.24 gain 58 213 -95.77 gain 213 58 -100.51 gain 58 214 -95.09 gain 214 58 -105.22 gain 58 215 -99.12 gain 215 58 -104.66 gain 58 216 -94.16 gain 216 58 -103.61 gain 58 217 -90.72 gain 217 58 -100.42 gain 58 218 -93.59 gain 218 58 -96.10 gain 58 219 -92.61 gain 219 58 -95.61 gain 58 220 -91.89 gain 220 58 -90.97 gain 58 221 -94.23 gain 221 58 -98.99 gain 58 222 -86.99 gain 222 58 -87.56 gain 58 223 -96.67 gain 223 58 -100.48 gain 58 224 -93.29 gain 224 58 -97.56 gain 59 60 -95.07 gain 60 59 -104.35 gain 59 61 -91.46 gain 61 59 -92.65 gain 59 62 -94.65 gain 62 59 -93.34 gain 59 63 -95.08 gain 63 59 -97.74 gain 59 64 -95.80 gain 64 59 -102.68 gain 59 65 -88.01 gain 65 59 -90.45 gain 59 66 -93.33 gain 66 59 -94.74 gain 59 67 -87.83 gain 67 59 -90.48 gain 59 68 -89.42 gain 68 59 -94.65 gain 59 69 -83.24 gain 69 59 -85.68 gain 59 70 -83.93 gain 70 59 -84.84 gain 59 71 -68.15 gain 71 59 -72.63 gain 59 72 -71.04 gain 72 59 -73.08 gain 59 73 -72.28 gain 73 59 -75.69 gain 59 74 -62.04 gain 74 59 -61.56 gain 59 75 -100.08 gain 75 59 -105.50 gain 59 76 -88.12 gain 76 59 -93.66 gain 59 77 -94.66 gain 77 59 -96.20 gain 59 78 -94.95 gain 78 59 -100.99 gain 59 79 -93.09 gain 79 59 -98.75 gain 59 80 -90.41 gain 80 59 -93.86 gain 59 81 -90.74 gain 81 59 -95.10 gain 59 82 -86.34 gain 82 59 -91.68 gain 59 83 -79.49 gain 83 59 -82.10 gain 59 84 -84.82 gain 84 59 -84.61 gain 59 85 -82.58 gain 85 59 -87.81 gain 59 86 -80.82 gain 86 59 -87.69 gain 59 87 -78.57 gain 87 59 -82.72 gain 59 88 -65.21 gain 88 59 -69.00 gain 59 89 -67.22 gain 89 59 -73.16 gain 59 90 -95.27 gain 90 59 -100.55 gain 59 91 -96.12 gain 91 59 -102.46 gain 59 92 -91.33 gain 92 59 -98.60 gain 59 93 -100.70 gain 93 59 -105.32 gain 59 94 -89.11 gain 94 59 -92.30 gain 59 95 -90.45 gain 95 59 -92.88 gain 59 96 -87.34 gain 96 59 -96.74 gain 59 97 -89.15 gain 97 59 -91.38 gain 59 98 -80.68 gain 98 59 -83.37 gain 59 99 -81.20 gain 99 59 -83.03 gain 59 100 -80.88 gain 100 59 -82.63 gain 59 101 -77.40 gain 101 59 -82.78 gain 59 102 -71.13 gain 102 59 -76.47 gain 59 103 -80.84 gain 103 59 -87.35 gain 59 104 -73.84 gain 104 59 -82.83 gain 59 105 -95.90 gain 105 59 -99.42 gain 59 106 -91.51 gain 106 59 -92.36 gain 59 107 -98.49 gain 107 59 -99.24 gain 59 108 -90.20 gain 108 59 -90.57 gain 59 109 -91.21 gain 109 59 -95.03 gain 59 110 -96.54 gain 110 59 -106.72 gain 59 111 -87.09 gain 111 59 -87.24 gain 59 112 -80.19 gain 112 59 -83.80 gain 59 113 -80.40 gain 113 59 -83.14 gain 59 114 -80.93 gain 114 59 -80.84 gain 59 115 -87.39 gain 115 59 -87.95 gain 59 116 -85.57 gain 116 59 -88.56 gain 59 117 -78.46 gain 117 59 -78.59 gain 59 118 -82.36 gain 118 59 -84.11 gain 59 119 -72.83 gain 119 59 -79.65 gain 59 120 -98.73 gain 120 59 -102.93 gain 59 121 -107.29 gain 121 59 -112.52 gain 59 122 -101.03 gain 122 59 -106.01 gain 59 123 -98.10 gain 123 59 -103.41 gain 59 124 -94.51 gain 124 59 -97.82 gain 59 125 -90.16 gain 125 59 -96.80 gain 59 126 -91.94 gain 126 59 -95.23 gain 59 127 -96.05 gain 127 59 -98.96 gain 59 128 -90.57 gain 128 59 -96.08 gain 59 129 -81.66 gain 129 59 -84.38 gain 59 130 -85.21 gain 130 59 -89.22 gain 59 131 -94.52 gain 131 59 -98.30 gain 59 132 -85.70 gain 132 59 -85.49 gain 59 133 -83.21 gain 133 59 -88.18 gain 59 134 -86.50 gain 134 59 -88.33 gain 59 135 -93.54 gain 135 59 -97.67 gain 59 136 -88.47 gain 136 59 -93.04 gain 59 137 -95.79 gain 137 59 -103.28 gain 59 138 -90.09 gain 138 59 -91.11 gain 59 139 -91.44 gain 139 59 -95.73 gain 59 140 -86.97 gain 140 59 -92.09 gain 59 141 -91.49 gain 141 59 -88.57 gain 59 142 -90.74 gain 142 59 -94.57 gain 59 143 -90.66 gain 143 59 -97.22 gain 59 144 -80.12 gain 144 59 -85.05 gain 59 145 -100.73 gain 145 59 -109.05 gain 59 146 -85.14 gain 146 59 -89.45 gain 59 147 -78.96 gain 147 59 -80.38 gain 59 148 -80.60 gain 148 59 -80.34 gain 59 149 -83.03 gain 149 59 -86.44 gain 59 150 -95.09 gain 150 59 -99.33 gain 59 151 -100.90 gain 151 59 -104.08 gain 59 152 -91.60 gain 152 59 -94.60 gain 59 153 -102.24 gain 153 59 -104.45 gain 59 154 -96.58 gain 154 59 -100.69 gain 59 155 -91.59 gain 155 59 -94.27 gain 59 156 -95.82 gain 156 59 -97.73 gain 59 157 -88.38 gain 157 59 -92.77 gain 59 158 -88.24 gain 158 59 -92.14 gain 59 159 -89.98 gain 159 59 -96.26 gain 59 160 -85.39 gain 160 59 -88.83 gain 59 161 -87.05 gain 161 59 -92.93 gain 59 162 -81.31 gain 162 59 -86.90 gain 59 163 -88.70 gain 163 59 -96.20 gain 59 164 -92.41 gain 164 59 -99.28 gain 59 165 -93.60 gain 165 59 -97.53 gain 59 166 -93.40 gain 166 59 -97.08 gain 59 167 -95.29 gain 167 59 -99.69 gain 59 168 -93.60 gain 168 59 -96.90 gain 59 169 -86.94 gain 169 59 -91.35 gain 59 170 -92.72 gain 170 59 -96.36 gain 59 171 -88.49 gain 171 59 -93.21 gain 59 172 -95.52 gain 172 59 -98.43 gain 59 173 -87.71 gain 173 59 -95.27 gain 59 174 -90.40 gain 174 59 -94.00 gain 59 175 -85.79 gain 175 59 -90.53 gain 59 176 -84.13 gain 176 59 -87.85 gain 59 177 -90.47 gain 177 59 -97.19 gain 59 178 -95.73 gain 178 59 -95.89 gain 59 179 -85.28 gain 179 59 -84.86 gain 59 180 -100.23 gain 180 59 -109.25 gain 59 181 -94.81 gain 181 59 -97.86 gain 59 182 -99.49 gain 182 59 -103.63 gain 59 183 -98.47 gain 183 59 -102.88 gain 59 184 -92.82 gain 184 59 -99.98 gain 59 185 -92.38 gain 185 59 -103.40 gain 59 186 -86.02 gain 186 59 -92.62 gain 59 187 -86.95 gain 187 59 -91.28 gain 59 188 -85.10 gain 188 59 -91.85 gain 59 189 -92.34 gain 189 59 -93.81 gain 59 190 -87.48 gain 190 59 -92.87 gain 59 191 -95.63 gain 191 59 -99.72 gain 59 192 -89.28 gain 192 59 -92.07 gain 59 193 -90.20 gain 193 59 -91.97 gain 59 194 -91.04 gain 194 59 -93.60 gain 59 195 -99.14 gain 195 59 -100.24 gain 59 196 -96.55 gain 196 59 -101.97 gain 59 197 -102.49 gain 197 59 -103.04 gain 59 198 -97.31 gain 198 59 -102.37 gain 59 199 -92.41 gain 199 59 -97.57 gain 59 200 -91.87 gain 200 59 -98.38 gain 59 201 -91.65 gain 201 59 -98.07 gain 59 202 -92.03 gain 202 59 -97.57 gain 59 203 -91.57 gain 203 59 -96.23 gain 59 204 -98.46 gain 204 59 -99.76 gain 59 205 -88.47 gain 205 59 -93.51 gain 59 206 -93.82 gain 206 59 -99.97 gain 59 207 -92.09 gain 207 59 -97.66 gain 59 208 -86.63 gain 208 59 -94.80 gain 59 209 -94.62 gain 209 59 -102.36 gain 59 210 -85.56 gain 210 59 -93.48 gain 59 211 -88.58 gain 211 59 -91.73 gain 59 212 -100.74 gain 212 59 -106.90 gain 59 213 -92.04 gain 213 59 -97.53 gain 59 214 -97.48 gain 214 59 -108.36 gain 59 215 -93.10 gain 215 59 -99.38 gain 59 216 -99.26 gain 216 59 -109.45 gain 59 217 -85.48 gain 217 59 -95.94 gain 59 218 -93.76 gain 218 59 -97.01 gain 59 219 -97.38 gain 219 59 -101.12 gain 59 220 -96.44 gain 220 59 -96.26 gain 59 221 -87.81 gain 221 59 -93.32 gain 59 222 -94.78 gain 222 59 -96.09 gain 59 223 -97.01 gain 223 59 -101.56 gain 59 224 -91.65 gain 224 59 -96.67 gain 60 61 -65.59 gain 61 60 -57.49 gain 60 62 -77.18 gain 62 60 -66.59 gain 60 63 -77.37 gain 63 60 -70.75 gain 60 64 -92.19 gain 64 60 -89.79 gain 60 65 -93.30 gain 65 60 -86.45 gain 60 66 -96.22 gain 66 60 -88.35 gain 60 67 -95.72 gain 67 60 -89.08 gain 60 68 -98.54 gain 68 60 -94.49 gain 60 69 -97.95 gain 69 60 -91.11 gain 60 70 -102.00 gain 70 60 -93.63 gain 60 71 -100.62 gain 71 60 -95.82 gain 60 72 -106.26 gain 72 60 -99.02 gain 60 73 -99.18 gain 73 60 -93.31 gain 60 74 -107.92 gain 74 60 -98.17 gain 60 75 -67.55 gain 75 60 -63.69 gain 60 76 -71.80 gain 76 60 -68.06 gain 60 77 -74.24 gain 77 60 -66.50 gain 60 78 -85.19 gain 78 60 -81.95 gain 60 79 -95.62 gain 79 60 -92.00 gain 60 80 -92.82 gain 80 60 -86.99 gain 60 81 -94.35 gain 81 60 -89.43 gain 60 82 -98.22 gain 82 60 -94.28 gain 60 83 -91.79 gain 83 60 -85.12 gain 60 84 -95.33 gain 84 60 -85.85 gain 60 85 -88.03 gain 85 60 -83.97 gain 60 86 -101.15 gain 86 60 -98.73 gain 60 87 -102.17 gain 87 60 -97.04 gain 60 88 -107.36 gain 88 60 -101.87 gain 60 89 -99.48 gain 89 60 -96.14 gain 60 90 -79.73 gain 90 60 -75.73 gain 60 91 -82.26 gain 91 60 -79.32 gain 60 92 -74.62 gain 92 60 -72.60 gain 60 93 -85.57 gain 93 60 -80.91 gain 60 94 -89.45 gain 94 60 -83.36 gain 60 95 -90.72 gain 95 60 -83.87 gain 60 96 -95.22 gain 96 60 -95.33 gain 60 97 -98.51 gain 97 60 -91.46 gain 60 98 -96.34 gain 98 60 -89.75 gain 60 99 -105.02 gain 99 60 -97.57 gain 60 100 -100.81 gain 100 60 -93.28 gain 60 101 -98.32 gain 101 60 -94.41 gain 60 102 -97.11 gain 102 60 -93.17 gain 60 103 -110.09 gain 103 60 -107.32 gain 60 104 -105.65 gain 104 60 -105.37 gain 60 105 -82.82 gain 105 60 -77.06 gain 60 106 -85.49 gain 106 60 -77.06 gain 60 107 -84.36 gain 107 60 -75.83 gain 60 108 -93.80 gain 108 60 -84.89 gain 60 109 -91.87 gain 109 60 -86.41 gain 60 110 -87.04 gain 110 60 -87.94 gain 60 111 -91.48 gain 111 60 -82.35 gain 60 112 -103.42 gain 112 60 -97.76 gain 60 113 -98.05 gain 113 60 -91.51 gain 60 114 -98.10 gain 114 60 -88.73 gain 60 115 -92.47 gain 115 60 -83.75 gain 60 116 -103.65 gain 116 60 -97.36 gain 60 117 -102.78 gain 117 60 -93.64 gain 60 118 -106.66 gain 118 60 -99.14 gain 60 119 -108.22 gain 119 60 -105.76 gain 60 120 -91.10 gain 120 60 -86.02 gain 60 121 -86.49 gain 121 60 -82.43 gain 60 122 -89.60 gain 122 60 -85.29 gain 60 123 -95.53 gain 123 60 -91.56 gain 60 124 -95.62 gain 124 60 -89.64 gain 60 125 -91.13 gain 125 60 -88.49 gain 60 126 -97.14 gain 126 60 -91.15 gain 60 127 -99.62 gain 127 60 -93.25 gain 60 128 -94.74 gain 128 60 -90.97 gain 60 129 -100.86 gain 129 60 -94.30 gain 60 130 -103.31 gain 130 60 -98.04 gain 60 131 -101.26 gain 131 60 -95.76 gain 60 132 -106.26 gain 132 60 -96.78 gain 60 133 -105.70 gain 133 60 -101.39 gain 60 134 -107.33 gain 134 60 -99.89 gain 60 135 -93.09 gain 135 60 -87.95 gain 60 136 -93.35 gain 136 60 -88.65 gain 60 137 -94.27 gain 137 60 -92.48 gain 60 138 -90.81 gain 138 60 -82.55 gain 60 139 -94.17 gain 139 60 -89.18 gain 60 140 -92.77 gain 140 60 -88.60 gain 60 141 -98.53 gain 141 60 -86.33 gain 60 142 -97.33 gain 142 60 -91.88 gain 60 143 -98.24 gain 143 60 -95.53 gain 60 144 -97.91 gain 144 60 -93.56 gain 60 145 -95.81 gain 145 60 -94.85 gain 60 146 -102.13 gain 146 60 -97.16 gain 60 147 -103.33 gain 147 60 -95.47 gain 60 148 -94.40 gain 148 60 -84.86 gain 60 149 -102.88 gain 149 60 -97.00 gain 60 150 -100.68 gain 150 60 -95.64 gain 60 151 -93.61 gain 151 60 -87.51 gain 60 152 -94.23 gain 152 60 -87.94 gain 60 153 -89.81 gain 153 60 -82.74 gain 60 154 -95.04 gain 154 60 -89.88 gain 60 155 -97.18 gain 155 60 -90.58 gain 60 156 -100.54 gain 156 60 -93.18 gain 60 157 -94.78 gain 157 60 -89.90 gain 60 158 -101.44 gain 158 60 -96.05 gain 60 159 -104.58 gain 159 60 -101.58 gain 60 160 -99.82 gain 160 60 -93.98 gain 60 161 -106.57 gain 161 60 -103.16 gain 60 162 -109.98 gain 162 60 -106.28 gain 60 163 -102.06 gain 163 60 -100.28 gain 60 164 -106.45 gain 164 60 -104.04 gain 60 165 -99.35 gain 165 60 -93.99 gain 60 166 -101.53 gain 166 60 -95.93 gain 60 167 -92.46 gain 167 60 -87.58 gain 60 168 -98.66 gain 168 60 -92.67 gain 60 169 -91.04 gain 169 60 -86.17 gain 60 170 -91.82 gain 170 60 -86.18 gain 60 171 -95.08 gain 171 60 -90.52 gain 60 172 -103.11 gain 172 60 -96.74 gain 60 173 -103.85 gain 173 60 -102.13 gain 60 174 -98.61 gain 174 60 -92.94 gain 60 175 -108.31 gain 175 60 -103.77 gain 60 176 -100.53 gain 176 60 -94.96 gain 60 177 -108.10 gain 177 60 -105.53 gain 60 178 -101.81 gain 178 60 -92.69 gain 60 179 -106.42 gain 179 60 -96.72 gain 60 180 -99.08 gain 180 60 -98.83 gain 60 181 -98.05 gain 181 60 -91.82 gain 60 182 -95.81 gain 182 60 -90.67 gain 60 183 -99.16 gain 183 60 -94.29 gain 60 184 -101.05 gain 184 60 -98.93 gain 60 185 -98.31 gain 185 60 -100.05 gain 60 186 -100.47 gain 186 60 -97.79 gain 60 187 -100.22 gain 187 60 -95.27 gain 60 188 -104.92 gain 188 60 -102.39 gain 60 189 -106.09 gain 189 60 -98.28 gain 60 190 -99.64 gain 190 60 -95.75 gain 60 191 -103.06 gain 191 60 -97.87 gain 60 192 -116.89 gain 192 60 -110.40 gain 60 193 -99.08 gain 193 60 -91.57 gain 60 194 -103.17 gain 194 60 -96.44 gain 60 195 -95.42 gain 195 60 -87.24 gain 60 196 -96.63 gain 196 60 -92.76 gain 60 197 -97.24 gain 197 60 -88.51 gain 60 198 -105.61 gain 198 60 -101.39 gain 60 199 -98.34 gain 199 60 -94.23 gain 60 200 -104.08 gain 200 60 -101.31 gain 60 201 -109.52 gain 201 60 -106.65 gain 60 202 -100.25 gain 202 60 -96.51 gain 60 203 -101.29 gain 203 60 -96.67 gain 60 204 -107.86 gain 204 60 -99.89 gain 60 205 -103.04 gain 205 60 -98.81 gain 60 206 -103.70 gain 206 60 -100.57 gain 60 207 -105.25 gain 207 60 -101.54 gain 60 208 -103.02 gain 208 60 -101.91 gain 60 209 -109.16 gain 209 60 -107.62 gain 60 210 -101.18 gain 210 60 -99.82 gain 60 211 -99.26 gain 211 60 -93.13 gain 60 212 -105.43 gain 212 60 -102.31 gain 60 213 -98.13 gain 213 60 -94.34 gain 60 214 -102.08 gain 214 60 -103.68 gain 60 215 -98.10 gain 215 60 -95.10 gain 60 216 -101.34 gain 216 60 -102.25 gain 60 217 -102.38 gain 217 60 -103.55 gain 60 218 -111.29 gain 218 60 -105.26 gain 60 219 -104.47 gain 219 60 -98.93 gain 60 220 -116.70 gain 220 60 -107.24 gain 60 221 -100.77 gain 221 60 -96.99 gain 60 222 -107.21 gain 222 60 -99.24 gain 60 223 -100.46 gain 223 60 -95.73 gain 60 224 -106.93 gain 224 60 -102.67 gain 61 62 -64.38 gain 62 61 -61.89 gain 61 63 -71.92 gain 63 61 -73.39 gain 61 64 -76.35 gain 64 61 -82.05 gain 61 65 -79.25 gain 65 61 -80.50 gain 61 66 -85.91 gain 66 61 -86.14 gain 61 67 -85.78 gain 67 61 -87.24 gain 61 68 -87.59 gain 68 61 -91.64 gain 61 69 -85.65 gain 69 61 -86.92 gain 61 70 -89.49 gain 70 61 -89.22 gain 61 71 -87.64 gain 71 61 -90.94 gain 61 72 -95.16 gain 72 61 -96.02 gain 61 73 -97.78 gain 73 61 -100.01 gain 61 74 -104.67 gain 74 61 -103.01 gain 61 75 -68.46 gain 75 61 -72.69 gain 61 76 -71.84 gain 76 61 -76.19 gain 61 77 -66.08 gain 77 61 -66.43 gain 61 78 -76.06 gain 78 61 -80.91 gain 61 79 -70.55 gain 79 61 -75.02 gain 61 80 -78.06 gain 80 61 -80.32 gain 61 81 -76.56 gain 81 61 -79.74 gain 61 82 -81.13 gain 82 61 -85.28 gain 61 83 -86.12 gain 83 61 -87.54 gain 61 84 -87.24 gain 84 61 -85.86 gain 61 85 -90.65 gain 85 61 -94.69 gain 61 86 -95.77 gain 86 61 -101.44 gain 61 87 -96.54 gain 87 61 -99.50 gain 61 88 -98.34 gain 88 61 -100.95 gain 61 89 -95.19 gain 89 61 -99.94 gain 61 90 -72.77 gain 90 61 -76.87 gain 61 91 -64.91 gain 91 61 -70.07 gain 61 92 -75.43 gain 92 61 -81.50 gain 61 93 -76.41 gain 93 61 -79.84 gain 61 94 -77.29 gain 94 61 -79.29 gain 61 95 -80.84 gain 95 61 -82.08 gain 61 96 -80.60 gain 96 61 -88.81 gain 61 97 -87.80 gain 97 61 -88.83 gain 61 98 -95.34 gain 98 61 -96.85 gain 61 99 -84.73 gain 99 61 -85.37 gain 61 100 -91.69 gain 100 61 -92.25 gain 61 101 -93.67 gain 101 61 -97.86 gain 61 102 -93.32 gain 102 61 -97.48 gain 61 103 -93.62 gain 103 61 -98.95 gain 61 104 -99.89 gain 104 61 -107.69 gain 61 105 -78.90 gain 105 61 -81.23 gain 61 106 -75.67 gain 106 61 -75.33 gain 61 107 -76.88 gain 107 61 -76.45 gain 61 108 -80.65 gain 108 61 -79.84 gain 61 109 -81.29 gain 109 61 -83.93 gain 61 110 -81.27 gain 110 61 -90.27 gain 61 111 -84.46 gain 111 61 -83.43 gain 61 112 -86.53 gain 112 61 -88.96 gain 61 113 -83.90 gain 113 61 -85.46 gain 61 114 -88.03 gain 114 61 -86.76 gain 61 115 -89.12 gain 115 61 -88.50 gain 61 116 -95.29 gain 116 61 -97.10 gain 61 117 -93.89 gain 117 61 -92.84 gain 61 118 -92.75 gain 118 61 -93.33 gain 61 119 -102.66 gain 119 61 -108.29 gain 61 120 -85.64 gain 120 61 -88.66 gain 61 121 -77.47 gain 121 61 -81.51 gain 61 122 -84.31 gain 122 61 -88.10 gain 61 123 -77.97 gain 123 61 -82.10 gain 61 124 -79.72 gain 124 61 -81.84 gain 61 125 -81.44 gain 125 61 -86.89 gain 61 126 -87.15 gain 126 61 -89.26 gain 61 127 -87.98 gain 127 61 -89.71 gain 61 128 -86.21 gain 128 61 -90.54 gain 61 129 -96.55 gain 129 61 -98.09 gain 61 130 -93.78 gain 130 61 -96.61 gain 61 131 -89.81 gain 131 61 -92.41 gain 61 132 -85.53 gain 132 61 -84.14 gain 61 133 -95.89 gain 133 61 -99.67 gain 61 134 -96.50 gain 134 61 -97.15 gain 61 135 -83.73 gain 135 61 -86.68 gain 61 136 -83.98 gain 136 61 -87.37 gain 61 137 -81.71 gain 137 61 -88.01 gain 61 138 -83.18 gain 138 61 -83.02 gain 61 139 -80.27 gain 139 61 -83.37 gain 61 140 -86.25 gain 140 61 -90.18 gain 61 141 -89.44 gain 141 61 -85.34 gain 61 142 -97.34 gain 142 61 -99.98 gain 61 143 -87.00 gain 143 61 -92.38 gain 61 144 -97.91 gain 144 61 -101.66 gain 61 145 -95.72 gain 145 61 -102.85 gain 61 146 -92.25 gain 146 61 -95.38 gain 61 147 -94.31 gain 147 61 -94.54 gain 61 148 -98.43 gain 148 61 -96.99 gain 61 149 -93.26 gain 149 61 -95.48 gain 61 150 -84.31 gain 150 61 -87.37 gain 61 151 -84.47 gain 151 61 -86.47 gain 61 152 -85.03 gain 152 61 -86.84 gain 61 153 -91.80 gain 153 61 -92.82 gain 61 154 -85.88 gain 154 61 -88.80 gain 61 155 -92.53 gain 155 61 -94.03 gain 61 156 -89.14 gain 156 61 -89.87 gain 61 157 -89.87 gain 157 61 -93.09 gain 61 158 -86.10 gain 158 61 -88.81 gain 61 159 -91.73 gain 159 61 -96.82 gain 61 160 -92.30 gain 160 61 -94.55 gain 61 161 -93.79 gain 161 61 -98.48 gain 61 162 -95.04 gain 162 61 -99.44 gain 61 163 -98.98 gain 163 61 -105.30 gain 61 164 -93.44 gain 164 61 -99.12 gain 61 165 -81.09 gain 165 61 -83.83 gain 61 166 -84.47 gain 166 61 -86.96 gain 61 167 -83.09 gain 167 61 -86.30 gain 61 168 -89.58 gain 168 61 -91.69 gain 61 169 -87.66 gain 169 61 -90.89 gain 61 170 -97.04 gain 170 61 -99.50 gain 61 171 -89.07 gain 171 61 -92.61 gain 61 172 -87.46 gain 172 61 -89.18 gain 61 173 -90.65 gain 173 61 -97.02 gain 61 174 -88.62 gain 174 61 -91.05 gain 61 175 -84.23 gain 175 61 -87.78 gain 61 176 -97.72 gain 176 61 -100.25 gain 61 177 -96.89 gain 177 61 -102.42 gain 61 178 -98.09 gain 178 61 -97.06 gain 61 179 -99.25 gain 179 61 -97.65 gain 61 180 -88.68 gain 180 61 -96.52 gain 61 181 -85.17 gain 181 61 -87.04 gain 61 182 -101.32 gain 182 61 -104.27 gain 61 183 -87.70 gain 183 61 -90.92 gain 61 184 -88.68 gain 184 61 -94.66 gain 61 185 -91.09 gain 185 61 -100.93 gain 61 186 -94.23 gain 186 61 -99.65 gain 61 187 -95.56 gain 187 61 -98.71 gain 61 188 -86.49 gain 188 61 -92.05 gain 61 189 -93.79 gain 189 61 -94.08 gain 61 190 -92.85 gain 190 61 -97.05 gain 61 191 -91.51 gain 191 61 -94.42 gain 61 192 -94.45 gain 192 61 -96.05 gain 61 193 -102.90 gain 193 61 -103.49 gain 61 194 -96.39 gain 194 61 -97.76 gain 61 195 -93.66 gain 195 61 -93.58 gain 61 196 -95.02 gain 196 61 -99.25 gain 61 197 -95.82 gain 197 61 -95.19 gain 61 198 -97.84 gain 198 61 -101.71 gain 61 199 -95.73 gain 199 61 -99.71 gain 61 200 -101.39 gain 200 61 -106.71 gain 61 201 -92.20 gain 201 61 -97.43 gain 61 202 -99.44 gain 202 61 -103.80 gain 61 203 -97.43 gain 203 61 -100.91 gain 61 204 -101.07 gain 204 61 -101.19 gain 61 205 -96.69 gain 205 61 -100.55 gain 61 206 -96.81 gain 206 61 -101.78 gain 61 207 -103.81 gain 207 61 -108.19 gain 61 208 -92.41 gain 208 61 -99.40 gain 61 209 -96.83 gain 209 61 -103.39 gain 61 210 -98.45 gain 210 61 -105.18 gain 61 211 -89.22 gain 211 61 -91.19 gain 61 212 -92.35 gain 212 61 -97.33 gain 61 213 -101.19 gain 213 61 -105.49 gain 61 214 -88.45 gain 214 61 -98.14 gain 61 215 -85.93 gain 215 61 -91.03 gain 61 216 -94.46 gain 216 61 -103.46 gain 61 217 -94.90 gain 217 61 -104.17 gain 61 218 -92.86 gain 218 61 -94.93 gain 61 219 -95.16 gain 219 61 -97.72 gain 61 220 -97.08 gain 220 61 -95.72 gain 61 221 -87.49 gain 221 61 -91.81 gain 61 222 -94.88 gain 222 61 -95.01 gain 61 223 -109.63 gain 223 61 -113.00 gain 61 224 -101.86 gain 224 61 -105.70 gain 62 63 -66.69 gain 63 62 -70.66 gain 62 64 -66.09 gain 64 62 -74.28 gain 62 65 -72.67 gain 65 62 -76.40 gain 62 66 -76.53 gain 66 62 -79.25 gain 62 67 -84.32 gain 67 62 -88.27 gain 62 68 -81.86 gain 68 62 -88.40 gain 62 69 -76.05 gain 69 62 -79.80 gain 62 70 -85.44 gain 70 62 -87.66 gain 62 71 -84.76 gain 71 62 -90.55 gain 62 72 -93.75 gain 72 62 -97.09 gain 62 73 -93.67 gain 73 62 -98.39 gain 62 74 -85.28 gain 74 62 -86.12 gain 62 75 -71.91 gain 75 62 -78.63 gain 62 76 -60.72 gain 76 62 -67.56 gain 62 77 -59.70 gain 77 62 -62.54 gain 62 78 -69.87 gain 78 62 -77.21 gain 62 79 -69.04 gain 79 62 -76.00 gain 62 80 -76.42 gain 80 62 -81.18 gain 62 81 -76.35 gain 81 62 -82.02 gain 62 82 -78.47 gain 82 62 -85.11 gain 62 83 -85.30 gain 83 62 -89.21 gain 62 84 -92.98 gain 84 62 -94.08 gain 62 85 -83.43 gain 85 62 -89.96 gain 62 86 -90.81 gain 86 62 -98.98 gain 62 87 -88.99 gain 87 62 -94.45 gain 62 88 -92.99 gain 88 62 -98.09 gain 62 89 -93.51 gain 89 62 -100.75 gain 62 90 -79.11 gain 90 62 -85.69 gain 62 91 -66.89 gain 91 62 -74.53 gain 62 92 -68.96 gain 92 62 -77.53 gain 62 93 -73.75 gain 93 62 -79.67 gain 62 94 -72.67 gain 94 62 -77.16 gain 62 95 -79.52 gain 95 62 -83.25 gain 62 96 -81.67 gain 96 62 -92.38 gain 62 97 -87.74 gain 97 62 -91.26 gain 62 98 -78.35 gain 98 62 -82.35 gain 62 99 -80.75 gain 99 62 -83.88 gain 62 100 -89.69 gain 100 62 -92.74 gain 62 101 -87.39 gain 101 62 -94.07 gain 62 102 -82.26 gain 102 62 -88.90 gain 62 103 -92.71 gain 103 62 -100.52 gain 62 104 -84.61 gain 104 62 -94.91 gain 62 105 -74.06 gain 105 62 -78.87 gain 62 106 -72.46 gain 106 62 -74.61 gain 62 107 -71.11 gain 107 62 -73.17 gain 62 108 -57.64 gain 108 62 -59.32 gain 62 109 -77.61 gain 109 62 -82.74 gain 62 110 -78.97 gain 110 62 -90.46 gain 62 111 -82.48 gain 111 62 -83.93 gain 62 112 -82.51 gain 112 62 -87.42 gain 62 113 -81.47 gain 113 62 -85.52 gain 62 114 -86.58 gain 114 62 -87.79 gain 62 115 -87.52 gain 115 62 -89.38 gain 62 116 -85.63 gain 116 62 -89.93 gain 62 117 -87.66 gain 117 62 -89.10 gain 62 118 -94.51 gain 118 62 -97.57 gain 62 119 -92.95 gain 119 62 -101.07 gain 62 120 -79.16 gain 120 62 -84.66 gain 62 121 -77.35 gain 121 62 -83.88 gain 62 122 -73.48 gain 122 62 -79.76 gain 62 123 -79.16 gain 123 62 -85.78 gain 62 124 -81.29 gain 124 62 -85.90 gain 62 125 -79.36 gain 125 62 -87.31 gain 62 126 -78.75 gain 126 62 -83.35 gain 62 127 -86.28 gain 127 62 -90.50 gain 62 128 -82.38 gain 128 62 -89.19 gain 62 129 -84.72 gain 129 62 -88.74 gain 62 130 -92.08 gain 130 62 -97.40 gain 62 131 -90.36 gain 131 62 -95.45 gain 62 132 -85.30 gain 132 62 -86.40 gain 62 133 -98.48 gain 133 62 -104.76 gain 62 134 -90.05 gain 134 62 -93.19 gain 62 135 -78.47 gain 135 62 -83.91 gain 62 136 -85.09 gain 136 62 -90.97 gain 62 137 -83.24 gain 137 62 -92.03 gain 62 138 -81.96 gain 138 62 -84.29 gain 62 139 -79.11 gain 139 62 -84.70 gain 62 140 -81.27 gain 140 62 -87.69 gain 62 141 -77.64 gain 141 62 -76.03 gain 62 142 -90.30 gain 142 62 -95.43 gain 62 143 -87.90 gain 143 62 -95.77 gain 62 144 -89.60 gain 144 62 -95.83 gain 62 145 -93.41 gain 145 62 -103.03 gain 62 146 -93.63 gain 146 62 -99.24 gain 62 147 -90.52 gain 147 62 -93.25 gain 62 148 -95.69 gain 148 62 -96.74 gain 62 149 -93.19 gain 149 62 -97.90 gain 62 150 -84.52 gain 150 62 -90.06 gain 62 151 -76.88 gain 151 62 -81.37 gain 62 152 -89.18 gain 152 62 -93.48 gain 62 153 -81.39 gain 153 62 -84.90 gain 62 154 -86.47 gain 154 62 -91.89 gain 62 155 -89.55 gain 155 62 -93.54 gain 62 156 -80.23 gain 156 62 -83.45 gain 62 157 -92.94 gain 157 62 -98.64 gain 62 158 -92.05 gain 158 62 -97.25 gain 62 159 -95.61 gain 159 62 -103.20 gain 62 160 -88.98 gain 160 62 -93.72 gain 62 161 -97.21 gain 161 62 -104.39 gain 62 162 -92.74 gain 162 62 -99.63 gain 62 163 -85.51 gain 163 62 -94.31 gain 62 164 -93.74 gain 164 62 -101.91 gain 62 165 -82.94 gain 165 62 -88.17 gain 62 166 -92.41 gain 166 62 -97.40 gain 62 167 -82.96 gain 167 62 -88.66 gain 62 168 -79.64 gain 168 62 -84.24 gain 62 169 -78.45 gain 169 62 -84.17 gain 62 170 -87.43 gain 170 62 -92.38 gain 62 171 -86.71 gain 171 62 -92.74 gain 62 172 -93.92 gain 172 62 -98.13 gain 62 173 -99.21 gain 173 62 -108.08 gain 62 174 -93.19 gain 174 62 -98.10 gain 62 175 -89.86 gain 175 62 -95.91 gain 62 176 -92.10 gain 176 62 -97.12 gain 62 177 -95.39 gain 177 62 -103.40 gain 62 178 -91.45 gain 178 62 -92.91 gain 62 179 -87.18 gain 179 62 -88.06 gain 62 180 -88.64 gain 180 62 -98.98 gain 62 181 -83.62 gain 181 62 -87.97 gain 62 182 -98.37 gain 182 62 -103.81 gain 62 183 -85.89 gain 183 62 -91.60 gain 62 184 -88.00 gain 184 62 -96.46 gain 62 185 -81.60 gain 185 62 -93.93 gain 62 186 -94.03 gain 186 62 -101.94 gain 62 187 -90.32 gain 187 62 -95.96 gain 62 188 -83.45 gain 188 62 -91.50 gain 62 189 -89.46 gain 189 62 -92.23 gain 62 190 -88.32 gain 190 62 -95.00 gain 62 191 -93.18 gain 191 62 -98.58 gain 62 192 -98.41 gain 192 62 -102.50 gain 62 193 -97.12 gain 193 62 -100.20 gain 62 194 -100.85 gain 194 62 -104.71 gain 62 195 -87.68 gain 195 62 -90.09 gain 62 196 -82.36 gain 196 62 -89.08 gain 62 197 -78.44 gain 197 62 -80.29 gain 62 198 -94.52 gain 198 62 -100.89 gain 62 199 -88.27 gain 199 62 -94.74 gain 62 200 -87.54 gain 200 62 -95.35 gain 62 201 -78.72 gain 201 62 -86.44 gain 62 202 -92.00 gain 202 62 -98.86 gain 62 203 -94.72 gain 203 62 -100.68 gain 62 204 -92.59 gain 204 62 -95.19 gain 62 205 -90.00 gain 205 62 -96.35 gain 62 206 -91.42 gain 206 62 -98.88 gain 62 207 -97.03 gain 207 62 -103.90 gain 62 208 -98.06 gain 208 62 -107.53 gain 62 209 -90.37 gain 209 62 -99.42 gain 62 210 -90.27 gain 210 62 -99.49 gain 62 211 -88.84 gain 211 62 -93.29 gain 62 212 -94.95 gain 212 62 -102.42 gain 62 213 -88.09 gain 213 62 -94.88 gain 62 214 -89.56 gain 214 62 -101.74 gain 62 215 -93.86 gain 215 62 -101.44 gain 62 216 -92.45 gain 216 62 -103.94 gain 62 217 -88.13 gain 217 62 -99.88 gain 62 218 -94.95 gain 218 62 -99.51 gain 62 219 -95.76 gain 219 62 -100.80 gain 62 220 -85.83 gain 220 62 -86.96 gain 62 221 -97.14 gain 221 62 -103.95 gain 62 222 -99.21 gain 222 62 -101.83 gain 62 223 -91.48 gain 223 62 -97.34 gain 62 224 -91.98 gain 224 62 -98.30 gain 63 64 -66.30 gain 64 63 -70.52 gain 63 65 -67.79 gain 65 63 -67.57 gain 63 66 -80.88 gain 66 63 -79.63 gain 63 67 -85.68 gain 67 63 -85.66 gain 63 68 -82.87 gain 68 63 -85.45 gain 63 69 -87.51 gain 69 63 -87.30 gain 63 70 -83.88 gain 70 63 -82.14 gain 63 71 -88.19 gain 71 63 -90.02 gain 63 72 -92.45 gain 72 63 -91.83 gain 63 73 -96.66 gain 73 63 -97.42 gain 63 74 -93.13 gain 74 63 -90.00 gain 63 75 -80.93 gain 75 63 -83.69 gain 63 76 -71.87 gain 76 63 -74.75 gain 63 77 -70.49 gain 77 63 -69.37 gain 63 78 -63.49 gain 78 63 -66.86 gain 63 79 -66.78 gain 79 63 -69.78 gain 63 80 -75.63 gain 80 63 -76.41 gain 63 81 -84.26 gain 81 63 -85.96 gain 63 82 -85.04 gain 82 63 -87.72 gain 63 83 -90.17 gain 83 63 -90.12 gain 63 84 -85.96 gain 84 63 -83.10 gain 63 85 -92.62 gain 85 63 -95.19 gain 63 86 -93.08 gain 86 63 -97.28 gain 63 87 -93.50 gain 87 63 -94.99 gain 63 88 -94.28 gain 88 63 -95.41 gain 63 89 -91.21 gain 89 63 -94.49 gain 63 90 -76.74 gain 90 63 -79.36 gain 63 91 -79.20 gain 91 63 -82.89 gain 63 92 -70.78 gain 92 63 -75.39 gain 63 93 -71.52 gain 93 63 -73.48 gain 63 94 -71.73 gain 94 63 -72.26 gain 63 95 -80.23 gain 95 63 -80.00 gain 63 96 -80.75 gain 96 63 -87.49 gain 63 97 -85.12 gain 97 63 -84.68 gain 63 98 -84.93 gain 98 63 -84.96 gain 63 99 -87.96 gain 99 63 -87.13 gain 63 100 -84.07 gain 100 63 -83.16 gain 63 101 -94.21 gain 101 63 -96.93 gain 63 102 -95.12 gain 102 63 -97.80 gain 63 103 -93.54 gain 103 63 -97.38 gain 63 104 -96.64 gain 104 63 -102.98 gain 63 105 -82.13 gain 105 63 -82.98 gain 63 106 -78.91 gain 106 63 -77.10 gain 63 107 -83.34 gain 107 63 -81.43 gain 63 108 -79.81 gain 108 63 -77.52 gain 63 109 -74.08 gain 109 63 -75.24 gain 63 110 -73.97 gain 110 63 -81.49 gain 63 111 -85.88 gain 111 63 -83.36 gain 63 112 -85.09 gain 112 63 -86.05 gain 63 113 -85.91 gain 113 63 -85.99 gain 63 114 -84.01 gain 114 63 -81.26 gain 63 115 -93.12 gain 115 63 -91.03 gain 63 116 -89.33 gain 116 63 -89.67 gain 63 117 -102.36 gain 117 63 -99.83 gain 63 118 -99.30 gain 118 63 -98.40 gain 63 119 -92.09 gain 119 63 -96.25 gain 63 120 -78.17 gain 120 63 -79.71 gain 63 121 -79.79 gain 121 63 -82.35 gain 63 122 -81.99 gain 122 63 -84.30 gain 63 123 -82.13 gain 123 63 -84.79 gain 63 124 -72.70 gain 124 63 -73.34 gain 63 125 -74.25 gain 125 63 -78.23 gain 63 126 -84.31 gain 126 63 -84.94 gain 63 127 -84.97 gain 127 63 -85.23 gain 63 128 -93.61 gain 128 63 -96.47 gain 63 129 -89.65 gain 129 63 -89.71 gain 63 130 -93.15 gain 130 63 -94.51 gain 63 131 -95.22 gain 131 63 -96.35 gain 63 132 -98.82 gain 132 63 -95.96 gain 63 133 -100.89 gain 133 63 -103.20 gain 63 134 -96.47 gain 134 63 -95.65 gain 63 135 -87.91 gain 135 63 -89.39 gain 63 136 -80.75 gain 136 63 -82.67 gain 63 137 -89.28 gain 137 63 -94.11 gain 63 138 -82.37 gain 138 63 -80.73 gain 63 139 -88.40 gain 139 63 -90.03 gain 63 140 -81.61 gain 140 63 -84.06 gain 63 141 -89.78 gain 141 63 -84.20 gain 63 142 -90.55 gain 142 63 -91.72 gain 63 143 -90.27 gain 143 63 -94.18 gain 63 144 -87.77 gain 144 63 -90.04 gain 63 145 -95.54 gain 145 63 -101.20 gain 63 146 -90.28 gain 146 63 -91.93 gain 63 147 -95.06 gain 147 63 -93.81 gain 63 148 -97.24 gain 148 63 -94.33 gain 63 149 -103.14 gain 149 63 -103.88 gain 63 150 -87.83 gain 150 63 -89.41 gain 63 151 -85.89 gain 151 63 -86.41 gain 63 152 -83.18 gain 152 63 -83.52 gain 63 153 -94.42 gain 153 63 -93.97 gain 63 154 -85.14 gain 154 63 -86.60 gain 63 155 -88.86 gain 155 63 -88.88 gain 63 156 -86.67 gain 156 63 -85.93 gain 63 157 -92.34 gain 157 63 -94.08 gain 63 158 -90.37 gain 158 63 -91.61 gain 63 159 -93.61 gain 159 63 -97.23 gain 63 160 -92.65 gain 160 63 -93.42 gain 63 161 -96.54 gain 161 63 -99.75 gain 63 162 -92.47 gain 162 63 -95.39 gain 63 163 -95.87 gain 163 63 -100.70 gain 63 164 -98.04 gain 164 63 -102.25 gain 63 165 -95.45 gain 165 63 -96.71 gain 63 166 -90.06 gain 166 63 -91.08 gain 63 167 -94.57 gain 167 63 -96.31 gain 63 168 -88.39 gain 168 63 -89.03 gain 63 169 -87.61 gain 169 63 -89.36 gain 63 170 -91.74 gain 170 63 -92.72 gain 63 171 -90.78 gain 171 63 -92.85 gain 63 172 -94.49 gain 172 63 -94.74 gain 63 173 -85.14 gain 173 63 -90.04 gain 63 174 -95.93 gain 174 63 -96.88 gain 63 175 -89.85 gain 175 63 -91.93 gain 63 176 -93.03 gain 176 63 -94.08 gain 63 177 -98.88 gain 177 63 -102.94 gain 63 178 -102.12 gain 178 63 -99.62 gain 63 179 -95.10 gain 179 63 -92.02 gain 63 180 -91.84 gain 180 63 -98.21 gain 63 181 -94.08 gain 181 63 -94.47 gain 63 182 -95.06 gain 182 63 -96.53 gain 63 183 -91.47 gain 183 63 -93.21 gain 63 184 -89.35 gain 184 63 -93.85 gain 63 185 -89.54 gain 185 63 -97.91 gain 63 186 -96.71 gain 186 63 -100.65 gain 63 187 -93.62 gain 187 63 -95.29 gain 63 188 -89.60 gain 188 63 -93.68 gain 63 189 -89.72 gain 189 63 -88.53 gain 63 190 -92.19 gain 190 63 -94.91 gain 63 191 -93.35 gain 191 63 -94.78 gain 63 192 -92.46 gain 192 63 -92.59 gain 63 193 -96.99 gain 193 63 -96.10 gain 63 194 -101.23 gain 194 63 -101.12 gain 63 195 -91.36 gain 195 63 -89.80 gain 63 196 -94.26 gain 196 63 -97.01 gain 63 197 -90.62 gain 197 63 -88.51 gain 63 198 -94.69 gain 198 63 -97.09 gain 63 199 -92.67 gain 199 63 -95.18 gain 63 200 -92.80 gain 200 63 -96.65 gain 63 201 -86.77 gain 201 63 -90.52 gain 63 202 -93.33 gain 202 63 -96.21 gain 63 203 -87.50 gain 203 63 -89.50 gain 63 204 -100.43 gain 204 63 -99.08 gain 63 205 -93.57 gain 205 63 -95.95 gain 63 206 -95.26 gain 206 63 -98.76 gain 63 207 -96.72 gain 207 63 -99.63 gain 63 208 -95.64 gain 208 63 -101.15 gain 63 209 -106.16 gain 209 63 -111.24 gain 63 210 -91.34 gain 210 63 -96.60 gain 63 211 -89.00 gain 211 63 -89.49 gain 63 212 -89.67 gain 212 63 -93.17 gain 63 213 -94.70 gain 213 63 -97.53 gain 63 214 -99.00 gain 214 63 -107.22 gain 63 215 -89.85 gain 215 63 -93.47 gain 63 216 -98.21 gain 216 63 -105.73 gain 63 217 -97.87 gain 217 63 -105.66 gain 63 218 -99.89 gain 218 63 -100.49 gain 63 219 -95.04 gain 219 63 -96.12 gain 63 220 -90.85 gain 220 63 -88.01 gain 63 221 -95.32 gain 221 63 -98.17 gain 63 222 -102.77 gain 222 63 -101.42 gain 63 223 -107.33 gain 223 63 -109.23 gain 63 224 -96.69 gain 224 63 -99.06 gain 64 65 -67.85 gain 65 64 -63.39 gain 64 66 -71.69 gain 66 64 -66.23 gain 64 67 -79.38 gain 67 64 -75.14 gain 64 68 -86.28 gain 68 64 -84.63 gain 64 69 -92.43 gain 69 64 -87.99 gain 64 70 -85.45 gain 70 64 -79.48 gain 64 71 -98.61 gain 71 64 -96.21 gain 64 72 -92.73 gain 72 64 -87.89 gain 64 73 -98.72 gain 73 64 -95.24 gain 64 74 -95.62 gain 74 64 -88.26 gain 64 75 -76.41 gain 75 64 -74.94 gain 64 76 -76.93 gain 76 64 -75.58 gain 64 77 -76.51 gain 77 64 -71.16 gain 64 78 -76.81 gain 78 64 -75.96 gain 64 79 -65.33 gain 79 64 -64.10 gain 64 80 -71.68 gain 80 64 -68.25 gain 64 81 -80.41 gain 81 64 -77.88 gain 64 82 -77.52 gain 82 64 -75.97 gain 64 83 -94.21 gain 83 64 -89.93 gain 64 84 -94.30 gain 84 64 -87.21 gain 64 85 -99.21 gain 85 64 -97.55 gain 64 86 -85.27 gain 86 64 -85.25 gain 64 87 -91.36 gain 87 64 -88.62 gain 64 88 -97.45 gain 88 64 -94.36 gain 64 89 -96.84 gain 89 64 -95.89 gain 64 90 -84.09 gain 90 64 -82.48 gain 64 91 -85.04 gain 91 64 -84.50 gain 64 92 -78.62 gain 92 64 -79.00 gain 64 93 -76.82 gain 93 64 -74.55 gain 64 94 -71.33 gain 94 64 -67.63 gain 64 95 -74.18 gain 95 64 -69.72 gain 64 96 -76.01 gain 96 64 -78.52 gain 64 97 -85.86 gain 97 64 -81.20 gain 64 98 -84.62 gain 98 64 -80.43 gain 64 99 -90.79 gain 99 64 -85.73 gain 64 100 -94.36 gain 100 64 -89.22 gain 64 101 -88.42 gain 101 64 -86.91 gain 64 102 -100.70 gain 102 64 -99.15 gain 64 103 -97.02 gain 103 64 -96.64 gain 64 104 -95.25 gain 104 64 -97.36 gain 64 105 -83.03 gain 105 64 -79.66 gain 64 106 -92.79 gain 106 64 -86.75 gain 64 107 -82.56 gain 107 64 -76.42 gain 64 108 -77.70 gain 108 64 -71.19 gain 64 109 -80.49 gain 109 64 -77.43 gain 64 110 -81.74 gain 110 64 -85.04 gain 64 111 -83.78 gain 111 64 -77.05 gain 64 112 -83.49 gain 112 64 -80.22 gain 64 113 -85.90 gain 113 64 -81.75 gain 64 114 -95.60 gain 114 64 -88.62 gain 64 115 -87.43 gain 115 64 -81.11 gain 64 116 -98.01 gain 116 64 -94.12 gain 64 117 -94.55 gain 117 64 -87.80 gain 64 118 -96.31 gain 118 64 -91.18 gain 64 119 -99.34 gain 119 64 -99.27 gain 64 120 -86.63 gain 120 64 -83.95 gain 64 121 -88.80 gain 121 64 -87.14 gain 64 122 -84.62 gain 122 64 -82.71 gain 64 123 -86.55 gain 123 64 -84.98 gain 64 124 -83.78 gain 124 64 -80.20 gain 64 125 -89.20 gain 125 64 -88.95 gain 64 126 -87.82 gain 126 64 -84.23 gain 64 127 -88.74 gain 127 64 -84.78 gain 64 128 -89.74 gain 128 64 -88.37 gain 64 129 -87.33 gain 129 64 -83.16 gain 64 130 -92.67 gain 130 64 -89.80 gain 64 131 -93.08 gain 131 64 -89.98 gain 64 132 -88.22 gain 132 64 -81.13 gain 64 133 -100.53 gain 133 64 -98.62 gain 64 134 -97.32 gain 134 64 -92.26 gain 64 135 -91.88 gain 135 64 -89.13 gain 64 136 -95.62 gain 136 64 -93.31 gain 64 137 -89.40 gain 137 64 -90.00 gain 64 138 -85.97 gain 138 64 -80.11 gain 64 139 -84.81 gain 139 64 -82.22 gain 64 140 -84.84 gain 140 64 -83.07 gain 64 141 -85.33 gain 141 64 -75.53 gain 64 142 -88.71 gain 142 64 -85.66 gain 64 143 -96.46 gain 143 64 -96.15 gain 64 144 -94.60 gain 144 64 -92.64 gain 64 145 -97.57 gain 145 64 -99.00 gain 64 146 -96.30 gain 146 64 -93.72 gain 64 147 -104.93 gain 147 64 -99.46 gain 64 148 -94.60 gain 148 64 -87.46 gain 64 149 -107.11 gain 149 64 -103.63 gain 64 150 -96.69 gain 150 64 -94.04 gain 64 151 -98.37 gain 151 64 -94.66 gain 64 152 -93.96 gain 152 64 -90.07 gain 64 153 -92.99 gain 153 64 -88.31 gain 64 154 -92.52 gain 154 64 -89.75 gain 64 155 -85.25 gain 155 64 -81.05 gain 64 156 -90.54 gain 156 64 -85.57 gain 64 157 -87.56 gain 157 64 -85.07 gain 64 158 -88.01 gain 158 64 -85.02 gain 64 159 -96.08 gain 159 64 -95.48 gain 64 160 -100.60 gain 160 64 -97.15 gain 64 161 -99.48 gain 161 64 -98.47 gain 64 162 -96.32 gain 162 64 -95.02 gain 64 163 -93.52 gain 163 64 -94.14 gain 64 164 -102.73 gain 164 64 -102.72 gain 64 165 -98.07 gain 165 64 -95.11 gain 64 166 -93.78 gain 166 64 -90.57 gain 64 167 -103.20 gain 167 64 -100.71 gain 64 168 -93.79 gain 168 64 -90.20 gain 64 169 -94.52 gain 169 64 -92.05 gain 64 170 -95.10 gain 170 64 -91.86 gain 64 171 -95.35 gain 171 64 -93.20 gain 64 172 -93.60 gain 172 64 -89.63 gain 64 173 -87.80 gain 173 64 -88.48 gain 64 174 -95.88 gain 174 64 -92.60 gain 64 175 -101.03 gain 175 64 -98.89 gain 64 176 -99.46 gain 176 64 -96.28 gain 64 177 -99.52 gain 177 64 -99.35 gain 64 178 -99.98 gain 178 64 -93.25 gain 64 179 -94.51 gain 179 64 -87.21 gain 64 180 -95.51 gain 180 64 -97.65 gain 64 181 -95.89 gain 181 64 -92.05 gain 64 182 -91.83 gain 182 64 -89.08 gain 64 183 -92.18 gain 183 64 -89.70 gain 64 184 -95.45 gain 184 64 -95.72 gain 64 185 -97.68 gain 185 64 -101.82 gain 64 186 -93.47 gain 186 64 -93.18 gain 64 187 -96.35 gain 187 64 -93.80 gain 64 188 -101.21 gain 188 64 -101.07 gain 64 189 -94.09 gain 189 64 -88.68 gain 64 190 -98.06 gain 190 64 -96.56 gain 64 191 -96.54 gain 191 64 -93.75 gain 64 192 -98.80 gain 192 64 -94.70 gain 64 193 -101.90 gain 193 64 -96.78 gain 64 194 -103.84 gain 194 64 -99.51 gain 64 195 -93.21 gain 195 64 -87.43 gain 64 196 -97.07 gain 196 64 -95.60 gain 64 197 -88.93 gain 197 64 -82.59 gain 64 198 -105.13 gain 198 64 -103.31 gain 64 199 -95.49 gain 199 64 -93.77 gain 64 200 -101.52 gain 200 64 -101.14 gain 64 201 -100.00 gain 201 64 -99.52 gain 64 202 -91.41 gain 202 64 -90.07 gain 64 203 -99.52 gain 203 64 -97.29 gain 64 204 -95.43 gain 204 64 -89.84 gain 64 205 -94.34 gain 205 64 -92.50 gain 64 206 -99.37 gain 206 64 -98.64 gain 64 207 -98.18 gain 207 64 -96.87 gain 64 208 -98.95 gain 208 64 -100.24 gain 64 209 -103.45 gain 209 64 -104.31 gain 64 210 -97.32 gain 210 64 -98.35 gain 64 211 -97.57 gain 211 64 -93.84 gain 64 212 -97.01 gain 212 64 -96.29 gain 64 213 -96.33 gain 213 64 -94.94 gain 64 214 -104.37 gain 214 64 -108.36 gain 64 215 -102.57 gain 215 64 -101.96 gain 64 216 -100.09 gain 216 64 -103.40 gain 64 217 -102.39 gain 217 64 -105.96 gain 64 218 -97.16 gain 218 64 -93.54 gain 64 219 -94.55 gain 219 64 -91.41 gain 64 220 -102.01 gain 220 64 -94.95 gain 64 221 -96.41 gain 221 64 -95.03 gain 64 222 -95.91 gain 222 64 -90.34 gain 64 223 -103.72 gain 223 64 -101.39 gain 64 224 -101.82 gain 224 64 -99.96 gain 65 66 -67.57 gain 66 65 -66.55 gain 65 67 -76.98 gain 67 65 -77.20 gain 65 68 -66.83 gain 68 65 -69.63 gain 65 69 -84.84 gain 69 65 -84.85 gain 65 70 -82.22 gain 70 65 -80.71 gain 65 71 -88.23 gain 71 65 -90.28 gain 65 72 -88.36 gain 72 65 -87.97 gain 65 73 -87.88 gain 73 65 -88.86 gain 65 74 -91.36 gain 74 65 -88.45 gain 65 75 -89.65 gain 75 65 -92.63 gain 65 76 -78.58 gain 76 65 -81.69 gain 65 77 -77.05 gain 77 65 -76.16 gain 65 78 -77.41 gain 78 65 -81.02 gain 65 79 -65.40 gain 79 65 -68.62 gain 65 80 -58.16 gain 80 65 -59.17 gain 65 81 -72.69 gain 81 65 -74.61 gain 65 82 -76.24 gain 82 65 -79.14 gain 65 83 -75.74 gain 83 65 -75.91 gain 65 84 -87.54 gain 84 65 -84.90 gain 65 85 -83.19 gain 85 65 -85.98 gain 65 86 -87.62 gain 86 65 -92.05 gain 65 87 -91.08 gain 87 65 -92.80 gain 65 88 -81.12 gain 88 65 -82.48 gain 65 89 -84.57 gain 89 65 -88.07 gain 65 90 -81.74 gain 90 65 -84.59 gain 65 91 -83.99 gain 91 65 -87.90 gain 65 92 -77.57 gain 92 65 -82.40 gain 65 93 -71.42 gain 93 65 -73.61 gain 65 94 -73.00 gain 94 65 -73.76 gain 65 95 -71.48 gain 95 65 -71.48 gain 65 96 -72.62 gain 96 65 -79.59 gain 65 97 -78.99 gain 97 65 -78.78 gain 65 98 -87.74 gain 98 65 -88.00 gain 65 99 -77.60 gain 99 65 -76.99 gain 65 100 -88.35 gain 100 65 -87.66 gain 65 101 -83.81 gain 101 65 -86.75 gain 65 102 -93.44 gain 102 65 -96.35 gain 65 103 -91.43 gain 103 65 -95.51 gain 65 104 -89.29 gain 104 65 -95.85 gain 65 105 -86.31 gain 105 65 -87.39 gain 65 106 -78.20 gain 106 65 -76.61 gain 65 107 -88.47 gain 107 65 -86.79 gain 65 108 -78.60 gain 108 65 -76.54 gain 65 109 -81.28 gain 109 65 -82.66 gain 65 110 -74.01 gain 110 65 -81.76 gain 65 111 -76.36 gain 111 65 -74.08 gain 65 112 -80.70 gain 112 65 -81.88 gain 65 113 -85.27 gain 113 65 -85.58 gain 65 114 -80.97 gain 114 65 -78.44 gain 65 115 -86.51 gain 115 65 -84.64 gain 65 116 -88.42 gain 116 65 -88.98 gain 65 117 -82.17 gain 117 65 -79.88 gain 65 118 -99.22 gain 118 65 -98.55 gain 65 119 -90.61 gain 119 65 -95.00 gain 65 120 -85.61 gain 120 65 -87.38 gain 65 121 -88.97 gain 121 65 -91.76 gain 65 122 -83.70 gain 122 65 -86.24 gain 65 123 -82.00 gain 123 65 -84.89 gain 65 124 -85.42 gain 124 65 -86.29 gain 65 125 -81.23 gain 125 65 -85.44 gain 65 126 -88.84 gain 126 65 -89.70 gain 65 127 -88.16 gain 127 65 -88.64 gain 65 128 -81.03 gain 128 65 -84.11 gain 65 129 -89.54 gain 129 65 -89.83 gain 65 130 -86.53 gain 130 65 -88.11 gain 65 131 -80.84 gain 131 65 -82.19 gain 65 132 -97.98 gain 132 65 -95.34 gain 65 133 -93.91 gain 133 65 -96.44 gain 65 134 -98.50 gain 134 65 -97.90 gain 65 135 -80.88 gain 135 65 -82.58 gain 65 136 -91.16 gain 136 65 -93.30 gain 65 137 -84.86 gain 137 65 -89.92 gain 65 138 -85.03 gain 138 65 -83.62 gain 65 139 -86.79 gain 139 65 -88.65 gain 65 140 -81.42 gain 140 65 -84.11 gain 65 141 -76.27 gain 141 65 -70.92 gain 65 142 -89.06 gain 142 65 -90.46 gain 65 143 -77.90 gain 143 65 -82.03 gain 65 144 -84.70 gain 144 65 -87.20 gain 65 145 -85.81 gain 145 65 -91.70 gain 65 146 -86.67 gain 146 65 -88.55 gain 65 147 -93.46 gain 147 65 -92.44 gain 65 148 -91.80 gain 148 65 -89.11 gain 65 149 -93.30 gain 149 65 -94.27 gain 65 150 -91.98 gain 150 65 -93.79 gain 65 151 -89.87 gain 151 65 -90.62 gain 65 152 -91.34 gain 152 65 -91.91 gain 65 153 -86.88 gain 153 65 -86.65 gain 65 154 -82.38 gain 154 65 -84.06 gain 65 155 -87.68 gain 155 65 -87.94 gain 65 156 -90.61 gain 156 65 -90.09 gain 65 157 -87.60 gain 157 65 -89.56 gain 65 158 -96.68 gain 158 65 -98.14 gain 65 159 -93.51 gain 159 65 -97.36 gain 65 160 -86.15 gain 160 65 -87.16 gain 65 161 -95.74 gain 161 65 -99.18 gain 65 162 -98.70 gain 162 65 -101.85 gain 65 163 -92.15 gain 163 65 -97.22 gain 65 164 -97.80 gain 164 65 -102.23 gain 65 165 -89.58 gain 165 65 -91.07 gain 65 166 -91.10 gain 166 65 -92.35 gain 65 167 -96.53 gain 167 65 -98.50 gain 65 168 -86.63 gain 168 65 -87.49 gain 65 169 -89.03 gain 169 65 -91.00 gain 65 170 -93.30 gain 170 65 -94.51 gain 65 171 -87.32 gain 171 65 -89.61 gain 65 172 -91.60 gain 172 65 -92.08 gain 65 173 -90.77 gain 173 65 -95.90 gain 65 174 -90.96 gain 174 65 -92.14 gain 65 175 -92.11 gain 175 65 -94.42 gain 65 176 -90.15 gain 176 65 -91.43 gain 65 177 -96.26 gain 177 65 -100.54 gain 65 178 -91.10 gain 178 65 -88.82 gain 65 179 -101.89 gain 179 65 -99.04 gain 65 180 -89.67 gain 180 65 -96.26 gain 65 181 -80.63 gain 181 65 -81.24 gain 65 182 -95.33 gain 182 65 -97.03 gain 65 183 -88.64 gain 183 65 -90.61 gain 65 184 -97.13 gain 184 65 -101.86 gain 65 185 -86.71 gain 185 65 -95.31 gain 65 186 -85.18 gain 186 65 -89.35 gain 65 187 -88.89 gain 187 65 -90.79 gain 65 188 -90.26 gain 188 65 -94.57 gain 65 189 -95.94 gain 189 65 -94.98 gain 65 190 -96.52 gain 190 65 -99.48 gain 65 191 -90.99 gain 191 65 -92.65 gain 65 192 -98.25 gain 192 65 -98.61 gain 65 193 -95.28 gain 193 65 -94.62 gain 65 194 -94.57 gain 194 65 -94.70 gain 65 195 -92.41 gain 195 65 -91.08 gain 65 196 -101.77 gain 196 65 -104.75 gain 65 197 -92.72 gain 197 65 -90.83 gain 65 198 -85.75 gain 198 65 -88.38 gain 65 199 -88.22 gain 199 65 -90.95 gain 65 200 -98.25 gain 200 65 -102.32 gain 65 201 -90.42 gain 201 65 -94.40 gain 65 202 -88.55 gain 202 65 -91.67 gain 65 203 -91.75 gain 203 65 -93.97 gain 65 204 -97.46 gain 204 65 -96.33 gain 65 205 -95.81 gain 205 65 -98.43 gain 65 206 -94.31 gain 206 65 -98.03 gain 65 207 -96.31 gain 207 65 -99.45 gain 65 208 -93.40 gain 208 65 -99.14 gain 65 209 -94.91 gain 209 65 -100.23 gain 65 210 -98.88 gain 210 65 -104.36 gain 65 211 -96.86 gain 211 65 -97.58 gain 65 212 -90.16 gain 212 65 -93.90 gain 65 213 -88.19 gain 213 65 -91.25 gain 65 214 -97.55 gain 214 65 -105.99 gain 65 215 -93.84 gain 215 65 -97.68 gain 65 216 -89.78 gain 216 65 -97.53 gain 65 217 -91.51 gain 217 65 -99.53 gain 65 218 -100.67 gain 218 65 -101.49 gain 65 219 -86.55 gain 219 65 -87.85 gain 65 220 -95.68 gain 220 65 -93.08 gain 65 221 -96.84 gain 221 65 -99.91 gain 65 222 -95.66 gain 222 65 -94.54 gain 65 223 -99.21 gain 223 65 -101.33 gain 65 224 -99.28 gain 224 65 -101.87 gain 66 67 -67.02 gain 67 66 -68.25 gain 66 68 -74.00 gain 68 66 -77.82 gain 66 69 -82.99 gain 69 66 -84.02 gain 66 70 -74.45 gain 70 66 -73.95 gain 66 71 -87.22 gain 71 66 -90.29 gain 66 72 -92.50 gain 72 66 -93.13 gain 66 73 -86.22 gain 73 66 -88.22 gain 66 74 -80.48 gain 74 66 -78.59 gain 66 75 -81.86 gain 75 66 -85.86 gain 66 76 -81.12 gain 76 66 -85.24 gain 66 77 -79.96 gain 77 66 -80.08 gain 66 78 -73.27 gain 78 66 -77.89 gain 66 79 -74.47 gain 79 66 -78.71 gain 66 80 -64.58 gain 80 66 -66.61 gain 66 81 -62.13 gain 81 66 -65.07 gain 66 82 -67.74 gain 82 66 -71.66 gain 66 83 -74.43 gain 83 66 -75.63 gain 66 84 -80.57 gain 84 66 -78.95 gain 66 85 -82.31 gain 85 66 -86.12 gain 66 86 -77.04 gain 86 66 -82.49 gain 66 87 -82.81 gain 87 66 -85.55 gain 66 88 -90.85 gain 88 66 -93.22 gain 66 89 -92.03 gain 89 66 -96.55 gain 66 90 -82.00 gain 90 66 -85.86 gain 66 91 -87.52 gain 91 66 -92.44 gain 66 92 -80.50 gain 92 66 -86.35 gain 66 93 -80.46 gain 93 66 -83.67 gain 66 94 -75.98 gain 94 66 -77.75 gain 66 95 -75.01 gain 95 66 -76.02 gain 66 96 -70.22 gain 96 66 -78.20 gain 66 97 -76.46 gain 97 66 -77.27 gain 66 98 -74.90 gain 98 66 -76.17 gain 66 99 -74.60 gain 99 66 -75.01 gain 66 100 -88.81 gain 100 66 -89.14 gain 66 101 -91.69 gain 101 66 -95.65 gain 66 102 -82.35 gain 102 66 -86.28 gain 66 103 -79.62 gain 103 66 -84.71 gain 66 104 -86.56 gain 104 66 -94.14 gain 66 105 -84.49 gain 105 66 -86.58 gain 66 106 -79.13 gain 106 66 -78.56 gain 66 107 -78.97 gain 107 66 -78.30 gain 66 108 -75.63 gain 108 66 -74.58 gain 66 109 -84.45 gain 109 66 -86.85 gain 66 110 -76.87 gain 110 66 -85.64 gain 66 111 -77.59 gain 111 66 -76.33 gain 66 112 -78.07 gain 112 66 -80.27 gain 66 113 -80.02 gain 113 66 -81.34 gain 66 114 -83.05 gain 114 66 -81.54 gain 66 115 -82.45 gain 115 66 -81.59 gain 66 116 -89.10 gain 116 66 -90.68 gain 66 117 -87.55 gain 117 66 -86.27 gain 66 118 -80.77 gain 118 66 -81.11 gain 66 119 -91.32 gain 119 66 -96.73 gain 66 120 -97.33 gain 120 66 -100.12 gain 66 121 -85.64 gain 121 66 -89.45 gain 66 122 -80.94 gain 122 66 -84.50 gain 66 123 -81.16 gain 123 66 -85.06 gain 66 124 -87.40 gain 124 66 -89.29 gain 66 125 -75.44 gain 125 66 -80.67 gain 66 126 -83.35 gain 126 66 -85.22 gain 66 127 -83.52 gain 127 66 -85.02 gain 66 128 -81.85 gain 128 66 -85.95 gain 66 129 -80.64 gain 129 66 -81.94 gain 66 130 -76.75 gain 130 66 -79.34 gain 66 131 -83.28 gain 131 66 -85.65 gain 66 132 -82.92 gain 132 66 -81.30 gain 66 133 -91.60 gain 133 66 -95.15 gain 66 134 -83.39 gain 134 66 -83.80 gain 66 135 -86.99 gain 135 66 -89.71 gain 66 136 -87.45 gain 136 66 -90.61 gain 66 137 -86.70 gain 137 66 -92.78 gain 66 138 -82.97 gain 138 66 -82.58 gain 66 139 -77.86 gain 139 66 -80.73 gain 66 140 -90.98 gain 140 66 -94.68 gain 66 141 -75.40 gain 141 66 -71.07 gain 66 142 -78.98 gain 142 66 -81.39 gain 66 143 -86.87 gain 143 66 -92.02 gain 66 144 -94.60 gain 144 66 -98.12 gain 66 145 -77.62 gain 145 66 -84.52 gain 66 146 -92.69 gain 146 66 -95.58 gain 66 147 -93.59 gain 147 66 -93.59 gain 66 148 -93.86 gain 148 66 -92.19 gain 66 149 -88.99 gain 149 66 -90.98 gain 66 150 -95.94 gain 150 66 -98.76 gain 66 151 -88.86 gain 151 66 -90.62 gain 66 152 -87.28 gain 152 66 -88.86 gain 66 153 -76.63 gain 153 66 -77.42 gain 66 154 -82.09 gain 154 66 -84.79 gain 66 155 -81.93 gain 155 66 -83.20 gain 66 156 -89.29 gain 156 66 -89.79 gain 66 157 -86.54 gain 157 66 -89.52 gain 66 158 -89.82 gain 158 66 -92.31 gain 66 159 -95.80 gain 159 66 -100.67 gain 66 160 -88.47 gain 160 66 -90.49 gain 66 161 -88.68 gain 161 66 -93.14 gain 66 162 -95.19 gain 162 66 -99.36 gain 66 163 -94.09 gain 163 66 -100.17 gain 66 164 -89.53 gain 164 66 -94.98 gain 66 165 -87.46 gain 165 66 -89.97 gain 66 166 -89.65 gain 166 66 -91.92 gain 66 167 -89.86 gain 167 66 -92.85 gain 66 168 -86.20 gain 168 66 -88.08 gain 66 169 -83.86 gain 169 66 -86.85 gain 66 170 -89.01 gain 170 66 -91.24 gain 66 171 -90.26 gain 171 66 -93.57 gain 66 172 -87.37 gain 172 66 -88.87 gain 66 173 -86.85 gain 173 66 -92.99 gain 66 174 -84.54 gain 174 66 -86.74 gain 66 175 -95.40 gain 175 66 -98.73 gain 66 176 -89.81 gain 176 66 -92.11 gain 66 177 -92.61 gain 177 66 -97.91 gain 66 178 -82.76 gain 178 66 -81.50 gain 66 179 -94.00 gain 179 66 -92.16 gain 66 180 -88.10 gain 180 66 -95.71 gain 66 181 -92.71 gain 181 66 -94.35 gain 66 182 -95.15 gain 182 66 -97.87 gain 66 183 -90.56 gain 183 66 -93.55 gain 66 184 -99.72 gain 184 66 -105.47 gain 66 185 -92.06 gain 185 66 -101.67 gain 66 186 -96.67 gain 186 66 -101.86 gain 66 187 -86.98 gain 187 66 -89.89 gain 66 188 -90.16 gain 188 66 -95.48 gain 66 189 -86.22 gain 189 66 -86.27 gain 66 190 -90.15 gain 190 66 -94.12 gain 66 191 -90.82 gain 191 66 -93.50 gain 66 192 -93.40 gain 192 66 -94.77 gain 66 193 -94.70 gain 193 66 -95.05 gain 66 194 -92.15 gain 194 66 -93.29 gain 66 195 -89.18 gain 195 66 -88.87 gain 66 196 -91.91 gain 196 66 -95.91 gain 66 197 -86.78 gain 197 66 -85.91 gain 66 198 -93.51 gain 198 66 -97.15 gain 66 199 -99.46 gain 199 66 -103.22 gain 66 200 -93.51 gain 200 66 -98.59 gain 66 201 -94.45 gain 201 66 -99.44 gain 66 202 -86.23 gain 202 66 -90.36 gain 66 203 -94.39 gain 203 66 -97.63 gain 66 204 -98.31 gain 204 66 -98.20 gain 66 205 -87.41 gain 205 66 -91.04 gain 66 206 -91.63 gain 206 66 -96.37 gain 66 207 -94.98 gain 207 66 -99.14 gain 66 208 -96.13 gain 208 66 -102.89 gain 66 209 -96.63 gain 209 66 -102.96 gain 66 210 -92.98 gain 210 66 -99.48 gain 66 211 -99.95 gain 211 66 -101.68 gain 66 212 -91.32 gain 212 66 -96.06 gain 66 213 -91.56 gain 213 66 -95.64 gain 66 214 -89.60 gain 214 66 -99.06 gain 66 215 -95.24 gain 215 66 -100.10 gain 66 216 -93.54 gain 216 66 -102.31 gain 66 217 -96.38 gain 217 66 -105.42 gain 66 218 -98.45 gain 218 66 -100.29 gain 66 219 -93.54 gain 219 66 -95.86 gain 66 220 -100.03 gain 220 66 -98.44 gain 66 221 -88.70 gain 221 66 -92.79 gain 66 222 -90.91 gain 222 66 -90.81 gain 66 223 -96.59 gain 223 66 -99.73 gain 66 224 -99.93 gain 224 66 -103.54 gain 67 68 -64.35 gain 68 67 -66.93 gain 67 69 -68.21 gain 69 67 -68.02 gain 67 70 -80.49 gain 70 67 -78.76 gain 67 71 -87.03 gain 71 67 -88.87 gain 67 72 -82.40 gain 72 67 -81.80 gain 67 73 -88.16 gain 73 67 -88.93 gain 67 74 -91.18 gain 74 67 -88.06 gain 67 75 -90.94 gain 75 67 -93.71 gain 67 76 -84.99 gain 76 67 -87.89 gain 67 77 -85.91 gain 77 67 -84.80 gain 67 78 -80.19 gain 78 67 -83.59 gain 67 79 -83.86 gain 79 67 -86.88 gain 67 80 -75.43 gain 80 67 -76.23 gain 67 81 -64.36 gain 81 67 -66.07 gain 67 82 -62.64 gain 82 67 -65.33 gain 67 83 -68.25 gain 83 67 -68.21 gain 67 84 -75.29 gain 84 67 -72.44 gain 67 85 -81.24 gain 85 67 -83.82 gain 67 86 -73.27 gain 86 67 -77.49 gain 67 87 -84.87 gain 87 67 -86.38 gain 67 88 -83.72 gain 88 67 -84.87 gain 67 89 -93.79 gain 89 67 -97.08 gain 67 90 -88.39 gain 90 67 -91.02 gain 67 91 -82.95 gain 91 67 -86.65 gain 67 92 -87.11 gain 92 67 -91.72 gain 67 93 -77.53 gain 93 67 -79.50 gain 67 94 -78.97 gain 94 67 -79.51 gain 67 95 -67.67 gain 95 67 -67.45 gain 67 96 -67.33 gain 96 67 -74.09 gain 67 97 -73.61 gain 97 67 -73.19 gain 67 98 -72.64 gain 98 67 -72.68 gain 67 99 -80.60 gain 99 67 -79.78 gain 67 100 -74.80 gain 100 67 -73.90 gain 67 101 -82.05 gain 101 67 -84.78 gain 67 102 -80.39 gain 102 67 -83.08 gain 67 103 -91.70 gain 103 67 -95.57 gain 67 104 -89.17 gain 104 67 -95.51 gain 67 105 -91.20 gain 105 67 -92.06 gain 67 106 -93.25 gain 106 67 -91.45 gain 67 107 -88.37 gain 107 67 -86.48 gain 67 108 -84.41 gain 108 67 -82.13 gain 67 109 -86.85 gain 109 67 -88.02 gain 67 110 -78.87 gain 110 67 -86.41 gain 67 111 -80.61 gain 111 67 -78.12 gain 67 112 -75.00 gain 112 67 -75.97 gain 67 113 -78.68 gain 113 67 -78.77 gain 67 114 -77.40 gain 114 67 -74.67 gain 67 115 -83.00 gain 115 67 -80.92 gain 67 116 -90.40 gain 116 67 -90.75 gain 67 117 -84.62 gain 117 67 -82.11 gain 67 118 -88.91 gain 118 67 -88.02 gain 67 119 -93.89 gain 119 67 -98.06 gain 67 120 -84.06 gain 120 67 -85.62 gain 67 121 -86.46 gain 121 67 -89.04 gain 67 122 -87.43 gain 122 67 -89.76 gain 67 123 -81.50 gain 123 67 -84.17 gain 67 124 -88.34 gain 124 67 -89.00 gain 67 125 -86.63 gain 125 67 -90.63 gain 67 126 -85.24 gain 126 67 -85.88 gain 67 127 -84.55 gain 127 67 -84.82 gain 67 128 -81.14 gain 128 67 -84.00 gain 67 129 -85.93 gain 129 67 -86.01 gain 67 130 -81.81 gain 130 67 -83.17 gain 67 131 -80.03 gain 131 67 -81.17 gain 67 132 -86.17 gain 132 67 -83.32 gain 67 133 -86.64 gain 133 67 -88.96 gain 67 134 -97.14 gain 134 67 -96.33 gain 67 135 -98.27 gain 135 67 -99.77 gain 67 136 -88.22 gain 136 67 -90.16 gain 67 137 -91.14 gain 137 67 -95.99 gain 67 138 -85.41 gain 138 67 -83.78 gain 67 139 -83.10 gain 139 67 -84.74 gain 67 140 -87.32 gain 140 67 -89.79 gain 67 141 -85.39 gain 141 67 -79.83 gain 67 142 -81.02 gain 142 67 -82.21 gain 67 143 -91.73 gain 143 67 -95.65 gain 67 144 -79.84 gain 144 67 -82.13 gain 67 145 -84.43 gain 145 67 -90.10 gain 67 146 -81.34 gain 146 67 -83.00 gain 67 147 -86.53 gain 147 67 -85.30 gain 67 148 -90.67 gain 148 67 -87.77 gain 67 149 -87.56 gain 149 67 -88.31 gain 67 150 -87.50 gain 150 67 -89.10 gain 67 151 -91.25 gain 151 67 -91.78 gain 67 152 -83.67 gain 152 67 -84.02 gain 67 153 -86.04 gain 153 67 -85.60 gain 67 154 -86.67 gain 154 67 -88.14 gain 67 155 -89.99 gain 155 67 -90.03 gain 67 156 -84.25 gain 156 67 -83.52 gain 67 157 -85.18 gain 157 67 -86.93 gain 67 158 -80.31 gain 158 67 -81.56 gain 67 159 -79.94 gain 159 67 -83.58 gain 67 160 -85.75 gain 160 67 -86.53 gain 67 161 -92.18 gain 161 67 -95.41 gain 67 162 -83.50 gain 162 67 -86.44 gain 67 163 -89.49 gain 163 67 -94.34 gain 67 164 -90.75 gain 164 67 -94.97 gain 67 165 -98.19 gain 165 67 -99.47 gain 67 166 -91.07 gain 166 67 -92.11 gain 67 167 -96.14 gain 167 67 -97.89 gain 67 168 -95.89 gain 168 67 -96.54 gain 67 169 -87.74 gain 169 67 -89.50 gain 67 170 -91.05 gain 170 67 -92.05 gain 67 171 -84.07 gain 171 67 -86.15 gain 67 172 -93.84 gain 172 67 -94.11 gain 67 173 -87.76 gain 173 67 -92.68 gain 67 174 -93.00 gain 174 67 -93.97 gain 67 175 -85.09 gain 175 67 -87.19 gain 67 176 -89.99 gain 176 67 -91.06 gain 67 177 -91.25 gain 177 67 -95.32 gain 67 178 -91.05 gain 178 67 -88.56 gain 67 179 -92.25 gain 179 67 -89.18 gain 67 180 -91.27 gain 180 67 -97.65 gain 67 181 -90.78 gain 181 67 -91.19 gain 67 182 -90.33 gain 182 67 -91.82 gain 67 183 -95.03 gain 183 67 -96.79 gain 67 184 -91.05 gain 184 67 -95.56 gain 67 185 -90.49 gain 185 67 -98.87 gain 67 186 -91.02 gain 186 67 -94.98 gain 67 187 -88.09 gain 187 67 -89.78 gain 67 188 -92.05 gain 188 67 -96.15 gain 67 189 -92.16 gain 189 67 -90.99 gain 67 190 -92.38 gain 190 67 -95.12 gain 67 191 -86.99 gain 191 67 -88.43 gain 67 192 -93.29 gain 192 67 -93.43 gain 67 193 -86.61 gain 193 67 -85.74 gain 67 194 -92.41 gain 194 67 -92.31 gain 67 195 -89.30 gain 195 67 -87.76 gain 67 196 -90.37 gain 196 67 -93.14 gain 67 197 -97.12 gain 197 67 -95.02 gain 67 198 -89.59 gain 198 67 -92.00 gain 67 199 -96.13 gain 199 67 -98.65 gain 67 200 -96.68 gain 200 67 -100.54 gain 67 201 -90.57 gain 201 67 -94.33 gain 67 202 -98.01 gain 202 67 -100.91 gain 67 203 -91.20 gain 203 67 -93.21 gain 67 204 -95.10 gain 204 67 -93.76 gain 67 205 -98.59 gain 205 67 -100.99 gain 67 206 -94.86 gain 206 67 -98.37 gain 67 207 -93.16 gain 207 67 -96.09 gain 67 208 -94.25 gain 208 67 -99.77 gain 67 209 -93.35 gain 209 67 -98.45 gain 67 210 -95.67 gain 210 67 -100.94 gain 67 211 -88.13 gain 211 67 -88.63 gain 67 212 -98.69 gain 212 67 -102.21 gain 67 213 -93.10 gain 213 67 -95.95 gain 67 214 -89.26 gain 214 67 -97.49 gain 67 215 -91.49 gain 215 67 -95.12 gain 67 216 -95.14 gain 216 67 -102.69 gain 67 217 -92.75 gain 217 67 -100.56 gain 67 218 -86.53 gain 218 67 -87.15 gain 67 219 -96.85 gain 219 67 -97.95 gain 67 220 -85.87 gain 220 67 -83.05 gain 67 221 -87.27 gain 221 67 -90.13 gain 67 222 -96.63 gain 222 67 -95.30 gain 67 223 -90.69 gain 223 67 -92.60 gain 67 224 -97.41 gain 224 67 -99.79 gain 68 69 -69.01 gain 69 68 -66.23 gain 68 70 -79.19 gain 70 68 -74.88 gain 68 71 -80.29 gain 71 68 -79.55 gain 68 72 -81.86 gain 72 68 -78.66 gain 68 73 -91.55 gain 73 68 -89.73 gain 68 74 -79.65 gain 74 68 -73.94 gain 68 75 -91.97 gain 75 68 -92.16 gain 68 76 -90.04 gain 76 68 -90.35 gain 68 77 -88.21 gain 77 68 -84.51 gain 68 78 -86.51 gain 78 68 -87.31 gain 68 79 -82.48 gain 79 68 -82.91 gain 68 80 -78.77 gain 80 68 -76.99 gain 68 81 -77.29 gain 81 68 -76.42 gain 68 82 -78.02 gain 82 68 -78.12 gain 68 83 -67.49 gain 83 68 -64.86 gain 68 84 -67.94 gain 84 68 -62.50 gain 68 85 -80.29 gain 85 68 -80.28 gain 68 86 -81.43 gain 86 68 -83.05 gain 68 87 -82.19 gain 87 68 -81.10 gain 68 88 -88.42 gain 88 68 -86.98 gain 68 89 -88.96 gain 89 68 -89.66 gain 68 90 -97.50 gain 90 68 -97.54 gain 68 91 -75.47 gain 91 68 -76.58 gain 68 92 -96.81 gain 92 68 -98.83 gain 68 93 -80.67 gain 93 68 -80.06 gain 68 94 -85.08 gain 94 68 -83.03 gain 68 95 -82.79 gain 95 68 -79.99 gain 68 96 -81.79 gain 96 68 -85.96 gain 68 97 -70.99 gain 97 68 -67.98 gain 68 98 -76.16 gain 98 68 -73.62 gain 68 99 -81.75 gain 99 68 -78.35 gain 68 100 -81.07 gain 100 68 -77.58 gain 68 101 -79.17 gain 101 68 -79.31 gain 68 102 -86.65 gain 102 68 -86.76 gain 68 103 -85.79 gain 103 68 -87.06 gain 68 104 -80.42 gain 104 68 -84.18 gain 68 105 -99.60 gain 105 68 -97.88 gain 68 106 -92.74 gain 106 68 -88.35 gain 68 107 -80.76 gain 107 68 -76.28 gain 68 108 -96.91 gain 108 68 -92.05 gain 68 109 -84.76 gain 109 68 -83.35 gain 68 110 -86.96 gain 110 68 -91.90 gain 68 111 -81.96 gain 111 68 -76.88 gain 68 112 -82.18 gain 112 68 -80.56 gain 68 113 -78.37 gain 113 68 -75.88 gain 68 114 -82.22 gain 114 68 -76.90 gain 68 115 -86.50 gain 115 68 -81.83 gain 68 116 -82.25 gain 116 68 -80.01 gain 68 117 -87.29 gain 117 68 -82.20 gain 68 118 -94.55 gain 118 68 -91.07 gain 68 119 -86.99 gain 119 68 -88.58 gain 68 120 -93.24 gain 120 68 -92.20 gain 68 121 -91.53 gain 121 68 -91.52 gain 68 122 -89.98 gain 122 68 -89.72 gain 68 123 -87.89 gain 123 68 -87.97 gain 68 124 -92.25 gain 124 68 -90.32 gain 68 125 -87.29 gain 125 68 -88.70 gain 68 126 -84.22 gain 126 68 -82.27 gain 68 127 -83.22 gain 127 68 -80.91 gain 68 128 -75.25 gain 128 68 -75.53 gain 68 129 -83.73 gain 129 68 -81.22 gain 68 130 -86.53 gain 130 68 -85.31 gain 68 131 -93.37 gain 131 68 -91.92 gain 68 132 -82.78 gain 132 68 -77.34 gain 68 133 -93.79 gain 133 68 -93.53 gain 68 134 -92.75 gain 134 68 -89.35 gain 68 135 -88.87 gain 135 68 -87.77 gain 68 136 -94.03 gain 136 68 -93.37 gain 68 137 -96.56 gain 137 68 -98.82 gain 68 138 -91.40 gain 138 68 -87.19 gain 68 139 -89.77 gain 139 68 -88.82 gain 68 140 -91.13 gain 140 68 -91.01 gain 68 141 -94.10 gain 141 68 -85.95 gain 68 142 -80.20 gain 142 68 -78.80 gain 68 143 -88.96 gain 143 68 -90.30 gain 68 144 -90.19 gain 144 68 -89.88 gain 68 145 -93.88 gain 145 68 -96.97 gain 68 146 -83.81 gain 146 68 -82.89 gain 68 147 -95.89 gain 147 68 -92.08 gain 68 148 -97.65 gain 148 68 -92.16 gain 68 149 -92.77 gain 149 68 -90.94 gain 68 150 -94.55 gain 150 68 -93.56 gain 68 151 -88.38 gain 151 68 -86.33 gain 68 152 -96.27 gain 152 68 -94.03 gain 68 153 -91.98 gain 153 68 -88.95 gain 68 154 -92.43 gain 154 68 -91.31 gain 68 155 -93.58 gain 155 68 -91.04 gain 68 156 -88.48 gain 156 68 -85.16 gain 68 157 -87.66 gain 157 68 -86.83 gain 68 158 -93.23 gain 158 68 -91.89 gain 68 159 -93.40 gain 159 68 -94.44 gain 68 160 -93.80 gain 160 68 -92.00 gain 68 161 -93.14 gain 161 68 -93.78 gain 68 162 -88.94 gain 162 68 -89.29 gain 68 163 -97.72 gain 163 68 -99.98 gain 68 164 -94.99 gain 164 68 -96.63 gain 68 165 -91.05 gain 165 68 -89.75 gain 68 166 -97.17 gain 166 68 -95.61 gain 68 167 -98.17 gain 167 68 -97.34 gain 68 168 -99.48 gain 168 68 -97.55 gain 68 169 -89.66 gain 169 68 -88.83 gain 68 170 -89.75 gain 170 68 -88.16 gain 68 171 -89.63 gain 171 68 -89.12 gain 68 172 -91.37 gain 172 68 -89.05 gain 68 173 -90.53 gain 173 68 -92.86 gain 68 174 -94.22 gain 174 68 -92.60 gain 68 175 -90.81 gain 175 68 -90.32 gain 68 176 -89.68 gain 176 68 -88.15 gain 68 177 -95.87 gain 177 68 -97.35 gain 68 178 -92.49 gain 178 68 -87.41 gain 68 179 -91.86 gain 179 68 -86.20 gain 68 180 -95.43 gain 180 68 -99.22 gain 68 181 -94.89 gain 181 68 -92.71 gain 68 182 -97.87 gain 182 68 -96.77 gain 68 183 -93.67 gain 183 68 -92.84 gain 68 184 -100.35 gain 184 68 -102.27 gain 68 185 -89.79 gain 185 68 -95.58 gain 68 186 -98.39 gain 186 68 -99.76 gain 68 187 -91.39 gain 187 68 -90.49 gain 68 188 -91.55 gain 188 68 -93.06 gain 68 189 -96.16 gain 189 68 -92.39 gain 68 190 -88.33 gain 190 68 -88.48 gain 68 191 -93.55 gain 191 68 -92.41 gain 68 192 -102.00 gain 192 68 -99.55 gain 68 193 -91.95 gain 193 68 -88.49 gain 68 194 -94.06 gain 194 68 -91.38 gain 68 195 -100.69 gain 195 68 -96.56 gain 68 196 -108.64 gain 196 68 -108.82 gain 68 197 -93.25 gain 197 68 -88.57 gain 68 198 -92.51 gain 198 68 -92.34 gain 68 199 -97.01 gain 199 68 -96.94 gain 68 200 -96.04 gain 200 68 -97.31 gain 68 201 -95.70 gain 201 68 -96.88 gain 68 202 -95.92 gain 202 68 -96.24 gain 68 203 -97.69 gain 203 68 -97.12 gain 68 204 -100.18 gain 204 68 -96.25 gain 68 205 -93.55 gain 205 68 -93.36 gain 68 206 -92.57 gain 206 68 -93.49 gain 68 207 -94.78 gain 207 68 -95.12 gain 68 208 -98.57 gain 208 68 -101.51 gain 68 209 -96.38 gain 209 68 -98.90 gain 68 210 -95.90 gain 210 68 -98.58 gain 68 211 -98.19 gain 211 68 -96.11 gain 68 212 -97.09 gain 212 68 -98.02 gain 68 213 -96.89 gain 213 68 -97.15 gain 68 214 -97.09 gain 214 68 -102.73 gain 68 215 -93.44 gain 215 68 -94.48 gain 68 216 -96.30 gain 216 68 -101.25 gain 68 217 -100.06 gain 217 68 -105.27 gain 68 218 -92.08 gain 218 68 -90.10 gain 68 219 -91.35 gain 219 68 -89.86 gain 68 220 -96.44 gain 220 68 -91.03 gain 68 221 -99.06 gain 221 68 -99.33 gain 68 222 -90.77 gain 222 68 -86.85 gain 68 223 -99.12 gain 223 68 -98.44 gain 68 224 -99.59 gain 224 68 -99.38 gain 69 70 -58.62 gain 70 69 -57.09 gain 69 71 -80.65 gain 71 69 -82.69 gain 69 72 -75.07 gain 72 69 -74.66 gain 69 73 -80.00 gain 73 69 -80.96 gain 69 74 -79.28 gain 74 69 -76.36 gain 69 75 -90.28 gain 75 69 -93.24 gain 69 76 -88.64 gain 76 69 -91.73 gain 69 77 -90.81 gain 77 69 -89.89 gain 69 78 -87.62 gain 78 69 -91.21 gain 69 79 -88.98 gain 79 69 -92.19 gain 69 80 -83.55 gain 80 69 -84.55 gain 69 81 -76.64 gain 81 69 -78.55 gain 69 82 -81.91 gain 82 69 -84.79 gain 69 83 -78.57 gain 83 69 -78.73 gain 69 84 -70.77 gain 84 69 -68.12 gain 69 85 -69.41 gain 85 69 -72.19 gain 69 86 -74.66 gain 86 69 -79.08 gain 69 87 -74.89 gain 87 69 -76.60 gain 69 88 -77.73 gain 88 69 -79.07 gain 69 89 -82.69 gain 89 69 -86.17 gain 69 90 -91.69 gain 90 69 -94.51 gain 69 91 -89.36 gain 91 69 -93.25 gain 69 92 -87.26 gain 92 69 -92.07 gain 69 93 -91.30 gain 93 69 -93.47 gain 69 94 -84.94 gain 94 69 -85.68 gain 69 95 -85.47 gain 95 69 -85.45 gain 69 96 -80.90 gain 96 69 -87.85 gain 69 97 -82.22 gain 97 69 -81.99 gain 69 98 -76.10 gain 98 69 -76.34 gain 69 99 -73.34 gain 99 69 -72.72 gain 69 100 -68.80 gain 100 69 -68.09 gain 69 101 -82.17 gain 101 69 -85.10 gain 69 102 -82.48 gain 102 69 -85.37 gain 69 103 -80.67 gain 103 69 -84.73 gain 69 104 -94.84 gain 104 69 -101.38 gain 69 105 -96.75 gain 105 69 -97.81 gain 69 106 -96.89 gain 106 69 -95.28 gain 69 107 -97.15 gain 107 69 -95.45 gain 69 108 -86.56 gain 108 69 -84.48 gain 69 109 -82.21 gain 109 69 -83.58 gain 69 110 -78.00 gain 110 69 -85.73 gain 69 111 -81.36 gain 111 69 -79.06 gain 69 112 -77.00 gain 112 69 -78.17 gain 69 113 -76.47 gain 113 69 -76.76 gain 69 114 -81.06 gain 114 69 -78.52 gain 69 115 -79.88 gain 115 69 -77.99 gain 69 116 -81.96 gain 116 69 -82.50 gain 69 117 -86.27 gain 117 69 -83.96 gain 69 118 -88.18 gain 118 69 -87.49 gain 69 119 -89.43 gain 119 69 -93.80 gain 69 120 -98.96 gain 120 69 -100.71 gain 69 121 -93.06 gain 121 69 -95.83 gain 69 122 -86.41 gain 122 69 -88.94 gain 69 123 -94.00 gain 123 69 -96.86 gain 69 124 -88.43 gain 124 69 -89.28 gain 69 125 -91.30 gain 125 69 -95.50 gain 69 126 -86.98 gain 126 69 -87.82 gain 69 127 -88.37 gain 127 69 -88.84 gain 69 128 -78.89 gain 128 69 -81.95 gain 69 129 -68.67 gain 129 69 -68.94 gain 69 130 -86.47 gain 130 69 -88.03 gain 69 131 -86.95 gain 131 69 -88.29 gain 69 132 -82.61 gain 132 69 -79.95 gain 69 133 -88.91 gain 133 69 -91.43 gain 69 134 -86.84 gain 134 69 -86.23 gain 69 135 -93.32 gain 135 69 -95.01 gain 69 136 -82.58 gain 136 69 -84.71 gain 69 137 -81.45 gain 137 69 -86.49 gain 69 138 -90.99 gain 138 69 -89.57 gain 69 139 -93.19 gain 139 69 -95.03 gain 69 140 -83.87 gain 140 69 -86.54 gain 69 141 -83.56 gain 141 69 -78.20 gain 69 142 -88.29 gain 142 69 -89.67 gain 69 143 -82.65 gain 143 69 -86.76 gain 69 144 -82.44 gain 144 69 -84.93 gain 69 145 -83.83 gain 145 69 -89.70 gain 69 146 -81.69 gain 146 69 -83.55 gain 69 147 -86.21 gain 147 69 -85.18 gain 69 148 -93.18 gain 148 69 -90.48 gain 69 149 -89.34 gain 149 69 -90.30 gain 69 150 -98.09 gain 150 69 -99.88 gain 69 151 -93.53 gain 151 69 -94.26 gain 69 152 -91.25 gain 152 69 -91.79 gain 69 153 -97.96 gain 153 69 -97.72 gain 69 154 -92.11 gain 154 69 -93.78 gain 69 155 -89.54 gain 155 69 -89.78 gain 69 156 -81.60 gain 156 69 -81.07 gain 69 157 -85.59 gain 157 69 -87.54 gain 69 158 -83.26 gain 158 69 -84.71 gain 69 159 -83.32 gain 159 69 -87.15 gain 69 160 -92.24 gain 160 69 -93.23 gain 69 161 -87.67 gain 161 69 -91.10 gain 69 162 -92.77 gain 162 69 -95.91 gain 69 163 -93.38 gain 163 69 -98.43 gain 69 164 -87.48 gain 164 69 -91.90 gain 69 165 -95.99 gain 165 69 -97.47 gain 69 166 -98.04 gain 166 69 -99.27 gain 69 167 -95.17 gain 167 69 -97.13 gain 69 168 -89.08 gain 168 69 -89.93 gain 69 169 -97.15 gain 169 69 -99.11 gain 69 170 -90.51 gain 170 69 -91.70 gain 69 171 -86.96 gain 171 69 -89.23 gain 69 172 -86.18 gain 172 69 -86.65 gain 69 173 -91.77 gain 173 69 -96.88 gain 69 174 -86.71 gain 174 69 -87.87 gain 69 175 -96.44 gain 175 69 -98.73 gain 69 176 -100.11 gain 176 69 -101.38 gain 69 177 -80.34 gain 177 69 -84.60 gain 69 178 -93.82 gain 178 69 -91.53 gain 69 179 -95.40 gain 179 69 -92.53 gain 69 180 -90.20 gain 180 69 -96.78 gain 69 181 -97.50 gain 181 69 -98.10 gain 69 182 -95.34 gain 182 69 -97.03 gain 69 183 -90.39 gain 183 69 -92.35 gain 69 184 -95.12 gain 184 69 -99.83 gain 69 185 -82.60 gain 185 69 -91.17 gain 69 186 -91.83 gain 186 69 -95.98 gain 69 187 -96.46 gain 187 69 -98.35 gain 69 188 -93.65 gain 188 69 -97.95 gain 69 189 -91.31 gain 189 69 -90.33 gain 69 190 -83.91 gain 190 69 -86.84 gain 69 191 -90.83 gain 191 69 -92.47 gain 69 192 -85.99 gain 192 69 -86.33 gain 69 193 -86.74 gain 193 69 -86.07 gain 69 194 -89.45 gain 194 69 -89.55 gain 69 195 -98.48 gain 195 69 -97.13 gain 69 196 -98.92 gain 196 69 -101.88 gain 69 197 -93.44 gain 197 69 -91.54 gain 69 198 -93.33 gain 198 69 -95.94 gain 69 199 -91.39 gain 199 69 -94.11 gain 69 200 -92.53 gain 200 69 -96.58 gain 69 201 -94.06 gain 201 69 -98.02 gain 69 202 -93.00 gain 202 69 -96.10 gain 69 203 -97.72 gain 203 69 -99.93 gain 69 204 -91.49 gain 204 69 -90.35 gain 69 205 -93.51 gain 205 69 -96.11 gain 69 206 -93.62 gain 206 69 -97.32 gain 69 207 -94.57 gain 207 69 -97.69 gain 69 208 -93.89 gain 208 69 -99.61 gain 69 209 -98.57 gain 209 69 -103.87 gain 69 210 -96.56 gain 210 69 -102.03 gain 69 211 -99.41 gain 211 69 -100.12 gain 69 212 -95.75 gain 212 69 -99.46 gain 69 213 -89.62 gain 213 69 -92.67 gain 69 214 -97.62 gain 214 69 -106.05 gain 69 215 -94.05 gain 215 69 -97.88 gain 69 216 -96.43 gain 216 69 -104.17 gain 69 217 -85.03 gain 217 69 -93.03 gain 69 218 -89.24 gain 218 69 -90.05 gain 69 219 -94.00 gain 219 69 -95.29 gain 69 220 -91.14 gain 220 69 -88.52 gain 69 221 -90.44 gain 221 69 -93.50 gain 69 222 -94.01 gain 222 69 -92.88 gain 69 223 -93.80 gain 223 69 -95.90 gain 69 224 -92.40 gain 224 69 -94.97 gain 70 71 -63.75 gain 71 70 -67.32 gain 70 72 -69.15 gain 72 70 -70.28 gain 70 73 -67.40 gain 73 70 -69.90 gain 70 74 -77.81 gain 74 70 -76.42 gain 70 75 -94.57 gain 75 70 -99.07 gain 70 76 -88.83 gain 76 70 -93.45 gain 70 77 -83.38 gain 77 70 -84.00 gain 70 78 -88.17 gain 78 70 -93.29 gain 70 79 -81.35 gain 79 70 -86.09 gain 70 80 -81.74 gain 80 70 -84.27 gain 70 81 -79.22 gain 81 70 -82.67 gain 70 82 -80.92 gain 82 70 -85.34 gain 70 83 -78.10 gain 83 70 -79.80 gain 70 84 -67.85 gain 84 70 -66.73 gain 70 85 -65.18 gain 85 70 -69.49 gain 70 86 -64.60 gain 86 70 -70.54 gain 70 87 -77.29 gain 87 70 -80.53 gain 70 88 -77.02 gain 88 70 -79.90 gain 70 89 -84.28 gain 89 70 -89.30 gain 70 90 -85.90 gain 90 70 -90.26 gain 70 91 -101.62 gain 91 70 -107.05 gain 70 92 -84.75 gain 92 70 -91.10 gain 70 93 -84.38 gain 93 70 -88.08 gain 70 94 -87.08 gain 94 70 -89.35 gain 70 95 -87.57 gain 95 70 -89.08 gain 70 96 -75.89 gain 96 70 -84.38 gain 70 97 -76.57 gain 97 70 -77.88 gain 70 98 -75.60 gain 98 70 -77.38 gain 70 99 -66.52 gain 99 70 -67.43 gain 70 100 -73.65 gain 100 70 -74.48 gain 70 101 -69.51 gain 101 70 -73.97 gain 70 102 -78.56 gain 102 70 -82.98 gain 70 103 -76.51 gain 103 70 -82.10 gain 70 104 -83.67 gain 104 70 -91.75 gain 70 105 -93.39 gain 105 70 -95.99 gain 70 106 -96.47 gain 106 70 -96.40 gain 70 107 -88.61 gain 107 70 -88.44 gain 70 108 -84.61 gain 108 70 -84.06 gain 70 109 -87.54 gain 109 70 -90.44 gain 70 110 -84.44 gain 110 70 -93.71 gain 70 111 -85.20 gain 111 70 -84.43 gain 70 112 -85.31 gain 112 70 -88.01 gain 70 113 -73.12 gain 113 70 -74.94 gain 70 114 -81.97 gain 114 70 -80.96 gain 70 115 -76.68 gain 115 70 -76.32 gain 70 116 -78.56 gain 116 70 -80.64 gain 70 117 -74.44 gain 117 70 -73.66 gain 70 118 -88.57 gain 118 70 -89.41 gain 70 119 -88.40 gain 119 70 -94.30 gain 70 120 -90.13 gain 120 70 -93.41 gain 70 121 -99.90 gain 121 70 -104.21 gain 70 122 -91.28 gain 122 70 -95.34 gain 70 123 -88.43 gain 123 70 -92.82 gain 70 124 -87.95 gain 124 70 -90.34 gain 70 125 -85.80 gain 125 70 -91.52 gain 70 126 -92.59 gain 126 70 -94.97 gain 70 127 -79.75 gain 127 70 -81.75 gain 70 128 -86.38 gain 128 70 -90.98 gain 70 129 -76.89 gain 129 70 -78.70 gain 70 130 -80.79 gain 130 70 -83.88 gain 70 131 -83.91 gain 131 70 -86.78 gain 70 132 -82.95 gain 132 70 -81.82 gain 70 133 -80.86 gain 133 70 -84.91 gain 70 134 -78.91 gain 134 70 -79.82 gain 70 135 -91.03 gain 135 70 -94.25 gain 70 136 -89.90 gain 136 70 -93.56 gain 70 137 -84.48 gain 137 70 -91.06 gain 70 138 -89.67 gain 138 70 -89.78 gain 70 139 -93.11 gain 139 70 -96.48 gain 70 140 -92.27 gain 140 70 -96.47 gain 70 141 -82.09 gain 141 70 -78.27 gain 70 142 -85.08 gain 142 70 -87.99 gain 70 143 -87.36 gain 143 70 -93.01 gain 70 144 -85.99 gain 144 70 -90.00 gain 70 145 -83.56 gain 145 70 -90.96 gain 70 146 -85.42 gain 146 70 -88.81 gain 70 147 -80.43 gain 147 70 -80.93 gain 70 148 -85.24 gain 148 70 -84.07 gain 70 149 -89.56 gain 149 70 -92.04 gain 70 150 -99.16 gain 150 70 -102.48 gain 70 151 -87.01 gain 151 70 -89.27 gain 70 152 -94.65 gain 152 70 -96.73 gain 70 153 -85.86 gain 153 70 -87.16 gain 70 154 -95.34 gain 154 70 -98.53 gain 70 155 -87.07 gain 155 70 -88.84 gain 70 156 -88.76 gain 156 70 -89.76 gain 70 157 -89.68 gain 157 70 -93.16 gain 70 158 -85.59 gain 158 70 -88.57 gain 70 159 -77.41 gain 159 70 -82.77 gain 70 160 -86.80 gain 160 70 -89.32 gain 70 161 -85.27 gain 161 70 -90.23 gain 70 162 -88.41 gain 162 70 -93.08 gain 70 163 -92.17 gain 163 70 -98.75 gain 70 164 -78.24 gain 164 70 -84.19 gain 70 165 -101.46 gain 165 70 -104.47 gain 70 166 -100.54 gain 166 70 -103.30 gain 70 167 -91.99 gain 167 70 -95.47 gain 70 168 -92.49 gain 168 70 -94.87 gain 70 169 -94.38 gain 169 70 -97.87 gain 70 170 -97.16 gain 170 70 -99.89 gain 70 171 -86.12 gain 171 70 -89.92 gain 70 172 -88.96 gain 172 70 -90.96 gain 70 173 -84.05 gain 173 70 -90.70 gain 70 174 -79.96 gain 174 70 -82.66 gain 70 175 -80.71 gain 175 70 -84.54 gain 70 176 -85.42 gain 176 70 -88.22 gain 70 177 -89.65 gain 177 70 -95.45 gain 70 178 -80.30 gain 178 70 -79.54 gain 70 179 -88.04 gain 179 70 -86.70 gain 70 180 -97.52 gain 180 70 -105.63 gain 70 181 -96.33 gain 181 70 -98.46 gain 70 182 -90.46 gain 182 70 -93.68 gain 70 183 -92.70 gain 183 70 -96.19 gain 70 184 -88.06 gain 184 70 -94.30 gain 70 185 -84.53 gain 185 70 -94.64 gain 70 186 -91.29 gain 186 70 -96.98 gain 70 187 -81.19 gain 187 70 -84.61 gain 70 188 -84.66 gain 188 70 -90.49 gain 70 189 -86.84 gain 189 70 -87.40 gain 70 190 -84.46 gain 190 70 -88.93 gain 70 191 -83.59 gain 191 70 -86.77 gain 70 192 -87.76 gain 192 70 -89.63 gain 70 193 -87.75 gain 193 70 -88.60 gain 70 194 -87.04 gain 194 70 -88.68 gain 70 195 -96.52 gain 195 70 -96.71 gain 70 196 -99.35 gain 196 70 -103.84 gain 70 197 -99.59 gain 197 70 -99.23 gain 70 198 -92.06 gain 198 70 -96.21 gain 70 199 -93.07 gain 199 70 -97.32 gain 70 200 -92.75 gain 200 70 -98.33 gain 70 201 -88.54 gain 201 70 -94.03 gain 70 202 -87.01 gain 202 70 -91.65 gain 70 203 -95.75 gain 203 70 -99.49 gain 70 204 -93.34 gain 204 70 -93.72 gain 70 205 -96.10 gain 205 70 -100.23 gain 70 206 -84.28 gain 206 70 -89.52 gain 70 207 -86.95 gain 207 70 -91.61 gain 70 208 -85.12 gain 208 70 -92.38 gain 70 209 -98.89 gain 209 70 -105.72 gain 70 210 -101.38 gain 210 70 -108.38 gain 70 211 -95.36 gain 211 70 -97.60 gain 70 212 -99.19 gain 212 70 -104.44 gain 70 213 -92.11 gain 213 70 -96.68 gain 70 214 -98.96 gain 214 70 -108.92 gain 70 215 -93.43 gain 215 70 -98.79 gain 70 216 -89.02 gain 216 70 -98.29 gain 70 217 -97.20 gain 217 70 -106.73 gain 70 218 -95.13 gain 218 70 -97.47 gain 70 219 -92.94 gain 219 70 -95.76 gain 70 220 -95.30 gain 220 70 -94.21 gain 70 221 -86.42 gain 221 70 -91.01 gain 70 222 -92.56 gain 222 70 -92.95 gain 70 223 -84.27 gain 223 70 -87.91 gain 70 224 -99.56 gain 224 70 -103.67 gain 71 72 -66.25 gain 72 71 -63.80 gain 71 73 -73.03 gain 73 71 -71.96 gain 71 74 -86.96 gain 74 71 -82.01 gain 71 75 -90.13 gain 75 71 -91.06 gain 71 76 -97.36 gain 76 71 -98.42 gain 71 77 -93.17 gain 77 71 -90.22 gain 71 78 -91.71 gain 78 71 -93.26 gain 71 79 -89.33 gain 79 71 -90.50 gain 71 80 -99.60 gain 80 71 -98.56 gain 71 81 -81.03 gain 81 71 -80.90 gain 71 82 -90.27 gain 82 71 -91.12 gain 71 83 -77.65 gain 83 71 -75.78 gain 71 84 -71.69 gain 84 71 -67.00 gain 71 85 -69.04 gain 85 71 -69.78 gain 71 86 -70.59 gain 86 71 -72.97 gain 71 87 -69.30 gain 87 71 -68.96 gain 71 88 -79.30 gain 88 71 -78.61 gain 71 89 -78.40 gain 89 71 -79.85 gain 71 90 -104.12 gain 90 71 -104.91 gain 71 91 -96.52 gain 91 71 -98.38 gain 71 92 -97.98 gain 92 71 -100.76 gain 71 93 -96.92 gain 93 71 -97.05 gain 71 94 -86.92 gain 94 71 -85.63 gain 71 95 -88.05 gain 95 71 -85.99 gain 71 96 -89.81 gain 96 71 -94.73 gain 71 97 -87.33 gain 97 71 -85.07 gain 71 98 -83.06 gain 98 71 -81.26 gain 71 99 -79.50 gain 99 71 -76.85 gain 71 100 -74.40 gain 100 71 -71.66 gain 71 101 -77.30 gain 101 71 -78.19 gain 71 102 -76.40 gain 102 71 -77.25 gain 71 103 -80.69 gain 103 71 -82.71 gain 71 104 -87.86 gain 104 71 -92.37 gain 71 105 -101.60 gain 105 71 -100.63 gain 71 106 -94.67 gain 106 71 -91.03 gain 71 107 -95.98 gain 107 71 -92.24 gain 71 108 -93.67 gain 108 71 -89.55 gain 71 109 -94.52 gain 109 71 -93.86 gain 71 110 -93.47 gain 110 71 -99.17 gain 71 111 -87.53 gain 111 71 -83.20 gain 71 112 -83.16 gain 112 71 -82.29 gain 71 113 -85.34 gain 113 71 -83.59 gain 71 114 -77.65 gain 114 71 -73.07 gain 71 115 -84.23 gain 115 71 -80.30 gain 71 116 -79.68 gain 116 71 -78.19 gain 71 117 -78.53 gain 117 71 -74.18 gain 71 118 -91.28 gain 118 71 -88.56 gain 71 119 -89.12 gain 119 71 -91.45 gain 71 120 -96.88 gain 120 71 -96.59 gain 71 121 -98.82 gain 121 71 -99.55 gain 71 122 -97.58 gain 122 71 -98.07 gain 71 123 -95.56 gain 123 71 -96.39 gain 71 124 -86.44 gain 124 71 -85.26 gain 71 125 -94.13 gain 125 71 -96.29 gain 71 126 -92.23 gain 126 71 -91.03 gain 71 127 -91.77 gain 127 71 -90.20 gain 71 128 -86.70 gain 128 71 -87.73 gain 71 129 -81.37 gain 129 71 -79.61 gain 71 130 -83.67 gain 130 71 -83.19 gain 71 131 -79.52 gain 131 71 -78.82 gain 71 132 -84.40 gain 132 71 -79.71 gain 71 133 -89.99 gain 133 71 -90.48 gain 71 134 -88.62 gain 134 71 -85.96 gain 71 135 -93.07 gain 135 71 -92.72 gain 71 136 -95.82 gain 136 71 -95.91 gain 71 137 -98.93 gain 137 71 -101.93 gain 71 138 -90.58 gain 138 71 -87.11 gain 71 139 -90.74 gain 139 71 -90.54 gain 71 140 -96.58 gain 140 71 -97.21 gain 71 141 -93.08 gain 141 71 -85.68 gain 71 142 -87.91 gain 142 71 -87.25 gain 71 143 -92.27 gain 143 71 -94.35 gain 71 144 -87.47 gain 144 71 -87.92 gain 71 145 -86.79 gain 145 71 -90.62 gain 71 146 -79.25 gain 146 71 -79.07 gain 71 147 -86.66 gain 147 71 -83.60 gain 71 148 -87.10 gain 148 71 -82.36 gain 71 149 -87.31 gain 149 71 -86.23 gain 71 150 -94.84 gain 150 71 -94.60 gain 71 151 -97.76 gain 151 71 -96.45 gain 71 152 -101.41 gain 152 71 -99.92 gain 71 153 -99.14 gain 153 71 -96.87 gain 71 154 -101.80 gain 154 71 -101.42 gain 71 155 -99.83 gain 155 71 -98.03 gain 71 156 -88.09 gain 156 71 -85.52 gain 71 157 -88.69 gain 157 71 -88.61 gain 71 158 -92.84 gain 158 71 -92.25 gain 71 159 -93.42 gain 159 71 -95.21 gain 71 160 -82.88 gain 160 71 -81.82 gain 71 161 -94.10 gain 161 71 -95.49 gain 71 162 -85.46 gain 162 71 -86.56 gain 71 163 -95.47 gain 163 71 -98.48 gain 71 164 -87.91 gain 164 71 -90.29 gain 71 165 -106.10 gain 165 71 -105.54 gain 71 166 -99.15 gain 166 71 -98.34 gain 71 167 -106.77 gain 167 71 -106.68 gain 71 168 -99.14 gain 168 71 -97.95 gain 71 169 -99.55 gain 169 71 -99.48 gain 71 170 -92.96 gain 170 71 -92.12 gain 71 171 -99.47 gain 171 71 -99.70 gain 71 172 -94.75 gain 172 71 -93.18 gain 71 173 -92.60 gain 173 71 -95.67 gain 71 174 -89.01 gain 174 71 -88.14 gain 71 175 -86.15 gain 175 71 -86.41 gain 71 176 -95.17 gain 176 71 -94.39 gain 71 177 -94.49 gain 177 71 -96.72 gain 71 178 -98.67 gain 178 71 -94.34 gain 71 179 -95.76 gain 179 71 -90.85 gain 71 180 -98.51 gain 180 71 -103.05 gain 71 181 -99.38 gain 181 71 -97.95 gain 71 182 -94.72 gain 182 71 -94.37 gain 71 183 -102.80 gain 183 71 -102.73 gain 71 184 -101.29 gain 184 71 -103.97 gain 71 185 -93.81 gain 185 71 -100.35 gain 71 186 -93.00 gain 186 71 -95.12 gain 71 187 -97.82 gain 187 71 -97.66 gain 71 188 -93.94 gain 188 71 -96.20 gain 71 189 -95.25 gain 189 71 -92.24 gain 71 190 -90.61 gain 190 71 -91.51 gain 71 191 -90.59 gain 191 71 -90.20 gain 71 192 -87.65 gain 192 71 -85.95 gain 71 193 -98.09 gain 193 71 -95.38 gain 71 194 -96.83 gain 194 71 -94.90 gain 71 195 -96.27 gain 195 71 -92.88 gain 71 196 -97.82 gain 196 71 -98.74 gain 71 197 -100.99 gain 197 71 -97.05 gain 71 198 -99.57 gain 198 71 -100.14 gain 71 199 -97.20 gain 199 71 -97.88 gain 71 200 -94.59 gain 200 71 -96.61 gain 71 201 -93.79 gain 201 71 -95.72 gain 71 202 -89.22 gain 202 71 -90.29 gain 71 203 -93.56 gain 203 71 -93.74 gain 71 204 -92.13 gain 204 71 -88.95 gain 71 205 -97.49 gain 205 71 -98.05 gain 71 206 -89.72 gain 206 71 -91.39 gain 71 207 -94.35 gain 207 71 -95.44 gain 71 208 -85.86 gain 208 71 -89.54 gain 71 209 -96.12 gain 209 71 -99.38 gain 71 210 -97.98 gain 210 71 -101.41 gain 71 211 -96.66 gain 211 71 -95.32 gain 71 212 -106.79 gain 212 71 -108.47 gain 71 213 -102.32 gain 213 71 -103.33 gain 71 214 -97.43 gain 214 71 -103.82 gain 71 215 -97.95 gain 215 71 -99.74 gain 71 216 -97.40 gain 216 71 -103.10 gain 71 217 -91.40 gain 217 71 -97.37 gain 71 218 -88.65 gain 218 71 -87.43 gain 71 219 -91.58 gain 219 71 -90.83 gain 71 220 -95.56 gain 220 71 -90.90 gain 71 221 -95.39 gain 221 71 -96.41 gain 71 222 -92.52 gain 222 71 -89.35 gain 71 223 -93.80 gain 223 71 -93.87 gain 71 224 -89.99 gain 224 71 -90.52 gain 72 73 -64.84 gain 73 72 -66.21 gain 72 74 -75.58 gain 74 72 -73.06 gain 72 75 -97.66 gain 75 72 -101.04 gain 72 76 -91.17 gain 76 72 -94.67 gain 72 77 -90.91 gain 77 72 -90.40 gain 72 78 -95.20 gain 78 72 -99.20 gain 72 79 -87.39 gain 79 72 -91.01 gain 72 80 -88.96 gain 80 72 -90.37 gain 72 81 -86.61 gain 81 72 -88.93 gain 72 82 -83.43 gain 82 72 -86.72 gain 72 83 -87.19 gain 83 72 -87.76 gain 72 84 -78.45 gain 84 72 -76.21 gain 72 85 -65.14 gain 85 72 -68.33 gain 72 86 -70.41 gain 86 72 -75.23 gain 72 87 -52.37 gain 87 72 -54.48 gain 72 88 -71.95 gain 88 72 -73.70 gain 72 89 -70.18 gain 89 72 -74.08 gain 72 90 -92.45 gain 90 72 -95.68 gain 72 91 -95.03 gain 91 72 -99.33 gain 72 92 -95.53 gain 92 72 -100.75 gain 72 93 -94.00 gain 93 72 -96.58 gain 72 94 -88.95 gain 94 72 -90.10 gain 72 95 -94.85 gain 95 72 -95.24 gain 72 96 -93.39 gain 96 72 -100.74 gain 72 97 -82.68 gain 97 72 -82.86 gain 72 98 -84.39 gain 98 72 -85.04 gain 72 99 -78.91 gain 99 72 -78.70 gain 72 100 -69.61 gain 100 72 -69.31 gain 72 101 -74.14 gain 101 72 -77.48 gain 72 102 -70.81 gain 102 72 -74.11 gain 72 103 -72.58 gain 103 72 -77.05 gain 72 104 -83.67 gain 104 72 -90.62 gain 72 105 -95.66 gain 105 72 -97.13 gain 72 106 -95.29 gain 106 72 -94.10 gain 72 107 -93.85 gain 107 72 -92.56 gain 72 108 -94.51 gain 108 72 -92.84 gain 72 109 -89.60 gain 109 72 -91.38 gain 72 110 -85.75 gain 110 72 -93.89 gain 72 111 -92.51 gain 111 72 -90.62 gain 72 112 -84.86 gain 112 72 -86.43 gain 72 113 -87.19 gain 113 72 -87.89 gain 72 114 -88.23 gain 114 72 -86.10 gain 72 115 -78.98 gain 115 72 -77.51 gain 72 116 -76.06 gain 116 72 -77.01 gain 72 117 -78.40 gain 117 72 -76.50 gain 72 118 -76.69 gain 118 72 -76.41 gain 72 119 -79.42 gain 119 72 -84.20 gain 72 120 -98.42 gain 120 72 -100.58 gain 72 121 -98.93 gain 121 72 -102.11 gain 72 122 -96.76 gain 122 72 -99.70 gain 72 123 -97.76 gain 123 72 -101.03 gain 72 124 -93.30 gain 124 72 -94.57 gain 72 125 -91.14 gain 125 72 -95.74 gain 72 126 -91.48 gain 126 72 -92.73 gain 72 127 -94.90 gain 127 72 -95.78 gain 72 128 -73.86 gain 128 72 -77.33 gain 72 129 -83.15 gain 129 72 -83.83 gain 72 130 -85.59 gain 130 72 -87.56 gain 72 131 -83.38 gain 131 72 -85.12 gain 72 132 -84.03 gain 132 72 -81.78 gain 72 133 -79.74 gain 133 72 -82.66 gain 72 134 -88.74 gain 134 72 -88.53 gain 72 135 -95.04 gain 135 72 -97.14 gain 72 136 -91.50 gain 136 72 -94.04 gain 72 137 -90.69 gain 137 72 -96.14 gain 72 138 -95.71 gain 138 72 -94.69 gain 72 139 -89.81 gain 139 72 -92.05 gain 72 140 -100.89 gain 140 72 -103.96 gain 72 141 -88.10 gain 141 72 -83.14 gain 72 142 -90.91 gain 142 72 -92.70 gain 72 143 -87.68 gain 143 72 -92.20 gain 72 144 -84.51 gain 144 72 -87.40 gain 72 145 -84.09 gain 145 72 -90.37 gain 72 146 -84.28 gain 146 72 -86.55 gain 72 147 -90.06 gain 147 72 -89.44 gain 72 148 -83.64 gain 148 72 -81.35 gain 72 149 -84.12 gain 149 72 -85.48 gain 72 150 -96.52 gain 150 72 -98.72 gain 72 151 -99.66 gain 151 72 -100.80 gain 72 152 -93.66 gain 152 72 -94.61 gain 72 153 -85.03 gain 153 72 -85.20 gain 72 154 -87.76 gain 154 72 -89.83 gain 72 155 -85.32 gain 155 72 -85.96 gain 72 156 -89.61 gain 156 72 -89.49 gain 72 157 -88.46 gain 157 72 -90.82 gain 72 158 -93.18 gain 158 72 -95.03 gain 72 159 -86.21 gain 159 72 -90.45 gain 72 160 -89.22 gain 160 72 -90.61 gain 72 161 -84.81 gain 161 72 -88.64 gain 72 162 -93.76 gain 162 72 -97.30 gain 72 163 -84.70 gain 163 72 -90.15 gain 72 164 -83.25 gain 164 72 -88.07 gain 72 165 -96.37 gain 165 72 -98.26 gain 72 166 -99.52 gain 166 72 -101.16 gain 72 167 -93.80 gain 167 72 -96.16 gain 72 168 -93.99 gain 168 72 -95.25 gain 72 169 -94.83 gain 169 72 -97.20 gain 72 170 -86.94 gain 170 72 -88.55 gain 72 171 -93.19 gain 171 72 -95.87 gain 72 172 -78.41 gain 172 72 -79.29 gain 72 173 -93.76 gain 173 72 -99.28 gain 72 174 -93.49 gain 174 72 -95.06 gain 72 175 -95.20 gain 175 72 -97.90 gain 72 176 -87.71 gain 176 72 -89.38 gain 72 177 -88.05 gain 177 72 -92.72 gain 72 178 -98.36 gain 178 72 -96.47 gain 72 179 -89.67 gain 179 72 -87.20 gain 72 180 -100.36 gain 180 72 -107.35 gain 72 181 -98.69 gain 181 72 -99.70 gain 72 182 -92.60 gain 182 72 -94.70 gain 72 183 -103.27 gain 183 72 -105.64 gain 72 184 -93.18 gain 184 72 -98.30 gain 72 185 -96.09 gain 185 72 -105.07 gain 72 186 -95.85 gain 186 72 -100.41 gain 72 187 -91.37 gain 187 72 -93.66 gain 72 188 -92.75 gain 188 72 -97.45 gain 72 189 -97.58 gain 189 72 -97.00 gain 72 190 -87.95 gain 190 72 -91.30 gain 72 191 -90.12 gain 191 72 -92.17 gain 72 192 -94.16 gain 192 72 -94.91 gain 72 193 -89.65 gain 193 72 -89.38 gain 72 194 -85.91 gain 194 72 -86.42 gain 72 195 -96.20 gain 195 72 -95.26 gain 72 196 -95.65 gain 196 72 -99.03 gain 72 197 -98.95 gain 197 72 -97.46 gain 72 198 -98.36 gain 198 72 -101.38 gain 72 199 -92.15 gain 199 72 -95.28 gain 72 200 -90.12 gain 200 72 -94.59 gain 72 201 -101.57 gain 201 72 -105.94 gain 72 202 -89.45 gain 202 72 -92.95 gain 72 203 -92.52 gain 203 72 -95.14 gain 72 204 -94.69 gain 204 72 -93.96 gain 72 205 -89.75 gain 205 72 -92.75 gain 72 206 -94.69 gain 206 72 -98.80 gain 72 207 -95.25 gain 207 72 -98.78 gain 72 208 -93.00 gain 208 72 -99.14 gain 72 209 -89.28 gain 209 72 -94.99 gain 72 210 -105.03 gain 210 72 -110.91 gain 72 211 -100.92 gain 211 72 -102.03 gain 72 212 -99.84 gain 212 72 -103.96 gain 72 213 -99.67 gain 213 72 -103.12 gain 72 214 -90.84 gain 214 72 -99.68 gain 72 215 -94.37 gain 215 72 -98.61 gain 72 216 -98.39 gain 216 72 -106.54 gain 72 217 -91.51 gain 217 72 -99.92 gain 72 218 -98.17 gain 218 72 -99.39 gain 72 219 -91.52 gain 219 72 -93.22 gain 72 220 -95.82 gain 220 72 -93.61 gain 72 221 -93.56 gain 221 72 -97.02 gain 72 222 -89.70 gain 222 72 -88.97 gain 72 223 -86.04 gain 223 72 -88.55 gain 72 224 -92.87 gain 224 72 -95.85 gain 73 74 -62.77 gain 74 73 -58.89 gain 73 75 -95.98 gain 75 73 -97.99 gain 73 76 -90.54 gain 76 73 -92.67 gain 73 77 -87.62 gain 77 73 -85.74 gain 73 78 -97.76 gain 78 73 -100.39 gain 73 79 -92.06 gain 79 73 -94.31 gain 73 80 -88.03 gain 80 73 -88.06 gain 73 81 -84.94 gain 81 73 -85.89 gain 73 82 -90.89 gain 82 73 -92.81 gain 73 83 -83.21 gain 83 73 -82.41 gain 73 84 -79.24 gain 84 73 -75.62 gain 73 85 -73.31 gain 85 73 -75.12 gain 73 86 -74.42 gain 86 73 -77.87 gain 73 87 -71.64 gain 87 73 -72.37 gain 73 88 -63.24 gain 88 73 -63.62 gain 73 89 -64.65 gain 89 73 -67.17 gain 73 90 -98.90 gain 90 73 -100.76 gain 73 91 -98.69 gain 91 73 -101.62 gain 73 92 -88.20 gain 92 73 -92.05 gain 73 93 -97.77 gain 93 73 -98.97 gain 73 94 -93.12 gain 94 73 -92.90 gain 73 95 -94.29 gain 95 73 -93.31 gain 73 96 -99.48 gain 96 73 -105.47 gain 73 97 -87.51 gain 97 73 -86.33 gain 73 98 -88.31 gain 98 73 -87.59 gain 73 99 -82.12 gain 99 73 -80.53 gain 73 100 -80.62 gain 100 73 -78.95 gain 73 101 -83.16 gain 101 73 -85.12 gain 73 102 -81.39 gain 102 73 -83.31 gain 73 103 -77.95 gain 103 73 -81.05 gain 73 104 -82.80 gain 104 73 -88.38 gain 73 105 -104.26 gain 105 73 -104.36 gain 73 106 -100.41 gain 106 73 -97.85 gain 73 107 -94.08 gain 107 73 -91.42 gain 73 108 -98.90 gain 108 73 -95.86 gain 73 109 -93.95 gain 109 73 -94.35 gain 73 110 -87.47 gain 110 73 -94.24 gain 73 111 -92.23 gain 111 73 -88.96 gain 73 112 -85.93 gain 112 73 -86.13 gain 73 113 -84.91 gain 113 73 -84.23 gain 73 114 -80.56 gain 114 73 -77.06 gain 73 115 -85.93 gain 115 73 -83.08 gain 73 116 -86.93 gain 116 73 -86.52 gain 73 117 -78.47 gain 117 73 -75.19 gain 73 118 -75.64 gain 118 73 -73.99 gain 73 119 -76.74 gain 119 73 -80.15 gain 73 120 -95.22 gain 120 73 -96.01 gain 73 121 -102.90 gain 121 73 -104.71 gain 73 122 -96.87 gain 122 73 -98.43 gain 73 123 -95.97 gain 123 73 -97.88 gain 73 124 -102.35 gain 124 73 -102.24 gain 73 125 -93.29 gain 125 73 -96.52 gain 73 126 -92.56 gain 126 73 -92.44 gain 73 127 -90.58 gain 127 73 -90.08 gain 73 128 -93.12 gain 128 73 -95.22 gain 73 129 -88.67 gain 129 73 -87.98 gain 73 130 -79.76 gain 130 73 -80.36 gain 73 131 -80.29 gain 131 73 -80.66 gain 73 132 -83.89 gain 132 73 -80.27 gain 73 133 -85.64 gain 133 73 -87.19 gain 73 134 -84.09 gain 134 73 -82.51 gain 73 135 -99.36 gain 135 73 -100.08 gain 73 136 -95.08 gain 136 73 -96.25 gain 73 137 -92.77 gain 137 73 -96.85 gain 73 138 -92.31 gain 138 73 -89.92 gain 73 139 -99.03 gain 139 73 -99.91 gain 73 140 -102.78 gain 140 73 -104.49 gain 73 141 -86.24 gain 141 73 -79.91 gain 73 142 -94.11 gain 142 73 -94.53 gain 73 143 -86.59 gain 143 73 -89.74 gain 73 144 -86.31 gain 144 73 -87.83 gain 73 145 -81.63 gain 145 73 -86.54 gain 73 146 -83.47 gain 146 73 -84.37 gain 73 147 -88.02 gain 147 73 -86.03 gain 73 148 -80.97 gain 148 73 -77.31 gain 73 149 -80.61 gain 149 73 -80.60 gain 73 150 -95.67 gain 150 73 -96.49 gain 73 151 -100.12 gain 151 73 -99.89 gain 73 152 -97.66 gain 152 73 -97.25 gain 73 153 -106.72 gain 153 73 -105.52 gain 73 154 -96.09 gain 154 73 -96.79 gain 73 155 -91.63 gain 155 73 -90.90 gain 73 156 -96.17 gain 156 73 -94.68 gain 73 157 -97.50 gain 157 73 -98.48 gain 73 158 -91.14 gain 158 73 -91.63 gain 73 159 -94.22 gain 159 73 -97.09 gain 73 160 -90.72 gain 160 73 -90.74 gain 73 161 -86.28 gain 161 73 -88.75 gain 73 162 -88.81 gain 162 73 -90.99 gain 73 163 -91.55 gain 163 73 -95.64 gain 73 164 -84.73 gain 164 73 -88.18 gain 73 165 -96.37 gain 165 73 -96.89 gain 73 166 -98.34 gain 166 73 -98.60 gain 73 167 -99.71 gain 167 73 -100.70 gain 73 168 -99.86 gain 168 73 -99.75 gain 73 169 -93.61 gain 169 73 -94.61 gain 73 170 -93.92 gain 170 73 -94.15 gain 73 171 -94.80 gain 171 73 -96.11 gain 73 172 -90.80 gain 172 73 -90.30 gain 73 173 -85.19 gain 173 73 -89.33 gain 73 174 -93.44 gain 174 73 -93.64 gain 73 175 -89.59 gain 175 73 -90.92 gain 73 176 -90.78 gain 176 73 -91.08 gain 73 177 -89.53 gain 177 73 -92.83 gain 73 178 -87.11 gain 178 73 -83.85 gain 73 179 -86.89 gain 179 73 -83.06 gain 73 180 -101.64 gain 180 73 -107.26 gain 73 181 -101.69 gain 181 73 -101.33 gain 73 182 -103.36 gain 182 73 -104.09 gain 73 183 -93.03 gain 183 73 -94.02 gain 73 184 -95.23 gain 184 73 -98.98 gain 73 185 -100.70 gain 185 73 -108.31 gain 73 186 -94.93 gain 186 73 -98.12 gain 73 187 -87.15 gain 187 73 -88.07 gain 73 188 -98.52 gain 188 73 -101.85 gain 73 189 -102.01 gain 189 73 -100.07 gain 73 190 -88.93 gain 190 73 -90.90 gain 73 191 -84.95 gain 191 73 -85.63 gain 73 192 -84.96 gain 192 73 -84.33 gain 73 193 -89.63 gain 193 73 -87.99 gain 73 194 -84.70 gain 194 73 -83.84 gain 73 195 -95.94 gain 195 73 -93.63 gain 73 196 -94.94 gain 196 73 -96.94 gain 73 197 -99.22 gain 197 73 -96.35 gain 73 198 -95.77 gain 198 73 -97.42 gain 73 199 -96.63 gain 199 73 -98.38 gain 73 200 -97.31 gain 200 73 -100.41 gain 73 201 -100.59 gain 201 73 -103.59 gain 73 202 -95.00 gain 202 73 -97.14 gain 73 203 -99.18 gain 203 73 -100.43 gain 73 204 -98.10 gain 204 73 -95.99 gain 73 205 -94.67 gain 205 73 -96.30 gain 73 206 -87.33 gain 206 73 -90.07 gain 73 207 -94.93 gain 207 73 -97.09 gain 73 208 -91.32 gain 208 73 -96.08 gain 73 209 -94.28 gain 209 73 -98.61 gain 73 210 -102.14 gain 210 73 -106.65 gain 73 211 -100.47 gain 211 73 -100.21 gain 73 212 -102.56 gain 212 73 -105.31 gain 73 213 -100.32 gain 213 73 -102.40 gain 73 214 -91.63 gain 214 73 -99.10 gain 73 215 -91.54 gain 215 73 -94.41 gain 73 216 -93.02 gain 216 73 -99.80 gain 73 217 -99.33 gain 217 73 -106.37 gain 73 218 -94.25 gain 218 73 -94.10 gain 73 219 -93.59 gain 219 73 -93.92 gain 73 220 -88.70 gain 220 73 -85.12 gain 73 221 -101.01 gain 221 73 -103.11 gain 73 222 -92.90 gain 222 73 -90.80 gain 73 223 -85.49 gain 223 73 -86.63 gain 73 224 -101.78 gain 224 73 -103.39 gain 74 75 -88.19 gain 75 74 -94.08 gain 74 76 -88.16 gain 76 74 -94.17 gain 74 77 -96.14 gain 77 74 -98.15 gain 74 78 -91.28 gain 78 74 -97.79 gain 74 79 -96.37 gain 79 74 -102.51 gain 74 80 -95.03 gain 80 74 -98.96 gain 74 81 -86.14 gain 81 74 -90.97 gain 74 82 -83.79 gain 82 74 -89.60 gain 74 83 -80.82 gain 83 74 -83.90 gain 74 84 -81.23 gain 84 74 -81.50 gain 74 85 -70.86 gain 85 74 -76.56 gain 74 86 -74.24 gain 86 74 -81.57 gain 74 87 -63.83 gain 87 74 -68.46 gain 74 88 -63.22 gain 88 74 -67.49 gain 74 89 -64.10 gain 89 74 -70.51 gain 74 90 -97.25 gain 90 74 -103.00 gain 74 91 -100.62 gain 91 74 -107.44 gain 74 92 -89.02 gain 92 74 -96.75 gain 74 93 -90.91 gain 93 74 -96.01 gain 74 94 -82.63 gain 94 74 -86.29 gain 74 95 -92.45 gain 95 74 -95.35 gain 74 96 -82.09 gain 96 74 -91.96 gain 74 97 -86.58 gain 97 74 -89.27 gain 74 98 -85.28 gain 98 74 -88.44 gain 74 99 -85.48 gain 99 74 -87.78 gain 74 100 -82.48 gain 100 74 -84.69 gain 74 101 -85.75 gain 101 74 -91.60 gain 74 102 -75.17 gain 102 74 -80.98 gain 74 103 -75.12 gain 103 74 -82.10 gain 74 104 -68.54 gain 104 74 -78.01 gain 74 105 -98.47 gain 105 74 -102.45 gain 74 106 -88.94 gain 106 74 -90.25 gain 74 107 -95.93 gain 107 74 -97.15 gain 74 108 -90.43 gain 108 74 -91.27 gain 74 109 -87.92 gain 109 74 -92.21 gain 74 110 -94.26 gain 110 74 -104.91 gain 74 111 -90.04 gain 111 74 -90.66 gain 74 112 -80.37 gain 112 74 -84.46 gain 74 113 -87.08 gain 113 74 -90.30 gain 74 114 -77.40 gain 114 74 -77.78 gain 74 115 -87.82 gain 115 74 -88.86 gain 74 116 -74.38 gain 116 74 -77.84 gain 74 117 -72.82 gain 117 74 -73.43 gain 74 118 -83.41 gain 118 74 -85.64 gain 74 119 -71.79 gain 119 74 -79.09 gain 74 120 -91.62 gain 120 74 -96.29 gain 74 121 -90.93 gain 121 74 -96.63 gain 74 122 -92.57 gain 122 74 -98.02 gain 74 123 -90.60 gain 123 74 -96.38 gain 74 124 -85.45 gain 124 74 -89.23 gain 74 125 -86.01 gain 125 74 -93.13 gain 74 126 -94.74 gain 126 74 -98.50 gain 74 127 -86.67 gain 127 74 -90.06 gain 74 128 -88.27 gain 128 74 -94.25 gain 74 129 -83.75 gain 129 74 -86.94 gain 74 130 -83.64 gain 130 74 -88.13 gain 74 131 -83.54 gain 131 74 -87.80 gain 74 132 -73.88 gain 132 74 -74.14 gain 74 133 -82.13 gain 133 74 -87.58 gain 74 134 -81.70 gain 134 74 -84.01 gain 74 135 -94.23 gain 135 74 -98.84 gain 74 136 -90.70 gain 136 74 -95.75 gain 74 137 -88.15 gain 137 74 -96.12 gain 74 138 -88.53 gain 138 74 -90.03 gain 74 139 -90.88 gain 139 74 -95.64 gain 74 140 -84.66 gain 140 74 -90.25 gain 74 141 -89.60 gain 141 74 -87.16 gain 74 142 -85.40 gain 142 74 -89.70 gain 74 143 -86.11 gain 143 74 -93.15 gain 74 144 -86.50 gain 144 74 -91.91 gain 74 145 -85.40 gain 145 74 -94.19 gain 74 146 -84.53 gain 146 74 -89.31 gain 74 147 -88.75 gain 147 74 -90.64 gain 74 148 -78.97 gain 148 74 -79.19 gain 74 149 -84.09 gain 149 74 -87.97 gain 74 150 -90.89 gain 150 74 -95.60 gain 74 151 -95.40 gain 151 74 -99.06 gain 74 152 -94.40 gain 152 74 -97.87 gain 74 153 -94.40 gain 153 74 -97.09 gain 74 154 -94.55 gain 154 74 -99.13 gain 74 155 -97.90 gain 155 74 -101.06 gain 74 156 -86.30 gain 156 74 -88.69 gain 74 157 -94.67 gain 157 74 -99.54 gain 74 158 -85.35 gain 158 74 -89.72 gain 74 159 -81.96 gain 159 74 -88.72 gain 74 160 -90.09 gain 160 74 -94.00 gain 74 161 -90.03 gain 161 74 -96.38 gain 74 162 -86.77 gain 162 74 -92.82 gain 74 163 -87.41 gain 163 74 -95.38 gain 74 164 -83.11 gain 164 74 -90.45 gain 74 165 -99.02 gain 165 74 -103.42 gain 74 166 -103.20 gain 166 74 -107.36 gain 74 167 -99.81 gain 167 74 -104.68 gain 74 168 -96.69 gain 168 74 -100.46 gain 74 169 -87.89 gain 169 74 -92.78 gain 74 170 -88.66 gain 170 74 -92.78 gain 74 171 -85.62 gain 171 74 -90.82 gain 74 172 -86.51 gain 172 74 -89.90 gain 74 173 -86.95 gain 173 74 -94.99 gain 74 174 -90.87 gain 174 74 -94.95 gain 74 175 -82.22 gain 175 74 -87.44 gain 74 176 -85.34 gain 176 74 -89.52 gain 74 177 -90.44 gain 177 74 -97.62 gain 74 178 -87.24 gain 178 74 -87.87 gain 74 179 -90.74 gain 179 74 -90.79 gain 74 180 -99.20 gain 180 74 -108.70 gain 74 181 -96.66 gain 181 74 -100.18 gain 74 182 -97.98 gain 182 74 -102.58 gain 74 183 -97.07 gain 183 74 -101.95 gain 74 184 -96.03 gain 184 74 -103.66 gain 74 185 -95.16 gain 185 74 -106.66 gain 74 186 -91.44 gain 186 74 -98.52 gain 74 187 -101.67 gain 187 74 -106.48 gain 74 188 -88.33 gain 188 74 -95.55 gain 74 189 -91.95 gain 189 74 -93.89 gain 74 190 -93.24 gain 190 74 -99.10 gain 74 191 -97.44 gain 191 74 -102.01 gain 74 192 -91.58 gain 192 74 -94.84 gain 74 193 -80.10 gain 193 74 -82.35 gain 74 194 -89.38 gain 194 74 -92.41 gain 74 195 -98.50 gain 195 74 -100.07 gain 74 196 -99.26 gain 196 74 -105.15 gain 74 197 -103.39 gain 197 74 -104.41 gain 74 198 -99.32 gain 198 74 -104.86 gain 74 199 -86.54 gain 199 74 -92.19 gain 74 200 -93.27 gain 200 74 -100.24 gain 74 201 -88.12 gain 201 74 -95.00 gain 74 202 -94.06 gain 202 74 -100.09 gain 74 203 -99.19 gain 203 74 -104.33 gain 74 204 -89.17 gain 204 74 -90.95 gain 74 205 -87.35 gain 205 74 -92.87 gain 74 206 -89.07 gain 206 74 -95.70 gain 74 207 -87.57 gain 207 74 -93.62 gain 74 208 -92.18 gain 208 74 -100.82 gain 74 209 -91.64 gain 209 74 -99.86 gain 74 210 -100.46 gain 210 74 -108.85 gain 74 211 -97.79 gain 211 74 -101.41 gain 74 212 -91.13 gain 212 74 -97.77 gain 74 213 -89.43 gain 213 74 -95.39 gain 74 214 -93.88 gain 214 74 -105.23 gain 74 215 -86.71 gain 215 74 -93.46 gain 74 216 -94.94 gain 216 74 -105.60 gain 74 217 -97.08 gain 217 74 -108.01 gain 74 218 -86.16 gain 218 74 -89.90 gain 74 219 -84.57 gain 219 74 -88.78 gain 74 220 -96.78 gain 220 74 -97.08 gain 74 221 -93.64 gain 221 74 -99.62 gain 74 222 -90.37 gain 222 74 -92.15 gain 74 223 -84.16 gain 223 74 -89.18 gain 74 224 -93.81 gain 224 74 -99.31 gain 75 76 -71.76 gain 76 75 -71.88 gain 75 77 -77.62 gain 77 75 -73.74 gain 75 78 -85.80 gain 78 75 -86.42 gain 75 79 -81.87 gain 79 75 -82.12 gain 75 80 -85.59 gain 80 75 -83.63 gain 75 81 -90.14 gain 81 75 -89.09 gain 75 82 -98.01 gain 82 75 -97.93 gain 75 83 -90.86 gain 83 75 -88.05 gain 75 84 -89.04 gain 84 75 -83.42 gain 75 85 -100.88 gain 85 75 -100.69 gain 75 86 -95.31 gain 86 75 -96.76 gain 75 87 -95.61 gain 87 75 -94.35 gain 75 88 -96.81 gain 88 75 -95.18 gain 75 89 -103.80 gain 89 75 -104.32 gain 75 90 -64.98 gain 90 75 -64.84 gain 75 91 -68.01 gain 91 75 -68.94 gain 75 92 -89.47 gain 92 75 -91.32 gain 75 93 -83.58 gain 93 75 -82.78 gain 75 94 -92.93 gain 94 75 -90.70 gain 75 95 -83.72 gain 95 75 -80.73 gain 75 96 -87.44 gain 96 75 -91.42 gain 75 97 -92.73 gain 97 75 -89.54 gain 75 98 -91.69 gain 98 75 -88.97 gain 75 99 -84.00 gain 99 75 -80.41 gain 75 100 -97.28 gain 100 75 -93.61 gain 75 101 -99.06 gain 101 75 -99.02 gain 75 102 -97.22 gain 102 75 -97.15 gain 75 103 -98.99 gain 103 75 -100.08 gain 75 104 -98.15 gain 104 75 -101.72 gain 75 105 -74.88 gain 105 75 -72.98 gain 75 106 -79.20 gain 106 75 -74.63 gain 75 107 -75.48 gain 107 75 -70.81 gain 75 108 -78.62 gain 108 75 -73.57 gain 75 109 -93.16 gain 109 75 -91.56 gain 75 110 -91.36 gain 110 75 -96.12 gain 75 111 -94.06 gain 111 75 -88.80 gain 75 112 -93.40 gain 112 75 -91.60 gain 75 113 -94.40 gain 113 75 -91.72 gain 75 114 -97.87 gain 114 75 -92.36 gain 75 115 -92.62 gain 115 75 -87.76 gain 75 116 -99.88 gain 116 75 -97.46 gain 75 117 -92.20 gain 117 75 -86.93 gain 75 118 -102.79 gain 118 75 -99.14 gain 75 119 -107.23 gain 119 75 -108.63 gain 75 120 -82.12 gain 120 75 -80.91 gain 75 121 -76.57 gain 121 75 -76.38 gain 75 122 -82.67 gain 122 75 -82.23 gain 75 123 -84.11 gain 123 75 -84.01 gain 75 124 -87.37 gain 124 75 -85.26 gain 75 125 -92.82 gain 125 75 -94.05 gain 75 126 -91.21 gain 126 75 -89.08 gain 75 127 -91.46 gain 127 75 -88.96 gain 75 128 -96.41 gain 128 75 -96.51 gain 75 129 -98.78 gain 129 75 -96.08 gain 75 130 -95.70 gain 130 75 -94.30 gain 75 131 -95.12 gain 131 75 -93.49 gain 75 132 -97.07 gain 132 75 -91.45 gain 75 133 -97.12 gain 133 75 -96.68 gain 75 134 -103.87 gain 134 75 -100.29 gain 75 135 -82.99 gain 135 75 -81.71 gain 75 136 -91.39 gain 136 75 -90.55 gain 75 137 -90.01 gain 137 75 -92.08 gain 75 138 -88.25 gain 138 75 -83.85 gain 75 139 -82.91 gain 139 75 -81.78 gain 75 140 -89.65 gain 140 75 -89.35 gain 75 141 -94.60 gain 141 75 -86.27 gain 75 142 -94.64 gain 142 75 -93.05 gain 75 143 -90.28 gain 143 75 -91.44 gain 75 144 -99.50 gain 144 75 -99.01 gain 75 145 -103.76 gain 145 75 -106.66 gain 75 146 -96.41 gain 146 75 -95.30 gain 75 147 -99.00 gain 147 75 -95.00 gain 75 148 -102.49 gain 148 75 -96.82 gain 75 149 -103.99 gain 149 75 -101.98 gain 75 150 -89.55 gain 150 75 -88.37 gain 75 151 -82.61 gain 151 75 -80.38 gain 75 152 -88.51 gain 152 75 -86.09 gain 75 153 -82.20 gain 153 75 -78.99 gain 75 154 -82.12 gain 154 75 -80.82 gain 75 155 -94.87 gain 155 75 -92.14 gain 75 156 -91.78 gain 156 75 -88.28 gain 75 157 -96.07 gain 157 75 -95.05 gain 75 158 -97.44 gain 158 75 -95.92 gain 75 159 -96.89 gain 159 75 -97.76 gain 75 160 -97.66 gain 160 75 -95.68 gain 75 161 -93.46 gain 161 75 -93.92 gain 75 162 -96.39 gain 162 75 -96.56 gain 75 163 -97.67 gain 163 75 -99.75 gain 75 164 -100.81 gain 164 75 -102.26 gain 75 165 -91.68 gain 165 75 -90.19 gain 75 166 -91.90 gain 166 75 -90.16 gain 75 167 -91.42 gain 167 75 -90.41 gain 75 168 -93.06 gain 168 75 -90.94 gain 75 169 -87.64 gain 169 75 -86.64 gain 75 170 -89.81 gain 170 75 -88.04 gain 75 171 -91.63 gain 171 75 -90.94 gain 75 172 -97.43 gain 172 75 -94.93 gain 75 173 -93.51 gain 173 75 -95.66 gain 75 174 -102.20 gain 174 75 -100.39 gain 75 175 -97.72 gain 175 75 -97.05 gain 75 176 -98.88 gain 176 75 -97.18 gain 75 177 -98.18 gain 177 75 -99.48 gain 75 178 -95.07 gain 178 75 -89.81 gain 75 179 -96.94 gain 179 75 -91.11 gain 75 180 -93.95 gain 180 75 -97.56 gain 75 181 -89.34 gain 181 75 -86.97 gain 75 182 -87.89 gain 182 75 -86.61 gain 75 183 -92.99 gain 183 75 -91.98 gain 75 184 -90.91 gain 184 75 -92.65 gain 75 185 -94.30 gain 185 75 -99.90 gain 75 186 -102.66 gain 186 75 -103.84 gain 75 187 -97.70 gain 187 75 -96.61 gain 75 188 -86.03 gain 188 75 -87.35 gain 75 189 -106.20 gain 189 75 -102.26 gain 75 190 -101.13 gain 190 75 -101.10 gain 75 191 -104.70 gain 191 75 -103.37 gain 75 192 -102.06 gain 192 75 -99.43 gain 75 193 -103.39 gain 193 75 -99.75 gain 75 194 -100.66 gain 194 75 -97.80 gain 75 195 -91.47 gain 195 75 -87.16 gain 75 196 -104.65 gain 196 75 -104.65 gain 75 197 -93.10 gain 197 75 -88.23 gain 75 198 -95.50 gain 198 75 -95.15 gain 75 199 -94.51 gain 199 75 -94.27 gain 75 200 -94.26 gain 200 75 -95.35 gain 75 201 -96.23 gain 201 75 -97.23 gain 75 202 -95.13 gain 202 75 -95.26 gain 75 203 -94.48 gain 203 75 -93.73 gain 75 204 -95.43 gain 204 75 -91.32 gain 75 205 -100.22 gain 205 75 -99.85 gain 75 206 -91.38 gain 206 75 -92.12 gain 75 207 -100.07 gain 207 75 -100.23 gain 75 208 -101.79 gain 208 75 -104.55 gain 75 209 -104.95 gain 209 75 -107.28 gain 75 210 -87.94 gain 210 75 -90.44 gain 75 211 -97.41 gain 211 75 -95.15 gain 75 212 -94.35 gain 212 75 -95.10 gain 75 213 -100.87 gain 213 75 -100.95 gain 75 214 -104.33 gain 214 75 -109.79 gain 75 215 -95.80 gain 215 75 -96.67 gain 75 216 -97.40 gain 216 75 -102.17 gain 75 217 -95.55 gain 217 75 -100.59 gain 75 218 -99.36 gain 218 75 -97.21 gain 75 219 -107.29 gain 219 75 -105.62 gain 75 220 -98.77 gain 220 75 -93.18 gain 75 221 -95.49 gain 221 75 -95.58 gain 75 222 -100.89 gain 222 75 -96.79 gain 75 223 -100.43 gain 223 75 -99.56 gain 75 224 -103.68 gain 224 75 -103.29 gain 76 77 -61.51 gain 77 76 -57.50 gain 76 78 -75.25 gain 78 76 -75.74 gain 76 79 -76.84 gain 79 76 -76.96 gain 76 80 -92.98 gain 80 76 -90.89 gain 76 81 -85.57 gain 81 76 -84.39 gain 76 82 -91.49 gain 82 76 -91.29 gain 76 83 -92.99 gain 83 76 -90.06 gain 76 84 -98.63 gain 84 76 -92.88 gain 76 85 -98.69 gain 85 76 -98.37 gain 76 86 -99.43 gain 86 76 -100.75 gain 76 87 -90.55 gain 87 76 -89.16 gain 76 88 -91.45 gain 88 76 -89.70 gain 76 89 -98.86 gain 89 76 -99.25 gain 76 90 -66.21 gain 90 76 -65.94 gain 76 91 -62.37 gain 91 76 -63.18 gain 76 92 -68.80 gain 92 76 -70.52 gain 76 93 -75.02 gain 93 76 -74.10 gain 76 94 -74.66 gain 94 76 -72.31 gain 76 95 -91.30 gain 95 76 -88.19 gain 76 96 -89.76 gain 96 76 -93.62 gain 76 97 -95.09 gain 97 76 -91.78 gain 76 98 -87.75 gain 98 76 -84.90 gain 76 99 -94.62 gain 99 76 -90.91 gain 76 100 -96.05 gain 100 76 -92.25 gain 76 101 -100.37 gain 101 76 -100.20 gain 76 102 -92.05 gain 102 76 -91.85 gain 76 103 -102.30 gain 103 76 -103.27 gain 76 104 -98.51 gain 104 76 -101.96 gain 76 105 -84.49 gain 105 76 -82.46 gain 76 106 -76.89 gain 106 76 -72.19 gain 76 107 -75.58 gain 107 76 -70.79 gain 76 108 -79.63 gain 108 76 -74.46 gain 76 109 -78.62 gain 109 76 -76.90 gain 76 110 -86.43 gain 110 76 -91.08 gain 76 111 -88.33 gain 111 76 -82.94 gain 76 112 -90.70 gain 112 76 -88.78 gain 76 113 -94.20 gain 113 76 -91.40 gain 76 114 -96.93 gain 114 76 -91.30 gain 76 115 -93.71 gain 115 76 -88.73 gain 76 116 -97.43 gain 116 76 -94.88 gain 76 117 -98.48 gain 117 76 -93.08 gain 76 118 -106.51 gain 118 76 -102.73 gain 76 119 -98.08 gain 119 76 -99.36 gain 76 120 -80.40 gain 120 76 -79.06 gain 76 121 -79.71 gain 121 76 -79.39 gain 76 122 -80.77 gain 122 76 -80.21 gain 76 123 -81.10 gain 123 76 -80.88 gain 76 124 -84.29 gain 124 76 -82.05 gain 76 125 -84.43 gain 125 76 -85.54 gain 76 126 -92.06 gain 126 76 -89.81 gain 76 127 -92.14 gain 127 76 -89.51 gain 76 128 -96.57 gain 128 76 -96.55 gain 76 129 -89.31 gain 129 76 -86.49 gain 76 130 -101.68 gain 130 76 -100.15 gain 76 131 -95.15 gain 131 76 -93.40 gain 76 132 -102.18 gain 132 76 -96.44 gain 76 133 -94.33 gain 133 76 -93.76 gain 76 134 -102.21 gain 134 76 -98.50 gain 76 135 -88.83 gain 135 76 -87.42 gain 76 136 -84.72 gain 136 76 -83.76 gain 76 137 -79.81 gain 137 76 -81.76 gain 76 138 -86.07 gain 138 76 -81.55 gain 76 139 -86.63 gain 139 76 -85.38 gain 76 140 -92.00 gain 140 76 -91.58 gain 76 141 -84.97 gain 141 76 -76.51 gain 76 142 -96.85 gain 142 76 -95.14 gain 76 143 -93.12 gain 143 76 -94.14 gain 76 144 -95.65 gain 144 76 -95.04 gain 76 145 -92.57 gain 145 76 -95.35 gain 76 146 -98.55 gain 146 76 -97.32 gain 76 147 -98.87 gain 147 76 -94.75 gain 76 148 -103.16 gain 148 76 -97.37 gain 76 149 -94.15 gain 149 76 -92.02 gain 76 150 -83.95 gain 150 76 -82.65 gain 76 151 -88.22 gain 151 76 -85.86 gain 76 152 -92.79 gain 152 76 -90.25 gain 76 153 -86.27 gain 153 76 -82.94 gain 76 154 -90.37 gain 154 76 -88.94 gain 76 155 -89.22 gain 155 76 -86.36 gain 76 156 -88.47 gain 156 76 -84.85 gain 76 157 -92.11 gain 157 76 -90.97 gain 76 158 -95.56 gain 158 76 -93.92 gain 76 159 -93.20 gain 159 76 -93.94 gain 76 160 -100.42 gain 160 76 -98.31 gain 76 161 -95.99 gain 161 76 -96.33 gain 76 162 -95.61 gain 162 76 -95.65 gain 76 163 -111.54 gain 163 76 -113.50 gain 76 164 -102.72 gain 164 76 -104.05 gain 76 165 -87.24 gain 165 76 -85.63 gain 76 166 -82.69 gain 166 76 -80.83 gain 76 167 -89.01 gain 167 76 -87.87 gain 76 168 -96.94 gain 168 76 -94.70 gain 76 169 -85.32 gain 169 76 -84.19 gain 76 170 -90.16 gain 170 76 -88.26 gain 76 171 -95.72 gain 171 76 -94.91 gain 76 172 -94.94 gain 172 76 -92.32 gain 76 173 -88.12 gain 173 76 -90.14 gain 76 174 -89.71 gain 174 76 -87.78 gain 76 175 -96.52 gain 175 76 -95.73 gain 76 176 -94.14 gain 176 76 -92.31 gain 76 177 -106.30 gain 177 76 -107.48 gain 76 178 -104.50 gain 178 76 -99.12 gain 76 179 -97.72 gain 179 76 -91.76 gain 76 180 -95.88 gain 180 76 -99.36 gain 76 181 -92.73 gain 181 76 -90.24 gain 76 182 -90.60 gain 182 76 -89.19 gain 76 183 -91.17 gain 183 76 -90.04 gain 76 184 -88.26 gain 184 76 -89.88 gain 76 185 -96.49 gain 185 76 -101.98 gain 76 186 -96.30 gain 186 76 -97.36 gain 76 187 -99.37 gain 187 76 -98.16 gain 76 188 -94.86 gain 188 76 -96.06 gain 76 189 -96.53 gain 189 76 -92.46 gain 76 190 -100.08 gain 190 76 -99.93 gain 76 191 -103.61 gain 191 76 -102.16 gain 76 192 -100.46 gain 192 76 -97.70 gain 76 193 -105.62 gain 193 76 -101.85 gain 76 194 -100.01 gain 194 76 -97.03 gain 76 195 -91.91 gain 195 76 -87.47 gain 76 196 -87.97 gain 196 76 -87.84 gain 76 197 -86.47 gain 197 76 -81.47 gain 76 198 -95.07 gain 198 76 -94.59 gain 76 199 -102.71 gain 199 76 -102.33 gain 76 200 -98.65 gain 200 76 -99.61 gain 76 201 -95.66 gain 201 76 -96.53 gain 76 202 -93.96 gain 202 76 -93.97 gain 76 203 -95.47 gain 203 76 -94.59 gain 76 204 -95.38 gain 204 76 -91.14 gain 76 205 -97.40 gain 205 76 -96.91 gain 76 206 -93.22 gain 206 76 -93.84 gain 76 207 -95.32 gain 207 76 -95.35 gain 76 208 -102.55 gain 208 76 -105.19 gain 76 209 -96.07 gain 209 76 -98.27 gain 76 210 -95.86 gain 210 76 -98.24 gain 76 211 -91.27 gain 211 76 -88.88 gain 76 212 -93.39 gain 212 76 -94.01 gain 76 213 -97.96 gain 213 76 -97.91 gain 76 214 -101.11 gain 214 76 -106.44 gain 76 215 -91.68 gain 215 76 -92.42 gain 76 216 -94.86 gain 216 76 -99.51 gain 76 217 -96.00 gain 217 76 -100.91 gain 76 218 -98.70 gain 218 76 -96.42 gain 76 219 -100.50 gain 219 76 -98.70 gain 76 220 -97.79 gain 220 76 -92.08 gain 76 221 -104.77 gain 221 76 -104.73 gain 76 222 -104.21 gain 222 76 -99.98 gain 76 223 -98.22 gain 223 76 -97.23 gain 76 224 -102.76 gain 224 76 -102.24 gain 77 78 -66.70 gain 78 77 -71.20 gain 77 79 -72.80 gain 79 77 -76.92 gain 77 80 -71.37 gain 80 77 -73.28 gain 77 81 -78.63 gain 81 77 -81.45 gain 77 82 -76.68 gain 82 77 -80.48 gain 77 83 -85.13 gain 83 77 -86.20 gain 77 84 -86.68 gain 84 77 -84.94 gain 77 85 -88.82 gain 85 77 -92.51 gain 77 86 -95.55 gain 86 77 -100.88 gain 77 87 -88.39 gain 87 77 -91.00 gain 77 88 -87.65 gain 88 77 -89.91 gain 77 89 -98.66 gain 89 77 -103.06 gain 77 90 -68.99 gain 90 77 -72.73 gain 77 91 -66.00 gain 91 77 -70.81 gain 77 92 -54.78 gain 92 77 -60.50 gain 77 93 -66.54 gain 93 77 -69.62 gain 77 94 -70.75 gain 94 77 -72.40 gain 77 95 -75.40 gain 95 77 -76.29 gain 77 96 -84.20 gain 96 77 -92.06 gain 77 97 -83.62 gain 97 77 -84.31 gain 77 98 -89.99 gain 98 77 -91.15 gain 77 99 -91.62 gain 99 77 -91.91 gain 77 100 -88.68 gain 100 77 -88.89 gain 77 101 -86.92 gain 101 77 -90.76 gain 77 102 -91.10 gain 102 77 -94.91 gain 77 103 -92.83 gain 103 77 -97.80 gain 77 104 -97.74 gain 104 77 -105.20 gain 77 105 -73.71 gain 105 77 -75.69 gain 77 106 -74.40 gain 106 77 -73.71 gain 77 107 -76.37 gain 107 77 -75.59 gain 77 108 -71.17 gain 108 77 -70.00 gain 77 109 -77.48 gain 109 77 -79.76 gain 77 110 -84.02 gain 110 77 -92.66 gain 77 111 -80.94 gain 111 77 -79.56 gain 77 112 -83.95 gain 112 77 -86.02 gain 77 113 -83.50 gain 113 77 -84.70 gain 77 114 -92.32 gain 114 77 -90.69 gain 77 115 -91.68 gain 115 77 -90.70 gain 77 116 -94.33 gain 116 77 -95.79 gain 77 117 -92.98 gain 117 77 -91.59 gain 77 118 -93.00 gain 118 77 -93.22 gain 77 119 -86.73 gain 119 77 -92.01 gain 77 120 -78.65 gain 120 77 -81.31 gain 77 121 -73.15 gain 121 77 -76.84 gain 77 122 -74.51 gain 122 77 -77.95 gain 77 123 -76.90 gain 123 77 -80.68 gain 77 124 -78.29 gain 124 77 -80.06 gain 77 125 -74.93 gain 125 77 -80.04 gain 77 126 -85.14 gain 126 77 -86.90 gain 77 127 -83.85 gain 127 77 -85.23 gain 77 128 -86.34 gain 128 77 -90.32 gain 77 129 -84.19 gain 129 77 -85.38 gain 77 130 -93.95 gain 130 77 -96.42 gain 77 131 -98.92 gain 131 77 -101.17 gain 77 132 -93.34 gain 132 77 -91.60 gain 77 133 -92.86 gain 133 77 -96.29 gain 77 134 -94.68 gain 134 77 -94.98 gain 77 135 -80.18 gain 135 77 -82.78 gain 77 136 -81.33 gain 136 77 -84.37 gain 77 137 -86.36 gain 137 77 -92.31 gain 77 138 -76.36 gain 138 77 -75.85 gain 77 139 -76.86 gain 139 77 -79.61 gain 77 140 -87.37 gain 140 77 -90.95 gain 77 141 -76.60 gain 141 77 -72.15 gain 77 142 -91.52 gain 142 77 -93.82 gain 77 143 -86.16 gain 143 77 -91.19 gain 77 144 -91.77 gain 144 77 -95.16 gain 77 145 -91.24 gain 145 77 -98.02 gain 77 146 -90.14 gain 146 77 -92.91 gain 77 147 -93.15 gain 147 77 -93.03 gain 77 148 -93.30 gain 148 77 -91.51 gain 77 149 -94.63 gain 149 77 -96.49 gain 77 150 -85.69 gain 150 77 -88.39 gain 77 151 -86.44 gain 151 77 -88.08 gain 77 152 -83.53 gain 152 77 -84.99 gain 77 153 -80.13 gain 153 77 -80.81 gain 77 154 -86.87 gain 154 77 -89.44 gain 77 155 -87.23 gain 155 77 -88.38 gain 77 156 -86.93 gain 156 77 -87.31 gain 77 157 -89.11 gain 157 77 -91.97 gain 77 158 -88.11 gain 158 77 -90.47 gain 77 159 -83.44 gain 159 77 -88.18 gain 77 160 -96.25 gain 160 77 -98.15 gain 77 161 -90.40 gain 161 77 -94.73 gain 77 162 -94.41 gain 162 77 -98.46 gain 77 163 -96.78 gain 163 77 -102.74 gain 77 164 -96.92 gain 164 77 -102.25 gain 77 165 -87.24 gain 165 77 -89.63 gain 77 166 -87.00 gain 166 77 -89.14 gain 77 167 -81.10 gain 167 77 -83.97 gain 77 168 -84.57 gain 168 77 -86.33 gain 77 169 -82.45 gain 169 77 -85.32 gain 77 170 -84.20 gain 170 77 -86.30 gain 77 171 -96.40 gain 171 77 -99.58 gain 77 172 -95.28 gain 172 77 -96.65 gain 77 173 -94.09 gain 173 77 -100.12 gain 77 174 -87.19 gain 174 77 -89.27 gain 77 175 -97.45 gain 175 77 -100.66 gain 77 176 -93.60 gain 176 77 -95.77 gain 77 177 -96.10 gain 177 77 -101.28 gain 77 178 -95.96 gain 178 77 -94.58 gain 77 179 -101.40 gain 179 77 -99.44 gain 77 180 -93.50 gain 180 77 -100.99 gain 77 181 -83.41 gain 181 77 -84.93 gain 77 182 -87.76 gain 182 77 -90.35 gain 77 183 -79.68 gain 183 77 -82.55 gain 77 184 -96.98 gain 184 77 -102.60 gain 77 185 -98.01 gain 185 77 -107.50 gain 77 186 -86.86 gain 186 77 -91.93 gain 77 187 -96.51 gain 187 77 -99.31 gain 77 188 -97.82 gain 188 77 -103.02 gain 77 189 -88.91 gain 189 77 -88.84 gain 77 190 -96.66 gain 190 77 -100.51 gain 77 191 -92.29 gain 191 77 -94.85 gain 77 192 -85.08 gain 192 77 -86.33 gain 77 193 -98.54 gain 193 77 -98.78 gain 77 194 -88.78 gain 194 77 -89.80 gain 77 195 -88.31 gain 195 77 -87.88 gain 77 196 -90.80 gain 196 77 -94.67 gain 77 197 -88.22 gain 197 77 -87.23 gain 77 198 -87.94 gain 198 77 -91.46 gain 77 199 -94.90 gain 199 77 -98.54 gain 77 200 -100.16 gain 200 77 -105.13 gain 77 201 -92.00 gain 201 77 -96.88 gain 77 202 -91.95 gain 202 77 -95.96 gain 77 203 -97.31 gain 203 77 -100.44 gain 77 204 -89.90 gain 204 77 -89.66 gain 77 205 -88.51 gain 205 77 -92.01 gain 77 206 -99.29 gain 206 77 -103.91 gain 77 207 -94.89 gain 207 77 -98.93 gain 77 208 -99.60 gain 208 77 -106.24 gain 77 209 -94.27 gain 209 77 -100.48 gain 77 210 -88.20 gain 210 77 -94.58 gain 77 211 -86.05 gain 211 77 -87.66 gain 77 212 -93.84 gain 212 77 -98.46 gain 77 213 -89.65 gain 213 77 -93.61 gain 77 214 -94.67 gain 214 77 -104.01 gain 77 215 -89.84 gain 215 77 -94.58 gain 77 216 -88.51 gain 216 77 -97.16 gain 77 217 -91.01 gain 217 77 -99.93 gain 77 218 -104.03 gain 218 77 -105.75 gain 77 219 -99.25 gain 219 77 -101.45 gain 77 220 -94.16 gain 220 77 -92.45 gain 77 221 -90.23 gain 221 77 -94.20 gain 77 222 -96.30 gain 222 77 -96.07 gain 77 223 -94.41 gain 223 77 -97.43 gain 77 224 -97.74 gain 224 77 -101.23 gain 78 79 -63.88 gain 79 78 -63.50 gain 78 80 -76.87 gain 80 78 -74.28 gain 78 81 -77.82 gain 81 78 -76.14 gain 78 82 -84.35 gain 82 78 -83.65 gain 78 83 -83.41 gain 83 78 -79.98 gain 78 84 -92.70 gain 84 78 -86.46 gain 78 85 -82.99 gain 85 78 -82.17 gain 78 86 -91.03 gain 86 78 -91.86 gain 78 87 -97.37 gain 87 78 -95.49 gain 78 88 -94.00 gain 88 78 -91.75 gain 78 89 -103.46 gain 89 78 -103.36 gain 78 90 -82.03 gain 90 78 -81.27 gain 78 91 -75.39 gain 91 78 -75.69 gain 78 92 -75.37 gain 92 78 -76.60 gain 78 93 -69.29 gain 93 78 -67.87 gain 78 94 -78.43 gain 94 78 -75.58 gain 78 95 -74.13 gain 95 78 -70.52 gain 78 96 -81.46 gain 96 78 -84.82 gain 78 97 -82.17 gain 97 78 -78.35 gain 78 98 -89.95 gain 98 78 -86.61 gain 78 99 -91.43 gain 99 78 -87.22 gain 78 100 -97.45 gain 100 78 -93.16 gain 78 101 -90.86 gain 101 78 -90.20 gain 78 102 -98.01 gain 102 78 -97.31 gain 78 103 -99.48 gain 103 78 -99.95 gain 78 104 -98.10 gain 104 78 -101.05 gain 78 105 -87.44 gain 105 78 -84.92 gain 78 106 -79.32 gain 106 78 -74.13 gain 78 107 -76.38 gain 107 78 -71.09 gain 78 108 -78.24 gain 108 78 -72.57 gain 78 109 -86.96 gain 109 78 -84.74 gain 78 110 -81.65 gain 110 78 -85.79 gain 78 111 -84.16 gain 111 78 -78.27 gain 78 112 -87.71 gain 112 78 -85.28 gain 78 113 -91.45 gain 113 78 -88.16 gain 78 114 -96.48 gain 114 78 -90.35 gain 78 115 -92.08 gain 115 78 -86.61 gain 78 116 -100.65 gain 116 78 -97.60 gain 78 117 -102.28 gain 117 78 -96.39 gain 78 118 -96.17 gain 118 78 -91.90 gain 78 119 -95.88 gain 119 78 -96.66 gain 78 120 -88.53 gain 120 78 -86.70 gain 78 121 -86.60 gain 121 78 -85.78 gain 78 122 -77.40 gain 122 78 -76.34 gain 78 123 -84.56 gain 123 78 -83.84 gain 78 124 -76.84 gain 124 78 -74.11 gain 78 125 -87.50 gain 125 78 -88.10 gain 78 126 -82.49 gain 126 78 -79.74 gain 78 127 -88.59 gain 127 78 -85.47 gain 78 128 -92.61 gain 128 78 -92.09 gain 78 129 -87.72 gain 129 78 -84.40 gain 78 130 -103.26 gain 130 78 -101.23 gain 78 131 -96.01 gain 131 78 -93.76 gain 78 132 -93.53 gain 132 78 -87.29 gain 78 133 -105.12 gain 133 78 -104.06 gain 78 134 -93.10 gain 134 78 -88.89 gain 78 135 -92.50 gain 135 78 -90.60 gain 78 136 -81.46 gain 136 78 -80.00 gain 78 137 -84.60 gain 137 78 -86.06 gain 78 138 -84.09 gain 138 78 -79.08 gain 78 139 -87.53 gain 139 78 -85.78 gain 78 140 -83.59 gain 140 78 -82.66 gain 78 141 -87.88 gain 141 78 -78.93 gain 78 142 -91.80 gain 142 78 -89.60 gain 78 143 -89.47 gain 143 78 -90.00 gain 78 144 -94.89 gain 144 78 -93.78 gain 78 145 -91.34 gain 145 78 -93.62 gain 78 146 -95.02 gain 146 78 -93.29 gain 78 147 -101.68 gain 147 78 -97.06 gain 78 148 -101.48 gain 148 78 -95.19 gain 78 149 -99.38 gain 149 78 -96.75 gain 78 150 -89.31 gain 150 78 -87.51 gain 78 151 -81.69 gain 151 78 -78.83 gain 78 152 -97.11 gain 152 78 -94.07 gain 78 153 -92.45 gain 153 78 -88.62 gain 78 154 -86.36 gain 154 78 -84.43 gain 78 155 -84.08 gain 155 78 -80.73 gain 78 156 -92.62 gain 156 78 -88.50 gain 78 157 -93.63 gain 157 78 -91.99 gain 78 158 -94.92 gain 158 78 -92.78 gain 78 159 -88.49 gain 159 78 -88.73 gain 78 160 -92.33 gain 160 78 -89.73 gain 78 161 -92.39 gain 161 78 -92.23 gain 78 162 -106.20 gain 162 78 -105.74 gain 78 163 -101.72 gain 163 78 -103.18 gain 78 164 -99.10 gain 164 78 -99.94 gain 78 165 -98.13 gain 165 78 -96.02 gain 78 166 -94.97 gain 166 78 -92.62 gain 78 167 -88.80 gain 167 78 -87.17 gain 78 168 -89.83 gain 168 78 -87.09 gain 78 169 -87.10 gain 169 78 -85.48 gain 78 170 -88.05 gain 170 78 -85.66 gain 78 171 -100.59 gain 171 78 -99.28 gain 78 172 -96.20 gain 172 78 -93.07 gain 78 173 -97.35 gain 173 78 -98.87 gain 78 174 -93.00 gain 174 78 -90.57 gain 78 175 -89.04 gain 175 78 -87.75 gain 78 176 -98.51 gain 176 78 -96.18 gain 78 177 -101.08 gain 177 78 -101.76 gain 78 178 -89.60 gain 178 78 -83.72 gain 78 179 -100.05 gain 179 78 -93.59 gain 78 180 -91.49 gain 180 78 -94.48 gain 78 181 -92.41 gain 181 78 -89.42 gain 78 182 -85.87 gain 182 78 -83.97 gain 78 183 -94.94 gain 183 78 -93.32 gain 78 184 -86.07 gain 184 78 -87.19 gain 78 185 -93.13 gain 185 78 -98.11 gain 78 186 -103.19 gain 186 78 -103.76 gain 78 187 -93.50 gain 187 78 -91.80 gain 78 188 -94.99 gain 188 78 -95.70 gain 78 189 -96.27 gain 189 78 -91.70 gain 78 190 -96.28 gain 190 78 -95.63 gain 78 191 -94.50 gain 191 78 -92.55 gain 78 192 -103.41 gain 192 78 -100.16 gain 78 193 -104.10 gain 193 78 -99.84 gain 78 194 -99.23 gain 194 78 -95.75 gain 78 195 -95.42 gain 195 78 -90.49 gain 78 196 -99.91 gain 196 78 -99.29 gain 78 197 -101.57 gain 197 78 -96.08 gain 78 198 -89.60 gain 198 78 -88.62 gain 78 199 -93.93 gain 199 78 -93.06 gain 78 200 -100.89 gain 200 78 -101.36 gain 78 201 -96.96 gain 201 78 -97.33 gain 78 202 -98.05 gain 202 78 -97.56 gain 78 203 -99.30 gain 203 78 -97.92 gain 78 204 -106.41 gain 204 78 -101.67 gain 78 205 -100.84 gain 205 78 -99.85 gain 78 206 -100.78 gain 206 78 -100.90 gain 78 207 -98.49 gain 207 78 -98.02 gain 78 208 -94.22 gain 208 78 -96.36 gain 78 209 -109.82 gain 209 78 -111.52 gain 78 210 -99.54 gain 210 78 -101.43 gain 78 211 -96.30 gain 211 78 -93.41 gain 78 212 -100.87 gain 212 78 -101.00 gain 78 213 -97.21 gain 213 78 -96.67 gain 78 214 -101.16 gain 214 78 -106.00 gain 78 215 -90.84 gain 215 78 -91.09 gain 78 216 -92.49 gain 216 78 -96.64 gain 78 217 -99.68 gain 217 78 -104.09 gain 78 218 -100.27 gain 218 78 -97.49 gain 78 219 -97.27 gain 219 78 -94.97 gain 78 220 -96.52 gain 220 78 -90.31 gain 78 221 -92.73 gain 221 78 -92.19 gain 78 222 -98.91 gain 222 78 -94.19 gain 78 223 -101.98 gain 223 78 -100.50 gain 78 224 -101.45 gain 224 78 -100.44 gain 79 80 -69.51 gain 80 79 -67.30 gain 79 81 -78.52 gain 81 79 -77.22 gain 79 82 -78.78 gain 82 79 -78.46 gain 79 83 -85.90 gain 83 79 -82.85 gain 79 84 -91.07 gain 84 79 -85.21 gain 79 85 -87.62 gain 85 79 -87.19 gain 79 86 -90.85 gain 86 79 -92.05 gain 79 87 -90.00 gain 87 79 -88.49 gain 79 88 -88.99 gain 88 79 -87.12 gain 79 89 -97.97 gain 89 79 -98.24 gain 79 90 -84.44 gain 90 79 -84.06 gain 79 91 -78.69 gain 91 79 -79.37 gain 79 92 -77.29 gain 92 79 -78.89 gain 79 93 -72.27 gain 93 79 -71.23 gain 79 94 -71.21 gain 94 79 -68.74 gain 79 95 -71.60 gain 95 79 -68.37 gain 79 96 -80.90 gain 96 79 -84.64 gain 79 97 -83.49 gain 97 79 -80.05 gain 79 98 -81.89 gain 98 79 -78.92 gain 79 99 -86.03 gain 99 79 -82.20 gain 79 100 -91.08 gain 100 79 -87.17 gain 79 101 -93.67 gain 101 79 -93.39 gain 79 102 -93.40 gain 102 79 -93.08 gain 79 103 -96.81 gain 103 79 -97.66 gain 79 104 -99.84 gain 104 79 -103.17 gain 79 105 -80.14 gain 105 79 -77.99 gain 79 106 -78.35 gain 106 79 -73.54 gain 79 107 -75.42 gain 107 79 -70.51 gain 79 108 -76.74 gain 108 79 -71.45 gain 79 109 -72.13 gain 109 79 -70.29 gain 79 110 -84.41 gain 110 79 -88.93 gain 79 111 -77.68 gain 111 79 -72.17 gain 79 112 -76.25 gain 112 79 -74.20 gain 79 113 -89.64 gain 113 79 -86.72 gain 79 114 -94.85 gain 114 79 -89.10 gain 79 115 -89.09 gain 115 79 -84.00 gain 79 116 -88.57 gain 116 79 -85.90 gain 79 117 -92.70 gain 117 79 -87.18 gain 79 118 -96.03 gain 118 79 -92.13 gain 79 119 -91.46 gain 119 79 -92.61 gain 79 120 -83.80 gain 120 79 -82.35 gain 79 121 -92.47 gain 121 79 -92.03 gain 79 122 -85.08 gain 122 79 -84.39 gain 79 123 -79.80 gain 123 79 -79.46 gain 79 124 -73.97 gain 124 79 -71.62 gain 79 125 -82.40 gain 125 79 -83.38 gain 79 126 -87.89 gain 126 79 -85.52 gain 79 127 -84.10 gain 127 79 -81.36 gain 79 128 -89.21 gain 128 79 -89.06 gain 79 129 -94.07 gain 129 79 -91.13 gain 79 130 -93.91 gain 130 79 -92.26 gain 79 131 -91.73 gain 131 79 -89.85 gain 79 132 -96.97 gain 132 79 -91.11 gain 79 133 -101.24 gain 133 79 -100.55 gain 79 134 -95.16 gain 134 79 -91.33 gain 79 135 -90.15 gain 135 79 -88.63 gain 79 136 -88.49 gain 136 79 -87.41 gain 79 137 -86.01 gain 137 79 -87.85 gain 79 138 -79.34 gain 138 79 -74.71 gain 79 139 -80.17 gain 139 79 -78.80 gain 79 140 -90.47 gain 140 79 -89.92 gain 79 141 -83.09 gain 141 79 -74.52 gain 79 142 -88.74 gain 142 79 -86.91 gain 79 143 -92.20 gain 143 79 -93.11 gain 79 144 -83.50 gain 144 79 -82.77 gain 79 145 -97.26 gain 145 79 -99.92 gain 79 146 -90.47 gain 146 79 -89.12 gain 79 147 -93.87 gain 147 79 -89.63 gain 79 148 -93.48 gain 148 79 -87.56 gain 79 149 -93.84 gain 149 79 -91.58 gain 79 150 -94.47 gain 150 79 -93.05 gain 79 151 -92.75 gain 151 79 -90.27 gain 79 152 -79.63 gain 152 79 -76.97 gain 79 153 -89.46 gain 153 79 -86.01 gain 79 154 -80.82 gain 154 79 -79.27 gain 79 155 -86.99 gain 155 79 -84.02 gain 79 156 -85.06 gain 156 79 -81.31 gain 79 157 -88.21 gain 157 79 -86.95 gain 79 158 -96.88 gain 158 79 -95.12 gain 79 159 -92.42 gain 159 79 -93.05 gain 79 160 -95.24 gain 160 79 -93.02 gain 79 161 -91.90 gain 161 79 -92.11 gain 79 162 -93.28 gain 162 79 -93.21 gain 79 163 -106.85 gain 163 79 -108.69 gain 79 164 -99.04 gain 164 79 -100.25 gain 79 165 -97.08 gain 165 79 -95.35 gain 79 166 -89.80 gain 166 79 -87.82 gain 79 167 -91.19 gain 167 79 -89.93 gain 79 168 -91.65 gain 168 79 -89.29 gain 79 169 -94.12 gain 169 79 -92.87 gain 79 170 -91.31 gain 170 79 -89.30 gain 79 171 -92.73 gain 171 79 -91.80 gain 79 172 -87.47 gain 172 79 -84.73 gain 79 173 -92.66 gain 173 79 -94.56 gain 79 174 -94.97 gain 174 79 -92.92 gain 79 175 -88.04 gain 175 79 -87.12 gain 79 176 -89.83 gain 176 79 -87.88 gain 79 177 -96.67 gain 177 79 -97.73 gain 79 178 -93.94 gain 178 79 -88.44 gain 79 179 -96.02 gain 179 79 -89.94 gain 79 180 -89.64 gain 180 79 -93.00 gain 79 181 -92.46 gain 181 79 -89.85 gain 79 182 -90.02 gain 182 79 -88.50 gain 79 183 -95.72 gain 183 79 -94.47 gain 79 184 -86.07 gain 184 79 -87.56 gain 79 185 -91.42 gain 185 79 -96.78 gain 79 186 -83.28 gain 186 79 -84.22 gain 79 187 -89.67 gain 187 79 -88.34 gain 79 188 -89.21 gain 188 79 -90.30 gain 79 189 -97.72 gain 189 79 -93.53 gain 79 190 -94.39 gain 190 79 -94.11 gain 79 191 -101.00 gain 191 79 -99.43 gain 79 192 -99.47 gain 192 79 -96.60 gain 79 193 -99.16 gain 193 79 -95.28 gain 79 194 -100.41 gain 194 79 -97.31 gain 79 195 -91.80 gain 195 79 -87.25 gain 79 196 -100.58 gain 196 79 -100.33 gain 79 197 -90.59 gain 197 79 -85.48 gain 79 198 -91.57 gain 198 79 -90.97 gain 79 199 -99.37 gain 199 79 -98.88 gain 79 200 -88.69 gain 200 79 -89.54 gain 79 201 -92.06 gain 201 79 -92.81 gain 79 202 -93.16 gain 202 79 -93.05 gain 79 203 -97.85 gain 203 79 -96.85 gain 79 204 -105.00 gain 204 79 -100.65 gain 79 205 -90.65 gain 205 79 -90.04 gain 79 206 -97.98 gain 206 79 -98.47 gain 79 207 -97.59 gain 207 79 -97.50 gain 79 208 -98.65 gain 208 79 -101.16 gain 79 209 -91.30 gain 209 79 -93.38 gain 79 210 -93.14 gain 210 79 -95.40 gain 79 211 -93.93 gain 211 79 -91.42 gain 79 212 -98.96 gain 212 79 -99.47 gain 79 213 -96.33 gain 213 79 -96.16 gain 79 214 -94.20 gain 214 79 -99.42 gain 79 215 -99.99 gain 215 79 -100.61 gain 79 216 -92.00 gain 216 79 -96.53 gain 79 217 -101.53 gain 217 79 -106.32 gain 79 218 -102.46 gain 218 79 -100.06 gain 79 219 -92.70 gain 219 79 -90.78 gain 79 220 -102.78 gain 220 79 -96.95 gain 79 221 -97.79 gain 221 79 -97.63 gain 79 222 -94.57 gain 222 79 -90.22 gain 79 223 -99.35 gain 223 79 -98.25 gain 79 224 -100.84 gain 224 79 -100.21 gain 80 81 -62.19 gain 81 80 -63.10 gain 80 82 -68.63 gain 82 80 -70.52 gain 80 83 -79.46 gain 83 80 -78.62 gain 80 84 -83.52 gain 84 80 -79.87 gain 80 85 -93.25 gain 85 80 -95.03 gain 80 86 -91.08 gain 86 80 -94.49 gain 80 87 -86.34 gain 87 80 -87.04 gain 80 88 -95.19 gain 88 80 -95.54 gain 80 89 -84.85 gain 89 80 -87.34 gain 80 90 -86.01 gain 90 80 -87.84 gain 80 91 -82.12 gain 91 80 -85.02 gain 80 92 -82.47 gain 92 80 -86.28 gain 80 93 -67.76 gain 93 80 -68.94 gain 80 94 -73.63 gain 94 80 -73.37 gain 80 95 -65.10 gain 95 80 -64.08 gain 80 96 -69.43 gain 96 80 -75.39 gain 80 97 -71.79 gain 97 80 -70.57 gain 80 98 -85.62 gain 98 80 -84.86 gain 80 99 -84.35 gain 99 80 -82.73 gain 80 100 -89.13 gain 100 80 -87.43 gain 80 101 -88.11 gain 101 80 -90.03 gain 80 102 -91.74 gain 102 80 -93.64 gain 80 103 -92.46 gain 103 80 -95.52 gain 80 104 -86.16 gain 104 80 -91.70 gain 80 105 -83.55 gain 105 80 -83.62 gain 80 106 -87.95 gain 106 80 -85.35 gain 80 107 -75.62 gain 107 80 -72.93 gain 80 108 -72.89 gain 108 80 -69.81 gain 80 109 -81.06 gain 109 80 -81.43 gain 80 110 -70.59 gain 110 80 -77.33 gain 80 111 -80.19 gain 111 80 -76.89 gain 80 112 -82.59 gain 112 80 -82.75 gain 80 113 -76.03 gain 113 80 -75.33 gain 80 114 -78.59 gain 114 80 -75.05 gain 80 115 -84.14 gain 115 80 -81.26 gain 80 116 -97.40 gain 116 80 -96.95 gain 80 117 -87.63 gain 117 80 -84.32 gain 80 118 -89.01 gain 118 80 -87.32 gain 80 119 -100.31 gain 119 80 -103.68 gain 80 120 -87.65 gain 120 80 -88.41 gain 80 121 -82.15 gain 121 80 -83.93 gain 80 122 -82.86 gain 122 80 -84.39 gain 80 123 -78.20 gain 123 80 -80.06 gain 80 124 -83.16 gain 124 80 -83.02 gain 80 125 -78.81 gain 125 80 -82.00 gain 80 126 -78.48 gain 126 80 -78.32 gain 80 127 -77.86 gain 127 80 -77.32 gain 80 128 -81.07 gain 128 80 -83.14 gain 80 129 -80.97 gain 129 80 -80.25 gain 80 130 -79.61 gain 130 80 -80.18 gain 80 131 -85.18 gain 131 80 -85.52 gain 80 132 -87.92 gain 132 80 -84.26 gain 80 133 -94.70 gain 133 80 -96.22 gain 80 134 -91.57 gain 134 80 -89.96 gain 80 135 -84.32 gain 135 80 -85.00 gain 80 136 -84.86 gain 136 80 -85.99 gain 80 137 -84.46 gain 137 80 -88.50 gain 80 138 -82.97 gain 138 80 -80.54 gain 80 139 -84.28 gain 139 80 -85.12 gain 80 140 -77.44 gain 140 80 -79.11 gain 80 141 -82.95 gain 141 80 -76.59 gain 80 142 -85.90 gain 142 80 -86.28 gain 80 143 -80.57 gain 143 80 -83.69 gain 80 144 -85.37 gain 144 80 -86.86 gain 80 145 -77.27 gain 145 80 -82.14 gain 80 146 -94.15 gain 146 80 -95.01 gain 80 147 -87.90 gain 147 80 -85.87 gain 80 148 -93.58 gain 148 80 -89.88 gain 80 149 -93.58 gain 149 80 -93.54 gain 80 150 -99.01 gain 150 80 -99.80 gain 80 151 -92.19 gain 151 80 -91.92 gain 80 152 -90.57 gain 152 80 -90.11 gain 80 153 -86.85 gain 153 80 -85.62 gain 80 154 -85.06 gain 154 80 -85.73 gain 80 155 -81.75 gain 155 80 -80.99 gain 80 156 -94.31 gain 156 80 -92.77 gain 80 157 -88.55 gain 157 80 -89.50 gain 80 158 -83.14 gain 158 80 -83.58 gain 80 159 -89.70 gain 159 80 -92.53 gain 80 160 -97.15 gain 160 80 -97.13 gain 80 161 -89.66 gain 161 80 -92.09 gain 80 162 -92.44 gain 162 80 -94.58 gain 80 163 -91.73 gain 163 80 -95.78 gain 80 164 -87.97 gain 164 80 -91.39 gain 80 165 -88.64 gain 165 80 -89.11 gain 80 166 -88.77 gain 166 80 -89.01 gain 80 167 -87.66 gain 167 80 -88.61 gain 80 168 -92.18 gain 168 80 -92.03 gain 80 169 -93.28 gain 169 80 -94.24 gain 80 170 -86.04 gain 170 80 -86.24 gain 80 171 -90.13 gain 171 80 -91.41 gain 80 172 -91.29 gain 172 80 -90.76 gain 80 173 -84.22 gain 173 80 -88.33 gain 80 174 -95.33 gain 174 80 -95.49 gain 80 175 -88.17 gain 175 80 -89.46 gain 80 176 -95.18 gain 176 80 -95.44 gain 80 177 -98.29 gain 177 80 -101.56 gain 80 178 -97.85 gain 178 80 -94.56 gain 80 179 -101.25 gain 179 80 -97.38 gain 80 180 -97.74 gain 180 80 -103.32 gain 80 181 -91.76 gain 181 80 -91.36 gain 80 182 -88.88 gain 182 80 -89.57 gain 80 183 -85.34 gain 183 80 -86.30 gain 80 184 -87.86 gain 184 80 -91.57 gain 80 185 -85.93 gain 185 80 -93.51 gain 80 186 -88.78 gain 186 80 -91.94 gain 80 187 -81.22 gain 187 80 -82.10 gain 80 188 -94.98 gain 188 80 -98.28 gain 80 189 -97.09 gain 189 80 -95.11 gain 80 190 -85.83 gain 190 80 -87.77 gain 80 191 -94.90 gain 191 80 -95.55 gain 80 192 -97.98 gain 192 80 -97.32 gain 80 193 -98.59 gain 193 80 -96.92 gain 80 194 -98.31 gain 194 80 -97.42 gain 80 195 -98.78 gain 195 80 -96.43 gain 80 196 -91.20 gain 196 80 -93.16 gain 80 197 -97.99 gain 197 80 -95.09 gain 80 198 -83.61 gain 198 80 -85.22 gain 80 199 -99.63 gain 199 80 -101.35 gain 80 200 -87.23 gain 200 80 -90.28 gain 80 201 -91.35 gain 201 80 -94.31 gain 80 202 -85.98 gain 202 80 -88.08 gain 80 203 -99.19 gain 203 80 -100.40 gain 80 204 -90.42 gain 204 80 -88.28 gain 80 205 -95.09 gain 205 80 -96.69 gain 80 206 -91.00 gain 206 80 -93.70 gain 80 207 -93.42 gain 207 80 -95.54 gain 80 208 -94.03 gain 208 80 -98.76 gain 80 209 -99.93 gain 209 80 -104.23 gain 80 210 -100.91 gain 210 80 -105.38 gain 80 211 -89.92 gain 211 80 -89.62 gain 80 212 -92.11 gain 212 80 -94.82 gain 80 213 -95.19 gain 213 80 -97.23 gain 80 214 -93.78 gain 214 80 -101.21 gain 80 215 -92.61 gain 215 80 -95.44 gain 80 216 -91.47 gain 216 80 -98.21 gain 80 217 -87.98 gain 217 80 -94.98 gain 80 218 -91.12 gain 218 80 -90.92 gain 80 219 -89.95 gain 219 80 -90.24 gain 80 220 -95.28 gain 220 80 -91.66 gain 80 221 -93.05 gain 221 80 -95.11 gain 80 222 -93.16 gain 222 80 -91.03 gain 80 223 -99.57 gain 223 80 -100.67 gain 80 224 -97.15 gain 224 80 -98.72 gain 81 82 -67.46 gain 82 81 -68.44 gain 81 83 -74.11 gain 83 81 -72.36 gain 81 84 -80.95 gain 84 81 -76.38 gain 81 85 -90.42 gain 85 81 -91.28 gain 81 86 -91.06 gain 86 81 -93.56 gain 81 87 -92.75 gain 87 81 -92.54 gain 81 88 -90.63 gain 88 81 -90.06 gain 81 89 -89.17 gain 89 81 -90.75 gain 81 90 -90.35 gain 90 81 -91.27 gain 81 91 -87.20 gain 91 81 -89.18 gain 81 92 -90.50 gain 92 81 -93.41 gain 81 93 -84.62 gain 93 81 -84.89 gain 81 94 -86.49 gain 94 81 -85.31 gain 81 95 -75.49 gain 95 81 -73.56 gain 81 96 -67.79 gain 96 81 -72.83 gain 81 97 -67.24 gain 97 81 -65.11 gain 81 98 -76.89 gain 98 81 -75.22 gain 81 99 -72.84 gain 99 81 -70.31 gain 81 100 -75.82 gain 100 81 -73.20 gain 81 101 -86.43 gain 101 81 -87.44 gain 81 102 -89.94 gain 102 81 -90.92 gain 81 103 -96.08 gain 103 81 -98.23 gain 81 104 -92.94 gain 104 81 -97.57 gain 81 105 -88.82 gain 105 81 -87.97 gain 81 106 -86.27 gain 106 81 -82.75 gain 81 107 -80.54 gain 107 81 -76.93 gain 81 108 -78.95 gain 108 81 -74.96 gain 81 109 -81.56 gain 109 81 -81.02 gain 81 110 -71.61 gain 110 81 -77.44 gain 81 111 -74.74 gain 111 81 -70.53 gain 81 112 -82.83 gain 112 81 -82.09 gain 81 113 -77.07 gain 113 81 -75.45 gain 81 114 -77.45 gain 114 81 -72.99 gain 81 115 -80.73 gain 115 81 -76.93 gain 81 116 -79.19 gain 116 81 -77.82 gain 81 117 -92.90 gain 117 81 -88.68 gain 81 118 -95.57 gain 118 81 -92.97 gain 81 119 -94.97 gain 119 81 -97.43 gain 81 120 -88.07 gain 120 81 -87.91 gain 81 121 -82.80 gain 121 81 -83.66 gain 81 122 -86.66 gain 122 81 -87.28 gain 81 123 -78.39 gain 123 81 -79.35 gain 81 124 -75.25 gain 124 81 -74.19 gain 81 125 -78.29 gain 125 81 -80.57 gain 81 126 -75.34 gain 126 81 -74.27 gain 81 127 -81.94 gain 127 81 -80.50 gain 81 128 -80.11 gain 128 81 -81.26 gain 81 129 -89.54 gain 129 81 -87.90 gain 81 130 -84.90 gain 130 81 -84.55 gain 81 131 -87.21 gain 131 81 -86.64 gain 81 132 -83.10 gain 132 81 -78.54 gain 81 133 -99.23 gain 133 81 -99.84 gain 81 134 -90.48 gain 134 81 -87.95 gain 81 135 -89.88 gain 135 81 -89.66 gain 81 136 -85.50 gain 136 81 -85.72 gain 81 137 -84.72 gain 137 81 -87.85 gain 81 138 -91.44 gain 138 81 -88.10 gain 81 139 -82.82 gain 139 81 -82.74 gain 81 140 -78.88 gain 140 81 -79.64 gain 81 141 -91.04 gain 141 81 -83.77 gain 81 142 -82.80 gain 142 81 -82.27 gain 81 143 -87.99 gain 143 81 -90.20 gain 81 144 -86.18 gain 144 81 -86.75 gain 81 145 -89.07 gain 145 81 -93.03 gain 81 146 -83.36 gain 146 81 -83.31 gain 81 147 -81.64 gain 147 81 -78.70 gain 81 148 -90.02 gain 148 81 -85.41 gain 81 149 -97.40 gain 149 81 -96.44 gain 81 150 -91.30 gain 150 81 -91.18 gain 81 151 -93.58 gain 151 81 -92.40 gain 81 152 -90.96 gain 152 81 -89.59 gain 81 153 -90.98 gain 153 81 -88.83 gain 81 154 -90.99 gain 154 81 -90.74 gain 81 155 -78.47 gain 155 81 -76.79 gain 81 156 -90.04 gain 156 81 -87.60 gain 81 157 -85.96 gain 157 81 -86.00 gain 81 158 -87.36 gain 158 81 -86.90 gain 81 159 -92.18 gain 159 81 -94.10 gain 81 160 -87.92 gain 160 81 -87.00 gain 81 161 -91.81 gain 161 81 -93.32 gain 81 162 -84.56 gain 162 81 -85.78 gain 81 163 -93.37 gain 163 81 -96.51 gain 81 164 -106.78 gain 164 81 -109.29 gain 81 165 -88.52 gain 165 81 -88.08 gain 81 166 -87.16 gain 166 81 -86.48 gain 81 167 -101.64 gain 167 81 -101.68 gain 81 168 -89.88 gain 168 81 -88.82 gain 81 169 -88.18 gain 169 81 -88.23 gain 81 170 -86.32 gain 170 81 -85.61 gain 81 171 -89.48 gain 171 81 -89.84 gain 81 172 -92.27 gain 172 81 -90.83 gain 81 173 -95.97 gain 173 81 -99.17 gain 81 174 -85.08 gain 174 81 -84.33 gain 81 175 -91.00 gain 175 81 -91.38 gain 81 176 -99.41 gain 176 81 -98.76 gain 81 177 -93.82 gain 177 81 -96.18 gain 81 178 -93.64 gain 178 81 -89.44 gain 81 179 -94.26 gain 179 81 -89.48 gain 81 180 -101.84 gain 180 81 -106.51 gain 81 181 -91.42 gain 181 81 -90.11 gain 81 182 -98.54 gain 182 81 -98.31 gain 81 183 -83.63 gain 183 81 -83.68 gain 81 184 -92.15 gain 184 81 -94.94 gain 81 185 -87.14 gain 185 81 -93.80 gain 81 186 -89.71 gain 186 81 -91.96 gain 81 187 -81.26 gain 187 81 -81.24 gain 81 188 -87.04 gain 188 81 -89.42 gain 81 189 -98.50 gain 189 81 -95.61 gain 81 190 -98.15 gain 190 81 -99.18 gain 81 191 -85.31 gain 191 81 -85.05 gain 81 192 -95.23 gain 192 81 -93.65 gain 81 193 -94.56 gain 193 81 -91.97 gain 81 194 -94.04 gain 194 81 -92.24 gain 81 195 -90.88 gain 195 81 -87.62 gain 81 196 -93.63 gain 196 81 -94.68 gain 81 197 -87.37 gain 197 81 -83.56 gain 81 198 -92.51 gain 198 81 -93.21 gain 81 199 -91.00 gain 199 81 -91.81 gain 81 200 -91.92 gain 200 81 -94.06 gain 81 201 -97.20 gain 201 81 -99.25 gain 81 202 -93.84 gain 202 81 -95.02 gain 81 203 -96.76 gain 203 81 -97.07 gain 81 204 -93.51 gain 204 81 -90.45 gain 81 205 -93.92 gain 205 81 -94.61 gain 81 206 -95.00 gain 206 81 -96.79 gain 81 207 -92.20 gain 207 81 -93.41 gain 81 208 -108.28 gain 208 81 -112.10 gain 81 209 -97.07 gain 209 81 -100.45 gain 81 210 -96.33 gain 210 81 -99.89 gain 81 211 -100.35 gain 211 81 -99.15 gain 81 212 -93.95 gain 212 81 -95.75 gain 81 213 -95.02 gain 213 81 -96.15 gain 81 214 -99.46 gain 214 81 -105.98 gain 81 215 -87.03 gain 215 81 -88.95 gain 81 216 -93.07 gain 216 81 -98.90 gain 81 217 -93.35 gain 217 81 -99.44 gain 81 218 -90.49 gain 218 81 -89.39 gain 81 219 -93.81 gain 219 81 -93.19 gain 81 220 -90.37 gain 220 81 -85.84 gain 81 221 -99.52 gain 221 81 -100.67 gain 81 222 -105.29 gain 222 81 -102.24 gain 81 223 -99.71 gain 223 81 -99.91 gain 81 224 -95.46 gain 224 81 -96.13 gain 82 83 -66.75 gain 83 82 -64.02 gain 82 84 -78.74 gain 84 82 -73.20 gain 82 85 -86.27 gain 85 82 -86.16 gain 82 86 -84.76 gain 86 82 -86.29 gain 82 87 -89.41 gain 87 82 -88.22 gain 82 88 -87.14 gain 88 82 -85.59 gain 82 89 -91.33 gain 89 82 -91.93 gain 82 90 -98.39 gain 90 82 -98.33 gain 82 91 -90.72 gain 91 82 -91.73 gain 82 92 -83.63 gain 92 82 -85.56 gain 82 93 -83.62 gain 93 82 -82.90 gain 82 94 -80.70 gain 94 82 -78.55 gain 82 95 -74.64 gain 95 82 -71.73 gain 82 96 -74.17 gain 96 82 -78.24 gain 82 97 -70.93 gain 97 82 -67.82 gain 82 98 -70.89 gain 98 82 -68.24 gain 82 99 -74.87 gain 99 82 -71.36 gain 82 100 -85.45 gain 100 82 -81.86 gain 82 101 -83.99 gain 101 82 -84.03 gain 82 102 -91.79 gain 102 82 -91.80 gain 82 103 -87.76 gain 103 82 -88.93 gain 82 104 -92.60 gain 104 82 -96.26 gain 82 105 -97.55 gain 105 82 -95.73 gain 82 106 -86.78 gain 106 82 -82.29 gain 82 107 -84.09 gain 107 82 -79.50 gain 82 108 -87.06 gain 108 82 -82.09 gain 82 109 -79.97 gain 109 82 -78.45 gain 82 110 -83.21 gain 110 82 -88.05 gain 82 111 -74.02 gain 111 82 -68.83 gain 82 112 -79.08 gain 112 82 -77.36 gain 82 113 -85.95 gain 113 82 -83.35 gain 82 114 -77.56 gain 114 82 -72.13 gain 82 115 -91.48 gain 115 82 -86.71 gain 82 116 -84.36 gain 116 82 -82.02 gain 82 117 -87.81 gain 117 82 -82.61 gain 82 118 -91.61 gain 118 82 -88.03 gain 82 119 -91.28 gain 119 82 -92.76 gain 82 120 -91.59 gain 120 82 -90.46 gain 82 121 -94.41 gain 121 82 -94.29 gain 82 122 -91.16 gain 122 82 -90.80 gain 82 123 -85.88 gain 123 82 -85.86 gain 82 124 -80.01 gain 124 82 -77.98 gain 82 125 -80.80 gain 125 82 -82.10 gain 82 126 -79.84 gain 126 82 -77.80 gain 82 127 -80.16 gain 127 82 -77.74 gain 82 128 -86.76 gain 128 82 -86.93 gain 82 129 -84.12 gain 129 82 -81.50 gain 82 130 -86.05 gain 130 82 -84.73 gain 82 131 -79.50 gain 131 82 -77.95 gain 82 132 -89.76 gain 132 82 -84.21 gain 82 133 -92.81 gain 133 82 -92.44 gain 82 134 -97.60 gain 134 82 -94.10 gain 82 135 -97.27 gain 135 82 -96.07 gain 82 136 -85.29 gain 136 82 -84.53 gain 82 137 -98.95 gain 137 82 -101.11 gain 82 138 -89.12 gain 138 82 -84.81 gain 82 139 -83.84 gain 139 82 -82.79 gain 82 140 -88.41 gain 140 82 -88.18 gain 82 141 -85.08 gain 141 82 -76.83 gain 82 142 -89.93 gain 142 82 -88.43 gain 82 143 -84.61 gain 143 82 -85.84 gain 82 144 -87.09 gain 144 82 -86.68 gain 82 145 -95.81 gain 145 82 -98.79 gain 82 146 -92.85 gain 146 82 -91.82 gain 82 147 -90.35 gain 147 82 -86.43 gain 82 148 -92.05 gain 148 82 -86.46 gain 82 149 -87.24 gain 149 82 -85.31 gain 82 150 -93.87 gain 150 82 -92.77 gain 82 151 -91.54 gain 151 82 -89.38 gain 82 152 -90.60 gain 152 82 -88.26 gain 82 153 -93.23 gain 153 82 -90.10 gain 82 154 -90.70 gain 154 82 -89.47 gain 82 155 -84.50 gain 155 82 -81.85 gain 82 156 -92.10 gain 156 82 -88.68 gain 82 157 -83.07 gain 157 82 -82.13 gain 82 158 -91.20 gain 158 82 -89.76 gain 82 159 -89.65 gain 159 82 -90.59 gain 82 160 -85.58 gain 160 82 -83.68 gain 82 161 -95.22 gain 161 82 -95.76 gain 82 162 -91.73 gain 162 82 -91.98 gain 82 163 -89.52 gain 163 82 -91.68 gain 82 164 -89.70 gain 164 82 -91.23 gain 82 165 -95.10 gain 165 82 -93.69 gain 82 166 -95.35 gain 166 82 -93.69 gain 82 167 -92.43 gain 167 82 -91.49 gain 82 168 -88.77 gain 168 82 -86.73 gain 82 169 -91.28 gain 169 82 -90.35 gain 82 170 -88.57 gain 170 82 -86.88 gain 82 171 -84.38 gain 171 82 -83.77 gain 82 172 -97.40 gain 172 82 -94.98 gain 82 173 -86.19 gain 173 82 -88.42 gain 82 174 -87.29 gain 174 82 -85.56 gain 82 175 -89.08 gain 175 82 -88.48 gain 82 176 -94.30 gain 176 82 -92.68 gain 82 177 -92.13 gain 177 82 -93.51 gain 82 178 -90.88 gain 178 82 -85.70 gain 82 179 -93.47 gain 179 82 -87.72 gain 82 180 -98.68 gain 180 82 -102.37 gain 82 181 -98.77 gain 181 82 -96.48 gain 82 182 -92.52 gain 182 82 -91.31 gain 82 183 -91.82 gain 183 82 -90.89 gain 82 184 -87.47 gain 184 82 -89.29 gain 82 185 -86.44 gain 185 82 -92.12 gain 82 186 -90.55 gain 186 82 -91.82 gain 82 187 -93.57 gain 187 82 -92.57 gain 82 188 -99.55 gain 188 82 -100.95 gain 82 189 -86.91 gain 189 82 -83.04 gain 82 190 -97.92 gain 190 82 -97.96 gain 82 191 -96.63 gain 191 82 -95.39 gain 82 192 -94.86 gain 192 82 -92.31 gain 82 193 -93.01 gain 193 82 -89.44 gain 82 194 -96.57 gain 194 82 -93.79 gain 82 195 -94.68 gain 195 82 -90.45 gain 82 196 -95.52 gain 196 82 -95.60 gain 82 197 -96.06 gain 197 82 -91.27 gain 82 198 -99.03 gain 198 82 -98.75 gain 82 199 -93.99 gain 199 82 -93.82 gain 82 200 -94.64 gain 200 82 -95.80 gain 82 201 -97.26 gain 201 82 -98.33 gain 82 202 -94.49 gain 202 82 -94.70 gain 82 203 -95.44 gain 203 82 -94.76 gain 82 204 -98.36 gain 204 82 -94.33 gain 82 205 -94.21 gain 205 82 -93.92 gain 82 206 -92.28 gain 206 82 -93.09 gain 82 207 -95.92 gain 207 82 -96.15 gain 82 208 -94.34 gain 208 82 -97.18 gain 82 209 -97.77 gain 209 82 -100.18 gain 82 210 -103.02 gain 210 82 -105.61 gain 82 211 -97.61 gain 211 82 -95.42 gain 82 212 -102.16 gain 212 82 -102.98 gain 82 213 -95.84 gain 213 82 -95.99 gain 82 214 -88.79 gain 214 82 -94.33 gain 82 215 -92.13 gain 215 82 -93.07 gain 82 216 -97.44 gain 216 82 -102.29 gain 82 217 -87.70 gain 217 82 -92.82 gain 82 218 -95.44 gain 218 82 -93.36 gain 82 219 -99.12 gain 219 82 -97.53 gain 82 220 -93.23 gain 220 82 -87.72 gain 82 221 -93.02 gain 221 82 -93.19 gain 82 222 -105.39 gain 222 82 -101.37 gain 82 223 -93.20 gain 223 82 -92.42 gain 82 224 -101.88 gain 224 82 -101.57 gain 83 84 -63.09 gain 84 83 -60.28 gain 83 85 -76.18 gain 85 83 -78.79 gain 83 86 -81.60 gain 86 83 -85.85 gain 83 87 -83.86 gain 87 83 -85.40 gain 83 88 -77.43 gain 88 83 -78.62 gain 83 89 -84.18 gain 89 83 -87.51 gain 83 90 -93.56 gain 90 83 -96.22 gain 83 91 -87.27 gain 91 83 -91.01 gain 83 92 -81.24 gain 92 83 -85.89 gain 83 93 -78.07 gain 93 83 -80.08 gain 83 94 -85.86 gain 94 83 -86.44 gain 83 95 -78.57 gain 95 83 -78.39 gain 83 96 -71.53 gain 96 83 -78.32 gain 83 97 -70.51 gain 97 83 -70.12 gain 83 98 -61.62 gain 98 83 -61.71 gain 83 99 -72.96 gain 99 83 -72.18 gain 83 100 -73.51 gain 100 83 -72.64 gain 83 101 -78.19 gain 101 83 -80.96 gain 83 102 -85.14 gain 102 83 -87.87 gain 83 103 -85.67 gain 103 83 -89.57 gain 83 104 -83.87 gain 104 83 -90.25 gain 83 105 -91.55 gain 105 83 -92.46 gain 83 106 -89.77 gain 106 83 -88.01 gain 83 107 -83.06 gain 107 83 -81.20 gain 83 108 -78.13 gain 108 83 -75.89 gain 83 109 -89.22 gain 109 83 -90.43 gain 83 110 -78.64 gain 110 83 -86.21 gain 83 111 -84.90 gain 111 83 -82.44 gain 83 112 -70.97 gain 112 83 -71.98 gain 83 113 -68.69 gain 113 83 -68.83 gain 83 114 -77.81 gain 114 83 -75.10 gain 83 115 -80.04 gain 115 83 -78.00 gain 83 116 -77.06 gain 116 83 -77.45 gain 83 117 -81.49 gain 117 83 -79.02 gain 83 118 -87.88 gain 118 83 -87.03 gain 83 119 -87.74 gain 119 83 -91.95 gain 83 120 -80.62 gain 120 83 -82.21 gain 83 121 -90.04 gain 121 83 -92.66 gain 83 122 -89.18 gain 122 83 -91.55 gain 83 123 -85.12 gain 123 83 -87.82 gain 83 124 -85.76 gain 124 83 -86.45 gain 83 125 -81.37 gain 125 83 -85.41 gain 83 126 -75.79 gain 126 83 -76.47 gain 83 127 -81.25 gain 127 83 -81.56 gain 83 128 -77.99 gain 128 83 -80.89 gain 83 129 -80.89 gain 129 83 -81.00 gain 83 130 -81.73 gain 130 83 -83.13 gain 83 131 -81.76 gain 131 83 -82.94 gain 83 132 -81.89 gain 132 83 -79.07 gain 83 133 -89.84 gain 133 83 -92.20 gain 83 134 -90.20 gain 134 83 -89.42 gain 83 135 -92.05 gain 135 83 -93.58 gain 83 136 -94.88 gain 136 83 -96.85 gain 83 137 -95.08 gain 137 83 -99.97 gain 83 138 -87.01 gain 138 83 -85.42 gain 83 139 -88.52 gain 139 83 -90.20 gain 83 140 -85.10 gain 140 83 -87.61 gain 83 141 -79.16 gain 141 83 -73.63 gain 83 142 -82.26 gain 142 83 -83.48 gain 83 143 -81.69 gain 143 83 -85.65 gain 83 144 -79.52 gain 144 83 -81.84 gain 83 145 -83.75 gain 145 83 -89.46 gain 83 146 -78.45 gain 146 83 -80.15 gain 83 147 -86.84 gain 147 83 -85.65 gain 83 148 -86.53 gain 148 83 -83.67 gain 83 149 -93.11 gain 149 83 -93.90 gain 83 150 -88.83 gain 150 83 -90.45 gain 83 151 -92.72 gain 151 83 -93.29 gain 83 152 -85.12 gain 152 83 -85.51 gain 83 153 -88.93 gain 153 83 -88.53 gain 83 154 -85.67 gain 154 83 -87.17 gain 83 155 -87.82 gain 155 83 -87.90 gain 83 156 -82.05 gain 156 83 -81.35 gain 83 157 -82.37 gain 157 83 -84.16 gain 83 158 -86.07 gain 158 83 -87.36 gain 83 159 -78.97 gain 159 83 -82.64 gain 83 160 -85.44 gain 160 83 -86.27 gain 83 161 -91.53 gain 161 83 -94.80 gain 83 162 -91.90 gain 162 83 -94.88 gain 83 163 -91.63 gain 163 83 -96.52 gain 83 164 -94.85 gain 164 83 -99.11 gain 83 165 -97.26 gain 165 83 -98.58 gain 83 166 -93.29 gain 166 83 -94.36 gain 83 167 -90.99 gain 167 83 -92.78 gain 83 168 -91.53 gain 168 83 -92.22 gain 83 169 -95.72 gain 169 83 -97.53 gain 83 170 -85.16 gain 170 83 -86.19 gain 83 171 -82.38 gain 171 83 -84.50 gain 83 172 -87.69 gain 172 83 -87.99 gain 83 173 -83.96 gain 173 83 -88.92 gain 83 174 -86.99 gain 174 83 -87.99 gain 83 175 -84.72 gain 175 83 -86.86 gain 83 176 -91.95 gain 176 83 -93.06 gain 83 177 -85.51 gain 177 83 -89.62 gain 83 178 -91.60 gain 178 83 -89.15 gain 83 179 -88.60 gain 179 83 -85.57 gain 83 180 -98.12 gain 180 83 -104.53 gain 83 181 -90.08 gain 181 83 -90.52 gain 83 182 -89.90 gain 182 83 -91.43 gain 83 183 -88.73 gain 183 83 -90.53 gain 83 184 -89.42 gain 184 83 -93.97 gain 83 185 -87.75 gain 185 83 -96.16 gain 83 186 -91.91 gain 186 83 -95.90 gain 83 187 -90.67 gain 187 83 -92.39 gain 83 188 -84.42 gain 188 83 -88.55 gain 83 189 -83.25 gain 189 83 -82.10 gain 83 190 -97.35 gain 190 83 -100.12 gain 83 191 -90.15 gain 191 83 -91.64 gain 83 192 -79.31 gain 192 83 -79.48 gain 83 193 -92.91 gain 193 83 -92.07 gain 83 194 -91.46 gain 194 83 -91.40 gain 83 195 -92.34 gain 195 83 -90.84 gain 83 196 -91.53 gain 196 83 -94.33 gain 83 197 -91.34 gain 197 83 -89.28 gain 83 198 -89.42 gain 198 83 -91.87 gain 83 199 -89.25 gain 199 83 -91.81 gain 83 200 -91.80 gain 200 83 -95.69 gain 83 201 -94.32 gain 201 83 -98.13 gain 83 202 -93.90 gain 202 83 -96.83 gain 83 203 -93.40 gain 203 83 -95.45 gain 83 204 -91.67 gain 204 83 -90.36 gain 83 205 -96.35 gain 205 83 -98.79 gain 83 206 -89.69 gain 206 83 -93.24 gain 83 207 -85.43 gain 207 83 -88.39 gain 83 208 -94.51 gain 208 83 -100.08 gain 83 209 -94.58 gain 209 83 -99.72 gain 83 210 -97.12 gain 210 83 -102.43 gain 83 211 -95.32 gain 211 83 -95.86 gain 83 212 -97.68 gain 212 83 -101.23 gain 83 213 -89.97 gain 213 83 -92.85 gain 83 214 -99.35 gain 214 83 -107.62 gain 83 215 -94.62 gain 215 83 -98.29 gain 83 216 -90.84 gain 216 83 -98.42 gain 83 217 -89.65 gain 217 83 -97.49 gain 83 218 -92.28 gain 218 83 -92.92 gain 83 219 -86.25 gain 219 83 -87.38 gain 83 220 -100.21 gain 220 83 -97.43 gain 83 221 -95.09 gain 221 83 -97.98 gain 83 222 -93.84 gain 222 83 -92.54 gain 83 223 -93.70 gain 223 83 -95.64 gain 83 224 -89.70 gain 224 83 -92.11 gain 84 85 -57.07 gain 85 84 -62.50 gain 84 86 -68.19 gain 86 84 -75.26 gain 84 87 -76.91 gain 87 84 -81.27 gain 84 88 -82.72 gain 88 84 -86.71 gain 84 89 -80.73 gain 89 84 -86.87 gain 84 90 -90.83 gain 90 84 -96.31 gain 84 91 -92.62 gain 91 84 -99.16 gain 84 92 -85.42 gain 92 84 -92.89 gain 84 93 -83.38 gain 93 84 -88.21 gain 84 94 -79.18 gain 94 84 -82.57 gain 84 95 -81.25 gain 95 84 -83.88 gain 84 96 -75.96 gain 96 84 -85.57 gain 84 97 -68.03 gain 97 84 -70.45 gain 84 98 -64.80 gain 98 84 -67.70 gain 84 99 -51.84 gain 99 84 -53.87 gain 84 100 -64.11 gain 100 84 -66.06 gain 84 101 -71.96 gain 101 84 -77.54 gain 84 102 -74.51 gain 102 84 -80.06 gain 84 103 -83.15 gain 103 84 -89.87 gain 84 104 -75.78 gain 104 84 -84.98 gain 84 105 -92.32 gain 105 84 -96.04 gain 84 106 -88.91 gain 106 84 -89.96 gain 84 107 -79.73 gain 107 84 -80.68 gain 84 108 -81.39 gain 108 84 -81.97 gain 84 109 -78.00 gain 109 84 -82.02 gain 84 110 -76.66 gain 110 84 -87.05 gain 84 111 -82.40 gain 111 84 -82.75 gain 84 112 -76.87 gain 112 84 -80.69 gain 84 113 -69.86 gain 113 84 -72.80 gain 84 114 -73.25 gain 114 84 -73.37 gain 84 115 -75.81 gain 115 84 -76.58 gain 84 116 -79.94 gain 116 84 -83.13 gain 84 117 -77.87 gain 117 84 -78.21 gain 84 118 -79.04 gain 118 84 -81.00 gain 84 119 -79.42 gain 119 84 -86.44 gain 84 120 -90.21 gain 120 84 -94.61 gain 84 121 -92.28 gain 121 84 -97.71 gain 84 122 -90.66 gain 122 84 -95.84 gain 84 123 -92.63 gain 123 84 -98.15 gain 84 124 -80.87 gain 124 84 -84.38 gain 84 125 -75.88 gain 125 84 -82.72 gain 84 126 -82.43 gain 126 84 -85.92 gain 84 127 -80.87 gain 127 84 -83.99 gain 84 128 -74.08 gain 128 84 -79.80 gain 84 129 -76.69 gain 129 84 -79.61 gain 84 130 -70.55 gain 130 84 -74.77 gain 84 131 -77.25 gain 131 84 -81.25 gain 84 132 -81.28 gain 132 84 -81.28 gain 84 133 -72.53 gain 133 84 -77.70 gain 84 134 -85.72 gain 134 84 -87.76 gain 84 135 -93.99 gain 135 84 -98.33 gain 84 136 -90.05 gain 136 84 -94.84 gain 84 137 -82.80 gain 137 84 -90.49 gain 84 138 -87.44 gain 138 84 -88.67 gain 84 139 -88.11 gain 139 84 -92.61 gain 84 140 -85.63 gain 140 84 -90.94 gain 84 141 -77.15 gain 141 84 -74.44 gain 84 142 -75.68 gain 142 84 -79.71 gain 84 143 -82.31 gain 143 84 -89.08 gain 84 144 -83.31 gain 144 84 -88.44 gain 84 145 -77.60 gain 145 84 -86.12 gain 84 146 -76.14 gain 146 84 -80.66 gain 84 147 -80.84 gain 147 84 -82.46 gain 84 148 -87.50 gain 148 84 -87.45 gain 84 149 -84.98 gain 149 84 -88.59 gain 84 150 -90.56 gain 150 84 -95.00 gain 84 151 -87.95 gain 151 84 -91.34 gain 84 152 -88.44 gain 152 84 -91.64 gain 84 153 -88.01 gain 153 84 -90.43 gain 84 154 -84.95 gain 154 84 -89.27 gain 84 155 -83.58 gain 155 84 -86.47 gain 84 156 -82.36 gain 156 84 -84.48 gain 84 157 -86.79 gain 157 84 -91.39 gain 84 158 -90.13 gain 158 84 -94.24 gain 84 159 -80.04 gain 159 84 -86.53 gain 84 160 -77.38 gain 160 84 -81.02 gain 84 161 -80.49 gain 161 84 -86.57 gain 84 162 -84.25 gain 162 84 -90.04 gain 84 163 -79.94 gain 163 84 -87.65 gain 84 164 -90.82 gain 164 84 -97.89 gain 84 165 -89.99 gain 165 84 -94.12 gain 84 166 -98.47 gain 166 84 -102.35 gain 84 167 -82.99 gain 167 84 -87.60 gain 84 168 -87.70 gain 168 84 -91.20 gain 84 169 -89.97 gain 169 84 -94.58 gain 84 170 -89.37 gain 170 84 -93.22 gain 84 171 -84.98 gain 171 84 -89.91 gain 84 172 -84.57 gain 172 84 -87.69 gain 84 173 -88.18 gain 173 84 -95.94 gain 84 174 -79.61 gain 174 84 -83.42 gain 84 175 -89.60 gain 175 84 -94.55 gain 84 176 -83.62 gain 176 84 -87.53 gain 84 177 -85.54 gain 177 84 -92.46 gain 84 178 -84.59 gain 178 84 -84.95 gain 84 179 -92.23 gain 179 84 -92.01 gain 84 180 -94.35 gain 180 84 -103.58 gain 84 181 -91.11 gain 181 84 -94.36 gain 84 182 -93.88 gain 182 84 -98.22 gain 84 183 -95.31 gain 183 84 -99.92 gain 84 184 -89.45 gain 184 84 -96.81 gain 84 185 -86.85 gain 185 84 -98.08 gain 84 186 -93.35 gain 186 84 -100.16 gain 84 187 -83.36 gain 187 84 -87.89 gain 84 188 -84.55 gain 188 84 -91.50 gain 84 189 -82.98 gain 189 84 -84.66 gain 84 190 -91.40 gain 190 84 -96.99 gain 84 191 -85.29 gain 191 84 -89.58 gain 84 192 -85.31 gain 192 84 -88.30 gain 84 193 -93.27 gain 193 84 -95.25 gain 84 194 -90.28 gain 194 84 -93.04 gain 84 195 -90.61 gain 195 84 -91.91 gain 84 196 -91.99 gain 196 84 -97.61 gain 84 197 -95.75 gain 197 84 -96.51 gain 84 198 -86.11 gain 198 84 -91.37 gain 84 199 -86.70 gain 199 84 -92.08 gain 84 200 -89.09 gain 200 84 -95.80 gain 84 201 -86.67 gain 201 84 -93.29 gain 84 202 -88.23 gain 202 84 -93.98 gain 84 203 -79.67 gain 203 84 -84.54 gain 84 204 -91.52 gain 204 84 -93.03 gain 84 205 -89.21 gain 205 84 -94.46 gain 84 206 -88.79 gain 206 84 -95.15 gain 84 207 -87.91 gain 207 84 -93.69 gain 84 208 -84.67 gain 208 84 -93.05 gain 84 209 -88.39 gain 209 84 -96.34 gain 84 210 -91.79 gain 210 84 -99.91 gain 84 211 -95.03 gain 211 84 -98.39 gain 84 212 -89.76 gain 212 84 -96.13 gain 84 213 -84.88 gain 213 84 -90.57 gain 84 214 -90.40 gain 214 84 -101.49 gain 84 215 -96.78 gain 215 84 -103.26 gain 84 216 -90.26 gain 216 84 -100.65 gain 84 217 -91.19 gain 217 84 -101.84 gain 84 218 -94.87 gain 218 84 -98.33 gain 84 219 -86.06 gain 219 84 -90.01 gain 84 220 -91.30 gain 220 84 -91.33 gain 84 221 -86.76 gain 221 84 -92.47 gain 84 222 -94.32 gain 222 84 -95.84 gain 84 223 -90.63 gain 223 84 -95.39 gain 84 224 -86.17 gain 224 84 -91.40 gain 85 86 -68.72 gain 86 85 -70.36 gain 85 87 -79.55 gain 87 85 -78.48 gain 85 88 -81.45 gain 88 85 -80.01 gain 85 89 -88.70 gain 89 85 -89.41 gain 85 90 -99.96 gain 90 85 -100.02 gain 85 91 -97.71 gain 91 85 -98.83 gain 85 92 -93.14 gain 92 85 -95.18 gain 85 93 -83.02 gain 93 85 -82.42 gain 85 94 -91.77 gain 94 85 -89.73 gain 85 95 -83.85 gain 95 85 -81.05 gain 85 96 -87.96 gain 96 85 -92.14 gain 85 97 -79.55 gain 97 85 -76.55 gain 85 98 -73.36 gain 98 85 -70.83 gain 85 99 -69.26 gain 99 85 -65.87 gain 85 100 -67.50 gain 100 85 -64.02 gain 85 101 -72.34 gain 101 85 -72.50 gain 85 102 -75.26 gain 102 85 -75.38 gain 85 103 -82.70 gain 103 85 -83.98 gain 85 104 -88.58 gain 104 85 -92.35 gain 85 105 -94.51 gain 105 85 -92.80 gain 85 106 -101.63 gain 106 85 -97.25 gain 85 107 -94.88 gain 107 85 -90.40 gain 85 108 -93.81 gain 108 85 -88.96 gain 85 109 -91.57 gain 109 85 -90.16 gain 85 110 -89.76 gain 110 85 -94.72 gain 85 111 -84.83 gain 111 85 -79.75 gain 85 112 -87.41 gain 112 85 -85.80 gain 85 113 -81.94 gain 113 85 -79.46 gain 85 114 -79.84 gain 114 85 -74.52 gain 85 115 -79.23 gain 115 85 -74.57 gain 85 116 -79.82 gain 116 85 -77.59 gain 85 117 -86.51 gain 117 85 -81.43 gain 85 118 -78.96 gain 118 85 -75.49 gain 85 119 -82.80 gain 119 85 -84.40 gain 85 120 -88.86 gain 120 85 -87.84 gain 85 121 -101.96 gain 121 85 -101.97 gain 85 122 -99.09 gain 122 85 -98.84 gain 85 123 -85.35 gain 123 85 -85.44 gain 85 124 -89.95 gain 124 85 -88.03 gain 85 125 -93.03 gain 125 85 -94.45 gain 85 126 -91.49 gain 126 85 -89.56 gain 85 127 -89.16 gain 127 85 -86.85 gain 85 128 -76.13 gain 128 85 -76.42 gain 85 129 -76.08 gain 129 85 -73.58 gain 85 130 -77.32 gain 130 85 -76.11 gain 85 131 -82.03 gain 131 85 -80.59 gain 85 132 -87.58 gain 132 85 -82.15 gain 85 133 -80.02 gain 133 85 -79.77 gain 85 134 -85.43 gain 134 85 -82.04 gain 85 135 -92.63 gain 135 85 -91.55 gain 85 136 -86.85 gain 136 85 -86.20 gain 85 137 -98.79 gain 137 85 -101.06 gain 85 138 -92.70 gain 138 85 -88.50 gain 85 139 -90.32 gain 139 85 -89.38 gain 85 140 -94.50 gain 140 85 -94.40 gain 85 141 -86.66 gain 141 85 -78.52 gain 85 142 -87.85 gain 142 85 -86.46 gain 85 143 -92.96 gain 143 85 -94.30 gain 85 144 -86.84 gain 144 85 -86.55 gain 85 145 -74.77 gain 145 85 -77.86 gain 85 146 -82.57 gain 146 85 -81.65 gain 85 147 -83.76 gain 147 85 -79.95 gain 85 148 -84.31 gain 148 85 -78.83 gain 85 149 -89.46 gain 149 85 -87.63 gain 85 150 -96.42 gain 150 85 -95.44 gain 85 151 -98.32 gain 151 85 -96.28 gain 85 152 -95.47 gain 152 85 -93.24 gain 85 153 -96.52 gain 153 85 -93.51 gain 85 154 -98.01 gain 154 85 -96.90 gain 85 155 -92.95 gain 155 85 -90.42 gain 85 156 -92.44 gain 156 85 -89.13 gain 85 157 -87.20 gain 157 85 -86.38 gain 85 158 -88.70 gain 158 85 -87.37 gain 85 159 -85.73 gain 159 85 -86.78 gain 85 160 -86.51 gain 160 85 -84.73 gain 85 161 -90.91 gain 161 85 -91.56 gain 85 162 -83.13 gain 162 85 -83.49 gain 85 163 -88.69 gain 163 85 -90.97 gain 85 164 -90.40 gain 164 85 -92.04 gain 85 165 -107.08 gain 165 85 -105.78 gain 85 166 -100.30 gain 166 85 -98.75 gain 85 167 -98.12 gain 167 85 -97.30 gain 85 168 -93.06 gain 168 85 -91.13 gain 85 169 -89.98 gain 169 85 -89.17 gain 85 170 -93.84 gain 170 85 -92.26 gain 85 171 -93.59 gain 171 85 -93.10 gain 85 172 -84.27 gain 172 85 -81.96 gain 85 173 -95.21 gain 173 85 -97.54 gain 85 174 -88.13 gain 174 85 -86.52 gain 85 175 -91.14 gain 175 85 -90.66 gain 85 176 -97.71 gain 176 85 -96.20 gain 85 177 -93.64 gain 177 85 -95.14 gain 85 178 -83.16 gain 178 85 -78.09 gain 85 179 -99.67 gain 179 85 -94.02 gain 85 180 -94.72 gain 180 85 -98.52 gain 85 181 -99.98 gain 181 85 -97.81 gain 85 182 -95.91 gain 182 85 -94.82 gain 85 183 -99.83 gain 183 85 -99.01 gain 85 184 -93.70 gain 184 85 -95.63 gain 85 185 -98.38 gain 185 85 -104.18 gain 85 186 -92.08 gain 186 85 -93.46 gain 85 187 -96.53 gain 187 85 -95.64 gain 85 188 -86.92 gain 188 85 -88.44 gain 85 189 -89.47 gain 189 85 -85.71 gain 85 190 -90.87 gain 190 85 -91.03 gain 85 191 -93.40 gain 191 85 -92.27 gain 85 192 -92.33 gain 192 85 -89.90 gain 85 193 -92.83 gain 193 85 -89.38 gain 85 194 -89.56 gain 194 85 -86.90 gain 85 195 -97.44 gain 195 85 -93.32 gain 85 196 -100.62 gain 196 85 -100.81 gain 85 197 -100.32 gain 197 85 -95.64 gain 85 198 -93.13 gain 198 85 -92.96 gain 85 199 -91.05 gain 199 85 -90.99 gain 85 200 -98.31 gain 200 85 -99.59 gain 85 201 -99.26 gain 201 85 -100.45 gain 85 202 -94.47 gain 202 85 -94.79 gain 85 203 -94.06 gain 203 85 -93.50 gain 85 204 -96.08 gain 204 85 -92.16 gain 85 205 -100.77 gain 205 85 -100.60 gain 85 206 -95.57 gain 206 85 -96.50 gain 85 207 -90.42 gain 207 85 -90.77 gain 85 208 -98.61 gain 208 85 -101.56 gain 85 209 -97.25 gain 209 85 -99.77 gain 85 210 -93.26 gain 210 85 -95.95 gain 85 211 -98.10 gain 211 85 -96.03 gain 85 212 -89.10 gain 212 85 -90.04 gain 85 213 -97.09 gain 213 85 -97.35 gain 85 214 -102.39 gain 214 85 -108.05 gain 85 215 -92.13 gain 215 85 -93.18 gain 85 216 -101.51 gain 216 85 -106.47 gain 85 217 -93.65 gain 217 85 -98.88 gain 85 218 -91.14 gain 218 85 -89.17 gain 85 219 -98.14 gain 219 85 -96.65 gain 85 220 -98.29 gain 220 85 -92.90 gain 85 221 -97.73 gain 221 85 -98.02 gain 85 222 -97.11 gain 222 85 -93.20 gain 85 223 -100.71 gain 223 85 -100.04 gain 85 224 -105.75 gain 224 85 -105.54 gain 86 87 -71.44 gain 87 86 -68.72 gain 86 88 -74.91 gain 88 86 -71.84 gain 86 89 -79.05 gain 89 86 -78.13 gain 86 90 -99.69 gain 90 86 -98.11 gain 86 91 -102.86 gain 91 86 -102.34 gain 86 92 -93.79 gain 92 86 -94.19 gain 86 93 -100.92 gain 93 86 -98.68 gain 86 94 -98.17 gain 94 86 -94.50 gain 86 95 -92.81 gain 95 86 -88.38 gain 86 96 -87.83 gain 96 86 -90.36 gain 86 97 -88.19 gain 97 86 -83.55 gain 86 98 -81.75 gain 98 86 -77.58 gain 86 99 -79.05 gain 99 86 -74.01 gain 86 100 -69.13 gain 100 86 -64.01 gain 86 101 -72.18 gain 101 86 -70.69 gain 86 102 -72.96 gain 102 86 -71.44 gain 86 103 -82.82 gain 103 86 -82.47 gain 86 104 -84.05 gain 104 86 -86.19 gain 86 105 -97.48 gain 105 86 -94.13 gain 86 106 -98.32 gain 106 86 -92.30 gain 86 107 -98.34 gain 107 86 -92.23 gain 86 108 -107.82 gain 108 86 -101.32 gain 86 109 -90.26 gain 109 86 -87.22 gain 86 110 -103.32 gain 110 86 -106.64 gain 86 111 -95.36 gain 111 86 -88.65 gain 86 112 -90.52 gain 112 86 -87.27 gain 86 113 -86.35 gain 113 86 -82.22 gain 86 114 -73.65 gain 114 86 -66.70 gain 86 115 -79.01 gain 115 86 -72.71 gain 86 116 -74.70 gain 116 86 -70.83 gain 86 117 -72.32 gain 117 86 -65.60 gain 86 118 -81.82 gain 118 86 -76.71 gain 86 119 -89.58 gain 119 86 -89.54 gain 86 120 -104.30 gain 120 86 -101.64 gain 86 121 -101.21 gain 121 86 -99.58 gain 86 122 -91.76 gain 122 86 -89.87 gain 86 123 -100.33 gain 123 86 -98.78 gain 86 124 -99.86 gain 124 86 -96.30 gain 86 125 -91.50 gain 125 86 -91.28 gain 86 126 -92.81 gain 126 86 -89.24 gain 86 127 -92.45 gain 127 86 -88.50 gain 86 128 -88.55 gain 128 86 -87.20 gain 86 129 -72.66 gain 129 86 -68.52 gain 86 130 -85.37 gain 130 86 -82.52 gain 86 131 -82.25 gain 131 86 -79.18 gain 86 132 -82.88 gain 132 86 -75.82 gain 86 133 -90.33 gain 133 86 -88.44 gain 86 134 -86.46 gain 134 86 -81.43 gain 86 135 -101.08 gain 135 86 -98.36 gain 86 136 -103.52 gain 136 86 -101.24 gain 86 137 -96.94 gain 137 86 -97.57 gain 86 138 -89.13 gain 138 86 -83.29 gain 86 139 -92.36 gain 139 86 -89.78 gain 86 140 -83.13 gain 140 86 -81.39 gain 86 141 -88.80 gain 141 86 -79.02 gain 86 142 -93.29 gain 142 86 -90.26 gain 86 143 -87.58 gain 143 86 -87.28 gain 86 144 -86.80 gain 144 86 -84.87 gain 86 145 -78.57 gain 145 86 -80.03 gain 86 146 -90.78 gain 146 86 -88.23 gain 86 147 -80.62 gain 147 86 -75.17 gain 86 148 -76.76 gain 148 86 -69.64 gain 86 149 -90.67 gain 149 86 -87.21 gain 86 150 -98.44 gain 150 86 -95.81 gain 86 151 -101.74 gain 151 86 -98.06 gain 86 152 -99.55 gain 152 86 -95.69 gain 86 153 -91.76 gain 153 86 -87.11 gain 86 154 -97.85 gain 154 86 -95.10 gain 86 155 -90.85 gain 155 86 -86.68 gain 86 156 -96.09 gain 156 86 -91.14 gain 86 157 -90.78 gain 157 86 -88.32 gain 86 158 -95.56 gain 158 86 -92.60 gain 86 159 -81.14 gain 159 86 -80.56 gain 86 160 -82.07 gain 160 86 -78.65 gain 86 161 -87.24 gain 161 86 -86.25 gain 86 162 -92.04 gain 162 86 -90.77 gain 86 163 -85.62 gain 163 86 -86.25 gain 86 164 -88.13 gain 164 86 -88.13 gain 86 165 -101.98 gain 165 86 -99.04 gain 86 166 -104.63 gain 166 86 -101.45 gain 86 167 -94.64 gain 167 86 -92.18 gain 86 168 -96.96 gain 168 86 -93.39 gain 86 169 -99.68 gain 169 86 -97.22 gain 86 170 -93.41 gain 170 86 -90.19 gain 86 171 -96.73 gain 171 86 -94.59 gain 86 172 -95.90 gain 172 86 -91.95 gain 86 173 -90.45 gain 173 86 -91.15 gain 86 174 -104.05 gain 174 86 -100.80 gain 86 175 -89.87 gain 175 86 -87.75 gain 86 176 -92.39 gain 176 86 -89.24 gain 86 177 -87.36 gain 177 86 -87.21 gain 86 178 -93.85 gain 178 86 -87.14 gain 86 179 -87.26 gain 179 86 -79.97 gain 86 180 -106.10 gain 180 86 -108.26 gain 86 181 -102.85 gain 181 86 -99.04 gain 86 182 -107.59 gain 182 86 -104.86 gain 86 183 -102.72 gain 183 86 -100.27 gain 86 184 -90.71 gain 184 86 -91.00 gain 86 185 -99.65 gain 185 86 -103.81 gain 86 186 -98.41 gain 186 86 -98.15 gain 86 187 -94.82 gain 187 86 -92.29 gain 86 188 -94.04 gain 188 86 -93.93 gain 86 189 -95.71 gain 189 86 -90.32 gain 86 190 -96.40 gain 190 86 -94.92 gain 86 191 -95.92 gain 191 86 -93.15 gain 86 192 -102.27 gain 192 86 -98.19 gain 86 193 -84.94 gain 193 86 -79.85 gain 86 194 -93.44 gain 194 86 -89.14 gain 86 195 -108.00 gain 195 86 -102.24 gain 86 196 -92.45 gain 196 86 -91.00 gain 86 197 -97.86 gain 197 86 -91.55 gain 86 198 -101.58 gain 198 86 -99.78 gain 86 199 -100.01 gain 199 86 -98.32 gain 86 200 -95.72 gain 200 86 -95.36 gain 86 201 -101.97 gain 201 86 -101.52 gain 86 202 -99.59 gain 202 86 -98.28 gain 86 203 -89.96 gain 203 86 -87.76 gain 86 204 -92.48 gain 204 86 -86.92 gain 86 205 -93.27 gain 205 86 -91.46 gain 86 206 -90.35 gain 206 86 -89.64 gain 86 207 -101.49 gain 207 86 -100.20 gain 86 208 -99.43 gain 208 86 -100.74 gain 86 209 -95.26 gain 209 86 -96.15 gain 86 210 -106.87 gain 210 86 -107.93 gain 86 211 -108.18 gain 211 86 -104.47 gain 86 212 -93.86 gain 212 86 -93.16 gain 86 213 -98.26 gain 213 86 -96.89 gain 86 214 -94.14 gain 214 86 -98.16 gain 86 215 -94.75 gain 215 86 -94.17 gain 86 216 -95.26 gain 216 86 -98.59 gain 86 217 -92.51 gain 217 86 -96.10 gain 86 218 -99.67 gain 218 86 -96.07 gain 86 219 -93.20 gain 219 86 -90.07 gain 86 220 -94.69 gain 220 86 -87.66 gain 86 221 -96.65 gain 221 86 -95.29 gain 86 222 -94.75 gain 222 86 -89.20 gain 86 223 -91.34 gain 223 86 -89.03 gain 86 224 -95.19 gain 224 86 -93.35 gain 87 88 -59.37 gain 88 87 -59.01 gain 87 89 -74.35 gain 89 87 -76.13 gain 87 90 -97.13 gain 90 87 -98.25 gain 87 91 -106.73 gain 91 87 -108.92 gain 87 92 -95.10 gain 92 87 -98.21 gain 87 93 -93.36 gain 93 87 -93.83 gain 87 94 -94.75 gain 94 87 -93.79 gain 87 95 -90.75 gain 95 87 -89.03 gain 87 96 -88.79 gain 96 87 -94.04 gain 87 97 -88.05 gain 97 87 -86.12 gain 87 98 -79.94 gain 98 87 -78.48 gain 87 99 -83.24 gain 99 87 -80.92 gain 87 100 -76.06 gain 100 87 -73.65 gain 87 101 -69.22 gain 101 87 -70.44 gain 87 102 -67.37 gain 102 87 -68.56 gain 87 103 -74.02 gain 103 87 -76.38 gain 87 104 -76.55 gain 104 87 -81.39 gain 87 105 -99.86 gain 105 87 -99.23 gain 87 106 -92.48 gain 106 87 -89.17 gain 87 107 -94.20 gain 107 87 -90.80 gain 87 108 -97.72 gain 108 87 -93.94 gain 87 109 -95.03 gain 109 87 -94.70 gain 87 110 -91.07 gain 110 87 -97.10 gain 87 111 -94.53 gain 111 87 -90.53 gain 87 112 -75.68 gain 112 87 -75.14 gain 87 113 -81.17 gain 113 87 -79.76 gain 87 114 -76.96 gain 114 87 -72.72 gain 87 115 -79.38 gain 115 87 -75.79 gain 87 116 -69.53 gain 116 87 -68.37 gain 87 117 -81.98 gain 117 87 -77.97 gain 87 118 -72.91 gain 118 87 -70.52 gain 87 119 -71.76 gain 119 87 -74.43 gain 87 120 -97.25 gain 120 87 -97.30 gain 87 121 -99.18 gain 121 87 -100.26 gain 87 122 -99.45 gain 122 87 -100.28 gain 87 123 -92.13 gain 123 87 -93.30 gain 87 124 -86.00 gain 124 87 -85.15 gain 87 125 -85.59 gain 125 87 -88.08 gain 87 126 -88.17 gain 126 87 -87.31 gain 87 127 -90.93 gain 127 87 -89.69 gain 87 128 -87.09 gain 128 87 -88.45 gain 87 129 -87.15 gain 129 87 -85.72 gain 87 130 -80.82 gain 130 87 -80.68 gain 87 131 -76.98 gain 131 87 -76.62 gain 87 132 -79.10 gain 132 87 -74.74 gain 87 133 -78.31 gain 133 87 -79.13 gain 87 134 -87.76 gain 134 87 -85.44 gain 87 135 -96.48 gain 135 87 -96.46 gain 87 136 -98.54 gain 136 87 -98.97 gain 87 137 -96.11 gain 137 87 -99.45 gain 87 138 -89.68 gain 138 87 -86.55 gain 87 139 -89.46 gain 139 87 -89.59 gain 87 140 -92.25 gain 140 87 -93.22 gain 87 141 -93.67 gain 141 87 -86.60 gain 87 142 -88.67 gain 142 87 -88.35 gain 87 143 -89.68 gain 143 87 -92.09 gain 87 144 -83.97 gain 144 87 -84.75 gain 87 145 -79.88 gain 145 87 -84.05 gain 87 146 -80.70 gain 146 87 -80.86 gain 87 147 -82.06 gain 147 87 -79.33 gain 87 148 -80.16 gain 148 87 -75.76 gain 87 149 -93.93 gain 149 87 -93.18 gain 87 150 -96.38 gain 150 87 -96.47 gain 87 151 -98.36 gain 151 87 -97.38 gain 87 152 -101.99 gain 152 87 -100.83 gain 87 153 -91.63 gain 153 87 -89.69 gain 87 154 -92.21 gain 154 87 -92.17 gain 87 155 -92.16 gain 155 87 -90.70 gain 87 156 -99.17 gain 156 87 -96.93 gain 87 157 -87.48 gain 157 87 -87.73 gain 87 158 -92.80 gain 158 87 -92.55 gain 87 159 -87.79 gain 159 87 -89.92 gain 87 160 -74.44 gain 160 87 -73.72 gain 87 161 -90.95 gain 161 87 -92.67 gain 87 162 -81.60 gain 162 87 -83.04 gain 87 163 -82.18 gain 163 87 -85.53 gain 87 164 -86.54 gain 164 87 -89.25 gain 87 165 -100.49 gain 165 87 -100.27 gain 87 166 -98.20 gain 166 87 -97.73 gain 87 167 -99.76 gain 167 87 -100.01 gain 87 168 -97.17 gain 168 87 -96.32 gain 87 169 -98.95 gain 169 87 -99.21 gain 87 170 -93.90 gain 170 87 -93.40 gain 87 171 -94.96 gain 171 87 -95.53 gain 87 172 -88.86 gain 172 87 -87.62 gain 87 173 -90.54 gain 173 87 -93.95 gain 87 174 -85.86 gain 174 87 -85.31 gain 87 175 -87.89 gain 175 87 -88.48 gain 87 176 -90.47 gain 176 87 -90.04 gain 87 177 -85.91 gain 177 87 -88.48 gain 87 178 -93.53 gain 178 87 -89.54 gain 87 179 -95.01 gain 179 87 -90.44 gain 87 180 -101.69 gain 180 87 -106.57 gain 87 181 -99.50 gain 181 87 -98.40 gain 87 182 -107.29 gain 182 87 -107.28 gain 87 183 -100.87 gain 183 87 -101.13 gain 87 184 -94.22 gain 184 87 -97.23 gain 87 185 -104.22 gain 185 87 -111.09 gain 87 186 -97.77 gain 186 87 -100.22 gain 87 187 -93.66 gain 187 87 -93.84 gain 87 188 -89.43 gain 188 87 -92.02 gain 87 189 -89.60 gain 189 87 -86.92 gain 87 190 -89.70 gain 190 87 -90.94 gain 87 191 -87.45 gain 191 87 -87.39 gain 87 192 -91.33 gain 192 87 -89.97 gain 87 193 -89.29 gain 193 87 -86.91 gain 87 194 -93.22 gain 194 87 -91.62 gain 87 195 -98.42 gain 195 87 -95.37 gain 87 196 -105.30 gain 196 87 -106.56 gain 87 197 -96.85 gain 197 87 -93.25 gain 87 198 -97.77 gain 198 87 -98.69 gain 87 199 -96.97 gain 199 87 -97.99 gain 87 200 -95.89 gain 200 87 -98.24 gain 87 201 -85.12 gain 201 87 -87.38 gain 87 202 -94.82 gain 202 87 -96.22 gain 87 203 -96.20 gain 203 87 -96.71 gain 87 204 -94.77 gain 204 87 -91.93 gain 87 205 -85.67 gain 205 87 -86.57 gain 87 206 -88.35 gain 206 87 -90.35 gain 87 207 -88.28 gain 207 87 -89.70 gain 87 208 -90.88 gain 208 87 -94.90 gain 87 209 -98.05 gain 209 87 -101.64 gain 87 210 -103.05 gain 210 87 -106.82 gain 87 211 -94.71 gain 211 87 -93.71 gain 87 212 -96.53 gain 212 87 -98.54 gain 87 213 -95.96 gain 213 87 -97.30 gain 87 214 -99.45 gain 214 87 -106.18 gain 87 215 -103.45 gain 215 87 -105.58 gain 87 216 -99.85 gain 216 87 -105.89 gain 87 217 -98.90 gain 217 87 -105.20 gain 87 218 -96.57 gain 218 87 -95.68 gain 87 219 -91.74 gain 219 87 -91.33 gain 87 220 -95.34 gain 220 87 -91.02 gain 87 221 -89.99 gain 221 87 -91.35 gain 87 222 -96.84 gain 222 87 -94.01 gain 87 223 -87.14 gain 223 87 -87.54 gain 87 224 -91.58 gain 224 87 -92.45 gain 88 89 -69.16 gain 89 88 -71.30 gain 88 90 -103.27 gain 90 88 -104.75 gain 88 91 -99.42 gain 91 88 -101.97 gain 88 92 -104.93 gain 92 88 -108.41 gain 88 93 -99.05 gain 93 88 -99.88 gain 88 94 -89.42 gain 94 88 -88.81 gain 88 95 -90.01 gain 95 88 -88.65 gain 88 96 -95.72 gain 96 88 -101.33 gain 88 97 -94.23 gain 97 88 -92.66 gain 88 98 -82.11 gain 98 88 -81.02 gain 88 99 -86.24 gain 99 88 -84.27 gain 88 100 -84.08 gain 100 88 -82.03 gain 88 101 -73.46 gain 101 88 -75.05 gain 88 102 -69.99 gain 102 88 -71.54 gain 88 103 -62.55 gain 103 88 -65.27 gain 88 104 -68.44 gain 104 88 -73.64 gain 88 105 -90.66 gain 105 88 -90.38 gain 88 106 -97.58 gain 106 88 -94.63 gain 88 107 -93.57 gain 107 88 -90.53 gain 88 108 -97.44 gain 108 88 -94.02 gain 88 109 -89.19 gain 109 88 -89.22 gain 88 110 -95.36 gain 110 88 -101.75 gain 88 111 -85.24 gain 111 88 -81.59 gain 88 112 -84.93 gain 112 88 -84.76 gain 88 113 -88.13 gain 113 88 -87.08 gain 88 114 -80.19 gain 114 88 -76.30 gain 88 115 -79.31 gain 115 88 -76.08 gain 88 116 -77.04 gain 116 88 -76.24 gain 88 117 -74.89 gain 117 88 -71.23 gain 88 118 -71.85 gain 118 88 -69.81 gain 88 119 -75.69 gain 119 88 -78.72 gain 88 120 -95.28 gain 120 88 -95.69 gain 88 121 -104.37 gain 121 88 -105.80 gain 88 122 -99.32 gain 122 88 -100.50 gain 88 123 -102.70 gain 123 88 -104.23 gain 88 124 -93.65 gain 124 88 -93.17 gain 88 125 -88.06 gain 125 88 -90.91 gain 88 126 -93.95 gain 126 88 -93.45 gain 88 127 -94.09 gain 127 88 -93.21 gain 88 128 -84.02 gain 128 88 -85.74 gain 88 129 -81.36 gain 129 88 -80.29 gain 88 130 -82.54 gain 130 88 -82.77 gain 88 131 -86.28 gain 131 88 -86.28 gain 88 132 -79.92 gain 132 88 -75.92 gain 88 133 -74.05 gain 133 88 -75.23 gain 88 134 -80.92 gain 134 88 -78.96 gain 88 135 -99.31 gain 135 88 -99.65 gain 88 136 -95.41 gain 136 88 -96.20 gain 88 137 -93.21 gain 137 88 -96.91 gain 88 138 -95.34 gain 138 88 -92.57 gain 88 139 -94.40 gain 139 88 -94.89 gain 88 140 -99.81 gain 140 88 -101.14 gain 88 141 -93.03 gain 141 88 -86.33 gain 88 142 -88.89 gain 142 88 -88.93 gain 88 143 -91.66 gain 143 88 -94.44 gain 88 144 -87.91 gain 144 88 -89.05 gain 88 145 -91.79 gain 145 88 -96.32 gain 88 146 -90.27 gain 146 88 -90.79 gain 88 147 -78.06 gain 147 88 -75.69 gain 88 148 -90.83 gain 148 88 -86.78 gain 88 149 -82.06 gain 149 88 -81.67 gain 88 150 -96.07 gain 150 88 -96.52 gain 88 151 -95.06 gain 151 88 -94.45 gain 88 152 -98.50 gain 152 88 -97.71 gain 88 153 -87.41 gain 153 88 -85.83 gain 88 154 -89.69 gain 154 88 -90.01 gain 88 155 -94.67 gain 155 88 -93.56 gain 88 156 -92.61 gain 156 88 -90.73 gain 88 157 -90.28 gain 157 88 -90.88 gain 88 158 -85.15 gain 158 88 -85.26 gain 88 159 -88.16 gain 159 88 -90.65 gain 88 160 -84.09 gain 160 88 -83.74 gain 88 161 -78.27 gain 161 88 -80.35 gain 88 162 -82.64 gain 162 88 -84.43 gain 88 163 -94.13 gain 163 88 -97.83 gain 88 164 -84.25 gain 164 88 -87.33 gain 88 165 -101.04 gain 165 88 -101.18 gain 88 166 -99.93 gain 166 88 -99.82 gain 88 167 -100.69 gain 167 88 -101.30 gain 88 168 -101.21 gain 168 88 -100.71 gain 88 169 -95.71 gain 169 88 -96.33 gain 88 170 -88.00 gain 170 88 -87.85 gain 88 171 -99.48 gain 171 88 -100.41 gain 88 172 -93.80 gain 172 88 -92.92 gain 88 173 -98.72 gain 173 88 -102.49 gain 88 174 -84.88 gain 174 88 -84.70 gain 88 175 -88.77 gain 175 88 -89.72 gain 88 176 -89.92 gain 176 88 -89.84 gain 88 177 -94.78 gain 177 88 -97.70 gain 88 178 -96.88 gain 178 88 -93.25 gain 88 179 -90.54 gain 179 88 -86.33 gain 88 180 -100.89 gain 180 88 -106.12 gain 88 181 -97.24 gain 181 88 -96.50 gain 88 182 -97.43 gain 182 88 -97.77 gain 88 183 -94.36 gain 183 88 -94.97 gain 88 184 -91.62 gain 184 88 -94.98 gain 88 185 -95.72 gain 185 88 -102.95 gain 88 186 -93.87 gain 186 88 -96.68 gain 88 187 -97.17 gain 187 88 -97.71 gain 88 188 -100.58 gain 188 88 -103.54 gain 88 189 -93.44 gain 189 88 -91.11 gain 88 190 -92.10 gain 190 88 -93.69 gain 88 191 -89.27 gain 191 88 -89.57 gain 88 192 -86.88 gain 192 88 -85.88 gain 88 193 -84.60 gain 193 88 -82.58 gain 88 194 -90.69 gain 194 88 -89.45 gain 88 195 -94.20 gain 195 88 -91.51 gain 88 196 -92.73 gain 196 88 -94.35 gain 88 197 -92.81 gain 197 88 -89.57 gain 88 198 -95.87 gain 198 88 -97.14 gain 88 199 -97.63 gain 199 88 -99.01 gain 88 200 -96.29 gain 200 88 -99.01 gain 88 201 -97.28 gain 201 88 -99.91 gain 88 202 -96.31 gain 202 88 -98.07 gain 88 203 -97.84 gain 203 88 -98.71 gain 88 204 -92.05 gain 204 88 -89.56 gain 88 205 -88.32 gain 205 88 -89.57 gain 88 206 -93.90 gain 206 88 -96.26 gain 88 207 -91.19 gain 207 88 -92.97 gain 88 208 -92.87 gain 208 88 -97.25 gain 88 209 -87.44 gain 209 88 -91.39 gain 88 210 -102.61 gain 210 88 -106.74 gain 88 211 -102.15 gain 211 88 -101.51 gain 88 212 -101.69 gain 212 88 -104.06 gain 88 213 -94.99 gain 213 88 -96.69 gain 88 214 -99.45 gain 214 88 -106.54 gain 88 215 -93.72 gain 215 88 -96.20 gain 88 216 -93.84 gain 216 88 -100.24 gain 88 217 -98.28 gain 217 88 -104.94 gain 88 218 -101.32 gain 218 88 -100.78 gain 88 219 -96.76 gain 219 88 -96.71 gain 88 220 -97.39 gain 220 88 -93.43 gain 88 221 -93.31 gain 221 88 -95.02 gain 88 222 -92.21 gain 222 88 -89.74 gain 88 223 -84.10 gain 223 88 -84.86 gain 88 224 -91.39 gain 224 88 -92.62 gain 89 90 -93.85 gain 90 89 -93.19 gain 89 91 -93.49 gain 91 89 -93.89 gain 89 92 -101.95 gain 92 89 -103.27 gain 89 93 -98.26 gain 93 89 -96.95 gain 89 94 -93.97 gain 94 89 -91.22 gain 89 95 -89.33 gain 95 89 -85.82 gain 89 96 -92.43 gain 96 89 -95.90 gain 89 97 -94.54 gain 97 89 -90.83 gain 89 98 -89.70 gain 98 89 -86.45 gain 89 99 -90.30 gain 99 89 -86.20 gain 89 100 -86.60 gain 100 89 -82.41 gain 89 101 -84.04 gain 101 89 -83.48 gain 89 102 -77.48 gain 102 89 -76.89 gain 89 103 -73.34 gain 103 89 -73.92 gain 89 104 -63.52 gain 104 89 -66.58 gain 89 105 -107.12 gain 105 89 -104.70 gain 89 106 -100.64 gain 106 89 -95.55 gain 89 107 -96.45 gain 107 89 -91.26 gain 89 108 -103.40 gain 108 89 -97.83 gain 89 109 -102.56 gain 109 89 -100.44 gain 89 110 -91.69 gain 110 89 -95.93 gain 89 111 -99.65 gain 111 89 -93.86 gain 89 112 -93.30 gain 112 89 -90.97 gain 89 113 -90.35 gain 113 89 -87.16 gain 89 114 -83.53 gain 114 89 -77.50 gain 89 115 -91.32 gain 115 89 -85.95 gain 89 116 -82.53 gain 116 89 -79.59 gain 89 117 -83.60 gain 117 89 -77.80 gain 89 118 -76.06 gain 118 89 -71.88 gain 89 119 -86.19 gain 119 89 -87.07 gain 89 120 -103.93 gain 120 89 -102.20 gain 89 121 -102.84 gain 121 89 -102.13 gain 89 122 -99.39 gain 122 89 -98.43 gain 89 123 -100.93 gain 123 89 -100.31 gain 89 124 -101.98 gain 124 89 -99.35 gain 89 125 -100.60 gain 125 89 -101.31 gain 89 126 -98.82 gain 126 89 -96.18 gain 89 127 -95.34 gain 127 89 -92.32 gain 89 128 -88.07 gain 128 89 -87.65 gain 89 129 -91.30 gain 129 89 -88.09 gain 89 130 -91.95 gain 130 89 -90.03 gain 89 131 -89.69 gain 131 89 -87.55 gain 89 132 -83.12 gain 132 89 -76.98 gain 89 133 -81.15 gain 133 89 -80.19 gain 89 134 -84.13 gain 134 89 -80.03 gain 89 135 -104.54 gain 135 89 -102.74 gain 89 136 -96.72 gain 136 89 -95.36 gain 89 137 -98.74 gain 137 89 -100.30 gain 89 138 -97.92 gain 138 89 -93.00 gain 89 139 -96.53 gain 139 89 -94.88 gain 89 140 -94.77 gain 140 89 -93.94 gain 89 141 -95.01 gain 141 89 -86.16 gain 89 142 -95.11 gain 142 89 -93.01 gain 89 143 -88.41 gain 143 89 -89.04 gain 89 144 -93.31 gain 144 89 -92.30 gain 89 145 -85.19 gain 145 89 -87.57 gain 89 146 -90.17 gain 146 89 -88.55 gain 89 147 -91.62 gain 147 89 -87.10 gain 89 148 -83.48 gain 148 89 -77.29 gain 89 149 -75.52 gain 149 89 -72.98 gain 89 150 -102.86 gain 150 89 -101.16 gain 89 151 -99.98 gain 151 89 -97.22 gain 89 152 -92.64 gain 152 89 -89.70 gain 89 153 -98.72 gain 153 89 -95.00 gain 89 154 -98.04 gain 154 89 -96.21 gain 89 155 -100.03 gain 155 89 -96.78 gain 89 156 -96.85 gain 156 89 -92.83 gain 89 157 -97.18 gain 157 89 -95.65 gain 89 158 -94.63 gain 158 89 -92.59 gain 89 159 -90.96 gain 159 89 -91.30 gain 89 160 -94.97 gain 160 89 -92.47 gain 89 161 -85.48 gain 161 89 -85.42 gain 89 162 -95.97 gain 162 89 -95.62 gain 89 163 -90.22 gain 163 89 -91.78 gain 89 164 -77.30 gain 164 89 -78.23 gain 89 165 -108.43 gain 165 89 -106.42 gain 89 166 -98.80 gain 166 89 -96.55 gain 89 167 -100.11 gain 167 89 -98.57 gain 89 168 -107.67 gain 168 89 -105.03 gain 89 169 -97.71 gain 169 89 -96.19 gain 89 170 -97.67 gain 170 89 -95.38 gain 89 171 -91.70 gain 171 89 -90.49 gain 89 172 -93.76 gain 172 89 -90.73 gain 89 173 -92.14 gain 173 89 -93.76 gain 89 174 -96.97 gain 174 89 -94.64 gain 89 175 -94.73 gain 175 89 -93.54 gain 89 176 -88.72 gain 176 89 -86.49 gain 89 177 -89.00 gain 177 89 -89.78 gain 89 178 -90.22 gain 178 89 -84.44 gain 89 179 -84.94 gain 179 89 -78.58 gain 89 180 -102.56 gain 180 89 -105.65 gain 89 181 -103.39 gain 181 89 -100.50 gain 89 182 -96.49 gain 182 89 -94.68 gain 89 183 -100.54 gain 183 89 -99.01 gain 89 184 -97.75 gain 184 89 -98.97 gain 89 185 -99.11 gain 185 89 -104.19 gain 89 186 -100.78 gain 186 89 -101.44 gain 89 187 -97.92 gain 187 89 -96.32 gain 89 188 -93.97 gain 188 89 -94.78 gain 89 189 -95.51 gain 189 89 -91.05 gain 89 190 -99.40 gain 190 89 -98.85 gain 89 191 -91.19 gain 191 89 -89.35 gain 89 192 -96.18 gain 192 89 -93.03 gain 89 193 -94.92 gain 193 89 -90.76 gain 89 194 -95.24 gain 194 89 -91.86 gain 89 195 -105.74 gain 195 89 -100.90 gain 89 196 -99.76 gain 196 89 -99.24 gain 89 197 -107.03 gain 197 89 -101.64 gain 89 198 -99.00 gain 198 89 -98.13 gain 89 199 -102.91 gain 199 89 -102.14 gain 89 200 -100.74 gain 200 89 -101.31 gain 89 201 -98.36 gain 201 89 -98.84 gain 89 202 -97.55 gain 202 89 -97.16 gain 89 203 -105.73 gain 203 89 -104.46 gain 89 204 -97.64 gain 204 89 -93.01 gain 89 205 -104.16 gain 205 89 -103.27 gain 89 206 -92.50 gain 206 89 -92.72 gain 89 207 -90.24 gain 207 89 -89.88 gain 89 208 -93.51 gain 208 89 -95.75 gain 89 209 -86.79 gain 209 89 -88.60 gain 89 210 -100.12 gain 210 89 -102.11 gain 89 211 -106.03 gain 211 89 -103.25 gain 89 212 -100.75 gain 212 89 -100.98 gain 89 213 -102.61 gain 213 89 -102.16 gain 89 214 -102.26 gain 214 89 -107.20 gain 89 215 -99.68 gain 215 89 -100.03 gain 89 216 -98.61 gain 216 89 -102.86 gain 89 217 -94.86 gain 217 89 -99.37 gain 89 218 -96.31 gain 218 89 -93.63 gain 89 219 -99.58 gain 219 89 -97.38 gain 89 220 -94.31 gain 220 89 -88.20 gain 89 221 -91.35 gain 221 89 -90.92 gain 89 222 -106.88 gain 222 89 -102.26 gain 89 223 -99.44 gain 223 89 -98.06 gain 89 224 -92.64 gain 224 89 -91.73 gain 90 91 -67.57 gain 91 90 -68.64 gain 90 92 -78.43 gain 92 90 -80.42 gain 90 93 -74.71 gain 93 90 -74.05 gain 90 94 -86.15 gain 94 90 -84.06 gain 90 95 -90.54 gain 95 90 -87.70 gain 90 96 -94.69 gain 96 90 -98.82 gain 90 97 -93.86 gain 97 90 -90.80 gain 90 98 -93.90 gain 98 90 -91.32 gain 90 99 -88.05 gain 99 90 -84.61 gain 90 100 -100.16 gain 100 90 -96.63 gain 90 101 -96.68 gain 101 90 -96.78 gain 90 102 -95.17 gain 102 90 -95.24 gain 90 103 -101.67 gain 103 90 -102.90 gain 90 104 -91.70 gain 104 90 -95.41 gain 90 105 -66.83 gain 105 90 -65.07 gain 90 106 -68.75 gain 106 90 -64.32 gain 90 107 -80.44 gain 107 90 -75.92 gain 90 108 -73.07 gain 108 90 -68.16 gain 90 109 -85.48 gain 109 90 -84.02 gain 90 110 -83.19 gain 110 90 -88.10 gain 90 111 -78.60 gain 111 90 -73.48 gain 90 112 -90.68 gain 112 90 -89.02 gain 90 113 -91.92 gain 113 90 -89.38 gain 90 114 -97.74 gain 114 90 -92.37 gain 90 115 -93.71 gain 115 90 -89.00 gain 90 116 -102.68 gain 116 90 -100.40 gain 90 117 -101.41 gain 117 90 -96.27 gain 90 118 -98.39 gain 118 90 -94.87 gain 90 119 -99.52 gain 119 90 -101.06 gain 90 120 -71.51 gain 120 90 -70.44 gain 90 121 -75.32 gain 121 90 -75.27 gain 90 122 -80.20 gain 122 90 -79.90 gain 90 123 -76.77 gain 123 90 -76.81 gain 90 124 -83.21 gain 124 90 -81.24 gain 90 125 -90.12 gain 125 90 -91.49 gain 90 126 -80.07 gain 126 90 -78.08 gain 90 127 -86.59 gain 127 90 -84.23 gain 90 128 -95.66 gain 128 90 -95.90 gain 90 129 -85.28 gain 129 90 -82.72 gain 90 130 -95.99 gain 130 90 -94.73 gain 90 131 -97.21 gain 131 90 -95.72 gain 90 132 -88.96 gain 132 90 -83.48 gain 90 133 -102.13 gain 133 90 -101.82 gain 90 134 -105.24 gain 134 90 -101.79 gain 90 135 -81.14 gain 135 90 -80.00 gain 90 136 -75.71 gain 136 90 -75.01 gain 90 137 -81.37 gain 137 90 -83.59 gain 90 138 -78.05 gain 138 90 -73.79 gain 90 139 -84.23 gain 139 90 -83.24 gain 90 140 -87.24 gain 140 90 -87.07 gain 90 141 -88.83 gain 141 90 -80.64 gain 90 142 -96.67 gain 142 90 -95.22 gain 90 143 -97.05 gain 143 90 -98.34 gain 90 144 -97.32 gain 144 90 -96.97 gain 90 145 -93.77 gain 145 90 -96.81 gain 90 146 -96.72 gain 146 90 -95.75 gain 90 147 -97.06 gain 147 90 -93.20 gain 90 148 -96.68 gain 148 90 -91.15 gain 90 149 -97.64 gain 149 90 -95.76 gain 90 150 -84.73 gain 150 90 -83.70 gain 90 151 -83.88 gain 151 90 -81.79 gain 90 152 -90.38 gain 152 90 -88.10 gain 90 153 -85.51 gain 153 90 -82.45 gain 90 154 -83.18 gain 154 90 -82.02 gain 90 155 -87.74 gain 155 90 -85.15 gain 90 156 -98.81 gain 156 90 -95.46 gain 90 157 -95.29 gain 157 90 -94.42 gain 90 158 -94.78 gain 158 90 -93.40 gain 90 159 -103.32 gain 159 90 -104.32 gain 90 160 -92.71 gain 160 90 -90.87 gain 90 161 -100.26 gain 161 90 -100.86 gain 90 162 -98.71 gain 162 90 -99.02 gain 90 163 -97.93 gain 163 90 -100.15 gain 90 164 -96.73 gain 164 90 -98.32 gain 90 165 -92.48 gain 165 90 -91.13 gain 90 166 -89.45 gain 166 90 -87.86 gain 90 167 -86.17 gain 167 90 -85.30 gain 90 168 -90.18 gain 168 90 -88.20 gain 90 169 -85.89 gain 169 90 -85.02 gain 90 170 -90.29 gain 170 90 -88.65 gain 90 171 -93.52 gain 171 90 -92.97 gain 90 172 -94.16 gain 172 90 -91.79 gain 90 173 -90.71 gain 173 90 -92.99 gain 90 174 -91.33 gain 174 90 -89.66 gain 90 175 -104.74 gain 175 90 -104.21 gain 90 176 -99.68 gain 176 90 -98.11 gain 90 177 -101.75 gain 177 90 -103.19 gain 90 178 -104.30 gain 178 90 -99.18 gain 90 179 -104.66 gain 179 90 -98.97 gain 90 180 -98.06 gain 180 90 -101.81 gain 90 181 -90.41 gain 181 90 -88.19 gain 90 182 -96.35 gain 182 90 -95.20 gain 90 183 -88.77 gain 183 90 -87.90 gain 90 184 -93.10 gain 184 90 -94.98 gain 90 185 -94.82 gain 185 90 -100.57 gain 90 186 -92.02 gain 186 90 -93.35 gain 90 187 -95.87 gain 187 90 -94.93 gain 90 188 -98.04 gain 188 90 -99.51 gain 90 189 -95.35 gain 189 90 -91.55 gain 90 190 -100.40 gain 190 90 -100.51 gain 90 191 -97.99 gain 191 90 -96.80 gain 90 192 -99.22 gain 192 90 -96.73 gain 90 193 -105.05 gain 193 90 -101.54 gain 90 194 -102.77 gain 194 90 -100.05 gain 90 195 -94.62 gain 195 90 -90.44 gain 90 196 -93.34 gain 196 90 -93.48 gain 90 197 -97.44 gain 197 90 -92.72 gain 90 198 -85.96 gain 198 90 -85.75 gain 90 199 -92.74 gain 199 90 -92.63 gain 90 200 -94.43 gain 200 90 -95.66 gain 90 201 -88.87 gain 201 90 -90.01 gain 90 202 -96.55 gain 202 90 -96.82 gain 90 203 -96.50 gain 203 90 -95.88 gain 90 204 -101.24 gain 204 90 -97.27 gain 90 205 -95.89 gain 205 90 -95.66 gain 90 206 -98.86 gain 206 90 -99.74 gain 90 207 -100.39 gain 207 90 -100.69 gain 90 208 -97.55 gain 208 90 -100.45 gain 90 209 -92.60 gain 209 90 -95.07 gain 90 210 -92.74 gain 210 90 -95.38 gain 90 211 -93.22 gain 211 90 -91.09 gain 90 212 -96.01 gain 212 90 -96.90 gain 90 213 -97.11 gain 213 90 -97.32 gain 90 214 -96.86 gain 214 90 -102.46 gain 90 215 -97.79 gain 215 90 -98.80 gain 90 216 -96.80 gain 216 90 -101.72 gain 90 217 -96.83 gain 217 90 -102.01 gain 90 218 -101.66 gain 218 90 -99.64 gain 90 219 -95.91 gain 219 90 -94.38 gain 90 220 -99.62 gain 220 90 -94.17 gain 90 221 -99.67 gain 221 90 -99.90 gain 90 222 -103.21 gain 222 90 -99.25 gain 90 223 -99.73 gain 223 90 -99.01 gain 90 224 -100.89 gain 224 90 -100.64 gain 91 92 -68.30 gain 92 91 -69.22 gain 91 93 -70.99 gain 93 91 -69.27 gain 91 94 -79.39 gain 94 91 -76.23 gain 91 95 -92.51 gain 95 91 -88.60 gain 91 96 -91.53 gain 96 91 -94.58 gain 91 97 -90.89 gain 97 91 -86.77 gain 91 98 -95.60 gain 98 91 -91.95 gain 91 99 -98.28 gain 99 91 -93.77 gain 91 100 -93.59 gain 100 91 -88.99 gain 91 101 -103.10 gain 101 91 -102.13 gain 91 102 -100.54 gain 102 91 -99.54 gain 91 103 -102.50 gain 103 91 -102.66 gain 91 104 -102.21 gain 104 91 -104.86 gain 91 105 -77.21 gain 105 91 -74.38 gain 91 106 -63.39 gain 106 91 -57.89 gain 91 107 -71.62 gain 107 91 -66.03 gain 91 108 -69.92 gain 108 91 -63.94 gain 91 109 -76.58 gain 109 91 -74.06 gain 91 110 -83.17 gain 110 91 -87.00 gain 91 111 -93.12 gain 111 91 -86.93 gain 91 112 -86.76 gain 112 91 -84.03 gain 91 113 -94.96 gain 113 91 -91.36 gain 91 114 -90.08 gain 114 91 -83.65 gain 91 115 -95.84 gain 115 91 -90.06 gain 91 116 -97.17 gain 116 91 -93.82 gain 91 117 -101.78 gain 117 91 -95.57 gain 91 118 -100.70 gain 118 91 -96.12 gain 91 119 -104.47 gain 119 91 -104.95 gain 91 120 -77.68 gain 120 91 -75.54 gain 91 121 -78.56 gain 121 91 -77.45 gain 91 122 -86.89 gain 122 91 -85.52 gain 91 123 -79.16 gain 123 91 -78.13 gain 91 124 -79.67 gain 124 91 -76.63 gain 91 125 -91.25 gain 125 91 -91.55 gain 91 126 -92.82 gain 126 91 -89.77 gain 91 127 -90.29 gain 127 91 -86.87 gain 91 128 -92.86 gain 128 91 -92.02 gain 91 129 -92.47 gain 129 91 -88.85 gain 91 130 -98.68 gain 130 91 -96.34 gain 91 131 -100.92 gain 131 91 -98.36 gain 91 132 -99.65 gain 132 91 -93.11 gain 91 133 -98.16 gain 133 91 -96.79 gain 91 134 -101.70 gain 134 91 -97.19 gain 91 135 -77.43 gain 135 91 -75.22 gain 91 136 -83.73 gain 136 91 -81.96 gain 91 137 -88.90 gain 137 91 -90.05 gain 91 138 -82.57 gain 138 91 -77.24 gain 91 139 -96.29 gain 139 91 -94.24 gain 91 140 -92.17 gain 140 91 -90.95 gain 91 141 -92.21 gain 141 91 -82.95 gain 91 142 -91.51 gain 142 91 -89.00 gain 91 143 -97.37 gain 143 91 -97.59 gain 91 144 -95.23 gain 144 91 -93.82 gain 91 145 -90.55 gain 145 91 -92.53 gain 91 146 -98.31 gain 146 91 -96.28 gain 91 147 -100.69 gain 147 91 -95.76 gain 91 148 -97.79 gain 148 91 -91.19 gain 91 149 -106.08 gain 149 91 -103.14 gain 91 150 -86.83 gain 150 91 -84.73 gain 91 151 -93.68 gain 151 91 -90.51 gain 91 152 -79.58 gain 152 91 -76.23 gain 91 153 -85.02 gain 153 91 -80.88 gain 91 154 -84.99 gain 154 91 -82.76 gain 91 155 -92.16 gain 155 91 -88.50 gain 91 156 -96.57 gain 156 91 -92.15 gain 91 157 -99.21 gain 157 91 -97.26 gain 91 158 -96.83 gain 158 91 -94.39 gain 91 159 -96.35 gain 159 91 -96.29 gain 91 160 -94.89 gain 160 91 -91.99 gain 91 161 -100.89 gain 161 91 -100.42 gain 91 162 -103.08 gain 162 91 -102.32 gain 91 163 -102.13 gain 163 91 -103.28 gain 91 164 -105.14 gain 164 91 -105.67 gain 91 165 -86.91 gain 165 91 -84.49 gain 91 166 -85.96 gain 166 91 -83.30 gain 91 167 -88.55 gain 167 91 -86.61 gain 91 168 -90.64 gain 168 91 -87.59 gain 91 169 -94.40 gain 169 91 -92.47 gain 91 170 -93.52 gain 170 91 -90.82 gain 91 171 -91.92 gain 171 91 -90.30 gain 91 172 -94.50 gain 172 91 -91.07 gain 91 173 -98.13 gain 173 91 -99.35 gain 91 174 -92.11 gain 174 91 -89.38 gain 91 175 -93.22 gain 175 91 -91.62 gain 91 176 -91.25 gain 176 91 -88.62 gain 91 177 -95.86 gain 177 91 -96.23 gain 91 178 -97.42 gain 178 91 -91.24 gain 91 179 -96.40 gain 179 91 -89.63 gain 91 180 -92.49 gain 180 91 -95.18 gain 91 181 -90.88 gain 181 91 -87.59 gain 91 182 -92.96 gain 182 91 -90.75 gain 91 183 -93.16 gain 183 91 -91.22 gain 91 184 -93.09 gain 184 91 -93.90 gain 91 185 -93.63 gain 185 91 -98.30 gain 91 186 -96.32 gain 186 91 -96.58 gain 91 187 -89.07 gain 187 91 -87.06 gain 91 188 -100.43 gain 188 91 -100.83 gain 91 189 -98.04 gain 189 91 -93.17 gain 91 190 -98.49 gain 190 91 -97.53 gain 91 191 -98.45 gain 191 91 -96.20 gain 91 192 -99.75 gain 192 91 -96.20 gain 91 193 -108.28 gain 193 91 -103.71 gain 91 194 -103.60 gain 194 91 -99.81 gain 91 195 -88.86 gain 195 91 -83.62 gain 91 196 -96.54 gain 196 91 -95.61 gain 91 197 -91.06 gain 197 91 -85.26 gain 91 198 -92.24 gain 198 91 -90.96 gain 91 199 -100.93 gain 199 91 -99.75 gain 91 200 -97.95 gain 200 91 -98.12 gain 91 201 -100.41 gain 201 91 -100.48 gain 91 202 -96.94 gain 202 91 -96.15 gain 91 203 -94.72 gain 203 91 -93.04 gain 91 204 -99.68 gain 204 91 -94.64 gain 91 205 -103.03 gain 205 91 -101.73 gain 91 206 -98.90 gain 206 91 -98.71 gain 91 207 -100.03 gain 207 91 -99.26 gain 91 208 -102.23 gain 208 91 -104.06 gain 91 209 -103.54 gain 209 91 -104.94 gain 91 210 -87.49 gain 210 91 -89.06 gain 91 211 -83.63 gain 211 91 -80.43 gain 91 212 -96.70 gain 212 91 -96.52 gain 91 213 -89.30 gain 213 91 -88.45 gain 91 214 -92.61 gain 214 91 -97.15 gain 91 215 -96.81 gain 215 91 -96.74 gain 91 216 -90.38 gain 216 91 -94.22 gain 91 217 -103.29 gain 217 91 -107.40 gain 91 218 -100.96 gain 218 91 -97.88 gain 91 219 -98.33 gain 219 91 -95.73 gain 91 220 -99.64 gain 220 91 -93.12 gain 91 221 -99.76 gain 221 91 -98.92 gain 91 222 -102.73 gain 222 91 -97.70 gain 91 223 -95.75 gain 223 91 -93.96 gain 91 224 -102.42 gain 224 91 -101.09 gain 92 93 -66.56 gain 93 92 -63.92 gain 92 94 -72.36 gain 94 92 -68.28 gain 92 95 -79.98 gain 95 92 -75.15 gain 92 96 -83.42 gain 96 92 -85.56 gain 92 97 -100.12 gain 97 92 -95.08 gain 92 98 -92.58 gain 98 92 -88.01 gain 92 99 -95.31 gain 99 92 -89.88 gain 92 100 -95.40 gain 100 92 -89.88 gain 92 101 -100.45 gain 101 92 -98.57 gain 92 102 -91.02 gain 102 92 -89.09 gain 92 103 -94.17 gain 103 92 -93.42 gain 92 104 -95.81 gain 104 92 -97.54 gain 92 105 -79.08 gain 105 92 -75.33 gain 92 106 -73.02 gain 106 92 -66.60 gain 92 107 -67.75 gain 107 92 -61.24 gain 92 108 -73.65 gain 108 92 -66.75 gain 92 109 -88.43 gain 109 92 -84.98 gain 92 110 -81.42 gain 110 92 -84.34 gain 92 111 -86.83 gain 111 92 -79.71 gain 92 112 -91.75 gain 112 92 -88.10 gain 92 113 -87.70 gain 113 92 -83.18 gain 92 114 -98.93 gain 114 92 -91.57 gain 92 115 -93.36 gain 115 92 -86.66 gain 92 116 -98.08 gain 116 92 -93.81 gain 92 117 -99.00 gain 117 92 -91.88 gain 92 118 -103.29 gain 118 92 -97.79 gain 92 119 -108.64 gain 119 92 -108.19 gain 92 120 -82.52 gain 120 92 -79.46 gain 92 121 -79.05 gain 121 92 -77.01 gain 92 122 -77.16 gain 122 92 -74.87 gain 92 123 -72.19 gain 123 92 -70.25 gain 92 124 -78.24 gain 124 92 -74.28 gain 92 125 -82.05 gain 125 92 -81.43 gain 92 126 -89.24 gain 126 92 -85.27 gain 92 127 -85.88 gain 127 92 -81.54 gain 92 128 -86.40 gain 128 92 -84.64 gain 92 129 -98.45 gain 129 92 -93.91 gain 92 130 -95.68 gain 130 92 -92.43 gain 92 131 -95.50 gain 131 92 -92.03 gain 92 132 -102.67 gain 132 92 -95.20 gain 92 133 -96.89 gain 133 92 -94.60 gain 92 134 -100.21 gain 134 92 -94.79 gain 92 135 -78.77 gain 135 92 -75.64 gain 92 136 -84.27 gain 136 92 -81.58 gain 92 137 -74.49 gain 137 92 -74.72 gain 92 138 -80.87 gain 138 92 -74.63 gain 92 139 -81.77 gain 139 92 -78.79 gain 92 140 -87.49 gain 140 92 -85.34 gain 92 141 -90.73 gain 141 92 -80.55 gain 92 142 -84.66 gain 142 92 -81.22 gain 92 143 -93.76 gain 143 92 -93.06 gain 92 144 -87.82 gain 144 92 -85.49 gain 92 145 -96.57 gain 145 92 -97.63 gain 92 146 -96.17 gain 146 92 -93.22 gain 92 147 -95.02 gain 147 92 -89.18 gain 92 148 -103.30 gain 148 92 -95.79 gain 92 149 -101.62 gain 149 92 -97.76 gain 92 150 -87.80 gain 150 92 -84.77 gain 92 151 -84.48 gain 151 92 -80.40 gain 92 152 -88.70 gain 152 92 -84.43 gain 92 153 -80.23 gain 153 92 -75.18 gain 92 154 -94.73 gain 154 92 -91.58 gain 92 155 -84.09 gain 155 92 -79.52 gain 92 156 -88.32 gain 156 92 -82.98 gain 92 157 -89.96 gain 157 92 -87.10 gain 92 158 -88.04 gain 158 92 -84.68 gain 92 159 -97.16 gain 159 92 -96.17 gain 92 160 -99.82 gain 160 92 -96.00 gain 92 161 -102.55 gain 161 92 -101.16 gain 92 162 -98.89 gain 162 92 -97.21 gain 92 163 -100.65 gain 163 92 -100.89 gain 92 164 -103.34 gain 164 92 -102.95 gain 92 165 -95.60 gain 165 92 -92.26 gain 92 166 -94.41 gain 166 92 -90.82 gain 92 167 -88.74 gain 167 92 -85.88 gain 92 168 -90.99 gain 168 92 -87.03 gain 92 169 -91.37 gain 169 92 -88.52 gain 92 170 -92.48 gain 170 92 -88.86 gain 92 171 -92.71 gain 171 92 -90.18 gain 92 172 -99.13 gain 172 92 -94.78 gain 92 173 -98.50 gain 173 92 -98.80 gain 92 174 -93.27 gain 174 92 -89.62 gain 92 175 -95.10 gain 175 92 -92.58 gain 92 176 -92.99 gain 176 92 -89.44 gain 92 177 -94.61 gain 177 92 -94.06 gain 92 178 -96.08 gain 178 92 -88.98 gain 92 179 -104.30 gain 179 92 -96.62 gain 92 180 -87.08 gain 180 92 -88.85 gain 92 181 -97.83 gain 181 92 -93.61 gain 92 182 -95.60 gain 182 92 -92.47 gain 92 183 -94.95 gain 183 92 -92.09 gain 92 184 -88.01 gain 184 92 -87.90 gain 92 185 -95.25 gain 185 92 -99.01 gain 92 186 -97.06 gain 186 92 -96.40 gain 92 187 -91.39 gain 187 92 -88.46 gain 92 188 -89.70 gain 188 92 -89.18 gain 92 189 -101.80 gain 189 92 -96.01 gain 92 190 -107.47 gain 190 92 -105.59 gain 92 191 -97.28 gain 191 92 -94.11 gain 92 192 -99.47 gain 192 92 -94.99 gain 92 193 -103.81 gain 193 92 -98.32 gain 92 194 -100.33 gain 194 92 -95.62 gain 92 195 -96.68 gain 195 92 -90.51 gain 92 196 -93.79 gain 196 92 -91.94 gain 92 197 -91.91 gain 197 92 -85.19 gain 92 198 -90.22 gain 198 92 -88.02 gain 92 199 -90.57 gain 199 92 -88.47 gain 92 200 -100.52 gain 200 92 -99.76 gain 92 201 -96.52 gain 201 92 -95.67 gain 92 202 -107.37 gain 202 92 -105.65 gain 92 203 -106.05 gain 203 92 -103.45 gain 92 204 -102.73 gain 204 92 -96.77 gain 92 205 -99.51 gain 205 92 -97.29 gain 92 206 -105.57 gain 206 92 -104.46 gain 92 207 -98.93 gain 207 92 -97.24 gain 92 208 -100.28 gain 208 92 -101.19 gain 92 209 -103.03 gain 209 92 -103.51 gain 92 210 -99.50 gain 210 92 -100.16 gain 92 211 -98.29 gain 211 92 -94.17 gain 92 212 -99.77 gain 212 92 -98.67 gain 92 213 -98.10 gain 213 92 -96.33 gain 92 214 -96.97 gain 214 92 -100.59 gain 92 215 -102.13 gain 215 92 -101.15 gain 92 216 -94.27 gain 216 92 -97.20 gain 92 217 -95.14 gain 217 92 -98.33 gain 92 218 -104.71 gain 218 92 -100.70 gain 92 219 -96.91 gain 219 92 -93.38 gain 92 220 -103.25 gain 220 92 -95.81 gain 92 221 -106.76 gain 221 92 -105.00 gain 92 222 -102.09 gain 222 92 -96.14 gain 92 223 -98.55 gain 223 92 -95.84 gain 92 224 -101.14 gain 224 92 -98.90 gain 93 94 -64.18 gain 94 93 -62.75 gain 93 95 -73.32 gain 95 93 -71.13 gain 93 96 -84.15 gain 96 93 -88.93 gain 93 97 -88.77 gain 97 93 -86.37 gain 93 98 -83.18 gain 98 93 -81.25 gain 93 99 -84.08 gain 99 93 -81.28 gain 93 100 -87.94 gain 100 93 -85.06 gain 93 101 -95.45 gain 101 93 -96.21 gain 93 102 -92.15 gain 102 93 -92.87 gain 93 103 -94.73 gain 103 93 -96.61 gain 93 104 -96.15 gain 104 93 -100.52 gain 93 105 -80.98 gain 105 93 -79.87 gain 93 106 -76.24 gain 106 93 -72.47 gain 93 107 -59.51 gain 107 93 -55.64 gain 93 108 -61.64 gain 108 93 -57.39 gain 93 109 -75.62 gain 109 93 -74.82 gain 93 110 -69.06 gain 110 93 -74.62 gain 93 111 -79.05 gain 111 93 -74.58 gain 93 112 -84.62 gain 112 93 -83.61 gain 93 113 -80.54 gain 113 93 -78.66 gain 93 114 -91.46 gain 114 93 -86.74 gain 93 115 -91.06 gain 115 93 -87.00 gain 93 116 -91.81 gain 116 93 -90.19 gain 93 117 -100.20 gain 117 93 -95.72 gain 93 118 -96.92 gain 118 93 -94.06 gain 93 119 -102.78 gain 119 93 -104.98 gain 93 120 -84.37 gain 120 93 -83.95 gain 93 121 -74.66 gain 121 93 -75.27 gain 93 122 -72.72 gain 122 93 -73.07 gain 93 123 -72.25 gain 123 93 -72.94 gain 93 124 -76.57 gain 124 93 -75.25 gain 93 125 -76.41 gain 125 93 -78.43 gain 93 126 -80.16 gain 126 93 -78.83 gain 93 127 -83.26 gain 127 93 -81.56 gain 93 128 -83.60 gain 128 93 -84.50 gain 93 129 -90.63 gain 129 93 -88.73 gain 93 130 -88.81 gain 130 93 -88.21 gain 93 131 -88.31 gain 131 93 -87.47 gain 93 132 -98.27 gain 132 93 -93.45 gain 93 133 -95.07 gain 133 93 -95.42 gain 93 134 -101.32 gain 134 93 -98.53 gain 93 135 -89.43 gain 135 93 -88.94 gain 93 136 -85.88 gain 136 93 -85.84 gain 93 137 -78.06 gain 137 93 -80.93 gain 93 138 -82.27 gain 138 93 -78.67 gain 93 139 -72.34 gain 139 93 -72.01 gain 93 140 -75.88 gain 140 93 -76.37 gain 93 141 -82.65 gain 141 93 -75.12 gain 93 142 -87.53 gain 142 93 -86.74 gain 93 143 -85.68 gain 143 93 -87.63 gain 93 144 -95.87 gain 144 93 -96.18 gain 93 145 -91.80 gain 145 93 -95.50 gain 93 146 -89.46 gain 146 93 -89.15 gain 93 147 -92.10 gain 147 93 -88.90 gain 93 148 -96.30 gain 148 93 -91.42 gain 93 149 -89.06 gain 149 93 -87.84 gain 93 150 -88.00 gain 150 93 -87.62 gain 93 151 -79.20 gain 151 93 -77.76 gain 93 152 -84.21 gain 152 93 -82.58 gain 93 153 -80.51 gain 153 93 -78.10 gain 93 154 -77.61 gain 154 93 -77.10 gain 93 155 -87.87 gain 155 93 -85.94 gain 93 156 -83.11 gain 156 93 -80.40 gain 93 157 -84.32 gain 157 93 -84.10 gain 93 158 -94.17 gain 158 93 -93.44 gain 93 159 -89.49 gain 159 93 -91.15 gain 93 160 -95.23 gain 160 93 -94.04 gain 93 161 -93.62 gain 161 93 -94.87 gain 93 162 -99.82 gain 162 93 -100.79 gain 93 163 -95.50 gain 163 93 -98.38 gain 93 164 -99.05 gain 164 93 -101.30 gain 93 165 -83.53 gain 165 93 -82.84 gain 93 166 -83.15 gain 166 93 -82.21 gain 93 167 -81.04 gain 167 93 -80.82 gain 93 168 -87.29 gain 168 93 -85.96 gain 93 169 -90.32 gain 169 93 -90.11 gain 93 170 -86.61 gain 170 93 -85.63 gain 93 171 -91.06 gain 171 93 -91.16 gain 93 172 -84.89 gain 172 93 -83.18 gain 93 173 -91.33 gain 173 93 -94.27 gain 93 174 -94.05 gain 174 93 -93.04 gain 93 175 -93.74 gain 175 93 -93.87 gain 93 176 -94.84 gain 176 93 -93.93 gain 93 177 -93.90 gain 177 93 -96.00 gain 93 178 -102.26 gain 178 93 -97.79 gain 93 179 -94.86 gain 179 93 -89.82 gain 93 180 -97.33 gain 180 93 -101.73 gain 93 181 -88.40 gain 181 93 -86.83 gain 93 182 -92.91 gain 182 93 -92.43 gain 93 183 -91.93 gain 183 93 -91.72 gain 93 184 -90.65 gain 184 93 -93.19 gain 93 185 -89.05 gain 185 93 -95.46 gain 93 186 -90.60 gain 186 93 -92.58 gain 93 187 -83.20 gain 187 93 -82.92 gain 93 188 -91.94 gain 188 93 -94.07 gain 93 189 -84.65 gain 189 93 -81.49 gain 93 190 -98.69 gain 190 93 -99.45 gain 93 191 -97.33 gain 191 93 -96.80 gain 93 192 -103.81 gain 192 93 -101.97 gain 93 193 -101.81 gain 193 93 -98.96 gain 93 194 -100.78 gain 194 93 -98.71 gain 93 195 -92.10 gain 195 93 -88.58 gain 93 196 -98.45 gain 196 93 -99.24 gain 93 197 -93.87 gain 197 93 -89.79 gain 93 198 -99.14 gain 198 93 -99.58 gain 93 199 -84.66 gain 199 93 -85.21 gain 93 200 -85.29 gain 200 93 -87.17 gain 93 201 -88.88 gain 201 93 -90.67 gain 93 202 -89.19 gain 202 93 -90.12 gain 93 203 -97.55 gain 203 93 -97.59 gain 93 204 -96.29 gain 204 93 -92.97 gain 93 205 -93.08 gain 205 93 -93.50 gain 93 206 -100.65 gain 206 93 -102.19 gain 93 207 -89.96 gain 207 93 -90.91 gain 93 208 -97.92 gain 208 93 -101.47 gain 93 209 -102.24 gain 209 93 -105.37 gain 93 210 -97.48 gain 210 93 -100.78 gain 93 211 -96.56 gain 211 93 -95.09 gain 93 212 -97.31 gain 212 93 -98.86 gain 93 213 -96.55 gain 213 93 -97.42 gain 93 214 -91.83 gain 214 93 -98.08 gain 93 215 -94.10 gain 215 93 -95.76 gain 93 216 -97.88 gain 216 93 -103.44 gain 93 217 -89.47 gain 217 93 -95.30 gain 93 218 -97.99 gain 218 93 -96.63 gain 93 219 -97.50 gain 219 93 -96.62 gain 93 220 -94.60 gain 220 93 -89.81 gain 93 221 -96.60 gain 221 93 -97.49 gain 93 222 -101.37 gain 222 93 -98.06 gain 93 223 -99.00 gain 223 93 -98.93 gain 93 224 -91.52 gain 224 93 -91.92 gain 94 95 -64.35 gain 95 94 -63.59 gain 94 96 -70.77 gain 96 94 -76.98 gain 94 97 -83.69 gain 97 94 -82.73 gain 94 98 -76.74 gain 98 94 -76.25 gain 94 99 -87.48 gain 99 94 -86.12 gain 94 100 -90.10 gain 100 94 -88.66 gain 94 101 -88.42 gain 101 94 -90.60 gain 94 102 -89.60 gain 102 94 -91.76 gain 94 103 -97.11 gain 103 94 -100.43 gain 94 104 -96.53 gain 104 94 -102.34 gain 94 105 -80.23 gain 105 94 -80.55 gain 94 106 -82.26 gain 106 94 -79.91 gain 94 107 -72.82 gain 107 94 -70.39 gain 94 108 -72.98 gain 108 94 -70.17 gain 94 109 -57.42 gain 109 94 -58.05 gain 94 110 -68.15 gain 110 94 -75.14 gain 94 111 -63.90 gain 111 94 -60.86 gain 94 112 -73.68 gain 112 94 -74.11 gain 94 113 -85.33 gain 113 94 -84.88 gain 94 114 -84.14 gain 114 94 -80.86 gain 94 115 -85.92 gain 115 94 -83.30 gain 94 116 -98.80 gain 116 94 -98.61 gain 94 117 -92.53 gain 117 94 -89.48 gain 94 118 -95.58 gain 118 94 -94.15 gain 94 119 -101.31 gain 119 94 -104.94 gain 94 120 -82.14 gain 120 94 -83.15 gain 94 121 -78.06 gain 121 94 -80.09 gain 94 122 -75.97 gain 122 94 -77.75 gain 94 123 -80.42 gain 123 94 -82.54 gain 94 124 -69.75 gain 124 94 -69.87 gain 94 125 -76.97 gain 125 94 -80.42 gain 94 126 -77.07 gain 126 94 -77.17 gain 94 127 -80.71 gain 127 94 -80.44 gain 94 128 -83.88 gain 128 94 -86.20 gain 94 129 -86.94 gain 129 94 -86.47 gain 94 130 -97.22 gain 130 94 -98.05 gain 94 131 -88.16 gain 131 94 -88.76 gain 94 132 -93.34 gain 132 94 -89.95 gain 94 133 -92.58 gain 133 94 -94.36 gain 94 134 -95.61 gain 134 94 -94.25 gain 94 135 -78.55 gain 135 94 -79.50 gain 94 136 -80.15 gain 136 94 -81.54 gain 94 137 -85.14 gain 137 94 -89.44 gain 94 138 -76.84 gain 138 94 -74.67 gain 94 139 -78.61 gain 139 94 -79.71 gain 94 140 -80.68 gain 140 94 -82.61 gain 94 141 -78.10 gain 141 94 -72.00 gain 94 142 -84.18 gain 142 94 -84.82 gain 94 143 -91.35 gain 143 94 -94.73 gain 94 144 -83.78 gain 144 94 -85.52 gain 94 145 -90.25 gain 145 94 -95.38 gain 94 146 -88.39 gain 146 94 -89.51 gain 94 147 -91.88 gain 147 94 -90.11 gain 94 148 -89.28 gain 148 94 -85.84 gain 94 149 -93.68 gain 149 94 -93.90 gain 94 150 -85.87 gain 150 94 -86.92 gain 94 151 -87.85 gain 151 94 -87.84 gain 94 152 -91.11 gain 152 94 -90.92 gain 94 153 -84.46 gain 153 94 -83.48 gain 94 154 -78.15 gain 154 94 -79.08 gain 94 155 -87.36 gain 155 94 -86.86 gain 94 156 -81.51 gain 156 94 -80.24 gain 94 157 -77.51 gain 157 94 -78.72 gain 94 158 -84.03 gain 158 94 -84.74 gain 94 159 -95.90 gain 159 94 -99.00 gain 94 160 -89.35 gain 160 94 -89.60 gain 94 161 -92.60 gain 161 94 -95.29 gain 94 162 -95.24 gain 162 94 -97.64 gain 94 163 -89.88 gain 163 94 -94.19 gain 94 164 -101.73 gain 164 94 -105.41 gain 94 165 -86.59 gain 165 94 -87.32 gain 94 166 -82.92 gain 166 94 -83.41 gain 94 167 -86.01 gain 167 94 -87.23 gain 94 168 -90.45 gain 168 94 -90.56 gain 94 169 -89.12 gain 169 94 -90.34 gain 94 170 -84.34 gain 170 94 -84.80 gain 94 171 -83.13 gain 171 94 -84.67 gain 94 172 -96.26 gain 172 94 -95.99 gain 94 173 -85.02 gain 173 94 -89.40 gain 94 174 -90.27 gain 174 94 -90.69 gain 94 175 -90.68 gain 175 94 -92.24 gain 94 176 -90.24 gain 176 94 -90.77 gain 94 177 -92.73 gain 177 94 -96.25 gain 94 178 -92.26 gain 178 94 -89.23 gain 94 179 -98.24 gain 179 94 -94.63 gain 94 180 -89.16 gain 180 94 -95.00 gain 94 181 -86.05 gain 181 94 -85.91 gain 94 182 -91.61 gain 182 94 -92.55 gain 94 183 -84.32 gain 183 94 -85.54 gain 94 184 -81.04 gain 184 94 -85.01 gain 94 185 -85.11 gain 185 94 -92.95 gain 94 186 -87.87 gain 186 94 -91.29 gain 94 187 -86.98 gain 187 94 -88.12 gain 94 188 -89.30 gain 188 94 -92.85 gain 94 189 -94.52 gain 189 94 -92.80 gain 94 190 -92.65 gain 190 94 -94.85 gain 94 191 -86.36 gain 191 94 -87.26 gain 94 192 -97.56 gain 192 94 -97.16 gain 94 193 -98.61 gain 193 94 -97.20 gain 94 194 -97.54 gain 194 94 -96.91 gain 94 195 -84.14 gain 195 94 -82.06 gain 94 196 -90.52 gain 196 94 -92.75 gain 94 197 -82.01 gain 197 94 -79.37 gain 94 198 -92.34 gain 198 94 -94.21 gain 94 199 -89.28 gain 199 94 -91.26 gain 94 200 -90.04 gain 200 94 -93.36 gain 94 201 -95.79 gain 201 94 -99.01 gain 94 202 -94.55 gain 202 94 -96.90 gain 94 203 -88.66 gain 203 94 -90.13 gain 94 204 -93.22 gain 204 94 -91.34 gain 94 205 -92.71 gain 205 94 -94.56 gain 94 206 -92.68 gain 206 94 -95.64 gain 94 207 -87.89 gain 207 94 -90.28 gain 94 208 -97.34 gain 208 94 -102.33 gain 94 209 -95.20 gain 209 94 -99.76 gain 94 210 -89.83 gain 210 94 -94.56 gain 94 211 -93.52 gain 211 94 -93.48 gain 94 212 -96.26 gain 212 94 -99.24 gain 94 213 -89.55 gain 213 94 -91.85 gain 94 214 -90.91 gain 214 94 -98.60 gain 94 215 -93.96 gain 215 94 -97.05 gain 94 216 -97.66 gain 216 94 -104.66 gain 94 217 -93.68 gain 217 94 -100.95 gain 94 218 -89.91 gain 218 94 -89.98 gain 94 219 -91.04 gain 219 94 -91.59 gain 94 220 -97.38 gain 220 94 -94.02 gain 94 221 -96.37 gain 221 94 -98.69 gain 94 222 -93.05 gain 222 94 -91.17 gain 94 223 -102.55 gain 223 94 -103.91 gain 94 224 -106.74 gain 224 94 -108.58 gain 95 96 -69.65 gain 96 95 -76.62 gain 95 97 -72.06 gain 97 95 -71.85 gain 95 98 -77.92 gain 98 95 -78.19 gain 95 99 -78.96 gain 99 95 -78.36 gain 95 100 -83.85 gain 100 95 -83.17 gain 95 101 -82.63 gain 101 95 -85.57 gain 95 102 -93.33 gain 102 95 -96.25 gain 95 103 -87.62 gain 103 95 -91.70 gain 95 104 -92.84 gain 104 95 -99.41 gain 95 105 -84.37 gain 105 95 -85.45 gain 95 106 -80.40 gain 106 95 -78.82 gain 95 107 -82.31 gain 107 95 -80.63 gain 95 108 -76.77 gain 108 95 -74.71 gain 95 109 -58.16 gain 109 95 -59.55 gain 95 110 -59.44 gain 110 95 -67.19 gain 95 111 -63.03 gain 111 95 -60.75 gain 95 112 -69.83 gain 112 95 -71.01 gain 95 113 -80.31 gain 113 95 -80.63 gain 95 114 -77.97 gain 114 95 -75.45 gain 95 115 -83.94 gain 115 95 -82.07 gain 95 116 -87.01 gain 116 95 -87.57 gain 95 117 -88.08 gain 117 95 -85.79 gain 95 118 -90.27 gain 118 95 -89.60 gain 95 119 -93.62 gain 119 95 -98.01 gain 95 120 -80.42 gain 120 95 -82.19 gain 95 121 -84.62 gain 121 95 -87.42 gain 95 122 -77.62 gain 122 95 -80.17 gain 95 123 -75.39 gain 123 95 -78.27 gain 95 124 -75.67 gain 124 95 -76.54 gain 95 125 -62.48 gain 125 95 -66.70 gain 95 126 -75.34 gain 126 95 -76.20 gain 95 127 -73.24 gain 127 95 -73.73 gain 95 128 -83.31 gain 128 95 -86.39 gain 95 129 -86.34 gain 129 95 -86.63 gain 95 130 -80.55 gain 130 95 -82.14 gain 95 131 -94.48 gain 131 95 -95.84 gain 95 132 -88.27 gain 132 95 -85.63 gain 95 133 -91.53 gain 133 95 -94.08 gain 95 134 -85.43 gain 134 95 -84.83 gain 95 135 -87.60 gain 135 95 -89.31 gain 95 136 -85.81 gain 136 95 -87.96 gain 95 137 -77.76 gain 137 95 -82.82 gain 95 138 -74.28 gain 138 95 -72.87 gain 95 139 -80.52 gain 139 95 -82.37 gain 95 140 -81.03 gain 140 95 -83.72 gain 95 141 -75.72 gain 141 95 -70.38 gain 95 142 -85.40 gain 142 95 -86.80 gain 95 143 -83.07 gain 143 95 -87.21 gain 95 144 -88.10 gain 144 95 -90.60 gain 95 145 -86.19 gain 145 95 -92.08 gain 95 146 -87.96 gain 146 95 -89.84 gain 95 147 -83.27 gain 147 95 -82.26 gain 95 148 -80.83 gain 148 95 -78.15 gain 95 149 -87.14 gain 149 95 -88.11 gain 95 150 -89.13 gain 150 95 -90.94 gain 95 151 -85.35 gain 151 95 -86.10 gain 95 152 -86.52 gain 152 95 -87.08 gain 95 153 -83.33 gain 153 95 -83.11 gain 95 154 -79.40 gain 154 95 -81.08 gain 95 155 -72.85 gain 155 95 -73.10 gain 95 156 -76.82 gain 156 95 -76.31 gain 95 157 -83.49 gain 157 95 -85.46 gain 95 158 -88.16 gain 158 95 -89.63 gain 95 159 -85.50 gain 159 95 -89.35 gain 95 160 -89.97 gain 160 95 -90.97 gain 95 161 -89.74 gain 161 95 -93.19 gain 95 162 -98.23 gain 162 95 -101.39 gain 95 163 -95.15 gain 163 95 -100.22 gain 95 164 -99.18 gain 164 95 -103.62 gain 95 165 -90.43 gain 165 95 -91.92 gain 95 166 -85.42 gain 166 95 -86.67 gain 95 167 -86.72 gain 167 95 -88.69 gain 95 168 -80.78 gain 168 95 -81.64 gain 95 169 -84.27 gain 169 95 -86.25 gain 95 170 -86.42 gain 170 95 -87.64 gain 95 171 -75.58 gain 171 95 -77.88 gain 95 172 -82.45 gain 172 95 -82.93 gain 95 173 -87.09 gain 173 95 -92.23 gain 95 174 -90.85 gain 174 95 -92.03 gain 95 175 -90.45 gain 175 95 -92.76 gain 95 176 -92.00 gain 176 95 -93.28 gain 95 177 -89.48 gain 177 95 -93.76 gain 95 178 -95.84 gain 178 95 -93.56 gain 95 179 -95.05 gain 179 95 -92.20 gain 95 180 -82.64 gain 180 95 -89.24 gain 95 181 -95.74 gain 181 95 -96.36 gain 95 182 -91.69 gain 182 95 -93.40 gain 95 183 -89.84 gain 183 95 -91.82 gain 95 184 -86.10 gain 184 95 -90.83 gain 95 185 -85.53 gain 185 95 -94.12 gain 95 186 -84.66 gain 186 95 -88.83 gain 95 187 -89.14 gain 187 95 -91.05 gain 95 188 -88.26 gain 188 95 -92.58 gain 95 189 -86.46 gain 189 95 -85.50 gain 95 190 -94.28 gain 190 95 -97.24 gain 95 191 -87.46 gain 191 95 -89.13 gain 95 192 -94.71 gain 192 95 -95.07 gain 95 193 -95.96 gain 193 95 -95.30 gain 95 194 -91.04 gain 194 95 -91.17 gain 95 195 -85.43 gain 195 95 -84.10 gain 95 196 -83.20 gain 196 95 -86.19 gain 95 197 -85.07 gain 197 95 -83.19 gain 95 198 -88.64 gain 198 95 -91.27 gain 95 199 -85.01 gain 199 95 -87.75 gain 95 200 -80.28 gain 200 95 -84.35 gain 95 201 -85.88 gain 201 95 -89.86 gain 95 202 -92.32 gain 202 95 -95.44 gain 95 203 -86.22 gain 203 95 -88.45 gain 95 204 -93.74 gain 204 95 -92.61 gain 95 205 -99.93 gain 205 95 -102.54 gain 95 206 -99.13 gain 206 95 -102.85 gain 95 207 -98.43 gain 207 95 -101.57 gain 95 208 -102.54 gain 208 95 -108.29 gain 95 209 -90.89 gain 209 95 -96.21 gain 95 210 -93.97 gain 210 95 -99.46 gain 95 211 -92.63 gain 211 95 -93.35 gain 95 212 -85.26 gain 212 95 -88.99 gain 95 213 -85.05 gain 213 95 -88.11 gain 95 214 -87.82 gain 214 95 -96.27 gain 95 215 -98.34 gain 215 95 -102.19 gain 95 216 -91.25 gain 216 95 -99.01 gain 95 217 -87.59 gain 217 95 -95.62 gain 95 218 -86.70 gain 218 95 -87.53 gain 95 219 -95.78 gain 219 95 -97.09 gain 95 220 -95.81 gain 220 95 -93.21 gain 95 221 -96.17 gain 221 95 -99.24 gain 95 222 -96.71 gain 222 95 -95.59 gain 95 223 -100.56 gain 223 95 -102.69 gain 95 224 -101.61 gain 224 95 -104.20 gain 96 97 -65.78 gain 97 96 -58.61 gain 96 98 -82.33 gain 98 96 -75.62 gain 96 99 -83.57 gain 99 96 -75.99 gain 96 100 -89.76 gain 100 96 -82.11 gain 96 101 -85.70 gain 101 96 -81.67 gain 96 102 -94.69 gain 102 96 -90.63 gain 96 103 -92.84 gain 103 96 -89.95 gain 96 104 -98.26 gain 104 96 -97.86 gain 96 105 -91.53 gain 105 96 -85.64 gain 96 106 -90.81 gain 106 96 -82.25 gain 96 107 -87.28 gain 107 96 -78.63 gain 96 108 -80.01 gain 108 96 -70.98 gain 96 109 -76.54 gain 109 96 -70.96 gain 96 110 -75.51 gain 110 96 -76.29 gain 96 111 -71.80 gain 111 96 -62.55 gain 96 112 -80.06 gain 112 96 -74.27 gain 96 113 -73.90 gain 113 96 -67.24 gain 96 114 -83.24 gain 114 96 -73.75 gain 96 115 -92.02 gain 115 96 -83.19 gain 96 116 -84.72 gain 116 96 -78.31 gain 96 117 -90.34 gain 117 96 -81.08 gain 96 118 -96.65 gain 118 96 -89.00 gain 96 119 -96.90 gain 119 96 -94.32 gain 96 120 -88.83 gain 120 96 -83.63 gain 96 121 -91.28 gain 121 96 -87.10 gain 96 122 -86.32 gain 122 96 -81.90 gain 96 123 -91.13 gain 123 96 -87.04 gain 96 124 -86.10 gain 124 96 -80.00 gain 96 125 -74.52 gain 125 96 -71.76 gain 96 126 -83.02 gain 126 96 -76.91 gain 96 127 -76.41 gain 127 96 -69.93 gain 96 128 -83.02 gain 128 96 -79.13 gain 96 129 -79.56 gain 129 96 -72.88 gain 96 130 -86.21 gain 130 96 -80.82 gain 96 131 -95.88 gain 131 96 -90.26 gain 96 132 -99.10 gain 132 96 -89.49 gain 96 133 -94.91 gain 133 96 -90.48 gain 96 134 -92.05 gain 134 96 -84.49 gain 96 135 -91.88 gain 135 96 -86.62 gain 96 136 -96.18 gain 136 96 -91.36 gain 96 137 -98.15 gain 137 96 -96.25 gain 96 138 -93.85 gain 138 96 -85.47 gain 96 139 -92.14 gain 139 96 -87.03 gain 96 140 -83.98 gain 140 96 -79.69 gain 96 141 -85.21 gain 141 96 -72.90 gain 96 142 -88.05 gain 142 96 -82.48 gain 96 143 -89.09 gain 143 96 -86.26 gain 96 144 -86.14 gain 144 96 -81.67 gain 96 145 -81.40 gain 145 96 -80.32 gain 96 146 -90.30 gain 146 96 -85.21 gain 96 147 -93.46 gain 147 96 -85.48 gain 96 148 -99.20 gain 148 96 -89.54 gain 96 149 -94.10 gain 149 96 -88.10 gain 96 150 -98.82 gain 150 96 -93.65 gain 96 151 -94.49 gain 151 96 -88.27 gain 96 152 -94.25 gain 152 96 -87.85 gain 96 153 -93.77 gain 153 96 -86.58 gain 96 154 -88.59 gain 154 96 -83.31 gain 96 155 -84.93 gain 155 96 -78.22 gain 96 156 -88.61 gain 156 96 -81.13 gain 96 157 -91.20 gain 157 96 -86.20 gain 96 158 -89.78 gain 158 96 -84.28 gain 96 159 -89.65 gain 159 96 -86.53 gain 96 160 -95.08 gain 160 96 -89.11 gain 96 161 -93.54 gain 161 96 -90.01 gain 96 162 -89.60 gain 162 96 -85.79 gain 96 163 -100.25 gain 163 96 -98.35 gain 96 164 -96.71 gain 164 96 -94.17 gain 96 165 -97.36 gain 165 96 -91.88 gain 96 166 -98.77 gain 166 96 -93.05 gain 96 167 -96.98 gain 167 96 -91.98 gain 96 168 -82.41 gain 168 96 -76.31 gain 96 169 -93.68 gain 169 96 -88.69 gain 96 170 -97.73 gain 170 96 -91.97 gain 96 171 -88.01 gain 171 96 -83.33 gain 96 172 -85.47 gain 172 96 -78.98 gain 96 173 -91.15 gain 173 96 -89.31 gain 96 174 -94.42 gain 174 96 -88.63 gain 96 175 -91.33 gain 175 96 -86.68 gain 96 176 -95.97 gain 176 96 -90.28 gain 96 177 -90.63 gain 177 96 -87.95 gain 96 178 -100.02 gain 178 96 -90.78 gain 96 179 -95.71 gain 179 96 -85.89 gain 96 180 -97.60 gain 180 96 -97.23 gain 96 181 -99.43 gain 181 96 -93.08 gain 96 182 -92.60 gain 182 96 -87.33 gain 96 183 -93.87 gain 183 96 -88.88 gain 96 184 -94.64 gain 184 96 -92.40 gain 96 185 -95.88 gain 185 96 -97.50 gain 96 186 -94.77 gain 186 96 -91.97 gain 96 187 -97.45 gain 187 96 -92.38 gain 96 188 -92.49 gain 188 96 -89.83 gain 96 189 -98.58 gain 189 96 -90.64 gain 96 190 -94.00 gain 190 96 -89.98 gain 96 191 -93.56 gain 191 96 -88.26 gain 96 192 -90.64 gain 192 96 -84.02 gain 96 193 -94.22 gain 193 96 -86.59 gain 96 194 -103.86 gain 194 96 -97.02 gain 96 195 -96.16 gain 195 96 -87.86 gain 96 196 -97.60 gain 196 96 -93.61 gain 96 197 -97.14 gain 197 96 -88.28 gain 96 198 -99.60 gain 198 96 -95.26 gain 96 199 -94.92 gain 199 96 -90.69 gain 96 200 -93.57 gain 200 96 -90.68 gain 96 201 -95.17 gain 201 96 -92.19 gain 96 202 -96.47 gain 202 96 -92.62 gain 96 203 -101.33 gain 203 96 -96.59 gain 96 204 -100.16 gain 204 96 -92.06 gain 96 205 -95.93 gain 205 96 -91.58 gain 96 206 -102.96 gain 206 96 -99.71 gain 96 207 -94.91 gain 207 96 -91.08 gain 96 208 -98.13 gain 208 96 -96.90 gain 96 209 -105.99 gain 209 96 -104.33 gain 96 210 -97.72 gain 210 96 -96.24 gain 96 211 -98.98 gain 211 96 -92.73 gain 96 212 -99.46 gain 212 96 -96.22 gain 96 213 -90.40 gain 213 96 -86.49 gain 96 214 -92.35 gain 214 96 -93.83 gain 96 215 -101.91 gain 215 96 -98.79 gain 96 216 -95.15 gain 216 96 -95.94 gain 96 217 -88.35 gain 217 96 -89.40 gain 96 218 -99.50 gain 218 96 -93.36 gain 96 219 -94.94 gain 219 96 -89.28 gain 96 220 -97.47 gain 220 96 -87.90 gain 96 221 -99.14 gain 221 96 -95.24 gain 96 222 -98.73 gain 222 96 -90.64 gain 96 223 -99.38 gain 223 96 -94.53 gain 96 224 -103.20 gain 224 96 -98.83 gain 97 98 -63.61 gain 98 97 -64.08 gain 97 99 -72.11 gain 99 97 -71.71 gain 97 100 -78.73 gain 100 97 -78.26 gain 97 101 -71.62 gain 101 97 -74.77 gain 97 102 -83.07 gain 102 97 -86.19 gain 97 103 -88.31 gain 103 97 -92.60 gain 97 104 -85.87 gain 104 97 -92.64 gain 97 105 -87.75 gain 105 97 -89.05 gain 97 106 -88.26 gain 106 97 -86.88 gain 97 107 -88.34 gain 107 97 -86.87 gain 97 108 -78.04 gain 108 97 -76.19 gain 97 109 -74.97 gain 109 97 -76.56 gain 97 110 -80.12 gain 110 97 -88.08 gain 97 111 -72.40 gain 111 97 -70.32 gain 97 112 -59.23 gain 112 97 -60.62 gain 97 113 -72.08 gain 113 97 -72.59 gain 97 114 -71.00 gain 114 97 -68.68 gain 97 115 -84.73 gain 115 97 -83.07 gain 97 116 -87.44 gain 116 97 -88.21 gain 97 117 -87.96 gain 117 97 -85.87 gain 97 118 -86.97 gain 118 97 -86.51 gain 97 119 -90.14 gain 119 97 -94.74 gain 97 120 -83.26 gain 120 97 -85.24 gain 97 121 -83.94 gain 121 97 -86.95 gain 97 122 -85.82 gain 122 97 -88.58 gain 97 123 -80.56 gain 123 97 -83.65 gain 97 124 -81.31 gain 124 97 -82.39 gain 97 125 -80.75 gain 125 97 -85.17 gain 97 126 -73.67 gain 126 97 -74.73 gain 97 127 -63.51 gain 127 97 -64.20 gain 97 128 -78.72 gain 128 97 -82.01 gain 97 129 -73.41 gain 129 97 -73.91 gain 97 130 -87.33 gain 130 97 -89.12 gain 97 131 -85.41 gain 131 97 -86.97 gain 97 132 -89.65 gain 132 97 -87.22 gain 97 133 -89.87 gain 133 97 -92.62 gain 97 134 -89.92 gain 134 97 -89.53 gain 97 135 -93.47 gain 135 97 -95.38 gain 97 136 -89.71 gain 136 97 -92.07 gain 97 137 -85.05 gain 137 97 -90.31 gain 97 138 -84.66 gain 138 97 -83.46 gain 97 139 -80.84 gain 139 97 -82.90 gain 97 140 -79.21 gain 140 97 -82.11 gain 97 141 -80.10 gain 141 97 -74.96 gain 97 142 -77.45 gain 142 97 -79.05 gain 97 143 -75.79 gain 143 97 -80.14 gain 97 144 -72.95 gain 144 97 -75.66 gain 97 145 -81.86 gain 145 97 -87.95 gain 97 146 -87.30 gain 146 97 -89.39 gain 97 147 -78.37 gain 147 97 -77.57 gain 97 148 -91.69 gain 148 97 -89.21 gain 97 149 -90.70 gain 149 97 -91.88 gain 97 150 -90.93 gain 150 97 -92.95 gain 97 151 -89.79 gain 151 97 -90.75 gain 97 152 -86.43 gain 152 97 -87.21 gain 97 153 -87.09 gain 153 97 -87.08 gain 97 154 -80.84 gain 154 97 -82.73 gain 97 155 -83.38 gain 155 97 -83.85 gain 97 156 -81.73 gain 156 97 -81.42 gain 97 157 -81.07 gain 157 97 -83.25 gain 97 158 -81.40 gain 158 97 -83.08 gain 97 159 -84.47 gain 159 97 -88.53 gain 97 160 -78.71 gain 160 97 -79.92 gain 97 161 -83.48 gain 161 97 -87.13 gain 97 162 -89.04 gain 162 97 -92.40 gain 97 163 -88.66 gain 163 97 -93.93 gain 97 164 -93.87 gain 164 97 -98.52 gain 97 165 -95.13 gain 165 97 -96.83 gain 97 166 -89.44 gain 166 97 -90.90 gain 97 167 -97.81 gain 167 97 -99.99 gain 97 168 -90.75 gain 168 97 -91.83 gain 97 169 -87.26 gain 169 97 -89.44 gain 97 170 -86.52 gain 170 97 -87.94 gain 97 171 -83.85 gain 171 97 -86.35 gain 97 172 -84.15 gain 172 97 -84.83 gain 97 173 -83.98 gain 173 97 -89.32 gain 97 174 -80.10 gain 174 97 -81.49 gain 97 175 -77.61 gain 175 97 -80.13 gain 97 176 -87.56 gain 176 97 -89.05 gain 97 177 -87.23 gain 177 97 -91.72 gain 97 178 -95.97 gain 178 97 -93.90 gain 97 179 -82.25 gain 179 97 -79.60 gain 97 180 -88.72 gain 180 97 -95.52 gain 97 181 -92.43 gain 181 97 -93.25 gain 97 182 -97.41 gain 182 97 -99.32 gain 97 183 -92.03 gain 183 97 -94.22 gain 97 184 -98.33 gain 184 97 -103.26 gain 97 185 -91.63 gain 185 97 -100.43 gain 97 186 -86.20 gain 186 97 -90.58 gain 97 187 -84.29 gain 187 97 -86.40 gain 97 188 -92.90 gain 188 97 -97.42 gain 97 189 -82.25 gain 189 97 -81.50 gain 97 190 -87.37 gain 190 97 -90.53 gain 97 191 -90.35 gain 191 97 -92.22 gain 97 192 -90.95 gain 192 97 -91.52 gain 97 193 -91.43 gain 193 97 -90.98 gain 97 194 -99.74 gain 194 97 -100.07 gain 97 195 -101.10 gain 195 97 -99.98 gain 97 196 -94.49 gain 196 97 -97.68 gain 97 197 -88.83 gain 197 97 -87.15 gain 97 198 -92.00 gain 198 97 -94.84 gain 97 199 -92.89 gain 199 97 -95.84 gain 97 200 -92.95 gain 200 97 -97.23 gain 97 201 -79.74 gain 201 97 -83.93 gain 97 202 -86.59 gain 202 97 -89.92 gain 97 203 -82.48 gain 203 97 -84.92 gain 97 204 -86.25 gain 204 97 -85.33 gain 97 205 -88.54 gain 205 97 -91.36 gain 97 206 -85.58 gain 206 97 -89.51 gain 97 207 -85.75 gain 207 97 -89.09 gain 97 208 -95.97 gain 208 97 -101.92 gain 97 209 -92.44 gain 209 97 -97.97 gain 97 210 -93.76 gain 210 97 -99.46 gain 97 211 -92.07 gain 211 97 -93.00 gain 97 212 -85.70 gain 212 97 -89.64 gain 97 213 -93.07 gain 213 97 -96.33 gain 97 214 -87.52 gain 214 97 -96.18 gain 97 215 -92.16 gain 215 97 -96.22 gain 97 216 -96.91 gain 216 97 -104.87 gain 97 217 -90.72 gain 217 97 -98.95 gain 97 218 -87.71 gain 218 97 -88.74 gain 97 219 -92.42 gain 219 97 -93.93 gain 97 220 -97.68 gain 220 97 -95.29 gain 97 221 -89.28 gain 221 97 -92.57 gain 97 222 -95.20 gain 222 97 -94.29 gain 97 223 -93.08 gain 223 97 -95.41 gain 97 224 -92.24 gain 224 97 -95.04 gain 98 99 -71.66 gain 99 98 -70.80 gain 98 100 -73.08 gain 100 98 -72.13 gain 98 101 -83.21 gain 101 98 -85.89 gain 98 102 -79.90 gain 102 98 -82.55 gain 98 103 -87.46 gain 103 98 -91.28 gain 98 104 -88.23 gain 104 98 -94.54 gain 98 105 -91.69 gain 105 98 -92.51 gain 98 106 -89.89 gain 106 98 -88.04 gain 98 107 -88.50 gain 107 98 -86.56 gain 98 108 -92.53 gain 108 98 -90.21 gain 98 109 -84.09 gain 109 98 -85.21 gain 98 110 -82.24 gain 110 98 -89.73 gain 98 111 -70.91 gain 111 98 -68.37 gain 98 112 -66.48 gain 112 98 -67.40 gain 98 113 -53.23 gain 113 98 -53.28 gain 98 114 -69.04 gain 114 98 -66.26 gain 98 115 -69.47 gain 115 98 -67.35 gain 98 116 -74.60 gain 116 98 -74.90 gain 98 117 -77.33 gain 117 98 -74.78 gain 98 118 -89.55 gain 118 98 -88.62 gain 98 119 -89.79 gain 119 98 -93.92 gain 98 120 -92.18 gain 120 98 -93.69 gain 98 121 -88.79 gain 121 98 -91.32 gain 98 122 -89.30 gain 122 98 -91.59 gain 98 123 -86.90 gain 123 98 -89.52 gain 98 124 -87.67 gain 124 98 -88.28 gain 98 125 -86.69 gain 125 98 -90.64 gain 98 126 -70.97 gain 126 98 -71.57 gain 98 127 -68.01 gain 127 98 -68.24 gain 98 128 -67.98 gain 128 98 -70.80 gain 98 129 -71.09 gain 129 98 -71.12 gain 98 130 -70.69 gain 130 98 -72.01 gain 98 131 -78.07 gain 131 98 -79.17 gain 98 132 -76.27 gain 132 98 -73.37 gain 98 133 -94.04 gain 133 98 -96.32 gain 98 134 -87.33 gain 134 98 -86.47 gain 98 135 -86.48 gain 135 98 -87.93 gain 98 136 -89.72 gain 136 98 -91.61 gain 98 137 -92.28 gain 137 98 -97.08 gain 98 138 -90.59 gain 138 98 -88.92 gain 98 139 -87.59 gain 139 98 -89.18 gain 98 140 -81.88 gain 140 98 -84.31 gain 98 141 -79.23 gain 141 98 -73.62 gain 98 142 -71.88 gain 142 98 -73.01 gain 98 143 -75.46 gain 143 98 -79.34 gain 98 144 -81.62 gain 144 98 -83.86 gain 98 145 -82.30 gain 145 98 -87.92 gain 98 146 -79.42 gain 146 98 -81.04 gain 98 147 -73.55 gain 147 98 -72.28 gain 98 148 -79.20 gain 148 98 -76.25 gain 98 149 -91.30 gain 149 98 -92.01 gain 98 150 -98.03 gain 150 98 -99.58 gain 98 151 -85.90 gain 151 98 -86.39 gain 98 152 -88.38 gain 152 98 -88.68 gain 98 153 -87.20 gain 153 98 -86.72 gain 98 154 -83.98 gain 154 98 -85.40 gain 98 155 -83.59 gain 155 98 -83.58 gain 98 156 -78.68 gain 156 98 -77.90 gain 98 157 -80.57 gain 157 98 -82.27 gain 98 158 -83.72 gain 158 98 -84.93 gain 98 159 -81.10 gain 159 98 -84.69 gain 98 160 -82.38 gain 160 98 -83.12 gain 98 161 -88.48 gain 161 98 -91.66 gain 98 162 -86.03 gain 162 98 -88.93 gain 98 163 -91.27 gain 163 98 -96.08 gain 98 164 -81.75 gain 164 98 -85.93 gain 98 165 -99.30 gain 165 98 -100.53 gain 98 166 -89.59 gain 166 98 -90.57 gain 98 167 -95.45 gain 167 98 -97.16 gain 98 168 -91.03 gain 168 98 -91.64 gain 98 169 -86.78 gain 169 98 -88.50 gain 98 170 -89.73 gain 170 98 -90.68 gain 98 171 -87.83 gain 171 98 -89.86 gain 98 172 -87.78 gain 172 98 -88.00 gain 98 173 -86.90 gain 173 98 -91.76 gain 98 174 -80.97 gain 174 98 -81.89 gain 98 175 -80.00 gain 175 98 -82.05 gain 98 176 -87.33 gain 176 98 -88.35 gain 98 177 -94.79 gain 177 98 -98.81 gain 98 178 -92.72 gain 178 98 -90.18 gain 98 179 -87.77 gain 179 98 -84.66 gain 98 180 -90.73 gain 180 98 -97.06 gain 98 181 -90.28 gain 181 98 -90.63 gain 98 182 -101.75 gain 182 98 -103.19 gain 98 183 -84.35 gain 183 98 -86.07 gain 98 184 -90.07 gain 184 98 -94.53 gain 98 185 -88.58 gain 185 98 -96.91 gain 98 186 -90.78 gain 186 98 -94.69 gain 98 187 -82.59 gain 187 98 -84.23 gain 98 188 -84.96 gain 188 98 -89.01 gain 98 189 -87.14 gain 189 98 -85.92 gain 98 190 -85.38 gain 190 98 -88.07 gain 98 191 -86.17 gain 191 98 -87.57 gain 98 192 -85.58 gain 192 98 -85.67 gain 98 193 -96.04 gain 193 98 -95.13 gain 98 194 -89.47 gain 194 98 -89.33 gain 98 195 -93.48 gain 195 98 -91.89 gain 98 196 -93.69 gain 196 98 -96.41 gain 98 197 -95.61 gain 197 98 -93.46 gain 98 198 -88.39 gain 198 98 -90.76 gain 98 199 -95.88 gain 199 98 -98.36 gain 98 200 -94.74 gain 200 98 -98.55 gain 98 201 -84.82 gain 201 98 -88.54 gain 98 202 -79.50 gain 202 98 -82.36 gain 98 203 -88.22 gain 203 98 -90.19 gain 98 204 -86.68 gain 204 98 -85.29 gain 98 205 -92.53 gain 205 98 -94.88 gain 98 206 -83.97 gain 206 98 -87.43 gain 98 207 -91.03 gain 207 98 -93.91 gain 98 208 -100.26 gain 208 98 -105.74 gain 98 209 -97.84 gain 209 98 -102.89 gain 98 210 -98.70 gain 210 98 -103.93 gain 98 211 -91.71 gain 211 98 -92.17 gain 98 212 -93.48 gain 212 98 -96.96 gain 98 213 -91.30 gain 213 98 -94.10 gain 98 214 -90.84 gain 214 98 -99.03 gain 98 215 -83.83 gain 215 98 -87.42 gain 98 216 -93.86 gain 216 98 -101.36 gain 98 217 -93.68 gain 217 98 -101.44 gain 98 218 -98.76 gain 218 98 -99.33 gain 98 219 -90.63 gain 219 98 -91.68 gain 98 220 -87.77 gain 220 98 -84.91 gain 98 221 -99.31 gain 221 98 -102.13 gain 98 222 -96.23 gain 222 98 -94.85 gain 98 223 -87.00 gain 223 98 -88.86 gain 98 224 -104.13 gain 224 98 -106.45 gain 99 100 -63.59 gain 100 99 -63.50 gain 99 101 -73.65 gain 101 99 -77.20 gain 99 102 -80.14 gain 102 99 -83.65 gain 99 103 -85.27 gain 103 99 -89.95 gain 99 104 -84.71 gain 104 99 -91.88 gain 99 105 -95.40 gain 105 99 -97.09 gain 99 106 -93.04 gain 106 99 -92.06 gain 99 107 -80.89 gain 107 99 -79.81 gain 99 108 -89.44 gain 108 99 -87.98 gain 99 109 -83.88 gain 109 99 -85.87 gain 99 110 -76.15 gain 110 99 -84.50 gain 99 111 -75.12 gain 111 99 -73.44 gain 99 112 -74.08 gain 112 99 -75.87 gain 99 113 -66.42 gain 113 99 -67.33 gain 99 114 -65.68 gain 114 99 -63.76 gain 99 115 -68.64 gain 115 99 -67.37 gain 99 116 -72.56 gain 116 99 -73.73 gain 99 117 -77.16 gain 117 99 -75.47 gain 99 118 -90.11 gain 118 99 -90.04 gain 99 119 -91.41 gain 119 99 -96.40 gain 99 120 -100.90 gain 120 99 -103.28 gain 99 121 -93.17 gain 121 99 -96.57 gain 99 122 -92.28 gain 122 99 -95.42 gain 99 123 -91.09 gain 123 99 -94.58 gain 99 124 -91.65 gain 124 99 -93.12 gain 99 125 -86.40 gain 125 99 -91.21 gain 99 126 -78.55 gain 126 99 -80.01 gain 99 127 -74.36 gain 127 99 -75.45 gain 99 128 -75.89 gain 128 99 -79.58 gain 99 129 -64.27 gain 129 99 -65.17 gain 99 130 -77.04 gain 130 99 -79.23 gain 99 131 -76.98 gain 131 99 -78.94 gain 99 132 -78.53 gain 132 99 -76.49 gain 99 133 -79.15 gain 133 99 -82.29 gain 99 134 -91.76 gain 134 99 -91.76 gain 99 135 -87.80 gain 135 99 -90.11 gain 99 136 -96.53 gain 136 99 -99.28 gain 99 137 -89.29 gain 137 99 -94.95 gain 99 138 -84.95 gain 138 99 -84.15 gain 99 139 -83.91 gain 139 99 -86.37 gain 99 140 -88.61 gain 140 99 -91.90 gain 99 141 -82.12 gain 141 99 -77.37 gain 99 142 -82.52 gain 142 99 -84.52 gain 99 143 -78.56 gain 143 99 -83.29 gain 99 144 -78.32 gain 144 99 -81.42 gain 99 145 -75.28 gain 145 99 -81.77 gain 99 146 -84.94 gain 146 99 -87.42 gain 99 147 -86.63 gain 147 99 -86.22 gain 99 148 -88.59 gain 148 99 -86.50 gain 99 149 -85.72 gain 149 99 -87.29 gain 99 150 -88.86 gain 150 99 -91.27 gain 99 151 -87.56 gain 151 99 -88.91 gain 99 152 -82.87 gain 152 99 -84.04 gain 99 153 -88.33 gain 153 99 -88.71 gain 99 154 -87.38 gain 154 99 -89.66 gain 99 155 -91.58 gain 155 99 -92.44 gain 99 156 -88.00 gain 156 99 -88.08 gain 99 157 -76.13 gain 157 99 -78.70 gain 99 158 -75.21 gain 158 99 -77.28 gain 99 159 -83.81 gain 159 99 -88.27 gain 99 160 -82.08 gain 160 99 -83.69 gain 99 161 -84.83 gain 161 99 -88.88 gain 99 162 -80.29 gain 162 99 -84.05 gain 99 163 -83.85 gain 163 99 -89.52 gain 99 164 -82.59 gain 164 99 -87.63 gain 99 165 -90.52 gain 165 99 -92.62 gain 99 166 -89.46 gain 166 99 -91.31 gain 99 167 -87.17 gain 167 99 -89.75 gain 99 168 -82.25 gain 168 99 -83.72 gain 99 169 -93.32 gain 169 99 -95.90 gain 99 170 -77.56 gain 170 99 -79.38 gain 99 171 -91.77 gain 171 99 -94.66 gain 99 172 -85.93 gain 172 99 -87.01 gain 99 173 -77.65 gain 173 99 -83.38 gain 99 174 -78.94 gain 174 99 -80.72 gain 99 175 -84.76 gain 175 99 -87.68 gain 99 176 -78.26 gain 176 99 -80.14 gain 99 177 -89.50 gain 177 99 -94.39 gain 99 178 -81.98 gain 178 99 -80.31 gain 99 179 -83.39 gain 179 99 -81.14 gain 99 180 -96.76 gain 180 99 -103.96 gain 99 181 -96.40 gain 181 99 -97.62 gain 99 182 -91.93 gain 182 99 -94.23 gain 99 183 -90.58 gain 183 99 -93.16 gain 99 184 -87.16 gain 184 99 -92.49 gain 99 185 -85.15 gain 185 99 -94.34 gain 99 186 -86.07 gain 186 99 -90.85 gain 99 187 -87.47 gain 187 99 -89.97 gain 99 188 -93.21 gain 188 99 -98.13 gain 99 189 -86.89 gain 189 99 -86.53 gain 99 190 -78.43 gain 190 99 -81.99 gain 99 191 -84.92 gain 191 99 -87.18 gain 99 192 -85.57 gain 192 99 -86.53 gain 99 193 -90.80 gain 193 99 -90.74 gain 99 194 -93.10 gain 194 99 -93.82 gain 99 195 -101.02 gain 195 99 -100.29 gain 99 196 -95.50 gain 196 99 -99.09 gain 99 197 -94.20 gain 197 99 -92.92 gain 99 198 -97.13 gain 198 99 -100.36 gain 99 199 -90.70 gain 199 99 -94.04 gain 99 200 -93.49 gain 200 99 -98.17 gain 99 201 -87.71 gain 201 99 -92.29 gain 99 202 -88.16 gain 202 99 -91.88 gain 99 203 -81.82 gain 203 99 -84.65 gain 99 204 -88.94 gain 204 99 -88.42 gain 99 205 -91.41 gain 205 99 -94.62 gain 99 206 -80.66 gain 206 99 -84.98 gain 99 207 -84.55 gain 207 99 -88.30 gain 99 208 -90.41 gain 208 99 -96.75 gain 99 209 -88.54 gain 209 99 -94.46 gain 99 210 -85.97 gain 210 99 -92.06 gain 99 211 -97.52 gain 211 99 -98.84 gain 99 212 -93.60 gain 212 99 -97.93 gain 99 213 -96.21 gain 213 99 -99.88 gain 99 214 -91.96 gain 214 99 -101.01 gain 99 215 -92.25 gain 215 99 -96.70 gain 99 216 -96.79 gain 216 99 -105.15 gain 99 217 -93.32 gain 217 99 -101.94 gain 99 218 -89.93 gain 218 99 -91.36 gain 99 219 -88.21 gain 219 99 -90.12 gain 99 220 -91.11 gain 220 99 -89.11 gain 99 221 -94.17 gain 221 99 -97.85 gain 99 222 -81.81 gain 222 99 -81.30 gain 99 223 -90.73 gain 223 99 -93.45 gain 99 224 -98.86 gain 224 99 -102.05 gain 100 101 -68.45 gain 101 100 -72.08 gain 100 102 -70.73 gain 102 100 -74.32 gain 100 103 -75.10 gain 103 100 -79.87 gain 100 104 -82.02 gain 104 100 -89.27 gain 100 105 -96.77 gain 105 100 -98.54 gain 100 106 -87.02 gain 106 100 -86.12 gain 100 107 -84.85 gain 107 100 -83.86 gain 100 108 -93.06 gain 108 100 -91.68 gain 100 109 -76.64 gain 109 100 -78.71 gain 100 110 -85.12 gain 110 100 -93.56 gain 100 111 -88.45 gain 111 100 -86.85 gain 100 112 -73.23 gain 112 100 -75.10 gain 100 113 -66.28 gain 113 100 -67.28 gain 100 114 -65.66 gain 114 100 -63.82 gain 100 115 -62.89 gain 115 100 -61.71 gain 100 116 -64.70 gain 116 100 -65.95 gain 100 117 -61.33 gain 117 100 -59.72 gain 100 118 -78.87 gain 118 100 -78.89 gain 100 119 -76.94 gain 119 100 -82.01 gain 100 120 -92.92 gain 120 100 -95.37 gain 100 121 -89.03 gain 121 100 -92.51 gain 100 122 -103.06 gain 122 100 -106.29 gain 100 123 -88.63 gain 123 100 -92.20 gain 100 124 -94.70 gain 124 100 -96.26 gain 100 125 -90.78 gain 125 100 -95.68 gain 100 126 -82.29 gain 126 100 -83.84 gain 100 127 -77.52 gain 127 100 -78.69 gain 100 128 -75.62 gain 128 100 -79.38 gain 100 129 -72.04 gain 129 100 -73.01 gain 100 130 -71.91 gain 130 100 -74.18 gain 100 131 -71.17 gain 131 100 -73.21 gain 100 132 -73.22 gain 132 100 -71.27 gain 100 133 -84.52 gain 133 100 -87.74 gain 100 134 -84.50 gain 134 100 -84.59 gain 100 135 -94.70 gain 135 100 -97.09 gain 100 136 -93.85 gain 136 100 -96.68 gain 100 137 -91.75 gain 137 100 -97.50 gain 100 138 -90.61 gain 138 100 -89.88 gain 100 139 -82.61 gain 139 100 -85.15 gain 100 140 -85.42 gain 140 100 -88.79 gain 100 141 -80.76 gain 141 100 -76.10 gain 100 142 -84.60 gain 142 100 -86.68 gain 100 143 -79.87 gain 143 100 -84.69 gain 100 144 -83.24 gain 144 100 -86.43 gain 100 145 -69.38 gain 145 100 -75.96 gain 100 146 -76.31 gain 146 100 -78.87 gain 100 147 -76.44 gain 147 100 -76.11 gain 100 148 -74.56 gain 148 100 -72.56 gain 100 149 -86.55 gain 149 100 -88.21 gain 100 150 -97.09 gain 150 100 -99.59 gain 100 151 -89.07 gain 151 100 -90.50 gain 100 152 -88.88 gain 152 100 -90.13 gain 100 153 -94.12 gain 153 100 -94.58 gain 100 154 -92.30 gain 154 100 -94.67 gain 100 155 -89.36 gain 155 100 -90.30 gain 100 156 -79.41 gain 156 100 -79.58 gain 100 157 -79.18 gain 157 100 -81.84 gain 100 158 -89.39 gain 158 100 -91.55 gain 100 159 -83.06 gain 159 100 -87.60 gain 100 160 -83.40 gain 160 100 -85.09 gain 100 161 -70.57 gain 161 100 -74.70 gain 100 162 -81.51 gain 162 100 -85.35 gain 100 163 -84.62 gain 163 100 -90.37 gain 100 164 -91.24 gain 164 100 -96.36 gain 100 165 -87.91 gain 165 100 -90.09 gain 100 166 -93.23 gain 166 100 -95.16 gain 100 167 -93.56 gain 167 100 -96.22 gain 100 168 -98.78 gain 168 100 -100.33 gain 100 169 -89.17 gain 169 100 -91.83 gain 100 170 -85.66 gain 170 100 -87.56 gain 100 171 -83.86 gain 171 100 -86.84 gain 100 172 -83.81 gain 172 100 -84.98 gain 100 173 -77.54 gain 173 100 -83.35 gain 100 174 -82.92 gain 174 100 -84.78 gain 100 175 -86.35 gain 175 100 -89.35 gain 100 176 -78.26 gain 176 100 -80.23 gain 100 177 -82.97 gain 177 100 -87.94 gain 100 178 -87.22 gain 178 100 -85.63 gain 100 179 -89.66 gain 179 100 -87.49 gain 100 180 -94.37 gain 180 100 -101.66 gain 100 181 -91.77 gain 181 100 -93.07 gain 100 182 -93.79 gain 182 100 -96.18 gain 100 183 -91.90 gain 183 100 -94.57 gain 100 184 -87.22 gain 184 100 -92.63 gain 100 185 -88.99 gain 185 100 -98.26 gain 100 186 -89.57 gain 186 100 -94.42 gain 100 187 -80.89 gain 187 100 -83.48 gain 100 188 -88.89 gain 188 100 -93.89 gain 100 189 -84.40 gain 189 100 -84.13 gain 100 190 -77.39 gain 190 100 -81.03 gain 100 191 -83.50 gain 191 100 -85.85 gain 100 192 -85.48 gain 192 100 -86.52 gain 100 193 -89.64 gain 193 100 -89.67 gain 100 194 -89.84 gain 194 100 -90.65 gain 100 195 -96.18 gain 195 100 -95.54 gain 100 196 -86.19 gain 196 100 -89.86 gain 100 197 -91.12 gain 197 100 -89.92 gain 100 198 -103.70 gain 198 100 -107.01 gain 100 199 -89.01 gain 199 100 -92.43 gain 100 200 -90.84 gain 200 100 -95.60 gain 100 201 -94.15 gain 201 100 -98.81 gain 100 202 -94.23 gain 202 100 -98.04 gain 100 203 -88.88 gain 203 100 -91.79 gain 100 204 -94.87 gain 204 100 -94.43 gain 100 205 -88.07 gain 205 100 -91.37 gain 100 206 -96.57 gain 206 100 -100.98 gain 100 207 -92.76 gain 207 100 -96.59 gain 100 208 -89.53 gain 208 100 -95.95 gain 100 209 -94.18 gain 209 100 -100.18 gain 100 210 -90.98 gain 210 100 -97.16 gain 100 211 -100.27 gain 211 100 -101.68 gain 100 212 -89.38 gain 212 100 -93.79 gain 100 213 -101.58 gain 213 100 -105.33 gain 100 214 -95.54 gain 214 100 -104.67 gain 100 215 -87.40 gain 215 100 -91.93 gain 100 216 -84.53 gain 216 100 -92.98 gain 100 217 -85.83 gain 217 100 -94.54 gain 100 218 -91.81 gain 218 100 -93.32 gain 100 219 -90.76 gain 219 100 -92.75 gain 100 220 -85.59 gain 220 100 -83.68 gain 100 221 -92.37 gain 221 100 -96.13 gain 100 222 -87.25 gain 222 100 -86.82 gain 100 223 -92.69 gain 223 100 -95.50 gain 100 224 -86.32 gain 224 100 -89.60 gain 101 102 -69.39 gain 102 101 -69.35 gain 101 103 -81.29 gain 103 101 -82.43 gain 101 104 -87.89 gain 104 101 -91.51 gain 101 105 -92.04 gain 105 101 -90.18 gain 101 106 -96.49 gain 106 101 -91.96 gain 101 107 -90.89 gain 107 101 -86.26 gain 101 108 -94.85 gain 108 101 -89.85 gain 101 109 -91.46 gain 109 101 -89.91 gain 101 110 -93.39 gain 110 101 -98.19 gain 101 111 -88.88 gain 111 101 -83.65 gain 101 112 -84.40 gain 112 101 -82.63 gain 101 113 -77.54 gain 113 101 -74.91 gain 101 114 -77.50 gain 114 101 -72.03 gain 101 115 -77.32 gain 115 101 -72.51 gain 101 116 -68.26 gain 116 101 -65.87 gain 101 117 -70.52 gain 117 101 -65.28 gain 101 118 -73.61 gain 118 101 -70.00 gain 101 119 -81.24 gain 119 101 -82.68 gain 101 120 -96.21 gain 120 101 -95.04 gain 101 121 -99.41 gain 121 101 -99.26 gain 101 122 -99.54 gain 122 101 -99.14 gain 101 123 -98.13 gain 123 101 -98.07 gain 101 124 -88.43 gain 124 101 -86.36 gain 101 125 -90.07 gain 125 101 -91.34 gain 101 126 -91.19 gain 126 101 -89.11 gain 101 127 -81.98 gain 127 101 -79.52 gain 101 128 -84.04 gain 128 101 -84.18 gain 101 129 -82.49 gain 129 101 -79.84 gain 101 130 -77.85 gain 130 101 -76.48 gain 101 131 -74.44 gain 131 101 -72.85 gain 101 132 -75.53 gain 132 101 -69.95 gain 101 133 -79.92 gain 133 101 -79.51 gain 101 134 -78.31 gain 134 101 -74.77 gain 101 135 -100.95 gain 135 101 -99.71 gain 101 136 -91.58 gain 136 101 -90.79 gain 101 137 -95.51 gain 137 101 -97.62 gain 101 138 -92.31 gain 138 101 -87.95 gain 101 139 -88.77 gain 139 101 -87.68 gain 101 140 -84.82 gain 140 101 -84.56 gain 101 141 -96.77 gain 141 101 -88.48 gain 101 142 -94.42 gain 142 101 -92.88 gain 101 143 -78.12 gain 143 101 -79.31 gain 101 144 -70.26 gain 144 101 -69.82 gain 101 145 -80.36 gain 145 101 -83.30 gain 101 146 -78.20 gain 146 101 -77.14 gain 101 147 -87.45 gain 147 101 -83.49 gain 101 148 -84.27 gain 148 101 -78.64 gain 101 149 -83.01 gain 149 101 -81.04 gain 101 150 -99.27 gain 150 101 -98.14 gain 101 151 -97.85 gain 151 101 -95.65 gain 101 152 -96.21 gain 152 101 -93.83 gain 101 153 -86.06 gain 153 101 -82.89 gain 101 154 -93.40 gain 154 101 -92.13 gain 101 155 -82.47 gain 155 101 -79.77 gain 101 156 -85.95 gain 156 101 -82.49 gain 101 157 -84.77 gain 157 101 -83.79 gain 101 158 -90.90 gain 158 101 -89.42 gain 101 159 -86.62 gain 159 101 -87.52 gain 101 160 -82.72 gain 160 101 -80.78 gain 101 161 -87.22 gain 161 101 -87.72 gain 101 162 -88.51 gain 162 101 -88.72 gain 101 163 -85.09 gain 163 101 -87.21 gain 101 164 -81.03 gain 164 101 -82.52 gain 101 165 -100.40 gain 165 101 -98.95 gain 101 166 -93.66 gain 166 101 -91.96 gain 101 167 -96.82 gain 167 101 -95.85 gain 101 168 -88.80 gain 168 101 -86.72 gain 101 169 -93.38 gain 169 101 -92.42 gain 101 170 -97.56 gain 170 101 -95.83 gain 101 171 -95.04 gain 171 101 -94.38 gain 101 172 -92.34 gain 172 101 -89.87 gain 101 173 -92.30 gain 173 101 -94.48 gain 101 174 -89.93 gain 174 101 -88.16 gain 101 175 -78.10 gain 175 101 -77.46 gain 101 176 -86.15 gain 176 101 -84.48 gain 101 177 -87.78 gain 177 101 -89.12 gain 101 178 -90.04 gain 178 101 -84.82 gain 101 179 -92.41 gain 179 101 -86.61 gain 101 180 -99.10 gain 180 101 -102.75 gain 101 181 -94.44 gain 181 101 -92.11 gain 101 182 -94.12 gain 182 101 -92.87 gain 101 183 -99.96 gain 183 101 -98.99 gain 101 184 -94.80 gain 184 101 -96.58 gain 101 185 -98.71 gain 185 101 -104.36 gain 101 186 -97.76 gain 186 101 -98.98 gain 101 187 -89.32 gain 187 101 -88.27 gain 101 188 -88.50 gain 188 101 -89.87 gain 101 189 -89.65 gain 189 101 -85.74 gain 101 190 -91.18 gain 190 101 -91.19 gain 101 191 -89.17 gain 191 101 -87.88 gain 101 192 -93.75 gain 192 101 -91.16 gain 101 193 -89.91 gain 193 101 -86.30 gain 101 194 -95.30 gain 194 101 -92.48 gain 101 195 -101.60 gain 195 101 -97.33 gain 101 196 -103.98 gain 196 101 -104.02 gain 101 197 -90.13 gain 197 101 -85.30 gain 101 198 -98.60 gain 198 101 -98.28 gain 101 199 -92.52 gain 199 101 -92.31 gain 101 200 -97.67 gain 200 101 -98.79 gain 101 201 -95.29 gain 201 101 -96.32 gain 101 202 -95.33 gain 202 101 -95.50 gain 101 203 -85.14 gain 203 101 -84.42 gain 101 204 -85.44 gain 204 101 -81.36 gain 101 205 -91.24 gain 205 101 -90.90 gain 101 206 -91.24 gain 206 101 -92.01 gain 101 207 -91.96 gain 207 101 -92.16 gain 101 208 -98.53 gain 208 101 -101.32 gain 101 209 -92.06 gain 209 101 -94.43 gain 101 210 -105.29 gain 210 101 -107.83 gain 101 211 -98.89 gain 211 101 -96.66 gain 101 212 -95.54 gain 212 101 -96.33 gain 101 213 -96.57 gain 213 101 -96.69 gain 101 214 -102.35 gain 214 101 -107.86 gain 101 215 -101.28 gain 215 101 -102.18 gain 101 216 -93.26 gain 216 101 -98.07 gain 101 217 -99.02 gain 217 101 -104.10 gain 101 218 -96.91 gain 218 101 -94.79 gain 101 219 -98.21 gain 219 101 -96.57 gain 101 220 -93.24 gain 220 101 -87.69 gain 101 221 -99.09 gain 221 101 -99.21 gain 101 222 -91.60 gain 222 101 -87.53 gain 101 223 -93.22 gain 223 101 -92.40 gain 101 224 -96.25 gain 224 101 -95.90 gain 102 103 -60.98 gain 103 102 -62.15 gain 102 104 -69.12 gain 104 102 -72.78 gain 102 105 -98.35 gain 105 102 -96.53 gain 102 106 -91.23 gain 106 102 -86.73 gain 102 107 -93.00 gain 107 102 -88.40 gain 102 108 -84.29 gain 108 102 -79.32 gain 102 109 -92.89 gain 109 102 -91.37 gain 102 110 -99.13 gain 110 102 -103.97 gain 102 111 -97.13 gain 111 102 -91.93 gain 102 112 -88.02 gain 112 102 -86.29 gain 102 113 -85.42 gain 113 102 -82.82 gain 102 114 -90.19 gain 114 102 -84.75 gain 102 115 -81.33 gain 115 102 -76.55 gain 102 116 -64.26 gain 116 102 -61.92 gain 102 117 -68.71 gain 117 102 -63.50 gain 102 118 -71.85 gain 118 102 -68.27 gain 102 119 -79.31 gain 119 102 -80.79 gain 102 120 -99.48 gain 120 102 -98.34 gain 102 121 -100.06 gain 121 102 -99.94 gain 102 122 -96.71 gain 122 102 -96.34 gain 102 123 -92.70 gain 123 102 -92.68 gain 102 124 -98.20 gain 124 102 -96.16 gain 102 125 -95.15 gain 125 102 -96.45 gain 102 126 -85.52 gain 126 102 -83.47 gain 102 127 -88.50 gain 127 102 -86.08 gain 102 128 -87.95 gain 128 102 -88.12 gain 102 129 -86.62 gain 129 102 -84.00 gain 102 130 -83.06 gain 130 102 -81.74 gain 102 131 -73.19 gain 131 102 -71.64 gain 102 132 -74.98 gain 132 102 -69.44 gain 102 133 -77.66 gain 133 102 -77.29 gain 102 134 -82.05 gain 134 102 -78.54 gain 102 135 -97.69 gain 135 102 -96.49 gain 102 136 -96.78 gain 136 102 -96.01 gain 102 137 -92.69 gain 137 102 -94.84 gain 102 138 -94.54 gain 138 102 -90.22 gain 102 139 -90.07 gain 139 102 -89.01 gain 102 140 -91.97 gain 140 102 -91.74 gain 102 141 -95.57 gain 141 102 -87.32 gain 102 142 -90.41 gain 142 102 -88.89 gain 102 143 -82.68 gain 143 102 -83.91 gain 102 144 -85.71 gain 144 102 -85.30 gain 102 145 -80.59 gain 145 102 -83.57 gain 102 146 -82.05 gain 146 102 -81.01 gain 102 147 -78.23 gain 147 102 -74.31 gain 102 148 -83.06 gain 148 102 -77.47 gain 102 149 -88.65 gain 149 102 -86.71 gain 102 150 -102.32 gain 150 102 -101.22 gain 102 151 -102.67 gain 151 102 -100.51 gain 102 152 -94.10 gain 152 102 -91.76 gain 102 153 -93.04 gain 153 102 -89.91 gain 102 154 -95.67 gain 154 102 -94.44 gain 102 155 -93.19 gain 155 102 -90.53 gain 102 156 -96.88 gain 156 102 -93.45 gain 102 157 -92.96 gain 157 102 -92.02 gain 102 158 -88.50 gain 158 102 -87.05 gain 102 159 -87.71 gain 159 102 -88.65 gain 102 160 -80.77 gain 160 102 -78.86 gain 102 161 -91.16 gain 161 102 -91.70 gain 102 162 -77.80 gain 162 102 -78.04 gain 102 163 -86.40 gain 163 102 -88.56 gain 102 164 -73.80 gain 164 102 -75.33 gain 102 165 -95.64 gain 165 102 -94.23 gain 102 166 -99.00 gain 166 102 -97.34 gain 102 167 -93.71 gain 167 102 -92.77 gain 102 168 -104.04 gain 168 102 -101.99 gain 102 169 -92.52 gain 169 102 -91.59 gain 102 170 -93.87 gain 170 102 -92.17 gain 102 171 -90.19 gain 171 102 -89.58 gain 102 172 -90.88 gain 172 102 -88.46 gain 102 173 -104.04 gain 173 102 -106.26 gain 102 174 -89.99 gain 174 102 -88.26 gain 102 175 -93.24 gain 175 102 -92.64 gain 102 176 -84.34 gain 176 102 -82.71 gain 102 177 -86.83 gain 177 102 -88.20 gain 102 178 -88.20 gain 178 102 -83.01 gain 102 179 -82.97 gain 179 102 -77.21 gain 102 180 -99.57 gain 180 102 -103.25 gain 102 181 -98.46 gain 181 102 -96.17 gain 102 182 -94.24 gain 182 102 -93.03 gain 102 183 -100.33 gain 183 102 -99.40 gain 102 184 -101.77 gain 184 102 -103.59 gain 102 185 -99.73 gain 185 102 -105.41 gain 102 186 -92.68 gain 186 102 -93.94 gain 102 187 -98.49 gain 187 102 -97.48 gain 102 188 -91.65 gain 188 102 -93.06 gain 102 189 -92.23 gain 189 102 -88.36 gain 102 190 -87.87 gain 190 102 -87.91 gain 102 191 -97.40 gain 191 102 -96.15 gain 102 192 -89.85 gain 192 102 -87.30 gain 102 193 -89.98 gain 193 102 -86.41 gain 102 194 -86.16 gain 194 102 -83.37 gain 102 195 -107.95 gain 195 102 -103.71 gain 102 196 -102.35 gain 196 102 -102.42 gain 102 197 -98.64 gain 197 102 -93.85 gain 102 198 -94.83 gain 198 102 -94.55 gain 102 199 -103.28 gain 199 102 -103.10 gain 102 200 -98.16 gain 200 102 -99.32 gain 102 201 -87.50 gain 201 102 -88.57 gain 102 202 -87.59 gain 202 102 -87.80 gain 102 203 -87.42 gain 203 102 -86.74 gain 102 204 -90.80 gain 204 102 -86.76 gain 102 205 -88.73 gain 205 102 -88.43 gain 102 206 -92.24 gain 206 102 -93.05 gain 102 207 -86.78 gain 207 102 -87.01 gain 102 208 -93.31 gain 208 102 -96.14 gain 102 209 -91.11 gain 209 102 -93.51 gain 102 210 -95.85 gain 210 102 -98.43 gain 102 211 -108.89 gain 211 102 -106.70 gain 102 212 -101.27 gain 212 102 -102.09 gain 102 213 -104.51 gain 213 102 -104.66 gain 102 214 -101.47 gain 214 102 -107.01 gain 102 215 -93.69 gain 215 102 -94.63 gain 102 216 -89.52 gain 216 102 -94.37 gain 102 217 -96.59 gain 217 102 -101.70 gain 102 218 -96.16 gain 218 102 -94.07 gain 102 219 -98.75 gain 219 102 -97.15 gain 102 220 -93.51 gain 220 102 -88.00 gain 102 221 -92.36 gain 221 102 -92.52 gain 102 222 -90.02 gain 222 102 -85.99 gain 102 223 -96.64 gain 223 102 -95.86 gain 102 224 -93.55 gain 224 102 -93.23 gain 103 104 -65.34 gain 104 103 -67.82 gain 103 105 -101.26 gain 105 103 -98.27 gain 103 106 -101.68 gain 106 103 -96.01 gain 103 107 -98.14 gain 107 103 -92.38 gain 103 108 -97.63 gain 108 103 -91.49 gain 103 109 -98.33 gain 109 103 -95.64 gain 103 110 -94.94 gain 110 103 -98.61 gain 103 111 -92.79 gain 111 103 -86.42 gain 103 112 -90.12 gain 112 103 -87.22 gain 103 113 -86.02 gain 113 103 -82.25 gain 103 114 -84.99 gain 114 103 -78.39 gain 103 115 -82.58 gain 115 103 -76.64 gain 103 116 -72.69 gain 116 103 -69.18 gain 103 117 -68.65 gain 117 103 -62.28 gain 103 118 -62.66 gain 118 103 -57.91 gain 103 119 -72.74 gain 119 103 -73.05 gain 103 120 -101.57 gain 120 103 -99.26 gain 103 121 -104.95 gain 121 103 -103.66 gain 103 122 -92.48 gain 122 103 -90.94 gain 103 123 -96.48 gain 123 103 -95.28 gain 103 124 -98.29 gain 124 103 -95.08 gain 103 125 -100.57 gain 125 103 -100.70 gain 103 126 -89.75 gain 126 103 -86.54 gain 103 127 -95.93 gain 127 103 -92.33 gain 103 128 -96.41 gain 128 103 -95.42 gain 103 129 -90.39 gain 129 103 -86.60 gain 103 130 -77.32 gain 130 103 -74.82 gain 103 131 -78.31 gain 131 103 -75.58 gain 103 132 -75.10 gain 132 103 -68.38 gain 103 133 -69.46 gain 133 103 -67.92 gain 103 134 -73.92 gain 134 103 -69.25 gain 103 135 -99.47 gain 135 103 -97.09 gain 103 136 -99.16 gain 136 103 -97.23 gain 103 137 -103.41 gain 137 103 -104.39 gain 103 138 -96.91 gain 138 103 -91.42 gain 103 139 -94.69 gain 139 103 -92.46 gain 103 140 -96.96 gain 140 103 -95.57 gain 103 141 -89.94 gain 141 103 -80.52 gain 103 142 -93.69 gain 142 103 -91.01 gain 103 143 -86.00 gain 143 103 -86.05 gain 103 144 -94.94 gain 144 103 -93.36 gain 103 145 -83.30 gain 145 103 -85.11 gain 103 146 -84.44 gain 146 103 -82.24 gain 103 147 -76.09 gain 147 103 -71.00 gain 103 148 -77.68 gain 148 103 -70.92 gain 103 149 -87.85 gain 149 103 -84.74 gain 103 150 -100.30 gain 150 103 -98.02 gain 103 151 -101.03 gain 151 103 -97.70 gain 103 152 -103.19 gain 152 103 -99.67 gain 103 153 -98.96 gain 153 103 -94.66 gain 103 154 -98.64 gain 154 103 -96.24 gain 103 155 -93.18 gain 155 103 -89.35 gain 103 156 -91.45 gain 156 103 -86.86 gain 103 157 -93.62 gain 157 103 -91.51 gain 103 158 -96.30 gain 158 103 -93.69 gain 103 159 -89.27 gain 159 103 -89.04 gain 103 160 -90.95 gain 160 103 -87.87 gain 103 161 -85.85 gain 161 103 -85.21 gain 103 162 -86.89 gain 162 103 -85.97 gain 103 163 -80.78 gain 163 103 -81.77 gain 103 164 -84.98 gain 164 103 -85.33 gain 103 165 -101.04 gain 165 103 -98.46 gain 103 166 -102.95 gain 166 103 -100.12 gain 103 167 -103.37 gain 167 103 -101.26 gain 103 168 -97.38 gain 168 103 -94.17 gain 103 169 -93.44 gain 169 103 -91.34 gain 103 170 -98.16 gain 170 103 -95.29 gain 103 171 -94.21 gain 171 103 -92.42 gain 103 172 -94.66 gain 172 103 -91.06 gain 103 173 -90.54 gain 173 103 -91.59 gain 103 174 -94.00 gain 174 103 -91.10 gain 103 175 -90.04 gain 175 103 -88.27 gain 103 176 -99.36 gain 176 103 -96.56 gain 103 177 -95.14 gain 177 103 -95.34 gain 103 178 -92.53 gain 178 103 -86.18 gain 103 179 -89.49 gain 179 103 -82.56 gain 103 180 -99.41 gain 180 103 -101.92 gain 103 181 -100.35 gain 181 103 -96.89 gain 103 182 -100.81 gain 182 103 -98.43 gain 103 183 -103.47 gain 183 103 -101.37 gain 103 184 -100.15 gain 184 103 -100.80 gain 103 185 -101.21 gain 185 103 -105.72 gain 103 186 -93.37 gain 186 103 -93.46 gain 103 187 -95.91 gain 187 103 -93.73 gain 103 188 -91.65 gain 188 103 -91.88 gain 103 189 -95.89 gain 189 103 -90.85 gain 103 190 -93.56 gain 190 103 -92.44 gain 103 191 -93.83 gain 191 103 -91.41 gain 103 192 -91.58 gain 192 103 -87.86 gain 103 193 -94.35 gain 193 103 -89.61 gain 103 194 -92.44 gain 194 103 -88.49 gain 103 195 -100.97 gain 195 103 -95.56 gain 103 196 -97.89 gain 196 103 -96.79 gain 103 197 -100.24 gain 197 103 -94.28 gain 103 198 -103.30 gain 198 103 -101.85 gain 103 199 -100.19 gain 199 103 -98.85 gain 103 200 -102.32 gain 200 103 -102.32 gain 103 201 -94.44 gain 201 103 -94.35 gain 103 202 -97.43 gain 202 103 -96.47 gain 103 203 -101.17 gain 203 103 -99.32 gain 103 204 -95.18 gain 204 103 -89.97 gain 103 205 -89.90 gain 205 103 -88.44 gain 103 206 -88.82 gain 206 103 -88.46 gain 103 207 -94.09 gain 207 103 -93.15 gain 103 208 -96.21 gain 208 103 -97.87 gain 103 209 -90.99 gain 209 103 -92.23 gain 103 210 -102.81 gain 210 103 -104.22 gain 103 211 -99.23 gain 211 103 -95.87 gain 103 212 -98.35 gain 212 103 -98.00 gain 103 213 -98.25 gain 213 103 -97.23 gain 103 214 -104.86 gain 214 103 -109.23 gain 103 215 -93.49 gain 215 103 -93.26 gain 103 216 -99.42 gain 216 103 -103.10 gain 103 217 -103.20 gain 217 103 -107.14 gain 103 218 -91.57 gain 218 103 -88.32 gain 103 219 -96.58 gain 219 103 -93.81 gain 103 220 -95.95 gain 220 103 -89.27 gain 103 221 -96.59 gain 221 103 -95.58 gain 103 222 -91.79 gain 222 103 -86.59 gain 103 223 -100.06 gain 223 103 -98.10 gain 103 224 -93.49 gain 224 103 -92.01 gain 104 105 -106.69 gain 105 104 -101.22 gain 104 106 -107.34 gain 106 104 -99.19 gain 104 107 -101.06 gain 107 104 -92.82 gain 104 108 -101.19 gain 108 104 -92.56 gain 104 109 -105.02 gain 109 104 -99.85 gain 104 110 -98.71 gain 110 104 -99.90 gain 104 111 -92.98 gain 111 104 -84.13 gain 104 112 -94.70 gain 112 104 -89.32 gain 104 113 -96.58 gain 113 104 -90.33 gain 104 114 -81.10 gain 114 104 -72.01 gain 104 115 -83.58 gain 115 104 -75.15 gain 104 116 -81.97 gain 116 104 -75.97 gain 104 117 -86.83 gain 117 104 -77.98 gain 104 118 -76.61 gain 118 104 -69.37 gain 104 119 -67.74 gain 119 104 -65.56 gain 104 120 -103.76 gain 120 104 -98.97 gain 104 121 -113.37 gain 121 104 -109.60 gain 104 122 -111.49 gain 122 104 -107.47 gain 104 123 -102.08 gain 123 104 -98.40 gain 104 124 -103.70 gain 124 104 -98.01 gain 104 125 -95.40 gain 125 104 -93.05 gain 104 126 -102.96 gain 126 104 -97.26 gain 104 127 -97.04 gain 127 104 -90.96 gain 104 128 -96.35 gain 128 104 -92.87 gain 104 129 -90.85 gain 129 104 -84.58 gain 104 130 -91.16 gain 130 104 -86.18 gain 104 131 -87.18 gain 131 104 -81.98 gain 104 132 -78.74 gain 132 104 -69.54 gain 104 133 -72.34 gain 133 104 -68.31 gain 104 134 -76.16 gain 134 104 -69.00 gain 104 135 -102.91 gain 135 104 -98.05 gain 104 136 -102.45 gain 136 104 -98.03 gain 104 137 -106.39 gain 137 104 -104.89 gain 104 138 -98.42 gain 138 104 -90.44 gain 104 139 -98.44 gain 139 104 -93.74 gain 104 140 -97.96 gain 140 104 -94.08 gain 104 141 -103.43 gain 141 104 -91.52 gain 104 142 -102.01 gain 142 104 -96.85 gain 104 143 -90.02 gain 143 104 -87.59 gain 104 144 -89.65 gain 144 104 -85.59 gain 104 145 -87.49 gain 145 104 -86.82 gain 104 146 -90.47 gain 146 104 -85.79 gain 104 147 -86.40 gain 147 104 -78.82 gain 104 148 -75.23 gain 148 104 -65.98 gain 104 149 -85.56 gain 149 104 -79.97 gain 104 150 -107.92 gain 150 104 -103.16 gain 104 151 -106.99 gain 151 104 -101.17 gain 104 152 -108.14 gain 152 104 -102.15 gain 104 153 -102.83 gain 153 104 -96.04 gain 104 154 -103.41 gain 154 104 -98.53 gain 104 155 -97.76 gain 155 104 -91.45 gain 104 156 -91.77 gain 156 104 -84.69 gain 104 157 -100.79 gain 157 104 -96.20 gain 104 158 -98.52 gain 158 104 -93.42 gain 104 159 -97.64 gain 159 104 -94.93 gain 104 160 -89.59 gain 160 104 -84.03 gain 104 161 -89.98 gain 161 104 -86.86 gain 104 162 -86.04 gain 162 104 -82.64 gain 104 163 -87.57 gain 163 104 -86.07 gain 104 164 -87.86 gain 164 104 -85.74 gain 104 165 -107.56 gain 165 104 -102.49 gain 104 166 -112.75 gain 166 104 -107.44 gain 104 167 -103.36 gain 167 104 -98.77 gain 104 168 -103.79 gain 168 104 -98.09 gain 104 169 -97.58 gain 169 104 -93.00 gain 104 170 -102.62 gain 170 104 -97.27 gain 104 171 -97.70 gain 171 104 -93.43 gain 104 172 -96.24 gain 172 104 -90.16 gain 104 173 -95.74 gain 173 104 -94.31 gain 104 174 -99.33 gain 174 104 -93.95 gain 104 175 -95.08 gain 175 104 -90.83 gain 104 176 -91.82 gain 176 104 -86.54 gain 104 177 -94.47 gain 177 104 -92.19 gain 104 178 -93.77 gain 178 104 -84.93 gain 104 179 -92.61 gain 179 104 -83.20 gain 104 180 -99.92 gain 180 104 -99.96 gain 104 181 -106.64 gain 181 104 -100.70 gain 104 182 -102.69 gain 182 104 -97.83 gain 104 183 -103.88 gain 183 104 -99.29 gain 104 184 -99.04 gain 184 104 -97.21 gain 104 185 -98.40 gain 185 104 -100.43 gain 104 186 -107.94 gain 186 104 -105.55 gain 104 187 -97.35 gain 187 104 -92.69 gain 104 188 -93.47 gain 188 104 -91.22 gain 104 189 -94.70 gain 189 104 -87.18 gain 104 190 -92.15 gain 190 104 -88.55 gain 104 191 -94.34 gain 191 104 -89.44 gain 104 192 -88.31 gain 192 104 -82.10 gain 104 193 -97.29 gain 193 104 -90.07 gain 104 194 -88.69 gain 194 104 -82.26 gain 104 195 -108.42 gain 195 104 -100.53 gain 104 196 -105.72 gain 196 104 -102.14 gain 104 197 -101.79 gain 197 104 -93.35 gain 104 198 -103.62 gain 198 104 -99.69 gain 104 199 -104.69 gain 199 104 -100.86 gain 104 200 -96.22 gain 200 104 -93.73 gain 104 201 -91.93 gain 201 104 -89.35 gain 104 202 -98.88 gain 202 104 -95.43 gain 104 203 -99.53 gain 203 104 -95.19 gain 104 204 -94.61 gain 204 104 -86.92 gain 104 205 -94.58 gain 205 104 -90.64 gain 104 206 -95.35 gain 206 104 -92.51 gain 104 207 -102.87 gain 207 104 -99.45 gain 104 208 -92.17 gain 208 104 -91.35 gain 104 209 -91.41 gain 209 104 -90.16 gain 104 210 -103.36 gain 210 104 -102.29 gain 104 211 -98.47 gain 211 104 -92.63 gain 104 212 -109.89 gain 212 104 -107.07 gain 104 213 -114.18 gain 213 104 -110.67 gain 104 214 -103.43 gain 214 104 -105.32 gain 104 215 -94.06 gain 215 104 -91.34 gain 104 216 -101.85 gain 216 104 -103.05 gain 104 217 -94.73 gain 217 104 -96.18 gain 104 218 -100.59 gain 218 104 -94.86 gain 104 219 -97.33 gain 219 104 -92.08 gain 104 220 -97.48 gain 220 104 -88.31 gain 104 221 -102.27 gain 221 104 -98.78 gain 104 222 -97.76 gain 222 104 -90.08 gain 104 223 -100.07 gain 223 104 -95.63 gain 104 224 -98.21 gain 224 104 -94.23 gain 105 106 -61.88 gain 106 105 -59.21 gain 105 107 -82.68 gain 107 105 -79.91 gain 105 108 -74.30 gain 108 105 -71.15 gain 105 109 -78.01 gain 109 105 -78.32 gain 105 110 -81.12 gain 110 105 -87.79 gain 105 111 -91.17 gain 111 105 -87.81 gain 105 112 -92.96 gain 112 105 -93.06 gain 105 113 -98.65 gain 113 105 -97.88 gain 105 114 -92.27 gain 114 105 -88.67 gain 105 115 -95.34 gain 115 105 -92.39 gain 105 116 -89.41 gain 116 105 -88.89 gain 105 117 -97.51 gain 117 105 -94.13 gain 105 118 -98.84 gain 118 105 -97.08 gain 105 119 -91.84 gain 119 105 -95.14 gain 105 120 -64.57 gain 120 105 -65.26 gain 105 121 -77.29 gain 121 105 -79.00 gain 105 122 -75.88 gain 122 105 -77.35 gain 105 123 -75.88 gain 123 105 -77.68 gain 105 124 -85.08 gain 124 105 -84.87 gain 105 125 -87.54 gain 125 105 -90.67 gain 105 126 -90.08 gain 126 105 -89.85 gain 105 127 -91.57 gain 127 105 -90.97 gain 105 128 -96.84 gain 128 105 -98.83 gain 105 129 -87.36 gain 129 105 -86.57 gain 105 130 -93.17 gain 130 105 -93.67 gain 105 131 -99.05 gain 131 105 -99.33 gain 105 132 -91.47 gain 132 105 -87.74 gain 105 133 -95.09 gain 133 105 -96.55 gain 105 134 -97.32 gain 134 105 -95.64 gain 105 135 -72.19 gain 135 105 -72.81 gain 105 136 -72.01 gain 136 105 -73.08 gain 105 137 -72.92 gain 137 105 -76.90 gain 105 138 -87.25 gain 138 105 -84.76 gain 105 139 -84.17 gain 139 105 -84.94 gain 105 140 -86.55 gain 140 105 -88.15 gain 105 141 -91.66 gain 141 105 -85.23 gain 105 142 -98.24 gain 142 105 -98.55 gain 105 143 -94.92 gain 143 105 -97.98 gain 105 144 -94.10 gain 144 105 -95.52 gain 105 145 -89.87 gain 145 105 -94.68 gain 105 146 -96.07 gain 146 105 -96.87 gain 105 147 -98.90 gain 147 105 -96.81 gain 105 148 -93.96 gain 148 105 -90.20 gain 105 149 -100.97 gain 149 105 -100.86 gain 105 150 -77.51 gain 150 105 -78.24 gain 105 151 -83.75 gain 151 105 -83.41 gain 105 152 -80.68 gain 152 105 -80.16 gain 105 153 -88.77 gain 153 105 -87.46 gain 105 154 -82.83 gain 154 105 -83.43 gain 105 155 -85.83 gain 155 105 -85.00 gain 105 156 -86.74 gain 156 105 -85.14 gain 105 157 -97.77 gain 157 105 -98.66 gain 105 158 -91.48 gain 158 105 -91.87 gain 105 159 -101.58 gain 159 105 -104.34 gain 105 160 -94.60 gain 160 105 -94.52 gain 105 161 -93.46 gain 161 105 -95.82 gain 105 162 -97.70 gain 162 105 -99.77 gain 105 163 -98.71 gain 163 105 -102.69 gain 105 164 -100.58 gain 164 105 -103.94 gain 105 165 -85.67 gain 165 105 -86.08 gain 105 166 -78.49 gain 166 105 -78.66 gain 105 167 -88.08 gain 167 105 -88.96 gain 105 168 -82.28 gain 168 105 -82.06 gain 105 169 -91.00 gain 169 105 -91.89 gain 105 170 -85.28 gain 170 105 -85.41 gain 105 171 -84.13 gain 171 105 -85.34 gain 105 172 -92.53 gain 172 105 -91.93 gain 105 173 -92.10 gain 173 105 -96.14 gain 105 174 -92.44 gain 174 105 -92.53 gain 105 175 -96.44 gain 175 105 -97.66 gain 105 176 -101.94 gain 176 105 -102.13 gain 105 177 -94.75 gain 177 105 -97.95 gain 105 178 -96.17 gain 178 105 -92.82 gain 105 179 -103.12 gain 179 105 -99.19 gain 105 180 -91.18 gain 180 105 -96.69 gain 105 181 -89.91 gain 181 105 -89.44 gain 105 182 -85.39 gain 182 105 -86.01 gain 105 183 -87.74 gain 183 105 -88.64 gain 105 184 -86.77 gain 184 105 -90.41 gain 105 185 -92.95 gain 185 105 -100.45 gain 105 186 -92.13 gain 186 105 -95.22 gain 105 187 -96.20 gain 187 105 -97.02 gain 105 188 -92.22 gain 188 105 -95.45 gain 105 189 -91.40 gain 189 105 -89.35 gain 105 190 -99.98 gain 190 105 -101.85 gain 105 191 -100.63 gain 191 105 -101.20 gain 105 192 -96.42 gain 192 105 -95.69 gain 105 193 -101.37 gain 193 105 -99.63 gain 105 194 -106.28 gain 194 105 -105.32 gain 105 195 -86.93 gain 195 105 -84.52 gain 105 196 -86.60 gain 196 105 -88.50 gain 105 197 -81.69 gain 197 105 -78.73 gain 105 198 -90.38 gain 198 105 -91.93 gain 105 199 -87.31 gain 199 105 -88.96 gain 105 200 -94.27 gain 200 105 -97.26 gain 105 201 -93.59 gain 201 105 -96.49 gain 105 202 -92.00 gain 202 105 -94.03 gain 105 203 -94.49 gain 203 105 -95.63 gain 105 204 -98.69 gain 204 105 -96.47 gain 105 205 -90.85 gain 205 105 -92.38 gain 105 206 -97.25 gain 206 105 -99.89 gain 105 207 -91.64 gain 207 105 -93.70 gain 105 208 -98.42 gain 208 105 -103.08 gain 105 209 -96.42 gain 209 105 -100.65 gain 105 210 -93.62 gain 210 105 -98.03 gain 105 211 -90.75 gain 211 105 -90.39 gain 105 212 -89.59 gain 212 105 -92.24 gain 105 213 -86.84 gain 213 105 -88.82 gain 105 214 -96.35 gain 214 105 -103.71 gain 105 215 -93.56 gain 215 105 -96.32 gain 105 216 -94.26 gain 216 105 -100.93 gain 105 217 -96.72 gain 217 105 -103.66 gain 105 218 -99.31 gain 218 105 -99.05 gain 105 219 -95.61 gain 219 105 -95.84 gain 105 220 -92.86 gain 220 105 -89.17 gain 105 221 -97.71 gain 221 105 -99.71 gain 105 222 -100.05 gain 222 105 -97.85 gain 105 223 -103.56 gain 223 105 -104.60 gain 105 224 -92.72 gain 224 105 -94.22 gain 106 107 -61.29 gain 107 106 -61.19 gain 106 108 -69.61 gain 108 106 -69.14 gain 106 109 -75.66 gain 109 106 -78.63 gain 106 110 -82.30 gain 110 106 -91.64 gain 106 111 -86.03 gain 111 106 -85.33 gain 106 112 -86.54 gain 112 106 -89.31 gain 106 113 -85.36 gain 113 106 -87.25 gain 106 114 -89.83 gain 114 106 -88.89 gain 106 115 -90.67 gain 115 106 -90.39 gain 106 116 -86.98 gain 116 106 -89.13 gain 106 117 -95.63 gain 117 106 -94.92 gain 106 118 -96.20 gain 118 106 -97.11 gain 106 119 -103.04 gain 119 106 -109.01 gain 106 120 -56.52 gain 120 106 -59.88 gain 106 121 -60.91 gain 121 106 -65.28 gain 106 122 -56.57 gain 122 106 -60.70 gain 106 123 -73.70 gain 123 106 -78.17 gain 106 124 -76.29 gain 124 106 -78.75 gain 106 125 -78.50 gain 125 106 -84.29 gain 106 126 -84.28 gain 126 106 -86.73 gain 106 127 -85.11 gain 127 106 -87.18 gain 106 128 -81.88 gain 128 106 -86.54 gain 106 129 -89.07 gain 129 106 -90.94 gain 106 130 -91.03 gain 130 106 -94.20 gain 106 131 -93.44 gain 131 106 -96.38 gain 106 132 -91.82 gain 132 106 -90.77 gain 106 133 -92.14 gain 133 106 -96.27 gain 106 134 -89.74 gain 134 106 -90.73 gain 106 135 -70.14 gain 135 106 -73.43 gain 106 136 -71.98 gain 136 106 -75.71 gain 106 137 -74.87 gain 137 106 -81.52 gain 106 138 -73.67 gain 138 106 -73.85 gain 106 139 -75.85 gain 139 106 -79.29 gain 106 140 -81.08 gain 140 106 -85.34 gain 106 141 -94.90 gain 141 106 -91.14 gain 106 142 -88.88 gain 142 106 -91.86 gain 106 143 -91.04 gain 143 106 -96.76 gain 106 144 -91.44 gain 144 106 -95.52 gain 106 145 -93.60 gain 145 106 -101.07 gain 106 146 -95.01 gain 146 106 -98.48 gain 106 147 -99.01 gain 147 106 -99.58 gain 106 148 -93.75 gain 148 106 -92.65 gain 106 149 -98.05 gain 149 106 -100.60 gain 106 150 -87.11 gain 150 106 -90.50 gain 106 151 -70.14 gain 151 106 -72.47 gain 106 152 -79.04 gain 152 106 -81.20 gain 106 153 -79.24 gain 153 106 -80.60 gain 106 154 -80.98 gain 154 106 -84.24 gain 106 155 -82.78 gain 155 106 -84.62 gain 106 156 -87.69 gain 156 106 -88.76 gain 106 157 -91.20 gain 157 106 -94.75 gain 106 158 -83.36 gain 158 106 -86.41 gain 106 159 -91.39 gain 159 106 -96.82 gain 106 160 -85.05 gain 160 106 -87.64 gain 106 161 -96.54 gain 161 106 -101.57 gain 106 162 -96.51 gain 162 106 -101.25 gain 106 163 -103.06 gain 163 106 -109.71 gain 106 164 -102.74 gain 164 106 -108.76 gain 106 165 -79.64 gain 165 106 -82.72 gain 106 166 -76.58 gain 166 106 -79.41 gain 106 167 -85.70 gain 167 106 -89.26 gain 106 168 -81.69 gain 168 106 -84.14 gain 106 169 -81.15 gain 169 106 -84.72 gain 106 170 -77.39 gain 170 106 -80.19 gain 106 171 -85.13 gain 171 106 -89.01 gain 106 172 -87.89 gain 172 106 -89.95 gain 106 173 -85.15 gain 173 106 -91.86 gain 106 174 -90.78 gain 174 106 -93.54 gain 106 175 -94.77 gain 175 106 -98.67 gain 106 176 -100.25 gain 176 106 -103.11 gain 106 177 -92.62 gain 177 106 -98.49 gain 106 178 -102.68 gain 178 106 -101.99 gain 106 179 -96.23 gain 179 106 -94.96 gain 106 180 -82.58 gain 180 106 -90.76 gain 106 181 -81.94 gain 181 106 -84.15 gain 106 182 -80.44 gain 182 106 -83.72 gain 106 183 -83.14 gain 183 106 -86.70 gain 106 184 -79.85 gain 184 106 -86.16 gain 106 185 -88.00 gain 185 106 -98.18 gain 106 186 -85.40 gain 186 106 -91.15 gain 106 187 -98.69 gain 187 106 -102.18 gain 106 188 -86.29 gain 188 106 -92.18 gain 106 189 -89.32 gain 189 106 -89.94 gain 106 190 -90.33 gain 190 106 -94.87 gain 106 191 -95.99 gain 191 106 -99.23 gain 106 192 -94.63 gain 192 106 -96.57 gain 106 193 -100.91 gain 193 106 -101.84 gain 106 194 -94.17 gain 194 106 -95.88 gain 106 195 -84.03 gain 195 106 -84.29 gain 106 196 -82.96 gain 196 106 -87.52 gain 106 197 -86.09 gain 197 106 -85.80 gain 106 198 -83.40 gain 198 106 -87.62 gain 106 199 -85.68 gain 199 106 -90.00 gain 106 200 -83.32 gain 200 106 -88.98 gain 106 201 -91.83 gain 201 106 -97.39 gain 106 202 -89.46 gain 202 106 -94.16 gain 106 203 -89.99 gain 203 106 -93.80 gain 106 204 -99.63 gain 204 106 -100.09 gain 106 205 -95.37 gain 205 106 -99.57 gain 106 206 -96.77 gain 206 106 -102.08 gain 106 207 -95.73 gain 207 106 -100.46 gain 106 208 -93.33 gain 208 106 -100.66 gain 106 209 -98.96 gain 209 106 -105.86 gain 106 210 -83.09 gain 210 106 -90.16 gain 106 211 -91.74 gain 211 106 -94.04 gain 106 212 -90.63 gain 212 106 -95.95 gain 106 213 -85.75 gain 213 106 -90.40 gain 106 214 -81.98 gain 214 106 -92.01 gain 106 215 -93.06 gain 215 106 -98.49 gain 106 216 -89.38 gain 216 106 -98.72 gain 106 217 -88.74 gain 217 106 -98.35 gain 106 218 -90.42 gain 218 106 -92.83 gain 106 219 -91.99 gain 219 106 -94.89 gain 106 220 -93.16 gain 220 106 -92.14 gain 106 221 -91.65 gain 221 106 -96.31 gain 106 222 -91.72 gain 222 106 -92.19 gain 106 223 -96.65 gain 223 106 -100.36 gain 106 224 -98.71 gain 224 106 -102.89 gain 107 108 -52.31 gain 108 107 -51.93 gain 107 109 -72.54 gain 109 107 -75.61 gain 107 110 -81.58 gain 110 107 -91.01 gain 107 111 -81.14 gain 111 107 -80.54 gain 107 112 -77.29 gain 112 107 -80.15 gain 107 113 -84.09 gain 113 107 -86.08 gain 107 114 -93.45 gain 114 107 -92.60 gain 107 115 -95.89 gain 115 107 -95.71 gain 107 116 -88.00 gain 116 107 -90.25 gain 107 117 -87.20 gain 117 107 -86.58 gain 107 118 -94.62 gain 118 107 -95.63 gain 107 119 -97.85 gain 119 107 -103.92 gain 107 120 -68.33 gain 120 107 -71.78 gain 107 121 -72.97 gain 121 107 -77.45 gain 107 122 -58.74 gain 122 107 -62.97 gain 107 123 -66.41 gain 123 107 -70.98 gain 107 124 -73.01 gain 124 107 -75.56 gain 107 125 -75.96 gain 125 107 -81.85 gain 107 126 -81.70 gain 126 107 -84.24 gain 107 127 -90.40 gain 127 107 -92.56 gain 107 128 -86.71 gain 128 107 -91.47 gain 107 129 -87.18 gain 129 107 -89.15 gain 107 130 -86.98 gain 130 107 -90.24 gain 107 131 -88.12 gain 131 107 -91.16 gain 107 132 -92.73 gain 132 107 -91.77 gain 107 133 -89.33 gain 133 107 -93.55 gain 107 134 -95.11 gain 134 107 -96.19 gain 107 135 -71.16 gain 135 107 -74.55 gain 107 136 -62.99 gain 136 107 -66.82 gain 107 137 -69.26 gain 137 107 -76.01 gain 107 138 -72.54 gain 138 107 -72.81 gain 107 139 -77.43 gain 139 107 -80.96 gain 107 140 -77.38 gain 140 107 -81.74 gain 107 141 -81.19 gain 141 107 -77.52 gain 107 142 -86.24 gain 142 107 -89.32 gain 107 143 -86.55 gain 143 107 -92.36 gain 107 144 -83.54 gain 144 107 -87.72 gain 107 145 -91.61 gain 145 107 -99.18 gain 107 146 -87.02 gain 146 107 -90.58 gain 107 147 -96.18 gain 147 107 -96.84 gain 107 148 -90.95 gain 148 107 -89.95 gain 107 149 -91.66 gain 149 107 -94.31 gain 107 150 -85.48 gain 150 107 -88.97 gain 107 151 -72.06 gain 151 107 -74.49 gain 107 152 -82.37 gain 152 107 -84.61 gain 107 153 -74.78 gain 153 107 -76.24 gain 107 154 -70.91 gain 154 107 -74.27 gain 107 155 -81.90 gain 155 107 -83.84 gain 107 156 -76.47 gain 156 107 -77.64 gain 107 157 -83.44 gain 157 107 -87.09 gain 107 158 -82.13 gain 158 107 -85.28 gain 107 159 -82.96 gain 159 107 -88.49 gain 107 160 -85.42 gain 160 107 -88.11 gain 107 161 -92.38 gain 161 107 -97.50 gain 107 162 -94.48 gain 162 107 -99.31 gain 107 163 -86.20 gain 163 107 -92.95 gain 107 164 -95.46 gain 164 107 -101.58 gain 107 165 -79.71 gain 165 107 -82.89 gain 107 166 -83.33 gain 166 107 -86.25 gain 107 167 -85.07 gain 167 107 -88.72 gain 107 168 -81.90 gain 168 107 -84.45 gain 107 169 -82.82 gain 169 107 -86.48 gain 107 170 -80.01 gain 170 107 -82.90 gain 107 171 -85.93 gain 171 107 -89.90 gain 107 172 -81.93 gain 172 107 -84.09 gain 107 173 -93.51 gain 173 107 -100.32 gain 107 174 -90.37 gain 174 107 -93.23 gain 107 175 -84.76 gain 175 107 -88.75 gain 107 176 -92.96 gain 176 107 -95.92 gain 107 177 -88.52 gain 177 107 -94.48 gain 107 178 -97.13 gain 178 107 -96.53 gain 107 179 -96.39 gain 179 107 -95.22 gain 107 180 -83.09 gain 180 107 -91.37 gain 107 181 -77.50 gain 181 107 -79.80 gain 107 182 -89.70 gain 182 107 -93.08 gain 107 183 -87.83 gain 183 107 -91.49 gain 107 184 -89.39 gain 184 107 -95.79 gain 107 185 -91.91 gain 185 107 -102.18 gain 107 186 -84.60 gain 186 107 -90.45 gain 107 187 -83.35 gain 187 107 -86.93 gain 107 188 -87.38 gain 188 107 -93.37 gain 107 189 -89.15 gain 189 107 -89.87 gain 107 190 -90.08 gain 190 107 -94.71 gain 107 191 -93.55 gain 191 107 -96.89 gain 107 192 -96.62 gain 192 107 -98.65 gain 107 193 -92.19 gain 193 107 -93.21 gain 107 194 -97.87 gain 194 107 -99.68 gain 107 195 -85.94 gain 195 107 -86.29 gain 107 196 -86.98 gain 196 107 -91.64 gain 107 197 -87.77 gain 197 107 -87.57 gain 107 198 -84.67 gain 198 107 -88.98 gain 107 199 -91.85 gain 199 107 -96.27 gain 107 200 -85.95 gain 200 107 -91.70 gain 107 201 -90.11 gain 201 107 -95.77 gain 107 202 -85.04 gain 202 107 -89.84 gain 107 203 -97.76 gain 203 107 -101.67 gain 107 204 -87.68 gain 204 107 -88.24 gain 107 205 -87.73 gain 205 107 -92.02 gain 107 206 -98.85 gain 206 107 -104.26 gain 107 207 -90.78 gain 207 107 -95.60 gain 107 208 -93.45 gain 208 107 -100.87 gain 107 209 -94.74 gain 209 107 -101.74 gain 107 210 -78.03 gain 210 107 -85.20 gain 107 211 -76.65 gain 211 107 -79.05 gain 107 212 -86.07 gain 212 107 -91.48 gain 107 213 -91.00 gain 213 107 -95.74 gain 107 214 -87.86 gain 214 107 -97.99 gain 107 215 -88.39 gain 215 107 -93.92 gain 107 216 -91.16 gain 216 107 -100.60 gain 107 217 -87.77 gain 217 107 -97.47 gain 107 218 -93.94 gain 218 107 -96.45 gain 107 219 -89.30 gain 219 107 -92.29 gain 107 220 -90.39 gain 220 107 -89.46 gain 107 221 -96.55 gain 221 107 -101.31 gain 107 222 -96.41 gain 222 107 -96.98 gain 107 223 -96.63 gain 223 107 -100.43 gain 107 224 -100.08 gain 224 107 -104.35 gain 108 109 -57.18 gain 109 108 -60.63 gain 108 110 -70.94 gain 110 108 -80.76 gain 108 111 -75.11 gain 111 108 -74.89 gain 108 112 -78.54 gain 112 108 -81.78 gain 108 113 -77.24 gain 113 108 -79.61 gain 108 114 -83.20 gain 114 108 -82.74 gain 108 115 -83.39 gain 115 108 -83.58 gain 108 116 -90.95 gain 116 108 -93.57 gain 108 117 -84.21 gain 117 108 -83.98 gain 108 118 -89.81 gain 118 108 -91.20 gain 108 119 -86.92 gain 119 108 -93.36 gain 108 120 -75.28 gain 120 108 -79.12 gain 108 121 -73.56 gain 121 108 -78.42 gain 108 122 -59.41 gain 122 108 -64.02 gain 108 123 -57.24 gain 123 108 -62.18 gain 108 124 -64.61 gain 124 108 -67.55 gain 108 125 -71.80 gain 125 108 -78.07 gain 108 126 -68.49 gain 126 108 -71.41 gain 108 127 -84.87 gain 127 108 -87.42 gain 108 128 -78.14 gain 128 108 -83.29 gain 108 129 -76.90 gain 129 108 -79.25 gain 108 130 -87.04 gain 130 108 -90.69 gain 108 131 -86.41 gain 131 108 -89.83 gain 108 132 -93.07 gain 132 108 -92.49 gain 108 133 -96.91 gain 133 108 -101.51 gain 108 134 -96.80 gain 134 108 -98.27 gain 108 135 -78.89 gain 135 108 -82.65 gain 108 136 -77.25 gain 136 108 -81.46 gain 108 137 -71.82 gain 137 108 -78.94 gain 108 138 -71.63 gain 138 108 -72.28 gain 108 139 -69.04 gain 139 108 -72.96 gain 108 140 -71.13 gain 140 108 -75.87 gain 108 141 -78.17 gain 141 108 -74.89 gain 108 142 -78.94 gain 142 108 -82.40 gain 108 143 -84.16 gain 143 108 -90.36 gain 108 144 -82.66 gain 144 108 -87.22 gain 108 145 -83.63 gain 145 108 -91.58 gain 108 146 -88.47 gain 146 108 -92.41 gain 108 147 -92.62 gain 147 108 -93.67 gain 108 148 -91.81 gain 148 108 -91.18 gain 108 149 -98.13 gain 149 108 -101.16 gain 108 150 -82.52 gain 150 108 -86.39 gain 108 151 -72.68 gain 151 108 -75.49 gain 108 152 -81.31 gain 152 108 -83.94 gain 108 153 -78.88 gain 153 108 -80.72 gain 108 154 -81.14 gain 154 108 -84.89 gain 108 155 -80.10 gain 155 108 -82.42 gain 108 156 -80.52 gain 156 108 -82.07 gain 108 157 -79.45 gain 157 108 -83.48 gain 108 158 -75.50 gain 158 108 -79.03 gain 108 159 -91.10 gain 159 108 -97.01 gain 108 160 -85.51 gain 160 108 -88.58 gain 108 161 -87.32 gain 161 108 -92.83 gain 108 162 -92.60 gain 162 108 -97.81 gain 108 163 -86.06 gain 163 108 -93.19 gain 108 164 -87.86 gain 164 108 -94.36 gain 108 165 -85.28 gain 165 108 -88.84 gain 108 166 -80.14 gain 166 108 -83.45 gain 108 167 -79.09 gain 167 108 -83.12 gain 108 168 -83.82 gain 168 108 -86.75 gain 108 169 -82.18 gain 169 108 -86.22 gain 108 170 -87.37 gain 170 108 -90.64 gain 108 171 -83.94 gain 171 108 -88.29 gain 108 172 -84.72 gain 172 108 -87.26 gain 108 173 -80.89 gain 173 108 -88.08 gain 108 174 -88.23 gain 174 108 -91.47 gain 108 175 -90.08 gain 175 108 -94.45 gain 108 176 -90.27 gain 176 108 -93.62 gain 108 177 -85.05 gain 177 108 -91.40 gain 108 178 -94.04 gain 178 108 -93.83 gain 108 179 -91.70 gain 179 108 -90.91 gain 108 180 -81.80 gain 180 108 -90.46 gain 108 181 -77.29 gain 181 108 -79.97 gain 108 182 -78.56 gain 182 108 -82.33 gain 108 183 -80.26 gain 183 108 -84.30 gain 108 184 -87.07 gain 184 108 -93.85 gain 108 185 -81.65 gain 185 108 -92.31 gain 108 186 -89.96 gain 186 108 -96.19 gain 108 187 -85.53 gain 187 108 -89.50 gain 108 188 -82.49 gain 188 108 -88.86 gain 108 189 -91.25 gain 189 108 -92.35 gain 108 190 -93.13 gain 190 108 -98.14 gain 108 191 -92.33 gain 191 108 -96.05 gain 108 192 -88.94 gain 192 108 -91.36 gain 108 193 -87.15 gain 193 108 -88.56 gain 108 194 -90.48 gain 194 108 -92.66 gain 108 195 -90.09 gain 195 108 -90.83 gain 108 196 -85.16 gain 196 108 -90.20 gain 108 197 -78.32 gain 197 108 -78.49 gain 108 198 -91.35 gain 198 108 -96.04 gain 108 199 -87.39 gain 199 108 -92.18 gain 108 200 -81.96 gain 200 108 -88.09 gain 108 201 -87.19 gain 201 108 -93.23 gain 108 202 -93.95 gain 202 108 -99.13 gain 108 203 -86.44 gain 203 108 -90.74 gain 108 204 -83.70 gain 204 108 -84.64 gain 108 205 -93.58 gain 205 108 -98.26 gain 108 206 -89.11 gain 206 108 -94.90 gain 108 207 -86.08 gain 207 108 -91.29 gain 108 208 -96.37 gain 208 108 -104.17 gain 108 209 -96.52 gain 209 108 -103.90 gain 108 210 -85.30 gain 210 108 -92.85 gain 108 211 -85.42 gain 211 108 -88.20 gain 108 212 -91.29 gain 212 108 -97.09 gain 108 213 -94.60 gain 213 108 -99.73 gain 108 214 -87.03 gain 214 108 -97.54 gain 108 215 -90.55 gain 215 108 -96.46 gain 108 216 -87.20 gain 216 108 -97.02 gain 108 217 -90.55 gain 217 108 -100.64 gain 108 218 -88.56 gain 218 108 -91.45 gain 108 219 -89.01 gain 219 108 -92.38 gain 108 220 -88.48 gain 220 108 -87.94 gain 108 221 -96.26 gain 221 108 -101.39 gain 108 222 -98.85 gain 222 108 -99.79 gain 108 223 -98.43 gain 223 108 -102.61 gain 108 224 -101.50 gain 224 108 -106.15 gain 109 110 -64.76 gain 110 109 -71.12 gain 109 111 -65.87 gain 111 109 -62.20 gain 109 112 -79.30 gain 112 109 -79.09 gain 109 113 -79.66 gain 113 109 -78.58 gain 109 114 -85.06 gain 114 109 -81.15 gain 109 115 -94.75 gain 115 109 -91.49 gain 109 116 -88.27 gain 116 109 -87.45 gain 109 117 -98.14 gain 117 109 -94.46 gain 109 118 -92.58 gain 118 109 -90.52 gain 109 119 -90.01 gain 119 109 -93.01 gain 109 120 -90.11 gain 120 109 -90.49 gain 109 121 -80.31 gain 121 109 -81.72 gain 109 122 -77.23 gain 122 109 -78.38 gain 109 123 -72.71 gain 123 109 -74.21 gain 109 124 -69.68 gain 124 109 -69.16 gain 109 125 -67.74 gain 125 109 -70.56 gain 109 126 -74.04 gain 126 109 -73.51 gain 109 127 -79.10 gain 127 109 -78.20 gain 109 128 -80.34 gain 128 109 -82.03 gain 109 129 -85.66 gain 129 109 -84.56 gain 109 130 -93.16 gain 130 109 -93.35 gain 109 131 -94.25 gain 131 109 -94.21 gain 109 132 -91.40 gain 132 109 -87.37 gain 109 133 -94.77 gain 133 109 -95.92 gain 109 134 -90.77 gain 134 109 -88.78 gain 109 135 -75.82 gain 135 109 -76.13 gain 109 136 -82.22 gain 136 109 -82.98 gain 109 137 -78.05 gain 137 109 -81.72 gain 109 138 -81.29 gain 138 109 -78.49 gain 109 139 -77.25 gain 139 109 -77.72 gain 109 140 -78.30 gain 140 109 -79.60 gain 109 141 -82.74 gain 141 109 -76.01 gain 109 142 -81.73 gain 142 109 -81.74 gain 109 143 -90.33 gain 143 109 -93.07 gain 109 144 -83.48 gain 144 109 -84.59 gain 109 145 -91.42 gain 145 109 -95.92 gain 109 146 -91.34 gain 146 109 -91.83 gain 109 147 -95.74 gain 147 109 -93.34 gain 109 148 -89.28 gain 148 109 -85.21 gain 109 149 -92.54 gain 149 109 -92.12 gain 109 150 -87.95 gain 150 109 -88.37 gain 109 151 -86.48 gain 151 109 -85.84 gain 109 152 -79.54 gain 152 109 -78.71 gain 109 153 -82.54 gain 153 109 -80.93 gain 109 154 -81.35 gain 154 109 -81.64 gain 109 155 -78.06 gain 155 109 -76.93 gain 109 156 -84.84 gain 156 109 -82.94 gain 109 157 -85.70 gain 157 109 -86.28 gain 109 158 -82.52 gain 158 109 -82.60 gain 109 159 -89.12 gain 159 109 -91.58 gain 109 160 -89.62 gain 160 109 -89.24 gain 109 161 -89.61 gain 161 109 -91.66 gain 109 162 -84.80 gain 162 109 -86.56 gain 109 163 -100.37 gain 163 109 -104.05 gain 109 164 -102.28 gain 164 109 -105.33 gain 109 165 -85.99 gain 165 109 -86.10 gain 109 166 -78.91 gain 166 109 -78.77 gain 109 167 -82.82 gain 167 109 -83.40 gain 109 168 -81.29 gain 168 109 -80.77 gain 109 169 -83.79 gain 169 109 -84.38 gain 109 170 -89.67 gain 170 109 -89.50 gain 109 171 -87.80 gain 171 109 -88.70 gain 109 172 -84.49 gain 172 109 -83.58 gain 109 173 -89.86 gain 173 109 -93.60 gain 109 174 -97.32 gain 174 109 -97.11 gain 109 175 -87.42 gain 175 109 -88.35 gain 109 176 -86.93 gain 176 109 -86.82 gain 109 177 -91.94 gain 177 109 -94.83 gain 109 178 -98.41 gain 178 109 -94.75 gain 109 179 -90.32 gain 179 109 -86.08 gain 109 180 -87.60 gain 180 109 -92.80 gain 109 181 -85.36 gain 181 109 -84.59 gain 109 182 -90.27 gain 182 109 -90.58 gain 109 183 -90.01 gain 183 109 -90.60 gain 109 184 -83.99 gain 184 109 -87.33 gain 109 185 -87.55 gain 185 109 -94.76 gain 109 186 -82.74 gain 186 109 -85.53 gain 109 187 -87.79 gain 187 109 -88.30 gain 109 188 -90.19 gain 188 109 -93.11 gain 109 189 -89.53 gain 189 109 -87.18 gain 109 190 -89.66 gain 190 109 -91.23 gain 109 191 -94.13 gain 191 109 -94.40 gain 109 192 -93.08 gain 192 109 -92.05 gain 109 193 -100.98 gain 193 109 -98.93 gain 109 194 -96.66 gain 194 109 -95.40 gain 109 195 -89.80 gain 195 109 -87.08 gain 109 196 -89.32 gain 196 109 -90.91 gain 109 197 -84.88 gain 197 109 -81.61 gain 109 198 -93.07 gain 198 109 -94.31 gain 109 199 -95.04 gain 199 109 -96.38 gain 109 200 -90.21 gain 200 109 -92.90 gain 109 201 -96.55 gain 201 109 -99.14 gain 109 202 -89.05 gain 202 109 -90.78 gain 109 203 -95.97 gain 203 109 -96.81 gain 109 204 -91.17 gain 204 109 -88.66 gain 109 205 -87.37 gain 205 109 -88.60 gain 109 206 -91.08 gain 206 109 -93.41 gain 109 207 -87.02 gain 207 109 -88.77 gain 109 208 -97.65 gain 208 109 -102.00 gain 109 209 -97.07 gain 209 109 -100.99 gain 109 210 -90.27 gain 210 109 -94.37 gain 109 211 -91.96 gain 211 109 -91.29 gain 109 212 -88.82 gain 212 109 -91.17 gain 109 213 -93.63 gain 213 109 -95.30 gain 109 214 -92.60 gain 214 109 -99.66 gain 109 215 -88.22 gain 215 109 -90.68 gain 109 216 -86.74 gain 216 109 -93.11 gain 109 217 -81.21 gain 217 109 -87.84 gain 109 218 -99.67 gain 218 109 -99.11 gain 109 219 -102.28 gain 219 109 -102.20 gain 109 220 -91.15 gain 220 109 -87.15 gain 109 221 -93.43 gain 221 109 -95.11 gain 109 222 -101.44 gain 222 109 -98.93 gain 109 223 -95.01 gain 223 109 -95.74 gain 109 224 -93.16 gain 224 109 -94.36 gain 110 111 -69.72 gain 111 110 -59.69 gain 110 112 -79.03 gain 112 110 -72.46 gain 110 113 -84.20 gain 113 110 -76.76 gain 110 114 -88.82 gain 114 110 -78.55 gain 110 115 -97.21 gain 115 110 -87.59 gain 110 116 -92.66 gain 116 110 -85.47 gain 110 117 -102.95 gain 117 110 -92.91 gain 110 118 -103.70 gain 118 110 -95.28 gain 110 119 -98.86 gain 119 110 -95.50 gain 110 120 -88.51 gain 120 110 -82.53 gain 110 121 -90.19 gain 121 110 -85.23 gain 110 122 -80.42 gain 122 110 -75.21 gain 110 123 -78.99 gain 123 110 -74.12 gain 110 124 -76.09 gain 124 110 -69.21 gain 110 125 -69.66 gain 125 110 -66.12 gain 110 126 -74.10 gain 126 110 -67.21 gain 110 127 -76.55 gain 127 110 -69.28 gain 110 128 -79.97 gain 128 110 -75.30 gain 110 129 -97.44 gain 129 110 -89.98 gain 110 130 -96.26 gain 130 110 -90.10 gain 110 131 -92.40 gain 131 110 -86.01 gain 110 132 -104.92 gain 132 110 -94.54 gain 110 133 -94.40 gain 133 110 -89.19 gain 110 134 -104.40 gain 134 110 -96.05 gain 110 135 -93.38 gain 135 110 -87.34 gain 110 136 -90.32 gain 136 110 -84.71 gain 110 137 -91.19 gain 137 110 -88.50 gain 110 138 -90.62 gain 138 110 -81.46 gain 110 139 -87.25 gain 139 110 -81.36 gain 110 140 -90.03 gain 140 110 -84.97 gain 110 141 -82.82 gain 141 110 -69.73 gain 110 142 -80.62 gain 142 110 -74.27 gain 110 143 -87.73 gain 143 110 -84.11 gain 110 144 -85.84 gain 144 110 -80.59 gain 110 145 -97.05 gain 145 110 -95.18 gain 110 146 -91.03 gain 146 110 -85.16 gain 110 147 -100.78 gain 147 110 -92.02 gain 110 148 -94.65 gain 148 110 -84.22 gain 110 149 -96.39 gain 149 110 -89.61 gain 110 150 -94.24 gain 150 110 -88.30 gain 110 151 -87.71 gain 151 110 -80.71 gain 110 152 -83.41 gain 152 110 -76.23 gain 110 153 -92.65 gain 153 110 -84.68 gain 110 154 -82.08 gain 154 110 -76.01 gain 110 155 -86.01 gain 155 110 -78.51 gain 110 156 -87.07 gain 156 110 -78.81 gain 110 157 -87.59 gain 157 110 -81.81 gain 110 158 -92.51 gain 158 110 -86.23 gain 110 159 -89.41 gain 159 110 -85.51 gain 110 160 -95.63 gain 160 110 -88.89 gain 110 161 -97.20 gain 161 110 -92.90 gain 110 162 -87.52 gain 162 110 -82.92 gain 110 163 -95.55 gain 163 110 -92.87 gain 110 164 -101.30 gain 164 110 -97.99 gain 110 165 -100.87 gain 165 110 -94.62 gain 110 166 -92.13 gain 166 110 -85.63 gain 110 167 -87.44 gain 167 110 -81.66 gain 110 168 -91.33 gain 168 110 -84.44 gain 110 169 -89.77 gain 169 110 -84.00 gain 110 170 -88.35 gain 170 110 -81.82 gain 110 171 -89.44 gain 171 110 -83.99 gain 110 172 -88.76 gain 172 110 -81.49 gain 110 173 -88.07 gain 173 110 -85.45 gain 110 174 -92.09 gain 174 110 -85.52 gain 110 175 -96.93 gain 175 110 -91.49 gain 110 176 -102.02 gain 176 110 -95.56 gain 110 177 -102.72 gain 177 110 -99.26 gain 110 178 -96.54 gain 178 110 -86.51 gain 110 179 -101.02 gain 179 110 -90.42 gain 110 180 -98.78 gain 180 110 -97.62 gain 110 181 -94.60 gain 181 110 -87.47 gain 110 182 -93.88 gain 182 110 -87.83 gain 110 183 -89.39 gain 183 110 -83.62 gain 110 184 -95.33 gain 184 110 -92.30 gain 110 185 -98.36 gain 185 110 -99.20 gain 110 186 -92.98 gain 186 110 -89.40 gain 110 187 -92.06 gain 187 110 -86.22 gain 110 188 -94.21 gain 188 110 -90.77 gain 110 189 -99.04 gain 189 110 -90.33 gain 110 190 -94.49 gain 190 110 -89.70 gain 110 191 -101.22 gain 191 110 -95.13 gain 110 192 -102.67 gain 192 110 -95.28 gain 110 193 -92.25 gain 193 110 -83.85 gain 110 194 -101.02 gain 194 110 -93.40 gain 110 195 -100.19 gain 195 110 -91.11 gain 110 196 -96.47 gain 196 110 -91.70 gain 110 197 -105.40 gain 197 110 -95.77 gain 110 198 -96.96 gain 198 110 -91.84 gain 110 199 -91.21 gain 199 110 -86.19 gain 110 200 -95.66 gain 200 110 -91.98 gain 110 201 -98.74 gain 201 110 -94.97 gain 110 202 -99.97 gain 202 110 -95.34 gain 110 203 -89.00 gain 203 110 -83.48 gain 110 204 -104.99 gain 204 110 -96.11 gain 110 205 -99.07 gain 205 110 -93.93 gain 110 206 -94.60 gain 206 110 -90.57 gain 110 207 -94.19 gain 207 110 -89.58 gain 110 208 -99.81 gain 208 110 -97.80 gain 110 209 -99.61 gain 209 110 -97.17 gain 110 210 -101.65 gain 210 110 -99.39 gain 110 211 -94.11 gain 211 110 -87.08 gain 110 212 -94.96 gain 212 110 -90.94 gain 110 213 -100.46 gain 213 110 -95.77 gain 110 214 -102.29 gain 214 110 -102.99 gain 110 215 -99.54 gain 215 110 -95.63 gain 110 216 -101.23 gain 216 110 -101.24 gain 110 217 -96.74 gain 217 110 -97.01 gain 110 218 -99.74 gain 218 110 -92.82 gain 110 219 -99.66 gain 219 110 -93.22 gain 110 220 -100.42 gain 220 110 -90.07 gain 110 221 -102.56 gain 221 110 -97.88 gain 110 222 -102.20 gain 222 110 -93.33 gain 110 223 -103.87 gain 223 110 -98.25 gain 110 224 -102.65 gain 224 110 -97.49 gain 111 112 -71.29 gain 112 111 -74.76 gain 111 113 -74.01 gain 113 111 -76.60 gain 111 114 -74.41 gain 114 111 -74.17 gain 111 115 -76.40 gain 115 111 -76.82 gain 111 116 -78.44 gain 116 111 -81.28 gain 111 117 -81.48 gain 117 111 -81.47 gain 111 118 -86.41 gain 118 111 -88.02 gain 111 119 -85.73 gain 119 111 -92.40 gain 111 120 -77.49 gain 120 111 -81.54 gain 111 121 -81.39 gain 121 111 -86.47 gain 111 122 -86.06 gain 122 111 -90.89 gain 111 123 -69.99 gain 123 111 -75.16 gain 111 124 -69.65 gain 124 111 -72.81 gain 111 125 -62.15 gain 125 111 -68.65 gain 111 126 -64.54 gain 126 111 -67.69 gain 111 127 -66.24 gain 127 111 -69.01 gain 111 128 -67.97 gain 128 111 -73.34 gain 111 129 -78.45 gain 129 111 -81.02 gain 111 130 -76.98 gain 130 111 -80.84 gain 111 131 -85.15 gain 131 111 -88.79 gain 111 132 -88.23 gain 132 111 -87.88 gain 111 133 -81.25 gain 133 111 -86.08 gain 111 134 -89.95 gain 134 111 -91.63 gain 111 135 -81.12 gain 135 111 -85.11 gain 111 136 -80.50 gain 136 111 -84.93 gain 111 137 -86.85 gain 137 111 -94.20 gain 111 138 -80.75 gain 138 111 -81.62 gain 111 139 -72.69 gain 139 111 -76.83 gain 111 140 -72.96 gain 140 111 -77.93 gain 111 141 -68.80 gain 141 111 -65.74 gain 111 142 -69.48 gain 142 111 -73.16 gain 111 143 -78.15 gain 143 111 -84.57 gain 111 144 -76.13 gain 144 111 -80.91 gain 111 145 -89.80 gain 145 111 -97.97 gain 111 146 -81.07 gain 146 111 -85.23 gain 111 147 -84.69 gain 147 111 -85.96 gain 111 148 -89.69 gain 148 111 -89.29 gain 111 149 -87.67 gain 149 111 -90.92 gain 111 150 -84.04 gain 150 111 -88.13 gain 111 151 -77.48 gain 151 111 -80.51 gain 111 152 -88.32 gain 152 111 -91.17 gain 111 153 -82.36 gain 153 111 -84.42 gain 111 154 -79.62 gain 154 111 -83.58 gain 111 155 -73.55 gain 155 111 -76.09 gain 111 156 -82.80 gain 156 111 -84.57 gain 111 157 -78.05 gain 157 111 -82.29 gain 111 158 -81.31 gain 158 111 -85.05 gain 111 159 -79.21 gain 159 111 -85.34 gain 111 160 -84.17 gain 160 111 -87.46 gain 111 161 -80.77 gain 161 111 -86.50 gain 111 162 -91.27 gain 162 111 -96.71 gain 111 163 -83.54 gain 163 111 -90.89 gain 111 164 -93.65 gain 164 111 -100.37 gain 111 165 -84.25 gain 165 111 -88.02 gain 111 166 -89.10 gain 166 111 -92.63 gain 111 167 -85.20 gain 167 111 -89.45 gain 111 168 -79.70 gain 168 111 -82.84 gain 111 169 -71.65 gain 169 111 -75.91 gain 111 170 -82.32 gain 170 111 -85.81 gain 111 171 -78.83 gain 171 111 -83.41 gain 111 172 -76.29 gain 172 111 -79.05 gain 111 173 -79.61 gain 173 111 -87.02 gain 111 174 -85.01 gain 174 111 -88.47 gain 111 175 -84.59 gain 175 111 -89.18 gain 111 176 -90.88 gain 176 111 -94.44 gain 111 177 -82.96 gain 177 111 -89.53 gain 111 178 -83.87 gain 178 111 -83.87 gain 111 179 -89.82 gain 179 111 -89.25 gain 111 180 -87.97 gain 180 111 -96.85 gain 111 181 -85.27 gain 181 111 -88.17 gain 111 182 -78.33 gain 182 111 -82.31 gain 111 183 -82.74 gain 183 111 -87.00 gain 111 184 -82.07 gain 184 111 -89.07 gain 111 185 -79.31 gain 185 111 -90.18 gain 111 186 -87.34 gain 186 111 -93.79 gain 111 187 -82.24 gain 187 111 -86.42 gain 111 188 -80.83 gain 188 111 -87.43 gain 111 189 -85.82 gain 189 111 -87.14 gain 111 190 -83.58 gain 190 111 -88.81 gain 111 191 -83.93 gain 191 111 -87.88 gain 111 192 -92.41 gain 192 111 -95.05 gain 111 193 -85.04 gain 193 111 -86.67 gain 111 194 -89.41 gain 194 111 -91.81 gain 111 195 -88.07 gain 195 111 -89.02 gain 111 196 -92.58 gain 196 111 -97.85 gain 111 197 -91.24 gain 197 111 -91.64 gain 111 198 -80.16 gain 198 111 -85.07 gain 111 199 -82.89 gain 199 111 -87.91 gain 111 200 -80.18 gain 200 111 -86.53 gain 111 201 -81.84 gain 201 111 -88.10 gain 111 202 -87.82 gain 202 111 -93.22 gain 111 203 -85.75 gain 203 111 -90.26 gain 111 204 -83.44 gain 204 111 -84.60 gain 111 205 -82.51 gain 205 111 -87.41 gain 111 206 -83.91 gain 206 111 -89.91 gain 111 207 -89.84 gain 207 111 -95.27 gain 111 208 -91.65 gain 208 111 -99.67 gain 111 209 -94.23 gain 209 111 -101.83 gain 111 210 -83.35 gain 210 111 -91.12 gain 111 211 -88.44 gain 211 111 -91.44 gain 111 212 -91.84 gain 212 111 -97.85 gain 111 213 -92.30 gain 213 111 -97.64 gain 111 214 -90.79 gain 214 111 -101.52 gain 111 215 -81.64 gain 215 111 -87.77 gain 111 216 -92.92 gain 216 111 -102.96 gain 111 217 -90.27 gain 217 111 -100.57 gain 111 218 -89.18 gain 218 111 -92.29 gain 111 219 -86.07 gain 219 111 -89.66 gain 111 220 -90.09 gain 220 111 -89.77 gain 111 221 -88.28 gain 221 111 -93.64 gain 111 222 -91.45 gain 222 111 -92.61 gain 111 223 -92.37 gain 223 111 -96.78 gain 111 224 -88.08 gain 224 111 -92.95 gain 112 113 -62.58 gain 113 112 -61.71 gain 112 114 -85.40 gain 114 112 -81.70 gain 112 115 -74.33 gain 115 112 -71.28 gain 112 116 -80.77 gain 116 112 -80.15 gain 112 117 -85.93 gain 117 112 -82.46 gain 112 118 -85.71 gain 118 112 -83.85 gain 112 119 -91.23 gain 119 112 -94.44 gain 112 120 -90.14 gain 120 112 -90.73 gain 112 121 -100.22 gain 121 112 -101.83 gain 112 122 -84.72 gain 122 112 -86.08 gain 112 123 -86.61 gain 123 112 -88.31 gain 112 124 -79.05 gain 124 112 -78.75 gain 112 125 -79.79 gain 125 112 -82.82 gain 112 126 -76.18 gain 126 112 -75.86 gain 112 127 -61.99 gain 127 112 -61.29 gain 112 128 -69.74 gain 128 112 -71.64 gain 112 129 -69.79 gain 129 112 -68.90 gain 112 130 -78.78 gain 130 112 -79.18 gain 112 131 -78.67 gain 131 112 -78.84 gain 112 132 -90.69 gain 132 112 -86.87 gain 112 133 -89.55 gain 133 112 -90.91 gain 112 134 -85.79 gain 134 112 -84.01 gain 112 135 -90.18 gain 135 112 -90.70 gain 112 136 -81.26 gain 136 112 -82.23 gain 112 137 -90.59 gain 137 112 -94.47 gain 112 138 -80.78 gain 138 112 -78.19 gain 112 139 -84.30 gain 139 112 -84.98 gain 112 140 -82.24 gain 140 112 -83.74 gain 112 141 -75.48 gain 141 112 -68.96 gain 112 142 -75.53 gain 142 112 -75.75 gain 112 143 -72.26 gain 143 112 -75.21 gain 112 144 -85.84 gain 144 112 -87.16 gain 112 145 -82.97 gain 145 112 -87.68 gain 112 146 -87.61 gain 146 112 -88.31 gain 112 147 -87.98 gain 147 112 -85.79 gain 112 148 -85.90 gain 148 112 -82.03 gain 112 149 -90.38 gain 149 112 -90.17 gain 112 150 -87.89 gain 150 112 -88.51 gain 112 151 -83.81 gain 151 112 -83.38 gain 112 152 -89.83 gain 152 112 -89.22 gain 112 153 -84.77 gain 153 112 -83.37 gain 112 154 -87.26 gain 154 112 -87.76 gain 112 155 -78.29 gain 155 112 -77.36 gain 112 156 -80.91 gain 156 112 -79.21 gain 112 157 -81.13 gain 157 112 -81.91 gain 112 158 -77.09 gain 158 112 -77.38 gain 112 159 -86.69 gain 159 112 -89.35 gain 112 160 -76.49 gain 160 112 -76.32 gain 112 161 -84.12 gain 161 112 -86.39 gain 112 162 -86.18 gain 162 112 -88.16 gain 112 163 -90.23 gain 163 112 -94.11 gain 112 164 -88.40 gain 164 112 -91.66 gain 112 165 -87.49 gain 165 112 -87.80 gain 112 166 -95.66 gain 166 112 -95.73 gain 112 167 -87.25 gain 167 112 -88.03 gain 112 168 -88.64 gain 168 112 -88.32 gain 112 169 -87.59 gain 169 112 -88.39 gain 112 170 -88.12 gain 170 112 -88.15 gain 112 171 -84.13 gain 171 112 -85.24 gain 112 172 -74.38 gain 172 112 -73.68 gain 112 173 -83.52 gain 173 112 -87.46 gain 112 174 -85.07 gain 174 112 -85.06 gain 112 175 -83.97 gain 175 112 -85.10 gain 112 176 -82.83 gain 176 112 -82.93 gain 112 177 -88.82 gain 177 112 -91.92 gain 112 178 -96.81 gain 178 112 -93.35 gain 112 179 -89.74 gain 179 112 -85.70 gain 112 180 -98.59 gain 180 112 -104.00 gain 112 181 -89.94 gain 181 112 -89.38 gain 112 182 -92.00 gain 182 112 -92.52 gain 112 183 -89.16 gain 183 112 -89.95 gain 112 184 -89.47 gain 184 112 -93.01 gain 112 185 -85.75 gain 185 112 -93.17 gain 112 186 -89.45 gain 186 112 -92.44 gain 112 187 -78.90 gain 187 112 -79.62 gain 112 188 -78.42 gain 188 112 -81.55 gain 112 189 -88.72 gain 189 112 -86.58 gain 112 190 -89.44 gain 190 112 -91.21 gain 112 191 -87.98 gain 191 112 -88.46 gain 112 192 -83.94 gain 192 112 -83.11 gain 112 193 -94.40 gain 193 112 -92.56 gain 112 194 -97.51 gain 194 112 -96.45 gain 112 195 -90.08 gain 195 112 -87.57 gain 112 196 -99.14 gain 196 112 -100.94 gain 112 197 -90.98 gain 197 112 -87.92 gain 112 198 -94.94 gain 198 112 -96.39 gain 112 199 -87.65 gain 199 112 -89.20 gain 112 200 -90.78 gain 200 112 -93.67 gain 112 201 -90.97 gain 201 112 -93.77 gain 112 202 -89.58 gain 202 112 -91.52 gain 112 203 -91.81 gain 203 112 -92.85 gain 112 204 -82.61 gain 204 112 -80.30 gain 112 205 -91.63 gain 205 112 -93.06 gain 112 206 -85.57 gain 206 112 -88.11 gain 112 207 -89.30 gain 207 112 -91.26 gain 112 208 -90.07 gain 208 112 -94.64 gain 112 209 -100.78 gain 209 112 -104.91 gain 112 210 -99.62 gain 210 112 -103.93 gain 112 211 -98.62 gain 211 112 -98.16 gain 112 212 -92.92 gain 212 112 -95.47 gain 112 213 -89.38 gain 213 112 -91.26 gain 112 214 -97.24 gain 214 112 -104.51 gain 112 215 -87.65 gain 215 112 -90.32 gain 112 216 -90.83 gain 216 112 -97.41 gain 112 217 -90.28 gain 217 112 -97.12 gain 112 218 -89.00 gain 218 112 -88.65 gain 112 219 -94.50 gain 219 112 -94.63 gain 112 220 -92.75 gain 220 112 -88.97 gain 112 221 -90.09 gain 221 112 -91.98 gain 112 222 -90.83 gain 222 112 -88.53 gain 112 223 -90.40 gain 223 112 -91.35 gain 112 224 -100.05 gain 224 112 -101.46 gain 113 114 -60.48 gain 114 113 -57.65 gain 113 115 -64.66 gain 115 113 -62.49 gain 113 116 -83.34 gain 116 113 -83.60 gain 113 117 -82.49 gain 117 113 -79.89 gain 113 118 -78.50 gain 118 113 -77.52 gain 113 119 -80.66 gain 119 113 -84.74 gain 113 120 -92.99 gain 120 113 -94.45 gain 113 121 -90.11 gain 121 113 -92.59 gain 113 122 -83.29 gain 122 113 -85.53 gain 113 123 -81.34 gain 123 113 -83.92 gain 113 124 -81.64 gain 124 113 -82.21 gain 113 125 -73.83 gain 125 113 -77.73 gain 113 126 -76.91 gain 126 113 -77.46 gain 113 127 -70.69 gain 127 113 -70.86 gain 113 128 -60.56 gain 128 113 -63.33 gain 113 129 -67.53 gain 129 113 -67.51 gain 113 130 -76.58 gain 130 113 -77.85 gain 113 131 -83.50 gain 131 113 -84.54 gain 113 132 -82.21 gain 132 113 -79.26 gain 113 133 -83.55 gain 133 113 -85.78 gain 113 134 -82.37 gain 134 113 -81.46 gain 113 135 -85.83 gain 135 113 -87.23 gain 113 136 -93.97 gain 136 113 -95.81 gain 113 137 -76.34 gain 137 113 -81.09 gain 113 138 -84.21 gain 138 113 -82.49 gain 113 139 -82.72 gain 139 113 -84.26 gain 113 140 -74.88 gain 140 113 -77.26 gain 113 141 -71.32 gain 141 113 -65.67 gain 113 142 -65.02 gain 142 113 -66.11 gain 113 143 -74.10 gain 143 113 -77.93 gain 113 144 -69.65 gain 144 113 -71.84 gain 113 145 -79.10 gain 145 113 -84.67 gain 113 146 -76.83 gain 146 113 -78.40 gain 113 147 -80.91 gain 147 113 -79.59 gain 113 148 -80.78 gain 148 113 -77.79 gain 113 149 -83.39 gain 149 113 -84.05 gain 113 150 -91.18 gain 150 113 -92.67 gain 113 151 -84.36 gain 151 113 -84.80 gain 113 152 -97.65 gain 152 113 -97.90 gain 113 153 -86.49 gain 153 113 -85.96 gain 113 154 -77.02 gain 154 113 -78.39 gain 113 155 -85.76 gain 155 113 -85.71 gain 113 156 -80.51 gain 156 113 -79.68 gain 113 157 -83.07 gain 157 113 -84.72 gain 113 158 -74.34 gain 158 113 -75.49 gain 113 159 -78.51 gain 159 113 -82.05 gain 113 160 -78.39 gain 160 113 -79.08 gain 113 161 -78.43 gain 161 113 -81.56 gain 113 162 -90.52 gain 162 113 -93.36 gain 113 163 -92.15 gain 163 113 -96.91 gain 113 164 -85.06 gain 164 113 -89.19 gain 113 165 -95.19 gain 165 113 -96.38 gain 113 166 -85.27 gain 166 113 -86.21 gain 113 167 -92.94 gain 167 113 -94.60 gain 113 168 -95.19 gain 168 113 -95.74 gain 113 169 -84.35 gain 169 113 -86.02 gain 113 170 -89.51 gain 170 113 -90.42 gain 113 171 -81.54 gain 171 113 -83.53 gain 113 172 -82.62 gain 172 113 -82.79 gain 113 173 -87.86 gain 173 113 -92.68 gain 113 174 -84.85 gain 174 113 -85.72 gain 113 175 -84.50 gain 175 113 -86.50 gain 113 176 -80.97 gain 176 113 -81.94 gain 113 177 -88.15 gain 177 113 -92.12 gain 113 178 -94.28 gain 178 113 -91.70 gain 113 179 -85.52 gain 179 113 -82.36 gain 113 180 -87.75 gain 180 113 -94.04 gain 113 181 -93.38 gain 181 113 -93.69 gain 113 182 -90.90 gain 182 113 -92.29 gain 113 183 -92.01 gain 183 113 -93.68 gain 113 184 -87.04 gain 184 113 -91.45 gain 113 185 -81.32 gain 185 113 -89.60 gain 113 186 -89.68 gain 186 113 -93.55 gain 113 187 -87.92 gain 187 113 -89.51 gain 113 188 -86.60 gain 188 113 -90.60 gain 113 189 -79.26 gain 189 113 -77.99 gain 113 190 -89.55 gain 190 113 -92.19 gain 113 191 -85.82 gain 191 113 -87.17 gain 113 192 -85.60 gain 192 113 -85.65 gain 113 193 -91.29 gain 193 113 -90.32 gain 113 194 -91.92 gain 194 113 -91.73 gain 113 195 -89.59 gain 195 113 -87.95 gain 113 196 -95.42 gain 196 113 -98.09 gain 113 197 -89.48 gain 197 113 -87.29 gain 113 198 -89.37 gain 198 113 -91.69 gain 113 199 -81.69 gain 199 113 -84.12 gain 113 200 -82.40 gain 200 113 -86.16 gain 113 201 -85.76 gain 201 113 -89.43 gain 113 202 -86.15 gain 202 113 -88.95 gain 113 203 -91.51 gain 203 113 -93.43 gain 113 204 -83.55 gain 204 113 -82.11 gain 113 205 -90.08 gain 205 113 -92.38 gain 113 206 -83.23 gain 206 113 -86.64 gain 113 207 -90.08 gain 207 113 -92.91 gain 113 208 -89.86 gain 208 113 -95.29 gain 113 209 -86.25 gain 209 113 -91.25 gain 113 210 -88.26 gain 210 113 -93.44 gain 113 211 -100.73 gain 211 113 -101.14 gain 113 212 -92.74 gain 212 113 -96.16 gain 113 213 -91.37 gain 213 113 -94.12 gain 113 214 -93.58 gain 214 113 -101.72 gain 113 215 -93.93 gain 215 113 -97.47 gain 113 216 -91.53 gain 216 113 -98.98 gain 113 217 -86.94 gain 217 113 -94.65 gain 113 218 -91.33 gain 218 113 -91.85 gain 113 219 -90.51 gain 219 113 -91.51 gain 113 220 -87.12 gain 220 113 -84.21 gain 113 221 -100.79 gain 221 113 -103.55 gain 113 222 -81.18 gain 222 113 -79.75 gain 113 223 -92.02 gain 223 113 -93.83 gain 113 224 -97.37 gain 224 113 -99.65 gain 114 115 -56.42 gain 115 114 -57.07 gain 114 116 -70.36 gain 116 114 -73.45 gain 114 117 -74.26 gain 117 114 -74.49 gain 114 118 -79.39 gain 118 114 -81.24 gain 114 119 -75.33 gain 119 114 -82.24 gain 114 120 -84.29 gain 120 114 -88.59 gain 114 121 -91.97 gain 121 114 -97.28 gain 114 122 -82.11 gain 122 114 -87.18 gain 114 123 -75.74 gain 123 114 -81.15 gain 114 124 -88.83 gain 124 114 -92.23 gain 114 125 -76.83 gain 125 114 -83.56 gain 114 126 -85.21 gain 126 114 -88.59 gain 114 127 -77.06 gain 127 114 -80.07 gain 114 128 -61.41 gain 128 114 -67.01 gain 114 129 -55.51 gain 129 114 -58.32 gain 114 130 -62.19 gain 130 114 -66.29 gain 114 131 -73.53 gain 131 114 -77.41 gain 114 132 -72.95 gain 132 114 -72.83 gain 114 133 -80.54 gain 133 114 -85.60 gain 114 134 -85.91 gain 134 114 -87.83 gain 114 135 -94.16 gain 135 114 -98.38 gain 114 136 -87.29 gain 136 114 -91.96 gain 114 137 -95.28 gain 137 114 -102.86 gain 114 138 -84.63 gain 138 114 -85.74 gain 114 139 -80.67 gain 139 114 -85.05 gain 114 140 -83.22 gain 140 114 -88.43 gain 114 141 -82.49 gain 141 114 -79.67 gain 114 142 -75.93 gain 142 114 -79.86 gain 114 143 -63.32 gain 143 114 -69.97 gain 114 144 -69.00 gain 144 114 -74.02 gain 114 145 -64.61 gain 145 114 -73.02 gain 114 146 -74.28 gain 146 114 -78.68 gain 114 147 -82.55 gain 147 114 -84.06 gain 114 148 -80.50 gain 148 114 -80.34 gain 114 149 -85.00 gain 149 114 -88.49 gain 114 150 -89.53 gain 150 114 -93.86 gain 114 151 -84.47 gain 151 114 -87.74 gain 114 152 -82.90 gain 152 114 -85.99 gain 114 153 -83.28 gain 153 114 -85.58 gain 114 154 -82.64 gain 154 114 -86.84 gain 114 155 -82.63 gain 155 114 -85.41 gain 114 156 -82.34 gain 156 114 -84.34 gain 114 157 -82.76 gain 157 114 -87.25 gain 114 158 -83.01 gain 158 114 -87.00 gain 114 159 -76.53 gain 159 114 -82.91 gain 114 160 -69.57 gain 160 114 -73.10 gain 114 161 -84.43 gain 161 114 -90.39 gain 114 162 -78.36 gain 162 114 -84.04 gain 114 163 -81.73 gain 163 114 -89.32 gain 114 164 -83.05 gain 164 114 -90.01 gain 114 165 -86.63 gain 165 114 -90.65 gain 114 166 -79.33 gain 166 114 -83.10 gain 114 167 -91.78 gain 167 114 -96.28 gain 114 168 -86.90 gain 168 114 -90.29 gain 114 169 -80.85 gain 169 114 -85.35 gain 114 170 -89.33 gain 170 114 -93.06 gain 114 171 -76.57 gain 171 114 -81.39 gain 114 172 -80.73 gain 172 114 -83.73 gain 114 173 -81.03 gain 173 114 -88.68 gain 114 174 -80.99 gain 174 114 -84.69 gain 114 175 -82.99 gain 175 114 -87.82 gain 114 176 -80.31 gain 176 114 -84.12 gain 114 177 -80.89 gain 177 114 -87.69 gain 114 178 -82.81 gain 178 114 -83.06 gain 114 179 -80.89 gain 179 114 -80.56 gain 114 180 -93.68 gain 180 114 -102.80 gain 114 181 -91.65 gain 181 114 -94.79 gain 114 182 -91.72 gain 182 114 -95.95 gain 114 183 -81.64 gain 183 114 -86.14 gain 114 184 -82.84 gain 184 114 -90.09 gain 114 185 -90.28 gain 185 114 -101.40 gain 114 186 -83.80 gain 186 114 -90.49 gain 114 187 -82.58 gain 187 114 -87.00 gain 114 188 -86.03 gain 188 114 -92.86 gain 114 189 -82.88 gain 189 114 -84.44 gain 114 190 -81.91 gain 190 114 -87.38 gain 114 191 -78.70 gain 191 114 -82.89 gain 114 192 -86.66 gain 192 114 -89.54 gain 114 193 -82.24 gain 193 114 -84.10 gain 114 194 -80.89 gain 194 114 -83.54 gain 114 195 -86.00 gain 195 114 -87.19 gain 114 196 -95.45 gain 196 114 -100.95 gain 114 197 -88.62 gain 197 114 -89.25 gain 114 198 -85.92 gain 198 114 -91.08 gain 114 199 -88.19 gain 199 114 -93.45 gain 114 200 -79.88 gain 200 114 -86.48 gain 114 201 -84.80 gain 201 114 -91.30 gain 114 202 -79.11 gain 202 114 -84.75 gain 114 203 -86.29 gain 203 114 -91.04 gain 114 204 -89.51 gain 204 114 -90.90 gain 114 205 -86.50 gain 205 114 -91.63 gain 114 206 -85.41 gain 206 114 -91.66 gain 114 207 -91.82 gain 207 114 -97.48 gain 114 208 -93.12 gain 208 114 -101.39 gain 114 209 -81.01 gain 209 114 -88.85 gain 114 210 -99.20 gain 210 114 -107.21 gain 114 211 -96.72 gain 211 114 -99.96 gain 114 212 -86.72 gain 212 114 -92.97 gain 114 213 -89.43 gain 213 114 -95.01 gain 114 214 -90.23 gain 214 114 -101.20 gain 114 215 -80.66 gain 215 114 -87.03 gain 114 216 -87.99 gain 216 114 -98.27 gain 114 217 -93.10 gain 217 114 -103.64 gain 114 218 -83.09 gain 218 114 -86.43 gain 114 219 -89.38 gain 219 114 -93.22 gain 114 220 -82.44 gain 220 114 -82.36 gain 114 221 -86.89 gain 221 114 -92.49 gain 114 222 -94.13 gain 222 114 -95.54 gain 114 223 -88.66 gain 223 114 -93.30 gain 114 224 -89.12 gain 224 114 -94.23 gain 115 116 -56.77 gain 116 115 -59.20 gain 115 117 -71.72 gain 117 115 -71.29 gain 115 118 -77.08 gain 118 115 -78.28 gain 115 119 -74.72 gain 119 115 -80.98 gain 115 120 -95.15 gain 120 115 -98.79 gain 115 121 -101.65 gain 121 115 -106.31 gain 115 122 -81.24 gain 122 115 -85.65 gain 115 123 -87.08 gain 123 115 -91.83 gain 115 124 -88.75 gain 124 115 -91.50 gain 115 125 -77.16 gain 125 115 -83.24 gain 115 126 -84.50 gain 126 115 -87.22 gain 115 127 -76.55 gain 127 115 -78.90 gain 115 128 -72.59 gain 128 115 -77.54 gain 115 129 -61.62 gain 129 115 -63.78 gain 115 130 -56.50 gain 130 115 -59.95 gain 115 131 -69.81 gain 131 115 -73.04 gain 115 132 -64.76 gain 132 115 -63.99 gain 115 133 -75.67 gain 133 115 -80.08 gain 115 134 -86.36 gain 134 115 -87.63 gain 115 135 -84.02 gain 135 115 -87.60 gain 115 136 -98.87 gain 136 115 -102.89 gain 115 137 -85.90 gain 137 115 -92.83 gain 115 138 -86.15 gain 138 115 -86.61 gain 115 139 -85.33 gain 139 115 -89.05 gain 115 140 -79.78 gain 140 115 -84.33 gain 115 141 -80.99 gain 141 115 -77.52 gain 115 142 -81.12 gain 142 115 -84.39 gain 115 143 -75.04 gain 143 115 -81.05 gain 115 144 -71.95 gain 144 115 -76.32 gain 115 145 -65.64 gain 145 115 -73.40 gain 115 146 -63.77 gain 146 115 -67.52 gain 115 147 -75.05 gain 147 115 -75.91 gain 115 148 -77.92 gain 148 115 -77.10 gain 115 149 -78.53 gain 149 115 -81.37 gain 115 150 -91.92 gain 150 115 -95.59 gain 115 151 -92.17 gain 151 115 -94.78 gain 115 152 -86.45 gain 152 115 -88.88 gain 115 153 -91.30 gain 153 115 -92.95 gain 115 154 -84.28 gain 154 115 -87.83 gain 115 155 -85.52 gain 155 115 -87.64 gain 115 156 -81.15 gain 156 115 -82.50 gain 115 157 -83.86 gain 157 115 -87.70 gain 115 158 -78.88 gain 158 115 -82.22 gain 115 159 -78.99 gain 159 115 -84.71 gain 115 160 -70.92 gain 160 115 -73.80 gain 115 161 -79.06 gain 161 115 -84.37 gain 115 162 -76.23 gain 162 115 -81.25 gain 115 163 -72.07 gain 163 115 -79.00 gain 115 164 -84.27 gain 164 115 -90.58 gain 115 165 -90.54 gain 165 115 -93.91 gain 115 166 -94.07 gain 166 115 -97.19 gain 115 167 -93.41 gain 167 115 -97.25 gain 115 168 -89.54 gain 168 115 -92.27 gain 115 169 -75.69 gain 169 115 -79.54 gain 115 170 -81.61 gain 170 115 -84.69 gain 115 171 -84.47 gain 171 115 -88.63 gain 115 172 -87.04 gain 172 115 -89.39 gain 115 173 -78.30 gain 173 115 -85.29 gain 115 174 -76.69 gain 174 115 -79.74 gain 115 175 -74.78 gain 175 115 -78.96 gain 115 176 -81.78 gain 176 115 -84.93 gain 115 177 -73.12 gain 177 115 -79.27 gain 115 178 -80.40 gain 178 115 -79.99 gain 115 179 -71.14 gain 179 115 -70.15 gain 115 180 -94.82 gain 180 115 -103.29 gain 115 181 -90.21 gain 181 115 -92.70 gain 115 182 -91.68 gain 182 115 -95.25 gain 115 183 -82.73 gain 183 115 -86.58 gain 115 184 -83.47 gain 184 115 -90.07 gain 115 185 -83.86 gain 185 115 -94.32 gain 115 186 -91.68 gain 186 115 -97.72 gain 115 187 -88.39 gain 187 115 -92.16 gain 115 188 -88.84 gain 188 115 -95.02 gain 115 189 -82.16 gain 189 115 -83.07 gain 115 190 -84.63 gain 190 115 -89.45 gain 115 191 -78.14 gain 191 115 -81.67 gain 115 192 -85.95 gain 192 115 -88.18 gain 115 193 -86.50 gain 193 115 -87.71 gain 115 194 -84.68 gain 194 115 -86.67 gain 115 195 -94.74 gain 195 115 -95.27 gain 115 196 -90.62 gain 196 115 -95.47 gain 115 197 -87.77 gain 197 115 -87.76 gain 115 198 -88.07 gain 198 115 -92.57 gain 115 199 -83.74 gain 199 115 -88.34 gain 115 200 -92.11 gain 200 115 -98.05 gain 115 201 -84.39 gain 201 115 -90.24 gain 115 202 -89.38 gain 202 115 -94.36 gain 115 203 -78.60 gain 203 115 -82.70 gain 115 204 -86.92 gain 204 115 -87.66 gain 115 205 -83.61 gain 205 115 -88.09 gain 115 206 -88.77 gain 206 115 -94.36 gain 115 207 -81.94 gain 207 115 -86.95 gain 115 208 -78.31 gain 208 115 -85.92 gain 115 209 -84.74 gain 209 115 -91.93 gain 115 210 -92.12 gain 210 115 -99.48 gain 115 211 -96.17 gain 211 115 -98.76 gain 115 212 -94.74 gain 212 115 -100.34 gain 115 213 -94.72 gain 213 115 -99.65 gain 115 214 -98.94 gain 214 115 -109.25 gain 115 215 -88.33 gain 215 115 -94.05 gain 115 216 -81.23 gain 216 115 -90.85 gain 115 217 -94.96 gain 217 115 -104.85 gain 115 218 -87.26 gain 218 115 -89.96 gain 115 219 -90.62 gain 219 115 -93.80 gain 115 220 -83.41 gain 220 115 -82.67 gain 115 221 -83.72 gain 221 115 -88.67 gain 115 222 -92.51 gain 222 115 -93.26 gain 115 223 -92.74 gain 223 115 -96.73 gain 115 224 -78.97 gain 224 115 -83.43 gain 116 117 -67.41 gain 117 116 -64.55 gain 116 118 -62.29 gain 118 116 -61.05 gain 116 119 -78.60 gain 119 116 -82.43 gain 116 120 -97.96 gain 120 116 -99.17 gain 116 121 -96.79 gain 121 116 -99.02 gain 116 122 -96.27 gain 122 116 -98.25 gain 116 123 -89.05 gain 123 116 -91.37 gain 116 124 -87.55 gain 124 116 -87.86 gain 116 125 -86.62 gain 125 116 -90.27 gain 116 126 -77.81 gain 126 116 -78.10 gain 116 127 -77.05 gain 127 116 -76.97 gain 116 128 -75.64 gain 128 116 -78.15 gain 116 129 -78.10 gain 129 116 -77.83 gain 116 130 -65.25 gain 130 116 -66.27 gain 116 131 -64.96 gain 131 116 -65.75 gain 116 132 -63.81 gain 132 116 -60.61 gain 116 133 -74.23 gain 133 116 -76.21 gain 116 134 -82.67 gain 134 116 -81.51 gain 116 135 -96.34 gain 135 116 -97.48 gain 116 136 -97.76 gain 136 116 -99.34 gain 116 137 -96.38 gain 137 116 -100.87 gain 116 138 -93.93 gain 138 116 -91.96 gain 116 139 -85.57 gain 139 116 -86.86 gain 116 140 -92.08 gain 140 116 -94.20 gain 116 141 -90.22 gain 141 116 -84.31 gain 116 142 -87.83 gain 142 116 -88.66 gain 116 143 -76.60 gain 143 116 -80.17 gain 116 144 -78.58 gain 144 116 -80.52 gain 116 145 -78.18 gain 145 116 -83.51 gain 116 146 -71.06 gain 146 116 -72.38 gain 116 147 -71.43 gain 147 116 -69.86 gain 116 148 -76.30 gain 148 116 -73.05 gain 116 149 -80.79 gain 149 116 -81.20 gain 116 150 -98.05 gain 150 116 -99.29 gain 116 151 -96.86 gain 151 116 -97.04 gain 116 152 -93.60 gain 152 116 -93.60 gain 116 153 -94.69 gain 153 116 -93.91 gain 116 154 -92.41 gain 154 116 -93.52 gain 116 155 -89.55 gain 155 116 -89.24 gain 116 156 -86.96 gain 156 116 -85.88 gain 116 157 -79.24 gain 157 116 -80.64 gain 116 158 -87.75 gain 158 116 -88.66 gain 116 159 -87.58 gain 159 116 -90.87 gain 116 160 -80.17 gain 160 116 -80.61 gain 116 161 -72.05 gain 161 116 -74.93 gain 116 162 -82.77 gain 162 116 -85.36 gain 116 163 -76.98 gain 163 116 -81.48 gain 116 164 -72.66 gain 164 116 -76.53 gain 116 165 -99.07 gain 165 116 -100.00 gain 116 166 -92.69 gain 166 116 -93.38 gain 116 167 -88.63 gain 167 116 -90.03 gain 116 168 -98.72 gain 168 116 -99.02 gain 116 169 -91.52 gain 169 116 -92.94 gain 116 170 -92.40 gain 170 116 -93.05 gain 116 171 -84.35 gain 171 116 -86.08 gain 116 172 -87.12 gain 172 116 -87.04 gain 116 173 -78.33 gain 173 116 -82.89 gain 116 174 -88.04 gain 174 116 -88.66 gain 116 175 -76.83 gain 175 116 -78.58 gain 116 176 -85.69 gain 176 116 -86.41 gain 116 177 -75.98 gain 177 116 -79.70 gain 116 178 -86.17 gain 178 116 -83.33 gain 116 179 -89.71 gain 179 116 -86.29 gain 116 180 -92.88 gain 180 116 -98.91 gain 116 181 -89.84 gain 181 116 -89.90 gain 116 182 -99.04 gain 182 116 -100.18 gain 116 183 -87.61 gain 183 116 -89.02 gain 116 184 -97.18 gain 184 116 -101.34 gain 116 185 -98.39 gain 185 116 -106.42 gain 116 186 -86.56 gain 186 116 -90.16 gain 116 187 -88.22 gain 187 116 -89.56 gain 116 188 -89.49 gain 188 116 -93.24 gain 116 189 -83.96 gain 189 116 -82.43 gain 116 190 -84.71 gain 190 116 -87.11 gain 116 191 -93.02 gain 191 116 -94.12 gain 116 192 -85.16 gain 192 116 -84.95 gain 116 193 -87.02 gain 193 116 -85.80 gain 116 194 -90.45 gain 194 116 -90.01 gain 116 195 -96.84 gain 195 116 -94.95 gain 116 196 -93.04 gain 196 116 -95.46 gain 116 197 -94.19 gain 197 116 -91.74 gain 116 198 -91.75 gain 198 116 -93.82 gain 116 199 -93.09 gain 199 116 -95.26 gain 116 200 -96.84 gain 200 116 -100.35 gain 116 201 -91.50 gain 201 116 -94.92 gain 116 202 -92.43 gain 202 116 -94.98 gain 116 203 -82.77 gain 203 116 -84.43 gain 116 204 -91.90 gain 204 116 -90.21 gain 116 205 -84.96 gain 205 116 -87.01 gain 116 206 -84.51 gain 206 116 -87.66 gain 116 207 -87.09 gain 207 116 -89.67 gain 116 208 -86.13 gain 208 116 -91.30 gain 116 209 -90.87 gain 209 116 -95.62 gain 116 210 -96.92 gain 210 116 -101.85 gain 116 211 -101.30 gain 211 116 -101.46 gain 116 212 -95.33 gain 212 116 -98.50 gain 116 213 -93.56 gain 213 116 -96.05 gain 116 214 -95.99 gain 214 116 -103.87 gain 116 215 -87.94 gain 215 116 -91.23 gain 116 216 -94.70 gain 216 116 -101.89 gain 116 217 -89.96 gain 217 116 -97.42 gain 116 218 -84.90 gain 218 116 -85.16 gain 116 219 -87.67 gain 219 116 -88.41 gain 116 220 -94.65 gain 220 116 -91.48 gain 116 221 -86.27 gain 221 116 -88.78 gain 116 222 -82.02 gain 222 116 -80.33 gain 116 223 -91.63 gain 223 116 -93.18 gain 116 224 -81.42 gain 224 116 -83.44 gain 117 118 -57.51 gain 118 117 -59.13 gain 117 119 -78.72 gain 119 117 -85.40 gain 117 120 -96.62 gain 120 117 -100.68 gain 117 121 -93.93 gain 121 117 -99.02 gain 117 122 -95.35 gain 122 117 -100.19 gain 117 123 -86.27 gain 123 117 -91.44 gain 117 124 -83.61 gain 124 117 -86.78 gain 117 125 -88.69 gain 125 117 -95.19 gain 117 126 -82.62 gain 126 117 -85.77 gain 117 127 -83.89 gain 127 117 -86.67 gain 117 128 -78.98 gain 128 117 -84.35 gain 117 129 -74.81 gain 129 117 -77.40 gain 117 130 -65.71 gain 130 117 -69.59 gain 117 131 -68.60 gain 131 117 -72.24 gain 117 132 -64.03 gain 132 117 -63.68 gain 117 133 -65.44 gain 133 117 -70.27 gain 117 134 -70.07 gain 134 117 -71.76 gain 117 135 -97.56 gain 135 117 -101.56 gain 117 136 -93.78 gain 136 117 -98.22 gain 117 137 -87.75 gain 137 117 -95.11 gain 117 138 -92.52 gain 138 117 -93.40 gain 117 139 -88.40 gain 139 117 -92.55 gain 117 140 -85.08 gain 140 117 -90.06 gain 117 141 -88.09 gain 141 117 -85.03 gain 117 142 -87.62 gain 142 117 -91.31 gain 117 143 -82.50 gain 143 117 -88.93 gain 117 144 -82.36 gain 144 117 -87.15 gain 117 145 -73.91 gain 145 117 -82.09 gain 117 146 -73.08 gain 146 117 -77.25 gain 117 147 -74.36 gain 147 117 -75.64 gain 117 148 -68.31 gain 148 117 -67.91 gain 117 149 -78.52 gain 149 117 -81.79 gain 117 150 -95.07 gain 150 117 -99.17 gain 117 151 -94.29 gain 151 117 -97.33 gain 117 152 -88.08 gain 152 117 -90.94 gain 117 153 -93.81 gain 153 117 -95.88 gain 117 154 -87.31 gain 154 117 -91.28 gain 117 155 -90.69 gain 155 117 -93.24 gain 117 156 -92.06 gain 156 117 -93.84 gain 117 157 -85.82 gain 157 117 -90.08 gain 117 158 -79.38 gain 158 117 -83.14 gain 117 159 -78.66 gain 159 117 -84.80 gain 117 160 -77.06 gain 160 117 -80.35 gain 117 161 -73.62 gain 161 117 -79.36 gain 117 162 -70.74 gain 162 117 -76.19 gain 117 163 -74.04 gain 163 117 -81.40 gain 117 164 -73.71 gain 164 117 -80.44 gain 117 165 -96.69 gain 165 117 -100.47 gain 117 166 -95.13 gain 166 117 -98.68 gain 117 167 -90.16 gain 167 117 -94.43 gain 117 168 -91.80 gain 168 117 -94.96 gain 117 169 -85.28 gain 169 117 -89.55 gain 117 170 -82.41 gain 170 117 -85.92 gain 117 171 -85.31 gain 171 117 -89.90 gain 117 172 -85.83 gain 172 117 -88.61 gain 117 173 -77.06 gain 173 117 -84.48 gain 117 174 -79.62 gain 174 117 -83.09 gain 117 175 -75.78 gain 175 117 -80.39 gain 117 176 -81.19 gain 176 117 -84.76 gain 117 177 -78.82 gain 177 117 -85.40 gain 117 178 -77.29 gain 178 117 -77.31 gain 117 179 -85.12 gain 179 117 -84.56 gain 117 180 -99.75 gain 180 117 -108.64 gain 117 181 -93.72 gain 181 117 -96.63 gain 117 182 -98.58 gain 182 117 -102.57 gain 117 183 -99.11 gain 183 117 -103.38 gain 117 184 -92.23 gain 184 117 -99.24 gain 117 185 -88.89 gain 185 117 -99.77 gain 117 186 -93.03 gain 186 117 -99.49 gain 117 187 -88.03 gain 187 117 -92.22 gain 117 188 -85.19 gain 188 117 -91.80 gain 117 189 -78.29 gain 189 117 -79.62 gain 117 190 -88.28 gain 190 117 -93.53 gain 117 191 -82.94 gain 191 117 -86.90 gain 117 192 -82.98 gain 192 117 -85.63 gain 117 193 -79.50 gain 193 117 -81.14 gain 117 194 -77.25 gain 194 117 -79.66 gain 117 195 -102.12 gain 195 117 -103.08 gain 117 196 -96.10 gain 196 117 -101.37 gain 117 197 -97.39 gain 197 117 -97.80 gain 117 198 -87.85 gain 198 117 -92.78 gain 117 199 -86.18 gain 199 117 -91.21 gain 117 200 -88.11 gain 200 117 -94.48 gain 117 201 -92.41 gain 201 117 -98.69 gain 117 202 -89.07 gain 202 117 -94.48 gain 117 203 -85.56 gain 203 117 -90.08 gain 117 204 -94.31 gain 204 117 -95.47 gain 117 205 -83.30 gain 205 117 -88.20 gain 117 206 -83.81 gain 206 117 -89.82 gain 117 207 -78.65 gain 207 117 -84.09 gain 117 208 -76.27 gain 208 117 -84.31 gain 117 209 -83.71 gain 209 117 -91.31 gain 117 210 -92.17 gain 210 117 -99.95 gain 117 211 -97.46 gain 211 117 -100.47 gain 117 212 -89.77 gain 212 117 -95.80 gain 117 213 -92.71 gain 213 117 -98.06 gain 117 214 -94.24 gain 214 117 -104.98 gain 117 215 -96.86 gain 215 117 -103.00 gain 117 216 -88.80 gain 216 117 -98.85 gain 117 217 -91.68 gain 217 117 -101.99 gain 117 218 -90.52 gain 218 117 -93.64 gain 117 219 -87.45 gain 219 117 -91.05 gain 117 220 -82.31 gain 220 117 -81.99 gain 117 221 -85.96 gain 221 117 -91.33 gain 117 222 -83.31 gain 222 117 -84.49 gain 117 223 -91.67 gain 223 117 -96.09 gain 117 224 -94.28 gain 224 117 -99.16 gain 118 119 -65.74 gain 119 118 -70.80 gain 118 120 -90.87 gain 120 118 -93.31 gain 118 121 -101.44 gain 121 118 -104.90 gain 118 122 -87.47 gain 122 118 -90.68 gain 118 123 -94.14 gain 123 118 -97.69 gain 118 124 -84.32 gain 124 118 -85.87 gain 118 125 -88.16 gain 125 118 -93.05 gain 118 126 -83.64 gain 126 118 -85.17 gain 118 127 -90.08 gain 127 118 -91.24 gain 118 128 -86.96 gain 128 118 -90.71 gain 118 129 -86.59 gain 129 118 -87.55 gain 118 130 -78.56 gain 130 118 -80.82 gain 118 131 -68.55 gain 131 118 -70.58 gain 118 132 -64.25 gain 132 118 -62.28 gain 118 133 -63.61 gain 133 118 -66.82 gain 118 134 -63.09 gain 134 118 -63.17 gain 118 135 -94.86 gain 135 118 -97.23 gain 118 136 -100.60 gain 136 118 -103.42 gain 118 137 -102.33 gain 137 118 -108.06 gain 118 138 -101.19 gain 138 118 -100.45 gain 118 139 -89.13 gain 139 118 -91.66 gain 118 140 -89.32 gain 140 118 -92.68 gain 118 141 -102.11 gain 141 118 -97.44 gain 118 142 -86.64 gain 142 118 -88.71 gain 118 143 -84.59 gain 143 118 -89.40 gain 118 144 -81.83 gain 144 118 -85.00 gain 118 145 -77.28 gain 145 118 -83.84 gain 118 146 -69.44 gain 146 118 -71.99 gain 118 147 -79.54 gain 147 118 -79.20 gain 118 148 -69.16 gain 148 118 -67.14 gain 118 149 -73.40 gain 149 118 -75.04 gain 118 150 -100.82 gain 150 118 -103.30 gain 118 151 -95.84 gain 151 118 -97.26 gain 118 152 -95.80 gain 152 118 -97.03 gain 118 153 -91.94 gain 153 118 -92.39 gain 118 154 -99.22 gain 154 118 -101.57 gain 118 155 -88.01 gain 155 118 -88.93 gain 118 156 -92.01 gain 156 118 -92.17 gain 118 157 -89.63 gain 157 118 -92.27 gain 118 158 -93.20 gain 158 118 -95.34 gain 118 159 -82.75 gain 159 118 -87.28 gain 118 160 -79.55 gain 160 118 -81.23 gain 118 161 -76.48 gain 161 118 -80.60 gain 118 162 -82.55 gain 162 118 -86.38 gain 118 163 -81.80 gain 163 118 -87.54 gain 118 164 -75.77 gain 164 118 -80.88 gain 118 165 -99.85 gain 165 118 -102.01 gain 118 166 -93.48 gain 166 118 -95.40 gain 118 167 -93.72 gain 167 118 -96.36 gain 118 168 -94.38 gain 168 118 -95.92 gain 118 169 -90.66 gain 169 118 -93.32 gain 118 170 -95.87 gain 170 118 -97.75 gain 118 171 -94.84 gain 171 118 -97.81 gain 118 172 -87.62 gain 172 118 -88.78 gain 118 173 -91.84 gain 173 118 -97.64 gain 118 174 -86.56 gain 174 118 -88.41 gain 118 175 -81.94 gain 175 118 -84.93 gain 118 176 -85.50 gain 176 118 -87.46 gain 118 177 -70.21 gain 177 118 -75.17 gain 118 178 -81.33 gain 178 118 -79.73 gain 118 179 -73.77 gain 179 118 -71.59 gain 118 180 -92.24 gain 180 118 -99.51 gain 118 181 -90.92 gain 181 118 -92.22 gain 118 182 -95.54 gain 182 118 -97.91 gain 118 183 -98.07 gain 183 118 -100.72 gain 118 184 -87.96 gain 184 118 -93.36 gain 118 185 -87.45 gain 185 118 -96.72 gain 118 186 -88.41 gain 186 118 -93.25 gain 118 187 -91.04 gain 187 118 -93.61 gain 118 188 -82.08 gain 188 118 -87.07 gain 118 189 -83.47 gain 189 118 -83.18 gain 118 190 -83.26 gain 190 118 -86.89 gain 118 191 -87.99 gain 191 118 -90.32 gain 118 192 -81.54 gain 192 118 -82.57 gain 118 193 -89.11 gain 193 118 -89.12 gain 118 194 -77.55 gain 194 118 -78.34 gain 118 195 -99.80 gain 195 118 -99.14 gain 118 196 -93.69 gain 196 118 -97.34 gain 118 197 -93.79 gain 197 118 -92.57 gain 118 198 -95.37 gain 198 118 -98.68 gain 118 199 -92.11 gain 199 118 -95.52 gain 118 200 -96.25 gain 200 118 -100.99 gain 118 201 -92.68 gain 201 118 -97.33 gain 118 202 -90.05 gain 202 118 -93.84 gain 118 203 -85.26 gain 203 118 -88.16 gain 118 204 -83.88 gain 204 118 -83.42 gain 118 205 -87.42 gain 205 118 -90.70 gain 118 206 -81.67 gain 206 118 -86.06 gain 118 207 -93.21 gain 207 118 -97.02 gain 118 208 -94.28 gain 208 118 -100.70 gain 118 209 -80.47 gain 209 118 -86.45 gain 118 210 -96.22 gain 210 118 -102.38 gain 118 211 -105.62 gain 211 118 -107.02 gain 118 212 -93.32 gain 212 118 -97.72 gain 118 213 -96.12 gain 213 118 -99.85 gain 118 214 -91.13 gain 214 118 -100.25 gain 118 215 -92.60 gain 215 118 -97.12 gain 118 216 -92.25 gain 216 118 -100.68 gain 118 217 -94.68 gain 217 118 -103.37 gain 118 218 -88.68 gain 218 118 -90.18 gain 118 219 -89.91 gain 219 118 -91.89 gain 118 220 -82.28 gain 220 118 -80.35 gain 118 221 -85.84 gain 221 118 -89.59 gain 118 222 -89.71 gain 222 118 -89.26 gain 118 223 -85.77 gain 223 118 -88.57 gain 118 224 -84.96 gain 224 118 -88.22 gain 119 120 -100.57 gain 120 119 -97.95 gain 119 121 -101.18 gain 121 119 -99.58 gain 119 122 -98.56 gain 122 119 -96.72 gain 119 123 -103.25 gain 123 119 -101.75 gain 119 124 -92.01 gain 124 119 -88.50 gain 119 125 -95.53 gain 125 119 -95.35 gain 119 126 -95.32 gain 126 119 -91.79 gain 119 127 -90.67 gain 127 119 -86.77 gain 119 128 -93.90 gain 128 119 -92.59 gain 119 129 -89.11 gain 129 119 -85.01 gain 119 130 -87.30 gain 130 119 -84.49 gain 119 131 -88.26 gain 131 119 -85.23 gain 119 132 -73.37 gain 132 119 -66.35 gain 119 133 -68.06 gain 133 119 -66.22 gain 119 134 -63.47 gain 134 119 -58.49 gain 119 135 -103.08 gain 135 119 -100.40 gain 119 136 -107.37 gain 136 119 -105.13 gain 119 137 -99.07 gain 137 119 -99.74 gain 119 138 -104.44 gain 138 119 -98.64 gain 119 139 -104.46 gain 139 119 -101.92 gain 119 140 -100.24 gain 140 119 -98.53 gain 119 141 -93.63 gain 141 119 -83.90 gain 119 142 -97.38 gain 142 119 -94.39 gain 119 143 -96.94 gain 143 119 -96.69 gain 119 144 -88.91 gain 144 119 -87.02 gain 119 145 -79.72 gain 145 119 -81.22 gain 119 146 -83.24 gain 146 119 -80.74 gain 119 147 -78.56 gain 147 119 -73.16 gain 119 148 -71.01 gain 148 119 -63.94 gain 119 149 -70.48 gain 149 119 -67.07 gain 119 150 -107.00 gain 150 119 -104.42 gain 119 151 -97.05 gain 151 119 -93.41 gain 119 152 -91.84 gain 152 119 -88.02 gain 119 153 -100.31 gain 153 119 -95.70 gain 119 154 -109.25 gain 154 119 -106.54 gain 119 155 -94.04 gain 155 119 -89.90 gain 119 156 -95.46 gain 156 119 -90.56 gain 119 157 -91.81 gain 157 119 -89.38 gain 119 158 -94.40 gain 158 119 -91.48 gain 119 159 -92.71 gain 159 119 -92.18 gain 119 160 -90.23 gain 160 119 -86.85 gain 119 161 -83.70 gain 161 119 -82.75 gain 119 162 -88.10 gain 162 119 -86.86 gain 119 163 -77.90 gain 163 119 -78.59 gain 119 164 -85.92 gain 164 119 -85.97 gain 119 165 -103.68 gain 165 119 -100.78 gain 119 166 -97.58 gain 166 119 -94.44 gain 119 167 -100.64 gain 167 119 -98.22 gain 119 168 -101.88 gain 168 119 -98.36 gain 119 169 -97.55 gain 169 119 -95.14 gain 119 170 -100.12 gain 170 119 -96.94 gain 119 171 -99.46 gain 171 119 -97.36 gain 119 172 -92.12 gain 172 119 -88.21 gain 119 173 -91.71 gain 173 119 -92.45 gain 119 174 -95.74 gain 174 119 -92.53 gain 119 175 -87.00 gain 175 119 -84.93 gain 119 176 -89.01 gain 176 119 -85.90 gain 119 177 -82.32 gain 177 119 -82.21 gain 119 178 -90.65 gain 178 119 -83.99 gain 119 179 -85.24 gain 179 119 -78.00 gain 119 180 -106.36 gain 180 119 -108.57 gain 119 181 -92.82 gain 181 119 -89.05 gain 119 182 -111.07 gain 182 119 -108.38 gain 119 183 -97.66 gain 183 119 -95.25 gain 119 184 -98.91 gain 184 119 -99.25 gain 119 185 -92.00 gain 185 119 -96.21 gain 119 186 -106.56 gain 186 119 -106.34 gain 119 187 -99.05 gain 187 119 -96.57 gain 119 188 -97.64 gain 188 119 -97.56 gain 119 189 -89.93 gain 189 119 -84.58 gain 119 190 -86.64 gain 190 119 -85.20 gain 119 191 -93.31 gain 191 119 -90.58 gain 119 192 -84.83 gain 192 119 -80.80 gain 119 193 -83.11 gain 193 119 -78.07 gain 119 194 -88.28 gain 194 119 -84.02 gain 119 195 -106.95 gain 195 119 -101.23 gain 119 196 -100.99 gain 196 119 -99.59 gain 119 197 -101.40 gain 197 119 -95.13 gain 119 198 -97.65 gain 198 119 -95.90 gain 119 199 -90.39 gain 199 119 -88.74 gain 119 200 -100.90 gain 200 119 -100.59 gain 119 201 -101.69 gain 201 119 -101.28 gain 119 202 -93.37 gain 202 119 -92.09 gain 119 203 -96.12 gain 203 119 -93.96 gain 119 204 -96.27 gain 204 119 -90.75 gain 119 205 -91.61 gain 205 119 -89.84 gain 119 206 -96.10 gain 206 119 -95.44 gain 119 207 -93.98 gain 207 119 -92.73 gain 119 208 -91.89 gain 208 119 -93.24 gain 119 209 -93.52 gain 209 119 -94.45 gain 119 210 -106.81 gain 210 119 -107.92 gain 119 211 -99.55 gain 211 119 -95.88 gain 119 212 -108.40 gain 212 119 -107.74 gain 119 213 -103.39 gain 213 119 -102.06 gain 119 214 -93.47 gain 214 119 -97.53 gain 119 215 -99.64 gain 215 119 -99.10 gain 119 216 -97.82 gain 216 119 -101.19 gain 119 217 -96.16 gain 217 119 -99.79 gain 119 218 -100.37 gain 218 119 -96.81 gain 119 219 -90.58 gain 219 119 -87.50 gain 119 220 -98.45 gain 220 119 -91.46 gain 119 221 -91.62 gain 221 119 -90.31 gain 119 222 -86.60 gain 222 119 -81.09 gain 119 223 -84.98 gain 223 119 -82.72 gain 119 224 -98.99 gain 224 119 -97.19 gain 120 121 -66.35 gain 121 120 -67.37 gain 120 122 -68.79 gain 122 120 -69.56 gain 120 123 -78.49 gain 123 120 -79.61 gain 120 124 -82.29 gain 124 120 -81.39 gain 120 125 -85.47 gain 125 120 -87.91 gain 120 126 -83.76 gain 126 120 -82.85 gain 120 127 -94.10 gain 127 120 -92.82 gain 120 128 -91.66 gain 128 120 -92.97 gain 120 129 -93.03 gain 129 120 -91.55 gain 120 130 -89.08 gain 130 120 -88.89 gain 120 131 -97.94 gain 131 120 -97.53 gain 120 132 -95.05 gain 132 120 -90.64 gain 120 133 -109.71 gain 133 120 -110.48 gain 120 134 -100.11 gain 134 120 -97.74 gain 120 135 -63.93 gain 135 120 -63.86 gain 120 136 -66.95 gain 136 120 -67.33 gain 120 137 -70.70 gain 137 120 -73.99 gain 120 138 -85.02 gain 138 120 -81.84 gain 120 139 -83.70 gain 139 120 -83.78 gain 120 140 -86.66 gain 140 120 -87.57 gain 120 141 -84.54 gain 141 120 -77.43 gain 120 142 -91.61 gain 142 120 -91.24 gain 120 143 -88.01 gain 143 120 -90.37 gain 120 144 -88.85 gain 144 120 -89.58 gain 120 145 -98.29 gain 145 120 -102.41 gain 120 146 -93.77 gain 146 120 -93.88 gain 120 147 -93.80 gain 147 120 -91.02 gain 120 148 -97.49 gain 148 120 -93.03 gain 120 149 -103.44 gain 149 120 -102.64 gain 120 150 -67.22 gain 150 120 -67.25 gain 120 151 -78.98 gain 151 120 -77.96 gain 120 152 -76.12 gain 152 120 -74.92 gain 120 153 -83.19 gain 153 120 -81.20 gain 120 154 -84.88 gain 154 120 -84.79 gain 120 155 -88.97 gain 155 120 -87.45 gain 120 156 -91.24 gain 156 120 -88.96 gain 120 157 -92.59 gain 157 120 -92.78 gain 120 158 -93.09 gain 158 120 -92.79 gain 120 159 -88.16 gain 159 120 -90.24 gain 120 160 -101.75 gain 160 120 -100.98 gain 120 161 -99.52 gain 161 120 -101.20 gain 120 162 -102.29 gain 162 120 -103.67 gain 120 163 -99.10 gain 163 120 -102.40 gain 120 164 -99.35 gain 164 120 -102.02 gain 120 165 -81.54 gain 165 120 -81.27 gain 120 166 -77.56 gain 166 120 -77.03 gain 120 167 -84.16 gain 167 120 -84.36 gain 120 168 -83.09 gain 168 120 -82.19 gain 120 169 -84.15 gain 169 120 -84.36 gain 120 170 -85.67 gain 170 120 -85.11 gain 120 171 -88.83 gain 171 120 -89.35 gain 120 172 -85.99 gain 172 120 -84.70 gain 120 173 -89.98 gain 173 120 -93.34 gain 120 174 -93.13 gain 174 120 -92.53 gain 120 175 -94.26 gain 175 120 -94.80 gain 120 176 -100.48 gain 176 120 -99.99 gain 120 177 -97.60 gain 177 120 -100.11 gain 120 178 -111.20 gain 178 120 -107.16 gain 120 179 -105.51 gain 179 120 -100.89 gain 120 180 -77.42 gain 180 120 -82.24 gain 120 181 -82.33 gain 181 120 -81.18 gain 120 182 -89.20 gain 182 120 -89.13 gain 120 183 -91.34 gain 183 120 -91.55 gain 120 184 -87.13 gain 184 120 -90.08 gain 120 185 -94.75 gain 185 120 -101.57 gain 120 186 -90.29 gain 186 120 -92.69 gain 120 187 -91.07 gain 187 120 -91.20 gain 120 188 -92.05 gain 188 120 -94.60 gain 120 189 -98.97 gain 189 120 -96.24 gain 120 190 -102.99 gain 190 120 -104.17 gain 120 191 -89.91 gain 191 120 -89.80 gain 120 192 -94.55 gain 192 120 -93.13 gain 120 193 -105.95 gain 193 120 -103.52 gain 120 194 -106.29 gain 194 120 -104.64 gain 120 195 -88.29 gain 195 120 -85.19 gain 120 196 -90.47 gain 196 120 -91.68 gain 120 197 -82.94 gain 197 120 -79.28 gain 120 198 -88.40 gain 198 120 -89.26 gain 120 199 -97.92 gain 199 120 -98.88 gain 120 200 -89.77 gain 200 120 -92.07 gain 120 201 -96.05 gain 201 120 -98.26 gain 120 202 -95.23 gain 202 120 -96.58 gain 120 203 -95.92 gain 203 120 -96.38 gain 120 204 -95.99 gain 204 120 -93.09 gain 120 205 -93.25 gain 205 120 -94.10 gain 120 206 -98.95 gain 206 120 -100.90 gain 120 207 -96.70 gain 207 120 -98.07 gain 120 208 -98.61 gain 208 120 -102.59 gain 120 209 -101.39 gain 209 120 -104.93 gain 120 210 -87.65 gain 210 120 -91.37 gain 120 211 -87.84 gain 211 120 -86.79 gain 120 212 -92.44 gain 212 120 -94.40 gain 120 213 -88.91 gain 213 120 -90.20 gain 120 214 -93.41 gain 214 120 -100.08 gain 120 215 -83.38 gain 215 120 -85.45 gain 120 216 -93.17 gain 216 120 -99.15 gain 120 217 -92.96 gain 217 120 -99.21 gain 120 218 -95.02 gain 218 120 -94.08 gain 120 219 -99.16 gain 219 120 -98.70 gain 120 220 -101.62 gain 220 120 -97.24 gain 120 221 -96.66 gain 221 120 -97.96 gain 120 222 -108.22 gain 222 120 -105.33 gain 120 223 -101.17 gain 223 120 -101.52 gain 120 224 -103.70 gain 224 120 -104.52 gain 121 122 -64.52 gain 122 121 -64.27 gain 121 123 -76.24 gain 123 121 -76.33 gain 121 124 -78.28 gain 124 121 -76.36 gain 121 125 -86.04 gain 125 121 -87.46 gain 121 126 -87.26 gain 126 121 -85.33 gain 121 127 -96.87 gain 127 121 -94.56 gain 121 128 -90.80 gain 128 121 -91.08 gain 121 129 -95.64 gain 129 121 -93.14 gain 121 130 -90.79 gain 130 121 -89.58 gain 121 131 -99.27 gain 131 121 -97.83 gain 121 132 -92.95 gain 132 121 -87.52 gain 121 133 -99.67 gain 133 121 -99.42 gain 121 134 -100.61 gain 134 121 -97.21 gain 121 135 -68.70 gain 135 121 -67.61 gain 121 136 -65.43 gain 136 121 -64.79 gain 121 137 -69.47 gain 137 121 -71.73 gain 121 138 -72.67 gain 138 121 -68.47 gain 121 139 -81.39 gain 139 121 -80.45 gain 121 140 -83.90 gain 140 121 -83.79 gain 121 141 -85.33 gain 141 121 -77.19 gain 121 142 -92.72 gain 142 121 -91.33 gain 121 143 -94.95 gain 143 121 -96.29 gain 121 144 -93.68 gain 144 121 -93.39 gain 121 145 -92.23 gain 145 121 -95.33 gain 121 146 -99.61 gain 146 121 -98.69 gain 121 147 -96.39 gain 147 121 -92.58 gain 121 148 -102.00 gain 148 121 -96.52 gain 121 149 -94.72 gain 149 121 -92.90 gain 121 150 -75.69 gain 150 121 -74.71 gain 121 151 -81.14 gain 151 121 -79.09 gain 121 152 -77.34 gain 152 121 -75.11 gain 121 153 -82.13 gain 153 121 -79.12 gain 121 154 -75.09 gain 154 121 -73.98 gain 121 155 -86.02 gain 155 121 -83.48 gain 121 156 -85.50 gain 156 121 -82.19 gain 121 157 -94.65 gain 157 121 -93.83 gain 121 158 -89.43 gain 158 121 -88.10 gain 121 159 -96.11 gain 159 121 -97.16 gain 121 160 -87.83 gain 160 121 -86.04 gain 121 161 -95.66 gain 161 121 -96.31 gain 121 162 -97.39 gain 162 121 -97.75 gain 121 163 -97.52 gain 163 121 -99.80 gain 121 164 -96.13 gain 164 121 -97.78 gain 121 165 -84.69 gain 165 121 -83.39 gain 121 166 -81.83 gain 166 121 -80.28 gain 121 167 -86.44 gain 167 121 -85.62 gain 121 168 -85.81 gain 168 121 -83.88 gain 121 169 -84.52 gain 169 121 -83.70 gain 121 170 -90.58 gain 170 121 -89.00 gain 121 171 -87.97 gain 171 121 -87.47 gain 121 172 -86.20 gain 172 121 -83.88 gain 121 173 -92.14 gain 173 121 -94.48 gain 121 174 -100.54 gain 174 121 -98.92 gain 121 175 -95.12 gain 175 121 -94.64 gain 121 176 -97.35 gain 176 121 -95.84 gain 121 177 -101.17 gain 177 121 -102.66 gain 121 178 -98.54 gain 178 121 -93.47 gain 121 179 -98.18 gain 179 121 -92.54 gain 121 180 -86.65 gain 180 121 -90.46 gain 121 181 -84.69 gain 181 121 -82.51 gain 121 182 -81.64 gain 182 121 -80.55 gain 121 183 -85.24 gain 183 121 -84.42 gain 121 184 -82.02 gain 184 121 -83.95 gain 121 185 -93.71 gain 185 121 -99.50 gain 121 186 -92.26 gain 186 121 -93.63 gain 121 187 -92.53 gain 187 121 -91.64 gain 121 188 -88.11 gain 188 121 -89.63 gain 121 189 -98.10 gain 189 121 -94.35 gain 121 190 -88.50 gain 190 121 -88.66 gain 121 191 -98.66 gain 191 121 -97.53 gain 121 192 -93.66 gain 192 121 -91.22 gain 121 193 -98.03 gain 193 121 -94.58 gain 121 194 -99.38 gain 194 121 -96.71 gain 121 195 -88.31 gain 195 121 -84.18 gain 121 196 -86.36 gain 196 121 -86.55 gain 121 197 -80.52 gain 197 121 -75.84 gain 121 198 -86.68 gain 198 121 -86.52 gain 121 199 -90.32 gain 199 121 -90.27 gain 121 200 -87.57 gain 200 121 -88.85 gain 121 201 -94.12 gain 201 121 -95.31 gain 121 202 -93.66 gain 202 121 -93.98 gain 121 203 -85.91 gain 203 121 -85.35 gain 121 204 -93.79 gain 204 121 -89.87 gain 121 205 -93.20 gain 205 121 -93.02 gain 121 206 -92.10 gain 206 121 -93.03 gain 121 207 -101.45 gain 207 121 -101.80 gain 121 208 -97.06 gain 208 121 -100.01 gain 121 209 -98.86 gain 209 121 -101.38 gain 121 210 -87.98 gain 210 121 -90.68 gain 121 211 -91.18 gain 211 121 -89.10 gain 121 212 -85.41 gain 212 121 -86.35 gain 121 213 -87.99 gain 213 121 -88.26 gain 121 214 -94.61 gain 214 121 -100.27 gain 121 215 -93.14 gain 215 121 -94.20 gain 121 216 -86.98 gain 216 121 -91.94 gain 121 217 -93.45 gain 217 121 -98.68 gain 121 218 -94.26 gain 218 121 -92.30 gain 121 219 -100.14 gain 219 121 -98.66 gain 121 220 -105.62 gain 220 121 -100.22 gain 121 221 -104.14 gain 221 121 -104.42 gain 121 222 -99.63 gain 222 121 -95.72 gain 121 223 -101.86 gain 223 121 -101.19 gain 121 224 -104.08 gain 224 121 -103.87 gain 122 123 -63.54 gain 123 122 -63.88 gain 122 124 -75.21 gain 124 122 -73.54 gain 122 125 -85.10 gain 125 122 -86.77 gain 122 126 -84.96 gain 126 122 -83.28 gain 122 127 -85.72 gain 127 122 -83.66 gain 122 128 -84.87 gain 128 122 -85.41 gain 122 129 -81.31 gain 129 122 -79.06 gain 122 130 -84.55 gain 130 122 -83.59 gain 122 131 -99.44 gain 131 122 -98.25 gain 122 132 -99.40 gain 132 122 -94.22 gain 122 133 -97.07 gain 133 122 -97.07 gain 122 134 -97.33 gain 134 122 -94.18 gain 122 135 -74.92 gain 135 122 -74.08 gain 122 136 -72.16 gain 136 122 -71.76 gain 122 137 -61.50 gain 137 122 -64.02 gain 122 138 -65.60 gain 138 122 -61.65 gain 122 139 -75.30 gain 139 122 -74.62 gain 122 140 -79.07 gain 140 122 -79.20 gain 122 141 -94.55 gain 141 122 -86.66 gain 122 142 -87.74 gain 142 122 -86.59 gain 122 143 -86.31 gain 143 122 -87.90 gain 122 144 -91.47 gain 144 122 -91.43 gain 122 145 -91.10 gain 145 122 -94.45 gain 122 146 -96.11 gain 146 122 -95.44 gain 122 147 -98.49 gain 147 122 -94.93 gain 122 148 -97.58 gain 148 122 -92.35 gain 122 149 -105.28 gain 149 122 -103.71 gain 122 150 -77.29 gain 150 122 -76.55 gain 122 151 -72.42 gain 151 122 -70.63 gain 122 152 -71.20 gain 152 122 -69.22 gain 122 153 -69.46 gain 153 122 -66.69 gain 122 154 -80.47 gain 154 122 -79.61 gain 122 155 -80.40 gain 155 122 -78.11 gain 122 156 -88.83 gain 156 122 -85.77 gain 122 157 -79.68 gain 157 122 -79.10 gain 122 158 -91.91 gain 158 122 -90.83 gain 122 159 -88.18 gain 159 122 -89.48 gain 122 160 -93.12 gain 160 122 -91.58 gain 122 161 -90.96 gain 161 122 -91.86 gain 122 162 -95.57 gain 162 122 -96.18 gain 122 163 -102.45 gain 163 122 -104.97 gain 122 164 -98.21 gain 164 122 -100.10 gain 122 165 -78.67 gain 165 122 -77.62 gain 122 166 -87.82 gain 166 122 -86.52 gain 122 167 -83.46 gain 167 122 -82.89 gain 122 168 -78.68 gain 168 122 -77.00 gain 122 169 -82.10 gain 169 122 -81.53 gain 122 170 -78.84 gain 170 122 -77.51 gain 122 171 -85.57 gain 171 122 -85.32 gain 122 172 -94.04 gain 172 122 -91.97 gain 122 173 -91.37 gain 173 122 -93.96 gain 122 174 -95.62 gain 174 122 -94.25 gain 122 175 -98.77 gain 175 122 -98.54 gain 122 176 -90.04 gain 176 122 -88.78 gain 122 177 -95.46 gain 177 122 -97.20 gain 122 178 -95.82 gain 178 122 -91.00 gain 122 179 -98.65 gain 179 122 -93.25 gain 122 180 -91.37 gain 180 122 -95.42 gain 122 181 -86.22 gain 181 122 -84.30 gain 122 182 -88.28 gain 182 122 -87.44 gain 122 183 -78.35 gain 183 122 -77.79 gain 122 184 -80.13 gain 184 122 -82.31 gain 122 185 -82.18 gain 185 122 -88.23 gain 122 186 -84.13 gain 186 122 -85.75 gain 122 187 -87.21 gain 187 122 -86.56 gain 122 188 -90.94 gain 188 122 -92.71 gain 122 189 -93.99 gain 189 122 -90.48 gain 122 190 -91.48 gain 190 122 -91.89 gain 122 191 -94.14 gain 191 122 -93.26 gain 122 192 -97.71 gain 192 122 -95.52 gain 122 193 -98.88 gain 193 122 -95.68 gain 122 194 -100.08 gain 194 122 -97.66 gain 122 195 -88.94 gain 195 122 -85.07 gain 122 196 -88.21 gain 196 122 -88.65 gain 122 197 -88.74 gain 197 122 -84.31 gain 122 198 -83.78 gain 198 122 -83.87 gain 122 199 -84.09 gain 199 122 -84.28 gain 122 200 -89.13 gain 200 122 -90.66 gain 122 201 -87.96 gain 201 122 -89.40 gain 122 202 -93.78 gain 202 122 -94.35 gain 122 203 -94.56 gain 203 122 -94.24 gain 122 204 -93.06 gain 204 122 -89.39 gain 122 205 -97.23 gain 205 122 -97.30 gain 122 206 -94.22 gain 206 122 -95.40 gain 122 207 -95.51 gain 207 122 -96.11 gain 122 208 -97.72 gain 208 122 -100.91 gain 122 209 -101.40 gain 209 122 -104.17 gain 122 210 -90.62 gain 210 122 -93.56 gain 122 211 -86.77 gain 211 122 -84.95 gain 122 212 -80.79 gain 212 122 -81.98 gain 122 213 -92.95 gain 213 122 -93.46 gain 122 214 -92.20 gain 214 122 -98.10 gain 122 215 -86.86 gain 215 122 -88.16 gain 122 216 -89.71 gain 216 122 -94.92 gain 122 217 -96.03 gain 217 122 -101.50 gain 122 218 -89.51 gain 218 122 -87.79 gain 122 219 -97.73 gain 219 122 -96.49 gain 122 220 -99.08 gain 220 122 -93.93 gain 122 221 -99.88 gain 221 122 -100.41 gain 122 222 -100.40 gain 222 122 -96.74 gain 122 223 -93.02 gain 223 122 -92.60 gain 122 224 -98.46 gain 224 122 -98.51 gain 123 124 -62.71 gain 124 123 -60.70 gain 123 125 -80.90 gain 125 123 -82.23 gain 123 126 -84.23 gain 126 123 -82.21 gain 123 127 -92.97 gain 127 123 -90.57 gain 123 128 -83.38 gain 128 123 -83.58 gain 123 129 -85.60 gain 129 123 -83.00 gain 123 130 -90.36 gain 130 123 -89.06 gain 123 131 -94.71 gain 131 123 -93.18 gain 123 132 -96.96 gain 132 123 -91.44 gain 123 133 -90.79 gain 133 123 -90.44 gain 123 134 -93.99 gain 134 123 -90.50 gain 123 135 -76.01 gain 135 123 -74.84 gain 123 136 -80.71 gain 136 123 -79.97 gain 123 137 -69.48 gain 137 123 -71.66 gain 123 138 -72.30 gain 138 123 -68.01 gain 123 139 -70.88 gain 139 123 -69.85 gain 123 140 -80.17 gain 140 123 -79.97 gain 123 141 -76.81 gain 141 123 -68.58 gain 123 142 -79.72 gain 142 123 -78.23 gain 123 143 -85.72 gain 143 123 -86.97 gain 123 144 -89.91 gain 144 123 -89.53 gain 123 145 -98.45 gain 145 123 -101.45 gain 123 146 -90.51 gain 146 123 -89.50 gain 123 147 -93.01 gain 147 123 -89.12 gain 123 148 -92.20 gain 148 123 -86.63 gain 123 149 -99.47 gain 149 123 -97.56 gain 123 150 -89.75 gain 150 123 -88.67 gain 123 151 -71.41 gain 151 123 -69.28 gain 123 152 -78.77 gain 152 123 -76.45 gain 123 153 -76.44 gain 153 123 -73.33 gain 123 154 -77.43 gain 154 123 -76.22 gain 123 155 -80.28 gain 155 123 -77.65 gain 123 156 -77.29 gain 156 123 -73.89 gain 123 157 -86.08 gain 157 123 -85.16 gain 123 158 -88.61 gain 158 123 -87.19 gain 123 159 -91.34 gain 159 123 -92.31 gain 123 160 -96.41 gain 160 123 -94.53 gain 123 161 -89.67 gain 161 123 -90.23 gain 123 162 -97.51 gain 162 123 -97.78 gain 123 163 -100.63 gain 163 123 -102.81 gain 123 164 -101.97 gain 164 123 -103.53 gain 123 165 -78.12 gain 165 123 -76.73 gain 123 166 -84.69 gain 166 123 -83.05 gain 123 167 -82.85 gain 167 123 -81.94 gain 123 168 -82.02 gain 168 123 -80.00 gain 123 169 -80.83 gain 169 123 -79.92 gain 123 170 -78.96 gain 170 123 -77.29 gain 123 171 -88.59 gain 171 123 -88.00 gain 123 172 -85.22 gain 172 123 -82.82 gain 123 173 -85.40 gain 173 123 -87.65 gain 123 174 -96.08 gain 174 123 -94.37 gain 123 175 -95.99 gain 175 123 -95.42 gain 123 176 -91.67 gain 176 123 -90.07 gain 123 177 -92.23 gain 177 123 -93.63 gain 123 178 -98.80 gain 178 123 -93.64 gain 123 179 -95.67 gain 179 123 -89.93 gain 123 180 -95.28 gain 180 123 -98.99 gain 123 181 -91.94 gain 181 123 -89.67 gain 123 182 -87.68 gain 182 123 -86.50 gain 123 183 -82.32 gain 183 123 -81.41 gain 123 184 -76.47 gain 184 123 -78.31 gain 123 185 -91.44 gain 185 123 -97.15 gain 123 186 -82.09 gain 186 123 -83.38 gain 123 187 -78.56 gain 187 123 -77.58 gain 123 188 -89.55 gain 188 123 -90.98 gain 123 189 -97.96 gain 189 123 -94.12 gain 123 190 -94.79 gain 190 123 -94.86 gain 123 191 -97.36 gain 191 123 -96.14 gain 123 192 -95.06 gain 192 123 -92.53 gain 123 193 -96.05 gain 193 123 -92.51 gain 123 194 -96.95 gain 194 123 -94.19 gain 123 195 -84.67 gain 195 123 -80.46 gain 123 196 -82.48 gain 196 123 -82.57 gain 123 197 -92.11 gain 197 123 -87.35 gain 123 198 -82.90 gain 198 123 -82.64 gain 123 199 -94.06 gain 199 123 -93.92 gain 123 200 -82.08 gain 200 123 -83.27 gain 123 201 -86.10 gain 201 123 -87.20 gain 123 202 -88.66 gain 202 123 -88.89 gain 123 203 -83.74 gain 203 123 -83.08 gain 123 204 -92.93 gain 204 123 -88.92 gain 123 205 -99.44 gain 205 123 -99.17 gain 123 206 -100.64 gain 206 123 -101.47 gain 123 207 -95.11 gain 207 123 -95.37 gain 123 208 -95.80 gain 208 123 -98.66 gain 123 209 -104.97 gain 209 123 -107.40 gain 123 210 -95.16 gain 210 123 -97.76 gain 123 211 -85.87 gain 211 123 -83.70 gain 123 212 -94.70 gain 212 123 -95.55 gain 123 213 -84.40 gain 213 123 -84.58 gain 123 214 -86.18 gain 214 123 -91.74 gain 123 215 -91.79 gain 215 123 -92.75 gain 123 216 -96.61 gain 216 123 -101.48 gain 123 217 -91.79 gain 217 123 -96.93 gain 123 218 -88.69 gain 218 123 -86.63 gain 123 219 -89.44 gain 219 123 -87.87 gain 123 220 -97.10 gain 220 123 -91.61 gain 123 221 -99.79 gain 221 123 -99.98 gain 123 222 -101.57 gain 222 123 -97.57 gain 123 223 -95.14 gain 223 123 -94.38 gain 123 224 -93.12 gain 224 123 -92.83 gain 124 125 -66.33 gain 125 124 -69.67 gain 124 126 -72.39 gain 126 124 -72.38 gain 124 127 -81.81 gain 127 124 -81.42 gain 124 128 -80.48 gain 128 124 -82.69 gain 124 129 -88.10 gain 129 124 -87.52 gain 124 130 -83.07 gain 130 124 -83.78 gain 124 131 -92.32 gain 131 124 -92.80 gain 124 132 -87.96 gain 132 124 -84.45 gain 124 133 -100.52 gain 133 124 -102.19 gain 124 134 -93.57 gain 134 124 -92.10 gain 124 135 -84.19 gain 135 124 -85.02 gain 124 136 -81.30 gain 136 124 -82.57 gain 124 137 -73.04 gain 137 124 -77.22 gain 124 138 -70.83 gain 138 124 -68.55 gain 124 139 -59.20 gain 139 124 -60.19 gain 124 140 -70.22 gain 140 124 -72.03 gain 124 141 -78.61 gain 141 124 -72.40 gain 124 142 -82.97 gain 142 124 -83.50 gain 124 143 -77.18 gain 143 124 -80.44 gain 124 144 -85.25 gain 144 124 -86.88 gain 124 145 -86.48 gain 145 124 -91.50 gain 124 146 -91.61 gain 146 124 -92.62 gain 124 147 -90.26 gain 147 124 -88.37 gain 124 148 -87.35 gain 148 124 -83.79 gain 124 149 -90.62 gain 149 124 -90.72 gain 124 150 -87.63 gain 150 124 -88.56 gain 124 151 -82.76 gain 151 124 -82.63 gain 124 152 -74.36 gain 152 124 -74.05 gain 124 153 -71.33 gain 153 124 -70.24 gain 124 154 -75.43 gain 154 124 -76.24 gain 124 155 -69.51 gain 155 124 -68.89 gain 124 156 -82.94 gain 156 124 -81.55 gain 124 157 -84.40 gain 157 124 -85.49 gain 124 158 -83.09 gain 158 124 -83.68 gain 124 159 -83.91 gain 159 124 -86.89 gain 124 160 -83.11 gain 160 124 -83.24 gain 124 161 -96.12 gain 161 124 -98.69 gain 124 162 -95.79 gain 162 124 -98.07 gain 124 163 -99.89 gain 163 124 -104.08 gain 124 164 -91.35 gain 164 124 -94.91 gain 124 165 -82.23 gain 165 124 -82.85 gain 124 166 -87.80 gain 166 124 -88.17 gain 124 167 -91.09 gain 167 124 -92.19 gain 124 168 -75.73 gain 168 124 -75.72 gain 124 169 -72.95 gain 169 124 -74.05 gain 124 170 -81.11 gain 170 124 -81.45 gain 124 171 -87.09 gain 171 124 -88.51 gain 124 172 -80.36 gain 172 124 -79.97 gain 124 173 -92.44 gain 173 124 -96.70 gain 124 174 -85.45 gain 174 124 -85.75 gain 124 175 -92.82 gain 175 124 -94.26 gain 124 176 -94.28 gain 176 124 -94.69 gain 124 177 -94.59 gain 177 124 -98.00 gain 124 178 -94.60 gain 178 124 -91.45 gain 124 179 -87.38 gain 179 124 -83.65 gain 124 180 -86.57 gain 180 124 -92.29 gain 124 181 -86.69 gain 181 124 -86.44 gain 124 182 -87.09 gain 182 124 -87.92 gain 124 183 -85.05 gain 183 124 -86.15 gain 124 184 -83.24 gain 184 124 -87.09 gain 124 185 -84.01 gain 185 124 -91.73 gain 124 186 -84.60 gain 186 124 -87.90 gain 124 187 -77.34 gain 187 124 -78.37 gain 124 188 -89.64 gain 188 124 -93.08 gain 124 189 -89.34 gain 189 124 -87.51 gain 124 190 -100.03 gain 190 124 -102.11 gain 124 191 -84.22 gain 191 124 -85.00 gain 124 192 -92.46 gain 192 124 -91.94 gain 124 193 -94.21 gain 193 124 -92.68 gain 124 194 -96.56 gain 194 124 -95.81 gain 124 195 -82.67 gain 195 124 -80.47 gain 124 196 -85.44 gain 196 124 -87.55 gain 124 197 -85.41 gain 197 124 -82.65 gain 124 198 -80.77 gain 198 124 -82.53 gain 124 199 -80.24 gain 199 124 -82.10 gain 124 200 -82.07 gain 200 124 -85.27 gain 124 201 -88.49 gain 201 124 -91.60 gain 124 202 -95.85 gain 202 124 -98.10 gain 124 203 -90.48 gain 203 124 -91.84 gain 124 204 -95.20 gain 204 124 -93.20 gain 124 205 -95.50 gain 205 124 -97.24 gain 124 206 -102.04 gain 206 124 -104.89 gain 124 207 -95.10 gain 207 124 -97.37 gain 124 208 -90.86 gain 208 124 -95.73 gain 124 209 -95.78 gain 209 124 -100.22 gain 124 210 -91.29 gain 210 124 -95.90 gain 124 211 -90.19 gain 211 124 -90.04 gain 124 212 -82.29 gain 212 124 -85.15 gain 124 213 -84.96 gain 213 124 -87.14 gain 124 214 -95.92 gain 214 124 -103.50 gain 124 215 -89.17 gain 215 124 -92.15 gain 124 216 -81.97 gain 216 124 -88.85 gain 124 217 -92.24 gain 217 124 -99.39 gain 124 218 -88.89 gain 218 124 -88.84 gain 124 219 -92.77 gain 219 124 -93.20 gain 124 220 -93.65 gain 220 124 -90.18 gain 124 221 -91.25 gain 221 124 -93.45 gain 124 222 -92.26 gain 222 124 -90.26 gain 124 223 -90.81 gain 223 124 -92.06 gain 124 224 -98.65 gain 224 124 -100.37 gain 125 126 -62.67 gain 126 125 -59.32 gain 125 127 -74.04 gain 127 125 -70.32 gain 125 128 -84.17 gain 128 125 -83.04 gain 125 129 -83.77 gain 129 125 -79.85 gain 125 130 -92.41 gain 130 125 -89.78 gain 125 131 -90.26 gain 131 125 -87.40 gain 125 132 -94.25 gain 132 125 -87.40 gain 125 133 -90.68 gain 133 125 -89.01 gain 125 134 -90.57 gain 134 125 -85.76 gain 125 135 -85.44 gain 135 125 -82.93 gain 125 136 -84.16 gain 136 125 -82.10 gain 125 137 -75.53 gain 137 125 -76.38 gain 125 138 -75.67 gain 138 125 -70.05 gain 125 139 -68.19 gain 139 125 -65.84 gain 125 140 -64.19 gain 140 125 -62.66 gain 125 141 -72.51 gain 141 125 -62.96 gain 125 142 -78.04 gain 142 125 -75.23 gain 125 143 -79.67 gain 143 125 -79.60 gain 125 144 -87.73 gain 144 125 -86.02 gain 125 145 -93.07 gain 145 125 -94.74 gain 125 146 -96.03 gain 146 125 -93.70 gain 125 147 -90.88 gain 147 125 -85.65 gain 125 148 -96.25 gain 148 125 -89.35 gain 125 149 -96.98 gain 149 125 -93.74 gain 125 150 -89.36 gain 150 125 -86.96 gain 125 151 -94.99 gain 151 125 -91.53 gain 125 152 -87.33 gain 152 125 -83.68 gain 125 153 -90.81 gain 153 125 -86.38 gain 125 154 -80.02 gain 154 125 -77.49 gain 125 155 -81.03 gain 155 125 -77.07 gain 125 156 -72.84 gain 156 125 -68.11 gain 125 157 -84.39 gain 157 125 -82.15 gain 125 158 -78.89 gain 158 125 -76.14 gain 125 159 -88.50 gain 159 125 -88.14 gain 125 160 -82.14 gain 160 125 -78.94 gain 125 161 -91.71 gain 161 125 -90.95 gain 125 162 -96.93 gain 162 125 -95.88 gain 125 163 -90.84 gain 163 125 -91.69 gain 125 164 -98.18 gain 164 125 -98.40 gain 125 165 -85.35 gain 165 125 -82.64 gain 125 166 -88.69 gain 166 125 -85.73 gain 125 167 -81.91 gain 167 125 -79.67 gain 125 168 -74.13 gain 168 125 -70.78 gain 125 169 -79.39 gain 169 125 -77.16 gain 125 170 -80.92 gain 170 125 -77.93 gain 125 171 -76.06 gain 171 125 -74.14 gain 125 172 -87.89 gain 172 125 -84.16 gain 125 173 -85.77 gain 173 125 -86.68 gain 125 174 -90.49 gain 174 125 -87.45 gain 125 175 -92.23 gain 175 125 -90.33 gain 125 176 -97.89 gain 176 125 -94.96 gain 125 177 -92.51 gain 177 125 -92.59 gain 125 178 -94.32 gain 178 125 -87.83 gain 125 179 -94.43 gain 179 125 -87.37 gain 125 180 -88.48 gain 180 125 -90.86 gain 125 181 -87.47 gain 181 125 -83.88 gain 125 182 -90.28 gain 182 125 -87.77 gain 125 183 -93.49 gain 183 125 -91.26 gain 125 184 -87.15 gain 184 125 -87.66 gain 125 185 -86.97 gain 185 125 -91.36 gain 125 186 -83.96 gain 186 125 -83.92 gain 125 187 -89.85 gain 187 125 -87.54 gain 125 188 -86.61 gain 188 125 -86.71 gain 125 189 -88.93 gain 189 125 -83.75 gain 125 190 -84.97 gain 190 125 -83.71 gain 125 191 -91.72 gain 191 125 -89.17 gain 125 192 -92.70 gain 192 125 -88.85 gain 125 193 -94.57 gain 193 125 -89.70 gain 125 194 -100.11 gain 194 125 -96.02 gain 125 195 -94.88 gain 195 125 -89.34 gain 125 196 -88.33 gain 196 125 -87.10 gain 125 197 -88.84 gain 197 125 -82.75 gain 125 198 -87.28 gain 198 125 -85.69 gain 125 199 -91.10 gain 199 125 -89.63 gain 125 200 -96.63 gain 200 125 -96.49 gain 125 201 -88.50 gain 201 125 -88.27 gain 125 202 -93.33 gain 202 125 -92.24 gain 125 203 -87.77 gain 203 125 -85.79 gain 125 204 -97.14 gain 204 125 -91.80 gain 125 205 -90.04 gain 205 125 -88.45 gain 125 206 -92.25 gain 206 125 -91.76 gain 125 207 -94.83 gain 207 125 -93.76 gain 125 208 -97.48 gain 208 125 -99.02 gain 125 209 -95.72 gain 209 125 -96.82 gain 125 210 -94.98 gain 210 125 -96.26 gain 125 211 -90.68 gain 211 125 -87.19 gain 125 212 -87.74 gain 212 125 -87.26 gain 125 213 -77.92 gain 213 125 -76.77 gain 125 214 -96.01 gain 214 125 -100.25 gain 125 215 -91.69 gain 215 125 -91.32 gain 125 216 -94.03 gain 216 125 -97.58 gain 125 217 -97.23 gain 217 125 -101.04 gain 125 218 -93.17 gain 218 125 -89.79 gain 125 219 -87.88 gain 219 125 -84.97 gain 125 220 -93.60 gain 220 125 -86.79 gain 125 221 -96.97 gain 221 125 -95.84 gain 125 222 -100.06 gain 222 125 -94.73 gain 125 223 -102.88 gain 223 125 -100.79 gain 125 224 -101.86 gain 224 125 -100.24 gain 126 127 -62.08 gain 127 126 -61.71 gain 126 128 -76.63 gain 128 126 -78.85 gain 126 129 -78.79 gain 129 126 -78.22 gain 126 130 -81.97 gain 130 126 -82.69 gain 126 131 -92.33 gain 131 126 -92.82 gain 126 132 -81.15 gain 132 126 -77.66 gain 126 133 -92.21 gain 133 126 -93.89 gain 126 134 -88.60 gain 134 126 -87.14 gain 126 135 -85.88 gain 135 126 -86.73 gain 126 136 -84.39 gain 136 126 -85.68 gain 126 137 -83.18 gain 137 126 -87.38 gain 126 138 -78.17 gain 138 126 -75.90 gain 126 139 -67.99 gain 139 126 -68.99 gain 126 140 -72.71 gain 140 126 -74.53 gain 126 141 -61.66 gain 141 126 -55.46 gain 126 142 -73.59 gain 142 126 -74.13 gain 126 143 -69.97 gain 143 126 -73.24 gain 126 144 -81.64 gain 144 126 -83.28 gain 126 145 -72.95 gain 145 126 -77.98 gain 126 146 -79.60 gain 146 126 -80.62 gain 126 147 -87.86 gain 147 126 -85.99 gain 126 148 -91.54 gain 148 126 -87.99 gain 126 149 -92.48 gain 149 126 -92.59 gain 126 150 -87.84 gain 150 126 -88.79 gain 126 151 -82.37 gain 151 126 -82.26 gain 126 152 -90.13 gain 152 126 -89.84 gain 126 153 -85.20 gain 153 126 -84.12 gain 126 154 -71.14 gain 154 126 -71.96 gain 126 155 -73.92 gain 155 126 -73.32 gain 126 156 -69.84 gain 156 126 -68.47 gain 126 157 -68.70 gain 157 126 -69.81 gain 126 158 -79.65 gain 158 126 -80.25 gain 126 159 -79.14 gain 159 126 -82.13 gain 126 160 -87.75 gain 160 126 -87.89 gain 126 161 -80.70 gain 161 126 -83.29 gain 126 162 -86.64 gain 162 126 -88.94 gain 126 163 -93.40 gain 163 126 -97.61 gain 126 164 -94.38 gain 164 126 -97.96 gain 126 165 -91.46 gain 165 126 -92.10 gain 126 166 -86.32 gain 166 126 -86.71 gain 126 167 -90.32 gain 167 126 -91.43 gain 126 168 -83.15 gain 168 126 -83.15 gain 126 169 -85.35 gain 169 126 -86.47 gain 126 170 -79.09 gain 170 126 -79.44 gain 126 171 -78.99 gain 171 126 -80.43 gain 126 172 -75.50 gain 172 126 -75.12 gain 126 173 -73.40 gain 173 126 -77.67 gain 126 174 -83.52 gain 174 126 -83.84 gain 126 175 -86.65 gain 175 126 -88.10 gain 126 176 -85.72 gain 176 126 -86.14 gain 126 177 -89.52 gain 177 126 -92.95 gain 126 178 -97.06 gain 178 126 -93.93 gain 126 179 -94.35 gain 179 126 -90.64 gain 126 180 -88.26 gain 180 126 -94.00 gain 126 181 -88.84 gain 181 126 -88.60 gain 126 182 -91.52 gain 182 126 -92.36 gain 126 183 -90.40 gain 183 126 -91.51 gain 126 184 -79.50 gain 184 126 -83.36 gain 126 185 -81.08 gain 185 126 -88.81 gain 126 186 -87.83 gain 186 126 -91.14 gain 126 187 -82.62 gain 187 126 -83.66 gain 126 188 -82.06 gain 188 126 -85.51 gain 126 189 -78.97 gain 189 126 -77.14 gain 126 190 -84.21 gain 190 126 -86.31 gain 126 191 -87.49 gain 191 126 -88.29 gain 126 192 -86.55 gain 192 126 -86.05 gain 126 193 -93.36 gain 193 126 -91.84 gain 126 194 -89.43 gain 194 126 -88.69 gain 126 195 -88.53 gain 195 126 -86.34 gain 126 196 -85.88 gain 196 126 -88.00 gain 126 197 -83.07 gain 197 126 -80.33 gain 126 198 -84.27 gain 198 126 -86.04 gain 126 199 -86.12 gain 199 126 -88.00 gain 126 200 -83.74 gain 200 126 -86.96 gain 126 201 -84.33 gain 201 126 -87.46 gain 126 202 -83.55 gain 202 126 -85.80 gain 126 203 -85.96 gain 203 126 -87.33 gain 126 204 -86.34 gain 204 126 -84.35 gain 126 205 -92.35 gain 205 126 -94.11 gain 126 206 -85.40 gain 206 126 -88.26 gain 126 207 -96.81 gain 207 126 -99.09 gain 126 208 -96.81 gain 208 126 -101.70 gain 126 209 -83.65 gain 209 126 -88.10 gain 126 210 -90.41 gain 210 126 -95.04 gain 126 211 -90.93 gain 211 126 -90.79 gain 126 212 -92.05 gain 212 126 -94.93 gain 126 213 -87.12 gain 213 126 -89.32 gain 126 214 -91.13 gain 214 126 -98.71 gain 126 215 -92.96 gain 215 126 -95.95 gain 126 216 -80.19 gain 216 126 -87.08 gain 126 217 -86.44 gain 217 126 -93.60 gain 126 218 -93.50 gain 218 126 -93.46 gain 126 219 -90.74 gain 219 126 -91.19 gain 126 220 -91.14 gain 220 126 -87.68 gain 126 221 -88.19 gain 221 126 -90.40 gain 126 222 -97.32 gain 222 126 -95.34 gain 126 223 -91.17 gain 223 126 -92.44 gain 126 224 -95.25 gain 224 126 -96.98 gain 127 128 -61.95 gain 128 127 -64.54 gain 127 129 -73.68 gain 129 127 -73.48 gain 127 130 -81.53 gain 130 127 -82.63 gain 127 131 -73.68 gain 131 127 -74.55 gain 127 132 -82.47 gain 132 127 -79.35 gain 127 133 -79.95 gain 133 127 -82.00 gain 127 134 -88.65 gain 134 127 -87.56 gain 127 135 -89.36 gain 135 127 -90.58 gain 127 136 -86.45 gain 136 127 -88.11 gain 127 137 -80.64 gain 137 127 -85.22 gain 127 138 -87.42 gain 138 127 -85.52 gain 127 139 -76.42 gain 139 127 -77.79 gain 127 140 -82.36 gain 140 127 -84.56 gain 127 141 -75.49 gain 141 127 -69.66 gain 127 142 -66.96 gain 142 127 -67.87 gain 127 143 -65.54 gain 143 127 -69.19 gain 127 144 -72.47 gain 144 127 -74.49 gain 127 145 -80.40 gain 145 127 -85.81 gain 127 146 -90.90 gain 146 127 -92.30 gain 127 147 -82.56 gain 147 127 -81.06 gain 127 148 -84.06 gain 148 127 -80.89 gain 127 149 -93.35 gain 149 127 -93.83 gain 127 150 -89.63 gain 150 127 -90.96 gain 127 151 -83.33 gain 151 127 -83.59 gain 127 152 -88.17 gain 152 127 -88.24 gain 127 153 -87.67 gain 153 127 -86.96 gain 127 154 -80.34 gain 154 127 -81.54 gain 127 155 -77.47 gain 155 127 -77.23 gain 127 156 -77.23 gain 156 127 -76.23 gain 127 157 -78.70 gain 157 127 -80.18 gain 127 158 -76.13 gain 158 127 -77.11 gain 127 159 -75.72 gain 159 127 -79.08 gain 127 160 -78.66 gain 160 127 -79.17 gain 127 161 -83.63 gain 161 127 -86.59 gain 127 162 -81.94 gain 162 127 -84.60 gain 127 163 -89.58 gain 163 127 -94.17 gain 127 164 -96.43 gain 164 127 -100.38 gain 127 165 -89.07 gain 165 127 -90.08 gain 127 166 -89.93 gain 166 127 -90.69 gain 127 167 -84.94 gain 167 127 -86.43 gain 127 168 -81.40 gain 168 127 -81.78 gain 127 169 -85.56 gain 169 127 -87.05 gain 127 170 -68.81 gain 170 127 -69.54 gain 127 171 -78.36 gain 171 127 -80.16 gain 127 172 -75.31 gain 172 127 -75.30 gain 127 173 -81.96 gain 173 127 -86.61 gain 127 174 -76.59 gain 174 127 -77.28 gain 127 175 -79.76 gain 175 127 -81.59 gain 127 176 -81.68 gain 176 127 -82.48 gain 127 177 -83.01 gain 177 127 -86.81 gain 127 178 -88.44 gain 178 127 -85.68 gain 127 179 -86.04 gain 179 127 -82.70 gain 127 180 -90.22 gain 180 127 -96.33 gain 127 181 -83.27 gain 181 127 -83.40 gain 127 182 -91.45 gain 182 127 -92.67 gain 127 183 -88.05 gain 183 127 -89.54 gain 127 184 -90.67 gain 184 127 -94.91 gain 127 185 -82.65 gain 185 127 -90.76 gain 127 186 -78.03 gain 186 127 -81.71 gain 127 187 -75.95 gain 187 127 -77.36 gain 127 188 -82.36 gain 188 127 -86.18 gain 127 189 -82.84 gain 189 127 -81.39 gain 127 190 -87.67 gain 190 127 -90.14 gain 127 191 -92.77 gain 191 127 -93.94 gain 127 192 -95.77 gain 192 127 -95.64 gain 127 193 -91.24 gain 193 127 -90.10 gain 127 194 -80.37 gain 194 127 -80.01 gain 127 195 -93.77 gain 195 127 -91.95 gain 127 196 -90.17 gain 196 127 -92.67 gain 127 197 -85.71 gain 197 127 -83.34 gain 127 198 -85.42 gain 198 127 -87.56 gain 127 199 -89.39 gain 199 127 -91.64 gain 127 200 -88.20 gain 200 127 -91.78 gain 127 201 -85.43 gain 201 127 -88.93 gain 127 202 -91.68 gain 202 127 -94.31 gain 127 203 -87.95 gain 203 127 -89.69 gain 127 204 -87.59 gain 204 127 -85.98 gain 127 205 -89.06 gain 205 127 -91.19 gain 127 206 -88.11 gain 206 127 -91.34 gain 127 207 -91.39 gain 207 127 -94.05 gain 127 208 -91.82 gain 208 127 -97.07 gain 127 209 -84.00 gain 209 127 -88.82 gain 127 210 -87.17 gain 210 127 -92.17 gain 127 211 -90.28 gain 211 127 -90.51 gain 127 212 -93.70 gain 212 127 -96.95 gain 127 213 -87.02 gain 213 127 -89.59 gain 127 214 -88.28 gain 214 127 -96.24 gain 127 215 -84.24 gain 215 127 -87.60 gain 127 216 -85.04 gain 216 127 -92.31 gain 127 217 -87.05 gain 217 127 -94.58 gain 127 218 -91.39 gain 218 127 -91.73 gain 127 219 -82.50 gain 219 127 -83.32 gain 127 220 -84.78 gain 220 127 -81.69 gain 127 221 -89.13 gain 221 127 -91.72 gain 127 222 -92.39 gain 222 127 -90.78 gain 127 223 -95.71 gain 223 127 -97.34 gain 127 224 -90.07 gain 224 127 -92.17 gain 128 129 -65.95 gain 129 128 -63.16 gain 128 130 -70.97 gain 130 128 -69.48 gain 128 131 -76.94 gain 131 128 -75.21 gain 128 132 -84.38 gain 132 128 -78.66 gain 128 133 -87.77 gain 133 128 -87.23 gain 128 134 -85.26 gain 134 128 -81.58 gain 128 135 -89.41 gain 135 128 -88.04 gain 128 136 -88.85 gain 136 128 -87.91 gain 128 137 -88.07 gain 137 128 -90.05 gain 128 138 -90.90 gain 138 128 -86.41 gain 128 139 -83.57 gain 139 128 -82.35 gain 128 140 -84.74 gain 140 128 -84.34 gain 128 141 -74.14 gain 141 128 -65.72 gain 128 142 -76.93 gain 142 128 -75.25 gain 128 143 -61.41 gain 143 128 -62.47 gain 128 144 -68.65 gain 144 128 -68.07 gain 128 145 -80.29 gain 145 128 -83.09 gain 128 146 -82.70 gain 146 128 -81.50 gain 128 147 -87.54 gain 147 128 -83.45 gain 128 148 -95.91 gain 148 128 -90.14 gain 128 149 -95.50 gain 149 128 -93.39 gain 128 150 -101.28 gain 150 128 -100.00 gain 128 151 -91.64 gain 151 128 -89.31 gain 128 152 -92.35 gain 152 128 -89.84 gain 128 153 -91.93 gain 153 128 -88.63 gain 128 154 -91.74 gain 154 128 -90.34 gain 128 155 -83.99 gain 155 128 -81.16 gain 128 156 -81.82 gain 156 128 -78.23 gain 128 157 -85.68 gain 157 128 -84.56 gain 128 158 -77.48 gain 158 128 -75.87 gain 128 159 -78.03 gain 159 128 -78.80 gain 128 160 -79.54 gain 160 128 -77.47 gain 128 161 -79.13 gain 161 128 -79.49 gain 128 162 -82.94 gain 162 128 -83.02 gain 128 163 -85.14 gain 163 128 -87.13 gain 128 164 -93.62 gain 164 128 -94.98 gain 128 165 -96.54 gain 165 128 -94.96 gain 128 166 -88.67 gain 166 128 -86.83 gain 128 167 -96.43 gain 167 128 -95.32 gain 128 168 -81.23 gain 168 128 -79.02 gain 128 169 -89.56 gain 169 128 -88.46 gain 128 170 -84.59 gain 170 128 -82.72 gain 128 171 -85.98 gain 171 128 -85.19 gain 128 172 -83.40 gain 172 128 -80.80 gain 128 173 -87.64 gain 173 128 -89.69 gain 128 174 -80.50 gain 174 128 -78.60 gain 128 175 -83.32 gain 175 128 -82.55 gain 128 176 -81.80 gain 176 128 -80.00 gain 128 177 -87.90 gain 177 128 -89.10 gain 128 178 -85.38 gain 178 128 -80.02 gain 128 179 -88.28 gain 179 128 -82.34 gain 128 180 -91.84 gain 180 128 -95.35 gain 128 181 -91.85 gain 181 128 -89.39 gain 128 182 -88.09 gain 182 128 -86.72 gain 128 183 -87.40 gain 183 128 -86.30 gain 128 184 -89.12 gain 184 128 -90.77 gain 128 185 -87.27 gain 185 128 -92.78 gain 128 186 -80.59 gain 186 128 -81.68 gain 128 187 -86.05 gain 187 128 -84.87 gain 128 188 -86.46 gain 188 128 -87.69 gain 128 189 -89.61 gain 189 128 -85.57 gain 128 190 -80.56 gain 190 128 -80.44 gain 128 191 -89.89 gain 191 128 -88.47 gain 128 192 -88.67 gain 192 128 -85.95 gain 128 193 -92.23 gain 193 128 -88.49 gain 128 194 -89.48 gain 194 128 -86.52 gain 128 195 -97.92 gain 195 128 -93.51 gain 128 196 -91.37 gain 196 128 -91.28 gain 128 197 -98.50 gain 197 128 -93.53 gain 128 198 -84.02 gain 198 128 -83.57 gain 128 199 -77.67 gain 199 128 -77.32 gain 128 200 -86.93 gain 200 128 -87.92 gain 128 201 -92.20 gain 201 128 -93.10 gain 128 202 -93.56 gain 202 128 -93.59 gain 128 203 -89.03 gain 203 128 -88.18 gain 128 204 -86.60 gain 204 128 -82.39 gain 128 205 -85.06 gain 205 128 -84.59 gain 128 206 -87.61 gain 206 128 -88.25 gain 128 207 -87.49 gain 207 128 -87.55 gain 128 208 -93.75 gain 208 128 -96.41 gain 128 209 -93.69 gain 209 128 -95.92 gain 128 210 -97.30 gain 210 128 -99.71 gain 128 211 -91.28 gain 211 128 -88.92 gain 128 212 -87.17 gain 212 128 -87.83 gain 128 213 -88.21 gain 213 128 -88.19 gain 128 214 -92.28 gain 214 128 -97.65 gain 128 215 -91.28 gain 215 128 -92.05 gain 128 216 -85.35 gain 216 128 -90.03 gain 128 217 -93.78 gain 217 128 -98.72 gain 128 218 -90.35 gain 218 128 -88.10 gain 128 219 -88.52 gain 219 128 -86.74 gain 128 220 -84.05 gain 220 128 -78.37 gain 128 221 -91.26 gain 221 128 -91.25 gain 128 222 -87.60 gain 222 128 -83.40 gain 128 223 -100.72 gain 223 128 -99.76 gain 128 224 -94.27 gain 224 128 -93.78 gain 129 130 -71.60 gain 130 129 -72.89 gain 129 131 -74.54 gain 131 129 -75.61 gain 129 132 -70.99 gain 132 129 -68.07 gain 129 133 -73.16 gain 133 129 -75.41 gain 129 134 -86.70 gain 134 129 -85.81 gain 129 135 -94.50 gain 135 129 -95.91 gain 129 136 -86.54 gain 136 129 -88.39 gain 129 137 -83.85 gain 137 129 -88.62 gain 129 138 -91.15 gain 138 129 -89.45 gain 129 139 -83.40 gain 139 129 -84.96 gain 129 140 -82.43 gain 140 129 -84.83 gain 129 141 -74.16 gain 141 129 -68.53 gain 129 142 -67.18 gain 142 129 -68.29 gain 129 143 -72.58 gain 143 129 -76.42 gain 129 144 -68.37 gain 144 129 -70.58 gain 129 145 -69.90 gain 145 129 -75.50 gain 129 146 -69.62 gain 146 129 -71.20 gain 129 147 -79.22 gain 147 129 -77.91 gain 129 148 -85.44 gain 148 129 -82.46 gain 129 149 -84.16 gain 149 129 -84.84 gain 129 150 -91.46 gain 150 129 -92.97 gain 129 151 -86.19 gain 151 129 -86.65 gain 129 152 -91.95 gain 152 129 -92.22 gain 129 153 -88.39 gain 153 129 -87.88 gain 129 154 -83.17 gain 154 129 -84.56 gain 129 155 -86.57 gain 155 129 -86.54 gain 129 156 -82.04 gain 156 129 -81.24 gain 129 157 -70.76 gain 157 129 -72.44 gain 129 158 -78.40 gain 158 129 -79.58 gain 129 159 -72.99 gain 159 129 -76.55 gain 129 160 -76.54 gain 160 129 -77.25 gain 129 161 -78.13 gain 161 129 -81.28 gain 129 162 -81.02 gain 162 129 -83.88 gain 129 163 -83.71 gain 163 129 -88.49 gain 129 164 -83.32 gain 164 129 -87.47 gain 129 165 -88.60 gain 165 129 -89.81 gain 129 166 -100.00 gain 166 129 -100.96 gain 129 167 -90.74 gain 167 129 -92.42 gain 129 168 -82.50 gain 168 129 -83.08 gain 129 169 -82.47 gain 169 129 -84.16 gain 129 170 -83.23 gain 170 129 -84.15 gain 129 171 -84.18 gain 171 129 -86.18 gain 129 172 -81.64 gain 172 129 -81.83 gain 129 173 -72.36 gain 173 129 -77.20 gain 129 174 -79.07 gain 174 129 -79.96 gain 129 175 -76.83 gain 175 129 -78.85 gain 129 176 -76.09 gain 176 129 -77.08 gain 129 177 -86.75 gain 177 129 -90.74 gain 129 178 -85.71 gain 178 129 -83.15 gain 129 179 -93.68 gain 179 129 -90.53 gain 129 180 -97.00 gain 180 129 -103.30 gain 129 181 -87.05 gain 181 129 -87.38 gain 129 182 -95.57 gain 182 129 -96.99 gain 129 183 -81.59 gain 183 129 -83.28 gain 129 184 -89.60 gain 184 129 -94.03 gain 129 185 -88.21 gain 185 129 -96.51 gain 129 186 -82.74 gain 186 129 -86.62 gain 129 187 -90.68 gain 187 129 -92.29 gain 129 188 -75.44 gain 188 129 -79.46 gain 129 189 -83.69 gain 189 129 -82.44 gain 129 190 -85.61 gain 190 129 -88.28 gain 129 191 -81.42 gain 191 129 -82.79 gain 129 192 -86.85 gain 192 129 -86.92 gain 129 193 -87.15 gain 193 129 -86.20 gain 129 194 -99.42 gain 194 129 -99.26 gain 129 195 -100.66 gain 195 129 -99.04 gain 129 196 -87.28 gain 196 129 -89.97 gain 129 197 -87.01 gain 197 129 -84.83 gain 129 198 -93.96 gain 198 129 -96.30 gain 129 199 -87.34 gain 199 129 -89.78 gain 129 200 -90.54 gain 200 129 -94.33 gain 129 201 -86.05 gain 201 129 -89.74 gain 129 202 -88.21 gain 202 129 -91.04 gain 129 203 -89.88 gain 203 129 -91.82 gain 129 204 -87.16 gain 204 129 -85.74 gain 129 205 -88.90 gain 205 129 -91.23 gain 129 206 -89.76 gain 206 129 -93.19 gain 129 207 -92.89 gain 207 129 -95.74 gain 129 208 -88.31 gain 208 129 -93.76 gain 129 209 -85.01 gain 209 129 -90.03 gain 129 210 -98.80 gain 210 129 -104.00 gain 129 211 -92.43 gain 211 129 -92.86 gain 129 212 -92.41 gain 212 129 -95.85 gain 129 213 -95.40 gain 213 129 -98.17 gain 129 214 -89.61 gain 214 129 -97.77 gain 129 215 -89.29 gain 215 129 -92.85 gain 129 216 -86.37 gain 216 129 -93.84 gain 129 217 -95.17 gain 217 129 -102.90 gain 129 218 -84.98 gain 218 129 -85.52 gain 129 219 -84.23 gain 219 129 -85.25 gain 129 220 -90.23 gain 220 129 -87.34 gain 129 221 -91.62 gain 221 129 -94.41 gain 129 222 -86.22 gain 222 129 -84.81 gain 129 223 -90.74 gain 223 129 -92.58 gain 129 224 -88.79 gain 224 129 -91.09 gain 130 131 -64.45 gain 131 130 -64.23 gain 130 132 -67.45 gain 132 130 -63.23 gain 130 133 -75.10 gain 133 130 -76.06 gain 130 134 -87.91 gain 134 130 -85.73 gain 130 135 -93.99 gain 135 130 -94.12 gain 130 136 -90.67 gain 136 130 -91.23 gain 130 137 -92.87 gain 137 130 -96.35 gain 130 138 -100.16 gain 138 130 -97.17 gain 130 139 -88.92 gain 139 130 -89.19 gain 130 140 -90.95 gain 140 130 -92.05 gain 130 141 -82.95 gain 141 130 -76.02 gain 130 142 -80.55 gain 142 130 -80.36 gain 130 143 -76.91 gain 143 130 -79.47 gain 130 144 -77.38 gain 144 130 -78.30 gain 130 145 -68.17 gain 145 130 -72.48 gain 130 146 -60.25 gain 146 130 -60.55 gain 130 147 -77.10 gain 147 130 -74.50 gain 130 148 -76.33 gain 148 130 -72.06 gain 130 149 -86.29 gain 149 130 -85.68 gain 130 150 -94.79 gain 150 130 -95.01 gain 130 151 -93.71 gain 151 130 -92.88 gain 130 152 -88.37 gain 152 130 -87.35 gain 130 153 -101.17 gain 153 130 -99.37 gain 130 154 -85.73 gain 154 130 -85.83 gain 130 155 -89.39 gain 155 130 -88.07 gain 130 156 -91.00 gain 156 130 -88.90 gain 130 157 -79.61 gain 157 130 -79.99 gain 130 158 -80.69 gain 158 130 -80.57 gain 130 159 -76.52 gain 159 130 -78.79 gain 130 160 -70.46 gain 160 130 -69.89 gain 130 161 -79.63 gain 161 130 -81.49 gain 130 162 -75.94 gain 162 130 -77.51 gain 130 163 -81.94 gain 163 130 -85.42 gain 130 164 -84.36 gain 164 130 -87.22 gain 130 165 -97.42 gain 165 130 -97.33 gain 130 166 -93.97 gain 166 130 -93.63 gain 130 167 -94.54 gain 167 130 -94.93 gain 130 168 -90.95 gain 168 130 -90.24 gain 130 169 -98.41 gain 169 130 -98.81 gain 130 170 -85.34 gain 170 130 -84.97 gain 130 171 -82.87 gain 171 130 -83.59 gain 130 172 -81.20 gain 172 130 -80.10 gain 130 173 -78.44 gain 173 130 -81.99 gain 130 174 -79.77 gain 174 130 -79.37 gain 130 175 -85.77 gain 175 130 -86.50 gain 130 176 -79.18 gain 176 130 -78.88 gain 130 177 -84.31 gain 177 130 -87.01 gain 130 178 -80.01 gain 178 130 -76.15 gain 130 179 -88.02 gain 179 130 -83.59 gain 130 180 -97.38 gain 180 130 -102.40 gain 130 181 -93.65 gain 181 130 -92.68 gain 130 182 -91.23 gain 182 130 -91.35 gain 130 183 -90.93 gain 183 130 -91.32 gain 130 184 -93.48 gain 184 130 -96.62 gain 130 185 -91.76 gain 185 130 -98.77 gain 130 186 -81.98 gain 186 130 -84.57 gain 130 187 -86.12 gain 187 130 -86.44 gain 130 188 -90.10 gain 188 130 -92.84 gain 130 189 -84.96 gain 189 130 -82.42 gain 130 190 -72.57 gain 190 130 -73.94 gain 130 191 -83.89 gain 191 130 -83.97 gain 130 192 -80.72 gain 192 130 -79.49 gain 130 193 -88.70 gain 193 130 -86.46 gain 130 194 -88.97 gain 194 130 -87.52 gain 130 195 -96.47 gain 195 130 -93.56 gain 130 196 -97.99 gain 196 130 -99.39 gain 130 197 -101.12 gain 197 130 -97.66 gain 130 198 -91.57 gain 198 130 -92.62 gain 130 199 -94.54 gain 199 130 -95.69 gain 130 200 -93.75 gain 200 130 -96.24 gain 130 201 -89.67 gain 201 130 -92.07 gain 130 202 -86.23 gain 202 130 -87.77 gain 130 203 -88.99 gain 203 130 -89.64 gain 130 204 -82.96 gain 204 130 -80.25 gain 130 205 -89.44 gain 205 130 -90.47 gain 130 206 -86.61 gain 206 130 -88.75 gain 130 207 -87.74 gain 207 130 -89.30 gain 130 208 -84.56 gain 208 130 -88.72 gain 130 209 -91.28 gain 209 130 -95.01 gain 130 210 -96.08 gain 210 130 -99.99 gain 130 211 -94.72 gain 211 130 -93.86 gain 130 212 -96.71 gain 212 130 -98.86 gain 130 213 -96.17 gain 213 130 -97.65 gain 130 214 -88.82 gain 214 130 -95.68 gain 130 215 -87.75 gain 215 130 -90.02 gain 130 216 -83.49 gain 216 130 -89.67 gain 130 217 -94.04 gain 217 130 -100.48 gain 130 218 -93.01 gain 218 130 -92.26 gain 130 219 -91.17 gain 219 130 -90.90 gain 130 220 -89.59 gain 220 130 -85.40 gain 130 221 -84.96 gain 221 130 -86.45 gain 130 222 -90.69 gain 222 130 -87.99 gain 130 223 -84.92 gain 223 130 -85.46 gain 130 224 -98.71 gain 224 130 -99.72 gain 131 132 -67.09 gain 132 131 -63.10 gain 131 133 -70.75 gain 133 131 -71.93 gain 131 134 -79.75 gain 134 131 -77.80 gain 131 135 -92.56 gain 135 131 -92.91 gain 131 136 -89.57 gain 136 131 -90.36 gain 131 137 -94.38 gain 137 131 -98.08 gain 131 138 -96.11 gain 138 131 -93.35 gain 131 139 -89.01 gain 139 131 -89.51 gain 131 140 -94.74 gain 140 131 -96.07 gain 131 141 -85.37 gain 141 131 -78.68 gain 131 142 -84.64 gain 142 131 -84.68 gain 131 143 -77.62 gain 143 131 -80.40 gain 131 144 -77.91 gain 144 131 -79.05 gain 131 145 -65.82 gain 145 131 -70.35 gain 131 146 -61.56 gain 146 131 -62.08 gain 131 147 -66.63 gain 147 131 -64.26 gain 131 148 -71.39 gain 148 131 -67.35 gain 131 149 -70.61 gain 149 131 -70.23 gain 131 150 -94.70 gain 150 131 -95.15 gain 131 151 -100.08 gain 151 131 -99.47 gain 131 152 -96.53 gain 152 131 -95.74 gain 131 153 -92.36 gain 153 131 -90.78 gain 131 154 -87.90 gain 154 131 -88.23 gain 131 155 -89.66 gain 155 131 -88.56 gain 131 156 -80.47 gain 156 131 -78.61 gain 131 157 -84.65 gain 157 131 -85.26 gain 131 158 -79.70 gain 158 131 -79.81 gain 131 159 -67.48 gain 159 131 -69.97 gain 131 160 -80.43 gain 160 131 -80.08 gain 131 161 -81.49 gain 161 131 -83.58 gain 131 162 -86.27 gain 162 131 -88.06 gain 131 163 -80.63 gain 163 131 -84.35 gain 131 164 -72.52 gain 164 131 -75.60 gain 131 165 -102.16 gain 165 131 -102.30 gain 131 166 -90.91 gain 166 131 -90.80 gain 131 167 -95.87 gain 167 131 -96.49 gain 131 168 -95.73 gain 168 131 -95.24 gain 131 169 -95.40 gain 169 131 -96.02 gain 131 170 -88.30 gain 170 131 -88.16 gain 131 171 -91.75 gain 171 131 -92.69 gain 131 172 -82.39 gain 172 131 -81.52 gain 131 173 -95.34 gain 173 131 -99.12 gain 131 174 -82.64 gain 174 131 -82.46 gain 131 175 -68.13 gain 175 131 -69.08 gain 131 176 -76.28 gain 176 131 -76.21 gain 131 177 -77.30 gain 177 131 -80.23 gain 131 178 -81.53 gain 178 131 -77.90 gain 131 179 -82.76 gain 179 131 -78.55 gain 131 180 -96.91 gain 180 131 -102.15 gain 131 181 -95.41 gain 181 131 -94.67 gain 131 182 -98.36 gain 182 131 -98.71 gain 131 183 -95.53 gain 183 131 -96.16 gain 131 184 -80.34 gain 184 131 -83.71 gain 131 185 -89.75 gain 185 131 -96.99 gain 131 186 -98.01 gain 186 131 -100.82 gain 131 187 -86.27 gain 187 131 -86.81 gain 131 188 -85.87 gain 188 131 -88.83 gain 131 189 -80.03 gain 189 131 -77.72 gain 131 190 -76.25 gain 190 131 -77.85 gain 131 191 -79.07 gain 191 131 -79.37 gain 131 192 -81.38 gain 192 131 -80.38 gain 131 193 -87.85 gain 193 131 -85.84 gain 131 194 -85.08 gain 194 131 -83.85 gain 131 195 -98.77 gain 195 131 -96.09 gain 131 196 -94.94 gain 196 131 -96.57 gain 131 197 -94.93 gain 197 131 -91.69 gain 131 198 -90.92 gain 198 131 -92.20 gain 131 199 -97.25 gain 199 131 -98.63 gain 131 200 -95.51 gain 200 131 -98.23 gain 131 201 -88.63 gain 201 131 -91.26 gain 131 202 -91.64 gain 202 131 -93.40 gain 131 203 -85.17 gain 203 131 -86.04 gain 131 204 -93.27 gain 204 131 -90.79 gain 131 205 -75.98 gain 205 131 -77.24 gain 131 206 -84.00 gain 206 131 -86.36 gain 131 207 -88.42 gain 207 131 -90.20 gain 131 208 -88.73 gain 208 131 -93.11 gain 131 209 -79.95 gain 209 131 -83.90 gain 131 210 -99.80 gain 210 131 -103.93 gain 131 211 -97.69 gain 211 131 -97.05 gain 131 212 -91.88 gain 212 131 -94.25 gain 131 213 -93.74 gain 213 131 -95.45 gain 131 214 -93.13 gain 214 131 -100.22 gain 131 215 -90.54 gain 215 131 -93.03 gain 131 216 -84.03 gain 216 131 -90.43 gain 131 217 -95.72 gain 217 131 -102.39 gain 131 218 -89.37 gain 218 131 -88.84 gain 131 219 -88.22 gain 219 131 -88.17 gain 131 220 -88.57 gain 220 131 -84.61 gain 131 221 -78.62 gain 221 131 -80.34 gain 131 222 -92.13 gain 222 131 -89.65 gain 131 223 -86.75 gain 223 131 -87.52 gain 131 224 -86.72 gain 224 131 -87.96 gain 132 133 -58.89 gain 133 132 -64.06 gain 132 134 -70.58 gain 134 132 -72.62 gain 132 135 -89.84 gain 135 132 -94.18 gain 132 136 -94.26 gain 136 132 -99.04 gain 132 137 -88.02 gain 137 132 -95.72 gain 132 138 -90.59 gain 138 132 -91.81 gain 132 139 -81.55 gain 139 132 -86.04 gain 132 140 -87.67 gain 140 132 -92.99 gain 132 141 -82.60 gain 141 132 -79.89 gain 132 142 -75.55 gain 142 132 -79.59 gain 132 143 -78.85 gain 143 132 -85.62 gain 132 144 -77.88 gain 144 132 -83.02 gain 132 145 -70.45 gain 145 132 -78.98 gain 132 146 -64.92 gain 146 132 -69.43 gain 132 147 -57.71 gain 147 132 -59.34 gain 132 148 -61.36 gain 148 132 -61.32 gain 132 149 -73.92 gain 149 132 -77.53 gain 132 150 -88.84 gain 150 132 -93.28 gain 132 151 -89.83 gain 151 132 -93.22 gain 132 152 -97.09 gain 152 132 -100.29 gain 132 153 -88.29 gain 153 132 -90.70 gain 132 154 -77.24 gain 154 132 -81.55 gain 132 155 -91.61 gain 155 132 -94.50 gain 132 156 -80.58 gain 156 132 -82.70 gain 132 157 -80.37 gain 157 132 -84.97 gain 132 158 -88.35 gain 158 132 -92.45 gain 132 159 -74.76 gain 159 132 -81.25 gain 132 160 -67.86 gain 160 132 -71.50 gain 132 161 -71.19 gain 161 132 -77.27 gain 132 162 -72.06 gain 162 132 -77.86 gain 132 163 -74.01 gain 163 132 -81.71 gain 132 164 -74.91 gain 164 132 -81.99 gain 132 165 -97.73 gain 165 132 -101.87 gain 132 166 -94.33 gain 166 132 -98.22 gain 132 167 -87.38 gain 167 132 -91.99 gain 132 168 -91.88 gain 168 132 -95.38 gain 132 169 -86.41 gain 169 132 -91.03 gain 132 170 -86.69 gain 170 132 -90.54 gain 132 171 -85.40 gain 171 132 -90.33 gain 132 172 -86.84 gain 172 132 -89.95 gain 132 173 -87.39 gain 173 132 -95.16 gain 132 174 -76.59 gain 174 132 -80.40 gain 132 175 -76.24 gain 175 132 -81.19 gain 132 176 -75.14 gain 176 132 -79.06 gain 132 177 -81.40 gain 177 132 -88.32 gain 132 178 -73.53 gain 178 132 -73.89 gain 132 179 -73.37 gain 179 132 -73.15 gain 132 180 -98.88 gain 180 132 -108.11 gain 132 181 -92.11 gain 181 132 -95.36 gain 132 182 -89.48 gain 182 132 -93.82 gain 132 183 -92.44 gain 183 132 -97.05 gain 132 184 -94.56 gain 184 132 -101.92 gain 132 185 -87.28 gain 185 132 -98.51 gain 132 186 -84.54 gain 186 132 -91.35 gain 132 187 -74.08 gain 187 132 -78.62 gain 132 188 -85.00 gain 188 132 -91.95 gain 132 189 -85.23 gain 189 132 -86.90 gain 132 190 -77.17 gain 190 132 -82.76 gain 132 191 -82.32 gain 191 132 -86.62 gain 132 192 -73.00 gain 192 132 -75.99 gain 132 193 -77.28 gain 193 132 -79.26 gain 132 194 -78.79 gain 194 132 -81.55 gain 132 195 -90.71 gain 195 132 -92.02 gain 132 196 -97.22 gain 196 132 -102.84 gain 132 197 -84.59 gain 197 132 -85.34 gain 132 198 -91.79 gain 198 132 -97.06 gain 132 199 -83.73 gain 199 132 -89.11 gain 132 200 -86.95 gain 200 132 -93.66 gain 132 201 -91.40 gain 201 132 -98.02 gain 132 202 -86.11 gain 202 132 -91.86 gain 132 203 -92.18 gain 203 132 -97.05 gain 132 204 -85.97 gain 204 132 -87.48 gain 132 205 -79.54 gain 205 132 -84.80 gain 132 206 -81.02 gain 206 132 -87.38 gain 132 207 -76.46 gain 207 132 -82.24 gain 132 208 -76.59 gain 208 132 -84.97 gain 132 209 -74.94 gain 209 132 -82.89 gain 132 210 -97.32 gain 210 132 -105.45 gain 132 211 -100.22 gain 211 132 -103.58 gain 132 212 -95.01 gain 212 132 -101.38 gain 132 213 -93.04 gain 213 132 -98.73 gain 132 214 -92.23 gain 214 132 -103.31 gain 132 215 -89.67 gain 215 132 -96.16 gain 132 216 -87.67 gain 216 132 -98.07 gain 132 217 -87.22 gain 217 132 -97.87 gain 132 218 -81.79 gain 218 132 -85.26 gain 132 219 -96.69 gain 219 132 -100.64 gain 132 220 -81.41 gain 220 132 -81.44 gain 132 221 -87.13 gain 221 132 -92.85 gain 132 222 -78.63 gain 222 132 -80.15 gain 132 223 -91.62 gain 223 132 -96.38 gain 132 224 -83.50 gain 224 132 -88.73 gain 133 134 -67.31 gain 134 133 -64.17 gain 133 135 -99.35 gain 135 133 -98.51 gain 133 136 -105.56 gain 136 133 -105.17 gain 133 137 -98.71 gain 137 133 -101.23 gain 133 138 -96.01 gain 138 133 -92.06 gain 133 139 -97.22 gain 139 133 -96.54 gain 133 140 -91.40 gain 140 133 -91.54 gain 133 141 -90.36 gain 141 133 -82.48 gain 133 142 -86.89 gain 142 133 -85.75 gain 133 143 -89.50 gain 143 133 -91.10 gain 133 144 -81.42 gain 144 133 -81.38 gain 133 145 -80.60 gain 145 133 -83.95 gain 133 146 -75.79 gain 146 133 -75.13 gain 133 147 -74.48 gain 147 133 -70.92 gain 133 148 -61.97 gain 148 133 -56.75 gain 133 149 -66.25 gain 149 133 -64.68 gain 133 150 -105.62 gain 150 133 -104.88 gain 133 151 -96.88 gain 151 133 -95.09 gain 133 152 -97.60 gain 152 133 -95.63 gain 133 153 -96.93 gain 153 133 -94.17 gain 133 154 -97.70 gain 154 133 -96.84 gain 133 155 -90.82 gain 155 133 -88.53 gain 133 156 -93.26 gain 156 133 -90.20 gain 133 157 -88.09 gain 157 133 -87.52 gain 133 158 -87.65 gain 158 133 -86.58 gain 133 159 -90.76 gain 159 133 -92.07 gain 133 160 -83.97 gain 160 133 -82.44 gain 133 161 -78.92 gain 161 133 -79.83 gain 133 162 -75.06 gain 162 133 -75.67 gain 133 163 -80.42 gain 163 133 -82.95 gain 133 164 -77.20 gain 164 133 -79.10 gain 133 165 -103.65 gain 165 133 -102.61 gain 133 166 -98.63 gain 166 133 -97.34 gain 133 167 -96.66 gain 167 133 -96.09 gain 133 168 -107.63 gain 168 133 -105.96 gain 133 169 -88.84 gain 169 133 -88.28 gain 133 170 -98.60 gain 170 133 -97.27 gain 133 171 -96.11 gain 171 133 -95.86 gain 133 172 -93.52 gain 172 133 -91.46 gain 133 173 -90.47 gain 173 133 -93.06 gain 133 174 -85.24 gain 174 133 -83.88 gain 133 175 -81.30 gain 175 133 -81.08 gain 133 176 -79.56 gain 176 133 -78.31 gain 133 177 -76.17 gain 177 133 -77.91 gain 133 178 -77.32 gain 178 133 -72.51 gain 133 179 -75.99 gain 179 133 -70.60 gain 133 180 -100.67 gain 180 133 -104.73 gain 133 181 -103.78 gain 181 133 -101.86 gain 133 182 -101.01 gain 182 133 -100.17 gain 133 183 -96.83 gain 183 133 -96.27 gain 133 184 -98.95 gain 184 133 -101.13 gain 133 185 -96.65 gain 185 133 -102.70 gain 133 186 -96.70 gain 186 133 -98.33 gain 133 187 -91.83 gain 187 133 -91.19 gain 133 188 -88.56 gain 188 133 -90.33 gain 133 189 -88.85 gain 189 133 -85.35 gain 133 190 -84.26 gain 190 133 -84.67 gain 133 191 -89.04 gain 191 133 -88.17 gain 133 192 -90.42 gain 192 133 -88.24 gain 133 193 -89.28 gain 193 133 -86.08 gain 133 194 -89.07 gain 194 133 -86.65 gain 133 195 -97.23 gain 195 133 -93.36 gain 133 196 -102.17 gain 196 133 -102.62 gain 133 197 -87.26 gain 197 133 -82.84 gain 133 198 -101.26 gain 198 133 -101.35 gain 133 199 -100.43 gain 199 133 -100.63 gain 133 200 -101.26 gain 200 133 -102.79 gain 133 201 -100.97 gain 201 133 -102.41 gain 133 202 -96.84 gain 202 133 -97.42 gain 133 203 -93.66 gain 203 133 -93.35 gain 133 204 -87.83 gain 204 133 -84.17 gain 133 205 -90.85 gain 205 133 -90.92 gain 133 206 -79.85 gain 206 133 -81.03 gain 133 207 -91.42 gain 207 133 -92.02 gain 133 208 -89.54 gain 208 133 -92.74 gain 133 209 -88.39 gain 209 133 -91.17 gain 133 210 -96.91 gain 210 133 -99.86 gain 133 211 -102.44 gain 211 133 -100.62 gain 133 212 -99.71 gain 212 133 -100.91 gain 133 213 -100.25 gain 213 133 -100.77 gain 133 214 -98.66 gain 214 133 -104.57 gain 133 215 -96.26 gain 215 133 -97.57 gain 133 216 -90.99 gain 216 133 -96.21 gain 133 217 -87.30 gain 217 133 -92.78 gain 133 218 -89.63 gain 218 133 -87.92 gain 133 219 -97.09 gain 219 133 -95.86 gain 133 220 -89.40 gain 220 133 -84.25 gain 133 221 -85.98 gain 221 133 -86.51 gain 133 222 -82.64 gain 222 133 -78.98 gain 133 223 -86.90 gain 223 133 -86.48 gain 133 224 -92.62 gain 224 133 -92.67 gain 134 135 -99.57 gain 135 134 -101.88 gain 134 136 -92.08 gain 136 134 -94.83 gain 134 137 -99.41 gain 137 134 -105.07 gain 134 138 -94.40 gain 138 134 -93.58 gain 134 139 -87.01 gain 139 134 -89.46 gain 134 140 -96.33 gain 140 134 -99.61 gain 134 141 -89.73 gain 141 134 -84.98 gain 134 142 -93.51 gain 142 134 -95.51 gain 134 143 -86.38 gain 143 134 -91.11 gain 134 144 -81.23 gain 144 134 -84.32 gain 134 145 -80.89 gain 145 134 -87.38 gain 134 146 -80.66 gain 146 134 -83.13 gain 134 147 -67.77 gain 147 134 -67.35 gain 134 148 -67.21 gain 148 134 -65.13 gain 134 149 -63.97 gain 149 134 -65.54 gain 134 150 -98.32 gain 150 134 -100.72 gain 134 151 -101.75 gain 151 134 -103.10 gain 134 152 -94.69 gain 152 134 -95.85 gain 134 153 -88.44 gain 153 134 -88.82 gain 134 154 -92.74 gain 154 134 -95.02 gain 134 155 -96.54 gain 155 134 -97.39 gain 134 156 -87.29 gain 156 134 -87.37 gain 134 157 -88.23 gain 157 134 -90.80 gain 134 158 -84.04 gain 158 134 -86.11 gain 134 159 -80.42 gain 159 134 -84.87 gain 134 160 -81.84 gain 160 134 -83.44 gain 134 161 -82.36 gain 161 134 -86.40 gain 134 162 -73.84 gain 162 134 -77.59 gain 134 163 -78.92 gain 163 134 -84.58 gain 134 164 -70.70 gain 164 134 -75.74 gain 134 165 -100.27 gain 165 134 -102.36 gain 134 166 -102.54 gain 166 134 -104.39 gain 134 167 -96.63 gain 167 134 -99.20 gain 134 168 -91.53 gain 168 134 -92.99 gain 134 169 -93.13 gain 169 134 -95.71 gain 134 170 -94.72 gain 170 134 -96.53 gain 134 171 -89.14 gain 171 134 -92.03 gain 134 172 -95.42 gain 172 134 -96.50 gain 134 173 -89.71 gain 173 134 -95.44 gain 134 174 -84.42 gain 174 134 -86.20 gain 134 175 -82.16 gain 175 134 -85.07 gain 134 176 -84.15 gain 176 134 -86.03 gain 134 177 -81.41 gain 177 134 -86.30 gain 134 178 -77.61 gain 178 134 -75.94 gain 134 179 -80.37 gain 179 134 -78.12 gain 134 180 -104.11 gain 180 134 -111.30 gain 134 181 -97.80 gain 181 134 -99.01 gain 134 182 -93.24 gain 182 134 -95.54 gain 134 183 -95.57 gain 183 134 -98.14 gain 134 184 -87.30 gain 184 134 -92.62 gain 134 185 -88.17 gain 185 134 -97.36 gain 134 186 -99.41 gain 186 134 -104.18 gain 134 187 -91.25 gain 187 134 -93.75 gain 134 188 -84.80 gain 188 134 -89.71 gain 134 189 -92.10 gain 189 134 -91.74 gain 134 190 -86.20 gain 190 134 -89.76 gain 134 191 -76.64 gain 191 134 -78.90 gain 134 192 -83.85 gain 192 134 -84.80 gain 134 193 -91.94 gain 193 134 -91.88 gain 134 194 -79.97 gain 194 134 -80.69 gain 134 195 -101.15 gain 195 134 -100.41 gain 134 196 -99.12 gain 196 134 -102.70 gain 134 197 -97.22 gain 197 134 -95.93 gain 134 198 -95.17 gain 198 134 -98.40 gain 134 199 -99.31 gain 199 134 -102.64 gain 134 200 -97.99 gain 200 134 -102.66 gain 134 201 -99.36 gain 201 134 -103.94 gain 134 202 -91.46 gain 202 134 -95.17 gain 134 203 -87.65 gain 203 134 -90.48 gain 134 204 -83.90 gain 204 134 -83.37 gain 134 205 -84.75 gain 205 134 -87.96 gain 134 206 -84.48 gain 206 134 -88.80 gain 134 207 -88.75 gain 207 134 -92.48 gain 134 208 -81.85 gain 208 134 -88.19 gain 134 209 -83.81 gain 209 134 -89.72 gain 134 210 -102.25 gain 210 134 -108.34 gain 134 211 -96.11 gain 211 134 -97.43 gain 134 212 -91.73 gain 212 134 -96.06 gain 134 213 -98.78 gain 213 134 -102.44 gain 134 214 -95.09 gain 214 134 -104.14 gain 134 215 -89.36 gain 215 134 -93.81 gain 134 216 -95.24 gain 216 134 -103.60 gain 134 217 -94.24 gain 217 134 -102.86 gain 134 218 -92.31 gain 218 134 -93.73 gain 134 219 -94.19 gain 219 134 -96.10 gain 134 220 -93.58 gain 220 134 -91.57 gain 134 221 -87.92 gain 221 134 -91.60 gain 134 222 -84.56 gain 222 134 -84.04 gain 134 223 -81.24 gain 223 134 -83.96 gain 134 224 -87.91 gain 224 134 -91.09 gain 135 136 -62.98 gain 136 135 -63.42 gain 135 137 -74.58 gain 137 135 -77.94 gain 135 138 -85.58 gain 138 135 -82.47 gain 135 139 -80.24 gain 139 135 -80.39 gain 135 140 -86.73 gain 140 135 -87.71 gain 135 141 -94.47 gain 141 135 -87.42 gain 135 142 -87.24 gain 142 135 -86.93 gain 135 143 -86.54 gain 143 135 -88.97 gain 135 144 -95.01 gain 144 135 -95.81 gain 135 145 -95.51 gain 145 135 -99.70 gain 135 146 -99.50 gain 146 135 -99.67 gain 135 147 -93.56 gain 147 135 -90.85 gain 135 148 -96.47 gain 148 135 -92.08 gain 135 149 -103.77 gain 149 135 -103.03 gain 135 150 -61.34 gain 150 135 -61.44 gain 135 151 -66.57 gain 151 135 -65.62 gain 135 152 -76.87 gain 152 135 -75.73 gain 135 153 -79.25 gain 153 135 -77.32 gain 135 154 -78.14 gain 154 135 -78.11 gain 135 155 -92.21 gain 155 135 -90.76 gain 135 156 -88.58 gain 156 135 -86.36 gain 135 157 -91.59 gain 157 135 -91.86 gain 135 158 -100.64 gain 158 135 -100.40 gain 135 159 -88.53 gain 159 135 -90.68 gain 135 160 -93.65 gain 160 135 -92.95 gain 135 161 -99.45 gain 161 135 -101.18 gain 135 162 -101.19 gain 162 135 -102.64 gain 135 163 -100.59 gain 163 135 -103.96 gain 135 164 -99.38 gain 164 135 -102.11 gain 135 165 -68.11 gain 165 135 -67.90 gain 135 166 -79.11 gain 166 135 -78.65 gain 135 167 -82.70 gain 167 135 -82.96 gain 135 168 -76.32 gain 168 135 -75.48 gain 135 169 -83.65 gain 169 135 -83.93 gain 135 170 -78.05 gain 170 135 -77.56 gain 135 171 -83.58 gain 171 135 -84.17 gain 135 172 -89.55 gain 172 135 -88.32 gain 135 173 -91.31 gain 173 135 -94.74 gain 135 174 -94.48 gain 174 135 -93.95 gain 135 175 -93.05 gain 175 135 -93.66 gain 135 176 -95.49 gain 176 135 -95.06 gain 135 177 -94.82 gain 177 135 -97.39 gain 135 178 -97.11 gain 178 135 -93.13 gain 135 179 -99.51 gain 179 135 -94.95 gain 135 180 -80.88 gain 180 135 -85.77 gain 135 181 -77.18 gain 181 135 -76.09 gain 135 182 -82.11 gain 182 135 -82.10 gain 135 183 -78.33 gain 183 135 -78.60 gain 135 184 -89.70 gain 184 135 -92.72 gain 135 185 -85.24 gain 185 135 -92.13 gain 135 186 -92.19 gain 186 135 -94.66 gain 135 187 -89.85 gain 187 135 -90.05 gain 135 188 -90.97 gain 188 135 -93.58 gain 135 189 -100.51 gain 189 135 -97.84 gain 135 190 -96.21 gain 190 135 -97.46 gain 135 191 -96.36 gain 191 135 -96.32 gain 135 192 -103.17 gain 192 135 -101.82 gain 135 193 -92.05 gain 193 135 -89.69 gain 135 194 -94.86 gain 194 135 -93.28 gain 135 195 -86.79 gain 195 135 -83.76 gain 135 196 -88.74 gain 196 135 -90.02 gain 135 197 -85.38 gain 197 135 -81.79 gain 135 198 -84.37 gain 198 135 -85.29 gain 135 199 -92.88 gain 199 135 -93.91 gain 135 200 -87.01 gain 200 135 -89.37 gain 135 201 -94.76 gain 201 135 -97.03 gain 135 202 -93.19 gain 202 135 -94.60 gain 135 203 -94.16 gain 203 135 -94.69 gain 135 204 -99.58 gain 204 135 -96.74 gain 135 205 -93.55 gain 205 135 -94.46 gain 135 206 -90.07 gain 206 135 -92.09 gain 135 207 -95.39 gain 207 135 -96.83 gain 135 208 -100.63 gain 208 135 -104.67 gain 135 209 -96.32 gain 209 135 -99.92 gain 135 210 -88.02 gain 210 135 -91.80 gain 135 211 -85.39 gain 211 135 -84.40 gain 135 212 -91.54 gain 212 135 -93.56 gain 135 213 -86.66 gain 213 135 -88.02 gain 135 214 -89.24 gain 214 135 -95.98 gain 135 215 -78.67 gain 215 135 -80.81 gain 135 216 -94.78 gain 216 135 -100.83 gain 135 217 -93.27 gain 217 135 -99.59 gain 135 218 -99.75 gain 218 135 -98.87 gain 135 219 -96.98 gain 219 135 -96.58 gain 135 220 -94.55 gain 220 135 -90.24 gain 135 221 -99.63 gain 221 135 -101.00 gain 135 222 -95.67 gain 222 135 -92.84 gain 135 223 -106.20 gain 223 135 -106.61 gain 135 224 -105.01 gain 224 135 -105.89 gain 136 137 -68.53 gain 137 136 -71.45 gain 136 138 -77.83 gain 138 136 -74.28 gain 136 139 -80.63 gain 139 136 -80.34 gain 136 140 -90.48 gain 140 136 -91.01 gain 136 141 -84.36 gain 141 136 -76.87 gain 136 142 -90.66 gain 142 136 -89.91 gain 136 143 -89.71 gain 143 136 -91.70 gain 136 144 -94.50 gain 144 136 -94.85 gain 136 145 -94.01 gain 145 136 -97.75 gain 136 146 -94.84 gain 146 136 -94.58 gain 136 147 -100.36 gain 147 136 -97.20 gain 136 148 -105.20 gain 148 136 -100.36 gain 136 149 -96.07 gain 149 136 -94.89 gain 136 150 -67.39 gain 150 136 -67.05 gain 136 151 -69.79 gain 151 136 -68.40 gain 136 152 -67.10 gain 152 136 -65.52 gain 136 153 -79.13 gain 153 136 -76.77 gain 136 154 -83.00 gain 154 136 -82.53 gain 136 155 -78.77 gain 155 136 -76.88 gain 136 156 -85.42 gain 156 136 -82.76 gain 136 157 -92.29 gain 157 136 -92.11 gain 136 158 -90.24 gain 158 136 -89.56 gain 136 159 -97.44 gain 159 136 -99.14 gain 136 160 -97.94 gain 160 136 -96.80 gain 136 161 -93.53 gain 161 136 -94.82 gain 136 162 -102.55 gain 162 136 -103.56 gain 136 163 -91.44 gain 163 136 -94.36 gain 136 164 -97.83 gain 164 136 -100.12 gain 136 165 -69.51 gain 165 136 -68.86 gain 136 166 -76.59 gain 166 136 -75.69 gain 136 167 -81.50 gain 167 136 -81.32 gain 136 168 -82.23 gain 168 136 -80.95 gain 136 169 -83.29 gain 169 136 -83.12 gain 136 170 -88.23 gain 170 136 -87.29 gain 136 171 -85.19 gain 171 136 -85.34 gain 136 172 -95.03 gain 172 136 -93.37 gain 136 173 -88.07 gain 173 136 -91.05 gain 136 174 -89.83 gain 174 136 -88.87 gain 136 175 -95.33 gain 175 136 -95.50 gain 136 176 -103.87 gain 176 136 -103.01 gain 136 177 -90.08 gain 177 136 -92.21 gain 136 178 -102.26 gain 178 136 -97.84 gain 136 179 -103.05 gain 179 136 -98.05 gain 136 180 -88.55 gain 180 136 -93.00 gain 136 181 -84.48 gain 181 136 -82.95 gain 136 182 -85.83 gain 182 136 -85.39 gain 136 183 -79.24 gain 183 136 -79.07 gain 136 184 -80.85 gain 184 136 -83.43 gain 136 185 -86.72 gain 185 136 -93.17 gain 136 186 -89.59 gain 186 136 -91.61 gain 136 187 -87.68 gain 187 136 -87.44 gain 136 188 -91.20 gain 188 136 -93.37 gain 136 189 -92.35 gain 189 136 -89.24 gain 136 190 -94.80 gain 190 136 -95.61 gain 136 191 -91.35 gain 191 136 -90.87 gain 136 192 -105.33 gain 192 136 -103.53 gain 136 193 -97.11 gain 193 136 -94.30 gain 136 194 -99.32 gain 194 136 -97.29 gain 136 195 -82.69 gain 195 136 -79.22 gain 136 196 -86.65 gain 196 136 -87.48 gain 136 197 -86.97 gain 197 136 -82.94 gain 136 198 -83.46 gain 198 136 -83.94 gain 136 199 -84.21 gain 199 136 -84.80 gain 136 200 -94.01 gain 200 136 -95.94 gain 136 201 -84.98 gain 201 136 -86.81 gain 136 202 -94.63 gain 202 136 -95.60 gain 136 203 -100.16 gain 203 136 -100.24 gain 136 204 -96.38 gain 204 136 -93.10 gain 136 205 -92.31 gain 205 136 -92.77 gain 136 206 -98.29 gain 206 136 -99.87 gain 136 207 -100.14 gain 207 136 -101.13 gain 136 208 -96.83 gain 208 136 -100.43 gain 136 209 -89.55 gain 209 136 -92.72 gain 136 210 -83.88 gain 210 136 -87.23 gain 136 211 -85.72 gain 211 136 -84.29 gain 136 212 -79.00 gain 212 136 -80.58 gain 136 213 -87.19 gain 213 136 -88.10 gain 136 214 -89.28 gain 214 136 -95.58 gain 136 215 -82.62 gain 215 136 -84.32 gain 136 216 -95.11 gain 216 136 -100.72 gain 136 217 -92.53 gain 217 136 -98.40 gain 136 218 -91.89 gain 218 136 -90.57 gain 136 219 -95.50 gain 219 136 -94.66 gain 136 220 -98.96 gain 220 136 -94.21 gain 136 221 -87.47 gain 221 136 -88.40 gain 136 222 -98.04 gain 222 136 -94.78 gain 136 223 -104.63 gain 223 136 -104.60 gain 136 224 -96.98 gain 224 136 -97.42 gain 137 138 -69.23 gain 138 137 -62.76 gain 137 139 -73.80 gain 139 137 -70.59 gain 137 140 -82.16 gain 140 137 -79.78 gain 137 141 -82.17 gain 141 137 -71.77 gain 137 142 -90.51 gain 142 137 -86.84 gain 137 143 -90.99 gain 143 137 -90.06 gain 137 144 -100.61 gain 144 137 -98.05 gain 137 145 -97.82 gain 145 137 -98.64 gain 137 146 -98.74 gain 146 137 -95.56 gain 137 147 -105.30 gain 147 137 -99.23 gain 137 148 -99.81 gain 148 137 -92.06 gain 137 149 -98.61 gain 149 137 -94.52 gain 137 150 -82.34 gain 150 137 -79.09 gain 137 151 -74.54 gain 151 137 -70.22 gain 137 152 -66.14 gain 152 137 -61.64 gain 137 153 -68.24 gain 153 137 -62.96 gain 137 154 -81.00 gain 154 137 -77.62 gain 137 155 -79.01 gain 155 137 -74.20 gain 137 156 -84.30 gain 156 137 -78.72 gain 137 157 -97.64 gain 157 137 -94.54 gain 137 158 -87.85 gain 158 137 -84.26 gain 137 159 -87.81 gain 159 137 -86.59 gain 137 160 -92.50 gain 160 137 -88.44 gain 137 161 -96.01 gain 161 137 -94.39 gain 137 162 -104.61 gain 162 137 -102.71 gain 137 163 -102.34 gain 163 137 -102.35 gain 137 164 -107.04 gain 164 137 -106.41 gain 137 165 -87.14 gain 165 137 -83.57 gain 137 166 -81.23 gain 166 137 -77.42 gain 137 167 -66.94 gain 167 137 -63.85 gain 137 168 -81.58 gain 168 137 -77.39 gain 137 169 -89.53 gain 169 137 -86.45 gain 137 170 -80.87 gain 170 137 -77.02 gain 137 171 -87.55 gain 171 137 -84.78 gain 137 172 -86.27 gain 172 137 -81.69 gain 137 173 -93.64 gain 173 137 -93.71 gain 137 174 -90.84 gain 174 137 -86.96 gain 137 175 -95.69 gain 175 137 -92.94 gain 137 176 -97.35 gain 176 137 -93.57 gain 137 177 -98.06 gain 177 137 -97.28 gain 137 178 -98.69 gain 178 137 -91.35 gain 137 179 -100.79 gain 179 137 -92.88 gain 137 180 -90.92 gain 180 137 -92.45 gain 137 181 -82.18 gain 181 137 -77.74 gain 137 182 -85.78 gain 182 137 -82.43 gain 137 183 -90.78 gain 183 137 -87.69 gain 137 184 -88.37 gain 184 137 -88.04 gain 137 185 -95.27 gain 185 137 -98.80 gain 137 186 -86.51 gain 186 137 -85.62 gain 137 187 -95.72 gain 187 137 -92.56 gain 137 188 -88.84 gain 188 137 -88.09 gain 137 189 -96.56 gain 189 137 -90.54 gain 137 190 -90.12 gain 190 137 -88.02 gain 137 191 -102.64 gain 191 137 -99.24 gain 137 192 -98.50 gain 192 137 -93.80 gain 137 193 -96.52 gain 193 137 -90.80 gain 137 194 -105.28 gain 194 137 -100.34 gain 137 195 -90.64 gain 195 137 -84.25 gain 137 196 -82.54 gain 196 137 -80.46 gain 137 197 -88.08 gain 197 137 -81.14 gain 137 198 -87.87 gain 198 137 -85.44 gain 137 199 -90.79 gain 199 137 -88.47 gain 137 200 -90.95 gain 200 137 -89.96 gain 137 201 -95.34 gain 201 137 -94.26 gain 137 202 -88.15 gain 202 137 -86.21 gain 137 203 -91.41 gain 203 137 -88.58 gain 137 204 -97.46 gain 204 137 -91.27 gain 137 205 -95.60 gain 205 137 -93.15 gain 137 206 -100.82 gain 206 137 -99.48 gain 137 207 -98.05 gain 207 137 -96.13 gain 137 208 -105.99 gain 208 137 -106.67 gain 137 209 -101.50 gain 209 137 -101.76 gain 137 210 -93.99 gain 210 137 -94.41 gain 137 211 -99.36 gain 211 137 -95.02 gain 137 212 -88.61 gain 212 137 -87.29 gain 137 213 -96.34 gain 213 137 -94.34 gain 137 214 -87.28 gain 214 137 -90.67 gain 137 215 -92.19 gain 215 137 -90.97 gain 137 216 -95.66 gain 216 137 -98.36 gain 137 217 -89.81 gain 217 137 -92.77 gain 137 218 -97.26 gain 218 137 -93.03 gain 137 219 -100.04 gain 219 137 -96.29 gain 137 220 -99.95 gain 220 137 -92.29 gain 137 221 -99.31 gain 221 137 -97.32 gain 137 222 -99.45 gain 222 137 -93.27 gain 137 223 -89.66 gain 223 137 -86.72 gain 137 224 -103.02 gain 224 137 -100.55 gain 138 139 -65.86 gain 139 138 -69.13 gain 138 140 -82.99 gain 140 138 -87.08 gain 138 141 -79.92 gain 141 138 -75.99 gain 138 142 -81.76 gain 142 138 -84.57 gain 138 143 -80.87 gain 143 138 -86.42 gain 138 144 -85.55 gain 144 138 -89.46 gain 138 145 -89.51 gain 145 138 -96.81 gain 138 146 -85.68 gain 146 138 -88.97 gain 138 147 -98.92 gain 147 138 -99.32 gain 138 148 -88.11 gain 148 138 -86.84 gain 138 149 -89.42 gain 149 138 -91.80 gain 138 150 -81.32 gain 150 138 -84.54 gain 138 151 -67.43 gain 151 138 -69.59 gain 138 152 -69.30 gain 152 138 -71.27 gain 138 153 -63.10 gain 153 138 -64.29 gain 138 154 -67.82 gain 154 138 -70.91 gain 138 155 -72.97 gain 155 138 -74.63 gain 138 156 -78.35 gain 156 138 -79.24 gain 138 157 -79.84 gain 157 138 -83.22 gain 138 158 -80.32 gain 158 138 -83.19 gain 138 159 -86.42 gain 159 138 -91.68 gain 138 160 -87.55 gain 160 138 -89.96 gain 138 161 -86.74 gain 161 138 -91.59 gain 138 162 -90.54 gain 162 138 -95.10 gain 138 163 -91.64 gain 163 138 -98.12 gain 138 164 -93.03 gain 164 138 -98.88 gain 138 165 -81.66 gain 165 138 -84.56 gain 138 166 -70.00 gain 166 138 -72.66 gain 138 167 -75.35 gain 167 138 -78.73 gain 138 168 -67.85 gain 168 138 -70.13 gain 138 169 -63.21 gain 169 138 -66.59 gain 138 170 -79.22 gain 170 138 -81.84 gain 138 171 -83.37 gain 171 138 -87.07 gain 138 172 -79.92 gain 172 138 -81.82 gain 138 173 -86.50 gain 173 138 -93.04 gain 138 174 -87.16 gain 174 138 -89.74 gain 138 175 -90.07 gain 175 138 -93.79 gain 138 176 -90.00 gain 176 138 -92.69 gain 138 177 -88.47 gain 177 138 -94.17 gain 138 178 -86.15 gain 178 138 -85.28 gain 138 179 -93.18 gain 179 138 -91.74 gain 138 180 -78.94 gain 180 138 -86.95 gain 138 181 -74.12 gain 181 138 -76.15 gain 138 182 -74.27 gain 182 138 -77.38 gain 138 183 -79.97 gain 183 138 -83.35 gain 138 184 -74.02 gain 184 138 -80.16 gain 138 185 -72.48 gain 185 138 -82.48 gain 138 186 -87.04 gain 186 138 -92.62 gain 138 187 -81.72 gain 187 138 -85.03 gain 138 188 -86.64 gain 188 138 -92.36 gain 138 189 -86.22 gain 189 138 -86.67 gain 138 190 -85.25 gain 190 138 -89.62 gain 138 191 -92.31 gain 191 138 -95.38 gain 138 192 -95.63 gain 192 138 -97.40 gain 138 193 -86.05 gain 193 138 -86.80 gain 138 194 -90.91 gain 194 138 -92.44 gain 138 195 -80.61 gain 195 138 -80.69 gain 138 196 -76.68 gain 196 138 -81.08 gain 138 197 -78.81 gain 197 138 -78.33 gain 138 198 -80.06 gain 198 138 -84.10 gain 138 199 -82.77 gain 199 138 -86.92 gain 138 200 -77.67 gain 200 138 -83.15 gain 138 201 -87.28 gain 201 138 -92.67 gain 138 202 -81.67 gain 202 138 -86.20 gain 138 203 -78.27 gain 203 138 -81.91 gain 138 204 -85.86 gain 204 138 -86.14 gain 138 205 -88.80 gain 205 138 -92.82 gain 138 206 -93.46 gain 206 138 -98.60 gain 138 207 -90.31 gain 207 138 -94.86 gain 138 208 -88.70 gain 208 138 -95.86 gain 138 209 -97.54 gain 209 138 -104.26 gain 138 210 -85.78 gain 210 138 -92.68 gain 138 211 -85.72 gain 211 138 -87.85 gain 138 212 -84.46 gain 212 138 -89.61 gain 138 213 -89.30 gain 213 138 -93.77 gain 138 214 -85.59 gain 214 138 -95.45 gain 138 215 -77.88 gain 215 138 -83.13 gain 138 216 -82.61 gain 216 138 -91.78 gain 138 217 -85.37 gain 217 138 -94.80 gain 138 218 -83.33 gain 218 138 -85.56 gain 138 219 -88.30 gain 219 138 -91.02 gain 138 220 -91.89 gain 220 138 -90.70 gain 138 221 -96.79 gain 221 138 -101.28 gain 138 222 -86.34 gain 222 138 -86.63 gain 138 223 -88.83 gain 223 138 -92.36 gain 138 224 -98.60 gain 224 138 -102.60 gain 139 140 -57.18 gain 140 139 -58.00 gain 139 141 -69.60 gain 141 139 -62.40 gain 139 142 -78.15 gain 142 139 -77.69 gain 139 143 -77.92 gain 143 139 -80.20 gain 139 144 -86.02 gain 144 139 -86.66 gain 139 145 -88.46 gain 145 139 -92.50 gain 139 146 -93.70 gain 146 139 -93.72 gain 139 147 -91.74 gain 147 139 -88.87 gain 139 148 -96.81 gain 148 139 -92.27 gain 139 149 -100.42 gain 149 139 -99.54 gain 139 150 -82.61 gain 150 139 -82.57 gain 139 151 -76.70 gain 151 139 -75.60 gain 139 152 -80.44 gain 152 139 -79.15 gain 139 153 -66.36 gain 153 139 -64.29 gain 139 154 -60.51 gain 154 139 -60.33 gain 139 155 -69.13 gain 155 139 -67.53 gain 139 156 -79.60 gain 156 139 -77.23 gain 139 157 -82.11 gain 157 139 -82.22 gain 139 158 -89.28 gain 158 139 -88.89 gain 139 159 -92.08 gain 159 139 -94.07 gain 139 160 -83.61 gain 160 139 -82.76 gain 139 161 -96.24 gain 161 139 -97.83 gain 139 162 -88.47 gain 162 139 -89.77 gain 139 163 -97.24 gain 163 139 -100.46 gain 139 164 -85.66 gain 164 139 -88.24 gain 139 165 -85.34 gain 165 139 -84.98 gain 139 166 -83.63 gain 166 139 -83.02 gain 139 167 -80.41 gain 167 139 -80.52 gain 139 168 -71.96 gain 168 139 -70.97 gain 139 169 -81.22 gain 169 139 -81.35 gain 139 170 -79.94 gain 170 139 -79.30 gain 139 171 -81.10 gain 171 139 -81.54 gain 139 172 -80.65 gain 172 139 -79.28 gain 139 173 -80.08 gain 173 139 -83.35 gain 139 174 -88.43 gain 174 139 -87.75 gain 139 175 -93.59 gain 175 139 -94.04 gain 139 176 -83.27 gain 176 139 -82.69 gain 139 177 -93.94 gain 177 139 -96.36 gain 139 178 -89.66 gain 178 139 -85.53 gain 139 179 -92.45 gain 179 139 -87.74 gain 139 180 -92.09 gain 180 139 -96.83 gain 139 181 -93.25 gain 181 139 -92.02 gain 139 182 -78.49 gain 182 139 -78.34 gain 139 183 -72.61 gain 183 139 -72.73 gain 139 184 -81.17 gain 184 139 -84.04 gain 139 185 -84.31 gain 185 139 -91.04 gain 139 186 -82.53 gain 186 139 -84.85 gain 139 187 -86.14 gain 187 139 -86.18 gain 139 188 -91.32 gain 188 139 -93.78 gain 139 189 -88.56 gain 189 139 -85.75 gain 139 190 -85.44 gain 190 139 -86.54 gain 139 191 -98.15 gain 191 139 -97.96 gain 139 192 -96.90 gain 192 139 -95.40 gain 139 193 -96.11 gain 193 139 -93.59 gain 139 194 -94.67 gain 194 139 -92.93 gain 139 195 -88.89 gain 195 139 -85.70 gain 139 196 -84.30 gain 196 139 -85.43 gain 139 197 -86.80 gain 197 139 -83.06 gain 139 198 -84.90 gain 198 139 -85.68 gain 139 199 -83.70 gain 199 139 -84.58 gain 139 200 -80.75 gain 200 139 -82.97 gain 139 201 -87.61 gain 201 139 -89.74 gain 139 202 -84.17 gain 202 139 -85.43 gain 139 203 -89.03 gain 203 139 -89.41 gain 139 204 -80.36 gain 204 139 -77.38 gain 139 205 -91.53 gain 205 139 -92.29 gain 139 206 -89.08 gain 206 139 -90.95 gain 139 207 -95.77 gain 207 139 -97.06 gain 139 208 -92.80 gain 208 139 -96.68 gain 139 209 -98.11 gain 209 139 -101.57 gain 139 210 -86.32 gain 210 139 -89.95 gain 139 211 -79.71 gain 211 139 -78.58 gain 139 212 -83.94 gain 212 139 -85.82 gain 139 213 -87.56 gain 213 139 -88.77 gain 139 214 -83.81 gain 214 139 -90.40 gain 139 215 -83.11 gain 215 139 -85.10 gain 139 216 -81.53 gain 216 139 -87.43 gain 139 217 -82.53 gain 217 139 -88.69 gain 139 218 -87.55 gain 218 139 -86.52 gain 139 219 -86.80 gain 219 139 -86.25 gain 139 220 -93.07 gain 220 139 -88.61 gain 139 221 -98.59 gain 221 139 -99.80 gain 139 222 -100.04 gain 222 139 -97.06 gain 139 223 -89.78 gain 223 139 -90.04 gain 139 224 -92.73 gain 224 139 -93.47 gain 140 141 -60.52 gain 141 140 -52.49 gain 140 142 -70.62 gain 142 140 -69.33 gain 140 143 -77.10 gain 143 140 -78.55 gain 140 144 -75.18 gain 144 140 -75.00 gain 140 145 -87.79 gain 145 140 -91.00 gain 140 146 -82.94 gain 146 140 -82.13 gain 140 147 -89.07 gain 147 140 -85.37 gain 140 148 -95.48 gain 148 140 -90.11 gain 140 149 -94.22 gain 149 140 -92.51 gain 140 150 -94.80 gain 150 140 -93.92 gain 140 151 -83.23 gain 151 140 -81.29 gain 140 152 -82.67 gain 152 140 -80.55 gain 140 153 -71.30 gain 153 140 -68.39 gain 140 154 -69.44 gain 154 140 -68.44 gain 140 155 -70.12 gain 155 140 -67.69 gain 140 156 -66.76 gain 156 140 -63.56 gain 140 157 -74.42 gain 157 140 -73.71 gain 140 158 -76.17 gain 158 140 -74.95 gain 140 159 -80.57 gain 159 140 -81.74 gain 140 160 -92.85 gain 160 140 -91.17 gain 140 161 -87.89 gain 161 140 -88.65 gain 140 162 -85.30 gain 162 140 -85.77 gain 140 163 -90.33 gain 163 140 -92.72 gain 140 164 -100.05 gain 164 140 -101.80 gain 140 165 -89.30 gain 165 140 -88.11 gain 140 166 -88.53 gain 166 140 -87.09 gain 140 167 -82.55 gain 167 140 -81.84 gain 140 168 -81.98 gain 168 140 -80.16 gain 140 169 -77.25 gain 169 140 -76.54 gain 140 170 -70.23 gain 170 140 -68.76 gain 140 171 -80.75 gain 171 140 -80.36 gain 140 172 -76.69 gain 172 140 -74.49 gain 140 173 -85.85 gain 173 140 -88.29 gain 140 174 -84.15 gain 174 140 -82.64 gain 140 175 -93.52 gain 175 140 -93.15 gain 140 176 -88.95 gain 176 140 -87.55 gain 140 177 -96.47 gain 177 140 -98.07 gain 140 178 -95.55 gain 178 140 -90.59 gain 140 179 -94.09 gain 179 140 -88.55 gain 140 180 -85.19 gain 180 140 -89.10 gain 140 181 -83.12 gain 181 140 -81.05 gain 140 182 -88.49 gain 182 140 -87.50 gain 140 183 -78.30 gain 183 140 -77.60 gain 140 184 -82.66 gain 184 140 -84.70 gain 140 185 -79.75 gain 185 140 -85.66 gain 140 186 -80.17 gain 186 140 -81.66 gain 140 187 -83.50 gain 187 140 -82.72 gain 140 188 -82.74 gain 188 140 -84.37 gain 140 189 -87.38 gain 189 140 -83.74 gain 140 190 -92.09 gain 190 140 -92.36 gain 140 191 -92.57 gain 191 140 -91.55 gain 140 192 -92.38 gain 192 140 -90.05 gain 140 193 -92.15 gain 193 140 -88.81 gain 140 194 -97.07 gain 194 140 -94.51 gain 140 195 -83.87 gain 195 140 -79.86 gain 140 196 -87.95 gain 196 140 -88.25 gain 140 197 -82.73 gain 197 140 -78.16 gain 140 198 -80.03 gain 198 140 -79.97 gain 140 199 -84.47 gain 199 140 -84.53 gain 140 200 -82.91 gain 200 140 -84.30 gain 140 201 -87.38 gain 201 140 -88.68 gain 140 202 -86.09 gain 202 140 -86.52 gain 140 203 -86.47 gain 203 140 -86.02 gain 140 204 -90.82 gain 204 140 -87.01 gain 140 205 -88.37 gain 205 140 -88.30 gain 140 206 -90.54 gain 206 140 -91.58 gain 140 207 -96.45 gain 207 140 -96.91 gain 140 208 -94.84 gain 208 140 -97.90 gain 140 209 -91.68 gain 209 140 -94.31 gain 140 210 -93.97 gain 210 140 -96.77 gain 140 211 -90.06 gain 211 140 -88.10 gain 140 212 -88.65 gain 212 140 -89.70 gain 140 213 -82.32 gain 213 140 -82.70 gain 140 214 -89.30 gain 214 140 -95.06 gain 140 215 -83.71 gain 215 140 -84.88 gain 140 216 -84.77 gain 216 140 -89.85 gain 140 217 -94.92 gain 217 140 -100.25 gain 140 218 -89.08 gain 218 140 -87.22 gain 140 219 -90.85 gain 219 140 -89.47 gain 140 220 -89.41 gain 220 140 -84.13 gain 140 221 -95.34 gain 221 140 -95.73 gain 140 222 -90.53 gain 222 140 -86.72 gain 140 223 -94.83 gain 223 140 -94.27 gain 140 224 -95.72 gain 224 140 -95.63 gain 141 142 -56.40 gain 142 141 -63.15 gain 141 143 -67.77 gain 143 141 -77.25 gain 141 144 -78.06 gain 144 141 -85.91 gain 141 145 -70.14 gain 145 141 -81.38 gain 141 146 -77.55 gain 146 141 -84.77 gain 141 147 -82.69 gain 147 141 -87.02 gain 141 148 -87.77 gain 148 141 -90.43 gain 141 149 -84.87 gain 149 141 -91.18 gain 141 150 -79.44 gain 150 141 -86.59 gain 141 151 -73.37 gain 151 141 -79.46 gain 141 152 -78.03 gain 152 141 -83.94 gain 141 153 -79.68 gain 153 141 -84.80 gain 141 154 -64.71 gain 154 141 -71.73 gain 141 155 -70.43 gain 155 141 -76.03 gain 141 156 -55.87 gain 156 141 -60.70 gain 141 157 -63.09 gain 157 141 -70.40 gain 141 158 -67.75 gain 158 141 -74.56 gain 141 159 -76.26 gain 159 141 -85.46 gain 141 160 -72.54 gain 160 141 -78.89 gain 141 161 -81.12 gain 161 141 -89.91 gain 141 162 -82.35 gain 162 141 -90.85 gain 141 163 -85.77 gain 163 141 -96.19 gain 141 164 -85.62 gain 164 141 -95.40 gain 141 165 -73.41 gain 165 141 -80.25 gain 141 166 -82.02 gain 166 141 -88.61 gain 141 167 -86.22 gain 167 141 -93.53 gain 141 168 -80.28 gain 168 141 -86.48 gain 141 169 -66.96 gain 169 141 -74.28 gain 141 170 -71.25 gain 170 141 -77.81 gain 141 171 -70.09 gain 171 141 -77.73 gain 141 172 -75.87 gain 172 141 -81.69 gain 141 173 -69.91 gain 173 141 -80.38 gain 141 174 -75.82 gain 174 141 -82.34 gain 141 175 -73.71 gain 175 141 -81.36 gain 141 176 -77.09 gain 176 141 -83.71 gain 141 177 -82.71 gain 177 141 -92.33 gain 141 178 -75.45 gain 178 141 -78.52 gain 141 179 -94.95 gain 179 141 -97.44 gain 141 180 -80.60 gain 180 141 -92.54 gain 141 181 -88.44 gain 181 141 -94.41 gain 141 182 -76.31 gain 182 141 -83.36 gain 141 183 -76.99 gain 183 141 -84.31 gain 141 184 -75.99 gain 184 141 -86.06 gain 141 185 -68.15 gain 185 141 -82.09 gain 141 186 -71.07 gain 186 141 -80.59 gain 141 187 -76.18 gain 187 141 -83.43 gain 141 188 -78.76 gain 188 141 -88.42 gain 141 189 -75.23 gain 189 141 -79.61 gain 141 190 -72.03 gain 190 141 -80.33 gain 141 191 -76.40 gain 191 141 -83.41 gain 141 192 -90.64 gain 192 141 -96.34 gain 141 193 -77.70 gain 193 141 -82.39 gain 141 194 -81.31 gain 194 141 -86.77 gain 141 195 -78.04 gain 195 141 -82.06 gain 141 196 -77.42 gain 196 141 -85.74 gain 141 197 -77.68 gain 197 141 -81.14 gain 141 198 -77.48 gain 198 141 -85.45 gain 141 199 -76.88 gain 199 141 -84.96 gain 141 200 -77.49 gain 200 141 -86.91 gain 141 201 -77.07 gain 201 141 -86.39 gain 141 202 -72.29 gain 202 141 -80.75 gain 141 203 -72.39 gain 203 141 -79.96 gain 141 204 -77.98 gain 204 141 -82.19 gain 141 205 -79.53 gain 205 141 -87.49 gain 141 206 -79.15 gain 206 141 -88.22 gain 141 207 -89.15 gain 207 141 -97.63 gain 141 208 -86.74 gain 208 141 -97.82 gain 141 209 -84.59 gain 209 141 -95.25 gain 141 210 -82.94 gain 210 141 -93.77 gain 141 211 -81.45 gain 211 141 -87.51 gain 141 212 -78.68 gain 212 141 -87.76 gain 141 213 -73.12 gain 213 141 -81.52 gain 141 214 -78.51 gain 214 141 -92.30 gain 141 215 -82.83 gain 215 141 -92.02 gain 141 216 -82.75 gain 216 141 -95.85 gain 141 217 -82.06 gain 217 141 -95.43 gain 141 218 -88.41 gain 218 141 -94.58 gain 141 219 -84.33 gain 219 141 -90.98 gain 141 220 -82.06 gain 220 141 -84.80 gain 141 221 -84.49 gain 221 141 -92.91 gain 141 222 -79.59 gain 222 141 -83.82 gain 141 223 -86.10 gain 223 141 -93.57 gain 141 224 -94.68 gain 224 141 -102.62 gain 142 143 -66.11 gain 143 142 -68.85 gain 142 144 -78.43 gain 144 142 -79.53 gain 142 145 -73.06 gain 145 142 -77.55 gain 142 146 -81.61 gain 146 142 -82.09 gain 142 147 -79.69 gain 147 142 -77.28 gain 142 148 -80.32 gain 148 142 -76.23 gain 142 149 -90.27 gain 149 142 -89.84 gain 142 150 -93.09 gain 150 142 -93.50 gain 142 151 -88.26 gain 151 142 -87.61 gain 142 152 -90.18 gain 152 142 -89.35 gain 142 153 -82.33 gain 153 142 -80.71 gain 142 154 -74.61 gain 154 142 -74.89 gain 142 155 -69.31 gain 155 142 -68.16 gain 142 156 -74.28 gain 156 142 -72.37 gain 142 157 -65.11 gain 157 142 -65.68 gain 142 158 -67.60 gain 158 142 -67.67 gain 142 159 -79.16 gain 159 142 -81.61 gain 142 160 -77.09 gain 160 142 -76.69 gain 142 161 -79.74 gain 161 142 -81.78 gain 142 162 -84.44 gain 162 142 -86.19 gain 142 163 -93.72 gain 163 142 -97.39 gain 142 164 -84.00 gain 164 142 -87.04 gain 142 165 -86.49 gain 165 142 -86.59 gain 142 166 -92.27 gain 166 142 -92.12 gain 142 167 -88.28 gain 167 142 -88.85 gain 142 168 -82.29 gain 168 142 -81.76 gain 142 169 -83.24 gain 169 142 -83.82 gain 142 170 -76.42 gain 170 142 -76.24 gain 142 171 -72.26 gain 171 142 -73.16 gain 142 172 -73.19 gain 172 142 -72.27 gain 142 173 -68.97 gain 173 142 -72.70 gain 142 174 -81.93 gain 174 142 -81.71 gain 142 175 -84.97 gain 175 142 -85.88 gain 142 176 -79.17 gain 176 142 -79.06 gain 142 177 -84.73 gain 177 142 -87.61 gain 142 178 -96.81 gain 178 142 -93.14 gain 142 179 -80.98 gain 179 142 -76.73 gain 142 180 -91.53 gain 180 142 -96.73 gain 142 181 -94.03 gain 181 142 -93.25 gain 142 182 -91.01 gain 182 142 -91.31 gain 142 183 -78.73 gain 183 142 -79.31 gain 142 184 -84.18 gain 184 142 -87.51 gain 142 185 -76.84 gain 185 142 -84.04 gain 142 186 -81.31 gain 186 142 -84.08 gain 142 187 -74.57 gain 187 142 -75.08 gain 142 188 -76.99 gain 188 142 -79.90 gain 142 189 -75.61 gain 189 142 -73.25 gain 142 190 -81.67 gain 190 142 -83.22 gain 142 191 -84.60 gain 191 142 -84.87 gain 142 192 -85.46 gain 192 142 -84.42 gain 142 193 -80.56 gain 193 142 -78.50 gain 142 194 -86.84 gain 194 142 -85.56 gain 142 195 -97.22 gain 195 142 -94.49 gain 142 196 -91.54 gain 196 142 -93.13 gain 142 197 -84.84 gain 197 142 -81.56 gain 142 198 -87.49 gain 198 142 -88.72 gain 142 199 -92.97 gain 199 142 -94.30 gain 142 200 -89.72 gain 200 142 -92.40 gain 142 201 -88.70 gain 201 142 -91.28 gain 142 202 -82.02 gain 202 142 -83.74 gain 142 203 -82.50 gain 203 142 -83.34 gain 142 204 -83.77 gain 204 142 -81.25 gain 142 205 -84.21 gain 205 142 -85.43 gain 142 206 -90.21 gain 206 142 -92.53 gain 142 207 -91.16 gain 207 142 -92.90 gain 142 208 -89.39 gain 208 142 -93.73 gain 142 209 -94.03 gain 209 142 -97.94 gain 142 210 -94.84 gain 210 142 -98.93 gain 142 211 -92.03 gain 211 142 -91.35 gain 142 212 -90.48 gain 212 142 -92.81 gain 142 213 -92.78 gain 213 142 -94.44 gain 142 214 -91.55 gain 214 142 -98.60 gain 142 215 -87.28 gain 215 142 -89.73 gain 142 216 -86.10 gain 216 142 -92.46 gain 142 217 -77.80 gain 217 142 -84.42 gain 142 218 -90.20 gain 218 142 -89.62 gain 142 219 -92.64 gain 219 142 -92.55 gain 142 220 -87.41 gain 220 142 -83.40 gain 142 221 -89.21 gain 221 142 -90.89 gain 142 222 -88.61 gain 222 142 -86.09 gain 142 223 -93.72 gain 223 142 -94.44 gain 142 224 -94.95 gain 224 142 -96.14 gain 143 144 -68.79 gain 144 143 -67.15 gain 143 145 -77.11 gain 145 143 -78.86 gain 143 146 -81.97 gain 146 143 -79.72 gain 143 147 -85.18 gain 147 143 -80.03 gain 143 148 -94.39 gain 148 143 -87.56 gain 143 149 -99.67 gain 149 143 -96.50 gain 143 150 -94.13 gain 150 143 -91.80 gain 143 151 -87.97 gain 151 143 -84.59 gain 143 152 -89.41 gain 152 143 -85.84 gain 143 153 -85.56 gain 153 143 -81.20 gain 143 154 -85.72 gain 154 143 -83.27 gain 143 155 -77.63 gain 155 143 -73.75 gain 143 156 -79.78 gain 156 143 -75.13 gain 143 157 -69.32 gain 157 143 -67.15 gain 143 158 -70.01 gain 158 143 -67.34 gain 143 159 -67.55 gain 159 143 -67.26 gain 143 160 -75.72 gain 160 143 -72.59 gain 143 161 -85.30 gain 161 143 -84.61 gain 143 162 -81.75 gain 162 143 -80.76 gain 143 163 -87.80 gain 163 143 -88.73 gain 143 164 -96.64 gain 164 143 -96.94 gain 143 165 -95.32 gain 165 143 -92.68 gain 143 166 -89.14 gain 166 143 -86.25 gain 143 167 -91.58 gain 167 143 -89.41 gain 143 168 -91.13 gain 168 143 -87.85 gain 143 169 -90.41 gain 169 143 -88.25 gain 143 170 -87.26 gain 170 143 -84.34 gain 143 171 -79.08 gain 171 143 -77.23 gain 143 172 -78.66 gain 172 143 -75.00 gain 143 173 -69.58 gain 173 143 -70.57 gain 143 174 -79.68 gain 174 143 -76.72 gain 143 175 -81.32 gain 175 143 -79.50 gain 143 176 -89.31 gain 176 143 -86.45 gain 143 177 -89.46 gain 177 143 -89.61 gain 143 178 -85.06 gain 178 143 -78.65 gain 143 179 -88.97 gain 179 143 -81.98 gain 143 180 -95.65 gain 180 143 -98.11 gain 143 181 -91.62 gain 181 143 -88.10 gain 143 182 -90.27 gain 182 143 -87.84 gain 143 183 -86.57 gain 183 143 -84.41 gain 143 184 -92.08 gain 184 143 -92.66 gain 143 185 -88.80 gain 185 143 -93.25 gain 143 186 -82.84 gain 186 143 -82.87 gain 143 187 -80.85 gain 187 143 -78.62 gain 143 188 -88.01 gain 188 143 -88.18 gain 143 189 -83.29 gain 189 143 -78.20 gain 143 190 -91.33 gain 190 143 -90.15 gain 143 191 -84.73 gain 191 143 -82.25 gain 143 192 -93.58 gain 192 143 -89.80 gain 143 193 -89.54 gain 193 143 -84.74 gain 143 194 -99.03 gain 194 143 -95.02 gain 143 195 -97.11 gain 195 143 -91.64 gain 143 196 -97.10 gain 196 143 -95.95 gain 143 197 -89.47 gain 197 143 -83.45 gain 143 198 -89.54 gain 198 143 -88.04 gain 143 199 -97.25 gain 199 143 -95.86 gain 143 200 -96.89 gain 200 143 -96.83 gain 143 201 -91.83 gain 201 143 -91.68 gain 143 202 -88.42 gain 202 143 -87.40 gain 143 203 -85.96 gain 203 143 -84.05 gain 143 204 -87.83 gain 204 143 -82.56 gain 143 205 -80.55 gain 205 143 -79.03 gain 143 206 -87.75 gain 206 143 -87.34 gain 143 207 -86.78 gain 207 143 -85.79 gain 143 208 -91.12 gain 208 143 -92.72 gain 143 209 -96.59 gain 209 143 -97.77 gain 143 210 -95.36 gain 210 143 -96.71 gain 143 211 -107.78 gain 211 143 -104.36 gain 143 212 -100.93 gain 212 143 -100.53 gain 143 213 -90.66 gain 213 143 -89.59 gain 143 214 -86.83 gain 214 143 -91.14 gain 143 215 -89.88 gain 215 143 -89.59 gain 143 216 -85.16 gain 216 143 -88.78 gain 143 217 -92.80 gain 217 143 -96.69 gain 143 218 -90.60 gain 218 143 -87.30 gain 143 219 -88.30 gain 219 143 -85.47 gain 143 220 -78.76 gain 220 143 -72.01 gain 143 221 -92.66 gain 221 143 -91.60 gain 143 222 -92.24 gain 222 143 -86.98 gain 143 223 -87.65 gain 223 143 -85.63 gain 143 224 -89.39 gain 224 143 -87.85 gain 144 145 -64.59 gain 145 144 -67.98 gain 144 146 -74.17 gain 146 144 -73.54 gain 144 147 -74.45 gain 147 144 -70.94 gain 144 148 -82.44 gain 148 144 -77.26 gain 144 149 -91.15 gain 149 144 -89.62 gain 144 150 -101.62 gain 150 144 -100.93 gain 144 151 -91.59 gain 151 144 -89.83 gain 144 152 -98.27 gain 152 144 -96.33 gain 144 153 -95.15 gain 153 144 -92.42 gain 144 154 -94.97 gain 154 144 -94.15 gain 144 155 -92.46 gain 155 144 -90.21 gain 144 156 -75.84 gain 156 144 -72.83 gain 144 157 -76.21 gain 157 144 -75.67 gain 144 158 -66.60 gain 158 144 -65.57 gain 144 159 -65.93 gain 159 144 -67.28 gain 144 160 -69.56 gain 160 144 -68.07 gain 144 161 -75.05 gain 161 144 -75.99 gain 144 162 -86.16 gain 162 144 -86.81 gain 144 163 -86.44 gain 163 144 -89.00 gain 144 164 -82.45 gain 164 144 -84.39 gain 144 165 -98.02 gain 165 144 -97.02 gain 144 166 -90.12 gain 166 144 -88.87 gain 144 167 -84.02 gain 167 144 -83.49 gain 144 168 -87.89 gain 168 144 -86.25 gain 144 169 -80.41 gain 169 144 -79.89 gain 144 170 -88.21 gain 170 144 -86.92 gain 144 171 -84.52 gain 171 144 -84.32 gain 144 172 -68.48 gain 172 144 -66.46 gain 144 173 -72.78 gain 173 144 -75.41 gain 144 174 -73.91 gain 174 144 -72.58 gain 144 175 -78.96 gain 175 144 -78.77 gain 144 176 -78.82 gain 176 144 -77.60 gain 144 177 -78.91 gain 177 144 -80.69 gain 144 178 -84.62 gain 178 144 -79.85 gain 144 179 -94.28 gain 179 144 -88.93 gain 144 180 -98.36 gain 180 144 -102.46 gain 144 181 -91.45 gain 181 144 -89.57 gain 144 182 -88.51 gain 182 144 -87.71 gain 144 183 -91.54 gain 183 144 -91.02 gain 144 184 -88.28 gain 184 144 -90.50 gain 144 185 -85.18 gain 185 144 -91.27 gain 144 186 -87.86 gain 186 144 -89.53 gain 144 187 -89.39 gain 187 144 -88.79 gain 144 188 -83.32 gain 188 144 -85.13 gain 144 189 -84.78 gain 189 144 -81.32 gain 144 190 -77.84 gain 190 144 -78.29 gain 144 191 -85.68 gain 191 144 -84.84 gain 144 192 -92.65 gain 192 144 -90.51 gain 144 193 -91.93 gain 193 144 -88.77 gain 144 194 -91.05 gain 194 144 -88.67 gain 144 195 -94.49 gain 195 144 -90.66 gain 144 196 -94.03 gain 196 144 -94.51 gain 144 197 -94.63 gain 197 144 -90.25 gain 144 198 -87.22 gain 198 144 -87.35 gain 144 199 -85.77 gain 199 144 -86.01 gain 144 200 -89.51 gain 200 144 -91.08 gain 144 201 -88.85 gain 201 144 -90.33 gain 144 202 -84.38 gain 202 144 -85.00 gain 144 203 -79.81 gain 203 144 -79.54 gain 144 204 -92.62 gain 204 144 -89.00 gain 144 205 -82.07 gain 205 144 -82.18 gain 144 206 -90.08 gain 206 144 -91.30 gain 144 207 -92.73 gain 207 144 -93.37 gain 144 208 -93.19 gain 208 144 -96.43 gain 144 209 -93.29 gain 209 144 -96.11 gain 144 210 -102.37 gain 210 144 -105.36 gain 144 211 -93.82 gain 211 144 -92.04 gain 144 212 -90.31 gain 212 144 -91.54 gain 144 213 -95.72 gain 213 144 -96.28 gain 144 214 -89.38 gain 214 144 -95.32 gain 144 215 -100.10 gain 215 144 -101.45 gain 144 216 -88.98 gain 216 144 -94.24 gain 144 217 -86.29 gain 217 144 -91.81 gain 144 218 -89.07 gain 218 144 -87.39 gain 144 219 -73.86 gain 219 144 -72.66 gain 144 220 -92.79 gain 220 144 -87.68 gain 144 221 -90.20 gain 221 144 -90.78 gain 144 222 -87.54 gain 222 144 -83.92 gain 144 223 -87.07 gain 223 144 -86.69 gain 144 224 -89.59 gain 224 144 -89.68 gain 145 146 -63.35 gain 146 145 -59.34 gain 145 147 -77.86 gain 147 145 -70.96 gain 145 148 -81.98 gain 148 145 -73.41 gain 145 149 -84.68 gain 149 145 -79.76 gain 145 150 -103.91 gain 150 145 -99.83 gain 145 151 -100.82 gain 151 145 -95.68 gain 145 152 -95.94 gain 152 145 -90.61 gain 145 153 -94.13 gain 153 145 -88.02 gain 145 154 -93.34 gain 154 145 -89.13 gain 145 155 -92.43 gain 155 145 -86.80 gain 145 156 -85.53 gain 156 145 -79.13 gain 145 157 -82.16 gain 157 145 -78.24 gain 145 158 -83.57 gain 158 145 -79.15 gain 145 159 -68.41 gain 159 145 -66.37 gain 145 160 -70.93 gain 160 145 -66.05 gain 145 161 -71.61 gain 161 145 -69.17 gain 145 162 -75.16 gain 162 145 -72.42 gain 145 163 -89.94 gain 163 145 -89.12 gain 145 164 -89.11 gain 164 145 -87.66 gain 145 165 -93.38 gain 165 145 -88.98 gain 145 166 -92.39 gain 166 145 -87.75 gain 145 167 -98.94 gain 167 145 -95.03 gain 145 168 -92.30 gain 168 145 -87.28 gain 145 169 -97.64 gain 169 145 -93.73 gain 145 170 -90.25 gain 170 145 -85.57 gain 145 171 -92.00 gain 171 145 -88.41 gain 145 172 -82.44 gain 172 145 -77.03 gain 145 173 -81.66 gain 173 145 -80.90 gain 145 174 -79.19 gain 174 145 -74.48 gain 145 175 -75.10 gain 175 145 -71.53 gain 145 176 -75.53 gain 176 145 -70.93 gain 145 177 -82.10 gain 177 145 -80.49 gain 145 178 -85.53 gain 178 145 -77.37 gain 145 179 -91.65 gain 179 145 -82.91 gain 145 180 -110.15 gain 180 145 -110.86 gain 145 181 -101.57 gain 181 145 -96.30 gain 145 182 -92.68 gain 182 145 -88.49 gain 145 183 -92.46 gain 183 145 -88.55 gain 145 184 -98.07 gain 184 145 -96.91 gain 145 185 -92.24 gain 185 145 -94.95 gain 145 186 -85.60 gain 186 145 -83.88 gain 145 187 -85.56 gain 187 145 -81.57 gain 145 188 -88.43 gain 188 145 -86.85 gain 145 189 -83.06 gain 189 145 -76.21 gain 145 190 -89.61 gain 190 145 -86.68 gain 145 191 -80.77 gain 191 145 -76.54 gain 145 192 -80.65 gain 192 145 -75.12 gain 145 193 -92.49 gain 193 145 -85.94 gain 145 194 -91.15 gain 194 145 -85.39 gain 145 195 -105.79 gain 195 145 -98.58 gain 145 196 -98.53 gain 196 145 -95.62 gain 145 197 -99.36 gain 197 145 -91.59 gain 145 198 -97.07 gain 198 145 -93.81 gain 145 199 -91.47 gain 199 145 -88.32 gain 145 200 -95.00 gain 200 145 -93.19 gain 145 201 -86.44 gain 201 145 -84.54 gain 145 202 -87.51 gain 202 145 -84.74 gain 145 203 -82.19 gain 203 145 -78.53 gain 145 204 -85.52 gain 204 145 -78.50 gain 145 205 -88.30 gain 205 145 -85.02 gain 145 206 -87.59 gain 206 145 -85.43 gain 145 207 -91.67 gain 207 145 -88.92 gain 145 208 -89.05 gain 208 145 -88.90 gain 145 209 -90.96 gain 209 145 -90.39 gain 145 210 -102.12 gain 210 145 -101.72 gain 145 211 -98.86 gain 211 145 -93.69 gain 145 212 -92.48 gain 212 145 -90.32 gain 145 213 -103.27 gain 213 145 -100.44 gain 145 214 -93.33 gain 214 145 -95.89 gain 145 215 -94.54 gain 215 145 -92.50 gain 145 216 -92.87 gain 216 145 -94.74 gain 145 217 -97.71 gain 217 145 -99.84 gain 145 218 -93.49 gain 218 145 -88.43 gain 145 219 -93.27 gain 219 145 -88.69 gain 145 220 -93.69 gain 220 145 -85.20 gain 145 221 -84.31 gain 221 145 -81.49 gain 145 222 -97.57 gain 222 145 -90.57 gain 145 223 -89.66 gain 223 145 -85.89 gain 145 224 -97.20 gain 224 145 -93.90 gain 146 147 -67.98 gain 147 146 -65.08 gain 146 148 -74.48 gain 148 146 -69.92 gain 146 149 -75.73 gain 149 146 -74.82 gain 146 150 -92.50 gain 150 146 -92.43 gain 146 151 -93.11 gain 151 146 -91.98 gain 146 152 -98.78 gain 152 146 -97.47 gain 146 153 -91.21 gain 153 146 -89.11 gain 146 154 -92.17 gain 154 146 -91.97 gain 146 155 -86.68 gain 155 146 -85.05 gain 146 156 -88.57 gain 156 146 -86.17 gain 146 157 -83.01 gain 157 146 -83.10 gain 146 158 -84.12 gain 158 146 -83.71 gain 146 159 -77.09 gain 159 146 -79.07 gain 146 160 -72.85 gain 160 146 -71.97 gain 146 161 -63.16 gain 161 146 -64.73 gain 146 162 -74.92 gain 162 146 -76.20 gain 146 163 -72.04 gain 163 146 -75.23 gain 146 164 -81.03 gain 164 146 -83.58 gain 146 165 -102.94 gain 165 146 -102.56 gain 146 166 -90.80 gain 166 146 -90.17 gain 146 167 -89.35 gain 167 146 -89.45 gain 146 168 -89.69 gain 168 146 -88.68 gain 146 169 -83.35 gain 169 146 -83.45 gain 146 170 -91.45 gain 170 146 -90.79 gain 146 171 -84.57 gain 171 146 -84.98 gain 146 172 -91.50 gain 172 146 -90.10 gain 146 173 -79.05 gain 173 146 -82.30 gain 146 174 -78.77 gain 174 146 -78.07 gain 146 175 -76.74 gain 175 146 -77.17 gain 146 176 -69.57 gain 176 146 -68.98 gain 146 177 -70.66 gain 177 146 -73.06 gain 146 178 -80.23 gain 178 146 -76.08 gain 146 179 -80.51 gain 179 146 -75.78 gain 146 180 -99.22 gain 180 146 -103.94 gain 146 181 -97.89 gain 181 146 -96.63 gain 146 182 -93.34 gain 182 146 -93.16 gain 146 183 -95.33 gain 183 146 -95.43 gain 146 184 -93.20 gain 184 146 -96.05 gain 146 185 -90.50 gain 185 146 -97.21 gain 146 186 -88.04 gain 186 146 -90.33 gain 146 187 -83.88 gain 187 146 -83.91 gain 146 188 -85.48 gain 188 146 -87.91 gain 146 189 -83.26 gain 189 146 -80.42 gain 146 190 -83.89 gain 190 146 -84.97 gain 146 191 -81.35 gain 191 146 -81.13 gain 146 192 -80.73 gain 192 146 -79.21 gain 146 193 -86.49 gain 193 146 -83.95 gain 146 194 -82.86 gain 194 146 -81.10 gain 146 195 -96.32 gain 195 146 -93.11 gain 146 196 -95.72 gain 196 146 -96.83 gain 146 197 -90.39 gain 197 146 -86.63 gain 146 198 -98.52 gain 198 146 -99.27 gain 146 199 -94.49 gain 199 146 -95.35 gain 146 200 -94.94 gain 200 146 -97.14 gain 146 201 -88.35 gain 201 146 -90.45 gain 146 202 -88.89 gain 202 146 -90.13 gain 146 203 -91.57 gain 203 146 -91.92 gain 146 204 -81.94 gain 204 146 -78.93 gain 146 205 -82.15 gain 205 146 -82.89 gain 146 206 -89.39 gain 206 146 -91.24 gain 146 207 -80.34 gain 207 146 -81.61 gain 146 208 -86.31 gain 208 146 -90.18 gain 146 209 -89.30 gain 209 146 -92.73 gain 146 210 -92.43 gain 210 146 -96.03 gain 146 211 -94.09 gain 211 146 -92.93 gain 146 212 -98.54 gain 212 146 -100.39 gain 146 213 -89.39 gain 213 146 -90.57 gain 146 214 -95.68 gain 214 146 -102.25 gain 146 215 -94.14 gain 215 146 -96.11 gain 146 216 -84.66 gain 216 146 -90.54 gain 146 217 -89.94 gain 217 146 -96.08 gain 146 218 -89.98 gain 218 146 -88.93 gain 146 219 -87.66 gain 219 146 -87.09 gain 146 220 -85.80 gain 220 146 -81.31 gain 146 221 -88.57 gain 221 146 -89.77 gain 146 222 -93.03 gain 222 146 -90.04 gain 146 223 -85.68 gain 223 146 -85.93 gain 146 224 -89.24 gain 224 146 -89.95 gain 147 148 -58.73 gain 148 147 -57.06 gain 147 149 -70.01 gain 149 147 -72.00 gain 147 150 -95.28 gain 150 147 -98.11 gain 147 151 -86.39 gain 151 147 -88.15 gain 147 152 -91.38 gain 152 147 -92.96 gain 147 153 -87.23 gain 153 147 -88.02 gain 147 154 -100.10 gain 154 147 -102.80 gain 147 155 -90.38 gain 155 147 -91.65 gain 147 156 -85.68 gain 156 147 -86.17 gain 147 157 -83.43 gain 157 147 -86.41 gain 147 158 -81.25 gain 158 147 -83.73 gain 147 159 -79.70 gain 159 147 -84.56 gain 147 160 -78.52 gain 160 147 -80.54 gain 147 161 -60.83 gain 161 147 -65.29 gain 147 162 -61.30 gain 162 147 -65.47 gain 147 163 -75.37 gain 163 147 -81.46 gain 147 164 -77.17 gain 164 147 -82.62 gain 147 165 -95.18 gain 165 147 -97.69 gain 147 166 -98.55 gain 166 147 -100.81 gain 147 167 -90.27 gain 167 147 -93.25 gain 147 168 -83.86 gain 168 147 -85.74 gain 147 169 -90.57 gain 169 147 -93.57 gain 147 170 -90.24 gain 170 147 -92.47 gain 147 171 -83.26 gain 171 147 -86.57 gain 147 172 -82.16 gain 172 147 -83.65 gain 147 173 -80.38 gain 173 147 -86.52 gain 147 174 -75.35 gain 174 147 -77.54 gain 147 175 -78.21 gain 175 147 -81.53 gain 147 176 -80.40 gain 176 147 -82.70 gain 147 177 -73.15 gain 177 147 -78.45 gain 147 178 -66.10 gain 178 147 -64.84 gain 147 179 -76.02 gain 179 147 -74.18 gain 147 180 -99.84 gain 180 147 -107.45 gain 147 181 -92.96 gain 181 147 -94.59 gain 147 182 -96.18 gain 182 147 -98.90 gain 147 183 -83.08 gain 183 147 -86.07 gain 147 184 -90.63 gain 184 147 -96.37 gain 147 185 -92.23 gain 185 147 -101.83 gain 147 186 -85.56 gain 186 147 -90.74 gain 147 187 -82.06 gain 187 147 -84.97 gain 147 188 -75.48 gain 188 147 -80.80 gain 147 189 -77.41 gain 189 147 -77.46 gain 147 190 -78.41 gain 190 147 -82.37 gain 147 191 -76.26 gain 191 147 -78.94 gain 147 192 -75.70 gain 192 147 -77.07 gain 147 193 -81.53 gain 193 147 -81.89 gain 147 194 -78.10 gain 194 147 -79.24 gain 147 195 -99.38 gain 195 147 -99.07 gain 147 196 -89.08 gain 196 147 -93.08 gain 147 197 -100.46 gain 197 147 -99.59 gain 147 198 -88.72 gain 198 147 -92.37 gain 147 199 -82.39 gain 199 147 -86.14 gain 147 200 -92.79 gain 200 147 -97.88 gain 147 201 -87.39 gain 201 147 -92.38 gain 147 202 -81.57 gain 202 147 -85.70 gain 147 203 -90.00 gain 203 147 -93.24 gain 147 204 -81.06 gain 204 147 -80.94 gain 147 205 -88.67 gain 205 147 -92.30 gain 147 206 -76.47 gain 206 147 -81.20 gain 147 207 -82.81 gain 207 147 -86.97 gain 147 208 -87.48 gain 208 147 -94.23 gain 147 209 -78.13 gain 209 147 -84.46 gain 147 210 -94.59 gain 210 147 -101.09 gain 147 211 -99.47 gain 211 147 -101.20 gain 147 212 -95.50 gain 212 147 -100.25 gain 147 213 -101.93 gain 213 147 -106.00 gain 147 214 -88.51 gain 214 147 -97.97 gain 147 215 -90.89 gain 215 147 -95.76 gain 147 216 -90.59 gain 216 147 -99.36 gain 147 217 -88.54 gain 217 147 -97.58 gain 147 218 -92.13 gain 218 147 -93.97 gain 147 219 -89.17 gain 219 147 -91.49 gain 147 220 -88.75 gain 220 147 -87.16 gain 147 221 -87.42 gain 221 147 -91.51 gain 147 222 -90.16 gain 222 147 -90.05 gain 147 223 -85.29 gain 223 147 -88.43 gain 147 224 -83.95 gain 224 147 -87.55 gain 148 149 -58.20 gain 149 148 -61.85 gain 148 150 -91.21 gain 150 148 -95.71 gain 148 151 -91.44 gain 151 148 -94.87 gain 148 152 -90.98 gain 152 148 -94.23 gain 148 153 -97.47 gain 153 148 -99.94 gain 148 154 -88.87 gain 154 148 -93.24 gain 148 155 -92.85 gain 155 148 -95.79 gain 148 156 -86.82 gain 156 148 -88.99 gain 148 157 -81.91 gain 157 148 -86.56 gain 148 158 -86.26 gain 158 148 -90.41 gain 148 159 -79.84 gain 159 148 -86.37 gain 148 160 -78.95 gain 160 148 -82.64 gain 148 161 -67.55 gain 161 148 -73.68 gain 148 162 -64.34 gain 162 148 -70.18 gain 148 163 -63.88 gain 163 148 -71.63 gain 148 164 -68.84 gain 164 148 -75.96 gain 148 165 -93.06 gain 165 148 -97.24 gain 148 166 -95.40 gain 166 148 -99.34 gain 148 167 -91.17 gain 167 148 -95.82 gain 148 168 -88.05 gain 168 148 -91.60 gain 148 169 -92.69 gain 169 148 -97.35 gain 148 170 -88.60 gain 170 148 -92.50 gain 148 171 -78.00 gain 171 148 -82.98 gain 148 172 -83.24 gain 172 148 -86.40 gain 148 173 -79.46 gain 173 148 -87.27 gain 148 174 -83.12 gain 174 148 -86.98 gain 148 175 -78.83 gain 175 148 -83.82 gain 148 176 -76.81 gain 176 148 -80.77 gain 148 177 -69.95 gain 177 148 -76.92 gain 148 178 -75.05 gain 178 148 -75.46 gain 148 179 -75.73 gain 179 148 -75.57 gain 148 180 -90.71 gain 180 148 -99.99 gain 148 181 -95.61 gain 181 148 -98.91 gain 148 182 -88.70 gain 182 148 -93.09 gain 148 183 -92.49 gain 183 148 -97.15 gain 148 184 -90.02 gain 184 148 -97.43 gain 148 185 -85.86 gain 185 148 -97.14 gain 148 186 -85.73 gain 186 148 -92.59 gain 148 187 -72.26 gain 187 148 -76.85 gain 148 188 -82.71 gain 188 148 -89.71 gain 148 189 -77.38 gain 189 148 -79.10 gain 148 190 -79.52 gain 190 148 -85.16 gain 148 191 -71.26 gain 191 148 -75.60 gain 148 192 -76.18 gain 192 148 -79.22 gain 148 193 -77.04 gain 193 148 -79.07 gain 148 194 -78.54 gain 194 148 -81.35 gain 148 195 -98.76 gain 195 148 -100.12 gain 148 196 -95.21 gain 196 148 -100.88 gain 148 197 -96.68 gain 197 148 -97.48 gain 148 198 -99.37 gain 198 148 -104.69 gain 148 199 -89.55 gain 199 148 -94.98 gain 148 200 -88.27 gain 200 148 -95.03 gain 148 201 -85.69 gain 201 148 -92.36 gain 148 202 -85.66 gain 202 148 -91.46 gain 148 203 -93.04 gain 203 148 -97.95 gain 148 204 -81.24 gain 204 148 -82.80 gain 148 205 -82.17 gain 205 148 -87.47 gain 148 206 -77.81 gain 206 148 -84.22 gain 148 207 -75.55 gain 207 148 -81.38 gain 148 208 -77.39 gain 208 148 -85.82 gain 148 209 -80.19 gain 209 148 -88.19 gain 148 210 -97.33 gain 210 148 -105.50 gain 148 211 -90.47 gain 211 148 -93.88 gain 148 212 -91.78 gain 212 148 -98.20 gain 148 213 -93.33 gain 213 148 -99.07 gain 148 214 -87.49 gain 214 148 -98.62 gain 148 215 -97.20 gain 215 148 -103.73 gain 148 216 -88.82 gain 216 148 -99.26 gain 148 217 -85.53 gain 217 148 -96.24 gain 148 218 -81.28 gain 218 148 -84.79 gain 148 219 -88.79 gain 219 148 -92.78 gain 148 220 -85.12 gain 220 148 -85.20 gain 148 221 -85.69 gain 221 148 -91.45 gain 148 222 -93.60 gain 222 148 -95.17 gain 148 223 -80.79 gain 223 148 -85.60 gain 148 224 -81.80 gain 224 148 -87.07 gain 149 150 -92.66 gain 150 149 -93.49 gain 149 151 -102.09 gain 151 149 -101.87 gain 149 152 -95.31 gain 152 149 -94.91 gain 149 153 -100.17 gain 153 149 -98.98 gain 149 154 -90.36 gain 154 149 -91.07 gain 149 155 -94.40 gain 155 149 -93.68 gain 149 156 -90.07 gain 156 149 -88.59 gain 149 157 -89.37 gain 157 149 -90.37 gain 149 158 -89.01 gain 158 149 -89.51 gain 149 159 -85.33 gain 159 149 -88.21 gain 149 160 -85.09 gain 160 149 -85.12 gain 149 161 -85.74 gain 161 149 -88.21 gain 149 162 -68.87 gain 162 149 -71.05 gain 149 163 -70.65 gain 163 149 -74.74 gain 149 164 -60.64 gain 164 149 -64.11 gain 149 165 -93.23 gain 165 149 -93.76 gain 149 166 -94.56 gain 166 149 -94.83 gain 149 167 -96.03 gain 167 149 -97.03 gain 149 168 -96.90 gain 168 149 -96.79 gain 149 169 -92.90 gain 169 149 -93.91 gain 149 170 -90.30 gain 170 149 -90.54 gain 149 171 -96.00 gain 171 149 -97.32 gain 149 172 -93.95 gain 172 149 -93.46 gain 149 173 -92.77 gain 173 149 -96.92 gain 149 174 -89.97 gain 174 149 -90.18 gain 149 175 -82.89 gain 175 149 -84.23 gain 149 176 -79.40 gain 176 149 -79.71 gain 149 177 -83.00 gain 177 149 -86.31 gain 149 178 -77.29 gain 178 149 -74.04 gain 149 179 -70.24 gain 179 149 -66.42 gain 149 180 -100.20 gain 180 149 -105.83 gain 149 181 -99.26 gain 181 149 -98.91 gain 149 182 -93.09 gain 182 149 -93.82 gain 149 183 -101.31 gain 183 149 -102.32 gain 149 184 -89.67 gain 184 149 -93.42 gain 149 185 -89.72 gain 185 149 -97.34 gain 149 186 -97.42 gain 186 149 -100.62 gain 149 187 -97.06 gain 187 149 -97.99 gain 149 188 -81.38 gain 188 149 -84.72 gain 149 189 -86.14 gain 189 149 -84.20 gain 149 190 -88.28 gain 190 149 -90.26 gain 149 191 -90.63 gain 191 149 -91.32 gain 149 192 -73.63 gain 192 149 -73.02 gain 149 193 -84.11 gain 193 149 -82.48 gain 149 194 -70.59 gain 194 149 -69.75 gain 149 195 -98.61 gain 195 149 -96.31 gain 149 196 -104.14 gain 196 149 -106.15 gain 149 197 -101.16 gain 197 149 -98.31 gain 149 198 -105.09 gain 198 149 -106.75 gain 149 199 -95.12 gain 199 149 -96.89 gain 149 200 -90.77 gain 200 149 -93.87 gain 149 201 -87.53 gain 201 149 -90.54 gain 149 202 -95.15 gain 202 149 -97.29 gain 149 203 -88.48 gain 203 149 -89.73 gain 149 204 -87.26 gain 204 149 -85.16 gain 149 205 -83.13 gain 205 149 -84.77 gain 149 206 -84.82 gain 206 149 -87.57 gain 149 207 -83.31 gain 207 149 -85.48 gain 149 208 -84.42 gain 208 149 -89.19 gain 149 209 -85.23 gain 209 149 -89.57 gain 149 210 -101.70 gain 210 149 -106.22 gain 149 211 -103.97 gain 211 149 -103.72 gain 149 212 -101.42 gain 212 149 -104.18 gain 149 213 -98.18 gain 213 149 -100.27 gain 149 214 -100.60 gain 214 149 -108.07 gain 149 215 -91.13 gain 215 149 -94.01 gain 149 216 -89.77 gain 216 149 -96.56 gain 149 217 -88.76 gain 217 149 -95.81 gain 149 218 -92.92 gain 218 149 -92.78 gain 149 219 -89.34 gain 219 149 -89.67 gain 149 220 -92.43 gain 220 149 -88.86 gain 149 221 -88.52 gain 221 149 -90.62 gain 149 222 -87.06 gain 222 149 -84.97 gain 149 223 -81.69 gain 223 149 -82.85 gain 149 224 -86.67 gain 224 149 -88.28 gain 150 151 -61.67 gain 151 150 -60.61 gain 150 152 -72.06 gain 152 150 -70.82 gain 150 153 -88.22 gain 153 150 -86.20 gain 150 154 -85.89 gain 154 150 -85.76 gain 150 155 -76.57 gain 155 150 -75.02 gain 150 156 -93.42 gain 156 150 -91.10 gain 150 157 -96.77 gain 157 150 -96.93 gain 150 158 -94.75 gain 158 150 -94.41 gain 150 159 -94.39 gain 159 150 -96.43 gain 150 160 -86.31 gain 160 150 -85.51 gain 150 161 -85.38 gain 161 150 -87.02 gain 150 162 -102.16 gain 162 150 -103.50 gain 150 163 -86.40 gain 163 150 -89.66 gain 150 164 -102.51 gain 164 150 -105.14 gain 150 165 -66.11 gain 165 150 -65.79 gain 150 166 -65.79 gain 166 150 -65.23 gain 150 167 -68.41 gain 167 150 -68.57 gain 150 168 -83.82 gain 168 150 -82.88 gain 150 169 -84.59 gain 169 150 -84.76 gain 150 170 -91.14 gain 170 150 -90.55 gain 150 171 -90.05 gain 171 150 -90.54 gain 150 172 -92.70 gain 172 150 -91.38 gain 150 173 -87.86 gain 173 150 -91.18 gain 150 174 -91.98 gain 174 150 -91.35 gain 150 175 -97.06 gain 175 150 -97.56 gain 150 176 -97.44 gain 176 150 -96.91 gain 150 177 -92.57 gain 177 150 -95.04 gain 150 178 -97.57 gain 178 150 -93.49 gain 150 179 -92.51 gain 179 150 -87.85 gain 150 180 -71.36 gain 180 150 -76.15 gain 150 181 -76.49 gain 181 150 -75.30 gain 150 182 -77.56 gain 182 150 -77.45 gain 150 183 -83.17 gain 183 150 -83.34 gain 150 184 -89.21 gain 184 150 -92.13 gain 150 185 -83.16 gain 185 150 -89.94 gain 150 186 -85.65 gain 186 150 -88.01 gain 150 187 -89.20 gain 187 150 -89.29 gain 150 188 -88.20 gain 188 150 -90.70 gain 150 189 -95.68 gain 189 150 -92.91 gain 150 190 -99.43 gain 190 150 -100.57 gain 150 191 -89.36 gain 191 150 -89.21 gain 150 192 -98.41 gain 192 150 -96.95 gain 150 193 -95.35 gain 193 150 -92.89 gain 150 194 -99.03 gain 194 150 -97.34 gain 150 195 -73.57 gain 195 150 -70.43 gain 150 196 -85.73 gain 196 150 -86.91 gain 150 197 -73.45 gain 197 150 -69.76 gain 150 198 -84.00 gain 198 150 -84.82 gain 150 199 -83.21 gain 199 150 -84.13 gain 150 200 -85.68 gain 200 150 -87.94 gain 150 201 -89.81 gain 201 150 -91.98 gain 150 202 -98.22 gain 202 150 -99.53 gain 150 203 -93.10 gain 203 150 -93.52 gain 150 204 -95.84 gain 204 150 -92.90 gain 150 205 -103.85 gain 205 150 -104.65 gain 150 206 -98.88 gain 206 150 -100.80 gain 150 207 -93.62 gain 207 150 -94.95 gain 150 208 -99.93 gain 208 150 -103.86 gain 150 209 -104.57 gain 209 150 -108.07 gain 150 210 -77.91 gain 210 150 -81.60 gain 150 211 -78.30 gain 211 150 -77.22 gain 150 212 -90.63 gain 212 150 -92.55 gain 150 213 -80.95 gain 213 150 -82.20 gain 150 214 -88.50 gain 214 150 -95.14 gain 150 215 -90.40 gain 215 150 -92.44 gain 150 216 -86.38 gain 216 150 -92.33 gain 150 217 -92.12 gain 217 150 -98.34 gain 150 218 -88.21 gain 218 150 -87.23 gain 150 219 -91.27 gain 219 150 -90.77 gain 150 220 -101.52 gain 220 150 -97.11 gain 150 221 -90.00 gain 221 150 -91.27 gain 150 222 -99.79 gain 222 150 -96.86 gain 150 223 -95.10 gain 223 150 -95.41 gain 150 224 -100.14 gain 224 150 -100.92 gain 151 152 -70.29 gain 152 151 -70.11 gain 151 153 -71.04 gain 153 151 -70.07 gain 151 154 -79.59 gain 154 151 -80.52 gain 151 155 -86.91 gain 155 151 -86.42 gain 151 156 -94.46 gain 156 151 -93.20 gain 151 157 -91.65 gain 157 151 -92.87 gain 151 158 -94.61 gain 158 151 -95.33 gain 151 159 -92.89 gain 159 151 -96.00 gain 151 160 -90.91 gain 160 151 -91.17 gain 151 161 -97.14 gain 161 151 -99.83 gain 151 162 -96.42 gain 162 151 -98.82 gain 151 163 -96.66 gain 163 151 -100.98 gain 151 164 -97.88 gain 164 151 -101.57 gain 151 165 -63.39 gain 165 151 -64.13 gain 151 166 -71.92 gain 166 151 -72.42 gain 151 167 -64.86 gain 167 151 -66.08 gain 151 168 -72.57 gain 168 151 -72.68 gain 151 169 -75.62 gain 169 151 -76.85 gain 151 170 -79.15 gain 170 151 -79.61 gain 151 171 -91.94 gain 171 151 -93.49 gain 151 172 -83.78 gain 172 151 -83.51 gain 151 173 -94.64 gain 173 151 -99.02 gain 151 174 -86.32 gain 174 151 -86.75 gain 151 175 -101.10 gain 175 151 -102.66 gain 151 176 -96.13 gain 176 151 -96.67 gain 151 177 -101.45 gain 177 151 -104.99 gain 151 178 -101.82 gain 178 151 -98.80 gain 151 179 -96.77 gain 179 151 -93.17 gain 151 180 -70.92 gain 180 151 -76.76 gain 151 181 -75.94 gain 181 151 -75.81 gain 151 182 -69.08 gain 182 151 -70.03 gain 151 183 -77.12 gain 183 151 -78.35 gain 151 184 -88.71 gain 184 151 -92.69 gain 151 185 -78.03 gain 185 151 -85.87 gain 151 186 -85.93 gain 186 151 -89.35 gain 151 187 -96.65 gain 187 151 -97.80 gain 151 188 -86.87 gain 188 151 -90.44 gain 151 189 -90.67 gain 189 151 -88.96 gain 151 190 -89.80 gain 190 151 -92.01 gain 151 191 -96.52 gain 191 151 -97.43 gain 151 192 -100.80 gain 192 151 -100.40 gain 151 193 -104.61 gain 193 151 -103.21 gain 151 194 -105.66 gain 194 151 -105.03 gain 151 195 -81.12 gain 195 151 -79.05 gain 151 196 -82.58 gain 196 151 -84.81 gain 151 197 -83.95 gain 197 151 -81.32 gain 151 198 -78.95 gain 198 151 -80.83 gain 151 199 -75.49 gain 199 151 -77.47 gain 151 200 -89.25 gain 200 151 -92.57 gain 151 201 -87.15 gain 201 151 -90.38 gain 151 202 -90.52 gain 202 151 -92.88 gain 151 203 -83.38 gain 203 151 -84.86 gain 151 204 -87.16 gain 204 151 -85.28 gain 151 205 -96.35 gain 205 151 -98.22 gain 151 206 -93.00 gain 206 151 -95.97 gain 151 207 -97.69 gain 207 151 -100.08 gain 151 208 -96.02 gain 208 151 -101.01 gain 151 209 -99.01 gain 209 151 -103.58 gain 151 210 -77.54 gain 210 151 -82.28 gain 151 211 -83.47 gain 211 151 -83.44 gain 151 212 -77.94 gain 212 151 -80.92 gain 151 213 -82.44 gain 213 151 -84.75 gain 151 214 -86.58 gain 214 151 -94.28 gain 151 215 -89.66 gain 215 151 -92.76 gain 151 216 -87.26 gain 216 151 -94.27 gain 151 217 -95.37 gain 217 151 -102.64 gain 151 218 -92.97 gain 218 151 -93.05 gain 151 219 -94.56 gain 219 151 -95.12 gain 151 220 -95.37 gain 220 151 -92.02 gain 151 221 -97.52 gain 221 151 -99.85 gain 151 222 -92.37 gain 222 151 -90.51 gain 151 223 -99.97 gain 223 151 -101.34 gain 151 224 -96.93 gain 224 151 -98.77 gain 152 153 -58.94 gain 153 152 -58.15 gain 152 154 -75.67 gain 154 152 -76.78 gain 152 155 -76.52 gain 155 152 -76.21 gain 152 156 -90.11 gain 156 152 -89.03 gain 152 157 -78.50 gain 157 152 -79.91 gain 152 158 -84.37 gain 158 152 -85.27 gain 152 159 -85.34 gain 159 152 -88.63 gain 152 160 -97.28 gain 160 152 -97.72 gain 152 161 -90.58 gain 161 152 -93.46 gain 152 162 -91.93 gain 162 152 -94.52 gain 152 163 -98.79 gain 163 152 -103.30 gain 152 164 -100.32 gain 164 152 -104.19 gain 152 165 -77.95 gain 165 152 -78.88 gain 152 166 -65.72 gain 166 152 -66.41 gain 152 167 -64.76 gain 167 152 -66.16 gain 152 168 -63.01 gain 168 152 -63.31 gain 152 169 -75.11 gain 169 152 -76.52 gain 152 170 -78.44 gain 170 152 -79.08 gain 152 171 -73.56 gain 171 152 -75.29 gain 152 172 -89.76 gain 172 152 -89.68 gain 152 173 -86.18 gain 173 152 -90.74 gain 152 174 -90.84 gain 174 152 -91.45 gain 152 175 -91.46 gain 175 152 -93.21 gain 152 176 -93.47 gain 176 152 -94.19 gain 152 177 -86.71 gain 177 152 -90.43 gain 152 178 -98.89 gain 178 152 -96.05 gain 152 179 -92.40 gain 179 152 -88.98 gain 152 180 -78.11 gain 180 152 -84.14 gain 152 181 -63.61 gain 181 152 -63.66 gain 152 182 -70.09 gain 182 152 -71.23 gain 152 183 -76.24 gain 183 152 -77.65 gain 152 184 -74.65 gain 184 152 -78.81 gain 152 185 -75.93 gain 185 152 -83.96 gain 152 186 -82.00 gain 186 152 -85.61 gain 152 187 -87.70 gain 187 152 -89.04 gain 152 188 -89.29 gain 188 152 -93.04 gain 152 189 -89.16 gain 189 152 -87.63 gain 152 190 -89.80 gain 190 152 -92.19 gain 152 191 -95.02 gain 191 152 -96.12 gain 152 192 -94.52 gain 192 152 -94.31 gain 152 193 -94.91 gain 193 152 -93.69 gain 152 194 -96.34 gain 194 152 -95.90 gain 152 195 -77.79 gain 195 152 -75.89 gain 152 196 -81.18 gain 196 152 -83.60 gain 152 197 -71.51 gain 197 152 -69.06 gain 152 198 -76.79 gain 198 152 -78.85 gain 152 199 -79.85 gain 199 152 -82.02 gain 152 200 -81.95 gain 200 152 -85.46 gain 152 201 -87.45 gain 201 152 -90.86 gain 152 202 -93.55 gain 202 152 -96.10 gain 152 203 -94.83 gain 203 152 -96.49 gain 152 204 -83.40 gain 204 152 -81.71 gain 152 205 -92.06 gain 205 152 -94.11 gain 152 206 -98.25 gain 206 152 -101.41 gain 152 207 -94.36 gain 207 152 -96.94 gain 152 208 -93.55 gain 208 152 -98.72 gain 152 209 -97.69 gain 209 152 -102.44 gain 152 210 -85.90 gain 210 152 -90.82 gain 152 211 -78.56 gain 211 152 -78.72 gain 152 212 -78.75 gain 212 152 -81.92 gain 152 213 -79.16 gain 213 152 -81.65 gain 152 214 -77.52 gain 214 152 -85.40 gain 152 215 -82.24 gain 215 152 -85.52 gain 152 216 -91.72 gain 216 152 -98.91 gain 152 217 -84.59 gain 217 152 -92.04 gain 152 218 -87.12 gain 218 152 -87.39 gain 152 219 -84.58 gain 219 152 -85.32 gain 152 220 -87.60 gain 220 152 -84.43 gain 152 221 -89.23 gain 221 152 -91.74 gain 152 222 -101.02 gain 222 152 -99.34 gain 152 223 -94.44 gain 223 152 -96.00 gain 152 224 -93.67 gain 224 152 -95.69 gain 153 154 -64.15 gain 154 153 -66.05 gain 153 155 -73.18 gain 155 153 -73.65 gain 153 156 -80.74 gain 156 153 -80.44 gain 153 157 -83.59 gain 157 153 -85.78 gain 153 158 -85.73 gain 158 153 -87.41 gain 153 159 -78.49 gain 159 153 -82.56 gain 153 160 -89.48 gain 160 153 -90.71 gain 153 161 -98.63 gain 161 153 -102.30 gain 153 162 -90.96 gain 162 153 -94.34 gain 153 163 -95.07 gain 163 153 -100.36 gain 153 164 -96.33 gain 164 153 -100.99 gain 153 165 -74.64 gain 165 153 -76.36 gain 153 166 -78.39 gain 166 153 -79.86 gain 153 167 -68.89 gain 167 153 -71.08 gain 153 168 -70.22 gain 168 153 -71.30 gain 153 169 -69.44 gain 169 153 -71.64 gain 153 170 -75.20 gain 170 153 -76.63 gain 153 171 -80.30 gain 171 153 -82.82 gain 153 172 -80.35 gain 172 153 -81.06 gain 153 173 -81.19 gain 173 153 -86.54 gain 153 174 -86.63 gain 174 153 -88.03 gain 153 175 -86.64 gain 175 153 -89.18 gain 153 176 -93.25 gain 176 153 -94.75 gain 153 177 -91.06 gain 177 153 -95.56 gain 153 178 -92.51 gain 178 153 -90.46 gain 153 179 -92.14 gain 179 153 -89.50 gain 153 180 -83.74 gain 180 153 -90.55 gain 153 181 -78.13 gain 181 153 -78.97 gain 153 182 -72.06 gain 182 153 -73.98 gain 153 183 -76.80 gain 183 153 -79.00 gain 153 184 -74.13 gain 184 153 -79.08 gain 153 185 -77.99 gain 185 153 -86.80 gain 153 186 -85.53 gain 186 153 -89.93 gain 153 187 -75.24 gain 187 153 -77.37 gain 153 188 -83.92 gain 188 153 -88.45 gain 153 189 -86.18 gain 189 153 -85.44 gain 153 190 -91.22 gain 190 153 -94.39 gain 153 191 -89.78 gain 191 153 -91.66 gain 153 192 -96.28 gain 192 153 -96.85 gain 153 193 -90.41 gain 193 153 -89.97 gain 153 194 -101.71 gain 194 153 -102.05 gain 153 195 -80.03 gain 195 153 -78.93 gain 153 196 -75.87 gain 196 153 -79.08 gain 153 197 -76.76 gain 197 153 -75.10 gain 153 198 -76.69 gain 198 153 -79.55 gain 153 199 -80.09 gain 199 153 -83.05 gain 153 200 -80.42 gain 200 153 -84.71 gain 153 201 -80.14 gain 201 153 -84.35 gain 153 202 -82.94 gain 202 153 -86.27 gain 153 203 -90.36 gain 203 153 -92.81 gain 153 204 -89.55 gain 204 153 -88.64 gain 153 205 -93.10 gain 205 153 -95.93 gain 153 206 -89.10 gain 206 153 -93.04 gain 153 207 -98.83 gain 207 153 -102.19 gain 153 208 -100.08 gain 208 153 -106.05 gain 153 209 -103.46 gain 209 153 -108.99 gain 153 210 -89.48 gain 210 153 -95.19 gain 153 211 -78.97 gain 211 153 -79.91 gain 153 212 -78.90 gain 212 153 -82.85 gain 153 213 -85.57 gain 213 153 -88.85 gain 153 214 -87.68 gain 214 153 -96.35 gain 153 215 -82.41 gain 215 153 -86.48 gain 153 216 -87.76 gain 216 153 -95.74 gain 153 217 -92.32 gain 217 153 -100.56 gain 153 218 -85.93 gain 218 153 -86.98 gain 153 219 -95.08 gain 219 153 -96.61 gain 153 220 -97.39 gain 220 153 -95.00 gain 153 221 -94.29 gain 221 153 -97.59 gain 153 222 -93.44 gain 222 153 -92.54 gain 153 223 -94.15 gain 223 153 -96.50 gain 153 224 -87.91 gain 224 153 -90.73 gain 154 155 -74.74 gain 155 154 -73.32 gain 154 156 -67.62 gain 156 154 -65.42 gain 154 157 -77.82 gain 157 154 -78.10 gain 154 158 -86.01 gain 158 154 -85.80 gain 154 159 -82.92 gain 159 154 -85.09 gain 154 160 -87.79 gain 160 154 -87.11 gain 154 161 -84.74 gain 161 154 -86.51 gain 154 162 -84.33 gain 162 154 -85.80 gain 154 163 -98.37 gain 163 154 -101.76 gain 154 164 -96.11 gain 164 154 -98.87 gain 154 165 -86.73 gain 165 154 -86.55 gain 154 166 -81.00 gain 166 154 -80.56 gain 154 167 -78.37 gain 167 154 -78.66 gain 154 168 -63.83 gain 168 154 -63.01 gain 154 169 -65.19 gain 169 154 -65.49 gain 154 170 -68.87 gain 170 154 -68.41 gain 154 171 -78.78 gain 171 154 -79.40 gain 154 172 -82.26 gain 172 154 -81.06 gain 154 173 -79.54 gain 173 154 -82.99 gain 154 174 -82.21 gain 174 154 -81.71 gain 154 175 -87.46 gain 175 154 -88.09 gain 154 176 -97.66 gain 176 154 -97.26 gain 154 177 -98.12 gain 177 154 -100.72 gain 154 178 -97.64 gain 178 154 -93.68 gain 154 179 -90.97 gain 179 154 -86.44 gain 154 180 -78.11 gain 180 154 -83.03 gain 154 181 -80.33 gain 181 154 -79.26 gain 154 182 -71.71 gain 182 154 -71.74 gain 154 183 -77.78 gain 183 154 -78.08 gain 154 184 -69.63 gain 184 154 -72.68 gain 154 185 -79.75 gain 185 154 -86.66 gain 154 186 -79.76 gain 186 154 -82.25 gain 154 187 -84.95 gain 187 154 -85.17 gain 154 188 -91.73 gain 188 154 -94.37 gain 154 189 -90.04 gain 189 154 -87.40 gain 154 190 -90.80 gain 190 154 -92.07 gain 154 191 -85.92 gain 191 154 -85.90 gain 154 192 -98.00 gain 192 154 -96.68 gain 154 193 -92.87 gain 193 154 -90.54 gain 154 194 -97.33 gain 194 154 -95.78 gain 154 195 -88.86 gain 195 154 -85.85 gain 154 196 -80.35 gain 196 154 -81.65 gain 154 197 -86.34 gain 197 154 -82.77 gain 154 198 -85.64 gain 198 154 -86.59 gain 154 199 -81.78 gain 199 154 -82.83 gain 154 200 -83.42 gain 200 154 -85.82 gain 154 201 -81.29 gain 201 154 -83.59 gain 154 202 -97.27 gain 202 154 -98.71 gain 154 203 -85.53 gain 203 154 -86.08 gain 154 204 -89.14 gain 204 154 -86.33 gain 154 205 -91.39 gain 205 154 -92.32 gain 154 206 -92.42 gain 206 154 -94.46 gain 154 207 -92.50 gain 207 154 -93.96 gain 154 208 -92.65 gain 208 154 -96.71 gain 154 209 -96.02 gain 209 154 -99.66 gain 154 210 -85.09 gain 210 154 -88.90 gain 154 211 -86.95 gain 211 154 -85.99 gain 154 212 -88.06 gain 212 154 -90.11 gain 154 213 -81.98 gain 213 154 -83.36 gain 154 214 -83.08 gain 214 154 -89.85 gain 154 215 -87.51 gain 215 154 -89.67 gain 154 216 -79.41 gain 216 154 -85.49 gain 154 217 -81.99 gain 217 154 -88.33 gain 154 218 -87.91 gain 218 154 -87.06 gain 154 219 -89.56 gain 219 154 -89.18 gain 154 220 -86.94 gain 220 154 -82.65 gain 154 221 -88.68 gain 221 154 -90.07 gain 154 222 -86.69 gain 222 154 -83.89 gain 154 223 -95.47 gain 223 154 -95.91 gain 154 224 -95.59 gain 224 154 -96.50 gain 155 156 -61.25 gain 156 155 -60.48 gain 155 157 -68.07 gain 157 155 -69.78 gain 155 158 -70.43 gain 158 155 -71.64 gain 155 159 -85.25 gain 159 155 -88.84 gain 155 160 -76.30 gain 160 155 -77.05 gain 155 161 -81.48 gain 161 155 -84.67 gain 155 162 -88.51 gain 162 155 -91.41 gain 155 163 -89.46 gain 163 155 -94.27 gain 155 164 -94.32 gain 164 155 -98.50 gain 155 165 -87.55 gain 165 155 -88.79 gain 155 166 -85.48 gain 166 155 -86.48 gain 155 167 -76.30 gain 167 155 -78.01 gain 155 168 -72.58 gain 168 155 -73.19 gain 155 169 -73.59 gain 169 155 -75.32 gain 155 170 -67.44 gain 170 155 -68.40 gain 155 171 -70.40 gain 171 155 -72.44 gain 155 172 -71.72 gain 172 155 -71.94 gain 155 173 -77.06 gain 173 155 -81.93 gain 155 174 -84.80 gain 174 155 -85.72 gain 155 175 -82.76 gain 175 155 -84.82 gain 155 176 -87.00 gain 176 155 -88.03 gain 155 177 -93.35 gain 177 155 -97.38 gain 155 178 -86.07 gain 178 155 -83.54 gain 155 179 -82.94 gain 179 155 -79.84 gain 155 180 -78.43 gain 180 155 -84.77 gain 155 181 -81.04 gain 181 155 -81.40 gain 155 182 -81.69 gain 182 155 -83.14 gain 155 183 -76.89 gain 183 155 -78.62 gain 155 184 -74.37 gain 184 155 -78.84 gain 155 185 -81.81 gain 185 155 -90.14 gain 155 186 -78.76 gain 186 155 -82.68 gain 155 187 -71.80 gain 187 155 -73.44 gain 155 188 -88.39 gain 188 155 -92.45 gain 155 189 -86.86 gain 189 155 -85.65 gain 155 190 -87.25 gain 190 155 -89.95 gain 155 191 -85.02 gain 191 155 -86.43 gain 155 192 -95.83 gain 192 155 -95.94 gain 155 193 -83.72 gain 193 155 -82.80 gain 155 194 -93.10 gain 194 155 -92.97 gain 155 195 -81.65 gain 195 155 -80.07 gain 155 196 -84.73 gain 196 155 -87.45 gain 155 197 -83.22 gain 197 155 -81.08 gain 155 198 -77.81 gain 198 155 -80.19 gain 155 199 -70.73 gain 199 155 -73.21 gain 155 200 -79.05 gain 200 155 -82.86 gain 155 201 -74.36 gain 201 155 -78.09 gain 155 202 -83.97 gain 202 155 -86.83 gain 155 203 -84.64 gain 203 155 -86.62 gain 155 204 -80.04 gain 204 155 -78.66 gain 155 205 -85.00 gain 205 155 -87.36 gain 155 206 -90.89 gain 206 155 -94.36 gain 155 207 -91.52 gain 207 155 -94.41 gain 155 208 -86.13 gain 208 155 -91.62 gain 155 209 -91.78 gain 209 155 -96.84 gain 155 210 -90.86 gain 210 155 -96.10 gain 155 211 -80.34 gain 211 155 -80.80 gain 155 212 -82.31 gain 212 155 -85.79 gain 155 213 -84.05 gain 213 155 -86.85 gain 155 214 -85.30 gain 214 155 -93.49 gain 155 215 -90.18 gain 215 155 -93.77 gain 155 216 -76.54 gain 216 155 -84.04 gain 155 217 -88.66 gain 217 155 -96.43 gain 155 218 -80.90 gain 218 155 -81.47 gain 155 219 -83.82 gain 219 155 -84.88 gain 155 220 -97.56 gain 220 155 -94.70 gain 155 221 -94.49 gain 221 155 -97.31 gain 155 222 -91.20 gain 222 155 -89.82 gain 155 223 -82.88 gain 223 155 -84.74 gain 155 224 -93.64 gain 224 155 -95.97 gain 156 157 -62.71 gain 157 156 -65.19 gain 156 158 -71.05 gain 158 156 -73.03 gain 156 159 -74.96 gain 159 156 -79.33 gain 156 160 -81.67 gain 160 156 -83.19 gain 156 161 -89.14 gain 161 156 -93.09 gain 156 162 -89.11 gain 162 156 -92.78 gain 156 163 -89.20 gain 163 156 -94.79 gain 156 164 -94.37 gain 164 156 -99.32 gain 156 165 -75.86 gain 165 156 -77.86 gain 156 166 -80.72 gain 166 156 -82.48 gain 156 167 -83.09 gain 167 156 -85.58 gain 156 168 -74.31 gain 168 156 -75.69 gain 156 169 -66.93 gain 169 156 -69.43 gain 156 170 -71.48 gain 170 156 -73.21 gain 156 171 -61.97 gain 171 156 -64.78 gain 156 172 -68.90 gain 172 156 -69.89 gain 156 173 -66.99 gain 173 156 -72.64 gain 156 174 -80.10 gain 174 156 -81.80 gain 156 175 -75.65 gain 175 156 -78.48 gain 156 176 -82.81 gain 176 156 -84.61 gain 156 177 -84.76 gain 177 156 -89.56 gain 156 178 -86.89 gain 178 156 -85.13 gain 156 179 -90.88 gain 179 156 -88.54 gain 156 180 -87.34 gain 180 156 -94.45 gain 156 181 -82.78 gain 181 156 -83.91 gain 156 182 -89.96 gain 182 156 -92.17 gain 156 183 -76.97 gain 183 156 -79.46 gain 156 184 -84.84 gain 184 156 -90.08 gain 156 185 -77.37 gain 185 156 -86.47 gain 156 186 -70.56 gain 186 156 -75.24 gain 156 187 -79.33 gain 187 156 -81.75 gain 156 188 -74.35 gain 188 156 -79.18 gain 156 189 -79.00 gain 189 156 -78.55 gain 156 190 -82.20 gain 190 156 -85.67 gain 156 191 -84.98 gain 191 156 -87.15 gain 156 192 -83.70 gain 192 156 -84.57 gain 156 193 -83.95 gain 193 156 -83.81 gain 156 194 -87.37 gain 194 156 -88.01 gain 156 195 -89.85 gain 195 156 -89.04 gain 156 196 -89.75 gain 196 156 -93.25 gain 156 197 -89.68 gain 197 156 -88.31 gain 156 198 -80.04 gain 198 156 -83.19 gain 156 199 -79.48 gain 199 156 -82.73 gain 156 200 -77.87 gain 200 156 -82.46 gain 156 201 -77.98 gain 201 156 -82.48 gain 156 202 -81.44 gain 202 156 -85.07 gain 156 203 -82.08 gain 203 156 -84.83 gain 156 204 -79.33 gain 204 156 -78.72 gain 156 205 -83.00 gain 205 156 -86.13 gain 156 206 -84.35 gain 206 156 -88.59 gain 156 207 -87.03 gain 207 156 -90.69 gain 156 208 -90.74 gain 208 156 -96.99 gain 156 209 -93.76 gain 209 156 -99.58 gain 156 210 -92.32 gain 210 156 -98.32 gain 156 211 -88.86 gain 211 156 -90.10 gain 156 212 -86.20 gain 212 156 -90.45 gain 156 213 -85.60 gain 213 156 -89.17 gain 156 214 -80.20 gain 214 156 -89.16 gain 156 215 -81.13 gain 215 156 -85.49 gain 156 216 -83.63 gain 216 156 -91.90 gain 156 217 -76.62 gain 217 156 -85.15 gain 156 218 -83.29 gain 218 156 -84.63 gain 156 219 -85.47 gain 219 156 -87.29 gain 156 220 -81.73 gain 220 156 -79.64 gain 156 221 -86.12 gain 221 156 -89.71 gain 156 222 -93.24 gain 222 156 -92.63 gain 156 223 -84.04 gain 223 156 -86.67 gain 156 224 -96.00 gain 224 156 -99.10 gain 157 158 -60.07 gain 158 157 -59.57 gain 157 159 -73.97 gain 159 157 -75.86 gain 157 160 -83.29 gain 160 157 -82.33 gain 157 161 -82.87 gain 161 157 -84.35 gain 157 162 -83.68 gain 162 157 -84.87 gain 157 163 -87.13 gain 163 157 -90.23 gain 157 164 -90.80 gain 164 157 -93.27 gain 157 165 -84.39 gain 165 157 -83.92 gain 157 166 -91.07 gain 166 157 -90.35 gain 157 167 -84.15 gain 167 157 -84.15 gain 157 168 -92.83 gain 168 157 -91.73 gain 157 169 -70.19 gain 169 157 -70.20 gain 157 170 -69.59 gain 170 157 -68.84 gain 157 171 -62.87 gain 171 157 -63.19 gain 157 172 -63.07 gain 172 157 -61.59 gain 157 173 -68.78 gain 173 157 -71.95 gain 157 174 -75.61 gain 174 157 -74.82 gain 157 175 -76.92 gain 175 157 -77.26 gain 157 176 -86.39 gain 176 157 -85.71 gain 157 177 -88.09 gain 177 157 -90.41 gain 157 178 -87.10 gain 178 157 -82.85 gain 157 179 -91.47 gain 179 157 -86.65 gain 157 180 -95.17 gain 180 157 -99.80 gain 157 181 -91.73 gain 181 157 -90.38 gain 157 182 -87.69 gain 182 157 -87.42 gain 157 183 -85.93 gain 183 157 -85.94 gain 157 184 -87.12 gain 184 157 -89.88 gain 157 185 -76.86 gain 185 157 -83.49 gain 157 186 -76.42 gain 186 157 -78.63 gain 157 187 -72.94 gain 187 157 -72.88 gain 157 188 -72.07 gain 188 157 -74.42 gain 157 189 -76.77 gain 189 157 -73.84 gain 157 190 -83.64 gain 190 157 -84.62 gain 157 191 -88.54 gain 191 157 -88.23 gain 157 192 -87.08 gain 192 157 -85.47 gain 157 193 -88.51 gain 193 157 -85.89 gain 157 194 -91.43 gain 194 157 -89.59 gain 157 195 -93.71 gain 195 157 -90.41 gain 157 196 -92.98 gain 196 157 -94.00 gain 157 197 -91.61 gain 197 157 -87.76 gain 157 198 -89.47 gain 198 157 -90.13 gain 157 199 -77.01 gain 199 157 -77.78 gain 157 200 -78.28 gain 200 157 -80.39 gain 157 201 -82.75 gain 201 157 -84.76 gain 157 202 -69.99 gain 202 157 -71.14 gain 157 203 -76.83 gain 203 157 -77.09 gain 157 204 -77.62 gain 204 157 -74.53 gain 157 205 -80.12 gain 205 157 -80.76 gain 157 206 -86.12 gain 206 157 -87.87 gain 157 207 -94.39 gain 207 157 -95.56 gain 157 208 -86.67 gain 208 157 -90.44 gain 157 209 -96.38 gain 209 157 -99.73 gain 157 210 -92.12 gain 210 157 -95.64 gain 157 211 -82.71 gain 211 157 -81.46 gain 157 212 -93.80 gain 212 157 -95.56 gain 157 213 -88.45 gain 213 157 -89.55 gain 157 214 -89.88 gain 214 157 -96.36 gain 157 215 -86.57 gain 215 157 -88.45 gain 157 216 -85.32 gain 216 157 -91.11 gain 157 217 -84.15 gain 217 157 -90.20 gain 157 218 -89.82 gain 218 157 -88.68 gain 157 219 -87.71 gain 219 157 -87.05 gain 157 220 -83.55 gain 220 157 -78.98 gain 157 221 -84.11 gain 221 157 -85.22 gain 157 222 -91.47 gain 222 157 -88.38 gain 157 223 -90.46 gain 223 157 -90.62 gain 157 224 -93.16 gain 224 157 -93.79 gain 158 159 -68.78 gain 159 158 -71.17 gain 158 160 -78.29 gain 160 158 -77.83 gain 158 161 -73.26 gain 161 158 -75.24 gain 158 162 -83.26 gain 162 158 -84.95 gain 158 163 -86.05 gain 163 158 -89.65 gain 158 164 -80.39 gain 164 158 -83.36 gain 158 165 -91.69 gain 165 158 -91.72 gain 158 166 -88.34 gain 166 158 -88.12 gain 158 167 -86.40 gain 167 158 -86.90 gain 158 168 -89.47 gain 168 158 -88.86 gain 158 169 -77.54 gain 169 158 -78.05 gain 158 170 -76.65 gain 170 158 -76.40 gain 158 171 -77.25 gain 171 158 -78.08 gain 158 172 -62.49 gain 172 158 -61.51 gain 158 173 -71.75 gain 173 158 -75.41 gain 158 174 -66.77 gain 174 158 -66.48 gain 158 175 -76.88 gain 175 158 -77.72 gain 158 176 -82.05 gain 176 158 -81.87 gain 158 177 -73.83 gain 177 158 -76.65 gain 158 178 -87.88 gain 178 158 -84.14 gain 158 179 -90.89 gain 179 158 -86.57 gain 158 180 -93.18 gain 180 158 -98.31 gain 158 181 -91.62 gain 181 158 -90.77 gain 158 182 -91.44 gain 182 158 -91.68 gain 158 183 -89.13 gain 183 158 -89.64 gain 158 184 -83.10 gain 184 158 -86.36 gain 158 185 -81.11 gain 185 158 -88.24 gain 158 186 -75.53 gain 186 158 -78.23 gain 158 187 -71.35 gain 187 158 -71.79 gain 158 188 -71.67 gain 188 158 -74.51 gain 158 189 -85.73 gain 189 158 -83.30 gain 158 190 -80.25 gain 190 158 -81.74 gain 158 191 -81.75 gain 191 158 -81.94 gain 158 192 -84.00 gain 192 158 -82.89 gain 158 193 -82.07 gain 193 158 -79.94 gain 158 194 -89.54 gain 194 158 -88.20 gain 158 195 -93.72 gain 195 158 -90.93 gain 158 196 -97.54 gain 196 158 -99.06 gain 158 197 -94.87 gain 197 158 -91.52 gain 158 198 -87.57 gain 198 158 -88.73 gain 158 199 -77.56 gain 199 158 -78.83 gain 158 200 -84.21 gain 200 158 -86.81 gain 158 201 -83.16 gain 201 158 -85.68 gain 158 202 -86.97 gain 202 158 -88.62 gain 158 203 -87.01 gain 203 158 -87.78 gain 158 204 -84.66 gain 204 158 -82.07 gain 158 205 -80.12 gain 205 158 -81.27 gain 158 206 -82.47 gain 206 158 -84.72 gain 158 207 -84.52 gain 207 158 -86.19 gain 158 208 -91.60 gain 208 158 -95.88 gain 158 209 -94.69 gain 209 158 -98.54 gain 158 210 -95.57 gain 210 158 -99.59 gain 158 211 -92.27 gain 211 158 -91.53 gain 158 212 -89.66 gain 212 158 -91.92 gain 158 213 -93.38 gain 213 158 -94.97 gain 158 214 -81.46 gain 214 158 -88.44 gain 158 215 -80.31 gain 215 158 -82.69 gain 158 216 -85.29 gain 216 158 -91.58 gain 158 217 -82.40 gain 217 158 -88.95 gain 158 218 -89.74 gain 218 158 -89.10 gain 158 219 -79.75 gain 219 158 -79.59 gain 158 220 -78.07 gain 220 158 -74.00 gain 158 221 -89.83 gain 221 158 -91.44 gain 158 222 -82.67 gain 222 158 -80.09 gain 158 223 -94.84 gain 223 158 -95.50 gain 158 224 -93.55 gain 224 158 -94.68 gain 159 160 -64.93 gain 160 159 -62.08 gain 159 161 -79.10 gain 161 159 -78.69 gain 159 162 -86.03 gain 162 159 -85.34 gain 159 163 -87.20 gain 163 159 -88.42 gain 159 164 -79.43 gain 164 159 -80.02 gain 159 165 -95.37 gain 165 159 -93.02 gain 159 166 -92.45 gain 166 159 -89.84 gain 159 167 -86.48 gain 167 159 -84.60 gain 159 168 -95.73 gain 168 159 -92.74 gain 159 169 -94.83 gain 169 159 -92.96 gain 159 170 -86.28 gain 170 159 -83.64 gain 159 171 -85.26 gain 171 159 -83.70 gain 159 172 -77.50 gain 172 159 -74.13 gain 159 173 -75.72 gain 173 159 -77.00 gain 159 174 -62.17 gain 174 159 -59.50 gain 159 175 -72.21 gain 175 159 -70.67 gain 159 176 -74.38 gain 176 159 -71.81 gain 159 177 -84.44 gain 177 159 -84.87 gain 159 178 -87.75 gain 178 159 -81.62 gain 159 179 -86.49 gain 179 159 -79.79 gain 159 180 -94.28 gain 180 159 -97.03 gain 159 181 -90.08 gain 181 159 -86.85 gain 159 182 -92.41 gain 182 159 -90.26 gain 159 183 -91.12 gain 183 159 -89.25 gain 159 184 -84.48 gain 184 159 -85.35 gain 159 185 -78.24 gain 185 159 -82.98 gain 159 186 -84.93 gain 186 159 -85.25 gain 159 187 -77.84 gain 187 159 -75.89 gain 159 188 -71.30 gain 188 159 -71.76 gain 159 189 -75.36 gain 189 159 -70.55 gain 159 190 -73.82 gain 190 159 -72.93 gain 159 191 -73.58 gain 191 159 -71.39 gain 159 192 -85.35 gain 192 159 -81.85 gain 159 193 -92.31 gain 193 159 -87.80 gain 159 194 -86.25 gain 194 159 -82.52 gain 159 195 -94.87 gain 195 159 -89.69 gain 159 196 -94.11 gain 196 159 -93.24 gain 159 197 -97.75 gain 197 159 -92.01 gain 159 198 -98.17 gain 198 159 -96.95 gain 159 199 -86.16 gain 199 159 -85.04 gain 159 200 -94.02 gain 200 159 -94.24 gain 159 201 -93.34 gain 201 159 -93.47 gain 159 202 -85.52 gain 202 159 -84.78 gain 159 203 -82.27 gain 203 159 -80.65 gain 159 204 -78.89 gain 204 159 -73.91 gain 159 205 -86.74 gain 205 159 -85.50 gain 159 206 -84.41 gain 206 159 -84.29 gain 159 207 -92.41 gain 207 159 -91.70 gain 159 208 -92.12 gain 208 159 -94.01 gain 159 209 -85.72 gain 209 159 -87.18 gain 159 210 -97.16 gain 210 159 -98.80 gain 159 211 -97.42 gain 211 159 -94.29 gain 159 212 -95.61 gain 212 159 -95.49 gain 159 213 -99.64 gain 213 159 -98.85 gain 159 214 -91.89 gain 214 159 -96.48 gain 159 215 -88.67 gain 215 159 -88.67 gain 159 216 -95.11 gain 216 159 -99.02 gain 159 217 -95.91 gain 217 159 -100.08 gain 159 218 -89.97 gain 218 159 -86.95 gain 159 219 -89.99 gain 219 159 -87.45 gain 159 220 -76.83 gain 220 159 -70.37 gain 159 221 -102.80 gain 221 159 -102.03 gain 159 222 -84.99 gain 222 159 -80.02 gain 159 223 -90.61 gain 223 159 -88.89 gain 159 224 -89.17 gain 224 159 -87.91 gain 160 161 -61.27 gain 161 160 -63.71 gain 160 162 -73.27 gain 162 160 -75.42 gain 160 163 -81.30 gain 163 160 -85.36 gain 160 164 -80.77 gain 164 160 -84.20 gain 160 165 -99.07 gain 165 160 -99.56 gain 160 166 -94.39 gain 166 160 -94.63 gain 160 167 -99.74 gain 167 160 -100.70 gain 160 168 -82.97 gain 168 160 -82.83 gain 160 169 -87.02 gain 169 160 -88.00 gain 160 170 -81.41 gain 170 160 -81.62 gain 160 171 -89.05 gain 171 160 -90.34 gain 160 172 -77.37 gain 172 160 -76.85 gain 160 173 -74.46 gain 173 160 -78.58 gain 160 174 -65.25 gain 174 160 -65.43 gain 160 175 -61.58 gain 175 160 -62.89 gain 160 176 -70.43 gain 176 160 -70.71 gain 160 177 -75.68 gain 177 160 -78.96 gain 160 178 -79.02 gain 178 160 -75.74 gain 160 179 -85.06 gain 179 160 -81.21 gain 160 180 -101.07 gain 180 160 -106.66 gain 160 181 -89.81 gain 181 160 -89.43 gain 160 182 -94.69 gain 182 160 -95.39 gain 160 183 -90.04 gain 183 160 -91.01 gain 160 184 -93.69 gain 184 160 -97.41 gain 160 185 -81.71 gain 185 160 -89.30 gain 160 186 -83.26 gain 186 160 -86.43 gain 160 187 -76.35 gain 187 160 -77.25 gain 160 188 -74.70 gain 188 160 -78.01 gain 160 189 -83.20 gain 189 160 -81.23 gain 160 190 -68.94 gain 190 160 -70.89 gain 160 191 -82.33 gain 191 160 -82.99 gain 160 192 -79.18 gain 192 160 -78.53 gain 160 193 -83.66 gain 193 160 -82.00 gain 160 194 -88.70 gain 194 160 -87.82 gain 160 195 -90.99 gain 195 160 -88.66 gain 160 196 -93.55 gain 196 160 -95.52 gain 160 197 -93.63 gain 197 160 -90.74 gain 160 198 -89.65 gain 198 160 -91.27 gain 160 199 -91.01 gain 199 160 -92.74 gain 160 200 -87.49 gain 200 160 -90.56 gain 160 201 -90.57 gain 201 160 -93.55 gain 160 202 -81.57 gain 202 160 -83.69 gain 160 203 -82.23 gain 203 160 -83.45 gain 160 204 -75.63 gain 204 160 -73.49 gain 160 205 -76.49 gain 205 160 -78.10 gain 160 206 -87.05 gain 206 160 -89.77 gain 160 207 -86.75 gain 207 160 -88.89 gain 160 208 -88.94 gain 208 160 -93.68 gain 160 209 -80.07 gain 209 160 -84.38 gain 160 210 -100.58 gain 210 160 -105.06 gain 160 211 -100.25 gain 211 160 -99.96 gain 160 212 -96.74 gain 212 160 -99.46 gain 160 213 -83.98 gain 213 160 -86.04 gain 160 214 -93.12 gain 214 160 -100.57 gain 160 215 -89.40 gain 215 160 -92.24 gain 160 216 -78.87 gain 216 160 -85.62 gain 160 217 -90.72 gain 217 160 -97.74 gain 160 218 -75.10 gain 218 160 -74.92 gain 160 219 -83.65 gain 219 160 -83.95 gain 160 220 -85.19 gain 220 160 -81.58 gain 160 221 -88.31 gain 221 160 -90.38 gain 160 222 -85.05 gain 222 160 -82.93 gain 160 223 -81.63 gain 223 160 -82.75 gain 160 224 -79.77 gain 224 160 -81.35 gain 161 162 -60.18 gain 162 161 -59.89 gain 161 163 -67.68 gain 163 161 -69.30 gain 161 164 -84.70 gain 164 161 -85.70 gain 161 165 -101.84 gain 165 161 -99.89 gain 161 166 -95.58 gain 166 161 -93.38 gain 161 167 -91.84 gain 167 161 -90.37 gain 161 168 -90.16 gain 168 161 -87.58 gain 161 169 -86.74 gain 169 161 -85.27 gain 161 170 -87.99 gain 170 161 -85.76 gain 161 171 -88.92 gain 171 161 -87.77 gain 161 172 -88.58 gain 172 161 -85.62 gain 161 173 -84.96 gain 173 161 -86.64 gain 161 174 -77.09 gain 174 161 -74.83 gain 161 175 -70.73 gain 175 161 -69.60 gain 161 176 -60.19 gain 176 161 -58.02 gain 161 177 -68.86 gain 177 161 -69.70 gain 161 178 -83.03 gain 178 161 -77.31 gain 161 179 -81.19 gain 179 161 -74.89 gain 161 180 -103.38 gain 180 161 -106.53 gain 161 181 -91.65 gain 181 161 -88.82 gain 161 182 -97.77 gain 182 161 -96.03 gain 161 183 -99.98 gain 183 161 -98.52 gain 161 184 -97.78 gain 184 161 -99.06 gain 161 185 -99.20 gain 185 161 -104.35 gain 161 186 -82.20 gain 186 161 -82.92 gain 161 187 -85.03 gain 187 161 -83.49 gain 161 188 -88.70 gain 188 161 -89.57 gain 161 189 -73.49 gain 189 161 -69.08 gain 161 190 -78.04 gain 190 161 -77.55 gain 161 191 -79.95 gain 191 161 -78.17 gain 161 192 -70.10 gain 192 161 -67.01 gain 161 193 -83.27 gain 193 161 -79.17 gain 161 194 -85.15 gain 194 161 -81.83 gain 161 195 -100.52 gain 195 161 -95.75 gain 161 196 -95.46 gain 196 161 -95.00 gain 161 197 -94.26 gain 197 161 -88.94 gain 161 198 -92.97 gain 198 161 -92.16 gain 161 199 -93.98 gain 199 161 -93.27 gain 161 200 -89.88 gain 200 161 -90.51 gain 161 201 -88.43 gain 201 161 -88.97 gain 161 202 -87.58 gain 202 161 -87.25 gain 161 203 -87.64 gain 203 161 -86.43 gain 161 204 -88.47 gain 204 161 -83.90 gain 161 205 -80.38 gain 205 161 -79.55 gain 161 206 -86.74 gain 206 161 -87.02 gain 161 207 -81.27 gain 207 161 -80.97 gain 161 208 -85.16 gain 208 161 -87.45 gain 161 209 -84.11 gain 209 161 -85.98 gain 161 210 -107.31 gain 210 161 -109.35 gain 161 211 -99.09 gain 211 161 -96.37 gain 161 212 -99.04 gain 212 161 -99.33 gain 161 213 -96.24 gain 213 161 -95.85 gain 161 214 -93.62 gain 214 161 -98.63 gain 161 215 -93.88 gain 215 161 -94.28 gain 161 216 -89.52 gain 216 161 -93.83 gain 161 217 -87.24 gain 217 161 -91.82 gain 161 218 -87.19 gain 218 161 -84.57 gain 161 219 -86.60 gain 219 161 -84.46 gain 161 220 -86.25 gain 220 161 -80.20 gain 161 221 -88.72 gain 221 161 -88.35 gain 161 222 -79.63 gain 222 161 -75.07 gain 161 223 -86.64 gain 223 161 -85.32 gain 161 224 -88.27 gain 224 161 -87.41 gain 162 163 -66.57 gain 163 162 -68.49 gain 162 164 -81.98 gain 164 162 -83.26 gain 162 165 -102.30 gain 165 162 -100.64 gain 162 166 -93.78 gain 166 162 -91.88 gain 162 167 -100.91 gain 167 162 -99.73 gain 162 168 -99.51 gain 168 162 -97.22 gain 162 169 -96.09 gain 169 162 -94.91 gain 162 170 -97.08 gain 170 162 -95.14 gain 162 171 -89.78 gain 171 162 -88.92 gain 162 172 -94.55 gain 172 162 -91.88 gain 162 173 -84.77 gain 173 162 -86.74 gain 162 174 -79.79 gain 174 162 -77.81 gain 162 175 -70.94 gain 175 162 -70.09 gain 162 176 -73.84 gain 176 162 -71.97 gain 162 177 -62.39 gain 177 162 -63.52 gain 162 178 -70.67 gain 178 162 -65.24 gain 162 179 -76.46 gain 179 162 -70.45 gain 162 180 -93.43 gain 180 162 -96.87 gain 162 181 -96.55 gain 181 162 -94.02 gain 162 182 -89.43 gain 182 162 -87.98 gain 162 183 -94.18 gain 183 162 -93.01 gain 162 184 -95.53 gain 184 162 -97.10 gain 162 185 -89.86 gain 185 162 -95.30 gain 162 186 -91.67 gain 186 162 -92.69 gain 162 187 -97.17 gain 187 162 -95.91 gain 162 188 -84.81 gain 188 162 -85.97 gain 162 189 -83.59 gain 189 162 -79.47 gain 162 190 -77.91 gain 190 162 -77.71 gain 162 191 -83.92 gain 191 162 -82.42 gain 162 192 -73.14 gain 192 162 -70.35 gain 162 193 -80.68 gain 193 162 -76.87 gain 162 194 -79.39 gain 194 162 -76.36 gain 162 195 -99.05 gain 195 162 -94.57 gain 162 196 -105.27 gain 196 162 -105.10 gain 162 197 -101.21 gain 197 162 -96.17 gain 162 198 -101.60 gain 198 162 -101.08 gain 162 199 -88.78 gain 199 162 -88.36 gain 162 200 -94.50 gain 200 162 -95.42 gain 162 201 -97.64 gain 201 162 -98.47 gain 162 202 -95.16 gain 202 162 -95.13 gain 162 203 -90.49 gain 203 162 -89.57 gain 162 204 -83.73 gain 204 162 -79.44 gain 162 205 -79.61 gain 205 162 -79.07 gain 162 206 -75.83 gain 206 162 -76.40 gain 162 207 -78.18 gain 207 162 -78.17 gain 162 208 -80.99 gain 208 162 -83.57 gain 162 209 -82.58 gain 209 162 -84.74 gain 162 210 -100.77 gain 210 162 -103.10 gain 162 211 -103.39 gain 211 162 -100.96 gain 162 212 -103.50 gain 212 162 -104.08 gain 162 213 -93.18 gain 213 162 -93.08 gain 162 214 -93.31 gain 214 162 -98.60 gain 162 215 -104.25 gain 215 162 -104.94 gain 162 216 -95.79 gain 216 162 -100.40 gain 162 217 -95.22 gain 217 162 -100.09 gain 162 218 -86.95 gain 218 162 -84.63 gain 162 219 -84.90 gain 219 162 -83.05 gain 162 220 -91.70 gain 220 162 -85.94 gain 162 221 -85.15 gain 221 162 -85.07 gain 162 222 -80.47 gain 222 162 -76.19 gain 162 223 -82.04 gain 223 162 -81.01 gain 162 224 -82.23 gain 224 162 -81.66 gain 163 164 -66.09 gain 164 163 -65.45 gain 163 165 -105.91 gain 165 163 -102.33 gain 163 166 -101.76 gain 166 163 -97.94 gain 163 167 -92.92 gain 167 163 -89.83 gain 163 168 -101.27 gain 168 163 -97.07 gain 163 169 -88.01 gain 169 163 -84.92 gain 163 170 -101.28 gain 170 163 -97.42 gain 163 171 -94.22 gain 171 163 -91.45 gain 163 172 -96.21 gain 172 163 -91.62 gain 163 173 -92.20 gain 173 163 -92.26 gain 163 174 -83.50 gain 174 163 -79.61 gain 163 175 -85.62 gain 175 163 -82.86 gain 163 176 -82.79 gain 176 163 -79.00 gain 163 177 -69.93 gain 177 163 -69.15 gain 163 178 -70.10 gain 178 163 -62.76 gain 163 179 -70.66 gain 179 163 -62.74 gain 163 180 -104.89 gain 180 163 -106.42 gain 163 181 -105.09 gain 181 163 -100.64 gain 163 182 -96.02 gain 182 163 -92.66 gain 163 183 -95.79 gain 183 163 -92.70 gain 163 184 -91.69 gain 184 163 -91.35 gain 163 185 -93.88 gain 185 163 -97.40 gain 163 186 -88.63 gain 186 163 -87.74 gain 163 187 -91.99 gain 187 163 -88.83 gain 163 188 -96.21 gain 188 163 -95.46 gain 163 189 -86.59 gain 189 163 -80.56 gain 163 190 -86.58 gain 190 163 -84.47 gain 163 191 -87.62 gain 191 163 -84.21 gain 163 192 -77.29 gain 192 163 -72.58 gain 163 193 -78.44 gain 193 163 -72.71 gain 163 194 -73.66 gain 194 163 -68.72 gain 163 195 -96.10 gain 195 163 -89.71 gain 163 196 -100.63 gain 196 163 -98.55 gain 163 197 -89.30 gain 197 163 -82.35 gain 163 198 -102.54 gain 198 163 -100.11 gain 163 199 -94.48 gain 199 163 -92.15 gain 163 200 -99.71 gain 200 163 -98.72 gain 163 201 -97.94 gain 201 163 -96.86 gain 163 202 -91.89 gain 202 163 -89.93 gain 163 203 -87.56 gain 203 163 -84.72 gain 163 204 -93.29 gain 204 163 -87.09 gain 163 205 -86.13 gain 205 163 -83.68 gain 163 206 -80.77 gain 206 163 -79.42 gain 163 207 -85.20 gain 207 163 -83.27 gain 163 208 -79.31 gain 208 163 -79.98 gain 163 209 -82.37 gain 209 163 -82.62 gain 163 210 -105.98 gain 210 163 -106.40 gain 163 211 -110.31 gain 211 163 -105.96 gain 163 212 -99.71 gain 212 163 -98.38 gain 163 213 -94.34 gain 213 163 -92.34 gain 163 214 -89.58 gain 214 163 -92.96 gain 163 215 -91.64 gain 215 163 -90.42 gain 163 216 -93.15 gain 216 163 -95.84 gain 163 217 -91.58 gain 217 163 -94.53 gain 163 218 -89.70 gain 218 163 -85.46 gain 163 219 -96.34 gain 219 163 -92.58 gain 163 220 -84.66 gain 220 163 -76.99 gain 163 221 -84.88 gain 221 163 -82.88 gain 163 222 -85.93 gain 222 163 -79.74 gain 163 223 -86.77 gain 223 163 -83.82 gain 163 224 -76.69 gain 224 163 -74.21 gain 164 165 -102.70 gain 165 164 -99.76 gain 164 166 -98.49 gain 166 164 -95.30 gain 164 167 -96.34 gain 167 164 -93.87 gain 164 168 -101.11 gain 168 164 -97.54 gain 164 169 -107.66 gain 169 164 -105.20 gain 164 170 -96.27 gain 170 164 -93.04 gain 164 171 -87.67 gain 171 164 -85.52 gain 164 172 -89.74 gain 172 164 -85.78 gain 164 173 -94.07 gain 173 164 -94.76 gain 164 174 -85.47 gain 174 164 -82.21 gain 164 175 -85.53 gain 175 164 -83.41 gain 164 176 -78.50 gain 176 164 -75.35 gain 164 177 -74.04 gain 177 164 -73.89 gain 164 178 -71.04 gain 178 164 -64.33 gain 164 179 -75.61 gain 179 164 -68.32 gain 164 180 -99.25 gain 180 164 -101.41 gain 164 181 -101.50 gain 181 164 -97.68 gain 164 182 -100.13 gain 182 164 -97.39 gain 164 183 -97.01 gain 183 164 -94.55 gain 164 184 -91.49 gain 184 164 -91.78 gain 164 185 -100.72 gain 185 164 -104.88 gain 164 186 -95.87 gain 186 164 -95.61 gain 164 187 -90.98 gain 187 164 -88.44 gain 164 188 -95.31 gain 188 164 -95.18 gain 164 189 -91.83 gain 189 164 -86.43 gain 164 190 -91.04 gain 190 164 -89.55 gain 164 191 -88.89 gain 191 164 -86.12 gain 164 192 -88.56 gain 192 164 -84.48 gain 164 193 -86.36 gain 193 164 -81.26 gain 164 194 -81.07 gain 194 164 -76.76 gain 164 195 -95.47 gain 195 164 -89.71 gain 164 196 -101.34 gain 196 164 -99.88 gain 164 197 -102.52 gain 197 164 -96.20 gain 164 198 -106.01 gain 198 164 -104.20 gain 164 199 -101.78 gain 199 164 -100.08 gain 164 200 -97.59 gain 200 164 -97.23 gain 164 201 -99.78 gain 201 164 -99.33 gain 164 202 -90.55 gain 202 164 -89.22 gain 164 203 -98.02 gain 203 164 -95.81 gain 164 204 -93.12 gain 204 164 -87.55 gain 164 205 -92.23 gain 205 164 -90.41 gain 164 206 -87.04 gain 206 164 -86.33 gain 164 207 -84.50 gain 207 164 -83.20 gain 164 208 -85.11 gain 208 164 -86.42 gain 164 209 -78.72 gain 209 164 -79.60 gain 164 210 -104.15 gain 210 164 -105.20 gain 164 211 -104.82 gain 211 164 -101.11 gain 164 212 -105.37 gain 212 164 -104.67 gain 164 213 -97.48 gain 213 164 -96.11 gain 164 214 -98.16 gain 214 164 -102.17 gain 164 215 -99.67 gain 215 164 -99.09 gain 164 216 -97.86 gain 216 164 -101.18 gain 164 217 -99.56 gain 217 164 -103.15 gain 164 218 -96.39 gain 218 164 -92.78 gain 164 219 -99.76 gain 219 164 -96.63 gain 164 220 -84.61 gain 220 164 -77.57 gain 164 221 -92.29 gain 221 164 -90.93 gain 164 222 -88.74 gain 222 164 -83.18 gain 164 223 -91.53 gain 223 164 -89.21 gain 164 224 -81.17 gain 224 164 -79.33 gain 165 166 -60.83 gain 166 165 -60.58 gain 165 167 -68.88 gain 167 165 -69.35 gain 165 168 -77.63 gain 168 165 -77.00 gain 165 169 -84.87 gain 169 165 -85.35 gain 165 170 -86.59 gain 170 165 -86.31 gain 165 171 -86.79 gain 171 165 -87.59 gain 165 172 -89.41 gain 172 165 -88.40 gain 165 173 -93.45 gain 173 165 -97.09 gain 165 174 -90.89 gain 174 165 -90.57 gain 165 175 -86.52 gain 175 165 -87.33 gain 165 176 -99.21 gain 176 165 -99.00 gain 165 177 -95.95 gain 177 165 -98.74 gain 165 178 -101.25 gain 178 165 -97.48 gain 165 179 -106.99 gain 179 165 -102.64 gain 165 180 -65.88 gain 180 165 -70.98 gain 165 181 -68.43 gain 181 165 -67.56 gain 165 182 -74.19 gain 182 165 -74.40 gain 165 183 -73.97 gain 183 165 -74.45 gain 165 184 -81.17 gain 184 165 -84.41 gain 165 185 -86.47 gain 185 165 -93.57 gain 165 186 -90.14 gain 186 165 -92.82 gain 165 187 -87.83 gain 187 165 -88.24 gain 165 188 -98.07 gain 188 165 -100.88 gain 165 189 -91.48 gain 189 165 -89.02 gain 165 190 -97.57 gain 190 165 -99.03 gain 165 191 -96.92 gain 191 165 -97.08 gain 165 192 -93.28 gain 192 165 -92.15 gain 165 193 -103.04 gain 193 165 -100.89 gain 165 194 -99.06 gain 194 165 -97.69 gain 165 195 -73.38 gain 195 165 -70.56 gain 165 196 -73.41 gain 196 165 -74.90 gain 165 197 -67.63 gain 197 165 -64.25 gain 165 198 -79.19 gain 198 165 -80.33 gain 165 199 -87.59 gain 199 165 -88.84 gain 165 200 -88.14 gain 200 165 -90.72 gain 165 201 -95.43 gain 201 165 -97.91 gain 165 202 -95.08 gain 202 165 -96.70 gain 165 203 -90.29 gain 203 165 -91.02 gain 165 204 -93.29 gain 204 165 -90.67 gain 165 205 -89.51 gain 205 165 -90.63 gain 165 206 -100.74 gain 206 165 -102.96 gain 165 207 -96.56 gain 207 165 -98.20 gain 165 208 -104.60 gain 208 165 -108.85 gain 165 209 -94.72 gain 209 165 -98.54 gain 165 210 -82.55 gain 210 165 -86.54 gain 165 211 -81.28 gain 211 165 -80.50 gain 165 212 -80.92 gain 212 165 -83.16 gain 165 213 -80.06 gain 213 165 -81.62 gain 165 214 -81.30 gain 214 165 -88.25 gain 165 215 -87.38 gain 215 165 -89.73 gain 165 216 -96.40 gain 216 165 -102.66 gain 165 217 -89.45 gain 217 165 -95.98 gain 165 218 -95.07 gain 218 165 -94.40 gain 165 219 -93.58 gain 219 165 -93.39 gain 165 220 -99.15 gain 220 165 -95.05 gain 165 221 -93.46 gain 221 165 -95.04 gain 165 222 -92.93 gain 222 165 -90.32 gain 165 223 -97.28 gain 223 165 -97.91 gain 165 224 -98.65 gain 224 165 -99.75 gain 166 167 -65.65 gain 167 166 -66.37 gain 166 168 -71.69 gain 168 166 -71.30 gain 166 169 -82.56 gain 169 166 -83.29 gain 166 170 -87.97 gain 170 166 -87.94 gain 166 171 -86.82 gain 171 166 -87.86 gain 166 172 -82.03 gain 172 166 -81.26 gain 166 173 -93.94 gain 173 166 -97.83 gain 166 174 -92.96 gain 174 166 -92.89 gain 166 175 -97.68 gain 175 166 -98.75 gain 166 176 -89.88 gain 176 166 -89.92 gain 166 177 -93.98 gain 177 166 -97.01 gain 166 178 -98.06 gain 178 166 -94.53 gain 166 179 -100.68 gain 179 166 -96.58 gain 166 180 -71.55 gain 180 166 -76.90 gain 166 181 -66.92 gain 181 166 -66.29 gain 166 182 -76.60 gain 182 166 -77.06 gain 166 183 -78.68 gain 183 166 -79.41 gain 166 184 -71.00 gain 184 166 -74.48 gain 166 185 -79.68 gain 185 166 -87.02 gain 166 186 -91.18 gain 186 166 -94.11 gain 166 187 -81.21 gain 187 166 -81.86 gain 166 188 -84.86 gain 188 166 -87.93 gain 166 189 -90.32 gain 189 166 -88.11 gain 166 190 -98.63 gain 190 166 -100.33 gain 166 191 -94.63 gain 191 166 -95.05 gain 166 192 -90.78 gain 192 166 -89.89 gain 166 193 -95.57 gain 193 166 -93.67 gain 166 194 -98.35 gain 194 166 -97.23 gain 166 195 -74.57 gain 195 166 -71.99 gain 166 196 -79.18 gain 196 166 -80.92 gain 166 197 -81.22 gain 197 166 -78.09 gain 166 198 -74.66 gain 198 166 -76.04 gain 166 199 -73.88 gain 199 166 -75.37 gain 166 200 -88.09 gain 200 166 -90.91 gain 166 201 -91.02 gain 201 166 -93.75 gain 166 202 -93.47 gain 202 166 -95.34 gain 166 203 -85.85 gain 203 166 -86.84 gain 166 204 -95.49 gain 204 166 -93.12 gain 166 205 -100.34 gain 205 166 -101.71 gain 166 206 -90.30 gain 206 166 -92.77 gain 166 207 -89.85 gain 207 166 -91.74 gain 166 208 -96.32 gain 208 166 -100.81 gain 166 209 -101.88 gain 209 166 -105.94 gain 166 210 -73.69 gain 210 166 -77.93 gain 166 211 -80.29 gain 211 166 -79.76 gain 166 212 -81.22 gain 212 166 -83.71 gain 166 213 -77.30 gain 213 166 -79.11 gain 166 214 -82.44 gain 214 166 -89.64 gain 166 215 -93.93 gain 215 166 -96.53 gain 166 216 -93.13 gain 216 166 -99.64 gain 166 217 -88.58 gain 217 166 -95.35 gain 166 218 -89.54 gain 218 166 -89.12 gain 166 219 -83.21 gain 219 166 -83.27 gain 166 220 -91.43 gain 220 166 -87.58 gain 166 221 -91.89 gain 221 166 -93.71 gain 166 222 -97.58 gain 222 166 -95.21 gain 166 223 -101.40 gain 223 166 -102.27 gain 166 224 -95.63 gain 224 166 -96.97 gain 167 168 -66.16 gain 168 167 -65.06 gain 167 169 -74.27 gain 169 167 -74.28 gain 167 170 -77.21 gain 170 167 -76.46 gain 167 171 -82.56 gain 171 167 -82.88 gain 167 172 -87.05 gain 172 167 -85.56 gain 167 173 -89.43 gain 173 167 -92.59 gain 167 174 -90.40 gain 174 167 -89.60 gain 167 175 -97.25 gain 175 167 -97.59 gain 167 176 -92.83 gain 176 167 -92.14 gain 167 177 -88.06 gain 177 167 -90.37 gain 167 178 -103.38 gain 178 167 -99.13 gain 167 179 -98.50 gain 179 167 -93.68 gain 167 180 -78.16 gain 180 167 -82.78 gain 167 181 -68.30 gain 181 167 -66.94 gain 167 182 -65.35 gain 182 167 -65.09 gain 167 183 -71.98 gain 183 167 -71.99 gain 167 184 -76.44 gain 184 167 -79.20 gain 167 185 -79.59 gain 185 167 -86.21 gain 167 186 -86.00 gain 186 167 -88.20 gain 167 187 -82.71 gain 187 167 -82.64 gain 167 188 -87.65 gain 188 167 -89.99 gain 167 189 -89.31 gain 189 167 -86.38 gain 167 190 -86.11 gain 190 167 -87.10 gain 167 191 -86.84 gain 191 167 -86.53 gain 167 192 -96.40 gain 192 167 -94.79 gain 167 193 -93.07 gain 193 167 -90.44 gain 167 194 -98.59 gain 194 167 -96.74 gain 167 195 -73.79 gain 195 167 -70.49 gain 167 196 -73.98 gain 196 167 -75.00 gain 167 197 -70.56 gain 197 167 -66.70 gain 167 198 -79.78 gain 198 167 -80.44 gain 167 199 -81.17 gain 199 167 -81.94 gain 167 200 -85.32 gain 200 167 -87.43 gain 167 201 -86.58 gain 201 167 -88.59 gain 167 202 -94.41 gain 202 167 -95.55 gain 167 203 -94.21 gain 203 167 -94.47 gain 167 204 -96.95 gain 204 167 -93.85 gain 167 205 -93.77 gain 205 167 -94.42 gain 167 206 -87.97 gain 206 167 -89.72 gain 167 207 -98.00 gain 207 167 -99.17 gain 167 208 -91.66 gain 208 167 -95.44 gain 167 209 -99.95 gain 209 167 -103.30 gain 167 210 -83.48 gain 210 167 -87.00 gain 167 211 -80.95 gain 211 167 -79.70 gain 167 212 -84.35 gain 212 167 -86.11 gain 167 213 -80.71 gain 213 167 -81.80 gain 167 214 -82.13 gain 214 167 -88.61 gain 167 215 -81.84 gain 215 167 -83.71 gain 167 216 -82.75 gain 216 167 -88.54 gain 167 217 -82.82 gain 217 167 -88.88 gain 167 218 -94.24 gain 218 167 -93.10 gain 167 219 -87.72 gain 219 167 -87.06 gain 167 220 -99.31 gain 220 167 -94.73 gain 167 221 -95.85 gain 221 167 -96.95 gain 167 222 -99.78 gain 222 167 -96.69 gain 167 223 -93.90 gain 223 167 -94.05 gain 167 224 -97.66 gain 224 167 -98.28 gain 168 169 -63.95 gain 169 168 -65.06 gain 168 170 -67.73 gain 170 168 -68.08 gain 168 171 -81.07 gain 171 168 -82.49 gain 168 172 -80.31 gain 172 168 -79.93 gain 168 173 -88.85 gain 173 168 -93.12 gain 168 174 -84.39 gain 174 168 -84.71 gain 168 175 -89.23 gain 175 168 -90.68 gain 168 176 -91.19 gain 176 168 -91.60 gain 168 177 -86.88 gain 177 168 -90.30 gain 168 178 -101.94 gain 178 168 -98.80 gain 168 179 -91.40 gain 179 168 -87.69 gain 168 180 -73.35 gain 180 168 -79.08 gain 168 181 -78.49 gain 181 168 -78.24 gain 168 182 -67.74 gain 182 168 -68.57 gain 168 183 -63.41 gain 183 168 -64.52 gain 168 184 -75.69 gain 184 168 -79.55 gain 168 185 -74.86 gain 185 168 -82.59 gain 168 186 -77.80 gain 186 168 -81.11 gain 168 187 -85.06 gain 187 168 -86.10 gain 168 188 -84.11 gain 188 168 -87.55 gain 168 189 -81.88 gain 189 168 -80.05 gain 168 190 -88.72 gain 190 168 -90.81 gain 168 191 -96.89 gain 191 168 -97.69 gain 168 192 -90.70 gain 192 168 -90.19 gain 168 193 -101.24 gain 193 168 -99.72 gain 168 194 -91.28 gain 194 168 -90.54 gain 168 195 -78.72 gain 195 168 -76.53 gain 168 196 -84.87 gain 196 168 -86.98 gain 168 197 -74.06 gain 197 168 -71.31 gain 168 198 -77.39 gain 198 168 -79.16 gain 168 199 -74.46 gain 199 168 -76.33 gain 168 200 -80.97 gain 200 168 -84.17 gain 168 201 -87.41 gain 201 168 -90.53 gain 168 202 -82.99 gain 202 168 -85.24 gain 168 203 -83.83 gain 203 168 -85.19 gain 168 204 -86.21 gain 204 168 -84.22 gain 168 205 -85.76 gain 205 168 -87.51 gain 168 206 -85.73 gain 206 168 -88.59 gain 168 207 -90.18 gain 207 168 -92.46 gain 168 208 -102.02 gain 208 168 -106.89 gain 168 209 -95.25 gain 209 168 -99.69 gain 168 210 -85.33 gain 210 168 -89.96 gain 168 211 -81.80 gain 211 168 -81.65 gain 168 212 -85.62 gain 212 168 -88.49 gain 168 213 -79.58 gain 213 168 -81.78 gain 168 214 -79.61 gain 214 168 -87.19 gain 168 215 -81.43 gain 215 168 -84.42 gain 168 216 -81.95 gain 216 168 -88.84 gain 168 217 -82.64 gain 217 168 -89.80 gain 168 218 -88.77 gain 218 168 -88.73 gain 168 219 -88.79 gain 219 168 -89.24 gain 168 220 -89.58 gain 220 168 -86.11 gain 168 221 -92.80 gain 221 168 -95.01 gain 168 222 -101.45 gain 222 168 -99.47 gain 168 223 -99.58 gain 223 168 -100.84 gain 168 224 -95.32 gain 224 168 -97.05 gain 169 170 -66.94 gain 170 169 -66.17 gain 169 171 -70.18 gain 171 169 -70.50 gain 169 172 -79.77 gain 172 169 -78.28 gain 169 173 -82.06 gain 173 169 -85.21 gain 169 174 -89.03 gain 174 169 -88.22 gain 169 175 -88.00 gain 175 169 -88.33 gain 169 176 -85.94 gain 176 169 -85.24 gain 169 177 -90.62 gain 177 169 -92.92 gain 169 178 -96.33 gain 178 169 -92.08 gain 169 179 -83.02 gain 179 169 -78.19 gain 169 180 -86.49 gain 180 169 -91.11 gain 169 181 -84.90 gain 181 169 -83.54 gain 169 182 -74.35 gain 182 169 -74.07 gain 169 183 -71.21 gain 183 169 -71.20 gain 169 184 -76.43 gain 184 169 -79.17 gain 169 185 -69.69 gain 185 169 -76.30 gain 169 186 -79.73 gain 186 169 -81.92 gain 169 187 -80.76 gain 187 169 -80.69 gain 169 188 -80.42 gain 188 169 -82.75 gain 169 189 -88.68 gain 189 169 -85.74 gain 169 190 -93.57 gain 190 169 -94.55 gain 169 191 -99.73 gain 191 169 -99.41 gain 169 192 -88.52 gain 192 169 -86.90 gain 169 193 -90.64 gain 193 169 -88.00 gain 169 194 -97.18 gain 194 169 -95.32 gain 169 195 -86.60 gain 195 169 -83.29 gain 169 196 -81.36 gain 196 169 -82.36 gain 169 197 -80.97 gain 197 169 -77.11 gain 169 198 -81.99 gain 198 169 -82.64 gain 169 199 -78.67 gain 199 169 -79.43 gain 169 200 -80.41 gain 200 169 -82.50 gain 169 201 -81.03 gain 201 169 -83.03 gain 169 202 -80.86 gain 202 169 -82.00 gain 169 203 -88.82 gain 203 169 -89.07 gain 169 204 -88.76 gain 204 169 -85.65 gain 169 205 -86.85 gain 205 169 -87.48 gain 169 206 -84.66 gain 206 169 -86.40 gain 169 207 -91.68 gain 207 169 -92.84 gain 169 208 -97.16 gain 208 169 -100.93 gain 169 209 -92.19 gain 209 169 -95.52 gain 169 210 -88.79 gain 210 169 -92.29 gain 169 211 -81.19 gain 211 169 -79.94 gain 169 212 -82.70 gain 212 169 -84.45 gain 169 213 -78.14 gain 213 169 -79.22 gain 169 214 -76.31 gain 214 169 -82.78 gain 169 215 -81.63 gain 215 169 -83.50 gain 169 216 -84.76 gain 216 169 -90.54 gain 169 217 -88.64 gain 217 169 -94.68 gain 169 218 -92.77 gain 218 169 -91.61 gain 169 219 -88.96 gain 219 169 -88.29 gain 169 220 -91.41 gain 220 169 -86.82 gain 169 221 -93.34 gain 221 169 -94.43 gain 169 222 -97.12 gain 222 169 -94.02 gain 169 223 -98.49 gain 223 169 -98.63 gain 169 224 -93.99 gain 224 169 -94.60 gain 170 171 -73.62 gain 171 170 -74.70 gain 170 172 -74.12 gain 172 170 -73.38 gain 170 173 -72.28 gain 173 170 -76.19 gain 170 174 -85.28 gain 174 170 -85.24 gain 170 175 -86.09 gain 175 170 -87.19 gain 170 176 -89.22 gain 176 170 -89.28 gain 170 177 -88.87 gain 177 170 -91.94 gain 170 178 -97.68 gain 178 170 -94.19 gain 170 179 -97.85 gain 179 170 -93.78 gain 170 180 -86.40 gain 180 170 -91.79 gain 170 181 -76.87 gain 181 170 -76.28 gain 170 182 -79.98 gain 182 170 -80.47 gain 170 183 -73.17 gain 183 170 -73.93 gain 170 184 -67.90 gain 184 170 -71.41 gain 170 185 -62.93 gain 185 170 -70.31 gain 170 186 -71.07 gain 186 170 -74.03 gain 170 187 -77.24 gain 187 170 -77.93 gain 170 188 -75.26 gain 188 170 -78.36 gain 170 189 -83.35 gain 189 170 -81.17 gain 170 190 -84.49 gain 190 170 -86.23 gain 170 191 -82.23 gain 191 170 -82.68 gain 170 192 -94.29 gain 192 170 -93.44 gain 170 193 -90.82 gain 193 170 -88.94 gain 170 194 -92.25 gain 194 170 -91.16 gain 170 195 -86.30 gain 195 170 -83.76 gain 170 196 -84.08 gain 196 170 -85.85 gain 170 197 -80.22 gain 197 170 -77.12 gain 170 198 -75.07 gain 198 170 -76.48 gain 170 199 -84.42 gain 199 170 -85.94 gain 170 200 -74.65 gain 200 170 -77.51 gain 170 201 -79.37 gain 201 170 -82.13 gain 170 202 -81.13 gain 202 170 -83.04 gain 170 203 -77.02 gain 203 170 -78.04 gain 170 204 -85.50 gain 204 170 -83.16 gain 170 205 -89.99 gain 205 170 -91.39 gain 170 206 -87.34 gain 206 170 -89.85 gain 170 207 -91.44 gain 207 170 -93.36 gain 170 208 -82.59 gain 208 170 -87.11 gain 170 209 -94.02 gain 209 170 -98.12 gain 170 210 -88.02 gain 210 170 -92.29 gain 170 211 -86.94 gain 211 170 -86.45 gain 170 212 -88.66 gain 212 170 -91.18 gain 170 213 -82.15 gain 213 170 -83.99 gain 170 214 -73.40 gain 214 170 -80.64 gain 170 215 -77.62 gain 215 170 -80.25 gain 170 216 -74.25 gain 216 170 -80.80 gain 170 217 -80.35 gain 217 170 -87.16 gain 170 218 -84.79 gain 218 170 -84.41 gain 170 219 -100.05 gain 219 170 -100.15 gain 170 220 -82.22 gain 220 170 -78.40 gain 170 221 -93.23 gain 221 170 -95.10 gain 170 222 -95.89 gain 222 170 -93.56 gain 170 223 -90.02 gain 223 170 -90.93 gain 170 224 -93.60 gain 224 170 -94.98 gain 171 172 -61.32 gain 172 171 -59.50 gain 171 173 -77.33 gain 173 171 -80.17 gain 171 174 -74.97 gain 174 171 -73.85 gain 171 175 -79.71 gain 175 171 -79.73 gain 171 176 -86.75 gain 176 171 -85.74 gain 171 177 -95.26 gain 177 171 -97.25 gain 171 178 -93.82 gain 178 171 -89.26 gain 171 179 -89.16 gain 179 171 -84.02 gain 171 180 -86.49 gain 180 171 -90.79 gain 171 181 -90.11 gain 181 171 -88.44 gain 171 182 -78.24 gain 182 171 -77.65 gain 171 183 -73.91 gain 183 171 -73.59 gain 171 184 -70.91 gain 184 171 -73.34 gain 171 185 -71.08 gain 185 171 -77.38 gain 171 186 -71.30 gain 186 171 -73.18 gain 171 187 -80.85 gain 187 171 -80.46 gain 171 188 -71.75 gain 188 171 -73.77 gain 171 189 -79.37 gain 189 171 -76.11 gain 171 190 -85.34 gain 190 171 -86.00 gain 171 191 -89.95 gain 191 171 -89.32 gain 171 192 -84.44 gain 192 171 -82.50 gain 171 193 -99.42 gain 193 171 -96.47 gain 171 194 -94.14 gain 194 171 -91.97 gain 171 195 -91.43 gain 195 171 -87.81 gain 171 196 -95.13 gain 196 171 -95.82 gain 171 197 -88.34 gain 197 171 -84.17 gain 171 198 -78.69 gain 198 171 -79.02 gain 171 199 -70.37 gain 199 171 -70.81 gain 171 200 -74.60 gain 200 171 -76.38 gain 171 201 -78.37 gain 201 171 -80.06 gain 171 202 -83.41 gain 202 171 -84.23 gain 171 203 -81.43 gain 203 171 -81.36 gain 171 204 -82.93 gain 204 171 -79.50 gain 171 205 -85.26 gain 205 171 -85.58 gain 171 206 -94.73 gain 206 171 -96.15 gain 171 207 -88.74 gain 207 171 -89.58 gain 171 208 -100.13 gain 208 171 -103.58 gain 171 209 -89.06 gain 209 171 -92.08 gain 171 210 -90.00 gain 210 171 -93.20 gain 171 211 -88.09 gain 211 171 -86.51 gain 171 212 -81.22 gain 212 171 -82.66 gain 171 213 -77.69 gain 213 171 -78.45 gain 171 214 -76.17 gain 214 171 -82.33 gain 171 215 -80.75 gain 215 171 -82.30 gain 171 216 -76.34 gain 216 171 -81.81 gain 171 217 -83.67 gain 217 171 -89.39 gain 171 218 -84.96 gain 218 171 -83.50 gain 171 219 -85.80 gain 219 171 -84.81 gain 171 220 -87.48 gain 220 171 -82.58 gain 171 221 -86.37 gain 221 171 -87.15 gain 171 222 -98.34 gain 222 171 -94.93 gain 171 223 -82.47 gain 223 171 -82.30 gain 171 224 -98.49 gain 224 171 -98.78 gain 172 173 -65.13 gain 173 172 -69.78 gain 172 174 -72.61 gain 174 172 -73.31 gain 172 175 -72.33 gain 175 172 -74.16 gain 172 176 -76.99 gain 176 172 -77.79 gain 172 177 -76.22 gain 177 172 -80.02 gain 172 178 -88.96 gain 178 172 -86.21 gain 172 179 -87.65 gain 179 172 -84.32 gain 172 180 -81.05 gain 180 172 -87.16 gain 172 181 -85.12 gain 181 172 -85.26 gain 172 182 -87.77 gain 182 172 -88.99 gain 172 183 -83.89 gain 183 172 -85.39 gain 172 184 -68.02 gain 184 172 -72.27 gain 172 185 -77.57 gain 185 172 -85.68 gain 172 186 -66.81 gain 186 172 -70.50 gain 172 187 -57.39 gain 187 172 -58.82 gain 172 188 -71.50 gain 188 172 -75.33 gain 172 189 -72.19 gain 189 172 -70.75 gain 172 190 -77.53 gain 190 172 -80.01 gain 172 191 -81.48 gain 191 172 -82.66 gain 172 192 -84.14 gain 192 172 -84.01 gain 172 193 -79.95 gain 193 172 -78.81 gain 172 194 -84.97 gain 194 172 -84.61 gain 172 195 -84.37 gain 195 172 -82.56 gain 172 196 -85.10 gain 196 172 -87.60 gain 172 197 -90.64 gain 197 172 -88.28 gain 172 198 -78.85 gain 198 172 -81.00 gain 172 199 -80.89 gain 199 172 -83.15 gain 172 200 -89.43 gain 200 172 -93.03 gain 172 201 -80.54 gain 201 172 -84.04 gain 172 202 -75.06 gain 202 172 -77.70 gain 172 203 -68.85 gain 203 172 -70.60 gain 172 204 -77.34 gain 204 172 -75.74 gain 172 205 -83.52 gain 205 172 -85.65 gain 172 206 -81.93 gain 206 172 -85.17 gain 172 207 -81.55 gain 207 172 -84.21 gain 172 208 -87.39 gain 208 172 -92.65 gain 172 209 -92.68 gain 209 172 -97.51 gain 172 210 -94.68 gain 210 172 -99.69 gain 172 211 -87.35 gain 211 172 -87.59 gain 172 212 -85.82 gain 212 172 -89.07 gain 172 213 -91.45 gain 213 172 -94.03 gain 172 214 -80.41 gain 214 172 -88.37 gain 172 215 -80.86 gain 215 172 -84.23 gain 172 216 -76.01 gain 216 172 -83.29 gain 172 217 -77.74 gain 217 172 -85.28 gain 172 218 -74.00 gain 218 172 -74.34 gain 172 219 -79.05 gain 219 172 -79.88 gain 172 220 -89.66 gain 220 172 -86.58 gain 172 221 -78.07 gain 221 172 -80.66 gain 172 222 -85.88 gain 222 172 -84.28 gain 172 223 -85.39 gain 223 172 -87.04 gain 172 224 -84.17 gain 224 172 -86.28 gain 173 174 -69.95 gain 174 173 -65.99 gain 173 175 -75.48 gain 175 173 -72.67 gain 173 176 -81.66 gain 176 173 -77.81 gain 173 177 -91.90 gain 177 173 -91.05 gain 173 178 -96.69 gain 178 173 -89.28 gain 173 179 -96.30 gain 179 173 -88.32 gain 173 180 -94.69 gain 180 173 -96.15 gain 173 181 -92.05 gain 181 173 -87.54 gain 173 182 -89.52 gain 182 173 -86.09 gain 173 183 -86.29 gain 183 173 -83.14 gain 173 184 -85.70 gain 184 173 -85.30 gain 173 185 -85.40 gain 185 173 -88.87 gain 173 186 -72.54 gain 186 173 -71.58 gain 173 187 -68.69 gain 187 173 -65.46 gain 173 188 -68.28 gain 188 173 -67.46 gain 173 189 -74.15 gain 189 173 -68.06 gain 173 190 -80.77 gain 190 173 -78.60 gain 173 191 -81.65 gain 191 173 -78.18 gain 173 192 -81.00 gain 192 173 -76.23 gain 173 193 -101.72 gain 193 173 -95.94 gain 173 194 -99.86 gain 194 173 -94.85 gain 173 195 -96.66 gain 195 173 -90.20 gain 173 196 -93.44 gain 196 173 -91.30 gain 173 197 -97.06 gain 197 173 -90.05 gain 173 198 -86.53 gain 198 173 -84.04 gain 173 199 -83.52 gain 199 173 -81.13 gain 173 200 -93.31 gain 200 173 -92.26 gain 173 201 -75.90 gain 201 173 -74.76 gain 173 202 -73.04 gain 202 173 -71.03 gain 173 203 -78.58 gain 203 173 -75.68 gain 173 204 -81.74 gain 204 173 -75.49 gain 173 205 -80.21 gain 205 173 -77.69 gain 173 206 -84.08 gain 206 173 -82.67 gain 173 207 -90.78 gain 207 173 -88.79 gain 173 208 -96.19 gain 208 173 -96.80 gain 173 209 -85.45 gain 209 173 -85.64 gain 173 210 -95.51 gain 210 173 -95.87 gain 173 211 -92.66 gain 211 173 -88.25 gain 173 212 -92.93 gain 212 173 -91.53 gain 173 213 -87.23 gain 213 173 -85.16 gain 173 214 -82.68 gain 214 173 -86.00 gain 173 215 -89.58 gain 215 173 -88.30 gain 173 216 -84.90 gain 216 173 -87.53 gain 173 217 -89.84 gain 217 173 -92.73 gain 173 218 -84.95 gain 218 173 -80.65 gain 173 219 -78.57 gain 219 173 -74.75 gain 173 220 -85.46 gain 220 173 -77.72 gain 173 221 -82.22 gain 221 173 -80.16 gain 173 222 -90.30 gain 222 173 -84.05 gain 173 223 -95.92 gain 223 173 -92.91 gain 173 224 -93.56 gain 224 173 -91.03 gain 174 175 -60.30 gain 175 174 -61.44 gain 174 176 -73.95 gain 176 174 -74.05 gain 174 177 -81.21 gain 177 174 -84.32 gain 174 178 -82.56 gain 178 174 -79.10 gain 174 179 -86.07 gain 179 174 -82.04 gain 174 180 -97.07 gain 180 174 -102.49 gain 174 181 -89.55 gain 181 174 -88.99 gain 174 182 -88.10 gain 182 174 -88.63 gain 174 183 -90.41 gain 183 174 -91.21 gain 174 184 -87.94 gain 184 174 -91.48 gain 174 185 -81.07 gain 185 174 -88.48 gain 174 186 -86.11 gain 186 174 -89.11 gain 174 187 -77.99 gain 187 174 -78.71 gain 174 188 -68.09 gain 188 174 -71.23 gain 174 189 -64.72 gain 189 174 -62.58 gain 174 190 -71.17 gain 190 174 -72.95 gain 174 191 -66.22 gain 191 174 -66.70 gain 174 192 -76.85 gain 192 174 -76.03 gain 174 193 -77.31 gain 193 174 -75.47 gain 174 194 -81.98 gain 194 174 -80.92 gain 174 195 -93.10 gain 195 174 -90.59 gain 174 196 -91.49 gain 196 174 -93.29 gain 174 197 -89.72 gain 197 174 -86.66 gain 174 198 -84.04 gain 198 174 -85.50 gain 174 199 -85.37 gain 199 174 -86.93 gain 174 200 -83.39 gain 200 174 -86.29 gain 174 201 -74.39 gain 201 174 -77.20 gain 174 202 -75.57 gain 202 174 -77.51 gain 174 203 -78.57 gain 203 174 -79.62 gain 174 204 -73.55 gain 204 174 -71.25 gain 174 205 -71.83 gain 205 174 -73.27 gain 174 206 -77.14 gain 206 174 -79.69 gain 174 207 -82.32 gain 207 174 -84.28 gain 174 208 -78.15 gain 208 174 -82.71 gain 174 209 -85.18 gain 209 174 -89.32 gain 174 210 -91.80 gain 210 174 -96.11 gain 174 211 -87.69 gain 211 174 -87.23 gain 174 212 -90.33 gain 212 174 -92.88 gain 174 213 -89.53 gain 213 174 -91.42 gain 174 214 -83.16 gain 214 174 -90.43 gain 174 215 -90.36 gain 215 174 -93.03 gain 174 216 -79.39 gain 216 174 -85.97 gain 174 217 -76.39 gain 217 174 -83.23 gain 174 218 -78.93 gain 218 174 -78.58 gain 174 219 -79.81 gain 219 174 -79.94 gain 174 220 -67.79 gain 220 174 -64.01 gain 174 221 -77.40 gain 221 174 -79.30 gain 174 222 -83.76 gain 222 174 -81.46 gain 174 223 -91.11 gain 223 174 -92.06 gain 174 224 -83.99 gain 224 174 -85.40 gain 175 176 -58.42 gain 176 175 -57.39 gain 175 177 -77.50 gain 177 175 -79.47 gain 175 178 -79.76 gain 178 175 -75.18 gain 175 179 -84.95 gain 179 175 -79.79 gain 175 180 -96.74 gain 180 175 -101.03 gain 175 181 -91.89 gain 181 175 -90.20 gain 175 182 -91.06 gain 182 175 -90.45 gain 175 183 -97.02 gain 183 175 -96.68 gain 175 184 -92.09 gain 184 175 -94.50 gain 175 185 -85.29 gain 185 175 -91.57 gain 175 186 -84.36 gain 186 175 -86.22 gain 175 187 -77.21 gain 187 175 -76.80 gain 175 188 -75.10 gain 188 175 -77.10 gain 175 189 -71.59 gain 189 175 -68.32 gain 175 190 -65.19 gain 190 175 -65.83 gain 175 191 -75.15 gain 191 175 -74.50 gain 175 192 -71.22 gain 192 175 -69.26 gain 175 193 -81.34 gain 193 175 -78.37 gain 175 194 -87.84 gain 194 175 -85.65 gain 175 195 -90.34 gain 195 175 -86.70 gain 175 196 -96.51 gain 196 175 -97.18 gain 175 197 -97.48 gain 197 175 -93.28 gain 175 198 -88.36 gain 198 175 -88.67 gain 175 199 -92.00 gain 199 175 -92.43 gain 175 200 -88.06 gain 200 175 -89.82 gain 175 201 -91.58 gain 201 175 -93.25 gain 175 202 -84.02 gain 202 175 -84.83 gain 175 203 -83.80 gain 203 175 -83.72 gain 175 204 -73.53 gain 204 175 -70.09 gain 175 205 -70.05 gain 205 175 -70.35 gain 175 206 -74.01 gain 206 175 -75.42 gain 175 207 -79.87 gain 207 175 -80.70 gain 175 208 -75.47 gain 208 175 -78.90 gain 175 209 -92.03 gain 209 175 -95.03 gain 175 210 -90.93 gain 210 175 -94.11 gain 175 211 -94.06 gain 211 175 -92.47 gain 175 212 -86.51 gain 212 175 -87.93 gain 175 213 -92.68 gain 213 175 -93.43 gain 175 214 -90.76 gain 214 175 -96.89 gain 175 215 -90.84 gain 215 175 -92.38 gain 175 216 -87.37 gain 216 175 -92.82 gain 175 217 -80.39 gain 217 175 -86.10 gain 175 218 -86.33 gain 218 175 -84.84 gain 175 219 -81.95 gain 219 175 -80.95 gain 175 220 -80.06 gain 220 175 -75.14 gain 175 221 -83.50 gain 221 175 -84.26 gain 175 222 -86.38 gain 222 175 -82.95 gain 175 223 -84.17 gain 223 175 -83.98 gain 175 224 -82.79 gain 224 175 -83.07 gain 176 177 -64.28 gain 177 176 -67.28 gain 176 178 -72.61 gain 178 176 -69.06 gain 176 179 -76.95 gain 179 176 -72.81 gain 176 180 -93.34 gain 180 176 -98.65 gain 176 181 -90.81 gain 181 176 -90.15 gain 176 182 -90.80 gain 182 176 -91.22 gain 176 183 -100.64 gain 183 176 -101.34 gain 176 184 -85.91 gain 184 176 -89.36 gain 176 185 -90.10 gain 185 176 -97.41 gain 176 186 -81.43 gain 186 176 -84.32 gain 176 187 -83.54 gain 187 176 -84.16 gain 176 188 -78.71 gain 188 176 -81.74 gain 176 189 -78.40 gain 189 176 -76.15 gain 176 190 -64.13 gain 190 176 -65.80 gain 176 191 -63.21 gain 191 176 -63.59 gain 176 192 -67.09 gain 192 176 -66.16 gain 176 193 -70.83 gain 193 176 -68.89 gain 176 194 -82.27 gain 194 176 -81.11 gain 176 195 -100.41 gain 195 176 -97.79 gain 176 196 -98.65 gain 196 176 -100.35 gain 176 197 -97.95 gain 197 176 -94.78 gain 176 198 -90.81 gain 198 176 -92.16 gain 176 199 -86.96 gain 199 176 -88.41 gain 176 200 -87.04 gain 200 176 -89.83 gain 176 201 -90.18 gain 201 176 -92.88 gain 176 202 -85.75 gain 202 176 -87.58 gain 176 203 -78.68 gain 203 176 -79.63 gain 176 204 -76.63 gain 204 176 -74.22 gain 176 205 -83.30 gain 205 176 -84.64 gain 176 206 -79.53 gain 206 176 -81.97 gain 176 207 -75.60 gain 207 176 -77.46 gain 176 208 -76.38 gain 208 176 -80.84 gain 176 209 -80.44 gain 209 176 -84.47 gain 176 210 -96.26 gain 210 176 -100.47 gain 176 211 -91.32 gain 211 176 -90.76 gain 176 212 -86.02 gain 212 176 -88.47 gain 176 213 -96.44 gain 213 176 -98.21 gain 176 214 -87.91 gain 214 176 -95.08 gain 176 215 -88.15 gain 215 176 -90.72 gain 176 216 -89.40 gain 216 176 -95.88 gain 176 217 -83.90 gain 217 176 -90.64 gain 176 218 -79.26 gain 218 176 -78.80 gain 176 219 -79.28 gain 219 176 -79.31 gain 176 220 -88.79 gain 220 176 -84.91 gain 176 221 -83.41 gain 221 176 -85.21 gain 176 222 -76.05 gain 222 176 -73.65 gain 176 223 -82.34 gain 223 176 -83.18 gain 176 224 -85.25 gain 224 176 -86.56 gain 177 178 -67.95 gain 178 177 -61.39 gain 177 179 -75.67 gain 179 177 -68.53 gain 177 180 -99.98 gain 180 177 -102.30 gain 177 181 -98.02 gain 181 177 -94.36 gain 177 182 -92.93 gain 182 177 -90.34 gain 177 183 -90.60 gain 183 177 -88.30 gain 177 184 -91.34 gain 184 177 -91.79 gain 177 185 -95.52 gain 185 177 -99.82 gain 177 186 -91.26 gain 186 177 -91.15 gain 177 187 -90.83 gain 187 177 -88.44 gain 177 188 -84.82 gain 188 177 -84.85 gain 177 189 -73.25 gain 189 177 -68.01 gain 177 190 -79.83 gain 190 177 -78.50 gain 177 191 -62.49 gain 191 177 -59.86 gain 177 192 -69.60 gain 192 177 -65.67 gain 177 193 -69.15 gain 193 177 -64.21 gain 177 194 -80.21 gain 194 177 -76.05 gain 177 195 -93.38 gain 195 177 -87.77 gain 177 196 -96.64 gain 196 177 -95.34 gain 177 197 -105.56 gain 197 177 -99.39 gain 177 198 -98.31 gain 198 177 -96.65 gain 177 199 -96.37 gain 199 177 -94.82 gain 177 200 -92.85 gain 200 177 -92.64 gain 177 201 -99.34 gain 201 177 -99.04 gain 177 202 -89.86 gain 202 177 -88.69 gain 177 203 -95.39 gain 203 177 -93.34 gain 177 204 -83.09 gain 204 177 -77.68 gain 177 205 -81.42 gain 205 177 -79.75 gain 177 206 -71.31 gain 206 177 -70.75 gain 177 207 -83.30 gain 207 177 -82.15 gain 177 208 -78.46 gain 208 177 -79.92 gain 177 209 -75.54 gain 209 177 -76.57 gain 177 210 -98.84 gain 210 177 -100.05 gain 177 211 -106.40 gain 211 177 -102.84 gain 177 212 -97.85 gain 212 177 -97.29 gain 177 213 -93.11 gain 213 177 -91.89 gain 177 214 -96.52 gain 214 177 -100.68 gain 177 215 -93.69 gain 215 177 -93.25 gain 177 216 -98.37 gain 216 177 -101.85 gain 177 217 -85.17 gain 217 177 -88.91 gain 177 218 -91.12 gain 218 177 -87.67 gain 177 219 -90.31 gain 219 177 -87.33 gain 177 220 -84.16 gain 220 177 -77.27 gain 177 221 -83.21 gain 221 177 -82.01 gain 177 222 -87.43 gain 222 177 -82.03 gain 177 223 -83.65 gain 223 177 -81.49 gain 177 224 -80.98 gain 224 177 -79.29 gain 178 179 -57.49 gain 179 178 -56.91 gain 178 180 -95.40 gain 180 178 -104.27 gain 178 181 -86.70 gain 181 178 -89.59 gain 178 182 -92.98 gain 182 178 -96.96 gain 178 183 -91.44 gain 183 178 -95.69 gain 178 184 -91.61 gain 184 178 -98.61 gain 178 185 -93.10 gain 185 178 -103.97 gain 178 186 -86.96 gain 186 178 -93.41 gain 178 187 -88.73 gain 187 178 -92.91 gain 178 188 -85.67 gain 188 178 -92.25 gain 178 189 -78.90 gain 189 178 -80.22 gain 178 190 -74.65 gain 190 178 -79.88 gain 178 191 -71.72 gain 191 178 -75.65 gain 178 192 -66.41 gain 192 178 -69.04 gain 178 193 -65.72 gain 193 178 -67.33 gain 178 194 -63.67 gain 194 178 -66.07 gain 178 195 -92.95 gain 195 178 -93.90 gain 178 196 -100.01 gain 196 178 -105.27 gain 178 197 -92.15 gain 197 178 -92.54 gain 178 198 -96.89 gain 198 178 -101.79 gain 178 199 -86.84 gain 199 178 -91.85 gain 178 200 -91.02 gain 200 178 -97.37 gain 178 201 -91.23 gain 201 178 -97.49 gain 178 202 -88.92 gain 202 178 -94.31 gain 178 203 -83.54 gain 203 178 -88.05 gain 178 204 -83.63 gain 204 178 -84.77 gain 178 205 -78.43 gain 205 178 -83.32 gain 178 206 -71.74 gain 206 178 -77.73 gain 178 207 -65.84 gain 207 178 -71.26 gain 178 208 -75.13 gain 208 178 -83.14 gain 178 209 -71.38 gain 209 178 -78.96 gain 178 210 -102.92 gain 210 178 -110.68 gain 178 211 -97.42 gain 211 178 -100.42 gain 178 212 -81.89 gain 212 178 -87.90 gain 178 213 -91.59 gain 213 178 -96.93 gain 178 214 -96.22 gain 214 178 -106.94 gain 178 215 -93.62 gain 215 178 -99.74 gain 178 216 -88.63 gain 216 178 -98.66 gain 178 217 -87.52 gain 217 178 -97.81 gain 178 218 -81.81 gain 218 178 -84.91 gain 178 219 -76.34 gain 219 178 -79.93 gain 178 220 -79.26 gain 220 178 -78.94 gain 178 221 -78.37 gain 221 178 -83.72 gain 178 222 -81.86 gain 222 178 -83.02 gain 178 223 -75.07 gain 223 178 -79.47 gain 178 224 -77.44 gain 224 178 -82.31 gain 179 180 -89.05 gain 180 179 -98.50 gain 179 181 -91.35 gain 181 179 -94.82 gain 179 182 -91.27 gain 182 179 -95.82 gain 179 183 -91.48 gain 183 179 -96.31 gain 179 184 -92.74 gain 184 179 -100.31 gain 179 185 -90.22 gain 185 179 -101.66 gain 179 186 -87.61 gain 186 179 -94.63 gain 179 187 -91.02 gain 187 179 -95.78 gain 179 188 -83.74 gain 188 179 -90.91 gain 179 189 -77.45 gain 189 179 -79.34 gain 179 190 -79.24 gain 190 179 -85.05 gain 179 191 -76.80 gain 191 179 -81.31 gain 179 192 -78.56 gain 192 179 -81.76 gain 179 193 -60.75 gain 193 179 -62.94 gain 179 194 -56.89 gain 194 179 -59.87 gain 179 195 -98.88 gain 195 179 -100.40 gain 179 196 -93.90 gain 196 179 -99.73 gain 179 197 -94.12 gain 197 179 -95.09 gain 179 198 -92.35 gain 198 179 -97.84 gain 179 199 -95.68 gain 199 179 -101.27 gain 179 200 -91.49 gain 200 179 -98.42 gain 179 201 -85.49 gain 201 179 -92.32 gain 179 202 -91.00 gain 202 179 -96.97 gain 179 203 -85.61 gain 203 179 -90.69 gain 179 204 -75.49 gain 204 179 -77.21 gain 179 205 -81.46 gain 205 179 -86.93 gain 179 206 -71.99 gain 206 179 -78.57 gain 179 207 -72.77 gain 207 179 -78.76 gain 179 208 -72.07 gain 208 179 -80.66 gain 179 209 -68.19 gain 209 179 -76.36 gain 179 210 -97.42 gain 210 179 -105.76 gain 179 211 -92.10 gain 211 179 -95.67 gain 179 212 -92.77 gain 212 179 -99.35 gain 179 213 -93.63 gain 213 179 -99.54 gain 179 214 -90.34 gain 214 179 -101.64 gain 179 215 -92.46 gain 215 179 -99.16 gain 179 216 -86.06 gain 216 179 -96.67 gain 179 217 -88.10 gain 217 179 -98.97 gain 179 218 -80.26 gain 218 179 -83.94 gain 179 219 -83.33 gain 219 179 -87.50 gain 179 220 -84.22 gain 220 179 -84.47 gain 179 221 -80.48 gain 221 179 -86.41 gain 179 222 -81.32 gain 222 179 -83.05 gain 179 223 -80.77 gain 223 179 -85.75 gain 179 224 -73.75 gain 224 179 -79.20 gain 180 181 -68.28 gain 181 180 -62.30 gain 180 182 -82.05 gain 182 180 -77.16 gain 180 183 -89.25 gain 183 180 -84.64 gain 180 184 -92.66 gain 184 180 -90.79 gain 180 185 -88.82 gain 185 180 -90.82 gain 180 186 -87.46 gain 186 180 -85.03 gain 180 187 -98.11 gain 187 180 -93.42 gain 180 188 -101.01 gain 188 180 -98.73 gain 180 189 -99.75 gain 189 180 -92.19 gain 180 190 -101.10 gain 190 180 -97.46 gain 180 191 -99.75 gain 191 180 -94.82 gain 180 192 -104.88 gain 192 180 -98.64 gain 180 193 -103.37 gain 193 180 -96.12 gain 180 194 -92.67 gain 194 180 -86.20 gain 180 195 -68.34 gain 195 180 -60.42 gain 180 196 -71.78 gain 196 180 -68.16 gain 180 197 -76.23 gain 197 180 -67.75 gain 180 198 -89.57 gain 198 180 -85.60 gain 180 199 -92.29 gain 199 180 -88.43 gain 180 200 -91.64 gain 200 180 -89.11 gain 180 201 -94.39 gain 201 180 -91.77 gain 180 202 -97.32 gain 202 180 -93.84 gain 180 203 -98.23 gain 203 180 -93.86 gain 180 204 -103.49 gain 204 180 -95.77 gain 180 205 -92.03 gain 205 180 -88.04 gain 180 206 -98.16 gain 206 180 -95.29 gain 180 207 -97.99 gain 207 180 -94.54 gain 180 208 -105.21 gain 208 180 -104.36 gain 180 209 -107.87 gain 209 180 -106.59 gain 180 210 -81.92 gain 210 180 -80.82 gain 180 211 -77.87 gain 211 180 -72.00 gain 180 212 -84.35 gain 212 180 -81.49 gain 180 213 -83.79 gain 213 180 -80.25 gain 180 214 -97.94 gain 214 180 -99.79 gain 180 215 -86.89 gain 215 180 -84.14 gain 180 216 -89.34 gain 216 180 -90.51 gain 180 217 -98.72 gain 217 180 -100.15 gain 180 218 -96.90 gain 218 180 -91.13 gain 180 219 -101.27 gain 219 180 -95.98 gain 180 220 -100.57 gain 220 180 -91.37 gain 180 221 -99.03 gain 221 180 -95.51 gain 180 222 -111.09 gain 222 180 -103.37 gain 180 223 -97.94 gain 223 180 -93.47 gain 180 224 -103.67 gain 224 180 -99.67 gain 181 182 -67.01 gain 182 181 -68.10 gain 181 183 -76.46 gain 183 181 -77.82 gain 181 184 -85.20 gain 184 181 -89.31 gain 181 185 -79.26 gain 185 181 -87.24 gain 181 186 -83.15 gain 186 181 -86.70 gain 181 187 -79.85 gain 187 181 -81.14 gain 181 188 -97.94 gain 188 181 -101.63 gain 181 189 -96.58 gain 189 181 -95.00 gain 181 190 -90.34 gain 190 181 -92.68 gain 181 191 -96.46 gain 191 181 -97.50 gain 181 192 -100.61 gain 192 181 -100.34 gain 181 193 -92.24 gain 193 181 -90.97 gain 181 194 -94.10 gain 194 181 -93.60 gain 181 195 -73.35 gain 195 181 -71.41 gain 181 196 -64.01 gain 196 181 -66.38 gain 181 197 -63.10 gain 197 181 -60.60 gain 181 198 -76.17 gain 198 181 -78.19 gain 181 199 -76.98 gain 199 181 -79.10 gain 181 200 -81.85 gain 200 181 -85.31 gain 181 201 -83.86 gain 201 181 -87.22 gain 181 202 -84.76 gain 202 181 -87.26 gain 181 203 -90.04 gain 203 181 -91.65 gain 181 204 -93.61 gain 204 181 -91.86 gain 181 205 -89.67 gain 205 181 -91.66 gain 181 206 -93.21 gain 206 181 -96.31 gain 181 207 -92.74 gain 207 181 -95.26 gain 181 208 -95.98 gain 208 181 -101.10 gain 181 209 -95.71 gain 209 181 -100.41 gain 181 210 -70.44 gain 210 181 -75.31 gain 181 211 -64.96 gain 211 181 -65.06 gain 181 212 -70.67 gain 212 181 -73.79 gain 181 213 -74.22 gain 213 181 -76.66 gain 181 214 -72.60 gain 214 181 -80.43 gain 181 215 -87.15 gain 215 181 -90.38 gain 181 216 -83.11 gain 216 181 -90.25 gain 181 217 -88.96 gain 217 181 -96.37 gain 181 218 -89.23 gain 218 181 -89.44 gain 181 219 -90.80 gain 219 181 -91.49 gain 181 220 -91.19 gain 220 181 -87.97 gain 181 221 -102.57 gain 221 181 -105.03 gain 181 222 -96.29 gain 222 181 -94.55 gain 181 223 -98.44 gain 223 181 -99.94 gain 181 224 -101.38 gain 224 181 -103.35 gain 182 183 -64.86 gain 183 182 -65.13 gain 182 184 -68.15 gain 184 182 -71.17 gain 182 185 -86.21 gain 185 182 -93.10 gain 182 186 -79.89 gain 186 182 -82.35 gain 182 187 -78.06 gain 187 182 -78.26 gain 182 188 -85.14 gain 188 182 -87.75 gain 182 189 -92.08 gain 189 182 -89.42 gain 182 190 -87.99 gain 190 182 -89.24 gain 182 191 -96.09 gain 191 182 -96.04 gain 182 192 -98.20 gain 192 182 -96.85 gain 182 193 -100.08 gain 193 182 -97.72 gain 182 194 -98.57 gain 194 182 -96.99 gain 182 195 -69.46 gain 195 182 -66.43 gain 182 196 -75.96 gain 196 182 -77.24 gain 182 197 -69.58 gain 197 182 -66.00 gain 182 198 -68.87 gain 198 182 -69.79 gain 182 199 -79.85 gain 199 182 -80.89 gain 182 200 -71.02 gain 200 182 -73.39 gain 182 201 -80.89 gain 201 182 -83.17 gain 182 202 -90.78 gain 202 182 -92.19 gain 182 203 -85.90 gain 203 182 -86.43 gain 182 204 -86.98 gain 204 182 -84.15 gain 182 205 -98.87 gain 205 182 -99.78 gain 182 206 -91.92 gain 206 182 -93.93 gain 182 207 -97.94 gain 207 182 -99.38 gain 182 208 -97.46 gain 208 182 -101.50 gain 182 209 -97.82 gain 209 182 -101.43 gain 182 210 -77.21 gain 210 182 -81.00 gain 182 211 -78.66 gain 211 182 -77.68 gain 182 212 -72.63 gain 212 182 -74.66 gain 182 213 -77.65 gain 213 182 -79.01 gain 182 214 -77.34 gain 214 182 -84.09 gain 182 215 -78.61 gain 215 182 -80.76 gain 182 216 -85.28 gain 216 182 -91.33 gain 182 217 -85.40 gain 217 182 -91.71 gain 182 218 -91.39 gain 218 182 -90.52 gain 182 219 -96.53 gain 219 182 -96.14 gain 182 220 -86.42 gain 220 182 -82.11 gain 182 221 -95.80 gain 221 182 -97.17 gain 182 222 -92.38 gain 222 182 -89.55 gain 182 223 -97.99 gain 223 182 -98.41 gain 182 224 -102.64 gain 224 182 -103.53 gain 183 184 -66.32 gain 184 183 -69.07 gain 183 185 -72.31 gain 185 183 -78.92 gain 183 186 -76.84 gain 186 183 -79.04 gain 183 187 -86.07 gain 187 183 -86.00 gain 183 188 -88.84 gain 188 183 -91.18 gain 183 189 -90.41 gain 189 183 -87.47 gain 183 190 -95.32 gain 190 183 -96.29 gain 183 191 -89.13 gain 191 183 -88.81 gain 183 192 -94.39 gain 192 183 -92.77 gain 183 193 -99.72 gain 193 183 -97.08 gain 183 194 -91.78 gain 194 183 -89.93 gain 183 195 -81.69 gain 195 183 -78.38 gain 183 196 -74.30 gain 196 183 -75.30 gain 183 197 -69.07 gain 197 183 -65.21 gain 183 198 -62.81 gain 198 183 -63.46 gain 183 199 -63.33 gain 199 183 -64.09 gain 183 200 -71.32 gain 200 183 -73.41 gain 183 201 -80.63 gain 201 183 -82.64 gain 183 202 -86.26 gain 202 183 -87.40 gain 183 203 -87.57 gain 203 183 -87.82 gain 183 204 -83.90 gain 204 183 -80.79 gain 183 205 -93.14 gain 205 183 -93.78 gain 183 206 -97.55 gain 206 183 -99.29 gain 183 207 -98.58 gain 207 183 -99.74 gain 183 208 -88.69 gain 208 183 -92.45 gain 183 209 -99.26 gain 209 183 -102.59 gain 183 210 -72.86 gain 210 183 -76.37 gain 183 211 -76.90 gain 211 183 -75.64 gain 183 212 -74.50 gain 212 183 -76.25 gain 183 213 -74.70 gain 213 183 -75.78 gain 183 214 -74.27 gain 214 183 -80.74 gain 183 215 -70.24 gain 215 183 -72.12 gain 183 216 -81.32 gain 216 183 -87.10 gain 183 217 -78.75 gain 217 183 -84.79 gain 183 218 -85.91 gain 218 183 -84.76 gain 183 219 -88.70 gain 219 183 -88.03 gain 183 220 -88.68 gain 220 183 -84.10 gain 183 221 -94.50 gain 221 183 -95.60 gain 183 222 -92.91 gain 222 183 -89.82 gain 183 223 -100.30 gain 223 183 -100.44 gain 183 224 -99.79 gain 224 183 -100.40 gain 184 185 -67.36 gain 185 184 -71.22 gain 184 186 -75.52 gain 186 184 -74.96 gain 184 187 -80.81 gain 187 184 -77.99 gain 184 188 -95.47 gain 188 184 -95.06 gain 184 189 -86.54 gain 189 184 -80.85 gain 184 190 -91.74 gain 190 184 -89.97 gain 184 191 -94.18 gain 191 184 -91.11 gain 184 192 -96.08 gain 192 184 -91.71 gain 184 193 -95.99 gain 193 184 -90.61 gain 184 194 -102.57 gain 194 184 -97.97 gain 184 195 -85.42 gain 195 184 -79.37 gain 184 196 -77.36 gain 196 184 -75.61 gain 184 197 -87.77 gain 197 184 -81.16 gain 184 198 -73.32 gain 198 184 -71.23 gain 184 199 -68.39 gain 199 184 -66.40 gain 184 200 -73.13 gain 200 184 -72.48 gain 184 201 -82.44 gain 201 184 -81.69 gain 184 202 -82.11 gain 202 184 -80.50 gain 184 203 -81.83 gain 203 184 -79.34 gain 184 204 -92.97 gain 204 184 -87.12 gain 184 205 -86.77 gain 205 184 -84.66 gain 184 206 -94.42 gain 206 184 -93.42 gain 184 207 -87.93 gain 207 184 -86.34 gain 184 208 -99.72 gain 208 184 -100.73 gain 184 209 -98.50 gain 209 184 -99.09 gain 184 210 -88.00 gain 210 184 -88.76 gain 184 211 -81.35 gain 211 184 -77.35 gain 184 212 -79.18 gain 212 184 -78.18 gain 184 213 -79.13 gain 213 184 -77.46 gain 184 214 -73.70 gain 214 184 -77.42 gain 184 215 -72.95 gain 215 184 -72.07 gain 184 216 -82.55 gain 216 184 -85.58 gain 184 217 -83.77 gain 217 184 -87.06 gain 184 218 -90.39 gain 218 184 -86.49 gain 184 219 -81.43 gain 219 184 -78.02 gain 184 220 -95.68 gain 220 184 -88.35 gain 184 221 -99.39 gain 221 184 -97.74 gain 184 222 -101.02 gain 222 184 -95.17 gain 184 223 -97.42 gain 223 184 -94.81 gain 184 224 -95.94 gain 224 184 -93.80 gain 185 186 -70.89 gain 186 185 -66.47 gain 185 187 -82.45 gain 187 185 -75.76 gain 185 188 -94.63 gain 188 185 -90.35 gain 185 189 -97.29 gain 189 185 -87.74 gain 185 190 -91.51 gain 190 185 -85.88 gain 185 191 -93.74 gain 191 185 -86.81 gain 185 192 -96.18 gain 192 185 -87.95 gain 185 193 -102.78 gain 193 185 -93.53 gain 185 194 -99.13 gain 194 185 -90.66 gain 185 195 -91.95 gain 195 185 -82.03 gain 185 196 -85.24 gain 196 185 -79.63 gain 185 197 -84.07 gain 197 185 -73.60 gain 185 198 -74.89 gain 198 185 -68.93 gain 185 199 -79.00 gain 199 185 -73.15 gain 185 200 -74.79 gain 200 185 -70.28 gain 185 201 -78.43 gain 201 185 -73.82 gain 185 202 -82.23 gain 202 185 -76.75 gain 185 203 -87.71 gain 203 185 -81.35 gain 185 204 -93.34 gain 204 185 -83.62 gain 185 205 -95.11 gain 205 185 -89.13 gain 185 206 -89.80 gain 206 185 -84.93 gain 185 207 -98.56 gain 207 185 -93.11 gain 185 208 -103.79 gain 208 185 -100.94 gain 185 209 -94.29 gain 209 185 -91.01 gain 185 210 -86.30 gain 210 185 -83.20 gain 185 211 -96.96 gain 211 185 -89.09 gain 185 212 -84.83 gain 212 185 -79.97 gain 185 213 -84.21 gain 213 185 -78.68 gain 185 214 -85.40 gain 214 185 -85.26 gain 185 215 -82.37 gain 215 185 -77.62 gain 185 216 -80.69 gain 216 185 -79.85 gain 185 217 -91.51 gain 217 185 -90.94 gain 185 218 -89.42 gain 218 185 -81.65 gain 185 219 -88.44 gain 219 185 -81.16 gain 185 220 -96.91 gain 220 185 -85.72 gain 185 221 -103.14 gain 221 185 -97.62 gain 185 222 -92.26 gain 222 185 -82.55 gain 185 223 -99.77 gain 223 185 -93.30 gain 185 224 -99.47 gain 224 185 -93.47 gain 186 187 -67.05 gain 187 186 -64.78 gain 186 188 -75.57 gain 188 186 -75.72 gain 186 189 -84.85 gain 189 186 -79.72 gain 186 190 -87.72 gain 190 186 -86.50 gain 186 191 -81.70 gain 191 186 -79.19 gain 186 192 -92.29 gain 192 186 -88.47 gain 186 193 -97.91 gain 193 186 -93.08 gain 186 194 -99.42 gain 194 186 -95.37 gain 186 195 -85.36 gain 195 186 -79.86 gain 186 196 -84.94 gain 196 186 -83.75 gain 186 197 -84.74 gain 197 186 -78.69 gain 186 198 -77.98 gain 198 186 -76.44 gain 186 199 -79.48 gain 199 186 -78.05 gain 186 200 -73.81 gain 200 186 -73.71 gain 186 201 -70.65 gain 201 186 -70.46 gain 186 202 -69.92 gain 202 186 -68.87 gain 186 203 -73.58 gain 203 186 -71.64 gain 186 204 -83.69 gain 204 186 -78.39 gain 186 205 -89.64 gain 205 186 -88.08 gain 186 206 -94.57 gain 206 186 -94.12 gain 186 207 -94.87 gain 207 186 -93.84 gain 186 208 -87.28 gain 208 186 -88.85 gain 186 209 -98.23 gain 209 186 -99.38 gain 186 210 -93.50 gain 210 186 -94.82 gain 186 211 -91.66 gain 211 186 -88.21 gain 186 212 -86.21 gain 212 186 -85.77 gain 186 213 -93.31 gain 213 186 -92.20 gain 186 214 -88.73 gain 214 186 -93.01 gain 186 215 -74.67 gain 215 186 -74.34 gain 186 216 -74.80 gain 216 186 -78.39 gain 186 217 -76.89 gain 217 186 -80.74 gain 186 218 -84.32 gain 218 186 -80.98 gain 186 219 -83.61 gain 219 186 -80.74 gain 186 220 -82.43 gain 220 186 -75.66 gain 186 221 -85.35 gain 221 186 -84.25 gain 186 222 -91.13 gain 222 186 -85.84 gain 186 223 -97.78 gain 223 186 -95.73 gain 186 224 -90.86 gain 224 186 -89.27 gain 187 188 -68.99 gain 188 187 -71.41 gain 187 189 -71.08 gain 189 187 -68.22 gain 187 190 -83.72 gain 190 187 -84.77 gain 187 191 -82.19 gain 191 187 -81.95 gain 187 192 -85.96 gain 192 187 -84.42 gain 187 193 -90.77 gain 193 187 -88.21 gain 187 194 -95.83 gain 194 187 -94.05 gain 187 195 -96.83 gain 195 187 -93.60 gain 187 196 -90.23 gain 196 187 -91.31 gain 187 197 -88.77 gain 197 187 -84.99 gain 187 198 -84.59 gain 198 187 -85.32 gain 187 199 -81.56 gain 199 187 -82.40 gain 187 200 -73.80 gain 200 187 -75.97 gain 187 201 -70.34 gain 201 187 -72.42 gain 187 202 -65.79 gain 202 187 -67.00 gain 187 203 -72.00 gain 203 187 -72.32 gain 187 204 -72.39 gain 204 187 -69.36 gain 187 205 -78.96 gain 205 187 -79.67 gain 187 206 -77.74 gain 206 187 -79.56 gain 187 207 -86.80 gain 207 187 -88.04 gain 187 208 -88.17 gain 208 187 -92.01 gain 187 209 -86.82 gain 209 187 -90.23 gain 187 210 -87.24 gain 210 187 -90.83 gain 187 211 -87.75 gain 211 187 -86.57 gain 187 212 -86.11 gain 212 187 -87.94 gain 187 213 -82.76 gain 213 187 -83.92 gain 187 214 -81.68 gain 214 187 -88.22 gain 187 215 -83.74 gain 215 187 -85.68 gain 187 216 -78.61 gain 216 187 -84.47 gain 187 217 -72.02 gain 217 187 -78.14 gain 187 218 -81.88 gain 218 187 -80.80 gain 187 219 -77.11 gain 219 187 -76.52 gain 187 220 -91.54 gain 220 187 -87.03 gain 187 221 -85.23 gain 221 187 -86.40 gain 187 222 -82.30 gain 222 187 -79.27 gain 187 223 -91.25 gain 223 187 -91.47 gain 187 224 -100.30 gain 224 187 -100.99 gain 188 189 -69.54 gain 189 188 -64.26 gain 188 190 -79.68 gain 190 188 -78.32 gain 188 191 -79.39 gain 191 188 -76.74 gain 188 192 -82.62 gain 192 188 -78.66 gain 188 193 -95.83 gain 193 188 -90.86 gain 188 194 -94.39 gain 194 188 -90.20 gain 188 195 -100.17 gain 195 188 -94.53 gain 188 196 -95.20 gain 196 188 -93.87 gain 188 197 -93.52 gain 197 188 -87.32 gain 188 198 -86.60 gain 198 188 -84.92 gain 188 199 -89.11 gain 199 188 -87.53 gain 188 200 -86.87 gain 200 188 -86.63 gain 188 201 -78.04 gain 201 188 -77.71 gain 188 202 -75.84 gain 202 188 -74.64 gain 188 203 -67.99 gain 203 188 -65.90 gain 188 204 -70.45 gain 204 188 -65.01 gain 188 205 -73.59 gain 205 188 -71.89 gain 188 206 -74.03 gain 206 188 -73.43 gain 188 207 -84.17 gain 207 188 -82.99 gain 188 208 -83.77 gain 208 188 -85.20 gain 188 209 -91.96 gain 209 188 -92.96 gain 188 210 -91.85 gain 210 188 -93.03 gain 188 211 -88.71 gain 211 188 -85.12 gain 188 212 -86.96 gain 212 188 -86.38 gain 188 213 -89.21 gain 213 188 -87.96 gain 188 214 -86.04 gain 214 188 -90.17 gain 188 215 -83.11 gain 215 188 -82.64 gain 188 216 -88.08 gain 216 188 -91.52 gain 188 217 -74.57 gain 217 188 -78.27 gain 188 218 -78.09 gain 218 188 -74.61 gain 188 219 -76.34 gain 219 188 -73.34 gain 188 220 -83.65 gain 220 188 -76.73 gain 188 221 -87.98 gain 221 188 -86.74 gain 188 222 -91.29 gain 222 188 -85.85 gain 188 223 -91.13 gain 223 188 -88.93 gain 188 224 -90.85 gain 224 188 -89.13 gain 189 190 -63.95 gain 190 189 -67.87 gain 189 191 -75.52 gain 191 189 -78.14 gain 189 192 -76.70 gain 192 189 -78.02 gain 189 193 -86.27 gain 193 189 -86.57 gain 189 194 -84.85 gain 194 189 -85.94 gain 189 195 -87.74 gain 195 189 -87.38 gain 189 196 -84.11 gain 196 189 -88.05 gain 189 197 -89.77 gain 197 189 -88.84 gain 189 198 -93.04 gain 198 189 -96.63 gain 189 199 -78.80 gain 199 189 -82.50 gain 189 200 -82.18 gain 200 189 -87.22 gain 189 201 -73.54 gain 201 189 -78.49 gain 189 202 -83.18 gain 202 189 -87.26 gain 189 203 -66.29 gain 203 189 -69.48 gain 189 204 -61.10 gain 204 189 -60.93 gain 189 205 -75.60 gain 205 189 -79.18 gain 189 206 -75.24 gain 206 189 -79.92 gain 189 207 -72.14 gain 207 189 -76.25 gain 189 208 -77.05 gain 208 189 -83.75 gain 189 209 -85.25 gain 209 189 -91.53 gain 189 210 -86.48 gain 210 189 -92.93 gain 189 211 -82.32 gain 211 189 -84.01 gain 189 212 -84.63 gain 212 189 -89.33 gain 189 213 -89.61 gain 213 189 -93.63 gain 189 214 -86.60 gain 214 189 -96.01 gain 189 215 -81.94 gain 215 189 -86.75 gain 189 216 -84.09 gain 216 189 -92.81 gain 189 217 -84.71 gain 217 189 -93.70 gain 189 218 -74.84 gain 218 189 -76.63 gain 189 219 -75.95 gain 219 189 -78.22 gain 189 220 -74.18 gain 220 189 -72.54 gain 189 221 -76.45 gain 221 189 -80.49 gain 189 222 -84.11 gain 222 189 -83.96 gain 189 223 -76.74 gain 223 189 -79.82 gain 189 224 -88.94 gain 224 189 -92.49 gain 190 191 -72.42 gain 191 190 -71.13 gain 190 192 -77.51 gain 192 190 -74.92 gain 190 193 -88.87 gain 193 190 -85.26 gain 190 194 -83.48 gain 194 190 -80.65 gain 190 195 -101.79 gain 195 190 -97.50 gain 190 196 -90.98 gain 196 190 -91.01 gain 190 197 -92.47 gain 197 190 -87.64 gain 190 198 -90.12 gain 198 190 -89.79 gain 190 199 -93.26 gain 199 190 -93.04 gain 190 200 -85.80 gain 200 190 -86.91 gain 190 201 -79.65 gain 201 190 -80.68 gain 190 202 -77.96 gain 202 190 -78.12 gain 190 203 -76.51 gain 203 190 -75.79 gain 190 204 -71.83 gain 204 190 -67.75 gain 190 205 -64.27 gain 205 190 -63.93 gain 190 206 -65.16 gain 206 190 -65.92 gain 190 207 -74.53 gain 207 190 -74.71 gain 190 208 -81.75 gain 208 190 -84.53 gain 190 209 -85.99 gain 209 190 -88.34 gain 190 210 -99.82 gain 210 190 -102.36 gain 190 211 -92.54 gain 211 190 -90.31 gain 190 212 -100.60 gain 212 190 -101.37 gain 190 213 -90.98 gain 213 190 -91.08 gain 190 214 -86.47 gain 214 190 -91.97 gain 190 215 -90.06 gain 215 190 -90.95 gain 190 216 -89.12 gain 216 190 -93.92 gain 190 217 -76.31 gain 217 190 -81.37 gain 190 218 -71.03 gain 218 190 -68.90 gain 190 219 -73.45 gain 219 190 -71.81 gain 190 220 -74.63 gain 220 190 -69.07 gain 190 221 -75.53 gain 221 190 -75.65 gain 190 222 -87.23 gain 222 190 -83.15 gain 190 223 -84.00 gain 223 190 -83.17 gain 190 224 -82.96 gain 224 190 -82.59 gain 191 192 -69.14 gain 192 191 -67.83 gain 191 193 -76.30 gain 193 191 -73.98 gain 191 194 -68.90 gain 194 191 -67.36 gain 191 195 -98.44 gain 195 191 -95.45 gain 191 196 -95.02 gain 196 191 -96.34 gain 191 197 -94.46 gain 197 191 -90.92 gain 191 198 -95.32 gain 198 191 -96.29 gain 191 199 -96.25 gain 199 191 -97.33 gain 191 200 -93.52 gain 200 191 -95.93 gain 191 201 -97.00 gain 201 191 -99.32 gain 191 202 -85.92 gain 202 191 -87.38 gain 191 203 -83.22 gain 203 191 -83.79 gain 191 204 -72.52 gain 204 191 -69.73 gain 191 205 -67.56 gain 205 191 -68.51 gain 191 206 -64.32 gain 206 191 -66.38 gain 191 207 -76.59 gain 207 191 -78.07 gain 191 208 -67.38 gain 208 191 -71.46 gain 191 209 -86.91 gain 209 191 -90.56 gain 191 210 -96.21 gain 210 191 -100.03 gain 191 211 -98.92 gain 211 191 -97.97 gain 191 212 -102.95 gain 212 191 -105.03 gain 191 213 -88.53 gain 213 191 -89.93 gain 191 214 -89.62 gain 214 191 -96.40 gain 191 215 -94.84 gain 215 191 -97.02 gain 191 216 -84.17 gain 216 191 -90.27 gain 191 217 -87.52 gain 217 191 -93.88 gain 191 218 -87.73 gain 218 191 -86.90 gain 191 219 -77.58 gain 219 191 -77.23 gain 191 220 -70.45 gain 220 191 -66.18 gain 191 221 -72.41 gain 221 191 -73.83 gain 191 222 -74.03 gain 222 191 -71.25 gain 191 223 -83.44 gain 223 191 -83.91 gain 191 224 -86.20 gain 224 191 -87.12 gain 192 193 -60.33 gain 193 192 -59.31 gain 192 194 -70.29 gain 194 192 -70.06 gain 192 195 -97.55 gain 195 192 -95.86 gain 192 196 -96.50 gain 196 192 -99.12 gain 192 197 -99.84 gain 197 192 -97.60 gain 192 198 -91.38 gain 198 192 -93.65 gain 192 199 -89.95 gain 199 192 -92.33 gain 192 200 -91.08 gain 200 192 -94.80 gain 192 201 -85.19 gain 201 192 -88.82 gain 192 202 -79.72 gain 202 192 -82.48 gain 192 203 -79.07 gain 203 192 -80.95 gain 192 204 -76.86 gain 204 192 -75.38 gain 192 205 -73.34 gain 205 192 -75.60 gain 192 206 -68.04 gain 206 192 -71.41 gain 192 207 -66.50 gain 207 192 -69.28 gain 192 208 -67.57 gain 208 192 -72.96 gain 192 209 -72.63 gain 209 192 -77.59 gain 192 210 -97.98 gain 210 192 -103.11 gain 192 211 -95.09 gain 211 192 -95.45 gain 192 212 -98.93 gain 212 192 -102.31 gain 192 213 -90.46 gain 213 192 -93.16 gain 192 214 -96.96 gain 214 192 -105.05 gain 192 215 -88.71 gain 215 192 -92.20 gain 192 216 -88.85 gain 216 192 -96.25 gain 192 217 -86.17 gain 217 192 -93.84 gain 192 218 -80.34 gain 218 192 -80.81 gain 192 219 -82.02 gain 219 192 -82.97 gain 192 220 -75.78 gain 220 192 -72.82 gain 192 221 -69.28 gain 221 192 -72.00 gain 192 222 -67.93 gain 222 192 -66.45 gain 192 223 -70.37 gain 223 192 -72.14 gain 192 224 -81.04 gain 224 192 -83.27 gain 193 194 -61.12 gain 194 193 -61.90 gain 193 195 -90.62 gain 195 193 -89.95 gain 193 196 -96.45 gain 196 193 -100.09 gain 193 197 -94.66 gain 197 193 -93.44 gain 193 198 -95.86 gain 198 193 -99.14 gain 193 199 -92.66 gain 199 193 -96.06 gain 193 200 -93.44 gain 200 193 -98.17 gain 193 201 -86.26 gain 201 193 -90.90 gain 193 202 -88.36 gain 202 193 -92.14 gain 193 203 -87.08 gain 203 193 -89.97 gain 193 204 -77.36 gain 204 193 -76.89 gain 193 205 -71.58 gain 205 193 -74.85 gain 193 206 -68.41 gain 206 193 -72.79 gain 193 207 -61.68 gain 207 193 -65.47 gain 193 208 -51.93 gain 208 193 -58.33 gain 193 209 -62.14 gain 209 193 -68.11 gain 193 210 -100.68 gain 210 193 -106.82 gain 193 211 -92.95 gain 211 193 -94.33 gain 193 212 -97.10 gain 212 193 -101.49 gain 193 213 -88.09 gain 213 193 -91.81 gain 193 214 -94.82 gain 214 193 -103.93 gain 193 215 -93.25 gain 215 193 -97.76 gain 193 216 -82.66 gain 216 193 -91.07 gain 193 217 -84.82 gain 217 193 -93.50 gain 193 218 -89.34 gain 218 193 -90.82 gain 193 219 -82.28 gain 219 193 -84.24 gain 193 220 -81.52 gain 220 193 -79.57 gain 193 221 -75.97 gain 221 193 -79.71 gain 193 222 -72.81 gain 222 193 -72.35 gain 193 223 -69.86 gain 223 193 -72.64 gain 193 224 -75.71 gain 224 193 -78.96 gain 194 195 -98.68 gain 195 194 -97.23 gain 194 196 -94.44 gain 196 194 -97.30 gain 194 197 -98.22 gain 197 194 -96.22 gain 194 198 -94.46 gain 198 194 -96.96 gain 194 199 -95.98 gain 199 194 -98.59 gain 194 200 -86.60 gain 200 194 -90.55 gain 194 201 -85.13 gain 201 194 -88.98 gain 194 202 -86.28 gain 202 194 -89.27 gain 194 203 -89.31 gain 203 194 -91.41 gain 194 204 -86.07 gain 204 194 -84.82 gain 194 205 -81.47 gain 205 194 -83.97 gain 194 206 -84.52 gain 206 194 -88.12 gain 194 207 -66.18 gain 207 194 -69.20 gain 194 208 -71.38 gain 208 194 -76.99 gain 194 209 -67.81 gain 209 194 -73.00 gain 194 210 -105.77 gain 210 194 -111.14 gain 194 211 -101.95 gain 211 194 -102.54 gain 194 212 -95.17 gain 212 194 -98.78 gain 194 213 -92.95 gain 213 194 -95.88 gain 194 214 -93.34 gain 214 194 -101.67 gain 194 215 -91.49 gain 215 194 -95.21 gain 194 216 -89.83 gain 216 194 -97.46 gain 194 217 -95.91 gain 217 194 -103.81 gain 194 218 -92.53 gain 218 194 -93.23 gain 194 219 -88.50 gain 219 194 -89.69 gain 194 220 -84.10 gain 220 194 -81.37 gain 194 221 -78.35 gain 221 194 -81.30 gain 194 222 -80.94 gain 222 194 -79.70 gain 194 223 -67.50 gain 223 194 -69.50 gain 194 224 -77.23 gain 224 194 -79.70 gain 195 196 -60.17 gain 196 195 -64.48 gain 195 197 -81.53 gain 197 195 -80.98 gain 195 198 -72.50 gain 198 195 -76.45 gain 195 199 -76.33 gain 199 195 -80.40 gain 195 200 -78.48 gain 200 195 -83.88 gain 195 201 -87.48 gain 201 195 -92.80 gain 195 202 -86.68 gain 202 195 -91.12 gain 195 203 -90.45 gain 203 195 -94.01 gain 195 204 -90.72 gain 204 195 -90.93 gain 195 205 -94.82 gain 205 195 -98.76 gain 195 206 -91.18 gain 206 195 -96.23 gain 195 207 -97.07 gain 207 195 -101.54 gain 195 208 -95.38 gain 208 195 -102.45 gain 195 209 -103.02 gain 209 195 -109.66 gain 195 210 -63.40 gain 210 195 -70.22 gain 195 211 -52.75 gain 211 195 -54.80 gain 195 212 -72.68 gain 212 195 -77.74 gain 195 213 -71.72 gain 213 195 -76.11 gain 195 214 -74.97 gain 214 195 -84.74 gain 195 215 -75.40 gain 215 195 -80.58 gain 195 216 -85.98 gain 216 195 -95.07 gain 195 217 -92.89 gain 217 195 -102.24 gain 195 218 -97.70 gain 218 195 -99.86 gain 195 219 -95.81 gain 219 195 -98.45 gain 195 220 -88.82 gain 220 195 -87.54 gain 195 221 -91.33 gain 221 195 -95.74 gain 195 222 -97.05 gain 222 195 -97.26 gain 195 223 -99.18 gain 223 195 -102.64 gain 195 224 -99.40 gain 224 195 -103.32 gain 196 197 -56.54 gain 197 196 -51.68 gain 196 198 -81.06 gain 198 196 -80.71 gain 196 199 -78.75 gain 199 196 -78.51 gain 196 200 -81.95 gain 200 196 -83.04 gain 196 201 -82.51 gain 201 196 -83.51 gain 196 202 -92.87 gain 202 196 -93.01 gain 196 203 -93.40 gain 203 196 -92.65 gain 196 204 -92.18 gain 204 196 -88.07 gain 196 205 -96.26 gain 205 196 -95.90 gain 196 206 -96.47 gain 206 196 -97.21 gain 196 207 -99.28 gain 207 196 -99.44 gain 196 208 -95.54 gain 208 196 -98.30 gain 196 209 -95.49 gain 209 196 -97.82 gain 196 210 -72.73 gain 210 196 -75.24 gain 196 211 -64.85 gain 211 196 -62.58 gain 196 212 -67.44 gain 212 196 -68.19 gain 196 213 -66.59 gain 213 196 -66.67 gain 196 214 -84.64 gain 214 196 -90.11 gain 196 215 -87.47 gain 215 196 -88.34 gain 196 216 -94.57 gain 216 196 -99.34 gain 196 217 -89.98 gain 217 196 -95.02 gain 196 218 -93.37 gain 218 196 -91.21 gain 196 219 -97.61 gain 219 196 -95.93 gain 196 220 -96.37 gain 220 196 -90.78 gain 196 221 -92.11 gain 221 196 -92.20 gain 196 222 -92.71 gain 222 196 -88.61 gain 196 223 -93.01 gain 223 196 -92.15 gain 196 224 -96.68 gain 224 196 -96.29 gain 197 198 -52.58 gain 198 197 -57.09 gain 197 199 -73.93 gain 199 197 -78.55 gain 197 200 -70.57 gain 200 197 -76.53 gain 197 201 -79.73 gain 201 197 -85.60 gain 197 202 -82.69 gain 202 197 -87.69 gain 197 203 -83.51 gain 203 197 -87.62 gain 197 204 -87.09 gain 204 197 -87.85 gain 197 205 -86.12 gain 205 197 -90.61 gain 197 206 -84.82 gain 206 197 -90.42 gain 197 207 -97.90 gain 207 197 -102.93 gain 197 208 -95.95 gain 208 197 -103.58 gain 197 209 -94.73 gain 209 197 -101.92 gain 197 210 -68.13 gain 210 197 -75.50 gain 197 211 -70.65 gain 211 197 -73.25 gain 197 212 -61.64 gain 212 197 -67.25 gain 197 213 -66.88 gain 213 197 -71.82 gain 197 214 -76.13 gain 214 197 -86.46 gain 197 215 -74.86 gain 215 197 -80.59 gain 197 216 -76.47 gain 216 197 -86.11 gain 197 217 -78.79 gain 217 197 -88.70 gain 197 218 -83.44 gain 218 197 -86.15 gain 197 219 -82.34 gain 219 197 -85.53 gain 197 220 -90.16 gain 220 197 -89.43 gain 197 221 -85.43 gain 221 197 -90.39 gain 197 222 -95.31 gain 222 197 -96.07 gain 197 223 -92.25 gain 223 197 -96.25 gain 197 224 -87.50 gain 224 197 -91.98 gain 198 199 -64.12 gain 199 198 -64.23 gain 198 200 -73.83 gain 200 198 -75.27 gain 198 201 -84.21 gain 201 198 -85.56 gain 198 202 -86.16 gain 202 198 -86.64 gain 198 203 -85.84 gain 203 198 -85.44 gain 198 204 -91.02 gain 204 198 -87.26 gain 198 205 -86.51 gain 205 198 -86.50 gain 198 206 -92.23 gain 206 198 -93.32 gain 198 207 -97.75 gain 207 198 -98.27 gain 198 208 -94.41 gain 208 198 -97.52 gain 198 209 -98.71 gain 209 198 -101.39 gain 198 210 -82.27 gain 210 198 -85.13 gain 198 211 -75.22 gain 211 198 -73.31 gain 198 212 -71.54 gain 212 198 -72.64 gain 198 213 -67.31 gain 213 198 -67.74 gain 198 214 -72.50 gain 214 198 -78.31 gain 198 215 -68.05 gain 215 198 -69.27 gain 198 216 -77.26 gain 216 198 -82.39 gain 198 217 -76.39 gain 217 198 -81.79 gain 198 218 -89.06 gain 218 198 -87.26 gain 198 219 -88.26 gain 219 198 -86.94 gain 198 220 -92.40 gain 220 198 -87.17 gain 198 221 -99.98 gain 221 198 -100.43 gain 198 222 -91.91 gain 222 198 -88.16 gain 198 223 -95.38 gain 223 198 -94.88 gain 198 224 -101.16 gain 224 198 -101.12 gain 199 200 -71.39 gain 200 199 -72.73 gain 199 201 -72.50 gain 201 199 -73.74 gain 199 202 -78.47 gain 202 199 -78.85 gain 199 203 -85.47 gain 203 199 -84.96 gain 199 204 -90.22 gain 204 199 -86.35 gain 199 205 -88.85 gain 205 199 -88.72 gain 199 206 -91.35 gain 206 199 -92.34 gain 199 207 -86.99 gain 207 199 -87.40 gain 199 208 -95.83 gain 208 199 -98.83 gain 199 209 -100.35 gain 209 199 -102.92 gain 199 210 -89.89 gain 210 199 -92.64 gain 199 211 -79.62 gain 211 199 -77.60 gain 199 212 -71.10 gain 212 199 -72.10 gain 199 213 -71.26 gain 213 199 -71.58 gain 199 214 -65.91 gain 214 199 -71.62 gain 199 215 -73.39 gain 215 199 -74.50 gain 199 216 -74.42 gain 216 199 -79.44 gain 199 217 -79.02 gain 217 199 -84.31 gain 199 218 -85.55 gain 218 199 -83.64 gain 199 219 -87.56 gain 219 199 -86.14 gain 199 220 -94.99 gain 220 199 -89.65 gain 199 221 -80.37 gain 221 199 -80.71 gain 199 222 -92.65 gain 222 199 -88.80 gain 199 223 -95.60 gain 223 199 -94.98 gain 199 224 -101.61 gain 224 199 -101.46 gain 200 201 -67.55 gain 201 200 -67.46 gain 200 202 -75.87 gain 202 200 -74.91 gain 200 203 -82.86 gain 203 200 -81.02 gain 200 204 -84.21 gain 204 200 -79.00 gain 200 205 -84.72 gain 205 200 -83.26 gain 200 206 -90.95 gain 206 200 -90.60 gain 200 207 -90.61 gain 207 200 -89.68 gain 200 208 -88.49 gain 208 200 -90.16 gain 200 209 -98.06 gain 209 200 -99.30 gain 200 210 -87.39 gain 210 200 -88.81 gain 200 211 -93.34 gain 211 200 -89.99 gain 200 212 -84.31 gain 212 200 -83.97 gain 200 213 -78.81 gain 213 200 -77.80 gain 200 214 -74.01 gain 214 200 -78.38 gain 200 215 -69.58 gain 215 200 -69.36 gain 200 216 -69.50 gain 216 200 -73.18 gain 200 217 -75.23 gain 217 200 -79.18 gain 200 218 -80.85 gain 218 200 -77.60 gain 200 219 -89.13 gain 219 200 -86.37 gain 200 220 -90.68 gain 220 200 -84.00 gain 200 221 -98.64 gain 221 200 -97.65 gain 200 222 -90.77 gain 222 200 -85.57 gain 200 223 -97.22 gain 223 200 -95.27 gain 200 224 -93.32 gain 224 200 -91.84 gain 201 202 -65.32 gain 202 201 -64.46 gain 201 203 -77.48 gain 203 201 -75.72 gain 201 204 -81.63 gain 204 201 -76.52 gain 201 205 -85.86 gain 205 201 -84.49 gain 201 206 -87.02 gain 206 201 -86.76 gain 201 207 -91.43 gain 207 201 -90.59 gain 201 208 -94.77 gain 208 201 -96.53 gain 201 209 -91.76 gain 209 201 -93.10 gain 201 210 -85.43 gain 210 201 -86.94 gain 201 211 -93.95 gain 211 201 -90.69 gain 201 212 -84.57 gain 212 201 -84.32 gain 201 213 -82.46 gain 213 201 -81.54 gain 201 214 -76.48 gain 214 201 -80.94 gain 201 215 -73.70 gain 215 201 -73.57 gain 201 216 -65.85 gain 216 201 -69.63 gain 201 217 -64.85 gain 217 201 -68.89 gain 201 218 -80.26 gain 218 201 -77.11 gain 201 219 -85.17 gain 219 201 -82.50 gain 201 220 -86.41 gain 220 201 -79.83 gain 201 221 -86.00 gain 221 201 -85.10 gain 201 222 -85.09 gain 222 201 -79.99 gain 201 223 -90.90 gain 223 201 -89.04 gain 201 224 -100.69 gain 224 201 -99.30 gain 202 203 -63.53 gain 203 202 -62.64 gain 202 204 -80.69 gain 204 202 -76.44 gain 202 205 -77.38 gain 205 202 -76.88 gain 202 206 -83.65 gain 206 202 -84.26 gain 202 207 -87.69 gain 207 202 -87.71 gain 202 208 -90.76 gain 208 202 -93.39 gain 202 209 -83.46 gain 209 202 -85.65 gain 202 210 -87.72 gain 210 202 -90.09 gain 202 211 -88.86 gain 211 202 -86.46 gain 202 212 -81.29 gain 212 202 -81.90 gain 202 213 -81.95 gain 213 202 -81.89 gain 202 214 -86.54 gain 214 202 -91.87 gain 202 215 -76.95 gain 215 202 -77.68 gain 202 216 -72.02 gain 216 202 -76.66 gain 202 217 -68.88 gain 217 202 -73.78 gain 202 218 -67.46 gain 218 202 -65.17 gain 202 219 -80.41 gain 219 202 -78.60 gain 202 220 -82.39 gain 220 202 -76.67 gain 202 221 -83.69 gain 221 202 -83.65 gain 202 222 -88.89 gain 222 202 -84.65 gain 202 223 -91.24 gain 223 202 -90.25 gain 202 224 -89.13 gain 224 202 -88.60 gain 203 204 -59.28 gain 204 203 -55.92 gain 203 205 -75.38 gain 205 203 -75.76 gain 203 206 -88.58 gain 206 203 -90.07 gain 203 207 -87.48 gain 207 203 -88.39 gain 203 208 -90.49 gain 208 203 -94.00 gain 203 209 -83.87 gain 209 203 -86.95 gain 203 210 -93.61 gain 210 203 -96.86 gain 203 211 -85.98 gain 211 203 -84.48 gain 203 212 -91.81 gain 212 203 -93.31 gain 203 213 -83.10 gain 213 203 -83.93 gain 203 214 -77.57 gain 214 203 -83.79 gain 203 215 -88.81 gain 215 203 -90.43 gain 203 216 -88.43 gain 216 203 -93.96 gain 203 217 -69.47 gain 217 203 -75.26 gain 203 218 -63.67 gain 218 203 -62.26 gain 203 219 -70.18 gain 219 203 -69.26 gain 203 220 -78.31 gain 220 203 -73.48 gain 203 221 -82.65 gain 221 203 -83.50 gain 203 222 -79.96 gain 222 203 -76.61 gain 203 223 -89.54 gain 223 203 -89.43 gain 203 224 -88.32 gain 224 203 -88.68 gain 204 205 -64.26 gain 205 204 -68.00 gain 204 206 -69.28 gain 206 204 -74.13 gain 204 207 -76.14 gain 207 204 -80.41 gain 204 208 -80.19 gain 208 204 -87.06 gain 204 209 -83.17 gain 209 204 -89.61 gain 204 210 -98.39 gain 210 204 -105.01 gain 204 211 -96.18 gain 211 204 -98.03 gain 204 212 -87.52 gain 212 204 -92.38 gain 204 213 -91.15 gain 213 204 -95.34 gain 204 214 -83.02 gain 214 204 -92.60 gain 204 215 -82.35 gain 215 204 -87.33 gain 204 216 -71.46 gain 216 204 -80.35 gain 204 217 -75.58 gain 217 204 -84.73 gain 204 218 -64.79 gain 218 204 -66.75 gain 204 219 -60.85 gain 219 204 -63.28 gain 204 220 -61.99 gain 220 204 -60.52 gain 204 221 -71.66 gain 221 204 -75.86 gain 204 222 -84.77 gain 222 204 -84.77 gain 204 223 -79.77 gain 223 204 -83.02 gain 204 224 -83.78 gain 224 204 -87.49 gain 205 206 -66.69 gain 206 205 -67.80 gain 205 207 -77.76 gain 207 205 -78.29 gain 205 208 -75.40 gain 208 205 -78.53 gain 205 209 -79.97 gain 209 205 -82.67 gain 205 210 -97.68 gain 210 205 -100.55 gain 205 211 -95.25 gain 211 205 -93.35 gain 205 212 -91.83 gain 212 205 -92.95 gain 205 213 -97.55 gain 213 205 -98.00 gain 205 214 -95.73 gain 214 205 -101.56 gain 205 215 -90.38 gain 215 205 -91.61 gain 205 216 -84.27 gain 216 205 -89.41 gain 205 217 -76.31 gain 217 205 -81.72 gain 205 218 -80.13 gain 218 205 -78.34 gain 205 219 -69.39 gain 219 205 -68.09 gain 205 220 -62.17 gain 220 205 -56.95 gain 205 221 -59.35 gain 221 205 -59.81 gain 205 222 -80.19 gain 222 205 -76.45 gain 205 223 -82.43 gain 223 205 -81.93 gain 205 224 -88.10 gain 224 205 -88.07 gain 206 207 -65.07 gain 207 206 -64.49 gain 206 208 -78.42 gain 208 206 -80.44 gain 206 209 -75.08 gain 209 206 -76.67 gain 206 210 -94.08 gain 210 206 -95.85 gain 206 211 -92.32 gain 211 206 -89.32 gain 206 212 -93.70 gain 212 206 -93.71 gain 206 213 -94.59 gain 213 206 -93.93 gain 206 214 -89.30 gain 214 206 -94.03 gain 206 215 -95.03 gain 215 206 -95.15 gain 206 216 -83.03 gain 216 206 -87.06 gain 206 217 -85.95 gain 217 206 -90.25 gain 206 218 -79.13 gain 218 206 -76.23 gain 206 219 -77.50 gain 219 206 -75.09 gain 206 220 -71.78 gain 220 206 -65.45 gain 206 221 -76.05 gain 221 206 -75.40 gain 206 222 -68.98 gain 222 206 -64.13 gain 206 223 -78.19 gain 223 206 -76.59 gain 206 224 -84.93 gain 224 206 -83.80 gain 207 208 -64.82 gain 208 207 -67.42 gain 207 209 -83.09 gain 209 207 -85.26 gain 207 210 -98.57 gain 210 207 -100.92 gain 207 211 -103.13 gain 211 207 -100.71 gain 207 212 -101.74 gain 212 207 -102.34 gain 207 213 -89.40 gain 213 207 -89.32 gain 207 214 -97.87 gain 214 207 -103.18 gain 207 215 -99.52 gain 215 207 -100.22 gain 207 216 -91.87 gain 216 207 -96.48 gain 207 217 -89.24 gain 217 207 -94.12 gain 207 218 -86.23 gain 218 207 -83.92 gain 207 219 -88.23 gain 219 207 -86.40 gain 207 220 -74.74 gain 220 207 -69.00 gain 207 221 -71.68 gain 221 207 -71.61 gain 207 222 -55.83 gain 222 207 -51.57 gain 207 223 -75.69 gain 223 207 -74.67 gain 207 224 -79.32 gain 224 207 -78.77 gain 208 209 -69.04 gain 209 208 -68.61 gain 208 210 -102.09 gain 210 208 -101.84 gain 208 211 -101.42 gain 211 208 -96.40 gain 208 212 -101.55 gain 212 208 -99.54 gain 208 213 -96.96 gain 213 208 -94.28 gain 208 214 -94.60 gain 214 208 -97.31 gain 208 215 -97.62 gain 215 208 -95.73 gain 208 216 -95.16 gain 216 208 -97.18 gain 208 217 -96.37 gain 217 208 -98.65 gain 208 218 -88.61 gain 218 208 -83.69 gain 208 219 -88.90 gain 219 208 -84.47 gain 208 220 -84.07 gain 220 208 -75.72 gain 208 221 -86.09 gain 221 208 -83.43 gain 208 222 -67.26 gain 222 208 -60.40 gain 208 223 -71.68 gain 223 208 -68.06 gain 208 224 -75.90 gain 224 208 -72.74 gain 209 210 -104.79 gain 210 209 -104.96 gain 209 211 -101.49 gain 211 209 -96.90 gain 209 212 -95.09 gain 212 209 -93.51 gain 209 213 -104.79 gain 213 209 -102.53 gain 209 214 -102.09 gain 214 209 -105.22 gain 209 215 -94.69 gain 215 209 -93.22 gain 209 216 -90.63 gain 216 209 -93.07 gain 209 217 -86.95 gain 217 209 -89.66 gain 209 218 -82.73 gain 218 209 -78.25 gain 209 219 -83.46 gain 219 209 -79.45 gain 209 220 -86.75 gain 220 209 -78.83 gain 209 221 -78.81 gain 221 209 -76.57 gain 209 222 -79.96 gain 222 209 -73.53 gain 209 223 -66.64 gain 223 209 -63.45 gain 209 224 -73.43 gain 224 209 -70.71 gain 210 211 -67.69 gain 211 210 -62.92 gain 210 212 -74.23 gain 212 210 -72.47 gain 210 213 -87.64 gain 213 210 -85.21 gain 210 214 -89.60 gain 214 210 -92.56 gain 210 215 -83.64 gain 215 210 -82.00 gain 210 216 -82.38 gain 216 210 -84.65 gain 210 217 -99.47 gain 217 210 -102.00 gain 210 218 -101.00 gain 218 210 -96.34 gain 210 219 -100.96 gain 219 210 -96.78 gain 210 220 -96.15 gain 220 210 -88.05 gain 210 221 -101.57 gain 221 210 -99.16 gain 210 222 -100.41 gain 222 210 -93.80 gain 210 223 -98.95 gain 223 210 -95.59 gain 210 224 -97.08 gain 224 210 -94.19 gain 211 212 -70.11 gain 212 211 -73.12 gain 211 213 -70.98 gain 213 211 -73.32 gain 211 214 -73.07 gain 214 211 -80.80 gain 211 215 -84.37 gain 215 211 -87.50 gain 211 216 -82.83 gain 216 211 -89.87 gain 211 217 -97.32 gain 217 211 -104.62 gain 211 218 -89.03 gain 218 211 -89.14 gain 211 219 -83.75 gain 219 211 -84.34 gain 211 220 -88.54 gain 220 211 -85.22 gain 211 221 -93.68 gain 221 211 -96.04 gain 211 222 -93.33 gain 222 211 -91.49 gain 211 223 -98.39 gain 223 211 -99.79 gain 211 224 -99.72 gain 224 211 -101.59 gain 212 213 -74.45 gain 213 212 -73.78 gain 212 214 -76.27 gain 214 212 -80.99 gain 212 215 -78.71 gain 215 212 -78.82 gain 212 216 -83.90 gain 216 212 -87.93 gain 212 217 -81.99 gain 217 212 -86.28 gain 212 218 -88.38 gain 218 212 -85.47 gain 212 219 -91.26 gain 219 212 -88.83 gain 212 220 -86.38 gain 220 212 -80.04 gain 212 221 -93.82 gain 221 212 -93.16 gain 212 222 -99.32 gain 222 212 -94.47 gain 212 223 -95.74 gain 223 212 -94.13 gain 212 224 -94.15 gain 224 212 -93.01 gain 213 214 -68.45 gain 214 213 -73.83 gain 213 215 -72.01 gain 215 213 -72.80 gain 213 216 -79.20 gain 216 213 -83.90 gain 213 217 -81.80 gain 217 213 -86.76 gain 213 218 -82.08 gain 218 213 -79.85 gain 213 219 -95.37 gain 219 213 -93.62 gain 213 220 -89.68 gain 220 213 -84.02 gain 213 221 -93.76 gain 221 213 -93.78 gain 213 222 -97.11 gain 222 213 -92.93 gain 213 223 -97.81 gain 223 213 -96.88 gain 213 224 -109.50 gain 224 213 -109.03 gain 214 215 -79.22 gain 215 214 -74.62 gain 214 216 -80.26 gain 216 214 -79.57 gain 214 217 -85.66 gain 217 214 -85.23 gain 214 218 -82.17 gain 218 214 -74.55 gain 214 219 -92.75 gain 219 214 -85.61 gain 214 220 -99.65 gain 220 214 -88.60 gain 214 221 -91.20 gain 221 214 -85.83 gain 214 222 -94.56 gain 222 214 -85.00 gain 214 223 -105.04 gain 223 214 -98.72 gain 214 224 -103.47 gain 224 214 -97.61 gain 215 216 -64.58 gain 216 215 -68.49 gain 215 217 -75.64 gain 217 215 -79.82 gain 215 218 -84.02 gain 218 215 -81.00 gain 215 219 -82.18 gain 219 215 -79.64 gain 215 220 -85.82 gain 220 215 -79.37 gain 215 221 -92.95 gain 221 215 -92.18 gain 215 222 -87.37 gain 222 215 -82.40 gain 215 223 -97.96 gain 223 215 -96.23 gain 215 224 -97.77 gain 224 215 -96.52 gain 216 217 -70.04 gain 217 216 -70.31 gain 216 218 -86.39 gain 218 216 -79.46 gain 216 219 -81.42 gain 219 216 -74.97 gain 216 220 -90.83 gain 220 216 -80.47 gain 216 221 -94.16 gain 221 216 -89.48 gain 216 222 -93.07 gain 222 216 -84.20 gain 216 223 -100.42 gain 223 216 -94.79 gain 216 224 -103.07 gain 224 216 -97.90 gain 217 218 -74.80 gain 218 217 -67.61 gain 217 219 -85.35 gain 219 217 -78.64 gain 217 220 -79.75 gain 220 217 -69.12 gain 217 221 -88.57 gain 221 217 -83.62 gain 217 222 -93.20 gain 222 217 -84.06 gain 217 223 -98.46 gain 223 217 -92.56 gain 217 224 -91.65 gain 224 217 -86.22 gain 218 219 -66.05 gain 219 218 -66.53 gain 218 220 -75.56 gain 220 218 -72.13 gain 218 221 -73.39 gain 221 218 -75.64 gain 218 222 -81.93 gain 222 218 -79.99 gain 218 223 -82.86 gain 223 218 -84.15 gain 218 224 -90.10 gain 224 218 -91.86 gain 219 220 -67.29 gain 220 219 -63.38 gain 219 221 -73.60 gain 221 219 -75.36 gain 219 222 -74.44 gain 222 219 -72.01 gain 219 223 -82.32 gain 223 219 -83.13 gain 219 224 -86.70 gain 224 219 -87.98 gain 220 221 -59.96 gain 221 220 -65.64 gain 220 222 -69.94 gain 222 220 -71.43 gain 220 223 -76.21 gain 223 220 -80.94 gain 220 224 -76.05 gain 224 220 -81.24 gain 221 222 -63.61 gain 222 221 -59.42 gain 221 223 -77.44 gain 223 221 -76.49 gain 221 224 -80.59 gain 224 221 -80.10 gain 222 223 -59.59 gain 223 222 -62.83 gain 222 224 -74.83 gain 224 222 -78.54 gain 223 224 -64.23 gain 224 223 -64.70 noise 0 -107.96 4.00 noise 1 -102.14 4.00 noise 2 -103.55 4.00 noise 3 -107.94 4.00 noise 4 -106.61 4.00 noise 5 -108.81 4.00 noise 6 -105.00 4.00 noise 7 -106.59 4.00 noise 8 -105.74 4.00 noise 9 -104.51 4.00 noise 10 -105.57 4.00 noise 11 -102.63 4.00 noise 12 -105.46 4.00 noise 13 -103.67 4.00 noise 14 -101.83 4.00 noise 15 -104.39 4.00 noise 16 -104.33 4.00 noise 17 -105.36 4.00 noise 18 -104.31 4.00 noise 19 -106.05 4.00 noise 20 -104.29 4.00 noise 21 -102.17 4.00 noise 22 -105.89 4.00 noise 23 -106.49 4.00 noise 24 -105.15 4.00 noise 25 -103.49 4.00 noise 26 -103.27 4.00 noise 27 -103.05 4.00 noise 28 -109.83 4.00 noise 29 -105.45 4.00 noise 30 -103.30 4.00 noise 31 -106.20 4.00 noise 32 -104.83 4.00 noise 33 -108.42 4.00 noise 34 -107.49 4.00 noise 35 -104.79 4.00 noise 36 -104.57 4.00 noise 37 -103.81 4.00 noise 38 -105.32 4.00 noise 39 -101.79 4.00 noise 40 -107.18 4.00 noise 41 -108.98 4.00 noise 42 -104.54 4.00 noise 43 -103.78 4.00 noise 44 -101.29 4.00 noise 45 -103.04 4.00 noise 46 -101.71 4.00 noise 47 -105.70 4.00 noise 48 -105.95 4.00 noise 49 -104.81 4.00 noise 50 -105.76 4.00 noise 51 -104.39 4.00 noise 52 -105.50 4.00 noise 53 -104.76 4.00 noise 54 -103.87 4.00 noise 55 -107.94 4.00 noise 56 -106.21 4.00 noise 57 -102.57 4.00 noise 58 -108.67 4.00 noise 59 -108.49 4.00 noise 60 -101.09 4.00 noise 61 -106.75 4.00 noise 62 -105.89 4.00 noise 63 -105.63 4.00 noise 64 -105.21 4.00 noise 65 -106.70 4.00 noise 66 -105.20 4.00 noise 67 -103.78 4.00 noise 68 -103.54 4.00 noise 69 -105.60 4.00 noise 70 -108.26 4.00 noise 71 -104.10 4.00 noise 72 -107.74 4.00 noise 73 -107.17 4.00 noise 74 -109.12 4.00 noise 75 -102.11 4.00 noise 76 -102.35 4.00 noise 77 -107.43 4.00 noise 78 -105.30 4.00 noise 79 -102.05 4.00 noise 80 -105.01 4.00 noise 81 -106.69 4.00 noise 82 -104.25 4.00 noise 83 -106.55 4.00 noise 84 -105.81 4.00 noise 85 -105.35 4.00 noise 86 -101.90 4.00 noise 87 -105.91 4.00 noise 88 -105.17 4.00 noise 89 -102.68 4.00 noise 90 -103.33 4.00 noise 91 -102.72 4.00 noise 92 -102.19 4.00 noise 93 -104.62 4.00 noise 94 -107.11 4.00 noise 95 -105.85 4.00 noise 96 -102.73 4.00 noise 97 -106.00 4.00 noise 98 -106.23 4.00 noise 99 -109.34 4.00 noise 100 -104.19 4.00 noise 101 -105.56 4.00 noise 102 -106.47 4.00 noise 103 -104.93 4.00 noise 104 -102.02 4.00 noise 105 -103.98 4.00 noise 106 -106.92 4.00 noise 107 -104.94 4.00 noise 108 -105.32 4.00 noise 109 -106.48 4.00 noise 110 -103.62 4.00 noise 111 -107.14 4.00 noise 112 -105.69 4.00 noise 113 -103.91 4.00 noise 114 -106.58 4.00 noise 115 -104.76 4.00 noise 116 -105.81 4.00 noise 117 -107.57 4.00 noise 118 -105.61 4.00 noise 119 -104.80 4.00 noise 120 -105.56 4.00 noise 121 -101.83 4.00 noise 122 -104.75 4.00 noise 123 -104.33 4.00 noise 124 -105.18 4.00 noise 125 -103.77 4.00 noise 126 -102.99 4.00 noise 127 -105.24 4.00 noise 128 -104.70 4.00 noise 129 -106.44 4.00 noise 130 -105.71 4.00 noise 131 -105.68 4.00 noise 132 -109.54 4.00 noise 133 -103.21 4.00 noise 134 -104.70 4.00 noise 135 -104.87 4.00 noise 136 -105.16 4.00 noise 137 -100.10 4.00 noise 138 -107.09 4.00 noise 139 -106.97 4.00 noise 140 -105.97 4.00 noise 141 -110.76 4.00 noise 142 -104.63 4.00 noise 143 -103.05 4.00 noise 144 -104.72 4.00 noise 145 -102.08 4.00 noise 146 -104.29 4.00 noise 147 -107.63 4.00 noise 148 -106.26 4.00 noise 149 -107.66 4.00 noise 150 -104.62 4.00 noise 151 -104.32 4.00 noise 152 -105.95 4.00 noise 153 -107.90 4.00 noise 154 -104.05 4.00 noise 155 -105.61 4.00 noise 156 -106.50 4.00 noise 157 -107.23 4.00 noise 158 -104.61 4.00 noise 159 -102.21 4.00 noise 160 -104.39 4.00 noise 161 -102.77 4.00 noise 162 -104.82 4.00 noise 163 -103.61 4.00 noise 164 -105.32 4.00 noise 165 -105.68 4.00 noise 166 -107.07 4.00 noise 167 -103.66 4.00 noise 168 -103.98 4.00 noise 169 -104.68 4.00 noise 170 -106.21 4.00 noise 171 -104.07 4.00 noise 172 -104.75 4.00 noise 173 -104.39 4.00 noise 174 -105.78 4.00 noise 175 -106.17 4.00 noise 176 -104.66 4.00 noise 177 -104.68 4.00 noise 178 -107.77 4.00 noise 179 -106.23 4.00 noise 180 -101.38 4.00 noise 181 -105.81 4.00 noise 182 -106.29 4.00 noise 183 -106.26 4.00 noise 184 -102.70 4.00 noise 185 -100.71 4.00 noise 186 -105.14 4.00 noise 187 -105.16 4.00 noise 188 -103.78 4.00 noise 189 -105.91 4.00 noise 190 -104.62 4.00 noise 191 -104.01 4.00 noise 192 -104.84 4.00 noise 193 -105.51 4.00 noise 194 -105.18 4.00 noise 195 -106.34 4.00 noise 196 -106.84 4.00 noise 197 -106.69 4.00 noise 198 -105.25 4.00 noise 199 -103.68 4.00 noise 200 -104.03 4.00 noise 201 -104.74 4.00 noise 202 -104.74 4.00 noise 203 -102.63 4.00 noise 204 -108.15 4.00 noise 205 -107.32 4.00 noise 206 -103.93 4.00 noise 207 -103.67 4.00 noise 208 -104.88 4.00 noise 209 -103.33 4.00 noise 210 -103.77 4.00 noise 211 -107.35 4.00 noise 212 -104.40 4.00 noise 213 -102.55 4.00 noise 214 -99.68 4.00 noise 215 -102.74 4.00 noise 216 -102.16 4.00 noise 217 -102.66 4.00 noise 218 -107.37 4.00 noise 219 -105.53 4.00 noise 220 -109.69 4.00 noise 221 -104.91 4.00 noise 222 -107.83 4.00 noise 223 -103.71 4.00 noise 224 -102.76 4.00 tinyos-2.1.2+dfsg/apps/tests/TestEui/000077500000000000000000000000001207233610700174505ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestEui/Makefile000066400000000000000000000001151207233610700211050ustar00rootroot00000000000000COMPONENT=TestEuiAppC CFLAGS += -I$(TOSDIR)/lib/printf include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestEui/README.txt000066400000000000000000000007361207233610700211540ustar00rootroot00000000000000$Id: README.txt,v 1.1 2008-10-31 17:01:31 sallai Exp $ README for TestEui Author/Contact: tinyos-help@millennium.berkeley.edu Description: The TestEui application prints out the IEEE EUI64 of the device periodically using printf. Currently supported platforms: iris. Tools: net.tinyos.tools.PrintfClient is a Java application that displays the output on the PC. Usage: java net.tinyos.tools.PrintfClient -comm serial@: Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/TestEui/TestEuiAppC.nc000066400000000000000000000040641207233610700221240ustar00rootroot00000000000000// $Id: TestEuiAppC.nc,v 1.2 2010-06-29 22:07:22 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ #include "printf.h" /** * This application reads the 64-bit EUI of the device at initialization time * and then periodically prints it out using printf. * */ configuration TestEuiAppC{} implementation { components MainC, TestEuiC, LedsC, LocalIeeeEui64C, new TimerMilliC(); MainC.Boot <- TestEuiC; TestEuiC.Timer -> TimerMilliC; TestEuiC -> LedsC.Leds; TestEuiC.LocalIeeeEui64 -> LocalIeeeEui64C; } tinyos-2.1.2+dfsg/apps/tests/TestEui/TestEuiC.nc000066400000000000000000000044401207233610700214610ustar00rootroot00000000000000// $Id: TestEuiC.nc,v 1.2 2010-06-29 22:07:23 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ /** * This application reads the 64-bit EUI of the device at initialization time * and then periodically, and prints it out using printf. * */ module TestEuiC { uses interface Boot; uses interface Timer; uses interface Leds; uses interface LocalIeeeEui64; } implementation { void print() { } event void Boot.booted() { call Timer.startPeriodic(1000); } event void Timer.fired() { int i; ieee_eui64_t id; call Leds.led0Toggle(); id = call LocalIeeeEui64.getId(); printf("IEEE 64-bit UID: "); for(i=0;i<8;i++) { printf("%d ", id.data[i]); } printf("\n"); printfflush(); } } tinyos-2.1.2+dfsg/apps/tests/TestFtsp/000077500000000000000000000000001207233610700176425ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestFtsp/Ftsp/000077500000000000000000000000001207233610700205565ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestFtsp/Ftsp/FtspDataAnalyzer.m000077500000000000000000000034261207233610700241600ustar00rootroot00000000000000%load file written out by FtspDataLogger.java class %arg0 - filename, e.g. '1205543689171.report' function FTSPDataAnalyzer(file, varargin) [c1 c2 c3 c4 c5]= textread(file, '%u %u %u %u %u', 'commentstyle', 'shell'); data = [c2 c3 c4 c5]; %skipping the first column (java time) data1 = sortrows(sortrows(data,1),2); newdata = []; row=1; newrow=1; unsynced=0; while (row<=size(data1,1)) seqnum=data1(row,2); data2=[]; row2=1; tmprow1=row; while (row <= size(data1,1) && data1(row,2)==seqnum) if (data1(row,4)==0) data2(row2,1)=data1(row,3); row2= row2+ 1; else unsynced=unsynced+1; end row = row + 1; end if (row2>1) row2size=row2-1; rcvdsize=row-tmprow1; newdata(newrow,1) = seqnum; newdata(newrow,2) = mad(data2(1:row2size,1)); newdata(newrow,3) = mean(data2(1:row2size,1)); newdata(newrow,4) = row2size/rcvdsize; newrow = newrow + 1; end end if (length(newdata)==0) disp('no data found (at least one data point from a synchronized mote is required)!'); else newsize=newrow-1; subplot(3,1,1); plot(newdata(1:newsize,1),newdata(1:newsize,2)); title(sprintf('TimeSync Errors')); subplot(3,1,2); plot(newdata(1:newsize,1),newdata(1:newsize,3)); title(sprintf('Avg Glob Time')); subplot(3,1,3); plot(newdata(1:newsize,1),newdata(1:newsize,4),'b-'); title(sprintf('%% Synced Motes')); disp(sprintf('total unsycned num %d (all %d)',unsynced,newsize)); disp(sprintf('avg %0.3f',mean(newdata(1:newsize,2)))); disp(sprintf('max %d',max(newdata(1:newsize,2)))); savedata = newdata(1:newsize,:); save data.out savedata -ASCII; end tinyos-2.1.2+dfsg/apps/tests/TestFtsp/Ftsp/FtspDataLogger.java000077500000000000000000000120771207233610700243010ustar00rootroot00000000000000/* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * @author Brano Kusy */ import java.io.FileOutputStream; import java.io.PrintStream; import net.tinyos.message.*; import net.tinyos.util.*; public class FtspDataLogger implements MessageListener { public class RunWhenShuttingDown extends Thread { public void run() { System.out.println("Control-C caught. Shutting down..."); if (outReport!=null) outReport.close(); } } MoteIF mote; // For talking to the antitheft root node void connect() { try { mote = new MoteIF(PrintStreamMessenger.err); mote.registerListener(new TestFtspMsg(), this); System.out.println("Connection ok!"); } catch(Exception e) { e.printStackTrace(); System.exit(2); } } PrintStream outReport = null; public FtspDataLogger() { connect(); Runtime.getRuntime().addShutdownHook(new RunWhenShuttingDown()); String name=""+System.currentTimeMillis(); try { outReport = new PrintStream(new FileOutputStream(name+".report")); outReport.println("#[JAVA_TIME] [NODE_ID] [SEQ_NUM] [GLOB_TIME] [IS_TIME_VALID]"); } catch (Exception e) { System.out.println("FtspDataLogger.FtspDataLogger(): "+e.toString()); } } public void writeReprot(TestFtspMsg tspr) { String foo = (System.currentTimeMillis() +" "+tspr.get_src_addr()+" "+tspr.get_counter() +" "+tspr.get_global_rx_timestamp()+" "+tspr.get_is_synced()); outReport.println(foo); System.out.println(foo); outReport.flush(); } public void writeFullReprot(TestFtspMsg tspr) { String foo = (System.currentTimeMillis() +" "+tspr.get_src_addr() +" "+tspr.get_counter() +" "+tspr.get_local_rx_timestamp() +" "+tspr.get_global_rx_timestamp() +" "+tspr.get_skew_times_1000000() +" "+tspr.get_is_synced() +" "+tspr.get_ftsp_root_addr() +" "+tspr.get_ftsp_seq() +" "+tspr.get_ftsp_table_entries()); outReport.println(foo); System.out.println(foo); outReport.flush(); } public void messageReceived(int dest_addr, Message msg) { if (msg instanceof TestFtspMsg) //writeFullReprot((TestFtspMsg)msg); writeReprot((TestFtspMsg)msg); } /* Just start the app... */ public static void main(String[] args) { new FtspDataLogger(); } }tinyos-2.1.2+dfsg/apps/tests/TestFtsp/Ftsp/FtspDataLogger.py000077500000000000000000000021411207233610700237770ustar00rootroot00000000000000#!/usr/bin/env python import sys, time import tos AM_TEST_FTSP_MSG = 137 class FtspMsg(tos.Packet): def __init__(self, packet = None): tos.Packet.__init__(self, [('src_addr', 'int', 2), ('counter', 'int', 2), ('local_rx_timestamp', 'int', 4), ('global_rx_timestamp', 'int', 4), ('skew_times_1000000', 'int', 4), ('is_synced', 'int', 1), ('ftsp_root_addr', 'int', 2), ('ftsp_seq', 'int', 1), ('ftsp_table_entries', 'int', 2)], packet) if '-h' in sys.argv: print "Usage:", sys.argv[0], "serial@/dev/ttyUSB0:57600" sys.exit() am = tos.AM() while True: p = am.read() if p and p.type == AM_TEST_FTSP_MSG: msg = FtspMsg(p.data) print int(time.time()), msg.src_addr, msg.counter, msg.global_rx_timestamp, msg.is_synced #print msg tinyos-2.1.2+dfsg/apps/tests/TestFtsp/Ftsp/Makefile000077500000000000000000000006621207233610700222250ustar00rootroot00000000000000BUILD_EXTRA_DEPS = FtspDataLogger.class CLEAN_EXTRA = *.class TestFtspMsg.java FtspDataLogger.class: TestFtspMsg.java javac *.java TestFtspMsg.java: TestFtsp.h mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=TestFtspMsg TestFtsp.h test_ftsp_msg -o $@ COMPONENT=TestFtspAppC PFLAGS += -DTIMESYNC_RATE=3 #PFLAGS += -DTIMESYNC_DEBUG PFLAGS += -I$(TOSDIR)/lib/ftsp -I$(TOSDIR)/../apps/RadioCountToLeds include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestFtsp/Ftsp/README.MATLAB.txt000077500000000000000000000042001207233610700232120ustar00rootroot00000000000000FtspDataAnalyzer.m ------------------------------------------------------------------------------- Author/Contact: --------------- Brano Kusy: branislav.kusy@gmail.com ------------------------------------------------------------------------------- DESCRIPTION: ------------ FtspDataAnalyzer.m works with data logs collected by FtspDataLogger.java and calculates the maximum and average timesync error over time. ------------------------------------------------------------------------------- STEP BY STEP GUIDE TO RUN OUR TEST SCENARIO: -------------------------------------------- 1. program and start motes as described in ./README.txt 2. start SerialForwarder and FtspDataLogger.java as described in ./README.txt 3. 'current_time.report' file (where current_time is a number) is created in ./ this file is updated with data in the real time 4. let the experiment run for some time 5. start matlab and enter (assuming your current_time was 1206126224593) FTSPDataAnalyzer('1206126224593.report') this will plot the mean absolute timesync error, global time, and number of synced motes; this can be done while experiment is running 6. Matlab also creates data.out file which contains data in the following format #seqNum mean_abs_error global_time num_synced_motes mean_abs_error is calculated as mean absolute deviation from the mean (mad) Simulating multi-hop: 1. define TIMESYNC_DEBUG in the Makefile 2. recompile and upload TestFTSP app to n motes with special NODE_IDs: using 'make micaz reinstall.0xAB', nodes 0xAB and 0xCD can communicate iff 2D grid coordinates (A,B) and (C,D) are neighbors in a 2D grid ------------------------------------------------------------------------------- EVALUATION: -------------------------------------------- - deployment setup: 11 nodes in a 5x3 grid using simulated multi-hop (4 points were vacant as we only used 11 nodes). the max number of hops was 5. - parameters: sync period 10sec, polling period 3 sec - experiment length: 100 minutes - results (1 jiffy is ~30.5 us) 1.53 jiffy avg error (~50us) 3.5 jiffy max error (~100us)tinyos-2.1.2+dfsg/apps/tests/TestFtsp/Ftsp/README.txt000077500000000000000000000073341207233610700222660ustar00rootroot00000000000000TestFtsp ------------------------------------------------------------------------------- Author/Contact: --------------- Brano Kusy: branislav.kusy@gmail.com Janos Sallai: janos.sallai@vanderbilt.edu Miklos Maroti: mmaroti@gmail.com ------------------------------------------------------------------------------- DESCRIPTION: ------------ The TestFtsp application tests the Flooding Time Synchronization Protocol (FTSP) implementation. A network of motes programmed with TestFtsp run the FTSP protocol to time synchronize, and sends to the base station the global reception timestamps of messages broadcast by a dedicated beacon mote programmed with RadioCountToLeds. Ideally, the global reception timestamps of the same RadioCountToLeds message should agree for all TestFtsp motes (with a small synchronization error). ------------------------------------------------------------------------------- SUPPORTED PLATFORMS: -------------------------------------------- The supported platforms are micaz, mulle, telosb, z1 and iris. ------------------------------------------------------------------------------- STEP BY STEP GUIDE TO RUN OUR TEST SCENARIO: -------------------------------------------- - program one mote with apps/RadioCountToLeds - program multiple motes with TestFtsp - program a mote with apps/BaseStation, leave it on the programming board - turn on all the motes - start the FtspDataLogger java application (type "java FtspDataLogger") ------------------------------------------------------------------------------- REPORTED DATA: -------------- The most important reported data is the global time of arrival of the beacons. The beacon msg arrives to all clients at the same time instant, thus reported global times should be the same for all clients for the same sequence number. Each message contains: - the time of message reception by the java app [JAVA_TIME] - the node ID of the mote that is sending this report [NODE_ID] - the sequence number of the RadioCountToLeds message that is increased for each new polling msg [SEQ_NUM] - the global time when the polling message arrived [GLOB_TIME] - a result_t value indicating if the timestamp is valid [IS_TIME_VALID] (a result_t of 0 denotes a valid timestamp) If the application is running correctly, then the output should show reports from the different FTSP nodes with valid timestamps and similar global time values. For example, this is a trace with two FTSP nodes, with IDs 1 and 5: 1214516486569 1 10916 433709 0 1214516486569 5 10916 433709 0 1214516486809 5 10917 433964 0 1214516486809 1 10917 433963 0 1214516487045 5 10918 434210 0 1214516487053 1 10918 434210 0 1214516487285 1 10919 434454 0 1214516487293 5 10919 434455 0 One way to test if FTSP is operating correctly is to turn off one of the FTSP nodes. For a short time, that node's global times will differ significantly and its valid flag will not be 0. For example, this is what it looks like when node 1 in the earlier trace is reset: 1214516490953 5 10934 438208 0 1214516491201 5 10935 438460 0 1214516491441 5 10936 438712 0 1214516491685 5 10937 438964 0 1214516492169 5 10939 439455 0 1214516492417 1 10940 243 1 1214516492421 5 10940 439706 0 1214516492665 5 10941 439960 0 1214516492669 1 10941 497 1 1214516492905 5 10942 440213 0 ... 1214516497541 1 10961 5495 1 1214516497549 5 10961 444958 0 1214516497793 1 10962 5747 1 1214516498025 1 10963 445456 0 1214516498033 5 10963 445455 0 1214516498277 5 10964 445705 0 1214516498285 1 10964 445707 0 1214516498521 1 10965 445964 0 This output is also saved in a file named 'current_timestamp.report'. '.report' files can be used with the FtspDataAnalyzer.m Matlab application. Mean absolute timesync error, global time, and % of synced motes will be plotted. tinyos-2.1.2+dfsg/apps/tests/TestFtsp/Ftsp/TestFtsp.h000077500000000000000000000041521207233610700225100ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti, Brano Kusy (kusy@isis.vanderbilt.edu) * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) */ #ifndef TEST_FTSP_H #define TEST_FTSP_H typedef nx_struct test_ftsp_msg { nx_uint16_t src_addr; nx_uint16_t counter; nx_uint32_t local_rx_timestamp; nx_uint32_t global_rx_timestamp; nx_int32_t skew_times_1000000; nx_uint8_t is_synced; nx_uint16_t ftsp_root_addr; nx_uint8_t ftsp_seq; nx_uint8_t ftsp_table_entries; } test_ftsp_msg_t; enum { AM_TEST_FTSP_MSG = 137 }; #endif tinyos-2.1.2+dfsg/apps/tests/TestFtsp/Ftsp/TestFtspAppC.nc000077500000000000000000000044511207233610700234270ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti, Brano Kusy (kusy@isis.vanderbilt.edu) * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) */ #include "TestFtsp.h" #include "RadioCountToLeds.h" configuration TestFtspAppC { } implementation { components MainC, TimeSyncC; MainC.SoftwareInit -> TimeSyncC; TimeSyncC.Boot -> MainC; components TestFtspC as App; App.Boot -> MainC; components ActiveMessageC; App.RadioControl -> ActiveMessageC; App.Receive -> ActiveMessageC.Receive[AM_RADIO_COUNT_MSG]; App.AMSend -> ActiveMessageC.AMSend[AM_TEST_FTSP_MSG]; App.Packet -> ActiveMessageC; App.PacketTimeStamp -> ActiveMessageC; components LedsC; App.GlobalTime -> TimeSyncC; App.TimeSyncInfo -> TimeSyncC; App.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/TestFtsp/Ftsp/TestFtspC.nc000077500000000000000000000072061207233610700227670ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti, Brano Kusy (kusy@isis.vanderbilt.edu) * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) */ #include "TestFtsp.h" #include "RadioCountToLeds.h" module TestFtspC { uses { interface GlobalTime; interface TimeSyncInfo; interface Receive; interface AMSend; interface Packet; interface Leds; interface PacketTimeStamp; interface Boot; interface SplitControl as RadioControl; } } implementation { message_t msg; bool locked = FALSE; event void Boot.booted() { call RadioControl.start(); } event message_t* Receive.receive(message_t* msgPtr, void* payload, uint8_t len) { call Leds.led0Toggle(); if (!locked && call PacketTimeStamp.isValid(msgPtr)) { radio_count_msg_t* rcm = (radio_count_msg_t*)call Packet.getPayload(msgPtr, sizeof(radio_count_msg_t)); test_ftsp_msg_t* report = (test_ftsp_msg_t*)call Packet.getPayload(&msg, sizeof(test_ftsp_msg_t)); uint32_t rxTimestamp = call PacketTimeStamp.timestamp(msgPtr); report->src_addr = TOS_NODE_ID; report->counter = rcm->counter; report->local_rx_timestamp = rxTimestamp; report->is_synced = call GlobalTime.local2Global(&rxTimestamp); report->global_rx_timestamp = rxTimestamp; report->skew_times_1000000 = (uint32_t)call TimeSyncInfo.getSkew()*1000000UL; report->ftsp_root_addr = call TimeSyncInfo.getRootID(); report->ftsp_seq = call TimeSyncInfo.getSeqNum(); report->ftsp_table_entries = call TimeSyncInfo.getNumEntries(); if (call AMSend.send(AM_BROADCAST_ADDR, &msg, sizeof(test_ftsp_msg_t)) == SUCCESS) { locked = TRUE; } } return msgPtr; } event void AMSend.sendDone(message_t* ptr, error_t success) { locked = FALSE; return; } event void RadioControl.startDone(error_t err) {} event void RadioControl.stopDone(error_t error){} } tinyos-2.1.2+dfsg/apps/tests/TestFtsp/FtspLpl/000077500000000000000000000000001207233610700212265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestFtsp/FtspLpl/FtspDataLogger.py000077500000000000000000000021411207233610700244470ustar00rootroot00000000000000#!/usr/bin/env python import sys, time import tos AM_TEST_FTSP_MSG = 137 class FtspMsg(tos.Packet): def __init__(self, packet = None): tos.Packet.__init__(self, [('src_addr', 'int', 2), ('counter', 'int', 2), ('local_rx_timestamp', 'int', 4), ('global_rx_timestamp', 'int', 4), ('skew_times_1000000', 'int', 4), ('is_synced', 'int', 1), ('ftsp_root_addr', 'int', 2), ('ftsp_seq', 'int', 1), ('ftsp_table_entries', 'int', 2)], packet) if '-h' in sys.argv: print "Usage:", sys.argv[0], "serial@/dev/ttyUSB0:57600" sys.exit() am = tos.AM() while True: p = am.read() if p and p.type == AM_TEST_FTSP_MSG: msg = FtspMsg(p.data) print int(time.time()), msg.src_addr, msg.counter, msg.global_rx_timestamp, msg.is_synced #print msg tinyos-2.1.2+dfsg/apps/tests/TestFtsp/FtspLpl/Makefile000077500000000000000000000005571207233610700227000ustar00rootroot00000000000000SENSORBOARD=quantoplus COMPONENT=TestFtspAppC PFLAGS += -DTIMESYNC_RATE=10 #PFLAGS += -DTIMESYNC_DEBUG #PFLAGS += -DCC2420_CHANNEL=26 CFLAGS += -DTOSH_DATA_LENGTH=50 #CFLAGS += -DCOUNT_LOG PFLAGS += -I$(TOSDIR)/lib/ftsp -I$(TOSDIR)/../apps/RadioCountToLeds -I$(TOSDIR)/lib/printf CFLAGS += -DLPL_INTERVAL=200 CFLAGS += -DLOW_POWER_LISTENING include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestFtsp/FtspLpl/README000077500000000000000000000032611207233610700221130ustar00rootroot00000000000000First, program several nodes with this TestFtsp application. In addition, you will need one TinyOS Basestation that listens for messages, and one beacon node. Program the beacon node with the RadioCountToLed application from the TestFtsp32kLplBeaconer directory. This is a special modification of the RadioCountToLed code which allows to evaluate a duty-cycled ftsp network. The regular RadioCountToLed code doesn't work, since a LPL broadcast message gets transmitted more than just once. Thus, there is a disambiguity in which precise broadcast message was actually timestamped by the TestFtsp application. The modifications take care of this by using the TimeSyncAMSend interface and setting an arbitrary event time. Thus, on reception, the TestFtsp code can account for this delayed send. To evaluate the synchronization precision, use the FtspDataLogger.py application. Run the python application like this: python FtspDataLogger.py serial@/dev/ttyUSB:BAUDRATE You should now see messages coming in, one per line. The first value is the current time as a unix timestamp. The last line is a binary value indicating if there was some missed data, and thus the values are not good (indicated by a 1), or if all the nodes are synchronized and we received a value for each and every one of them (indicated by a 0). Note!!!!! - the basestation should also define CFLAGS += -DTOSH_DATA_LENGTH=50 in the makefile. Else, the reports will not fit into 1 tinyos message, and they will get silently dropped. - 32k timesync only works for certain platforms (those that provide 32khz counter), if your platform does not support the counter, LPL still works, but you need to use TMilli timesync tinyos-2.1.2+dfsg/apps/tests/TestFtsp/FtspLpl/TestFtsp.h000077500000000000000000000043001207233610700231530ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti, Brano Kusy (kusy@isis.vanderbilt.edu) * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) */ #ifndef TEST_FTSP_H #define TEST_FTSP_H typedef nx_struct test_ftsp_msg { nx_uint16_t src_addr; nx_uint16_t counter; nx_uint32_t local_rx_timestamp; nx_uint32_t global_rx_timestamp; nx_int32_t skew_times_1000000; nx_float skew; nx_uint8_t is_synced; nx_uint16_t ftsp_root_addr; nx_uint8_t ftsp_seq; nx_uint8_t ftsp_table_entries; nx_uint32_t localAverage; nx_int32_t offsetAverage; } test_ftsp_msg_t; enum { AM_TEST_FTSP_MSG = 137 }; #endif tinyos-2.1.2+dfsg/apps/tests/TestFtsp/FtspLpl/TestFtspAppC.nc000077500000000000000000000055431207233610700241020ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti, Brano Kusy (kusy@isis.vanderbilt.edu) * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) * Adapted for LPL: 6/16/09 by Thomas Schmid (thomas.schmid@ucla.edu) */ #include "TestFtsp.h" #include "RadioCountToLeds.h" configuration TestFtspAppC { } implementation { components MainC, TestFtspC as App; App.Boot -> MainC; components ActiveMessageC; components TimeSyncMessageC; App.RadioControl -> ActiveMessageC; App.Receive -> TimeSyncMessageC.Receive[AM_RADIO_COUNT_MSG]; App.TimeSyncPacket -> TimeSyncMessageC; App.AMSend -> ActiveMessageC.AMSend[AM_TEST_FTSP_MSG]; App.Packet -> ActiveMessageC; App.PacketTimeStamp -> ActiveMessageC; App.LowPowerListening -> ActiveMessageC; components RandomC; App.Random -> RandomC; components new TimerMilliC() as Timer0; App.RandomTimer -> Timer0; components LedsC; #if defined(PLATFORM_MICAZ) || defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) || \ defined(PLATFORM_SHIMMER) || defined(PLATFORM_SHIMMER2) || defined(PLATFORM_SHIMMER2R) components TimeSync32kC; MainC.SoftwareInit -> TimeSync32kC; TimeSync32kC.Boot -> MainC; App.GlobalTime -> TimeSync32kC; App.TimeSyncInfo -> TimeSync32kC; #else #error "LPL timesync is not available for your platform" #endif App.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/TestFtsp/FtspLpl/TestFtspC.nc000077500000000000000000000112641207233610700234360ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti, Brano Kusy (kusy@isis.vanderbilt.edu) * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) * Ported for LPL: Thomas Schmid (thomas.schmid@ucla.edu) */ #include "TestFtsp.h" #include "RadioCountToLeds.h" module TestFtspC { uses { interface GlobalTime; interface TimeSyncInfo; interface Receive; interface AMSend; interface Packet; interface Leds; interface PacketTimeStamp; interface Boot; interface SplitControl as RadioControl; interface Timer as RandomTimer; interface Random; interface TimeSyncPacket; interface LowPowerListening; } } implementation { enum { ACT_TESTFTSP = 0x11, }; message_t msg; bool locked = FALSE; test_ftsp_msg_t* report; event void Boot.booted() { call RadioControl.start(); } event message_t* Receive.receive(message_t* msgPtr, void* payload, uint8_t len) { if (!(call PacketTimeStamp.isValid(msgPtr))){ call Leds.led1Toggle(); } if (!locked && call PacketTimeStamp.isValid(msgPtr)) { radio_count_msg_t* rcm = (radio_count_msg_t*)call Packet.getPayload(msgPtr, sizeof(radio_count_msg_t)); if(call TimeSyncPacket.isValid(msgPtr)) { uint32_t rxTimestamp = call TimeSyncPacket.eventTime(msgPtr); report = (test_ftsp_msg_t*)call Packet.getPayload(&msg, sizeof(test_ftsp_msg_t)); report->src_addr = TOS_NODE_ID; report->counter = rcm->counter; report->local_rx_timestamp = rxTimestamp; report->is_synced = call GlobalTime.local2Global(&rxTimestamp); report->global_rx_timestamp = rxTimestamp; report->skew_times_1000000 = (uint32_t)call TimeSyncInfo.getSkew()*1000000UL; report->skew = call TimeSyncInfo.getSkew(); report->ftsp_root_addr = call TimeSyncInfo.getRootID(); report->ftsp_seq = call TimeSyncInfo.getSeqNum(); report->ftsp_table_entries = call TimeSyncInfo.getNumEntries(); report->localAverage = call TimeSyncInfo.getSyncPoint(); report->offsetAverage = call TimeSyncInfo.getOffset(); locked = TRUE; call RandomTimer.startOneShot(call Random.rand16() % (64)); } } return msgPtr; } event void RandomTimer.fired() { #ifdef LOW_POWER_LISTENING call LowPowerListening.setRemoteWakeupInterval(&msg, LPL_INTERVAL); #endif if(locked && (call AMSend.send(4000, &msg, sizeof(test_ftsp_msg_t)) == SUCCESS)){ call Leds.led2On(); } else { locked = FALSE; } } event void AMSend.sendDone(message_t* ptr, error_t success) { locked = FALSE; call Leds.led2Off(); return; } event void RadioControl.startDone(error_t err) { call LowPowerListening.setLocalWakeupInterval(LPL_INTERVAL); } event void RadioControl.stopDone(error_t error){} } tinyos-2.1.2+dfsg/apps/tests/TestFtsp/FtspLpl/TestFtspMsg.py000077500000000000000000000431121207233610700240270ustar00rootroot00000000000000# # This class is automatically generated by mig. DO NOT EDIT THIS FILE. # This class implements a Python interface to the 'TestFtspMsg' # message type. # import tinyos.message.Message # The default size of this message type in bytes. DEFAULT_MESSAGE_SIZE = 33 # The Active Message type associated with this message. AM_TYPE = 137 class TestFtspMsg(tinyos.message.Message.Message): # Create a new TestFtspMsg of size 33. def __init__(self, data="", addr=None, gid=None, base_offset=0, data_length=33): tinyos.message.Message.Message.__init__(self, data, addr, gid, base_offset, data_length) self.amTypeSet(AM_TYPE) # Get AM_TYPE def get_amType(cls): return AM_TYPE get_amType = classmethod(get_amType) # # Return a String representation of this message. Includes the # message type name and the non-indexed field values. # def __str__(self): s = "Message \n" try: s += " [src_addr=0x%x]\n" % (self.get_src_addr()) except: pass try: s += " [counter=0x%x]\n" % (self.get_counter()) except: pass try: s += " [local_rx_timestamp=0x%x]\n" % (self.get_local_rx_timestamp()) except: pass try: s += " [global_rx_timestamp=0x%x]\n" % (self.get_global_rx_timestamp()) except: pass try: s += " [skew_times_1000000=0x%x]\n" % (self.get_skew_times_1000000()) except: pass try: s += " [skew=0x%x]\n" % (self.get_skew()) except: pass try: s += " [is_synced=0x%x]\n" % (self.get_is_synced()) except: pass try: s += " [ftsp_root_addr=0x%x]\n" % (self.get_ftsp_root_addr()) except: pass try: s += " [ftsp_seq=0x%x]\n" % (self.get_ftsp_seq()) except: pass try: s += " [ftsp_table_entries=0x%x]\n" % (self.get_ftsp_table_entries()) except: pass try: s += " [localAverage=0x%x]\n" % (self.get_localAverage()) except: pass try: s += " [offsetAverage=0x%x]\n" % (self.get_offsetAverage()) except: pass return s # Message-type-specific access methods appear below. # # Accessor methods for field: src_addr # Field type: int # Offset (bits): 0 # Size (bits): 16 # # # Return whether the field 'src_addr' is signed (False). # def isSigned_src_addr(self): return False # # Return whether the field 'src_addr' is an array (False). # def isArray_src_addr(self): return False # # Return the offset (in bytes) of the field 'src_addr' # def offset_src_addr(self): return (0 / 8) # # Return the offset (in bits) of the field 'src_addr' # def offsetBits_src_addr(self): return 0 # # Return the value (as a int) of the field 'src_addr' # def get_src_addr(self): return self.getUIntElement(self.offsetBits_src_addr(), 16, 1) # # Set the value of the field 'src_addr' # def set_src_addr(self, value): self.setUIntElement(self.offsetBits_src_addr(), 16, value, 1) # # Return the size, in bytes, of the field 'src_addr' # def size_src_addr(self): return (16 / 8) # # Return the size, in bits, of the field 'src_addr' # def sizeBits_src_addr(self): return 16 # # Accessor methods for field: counter # Field type: int # Offset (bits): 16 # Size (bits): 16 # # # Return whether the field 'counter' is signed (False). # def isSigned_counter(self): return False # # Return whether the field 'counter' is an array (False). # def isArray_counter(self): return False # # Return the offset (in bytes) of the field 'counter' # def offset_counter(self): return (16 / 8) # # Return the offset (in bits) of the field 'counter' # def offsetBits_counter(self): return 16 # # Return the value (as a int) of the field 'counter' # def get_counter(self): return self.getUIntElement(self.offsetBits_counter(), 16, 1) # # Set the value of the field 'counter' # def set_counter(self, value): self.setUIntElement(self.offsetBits_counter(), 16, value, 1) # # Return the size, in bytes, of the field 'counter' # def size_counter(self): return (16 / 8) # # Return the size, in bits, of the field 'counter' # def sizeBits_counter(self): return 16 # # Accessor methods for field: local_rx_timestamp # Field type: long # Offset (bits): 32 # Size (bits): 32 # # # Return whether the field 'local_rx_timestamp' is signed (False). # def isSigned_local_rx_timestamp(self): return False # # Return whether the field 'local_rx_timestamp' is an array (False). # def isArray_local_rx_timestamp(self): return False # # Return the offset (in bytes) of the field 'local_rx_timestamp' # def offset_local_rx_timestamp(self): return (32 / 8) # # Return the offset (in bits) of the field 'local_rx_timestamp' # def offsetBits_local_rx_timestamp(self): return 32 # # Return the value (as a long) of the field 'local_rx_timestamp' # def get_local_rx_timestamp(self): return self.getUIntElement(self.offsetBits_local_rx_timestamp(), 32, 1) # # Set the value of the field 'local_rx_timestamp' # def set_local_rx_timestamp(self, value): self.setUIntElement(self.offsetBits_local_rx_timestamp(), 32, value, 1) # # Return the size, in bytes, of the field 'local_rx_timestamp' # def size_local_rx_timestamp(self): return (32 / 8) # # Return the size, in bits, of the field 'local_rx_timestamp' # def sizeBits_local_rx_timestamp(self): return 32 # # Accessor methods for field: global_rx_timestamp # Field type: long # Offset (bits): 64 # Size (bits): 32 # # # Return whether the field 'global_rx_timestamp' is signed (False). # def isSigned_global_rx_timestamp(self): return False # # Return whether the field 'global_rx_timestamp' is an array (False). # def isArray_global_rx_timestamp(self): return False # # Return the offset (in bytes) of the field 'global_rx_timestamp' # def offset_global_rx_timestamp(self): return (64 / 8) # # Return the offset (in bits) of the field 'global_rx_timestamp' # def offsetBits_global_rx_timestamp(self): return 64 # # Return the value (as a long) of the field 'global_rx_timestamp' # def get_global_rx_timestamp(self): return self.getUIntElement(self.offsetBits_global_rx_timestamp(), 32, 1) # # Set the value of the field 'global_rx_timestamp' # def set_global_rx_timestamp(self, value): self.setUIntElement(self.offsetBits_global_rx_timestamp(), 32, value, 1) # # Return the size, in bytes, of the field 'global_rx_timestamp' # def size_global_rx_timestamp(self): return (32 / 8) # # Return the size, in bits, of the field 'global_rx_timestamp' # def sizeBits_global_rx_timestamp(self): return 32 # # Accessor methods for field: skew_times_1000000 # Field type: int # Offset (bits): 96 # Size (bits): 32 # # # Return whether the field 'skew_times_1000000' is signed (False). # def isSigned_skew_times_1000000(self): return False # # Return whether the field 'skew_times_1000000' is an array (False). # def isArray_skew_times_1000000(self): return False # # Return the offset (in bytes) of the field 'skew_times_1000000' # def offset_skew_times_1000000(self): return (96 / 8) # # Return the offset (in bits) of the field 'skew_times_1000000' # def offsetBits_skew_times_1000000(self): return 96 # # Return the value (as a int) of the field 'skew_times_1000000' # def get_skew_times_1000000(self): return self.getSIntElement(self.offsetBits_skew_times_1000000(), 32, 1) # # Set the value of the field 'skew_times_1000000' # def set_skew_times_1000000(self, value): self.setSIntElement(self.offsetBits_skew_times_1000000(), 32, value, 1) # # Return the size, in bytes, of the field 'skew_times_1000000' # def size_skew_times_1000000(self): return (32 / 8) # # Return the size, in bits, of the field 'skew_times_1000000' # def sizeBits_skew_times_1000000(self): return 32 # # Accessor methods for field: skew # Field type: int # Offset (bits): 128 # Size (bits): 32 # # # Return whether the field 'skew' is signed (False). # def isSigned_skew(self): return False # # Return whether the field 'skew' is an array (False). # def isArray_skew(self): return False # # Return the offset (in bytes) of the field 'skew' # def offset_skew(self): return (128 / 8) # # Return the offset (in bits) of the field 'skew' # def offsetBits_skew(self): return 128 # # Return the value (as a int) of the field 'skew' # def get_skew(self): return self.getFloatElement(self.offsetBits_skew(), 32, 0) # # Set the value of the field 'skew' # def set_skew(self, value): self.setSIntElement(self.offsetBits_skew(), 32, value, 1) # # Return the size, in bytes, of the field 'skew' # def size_skew(self): return (32 / 8) # # Return the size, in bits, of the field 'skew' # def sizeBits_skew(self): return 32 # # Accessor methods for field: is_synced # Field type: short # Offset (bits): 160 # Size (bits): 8 # # # Return whether the field 'is_synced' is signed (False). # def isSigned_is_synced(self): return False # # Return whether the field 'is_synced' is an array (False). # def isArray_is_synced(self): return False # # Return the offset (in bytes) of the field 'is_synced' # def offset_is_synced(self): return (160 / 8) # # Return the offset (in bits) of the field 'is_synced' # def offsetBits_is_synced(self): return 160 # # Return the value (as a short) of the field 'is_synced' # def get_is_synced(self): return self.getUIntElement(self.offsetBits_is_synced(), 8, 1) # # Set the value of the field 'is_synced' # def set_is_synced(self, value): self.setUIntElement(self.offsetBits_is_synced(), 8, value, 1) # # Return the size, in bytes, of the field 'is_synced' # def size_is_synced(self): return (8 / 8) # # Return the size, in bits, of the field 'is_synced' # def sizeBits_is_synced(self): return 8 # # Accessor methods for field: ftsp_root_addr # Field type: int # Offset (bits): 168 # Size (bits): 16 # # # Return whether the field 'ftsp_root_addr' is signed (False). # def isSigned_ftsp_root_addr(self): return False # # Return whether the field 'ftsp_root_addr' is an array (False). # def isArray_ftsp_root_addr(self): return False # # Return the offset (in bytes) of the field 'ftsp_root_addr' # def offset_ftsp_root_addr(self): return (168 / 8) # # Return the offset (in bits) of the field 'ftsp_root_addr' # def offsetBits_ftsp_root_addr(self): return 168 # # Return the value (as a int) of the field 'ftsp_root_addr' # def get_ftsp_root_addr(self): return self.getUIntElement(self.offsetBits_ftsp_root_addr(), 16, 1) # # Set the value of the field 'ftsp_root_addr' # def set_ftsp_root_addr(self, value): self.setUIntElement(self.offsetBits_ftsp_root_addr(), 16, value, 1) # # Return the size, in bytes, of the field 'ftsp_root_addr' # def size_ftsp_root_addr(self): return (16 / 8) # # Return the size, in bits, of the field 'ftsp_root_addr' # def sizeBits_ftsp_root_addr(self): return 16 # # Accessor methods for field: ftsp_seq # Field type: short # Offset (bits): 184 # Size (bits): 8 # # # Return whether the field 'ftsp_seq' is signed (False). # def isSigned_ftsp_seq(self): return False # # Return whether the field 'ftsp_seq' is an array (False). # def isArray_ftsp_seq(self): return False # # Return the offset (in bytes) of the field 'ftsp_seq' # def offset_ftsp_seq(self): return (184 / 8) # # Return the offset (in bits) of the field 'ftsp_seq' # def offsetBits_ftsp_seq(self): return 184 # # Return the value (as a short) of the field 'ftsp_seq' # def get_ftsp_seq(self): return self.getUIntElement(self.offsetBits_ftsp_seq(), 8, 1) # # Set the value of the field 'ftsp_seq' # def set_ftsp_seq(self, value): self.setUIntElement(self.offsetBits_ftsp_seq(), 8, value, 1) # # Return the size, in bytes, of the field 'ftsp_seq' # def size_ftsp_seq(self): return (8 / 8) # # Return the size, in bits, of the field 'ftsp_seq' # def sizeBits_ftsp_seq(self): return 8 # # Accessor methods for field: ftsp_table_entries # Field type: short # Offset (bits): 192 # Size (bits): 8 # # # Return whether the field 'ftsp_table_entries' is signed (False). # def isSigned_ftsp_table_entries(self): return False # # Return whether the field 'ftsp_table_entries' is an array (False). # def isArray_ftsp_table_entries(self): return False # # Return the offset (in bytes) of the field 'ftsp_table_entries' # def offset_ftsp_table_entries(self): return (192 / 8) # # Return the offset (in bits) of the field 'ftsp_table_entries' # def offsetBits_ftsp_table_entries(self): return 192 # # Return the value (as a short) of the field 'ftsp_table_entries' # def get_ftsp_table_entries(self): return self.getUIntElement(self.offsetBits_ftsp_table_entries(), 8, 1) # # Set the value of the field 'ftsp_table_entries' # def set_ftsp_table_entries(self, value): self.setUIntElement(self.offsetBits_ftsp_table_entries(), 8, value, 1) # # Return the size, in bytes, of the field 'ftsp_table_entries' # def size_ftsp_table_entries(self): return (8 / 8) # # Return the size, in bits, of the field 'ftsp_table_entries' # def sizeBits_ftsp_table_entries(self): return 8 # # Accessor methods for field: localAverage # Field type: long # Offset (bits): 200 # Size (bits): 32 # # # Return whether the field 'localAverage' is signed (False). # def isSigned_localAverage(self): return False # # Return whether the field 'localAverage' is an array (False). # def isArray_localAverage(self): return False # # Return the offset (in bytes) of the field 'localAverage' # def offset_localAverage(self): return (200 / 8) # # Return the offset (in bits) of the field 'localAverage' # def offsetBits_localAverage(self): return 200 # # Return the value (as a long) of the field 'localAverage' # def get_localAverage(self): return self.getUIntElement(self.offsetBits_localAverage(), 32, 1) # # Set the value of the field 'localAverage' # def set_localAverage(self, value): self.setUIntElement(self.offsetBits_localAverage(), 32, value, 1) # # Return the size, in bytes, of the field 'localAverage' # def size_localAverage(self): return (32 / 8) # # Return the size, in bits, of the field 'localAverage' # def sizeBits_localAverage(self): return 32 # # Accessor methods for field: offsetAverage # Field type: int # Offset (bits): 232 # Size (bits): 32 # # # Return whether the field 'offsetAverage' is signed (False). # def isSigned_offsetAverage(self): return False # # Return whether the field 'offsetAverage' is an array (False). # def isArray_offsetAverage(self): return False # # Return the offset (in bytes) of the field 'offsetAverage' # def offset_offsetAverage(self): return (232 / 8) # # Return the offset (in bits) of the field 'offsetAverage' # def offsetBits_offsetAverage(self): return 232 # # Return the value (as a int) of the field 'offsetAverage' # def get_offsetAverage(self): return self.getSIntElement(self.offsetBits_offsetAverage(), 32, 1) # # Set the value of the field 'offsetAverage' # def set_offsetAverage(self, value): self.setSIntElement(self.offsetBits_offsetAverage(), 32, value, 1) # # Return the size, in bytes, of the field 'offsetAverage' # def size_offsetAverage(self): return (32 / 8) # # Return the size, in bits, of the field 'offsetAverage' # def sizeBits_offsetAverage(self): return 32 tinyos-2.1.2+dfsg/apps/tests/TestFtsp/FtspLplBeaconer/000077500000000000000000000000001207233610700226655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestFtsp/FtspLplBeaconer/Makefile000077500000000000000000000001641207233610700243310ustar00rootroot00000000000000COMPONENT=RadioCountToLedsAppC CFLAGS += -DLPL_INTERVAL=200 CFLAGS += -DLOW_POWER_LISTENING include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestFtsp/FtspLplBeaconer/RadioCountToLeds.h000077500000000000000000000041701207233610700262250ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef RADIO_COUNT_TO_LEDS_H #define RADIO_COUNT_TO_LEDS_H typedef nx_struct radio_count_msg { nx_uint16_t counter; } radio_count_msg_t; enum { AM_RADIO_COUNT_MSG = 6, }; #endif tinyos-2.1.2+dfsg/apps/tests/TestFtsp/FtspLplBeaconer/RadioCountToLedsAppC.nc000077500000000000000000000064061207233610700271460ustar00rootroot00000000000000// $Id: RadioCountToLedsAppC.nc,v 1.2 2010-06-29 22:07:24 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "RadioCountToLeds.h" #include "Timer.h" /** * Configuration for the RadioCountToLeds application. RadioCountToLeds * maintains a 4Hz counter, broadcasting its value in an AM packet * every time it gets updated. A RadioCountToLeds node that hears a counter * displays the bottom three bits on its LEDs. This application is a useful * test to show that basic AM communication and timers work. * * @author Philip Levis * @date June 6 2005 */ configuration RadioCountToLedsAppC {} implementation { components MainC, new RadioCountToLedsC(T32khz) as App, LedsC; components new AMReceiverC(AM_RADIO_COUNT_MSG); components new TimerMilliC(); components TimeSyncMessageC as ActiveMessageC; App.Boot -> MainC.Boot; App.Receive -> AMReceiverC; App.AMSend -> ActiveMessageC.TimeSyncAMSend32khz[AM_RADIO_COUNT_MSG]; App.AMControl -> ActiveMessageC; App.Leds -> LedsC; App.MilliTimer -> TimerMilliC; App.Packet -> ActiveMessageC; components Counter32khz32C, new CounterToLocalTimeC(T32khz) as LocalTime32khzC; LocalTime32khzC.Counter -> Counter32khz32C; App.LocalTime -> LocalTime32khzC; #ifdef LOW_POWER_LISTENING components CC2420ActiveMessageC; App.LowPowerListening -> CC2420ActiveMessageC; #endif } tinyos-2.1.2+dfsg/apps/tests/TestFtsp/FtspLplBeaconer/RadioCountToLedsC.nc000077500000000000000000000114141207233610700265000ustar00rootroot00000000000000// $Id: RadioCountToLedsC.nc,v 1.3 2010-06-29 22:07:24 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "Timer.h" #include "RadioCountToLeds.h" /** * Implementation of the RadioCountToLeds application. RadioCountToLeds * maintains a 4Hz counter, broadcasting its value in an AM packet * every time it gets updated. A RadioCountToLeds node that hears a counter * displays the bottom three bits on its LEDs. This application is a useful * test to show that basic AM communication and timers work. * * @author Philip Levis * @date June 6 2005 */ generic module RadioCountToLedsC(typedef precision_tag) @safe() { uses { interface Leds; interface Boot; interface Receive; interface TimeSyncAMSend as AMSend; interface Timer as MilliTimer; interface SplitControl as AMControl; interface Packet; interface LocalTime as LocalTime; #ifdef LOW_POWER_LISTENING interface LowPowerListening; #endif } } implementation { message_t packet; bool locked; uint16_t counter = 0; event void Boot.booted() { call AMControl.start(); } event void AMControl.startDone(error_t err) { if (err == SUCCESS) { call MilliTimer.startPeriodic(2*1024); } else { call AMControl.start(); } } event void AMControl.stopDone(error_t err) { // do nothing } event void MilliTimer.fired() { uint32_t time = call LocalTime.get(); counter++; dbg("RadioCountToLedsC", "RadioCountToLedsC: timer fired, counter is %hu.\n", counter); if (locked) { return; } else { radio_count_msg_t* rcm = (radio_count_msg_t*)call Packet.getPayload(&packet, sizeof(radio_count_msg_t)); if (rcm == NULL) { return; } rcm->counter = counter; #ifdef LOW_POWER_LISTENING call LowPowerListening.setRemoteWakeupInterval(&packet, LPL_INTERVAL); #endif if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(radio_count_msg_t), time) == SUCCESS) { dbg("RadioCountToLedsC", "RadioCountToLedsC: packet sent.\n", counter); locked = TRUE; } } } event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) { dbg("RadioCountToLedsC", "Received packet of length %hhu.\n", len); if (len != sizeof(radio_count_msg_t)) {return bufPtr;} else { radio_count_msg_t* rcm = (radio_count_msg_t*)payload; if (rcm->counter & 0x1) { call Leds.led0On(); } else { call Leds.led0Off(); } if (rcm->counter & 0x2) { call Leds.led1On(); } else { call Leds.led1Off(); } if (rcm->counter & 0x4) { call Leds.led2On(); } else { call Leds.led2Off(); } return bufPtr; } } event void AMSend.sendDone(message_t* bufPtr, error_t error) { if (&packet == bufPtr) { locked = FALSE; } } } tinyos-2.1.2+dfsg/apps/tests/TestLed/000077500000000000000000000000001207233610700174325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestLed/BlinkLed/000077500000000000000000000000001207233610700211165ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestLed/BlinkLed/Makefile000066400000000000000000000000511207233610700225520ustar00rootroot00000000000000COMPONENT=TestAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestLed/BlinkLed/TestAppC.nc000066400000000000000000000042041207233610700231230ustar00rootroot00000000000000/* * Copyright (c) 2009-2010 People Power Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Much like Blink, but uses the Led interface. * * TESTS: Led interface * TESTS: Timer * * @author David Moss * @author Peter A. Bigot */ configuration TestAppC { } implementation { components TestP, MainC, new TimerMilliC() as Timer1C, new TimerMilliC() as Timer2C, new TimerMilliC() as Timer3C, LedC; TestP.Boot -> MainC; TestP.Led1 -> LedC.Led0; TestP.Led2 -> LedC.Led1; TestP.Led3 -> LedC.Led2; TestP.Timer1 -> Timer1C; TestP.Timer2 -> Timer2C; TestP.Timer3 -> Timer3C; } tinyos-2.1.2+dfsg/apps/tests/TestLed/BlinkLed/TestP.nc000066400000000000000000000045501207233610700225030ustar00rootroot00000000000000/* * Copyright (c) 2009-2010 People Power Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Much like Blink, but uses the Led interface. * * TESTS: Led interface * TESTS: Timer * * @author David Moss * @author Peter A. Bigot */ module TestP { uses { interface Boot; interface Timer as Timer1; interface Timer as Timer2; interface Timer as Timer3; interface Led as Led1; interface Led as Led2; interface Led as Led3; } } implementation { event void Boot.booted() { call Led1.on(); call Timer1.startPeriodic(256); call Timer2.startPeriodic(512); call Timer3.startPeriodic(1024); } event void Timer1.fired() { call Led1.toggle(); } event void Timer2.fired() { call Led2.toggle(); } event void Timer3.fired() { call Led3.toggle(); } } tinyos-2.1.2+dfsg/apps/tests/TestLed/LedColor/000077500000000000000000000000001207233610700211355ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestLed/LedColor/Makefile000066400000000000000000000001121207233610700225670ustar00rootroot00000000000000COMPONENT=TestAppC PFLAGS += -I$(TOSDIR)/lib/printf include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestLed/LedColor/TestAppC.nc000066400000000000000000000052731207233610700231510ustar00rootroot00000000000000/* * Copyright (c) 2009-2010 People Power Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** Colored LED test. * * The LEDs supported by the platform will be lit, one at a time for a * duration of two seconds, in their spectrum order. Verify that the * color of the lit LED matches the color printed to the serial port. * * TESTS: MultiLed interface * TESTS: Led color interfaces * * @author Peter A. Bigot */ configuration TestAppC { } implementation { components TestP, MainC, new TimerMilliC() as TimerC, LedC; TestP.Boot -> MainC; TestP.Timer -> TimerC; // Get access to the definitions that enable specific colors */ #include "PlatformLed.h" #if defined(PLATFORM_LED_GREEN) TestP.Green -> LedC.Green; #endif // GREEN #if defined(PLATFORM_LED_RED) TestP.Red -> LedC.Red; #endif // RED #if defined(PLATFORM_LED_WHITE) TestP.White -> LedC.White; #endif // WHITE #if defined(PLATFORM_LED_YELLOW) TestP.Yellow -> LedC.Yellow; #endif // YELLOW #if defined(PLATFORM_LED_ORANGE) TestP.Orange -> LedC.Orange; #endif // ORANGE #if defined(PLATFORM_LED_BLUE) TestP.Blue -> LedC.Blue; #endif // BLUE TestP.MultiLed -> LedC; components SerialPrintfC; } tinyos-2.1.2+dfsg/apps/tests/TestLed/LedColor/TestP.nc000066400000000000000000000101101207233610700225070ustar00rootroot00000000000000/* * Copyright (c) 2009-2010 People Power Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** Colored LED test. * * The LEDs supported by the platform will be lit, one at a time for a * duration of two seconds, in their spectrum order. Verify that the * color of the lit LED matches the color printed to the serial port. * * TESTS: MultiLed interface * TESTS: Led color interfaces * * @author Peter A. Bigot */ #include #include "PlatformLed.h" module TestP { uses { interface Boot; interface Timer as Timer; #if defined(PLATFORM_LED_GREEN) interface Led as Green; #endif // GREEN #if defined(PLATFORM_LED_RED) interface Led as Red; #endif // RED #if defined(PLATFORM_LED_WHITE) interface Led as White; #endif // WHITE #if defined(PLATFORM_LED_YELLOW) interface Led as Yellow; #endif // YELLOW #if defined(PLATFORM_LED_ORANGE) interface Led as Orange; #endif // ORANGE #if defined(PLATFORM_LED_BLUE) interface Led as Blue; #endif // BLUE interface MultiLed; } } implementation { enum { LC_Red, LC_Orange, LC_Yellow, LC_Green, LC_Blue, LC_White, LC_LIMIT }; enum { TIMER_DELAY_BMS = 2048, }; unsigned int color_index; task void showColor_task () { int delay = TIMER_DELAY_BMS; call MultiLed.set(0); switch (color_index) { #if defined(PLATFORM_LED_RED) case LC_Red: call Red.on(); printf("Red\r\n"); break; #endif // RED #if defined(PLATFORM_LED_ORANGE) case LC_Orange: call Orange.on(); printf("Orange\r\n"); break; #endif // ORANGE #if defined(PLATFORM_LED_YELLOW) case LC_Yellow: call Yellow.on(); printf("Yellow\r\n"); break; #endif // YELLOW #if defined(PLATFORM_LED_GREEN) case LC_Green: call Green.on(); printf("Green\r\n"); break; #endif // GREEN #if defined(PLATFORM_LED_BLUE) case LC_Blue: call Blue.on(); printf("Blue\r\n"); break; #endif // BLUE #if defined(PLATFORM_LED_WHITE) case LC_White: call White.on(); printf("White\r\n"); break; #endif // WHITE default: printf("Color index %d not supported on this platform\r\n", color_index); delay = 0; break; } if (++color_index == LC_LIMIT) { color_index = 0; } call Timer.startOneShot(delay); } event void Boot.booted() { color_index = 0; post showColor_task(); } event void Timer.fired() { post showColor_task(); } } tinyos-2.1.2+dfsg/apps/tests/TestLed/MultiLed/000077500000000000000000000000001207233610700211515ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestLed/MultiLed/Makefile000066400000000000000000000001121207233610700226030ustar00rootroot00000000000000COMPONENT=TestAppC PFLAGS += -I$(TOSDIR)/lib/printf include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestLed/MultiLed/TestAppC.nc000066400000000000000000000044331207233610700231620ustar00rootroot00000000000000/* * Copyright (c) 2009-2010 People Power Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** Multiple-LED test. * * Twice per second, a counter will be incremented, and the counter * value depicted in the LEDs. The value of the counter, and the * value read from the LEDs, will be printed. Verify that the LEDs * light in order to represent the counter value. Watch the serial * output to ensure the counter and led value match in their lower * bits. * * TESTS: MultiLed interface * TESTS: Timer * * @author Peter A. Bigot */ configuration TestAppC { } implementation { components TestP, MainC, new TimerMilliC() as TimerC, LedC; TestP.Boot -> MainC; TestP.MultiLed -> LedC; TestP.Timer -> TimerC; components SerialPrintfC; } tinyos-2.1.2+dfsg/apps/tests/TestLed/MultiLed/TestP.nc000066400000000000000000000050671207233610700225420ustar00rootroot00000000000000/* * Copyright (c) 2009-2010 People Power Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** Multiple-LED test. * * Twice per second, a counter will be incremented, and the counter * value depicted in the LEDs. The value of the counter, and the * value read from the LEDs, will be printed. Verify that the LEDs * light in order to represent the counter value. Watch the serial * output to ensure the counter and led value match in their lower * bits. * * TESTS: MultiLed interface * TESTS: Timer * * @author Peter A. Bigot */ #include module TestP { uses { interface Boot; interface Timer as Timer; interface MultiLed; } } implementation { unsigned int last_set; unsigned int counter; task void showState_task () { printf("count=%04x, led=%04x\r\n", last_set, call MultiLed.get()); } event void Boot.booted() { counter = 0; call Timer.startPeriodic(512); } event void Timer.fired() { last_set = ++counter; call MultiLed.set(last_set); post showState_task(); } } tinyos-2.1.2+dfsg/apps/tests/TestLed/MultiLedSingle/000077500000000000000000000000001207233610700223135ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestLed/MultiLedSingle/Makefile000066400000000000000000000000511207233610700237470ustar00rootroot00000000000000COMPONENT=TestAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestLed/MultiLedSingle/TestAppC.nc000066400000000000000000000043751207233610700243310ustar00rootroot00000000000000/* * Copyright (c) 2009-2010 People Power Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Much like TinyOS Blink test, except uses more LEDs and uses the * MultiLed interface. * * TESTS: MultiLed interface * TESTS: Timer * * @author David Moss * @author Peter A. Bigot */ configuration TestAppC { } implementation { components TestP, MainC, new TimerMilliC() as Timer1C, new TimerMilliC() as Timer2C, new TimerMilliC() as Timer3C, new TimerMilliC() as Timer4C, new TimerMilliC() as Timer5C, LedC; TestP.Boot -> MainC; TestP.MultiLed -> LedC; TestP.Timer1 -> Timer1C; TestP.Timer2 -> Timer2C; TestP.Timer3 -> Timer3C; TestP.Timer4 -> Timer4C; TestP.Timer5 -> Timer5C; } tinyos-2.1.2+dfsg/apps/tests/TestLed/MultiLedSingle/TestP.nc000066400000000000000000000051741207233610700237030ustar00rootroot00000000000000/* * Copyright (c) 2009-2010 People Power Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Much like TinyOS Blink test, except uses more LEDs and uses the * MultiLed interface. * * TESTS: MultiLed interface * TESTS: Timer * * @author David Moss * @author Peter A. Bigot */ module TestP { uses { interface Boot; interface Timer as Timer1; interface Timer as Timer2; interface Timer as Timer3; interface Timer as Timer4; interface Timer as Timer5; interface MultiLed; } } implementation { event void Boot.booted() { call Timer5.startPeriodic(4096); call Timer4.startPeriodic(2048); call Timer3.startPeriodic(1024); call Timer2.startPeriodic(512); call Timer1.startPeriodic(256); } event void Timer1.fired() { call MultiLed.toggle(0); } event void Timer2.fired() { call MultiLed.toggle(1); } event void Timer3.fired() { call MultiLed.toggle(2); } event void Timer4.fired() { call MultiLed.toggle(3); } event void Timer5.fired() { call MultiLed.toggle(4); } } tinyos-2.1.2+dfsg/apps/tests/TestLed/README.TXT000066400000000000000000000001011207233610700207600ustar00rootroot00000000000000Collection of test programs for the Led and MultiLed interfaces. tinyos-2.1.2+dfsg/apps/tests/TestLpl/000077500000000000000000000000001207233610700174555ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestLpl/Makefile000066400000000000000000000001151207233610700211120ustar00rootroot00000000000000COMPONENT=TestLplAppC CFLAGS += -DLOW_POWER_LISTENING include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestLpl/README.txt000066400000000000000000000031251207233610700211540ustar00rootroot00000000000000README for TestLPL Author/Contact: tinyos-help@millennium.berkeley.edu Description: A simple low-power-listening test app, which cycles through different low-power-listening settings every ~32s, repeating every ~192s. This application currently runs on motes using the CC1000, CC2420, RF230 and RFA1 radios. This application blinks LED 0 every time it sends a message, and toggles LED 1 every time it receives a message. If this application is working correctly (see caveat about timing below), you should see both nodes toggling LED 1. Its low-power-listening settings are as follows (repeating every 256s): 0-32s: receive: fully on send: every second, to fully on listener 32-64s: receive: fully on send: every second, to low-power-listeners with 100ms interval 64-96s: receive: low-power-listening with 250ms interval send: every second, to low-power-listeners with 250ms interval 96-128s: receive: low-power-listening with 250ms interval send: every second, to fully on listener 128-160s: receive: low-power-listening with 10ms interval send: every second, to low-power-listeners with 10ms interval 160-192s: receive: low-power-listening with 2000ms interval send: every 7 seconds, to low-power-listeners with 2000ms interval Whether two motes running TestLPL can receive each others messages depends on their current send and receive low-power-listening settings. If you reset two such motes at the same time, they will be able to receive each other's messages in the following intervals: 0-96s and 128-192s. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/TestLpl/TestLplAppC.nc000066400000000000000000000053661207233610700221440ustar00rootroot00000000000000// $Id: TestLplAppC.nc,v 1.5 2010-01-14 15:46:26 klueska Exp $ /* tab:4 * "Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Simple test code for low-power-listening. Sends a sequence of packets, * changing the low-power-listening settings every ~32s. See README.txt * for more details. * * @author Philip Levis, David Gay * @date Oct 27 2006 */ configuration TestLplAppC {} implementation { components MainC, TestLplC as App, LedsC; components ActiveMessageC; components new TimerMilliC(); #if defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) components CC1000CsmaRadioC as LplRadio; #elif defined(PLATFORM_MICAZ) || defined(PLATFORM_TELOSB) || defined(PLATFORM_SHIMMER) || defined(PLATFORM_SHIMMER2) || defined(PLATFORM_INTELMOTE2) || defined(PLATFORM_EPIC) || defined(PLATFORM_Z1) components CC2420ActiveMessageC as LplRadio; #elif defined(PLATFORM_IRIS) || defined(PLATFORM_MULLE) || defined(PLATFORM_UCMINI) components ActiveMessageC as LplRadio; #elif defined(PLATFORM_EYESIFXV1) || defined(PLATFORM_EYESIFXV2) components LplC as LplRadio; #else #error "LPL testing not supported on this platform" #endif App.Boot -> MainC.Boot; App.Receive -> ActiveMessageC.Receive[240]; App.AMSend -> ActiveMessageC.AMSend[240]; App.SplitControl -> ActiveMessageC; App.Leds -> LedsC; App.MilliTimer -> TimerMilliC; App.LowPowerListening -> LplRadio; } tinyos-2.1.2+dfsg/apps/tests/TestLpl/TestLplC.nc000066400000000000000000000073101207233610700214720ustar00rootroot00000000000000// $Id: TestLplC.nc,v 1.2 2009-10-21 19:11:51 razvanm Exp $ /* tab:4 * "Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "Timer.h" /** * Simple test code for low-power-listening. Sends a sequence of packets, * changing the low-power-listening settings every ~32s. See README.txt * for more details. * * @author Philip Levis, David Gay * @date Oct 27 2006 */ module TestLplC { uses { interface Leds; interface Boot; interface Receive; interface AMSend; interface Timer as MilliTimer; interface SplitControl; interface LowPowerListening; } } implementation { message_t packet; bool locked; uint8_t counter = 0, sendSkip; int16_t sendInterval; event void Boot.booted() { call SplitControl.start(); } void nextLplState() { switch (counter >> 5) { case 0: sendSkip = 0; sendInterval = 0; call LowPowerListening.setLocalWakeupInterval(0); break; case 1: sendInterval = 100; /* Send to sleepy listener */ break; case 2: sendInterval = -1; /* Send to listener like us */ call LowPowerListening.setLocalWakeupInterval(250); break; case 3: sendInterval = 0; /* Send to awake listener */ break; case 4: sendInterval = -1; /* Send to listener like us */ call LowPowerListening.setLocalWakeupInterval(10); break; case 5: sendSkip = 7; /* Send every 7s */ call LowPowerListening.setLocalWakeupInterval(2000); break; } } event void MilliTimer.fired() { counter++; if (!(counter & 31)) nextLplState(); if (!locked && ((counter & sendSkip) == sendSkip)) { if (sendInterval >= 0) call LowPowerListening.setRemoteWakeupInterval(&packet, sendInterval); if (call AMSend.send(AM_BROADCAST_ADDR, &packet, 0) == SUCCESS) { call Leds.led0On(); locked = TRUE; } } } event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) { call Leds.led1Toggle(); return bufPtr; } event void AMSend.sendDone(message_t* bufPtr, error_t error) { if (&packet == bufPtr) { locked = FALSE; call Leds.led0Off(); } } event void SplitControl.startDone(error_t err) { call MilliTimer.startPeriodic(1000); } event void SplitControl.stopDone(error_t err) { } } tinyos-2.1.2+dfsg/apps/tests/TestNetwork/000077500000000000000000000000001207233610700203575ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestNetwork/Driver.c000066400000000000000000000015431207233610700217610ustar00rootroot00000000000000#include #include #include #include int main() { Tossim* t = new Tossim(NULL); t-> init(); for (int i = 0; i < 10; i++) { Mote* m = t->getNode(i * 5); m->bootAtTime(rand() % t->ticksPerSecond()); } t->addChannel("TestNetworkC", stdout); t->addChannel("Forwarder", stdout); // t->addChannel("PointerBug", stdout); // t->addChannel("QueueC", stdout); // t->addChannel("PoolP", stdout); //t->addChannel("LITest", stdout); //t->addChannel("AM", stdout); // t->addChannel("Route", stdout); Radio* r = t->radio(); for (int i = 0; i < 10; i++) { r->setNoise(i * 5, -105.0, 1.0); for (int j = 0; j < 10; j++) { r->add(i * 5, j * 5, -96.0 - (double)abs(i - j)); r->add(j * 5, i * 5, -96.0 - (double)abs(i - j)); } } while(t->time() < 600 * t->ticksPerSecond()) { t->runNextEvent(); } } tinyos-2.1.2+dfsg/apps/tests/TestNetwork/Makefile000066400000000000000000000041351207233610700220220ustar00rootroot00000000000000COMPONENT=TestNetworkAppC CFLAGS += -I$(TOSDIR)/lib/net \ -I$(TOSDIR)/lib/net/drip \ -I$(TOSDIR)/lib/net/4bitle \ -I$(TOSDIR)/lib/net/ctp #-DNO_DEBUG TFLAGS += -I$(TOSDIR)/../apps/tests/TestDissemination \ -I$(TOSDIR)/../support/sdk/c \ -I$(TOSDIR)/types \ -I. LIBMOTE = $(TOSDIR)/../support/sdk/c/libmote.a #BUILD_EXTRA_DEPS += tn-injector #tn-listener LISTEN_OBJS = collection_msg.o test_network_msg.o tn-listener.o $(LIBMOTE) INJECT_OBJS = set_rate_msg.o tn-injector.o collection_debug_msg.o $(LIBMOTE) # arguments: output filename stem, input filename, struct name define mig_templ MIGFILES += $(1).c $(1).h $(1).java $(1).o $(1).c: mig -o $(1).h c -target=$$(PLATFORM) $$(CFLAGS) $$(TFLAGS) $(2) $(3) $(1).java: mig -o $(1).java java -target=$$(PLATFORM) $$(CFLAGS) $$(TFLAGS) $(2) $(3) endef $(eval $(call mig_templ,test_network_msg,TestNetwork.h,TestNetworkMsg)) $(eval $(call mig_templ,set_rate_msg,$(TOSDIR)/lib/net/DisseminationEngine.h,dissemination_message)) $(eval $(call mig_templ,collection_debug_msg,$(TOSDIR)/lib/net/collection/CollectionDebugMsg.h,CollectionDebugMsg)) %.o: %.c gcc -v $(TFLAGS) $(CFLAGS) -c -o $@ $< tn-listener: $(LISTEN_OBJS) gcc -v $(TFLAGS) $(CFLAGS) -o $@ $(LISTEN_OBJS) tn-injector: $(INJECT_OBJS) gcc -v $(TFLAGS) $(CFLAGS) -o $@ $(INJECT_OBJS) #tn-listener.o: tn-listener.c # gcc $(TFLAGS) $(CFLAGS) -c -o $@ $< tn-injector.o: tn-injector.c test_network_msg.c gcc $(TFLAGS) $(CFLAGS) -c -o $@ $< #test_network_msg.c: # mig -o test_network_msg.h c -target=$(PLATFORM) $(CFLAGS) $(TFLAGS) TestNetwork.h TestNetworkMsg #set_rate_msg.c: # mig -o set_rate_msg.h c -target=$(PLATFORM) $(CFLAGS) $(TFLAGS) $(TOSDIR)/lib/net/DisseminationEngine.h dissemination_message #set_rate_msg.o: set_rate_msg.c # gcc $(CFLAGS) $(TFLAGS) -c -o $@ $< #test_network_msg.o: test_network_msg.c # gcc $(CFLAGS) $(TFLAGS) -c -o $@ $< #collection_msg.c: # mig -o collection_msg.h c -target=$(PLATFORM) $(CFLAGS) $(TFLAGS) $(TOSDIR)/lib/net/collection/ForwardingEngine.h collection_header include $(MAKERULES) migclean: rm -rf $(MIGFILES) tinyos-2.1.2+dfsg/apps/tests/TestNetwork/Makefile.Driver000066400000000000000000000003131207233610700232460ustar00rootroot00000000000000 all: make micaz sim g++ -g -c -o Driver.o Driver.c -I../../../tos/lib/tossim/ -I../../../tos/lib/net -I../../../tos/lib/net/collection g++ -o Driver Driver.o build/micaz/sim.o build/micaz/tossim.o tinyos-2.1.2+dfsg/apps/tests/TestNetwork/README.txt000066400000000000000000000024211207233610700220540ustar00rootroot00000000000000README for TestNetwork Author/Contact: tinyos-help@millennium.berkeley.edu Description: TestNetworkC exercises the basic networking layers, collection and dissemination. The application samples DemoSensorC at a basic rate and sends packets up a collection tree. The rate is configurable through dissemination. See TEP118: Dissemination, TEP 119: Collection, and TEP 123: The Collection Tree Protocol for details. There are scripts on net2 website to parse the debug messages sent by the nodes. To test, start with two motes with no program that transmits packets. Example., erase the mote or install Blink. Program a mote with node id 0. The mote will toggle led1 (green on TelosB) approximately every 8s. Then program the second mote with id 1. Once programming is complete, the mote with id 0 will toggle led1 twice every 8s. Each toggle corresponds to the reception of collection message (once from itself, and once from the mote with id 1). Errors indications: Motes 0 and 1 will set led0 (red on TelosB) if there are errors while sending the packet. Mote 0 will set led2 (blue on TelosB) if the gap in sequence number on consecutive packet reception from node 1 is greater than 1. This is expected to be a rare event while doing experiment on a desk. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/TestNetwork/TestNetwork.h000066400000000000000000000005241207233610700230220ustar00rootroot00000000000000#ifndef TEST_NETWORK_H #define TEST_NETWORK_H #include #include "TestNetworkC.h" typedef nx_struct TestNetworkMsg { nx_am_addr_t source; nx_uint16_t seqno; nx_am_addr_t parent; nx_uint16_t metric; nx_uint16_t data; nx_uint8_t hopcount; nx_uint16_t sendCount; nx_uint16_t sendSuccessCount; } TestNetworkMsg; #endif tinyos-2.1.2+dfsg/apps/tests/TestNetwork/TestNetworkAppC.nc000066400000000000000000000046111207233610700237400ustar00rootroot00000000000000/** * TestNetworkC exercises the basic networking layers, collection and * dissemination. The application samples DemoSensorC at a basic rate * and sends packets up a collection tree. The rate is configurable * through dissemination. * * See TEP118: Dissemination, TEP 119: Collection, and TEP 123: The * Collection Tree Protocol for details. * * @author Philip Levis * @version $Revision: 1.7 $ $Date: 2009-09-16 00:51:50 $ */ #include "TestNetwork.h" #include "Ctp.h" configuration TestNetworkAppC {} implementation { components TestNetworkC, MainC, LedsC, ActiveMessageC; components DisseminationC; components new DisseminatorC(uint32_t, SAMPLE_RATE_KEY) as Object32C; components CollectionC as Collector; components new CollectionSenderC(CL_TEST); components new TimerMilliC(); components new DemoSensorC(); components new SerialAMSenderC(CL_TEST); components SerialActiveMessageC; #ifndef NO_DEBUG components new SerialAMSenderC(AM_COLLECTION_DEBUG) as UARTSender; components UARTDebugSenderP as DebugSender; #endif components RandomC; components new QueueC(message_t*, 12); components new PoolC(message_t, 12); TestNetworkC.Boot -> MainC; TestNetworkC.RadioControl -> ActiveMessageC; TestNetworkC.SerialControl -> SerialActiveMessageC; TestNetworkC.RoutingControl -> Collector; TestNetworkC.DisseminationControl -> DisseminationC; TestNetworkC.Leds -> LedsC; TestNetworkC.Timer -> TimerMilliC; TestNetworkC.DisseminationPeriod -> Object32C; TestNetworkC.Send -> CollectionSenderC; TestNetworkC.ReadSensor -> DemoSensorC; TestNetworkC.RootControl -> Collector; TestNetworkC.Receive -> Collector.Receive[CL_TEST]; TestNetworkC.UARTSend -> SerialAMSenderC.AMSend; TestNetworkC.CollectionPacket -> Collector; TestNetworkC.CtpInfo -> Collector; TestNetworkC.CtpCongestion -> Collector; TestNetworkC.Random -> RandomC; TestNetworkC.Pool -> PoolC; TestNetworkC.Queue -> QueueC; TestNetworkC.RadioPacket -> ActiveMessageC; #ifndef NO_DEBUG components new PoolC(message_t, 10) as DebugMessagePool; components new QueueC(message_t*, 10) as DebugSendQueue; DebugSender.Boot -> MainC; DebugSender.UARTSend -> UARTSender; DebugSender.MessagePool -> DebugMessagePool; DebugSender.SendQueue -> DebugSendQueue; Collector.CollectionDebug -> DebugSender; TestNetworkC.CollectionDebug -> DebugSender; #endif TestNetworkC.AMPacket -> ActiveMessageC; } tinyos-2.1.2+dfsg/apps/tests/TestNetwork/TestNetworkC.h000066400000000000000000000002501207233610700231210ustar00rootroot00000000000000#ifndef TEST_NETWORK_C_H #define TEST_NETWORK_C_H enum { AM_TESTNETWORKMSG = 0x05, SAMPLE_RATE_KEY = 0x1, CL_TEST = 0xee, TEST_NETWORK_QUEUE_SIZE = 8, }; #endif tinyos-2.1.2+dfsg/apps/tests/TestNetwork/TestNetworkC.nc000066400000000000000000000142671207233610700233070ustar00rootroot00000000000000/** * TestNetworkC exercises the basic networking layers, collection and * dissemination. The application samples DemoSensorC at a basic rate * and sends packets up a collection tree. The rate is configurable * through dissemination. The default send rate is every 10s. * * See TEP118: Dissemination and TEP 119: Collection for details. * * @author Philip Levis * @version $Revision: 1.11 $ $Date: 2010-01-14 21:53:58 $ */ #include #include "TestNetwork.h" #include "CtpDebugMsg.h" module TestNetworkC { uses interface Boot; uses interface SplitControl as RadioControl; uses interface SplitControl as SerialControl; uses interface StdControl as RoutingControl; uses interface StdControl as DisseminationControl; uses interface DisseminationValue as DisseminationPeriod; uses interface Send; uses interface Leds; uses interface Read as ReadSensor; uses interface Timer; uses interface RootControl; uses interface Receive; uses interface AMSend as UARTSend; uses interface CollectionPacket; uses interface CtpInfo; uses interface CtpCongestion; uses interface Random; uses interface Queue; uses interface Pool; uses interface CollectionDebug; uses interface AMPacket; uses interface Packet as RadioPacket; } implementation { task void uartEchoTask(); message_t packet; message_t uartpacket; message_t* recvPtr = &uartpacket; uint8_t msglen; bool sendBusy = FALSE; bool uartbusy = FALSE; bool firstTimer = TRUE; uint16_t seqno; enum { SEND_INTERVAL = 8192 }; event void ReadSensor.readDone(error_t err, uint16_t val) { } event void Boot.booted() { call SerialControl.start(); } event void SerialControl.startDone(error_t err) { call RadioControl.start(); } event void RadioControl.startDone(error_t err) { if (err != SUCCESS) { call RadioControl.start(); } else { call DisseminationControl.start(); call RoutingControl.start(); if (TOS_NODE_ID % 500 == 0) { call RootControl.setRoot(); } seqno = 0; call Timer.startOneShot(call Random.rand16() & 0x1ff); } } event void RadioControl.stopDone(error_t err) {} event void SerialControl.stopDone(error_t err) {} void failedSend() { dbg("App", "%s: Send failed.\n", __FUNCTION__); call CollectionDebug.logEvent(NET_C_DBG_1); } void sendMessage() { TestNetworkMsg* msg = (TestNetworkMsg*)call Send.getPayload(&packet, sizeof(TestNetworkMsg)); uint16_t metric; am_addr_t parent = 0; call CtpInfo.getParent(&parent); call CtpInfo.getEtx(&metric); msg->source = TOS_NODE_ID; msg->seqno = seqno; msg->data = 0xCAFE; msg->parent = parent; msg->hopcount = 0; msg->metric = metric; if (call Send.send(&packet, sizeof(TestNetworkMsg)) != SUCCESS) { failedSend(); call Leds.led0On(); dbg("TestNetworkC", "%s: Transmission failed.\n", __FUNCTION__); } else { sendBusy = TRUE; seqno++; dbg("TestNetworkC", "%s: Transmission succeeded.\n", __FUNCTION__); } } event void Timer.fired() { uint32_t nextInt; dbg("TestNetworkC", "TestNetworkC: Timer fired.\n"); nextInt = call Random.rand32() % SEND_INTERVAL; nextInt += SEND_INTERVAL >> 1; call Timer.startOneShot(nextInt); if (!sendBusy) sendMessage(); } event void Send.sendDone(message_t* m, error_t err) { if (err != SUCCESS) { call Leds.led0On(); } sendBusy = FALSE; dbg("TestNetworkC", "Send completed.\n"); } event void DisseminationPeriod.changed() { const uint32_t* newVal = call DisseminationPeriod.get(); call Timer.stop(); call Timer.startPeriodic(*newVal); } uint8_t prevSeq = 0; uint8_t firstMsg = 0; event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) { dbg("TestNetworkC", "Received packet at %s from node %hhu.\n", sim_time_string(), call CollectionPacket.getOrigin(msg)); call Leds.led1Toggle(); if (call CollectionPacket.getOrigin(msg) == 1) { if (firstMsg == 1) { if (call CollectionPacket.getSequenceNumber(msg) - prevSeq > 1) { call Leds.led2On(); } } else { firstMsg = 1; } prevSeq = call CollectionPacket.getSequenceNumber(msg); } if (!call Pool.empty() && call Queue.size() < call Queue.maxSize()) { message_t* tmp = call Pool.get(); call Queue.enqueue(msg); if (!uartbusy) { post uartEchoTask(); } return tmp; } return msg; } task void uartEchoTask() { dbg("Traffic", "Sending packet to UART.\n"); if (call Queue.empty()) { return; } else if (!uartbusy) { message_t* msg = call Queue.dequeue(); dbg("Traffic", "Sending packet to UART.\n"); if (call UARTSend.send(0xffff, msg, call RadioPacket.payloadLength(msg)) == SUCCESS) { uartbusy = TRUE; } else { call CollectionDebug.logEventMsg(NET_C_DBG_2, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); } } } event void UARTSend.sendDone(message_t *msg, error_t error) { dbg("Traffic", "UART send done.\n"); uartbusy = FALSE; call Pool.put(msg); if (!call Queue.empty()) { post uartEchoTask(); } else { // call CtpCongestion.setClientCongested(FALSE); } } /* Default implementations for CollectionDebug calls. * These allow CollectionDebug not to be wired to anything if debugging * is not desired. */ default command error_t CollectionDebug.logEvent(uint8_t type) { return SUCCESS; } default command error_t CollectionDebug.logEventSimple(uint8_t type, uint16_t arg) { return SUCCESS; } default command error_t CollectionDebug.logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3) { return SUCCESS; } default command error_t CollectionDebug.logEventMsg(uint8_t type, uint16_t msg, am_addr_t origin, am_addr_t node) { return SUCCESS; } default command error_t CollectionDebug.logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t metric) { return SUCCESS; } } tinyos-2.1.2+dfsg/apps/tests/TestNetwork/ctp-dump.py000077500000000000000000000031571207233610700224730ustar00rootroot00000000000000#!/usr/bin/env python import sys, time import tos class Test(tos.Packet): def __init__(self, payload = None): tos.Packet.__init__(self, [('source', 'int', 2), ('seqno', 'int', 2), ('parent', 'int', 2), ('metric', 'int', 2), ('data', 'int', 2), ('hopcount', 'int', 1), ('sendCount','int', 2), ('sendSuccessCount','int', 2)], payload) class CtpData(tos.Packet): def __init__(self, payload = None): tos.Packet.__init__(self, [('options', 'int', 1), ('thl', 'int', 1), ('etx', 'int', 2), ('origin', 'int', 2), ('originSeqNo', 'int', 1), ('collectionId','int', 1), ('data', 'blob', None)], payload) if len(sys.argv) < 2: print "Usage:", sys.argv[0], "serial@/dev/ttyUSB0:57600" sys.exit() #s = tos.Serial(sys.argv[1], int(sys.argv[2]), debug=False) am = tos.AM() while True: p = am.read() if p: if p.type == 238: ts = "%.4f" % time.time() ctp = CtpData(p.data) test = Test(ctp.data) print ts, '\t', ctp print ts, '\t', test else: print p tinyos-2.1.2+dfsg/apps/tests/TestNetwork/meyer-short.txt000066400000000000000000000076331207233610700234070ustar00rootroot00000000000000-41 -41 -41 -41 -41 -41 -41 -91 -41 -41 -41 -41 -41 -48 -41 -41 -41 -83 -98 -80 -80 -79 -79 -79 -79 -98 -79 -80 -79 -80 -80 -80 -83 -83 -83 -83 -82 -82 -41 -82 -82 -82 -82 -82 -82 -41 -94 -93 -93 -87 -89 -90 -45 -92 -85 -98 -80 -80 -79 -78 -79 -79 -79 -97 -94 -83 -81 -80 -82 -81 -81 -84 -84 -86 -98 -89 -79 -79 -79 -79 -79 -79 -57 -79 -79 -79 -79 -79 -79 -79 -41 -84 -96 -97 -79 -90 -98 -79 -79 -79 -79 -79 -79 -92 -83 -83 -82 -81 -83 -80 -85 -82 -81 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -98 -98 -79 -79 -79 -79 -79 -78 -97 -91 -96 -91 -82 -82 -82 -82 -82 -82 -77 -82 -82 -82 -82 -82 -82 -98 -79 -79 -79 -79 -79 -79 -94 -98 -96 -81 -82 -82 -82 -82 -82 -91 -91 -93 -91 -91 -91 -91 -93 -91 -91 -91 -91 -91 -92 -91 -91 -87 -84 -79 -79 -79 -79 -79 -78 -94 -79 -79 -79 -79 -80 -79 -94 -98 -82 -83 -82 -82 -83 -83 -82 -41 -81 -98 -98 -98 -86 -82 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -90 -79 -79 -79 -78 -78 -79 -79 -79 -78 -79 -79 -79 -98 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -90 -82 -81 -82 -82 -81 -81 -82 -82 -82 -80 -82 -81 -81 -81 -42 -61 -96 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -98 -98 -98 -98 -41 -41 -98 -99 -84 -98 -41 -98 -98 -98 -85 -98 -96 -96 -91 -87 -98 -96 -99 -98 -90 -88 -86 -88 -96 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -84 -93 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -80 -80 -80 -79 -80 -80 -80 -80 -79 -79 -80 -80 -73 -80 -80 -80 -79 -78 -80 -80 -80 -80 -80 -79 -80 -74 -40 -40 -91 -40 -40 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -91 -91 -90 -97 -40 -40 -91 -91 -40 -40 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -96 -79 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -41 -40 -40 -40 -98 -80 -79 -79 -79 -79 -80 -80 -80 -80 -79 -80 -79 -40 -40 -40 -79 -79 -79 -79 -79 -79 -79 -79 -80 -80 -80 -79 -92 -83 -82 -83 -82 -82 -82 -83 -82 -81 -82 -82 -82 -90 -92 -82 -82 -83 -83 -83 -83 -83 -82 -82 -83 -83 -82 -42 -40 -40 -70 -82 -68 -80 -79 -80 -79 -80 -78 -80 -80 -80 -96 -80 -79 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -60 -79 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -99 -80 -80 -80 -80 -80 -79 -80 -80 -80 -79 -80 -80 -99 -84 -83 -83 -83 -84 -83 -83 -83 -84 -84 -84 -84 -84 -48 -79 -80 -80 -80 -80 -79 -80 -79 -80 -80 -79 -80 -91 -91 -91 -92 -91 -92 -94 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -58 -99 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -98 -80 -92 -92 -87 -98 -98 -86 -98 -98 -95 -98 -97 -99 -97 -41 -72 -87 -84 -84 -83 -82 -84 -78 -78 -79 -79 -79 -83 -85 -94 -83 -86 -87 -96 -84 -86 -88 -98 -96 -95 -85 -90 -98 -98 -98 -80 -80 -95 -98 -98 -96 -98 -98 -80 -99 -96 -80 -98 -96 -94 -98 -96 -99 -80 -80 -80 -80 -80 -45 -80 -91 -80 -80 -80 -82 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -40 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -40 -97 -84 -84 -84 -84 -84 -84 -84 -85 -84 -81 -84 -85 -97 -85 -85 -86 -85 -85 -82 -85 -85 -85 -85 -85 -85 -87 -86 -85 -86 -86 -85 -84 -86 -84 -85 -86 -86 -70 -86 -86 -86 -86 -86 -86 -86 -86 -86 -86 -86 -86 -41 -94 -41 -40 -97 -80 -40 -91 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -40 -93 -93 -40 -40 -93 -93 -98 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -40 -40 -93 -85 -85 -82 -82 -83 -86 -85 -86 -84 -85 -82 -83 -84 -85 -40 -40 -78 -40 -98 -98 -98 -99 -41 -80 -80 -78 -81 -79 -81 -81 -79 -81 -81 -81 -81 -96 -98 -80 -93 -80 -96 -98 -98 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -98 -80 -80 -81 -80 -80 -80 -80 -80 -80 -81 -80 -80 -99 -90 -84 -82 -86 -85 -85 -85 -85 -86 -86 -85 -86 -86 -98 -96 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -81 -80 -48 -90 -89 -79 -93 -91 -95 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -95 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -96 -98 -98 -99 -71 -98 -98 -99 -98 -98 -98 -98 -98 tinyos-2.1.2+dfsg/apps/tests/TestNetwork/sparse-grid.txt000066400000000000000000036710451207233610700233600ustar00rootroot00000000000000gain 0 1 -90.80 gain 1 0 -95.95 gain 0 2 -97.48 gain 2 0 -102.10 gain 0 3 -111.33 gain 3 0 -115.49 gain 0 4 -104.82 gain 4 0 -110.09 gain 0 5 -104.55 gain 5 0 -109.85 gain 0 6 -111.04 gain 6 0 -113.61 gain 0 7 -122.71 gain 7 0 -127.66 gain 0 8 -114.35 gain 8 0 -116.63 gain 0 9 -119.30 gain 9 0 -123.04 gain 0 10 -116.34 gain 10 0 -120.55 gain 0 11 -120.72 gain 11 0 -124.78 gain 0 12 -124.93 gain 12 0 -128.45 gain 0 13 -121.37 gain 13 0 -123.84 gain 0 14 -128.19 gain 14 0 -132.53 gain 0 15 -81.15 gain 15 0 -89.12 gain 0 16 -94.37 gain 16 0 -100.15 gain 0 17 -98.45 gain 17 0 -100.65 gain 0 18 -109.20 gain 18 0 -111.25 gain 0 19 -106.94 gain 19 0 -111.98 gain 0 20 -117.83 gain 20 0 -124.31 gain 0 21 -110.61 gain 21 0 -115.02 gain 0 22 -113.39 gain 22 0 -116.39 gain 0 23 -119.70 gain 23 0 -126.97 gain 0 24 -118.29 gain 24 0 -119.97 gain 0 25 -113.51 gain 25 0 -121.94 gain 0 26 -118.65 gain 26 0 -120.97 gain 0 27 -122.75 gain 27 0 -120.97 gain 0 28 -121.85 gain 28 0 -122.76 gain 0 29 -119.90 gain 29 0 -122.69 gain 0 30 -102.95 gain 30 0 -109.21 gain 0 31 -104.05 gain 31 0 -107.92 gain 0 32 -102.76 gain 32 0 -106.67 gain 0 33 -111.07 gain 33 0 -117.22 gain 0 34 -116.05 gain 34 0 -120.81 gain 0 35 -119.09 gain 35 0 -123.67 gain 0 36 -121.15 gain 36 0 -129.51 gain 0 37 -113.35 gain 37 0 -113.91 gain 0 38 -118.27 gain 38 0 -124.85 gain 0 39 -123.60 gain 39 0 -129.05 gain 0 40 -124.55 gain 40 0 -132.04 gain 0 41 -122.03 gain 41 0 -125.15 gain 0 42 -123.08 gain 42 0 -124.36 gain 0 43 -113.19 gain 43 0 -118.36 gain 0 44 -128.07 gain 44 0 -136.30 gain 0 45 -104.29 gain 45 0 -110.99 gain 0 46 -107.57 gain 46 0 -110.06 gain 0 47 -113.62 gain 47 0 -117.17 gain 0 48 -104.15 gain 48 0 -105.49 gain 0 49 -110.95 gain 49 0 -120.26 gain 0 50 -112.81 gain 50 0 -123.09 gain 0 51 -118.95 gain 51 0 -124.37 gain 0 52 -121.02 gain 52 0 -122.46 gain 0 53 -119.34 gain 53 0 -121.79 gain 0 54 -122.15 gain 54 0 -125.30 gain 0 55 -118.69 gain 55 0 -121.14 gain 0 56 -118.69 gain 56 0 -128.46 gain 0 57 -115.82 gain 57 0 -119.47 gain 0 58 -119.30 gain 58 0 -125.70 gain 0 59 -124.78 gain 59 0 -127.29 gain 0 60 -105.09 gain 60 0 -108.93 gain 0 61 -107.93 gain 61 0 -110.52 gain 0 62 -101.72 gain 62 0 -109.53 gain 0 63 -117.08 gain 63 0 -118.11 gain 0 64 -115.61 gain 64 0 -119.62 gain 0 65 -114.43 gain 65 0 -120.53 gain 0 66 -113.49 gain 66 0 -113.85 gain 0 67 -110.56 gain 67 0 -113.18 gain 0 68 -115.34 gain 68 0 -122.52 gain 0 69 -128.30 gain 69 0 -132.77 gain 0 70 -121.97 gain 70 0 -126.20 gain 0 71 -116.55 gain 71 0 -118.89 gain 0 72 -120.37 gain 72 0 -123.13 gain 0 73 -135.14 gain 73 0 -136.29 gain 0 74 -124.54 gain 74 0 -129.57 gain 0 75 -115.60 gain 75 0 -120.76 gain 0 76 -103.37 gain 76 0 -104.48 gain 0 77 -115.38 gain 77 0 -120.16 gain 0 78 -117.36 gain 78 0 -124.99 gain 0 79 -120.71 gain 79 0 -123.12 gain 0 80 -117.23 gain 80 0 -120.14 gain 0 81 -118.46 gain 81 0 -121.96 gain 0 82 -116.25 gain 82 0 -117.38 gain 0 83 -110.68 gain 83 0 -112.84 gain 0 84 -126.11 gain 84 0 -128.42 gain 0 85 -122.77 gain 85 0 -121.89 gain 0 86 -125.34 gain 86 0 -127.84 gain 0 87 -119.17 gain 87 0 -125.63 gain 0 88 -133.17 gain 88 0 -137.39 gain 0 89 -129.09 gain 89 0 -131.91 gain 0 90 -108.30 gain 90 0 -108.12 gain 0 91 -114.62 gain 91 0 -118.39 gain 0 92 -111.12 gain 92 0 -111.85 gain 0 93 -117.81 gain 93 0 -123.33 gain 0 94 -114.73 gain 94 0 -120.12 gain 0 95 -109.33 gain 95 0 -116.97 gain 0 96 -119.42 gain 96 0 -124.40 gain 0 97 -114.05 gain 97 0 -117.78 gain 0 98 -119.80 gain 98 0 -124.32 gain 0 99 -125.96 gain 99 0 -128.31 gain 0 100 -126.17 gain 100 0 -128.08 gain 0 101 -121.85 gain 101 0 -123.93 gain 0 102 -130.09 gain 102 0 -132.94 gain 0 103 -128.16 gain 103 0 -128.49 gain 0 104 -129.15 gain 104 0 -134.86 gain 0 105 -117.91 gain 105 0 -119.56 gain 0 106 -119.70 gain 106 0 -122.44 gain 0 107 -120.50 gain 107 0 -129.81 gain 0 108 -122.57 gain 108 0 -124.19 gain 0 109 -108.42 gain 109 0 -113.54 gain 0 110 -117.98 gain 110 0 -121.56 gain 0 111 -121.58 gain 111 0 -124.85 gain 0 112 -120.83 gain 112 0 -122.97 gain 0 113 -121.14 gain 113 0 -122.09 gain 0 114 -116.15 gain 114 0 -120.40 gain 0 115 -118.52 gain 115 0 -117.08 gain 0 116 -122.13 gain 116 0 -128.22 gain 0 117 -121.50 gain 117 0 -129.10 gain 0 118 -129.79 gain 118 0 -135.71 gain 0 119 -119.63 gain 119 0 -120.21 gain 0 120 -120.80 gain 120 0 -125.89 gain 0 121 -119.13 gain 121 0 -123.52 gain 0 122 -118.77 gain 122 0 -125.27 gain 0 123 -116.50 gain 123 0 -123.78 gain 0 124 -114.03 gain 124 0 -117.72 gain 0 125 -124.42 gain 125 0 -129.44 gain 0 126 -113.91 gain 126 0 -116.89 gain 0 127 -121.79 gain 127 0 -128.23 gain 0 128 -118.32 gain 128 0 -122.70 gain 0 129 -126.26 gain 129 0 -128.54 gain 0 130 -132.38 gain 130 0 -132.49 gain 0 131 -122.73 gain 131 0 -129.92 gain 0 132 -124.64 gain 132 0 -131.46 gain 0 133 -121.41 gain 133 0 -126.30 gain 0 134 -119.48 gain 134 0 -121.07 gain 0 135 -112.40 gain 135 0 -117.56 gain 0 136 -118.67 gain 136 0 -124.44 gain 0 137 -120.62 gain 137 0 -123.88 gain 0 138 -120.36 gain 138 0 -122.61 gain 0 139 -115.00 gain 139 0 -118.24 gain 0 140 -119.29 gain 140 0 -125.14 gain 0 141 -118.86 gain 141 0 -123.38 gain 0 142 -121.51 gain 142 0 -125.34 gain 0 143 -124.69 gain 143 0 -128.13 gain 0 144 -113.51 gain 144 0 -117.97 gain 0 145 -130.34 gain 145 0 -133.25 gain 0 146 -123.18 gain 146 0 -125.00 gain 0 147 -134.86 gain 147 0 -133.77 gain 0 148 -128.58 gain 148 0 -127.21 gain 0 149 -130.84 gain 149 0 -132.63 gain 0 150 -123.23 gain 150 0 -127.71 gain 0 151 -118.69 gain 151 0 -123.37 gain 0 152 -119.38 gain 152 0 -121.03 gain 0 153 -124.31 gain 153 0 -123.54 gain 0 154 -119.70 gain 154 0 -127.48 gain 0 155 -123.28 gain 155 0 -130.95 gain 0 156 -117.87 gain 156 0 -119.93 gain 0 157 -111.37 gain 157 0 -116.38 gain 0 158 -129.55 gain 158 0 -137.16 gain 0 159 -124.34 gain 159 0 -128.56 gain 0 160 -127.94 gain 160 0 -129.28 gain 0 161 -119.76 gain 161 0 -124.58 gain 0 162 -128.84 gain 162 0 -132.53 gain 0 163 -123.54 gain 163 0 -129.38 gain 0 164 -128.68 gain 164 0 -135.56 gain 0 165 -113.14 gain 165 0 -116.06 gain 0 166 -126.13 gain 166 0 -130.62 gain 0 167 -124.52 gain 167 0 -131.10 gain 0 168 -124.76 gain 168 0 -129.79 gain 0 169 -125.23 gain 169 0 -134.46 gain 0 170 -120.43 gain 170 0 -121.18 gain 0 171 -117.99 gain 171 0 -123.77 gain 0 172 -121.36 gain 172 0 -121.83 gain 0 173 -121.72 gain 173 0 -121.63 gain 0 174 -123.70 gain 174 0 -127.90 gain 0 175 -130.74 gain 175 0 -138.50 gain 0 176 -128.72 gain 176 0 -128.49 gain 0 177 -122.98 gain 177 0 -130.56 gain 0 178 -123.53 gain 178 0 -126.94 gain 0 179 -121.34 gain 179 0 -123.14 gain 0 180 -124.03 gain 180 0 -127.30 gain 0 181 -129.63 gain 181 0 -132.97 gain 0 182 -127.19 gain 182 0 -132.91 gain 0 183 -125.81 gain 183 0 -124.92 gain 0 184 -118.15 gain 184 0 -122.04 gain 0 185 -117.15 gain 185 0 -118.53 gain 0 186 -127.56 gain 186 0 -129.22 gain 0 187 -121.96 gain 187 0 -126.17 gain 0 188 -123.42 gain 188 0 -130.88 gain 0 189 -125.15 gain 189 0 -130.13 gain 0 190 -122.11 gain 190 0 -124.10 gain 0 191 -125.67 gain 191 0 -128.75 gain 0 192 -128.29 gain 192 0 -134.24 gain 0 193 -127.23 gain 193 0 -134.43 gain 0 194 -124.52 gain 194 0 -125.53 gain 0 195 -117.59 gain 195 0 -119.24 gain 0 196 -125.16 gain 196 0 -130.84 gain 0 197 -122.25 gain 197 0 -123.99 gain 0 198 -119.87 gain 198 0 -121.14 gain 0 199 -125.54 gain 199 0 -130.73 gain 0 200 -126.93 gain 200 0 -129.05 gain 0 201 -120.97 gain 201 0 -123.89 gain 0 202 -126.25 gain 202 0 -133.18 gain 0 203 -127.63 gain 203 0 -134.18 gain 0 204 -130.56 gain 204 0 -134.39 gain 0 205 -124.99 gain 205 0 -127.90 gain 0 206 -128.86 gain 206 0 -136.29 gain 0 207 -126.24 gain 207 0 -126.03 gain 0 208 -127.04 gain 208 0 -132.60 gain 0 209 -128.25 gain 209 0 -134.81 gain 0 210 -125.57 gain 210 0 -129.06 gain 0 211 -125.97 gain 211 0 -131.49 gain 0 212 -121.68 gain 212 0 -125.74 gain 0 213 -122.47 gain 213 0 -125.72 gain 0 214 -124.46 gain 214 0 -127.60 gain 0 215 -124.09 gain 215 0 -123.65 gain 0 216 -118.01 gain 216 0 -122.23 gain 0 217 -125.07 gain 217 0 -129.80 gain 0 218 -123.71 gain 218 0 -130.63 gain 0 219 -122.75 gain 219 0 -121.03 gain 0 220 -126.78 gain 220 0 -135.55 gain 0 221 -127.49 gain 221 0 -131.90 gain 0 222 -122.19 gain 222 0 -126.93 gain 0 223 -130.92 gain 223 0 -134.28 gain 0 224 -132.58 gain 224 0 -138.63 gain 1 2 -94.32 gain 2 1 -93.81 gain 1 3 -110.75 gain 3 1 -109.77 gain 1 4 -111.09 gain 4 1 -111.21 gain 1 5 -116.10 gain 5 1 -116.26 gain 1 6 -118.62 gain 6 1 -116.04 gain 1 7 -112.87 gain 7 1 -112.68 gain 1 8 -119.00 gain 8 1 -116.14 gain 1 9 -120.98 gain 9 1 -119.58 gain 1 10 -122.11 gain 10 1 -121.19 gain 1 11 -119.58 gain 11 1 -118.49 gain 1 12 -126.50 gain 12 1 -124.88 gain 1 13 -118.20 gain 13 1 -115.54 gain 1 14 -128.87 gain 14 1 -128.07 gain 1 15 -103.04 gain 15 1 -105.86 gain 1 16 -88.61 gain 16 1 -89.25 gain 1 17 -105.06 gain 17 1 -102.13 gain 1 18 -106.58 gain 18 1 -103.48 gain 1 19 -114.90 gain 19 1 -114.80 gain 1 20 -105.18 gain 20 1 -106.52 gain 1 21 -120.66 gain 21 1 -119.93 gain 1 22 -115.56 gain 22 1 -113.42 gain 1 23 -121.21 gain 23 1 -123.34 gain 1 24 -117.48 gain 24 1 -114.02 gain 1 25 -122.91 gain 25 1 -126.20 gain 1 26 -126.29 gain 26 1 -123.46 gain 1 27 -124.24 gain 27 1 -117.31 gain 1 28 -130.29 gain 28 1 -126.06 gain 1 29 -129.23 gain 29 1 -126.88 gain 1 30 -107.22 gain 30 1 -108.34 gain 1 31 -105.29 gain 31 1 -104.02 gain 1 32 -115.21 gain 32 1 -113.97 gain 1 33 -109.20 gain 33 1 -110.21 gain 1 34 -109.49 gain 34 1 -109.10 gain 1 35 -119.54 gain 35 1 -118.98 gain 1 36 -115.05 gain 36 1 -118.27 gain 1 37 -117.45 gain 37 1 -112.87 gain 1 38 -124.57 gain 38 1 -126.01 gain 1 39 -123.85 gain 39 1 -124.16 gain 1 40 -117.44 gain 40 1 -119.79 gain 1 41 -124.67 gain 41 1 -122.65 gain 1 42 -131.04 gain 42 1 -127.17 gain 1 43 -125.09 gain 43 1 -125.11 gain 1 44 -128.30 gain 44 1 -131.38 gain 1 45 -103.52 gain 45 1 -105.08 gain 1 46 -102.06 gain 46 1 -99.41 gain 1 47 -110.08 gain 47 1 -108.49 gain 1 48 -116.80 gain 48 1 -113.00 gain 1 49 -111.33 gain 49 1 -115.50 gain 1 50 -120.51 gain 50 1 -125.65 gain 1 51 -116.60 gain 51 1 -116.87 gain 1 52 -114.90 gain 52 1 -111.20 gain 1 53 -118.78 gain 53 1 -116.09 gain 1 54 -122.21 gain 54 1 -120.22 gain 1 55 -119.56 gain 55 1 -116.87 gain 1 56 -124.80 gain 56 1 -129.43 gain 1 57 -120.46 gain 57 1 -118.97 gain 1 58 -135.71 gain 58 1 -136.96 gain 1 59 -131.80 gain 59 1 -129.18 gain 1 60 -121.63 gain 60 1 -120.32 gain 1 61 -111.58 gain 61 1 -109.03 gain 1 62 -114.16 gain 62 1 -116.83 gain 1 63 -114.73 gain 63 1 -110.63 gain 1 64 -119.08 gain 64 1 -117.94 gain 1 65 -121.43 gain 65 1 -122.38 gain 1 66 -117.91 gain 66 1 -113.12 gain 1 67 -117.72 gain 67 1 -115.20 gain 1 68 -129.35 gain 68 1 -131.39 gain 1 69 -124.12 gain 69 1 -123.46 gain 1 70 -119.91 gain 70 1 -119.01 gain 1 71 -124.20 gain 71 1 -121.40 gain 1 72 -118.88 gain 72 1 -116.50 gain 1 73 -129.47 gain 73 1 -125.47 gain 1 74 -134.44 gain 74 1 -134.32 gain 1 75 -118.75 gain 75 1 -118.77 gain 1 76 -118.44 gain 76 1 -114.41 gain 1 77 -118.08 gain 77 1 -117.72 gain 1 78 -115.48 gain 78 1 -117.97 gain 1 79 -114.10 gain 79 1 -111.37 gain 1 80 -119.06 gain 80 1 -116.83 gain 1 81 -118.44 gain 81 1 -116.80 gain 1 82 -118.73 gain 82 1 -114.72 gain 1 83 -126.51 gain 83 1 -123.53 gain 1 84 -124.47 gain 84 1 -121.64 gain 1 85 -126.75 gain 85 1 -120.73 gain 1 86 -125.84 gain 86 1 -123.20 gain 1 87 -121.52 gain 87 1 -122.85 gain 1 88 -132.39 gain 88 1 -131.46 gain 1 89 -127.52 gain 89 1 -125.20 gain 1 90 -112.46 gain 90 1 -107.15 gain 1 91 -109.09 gain 91 1 -107.71 gain 1 92 -121.83 gain 92 1 -117.42 gain 1 93 -118.97 gain 93 1 -119.34 gain 1 94 -121.16 gain 94 1 -121.41 gain 1 95 -126.27 gain 95 1 -128.78 gain 1 96 -124.98 gain 96 1 -124.82 gain 1 97 -125.03 gain 97 1 -123.62 gain 1 98 -121.54 gain 98 1 -120.93 gain 1 99 -136.42 gain 99 1 -133.62 gain 1 100 -125.37 gain 100 1 -122.14 gain 1 101 -131.79 gain 101 1 -128.72 gain 1 102 -141.27 gain 102 1 -138.98 gain 1 103 -132.92 gain 103 1 -128.12 gain 1 104 -132.80 gain 104 1 -133.37 gain 1 105 -120.51 gain 105 1 -117.03 gain 1 106 -114.56 gain 106 1 -112.15 gain 1 107 -120.45 gain 107 1 -124.61 gain 1 108 -120.51 gain 108 1 -116.99 gain 1 109 -114.05 gain 109 1 -114.02 gain 1 110 -112.91 gain 110 1 -111.36 gain 1 111 -122.89 gain 111 1 -121.02 gain 1 112 -127.72 gain 112 1 -124.72 gain 1 113 -123.75 gain 113 1 -119.56 gain 1 114 -115.19 gain 114 1 -114.30 gain 1 115 -125.70 gain 115 1 -119.11 gain 1 116 -122.31 gain 116 1 -123.26 gain 1 117 -129.76 gain 117 1 -132.21 gain 1 118 -133.11 gain 118 1 -133.89 gain 1 119 -121.53 gain 119 1 -116.97 gain 1 120 -121.54 gain 120 1 -121.49 gain 1 121 -122.32 gain 121 1 -121.56 gain 1 122 -121.52 gain 122 1 -122.88 gain 1 123 -120.82 gain 123 1 -122.95 gain 1 124 -119.25 gain 124 1 -117.80 gain 1 125 -124.87 gain 125 1 -124.75 gain 1 126 -128.87 gain 126 1 -126.70 gain 1 127 -126.18 gain 127 1 -127.48 gain 1 128 -125.40 gain 128 1 -124.64 gain 1 129 -133.63 gain 129 1 -130.78 gain 1 130 -125.85 gain 130 1 -120.82 gain 1 131 -133.06 gain 131 1 -135.12 gain 1 132 -123.41 gain 132 1 -125.09 gain 1 133 -127.10 gain 133 1 -126.85 gain 1 134 -133.05 gain 134 1 -129.50 gain 1 135 -130.71 gain 135 1 -130.73 gain 1 136 -119.16 gain 136 1 -119.79 gain 1 137 -131.61 gain 137 1 -129.72 gain 1 138 -127.63 gain 138 1 -124.74 gain 1 139 -124.99 gain 139 1 -123.09 gain 1 140 -121.22 gain 140 1 -121.93 gain 1 141 -120.21 gain 141 1 -119.59 gain 1 142 -132.72 gain 142 1 -131.41 gain 1 143 -133.46 gain 143 1 -131.76 gain 1 144 -123.49 gain 144 1 -122.81 gain 1 145 -134.47 gain 145 1 -132.24 gain 1 146 -131.84 gain 146 1 -128.51 gain 1 147 -133.21 gain 147 1 -126.98 gain 1 148 -124.98 gain 148 1 -118.46 gain 1 149 -137.63 gain 149 1 -134.28 gain 1 150 -125.00 gain 150 1 -124.34 gain 1 151 -117.90 gain 151 1 -117.44 gain 1 152 -126.73 gain 152 1 -123.24 gain 1 153 -132.93 gain 153 1 -127.02 gain 1 154 -128.90 gain 154 1 -131.54 gain 1 155 -128.97 gain 155 1 -131.50 gain 1 156 -128.34 gain 156 1 -125.27 gain 1 157 -130.40 gain 157 1 -130.27 gain 1 158 -122.45 gain 158 1 -124.91 gain 1 159 -129.87 gain 159 1 -128.95 gain 1 160 -134.49 gain 160 1 -130.68 gain 1 161 -128.20 gain 161 1 -127.89 gain 1 162 -127.27 gain 162 1 -125.81 gain 1 163 -121.82 gain 163 1 -122.52 gain 1 164 -128.46 gain 164 1 -130.20 gain 1 165 -131.46 gain 165 1 -129.24 gain 1 166 -128.47 gain 166 1 -127.82 gain 1 167 -126.90 gain 167 1 -128.34 gain 1 168 -124.47 gain 168 1 -124.36 gain 1 169 -128.86 gain 169 1 -132.95 gain 1 170 -124.27 gain 170 1 -119.88 gain 1 171 -121.38 gain 171 1 -122.01 gain 1 172 -131.51 gain 172 1 -126.84 gain 1 173 -127.32 gain 173 1 -122.09 gain 1 174 -128.97 gain 174 1 -128.03 gain 1 175 -125.50 gain 175 1 -128.12 gain 1 176 -126.14 gain 176 1 -120.77 gain 1 177 -129.54 gain 177 1 -131.98 gain 1 178 -126.24 gain 178 1 -124.51 gain 1 179 -135.43 gain 179 1 -132.09 gain 1 180 -127.62 gain 180 1 -125.75 gain 1 181 -124.89 gain 181 1 -123.08 gain 1 182 -136.63 gain 182 1 -137.21 gain 1 183 -129.13 gain 183 1 -123.10 gain 1 184 -127.45 gain 184 1 -126.20 gain 1 185 -129.93 gain 185 1 -126.17 gain 1 186 -127.68 gain 186 1 -124.20 gain 1 187 -125.32 gain 187 1 -124.39 gain 1 188 -128.00 gain 188 1 -130.33 gain 1 189 -127.02 gain 189 1 -126.86 gain 1 190 -122.65 gain 190 1 -119.50 gain 1 191 -131.70 gain 191 1 -129.64 gain 1 192 -124.99 gain 192 1 -125.79 gain 1 193 -129.88 gain 193 1 -131.93 gain 1 194 -130.71 gain 194 1 -126.58 gain 1 195 -127.64 gain 195 1 -124.14 gain 1 196 -127.09 gain 196 1 -127.63 gain 1 197 -127.92 gain 197 1 -124.52 gain 1 198 -122.81 gain 198 1 -118.94 gain 1 199 -127.18 gain 199 1 -127.22 gain 1 200 -119.25 gain 200 1 -116.23 gain 1 201 -130.54 gain 201 1 -128.32 gain 1 202 -121.83 gain 202 1 -123.61 gain 1 203 -130.84 gain 203 1 -132.24 gain 1 204 -131.92 gain 204 1 -130.61 gain 1 205 -133.81 gain 205 1 -131.58 gain 1 206 -127.78 gain 206 1 -130.06 gain 1 207 -135.17 gain 207 1 -129.81 gain 1 208 -136.86 gain 208 1 -137.29 gain 1 209 -132.11 gain 209 1 -133.52 gain 1 210 -129.08 gain 210 1 -127.43 gain 1 211 -125.72 gain 211 1 -126.10 gain 1 212 -124.61 gain 212 1 -123.53 gain 1 213 -122.98 gain 213 1 -121.09 gain 1 214 -129.29 gain 214 1 -127.29 gain 1 215 -131.99 gain 215 1 -126.40 gain 1 216 -135.65 gain 216 1 -134.73 gain 1 217 -127.73 gain 217 1 -127.32 gain 1 218 -131.90 gain 218 1 -133.68 gain 1 219 -131.29 gain 219 1 -124.43 gain 1 220 -127.44 gain 220 1 -131.07 gain 1 221 -137.98 gain 221 1 -137.25 gain 1 222 -135.86 gain 222 1 -135.47 gain 1 223 -133.69 gain 223 1 -131.90 gain 1 224 -136.98 gain 224 1 -137.88 gain 2 3 -87.95 gain 3 2 -87.50 gain 2 4 -94.12 gain 4 2 -94.75 gain 2 5 -114.56 gain 5 2 -115.24 gain 2 6 -107.90 gain 6 2 -105.84 gain 2 7 -119.02 gain 7 2 -119.34 gain 2 8 -114.44 gain 8 2 -112.09 gain 2 9 -118.20 gain 9 2 -117.31 gain 2 10 -128.90 gain 10 2 -128.50 gain 2 11 -119.40 gain 11 2 -118.83 gain 2 12 -129.32 gain 12 2 -128.22 gain 2 13 -128.23 gain 13 2 -126.09 gain 2 14 -128.33 gain 14 2 -128.05 gain 2 15 -105.36 gain 15 2 -108.70 gain 2 16 -100.28 gain 16 2 -101.43 gain 2 17 -91.19 gain 17 2 -88.77 gain 2 18 -94.92 gain 18 2 -92.34 gain 2 19 -107.00 gain 19 2 -107.41 gain 2 20 -109.11 gain 20 2 -110.96 gain 2 21 -110.84 gain 21 2 -110.62 gain 2 22 -113.00 gain 22 2 -111.37 gain 2 23 -112.98 gain 23 2 -115.63 gain 2 24 -125.11 gain 24 2 -122.17 gain 2 25 -119.10 gain 25 2 -122.91 gain 2 26 -125.41 gain 26 2 -123.10 gain 2 27 -119.15 gain 27 2 -112.74 gain 2 28 -131.62 gain 28 2 -127.91 gain 2 29 -119.81 gain 29 2 -117.97 gain 2 30 -106.14 gain 30 2 -107.77 gain 2 31 -98.82 gain 31 2 -98.06 gain 2 32 -104.03 gain 32 2 -103.31 gain 2 33 -104.34 gain 33 2 -105.87 gain 2 34 -106.90 gain 34 2 -107.03 gain 2 35 -111.26 gain 35 2 -111.22 gain 2 36 -113.88 gain 36 2 -117.62 gain 2 37 -116.33 gain 37 2 -112.27 gain 2 38 -118.31 gain 38 2 -120.27 gain 2 39 -125.44 gain 39 2 -126.26 gain 2 40 -118.33 gain 40 2 -121.20 gain 2 41 -117.70 gain 41 2 -116.20 gain 2 42 -125.83 gain 42 2 -122.48 gain 2 43 -127.68 gain 43 2 -128.22 gain 2 44 -132.35 gain 44 2 -135.95 gain 2 45 -110.25 gain 45 2 -112.32 gain 2 46 -111.62 gain 46 2 -109.48 gain 2 47 -114.28 gain 47 2 -113.20 gain 2 48 -113.76 gain 48 2 -110.47 gain 2 49 -111.74 gain 49 2 -116.43 gain 2 50 -114.23 gain 50 2 -119.89 gain 2 51 -116.83 gain 51 2 -117.63 gain 2 52 -113.61 gain 52 2 -110.42 gain 2 53 -111.37 gain 53 2 -109.20 gain 2 54 -118.86 gain 54 2 -117.38 gain 2 55 -120.31 gain 55 2 -118.14 gain 2 56 -129.77 gain 56 2 -134.92 gain 2 57 -124.52 gain 57 2 -123.54 gain 2 58 -124.74 gain 58 2 -126.51 gain 2 59 -124.49 gain 59 2 -122.38 gain 2 60 -115.58 gain 60 2 -114.80 gain 2 61 -100.59 gain 61 2 -98.56 gain 2 62 -113.94 gain 62 2 -117.12 gain 2 63 -106.07 gain 63 2 -102.48 gain 2 64 -113.63 gain 64 2 -113.02 gain 2 65 -123.19 gain 65 2 -124.66 gain 2 66 -123.09 gain 66 2 -118.81 gain 2 67 -117.65 gain 67 2 -115.65 gain 2 68 -123.54 gain 68 2 -126.10 gain 2 69 -131.95 gain 69 2 -131.80 gain 2 70 -126.25 gain 70 2 -125.86 gain 2 71 -121.86 gain 71 2 -119.58 gain 2 72 -123.93 gain 72 2 -122.06 gain 2 73 -129.62 gain 73 2 -126.14 gain 2 74 -126.47 gain 74 2 -126.87 gain 2 75 -114.60 gain 75 2 -115.14 gain 2 76 -112.93 gain 76 2 -109.42 gain 2 77 -115.02 gain 77 2 -115.17 gain 2 78 -110.37 gain 78 2 -113.37 gain 2 79 -114.25 gain 79 2 -112.04 gain 2 80 -117.21 gain 80 2 -115.50 gain 2 81 -117.77 gain 81 2 -116.65 gain 2 82 -120.29 gain 82 2 -116.79 gain 2 83 -119.86 gain 83 2 -117.40 gain 2 84 -129.51 gain 84 2 -127.20 gain 2 85 -128.50 gain 85 2 -123.00 gain 2 86 -121.65 gain 86 2 -119.53 gain 2 87 -129.73 gain 87 2 -131.57 gain 2 88 -126.81 gain 88 2 -126.40 gain 2 89 -133.93 gain 89 2 -132.12 gain 2 90 -117.44 gain 90 2 -112.64 gain 2 91 -110.44 gain 91 2 -109.58 gain 2 92 -122.31 gain 92 2 -118.41 gain 2 93 -117.03 gain 93 2 -117.92 gain 2 94 -117.66 gain 94 2 -118.43 gain 2 95 -115.87 gain 95 2 -118.89 gain 2 96 -116.67 gain 96 2 -117.03 gain 2 97 -123.04 gain 97 2 -122.14 gain 2 98 -119.69 gain 98 2 -119.59 gain 2 99 -122.16 gain 99 2 -119.88 gain 2 100 -128.36 gain 100 2 -125.65 gain 2 101 -129.49 gain 101 2 -126.94 gain 2 102 -127.54 gain 102 2 -125.77 gain 2 103 -125.96 gain 103 2 -121.67 gain 2 104 -125.99 gain 104 2 -127.08 gain 2 105 -122.07 gain 105 2 -119.10 gain 2 106 -120.46 gain 106 2 -118.58 gain 2 107 -118.77 gain 107 2 -123.45 gain 2 108 -132.36 gain 108 2 -129.36 gain 2 109 -121.56 gain 109 2 -122.05 gain 2 110 -120.94 gain 110 2 -119.89 gain 2 111 -120.47 gain 111 2 -119.11 gain 2 112 -123.54 gain 112 2 -121.06 gain 2 113 -128.88 gain 113 2 -125.21 gain 2 114 -125.11 gain 114 2 -124.74 gain 2 115 -120.90 gain 115 2 -114.83 gain 2 116 -120.74 gain 116 2 -122.21 gain 2 117 -132.54 gain 117 2 -135.51 gain 2 118 -126.37 gain 118 2 -127.66 gain 2 119 -130.40 gain 119 2 -126.35 gain 2 120 -124.38 gain 120 2 -124.85 gain 2 121 -123.18 gain 121 2 -122.94 gain 2 122 -125.81 gain 122 2 -127.69 gain 2 123 -122.73 gain 123 2 -125.38 gain 2 124 -125.86 gain 124 2 -124.92 gain 2 125 -124.85 gain 125 2 -125.25 gain 2 126 -131.72 gain 126 2 -130.07 gain 2 127 -120.76 gain 127 2 -122.57 gain 2 128 -119.98 gain 128 2 -119.73 gain 2 129 -127.40 gain 129 2 -125.07 gain 2 130 -124.69 gain 130 2 -120.18 gain 2 131 -129.29 gain 131 2 -131.86 gain 2 132 -131.14 gain 132 2 -133.34 gain 2 133 -126.44 gain 133 2 -126.70 gain 2 134 -127.76 gain 134 2 -124.73 gain 2 135 -124.85 gain 135 2 -125.39 gain 2 136 -125.81 gain 136 2 -126.96 gain 2 137 -125.93 gain 137 2 -124.56 gain 2 138 -128.13 gain 138 2 -125.76 gain 2 139 -123.67 gain 139 2 -122.29 gain 2 140 -126.52 gain 140 2 -127.74 gain 2 141 -113.17 gain 141 2 -113.07 gain 2 142 -130.28 gain 142 2 -129.49 gain 2 143 -124.49 gain 143 2 -123.31 gain 2 144 -123.57 gain 144 2 -123.41 gain 2 145 -123.20 gain 145 2 -121.48 gain 2 146 -128.80 gain 146 2 -126.00 gain 2 147 -126.01 gain 147 2 -120.30 gain 2 148 -129.49 gain 148 2 -123.50 gain 2 149 -121.02 gain 149 2 -118.19 gain 2 150 -129.91 gain 150 2 -129.77 gain 2 151 -128.77 gain 151 2 -128.82 gain 2 152 -125.59 gain 152 2 -122.62 gain 2 153 -119.67 gain 153 2 -114.28 gain 2 154 -120.32 gain 154 2 -123.47 gain 2 155 -120.23 gain 155 2 -123.28 gain 2 156 -127.03 gain 156 2 -124.47 gain 2 157 -125.16 gain 157 2 -125.54 gain 2 158 -123.49 gain 158 2 -126.47 gain 2 159 -123.92 gain 159 2 -123.51 gain 2 160 -127.62 gain 160 2 -124.32 gain 2 161 -136.23 gain 161 2 -136.43 gain 2 162 -129.36 gain 162 2 -128.43 gain 2 163 -127.10 gain 163 2 -128.31 gain 2 164 -127.16 gain 164 2 -129.42 gain 2 165 -126.32 gain 165 2 -124.62 gain 2 166 -126.67 gain 166 2 -126.53 gain 2 167 -126.07 gain 167 2 -128.02 gain 2 168 -123.01 gain 168 2 -123.41 gain 2 169 -130.91 gain 169 2 -135.51 gain 2 170 -123.46 gain 170 2 -119.59 gain 2 171 -121.89 gain 171 2 -123.04 gain 2 172 -121.79 gain 172 2 -117.64 gain 2 173 -139.83 gain 173 2 -135.12 gain 2 174 -134.68 gain 174 2 -134.26 gain 2 175 -128.65 gain 175 2 -131.79 gain 2 176 -123.35 gain 176 2 -118.50 gain 2 177 -130.67 gain 177 2 -133.63 gain 2 178 -124.89 gain 178 2 -123.67 gain 2 179 -125.73 gain 179 2 -122.90 gain 2 180 -125.36 gain 180 2 -124.00 gain 2 181 -126.89 gain 181 2 -125.60 gain 2 182 -125.33 gain 182 2 -126.42 gain 2 183 -131.08 gain 183 2 -125.57 gain 2 184 -117.51 gain 184 2 -116.78 gain 2 185 -123.95 gain 185 2 -120.71 gain 2 186 -129.65 gain 186 2 -126.69 gain 2 187 -125.30 gain 187 2 -124.88 gain 2 188 -122.93 gain 188 2 -125.77 gain 2 189 -125.68 gain 189 2 -126.04 gain 2 190 -129.83 gain 190 2 -127.19 gain 2 191 -127.13 gain 191 2 -125.59 gain 2 192 -129.88 gain 192 2 -131.20 gain 2 193 -128.83 gain 193 2 -131.40 gain 2 194 -132.29 gain 194 2 -128.68 gain 2 195 -122.88 gain 195 2 -119.90 gain 2 196 -125.96 gain 196 2 -127.02 gain 2 197 -123.98 gain 197 2 -121.10 gain 2 198 -133.23 gain 198 2 -129.87 gain 2 199 -131.92 gain 199 2 -132.48 gain 2 200 -128.08 gain 200 2 -125.57 gain 2 201 -129.55 gain 201 2 -127.85 gain 2 202 -125.10 gain 202 2 -127.40 gain 2 203 -130.16 gain 203 2 -132.09 gain 2 204 -136.57 gain 204 2 -135.78 gain 2 205 -126.02 gain 205 2 -124.30 gain 2 206 -125.29 gain 206 2 -128.09 gain 2 207 -141.51 gain 207 2 -136.68 gain 2 208 -130.78 gain 208 2 -131.72 gain 2 209 -136.99 gain 209 2 -138.92 gain 2 210 -126.75 gain 210 2 -125.62 gain 2 211 -130.13 gain 211 2 -131.02 gain 2 212 -131.14 gain 212 2 -130.57 gain 2 213 -132.17 gain 213 2 -130.79 gain 2 214 -128.57 gain 214 2 -127.09 gain 2 215 -128.03 gain 215 2 -122.96 gain 2 216 -135.72 gain 216 2 -135.31 gain 2 217 -140.65 gain 217 2 -140.76 gain 2 218 -134.32 gain 218 2 -136.62 gain 2 219 -134.27 gain 219 2 -127.92 gain 2 220 -127.27 gain 220 2 -131.42 gain 2 221 -136.51 gain 221 2 -136.30 gain 2 222 -128.37 gain 222 2 -128.49 gain 2 223 -132.76 gain 223 2 -131.49 gain 2 224 -137.94 gain 224 2 -139.36 gain 3 4 -90.52 gain 4 3 -91.62 gain 3 5 -100.73 gain 5 3 -101.87 gain 3 6 -109.12 gain 6 3 -107.52 gain 3 7 -107.02 gain 7 3 -107.80 gain 3 8 -109.49 gain 8 3 -107.61 gain 3 9 -115.87 gain 9 3 -115.44 gain 3 10 -119.74 gain 10 3 -119.80 gain 3 11 -125.38 gain 11 3 -125.28 gain 3 12 -117.42 gain 12 3 -116.78 gain 3 13 -126.77 gain 13 3 -125.08 gain 3 14 -121.11 gain 14 3 -121.28 gain 3 15 -120.23 gain 15 3 -124.02 gain 3 16 -103.42 gain 16 3 -105.03 gain 3 17 -98.84 gain 17 3 -96.88 gain 3 18 -92.32 gain 18 3 -90.20 gain 3 19 -95.49 gain 19 3 -96.36 gain 3 20 -102.16 gain 20 3 -104.47 gain 3 21 -116.53 gain 21 3 -116.76 gain 3 22 -116.99 gain 22 3 -115.82 gain 3 23 -118.11 gain 23 3 -121.21 gain 3 24 -122.50 gain 24 3 -120.02 gain 3 25 -116.84 gain 25 3 -121.11 gain 3 26 -124.11 gain 26 3 -122.26 gain 3 27 -113.71 gain 27 3 -107.76 gain 3 28 -130.63 gain 28 3 -127.37 gain 3 29 -131.00 gain 29 3 -129.62 gain 3 30 -111.85 gain 30 3 -113.94 gain 3 31 -109.60 gain 31 3 -109.30 gain 3 32 -111.45 gain 32 3 -111.18 gain 3 33 -104.93 gain 33 3 -106.92 gain 3 34 -106.79 gain 34 3 -107.37 gain 3 35 -102.44 gain 35 3 -102.85 gain 3 36 -108.00 gain 36 3 -112.20 gain 3 37 -114.90 gain 37 3 -111.30 gain 3 38 -106.50 gain 38 3 -108.92 gain 3 39 -113.49 gain 39 3 -114.77 gain 3 40 -120.19 gain 40 3 -123.52 gain 3 41 -114.67 gain 41 3 -113.62 gain 3 42 -120.47 gain 42 3 -117.57 gain 3 43 -121.20 gain 43 3 -122.19 gain 3 44 -127.16 gain 44 3 -131.22 gain 3 45 -102.54 gain 45 3 -105.07 gain 3 46 -121.16 gain 46 3 -119.49 gain 3 47 -112.63 gain 47 3 -112.02 gain 3 48 -112.16 gain 48 3 -109.33 gain 3 49 -110.57 gain 49 3 -115.72 gain 3 50 -114.04 gain 50 3 -120.15 gain 3 51 -114.33 gain 51 3 -115.58 gain 3 52 -113.71 gain 52 3 -110.98 gain 3 53 -115.60 gain 53 3 -113.89 gain 3 54 -120.80 gain 54 3 -119.78 gain 3 55 -120.34 gain 55 3 -118.62 gain 3 56 -120.09 gain 56 3 -125.70 gain 3 57 -128.58 gain 57 3 -128.06 gain 3 58 -127.59 gain 58 3 -129.81 gain 3 59 -129.42 gain 59 3 -127.77 gain 3 60 -123.12 gain 60 3 -122.80 gain 3 61 -110.68 gain 61 3 -109.10 gain 3 62 -105.57 gain 62 3 -109.21 gain 3 63 -104.92 gain 63 3 -101.79 gain 3 64 -120.94 gain 64 3 -120.78 gain 3 65 -111.28 gain 65 3 -113.21 gain 3 66 -112.69 gain 66 3 -108.87 gain 3 67 -112.50 gain 67 3 -110.96 gain 3 68 -115.78 gain 68 3 -118.80 gain 3 69 -126.51 gain 69 3 -126.82 gain 3 70 -117.16 gain 70 3 -117.23 gain 3 71 -118.06 gain 71 3 -116.23 gain 3 72 -116.48 gain 72 3 -115.07 gain 3 73 -124.29 gain 73 3 -121.27 gain 3 74 -123.60 gain 74 3 -124.45 gain 3 75 -115.99 gain 75 3 -116.99 gain 3 76 -122.35 gain 76 3 -119.30 gain 3 77 -111.44 gain 77 3 -112.06 gain 3 78 -114.50 gain 78 3 -117.97 gain 3 79 -109.13 gain 79 3 -107.37 gain 3 80 -116.01 gain 80 3 -114.76 gain 3 81 -118.29 gain 81 3 -117.63 gain 3 82 -121.70 gain 82 3 -118.66 gain 3 83 -121.68 gain 83 3 -119.68 gain 3 84 -121.45 gain 84 3 -119.60 gain 3 85 -121.94 gain 85 3 -116.89 gain 3 86 -124.82 gain 86 3 -123.15 gain 3 87 -119.87 gain 87 3 -122.17 gain 3 88 -126.25 gain 88 3 -126.30 gain 3 89 -130.62 gain 89 3 -129.26 gain 3 90 -119.02 gain 90 3 -114.68 gain 3 91 -116.85 gain 91 3 -116.45 gain 3 92 -126.59 gain 92 3 -123.15 gain 3 93 -123.16 gain 93 3 -124.50 gain 3 94 -115.65 gain 94 3 -116.88 gain 3 95 -117.63 gain 95 3 -121.11 gain 3 96 -114.57 gain 96 3 -115.39 gain 3 97 -116.05 gain 97 3 -115.61 gain 3 98 -123.34 gain 98 3 -123.70 gain 3 99 -121.84 gain 99 3 -120.02 gain 3 100 -119.88 gain 100 3 -117.62 gain 3 101 -122.38 gain 101 3 -120.29 gain 3 102 -123.60 gain 102 3 -122.29 gain 3 103 -126.39 gain 103 3 -122.56 gain 3 104 -126.56 gain 104 3 -128.11 gain 3 105 -121.37 gain 105 3 -118.86 gain 3 106 -120.17 gain 106 3 -118.75 gain 3 107 -119.96 gain 107 3 -125.10 gain 3 108 -120.98 gain 108 3 -118.44 gain 3 109 -120.14 gain 109 3 -121.09 gain 3 110 -117.97 gain 110 3 -117.38 gain 3 111 -122.02 gain 111 3 -121.12 gain 3 112 -118.38 gain 112 3 -116.35 gain 3 113 -119.90 gain 113 3 -116.68 gain 3 114 -131.23 gain 114 3 -131.32 gain 3 115 -129.68 gain 115 3 -124.07 gain 3 116 -129.25 gain 116 3 -131.18 gain 3 117 -128.94 gain 117 3 -132.37 gain 3 118 -122.85 gain 118 3 -124.61 gain 3 119 -130.63 gain 119 3 -127.04 gain 3 120 -123.94 gain 120 3 -124.87 gain 3 121 -122.08 gain 121 3 -122.29 gain 3 122 -122.33 gain 122 3 -124.66 gain 3 123 -117.51 gain 123 3 -120.62 gain 3 124 -124.58 gain 124 3 -124.10 gain 3 125 -125.58 gain 125 3 -126.43 gain 3 126 -127.25 gain 126 3 -126.06 gain 3 127 -119.75 gain 127 3 -122.02 gain 3 128 -120.24 gain 128 3 -120.45 gain 3 129 -118.03 gain 129 3 -116.15 gain 3 130 -124.04 gain 130 3 -119.98 gain 3 131 -124.45 gain 131 3 -127.48 gain 3 132 -129.36 gain 132 3 -132.01 gain 3 133 -128.46 gain 133 3 -129.19 gain 3 134 -127.63 gain 134 3 -125.06 gain 3 135 -122.04 gain 135 3 -123.04 gain 3 136 -126.63 gain 136 3 -128.24 gain 3 137 -124.45 gain 137 3 -123.54 gain 3 138 -126.16 gain 138 3 -124.25 gain 3 139 -121.51 gain 139 3 -120.58 gain 3 140 -127.00 gain 140 3 -128.69 gain 3 141 -125.67 gain 141 3 -126.03 gain 3 142 -125.58 gain 142 3 -125.24 gain 3 143 -124.71 gain 143 3 -123.98 gain 3 144 -127.93 gain 144 3 -128.23 gain 3 145 -124.72 gain 145 3 -123.46 gain 3 146 -122.98 gain 146 3 -120.63 gain 3 147 -133.92 gain 147 3 -128.66 gain 3 148 -129.75 gain 148 3 -124.21 gain 3 149 -118.95 gain 149 3 -116.58 gain 3 150 -122.05 gain 150 3 -122.36 gain 3 151 -134.39 gain 151 3 -134.90 gain 3 152 -124.70 gain 152 3 -122.18 gain 3 153 -126.50 gain 153 3 -121.57 gain 3 154 -127.72 gain 154 3 -131.33 gain 3 155 -126.17 gain 155 3 -129.68 gain 3 156 -128.01 gain 156 3 -125.91 gain 3 157 -125.90 gain 157 3 -126.74 gain 3 158 -127.16 gain 158 3 -130.60 gain 3 159 -124.87 gain 159 3 -124.92 gain 3 160 -125.43 gain 160 3 -122.60 gain 3 161 -122.68 gain 161 3 -123.33 gain 3 162 -132.01 gain 162 3 -131.53 gain 3 163 -133.62 gain 163 3 -135.29 gain 3 164 -129.05 gain 164 3 -131.76 gain 3 165 -128.37 gain 165 3 -127.12 gain 3 166 -130.15 gain 166 3 -130.47 gain 3 167 -125.82 gain 167 3 -128.24 gain 3 168 -127.35 gain 168 3 -128.22 gain 3 169 -130.79 gain 169 3 -135.85 gain 3 170 -134.77 gain 170 3 -131.35 gain 3 171 -125.27 gain 171 3 -126.89 gain 3 172 -124.78 gain 172 3 -121.09 gain 3 173 -124.38 gain 173 3 -120.12 gain 3 174 -125.22 gain 174 3 -125.26 gain 3 175 -124.38 gain 175 3 -127.97 gain 3 176 -125.24 gain 176 3 -120.84 gain 3 177 -127.43 gain 177 3 -130.85 gain 3 178 -130.45 gain 178 3 -129.69 gain 3 179 -128.50 gain 179 3 -126.13 gain 3 180 -129.54 gain 180 3 -128.64 gain 3 181 -129.90 gain 181 3 -129.07 gain 3 182 -130.22 gain 182 3 -131.78 gain 3 183 -124.64 gain 183 3 -119.58 gain 3 184 -128.69 gain 184 3 -128.42 gain 3 185 -122.39 gain 185 3 -119.61 gain 3 186 -126.14 gain 186 3 -123.63 gain 3 187 -130.97 gain 187 3 -131.01 gain 3 188 -131.76 gain 188 3 -135.06 gain 3 189 -136.90 gain 189 3 -137.71 gain 3 190 -125.66 gain 190 3 -123.48 gain 3 191 -127.85 gain 191 3 -126.77 gain 3 192 -130.30 gain 192 3 -132.08 gain 3 193 -128.85 gain 193 3 -131.88 gain 3 194 -121.57 gain 194 3 -118.41 gain 3 195 -125.12 gain 195 3 -122.60 gain 3 196 -127.69 gain 196 3 -129.21 gain 3 197 -124.19 gain 197 3 -121.77 gain 3 198 -123.73 gain 198 3 -120.83 gain 3 199 -128.01 gain 199 3 -129.03 gain 3 200 -134.30 gain 200 3 -132.25 gain 3 201 -123.75 gain 201 3 -122.51 gain 3 202 -126.26 gain 202 3 -129.03 gain 3 203 -131.66 gain 203 3 -134.04 gain 3 204 -129.54 gain 204 3 -129.21 gain 3 205 -125.45 gain 205 3 -124.19 gain 3 206 -124.48 gain 206 3 -127.74 gain 3 207 -128.12 gain 207 3 -123.74 gain 3 208 -128.39 gain 208 3 -129.79 gain 3 209 -128.67 gain 209 3 -131.06 gain 3 210 -123.20 gain 210 3 -122.53 gain 3 211 -117.72 gain 211 3 -119.08 gain 3 212 -126.39 gain 212 3 -126.28 gain 3 213 -132.03 gain 213 3 -131.12 gain 3 214 -125.54 gain 214 3 -124.51 gain 3 215 -133.16 gain 215 3 -128.55 gain 3 216 -128.97 gain 216 3 -129.02 gain 3 217 -128.43 gain 217 3 -129.00 gain 3 218 -136.75 gain 218 3 -139.51 gain 3 219 -125.44 gain 219 3 -119.55 gain 3 220 -136.79 gain 220 3 -141.39 gain 3 221 -127.12 gain 221 3 -127.37 gain 3 222 -129.14 gain 222 3 -129.71 gain 3 223 -127.86 gain 223 3 -127.04 gain 3 224 -133.53 gain 224 3 -135.41 gain 4 5 -96.47 gain 5 4 -96.51 gain 4 6 -103.68 gain 6 4 -100.98 gain 4 7 -110.04 gain 7 4 -109.73 gain 4 8 -112.72 gain 8 4 -109.74 gain 4 9 -113.11 gain 9 4 -111.59 gain 4 10 -121.79 gain 10 4 -120.75 gain 4 11 -117.64 gain 11 4 -116.44 gain 4 12 -126.92 gain 12 4 -125.18 gain 4 13 -128.72 gain 13 4 -125.93 gain 4 14 -123.09 gain 14 4 -122.17 gain 4 15 -110.96 gain 15 4 -113.66 gain 4 16 -112.73 gain 16 4 -113.25 gain 4 17 -107.99 gain 17 4 -104.94 gain 4 18 -98.74 gain 18 4 -95.53 gain 4 19 -104.32 gain 19 4 -104.10 gain 4 20 -95.80 gain 20 4 -97.02 gain 4 21 -104.95 gain 21 4 -104.09 gain 4 22 -114.99 gain 22 4 -112.73 gain 4 23 -109.73 gain 23 4 -111.74 gain 4 24 -111.82 gain 24 4 -108.25 gain 4 25 -128.58 gain 25 4 -131.76 gain 4 26 -122.52 gain 26 4 -119.58 gain 4 27 -125.04 gain 27 4 -117.99 gain 4 28 -120.12 gain 28 4 -115.77 gain 4 29 -124.03 gain 29 4 -121.56 gain 4 30 -119.99 gain 30 4 -120.98 gain 4 31 -118.62 gain 31 4 -117.23 gain 4 32 -108.01 gain 32 4 -106.65 gain 4 33 -101.61 gain 33 4 -102.50 gain 4 34 -106.67 gain 34 4 -106.16 gain 4 35 -104.57 gain 35 4 -103.89 gain 4 36 -106.00 gain 36 4 -109.10 gain 4 37 -109.64 gain 37 4 -104.94 gain 4 38 -117.56 gain 38 4 -118.88 gain 4 39 -119.18 gain 39 4 -119.37 gain 4 40 -123.36 gain 40 4 -125.60 gain 4 41 -119.93 gain 41 4 -117.79 gain 4 42 -124.53 gain 42 4 -120.54 gain 4 43 -120.72 gain 43 4 -120.62 gain 4 44 -114.92 gain 44 4 -117.88 gain 4 45 -114.26 gain 45 4 -115.70 gain 4 46 -116.16 gain 46 4 -113.39 gain 4 47 -111.42 gain 47 4 -109.71 gain 4 48 -109.11 gain 48 4 -105.19 gain 4 49 -111.01 gain 49 4 -115.06 gain 4 50 -105.44 gain 50 4 -110.46 gain 4 51 -105.67 gain 51 4 -105.83 gain 4 52 -113.24 gain 52 4 -109.41 gain 4 53 -117.53 gain 53 4 -114.72 gain 4 54 -117.73 gain 54 4 -115.62 gain 4 55 -119.22 gain 55 4 -116.41 gain 4 56 -123.74 gain 56 4 -128.26 gain 4 57 -117.16 gain 57 4 -115.55 gain 4 58 -131.22 gain 58 4 -132.35 gain 4 59 -128.29 gain 59 4 -125.54 gain 4 60 -116.63 gain 60 4 -115.21 gain 4 61 -117.48 gain 61 4 -114.80 gain 4 62 -120.74 gain 62 4 -123.29 gain 4 63 -113.43 gain 63 4 -109.21 gain 4 64 -115.40 gain 64 4 -114.14 gain 4 65 -111.94 gain 65 4 -112.78 gain 4 66 -116.86 gain 66 4 -111.95 gain 4 67 -123.28 gain 67 4 -120.65 gain 4 68 -120.24 gain 68 4 -122.16 gain 4 69 -115.51 gain 69 4 -114.72 gain 4 70 -120.55 gain 70 4 -119.52 gain 4 71 -127.04 gain 71 4 -124.12 gain 4 72 -125.10 gain 72 4 -122.60 gain 4 73 -119.93 gain 73 4 -115.81 gain 4 74 -125.94 gain 74 4 -125.71 gain 4 75 -123.91 gain 75 4 -123.81 gain 4 76 -120.35 gain 76 4 -116.21 gain 4 77 -116.19 gain 77 4 -115.72 gain 4 78 -134.16 gain 78 4 -136.53 gain 4 79 -117.39 gain 79 4 -114.54 gain 4 80 -116.36 gain 80 4 -114.01 gain 4 81 -116.55 gain 81 4 -114.79 gain 4 82 -114.14 gain 82 4 -110.01 gain 4 83 -123.17 gain 83 4 -120.08 gain 4 84 -118.32 gain 84 4 -115.37 gain 4 85 -115.24 gain 85 4 -109.09 gain 4 86 -120.56 gain 86 4 -117.80 gain 4 87 -125.08 gain 87 4 -126.28 gain 4 88 -126.35 gain 88 4 -125.30 gain 4 89 -127.79 gain 89 4 -125.35 gain 4 90 -124.16 gain 90 4 -118.72 gain 4 91 -113.37 gain 91 4 -111.88 gain 4 92 -124.80 gain 92 4 -120.27 gain 4 93 -118.38 gain 93 4 -118.64 gain 4 94 -119.84 gain 94 4 -119.97 gain 4 95 -113.86 gain 95 4 -116.24 gain 4 96 -120.60 gain 96 4 -120.32 gain 4 97 -121.77 gain 97 4 -120.24 gain 4 98 -116.22 gain 98 4 -115.48 gain 4 99 -127.28 gain 99 4 -124.37 gain 4 100 -121.06 gain 100 4 -117.71 gain 4 101 -133.48 gain 101 4 -130.29 gain 4 102 -125.70 gain 102 4 -123.29 gain 4 103 -129.59 gain 103 4 -124.67 gain 4 104 -125.10 gain 104 4 -125.55 gain 4 105 -121.35 gain 105 4 -117.75 gain 4 106 -121.68 gain 106 4 -119.16 gain 4 107 -118.53 gain 107 4 -122.57 gain 4 108 -114.35 gain 108 4 -110.72 gain 4 109 -120.81 gain 109 4 -120.66 gain 4 110 -119.72 gain 110 4 -118.04 gain 4 111 -117.58 gain 111 4 -115.58 gain 4 112 -119.97 gain 112 4 -116.85 gain 4 113 -116.52 gain 113 4 -112.21 gain 4 114 -122.56 gain 114 4 -121.55 gain 4 115 -128.01 gain 115 4 -121.30 gain 4 116 -123.13 gain 116 4 -123.97 gain 4 117 -128.55 gain 117 4 -130.89 gain 4 118 -124.89 gain 118 4 -125.55 gain 4 119 -129.15 gain 119 4 -124.47 gain 4 120 -127.55 gain 120 4 -127.39 gain 4 121 -121.81 gain 121 4 -120.93 gain 4 122 -122.56 gain 122 4 -123.80 gain 4 123 -116.15 gain 123 4 -118.16 gain 4 124 -120.33 gain 124 4 -118.76 gain 4 125 -123.68 gain 125 4 -123.44 gain 4 126 -127.26 gain 126 4 -124.97 gain 4 127 -119.64 gain 127 4 -120.81 gain 4 128 -128.43 gain 128 4 -127.55 gain 4 129 -121.48 gain 129 4 -118.50 gain 4 130 -129.12 gain 130 4 -123.97 gain 4 131 -117.52 gain 131 4 -119.46 gain 4 132 -134.52 gain 132 4 -136.08 gain 4 133 -131.70 gain 133 4 -131.33 gain 4 134 -126.85 gain 134 4 -123.18 gain 4 135 -117.62 gain 135 4 -117.52 gain 4 136 -126.26 gain 136 4 -126.77 gain 4 137 -123.13 gain 137 4 -121.12 gain 4 138 -122.67 gain 138 4 -119.67 gain 4 139 -116.38 gain 139 4 -114.36 gain 4 140 -118.38 gain 140 4 -118.97 gain 4 141 -127.22 gain 141 4 -126.48 gain 4 142 -120.44 gain 142 4 -119.00 gain 4 143 -126.25 gain 143 4 -124.43 gain 4 144 -133.72 gain 144 4 -132.92 gain 4 145 -125.46 gain 145 4 -123.11 gain 4 146 -125.83 gain 146 4 -122.39 gain 4 147 -131.28 gain 147 4 -124.92 gain 4 148 -124.54 gain 148 4 -117.91 gain 4 149 -121.58 gain 149 4 -118.12 gain 4 150 -122.52 gain 150 4 -121.74 gain 4 151 -125.64 gain 151 4 -125.05 gain 4 152 -121.53 gain 152 4 -117.92 gain 4 153 -127.69 gain 153 4 -121.66 gain 4 154 -128.02 gain 154 4 -130.54 gain 4 155 -126.97 gain 155 4 -129.39 gain 4 156 -122.89 gain 156 4 -119.69 gain 4 157 -124.59 gain 157 4 -124.34 gain 4 158 -119.71 gain 158 4 -122.06 gain 4 159 -133.16 gain 159 4 -132.13 gain 4 160 -126.29 gain 160 4 -122.36 gain 4 161 -128.44 gain 161 4 -128.01 gain 4 162 -123.62 gain 162 4 -122.05 gain 4 163 -132.29 gain 163 4 -132.87 gain 4 164 -128.82 gain 164 4 -130.44 gain 4 165 -122.21 gain 165 4 -119.87 gain 4 166 -126.95 gain 166 4 -126.18 gain 4 167 -127.44 gain 167 4 -128.76 gain 4 168 -126.20 gain 168 4 -125.96 gain 4 169 -127.15 gain 169 4 -131.12 gain 4 170 -124.45 gain 170 4 -119.94 gain 4 171 -128.55 gain 171 4 -129.06 gain 4 172 -134.13 gain 172 4 -129.35 gain 4 173 -124.81 gain 173 4 -119.46 gain 4 174 -127.46 gain 174 4 -126.41 gain 4 175 -129.16 gain 175 4 -131.66 gain 4 176 -122.67 gain 176 4 -117.18 gain 4 177 -126.65 gain 177 4 -128.98 gain 4 178 -121.51 gain 178 4 -119.66 gain 4 179 -130.79 gain 179 4 -127.33 gain 4 180 -123.22 gain 180 4 -121.23 gain 4 181 -128.23 gain 181 4 -126.31 gain 4 182 -122.33 gain 182 4 -122.80 gain 4 183 -125.32 gain 183 4 -119.17 gain 4 184 -124.08 gain 184 4 -122.71 gain 4 185 -126.87 gain 185 4 -122.99 gain 4 186 -129.35 gain 186 4 -125.75 gain 4 187 -126.68 gain 187 4 -125.62 gain 4 188 -131.78 gain 188 4 -133.99 gain 4 189 -135.05 gain 189 4 -134.77 gain 4 190 -134.40 gain 190 4 -131.13 gain 4 191 -126.07 gain 191 4 -123.89 gain 4 192 -132.52 gain 192 4 -133.21 gain 4 193 -133.04 gain 193 4 -134.98 gain 4 194 -132.75 gain 194 4 -128.49 gain 4 195 -124.43 gain 195 4 -120.82 gain 4 196 -131.50 gain 196 4 -131.93 gain 4 197 -128.95 gain 197 4 -125.44 gain 4 198 -132.73 gain 198 4 -128.74 gain 4 199 -123.03 gain 199 4 -122.95 gain 4 200 -130.88 gain 200 4 -127.75 gain 4 201 -127.42 gain 201 4 -125.09 gain 4 202 -128.22 gain 202 4 -129.88 gain 4 203 -132.67 gain 203 4 -133.96 gain 4 204 -133.67 gain 204 4 -132.24 gain 4 205 -126.46 gain 205 4 -124.11 gain 4 206 -131.56 gain 206 4 -133.73 gain 4 207 -139.01 gain 207 4 -133.54 gain 4 208 -129.51 gain 208 4 -129.81 gain 4 209 -139.16 gain 209 4 -140.45 gain 4 210 -130.32 gain 210 4 -128.56 gain 4 211 -124.33 gain 211 4 -124.58 gain 4 212 -136.30 gain 212 4 -135.10 gain 4 213 -128.00 gain 213 4 -125.99 gain 4 214 -127.03 gain 214 4 -124.91 gain 4 215 -130.07 gain 215 4 -124.36 gain 4 216 -133.87 gain 216 4 -132.82 gain 4 217 -129.05 gain 217 4 -128.52 gain 4 218 -123.50 gain 218 4 -125.16 gain 4 219 -133.35 gain 219 4 -126.37 gain 4 220 -134.75 gain 220 4 -138.26 gain 4 221 -131.18 gain 221 4 -130.33 gain 4 222 -126.13 gain 222 4 -125.61 gain 4 223 -134.48 gain 223 4 -132.58 gain 4 224 -133.53 gain 224 4 -134.31 gain 5 6 -94.56 gain 6 5 -91.82 gain 5 7 -107.35 gain 7 5 -106.99 gain 5 8 -104.22 gain 8 5 -101.19 gain 5 9 -112.63 gain 9 5 -111.06 gain 5 10 -123.94 gain 10 5 -122.85 gain 5 11 -111.40 gain 11 5 -110.15 gain 5 12 -120.41 gain 12 5 -118.62 gain 5 13 -120.77 gain 13 5 -117.94 gain 5 14 -125.74 gain 14 5 -124.77 gain 5 15 -109.87 gain 15 5 -112.52 gain 5 16 -108.61 gain 16 5 -109.08 gain 5 17 -110.75 gain 17 5 -107.65 gain 5 18 -105.04 gain 18 5 -101.77 gain 5 19 -96.41 gain 19 5 -96.14 gain 5 20 -94.01 gain 20 5 -95.18 gain 5 21 -98.31 gain 21 5 -97.40 gain 5 22 -109.30 gain 22 5 -106.99 gain 5 23 -111.01 gain 23 5 -112.97 gain 5 24 -115.03 gain 24 5 -111.40 gain 5 25 -115.99 gain 25 5 -119.12 gain 5 26 -125.55 gain 26 5 -122.56 gain 5 27 -118.03 gain 27 5 -110.94 gain 5 28 -122.40 gain 28 5 -118.00 gain 5 29 -129.26 gain 29 5 -126.74 gain 5 30 -120.64 gain 30 5 -121.59 gain 5 31 -113.79 gain 31 5 -112.36 gain 5 32 -115.49 gain 32 5 -114.09 gain 5 33 -103.86 gain 33 5 -104.71 gain 5 34 -101.56 gain 34 5 -101.00 gain 5 35 -97.11 gain 35 5 -96.38 gain 5 36 -102.76 gain 36 5 -105.81 gain 5 37 -111.62 gain 37 5 -106.88 gain 5 38 -112.61 gain 38 5 -113.88 gain 5 39 -117.19 gain 39 5 -117.32 gain 5 40 -120.27 gain 40 5 -122.46 gain 5 41 -111.67 gain 41 5 -109.49 gain 5 42 -117.00 gain 42 5 -112.96 gain 5 43 -132.36 gain 43 5 -132.22 gain 5 44 -126.04 gain 44 5 -128.95 gain 5 45 -112.88 gain 45 5 -114.27 gain 5 46 -112.80 gain 46 5 -109.98 gain 5 47 -116.05 gain 47 5 -114.29 gain 5 48 -112.18 gain 48 5 -108.21 gain 5 49 -110.74 gain 49 5 -114.74 gain 5 50 -108.49 gain 50 5 -113.46 gain 5 51 -109.55 gain 51 5 -109.66 gain 5 52 -108.31 gain 52 5 -104.43 gain 5 53 -114.03 gain 53 5 -111.17 gain 5 54 -116.18 gain 54 5 -114.02 gain 5 55 -124.42 gain 55 5 -121.56 gain 5 56 -123.26 gain 56 5 -127.73 gain 5 57 -121.05 gain 57 5 -119.39 gain 5 58 -124.76 gain 58 5 -125.85 gain 5 59 -121.51 gain 59 5 -118.71 gain 5 60 -117.39 gain 60 5 -115.93 gain 5 61 -114.57 gain 61 5 -111.85 gain 5 62 -115.16 gain 62 5 -117.66 gain 5 63 -112.30 gain 63 5 -108.03 gain 5 64 -105.70 gain 64 5 -104.40 gain 5 65 -111.60 gain 65 5 -112.39 gain 5 66 -114.15 gain 66 5 -109.20 gain 5 67 -116.97 gain 67 5 -114.28 gain 5 68 -111.98 gain 68 5 -113.86 gain 5 69 -117.33 gain 69 5 -116.50 gain 5 70 -110.37 gain 70 5 -109.29 gain 5 71 -118.90 gain 71 5 -115.93 gain 5 72 -116.28 gain 72 5 -113.72 gain 5 73 -112.59 gain 73 5 -108.43 gain 5 74 -114.68 gain 74 5 -114.40 gain 5 75 -125.89 gain 75 5 -125.75 gain 5 76 -118.61 gain 76 5 -114.41 gain 5 77 -122.65 gain 77 5 -122.12 gain 5 78 -114.44 gain 78 5 -116.76 gain 5 79 -116.02 gain 79 5 -113.13 gain 5 80 -118.27 gain 80 5 -115.87 gain 5 81 -113.95 gain 81 5 -112.14 gain 5 82 -118.62 gain 82 5 -114.45 gain 5 83 -125.45 gain 83 5 -122.31 gain 5 84 -131.73 gain 84 5 -128.73 gain 5 85 -127.11 gain 85 5 -120.92 gain 5 86 -118.93 gain 86 5 -116.12 gain 5 87 -118.42 gain 87 5 -119.58 gain 5 88 -118.09 gain 88 5 -117.00 gain 5 89 -123.95 gain 89 5 -121.45 gain 5 90 -121.04 gain 90 5 -115.55 gain 5 91 -108.36 gain 91 5 -106.82 gain 5 92 -120.27 gain 92 5 -115.69 gain 5 93 -124.33 gain 93 5 -124.53 gain 5 94 -122.30 gain 94 5 -122.38 gain 5 95 -115.48 gain 95 5 -117.82 gain 5 96 -116.24 gain 96 5 -115.92 gain 5 97 -118.60 gain 97 5 -117.02 gain 5 98 -120.22 gain 98 5 -119.44 gain 5 99 -126.84 gain 99 5 -123.88 gain 5 100 -124.03 gain 100 5 -120.63 gain 5 101 -125.00 gain 101 5 -121.76 gain 5 102 -125.39 gain 102 5 -122.93 gain 5 103 -123.20 gain 103 5 -118.23 gain 5 104 -123.51 gain 104 5 -123.92 gain 5 105 -117.69 gain 105 5 -114.04 gain 5 106 -119.97 gain 106 5 -117.41 gain 5 107 -117.96 gain 107 5 -121.96 gain 5 108 -125.13 gain 108 5 -121.44 gain 5 109 -122.83 gain 109 5 -122.63 gain 5 110 -123.21 gain 110 5 -121.49 gain 5 111 -130.04 gain 111 5 -127.99 gain 5 112 -120.60 gain 112 5 -117.44 gain 5 113 -118.90 gain 113 5 -114.54 gain 5 114 -120.30 gain 114 5 -119.24 gain 5 115 -126.87 gain 115 5 -120.11 gain 5 116 -120.85 gain 116 5 -121.64 gain 5 117 -127.91 gain 117 5 -130.20 gain 5 118 -125.55 gain 118 5 -126.16 gain 5 119 -128.62 gain 119 5 -123.89 gain 5 120 -124.82 gain 120 5 -124.61 gain 5 121 -126.81 gain 121 5 -125.88 gain 5 122 -116.31 gain 122 5 -117.50 gain 5 123 -125.32 gain 123 5 -127.29 gain 5 124 -116.84 gain 124 5 -115.21 gain 5 125 -118.99 gain 125 5 -118.70 gain 5 126 -123.83 gain 126 5 -121.49 gain 5 127 -117.43 gain 127 5 -118.56 gain 5 128 -123.48 gain 128 5 -122.55 gain 5 129 -120.00 gain 129 5 -116.98 gain 5 130 -124.46 gain 130 5 -119.26 gain 5 131 -128.55 gain 131 5 -130.44 gain 5 132 -119.11 gain 132 5 -120.62 gain 5 133 -124.82 gain 133 5 -124.41 gain 5 134 -128.06 gain 134 5 -124.34 gain 5 135 -128.98 gain 135 5 -128.83 gain 5 136 -123.08 gain 136 5 -123.54 gain 5 137 -122.03 gain 137 5 -119.98 gain 5 138 -128.26 gain 138 5 -125.21 gain 5 139 -121.34 gain 139 5 -119.28 gain 5 140 -123.42 gain 140 5 -123.97 gain 5 141 -121.06 gain 141 5 -120.28 gain 5 142 -125.87 gain 142 5 -124.39 gain 5 143 -124.57 gain 143 5 -122.71 gain 5 144 -115.64 gain 144 5 -114.79 gain 5 145 -118.20 gain 145 5 -115.80 gain 5 146 -126.62 gain 146 5 -123.14 gain 5 147 -124.44 gain 147 5 -118.04 gain 5 148 -129.00 gain 148 5 -122.32 gain 5 149 -135.24 gain 149 5 -131.72 gain 5 150 -126.06 gain 150 5 -125.24 gain 5 151 -131.42 gain 151 5 -130.79 gain 5 152 -128.55 gain 152 5 -124.90 gain 5 153 -116.00 gain 153 5 -109.93 gain 5 154 -126.98 gain 154 5 -129.45 gain 5 155 -131.57 gain 155 5 -133.94 gain 5 156 -118.02 gain 156 5 -114.78 gain 5 157 -130.15 gain 157 5 -129.85 gain 5 158 -127.13 gain 158 5 -129.42 gain 5 159 -115.60 gain 159 5 -114.52 gain 5 160 -123.00 gain 160 5 -119.03 gain 5 161 -125.00 gain 161 5 -124.52 gain 5 162 -131.24 gain 162 5 -129.62 gain 5 163 -126.83 gain 163 5 -127.36 gain 5 164 -130.72 gain 164 5 -132.29 gain 5 165 -123.64 gain 165 5 -121.25 gain 5 166 -129.04 gain 166 5 -128.22 gain 5 167 -126.81 gain 167 5 -128.08 gain 5 168 -116.37 gain 168 5 -116.09 gain 5 169 -126.14 gain 169 5 -130.06 gain 5 170 -124.74 gain 170 5 -120.19 gain 5 171 -122.63 gain 171 5 -123.10 gain 5 172 -124.95 gain 172 5 -120.12 gain 5 173 -125.95 gain 173 5 -120.55 gain 5 174 -128.61 gain 174 5 -127.51 gain 5 175 -124.27 gain 175 5 -126.72 gain 5 176 -128.08 gain 176 5 -122.54 gain 5 177 -132.16 gain 177 5 -134.44 gain 5 178 -126.32 gain 178 5 -124.42 gain 5 179 -129.65 gain 179 5 -126.14 gain 5 180 -124.64 gain 180 5 -122.60 gain 5 181 -122.83 gain 181 5 -120.86 gain 5 182 -130.53 gain 182 5 -130.94 gain 5 183 -123.97 gain 183 5 -117.78 gain 5 184 -123.79 gain 184 5 -122.38 gain 5 185 -130.77 gain 185 5 -126.84 gain 5 186 -119.35 gain 186 5 -115.71 gain 5 187 -133.19 gain 187 5 -132.09 gain 5 188 -126.99 gain 188 5 -129.14 gain 5 189 -126.07 gain 189 5 -125.74 gain 5 190 -140.40 gain 190 5 -137.09 gain 5 191 -129.58 gain 191 5 -127.35 gain 5 192 -127.88 gain 192 5 -128.52 gain 5 193 -140.34 gain 193 5 -142.23 gain 5 194 -133.69 gain 194 5 -129.39 gain 5 195 -137.80 gain 195 5 -134.14 gain 5 196 -130.94 gain 196 5 -131.31 gain 5 197 -127.69 gain 197 5 -124.13 gain 5 198 -124.21 gain 198 5 -120.17 gain 5 199 -131.90 gain 199 5 -131.78 gain 5 200 -129.05 gain 200 5 -125.86 gain 5 201 -126.52 gain 201 5 -124.14 gain 5 202 -135.67 gain 202 5 -137.29 gain 5 203 -120.81 gain 203 5 -122.05 gain 5 204 -127.06 gain 204 5 -125.58 gain 5 205 -132.67 gain 205 5 -130.27 gain 5 206 -133.70 gain 206 5 -135.82 gain 5 207 -125.91 gain 207 5 -120.39 gain 5 208 -129.45 gain 208 5 -129.71 gain 5 209 -127.17 gain 209 5 -128.42 gain 5 210 -132.42 gain 210 5 -130.60 gain 5 211 -123.61 gain 211 5 -123.81 gain 5 212 -132.21 gain 212 5 -130.96 gain 5 213 -132.05 gain 213 5 -129.99 gain 5 214 -132.10 gain 214 5 -129.93 gain 5 215 -133.18 gain 215 5 -127.43 gain 5 216 -133.09 gain 216 5 -132.00 gain 5 217 -127.62 gain 217 5 -127.04 gain 5 218 -131.35 gain 218 5 -132.96 gain 5 219 -130.27 gain 219 5 -123.24 gain 5 220 -136.19 gain 220 5 -139.65 gain 5 221 -128.22 gain 221 5 -127.33 gain 5 222 -132.23 gain 222 5 -131.66 gain 5 223 -129.81 gain 223 5 -127.86 gain 5 224 -136.91 gain 224 5 -137.64 gain 6 7 -88.00 gain 7 6 -90.38 gain 6 8 -98.14 gain 8 6 -97.85 gain 6 9 -102.18 gain 9 6 -103.36 gain 6 10 -107.47 gain 10 6 -109.12 gain 6 11 -108.62 gain 11 6 -110.12 gain 6 12 -115.12 gain 12 6 -116.08 gain 6 13 -115.41 gain 13 6 -115.32 gain 6 14 -117.86 gain 14 6 -119.64 gain 6 15 -115.20 gain 15 6 -120.60 gain 6 16 -117.16 gain 16 6 -120.37 gain 6 17 -110.41 gain 17 6 -110.05 gain 6 18 -107.80 gain 18 6 -107.28 gain 6 19 -100.90 gain 19 6 -103.38 gain 6 20 -99.68 gain 20 6 -103.59 gain 6 21 -99.92 gain 21 6 -101.75 gain 6 22 -96.02 gain 22 6 -96.45 gain 6 23 -109.53 gain 23 6 -114.24 gain 6 24 -103.84 gain 24 6 -102.96 gain 6 25 -111.62 gain 25 6 -117.49 gain 6 26 -119.01 gain 26 6 -118.77 gain 6 27 -115.04 gain 27 6 -110.69 gain 6 28 -119.71 gain 28 6 -118.06 gain 6 29 -117.13 gain 29 6 -117.36 gain 6 30 -119.31 gain 30 6 -123.00 gain 6 31 -113.23 gain 31 6 -114.54 gain 6 32 -110.24 gain 32 6 -111.58 gain 6 33 -106.45 gain 33 6 -110.04 gain 6 34 -110.19 gain 34 6 -112.38 gain 6 35 -97.24 gain 35 6 -99.26 gain 6 36 -102.79 gain 36 6 -108.59 gain 6 37 -100.01 gain 37 6 -98.01 gain 6 38 -104.96 gain 38 6 -108.98 gain 6 39 -110.82 gain 39 6 -113.70 gain 6 40 -115.90 gain 40 6 -120.83 gain 6 41 -114.40 gain 41 6 -114.96 gain 6 42 -113.30 gain 42 6 -112.01 gain 6 43 -112.91 gain 43 6 -115.51 gain 6 44 -116.09 gain 44 6 -121.75 gain 6 45 -120.08 gain 45 6 -124.21 gain 6 46 -118.87 gain 46 6 -118.80 gain 6 47 -108.56 gain 47 6 -109.55 gain 6 48 -112.23 gain 48 6 -111.01 gain 6 49 -108.43 gain 49 6 -115.18 gain 6 50 -107.18 gain 50 6 -114.89 gain 6 51 -113.18 gain 51 6 -116.03 gain 6 52 -109.69 gain 52 6 -108.56 gain 6 53 -108.16 gain 53 6 -108.04 gain 6 54 -117.83 gain 54 6 -118.41 gain 6 55 -116.32 gain 55 6 -116.21 gain 6 56 -116.51 gain 56 6 -123.72 gain 6 57 -117.01 gain 57 6 -118.09 gain 6 58 -118.60 gain 58 6 -122.42 gain 6 59 -122.07 gain 59 6 -122.02 gain 6 60 -113.58 gain 60 6 -114.85 gain 6 61 -122.55 gain 61 6 -122.58 gain 6 62 -116.03 gain 62 6 -121.28 gain 6 63 -116.51 gain 63 6 -114.98 gain 6 64 -107.76 gain 64 6 -109.20 gain 6 65 -101.82 gain 65 6 -105.35 gain 6 66 -108.02 gain 66 6 -105.81 gain 6 67 -112.68 gain 67 6 -112.74 gain 6 68 -104.11 gain 68 6 -108.74 gain 6 69 -117.92 gain 69 6 -119.83 gain 6 70 -118.71 gain 70 6 -120.38 gain 6 71 -109.11 gain 71 6 -108.88 gain 6 72 -112.29 gain 72 6 -112.48 gain 6 73 -124.81 gain 73 6 -123.40 gain 6 74 -123.04 gain 74 6 -125.50 gain 6 75 -117.05 gain 75 6 -119.65 gain 6 76 -121.08 gain 76 6 -119.63 gain 6 77 -119.73 gain 77 6 -121.95 gain 6 78 -118.41 gain 78 6 -123.47 gain 6 79 -120.45 gain 79 6 -120.29 gain 6 80 -114.00 gain 80 6 -114.35 gain 6 81 -112.34 gain 81 6 -113.28 gain 6 82 -112.44 gain 82 6 -111.01 gain 6 83 -104.75 gain 83 6 -104.35 gain 6 84 -118.16 gain 84 6 -117.90 gain 6 85 -116.52 gain 85 6 -113.08 gain 6 86 -111.05 gain 86 6 -110.99 gain 6 87 -113.65 gain 87 6 -117.55 gain 6 88 -110.22 gain 88 6 -111.87 gain 6 89 -120.13 gain 89 6 -120.38 gain 6 90 -129.07 gain 90 6 -126.33 gain 6 91 -127.72 gain 91 6 -128.92 gain 6 92 -123.99 gain 92 6 -122.15 gain 6 93 -123.36 gain 93 6 -126.31 gain 6 94 -121.22 gain 94 6 -124.05 gain 6 95 -113.87 gain 95 6 -118.95 gain 6 96 -113.79 gain 96 6 -116.21 gain 6 97 -109.70 gain 97 6 -110.86 gain 6 98 -118.47 gain 98 6 -120.43 gain 6 99 -122.42 gain 99 6 -122.20 gain 6 100 -113.09 gain 100 6 -112.44 gain 6 101 -117.58 gain 101 6 -117.09 gain 6 102 -113.30 gain 102 6 -113.59 gain 6 103 -117.19 gain 103 6 -114.96 gain 6 104 -116.79 gain 104 6 -119.94 gain 6 105 -122.44 gain 105 6 -121.53 gain 6 106 -119.68 gain 106 6 -119.85 gain 6 107 -120.84 gain 107 6 -127.58 gain 6 108 -112.11 gain 108 6 -111.17 gain 6 109 -116.55 gain 109 6 -119.10 gain 6 110 -118.57 gain 110 6 -119.59 gain 6 111 -115.70 gain 111 6 -116.40 gain 6 112 -123.14 gain 112 6 -122.72 gain 6 113 -116.85 gain 113 6 -115.23 gain 6 114 -122.32 gain 114 6 -124.01 gain 6 115 -118.79 gain 115 6 -114.78 gain 6 116 -122.43 gain 116 6 -125.96 gain 6 117 -125.08 gain 117 6 -130.11 gain 6 118 -128.68 gain 118 6 -132.03 gain 6 119 -123.54 gain 119 6 -121.56 gain 6 120 -115.89 gain 120 6 -118.42 gain 6 121 -126.21 gain 121 6 -128.03 gain 6 122 -120.73 gain 122 6 -124.67 gain 6 123 -125.27 gain 123 6 -129.98 gain 6 124 -118.11 gain 124 6 -119.23 gain 6 125 -110.72 gain 125 6 -113.18 gain 6 126 -116.97 gain 126 6 -117.38 gain 6 127 -109.21 gain 127 6 -113.09 gain 6 128 -123.90 gain 128 6 -125.71 gain 6 129 -122.88 gain 129 6 -122.60 gain 6 130 -124.30 gain 130 6 -121.85 gain 6 131 -123.97 gain 131 6 -128.60 gain 6 132 -115.73 gain 132 6 -119.99 gain 6 133 -125.54 gain 133 6 -127.87 gain 6 134 -134.39 gain 134 6 -133.42 gain 6 135 -126.29 gain 135 6 -128.89 gain 6 136 -126.57 gain 136 6 -129.78 gain 6 137 -123.84 gain 137 6 -124.53 gain 6 138 -123.94 gain 138 6 -123.63 gain 6 139 -121.37 gain 139 6 -122.05 gain 6 140 -111.62 gain 140 6 -114.90 gain 6 141 -116.09 gain 141 6 -118.05 gain 6 142 -118.31 gain 142 6 -119.57 gain 6 143 -132.26 gain 143 6 -133.14 gain 6 144 -127.19 gain 144 6 -129.09 gain 6 145 -123.58 gain 145 6 -123.93 gain 6 146 -119.38 gain 146 6 -118.64 gain 6 147 -114.04 gain 147 6 -110.39 gain 6 148 -124.92 gain 148 6 -120.98 gain 6 149 -123.61 gain 149 6 -122.84 gain 6 150 -128.35 gain 150 6 -130.27 gain 6 151 -117.80 gain 151 6 -119.91 gain 6 152 -118.40 gain 152 6 -117.49 gain 6 153 -122.15 gain 153 6 -118.82 gain 6 154 -121.39 gain 154 6 -126.61 gain 6 155 -113.93 gain 155 6 -119.04 gain 6 156 -117.03 gain 156 6 -116.53 gain 6 157 -119.86 gain 157 6 -122.31 gain 6 158 -123.27 gain 158 6 -128.31 gain 6 159 -125.46 gain 159 6 -127.12 gain 6 160 -116.23 gain 160 6 -114.99 gain 6 161 -127.12 gain 161 6 -129.38 gain 6 162 -118.87 gain 162 6 -119.99 gain 6 163 -123.83 gain 163 6 -127.10 gain 6 164 -131.11 gain 164 6 -135.42 gain 6 165 -127.76 gain 165 6 -128.12 gain 6 166 -135.93 gain 166 6 -137.86 gain 6 167 -127.26 gain 167 6 -131.27 gain 6 168 -118.43 gain 168 6 -120.90 gain 6 169 -119.29 gain 169 6 -125.96 gain 6 170 -122.12 gain 170 6 -120.31 gain 6 171 -125.69 gain 171 6 -128.90 gain 6 172 -121.77 gain 172 6 -119.68 gain 6 173 -125.88 gain 173 6 -123.22 gain 6 174 -116.88 gain 174 6 -118.52 gain 6 175 -126.90 gain 175 6 -132.09 gain 6 176 -126.21 gain 176 6 -123.42 gain 6 177 -129.33 gain 177 6 -134.35 gain 6 178 -128.27 gain 178 6 -129.12 gain 6 179 -133.05 gain 179 6 -132.28 gain 6 180 -126.26 gain 180 6 -126.97 gain 6 181 -121.85 gain 181 6 -122.63 gain 6 182 -120.56 gain 182 6 -123.72 gain 6 183 -131.41 gain 183 6 -127.95 gain 6 184 -124.71 gain 184 6 -126.04 gain 6 185 -122.27 gain 185 6 -121.08 gain 6 186 -120.95 gain 186 6 -120.05 gain 6 187 -127.71 gain 187 6 -129.35 gain 6 188 -123.88 gain 188 6 -128.78 gain 6 189 -128.40 gain 189 6 -130.82 gain 6 190 -124.26 gain 190 6 -123.68 gain 6 191 -122.31 gain 191 6 -122.83 gain 6 192 -120.55 gain 192 6 -123.93 gain 6 193 -126.86 gain 193 6 -131.49 gain 6 194 -126.31 gain 194 6 -124.76 gain 6 195 -128.43 gain 195 6 -127.51 gain 6 196 -129.50 gain 196 6 -132.62 gain 6 197 -122.02 gain 197 6 -121.21 gain 6 198 -123.45 gain 198 6 -122.15 gain 6 199 -127.09 gain 199 6 -129.71 gain 6 200 -131.06 gain 200 6 -130.62 gain 6 201 -127.92 gain 201 6 -128.28 gain 6 202 -129.97 gain 202 6 -134.34 gain 6 203 -123.35 gain 203 6 -127.33 gain 6 204 -121.62 gain 204 6 -122.89 gain 6 205 -132.94 gain 205 6 -133.28 gain 6 206 -124.20 gain 206 6 -129.07 gain 6 207 -116.65 gain 207 6 -113.88 gain 6 208 -132.01 gain 208 6 -135.01 gain 6 209 -128.31 gain 209 6 -132.30 gain 6 210 -126.53 gain 210 6 -127.46 gain 6 211 -128.35 gain 211 6 -131.31 gain 6 212 -126.90 gain 212 6 -128.40 gain 6 213 -126.93 gain 213 6 -127.62 gain 6 214 -127.99 gain 214 6 -128.57 gain 6 215 -120.94 gain 215 6 -117.93 gain 6 216 -129.42 gain 216 6 -131.07 gain 6 217 -124.21 gain 217 6 -126.38 gain 6 218 -124.85 gain 218 6 -129.21 gain 6 219 -123.91 gain 219 6 -119.63 gain 6 220 -127.46 gain 220 6 -133.67 gain 6 221 -131.93 gain 221 6 -133.78 gain 6 222 -128.87 gain 222 6 -131.05 gain 6 223 -125.00 gain 223 6 -125.79 gain 6 224 -125.09 gain 224 6 -128.57 gain 7 8 -92.57 gain 8 7 -89.91 gain 7 9 -98.30 gain 9 7 -97.10 gain 7 10 -115.20 gain 10 7 -114.47 gain 7 11 -115.00 gain 11 7 -114.11 gain 7 12 -117.36 gain 12 7 -115.94 gain 7 13 -121.06 gain 13 7 -118.59 gain 7 14 -123.63 gain 14 7 -123.02 gain 7 15 -119.58 gain 15 7 -122.59 gain 7 16 -115.55 gain 16 7 -116.38 gain 7 17 -121.51 gain 17 7 -118.77 gain 7 18 -111.87 gain 18 7 -108.97 gain 7 19 -107.54 gain 19 7 -107.64 gain 7 20 -108.04 gain 20 7 -109.57 gain 7 21 -106.07 gain 21 7 -105.53 gain 7 22 -93.48 gain 22 7 -91.53 gain 7 23 -104.03 gain 23 7 -106.35 gain 7 24 -106.31 gain 24 7 -103.05 gain 7 25 -114.32 gain 25 7 -117.81 gain 7 26 -108.99 gain 26 7 -106.37 gain 7 27 -116.39 gain 27 7 -109.66 gain 7 28 -123.86 gain 28 7 -119.82 gain 7 29 -118.56 gain 29 7 -116.40 gain 7 30 -120.36 gain 30 7 -121.67 gain 7 31 -117.40 gain 31 7 -116.32 gain 7 32 -104.84 gain 32 7 -103.79 gain 7 33 -117.87 gain 33 7 -119.08 gain 7 34 -114.11 gain 34 7 -113.92 gain 7 35 -105.64 gain 35 7 -105.28 gain 7 36 -109.84 gain 36 7 -113.25 gain 7 37 -102.46 gain 37 7 -98.07 gain 7 38 -104.14 gain 38 7 -105.78 gain 7 39 -102.95 gain 39 7 -103.45 gain 7 40 -114.08 gain 40 7 -116.63 gain 7 41 -112.49 gain 41 7 -110.67 gain 7 42 -118.00 gain 42 7 -114.33 gain 7 43 -118.40 gain 43 7 -118.62 gain 7 44 -126.42 gain 44 7 -129.69 gain 7 45 -114.61 gain 45 7 -116.36 gain 7 46 -122.08 gain 46 7 -119.62 gain 7 47 -113.55 gain 47 7 -112.15 gain 7 48 -114.94 gain 48 7 -111.34 gain 7 49 -109.81 gain 49 7 -114.18 gain 7 50 -116.15 gain 50 7 -121.48 gain 7 51 -106.93 gain 51 7 -107.40 gain 7 52 -108.64 gain 52 7 -105.13 gain 7 53 -117.96 gain 53 7 -115.46 gain 7 54 -106.65 gain 54 7 -104.85 gain 7 55 -119.95 gain 55 7 -117.45 gain 7 56 -113.44 gain 56 7 -118.27 gain 7 57 -117.55 gain 57 7 -116.25 gain 7 58 -128.79 gain 58 7 -130.24 gain 7 59 -122.14 gain 59 7 -119.71 gain 7 60 -124.20 gain 60 7 -123.09 gain 7 61 -120.63 gain 61 7 -118.28 gain 7 62 -117.96 gain 62 7 -120.82 gain 7 63 -115.24 gain 63 7 -111.32 gain 7 64 -119.53 gain 64 7 -118.59 gain 7 65 -115.68 gain 65 7 -116.83 gain 7 66 -114.19 gain 66 7 -109.60 gain 7 67 -116.22 gain 67 7 -113.90 gain 7 68 -112.40 gain 68 7 -114.64 gain 7 69 -111.06 gain 69 7 -110.60 gain 7 70 -113.60 gain 70 7 -112.89 gain 7 71 -117.94 gain 71 7 -115.33 gain 7 72 -117.04 gain 72 7 -114.85 gain 7 73 -124.04 gain 73 7 -120.24 gain 7 74 -123.31 gain 74 7 -123.39 gain 7 75 -118.25 gain 75 7 -118.47 gain 7 76 -117.76 gain 76 7 -113.93 gain 7 77 -111.89 gain 77 7 -111.72 gain 7 78 -115.95 gain 78 7 -118.63 gain 7 79 -117.25 gain 79 7 -114.71 gain 7 80 -119.44 gain 80 7 -117.40 gain 7 81 -121.78 gain 81 7 -120.34 gain 7 82 -116.72 gain 82 7 -112.90 gain 7 83 -113.90 gain 83 7 -111.11 gain 7 84 -111.89 gain 84 7 -109.26 gain 7 85 -115.56 gain 85 7 -109.73 gain 7 86 -115.27 gain 86 7 -112.83 gain 7 87 -123.32 gain 87 7 -124.84 gain 7 88 -122.63 gain 88 7 -121.90 gain 7 89 -127.13 gain 89 7 -125.00 gain 7 90 -123.09 gain 90 7 -117.97 gain 7 91 -123.64 gain 91 7 -122.46 gain 7 92 -128.90 gain 92 7 -124.69 gain 7 93 -122.27 gain 93 7 -122.84 gain 7 94 -117.90 gain 94 7 -118.34 gain 7 95 -114.96 gain 95 7 -117.66 gain 7 96 -124.55 gain 96 7 -124.59 gain 7 97 -114.41 gain 97 7 -113.20 gain 7 98 -110.72 gain 98 7 -110.30 gain 7 99 -118.74 gain 99 7 -116.14 gain 7 100 -124.46 gain 100 7 -121.43 gain 7 101 -125.44 gain 101 7 -122.57 gain 7 102 -122.12 gain 102 7 -120.03 gain 7 103 -128.97 gain 103 7 -124.36 gain 7 104 -129.15 gain 104 7 -129.92 gain 7 105 -119.11 gain 105 7 -115.83 gain 7 106 -126.90 gain 106 7 -124.69 gain 7 107 -125.35 gain 107 7 -129.71 gain 7 108 -124.63 gain 108 7 -121.31 gain 7 109 -127.52 gain 109 7 -127.69 gain 7 110 -121.32 gain 110 7 -119.96 gain 7 111 -119.25 gain 111 7 -117.56 gain 7 112 -122.95 gain 112 7 -120.15 gain 7 113 -126.44 gain 113 7 -122.44 gain 7 114 -119.39 gain 114 7 -118.70 gain 7 115 -121.11 gain 115 7 -114.72 gain 7 116 -130.32 gain 116 7 -131.48 gain 7 117 -122.36 gain 117 7 -125.01 gain 7 118 -122.22 gain 118 7 -123.19 gain 7 119 -114.02 gain 119 7 -109.65 gain 7 120 -121.13 gain 120 7 -121.28 gain 7 121 -127.11 gain 121 7 -126.55 gain 7 122 -126.06 gain 122 7 -127.62 gain 7 123 -118.83 gain 123 7 -121.16 gain 7 124 -129.92 gain 124 7 -128.66 gain 7 125 -121.65 gain 125 7 -121.73 gain 7 126 -119.44 gain 126 7 -117.46 gain 7 127 -121.99 gain 127 7 -123.48 gain 7 128 -126.19 gain 128 7 -125.63 gain 7 129 -133.01 gain 129 7 -130.35 gain 7 130 -120.05 gain 130 7 -115.21 gain 7 131 -121.89 gain 131 7 -124.14 gain 7 132 -127.28 gain 132 7 -129.15 gain 7 133 -120.32 gain 133 7 -120.27 gain 7 134 -130.15 gain 134 7 -126.80 gain 7 135 -125.30 gain 135 7 -125.51 gain 7 136 -129.83 gain 136 7 -130.66 gain 7 137 -122.83 gain 137 7 -121.14 gain 7 138 -121.52 gain 138 7 -118.83 gain 7 139 -122.87 gain 139 7 -121.17 gain 7 140 -125.27 gain 140 7 -126.18 gain 7 141 -121.32 gain 141 7 -120.89 gain 7 142 -122.15 gain 142 7 -121.03 gain 7 143 -124.43 gain 143 7 -122.92 gain 7 144 -122.80 gain 144 7 -122.32 gain 7 145 -129.47 gain 145 7 -127.44 gain 7 146 -125.70 gain 146 7 -122.58 gain 7 147 -127.99 gain 147 7 -121.96 gain 7 148 -130.10 gain 148 7 -123.78 gain 7 149 -128.66 gain 149 7 -125.51 gain 7 150 -123.34 gain 150 7 -122.87 gain 7 151 -132.57 gain 151 7 -132.30 gain 7 152 -122.21 gain 152 7 -118.92 gain 7 153 -122.22 gain 153 7 -116.51 gain 7 154 -122.17 gain 154 7 -125.00 gain 7 155 -126.08 gain 155 7 -128.81 gain 7 156 -126.23 gain 156 7 -123.34 gain 7 157 -123.53 gain 157 7 -123.59 gain 7 158 -115.88 gain 158 7 -118.54 gain 7 159 -126.67 gain 159 7 -125.95 gain 7 160 -127.59 gain 160 7 -123.97 gain 7 161 -128.52 gain 161 7 -128.39 gain 7 162 -130.87 gain 162 7 -129.61 gain 7 163 -127.80 gain 163 7 -128.69 gain 7 164 -122.63 gain 164 7 -124.56 gain 7 165 -130.87 gain 165 7 -128.85 gain 7 166 -126.99 gain 166 7 -126.54 gain 7 167 -127.11 gain 167 7 -128.75 gain 7 168 -120.65 gain 168 7 -120.73 gain 7 169 -127.25 gain 169 7 -131.54 gain 7 170 -116.60 gain 170 7 -112.41 gain 7 171 -134.48 gain 171 7 -135.31 gain 7 172 -128.87 gain 172 7 -124.40 gain 7 173 -122.08 gain 173 7 -117.05 gain 7 174 -125.49 gain 174 7 -124.75 gain 7 175 -128.86 gain 175 7 -131.67 gain 7 176 -131.17 gain 176 7 -126.00 gain 7 177 -124.39 gain 177 7 -127.03 gain 7 178 -118.24 gain 178 7 -116.70 gain 7 179 -126.32 gain 179 7 -123.17 gain 7 180 -132.19 gain 180 7 -130.51 gain 7 181 -129.39 gain 181 7 -127.78 gain 7 182 -124.05 gain 182 7 -124.83 gain 7 183 -130.29 gain 183 7 -124.45 gain 7 184 -124.53 gain 184 7 -123.48 gain 7 185 -127.62 gain 185 7 -124.05 gain 7 186 -125.32 gain 186 7 -122.04 gain 7 187 -127.63 gain 187 7 -126.89 gain 7 188 -122.01 gain 188 7 -124.53 gain 7 189 -123.19 gain 189 7 -123.22 gain 7 190 -123.80 gain 190 7 -120.84 gain 7 191 -125.38 gain 191 7 -123.51 gain 7 192 -129.55 gain 192 7 -130.56 gain 7 193 -130.25 gain 193 7 -132.51 gain 7 194 -126.39 gain 194 7 -122.46 gain 7 195 -121.81 gain 195 7 -118.51 gain 7 196 -122.08 gain 196 7 -122.82 gain 7 197 -124.28 gain 197 7 -121.08 gain 7 198 -125.86 gain 198 7 -122.19 gain 7 199 -121.24 gain 199 7 -121.48 gain 7 200 -132.83 gain 200 7 -130.01 gain 7 201 -131.91 gain 201 7 -129.89 gain 7 202 -120.82 gain 202 7 -122.81 gain 7 203 -126.28 gain 203 7 -127.88 gain 7 204 -130.40 gain 204 7 -129.29 gain 7 205 -132.92 gain 205 7 -130.88 gain 7 206 -126.71 gain 206 7 -129.19 gain 7 207 -127.02 gain 207 7 -121.86 gain 7 208 -126.77 gain 208 7 -127.39 gain 7 209 -131.50 gain 209 7 -133.11 gain 7 210 -126.28 gain 210 7 -124.82 gain 7 211 -133.57 gain 211 7 -134.14 gain 7 212 -139.68 gain 212 7 -138.80 gain 7 213 -127.60 gain 213 7 -125.91 gain 7 214 -127.83 gain 214 7 -126.02 gain 7 215 -125.60 gain 215 7 -120.21 gain 7 216 -125.00 gain 216 7 -124.27 gain 7 217 -126.74 gain 217 7 -126.52 gain 7 218 -128.09 gain 218 7 -130.07 gain 7 219 -129.21 gain 219 7 -122.55 gain 7 220 -131.30 gain 220 7 -135.13 gain 7 221 -126.47 gain 221 7 -125.94 gain 7 222 -127.74 gain 222 7 -127.53 gain 7 223 -125.63 gain 223 7 -124.03 gain 7 224 -131.00 gain 224 7 -132.09 gain 8 9 -90.79 gain 9 8 -92.25 gain 8 10 -99.91 gain 10 8 -101.85 gain 8 11 -113.30 gain 11 8 -115.08 gain 8 12 -108.51 gain 12 8 -109.75 gain 8 13 -116.70 gain 13 8 -116.90 gain 8 14 -111.72 gain 14 8 -113.78 gain 8 15 -125.30 gain 15 8 -130.98 gain 8 16 -116.54 gain 16 8 -120.04 gain 8 17 -110.91 gain 17 8 -110.84 gain 8 18 -119.24 gain 18 8 -119.01 gain 8 19 -110.38 gain 19 8 -113.14 gain 8 20 -106.66 gain 20 8 -110.86 gain 8 21 -105.79 gain 21 8 -107.92 gain 8 22 -98.13 gain 22 8 -98.85 gain 8 23 -81.14 gain 23 8 -86.13 gain 8 24 -96.43 gain 24 8 -95.84 gain 8 25 -103.08 gain 25 8 -109.23 gain 8 26 -111.55 gain 26 8 -111.59 gain 8 27 -116.39 gain 27 8 -112.32 gain 8 28 -112.62 gain 28 8 -111.25 gain 8 29 -112.27 gain 29 8 -112.78 gain 8 30 -128.31 gain 30 8 -132.29 gain 8 31 -122.44 gain 31 8 -124.04 gain 8 32 -125.38 gain 32 8 -127.01 gain 8 33 -118.28 gain 33 8 -122.16 gain 8 34 -102.77 gain 34 8 -105.25 gain 8 35 -105.69 gain 35 8 -107.99 gain 8 36 -111.54 gain 36 8 -117.63 gain 8 37 -102.15 gain 37 8 -100.43 gain 8 38 -100.27 gain 38 8 -104.58 gain 8 39 -100.00 gain 39 8 -103.17 gain 8 40 -98.88 gain 40 8 -104.10 gain 8 41 -113.84 gain 41 8 -114.68 gain 8 42 -113.99 gain 42 8 -112.99 gain 8 43 -119.84 gain 43 8 -122.73 gain 8 44 -115.47 gain 44 8 -121.42 gain 8 45 -116.00 gain 45 8 -120.42 gain 8 46 -113.06 gain 46 8 -113.27 gain 8 47 -115.47 gain 47 8 -116.74 gain 8 48 -111.23 gain 48 8 -110.29 gain 8 49 -111.15 gain 49 8 -118.19 gain 8 50 -110.79 gain 50 8 -118.79 gain 8 51 -104.67 gain 51 8 -107.81 gain 8 52 -104.42 gain 52 8 -103.58 gain 8 53 -94.37 gain 53 8 -94.55 gain 8 54 -101.08 gain 54 8 -101.96 gain 8 55 -104.88 gain 55 8 -105.05 gain 8 56 -111.70 gain 56 8 -119.20 gain 8 57 -117.11 gain 57 8 -118.48 gain 8 58 -112.23 gain 58 8 -116.34 gain 8 59 -115.65 gain 59 8 -115.89 gain 8 60 -112.69 gain 60 8 -114.25 gain 8 61 -122.73 gain 61 8 -123.04 gain 8 62 -118.47 gain 62 8 -124.00 gain 8 63 -116.39 gain 63 8 -115.14 gain 8 64 -112.54 gain 64 8 -114.27 gain 8 65 -107.82 gain 65 8 -111.64 gain 8 66 -113.79 gain 66 8 -111.86 gain 8 67 -114.80 gain 67 8 -115.15 gain 8 68 -107.45 gain 68 8 -112.36 gain 8 69 -112.32 gain 69 8 -114.52 gain 8 70 -114.34 gain 70 8 -116.30 gain 8 71 -106.50 gain 71 8 -106.56 gain 8 72 -114.06 gain 72 8 -114.53 gain 8 73 -113.38 gain 73 8 -112.25 gain 8 74 -116.65 gain 74 8 -119.40 gain 8 75 -121.34 gain 75 8 -124.22 gain 8 76 -124.96 gain 76 8 -123.80 gain 8 77 -121.12 gain 77 8 -123.63 gain 8 78 -112.93 gain 78 8 -118.29 gain 8 79 -122.27 gain 79 8 -122.40 gain 8 80 -121.89 gain 80 8 -122.52 gain 8 81 -107.11 gain 81 8 -108.33 gain 8 82 -115.38 gain 82 8 -114.23 gain 8 83 -108.43 gain 83 8 -108.31 gain 8 84 -115.82 gain 84 8 -115.85 gain 8 85 -108.33 gain 85 8 -105.17 gain 8 86 -118.56 gain 86 8 -118.78 gain 8 87 -119.27 gain 87 8 -123.45 gain 8 88 -122.45 gain 88 8 -124.39 gain 8 89 -116.46 gain 89 8 -117.00 gain 8 90 -114.82 gain 90 8 -112.36 gain 8 91 -120.70 gain 91 8 -122.19 gain 8 92 -117.92 gain 92 8 -116.37 gain 8 93 -115.97 gain 93 8 -119.20 gain 8 94 -105.47 gain 94 8 -108.59 gain 8 95 -116.35 gain 95 8 -121.71 gain 8 96 -118.22 gain 96 8 -120.92 gain 8 97 -116.73 gain 97 8 -118.18 gain 8 98 -119.27 gain 98 8 -121.52 gain 8 99 -122.49 gain 99 8 -122.56 gain 8 100 -111.33 gain 100 8 -110.96 gain 8 101 -117.21 gain 101 8 -117.01 gain 8 102 -114.91 gain 102 8 -115.48 gain 8 103 -117.24 gain 103 8 -115.30 gain 8 104 -121.05 gain 104 8 -124.48 gain 8 105 -120.18 gain 105 8 -119.56 gain 8 106 -121.54 gain 106 8 -122.00 gain 8 107 -127.07 gain 107 8 -134.10 gain 8 108 -118.46 gain 108 8 -117.81 gain 8 109 -118.81 gain 109 8 -121.64 gain 8 110 -121.66 gain 110 8 -122.97 gain 8 111 -120.67 gain 111 8 -121.66 gain 8 112 -115.54 gain 112 8 -115.41 gain 8 113 -115.10 gain 113 8 -113.77 gain 8 114 -118.75 gain 114 8 -120.73 gain 8 115 -116.66 gain 115 8 -112.94 gain 8 116 -115.10 gain 116 8 -118.92 gain 8 117 -124.36 gain 117 8 -129.67 gain 8 118 -116.99 gain 118 8 -120.63 gain 8 119 -115.85 gain 119 8 -114.15 gain 8 120 -119.98 gain 120 8 -122.80 gain 8 121 -124.70 gain 121 8 -126.80 gain 8 122 -118.61 gain 122 8 -122.83 gain 8 123 -122.44 gain 123 8 -127.44 gain 8 124 -124.64 gain 124 8 -126.05 gain 8 125 -128.86 gain 125 8 -131.60 gain 8 126 -117.97 gain 126 8 -118.66 gain 8 127 -127.60 gain 127 8 -131.76 gain 8 128 -118.91 gain 128 8 -121.01 gain 8 129 -123.45 gain 129 8 -123.46 gain 8 130 -120.70 gain 130 8 -118.53 gain 8 131 -129.23 gain 131 8 -134.15 gain 8 132 -120.45 gain 132 8 -124.99 gain 8 133 -118.43 gain 133 8 -121.05 gain 8 134 -113.73 gain 134 8 -113.05 gain 8 135 -124.41 gain 135 8 -127.29 gain 8 136 -124.53 gain 136 8 -128.03 gain 8 137 -123.22 gain 137 8 -124.20 gain 8 138 -115.16 gain 138 8 -115.14 gain 8 139 -127.20 gain 139 8 -128.16 gain 8 140 -120.44 gain 140 8 -124.01 gain 8 141 -123.79 gain 141 8 -126.04 gain 8 142 -122.90 gain 142 8 -124.45 gain 8 143 -124.19 gain 143 8 -125.35 gain 8 144 -117.22 gain 144 8 -119.41 gain 8 145 -117.18 gain 145 8 -117.81 gain 8 146 -121.67 gain 146 8 -121.22 gain 8 147 -126.54 gain 147 8 -123.18 gain 8 148 -123.53 gain 148 8 -119.88 gain 8 149 -122.52 gain 149 8 -122.04 gain 8 150 -117.66 gain 150 8 -119.86 gain 8 151 -128.72 gain 151 8 -131.12 gain 8 152 -120.97 gain 152 8 -120.35 gain 8 153 -118.83 gain 153 8 -115.79 gain 8 154 -128.52 gain 154 8 -134.02 gain 8 155 -118.90 gain 155 8 -124.30 gain 8 156 -118.71 gain 156 8 -118.50 gain 8 157 -118.45 gain 157 8 -121.18 gain 8 158 -116.89 gain 158 8 -122.22 gain 8 159 -122.52 gain 159 8 -124.46 gain 8 160 -120.87 gain 160 8 -119.92 gain 8 161 -122.29 gain 161 8 -124.84 gain 8 162 -123.71 gain 162 8 -125.12 gain 8 163 -121.32 gain 163 8 -124.88 gain 8 164 -122.44 gain 164 8 -127.04 gain 8 165 -124.14 gain 165 8 -124.79 gain 8 166 -118.73 gain 166 8 -120.94 gain 8 167 -125.12 gain 167 8 -129.42 gain 8 168 -129.96 gain 168 8 -132.72 gain 8 169 -116.93 gain 169 8 -123.88 gain 8 170 -122.21 gain 170 8 -120.69 gain 8 171 -125.22 gain 171 8 -128.72 gain 8 172 -118.96 gain 172 8 -117.16 gain 8 173 -123.29 gain 173 8 -120.92 gain 8 174 -127.84 gain 174 8 -129.77 gain 8 175 -128.58 gain 175 8 -134.07 gain 8 176 -124.32 gain 176 8 -121.81 gain 8 177 -124.36 gain 177 8 -129.67 gain 8 178 -122.15 gain 178 8 -123.28 gain 8 179 -123.52 gain 179 8 -123.04 gain 8 180 -123.12 gain 180 8 -124.11 gain 8 181 -127.10 gain 181 8 -128.16 gain 8 182 -125.19 gain 182 8 -128.63 gain 8 183 -118.52 gain 183 8 -115.35 gain 8 184 -123.57 gain 184 8 -125.18 gain 8 185 -129.00 gain 185 8 -128.10 gain 8 186 -122.81 gain 186 8 -122.20 gain 8 187 -124.34 gain 187 8 -126.27 gain 8 188 -124.73 gain 188 8 -129.92 gain 8 189 -125.76 gain 189 8 -128.46 gain 8 190 -125.10 gain 190 8 -124.81 gain 8 191 -131.71 gain 191 8 -132.52 gain 8 192 -122.68 gain 192 8 -126.35 gain 8 193 -129.42 gain 193 8 -134.35 gain 8 194 -128.87 gain 194 8 -127.60 gain 8 195 -126.62 gain 195 8 -125.98 gain 8 196 -131.72 gain 196 8 -135.13 gain 8 197 -123.56 gain 197 8 -123.03 gain 8 198 -122.21 gain 198 8 -121.20 gain 8 199 -123.97 gain 199 8 -126.88 gain 8 200 -122.55 gain 200 8 -122.40 gain 8 201 -125.38 gain 201 8 -126.03 gain 8 202 -125.90 gain 202 8 -130.55 gain 8 203 -123.62 gain 203 8 -127.89 gain 8 204 -126.27 gain 204 8 -127.83 gain 8 205 -128.55 gain 205 8 -129.18 gain 8 206 -130.20 gain 206 8 -135.35 gain 8 207 -121.67 gain 207 8 -119.18 gain 8 208 -129.84 gain 208 8 -133.13 gain 8 209 -119.97 gain 209 8 -124.25 gain 8 210 -125.55 gain 210 8 -126.77 gain 8 211 -125.34 gain 211 8 -128.58 gain 8 212 -133.68 gain 212 8 -135.46 gain 8 213 -123.78 gain 213 8 -124.75 gain 8 214 -122.90 gain 214 8 -123.76 gain 8 215 -128.04 gain 215 8 -125.32 gain 8 216 -136.96 gain 216 8 -138.90 gain 8 217 -126.00 gain 217 8 -128.46 gain 8 218 -133.19 gain 218 8 -137.84 gain 8 219 -128.50 gain 219 8 -124.50 gain 8 220 -131.36 gain 220 8 -137.85 gain 8 221 -127.87 gain 221 8 -130.01 gain 8 222 -129.33 gain 222 8 -131.80 gain 8 223 -127.32 gain 223 8 -128.40 gain 8 224 -128.38 gain 224 8 -132.15 gain 9 10 -94.91 gain 10 9 -95.39 gain 9 11 -102.30 gain 11 9 -102.61 gain 9 12 -110.76 gain 12 9 -110.54 gain 9 13 -113.87 gain 13 9 -112.60 gain 9 14 -114.36 gain 14 9 -114.96 gain 9 15 -120.43 gain 15 9 -124.65 gain 9 16 -116.35 gain 16 9 -118.39 gain 9 17 -117.33 gain 17 9 -115.79 gain 9 18 -119.87 gain 18 9 -118.17 gain 9 19 -117.33 gain 19 9 -118.63 gain 9 20 -114.99 gain 20 9 -117.72 gain 9 21 -103.95 gain 21 9 -104.61 gain 9 22 -115.99 gain 22 9 -115.24 gain 9 23 -93.04 gain 23 9 -96.57 gain 9 24 -94.25 gain 24 9 -92.19 gain 9 25 -101.64 gain 25 9 -106.33 gain 9 26 -105.54 gain 26 9 -104.11 gain 9 27 -102.13 gain 27 9 -96.60 gain 9 28 -114.96 gain 28 9 -112.13 gain 9 29 -121.35 gain 29 9 -120.39 gain 9 30 -113.21 gain 30 9 -115.72 gain 9 31 -123.87 gain 31 9 -124.00 gain 9 32 -122.15 gain 32 9 -122.31 gain 9 33 -114.08 gain 33 9 -116.49 gain 9 34 -120.47 gain 34 9 -121.48 gain 9 35 -121.00 gain 35 9 -121.84 gain 9 36 -109.03 gain 36 9 -113.65 gain 9 37 -104.40 gain 37 9 -101.22 gain 9 38 -102.95 gain 38 9 -105.79 gain 9 39 -108.05 gain 39 9 -109.75 gain 9 40 -110.87 gain 40 9 -114.63 gain 9 41 -106.46 gain 41 9 -105.84 gain 9 42 -109.46 gain 42 9 -106.99 gain 9 43 -110.27 gain 43 9 -111.70 gain 9 44 -112.40 gain 44 9 -116.88 gain 9 45 -124.16 gain 45 9 -127.12 gain 9 46 -119.71 gain 46 9 -118.46 gain 9 47 -115.31 gain 47 9 -115.11 gain 9 48 -122.99 gain 48 9 -120.59 gain 9 49 -113.47 gain 49 9 -119.05 gain 9 50 -116.56 gain 50 9 -123.10 gain 9 51 -113.63 gain 51 9 -115.30 gain 9 52 -118.86 gain 52 9 -116.55 gain 9 53 -104.13 gain 53 9 -102.84 gain 9 54 -109.85 gain 54 9 -109.26 gain 9 55 -106.87 gain 55 9 -105.58 gain 9 56 -107.45 gain 56 9 -113.49 gain 9 57 -119.72 gain 57 9 -119.63 gain 9 58 -113.27 gain 58 9 -115.92 gain 9 59 -122.18 gain 59 9 -120.95 gain 9 60 -125.44 gain 60 9 -125.54 gain 9 61 -117.49 gain 61 9 -116.34 gain 9 62 -123.35 gain 62 9 -127.42 gain 9 63 -120.33 gain 63 9 -117.63 gain 9 64 -119.71 gain 64 9 -119.98 gain 9 65 -114.23 gain 65 9 -116.58 gain 9 66 -111.79 gain 66 9 -108.40 gain 9 67 -114.19 gain 67 9 -113.07 gain 9 68 -115.38 gain 68 9 -118.82 gain 9 69 -106.00 gain 69 9 -106.74 gain 9 70 -110.87 gain 70 9 -111.37 gain 9 71 -109.00 gain 71 9 -107.60 gain 9 72 -105.67 gain 72 9 -104.69 gain 9 73 -119.58 gain 73 9 -116.99 gain 9 74 -117.25 gain 74 9 -118.54 gain 9 75 -115.93 gain 75 9 -117.36 gain 9 76 -125.70 gain 76 9 -123.08 gain 9 77 -114.67 gain 77 9 -115.71 gain 9 78 -123.64 gain 78 9 -127.53 gain 9 79 -130.17 gain 79 9 -128.84 gain 9 80 -116.81 gain 80 9 -115.98 gain 9 81 -122.53 gain 81 9 -122.29 gain 9 82 -114.19 gain 82 9 -111.58 gain 9 83 -116.91 gain 83 9 -115.33 gain 9 84 -119.94 gain 84 9 -118.51 gain 9 85 -117.49 gain 85 9 -112.87 gain 9 86 -116.34 gain 86 9 -115.10 gain 9 87 -117.75 gain 87 9 -120.47 gain 9 88 -123.30 gain 88 9 -123.78 gain 9 89 -111.90 gain 89 9 -110.97 gain 9 90 -127.57 gain 90 9 -123.65 gain 9 91 -120.55 gain 91 9 -120.57 gain 9 92 -126.61 gain 92 9 -123.59 gain 9 93 -120.61 gain 93 9 -122.38 gain 9 94 -120.34 gain 94 9 -121.99 gain 9 95 -116.74 gain 95 9 -120.65 gain 9 96 -119.75 gain 96 9 -120.99 gain 9 97 -112.64 gain 97 9 -112.63 gain 9 98 -115.48 gain 98 9 -116.26 gain 9 99 -114.49 gain 99 9 -113.10 gain 9 100 -123.81 gain 100 9 -121.98 gain 9 101 -115.89 gain 101 9 -114.22 gain 9 102 -114.87 gain 102 9 -113.99 gain 9 103 -118.14 gain 103 9 -114.73 gain 9 104 -125.25 gain 104 9 -127.23 gain 9 105 -127.03 gain 105 9 -124.94 gain 9 106 -130.05 gain 106 9 -129.04 gain 9 107 -126.92 gain 107 9 -132.49 gain 9 108 -129.15 gain 108 9 -127.04 gain 9 109 -128.11 gain 109 9 -129.49 gain 9 110 -116.02 gain 110 9 -115.86 gain 9 111 -122.36 gain 111 9 -121.88 gain 9 112 -114.10 gain 112 9 -112.50 gain 9 113 -115.31 gain 113 9 -112.52 gain 9 114 -120.30 gain 114 9 -120.81 gain 9 115 -121.05 gain 115 9 -115.86 gain 9 116 -123.30 gain 116 9 -125.65 gain 9 117 -122.35 gain 117 9 -126.21 gain 9 118 -122.39 gain 118 9 -124.57 gain 9 119 -115.56 gain 119 9 -112.40 gain 9 120 -129.03 gain 120 9 -130.38 gain 9 121 -124.70 gain 121 9 -125.34 gain 9 122 -120.21 gain 122 9 -122.97 gain 9 123 -118.14 gain 123 9 -121.67 gain 9 124 -119.19 gain 124 9 -119.13 gain 9 125 -121.44 gain 125 9 -122.72 gain 9 126 -126.76 gain 126 9 -126.00 gain 9 127 -121.82 gain 127 9 -124.52 gain 9 128 -126.87 gain 128 9 -127.50 gain 9 129 -122.42 gain 129 9 -120.97 gain 9 130 -121.95 gain 130 9 -118.31 gain 9 131 -126.84 gain 131 9 -130.29 gain 9 132 -121.62 gain 132 9 -124.70 gain 9 133 -123.29 gain 133 9 -124.44 gain 9 134 -122.45 gain 134 9 -120.30 gain 9 135 -125.30 gain 135 9 -126.72 gain 9 136 -127.68 gain 136 9 -129.71 gain 9 137 -125.76 gain 137 9 -125.28 gain 9 138 -124.89 gain 138 9 -123.40 gain 9 139 -123.88 gain 139 9 -123.38 gain 9 140 -118.62 gain 140 9 -120.73 gain 9 141 -126.04 gain 141 9 -126.82 gain 9 142 -119.09 gain 142 9 -119.18 gain 9 143 -121.12 gain 143 9 -120.82 gain 9 144 -120.91 gain 144 9 -121.63 gain 9 145 -127.77 gain 145 9 -126.94 gain 9 146 -124.58 gain 146 9 -122.66 gain 9 147 -130.66 gain 147 9 -125.83 gain 9 148 -121.17 gain 148 9 -116.06 gain 9 149 -122.67 gain 149 9 -120.73 gain 9 150 -131.41 gain 150 9 -132.15 gain 9 151 -127.47 gain 151 9 -128.41 gain 9 152 -127.14 gain 152 9 -125.05 gain 9 153 -122.23 gain 153 9 -117.72 gain 9 154 -124.11 gain 154 9 -128.15 gain 9 155 -122.06 gain 155 9 -126.00 gain 9 156 -127.04 gain 156 9 -125.36 gain 9 157 -127.97 gain 157 9 -129.24 gain 9 158 -123.06 gain 158 9 -126.92 gain 9 159 -118.65 gain 159 9 -119.13 gain 9 160 -125.30 gain 160 9 -122.89 gain 9 161 -119.09 gain 161 9 -120.17 gain 9 162 -123.16 gain 162 9 -123.10 gain 9 163 -123.67 gain 163 9 -125.76 gain 9 164 -120.61 gain 164 9 -123.75 gain 9 165 -129.40 gain 165 9 -128.58 gain 9 166 -125.94 gain 166 9 -126.68 gain 9 167 -122.83 gain 167 9 -125.67 gain 9 168 -128.61 gain 168 9 -129.90 gain 9 169 -127.42 gain 169 9 -132.90 gain 9 170 -130.99 gain 170 9 -128.00 gain 9 171 -121.76 gain 171 9 -123.79 gain 9 172 -130.79 gain 172 9 -127.52 gain 9 173 -123.67 gain 173 9 -119.84 gain 9 174 -131.59 gain 174 9 -132.05 gain 9 175 -124.20 gain 175 9 -128.22 gain 9 176 -115.56 gain 176 9 -111.59 gain 9 177 -126.09 gain 177 9 -129.93 gain 9 178 -126.98 gain 178 9 -126.64 gain 9 179 -119.39 gain 179 9 -117.45 gain 9 180 -133.54 gain 180 9 -133.07 gain 9 181 -125.66 gain 181 9 -125.26 gain 9 182 -126.25 gain 182 9 -128.23 gain 9 183 -129.13 gain 183 9 -124.50 gain 9 184 -126.56 gain 184 9 -126.71 gain 9 185 -122.74 gain 185 9 -120.38 gain 9 186 -128.10 gain 186 9 -126.03 gain 9 187 -132.27 gain 187 9 -132.74 gain 9 188 -125.00 gain 188 9 -128.72 gain 9 189 -125.94 gain 189 9 -127.18 gain 9 190 -122.79 gain 190 9 -121.04 gain 9 191 -132.37 gain 191 9 -131.71 gain 9 192 -127.69 gain 192 9 -129.89 gain 9 193 -125.23 gain 193 9 -128.69 gain 9 194 -123.66 gain 194 9 -120.93 gain 9 195 -131.75 gain 195 9 -129.65 gain 9 196 -131.92 gain 196 9 -133.87 gain 9 197 -130.00 gain 197 9 -128.00 gain 9 198 -125.69 gain 198 9 -123.22 gain 9 199 -131.42 gain 199 9 -132.86 gain 9 200 -120.95 gain 200 9 -119.33 gain 9 201 -131.98 gain 201 9 -131.16 gain 9 202 -128.71 gain 202 9 -131.90 gain 9 203 -127.71 gain 203 9 -130.52 gain 9 204 -124.71 gain 204 9 -124.80 gain 9 205 -126.17 gain 205 9 -125.34 gain 9 206 -124.17 gain 206 9 -127.86 gain 9 207 -129.92 gain 207 9 -125.97 gain 9 208 -125.94 gain 208 9 -127.76 gain 9 209 -130.62 gain 209 9 -133.43 gain 9 210 -125.37 gain 210 9 -125.12 gain 9 211 -129.94 gain 211 9 -131.72 gain 9 212 -126.14 gain 212 9 -126.46 gain 9 213 -121.07 gain 213 9 -120.58 gain 9 214 -122.89 gain 214 9 -122.29 gain 9 215 -121.39 gain 215 9 -117.21 gain 9 216 -126.19 gain 216 9 -126.66 gain 9 217 -125.64 gain 217 9 -126.64 gain 9 218 -133.72 gain 218 9 -136.90 gain 9 219 -133.32 gain 219 9 -127.86 gain 9 220 -130.48 gain 220 9 -135.51 gain 9 221 -125.99 gain 221 9 -126.66 gain 9 222 -128.89 gain 222 9 -129.89 gain 9 223 -137.60 gain 223 9 -137.21 gain 9 224 -130.05 gain 224 9 -132.36 gain 10 11 -95.22 gain 11 10 -95.06 gain 10 12 -104.47 gain 12 10 -103.77 gain 10 13 -114.75 gain 13 10 -113.01 gain 10 14 -110.28 gain 14 10 -110.40 gain 10 15 -123.60 gain 15 10 -127.35 gain 10 16 -120.26 gain 16 10 -121.82 gain 10 17 -126.32 gain 17 10 -124.31 gain 10 18 -121.49 gain 18 10 -119.32 gain 10 19 -118.93 gain 19 10 -119.75 gain 10 20 -118.77 gain 20 10 -121.03 gain 10 21 -114.66 gain 21 10 -114.85 gain 10 22 -110.79 gain 22 10 -109.57 gain 10 23 -103.86 gain 23 10 -106.91 gain 10 24 -99.28 gain 24 10 -96.74 gain 10 25 -87.03 gain 25 10 -91.25 gain 10 26 -97.44 gain 26 10 -95.54 gain 10 27 -108.96 gain 27 10 -102.95 gain 10 28 -110.03 gain 28 10 -106.72 gain 10 29 -117.75 gain 29 10 -116.32 gain 10 30 -126.39 gain 30 10 -128.43 gain 10 31 -123.88 gain 31 10 -123.53 gain 10 32 -115.69 gain 32 10 -115.37 gain 10 33 -115.12 gain 33 10 -117.05 gain 10 34 -114.67 gain 34 10 -115.21 gain 10 35 -111.88 gain 35 10 -112.24 gain 10 36 -111.93 gain 36 10 -116.07 gain 10 37 -110.19 gain 37 10 -106.53 gain 10 38 -108.26 gain 38 10 -110.63 gain 10 39 -101.20 gain 39 10 -102.43 gain 10 40 -106.95 gain 40 10 -110.23 gain 10 41 -103.40 gain 41 10 -102.30 gain 10 42 -108.88 gain 42 10 -105.93 gain 10 43 -114.39 gain 43 10 -115.33 gain 10 44 -106.25 gain 44 10 -110.25 gain 10 45 -128.70 gain 45 10 -131.18 gain 10 46 -127.70 gain 46 10 -125.97 gain 10 47 -115.39 gain 47 10 -114.72 gain 10 48 -119.07 gain 48 10 -116.19 gain 10 49 -118.16 gain 49 10 -123.25 gain 10 50 -107.92 gain 50 10 -113.98 gain 10 51 -113.17 gain 51 10 -114.37 gain 10 52 -113.84 gain 52 10 -111.05 gain 10 53 -109.92 gain 53 10 -108.15 gain 10 54 -113.73 gain 54 10 -112.67 gain 10 55 -108.89 gain 55 10 -107.12 gain 10 56 -109.91 gain 56 10 -115.47 gain 10 57 -116.50 gain 57 10 -115.94 gain 10 58 -111.36 gain 58 10 -113.53 gain 10 59 -113.36 gain 59 10 -111.66 gain 10 60 -120.23 gain 60 10 -119.85 gain 10 61 -124.04 gain 61 10 -122.41 gain 10 62 -120.18 gain 62 10 -123.77 gain 10 63 -114.86 gain 63 10 -111.68 gain 10 64 -119.12 gain 64 10 -118.91 gain 10 65 -119.37 gain 65 10 -121.25 gain 10 66 -119.30 gain 66 10 -115.43 gain 10 67 -111.56 gain 67 10 -109.96 gain 10 68 -116.73 gain 68 10 -119.70 gain 10 69 -113.80 gain 69 10 -114.05 gain 10 70 -111.89 gain 70 10 -111.90 gain 10 71 -105.93 gain 71 10 -104.05 gain 10 72 -115.20 gain 72 10 -113.73 gain 10 73 -120.15 gain 73 10 -117.08 gain 10 74 -121.48 gain 74 10 -122.28 gain 10 75 -126.48 gain 75 10 -127.43 gain 10 76 -124.46 gain 76 10 -121.36 gain 10 77 -116.20 gain 77 10 -116.76 gain 10 78 -120.51 gain 78 10 -123.92 gain 10 79 -109.82 gain 79 10 -108.01 gain 10 80 -117.30 gain 80 10 -115.99 gain 10 81 -115.52 gain 81 10 -114.81 gain 10 82 -121.52 gain 82 10 -118.43 gain 10 83 -118.20 gain 83 10 -116.14 gain 10 84 -113.92 gain 84 10 -112.01 gain 10 85 -120.95 gain 85 10 -115.85 gain 10 86 -116.41 gain 86 10 -114.69 gain 10 87 -121.30 gain 87 10 -123.54 gain 10 88 -112.05 gain 88 10 -112.04 gain 10 89 -121.07 gain 89 10 -119.66 gain 10 90 -128.57 gain 90 10 -124.18 gain 10 91 -121.63 gain 91 10 -121.18 gain 10 92 -122.23 gain 92 10 -118.74 gain 10 93 -126.64 gain 93 10 -127.93 gain 10 94 -121.03 gain 94 10 -122.20 gain 10 95 -122.14 gain 95 10 -125.57 gain 10 96 -124.72 gain 96 10 -125.49 gain 10 97 -111.07 gain 97 10 -110.58 gain 10 98 -112.61 gain 98 10 -112.92 gain 10 99 -114.77 gain 99 10 -112.90 gain 10 100 -118.94 gain 100 10 -116.63 gain 10 101 -113.90 gain 101 10 -111.76 gain 10 102 -114.52 gain 102 10 -113.16 gain 10 103 -119.75 gain 103 10 -115.87 gain 10 104 -115.63 gain 104 10 -117.12 gain 10 105 -127.55 gain 105 10 -124.99 gain 10 106 -124.03 gain 106 10 -122.55 gain 10 107 -125.99 gain 107 10 -131.07 gain 10 108 -126.68 gain 108 10 -124.09 gain 10 109 -127.05 gain 109 10 -127.95 gain 10 110 -117.68 gain 110 10 -117.05 gain 10 111 -123.47 gain 111 10 -122.51 gain 10 112 -113.58 gain 112 10 -111.51 gain 10 113 -120.42 gain 113 10 -117.15 gain 10 114 -122.65 gain 114 10 -122.68 gain 10 115 -120.18 gain 115 10 -114.52 gain 10 116 -120.87 gain 116 10 -122.74 gain 10 117 -119.82 gain 117 10 -123.19 gain 10 118 -118.93 gain 118 10 -120.63 gain 10 119 -124.02 gain 119 10 -120.38 gain 10 120 -123.35 gain 120 10 -124.23 gain 10 121 -123.26 gain 121 10 -123.43 gain 10 122 -130.35 gain 122 10 -132.63 gain 10 123 -129.23 gain 123 10 -132.29 gain 10 124 -123.44 gain 124 10 -122.90 gain 10 125 -121.04 gain 125 10 -121.85 gain 10 126 -128.26 gain 126 10 -127.01 gain 10 127 -119.83 gain 127 10 -122.05 gain 10 128 -118.22 gain 128 10 -118.37 gain 10 129 -129.31 gain 129 10 -127.37 gain 10 130 -120.46 gain 130 10 -116.35 gain 10 131 -119.30 gain 131 10 -122.28 gain 10 132 -115.28 gain 132 10 -117.88 gain 10 133 -127.04 gain 133 10 -127.72 gain 10 134 -118.07 gain 134 10 -115.45 gain 10 135 -125.96 gain 135 10 -126.90 gain 10 136 -125.84 gain 136 10 -127.40 gain 10 137 -126.24 gain 137 10 -125.28 gain 10 138 -121.57 gain 138 10 -119.61 gain 10 139 -129.14 gain 139 10 -128.16 gain 10 140 -129.04 gain 140 10 -130.67 gain 10 141 -119.65 gain 141 10 -119.95 gain 10 142 -126.21 gain 142 10 -125.82 gain 10 143 -123.70 gain 143 10 -122.93 gain 10 144 -122.96 gain 144 10 -123.20 gain 10 145 -117.90 gain 145 10 -116.59 gain 10 146 -126.60 gain 146 10 -124.21 gain 10 147 -121.13 gain 147 10 -115.82 gain 10 148 -121.96 gain 148 10 -116.37 gain 10 149 -128.01 gain 149 10 -125.58 gain 10 150 -127.21 gain 150 10 -127.47 gain 10 151 -129.72 gain 151 10 -130.18 gain 10 152 -131.23 gain 152 10 -128.67 gain 10 153 -123.43 gain 153 10 -118.44 gain 10 154 -127.90 gain 154 10 -131.46 gain 10 155 -129.07 gain 155 10 -132.53 gain 10 156 -128.44 gain 156 10 -126.29 gain 10 157 -118.75 gain 157 10 -119.54 gain 10 158 -122.95 gain 158 10 -126.34 gain 10 159 -126.61 gain 159 10 -126.62 gain 10 160 -126.85 gain 160 10 -123.96 gain 10 161 -120.72 gain 161 10 -121.32 gain 10 162 -121.42 gain 162 10 -120.89 gain 10 163 -128.83 gain 163 10 -130.45 gain 10 164 -132.52 gain 164 10 -135.18 gain 10 165 -136.78 gain 165 10 -135.48 gain 10 166 -130.22 gain 166 10 -130.49 gain 10 167 -130.01 gain 167 10 -132.37 gain 10 168 -131.65 gain 168 10 -132.46 gain 10 169 -121.41 gain 169 10 -126.42 gain 10 170 -124.49 gain 170 10 -121.02 gain 10 171 -122.12 gain 171 10 -123.68 gain 10 172 -125.09 gain 172 10 -121.35 gain 10 173 -120.67 gain 173 10 -116.36 gain 10 174 -121.60 gain 174 10 -121.59 gain 10 175 -120.17 gain 175 10 -123.71 gain 10 176 -120.15 gain 176 10 -115.70 gain 10 177 -125.53 gain 177 10 -128.90 gain 10 178 -121.25 gain 178 10 -120.44 gain 10 179 -128.34 gain 179 10 -125.92 gain 10 180 -130.81 gain 180 10 -129.86 gain 10 181 -127.34 gain 181 10 -126.45 gain 10 182 -130.43 gain 182 10 -131.93 gain 10 183 -136.64 gain 183 10 -131.53 gain 10 184 -124.41 gain 184 10 -124.09 gain 10 185 -131.34 gain 185 10 -128.50 gain 10 186 -121.56 gain 186 10 -119.00 gain 10 187 -124.97 gain 187 10 -124.95 gain 10 188 -123.94 gain 188 10 -127.19 gain 10 189 -116.40 gain 189 10 -117.16 gain 10 190 -124.28 gain 190 10 -122.05 gain 10 191 -123.42 gain 191 10 -122.29 gain 10 192 -140.75 gain 192 10 -142.48 gain 10 193 -126.72 gain 193 10 -129.70 gain 10 194 -128.47 gain 194 10 -125.26 gain 10 195 -125.16 gain 195 10 -122.59 gain 10 196 -130.56 gain 196 10 -132.02 gain 10 197 -132.05 gain 197 10 -129.58 gain 10 198 -134.04 gain 198 10 -131.09 gain 10 199 -126.94 gain 199 10 -127.90 gain 10 200 -123.93 gain 200 10 -121.84 gain 10 201 -125.27 gain 201 10 -123.98 gain 10 202 -133.27 gain 202 10 -135.98 gain 10 203 -133.34 gain 203 10 -135.67 gain 10 204 -123.25 gain 204 10 -122.87 gain 10 205 -131.56 gain 205 10 -130.25 gain 10 206 -120.97 gain 206 10 -124.17 gain 10 207 -126.95 gain 207 10 -122.52 gain 10 208 -129.24 gain 208 10 -130.59 gain 10 209 -127.04 gain 209 10 -129.38 gain 10 210 -140.36 gain 210 10 -139.64 gain 10 211 -125.75 gain 211 10 -127.04 gain 10 212 -127.15 gain 212 10 -126.99 gain 10 213 -133.35 gain 213 10 -132.38 gain 10 214 -133.37 gain 214 10 -132.29 gain 10 215 -129.99 gain 215 10 -125.32 gain 10 216 -129.55 gain 216 10 -129.54 gain 10 217 -132.73 gain 217 10 -133.25 gain 10 218 -132.10 gain 218 10 -134.80 gain 10 219 -129.27 gain 219 10 -123.33 gain 10 220 -126.75 gain 220 10 -131.30 gain 10 221 -128.00 gain 221 10 -128.20 gain 10 222 -127.19 gain 222 10 -127.71 gain 10 223 -128.37 gain 223 10 -127.50 gain 10 224 -128.64 gain 224 10 -130.47 gain 11 12 -90.40 gain 12 11 -89.86 gain 11 13 -100.43 gain 13 11 -98.85 gain 11 14 -102.58 gain 14 11 -102.86 gain 11 15 -129.51 gain 15 11 -133.41 gain 11 16 -123.66 gain 16 11 -125.38 gain 11 17 -121.46 gain 17 11 -119.61 gain 11 18 -122.92 gain 18 11 -120.91 gain 11 19 -115.62 gain 19 11 -116.60 gain 11 20 -120.67 gain 20 11 -123.09 gain 11 21 -119.12 gain 21 11 -119.46 gain 11 22 -111.29 gain 22 11 -110.23 gain 11 23 -106.27 gain 23 11 -109.48 gain 11 24 -102.88 gain 24 11 -100.51 gain 11 25 -94.04 gain 25 11 -98.42 gain 11 26 -93.36 gain 26 11 -91.62 gain 11 27 -102.38 gain 27 11 -96.53 gain 11 28 -104.86 gain 28 11 -101.71 gain 11 29 -107.68 gain 29 11 -106.41 gain 11 30 -123.63 gain 30 11 -125.82 gain 11 31 -128.43 gain 31 11 -128.24 gain 11 32 -126.81 gain 32 11 -126.66 gain 11 33 -118.17 gain 33 11 -120.27 gain 11 34 -118.05 gain 34 11 -118.74 gain 11 35 -114.99 gain 35 11 -115.52 gain 11 36 -111.81 gain 36 11 -116.11 gain 11 37 -115.95 gain 37 11 -112.45 gain 11 38 -107.45 gain 38 11 -109.97 gain 11 39 -111.90 gain 39 11 -113.29 gain 11 40 -104.52 gain 40 11 -107.95 gain 11 41 -102.74 gain 41 11 -101.80 gain 11 42 -103.93 gain 42 11 -101.15 gain 11 43 -106.76 gain 43 11 -107.86 gain 11 44 -108.06 gain 44 11 -112.22 gain 11 45 -122.66 gain 45 11 -125.30 gain 11 46 -128.88 gain 46 11 -127.32 gain 11 47 -127.52 gain 47 11 -127.01 gain 11 48 -122.44 gain 48 11 -119.72 gain 11 49 -121.09 gain 49 11 -126.35 gain 11 50 -123.45 gain 50 11 -129.67 gain 11 51 -123.73 gain 51 11 -125.09 gain 11 52 -113.27 gain 52 11 -110.65 gain 11 53 -112.40 gain 53 11 -110.79 gain 11 54 -107.73 gain 54 11 -106.82 gain 11 55 -116.18 gain 55 11 -114.57 gain 11 56 -105.28 gain 56 11 -111.00 gain 11 57 -102.84 gain 57 11 -102.43 gain 11 58 -112.16 gain 58 11 -114.49 gain 11 59 -111.81 gain 59 11 -110.27 gain 11 60 -127.81 gain 60 11 -127.59 gain 11 61 -117.64 gain 61 11 -116.18 gain 11 62 -118.46 gain 62 11 -122.21 gain 11 63 -119.51 gain 63 11 -116.49 gain 11 64 -116.83 gain 64 11 -116.78 gain 11 65 -118.52 gain 65 11 -120.56 gain 11 66 -125.16 gain 66 11 -121.45 gain 11 67 -117.31 gain 67 11 -115.88 gain 11 68 -114.01 gain 68 11 -117.14 gain 11 69 -122.34 gain 69 11 -122.76 gain 11 70 -114.13 gain 70 11 -114.31 gain 11 71 -108.17 gain 71 11 -106.45 gain 11 72 -114.82 gain 72 11 -113.52 gain 11 73 -110.00 gain 73 11 -107.09 gain 11 74 -117.29 gain 74 11 -118.25 gain 11 75 -125.27 gain 75 11 -126.37 gain 11 76 -119.17 gain 76 11 -116.23 gain 11 77 -125.11 gain 77 11 -125.83 gain 11 78 -124.21 gain 78 11 -127.78 gain 11 79 -123.87 gain 79 11 -122.23 gain 11 80 -125.79 gain 80 11 -124.64 gain 11 81 -123.02 gain 81 11 -122.46 gain 11 82 -119.96 gain 82 11 -117.03 gain 11 83 -116.54 gain 83 11 -114.65 gain 11 84 -121.49 gain 84 11 -119.74 gain 11 85 -108.31 gain 85 11 -103.37 gain 11 86 -107.69 gain 86 11 -106.13 gain 11 87 -117.06 gain 87 11 -119.47 gain 11 88 -114.09 gain 88 11 -114.25 gain 11 89 -122.53 gain 89 11 -121.28 gain 11 90 -132.12 gain 90 11 -127.89 gain 11 91 -135.05 gain 91 11 -134.76 gain 11 92 -125.29 gain 92 11 -121.96 gain 11 93 -121.74 gain 93 11 -123.19 gain 11 94 -118.22 gain 94 11 -119.55 gain 11 95 -124.04 gain 95 11 -127.62 gain 11 96 -113.92 gain 96 11 -114.84 gain 11 97 -119.65 gain 97 11 -119.32 gain 11 98 -115.92 gain 98 11 -116.38 gain 11 99 -120.88 gain 99 11 -119.17 gain 11 100 -120.95 gain 100 11 -118.81 gain 11 101 -123.62 gain 101 11 -121.64 gain 11 102 -121.61 gain 102 11 -120.41 gain 11 103 -109.34 gain 103 11 -105.62 gain 11 104 -123.78 gain 104 11 -125.44 gain 11 105 -127.59 gain 105 11 -125.18 gain 11 106 -124.53 gain 106 11 -123.21 gain 11 107 -118.03 gain 107 11 -123.28 gain 11 108 -122.87 gain 108 11 -120.43 gain 11 109 -121.65 gain 109 11 -122.71 gain 11 110 -113.96 gain 110 11 -113.49 gain 11 111 -120.03 gain 111 11 -119.24 gain 11 112 -118.57 gain 112 11 -116.65 gain 11 113 -113.96 gain 113 11 -110.85 gain 11 114 -118.47 gain 114 11 -118.67 gain 11 115 -112.05 gain 115 11 -106.55 gain 11 116 -116.46 gain 116 11 -118.50 gain 11 117 -116.86 gain 117 11 -120.40 gain 11 118 -118.16 gain 118 11 -120.02 gain 11 119 -122.03 gain 119 11 -118.55 gain 11 120 -122.91 gain 120 11 -123.94 gain 11 121 -125.09 gain 121 11 -125.41 gain 11 122 -126.61 gain 122 11 -129.05 gain 11 123 -126.28 gain 123 11 -129.49 gain 11 124 -124.43 gain 124 11 -124.05 gain 11 125 -128.12 gain 125 11 -129.08 gain 11 126 -120.41 gain 126 11 -119.33 gain 11 127 -124.86 gain 127 11 -127.25 gain 11 128 -122.86 gain 128 11 -123.18 gain 11 129 -117.63 gain 129 11 -115.86 gain 11 130 -126.32 gain 130 11 -122.37 gain 11 131 -120.21 gain 131 11 -123.35 gain 11 132 -124.52 gain 132 11 -127.28 gain 11 133 -122.45 gain 133 11 -123.29 gain 11 134 -113.37 gain 134 11 -110.91 gain 11 135 -139.83 gain 135 11 -140.93 gain 11 136 -131.13 gain 136 11 -132.84 gain 11 137 -133.20 gain 137 11 -132.40 gain 11 138 -131.27 gain 138 11 -129.47 gain 11 139 -123.07 gain 139 11 -122.26 gain 11 140 -123.80 gain 140 11 -125.59 gain 11 141 -123.18 gain 141 11 -123.64 gain 11 142 -129.91 gain 142 11 -129.68 gain 11 143 -124.28 gain 143 11 -123.66 gain 11 144 -123.35 gain 144 11 -123.75 gain 11 145 -124.51 gain 145 11 -123.36 gain 11 146 -119.82 gain 146 11 -117.59 gain 11 147 -127.59 gain 147 11 -122.44 gain 11 148 -122.29 gain 148 11 -116.86 gain 11 149 -129.08 gain 149 11 -126.82 gain 11 150 -126.50 gain 150 11 -126.92 gain 11 151 -131.08 gain 151 11 -131.70 gain 11 152 -124.65 gain 152 11 -122.24 gain 11 153 -125.15 gain 153 11 -120.32 gain 11 154 -132.25 gain 154 11 -135.97 gain 11 155 -126.59 gain 155 11 -130.21 gain 11 156 -129.75 gain 156 11 -127.76 gain 11 157 -122.47 gain 157 11 -123.42 gain 11 158 -123.86 gain 158 11 -127.40 gain 11 159 -123.83 gain 159 11 -123.99 gain 11 160 -122.26 gain 160 11 -119.53 gain 11 161 -129.21 gain 161 11 -129.97 gain 11 162 -123.95 gain 162 11 -123.58 gain 11 163 -116.63 gain 163 11 -118.41 gain 11 164 -124.08 gain 164 11 -126.90 gain 11 165 -127.15 gain 165 11 -126.01 gain 11 166 -126.19 gain 166 11 -126.62 gain 11 167 -129.65 gain 167 11 -132.17 gain 11 168 -126.33 gain 168 11 -127.31 gain 11 169 -132.00 gain 169 11 -137.17 gain 11 170 -125.05 gain 170 11 -121.75 gain 11 171 -130.39 gain 171 11 -132.11 gain 11 172 -123.85 gain 172 11 -120.27 gain 11 173 -132.72 gain 173 11 -128.57 gain 11 174 -126.66 gain 174 11 -126.81 gain 11 175 -129.99 gain 175 11 -133.69 gain 11 176 -126.33 gain 176 11 -122.04 gain 11 177 -126.90 gain 177 11 -130.43 gain 11 178 -127.47 gain 178 11 -126.82 gain 11 179 -125.71 gain 179 11 -123.45 gain 11 180 -123.42 gain 180 11 -122.63 gain 11 181 -125.84 gain 181 11 -125.12 gain 11 182 -124.31 gain 182 11 -125.97 gain 11 183 -125.79 gain 183 11 -120.84 gain 11 184 -129.73 gain 184 11 -129.57 gain 11 185 -128.48 gain 185 11 -125.80 gain 11 186 -127.64 gain 186 11 -125.25 gain 11 187 -125.76 gain 187 11 -125.90 gain 11 188 -130.79 gain 188 11 -134.20 gain 11 189 -126.05 gain 189 11 -126.98 gain 11 190 -121.47 gain 190 11 -119.40 gain 11 191 -117.57 gain 191 11 -116.60 gain 11 192 -138.50 gain 192 11 -140.39 gain 11 193 -132.87 gain 193 11 -136.01 gain 11 194 -127.31 gain 194 11 -124.26 gain 11 195 -140.21 gain 195 11 -137.80 gain 11 196 -130.34 gain 196 11 -131.97 gain 11 197 -132.46 gain 197 11 -130.15 gain 11 198 -125.63 gain 198 11 -122.84 gain 11 199 -137.26 gain 199 11 -138.39 gain 11 200 -134.28 gain 200 11 -132.35 gain 11 201 -137.27 gain 201 11 -136.14 gain 11 202 -134.59 gain 202 11 -137.46 gain 11 203 -129.54 gain 203 11 -132.04 gain 11 204 -124.62 gain 204 11 -124.39 gain 11 205 -130.56 gain 205 11 -129.41 gain 11 206 -130.97 gain 206 11 -134.33 gain 11 207 -127.74 gain 207 11 -123.47 gain 11 208 -128.93 gain 208 11 -130.44 gain 11 209 -123.00 gain 209 11 -125.50 gain 11 210 -130.68 gain 210 11 -130.12 gain 11 211 -128.86 gain 211 11 -130.31 gain 11 212 -123.09 gain 212 11 -123.09 gain 11 213 -130.23 gain 213 11 -129.42 gain 11 214 -130.29 gain 214 11 -129.37 gain 11 215 -129.06 gain 215 11 -124.55 gain 11 216 -133.97 gain 216 11 -134.13 gain 11 217 -133.12 gain 217 11 -133.80 gain 11 218 -124.79 gain 218 11 -127.66 gain 11 219 -127.56 gain 219 11 -121.78 gain 11 220 -126.56 gain 220 11 -131.27 gain 11 221 -126.46 gain 221 11 -126.82 gain 11 222 -126.39 gain 222 11 -127.07 gain 11 223 -126.92 gain 223 11 -126.21 gain 11 224 -128.48 gain 224 11 -130.46 gain 12 13 -94.20 gain 13 12 -93.15 gain 12 14 -97.29 gain 14 12 -98.10 gain 12 15 -131.38 gain 15 12 -135.82 gain 12 16 -124.87 gain 16 12 -127.13 gain 12 17 -123.90 gain 17 12 -122.59 gain 12 18 -117.49 gain 18 12 -116.01 gain 12 19 -123.23 gain 19 12 -124.75 gain 12 20 -120.17 gain 20 12 -123.13 gain 12 21 -114.25 gain 21 12 -115.13 gain 12 22 -113.13 gain 22 12 -112.60 gain 12 23 -116.18 gain 23 12 -119.93 gain 12 24 -109.23 gain 24 12 -107.39 gain 12 25 -102.52 gain 25 12 -107.43 gain 12 26 -96.07 gain 26 12 -94.86 gain 12 27 -97.39 gain 27 12 -92.08 gain 12 28 -103.77 gain 28 12 -101.16 gain 12 29 -105.46 gain 29 12 -104.73 gain 12 30 -129.51 gain 30 12 -132.24 gain 12 31 -125.51 gain 31 12 -125.86 gain 12 32 -129.16 gain 32 12 -129.53 gain 12 33 -125.04 gain 33 12 -127.67 gain 12 34 -119.30 gain 34 12 -120.54 gain 12 35 -121.71 gain 35 12 -122.77 gain 12 36 -122.09 gain 36 12 -126.93 gain 12 37 -118.37 gain 37 12 -115.41 gain 12 38 -113.70 gain 38 12 -116.76 gain 12 39 -110.36 gain 39 12 -112.29 gain 12 40 -111.91 gain 40 12 -115.88 gain 12 41 -99.21 gain 41 12 -98.81 gain 12 42 -109.26 gain 42 12 -107.01 gain 12 43 -112.09 gain 43 12 -113.73 gain 12 44 -106.13 gain 44 12 -110.83 gain 12 45 -120.87 gain 45 12 -124.04 gain 12 46 -124.33 gain 46 12 -123.30 gain 12 47 -127.12 gain 47 12 -127.14 gain 12 48 -124.53 gain 48 12 -122.34 gain 12 49 -118.23 gain 49 12 -124.02 gain 12 50 -117.41 gain 50 12 -124.17 gain 12 51 -124.11 gain 51 12 -126.01 gain 12 52 -120.72 gain 52 12 -118.64 gain 12 53 -114.53 gain 53 12 -113.45 gain 12 54 -119.18 gain 54 12 -118.81 gain 12 55 -108.17 gain 55 12 -107.09 gain 12 56 -104.98 gain 56 12 -111.24 gain 12 57 -107.19 gain 57 12 -107.32 gain 12 58 -101.98 gain 58 12 -104.85 gain 12 59 -110.31 gain 59 12 -109.30 gain 12 60 -126.38 gain 60 12 -126.70 gain 12 61 -123.43 gain 61 12 -122.50 gain 12 62 -133.63 gain 62 12 -137.92 gain 12 63 -122.46 gain 63 12 -119.97 gain 12 64 -125.68 gain 64 12 -126.17 gain 12 65 -117.90 gain 65 12 -120.48 gain 12 66 -122.97 gain 66 12 -119.80 gain 12 67 -113.61 gain 67 12 -112.71 gain 12 68 -110.35 gain 68 12 -114.01 gain 12 69 -121.34 gain 69 12 -122.30 gain 12 70 -115.70 gain 70 12 -116.41 gain 12 71 -112.05 gain 71 12 -110.86 gain 12 72 -108.24 gain 72 12 -107.48 gain 12 73 -107.08 gain 73 12 -104.70 gain 12 74 -120.93 gain 74 12 -122.43 gain 12 75 -127.55 gain 75 12 -129.20 gain 12 76 -124.27 gain 76 12 -121.86 gain 12 77 -126.77 gain 77 12 -128.03 gain 12 78 -128.21 gain 78 12 -132.32 gain 12 79 -119.57 gain 79 12 -118.46 gain 12 80 -122.59 gain 80 12 -121.98 gain 12 81 -128.73 gain 81 12 -128.71 gain 12 82 -126.25 gain 82 12 -123.86 gain 12 83 -119.43 gain 83 12 -118.07 gain 12 84 -117.01 gain 84 12 -115.80 gain 12 85 -115.15 gain 85 12 -110.75 gain 12 86 -110.22 gain 86 12 -109.20 gain 12 87 -113.72 gain 87 12 -116.66 gain 12 88 -118.54 gain 88 12 -119.24 gain 12 89 -113.41 gain 89 12 -112.70 gain 12 90 -125.29 gain 90 12 -121.59 gain 12 91 -125.15 gain 91 12 -125.39 gain 12 92 -121.91 gain 92 12 -119.11 gain 12 93 -122.23 gain 93 12 -124.22 gain 12 94 -130.85 gain 94 12 -132.72 gain 12 95 -119.99 gain 95 12 -124.11 gain 12 96 -113.29 gain 96 12 -114.75 gain 12 97 -115.41 gain 97 12 -115.61 gain 12 98 -115.99 gain 98 12 -116.99 gain 12 99 -111.45 gain 99 12 -110.27 gain 12 100 -123.78 gain 100 12 -122.17 gain 12 101 -118.07 gain 101 12 -116.62 gain 12 102 -112.36 gain 102 12 -111.70 gain 12 103 -118.34 gain 103 12 -115.16 gain 12 104 -117.94 gain 104 12 -120.14 gain 12 105 -120.86 gain 105 12 -119.00 gain 12 106 -132.79 gain 106 12 -132.01 gain 12 107 -133.18 gain 107 12 -138.97 gain 12 108 -132.41 gain 108 12 -130.52 gain 12 109 -121.12 gain 109 12 -122.71 gain 12 110 -122.81 gain 110 12 -122.87 gain 12 111 -120.87 gain 111 12 -120.61 gain 12 112 -121.84 gain 112 12 -120.46 gain 12 113 -127.58 gain 113 12 -125.00 gain 12 114 -124.36 gain 114 12 -125.09 gain 12 115 -128.41 gain 115 12 -123.44 gain 12 116 -119.99 gain 116 12 -122.56 gain 12 117 -119.48 gain 117 12 -123.55 gain 12 118 -124.75 gain 118 12 -127.15 gain 12 119 -121.71 gain 119 12 -118.76 gain 12 120 -127.35 gain 120 12 -128.92 gain 12 121 -126.65 gain 121 12 -127.51 gain 12 122 -123.64 gain 122 12 -126.62 gain 12 123 -126.86 gain 123 12 -130.62 gain 12 124 -120.13 gain 124 12 -120.30 gain 12 125 -118.01 gain 125 12 -119.51 gain 12 126 -119.90 gain 126 12 -119.35 gain 12 127 -122.85 gain 127 12 -125.77 gain 12 128 -126.21 gain 128 12 -127.06 gain 12 129 -118.69 gain 129 12 -117.45 gain 12 130 -120.30 gain 130 12 -116.88 gain 12 131 -120.58 gain 131 12 -124.25 gain 12 132 -120.80 gain 132 12 -124.10 gain 12 133 -119.78 gain 133 12 -121.15 gain 12 134 -118.55 gain 134 12 -116.62 gain 12 135 -128.48 gain 135 12 -130.12 gain 12 136 -126.43 gain 136 12 -128.68 gain 12 137 -125.39 gain 137 12 -125.12 gain 12 138 -130.32 gain 138 12 -129.06 gain 12 139 -131.45 gain 139 12 -131.17 gain 12 140 -123.20 gain 140 12 -125.53 gain 12 141 -127.46 gain 141 12 -128.46 gain 12 142 -124.39 gain 142 12 -124.70 gain 12 143 -120.89 gain 143 12 -120.82 gain 12 144 -115.54 gain 144 12 -116.48 gain 12 145 -120.88 gain 145 12 -120.27 gain 12 146 -120.69 gain 146 12 -118.99 gain 12 147 -127.15 gain 147 12 -122.54 gain 12 148 -124.04 gain 148 12 -119.15 gain 12 149 -117.37 gain 149 12 -115.64 gain 12 150 -136.72 gain 150 12 -137.68 gain 12 151 -135.55 gain 151 12 -136.71 gain 12 152 -122.32 gain 152 12 -120.45 gain 12 153 -124.18 gain 153 12 -119.89 gain 12 154 -124.43 gain 154 12 -128.69 gain 12 155 -129.59 gain 155 12 -133.74 gain 12 156 -123.27 gain 156 12 -121.81 gain 12 157 -128.08 gain 157 12 -129.57 gain 12 158 -123.21 gain 158 12 -127.29 gain 12 159 -122.56 gain 159 12 -123.26 gain 12 160 -125.70 gain 160 12 -123.51 gain 12 161 -123.73 gain 161 12 -125.03 gain 12 162 -118.86 gain 162 12 -119.03 gain 12 163 -122.26 gain 163 12 -124.57 gain 12 164 -126.60 gain 164 12 -129.96 gain 12 165 -130.26 gain 165 12 -129.66 gain 12 166 -123.29 gain 166 12 -124.25 gain 12 167 -133.36 gain 167 12 -136.41 gain 12 168 -120.27 gain 168 12 -121.78 gain 12 169 -127.86 gain 169 12 -133.57 gain 12 170 -123.30 gain 170 12 -120.54 gain 12 171 -127.55 gain 171 12 -129.81 gain 12 172 -126.88 gain 172 12 -123.83 gain 12 173 -123.74 gain 173 12 -120.13 gain 12 174 -128.52 gain 174 12 -129.21 gain 12 175 -120.89 gain 175 12 -125.13 gain 12 176 -123.79 gain 176 12 -120.04 gain 12 177 -122.19 gain 177 12 -126.26 gain 12 178 -121.71 gain 178 12 -121.60 gain 12 179 -122.66 gain 179 12 -120.94 gain 12 180 -127.83 gain 180 12 -127.57 gain 12 181 -131.91 gain 181 12 -131.72 gain 12 182 -129.74 gain 182 12 -131.94 gain 12 183 -132.27 gain 183 12 -127.86 gain 12 184 -131.03 gain 184 12 -131.40 gain 12 185 -130.48 gain 185 12 -128.34 gain 12 186 -130.10 gain 186 12 -128.25 gain 12 187 -121.58 gain 187 12 -122.27 gain 12 188 -127.60 gain 188 12 -131.54 gain 12 189 -129.62 gain 189 12 -131.08 gain 12 190 -124.31 gain 190 12 -122.78 gain 12 191 -130.47 gain 191 12 -130.03 gain 12 192 -132.20 gain 192 12 -134.63 gain 12 193 -124.99 gain 193 12 -128.67 gain 12 194 -129.72 gain 194 12 -127.21 gain 12 195 -128.60 gain 195 12 -126.72 gain 12 196 -127.04 gain 196 12 -129.20 gain 12 197 -124.03 gain 197 12 -122.26 gain 12 198 -134.16 gain 198 12 -131.90 gain 12 199 -126.65 gain 199 12 -128.31 gain 12 200 -128.54 gain 200 12 -127.14 gain 12 201 -126.15 gain 201 12 -125.56 gain 12 202 -126.28 gain 202 12 -129.68 gain 12 203 -129.83 gain 203 12 -132.86 gain 12 204 -122.38 gain 204 12 -122.69 gain 12 205 -123.72 gain 205 12 -123.10 gain 12 206 -121.60 gain 206 12 -125.51 gain 12 207 -121.35 gain 207 12 -117.61 gain 12 208 -131.36 gain 208 12 -133.40 gain 12 209 -119.74 gain 209 12 -122.78 gain 12 210 -129.59 gain 210 12 -129.56 gain 12 211 -129.34 gain 211 12 -131.33 gain 12 212 -134.53 gain 212 12 -135.06 gain 12 213 -125.43 gain 213 12 -125.16 gain 12 214 -130.93 gain 214 12 -130.55 gain 12 215 -130.59 gain 215 12 -126.62 gain 12 216 -131.34 gain 216 12 -132.03 gain 12 217 -133.61 gain 217 12 -134.82 gain 12 218 -125.97 gain 218 12 -129.37 gain 12 219 -136.09 gain 219 12 -130.85 gain 12 220 -124.86 gain 220 12 -130.11 gain 12 221 -132.36 gain 221 12 -133.25 gain 12 222 -131.38 gain 222 12 -132.60 gain 12 223 -129.00 gain 223 12 -128.83 gain 12 224 -127.24 gain 224 12 -129.76 gain 13 14 -90.55 gain 14 13 -92.41 gain 13 15 -124.64 gain 15 13 -130.13 gain 13 16 -127.18 gain 16 13 -130.48 gain 13 17 -129.17 gain 17 13 -128.90 gain 13 18 -118.37 gain 18 13 -117.94 gain 13 19 -114.14 gain 19 13 -116.70 gain 13 20 -116.84 gain 20 13 -120.84 gain 13 21 -114.32 gain 21 13 -116.25 gain 13 22 -110.56 gain 22 13 -111.08 gain 13 23 -110.82 gain 23 13 -115.62 gain 13 24 -112.20 gain 24 13 -111.41 gain 13 25 -106.86 gain 25 13 -112.82 gain 13 26 -97.23 gain 26 13 -97.07 gain 13 27 -98.10 gain 27 13 -93.83 gain 13 28 -95.99 gain 28 13 -94.42 gain 13 29 -103.62 gain 29 13 -103.93 gain 13 30 -126.99 gain 30 13 -130.78 gain 13 31 -118.57 gain 31 13 -119.97 gain 13 32 -124.77 gain 32 13 -126.19 gain 13 33 -117.08 gain 33 13 -120.76 gain 13 34 -115.56 gain 34 13 -117.84 gain 13 35 -118.87 gain 35 13 -120.97 gain 13 36 -115.81 gain 36 13 -121.70 gain 13 37 -119.20 gain 37 13 -117.29 gain 13 38 -113.66 gain 38 13 -117.76 gain 13 39 -104.28 gain 39 13 -107.25 gain 13 40 -109.15 gain 40 13 -114.17 gain 13 41 -99.40 gain 41 13 -100.05 gain 13 42 -100.94 gain 42 13 -99.74 gain 13 43 -99.60 gain 43 13 -102.29 gain 13 44 -103.67 gain 44 13 -109.41 gain 13 45 -126.68 gain 45 13 -130.91 gain 13 46 -122.71 gain 46 13 -122.73 gain 13 47 -122.93 gain 47 13 -124.01 gain 13 48 -126.52 gain 48 13 -125.39 gain 13 49 -118.08 gain 49 13 -124.92 gain 13 50 -124.75 gain 50 13 -132.55 gain 13 51 -120.73 gain 51 13 -123.67 gain 13 52 -118.59 gain 52 13 -117.55 gain 13 53 -112.93 gain 53 13 -112.90 gain 13 54 -115.79 gain 54 13 -116.47 gain 13 55 -109.64 gain 55 13 -109.61 gain 13 56 -105.15 gain 56 13 -112.45 gain 13 57 -109.14 gain 57 13 -110.32 gain 13 58 -105.03 gain 58 13 -108.95 gain 13 59 -103.17 gain 59 13 -103.21 gain 13 60 -127.34 gain 60 13 -128.70 gain 13 61 -123.94 gain 61 13 -124.05 gain 13 62 -123.57 gain 62 13 -128.90 gain 13 63 -118.33 gain 63 13 -116.89 gain 13 64 -120.44 gain 64 13 -121.97 gain 13 65 -119.75 gain 65 13 -123.37 gain 13 66 -117.07 gain 66 13 -114.95 gain 13 67 -117.50 gain 67 13 -117.65 gain 13 68 -125.97 gain 68 13 -130.68 gain 13 69 -118.67 gain 69 13 -120.67 gain 13 70 -112.35 gain 70 13 -114.11 gain 13 71 -112.89 gain 71 13 -112.76 gain 13 72 -105.89 gain 72 13 -106.17 gain 13 73 -116.82 gain 73 13 -115.49 gain 13 74 -109.42 gain 74 13 -111.97 gain 13 75 -127.26 gain 75 13 -129.95 gain 13 76 -127.64 gain 76 13 -126.29 gain 13 77 -119.30 gain 77 13 -121.61 gain 13 78 -115.34 gain 78 13 -120.49 gain 13 79 -125.63 gain 79 13 -125.57 gain 13 80 -119.48 gain 80 13 -119.91 gain 13 81 -121.70 gain 81 13 -122.73 gain 13 82 -116.43 gain 82 13 -115.09 gain 13 83 -118.49 gain 83 13 -118.18 gain 13 84 -118.50 gain 84 13 -118.34 gain 13 85 -122.14 gain 85 13 -118.79 gain 13 86 -119.56 gain 86 13 -119.59 gain 13 87 -116.72 gain 87 13 -120.70 gain 13 88 -119.33 gain 88 13 -121.07 gain 13 89 -113.53 gain 89 13 -113.87 gain 13 90 -128.37 gain 90 13 -125.72 gain 13 91 -126.20 gain 91 13 -127.49 gain 13 92 -119.13 gain 92 13 -117.39 gain 13 93 -122.06 gain 93 13 -125.09 gain 13 94 -119.99 gain 94 13 -122.91 gain 13 95 -126.35 gain 95 13 -131.52 gain 13 96 -130.15 gain 96 13 -132.66 gain 13 97 -118.74 gain 97 13 -119.99 gain 13 98 -125.43 gain 98 13 -127.48 gain 13 99 -119.37 gain 99 13 -119.24 gain 13 100 -117.29 gain 100 13 -116.73 gain 13 101 -118.34 gain 101 13 -117.94 gain 13 102 -113.18 gain 102 13 -113.56 gain 13 103 -116.17 gain 103 13 -114.03 gain 13 104 -117.08 gain 104 13 -120.32 gain 13 105 -134.10 gain 105 13 -133.28 gain 13 106 -125.96 gain 106 13 -126.23 gain 13 107 -129.27 gain 107 13 -136.10 gain 13 108 -126.99 gain 108 13 -126.14 gain 13 109 -130.74 gain 109 13 -133.38 gain 13 110 -121.18 gain 110 13 -122.29 gain 13 111 -121.39 gain 111 13 -122.18 gain 13 112 -119.50 gain 112 13 -119.17 gain 13 113 -126.82 gain 113 13 -125.29 gain 13 114 -115.84 gain 114 13 -117.62 gain 13 115 -112.87 gain 115 13 -108.95 gain 13 116 -113.60 gain 116 13 -117.23 gain 13 117 -113.24 gain 117 13 -118.36 gain 13 118 -122.84 gain 118 13 -126.28 gain 13 119 -116.21 gain 119 13 -114.31 gain 13 120 -130.60 gain 120 13 -133.22 gain 13 121 -130.41 gain 121 13 -132.32 gain 13 122 -124.65 gain 122 13 -128.67 gain 13 123 -120.98 gain 123 13 -125.78 gain 13 124 -123.88 gain 124 13 -125.09 gain 13 125 -130.70 gain 125 13 -133.25 gain 13 126 -120.78 gain 126 13 -121.28 gain 13 127 -124.65 gain 127 13 -128.62 gain 13 128 -124.77 gain 128 13 -126.67 gain 13 129 -122.61 gain 129 13 -122.42 gain 13 130 -126.66 gain 130 13 -124.29 gain 13 131 -121.01 gain 131 13 -125.73 gain 13 132 -118.00 gain 132 13 -122.35 gain 13 133 -115.84 gain 133 13 -118.26 gain 13 134 -113.17 gain 134 13 -112.29 gain 13 135 -126.61 gain 135 13 -129.30 gain 13 136 -119.17 gain 136 13 -122.46 gain 13 137 -131.13 gain 137 13 -131.91 gain 13 138 -124.16 gain 138 13 -123.94 gain 13 139 -125.75 gain 139 13 -126.51 gain 13 140 -122.98 gain 140 13 -126.35 gain 13 141 -126.79 gain 141 13 -128.83 gain 13 142 -117.30 gain 142 13 -118.66 gain 13 143 -123.05 gain 143 13 -124.02 gain 13 144 -123.90 gain 144 13 -125.89 gain 13 145 -125.97 gain 145 13 -126.40 gain 13 146 -121.38 gain 146 13 -120.73 gain 13 147 -119.13 gain 147 13 -115.57 gain 13 148 -122.25 gain 148 13 -118.40 gain 13 149 -121.33 gain 149 13 -120.65 gain 13 150 -126.25 gain 150 13 -128.26 gain 13 151 -124.09 gain 151 13 -126.29 gain 13 152 -121.56 gain 152 13 -120.74 gain 13 153 -126.72 gain 153 13 -123.48 gain 13 154 -124.79 gain 154 13 -130.09 gain 13 155 -124.79 gain 155 13 -129.99 gain 13 156 -128.54 gain 156 13 -128.13 gain 13 157 -122.43 gain 157 13 -124.96 gain 13 158 -118.61 gain 158 13 -123.73 gain 13 159 -125.08 gain 159 13 -126.83 gain 13 160 -116.17 gain 160 13 -115.03 gain 13 161 -117.84 gain 161 13 -120.18 gain 13 162 -126.18 gain 162 13 -127.39 gain 13 163 -118.27 gain 163 13 -121.63 gain 13 164 -119.49 gain 164 13 -123.89 gain 13 165 -124.57 gain 165 13 -125.01 gain 13 166 -126.25 gain 166 13 -128.27 gain 13 167 -120.46 gain 167 13 -124.56 gain 13 168 -131.78 gain 168 13 -134.33 gain 13 169 -124.14 gain 169 13 -130.89 gain 13 170 -122.71 gain 170 13 -120.99 gain 13 171 -121.40 gain 171 13 -124.70 gain 13 172 -126.78 gain 172 13 -124.78 gain 13 173 -126.55 gain 173 13 -123.98 gain 13 174 -116.85 gain 174 13 -118.59 gain 13 175 -125.92 gain 175 13 -131.20 gain 13 176 -120.68 gain 176 13 -117.98 gain 13 177 -125.04 gain 177 13 -130.14 gain 13 178 -124.44 gain 178 13 -125.38 gain 13 179 -125.10 gain 179 13 -124.42 gain 13 180 -129.13 gain 180 13 -129.93 gain 13 181 -126.94 gain 181 13 -127.80 gain 13 182 -121.59 gain 182 13 -124.84 gain 13 183 -127.86 gain 183 13 -124.50 gain 13 184 -130.29 gain 184 13 -131.71 gain 13 185 -126.67 gain 185 13 -125.58 gain 13 186 -123.97 gain 186 13 -123.16 gain 13 187 -124.59 gain 187 13 -126.32 gain 13 188 -124.91 gain 188 13 -129.90 gain 13 189 -114.46 gain 189 13 -116.97 gain 13 190 -117.24 gain 190 13 -116.75 gain 13 191 -123.79 gain 191 13 -124.40 gain 13 192 -127.04 gain 192 13 -130.51 gain 13 193 -129.48 gain 193 13 -134.21 gain 13 194 -122.28 gain 194 13 -120.82 gain 13 195 -136.56 gain 195 13 -135.73 gain 13 196 -133.44 gain 196 13 -136.64 gain 13 197 -124.82 gain 197 13 -124.09 gain 13 198 -134.06 gain 198 13 -132.85 gain 13 199 -121.92 gain 199 13 -124.63 gain 13 200 -126.85 gain 200 13 -126.50 gain 13 201 -122.50 gain 201 13 -122.95 gain 13 202 -122.26 gain 202 13 -126.72 gain 13 203 -122.45 gain 203 13 -126.53 gain 13 204 -126.50 gain 204 13 -127.86 gain 13 205 -130.87 gain 205 13 -131.30 gain 13 206 -126.50 gain 206 13 -131.45 gain 13 207 -128.42 gain 207 13 -125.73 gain 13 208 -126.70 gain 208 13 -129.79 gain 13 209 -113.54 gain 209 13 -117.62 gain 13 210 -134.90 gain 210 13 -135.92 gain 13 211 -128.42 gain 211 13 -131.46 gain 13 212 -127.54 gain 212 13 -129.13 gain 13 213 -132.59 gain 213 13 -133.36 gain 13 214 -131.50 gain 214 13 -132.16 gain 13 215 -134.93 gain 215 13 -132.01 gain 13 216 -123.57 gain 216 13 -125.31 gain 13 217 -132.04 gain 217 13 -134.30 gain 13 218 -130.21 gain 218 13 -134.66 gain 13 219 -126.23 gain 219 13 -122.04 gain 13 220 -124.24 gain 220 13 -130.53 gain 13 221 -127.62 gain 221 13 -129.56 gain 13 222 -135.65 gain 222 13 -137.92 gain 13 223 -126.45 gain 223 13 -127.33 gain 13 224 -120.97 gain 224 13 -124.54 gain 14 15 -121.35 gain 15 14 -124.97 gain 14 16 -123.10 gain 16 14 -124.54 gain 14 17 -126.41 gain 17 14 -124.28 gain 14 18 -126.93 gain 18 14 -124.64 gain 14 19 -120.49 gain 19 14 -121.19 gain 14 20 -118.65 gain 20 14 -120.79 gain 14 21 -120.52 gain 21 14 -120.59 gain 14 22 -111.31 gain 22 14 -109.97 gain 14 23 -112.35 gain 23 14 -115.28 gain 14 24 -113.35 gain 24 14 -110.69 gain 14 25 -115.19 gain 25 14 -119.28 gain 14 26 -111.09 gain 26 14 -109.07 gain 14 27 -104.31 gain 27 14 -98.19 gain 14 28 -98.55 gain 28 14 -95.12 gain 14 29 -90.77 gain 29 14 -89.22 gain 14 30 -126.73 gain 30 14 -128.65 gain 14 31 -126.62 gain 31 14 -126.15 gain 14 32 -127.80 gain 32 14 -127.37 gain 14 33 -129.01 gain 33 14 -130.82 gain 14 34 -126.41 gain 34 14 -126.83 gain 14 35 -122.82 gain 35 14 -123.06 gain 14 36 -123.61 gain 36 14 -127.63 gain 14 37 -121.33 gain 37 14 -117.56 gain 14 38 -120.35 gain 38 14 -122.60 gain 14 39 -107.40 gain 39 14 -108.51 gain 14 40 -113.82 gain 40 14 -116.98 gain 14 41 -110.03 gain 41 14 -108.82 gain 14 42 -108.09 gain 42 14 -105.03 gain 14 43 -104.78 gain 43 14 -105.61 gain 14 44 -97.30 gain 44 14 -101.19 gain 14 45 -126.53 gain 45 14 -128.89 gain 14 46 -129.60 gain 46 14 -127.76 gain 14 47 -129.64 gain 47 14 -128.85 gain 14 48 -118.39 gain 48 14 -115.39 gain 14 49 -132.05 gain 49 14 -137.02 gain 14 50 -120.34 gain 50 14 -126.28 gain 14 51 -120.58 gain 51 14 -121.66 gain 14 52 -117.34 gain 52 14 -114.44 gain 14 53 -116.53 gain 53 14 -114.65 gain 14 54 -114.26 gain 54 14 -113.07 gain 14 55 -114.02 gain 55 14 -112.13 gain 14 56 -111.15 gain 56 14 -116.59 gain 14 57 -104.62 gain 57 14 -103.93 gain 14 58 -112.62 gain 58 14 -114.67 gain 14 59 -110.31 gain 59 14 -108.49 gain 14 60 -133.38 gain 60 14 -132.88 gain 14 61 -120.38 gain 61 14 -118.64 gain 14 62 -128.16 gain 62 14 -131.63 gain 14 63 -131.50 gain 63 14 -128.20 gain 14 64 -126.02 gain 64 14 -125.69 gain 14 65 -118.08 gain 65 14 -119.84 gain 14 66 -121.92 gain 66 14 -117.93 gain 14 67 -124.60 gain 67 14 -122.89 gain 14 68 -127.03 gain 68 14 -129.87 gain 14 69 -119.21 gain 69 14 -119.35 gain 14 70 -109.53 gain 70 14 -109.42 gain 14 71 -112.34 gain 71 14 -110.35 gain 14 72 -113.54 gain 72 14 -111.96 gain 14 73 -107.93 gain 73 14 -104.74 gain 14 74 -107.82 gain 74 14 -108.51 gain 14 75 -126.10 gain 75 14 -126.93 gain 14 76 -121.32 gain 76 14 -118.10 gain 14 77 -124.59 gain 77 14 -125.03 gain 14 78 -130.45 gain 78 14 -133.74 gain 14 79 -123.69 gain 79 14 -121.76 gain 14 80 -118.53 gain 80 14 -117.10 gain 14 81 -128.02 gain 81 14 -127.18 gain 14 82 -117.84 gain 82 14 -114.63 gain 14 83 -123.81 gain 83 14 -121.63 gain 14 84 -118.57 gain 84 14 -116.55 gain 14 85 -111.85 gain 85 14 -106.63 gain 14 86 -119.66 gain 86 14 -117.82 gain 14 87 -110.61 gain 87 14 -112.74 gain 14 88 -116.68 gain 88 14 -116.56 gain 14 89 -115.91 gain 89 14 -114.38 gain 14 90 -131.65 gain 90 14 -127.13 gain 14 91 -127.42 gain 91 14 -126.85 gain 14 92 -125.88 gain 92 14 -122.27 gain 14 93 -132.47 gain 93 14 -133.64 gain 14 94 -126.08 gain 94 14 -127.14 gain 14 95 -125.39 gain 95 14 -128.69 gain 14 96 -125.34 gain 96 14 -125.98 gain 14 97 -117.43 gain 97 14 -116.82 gain 14 98 -126.42 gain 98 14 -126.60 gain 14 99 -121.19 gain 99 14 -119.20 gain 14 100 -118.82 gain 100 14 -116.39 gain 14 101 -117.02 gain 101 14 -114.76 gain 14 102 -115.06 gain 102 14 -113.58 gain 14 103 -109.10 gain 103 14 -105.10 gain 14 104 -121.08 gain 104 14 -122.46 gain 14 105 -124.78 gain 105 14 -122.10 gain 14 106 -132.67 gain 106 14 -131.07 gain 14 107 -127.12 gain 107 14 -132.09 gain 14 108 -125.70 gain 108 14 -122.98 gain 14 109 -125.89 gain 109 14 -126.66 gain 14 110 -127.03 gain 110 14 -126.28 gain 14 111 -123.13 gain 111 14 -122.06 gain 14 112 -121.42 gain 112 14 -119.22 gain 14 113 -123.76 gain 113 14 -120.37 gain 14 114 -124.83 gain 114 14 -124.75 gain 14 115 -117.48 gain 115 14 -111.70 gain 14 116 -118.09 gain 116 14 -119.85 gain 14 117 -127.47 gain 117 14 -130.73 gain 14 118 -122.85 gain 118 14 -124.43 gain 14 119 -117.19 gain 119 14 -113.43 gain 14 120 -121.73 gain 120 14 -122.48 gain 14 121 -127.58 gain 121 14 -127.62 gain 14 122 -135.15 gain 122 14 -137.31 gain 14 123 -129.93 gain 123 14 -132.86 gain 14 124 -127.59 gain 124 14 -126.93 gain 14 125 -129.25 gain 125 14 -129.93 gain 14 126 -123.34 gain 126 14 -121.98 gain 14 127 -118.36 gain 127 14 -120.46 gain 14 128 -119.74 gain 128 14 -119.78 gain 14 129 -122.28 gain 129 14 -120.23 gain 14 130 -126.99 gain 130 14 -122.76 gain 14 131 -115.85 gain 131 14 -118.70 gain 14 132 -119.08 gain 132 14 -121.56 gain 14 133 -126.93 gain 133 14 -127.49 gain 14 134 -119.26 gain 134 14 -116.52 gain 14 135 -130.22 gain 135 14 -131.04 gain 14 136 -132.69 gain 136 14 -134.13 gain 14 137 -133.94 gain 137 14 -132.86 gain 14 138 -130.57 gain 138 14 -128.49 gain 14 139 -122.73 gain 139 14 -121.63 gain 14 140 -132.05 gain 140 14 -133.56 gain 14 141 -123.81 gain 141 14 -123.99 gain 14 142 -130.81 gain 142 14 -130.30 gain 14 143 -125.27 gain 143 14 -124.38 gain 14 144 -119.83 gain 144 14 -119.95 gain 14 145 -128.50 gain 145 14 -127.07 gain 14 146 -122.30 gain 146 14 -119.78 gain 14 147 -123.72 gain 147 14 -118.30 gain 14 148 -123.11 gain 148 14 -117.40 gain 14 149 -119.80 gain 149 14 -117.26 gain 14 150 -132.15 gain 150 14 -132.29 gain 14 151 -139.47 gain 151 14 -139.81 gain 14 152 -124.67 gain 152 14 -121.98 gain 14 153 -129.40 gain 153 14 -124.30 gain 14 154 -126.58 gain 154 14 -130.02 gain 14 155 -135.90 gain 155 14 -139.24 gain 14 156 -116.61 gain 156 14 -114.34 gain 14 157 -128.13 gain 157 14 -128.80 gain 14 158 -129.37 gain 158 14 -132.63 gain 14 159 -130.21 gain 159 14 -130.10 gain 14 160 -126.58 gain 160 14 -123.57 gain 14 161 -115.96 gain 161 14 -116.45 gain 14 162 -128.88 gain 162 14 -128.23 gain 14 163 -119.57 gain 163 14 -121.07 gain 14 164 -127.33 gain 164 14 -129.87 gain 14 165 -133.54 gain 165 14 -132.12 gain 14 166 -125.82 gain 166 14 -125.97 gain 14 167 -127.23 gain 167 14 -129.47 gain 14 168 -130.43 gain 168 14 -131.12 gain 14 169 -133.03 gain 169 14 -137.92 gain 14 170 -126.37 gain 170 14 -122.79 gain 14 171 -127.07 gain 171 14 -128.51 gain 14 172 -132.24 gain 172 14 -128.38 gain 14 173 -118.89 gain 173 14 -114.46 gain 14 174 -124.50 gain 174 14 -124.37 gain 14 175 -122.35 gain 175 14 -125.78 gain 14 176 -128.26 gain 176 14 -123.69 gain 14 177 -123.26 gain 177 14 -126.51 gain 14 178 -137.67 gain 178 14 -136.74 gain 14 179 -127.43 gain 179 14 -124.90 gain 14 180 -129.12 gain 180 14 -128.05 gain 14 181 -130.88 gain 181 14 -129.87 gain 14 182 -129.86 gain 182 14 -131.25 gain 14 183 -126.99 gain 183 14 -121.76 gain 14 184 -129.87 gain 184 14 -129.42 gain 14 185 -133.53 gain 185 14 -130.57 gain 14 186 -130.32 gain 186 14 -127.65 gain 14 187 -125.36 gain 187 14 -125.23 gain 14 188 -128.11 gain 188 14 -131.24 gain 14 189 -138.85 gain 189 14 -139.49 gain 14 190 -126.42 gain 190 14 -124.07 gain 14 191 -122.57 gain 191 14 -121.31 gain 14 192 -128.45 gain 192 14 -130.06 gain 14 193 -124.75 gain 193 14 -127.61 gain 14 194 -125.20 gain 194 14 -121.87 gain 14 195 -129.39 gain 195 14 -126.69 gain 14 196 -134.86 gain 196 14 -136.20 gain 14 197 -135.18 gain 197 14 -132.59 gain 14 198 -133.10 gain 198 14 -130.03 gain 14 199 -127.97 gain 199 14 -128.82 gain 14 200 -125.87 gain 200 14 -123.65 gain 14 201 -138.35 gain 201 14 -136.94 gain 14 202 -130.78 gain 202 14 -133.37 gain 14 203 -137.52 gain 203 14 -139.73 gain 14 204 -135.60 gain 204 14 -135.10 gain 14 205 -120.63 gain 205 14 -119.20 gain 14 206 -138.51 gain 206 14 -141.60 gain 14 207 -134.38 gain 207 14 -129.83 gain 14 208 -134.95 gain 208 14 -136.17 gain 14 209 -127.56 gain 209 14 -129.78 gain 14 210 -137.97 gain 210 14 -137.12 gain 14 211 -130.55 gain 211 14 -131.73 gain 14 212 -129.02 gain 212 14 -128.74 gain 14 213 -135.67 gain 213 14 -134.59 gain 14 214 -136.94 gain 214 14 -135.74 gain 14 215 -128.39 gain 215 14 -123.61 gain 14 216 -128.42 gain 216 14 -128.29 gain 14 217 -129.20 gain 217 14 -129.60 gain 14 218 -126.52 gain 218 14 -129.11 gain 14 219 -128.30 gain 219 14 -122.24 gain 14 220 -127.81 gain 220 14 -132.24 gain 14 221 -135.52 gain 221 14 -135.60 gain 14 222 -124.22 gain 222 14 -124.62 gain 14 223 -128.45 gain 223 14 -127.47 gain 14 224 -127.53 gain 224 14 -129.23 gain 15 16 -94.01 gain 16 15 -91.83 gain 15 17 -108.42 gain 17 15 -102.67 gain 15 18 -116.80 gain 18 15 -110.89 gain 15 19 -115.85 gain 19 15 -112.93 gain 15 20 -119.97 gain 20 15 -118.49 gain 15 21 -126.36 gain 21 15 -122.80 gain 15 22 -119.41 gain 22 15 -114.45 gain 15 23 -124.07 gain 23 15 -123.38 gain 15 24 -129.64 gain 24 15 -123.36 gain 15 25 -130.06 gain 25 15 -130.53 gain 15 26 -133.11 gain 26 15 -127.46 gain 15 27 -133.77 gain 27 15 -124.02 gain 15 28 -132.04 gain 28 15 -124.99 gain 15 29 -126.46 gain 29 15 -121.29 gain 15 30 -106.53 gain 30 15 -104.82 gain 15 31 -105.75 gain 31 15 -101.66 gain 15 32 -106.00 gain 32 15 -101.94 gain 15 33 -117.21 gain 33 15 -115.40 gain 15 34 -117.59 gain 34 15 -114.38 gain 15 35 -122.97 gain 35 15 -119.59 gain 15 36 -119.81 gain 36 15 -120.21 gain 15 37 -125.34 gain 37 15 -117.94 gain 15 38 -128.32 gain 38 15 -126.94 gain 15 39 -120.38 gain 39 15 -117.87 gain 15 40 -128.27 gain 40 15 -127.80 gain 15 41 -127.99 gain 41 15 -123.15 gain 15 42 -120.40 gain 42 15 -113.71 gain 15 43 -136.22 gain 43 15 -133.42 gain 15 44 -137.59 gain 44 15 -137.85 gain 15 45 -105.79 gain 45 15 -104.52 gain 15 46 -106.15 gain 46 15 -100.68 gain 15 47 -106.90 gain 47 15 -102.49 gain 15 48 -113.90 gain 48 15 -107.28 gain 15 49 -121.01 gain 49 15 -122.36 gain 15 50 -119.07 gain 50 15 -121.39 gain 15 51 -122.37 gain 51 15 -119.83 gain 15 52 -122.61 gain 52 15 -116.09 gain 15 53 -128.01 gain 53 15 -122.50 gain 15 54 -128.07 gain 54 15 -123.26 gain 15 55 -135.47 gain 55 15 -129.96 gain 15 56 -126.42 gain 56 15 -128.23 gain 15 57 -139.18 gain 57 15 -134.87 gain 15 58 -132.80 gain 58 15 -131.23 gain 15 59 -129.64 gain 59 15 -124.19 gain 15 60 -115.36 gain 60 15 -111.23 gain 15 61 -114.26 gain 61 15 -108.89 gain 15 62 -115.06 gain 62 15 -114.91 gain 15 63 -119.72 gain 63 15 -112.79 gain 15 64 -112.89 gain 64 15 -108.93 gain 15 65 -120.30 gain 65 15 -118.44 gain 15 66 -129.49 gain 66 15 -121.88 gain 15 67 -122.18 gain 67 15 -116.85 gain 15 68 -128.54 gain 68 15 -127.76 gain 15 69 -126.92 gain 69 15 -123.44 gain 15 70 -125.86 gain 70 15 -122.13 gain 15 71 -129.49 gain 71 15 -123.86 gain 15 72 -127.53 gain 72 15 -122.32 gain 15 73 -134.14 gain 73 15 -127.33 gain 15 74 -130.22 gain 74 15 -127.28 gain 15 75 -116.84 gain 75 15 -114.04 gain 15 76 -117.27 gain 76 15 -110.43 gain 15 77 -114.83 gain 77 15 -111.65 gain 15 78 -116.60 gain 78 15 -116.27 gain 15 79 -119.51 gain 79 15 -113.96 gain 15 80 -115.47 gain 80 15 -110.42 gain 15 81 -127.46 gain 81 15 -123.00 gain 15 82 -122.35 gain 82 15 -115.52 gain 15 83 -122.95 gain 83 15 -117.15 gain 15 84 -122.09 gain 84 15 -116.44 gain 15 85 -126.28 gain 85 15 -117.44 gain 15 86 -127.21 gain 86 15 -121.75 gain 15 87 -127.56 gain 87 15 -126.07 gain 15 88 -127.18 gain 88 15 -123.43 gain 15 89 -140.24 gain 89 15 -135.09 gain 15 90 -121.70 gain 90 15 -113.56 gain 15 91 -122.60 gain 91 15 -118.41 gain 15 92 -121.28 gain 92 15 -114.04 gain 15 93 -124.83 gain 93 15 -122.38 gain 15 94 -120.11 gain 94 15 -117.54 gain 15 95 -124.49 gain 95 15 -124.17 gain 15 96 -120.71 gain 96 15 -117.73 gain 15 97 -129.24 gain 97 15 -125.00 gain 15 98 -130.90 gain 98 15 -127.46 gain 15 99 -121.73 gain 99 15 -116.11 gain 15 100 -138.77 gain 100 15 -132.72 gain 15 101 -126.13 gain 101 15 -120.24 gain 15 102 -130.85 gain 102 15 -125.74 gain 15 103 -133.62 gain 103 15 -125.99 gain 15 104 -132.45 gain 104 15 -130.20 gain 15 105 -114.82 gain 105 15 -108.52 gain 15 106 -120.96 gain 106 15 -115.74 gain 15 107 -123.22 gain 107 15 -124.57 gain 15 108 -122.69 gain 108 15 -116.36 gain 15 109 -120.00 gain 109 15 -117.16 gain 15 110 -124.74 gain 110 15 -120.37 gain 15 111 -124.29 gain 111 15 -119.59 gain 15 112 -122.44 gain 112 15 -116.62 gain 15 113 -123.81 gain 113 15 -116.80 gain 15 114 -131.21 gain 114 15 -127.50 gain 15 115 -134.68 gain 115 15 -125.27 gain 15 116 -129.72 gain 116 15 -127.85 gain 15 117 -129.80 gain 117 15 -129.43 gain 15 118 -132.78 gain 118 15 -130.73 gain 15 119 -131.72 gain 119 15 -124.34 gain 15 120 -123.44 gain 120 15 -120.57 gain 15 121 -129.78 gain 121 15 -126.20 gain 15 122 -121.53 gain 122 15 -120.06 gain 15 123 -123.13 gain 123 15 -122.45 gain 15 124 -125.00 gain 124 15 -120.72 gain 15 125 -124.62 gain 125 15 -121.68 gain 15 126 -131.47 gain 126 15 -126.48 gain 15 127 -131.92 gain 127 15 -130.40 gain 15 128 -121.08 gain 128 15 -117.50 gain 15 129 -129.01 gain 129 15 -123.34 gain 15 130 -122.22 gain 130 15 -114.37 gain 15 131 -127.74 gain 131 15 -126.98 gain 15 132 -135.22 gain 132 15 -134.08 gain 15 133 -133.64 gain 133 15 -130.57 gain 15 134 -132.52 gain 134 15 -126.15 gain 15 135 -124.52 gain 135 15 -121.72 gain 15 136 -123.97 gain 136 15 -121.79 gain 15 137 -121.57 gain 137 15 -116.86 gain 15 138 -120.89 gain 138 15 -115.19 gain 15 139 -129.63 gain 139 15 -124.91 gain 15 140 -129.55 gain 140 15 -127.44 gain 15 141 -123.55 gain 141 15 -120.11 gain 15 142 -132.87 gain 142 15 -128.74 gain 15 143 -130.46 gain 143 15 -125.94 gain 15 144 -128.85 gain 144 15 -125.34 gain 15 145 -131.53 gain 145 15 -126.48 gain 15 146 -133.77 gain 146 15 -127.63 gain 15 147 -130.65 gain 147 15 -121.60 gain 15 148 -132.01 gain 148 15 -122.68 gain 15 149 -132.91 gain 149 15 -126.74 gain 15 150 -123.33 gain 150 15 -119.85 gain 15 151 -125.87 gain 151 15 -122.59 gain 15 152 -130.51 gain 152 15 -124.20 gain 15 153 -130.00 gain 153 15 -121.27 gain 15 154 -130.70 gain 154 15 -130.52 gain 15 155 -133.17 gain 155 15 -132.89 gain 15 156 -131.26 gain 156 15 -125.36 gain 15 157 -124.79 gain 157 15 -121.84 gain 15 158 -131.17 gain 158 15 -130.81 gain 15 159 -132.86 gain 159 15 -129.12 gain 15 160 -131.52 gain 160 15 -124.89 gain 15 161 -129.69 gain 161 15 -126.55 gain 15 162 -133.65 gain 162 15 -129.38 gain 15 163 -133.02 gain 163 15 -130.89 gain 15 164 -141.54 gain 164 15 -140.46 gain 15 165 -128.31 gain 165 15 -123.27 gain 15 166 -128.62 gain 166 15 -125.14 gain 15 167 -129.72 gain 167 15 -128.34 gain 15 168 -124.73 gain 168 15 -121.80 gain 15 169 -128.65 gain 169 15 -129.92 gain 15 170 -124.48 gain 170 15 -117.27 gain 15 171 -125.22 gain 171 15 -123.03 gain 15 172 -132.14 gain 172 15 -124.65 gain 15 173 -132.55 gain 173 15 -124.50 gain 15 174 -138.19 gain 174 15 -134.43 gain 15 175 -131.17 gain 175 15 -130.97 gain 15 176 -127.95 gain 176 15 -119.76 gain 15 177 -137.58 gain 177 15 -137.20 gain 15 178 -135.93 gain 178 15 -131.38 gain 15 179 -132.65 gain 179 15 -126.49 gain 15 180 -129.92 gain 180 15 -125.23 gain 15 181 -134.68 gain 181 15 -130.05 gain 15 182 -138.81 gain 182 15 -136.57 gain 15 183 -133.11 gain 183 15 -124.26 gain 15 184 -127.43 gain 184 15 -123.37 gain 15 185 -131.75 gain 185 15 -125.17 gain 15 186 -137.51 gain 186 15 -131.21 gain 15 187 -129.78 gain 187 15 -126.02 gain 15 188 -130.66 gain 188 15 -130.16 gain 15 189 -134.34 gain 189 15 -131.35 gain 15 190 -135.45 gain 190 15 -129.48 gain 15 191 -133.57 gain 191 15 -128.69 gain 15 192 -137.11 gain 192 15 -135.09 gain 15 193 -130.34 gain 193 15 -129.58 gain 15 194 -140.81 gain 194 15 -133.86 gain 15 195 -131.79 gain 195 15 -125.47 gain 15 196 -136.14 gain 196 15 -133.86 gain 15 197 -125.05 gain 197 15 -118.84 gain 15 198 -130.51 gain 198 15 -123.82 gain 15 199 -128.87 gain 199 15 -126.09 gain 15 200 -132.44 gain 200 15 -126.60 gain 15 201 -135.46 gain 201 15 -130.42 gain 15 202 -127.88 gain 202 15 -126.84 gain 15 203 -132.25 gain 203 15 -130.84 gain 15 204 -133.15 gain 204 15 -129.03 gain 15 205 -139.59 gain 205 15 -134.53 gain 15 206 -130.53 gain 206 15 -130.00 gain 15 207 -125.61 gain 207 15 -117.44 gain 15 208 -132.00 gain 208 15 -129.60 gain 15 209 -131.47 gain 209 15 -130.06 gain 15 210 -133.80 gain 210 15 -129.33 gain 15 211 -134.98 gain 211 15 -132.54 gain 15 212 -128.64 gain 212 15 -124.73 gain 15 213 -135.19 gain 213 15 -130.48 gain 15 214 -134.73 gain 214 15 -129.90 gain 15 215 -132.78 gain 215 15 -124.37 gain 15 216 -136.37 gain 216 15 -132.63 gain 15 217 -138.61 gain 217 15 -135.38 gain 15 218 -134.70 gain 218 15 -133.66 gain 15 219 -133.59 gain 219 15 -123.91 gain 15 220 -132.20 gain 220 15 -133.02 gain 15 221 -136.44 gain 221 15 -132.89 gain 15 222 -131.73 gain 222 15 -128.51 gain 15 223 -131.45 gain 223 15 -126.84 gain 15 224 -133.60 gain 224 15 -131.68 gain 16 17 -100.02 gain 17 16 -96.45 gain 16 18 -104.92 gain 18 16 -101.18 gain 16 19 -115.29 gain 19 16 -114.55 gain 16 20 -112.20 gain 20 16 -112.90 gain 16 21 -110.01 gain 21 16 -108.64 gain 16 22 -115.62 gain 22 16 -112.84 gain 16 23 -118.56 gain 23 16 -120.05 gain 16 24 -116.91 gain 24 16 -112.81 gain 16 25 -122.46 gain 25 16 -125.11 gain 16 26 -119.87 gain 26 16 -116.41 gain 16 27 -126.78 gain 27 16 -119.21 gain 16 28 -128.69 gain 28 16 -123.82 gain 16 29 -131.95 gain 29 16 -128.96 gain 16 30 -96.22 gain 30 16 -96.69 gain 16 31 -94.45 gain 31 16 -92.54 gain 16 32 -102.47 gain 32 16 -100.59 gain 16 33 -109.38 gain 33 16 -109.75 gain 16 34 -116.02 gain 34 16 -115.00 gain 16 35 -109.90 gain 35 16 -108.71 gain 16 36 -115.45 gain 36 16 -118.03 gain 16 37 -117.63 gain 37 16 -112.42 gain 16 38 -118.31 gain 38 16 -119.11 gain 16 39 -120.64 gain 39 16 -120.31 gain 16 40 -124.79 gain 40 16 -126.50 gain 16 41 -129.30 gain 41 16 -126.65 gain 16 42 -127.66 gain 42 16 -123.15 gain 16 43 -123.88 gain 43 16 -123.26 gain 16 44 -127.71 gain 44 16 -130.15 gain 16 45 -108.51 gain 45 16 -109.43 gain 16 46 -110.89 gain 46 16 -107.60 gain 16 47 -102.77 gain 47 16 -100.54 gain 16 48 -102.57 gain 48 16 -98.13 gain 16 49 -108.88 gain 49 16 -112.42 gain 16 50 -117.58 gain 50 16 -122.08 gain 16 51 -113.88 gain 51 16 -113.52 gain 16 52 -122.59 gain 52 16 -118.25 gain 16 53 -124.18 gain 53 16 -120.86 gain 16 54 -125.55 gain 54 16 -122.92 gain 16 55 -126.34 gain 55 16 -123.01 gain 16 56 -128.33 gain 56 16 -132.33 gain 16 57 -135.99 gain 57 16 -133.86 gain 16 58 -124.09 gain 58 16 -124.70 gain 16 59 -129.50 gain 59 16 -126.24 gain 16 60 -107.13 gain 60 16 -105.19 gain 16 61 -108.24 gain 61 16 -105.05 gain 16 62 -109.04 gain 62 16 -111.07 gain 16 63 -115.63 gain 63 16 -110.89 gain 16 64 -121.39 gain 64 16 -119.62 gain 16 65 -111.14 gain 65 16 -111.46 gain 16 66 -112.98 gain 66 16 -107.55 gain 16 67 -120.04 gain 67 16 -116.89 gain 16 68 -118.12 gain 68 16 -119.53 gain 16 69 -118.42 gain 69 16 -117.11 gain 16 70 -128.62 gain 70 16 -127.08 gain 16 71 -126.61 gain 71 16 -123.17 gain 16 72 -128.90 gain 72 16 -125.88 gain 16 73 -132.70 gain 73 16 -128.07 gain 16 74 -124.89 gain 74 16 -124.13 gain 16 75 -111.71 gain 75 16 -111.10 gain 16 76 -114.28 gain 76 16 -109.62 gain 16 77 -115.39 gain 77 16 -114.39 gain 16 78 -115.38 gain 78 16 -117.23 gain 16 79 -115.08 gain 79 16 -111.71 gain 16 80 -124.27 gain 80 16 -121.40 gain 16 81 -116.77 gain 81 16 -114.49 gain 16 82 -112.19 gain 82 16 -107.54 gain 16 83 -119.63 gain 83 16 -116.01 gain 16 84 -121.74 gain 84 16 -118.27 gain 16 85 -122.39 gain 85 16 -115.73 gain 16 86 -125.79 gain 86 16 -122.51 gain 16 87 -127.79 gain 87 16 -128.47 gain 16 88 -131.05 gain 88 16 -129.49 gain 16 89 -126.56 gain 89 16 -123.60 gain 16 90 -112.50 gain 90 16 -106.55 gain 16 91 -111.51 gain 91 16 -109.50 gain 16 92 -119.52 gain 92 16 -114.47 gain 16 93 -118.62 gain 93 16 -118.35 gain 16 94 -123.56 gain 94 16 -123.17 gain 16 95 -117.88 gain 95 16 -119.74 gain 16 96 -122.13 gain 96 16 -121.33 gain 16 97 -128.58 gain 97 16 -126.53 gain 16 98 -122.96 gain 98 16 -121.71 gain 16 99 -125.47 gain 99 16 -122.04 gain 16 100 -129.45 gain 100 16 -125.58 gain 16 101 -126.24 gain 101 16 -122.54 gain 16 102 -133.38 gain 102 16 -130.45 gain 16 103 -144.35 gain 103 16 -138.91 gain 16 104 -127.99 gain 104 16 -127.92 gain 16 105 -121.26 gain 105 16 -117.14 gain 16 106 -125.28 gain 106 16 -122.24 gain 16 107 -113.99 gain 107 16 -117.52 gain 16 108 -121.07 gain 108 16 -116.91 gain 16 109 -110.86 gain 109 16 -110.20 gain 16 110 -126.45 gain 110 16 -124.26 gain 16 111 -123.41 gain 111 16 -120.90 gain 16 112 -119.99 gain 112 16 -116.35 gain 16 113 -120.46 gain 113 16 -115.63 gain 16 114 -125.31 gain 114 16 -123.78 gain 16 115 -128.53 gain 115 16 -121.31 gain 16 116 -128.76 gain 116 16 -129.08 gain 16 117 -128.56 gain 117 16 -130.38 gain 16 118 -126.62 gain 118 16 -126.76 gain 16 119 -130.10 gain 119 16 -124.90 gain 16 120 -113.66 gain 120 16 -112.98 gain 16 121 -123.17 gain 121 16 -121.77 gain 16 122 -122.20 gain 122 16 -122.92 gain 16 123 -128.19 gain 123 16 -129.69 gain 16 124 -126.64 gain 124 16 -124.55 gain 16 125 -132.99 gain 125 16 -132.23 gain 16 126 -113.49 gain 126 16 -110.69 gain 16 127 -118.23 gain 127 16 -118.89 gain 16 128 -125.64 gain 128 16 -124.24 gain 16 129 -124.23 gain 129 16 -120.73 gain 16 130 -130.02 gain 130 16 -124.36 gain 16 131 -127.85 gain 131 16 -129.27 gain 16 132 -131.16 gain 132 16 -132.20 gain 16 133 -129.14 gain 133 16 -128.26 gain 16 134 -133.32 gain 134 16 -129.13 gain 16 135 -127.19 gain 135 16 -126.57 gain 16 136 -122.70 gain 136 16 -122.70 gain 16 137 -122.89 gain 137 16 -120.36 gain 16 138 -131.51 gain 138 16 -127.99 gain 16 139 -117.49 gain 139 16 -114.96 gain 16 140 -123.37 gain 140 16 -123.44 gain 16 141 -128.84 gain 141 16 -127.59 gain 16 142 -127.40 gain 142 16 -125.45 gain 16 143 -119.58 gain 143 16 -117.25 gain 16 144 -123.01 gain 144 16 -121.69 gain 16 145 -129.97 gain 145 16 -127.10 gain 16 146 -130.25 gain 146 16 -126.29 gain 16 147 -127.90 gain 147 16 -121.03 gain 16 148 -123.10 gain 148 16 -115.95 gain 16 149 -131.82 gain 149 16 -127.83 gain 16 150 -121.17 gain 150 16 -119.87 gain 16 151 -122.94 gain 151 16 -121.84 gain 16 152 -119.32 gain 152 16 -115.20 gain 16 153 -130.37 gain 153 16 -123.82 gain 16 154 -125.44 gain 154 16 -127.44 gain 16 155 -123.53 gain 155 16 -125.43 gain 16 156 -126.30 gain 156 16 -122.58 gain 16 157 -122.82 gain 157 16 -122.05 gain 16 158 -131.55 gain 158 16 -133.38 gain 16 159 -125.64 gain 159 16 -124.08 gain 16 160 -135.26 gain 160 16 -130.82 gain 16 161 -124.91 gain 161 16 -123.96 gain 16 162 -131.44 gain 162 16 -129.34 gain 16 163 -132.66 gain 163 16 -132.72 gain 16 164 -132.15 gain 164 16 -133.25 gain 16 165 -133.35 gain 165 16 -130.49 gain 16 166 -126.92 gain 166 16 -125.63 gain 16 167 -126.26 gain 167 16 -127.06 gain 16 168 -131.16 gain 168 16 -130.41 gain 16 169 -125.54 gain 169 16 -128.99 gain 16 170 -130.44 gain 170 16 -125.41 gain 16 171 -122.99 gain 171 16 -122.99 gain 16 172 -124.80 gain 172 16 -119.50 gain 16 173 -130.91 gain 173 16 -125.04 gain 16 174 -124.30 gain 174 16 -122.73 gain 16 175 -132.37 gain 175 16 -134.35 gain 16 176 -133.20 gain 176 16 -127.19 gain 16 177 -130.53 gain 177 16 -132.33 gain 16 178 -127.18 gain 178 16 -124.81 gain 16 179 -131.61 gain 179 16 -127.63 gain 16 180 -132.64 gain 180 16 -130.13 gain 16 181 -138.70 gain 181 16 -136.25 gain 16 182 -128.95 gain 182 16 -128.89 gain 16 183 -127.13 gain 183 16 -120.46 gain 16 184 -126.87 gain 184 16 -124.99 gain 16 185 -126.81 gain 185 16 -122.41 gain 16 186 -130.44 gain 186 16 -126.32 gain 16 187 -128.74 gain 187 16 -127.16 gain 16 188 -123.85 gain 188 16 -125.53 gain 16 189 -124.94 gain 189 16 -124.14 gain 16 190 -131.93 gain 190 16 -128.14 gain 16 191 -137.18 gain 191 16 -134.48 gain 16 192 -131.73 gain 192 16 -131.90 gain 16 193 -125.62 gain 193 16 -127.04 gain 16 194 -134.79 gain 194 16 -130.03 gain 16 195 -136.71 gain 195 16 -132.58 gain 16 196 -120.73 gain 196 16 -120.63 gain 16 197 -120.74 gain 197 16 -116.70 gain 16 198 -128.63 gain 198 16 -124.11 gain 16 199 -130.65 gain 199 16 -130.06 gain 16 200 -129.57 gain 200 16 -125.91 gain 16 201 -128.32 gain 201 16 -125.47 gain 16 202 -137.20 gain 202 16 -138.35 gain 16 203 -133.15 gain 203 16 -133.92 gain 16 204 -130.26 gain 204 16 -128.31 gain 16 205 -134.28 gain 205 16 -131.41 gain 16 206 -126.75 gain 206 16 -128.39 gain 16 207 -118.37 gain 207 16 -112.38 gain 16 208 -131.24 gain 208 16 -131.03 gain 16 209 -136.81 gain 209 16 -137.59 gain 16 210 -133.04 gain 210 16 -130.76 gain 16 211 -130.92 gain 211 16 -130.65 gain 16 212 -125.91 gain 212 16 -124.19 gain 16 213 -125.00 gain 213 16 -122.47 gain 16 214 -137.45 gain 214 16 -134.81 gain 16 215 -134.61 gain 215 16 -128.38 gain 16 216 -135.10 gain 216 16 -133.53 gain 16 217 -119.02 gain 217 16 -117.98 gain 16 218 -129.30 gain 218 16 -130.45 gain 16 219 -132.96 gain 219 16 -125.46 gain 16 220 -136.69 gain 220 16 -139.69 gain 16 221 -133.27 gain 221 16 -131.91 gain 16 222 -131.53 gain 222 16 -130.50 gain 16 223 -135.47 gain 223 16 -133.04 gain 16 224 -137.55 gain 224 16 -137.81 gain 17 18 -91.72 gain 18 17 -91.56 gain 17 19 -97.82 gain 19 17 -100.66 gain 17 20 -104.84 gain 20 17 -109.11 gain 17 21 -112.44 gain 21 17 -114.64 gain 17 22 -110.71 gain 22 17 -111.50 gain 17 23 -111.88 gain 23 17 -116.94 gain 17 24 -118.63 gain 24 17 -118.11 gain 17 25 -122.66 gain 25 17 -128.89 gain 17 26 -116.93 gain 26 17 -117.04 gain 17 27 -132.36 gain 27 17 -128.36 gain 17 28 -117.96 gain 28 17 -116.66 gain 17 29 -115.49 gain 29 17 -116.07 gain 17 30 -101.01 gain 30 17 -105.06 gain 17 31 -98.38 gain 31 17 -100.05 gain 17 32 -93.45 gain 32 17 -95.14 gain 17 33 -91.37 gain 33 17 -95.31 gain 17 34 -101.34 gain 34 17 -103.89 gain 17 35 -102.86 gain 35 17 -105.23 gain 17 36 -111.08 gain 36 17 -117.24 gain 17 37 -114.26 gain 37 17 -112.61 gain 17 38 -103.22 gain 38 17 -107.60 gain 17 39 -110.14 gain 39 17 -113.38 gain 17 40 -115.27 gain 40 17 -120.56 gain 17 41 -119.59 gain 41 17 -120.51 gain 17 42 -120.21 gain 42 17 -119.28 gain 17 43 -123.42 gain 43 17 -126.37 gain 17 44 -126.66 gain 44 17 -132.68 gain 17 45 -104.32 gain 45 17 -108.81 gain 17 46 -102.68 gain 46 17 -102.97 gain 17 47 -103.60 gain 47 17 -104.94 gain 17 48 -108.88 gain 48 17 -108.01 gain 17 49 -102.94 gain 49 17 -110.05 gain 17 50 -108.11 gain 50 17 -116.18 gain 17 51 -113.64 gain 51 17 -116.85 gain 17 52 -113.65 gain 52 17 -112.88 gain 17 53 -123.49 gain 53 17 -123.73 gain 17 54 -115.75 gain 54 17 -116.70 gain 17 55 -116.62 gain 55 17 -116.86 gain 17 56 -121.20 gain 56 17 -128.77 gain 17 57 -118.98 gain 57 17 -120.43 gain 17 58 -118.24 gain 58 17 -122.43 gain 17 59 -129.87 gain 59 17 -130.18 gain 17 60 -110.03 gain 60 17 -111.66 gain 17 61 -112.73 gain 61 17 -113.12 gain 17 62 -106.43 gain 62 17 -112.03 gain 17 63 -106.73 gain 63 17 -105.56 gain 17 64 -111.96 gain 64 17 -113.76 gain 17 65 -109.26 gain 65 17 -113.15 gain 17 66 -119.56 gain 66 17 -117.71 gain 17 67 -122.95 gain 67 17 -123.37 gain 17 68 -108.70 gain 68 17 -113.68 gain 17 69 -118.34 gain 69 17 -120.61 gain 17 70 -119.93 gain 70 17 -121.96 gain 17 71 -117.59 gain 71 17 -117.73 gain 17 72 -125.99 gain 72 17 -126.54 gain 17 73 -126.23 gain 73 17 -125.17 gain 17 74 -122.14 gain 74 17 -124.96 gain 17 75 -110.76 gain 75 17 -113.72 gain 17 76 -110.43 gain 76 17 -109.34 gain 17 77 -112.84 gain 77 17 -115.42 gain 17 78 -107.40 gain 78 17 -112.82 gain 17 79 -113.71 gain 79 17 -113.91 gain 17 80 -115.38 gain 80 17 -116.09 gain 17 81 -113.25 gain 81 17 -114.54 gain 17 82 -116.30 gain 82 17 -115.22 gain 17 83 -122.97 gain 83 17 -122.93 gain 17 84 -117.27 gain 84 17 -117.37 gain 17 85 -130.89 gain 85 17 -127.81 gain 17 86 -120.18 gain 86 17 -120.47 gain 17 87 -123.88 gain 87 17 -128.13 gain 17 88 -115.21 gain 88 17 -117.22 gain 17 89 -121.42 gain 89 17 -122.02 gain 17 90 -107.71 gain 90 17 -105.32 gain 17 91 -113.03 gain 91 17 -114.60 gain 17 92 -115.31 gain 92 17 -113.84 gain 17 93 -114.32 gain 93 17 -117.63 gain 17 94 -113.57 gain 94 17 -116.76 gain 17 95 -112.42 gain 95 17 -117.86 gain 17 96 -117.89 gain 96 17 -120.67 gain 17 97 -116.86 gain 97 17 -118.38 gain 17 98 -113.18 gain 98 17 -115.50 gain 17 99 -122.99 gain 99 17 -123.13 gain 17 100 -123.48 gain 100 17 -123.18 gain 17 101 -122.23 gain 101 17 -122.09 gain 17 102 -123.41 gain 102 17 -124.06 gain 17 103 -126.88 gain 103 17 -125.01 gain 17 104 -125.17 gain 104 17 -128.68 gain 17 105 -111.83 gain 105 17 -111.28 gain 17 106 -111.60 gain 106 17 -112.13 gain 17 107 -118.33 gain 107 17 -125.43 gain 17 108 -112.21 gain 108 17 -111.63 gain 17 109 -113.88 gain 109 17 -116.79 gain 17 110 -117.04 gain 110 17 -118.41 gain 17 111 -117.72 gain 111 17 -118.77 gain 17 112 -116.85 gain 112 17 -116.78 gain 17 113 -122.76 gain 113 17 -121.50 gain 17 114 -119.90 gain 114 17 -121.95 gain 17 115 -120.60 gain 115 17 -116.95 gain 17 116 -109.82 gain 116 17 -113.71 gain 17 117 -129.18 gain 117 17 -134.57 gain 17 118 -126.18 gain 118 17 -129.89 gain 17 119 -127.15 gain 119 17 -125.52 gain 17 120 -116.79 gain 120 17 -119.68 gain 17 121 -116.42 gain 121 17 -118.60 gain 17 122 -113.84 gain 122 17 -118.13 gain 17 123 -122.80 gain 123 17 -127.87 gain 17 124 -122.42 gain 124 17 -123.90 gain 17 125 -117.01 gain 125 17 -119.82 gain 17 126 -125.41 gain 126 17 -126.18 gain 17 127 -108.74 gain 127 17 -112.98 gain 17 128 -119.62 gain 128 17 -121.79 gain 17 129 -127.71 gain 129 17 -127.79 gain 17 130 -115.26 gain 130 17 -113.17 gain 17 131 -123.78 gain 131 17 -128.77 gain 17 132 -124.48 gain 132 17 -129.09 gain 17 133 -123.96 gain 133 17 -126.64 gain 17 134 -128.68 gain 134 17 -128.07 gain 17 135 -123.43 gain 135 17 -126.39 gain 17 136 -118.88 gain 136 17 -122.45 gain 17 137 -118.90 gain 137 17 -119.95 gain 17 138 -122.84 gain 138 17 -122.89 gain 17 139 -121.80 gain 139 17 -122.83 gain 17 140 -117.78 gain 140 17 -121.42 gain 17 141 -117.93 gain 141 17 -120.25 gain 17 142 -121.02 gain 142 17 -122.64 gain 17 143 -120.63 gain 143 17 -121.87 gain 17 144 -125.45 gain 144 17 -127.71 gain 17 145 -127.04 gain 145 17 -127.74 gain 17 146 -123.62 gain 146 17 -123.24 gain 17 147 -124.27 gain 147 17 -120.98 gain 17 148 -124.77 gain 148 17 -121.19 gain 17 149 -126.02 gain 149 17 -125.61 gain 17 150 -115.40 gain 150 17 -117.68 gain 17 151 -130.11 gain 151 17 -132.58 gain 17 152 -127.22 gain 152 17 -126.67 gain 17 153 -121.79 gain 153 17 -118.81 gain 17 154 -127.26 gain 154 17 -132.83 gain 17 155 -123.78 gain 155 17 -129.25 gain 17 156 -119.48 gain 156 17 -119.34 gain 17 157 -120.31 gain 157 17 -123.11 gain 17 158 -122.33 gain 158 17 -127.73 gain 17 159 -122.85 gain 159 17 -124.86 gain 17 160 -126.04 gain 160 17 -125.16 gain 17 161 -127.45 gain 161 17 -130.07 gain 17 162 -127.21 gain 162 17 -128.69 gain 17 163 -127.43 gain 163 17 -131.06 gain 17 164 -130.85 gain 164 17 -135.53 gain 17 165 -119.00 gain 165 17 -119.71 gain 17 166 -123.03 gain 166 17 -125.31 gain 17 167 -120.56 gain 167 17 -124.94 gain 17 168 -128.02 gain 168 17 -130.84 gain 17 169 -122.61 gain 169 17 -129.63 gain 17 170 -118.74 gain 170 17 -117.29 gain 17 171 -127.24 gain 171 17 -130.82 gain 17 172 -130.31 gain 172 17 -128.58 gain 17 173 -121.29 gain 173 17 -118.99 gain 17 174 -117.22 gain 174 17 -119.22 gain 17 175 -121.93 gain 175 17 -127.48 gain 17 176 -121.74 gain 176 17 -119.30 gain 17 177 -121.89 gain 177 17 -127.26 gain 17 178 -125.62 gain 178 17 -126.83 gain 17 179 -130.18 gain 179 17 -129.77 gain 17 180 -127.41 gain 180 17 -128.48 gain 17 181 -126.27 gain 181 17 -127.40 gain 17 182 -122.74 gain 182 17 -126.26 gain 17 183 -124.46 gain 183 17 -121.37 gain 17 184 -122.40 gain 184 17 -124.08 gain 17 185 -116.00 gain 185 17 -115.17 gain 17 186 -120.78 gain 186 17 -120.24 gain 17 187 -124.54 gain 187 17 -126.53 gain 17 188 -128.14 gain 188 17 -133.39 gain 17 189 -128.81 gain 189 17 -131.59 gain 17 190 -134.65 gain 190 17 -134.44 gain 17 191 -122.71 gain 191 17 -123.59 gain 17 192 -127.84 gain 192 17 -131.58 gain 17 193 -124.80 gain 193 17 -129.79 gain 17 194 -123.07 gain 194 17 -121.87 gain 17 195 -125.42 gain 195 17 -124.86 gain 17 196 -124.84 gain 196 17 -128.32 gain 17 197 -120.68 gain 197 17 -120.22 gain 17 198 -128.56 gain 198 17 -127.63 gain 17 199 -119.75 gain 199 17 -122.73 gain 17 200 -121.46 gain 200 17 -121.38 gain 17 201 -125.07 gain 201 17 -125.79 gain 17 202 -131.15 gain 202 17 -135.87 gain 17 203 -128.54 gain 203 17 -132.88 gain 17 204 -126.68 gain 204 17 -128.30 gain 17 205 -128.43 gain 205 17 -129.13 gain 17 206 -130.79 gain 206 17 -136.01 gain 17 207 -135.76 gain 207 17 -133.34 gain 17 208 -129.06 gain 208 17 -132.42 gain 17 209 -130.29 gain 209 17 -134.64 gain 17 210 -118.40 gain 210 17 -119.68 gain 17 211 -130.56 gain 211 17 -133.87 gain 17 212 -124.62 gain 212 17 -126.47 gain 17 213 -126.96 gain 213 17 -128.00 gain 17 214 -123.54 gain 214 17 -124.47 gain 17 215 -122.57 gain 215 17 -119.92 gain 17 216 -126.63 gain 216 17 -128.64 gain 17 217 -124.18 gain 217 17 -126.71 gain 17 218 -125.19 gain 218 17 -129.91 gain 17 219 -127.20 gain 219 17 -123.27 gain 17 220 -131.87 gain 220 17 -138.44 gain 17 221 -126.43 gain 221 17 -128.64 gain 17 222 -124.72 gain 222 17 -127.25 gain 17 223 -132.56 gain 223 17 -133.71 gain 17 224 -125.57 gain 224 17 -129.41 gain 18 19 -85.91 gain 19 18 -88.91 gain 18 20 -98.36 gain 20 18 -102.79 gain 18 21 -98.62 gain 21 18 -100.98 gain 18 22 -107.27 gain 22 18 -108.22 gain 18 23 -112.96 gain 23 18 -118.18 gain 18 24 -124.42 gain 24 18 -124.05 gain 18 25 -117.40 gain 25 18 -123.79 gain 18 26 -118.52 gain 26 18 -118.80 gain 18 27 -118.46 gain 27 18 -114.63 gain 18 28 -122.90 gain 28 18 -121.76 gain 18 29 -125.97 gain 29 18 -126.71 gain 18 30 -108.36 gain 30 18 -112.56 gain 18 31 -103.73 gain 31 18 -105.56 gain 18 32 -96.39 gain 32 18 -98.25 gain 18 33 -95.51 gain 33 18 -99.61 gain 18 34 -95.81 gain 34 18 -98.52 gain 18 35 -101.95 gain 35 18 -104.48 gain 18 36 -106.85 gain 36 18 -113.17 gain 18 37 -112.73 gain 37 18 -111.25 gain 18 38 -116.52 gain 38 18 -121.05 gain 18 39 -106.90 gain 39 18 -110.30 gain 18 40 -116.04 gain 40 18 -121.49 gain 18 41 -120.83 gain 41 18 -121.91 gain 18 42 -116.63 gain 42 18 -115.86 gain 18 43 -112.12 gain 43 18 -115.24 gain 18 44 -122.33 gain 44 18 -128.51 gain 18 45 -105.73 gain 45 18 -110.38 gain 18 46 -105.33 gain 46 18 -105.78 gain 18 47 -104.88 gain 47 18 -106.38 gain 18 48 -103.75 gain 48 18 -103.04 gain 18 49 -102.56 gain 49 18 -109.82 gain 18 50 -111.81 gain 50 18 -120.04 gain 18 51 -107.85 gain 51 18 -111.22 gain 18 52 -115.71 gain 52 18 -115.10 gain 18 53 -109.15 gain 53 18 -109.56 gain 18 54 -115.39 gain 54 18 -116.50 gain 18 55 -115.91 gain 55 18 -116.32 gain 18 56 -123.32 gain 56 18 -131.05 gain 18 57 -122.64 gain 57 18 -124.25 gain 18 58 -121.28 gain 58 18 -125.63 gain 18 59 -125.02 gain 59 18 -125.49 gain 18 60 -112.70 gain 60 18 -114.49 gain 18 61 -107.16 gain 61 18 -107.70 gain 18 62 -103.03 gain 62 18 -108.79 gain 18 63 -109.31 gain 63 18 -108.30 gain 18 64 -110.87 gain 64 18 -112.83 gain 18 65 -111.27 gain 65 18 -115.32 gain 18 66 -112.62 gain 66 18 -110.93 gain 18 67 -113.41 gain 67 18 -113.99 gain 18 68 -120.52 gain 68 18 -125.65 gain 18 69 -122.95 gain 69 18 -125.38 gain 18 70 -119.25 gain 70 18 -121.44 gain 18 71 -122.68 gain 71 18 -122.98 gain 18 72 -126.84 gain 72 18 -127.55 gain 18 73 -126.93 gain 73 18 -126.03 gain 18 74 -120.45 gain 74 18 -123.43 gain 18 75 -109.18 gain 75 18 -112.30 gain 18 76 -112.92 gain 76 18 -111.99 gain 18 77 -115.19 gain 77 18 -117.93 gain 18 78 -101.16 gain 78 18 -106.74 gain 18 79 -110.90 gain 79 18 -111.27 gain 18 80 -117.56 gain 80 18 -118.43 gain 18 81 -108.66 gain 81 18 -110.12 gain 18 82 -114.77 gain 82 18 -113.86 gain 18 83 -109.30 gain 83 18 -109.41 gain 18 84 -120.63 gain 84 18 -120.90 gain 18 85 -116.23 gain 85 18 -113.30 gain 18 86 -117.44 gain 86 18 -117.89 gain 18 87 -123.81 gain 87 18 -128.22 gain 18 88 -130.27 gain 88 18 -132.44 gain 18 89 -124.93 gain 89 18 -125.70 gain 18 90 -117.93 gain 90 18 -115.70 gain 18 91 -116.13 gain 91 18 -117.85 gain 18 92 -107.85 gain 92 18 -106.53 gain 18 93 -112.28 gain 93 18 -115.75 gain 18 94 -110.30 gain 94 18 -113.64 gain 18 95 -115.49 gain 95 18 -121.09 gain 18 96 -114.52 gain 96 18 -117.46 gain 18 97 -121.41 gain 97 18 -123.09 gain 18 98 -120.16 gain 98 18 -122.64 gain 18 99 -117.13 gain 99 18 -117.43 gain 18 100 -112.15 gain 100 18 -112.01 gain 18 101 -116.13 gain 101 18 -116.16 gain 18 102 -124.71 gain 102 18 -125.52 gain 18 103 -120.76 gain 103 18 -119.06 gain 18 104 -123.76 gain 104 18 -127.42 gain 18 105 -118.12 gain 105 18 -117.74 gain 18 106 -118.80 gain 106 18 -119.50 gain 18 107 -114.06 gain 107 18 -121.32 gain 18 108 -115.86 gain 108 18 -115.44 gain 18 109 -118.92 gain 109 18 -121.99 gain 18 110 -115.98 gain 110 18 -117.52 gain 18 111 -119.26 gain 111 18 -120.47 gain 18 112 -125.39 gain 112 18 -125.49 gain 18 113 -108.41 gain 113 18 -107.31 gain 18 114 -109.69 gain 114 18 -111.89 gain 18 115 -120.57 gain 115 18 -117.08 gain 18 116 -120.82 gain 116 18 -124.87 gain 18 117 -125.24 gain 117 18 -130.79 gain 18 118 -121.09 gain 118 18 -124.97 gain 18 119 -124.41 gain 119 18 -122.94 gain 18 120 -112.91 gain 120 18 -115.96 gain 18 121 -125.25 gain 121 18 -127.59 gain 18 122 -109.48 gain 122 18 -113.94 gain 18 123 -121.82 gain 123 18 -127.05 gain 18 124 -119.35 gain 124 18 -120.99 gain 18 125 -117.88 gain 125 18 -120.86 gain 18 126 -117.40 gain 126 18 -118.32 gain 18 127 -116.80 gain 127 18 -121.20 gain 18 128 -120.29 gain 128 18 -122.62 gain 18 129 -113.76 gain 129 18 -114.00 gain 18 130 -120.63 gain 130 18 -118.69 gain 18 131 -125.46 gain 131 18 -130.61 gain 18 132 -123.03 gain 132 18 -127.80 gain 18 133 -128.84 gain 133 18 -131.68 gain 18 134 -127.80 gain 134 18 -127.35 gain 18 135 -121.72 gain 135 18 -124.84 gain 18 136 -115.32 gain 136 18 -119.05 gain 18 137 -115.21 gain 137 18 -116.42 gain 18 138 -119.22 gain 138 18 -119.43 gain 18 139 -121.04 gain 139 18 -122.24 gain 18 140 -119.37 gain 140 18 -123.17 gain 18 141 -119.30 gain 141 18 -121.77 gain 18 142 -118.10 gain 142 18 -119.88 gain 18 143 -121.33 gain 143 18 -122.73 gain 18 144 -122.16 gain 144 18 -124.57 gain 18 145 -120.27 gain 145 18 -121.13 gain 18 146 -132.37 gain 146 18 -132.14 gain 18 147 -125.50 gain 147 18 -122.36 gain 18 148 -128.25 gain 148 18 -124.83 gain 18 149 -132.03 gain 149 18 -131.78 gain 18 150 -123.96 gain 150 18 -126.39 gain 18 151 -122.76 gain 151 18 -125.39 gain 18 152 -128.33 gain 152 18 -127.94 gain 18 153 -114.44 gain 153 18 -111.63 gain 18 154 -121.47 gain 154 18 -127.20 gain 18 155 -127.40 gain 155 18 -133.03 gain 18 156 -118.03 gain 156 18 -118.05 gain 18 157 -124.36 gain 157 18 -127.32 gain 18 158 -119.15 gain 158 18 -124.70 gain 18 159 -125.20 gain 159 18 -127.38 gain 18 160 -126.79 gain 160 18 -126.08 gain 18 161 -127.77 gain 161 18 -130.54 gain 18 162 -127.62 gain 162 18 -129.26 gain 18 163 -132.68 gain 163 18 -136.47 gain 18 164 -122.58 gain 164 18 -127.41 gain 18 165 -123.23 gain 165 18 -124.11 gain 18 166 -118.21 gain 166 18 -120.65 gain 18 167 -122.09 gain 167 18 -126.62 gain 18 168 -126.90 gain 168 18 -129.88 gain 18 169 -124.64 gain 169 18 -131.82 gain 18 170 -118.41 gain 170 18 -117.12 gain 18 171 -117.72 gain 171 18 -121.46 gain 18 172 -124.21 gain 172 18 -122.63 gain 18 173 -122.87 gain 173 18 -120.74 gain 18 174 -129.78 gain 174 18 -131.94 gain 18 175 -121.69 gain 175 18 -127.40 gain 18 176 -132.93 gain 176 18 -130.66 gain 18 177 -125.00 gain 177 18 -130.54 gain 18 178 -123.11 gain 178 18 -124.47 gain 18 179 -127.13 gain 179 18 -126.88 gain 18 180 -124.31 gain 180 18 -125.53 gain 18 181 -123.64 gain 181 18 -124.93 gain 18 182 -118.05 gain 182 18 -121.73 gain 18 183 -125.15 gain 183 18 -122.22 gain 18 184 -126.98 gain 184 18 -128.83 gain 18 185 -121.33 gain 185 18 -120.67 gain 18 186 -124.35 gain 186 18 -123.97 gain 18 187 -120.86 gain 187 18 -123.02 gain 18 188 -124.95 gain 188 18 -130.37 gain 18 189 -125.63 gain 189 18 -128.56 gain 18 190 -121.69 gain 190 18 -121.63 gain 18 191 -124.17 gain 191 18 -125.20 gain 18 192 -127.64 gain 192 18 -131.54 gain 18 193 -114.96 gain 193 18 -120.11 gain 18 194 -130.71 gain 194 18 -129.67 gain 18 195 -126.57 gain 195 18 -126.17 gain 18 196 -129.88 gain 196 18 -133.51 gain 18 197 -125.23 gain 197 18 -124.93 gain 18 198 -126.42 gain 198 18 -125.64 gain 18 199 -125.58 gain 199 18 -128.71 gain 18 200 -125.56 gain 200 18 -125.64 gain 18 201 -131.72 gain 201 18 -132.60 gain 18 202 -125.18 gain 202 18 -130.06 gain 18 203 -123.77 gain 203 18 -128.28 gain 18 204 -129.08 gain 204 18 -130.86 gain 18 205 -128.74 gain 205 18 -129.60 gain 18 206 -127.46 gain 206 18 -132.84 gain 18 207 -125.47 gain 207 18 -123.21 gain 18 208 -131.41 gain 208 18 -134.92 gain 18 209 -132.47 gain 209 18 -136.98 gain 18 210 -126.98 gain 210 18 -128.43 gain 18 211 -124.18 gain 211 18 -127.65 gain 18 212 -130.96 gain 212 18 -132.98 gain 18 213 -132.37 gain 213 18 -133.57 gain 18 214 -123.85 gain 214 18 -124.94 gain 18 215 -121.36 gain 215 18 -118.87 gain 18 216 -118.96 gain 216 18 -121.13 gain 18 217 -127.11 gain 217 18 -129.80 gain 18 218 -131.99 gain 218 18 -136.87 gain 18 219 -130.23 gain 219 18 -126.46 gain 18 220 -123.09 gain 220 18 -129.82 gain 18 221 -126.56 gain 221 18 -128.93 gain 18 222 -131.41 gain 222 18 -134.11 gain 18 223 -124.27 gain 223 18 -125.57 gain 18 224 -129.96 gain 224 18 -133.96 gain 19 20 -100.69 gain 20 19 -102.13 gain 19 21 -104.18 gain 21 19 -103.54 gain 19 22 -109.54 gain 22 19 -107.49 gain 19 23 -112.63 gain 23 19 -114.86 gain 19 24 -112.45 gain 24 19 -109.09 gain 19 25 -116.76 gain 25 19 -120.16 gain 19 26 -118.91 gain 26 19 -116.19 gain 19 27 -127.48 gain 27 19 -120.66 gain 19 28 -119.14 gain 28 19 -115.01 gain 19 29 -126.63 gain 29 19 -124.38 gain 19 30 -113.87 gain 30 19 -115.08 gain 19 31 -109.06 gain 31 19 -107.89 gain 19 32 -108.41 gain 32 19 -107.28 gain 19 33 -94.80 gain 33 19 -95.91 gain 19 34 -95.92 gain 34 19 -95.64 gain 19 35 -99.06 gain 35 19 -98.60 gain 19 36 -108.01 gain 36 19 -111.33 gain 19 37 -110.02 gain 37 19 -105.55 gain 19 38 -111.33 gain 38 19 -112.87 gain 19 39 -121.73 gain 39 19 -122.14 gain 19 40 -118.14 gain 40 19 -120.60 gain 19 41 -117.17 gain 41 19 -115.25 gain 19 42 -117.14 gain 42 19 -113.38 gain 19 43 -120.27 gain 43 19 -120.39 gain 19 44 -125.17 gain 44 19 -128.36 gain 19 45 -122.00 gain 45 19 -123.65 gain 19 46 -107.90 gain 46 19 -105.35 gain 19 47 -106.14 gain 47 19 -104.65 gain 19 48 -104.62 gain 48 19 -100.92 gain 19 49 -110.45 gain 49 19 -114.72 gain 19 50 -106.54 gain 50 19 -111.78 gain 19 51 -101.00 gain 51 19 -101.37 gain 19 52 -115.18 gain 52 19 -111.58 gain 19 53 -108.41 gain 53 19 -105.82 gain 19 54 -114.22 gain 54 19 -112.33 gain 19 55 -122.71 gain 55 19 -120.12 gain 19 56 -125.07 gain 56 19 -129.80 gain 19 57 -124.68 gain 57 19 -123.29 gain 19 58 -120.53 gain 58 19 -121.88 gain 19 59 -124.76 gain 59 19 -122.24 gain 19 60 -116.75 gain 60 19 -115.55 gain 19 61 -113.80 gain 61 19 -111.35 gain 19 62 -119.61 gain 62 19 -122.37 gain 19 63 -111.83 gain 63 19 -107.82 gain 19 64 -112.51 gain 64 19 -111.48 gain 19 65 -108.87 gain 65 19 -109.93 gain 19 66 -107.07 gain 66 19 -102.38 gain 19 67 -108.51 gain 67 19 -106.10 gain 19 68 -114.91 gain 68 19 -117.05 gain 19 69 -120.08 gain 69 19 -119.52 gain 19 70 -122.81 gain 70 19 -122.01 gain 19 71 -122.54 gain 71 19 -119.85 gain 19 72 -117.29 gain 72 19 -115.00 gain 19 73 -122.24 gain 73 19 -118.35 gain 19 74 -131.44 gain 74 19 -131.43 gain 19 75 -120.78 gain 75 19 -120.90 gain 19 76 -115.36 gain 76 19 -111.44 gain 19 77 -116.28 gain 77 19 -116.02 gain 19 78 -108.88 gain 78 19 -111.47 gain 19 79 -115.42 gain 79 19 -112.79 gain 19 80 -113.93 gain 80 19 -111.81 gain 19 81 -111.63 gain 81 19 -110.10 gain 19 82 -122.49 gain 82 19 -118.58 gain 19 83 -117.47 gain 83 19 -114.59 gain 19 84 -119.23 gain 84 19 -116.50 gain 19 85 -121.54 gain 85 19 -115.62 gain 19 86 -125.15 gain 86 19 -122.61 gain 19 87 -124.36 gain 87 19 -125.78 gain 19 88 -127.39 gain 88 19 -126.56 gain 19 89 -131.02 gain 89 19 -128.79 gain 19 90 -122.21 gain 90 19 -117.00 gain 19 91 -118.21 gain 91 19 -116.94 gain 19 92 -116.24 gain 92 19 -111.92 gain 19 93 -119.60 gain 93 19 -120.08 gain 19 94 -118.70 gain 94 19 -119.05 gain 19 95 -111.21 gain 95 19 -113.81 gain 19 96 -115.76 gain 96 19 -115.70 gain 19 97 -119.81 gain 97 19 -118.50 gain 19 98 -114.49 gain 98 19 -113.97 gain 19 99 -125.35 gain 99 19 -122.66 gain 19 100 -118.45 gain 100 19 -115.32 gain 19 101 -121.57 gain 101 19 -118.61 gain 19 102 -123.79 gain 102 19 -121.61 gain 19 103 -128.30 gain 103 19 -123.60 gain 19 104 -124.42 gain 104 19 -125.10 gain 19 105 -114.55 gain 105 19 -111.17 gain 19 106 -122.60 gain 106 19 -120.30 gain 19 107 -126.96 gain 107 19 -131.23 gain 19 108 -113.39 gain 108 19 -109.98 gain 19 109 -116.71 gain 109 19 -116.79 gain 19 110 -111.64 gain 110 19 -110.19 gain 19 111 -123.87 gain 111 19 -122.09 gain 19 112 -121.13 gain 112 19 -118.23 gain 19 113 -117.04 gain 113 19 -112.95 gain 19 114 -121.06 gain 114 19 -120.28 gain 19 115 -119.75 gain 115 19 -113.27 gain 19 116 -126.21 gain 116 19 -127.27 gain 19 117 -127.56 gain 117 19 -130.12 gain 19 118 -122.97 gain 118 19 -123.85 gain 19 119 -129.11 gain 119 19 -124.65 gain 19 120 -122.17 gain 120 19 -122.22 gain 19 121 -122.79 gain 121 19 -122.14 gain 19 122 -122.52 gain 122 19 -123.97 gain 19 123 -120.20 gain 123 19 -122.43 gain 19 124 -127.07 gain 124 19 -125.72 gain 19 125 -119.74 gain 125 19 -119.73 gain 19 126 -122.27 gain 126 19 -120.20 gain 19 127 -120.48 gain 127 19 -121.88 gain 19 128 -127.56 gain 128 19 -126.90 gain 19 129 -128.58 gain 129 19 -125.82 gain 19 130 -125.02 gain 130 19 -120.09 gain 19 131 -124.38 gain 131 19 -126.54 gain 19 132 -128.96 gain 132 19 -130.74 gain 19 133 -134.32 gain 133 19 -134.18 gain 19 134 -123.25 gain 134 19 -119.80 gain 19 135 -117.05 gain 135 19 -117.18 gain 19 136 -120.50 gain 136 19 -121.23 gain 19 137 -121.54 gain 137 19 -119.75 gain 19 138 -119.16 gain 138 19 -116.37 gain 19 139 -119.56 gain 139 19 -117.76 gain 19 140 -122.98 gain 140 19 -123.79 gain 19 141 -128.44 gain 141 19 -127.93 gain 19 142 -124.18 gain 142 19 -122.97 gain 19 143 -121.09 gain 143 19 -119.49 gain 19 144 -116.51 gain 144 19 -115.93 gain 19 145 -123.83 gain 145 19 -121.71 gain 19 146 -124.14 gain 146 19 -120.92 gain 19 147 -126.11 gain 147 19 -119.98 gain 19 148 -123.65 gain 148 19 -117.24 gain 19 149 -127.64 gain 149 19 -124.40 gain 19 150 -125.85 gain 150 19 -125.29 gain 19 151 -120.79 gain 151 19 -120.42 gain 19 152 -130.61 gain 152 19 -127.23 gain 19 153 -126.49 gain 153 19 -120.68 gain 19 154 -119.05 gain 154 19 -121.79 gain 19 155 -119.73 gain 155 19 -122.36 gain 19 156 -121.17 gain 156 19 -118.20 gain 19 157 -128.41 gain 157 19 -128.38 gain 19 158 -125.95 gain 158 19 -128.51 gain 19 159 -127.58 gain 159 19 -126.77 gain 19 160 -131.48 gain 160 19 -127.77 gain 19 161 -121.44 gain 161 19 -121.22 gain 19 162 -127.70 gain 162 19 -126.34 gain 19 163 -134.16 gain 163 19 -134.95 gain 19 164 -128.49 gain 164 19 -130.33 gain 19 165 -124.86 gain 165 19 -122.74 gain 19 166 -123.11 gain 166 19 -122.56 gain 19 167 -128.87 gain 167 19 -130.41 gain 19 168 -125.32 gain 168 19 -125.31 gain 19 169 -127.16 gain 169 19 -131.34 gain 19 170 -119.37 gain 170 19 -115.08 gain 19 171 -120.75 gain 171 19 -121.49 gain 19 172 -122.68 gain 172 19 -118.11 gain 19 173 -124.43 gain 173 19 -119.30 gain 19 174 -125.19 gain 174 19 -124.35 gain 19 175 -123.68 gain 175 19 -126.40 gain 19 176 -125.73 gain 176 19 -120.47 gain 19 177 -128.97 gain 177 19 -131.52 gain 19 178 -127.75 gain 178 19 -126.12 gain 19 179 -124.67 gain 179 19 -121.43 gain 19 180 -128.70 gain 180 19 -126.93 gain 19 181 -126.30 gain 181 19 -124.60 gain 19 182 -134.39 gain 182 19 -135.08 gain 19 183 -128.74 gain 183 19 -122.81 gain 19 184 -121.20 gain 184 19 -120.06 gain 19 185 -125.61 gain 185 19 -121.95 gain 19 186 -124.25 gain 186 19 -120.87 gain 19 187 -128.02 gain 187 19 -127.18 gain 19 188 -128.14 gain 188 19 -130.57 gain 19 189 -117.80 gain 189 19 -117.74 gain 19 190 -131.62 gain 190 19 -128.57 gain 19 191 -121.32 gain 191 19 -119.36 gain 19 192 -132.11 gain 192 19 -133.02 gain 19 193 -125.02 gain 193 19 -127.18 gain 19 194 -131.87 gain 194 19 -127.84 gain 19 195 -127.69 gain 195 19 -124.29 gain 19 196 -128.81 gain 196 19 -129.45 gain 19 197 -118.42 gain 197 19 -115.13 gain 19 198 -125.59 gain 198 19 -121.82 gain 19 199 -126.00 gain 199 19 -126.15 gain 19 200 -126.39 gain 200 19 -123.47 gain 19 201 -125.33 gain 201 19 -123.22 gain 19 202 -123.42 gain 202 19 -125.31 gain 19 203 -118.83 gain 203 19 -120.34 gain 19 204 -128.04 gain 204 19 -126.83 gain 19 205 -129.41 gain 205 19 -127.28 gain 19 206 -131.21 gain 206 19 -133.60 gain 19 207 -123.99 gain 207 19 -118.74 gain 19 208 -124.95 gain 208 19 -125.48 gain 19 209 -129.63 gain 209 19 -131.14 gain 19 210 -130.06 gain 210 19 -128.51 gain 19 211 -124.91 gain 211 19 -125.39 gain 19 212 -134.59 gain 212 19 -133.61 gain 19 213 -128.71 gain 213 19 -126.92 gain 19 214 -128.89 gain 214 19 -126.99 gain 19 215 -129.97 gain 215 19 -124.48 gain 19 216 -133.41 gain 216 19 -132.58 gain 19 217 -127.19 gain 217 19 -126.89 gain 19 218 -123.90 gain 218 19 -125.79 gain 19 219 -125.32 gain 219 19 -118.56 gain 19 220 -127.44 gain 220 19 -131.18 gain 19 221 -129.88 gain 221 19 -129.25 gain 19 222 -126.07 gain 222 19 -125.77 gain 19 223 -136.28 gain 223 19 -134.59 gain 19 224 -134.96 gain 224 19 -135.96 gain 20 21 -96.28 gain 21 20 -94.20 gain 20 22 -97.95 gain 22 20 -94.46 gain 20 23 -113.97 gain 23 20 -114.76 gain 20 24 -112.38 gain 24 20 -107.58 gain 20 25 -116.07 gain 25 20 -118.03 gain 20 26 -121.09 gain 26 20 -116.93 gain 20 27 -120.03 gain 27 20 -111.76 gain 20 28 -123.82 gain 28 20 -118.25 gain 20 29 -129.98 gain 29 20 -126.29 gain 20 30 -117.30 gain 30 20 -117.08 gain 20 31 -112.97 gain 31 20 -110.36 gain 20 32 -111.46 gain 32 20 -108.88 gain 20 33 -105.02 gain 33 20 -104.69 gain 20 34 -96.60 gain 34 20 -94.88 gain 20 35 -91.78 gain 35 20 -89.88 gain 20 36 -105.98 gain 36 20 -107.86 gain 20 37 -108.98 gain 37 20 -103.06 gain 20 38 -109.69 gain 38 20 -109.79 gain 20 39 -110.43 gain 39 20 -109.40 gain 20 40 -117.17 gain 40 20 -118.19 gain 20 41 -119.98 gain 41 20 -116.62 gain 20 42 -122.82 gain 42 20 -117.61 gain 20 43 -128.03 gain 43 20 -126.72 gain 20 44 -126.92 gain 44 20 -128.66 gain 20 45 -121.64 gain 45 20 -121.86 gain 20 46 -112.19 gain 46 20 -108.20 gain 20 47 -113.48 gain 47 20 -110.55 gain 20 48 -107.97 gain 48 20 -102.83 gain 20 49 -107.71 gain 49 20 -110.54 gain 20 50 -102.49 gain 50 20 -106.29 gain 20 51 -103.11 gain 51 20 -102.04 gain 20 52 -100.99 gain 52 20 -95.95 gain 20 53 -114.76 gain 53 20 -110.74 gain 20 54 -117.48 gain 54 20 -114.15 gain 20 55 -120.61 gain 55 20 -116.58 gain 20 56 -132.11 gain 56 20 -135.41 gain 20 57 -115.13 gain 57 20 -112.30 gain 20 58 -125.92 gain 58 20 -125.83 gain 20 59 -125.23 gain 59 20 -121.27 gain 20 60 -123.87 gain 60 20 -121.23 gain 20 61 -122.70 gain 61 20 -118.81 gain 20 62 -111.55 gain 62 20 -112.88 gain 20 63 -111.19 gain 63 20 -105.75 gain 20 64 -108.87 gain 64 20 -106.40 gain 20 65 -116.24 gain 65 20 -115.86 gain 20 66 -108.99 gain 66 20 -102.87 gain 20 67 -113.68 gain 67 20 -109.83 gain 20 68 -116.22 gain 68 20 -116.93 gain 20 69 -118.88 gain 69 20 -116.88 gain 20 70 -116.44 gain 70 20 -114.20 gain 20 71 -120.21 gain 71 20 -116.07 gain 20 72 -123.32 gain 72 20 -119.59 gain 20 73 -123.38 gain 73 20 -118.05 gain 20 74 -127.94 gain 74 20 -126.48 gain 20 75 -120.26 gain 75 20 -118.95 gain 20 76 -119.84 gain 76 20 -114.47 gain 20 77 -122.43 gain 77 20 -120.73 gain 20 78 -117.69 gain 78 20 -118.85 gain 20 79 -109.82 gain 79 20 -105.75 gain 20 80 -107.44 gain 80 20 -103.88 gain 20 81 -115.39 gain 81 20 -112.42 gain 20 82 -116.53 gain 82 20 -111.18 gain 20 83 -122.40 gain 83 20 -118.09 gain 20 84 -120.17 gain 84 20 -116.01 gain 20 85 -119.95 gain 85 20 -112.59 gain 20 86 -120.82 gain 86 20 -116.84 gain 20 87 -124.82 gain 87 20 -124.80 gain 20 88 -127.34 gain 88 20 -125.08 gain 20 89 -125.46 gain 89 20 -121.79 gain 20 90 -129.53 gain 90 20 -122.88 gain 20 91 -120.04 gain 91 20 -117.33 gain 20 92 -113.72 gain 92 20 -107.97 gain 20 93 -118.31 gain 93 20 -117.34 gain 20 94 -123.32 gain 94 20 -122.23 gain 20 95 -116.08 gain 95 20 -117.24 gain 20 96 -118.32 gain 96 20 -116.82 gain 20 97 -113.87 gain 97 20 -111.12 gain 20 98 -115.70 gain 98 20 -113.75 gain 20 99 -118.33 gain 99 20 -114.19 gain 20 100 -116.51 gain 100 20 -111.94 gain 20 101 -123.20 gain 101 20 -118.80 gain 20 102 -122.78 gain 102 20 -119.15 gain 20 103 -126.43 gain 103 20 -120.29 gain 20 104 -122.92 gain 104 20 -122.16 gain 20 105 -119.51 gain 105 20 -114.69 gain 20 106 -124.34 gain 106 20 -120.60 gain 20 107 -124.92 gain 107 20 -127.74 gain 20 108 -126.69 gain 108 20 -121.84 gain 20 109 -118.62 gain 109 20 -117.26 gain 20 110 -118.92 gain 110 20 -116.02 gain 20 111 -117.13 gain 111 20 -113.92 gain 20 112 -118.62 gain 112 20 -114.28 gain 20 113 -115.50 gain 113 20 -109.97 gain 20 114 -121.55 gain 114 20 -119.33 gain 20 115 -122.30 gain 115 20 -114.37 gain 20 116 -127.87 gain 116 20 -127.48 gain 20 117 -129.17 gain 117 20 -130.29 gain 20 118 -130.37 gain 118 20 -129.81 gain 20 119 -125.14 gain 119 20 -119.24 gain 20 120 -130.28 gain 120 20 -128.90 gain 20 121 -123.52 gain 121 20 -121.42 gain 20 122 -122.33 gain 122 20 -122.35 gain 20 123 -122.73 gain 123 20 -123.53 gain 20 124 -121.17 gain 124 20 -118.38 gain 20 125 -124.40 gain 125 20 -122.94 gain 20 126 -123.92 gain 126 20 -120.42 gain 20 127 -126.63 gain 127 20 -126.59 gain 20 128 -124.96 gain 128 20 -122.86 gain 20 129 -121.81 gain 129 20 -117.62 gain 20 130 -127.72 gain 130 20 -121.35 gain 20 131 -119.82 gain 131 20 -120.54 gain 20 132 -124.35 gain 132 20 -124.69 gain 20 133 -121.69 gain 133 20 -120.10 gain 20 134 -131.43 gain 134 20 -126.54 gain 20 135 -127.36 gain 135 20 -126.04 gain 20 136 -128.67 gain 136 20 -127.96 gain 20 137 -120.10 gain 137 20 -116.88 gain 20 138 -125.65 gain 138 20 -121.43 gain 20 139 -121.62 gain 139 20 -118.38 gain 20 140 -117.28 gain 140 20 -116.65 gain 20 141 -115.24 gain 141 20 -113.28 gain 20 142 -128.11 gain 142 20 -125.46 gain 20 143 -129.46 gain 143 20 -126.43 gain 20 144 -130.83 gain 144 20 -128.81 gain 20 145 -126.22 gain 145 20 -122.65 gain 20 146 -130.50 gain 146 20 -125.84 gain 20 147 -130.21 gain 147 20 -122.64 gain 20 148 -130.02 gain 148 20 -122.17 gain 20 149 -127.09 gain 149 20 -122.40 gain 20 150 -122.68 gain 150 20 -120.69 gain 20 151 -124.09 gain 151 20 -122.29 gain 20 152 -122.90 gain 152 20 -118.08 gain 20 153 -128.30 gain 153 20 -121.05 gain 20 154 -122.58 gain 154 20 -123.88 gain 20 155 -128.16 gain 155 20 -129.36 gain 20 156 -121.05 gain 156 20 -116.64 gain 20 157 -125.62 gain 157 20 -124.16 gain 20 158 -124.08 gain 158 20 -125.21 gain 20 159 -127.43 gain 159 20 -125.18 gain 20 160 -126.01 gain 160 20 -120.87 gain 20 161 -128.71 gain 161 20 -127.06 gain 20 162 -130.78 gain 162 20 -127.99 gain 20 163 -126.64 gain 163 20 -126.00 gain 20 164 -132.13 gain 164 20 -132.53 gain 20 165 -126.67 gain 165 20 -123.11 gain 20 166 -124.83 gain 166 20 -122.84 gain 20 167 -125.00 gain 167 20 -125.10 gain 20 168 -127.86 gain 168 20 -126.41 gain 20 169 -127.31 gain 169 20 -130.06 gain 20 170 -131.20 gain 170 20 -125.47 gain 20 171 -122.40 gain 171 20 -121.70 gain 20 172 -131.63 gain 172 20 -125.62 gain 20 173 -124.01 gain 173 20 -117.44 gain 20 174 -128.65 gain 174 20 -126.38 gain 20 175 -124.27 gain 175 20 -125.55 gain 20 176 -126.78 gain 176 20 -120.07 gain 20 177 -128.35 gain 177 20 -129.45 gain 20 178 -127.56 gain 178 20 -124.49 gain 20 179 -128.93 gain 179 20 -124.25 gain 20 180 -129.63 gain 180 20 -126.42 gain 20 181 -127.82 gain 181 20 -124.68 gain 20 182 -124.80 gain 182 20 -124.05 gain 20 183 -125.43 gain 183 20 -118.07 gain 20 184 -135.20 gain 184 20 -132.61 gain 20 185 -130.97 gain 185 20 -125.87 gain 20 186 -131.59 gain 186 20 -126.78 gain 20 187 -126.70 gain 187 20 -124.43 gain 20 188 -123.08 gain 188 20 -124.07 gain 20 189 -130.17 gain 189 20 -128.67 gain 20 190 -133.50 gain 190 20 -129.02 gain 20 191 -132.51 gain 191 20 -129.11 gain 20 192 -127.14 gain 192 20 -126.61 gain 20 193 -132.96 gain 193 20 -133.68 gain 20 194 -128.28 gain 194 20 -122.81 gain 20 195 -125.81 gain 195 20 -120.98 gain 20 196 -122.38 gain 196 20 -121.58 gain 20 197 -131.12 gain 197 20 -126.39 gain 20 198 -128.29 gain 198 20 -123.08 gain 20 199 -122.27 gain 199 20 -120.97 gain 20 200 -126.14 gain 200 20 -121.78 gain 20 201 -126.64 gain 201 20 -123.08 gain 20 202 -130.96 gain 202 20 -131.41 gain 20 203 -126.57 gain 203 20 -126.64 gain 20 204 -131.06 gain 204 20 -128.41 gain 20 205 -129.92 gain 205 20 -126.35 gain 20 206 -129.41 gain 206 20 -130.36 gain 20 207 -129.07 gain 207 20 -122.38 gain 20 208 -138.08 gain 208 20 -137.17 gain 20 209 -128.50 gain 209 20 -128.57 gain 20 210 -131.20 gain 210 20 -128.22 gain 20 211 -131.62 gain 211 20 -130.66 gain 20 212 -127.09 gain 212 20 -124.67 gain 20 213 -135.46 gain 213 20 -132.23 gain 20 214 -139.46 gain 214 20 -136.12 gain 20 215 -131.65 gain 215 20 -124.73 gain 20 216 -132.40 gain 216 20 -130.13 gain 20 217 -131.10 gain 217 20 -129.36 gain 20 218 -134.30 gain 218 20 -134.75 gain 20 219 -132.08 gain 219 20 -123.89 gain 20 220 -132.27 gain 220 20 -134.57 gain 20 221 -129.72 gain 221 20 -127.65 gain 20 222 -134.64 gain 222 20 -132.91 gain 20 223 -136.26 gain 223 20 -133.13 gain 20 224 -137.99 gain 224 20 -137.55 gain 21 22 -94.45 gain 22 21 -93.04 gain 21 23 -100.16 gain 23 21 -103.03 gain 21 24 -112.76 gain 24 21 -110.03 gain 21 25 -111.56 gain 25 21 -115.59 gain 21 26 -112.59 gain 26 21 -110.50 gain 21 27 -112.65 gain 27 21 -106.47 gain 21 28 -118.58 gain 28 21 -115.09 gain 21 29 -123.94 gain 29 21 -122.32 gain 21 30 -117.01 gain 30 21 -118.86 gain 21 31 -114.59 gain 31 21 -114.05 gain 21 32 -118.72 gain 32 21 -118.22 gain 21 33 -109.24 gain 33 21 -110.99 gain 21 34 -108.33 gain 34 21 -108.69 gain 21 35 -100.01 gain 35 21 -100.19 gain 21 36 -93.79 gain 36 21 -97.75 gain 21 37 -96.96 gain 37 21 -93.12 gain 21 38 -102.93 gain 38 21 -105.10 gain 21 39 -110.53 gain 39 21 -111.58 gain 21 40 -112.74 gain 40 21 -115.83 gain 21 41 -119.70 gain 41 21 -118.42 gain 21 42 -121.91 gain 42 21 -118.78 gain 21 43 -122.97 gain 43 21 -123.72 gain 21 44 -118.37 gain 44 21 -122.19 gain 21 45 -114.74 gain 45 21 -117.04 gain 21 46 -108.03 gain 46 21 -106.12 gain 21 47 -116.84 gain 47 21 -115.99 gain 21 48 -108.66 gain 48 21 -105.59 gain 21 49 -111.90 gain 49 21 -116.81 gain 21 50 -105.97 gain 50 21 -111.85 gain 21 51 -100.63 gain 51 21 -101.64 gain 21 52 -105.82 gain 52 21 -102.85 gain 21 53 -116.20 gain 53 21 -114.25 gain 21 54 -111.39 gain 54 21 -110.14 gain 21 55 -120.85 gain 55 21 -118.89 gain 21 56 -112.90 gain 56 21 -118.27 gain 21 57 -114.86 gain 57 21 -114.11 gain 21 58 -118.93 gain 58 21 -120.91 gain 21 59 -121.02 gain 59 21 -119.13 gain 21 60 -120.23 gain 60 21 -119.67 gain 21 61 -116.70 gain 61 21 -114.89 gain 21 62 -114.36 gain 62 21 -117.76 gain 21 63 -115.88 gain 63 21 -112.51 gain 21 64 -115.05 gain 64 21 -114.65 gain 21 65 -105.26 gain 65 21 -106.96 gain 21 66 -108.00 gain 66 21 -103.95 gain 21 67 -113.37 gain 67 21 -111.60 gain 21 68 -116.30 gain 68 21 -119.08 gain 21 69 -112.53 gain 69 21 -112.60 gain 21 70 -108.86 gain 70 21 -108.70 gain 21 71 -112.01 gain 71 21 -109.95 gain 21 72 -118.42 gain 72 21 -116.77 gain 21 73 -118.79 gain 73 21 -115.53 gain 21 74 -128.12 gain 74 21 -128.75 gain 21 75 -123.93 gain 75 21 -124.69 gain 21 76 -125.91 gain 76 21 -122.62 gain 21 77 -117.11 gain 77 21 -117.49 gain 21 78 -122.48 gain 78 21 -125.71 gain 21 79 -115.96 gain 79 21 -113.97 gain 21 80 -114.21 gain 80 21 -112.72 gain 21 81 -114.92 gain 81 21 -114.02 gain 21 82 -114.67 gain 82 21 -111.39 gain 21 83 -115.92 gain 83 21 -113.68 gain 21 84 -117.50 gain 84 21 -115.41 gain 21 85 -117.46 gain 85 21 -112.18 gain 21 86 -113.43 gain 86 21 -111.53 gain 21 87 -115.70 gain 87 21 -117.76 gain 21 88 -119.73 gain 88 21 -119.54 gain 21 89 -121.47 gain 89 21 -119.88 gain 21 90 -115.18 gain 90 21 -110.60 gain 21 91 -118.21 gain 91 21 -117.58 gain 21 92 -121.27 gain 92 21 -117.60 gain 21 93 -116.69 gain 93 21 -117.80 gain 21 94 -109.55 gain 94 21 -110.54 gain 21 95 -110.89 gain 95 21 -114.13 gain 21 96 -114.88 gain 96 21 -115.46 gain 21 97 -109.98 gain 97 21 -109.30 gain 21 98 -112.39 gain 98 21 -112.51 gain 21 99 -112.62 gain 99 21 -110.56 gain 21 100 -119.70 gain 100 21 -117.21 gain 21 101 -118.30 gain 101 21 -115.97 gain 21 102 -119.68 gain 102 21 -118.13 gain 21 103 -112.36 gain 103 21 -108.29 gain 21 104 -125.89 gain 104 21 -127.20 gain 21 105 -127.24 gain 105 21 -124.49 gain 21 106 -123.54 gain 106 21 -121.88 gain 21 107 -119.26 gain 107 21 -124.16 gain 21 108 -121.86 gain 108 21 -119.08 gain 21 109 -119.89 gain 109 21 -120.60 gain 21 110 -116.11 gain 110 21 -115.29 gain 21 111 -121.59 gain 111 21 -120.45 gain 21 112 -114.87 gain 112 21 -112.61 gain 21 113 -121.07 gain 113 21 -117.62 gain 21 114 -116.30 gain 114 21 -116.15 gain 21 115 -121.06 gain 115 21 -115.22 gain 21 116 -125.92 gain 116 21 -127.62 gain 21 117 -120.55 gain 117 21 -123.74 gain 21 118 -126.63 gain 118 21 -128.15 gain 21 119 -126.31 gain 119 21 -122.49 gain 21 120 -118.73 gain 120 21 -119.42 gain 21 121 -127.83 gain 121 21 -127.82 gain 21 122 -117.86 gain 122 21 -119.96 gain 21 123 -116.15 gain 123 21 -119.02 gain 21 124 -123.64 gain 124 21 -122.92 gain 21 125 -122.84 gain 125 21 -123.45 gain 21 126 -119.38 gain 126 21 -117.95 gain 21 127 -120.82 gain 127 21 -122.86 gain 21 128 -120.33 gain 128 21 -120.31 gain 21 129 -116.60 gain 129 21 -114.48 gain 21 130 -114.93 gain 130 21 -110.64 gain 21 131 -128.99 gain 131 21 -131.78 gain 21 132 -117.02 gain 132 21 -119.44 gain 21 133 -122.05 gain 133 21 -122.54 gain 21 134 -129.27 gain 134 21 -126.46 gain 21 135 -128.00 gain 135 21 -128.76 gain 21 136 -123.39 gain 136 21 -124.76 gain 21 137 -113.16 gain 137 21 -112.01 gain 21 138 -125.60 gain 138 21 -123.46 gain 21 139 -123.07 gain 139 21 -121.91 gain 21 140 -118.62 gain 140 21 -120.06 gain 21 141 -113.51 gain 141 21 -113.63 gain 21 142 -119.94 gain 142 21 -119.37 gain 21 143 -115.63 gain 143 21 -114.67 gain 21 144 -121.43 gain 144 21 -121.48 gain 21 145 -126.21 gain 145 21 -124.72 gain 21 146 -129.70 gain 146 21 -127.12 gain 21 147 -120.31 gain 147 21 -114.82 gain 21 148 -120.73 gain 148 21 -114.95 gain 21 149 -125.27 gain 149 21 -122.66 gain 21 150 -129.81 gain 150 21 -129.89 gain 21 151 -122.66 gain 151 21 -122.93 gain 21 152 -122.66 gain 152 21 -119.91 gain 21 153 -123.66 gain 153 21 -118.49 gain 21 154 -128.02 gain 154 21 -131.40 gain 21 155 -123.55 gain 155 21 -126.83 gain 21 156 -123.66 gain 156 21 -121.33 gain 21 157 -127.06 gain 157 21 -127.67 gain 21 158 -126.45 gain 158 21 -129.65 gain 21 159 -123.62 gain 159 21 -123.44 gain 21 160 -124.43 gain 160 21 -121.36 gain 21 161 -115.95 gain 161 21 -116.37 gain 21 162 -134.21 gain 162 21 -133.49 gain 21 163 -135.01 gain 163 21 -136.45 gain 21 164 -123.12 gain 164 21 -125.59 gain 21 165 -119.50 gain 165 21 -118.01 gain 21 166 -131.66 gain 166 21 -131.75 gain 21 167 -121.32 gain 167 21 -123.49 gain 21 168 -123.61 gain 168 21 -124.24 gain 21 169 -113.42 gain 169 21 -118.25 gain 21 170 -125.95 gain 170 21 -122.30 gain 21 171 -130.15 gain 171 21 -131.53 gain 21 172 -119.64 gain 172 21 -115.71 gain 21 173 -130.49 gain 173 21 -126.00 gain 21 174 -130.44 gain 174 21 -130.25 gain 21 175 -123.09 gain 175 21 -126.45 gain 21 176 -131.90 gain 176 21 -127.27 gain 21 177 -130.15 gain 177 21 -133.33 gain 21 178 -133.65 gain 178 21 -132.65 gain 21 179 -126.19 gain 179 21 -123.59 gain 21 180 -125.50 gain 180 21 -124.36 gain 21 181 -123.06 gain 181 21 -121.99 gain 21 182 -127.35 gain 182 21 -128.67 gain 21 183 -127.73 gain 183 21 -122.44 gain 21 184 -122.97 gain 184 21 -122.46 gain 21 185 -116.27 gain 185 21 -113.25 gain 21 186 -124.22 gain 186 21 -121.48 gain 21 187 -131.36 gain 187 21 -131.16 gain 21 188 -119.64 gain 188 21 -122.70 gain 21 189 -125.68 gain 189 21 -126.25 gain 21 190 -126.75 gain 190 21 -124.34 gain 21 191 -133.80 gain 191 21 -132.48 gain 21 192 -122.56 gain 192 21 -124.11 gain 21 193 -131.89 gain 193 21 -134.69 gain 21 194 -130.38 gain 194 21 -126.99 gain 21 195 -131.87 gain 195 21 -129.11 gain 21 196 -127.87 gain 196 21 -129.15 gain 21 197 -127.39 gain 197 21 -124.74 gain 21 198 -129.93 gain 198 21 -126.79 gain 21 199 -126.21 gain 199 21 -126.99 gain 21 200 -124.24 gain 200 21 -121.96 gain 21 201 -134.70 gain 201 21 -133.22 gain 21 202 -127.71 gain 202 21 -130.23 gain 21 203 -128.22 gain 203 21 -130.36 gain 21 204 -123.95 gain 204 21 -123.38 gain 21 205 -124.21 gain 205 21 -122.71 gain 21 206 -135.85 gain 206 21 -138.87 gain 21 207 -126.19 gain 207 21 -121.58 gain 21 208 -128.07 gain 208 21 -129.23 gain 21 209 -131.76 gain 209 21 -133.91 gain 21 210 -126.79 gain 210 21 -125.88 gain 21 211 -132.32 gain 211 21 -133.43 gain 21 212 -124.87 gain 212 21 -124.53 gain 21 213 -130.85 gain 213 21 -129.69 gain 21 214 -133.87 gain 214 21 -132.61 gain 21 215 -128.22 gain 215 21 -123.37 gain 21 216 -131.02 gain 216 21 -130.83 gain 21 217 -130.94 gain 217 21 -131.27 gain 21 218 -122.83 gain 218 21 -125.35 gain 21 219 -127.82 gain 219 21 -121.70 gain 21 220 -126.11 gain 220 21 -130.48 gain 21 221 -131.00 gain 221 21 -131.02 gain 21 222 -126.36 gain 222 21 -126.70 gain 21 223 -126.73 gain 223 21 -125.68 gain 21 224 -130.75 gain 224 21 -132.38 gain 22 23 -93.49 gain 23 22 -97.77 gain 22 24 -97.41 gain 24 22 -96.10 gain 22 25 -105.97 gain 25 22 -111.41 gain 22 26 -113.94 gain 26 22 -113.26 gain 22 27 -113.76 gain 27 22 -108.98 gain 22 28 -120.73 gain 28 22 -118.65 gain 22 29 -119.05 gain 29 22 -118.85 gain 22 30 -113.44 gain 30 22 -116.71 gain 22 31 -113.46 gain 31 22 -114.34 gain 22 32 -114.14 gain 32 22 -115.05 gain 22 33 -105.46 gain 33 22 -108.61 gain 22 34 -99.89 gain 34 22 -101.65 gain 22 35 -105.42 gain 35 22 -107.01 gain 22 36 -93.23 gain 36 22 -98.60 gain 22 37 -93.19 gain 37 22 -90.76 gain 22 38 -94.16 gain 38 22 -97.75 gain 22 39 -101.30 gain 39 22 -103.75 gain 22 40 -107.29 gain 40 22 -111.78 gain 22 41 -108.69 gain 41 22 -108.82 gain 22 42 -113.36 gain 42 22 -111.64 gain 22 43 -113.39 gain 43 22 -115.56 gain 22 44 -122.00 gain 44 22 -127.23 gain 22 45 -115.21 gain 45 22 -118.91 gain 22 46 -116.45 gain 46 22 -115.95 gain 22 47 -109.26 gain 47 22 -109.82 gain 22 48 -112.89 gain 48 22 -111.23 gain 22 49 -109.92 gain 49 22 -116.24 gain 22 50 -123.03 gain 50 22 -130.31 gain 22 51 -100.27 gain 51 22 -102.70 gain 22 52 -99.95 gain 52 22 -98.39 gain 22 53 -101.02 gain 53 22 -100.48 gain 22 54 -108.67 gain 54 22 -108.83 gain 22 55 -107.60 gain 55 22 -107.06 gain 22 56 -117.09 gain 56 22 -123.87 gain 22 57 -114.80 gain 57 22 -115.46 gain 22 58 -114.66 gain 58 22 -118.05 gain 22 59 -126.71 gain 59 22 -126.23 gain 22 60 -120.16 gain 60 22 -121.00 gain 22 61 -118.65 gain 61 22 -118.24 gain 22 62 -106.85 gain 62 22 -111.66 gain 22 63 -107.33 gain 63 22 -105.37 gain 22 64 -104.95 gain 64 22 -105.97 gain 22 65 -112.29 gain 65 22 -115.39 gain 22 66 -103.75 gain 66 22 -101.10 gain 22 67 -105.14 gain 67 22 -104.77 gain 22 68 -108.88 gain 68 22 -113.07 gain 22 69 -113.50 gain 69 22 -114.98 gain 22 70 -115.91 gain 70 22 -117.15 gain 22 71 -112.11 gain 71 22 -111.45 gain 22 72 -116.26 gain 72 22 -116.02 gain 22 73 -118.25 gain 73 22 -116.40 gain 22 74 -126.00 gain 74 22 -128.03 gain 22 75 -128.46 gain 75 22 -130.63 gain 22 76 -115.21 gain 76 22 -113.34 gain 22 77 -115.40 gain 77 22 -117.19 gain 22 78 -107.98 gain 78 22 -112.62 gain 22 79 -125.54 gain 79 22 -124.96 gain 22 80 -113.16 gain 80 22 -113.08 gain 22 81 -107.98 gain 81 22 -108.49 gain 22 82 -107.89 gain 82 22 -106.03 gain 22 83 -115.03 gain 83 22 -114.20 gain 22 84 -106.43 gain 84 22 -105.75 gain 22 85 -110.99 gain 85 22 -107.12 gain 22 86 -106.50 gain 86 22 -106.01 gain 22 87 -119.50 gain 87 22 -122.97 gain 22 88 -116.21 gain 88 22 -117.43 gain 22 89 -116.18 gain 89 22 -116.00 gain 22 90 -117.74 gain 90 22 -114.57 gain 22 91 -121.76 gain 91 22 -122.53 gain 22 92 -123.62 gain 92 22 -121.35 gain 22 93 -112.77 gain 93 22 -115.29 gain 22 94 -123.95 gain 94 22 -126.35 gain 22 95 -111.22 gain 95 22 -115.87 gain 22 96 -122.68 gain 96 22 -124.67 gain 22 97 -112.68 gain 97 22 -113.41 gain 22 98 -112.72 gain 98 22 -114.25 gain 22 99 -115.30 gain 99 22 -114.65 gain 22 100 -110.70 gain 100 22 -109.62 gain 22 101 -112.02 gain 101 22 -111.10 gain 22 102 -117.46 gain 102 22 -117.32 gain 22 103 -120.16 gain 103 22 -117.51 gain 22 104 -123.65 gain 104 22 -126.37 gain 22 105 -119.74 gain 105 22 -118.40 gain 22 106 -113.72 gain 106 22 -113.46 gain 22 107 -121.50 gain 107 22 -127.82 gain 22 108 -122.39 gain 108 22 -121.02 gain 22 109 -117.47 gain 109 22 -119.59 gain 22 110 -119.05 gain 110 22 -119.64 gain 22 111 -113.42 gain 111 22 -113.69 gain 22 112 -117.37 gain 112 22 -116.52 gain 22 113 -116.31 gain 113 22 -114.27 gain 22 114 -109.33 gain 114 22 -110.58 gain 22 115 -113.08 gain 115 22 -108.64 gain 22 116 -122.20 gain 116 22 -125.30 gain 22 117 -118.17 gain 117 22 -122.78 gain 22 118 -127.41 gain 118 22 -130.33 gain 22 119 -118.35 gain 119 22 -115.93 gain 22 120 -114.63 gain 120 22 -116.73 gain 22 121 -117.29 gain 121 22 -118.68 gain 22 122 -118.71 gain 122 22 -122.22 gain 22 123 -120.76 gain 123 22 -125.04 gain 22 124 -120.38 gain 124 22 -121.07 gain 22 125 -117.56 gain 125 22 -119.59 gain 22 126 -125.57 gain 126 22 -125.55 gain 22 127 -119.98 gain 127 22 -123.42 gain 22 128 -118.53 gain 128 22 -119.91 gain 22 129 -124.52 gain 129 22 -123.81 gain 22 130 -119.23 gain 130 22 -116.34 gain 22 131 -121.35 gain 131 22 -125.55 gain 22 132 -120.14 gain 132 22 -123.96 gain 22 133 -129.19 gain 133 22 -131.09 gain 22 134 -128.31 gain 134 22 -126.91 gain 22 135 -120.39 gain 135 22 -122.56 gain 22 136 -124.56 gain 136 22 -127.34 gain 22 137 -113.78 gain 137 22 -114.04 gain 22 138 -118.74 gain 138 22 -118.00 gain 22 139 -120.56 gain 139 22 -120.81 gain 22 140 -121.28 gain 140 22 -124.14 gain 22 141 -117.72 gain 141 22 -119.25 gain 22 142 -116.48 gain 142 22 -117.32 gain 22 143 -116.74 gain 143 22 -117.19 gain 22 144 -121.68 gain 144 22 -123.14 gain 22 145 -115.58 gain 145 22 -115.50 gain 22 146 -119.47 gain 146 22 -118.30 gain 22 147 -118.45 gain 147 22 -114.37 gain 22 148 -125.29 gain 148 22 -120.92 gain 22 149 -126.97 gain 149 22 -125.77 gain 22 150 -123.25 gain 150 22 -124.73 gain 22 151 -117.50 gain 151 22 -119.18 gain 22 152 -120.75 gain 152 22 -119.41 gain 22 153 -128.41 gain 153 22 -124.65 gain 22 154 -124.35 gain 154 22 -129.13 gain 22 155 -120.89 gain 155 22 -125.57 gain 22 156 -120.78 gain 156 22 -119.85 gain 22 157 -116.45 gain 157 22 -118.47 gain 22 158 -120.62 gain 158 22 -125.23 gain 22 159 -121.96 gain 159 22 -123.19 gain 22 160 -121.04 gain 160 22 -119.37 gain 22 161 -120.04 gain 161 22 -121.87 gain 22 162 -117.89 gain 162 22 -118.59 gain 22 163 -128.28 gain 163 22 -131.12 gain 22 164 -120.17 gain 164 22 -124.06 gain 22 165 -127.11 gain 165 22 -127.03 gain 22 166 -125.30 gain 166 22 -126.79 gain 22 167 -126.79 gain 167 22 -130.38 gain 22 168 -116.61 gain 168 22 -118.64 gain 22 169 -117.91 gain 169 22 -124.14 gain 22 170 -119.47 gain 170 22 -117.23 gain 22 171 -126.28 gain 171 22 -129.07 gain 22 172 -125.44 gain 172 22 -122.92 gain 22 173 -114.56 gain 173 22 -111.47 gain 22 174 -118.00 gain 174 22 -119.21 gain 22 175 -124.41 gain 175 22 -129.18 gain 22 176 -128.52 gain 176 22 -125.30 gain 22 177 -122.45 gain 177 22 -127.04 gain 22 178 -123.40 gain 178 22 -123.81 gain 22 179 -124.21 gain 179 22 -123.02 gain 22 180 -121.91 gain 180 22 -122.19 gain 22 181 -125.68 gain 181 22 -126.02 gain 22 182 -126.96 gain 182 22 -129.69 gain 22 183 -128.70 gain 183 22 -124.82 gain 22 184 -119.26 gain 184 22 -120.15 gain 22 185 -123.17 gain 185 22 -121.55 gain 22 186 -126.29 gain 186 22 -124.95 gain 22 187 -119.87 gain 187 22 -121.08 gain 22 188 -117.77 gain 188 22 -122.24 gain 22 189 -122.74 gain 189 22 -124.72 gain 22 190 -114.05 gain 190 22 -113.04 gain 22 191 -123.50 gain 191 22 -123.59 gain 22 192 -132.51 gain 192 22 -135.47 gain 22 193 -127.92 gain 193 22 -132.13 gain 22 194 -127.28 gain 194 22 -125.30 gain 22 195 -130.22 gain 195 22 -128.87 gain 22 196 -125.48 gain 196 22 -128.17 gain 22 197 -128.16 gain 197 22 -126.91 gain 22 198 -129.31 gain 198 22 -127.59 gain 22 199 -122.02 gain 199 22 -124.21 gain 22 200 -124.04 gain 200 22 -123.17 gain 22 201 -124.82 gain 201 22 -124.76 gain 22 202 -129.11 gain 202 22 -133.04 gain 22 203 -127.88 gain 203 22 -131.44 gain 22 204 -125.69 gain 204 22 -126.53 gain 22 205 -122.99 gain 205 22 -122.90 gain 22 206 -130.56 gain 206 22 -134.99 gain 22 207 -131.06 gain 207 22 -127.85 gain 22 208 -129.78 gain 208 22 -132.35 gain 22 209 -126.53 gain 209 22 -130.09 gain 22 210 -122.53 gain 210 22 -123.03 gain 22 211 -122.50 gain 211 22 -125.02 gain 22 212 -134.00 gain 212 22 -135.06 gain 22 213 -127.63 gain 213 22 -127.89 gain 22 214 -130.85 gain 214 22 -130.99 gain 22 215 -121.20 gain 215 22 -117.76 gain 22 216 -125.63 gain 216 22 -126.85 gain 22 217 -129.03 gain 217 22 -130.77 gain 22 218 -130.64 gain 218 22 -134.57 gain 22 219 -131.74 gain 219 22 -127.03 gain 22 220 -130.89 gain 220 22 -136.66 gain 22 221 -128.75 gain 221 22 -130.17 gain 22 222 -126.36 gain 222 22 -128.10 gain 22 223 -127.59 gain 223 22 -127.95 gain 22 224 -124.07 gain 224 22 -127.12 gain 23 24 -97.16 gain 24 23 -91.57 gain 23 25 -105.50 gain 25 23 -106.67 gain 23 26 -110.06 gain 26 23 -105.11 gain 23 27 -111.79 gain 27 23 -102.74 gain 23 28 -116.98 gain 28 23 -110.62 gain 23 29 -115.79 gain 29 23 -111.31 gain 23 30 -121.06 gain 30 23 -120.05 gain 23 31 -125.09 gain 31 23 -121.69 gain 23 32 -115.99 gain 32 23 -112.62 gain 23 33 -116.56 gain 33 23 -115.44 gain 23 34 -116.38 gain 34 23 -113.86 gain 23 35 -107.99 gain 35 23 -105.30 gain 23 36 -106.00 gain 36 23 -107.10 gain 23 37 -97.12 gain 37 23 -90.41 gain 23 38 -95.47 gain 38 23 -94.78 gain 23 39 -107.40 gain 39 23 -105.58 gain 23 40 -107.58 gain 40 23 -107.80 gain 23 41 -115.74 gain 41 23 -111.60 gain 23 42 -117.81 gain 42 23 -111.81 gain 23 43 -117.20 gain 43 23 -115.09 gain 23 44 -117.30 gain 44 23 -118.25 gain 23 45 -117.89 gain 45 23 -117.32 gain 23 46 -123.39 gain 46 23 -118.61 gain 23 47 -115.73 gain 47 23 -112.01 gain 23 48 -118.98 gain 48 23 -113.05 gain 23 49 -117.84 gain 49 23 -119.89 gain 23 50 -102.07 gain 50 23 -105.08 gain 23 51 -112.80 gain 51 23 -110.95 gain 23 52 -107.46 gain 52 23 -101.62 gain 23 53 -104.80 gain 53 23 -99.98 gain 23 54 -102.99 gain 54 23 -98.87 gain 23 55 -117.33 gain 55 23 -112.51 gain 23 56 -111.09 gain 56 23 -113.60 gain 23 57 -118.49 gain 57 23 -114.87 gain 23 58 -117.12 gain 58 23 -116.24 gain 23 59 -123.33 gain 59 23 -118.58 gain 23 60 -125.18 gain 60 23 -121.75 gain 23 61 -127.27 gain 61 23 -122.59 gain 23 62 -125.65 gain 62 23 -126.19 gain 23 63 -118.46 gain 63 23 -112.23 gain 23 64 -118.09 gain 64 23 -114.83 gain 23 65 -114.70 gain 65 23 -113.53 gain 23 66 -116.22 gain 66 23 -109.30 gain 23 67 -116.14 gain 67 23 -111.50 gain 23 68 -113.02 gain 68 23 -112.93 gain 23 69 -110.81 gain 69 23 -108.01 gain 23 70 -116.90 gain 70 23 -113.86 gain 23 71 -117.99 gain 71 23 -113.06 gain 23 72 -126.26 gain 72 23 -121.74 gain 23 73 -117.29 gain 73 23 -111.17 gain 23 74 -126.03 gain 74 23 -123.79 gain 23 75 -128.60 gain 75 23 -126.49 gain 23 76 -128.28 gain 76 23 -122.13 gain 23 77 -121.61 gain 77 23 -119.12 gain 23 78 -125.67 gain 78 23 -126.04 gain 23 79 -122.94 gain 79 23 -118.08 gain 23 80 -120.18 gain 80 23 -115.82 gain 23 81 -111.64 gain 81 23 -107.87 gain 23 82 -115.56 gain 82 23 -109.42 gain 23 83 -118.44 gain 83 23 -113.34 gain 23 84 -117.89 gain 84 23 -112.94 gain 23 85 -120.01 gain 85 23 -111.86 gain 23 86 -123.36 gain 86 23 -118.59 gain 23 87 -115.81 gain 87 23 -115.00 gain 23 88 -122.37 gain 88 23 -119.32 gain 23 89 -124.73 gain 89 23 -120.28 gain 23 90 -127.09 gain 90 23 -119.64 gain 23 91 -127.51 gain 91 23 -124.00 gain 23 92 -116.35 gain 92 23 -109.81 gain 23 93 -123.27 gain 93 23 -121.51 gain 23 94 -121.36 gain 94 23 -119.48 gain 23 95 -118.97 gain 95 23 -119.34 gain 23 96 -119.37 gain 96 23 -117.08 gain 23 97 -113.51 gain 97 23 -109.96 gain 23 98 -115.78 gain 98 23 -113.03 gain 23 99 -111.16 gain 99 23 -106.23 gain 23 100 -121.08 gain 100 23 -115.72 gain 23 101 -118.69 gain 101 23 -113.50 gain 23 102 -118.93 gain 102 23 -114.51 gain 23 103 -118.68 gain 103 23 -111.75 gain 23 104 -125.59 gain 104 23 -124.03 gain 23 105 -128.98 gain 105 23 -123.36 gain 23 106 -126.60 gain 106 23 -122.07 gain 23 107 -117.92 gain 107 23 -119.96 gain 23 108 -117.23 gain 108 23 -111.58 gain 23 109 -119.70 gain 109 23 -117.54 gain 23 110 -122.41 gain 110 23 -118.73 gain 23 111 -126.29 gain 111 23 -122.28 gain 23 112 -124.19 gain 112 23 -119.07 gain 23 113 -119.90 gain 113 23 -113.58 gain 23 114 -116.02 gain 114 23 -113.01 gain 23 115 -125.57 gain 115 23 -116.86 gain 23 116 -122.00 gain 116 23 -120.83 gain 23 117 -123.03 gain 117 23 -123.36 gain 23 118 -126.32 gain 118 23 -124.97 gain 23 119 -126.65 gain 119 23 -119.96 gain 23 120 -131.82 gain 120 23 -129.65 gain 23 121 -123.28 gain 121 23 -120.40 gain 23 122 -135.47 gain 122 23 -134.70 gain 23 123 -133.43 gain 123 23 -133.44 gain 23 124 -129.63 gain 124 23 -126.04 gain 23 125 -125.65 gain 125 23 -123.40 gain 23 126 -124.83 gain 126 23 -120.53 gain 23 127 -126.85 gain 127 23 -126.02 gain 23 128 -122.24 gain 128 23 -119.35 gain 23 129 -119.90 gain 129 23 -114.92 gain 23 130 -128.54 gain 130 23 -121.38 gain 23 131 -129.26 gain 131 23 -129.18 gain 23 132 -122.34 gain 132 23 -121.89 gain 23 133 -117.76 gain 133 23 -115.38 gain 23 134 -121.54 gain 134 23 -115.86 gain 23 135 -127.70 gain 135 23 -125.60 gain 23 136 -127.07 gain 136 23 -125.57 gain 23 137 -130.00 gain 137 23 -125.98 gain 23 138 -126.23 gain 138 23 -121.21 gain 23 139 -132.99 gain 139 23 -128.96 gain 23 140 -122.90 gain 140 23 -121.48 gain 23 141 -131.12 gain 141 23 -128.37 gain 23 142 -125.39 gain 142 23 -121.94 gain 23 143 -125.79 gain 143 23 -121.96 gain 23 144 -121.88 gain 144 23 -119.07 gain 23 145 -121.11 gain 145 23 -116.75 gain 23 146 -121.15 gain 146 23 -115.70 gain 23 147 -126.00 gain 147 23 -117.64 gain 23 148 -122.58 gain 148 23 -113.94 gain 23 149 -125.45 gain 149 23 -119.97 gain 23 150 -127.58 gain 150 23 -124.79 gain 23 151 -132.91 gain 151 23 -130.32 gain 23 152 -124.09 gain 152 23 -118.47 gain 23 153 -122.41 gain 153 23 -114.37 gain 23 154 -124.15 gain 154 23 -124.66 gain 23 155 -126.86 gain 155 23 -127.27 gain 23 156 -127.30 gain 156 23 -122.10 gain 23 157 -126.51 gain 157 23 -124.25 gain 23 158 -131.15 gain 158 23 -131.49 gain 23 159 -126.72 gain 159 23 -123.67 gain 23 160 -126.28 gain 160 23 -120.35 gain 23 161 -119.77 gain 161 23 -117.32 gain 23 162 -124.41 gain 162 23 -120.83 gain 23 163 -134.79 gain 163 23 -133.36 gain 23 164 -131.33 gain 164 23 -130.93 gain 23 165 -126.55 gain 165 23 -122.20 gain 23 166 -134.35 gain 166 23 -131.57 gain 23 167 -128.59 gain 167 23 -127.89 gain 23 168 -126.67 gain 168 23 -124.43 gain 23 169 -129.70 gain 169 23 -131.66 gain 23 170 -120.23 gain 170 23 -113.72 gain 23 171 -123.40 gain 171 23 -121.91 gain 23 172 -128.90 gain 172 23 -122.10 gain 23 173 -131.00 gain 173 23 -123.64 gain 23 174 -131.09 gain 174 23 -128.03 gain 23 175 -124.56 gain 175 23 -125.05 gain 23 176 -124.94 gain 176 23 -117.44 gain 23 177 -129.25 gain 177 23 -129.56 gain 23 178 -121.96 gain 178 23 -118.10 gain 23 179 -129.63 gain 179 23 -124.16 gain 23 180 -136.06 gain 180 23 -132.06 gain 23 181 -125.33 gain 181 23 -121.39 gain 23 182 -134.89 gain 182 23 -133.35 gain 23 183 -133.50 gain 183 23 -125.34 gain 23 184 -122.76 gain 184 23 -119.38 gain 23 185 -123.27 gain 185 23 -117.38 gain 23 186 -125.19 gain 186 23 -119.59 gain 23 187 -131.08 gain 187 23 -128.02 gain 23 188 -126.30 gain 188 23 -126.50 gain 23 189 -127.97 gain 189 23 -125.68 gain 23 190 -125.82 gain 190 23 -120.54 gain 23 191 -125.18 gain 191 23 -120.99 gain 23 192 -131.57 gain 192 23 -130.25 gain 23 193 -128.55 gain 193 23 -128.48 gain 23 194 -127.91 gain 194 23 -121.65 gain 23 195 -130.28 gain 195 23 -124.65 gain 23 196 -133.38 gain 196 23 -131.79 gain 23 197 -132.54 gain 197 23 -127.01 gain 23 198 -129.16 gain 198 23 -123.15 gain 23 199 -130.27 gain 199 23 -128.19 gain 23 200 -130.09 gain 200 23 -124.94 gain 23 201 -143.67 gain 201 23 -139.33 gain 23 202 -133.93 gain 202 23 -133.59 gain 23 203 -135.90 gain 203 23 -135.18 gain 23 204 -126.50 gain 204 23 -123.07 gain 23 205 -122.44 gain 205 23 -118.08 gain 23 206 -128.49 gain 206 23 -128.64 gain 23 207 -125.88 gain 207 23 -118.40 gain 23 208 -132.03 gain 208 23 -130.32 gain 23 209 -129.25 gain 209 23 -128.54 gain 23 210 -131.83 gain 210 23 -128.05 gain 23 211 -137.62 gain 211 23 -135.87 gain 23 212 -128.14 gain 212 23 -124.92 gain 23 213 -131.76 gain 213 23 -127.74 gain 23 214 -136.44 gain 214 23 -132.31 gain 23 215 -140.85 gain 215 23 -133.14 gain 23 216 -133.19 gain 216 23 -130.13 gain 23 217 -132.26 gain 217 23 -129.73 gain 23 218 -130.74 gain 218 23 -130.39 gain 23 219 -127.01 gain 219 23 -118.02 gain 23 220 -129.97 gain 220 23 -131.48 gain 23 221 -136.87 gain 221 23 -134.02 gain 23 222 -137.53 gain 222 23 -135.00 gain 23 223 -126.18 gain 223 23 -122.26 gain 23 224 -128.92 gain 224 23 -127.69 gain 24 25 -97.80 gain 25 24 -104.56 gain 24 26 -94.12 gain 26 24 -94.76 gain 24 27 -110.84 gain 27 24 -107.37 gain 24 28 -112.98 gain 28 24 -112.21 gain 24 29 -108.74 gain 29 24 -109.85 gain 24 30 -117.81 gain 30 24 -122.38 gain 24 31 -119.62 gain 31 24 -121.81 gain 24 32 -114.98 gain 32 24 -117.20 gain 24 33 -109.63 gain 33 24 -114.11 gain 24 34 -119.19 gain 34 24 -122.27 gain 24 35 -111.17 gain 35 24 -114.07 gain 24 36 -107.95 gain 36 24 -114.63 gain 24 37 -104.17 gain 37 24 -103.05 gain 24 38 -98.89 gain 38 24 -103.79 gain 24 39 -87.56 gain 39 24 -91.33 gain 24 40 -95.02 gain 40 24 -100.84 gain 24 41 -102.27 gain 41 24 -103.72 gain 24 42 -110.29 gain 42 24 -109.88 gain 24 43 -116.82 gain 43 24 -120.30 gain 24 44 -116.52 gain 44 24 -123.06 gain 24 45 -111.55 gain 45 24 -116.57 gain 24 46 -120.74 gain 46 24 -121.55 gain 24 47 -114.70 gain 47 24 -116.57 gain 24 48 -107.61 gain 48 24 -107.27 gain 24 49 -111.42 gain 49 24 -119.05 gain 24 50 -116.98 gain 50 24 -125.58 gain 24 51 -107.67 gain 51 24 -111.41 gain 24 52 -102.38 gain 52 24 -102.14 gain 24 53 -101.85 gain 53 24 -102.62 gain 24 54 -95.05 gain 54 24 -96.52 gain 24 55 -105.12 gain 55 24 -105.89 gain 24 56 -105.90 gain 56 24 -113.99 gain 24 57 -108.46 gain 57 24 -110.42 gain 24 58 -108.75 gain 58 24 -113.46 gain 24 59 -120.91 gain 59 24 -121.74 gain 24 60 -121.24 gain 60 24 -123.40 gain 24 61 -118.96 gain 61 24 -119.87 gain 24 62 -114.55 gain 62 24 -120.67 gain 24 63 -111.34 gain 63 24 -110.69 gain 24 64 -114.56 gain 64 24 -116.89 gain 24 65 -107.27 gain 65 24 -111.69 gain 24 66 -110.05 gain 66 24 -108.72 gain 24 67 -113.15 gain 67 24 -114.09 gain 24 68 -104.82 gain 68 24 -110.32 gain 24 69 -102.59 gain 69 24 -105.38 gain 24 70 -106.92 gain 70 24 -109.47 gain 24 71 -106.43 gain 71 24 -107.09 gain 24 72 -111.76 gain 72 24 -112.84 gain 24 73 -113.44 gain 73 24 -112.91 gain 24 74 -117.74 gain 74 24 -121.09 gain 24 75 -120.85 gain 75 24 -124.34 gain 24 76 -131.19 gain 76 24 -130.62 gain 24 77 -114.37 gain 77 24 -117.47 gain 24 78 -121.26 gain 78 24 -127.21 gain 24 79 -118.04 gain 79 24 -118.76 gain 24 80 -113.93 gain 80 24 -115.16 gain 24 81 -108.97 gain 81 24 -110.79 gain 24 82 -112.79 gain 82 24 -112.24 gain 24 83 -110.42 gain 83 24 -110.90 gain 24 84 -106.72 gain 84 24 -107.35 gain 24 85 -116.45 gain 85 24 -113.89 gain 24 86 -113.10 gain 86 24 -113.92 gain 24 87 -119.46 gain 87 24 -124.24 gain 24 88 -112.36 gain 88 24 -114.89 gain 24 89 -117.13 gain 89 24 -118.26 gain 24 90 -124.86 gain 90 24 -123.00 gain 24 91 -122.58 gain 91 24 -124.67 gain 24 92 -126.04 gain 92 24 -125.09 gain 24 93 -119.40 gain 93 24 -123.23 gain 24 94 -122.06 gain 94 24 -125.77 gain 24 95 -110.71 gain 95 24 -116.67 gain 24 96 -111.90 gain 96 24 -115.20 gain 24 97 -115.86 gain 97 24 -117.90 gain 24 98 -107.72 gain 98 24 -110.57 gain 24 99 -104.70 gain 99 24 -105.37 gain 24 100 -115.31 gain 100 24 -115.54 gain 24 101 -116.84 gain 101 24 -117.23 gain 24 102 -113.20 gain 102 24 -114.37 gain 24 103 -103.68 gain 103 24 -102.34 gain 24 104 -117.00 gain 104 24 -121.04 gain 24 105 -126.54 gain 105 24 -126.52 gain 24 106 -131.06 gain 106 24 -132.12 gain 24 107 -122.96 gain 107 24 -130.59 gain 24 108 -118.20 gain 108 24 -118.15 gain 24 109 -114.23 gain 109 24 -117.66 gain 24 110 -115.48 gain 110 24 -117.38 gain 24 111 -118.40 gain 111 24 -119.98 gain 24 112 -116.49 gain 112 24 -116.95 gain 24 113 -117.16 gain 113 24 -116.43 gain 24 114 -112.79 gain 114 24 -115.36 gain 24 115 -119.92 gain 115 24 -116.79 gain 24 116 -116.09 gain 116 24 -120.50 gain 24 117 -117.94 gain 117 24 -123.86 gain 24 118 -115.55 gain 118 24 -119.79 gain 24 119 -119.08 gain 119 24 -117.98 gain 24 120 -127.45 gain 120 24 -130.86 gain 24 121 -125.40 gain 121 24 -128.11 gain 24 122 -122.15 gain 122 24 -126.97 gain 24 123 -110.76 gain 123 24 -116.36 gain 24 124 -124.70 gain 124 24 -126.70 gain 24 125 -115.86 gain 125 24 -119.20 gain 24 126 -105.39 gain 126 24 -106.69 gain 24 127 -124.89 gain 127 24 -129.65 gain 24 128 -116.42 gain 128 24 -119.12 gain 24 129 -113.92 gain 129 24 -114.52 gain 24 130 -122.68 gain 130 24 -121.11 gain 24 131 -116.84 gain 131 24 -122.35 gain 24 132 -124.10 gain 132 24 -129.24 gain 24 133 -113.57 gain 133 24 -116.78 gain 24 134 -120.37 gain 134 24 -120.29 gain 24 135 -117.48 gain 135 24 -120.96 gain 24 136 -115.06 gain 136 24 -119.15 gain 24 137 -126.71 gain 137 24 -128.29 gain 24 138 -119.24 gain 138 24 -119.82 gain 24 139 -120.14 gain 139 24 -121.70 gain 24 140 -120.56 gain 140 24 -124.73 gain 24 141 -119.27 gain 141 24 -122.12 gain 24 142 -119.36 gain 142 24 -121.51 gain 24 143 -120.59 gain 143 24 -122.36 gain 24 144 -121.40 gain 144 24 -124.18 gain 24 145 -119.93 gain 145 24 -121.16 gain 24 146 -118.09 gain 146 24 -118.23 gain 24 147 -117.02 gain 147 24 -114.25 gain 24 148 -118.91 gain 148 24 -115.86 gain 24 149 -115.54 gain 149 24 -115.65 gain 24 150 -117.21 gain 150 24 -120.01 gain 24 151 -122.26 gain 151 24 -125.26 gain 24 152 -123.35 gain 152 24 -123.32 gain 24 153 -120.20 gain 153 24 -117.75 gain 24 154 -118.31 gain 154 24 -124.41 gain 24 155 -126.57 gain 155 24 -132.57 gain 24 156 -118.94 gain 156 24 -119.33 gain 24 157 -116.75 gain 157 24 -120.08 gain 24 158 -111.44 gain 158 24 -117.37 gain 24 159 -117.56 gain 159 24 -120.10 gain 24 160 -120.33 gain 160 24 -119.98 gain 24 161 -110.23 gain 161 24 -113.37 gain 24 162 -123.76 gain 162 24 -125.77 gain 24 163 -116.50 gain 163 24 -120.66 gain 24 164 -113.70 gain 164 24 -118.90 gain 24 165 -127.11 gain 165 24 -128.35 gain 24 166 -128.34 gain 166 24 -131.14 gain 24 167 -127.78 gain 167 24 -132.68 gain 24 168 -119.01 gain 168 24 -122.36 gain 24 169 -121.80 gain 169 24 -129.34 gain 24 170 -126.47 gain 170 24 -125.54 gain 24 171 -120.69 gain 171 24 -124.79 gain 24 172 -121.00 gain 172 24 -119.79 gain 24 173 -124.02 gain 173 24 -122.25 gain 24 174 -118.78 gain 174 24 -121.31 gain 24 175 -114.31 gain 175 24 -120.39 gain 24 176 -118.79 gain 176 24 -116.88 gain 24 177 -130.89 gain 177 24 -136.80 gain 24 178 -128.35 gain 178 24 -130.08 gain 24 179 -123.91 gain 179 24 -124.03 gain 24 180 -134.87 gain 180 24 -136.45 gain 24 181 -126.83 gain 181 24 -128.49 gain 24 182 -122.37 gain 182 24 -126.41 gain 24 183 -120.97 gain 183 24 -118.40 gain 24 184 -125.01 gain 184 24 -127.22 gain 24 185 -125.28 gain 185 24 -124.98 gain 24 186 -123.48 gain 186 24 -123.46 gain 24 187 -127.33 gain 187 24 -129.86 gain 24 188 -124.01 gain 188 24 -129.79 gain 24 189 -125.07 gain 189 24 -128.37 gain 24 190 -125.40 gain 190 24 -125.71 gain 24 191 -125.39 gain 191 24 -126.79 gain 24 192 -116.86 gain 192 24 -121.13 gain 24 193 -129.57 gain 193 24 -135.09 gain 24 194 -125.01 gain 194 24 -124.34 gain 24 195 -125.51 gain 195 24 -125.47 gain 24 196 -127.60 gain 196 24 -131.60 gain 24 197 -133.85 gain 197 24 -133.91 gain 24 198 -129.47 gain 198 24 -129.06 gain 24 199 -124.78 gain 199 24 -128.28 gain 24 200 -129.81 gain 200 24 -130.26 gain 24 201 -128.58 gain 201 24 -129.82 gain 24 202 -126.95 gain 202 24 -132.19 gain 24 203 -128.09 gain 203 24 -132.96 gain 24 204 -125.09 gain 204 24 -127.24 gain 24 205 -129.46 gain 205 24 -130.69 gain 24 206 -126.53 gain 206 24 -132.28 gain 24 207 -122.98 gain 207 24 -121.09 gain 24 208 -121.14 gain 208 24 -125.02 gain 24 209 -127.06 gain 209 24 -131.93 gain 24 210 -118.19 gain 210 24 -120.00 gain 24 211 -127.97 gain 211 24 -131.80 gain 24 212 -122.19 gain 212 24 -124.57 gain 24 213 -122.73 gain 213 24 -124.30 gain 24 214 -122.71 gain 214 24 -124.17 gain 24 215 -127.95 gain 215 24 -125.82 gain 24 216 -126.36 gain 216 24 -128.90 gain 24 217 -122.25 gain 217 24 -125.30 gain 24 218 -122.58 gain 218 24 -127.83 gain 24 219 -119.97 gain 219 24 -116.57 gain 24 220 -117.07 gain 220 24 -124.16 gain 24 221 -121.22 gain 221 24 -123.96 gain 24 222 -126.68 gain 222 24 -129.74 gain 24 223 -129.70 gain 223 24 -131.37 gain 24 224 -129.93 gain 224 24 -134.29 gain 25 26 -97.74 gain 26 25 -91.62 gain 25 27 -102.10 gain 27 25 -91.88 gain 25 28 -113.32 gain 28 25 -105.80 gain 25 29 -112.25 gain 29 25 -106.61 gain 25 30 -133.14 gain 30 25 -130.96 gain 25 31 -125.59 gain 31 25 -121.03 gain 25 32 -131.35 gain 32 25 -126.81 gain 25 33 -123.58 gain 33 25 -121.29 gain 25 34 -120.37 gain 34 25 -116.69 gain 25 35 -117.50 gain 35 25 -113.65 gain 25 36 -114.28 gain 36 25 -114.20 gain 25 37 -115.26 gain 37 25 -107.38 gain 25 38 -107.68 gain 38 25 -105.83 gain 25 39 -104.70 gain 39 25 -101.72 gain 25 40 -101.13 gain 40 25 -100.19 gain 25 41 -103.89 gain 41 25 -98.58 gain 25 42 -114.13 gain 42 25 -106.97 gain 25 43 -117.35 gain 43 25 -114.08 gain 25 44 -119.38 gain 44 25 -119.16 gain 25 45 -128.63 gain 45 25 -126.89 gain 25 46 -124.12 gain 46 25 -118.17 gain 25 47 -122.34 gain 47 25 -117.45 gain 25 48 -129.44 gain 48 25 -122.35 gain 25 49 -123.93 gain 49 25 -124.81 gain 25 50 -120.38 gain 50 25 -122.22 gain 25 51 -114.65 gain 51 25 -111.63 gain 25 52 -113.86 gain 52 25 -106.86 gain 25 53 -116.12 gain 53 25 -110.13 gain 25 54 -109.45 gain 54 25 -104.17 gain 25 55 -107.67 gain 55 25 -101.69 gain 25 56 -106.57 gain 56 25 -107.91 gain 25 57 -115.81 gain 57 25 -111.02 gain 25 58 -114.37 gain 58 25 -112.33 gain 25 59 -114.78 gain 59 25 -108.86 gain 25 60 -128.80 gain 60 25 -124.20 gain 25 61 -126.58 gain 61 25 -120.74 gain 25 62 -122.72 gain 62 25 -122.09 gain 25 63 -129.17 gain 63 25 -121.77 gain 25 64 -117.84 gain 64 25 -113.41 gain 25 65 -122.30 gain 65 25 -119.96 gain 25 66 -118.68 gain 66 25 -110.60 gain 25 67 -109.73 gain 67 25 -103.92 gain 25 68 -113.60 gain 68 25 -112.34 gain 25 69 -115.48 gain 69 25 -111.52 gain 25 70 -116.34 gain 70 25 -112.14 gain 25 71 -110.23 gain 71 25 -104.13 gain 25 72 -120.74 gain 72 25 -115.06 gain 25 73 -114.17 gain 73 25 -106.88 gain 25 74 -114.72 gain 74 25 -111.31 gain 25 75 -126.37 gain 75 25 -123.10 gain 25 76 -118.46 gain 76 25 -111.14 gain 25 77 -131.82 gain 77 25 -128.17 gain 25 78 -122.32 gain 78 25 -121.51 gain 25 79 -130.78 gain 79 25 -124.75 gain 25 80 -124.02 gain 80 25 -118.49 gain 25 81 -122.20 gain 81 25 -117.26 gain 25 82 -120.29 gain 82 25 -112.99 gain 25 83 -116.95 gain 83 25 -110.68 gain 25 84 -125.38 gain 84 25 -119.26 gain 25 85 -112.03 gain 85 25 -102.72 gain 25 86 -111.86 gain 86 25 -105.92 gain 25 87 -111.55 gain 87 25 -109.58 gain 25 88 -119.53 gain 88 25 -115.31 gain 25 89 -118.67 gain 89 25 -113.05 gain 25 90 -124.64 gain 90 25 -116.03 gain 25 91 -125.01 gain 91 25 -120.34 gain 25 92 -129.08 gain 92 25 -121.37 gain 25 93 -125.93 gain 93 25 -123.01 gain 25 94 -128.72 gain 94 25 -125.67 gain 25 95 -121.85 gain 95 25 -121.06 gain 25 96 -118.19 gain 96 25 -114.73 gain 25 97 -120.83 gain 97 25 -116.12 gain 25 98 -121.10 gain 98 25 -117.19 gain 25 99 -123.09 gain 99 25 -117.00 gain 25 100 -118.23 gain 100 25 -111.70 gain 25 101 -122.13 gain 101 25 -115.77 gain 25 102 -127.41 gain 102 25 -121.83 gain 25 103 -115.62 gain 103 25 -107.52 gain 25 104 -121.52 gain 104 25 -118.80 gain 25 105 -127.70 gain 105 25 -120.92 gain 25 106 -126.53 gain 106 25 -120.83 gain 25 107 -134.42 gain 107 25 -135.29 gain 25 108 -123.33 gain 108 25 -116.52 gain 25 109 -130.19 gain 109 25 -126.87 gain 25 110 -125.29 gain 110 25 -120.43 gain 25 111 -115.76 gain 111 25 -110.58 gain 25 112 -129.74 gain 112 25 -123.44 gain 25 113 -121.27 gain 113 25 -113.78 gain 25 114 -124.95 gain 114 25 -120.76 gain 25 115 -122.47 gain 115 25 -112.59 gain 25 116 -127.42 gain 116 25 -125.08 gain 25 117 -124.06 gain 117 25 -123.22 gain 25 118 -123.59 gain 118 25 -121.08 gain 25 119 -124.23 gain 119 25 -116.37 gain 25 120 -125.32 gain 120 25 -121.98 gain 25 121 -137.67 gain 121 25 -133.62 gain 25 122 -124.26 gain 122 25 -122.32 gain 25 123 -126.40 gain 123 25 -125.24 gain 25 124 -115.77 gain 124 25 -111.02 gain 25 125 -134.14 gain 125 25 -130.73 gain 25 126 -126.87 gain 126 25 -121.41 gain 25 127 -130.33 gain 127 25 -128.33 gain 25 128 -122.01 gain 128 25 -117.95 gain 25 129 -128.78 gain 129 25 -122.63 gain 25 130 -123.94 gain 130 25 -115.61 gain 25 131 -128.10 gain 131 25 -126.86 gain 25 132 -120.26 gain 132 25 -118.64 gain 25 133 -120.04 gain 133 25 -116.50 gain 25 134 -126.67 gain 134 25 -119.83 gain 25 135 -127.31 gain 135 25 -124.03 gain 25 136 -125.58 gain 136 25 -122.92 gain 25 137 -132.71 gain 137 25 -127.53 gain 25 138 -128.52 gain 138 25 -122.34 gain 25 139 -123.49 gain 139 25 -118.30 gain 25 140 -125.81 gain 140 25 -123.22 gain 25 141 -119.07 gain 141 25 -115.16 gain 25 142 -127.07 gain 142 25 -122.46 gain 25 143 -123.88 gain 143 25 -118.89 gain 25 144 -118.23 gain 144 25 -114.26 gain 25 145 -134.70 gain 145 25 -129.18 gain 25 146 -127.64 gain 146 25 -121.02 gain 25 147 -124.26 gain 147 25 -114.74 gain 25 148 -130.45 gain 148 25 -120.65 gain 25 149 -124.45 gain 149 25 -117.81 gain 25 150 -128.52 gain 150 25 -124.56 gain 25 151 -133.33 gain 151 25 -129.57 gain 25 152 -136.65 gain 152 25 -129.87 gain 25 153 -129.09 gain 153 25 -119.89 gain 25 154 -124.48 gain 154 25 -123.83 gain 25 155 -132.81 gain 155 25 -132.05 gain 25 156 -126.84 gain 156 25 -120.47 gain 25 157 -128.72 gain 157 25 -125.30 gain 25 158 -129.21 gain 158 25 -128.38 gain 25 159 -113.99 gain 159 25 -109.77 gain 25 160 -124.26 gain 160 25 -117.16 gain 25 161 -131.44 gain 161 25 -127.83 gain 25 162 -128.12 gain 162 25 -123.37 gain 25 163 -128.10 gain 163 25 -125.50 gain 25 164 -126.50 gain 164 25 -124.94 gain 25 165 -134.39 gain 165 25 -128.88 gain 25 166 -131.65 gain 166 25 -127.71 gain 25 167 -124.45 gain 167 25 -122.59 gain 25 168 -128.03 gain 168 25 -124.63 gain 25 169 -123.41 gain 169 25 -124.20 gain 25 170 -125.88 gain 170 25 -118.20 gain 25 171 -129.52 gain 171 25 -126.86 gain 25 172 -129.57 gain 172 25 -121.61 gain 25 173 -128.18 gain 173 25 -119.66 gain 25 174 -126.24 gain 174 25 -122.01 gain 25 175 -125.76 gain 175 25 -125.09 gain 25 176 -126.79 gain 176 25 -118.13 gain 25 177 -126.81 gain 177 25 -125.96 gain 25 178 -127.89 gain 178 25 -122.86 gain 25 179 -125.51 gain 179 25 -118.87 gain 25 180 -130.24 gain 180 25 -125.07 gain 25 181 -135.62 gain 181 25 -130.52 gain 25 182 -124.04 gain 182 25 -121.33 gain 25 183 -123.94 gain 183 25 -114.61 gain 25 184 -136.70 gain 184 25 -132.15 gain 25 185 -128.13 gain 185 25 -121.07 gain 25 186 -136.58 gain 186 25 -129.81 gain 25 187 -126.64 gain 187 25 -122.41 gain 25 188 -127.10 gain 188 25 -126.13 gain 25 189 -133.24 gain 189 25 -129.79 gain 25 190 -136.30 gain 190 25 -129.86 gain 25 191 -132.23 gain 191 25 -126.88 gain 25 192 -128.03 gain 192 25 -125.55 gain 25 193 -122.33 gain 193 25 -121.09 gain 25 194 -134.08 gain 194 25 -126.66 gain 25 195 -136.63 gain 195 25 -129.83 gain 25 196 -139.79 gain 196 25 -137.04 gain 25 197 -129.17 gain 197 25 -122.48 gain 25 198 -129.55 gain 198 25 -122.38 gain 25 199 -133.74 gain 199 25 -130.49 gain 25 200 -129.44 gain 200 25 -123.12 gain 25 201 -128.28 gain 201 25 -122.77 gain 25 202 -127.94 gain 202 25 -126.43 gain 25 203 -128.02 gain 203 25 -126.14 gain 25 204 -129.25 gain 204 25 -124.65 gain 25 205 -131.20 gain 205 25 -125.67 gain 25 206 -132.79 gain 206 25 -131.78 gain 25 207 -124.36 gain 207 25 -115.71 gain 25 208 -128.48 gain 208 25 -125.61 gain 25 209 -131.19 gain 209 25 -129.31 gain 25 210 -130.84 gain 210 25 -125.90 gain 25 211 -141.18 gain 211 25 -138.26 gain 25 212 -136.66 gain 212 25 -132.28 gain 25 213 -135.97 gain 213 25 -130.79 gain 25 214 -126.78 gain 214 25 -121.49 gain 25 215 -142.85 gain 215 25 -133.97 gain 25 216 -134.16 gain 216 25 -129.94 gain 25 217 -136.26 gain 217 25 -132.56 gain 25 218 -133.89 gain 218 25 -132.37 gain 25 219 -129.00 gain 219 25 -118.84 gain 25 220 -132.88 gain 220 25 -133.22 gain 25 221 -127.87 gain 221 25 -123.85 gain 25 222 -137.31 gain 222 25 -133.62 gain 25 223 -123.83 gain 223 25 -118.75 gain 25 224 -131.39 gain 224 25 -129.00 gain 26 27 -94.51 gain 27 26 -90.41 gain 26 28 -105.66 gain 28 26 -104.25 gain 26 29 -111.06 gain 29 26 -111.53 gain 26 30 -131.06 gain 30 26 -135.00 gain 26 31 -126.93 gain 31 26 -128.48 gain 26 32 -116.65 gain 32 26 -118.23 gain 26 33 -123.33 gain 33 26 -127.17 gain 26 34 -119.39 gain 34 26 -121.83 gain 26 35 -114.13 gain 35 26 -116.39 gain 26 36 -115.49 gain 36 26 -121.53 gain 26 37 -110.37 gain 37 26 -108.61 gain 26 38 -108.49 gain 38 26 -112.76 gain 26 39 -101.84 gain 39 26 -104.97 gain 26 40 -92.38 gain 40 26 -97.56 gain 26 41 -95.25 gain 41 26 -96.06 gain 26 42 -102.22 gain 42 26 -101.18 gain 26 43 -101.94 gain 43 26 -104.78 gain 26 44 -111.64 gain 44 26 -117.54 gain 26 45 -125.21 gain 45 26 -129.59 gain 26 46 -121.00 gain 46 26 -121.17 gain 26 47 -109.67 gain 47 26 -110.90 gain 26 48 -119.26 gain 48 26 -118.28 gain 26 49 -120.30 gain 49 26 -127.30 gain 26 50 -115.89 gain 50 26 -123.85 gain 26 51 -110.21 gain 51 26 -113.31 gain 26 52 -109.61 gain 52 26 -108.73 gain 26 53 -112.74 gain 53 26 -112.87 gain 26 54 -108.89 gain 54 26 -109.72 gain 26 55 -106.79 gain 55 26 -106.92 gain 26 56 -102.11 gain 56 26 -109.56 gain 26 57 -106.51 gain 57 26 -107.85 gain 26 58 -102.49 gain 58 26 -106.57 gain 26 59 -110.84 gain 59 26 -111.04 gain 26 60 -136.75 gain 60 26 -138.27 gain 26 61 -119.51 gain 61 26 -119.78 gain 26 62 -129.07 gain 62 26 -134.56 gain 26 63 -118.33 gain 63 26 -117.05 gain 26 64 -119.28 gain 64 26 -120.97 gain 26 65 -116.37 gain 65 26 -120.15 gain 26 66 -116.69 gain 66 26 -114.72 gain 26 67 -108.75 gain 67 26 -109.06 gain 26 68 -108.73 gain 68 26 -113.60 gain 26 69 -107.75 gain 69 26 -109.91 gain 26 70 -109.25 gain 70 26 -111.17 gain 26 71 -111.41 gain 71 26 -111.43 gain 26 72 -111.51 gain 72 26 -111.95 gain 26 73 -102.27 gain 73 26 -101.10 gain 26 74 -110.10 gain 74 26 -112.81 gain 26 75 -128.91 gain 75 26 -131.76 gain 26 76 -120.18 gain 76 26 -118.98 gain 26 77 -120.64 gain 77 26 -123.11 gain 26 78 -121.73 gain 78 26 -127.04 gain 26 79 -127.56 gain 79 26 -127.65 gain 26 80 -112.85 gain 80 26 -113.45 gain 26 81 -118.73 gain 81 26 -119.91 gain 26 82 -113.29 gain 82 26 -112.10 gain 26 83 -105.97 gain 83 26 -105.82 gain 26 84 -114.69 gain 84 26 -114.68 gain 26 85 -117.40 gain 85 26 -114.20 gain 26 86 -108.73 gain 86 26 -108.91 gain 26 87 -110.58 gain 87 26 -114.73 gain 26 88 -108.14 gain 88 26 -110.04 gain 26 89 -116.36 gain 89 26 -116.86 gain 26 90 -123.56 gain 90 26 -121.07 gain 26 91 -124.63 gain 91 26 -126.09 gain 26 92 -123.08 gain 92 26 -121.49 gain 26 93 -123.85 gain 93 26 -127.05 gain 26 94 -120.85 gain 94 26 -123.92 gain 26 95 -121.74 gain 95 26 -127.07 gain 26 96 -118.60 gain 96 26 -121.27 gain 26 97 -118.03 gain 97 26 -119.44 gain 26 98 -115.88 gain 98 26 -118.08 gain 26 99 -112.49 gain 99 26 -112.52 gain 26 100 -121.97 gain 100 26 -121.56 gain 26 101 -115.31 gain 101 26 -115.07 gain 26 102 -115.49 gain 102 26 -116.03 gain 26 103 -113.85 gain 103 26 -111.87 gain 26 104 -111.74 gain 104 26 -115.14 gain 26 105 -116.67 gain 105 26 -116.01 gain 26 106 -122.29 gain 106 26 -122.72 gain 26 107 -119.48 gain 107 26 -126.47 gain 26 108 -122.80 gain 108 26 -122.10 gain 26 109 -119.58 gain 109 26 -122.38 gain 26 110 -117.19 gain 110 26 -118.45 gain 26 111 -121.66 gain 111 26 -122.61 gain 26 112 -118.04 gain 112 26 -117.87 gain 26 113 -103.40 gain 113 26 -102.03 gain 26 114 -116.75 gain 114 26 -118.69 gain 26 115 -115.65 gain 115 26 -111.89 gain 26 116 -114.93 gain 116 26 -118.71 gain 26 117 -122.00 gain 117 26 -127.28 gain 26 118 -123.98 gain 118 26 -127.59 gain 26 119 -117.54 gain 119 26 -115.81 gain 26 120 -122.98 gain 120 26 -125.76 gain 26 121 -126.05 gain 121 26 -128.11 gain 26 122 -130.58 gain 122 26 -134.76 gain 26 123 -118.79 gain 123 26 -123.75 gain 26 124 -121.29 gain 124 26 -122.66 gain 26 125 -122.78 gain 125 26 -125.49 gain 26 126 -126.14 gain 126 26 -126.79 gain 26 127 -113.39 gain 127 26 -117.51 gain 26 128 -116.11 gain 128 26 -118.17 gain 26 129 -114.84 gain 129 26 -114.81 gain 26 130 -121.32 gain 130 26 -119.11 gain 26 131 -116.04 gain 131 26 -120.92 gain 26 132 -114.54 gain 132 26 -119.05 gain 26 133 -116.75 gain 133 26 -119.32 gain 26 134 -122.14 gain 134 26 -121.42 gain 26 135 -118.51 gain 135 26 -121.36 gain 26 136 -123.91 gain 136 26 -127.37 gain 26 137 -122.25 gain 137 26 -123.18 gain 26 138 -128.17 gain 138 26 -128.11 gain 26 139 -115.91 gain 139 26 -116.83 gain 26 140 -118.58 gain 140 26 -122.11 gain 26 141 -122.85 gain 141 26 -125.05 gain 26 142 -122.32 gain 142 26 -123.83 gain 26 143 -131.57 gain 143 26 -132.69 gain 26 144 -114.67 gain 144 26 -116.81 gain 26 145 -120.03 gain 145 26 -120.62 gain 26 146 -115.96 gain 146 26 -115.46 gain 26 147 -118.30 gain 147 26 -114.89 gain 26 148 -119.18 gain 148 26 -115.49 gain 26 149 -123.36 gain 149 26 -122.84 gain 26 150 -125.64 gain 150 26 -127.80 gain 26 151 -128.36 gain 151 26 -130.72 gain 26 152 -126.87 gain 152 26 -126.20 gain 26 153 -121.34 gain 153 26 -118.25 gain 26 154 -124.27 gain 154 26 -129.73 gain 26 155 -119.57 gain 155 26 -124.93 gain 26 156 -120.10 gain 156 26 -119.85 gain 26 157 -118.79 gain 157 26 -121.48 gain 26 158 -119.48 gain 158 26 -124.77 gain 26 159 -124.81 gain 159 26 -126.71 gain 26 160 -115.08 gain 160 26 -114.09 gain 26 161 -119.62 gain 161 26 -122.12 gain 26 162 -119.41 gain 162 26 -120.78 gain 26 163 -113.54 gain 163 26 -117.06 gain 26 164 -135.63 gain 164 26 -140.19 gain 26 165 -124.50 gain 165 26 -125.11 gain 26 166 -123.86 gain 166 26 -126.03 gain 26 167 -123.40 gain 167 26 -127.66 gain 26 168 -126.40 gain 168 26 -129.11 gain 26 169 -124.96 gain 169 26 -131.87 gain 26 170 -121.36 gain 170 26 -119.80 gain 26 171 -117.85 gain 171 26 -121.31 gain 26 172 -119.15 gain 172 26 -117.30 gain 26 173 -120.68 gain 173 26 -118.27 gain 26 174 -125.96 gain 174 26 -127.85 gain 26 175 -124.56 gain 175 26 -130.00 gain 26 176 -126.53 gain 176 26 -123.98 gain 26 177 -120.37 gain 177 26 -125.63 gain 26 178 -120.27 gain 178 26 -121.36 gain 26 179 -122.79 gain 179 26 -122.28 gain 26 180 -134.17 gain 180 26 -135.12 gain 26 181 -125.02 gain 181 26 -126.04 gain 26 182 -120.40 gain 182 26 -123.80 gain 26 183 -122.79 gain 183 26 -119.58 gain 26 184 -122.02 gain 184 26 -123.60 gain 26 185 -131.56 gain 185 26 -130.62 gain 26 186 -126.38 gain 186 26 -125.72 gain 26 187 -121.15 gain 187 26 -123.03 gain 26 188 -122.78 gain 188 26 -127.93 gain 26 189 -122.76 gain 189 26 -125.42 gain 26 190 -126.68 gain 190 26 -126.35 gain 26 191 -123.28 gain 191 26 -124.05 gain 26 192 -122.54 gain 192 26 -126.17 gain 26 193 -121.30 gain 193 26 -126.18 gain 26 194 -124.92 gain 194 26 -123.61 gain 26 195 -129.03 gain 195 26 -128.36 gain 26 196 -129.59 gain 196 26 -132.95 gain 26 197 -127.66 gain 197 26 -127.09 gain 26 198 -128.33 gain 198 26 -127.28 gain 26 199 -126.18 gain 199 26 -129.04 gain 26 200 -125.35 gain 200 26 -125.15 gain 26 201 -125.61 gain 201 26 -126.22 gain 26 202 -119.93 gain 202 26 -124.54 gain 26 203 -121.95 gain 203 26 -126.18 gain 26 204 -134.07 gain 204 26 -135.58 gain 26 205 -125.18 gain 205 26 -125.76 gain 26 206 -124.56 gain 206 26 -129.67 gain 26 207 -128.42 gain 207 26 -125.89 gain 26 208 -118.25 gain 208 26 -121.50 gain 26 209 -128.35 gain 209 26 -132.59 gain 26 210 -135.93 gain 210 26 -137.11 gain 26 211 -133.36 gain 211 26 -136.56 gain 26 212 -134.01 gain 212 26 -135.75 gain 26 213 -134.80 gain 213 26 -135.73 gain 26 214 -126.17 gain 214 26 -126.99 gain 26 215 -123.85 gain 215 26 -121.09 gain 26 216 -127.57 gain 216 26 -129.46 gain 26 217 -128.27 gain 217 26 -130.68 gain 26 218 -119.91 gain 218 26 -124.52 gain 26 219 -129.80 gain 219 26 -125.76 gain 26 220 -128.94 gain 220 26 -135.40 gain 26 221 -124.24 gain 221 26 -126.34 gain 26 222 -125.12 gain 222 26 -127.54 gain 26 223 -123.02 gain 223 26 -124.05 gain 26 224 -128.20 gain 224 26 -131.93 gain 27 28 -89.13 gain 28 27 -91.83 gain 27 29 -99.74 gain 29 27 -104.31 gain 27 30 -115.42 gain 30 27 -123.46 gain 27 31 -116.67 gain 31 27 -122.33 gain 27 32 -114.90 gain 32 27 -120.59 gain 27 33 -117.73 gain 33 27 -125.67 gain 27 34 -117.19 gain 34 27 -123.74 gain 27 35 -107.70 gain 35 27 -114.06 gain 27 36 -110.91 gain 36 27 -121.06 gain 27 37 -101.67 gain 37 27 -104.02 gain 27 38 -101.19 gain 38 27 -109.56 gain 27 39 -102.09 gain 39 27 -109.32 gain 27 40 -96.18 gain 40 27 -105.46 gain 27 41 -94.83 gain 41 27 -99.74 gain 27 42 -89.37 gain 42 27 -92.43 gain 27 43 -89.76 gain 43 27 -96.71 gain 27 44 -96.12 gain 44 27 -106.13 gain 27 45 -115.49 gain 45 27 -123.97 gain 27 46 -123.06 gain 46 27 -127.33 gain 27 47 -114.08 gain 47 27 -119.41 gain 27 48 -117.07 gain 48 27 -120.19 gain 27 49 -115.77 gain 49 27 -126.86 gain 27 50 -115.00 gain 50 27 -127.07 gain 27 51 -112.11 gain 51 27 -119.32 gain 27 52 -107.36 gain 52 27 -110.58 gain 27 53 -116.97 gain 53 27 -121.20 gain 27 54 -107.55 gain 54 27 -112.49 gain 27 55 -100.37 gain 55 27 -104.61 gain 27 56 -100.79 gain 56 27 -112.36 gain 27 57 -96.56 gain 57 27 -101.99 gain 27 58 -92.44 gain 58 27 -100.62 gain 27 59 -101.14 gain 59 27 -105.44 gain 27 60 -116.43 gain 60 27 -122.05 gain 27 61 -119.79 gain 61 27 -124.17 gain 27 62 -113.63 gain 62 27 -123.22 gain 27 63 -117.97 gain 63 27 -120.79 gain 27 64 -119.52 gain 64 27 -125.32 gain 27 65 -112.04 gain 65 27 -119.92 gain 27 66 -112.33 gain 66 27 -114.47 gain 27 67 -114.30 gain 67 27 -118.71 gain 27 68 -113.68 gain 68 27 -122.65 gain 27 69 -110.81 gain 69 27 -117.07 gain 27 70 -103.31 gain 70 27 -109.33 gain 27 71 -103.28 gain 71 27 -107.40 gain 27 72 -106.83 gain 72 27 -111.38 gain 27 73 -105.20 gain 73 27 -108.14 gain 27 74 -100.61 gain 74 27 -107.42 gain 27 75 -120.07 gain 75 27 -127.02 gain 27 76 -120.06 gain 76 27 -122.96 gain 27 77 -115.95 gain 77 27 -122.51 gain 27 78 -115.72 gain 78 27 -125.14 gain 27 79 -117.06 gain 79 27 -121.26 gain 27 80 -111.40 gain 80 27 -116.10 gain 27 81 -124.94 gain 81 27 -130.23 gain 27 82 -114.57 gain 82 27 -117.48 gain 27 83 -111.50 gain 83 27 -115.45 gain 27 84 -106.47 gain 84 27 -110.57 gain 27 85 -109.97 gain 85 27 -110.88 gain 27 86 -98.09 gain 86 27 -102.38 gain 27 87 -101.38 gain 87 27 -109.63 gain 27 88 -105.54 gain 88 27 -111.54 gain 27 89 -102.24 gain 89 27 -106.84 gain 27 90 -119.13 gain 90 27 -120.74 gain 27 91 -114.41 gain 91 27 -119.96 gain 27 92 -112.07 gain 92 27 -114.59 gain 27 93 -113.04 gain 93 27 -120.34 gain 27 94 -121.07 gain 94 27 -128.25 gain 27 95 -118.20 gain 95 27 -127.63 gain 27 96 -111.94 gain 96 27 -118.71 gain 27 97 -116.51 gain 97 27 -122.02 gain 27 98 -107.88 gain 98 27 -114.20 gain 27 99 -107.32 gain 99 27 -111.45 gain 27 100 -110.48 gain 100 27 -114.17 gain 27 101 -106.72 gain 101 27 -110.58 gain 27 102 -112.64 gain 102 27 -117.28 gain 27 103 -115.24 gain 103 27 -117.37 gain 27 104 -107.76 gain 104 27 -115.26 gain 27 105 -124.69 gain 105 27 -128.13 gain 27 106 -125.39 gain 106 27 -129.92 gain 27 107 -123.95 gain 107 27 -135.05 gain 27 108 -118.41 gain 108 27 -121.82 gain 27 109 -120.15 gain 109 27 -127.05 gain 27 110 -118.55 gain 110 27 -123.92 gain 27 111 -117.60 gain 111 27 -122.65 gain 27 112 -111.65 gain 112 27 -115.58 gain 27 113 -116.19 gain 113 27 -118.93 gain 27 114 -110.44 gain 114 27 -116.47 gain 27 115 -114.10 gain 115 27 -114.44 gain 27 116 -114.21 gain 116 27 -122.09 gain 27 117 -111.66 gain 117 27 -121.05 gain 27 118 -111.42 gain 118 27 -119.13 gain 27 119 -121.70 gain 119 27 -124.07 gain 27 120 -130.21 gain 120 27 -137.10 gain 27 121 -115.32 gain 121 27 -121.49 gain 27 122 -114.50 gain 122 27 -122.79 gain 27 123 -123.05 gain 123 27 -132.11 gain 27 124 -119.23 gain 124 27 -124.70 gain 27 125 -110.38 gain 125 27 -117.19 gain 27 126 -109.83 gain 126 27 -114.59 gain 27 127 -120.56 gain 127 27 -128.78 gain 27 128 -118.41 gain 128 27 -124.58 gain 27 129 -115.49 gain 129 27 -119.57 gain 27 130 -110.92 gain 130 27 -112.81 gain 27 131 -115.29 gain 131 27 -124.27 gain 27 132 -106.61 gain 132 27 -115.22 gain 27 133 -114.76 gain 133 27 -121.44 gain 27 134 -113.93 gain 134 27 -117.31 gain 27 135 -122.32 gain 135 27 -129.27 gain 27 136 -121.76 gain 136 27 -129.32 gain 27 137 -122.93 gain 137 27 -127.97 gain 27 138 -124.32 gain 138 27 -128.36 gain 27 139 -121.98 gain 139 27 -127.00 gain 27 140 -125.80 gain 140 27 -133.44 gain 27 141 -123.40 gain 141 27 -129.71 gain 27 142 -121.34 gain 142 27 -126.96 gain 27 143 -113.82 gain 143 27 -119.05 gain 27 144 -116.12 gain 144 27 -122.37 gain 27 145 -108.96 gain 145 27 -113.65 gain 27 146 -114.21 gain 146 27 -117.81 gain 27 147 -116.70 gain 147 27 -117.40 gain 27 148 -116.24 gain 148 27 -116.66 gain 27 149 -117.18 gain 149 27 -120.76 gain 27 150 -119.44 gain 150 27 -125.70 gain 27 151 -127.16 gain 151 27 -133.62 gain 27 152 -122.02 gain 152 27 -125.46 gain 27 153 -113.98 gain 153 27 -114.99 gain 27 154 -113.17 gain 154 27 -122.73 gain 27 155 -118.22 gain 155 27 -127.68 gain 27 156 -113.30 gain 156 27 -117.15 gain 27 157 -117.71 gain 157 27 -124.51 gain 27 158 -118.16 gain 158 27 -127.55 gain 27 159 -121.51 gain 159 27 -127.52 gain 27 160 -115.62 gain 160 27 -118.74 gain 27 161 -115.11 gain 161 27 -121.72 gain 27 162 -120.93 gain 162 27 -126.40 gain 27 163 -121.22 gain 163 27 -128.85 gain 27 164 -116.69 gain 164 27 -125.36 gain 27 165 -118.12 gain 165 27 -122.83 gain 27 166 -118.92 gain 166 27 -125.19 gain 27 167 -122.41 gain 167 27 -130.77 gain 27 168 -120.94 gain 168 27 -127.76 gain 27 169 -121.50 gain 169 27 -132.51 gain 27 170 -120.46 gain 170 27 -123.00 gain 27 171 -123.27 gain 171 27 -130.84 gain 27 172 -121.10 gain 172 27 -123.36 gain 27 173 -117.55 gain 173 27 -119.24 gain 27 174 -114.06 gain 174 27 -120.05 gain 27 175 -115.75 gain 175 27 -125.30 gain 27 176 -119.29 gain 176 27 -120.85 gain 27 177 -108.85 gain 177 27 -118.22 gain 27 178 -118.03 gain 178 27 -123.23 gain 27 179 -118.52 gain 179 27 -122.10 gain 27 180 -119.80 gain 180 27 -124.86 gain 27 181 -118.92 gain 181 27 -124.05 gain 27 182 -125.69 gain 182 27 -133.20 gain 27 183 -125.14 gain 183 27 -126.04 gain 27 184 -120.22 gain 184 27 -125.90 gain 27 185 -118.46 gain 185 27 -121.63 gain 27 186 -121.31 gain 186 27 -124.76 gain 27 187 -119.34 gain 187 27 -125.33 gain 27 188 -122.99 gain 188 27 -132.24 gain 27 189 -115.11 gain 189 27 -121.88 gain 27 190 -113.79 gain 190 27 -117.57 gain 27 191 -125.52 gain 191 27 -130.39 gain 27 192 -112.47 gain 192 27 -120.20 gain 27 193 -120.76 gain 193 27 -129.74 gain 27 194 -118.67 gain 194 27 -121.46 gain 27 195 -128.98 gain 195 27 -132.41 gain 27 196 -128.09 gain 196 27 -135.56 gain 27 197 -119.61 gain 197 27 -123.14 gain 27 198 -120.13 gain 198 27 -123.19 gain 27 199 -114.28 gain 199 27 -121.25 gain 27 200 -124.46 gain 200 27 -128.36 gain 27 201 -118.76 gain 201 27 -123.48 gain 27 202 -119.33 gain 202 27 -128.04 gain 27 203 -125.72 gain 203 27 -134.05 gain 27 204 -113.74 gain 204 27 -119.36 gain 27 205 -117.46 gain 205 27 -122.15 gain 27 206 -120.76 gain 206 27 -129.97 gain 27 207 -119.09 gain 207 27 -120.67 gain 27 208 -114.85 gain 208 27 -122.20 gain 27 209 -121.80 gain 209 27 -130.15 gain 27 210 -120.84 gain 210 27 -126.12 gain 27 211 -120.76 gain 211 27 -128.07 gain 27 212 -128.35 gain 212 27 -134.19 gain 27 213 -128.02 gain 213 27 -133.06 gain 27 214 -125.79 gain 214 27 -130.71 gain 27 215 -119.45 gain 215 27 -120.79 gain 27 216 -120.85 gain 216 27 -126.85 gain 27 217 -122.50 gain 217 27 -129.02 gain 27 218 -114.69 gain 218 27 -123.40 gain 27 219 -116.03 gain 219 27 -116.09 gain 27 220 -120.60 gain 220 27 -131.16 gain 27 221 -124.89 gain 221 27 -131.09 gain 27 222 -115.67 gain 222 27 -122.20 gain 27 223 -123.33 gain 223 27 -128.48 gain 27 224 -122.07 gain 224 27 -129.90 gain 28 29 -84.20 gain 29 28 -86.08 gain 28 30 -119.87 gain 30 28 -125.22 gain 28 31 -121.02 gain 31 28 -123.99 gain 28 32 -121.71 gain 32 28 -124.70 gain 28 33 -126.06 gain 33 28 -131.31 gain 28 34 -115.69 gain 34 28 -119.54 gain 28 35 -113.31 gain 35 28 -116.98 gain 28 36 -108.81 gain 36 28 -116.26 gain 28 37 -119.44 gain 37 28 -119.09 gain 28 38 -113.59 gain 38 28 -119.26 gain 28 39 -112.55 gain 39 28 -117.09 gain 28 40 -106.38 gain 40 28 -112.97 gain 28 41 -93.41 gain 41 28 -95.62 gain 28 42 -94.01 gain 42 28 -94.38 gain 28 43 -89.06 gain 43 28 -93.31 gain 28 44 -92.26 gain 44 28 -99.58 gain 28 45 -124.40 gain 45 28 -130.19 gain 28 46 -126.94 gain 46 28 -128.53 gain 28 47 -119.92 gain 47 28 -122.56 gain 28 48 -121.57 gain 48 28 -122.00 gain 28 49 -115.50 gain 49 28 -123.91 gain 28 50 -118.26 gain 50 28 -127.63 gain 28 51 -112.50 gain 51 28 -117.01 gain 28 52 -108.30 gain 52 28 -108.83 gain 28 53 -115.50 gain 53 28 -117.04 gain 28 54 -106.81 gain 54 28 -109.05 gain 28 55 -117.01 gain 55 28 -118.55 gain 28 56 -107.39 gain 56 28 -116.26 gain 28 57 -102.32 gain 57 28 -105.07 gain 28 58 -100.63 gain 58 28 -106.11 gain 28 59 -109.75 gain 59 28 -111.36 gain 28 60 -126.42 gain 60 28 -129.36 gain 28 61 -117.33 gain 61 28 -119.01 gain 28 62 -123.41 gain 62 28 -130.31 gain 28 63 -123.03 gain 63 28 -123.15 gain 28 64 -112.89 gain 64 28 -115.99 gain 28 65 -117.86 gain 65 28 -123.05 gain 28 66 -122.71 gain 66 28 -122.15 gain 28 67 -116.09 gain 67 28 -117.81 gain 28 68 -109.37 gain 68 28 -115.65 gain 28 69 -114.43 gain 69 28 -118.00 gain 28 70 -104.70 gain 70 28 -108.02 gain 28 71 -104.63 gain 71 28 -106.06 gain 28 72 -107.12 gain 72 28 -108.97 gain 28 73 -112.83 gain 73 28 -113.06 gain 28 74 -103.73 gain 74 28 -107.84 gain 28 75 -125.33 gain 75 28 -129.59 gain 28 76 -133.03 gain 76 28 -133.24 gain 28 77 -123.34 gain 77 28 -127.21 gain 28 78 -122.45 gain 78 28 -129.17 gain 28 79 -120.96 gain 79 28 -122.46 gain 28 80 -113.29 gain 80 28 -115.29 gain 28 81 -119.03 gain 81 28 -121.63 gain 28 82 -112.82 gain 82 28 -113.04 gain 28 83 -121.82 gain 83 28 -123.08 gain 28 84 -109.50 gain 84 28 -110.90 gain 28 85 -121.64 gain 85 28 -119.85 gain 28 86 -112.43 gain 86 28 -114.02 gain 28 87 -110.38 gain 87 28 -115.94 gain 28 88 -117.73 gain 88 28 -121.03 gain 28 89 -114.00 gain 89 28 -115.91 gain 28 90 -115.94 gain 90 28 -114.85 gain 28 91 -125.37 gain 91 28 -128.23 gain 28 92 -122.91 gain 92 28 -122.73 gain 28 93 -129.90 gain 93 28 -134.51 gain 28 94 -122.23 gain 94 28 -126.71 gain 28 95 -124.71 gain 95 28 -131.44 gain 28 96 -122.35 gain 96 28 -126.42 gain 28 97 -118.16 gain 97 28 -120.98 gain 28 98 -111.46 gain 98 28 -115.08 gain 28 99 -111.41 gain 99 28 -112.85 gain 28 100 -110.92 gain 100 28 -111.92 gain 28 101 -106.34 gain 101 28 -107.51 gain 28 102 -120.28 gain 102 28 -122.23 gain 28 103 -114.37 gain 103 28 -113.80 gain 28 104 -110.78 gain 104 28 -115.58 gain 28 105 -122.03 gain 105 28 -122.78 gain 28 106 -126.87 gain 106 28 -128.70 gain 28 107 -126.28 gain 107 28 -134.68 gain 28 108 -129.67 gain 108 28 -130.38 gain 28 109 -121.08 gain 109 28 -125.29 gain 28 110 -127.54 gain 110 28 -130.22 gain 28 111 -117.00 gain 111 28 -119.36 gain 28 112 -117.36 gain 112 28 -118.60 gain 28 113 -111.86 gain 113 28 -111.90 gain 28 114 -116.47 gain 114 28 -119.82 gain 28 115 -117.57 gain 115 28 -115.22 gain 28 116 -112.52 gain 116 28 -117.71 gain 28 117 -115.80 gain 117 28 -122.49 gain 28 118 -111.63 gain 118 28 -116.64 gain 28 119 -111.51 gain 119 28 -111.18 gain 28 120 -126.19 gain 120 28 -130.38 gain 28 121 -123.79 gain 121 28 -127.27 gain 28 122 -126.05 gain 122 28 -131.64 gain 28 123 -120.40 gain 123 28 -126.77 gain 28 124 -116.70 gain 124 28 -119.48 gain 28 125 -128.65 gain 125 28 -132.77 gain 28 126 -115.46 gain 126 28 -117.53 gain 28 127 -123.22 gain 127 28 -128.75 gain 28 128 -123.83 gain 128 28 -127.30 gain 28 129 -115.27 gain 129 28 -116.64 gain 28 130 -118.54 gain 130 28 -117.74 gain 28 131 -103.65 gain 131 28 -109.94 gain 28 132 -113.22 gain 132 28 -119.13 gain 28 133 -115.51 gain 133 28 -119.49 gain 28 134 -116.39 gain 134 28 -117.07 gain 28 135 -121.68 gain 135 28 -125.94 gain 28 136 -124.46 gain 136 28 -129.33 gain 28 137 -130.56 gain 137 28 -132.91 gain 28 138 -126.52 gain 138 28 -127.87 gain 28 139 -125.91 gain 139 28 -128.24 gain 28 140 -116.04 gain 140 28 -120.98 gain 28 141 -123.59 gain 141 28 -127.20 gain 28 142 -119.70 gain 142 28 -122.62 gain 28 143 -109.62 gain 143 28 -112.15 gain 28 144 -124.34 gain 144 28 -127.89 gain 28 145 -118.49 gain 145 28 -120.49 gain 28 146 -112.73 gain 146 28 -113.64 gain 28 147 -126.50 gain 147 28 -124.50 gain 28 148 -119.84 gain 148 28 -117.56 gain 28 149 -116.52 gain 149 28 -117.40 gain 28 150 -127.53 gain 150 28 -131.10 gain 28 151 -127.60 gain 151 28 -131.37 gain 28 152 -128.68 gain 152 28 -129.42 gain 28 153 -121.72 gain 153 28 -120.04 gain 28 154 -122.21 gain 154 28 -129.08 gain 28 155 -119.45 gain 155 28 -126.22 gain 28 156 -119.43 gain 156 28 -120.59 gain 28 157 -112.06 gain 157 28 -116.16 gain 28 158 -119.50 gain 158 28 -126.19 gain 28 159 -119.31 gain 159 28 -122.63 gain 28 160 -124.97 gain 160 28 -125.39 gain 28 161 -125.09 gain 161 28 -129.01 gain 28 162 -120.02 gain 162 28 -122.80 gain 28 163 -114.43 gain 163 28 -119.36 gain 28 164 -115.45 gain 164 28 -121.42 gain 28 165 -117.82 gain 165 28 -119.83 gain 28 166 -123.46 gain 166 28 -127.04 gain 28 167 -126.27 gain 167 28 -131.94 gain 28 168 -126.00 gain 168 28 -130.12 gain 28 169 -127.15 gain 169 28 -135.47 gain 28 170 -129.38 gain 170 28 -129.23 gain 28 171 -122.65 gain 171 28 -127.52 gain 28 172 -119.38 gain 172 28 -118.95 gain 28 173 -125.61 gain 173 28 -124.61 gain 28 174 -119.65 gain 174 28 -122.95 gain 28 175 -117.70 gain 175 28 -124.55 gain 28 176 -122.78 gain 176 28 -121.64 gain 28 177 -125.10 gain 177 28 -131.78 gain 28 178 -121.37 gain 178 28 -123.87 gain 28 179 -119.08 gain 179 28 -119.98 gain 28 180 -125.63 gain 180 28 -127.99 gain 28 181 -129.32 gain 181 28 -131.75 gain 28 182 -133.48 gain 182 28 -138.29 gain 28 183 -127.90 gain 183 28 -126.11 gain 28 184 -128.56 gain 184 28 -131.55 gain 28 185 -122.47 gain 185 28 -122.94 gain 28 186 -127.51 gain 186 28 -128.27 gain 28 187 -120.67 gain 187 28 -123.97 gain 28 188 -122.18 gain 188 28 -128.74 gain 28 189 -118.26 gain 189 28 -122.33 gain 28 190 -118.71 gain 190 28 -119.80 gain 28 191 -120.35 gain 191 28 -122.52 gain 28 192 -123.93 gain 192 28 -128.97 gain 28 193 -119.40 gain 193 28 -125.69 gain 28 194 -124.11 gain 194 28 -124.21 gain 28 195 -132.81 gain 195 28 -133.55 gain 28 196 -127.61 gain 196 28 -132.38 gain 28 197 -129.67 gain 197 28 -130.51 gain 28 198 -133.35 gain 198 28 -133.70 gain 28 199 -128.37 gain 199 28 -132.65 gain 28 200 -124.69 gain 200 28 -125.90 gain 28 201 -121.15 gain 201 28 -123.17 gain 28 202 -115.76 gain 202 28 -121.78 gain 28 203 -124.80 gain 203 28 -130.44 gain 28 204 -125.02 gain 204 28 -127.94 gain 28 205 -124.91 gain 205 28 -126.91 gain 28 206 -128.14 gain 206 28 -134.66 gain 28 207 -125.89 gain 207 28 -124.77 gain 28 208 -118.95 gain 208 28 -123.61 gain 28 209 -122.04 gain 209 28 -127.69 gain 28 210 -122.81 gain 210 28 -125.40 gain 28 211 -125.57 gain 211 28 -130.18 gain 28 212 -128.37 gain 212 28 -131.52 gain 28 213 -127.22 gain 213 28 -129.56 gain 28 214 -121.59 gain 214 28 -123.82 gain 28 215 -128.51 gain 215 28 -127.16 gain 28 216 -131.53 gain 216 28 -134.84 gain 28 217 -121.49 gain 217 28 -125.32 gain 28 218 -130.26 gain 218 28 -136.28 gain 28 219 -119.46 gain 219 28 -116.83 gain 28 220 -130.58 gain 220 28 -138.45 gain 28 221 -122.24 gain 221 28 -125.75 gain 28 222 -120.53 gain 222 28 -124.37 gain 28 223 -119.92 gain 223 28 -122.36 gain 28 224 -127.05 gain 224 28 -132.19 gain 29 30 -133.83 gain 30 29 -137.30 gain 29 31 -126.74 gain 31 29 -127.82 gain 29 32 -128.66 gain 32 29 -129.78 gain 29 33 -123.70 gain 33 29 -127.06 gain 29 34 -127.52 gain 34 29 -129.49 gain 29 35 -122.51 gain 35 29 -124.31 gain 29 36 -118.35 gain 36 29 -123.92 gain 29 37 -123.32 gain 37 29 -121.10 gain 29 38 -113.47 gain 38 29 -117.26 gain 29 39 -108.21 gain 39 29 -110.87 gain 29 40 -112.67 gain 40 29 -117.37 gain 29 41 -103.45 gain 41 29 -103.79 gain 29 42 -104.78 gain 42 29 -103.27 gain 29 43 -94.22 gain 43 29 -96.60 gain 29 44 -97.69 gain 44 29 -103.13 gain 29 45 -128.93 gain 45 29 -132.84 gain 29 46 -126.84 gain 46 29 -126.54 gain 29 47 -123.29 gain 47 29 -124.06 gain 29 48 -119.54 gain 48 29 -118.09 gain 29 49 -125.01 gain 49 29 -131.54 gain 29 50 -119.75 gain 50 29 -127.24 gain 29 51 -120.06 gain 51 29 -122.69 gain 29 52 -118.00 gain 52 29 -116.65 gain 29 53 -122.41 gain 53 29 -122.07 gain 29 54 -113.67 gain 54 29 -114.03 gain 29 55 -111.49 gain 55 29 -111.15 gain 29 56 -104.31 gain 56 29 -111.30 gain 29 57 -108.49 gain 57 29 -109.35 gain 29 58 -104.09 gain 58 29 -107.69 gain 29 59 -99.83 gain 59 29 -99.56 gain 29 60 -137.16 gain 60 29 -138.21 gain 29 61 -133.44 gain 61 29 -133.25 gain 29 62 -122.80 gain 62 29 -127.82 gain 29 63 -126.01 gain 63 29 -124.26 gain 29 64 -126.05 gain 64 29 -127.27 gain 29 65 -121.87 gain 65 29 -125.18 gain 29 66 -125.21 gain 66 29 -122.78 gain 29 67 -117.58 gain 67 29 -117.42 gain 29 68 -121.58 gain 68 29 -125.98 gain 29 69 -114.20 gain 69 29 -115.89 gain 29 70 -113.73 gain 70 29 -115.18 gain 29 71 -113.64 gain 71 29 -113.19 gain 29 72 -107.17 gain 72 29 -107.14 gain 29 73 -105.90 gain 73 29 -104.26 gain 29 74 -102.92 gain 74 29 -105.15 gain 29 75 -121.03 gain 75 29 -123.40 gain 29 76 -125.95 gain 76 29 -124.28 gain 29 77 -132.73 gain 77 29 -134.73 gain 29 78 -127.51 gain 78 29 -132.36 gain 29 79 -122.00 gain 79 29 -121.62 gain 29 80 -116.33 gain 80 29 -116.45 gain 29 81 -121.95 gain 81 29 -122.67 gain 29 82 -122.05 gain 82 29 -120.40 gain 29 83 -116.51 gain 83 29 -115.89 gain 29 84 -116.31 gain 84 29 -115.84 gain 29 85 -120.02 gain 85 29 -116.35 gain 29 86 -110.91 gain 86 29 -110.63 gain 29 87 -108.70 gain 87 29 -112.38 gain 29 88 -114.48 gain 88 29 -115.91 gain 29 89 -113.52 gain 89 29 -113.54 gain 29 90 -123.99 gain 90 29 -121.02 gain 29 91 -125.77 gain 91 29 -126.75 gain 29 92 -124.69 gain 92 29 -122.63 gain 29 93 -119.17 gain 93 29 -121.90 gain 29 94 -124.04 gain 94 29 -126.64 gain 29 95 -124.23 gain 95 29 -129.09 gain 29 96 -119.51 gain 96 29 -121.71 gain 29 97 -114.22 gain 97 29 -115.15 gain 29 98 -121.26 gain 98 29 -123.00 gain 29 99 -125.32 gain 99 29 -124.87 gain 29 100 -116.28 gain 100 29 -115.40 gain 29 101 -116.66 gain 101 29 -115.95 gain 29 102 -122.41 gain 102 29 -122.48 gain 29 103 -105.76 gain 103 29 -103.31 gain 29 104 -119.12 gain 104 29 -122.05 gain 29 105 -127.39 gain 105 29 -126.26 gain 29 106 -122.74 gain 106 29 -122.69 gain 29 107 -122.97 gain 107 29 -129.49 gain 29 108 -132.73 gain 108 29 -131.57 gain 29 109 -124.21 gain 109 29 -126.54 gain 29 110 -115.50 gain 110 29 -116.30 gain 29 111 -121.54 gain 111 29 -122.02 gain 29 112 -126.78 gain 112 29 -126.14 gain 29 113 -121.05 gain 113 29 -119.21 gain 29 114 -118.56 gain 114 29 -120.03 gain 29 115 -114.65 gain 115 29 -110.41 gain 29 116 -121.01 gain 116 29 -124.32 gain 29 117 -115.69 gain 117 29 -120.50 gain 29 118 -114.70 gain 118 29 -117.83 gain 29 119 -119.06 gain 119 29 -116.85 gain 29 120 -120.08 gain 120 29 -122.39 gain 29 121 -131.28 gain 121 29 -132.88 gain 29 122 -126.85 gain 122 29 -130.56 gain 29 123 -125.61 gain 123 29 -130.10 gain 29 124 -126.96 gain 124 29 -127.86 gain 29 125 -122.74 gain 125 29 -124.98 gain 29 126 -120.75 gain 126 29 -120.93 gain 29 127 -116.76 gain 127 29 -120.41 gain 29 128 -125.50 gain 128 29 -127.09 gain 29 129 -123.75 gain 129 29 -123.25 gain 29 130 -121.22 gain 130 29 -118.54 gain 29 131 -121.27 gain 131 29 -125.67 gain 29 132 -118.23 gain 132 29 -122.26 gain 29 133 -121.79 gain 133 29 -123.90 gain 29 134 -120.29 gain 134 29 -119.09 gain 29 135 -128.39 gain 135 29 -130.76 gain 29 136 -132.36 gain 136 29 -135.34 gain 29 137 -134.90 gain 137 29 -135.37 gain 29 138 -124.02 gain 138 29 -123.49 gain 29 139 -120.18 gain 139 29 -120.64 gain 29 140 -132.14 gain 140 29 -135.20 gain 29 141 -133.84 gain 141 29 -135.58 gain 29 142 -124.17 gain 142 29 -125.21 gain 29 143 -125.34 gain 143 29 -126.00 gain 29 144 -124.07 gain 144 29 -125.74 gain 29 145 -117.04 gain 145 29 -117.17 gain 29 146 -120.21 gain 146 29 -119.24 gain 29 147 -112.83 gain 147 29 -108.95 gain 29 148 -122.44 gain 148 29 -118.28 gain 29 149 -119.93 gain 149 29 -118.94 gain 29 150 -124.15 gain 150 29 -125.84 gain 29 151 -130.48 gain 151 29 -132.37 gain 29 152 -124.17 gain 152 29 -123.03 gain 29 153 -131.47 gain 153 29 -127.91 gain 29 154 -132.60 gain 154 29 -137.60 gain 29 155 -128.80 gain 155 29 -133.69 gain 29 156 -127.29 gain 156 29 -126.57 gain 29 157 -126.32 gain 157 29 -128.54 gain 29 158 -122.18 gain 158 29 -127.00 gain 29 159 -119.75 gain 159 29 -121.19 gain 29 160 -120.10 gain 160 29 -118.65 gain 29 161 -118.36 gain 161 29 -120.40 gain 29 162 -121.04 gain 162 29 -121.94 gain 29 163 -123.19 gain 163 29 -126.24 gain 29 164 -122.67 gain 164 29 -126.76 gain 29 165 -118.67 gain 165 29 -118.80 gain 29 166 -127.22 gain 166 29 -128.92 gain 29 167 -133.06 gain 167 29 -136.85 gain 29 168 -131.92 gain 168 29 -134.16 gain 29 169 -130.35 gain 169 29 -136.79 gain 29 170 -124.74 gain 170 29 -122.70 gain 29 171 -127.52 gain 171 29 -130.51 gain 29 172 -131.27 gain 172 29 -128.95 gain 29 173 -124.83 gain 173 29 -121.95 gain 29 174 -116.76 gain 174 29 -118.18 gain 29 175 -124.43 gain 175 29 -129.40 gain 29 176 -112.50 gain 176 29 -109.49 gain 29 177 -126.63 gain 177 29 -131.43 gain 29 178 -117.76 gain 178 29 -118.38 gain 29 179 -124.65 gain 179 29 -123.66 gain 29 180 -137.13 gain 180 29 -137.61 gain 29 181 -132.91 gain 181 29 -133.46 gain 29 182 -126.12 gain 182 29 -129.05 gain 29 183 -128.05 gain 183 29 -124.37 gain 29 184 -126.27 gain 184 29 -127.37 gain 29 185 -128.36 gain 185 29 -126.95 gain 29 186 -123.42 gain 186 29 -122.30 gain 29 187 -130.01 gain 187 29 -131.42 gain 29 188 -121.50 gain 188 29 -126.18 gain 29 189 -139.34 gain 189 29 -141.53 gain 29 190 -124.07 gain 190 29 -123.27 gain 29 191 -122.95 gain 191 29 -123.25 gain 29 192 -127.56 gain 192 29 -130.72 gain 29 193 -129.29 gain 193 29 -133.71 gain 29 194 -126.96 gain 194 29 -125.18 gain 29 195 -128.95 gain 195 29 -127.81 gain 29 196 -128.50 gain 196 29 -131.40 gain 29 197 -124.11 gain 197 29 -123.07 gain 29 198 -122.30 gain 198 29 -120.78 gain 29 199 -129.57 gain 199 29 -131.97 gain 29 200 -128.48 gain 200 29 -127.82 gain 29 201 -122.59 gain 201 29 -122.73 gain 29 202 -133.07 gain 202 29 -137.21 gain 29 203 -121.34 gain 203 29 -125.11 gain 29 204 -125.86 gain 204 29 -126.90 gain 29 205 -126.24 gain 205 29 -126.35 gain 29 206 -126.15 gain 206 29 -130.79 gain 29 207 -126.44 gain 207 29 -123.44 gain 29 208 -127.51 gain 208 29 -130.29 gain 29 209 -127.50 gain 209 29 -131.27 gain 29 210 -126.23 gain 210 29 -126.94 gain 29 211 -134.00 gain 211 29 -136.73 gain 29 212 -134.54 gain 212 29 -135.81 gain 29 213 -128.48 gain 213 29 -128.95 gain 29 214 -131.19 gain 214 29 -131.54 gain 29 215 -129.30 gain 215 29 -126.06 gain 29 216 -121.96 gain 216 29 -123.39 gain 29 217 -121.96 gain 217 29 -123.91 gain 29 218 -127.89 gain 218 29 -132.02 gain 29 219 -128.20 gain 219 29 -123.69 gain 29 220 -126.89 gain 220 29 -132.88 gain 29 221 -130.76 gain 221 29 -132.39 gain 29 222 -130.59 gain 222 29 -132.55 gain 29 223 -119.17 gain 223 29 -119.74 gain 29 224 -132.20 gain 224 29 -135.45 gain 30 31 -93.40 gain 31 30 -91.02 gain 30 32 -105.78 gain 32 30 -103.43 gain 30 33 -108.82 gain 33 30 -108.72 gain 30 34 -113.44 gain 34 30 -111.94 gain 30 35 -111.85 gain 35 30 -110.18 gain 30 36 -132.93 gain 36 30 -135.04 gain 30 37 -119.92 gain 37 30 -114.22 gain 30 38 -122.84 gain 38 30 -123.17 gain 30 39 -120.83 gain 39 30 -120.02 gain 30 40 -127.36 gain 40 30 -128.60 gain 30 41 -123.08 gain 41 30 -119.95 gain 30 42 -123.34 gain 42 30 -118.36 gain 30 43 -126.66 gain 43 30 -125.56 gain 30 44 -132.03 gain 44 30 -134.00 gain 30 45 -96.71 gain 45 30 -97.15 gain 30 46 -100.02 gain 46 30 -96.26 gain 30 47 -105.81 gain 47 30 -103.10 gain 30 48 -113.99 gain 48 30 -109.07 gain 30 49 -115.37 gain 49 30 -118.43 gain 30 50 -117.79 gain 50 30 -121.81 gain 30 51 -118.71 gain 51 30 -117.87 gain 30 52 -119.65 gain 52 30 -114.83 gain 30 53 -119.92 gain 53 30 -116.12 gain 30 54 -123.87 gain 54 30 -120.77 gain 30 55 -128.18 gain 55 30 -124.37 gain 30 56 -129.80 gain 56 30 -133.32 gain 30 57 -134.51 gain 57 30 -131.91 gain 30 58 -129.11 gain 58 30 -129.24 gain 30 59 -125.71 gain 59 30 -121.97 gain 30 60 -99.33 gain 60 30 -96.91 gain 30 61 -104.28 gain 61 30 -100.62 gain 30 62 -110.35 gain 62 30 -111.91 gain 30 63 -106.39 gain 63 30 -101.17 gain 30 64 -121.98 gain 64 30 -119.73 gain 30 65 -121.81 gain 65 30 -121.65 gain 30 66 -118.50 gain 66 30 -112.60 gain 30 67 -117.48 gain 67 30 -113.85 gain 30 68 -123.75 gain 68 30 -124.67 gain 30 69 -127.57 gain 69 30 -125.80 gain 30 70 -124.06 gain 70 30 -122.04 gain 30 71 -124.22 gain 71 30 -120.30 gain 30 72 -121.52 gain 72 30 -118.02 gain 30 73 -131.43 gain 73 30 -126.32 gain 30 74 -130.98 gain 74 30 -129.75 gain 30 75 -111.13 gain 75 30 -110.04 gain 30 76 -104.63 gain 76 30 -99.49 gain 30 77 -108.91 gain 77 30 -107.44 gain 30 78 -118.38 gain 78 30 -119.75 gain 30 79 -120.04 gain 79 30 -116.19 gain 30 80 -123.86 gain 80 30 -120.51 gain 30 81 -112.07 gain 81 30 -109.31 gain 30 82 -114.71 gain 82 30 -109.59 gain 30 83 -119.13 gain 83 30 -115.04 gain 30 84 -126.12 gain 84 30 -122.18 gain 30 85 -134.23 gain 85 30 -127.10 gain 30 86 -125.82 gain 86 30 -122.06 gain 30 87 -128.95 gain 87 30 -129.16 gain 30 88 -133.65 gain 88 30 -131.61 gain 30 89 -125.66 gain 89 30 -122.22 gain 30 90 -114.62 gain 90 30 -108.19 gain 30 91 -107.57 gain 91 30 -105.08 gain 30 92 -114.73 gain 92 30 -109.20 gain 30 93 -117.29 gain 93 30 -116.55 gain 30 94 -125.67 gain 94 30 -124.80 gain 30 95 -123.74 gain 95 30 -125.12 gain 30 96 -118.10 gain 96 30 -116.83 gain 30 97 -126.75 gain 97 30 -124.22 gain 30 98 -125.60 gain 98 30 -123.87 gain 30 99 -129.44 gain 99 30 -125.53 gain 30 100 -120.86 gain 100 30 -116.51 gain 30 101 -127.96 gain 101 30 -123.78 gain 30 102 -124.81 gain 102 30 -121.41 gain 30 103 -127.91 gain 103 30 -121.99 gain 30 104 -131.52 gain 104 30 -130.97 gain 30 105 -125.58 gain 105 30 -120.98 gain 30 106 -120.14 gain 106 30 -116.62 gain 30 107 -114.17 gain 107 30 -117.23 gain 30 108 -114.47 gain 108 30 -109.84 gain 30 109 -114.50 gain 109 30 -113.36 gain 30 110 -128.96 gain 110 30 -126.29 gain 30 111 -123.24 gain 111 30 -120.25 gain 30 112 -129.98 gain 112 30 -125.87 gain 30 113 -131.45 gain 113 30 -126.15 gain 30 114 -122.11 gain 114 30 -120.11 gain 30 115 -125.71 gain 115 30 -118.01 gain 30 116 -129.44 gain 116 30 -129.28 gain 30 117 -125.43 gain 117 30 -126.77 gain 30 118 -128.97 gain 118 30 -128.63 gain 30 119 -137.34 gain 119 30 -131.66 gain 30 120 -114.47 gain 120 30 -113.31 gain 30 121 -125.92 gain 121 30 -124.05 gain 30 122 -113.12 gain 122 30 -113.36 gain 30 123 -118.69 gain 123 30 -119.71 gain 30 124 -120.35 gain 124 30 -117.78 gain 30 125 -130.60 gain 125 30 -129.37 gain 30 126 -126.87 gain 126 30 -123.59 gain 30 127 -121.58 gain 127 30 -121.76 gain 30 128 -120.62 gain 128 30 -118.74 gain 30 129 -130.69 gain 129 30 -126.72 gain 30 130 -126.58 gain 130 30 -120.44 gain 30 131 -127.20 gain 131 30 -128.14 gain 30 132 -129.28 gain 132 30 -129.85 gain 30 133 -136.21 gain 133 30 -134.85 gain 30 134 -132.66 gain 134 30 -128.00 gain 30 135 -124.26 gain 135 30 -123.17 gain 30 136 -124.23 gain 136 30 -123.75 gain 30 137 -126.01 gain 137 30 -123.01 gain 30 138 -117.87 gain 138 30 -113.87 gain 30 139 -131.96 gain 139 30 -128.95 gain 30 140 -124.87 gain 140 30 -124.46 gain 30 141 -133.96 gain 141 30 -132.22 gain 30 142 -126.26 gain 142 30 -123.83 gain 30 143 -120.90 gain 143 30 -118.09 gain 30 144 -127.90 gain 144 30 -126.11 gain 30 145 -126.92 gain 145 30 -123.57 gain 30 146 -126.75 gain 146 30 -122.32 gain 30 147 -130.63 gain 147 30 -123.28 gain 30 148 -130.13 gain 148 30 -122.50 gain 30 149 -134.81 gain 149 30 -130.35 gain 30 150 -116.70 gain 150 30 -114.92 gain 30 151 -125.61 gain 151 30 -124.03 gain 30 152 -122.41 gain 152 30 -117.81 gain 30 153 -118.18 gain 153 30 -111.16 gain 30 154 -122.61 gain 154 30 -124.14 gain 30 155 -125.75 gain 155 30 -127.17 gain 30 156 -122.35 gain 156 30 -118.16 gain 30 157 -131.92 gain 157 30 -130.68 gain 30 158 -128.39 gain 158 30 -129.74 gain 30 159 -132.18 gain 159 30 -130.15 gain 30 160 -131.03 gain 160 30 -126.11 gain 30 161 -134.70 gain 161 30 -133.27 gain 30 162 -132.49 gain 162 30 -129.92 gain 30 163 -130.67 gain 163 30 -130.25 gain 30 164 -124.37 gain 164 30 -125.00 gain 30 165 -125.63 gain 165 30 -122.29 gain 30 166 -126.92 gain 166 30 -125.16 gain 30 167 -120.65 gain 167 30 -120.97 gain 30 168 -129.39 gain 168 30 -128.16 gain 30 169 -125.31 gain 169 30 -128.28 gain 30 170 -123.17 gain 170 30 -117.67 gain 30 171 -128.81 gain 171 30 -128.33 gain 30 172 -123.26 gain 172 30 -117.48 gain 30 173 -127.91 gain 173 30 -121.56 gain 30 174 -128.23 gain 174 30 -126.19 gain 30 175 -135.57 gain 175 30 -137.08 gain 30 176 -127.97 gain 176 30 -121.49 gain 30 177 -125.97 gain 177 30 -127.30 gain 30 178 -135.73 gain 178 30 -132.88 gain 30 179 -136.97 gain 179 30 -132.52 gain 30 180 -118.18 gain 180 30 -115.19 gain 30 181 -124.03 gain 181 30 -121.11 gain 30 182 -131.59 gain 182 30 -131.05 gain 30 183 -119.28 gain 183 30 -112.13 gain 30 184 -127.47 gain 184 30 -125.11 gain 30 185 -125.38 gain 185 30 -120.51 gain 30 186 -125.83 gain 186 30 -121.24 gain 30 187 -130.56 gain 187 30 -128.51 gain 30 188 -130.79 gain 188 30 -132.00 gain 30 189 -127.95 gain 189 30 -126.67 gain 30 190 -123.99 gain 190 30 -119.73 gain 30 191 -129.98 gain 191 30 -126.81 gain 30 192 -125.10 gain 192 30 -124.79 gain 30 193 -143.27 gain 193 30 -144.21 gain 30 194 -133.31 gain 194 30 -128.07 gain 30 195 -122.74 gain 195 30 -118.13 gain 30 196 -131.59 gain 196 30 -131.02 gain 30 197 -124.46 gain 197 30 -119.95 gain 30 198 -126.09 gain 198 30 -121.11 gain 30 199 -123.05 gain 199 30 -121.98 gain 30 200 -122.38 gain 200 30 -118.24 gain 30 201 -127.56 gain 201 30 -124.23 gain 30 202 -129.19 gain 202 30 -129.86 gain 30 203 -129.97 gain 203 30 -130.27 gain 30 204 -135.30 gain 204 30 -132.87 gain 30 205 -128.78 gain 205 30 -125.44 gain 30 206 -130.71 gain 206 30 -131.88 gain 30 207 -138.91 gain 207 30 -132.44 gain 30 208 -131.32 gain 208 30 -130.63 gain 30 209 -136.03 gain 209 30 -136.33 gain 30 210 -133.84 gain 210 30 -131.08 gain 30 211 -128.37 gain 211 30 -127.63 gain 30 212 -128.28 gain 212 30 -126.08 gain 30 213 -131.41 gain 213 30 -128.40 gain 30 214 -131.16 gain 214 30 -128.04 gain 30 215 -135.21 gain 215 30 -128.51 gain 30 216 -129.74 gain 216 30 -127.70 gain 30 217 -127.44 gain 217 30 -125.92 gain 30 218 -135.42 gain 218 30 -136.09 gain 30 219 -126.51 gain 219 30 -118.53 gain 30 220 -130.64 gain 220 30 -133.16 gain 30 221 -135.44 gain 221 30 -133.60 gain 30 222 -126.36 gain 222 30 -124.85 gain 30 223 -132.52 gain 223 30 -129.62 gain 30 224 -130.21 gain 224 30 -129.99 gain 31 32 -91.39 gain 32 31 -91.42 gain 31 33 -106.70 gain 33 31 -108.98 gain 31 34 -110.28 gain 34 31 -111.16 gain 31 35 -105.43 gain 35 31 -106.14 gain 31 36 -111.53 gain 36 31 -116.02 gain 31 37 -118.61 gain 37 31 -115.30 gain 31 38 -122.96 gain 38 31 -125.67 gain 31 39 -116.08 gain 39 31 -117.66 gain 31 40 -125.43 gain 40 31 -129.05 gain 31 41 -121.47 gain 41 31 -120.72 gain 31 42 -126.80 gain 42 31 -124.21 gain 31 43 -120.56 gain 43 31 -121.85 gain 31 44 -122.18 gain 44 31 -126.54 gain 31 45 -91.46 gain 45 31 -94.29 gain 31 46 -97.38 gain 46 31 -96.00 gain 31 47 -95.71 gain 47 31 -95.39 gain 31 48 -105.30 gain 48 31 -102.77 gain 31 49 -107.62 gain 49 31 -113.06 gain 31 50 -117.30 gain 50 31 -123.71 gain 31 51 -107.67 gain 51 31 -109.21 gain 31 52 -118.33 gain 52 31 -115.89 gain 31 53 -115.32 gain 53 31 -113.90 gain 31 54 -115.98 gain 54 31 -115.26 gain 31 55 -125.29 gain 55 31 -123.87 gain 31 56 -127.79 gain 56 31 -133.70 gain 31 57 -127.19 gain 57 31 -126.97 gain 31 58 -122.37 gain 58 31 -124.89 gain 31 59 -127.05 gain 59 31 -125.70 gain 31 60 -98.65 gain 60 31 -98.62 gain 31 61 -104.81 gain 61 31 -103.53 gain 31 62 -99.75 gain 62 31 -103.69 gain 31 63 -106.73 gain 63 31 -103.89 gain 31 64 -118.32 gain 64 31 -118.46 gain 31 65 -113.66 gain 65 31 -115.89 gain 31 66 -123.09 gain 66 31 -119.57 gain 31 67 -115.65 gain 67 31 -114.41 gain 31 68 -119.77 gain 68 31 -123.09 gain 31 69 -119.97 gain 69 31 -120.57 gain 31 70 -126.25 gain 70 31 -126.61 gain 31 71 -126.25 gain 71 31 -124.72 gain 31 72 -118.83 gain 72 31 -117.72 gain 31 73 -122.62 gain 73 31 -119.90 gain 31 74 -130.41 gain 74 31 -131.56 gain 31 75 -107.39 gain 75 31 -108.69 gain 31 76 -110.47 gain 76 31 -107.71 gain 31 77 -103.78 gain 77 31 -104.69 gain 31 78 -102.34 gain 78 31 -106.10 gain 31 79 -122.05 gain 79 31 -120.59 gain 31 80 -111.44 gain 80 31 -110.49 gain 31 81 -122.92 gain 81 31 -122.55 gain 31 82 -117.42 gain 82 31 -114.68 gain 31 83 -127.45 gain 83 31 -125.75 gain 31 84 -123.00 gain 84 31 -121.44 gain 31 85 -125.40 gain 85 31 -120.65 gain 31 86 -125.38 gain 86 31 -124.01 gain 31 87 -129.05 gain 87 31 -131.64 gain 31 88 -128.23 gain 88 31 -128.57 gain 31 89 -130.69 gain 89 31 -129.64 gain 31 90 -115.72 gain 90 31 -111.68 gain 31 91 -110.53 gain 91 31 -110.43 gain 31 92 -109.48 gain 92 31 -106.34 gain 31 93 -111.30 gain 93 31 -112.94 gain 31 94 -112.91 gain 94 31 -114.43 gain 31 95 -124.88 gain 95 31 -128.65 gain 31 96 -113.55 gain 96 31 -114.66 gain 31 97 -120.35 gain 97 31 -120.21 gain 31 98 -121.03 gain 98 31 -121.68 gain 31 99 -122.26 gain 99 31 -120.74 gain 31 100 -121.51 gain 100 31 -119.55 gain 31 101 -130.60 gain 101 31 -128.80 gain 31 102 -123.83 gain 102 31 -122.81 gain 31 103 -137.65 gain 103 31 -134.12 gain 31 104 -130.95 gain 104 31 -132.79 gain 31 105 -112.39 gain 105 31 -110.17 gain 31 106 -116.72 gain 106 31 -115.59 gain 31 107 -120.81 gain 107 31 -126.25 gain 31 108 -109.55 gain 108 31 -107.30 gain 31 109 -110.51 gain 109 31 -111.76 gain 31 110 -118.62 gain 110 31 -118.33 gain 31 111 -120.36 gain 111 31 -119.75 gain 31 112 -120.11 gain 112 31 -118.38 gain 31 113 -130.16 gain 113 31 -127.24 gain 31 114 -126.79 gain 114 31 -127.17 gain 31 115 -123.88 gain 115 31 -118.57 gain 31 116 -121.36 gain 116 31 -123.59 gain 31 117 -121.63 gain 117 31 -125.35 gain 31 118 -129.21 gain 118 31 -131.26 gain 31 119 -127.60 gain 119 31 -124.31 gain 31 120 -114.26 gain 120 31 -115.49 gain 31 121 -123.20 gain 121 31 -123.71 gain 31 122 -110.22 gain 122 31 -112.85 gain 31 123 -117.71 gain 123 31 -121.12 gain 31 124 -117.54 gain 124 31 -117.35 gain 31 125 -117.60 gain 125 31 -118.76 gain 31 126 -123.93 gain 126 31 -123.04 gain 31 127 -131.39 gain 127 31 -133.95 gain 31 128 -124.53 gain 128 31 -125.04 gain 31 129 -126.15 gain 129 31 -124.56 gain 31 130 -124.15 gain 130 31 -120.39 gain 31 131 -125.40 gain 131 31 -128.73 gain 31 132 -124.30 gain 132 31 -127.25 gain 31 133 -119.88 gain 133 31 -120.90 gain 31 134 -130.36 gain 134 31 -128.08 gain 31 135 -114.50 gain 135 31 -115.79 gain 31 136 -119.37 gain 136 31 -121.27 gain 31 137 -118.41 gain 137 31 -117.79 gain 31 138 -116.67 gain 138 31 -115.06 gain 31 139 -122.22 gain 139 31 -121.59 gain 31 140 -115.45 gain 140 31 -117.43 gain 31 141 -119.35 gain 141 31 -120.00 gain 31 142 -127.47 gain 142 31 -127.43 gain 31 143 -125.67 gain 143 31 -125.25 gain 31 144 -124.98 gain 144 31 -125.57 gain 31 145 -119.46 gain 145 31 -118.50 gain 31 146 -122.14 gain 146 31 -120.09 gain 31 147 -125.72 gain 147 31 -120.76 gain 31 148 -126.74 gain 148 31 -121.50 gain 31 149 -131.24 gain 149 31 -129.17 gain 31 150 -128.51 gain 150 31 -129.12 gain 31 151 -123.60 gain 151 31 -124.41 gain 31 152 -124.00 gain 152 31 -121.78 gain 31 153 -117.77 gain 153 31 -113.13 gain 31 154 -123.08 gain 154 31 -126.99 gain 31 155 -126.32 gain 155 31 -130.12 gain 31 156 -122.67 gain 156 31 -120.86 gain 31 157 -121.28 gain 157 31 -122.42 gain 31 158 -122.63 gain 158 31 -126.36 gain 31 159 -127.17 gain 159 31 -127.52 gain 31 160 -118.84 gain 160 31 -116.30 gain 31 161 -123.27 gain 161 31 -124.22 gain 31 162 -126.92 gain 162 31 -126.74 gain 31 163 -125.06 gain 163 31 -127.03 gain 31 164 -121.62 gain 164 31 -124.63 gain 31 165 -117.98 gain 165 31 -117.03 gain 31 166 -122.54 gain 166 31 -123.16 gain 31 167 -126.79 gain 167 31 -129.50 gain 31 168 -124.82 gain 168 31 -125.98 gain 31 169 -116.62 gain 169 31 -121.97 gain 31 170 -125.74 gain 170 31 -122.62 gain 31 171 -118.18 gain 171 31 -120.08 gain 31 172 -128.38 gain 172 31 -124.99 gain 31 173 -129.12 gain 173 31 -125.16 gain 31 174 -121.65 gain 174 31 -121.98 gain 31 175 -135.52 gain 175 31 -139.41 gain 31 176 -124.33 gain 176 31 -120.23 gain 31 177 -127.45 gain 177 31 -131.17 gain 31 178 -130.26 gain 178 31 -129.80 gain 31 179 -125.57 gain 179 31 -123.50 gain 31 180 -126.86 gain 180 31 -126.26 gain 31 181 -121.54 gain 181 31 -121.01 gain 31 182 -124.33 gain 182 31 -126.18 gain 31 183 -124.77 gain 183 31 -120.02 gain 31 184 -123.19 gain 184 31 -123.21 gain 31 185 -119.67 gain 185 31 -117.18 gain 31 186 -125.56 gain 186 31 -123.35 gain 31 187 -130.46 gain 187 31 -130.80 gain 31 188 -125.51 gain 188 31 -129.10 gain 31 189 -128.71 gain 189 31 -129.82 gain 31 190 -124.81 gain 190 31 -122.93 gain 31 191 -125.09 gain 191 31 -124.30 gain 31 192 -133.47 gain 192 31 -135.54 gain 31 193 -133.64 gain 193 31 -136.97 gain 31 194 -139.34 gain 194 31 -136.48 gain 31 195 -117.11 gain 195 31 -114.89 gain 31 196 -117.62 gain 196 31 -119.44 gain 31 197 -132.51 gain 197 31 -130.39 gain 31 198 -123.89 gain 198 31 -121.29 gain 31 199 -118.59 gain 199 31 -119.91 gain 31 200 -125.20 gain 200 31 -123.45 gain 31 201 -123.08 gain 201 31 -122.14 gain 31 202 -124.37 gain 202 31 -127.42 gain 31 203 -127.81 gain 203 31 -130.49 gain 31 204 -127.42 gain 204 31 -127.38 gain 31 205 -128.29 gain 205 31 -127.33 gain 31 206 -127.19 gain 206 31 -130.75 gain 31 207 -135.43 gain 207 31 -131.35 gain 31 208 -130.70 gain 208 31 -132.40 gain 31 209 -126.69 gain 209 31 -129.37 gain 31 210 -127.53 gain 210 31 -127.15 gain 31 211 -126.18 gain 211 31 -127.82 gain 31 212 -125.30 gain 212 31 -125.49 gain 31 213 -124.13 gain 213 31 -123.51 gain 31 214 -130.27 gain 214 31 -129.54 gain 31 215 -132.80 gain 215 31 -128.49 gain 31 216 -120.98 gain 216 31 -121.33 gain 31 217 -128.14 gain 217 31 -129.00 gain 31 218 -129.22 gain 218 31 -132.28 gain 31 219 -129.85 gain 219 31 -124.26 gain 31 220 -131.36 gain 220 31 -136.26 gain 31 221 -132.74 gain 221 31 -133.28 gain 31 222 -127.08 gain 222 31 -127.95 gain 31 223 -128.17 gain 223 31 -127.65 gain 31 224 -132.48 gain 224 31 -134.66 gain 32 33 -94.74 gain 33 32 -96.99 gain 32 34 -107.48 gain 34 32 -108.33 gain 32 35 -103.73 gain 35 32 -104.41 gain 32 36 -105.50 gain 36 32 -109.96 gain 32 37 -112.31 gain 37 32 -108.97 gain 32 38 -115.68 gain 38 32 -118.36 gain 32 39 -128.21 gain 39 32 -129.76 gain 32 40 -122.94 gain 40 32 -126.53 gain 32 41 -121.47 gain 41 32 -120.69 gain 32 42 -126.85 gain 42 32 -124.23 gain 32 43 -128.56 gain 43 32 -129.82 gain 32 44 -115.53 gain 44 32 -119.85 gain 32 45 -104.47 gain 45 32 -107.27 gain 32 46 -97.80 gain 46 32 -96.39 gain 32 47 -93.09 gain 47 32 -92.74 gain 32 48 -94.83 gain 48 32 -92.27 gain 32 49 -93.77 gain 49 32 -99.19 gain 32 50 -111.50 gain 50 32 -117.88 gain 32 51 -105.64 gain 51 32 -107.15 gain 32 52 -109.99 gain 52 32 -107.53 gain 32 53 -110.05 gain 53 32 -108.60 gain 32 54 -118.86 gain 54 32 -118.11 gain 32 55 -115.65 gain 55 32 -114.20 gain 32 56 -122.64 gain 56 32 -128.51 gain 32 57 -121.79 gain 57 32 -121.54 gain 32 58 -125.59 gain 58 32 -128.08 gain 32 59 -123.36 gain 59 32 -121.97 gain 32 60 -106.39 gain 60 32 -106.33 gain 32 61 -101.03 gain 61 32 -99.72 gain 32 62 -102.89 gain 62 32 -106.79 gain 32 63 -98.94 gain 63 32 -96.08 gain 32 64 -110.93 gain 64 32 -111.03 gain 32 65 -105.92 gain 65 32 -108.12 gain 32 66 -114.53 gain 66 32 -110.98 gain 32 67 -109.69 gain 67 32 -108.42 gain 32 68 -119.90 gain 68 32 -123.18 gain 32 69 -122.57 gain 69 32 -123.15 gain 32 70 -120.34 gain 70 32 -120.67 gain 32 71 -125.21 gain 71 32 -123.65 gain 32 72 -118.50 gain 72 32 -117.35 gain 32 73 -126.08 gain 73 32 -123.33 gain 32 74 -122.80 gain 74 32 -123.92 gain 32 75 -105.66 gain 75 32 -106.93 gain 32 76 -111.97 gain 76 32 -109.19 gain 32 77 -109.17 gain 77 32 -110.05 gain 32 78 -105.23 gain 78 32 -108.96 gain 32 79 -111.83 gain 79 32 -110.34 gain 32 80 -114.09 gain 80 32 -113.10 gain 32 81 -115.89 gain 81 32 -115.49 gain 32 82 -116.83 gain 82 32 -114.06 gain 32 83 -117.96 gain 83 32 -116.22 gain 32 84 -121.19 gain 84 32 -119.60 gain 32 85 -121.29 gain 85 32 -116.51 gain 32 86 -127.15 gain 86 32 -125.75 gain 32 87 -118.77 gain 87 32 -121.33 gain 32 88 -127.50 gain 88 32 -127.82 gain 32 89 -122.76 gain 89 32 -121.67 gain 32 90 -114.41 gain 90 32 -110.33 gain 32 91 -115.90 gain 91 32 -115.76 gain 32 92 -115.59 gain 92 32 -112.42 gain 32 93 -117.19 gain 93 32 -118.80 gain 32 94 -109.24 gain 94 32 -110.73 gain 32 95 -111.70 gain 95 32 -115.45 gain 32 96 -116.75 gain 96 32 -117.84 gain 32 97 -121.09 gain 97 32 -120.92 gain 32 98 -113.15 gain 98 32 -113.77 gain 32 99 -119.11 gain 99 32 -117.55 gain 32 100 -125.10 gain 100 32 -123.11 gain 32 101 -124.51 gain 101 32 -122.68 gain 32 102 -128.82 gain 102 32 -127.77 gain 32 103 -126.98 gain 103 32 -123.41 gain 32 104 -127.49 gain 104 32 -129.31 gain 32 105 -113.18 gain 105 32 -110.93 gain 32 106 -113.55 gain 106 32 -112.39 gain 32 107 -115.72 gain 107 32 -121.12 gain 32 108 -116.43 gain 108 32 -114.16 gain 32 109 -109.34 gain 109 32 -110.56 gain 32 110 -111.41 gain 110 32 -111.10 gain 32 111 -119.46 gain 111 32 -118.82 gain 32 112 -126.37 gain 112 32 -124.61 gain 32 113 -118.68 gain 113 32 -115.73 gain 32 114 -126.61 gain 114 32 -126.96 gain 32 115 -118.49 gain 115 32 -113.14 gain 32 116 -118.62 gain 116 32 -120.82 gain 32 117 -130.93 gain 117 32 -134.63 gain 32 118 -128.42 gain 118 32 -130.44 gain 32 119 -127.67 gain 119 32 -124.35 gain 32 120 -119.26 gain 120 32 -120.45 gain 32 121 -117.16 gain 121 32 -117.65 gain 32 122 -120.60 gain 122 32 -123.19 gain 32 123 -120.69 gain 123 32 -124.06 gain 32 124 -116.42 gain 124 32 -116.20 gain 32 125 -120.48 gain 125 32 -121.60 gain 32 126 -117.18 gain 126 32 -116.26 gain 32 127 -121.13 gain 127 32 -123.66 gain 32 128 -122.66 gain 128 32 -123.14 gain 32 129 -123.89 gain 129 32 -122.28 gain 32 130 -118.56 gain 130 32 -114.77 gain 32 131 -127.44 gain 131 32 -130.73 gain 32 132 -124.69 gain 132 32 -127.61 gain 32 133 -125.11 gain 133 32 -126.10 gain 32 134 -124.62 gain 134 32 -122.31 gain 32 135 -124.60 gain 135 32 -125.86 gain 32 136 -123.58 gain 136 32 -125.45 gain 32 137 -118.16 gain 137 32 -117.52 gain 32 138 -115.51 gain 138 32 -113.86 gain 32 139 -121.25 gain 139 32 -120.59 gain 32 140 -124.14 gain 140 32 -126.09 gain 32 141 -122.07 gain 141 32 -122.69 gain 32 142 -119.82 gain 142 32 -119.74 gain 32 143 -118.16 gain 143 32 -117.70 gain 32 144 -120.67 gain 144 32 -121.23 gain 32 145 -126.95 gain 145 32 -125.96 gain 32 146 -127.59 gain 146 32 -125.51 gain 32 147 -126.53 gain 147 32 -121.54 gain 32 148 -126.91 gain 148 32 -121.64 gain 32 149 -128.93 gain 149 32 -126.82 gain 32 150 -118.39 gain 150 32 -118.97 gain 32 151 -123.56 gain 151 32 -124.33 gain 32 152 -126.89 gain 152 32 -124.65 gain 32 153 -118.39 gain 153 32 -113.72 gain 32 154 -123.72 gain 154 32 -127.60 gain 32 155 -125.40 gain 155 32 -129.17 gain 32 156 -119.77 gain 156 32 -117.94 gain 32 157 -119.60 gain 157 32 -120.71 gain 32 158 -119.91 gain 158 32 -123.61 gain 32 159 -123.00 gain 159 32 -123.32 gain 32 160 -120.45 gain 160 32 -117.89 gain 32 161 -119.95 gain 161 32 -120.88 gain 32 162 -121.50 gain 162 32 -121.29 gain 32 163 -126.48 gain 163 32 -128.42 gain 32 164 -124.92 gain 164 32 -127.89 gain 32 165 -124.19 gain 165 32 -123.21 gain 32 166 -124.10 gain 166 32 -124.69 gain 32 167 -117.67 gain 167 32 -120.35 gain 32 168 -122.00 gain 168 32 -123.13 gain 32 169 -122.59 gain 169 32 -127.92 gain 32 170 -127.29 gain 170 32 -124.14 gain 32 171 -124.40 gain 171 32 -126.28 gain 32 172 -120.76 gain 172 32 -117.33 gain 32 173 -120.46 gain 173 32 -116.46 gain 32 174 -128.32 gain 174 32 -128.62 gain 32 175 -124.98 gain 175 32 -128.84 gain 32 176 -125.73 gain 176 32 -121.61 gain 32 177 -122.85 gain 177 32 -126.53 gain 32 178 -127.90 gain 178 32 -127.41 gain 32 179 -126.52 gain 179 32 -124.42 gain 32 180 -121.83 gain 180 32 -121.20 gain 32 181 -120.49 gain 181 32 -119.93 gain 32 182 -125.00 gain 182 32 -126.82 gain 32 183 -123.88 gain 183 32 -119.09 gain 32 184 -128.58 gain 184 32 -128.57 gain 32 185 -124.86 gain 185 32 -122.34 gain 32 186 -124.51 gain 186 32 -122.27 gain 32 187 -124.14 gain 187 32 -124.45 gain 32 188 -131.15 gain 188 32 -134.71 gain 32 189 -120.02 gain 189 32 -121.10 gain 32 190 -133.59 gain 190 32 -131.67 gain 32 191 -125.99 gain 191 32 -125.17 gain 32 192 -131.09 gain 192 32 -133.14 gain 32 193 -122.85 gain 193 32 -126.15 gain 32 194 -127.53 gain 194 32 -124.64 gain 32 195 -125.80 gain 195 32 -123.55 gain 32 196 -119.61 gain 196 32 -121.40 gain 32 197 -129.61 gain 197 32 -127.45 gain 32 198 -126.27 gain 198 32 -123.63 gain 32 199 -124.16 gain 199 32 -125.44 gain 32 200 -120.02 gain 200 32 -118.24 gain 32 201 -129.25 gain 201 32 -128.27 gain 32 202 -127.59 gain 202 32 -130.62 gain 32 203 -131.39 gain 203 32 -134.04 gain 32 204 -127.09 gain 204 32 -127.03 gain 32 205 -129.00 gain 205 32 -128.01 gain 32 206 -128.73 gain 206 32 -132.26 gain 32 207 -131.91 gain 207 32 -127.80 gain 32 208 -125.43 gain 208 32 -127.09 gain 32 209 -123.31 gain 209 32 -125.97 gain 32 210 -126.91 gain 210 32 -126.51 gain 32 211 -129.81 gain 211 32 -131.42 gain 32 212 -120.01 gain 212 32 -120.16 gain 32 213 -128.78 gain 213 32 -128.13 gain 32 214 -124.84 gain 214 32 -124.08 gain 32 215 -129.77 gain 215 32 -125.43 gain 32 216 -132.02 gain 216 32 -132.33 gain 32 217 -132.06 gain 217 32 -132.89 gain 32 218 -121.52 gain 218 32 -124.55 gain 32 219 -133.70 gain 219 32 -128.08 gain 32 220 -133.64 gain 220 32 -138.51 gain 32 221 -129.00 gain 221 32 -129.51 gain 32 222 -135.17 gain 222 32 -136.01 gain 32 223 -136.44 gain 223 32 -135.90 gain 32 224 -138.95 gain 224 32 -141.10 gain 33 34 -86.89 gain 34 33 -85.49 gain 33 35 -110.65 gain 35 33 -109.08 gain 33 36 -103.84 gain 36 33 -106.05 gain 33 37 -121.82 gain 37 33 -116.23 gain 33 38 -117.36 gain 38 33 -117.79 gain 33 39 -116.28 gain 39 33 -115.58 gain 33 40 -119.05 gain 40 33 -120.39 gain 33 41 -131.25 gain 41 33 -128.22 gain 33 42 -121.72 gain 42 33 -116.84 gain 33 43 -124.20 gain 43 33 -123.21 gain 33 44 -134.27 gain 44 33 -136.34 gain 33 45 -110.53 gain 45 33 -111.08 gain 33 46 -102.33 gain 46 33 -98.67 gain 33 47 -102.04 gain 47 33 -99.44 gain 33 48 -98.50 gain 48 33 -93.69 gain 33 49 -93.88 gain 49 33 -97.04 gain 33 50 -105.42 gain 50 33 -109.54 gain 33 51 -111.45 gain 51 33 -110.72 gain 33 52 -114.93 gain 52 33 -110.22 gain 33 53 -121.05 gain 53 33 -117.35 gain 33 54 -116.97 gain 54 33 -113.97 gain 33 55 -115.05 gain 55 33 -111.34 gain 33 56 -131.15 gain 56 33 -134.78 gain 33 57 -116.23 gain 57 33 -113.73 gain 33 58 -122.26 gain 58 33 -122.50 gain 33 59 -127.24 gain 59 33 -123.61 gain 33 60 -115.56 gain 60 33 -113.25 gain 33 61 -118.61 gain 61 33 -115.05 gain 33 62 -103.45 gain 62 33 -105.11 gain 33 63 -112.50 gain 63 33 -107.38 gain 33 64 -111.09 gain 64 33 -108.95 gain 33 65 -103.79 gain 65 33 -103.74 gain 33 66 -112.37 gain 66 33 -106.57 gain 33 67 -116.95 gain 67 33 -113.42 gain 33 68 -120.90 gain 68 33 -121.93 gain 33 69 -122.23 gain 69 33 -120.56 gain 33 70 -125.19 gain 70 33 -123.27 gain 33 71 -122.01 gain 71 33 -118.20 gain 33 72 -126.67 gain 72 33 -123.27 gain 33 73 -125.11 gain 73 33 -120.11 gain 33 74 -123.64 gain 74 33 -122.52 gain 33 75 -119.18 gain 75 33 -118.19 gain 33 76 -110.62 gain 76 33 -105.58 gain 33 77 -115.09 gain 77 33 -113.72 gain 33 78 -114.99 gain 78 33 -116.46 gain 33 79 -110.34 gain 79 33 -106.60 gain 33 80 -112.03 gain 80 33 -108.79 gain 33 81 -111.71 gain 81 33 -109.06 gain 33 82 -123.25 gain 82 33 -118.23 gain 33 83 -109.98 gain 83 33 -105.99 gain 33 84 -120.25 gain 84 33 -116.41 gain 33 85 -128.51 gain 85 33 -121.48 gain 33 86 -125.89 gain 86 33 -122.24 gain 33 87 -135.01 gain 87 33 -135.32 gain 33 88 -120.25 gain 88 33 -118.31 gain 33 89 -121.83 gain 89 33 -118.49 gain 33 90 -113.19 gain 90 33 -106.87 gain 33 91 -110.87 gain 91 33 -108.49 gain 33 92 -120.25 gain 92 33 -114.83 gain 33 93 -113.85 gain 93 33 -113.22 gain 33 94 -115.89 gain 94 33 -115.13 gain 33 95 -114.44 gain 95 33 -115.94 gain 33 96 -118.33 gain 96 33 -117.16 gain 33 97 -120.20 gain 97 33 -117.78 gain 33 98 -121.65 gain 98 33 -120.03 gain 33 99 -122.65 gain 99 33 -118.85 gain 33 100 -119.70 gain 100 33 -115.46 gain 33 101 -127.81 gain 101 33 -123.74 gain 33 102 -131.32 gain 102 33 -128.02 gain 33 103 -124.61 gain 103 33 -118.80 gain 33 104 -133.76 gain 104 33 -133.32 gain 33 105 -115.56 gain 105 33 -111.06 gain 33 106 -122.12 gain 106 33 -118.71 gain 33 107 -114.09 gain 107 33 -117.25 gain 33 108 -119.55 gain 108 33 -115.02 gain 33 109 -119.19 gain 109 33 -118.15 gain 33 110 -122.28 gain 110 33 -119.71 gain 33 111 -112.00 gain 111 33 -109.11 gain 33 112 -116.03 gain 112 33 -112.02 gain 33 113 -122.00 gain 113 33 -116.79 gain 33 114 -126.75 gain 114 33 -124.85 gain 33 115 -120.63 gain 115 33 -113.03 gain 33 116 -121.16 gain 116 33 -121.11 gain 33 117 -127.85 gain 117 33 -129.30 gain 33 118 -127.54 gain 118 33 -127.31 gain 33 119 -120.41 gain 119 33 -114.84 gain 33 120 -124.72 gain 120 33 -123.66 gain 33 121 -122.53 gain 121 33 -120.76 gain 33 122 -115.06 gain 122 33 -115.41 gain 33 123 -119.58 gain 123 33 -120.70 gain 33 124 -127.40 gain 124 33 -124.93 gain 33 125 -120.72 gain 125 33 -119.59 gain 33 126 -121.59 gain 126 33 -118.42 gain 33 127 -125.75 gain 127 33 -126.04 gain 33 128 -130.34 gain 128 33 -128.56 gain 33 129 -126.19 gain 129 33 -122.32 gain 33 130 -124.75 gain 130 33 -118.71 gain 33 131 -125.43 gain 131 33 -126.47 gain 33 132 -127.32 gain 132 33 -127.99 gain 33 133 -124.10 gain 133 33 -122.84 gain 33 134 -134.32 gain 134 33 -129.77 gain 33 135 -120.88 gain 135 33 -119.89 gain 33 136 -122.27 gain 136 33 -121.89 gain 33 137 -125.46 gain 137 33 -122.56 gain 33 138 -116.83 gain 138 33 -112.93 gain 33 139 -119.57 gain 139 33 -116.66 gain 33 140 -122.45 gain 140 33 -122.15 gain 33 141 -117.42 gain 141 33 -115.79 gain 33 142 -119.90 gain 142 33 -117.58 gain 33 143 -128.40 gain 143 33 -125.70 gain 33 144 -124.04 gain 144 33 -122.35 gain 33 145 -119.75 gain 145 33 -116.51 gain 33 146 -128.13 gain 146 33 -123.80 gain 33 147 -127.83 gain 147 33 -120.58 gain 33 148 -124.45 gain 148 33 -116.93 gain 33 149 -125.65 gain 149 33 -121.29 gain 33 150 -121.70 gain 150 33 -120.03 gain 33 151 -126.54 gain 151 33 -125.07 gain 33 152 -115.61 gain 152 33 -111.11 gain 33 153 -125.04 gain 153 33 -118.12 gain 33 154 -125.12 gain 154 33 -126.74 gain 33 155 -121.22 gain 155 33 -122.74 gain 33 156 -114.23 gain 156 33 -110.14 gain 33 157 -129.57 gain 157 33 -128.42 gain 33 158 -124.98 gain 158 33 -126.44 gain 33 159 -123.34 gain 159 33 -121.41 gain 33 160 -128.45 gain 160 33 -123.63 gain 33 161 -129.16 gain 161 33 -127.84 gain 33 162 -133.69 gain 162 33 -131.22 gain 33 163 -124.91 gain 163 33 -124.59 gain 33 164 -121.92 gain 164 33 -122.65 gain 33 165 -131.79 gain 165 33 -128.55 gain 33 166 -126.50 gain 166 33 -124.84 gain 33 167 -126.56 gain 167 33 -126.99 gain 33 168 -131.47 gain 168 33 -130.35 gain 33 169 -125.43 gain 169 33 -128.50 gain 33 170 -124.77 gain 170 33 -119.37 gain 33 171 -122.46 gain 171 33 -122.09 gain 33 172 -121.06 gain 172 33 -115.39 gain 33 173 -132.99 gain 173 33 -126.74 gain 33 174 -121.36 gain 174 33 -119.42 gain 33 175 -133.24 gain 175 33 -134.85 gain 33 176 -130.29 gain 176 33 -123.91 gain 33 177 -126.22 gain 177 33 -127.65 gain 33 178 -129.21 gain 178 33 -126.47 gain 33 179 -138.33 gain 179 33 -133.98 gain 33 180 -124.29 gain 180 33 -121.41 gain 33 181 -118.45 gain 181 33 -115.64 gain 33 182 -128.50 gain 182 33 -128.07 gain 33 183 -122.56 gain 183 33 -115.52 gain 33 184 -133.85 gain 184 33 -131.59 gain 33 185 -128.36 gain 185 33 -123.59 gain 33 186 -119.24 gain 186 33 -114.75 gain 33 187 -123.56 gain 187 33 -121.61 gain 33 188 -120.83 gain 188 33 -122.14 gain 33 189 -126.86 gain 189 33 -125.69 gain 33 190 -128.73 gain 190 33 -124.57 gain 33 191 -128.20 gain 191 33 -125.13 gain 33 192 -128.39 gain 192 33 -128.19 gain 33 193 -129.99 gain 193 33 -131.04 gain 33 194 -126.42 gain 194 33 -121.28 gain 33 195 -128.01 gain 195 33 -123.51 gain 33 196 -128.94 gain 196 33 -128.47 gain 33 197 -125.02 gain 197 33 -120.61 gain 33 198 -127.58 gain 198 33 -122.70 gain 33 199 -124.70 gain 199 33 -123.73 gain 33 200 -132.83 gain 200 33 -128.80 gain 33 201 -128.05 gain 201 33 -124.83 gain 33 202 -134.29 gain 202 33 -135.07 gain 33 203 -123.07 gain 203 33 -123.47 gain 33 204 -128.42 gain 204 33 -126.10 gain 33 205 -133.58 gain 205 33 -130.33 gain 33 206 -128.41 gain 206 33 -129.68 gain 33 207 -128.89 gain 207 33 -122.52 gain 33 208 -123.26 gain 208 33 -122.67 gain 33 209 -128.02 gain 209 33 -128.43 gain 33 210 -129.54 gain 210 33 -126.88 gain 33 211 -131.22 gain 211 33 -130.58 gain 33 212 -129.06 gain 212 33 -126.96 gain 33 213 -132.75 gain 213 33 -129.85 gain 33 214 -122.32 gain 214 33 -119.31 gain 33 215 -122.57 gain 215 33 -115.97 gain 33 216 -121.64 gain 216 33 -119.70 gain 33 217 -135.07 gain 217 33 -133.65 gain 33 218 -134.14 gain 218 33 -134.91 gain 33 219 -136.00 gain 219 33 -128.13 gain 33 220 -129.80 gain 220 33 -132.43 gain 33 221 -137.01 gain 221 33 -135.28 gain 33 222 -125.70 gain 222 33 -124.29 gain 33 223 -135.75 gain 223 33 -132.95 gain 33 224 -135.92 gain 224 33 -135.81 gain 34 35 -87.55 gain 35 34 -87.38 gain 34 36 -98.34 gain 36 34 -101.94 gain 34 37 -103.67 gain 37 34 -99.47 gain 34 38 -113.09 gain 38 34 -114.92 gain 34 39 -112.68 gain 39 34 -113.38 gain 34 40 -119.16 gain 40 34 -121.90 gain 34 41 -119.12 gain 41 34 -117.49 gain 34 42 -115.91 gain 42 34 -112.43 gain 34 43 -117.11 gain 43 34 -117.52 gain 34 44 -128.31 gain 44 34 -131.77 gain 34 45 -117.18 gain 45 34 -119.12 gain 34 46 -111.73 gain 46 34 -109.46 gain 34 47 -99.32 gain 47 34 -98.12 gain 34 48 -96.54 gain 48 34 -93.12 gain 34 49 -98.05 gain 49 34 -102.61 gain 34 50 -100.29 gain 50 34 -105.81 gain 34 51 -94.92 gain 51 34 -95.58 gain 34 52 -108.28 gain 52 34 -104.96 gain 34 53 -114.93 gain 53 34 -112.62 gain 34 54 -116.64 gain 54 34 -115.04 gain 34 55 -117.52 gain 55 34 -115.22 gain 34 56 -117.13 gain 56 34 -122.15 gain 34 57 -119.35 gain 57 34 -118.24 gain 34 58 -118.83 gain 58 34 -120.46 gain 34 59 -123.09 gain 59 34 -120.85 gain 34 60 -116.99 gain 60 34 -116.07 gain 34 61 -116.01 gain 61 34 -113.84 gain 34 62 -108.99 gain 62 34 -112.04 gain 34 63 -105.20 gain 63 34 -101.48 gain 34 64 -100.58 gain 64 34 -99.83 gain 34 65 -108.58 gain 65 34 -109.92 gain 34 66 -106.65 gain 66 34 -102.24 gain 34 67 -114.76 gain 67 34 -112.63 gain 34 68 -116.13 gain 68 34 -118.56 gain 34 69 -120.23 gain 69 34 -119.96 gain 34 70 -118.50 gain 70 34 -117.98 gain 34 71 -118.64 gain 71 34 -116.23 gain 34 72 -123.91 gain 72 34 -121.91 gain 34 73 -124.51 gain 73 34 -120.91 gain 34 74 -125.07 gain 74 34 -125.34 gain 34 75 -114.02 gain 75 34 -114.43 gain 34 76 -116.09 gain 76 34 -112.45 gain 34 77 -107.01 gain 77 34 -107.03 gain 34 78 -106.82 gain 78 34 -109.69 gain 34 79 -104.53 gain 79 34 -102.19 gain 34 80 -105.64 gain 80 34 -103.80 gain 34 81 -112.76 gain 81 34 -111.51 gain 34 82 -106.43 gain 82 34 -102.80 gain 34 83 -120.00 gain 83 34 -117.41 gain 34 84 -118.17 gain 84 34 -115.73 gain 34 85 -122.60 gain 85 34 -116.96 gain 34 86 -118.23 gain 86 34 -115.97 gain 34 87 -118.24 gain 87 34 -119.95 gain 34 88 -125.30 gain 88 34 -124.76 gain 34 89 -130.95 gain 89 34 -129.01 gain 34 90 -115.23 gain 90 34 -110.30 gain 34 91 -117.00 gain 91 34 -116.02 gain 34 92 -115.04 gain 92 34 -111.02 gain 34 93 -111.08 gain 93 34 -111.84 gain 34 94 -112.64 gain 94 34 -113.28 gain 34 95 -113.59 gain 95 34 -116.48 gain 34 96 -111.04 gain 96 34 -111.26 gain 34 97 -111.63 gain 97 34 -110.60 gain 34 98 -117.03 gain 98 34 -116.80 gain 34 99 -121.03 gain 99 34 -118.62 gain 34 100 -121.56 gain 100 34 -118.72 gain 34 101 -126.18 gain 101 34 -123.50 gain 34 102 -122.00 gain 102 34 -120.10 gain 34 103 -127.93 gain 103 34 -123.51 gain 34 104 -126.69 gain 104 34 -127.65 gain 34 105 -123.53 gain 105 34 -120.44 gain 34 106 -120.82 gain 106 34 -118.80 gain 34 107 -121.42 gain 107 34 -125.97 gain 34 108 -119.37 gain 108 34 -116.24 gain 34 109 -117.45 gain 109 34 -117.81 gain 34 110 -112.73 gain 110 34 -111.56 gain 34 111 -119.81 gain 111 34 -118.31 gain 34 112 -118.12 gain 112 34 -115.51 gain 34 113 -110.28 gain 113 34 -106.47 gain 34 114 -121.18 gain 114 34 -120.67 gain 34 115 -122.81 gain 115 34 -116.60 gain 34 116 -127.24 gain 116 34 -128.58 gain 34 117 -127.40 gain 117 34 -130.24 gain 34 118 -125.90 gain 118 34 -127.06 gain 34 119 -126.94 gain 119 34 -122.77 gain 34 120 -122.64 gain 120 34 -122.98 gain 34 121 -126.69 gain 121 34 -126.32 gain 34 122 -113.91 gain 122 34 -115.65 gain 34 123 -114.25 gain 123 34 -116.77 gain 34 124 -120.44 gain 124 34 -119.37 gain 34 125 -119.29 gain 125 34 -119.55 gain 34 126 -113.39 gain 126 34 -111.61 gain 34 127 -116.22 gain 127 34 -117.90 gain 34 128 -123.07 gain 128 34 -122.69 gain 34 129 -122.43 gain 129 34 -119.95 gain 34 130 -114.80 gain 130 34 -110.15 gain 34 131 -133.24 gain 131 34 -135.68 gain 34 132 -127.45 gain 132 34 -129.51 gain 34 133 -121.92 gain 133 34 -122.05 gain 34 134 -122.06 gain 134 34 -118.90 gain 34 135 -122.39 gain 135 34 -122.79 gain 34 136 -118.47 gain 136 34 -119.49 gain 34 137 -120.96 gain 137 34 -119.46 gain 34 138 -125.35 gain 138 34 -122.85 gain 34 139 -120.66 gain 139 34 -119.15 gain 34 140 -121.31 gain 140 34 -122.40 gain 34 141 -121.96 gain 141 34 -121.73 gain 34 142 -114.02 gain 142 34 -113.09 gain 34 143 -116.67 gain 143 34 -115.36 gain 34 144 -115.11 gain 144 34 -114.81 gain 34 145 -123.27 gain 145 34 -121.43 gain 34 146 -118.71 gain 146 34 -115.77 gain 34 147 -128.93 gain 147 34 -123.09 gain 34 148 -123.01 gain 148 34 -116.88 gain 34 149 -131.27 gain 149 34 -128.31 gain 34 150 -125.77 gain 150 34 -125.49 gain 34 151 -125.95 gain 151 34 -125.88 gain 34 152 -110.29 gain 152 34 -107.19 gain 34 153 -124.85 gain 153 34 -119.32 gain 34 154 -123.01 gain 154 34 -126.04 gain 34 155 -123.07 gain 155 34 -125.99 gain 34 156 -121.55 gain 156 34 -118.86 gain 34 157 -119.47 gain 157 34 -119.72 gain 34 158 -125.23 gain 158 34 -128.07 gain 34 159 -116.48 gain 159 34 -115.95 gain 34 160 -122.61 gain 160 34 -119.18 gain 34 161 -130.61 gain 161 34 -130.67 gain 34 162 -123.40 gain 162 34 -122.34 gain 34 163 -118.13 gain 163 34 -119.22 gain 34 164 -127.68 gain 164 34 -129.81 gain 34 165 -118.87 gain 165 34 -117.03 gain 34 166 -121.45 gain 166 34 -121.18 gain 34 167 -112.90 gain 167 34 -114.72 gain 34 168 -119.75 gain 168 34 -120.03 gain 34 169 -128.52 gain 169 34 -132.99 gain 34 170 -128.25 gain 170 34 -124.25 gain 34 171 -121.10 gain 171 34 -122.13 gain 34 172 -123.77 gain 172 34 -119.48 gain 34 173 -121.14 gain 173 34 -116.29 gain 34 174 -125.37 gain 174 34 -124.82 gain 34 175 -127.45 gain 175 34 -130.45 gain 34 176 -129.92 gain 176 34 -124.94 gain 34 177 -131.46 gain 177 34 -134.29 gain 34 178 -126.41 gain 178 34 -125.06 gain 34 179 -128.16 gain 179 34 -125.20 gain 34 180 -122.95 gain 180 34 -121.46 gain 34 181 -121.56 gain 181 34 -120.14 gain 34 182 -126.08 gain 182 34 -127.05 gain 34 183 -123.82 gain 183 34 -118.17 gain 34 184 -118.74 gain 184 34 -117.88 gain 34 185 -135.90 gain 185 34 -132.52 gain 34 186 -122.24 gain 186 34 -119.15 gain 34 187 -120.62 gain 187 34 -120.07 gain 34 188 -120.81 gain 188 34 -123.52 gain 34 189 -128.38 gain 189 34 -128.60 gain 34 190 -123.98 gain 190 34 -121.21 gain 34 191 -126.52 gain 191 34 -124.85 gain 34 192 -129.32 gain 192 34 -130.51 gain 34 193 -116.30 gain 193 34 -118.74 gain 34 194 -131.27 gain 194 34 -127.52 gain 34 195 -124.74 gain 195 34 -121.63 gain 34 196 -128.79 gain 196 34 -129.72 gain 34 197 -131.61 gain 197 34 -128.60 gain 34 198 -131.85 gain 198 34 -128.36 gain 34 199 -129.34 gain 199 34 -129.77 gain 34 200 -129.55 gain 200 34 -126.91 gain 34 201 -124.29 gain 201 34 -122.46 gain 34 202 -125.49 gain 202 34 -127.66 gain 34 203 -127.25 gain 203 34 -129.05 gain 34 204 -132.36 gain 204 34 -131.44 gain 34 205 -124.83 gain 205 34 -122.98 gain 34 206 -127.62 gain 206 34 -130.29 gain 34 207 -133.02 gain 207 34 -128.06 gain 34 208 -126.79 gain 208 34 -127.60 gain 34 209 -126.82 gain 209 34 -128.62 gain 34 210 -123.19 gain 210 34 -121.93 gain 34 211 -127.76 gain 211 34 -128.52 gain 34 212 -134.10 gain 212 34 -133.40 gain 34 213 -127.06 gain 213 34 -125.56 gain 34 214 -130.98 gain 214 34 -129.36 gain 34 215 -125.79 gain 215 34 -120.59 gain 34 216 -129.32 gain 216 34 -128.78 gain 34 217 -120.35 gain 217 34 -120.33 gain 34 218 -128.68 gain 218 34 -130.85 gain 34 219 -125.52 gain 219 34 -119.05 gain 34 220 -125.48 gain 220 34 -129.50 gain 34 221 -126.02 gain 221 34 -125.68 gain 34 222 -131.57 gain 222 34 -131.56 gain 34 223 -121.13 gain 223 34 -119.73 gain 34 224 -121.39 gain 224 34 -122.68 gain 35 36 -97.32 gain 36 35 -101.10 gain 35 37 -105.27 gain 37 35 -101.25 gain 35 38 -107.35 gain 38 35 -109.35 gain 35 39 -104.58 gain 39 35 -105.45 gain 35 40 -116.17 gain 40 35 -119.09 gain 35 41 -119.28 gain 41 35 -117.82 gain 35 42 -117.24 gain 42 35 -113.93 gain 35 43 -119.95 gain 43 35 -120.53 gain 35 44 -134.50 gain 44 35 -138.14 gain 35 45 -118.77 gain 45 35 -120.89 gain 35 46 -117.72 gain 46 35 -115.63 gain 35 47 -110.98 gain 47 35 -109.95 gain 35 48 -106.75 gain 48 35 -103.51 gain 35 49 -94.99 gain 49 35 -99.72 gain 35 50 -90.77 gain 50 35 -96.46 gain 35 51 -97.59 gain 51 35 -98.43 gain 35 52 -109.78 gain 52 35 -106.63 gain 35 53 -107.89 gain 53 35 -105.76 gain 35 54 -104.93 gain 54 35 -103.50 gain 35 55 -114.88 gain 55 35 -112.75 gain 35 56 -115.43 gain 56 35 -120.63 gain 35 57 -123.93 gain 57 35 -123.00 gain 35 58 -116.02 gain 58 35 -117.83 gain 35 59 -127.94 gain 59 35 -125.88 gain 35 60 -112.52 gain 60 35 -111.78 gain 35 61 -112.74 gain 61 35 -110.74 gain 35 62 -118.36 gain 62 35 -121.59 gain 35 63 -109.75 gain 63 35 -106.20 gain 35 64 -104.68 gain 64 35 -104.11 gain 35 65 -102.98 gain 65 35 -104.50 gain 35 66 -105.12 gain 66 35 -100.89 gain 35 67 -100.92 gain 67 35 -98.96 gain 35 68 -111.93 gain 68 35 -114.53 gain 35 69 -113.50 gain 69 35 -113.39 gain 35 70 -117.61 gain 70 35 -117.27 gain 35 71 -119.41 gain 71 35 -117.17 gain 35 72 -124.52 gain 72 35 -122.70 gain 35 73 -122.59 gain 73 35 -119.15 gain 35 74 -126.82 gain 74 35 -127.26 gain 35 75 -120.41 gain 75 35 -120.99 gain 35 76 -119.33 gain 76 35 -115.87 gain 35 77 -114.59 gain 77 35 -114.79 gain 35 78 -120.80 gain 78 35 -123.85 gain 35 79 -109.44 gain 79 35 -107.27 gain 35 80 -119.20 gain 80 35 -117.53 gain 35 81 -104.89 gain 81 35 -103.82 gain 35 82 -115.31 gain 82 35 -111.86 gain 35 83 -115.55 gain 83 35 -113.13 gain 35 84 -113.22 gain 84 35 -110.95 gain 35 85 -130.48 gain 85 35 -125.02 gain 35 86 -124.11 gain 86 35 -122.03 gain 35 87 -119.41 gain 87 35 -121.29 gain 35 88 -127.67 gain 88 35 -127.30 gain 35 89 -121.54 gain 89 35 -119.77 gain 35 90 -118.76 gain 90 35 -114.01 gain 35 91 -113.79 gain 91 35 -112.98 gain 35 92 -121.31 gain 92 35 -117.46 gain 35 93 -120.70 gain 93 35 -121.63 gain 35 94 -115.75 gain 94 35 -116.56 gain 35 95 -117.14 gain 95 35 -120.20 gain 35 96 -112.09 gain 96 35 -112.49 gain 35 97 -117.03 gain 97 35 -116.18 gain 35 98 -112.74 gain 98 35 -112.68 gain 35 99 -114.36 gain 99 35 -112.13 gain 35 100 -118.04 gain 100 35 -115.37 gain 35 101 -116.05 gain 101 35 -113.55 gain 35 102 -124.64 gain 102 35 -122.91 gain 35 103 -126.29 gain 103 35 -122.05 gain 35 104 -125.64 gain 104 35 -126.77 gain 35 105 -117.20 gain 105 35 -114.27 gain 35 106 -130.08 gain 106 35 -128.24 gain 35 107 -113.85 gain 107 35 -118.57 gain 35 108 -111.34 gain 108 35 -108.39 gain 35 109 -119.07 gain 109 35 -119.60 gain 35 110 -113.62 gain 110 35 -112.62 gain 35 111 -118.30 gain 111 35 -116.98 gain 35 112 -115.39 gain 112 35 -112.95 gain 35 113 -117.14 gain 113 35 -113.51 gain 35 114 -121.76 gain 114 35 -121.43 gain 35 115 -120.66 gain 115 35 -114.64 gain 35 116 -117.15 gain 116 35 -118.66 gain 35 117 -118.41 gain 117 35 -121.42 gain 35 118 -123.67 gain 118 35 -125.01 gain 35 119 -122.09 gain 119 35 -118.09 gain 35 120 -119.62 gain 120 35 -120.13 gain 35 121 -119.66 gain 121 35 -119.46 gain 35 122 -121.26 gain 122 35 -123.18 gain 35 123 -115.91 gain 123 35 -118.60 gain 35 124 -115.42 gain 124 35 -114.53 gain 35 125 -114.66 gain 125 35 -115.10 gain 35 126 -120.00 gain 126 35 -118.40 gain 35 127 -115.40 gain 127 35 -117.26 gain 35 128 -119.47 gain 128 35 -119.27 gain 35 129 -122.15 gain 129 35 -119.85 gain 35 130 -122.40 gain 130 35 -117.92 gain 35 131 -117.08 gain 131 35 -119.70 gain 35 132 -129.36 gain 132 35 -131.60 gain 35 133 -123.87 gain 133 35 -124.18 gain 35 134 -126.45 gain 134 35 -123.47 gain 35 135 -118.84 gain 135 35 -119.42 gain 35 136 -117.60 gain 136 35 -118.79 gain 35 137 -117.85 gain 137 35 -116.53 gain 35 138 -121.48 gain 138 35 -119.16 gain 35 139 -119.17 gain 139 35 -117.83 gain 35 140 -123.75 gain 140 35 -125.02 gain 35 141 -113.95 gain 141 35 -113.89 gain 35 142 -117.75 gain 142 35 -117.00 gain 35 143 -110.05 gain 143 35 -108.91 gain 35 144 -123.64 gain 144 35 -123.52 gain 35 145 -125.46 gain 145 35 -123.79 gain 35 146 -124.00 gain 146 35 -121.24 gain 35 147 -124.99 gain 147 35 -119.32 gain 35 148 -129.06 gain 148 35 -123.11 gain 35 149 -124.52 gain 149 35 -121.73 gain 35 150 -115.83 gain 150 35 -115.73 gain 35 151 -118.52 gain 151 35 -118.61 gain 35 152 -119.29 gain 152 35 -116.36 gain 35 153 -121.79 gain 153 35 -116.44 gain 35 154 -126.90 gain 154 35 -130.10 gain 35 155 -116.38 gain 155 35 -119.48 gain 35 156 -122.20 gain 156 35 -119.68 gain 35 157 -119.58 gain 157 35 -120.01 gain 35 158 -120.49 gain 158 35 -123.51 gain 35 159 -121.09 gain 159 35 -120.73 gain 35 160 -131.13 gain 160 35 -127.88 gain 35 161 -122.32 gain 161 35 -122.56 gain 35 162 -119.49 gain 162 35 -118.60 gain 35 163 -124.48 gain 163 35 -125.74 gain 35 164 -124.16 gain 164 35 -126.46 gain 35 165 -125.45 gain 165 35 -123.78 gain 35 166 -129.05 gain 166 35 -128.96 gain 35 167 -124.18 gain 167 35 -126.18 gain 35 168 -122.74 gain 168 35 -123.18 gain 35 169 -133.78 gain 169 35 -138.43 gain 35 170 -124.65 gain 170 35 -120.82 gain 35 171 -122.02 gain 171 35 -123.22 gain 35 172 -120.23 gain 172 35 -116.13 gain 35 173 -122.49 gain 173 35 -117.82 gain 35 174 -121.25 gain 174 35 -120.87 gain 35 175 -119.70 gain 175 35 -122.88 gain 35 176 -126.64 gain 176 35 -121.83 gain 35 177 -131.39 gain 177 35 -134.39 gain 35 178 -120.01 gain 178 35 -118.84 gain 35 179 -123.05 gain 179 35 -120.27 gain 35 180 -128.65 gain 180 35 -127.34 gain 35 181 -117.51 gain 181 35 -116.27 gain 35 182 -125.90 gain 182 35 -127.04 gain 35 183 -121.84 gain 183 35 -116.38 gain 35 184 -130.95 gain 184 35 -130.27 gain 35 185 -119.92 gain 185 35 -116.72 gain 35 186 -120.83 gain 186 35 -117.91 gain 35 187 -124.02 gain 187 35 -123.65 gain 35 188 -124.80 gain 188 35 -127.69 gain 35 189 -126.46 gain 189 35 -126.86 gain 35 190 -119.91 gain 190 35 -117.32 gain 35 191 -128.46 gain 191 35 -126.96 gain 35 192 -127.56 gain 192 35 -128.93 gain 35 193 -126.40 gain 193 35 -129.02 gain 35 194 -130.56 gain 194 35 -126.99 gain 35 195 -133.29 gain 195 35 -130.35 gain 35 196 -127.45 gain 196 35 -128.56 gain 35 197 -120.96 gain 197 35 -118.13 gain 35 198 -123.10 gain 198 35 -119.79 gain 35 199 -128.90 gain 199 35 -129.50 gain 35 200 -127.44 gain 200 35 -124.98 gain 35 201 -125.20 gain 201 35 -123.54 gain 35 202 -119.86 gain 202 35 -122.21 gain 35 203 -128.29 gain 203 35 -130.25 gain 35 204 -124.53 gain 204 35 -123.78 gain 35 205 -125.58 gain 205 35 -123.90 gain 35 206 -126.44 gain 206 35 -129.29 gain 35 207 -126.08 gain 207 35 -121.29 gain 35 208 -124.36 gain 208 35 -125.34 gain 35 209 -125.20 gain 209 35 -127.17 gain 35 210 -130.75 gain 210 35 -129.67 gain 35 211 -131.16 gain 211 35 -132.10 gain 35 212 -124.74 gain 212 35 -124.22 gain 35 213 -130.30 gain 213 35 -128.97 gain 35 214 -126.42 gain 214 35 -124.98 gain 35 215 -129.37 gain 215 35 -124.34 gain 35 216 -132.15 gain 216 35 -131.79 gain 35 217 -125.53 gain 217 35 -125.68 gain 35 218 -128.83 gain 218 35 -131.17 gain 35 219 -122.30 gain 219 35 -116.00 gain 35 220 -131.08 gain 220 35 -135.27 gain 35 221 -130.15 gain 221 35 -129.99 gain 35 222 -132.23 gain 222 35 -132.39 gain 35 223 -123.37 gain 223 35 -122.14 gain 35 224 -135.13 gain 224 35 -136.59 gain 36 37 -100.68 gain 37 36 -92.88 gain 36 38 -113.49 gain 38 36 -111.71 gain 36 39 -117.31 gain 39 36 -114.39 gain 36 40 -123.52 gain 40 36 -122.65 gain 36 41 -123.21 gain 41 36 -117.98 gain 36 42 -114.29 gain 42 36 -107.20 gain 36 43 -123.66 gain 43 36 -120.46 gain 36 44 -122.13 gain 44 36 -121.99 gain 36 45 -115.07 gain 45 36 -113.41 gain 36 46 -121.89 gain 46 36 -116.02 gain 36 47 -118.69 gain 47 36 -113.88 gain 36 48 -113.05 gain 48 36 -106.03 gain 36 49 -103.45 gain 49 36 -104.40 gain 36 50 -100.82 gain 50 36 -102.74 gain 36 51 -96.60 gain 51 36 -93.65 gain 36 52 -105.09 gain 52 36 -98.17 gain 36 53 -109.26 gain 53 36 -103.35 gain 36 54 -108.79 gain 54 36 -103.58 gain 36 55 -109.50 gain 55 36 -103.59 gain 36 56 -120.64 gain 56 36 -122.05 gain 36 57 -119.85 gain 57 36 -115.13 gain 36 58 -128.03 gain 58 36 -126.06 gain 36 59 -127.00 gain 59 36 -121.15 gain 36 60 -119.12 gain 60 36 -114.60 gain 36 61 -123.43 gain 61 36 -117.66 gain 36 62 -113.86 gain 62 36 -113.31 gain 36 63 -110.32 gain 63 36 -102.99 gain 36 64 -102.46 gain 64 36 -98.11 gain 36 65 -105.99 gain 65 36 -103.73 gain 36 66 -110.90 gain 66 36 -102.89 gain 36 67 -115.49 gain 67 36 -109.75 gain 36 68 -113.85 gain 68 36 -112.67 gain 36 69 -113.90 gain 69 36 -110.01 gain 36 70 -117.35 gain 70 36 -113.22 gain 36 71 -119.88 gain 71 36 -113.86 gain 36 72 -124.57 gain 72 36 -118.97 gain 36 73 -123.68 gain 73 36 -116.47 gain 36 74 -122.84 gain 74 36 -119.51 gain 36 75 -121.60 gain 75 36 -118.40 gain 36 76 -121.00 gain 76 36 -113.76 gain 36 77 -117.76 gain 77 36 -114.18 gain 36 78 -110.38 gain 78 36 -109.64 gain 36 79 -113.06 gain 79 36 -107.10 gain 36 80 -113.97 gain 80 36 -108.52 gain 36 81 -112.35 gain 81 36 -107.49 gain 36 82 -107.61 gain 82 36 -100.38 gain 36 83 -117.21 gain 83 36 -111.01 gain 36 84 -116.41 gain 84 36 -110.36 gain 36 85 -117.21 gain 85 36 -107.97 gain 36 86 -123.86 gain 86 36 -118.00 gain 36 87 -120.31 gain 87 36 -118.41 gain 36 88 -124.57 gain 88 36 -120.42 gain 36 89 -123.52 gain 89 36 -117.97 gain 36 90 -132.54 gain 90 36 -124.00 gain 36 91 -130.81 gain 91 36 -126.21 gain 36 92 -118.44 gain 92 36 -110.81 gain 36 93 -120.23 gain 93 36 -117.38 gain 36 94 -114.21 gain 94 36 -111.24 gain 36 95 -119.30 gain 95 36 -118.58 gain 36 96 -113.73 gain 96 36 -110.35 gain 36 97 -114.07 gain 97 36 -109.43 gain 36 98 -119.33 gain 98 36 -115.49 gain 36 99 -125.20 gain 99 36 -119.18 gain 36 100 -123.31 gain 100 36 -116.86 gain 36 101 -119.59 gain 101 36 -113.30 gain 36 102 -119.54 gain 102 36 -114.04 gain 36 103 -128.06 gain 103 36 -120.04 gain 36 104 -130.84 gain 104 36 -128.19 gain 36 105 -124.31 gain 105 36 -117.60 gain 36 106 -126.02 gain 106 36 -120.40 gain 36 107 -124.34 gain 107 36 -125.29 gain 36 108 -121.27 gain 108 36 -114.54 gain 36 109 -119.42 gain 109 36 -116.17 gain 36 110 -124.38 gain 110 36 -119.60 gain 36 111 -117.36 gain 111 36 -112.26 gain 36 112 -115.23 gain 112 36 -109.02 gain 36 113 -115.23 gain 113 36 -107.82 gain 36 114 -121.80 gain 114 36 -117.69 gain 36 115 -123.32 gain 115 36 -113.51 gain 36 116 -122.80 gain 116 36 -120.54 gain 36 117 -122.96 gain 117 36 -122.19 gain 36 118 -123.33 gain 118 36 -120.89 gain 36 119 -122.13 gain 119 36 -114.35 gain 36 120 -124.21 gain 120 36 -120.94 gain 36 121 -128.06 gain 121 36 -124.08 gain 36 122 -116.94 gain 122 36 -115.08 gain 36 123 -122.65 gain 123 36 -121.56 gain 36 124 -124.06 gain 124 36 -119.39 gain 36 125 -118.83 gain 125 36 -115.49 gain 36 126 -126.22 gain 126 36 -120.84 gain 36 127 -121.57 gain 127 36 -119.64 gain 36 128 -126.24 gain 128 36 -122.26 gain 36 129 -122.46 gain 129 36 -116.38 gain 36 130 -129.73 gain 130 36 -121.47 gain 36 131 -124.10 gain 131 36 -122.93 gain 36 132 -120.58 gain 132 36 -119.04 gain 36 133 -128.57 gain 133 36 -125.10 gain 36 134 -130.18 gain 134 36 -123.41 gain 36 135 -128.64 gain 135 36 -125.44 gain 36 136 -120.68 gain 136 36 -118.09 gain 36 137 -132.34 gain 137 36 -127.24 gain 36 138 -129.62 gain 138 36 -123.51 gain 36 139 -119.61 gain 139 36 -114.49 gain 36 140 -128.53 gain 140 36 -126.02 gain 36 141 -124.46 gain 141 36 -120.62 gain 36 142 -119.20 gain 142 36 -114.67 gain 36 143 -120.10 gain 143 36 -115.18 gain 36 144 -122.45 gain 144 36 -118.55 gain 36 145 -126.49 gain 145 36 -121.04 gain 36 146 -124.34 gain 146 36 -117.80 gain 36 147 -128.44 gain 147 36 -118.99 gain 36 148 -128.75 gain 148 36 -119.02 gain 36 149 -124.81 gain 149 36 -118.24 gain 36 150 -123.99 gain 150 36 -120.10 gain 36 151 -125.06 gain 151 36 -121.37 gain 36 152 -131.87 gain 152 36 -125.16 gain 36 153 -131.86 gain 153 36 -122.73 gain 36 154 -119.23 gain 154 36 -118.65 gain 36 155 -126.47 gain 155 36 -125.79 gain 36 156 -123.49 gain 156 36 -117.19 gain 36 157 -125.29 gain 157 36 -121.94 gain 36 158 -120.63 gain 158 36 -119.87 gain 36 159 -127.90 gain 159 36 -123.76 gain 36 160 -128.20 gain 160 36 -121.17 gain 36 161 -133.27 gain 161 36 -129.73 gain 36 162 -121.00 gain 162 36 -116.33 gain 36 163 -128.73 gain 163 36 -126.21 gain 36 164 -129.80 gain 164 36 -128.31 gain 36 165 -127.63 gain 165 36 -122.18 gain 36 166 -127.97 gain 166 36 -124.09 gain 36 167 -129.40 gain 167 36 -127.62 gain 36 168 -128.37 gain 168 36 -125.04 gain 36 169 -133.12 gain 169 36 -133.98 gain 36 170 -131.72 gain 170 36 -124.12 gain 36 171 -128.96 gain 171 36 -126.37 gain 36 172 -127.34 gain 172 36 -119.45 gain 36 173 -126.82 gain 173 36 -118.37 gain 36 174 -122.14 gain 174 36 -117.98 gain 36 175 -127.97 gain 175 36 -127.37 gain 36 176 -129.76 gain 176 36 -121.17 gain 36 177 -128.67 gain 177 36 -127.89 gain 36 178 -133.80 gain 178 36 -128.85 gain 36 179 -139.76 gain 179 36 -133.20 gain 36 180 -128.99 gain 180 36 -123.90 gain 36 181 -140.34 gain 181 36 -135.32 gain 36 182 -134.45 gain 182 36 -131.81 gain 36 183 -127.21 gain 183 36 -117.96 gain 36 184 -126.66 gain 184 36 -122.19 gain 36 185 -118.44 gain 185 36 -111.46 gain 36 186 -125.30 gain 186 36 -118.61 gain 36 187 -125.92 gain 187 36 -121.76 gain 36 188 -135.00 gain 188 36 -134.11 gain 36 189 -125.49 gain 189 36 -122.11 gain 36 190 -131.92 gain 190 36 -125.55 gain 36 191 -125.46 gain 191 36 -120.18 gain 36 192 -138.06 gain 192 36 -135.65 gain 36 193 -120.03 gain 193 36 -118.87 gain 36 194 -126.70 gain 194 36 -119.35 gain 36 195 -128.17 gain 195 36 -121.46 gain 36 196 -137.92 gain 196 36 -135.24 gain 36 197 -133.81 gain 197 36 -127.20 gain 36 198 -127.41 gain 198 36 -120.31 gain 36 199 -126.03 gain 199 36 -122.86 gain 36 200 -128.04 gain 200 36 -121.80 gain 36 201 -127.35 gain 201 36 -121.91 gain 36 202 -127.39 gain 202 36 -125.95 gain 36 203 -126.48 gain 203 36 -124.67 gain 36 204 -129.70 gain 204 36 -125.17 gain 36 205 -132.32 gain 205 36 -126.87 gain 36 206 -129.31 gain 206 36 -128.38 gain 36 207 -130.99 gain 207 36 -122.41 gain 36 208 -129.50 gain 208 36 -126.70 gain 36 209 -132.60 gain 209 36 -130.79 gain 36 210 -127.63 gain 210 36 -122.76 gain 36 211 -129.09 gain 211 36 -126.25 gain 36 212 -133.20 gain 212 36 -128.89 gain 36 213 -136.06 gain 213 36 -130.95 gain 36 214 -133.51 gain 214 36 -128.28 gain 36 215 -127.96 gain 215 36 -119.16 gain 36 216 -128.53 gain 216 36 -124.38 gain 36 217 -128.10 gain 217 36 -124.47 gain 36 218 -134.70 gain 218 36 -133.27 gain 36 219 -132.80 gain 219 36 -122.72 gain 36 220 -131.19 gain 220 36 -131.60 gain 36 221 -137.63 gain 221 36 -133.68 gain 36 222 -132.33 gain 222 36 -128.71 gain 36 223 -130.39 gain 223 36 -125.39 gain 36 224 -128.95 gain 224 36 -126.63 gain 37 38 -89.51 gain 38 37 -95.52 gain 37 39 -94.54 gain 39 37 -99.43 gain 37 40 -97.23 gain 40 37 -104.16 gain 37 41 -115.11 gain 41 37 -117.68 gain 37 42 -113.11 gain 42 37 -113.82 gain 37 43 -110.75 gain 43 37 -115.35 gain 37 44 -114.75 gain 44 37 -122.42 gain 37 45 -116.10 gain 45 37 -122.23 gain 37 46 -115.61 gain 46 37 -117.54 gain 37 47 -112.34 gain 47 37 -115.32 gain 37 48 -110.34 gain 48 37 -111.12 gain 37 49 -114.00 gain 49 37 -122.75 gain 37 50 -97.84 gain 50 37 -107.56 gain 37 51 -102.66 gain 51 37 -107.52 gain 37 52 -82.81 gain 52 37 -83.69 gain 37 53 -93.26 gain 53 37 -95.15 gain 37 54 -95.74 gain 54 37 -98.33 gain 37 55 -100.42 gain 55 37 -102.30 gain 37 56 -102.00 gain 56 37 -111.21 gain 37 57 -108.57 gain 57 37 -111.66 gain 37 58 -116.10 gain 58 37 -121.93 gain 37 59 -118.63 gain 59 37 -120.59 gain 37 60 -118.59 gain 60 37 -121.86 gain 37 61 -111.33 gain 61 37 -113.36 gain 37 62 -112.68 gain 62 37 -119.93 gain 37 63 -109.46 gain 63 37 -109.93 gain 37 64 -108.74 gain 64 37 -112.18 gain 37 65 -103.06 gain 65 37 -108.60 gain 37 66 -100.43 gain 66 37 -100.22 gain 37 67 -96.65 gain 67 37 -98.72 gain 37 68 -98.38 gain 68 37 -105.00 gain 37 69 -96.50 gain 69 37 -100.42 gain 37 70 -110.20 gain 70 37 -113.88 gain 37 71 -105.32 gain 71 37 -107.09 gain 37 72 -110.44 gain 72 37 -112.63 gain 37 73 -108.35 gain 73 37 -108.94 gain 37 74 -120.88 gain 74 37 -125.34 gain 37 75 -118.42 gain 75 37 -123.03 gain 37 76 -112.95 gain 76 37 -113.51 gain 37 77 -118.68 gain 77 37 -122.90 gain 37 78 -107.83 gain 78 37 -114.90 gain 37 79 -111.33 gain 79 37 -113.18 gain 37 80 -109.68 gain 80 37 -112.03 gain 37 81 -108.47 gain 81 37 -111.41 gain 37 82 -103.58 gain 82 37 -104.15 gain 37 83 -106.97 gain 83 37 -108.57 gain 37 84 -110.28 gain 84 37 -112.03 gain 37 85 -107.76 gain 85 37 -106.31 gain 37 86 -113.25 gain 86 37 -115.19 gain 37 87 -111.86 gain 87 37 -117.76 gain 37 88 -114.54 gain 88 37 -118.19 gain 37 89 -114.31 gain 89 37 -116.57 gain 37 90 -115.18 gain 90 37 -114.44 gain 37 91 -113.16 gain 91 37 -116.36 gain 37 92 -109.11 gain 92 37 -109.28 gain 37 93 -114.50 gain 93 37 -119.45 gain 37 94 -107.19 gain 94 37 -112.02 gain 37 95 -98.93 gain 95 37 -106.01 gain 37 96 -101.13 gain 96 37 -105.55 gain 37 97 -100.90 gain 97 37 -104.07 gain 37 98 -113.84 gain 98 37 -117.80 gain 37 99 -103.17 gain 99 37 -104.95 gain 37 100 -113.58 gain 100 37 -114.93 gain 37 101 -109.47 gain 101 37 -110.98 gain 37 102 -115.28 gain 102 37 -117.57 gain 37 103 -118.33 gain 103 37 -118.11 gain 37 104 -118.41 gain 104 37 -123.56 gain 37 105 -117.16 gain 105 37 -118.26 gain 37 106 -110.94 gain 106 37 -113.12 gain 37 107 -118.17 gain 107 37 -126.91 gain 37 108 -110.36 gain 108 37 -111.43 gain 37 109 -120.32 gain 109 37 -124.87 gain 37 110 -118.09 gain 110 37 -121.12 gain 37 111 -111.38 gain 111 37 -114.08 gain 37 112 -114.69 gain 112 37 -116.27 gain 37 113 -110.92 gain 113 37 -111.31 gain 37 114 -119.81 gain 114 37 -123.50 gain 37 115 -112.62 gain 115 37 -110.61 gain 37 116 -116.88 gain 116 37 -122.42 gain 37 117 -115.66 gain 117 37 -122.70 gain 37 118 -118.46 gain 118 37 -123.82 gain 37 119 -118.11 gain 119 37 -118.13 gain 37 120 -124.56 gain 120 37 -129.09 gain 37 121 -120.92 gain 121 37 -124.74 gain 37 122 -116.02 gain 122 37 -121.96 gain 37 123 -122.20 gain 123 37 -128.91 gain 37 124 -111.35 gain 124 37 -114.47 gain 37 125 -116.09 gain 125 37 -120.55 gain 37 126 -115.85 gain 126 37 -118.27 gain 37 127 -116.44 gain 127 37 -122.31 gain 37 128 -115.67 gain 128 37 -119.49 gain 37 129 -111.84 gain 129 37 -113.56 gain 37 130 -114.63 gain 130 37 -114.18 gain 37 131 -113.60 gain 131 37 -120.23 gain 37 132 -112.96 gain 132 37 -119.22 gain 37 133 -121.75 gain 133 37 -126.08 gain 37 134 -122.27 gain 134 37 -123.30 gain 37 135 -123.44 gain 135 37 -128.04 gain 37 136 -121.14 gain 136 37 -126.36 gain 37 137 -120.03 gain 137 37 -122.73 gain 37 138 -114.03 gain 138 37 -115.72 gain 37 139 -111.14 gain 139 37 -113.82 gain 37 140 -117.13 gain 140 37 -122.41 gain 37 141 -114.79 gain 141 37 -118.75 gain 37 142 -120.90 gain 142 37 -124.17 gain 37 143 -110.36 gain 143 37 -113.24 gain 37 144 -117.08 gain 144 37 -120.98 gain 37 145 -115.89 gain 145 37 -118.24 gain 37 146 -119.22 gain 146 37 -120.48 gain 37 147 -118.03 gain 147 37 -116.38 gain 37 148 -123.27 gain 148 37 -121.34 gain 37 149 -118.80 gain 149 37 -120.04 gain 37 150 -121.35 gain 150 37 -125.27 gain 37 151 -118.47 gain 151 37 -122.58 gain 37 152 -121.05 gain 152 37 -122.14 gain 37 153 -113.92 gain 153 37 -112.59 gain 37 154 -114.34 gain 154 37 -121.55 gain 37 155 -121.25 gain 155 37 -128.36 gain 37 156 -107.70 gain 156 37 -109.20 gain 37 157 -118.15 gain 157 37 -122.60 gain 37 158 -124.69 gain 158 37 -131.73 gain 37 159 -109.42 gain 159 37 -113.07 gain 37 160 -115.78 gain 160 37 -116.55 gain 37 161 -113.73 gain 161 37 -117.99 gain 37 162 -122.00 gain 162 37 -125.12 gain 37 163 -124.07 gain 163 37 -129.34 gain 37 164 -114.93 gain 164 37 -121.25 gain 37 165 -119.95 gain 165 37 -122.31 gain 37 166 -121.42 gain 166 37 -125.35 gain 37 167 -114.79 gain 167 37 -120.81 gain 37 168 -122.68 gain 168 37 -127.15 gain 37 169 -116.32 gain 169 37 -124.98 gain 37 170 -113.37 gain 170 37 -113.57 gain 37 171 -123.67 gain 171 37 -128.88 gain 37 172 -113.68 gain 172 37 -113.59 gain 37 173 -121.41 gain 173 37 -120.76 gain 37 174 -123.79 gain 174 37 -127.43 gain 37 175 -123.36 gain 175 37 -130.56 gain 37 176 -118.73 gain 176 37 -117.94 gain 37 177 -116.74 gain 177 37 -123.76 gain 37 178 -122.99 gain 178 37 -125.84 gain 37 179 -117.89 gain 179 37 -119.13 gain 37 180 -125.42 gain 180 37 -128.13 gain 37 181 -117.35 gain 181 37 -120.13 gain 37 182 -121.00 gain 182 37 -126.17 gain 37 183 -113.76 gain 183 37 -112.31 gain 37 184 -117.90 gain 184 37 -121.23 gain 37 185 -117.35 gain 185 37 -118.17 gain 37 186 -124.44 gain 186 37 -125.54 gain 37 187 -124.04 gain 187 37 -127.69 gain 37 188 -126.61 gain 188 37 -133.52 gain 37 189 -122.51 gain 189 37 -126.93 gain 37 190 -116.51 gain 190 37 -117.94 gain 37 191 -122.71 gain 191 37 -125.23 gain 37 192 -120.40 gain 192 37 -125.79 gain 37 193 -131.45 gain 193 37 -138.09 gain 37 194 -112.34 gain 194 37 -112.79 gain 37 195 -121.17 gain 195 37 -122.25 gain 37 196 -129.24 gain 196 37 -134.37 gain 37 197 -127.95 gain 197 37 -129.13 gain 37 198 -118.88 gain 198 37 -119.59 gain 37 199 -116.11 gain 199 37 -120.73 gain 37 200 -123.13 gain 200 37 -124.69 gain 37 201 -124.86 gain 201 37 -127.23 gain 37 202 -123.86 gain 202 37 -130.22 gain 37 203 -119.80 gain 203 37 -125.79 gain 37 204 -117.99 gain 204 37 -121.26 gain 37 205 -128.56 gain 205 37 -130.91 gain 37 206 -122.12 gain 206 37 -128.99 gain 37 207 -125.37 gain 207 37 -124.60 gain 37 208 -125.89 gain 208 37 -130.89 gain 37 209 -136.78 gain 209 37 -142.77 gain 37 210 -129.25 gain 210 37 -132.19 gain 37 211 -120.56 gain 211 37 -125.52 gain 37 212 -115.26 gain 212 37 -118.75 gain 37 213 -129.11 gain 213 37 -131.80 gain 37 214 -119.10 gain 214 37 -121.68 gain 37 215 -125.02 gain 215 37 -124.01 gain 37 216 -122.67 gain 216 37 -126.32 gain 37 217 -117.95 gain 217 37 -122.12 gain 37 218 -121.63 gain 218 37 -127.99 gain 37 219 -123.63 gain 219 37 -121.35 gain 37 220 -123.08 gain 220 37 -131.29 gain 37 221 -127.39 gain 221 37 -131.24 gain 37 222 -124.96 gain 222 37 -129.15 gain 37 223 -119.33 gain 223 37 -122.12 gain 37 224 -125.60 gain 224 37 -131.08 gain 38 39 -95.85 gain 39 38 -94.72 gain 38 40 -105.27 gain 40 38 -106.18 gain 38 41 -112.46 gain 41 38 -109.01 gain 38 42 -115.04 gain 42 38 -109.73 gain 38 43 -117.05 gain 43 38 -115.63 gain 38 44 -116.83 gain 44 38 -118.47 gain 38 45 -125.03 gain 45 38 -125.15 gain 38 46 -121.04 gain 46 38 -116.95 gain 38 47 -122.76 gain 47 38 -119.73 gain 38 48 -114.21 gain 48 38 -108.96 gain 38 49 -122.68 gain 49 38 -125.41 gain 38 50 -108.65 gain 50 38 -112.35 gain 38 51 -103.65 gain 51 38 -102.49 gain 38 52 -103.94 gain 52 38 -98.79 gain 38 53 -100.97 gain 53 38 -96.84 gain 38 54 -98.42 gain 54 38 -94.99 gain 38 55 -109.93 gain 55 38 -105.80 gain 38 56 -119.40 gain 56 38 -122.60 gain 38 57 -109.36 gain 57 38 -106.43 gain 38 58 -121.44 gain 58 38 -121.25 gain 38 59 -115.61 gain 59 38 -111.54 gain 38 60 -113.81 gain 60 38 -111.07 gain 38 61 -118.64 gain 61 38 -114.65 gain 38 62 -120.25 gain 62 38 -121.48 gain 38 63 -121.21 gain 63 38 -115.67 gain 38 64 -114.32 gain 64 38 -111.74 gain 38 65 -113.20 gain 65 38 -112.71 gain 38 66 -104.97 gain 66 38 -98.74 gain 38 67 -119.70 gain 67 38 -115.75 gain 38 68 -107.93 gain 68 38 -108.54 gain 38 69 -103.69 gain 69 38 -101.58 gain 38 70 -108.90 gain 70 38 -106.56 gain 38 71 -101.93 gain 71 38 -97.69 gain 38 72 -112.61 gain 72 38 -108.78 gain 38 73 -108.16 gain 73 38 -102.73 gain 38 74 -118.36 gain 74 38 -116.81 gain 38 75 -118.30 gain 75 38 -116.89 gain 38 76 -127.73 gain 76 38 -122.26 gain 38 77 -109.72 gain 77 38 -107.92 gain 38 78 -115.03 gain 78 38 -116.08 gain 38 79 -114.84 gain 79 38 -110.67 gain 38 80 -115.65 gain 80 38 -111.98 gain 38 81 -111.30 gain 81 38 -108.22 gain 38 82 -111.80 gain 82 38 -106.35 gain 38 83 -113.93 gain 83 38 -109.52 gain 38 84 -110.32 gain 84 38 -106.05 gain 38 85 -112.76 gain 85 38 -105.30 gain 38 86 -115.20 gain 86 38 -111.12 gain 38 87 -118.25 gain 87 38 -118.13 gain 38 88 -118.16 gain 88 38 -115.79 gain 38 89 -117.68 gain 89 38 -113.91 gain 38 90 -123.10 gain 90 38 -116.35 gain 38 91 -131.92 gain 91 38 -129.10 gain 38 92 -118.24 gain 92 38 -112.39 gain 38 93 -119.13 gain 93 38 -118.07 gain 38 94 -119.16 gain 94 38 -117.97 gain 38 95 -119.66 gain 95 38 -120.72 gain 38 96 -118.56 gain 96 38 -116.96 gain 38 97 -112.18 gain 97 38 -109.33 gain 38 98 -110.71 gain 98 38 -108.65 gain 38 99 -115.77 gain 99 38 -111.53 gain 38 100 -125.35 gain 100 38 -120.68 gain 38 101 -119.00 gain 101 38 -114.50 gain 38 102 -118.73 gain 102 38 -115.00 gain 38 103 -125.02 gain 103 38 -118.78 gain 38 104 -117.62 gain 104 38 -116.76 gain 38 105 -128.47 gain 105 38 -123.55 gain 38 106 -121.65 gain 106 38 -117.81 gain 38 107 -120.35 gain 107 38 -123.08 gain 38 108 -122.50 gain 108 38 -117.55 gain 38 109 -116.40 gain 109 38 -114.94 gain 38 110 -120.93 gain 110 38 -117.93 gain 38 111 -114.39 gain 111 38 -111.07 gain 38 112 -117.05 gain 112 38 -112.62 gain 38 113 -128.39 gain 113 38 -122.76 gain 38 114 -111.05 gain 114 38 -108.72 gain 38 115 -123.08 gain 115 38 -115.06 gain 38 116 -129.95 gain 116 38 -129.47 gain 38 117 -120.94 gain 117 38 -121.95 gain 38 118 -119.79 gain 118 38 -119.13 gain 38 119 -120.28 gain 119 38 -114.28 gain 38 120 -120.65 gain 120 38 -119.16 gain 38 121 -122.45 gain 121 38 -120.25 gain 38 122 -128.33 gain 122 38 -128.24 gain 38 123 -118.20 gain 123 38 -118.89 gain 38 124 -127.71 gain 124 38 -124.81 gain 38 125 -118.44 gain 125 38 -116.88 gain 38 126 -117.55 gain 126 38 -113.94 gain 38 127 -121.78 gain 127 38 -121.64 gain 38 128 -118.45 gain 128 38 -116.24 gain 38 129 -110.19 gain 129 38 -105.90 gain 38 130 -110.91 gain 130 38 -104.43 gain 38 131 -123.05 gain 131 38 -123.67 gain 38 132 -120.48 gain 132 38 -120.72 gain 38 133 -126.59 gain 133 38 -124.90 gain 38 134 -123.33 gain 134 38 -118.34 gain 38 135 -126.50 gain 135 38 -125.08 gain 38 136 -118.65 gain 136 38 -117.84 gain 38 137 -123.04 gain 137 38 -119.71 gain 38 138 -127.57 gain 138 38 -123.25 gain 38 139 -122.25 gain 139 38 -118.91 gain 38 140 -118.16 gain 140 38 -117.43 gain 38 141 -114.83 gain 141 38 -112.77 gain 38 142 -122.26 gain 142 38 -119.51 gain 38 143 -126.86 gain 143 38 -123.72 gain 38 144 -125.62 gain 144 38 -123.50 gain 38 145 -123.74 gain 145 38 -120.07 gain 38 146 -118.31 gain 146 38 -113.55 gain 38 147 -122.29 gain 147 38 -114.62 gain 38 148 -128.98 gain 148 38 -121.02 gain 38 149 -121.54 gain 149 38 -116.75 gain 38 150 -133.22 gain 150 38 -131.12 gain 38 151 -124.96 gain 151 38 -123.05 gain 38 152 -125.16 gain 152 38 -120.23 gain 38 153 -133.86 gain 153 38 -126.51 gain 38 154 -126.23 gain 154 38 -127.42 gain 38 155 -119.34 gain 155 38 -120.44 gain 38 156 -124.11 gain 156 38 -119.59 gain 38 157 -124.65 gain 157 38 -123.08 gain 38 158 -119.09 gain 158 38 -120.12 gain 38 159 -120.81 gain 159 38 -118.45 gain 38 160 -120.14 gain 160 38 -114.89 gain 38 161 -120.24 gain 161 38 -118.48 gain 38 162 -121.42 gain 162 38 -118.53 gain 38 163 -123.65 gain 163 38 -122.91 gain 38 164 -121.78 gain 164 38 -122.08 gain 38 165 -128.69 gain 165 38 -125.03 gain 38 166 -128.39 gain 166 38 -126.30 gain 38 167 -121.10 gain 167 38 -121.10 gain 38 168 -128.83 gain 168 38 -127.28 gain 38 169 -121.26 gain 169 38 -123.90 gain 38 170 -124.25 gain 170 38 -118.43 gain 38 171 -122.92 gain 171 38 -122.12 gain 38 172 -130.93 gain 172 38 -124.82 gain 38 173 -129.34 gain 173 38 -122.67 gain 38 174 -125.95 gain 174 38 -123.58 gain 38 175 -129.49 gain 175 38 -130.67 gain 38 176 -125.19 gain 176 38 -118.38 gain 38 177 -133.78 gain 177 38 -134.79 gain 38 178 -118.27 gain 178 38 -115.10 gain 38 179 -129.18 gain 179 38 -124.40 gain 38 180 -131.63 gain 180 38 -128.32 gain 38 181 -129.63 gain 181 38 -126.38 gain 38 182 -124.30 gain 182 38 -123.44 gain 38 183 -132.39 gain 183 38 -124.92 gain 38 184 -128.12 gain 184 38 -125.44 gain 38 185 -133.20 gain 185 38 -128.00 gain 38 186 -121.25 gain 186 38 -116.34 gain 38 187 -126.65 gain 187 38 -124.27 gain 38 188 -120.33 gain 188 38 -121.21 gain 38 189 -125.39 gain 189 38 -123.79 gain 38 190 -131.30 gain 190 38 -126.70 gain 38 191 -129.25 gain 191 38 -125.75 gain 38 192 -124.84 gain 192 38 -124.21 gain 38 193 -123.66 gain 193 38 -124.28 gain 38 194 -129.50 gain 194 38 -123.93 gain 38 195 -130.07 gain 195 38 -125.13 gain 38 196 -124.66 gain 196 38 -123.76 gain 38 197 -133.90 gain 197 38 -129.06 gain 38 198 -127.83 gain 198 38 -122.51 gain 38 199 -128.12 gain 199 38 -126.72 gain 38 200 -130.92 gain 200 38 -126.46 gain 38 201 -130.47 gain 201 38 -126.81 gain 38 202 -130.91 gain 202 38 -131.25 gain 38 203 -121.59 gain 203 38 -121.56 gain 38 204 -125.80 gain 204 38 -123.05 gain 38 205 -123.81 gain 205 38 -120.14 gain 38 206 -135.26 gain 206 38 -136.11 gain 38 207 -129.55 gain 207 38 -122.76 gain 38 208 -125.18 gain 208 38 -124.17 gain 38 209 -129.98 gain 209 38 -129.96 gain 38 210 -134.05 gain 210 38 -130.97 gain 38 211 -126.89 gain 211 38 -125.83 gain 38 212 -129.03 gain 212 38 -126.51 gain 38 213 -131.09 gain 213 38 -127.76 gain 38 214 -125.35 gain 214 38 -121.91 gain 38 215 -127.59 gain 215 38 -120.56 gain 38 216 -124.99 gain 216 38 -122.62 gain 38 217 -125.89 gain 217 38 -124.04 gain 38 218 -135.08 gain 218 38 -135.43 gain 38 219 -124.66 gain 219 38 -116.36 gain 38 220 -127.50 gain 220 38 -129.70 gain 38 221 -122.55 gain 221 38 -120.38 gain 38 222 -123.44 gain 222 38 -121.60 gain 38 223 -128.67 gain 223 38 -125.45 gain 38 224 -130.82 gain 224 38 -130.28 gain 39 40 -102.98 gain 40 39 -105.03 gain 39 41 -104.11 gain 41 39 -101.79 gain 39 42 -107.54 gain 42 39 -103.36 gain 39 43 -115.77 gain 43 39 -115.49 gain 39 44 -111.27 gain 44 39 -114.04 gain 39 45 -126.85 gain 45 39 -128.10 gain 39 46 -121.99 gain 46 39 -119.03 gain 39 47 -123.05 gain 47 39 -121.15 gain 39 48 -120.85 gain 48 39 -116.74 gain 39 49 -115.77 gain 49 39 -119.63 gain 39 50 -117.54 gain 50 39 -122.37 gain 39 51 -104.76 gain 51 39 -104.73 gain 39 52 -108.33 gain 52 39 -104.32 gain 39 53 -106.96 gain 53 39 -103.97 gain 39 54 -93.17 gain 54 39 -90.87 gain 39 55 -98.60 gain 55 39 -95.60 gain 39 56 -114.44 gain 56 39 -118.77 gain 39 57 -112.05 gain 57 39 -110.25 gain 39 58 -116.16 gain 58 39 -117.11 gain 39 59 -120.10 gain 59 39 -117.17 gain 39 60 -132.05 gain 60 39 -130.44 gain 39 61 -119.73 gain 61 39 -116.88 gain 39 62 -125.28 gain 62 39 -127.64 gain 39 63 -122.24 gain 63 39 -117.83 gain 39 64 -116.29 gain 64 39 -114.85 gain 39 65 -114.26 gain 65 39 -114.91 gain 39 66 -117.27 gain 66 39 -112.18 gain 39 67 -106.54 gain 67 39 -103.72 gain 39 68 -96.83 gain 68 39 -98.57 gain 39 69 -104.01 gain 69 39 -103.04 gain 39 70 -108.04 gain 70 39 -106.83 gain 39 71 -104.95 gain 71 39 -101.84 gain 39 72 -113.66 gain 72 39 -110.96 gain 39 73 -114.85 gain 73 39 -110.55 gain 39 74 -114.65 gain 74 39 -114.22 gain 39 75 -127.80 gain 75 39 -127.52 gain 39 76 -118.22 gain 76 39 -113.89 gain 39 77 -114.53 gain 77 39 -113.86 gain 39 78 -121.98 gain 78 39 -124.16 gain 39 79 -120.17 gain 79 39 -117.13 gain 39 80 -110.38 gain 80 39 -107.84 gain 39 81 -118.86 gain 81 39 -116.92 gain 39 82 -103.90 gain 82 39 -99.58 gain 39 83 -109.71 gain 83 39 -106.43 gain 39 84 -111.79 gain 84 39 -108.65 gain 39 85 -113.06 gain 85 39 -106.73 gain 39 86 -114.88 gain 86 39 -111.93 gain 39 87 -114.19 gain 87 39 -115.21 gain 39 88 -118.52 gain 88 39 -117.29 gain 39 89 -125.25 gain 89 39 -122.62 gain 39 90 -122.57 gain 90 39 -116.94 gain 39 91 -126.75 gain 91 39 -125.07 gain 39 92 -125.35 gain 92 39 -120.64 gain 39 93 -113.82 gain 93 39 -113.88 gain 39 94 -110.24 gain 94 39 -110.19 gain 39 95 -116.29 gain 95 39 -118.49 gain 39 96 -113.99 gain 96 39 -113.52 gain 39 97 -114.18 gain 97 39 -112.46 gain 39 98 -118.24 gain 98 39 -117.32 gain 39 99 -113.67 gain 99 39 -110.57 gain 39 100 -120.01 gain 100 39 -116.47 gain 39 101 -119.35 gain 101 39 -115.98 gain 39 102 -117.39 gain 102 39 -114.80 gain 39 103 -112.92 gain 103 39 -107.81 gain 39 104 -125.09 gain 104 39 -125.36 gain 39 105 -131.91 gain 105 39 -128.12 gain 39 106 -131.86 gain 106 39 -129.15 gain 39 107 -120.29 gain 107 39 -124.15 gain 39 108 -119.63 gain 108 39 -115.81 gain 39 109 -116.10 gain 109 39 -115.77 gain 39 110 -115.95 gain 110 39 -114.09 gain 39 111 -114.45 gain 111 39 -112.27 gain 39 112 -114.08 gain 112 39 -110.78 gain 39 113 -120.48 gain 113 39 -115.98 gain 39 114 -124.47 gain 114 39 -123.28 gain 39 115 -110.23 gain 115 39 -103.34 gain 39 116 -110.45 gain 116 39 -111.10 gain 39 117 -122.77 gain 117 39 -124.92 gain 39 118 -109.90 gain 118 39 -110.37 gain 39 119 -115.48 gain 119 39 -110.61 gain 39 120 -121.46 gain 120 39 -121.11 gain 39 121 -126.13 gain 121 39 -125.07 gain 39 122 -120.04 gain 122 39 -121.09 gain 39 123 -119.13 gain 123 39 -120.96 gain 39 124 -123.36 gain 124 39 -121.60 gain 39 125 -125.16 gain 125 39 -124.74 gain 39 126 -115.85 gain 126 39 -113.38 gain 39 127 -120.53 gain 127 39 -121.53 gain 39 128 -112.53 gain 128 39 -111.46 gain 39 129 -118.79 gain 129 39 -115.62 gain 39 130 -118.23 gain 130 39 -112.89 gain 39 131 -123.31 gain 131 39 -125.06 gain 39 132 -123.82 gain 132 39 -125.19 gain 39 133 -115.97 gain 133 39 -115.41 gain 39 134 -129.93 gain 134 39 -126.07 gain 39 135 -127.07 gain 135 39 -126.78 gain 39 136 -120.25 gain 136 39 -120.58 gain 39 137 -127.84 gain 137 39 -125.65 gain 39 138 -125.94 gain 138 39 -122.75 gain 39 139 -125.71 gain 139 39 -123.50 gain 39 140 -117.56 gain 140 39 -117.96 gain 39 141 -121.77 gain 141 39 -120.84 gain 39 142 -120.27 gain 142 39 -118.65 gain 39 143 -128.99 gain 143 39 -126.99 gain 39 144 -125.61 gain 144 39 -124.63 gain 39 145 -120.22 gain 145 39 -117.69 gain 39 146 -118.71 gain 146 39 -115.09 gain 39 147 -123.88 gain 147 39 -117.34 gain 39 148 -115.35 gain 148 39 -108.53 gain 39 149 -123.45 gain 149 39 -119.79 gain 39 150 -127.64 gain 150 39 -126.67 gain 39 151 -127.18 gain 151 39 -126.41 gain 39 152 -123.10 gain 152 39 -119.31 gain 39 153 -125.81 gain 153 39 -119.60 gain 39 154 -116.87 gain 154 39 -119.20 gain 39 155 -130.32 gain 155 39 -132.54 gain 39 156 -120.20 gain 156 39 -116.82 gain 39 157 -126.80 gain 157 39 -126.36 gain 39 158 -122.80 gain 158 39 -124.96 gain 39 159 -114.23 gain 159 39 -113.01 gain 39 160 -121.06 gain 160 39 -116.95 gain 39 161 -122.30 gain 161 39 -121.68 gain 39 162 -118.72 gain 162 39 -116.96 gain 39 163 -122.94 gain 163 39 -123.33 gain 39 164 -122.06 gain 164 39 -123.49 gain 39 165 -123.27 gain 165 39 -120.74 gain 39 166 -127.44 gain 166 39 -126.48 gain 39 167 -125.91 gain 167 39 -127.04 gain 39 168 -125.77 gain 168 39 -125.35 gain 39 169 -130.34 gain 169 39 -134.12 gain 39 170 -126.16 gain 170 39 -121.47 gain 39 171 -122.77 gain 171 39 -123.10 gain 39 172 -124.72 gain 172 39 -119.75 gain 39 173 -128.03 gain 173 39 -122.49 gain 39 174 -124.37 gain 174 39 -123.13 gain 39 175 -121.64 gain 175 39 -123.95 gain 39 176 -118.43 gain 176 39 -112.76 gain 39 177 -125.84 gain 177 39 -127.98 gain 39 178 -137.06 gain 178 39 -135.02 gain 39 179 -123.37 gain 179 39 -119.73 gain 39 180 -130.01 gain 180 39 -127.83 gain 39 181 -132.19 gain 181 39 -130.08 gain 39 182 -135.08 gain 182 39 -135.35 gain 39 183 -128.60 gain 183 39 -122.27 gain 39 184 -137.92 gain 184 39 -136.37 gain 39 185 -128.40 gain 185 39 -124.34 gain 39 186 -129.99 gain 186 39 -126.21 gain 39 187 -121.56 gain 187 39 -120.32 gain 39 188 -126.12 gain 188 39 -128.14 gain 39 189 -126.34 gain 189 39 -125.87 gain 39 190 -125.29 gain 190 39 -121.84 gain 39 191 -131.69 gain 191 39 -129.33 gain 39 192 -127.24 gain 192 39 -127.75 gain 39 193 -125.53 gain 193 39 -127.29 gain 39 194 -127.12 gain 194 39 -122.68 gain 39 195 -127.30 gain 195 39 -123.49 gain 39 196 -126.18 gain 196 39 -126.41 gain 39 197 -133.17 gain 197 39 -129.47 gain 39 198 -122.17 gain 198 39 -117.99 gain 39 199 -132.41 gain 199 39 -132.14 gain 39 200 -128.98 gain 200 39 -125.65 gain 39 201 -134.08 gain 201 39 -131.55 gain 39 202 -122.48 gain 202 39 -123.96 gain 39 203 -123.73 gain 203 39 -124.84 gain 39 204 -124.51 gain 204 39 -122.90 gain 39 205 -125.85 gain 205 39 -123.31 gain 39 206 -125.78 gain 206 39 -127.76 gain 39 207 -120.10 gain 207 39 -114.44 gain 39 208 -122.74 gain 208 39 -122.86 gain 39 209 -129.06 gain 209 39 -130.16 gain 39 210 -138.50 gain 210 39 -136.54 gain 39 211 -135.57 gain 211 39 -135.64 gain 39 212 -124.72 gain 212 39 -123.33 gain 39 213 -140.97 gain 213 39 -138.77 gain 39 214 -128.11 gain 214 39 -125.80 gain 39 215 -126.67 gain 215 39 -120.77 gain 39 216 -128.21 gain 216 39 -126.98 gain 39 217 -132.47 gain 217 39 -131.75 gain 39 218 -116.83 gain 218 39 -118.30 gain 39 219 -134.27 gain 219 39 -127.10 gain 39 220 -130.46 gain 220 39 -133.79 gain 39 221 -124.97 gain 221 39 -123.93 gain 39 222 -132.91 gain 222 39 -132.20 gain 39 223 -121.62 gain 223 39 -119.52 gain 39 224 -134.01 gain 224 39 -134.60 gain 40 41 -89.86 gain 41 40 -85.49 gain 40 42 -103.25 gain 42 40 -97.03 gain 40 43 -117.93 gain 43 40 -115.60 gain 40 44 -121.07 gain 44 40 -121.80 gain 40 45 -127.84 gain 45 40 -127.05 gain 40 46 -124.47 gain 46 40 -119.47 gain 40 47 -124.04 gain 47 40 -120.10 gain 40 48 -125.51 gain 48 40 -119.36 gain 40 49 -126.63 gain 49 40 -128.45 gain 40 50 -119.70 gain 50 40 -122.49 gain 40 51 -114.03 gain 51 40 -111.96 gain 40 52 -118.47 gain 52 40 -112.41 gain 40 53 -112.76 gain 53 40 -107.72 gain 40 54 -103.00 gain 54 40 -98.66 gain 40 55 -93.48 gain 55 40 -88.44 gain 40 56 -107.29 gain 56 40 -109.57 gain 40 57 -109.02 gain 57 40 -105.18 gain 40 58 -107.29 gain 58 40 -106.19 gain 40 59 -116.29 gain 59 40 -111.31 gain 40 60 -131.15 gain 60 40 -127.49 gain 40 61 -127.63 gain 61 40 -122.73 gain 40 62 -124.58 gain 62 40 -124.90 gain 40 63 -124.42 gain 63 40 -117.97 gain 40 64 -121.01 gain 64 40 -117.52 gain 40 65 -114.11 gain 65 40 -112.72 gain 40 66 -119.88 gain 66 40 -112.74 gain 40 67 -110.75 gain 67 40 -105.88 gain 40 68 -110.84 gain 68 40 -110.54 gain 40 69 -115.84 gain 69 40 -112.83 gain 40 70 -101.65 gain 70 40 -98.39 gain 40 71 -111.35 gain 71 40 -106.20 gain 40 72 -112.82 gain 72 40 -108.09 gain 40 73 -112.03 gain 73 40 -105.69 gain 40 74 -120.11 gain 74 40 -117.65 gain 40 75 -126.11 gain 75 40 -123.78 gain 40 76 -121.71 gain 76 40 -115.33 gain 40 77 -123.69 gain 77 40 -120.98 gain 40 78 -127.61 gain 78 40 -127.75 gain 40 79 -119.72 gain 79 40 -114.64 gain 40 80 -120.11 gain 80 40 -115.52 gain 40 81 -116.30 gain 81 40 -112.31 gain 40 82 -113.57 gain 82 40 -107.21 gain 40 83 -116.15 gain 83 40 -110.82 gain 40 84 -119.12 gain 84 40 -113.94 gain 40 85 -99.98 gain 85 40 -91.61 gain 40 86 -109.32 gain 86 40 -104.33 gain 40 87 -115.48 gain 87 40 -114.45 gain 40 88 -113.37 gain 88 40 -110.09 gain 40 89 -125.65 gain 89 40 -120.97 gain 40 90 -121.90 gain 90 40 -114.23 gain 40 91 -120.65 gain 91 40 -116.92 gain 40 92 -128.52 gain 92 40 -121.75 gain 40 93 -123.84 gain 93 40 -121.86 gain 40 94 -120.66 gain 94 40 -118.56 gain 40 95 -123.17 gain 95 40 -123.32 gain 40 96 -123.96 gain 96 40 -121.45 gain 40 97 -123.85 gain 97 40 -120.09 gain 40 98 -124.66 gain 98 40 -121.70 gain 40 99 -118.12 gain 99 40 -112.97 gain 40 100 -112.30 gain 100 40 -106.72 gain 40 101 -119.15 gain 101 40 -113.73 gain 40 102 -121.76 gain 102 40 -117.12 gain 40 103 -122.65 gain 103 40 -115.49 gain 40 104 -117.21 gain 104 40 -115.43 gain 40 105 -127.03 gain 105 40 -121.19 gain 40 106 -118.30 gain 106 40 -113.55 gain 40 107 -124.93 gain 107 40 -126.75 gain 40 108 -119.99 gain 108 40 -114.13 gain 40 109 -123.48 gain 109 40 -121.10 gain 40 110 -127.62 gain 110 40 -123.71 gain 40 111 -115.94 gain 111 40 -111.71 gain 40 112 -121.28 gain 112 40 -115.93 gain 40 113 -125.46 gain 113 40 -118.92 gain 40 114 -113.91 gain 114 40 -110.67 gain 40 115 -122.62 gain 115 40 -113.68 gain 40 116 -120.93 gain 116 40 -119.53 gain 40 117 -119.01 gain 117 40 -119.11 gain 40 118 -116.58 gain 118 40 -115.01 gain 40 119 -115.85 gain 119 40 -108.94 gain 40 120 -134.20 gain 120 40 -131.80 gain 40 121 -130.94 gain 121 40 -127.83 gain 40 122 -133.54 gain 122 40 -132.55 gain 40 123 -128.64 gain 123 40 -128.42 gain 40 124 -124.66 gain 124 40 -120.85 gain 40 125 -114.05 gain 125 40 -111.58 gain 40 126 -122.20 gain 126 40 -117.68 gain 40 127 -123.68 gain 127 40 -122.62 gain 40 128 -119.21 gain 128 40 -116.10 gain 40 129 -121.46 gain 129 40 -116.25 gain 40 130 -121.88 gain 130 40 -114.50 gain 40 131 -120.93 gain 131 40 -120.64 gain 40 132 -125.46 gain 132 40 -124.79 gain 40 133 -119.26 gain 133 40 -116.66 gain 40 134 -126.62 gain 134 40 -120.72 gain 40 135 -131.14 gain 135 40 -128.81 gain 40 136 -127.25 gain 136 40 -125.53 gain 40 137 -124.33 gain 137 40 -120.10 gain 40 138 -124.81 gain 138 40 -119.57 gain 40 139 -122.31 gain 139 40 -118.06 gain 40 140 -123.18 gain 140 40 -121.53 gain 40 141 -124.90 gain 141 40 -121.93 gain 40 142 -130.23 gain 142 40 -126.57 gain 40 143 -132.15 gain 143 40 -128.11 gain 40 144 -117.96 gain 144 40 -114.93 gain 40 145 -119.84 gain 145 40 -115.25 gain 40 146 -127.55 gain 146 40 -121.88 gain 40 147 -126.25 gain 147 40 -117.67 gain 40 148 -125.39 gain 148 40 -116.53 gain 40 149 -129.70 gain 149 40 -124.00 gain 40 150 -132.93 gain 150 40 -129.92 gain 40 151 -134.22 gain 151 40 -131.40 gain 40 152 -121.20 gain 152 40 -115.36 gain 40 153 -130.79 gain 153 40 -122.53 gain 40 154 -134.41 gain 154 40 -134.69 gain 40 155 -126.21 gain 155 40 -126.40 gain 40 156 -123.96 gain 156 40 -118.54 gain 40 157 -128.31 gain 157 40 -125.83 gain 40 158 -120.03 gain 158 40 -120.14 gain 40 159 -125.71 gain 159 40 -122.44 gain 40 160 -130.07 gain 160 40 -123.91 gain 40 161 -122.33 gain 161 40 -119.66 gain 40 162 -122.98 gain 162 40 -119.17 gain 40 163 -126.66 gain 163 40 -125.00 gain 40 164 -127.34 gain 164 40 -126.72 gain 40 165 -124.36 gain 165 40 -119.79 gain 40 166 -130.24 gain 166 40 -127.24 gain 40 167 -126.60 gain 167 40 -125.68 gain 40 168 -128.24 gain 168 40 -125.77 gain 40 169 -122.16 gain 169 40 -123.90 gain 40 170 -123.98 gain 170 40 -117.24 gain 40 171 -127.41 gain 171 40 -125.69 gain 40 172 -133.03 gain 172 40 -126.01 gain 40 173 -118.78 gain 173 40 -111.19 gain 40 174 -122.50 gain 174 40 -119.22 gain 40 175 -123.22 gain 175 40 -123.49 gain 40 176 -122.68 gain 176 40 -114.96 gain 40 177 -123.19 gain 177 40 -123.29 gain 40 178 -126.16 gain 178 40 -122.07 gain 40 179 -120.89 gain 179 40 -115.20 gain 40 180 -127.44 gain 180 40 -123.21 gain 40 181 -139.26 gain 181 40 -135.10 gain 40 182 -129.09 gain 182 40 -127.32 gain 40 183 -131.24 gain 183 40 -122.86 gain 40 184 -132.46 gain 184 40 -128.86 gain 40 185 -127.39 gain 185 40 -121.27 gain 40 186 -128.24 gain 186 40 -122.41 gain 40 187 -131.08 gain 187 40 -127.80 gain 40 188 -130.23 gain 188 40 -130.20 gain 40 189 -125.83 gain 189 40 -123.32 gain 40 190 -125.93 gain 190 40 -120.43 gain 40 191 -122.67 gain 191 40 -118.26 gain 40 192 -128.71 gain 192 40 -127.17 gain 40 193 -125.54 gain 193 40 -125.25 gain 40 194 -129.06 gain 194 40 -122.58 gain 40 195 -134.71 gain 195 40 -128.86 gain 40 196 -131.79 gain 196 40 -129.98 gain 40 197 -137.14 gain 197 40 -131.40 gain 40 198 -131.56 gain 198 40 -125.33 gain 40 199 -127.21 gain 199 40 -124.90 gain 40 200 -135.54 gain 200 40 -130.17 gain 40 201 -122.26 gain 201 40 -117.69 gain 40 202 -127.70 gain 202 40 -127.14 gain 40 203 -132.59 gain 203 40 -131.64 gain 40 204 -124.29 gain 204 40 -120.63 gain 40 205 -133.26 gain 205 40 -128.68 gain 40 206 -126.69 gain 206 40 -126.62 gain 40 207 -131.72 gain 207 40 -124.01 gain 40 208 -123.81 gain 208 40 -121.88 gain 40 209 -132.69 gain 209 40 -131.76 gain 40 210 -132.82 gain 210 40 -128.82 gain 40 211 -129.18 gain 211 40 -127.21 gain 40 212 -134.96 gain 212 40 -131.52 gain 40 213 -130.20 gain 213 40 -125.96 gain 40 214 -129.81 gain 214 40 -125.46 gain 40 215 -126.11 gain 215 40 -118.17 gain 40 216 -132.62 gain 216 40 -129.34 gain 40 217 -125.09 gain 217 40 -122.33 gain 40 218 -132.01 gain 218 40 -131.44 gain 40 219 -125.39 gain 219 40 -116.18 gain 40 220 -131.05 gain 220 40 -132.33 gain 40 221 -138.78 gain 221 40 -135.71 gain 40 222 -135.41 gain 222 40 -132.66 gain 40 223 -138.17 gain 223 40 -134.03 gain 40 224 -127.87 gain 224 40 -126.42 gain 41 42 -89.63 gain 42 41 -87.78 gain 41 43 -102.86 gain 43 41 -104.90 gain 41 44 -102.65 gain 44 41 -107.75 gain 41 45 -128.69 gain 45 41 -132.27 gain 41 46 -120.82 gain 46 41 -120.18 gain 41 47 -118.41 gain 47 41 -118.83 gain 41 48 -130.72 gain 48 41 -128.93 gain 41 49 -117.04 gain 49 41 -123.23 gain 41 50 -119.30 gain 50 41 -126.46 gain 41 51 -111.54 gain 51 41 -113.84 gain 41 52 -110.24 gain 52 41 -108.55 gain 41 53 -106.93 gain 53 41 -106.26 gain 41 54 -94.21 gain 54 41 -94.24 gain 41 55 -99.07 gain 55 41 -98.39 gain 41 56 -97.11 gain 56 41 -103.76 gain 41 57 -105.76 gain 57 41 -106.29 gain 41 58 -105.46 gain 58 41 -108.73 gain 41 59 -111.39 gain 59 41 -110.78 gain 41 60 -124.77 gain 60 41 -125.48 gain 41 61 -125.89 gain 61 41 -125.36 gain 41 62 -122.33 gain 62 41 -127.01 gain 41 63 -115.27 gain 63 41 -113.18 gain 41 64 -115.47 gain 64 41 -116.35 gain 41 65 -115.28 gain 65 41 -118.26 gain 41 66 -118.73 gain 66 41 -115.96 gain 41 67 -116.50 gain 67 41 -116.00 gain 41 68 -109.80 gain 68 41 -113.86 gain 41 69 -107.72 gain 69 41 -109.08 gain 41 70 -100.33 gain 70 41 -101.44 gain 41 71 -102.40 gain 71 41 -101.61 gain 41 72 -104.44 gain 72 41 -104.07 gain 41 73 -112.86 gain 73 41 -110.88 gain 41 74 -110.97 gain 74 41 -112.87 gain 41 75 -124.36 gain 75 41 -126.40 gain 41 76 -114.70 gain 76 41 -112.69 gain 41 77 -120.49 gain 77 41 -122.14 gain 41 78 -121.04 gain 78 41 -125.54 gain 41 79 -117.29 gain 79 41 -116.57 gain 41 80 -116.58 gain 80 41 -116.37 gain 41 81 -120.67 gain 81 41 -121.05 gain 41 82 -117.79 gain 82 41 -115.79 gain 41 83 -111.48 gain 83 41 -110.52 gain 41 84 -102.90 gain 84 41 -102.09 gain 41 85 -107.68 gain 85 41 -103.67 gain 41 86 -110.29 gain 86 41 -109.67 gain 41 87 -105.72 gain 87 41 -109.06 gain 41 88 -105.19 gain 88 41 -106.28 gain 41 89 -102.88 gain 89 41 -102.57 gain 41 90 -132.69 gain 90 41 -129.39 gain 41 91 -125.85 gain 91 41 -126.50 gain 41 92 -124.32 gain 92 41 -121.92 gain 41 93 -118.51 gain 93 41 -120.90 gain 41 94 -121.72 gain 94 41 -123.98 gain 41 95 -113.65 gain 95 41 -118.17 gain 41 96 -110.89 gain 96 41 -112.75 gain 41 97 -112.97 gain 97 41 -113.57 gain 41 98 -114.48 gain 98 41 -115.88 gain 41 99 -114.04 gain 99 41 -113.26 gain 41 100 -112.91 gain 100 41 -111.69 gain 41 101 -112.01 gain 101 41 -110.96 gain 41 102 -110.91 gain 102 41 -110.64 gain 41 103 -113.75 gain 103 41 -110.97 gain 41 104 -115.26 gain 104 41 -117.85 gain 41 105 -127.20 gain 105 41 -125.73 gain 41 106 -126.13 gain 106 41 -125.74 gain 41 107 -119.82 gain 107 41 -126.01 gain 41 108 -121.24 gain 108 41 -119.74 gain 41 109 -119.32 gain 109 41 -121.31 gain 41 110 -121.43 gain 110 41 -121.89 gain 41 111 -120.75 gain 111 41 -120.89 gain 41 112 -117.72 gain 112 41 -116.74 gain 41 113 -115.68 gain 113 41 -113.50 gain 41 114 -109.16 gain 114 41 -110.28 gain 41 115 -116.73 gain 115 41 -112.16 gain 41 116 -115.07 gain 116 41 -118.05 gain 41 117 -110.57 gain 117 41 -115.04 gain 41 118 -110.93 gain 118 41 -113.72 gain 41 119 -109.88 gain 119 41 -107.34 gain 41 120 -124.96 gain 120 41 -126.93 gain 41 121 -127.44 gain 121 41 -128.70 gain 41 122 -126.09 gain 122 41 -129.47 gain 41 123 -119.91 gain 123 41 -124.06 gain 41 124 -123.95 gain 124 41 -124.51 gain 41 125 -120.78 gain 125 41 -122.68 gain 41 126 -118.51 gain 126 41 -118.36 gain 41 127 -117.42 gain 127 41 -120.73 gain 41 128 -122.80 gain 128 41 -124.05 gain 41 129 -114.55 gain 129 41 -113.71 gain 41 130 -119.69 gain 130 41 -116.68 gain 41 131 -113.60 gain 131 41 -117.67 gain 41 132 -120.95 gain 132 41 -124.65 gain 41 133 -118.81 gain 133 41 -120.58 gain 41 134 -111.16 gain 134 41 -109.63 gain 41 135 -122.40 gain 135 41 -124.44 gain 41 136 -129.08 gain 136 41 -131.73 gain 41 137 -121.71 gain 137 41 -121.84 gain 41 138 -122.90 gain 138 41 -122.04 gain 41 139 -117.92 gain 139 41 -118.04 gain 41 140 -122.59 gain 140 41 -125.31 gain 41 141 -119.65 gain 141 41 -121.04 gain 41 142 -121.62 gain 142 41 -122.33 gain 41 143 -115.49 gain 143 41 -115.81 gain 41 144 -115.75 gain 144 41 -117.09 gain 41 145 -119.00 gain 145 41 -118.79 gain 41 146 -120.77 gain 146 41 -119.47 gain 41 147 -109.23 gain 147 41 -105.01 gain 41 148 -121.85 gain 148 41 -117.35 gain 41 149 -113.39 gain 149 41 -112.06 gain 41 150 -119.78 gain 150 41 -121.14 gain 41 151 -121.24 gain 151 41 -122.79 gain 41 152 -125.65 gain 152 41 -124.18 gain 41 153 -121.24 gain 153 41 -117.35 gain 41 154 -119.94 gain 154 41 -124.60 gain 41 155 -123.01 gain 155 41 -127.56 gain 41 156 -124.86 gain 156 41 -123.80 gain 41 157 -125.40 gain 157 41 -127.29 gain 41 158 -112.93 gain 158 41 -117.41 gain 41 159 -122.05 gain 159 41 -123.14 gain 41 160 -117.53 gain 160 41 -115.74 gain 41 161 -125.13 gain 161 41 -126.83 gain 41 162 -115.10 gain 162 41 -115.66 gain 41 163 -121.04 gain 163 41 -123.75 gain 41 164 -119.41 gain 164 41 -123.16 gain 41 165 -130.43 gain 165 41 -130.22 gain 41 166 -118.94 gain 166 41 -120.31 gain 41 167 -127.69 gain 167 41 -131.14 gain 41 168 -122.27 gain 168 41 -124.17 gain 41 169 -125.86 gain 169 41 -131.96 gain 41 170 -118.02 gain 170 41 -115.64 gain 41 171 -122.05 gain 171 41 -124.71 gain 41 172 -127.58 gain 172 41 -124.93 gain 41 173 -118.58 gain 173 41 -115.36 gain 41 174 -120.39 gain 174 41 -121.47 gain 41 175 -120.01 gain 175 41 -124.65 gain 41 176 -114.54 gain 176 41 -111.18 gain 41 177 -119.97 gain 177 41 -124.43 gain 41 178 -122.87 gain 178 41 -123.15 gain 41 179 -122.15 gain 179 41 -120.83 gain 41 180 -128.61 gain 180 41 -128.75 gain 41 181 -136.78 gain 181 41 -137.00 gain 41 182 -127.46 gain 182 41 -130.05 gain 41 183 -124.98 gain 183 41 -120.97 gain 41 184 -127.35 gain 184 41 -128.12 gain 41 185 -124.11 gain 185 41 -122.37 gain 41 186 -120.36 gain 186 41 -118.90 gain 41 187 -125.17 gain 187 41 -126.25 gain 41 188 -122.65 gain 188 41 -126.99 gain 41 189 -121.23 gain 189 41 -123.08 gain 41 190 -120.30 gain 190 41 -119.17 gain 41 191 -124.20 gain 191 41 -124.16 gain 41 192 -121.34 gain 192 41 -124.17 gain 41 193 -120.32 gain 193 41 -124.40 gain 41 194 -127.12 gain 194 41 -125.01 gain 41 195 -128.18 gain 195 41 -126.70 gain 41 196 -126.09 gain 196 41 -128.65 gain 41 197 -126.85 gain 197 41 -125.47 gain 41 198 -132.99 gain 198 41 -131.14 gain 41 199 -125.71 gain 199 41 -127.77 gain 41 200 -120.74 gain 200 41 -119.74 gain 41 201 -120.53 gain 201 41 -120.33 gain 41 202 -120.30 gain 202 41 -124.11 gain 41 203 -132.37 gain 203 41 -135.80 gain 41 204 -123.66 gain 204 41 -124.37 gain 41 205 -130.78 gain 205 41 -130.56 gain 41 206 -112.25 gain 206 41 -116.55 gain 41 207 -121.85 gain 207 41 -118.51 gain 41 208 -131.43 gain 208 41 -133.87 gain 41 209 -125.83 gain 209 41 -129.26 gain 41 210 -130.63 gain 210 41 -131.00 gain 41 211 -130.96 gain 211 41 -133.35 gain 41 212 -131.91 gain 212 41 -132.84 gain 41 213 -132.14 gain 213 41 -132.27 gain 41 214 -124.71 gain 214 41 -124.73 gain 41 215 -128.29 gain 215 41 -124.72 gain 41 216 -127.80 gain 216 41 -128.89 gain 41 217 -124.53 gain 217 41 -126.14 gain 41 218 -126.52 gain 218 41 -130.32 gain 41 219 -128.94 gain 219 41 -124.10 gain 41 220 -127.21 gain 220 41 -132.86 gain 41 221 -125.66 gain 221 41 -126.95 gain 41 222 -126.90 gain 222 41 -128.52 gain 41 223 -128.24 gain 223 41 -128.47 gain 41 224 -123.58 gain 224 41 -126.49 gain 42 43 -95.19 gain 43 42 -99.08 gain 42 44 -106.95 gain 44 42 -113.90 gain 42 45 -127.26 gain 45 42 -132.68 gain 42 46 -116.15 gain 46 42 -117.37 gain 42 47 -123.08 gain 47 42 -125.36 gain 42 48 -126.56 gain 48 42 -126.62 gain 42 49 -110.49 gain 49 42 -118.53 gain 42 50 -116.75 gain 50 42 -125.76 gain 42 51 -119.76 gain 51 42 -123.90 gain 42 52 -119.38 gain 52 42 -119.54 gain 42 53 -110.20 gain 53 42 -111.37 gain 42 54 -110.28 gain 54 42 -112.16 gain 42 55 -104.70 gain 55 42 -105.87 gain 42 56 -93.64 gain 56 42 -102.14 gain 42 57 -89.16 gain 57 42 -91.54 gain 42 58 -96.83 gain 58 42 -101.95 gain 42 59 -104.51 gain 59 42 -105.76 gain 42 60 -128.89 gain 60 42 -131.45 gain 42 61 -121.69 gain 61 42 -123.00 gain 42 62 -118.43 gain 62 42 -124.97 gain 42 63 -124.36 gain 63 42 -124.12 gain 42 64 -111.95 gain 64 42 -114.69 gain 42 65 -121.77 gain 65 42 -126.59 gain 42 66 -118.67 gain 66 42 -117.75 gain 42 67 -107.87 gain 67 42 -109.22 gain 42 68 -111.47 gain 68 42 -117.38 gain 42 69 -101.27 gain 69 42 -104.48 gain 42 70 -102.49 gain 70 42 -105.46 gain 42 71 -102.26 gain 71 42 -103.32 gain 42 72 -103.60 gain 72 42 -105.08 gain 42 73 -100.37 gain 73 42 -100.24 gain 42 74 -108.05 gain 74 42 -111.80 gain 42 75 -118.38 gain 75 42 -122.27 gain 42 76 -125.45 gain 76 42 -125.29 gain 42 77 -120.47 gain 77 42 -123.98 gain 42 78 -117.55 gain 78 42 -123.90 gain 42 79 -113.63 gain 79 42 -114.77 gain 42 80 -117.33 gain 80 42 -118.97 gain 42 81 -119.08 gain 81 42 -121.31 gain 42 82 -112.37 gain 82 42 -112.23 gain 42 83 -111.38 gain 83 42 -112.28 gain 42 84 -109.98 gain 84 42 -111.02 gain 42 85 -111.37 gain 85 42 -109.21 gain 42 86 -114.75 gain 86 42 -115.98 gain 42 87 -105.19 gain 87 42 -110.38 gain 42 88 -108.16 gain 88 42 -111.10 gain 42 89 -107.84 gain 89 42 -109.38 gain 42 90 -118.07 gain 90 42 -116.62 gain 42 91 -128.94 gain 91 42 -131.43 gain 42 92 -124.74 gain 92 42 -124.20 gain 42 93 -117.51 gain 93 42 -121.75 gain 42 94 -114.64 gain 94 42 -118.76 gain 42 95 -116.72 gain 95 42 -123.09 gain 42 96 -121.77 gain 96 42 -125.48 gain 42 97 -118.45 gain 97 42 -120.91 gain 42 98 -115.85 gain 98 42 -119.10 gain 42 99 -114.19 gain 99 42 -115.26 gain 42 100 -110.40 gain 100 42 -111.03 gain 42 101 -112.66 gain 101 42 -113.46 gain 42 102 -107.90 gain 102 42 -109.48 gain 42 103 -108.94 gain 103 42 -108.01 gain 42 104 -104.29 gain 104 42 -108.73 gain 42 105 -126.07 gain 105 42 -126.46 gain 42 106 -126.36 gain 106 42 -127.82 gain 42 107 -118.20 gain 107 42 -126.23 gain 42 108 -122.20 gain 108 42 -122.55 gain 42 109 -121.48 gain 109 42 -125.32 gain 42 110 -118.79 gain 110 42 -121.10 gain 42 111 -118.36 gain 111 42 -120.35 gain 42 112 -118.02 gain 112 42 -118.89 gain 42 113 -119.15 gain 113 42 -118.83 gain 42 114 -112.64 gain 114 42 -115.62 gain 42 115 -113.58 gain 115 42 -110.86 gain 42 116 -110.83 gain 116 42 -115.65 gain 42 117 -111.70 gain 117 42 -118.02 gain 42 118 -120.70 gain 118 42 -125.34 gain 42 119 -115.29 gain 119 42 -114.60 gain 42 120 -118.36 gain 120 42 -122.18 gain 42 121 -126.44 gain 121 42 -129.55 gain 42 122 -133.96 gain 122 42 -139.19 gain 42 123 -112.23 gain 123 42 -118.23 gain 42 124 -125.26 gain 124 42 -127.67 gain 42 125 -119.21 gain 125 42 -122.95 gain 42 126 -113.54 gain 126 42 -115.24 gain 42 127 -121.59 gain 127 42 -126.76 gain 42 128 -120.57 gain 128 42 -123.68 gain 42 129 -117.40 gain 129 42 -118.41 gain 42 130 -118.55 gain 130 42 -117.39 gain 42 131 -103.92 gain 131 42 -109.84 gain 42 132 -111.32 gain 132 42 -116.87 gain 42 133 -119.38 gain 133 42 -123.00 gain 42 134 -116.21 gain 134 42 -116.53 gain 42 135 -129.29 gain 135 42 -133.18 gain 42 136 -129.82 gain 136 42 -134.32 gain 42 137 -123.70 gain 137 42 -125.69 gain 42 138 -121.94 gain 138 42 -122.92 gain 42 139 -122.47 gain 139 42 -124.44 gain 42 140 -122.69 gain 140 42 -127.26 gain 42 141 -120.99 gain 141 42 -124.23 gain 42 142 -120.98 gain 142 42 -123.54 gain 42 143 -114.47 gain 143 42 -116.65 gain 42 144 -118.65 gain 144 42 -121.84 gain 42 145 -109.44 gain 145 42 -111.07 gain 42 146 -114.60 gain 146 42 -115.14 gain 42 147 -119.85 gain 147 42 -117.49 gain 42 148 -107.41 gain 148 42 -104.77 gain 42 149 -116.28 gain 149 42 -116.80 gain 42 150 -132.86 gain 150 42 -136.06 gain 42 151 -124.14 gain 151 42 -127.54 gain 42 152 -123.67 gain 152 42 -124.05 gain 42 153 -124.48 gain 153 42 -122.44 gain 42 154 -124.13 gain 154 42 -130.64 gain 42 155 -116.47 gain 155 42 -122.87 gain 42 156 -119.21 gain 156 42 -120.00 gain 42 157 -119.61 gain 157 42 -123.35 gain 42 158 -125.45 gain 158 42 -131.78 gain 42 159 -115.85 gain 159 42 -118.80 gain 42 160 -125.74 gain 160 42 -125.80 gain 42 161 -119.04 gain 161 42 -122.59 gain 42 162 -126.75 gain 162 42 -129.17 gain 42 163 -115.75 gain 163 42 -120.31 gain 42 164 -118.22 gain 164 42 -123.83 gain 42 165 -121.90 gain 165 42 -123.55 gain 42 166 -129.19 gain 166 42 -132.40 gain 42 167 -128.87 gain 167 42 -134.17 gain 42 168 -119.87 gain 168 42 -123.62 gain 42 169 -123.95 gain 169 42 -131.91 gain 42 170 -120.89 gain 170 42 -120.37 gain 42 171 -125.10 gain 171 42 -129.60 gain 42 172 -122.88 gain 172 42 -122.08 gain 42 173 -118.21 gain 173 42 -116.85 gain 42 174 -118.54 gain 174 42 -121.47 gain 42 175 -121.64 gain 175 42 -128.13 gain 42 176 -109.29 gain 176 42 -107.79 gain 42 177 -120.90 gain 177 42 -127.21 gain 42 178 -114.63 gain 178 42 -116.77 gain 42 179 -119.11 gain 179 42 -119.63 gain 42 180 -126.56 gain 180 42 -128.55 gain 42 181 -123.07 gain 181 42 -125.13 gain 42 182 -124.12 gain 182 42 -128.57 gain 42 183 -119.88 gain 183 42 -117.71 gain 42 184 -124.16 gain 184 42 -126.78 gain 42 185 -119.70 gain 185 42 -119.80 gain 42 186 -126.20 gain 186 42 -126.59 gain 42 187 -124.49 gain 187 42 -127.42 gain 42 188 -121.31 gain 188 42 -127.50 gain 42 189 -129.06 gain 189 42 -132.77 gain 42 190 -121.93 gain 190 42 -122.65 gain 42 191 -118.21 gain 191 42 -120.02 gain 42 192 -122.21 gain 192 42 -126.89 gain 42 193 -125.11 gain 193 42 -131.04 gain 42 194 -119.22 gain 194 42 -118.96 gain 42 195 -122.68 gain 195 42 -123.05 gain 42 196 -126.55 gain 196 42 -130.96 gain 42 197 -123.15 gain 197 42 -123.62 gain 42 198 -126.66 gain 198 42 -126.65 gain 42 199 -128.60 gain 199 42 -132.51 gain 42 200 -124.31 gain 200 42 -125.15 gain 42 201 -123.27 gain 201 42 -124.93 gain 42 202 -120.20 gain 202 42 -125.86 gain 42 203 -119.76 gain 203 42 -125.03 gain 42 204 -127.31 gain 204 42 -129.87 gain 42 205 -118.02 gain 205 42 -119.65 gain 42 206 -128.49 gain 206 42 -134.64 gain 42 207 -126.01 gain 207 42 -124.52 gain 42 208 -122.04 gain 208 42 -126.33 gain 42 209 -122.11 gain 209 42 -127.39 gain 42 210 -127.68 gain 210 42 -129.90 gain 42 211 -124.67 gain 211 42 -128.92 gain 42 212 -123.09 gain 212 42 -125.87 gain 42 213 -123.71 gain 213 42 -125.69 gain 42 214 -129.49 gain 214 42 -131.36 gain 42 215 -127.15 gain 215 42 -125.43 gain 42 216 -129.80 gain 216 42 -132.74 gain 42 217 -124.69 gain 217 42 -128.15 gain 42 218 -128.02 gain 218 42 -133.67 gain 42 219 -117.13 gain 219 42 -114.14 gain 42 220 -123.08 gain 220 42 -130.57 gain 42 221 -126.38 gain 221 42 -129.52 gain 42 222 -131.69 gain 222 42 -135.16 gain 42 223 -124.73 gain 223 42 -126.81 gain 42 224 -122.34 gain 224 42 -127.11 gain 43 44 -91.03 gain 44 43 -94.09 gain 43 45 -125.16 gain 45 43 -126.69 gain 43 46 -124.52 gain 46 43 -121.85 gain 43 47 -119.66 gain 47 43 -118.04 gain 43 48 -120.98 gain 48 43 -117.16 gain 43 49 -127.01 gain 49 43 -131.16 gain 43 50 -111.19 gain 50 43 -116.31 gain 43 51 -114.68 gain 51 43 -114.93 gain 43 52 -110.56 gain 52 43 -106.84 gain 43 53 -121.38 gain 53 43 -118.67 gain 43 54 -117.57 gain 54 43 -115.56 gain 43 55 -107.68 gain 55 43 -104.97 gain 43 56 -110.06 gain 56 43 -114.67 gain 43 57 -106.26 gain 57 43 -104.75 gain 43 58 -94.96 gain 58 43 -96.19 gain 43 59 -103.45 gain 59 43 -100.81 gain 43 60 -121.01 gain 60 43 -119.68 gain 43 61 -128.19 gain 61 43 -125.62 gain 43 62 -128.84 gain 62 43 -131.49 gain 43 63 -122.99 gain 63 43 -118.87 gain 43 64 -134.67 gain 64 43 -133.51 gain 43 65 -124.87 gain 65 43 -125.80 gain 43 66 -119.43 gain 66 43 -114.62 gain 43 67 -123.67 gain 67 43 -121.13 gain 43 68 -113.37 gain 68 43 -115.40 gain 43 69 -113.38 gain 69 43 -112.69 gain 43 70 -109.65 gain 70 43 -108.72 gain 43 71 -103.24 gain 71 43 -100.42 gain 43 72 -97.74 gain 72 43 -95.34 gain 43 73 -102.77 gain 73 43 -98.75 gain 43 74 -106.91 gain 74 43 -106.77 gain 43 75 -128.12 gain 75 43 -128.12 gain 43 76 -122.58 gain 76 43 -118.53 gain 43 77 -126.21 gain 77 43 -125.83 gain 43 78 -125.59 gain 78 43 -128.06 gain 43 79 -121.39 gain 79 43 -118.64 gain 43 80 -122.90 gain 80 43 -120.65 gain 43 81 -113.26 gain 81 43 -111.60 gain 43 82 -120.51 gain 82 43 -116.48 gain 43 83 -119.56 gain 83 43 -116.56 gain 43 84 -110.68 gain 84 43 -107.83 gain 43 85 -113.21 gain 85 43 -107.16 gain 43 86 -107.88 gain 86 43 -105.22 gain 43 87 -105.60 gain 87 43 -106.90 gain 43 88 -104.94 gain 88 43 -103.99 gain 43 89 -105.90 gain 89 43 -103.55 gain 43 90 -125.58 gain 90 43 -120.24 gain 43 91 -126.36 gain 91 43 -124.97 gain 43 92 -129.31 gain 92 43 -124.88 gain 43 93 -131.82 gain 93 43 -132.17 gain 43 94 -123.56 gain 94 43 -123.79 gain 43 95 -127.61 gain 95 43 -130.09 gain 43 96 -123.60 gain 96 43 -123.42 gain 43 97 -128.69 gain 97 43 -127.25 gain 43 98 -121.38 gain 98 43 -120.75 gain 43 99 -116.17 gain 99 43 -113.35 gain 43 100 -115.89 gain 100 43 -112.64 gain 43 101 -113.03 gain 101 43 -109.94 gain 43 102 -111.98 gain 102 43 -109.68 gain 43 103 -108.89 gain 103 43 -104.07 gain 43 104 -112.23 gain 104 43 -112.78 gain 43 105 -128.93 gain 105 43 -125.42 gain 43 106 -126.60 gain 106 43 -124.18 gain 43 107 -123.63 gain 107 43 -127.78 gain 43 108 -124.09 gain 108 43 -120.55 gain 43 109 -126.20 gain 109 43 -126.15 gain 43 110 -127.40 gain 110 43 -125.83 gain 43 111 -122.57 gain 111 43 -120.67 gain 43 112 -119.68 gain 112 43 -116.66 gain 43 113 -122.56 gain 113 43 -118.35 gain 43 114 -120.71 gain 114 43 -119.80 gain 43 115 -119.57 gain 115 43 -112.96 gain 43 116 -117.11 gain 116 43 -118.04 gain 43 117 -121.84 gain 117 43 -124.28 gain 43 118 -119.83 gain 118 43 -120.59 gain 43 119 -118.83 gain 119 43 -114.24 gain 43 120 -129.90 gain 120 43 -129.84 gain 43 121 -135.37 gain 121 43 -134.59 gain 43 122 -133.05 gain 122 43 -134.39 gain 43 123 -125.07 gain 123 43 -127.19 gain 43 124 -133.29 gain 124 43 -131.82 gain 43 125 -122.87 gain 125 43 -122.73 gain 43 126 -128.98 gain 126 43 -126.80 gain 43 127 -121.47 gain 127 43 -122.74 gain 43 128 -125.55 gain 128 43 -124.76 gain 43 129 -107.54 gain 129 43 -104.67 gain 43 130 -114.64 gain 130 43 -109.59 gain 43 131 -120.71 gain 131 43 -122.75 gain 43 132 -123.83 gain 132 43 -125.49 gain 43 133 -114.56 gain 133 43 -114.29 gain 43 134 -115.93 gain 134 43 -112.37 gain 43 135 -129.64 gain 135 43 -129.64 gain 43 136 -130.02 gain 136 43 -130.63 gain 43 137 -122.28 gain 137 43 -120.38 gain 43 138 -125.67 gain 138 43 -122.76 gain 43 139 -132.28 gain 139 43 -130.36 gain 43 140 -121.65 gain 140 43 -122.34 gain 43 141 -128.83 gain 141 43 -128.19 gain 43 142 -122.92 gain 142 43 -121.58 gain 43 143 -124.83 gain 143 43 -123.11 gain 43 144 -122.08 gain 144 43 -121.38 gain 43 145 -118.50 gain 145 43 -116.25 gain 43 146 -120.09 gain 146 43 -116.75 gain 43 147 -122.07 gain 147 43 -115.82 gain 43 148 -120.57 gain 148 43 -114.03 gain 43 149 -116.01 gain 149 43 -112.64 gain 43 150 -130.71 gain 150 43 -130.03 gain 43 151 -136.05 gain 151 43 -135.57 gain 43 152 -130.36 gain 152 43 -126.85 gain 43 153 -126.32 gain 153 43 -120.39 gain 43 154 -125.75 gain 154 43 -128.37 gain 43 155 -124.83 gain 155 43 -127.35 gain 43 156 -127.58 gain 156 43 -124.48 gain 43 157 -120.59 gain 157 43 -120.44 gain 43 158 -120.80 gain 158 43 -123.24 gain 43 159 -123.98 gain 159 43 -123.04 gain 43 160 -132.81 gain 160 43 -128.98 gain 43 161 -131.61 gain 161 43 -131.27 gain 43 162 -124.22 gain 162 43 -122.75 gain 43 163 -120.91 gain 163 43 -121.59 gain 43 164 -123.60 gain 164 43 -125.31 gain 43 165 -129.63 gain 165 43 -127.38 gain 43 166 -124.38 gain 166 43 -123.71 gain 43 167 -130.17 gain 167 43 -131.58 gain 43 168 -117.91 gain 168 43 -117.77 gain 43 169 -123.44 gain 169 43 -127.50 gain 43 170 -126.53 gain 170 43 -122.12 gain 43 171 -124.65 gain 171 43 -125.27 gain 43 172 -124.57 gain 172 43 -119.88 gain 43 173 -125.60 gain 173 43 -120.35 gain 43 174 -126.40 gain 174 43 -125.45 gain 43 175 -128.81 gain 175 43 -131.41 gain 43 176 -124.97 gain 176 43 -119.58 gain 43 177 -120.86 gain 177 43 -123.28 gain 43 178 -121.71 gain 178 43 -119.95 gain 43 179 -122.47 gain 179 43 -119.11 gain 43 180 -132.67 gain 180 43 -130.77 gain 43 181 -135.91 gain 181 43 -134.09 gain 43 182 -130.56 gain 182 43 -131.12 gain 43 183 -129.12 gain 183 43 -123.07 gain 43 184 -134.02 gain 184 43 -132.75 gain 43 185 -130.11 gain 185 43 -126.33 gain 43 186 -120.07 gain 186 43 -116.58 gain 43 187 -123.23 gain 187 43 -122.27 gain 43 188 -122.87 gain 188 43 -125.17 gain 43 189 -127.27 gain 189 43 -127.08 gain 43 190 -127.37 gain 190 43 -124.20 gain 43 191 -124.27 gain 191 43 -122.19 gain 43 192 -126.18 gain 192 43 -126.97 gain 43 193 -123.90 gain 193 43 -125.94 gain 43 194 -125.16 gain 194 43 -121.00 gain 43 195 -122.70 gain 195 43 -119.18 gain 43 196 -131.04 gain 196 43 -131.56 gain 43 197 -126.31 gain 197 43 -122.89 gain 43 198 -132.60 gain 198 43 -128.70 gain 43 199 -127.48 gain 199 43 -127.51 gain 43 200 -125.67 gain 200 43 -122.63 gain 43 201 -130.95 gain 201 43 -128.72 gain 43 202 -130.79 gain 202 43 -132.55 gain 43 203 -128.45 gain 203 43 -129.84 gain 43 204 -124.27 gain 204 43 -122.94 gain 43 205 -124.34 gain 205 43 -122.08 gain 43 206 -123.10 gain 206 43 -125.36 gain 43 207 -124.21 gain 207 43 -118.84 gain 43 208 -117.29 gain 208 43 -117.69 gain 43 209 -120.91 gain 209 43 -122.31 gain 43 210 -132.81 gain 210 43 -131.14 gain 43 211 -133.81 gain 211 43 -134.17 gain 43 212 -131.77 gain 212 43 -130.67 gain 43 213 -132.05 gain 213 43 -130.14 gain 43 214 -128.93 gain 214 43 -126.91 gain 43 215 -130.25 gain 215 43 -124.64 gain 43 216 -137.13 gain 216 43 -136.18 gain 43 217 -122.82 gain 217 43 -122.39 gain 43 218 -130.01 gain 218 43 -131.77 gain 43 219 -128.43 gain 219 43 -121.55 gain 43 220 -128.66 gain 220 43 -132.27 gain 43 221 -134.18 gain 221 43 -133.43 gain 43 222 -129.48 gain 222 43 -129.06 gain 43 223 -125.57 gain 223 43 -123.76 gain 43 224 -126.07 gain 224 43 -126.95 gain 44 45 -140.01 gain 45 44 -138.49 gain 44 46 -137.23 gain 46 44 -131.49 gain 44 47 -130.34 gain 47 44 -125.67 gain 44 48 -136.26 gain 48 44 -129.37 gain 44 49 -130.45 gain 49 44 -131.54 gain 44 50 -124.77 gain 50 44 -126.83 gain 44 51 -122.55 gain 51 44 -119.75 gain 44 52 -130.73 gain 52 44 -123.94 gain 44 53 -115.38 gain 53 44 -109.61 gain 44 54 -118.33 gain 54 44 -113.26 gain 44 55 -121.17 gain 55 44 -115.40 gain 44 56 -108.84 gain 56 44 -110.40 gain 44 57 -111.21 gain 57 44 -106.64 gain 44 58 -103.64 gain 58 44 -101.81 gain 44 59 -101.16 gain 59 44 -95.45 gain 44 60 -129.06 gain 60 44 -124.68 gain 44 61 -123.99 gain 61 44 -118.35 gain 44 62 -133.08 gain 62 44 -132.66 gain 44 63 -122.20 gain 63 44 -115.01 gain 44 64 -131.51 gain 64 44 -127.29 gain 44 65 -123.24 gain 65 44 -121.11 gain 44 66 -124.65 gain 66 44 -116.78 gain 44 67 -127.97 gain 67 44 -122.38 gain 44 68 -126.65 gain 68 44 -125.61 gain 44 69 -122.09 gain 69 44 -118.34 gain 44 70 -122.41 gain 70 44 -118.42 gain 44 71 -122.51 gain 71 44 -116.63 gain 44 72 -109.01 gain 72 44 -103.54 gain 44 73 -113.01 gain 73 44 -105.93 gain 44 74 -109.12 gain 74 44 -105.93 gain 44 75 -133.15 gain 75 44 -130.09 gain 44 76 -134.99 gain 76 44 -127.88 gain 44 77 -135.76 gain 77 44 -132.32 gain 44 78 -128.49 gain 78 44 -127.90 gain 44 79 -131.61 gain 79 44 -125.79 gain 44 80 -129.95 gain 80 44 -124.64 gain 44 81 -121.48 gain 81 44 -116.76 gain 44 82 -121.22 gain 82 44 -114.12 gain 44 83 -123.84 gain 83 44 -117.78 gain 44 84 -119.83 gain 84 44 -113.92 gain 44 85 -119.03 gain 85 44 -109.93 gain 44 86 -118.09 gain 86 44 -112.37 gain 44 87 -111.29 gain 87 44 -109.53 gain 44 88 -116.44 gain 88 44 -112.43 gain 44 89 -116.73 gain 89 44 -111.32 gain 44 90 -134.97 gain 90 44 -126.57 gain 44 91 -131.87 gain 91 44 -127.41 gain 44 92 -126.67 gain 92 44 -119.18 gain 44 93 -128.41 gain 93 44 -125.70 gain 44 94 -137.76 gain 94 44 -134.93 gain 44 95 -128.29 gain 95 44 -127.71 gain 44 96 -123.37 gain 96 44 -120.13 gain 44 97 -122.71 gain 97 44 -118.21 gain 44 98 -125.74 gain 98 44 -122.04 gain 44 99 -119.73 gain 99 44 -113.86 gain 44 100 -122.73 gain 100 44 -116.42 gain 44 101 -122.93 gain 101 44 -116.78 gain 44 102 -115.28 gain 102 44 -109.91 gain 44 103 -122.62 gain 103 44 -114.74 gain 44 104 -114.81 gain 104 44 -112.30 gain 44 105 -138.78 gain 105 44 -132.21 gain 44 106 -129.98 gain 106 44 -124.49 gain 44 107 -130.08 gain 107 44 -131.16 gain 44 108 -122.62 gain 108 44 -116.02 gain 44 109 -130.18 gain 109 44 -127.07 gain 44 110 -127.76 gain 110 44 -123.12 gain 44 111 -130.30 gain 111 44 -125.34 gain 44 112 -129.47 gain 112 44 -123.39 gain 44 113 -123.47 gain 113 44 -116.20 gain 44 114 -131.51 gain 114 44 -127.54 gain 44 115 -107.33 gain 115 44 -97.66 gain 44 116 -118.13 gain 116 44 -116.01 gain 44 117 -120.49 gain 117 44 -119.86 gain 44 118 -123.33 gain 118 44 -121.02 gain 44 119 -115.56 gain 119 44 -107.92 gain 44 120 -139.13 gain 120 44 -136.00 gain 44 121 -133.66 gain 121 44 -129.82 gain 44 122 -130.43 gain 122 44 -128.70 gain 44 123 -129.50 gain 123 44 -128.55 gain 44 124 -122.13 gain 124 44 -117.60 gain 44 125 -127.21 gain 125 44 -124.01 gain 44 126 -130.06 gain 126 44 -124.82 gain 44 127 -125.40 gain 127 44 -123.61 gain 44 128 -125.15 gain 128 44 -121.31 gain 44 129 -134.92 gain 129 44 -128.98 gain 44 130 -135.74 gain 130 44 -127.63 gain 44 131 -120.02 gain 131 44 -119.00 gain 44 132 -117.82 gain 132 44 -116.42 gain 44 133 -123.00 gain 133 44 -119.67 gain 44 134 -121.33 gain 134 44 -114.70 gain 44 135 -130.62 gain 135 44 -127.56 gain 44 136 -141.99 gain 136 44 -139.54 gain 44 137 -125.19 gain 137 44 -120.23 gain 44 138 -132.10 gain 138 44 -126.13 gain 44 139 -121.16 gain 139 44 -116.18 gain 44 140 -130.22 gain 140 44 -127.85 gain 44 141 -132.01 gain 141 44 -128.31 gain 44 142 -126.09 gain 142 44 -121.70 gain 44 143 -121.71 gain 143 44 -116.93 gain 44 144 -127.85 gain 144 44 -124.09 gain 44 145 -123.12 gain 145 44 -117.81 gain 44 146 -121.78 gain 146 44 -115.38 gain 44 147 -122.92 gain 147 44 -113.60 gain 44 148 -123.14 gain 148 44 -113.54 gain 44 149 -118.01 gain 149 44 -111.58 gain 44 150 -138.21 gain 150 44 -134.46 gain 44 151 -126.69 gain 151 44 -123.14 gain 44 152 -128.52 gain 152 44 -121.95 gain 44 153 -133.28 gain 153 44 -124.29 gain 44 154 -129.70 gain 154 44 -129.26 gain 44 155 -129.09 gain 155 44 -128.55 gain 44 156 -129.32 gain 156 44 -123.16 gain 44 157 -130.23 gain 157 44 -127.01 gain 44 158 -132.60 gain 158 44 -131.98 gain 44 159 -131.13 gain 159 44 -127.13 gain 44 160 -136.44 gain 160 44 -129.55 gain 44 161 -131.03 gain 161 44 -127.63 gain 44 162 -127.65 gain 162 44 -123.12 gain 44 163 -127.52 gain 163 44 -125.14 gain 44 164 -124.87 gain 164 44 -123.53 gain 44 165 -134.58 gain 165 44 -129.27 gain 44 166 -129.40 gain 166 44 -125.67 gain 44 167 -137.66 gain 167 44 -136.02 gain 44 168 -134.60 gain 168 44 -131.40 gain 44 169 -133.70 gain 169 44 -134.71 gain 44 170 -125.82 gain 170 44 -118.35 gain 44 171 -132.83 gain 171 44 -130.38 gain 44 172 -132.63 gain 172 44 -124.88 gain 44 173 -128.27 gain 173 44 -119.95 gain 44 174 -126.96 gain 174 44 -122.94 gain 44 175 -126.78 gain 175 44 -126.31 gain 44 176 -131.00 gain 176 44 -122.55 gain 44 177 -127.39 gain 177 44 -126.75 gain 44 178 -122.51 gain 178 44 -117.69 gain 44 179 -132.67 gain 179 44 -126.25 gain 44 180 -132.76 gain 180 44 -127.81 gain 44 181 -139.66 gain 181 44 -134.77 gain 44 182 -140.35 gain 182 44 -137.85 gain 44 183 -135.12 gain 183 44 -126.01 gain 44 184 -134.74 gain 184 44 -130.42 gain 44 185 -134.46 gain 185 44 -127.62 gain 44 186 -137.83 gain 186 44 -131.27 gain 44 187 -132.15 gain 187 44 -128.13 gain 44 188 -129.26 gain 188 44 -128.50 gain 44 189 -128.88 gain 189 44 -125.63 gain 44 190 -131.78 gain 190 44 -125.55 gain 44 191 -128.16 gain 191 44 -123.02 gain 44 192 -133.66 gain 192 44 -131.39 gain 44 193 -117.22 gain 193 44 -116.20 gain 44 194 -126.84 gain 194 44 -119.63 gain 44 195 -133.58 gain 195 44 -127.00 gain 44 196 -130.86 gain 196 44 -128.32 gain 44 197 -134.52 gain 197 44 -128.04 gain 44 198 -131.89 gain 198 44 -124.93 gain 44 199 -129.10 gain 199 44 -126.06 gain 44 200 -137.08 gain 200 44 -130.98 gain 44 201 -130.73 gain 201 44 -125.43 gain 44 202 -136.30 gain 202 44 -135.01 gain 44 203 -127.76 gain 203 44 -126.09 gain 44 204 -132.05 gain 204 44 -127.66 gain 44 205 -133.36 gain 205 44 -128.04 gain 44 206 -122.84 gain 206 44 -122.04 gain 44 207 -137.91 gain 207 44 -129.48 gain 44 208 -127.10 gain 208 44 -124.45 gain 44 209 -135.10 gain 209 44 -133.44 gain 44 210 -136.69 gain 210 44 -131.96 gain 44 211 -134.45 gain 211 44 -131.74 gain 44 212 -133.34 gain 212 44 -129.17 gain 44 213 -133.88 gain 213 44 -128.90 gain 44 214 -124.43 gain 214 44 -119.35 gain 44 215 -134.05 gain 215 44 -125.38 gain 44 216 -127.56 gain 216 44 -123.56 gain 44 217 -135.43 gain 217 44 -131.95 gain 44 218 -130.30 gain 218 44 -129.00 gain 44 219 -129.79 gain 219 44 -119.85 gain 44 220 -131.77 gain 220 44 -132.33 gain 44 221 -128.45 gain 221 44 -124.65 gain 44 222 -130.16 gain 222 44 -126.68 gain 44 223 -130.78 gain 223 44 -125.91 gain 44 224 -123.16 gain 224 44 -120.98 gain 45 46 -97.65 gain 46 45 -93.44 gain 45 47 -106.30 gain 47 45 -103.15 gain 45 48 -114.46 gain 48 45 -109.10 gain 45 49 -114.55 gain 49 45 -117.16 gain 45 50 -117.69 gain 50 45 -121.27 gain 45 51 -123.09 gain 51 45 -121.81 gain 45 52 -117.23 gain 52 45 -111.97 gain 45 53 -123.44 gain 53 45 -119.20 gain 45 54 -125.90 gain 54 45 -122.35 gain 45 55 -121.18 gain 55 45 -116.93 gain 45 56 -129.64 gain 56 45 -132.72 gain 45 57 -126.90 gain 57 45 -123.86 gain 45 58 -134.96 gain 58 45 -134.66 gain 45 59 -128.32 gain 59 45 -124.14 gain 45 60 -104.08 gain 60 45 -101.22 gain 45 61 -101.17 gain 61 45 -97.06 gain 45 62 -112.57 gain 62 45 -113.68 gain 45 63 -108.78 gain 63 45 -103.11 gain 45 64 -121.24 gain 64 45 -118.55 gain 45 65 -111.93 gain 65 45 -111.33 gain 45 66 -126.50 gain 66 45 -120.16 gain 45 67 -118.03 gain 67 45 -113.96 gain 45 68 -126.48 gain 68 45 -126.97 gain 45 69 -119.17 gain 69 45 -116.95 gain 45 70 -126.08 gain 70 45 -123.61 gain 45 71 -125.96 gain 71 45 -121.61 gain 45 72 -136.18 gain 72 45 -132.24 gain 45 73 -129.56 gain 73 45 -124.01 gain 45 74 -130.70 gain 74 45 -129.03 gain 45 75 -108.20 gain 75 45 -106.67 gain 45 76 -108.72 gain 76 45 -103.14 gain 45 77 -116.72 gain 77 45 -114.80 gain 45 78 -116.06 gain 78 45 -117.00 gain 45 79 -110.58 gain 79 45 -106.30 gain 45 80 -129.45 gain 80 45 -125.66 gain 45 81 -125.33 gain 81 45 -122.14 gain 45 82 -121.74 gain 82 45 -116.17 gain 45 83 -117.80 gain 83 45 -113.27 gain 45 84 -125.30 gain 84 45 -120.91 gain 45 85 -125.88 gain 85 45 -118.30 gain 45 86 -129.87 gain 86 45 -125.67 gain 45 87 -138.52 gain 87 45 -138.29 gain 45 88 -131.56 gain 88 45 -129.08 gain 45 89 -127.22 gain 89 45 -123.34 gain 45 90 -109.06 gain 90 45 -102.19 gain 45 91 -118.90 gain 91 45 -115.96 gain 45 92 -117.70 gain 92 45 -111.73 gain 45 93 -116.87 gain 93 45 -115.68 gain 45 94 -123.41 gain 94 45 -122.10 gain 45 95 -123.89 gain 95 45 -124.84 gain 45 96 -120.33 gain 96 45 -118.61 gain 45 97 -117.96 gain 97 45 -114.99 gain 45 98 -131.03 gain 98 45 -128.85 gain 45 99 -125.71 gain 99 45 -121.36 gain 45 100 -124.71 gain 100 45 -119.93 gain 45 101 -123.88 gain 101 45 -119.26 gain 45 102 -137.55 gain 102 45 -133.71 gain 45 103 -126.57 gain 103 45 -120.21 gain 45 104 -124.85 gain 104 45 -123.86 gain 45 105 -113.13 gain 105 45 -108.09 gain 45 106 -110.34 gain 106 45 -106.38 gain 45 107 -122.05 gain 107 45 -124.66 gain 45 108 -113.02 gain 108 45 -107.95 gain 45 109 -122.26 gain 109 45 -120.68 gain 45 110 -119.14 gain 110 45 -116.02 gain 45 111 -125.51 gain 111 45 -122.07 gain 45 112 -122.19 gain 112 45 -117.64 gain 45 113 -119.39 gain 113 45 -113.64 gain 45 114 -127.47 gain 114 45 -125.02 gain 45 115 -122.92 gain 115 45 -114.78 gain 45 116 -134.84 gain 116 45 -134.24 gain 45 117 -126.81 gain 117 45 -127.71 gain 45 118 -133.77 gain 118 45 -132.99 gain 45 119 -132.60 gain 119 45 -126.48 gain 45 120 -119.64 gain 120 45 -118.03 gain 45 121 -118.19 gain 121 45 -115.88 gain 45 122 -123.60 gain 122 45 -123.40 gain 45 123 -116.13 gain 123 45 -116.70 gain 45 124 -113.02 gain 124 45 -110.01 gain 45 125 -123.40 gain 125 45 -121.73 gain 45 126 -128.25 gain 126 45 -124.53 gain 45 127 -121.46 gain 127 45 -121.20 gain 45 128 -125.36 gain 128 45 -123.03 gain 45 129 -127.02 gain 129 45 -122.61 gain 45 130 -133.60 gain 130 45 -127.01 gain 45 131 -123.83 gain 131 45 -124.33 gain 45 132 -138.67 gain 132 45 -138.80 gain 45 133 -135.89 gain 133 45 -134.08 gain 45 134 -131.62 gain 134 45 -126.51 gain 45 135 -121.52 gain 135 45 -119.98 gain 45 136 -118.93 gain 136 45 -118.00 gain 45 137 -118.62 gain 137 45 -115.18 gain 45 138 -126.31 gain 138 45 -121.87 gain 45 139 -125.87 gain 139 45 -122.42 gain 45 140 -126.56 gain 140 45 -125.71 gain 45 141 -126.98 gain 141 45 -124.81 gain 45 142 -122.22 gain 142 45 -119.35 gain 45 143 -130.50 gain 143 45 -127.25 gain 45 144 -134.15 gain 144 45 -131.92 gain 45 145 -127.37 gain 145 45 -123.58 gain 45 146 -119.15 gain 146 45 -114.27 gain 45 147 -126.88 gain 147 45 -119.09 gain 45 148 -136.41 gain 148 45 -128.34 gain 45 149 -124.95 gain 149 45 -120.04 gain 45 150 -117.11 gain 150 45 -114.89 gain 45 151 -125.09 gain 151 45 -123.07 gain 45 152 -116.60 gain 152 45 -111.55 gain 45 153 -124.16 gain 153 45 -116.70 gain 45 154 -119.14 gain 154 45 -120.23 gain 45 155 -126.02 gain 155 45 -127.00 gain 45 156 -131.74 gain 156 45 -127.11 gain 45 157 -127.21 gain 157 45 -125.52 gain 45 158 -132.98 gain 158 45 -133.88 gain 45 159 -127.76 gain 159 45 -125.29 gain 45 160 -131.76 gain 160 45 -126.39 gain 45 161 -131.21 gain 161 45 -129.34 gain 45 162 -124.24 gain 162 45 -121.23 gain 45 163 -135.20 gain 163 45 -134.33 gain 45 164 -130.96 gain 164 45 -131.14 gain 45 165 -132.61 gain 165 45 -128.83 gain 45 166 -118.12 gain 166 45 -115.91 gain 45 167 -126.67 gain 167 45 -126.55 gain 45 168 -114.79 gain 168 45 -113.13 gain 45 169 -124.79 gain 169 45 -127.32 gain 45 170 -123.15 gain 170 45 -117.20 gain 45 171 -127.27 gain 171 45 -126.35 gain 45 172 -124.85 gain 172 45 -118.63 gain 45 173 -121.40 gain 173 45 -114.61 gain 45 174 -133.11 gain 174 45 -130.62 gain 45 175 -126.39 gain 175 45 -127.45 gain 45 176 -129.62 gain 176 45 -122.69 gain 45 177 -128.21 gain 177 45 -129.10 gain 45 178 -131.69 gain 178 45 -128.40 gain 45 179 -130.03 gain 179 45 -125.13 gain 45 180 -126.22 gain 180 45 -122.79 gain 45 181 -125.87 gain 181 45 -122.51 gain 45 182 -123.15 gain 182 45 -122.18 gain 45 183 -123.36 gain 183 45 -115.77 gain 45 184 -126.50 gain 184 45 -123.70 gain 45 185 -125.46 gain 185 45 -120.14 gain 45 186 -128.25 gain 186 45 -123.22 gain 45 187 -126.25 gain 187 45 -123.76 gain 45 188 -131.20 gain 188 45 -131.96 gain 45 189 -140.21 gain 189 45 -138.49 gain 45 190 -133.35 gain 190 45 -128.64 gain 45 191 -133.66 gain 191 45 -130.04 gain 45 192 -133.47 gain 192 45 -132.72 gain 45 193 -137.93 gain 193 45 -138.43 gain 45 194 -131.16 gain 194 45 -125.47 gain 45 195 -132.20 gain 195 45 -127.14 gain 45 196 -130.96 gain 196 45 -129.95 gain 45 197 -127.14 gain 197 45 -122.18 gain 45 198 -128.30 gain 198 45 -122.87 gain 45 199 -134.08 gain 199 45 -132.57 gain 45 200 -129.81 gain 200 45 -125.24 gain 45 201 -123.93 gain 201 45 -120.16 gain 45 202 -125.78 gain 202 45 -126.01 gain 45 203 -127.48 gain 203 45 -127.33 gain 45 204 -135.84 gain 204 45 -132.97 gain 45 205 -123.90 gain 205 45 -120.11 gain 45 206 -130.21 gain 206 45 -130.94 gain 45 207 -133.58 gain 207 45 -126.67 gain 45 208 -132.90 gain 208 45 -131.77 gain 45 209 -135.87 gain 209 45 -135.73 gain 45 210 -136.40 gain 210 45 -133.20 gain 45 211 -126.73 gain 211 45 -125.55 gain 45 212 -124.30 gain 212 45 -121.66 gain 45 213 -123.88 gain 213 45 -120.43 gain 45 214 -128.40 gain 214 45 -124.84 gain 45 215 -131.64 gain 215 45 -124.50 gain 45 216 -132.40 gain 216 45 -129.92 gain 45 217 -135.62 gain 217 45 -133.65 gain 45 218 -129.81 gain 218 45 -130.04 gain 45 219 -133.24 gain 219 45 -124.83 gain 45 220 -132.77 gain 220 45 -134.85 gain 45 221 -134.05 gain 221 45 -131.77 gain 45 222 -128.72 gain 222 45 -126.76 gain 45 223 -123.96 gain 223 45 -120.61 gain 45 224 -135.35 gain 224 45 -134.69 gain 46 47 -90.00 gain 47 46 -91.06 gain 46 48 -97.13 gain 48 46 -95.97 gain 46 49 -104.83 gain 49 46 -111.65 gain 46 50 -104.62 gain 50 46 -112.40 gain 46 51 -110.09 gain 51 46 -113.02 gain 46 52 -118.56 gain 52 46 -117.50 gain 46 53 -116.04 gain 53 46 -116.00 gain 46 54 -118.22 gain 54 46 -118.88 gain 46 55 -121.45 gain 55 46 -121.41 gain 46 56 -127.73 gain 56 46 -135.01 gain 46 57 -120.84 gain 57 46 -122.00 gain 46 58 -123.18 gain 58 46 -127.08 gain 46 59 -124.17 gain 59 46 -124.20 gain 46 60 -99.20 gain 60 46 -100.55 gain 46 61 -88.35 gain 61 46 -88.45 gain 46 62 -95.98 gain 62 46 -101.29 gain 46 63 -98.88 gain 63 46 -97.42 gain 46 64 -111.56 gain 64 46 -113.08 gain 46 65 -104.21 gain 65 46 -107.82 gain 46 66 -107.61 gain 66 46 -105.47 gain 46 67 -108.73 gain 67 46 -108.86 gain 46 68 -122.48 gain 68 46 -127.18 gain 46 69 -122.47 gain 69 46 -124.46 gain 46 70 -120.83 gain 70 46 -122.58 gain 46 71 -121.82 gain 71 46 -121.67 gain 46 72 -126.38 gain 72 46 -126.65 gain 46 73 -126.06 gain 73 46 -124.72 gain 46 74 -128.85 gain 74 46 -131.39 gain 46 75 -101.38 gain 75 46 -104.05 gain 46 76 -103.19 gain 76 46 -101.82 gain 46 77 -99.44 gain 77 46 -101.73 gain 46 78 -100.22 gain 78 46 -105.36 gain 46 79 -107.74 gain 79 46 -107.65 gain 46 80 -114.21 gain 80 46 -114.63 gain 46 81 -113.77 gain 81 46 -114.78 gain 46 82 -119.92 gain 82 46 -118.56 gain 46 83 -118.74 gain 83 46 -118.42 gain 46 84 -116.16 gain 84 46 -115.98 gain 46 85 -120.41 gain 85 46 -117.04 gain 46 86 -128.49 gain 86 46 -128.50 gain 46 87 -123.80 gain 87 46 -127.77 gain 46 88 -127.14 gain 88 46 -128.86 gain 46 89 -133.26 gain 89 46 -133.58 gain 46 90 -100.88 gain 90 46 -98.21 gain 46 91 -108.24 gain 91 46 -109.52 gain 46 92 -105.02 gain 92 46 -103.25 gain 46 93 -105.21 gain 93 46 -108.23 gain 46 94 -111.12 gain 94 46 -114.01 gain 46 95 -111.36 gain 95 46 -116.51 gain 46 96 -115.80 gain 96 46 -118.29 gain 46 97 -114.02 gain 97 46 -115.26 gain 46 98 -104.54 gain 98 46 -106.58 gain 46 99 -119.98 gain 99 46 -119.84 gain 46 100 -126.92 gain 100 46 -126.34 gain 46 101 -128.84 gain 101 46 -128.42 gain 46 102 -128.79 gain 102 46 -129.16 gain 46 103 -122.48 gain 103 46 -120.33 gain 46 104 -115.27 gain 104 46 -118.49 gain 46 105 -117.37 gain 105 46 -116.53 gain 46 106 -112.14 gain 106 46 -112.39 gain 46 107 -110.66 gain 107 46 -117.47 gain 46 108 -111.91 gain 108 46 -111.04 gain 46 109 -118.21 gain 109 46 -120.84 gain 46 110 -115.70 gain 110 46 -116.79 gain 46 111 -122.71 gain 111 46 -123.48 gain 46 112 -118.33 gain 112 46 -117.98 gain 46 113 -115.71 gain 113 46 -114.17 gain 46 114 -123.43 gain 114 46 -125.19 gain 46 115 -120.47 gain 115 46 -116.53 gain 46 116 -124.34 gain 116 46 -127.94 gain 46 117 -126.04 gain 117 46 -131.14 gain 46 118 -125.28 gain 118 46 -128.70 gain 46 119 -126.33 gain 119 46 -124.42 gain 46 120 -115.24 gain 120 46 -117.84 gain 46 121 -117.12 gain 121 46 -119.01 gain 46 122 -115.87 gain 122 46 -119.88 gain 46 123 -115.97 gain 123 46 -120.76 gain 46 124 -115.22 gain 124 46 -116.41 gain 46 125 -117.94 gain 125 46 -120.47 gain 46 126 -113.31 gain 126 46 -113.79 gain 46 127 -113.26 gain 127 46 -117.20 gain 46 128 -125.72 gain 128 46 -127.60 gain 46 129 -123.04 gain 129 46 -122.84 gain 46 130 -119.47 gain 130 46 -117.09 gain 46 131 -131.00 gain 131 46 -135.70 gain 46 132 -120.25 gain 132 46 -124.58 gain 46 133 -122.60 gain 133 46 -125.00 gain 46 134 -128.20 gain 134 46 -127.30 gain 46 135 -120.39 gain 135 46 -123.06 gain 46 136 -111.79 gain 136 46 -115.07 gain 46 137 -106.10 gain 137 46 -106.86 gain 46 138 -111.87 gain 138 46 -111.63 gain 46 139 -116.09 gain 139 46 -116.84 gain 46 140 -114.76 gain 140 46 -118.12 gain 46 141 -120.34 gain 141 46 -122.37 gain 46 142 -119.10 gain 142 46 -120.44 gain 46 143 -112.84 gain 143 46 -113.80 gain 46 144 -125.38 gain 144 46 -127.35 gain 46 145 -117.65 gain 145 46 -118.07 gain 46 146 -133.72 gain 146 46 -133.04 gain 46 147 -125.62 gain 147 46 -122.04 gain 46 148 -126.81 gain 148 46 -122.95 gain 46 149 -127.18 gain 149 46 -126.48 gain 46 150 -121.18 gain 150 46 -123.17 gain 46 151 -119.99 gain 151 46 -122.18 gain 46 152 -108.92 gain 152 46 -108.08 gain 46 153 -117.00 gain 153 46 -113.74 gain 46 154 -118.97 gain 154 46 -124.26 gain 46 155 -128.58 gain 155 46 -133.77 gain 46 156 -121.92 gain 156 46 -121.49 gain 46 157 -125.32 gain 157 46 -127.84 gain 46 158 -120.85 gain 158 46 -125.96 gain 46 159 -128.17 gain 159 46 -129.90 gain 46 160 -126.42 gain 160 46 -125.26 gain 46 161 -124.50 gain 161 46 -126.83 gain 46 162 -128.43 gain 162 46 -129.63 gain 46 163 -124.21 gain 163 46 -127.56 gain 46 164 -127.48 gain 164 46 -131.87 gain 46 165 -122.97 gain 165 46 -123.39 gain 46 166 -117.58 gain 166 46 -119.58 gain 46 167 -120.85 gain 167 46 -124.93 gain 46 168 -123.36 gain 168 46 -125.90 gain 46 169 -127.35 gain 169 46 -134.08 gain 46 170 -127.54 gain 170 46 -125.81 gain 46 171 -126.05 gain 171 46 -129.33 gain 46 172 -125.65 gain 172 46 -123.63 gain 46 173 -131.67 gain 173 46 -129.09 gain 46 174 -123.31 gain 174 46 -125.02 gain 46 175 -126.88 gain 175 46 -132.15 gain 46 176 -124.59 gain 176 46 -121.87 gain 46 177 -123.84 gain 177 46 -128.93 gain 46 178 -125.84 gain 178 46 -126.76 gain 46 179 -125.15 gain 179 46 -124.45 gain 46 180 -116.30 gain 180 46 -117.07 gain 46 181 -125.06 gain 181 46 -125.91 gain 46 182 -121.87 gain 182 46 -125.10 gain 46 183 -119.66 gain 183 46 -116.28 gain 46 184 -124.88 gain 184 46 -126.28 gain 46 185 -126.13 gain 185 46 -125.02 gain 46 186 -126.28 gain 186 46 -125.46 gain 46 187 -127.19 gain 187 46 -128.90 gain 46 188 -123.03 gain 188 46 -128.00 gain 46 189 -131.88 gain 189 46 -134.36 gain 46 190 -123.69 gain 190 46 -123.19 gain 46 191 -129.33 gain 191 46 -129.92 gain 46 192 -125.31 gain 192 46 -128.76 gain 46 193 -129.48 gain 193 46 -134.19 gain 46 194 -123.55 gain 194 46 -122.07 gain 46 195 -124.16 gain 195 46 -123.31 gain 46 196 -124.00 gain 196 46 -127.19 gain 46 197 -120.85 gain 197 46 -120.11 gain 46 198 -127.49 gain 198 46 -126.26 gain 46 199 -126.68 gain 199 46 -129.37 gain 46 200 -118.28 gain 200 46 -117.91 gain 46 201 -127.25 gain 201 46 -127.68 gain 46 202 -124.34 gain 202 46 -128.78 gain 46 203 -121.25 gain 203 46 -125.30 gain 46 204 -124.16 gain 204 46 -125.50 gain 46 205 -126.14 gain 205 46 -126.55 gain 46 206 -130.97 gain 206 46 -135.91 gain 46 207 -127.41 gain 207 46 -124.70 gain 46 208 -121.69 gain 208 46 -124.76 gain 46 209 -122.47 gain 209 46 -126.54 gain 46 210 -122.64 gain 210 46 -123.64 gain 46 211 -123.12 gain 211 46 -126.14 gain 46 212 -125.39 gain 212 46 -126.96 gain 46 213 -124.74 gain 213 46 -125.50 gain 46 214 -125.98 gain 214 46 -126.63 gain 46 215 -121.79 gain 215 46 -118.86 gain 46 216 -122.43 gain 216 46 -124.15 gain 46 217 -126.92 gain 217 46 -129.17 gain 46 218 -132.21 gain 218 46 -136.65 gain 46 219 -129.95 gain 219 46 -125.74 gain 46 220 -125.57 gain 220 46 -131.85 gain 46 221 -127.26 gain 221 46 -129.18 gain 46 222 -135.65 gain 222 46 -137.90 gain 46 223 -130.04 gain 223 46 -130.90 gain 46 224 -140.37 gain 224 46 -143.92 gain 47 48 -89.73 gain 48 47 -87.52 gain 47 49 -101.52 gain 49 47 -107.29 gain 47 50 -107.42 gain 50 47 -114.15 gain 47 51 -105.94 gain 51 47 -107.81 gain 47 52 -107.21 gain 52 47 -105.10 gain 47 53 -113.53 gain 53 47 -112.43 gain 47 54 -118.89 gain 54 47 -118.49 gain 47 55 -117.75 gain 55 47 -116.65 gain 47 56 -123.46 gain 56 47 -129.69 gain 47 57 -126.48 gain 57 47 -126.58 gain 47 58 -121.34 gain 58 47 -124.18 gain 47 59 -119.87 gain 59 47 -118.84 gain 47 60 -99.60 gain 60 47 -99.89 gain 47 61 -98.25 gain 61 47 -97.29 gain 47 62 -92.78 gain 62 47 -97.04 gain 47 63 -96.44 gain 63 47 -93.92 gain 47 64 -102.18 gain 64 47 -102.64 gain 47 65 -102.50 gain 65 47 -105.05 gain 47 66 -111.01 gain 66 47 -107.81 gain 47 67 -113.86 gain 67 47 -112.94 gain 47 68 -117.47 gain 68 47 -121.10 gain 47 69 -116.60 gain 69 47 -117.53 gain 47 70 -119.13 gain 70 47 -119.81 gain 47 71 -121.93 gain 71 47 -120.72 gain 47 72 -122.38 gain 72 47 -121.59 gain 47 73 -115.33 gain 73 47 -112.93 gain 47 74 -119.75 gain 74 47 -121.22 gain 47 75 -105.48 gain 75 47 -107.09 gain 47 76 -110.91 gain 76 47 -108.48 gain 47 77 -99.99 gain 77 47 -101.22 gain 47 78 -96.40 gain 78 47 -100.48 gain 47 79 -101.92 gain 79 47 -100.78 gain 47 80 -112.87 gain 80 47 -112.23 gain 47 81 -112.96 gain 81 47 -112.91 gain 47 82 -114.27 gain 82 47 -111.85 gain 47 83 -118.69 gain 83 47 -117.30 gain 47 84 -118.65 gain 84 47 -117.41 gain 47 85 -119.33 gain 85 47 -114.90 gain 47 86 -122.23 gain 86 47 -121.19 gain 47 87 -125.02 gain 87 47 -127.93 gain 47 88 -128.27 gain 88 47 -128.93 gain 47 89 -129.94 gain 89 47 -129.20 gain 47 90 -112.69 gain 90 47 -108.96 gain 47 91 -112.23 gain 91 47 -112.45 gain 47 92 -106.18 gain 92 47 -103.36 gain 47 93 -108.32 gain 93 47 -110.29 gain 47 94 -113.75 gain 94 47 -115.59 gain 47 95 -116.45 gain 95 47 -120.54 gain 47 96 -112.61 gain 96 47 -114.05 gain 47 97 -114.99 gain 97 47 -115.16 gain 47 98 -119.86 gain 98 47 -120.83 gain 47 99 -116.24 gain 99 47 -115.04 gain 47 100 -126.72 gain 100 47 -125.08 gain 47 101 -130.82 gain 101 47 -129.35 gain 47 102 -123.67 gain 102 47 -122.97 gain 47 103 -129.12 gain 103 47 -125.91 gain 47 104 -129.04 gain 104 47 -131.21 gain 47 105 -114.19 gain 105 47 -112.30 gain 47 106 -112.01 gain 106 47 -111.20 gain 47 107 -115.46 gain 107 47 -121.21 gain 47 108 -116.73 gain 108 47 -114.80 gain 47 109 -113.29 gain 109 47 -114.85 gain 47 110 -112.77 gain 110 47 -112.81 gain 47 111 -114.53 gain 111 47 -114.24 gain 47 112 -113.64 gain 112 47 -112.23 gain 47 113 -116.04 gain 113 47 -113.44 gain 47 114 -123.05 gain 114 47 -123.75 gain 47 115 -126.56 gain 115 47 -121.57 gain 47 116 -119.35 gain 116 47 -121.90 gain 47 117 -131.44 gain 117 47 -135.48 gain 47 118 -128.72 gain 118 47 -131.08 gain 47 119 -125.06 gain 119 47 -122.09 gain 47 120 -118.52 gain 120 47 -120.07 gain 47 121 -115.07 gain 121 47 -115.90 gain 47 122 -114.62 gain 122 47 -117.57 gain 47 123 -120.66 gain 123 47 -124.38 gain 47 124 -119.15 gain 124 47 -119.29 gain 47 125 -112.23 gain 125 47 -113.70 gain 47 126 -120.84 gain 126 47 -120.27 gain 47 127 -119.72 gain 127 47 -122.61 gain 47 128 -122.56 gain 128 47 -123.39 gain 47 129 -121.65 gain 129 47 -120.38 gain 47 130 -125.10 gain 130 47 -121.66 gain 47 131 -120.26 gain 131 47 -123.90 gain 47 132 -121.32 gain 132 47 -124.59 gain 47 133 -124.44 gain 133 47 -125.78 gain 47 134 -133.44 gain 134 47 -131.48 gain 47 135 -116.31 gain 135 47 -117.92 gain 47 136 -112.12 gain 136 47 -114.35 gain 47 137 -119.58 gain 137 47 -119.28 gain 47 138 -113.37 gain 138 47 -112.08 gain 47 139 -124.08 gain 139 47 -123.77 gain 47 140 -117.28 gain 140 47 -119.58 gain 47 141 -126.19 gain 141 47 -127.17 gain 47 142 -120.66 gain 142 47 -120.94 gain 47 143 -118.13 gain 143 47 -118.02 gain 47 144 -121.85 gain 144 47 -122.77 gain 47 145 -120.99 gain 145 47 -120.35 gain 47 146 -125.73 gain 146 47 -124.00 gain 47 147 -125.42 gain 147 47 -120.78 gain 47 148 -129.33 gain 148 47 -124.41 gain 47 149 -125.91 gain 149 47 -124.15 gain 47 150 -125.90 gain 150 47 -126.83 gain 47 151 -123.01 gain 151 47 -124.14 gain 47 152 -118.06 gain 152 47 -116.17 gain 47 153 -117.13 gain 153 47 -112.81 gain 47 154 -116.73 gain 154 47 -120.96 gain 47 155 -124.82 gain 155 47 -128.95 gain 47 156 -122.33 gain 156 47 -120.85 gain 47 157 -123.92 gain 157 47 -125.38 gain 47 158 -123.18 gain 158 47 -127.23 gain 47 159 -126.25 gain 159 47 -126.92 gain 47 160 -121.19 gain 160 47 -118.97 gain 47 161 -122.17 gain 161 47 -123.44 gain 47 162 -129.39 gain 162 47 -129.53 gain 47 163 -130.74 gain 163 47 -133.02 gain 47 164 -124.68 gain 164 47 -128.01 gain 47 165 -123.07 gain 165 47 -122.44 gain 47 166 -119.97 gain 166 47 -120.91 gain 47 167 -121.47 gain 167 47 -124.50 gain 47 168 -123.81 gain 168 47 -125.29 gain 47 169 -119.18 gain 169 47 -124.86 gain 47 170 -123.11 gain 170 47 -120.32 gain 47 171 -120.64 gain 171 47 -122.87 gain 47 172 -127.47 gain 172 47 -124.40 gain 47 173 -125.88 gain 173 47 -122.24 gain 47 174 -122.38 gain 174 47 -123.04 gain 47 175 -123.54 gain 175 47 -127.75 gain 47 176 -130.94 gain 176 47 -127.17 gain 47 177 -130.57 gain 177 47 -134.60 gain 47 178 -131.47 gain 178 47 -131.33 gain 47 179 -130.10 gain 179 47 -128.35 gain 47 180 -120.34 gain 180 47 -120.06 gain 47 181 -116.54 gain 181 47 -116.32 gain 47 182 -118.56 gain 182 47 -120.73 gain 47 183 -117.23 gain 183 47 -112.79 gain 47 184 -119.18 gain 184 47 -119.52 gain 47 185 -124.28 gain 185 47 -122.11 gain 47 186 -124.72 gain 186 47 -122.83 gain 47 187 -117.64 gain 187 47 -118.29 gain 47 188 -124.10 gain 188 47 -128.01 gain 47 189 -123.71 gain 189 47 -125.14 gain 47 190 -127.28 gain 190 47 -125.72 gain 47 191 -130.05 gain 191 47 -129.58 gain 47 192 -127.82 gain 192 47 -130.21 gain 47 193 -132.29 gain 193 47 -135.94 gain 47 194 -131.47 gain 194 47 -128.93 gain 47 195 -116.90 gain 195 47 -115.00 gain 47 196 -127.26 gain 196 47 -129.40 gain 47 197 -120.90 gain 197 47 -119.09 gain 47 198 -125.35 gain 198 47 -123.06 gain 47 199 -120.61 gain 199 47 -122.24 gain 47 200 -124.54 gain 200 47 -123.11 gain 47 201 -119.79 gain 201 47 -119.17 gain 47 202 -127.44 gain 202 47 -130.82 gain 47 203 -126.46 gain 203 47 -129.46 gain 47 204 -129.02 gain 204 47 -129.30 gain 47 205 -121.43 gain 205 47 -120.78 gain 47 206 -124.07 gain 206 47 -127.95 gain 47 207 -128.22 gain 207 47 -124.46 gain 47 208 -131.54 gain 208 47 -133.56 gain 47 209 -133.06 gain 209 47 -136.07 gain 47 210 -122.28 gain 210 47 -122.23 gain 47 211 -123.36 gain 211 47 -125.32 gain 47 212 -116.07 gain 212 47 -116.58 gain 47 213 -129.05 gain 213 47 -128.75 gain 47 214 -125.09 gain 214 47 -124.68 gain 47 215 -124.42 gain 215 47 -120.43 gain 47 216 -123.03 gain 216 47 -123.70 gain 47 217 -123.26 gain 217 47 -124.45 gain 47 218 -129.42 gain 218 47 -132.80 gain 47 219 -125.60 gain 219 47 -120.33 gain 47 220 -124.32 gain 220 47 -129.54 gain 47 221 -123.50 gain 221 47 -124.37 gain 47 222 -137.68 gain 222 47 -138.87 gain 47 223 -130.27 gain 223 47 -130.07 gain 47 224 -128.11 gain 224 47 -130.60 gain 48 49 -90.85 gain 49 48 -98.83 gain 48 50 -95.18 gain 50 48 -104.12 gain 48 51 -113.16 gain 51 48 -117.24 gain 48 52 -112.58 gain 52 48 -112.68 gain 48 53 -119.61 gain 53 48 -120.72 gain 48 54 -107.35 gain 54 48 -109.17 gain 48 55 -122.07 gain 55 48 -123.18 gain 48 56 -120.07 gain 56 48 -128.51 gain 48 57 -118.20 gain 57 48 -120.51 gain 48 58 -127.87 gain 58 48 -132.92 gain 48 59 -125.98 gain 59 48 -127.16 gain 48 60 -109.64 gain 60 48 -112.14 gain 48 61 -103.67 gain 61 48 -104.93 gain 48 62 -90.49 gain 62 48 -96.96 gain 48 63 -88.28 gain 63 48 -87.97 gain 48 64 -98.98 gain 64 48 -101.65 gain 48 65 -99.97 gain 65 48 -104.73 gain 48 66 -103.40 gain 66 48 -102.41 gain 48 67 -109.23 gain 67 48 -110.52 gain 48 68 -116.71 gain 68 48 -122.56 gain 48 69 -116.88 gain 69 48 -120.02 gain 48 70 -112.65 gain 70 48 -115.54 gain 48 71 -123.43 gain 71 48 -124.43 gain 48 72 -122.74 gain 72 48 -124.16 gain 48 73 -121.54 gain 73 48 -121.35 gain 48 74 -121.69 gain 74 48 -125.38 gain 48 75 -109.22 gain 75 48 -113.05 gain 48 76 -108.80 gain 76 48 -108.58 gain 48 77 -102.41 gain 77 48 -105.85 gain 48 78 -98.74 gain 78 48 -105.03 gain 48 79 -100.95 gain 79 48 -102.02 gain 48 80 -103.70 gain 80 48 -105.27 gain 48 81 -105.59 gain 81 48 -107.75 gain 48 82 -109.75 gain 82 48 -109.54 gain 48 83 -113.80 gain 83 48 -114.62 gain 48 84 -117.82 gain 84 48 -118.79 gain 48 85 -112.21 gain 85 48 -109.99 gain 48 86 -115.35 gain 86 48 -116.52 gain 48 87 -117.25 gain 87 48 -122.37 gain 48 88 -121.78 gain 88 48 -124.66 gain 48 89 -128.82 gain 89 48 -130.30 gain 48 90 -113.76 gain 90 48 -112.25 gain 48 91 -112.46 gain 91 48 -114.89 gain 48 92 -104.13 gain 92 48 -103.52 gain 48 93 -105.67 gain 93 48 -109.85 gain 48 94 -98.20 gain 94 48 -102.25 gain 48 95 -104.31 gain 95 48 -110.61 gain 48 96 -108.11 gain 96 48 -111.75 gain 48 97 -109.24 gain 97 48 -111.63 gain 48 98 -112.10 gain 98 48 -115.29 gain 48 99 -110.28 gain 99 48 -111.29 gain 48 100 -125.92 gain 100 48 -126.49 gain 48 101 -120.26 gain 101 48 -121.00 gain 48 102 -115.35 gain 102 48 -116.87 gain 48 103 -117.00 gain 103 48 -116.00 gain 48 104 -128.11 gain 104 48 -132.49 gain 48 105 -111.36 gain 105 48 -111.68 gain 48 106 -108.32 gain 106 48 -109.73 gain 48 107 -109.17 gain 107 48 -117.14 gain 48 108 -103.60 gain 108 48 -103.89 gain 48 109 -115.06 gain 109 48 -118.83 gain 48 110 -101.71 gain 110 48 -103.95 gain 48 111 -115.71 gain 111 48 -117.64 gain 48 112 -109.34 gain 112 48 -110.15 gain 48 113 -119.74 gain 113 48 -119.35 gain 48 114 -112.42 gain 114 48 -115.34 gain 48 115 -117.18 gain 115 48 -114.39 gain 48 116 -122.68 gain 116 48 -127.43 gain 48 117 -120.49 gain 117 48 -126.75 gain 48 118 -120.36 gain 118 48 -124.94 gain 48 119 -122.69 gain 119 48 -121.93 gain 48 120 -113.00 gain 120 48 -116.76 gain 48 121 -112.55 gain 121 48 -115.60 gain 48 122 -109.12 gain 122 48 -114.28 gain 48 123 -107.28 gain 123 48 -113.22 gain 48 124 -111.53 gain 124 48 -113.88 gain 48 125 -117.77 gain 125 48 -121.46 gain 48 126 -113.42 gain 126 48 -115.06 gain 48 127 -121.78 gain 127 48 -126.88 gain 48 128 -124.96 gain 128 48 -128.00 gain 48 129 -123.76 gain 129 48 -124.71 gain 48 130 -119.90 gain 130 48 -118.67 gain 48 131 -125.51 gain 131 48 -131.37 gain 48 132 -117.29 gain 132 48 -122.78 gain 48 133 -121.09 gain 133 48 -124.65 gain 48 134 -120.77 gain 134 48 -121.03 gain 48 135 -111.47 gain 135 48 -115.30 gain 48 136 -122.85 gain 136 48 -127.28 gain 48 137 -112.30 gain 137 48 -114.22 gain 48 138 -119.48 gain 138 48 -120.40 gain 48 139 -114.45 gain 139 48 -116.36 gain 48 140 -110.20 gain 140 48 -114.71 gain 48 141 -110.98 gain 141 48 -114.16 gain 48 142 -111.67 gain 142 48 -114.16 gain 48 143 -112.75 gain 143 48 -114.85 gain 48 144 -117.25 gain 144 48 -120.37 gain 48 145 -117.96 gain 145 48 -119.54 gain 48 146 -115.09 gain 146 48 -115.57 gain 48 147 -133.33 gain 147 48 -130.90 gain 48 148 -126.62 gain 148 48 -123.91 gain 48 149 -124.62 gain 149 48 -125.08 gain 48 150 -120.25 gain 150 48 -123.40 gain 48 151 -114.18 gain 151 48 -117.51 gain 48 152 -109.37 gain 152 48 -109.68 gain 48 153 -115.38 gain 153 48 -113.27 gain 48 154 -114.38 gain 154 48 -120.82 gain 48 155 -118.31 gain 155 48 -124.64 gain 48 156 -115.80 gain 156 48 -116.53 gain 48 157 -120.44 gain 157 48 -124.11 gain 48 158 -118.52 gain 158 48 -124.79 gain 48 159 -116.34 gain 159 48 -119.23 gain 48 160 -121.50 gain 160 48 -121.50 gain 48 161 -126.03 gain 161 48 -129.51 gain 48 162 -122.37 gain 162 48 -124.72 gain 48 163 -121.20 gain 163 48 -125.70 gain 48 164 -130.45 gain 164 48 -135.99 gain 48 165 -115.07 gain 165 48 -116.65 gain 48 166 -114.44 gain 166 48 -117.59 gain 48 167 -114.63 gain 167 48 -119.87 gain 48 168 -117.00 gain 168 48 -120.69 gain 48 169 -114.77 gain 169 48 -122.66 gain 48 170 -115.67 gain 170 48 -115.09 gain 48 171 -119.50 gain 171 48 -123.94 gain 48 172 -119.60 gain 172 48 -118.74 gain 48 173 -119.93 gain 173 48 -118.50 gain 48 174 -119.48 gain 174 48 -122.35 gain 48 175 -119.79 gain 175 48 -126.22 gain 48 176 -125.32 gain 176 48 -123.75 gain 48 177 -124.14 gain 177 48 -130.38 gain 48 178 -125.40 gain 178 48 -127.47 gain 48 179 -127.21 gain 179 48 -127.67 gain 48 180 -116.04 gain 180 48 -117.98 gain 48 181 -114.28 gain 181 48 -116.28 gain 48 182 -115.22 gain 182 48 -119.61 gain 48 183 -115.54 gain 183 48 -113.31 gain 48 184 -118.35 gain 184 48 -120.91 gain 48 185 -117.08 gain 185 48 -117.12 gain 48 186 -118.65 gain 186 48 -118.97 gain 48 187 -116.08 gain 187 48 -118.94 gain 48 188 -116.02 gain 188 48 -122.15 gain 48 189 -130.98 gain 189 48 -134.63 gain 48 190 -114.30 gain 190 48 -114.95 gain 48 191 -125.02 gain 191 48 -126.76 gain 48 192 -129.15 gain 192 48 -133.76 gain 48 193 -123.02 gain 193 48 -128.88 gain 48 194 -128.59 gain 194 48 -128.27 gain 48 195 -124.77 gain 195 48 -125.08 gain 48 196 -118.71 gain 196 48 -123.05 gain 48 197 -123.28 gain 197 48 -123.69 gain 48 198 -124.96 gain 198 48 -124.89 gain 48 199 -115.44 gain 199 48 -119.28 gain 48 200 -128.48 gain 200 48 -129.26 gain 48 201 -121.95 gain 201 48 -123.54 gain 48 202 -125.23 gain 202 48 -130.82 gain 48 203 -124.26 gain 203 48 -129.47 gain 48 204 -115.86 gain 204 48 -118.35 gain 48 205 -126.04 gain 205 48 -127.60 gain 48 206 -119.02 gain 206 48 -125.11 gain 48 207 -123.78 gain 207 48 -122.23 gain 48 208 -134.36 gain 208 48 -138.59 gain 48 209 -121.82 gain 209 48 -127.04 gain 48 210 -122.04 gain 210 48 -124.20 gain 48 211 -118.54 gain 211 48 -122.72 gain 48 212 -124.17 gain 212 48 -126.89 gain 48 213 -117.35 gain 213 48 -119.26 gain 48 214 -114.29 gain 214 48 -116.09 gain 48 215 -114.31 gain 215 48 -112.52 gain 48 216 -127.52 gain 216 48 -130.40 gain 48 217 -120.68 gain 217 48 -124.08 gain 48 218 -129.60 gain 218 48 -135.19 gain 48 219 -120.33 gain 219 48 -117.27 gain 48 220 -128.99 gain 220 48 -136.43 gain 48 221 -121.76 gain 221 48 -124.84 gain 48 222 -119.68 gain 222 48 -123.08 gain 48 223 -121.21 gain 223 48 -123.23 gain 48 224 -129.97 gain 224 48 -134.68 gain 49 50 -101.34 gain 50 49 -102.31 gain 49 51 -109.89 gain 51 49 -105.99 gain 49 52 -116.13 gain 52 49 -108.26 gain 49 53 -120.87 gain 53 49 -114.01 gain 49 54 -120.24 gain 54 49 -114.08 gain 49 55 -119.29 gain 55 49 -112.42 gain 49 56 -121.08 gain 56 49 -121.54 gain 49 57 -134.97 gain 57 49 -129.30 gain 49 58 -127.92 gain 58 49 -125.00 gain 49 59 -134.43 gain 59 49 -127.63 gain 49 60 -111.18 gain 60 49 -105.71 gain 49 61 -111.28 gain 61 49 -104.56 gain 49 62 -114.38 gain 62 49 -112.88 gain 49 63 -99.35 gain 63 49 -91.07 gain 49 64 -95.22 gain 64 49 -89.91 gain 49 65 -105.76 gain 65 49 -102.55 gain 49 66 -108.00 gain 66 49 -99.04 gain 49 67 -111.20 gain 67 49 -104.52 gain 49 68 -121.40 gain 68 49 -119.27 gain 49 69 -117.08 gain 69 49 -112.25 gain 49 70 -122.19 gain 70 49 -117.11 gain 49 71 -125.49 gain 71 49 -118.51 gain 49 72 -126.24 gain 72 49 -119.69 gain 49 73 -129.01 gain 73 49 -120.84 gain 49 74 -133.70 gain 74 49 -129.41 gain 49 75 -126.04 gain 75 49 -121.89 gain 49 76 -121.74 gain 76 49 -113.54 gain 49 77 -111.67 gain 77 49 -107.14 gain 49 78 -103.55 gain 78 49 -101.86 gain 49 79 -111.03 gain 79 49 -104.13 gain 49 80 -110.22 gain 80 49 -103.82 gain 49 81 -113.25 gain 81 49 -107.44 gain 49 82 -116.36 gain 82 49 -108.17 gain 49 83 -126.72 gain 83 49 -119.57 gain 49 84 -124.59 gain 84 49 -117.59 gain 49 85 -128.12 gain 85 49 -117.93 gain 49 86 -126.30 gain 86 49 -119.49 gain 49 87 -122.38 gain 87 49 -119.53 gain 49 88 -128.72 gain 88 49 -123.62 gain 49 89 -135.93 gain 89 49 -129.43 gain 49 90 -119.51 gain 90 49 -110.02 gain 49 91 -126.81 gain 91 49 -121.26 gain 49 92 -112.88 gain 92 49 -104.29 gain 49 93 -110.41 gain 93 49 -106.62 gain 49 94 -106.67 gain 94 49 -102.74 gain 49 95 -107.89 gain 95 49 -106.22 gain 49 96 -124.84 gain 96 49 -120.51 gain 49 97 -114.47 gain 97 49 -108.89 gain 49 98 -115.52 gain 98 49 -110.73 gain 49 99 -125.17 gain 99 49 -118.20 gain 49 100 -130.29 gain 100 49 -122.89 gain 49 101 -127.98 gain 101 49 -120.74 gain 49 102 -123.73 gain 102 49 -117.28 gain 49 103 -123.63 gain 103 49 -114.65 gain 49 104 -128.91 gain 104 49 -125.31 gain 49 105 -125.87 gain 105 49 -118.21 gain 49 106 -121.82 gain 106 49 -115.24 gain 49 107 -120.86 gain 107 49 -120.85 gain 49 108 -116.00 gain 108 49 -108.31 gain 49 109 -116.98 gain 109 49 -112.78 gain 49 110 -122.06 gain 110 49 -116.33 gain 49 111 -117.43 gain 111 49 -111.38 gain 49 112 -121.99 gain 112 49 -114.82 gain 49 113 -121.13 gain 113 49 -112.76 gain 49 114 -118.70 gain 114 49 -113.64 gain 49 115 -132.52 gain 115 49 -121.77 gain 49 116 -130.80 gain 116 49 -127.58 gain 49 117 -129.89 gain 117 49 -128.17 gain 49 118 -133.36 gain 118 49 -129.96 gain 49 119 -130.58 gain 119 49 -121.85 gain 49 120 -116.67 gain 120 49 -112.46 gain 49 121 -122.17 gain 121 49 -117.24 gain 49 122 -116.24 gain 122 49 -113.42 gain 49 123 -121.48 gain 123 49 -119.44 gain 49 124 -115.03 gain 124 49 -109.40 gain 49 125 -108.17 gain 125 49 -103.88 gain 49 126 -122.69 gain 126 49 -116.35 gain 49 127 -126.15 gain 127 49 -123.28 gain 49 128 -124.43 gain 128 49 -119.49 gain 49 129 -125.36 gain 129 49 -118.34 gain 49 130 -121.73 gain 130 49 -112.53 gain 49 131 -127.34 gain 131 49 -125.22 gain 49 132 -128.02 gain 132 49 -125.53 gain 49 133 -126.39 gain 133 49 -121.97 gain 49 134 -139.93 gain 134 49 -132.21 gain 49 135 -126.83 gain 135 49 -122.68 gain 49 136 -130.41 gain 136 49 -126.87 gain 49 137 -129.05 gain 137 49 -123.00 gain 49 138 -124.60 gain 138 49 -117.54 gain 49 139 -115.76 gain 139 49 -109.69 gain 49 140 -124.23 gain 140 49 -120.76 gain 49 141 -123.23 gain 141 49 -118.44 gain 49 142 -122.43 gain 142 49 -116.94 gain 49 143 -121.66 gain 143 49 -115.80 gain 49 144 -131.99 gain 144 49 -127.13 gain 49 145 -128.32 gain 145 49 -121.92 gain 49 146 -128.14 gain 146 49 -120.64 gain 49 147 -124.07 gain 147 49 -113.66 gain 49 148 -127.65 gain 148 49 -116.97 gain 49 149 -133.24 gain 149 49 -125.72 gain 49 150 -127.09 gain 150 49 -122.26 gain 49 151 -126.29 gain 151 49 -121.65 gain 49 152 -127.00 gain 152 49 -119.34 gain 49 153 -126.13 gain 153 49 -116.04 gain 49 154 -125.23 gain 154 49 -123.69 gain 49 155 -127.19 gain 155 49 -125.55 gain 49 156 -126.82 gain 156 49 -119.57 gain 49 157 -122.30 gain 157 49 -118.00 gain 49 158 -128.43 gain 158 49 -126.72 gain 49 159 -130.63 gain 159 49 -125.54 gain 49 160 -126.08 gain 160 49 -118.10 gain 49 161 -135.37 gain 161 49 -130.88 gain 49 162 -128.52 gain 162 49 -122.89 gain 49 163 -137.17 gain 163 49 -133.70 gain 49 164 -130.35 gain 164 49 -127.92 gain 49 165 -131.69 gain 165 49 -125.29 gain 49 166 -124.05 gain 166 49 -119.22 gain 49 167 -126.61 gain 167 49 -123.87 gain 49 168 -125.61 gain 168 49 -121.33 gain 49 169 -127.35 gain 169 49 -127.26 gain 49 170 -116.79 gain 170 49 -108.23 gain 49 171 -126.40 gain 171 49 -122.87 gain 49 172 -129.11 gain 172 49 -120.27 gain 49 173 -136.84 gain 173 49 -127.44 gain 49 174 -135.05 gain 174 49 -129.95 gain 49 175 -130.56 gain 175 49 -129.01 gain 49 176 -124.51 gain 176 49 -114.97 gain 49 177 -119.52 gain 177 49 -117.80 gain 49 178 -131.20 gain 178 49 -125.29 gain 49 179 -135.18 gain 179 49 -127.67 gain 49 180 -129.10 gain 180 49 -123.06 gain 49 181 -130.26 gain 181 49 -124.28 gain 49 182 -132.04 gain 182 49 -128.45 gain 49 183 -130.74 gain 183 49 -120.54 gain 49 184 -133.29 gain 184 49 -127.87 gain 49 185 -123.06 gain 185 49 -115.13 gain 49 186 -132.32 gain 186 49 -124.68 gain 49 187 -129.00 gain 187 49 -123.89 gain 49 188 -132.62 gain 188 49 -130.77 gain 49 189 -137.55 gain 189 49 -133.22 gain 49 190 -128.64 gain 190 49 -121.32 gain 49 191 -132.61 gain 191 49 -126.38 gain 49 192 -128.68 gain 192 49 -125.31 gain 49 193 -134.73 gain 193 49 -132.62 gain 49 194 -129.87 gain 194 49 -121.57 gain 49 195 -127.48 gain 195 49 -119.81 gain 49 196 -126.31 gain 196 49 -122.68 gain 49 197 -127.28 gain 197 49 -119.71 gain 49 198 -123.67 gain 198 49 -115.63 gain 49 199 -123.79 gain 199 49 -119.66 gain 49 200 -125.04 gain 200 49 -117.85 gain 49 201 -130.80 gain 201 49 -124.41 gain 49 202 -126.92 gain 202 49 -124.54 gain 49 203 -131.84 gain 203 49 -129.07 gain 49 204 -131.13 gain 204 49 -125.65 gain 49 205 -135.20 gain 205 49 -128.79 gain 49 206 -133.67 gain 206 49 -131.78 gain 49 207 -138.87 gain 207 49 -129.34 gain 49 208 -131.08 gain 208 49 -127.34 gain 49 209 -136.00 gain 209 49 -133.24 gain 49 210 -133.89 gain 210 49 -128.07 gain 49 211 -126.39 gain 211 49 -122.59 gain 49 212 -132.72 gain 212 49 -127.46 gain 49 213 -132.07 gain 213 49 -126.01 gain 49 214 -132.15 gain 214 49 -125.98 gain 49 215 -126.26 gain 215 49 -116.50 gain 49 216 -127.88 gain 216 49 -122.79 gain 49 217 -135.81 gain 217 49 -131.23 gain 49 218 -133.36 gain 218 49 -130.98 gain 49 219 -135.06 gain 219 49 -124.03 gain 49 220 -126.44 gain 220 49 -125.90 gain 49 221 -124.47 gain 221 49 -119.57 gain 49 222 -132.14 gain 222 49 -127.57 gain 49 223 -132.76 gain 223 49 -126.81 gain 49 224 -130.93 gain 224 49 -127.66 gain 50 51 -105.99 gain 51 50 -101.12 gain 50 52 -108.69 gain 52 50 -99.85 gain 50 53 -116.51 gain 53 50 -108.69 gain 50 54 -125.22 gain 54 50 -118.10 gain 50 55 -123.35 gain 55 50 -115.52 gain 50 56 -123.76 gain 56 50 -123.25 gain 50 57 -125.97 gain 57 50 -119.34 gain 50 58 -124.39 gain 58 50 -120.50 gain 50 59 -131.89 gain 59 50 -124.13 gain 50 60 -119.30 gain 60 50 -112.86 gain 50 61 -125.30 gain 61 50 -117.61 gain 50 62 -115.72 gain 62 50 -113.26 gain 50 63 -107.07 gain 63 50 -97.82 gain 50 64 -102.04 gain 64 50 -95.77 gain 50 65 -103.59 gain 65 50 -99.41 gain 50 66 -109.11 gain 66 50 -99.19 gain 50 67 -113.90 gain 67 50 -106.25 gain 50 68 -114.84 gain 68 50 -111.75 gain 50 69 -126.01 gain 69 50 -120.21 gain 50 70 -127.20 gain 70 50 -121.16 gain 50 71 -118.70 gain 71 50 -110.76 gain 50 72 -134.21 gain 72 50 -126.69 gain 50 73 -126.21 gain 73 50 -117.08 gain 50 74 -136.02 gain 74 50 -130.76 gain 50 75 -111.85 gain 75 50 -106.74 gain 50 76 -118.53 gain 76 50 -109.37 gain 50 77 -111.49 gain 77 50 -105.99 gain 50 78 -118.21 gain 78 50 -115.56 gain 50 79 -109.66 gain 79 50 -101.80 gain 50 80 -105.32 gain 80 50 -97.95 gain 50 81 -115.12 gain 81 50 -108.35 gain 50 82 -110.68 gain 82 50 -101.53 gain 50 83 -112.84 gain 83 50 -104.72 gain 50 84 -117.72 gain 84 50 -109.75 gain 50 85 -124.05 gain 85 50 -112.89 gain 50 86 -122.92 gain 86 50 -115.15 gain 50 87 -124.99 gain 87 50 -121.18 gain 50 88 -128.25 gain 88 50 -122.18 gain 50 89 -134.91 gain 89 50 -127.45 gain 50 90 -121.27 gain 90 50 -110.81 gain 50 91 -125.74 gain 91 50 -119.23 gain 50 92 -119.64 gain 92 50 -110.09 gain 50 93 -118.00 gain 93 50 -113.24 gain 50 94 -116.81 gain 94 50 -111.92 gain 50 95 -112.87 gain 95 50 -110.24 gain 50 96 -114.52 gain 96 50 -109.23 gain 50 97 -110.70 gain 97 50 -104.14 gain 50 98 -120.16 gain 98 50 -114.41 gain 50 99 -113.86 gain 99 50 -105.93 gain 50 100 -127.37 gain 100 50 -119.00 gain 50 101 -118.00 gain 101 50 -109.79 gain 50 102 -128.12 gain 102 50 -120.70 gain 50 103 -130.98 gain 103 50 -121.04 gain 50 104 -135.12 gain 104 50 -130.56 gain 50 105 -118.53 gain 105 50 -109.91 gain 50 106 -116.61 gain 106 50 -109.07 gain 50 107 -123.92 gain 107 50 -122.95 gain 50 108 -119.79 gain 108 50 -111.14 gain 50 109 -115.47 gain 109 50 -110.31 gain 50 110 -120.16 gain 110 50 -113.47 gain 50 111 -113.70 gain 111 50 -106.69 gain 50 112 -126.34 gain 112 50 -118.20 gain 50 113 -124.81 gain 113 50 -115.48 gain 50 114 -117.62 gain 114 50 -111.59 gain 50 115 -125.02 gain 115 50 -113.30 gain 50 116 -124.00 gain 116 50 -119.82 gain 50 117 -129.12 gain 117 50 -126.44 gain 50 118 -129.72 gain 118 50 -125.36 gain 50 119 -128.16 gain 119 50 -118.46 gain 50 120 -123.44 gain 120 50 -118.26 gain 50 121 -123.77 gain 121 50 -117.87 gain 50 122 -123.98 gain 122 50 -120.20 gain 50 123 -123.34 gain 123 50 -120.34 gain 50 124 -122.88 gain 124 50 -116.29 gain 50 125 -118.40 gain 125 50 -113.14 gain 50 126 -122.90 gain 126 50 -115.60 gain 50 127 -121.17 gain 127 50 -117.33 gain 50 128 -121.21 gain 128 50 -115.30 gain 50 129 -124.56 gain 129 50 -116.56 gain 50 130 -125.80 gain 130 50 -115.63 gain 50 131 -127.46 gain 131 50 -124.38 gain 50 132 -125.75 gain 132 50 -122.30 gain 50 133 -129.03 gain 133 50 -123.64 gain 50 134 -124.82 gain 134 50 -116.14 gain 50 135 -132.63 gain 135 50 -127.52 gain 50 136 -122.92 gain 136 50 -118.42 gain 50 137 -128.08 gain 137 50 -121.06 gain 50 138 -127.39 gain 138 50 -119.37 gain 50 139 -131.00 gain 139 50 -123.96 gain 50 140 -124.15 gain 140 50 -119.72 gain 50 141 -126.81 gain 141 50 -121.05 gain 50 142 -129.48 gain 142 50 -123.03 gain 50 143 -131.28 gain 143 50 -124.44 gain 50 144 -130.01 gain 144 50 -124.19 gain 50 145 -126.30 gain 145 50 -118.93 gain 50 146 -127.61 gain 146 50 -119.15 gain 50 147 -137.01 gain 147 50 -125.64 gain 50 148 -127.78 gain 148 50 -116.13 gain 50 149 -127.01 gain 149 50 -118.53 gain 50 150 -129.03 gain 150 50 -123.23 gain 50 151 -129.62 gain 151 50 -124.02 gain 50 152 -134.01 gain 152 50 -125.39 gain 50 153 -125.56 gain 153 50 -114.51 gain 50 154 -126.99 gain 154 50 -124.49 gain 50 155 -121.39 gain 155 50 -118.78 gain 50 156 -122.12 gain 156 50 -113.91 gain 50 157 -121.16 gain 157 50 -115.89 gain 50 158 -125.15 gain 158 50 -122.48 gain 50 159 -128.81 gain 159 50 -122.76 gain 50 160 -129.32 gain 160 50 -120.37 gain 50 161 -138.29 gain 161 50 -132.84 gain 50 162 -128.50 gain 162 50 -121.91 gain 50 163 -127.51 gain 163 50 -123.07 gain 50 164 -129.17 gain 164 50 -125.77 gain 50 165 -129.82 gain 165 50 -122.47 gain 50 166 -137.32 gain 166 50 -131.53 gain 50 167 -127.37 gain 167 50 -123.67 gain 50 168 -121.77 gain 168 50 -116.52 gain 50 169 -126.20 gain 169 50 -125.15 gain 50 170 -128.78 gain 170 50 -119.25 gain 50 171 -122.21 gain 171 50 -117.71 gain 50 172 -125.86 gain 172 50 -116.05 gain 50 173 -129.39 gain 173 50 -119.02 gain 50 174 -120.72 gain 174 50 -114.65 gain 50 175 -129.89 gain 175 50 -127.37 gain 50 176 -132.87 gain 176 50 -122.37 gain 50 177 -126.39 gain 177 50 -123.69 gain 50 178 -129.38 gain 178 50 -122.51 gain 50 179 -133.86 gain 179 50 -125.38 gain 50 180 -129.14 gain 180 50 -122.13 gain 50 181 -125.19 gain 181 50 -118.24 gain 50 182 -136.21 gain 182 50 -131.66 gain 50 183 -129.33 gain 183 50 -118.16 gain 50 184 -139.25 gain 184 50 -132.87 gain 50 185 -131.50 gain 185 50 -122.61 gain 50 186 -128.37 gain 186 50 -119.75 gain 50 187 -128.75 gain 187 50 -122.67 gain 50 188 -117.77 gain 188 50 -114.96 gain 50 189 -130.75 gain 189 50 -125.46 gain 50 190 -128.90 gain 190 50 -120.62 gain 50 191 -131.79 gain 191 50 -124.59 gain 50 192 -129.52 gain 192 50 -125.19 gain 50 193 -132.68 gain 193 50 -129.60 gain 50 194 -144.47 gain 194 50 -135.20 gain 50 195 -134.12 gain 195 50 -125.48 gain 50 196 -138.87 gain 196 50 -134.27 gain 50 197 -131.03 gain 197 50 -122.50 gain 50 198 -126.39 gain 198 50 -117.38 gain 50 199 -130.86 gain 199 50 -125.77 gain 50 200 -138.25 gain 200 50 -130.10 gain 50 201 -137.90 gain 201 50 -130.55 gain 50 202 -133.52 gain 202 50 -130.17 gain 50 203 -133.80 gain 203 50 -130.07 gain 50 204 -127.84 gain 204 50 -121.39 gain 50 205 -133.21 gain 205 50 -125.84 gain 50 206 -131.31 gain 206 50 -128.46 gain 50 207 -134.54 gain 207 50 -124.05 gain 50 208 -131.70 gain 208 50 -126.99 gain 50 209 -134.19 gain 209 50 -130.47 gain 50 210 -133.05 gain 210 50 -126.27 gain 50 211 -128.82 gain 211 50 -124.06 gain 50 212 -124.06 gain 212 50 -117.84 gain 50 213 -129.81 gain 213 50 -122.78 gain 50 214 -125.99 gain 214 50 -118.85 gain 50 215 -134.86 gain 215 50 -124.14 gain 50 216 -136.64 gain 216 50 -130.58 gain 50 217 -134.30 gain 217 50 -128.76 gain 50 218 -132.60 gain 218 50 -129.25 gain 50 219 -126.47 gain 219 50 -114.47 gain 50 220 -130.76 gain 220 50 -129.26 gain 50 221 -141.52 gain 221 50 -135.66 gain 50 222 -134.45 gain 222 50 -128.91 gain 50 223 -128.86 gain 223 50 -121.94 gain 50 224 -136.78 gain 224 50 -132.54 gain 51 52 -96.55 gain 52 51 -92.57 gain 51 53 -101.44 gain 53 51 -98.47 gain 51 54 -114.44 gain 54 51 -112.17 gain 51 55 -122.50 gain 55 51 -119.53 gain 51 56 -113.14 gain 56 51 -117.50 gain 51 57 -109.85 gain 57 51 -108.09 gain 51 58 -120.30 gain 58 51 -121.27 gain 51 59 -123.53 gain 59 51 -120.63 gain 51 60 -121.96 gain 60 51 -120.38 gain 51 61 -118.22 gain 61 51 -115.40 gain 51 62 -111.71 gain 62 51 -114.10 gain 51 63 -111.60 gain 63 51 -107.21 gain 51 64 -107.08 gain 64 51 -105.67 gain 51 65 -101.36 gain 65 51 -102.04 gain 51 66 -90.37 gain 66 51 -85.30 gain 51 67 -102.02 gain 67 51 -99.23 gain 51 68 -111.64 gain 68 51 -113.40 gain 51 69 -106.21 gain 69 51 -105.27 gain 51 70 -111.32 gain 70 51 -110.13 gain 51 71 -116.47 gain 71 51 -113.39 gain 51 72 -115.52 gain 72 51 -112.86 gain 51 73 -122.13 gain 73 51 -117.86 gain 51 74 -124.97 gain 74 51 -124.57 gain 51 75 -121.31 gain 75 51 -121.06 gain 51 76 -119.43 gain 76 51 -115.13 gain 51 77 -114.51 gain 77 51 -113.87 gain 51 78 -110.84 gain 78 51 -113.05 gain 51 79 -112.25 gain 79 51 -109.24 gain 51 80 -108.97 gain 80 51 -106.47 gain 51 81 -98.36 gain 81 51 -96.45 gain 51 82 -107.61 gain 82 51 -103.33 gain 51 83 -111.17 gain 83 51 -107.92 gain 51 84 -111.20 gain 84 51 -108.09 gain 51 85 -119.24 gain 85 51 -112.94 gain 51 86 -116.91 gain 86 51 -113.99 gain 51 87 -123.38 gain 87 51 -124.42 gain 51 88 -119.62 gain 88 51 -118.42 gain 51 89 -118.85 gain 89 51 -116.25 gain 51 90 -123.95 gain 90 51 -118.35 gain 51 91 -120.37 gain 91 51 -118.72 gain 51 92 -117.75 gain 92 51 -113.06 gain 51 93 -107.78 gain 93 51 -107.88 gain 51 94 -111.01 gain 94 51 -110.98 gain 51 95 -106.95 gain 95 51 -109.17 gain 51 96 -111.25 gain 96 51 -110.81 gain 51 97 -109.56 gain 97 51 -107.87 gain 51 98 -109.76 gain 98 51 -108.86 gain 51 99 -118.14 gain 99 51 -115.06 gain 51 100 -120.03 gain 100 51 -116.52 gain 51 101 -119.00 gain 101 51 -115.66 gain 51 102 -122.78 gain 102 51 -120.22 gain 51 103 -118.18 gain 103 51 -113.10 gain 51 104 -119.33 gain 104 51 -119.63 gain 51 105 -119.33 gain 105 51 -115.57 gain 51 106 -118.00 gain 106 51 -115.33 gain 51 107 -116.08 gain 107 51 -119.97 gain 51 108 -115.40 gain 108 51 -111.61 gain 51 109 -111.66 gain 109 51 -111.36 gain 51 110 -114.84 gain 110 51 -113.00 gain 51 111 -111.51 gain 111 51 -109.36 gain 51 112 -118.13 gain 112 51 -114.86 gain 51 113 -113.35 gain 113 51 -108.88 gain 51 114 -118.21 gain 114 51 -117.05 gain 51 115 -119.46 gain 115 51 -112.59 gain 51 116 -122.85 gain 116 51 -123.52 gain 51 117 -125.59 gain 117 51 -127.77 gain 51 118 -119.52 gain 118 51 -120.02 gain 51 119 -127.76 gain 119 51 -122.92 gain 51 120 -126.93 gain 120 51 -126.61 gain 51 121 -115.02 gain 121 51 -113.99 gain 51 122 -122.72 gain 122 51 -123.81 gain 51 123 -122.56 gain 123 51 -124.42 gain 51 124 -114.17 gain 124 51 -112.44 gain 51 125 -115.91 gain 125 51 -115.51 gain 51 126 -117.03 gain 126 51 -114.59 gain 51 127 -120.12 gain 127 51 -121.14 gain 51 128 -108.31 gain 128 51 -107.27 gain 51 129 -116.86 gain 129 51 -113.72 gain 51 130 -115.83 gain 130 51 -110.52 gain 51 131 -121.27 gain 131 51 -123.04 gain 51 132 -117.89 gain 132 51 -119.29 gain 51 133 -123.04 gain 133 51 -122.51 gain 51 134 -125.83 gain 134 51 -122.00 gain 51 135 -120.89 gain 135 51 -120.64 gain 51 136 -123.43 gain 136 51 -123.78 gain 51 137 -117.31 gain 137 51 -115.15 gain 51 138 -125.23 gain 138 51 -122.07 gain 51 139 -119.99 gain 139 51 -117.82 gain 51 140 -122.21 gain 140 51 -122.64 gain 51 141 -118.31 gain 141 51 -117.42 gain 51 142 -122.36 gain 142 51 -120.77 gain 51 143 -122.66 gain 143 51 -120.68 gain 51 144 -118.54 gain 144 51 -117.58 gain 51 145 -117.80 gain 145 51 -115.30 gain 51 146 -120.82 gain 146 51 -117.23 gain 51 147 -127.79 gain 147 51 -121.28 gain 51 148 -130.12 gain 148 51 -123.33 gain 51 149 -125.98 gain 149 51 -122.35 gain 51 150 -123.46 gain 150 51 -122.53 gain 51 151 -121.89 gain 151 51 -121.15 gain 51 152 -126.61 gain 152 51 -122.85 gain 51 153 -124.69 gain 153 51 -118.51 gain 51 154 -115.16 gain 154 51 -117.53 gain 51 155 -126.12 gain 155 51 -128.38 gain 51 156 -120.73 gain 156 51 -117.38 gain 51 157 -117.49 gain 157 51 -117.08 gain 51 158 -116.17 gain 158 51 -118.36 gain 51 159 -119.77 gain 159 51 -118.57 gain 51 160 -121.81 gain 160 51 -117.73 gain 51 161 -119.03 gain 161 51 -118.44 gain 51 162 -131.68 gain 162 51 -129.95 gain 51 163 -122.29 gain 163 51 -122.71 gain 51 164 -129.26 gain 164 51 -130.72 gain 51 165 -127.46 gain 165 51 -124.96 gain 51 166 -132.48 gain 166 51 -131.55 gain 51 167 -119.33 gain 167 51 -120.49 gain 51 168 -127.41 gain 168 51 -127.02 gain 51 169 -120.19 gain 169 51 -124.00 gain 51 170 -123.93 gain 170 51 -119.26 gain 51 171 -122.42 gain 171 51 -122.78 gain 51 172 -125.84 gain 172 51 -120.89 gain 51 173 -118.70 gain 173 51 -113.19 gain 51 174 -117.65 gain 174 51 -116.44 gain 51 175 -120.14 gain 175 51 -122.48 gain 51 176 -121.46 gain 176 51 -115.82 gain 51 177 -129.38 gain 177 51 -131.54 gain 51 178 -128.77 gain 178 51 -126.76 gain 51 179 -125.77 gain 179 51 -122.16 gain 51 180 -134.69 gain 180 51 -132.54 gain 51 181 -122.70 gain 181 51 -120.61 gain 51 182 -128.13 gain 182 51 -128.43 gain 51 183 -126.89 gain 183 51 -120.58 gain 51 184 -121.19 gain 184 51 -119.67 gain 51 185 -125.62 gain 185 51 -121.58 gain 51 186 -123.21 gain 186 51 -119.46 gain 51 187 -130.19 gain 187 51 -128.97 gain 51 188 -130.09 gain 188 51 -132.14 gain 51 189 -123.36 gain 189 51 -122.92 gain 51 190 -127.79 gain 190 51 -124.37 gain 51 191 -125.45 gain 191 51 -123.11 gain 51 192 -124.05 gain 192 51 -124.58 gain 51 193 -134.00 gain 193 51 -135.78 gain 51 194 -121.05 gain 194 51 -116.64 gain 51 195 -123.04 gain 195 51 -119.26 gain 51 196 -123.70 gain 196 51 -123.96 gain 51 197 -132.47 gain 197 51 -128.80 gain 51 198 -125.16 gain 198 51 -121.01 gain 51 199 -125.38 gain 199 51 -125.14 gain 51 200 -124.68 gain 200 51 -121.38 gain 51 201 -126.44 gain 201 51 -123.94 gain 51 202 -123.87 gain 202 51 -125.38 gain 51 203 -127.51 gain 203 51 -128.64 gain 51 204 -131.34 gain 204 51 -129.75 gain 51 205 -130.49 gain 205 51 -127.98 gain 51 206 -121.98 gain 206 51 -123.99 gain 51 207 -122.25 gain 207 51 -116.62 gain 51 208 -128.99 gain 208 51 -129.14 gain 51 209 -122.88 gain 209 51 -124.02 gain 51 210 -126.28 gain 210 51 -124.35 gain 51 211 -129.81 gain 211 51 -129.91 gain 51 212 -124.53 gain 212 51 -123.17 gain 51 213 -129.91 gain 213 51 -127.74 gain 51 214 -118.93 gain 214 51 -116.65 gain 51 215 -119.98 gain 215 51 -114.12 gain 51 216 -128.60 gain 216 51 -127.39 gain 51 217 -133.64 gain 217 51 -132.96 gain 51 218 -124.99 gain 218 51 -126.49 gain 51 219 -118.08 gain 219 51 -110.94 gain 51 220 -121.71 gain 220 51 -125.06 gain 51 221 -128.99 gain 221 51 -127.99 gain 51 222 -122.66 gain 222 51 -121.99 gain 51 223 -122.79 gain 223 51 -120.73 gain 51 224 -125.78 gain 224 51 -126.41 gain 52 53 -84.64 gain 53 52 -85.65 gain 52 54 -100.89 gain 54 52 -102.60 gain 52 55 -106.64 gain 55 52 -107.65 gain 52 56 -113.23 gain 56 52 -121.57 gain 52 57 -114.92 gain 57 52 -117.13 gain 52 58 -110.54 gain 58 52 -115.50 gain 52 59 -115.09 gain 59 52 -116.17 gain 52 60 -112.14 gain 60 52 -114.54 gain 52 61 -118.08 gain 61 52 -119.23 gain 52 62 -115.28 gain 62 52 -121.66 gain 52 63 -107.03 gain 63 52 -106.63 gain 52 64 -103.36 gain 64 52 -105.94 gain 52 65 -103.13 gain 65 52 -107.79 gain 52 66 -83.09 gain 66 52 -82.01 gain 52 67 -89.76 gain 67 52 -90.95 gain 52 68 -101.90 gain 68 52 -107.65 gain 52 69 -91.55 gain 69 52 -94.59 gain 52 70 -101.87 gain 70 52 -104.67 gain 52 71 -110.49 gain 71 52 -111.40 gain 52 72 -113.50 gain 72 52 -114.82 gain 52 73 -116.40 gain 73 52 -116.11 gain 52 74 -118.33 gain 74 52 -121.92 gain 52 75 -112.71 gain 75 52 -116.44 gain 52 76 -114.41 gain 76 52 -114.09 gain 52 77 -114.19 gain 77 52 -117.53 gain 52 78 -116.14 gain 78 52 -122.34 gain 52 79 -109.03 gain 79 52 -110.01 gain 52 80 -104.67 gain 80 52 -106.15 gain 52 81 -107.21 gain 81 52 -109.28 gain 52 82 -98.60 gain 82 52 -98.29 gain 52 83 -113.69 gain 83 52 -114.42 gain 52 84 -108.77 gain 84 52 -109.64 gain 52 85 -108.67 gain 85 52 -106.35 gain 52 86 -105.02 gain 86 52 -106.09 gain 52 87 -108.89 gain 87 52 -113.92 gain 52 88 -113.88 gain 88 52 -116.66 gain 52 89 -121.03 gain 89 52 -122.41 gain 52 90 -127.27 gain 90 52 -125.66 gain 52 91 -115.00 gain 91 52 -117.33 gain 52 92 -115.82 gain 92 52 -115.11 gain 52 93 -117.01 gain 93 52 -121.09 gain 52 94 -108.49 gain 94 52 -112.45 gain 52 95 -105.25 gain 95 52 -111.46 gain 52 96 -109.84 gain 96 52 -113.38 gain 52 97 -106.81 gain 97 52 -109.10 gain 52 98 -106.64 gain 98 52 -109.73 gain 52 99 -102.29 gain 99 52 -103.20 gain 52 100 -113.05 gain 100 52 -113.52 gain 52 101 -119.55 gain 101 52 -120.19 gain 52 102 -116.32 gain 102 52 -117.74 gain 52 103 -115.06 gain 103 52 -113.96 gain 52 104 -120.59 gain 104 52 -124.87 gain 52 105 -119.17 gain 105 52 -119.39 gain 52 106 -116.99 gain 106 52 -118.30 gain 52 107 -115.48 gain 107 52 -123.35 gain 52 108 -119.03 gain 108 52 -119.22 gain 52 109 -105.03 gain 109 52 -108.71 gain 52 110 -108.93 gain 110 52 -111.08 gain 52 111 -113.13 gain 111 52 -114.96 gain 52 112 -118.32 gain 112 52 -119.03 gain 52 113 -111.46 gain 113 52 -110.97 gain 52 114 -104.94 gain 114 52 -107.75 gain 52 115 -98.62 gain 115 52 -95.74 gain 52 116 -108.04 gain 116 52 -112.70 gain 52 117 -112.25 gain 117 52 -118.41 gain 52 118 -116.61 gain 118 52 -121.09 gain 52 119 -120.15 gain 119 52 -119.29 gain 52 120 -111.75 gain 120 52 -115.41 gain 52 121 -121.51 gain 121 52 -124.46 gain 52 122 -118.70 gain 122 52 -123.76 gain 52 123 -115.18 gain 123 52 -121.02 gain 52 124 -117.43 gain 124 52 -119.68 gain 52 125 -116.52 gain 125 52 -120.10 gain 52 126 -109.01 gain 126 52 -110.55 gain 52 127 -103.58 gain 127 52 -108.58 gain 52 128 -113.81 gain 128 52 -116.75 gain 52 129 -111.02 gain 129 52 -111.87 gain 52 130 -107.91 gain 130 52 -106.58 gain 52 131 -115.97 gain 131 52 -121.73 gain 52 132 -115.49 gain 132 52 -120.88 gain 52 133 -120.26 gain 133 52 -123.72 gain 52 134 -124.72 gain 134 52 -124.87 gain 52 135 -117.75 gain 135 52 -121.48 gain 52 136 -116.48 gain 136 52 -120.82 gain 52 137 -119.10 gain 137 52 -120.92 gain 52 138 -114.14 gain 138 52 -114.96 gain 52 139 -109.55 gain 139 52 -111.35 gain 52 140 -113.98 gain 140 52 -118.39 gain 52 141 -117.60 gain 141 52 -120.69 gain 52 142 -104.40 gain 142 52 -106.79 gain 52 143 -112.48 gain 143 52 -114.49 gain 52 144 -119.42 gain 144 52 -122.44 gain 52 145 -113.56 gain 145 52 -115.03 gain 52 146 -118.67 gain 146 52 -119.06 gain 52 147 -125.04 gain 147 52 -122.52 gain 52 148 -123.07 gain 148 52 -120.26 gain 52 149 -117.38 gain 149 52 -117.74 gain 52 150 -123.18 gain 150 52 -126.22 gain 52 151 -115.96 gain 151 52 -119.20 gain 52 152 -117.74 gain 152 52 -117.96 gain 52 153 -121.33 gain 153 52 -119.12 gain 52 154 -109.56 gain 154 52 -115.90 gain 52 155 -115.78 gain 155 52 -122.02 gain 52 156 -112.84 gain 156 52 -113.47 gain 52 157 -120.01 gain 157 52 -123.58 gain 52 158 -122.66 gain 158 52 -128.83 gain 52 159 -112.49 gain 159 52 -115.28 gain 52 160 -117.62 gain 160 52 -117.51 gain 52 161 -116.57 gain 161 52 -119.96 gain 52 162 -116.04 gain 162 52 -118.29 gain 52 163 -126.15 gain 163 52 -130.56 gain 52 164 -122.38 gain 164 52 -127.82 gain 52 165 -123.16 gain 165 52 -124.64 gain 52 166 -121.69 gain 166 52 -124.75 gain 52 167 -114.67 gain 167 52 -119.82 gain 52 168 -119.16 gain 168 52 -122.76 gain 52 169 -124.15 gain 169 52 -131.94 gain 52 170 -118.63 gain 170 52 -117.95 gain 52 171 -115.82 gain 171 52 -120.16 gain 52 172 -112.08 gain 172 52 -111.12 gain 52 173 -121.94 gain 173 52 -120.42 gain 52 174 -122.04 gain 174 52 -124.82 gain 52 175 -121.28 gain 175 52 -127.60 gain 52 176 -119.38 gain 176 52 -117.72 gain 52 177 -124.94 gain 177 52 -131.09 gain 52 178 -113.93 gain 178 52 -115.90 gain 52 179 -120.12 gain 179 52 -120.48 gain 52 180 -115.05 gain 180 52 -116.88 gain 52 181 -119.95 gain 181 52 -121.85 gain 52 182 -122.79 gain 182 52 -127.08 gain 52 183 -123.96 gain 183 52 -121.64 gain 52 184 -120.94 gain 184 52 -123.40 gain 52 185 -122.07 gain 185 52 -122.01 gain 52 186 -121.18 gain 186 52 -121.41 gain 52 187 -117.79 gain 187 52 -120.56 gain 52 188 -123.41 gain 188 52 -129.44 gain 52 189 -120.14 gain 189 52 -123.69 gain 52 190 -127.23 gain 190 52 -127.78 gain 52 191 -123.99 gain 191 52 -125.64 gain 52 192 -121.91 gain 192 52 -126.42 gain 52 193 -124.76 gain 193 52 -130.53 gain 52 194 -125.94 gain 194 52 -125.52 gain 52 195 -122.01 gain 195 52 -122.22 gain 52 196 -120.33 gain 196 52 -124.58 gain 52 197 -126.26 gain 197 52 -126.57 gain 52 198 -119.80 gain 198 52 -119.64 gain 52 199 -114.93 gain 199 52 -118.68 gain 52 200 -125.34 gain 200 52 -126.02 gain 52 201 -121.49 gain 201 52 -122.98 gain 52 202 -125.66 gain 202 52 -131.15 gain 52 203 -122.13 gain 203 52 -127.24 gain 52 204 -121.09 gain 204 52 -123.49 gain 52 205 -123.13 gain 205 52 -124.60 gain 52 206 -124.62 gain 206 52 -130.61 gain 52 207 -114.31 gain 207 52 -112.66 gain 52 208 -122.84 gain 208 52 -126.97 gain 52 209 -123.94 gain 209 52 -129.06 gain 52 210 -125.61 gain 210 52 -127.67 gain 52 211 -124.21 gain 211 52 -128.29 gain 52 212 -128.83 gain 212 52 -131.46 gain 52 213 -127.85 gain 213 52 -129.67 gain 52 214 -123.12 gain 214 52 -124.82 gain 52 215 -122.12 gain 215 52 -120.24 gain 52 216 -122.15 gain 216 52 -124.93 gain 52 217 -122.70 gain 217 52 -125.99 gain 52 218 -128.39 gain 218 52 -133.88 gain 52 219 -122.16 gain 219 52 -119.00 gain 52 220 -120.58 gain 220 52 -127.92 gain 52 221 -112.55 gain 221 52 -115.53 gain 52 222 -121.63 gain 222 52 -124.94 gain 52 223 -126.09 gain 223 52 -128.01 gain 52 224 -126.30 gain 224 52 -130.91 gain 53 54 -93.88 gain 54 53 -94.58 gain 53 55 -99.06 gain 55 53 -99.05 gain 53 56 -112.22 gain 56 53 -119.55 gain 53 57 -107.23 gain 57 53 -108.43 gain 53 58 -120.15 gain 58 53 -124.09 gain 53 59 -119.54 gain 59 53 -119.61 gain 53 60 -115.05 gain 60 53 -116.44 gain 53 61 -117.49 gain 61 53 -117.63 gain 53 62 -123.19 gain 62 53 -128.55 gain 53 63 -116.79 gain 63 53 -115.38 gain 53 64 -114.63 gain 64 53 -116.18 gain 53 65 -107.95 gain 65 53 -111.59 gain 53 66 -105.38 gain 66 53 -103.28 gain 53 67 -90.67 gain 67 53 -90.84 gain 53 68 -93.99 gain 68 53 -98.73 gain 53 69 -99.95 gain 69 53 -101.98 gain 53 70 -94.38 gain 70 53 -96.17 gain 53 71 -106.75 gain 71 53 -106.64 gain 53 72 -113.17 gain 72 53 -113.48 gain 53 73 -111.41 gain 73 53 -110.11 gain 53 74 -114.32 gain 74 53 -116.89 gain 53 75 -117.24 gain 75 53 -119.96 gain 53 76 -124.24 gain 76 53 -122.90 gain 53 77 -108.06 gain 77 53 -110.39 gain 53 78 -104.33 gain 78 53 -109.51 gain 53 79 -109.21 gain 79 53 -109.16 gain 53 80 -111.04 gain 80 53 -111.50 gain 53 81 -104.84 gain 81 53 -105.89 gain 53 82 -104.74 gain 82 53 -103.42 gain 53 83 -97.32 gain 83 53 -97.03 gain 53 84 -101.95 gain 84 53 -101.81 gain 53 85 -103.05 gain 85 53 -99.72 gain 53 86 -107.63 gain 86 53 -107.69 gain 53 87 -102.56 gain 87 53 -106.58 gain 53 88 -115.26 gain 88 53 -117.02 gain 53 89 -122.98 gain 89 53 -123.35 gain 53 90 -123.88 gain 90 53 -121.26 gain 53 91 -124.28 gain 91 53 -125.60 gain 53 92 -112.34 gain 92 53 -110.62 gain 53 93 -119.25 gain 93 53 -122.31 gain 53 94 -115.95 gain 94 53 -118.89 gain 53 95 -109.29 gain 95 53 -114.48 gain 53 96 -111.04 gain 96 53 -113.57 gain 53 97 -99.87 gain 97 53 -101.14 gain 53 98 -103.99 gain 98 53 -106.07 gain 53 99 -102.39 gain 99 53 -102.29 gain 53 100 -102.19 gain 100 53 -101.65 gain 53 101 -112.61 gain 101 53 -112.23 gain 53 102 -110.15 gain 102 53 -110.55 gain 53 103 -114.88 gain 103 53 -112.76 gain 53 104 -120.13 gain 104 53 -123.40 gain 53 105 -119.38 gain 105 53 -118.58 gain 53 106 -123.06 gain 106 53 -123.35 gain 53 107 -116.62 gain 107 53 -123.48 gain 53 108 -115.73 gain 108 53 -114.91 gain 53 109 -112.27 gain 109 53 -114.93 gain 53 110 -113.25 gain 110 53 -114.38 gain 53 111 -108.24 gain 111 53 -109.06 gain 53 112 -104.66 gain 112 53 -104.35 gain 53 113 -107.52 gain 113 53 -106.02 gain 53 114 -112.11 gain 114 53 -113.92 gain 53 115 -107.82 gain 115 53 -103.92 gain 53 116 -105.03 gain 116 53 -108.68 gain 53 117 -108.89 gain 117 53 -114.04 gain 53 118 -122.87 gain 118 53 -126.33 gain 53 119 -112.84 gain 119 53 -110.97 gain 53 120 -119.17 gain 120 53 -121.81 gain 53 121 -118.48 gain 121 53 -120.41 gain 53 122 -119.74 gain 122 53 -123.79 gain 53 123 -121.04 gain 123 53 -125.86 gain 53 124 -113.82 gain 124 53 -115.05 gain 53 125 -120.13 gain 125 53 -122.70 gain 53 126 -114.26 gain 126 53 -114.79 gain 53 127 -119.87 gain 127 53 -123.86 gain 53 128 -109.53 gain 128 53 -111.45 gain 53 129 -110.97 gain 129 53 -110.80 gain 53 130 -115.67 gain 130 53 -113.32 gain 53 131 -118.70 gain 131 53 -123.45 gain 53 132 -119.29 gain 132 53 -123.66 gain 53 133 -113.19 gain 133 53 -115.64 gain 53 134 -117.31 gain 134 53 -116.45 gain 53 135 -118.81 gain 135 53 -121.52 gain 53 136 -122.42 gain 136 53 -125.74 gain 53 137 -122.57 gain 137 53 -123.37 gain 53 138 -114.24 gain 138 53 -114.04 gain 53 139 -118.48 gain 139 53 -119.27 gain 53 140 -118.46 gain 140 53 -121.86 gain 53 141 -115.23 gain 141 53 -117.30 gain 53 142 -109.76 gain 142 53 -111.14 gain 53 143 -115.27 gain 143 53 -116.26 gain 53 144 -113.11 gain 144 53 -115.12 gain 53 145 -118.85 gain 145 53 -119.31 gain 53 146 -112.67 gain 146 53 -112.03 gain 53 147 -117.26 gain 147 53 -113.72 gain 53 148 -120.38 gain 148 53 -116.56 gain 53 149 -116.51 gain 149 53 -115.85 gain 53 150 -120.36 gain 150 53 -122.39 gain 53 151 -121.09 gain 151 53 -123.32 gain 53 152 -127.71 gain 152 53 -126.92 gain 53 153 -121.73 gain 153 53 -118.51 gain 53 154 -115.86 gain 154 53 -121.19 gain 53 155 -116.42 gain 155 53 -121.65 gain 53 156 -117.46 gain 156 53 -117.07 gain 53 157 -114.97 gain 157 53 -117.53 gain 53 158 -113.13 gain 158 53 -118.28 gain 53 159 -114.28 gain 159 53 -116.05 gain 53 160 -118.47 gain 160 53 -117.35 gain 53 161 -117.51 gain 161 53 -119.88 gain 53 162 -119.56 gain 162 53 -120.79 gain 53 163 -119.36 gain 163 53 -122.74 gain 53 164 -123.20 gain 164 53 -127.63 gain 53 165 -117.44 gain 165 53 -117.91 gain 53 166 -123.00 gain 166 53 -125.04 gain 53 167 -123.22 gain 167 53 -127.35 gain 53 168 -129.72 gain 168 53 -132.30 gain 53 169 -127.15 gain 169 53 -133.92 gain 53 170 -125.23 gain 170 53 -123.53 gain 53 171 -122.09 gain 171 53 -125.41 gain 53 172 -116.15 gain 172 53 -114.17 gain 53 173 -113.68 gain 173 53 -111.14 gain 53 174 -128.52 gain 174 53 -130.27 gain 53 175 -119.78 gain 175 53 -125.09 gain 53 176 -121.58 gain 176 53 -118.91 gain 53 177 -125.52 gain 177 53 -130.66 gain 53 178 -125.39 gain 178 53 -126.35 gain 53 179 -121.25 gain 179 53 -120.60 gain 53 180 -127.96 gain 180 53 -128.78 gain 53 181 -121.97 gain 181 53 -122.85 gain 53 182 -122.16 gain 182 53 -125.43 gain 53 183 -124.19 gain 183 53 -120.85 gain 53 184 -122.78 gain 184 53 -124.22 gain 53 185 -118.93 gain 185 53 -117.86 gain 53 186 -114.26 gain 186 53 -113.47 gain 53 187 -125.39 gain 187 53 -127.15 gain 53 188 -117.37 gain 188 53 -122.38 gain 53 189 -125.67 gain 189 53 -128.20 gain 53 190 -125.09 gain 190 53 -124.63 gain 53 191 -122.95 gain 191 53 -123.58 gain 53 192 -122.21 gain 192 53 -125.71 gain 53 193 -130.92 gain 193 53 -135.67 gain 53 194 -126.75 gain 194 53 -125.31 gain 53 195 -124.06 gain 195 53 -123.25 gain 53 196 -125.64 gain 196 53 -128.87 gain 53 197 -128.42 gain 197 53 -127.71 gain 53 198 -123.39 gain 198 53 -122.20 gain 53 199 -121.89 gain 199 53 -124.62 gain 53 200 -127.37 gain 200 53 -127.04 gain 53 201 -125.80 gain 201 53 -126.27 gain 53 202 -126.91 gain 202 53 -131.38 gain 53 203 -123.69 gain 203 53 -127.79 gain 53 204 -125.63 gain 204 53 -127.01 gain 53 205 -112.97 gain 205 53 -113.42 gain 53 206 -120.70 gain 206 53 -125.67 gain 53 207 -123.02 gain 207 53 -120.36 gain 53 208 -117.79 gain 208 53 -120.90 gain 53 209 -122.54 gain 209 53 -126.65 gain 53 210 -127.84 gain 210 53 -128.88 gain 53 211 -126.27 gain 211 53 -129.33 gain 53 212 -118.71 gain 212 53 -120.32 gain 53 213 -120.49 gain 213 53 -121.29 gain 53 214 -119.39 gain 214 53 -120.07 gain 53 215 -126.65 gain 215 53 -123.75 gain 53 216 -122.03 gain 216 53 -123.79 gain 53 217 -127.98 gain 217 53 -130.26 gain 53 218 -122.03 gain 218 53 -126.51 gain 53 219 -129.04 gain 219 53 -124.87 gain 53 220 -126.56 gain 220 53 -132.88 gain 53 221 -131.56 gain 221 53 -133.52 gain 53 222 -128.14 gain 222 53 -130.43 gain 53 223 -126.62 gain 223 53 -127.52 gain 53 224 -129.38 gain 224 53 -132.97 gain 54 55 -84.50 gain 55 54 -83.79 gain 54 56 -95.78 gain 56 54 -102.40 gain 54 57 -110.70 gain 57 54 -111.20 gain 54 58 -120.63 gain 58 54 -123.88 gain 54 59 -108.40 gain 59 54 -107.76 gain 54 60 -124.70 gain 60 54 -125.38 gain 54 61 -122.04 gain 61 54 -121.48 gain 54 62 -117.18 gain 62 54 -121.84 gain 54 63 -120.05 gain 63 54 -117.94 gain 54 64 -117.14 gain 64 54 -118.00 gain 54 65 -118.59 gain 65 54 -121.53 gain 54 66 -104.56 gain 66 54 -101.76 gain 54 67 -99.85 gain 67 54 -99.32 gain 54 68 -105.20 gain 68 54 -109.24 gain 54 69 -97.12 gain 69 54 -98.45 gain 54 70 -94.82 gain 70 54 -95.91 gain 54 71 -107.76 gain 71 54 -106.94 gain 54 72 -109.59 gain 72 54 -109.20 gain 54 73 -108.54 gain 73 54 -106.54 gain 54 74 -110.60 gain 74 54 -112.47 gain 54 75 -118.26 gain 75 54 -120.27 gain 54 76 -119.29 gain 76 54 -117.26 gain 54 77 -109.50 gain 77 54 -111.13 gain 54 78 -118.52 gain 78 54 -123.00 gain 54 79 -111.35 gain 79 54 -110.61 gain 54 80 -111.67 gain 80 54 -111.43 gain 54 81 -112.21 gain 81 54 -112.56 gain 54 82 -117.43 gain 82 54 -115.41 gain 54 83 -102.03 gain 83 54 -101.05 gain 54 84 -102.32 gain 84 54 -101.48 gain 54 85 -102.45 gain 85 54 -98.42 gain 54 86 -102.04 gain 86 54 -101.39 gain 54 87 -112.13 gain 87 54 -115.44 gain 54 88 -115.66 gain 88 54 -116.72 gain 54 89 -112.79 gain 89 54 -112.45 gain 54 90 -114.24 gain 90 54 -110.91 gain 54 91 -122.41 gain 91 54 -123.03 gain 54 92 -118.88 gain 92 54 -116.46 gain 54 93 -112.81 gain 93 54 -115.17 gain 54 94 -114.34 gain 94 54 -116.58 gain 54 95 -108.82 gain 95 54 -113.31 gain 54 96 -108.67 gain 96 54 -110.50 gain 54 97 -104.69 gain 97 54 -105.27 gain 54 98 -108.22 gain 98 54 -109.60 gain 54 99 -107.78 gain 99 54 -106.97 gain 54 100 -111.19 gain 100 54 -109.95 gain 54 101 -104.65 gain 101 54 -103.57 gain 54 102 -111.09 gain 102 54 -110.79 gain 54 103 -118.62 gain 103 54 -115.80 gain 54 104 -119.42 gain 104 54 -121.98 gain 54 105 -121.36 gain 105 54 -119.87 gain 54 106 -115.86 gain 106 54 -115.45 gain 54 107 -123.36 gain 107 54 -129.52 gain 54 108 -114.64 gain 108 54 -113.12 gain 54 109 -120.29 gain 109 54 -122.25 gain 54 110 -120.37 gain 110 54 -120.81 gain 54 111 -110.90 gain 111 54 -111.01 gain 54 112 -104.50 gain 112 54 -103.49 gain 54 113 -110.09 gain 113 54 -107.88 gain 54 114 -108.06 gain 114 54 -109.16 gain 54 115 -112.93 gain 115 54 -108.34 gain 54 116 -113.86 gain 116 54 -116.80 gain 54 117 -108.77 gain 117 54 -113.21 gain 54 118 -113.80 gain 118 54 -116.56 gain 54 119 -119.64 gain 119 54 -117.06 gain 54 120 -124.89 gain 120 54 -126.83 gain 54 121 -127.12 gain 121 54 -128.35 gain 54 122 -116.25 gain 122 54 -119.60 gain 54 123 -118.97 gain 123 54 -123.09 gain 54 124 -116.62 gain 124 54 -117.15 gain 54 125 -122.97 gain 125 54 -124.84 gain 54 126 -118.37 gain 126 54 -118.19 gain 54 127 -111.39 gain 127 54 -114.67 gain 54 128 -114.02 gain 128 54 -115.24 gain 54 129 -109.28 gain 129 54 -108.41 gain 54 130 -113.06 gain 130 54 -110.02 gain 54 131 -120.19 gain 131 54 -124.24 gain 54 132 -112.47 gain 132 54 -116.14 gain 54 133 -117.37 gain 133 54 -119.11 gain 54 134 -119.33 gain 134 54 -117.77 gain 54 135 -125.81 gain 135 54 -127.82 gain 54 136 -126.16 gain 136 54 -128.79 gain 54 137 -117.65 gain 137 54 -117.75 gain 54 138 -116.51 gain 138 54 -115.61 gain 54 139 -126.04 gain 139 54 -126.13 gain 54 140 -120.39 gain 140 54 -123.09 gain 54 141 -119.69 gain 141 54 -121.06 gain 54 142 -121.27 gain 142 54 -121.95 gain 54 143 -113.14 gain 143 54 -113.44 gain 54 144 -117.95 gain 144 54 -119.26 gain 54 145 -120.05 gain 145 54 -119.81 gain 54 146 -118.48 gain 146 54 -117.15 gain 54 147 -116.25 gain 147 54 -112.01 gain 54 148 -117.83 gain 148 54 -113.30 gain 54 149 -116.43 gain 149 54 -115.08 gain 54 150 -122.43 gain 150 54 -123.76 gain 54 151 -130.07 gain 151 54 -131.59 gain 54 152 -122.52 gain 152 54 -121.02 gain 54 153 -125.94 gain 153 54 -122.02 gain 54 154 -124.53 gain 154 54 -129.16 gain 54 155 -118.65 gain 155 54 -123.18 gain 54 156 -108.72 gain 156 54 -107.64 gain 54 157 -123.16 gain 157 54 -125.01 gain 54 158 -118.87 gain 158 54 -123.32 gain 54 159 -121.10 gain 159 54 -122.17 gain 54 160 -117.82 gain 160 54 -116.01 gain 54 161 -112.65 gain 161 54 -114.32 gain 54 162 -120.92 gain 162 54 -121.46 gain 54 163 -114.49 gain 163 54 -117.18 gain 54 164 -114.79 gain 164 54 -118.51 gain 54 165 -126.75 gain 165 54 -126.52 gain 54 166 -122.93 gain 166 54 -124.27 gain 54 167 -119.74 gain 167 54 -123.17 gain 54 168 -118.52 gain 168 54 -120.40 gain 54 169 -116.32 gain 169 54 -122.39 gain 54 170 -123.52 gain 170 54 -121.13 gain 54 171 -118.67 gain 171 54 -121.30 gain 54 172 -114.46 gain 172 54 -111.78 gain 54 173 -120.95 gain 173 54 -117.71 gain 54 174 -127.10 gain 174 54 -128.15 gain 54 175 -119.95 gain 175 54 -124.56 gain 54 176 -115.03 gain 176 54 -111.65 gain 54 177 -115.31 gain 177 54 -119.74 gain 54 178 -121.03 gain 178 54 -121.29 gain 54 179 -125.71 gain 179 54 -124.35 gain 54 180 -131.95 gain 180 54 -132.07 gain 54 181 -129.61 gain 181 54 -129.79 gain 54 182 -122.30 gain 182 54 -124.87 gain 54 183 -128.72 gain 183 54 -124.68 gain 54 184 -118.59 gain 184 54 -119.33 gain 54 185 -118.38 gain 185 54 -116.61 gain 54 186 -129.09 gain 186 54 -127.61 gain 54 187 -124.50 gain 187 54 -125.56 gain 54 188 -123.01 gain 188 54 -127.33 gain 54 189 -119.06 gain 189 54 -120.88 gain 54 190 -120.49 gain 190 54 -119.33 gain 54 191 -122.44 gain 191 54 -122.37 gain 54 192 -118.53 gain 192 54 -121.33 gain 54 193 -124.40 gain 193 54 -128.45 gain 54 194 -121.32 gain 194 54 -119.18 gain 54 195 -131.82 gain 195 54 -130.31 gain 54 196 -122.69 gain 196 54 -125.23 gain 54 197 -122.06 gain 197 54 -120.66 gain 54 198 -124.51 gain 198 54 -122.63 gain 54 199 -116.80 gain 199 54 -118.83 gain 54 200 -120.90 gain 200 54 -119.87 gain 54 201 -122.64 gain 201 54 -122.41 gain 54 202 -125.50 gain 202 54 -129.27 gain 54 203 -124.58 gain 203 54 -127.98 gain 54 204 -121.53 gain 204 54 -122.21 gain 54 205 -128.33 gain 205 54 -128.09 gain 54 206 -126.62 gain 206 54 -130.89 gain 54 207 -127.13 gain 207 54 -123.76 gain 54 208 -125.78 gain 208 54 -128.19 gain 54 209 -129.52 gain 209 54 -132.93 gain 54 210 -125.10 gain 210 54 -125.44 gain 54 211 -130.91 gain 211 54 -133.28 gain 54 212 -123.94 gain 212 54 -124.85 gain 54 213 -119.47 gain 213 54 -119.57 gain 54 214 -114.37 gain 214 54 -114.36 gain 54 215 -128.13 gain 215 54 -124.53 gain 54 216 -121.97 gain 216 54 -123.04 gain 54 217 -132.67 gain 217 54 -134.26 gain 54 218 -124.74 gain 218 54 -128.51 gain 54 219 -125.22 gain 219 54 -120.35 gain 54 220 -126.56 gain 220 54 -132.18 gain 54 221 -128.98 gain 221 54 -130.24 gain 54 222 -119.77 gain 222 54 -121.36 gain 54 223 -128.47 gain 223 54 -128.67 gain 54 224 -123.49 gain 224 54 -126.38 gain 55 56 -89.80 gain 56 55 -97.12 gain 55 57 -103.45 gain 57 55 -104.65 gain 55 58 -109.86 gain 58 55 -113.81 gain 55 59 -113.25 gain 59 55 -113.31 gain 55 60 -122.47 gain 60 55 -123.86 gain 55 61 -117.84 gain 61 55 -117.98 gain 55 62 -123.78 gain 62 55 -129.14 gain 55 63 -111.75 gain 63 55 -110.34 gain 55 64 -119.65 gain 64 55 -121.21 gain 55 65 -108.65 gain 65 55 -112.30 gain 55 66 -110.24 gain 66 55 -108.15 gain 55 67 -103.16 gain 67 55 -103.33 gain 55 68 -112.42 gain 68 55 -117.16 gain 55 69 -95.08 gain 69 55 -97.10 gain 55 70 -91.75 gain 70 55 -93.54 gain 55 71 -93.09 gain 71 55 -92.98 gain 55 72 -103.14 gain 72 55 -103.45 gain 55 73 -97.80 gain 73 55 -96.50 gain 55 74 -112.24 gain 74 55 -114.82 gain 55 75 -120.01 gain 75 55 -122.73 gain 55 76 -127.42 gain 76 55 -126.08 gain 55 77 -116.08 gain 77 55 -118.41 gain 55 78 -110.77 gain 78 55 -115.96 gain 55 79 -117.70 gain 79 55 -117.66 gain 55 80 -116.79 gain 80 55 -117.25 gain 55 81 -115.08 gain 81 55 -116.14 gain 55 82 -116.36 gain 82 55 -115.04 gain 55 83 -110.53 gain 83 55 -110.25 gain 55 84 -107.81 gain 84 55 -107.67 gain 55 85 -109.80 gain 85 55 -106.47 gain 55 86 -104.35 gain 86 55 -104.40 gain 55 87 -95.27 gain 87 55 -99.29 gain 55 88 -107.72 gain 88 55 -109.49 gain 55 89 -109.51 gain 89 55 -109.87 gain 55 90 -122.30 gain 90 55 -119.67 gain 55 91 -128.93 gain 91 55 -130.25 gain 55 92 -120.32 gain 92 55 -118.60 gain 55 93 -124.17 gain 93 55 -127.23 gain 55 94 -118.79 gain 94 55 -121.73 gain 55 95 -115.63 gain 95 55 -120.82 gain 55 96 -106.91 gain 96 55 -109.44 gain 55 97 -107.27 gain 97 55 -108.55 gain 55 98 -115.74 gain 98 55 -117.81 gain 55 99 -104.95 gain 99 55 -104.85 gain 55 100 -99.22 gain 100 55 -98.68 gain 55 101 -115.71 gain 101 55 -115.33 gain 55 102 -107.03 gain 102 55 -107.43 gain 55 103 -112.33 gain 103 55 -110.22 gain 55 104 -120.62 gain 104 55 -123.88 gain 55 105 -111.75 gain 105 55 -110.96 gain 55 106 -127.14 gain 106 55 -127.43 gain 55 107 -122.58 gain 107 55 -129.44 gain 55 108 -125.24 gain 108 55 -124.41 gain 55 109 -120.62 gain 109 55 -123.29 gain 55 110 -117.44 gain 110 55 -118.57 gain 55 111 -114.86 gain 111 55 -115.67 gain 55 112 -118.61 gain 112 55 -118.31 gain 55 113 -106.58 gain 113 55 -105.08 gain 55 114 -112.93 gain 114 55 -114.73 gain 55 115 -106.23 gain 115 55 -102.34 gain 55 116 -112.59 gain 116 55 -116.23 gain 55 117 -109.39 gain 117 55 -114.53 gain 55 118 -120.84 gain 118 55 -124.31 gain 55 119 -113.27 gain 119 55 -111.40 gain 55 120 -129.64 gain 120 55 -132.28 gain 55 121 -123.88 gain 121 55 -125.81 gain 55 122 -120.76 gain 122 55 -124.81 gain 55 123 -116.12 gain 123 55 -120.95 gain 55 124 -117.37 gain 124 55 -118.60 gain 55 125 -120.22 gain 125 55 -122.79 gain 55 126 -118.19 gain 126 55 -118.72 gain 55 127 -119.06 gain 127 55 -123.05 gain 55 128 -119.06 gain 128 55 -120.99 gain 55 129 -115.27 gain 129 55 -115.10 gain 55 130 -108.74 gain 130 55 -106.40 gain 55 131 -116.32 gain 131 55 -121.06 gain 55 132 -110.10 gain 132 55 -114.48 gain 55 133 -119.22 gain 133 55 -121.66 gain 55 134 -112.24 gain 134 55 -111.39 gain 55 135 -130.05 gain 135 55 -132.76 gain 55 136 -126.62 gain 136 55 -129.94 gain 55 137 -129.67 gain 137 55 -130.48 gain 55 138 -127.59 gain 138 55 -127.40 gain 55 139 -115.13 gain 139 55 -115.92 gain 55 140 -113.49 gain 140 55 -116.89 gain 55 141 -118.23 gain 141 55 -120.30 gain 55 142 -125.10 gain 142 55 -126.48 gain 55 143 -123.17 gain 143 55 -124.17 gain 55 144 -118.62 gain 144 55 -120.63 gain 55 145 -114.59 gain 145 55 -115.05 gain 55 146 -113.90 gain 146 55 -113.27 gain 55 147 -109.35 gain 147 55 -105.81 gain 55 148 -127.00 gain 148 55 -123.17 gain 55 149 -125.97 gain 149 55 -125.31 gain 55 150 -128.03 gain 150 55 -130.06 gain 55 151 -120.78 gain 151 55 -123.01 gain 55 152 -122.10 gain 152 55 -121.30 gain 55 153 -122.32 gain 153 55 -119.10 gain 55 154 -126.26 gain 154 55 -131.59 gain 55 155 -114.41 gain 155 55 -119.64 gain 55 156 -121.99 gain 156 55 -121.61 gain 55 157 -122.45 gain 157 55 -125.01 gain 55 158 -104.90 gain 158 55 -110.05 gain 55 159 -118.47 gain 159 55 -120.25 gain 55 160 -115.34 gain 160 55 -114.22 gain 55 161 -113.95 gain 161 55 -116.32 gain 55 162 -115.67 gain 162 55 -116.91 gain 55 163 -119.79 gain 163 55 -123.18 gain 55 164 -115.10 gain 164 55 -119.53 gain 55 165 -120.63 gain 165 55 -121.10 gain 55 166 -128.06 gain 166 55 -130.10 gain 55 167 -120.28 gain 167 55 -124.41 gain 55 168 -124.81 gain 168 55 -127.39 gain 55 169 -119.32 gain 169 55 -126.10 gain 55 170 -120.99 gain 170 55 -119.29 gain 55 171 -124.78 gain 171 55 -128.11 gain 55 172 -124.84 gain 172 55 -122.86 gain 55 173 -118.01 gain 173 55 -115.47 gain 55 174 -126.40 gain 174 55 -128.16 gain 55 175 -122.73 gain 175 55 -128.04 gain 55 176 -114.25 gain 176 55 -111.58 gain 55 177 -114.65 gain 177 55 -119.78 gain 55 178 -123.39 gain 178 55 -124.34 gain 55 179 -113.82 gain 179 55 -113.17 gain 55 180 -125.33 gain 180 55 -126.15 gain 55 181 -122.55 gain 181 55 -123.44 gain 55 182 -124.72 gain 182 55 -127.99 gain 55 183 -136.95 gain 183 55 -133.62 gain 55 184 -122.23 gain 184 55 -123.67 gain 55 185 -123.61 gain 185 55 -122.54 gain 55 186 -125.46 gain 186 55 -124.68 gain 55 187 -125.67 gain 187 55 -127.43 gain 55 188 -115.19 gain 188 55 -120.20 gain 55 189 -124.62 gain 189 55 -127.15 gain 55 190 -127.24 gain 190 55 -126.78 gain 55 191 -120.84 gain 191 55 -121.47 gain 55 192 -116.62 gain 192 55 -120.12 gain 55 193 -115.76 gain 193 55 -120.51 gain 55 194 -128.01 gain 194 55 -126.57 gain 55 195 -129.44 gain 195 55 -128.63 gain 55 196 -124.30 gain 196 55 -127.54 gain 55 197 -124.20 gain 197 55 -123.50 gain 55 198 -123.48 gain 198 55 -122.30 gain 55 199 -119.40 gain 199 55 -122.13 gain 55 200 -129.80 gain 200 55 -129.47 gain 55 201 -129.67 gain 201 55 -130.15 gain 55 202 -127.46 gain 202 55 -131.93 gain 55 203 -125.69 gain 203 55 -129.79 gain 55 204 -127.65 gain 204 55 -129.03 gain 55 205 -124.09 gain 205 55 -124.55 gain 55 206 -123.01 gain 206 55 -127.98 gain 55 207 -117.05 gain 207 55 -114.39 gain 55 208 -124.20 gain 208 55 -127.32 gain 55 209 -122.99 gain 209 55 -127.09 gain 55 210 -130.12 gain 210 55 -131.17 gain 55 211 -126.09 gain 211 55 -129.15 gain 55 212 -124.89 gain 212 55 -126.50 gain 55 213 -128.72 gain 213 55 -129.52 gain 55 214 -125.64 gain 214 55 -126.33 gain 55 215 -130.00 gain 215 55 -127.11 gain 55 216 -125.98 gain 216 55 -127.75 gain 55 217 -122.19 gain 217 55 -124.47 gain 55 218 -122.78 gain 218 55 -127.25 gain 55 219 -126.73 gain 219 55 -122.56 gain 55 220 -122.10 gain 220 55 -128.43 gain 55 221 -120.51 gain 221 55 -122.48 gain 55 222 -122.55 gain 222 55 -124.84 gain 55 223 -117.61 gain 223 55 -118.51 gain 55 224 -118.30 gain 224 55 -121.89 gain 56 57 -100.99 gain 57 56 -94.86 gain 56 58 -111.04 gain 58 56 -107.65 gain 56 59 -112.71 gain 59 56 -105.45 gain 56 60 -130.72 gain 60 56 -124.79 gain 56 61 -126.65 gain 61 56 -119.46 gain 56 62 -133.82 gain 62 56 -131.85 gain 56 63 -125.17 gain 63 56 -116.43 gain 56 64 -127.89 gain 64 56 -122.12 gain 56 65 -121.61 gain 65 56 -117.93 gain 56 66 -122.39 gain 66 56 -112.97 gain 56 67 -113.41 gain 67 56 -106.26 gain 56 68 -111.24 gain 68 56 -108.65 gain 56 69 -110.01 gain 69 56 -104.71 gain 56 70 -103.02 gain 70 56 -97.48 gain 56 71 -94.67 gain 71 56 -87.24 gain 56 72 -103.05 gain 72 56 -96.03 gain 56 73 -104.40 gain 73 56 -95.77 gain 56 74 -118.21 gain 74 56 -113.46 gain 56 75 -130.47 gain 75 56 -125.86 gain 56 76 -129.10 gain 76 56 -120.44 gain 56 77 -126.16 gain 77 56 -121.17 gain 56 78 -128.71 gain 78 56 -126.56 gain 56 79 -118.32 gain 79 56 -110.96 gain 56 80 -119.11 gain 80 56 -112.24 gain 56 81 -123.53 gain 81 56 -117.26 gain 56 82 -119.83 gain 82 56 -111.18 gain 56 83 -117.76 gain 83 56 -110.15 gain 56 84 -106.99 gain 84 56 -99.53 gain 56 85 -118.67 gain 85 56 -108.02 gain 56 86 -105.45 gain 86 56 -98.18 gain 56 87 -100.96 gain 87 56 -97.65 gain 56 88 -120.48 gain 88 56 -114.91 gain 56 89 -117.06 gain 89 56 -110.10 gain 56 90 -127.96 gain 90 56 -118.01 gain 56 91 -133.78 gain 91 56 -127.77 gain 56 92 -130.73 gain 92 56 -121.68 gain 56 93 -125.76 gain 93 56 -121.50 gain 56 94 -124.98 gain 94 56 -120.60 gain 56 95 -122.02 gain 95 56 -119.89 gain 56 96 -122.30 gain 96 56 -117.50 gain 56 97 -121.04 gain 97 56 -115.00 gain 56 98 -118.71 gain 98 56 -113.46 gain 56 99 -104.66 gain 99 56 -97.23 gain 56 100 -120.76 gain 100 56 -112.90 gain 56 101 -102.47 gain 101 56 -94.77 gain 56 102 -116.24 gain 102 56 -109.32 gain 56 103 -115.69 gain 103 56 -106.25 gain 56 104 -118.42 gain 104 56 -114.36 gain 56 105 -138.57 gain 105 56 -130.45 gain 56 106 -129.47 gain 106 56 -122.43 gain 56 107 -128.11 gain 107 56 -127.64 gain 56 108 -129.45 gain 108 56 -121.30 gain 56 109 -124.80 gain 109 56 -120.13 gain 56 110 -129.94 gain 110 56 -123.75 gain 56 111 -119.77 gain 111 56 -113.26 gain 56 112 -127.17 gain 112 56 -119.54 gain 56 113 -115.04 gain 113 56 -106.21 gain 56 114 -117.27 gain 114 56 -111.75 gain 56 115 -114.08 gain 115 56 -102.86 gain 56 116 -120.36 gain 116 56 -116.68 gain 56 117 -113.77 gain 117 56 -111.59 gain 56 118 -115.22 gain 118 56 -111.36 gain 56 119 -125.07 gain 119 56 -115.87 gain 56 120 -126.56 gain 120 56 -121.88 gain 56 121 -131.82 gain 121 56 -126.43 gain 56 122 -122.65 gain 122 56 -119.37 gain 56 123 -123.19 gain 123 56 -120.70 gain 56 124 -123.66 gain 124 56 -117.57 gain 56 125 -129.38 gain 125 56 -124.62 gain 56 126 -129.51 gain 126 56 -122.71 gain 56 127 -123.47 gain 127 56 -120.14 gain 56 128 -125.02 gain 128 56 -119.62 gain 56 129 -124.67 gain 129 56 -117.18 gain 56 130 -117.14 gain 130 56 -107.48 gain 56 131 -118.71 gain 131 56 -116.13 gain 56 132 -126.32 gain 132 56 -123.36 gain 56 133 -118.55 gain 133 56 -113.66 gain 56 134 -121.57 gain 134 56 -113.39 gain 56 135 -129.97 gain 135 56 -125.36 gain 56 136 -129.28 gain 136 56 -125.28 gain 56 137 -132.10 gain 137 56 -125.58 gain 56 138 -132.30 gain 138 56 -124.78 gain 56 139 -125.50 gain 139 56 -118.97 gain 56 140 -126.30 gain 140 56 -122.37 gain 56 141 -133.19 gain 141 56 -127.94 gain 56 142 -121.37 gain 142 56 -115.42 gain 56 143 -123.59 gain 143 56 -117.26 gain 56 144 -123.39 gain 144 56 -118.07 gain 56 145 -120.12 gain 145 56 -113.25 gain 56 146 -125.37 gain 146 56 -117.41 gain 56 147 -116.89 gain 147 56 -106.02 gain 56 148 -125.88 gain 148 56 -114.73 gain 56 149 -121.22 gain 149 56 -113.24 gain 56 150 -131.36 gain 150 56 -126.07 gain 56 151 -135.79 gain 151 56 -130.69 gain 56 152 -129.17 gain 152 56 -121.05 gain 56 153 -132.16 gain 153 56 -121.62 gain 56 154 -126.30 gain 154 56 -124.30 gain 56 155 -130.62 gain 155 56 -128.52 gain 56 156 -123.58 gain 156 56 -115.87 gain 56 157 -129.10 gain 157 56 -124.33 gain 56 158 -130.51 gain 158 56 -128.34 gain 56 159 -119.65 gain 159 56 -114.09 gain 56 160 -124.49 gain 160 56 -116.05 gain 56 161 -122.72 gain 161 56 -117.76 gain 56 162 -118.91 gain 162 56 -112.82 gain 56 163 -126.72 gain 163 56 -122.78 gain 56 164 -125.54 gain 164 56 -122.64 gain 56 165 -130.60 gain 165 56 -123.74 gain 56 166 -136.08 gain 166 56 -130.79 gain 56 167 -125.50 gain 167 56 -122.30 gain 56 168 -133.45 gain 168 56 -128.71 gain 56 169 -131.37 gain 169 56 -130.82 gain 56 170 -123.01 gain 170 56 -113.99 gain 56 171 -122.99 gain 171 56 -118.99 gain 56 172 -126.78 gain 172 56 -117.48 gain 56 173 -119.47 gain 173 56 -109.60 gain 56 174 -125.96 gain 174 56 -120.39 gain 56 175 -124.24 gain 175 56 -122.23 gain 56 176 -122.68 gain 176 56 -112.68 gain 56 177 -126.33 gain 177 56 -124.14 gain 56 178 -130.71 gain 178 56 -124.34 gain 56 179 -129.00 gain 179 56 -121.02 gain 56 180 -127.43 gain 180 56 -120.92 gain 56 181 -128.10 gain 181 56 -121.66 gain 56 182 -137.06 gain 182 56 -133.01 gain 56 183 -132.69 gain 183 56 -122.03 gain 56 184 -139.64 gain 184 56 -133.76 gain 56 185 -127.38 gain 185 56 -118.99 gain 56 186 -133.89 gain 186 56 -125.77 gain 56 187 -129.89 gain 187 56 -124.32 gain 56 188 -124.79 gain 188 56 -122.48 gain 56 189 -132.72 gain 189 56 -127.93 gain 56 190 -130.17 gain 190 56 -122.38 gain 56 191 -130.58 gain 191 56 -123.89 gain 56 192 -125.94 gain 192 56 -122.11 gain 56 193 -132.56 gain 193 56 -129.98 gain 56 194 -132.94 gain 194 56 -124.18 gain 56 195 -141.54 gain 195 56 -133.41 gain 56 196 -135.26 gain 196 56 -131.17 gain 56 197 -135.32 gain 197 56 -127.29 gain 56 198 -133.92 gain 198 56 -125.41 gain 56 199 -130.50 gain 199 56 -125.91 gain 56 200 -137.83 gain 200 56 -130.18 gain 56 201 -134.83 gain 201 56 -127.98 gain 56 202 -132.07 gain 202 56 -129.23 gain 56 203 -132.44 gain 203 56 -129.22 gain 56 204 -134.17 gain 204 56 -128.22 gain 56 205 -128.50 gain 205 56 -121.63 gain 56 206 -130.43 gain 206 56 -128.08 gain 56 207 -128.06 gain 207 56 -118.08 gain 56 208 -131.08 gain 208 56 -126.87 gain 56 209 -129.81 gain 209 56 -126.59 gain 56 210 -129.87 gain 210 56 -123.59 gain 56 211 -134.95 gain 211 56 -130.70 gain 56 212 -137.56 gain 212 56 -131.84 gain 56 213 -134.55 gain 213 56 -128.02 gain 56 214 -141.31 gain 214 56 -134.68 gain 56 215 -130.93 gain 215 56 -120.70 gain 56 216 -129.86 gain 216 56 -124.30 gain 56 217 -132.00 gain 217 56 -126.95 gain 56 218 -133.32 gain 218 56 -130.47 gain 56 219 -132.12 gain 219 56 -120.63 gain 56 220 -126.81 gain 220 56 -125.81 gain 56 221 -130.73 gain 221 56 -125.37 gain 56 222 -136.31 gain 222 56 -131.28 gain 56 223 -137.53 gain 223 56 -131.11 gain 56 224 -136.62 gain 224 56 -132.89 gain 57 58 -90.96 gain 58 57 -93.70 gain 57 59 -97.15 gain 59 57 -96.01 gain 57 60 -120.87 gain 60 57 -121.06 gain 57 61 -125.06 gain 61 57 -124.00 gain 57 62 -118.29 gain 62 57 -122.45 gain 57 63 -115.36 gain 63 57 -112.75 gain 57 64 -118.69 gain 64 57 -119.05 gain 57 65 -118.64 gain 65 57 -121.09 gain 57 66 -114.84 gain 66 57 -111.54 gain 57 67 -116.47 gain 67 57 -115.45 gain 57 68 -105.02 gain 68 57 -108.56 gain 57 69 -112.59 gain 69 57 -113.42 gain 57 70 -106.35 gain 70 57 -106.94 gain 57 71 -96.58 gain 71 57 -95.27 gain 57 72 -96.08 gain 72 57 -95.19 gain 57 73 -93.35 gain 73 57 -90.84 gain 57 74 -104.28 gain 74 57 -105.66 gain 57 75 -122.21 gain 75 57 -123.73 gain 57 76 -123.39 gain 76 57 -120.86 gain 57 77 -119.88 gain 77 57 -121.01 gain 57 78 -130.25 gain 78 57 -134.23 gain 57 79 -126.13 gain 79 57 -124.89 gain 57 80 -121.38 gain 80 57 -120.65 gain 57 81 -115.08 gain 81 57 -114.94 gain 57 82 -112.06 gain 82 57 -109.54 gain 57 83 -110.27 gain 83 57 -108.78 gain 57 84 -110.41 gain 84 57 -109.07 gain 57 85 -103.36 gain 85 57 -98.83 gain 57 86 -106.29 gain 86 57 -105.15 gain 57 87 -102.60 gain 87 57 -105.42 gain 57 88 -104.70 gain 88 57 -105.27 gain 57 89 -108.58 gain 89 57 -107.74 gain 57 90 -122.91 gain 90 57 -119.08 gain 57 91 -131.60 gain 91 57 -131.72 gain 57 92 -121.59 gain 92 57 -118.67 gain 57 93 -118.58 gain 93 57 -120.44 gain 57 94 -118.71 gain 94 57 -120.45 gain 57 95 -117.32 gain 95 57 -121.32 gain 57 96 -110.73 gain 96 57 -112.06 gain 57 97 -112.61 gain 97 57 -112.68 gain 57 98 -117.20 gain 98 57 -118.08 gain 57 99 -109.95 gain 99 57 -108.64 gain 57 100 -110.23 gain 100 57 -108.49 gain 57 101 -110.76 gain 101 57 -109.18 gain 57 102 -105.92 gain 102 57 -105.12 gain 57 103 -105.97 gain 103 57 -102.66 gain 57 104 -114.70 gain 104 57 -116.76 gain 57 105 -133.19 gain 105 57 -131.20 gain 57 106 -126.09 gain 106 57 -125.18 gain 57 107 -120.83 gain 107 57 -126.49 gain 57 108 -120.61 gain 108 57 -118.59 gain 57 109 -116.58 gain 109 57 -118.04 gain 57 110 -121.66 gain 110 57 -121.60 gain 57 111 -116.51 gain 111 57 -116.12 gain 57 112 -120.44 gain 112 57 -118.93 gain 57 113 -118.24 gain 113 57 -115.53 gain 57 114 -112.89 gain 114 57 -113.49 gain 57 115 -107.43 gain 115 57 -102.34 gain 57 116 -116.39 gain 116 57 -118.84 gain 57 117 -111.06 gain 117 57 -115.00 gain 57 118 -117.93 gain 118 57 -120.20 gain 57 119 -114.12 gain 119 57 -111.05 gain 57 120 -130.05 gain 120 57 -131.49 gain 57 121 -126.14 gain 121 57 -126.88 gain 57 122 -123.60 gain 122 57 -126.45 gain 57 123 -123.43 gain 123 57 -127.06 gain 57 124 -124.76 gain 124 57 -124.79 gain 57 125 -124.19 gain 125 57 -125.56 gain 57 126 -116.13 gain 126 57 -115.45 gain 57 127 -121.82 gain 127 57 -124.61 gain 57 128 -112.55 gain 128 57 -113.28 gain 57 129 -112.72 gain 129 57 -111.35 gain 57 130 -113.66 gain 130 57 -110.12 gain 57 131 -117.47 gain 131 57 -121.02 gain 57 132 -108.12 gain 132 57 -111.29 gain 57 133 -106.22 gain 133 57 -107.46 gain 57 134 -115.12 gain 134 57 -113.06 gain 57 135 -123.37 gain 135 57 -124.89 gain 57 136 -125.70 gain 136 57 -127.82 gain 57 137 -121.92 gain 137 57 -121.53 gain 57 138 -122.64 gain 138 57 -121.24 gain 57 139 -125.60 gain 139 57 -125.20 gain 57 140 -125.92 gain 140 57 -128.12 gain 57 141 -126.60 gain 141 57 -127.48 gain 57 142 -122.87 gain 142 57 -123.05 gain 57 143 -117.39 gain 143 57 -117.18 gain 57 144 -111.48 gain 144 57 -112.29 gain 57 145 -116.06 gain 145 57 -115.32 gain 57 146 -112.49 gain 146 57 -110.66 gain 57 147 -119.60 gain 147 57 -114.86 gain 57 148 -122.78 gain 148 57 -117.76 gain 57 149 -120.74 gain 149 57 -118.88 gain 57 150 -126.65 gain 150 57 -127.48 gain 57 151 -128.84 gain 151 57 -129.87 gain 57 152 -125.91 gain 152 57 -123.92 gain 57 153 -123.53 gain 153 57 -119.11 gain 57 154 -122.85 gain 154 57 -126.98 gain 57 155 -127.36 gain 155 57 -131.39 gain 57 156 -127.35 gain 156 57 -125.76 gain 57 157 -131.98 gain 157 57 -133.34 gain 57 158 -122.82 gain 158 57 -126.77 gain 57 159 -117.09 gain 159 57 -117.66 gain 57 160 -118.61 gain 160 57 -116.30 gain 57 161 -118.51 gain 161 57 -119.68 gain 57 162 -120.71 gain 162 57 -120.75 gain 57 163 -119.19 gain 163 57 -121.38 gain 57 164 -115.25 gain 164 57 -118.47 gain 57 165 -131.77 gain 165 57 -131.04 gain 57 166 -132.15 gain 166 57 -132.99 gain 57 167 -131.76 gain 167 57 -134.69 gain 57 168 -120.29 gain 168 57 -121.67 gain 57 169 -127.03 gain 169 57 -132.60 gain 57 170 -123.52 gain 170 57 -120.62 gain 57 171 -123.74 gain 171 57 -125.87 gain 57 172 -128.06 gain 172 57 -124.89 gain 57 173 -122.06 gain 173 57 -118.32 gain 57 174 -121.82 gain 174 57 -122.37 gain 57 175 -119.97 gain 175 57 -124.08 gain 57 176 -122.56 gain 176 57 -118.68 gain 57 177 -124.62 gain 177 57 -128.55 gain 57 178 -125.19 gain 178 57 -124.95 gain 57 179 -115.42 gain 179 57 -113.57 gain 57 180 -135.66 gain 180 57 -135.27 gain 57 181 -138.37 gain 181 57 -138.05 gain 57 182 -127.60 gain 182 57 -129.67 gain 57 183 -132.99 gain 183 57 -128.45 gain 57 184 -123.60 gain 184 57 -123.85 gain 57 185 -127.22 gain 185 57 -124.95 gain 57 186 -130.31 gain 186 57 -128.32 gain 57 187 -116.42 gain 187 57 -116.97 gain 57 188 -130.04 gain 188 57 -133.85 gain 57 189 -121.43 gain 189 57 -122.76 gain 57 190 -118.73 gain 190 57 -117.07 gain 57 191 -125.97 gain 191 57 -125.40 gain 57 192 -119.99 gain 192 57 -122.29 gain 57 193 -109.66 gain 193 57 -113.21 gain 57 194 -124.25 gain 194 57 -121.61 gain 57 195 -130.01 gain 195 57 -128.00 gain 57 196 -128.57 gain 196 57 -130.61 gain 57 197 -126.31 gain 197 57 -124.40 gain 57 198 -123.28 gain 198 57 -120.90 gain 57 199 -129.81 gain 199 57 -131.34 gain 57 200 -126.57 gain 200 57 -125.05 gain 57 201 -132.75 gain 201 57 -132.03 gain 57 202 -122.74 gain 202 57 -126.01 gain 57 203 -129.93 gain 203 57 -132.83 gain 57 204 -121.68 gain 204 57 -121.86 gain 57 205 -123.57 gain 205 57 -122.83 gain 57 206 -131.23 gain 206 57 -135.01 gain 57 207 -122.88 gain 207 57 -119.02 gain 57 208 -123.64 gain 208 57 -125.55 gain 57 209 -128.37 gain 209 57 -131.28 gain 57 210 -124.10 gain 210 57 -123.94 gain 57 211 -129.80 gain 211 57 -131.67 gain 57 212 -130.41 gain 212 57 -130.81 gain 57 213 -124.59 gain 213 57 -124.20 gain 57 214 -127.84 gain 214 57 -127.33 gain 57 215 -131.31 gain 215 57 -127.21 gain 57 216 -133.27 gain 216 57 -133.83 gain 57 217 -131.94 gain 217 57 -133.02 gain 57 218 -129.47 gain 218 57 -132.74 gain 57 219 -123.43 gain 219 57 -118.06 gain 57 220 -119.43 gain 220 57 -124.56 gain 57 221 -130.09 gain 221 57 -130.85 gain 57 222 -125.92 gain 222 57 -127.01 gain 57 223 -124.76 gain 223 57 -124.46 gain 57 224 -131.20 gain 224 57 -133.60 gain 58 59 -92.69 gain 59 58 -88.81 gain 58 60 -134.69 gain 60 58 -132.14 gain 58 61 -128.35 gain 61 58 -124.55 gain 58 62 -135.58 gain 62 58 -137.00 gain 58 63 -132.32 gain 63 58 -126.96 gain 58 64 -122.06 gain 64 58 -119.67 gain 58 65 -130.00 gain 65 58 -129.71 gain 58 66 -123.06 gain 66 58 -117.02 gain 58 67 -119.45 gain 67 58 -115.68 gain 58 68 -112.88 gain 68 58 -113.67 gain 58 69 -112.88 gain 69 58 -110.97 gain 58 70 -115.89 gain 70 58 -113.73 gain 58 71 -107.54 gain 71 58 -103.49 gain 58 72 -106.24 gain 72 58 -102.61 gain 58 73 -92.37 gain 73 58 -87.13 gain 58 74 -107.10 gain 74 58 -105.73 gain 58 75 -125.61 gain 75 58 -124.38 gain 58 76 -126.18 gain 76 58 -120.90 gain 58 77 -129.65 gain 77 58 -128.04 gain 58 78 -131.94 gain 78 58 -133.18 gain 58 79 -129.08 gain 79 58 -125.10 gain 58 80 -124.42 gain 80 58 -120.94 gain 58 81 -116.90 gain 81 58 -114.01 gain 58 82 -120.38 gain 82 58 -115.12 gain 58 83 -122.07 gain 83 58 -117.84 gain 58 84 -113.36 gain 84 58 -109.28 gain 58 85 -110.95 gain 85 58 -103.67 gain 58 86 -115.15 gain 86 58 -111.26 gain 58 87 -102.43 gain 87 58 -102.50 gain 58 88 -99.91 gain 88 58 -97.73 gain 58 89 -110.29 gain 89 58 -106.71 gain 58 90 -130.16 gain 90 58 -123.59 gain 58 91 -127.75 gain 91 58 -125.12 gain 58 92 -125.77 gain 92 58 -120.11 gain 58 93 -131.08 gain 93 58 -130.20 gain 58 94 -126.13 gain 94 58 -125.13 gain 58 95 -129.70 gain 95 58 -130.95 gain 58 96 -124.97 gain 96 58 -123.56 gain 58 97 -122.94 gain 97 58 -120.27 gain 58 98 -121.65 gain 98 58 -119.78 gain 58 99 -117.69 gain 99 58 -113.65 gain 58 100 -112.94 gain 100 58 -108.45 gain 58 101 -107.75 gain 101 58 -103.43 gain 58 102 -112.03 gain 102 58 -108.49 gain 58 103 -112.01 gain 103 58 -105.96 gain 58 104 -105.09 gain 104 58 -104.41 gain 58 105 -132.26 gain 105 58 -127.53 gain 58 106 -132.50 gain 106 58 -128.85 gain 58 107 -127.37 gain 107 58 -130.29 gain 58 108 -123.71 gain 108 58 -118.95 gain 58 109 -125.62 gain 109 58 -124.34 gain 58 110 -119.16 gain 110 58 -116.35 gain 58 111 -116.74 gain 111 58 -113.61 gain 58 112 -123.29 gain 112 58 -119.04 gain 58 113 -121.03 gain 113 58 -115.58 gain 58 114 -124.02 gain 114 58 -121.88 gain 58 115 -112.65 gain 115 58 -104.82 gain 58 116 -120.09 gain 116 58 -119.80 gain 58 117 -111.51 gain 117 58 -112.71 gain 58 118 -118.94 gain 118 58 -118.47 gain 58 119 -119.74 gain 119 58 -113.93 gain 58 120 -130.79 gain 120 58 -129.50 gain 58 121 -128.90 gain 121 58 -126.89 gain 58 122 -132.77 gain 122 58 -132.87 gain 58 123 -130.90 gain 123 58 -131.79 gain 58 124 -125.46 gain 124 58 -122.75 gain 58 125 -123.52 gain 125 58 -122.15 gain 58 126 -125.43 gain 126 58 -122.02 gain 58 127 -130.11 gain 127 58 -130.15 gain 58 128 -122.90 gain 128 58 -120.88 gain 58 129 -120.04 gain 129 58 -115.93 gain 58 130 -114.43 gain 130 58 -108.15 gain 58 131 -121.40 gain 131 58 -122.21 gain 58 132 -117.85 gain 132 58 -118.28 gain 58 133 -112.46 gain 133 58 -110.96 gain 58 134 -114.19 gain 134 58 -109.39 gain 58 135 -138.56 gain 135 58 -137.33 gain 58 136 -131.95 gain 136 58 -131.33 gain 58 137 -129.52 gain 137 58 -126.38 gain 58 138 -133.13 gain 138 58 -129.00 gain 58 139 -122.37 gain 139 58 -119.22 gain 58 140 -119.54 gain 140 58 -119.00 gain 58 141 -114.71 gain 141 58 -112.84 gain 58 142 -124.45 gain 142 58 -121.88 gain 58 143 -122.59 gain 143 58 -119.64 gain 58 144 -122.89 gain 144 58 -120.96 gain 58 145 -122.73 gain 145 58 -119.25 gain 58 146 -119.98 gain 146 58 -115.41 gain 58 147 -119.38 gain 147 58 -111.90 gain 58 148 -122.38 gain 148 58 -114.61 gain 58 149 -115.68 gain 149 58 -111.08 gain 58 150 -130.61 gain 150 58 -128.70 gain 58 151 -125.84 gain 151 58 -124.12 gain 58 152 -126.55 gain 152 58 -121.82 gain 58 153 -122.20 gain 153 58 -115.04 gain 58 154 -126.72 gain 154 58 -128.10 gain 58 155 -130.81 gain 155 58 -132.09 gain 58 156 -121.95 gain 156 58 -117.62 gain 58 157 -124.06 gain 157 58 -122.68 gain 58 158 -127.36 gain 158 58 -128.57 gain 58 159 -122.49 gain 159 58 -120.32 gain 58 160 -124.34 gain 160 58 -119.29 gain 58 161 -125.81 gain 161 58 -124.24 gain 58 162 -128.20 gain 162 58 -125.50 gain 58 163 -114.64 gain 163 58 -114.08 gain 58 164 -120.76 gain 164 58 -121.25 gain 58 165 -124.36 gain 165 58 -120.89 gain 58 166 -139.36 gain 166 58 -137.45 gain 58 167 -130.11 gain 167 58 -130.29 gain 58 168 -125.20 gain 168 58 -123.83 gain 58 169 -131.80 gain 169 58 -134.63 gain 58 170 -125.68 gain 170 58 -120.04 gain 58 171 -120.34 gain 171 58 -119.72 gain 58 172 -122.66 gain 172 58 -116.74 gain 58 173 -119.14 gain 173 58 -112.66 gain 58 174 -126.13 gain 174 58 -123.94 gain 58 175 -125.44 gain 175 58 -126.81 gain 58 176 -124.13 gain 176 58 -117.51 gain 58 177 -118.80 gain 177 58 -119.99 gain 58 178 -127.18 gain 178 58 -124.20 gain 58 179 -117.63 gain 179 58 -113.04 gain 58 180 -135.55 gain 180 58 -132.42 gain 58 181 -124.61 gain 181 58 -121.56 gain 58 182 -126.62 gain 182 58 -125.95 gain 58 183 -126.25 gain 183 58 -118.97 gain 58 184 -136.38 gain 184 58 -133.88 gain 58 185 -131.17 gain 185 58 -126.16 gain 58 186 -127.71 gain 186 58 -122.98 gain 58 187 -126.60 gain 187 58 -124.42 gain 58 188 -132.73 gain 188 58 -133.80 gain 58 189 -122.08 gain 189 58 -120.67 gain 58 190 -126.53 gain 190 58 -122.13 gain 58 191 -123.01 gain 191 58 -119.70 gain 58 192 -125.04 gain 192 58 -124.60 gain 58 193 -121.57 gain 193 58 -122.37 gain 58 194 -121.14 gain 194 58 -115.76 gain 58 195 -132.42 gain 195 58 -127.67 gain 58 196 -135.43 gain 196 58 -134.72 gain 58 197 -128.85 gain 197 58 -124.20 gain 58 198 -127.04 gain 198 58 -121.91 gain 58 199 -128.60 gain 199 58 -127.40 gain 58 200 -129.91 gain 200 58 -125.64 gain 58 201 -130.55 gain 201 58 -127.09 gain 58 202 -129.49 gain 202 58 -130.03 gain 58 203 -133.26 gain 203 58 -133.42 gain 58 204 -126.86 gain 204 58 -124.30 gain 58 205 -128.60 gain 205 58 -125.12 gain 58 206 -122.20 gain 206 58 -123.23 gain 58 207 -126.95 gain 207 58 -120.34 gain 58 208 -120.56 gain 208 58 -119.73 gain 58 209 -121.59 gain 209 58 -121.75 gain 58 210 -133.47 gain 210 58 -130.58 gain 58 211 -131.23 gain 211 58 -130.35 gain 58 212 -128.14 gain 212 58 -125.80 gain 58 213 -132.57 gain 213 58 -129.43 gain 58 214 -131.82 gain 214 58 -128.57 gain 58 215 -136.08 gain 215 58 -129.24 gain 58 216 -129.63 gain 216 58 -127.45 gain 58 217 -132.54 gain 217 58 -130.88 gain 58 218 -134.07 gain 218 58 -134.60 gain 58 219 -122.16 gain 219 58 -114.06 gain 58 220 -132.39 gain 220 58 -134.77 gain 58 221 -124.93 gain 221 58 -122.95 gain 58 222 -136.64 gain 222 58 -134.99 gain 58 223 -126.18 gain 223 58 -123.14 gain 58 224 -121.06 gain 224 58 -120.71 gain 59 60 -127.32 gain 60 59 -128.64 gain 59 61 -126.78 gain 61 59 -126.86 gain 59 62 -121.71 gain 62 59 -127.00 gain 59 63 -126.56 gain 63 59 -125.08 gain 59 64 -117.21 gain 64 59 -118.70 gain 59 65 -126.06 gain 65 59 -129.64 gain 59 66 -116.73 gain 66 59 -114.57 gain 59 67 -122.29 gain 67 59 -122.40 gain 59 68 -118.70 gain 68 59 -123.37 gain 59 69 -113.46 gain 69 59 -115.42 gain 59 70 -108.67 gain 70 59 -110.39 gain 59 71 -109.03 gain 71 59 -108.86 gain 59 72 -106.68 gain 72 59 -106.92 gain 59 73 -96.96 gain 73 59 -95.60 gain 59 74 -93.28 gain 74 59 -95.79 gain 59 75 -131.88 gain 75 59 -134.53 gain 59 76 -123.56 gain 76 59 -122.16 gain 59 77 -130.06 gain 77 59 -132.33 gain 59 78 -124.91 gain 78 59 -130.03 gain 59 79 -120.48 gain 79 59 -120.37 gain 59 80 -123.24 gain 80 59 -123.64 gain 59 81 -119.85 gain 81 59 -120.84 gain 59 82 -116.63 gain 82 59 -115.24 gain 59 83 -117.08 gain 83 59 -116.73 gain 59 84 -109.59 gain 84 59 -109.39 gain 59 85 -114.34 gain 85 59 -110.94 gain 59 86 -106.72 gain 86 59 -106.71 gain 59 87 -106.56 gain 87 59 -110.50 gain 59 88 -101.24 gain 88 59 -102.94 gain 59 89 -102.96 gain 89 59 -103.26 gain 59 90 -125.58 gain 90 59 -122.89 gain 59 91 -126.43 gain 91 59 -127.68 gain 59 92 -119.12 gain 92 59 -117.33 gain 59 93 -126.92 gain 93 59 -129.92 gain 59 94 -128.62 gain 94 59 -131.49 gain 59 95 -117.36 gain 95 59 -122.49 gain 59 96 -125.27 gain 96 59 -127.73 gain 59 97 -128.76 gain 97 59 -129.97 gain 59 98 -115.03 gain 98 59 -117.04 gain 59 99 -115.23 gain 99 59 -115.06 gain 59 100 -121.07 gain 100 59 -120.47 gain 59 101 -118.68 gain 101 59 -118.24 gain 59 102 -113.44 gain 102 59 -113.78 gain 59 103 -103.74 gain 103 59 -101.56 gain 59 104 -108.66 gain 104 59 -111.86 gain 59 105 -122.88 gain 105 59 -122.02 gain 59 106 -122.84 gain 106 59 -123.06 gain 59 107 -129.71 gain 107 59 -136.50 gain 59 108 -128.37 gain 108 59 -127.48 gain 59 109 -127.84 gain 109 59 -130.43 gain 59 110 -119.61 gain 110 59 -120.68 gain 59 111 -117.61 gain 111 59 -118.35 gain 59 112 -124.39 gain 112 59 -124.02 gain 59 113 -123.61 gain 113 59 -122.04 gain 59 114 -118.24 gain 114 59 -119.97 gain 59 115 -110.39 gain 115 59 -106.43 gain 59 116 -112.93 gain 116 59 -116.51 gain 59 117 -108.24 gain 117 59 -113.32 gain 59 118 -118.28 gain 118 59 -121.68 gain 59 119 -112.02 gain 119 59 -110.08 gain 59 120 -128.78 gain 120 59 -131.36 gain 59 121 -130.94 gain 121 59 -132.81 gain 59 122 -126.57 gain 122 59 -130.56 gain 59 123 -117.34 gain 123 59 -122.10 gain 59 124 -117.87 gain 124 59 -119.04 gain 59 125 -125.34 gain 125 59 -127.85 gain 59 126 -126.36 gain 126 59 -126.82 gain 59 127 -120.49 gain 127 59 -124.41 gain 59 128 -119.28 gain 128 59 -121.14 gain 59 129 -122.13 gain 129 59 -121.90 gain 59 130 -116.55 gain 130 59 -114.14 gain 59 131 -109.77 gain 131 59 -114.45 gain 59 132 -115.89 gain 132 59 -120.20 gain 59 133 -120.14 gain 133 59 -122.52 gain 59 134 -108.05 gain 134 59 -107.13 gain 59 135 -130.70 gain 135 59 -133.35 gain 59 136 -130.80 gain 136 59 -134.06 gain 59 137 -125.99 gain 137 59 -126.74 gain 59 138 -129.74 gain 138 59 -129.48 gain 59 139 -124.25 gain 139 59 -124.97 gain 59 140 -131.43 gain 140 59 -134.76 gain 59 141 -121.16 gain 141 59 -123.17 gain 59 142 -120.18 gain 142 59 -121.49 gain 59 143 -114.45 gain 143 59 -115.38 gain 59 144 -114.00 gain 144 59 -115.95 gain 59 145 -119.34 gain 145 59 -119.73 gain 59 146 -113.17 gain 146 59 -112.48 gain 59 147 -119.66 gain 147 59 -116.05 gain 59 148 -117.78 gain 148 59 -113.89 gain 59 149 -116.09 gain 149 59 -115.37 gain 59 150 -126.23 gain 150 59 -128.19 gain 59 151 -131.56 gain 151 59 -133.72 gain 59 152 -134.08 gain 152 59 -133.22 gain 59 153 -124.02 gain 153 59 -120.74 gain 59 154 -131.33 gain 154 59 -136.59 gain 59 155 -129.04 gain 155 59 -134.20 gain 59 156 -121.44 gain 156 59 -120.99 gain 59 157 -122.05 gain 157 59 -124.54 gain 59 158 -121.75 gain 158 59 -126.84 gain 59 159 -134.56 gain 159 59 -136.27 gain 59 160 -115.70 gain 160 59 -114.52 gain 59 161 -118.89 gain 161 59 -121.20 gain 59 162 -118.59 gain 162 59 -119.77 gain 59 163 -121.48 gain 163 59 -124.80 gain 59 164 -119.33 gain 164 59 -123.70 gain 59 165 -130.52 gain 165 59 -130.93 gain 59 166 -126.41 gain 166 59 -128.38 gain 59 167 -126.27 gain 167 59 -130.34 gain 59 168 -129.24 gain 168 59 -131.76 gain 59 169 -122.82 gain 169 59 -129.53 gain 59 170 -120.35 gain 170 59 -118.58 gain 59 171 -124.24 gain 171 59 -127.50 gain 59 172 -122.80 gain 172 59 -120.76 gain 59 173 -122.89 gain 173 59 -120.28 gain 59 174 -123.09 gain 174 59 -124.78 gain 59 175 -118.43 gain 175 59 -123.68 gain 59 176 -117.83 gain 176 59 -115.08 gain 59 177 -120.19 gain 177 59 -125.26 gain 59 178 -126.88 gain 178 59 -127.77 gain 59 179 -124.45 gain 179 59 -123.73 gain 59 180 -126.98 gain 180 59 -127.74 gain 59 181 -133.36 gain 181 59 -134.18 gain 59 182 -125.74 gain 182 59 -128.94 gain 59 183 -126.53 gain 183 59 -123.12 gain 59 184 -128.30 gain 184 59 -129.67 gain 59 185 -129.57 gain 185 59 -128.43 gain 59 186 -122.68 gain 186 59 -121.82 gain 59 187 -120.91 gain 187 59 -122.59 gain 59 188 -123.93 gain 188 59 -128.88 gain 59 189 -123.22 gain 189 59 -125.69 gain 59 190 -123.16 gain 190 59 -122.63 gain 59 191 -116.07 gain 191 59 -116.64 gain 59 192 -112.00 gain 192 59 -115.44 gain 59 193 -123.96 gain 193 59 -128.65 gain 59 194 -115.90 gain 194 59 -114.40 gain 59 195 -130.18 gain 195 59 -129.31 gain 59 196 -131.66 gain 196 59 -134.83 gain 59 197 -134.13 gain 197 59 -133.36 gain 59 198 -126.41 gain 198 59 -125.17 gain 59 199 -128.37 gain 199 59 -131.03 gain 59 200 -129.06 gain 200 59 -128.66 gain 59 201 -126.39 gain 201 59 -126.80 gain 59 202 -128.06 gain 202 59 -132.47 gain 59 203 -126.46 gain 203 59 -130.50 gain 59 204 -128.77 gain 204 59 -130.09 gain 59 205 -122.42 gain 205 59 -122.81 gain 59 206 -124.60 gain 206 59 -129.51 gain 59 207 -127.51 gain 207 59 -124.79 gain 59 208 -121.50 gain 208 59 -124.55 gain 59 209 -127.95 gain 209 59 -132.00 gain 59 210 -130.76 gain 210 59 -131.74 gain 59 211 -129.73 gain 211 59 -132.73 gain 59 212 -133.89 gain 212 59 -135.43 gain 59 213 -130.32 gain 213 59 -131.05 gain 59 214 -129.11 gain 214 59 -129.73 gain 59 215 -125.09 gain 215 59 -122.13 gain 59 216 -126.45 gain 216 59 -128.15 gain 59 217 -120.31 gain 217 59 -122.53 gain 59 218 -121.37 gain 218 59 -125.77 gain 59 219 -123.80 gain 219 59 -119.57 gain 59 220 -118.50 gain 220 59 -124.76 gain 59 221 -118.00 gain 221 59 -119.90 gain 59 222 -123.92 gain 222 59 -126.15 gain 59 223 -120.91 gain 223 59 -121.74 gain 59 224 -122.69 gain 224 59 -126.22 gain 60 61 -91.79 gain 61 60 -90.54 gain 60 62 -97.24 gain 62 60 -101.21 gain 60 63 -106.52 gain 63 60 -103.72 gain 60 64 -112.73 gain 64 60 -112.90 gain 60 65 -115.52 gain 65 60 -117.78 gain 60 66 -122.17 gain 66 60 -118.68 gain 60 67 -112.33 gain 67 60 -111.11 gain 60 68 -119.07 gain 68 60 -122.42 gain 60 69 -121.09 gain 69 60 -121.73 gain 60 70 -124.65 gain 70 60 -125.04 gain 60 71 -122.65 gain 71 60 -121.15 gain 60 72 -129.00 gain 72 60 -127.92 gain 60 73 -125.05 gain 73 60 -122.36 gain 60 74 -131.13 gain 74 60 -132.32 gain 60 75 -91.50 gain 75 60 -92.82 gain 60 76 -102.47 gain 76 60 -99.74 gain 60 77 -106.16 gain 77 60 -107.10 gain 60 78 -105.29 gain 78 60 -109.09 gain 60 79 -117.37 gain 79 60 -115.94 gain 60 80 -119.77 gain 80 60 -118.84 gain 60 81 -115.60 gain 81 60 -115.27 gain 60 82 -116.76 gain 82 60 -114.05 gain 60 83 -119.30 gain 83 60 -117.63 gain 60 84 -125.02 gain 84 60 -123.49 gain 60 85 -130.15 gain 85 60 -125.43 gain 60 86 -121.63 gain 86 60 -120.29 gain 60 87 -121.68 gain 87 60 -124.30 gain 60 88 -124.84 gain 88 60 -125.21 gain 60 89 -128.71 gain 89 60 -127.69 gain 60 90 -105.34 gain 90 60 -101.33 gain 60 91 -103.52 gain 91 60 -103.45 gain 60 92 -101.05 gain 92 60 -97.94 gain 60 93 -108.13 gain 93 60 -109.81 gain 60 94 -114.25 gain 94 60 -115.80 gain 60 95 -120.75 gain 95 60 -124.56 gain 60 96 -121.44 gain 96 60 -122.58 gain 60 97 -118.97 gain 97 60 -118.86 gain 60 98 -122.37 gain 98 60 -123.06 gain 60 99 -120.19 gain 99 60 -118.70 gain 60 100 -129.51 gain 100 60 -127.58 gain 60 101 -121.47 gain 101 60 -119.71 gain 60 102 -124.84 gain 102 60 -123.86 gain 60 103 -128.59 gain 103 60 -125.09 gain 60 104 -132.60 gain 104 60 -134.47 gain 60 105 -102.21 gain 105 60 -100.03 gain 60 106 -105.53 gain 106 60 -104.43 gain 60 107 -113.65 gain 107 60 -119.12 gain 60 108 -108.31 gain 108 60 -106.09 gain 60 109 -108.76 gain 109 60 -110.03 gain 60 110 -108.58 gain 110 60 -108.32 gain 60 111 -117.95 gain 111 60 -117.37 gain 60 112 -131.85 gain 112 60 -130.15 gain 60 113 -117.94 gain 113 60 -115.04 gain 60 114 -125.58 gain 114 60 -126.00 gain 60 115 -122.97 gain 115 60 -117.69 gain 60 116 -128.20 gain 116 60 -130.46 gain 60 117 -122.00 gain 117 60 -125.76 gain 60 118 -133.87 gain 118 60 -135.95 gain 60 119 -124.86 gain 119 60 -121.60 gain 60 120 -115.49 gain 120 60 -116.74 gain 60 121 -109.02 gain 121 60 -109.57 gain 60 122 -113.94 gain 122 60 -116.60 gain 60 123 -118.61 gain 123 60 -122.05 gain 60 124 -112.65 gain 124 60 -112.50 gain 60 125 -124.24 gain 125 60 -125.43 gain 60 126 -117.90 gain 126 60 -117.03 gain 60 127 -123.43 gain 127 60 -126.03 gain 60 128 -122.12 gain 128 60 -122.66 gain 60 129 -121.78 gain 129 60 -120.23 gain 60 130 -129.94 gain 130 60 -126.21 gain 60 131 -131.60 gain 131 60 -134.95 gain 60 132 -121.93 gain 132 60 -124.91 gain 60 133 -119.29 gain 133 60 -120.34 gain 60 134 -132.42 gain 134 60 -130.17 gain 60 135 -109.22 gain 135 60 -110.55 gain 60 136 -116.94 gain 136 60 -118.87 gain 60 137 -114.88 gain 137 60 -114.29 gain 60 138 -110.62 gain 138 60 -109.04 gain 60 139 -117.28 gain 139 60 -116.68 gain 60 140 -120.44 gain 140 60 -122.45 gain 60 141 -125.11 gain 141 60 -125.79 gain 60 142 -123.53 gain 142 60 -123.52 gain 60 143 -124.39 gain 143 60 -123.99 gain 60 144 -117.98 gain 144 60 -118.60 gain 60 145 -124.40 gain 145 60 -123.47 gain 60 146 -122.52 gain 146 60 -120.50 gain 60 147 -127.07 gain 147 60 -122.14 gain 60 148 -123.87 gain 148 60 -118.66 gain 60 149 -130.49 gain 149 60 -128.44 gain 60 150 -118.87 gain 150 60 -119.51 gain 60 151 -118.49 gain 151 60 -119.33 gain 60 152 -119.02 gain 152 60 -116.83 gain 60 153 -111.01 gain 153 60 -106.40 gain 60 154 -114.50 gain 154 60 -118.44 gain 60 155 -124.58 gain 155 60 -128.41 gain 60 156 -124.91 gain 156 60 -123.13 gain 60 157 -123.84 gain 157 60 -125.01 gain 60 158 -123.76 gain 158 60 -127.53 gain 60 159 -130.48 gain 159 60 -130.87 gain 60 160 -120.93 gain 160 60 -118.42 gain 60 161 -117.42 gain 161 60 -118.40 gain 60 162 -129.12 gain 162 60 -128.97 gain 60 163 -121.87 gain 163 60 -123.86 gain 60 164 -128.90 gain 164 60 -131.94 gain 60 165 -121.63 gain 165 60 -120.71 gain 60 166 -120.61 gain 166 60 -121.26 gain 60 167 -114.42 gain 167 60 -117.16 gain 60 168 -124.57 gain 168 60 -125.76 gain 60 169 -122.43 gain 169 60 -127.82 gain 60 170 -126.58 gain 170 60 -123.49 gain 60 171 -121.28 gain 171 60 -123.21 gain 60 172 -122.99 gain 172 60 -119.63 gain 60 173 -130.68 gain 173 60 -126.75 gain 60 174 -120.34 gain 174 60 -120.70 gain 60 175 -130.87 gain 175 60 -134.79 gain 60 176 -124.70 gain 176 60 -120.63 gain 60 177 -118.99 gain 177 60 -122.73 gain 60 178 -131.97 gain 178 60 -131.54 gain 60 179 -129.60 gain 179 60 -127.56 gain 60 180 -123.23 gain 180 60 -122.66 gain 60 181 -120.31 gain 181 60 -119.81 gain 60 182 -120.06 gain 182 60 -121.95 gain 60 183 -128.89 gain 183 60 -124.16 gain 60 184 -123.56 gain 184 60 -123.61 gain 60 185 -123.16 gain 185 60 -120.70 gain 60 186 -115.83 gain 186 60 -113.65 gain 60 187 -124.38 gain 187 60 -124.75 gain 60 188 -129.83 gain 188 60 -133.45 gain 60 189 -126.42 gain 189 60 -127.56 gain 60 190 -129.98 gain 190 60 -128.13 gain 60 191 -123.87 gain 191 60 -123.12 gain 60 192 -129.81 gain 192 60 -131.92 gain 60 193 -116.07 gain 193 60 -119.43 gain 60 194 -123.96 gain 194 60 -121.13 gain 60 195 -120.13 gain 195 60 -117.94 gain 60 196 -125.85 gain 196 60 -127.70 gain 60 197 -121.38 gain 197 60 -119.29 gain 60 198 -119.07 gain 198 60 -116.50 gain 60 199 -123.11 gain 199 60 -124.45 gain 60 200 -129.32 gain 200 60 -127.60 gain 60 201 -123.57 gain 201 60 -122.65 gain 60 202 -128.56 gain 202 60 -131.64 gain 60 203 -129.50 gain 203 60 -132.21 gain 60 204 -125.45 gain 204 60 -125.45 gain 60 205 -123.85 gain 205 60 -122.91 gain 60 206 -122.22 gain 206 60 -125.81 gain 60 207 -129.84 gain 207 60 -125.79 gain 60 208 -126.26 gain 208 60 -127.98 gain 60 209 -129.42 gain 209 60 -132.14 gain 60 210 -123.82 gain 210 60 -123.47 gain 60 211 -124.85 gain 211 60 -126.52 gain 60 212 -131.55 gain 212 60 -131.77 gain 60 213 -123.23 gain 213 60 -122.64 gain 60 214 -121.30 gain 214 60 -120.60 gain 60 215 -125.52 gain 215 60 -121.24 gain 60 216 -127.52 gain 216 60 -127.89 gain 60 217 -123.95 gain 217 60 -124.84 gain 60 218 -125.54 gain 218 60 -128.63 gain 60 219 -124.99 gain 219 60 -119.43 gain 60 220 -133.79 gain 220 60 -138.72 gain 60 221 -130.67 gain 221 60 -131.25 gain 60 222 -125.75 gain 222 60 -126.66 gain 60 223 -133.87 gain 223 60 -133.38 gain 60 224 -129.08 gain 224 60 -131.29 gain 61 62 -87.73 gain 62 61 -92.95 gain 61 63 -99.74 gain 63 61 -98.19 gain 61 64 -103.01 gain 64 61 -104.43 gain 61 65 -105.99 gain 65 61 -109.49 gain 61 66 -116.28 gain 66 61 -114.04 gain 61 67 -120.80 gain 67 61 -120.84 gain 61 68 -123.22 gain 68 61 -127.81 gain 61 69 -121.61 gain 69 61 -123.50 gain 61 70 -129.36 gain 70 61 -131.00 gain 61 71 -123.43 gain 71 61 -123.18 gain 61 72 -127.29 gain 72 61 -127.46 gain 61 73 -125.83 gain 73 61 -124.39 gain 61 74 -127.34 gain 74 61 -129.77 gain 61 75 -97.63 gain 75 61 -100.20 gain 61 76 -90.02 gain 76 61 -88.55 gain 61 77 -96.15 gain 77 61 -98.34 gain 61 78 -102.32 gain 78 61 -107.37 gain 61 79 -107.74 gain 79 61 -107.56 gain 61 80 -112.17 gain 80 61 -112.49 gain 61 81 -116.46 gain 81 61 -117.37 gain 61 82 -114.27 gain 82 61 -112.81 gain 61 83 -116.43 gain 83 61 -116.01 gain 61 84 -119.04 gain 84 61 -118.76 gain 61 85 -120.91 gain 85 61 -117.44 gain 61 86 -128.21 gain 86 61 -128.12 gain 61 87 -123.84 gain 87 61 -127.71 gain 61 88 -129.44 gain 88 61 -131.07 gain 61 89 -123.52 gain 89 61 -123.74 gain 61 90 -100.77 gain 90 61 -98.00 gain 61 91 -103.52 gain 91 61 -104.70 gain 61 92 -104.96 gain 92 61 -103.10 gain 61 93 -99.92 gain 93 61 -102.85 gain 61 94 -107.49 gain 94 61 -110.29 gain 61 95 -113.83 gain 95 61 -118.89 gain 61 96 -111.98 gain 96 61 -114.38 gain 61 97 -115.28 gain 97 61 -116.41 gain 61 98 -124.09 gain 98 61 -126.03 gain 61 99 -120.86 gain 99 61 -120.61 gain 61 100 -124.83 gain 100 61 -124.15 gain 61 101 -120.41 gain 101 61 -119.89 gain 61 102 -119.08 gain 102 61 -119.34 gain 61 103 -125.67 gain 103 61 -123.42 gain 61 104 -128.45 gain 104 61 -131.58 gain 61 105 -118.23 gain 105 61 -117.30 gain 61 106 -100.06 gain 106 61 -100.21 gain 61 107 -111.63 gain 107 61 -118.34 gain 61 108 -106.81 gain 108 61 -105.84 gain 61 109 -104.02 gain 109 61 -106.54 gain 61 110 -116.35 gain 110 61 -117.34 gain 61 111 -113.07 gain 111 61 -113.75 gain 61 112 -114.70 gain 112 61 -114.26 gain 61 113 -126.50 gain 113 61 -124.86 gain 61 114 -114.63 gain 114 61 -116.29 gain 61 115 -117.62 gain 115 61 -113.59 gain 61 116 -122.17 gain 116 61 -125.67 gain 61 117 -120.63 gain 117 61 -125.64 gain 61 118 -123.83 gain 118 61 -127.16 gain 61 119 -129.24 gain 119 61 -127.23 gain 61 120 -110.08 gain 120 61 -112.58 gain 61 121 -105.20 gain 121 61 -107.00 gain 61 122 -110.67 gain 122 61 -114.58 gain 61 123 -118.75 gain 123 61 -123.44 gain 61 124 -114.60 gain 124 61 -115.70 gain 61 125 -108.27 gain 125 61 -110.70 gain 61 126 -123.06 gain 126 61 -123.45 gain 61 127 -116.98 gain 127 61 -120.83 gain 61 128 -120.90 gain 128 61 -122.68 gain 61 129 -124.23 gain 129 61 -123.92 gain 61 130 -115.35 gain 130 61 -112.87 gain 61 131 -121.03 gain 131 61 -125.63 gain 61 132 -123.80 gain 132 61 -128.03 gain 61 133 -130.53 gain 133 61 -132.84 gain 61 134 -129.59 gain 134 61 -128.59 gain 61 135 -112.62 gain 135 61 -115.20 gain 61 136 -111.94 gain 136 61 -115.12 gain 61 137 -121.39 gain 137 61 -122.06 gain 61 138 -106.55 gain 138 61 -106.22 gain 61 139 -116.80 gain 139 61 -117.45 gain 61 140 -116.83 gain 140 61 -120.09 gain 61 141 -123.37 gain 141 61 -125.30 gain 61 142 -117.93 gain 142 61 -119.16 gain 61 143 -126.64 gain 143 61 -127.49 gain 61 144 -116.42 gain 144 61 -118.29 gain 61 145 -120.69 gain 145 61 -121.01 gain 61 146 -122.35 gain 146 61 -121.58 gain 61 147 -125.41 gain 147 61 -121.73 gain 61 148 -123.40 gain 148 61 -119.44 gain 61 149 -129.13 gain 149 61 -128.33 gain 61 150 -116.04 gain 150 61 -117.93 gain 61 151 -118.21 gain 151 61 -120.29 gain 61 152 -115.41 gain 152 61 -114.48 gain 61 153 -116.95 gain 153 61 -113.59 gain 61 154 -118.44 gain 154 61 -123.63 gain 61 155 -115.68 gain 155 61 -120.76 gain 61 156 -121.27 gain 156 61 -120.75 gain 61 157 -116.76 gain 157 61 -119.18 gain 61 158 -122.54 gain 158 61 -127.56 gain 61 159 -125.70 gain 159 61 -127.33 gain 61 160 -122.35 gain 160 61 -121.09 gain 61 161 -125.61 gain 161 61 -127.84 gain 61 162 -123.22 gain 162 61 -124.32 gain 61 163 -131.95 gain 163 61 -135.19 gain 61 164 -121.97 gain 164 61 -126.26 gain 61 165 -124.40 gain 165 61 -124.73 gain 61 166 -123.92 gain 166 61 -125.82 gain 61 167 -128.70 gain 167 61 -132.69 gain 61 168 -113.26 gain 168 61 -115.70 gain 61 169 -118.27 gain 169 61 -124.91 gain 61 170 -116.02 gain 170 61 -114.18 gain 61 171 -120.21 gain 171 61 -123.40 gain 61 172 -122.49 gain 172 61 -120.37 gain 61 173 -119.10 gain 173 61 -116.42 gain 61 174 -116.19 gain 174 61 -117.81 gain 61 175 -122.78 gain 175 61 -127.95 gain 61 176 -122.70 gain 176 61 -119.88 gain 61 177 -127.17 gain 177 61 -132.16 gain 61 178 -125.00 gain 178 61 -125.82 gain 61 179 -128.38 gain 179 61 -127.59 gain 61 180 -114.16 gain 180 61 -114.84 gain 61 181 -119.77 gain 181 61 -120.52 gain 61 182 -123.76 gain 182 61 -126.89 gain 61 183 -117.22 gain 183 61 -113.74 gain 61 184 -125.33 gain 184 61 -126.63 gain 61 185 -115.03 gain 185 61 -113.82 gain 61 186 -128.40 gain 186 61 -127.47 gain 61 187 -122.73 gain 187 61 -124.35 gain 61 188 -124.89 gain 188 61 -129.76 gain 61 189 -127.26 gain 189 61 -129.65 gain 61 190 -131.09 gain 190 61 -130.49 gain 61 191 -122.74 gain 191 61 -123.23 gain 61 192 -127.03 gain 192 61 -130.39 gain 61 193 -128.11 gain 193 61 -132.72 gain 61 194 -122.93 gain 194 61 -121.35 gain 61 195 -125.62 gain 195 61 -124.67 gain 61 196 -116.83 gain 196 61 -119.93 gain 61 197 -124.27 gain 197 61 -123.43 gain 61 198 -122.33 gain 198 61 -121.00 gain 61 199 -121.19 gain 199 61 -123.79 gain 61 200 -127.03 gain 200 61 -126.56 gain 61 201 -120.98 gain 201 61 -121.31 gain 61 202 -116.37 gain 202 61 -120.71 gain 61 203 -135.54 gain 203 61 -139.50 gain 61 204 -123.57 gain 204 61 -124.82 gain 61 205 -124.55 gain 205 61 -124.86 gain 61 206 -125.05 gain 206 61 -129.89 gain 61 207 -125.72 gain 207 61 -122.92 gain 61 208 -136.95 gain 208 61 -139.93 gain 61 209 -128.92 gain 209 61 -132.89 gain 61 210 -124.91 gain 210 61 -125.82 gain 61 211 -122.03 gain 211 61 -124.96 gain 61 212 -117.04 gain 212 61 -118.50 gain 61 213 -128.30 gain 213 61 -128.96 gain 61 214 -122.04 gain 214 61 -122.59 gain 61 215 -131.89 gain 215 61 -128.86 gain 61 216 -119.07 gain 216 61 -120.70 gain 61 217 -127.11 gain 217 61 -129.25 gain 61 218 -128.28 gain 218 61 -132.61 gain 61 219 -125.48 gain 219 61 -121.17 gain 61 220 -129.19 gain 220 61 -135.37 gain 61 221 -131.22 gain 221 61 -133.05 gain 61 222 -128.50 gain 222 61 -130.65 gain 61 223 -125.32 gain 223 61 -126.09 gain 61 224 -131.58 gain 224 61 -135.03 gain 62 63 -102.82 gain 63 62 -96.04 gain 62 64 -105.52 gain 64 62 -101.72 gain 62 65 -109.53 gain 65 62 -107.82 gain 62 66 -111.73 gain 66 62 -104.27 gain 62 67 -115.35 gain 67 62 -110.17 gain 62 68 -120.63 gain 68 62 -120.00 gain 62 69 -115.62 gain 69 62 -112.29 gain 62 70 -122.81 gain 70 62 -119.24 gain 62 71 -132.76 gain 71 62 -127.30 gain 62 72 -133.77 gain 72 62 -128.72 gain 62 73 -136.64 gain 73 62 -129.98 gain 62 74 -134.51 gain 74 62 -131.73 gain 62 75 -113.49 gain 75 62 -110.85 gain 62 76 -99.01 gain 76 62 -92.32 gain 62 77 -96.13 gain 77 62 -93.10 gain 62 78 -101.99 gain 78 62 -101.82 gain 62 79 -109.66 gain 79 62 -104.26 gain 62 80 -109.04 gain 80 62 -104.14 gain 62 81 -101.62 gain 81 62 -97.32 gain 62 82 -120.67 gain 82 62 -113.99 gain 62 83 -127.32 gain 83 62 -121.68 gain 62 84 -117.59 gain 84 62 -112.09 gain 62 85 -127.41 gain 85 62 -118.72 gain 62 86 -119.12 gain 86 62 -113.81 gain 62 87 -132.87 gain 87 62 -131.53 gain 62 88 -126.61 gain 88 62 -123.02 gain 62 89 -131.03 gain 89 62 -126.04 gain 62 90 -118.36 gain 90 62 -110.37 gain 62 91 -111.24 gain 91 62 -107.20 gain 62 92 -104.42 gain 92 62 -97.34 gain 62 93 -107.48 gain 93 62 -105.19 gain 62 94 -108.36 gain 94 62 -105.94 gain 62 95 -119.11 gain 95 62 -118.95 gain 62 96 -115.15 gain 96 62 -112.32 gain 62 97 -117.53 gain 97 62 -113.44 gain 62 98 -124.15 gain 98 62 -120.86 gain 62 99 -127.82 gain 99 62 -122.36 gain 62 100 -128.98 gain 100 62 -123.08 gain 62 101 -121.02 gain 101 62 -115.28 gain 62 102 -125.97 gain 102 62 -121.02 gain 62 103 -130.26 gain 103 62 -122.79 gain 62 104 -136.02 gain 104 62 -133.92 gain 62 105 -121.02 gain 105 62 -114.87 gain 62 106 -110.59 gain 106 62 -105.52 gain 62 107 -112.99 gain 107 62 -114.49 gain 62 108 -110.85 gain 108 62 -104.66 gain 62 109 -114.37 gain 109 62 -111.68 gain 62 110 -118.74 gain 110 62 -114.52 gain 62 111 -129.34 gain 111 62 -124.79 gain 62 112 -121.12 gain 112 62 -115.46 gain 62 113 -125.55 gain 113 62 -118.69 gain 62 114 -122.53 gain 114 62 -118.98 gain 62 115 -125.10 gain 115 62 -115.84 gain 62 116 -122.92 gain 116 62 -121.21 gain 62 117 -126.46 gain 117 62 -126.25 gain 62 118 -125.55 gain 118 62 -123.66 gain 62 119 -133.47 gain 119 62 -126.24 gain 62 120 -117.71 gain 120 62 -115.00 gain 62 121 -123.25 gain 121 62 -119.82 gain 62 122 -114.64 gain 122 62 -113.33 gain 62 123 -114.93 gain 123 62 -114.40 gain 62 124 -115.24 gain 124 62 -111.12 gain 62 125 -116.21 gain 125 62 -113.42 gain 62 126 -117.93 gain 126 62 -113.10 gain 62 127 -115.07 gain 127 62 -113.70 gain 62 128 -125.18 gain 128 62 -121.75 gain 62 129 -120.12 gain 129 62 -114.60 gain 62 130 -131.62 gain 130 62 -123.92 gain 62 131 -135.07 gain 131 62 -134.46 gain 62 132 -130.47 gain 132 62 -129.49 gain 62 133 -131.78 gain 133 62 -128.86 gain 62 134 -126.77 gain 134 62 -120.56 gain 62 135 -115.51 gain 135 62 -112.87 gain 62 136 -118.81 gain 136 62 -116.77 gain 62 137 -116.26 gain 137 62 -111.70 gain 62 138 -120.66 gain 138 62 -115.10 gain 62 139 -123.95 gain 139 62 -119.38 gain 62 140 -120.94 gain 140 62 -118.98 gain 62 141 -125.97 gain 141 62 -122.68 gain 62 142 -118.87 gain 142 62 -114.89 gain 62 143 -124.83 gain 143 62 -120.47 gain 62 144 -126.81 gain 144 62 -123.46 gain 62 145 -123.98 gain 145 62 -119.08 gain 62 146 -128.20 gain 146 62 -122.21 gain 62 147 -127.71 gain 147 62 -118.81 gain 62 148 -123.13 gain 148 62 -113.95 gain 62 149 -138.20 gain 149 62 -132.19 gain 62 150 -121.37 gain 150 62 -118.05 gain 62 151 -120.33 gain 151 62 -117.20 gain 62 152 -126.92 gain 152 62 -120.77 gain 62 153 -127.78 gain 153 62 -119.20 gain 62 154 -118.51 gain 154 62 -118.48 gain 62 155 -120.76 gain 155 62 -120.63 gain 62 156 -117.01 gain 156 62 -111.27 gain 62 157 -126.48 gain 157 62 -123.68 gain 62 158 -132.63 gain 158 62 -132.42 gain 62 159 -118.65 gain 159 62 -115.06 gain 62 160 -131.06 gain 160 62 -124.58 gain 62 161 -136.41 gain 161 62 -133.42 gain 62 162 -129.67 gain 162 62 -125.55 gain 62 163 -132.65 gain 163 62 -130.68 gain 62 164 -126.04 gain 164 62 -125.11 gain 62 165 -126.63 gain 165 62 -121.74 gain 62 166 -126.46 gain 166 62 -123.14 gain 62 167 -119.09 gain 167 62 -117.86 gain 62 168 -124.81 gain 168 62 -122.03 gain 62 169 -126.02 gain 169 62 -127.43 gain 62 170 -118.76 gain 170 62 -111.71 gain 62 171 -130.93 gain 171 62 -128.90 gain 62 172 -129.04 gain 172 62 -121.71 gain 62 173 -126.05 gain 173 62 -118.15 gain 62 174 -121.63 gain 174 62 -118.03 gain 62 175 -125.01 gain 175 62 -124.97 gain 62 176 -127.46 gain 176 62 -119.43 gain 62 177 -134.84 gain 177 62 -134.61 gain 62 178 -132.80 gain 178 62 -128.40 gain 62 179 -138.67 gain 179 62 -132.67 gain 62 180 -127.16 gain 180 62 -122.62 gain 62 181 -125.80 gain 181 62 -121.32 gain 62 182 -126.39 gain 182 62 -124.30 gain 62 183 -126.68 gain 183 62 -117.99 gain 62 184 -119.45 gain 184 62 -115.54 gain 62 185 -125.94 gain 185 62 -119.51 gain 62 186 -131.22 gain 186 62 -125.08 gain 62 187 -128.12 gain 187 62 -124.52 gain 62 188 -129.98 gain 188 62 -129.63 gain 62 189 -128.94 gain 189 62 -126.11 gain 62 190 -128.13 gain 190 62 -122.31 gain 62 191 -126.53 gain 191 62 -121.80 gain 62 192 -135.26 gain 192 62 -133.40 gain 62 193 -132.21 gain 193 62 -131.60 gain 62 194 -131.74 gain 194 62 -124.94 gain 62 195 -124.50 gain 195 62 -118.33 gain 62 196 -118.45 gain 196 62 -116.33 gain 62 197 -123.63 gain 197 62 -117.57 gain 62 198 -129.06 gain 198 62 -122.52 gain 62 199 -129.49 gain 199 62 -126.86 gain 62 200 -125.20 gain 200 62 -119.52 gain 62 201 -125.17 gain 201 62 -120.28 gain 62 202 -126.00 gain 202 62 -125.12 gain 62 203 -129.22 gain 203 62 -127.96 gain 62 204 -127.19 gain 204 62 -123.22 gain 62 205 -131.91 gain 205 62 -127.00 gain 62 206 -126.64 gain 206 62 -126.26 gain 62 207 -130.63 gain 207 62 -122.61 gain 62 208 -132.97 gain 208 62 -130.72 gain 62 209 -131.45 gain 209 62 -130.20 gain 62 210 -124.86 gain 210 62 -120.55 gain 62 211 -122.71 gain 211 62 -120.42 gain 62 212 -129.43 gain 212 62 -125.68 gain 62 213 -131.09 gain 213 62 -126.54 gain 62 214 -129.13 gain 214 62 -124.46 gain 62 215 -136.30 gain 215 62 -128.05 gain 62 216 -127.76 gain 216 62 -124.17 gain 62 217 -133.79 gain 217 62 -130.72 gain 62 218 -128.66 gain 218 62 -127.77 gain 62 219 -134.21 gain 219 62 -124.68 gain 62 220 -127.70 gain 220 62 -128.66 gain 62 221 -128.75 gain 221 62 -125.35 gain 62 222 -131.01 gain 222 62 -127.94 gain 62 223 -133.52 gain 223 62 -129.07 gain 62 224 -130.50 gain 224 62 -128.73 gain 63 64 -99.63 gain 64 63 -102.61 gain 63 65 -97.99 gain 65 63 -103.05 gain 63 66 -100.22 gain 66 63 -99.53 gain 63 67 -110.16 gain 67 63 -111.75 gain 63 68 -115.29 gain 68 63 -121.44 gain 63 69 -112.94 gain 69 63 -116.38 gain 63 70 -114.72 gain 70 63 -117.92 gain 63 71 -118.30 gain 71 63 -119.60 gain 63 72 -117.89 gain 72 63 -119.61 gain 63 73 -117.79 gain 73 63 -117.90 gain 63 74 -119.73 gain 74 63 -123.72 gain 63 75 -101.22 gain 75 63 -105.35 gain 63 76 -96.19 gain 76 63 -96.27 gain 63 77 -91.00 gain 77 63 -94.75 gain 63 78 -94.70 gain 78 63 -101.30 gain 63 79 -99.47 gain 79 63 -100.85 gain 63 80 -103.07 gain 80 63 -104.95 gain 63 81 -107.05 gain 81 63 -109.52 gain 63 82 -102.40 gain 82 63 -102.50 gain 63 83 -115.68 gain 83 63 -116.81 gain 63 84 -103.13 gain 84 63 -104.41 gain 63 85 -115.28 gain 85 63 -113.36 gain 63 86 -119.82 gain 86 63 -121.28 gain 63 87 -124.56 gain 87 63 -129.99 gain 63 88 -126.17 gain 88 63 -129.35 gain 63 89 -121.99 gain 89 63 -123.77 gain 63 90 -111.11 gain 90 63 -109.90 gain 63 91 -100.91 gain 91 63 -103.64 gain 63 92 -100.56 gain 92 63 -100.25 gain 63 93 -98.39 gain 93 63 -102.87 gain 63 94 -97.77 gain 94 63 -102.13 gain 63 95 -98.45 gain 95 63 -105.06 gain 63 96 -105.17 gain 96 63 -109.11 gain 63 97 -110.31 gain 97 63 -113.00 gain 63 98 -114.69 gain 98 63 -118.18 gain 63 99 -113.24 gain 99 63 -114.55 gain 63 100 -118.48 gain 100 63 -119.35 gain 63 101 -122.49 gain 101 63 -123.53 gain 63 102 -114.16 gain 102 63 -115.98 gain 63 103 -120.88 gain 103 63 -120.19 gain 63 104 -126.90 gain 104 63 -131.58 gain 63 105 -113.21 gain 105 63 -113.83 gain 63 106 -106.15 gain 106 63 -107.86 gain 63 107 -101.23 gain 107 63 -109.50 gain 63 108 -106.03 gain 108 63 -106.62 gain 63 109 -101.72 gain 109 63 -105.80 gain 63 110 -105.63 gain 110 63 -108.18 gain 63 111 -107.94 gain 111 63 -110.17 gain 63 112 -108.63 gain 112 63 -109.74 gain 63 113 -104.61 gain 113 63 -104.53 gain 63 114 -112.46 gain 114 63 -115.67 gain 63 115 -117.45 gain 115 63 -114.97 gain 63 116 -114.65 gain 116 63 -119.72 gain 63 117 -128.41 gain 117 63 -134.97 gain 63 118 -121.38 gain 118 63 -126.27 gain 63 119 -128.62 gain 119 63 -128.16 gain 63 120 -111.00 gain 120 63 -115.06 gain 63 121 -109.52 gain 121 63 -112.87 gain 63 122 -111.57 gain 122 63 -117.03 gain 63 123 -109.11 gain 123 63 -115.35 gain 63 124 -107.27 gain 124 63 -109.92 gain 63 125 -106.74 gain 125 63 -110.72 gain 63 126 -108.15 gain 126 63 -110.09 gain 63 127 -111.64 gain 127 63 -117.04 gain 63 128 -116.86 gain 128 63 -120.20 gain 63 129 -117.02 gain 129 63 -118.27 gain 63 130 -118.71 gain 130 63 -117.79 gain 63 131 -120.13 gain 131 63 -126.29 gain 63 132 -130.26 gain 132 63 -136.05 gain 63 133 -118.09 gain 133 63 -121.95 gain 63 134 -118.28 gain 134 63 -118.84 gain 63 135 -114.51 gain 135 63 -118.64 gain 63 136 -113.61 gain 136 63 -118.35 gain 63 137 -107.40 gain 137 63 -109.62 gain 63 138 -111.13 gain 138 63 -112.36 gain 63 139 -109.61 gain 139 63 -111.82 gain 63 140 -111.32 gain 140 63 -116.14 gain 63 141 -116.24 gain 141 63 -119.72 gain 63 142 -110.61 gain 142 63 -113.40 gain 63 143 -120.93 gain 143 63 -123.34 gain 63 144 -117.27 gain 144 63 -120.70 gain 63 145 -124.02 gain 145 63 -125.89 gain 63 146 -123.12 gain 146 63 -123.90 gain 63 147 -124.60 gain 147 63 -122.47 gain 63 148 -120.01 gain 148 63 -117.60 gain 63 149 -126.06 gain 149 63 -126.82 gain 63 150 -113.89 gain 150 63 -117.33 gain 63 151 -112.03 gain 151 63 -115.67 gain 63 152 -113.69 gain 152 63 -114.31 gain 63 153 -117.56 gain 153 63 -115.76 gain 63 154 -120.53 gain 154 63 -127.28 gain 63 155 -119.20 gain 155 63 -125.84 gain 63 156 -116.45 gain 156 63 -117.48 gain 63 157 -116.90 gain 157 63 -120.88 gain 63 158 -119.03 gain 158 63 -125.60 gain 63 159 -121.96 gain 159 63 -125.14 gain 63 160 -116.98 gain 160 63 -117.28 gain 63 161 -122.14 gain 161 63 -125.93 gain 63 162 -117.54 gain 162 63 -120.20 gain 63 163 -129.81 gain 163 63 -134.62 gain 63 164 -129.34 gain 164 63 -135.19 gain 63 165 -121.14 gain 165 63 -123.03 gain 63 166 -117.30 gain 166 63 -120.75 gain 63 167 -121.27 gain 167 63 -126.81 gain 63 168 -115.15 gain 168 63 -119.14 gain 63 169 -115.18 gain 169 63 -123.37 gain 63 170 -116.36 gain 170 63 -116.08 gain 63 171 -116.52 gain 171 63 -121.27 gain 63 172 -118.39 gain 172 63 -117.83 gain 63 173 -120.96 gain 173 63 -119.84 gain 63 174 -122.24 gain 174 63 -125.41 gain 63 175 -122.29 gain 175 63 -129.01 gain 63 176 -123.17 gain 176 63 -121.91 gain 63 177 -127.01 gain 177 63 -133.56 gain 63 178 -126.69 gain 178 63 -129.06 gain 63 179 -115.65 gain 179 63 -116.41 gain 63 180 -112.64 gain 180 63 -114.87 gain 63 181 -118.75 gain 181 63 -121.05 gain 63 182 -116.98 gain 182 63 -121.66 gain 63 183 -111.50 gain 183 63 -109.57 gain 63 184 -113.75 gain 184 63 -116.61 gain 63 185 -118.80 gain 185 63 -119.14 gain 63 186 -120.50 gain 186 63 -121.13 gain 63 187 -117.20 gain 187 63 -120.37 gain 63 188 -124.12 gain 188 63 -130.55 gain 63 189 -124.54 gain 189 63 -128.48 gain 63 190 -116.52 gain 190 63 -117.48 gain 63 191 -117.26 gain 191 63 -119.30 gain 63 192 -125.26 gain 192 63 -130.18 gain 63 193 -126.00 gain 193 63 -132.16 gain 63 194 -130.04 gain 194 63 -130.01 gain 63 195 -121.45 gain 195 63 -122.05 gain 63 196 -119.64 gain 196 63 -124.29 gain 63 197 -115.72 gain 197 63 -116.43 gain 63 198 -122.17 gain 198 63 -122.41 gain 63 199 -111.41 gain 199 63 -115.56 gain 63 200 -120.85 gain 200 63 -121.94 gain 63 201 -116.12 gain 201 63 -118.01 gain 63 202 -127.15 gain 202 63 -133.04 gain 63 203 -124.82 gain 203 63 -130.34 gain 63 204 -117.56 gain 204 63 -120.36 gain 63 205 -121.50 gain 205 63 -123.37 gain 63 206 -123.38 gain 206 63 -129.78 gain 63 207 -122.55 gain 207 63 -121.30 gain 63 208 -126.43 gain 208 63 -130.96 gain 63 209 -124.43 gain 209 63 -129.95 gain 63 210 -121.17 gain 210 63 -123.63 gain 63 211 -122.74 gain 211 63 -127.22 gain 63 212 -119.29 gain 212 63 -122.31 gain 63 213 -122.29 gain 213 63 -124.50 gain 63 214 -121.33 gain 214 63 -123.44 gain 63 215 -122.90 gain 215 63 -121.42 gain 63 216 -119.19 gain 216 63 -122.37 gain 63 217 -116.18 gain 217 63 -119.88 gain 63 218 -125.23 gain 218 63 -131.12 gain 63 219 -118.08 gain 219 63 -115.33 gain 63 220 -121.19 gain 220 63 -128.93 gain 63 221 -123.36 gain 221 63 -126.74 gain 63 222 -125.61 gain 222 63 -129.31 gain 63 223 -117.95 gain 223 63 -120.27 gain 63 224 -125.44 gain 224 63 -130.44 gain 64 65 -86.53 gain 65 64 -88.62 gain 64 66 -106.10 gain 66 64 -102.44 gain 64 67 -104.04 gain 67 64 -102.65 gain 64 68 -115.04 gain 68 64 -118.22 gain 64 69 -113.76 gain 69 64 -114.23 gain 64 70 -112.79 gain 70 64 -113.01 gain 64 71 -120.98 gain 71 64 -119.32 gain 64 72 -118.95 gain 72 64 -117.69 gain 64 73 -120.59 gain 73 64 -117.73 gain 64 74 -120.46 gain 74 64 -121.47 gain 64 75 -116.27 gain 75 64 -117.42 gain 64 76 -103.60 gain 76 64 -100.70 gain 64 77 -113.72 gain 77 64 -114.49 gain 64 78 -102.40 gain 78 64 -106.02 gain 64 79 -97.36 gain 79 64 -95.77 gain 64 80 -100.19 gain 80 64 -99.10 gain 64 81 -96.29 gain 81 64 -95.79 gain 64 82 -108.16 gain 82 64 -105.28 gain 64 83 -112.60 gain 83 64 -110.76 gain 64 84 -118.98 gain 84 64 -117.28 gain 64 85 -118.34 gain 85 64 -113.45 gain 64 86 -114.56 gain 86 64 -113.06 gain 64 87 -125.76 gain 87 64 -128.21 gain 64 88 -124.98 gain 88 64 -125.18 gain 64 89 -122.59 gain 89 64 -121.40 gain 64 90 -117.01 gain 90 64 -112.82 gain 64 91 -107.37 gain 91 64 -107.13 gain 64 92 -103.38 gain 92 64 -100.10 gain 64 93 -106.65 gain 93 64 -108.16 gain 64 94 -104.99 gain 94 64 -106.38 gain 64 95 -99.56 gain 95 64 -103.20 gain 64 96 -104.87 gain 96 64 -105.84 gain 64 97 -107.30 gain 97 64 -107.02 gain 64 98 -110.76 gain 98 64 -111.28 gain 64 99 -117.21 gain 99 64 -115.55 gain 64 100 -124.41 gain 100 64 -122.31 gain 64 101 -124.96 gain 101 64 -123.03 gain 64 102 -115.99 gain 102 64 -114.83 gain 64 103 -123.41 gain 103 64 -119.75 gain 64 104 -127.91 gain 104 64 -129.62 gain 64 105 -113.80 gain 105 64 -111.45 gain 64 106 -111.97 gain 106 64 -110.70 gain 64 107 -111.79 gain 107 64 -117.09 gain 64 108 -111.84 gain 108 64 -109.46 gain 64 109 -102.28 gain 109 64 -103.39 gain 64 110 -102.30 gain 110 64 -101.87 gain 64 111 -102.99 gain 111 64 -102.25 gain 64 112 -114.42 gain 112 64 -112.56 gain 64 113 -114.20 gain 113 64 -111.14 gain 64 114 -114.84 gain 114 64 -115.08 gain 64 115 -117.51 gain 115 64 -112.05 gain 64 116 -116.80 gain 116 64 -118.89 gain 64 117 -127.60 gain 117 64 -131.19 gain 64 118 -122.08 gain 118 64 -123.99 gain 64 119 -126.06 gain 119 64 -122.63 gain 64 120 -114.58 gain 120 64 -115.66 gain 64 121 -112.71 gain 121 64 -113.09 gain 64 122 -116.43 gain 122 64 -118.92 gain 64 123 -108.45 gain 123 64 -111.72 gain 64 124 -113.66 gain 124 64 -113.33 gain 64 125 -119.90 gain 125 64 -120.91 gain 64 126 -113.05 gain 126 64 -112.02 gain 64 127 -120.89 gain 127 64 -123.32 gain 64 128 -113.05 gain 128 64 -113.42 gain 64 129 -124.74 gain 129 64 -123.02 gain 64 130 -125.18 gain 130 64 -121.28 gain 64 131 -121.55 gain 131 64 -124.74 gain 64 132 -123.35 gain 132 64 -126.16 gain 64 133 -127.57 gain 133 64 -128.45 gain 64 134 -121.80 gain 134 64 -119.39 gain 64 135 -113.09 gain 135 64 -114.24 gain 64 136 -121.47 gain 136 64 -123.24 gain 64 137 -108.88 gain 137 64 -108.13 gain 64 138 -107.55 gain 138 64 -105.80 gain 64 139 -115.50 gain 139 64 -114.74 gain 64 140 -112.85 gain 140 64 -114.69 gain 64 141 -111.22 gain 141 64 -111.73 gain 64 142 -115.28 gain 142 64 -115.10 gain 64 143 -121.82 gain 143 64 -121.26 gain 64 144 -121.03 gain 144 64 -121.48 gain 64 145 -119.65 gain 145 64 -118.56 gain 64 146 -120.00 gain 146 64 -117.81 gain 64 147 -125.36 gain 147 64 -120.27 gain 64 148 -123.34 gain 148 64 -117.96 gain 64 149 -121.14 gain 149 64 -118.93 gain 64 150 -118.37 gain 150 64 -118.84 gain 64 151 -112.41 gain 151 64 -113.08 gain 64 152 -122.94 gain 152 64 -120.59 gain 64 153 -115.00 gain 153 64 -110.22 gain 64 154 -111.56 gain 154 64 -115.33 gain 64 155 -114.23 gain 155 64 -117.89 gain 64 156 -121.60 gain 156 64 -119.66 gain 64 157 -123.74 gain 157 64 -124.74 gain 64 158 -115.66 gain 158 64 -119.26 gain 64 159 -125.50 gain 159 64 -125.72 gain 64 160 -125.99 gain 160 64 -123.32 gain 64 161 -124.17 gain 161 64 -124.98 gain 64 162 -120.21 gain 162 64 -119.89 gain 64 163 -122.75 gain 163 64 -124.58 gain 64 164 -126.47 gain 164 64 -129.34 gain 64 165 -127.62 gain 165 64 -126.53 gain 64 166 -116.69 gain 166 64 -117.17 gain 64 167 -119.61 gain 167 64 -122.18 gain 64 168 -116.21 gain 168 64 -117.23 gain 64 169 -115.92 gain 169 64 -121.14 gain 64 170 -120.55 gain 170 64 -117.30 gain 64 171 -121.66 gain 171 64 -123.43 gain 64 172 -120.06 gain 172 64 -116.52 gain 64 173 -124.26 gain 173 64 -120.16 gain 64 174 -119.56 gain 174 64 -119.76 gain 64 175 -118.77 gain 175 64 -122.52 gain 64 176 -129.24 gain 176 64 -125.01 gain 64 177 -132.33 gain 177 64 -135.91 gain 64 178 -127.22 gain 178 64 -126.62 gain 64 179 -132.25 gain 179 64 -130.04 gain 64 180 -125.07 gain 180 64 -124.34 gain 64 181 -128.36 gain 181 64 -127.69 gain 64 182 -117.28 gain 182 64 -118.99 gain 64 183 -125.47 gain 183 64 -120.58 gain 64 184 -121.35 gain 184 64 -121.24 gain 64 185 -118.72 gain 185 64 -116.09 gain 64 186 -123.61 gain 186 64 -121.26 gain 64 187 -118.12 gain 187 64 -118.31 gain 64 188 -119.60 gain 188 64 -123.06 gain 64 189 -119.52 gain 189 64 -120.49 gain 64 190 -125.11 gain 190 64 -123.09 gain 64 191 -130.70 gain 191 64 -129.78 gain 64 192 -126.27 gain 192 64 -128.21 gain 64 193 -130.92 gain 193 64 -134.11 gain 64 194 -122.31 gain 194 64 -119.31 gain 64 195 -126.32 gain 195 64 -123.95 gain 64 196 -116.22 gain 196 64 -117.89 gain 64 197 -118.28 gain 197 64 -116.01 gain 64 198 -123.35 gain 198 64 -120.61 gain 64 199 -121.54 gain 199 64 -122.71 gain 64 200 -125.43 gain 200 64 -123.54 gain 64 201 -123.08 gain 201 64 -122.00 gain 64 202 -129.11 gain 202 64 -132.03 gain 64 203 -132.36 gain 203 64 -134.90 gain 64 204 -123.88 gain 204 64 -123.71 gain 64 205 -127.72 gain 205 64 -126.62 gain 64 206 -123.11 gain 206 64 -126.53 gain 64 207 -128.42 gain 207 64 -124.20 gain 64 208 -129.86 gain 208 64 -131.41 gain 64 209 -130.24 gain 209 64 -132.79 gain 64 210 -128.30 gain 210 64 -127.79 gain 64 211 -127.70 gain 211 64 -129.21 gain 64 212 -126.80 gain 212 64 -126.85 gain 64 213 -126.95 gain 213 64 -126.20 gain 64 214 -123.78 gain 214 64 -122.91 gain 64 215 -115.74 gain 215 64 -111.28 gain 64 216 -131.90 gain 216 64 -132.10 gain 64 217 -121.50 gain 217 64 -122.22 gain 64 218 -126.17 gain 218 64 -129.08 gain 64 219 -129.08 gain 219 64 -123.36 gain 64 220 -121.36 gain 220 64 -126.12 gain 64 221 -129.77 gain 221 64 -130.18 gain 64 222 -129.36 gain 222 64 -130.09 gain 64 223 -127.14 gain 223 64 -126.48 gain 64 224 -122.66 gain 224 64 -124.69 gain 65 66 -105.61 gain 66 65 -99.87 gain 65 67 -103.69 gain 67 65 -100.22 gain 65 68 -108.85 gain 68 65 -109.94 gain 65 69 -110.55 gain 69 65 -108.93 gain 65 70 -118.28 gain 70 65 -116.41 gain 65 71 -119.73 gain 71 65 -115.97 gain 65 72 -123.39 gain 72 65 -120.05 gain 65 73 -125.32 gain 73 65 -120.37 gain 65 74 -129.63 gain 74 65 -128.56 gain 65 75 -118.13 gain 75 65 -117.19 gain 65 76 -116.02 gain 76 65 -111.04 gain 65 77 -117.80 gain 77 65 -116.49 gain 65 78 -107.21 gain 78 65 -108.74 gain 65 79 -100.98 gain 79 65 -97.29 gain 65 80 -92.36 gain 80 65 -89.17 gain 65 81 -103.20 gain 81 65 -100.60 gain 65 82 -110.25 gain 82 65 -105.29 gain 65 83 -112.07 gain 83 65 -108.13 gain 65 84 -116.54 gain 84 65 -112.76 gain 65 85 -112.82 gain 85 65 -105.84 gain 65 86 -119.47 gain 86 65 -115.87 gain 65 87 -122.12 gain 87 65 -122.49 gain 65 88 -126.92 gain 88 65 -125.03 gain 65 89 -123.94 gain 89 65 -120.65 gain 65 90 -116.41 gain 90 65 -110.14 gain 65 91 -113.48 gain 91 65 -111.14 gain 65 92 -106.39 gain 92 65 -101.02 gain 65 93 -107.50 gain 93 65 -106.92 gain 65 94 -105.14 gain 94 65 -104.43 gain 65 95 -100.54 gain 95 65 -102.08 gain 65 96 -104.79 gain 96 65 -103.67 gain 65 97 -110.36 gain 97 65 -107.99 gain 65 98 -109.66 gain 98 65 -108.09 gain 65 99 -107.51 gain 99 65 -103.76 gain 65 100 -119.53 gain 100 65 -115.34 gain 65 101 -123.00 gain 101 65 -118.97 gain 65 102 -121.52 gain 102 65 -118.28 gain 65 103 -126.06 gain 103 65 -120.30 gain 65 104 -126.93 gain 104 65 -126.55 gain 65 105 -123.57 gain 105 65 -119.12 gain 65 106 -112.61 gain 106 65 -109.25 gain 65 107 -108.78 gain 107 65 -111.99 gain 65 108 -110.61 gain 108 65 -106.14 gain 65 109 -104.95 gain 109 65 -103.96 gain 65 110 -108.06 gain 110 65 -105.55 gain 65 111 -112.54 gain 111 65 -109.70 gain 65 112 -118.71 gain 112 65 -114.75 gain 65 113 -113.26 gain 113 65 -108.11 gain 65 114 -116.87 gain 114 65 -115.02 gain 65 115 -123.94 gain 115 65 -116.39 gain 65 116 -122.99 gain 116 65 -122.99 gain 65 117 -123.93 gain 117 65 -125.43 gain 65 118 -127.76 gain 118 65 -127.58 gain 65 119 -131.75 gain 119 65 -126.23 gain 65 120 -122.80 gain 120 65 -121.80 gain 65 121 -115.32 gain 121 65 -113.61 gain 65 122 -115.96 gain 122 65 -116.36 gain 65 123 -122.39 gain 123 65 -123.57 gain 65 124 -120.43 gain 124 65 -118.02 gain 65 125 -111.24 gain 125 65 -110.17 gain 65 126 -118.91 gain 126 65 -115.79 gain 65 127 -114.21 gain 127 65 -114.55 gain 65 128 -121.58 gain 128 65 -119.86 gain 65 129 -121.04 gain 129 65 -117.23 gain 65 130 -125.89 gain 130 65 -119.90 gain 65 131 -125.23 gain 131 65 -126.33 gain 65 132 -126.55 gain 132 65 -127.28 gain 65 133 -128.61 gain 133 65 -127.40 gain 65 134 -124.61 gain 134 65 -120.11 gain 65 135 -121.00 gain 135 65 -120.07 gain 65 136 -113.43 gain 136 65 -113.10 gain 65 137 -119.01 gain 137 65 -116.17 gain 65 138 -123.13 gain 138 65 -119.29 gain 65 139 -121.57 gain 139 65 -118.71 gain 65 140 -120.86 gain 140 65 -120.62 gain 65 141 -115.08 gain 141 65 -113.50 gain 65 142 -114.12 gain 142 65 -111.85 gain 65 143 -117.63 gain 143 65 -114.97 gain 65 144 -125.49 gain 144 65 -123.85 gain 65 145 -126.12 gain 145 65 -122.93 gain 65 146 -123.33 gain 146 65 -119.05 gain 65 147 -124.06 gain 147 65 -116.87 gain 65 148 -120.18 gain 148 65 -112.71 gain 65 149 -124.32 gain 149 65 -120.02 gain 65 150 -124.68 gain 150 65 -123.06 gain 65 151 -120.77 gain 151 65 -119.35 gain 65 152 -119.73 gain 152 65 -115.28 gain 65 153 -117.51 gain 153 65 -110.65 gain 65 154 -115.43 gain 154 65 -117.11 gain 65 155 -120.53 gain 155 65 -122.11 gain 65 156 -118.43 gain 156 65 -114.39 gain 65 157 -124.43 gain 157 65 -123.34 gain 65 158 -123.58 gain 158 65 -125.08 gain 65 159 -123.99 gain 159 65 -122.12 gain 65 160 -123.28 gain 160 65 -118.51 gain 65 161 -118.33 gain 161 65 -117.05 gain 65 162 -119.42 gain 162 65 -117.01 gain 65 163 -128.55 gain 163 65 -128.29 gain 65 164 -127.81 gain 164 65 -128.59 gain 65 165 -123.23 gain 165 65 -120.05 gain 65 166 -126.15 gain 166 65 -124.54 gain 65 167 -121.42 gain 167 65 -121.90 gain 65 168 -123.02 gain 168 65 -121.95 gain 65 169 -118.96 gain 169 65 -122.08 gain 65 170 -126.01 gain 170 65 -120.66 gain 65 171 -120.47 gain 171 65 -120.15 gain 65 172 -119.72 gain 172 65 -114.10 gain 65 173 -121.84 gain 173 65 -115.66 gain 65 174 -126.60 gain 174 65 -124.71 gain 65 175 -126.02 gain 175 65 -127.68 gain 65 176 -124.96 gain 176 65 -118.63 gain 65 177 -130.38 gain 177 65 -131.86 gain 65 178 -119.85 gain 178 65 -117.16 gain 65 179 -121.27 gain 179 65 -116.97 gain 65 180 -131.88 gain 180 65 -129.05 gain 65 181 -124.58 gain 181 65 -121.82 gain 65 182 -130.35 gain 182 65 -129.97 gain 65 183 -122.72 gain 183 65 -115.73 gain 65 184 -127.04 gain 184 65 -124.83 gain 65 185 -124.40 gain 185 65 -119.69 gain 65 186 -118.69 gain 186 65 -114.25 gain 65 187 -119.45 gain 187 65 -117.55 gain 65 188 -127.86 gain 188 65 -129.23 gain 65 189 -130.66 gain 189 65 -129.54 gain 65 190 -124.34 gain 190 65 -120.23 gain 65 191 -137.39 gain 191 65 -134.37 gain 65 192 -117.89 gain 192 65 -117.74 gain 65 193 -130.19 gain 193 65 -131.30 gain 65 194 -127.61 gain 194 65 -122.52 gain 65 195 -125.17 gain 195 65 -120.72 gain 65 196 -128.36 gain 196 65 -127.95 gain 65 197 -129.63 gain 197 65 -125.28 gain 65 198 -125.23 gain 198 65 -120.40 gain 65 199 -119.17 gain 199 65 -118.26 gain 65 200 -123.25 gain 200 65 -119.28 gain 65 201 -123.37 gain 201 65 -120.20 gain 65 202 -123.35 gain 202 65 -124.18 gain 65 203 -127.23 gain 203 65 -127.68 gain 65 204 -122.52 gain 204 65 -120.25 gain 65 205 -128.27 gain 205 65 -125.08 gain 65 206 -123.55 gain 206 65 -124.88 gain 65 207 -133.55 gain 207 65 -127.24 gain 65 208 -131.99 gain 208 65 -131.46 gain 65 209 -135.27 gain 209 65 -135.73 gain 65 210 -124.88 gain 210 65 -122.27 gain 65 211 -126.01 gain 211 65 -125.43 gain 65 212 -129.68 gain 212 65 -127.64 gain 65 213 -130.48 gain 213 65 -127.63 gain 65 214 -127.54 gain 214 65 -124.58 gain 65 215 -132.31 gain 215 65 -125.77 gain 65 216 -126.24 gain 216 65 -124.36 gain 65 217 -123.28 gain 217 65 -121.92 gain 65 218 -127.45 gain 218 65 -128.28 gain 65 219 -131.42 gain 219 65 -123.60 gain 65 220 -123.77 gain 220 65 -126.45 gain 65 221 -126.87 gain 221 65 -125.19 gain 65 222 -128.87 gain 222 65 -127.51 gain 65 223 -140.23 gain 223 65 -137.49 gain 65 224 -127.71 gain 224 65 -127.65 gain 66 67 -91.41 gain 67 66 -93.68 gain 66 68 -102.27 gain 68 66 -109.11 gain 66 69 -102.76 gain 69 66 -106.89 gain 66 70 -108.02 gain 70 66 -111.91 gain 66 71 -107.87 gain 71 66 -109.86 gain 66 72 -112.50 gain 72 66 -114.90 gain 66 73 -114.74 gain 73 66 -115.54 gain 66 74 -124.82 gain 74 66 -129.50 gain 66 75 -120.45 gain 75 66 -125.27 gain 66 76 -113.69 gain 76 66 -114.46 gain 66 77 -107.52 gain 77 66 -111.95 gain 66 78 -104.13 gain 78 66 -111.41 gain 66 79 -105.29 gain 79 66 -107.35 gain 66 80 -93.05 gain 80 66 -95.61 gain 66 81 -83.88 gain 81 66 -87.03 gain 66 82 -99.86 gain 82 66 -100.64 gain 66 83 -96.08 gain 83 66 -97.89 gain 66 84 -108.43 gain 84 66 -110.39 gain 66 85 -111.74 gain 85 66 -110.50 gain 66 86 -118.67 gain 86 66 -120.82 gain 66 87 -116.61 gain 87 66 -122.72 gain 66 88 -118.56 gain 88 66 -122.42 gain 66 89 -116.92 gain 89 66 -119.39 gain 66 90 -110.11 gain 90 66 -109.58 gain 66 91 -111.51 gain 91 66 -114.92 gain 66 92 -113.26 gain 92 66 -113.63 gain 66 93 -115.30 gain 93 66 -120.46 gain 66 94 -103.12 gain 94 66 -108.16 gain 66 95 -102.63 gain 95 66 -109.93 gain 66 96 -90.74 gain 96 66 -95.37 gain 66 97 -100.94 gain 97 66 -104.32 gain 66 98 -106.27 gain 98 66 -110.45 gain 66 99 -111.21 gain 99 66 -113.21 gain 66 100 -110.63 gain 100 66 -112.19 gain 66 101 -102.02 gain 101 66 -103.74 gain 66 102 -121.41 gain 102 66 -123.92 gain 66 103 -115.00 gain 103 66 -114.99 gain 66 104 -118.89 gain 104 66 -124.26 gain 66 105 -118.03 gain 105 66 -119.34 gain 66 106 -114.94 gain 106 66 -117.33 gain 66 107 -118.87 gain 107 66 -127.83 gain 66 108 -106.61 gain 108 66 -107.89 gain 66 109 -105.59 gain 109 66 -110.36 gain 66 110 -104.54 gain 110 66 -107.77 gain 66 111 -101.65 gain 111 66 -104.56 gain 66 112 -97.31 gain 112 66 -99.10 gain 66 113 -103.50 gain 113 66 -104.10 gain 66 114 -105.78 gain 114 66 -109.68 gain 66 115 -114.98 gain 115 66 -113.18 gain 66 116 -108.86 gain 116 66 -114.61 gain 66 117 -114.63 gain 117 66 -121.88 gain 66 118 -112.83 gain 118 66 -118.39 gain 66 119 -118.01 gain 119 66 -118.24 gain 66 120 -122.05 gain 120 66 -126.79 gain 66 121 -113.61 gain 121 66 -117.65 gain 66 122 -112.96 gain 122 66 -119.11 gain 66 123 -110.30 gain 123 66 -117.22 gain 66 124 -105.72 gain 124 66 -109.06 gain 66 125 -108.33 gain 125 66 -113.01 gain 66 126 -108.36 gain 126 66 -110.98 gain 66 127 -107.55 gain 127 66 -113.64 gain 66 128 -107.85 gain 128 66 -111.87 gain 66 129 -112.02 gain 129 66 -113.95 gain 66 130 -111.43 gain 130 66 -111.18 gain 66 131 -114.58 gain 131 66 -121.42 gain 66 132 -110.11 gain 132 66 -116.58 gain 66 133 -117.62 gain 133 66 -122.16 gain 66 134 -119.19 gain 134 66 -120.43 gain 66 135 -118.04 gain 135 66 -122.85 gain 66 136 -115.46 gain 136 66 -120.88 gain 66 137 -108.93 gain 137 66 -111.83 gain 66 138 -118.82 gain 138 66 -120.73 gain 66 139 -107.93 gain 139 66 -110.82 gain 66 140 -110.82 gain 140 66 -116.31 gain 66 141 -114.61 gain 141 66 -118.78 gain 66 142 -106.01 gain 142 66 -109.48 gain 66 143 -106.81 gain 143 66 -109.90 gain 66 144 -110.43 gain 144 66 -114.54 gain 66 145 -114.34 gain 145 66 -116.90 gain 66 146 -115.80 gain 146 66 -117.27 gain 66 147 -128.04 gain 147 66 -126.59 gain 66 148 -116.61 gain 148 66 -114.89 gain 66 149 -118.67 gain 149 66 -120.11 gain 66 150 -118.27 gain 150 66 -122.40 gain 66 151 -122.16 gain 151 66 -126.49 gain 66 152 -113.90 gain 152 66 -115.20 gain 66 153 -116.58 gain 153 66 -115.46 gain 66 154 -116.94 gain 154 66 -124.37 gain 66 155 -116.64 gain 155 66 -123.97 gain 66 156 -109.17 gain 156 66 -110.88 gain 66 157 -113.59 gain 157 66 -118.25 gain 66 158 -113.47 gain 158 66 -120.73 gain 66 159 -115.34 gain 159 66 -119.21 gain 66 160 -113.07 gain 160 66 -114.05 gain 66 161 -117.03 gain 161 66 -121.51 gain 66 162 -119.42 gain 162 66 -122.76 gain 66 163 -115.09 gain 163 66 -120.58 gain 66 164 -126.94 gain 164 66 -133.47 gain 66 165 -121.85 gain 165 66 -124.42 gain 66 166 -121.06 gain 166 66 -125.19 gain 66 167 -118.54 gain 167 66 -124.76 gain 66 168 -116.82 gain 168 66 -121.50 gain 66 169 -116.44 gain 169 66 -125.31 gain 66 170 -118.96 gain 170 66 -119.36 gain 66 171 -119.98 gain 171 66 -125.41 gain 66 172 -116.58 gain 172 66 -116.71 gain 66 173 -110.81 gain 173 66 -110.37 gain 66 174 -118.28 gain 174 66 -122.13 gain 66 175 -119.74 gain 175 66 -127.15 gain 66 176 -119.44 gain 176 66 -118.86 gain 66 177 -114.61 gain 177 66 -121.84 gain 66 178 -124.25 gain 178 66 -127.31 gain 66 179 -126.38 gain 179 66 -127.82 gain 66 180 -126.03 gain 180 66 -128.95 gain 66 181 -119.05 gain 181 66 -122.03 gain 66 182 -123.86 gain 182 66 -129.23 gain 66 183 -113.98 gain 183 66 -112.74 gain 66 184 -120.63 gain 184 66 -124.17 gain 66 185 -114.07 gain 185 66 -115.09 gain 66 186 -108.16 gain 186 66 -109.48 gain 66 187 -114.69 gain 187 66 -118.54 gain 66 188 -121.70 gain 188 66 -128.81 gain 66 189 -118.09 gain 189 66 -122.72 gain 66 190 -117.90 gain 190 66 -119.53 gain 66 191 -124.05 gain 191 66 -126.78 gain 66 192 -117.75 gain 192 66 -123.35 gain 66 193 -117.28 gain 193 66 -124.12 gain 66 194 -114.84 gain 194 66 -115.50 gain 66 195 -124.43 gain 195 66 -125.72 gain 66 196 -118.14 gain 196 66 -123.47 gain 66 197 -124.78 gain 197 66 -126.18 gain 66 198 -120.12 gain 198 66 -121.03 gain 66 199 -123.96 gain 199 66 -128.79 gain 66 200 -116.54 gain 200 66 -118.31 gain 66 201 -122.42 gain 201 66 -124.99 gain 66 202 -115.91 gain 202 66 -122.49 gain 66 203 -116.06 gain 203 66 -122.26 gain 66 204 -129.18 gain 204 66 -132.66 gain 66 205 -117.77 gain 205 66 -120.33 gain 66 206 -118.92 gain 206 66 -126.00 gain 66 207 -123.98 gain 207 66 -123.42 gain 66 208 -122.37 gain 208 66 -127.59 gain 66 209 -128.91 gain 209 66 -135.12 gain 66 210 -118.19 gain 210 66 -121.33 gain 66 211 -114.92 gain 211 66 -120.09 gain 66 212 -127.31 gain 212 66 -131.02 gain 66 213 -123.44 gain 213 66 -126.34 gain 66 214 -118.77 gain 214 66 -121.56 gain 66 215 -119.15 gain 215 66 -118.35 gain 66 216 -126.72 gain 216 66 -130.58 gain 66 217 -124.92 gain 217 66 -129.30 gain 66 218 -116.90 gain 218 66 -123.48 gain 66 219 -124.72 gain 219 66 -122.66 gain 66 220 -122.02 gain 220 66 -130.44 gain 66 221 -115.99 gain 221 66 -120.06 gain 66 222 -124.74 gain 222 66 -129.13 gain 66 223 -123.70 gain 223 66 -126.70 gain 66 224 -124.39 gain 224 66 -130.08 gain 67 68 -86.47 gain 68 67 -91.03 gain 67 69 -100.79 gain 69 67 -102.64 gain 67 70 -99.47 gain 70 67 -101.08 gain 67 71 -111.45 gain 71 67 -111.17 gain 67 72 -119.80 gain 72 67 -119.93 gain 67 73 -118.79 gain 73 67 -117.31 gain 67 74 -122.81 gain 74 67 -125.21 gain 67 75 -118.15 gain 75 67 -120.69 gain 67 76 -116.55 gain 76 67 -115.04 gain 67 77 -107.69 gain 77 67 -109.85 gain 67 78 -103.66 gain 78 67 -108.66 gain 67 79 -113.60 gain 79 67 -113.38 gain 67 80 -101.23 gain 80 67 -101.52 gain 67 81 -99.39 gain 81 67 -100.26 gain 67 82 -85.43 gain 82 67 -83.94 gain 67 83 -97.09 gain 83 67 -96.63 gain 67 84 -111.45 gain 84 67 -111.13 gain 67 85 -109.36 gain 85 67 -105.85 gain 67 86 -107.43 gain 86 67 -107.31 gain 67 87 -108.17 gain 87 67 -112.01 gain 67 88 -108.32 gain 88 67 -109.91 gain 67 89 -117.95 gain 89 67 -118.14 gain 67 90 -120.01 gain 90 67 -117.21 gain 67 91 -123.40 gain 91 67 -124.54 gain 67 92 -114.56 gain 92 67 -112.66 gain 67 93 -118.75 gain 93 67 -121.63 gain 67 94 -111.05 gain 94 67 -113.81 gain 67 95 -105.18 gain 95 67 -110.20 gain 67 96 -106.38 gain 96 67 -108.74 gain 67 97 -100.57 gain 97 67 -101.67 gain 67 98 -106.89 gain 98 67 -108.79 gain 67 99 -99.59 gain 99 67 -99.31 gain 67 100 -109.28 gain 100 67 -108.56 gain 67 101 -118.81 gain 101 67 -118.26 gain 67 102 -113.66 gain 102 67 -113.89 gain 67 103 -118.33 gain 103 67 -116.05 gain 67 104 -123.16 gain 104 67 -126.25 gain 67 105 -124.16 gain 105 67 -123.20 gain 67 106 -115.78 gain 106 67 -115.89 gain 67 107 -107.67 gain 107 67 -114.35 gain 67 108 -114.15 gain 108 67 -113.15 gain 67 109 -116.45 gain 109 67 -118.94 gain 67 110 -116.57 gain 110 67 -117.53 gain 67 111 -103.87 gain 111 67 -104.51 gain 67 112 -106.25 gain 112 67 -105.77 gain 67 113 -112.89 gain 113 67 -111.22 gain 67 114 -113.79 gain 114 67 -115.42 gain 67 115 -105.51 gain 115 67 -101.44 gain 67 116 -114.14 gain 116 67 -117.61 gain 67 117 -119.12 gain 117 67 -124.09 gain 67 118 -113.88 gain 118 67 -117.18 gain 67 119 -120.62 gain 119 67 -118.58 gain 67 120 -118.68 gain 120 67 -121.15 gain 67 121 -119.70 gain 121 67 -121.46 gain 67 122 -124.49 gain 122 67 -128.36 gain 67 123 -113.74 gain 123 67 -118.39 gain 67 124 -111.61 gain 124 67 -112.67 gain 67 125 -112.47 gain 125 67 -114.86 gain 67 126 -119.11 gain 126 67 -119.46 gain 67 127 -113.66 gain 127 67 -117.47 gain 67 128 -109.11 gain 128 67 -110.86 gain 67 129 -121.10 gain 129 67 -120.76 gain 67 130 -111.17 gain 130 67 -108.65 gain 67 131 -111.12 gain 131 67 -115.69 gain 67 132 -115.76 gain 132 67 -119.95 gain 67 133 -118.44 gain 133 67 -120.71 gain 67 134 -117.91 gain 134 67 -116.87 gain 67 135 -121.84 gain 135 67 -124.38 gain 67 136 -119.07 gain 136 67 -122.22 gain 67 137 -118.07 gain 137 67 -118.70 gain 67 138 -119.09 gain 138 67 -118.72 gain 67 139 -112.80 gain 139 67 -113.42 gain 67 140 -110.28 gain 140 67 -113.50 gain 67 141 -126.01 gain 141 67 -127.91 gain 67 142 -110.07 gain 142 67 -111.27 gain 67 143 -111.62 gain 143 67 -112.44 gain 67 144 -111.41 gain 144 67 -113.24 gain 67 145 -111.02 gain 145 67 -111.31 gain 67 146 -115.46 gain 146 67 -114.65 gain 67 147 -117.25 gain 147 67 -113.54 gain 67 148 -119.70 gain 148 67 -115.70 gain 67 149 -116.80 gain 149 67 -115.97 gain 67 150 -118.26 gain 150 67 -120.11 gain 67 151 -118.29 gain 151 67 -120.35 gain 67 152 -113.76 gain 152 67 -112.79 gain 67 153 -117.42 gain 153 67 -114.03 gain 67 154 -120.47 gain 154 67 -125.63 gain 67 155 -115.50 gain 155 67 -120.55 gain 67 156 -115.90 gain 156 67 -115.34 gain 67 157 -116.70 gain 157 67 -119.08 gain 67 158 -112.43 gain 158 67 -117.41 gain 67 159 -118.52 gain 159 67 -120.11 gain 67 160 -119.30 gain 160 67 -118.01 gain 67 161 -123.88 gain 161 67 -126.07 gain 67 162 -118.25 gain 162 67 -119.31 gain 67 163 -113.50 gain 163 67 -116.71 gain 67 164 -123.06 gain 164 67 -127.31 gain 67 165 -118.74 gain 165 67 -119.04 gain 67 166 -115.82 gain 166 67 -117.68 gain 67 167 -120.10 gain 167 67 -124.05 gain 67 168 -120.18 gain 168 67 -122.58 gain 67 169 -115.52 gain 169 67 -122.12 gain 67 170 -118.59 gain 170 67 -116.72 gain 67 171 -122.98 gain 171 67 -126.14 gain 67 172 -120.99 gain 172 67 -118.84 gain 67 173 -116.45 gain 173 67 -113.73 gain 67 174 -116.02 gain 174 67 -117.60 gain 67 175 -118.39 gain 175 67 -123.52 gain 67 176 -115.90 gain 176 67 -113.04 gain 67 177 -120.36 gain 177 67 -125.32 gain 67 178 -119.14 gain 178 67 -119.92 gain 67 179 -121.54 gain 179 67 -120.71 gain 67 180 -118.05 gain 180 67 -118.69 gain 67 181 -127.40 gain 181 67 -128.11 gain 67 182 -126.62 gain 182 67 -129.72 gain 67 183 -120.60 gain 183 67 -117.09 gain 67 184 -125.86 gain 184 67 -127.12 gain 67 185 -115.06 gain 185 67 -113.82 gain 67 186 -120.79 gain 186 67 -119.83 gain 67 187 -123.01 gain 187 67 -124.59 gain 67 188 -115.58 gain 188 67 -120.42 gain 67 189 -118.14 gain 189 67 -120.50 gain 67 190 -117.57 gain 190 67 -116.94 gain 67 191 -124.11 gain 191 67 -124.57 gain 67 192 -121.75 gain 192 67 -125.07 gain 67 193 -121.87 gain 193 67 -126.44 gain 67 194 -126.67 gain 194 67 -125.05 gain 67 195 -124.38 gain 195 67 -123.40 gain 67 196 -127.35 gain 196 67 -130.41 gain 67 197 -120.73 gain 197 67 -119.85 gain 67 198 -117.63 gain 198 67 -116.27 gain 67 199 -117.17 gain 199 67 -119.73 gain 67 200 -117.23 gain 200 67 -116.73 gain 67 201 -123.78 gain 201 67 -124.08 gain 67 202 -117.87 gain 202 67 -122.17 gain 67 203 -119.30 gain 203 67 -123.22 gain 67 204 -116.89 gain 204 67 -118.10 gain 67 205 -132.13 gain 205 67 -132.42 gain 67 206 -121.31 gain 206 67 -126.11 gain 67 207 -123.92 gain 207 67 -121.08 gain 67 208 -128.00 gain 208 67 -130.94 gain 67 209 -123.39 gain 209 67 -127.32 gain 67 210 -136.67 gain 210 67 -137.54 gain 67 211 -127.12 gain 211 67 -130.01 gain 67 212 -124.38 gain 212 67 -125.81 gain 67 213 -122.63 gain 213 67 -123.25 gain 67 214 -117.87 gain 214 67 -118.39 gain 67 215 -116.35 gain 215 67 -113.28 gain 67 216 -123.85 gain 216 67 -125.44 gain 67 217 -119.83 gain 217 67 -121.94 gain 67 218 -123.13 gain 218 67 -127.43 gain 67 219 -118.72 gain 219 67 -114.38 gain 67 220 -126.98 gain 220 67 -133.13 gain 67 221 -122.13 gain 221 67 -123.92 gain 67 222 -129.13 gain 222 67 -131.24 gain 67 223 -123.67 gain 223 67 -124.39 gain 67 224 -116.14 gain 224 67 -119.56 gain 68 69 -96.03 gain 69 68 -93.32 gain 68 70 -102.50 gain 70 68 -99.55 gain 68 71 -117.86 gain 71 68 -113.01 gain 68 72 -120.89 gain 72 68 -116.46 gain 68 73 -119.94 gain 73 68 -113.91 gain 68 74 -112.38 gain 74 68 -110.22 gain 68 75 -123.40 gain 75 68 -121.38 gain 68 76 -118.15 gain 76 68 -112.08 gain 68 77 -122.73 gain 77 68 -120.33 gain 68 78 -114.92 gain 78 68 -115.37 gain 68 79 -114.04 gain 79 68 -109.27 gain 68 80 -119.70 gain 80 68 -115.43 gain 68 81 -103.23 gain 81 68 -99.54 gain 68 82 -104.54 gain 82 68 -98.48 gain 68 83 -90.17 gain 83 68 -85.15 gain 68 84 -97.09 gain 84 68 -92.22 gain 68 85 -106.89 gain 85 68 -98.83 gain 68 86 -118.12 gain 86 68 -113.44 gain 68 87 -112.64 gain 87 68 -111.92 gain 68 88 -109.86 gain 88 68 -106.89 gain 68 89 -128.31 gain 89 68 -123.94 gain 68 90 -124.29 gain 90 68 -116.93 gain 68 91 -113.14 gain 91 68 -109.72 gain 68 92 -120.09 gain 92 68 -113.64 gain 68 93 -113.59 gain 93 68 -111.92 gain 68 94 -113.10 gain 94 68 -111.30 gain 68 95 -118.19 gain 95 68 -118.65 gain 68 96 -102.00 gain 96 68 -99.80 gain 68 97 -105.26 gain 97 68 -101.80 gain 68 98 -99.47 gain 98 68 -96.81 gain 68 99 -107.71 gain 99 68 -102.87 gain 68 100 -111.66 gain 100 68 -106.39 gain 68 101 -113.21 gain 101 68 -108.10 gain 68 102 -111.63 gain 102 68 -107.30 gain 68 103 -116.01 gain 103 68 -109.17 gain 68 104 -122.18 gain 104 68 -120.71 gain 68 105 -127.75 gain 105 68 -122.22 gain 68 106 -117.95 gain 106 68 -113.50 gain 68 107 -122.09 gain 107 68 -124.22 gain 68 108 -127.36 gain 108 68 -121.80 gain 68 109 -115.39 gain 109 68 -113.32 gain 68 110 -113.18 gain 110 68 -109.58 gain 68 111 -104.80 gain 111 68 -100.88 gain 68 112 -113.25 gain 112 68 -108.21 gain 68 113 -112.25 gain 113 68 -106.02 gain 68 114 -109.59 gain 114 68 -106.66 gain 68 115 -116.66 gain 115 68 -108.03 gain 68 116 -120.38 gain 116 68 -119.29 gain 68 117 -117.55 gain 117 68 -117.96 gain 68 118 -114.74 gain 118 68 -113.48 gain 68 119 -124.92 gain 119 68 -118.32 gain 68 120 -134.27 gain 120 68 -132.18 gain 68 121 -127.36 gain 121 68 -124.56 gain 68 122 -128.13 gain 122 68 -127.44 gain 68 123 -120.62 gain 123 68 -120.72 gain 68 124 -115.01 gain 124 68 -111.51 gain 68 125 -123.43 gain 125 68 -121.26 gain 68 126 -115.67 gain 126 68 -111.46 gain 68 127 -118.23 gain 127 68 -117.49 gain 68 128 -119.14 gain 128 68 -116.33 gain 68 129 -114.04 gain 129 68 -109.14 gain 68 130 -106.14 gain 130 68 -99.07 gain 68 131 -122.62 gain 131 68 -122.63 gain 68 132 -117.97 gain 132 68 -117.60 gain 68 133 -121.04 gain 133 68 -118.75 gain 68 134 -119.63 gain 134 68 -114.04 gain 68 135 -130.44 gain 135 68 -128.42 gain 68 136 -125.42 gain 136 68 -124.01 gain 68 137 -123.75 gain 137 68 -119.82 gain 68 138 -124.37 gain 138 68 -119.44 gain 68 139 -118.13 gain 139 68 -114.19 gain 68 140 -117.02 gain 140 68 -115.68 gain 68 141 -124.37 gain 141 68 -121.70 gain 68 142 -115.01 gain 142 68 -111.66 gain 68 143 -114.31 gain 143 68 -110.57 gain 68 144 -119.80 gain 144 68 -117.08 gain 68 145 -119.72 gain 145 68 -115.45 gain 68 146 -121.34 gain 146 68 -115.97 gain 68 147 -125.88 gain 147 68 -117.60 gain 68 148 -115.75 gain 148 68 -107.19 gain 68 149 -125.91 gain 149 68 -120.52 gain 68 150 -126.33 gain 150 68 -123.63 gain 68 151 -122.09 gain 151 68 -119.58 gain 68 152 -122.60 gain 152 68 -117.07 gain 68 153 -119.00 gain 153 68 -111.04 gain 68 154 -131.27 gain 154 68 -131.86 gain 68 155 -118.57 gain 155 68 -119.06 gain 68 156 -125.68 gain 156 68 -120.56 gain 68 157 -128.76 gain 157 68 -126.58 gain 68 158 -112.66 gain 158 68 -113.08 gain 68 159 -118.75 gain 159 68 -115.78 gain 68 160 -116.39 gain 160 68 -110.53 gain 68 161 -124.76 gain 161 68 -122.39 gain 68 162 -123.85 gain 162 68 -120.35 gain 68 163 -124.90 gain 163 68 -123.55 gain 68 164 -120.53 gain 164 68 -120.22 gain 68 165 -130.24 gain 165 68 -125.98 gain 68 166 -132.31 gain 166 68 -129.62 gain 68 167 -125.80 gain 167 68 -125.19 gain 68 168 -121.35 gain 168 68 -119.20 gain 68 169 -119.80 gain 169 68 -121.84 gain 68 170 -130.11 gain 170 68 -123.68 gain 68 171 -120.85 gain 171 68 -119.44 gain 68 172 -118.66 gain 172 68 -111.95 gain 68 173 -119.33 gain 173 68 -112.06 gain 68 174 -119.46 gain 174 68 -116.48 gain 68 175 -120.66 gain 175 68 -121.24 gain 68 176 -121.33 gain 176 68 -113.92 gain 68 177 -129.09 gain 177 68 -129.49 gain 68 178 -123.56 gain 178 68 -119.78 gain 68 179 -124.24 gain 179 68 -118.86 gain 68 180 -135.43 gain 180 68 -131.52 gain 68 181 -131.52 gain 181 68 -127.67 gain 68 182 -127.82 gain 182 68 -126.36 gain 68 183 -131.27 gain 183 68 -123.20 gain 68 184 -123.62 gain 184 68 -120.33 gain 68 185 -130.72 gain 185 68 -124.91 gain 68 186 -121.54 gain 186 68 -116.02 gain 68 187 -123.38 gain 187 68 -120.40 gain 68 188 -132.46 gain 188 68 -132.74 gain 68 189 -124.95 gain 189 68 -122.75 gain 68 190 -117.43 gain 190 68 -112.23 gain 68 191 -137.09 gain 191 68 -132.99 gain 68 192 -126.40 gain 192 68 -125.16 gain 68 193 -130.58 gain 193 68 -130.60 gain 68 194 -130.76 gain 194 68 -124.58 gain 68 195 -124.23 gain 195 68 -118.69 gain 68 196 -128.89 gain 196 68 -127.39 gain 68 197 -127.75 gain 197 68 -122.31 gain 68 198 -127.72 gain 198 68 -121.81 gain 68 199 -122.33 gain 199 68 -120.32 gain 68 200 -122.18 gain 200 68 -117.12 gain 68 201 -124.10 gain 201 68 -119.84 gain 68 202 -131.64 gain 202 68 -131.38 gain 68 203 -123.57 gain 203 68 -122.93 gain 68 204 -128.33 gain 204 68 -124.98 gain 68 205 -122.78 gain 205 68 -118.51 gain 68 206 -125.47 gain 206 68 -125.71 gain 68 207 -127.49 gain 207 68 -120.09 gain 68 208 -123.33 gain 208 68 -121.71 gain 68 209 -133.86 gain 209 68 -133.23 gain 68 210 -131.70 gain 210 68 -128.01 gain 68 211 -132.66 gain 211 68 -130.99 gain 68 212 -135.81 gain 212 68 -132.68 gain 68 213 -119.53 gain 213 68 -115.60 gain 68 214 -129.45 gain 214 68 -125.40 gain 68 215 -130.10 gain 215 68 -122.47 gain 68 216 -129.98 gain 216 68 -127.01 gain 68 217 -127.01 gain 217 68 -124.56 gain 68 218 -127.81 gain 218 68 -127.55 gain 68 219 -128.92 gain 219 68 -120.02 gain 68 220 -128.86 gain 220 68 -130.45 gain 68 221 -128.72 gain 221 68 -125.95 gain 68 222 -121.68 gain 222 68 -119.24 gain 68 223 -123.75 gain 223 68 -119.92 gain 68 224 -129.08 gain 224 68 -127.93 gain 69 70 -97.32 gain 70 69 -97.08 gain 69 71 -101.41 gain 71 69 -99.27 gain 69 72 -109.63 gain 72 69 -107.91 gain 69 73 -112.88 gain 73 69 -109.55 gain 69 74 -119.76 gain 74 69 -120.31 gain 69 75 -121.50 gain 75 69 -122.18 gain 69 76 -121.16 gain 76 69 -117.80 gain 69 77 -116.95 gain 77 69 -117.25 gain 69 78 -121.19 gain 78 69 -124.34 gain 69 79 -111.82 gain 79 69 -109.76 gain 69 80 -110.35 gain 80 69 -108.78 gain 69 81 -102.93 gain 81 69 -101.96 gain 69 82 -107.23 gain 82 69 -103.88 gain 69 83 -97.23 gain 83 69 -94.92 gain 69 84 -97.62 gain 84 69 -95.45 gain 69 85 -101.45 gain 85 69 -96.09 gain 69 86 -106.83 gain 86 69 -104.85 gain 69 87 -107.76 gain 87 69 -109.75 gain 69 88 -115.57 gain 88 69 -115.31 gain 69 89 -110.45 gain 89 69 -108.79 gain 69 90 -129.50 gain 90 69 -124.85 gain 69 91 -122.18 gain 91 69 -121.47 gain 69 92 -117.55 gain 92 69 -113.80 gain 69 93 -120.48 gain 93 69 -121.51 gain 69 94 -116.72 gain 94 69 -117.64 gain 69 95 -113.29 gain 95 69 -116.46 gain 69 96 -110.04 gain 96 69 -110.54 gain 69 97 -103.14 gain 97 69 -102.39 gain 69 98 -99.60 gain 98 69 -99.65 gain 69 99 -93.57 gain 99 69 -91.44 gain 69 100 -108.93 gain 100 69 -106.36 gain 69 101 -106.60 gain 101 69 -104.19 gain 69 102 -109.42 gain 102 69 -107.80 gain 69 103 -110.35 gain 103 69 -106.21 gain 69 104 -113.21 gain 104 69 -114.45 gain 69 105 -129.14 gain 105 69 -126.32 gain 69 106 -118.43 gain 106 69 -116.69 gain 69 107 -122.24 gain 107 69 -127.07 gain 69 108 -116.14 gain 108 69 -113.29 gain 69 109 -118.78 gain 109 69 -119.42 gain 69 110 -116.87 gain 110 69 -115.97 gain 69 111 -115.69 gain 111 69 -114.47 gain 69 112 -114.22 gain 112 69 -111.88 gain 69 113 -115.80 gain 113 69 -112.27 gain 69 114 -104.98 gain 114 69 -104.75 gain 69 115 -112.94 gain 115 69 -107.01 gain 69 116 -110.68 gain 116 69 -112.30 gain 69 117 -112.68 gain 117 69 -115.80 gain 69 118 -111.22 gain 118 69 -112.66 gain 69 119 -117.44 gain 119 69 -113.54 gain 69 120 -127.34 gain 120 69 -127.95 gain 69 121 -123.90 gain 121 69 -123.81 gain 69 122 -114.76 gain 122 69 -116.78 gain 69 123 -126.46 gain 123 69 -129.26 gain 69 124 -119.82 gain 124 69 -119.03 gain 69 125 -122.24 gain 125 69 -122.78 gain 69 126 -118.37 gain 126 69 -116.87 gain 69 127 -114.03 gain 127 69 -115.99 gain 69 128 -110.97 gain 128 69 -110.87 gain 69 129 -115.48 gain 129 69 -113.28 gain 69 130 -119.85 gain 130 69 -115.49 gain 69 131 -111.18 gain 131 69 -113.89 gain 69 132 -110.83 gain 132 69 -113.18 gain 69 133 -116.46 gain 133 69 -116.88 gain 69 134 -120.99 gain 134 69 -118.10 gain 69 135 -128.43 gain 135 69 -129.11 gain 69 136 -122.27 gain 136 69 -123.56 gain 69 137 -126.31 gain 137 69 -125.09 gain 69 138 -116.76 gain 138 69 -114.53 gain 69 139 -117.97 gain 139 69 -116.73 gain 69 140 -118.65 gain 140 69 -120.02 gain 69 141 -116.11 gain 141 69 -116.15 gain 69 142 -114.91 gain 142 69 -114.26 gain 69 143 -119.87 gain 143 69 -118.84 gain 69 144 -119.78 gain 144 69 -119.77 gain 69 145 -104.86 gain 145 69 -103.30 gain 69 146 -121.27 gain 146 69 -118.62 gain 69 147 -123.28 gain 147 69 -117.72 gain 69 148 -114.03 gain 148 69 -108.18 gain 69 149 -120.32 gain 149 69 -117.64 gain 69 150 -127.66 gain 150 69 -127.67 gain 69 151 -124.15 gain 151 69 -124.35 gain 69 152 -124.72 gain 152 69 -121.90 gain 69 153 -128.66 gain 153 69 -123.41 gain 69 154 -117.13 gain 154 69 -120.44 gain 69 155 -121.33 gain 155 69 -124.53 gain 69 156 -117.30 gain 156 69 -114.89 gain 69 157 -111.12 gain 157 69 -111.65 gain 69 158 -113.69 gain 158 69 -116.82 gain 69 159 -117.94 gain 159 69 -117.68 gain 69 160 -117.33 gain 160 69 -114.19 gain 69 161 -118.22 gain 161 69 -118.56 gain 69 162 -117.21 gain 162 69 -116.42 gain 69 163 -117.94 gain 163 69 -119.30 gain 69 164 -114.10 gain 164 69 -116.50 gain 69 165 -122.91 gain 165 69 -121.35 gain 69 166 -124.09 gain 166 69 -124.10 gain 69 167 -122.33 gain 167 69 -124.43 gain 69 168 -117.81 gain 168 69 -118.36 gain 69 169 -126.58 gain 169 69 -131.33 gain 69 170 -121.95 gain 170 69 -118.23 gain 69 171 -114.34 gain 171 69 -115.64 gain 69 172 -122.25 gain 172 69 -118.25 gain 69 173 -122.60 gain 173 69 -118.03 gain 69 174 -130.16 gain 174 69 -129.89 gain 69 175 -114.99 gain 175 69 -118.27 gain 69 176 -118.65 gain 176 69 -113.94 gain 69 177 -121.02 gain 177 69 -124.12 gain 69 178 -120.44 gain 178 69 -119.38 gain 69 179 -119.60 gain 179 69 -116.92 gain 69 180 -134.49 gain 180 69 -133.28 gain 69 181 -126.10 gain 181 69 -124.96 gain 69 182 -125.02 gain 182 69 -126.27 gain 69 183 -118.58 gain 183 69 -113.21 gain 69 184 -117.51 gain 184 69 -116.93 gain 69 185 -116.93 gain 185 69 -113.84 gain 69 186 -122.29 gain 186 69 -119.48 gain 69 187 -118.47 gain 187 69 -118.19 gain 69 188 -122.92 gain 188 69 -125.91 gain 69 189 -128.35 gain 189 69 -128.86 gain 69 190 -125.39 gain 190 69 -122.90 gain 69 191 -119.21 gain 191 69 -117.81 gain 69 192 -121.82 gain 192 69 -123.29 gain 69 193 -117.15 gain 193 69 -119.87 gain 69 194 -120.14 gain 194 69 -116.67 gain 69 195 -125.92 gain 195 69 -123.08 gain 69 196 -126.72 gain 196 69 -127.93 gain 69 197 -127.60 gain 197 69 -124.87 gain 69 198 -122.85 gain 198 69 -119.64 gain 69 199 -123.41 gain 199 69 -124.12 gain 69 200 -121.30 gain 200 69 -118.95 gain 69 201 -129.27 gain 201 69 -127.72 gain 69 202 -128.58 gain 202 69 -131.03 gain 69 203 -111.10 gain 203 69 -113.17 gain 69 204 -121.68 gain 204 69 -121.04 gain 69 205 -125.68 gain 205 69 -124.11 gain 69 206 -121.40 gain 206 69 -124.35 gain 69 207 -124.14 gain 207 69 -119.45 gain 69 208 -116.17 gain 208 69 -117.26 gain 69 209 -129.64 gain 209 69 -131.72 gain 69 210 -130.42 gain 210 69 -129.44 gain 69 211 -131.27 gain 211 69 -132.31 gain 69 212 -123.72 gain 212 69 -123.30 gain 69 213 -130.35 gain 213 69 -129.12 gain 69 214 -125.92 gain 214 69 -124.58 gain 69 215 -119.67 gain 215 69 -114.74 gain 69 216 -121.06 gain 216 69 -120.80 gain 69 217 -126.46 gain 217 69 -126.72 gain 69 218 -127.43 gain 218 69 -129.88 gain 69 219 -123.72 gain 219 69 -117.52 gain 69 220 -123.97 gain 220 69 -128.27 gain 69 221 -125.30 gain 221 69 -125.23 gain 69 222 -126.44 gain 222 69 -126.70 gain 69 223 -120.81 gain 223 69 -119.69 gain 69 224 -123.68 gain 224 69 -125.24 gain 70 71 -88.26 gain 71 70 -86.36 gain 70 72 -102.89 gain 72 70 -101.42 gain 70 73 -110.69 gain 73 70 -107.61 gain 70 74 -108.98 gain 74 70 -109.77 gain 70 75 -126.12 gain 75 70 -127.05 gain 70 76 -120.51 gain 76 70 -117.39 gain 70 77 -123.08 gain 77 70 -123.62 gain 70 78 -120.90 gain 78 70 -124.29 gain 70 79 -122.31 gain 79 70 -120.48 gain 70 80 -117.59 gain 80 70 -116.26 gain 70 81 -112.88 gain 81 70 -112.14 gain 70 82 -99.46 gain 82 70 -96.36 gain 70 83 -98.22 gain 83 70 -96.15 gain 70 84 -100.61 gain 84 70 -98.69 gain 70 85 -95.70 gain 85 70 -90.58 gain 70 86 -99.46 gain 86 70 -97.72 gain 70 87 -107.98 gain 87 70 -110.21 gain 70 88 -110.54 gain 88 70 -110.52 gain 70 89 -117.31 gain 89 70 -115.89 gain 70 90 -124.71 gain 90 70 -120.29 gain 70 91 -128.97 gain 91 70 -128.51 gain 70 92 -124.60 gain 92 70 -121.10 gain 70 93 -121.00 gain 93 70 -122.28 gain 70 94 -129.48 gain 94 70 -130.64 gain 70 95 -121.15 gain 95 70 -124.56 gain 70 96 -117.20 gain 96 70 -117.95 gain 70 97 -109.22 gain 97 70 -108.72 gain 70 98 -103.02 gain 98 70 -103.31 gain 70 99 -105.97 gain 99 70 -104.08 gain 70 100 -100.18 gain 100 70 -97.86 gain 70 101 -102.58 gain 101 70 -100.42 gain 70 102 -104.38 gain 102 70 -103.00 gain 70 103 -113.06 gain 103 70 -109.16 gain 70 104 -115.64 gain 104 70 -117.12 gain 70 105 -121.98 gain 105 70 -119.40 gain 70 106 -122.02 gain 106 70 -120.52 gain 70 107 -118.13 gain 107 70 -123.20 gain 70 108 -113.89 gain 108 70 -111.28 gain 70 109 -122.63 gain 109 70 -123.51 gain 70 110 -114.59 gain 110 70 -113.94 gain 70 111 -113.06 gain 111 70 -112.08 gain 70 112 -114.60 gain 112 70 -112.51 gain 70 113 -106.15 gain 113 70 -102.87 gain 70 114 -112.65 gain 114 70 -112.67 gain 70 115 -114.17 gain 115 70 -108.49 gain 70 116 -99.04 gain 116 70 -100.90 gain 70 117 -116.06 gain 117 70 -119.42 gain 70 118 -113.46 gain 118 70 -115.15 gain 70 119 -111.29 gain 119 70 -107.63 gain 70 120 -127.33 gain 120 70 -128.20 gain 70 121 -129.00 gain 121 70 -129.15 gain 70 122 -120.28 gain 122 70 -122.55 gain 70 123 -120.10 gain 123 70 -123.14 gain 70 124 -118.08 gain 124 70 -117.53 gain 70 125 -123.07 gain 125 70 -123.86 gain 70 126 -116.32 gain 126 70 -115.06 gain 70 127 -118.07 gain 127 70 -120.28 gain 70 128 -111.52 gain 128 70 -111.66 gain 70 129 -114.86 gain 129 70 -112.91 gain 70 130 -114.30 gain 130 70 -110.18 gain 70 131 -116.35 gain 131 70 -119.31 gain 70 132 -115.63 gain 132 70 -118.21 gain 70 133 -118.19 gain 133 70 -118.85 gain 70 134 -105.56 gain 134 70 -102.92 gain 70 135 -124.05 gain 135 70 -124.98 gain 70 136 -126.33 gain 136 70 -127.87 gain 70 137 -118.12 gain 137 70 -117.14 gain 70 138 -121.06 gain 138 70 -119.08 gain 70 139 -119.30 gain 139 70 -118.31 gain 70 140 -120.10 gain 140 70 -121.72 gain 70 141 -120.79 gain 141 70 -121.08 gain 70 142 -118.78 gain 142 70 -118.37 gain 70 143 -115.62 gain 143 70 -114.83 gain 70 144 -115.46 gain 144 70 -115.68 gain 70 145 -112.36 gain 145 70 -111.04 gain 70 146 -109.29 gain 146 70 -106.88 gain 70 147 -116.16 gain 147 70 -110.84 gain 70 148 -113.37 gain 148 70 -107.76 gain 70 149 -120.54 gain 149 70 -118.10 gain 70 150 -126.07 gain 150 70 -126.32 gain 70 151 -126.92 gain 151 70 -127.36 gain 70 152 -128.04 gain 152 70 -125.46 gain 70 153 -116.99 gain 153 70 -111.99 gain 70 154 -120.71 gain 154 70 -124.26 gain 70 155 -123.36 gain 155 70 -126.80 gain 70 156 -112.55 gain 156 70 -110.38 gain 70 157 -118.26 gain 157 70 -119.04 gain 70 158 -119.23 gain 158 70 -122.60 gain 70 159 -118.34 gain 159 70 -118.33 gain 70 160 -115.54 gain 160 70 -112.64 gain 70 161 -118.17 gain 161 70 -118.75 gain 70 162 -120.94 gain 162 70 -120.39 gain 70 163 -121.29 gain 163 70 -122.90 gain 70 164 -125.05 gain 164 70 -127.69 gain 70 165 -120.98 gain 165 70 -119.67 gain 70 166 -128.56 gain 166 70 -128.81 gain 70 167 -117.59 gain 167 70 -119.93 gain 70 168 -124.23 gain 168 70 -125.03 gain 70 169 -126.83 gain 169 70 -131.82 gain 70 170 -127.79 gain 170 70 -124.31 gain 70 171 -118.03 gain 171 70 -119.57 gain 70 172 -117.73 gain 172 70 -113.97 gain 70 173 -124.45 gain 173 70 -120.13 gain 70 174 -119.26 gain 174 70 -119.23 gain 70 175 -124.01 gain 175 70 -127.54 gain 70 176 -114.72 gain 176 70 -110.26 gain 70 177 -114.47 gain 177 70 -117.82 gain 70 178 -117.59 gain 178 70 -116.77 gain 70 179 -120.17 gain 179 70 -117.74 gain 70 180 -125.74 gain 180 70 -124.77 gain 70 181 -131.73 gain 181 70 -130.83 gain 70 182 -128.97 gain 182 70 -130.46 gain 70 183 -128.43 gain 183 70 -123.31 gain 70 184 -128.77 gain 184 70 -128.43 gain 70 185 -127.95 gain 185 70 -125.09 gain 70 186 -118.91 gain 186 70 -116.34 gain 70 187 -117.07 gain 187 70 -117.04 gain 70 188 -123.42 gain 188 70 -126.65 gain 70 189 -120.95 gain 189 70 -121.69 gain 70 190 -111.12 gain 190 70 -108.88 gain 70 191 -119.74 gain 191 70 -118.59 gain 70 192 -118.85 gain 192 70 -120.56 gain 70 193 -123.53 gain 193 70 -126.50 gain 70 194 -125.19 gain 194 70 -121.96 gain 70 195 -129.44 gain 195 70 -126.85 gain 70 196 -123.28 gain 196 70 -124.73 gain 70 197 -125.31 gain 197 70 -122.82 gain 70 198 -125.25 gain 198 70 -122.28 gain 70 199 -121.49 gain 199 70 -122.44 gain 70 200 -119.25 gain 200 70 -117.14 gain 70 201 -128.69 gain 201 70 -127.38 gain 70 202 -125.04 gain 202 70 -127.74 gain 70 203 -117.19 gain 203 70 -119.50 gain 70 204 -121.97 gain 204 70 -121.57 gain 70 205 -132.56 gain 205 70 -131.23 gain 70 206 -118.02 gain 206 70 -121.21 gain 70 207 -118.87 gain 207 70 -114.43 gain 70 208 -121.65 gain 208 70 -122.98 gain 70 209 -125.83 gain 209 70 -128.15 gain 70 210 -128.16 gain 210 70 -127.42 gain 70 211 -129.11 gain 211 70 -130.39 gain 70 212 -132.13 gain 212 70 -131.95 gain 70 213 -124.59 gain 213 70 -123.61 gain 70 214 -124.88 gain 214 70 -123.79 gain 70 215 -127.67 gain 215 70 -122.99 gain 70 216 -136.25 gain 216 70 -136.23 gain 70 217 -121.46 gain 217 70 -121.96 gain 70 218 -124.25 gain 218 70 -126.94 gain 70 219 -124.79 gain 219 70 -118.84 gain 70 220 -127.15 gain 220 70 -131.69 gain 70 221 -124.65 gain 221 70 -124.84 gain 70 222 -126.31 gain 222 70 -126.81 gain 70 223 -128.29 gain 223 70 -127.41 gain 70 224 -124.50 gain 224 70 -126.31 gain 71 72 -97.65 gain 72 71 -98.07 gain 71 73 -97.62 gain 73 71 -96.43 gain 71 74 -103.84 gain 74 71 -106.53 gain 71 75 -130.45 gain 75 71 -133.27 gain 71 76 -124.47 gain 76 71 -123.25 gain 71 77 -115.23 gain 77 71 -117.67 gain 71 78 -114.36 gain 78 71 -119.65 gain 71 79 -116.74 gain 79 71 -116.81 gain 71 80 -119.09 gain 80 71 -119.67 gain 71 81 -116.45 gain 81 71 -117.61 gain 71 82 -109.06 gain 82 71 -107.85 gain 71 83 -104.07 gain 83 71 -103.89 gain 71 84 -100.45 gain 84 71 -100.42 gain 71 85 -104.74 gain 85 71 -101.52 gain 71 86 -89.12 gain 86 71 -89.28 gain 71 87 -95.07 gain 87 71 -99.20 gain 71 88 -104.24 gain 88 71 -106.11 gain 71 89 -106.96 gain 89 71 -107.44 gain 71 90 -129.63 gain 90 71 -127.11 gain 71 91 -118.74 gain 91 71 -120.17 gain 71 92 -122.74 gain 92 71 -121.13 gain 71 93 -118.82 gain 93 71 -121.99 gain 71 94 -115.94 gain 94 71 -118.99 gain 71 95 -112.88 gain 95 71 -118.18 gain 71 96 -110.13 gain 96 71 -112.77 gain 71 97 -113.42 gain 97 71 -114.80 gain 71 98 -114.77 gain 98 71 -116.96 gain 71 99 -100.28 gain 99 71 -100.29 gain 71 100 -101.76 gain 100 71 -101.33 gain 71 101 -104.33 gain 101 71 -104.06 gain 71 102 -104.91 gain 102 71 -105.42 gain 71 103 -103.48 gain 103 71 -101.48 gain 71 104 -110.24 gain 104 71 -113.62 gain 71 105 -131.61 gain 105 71 -130.92 gain 71 106 -121.90 gain 106 71 -122.30 gain 71 107 -120.09 gain 107 71 -127.06 gain 71 108 -118.18 gain 108 71 -117.47 gain 71 109 -122.07 gain 109 71 -124.84 gain 71 110 -116.44 gain 110 71 -117.69 gain 71 111 -128.55 gain 111 71 -129.47 gain 71 112 -109.92 gain 112 71 -109.72 gain 71 113 -105.85 gain 113 71 -104.46 gain 71 114 -102.13 gain 114 71 -104.04 gain 71 115 -100.95 gain 115 71 -97.16 gain 71 116 -102.29 gain 116 71 -106.05 gain 71 117 -106.50 gain 117 71 -111.76 gain 71 118 -111.95 gain 118 71 -115.52 gain 71 119 -118.05 gain 119 71 -116.29 gain 71 120 -129.38 gain 120 71 -132.14 gain 71 121 -121.63 gain 121 71 -123.67 gain 71 122 -122.22 gain 122 71 -126.38 gain 71 123 -121.16 gain 123 71 -126.10 gain 71 124 -114.74 gain 124 71 -116.08 gain 71 125 -119.92 gain 125 71 -122.60 gain 71 126 -119.57 gain 126 71 -120.20 gain 71 127 -117.20 gain 127 71 -121.30 gain 71 128 -113.01 gain 128 71 -115.05 gain 71 129 -109.71 gain 129 71 -109.66 gain 71 130 -108.27 gain 130 71 -106.03 gain 71 131 -109.41 gain 131 71 -114.26 gain 71 132 -113.29 gain 132 71 -117.77 gain 71 133 -109.49 gain 133 71 -112.04 gain 71 134 -116.20 gain 134 71 -115.45 gain 71 135 -126.14 gain 135 71 -128.96 gain 71 136 -121.73 gain 136 71 -125.16 gain 71 137 -126.82 gain 137 71 -127.73 gain 71 138 -117.53 gain 138 71 -117.44 gain 71 139 -116.26 gain 139 71 -117.16 gain 71 140 -124.77 gain 140 71 -128.28 gain 71 141 -117.70 gain 141 71 -119.89 gain 71 142 -120.87 gain 142 71 -122.35 gain 71 143 -121.83 gain 143 71 -122.93 gain 71 144 -109.73 gain 144 71 -111.85 gain 71 145 -115.63 gain 145 71 -116.20 gain 71 146 -124.60 gain 146 71 -124.08 gain 71 147 -110.48 gain 147 71 -107.05 gain 71 148 -115.25 gain 148 71 -111.53 gain 71 149 -115.06 gain 149 71 -114.51 gain 71 150 -122.25 gain 150 71 -124.39 gain 71 151 -123.82 gain 151 71 -126.16 gain 71 152 -124.58 gain 152 71 -123.89 gain 71 153 -133.09 gain 153 71 -129.99 gain 71 154 -119.72 gain 154 71 -125.16 gain 71 155 -119.39 gain 155 71 -124.73 gain 71 156 -113.62 gain 156 71 -113.34 gain 71 157 -110.00 gain 157 71 -112.67 gain 71 158 -118.25 gain 158 71 -123.51 gain 71 159 -113.30 gain 159 71 -115.18 gain 71 160 -115.38 gain 160 71 -114.37 gain 71 161 -113.54 gain 161 71 -116.03 gain 71 162 -118.94 gain 162 71 -120.29 gain 71 163 -116.74 gain 163 71 -120.24 gain 71 164 -118.97 gain 164 71 -123.51 gain 71 165 -123.61 gain 165 71 -124.18 gain 71 166 -125.50 gain 166 71 -127.65 gain 71 167 -123.87 gain 167 71 -128.11 gain 71 168 -120.91 gain 168 71 -123.60 gain 71 169 -124.52 gain 169 71 -131.41 gain 71 170 -124.26 gain 170 71 -122.68 gain 71 171 -116.11 gain 171 71 -119.55 gain 71 172 -121.07 gain 172 71 -119.21 gain 71 173 -118.47 gain 173 71 -116.04 gain 71 174 -117.78 gain 174 71 -119.65 gain 71 175 -122.63 gain 175 71 -128.05 gain 71 176 -122.75 gain 176 71 -120.18 gain 71 177 -113.32 gain 177 71 -118.57 gain 71 178 -113.89 gain 178 71 -114.96 gain 71 179 -124.16 gain 179 71 -123.62 gain 71 180 -126.48 gain 180 71 -127.41 gain 71 181 -126.65 gain 181 71 -127.65 gain 71 182 -124.72 gain 182 71 -128.10 gain 71 183 -118.22 gain 183 71 -115.00 gain 71 184 -126.76 gain 184 71 -128.31 gain 71 185 -126.12 gain 185 71 -125.16 gain 71 186 -117.97 gain 186 71 -117.29 gain 71 187 -121.88 gain 187 71 -123.74 gain 71 188 -119.78 gain 188 71 -124.90 gain 71 189 -113.42 gain 189 71 -116.06 gain 71 190 -120.44 gain 190 71 -120.09 gain 71 191 -124.18 gain 191 71 -124.92 gain 71 192 -121.06 gain 192 71 -124.67 gain 71 193 -114.77 gain 193 71 -119.63 gain 71 194 -128.73 gain 194 71 -127.40 gain 71 195 -131.18 gain 195 71 -130.48 gain 71 196 -127.15 gain 196 71 -130.49 gain 71 197 -120.53 gain 197 71 -119.94 gain 71 198 -125.44 gain 198 71 -124.37 gain 71 199 -127.98 gain 199 71 -130.82 gain 71 200 -125.61 gain 200 71 -125.39 gain 71 201 -115.26 gain 201 71 -115.84 gain 71 202 -114.31 gain 202 71 -118.90 gain 71 203 -120.29 gain 203 71 -124.50 gain 71 204 -124.59 gain 204 71 -126.08 gain 71 205 -122.89 gain 205 71 -123.46 gain 71 206 -127.54 gain 206 71 -132.62 gain 71 207 -122.47 gain 207 71 -119.92 gain 71 208 -123.36 gain 208 71 -126.58 gain 71 209 -125.17 gain 209 71 -129.39 gain 71 210 -125.75 gain 210 71 -126.91 gain 71 211 -129.74 gain 211 71 -132.92 gain 71 212 -119.58 gain 212 71 -121.30 gain 71 213 -122.59 gain 213 71 -123.50 gain 71 214 -129.97 gain 214 71 -130.77 gain 71 215 -120.96 gain 215 71 -118.17 gain 71 216 -119.35 gain 216 71 -121.22 gain 71 217 -122.25 gain 217 71 -124.65 gain 71 218 -121.83 gain 218 71 -126.41 gain 71 219 -118.84 gain 219 71 -114.79 gain 71 220 -123.59 gain 220 71 -130.03 gain 71 221 -125.84 gain 221 71 -127.91 gain 71 222 -126.85 gain 222 71 -129.25 gain 71 223 -124.16 gain 223 71 -125.17 gain 71 224 -126.38 gain 224 71 -130.08 gain 72 73 -99.88 gain 73 72 -98.27 gain 72 74 -100.39 gain 74 72 -102.66 gain 72 75 -123.31 gain 75 72 -125.72 gain 72 76 -119.59 gain 76 72 -117.95 gain 72 77 -121.53 gain 77 72 -123.55 gain 72 78 -117.91 gain 78 72 -122.78 gain 72 79 -122.00 gain 79 72 -121.66 gain 72 80 -117.18 gain 80 72 -117.34 gain 72 81 -112.20 gain 81 72 -112.94 gain 72 82 -114.65 gain 82 72 -113.02 gain 72 83 -110.79 gain 83 72 -110.20 gain 72 84 -110.28 gain 84 72 -109.83 gain 72 85 -101.09 gain 85 72 -97.46 gain 72 86 -97.03 gain 86 72 -96.78 gain 72 87 -98.93 gain 87 72 -102.64 gain 72 88 -104.87 gain 88 72 -106.33 gain 72 89 -98.50 gain 89 72 -98.56 gain 72 90 -121.41 gain 90 72 -118.48 gain 72 91 -124.17 gain 91 72 -125.18 gain 72 92 -123.51 gain 92 72 -121.48 gain 72 93 -117.55 gain 93 72 -120.31 gain 72 94 -120.59 gain 94 72 -123.22 gain 72 95 -118.75 gain 95 72 -123.63 gain 72 96 -112.00 gain 96 72 -114.23 gain 72 97 -113.27 gain 97 72 -114.25 gain 72 98 -113.04 gain 98 72 -114.81 gain 72 99 -106.63 gain 99 72 -106.22 gain 72 100 -107.52 gain 100 72 -106.67 gain 72 101 -103.04 gain 101 72 -102.36 gain 72 102 -98.59 gain 102 72 -98.69 gain 72 103 -107.69 gain 103 72 -105.27 gain 72 104 -107.50 gain 104 72 -110.46 gain 72 105 -127.38 gain 105 72 -126.28 gain 72 106 -117.28 gain 106 72 -117.27 gain 72 107 -126.03 gain 107 72 -132.59 gain 72 108 -119.41 gain 108 72 -118.28 gain 72 109 -121.62 gain 109 72 -123.98 gain 72 110 -124.34 gain 110 72 -125.17 gain 72 111 -120.94 gain 111 72 -121.45 gain 72 112 -114.47 gain 112 72 -113.85 gain 72 113 -115.40 gain 113 72 -113.59 gain 72 114 -111.84 gain 114 72 -113.33 gain 72 115 -105.58 gain 115 72 -101.38 gain 72 116 -108.47 gain 116 72 -111.81 gain 72 117 -108.73 gain 117 72 -113.57 gain 72 118 -101.86 gain 118 72 -105.02 gain 72 119 -110.65 gain 119 72 -108.47 gain 72 120 -131.54 gain 120 72 -133.88 gain 72 121 -119.73 gain 121 72 -121.36 gain 72 122 -130.82 gain 122 72 -134.56 gain 72 123 -123.37 gain 123 72 -127.89 gain 72 124 -121.82 gain 124 72 -122.75 gain 72 125 -110.48 gain 125 72 -112.75 gain 72 126 -123.14 gain 126 72 -123.36 gain 72 127 -112.75 gain 127 72 -116.43 gain 72 128 -110.10 gain 128 72 -111.72 gain 72 129 -116.53 gain 129 72 -116.06 gain 72 130 -120.27 gain 130 72 -117.62 gain 72 131 -104.73 gain 131 72 -109.17 gain 72 132 -112.11 gain 132 72 -116.18 gain 72 133 -112.73 gain 133 72 -114.86 gain 72 134 -117.33 gain 134 72 -116.16 gain 72 135 -121.98 gain 135 72 -124.39 gain 72 136 -133.21 gain 136 72 -136.23 gain 72 137 -121.71 gain 137 72 -122.21 gain 72 138 -127.55 gain 138 72 -127.05 gain 72 139 -122.39 gain 139 72 -122.88 gain 72 140 -131.61 gain 140 72 -134.70 gain 72 141 -111.66 gain 141 72 -113.43 gain 72 142 -118.25 gain 142 72 -119.32 gain 72 143 -118.84 gain 143 72 -119.52 gain 72 144 -116.37 gain 144 72 -118.08 gain 72 145 -114.18 gain 145 72 -114.34 gain 72 146 -107.41 gain 146 72 -106.48 gain 72 147 -113.85 gain 147 72 -110.00 gain 72 148 -110.86 gain 148 72 -106.73 gain 72 149 -111.79 gain 149 72 -110.83 gain 72 150 -123.00 gain 150 72 -124.73 gain 72 151 -127.54 gain 151 72 -129.46 gain 72 152 -124.10 gain 152 72 -123.00 gain 72 153 -115.37 gain 153 72 -111.84 gain 72 154 -124.82 gain 154 72 -129.85 gain 72 155 -127.86 gain 155 72 -132.78 gain 72 156 -116.38 gain 156 72 -115.69 gain 72 157 -122.08 gain 157 72 -124.33 gain 72 158 -113.53 gain 158 72 -118.37 gain 72 159 -115.84 gain 159 72 -117.31 gain 72 160 -113.37 gain 160 72 -111.94 gain 72 161 -116.46 gain 161 72 -118.52 gain 72 162 -115.87 gain 162 72 -116.80 gain 72 163 -116.81 gain 163 72 -119.89 gain 72 164 -110.65 gain 164 72 -114.77 gain 72 165 -126.56 gain 165 72 -126.72 gain 72 166 -124.49 gain 166 72 -126.22 gain 72 167 -123.59 gain 167 72 -127.41 gain 72 168 -125.64 gain 168 72 -127.92 gain 72 169 -116.28 gain 169 72 -122.75 gain 72 170 -124.33 gain 170 72 -122.32 gain 72 171 -121.02 gain 171 72 -124.04 gain 72 172 -120.10 gain 172 72 -117.82 gain 72 173 -120.70 gain 173 72 -117.85 gain 72 174 -116.47 gain 174 72 -117.93 gain 72 175 -109.02 gain 175 72 -114.02 gain 72 176 -115.73 gain 176 72 -112.75 gain 72 177 -123.16 gain 177 72 -127.99 gain 72 178 -118.61 gain 178 72 -119.26 gain 72 179 -117.30 gain 179 72 -116.34 gain 72 180 -130.57 gain 180 72 -131.08 gain 72 181 -129.47 gain 181 72 -130.05 gain 72 182 -129.50 gain 182 72 -132.47 gain 72 183 -124.48 gain 183 72 -120.83 gain 72 184 -127.26 gain 184 72 -128.40 gain 72 185 -127.71 gain 185 72 -126.33 gain 72 186 -121.29 gain 186 72 -120.20 gain 72 187 -121.81 gain 187 72 -123.26 gain 72 188 -122.26 gain 188 72 -126.97 gain 72 189 -121.71 gain 189 72 -123.93 gain 72 190 -120.45 gain 190 72 -119.68 gain 72 191 -116.68 gain 191 72 -117.00 gain 72 192 -117.70 gain 192 72 -120.90 gain 72 193 -120.43 gain 193 72 -124.87 gain 72 194 -120.12 gain 194 72 -118.37 gain 72 195 -124.08 gain 195 72 -122.96 gain 72 196 -131.59 gain 196 72 -134.52 gain 72 197 -130.98 gain 197 72 -129.97 gain 72 198 -127.46 gain 198 72 -125.97 gain 72 199 -129.43 gain 199 72 -131.86 gain 72 200 -127.29 gain 200 72 -126.66 gain 72 201 -126.23 gain 201 72 -126.40 gain 72 202 -120.53 gain 202 72 -124.71 gain 72 203 -120.48 gain 203 72 -124.27 gain 72 204 -118.38 gain 204 72 -119.46 gain 72 205 -122.03 gain 205 72 -122.18 gain 72 206 -118.27 gain 206 72 -122.94 gain 72 207 -111.12 gain 207 72 -108.16 gain 72 208 -124.80 gain 208 72 -127.61 gain 72 209 -118.07 gain 209 72 -121.87 gain 72 210 -123.18 gain 210 72 -123.92 gain 72 211 -135.54 gain 211 72 -138.31 gain 72 212 -132.55 gain 212 72 -133.85 gain 72 213 -131.31 gain 213 72 -131.81 gain 72 214 -128.16 gain 214 72 -128.54 gain 72 215 -123.33 gain 215 72 -120.13 gain 72 216 -123.64 gain 216 72 -125.10 gain 72 217 -126.49 gain 217 72 -128.47 gain 72 218 -120.50 gain 218 72 -124.66 gain 72 219 -124.60 gain 219 72 -120.12 gain 72 220 -126.69 gain 220 72 -132.71 gain 72 221 -124.14 gain 221 72 -125.80 gain 72 222 -126.18 gain 222 72 -128.16 gain 72 223 -122.97 gain 223 72 -123.57 gain 72 224 -120.78 gain 224 72 -124.06 gain 73 74 -81.84 gain 74 73 -85.71 gain 73 75 -124.61 gain 75 73 -128.62 gain 73 76 -127.64 gain 76 73 -127.60 gain 73 77 -121.06 gain 77 73 -124.69 gain 73 78 -126.33 gain 78 73 -132.81 gain 73 79 -128.15 gain 79 73 -129.42 gain 73 80 -127.44 gain 80 73 -129.21 gain 73 81 -119.08 gain 81 73 -121.44 gain 73 82 -105.18 gain 82 73 -105.16 gain 73 83 -116.39 gain 83 73 -117.40 gain 73 84 -118.87 gain 84 73 -120.03 gain 73 85 -104.07 gain 85 73 -102.04 gain 73 86 -99.95 gain 86 73 -101.31 gain 73 87 -97.18 gain 87 73 -102.50 gain 73 88 -90.96 gain 88 73 -94.03 gain 73 89 -95.80 gain 89 73 -97.46 gain 73 90 -122.80 gain 90 73 -121.48 gain 73 91 -123.64 gain 91 73 -126.26 gain 73 92 -116.69 gain 92 73 -116.27 gain 73 93 -120.91 gain 93 73 -125.28 gain 73 94 -118.12 gain 94 73 -122.36 gain 73 95 -120.16 gain 95 73 -126.65 gain 73 96 -115.04 gain 96 73 -118.87 gain 73 97 -118.09 gain 97 73 -120.67 gain 73 98 -115.32 gain 98 73 -118.70 gain 73 99 -112.53 gain 99 73 -113.73 gain 73 100 -99.69 gain 100 73 -100.46 gain 73 101 -107.43 gain 101 73 -108.36 gain 73 102 -105.88 gain 102 73 -107.59 gain 73 103 -104.25 gain 103 73 -103.45 gain 73 104 -102.69 gain 104 73 -107.26 gain 73 105 -117.45 gain 105 73 -117.96 gain 73 106 -127.52 gain 106 73 -129.11 gain 73 107 -123.13 gain 107 73 -131.29 gain 73 108 -130.21 gain 108 73 -130.69 gain 73 109 -120.80 gain 109 73 -124.77 gain 73 110 -122.24 gain 110 73 -124.67 gain 73 111 -116.54 gain 111 73 -118.66 gain 73 112 -111.65 gain 112 73 -112.65 gain 73 113 -110.40 gain 113 73 -110.20 gain 73 114 -109.98 gain 114 73 -113.09 gain 73 115 -104.56 gain 115 73 -101.97 gain 73 116 -109.03 gain 116 73 -113.98 gain 73 117 -104.81 gain 117 73 -111.26 gain 73 118 -107.73 gain 118 73 -112.50 gain 73 119 -106.20 gain 119 73 -105.63 gain 73 120 -113.62 gain 120 73 -117.57 gain 73 121 -124.38 gain 121 73 -127.61 gain 73 122 -123.48 gain 122 73 -128.83 gain 73 123 -119.84 gain 123 73 -125.97 gain 73 124 -112.92 gain 124 73 -115.46 gain 73 125 -121.60 gain 125 73 -125.47 gain 73 126 -113.04 gain 126 73 -114.87 gain 73 127 -118.30 gain 127 73 -123.59 gain 73 128 -116.37 gain 128 73 -119.60 gain 73 129 -109.29 gain 129 73 -110.43 gain 73 130 -103.12 gain 130 73 -102.08 gain 73 131 -115.61 gain 131 73 -121.66 gain 73 132 -102.50 gain 132 73 -108.18 gain 73 133 -106.80 gain 133 73 -110.54 gain 73 134 -109.15 gain 134 73 -109.60 gain 73 135 -129.10 gain 135 73 -133.11 gain 73 136 -128.80 gain 136 73 -133.43 gain 73 137 -127.32 gain 137 73 -129.43 gain 73 138 -127.97 gain 138 73 -129.08 gain 73 139 -127.45 gain 139 73 -129.54 gain 73 140 -126.56 gain 140 73 -131.26 gain 73 141 -122.09 gain 141 73 -125.46 gain 73 142 -115.44 gain 142 73 -118.12 gain 73 143 -120.36 gain 143 73 -122.65 gain 73 144 -109.28 gain 144 73 -112.59 gain 73 145 -114.82 gain 145 73 -116.58 gain 73 146 -117.25 gain 146 73 -117.92 gain 73 147 -107.24 gain 147 73 -105.00 gain 73 148 -115.51 gain 148 73 -112.99 gain 73 149 -112.70 gain 149 73 -113.34 gain 73 150 -118.29 gain 150 73 -121.62 gain 73 151 -122.84 gain 151 73 -126.37 gain 73 152 -119.84 gain 152 73 -120.35 gain 73 153 -126.85 gain 153 73 -124.93 gain 73 154 -119.83 gain 154 73 -126.46 gain 73 155 -124.17 gain 155 73 -130.70 gain 73 156 -114.87 gain 156 73 -115.79 gain 73 157 -120.95 gain 157 73 -124.81 gain 73 158 -111.10 gain 158 73 -117.56 gain 73 159 -116.58 gain 159 73 -119.65 gain 73 160 -116.26 gain 160 73 -116.44 gain 73 161 -113.16 gain 161 73 -116.83 gain 73 162 -117.64 gain 162 73 -120.18 gain 73 163 -113.42 gain 163 73 -118.10 gain 73 164 -115.16 gain 164 73 -120.89 gain 73 165 -120.39 gain 165 73 -122.16 gain 73 166 -119.76 gain 166 73 -123.10 gain 73 167 -126.54 gain 167 73 -131.97 gain 73 168 -121.77 gain 168 73 -125.65 gain 73 169 -127.42 gain 169 73 -135.50 gain 73 170 -126.13 gain 170 73 -125.74 gain 73 171 -119.65 gain 171 73 -124.28 gain 73 172 -118.26 gain 172 73 -117.58 gain 73 173 -128.29 gain 173 73 -127.05 gain 73 174 -124.89 gain 174 73 -127.95 gain 73 175 -117.48 gain 175 73 -124.09 gain 73 176 -119.53 gain 176 73 -118.15 gain 73 177 -112.13 gain 177 73 -118.56 gain 73 178 -115.07 gain 178 73 -117.33 gain 73 179 -115.31 gain 179 73 -115.96 gain 73 180 -128.20 gain 180 73 -130.32 gain 73 181 -128.10 gain 181 73 -130.28 gain 73 182 -123.83 gain 182 73 -128.41 gain 73 183 -125.80 gain 183 73 -123.77 gain 73 184 -124.23 gain 184 73 -126.97 gain 73 185 -127.14 gain 185 73 -127.37 gain 73 186 -122.86 gain 186 73 -123.37 gain 73 187 -114.98 gain 187 73 -118.04 gain 73 188 -113.20 gain 188 73 -119.51 gain 73 189 -124.38 gain 189 73 -128.21 gain 73 190 -115.18 gain 190 73 -116.03 gain 73 191 -117.40 gain 191 73 -119.34 gain 73 192 -114.23 gain 192 73 -119.03 gain 73 193 -117.53 gain 193 73 -123.59 gain 73 194 -113.23 gain 194 73 -113.10 gain 73 195 -123.04 gain 195 73 -123.54 gain 73 196 -126.93 gain 196 73 -131.47 gain 73 197 -132.63 gain 197 73 -133.23 gain 73 198 -117.23 gain 198 73 -117.35 gain 73 199 -121.87 gain 199 73 -125.91 gain 73 200 -120.97 gain 200 73 -121.95 gain 73 201 -124.70 gain 201 73 -126.48 gain 73 202 -120.93 gain 202 73 -126.71 gain 73 203 -116.65 gain 203 73 -122.05 gain 73 204 -121.78 gain 204 73 -124.46 gain 73 205 -123.64 gain 205 73 -125.40 gain 73 206 -118.00 gain 206 73 -124.28 gain 73 207 -117.41 gain 207 73 -116.05 gain 73 208 -122.07 gain 208 73 -126.49 gain 73 209 -124.43 gain 209 73 -129.84 gain 73 210 -124.66 gain 210 73 -127.01 gain 73 211 -130.69 gain 211 73 -135.06 gain 73 212 -127.84 gain 212 73 -130.75 gain 73 213 -129.72 gain 213 73 -131.83 gain 73 214 -132.41 gain 214 73 -134.40 gain 73 215 -126.01 gain 215 73 -124.42 gain 73 216 -123.26 gain 216 73 -126.33 gain 73 217 -121.25 gain 217 73 -124.84 gain 73 218 -119.88 gain 218 73 -125.66 gain 73 219 -119.48 gain 219 73 -116.61 gain 73 220 -122.15 gain 220 73 -129.78 gain 73 221 -126.21 gain 221 73 -129.47 gain 73 222 -121.16 gain 222 73 -124.76 gain 73 223 -117.61 gain 223 73 -119.81 gain 73 224 -124.06 gain 224 73 -128.95 gain 74 75 -125.49 gain 75 74 -125.63 gain 74 76 -128.12 gain 76 74 -124.21 gain 74 77 -120.98 gain 77 74 -120.74 gain 74 78 -126.62 gain 78 74 -129.23 gain 74 79 -127.19 gain 79 74 -124.57 gain 74 80 -124.84 gain 80 74 -122.73 gain 74 81 -117.08 gain 81 74 -115.56 gain 74 82 -114.85 gain 82 74 -110.95 gain 74 83 -117.14 gain 83 74 -114.28 gain 74 84 -112.81 gain 84 74 -110.10 gain 74 85 -116.20 gain 85 74 -110.29 gain 74 86 -103.23 gain 86 74 -100.70 gain 74 87 -103.19 gain 87 74 -104.63 gain 74 88 -100.77 gain 88 74 -99.96 gain 74 89 -99.92 gain 89 74 -97.71 gain 74 90 -127.85 gain 90 74 -122.65 gain 74 91 -123.25 gain 91 74 -121.99 gain 74 92 -130.10 gain 92 74 -125.81 gain 74 93 -119.89 gain 93 74 -120.38 gain 74 94 -124.59 gain 94 74 -124.95 gain 74 95 -122.90 gain 95 74 -125.52 gain 74 96 -120.45 gain 96 74 -120.41 gain 74 97 -118.57 gain 97 74 -117.27 gain 74 98 -116.58 gain 98 74 -116.08 gain 74 99 -119.93 gain 99 74 -117.25 gain 74 100 -111.60 gain 100 74 -108.48 gain 74 101 -111.84 gain 101 74 -108.89 gain 74 102 -103.22 gain 102 74 -101.05 gain 74 103 -108.71 gain 103 74 -104.02 gain 74 104 -103.66 gain 104 74 -104.35 gain 74 105 -132.20 gain 105 74 -128.83 gain 74 106 -126.03 gain 106 74 -123.75 gain 74 107 -125.88 gain 107 74 -130.16 gain 74 108 -125.38 gain 108 74 -121.98 gain 74 109 -116.64 gain 109 74 -116.73 gain 74 110 -128.43 gain 110 74 -126.99 gain 74 111 -120.91 gain 111 74 -119.15 gain 74 112 -120.37 gain 112 74 -117.49 gain 74 113 -120.09 gain 113 74 -116.01 gain 74 114 -122.95 gain 114 74 -122.18 gain 74 115 -109.18 gain 115 74 -102.71 gain 74 116 -115.63 gain 116 74 -116.70 gain 74 117 -120.01 gain 117 74 -122.58 gain 74 118 -112.86 gain 118 74 -113.76 gain 74 119 -108.79 gain 119 74 -104.34 gain 74 120 -135.95 gain 120 74 -136.02 gain 74 121 -127.30 gain 121 74 -126.66 gain 74 122 -120.85 gain 122 74 -122.33 gain 74 123 -130.02 gain 123 74 -132.28 gain 74 124 -125.44 gain 124 74 -124.10 gain 74 125 -128.98 gain 125 74 -128.98 gain 74 126 -125.31 gain 126 74 -123.26 gain 74 127 -123.41 gain 127 74 -124.82 gain 74 128 -119.03 gain 128 74 -118.38 gain 74 129 -117.00 gain 129 74 -114.26 gain 74 130 -119.57 gain 130 74 -114.65 gain 74 131 -109.19 gain 131 74 -111.36 gain 74 132 -121.41 gain 132 74 -123.21 gain 74 133 -109.06 gain 133 74 -108.93 gain 74 134 -113.72 gain 134 74 -110.29 gain 74 135 -127.81 gain 135 74 -127.95 gain 74 136 -129.12 gain 136 74 -129.87 gain 74 137 -123.69 gain 137 74 -121.92 gain 74 138 -125.06 gain 138 74 -122.29 gain 74 139 -125.79 gain 139 74 -124.00 gain 74 140 -130.81 gain 140 74 -131.64 gain 74 141 -123.04 gain 141 74 -122.53 gain 74 142 -121.20 gain 142 74 -120.00 gain 74 143 -128.63 gain 143 74 -127.05 gain 74 144 -117.03 gain 144 74 -116.46 gain 74 145 -117.33 gain 145 74 -115.22 gain 74 146 -124.36 gain 146 74 -121.16 gain 74 147 -112.66 gain 147 74 -106.54 gain 74 148 -121.09 gain 148 74 -114.70 gain 74 149 -117.01 gain 149 74 -113.78 gain 74 150 -126.63 gain 150 74 -126.08 gain 74 151 -127.52 gain 151 74 -127.17 gain 74 152 -128.00 gain 152 74 -124.63 gain 74 153 -132.85 gain 153 74 -127.06 gain 74 154 -129.89 gain 154 74 -132.65 gain 74 155 -126.00 gain 155 74 -128.65 gain 74 156 -128.14 gain 156 74 -125.18 gain 74 157 -122.66 gain 157 74 -122.64 gain 74 158 -114.78 gain 158 74 -117.36 gain 74 159 -116.26 gain 159 74 -115.46 gain 74 160 -119.30 gain 160 74 -115.60 gain 74 161 -128.49 gain 161 74 -128.29 gain 74 162 -123.99 gain 162 74 -122.65 gain 74 163 -124.97 gain 163 74 -125.79 gain 74 164 -116.81 gain 164 74 -118.67 gain 74 165 -134.96 gain 165 74 -132.86 gain 74 166 -129.42 gain 166 74 -128.88 gain 74 167 -127.68 gain 167 74 -129.24 gain 74 168 -121.37 gain 168 74 -121.37 gain 74 169 -124.19 gain 169 74 -128.39 gain 74 170 -125.32 gain 170 74 -121.05 gain 74 171 -132.53 gain 171 74 -133.29 gain 74 172 -121.44 gain 172 74 -116.89 gain 74 173 -119.54 gain 173 74 -114.43 gain 74 174 -121.27 gain 174 74 -120.45 gain 74 175 -124.45 gain 175 74 -127.18 gain 74 176 -121.22 gain 176 74 -115.97 gain 74 177 -128.05 gain 177 74 -130.61 gain 74 178 -116.35 gain 178 74 -114.73 gain 74 179 -122.51 gain 179 74 -119.28 gain 74 180 -133.90 gain 180 74 -132.14 gain 74 181 -130.86 gain 181 74 -129.18 gain 74 182 -133.26 gain 182 74 -133.96 gain 74 183 -135.73 gain 183 74 -129.82 gain 74 184 -129.03 gain 184 74 -127.90 gain 74 185 -128.82 gain 185 74 -125.18 gain 74 186 -123.94 gain 186 74 -120.58 gain 74 187 -126.45 gain 187 74 -125.63 gain 74 188 -117.04 gain 188 74 -119.48 gain 74 189 -120.79 gain 189 74 -120.75 gain 74 190 -117.90 gain 190 74 -114.86 gain 74 191 -119.54 gain 191 74 -117.59 gain 74 192 -117.52 gain 192 74 -118.44 gain 74 193 -128.94 gain 193 74 -131.11 gain 74 194 -120.18 gain 194 74 -116.17 gain 74 195 -130.43 gain 195 74 -127.05 gain 74 196 -134.83 gain 196 74 -135.49 gain 74 197 -134.22 gain 197 74 -130.94 gain 74 198 -126.91 gain 198 74 -123.15 gain 74 199 -126.96 gain 199 74 -127.12 gain 74 200 -124.26 gain 200 74 -121.36 gain 74 201 -130.58 gain 201 74 -128.48 gain 74 202 -122.46 gain 202 74 -124.36 gain 74 203 -127.56 gain 203 74 -129.08 gain 74 204 -124.24 gain 204 74 -123.05 gain 74 205 -129.36 gain 205 74 -127.25 gain 74 206 -124.23 gain 206 74 -126.63 gain 74 207 -124.17 gain 207 74 -118.93 gain 74 208 -121.21 gain 208 74 -121.75 gain 74 209 -126.26 gain 209 74 -127.79 gain 74 210 -130.07 gain 210 74 -128.53 gain 74 211 -134.29 gain 211 74 -134.78 gain 74 212 -127.76 gain 212 74 -126.79 gain 74 213 -128.76 gain 213 74 -126.99 gain 74 214 -124.59 gain 214 74 -122.71 gain 74 215 -120.94 gain 215 74 -115.47 gain 74 216 -123.05 gain 216 74 -122.24 gain 74 217 -130.26 gain 217 74 -129.97 gain 74 218 -130.54 gain 218 74 -132.44 gain 74 219 -126.36 gain 219 74 -119.62 gain 74 220 -127.50 gain 220 74 -131.25 gain 74 221 -125.28 gain 221 74 -124.67 gain 74 222 -134.19 gain 222 74 -133.91 gain 74 223 -120.30 gain 223 74 -118.63 gain 74 224 -126.60 gain 224 74 -127.62 gain 75 76 -97.11 gain 76 75 -93.06 gain 75 77 -105.28 gain 77 75 -104.90 gain 75 78 -110.33 gain 78 75 -112.79 gain 75 79 -117.82 gain 79 75 -115.07 gain 75 80 -113.35 gain 80 75 -111.10 gain 75 81 -118.74 gain 81 75 -117.08 gain 75 82 -123.08 gain 82 75 -119.05 gain 75 83 -121.42 gain 83 75 -118.42 gain 75 84 -125.27 gain 84 75 -122.42 gain 75 85 -127.24 gain 85 75 -121.20 gain 75 86 -119.70 gain 86 75 -117.04 gain 75 87 -128.80 gain 87 75 -130.10 gain 75 88 -126.64 gain 88 75 -125.69 gain 75 89 -131.28 gain 89 75 -128.93 gain 75 90 -97.51 gain 90 75 -92.17 gain 75 91 -91.16 gain 91 75 -89.76 gain 75 92 -109.66 gain 92 75 -105.22 gain 75 93 -110.90 gain 93 75 -111.25 gain 75 94 -107.82 gain 94 75 -108.05 gain 75 95 -120.22 gain 95 75 -122.69 gain 75 96 -117.01 gain 96 75 -116.83 gain 75 97 -126.52 gain 97 75 -125.08 gain 75 98 -119.24 gain 98 75 -118.60 gain 75 99 -120.75 gain 99 75 -117.93 gain 75 100 -126.72 gain 100 75 -123.47 gain 75 101 -124.66 gain 101 75 -121.57 gain 75 102 -124.26 gain 102 75 -121.95 gain 75 103 -130.59 gain 103 75 -125.76 gain 75 104 -127.98 gain 104 75 -128.53 gain 75 105 -105.93 gain 105 75 -102.43 gain 75 106 -104.19 gain 106 75 -101.76 gain 75 107 -102.93 gain 107 75 -107.07 gain 75 108 -116.70 gain 108 75 -113.16 gain 75 109 -113.43 gain 109 75 -113.38 gain 75 110 -111.71 gain 110 75 -110.13 gain 75 111 -113.36 gain 111 75 -111.46 gain 75 112 -115.67 gain 112 75 -112.65 gain 75 113 -117.23 gain 113 75 -113.02 gain 75 114 -124.72 gain 114 75 -123.81 gain 75 115 -125.29 gain 115 75 -118.68 gain 75 116 -125.28 gain 116 75 -126.21 gain 75 117 -123.21 gain 117 75 -125.64 gain 75 118 -132.16 gain 118 75 -132.91 gain 75 119 -131.02 gain 119 75 -126.44 gain 75 120 -111.07 gain 120 75 -111.00 gain 75 121 -108.78 gain 121 75 -108.00 gain 75 122 -106.31 gain 122 75 -107.64 gain 75 123 -104.46 gain 123 75 -106.57 gain 75 124 -116.61 gain 124 75 -115.13 gain 75 125 -115.34 gain 125 75 -115.20 gain 75 126 -116.19 gain 126 75 -114.00 gain 75 127 -122.04 gain 127 75 -123.31 gain 75 128 -114.49 gain 128 75 -113.70 gain 75 129 -120.11 gain 129 75 -117.23 gain 75 130 -120.42 gain 130 75 -115.36 gain 75 131 -123.11 gain 131 75 -125.14 gain 75 132 -122.90 gain 132 75 -124.55 gain 75 133 -131.23 gain 133 75 -130.96 gain 75 134 -124.52 gain 134 75 -120.95 gain 75 135 -108.93 gain 135 75 -108.92 gain 75 136 -115.64 gain 136 75 -116.25 gain 75 137 -118.93 gain 137 75 -117.02 gain 75 138 -115.72 gain 138 75 -112.82 gain 75 139 -115.04 gain 139 75 -113.11 gain 75 140 -116.33 gain 140 75 -117.01 gain 75 141 -124.16 gain 141 75 -123.52 gain 75 142 -118.09 gain 142 75 -116.75 gain 75 143 -127.80 gain 143 75 -126.08 gain 75 144 -125.99 gain 144 75 -125.29 gain 75 145 -129.23 gain 145 75 -126.97 gain 75 146 -118.73 gain 146 75 -115.38 gain 75 147 -129.01 gain 147 75 -122.75 gain 75 148 -130.84 gain 148 75 -124.31 gain 75 149 -128.10 gain 149 75 -124.73 gain 75 150 -113.90 gain 150 75 -113.21 gain 75 151 -114.15 gain 151 75 -113.67 gain 75 152 -112.84 gain 152 75 -109.33 gain 75 153 -109.81 gain 153 75 -103.88 gain 75 154 -121.44 gain 154 75 -124.05 gain 75 155 -117.69 gain 155 75 -120.21 gain 75 156 -124.57 gain 156 75 -121.47 gain 75 157 -113.67 gain 157 75 -113.52 gain 75 158 -125.63 gain 158 75 -128.07 gain 75 159 -128.35 gain 159 75 -127.41 gain 75 160 -130.83 gain 160 75 -127.00 gain 75 161 -131.44 gain 161 75 -131.09 gain 75 162 -136.38 gain 162 75 -134.90 gain 75 163 -131.54 gain 163 75 -132.21 gain 75 164 -122.82 gain 164 75 -124.54 gain 75 165 -113.54 gain 165 75 -111.29 gain 75 166 -126.00 gain 166 75 -125.32 gain 75 167 -119.06 gain 167 75 -120.48 gain 75 168 -119.81 gain 168 75 -119.68 gain 75 169 -125.11 gain 169 75 -129.18 gain 75 170 -122.05 gain 170 75 -117.64 gain 75 171 -117.05 gain 171 75 -117.66 gain 75 172 -125.08 gain 172 75 -120.39 gain 75 173 -123.85 gain 173 75 -118.60 gain 75 174 -125.78 gain 174 75 -124.82 gain 75 175 -122.39 gain 175 75 -124.99 gain 75 176 -129.15 gain 176 75 -123.76 gain 75 177 -129.94 gain 177 75 -132.36 gain 75 178 -133.36 gain 178 75 -131.60 gain 75 179 -132.27 gain 179 75 -128.91 gain 75 180 -117.35 gain 180 75 -115.45 gain 75 181 -129.28 gain 181 75 -127.45 gain 75 182 -122.04 gain 182 75 -122.60 gain 75 183 -118.14 gain 183 75 -112.09 gain 75 184 -114.43 gain 184 75 -113.16 gain 75 185 -120.98 gain 185 75 -117.20 gain 75 186 -119.29 gain 186 75 -115.79 gain 75 187 -124.29 gain 187 75 -123.33 gain 75 188 -121.55 gain 188 75 -123.85 gain 75 189 -124.99 gain 189 75 -124.81 gain 75 190 -127.69 gain 190 75 -124.51 gain 75 191 -124.47 gain 191 75 -122.39 gain 75 192 -126.78 gain 192 75 -127.56 gain 75 193 -132.51 gain 193 75 -134.55 gain 75 194 -136.28 gain 194 75 -132.13 gain 75 195 -122.62 gain 195 75 -119.10 gain 75 196 -115.38 gain 196 75 -115.90 gain 75 197 -120.63 gain 197 75 -117.21 gain 75 198 -115.77 gain 198 75 -111.88 gain 75 199 -127.26 gain 199 75 -127.28 gain 75 200 -122.12 gain 200 75 -119.08 gain 75 201 -122.58 gain 201 75 -120.34 gain 75 202 -122.53 gain 202 75 -124.29 gain 75 203 -122.72 gain 203 75 -124.10 gain 75 204 -118.50 gain 204 75 -117.17 gain 75 205 -131.32 gain 205 75 -129.06 gain 75 206 -135.06 gain 206 75 -137.33 gain 75 207 -129.05 gain 207 75 -123.68 gain 75 208 -129.45 gain 208 75 -129.85 gain 75 209 -125.90 gain 209 75 -127.29 gain 75 210 -116.84 gain 210 75 -115.17 gain 75 211 -120.91 gain 211 75 -121.26 gain 75 212 -120.01 gain 212 75 -118.90 gain 75 213 -118.64 gain 213 75 -116.73 gain 75 214 -124.64 gain 214 75 -122.61 gain 75 215 -125.33 gain 215 75 -119.72 gain 75 216 -127.27 gain 216 75 -126.32 gain 75 217 -119.79 gain 217 75 -119.36 gain 75 218 -123.55 gain 218 75 -125.31 gain 75 219 -128.78 gain 219 75 -121.90 gain 75 220 -125.29 gain 220 75 -128.90 gain 75 221 -123.02 gain 221 75 -122.27 gain 75 222 -126.80 gain 222 75 -126.38 gain 75 223 -126.04 gain 223 75 -124.23 gain 75 224 -128.23 gain 224 75 -129.11 gain 76 77 -89.18 gain 77 76 -92.85 gain 76 78 -101.09 gain 78 76 -107.61 gain 76 79 -102.39 gain 79 76 -103.68 gain 76 80 -112.68 gain 80 76 -114.48 gain 76 81 -118.59 gain 81 76 -120.98 gain 76 82 -111.63 gain 82 76 -111.64 gain 76 83 -120.66 gain 83 76 -121.71 gain 76 84 -117.92 gain 84 76 -119.11 gain 76 85 -120.67 gain 85 76 -118.68 gain 76 86 -115.74 gain 86 76 -117.13 gain 76 87 -123.31 gain 87 76 -128.65 gain 76 88 -126.67 gain 88 76 -129.77 gain 76 89 -127.71 gain 89 76 -129.41 gain 76 90 -99.25 gain 90 76 -97.96 gain 76 91 -89.41 gain 91 76 -92.06 gain 76 92 -94.40 gain 92 76 -94.02 gain 76 93 -100.54 gain 93 76 -104.94 gain 76 94 -104.66 gain 94 76 -108.93 gain 76 95 -110.25 gain 95 76 -116.78 gain 76 96 -116.13 gain 96 76 -120.00 gain 76 97 -118.64 gain 97 76 -121.25 gain 76 98 -118.05 gain 98 76 -121.46 gain 76 99 -120.82 gain 99 76 -122.05 gain 76 100 -124.78 gain 100 76 -125.57 gain 76 101 -125.51 gain 101 76 -126.47 gain 76 102 -130.56 gain 102 76 -132.30 gain 76 103 -124.38 gain 103 76 -123.60 gain 76 104 -126.97 gain 104 76 -131.57 gain 76 105 -100.11 gain 105 76 -100.65 gain 76 106 -105.10 gain 106 76 -106.73 gain 76 107 -96.39 gain 107 76 -104.58 gain 76 108 -105.28 gain 108 76 -105.79 gain 76 109 -109.27 gain 109 76 -113.27 gain 76 110 -114.08 gain 110 76 -116.55 gain 76 111 -111.08 gain 111 76 -113.23 gain 76 112 -112.44 gain 112 76 -113.47 gain 76 113 -112.54 gain 113 76 -112.38 gain 76 114 -116.05 gain 114 76 -119.19 gain 76 115 -122.88 gain 115 76 -120.32 gain 76 116 -127.29 gain 116 76 -132.27 gain 76 117 -129.95 gain 117 76 -136.43 gain 76 118 -121.30 gain 118 76 -126.11 gain 76 119 -127.01 gain 119 76 -126.47 gain 76 120 -108.05 gain 120 76 -112.03 gain 76 121 -105.70 gain 121 76 -108.97 gain 76 122 -108.95 gain 122 76 -114.34 gain 76 123 -112.44 gain 123 76 -118.60 gain 76 124 -108.17 gain 124 76 -110.74 gain 76 125 -104.79 gain 125 76 -108.69 gain 76 126 -114.07 gain 126 76 -115.93 gain 76 127 -116.68 gain 127 76 -122.00 gain 76 128 -116.54 gain 128 76 -119.80 gain 76 129 -117.74 gain 129 76 -118.91 gain 76 130 -119.32 gain 130 76 -118.31 gain 76 131 -121.42 gain 131 76 -127.49 gain 76 132 -126.32 gain 132 76 -132.03 gain 76 133 -125.95 gain 133 76 -129.73 gain 76 134 -124.38 gain 134 76 -124.86 gain 76 135 -107.50 gain 135 76 -111.54 gain 76 136 -105.66 gain 136 76 -110.32 gain 76 137 -115.23 gain 137 76 -117.37 gain 76 138 -117.91 gain 138 76 -119.05 gain 76 139 -111.62 gain 139 76 -113.75 gain 76 140 -108.91 gain 140 76 -113.64 gain 76 141 -117.10 gain 141 76 -120.51 gain 76 142 -121.38 gain 142 76 -124.10 gain 76 143 -117.07 gain 143 76 -119.40 gain 76 144 -120.64 gain 144 76 -123.99 gain 76 145 -116.19 gain 145 76 -117.99 gain 76 146 -124.85 gain 146 76 -125.56 gain 76 147 -122.40 gain 147 76 -120.19 gain 76 148 -122.14 gain 148 76 -119.65 gain 76 149 -128.03 gain 149 76 -128.71 gain 76 150 -108.24 gain 150 76 -111.61 gain 76 151 -115.07 gain 151 76 -118.63 gain 76 152 -108.84 gain 152 76 -109.38 gain 76 153 -112.88 gain 153 76 -110.99 gain 76 154 -108.28 gain 154 76 -114.95 gain 76 155 -119.24 gain 155 76 -125.80 gain 76 156 -118.52 gain 156 76 -119.47 gain 76 157 -120.18 gain 157 76 -124.08 gain 76 158 -121.44 gain 158 76 -127.92 gain 76 159 -126.80 gain 159 76 -129.90 gain 76 160 -118.41 gain 160 76 -118.63 gain 76 161 -121.72 gain 161 76 -125.42 gain 76 162 -123.18 gain 162 76 -125.75 gain 76 163 -127.71 gain 163 76 -132.43 gain 76 164 -132.59 gain 164 76 -138.35 gain 76 165 -115.12 gain 165 76 -116.92 gain 76 166 -113.52 gain 166 76 -116.89 gain 76 167 -115.88 gain 167 76 -121.34 gain 76 168 -110.43 gain 168 76 -114.34 gain 76 169 -110.54 gain 169 76 -118.65 gain 76 170 -112.38 gain 170 76 -112.02 gain 76 171 -118.81 gain 171 76 -123.47 gain 76 172 -117.25 gain 172 76 -116.61 gain 76 173 -122.72 gain 173 76 -121.51 gain 76 174 -118.49 gain 174 76 -121.58 gain 76 175 -127.31 gain 175 76 -133.95 gain 76 176 -120.49 gain 176 76 -119.15 gain 76 177 -134.57 gain 177 76 -141.04 gain 76 178 -121.60 gain 178 76 -123.89 gain 76 179 -130.16 gain 179 76 -130.85 gain 76 180 -118.41 gain 180 76 -120.56 gain 76 181 -111.71 gain 181 76 -113.93 gain 76 182 -121.00 gain 182 76 -125.61 gain 76 183 -116.56 gain 183 76 -114.55 gain 76 184 -114.57 gain 184 76 -117.34 gain 76 185 -120.72 gain 185 76 -120.98 gain 76 186 -119.16 gain 186 76 -119.71 gain 76 187 -121.03 gain 187 76 -124.12 gain 76 188 -117.26 gain 188 76 -123.61 gain 76 189 -117.19 gain 189 76 -121.06 gain 76 190 -124.85 gain 190 76 -125.73 gain 76 191 -125.29 gain 191 76 -127.25 gain 76 192 -131.43 gain 192 76 -136.27 gain 76 193 -125.11 gain 193 76 -131.19 gain 76 194 -131.54 gain 194 76 -131.43 gain 76 195 -119.83 gain 195 76 -120.36 gain 76 196 -116.80 gain 196 76 -121.36 gain 76 197 -114.33 gain 197 76 -114.96 gain 76 198 -122.76 gain 198 76 -122.91 gain 76 199 -118.71 gain 199 76 -122.78 gain 76 200 -122.97 gain 200 76 -123.98 gain 76 201 -118.75 gain 201 76 -120.56 gain 76 202 -122.97 gain 202 76 -128.78 gain 76 203 -129.12 gain 203 76 -134.56 gain 76 204 -113.50 gain 204 76 -116.22 gain 76 205 -130.85 gain 205 76 -132.64 gain 76 206 -121.05 gain 206 76 -127.36 gain 76 207 -120.84 gain 207 76 -119.51 gain 76 208 -124.94 gain 208 76 -129.39 gain 76 209 -126.38 gain 209 76 -131.83 gain 76 210 -118.42 gain 210 76 -120.79 gain 76 211 -116.18 gain 211 76 -120.59 gain 76 212 -114.66 gain 212 76 -117.60 gain 76 213 -113.22 gain 213 76 -115.35 gain 76 214 -119.95 gain 214 76 -121.97 gain 76 215 -118.45 gain 215 76 -116.89 gain 76 216 -113.79 gain 216 76 -116.89 gain 76 217 -122.46 gain 217 76 -126.08 gain 76 218 -126.10 gain 218 76 -131.91 gain 76 219 -117.87 gain 219 76 -115.04 gain 76 220 -128.31 gain 220 76 -135.97 gain 76 221 -128.13 gain 221 76 -131.43 gain 76 222 -131.84 gain 222 76 -135.46 gain 76 223 -122.76 gain 223 76 -124.99 gain 76 224 -134.72 gain 224 76 -139.65 gain 77 78 -93.76 gain 78 77 -96.61 gain 77 79 -107.08 gain 79 77 -104.71 gain 77 80 -108.00 gain 80 77 -106.13 gain 77 81 -107.62 gain 81 77 -106.34 gain 77 82 -121.09 gain 82 77 -117.44 gain 77 83 -115.83 gain 83 77 -113.22 gain 77 84 -123.08 gain 84 77 -120.61 gain 77 85 -127.24 gain 85 77 -121.58 gain 77 86 -127.26 gain 86 77 -124.98 gain 77 87 -130.03 gain 87 77 -131.72 gain 77 88 -126.48 gain 88 77 -125.91 gain 77 89 -125.87 gain 89 77 -123.90 gain 77 90 -106.53 gain 90 77 -101.58 gain 77 91 -98.65 gain 91 77 -97.63 gain 77 92 -91.26 gain 92 77 -87.21 gain 77 93 -98.36 gain 93 77 -99.09 gain 77 94 -101.34 gain 94 77 -101.95 gain 77 95 -110.20 gain 95 77 -113.06 gain 77 96 -113.77 gain 96 77 -113.97 gain 77 97 -111.14 gain 97 77 -110.09 gain 77 98 -112.82 gain 98 77 -112.57 gain 77 99 -111.06 gain 99 77 -108.62 gain 77 100 -123.09 gain 100 77 -120.22 gain 77 101 -119.85 gain 101 77 -117.14 gain 77 102 -123.48 gain 102 77 -121.56 gain 77 103 -125.58 gain 103 77 -121.14 gain 77 104 -127.22 gain 104 77 -128.15 gain 77 105 -108.77 gain 105 77 -105.64 gain 77 106 -104.61 gain 106 77 -102.56 gain 77 107 -107.04 gain 107 77 -111.57 gain 77 108 -117.39 gain 108 77 -114.24 gain 77 109 -109.08 gain 109 77 -109.42 gain 77 110 -112.78 gain 110 77 -111.58 gain 77 111 -114.50 gain 111 77 -112.98 gain 77 112 -125.83 gain 112 77 -123.20 gain 77 113 -115.30 gain 113 77 -111.46 gain 77 114 -117.95 gain 114 77 -117.42 gain 77 115 -121.83 gain 115 77 -115.61 gain 77 116 -133.50 gain 116 77 -134.82 gain 77 117 -124.04 gain 117 77 -126.85 gain 77 118 -124.30 gain 118 77 -125.43 gain 77 119 -123.91 gain 119 77 -119.70 gain 77 120 -111.49 gain 120 77 -111.80 gain 77 121 -107.06 gain 121 77 -106.66 gain 77 122 -99.04 gain 122 77 -100.75 gain 77 123 -104.68 gain 123 77 -107.18 gain 77 124 -105.53 gain 124 77 -104.44 gain 77 125 -111.18 gain 125 77 -111.42 gain 77 126 -118.08 gain 126 77 -116.28 gain 77 127 -119.17 gain 127 77 -120.82 gain 77 128 -121.98 gain 128 77 -121.57 gain 77 129 -123.59 gain 129 77 -121.09 gain 77 130 -128.61 gain 130 77 -123.94 gain 77 131 -121.01 gain 131 77 -123.43 gain 77 132 -123.12 gain 132 77 -125.16 gain 77 133 -129.68 gain 133 77 -129.79 gain 77 134 -127.39 gain 134 77 -124.20 gain 77 135 -119.73 gain 135 77 -120.11 gain 77 136 -111.11 gain 136 77 -112.10 gain 77 137 -107.78 gain 137 77 -106.25 gain 77 138 -112.76 gain 138 77 -110.23 gain 77 139 -109.37 gain 139 77 -107.83 gain 77 140 -112.12 gain 140 77 -113.19 gain 77 141 -115.76 gain 141 77 -115.50 gain 77 142 -123.48 gain 142 77 -122.53 gain 77 143 -122.49 gain 143 77 -121.16 gain 77 144 -127.90 gain 144 77 -127.58 gain 77 145 -128.71 gain 145 77 -126.84 gain 77 146 -126.94 gain 146 77 -123.98 gain 77 147 -124.03 gain 147 77 -118.16 gain 77 148 -116.93 gain 148 77 -110.77 gain 77 149 -124.02 gain 149 77 -121.03 gain 77 150 -119.02 gain 150 77 -118.72 gain 77 151 -119.21 gain 151 77 -119.10 gain 77 152 -115.86 gain 152 77 -112.73 gain 77 153 -120.90 gain 153 77 -115.35 gain 77 154 -117.31 gain 154 77 -120.31 gain 77 155 -118.73 gain 155 77 -121.63 gain 77 156 -115.72 gain 156 77 -113.00 gain 77 157 -122.47 gain 157 77 -122.70 gain 77 158 -114.58 gain 158 77 -117.40 gain 77 159 -122.97 gain 159 77 -122.41 gain 77 160 -120.38 gain 160 77 -116.93 gain 77 161 -131.30 gain 161 77 -131.34 gain 77 162 -115.06 gain 162 77 -113.97 gain 77 163 -127.89 gain 163 77 -128.95 gain 77 164 -129.85 gain 164 77 -131.95 gain 77 165 -122.97 gain 165 77 -121.11 gain 77 166 -118.27 gain 166 77 -117.98 gain 77 167 -117.82 gain 167 77 -119.61 gain 77 168 -119.13 gain 168 77 -119.38 gain 77 169 -118.48 gain 169 77 -122.93 gain 77 170 -118.89 gain 170 77 -114.86 gain 77 171 -119.73 gain 171 77 -120.73 gain 77 172 -116.00 gain 172 77 -111.69 gain 77 173 -121.84 gain 173 77 -116.97 gain 77 174 -120.75 gain 174 77 -120.18 gain 77 175 -126.08 gain 175 77 -129.06 gain 77 176 -127.96 gain 176 77 -122.95 gain 77 177 -131.19 gain 177 77 -133.99 gain 77 178 -129.98 gain 178 77 -128.61 gain 77 179 -128.85 gain 179 77 -125.87 gain 77 180 -124.35 gain 180 77 -122.84 gain 77 181 -124.74 gain 181 77 -123.30 gain 77 182 -118.54 gain 182 77 -119.49 gain 77 183 -118.41 gain 183 77 -112.74 gain 77 184 -121.39 gain 184 77 -120.50 gain 77 185 -120.16 gain 185 77 -116.76 gain 77 186 -124.69 gain 186 77 -121.57 gain 77 187 -125.00 gain 187 77 -124.42 gain 77 188 -124.92 gain 188 77 -127.61 gain 77 189 -120.97 gain 189 77 -121.17 gain 77 190 -122.55 gain 190 77 -119.76 gain 77 191 -128.94 gain 191 77 -127.24 gain 77 192 -129.07 gain 192 77 -130.24 gain 77 193 -129.26 gain 193 77 -131.68 gain 77 194 -128.40 gain 194 77 -124.63 gain 77 195 -115.07 gain 195 77 -111.93 gain 77 196 -130.55 gain 196 77 -131.45 gain 77 197 -116.68 gain 197 77 -113.64 gain 77 198 -117.17 gain 198 77 -113.66 gain 77 199 -123.89 gain 199 77 -124.29 gain 77 200 -117.92 gain 200 77 -115.26 gain 77 201 -119.68 gain 201 77 -117.83 gain 77 202 -120.93 gain 202 77 -123.08 gain 77 203 -127.70 gain 203 77 -129.47 gain 77 204 -122.76 gain 204 77 -121.81 gain 77 205 -124.47 gain 205 77 -122.59 gain 77 206 -121.68 gain 206 77 -124.33 gain 77 207 -126.72 gain 207 77 -121.72 gain 77 208 -127.39 gain 208 77 -128.17 gain 77 209 -130.79 gain 209 77 -132.57 gain 77 210 -121.96 gain 210 77 -120.68 gain 77 211 -115.89 gain 211 77 -116.63 gain 77 212 -128.53 gain 212 77 -127.80 gain 77 213 -121.11 gain 213 77 -119.58 gain 77 214 -126.22 gain 214 77 -124.58 gain 77 215 -122.38 gain 215 77 -117.15 gain 77 216 -124.46 gain 216 77 -123.90 gain 77 217 -124.22 gain 217 77 -124.17 gain 77 218 -125.43 gain 218 77 -127.57 gain 77 219 -125.73 gain 219 77 -119.23 gain 77 220 -119.56 gain 220 77 -123.55 gain 77 221 -127.53 gain 221 77 -127.17 gain 77 222 -127.97 gain 222 77 -127.93 gain 77 223 -129.68 gain 223 77 -128.25 gain 77 224 -131.38 gain 224 77 -132.64 gain 78 79 -93.87 gain 79 78 -88.65 gain 78 80 -110.22 gain 80 78 -105.50 gain 78 81 -111.78 gain 81 78 -107.66 gain 78 82 -107.04 gain 82 78 -100.54 gain 78 83 -117.27 gain 83 78 -111.80 gain 78 84 -120.07 gain 84 78 -114.75 gain 78 85 -121.23 gain 85 78 -112.72 gain 78 86 -125.37 gain 86 78 -120.24 gain 78 87 -130.55 gain 87 78 -129.38 gain 78 88 -127.42 gain 88 78 -124.01 gain 78 89 -134.61 gain 89 78 -129.79 gain 78 90 -116.20 gain 90 78 -108.39 gain 78 91 -107.17 gain 91 78 -103.30 gain 78 92 -97.11 gain 92 78 -90.21 gain 78 93 -96.77 gain 93 78 -94.66 gain 78 94 -105.58 gain 94 78 -103.34 gain 78 95 -94.32 gain 95 78 -94.33 gain 78 96 -106.89 gain 96 78 -104.24 gain 78 97 -117.87 gain 97 78 -113.97 gain 78 98 -119.74 gain 98 78 -116.63 gain 78 99 -120.99 gain 99 78 -115.70 gain 78 100 -121.66 gain 100 78 -115.94 gain 78 101 -128.76 gain 101 78 -123.20 gain 78 102 -127.17 gain 102 78 -122.39 gain 78 103 -126.40 gain 103 78 -119.11 gain 78 104 -131.52 gain 104 78 -129.60 gain 78 105 -112.61 gain 105 78 -106.64 gain 78 106 -113.51 gain 106 78 -108.62 gain 78 107 -98.89 gain 107 78 -100.57 gain 78 108 -103.45 gain 108 78 -97.44 gain 78 109 -107.34 gain 109 78 -104.82 gain 78 110 -115.67 gain 110 78 -111.62 gain 78 111 -110.48 gain 111 78 -106.11 gain 78 112 -110.06 gain 112 78 -104.58 gain 78 113 -121.66 gain 113 78 -114.98 gain 78 114 -118.33 gain 114 78 -114.95 gain 78 115 -125.89 gain 115 78 -116.81 gain 78 116 -125.73 gain 116 78 -124.20 gain 78 117 -131.00 gain 117 78 -130.97 gain 78 118 -125.39 gain 118 78 -123.68 gain 78 119 -128.21 gain 119 78 -121.16 gain 78 120 -111.95 gain 120 78 -109.42 gain 78 121 -113.38 gain 121 78 -110.13 gain 78 122 -114.28 gain 122 78 -113.15 gain 78 123 -116.35 gain 123 78 -115.99 gain 78 124 -118.37 gain 124 78 -114.43 gain 78 125 -114.59 gain 125 78 -111.98 gain 78 126 -116.36 gain 126 78 -111.70 gain 78 127 -114.13 gain 127 78 -112.93 gain 78 128 -121.80 gain 128 78 -118.55 gain 78 129 -122.04 gain 129 78 -116.69 gain 78 130 -121.63 gain 130 78 -114.11 gain 78 131 -118.49 gain 131 78 -118.05 gain 78 132 -124.11 gain 132 78 -123.30 gain 78 133 -126.55 gain 133 78 -123.81 gain 78 134 -130.12 gain 134 78 -124.08 gain 78 135 -121.61 gain 135 78 -119.14 gain 78 136 -120.20 gain 136 78 -118.35 gain 78 137 -115.14 gain 137 78 -110.76 gain 78 138 -111.70 gain 138 78 -106.33 gain 78 139 -114.98 gain 139 78 -110.59 gain 78 140 -116.88 gain 140 78 -115.09 gain 78 141 -116.08 gain 141 78 -112.97 gain 78 142 -118.14 gain 142 78 -114.34 gain 78 143 -130.17 gain 143 78 -125.98 gain 78 144 -125.79 gain 144 78 -122.62 gain 78 145 -130.48 gain 145 78 -125.76 gain 78 146 -123.81 gain 146 78 -118.00 gain 78 147 -124.98 gain 147 78 -116.26 gain 78 148 -131.17 gain 148 78 -122.17 gain 78 149 -133.94 gain 149 78 -128.10 gain 78 150 -115.86 gain 150 78 -112.71 gain 78 151 -116.73 gain 151 78 -113.77 gain 78 152 -116.21 gain 152 78 -110.23 gain 78 153 -116.48 gain 153 78 -108.08 gain 78 154 -115.23 gain 154 78 -115.37 gain 78 155 -117.99 gain 155 78 -118.03 gain 78 156 -126.84 gain 156 78 -121.28 gain 78 157 -124.27 gain 157 78 -121.65 gain 78 158 -115.32 gain 158 78 -115.29 gain 78 159 -125.84 gain 159 78 -122.43 gain 78 160 -123.13 gain 160 78 -116.83 gain 78 161 -125.65 gain 161 78 -122.84 gain 78 162 -127.05 gain 162 78 -123.11 gain 78 163 -128.30 gain 163 78 -126.50 gain 78 164 -130.05 gain 164 78 -129.29 gain 78 165 -120.09 gain 165 78 -115.38 gain 78 166 -125.89 gain 166 78 -122.75 gain 78 167 -113.94 gain 167 78 -112.88 gain 78 168 -121.00 gain 168 78 -118.40 gain 78 169 -120.93 gain 169 78 -122.53 gain 78 170 -120.50 gain 170 78 -113.63 gain 78 171 -114.65 gain 171 78 -112.80 gain 78 172 -126.31 gain 172 78 -119.15 gain 78 173 -124.62 gain 173 78 -116.90 gain 78 174 -126.34 gain 174 78 -122.91 gain 78 175 -128.15 gain 175 78 -128.28 gain 78 176 -116.20 gain 176 78 -108.34 gain 78 177 -124.84 gain 177 78 -124.79 gain 78 178 -129.03 gain 178 78 -124.80 gain 78 179 -130.05 gain 179 78 -124.22 gain 78 180 -119.87 gain 180 78 -115.51 gain 78 181 -122.90 gain 181 78 -118.61 gain 78 182 -123.59 gain 182 78 -121.68 gain 78 183 -126.27 gain 183 78 -117.75 gain 78 184 -127.13 gain 184 78 -123.39 gain 78 185 -124.72 gain 185 78 -118.47 gain 78 186 -122.71 gain 186 78 -116.74 gain 78 187 -121.50 gain 187 78 -118.08 gain 78 188 -127.18 gain 188 78 -127.02 gain 78 189 -126.16 gain 189 78 -123.51 gain 78 190 -124.27 gain 190 78 -118.63 gain 78 191 -131.35 gain 191 78 -126.80 gain 78 192 -128.42 gain 192 78 -126.74 gain 78 193 -128.97 gain 193 78 -128.53 gain 78 194 -127.15 gain 194 78 -120.53 gain 78 195 -129.20 gain 195 78 -123.21 gain 78 196 -126.31 gain 196 78 -124.37 gain 78 197 -120.69 gain 197 78 -114.80 gain 78 198 -124.82 gain 198 78 -118.46 gain 78 199 -119.60 gain 199 78 -117.15 gain 78 200 -124.04 gain 200 78 -118.53 gain 78 201 -125.92 gain 201 78 -121.22 gain 78 202 -121.44 gain 202 78 -120.74 gain 78 203 -132.92 gain 203 78 -131.84 gain 78 204 -128.79 gain 204 78 -125.00 gain 78 205 -130.59 gain 205 78 -125.87 gain 78 206 -134.50 gain 206 78 -134.30 gain 78 207 -124.60 gain 207 78 -116.76 gain 78 208 -131.17 gain 208 78 -129.11 gain 78 209 -134.49 gain 209 78 -133.42 gain 78 210 -133.97 gain 210 78 -129.83 gain 78 211 -133.28 gain 211 78 -131.17 gain 78 212 -127.98 gain 212 78 -124.41 gain 78 213 -125.38 gain 213 78 -121.00 gain 78 214 -126.57 gain 214 78 -122.08 gain 78 215 -122.23 gain 215 78 -114.15 gain 78 216 -131.00 gain 216 78 -127.58 gain 78 217 -130.59 gain 217 78 -127.69 gain 78 218 -131.80 gain 218 78 -131.10 gain 78 219 -127.53 gain 219 78 -118.19 gain 78 220 -124.47 gain 220 78 -125.61 gain 78 221 -128.18 gain 221 78 -124.97 gain 78 222 -133.68 gain 222 78 -130.79 gain 78 223 -137.63 gain 223 78 -133.35 gain 78 224 -131.00 gain 224 78 -129.42 gain 79 80 -86.72 gain 80 79 -87.22 gain 79 81 -104.41 gain 81 79 -105.50 gain 79 82 -100.96 gain 82 79 -99.69 gain 79 83 -109.78 gain 83 79 -109.54 gain 79 84 -108.81 gain 84 79 -108.72 gain 79 85 -114.48 gain 85 79 -111.19 gain 79 86 -112.78 gain 86 79 -112.87 gain 79 87 -113.65 gain 87 79 -117.70 gain 79 88 -123.11 gain 88 79 -124.91 gain 79 89 -122.65 gain 89 79 -123.06 gain 79 90 -114.48 gain 90 79 -111.89 gain 79 91 -105.15 gain 91 79 -106.51 gain 79 92 -90.84 gain 92 79 -89.16 gain 79 93 -96.04 gain 93 79 -99.15 gain 79 94 -94.76 gain 94 79 -97.74 gain 79 95 -99.77 gain 95 79 -105.01 gain 79 96 -105.19 gain 96 79 -107.76 gain 79 97 -106.42 gain 97 79 -107.74 gain 79 98 -116.06 gain 98 79 -118.17 gain 79 99 -116.27 gain 99 79 -116.20 gain 79 100 -110.21 gain 100 79 -109.71 gain 79 101 -116.02 gain 101 79 -115.69 gain 79 102 -125.63 gain 102 79 -126.08 gain 79 103 -124.07 gain 103 79 -122.00 gain 79 104 -126.43 gain 104 79 -129.74 gain 79 105 -111.09 gain 105 79 -110.34 gain 79 106 -108.62 gain 106 79 -108.95 gain 79 107 -108.28 gain 107 79 -115.18 gain 79 108 -109.21 gain 108 79 -108.42 gain 79 109 -98.62 gain 109 79 -101.33 gain 79 110 -103.84 gain 110 79 -105.02 gain 79 111 -102.25 gain 111 79 -103.11 gain 79 112 -106.04 gain 112 79 -105.78 gain 79 113 -109.97 gain 113 79 -108.51 gain 79 114 -114.86 gain 114 79 -116.70 gain 79 115 -120.56 gain 115 79 -116.70 gain 79 116 -119.80 gain 116 79 -123.48 gain 79 117 -121.15 gain 117 79 -126.33 gain 79 118 -118.95 gain 118 79 -122.46 gain 79 119 -126.08 gain 119 79 -124.24 gain 79 120 -109.08 gain 120 79 -111.76 gain 79 121 -112.75 gain 121 79 -114.72 gain 79 122 -116.02 gain 122 79 -120.11 gain 79 123 -104.24 gain 123 79 -109.11 gain 79 124 -104.20 gain 124 79 -105.48 gain 79 125 -106.18 gain 125 79 -108.79 gain 79 126 -105.54 gain 126 79 -106.10 gain 79 127 -108.52 gain 127 79 -112.55 gain 79 128 -113.78 gain 128 79 -115.75 gain 79 129 -115.68 gain 129 79 -115.56 gain 79 130 -115.56 gain 130 79 -113.26 gain 79 131 -123.37 gain 131 79 -128.16 gain 79 132 -118.43 gain 132 79 -122.85 gain 79 133 -118.22 gain 133 79 -120.70 gain 79 134 -120.47 gain 134 79 -119.65 gain 79 135 -111.20 gain 135 79 -113.95 gain 79 136 -112.56 gain 136 79 -115.92 gain 79 137 -114.27 gain 137 79 -115.12 gain 79 138 -114.49 gain 138 79 -114.34 gain 79 139 -108.49 gain 139 79 -109.32 gain 79 140 -106.81 gain 140 79 -110.25 gain 79 141 -109.21 gain 141 79 -111.32 gain 79 142 -107.89 gain 142 79 -109.30 gain 79 143 -114.53 gain 143 79 -115.56 gain 79 144 -112.56 gain 144 79 -114.62 gain 79 145 -120.88 gain 145 79 -121.38 gain 79 146 -118.90 gain 146 79 -118.31 gain 79 147 -122.76 gain 147 79 -119.26 gain 79 148 -121.71 gain 148 79 -117.93 gain 79 149 -120.61 gain 149 79 -120.00 gain 79 150 -117.02 gain 150 79 -119.09 gain 79 151 -112.27 gain 151 79 -114.53 gain 79 152 -110.26 gain 152 79 -109.51 gain 79 153 -113.44 gain 153 79 -110.26 gain 79 154 -114.42 gain 154 79 -119.79 gain 79 155 -114.59 gain 155 79 -119.86 gain 79 156 -114.13 gain 156 79 -113.79 gain 79 157 -111.18 gain 157 79 -113.78 gain 79 158 -111.74 gain 158 79 -116.93 gain 79 159 -112.85 gain 159 79 -114.66 gain 79 160 -119.39 gain 160 79 -118.31 gain 79 161 -122.04 gain 161 79 -124.46 gain 79 162 -121.50 gain 162 79 -122.78 gain 79 163 -121.34 gain 163 79 -124.76 gain 79 164 -126.45 gain 164 79 -130.92 gain 79 165 -117.02 gain 165 79 -117.53 gain 79 166 -112.40 gain 166 79 -114.48 gain 79 167 -118.62 gain 167 79 -122.79 gain 79 168 -116.57 gain 168 79 -119.19 gain 79 169 -122.28 gain 169 79 -129.09 gain 79 170 -122.01 gain 170 79 -120.35 gain 79 171 -110.76 gain 171 79 -114.12 gain 79 172 -112.54 gain 172 79 -110.61 gain 79 173 -115.80 gain 173 79 -113.30 gain 79 174 -115.45 gain 174 79 -117.25 gain 79 175 -118.96 gain 175 79 -124.32 gain 79 176 -121.03 gain 176 79 -118.40 gain 79 177 -125.39 gain 177 79 -130.57 gain 79 178 -124.27 gain 178 79 -125.27 gain 79 179 -121.82 gain 179 79 -121.21 gain 79 180 -115.15 gain 180 79 -116.01 gain 79 181 -123.85 gain 181 79 -124.78 gain 79 182 -117.17 gain 182 79 -120.48 gain 79 183 -119.94 gain 183 79 -116.65 gain 79 184 -117.67 gain 184 79 -119.15 gain 79 185 -117.66 gain 185 79 -116.63 gain 79 186 -122.01 gain 186 79 -121.26 gain 79 187 -122.21 gain 187 79 -124.01 gain 79 188 -118.42 gain 188 79 -123.48 gain 79 189 -118.37 gain 189 79 -120.95 gain 79 190 -121.30 gain 190 79 -120.88 gain 79 191 -117.10 gain 191 79 -117.77 gain 79 192 -122.18 gain 192 79 -125.72 gain 79 193 -127.64 gain 193 79 -132.43 gain 79 194 -131.65 gain 194 79 -130.25 gain 79 195 -122.18 gain 195 79 -121.41 gain 79 196 -114.97 gain 196 79 -118.24 gain 79 197 -119.75 gain 197 79 -119.09 gain 79 198 -119.73 gain 198 79 -118.59 gain 79 199 -118.93 gain 199 79 -121.71 gain 79 200 -115.23 gain 200 79 -114.94 gain 79 201 -121.81 gain 201 79 -122.33 gain 79 202 -115.90 gain 202 79 -120.42 gain 79 203 -121.84 gain 203 79 -125.97 gain 79 204 -122.34 gain 204 79 -123.76 gain 79 205 -120.14 gain 205 79 -120.64 gain 79 206 -124.17 gain 206 79 -129.19 gain 79 207 -125.66 gain 207 79 -123.04 gain 79 208 -127.47 gain 208 79 -130.63 gain 79 209 -119.71 gain 209 79 -123.85 gain 79 210 -121.26 gain 210 79 -122.35 gain 79 211 -124.35 gain 211 79 -127.46 gain 79 212 -123.15 gain 212 79 -124.80 gain 79 213 -124.36 gain 213 79 -125.20 gain 79 214 -117.10 gain 214 79 -117.83 gain 79 215 -118.79 gain 215 79 -115.94 gain 79 216 -128.78 gain 216 79 -130.58 gain 79 217 -119.94 gain 217 79 -122.26 gain 79 218 -136.88 gain 218 79 -141.39 gain 79 219 -128.91 gain 219 79 -124.78 gain 79 220 -122.86 gain 220 79 -129.22 gain 79 221 -123.17 gain 221 79 -125.17 gain 79 222 -123.29 gain 222 79 -125.62 gain 79 223 -129.93 gain 223 79 -130.88 gain 79 224 -122.80 gain 224 79 -126.43 gain 80 81 -93.32 gain 81 80 -93.91 gain 80 82 -105.26 gain 82 80 -103.48 gain 80 83 -101.59 gain 83 80 -100.84 gain 80 84 -112.10 gain 84 80 -111.50 gain 80 85 -112.83 gain 85 80 -109.04 gain 80 86 -120.84 gain 86 80 -120.43 gain 80 87 -115.39 gain 87 80 -118.94 gain 80 88 -117.32 gain 88 80 -118.62 gain 80 89 -121.99 gain 89 80 -121.89 gain 80 90 -109.48 gain 90 80 -106.39 gain 80 91 -104.27 gain 91 80 -105.13 gain 80 92 -108.09 gain 92 80 -105.91 gain 80 93 -99.70 gain 93 80 -102.30 gain 80 94 -99.20 gain 94 80 -101.68 gain 80 95 -92.84 gain 95 80 -97.57 gain 80 96 -100.99 gain 96 80 -103.06 gain 80 97 -99.69 gain 97 80 -100.51 gain 80 98 -102.13 gain 98 80 -103.74 gain 80 99 -109.68 gain 99 80 -109.12 gain 80 100 -112.83 gain 100 80 -111.83 gain 80 101 -116.27 gain 101 80 -115.44 gain 80 102 -121.93 gain 102 80 -121.88 gain 80 103 -125.83 gain 103 80 -123.26 gain 80 104 -122.40 gain 104 80 -125.20 gain 80 105 -122.02 gain 105 80 -120.76 gain 80 106 -113.37 gain 106 80 -113.20 gain 80 107 -108.52 gain 107 80 -114.91 gain 80 108 -105.04 gain 108 80 -103.76 gain 80 109 -101.82 gain 109 80 -104.03 gain 80 110 -103.08 gain 110 80 -103.76 gain 80 111 -104.23 gain 111 80 -104.58 gain 80 112 -103.74 gain 112 80 -102.97 gain 80 113 -99.36 gain 113 80 -97.39 gain 80 114 -111.51 gain 114 80 -112.85 gain 80 115 -119.83 gain 115 80 -115.47 gain 80 116 -114.44 gain 116 80 -117.62 gain 80 117 -122.13 gain 117 80 -126.81 gain 80 118 -127.85 gain 118 80 -130.86 gain 80 119 -120.63 gain 119 80 -118.30 gain 80 120 -112.18 gain 120 80 -114.36 gain 80 121 -109.56 gain 121 80 -111.03 gain 80 122 -115.58 gain 122 80 -119.16 gain 80 123 -110.70 gain 123 80 -115.06 gain 80 124 -111.94 gain 124 80 -112.72 gain 80 125 -104.75 gain 125 80 -106.86 gain 80 126 -106.73 gain 126 80 -106.80 gain 80 127 -108.25 gain 127 80 -111.78 gain 80 128 -108.56 gain 128 80 -110.03 gain 80 129 -126.07 gain 129 80 -125.45 gain 80 130 -114.17 gain 130 80 -111.37 gain 80 131 -111.39 gain 131 80 -115.68 gain 80 132 -118.14 gain 132 80 -122.05 gain 80 133 -122.78 gain 133 80 -124.76 gain 80 134 -118.03 gain 134 80 -116.71 gain 80 135 -118.61 gain 135 80 -120.86 gain 80 136 -116.14 gain 136 80 -119.00 gain 80 137 -120.92 gain 137 80 -121.27 gain 80 138 -107.25 gain 138 80 -106.60 gain 80 139 -112.72 gain 139 80 -113.05 gain 80 140 -119.12 gain 140 80 -122.05 gain 80 141 -110.43 gain 141 80 -112.04 gain 80 142 -113.40 gain 142 80 -114.32 gain 80 143 -120.48 gain 143 80 -121.01 gain 80 144 -112.71 gain 144 80 -114.26 gain 80 145 -116.13 gain 145 80 -116.12 gain 80 146 -123.85 gain 146 80 -122.76 gain 80 147 -124.49 gain 147 80 -120.49 gain 80 148 -124.25 gain 148 80 -119.96 gain 80 149 -126.31 gain 149 80 -125.19 gain 80 150 -123.18 gain 150 80 -124.75 gain 80 151 -117.65 gain 151 80 -119.41 gain 80 152 -115.56 gain 152 80 -114.31 gain 80 153 -111.54 gain 153 80 -107.86 gain 80 154 -111.56 gain 154 80 -116.42 gain 80 155 -110.82 gain 155 80 -115.59 gain 80 156 -115.48 gain 156 80 -114.63 gain 80 157 -109.03 gain 157 80 -111.13 gain 80 158 -114.92 gain 158 80 -119.61 gain 80 159 -119.40 gain 159 80 -120.70 gain 80 160 -121.10 gain 160 80 -119.53 gain 80 161 -116.17 gain 161 80 -118.08 gain 80 162 -116.01 gain 162 80 -116.79 gain 80 163 -118.85 gain 163 80 -121.77 gain 80 164 -125.88 gain 164 80 -129.85 gain 80 165 -118.70 gain 165 80 -118.70 gain 80 166 -124.83 gain 166 80 -126.40 gain 80 167 -115.40 gain 167 80 -119.07 gain 80 168 -118.09 gain 168 80 -120.21 gain 80 169 -118.10 gain 169 80 -124.41 gain 80 170 -113.39 gain 170 80 -111.23 gain 80 171 -112.33 gain 171 80 -115.20 gain 80 172 -117.06 gain 172 80 -114.62 gain 80 173 -115.01 gain 173 80 -112.01 gain 80 174 -118.03 gain 174 80 -119.32 gain 80 175 -123.79 gain 175 80 -128.64 gain 80 176 -120.83 gain 176 80 -117.69 gain 80 177 -114.60 gain 177 80 -119.27 gain 80 178 -124.23 gain 178 80 -124.73 gain 80 179 -129.42 gain 179 80 -128.31 gain 80 180 -121.30 gain 180 80 -121.66 gain 80 181 -123.17 gain 181 80 -123.59 gain 80 182 -120.58 gain 182 80 -123.39 gain 80 183 -120.31 gain 183 80 -116.51 gain 80 184 -124.39 gain 184 80 -125.37 gain 80 185 -118.34 gain 185 80 -116.81 gain 80 186 -125.71 gain 186 80 -124.47 gain 80 187 -112.39 gain 187 80 -113.69 gain 80 188 -122.56 gain 188 80 -127.11 gain 80 189 -124.71 gain 189 80 -126.78 gain 80 190 -122.39 gain 190 80 -121.47 gain 80 191 -121.38 gain 191 80 -121.55 gain 80 192 -118.02 gain 192 80 -121.05 gain 80 193 -123.45 gain 193 80 -127.74 gain 80 194 -127.84 gain 194 80 -125.94 gain 80 195 -131.45 gain 195 80 -130.18 gain 80 196 -119.12 gain 196 80 -121.89 gain 80 197 -126.82 gain 197 80 -125.66 gain 80 198 -121.70 gain 198 80 -120.05 gain 80 199 -119.91 gain 199 80 -122.18 gain 80 200 -120.06 gain 200 80 -119.27 gain 80 201 -119.04 gain 201 80 -119.06 gain 80 202 -116.15 gain 202 80 -120.17 gain 80 203 -118.81 gain 203 80 -122.45 gain 80 204 -116.99 gain 204 80 -117.91 gain 80 205 -123.34 gain 205 80 -123.33 gain 80 206 -120.53 gain 206 80 -125.04 gain 80 207 -122.91 gain 207 80 -119.79 gain 80 208 -120.85 gain 208 80 -123.51 gain 80 209 -121.52 gain 209 80 -125.16 gain 80 210 -123.50 gain 210 80 -124.08 gain 80 211 -124.63 gain 211 80 -127.24 gain 80 212 -117.29 gain 212 80 -118.44 gain 80 213 -113.67 gain 213 80 -114.01 gain 80 214 -124.28 gain 214 80 -124.51 gain 80 215 -122.29 gain 215 80 -118.93 gain 80 216 -124.88 gain 216 80 -126.19 gain 80 217 -120.87 gain 217 80 -122.70 gain 80 218 -125.27 gain 218 80 -129.28 gain 80 219 -126.71 gain 219 80 -122.08 gain 80 220 -112.87 gain 220 80 -118.73 gain 80 221 -122.01 gain 221 80 -123.52 gain 80 222 -127.28 gain 222 80 -129.11 gain 80 223 -118.30 gain 223 80 -118.75 gain 80 224 -119.60 gain 224 80 -122.73 gain 81 82 -96.85 gain 82 81 -94.48 gain 81 83 -103.28 gain 83 81 -101.94 gain 81 84 -108.14 gain 84 81 -106.95 gain 81 85 -113.44 gain 85 81 -109.05 gain 81 86 -111.46 gain 86 81 -110.46 gain 81 87 -116.15 gain 87 81 -119.11 gain 81 88 -110.91 gain 88 81 -111.62 gain 81 89 -124.93 gain 89 81 -124.24 gain 81 90 -118.45 gain 90 81 -114.77 gain 81 91 -112.09 gain 91 81 -112.36 gain 81 92 -115.71 gain 92 81 -112.94 gain 81 93 -109.08 gain 93 81 -111.09 gain 81 94 -107.28 gain 94 81 -109.17 gain 81 95 -95.48 gain 95 81 -99.62 gain 81 96 -84.99 gain 96 81 -86.47 gain 81 97 -93.81 gain 97 81 -94.03 gain 81 98 -105.78 gain 98 81 -106.80 gain 81 99 -108.64 gain 99 81 -107.49 gain 81 100 -109.38 gain 100 81 -107.79 gain 81 101 -112.16 gain 101 81 -110.73 gain 81 102 -124.33 gain 102 81 -123.68 gain 81 103 -111.76 gain 103 81 -108.60 gain 81 104 -119.67 gain 104 81 -121.89 gain 81 105 -112.49 gain 105 81 -110.64 gain 81 106 -116.82 gain 106 81 -116.06 gain 81 107 -113.16 gain 107 81 -118.96 gain 81 108 -111.36 gain 108 81 -109.48 gain 81 109 -106.50 gain 109 81 -108.11 gain 81 110 -100.65 gain 110 81 -100.73 gain 81 111 -93.93 gain 111 81 -93.69 gain 81 112 -100.25 gain 112 81 -98.89 gain 81 113 -110.32 gain 113 81 -107.77 gain 81 114 -118.01 gain 114 81 -118.76 gain 81 115 -112.84 gain 115 81 -107.89 gain 81 116 -114.95 gain 116 81 -117.55 gain 81 117 -124.86 gain 117 81 -128.95 gain 81 118 -122.00 gain 118 81 -124.42 gain 81 119 -124.20 gain 119 81 -121.28 gain 81 120 -121.79 gain 120 81 -123.38 gain 81 121 -117.73 gain 121 81 -118.61 gain 81 122 -109.93 gain 122 81 -112.92 gain 81 123 -117.93 gain 123 81 -121.70 gain 81 124 -105.35 gain 124 81 -105.54 gain 81 125 -105.80 gain 125 81 -107.32 gain 81 126 -109.76 gain 126 81 -109.24 gain 81 127 -108.25 gain 127 81 -111.18 gain 81 128 -107.31 gain 128 81 -108.19 gain 81 129 -111.36 gain 129 81 -110.14 gain 81 130 -117.85 gain 130 81 -114.45 gain 81 131 -113.31 gain 131 81 -117.00 gain 81 132 -118.01 gain 132 81 -121.32 gain 81 133 -120.43 gain 133 81 -121.82 gain 81 134 -119.30 gain 134 81 -117.39 gain 81 135 -121.86 gain 135 81 -123.52 gain 81 136 -127.59 gain 136 81 -129.86 gain 81 137 -118.06 gain 137 81 -117.81 gain 81 138 -118.02 gain 138 81 -116.77 gain 81 139 -107.47 gain 139 81 -107.21 gain 81 140 -105.40 gain 140 81 -107.75 gain 81 141 -106.53 gain 141 81 -107.55 gain 81 142 -115.60 gain 142 81 -115.93 gain 81 143 -111.46 gain 143 81 -111.40 gain 81 144 -108.06 gain 144 81 -109.02 gain 81 145 -121.71 gain 145 81 -121.12 gain 81 146 -120.83 gain 146 81 -119.15 gain 81 147 -118.54 gain 147 81 -113.95 gain 81 148 -114.59 gain 148 81 -109.71 gain 81 149 -123.21 gain 149 81 -121.50 gain 81 150 -125.59 gain 150 81 -126.57 gain 81 151 -121.14 gain 151 81 -122.32 gain 81 152 -123.74 gain 152 81 -121.89 gain 81 153 -111.80 gain 153 81 -107.52 gain 81 154 -107.02 gain 154 81 -111.30 gain 81 155 -110.91 gain 155 81 -115.08 gain 81 156 -103.47 gain 156 81 -102.03 gain 81 157 -116.96 gain 157 81 -118.47 gain 81 158 -110.68 gain 158 81 -114.78 gain 81 159 -120.95 gain 159 81 -121.67 gain 81 160 -116.63 gain 160 81 -114.46 gain 81 161 -116.26 gain 161 81 -117.58 gain 81 162 -124.81 gain 162 81 -124.99 gain 81 163 -122.52 gain 163 81 -124.85 gain 81 164 -117.50 gain 164 81 -120.87 gain 81 165 -122.59 gain 165 81 -122.01 gain 81 166 -124.56 gain 166 81 -125.54 gain 81 167 -118.54 gain 167 81 -121.61 gain 81 168 -113.05 gain 168 81 -114.58 gain 81 169 -116.80 gain 169 81 -122.53 gain 81 170 -112.47 gain 170 81 -109.72 gain 81 171 -120.65 gain 171 81 -122.92 gain 81 172 -123.67 gain 172 81 -120.64 gain 81 173 -118.59 gain 173 81 -115.00 gain 81 174 -110.85 gain 174 81 -111.56 gain 81 175 -123.99 gain 175 81 -128.25 gain 81 176 -118.72 gain 176 81 -114.99 gain 81 177 -126.31 gain 177 81 -130.39 gain 81 178 -123.15 gain 178 81 -123.05 gain 81 179 -119.83 gain 179 81 -118.12 gain 81 180 -122.51 gain 180 81 -122.28 gain 81 181 -123.86 gain 181 81 -123.69 gain 81 182 -121.13 gain 182 81 -123.35 gain 81 183 -111.50 gain 183 81 -107.11 gain 81 184 -126.55 gain 184 81 -126.94 gain 81 185 -116.84 gain 185 81 -114.72 gain 81 186 -116.89 gain 186 81 -115.05 gain 81 187 -116.21 gain 187 81 -116.91 gain 81 188 -113.71 gain 188 81 -117.67 gain 81 189 -124.67 gain 189 81 -126.14 gain 81 190 -122.93 gain 190 81 -121.42 gain 81 191 -112.44 gain 191 81 -112.02 gain 81 192 -126.41 gain 192 81 -128.86 gain 81 193 -125.40 gain 193 81 -129.10 gain 81 194 -126.03 gain 194 81 -123.53 gain 81 195 -129.88 gain 195 81 -128.02 gain 81 196 -119.56 gain 196 81 -121.74 gain 81 197 -126.66 gain 197 81 -124.91 gain 81 198 -119.49 gain 198 81 -117.26 gain 81 199 -116.04 gain 199 81 -117.72 gain 81 200 -117.35 gain 200 81 -115.97 gain 81 201 -118.54 gain 201 81 -117.97 gain 81 202 -121.69 gain 202 81 -125.12 gain 81 203 -125.16 gain 203 81 -128.20 gain 81 204 -124.69 gain 204 81 -125.02 gain 81 205 -120.62 gain 205 81 -120.02 gain 81 206 -119.83 gain 206 81 -123.75 gain 81 207 -117.88 gain 207 81 -114.17 gain 81 208 -120.40 gain 208 81 -122.46 gain 81 209 -124.94 gain 209 81 -128.00 gain 81 210 -124.14 gain 210 81 -124.13 gain 81 211 -119.14 gain 211 81 -121.15 gain 81 212 -115.48 gain 212 81 -116.04 gain 81 213 -125.90 gain 213 81 -125.65 gain 81 214 -121.05 gain 214 81 -120.69 gain 81 215 -124.63 gain 215 81 -120.69 gain 81 216 -120.75 gain 216 81 -121.46 gain 81 217 -124.28 gain 217 81 -125.51 gain 81 218 -118.66 gain 218 81 -122.09 gain 81 219 -114.97 gain 219 81 -109.75 gain 81 220 -123.93 gain 220 81 -129.20 gain 81 221 -126.87 gain 221 81 -127.78 gain 81 222 -120.90 gain 222 81 -122.13 gain 81 223 -120.49 gain 223 81 -120.34 gain 81 224 -129.91 gain 224 81 -132.45 gain 82 83 -104.18 gain 83 82 -105.21 gain 82 84 -97.39 gain 84 82 -98.57 gain 82 85 -108.61 gain 85 82 -106.60 gain 82 86 -107.79 gain 86 82 -109.16 gain 82 87 -114.65 gain 87 82 -119.99 gain 82 88 -114.98 gain 88 82 -118.06 gain 82 89 -114.11 gain 89 82 -115.79 gain 82 90 -115.08 gain 90 82 -113.77 gain 82 91 -113.85 gain 91 82 -116.49 gain 82 92 -118.64 gain 92 82 -118.23 gain 82 93 -108.98 gain 93 82 -113.37 gain 82 94 -104.33 gain 94 82 -108.58 gain 82 95 -101.09 gain 95 82 -107.60 gain 82 96 -93.29 gain 96 82 -97.14 gain 82 97 -87.63 gain 97 82 -90.23 gain 82 98 -98.23 gain 98 82 -101.63 gain 82 99 -102.44 gain 99 82 -103.66 gain 82 100 -100.65 gain 100 82 -101.43 gain 82 101 -113.27 gain 101 82 -114.22 gain 82 102 -102.24 gain 102 82 -103.96 gain 82 103 -117.08 gain 103 82 -116.29 gain 82 104 -111.89 gain 104 82 -116.48 gain 82 105 -115.21 gain 105 82 -115.73 gain 82 106 -111.53 gain 106 82 -113.14 gain 82 107 -110.73 gain 107 82 -118.91 gain 82 108 -113.37 gain 108 82 -113.86 gain 82 109 -105.26 gain 109 82 -109.24 gain 82 110 -106.95 gain 110 82 -109.41 gain 82 111 -99.57 gain 111 82 -101.70 gain 82 112 -99.85 gain 112 82 -100.86 gain 82 113 -99.88 gain 113 82 -99.70 gain 82 114 -100.89 gain 114 82 -104.01 gain 82 115 -106.00 gain 115 82 -103.42 gain 82 116 -104.91 gain 116 82 -109.88 gain 82 117 -117.10 gain 117 82 -123.57 gain 82 118 -108.99 gain 118 82 -113.78 gain 82 119 -114.66 gain 119 82 -114.11 gain 82 120 -115.73 gain 120 82 -119.69 gain 82 121 -115.78 gain 121 82 -119.04 gain 82 122 -117.04 gain 122 82 -122.41 gain 82 123 -120.60 gain 123 82 -126.75 gain 82 124 -107.90 gain 124 82 -110.46 gain 82 125 -106.12 gain 125 82 -110.01 gain 82 126 -99.06 gain 126 82 -100.91 gain 82 127 -102.72 gain 127 82 -108.03 gain 82 128 -99.82 gain 128 82 -103.06 gain 82 129 -106.56 gain 129 82 -107.72 gain 82 130 -107.53 gain 130 82 -106.51 gain 82 131 -115.93 gain 131 82 -121.99 gain 82 132 -114.38 gain 132 82 -120.07 gain 82 133 -117.53 gain 133 82 -121.29 gain 82 134 -116.92 gain 134 82 -117.38 gain 82 135 -116.74 gain 135 82 -120.77 gain 82 136 -112.49 gain 136 82 -117.14 gain 82 137 -114.10 gain 137 82 -116.23 gain 82 138 -114.35 gain 138 82 -115.48 gain 82 139 -112.07 gain 139 82 -114.19 gain 82 140 -108.89 gain 140 82 -113.61 gain 82 141 -108.98 gain 141 82 -112.38 gain 82 142 -110.00 gain 142 82 -112.70 gain 82 143 -111.93 gain 143 82 -114.24 gain 82 144 -105.02 gain 144 82 -108.35 gain 82 145 -104.39 gain 145 82 -106.17 gain 82 146 -117.28 gain 146 82 -117.97 gain 82 147 -112.24 gain 147 82 -110.02 gain 82 148 -111.22 gain 148 82 -108.72 gain 82 149 -109.31 gain 149 82 -109.97 gain 82 150 -116.43 gain 150 82 -119.78 gain 82 151 -123.85 gain 151 82 -127.40 gain 82 152 -121.16 gain 152 82 -121.68 gain 82 153 -119.96 gain 153 82 -118.06 gain 82 154 -114.45 gain 154 82 -121.10 gain 82 155 -115.21 gain 155 82 -121.76 gain 82 156 -112.02 gain 156 82 -112.95 gain 82 157 -112.15 gain 157 82 -116.03 gain 82 158 -117.67 gain 158 82 -124.14 gain 82 159 -116.14 gain 159 82 -119.23 gain 82 160 -117.41 gain 160 82 -117.62 gain 82 161 -107.91 gain 161 82 -111.60 gain 82 162 -116.46 gain 162 82 -119.02 gain 82 163 -117.30 gain 163 82 -122.00 gain 82 164 -121.34 gain 164 82 -127.09 gain 82 165 -120.10 gain 165 82 -121.89 gain 82 166 -117.49 gain 166 82 -120.85 gain 82 167 -112.05 gain 167 82 -117.50 gain 82 168 -107.87 gain 168 82 -111.77 gain 82 169 -124.13 gain 169 82 -132.22 gain 82 170 -118.85 gain 170 82 -118.47 gain 82 171 -110.81 gain 171 82 -115.46 gain 82 172 -107.15 gain 172 82 -106.49 gain 82 173 -114.69 gain 173 82 -113.47 gain 82 174 -115.08 gain 174 82 -118.16 gain 82 175 -122.72 gain 175 82 -129.36 gain 82 176 -117.63 gain 176 82 -116.27 gain 82 177 -123.06 gain 177 82 -129.51 gain 82 178 -126.68 gain 178 82 -128.96 gain 82 179 -123.70 gain 179 82 -124.37 gain 82 180 -127.06 gain 180 82 -129.20 gain 82 181 -115.79 gain 181 82 -118.00 gain 82 182 -118.23 gain 182 82 -122.82 gain 82 183 -115.91 gain 183 82 -113.89 gain 82 184 -122.97 gain 184 82 -125.73 gain 82 185 -110.01 gain 185 82 -110.26 gain 82 186 -115.35 gain 186 82 -115.88 gain 82 187 -117.79 gain 187 82 -120.86 gain 82 188 -115.17 gain 188 82 -121.50 gain 82 189 -121.02 gain 189 82 -124.87 gain 82 190 -115.02 gain 190 82 -115.88 gain 82 191 -118.28 gain 191 82 -120.23 gain 82 192 -117.19 gain 192 82 -122.01 gain 82 193 -120.06 gain 193 82 -126.13 gain 82 194 -122.87 gain 194 82 -122.75 gain 82 195 -122.63 gain 195 82 -123.14 gain 82 196 -125.30 gain 196 82 -129.85 gain 82 197 -114.98 gain 197 82 -115.60 gain 82 198 -121.10 gain 198 82 -121.24 gain 82 199 -119.30 gain 199 82 -123.36 gain 82 200 -119.28 gain 200 82 -120.27 gain 82 201 -122.02 gain 201 82 -123.82 gain 82 202 -110.36 gain 202 82 -116.15 gain 82 203 -115.46 gain 203 82 -120.88 gain 82 204 -124.74 gain 204 82 -127.44 gain 82 205 -109.93 gain 205 82 -111.70 gain 82 206 -121.66 gain 206 82 -127.96 gain 82 207 -124.74 gain 207 82 -123.40 gain 82 208 -116.86 gain 208 82 -121.29 gain 82 209 -120.32 gain 209 82 -125.75 gain 82 210 -125.84 gain 210 82 -128.21 gain 82 211 -119.74 gain 211 82 -124.13 gain 82 212 -125.76 gain 212 82 -128.69 gain 82 213 -121.71 gain 213 82 -123.83 gain 82 214 -117.69 gain 214 82 -119.70 gain 82 215 -117.78 gain 215 82 -116.20 gain 82 216 -117.76 gain 216 82 -120.85 gain 82 217 -122.29 gain 217 82 -125.89 gain 82 218 -123.22 gain 218 82 -129.02 gain 82 219 -119.30 gain 219 82 -116.45 gain 82 220 -123.58 gain 220 82 -131.22 gain 82 221 -120.32 gain 221 82 -123.60 gain 82 222 -120.82 gain 222 82 -124.43 gain 82 223 -112.49 gain 223 82 -114.71 gain 82 224 -122.93 gain 224 82 -127.85 gain 83 84 -92.30 gain 84 83 -92.45 gain 83 85 -104.60 gain 85 83 -101.56 gain 83 86 -113.50 gain 86 83 -113.84 gain 83 87 -113.17 gain 87 83 -117.47 gain 83 88 -110.20 gain 88 83 -112.25 gain 83 89 -115.50 gain 89 83 -116.15 gain 83 90 -122.25 gain 90 83 -119.91 gain 83 91 -115.87 gain 91 83 -117.48 gain 83 92 -121.95 gain 92 83 -120.51 gain 83 93 -108.20 gain 93 83 -111.54 gain 83 94 -114.29 gain 94 83 -117.51 gain 83 95 -106.48 gain 95 83 -111.96 gain 83 96 -95.72 gain 96 83 -98.54 gain 83 97 -103.37 gain 97 83 -104.93 gain 83 98 -86.18 gain 98 83 -88.54 gain 83 99 -98.14 gain 99 83 -98.32 gain 83 100 -101.86 gain 100 83 -101.61 gain 83 101 -105.93 gain 101 83 -105.84 gain 83 102 -107.59 gain 102 83 -108.28 gain 83 103 -117.07 gain 103 83 -115.24 gain 83 104 -113.33 gain 104 83 -116.88 gain 83 105 -124.75 gain 105 83 -124.24 gain 83 106 -118.13 gain 106 83 -118.70 gain 83 107 -111.76 gain 107 83 -118.90 gain 83 108 -110.98 gain 108 83 -110.44 gain 83 109 -111.44 gain 109 83 -114.39 gain 83 110 -110.60 gain 110 83 -112.02 gain 83 111 -100.23 gain 111 83 -101.33 gain 83 112 -107.06 gain 112 83 -107.04 gain 83 113 -96.43 gain 113 83 -95.22 gain 83 114 -107.28 gain 114 83 -109.37 gain 83 115 -104.32 gain 115 83 -100.71 gain 83 116 -112.12 gain 116 83 -116.05 gain 83 117 -112.84 gain 117 83 -118.27 gain 83 118 -117.42 gain 118 83 -121.18 gain 83 119 -116.44 gain 119 83 -114.85 gain 83 120 -117.92 gain 120 83 -120.85 gain 83 121 -120.53 gain 121 83 -122.75 gain 83 122 -118.13 gain 122 83 -122.46 gain 83 123 -115.49 gain 123 83 -120.60 gain 83 124 -115.09 gain 124 83 -116.61 gain 83 125 -114.94 gain 125 83 -117.79 gain 83 126 -112.17 gain 126 83 -112.98 gain 83 127 -100.50 gain 127 83 -104.77 gain 83 128 -105.23 gain 128 83 -107.45 gain 83 129 -112.33 gain 129 83 -112.45 gain 83 130 -114.46 gain 130 83 -112.40 gain 83 131 -114.43 gain 131 83 -119.46 gain 83 132 -111.00 gain 132 83 -115.66 gain 83 133 -122.44 gain 133 83 -125.17 gain 83 134 -116.69 gain 134 83 -116.12 gain 83 135 -121.21 gain 135 83 -124.20 gain 83 136 -124.82 gain 136 83 -128.43 gain 83 137 -120.81 gain 137 83 -121.91 gain 83 138 -117.47 gain 138 83 -117.56 gain 83 139 -118.18 gain 139 83 -119.26 gain 83 140 -116.93 gain 140 83 -120.62 gain 83 141 -109.63 gain 141 83 -111.99 gain 83 142 -114.41 gain 142 83 -116.07 gain 83 143 -109.92 gain 143 83 -111.20 gain 83 144 -112.77 gain 144 83 -115.06 gain 83 145 -109.91 gain 145 83 -110.66 gain 83 146 -113.66 gain 146 83 -113.31 gain 83 147 -115.97 gain 147 83 -112.72 gain 83 148 -114.23 gain 148 83 -110.69 gain 83 149 -114.96 gain 149 83 -114.59 gain 83 150 -123.00 gain 150 83 -125.32 gain 83 151 -121.82 gain 151 83 -124.33 gain 83 152 -128.82 gain 152 83 -128.31 gain 83 153 -116.68 gain 153 83 -113.75 gain 83 154 -119.26 gain 154 83 -124.87 gain 83 155 -122.00 gain 155 83 -127.51 gain 83 156 -111.93 gain 156 83 -111.83 gain 83 157 -106.60 gain 157 83 -109.45 gain 83 158 -111.76 gain 158 83 -117.20 gain 83 159 -105.38 gain 159 83 -107.44 gain 83 160 -110.19 gain 160 83 -109.35 gain 83 161 -116.41 gain 161 83 -119.07 gain 83 162 -115.21 gain 162 83 -116.74 gain 83 163 -114.98 gain 163 83 -118.65 gain 83 164 -122.70 gain 164 83 -127.41 gain 83 165 -115.22 gain 165 83 -115.97 gain 83 166 -112.30 gain 166 83 -114.63 gain 83 167 -125.40 gain 167 83 -129.82 gain 83 168 -115.51 gain 168 83 -118.37 gain 83 169 -118.97 gain 169 83 -126.04 gain 83 170 -116.36 gain 170 83 -114.95 gain 83 171 -123.09 gain 171 83 -126.71 gain 83 172 -120.77 gain 172 83 -119.08 gain 83 173 -110.84 gain 173 83 -108.59 gain 83 174 -121.72 gain 174 83 -123.76 gain 83 175 -112.74 gain 175 83 -118.33 gain 83 176 -122.03 gain 176 83 -119.64 gain 83 177 -119.50 gain 177 83 -124.92 gain 83 178 -119.36 gain 178 83 -120.60 gain 83 179 -120.27 gain 179 83 -119.90 gain 83 180 -124.94 gain 180 83 -126.05 gain 83 181 -125.93 gain 181 83 -127.10 gain 83 182 -120.73 gain 182 83 -124.29 gain 83 183 -122.42 gain 183 83 -119.36 gain 83 184 -126.65 gain 184 83 -128.38 gain 83 185 -113.69 gain 185 83 -112.91 gain 83 186 -121.06 gain 186 83 -120.56 gain 83 187 -114.57 gain 187 83 -116.61 gain 83 188 -118.02 gain 188 83 -123.32 gain 83 189 -116.73 gain 189 83 -119.54 gain 83 190 -120.80 gain 190 83 -120.62 gain 83 191 -120.19 gain 191 83 -121.11 gain 83 192 -115.31 gain 192 83 -119.10 gain 83 193 -121.62 gain 193 83 -126.65 gain 83 194 -124.73 gain 194 83 -123.58 gain 83 195 -123.17 gain 195 83 -122.65 gain 83 196 -117.76 gain 196 83 -121.28 gain 83 197 -125.18 gain 197 83 -124.77 gain 83 198 -116.58 gain 198 83 -115.68 gain 83 199 -121.40 gain 199 83 -124.42 gain 83 200 -117.49 gain 200 83 -117.45 gain 83 201 -120.42 gain 201 83 -121.18 gain 83 202 -119.88 gain 202 83 -124.64 gain 83 203 -126.13 gain 203 83 -130.52 gain 83 204 -116.51 gain 204 83 -118.18 gain 83 205 -122.92 gain 205 83 -123.66 gain 83 206 -126.13 gain 206 83 -131.39 gain 83 207 -120.24 gain 207 83 -117.86 gain 83 208 -122.45 gain 208 83 -125.85 gain 83 209 -119.17 gain 209 83 -123.56 gain 83 210 -122.01 gain 210 83 -123.34 gain 83 211 -126.03 gain 211 83 -129.38 gain 83 212 -116.29 gain 212 83 -118.18 gain 83 213 -117.30 gain 213 83 -118.38 gain 83 214 -119.08 gain 214 83 -120.05 gain 83 215 -117.65 gain 215 83 -115.04 gain 83 216 -124.36 gain 216 83 -126.41 gain 83 217 -120.36 gain 217 83 -122.93 gain 83 218 -120.24 gain 218 83 -125.00 gain 83 219 -118.07 gain 219 83 -114.18 gain 83 220 -123.69 gain 220 83 -130.30 gain 83 221 -121.26 gain 221 83 -123.51 gain 83 222 -120.59 gain 222 83 -123.16 gain 83 223 -119.33 gain 223 83 -120.52 gain 83 224 -119.74 gain 224 83 -123.62 gain 84 85 -95.45 gain 85 84 -92.25 gain 84 86 -101.99 gain 86 84 -102.18 gain 84 87 -99.59 gain 87 84 -103.74 gain 84 88 -110.81 gain 88 84 -112.71 gain 84 89 -108.60 gain 89 84 -109.11 gain 84 90 -120.96 gain 90 84 -118.47 gain 84 91 -107.59 gain 91 84 -109.05 gain 84 92 -119.29 gain 92 84 -117.71 gain 84 93 -110.67 gain 93 84 -113.87 gain 84 94 -119.37 gain 94 84 -122.45 gain 84 95 -110.40 gain 95 84 -115.73 gain 84 96 -103.91 gain 96 84 -106.58 gain 84 97 -103.27 gain 97 84 -104.68 gain 84 98 -102.78 gain 98 84 -104.99 gain 84 99 -96.08 gain 99 84 -96.11 gain 84 100 -95.43 gain 100 84 -95.03 gain 84 101 -102.35 gain 101 84 -102.11 gain 84 102 -105.06 gain 102 84 -105.60 gain 84 103 -119.27 gain 103 84 -117.30 gain 84 104 -110.63 gain 104 84 -114.04 gain 84 105 -125.43 gain 105 84 -124.78 gain 84 106 -116.40 gain 106 84 -116.83 gain 84 107 -120.76 gain 107 84 -127.76 gain 84 108 -114.31 gain 108 84 -113.63 gain 84 109 -110.39 gain 109 84 -113.19 gain 84 110 -107.85 gain 110 84 -109.13 gain 84 111 -103.66 gain 111 84 -104.61 gain 84 112 -108.30 gain 112 84 -108.14 gain 84 113 -112.71 gain 113 84 -111.34 gain 84 114 -106.66 gain 114 84 -108.60 gain 84 115 -106.08 gain 115 84 -102.32 gain 84 116 -108.03 gain 116 84 -111.82 gain 84 117 -108.53 gain 117 84 -113.81 gain 84 118 -109.05 gain 118 84 -112.66 gain 84 119 -112.64 gain 119 84 -110.91 gain 84 120 -126.31 gain 120 84 -129.09 gain 84 121 -115.18 gain 121 84 -117.26 gain 84 122 -118.64 gain 122 84 -122.83 gain 84 123 -116.98 gain 123 84 -121.95 gain 84 124 -113.78 gain 124 84 -115.15 gain 84 125 -117.01 gain 125 84 -119.72 gain 84 126 -112.97 gain 126 84 -113.63 gain 84 127 -104.65 gain 127 84 -108.77 gain 84 128 -112.41 gain 128 84 -114.48 gain 84 129 -107.45 gain 129 84 -107.43 gain 84 130 -115.75 gain 130 84 -113.55 gain 84 131 -112.87 gain 131 84 -117.75 gain 84 132 -112.22 gain 132 84 -116.73 gain 84 133 -111.42 gain 133 84 -114.00 gain 84 134 -117.13 gain 134 84 -116.41 gain 84 135 -118.35 gain 135 84 -121.20 gain 84 136 -116.90 gain 136 84 -120.36 gain 84 137 -116.94 gain 137 84 -117.88 gain 84 138 -109.97 gain 138 84 -109.92 gain 84 139 -121.60 gain 139 84 -122.53 gain 84 140 -116.92 gain 140 84 -120.46 gain 84 141 -111.65 gain 141 84 -113.86 gain 84 142 -110.60 gain 142 84 -112.12 gain 84 143 -116.41 gain 143 84 -117.54 gain 84 144 -103.88 gain 144 84 -106.03 gain 84 145 -115.81 gain 145 84 -116.41 gain 84 146 -112.46 gain 146 84 -111.97 gain 84 147 -118.42 gain 147 84 -115.02 gain 84 148 -118.02 gain 148 84 -114.33 gain 84 149 -114.68 gain 149 84 -114.17 gain 84 150 -128.80 gain 150 84 -130.97 gain 84 151 -122.62 gain 151 84 -124.99 gain 84 152 -116.58 gain 152 84 -115.92 gain 84 153 -127.69 gain 153 84 -124.61 gain 84 154 -123.92 gain 154 84 -129.38 gain 84 155 -114.18 gain 155 84 -119.55 gain 84 156 -120.45 gain 156 84 -120.20 gain 84 157 -113.28 gain 157 84 -115.97 gain 84 158 -119.16 gain 158 84 -124.45 gain 84 159 -108.18 gain 159 84 -110.09 gain 84 160 -118.66 gain 160 84 -117.68 gain 84 161 -114.60 gain 161 84 -117.11 gain 84 162 -108.11 gain 162 84 -109.49 gain 84 163 -112.77 gain 163 84 -116.30 gain 84 164 -123.30 gain 164 84 -127.86 gain 84 165 -130.79 gain 165 84 -131.40 gain 84 166 -123.78 gain 166 84 -125.95 gain 84 167 -119.30 gain 167 84 -123.56 gain 84 168 -123.08 gain 168 84 -125.80 gain 84 169 -124.00 gain 169 84 -130.92 gain 84 170 -116.63 gain 170 84 -115.07 gain 84 171 -115.10 gain 171 84 -118.57 gain 84 172 -116.30 gain 172 84 -114.46 gain 84 173 -113.48 gain 173 84 -111.07 gain 84 174 -117.93 gain 174 84 -119.82 gain 84 175 -117.59 gain 175 84 -123.04 gain 84 176 -111.65 gain 176 84 -109.11 gain 84 177 -118.55 gain 177 84 -123.82 gain 84 178 -120.81 gain 178 84 -121.91 gain 84 179 -119.42 gain 179 84 -118.91 gain 84 180 -119.57 gain 180 84 -120.53 gain 84 181 -122.55 gain 181 84 -123.57 gain 84 182 -124.83 gain 182 84 -128.24 gain 84 183 -122.77 gain 183 84 -119.57 gain 84 184 -114.03 gain 184 84 -115.61 gain 84 185 -119.83 gain 185 84 -118.90 gain 84 186 -121.78 gain 186 84 -121.13 gain 84 187 -114.74 gain 187 84 -116.63 gain 84 188 -113.32 gain 188 84 -118.47 gain 84 189 -108.54 gain 189 84 -111.21 gain 84 190 -115.49 gain 190 84 -115.17 gain 84 191 -118.72 gain 191 84 -119.49 gain 84 192 -114.47 gain 192 84 -118.11 gain 84 193 -115.45 gain 193 84 -120.34 gain 84 194 -122.23 gain 194 84 -120.93 gain 84 195 -119.08 gain 195 84 -118.41 gain 84 196 -120.39 gain 196 84 -123.76 gain 84 197 -127.16 gain 197 84 -126.60 gain 84 198 -118.22 gain 198 84 -117.18 gain 84 199 -119.95 gain 199 84 -122.82 gain 84 200 -126.05 gain 200 84 -125.86 gain 84 201 -116.32 gain 201 84 -116.93 gain 84 202 -123.21 gain 202 84 -127.83 gain 84 203 -120.25 gain 203 84 -124.49 gain 84 204 -119.45 gain 204 84 -120.97 gain 84 205 -119.34 gain 205 84 -119.94 gain 84 206 -120.16 gain 206 84 -125.27 gain 84 207 -117.56 gain 207 84 -115.03 gain 84 208 -116.96 gain 208 84 -120.21 gain 84 209 -118.64 gain 209 84 -122.89 gain 84 210 -130.10 gain 210 84 -131.28 gain 84 211 -125.42 gain 211 84 -128.63 gain 84 212 -126.88 gain 212 84 -128.63 gain 84 213 -122.57 gain 213 84 -123.51 gain 84 214 -121.14 gain 214 84 -121.97 gain 84 215 -125.76 gain 215 84 -123.00 gain 84 216 -121.90 gain 216 84 -123.80 gain 84 217 -122.51 gain 217 84 -124.93 gain 84 218 -114.15 gain 218 84 -118.76 gain 84 219 -114.62 gain 219 84 -110.59 gain 84 220 -116.18 gain 220 84 -122.64 gain 84 221 -120.67 gain 221 84 -122.77 gain 84 222 -127.87 gain 222 84 -130.30 gain 84 223 -123.07 gain 223 84 -124.11 gain 84 224 -110.32 gain 224 84 -114.05 gain 85 86 -90.76 gain 86 85 -94.14 gain 85 87 -94.67 gain 87 85 -102.01 gain 85 88 -100.12 gain 88 85 -105.21 gain 85 89 -108.51 gain 89 85 -112.21 gain 85 90 -113.48 gain 90 85 -114.18 gain 85 91 -120.00 gain 91 85 -124.65 gain 85 92 -117.14 gain 92 85 -118.75 gain 85 93 -117.49 gain 93 85 -123.89 gain 85 94 -112.04 gain 94 85 -118.31 gain 85 95 -102.68 gain 95 85 -111.21 gain 85 96 -105.73 gain 96 85 -111.60 gain 85 97 -107.19 gain 97 85 -111.79 gain 85 98 -101.67 gain 98 85 -107.08 gain 85 99 -86.70 gain 99 85 -89.93 gain 85 100 -91.84 gain 100 85 -94.63 gain 85 101 -92.97 gain 101 85 -95.92 gain 85 102 -96.01 gain 102 85 -99.75 gain 85 103 -102.95 gain 103 85 -104.17 gain 85 104 -111.96 gain 104 85 -118.55 gain 85 105 -129.06 gain 105 85 -131.60 gain 85 106 -113.93 gain 106 85 -117.56 gain 85 107 -114.80 gain 107 85 -124.99 gain 85 108 -112.70 gain 108 85 -115.20 gain 85 109 -116.72 gain 109 85 -122.71 gain 85 110 -108.97 gain 110 85 -113.43 gain 85 111 -103.80 gain 111 85 -107.94 gain 85 112 -107.48 gain 112 85 -110.50 gain 85 113 -106.45 gain 113 85 -108.28 gain 85 114 -101.18 gain 114 85 -106.31 gain 85 115 -99.37 gain 115 85 -98.81 gain 85 116 -96.88 gain 116 85 -103.86 gain 85 117 -102.44 gain 117 85 -110.91 gain 85 118 -109.13 gain 118 85 -115.93 gain 85 119 -111.54 gain 119 85 -113.00 gain 85 120 -116.25 gain 120 85 -122.22 gain 85 121 -119.11 gain 121 85 -124.37 gain 85 122 -112.33 gain 122 85 -119.71 gain 85 123 -113.14 gain 123 85 -121.29 gain 85 124 -104.76 gain 124 85 -109.32 gain 85 125 -115.34 gain 125 85 -121.24 gain 85 126 -114.57 gain 126 85 -118.42 gain 85 127 -107.54 gain 127 85 -114.86 gain 85 128 -102.38 gain 128 85 -107.64 gain 85 129 -98.22 gain 129 85 -101.39 gain 85 130 -105.33 gain 130 85 -106.32 gain 85 131 -101.63 gain 131 85 -109.70 gain 85 132 -105.79 gain 132 85 -113.50 gain 85 133 -104.32 gain 133 85 -110.09 gain 85 134 -107.90 gain 134 85 -110.37 gain 85 135 -120.07 gain 135 85 -126.11 gain 85 136 -116.40 gain 136 85 -123.05 gain 85 137 -117.49 gain 137 85 -121.62 gain 85 138 -117.06 gain 138 85 -120.19 gain 85 139 -116.23 gain 139 85 -120.35 gain 85 140 -112.03 gain 140 85 -118.76 gain 85 141 -116.33 gain 141 85 -121.73 gain 85 142 -113.94 gain 142 85 -118.65 gain 85 143 -111.17 gain 143 85 -115.49 gain 85 144 -95.39 gain 144 85 -100.73 gain 85 145 -107.55 gain 145 85 -111.35 gain 85 146 -109.51 gain 146 85 -112.21 gain 85 147 -108.97 gain 147 85 -108.76 gain 85 148 -110.75 gain 148 85 -110.26 gain 85 149 -113.39 gain 149 85 -116.06 gain 85 150 -120.15 gain 150 85 -125.51 gain 85 151 -119.02 gain 151 85 -124.57 gain 85 152 -118.02 gain 152 85 -120.55 gain 85 153 -128.60 gain 153 85 -128.71 gain 85 154 -110.18 gain 154 85 -118.84 gain 85 155 -113.94 gain 155 85 -122.50 gain 85 156 -111.95 gain 156 85 -114.89 gain 85 157 -103.05 gain 157 85 -108.94 gain 85 158 -106.87 gain 158 85 -115.36 gain 85 159 -110.81 gain 159 85 -115.91 gain 85 160 -116.11 gain 160 85 -118.32 gain 85 161 -111.69 gain 161 85 -117.40 gain 85 162 -112.23 gain 162 85 -116.80 gain 85 163 -117.22 gain 163 85 -123.94 gain 85 164 -114.91 gain 164 85 -122.66 gain 85 165 -116.26 gain 165 85 -120.06 gain 85 166 -115.21 gain 166 85 -120.58 gain 85 167 -117.50 gain 167 85 -124.96 gain 85 168 -117.33 gain 168 85 -123.24 gain 85 169 -116.45 gain 169 85 -126.56 gain 85 170 -111.49 gain 170 85 -113.13 gain 85 171 -107.15 gain 171 85 -113.81 gain 85 172 -116.10 gain 172 85 -117.46 gain 85 173 -110.09 gain 173 85 -110.88 gain 85 174 -111.00 gain 174 85 -116.09 gain 85 175 -116.92 gain 175 85 -125.57 gain 85 176 -113.65 gain 176 85 -114.30 gain 85 177 -112.20 gain 177 85 -120.67 gain 85 178 -114.25 gain 178 85 -118.54 gain 85 179 -120.57 gain 179 85 -123.25 gain 85 180 -122.20 gain 180 85 -126.35 gain 85 181 -116.22 gain 181 85 -120.43 gain 85 182 -114.30 gain 182 85 -120.90 gain 85 183 -120.25 gain 183 85 -120.25 gain 85 184 -118.55 gain 184 85 -123.32 gain 85 185 -119.44 gain 185 85 -121.70 gain 85 186 -120.64 gain 186 85 -123.18 gain 85 187 -117.69 gain 187 85 -122.77 gain 85 188 -115.52 gain 188 85 -123.87 gain 85 189 -112.32 gain 189 85 -118.18 gain 85 190 -104.95 gain 190 85 -107.82 gain 85 191 -115.84 gain 191 85 -119.81 gain 85 192 -110.04 gain 192 85 -116.87 gain 85 193 -115.67 gain 193 85 -123.75 gain 85 194 -116.76 gain 194 85 -118.65 gain 85 195 -125.11 gain 195 85 -127.64 gain 85 196 -123.88 gain 196 85 -130.45 gain 85 197 -120.82 gain 197 85 -123.45 gain 85 198 -119.95 gain 198 85 -122.10 gain 85 199 -129.86 gain 199 85 -135.92 gain 85 200 -113.16 gain 200 85 -116.16 gain 85 201 -117.80 gain 201 85 -121.61 gain 85 202 -116.64 gain 202 85 -124.44 gain 85 203 -116.54 gain 203 85 -123.98 gain 85 204 -118.06 gain 204 85 -122.77 gain 85 205 -119.85 gain 205 85 -123.63 gain 85 206 -114.27 gain 206 85 -122.58 gain 85 207 -114.76 gain 207 85 -115.43 gain 85 208 -117.56 gain 208 85 -124.01 gain 85 209 -120.53 gain 209 85 -127.97 gain 85 210 -120.60 gain 210 85 -124.98 gain 85 211 -115.21 gain 211 85 -121.61 gain 85 212 -120.43 gain 212 85 -125.37 gain 85 213 -115.42 gain 213 85 -119.55 gain 85 214 -117.44 gain 214 85 -121.46 gain 85 215 -120.36 gain 215 85 -120.79 gain 85 216 -117.70 gain 216 85 -122.79 gain 85 217 -117.65 gain 217 85 -123.27 gain 85 218 -119.08 gain 218 85 -126.89 gain 85 219 -118.60 gain 219 85 -117.76 gain 85 220 -115.31 gain 220 85 -124.96 gain 85 221 -109.30 gain 221 85 -114.60 gain 85 222 -118.99 gain 222 85 -124.62 gain 85 223 -116.75 gain 223 85 -120.98 gain 85 224 -119.28 gain 224 85 -126.21 gain 86 87 -90.63 gain 87 86 -94.60 gain 86 88 -100.90 gain 88 86 -102.61 gain 86 89 -106.03 gain 89 86 -106.35 gain 86 90 -123.97 gain 90 86 -121.29 gain 86 91 -124.54 gain 91 86 -125.80 gain 86 92 -119.35 gain 92 86 -117.58 gain 86 93 -122.48 gain 93 86 -125.50 gain 86 94 -115.80 gain 94 86 -118.69 gain 86 95 -122.31 gain 95 86 -127.46 gain 86 96 -111.12 gain 96 86 -113.60 gain 86 97 -112.17 gain 97 86 -113.40 gain 86 98 -111.19 gain 98 86 -113.22 gain 86 99 -101.83 gain 99 86 -101.67 gain 86 100 -98.50 gain 100 86 -97.90 gain 86 101 -99.92 gain 101 86 -99.50 gain 86 102 -94.25 gain 102 86 -94.60 gain 86 103 -100.65 gain 103 86 -98.49 gain 86 104 -110.14 gain 104 86 -113.35 gain 86 105 -123.56 gain 105 86 -122.72 gain 86 106 -120.73 gain 106 86 -120.97 gain 86 107 -119.05 gain 107 86 -125.86 gain 86 108 -115.99 gain 108 86 -115.11 gain 86 109 -121.13 gain 109 86 -123.74 gain 86 110 -114.46 gain 110 86 -115.54 gain 86 111 -111.29 gain 111 86 -112.05 gain 86 112 -107.72 gain 112 86 -107.36 gain 86 113 -106.85 gain 113 86 -105.29 gain 86 114 -100.40 gain 114 86 -102.15 gain 86 115 -104.37 gain 115 86 -100.43 gain 86 116 -100.60 gain 116 86 -104.20 gain 86 117 -108.52 gain 117 86 -113.61 gain 86 118 -107.95 gain 118 86 -111.37 gain 86 119 -111.64 gain 119 86 -109.72 gain 86 120 -122.99 gain 120 86 -125.58 gain 86 121 -125.32 gain 121 86 -127.20 gain 86 122 -122.22 gain 122 86 -126.22 gain 86 123 -119.13 gain 123 86 -123.90 gain 86 124 -113.38 gain 124 86 -114.56 gain 86 125 -107.53 gain 125 86 -110.05 gain 86 126 -115.78 gain 126 86 -116.25 gain 86 127 -109.99 gain 127 86 -113.93 gain 86 128 -114.71 gain 128 86 -116.58 gain 86 129 -105.36 gain 129 86 -105.14 gain 86 130 -105.59 gain 130 86 -103.20 gain 86 131 -102.40 gain 131 86 -107.10 gain 86 132 -106.03 gain 132 86 -110.35 gain 86 133 -110.84 gain 133 86 -113.23 gain 86 134 -117.59 gain 134 86 -116.68 gain 86 135 -125.25 gain 135 86 -127.91 gain 86 136 -112.28 gain 136 86 -115.55 gain 86 137 -124.32 gain 137 86 -125.07 gain 86 138 -122.13 gain 138 86 -121.89 gain 86 139 -121.18 gain 139 86 -121.92 gain 86 140 -121.96 gain 140 86 -125.30 gain 86 141 -122.39 gain 141 86 -124.42 gain 86 142 -116.26 gain 142 86 -117.58 gain 86 143 -110.85 gain 143 86 -111.80 gain 86 144 -109.23 gain 144 86 -111.19 gain 86 145 -106.79 gain 145 86 -107.20 gain 86 146 -106.91 gain 146 86 -106.23 gain 86 147 -106.50 gain 147 86 -102.91 gain 86 148 -113.19 gain 148 86 -109.32 gain 86 149 -110.58 gain 149 86 -109.88 gain 86 150 -122.33 gain 150 86 -124.31 gain 86 151 -130.32 gain 151 86 -132.50 gain 86 152 -123.05 gain 152 86 -122.20 gain 86 153 -122.50 gain 153 86 -119.23 gain 86 154 -121.92 gain 154 86 -127.20 gain 86 155 -124.85 gain 155 86 -130.03 gain 86 156 -121.20 gain 156 86 -120.76 gain 86 157 -117.97 gain 157 86 -120.47 gain 86 158 -111.01 gain 158 86 -116.11 gain 86 159 -118.19 gain 159 86 -119.90 gain 86 160 -112.64 gain 160 86 -111.48 gain 86 161 -111.73 gain 161 86 -114.05 gain 86 162 -117.29 gain 162 86 -118.47 gain 86 163 -113.76 gain 163 86 -117.09 gain 86 164 -117.19 gain 164 86 -121.57 gain 86 165 -121.42 gain 165 86 -121.83 gain 86 166 -118.25 gain 166 86 -120.23 gain 86 167 -117.59 gain 167 86 -121.67 gain 86 168 -123.83 gain 168 86 -126.36 gain 86 169 -119.58 gain 169 86 -126.30 gain 86 170 -120.41 gain 170 86 -118.66 gain 86 171 -125.40 gain 171 86 -128.68 gain 86 172 -121.49 gain 172 86 -119.46 gain 86 173 -116.71 gain 173 86 -114.12 gain 86 174 -112.56 gain 174 86 -114.27 gain 86 175 -116.09 gain 175 86 -121.35 gain 86 176 -117.09 gain 176 86 -114.36 gain 86 177 -117.17 gain 177 86 -122.25 gain 86 178 -114.94 gain 178 86 -115.85 gain 86 179 -121.14 gain 179 86 -120.44 gain 86 180 -118.43 gain 180 86 -119.20 gain 86 181 -126.21 gain 181 86 -127.05 gain 86 182 -132.55 gain 182 86 -135.77 gain 86 183 -124.57 gain 183 86 -121.18 gain 86 184 -125.55 gain 184 86 -126.94 gain 86 185 -128.20 gain 185 86 -127.07 gain 86 186 -120.42 gain 186 86 -119.59 gain 86 187 -121.04 gain 187 86 -122.74 gain 86 188 -113.50 gain 188 86 -118.47 gain 86 189 -115.50 gain 189 86 -117.98 gain 86 190 -121.40 gain 190 86 -120.89 gain 86 191 -120.17 gain 191 86 -120.75 gain 86 192 -119.17 gain 192 86 -122.62 gain 86 193 -119.82 gain 193 86 -124.52 gain 86 194 -115.11 gain 194 86 -113.62 gain 86 195 -122.27 gain 195 86 -121.41 gain 86 196 -125.84 gain 196 86 -129.02 gain 86 197 -129.89 gain 197 86 -129.13 gain 86 198 -122.11 gain 198 86 -120.87 gain 86 199 -118.19 gain 199 86 -120.87 gain 86 200 -127.96 gain 200 86 -127.58 gain 86 201 -121.75 gain 201 86 -122.18 gain 86 202 -125.00 gain 202 86 -129.43 gain 86 203 -128.80 gain 203 86 -132.85 gain 86 204 -123.39 gain 204 86 -124.72 gain 86 205 -113.01 gain 205 86 -113.41 gain 86 206 -116.92 gain 206 86 -121.85 gain 86 207 -115.10 gain 207 86 -112.39 gain 86 208 -126.40 gain 208 86 -129.47 gain 86 209 -120.46 gain 209 86 -124.52 gain 86 210 -126.82 gain 210 86 -127.82 gain 86 211 -120.34 gain 211 86 -123.36 gain 86 212 -121.78 gain 212 86 -123.34 gain 86 213 -133.04 gain 213 86 -133.78 gain 86 214 -123.59 gain 214 86 -124.23 gain 86 215 -123.03 gain 215 86 -120.08 gain 86 216 -114.25 gain 216 86 -115.97 gain 86 217 -111.25 gain 217 86 -113.48 gain 86 218 -128.76 gain 218 86 -133.18 gain 86 219 -125.61 gain 219 86 -121.39 gain 86 220 -117.03 gain 220 86 -123.30 gain 86 221 -116.14 gain 221 86 -118.06 gain 86 222 -124.49 gain 222 86 -126.73 gain 86 223 -123.94 gain 223 86 -124.80 gain 86 224 -119.39 gain 224 86 -122.93 gain 87 88 -96.91 gain 88 87 -94.66 gain 87 89 -103.49 gain 89 87 -99.84 gain 87 90 -131.41 gain 90 87 -124.77 gain 87 91 -124.06 gain 91 87 -121.36 gain 87 92 -126.27 gain 92 87 -120.53 gain 87 93 -122.13 gain 93 87 -121.18 gain 87 94 -121.44 gain 94 87 -120.37 gain 87 95 -121.81 gain 95 87 -122.99 gain 87 96 -119.49 gain 96 87 -118.01 gain 87 97 -114.09 gain 97 87 -111.35 gain 87 98 -115.72 gain 98 87 -113.78 gain 87 99 -112.10 gain 99 87 -107.98 gain 87 100 -111.14 gain 100 87 -106.58 gain 87 101 -99.86 gain 101 87 -95.47 gain 87 102 -106.11 gain 102 87 -102.50 gain 87 103 -100.67 gain 103 87 -94.55 gain 87 104 -104.63 gain 104 87 -103.88 gain 87 105 -122.88 gain 105 87 -118.07 gain 87 106 -124.68 gain 106 87 -120.96 gain 87 107 -129.54 gain 107 87 -132.38 gain 87 108 -123.12 gain 108 87 -118.28 gain 87 109 -124.83 gain 109 87 -123.48 gain 87 110 -129.45 gain 110 87 -126.57 gain 87 111 -118.93 gain 111 87 -115.73 gain 87 112 -124.45 gain 112 87 -120.13 gain 87 113 -115.04 gain 113 87 -109.53 gain 87 114 -110.75 gain 114 87 -108.54 gain 87 115 -105.41 gain 115 87 -97.50 gain 87 116 -105.09 gain 116 87 -104.72 gain 87 117 -105.65 gain 117 87 -106.78 gain 87 118 -102.16 gain 118 87 -101.61 gain 87 119 -111.17 gain 119 87 -105.29 gain 87 120 -131.37 gain 120 87 -130.00 gain 87 121 -129.13 gain 121 87 -127.05 gain 87 122 -127.59 gain 122 87 -127.63 gain 87 123 -125.69 gain 123 87 -126.50 gain 87 124 -118.23 gain 124 87 -115.45 gain 87 125 -126.70 gain 125 87 -125.26 gain 87 126 -119.65 gain 126 87 -116.16 gain 87 127 -122.80 gain 127 87 -122.78 gain 87 128 -120.54 gain 128 87 -118.45 gain 87 129 -113.00 gain 129 87 -108.82 gain 87 130 -114.97 gain 130 87 -108.61 gain 87 131 -116.40 gain 131 87 -117.13 gain 87 132 -112.77 gain 132 87 -113.13 gain 87 133 -113.80 gain 133 87 -112.23 gain 87 134 -115.77 gain 134 87 -110.90 gain 87 135 -128.76 gain 135 87 -127.46 gain 87 136 -130.48 gain 136 87 -129.78 gain 87 137 -132.08 gain 137 87 -128.88 gain 87 138 -121.68 gain 138 87 -117.47 gain 87 139 -127.01 gain 139 87 -123.79 gain 87 140 -122.68 gain 140 87 -122.07 gain 87 141 -121.19 gain 141 87 -119.25 gain 87 142 -119.53 gain 142 87 -116.89 gain 87 143 -123.88 gain 143 87 -120.86 gain 87 144 -115.37 gain 144 87 -113.37 gain 87 145 -113.80 gain 145 87 -110.25 gain 87 146 -112.45 gain 146 87 -107.80 gain 87 147 -111.94 gain 147 87 -104.38 gain 87 148 -118.45 gain 148 87 -110.61 gain 87 149 -109.62 gain 149 87 -104.95 gain 87 150 -125.43 gain 150 87 -123.45 gain 87 151 -129.63 gain 151 87 -127.85 gain 87 152 -133.03 gain 152 87 -128.22 gain 87 153 -134.07 gain 153 87 -126.83 gain 87 154 -118.87 gain 154 87 -120.19 gain 87 155 -125.85 gain 155 87 -127.06 gain 87 156 -123.30 gain 156 87 -118.90 gain 87 157 -117.32 gain 157 87 -115.87 gain 87 158 -121.61 gain 158 87 -122.75 gain 87 159 -116.54 gain 159 87 -114.30 gain 87 160 -122.44 gain 160 87 -117.31 gain 87 161 -115.79 gain 161 87 -114.15 gain 87 162 -115.48 gain 162 87 -112.70 gain 87 163 -116.85 gain 163 87 -116.22 gain 87 164 -116.52 gain 164 87 -116.94 gain 87 165 -131.66 gain 165 87 -128.11 gain 87 166 -133.94 gain 166 87 -131.96 gain 87 167 -125.27 gain 167 87 -125.38 gain 87 168 -128.53 gain 168 87 -127.10 gain 87 169 -128.59 gain 169 87 -131.35 gain 87 170 -128.63 gain 170 87 -122.91 gain 87 171 -121.80 gain 171 87 -121.11 gain 87 172 -125.60 gain 172 87 -119.61 gain 87 173 -125.81 gain 173 87 -119.25 gain 87 174 -115.24 gain 174 87 -112.98 gain 87 175 -119.59 gain 175 87 -120.89 gain 87 176 -118.45 gain 176 87 -111.76 gain 87 177 -123.70 gain 177 87 -124.82 gain 87 178 -119.46 gain 178 87 -116.41 gain 87 179 -126.50 gain 179 87 -121.84 gain 87 180 -133.29 gain 180 87 -130.09 gain 87 181 -133.39 gain 181 87 -130.26 gain 87 182 -128.98 gain 182 87 -128.23 gain 87 183 -123.33 gain 183 87 -115.98 gain 87 184 -118.59 gain 184 87 -116.02 gain 87 185 -126.17 gain 185 87 -121.08 gain 87 186 -130.59 gain 186 87 -125.79 gain 87 187 -118.33 gain 187 87 -116.07 gain 87 188 -125.45 gain 188 87 -126.45 gain 87 189 -122.29 gain 189 87 -120.81 gain 87 190 -121.05 gain 190 87 -116.58 gain 87 191 -118.33 gain 191 87 -114.94 gain 87 192 -112.33 gain 192 87 -111.81 gain 87 193 -114.38 gain 193 87 -115.11 gain 87 194 -114.72 gain 194 87 -109.27 gain 87 195 -127.73 gain 195 87 -122.91 gain 87 196 -129.64 gain 196 87 -128.86 gain 87 197 -134.44 gain 197 87 -129.72 gain 87 198 -128.76 gain 198 87 -123.56 gain 87 199 -129.14 gain 199 87 -127.86 gain 87 200 -120.25 gain 200 87 -115.91 gain 87 201 -130.36 gain 201 87 -126.82 gain 87 202 -129.54 gain 202 87 -130.01 gain 87 203 -124.94 gain 203 87 -125.02 gain 87 204 -121.20 gain 204 87 -118.57 gain 87 205 -127.49 gain 205 87 -123.93 gain 87 206 -125.71 gain 206 87 -126.67 gain 87 207 -117.40 gain 207 87 -110.73 gain 87 208 -113.85 gain 208 87 -112.95 gain 87 209 -120.97 gain 209 87 -121.06 gain 87 210 -132.46 gain 210 87 -129.49 gain 87 211 -132.07 gain 211 87 -131.12 gain 87 212 -133.00 gain 212 87 -130.60 gain 87 213 -132.09 gain 213 87 -128.88 gain 87 214 -130.24 gain 214 87 -126.91 gain 87 215 -129.02 gain 215 87 -122.11 gain 87 216 -124.94 gain 216 87 -122.69 gain 87 217 -124.41 gain 217 87 -122.68 gain 87 218 -125.24 gain 218 87 -125.70 gain 87 219 -118.55 gain 219 87 -110.36 gain 87 220 -127.94 gain 220 87 -130.25 gain 87 221 -118.81 gain 221 87 -116.76 gain 87 222 -127.94 gain 222 87 -126.22 gain 87 223 -123.83 gain 223 87 -120.72 gain 87 224 -119.65 gain 224 87 -119.23 gain 88 89 -95.68 gain 89 88 -94.28 gain 88 90 -129.22 gain 90 88 -124.83 gain 88 91 -120.87 gain 91 88 -120.42 gain 88 92 -123.33 gain 92 88 -119.85 gain 88 93 -122.58 gain 93 88 -123.88 gain 88 94 -125.68 gain 94 88 -126.85 gain 88 95 -121.34 gain 95 88 -124.77 gain 88 96 -111.03 gain 96 88 -111.80 gain 88 97 -116.36 gain 97 88 -115.87 gain 88 98 -110.89 gain 98 88 -111.20 gain 88 99 -111.84 gain 99 88 -109.97 gain 88 100 -107.01 gain 100 88 -104.71 gain 88 101 -109.36 gain 101 88 -107.22 gain 88 102 -97.70 gain 102 88 -96.34 gain 88 103 -91.69 gain 103 88 -87.81 gain 88 104 -103.73 gain 104 88 -105.23 gain 88 105 -125.68 gain 105 88 -123.12 gain 88 106 -128.53 gain 106 88 -127.05 gain 88 107 -127.15 gain 107 88 -132.25 gain 88 108 -123.78 gain 108 88 -121.19 gain 88 109 -124.45 gain 109 88 -125.35 gain 88 110 -124.91 gain 110 88 -124.28 gain 88 111 -119.84 gain 111 88 -118.89 gain 88 112 -117.26 gain 112 88 -115.19 gain 88 113 -114.04 gain 113 88 -110.78 gain 88 114 -105.81 gain 114 88 -105.85 gain 88 115 -109.97 gain 115 88 -104.31 gain 88 116 -107.96 gain 116 88 -109.84 gain 88 117 -100.30 gain 117 88 -103.68 gain 88 118 -103.02 gain 118 88 -104.73 gain 88 119 -106.95 gain 119 88 -103.32 gain 88 120 -130.35 gain 120 88 -131.23 gain 88 121 -127.22 gain 121 88 -127.39 gain 88 122 -122.58 gain 122 88 -124.87 gain 88 123 -126.00 gain 123 88 -129.06 gain 88 124 -125.61 gain 124 88 -125.08 gain 88 125 -125.15 gain 125 88 -125.95 gain 88 126 -121.63 gain 126 88 -120.39 gain 88 127 -119.82 gain 127 88 -122.04 gain 88 128 -119.35 gain 128 88 -119.52 gain 88 129 -120.32 gain 129 88 -118.39 gain 88 130 -116.37 gain 130 88 -112.27 gain 88 131 -110.21 gain 131 88 -113.19 gain 88 132 -103.79 gain 132 88 -106.40 gain 88 133 -102.25 gain 133 88 -102.93 gain 88 134 -109.64 gain 134 88 -107.02 gain 88 135 -122.24 gain 135 88 -123.19 gain 88 136 -125.60 gain 136 88 -127.16 gain 88 137 -122.83 gain 137 88 -121.87 gain 88 138 -129.20 gain 138 88 -127.24 gain 88 139 -124.11 gain 139 88 -123.14 gain 88 140 -126.52 gain 140 88 -128.15 gain 88 141 -123.88 gain 141 88 -124.19 gain 88 142 -123.09 gain 142 88 -122.70 gain 88 143 -120.19 gain 143 88 -119.42 gain 88 144 -113.66 gain 144 88 -113.91 gain 88 145 -114.50 gain 145 88 -113.20 gain 88 146 -112.78 gain 146 88 -110.38 gain 88 147 -112.22 gain 147 88 -106.91 gain 88 148 -105.00 gain 148 88 -99.41 gain 88 149 -113.81 gain 149 88 -111.39 gain 88 150 -131.93 gain 150 88 -132.19 gain 88 151 -124.76 gain 151 88 -125.22 gain 88 152 -121.57 gain 152 88 -119.01 gain 88 153 -133.21 gain 153 88 -128.23 gain 88 154 -127.70 gain 154 88 -131.26 gain 88 155 -125.25 gain 155 88 -128.71 gain 88 156 -124.99 gain 156 88 -122.84 gain 88 157 -119.99 gain 157 88 -120.78 gain 88 158 -116.59 gain 158 88 -119.98 gain 88 159 -116.01 gain 159 88 -116.02 gain 88 160 -122.99 gain 160 88 -120.10 gain 88 161 -117.76 gain 161 88 -118.37 gain 88 162 -112.84 gain 162 88 -112.31 gain 88 163 -117.15 gain 163 88 -118.78 gain 88 164 -114.77 gain 164 88 -117.43 gain 88 165 -123.16 gain 165 88 -121.87 gain 88 166 -123.18 gain 166 88 -123.46 gain 88 167 -121.53 gain 167 88 -123.90 gain 88 168 -125.76 gain 168 88 -126.58 gain 88 169 -114.87 gain 169 88 -119.88 gain 88 170 -130.26 gain 170 88 -126.80 gain 88 171 -120.50 gain 171 88 -122.07 gain 88 172 -118.99 gain 172 88 -115.25 gain 88 173 -113.12 gain 173 88 -108.81 gain 88 174 -126.00 gain 174 88 -125.99 gain 88 175 -122.69 gain 175 88 -126.24 gain 88 176 -115.54 gain 176 88 -111.09 gain 88 177 -122.31 gain 177 88 -125.68 gain 88 178 -121.93 gain 178 88 -121.13 gain 88 179 -117.14 gain 179 88 -114.73 gain 88 180 -131.87 gain 180 88 -130.92 gain 88 181 -134.80 gain 181 88 -133.92 gain 88 182 -127.73 gain 182 88 -129.24 gain 88 183 -125.98 gain 183 88 -120.88 gain 88 184 -128.08 gain 184 88 -127.76 gain 88 185 -121.77 gain 185 88 -118.93 gain 88 186 -122.16 gain 186 88 -119.61 gain 88 187 -120.07 gain 187 88 -120.06 gain 88 188 -124.94 gain 188 88 -128.19 gain 88 189 -121.99 gain 189 88 -122.76 gain 88 190 -122.55 gain 190 88 -120.32 gain 88 191 -117.36 gain 191 88 -116.22 gain 88 192 -122.49 gain 192 88 -124.23 gain 88 193 -119.95 gain 193 88 -122.93 gain 88 194 -117.26 gain 194 88 -114.05 gain 88 195 -131.22 gain 195 88 -128.65 gain 88 196 -135.87 gain 196 88 -137.34 gain 88 197 -122.71 gain 197 88 -120.24 gain 88 198 -123.08 gain 198 88 -120.13 gain 88 199 -121.47 gain 199 88 -122.44 gain 88 200 -117.28 gain 200 88 -115.19 gain 88 201 -119.01 gain 201 88 -117.72 gain 88 202 -127.77 gain 202 88 -130.48 gain 88 203 -129.31 gain 203 88 -131.64 gain 88 204 -128.36 gain 204 88 -127.98 gain 88 205 -125.32 gain 205 88 -124.01 gain 88 206 -120.31 gain 206 88 -123.52 gain 88 207 -119.74 gain 207 88 -115.31 gain 88 208 -121.18 gain 208 88 -122.53 gain 88 209 -117.59 gain 209 88 -119.93 gain 88 210 -130.25 gain 210 88 -129.53 gain 88 211 -133.94 gain 211 88 -135.24 gain 88 212 -128.19 gain 212 88 -128.03 gain 88 213 -124.81 gain 213 88 -123.84 gain 88 214 -131.87 gain 214 88 -130.80 gain 88 215 -129.69 gain 215 88 -125.03 gain 88 216 -124.23 gain 216 88 -124.23 gain 88 217 -128.80 gain 217 88 -129.32 gain 88 218 -129.38 gain 218 88 -132.09 gain 88 219 -131.33 gain 219 88 -125.39 gain 88 220 -126.85 gain 220 88 -131.41 gain 88 221 -127.88 gain 221 88 -128.08 gain 88 222 -120.21 gain 222 88 -120.74 gain 88 223 -123.71 gain 223 88 -122.85 gain 88 224 -119.99 gain 224 88 -121.82 gain 89 90 -127.15 gain 90 89 -124.16 gain 89 91 -121.37 gain 91 89 -122.32 gain 89 92 -122.41 gain 92 89 -120.32 gain 89 93 -120.24 gain 93 89 -122.94 gain 89 94 -115.65 gain 94 89 -118.23 gain 89 95 -115.63 gain 95 89 -120.46 gain 89 96 -118.52 gain 96 89 -120.68 gain 89 97 -119.84 gain 97 89 -120.75 gain 89 98 -117.71 gain 98 89 -119.42 gain 89 99 -113.56 gain 99 89 -113.09 gain 89 100 -115.90 gain 100 89 -115.00 gain 89 101 -99.14 gain 101 89 -98.40 gain 89 102 -102.40 gain 102 89 -102.44 gain 89 103 -92.82 gain 103 89 -90.35 gain 89 104 -93.01 gain 104 89 -95.90 gain 89 105 -115.65 gain 105 89 -114.49 gain 89 106 -130.53 gain 106 89 -130.46 gain 89 107 -124.63 gain 107 89 -131.13 gain 89 108 -124.20 gain 108 89 -123.01 gain 89 109 -124.82 gain 109 89 -127.11 gain 89 110 -124.30 gain 110 89 -125.07 gain 89 111 -112.96 gain 111 89 -113.40 gain 89 112 -118.02 gain 112 89 -117.35 gain 89 113 -121.08 gain 113 89 -119.21 gain 89 114 -113.23 gain 114 89 -114.67 gain 89 115 -110.48 gain 115 89 -106.22 gain 89 116 -112.59 gain 116 89 -115.88 gain 89 117 -102.08 gain 117 89 -106.86 gain 89 118 -104.57 gain 118 89 -107.68 gain 89 119 -95.85 gain 119 89 -93.61 gain 89 120 -119.34 gain 120 89 -121.62 gain 89 121 -126.72 gain 121 89 -128.29 gain 89 122 -131.09 gain 122 89 -134.77 gain 89 123 -123.99 gain 123 89 -128.45 gain 89 124 -125.99 gain 124 89 -126.86 gain 89 125 -121.99 gain 125 89 -124.19 gain 89 126 -116.07 gain 126 89 -116.23 gain 89 127 -112.28 gain 127 89 -115.90 gain 89 128 -118.14 gain 128 89 -119.70 gain 89 129 -115.63 gain 129 89 -115.10 gain 89 130 -113.73 gain 130 89 -111.03 gain 89 131 -114.08 gain 131 89 -118.45 gain 89 132 -112.64 gain 132 89 -116.65 gain 89 133 -105.53 gain 133 89 -107.61 gain 89 134 -107.42 gain 134 89 -106.19 gain 89 135 -124.94 gain 135 89 -127.28 gain 89 136 -132.58 gain 136 89 -135.54 gain 89 137 -120.43 gain 137 89 -120.87 gain 89 138 -119.97 gain 138 89 -119.41 gain 89 139 -125.83 gain 139 89 -126.26 gain 89 140 -126.39 gain 140 89 -129.42 gain 89 141 -121.71 gain 141 89 -123.42 gain 89 142 -121.44 gain 142 89 -122.46 gain 89 143 -117.64 gain 143 89 -118.27 gain 89 144 -118.52 gain 144 89 -120.17 gain 89 145 -114.77 gain 145 89 -114.87 gain 89 146 -112.42 gain 146 89 -111.43 gain 89 147 -113.71 gain 147 89 -109.80 gain 89 148 -119.49 gain 148 89 -115.30 gain 89 149 -111.73 gain 149 89 -110.71 gain 89 150 -126.41 gain 150 89 -128.07 gain 89 151 -126.94 gain 151 89 -128.80 gain 89 152 -129.80 gain 152 89 -128.64 gain 89 153 -124.25 gain 153 89 -120.67 gain 89 154 -120.69 gain 154 89 -125.66 gain 89 155 -121.02 gain 155 89 -125.89 gain 89 156 -119.03 gain 156 89 -118.28 gain 89 157 -121.84 gain 157 89 -124.04 gain 89 158 -115.67 gain 158 89 -120.45 gain 89 159 -116.97 gain 159 89 -118.38 gain 89 160 -118.50 gain 160 89 -117.02 gain 89 161 -123.21 gain 161 89 -125.22 gain 89 162 -114.51 gain 162 89 -115.38 gain 89 163 -111.31 gain 163 89 -114.33 gain 89 164 -106.65 gain 164 89 -110.72 gain 89 165 -125.89 gain 165 89 -125.99 gain 89 166 -124.48 gain 166 89 -126.15 gain 89 167 -124.38 gain 167 89 -128.14 gain 89 168 -124.45 gain 168 89 -126.66 gain 89 169 -121.51 gain 169 89 -127.92 gain 89 170 -117.80 gain 170 89 -115.74 gain 89 171 -123.36 gain 171 89 -126.32 gain 89 172 -123.07 gain 172 89 -120.73 gain 89 173 -116.38 gain 173 89 -113.48 gain 89 174 -116.76 gain 174 89 -118.15 gain 89 175 -119.80 gain 175 89 -124.74 gain 89 176 -112.39 gain 176 89 -109.35 gain 89 177 -118.18 gain 177 89 -122.95 gain 89 178 -115.92 gain 178 89 -116.52 gain 89 179 -115.88 gain 179 89 -114.87 gain 89 180 -129.48 gain 180 89 -129.93 gain 89 181 -128.84 gain 181 89 -129.36 gain 89 182 -127.21 gain 182 89 -130.12 gain 89 183 -123.50 gain 183 89 -119.79 gain 89 184 -122.10 gain 184 89 -123.18 gain 89 185 -127.73 gain 185 89 -126.30 gain 89 186 -116.76 gain 186 89 -115.61 gain 89 187 -128.56 gain 187 89 -129.94 gain 89 188 -114.05 gain 188 89 -118.70 gain 89 189 -114.65 gain 189 89 -116.82 gain 89 190 -115.71 gain 190 89 -114.88 gain 89 191 -117.94 gain 191 89 -118.21 gain 89 192 -124.60 gain 192 89 -127.74 gain 89 193 -120.59 gain 193 89 -124.97 gain 89 194 -118.04 gain 194 89 -116.24 gain 89 195 -130.10 gain 195 89 -128.93 gain 89 196 -126.98 gain 196 89 -129.85 gain 89 197 -126.80 gain 197 89 -125.73 gain 89 198 -123.61 gain 198 89 -122.06 gain 89 199 -122.04 gain 199 89 -124.41 gain 89 200 -119.66 gain 200 89 -118.97 gain 89 201 -126.08 gain 201 89 -126.19 gain 89 202 -128.93 gain 202 89 -133.04 gain 89 203 -116.81 gain 203 89 -120.55 gain 89 204 -115.74 gain 204 89 -116.76 gain 89 205 -114.03 gain 205 89 -114.13 gain 89 206 -122.58 gain 206 89 -127.19 gain 89 207 -120.54 gain 207 89 -117.51 gain 89 208 -120.05 gain 208 89 -122.80 gain 89 209 -112.68 gain 209 89 -116.42 gain 89 210 -131.83 gain 210 89 -132.50 gain 89 211 -130.50 gain 211 89 -133.20 gain 89 212 -128.85 gain 212 89 -130.10 gain 89 213 -125.30 gain 213 89 -125.74 gain 89 214 -131.12 gain 214 89 -131.44 gain 89 215 -126.78 gain 215 89 -123.52 gain 89 216 -134.07 gain 216 89 -135.47 gain 89 217 -120.26 gain 217 89 -122.18 gain 89 218 -126.61 gain 218 89 -130.72 gain 89 219 -127.01 gain 219 89 -122.48 gain 89 220 -115.19 gain 220 89 -121.15 gain 89 221 -120.56 gain 221 89 -122.16 gain 89 222 -128.89 gain 222 89 -130.81 gain 89 223 -117.73 gain 223 89 -118.27 gain 89 224 -129.36 gain 224 89 -132.58 gain 90 91 -89.36 gain 91 90 -93.30 gain 90 92 -92.49 gain 92 90 -93.39 gain 90 93 -103.99 gain 93 90 -109.68 gain 90 94 -99.33 gain 94 90 -104.90 gain 90 95 -111.38 gain 95 90 -119.20 gain 90 96 -112.39 gain 96 90 -117.55 gain 90 97 -109.97 gain 97 90 -113.88 gain 90 98 -108.90 gain 98 90 -113.60 gain 90 99 -115.44 gain 99 90 -117.97 gain 90 100 -124.49 gain 100 90 -126.58 gain 90 101 -115.75 gain 101 90 -118.00 gain 90 102 -126.62 gain 102 90 -129.65 gain 90 103 -124.02 gain 103 90 -124.54 gain 90 104 -123.78 gain 104 90 -129.67 gain 90 105 -88.99 gain 105 90 -90.82 gain 90 106 -95.96 gain 106 90 -98.88 gain 90 107 -100.72 gain 107 90 -110.20 gain 90 108 -102.57 gain 108 90 -104.37 gain 90 109 -108.03 gain 109 90 -113.32 gain 90 110 -110.02 gain 110 90 -113.78 gain 90 111 -117.49 gain 111 90 -120.93 gain 90 112 -114.26 gain 112 90 -116.58 gain 90 113 -119.04 gain 113 90 -120.17 gain 90 114 -115.96 gain 114 90 -120.39 gain 90 115 -119.50 gain 115 90 -118.23 gain 90 116 -121.64 gain 116 90 -127.91 gain 90 117 -123.63 gain 117 90 -131.40 gain 90 118 -119.90 gain 118 90 -125.99 gain 90 119 -129.13 gain 119 90 -129.88 gain 90 120 -99.99 gain 120 90 -105.26 gain 90 121 -101.54 gain 121 90 -106.10 gain 90 122 -102.80 gain 122 90 -109.47 gain 90 123 -103.24 gain 123 90 -110.69 gain 90 124 -111.30 gain 124 90 -115.16 gain 90 125 -108.23 gain 125 90 -113.43 gain 90 126 -114.00 gain 126 90 -117.15 gain 90 127 -114.48 gain 127 90 -121.09 gain 90 128 -124.96 gain 128 90 -129.52 gain 90 129 -115.77 gain 129 90 -118.23 gain 90 130 -130.68 gain 130 90 -130.96 gain 90 131 -122.90 gain 131 90 -130.27 gain 90 132 -123.45 gain 132 90 -130.45 gain 90 133 -127.25 gain 133 90 -132.32 gain 90 134 -127.34 gain 134 90 -129.11 gain 90 135 -107.82 gain 135 90 -113.16 gain 90 136 -110.32 gain 136 90 -116.27 gain 90 137 -107.42 gain 137 90 -110.85 gain 90 138 -107.04 gain 138 90 -109.47 gain 90 139 -113.76 gain 139 90 -117.17 gain 90 140 -109.69 gain 140 90 -115.71 gain 90 141 -105.15 gain 141 90 -109.85 gain 90 142 -117.53 gain 142 90 -121.53 gain 90 143 -114.24 gain 143 90 -117.86 gain 90 144 -118.17 gain 144 90 -122.81 gain 90 145 -118.03 gain 145 90 -121.11 gain 90 146 -115.05 gain 146 90 -117.05 gain 90 147 -124.05 gain 147 90 -123.14 gain 90 148 -125.62 gain 148 90 -124.42 gain 90 149 -119.43 gain 149 90 -121.40 gain 90 150 -107.86 gain 150 90 -112.52 gain 90 151 -109.21 gain 151 90 -114.07 gain 90 152 -103.62 gain 152 90 -105.45 gain 90 153 -109.29 gain 153 90 -108.70 gain 90 154 -116.58 gain 154 90 -124.54 gain 90 155 -117.79 gain 155 90 -125.65 gain 90 156 -116.93 gain 156 90 -119.17 gain 90 157 -115.10 gain 157 90 -120.29 gain 90 158 -113.88 gain 158 90 -121.66 gain 90 159 -117.63 gain 159 90 -122.03 gain 90 160 -125.71 gain 160 90 -127.22 gain 90 161 -123.94 gain 161 90 -128.94 gain 90 162 -131.46 gain 162 90 -135.32 gain 90 163 -122.25 gain 163 90 -128.26 gain 90 164 -120.77 gain 164 90 -127.83 gain 90 165 -106.35 gain 165 90 -109.44 gain 90 166 -114.98 gain 166 90 -119.64 gain 90 167 -113.79 gain 167 90 -120.55 gain 90 168 -108.43 gain 168 90 -113.63 gain 90 169 -112.15 gain 169 90 -121.55 gain 90 170 -109.80 gain 170 90 -110.73 gain 90 171 -121.04 gain 171 90 -126.99 gain 90 172 -118.39 gain 172 90 -119.05 gain 90 173 -128.13 gain 173 90 -128.22 gain 90 174 -119.07 gain 174 90 -123.46 gain 90 175 -120.68 gain 175 90 -128.61 gain 90 176 -121.16 gain 176 90 -121.11 gain 90 177 -130.61 gain 177 90 -138.38 gain 90 178 -125.45 gain 178 90 -129.04 gain 90 179 -126.47 gain 179 90 -128.45 gain 90 180 -111.93 gain 180 90 -115.38 gain 90 181 -110.69 gain 181 90 -114.20 gain 90 182 -112.13 gain 182 90 -118.03 gain 90 183 -114.34 gain 183 90 -113.62 gain 90 184 -117.70 gain 184 90 -121.77 gain 90 185 -116.24 gain 185 90 -117.80 gain 90 186 -112.18 gain 186 90 -114.02 gain 90 187 -123.77 gain 187 90 -128.15 gain 90 188 -119.80 gain 188 90 -127.44 gain 90 189 -122.04 gain 189 90 -127.19 gain 90 190 -126.12 gain 190 90 -128.28 gain 90 191 -122.17 gain 191 90 -125.43 gain 90 192 -124.64 gain 192 90 -130.76 gain 90 193 -125.39 gain 193 90 -132.77 gain 90 194 -122.06 gain 194 90 -123.24 gain 90 195 -120.26 gain 195 90 -122.08 gain 90 196 -124.70 gain 196 90 -130.56 gain 90 197 -110.01 gain 197 90 -111.93 gain 90 198 -109.93 gain 198 90 -111.37 gain 90 199 -117.39 gain 199 90 -122.75 gain 90 200 -120.13 gain 200 90 -122.43 gain 90 201 -119.71 gain 201 90 -122.82 gain 90 202 -115.66 gain 202 90 -122.77 gain 90 203 -121.21 gain 203 90 -127.94 gain 90 204 -117.51 gain 204 90 -121.52 gain 90 205 -119.41 gain 205 90 -122.49 gain 90 206 -128.92 gain 206 90 -136.53 gain 90 207 -119.64 gain 207 90 -119.60 gain 90 208 -119.05 gain 208 90 -124.79 gain 90 209 -132.95 gain 209 90 -139.68 gain 90 210 -121.59 gain 210 90 -125.26 gain 90 211 -117.18 gain 211 90 -122.87 gain 90 212 -117.15 gain 212 90 -121.39 gain 90 213 -115.61 gain 213 90 -119.04 gain 90 214 -117.44 gain 214 90 -120.75 gain 90 215 -123.82 gain 215 90 -123.55 gain 90 216 -121.97 gain 216 90 -126.37 gain 90 217 -122.60 gain 217 90 -127.51 gain 90 218 -122.19 gain 218 90 -129.29 gain 90 219 -124.87 gain 219 90 -123.33 gain 90 220 -121.30 gain 220 90 -130.25 gain 90 221 -123.93 gain 221 90 -128.52 gain 90 222 -129.99 gain 222 90 -134.91 gain 90 223 -129.05 gain 223 90 -132.58 gain 90 224 -124.46 gain 224 90 -130.68 gain 91 92 -94.92 gain 92 91 -91.88 gain 91 93 -104.80 gain 93 91 -106.54 gain 91 94 -107.82 gain 94 91 -109.44 gain 91 95 -113.08 gain 95 91 -116.95 gain 91 96 -112.83 gain 96 91 -114.04 gain 91 97 -118.42 gain 97 91 -118.38 gain 91 98 -118.59 gain 98 91 -119.34 gain 91 99 -118.67 gain 99 91 -117.25 gain 91 100 -124.37 gain 100 91 -122.51 gain 91 101 -121.80 gain 101 91 -120.11 gain 91 102 -127.14 gain 102 91 -126.23 gain 91 103 -124.40 gain 103 91 -120.97 gain 91 104 -128.35 gain 104 91 -130.30 gain 91 105 -98.41 gain 105 91 -96.30 gain 91 106 -88.91 gain 106 91 -87.88 gain 91 107 -100.11 gain 107 91 -105.65 gain 91 108 -105.51 gain 108 91 -103.37 gain 91 109 -115.74 gain 109 91 -117.08 gain 91 110 -111.40 gain 110 91 -111.21 gain 91 111 -109.61 gain 111 91 -109.10 gain 91 112 -113.41 gain 112 91 -111.78 gain 91 113 -121.52 gain 113 91 -118.70 gain 91 114 -126.83 gain 114 91 -127.31 gain 91 115 -126.58 gain 115 91 -121.37 gain 91 116 -131.39 gain 116 91 -133.72 gain 91 117 -127.30 gain 117 91 -131.13 gain 91 118 -129.92 gain 118 91 -132.07 gain 91 119 -124.44 gain 119 91 -121.25 gain 91 120 -93.92 gain 120 91 -95.25 gain 91 121 -107.43 gain 121 91 -108.05 gain 91 122 -110.29 gain 122 91 -113.02 gain 91 123 -105.93 gain 123 91 -109.43 gain 91 124 -114.33 gain 124 91 -114.25 gain 91 125 -113.86 gain 125 91 -115.12 gain 91 126 -122.05 gain 126 91 -121.26 gain 91 127 -120.08 gain 127 91 -122.75 gain 91 128 -124.57 gain 128 91 -125.18 gain 91 129 -127.67 gain 129 91 -126.19 gain 91 130 -128.25 gain 130 91 -124.59 gain 91 131 -125.60 gain 131 91 -129.02 gain 91 132 -131.02 gain 132 91 -134.07 gain 91 133 -121.37 gain 133 91 -122.50 gain 91 134 -133.45 gain 134 91 -131.27 gain 91 135 -112.17 gain 135 91 -113.56 gain 91 136 -106.25 gain 136 91 -108.26 gain 91 137 -109.26 gain 137 91 -108.75 gain 91 138 -110.13 gain 138 91 -108.62 gain 91 139 -116.67 gain 139 91 -116.14 gain 91 140 -118.41 gain 140 91 -120.49 gain 91 141 -117.49 gain 141 91 -118.25 gain 91 142 -119.76 gain 142 91 -119.82 gain 91 143 -121.72 gain 143 91 -121.40 gain 91 144 -123.77 gain 144 91 -124.47 gain 91 145 -123.45 gain 145 91 -122.59 gain 91 146 -125.95 gain 146 91 -124.00 gain 91 147 -132.26 gain 147 91 -127.40 gain 91 148 -132.97 gain 148 91 -127.83 gain 91 149 -128.56 gain 149 91 -126.59 gain 91 150 -110.02 gain 150 91 -110.73 gain 91 151 -114.87 gain 151 91 -115.78 gain 91 152 -110.99 gain 152 91 -108.88 gain 91 153 -108.08 gain 153 91 -103.54 gain 91 154 -114.88 gain 154 91 -118.89 gain 91 155 -113.13 gain 155 91 -117.04 gain 91 156 -118.53 gain 156 91 -116.82 gain 91 157 -118.23 gain 157 91 -119.47 gain 91 158 -114.45 gain 158 91 -118.28 gain 91 159 -121.93 gain 159 91 -122.39 gain 91 160 -129.80 gain 160 91 -127.37 gain 91 161 -129.94 gain 161 91 -131.00 gain 91 162 -118.90 gain 162 91 -118.82 gain 91 163 -123.94 gain 163 91 -126.01 gain 91 164 -125.85 gain 164 91 -128.96 gain 91 165 -114.34 gain 165 91 -113.50 gain 91 166 -114.46 gain 166 91 -115.18 gain 91 167 -114.57 gain 167 91 -117.38 gain 91 168 -123.44 gain 168 91 -124.70 gain 91 169 -117.44 gain 169 91 -122.90 gain 91 170 -129.39 gain 170 91 -126.38 gain 91 171 -117.31 gain 171 91 -119.32 gain 91 172 -116.21 gain 172 91 -112.92 gain 91 173 -132.37 gain 173 91 -128.51 gain 91 174 -119.23 gain 174 91 -119.67 gain 91 175 -122.45 gain 175 91 -126.44 gain 91 176 -121.76 gain 176 91 -117.77 gain 91 177 -131.06 gain 177 91 -134.88 gain 91 178 -126.40 gain 178 91 -126.04 gain 91 179 -132.95 gain 179 91 -130.99 gain 91 180 -112.04 gain 180 91 -111.54 gain 91 181 -111.45 gain 181 91 -111.02 gain 91 182 -105.97 gain 182 91 -107.93 gain 91 183 -111.91 gain 183 91 -107.25 gain 91 184 -123.20 gain 184 91 -123.32 gain 91 185 -122.02 gain 185 91 -119.63 gain 91 186 -118.68 gain 186 91 -116.58 gain 91 187 -114.60 gain 187 91 -115.04 gain 91 188 -119.68 gain 188 91 -123.38 gain 91 189 -119.85 gain 189 91 -121.06 gain 91 190 -121.24 gain 190 91 -119.46 gain 91 191 -128.48 gain 191 91 -127.79 gain 91 192 -124.85 gain 192 91 -127.04 gain 91 193 -130.44 gain 193 91 -133.88 gain 91 194 -130.07 gain 194 91 -127.31 gain 91 195 -107.83 gain 195 91 -105.71 gain 91 196 -126.27 gain 196 91 -128.19 gain 91 197 -121.64 gain 197 91 -119.62 gain 91 198 -123.96 gain 198 91 -121.46 gain 91 199 -123.86 gain 199 91 -125.27 gain 91 200 -118.06 gain 200 91 -116.42 gain 91 201 -123.11 gain 201 91 -122.27 gain 91 202 -123.77 gain 202 91 -126.93 gain 91 203 -124.73 gain 203 91 -127.51 gain 91 204 -120.05 gain 204 91 -120.11 gain 91 205 -126.46 gain 205 91 -125.60 gain 91 206 -129.65 gain 206 91 -133.31 gain 91 207 -125.17 gain 207 91 -121.19 gain 91 208 -134.08 gain 208 91 -135.87 gain 91 209 -126.92 gain 209 91 -129.71 gain 91 210 -116.50 gain 210 91 -116.23 gain 91 211 -118.24 gain 211 91 -119.99 gain 91 212 -118.59 gain 212 91 -118.88 gain 91 213 -120.82 gain 213 91 -120.30 gain 91 214 -125.32 gain 214 91 -124.69 gain 91 215 -125.57 gain 215 91 -121.35 gain 91 216 -124.56 gain 216 91 -125.01 gain 91 217 -120.49 gain 217 91 -121.46 gain 91 218 -126.08 gain 218 91 -129.23 gain 91 219 -125.09 gain 219 91 -119.61 gain 91 220 -121.15 gain 220 91 -126.16 gain 91 221 -127.42 gain 221 91 -128.07 gain 91 222 -123.94 gain 222 91 -124.91 gain 91 223 -124.30 gain 223 91 -123.89 gain 91 224 -128.16 gain 224 91 -130.43 gain 92 93 -94.45 gain 93 92 -99.24 gain 92 94 -94.72 gain 94 92 -99.38 gain 92 95 -104.07 gain 95 92 -110.98 gain 92 96 -110.25 gain 96 92 -114.50 gain 92 97 -110.65 gain 97 92 -113.65 gain 92 98 -113.98 gain 98 92 -117.78 gain 92 99 -115.79 gain 99 92 -117.41 gain 92 100 -117.70 gain 100 92 -118.88 gain 92 101 -115.74 gain 101 92 -117.09 gain 92 102 -119.89 gain 102 92 -122.02 gain 92 103 -112.89 gain 103 92 -112.51 gain 92 104 -127.01 gain 104 92 -131.99 gain 92 105 -106.37 gain 105 92 -107.30 gain 92 106 -91.20 gain 106 92 -93.21 gain 92 107 -89.63 gain 107 92 -98.21 gain 92 108 -95.38 gain 108 92 -96.27 gain 92 109 -93.88 gain 109 92 -98.26 gain 92 110 -104.95 gain 110 92 -107.81 gain 92 111 -112.79 gain 111 92 -115.33 gain 92 112 -113.02 gain 112 92 -114.44 gain 92 113 -117.39 gain 113 92 -117.61 gain 92 114 -112.50 gain 114 92 -116.02 gain 92 115 -117.04 gain 115 92 -114.87 gain 92 116 -119.90 gain 116 92 -125.27 gain 92 117 -114.40 gain 117 92 -121.26 gain 92 118 -126.04 gain 118 92 -131.23 gain 92 119 -123.27 gain 119 92 -123.12 gain 92 120 -105.63 gain 120 92 -110.00 gain 92 121 -108.40 gain 121 92 -112.06 gain 92 122 -100.50 gain 122 92 -106.28 gain 92 123 -100.32 gain 123 92 -106.87 gain 92 124 -106.41 gain 124 92 -109.37 gain 92 125 -109.96 gain 125 92 -114.25 gain 92 126 -108.55 gain 126 92 -110.79 gain 92 127 -103.33 gain 127 92 -109.04 gain 92 128 -107.96 gain 128 92 -111.61 gain 92 129 -116.39 gain 129 92 -117.94 gain 92 130 -116.85 gain 130 92 -116.23 gain 92 131 -116.22 gain 131 92 -122.69 gain 92 132 -119.93 gain 132 92 -126.02 gain 92 133 -120.61 gain 133 92 -124.77 gain 92 134 -128.60 gain 134 92 -129.46 gain 92 135 -114.07 gain 135 92 -118.50 gain 92 136 -108.80 gain 136 92 -113.84 gain 92 137 -106.88 gain 137 92 -109.41 gain 92 138 -110.17 gain 138 92 -111.70 gain 92 139 -108.92 gain 139 92 -111.43 gain 92 140 -107.63 gain 140 92 -112.75 gain 92 141 -107.27 gain 141 92 -111.06 gain 92 142 -107.97 gain 142 92 -111.07 gain 92 143 -118.47 gain 143 92 -121.18 gain 92 144 -118.21 gain 144 92 -121.94 gain 92 145 -120.33 gain 145 92 -122.51 gain 92 146 -124.36 gain 146 92 -125.45 gain 92 147 -119.44 gain 147 92 -117.63 gain 92 148 -122.63 gain 148 92 -120.53 gain 92 149 -133.58 gain 149 92 -134.64 gain 92 150 -111.27 gain 150 92 -115.03 gain 92 151 -111.70 gain 151 92 -115.65 gain 92 152 -106.57 gain 152 92 -107.50 gain 92 153 -113.18 gain 153 92 -111.68 gain 92 154 -111.99 gain 154 92 -119.04 gain 92 155 -114.04 gain 155 92 -120.99 gain 92 156 -108.84 gain 156 92 -110.17 gain 92 157 -110.16 gain 157 92 -114.44 gain 92 158 -119.46 gain 158 92 -126.33 gain 92 159 -119.28 gain 159 92 -122.78 gain 92 160 -117.99 gain 160 92 -118.60 gain 92 161 -120.80 gain 161 92 -124.89 gain 92 162 -125.17 gain 162 92 -128.13 gain 92 163 -119.59 gain 163 92 -124.70 gain 92 164 -125.26 gain 164 92 -131.41 gain 92 165 -120.78 gain 165 92 -122.97 gain 92 166 -116.34 gain 166 92 -120.10 gain 92 167 -111.59 gain 167 92 -117.44 gain 92 168 -113.41 gain 168 92 -117.71 gain 92 169 -114.04 gain 169 92 -122.54 gain 92 170 -112.41 gain 170 92 -112.44 gain 92 171 -116.75 gain 171 92 -121.80 gain 92 172 -113.79 gain 172 92 -113.53 gain 92 173 -121.44 gain 173 92 -120.62 gain 92 174 -115.76 gain 174 92 -119.24 gain 92 175 -119.96 gain 175 92 -127.00 gain 92 176 -122.21 gain 176 92 -121.25 gain 92 177 -122.16 gain 177 92 -129.01 gain 92 178 -125.92 gain 178 92 -128.60 gain 92 179 -113.93 gain 179 92 -115.00 gain 92 180 -114.18 gain 180 92 -116.72 gain 92 181 -112.68 gain 181 92 -115.29 gain 92 182 -111.92 gain 182 92 -116.92 gain 92 183 -113.95 gain 183 92 -112.34 gain 92 184 -117.23 gain 184 92 -120.40 gain 92 185 -110.54 gain 185 92 -111.19 gain 92 186 -117.42 gain 186 92 -118.35 gain 92 187 -115.11 gain 187 92 -118.58 gain 92 188 -120.29 gain 188 92 -127.02 gain 92 189 -114.82 gain 189 92 -119.08 gain 92 190 -121.98 gain 190 92 -123.24 gain 92 191 -127.70 gain 191 92 -130.06 gain 92 192 -116.19 gain 192 92 -121.41 gain 92 193 -120.98 gain 193 92 -127.46 gain 92 194 -122.27 gain 194 92 -122.56 gain 92 195 -111.30 gain 195 92 -112.21 gain 92 196 -115.73 gain 196 92 -120.69 gain 92 197 -114.03 gain 197 92 -115.04 gain 92 198 -112.68 gain 198 92 -113.21 gain 92 199 -118.43 gain 199 92 -122.89 gain 92 200 -120.28 gain 200 92 -121.68 gain 92 201 -120.24 gain 201 92 -122.44 gain 92 202 -114.43 gain 202 92 -120.63 gain 92 203 -121.87 gain 203 92 -127.69 gain 92 204 -124.97 gain 204 92 -128.07 gain 92 205 -123.49 gain 205 92 -125.67 gain 92 206 -119.13 gain 206 92 -125.83 gain 92 207 -124.32 gain 207 92 -123.38 gain 92 208 -128.83 gain 208 92 -133.66 gain 92 209 -124.52 gain 209 92 -130.35 gain 92 210 -111.73 gain 210 92 -114.50 gain 92 211 -113.92 gain 211 92 -118.71 gain 92 212 -121.77 gain 212 92 -125.10 gain 92 213 -115.53 gain 213 92 -118.06 gain 92 214 -125.16 gain 214 92 -127.57 gain 92 215 -116.48 gain 215 92 -115.31 gain 92 216 -114.34 gain 216 92 -117.82 gain 92 217 -125.36 gain 217 92 -129.36 gain 92 218 -122.06 gain 218 92 -128.26 gain 92 219 -124.10 gain 219 92 -121.66 gain 92 220 -126.50 gain 220 92 -134.55 gain 92 221 -123.77 gain 221 92 -127.45 gain 92 222 -121.94 gain 222 92 -125.96 gain 92 223 -120.90 gain 223 92 -123.52 gain 92 224 -118.78 gain 224 92 -124.10 gain 93 94 -96.73 gain 94 93 -96.61 gain 93 95 -103.49 gain 95 93 -105.62 gain 93 96 -113.48 gain 96 93 -112.94 gain 93 97 -119.07 gain 97 93 -117.28 gain 93 98 -119.93 gain 98 93 -118.94 gain 93 99 -116.44 gain 99 93 -113.27 gain 93 100 -121.54 gain 100 93 -117.94 gain 93 101 -118.70 gain 101 93 -115.27 gain 93 102 -120.22 gain 102 93 -117.56 gain 93 103 -120.37 gain 103 93 -115.19 gain 93 104 -121.99 gain 104 93 -122.19 gain 93 105 -114.64 gain 105 93 -110.78 gain 93 106 -102.20 gain 106 93 -99.43 gain 93 107 -98.65 gain 107 93 -102.44 gain 93 108 -95.81 gain 108 93 -91.92 gain 93 109 -92.38 gain 109 93 -91.98 gain 93 110 -103.56 gain 110 93 -101.63 gain 93 111 -111.53 gain 111 93 -109.28 gain 93 112 -110.49 gain 112 93 -107.12 gain 93 113 -118.77 gain 113 93 -114.20 gain 93 114 -112.94 gain 114 93 -111.68 gain 93 115 -123.54 gain 115 93 -116.59 gain 93 116 -121.34 gain 116 93 -121.93 gain 93 117 -119.31 gain 117 93 -121.39 gain 93 118 -123.66 gain 118 93 -124.07 gain 93 119 -118.48 gain 119 93 -113.54 gain 93 120 -110.64 gain 120 93 -110.22 gain 93 121 -107.11 gain 121 93 -105.98 gain 93 122 -98.81 gain 122 93 -99.80 gain 93 123 -108.19 gain 123 93 -109.95 gain 93 124 -104.63 gain 124 93 -102.80 gain 93 125 -102.39 gain 125 93 -101.89 gain 93 126 -109.26 gain 126 93 -106.72 gain 93 127 -114.36 gain 127 93 -115.29 gain 93 128 -124.71 gain 128 93 -123.58 gain 93 129 -120.14 gain 129 93 -116.91 gain 93 130 -126.46 gain 130 93 -121.06 gain 93 131 -119.27 gain 131 93 -120.95 gain 93 132 -127.77 gain 132 93 -129.08 gain 93 133 -126.27 gain 133 93 -125.65 gain 93 134 -127.97 gain 134 93 -124.05 gain 93 135 -110.86 gain 135 93 -110.51 gain 93 136 -113.11 gain 136 93 -113.37 gain 93 137 -112.37 gain 137 93 -110.11 gain 93 138 -112.93 gain 138 93 -109.67 gain 93 139 -110.19 gain 139 93 -107.91 gain 93 140 -112.05 gain 140 93 -112.39 gain 93 141 -103.25 gain 141 93 -102.26 gain 93 142 -114.41 gain 142 93 -112.72 gain 93 143 -118.98 gain 143 93 -116.91 gain 93 144 -119.50 gain 144 93 -118.45 gain 93 145 -123.26 gain 145 93 -120.65 gain 93 146 -120.46 gain 146 93 -116.77 gain 93 147 -132.05 gain 147 93 -125.45 gain 93 148 -128.90 gain 148 93 -122.01 gain 93 149 -132.87 gain 149 93 -129.16 gain 93 150 -116.37 gain 150 93 -115.33 gain 93 151 -107.56 gain 151 93 -106.73 gain 93 152 -111.42 gain 152 93 -107.56 gain 93 153 -111.16 gain 153 93 -104.88 gain 93 154 -116.28 gain 154 93 -118.55 gain 93 155 -116.10 gain 155 93 -118.26 gain 93 156 -117.76 gain 156 93 -114.31 gain 93 157 -121.48 gain 157 93 -120.98 gain 93 158 -120.08 gain 158 93 -122.17 gain 93 159 -123.87 gain 159 93 -122.58 gain 93 160 -124.01 gain 160 93 -119.83 gain 93 161 -121.03 gain 161 93 -120.34 gain 93 162 -124.34 gain 162 93 -122.51 gain 93 163 -134.87 gain 163 93 -135.20 gain 93 164 -128.27 gain 164 93 -129.64 gain 93 165 -118.78 gain 165 93 -116.19 gain 93 166 -117.96 gain 166 93 -116.93 gain 93 167 -113.39 gain 167 93 -114.46 gain 93 168 -121.44 gain 168 93 -120.96 gain 93 169 -126.50 gain 169 93 -130.21 gain 93 170 -116.44 gain 170 93 -111.68 gain 93 171 -125.75 gain 171 93 -126.01 gain 93 172 -120.92 gain 172 93 -115.88 gain 93 173 -118.96 gain 173 93 -113.35 gain 93 174 -124.35 gain 174 93 -123.04 gain 93 175 -122.68 gain 175 93 -124.92 gain 93 176 -124.79 gain 176 93 -119.05 gain 93 177 -125.47 gain 177 93 -127.54 gain 93 178 -133.26 gain 178 93 -131.16 gain 93 179 -127.68 gain 179 93 -123.97 gain 93 180 -121.36 gain 180 93 -119.12 gain 93 181 -116.94 gain 181 93 -114.76 gain 93 182 -118.60 gain 182 93 -118.81 gain 93 183 -122.06 gain 183 93 -115.66 gain 93 184 -118.05 gain 184 93 -116.43 gain 93 185 -122.69 gain 185 93 -118.56 gain 93 186 -116.32 gain 186 93 -112.47 gain 93 187 -116.44 gain 187 93 -115.13 gain 93 188 -120.44 gain 188 93 -122.39 gain 93 189 -129.06 gain 189 93 -128.52 gain 93 190 -125.97 gain 190 93 -122.45 gain 93 191 -126.20 gain 191 93 -123.76 gain 93 192 -132.09 gain 192 93 -132.53 gain 93 193 -127.86 gain 193 93 -129.54 gain 93 194 -126.89 gain 194 93 -122.38 gain 93 195 -124.24 gain 195 93 -120.37 gain 93 196 -122.08 gain 196 93 -122.25 gain 93 197 -119.46 gain 197 93 -115.69 gain 93 198 -118.75 gain 198 93 -114.51 gain 93 199 -116.00 gain 199 93 -115.67 gain 93 200 -119.79 gain 200 93 -116.40 gain 93 201 -117.80 gain 201 93 -115.22 gain 93 202 -131.46 gain 202 93 -132.88 gain 93 203 -126.30 gain 203 93 -127.34 gain 93 204 -124.91 gain 204 93 -123.23 gain 93 205 -119.77 gain 205 93 -117.17 gain 93 206 -125.94 gain 206 93 -127.86 gain 93 207 -123.37 gain 207 93 -117.65 gain 93 208 -128.03 gain 208 93 -128.08 gain 93 209 -124.60 gain 209 93 -125.65 gain 93 210 -113.38 gain 210 93 -111.36 gain 93 211 -118.84 gain 211 93 -118.85 gain 93 212 -118.92 gain 212 93 -117.46 gain 93 213 -125.03 gain 213 93 -122.76 gain 93 214 -125.65 gain 214 93 -123.28 gain 93 215 -121.45 gain 215 93 -115.49 gain 93 216 -126.28 gain 216 93 -124.98 gain 93 217 -126.53 gain 217 93 -125.75 gain 93 218 -124.24 gain 218 93 -125.65 gain 93 219 -123.92 gain 219 93 -116.69 gain 93 220 -133.15 gain 220 93 -136.41 gain 93 221 -125.69 gain 221 93 -124.59 gain 93 222 -123.04 gain 222 93 -122.27 gain 93 223 -129.91 gain 223 93 -127.75 gain 93 224 -130.40 gain 224 93 -130.93 gain 94 95 -100.36 gain 95 94 -102.61 gain 94 96 -103.28 gain 96 94 -102.87 gain 94 97 -103.96 gain 97 94 -102.30 gain 94 98 -120.58 gain 98 94 -119.71 gain 94 99 -114.16 gain 99 94 -111.11 gain 94 100 -118.10 gain 100 94 -114.63 gain 94 101 -114.28 gain 101 94 -110.96 gain 94 102 -122.72 gain 102 94 -120.19 gain 94 103 -127.29 gain 103 94 -122.24 gain 94 104 -127.26 gain 104 94 -127.59 gain 94 105 -114.85 gain 105 94 -111.12 gain 94 106 -116.07 gain 106 94 -113.42 gain 94 107 -106.77 gain 107 94 -110.69 gain 94 108 -95.30 gain 108 94 -91.53 gain 94 109 -97.59 gain 109 94 -97.31 gain 94 110 -95.57 gain 110 94 -93.77 gain 94 111 -100.45 gain 111 94 -98.33 gain 94 112 -112.58 gain 112 94 -109.33 gain 94 113 -108.35 gain 113 94 -103.91 gain 94 114 -121.67 gain 114 94 -120.53 gain 94 115 -118.61 gain 115 94 -111.78 gain 94 116 -122.58 gain 116 94 -123.29 gain 94 117 -119.67 gain 117 94 -121.88 gain 94 118 -122.35 gain 118 94 -122.88 gain 94 119 -131.02 gain 119 94 -126.21 gain 94 120 -109.97 gain 120 94 -109.67 gain 94 121 -106.70 gain 121 94 -105.69 gain 94 122 -110.49 gain 122 94 -111.60 gain 94 123 -104.61 gain 123 94 -106.50 gain 94 124 -106.98 gain 124 94 -105.27 gain 94 125 -105.04 gain 125 94 -104.68 gain 94 126 -113.95 gain 126 94 -111.54 gain 94 127 -114.79 gain 127 94 -115.84 gain 94 128 -114.19 gain 128 94 -113.18 gain 94 129 -114.60 gain 129 94 -111.50 gain 94 130 -115.40 gain 130 94 -110.12 gain 94 131 -122.80 gain 131 94 -124.61 gain 94 132 -122.71 gain 132 94 -124.14 gain 94 133 -126.14 gain 133 94 -125.64 gain 94 134 -124.87 gain 134 94 -121.07 gain 94 135 -116.03 gain 135 94 -115.80 gain 94 136 -118.27 gain 136 94 -118.65 gain 94 137 -110.87 gain 137 94 -108.74 gain 94 138 -109.57 gain 138 94 -106.44 gain 94 139 -104.02 gain 139 94 -101.87 gain 94 140 -112.96 gain 140 94 -113.42 gain 94 141 -118.03 gain 141 94 -117.16 gain 94 142 -112.17 gain 142 94 -110.61 gain 94 143 -119.50 gain 143 94 -117.55 gain 94 144 -126.17 gain 144 94 -125.24 gain 94 145 -118.43 gain 145 94 -115.96 gain 94 146 -119.69 gain 146 94 -116.12 gain 94 147 -124.14 gain 147 94 -117.66 gain 94 148 -126.86 gain 148 94 -120.10 gain 94 149 -125.47 gain 149 94 -121.88 gain 94 150 -115.67 gain 150 94 -114.77 gain 94 151 -106.81 gain 151 94 -106.10 gain 94 152 -118.28 gain 152 94 -114.55 gain 94 153 -117.44 gain 153 94 -111.28 gain 94 154 -116.04 gain 154 94 -118.43 gain 94 155 -110.29 gain 155 94 -112.58 gain 94 156 -109.56 gain 156 94 -106.23 gain 94 157 -112.16 gain 157 94 -111.78 gain 94 158 -116.46 gain 158 94 -118.68 gain 94 159 -117.53 gain 159 94 -116.36 gain 94 160 -122.33 gain 160 94 -118.28 gain 94 161 -125.30 gain 161 94 -124.74 gain 94 162 -120.43 gain 162 94 -118.73 gain 94 163 -122.62 gain 163 94 -123.07 gain 94 164 -122.16 gain 164 94 -123.65 gain 94 165 -117.94 gain 165 94 -115.47 gain 94 166 -117.00 gain 166 94 -116.10 gain 94 167 -120.60 gain 167 94 -121.79 gain 94 168 -121.27 gain 168 94 -120.91 gain 94 169 -118.69 gain 169 94 -122.53 gain 94 170 -114.44 gain 170 94 -109.81 gain 94 171 -120.13 gain 171 94 -120.52 gain 94 172 -130.54 gain 172 94 -125.63 gain 94 173 -113.40 gain 173 94 -107.92 gain 94 174 -116.63 gain 174 94 -115.44 gain 94 175 -120.02 gain 175 94 -122.40 gain 94 176 -120.85 gain 176 94 -115.24 gain 94 177 -123.84 gain 177 94 -126.03 gain 94 178 -122.91 gain 178 94 -120.93 gain 94 179 -120.55 gain 179 94 -116.96 gain 94 180 -121.97 gain 180 94 -119.85 gain 94 181 -122.56 gain 181 94 -120.50 gain 94 182 -120.00 gain 182 94 -120.33 gain 94 183 -112.39 gain 183 94 -106.12 gain 94 184 -116.47 gain 184 94 -114.98 gain 94 185 -120.33 gain 185 94 -116.32 gain 94 186 -122.33 gain 186 94 -118.60 gain 94 187 -121.22 gain 187 94 -120.04 gain 94 188 -120.60 gain 188 94 -122.68 gain 94 189 -120.99 gain 189 94 -120.59 gain 94 190 -134.39 gain 190 94 -130.99 gain 94 191 -129.16 gain 191 94 -126.85 gain 94 192 -130.06 gain 192 94 -130.62 gain 94 193 -128.15 gain 193 94 -129.96 gain 94 194 -121.67 gain 194 94 -117.29 gain 94 195 -126.67 gain 195 94 -122.93 gain 94 196 -125.24 gain 196 94 -125.53 gain 94 197 -123.35 gain 197 94 -119.70 gain 94 198 -112.19 gain 198 94 -108.06 gain 94 199 -120.49 gain 199 94 -120.28 gain 94 200 -125.50 gain 200 94 -122.23 gain 94 201 -124.23 gain 201 94 -121.77 gain 94 202 -122.50 gain 202 94 -124.03 gain 94 203 -120.86 gain 203 94 -122.02 gain 94 204 -121.82 gain 204 94 -120.26 gain 94 205 -119.01 gain 205 94 -116.53 gain 94 206 -122.08 gain 206 94 -124.12 gain 94 207 -126.48 gain 207 94 -120.88 gain 94 208 -126.69 gain 208 94 -126.86 gain 94 209 -123.22 gain 209 94 -124.39 gain 94 210 -126.92 gain 210 94 -125.02 gain 94 211 -115.19 gain 211 94 -115.32 gain 94 212 -123.80 gain 212 94 -122.47 gain 94 213 -123.87 gain 213 94 -121.73 gain 94 214 -118.13 gain 214 94 -115.88 gain 94 215 -118.55 gain 215 94 -112.71 gain 94 216 -125.77 gain 216 94 -124.60 gain 94 217 -125.25 gain 217 94 -124.59 gain 94 218 -128.78 gain 218 94 -130.31 gain 94 219 -111.96 gain 219 94 -104.86 gain 94 220 -129.83 gain 220 94 -133.22 gain 94 221 -120.68 gain 221 94 -119.71 gain 94 222 -122.41 gain 222 94 -121.76 gain 94 223 -127.63 gain 223 94 -125.60 gain 94 224 -127.03 gain 224 94 -127.68 gain 95 96 -88.71 gain 96 95 -86.05 gain 95 97 -107.60 gain 97 95 -103.69 gain 95 98 -108.31 gain 98 95 -105.19 gain 95 99 -117.37 gain 99 95 -112.07 gain 95 100 -121.99 gain 100 95 -116.25 gain 95 101 -118.33 gain 101 95 -112.76 gain 95 102 -123.97 gain 102 95 -119.18 gain 95 103 -129.32 gain 103 95 -122.01 gain 95 104 -124.93 gain 104 95 -123.00 gain 95 105 -113.08 gain 105 95 -107.09 gain 95 106 -118.60 gain 106 95 -113.70 gain 95 107 -119.39 gain 107 95 -121.06 gain 95 108 -108.06 gain 108 95 -102.05 gain 95 109 -97.12 gain 109 95 -94.59 gain 95 110 -100.46 gain 110 95 -96.40 gain 95 111 -102.65 gain 111 95 -98.27 gain 95 112 -112.79 gain 112 95 -107.29 gain 95 113 -114.61 gain 113 95 -107.91 gain 95 114 -115.52 gain 114 95 -112.13 gain 95 115 -112.64 gain 115 95 -103.55 gain 95 116 -122.80 gain 116 95 -121.25 gain 95 117 -131.89 gain 117 95 -131.85 gain 95 118 -125.45 gain 118 95 -123.73 gain 95 119 -124.20 gain 119 95 -117.13 gain 95 120 -120.56 gain 120 95 -118.01 gain 95 121 -111.04 gain 121 95 -107.78 gain 95 122 -114.76 gain 122 95 -113.61 gain 95 123 -118.76 gain 123 95 -118.39 gain 95 124 -108.10 gain 124 95 -104.14 gain 95 125 -112.43 gain 125 95 -109.81 gain 95 126 -110.23 gain 126 95 -105.57 gain 95 127 -105.22 gain 127 95 -104.01 gain 95 128 -113.93 gain 128 95 -110.66 gain 95 129 -116.72 gain 129 95 -111.36 gain 95 130 -113.44 gain 130 95 -105.91 gain 95 131 -120.49 gain 131 95 -120.04 gain 95 132 -118.97 gain 132 95 -118.15 gain 95 133 -132.69 gain 133 95 -129.94 gain 95 134 -126.37 gain 134 95 -120.32 gain 95 135 -119.09 gain 135 95 -116.61 gain 95 136 -113.12 gain 136 95 -111.25 gain 95 137 -111.84 gain 137 95 -107.46 gain 95 138 -111.45 gain 138 95 -106.07 gain 95 139 -108.68 gain 139 95 -104.27 gain 95 140 -107.88 gain 140 95 -106.09 gain 95 141 -116.87 gain 141 95 -113.75 gain 95 142 -115.35 gain 142 95 -111.53 gain 95 143 -118.68 gain 143 95 -114.48 gain 95 144 -117.88 gain 144 95 -114.70 gain 95 145 -121.92 gain 145 95 -117.19 gain 95 146 -124.55 gain 146 95 -118.73 gain 95 147 -128.50 gain 147 95 -119.77 gain 95 148 -121.17 gain 148 95 -112.15 gain 95 149 -126.98 gain 149 95 -121.13 gain 95 150 -120.53 gain 150 95 -117.36 gain 95 151 -113.32 gain 151 95 -110.35 gain 95 152 -118.96 gain 152 95 -112.97 gain 95 153 -115.06 gain 153 95 -106.65 gain 95 154 -116.47 gain 154 95 -116.61 gain 95 155 -115.75 gain 155 95 -115.78 gain 95 156 -117.49 gain 156 95 -111.91 gain 95 157 -121.54 gain 157 95 -118.90 gain 95 158 -115.81 gain 158 95 -115.77 gain 95 159 -128.86 gain 159 95 -125.44 gain 95 160 -116.52 gain 160 95 -110.21 gain 95 161 -123.92 gain 161 95 -121.10 gain 95 162 -124.81 gain 162 95 -120.86 gain 95 163 -124.86 gain 163 95 -123.05 gain 95 164 -126.24 gain 164 95 -125.47 gain 95 165 -128.53 gain 165 95 -123.81 gain 95 166 -116.61 gain 166 95 -113.46 gain 95 167 -119.87 gain 167 95 -118.80 gain 95 168 -125.04 gain 168 95 -122.42 gain 95 169 -120.29 gain 169 95 -121.87 gain 95 170 -125.02 gain 170 95 -118.13 gain 95 171 -117.39 gain 171 95 -115.53 gain 95 172 -125.35 gain 172 95 -118.18 gain 95 173 -117.68 gain 173 95 -109.95 gain 95 174 -126.32 gain 174 95 -122.88 gain 95 175 -116.70 gain 175 95 -116.81 gain 95 176 -117.64 gain 176 95 -109.77 gain 95 177 -122.71 gain 177 95 -122.66 gain 95 178 -133.55 gain 178 95 -129.31 gain 95 179 -120.73 gain 179 95 -114.89 gain 95 180 -128.07 gain 180 95 -123.69 gain 95 181 -118.20 gain 181 95 -113.89 gain 95 182 -116.14 gain 182 95 -114.22 gain 95 183 -125.02 gain 183 95 -116.49 gain 95 184 -127.67 gain 184 95 -123.92 gain 95 185 -117.29 gain 185 95 -111.02 gain 95 186 -121.47 gain 186 95 -115.49 gain 95 187 -121.83 gain 187 95 -118.39 gain 95 188 -125.28 gain 188 95 -125.10 gain 95 189 -125.36 gain 189 95 -122.70 gain 95 190 -125.21 gain 190 95 -119.56 gain 95 191 -130.74 gain 191 95 -126.17 gain 95 192 -130.47 gain 192 95 -128.78 gain 95 193 -123.71 gain 193 95 -123.27 gain 95 194 -122.19 gain 194 95 -115.55 gain 95 195 -132.40 gain 195 95 -126.40 gain 95 196 -123.27 gain 196 95 -121.31 gain 95 197 -126.02 gain 197 95 -120.12 gain 95 198 -122.21 gain 198 95 -115.83 gain 95 199 -125.56 gain 199 95 -123.10 gain 95 200 -123.93 gain 200 95 -118.41 gain 95 201 -116.84 gain 201 95 -112.12 gain 95 202 -124.80 gain 202 95 -124.08 gain 95 203 -126.10 gain 203 95 -125.01 gain 95 204 -126.19 gain 204 95 -122.38 gain 95 205 -131.78 gain 205 95 -127.04 gain 95 206 -129.23 gain 206 95 -129.01 gain 95 207 -116.43 gain 207 95 -108.57 gain 95 208 -129.65 gain 208 95 -127.57 gain 95 209 -129.50 gain 209 95 -128.41 gain 95 210 -122.04 gain 210 95 -117.89 gain 95 211 -128.00 gain 211 95 -125.87 gain 95 212 -123.02 gain 212 95 -119.44 gain 95 213 -123.51 gain 213 95 -119.12 gain 95 214 -122.66 gain 214 95 -118.16 gain 95 215 -124.51 gain 215 95 -116.43 gain 95 216 -126.64 gain 216 95 -123.21 gain 95 217 -133.43 gain 217 95 -130.52 gain 95 218 -122.73 gain 218 95 -122.01 gain 95 219 -126.89 gain 219 95 -117.52 gain 95 220 -122.55 gain 220 95 -123.68 gain 95 221 -134.11 gain 221 95 -130.88 gain 95 222 -120.11 gain 222 95 -117.21 gain 95 223 -125.65 gain 223 95 -121.36 gain 95 224 -123.73 gain 224 95 -122.13 gain 96 97 -88.13 gain 97 96 -86.87 gain 96 98 -107.39 gain 98 96 -106.93 gain 96 99 -110.73 gain 99 96 -108.09 gain 96 100 -121.25 gain 100 96 -118.18 gain 96 101 -120.29 gain 101 96 -117.38 gain 96 102 -119.96 gain 102 96 -117.83 gain 96 103 -124.34 gain 103 96 -119.70 gain 96 104 -118.22 gain 104 96 -118.95 gain 96 105 -123.16 gain 105 96 -119.84 gain 96 106 -116.08 gain 106 96 -113.83 gain 96 107 -111.37 gain 107 96 -115.69 gain 96 108 -106.36 gain 108 96 -103.00 gain 96 109 -100.30 gain 109 96 -100.43 gain 96 110 -94.19 gain 110 96 -92.79 gain 96 111 -90.03 gain 111 96 -88.31 gain 96 112 -99.94 gain 112 96 -97.10 gain 96 113 -103.18 gain 113 96 -99.15 gain 96 114 -108.08 gain 114 96 -107.35 gain 96 115 -109.01 gain 115 96 -102.59 gain 96 116 -120.47 gain 116 96 -121.58 gain 96 117 -116.71 gain 117 96 -119.33 gain 96 118 -119.14 gain 118 96 -120.08 gain 96 119 -120.18 gain 119 96 -115.77 gain 96 120 -118.25 gain 120 96 -118.36 gain 96 121 -117.99 gain 121 96 -117.39 gain 96 122 -116.48 gain 122 96 -117.99 gain 96 123 -113.77 gain 123 96 -116.06 gain 96 124 -106.39 gain 124 96 -105.09 gain 96 125 -102.20 gain 125 96 -102.24 gain 96 126 -102.04 gain 126 96 -100.03 gain 96 127 -109.02 gain 127 96 -110.48 gain 96 128 -114.11 gain 128 96 -113.50 gain 96 129 -112.78 gain 129 96 -110.09 gain 96 130 -111.36 gain 130 96 -106.48 gain 96 131 -115.85 gain 131 96 -118.06 gain 96 132 -116.32 gain 132 96 -118.16 gain 96 133 -118.02 gain 133 96 -117.93 gain 96 134 -118.77 gain 134 96 -115.38 gain 96 135 -121.85 gain 135 96 -122.03 gain 96 136 -121.29 gain 136 96 -122.08 gain 96 137 -116.04 gain 137 96 -114.31 gain 96 138 -116.08 gain 138 96 -113.36 gain 96 139 -111.04 gain 139 96 -109.30 gain 96 140 -106.88 gain 140 96 -107.75 gain 96 141 -107.37 gain 141 96 -106.91 gain 96 142 -113.02 gain 142 96 -111.87 gain 96 143 -107.30 gain 143 96 -105.76 gain 96 144 -109.98 gain 144 96 -109.46 gain 96 145 -111.10 gain 145 96 -109.03 gain 96 146 -117.91 gain 146 96 -114.75 gain 96 147 -121.79 gain 147 96 -115.72 gain 96 148 -119.59 gain 148 96 -113.23 gain 96 149 -121.81 gain 149 96 -118.62 gain 96 150 -117.62 gain 150 96 -117.12 gain 96 151 -111.71 gain 151 96 -111.41 gain 96 152 -117.66 gain 152 96 -114.33 gain 96 153 -111.59 gain 153 96 -105.84 gain 96 154 -114.10 gain 154 96 -116.89 gain 96 155 -112.11 gain 155 96 -114.81 gain 96 156 -113.37 gain 156 96 -110.45 gain 96 157 -122.82 gain 157 96 -122.85 gain 96 158 -123.63 gain 158 96 -126.25 gain 96 159 -114.37 gain 159 96 -113.61 gain 96 160 -115.76 gain 160 96 -112.11 gain 96 161 -123.99 gain 161 96 -123.83 gain 96 162 -121.22 gain 162 96 -119.93 gain 96 163 -116.19 gain 163 96 -117.04 gain 96 164 -138.42 gain 164 96 -140.32 gain 96 165 -119.55 gain 165 96 -117.49 gain 96 166 -121.37 gain 166 96 -120.88 gain 96 167 -118.54 gain 167 96 -120.14 gain 96 168 -116.44 gain 168 96 -116.48 gain 96 169 -113.99 gain 169 96 -118.23 gain 96 170 -118.71 gain 170 96 -114.48 gain 96 171 -116.25 gain 171 96 -117.04 gain 96 172 -112.89 gain 172 96 -108.38 gain 96 173 -118.18 gain 173 96 -113.11 gain 96 174 -117.67 gain 174 96 -116.90 gain 96 175 -121.27 gain 175 96 -124.05 gain 96 176 -119.40 gain 176 96 -114.19 gain 96 177 -118.91 gain 177 96 -121.52 gain 96 178 -116.74 gain 178 96 -115.17 gain 96 179 -129.02 gain 179 96 -125.84 gain 96 180 -119.83 gain 180 96 -118.12 gain 96 181 -120.49 gain 181 96 -118.84 gain 96 182 -118.42 gain 182 96 -119.16 gain 96 183 -125.15 gain 183 96 -119.28 gain 96 184 -121.27 gain 184 96 -120.18 gain 96 185 -119.04 gain 185 96 -115.44 gain 96 186 -118.40 gain 186 96 -115.08 gain 96 187 -116.34 gain 187 96 -115.56 gain 96 188 -119.71 gain 188 96 -122.20 gain 96 189 -129.31 gain 189 96 -129.31 gain 96 190 -122.64 gain 190 96 -119.65 gain 96 191 -117.11 gain 191 96 -115.21 gain 96 192 -122.60 gain 192 96 -123.56 gain 96 193 -127.81 gain 193 96 -130.03 gain 96 194 -134.12 gain 194 96 -130.15 gain 96 195 -125.49 gain 195 96 -122.15 gain 96 196 -117.75 gain 196 96 -118.45 gain 96 197 -119.36 gain 197 96 -116.13 gain 96 198 -119.53 gain 198 96 -115.82 gain 96 199 -120.88 gain 199 96 -121.09 gain 96 200 -119.01 gain 200 96 -116.15 gain 96 201 -113.32 gain 201 96 -111.26 gain 96 202 -119.44 gain 202 96 -121.39 gain 96 203 -115.74 gain 203 96 -117.31 gain 96 204 -122.31 gain 204 96 -121.16 gain 96 205 -121.79 gain 205 96 -119.72 gain 96 206 -131.42 gain 206 96 -133.87 gain 96 207 -127.31 gain 207 96 -122.11 gain 96 208 -128.34 gain 208 96 -128.92 gain 96 209 -124.10 gain 209 96 -125.68 gain 96 210 -123.35 gain 210 96 -121.86 gain 96 211 -118.48 gain 211 96 -119.01 gain 96 212 -120.86 gain 212 96 -119.94 gain 96 213 -123.39 gain 213 96 -121.66 gain 96 214 -126.62 gain 214 96 -124.78 gain 96 215 -130.88 gain 215 96 -125.45 gain 96 216 -117.18 gain 216 96 -116.41 gain 96 217 -116.52 gain 217 96 -116.28 gain 96 218 -119.08 gain 218 96 -121.02 gain 96 219 -127.65 gain 219 96 -120.95 gain 96 220 -127.76 gain 220 96 -131.55 gain 96 221 -124.43 gain 221 96 -123.86 gain 96 222 -123.02 gain 222 96 -122.78 gain 96 223 -126.53 gain 223 96 -124.91 gain 96 224 -127.52 gain 224 96 -128.58 gain 97 98 -96.84 gain 98 97 -97.64 gain 97 99 -101.29 gain 99 97 -99.91 gain 97 100 -100.52 gain 100 97 -98.71 gain 97 101 -114.90 gain 101 97 -113.25 gain 97 102 -107.92 gain 102 97 -107.05 gain 97 103 -112.07 gain 103 97 -108.68 gain 97 104 -116.30 gain 104 97 -118.29 gain 97 105 -113.98 gain 105 97 -111.92 gain 97 106 -117.36 gain 106 97 -116.38 gain 97 107 -106.46 gain 107 97 -112.04 gain 97 108 -104.03 gain 108 97 -101.93 gain 97 109 -97.26 gain 109 97 -98.65 gain 97 110 -108.40 gain 110 97 -108.26 gain 97 111 -100.46 gain 111 97 -100.00 gain 97 112 -96.65 gain 112 97 -95.07 gain 97 113 -90.34 gain 113 97 -87.56 gain 97 114 -106.79 gain 114 97 -107.32 gain 97 115 -107.22 gain 115 97 -102.05 gain 97 116 -114.83 gain 116 97 -117.20 gain 97 117 -114.95 gain 117 97 -118.82 gain 97 118 -118.81 gain 118 97 -121.00 gain 97 119 -118.81 gain 119 97 -115.66 gain 97 120 -115.74 gain 120 97 -117.11 gain 97 121 -111.09 gain 121 97 -111.75 gain 97 122 -115.66 gain 122 97 -118.43 gain 97 123 -115.13 gain 123 97 -118.68 gain 97 124 -112.90 gain 124 97 -112.86 gain 97 125 -104.34 gain 125 97 -105.63 gain 97 126 -101.68 gain 126 97 -100.93 gain 97 127 -102.85 gain 127 97 -105.56 gain 97 128 -101.47 gain 128 97 -102.12 gain 97 129 -101.10 gain 129 97 -99.66 gain 97 130 -111.08 gain 130 97 -107.47 gain 97 131 -111.53 gain 131 97 -115.00 gain 97 132 -119.57 gain 132 97 -122.66 gain 97 133 -114.48 gain 133 97 -115.64 gain 97 134 -121.35 gain 134 97 -119.22 gain 97 135 -126.05 gain 135 97 -127.48 gain 97 136 -115.75 gain 136 97 -117.80 gain 97 137 -115.38 gain 137 97 -114.91 gain 97 138 -120.89 gain 138 97 -119.42 gain 97 139 -117.24 gain 139 97 -116.76 gain 97 140 -112.51 gain 140 97 -114.63 gain 97 141 -109.64 gain 141 97 -110.43 gain 97 142 -114.46 gain 142 97 -114.56 gain 97 143 -108.97 gain 143 97 -108.68 gain 97 144 -110.78 gain 144 97 -111.51 gain 97 145 -113.72 gain 145 97 -112.91 gain 97 146 -111.13 gain 146 97 -109.22 gain 97 147 -117.99 gain 147 97 -113.18 gain 97 148 -118.72 gain 148 97 -113.62 gain 97 149 -123.68 gain 149 97 -121.75 gain 97 150 -125.99 gain 150 97 -126.75 gain 97 151 -116.03 gain 151 97 -116.98 gain 97 152 -124.13 gain 152 97 -122.06 gain 97 153 -110.35 gain 153 97 -105.85 gain 97 154 -111.20 gain 154 97 -115.25 gain 97 155 -114.41 gain 155 97 -118.36 gain 97 156 -114.65 gain 156 97 -112.99 gain 97 157 -109.34 gain 157 97 -110.62 gain 97 158 -120.58 gain 158 97 -124.46 gain 97 159 -108.36 gain 159 97 -108.85 gain 97 160 -118.92 gain 160 97 -116.53 gain 97 161 -115.77 gain 161 97 -116.86 gain 97 162 -118.09 gain 162 97 -118.05 gain 97 163 -117.31 gain 163 97 -119.42 gain 97 164 -123.53 gain 164 97 -126.68 gain 97 165 -118.03 gain 165 97 -117.23 gain 97 166 -118.82 gain 166 97 -119.58 gain 97 167 -115.33 gain 167 97 -118.19 gain 97 168 -115.99 gain 168 97 -117.29 gain 97 169 -114.97 gain 169 97 -120.47 gain 97 170 -114.17 gain 170 97 -111.20 gain 97 171 -119.99 gain 171 97 -122.05 gain 97 172 -106.80 gain 172 97 -103.55 gain 97 173 -107.52 gain 173 97 -103.70 gain 97 174 -112.22 gain 174 97 -112.70 gain 97 175 -119.77 gain 175 97 -123.80 gain 97 176 -120.26 gain 176 97 -116.31 gain 97 177 -118.25 gain 177 97 -122.11 gain 97 178 -126.56 gain 178 97 -126.24 gain 97 179 -116.49 gain 179 97 -114.56 gain 97 180 -124.54 gain 180 97 -124.08 gain 97 181 -122.01 gain 181 97 -121.62 gain 97 182 -123.38 gain 182 97 -125.38 gain 97 183 -117.57 gain 183 97 -112.95 gain 97 184 -119.15 gain 184 97 -119.31 gain 97 185 -121.44 gain 185 97 -119.09 gain 97 186 -119.24 gain 186 97 -117.17 gain 97 187 -123.03 gain 187 97 -123.51 gain 97 188 -111.60 gain 188 97 -115.33 gain 97 189 -118.61 gain 189 97 -119.86 gain 97 190 -119.44 gain 190 97 -117.70 gain 97 191 -116.80 gain 191 97 -116.15 gain 97 192 -119.90 gain 192 97 -122.12 gain 97 193 -118.93 gain 193 97 -122.40 gain 97 194 -125.02 gain 194 97 -122.31 gain 97 195 -120.16 gain 195 97 -118.08 gain 97 196 -121.63 gain 196 97 -123.58 gain 97 197 -129.85 gain 197 97 -127.87 gain 97 198 -115.33 gain 198 97 -112.87 gain 97 199 -124.31 gain 199 97 -125.77 gain 97 200 -114.64 gain 200 97 -113.03 gain 97 201 -118.92 gain 201 97 -118.12 gain 97 202 -118.18 gain 202 97 -121.38 gain 97 203 -118.40 gain 203 97 -121.23 gain 97 204 -119.05 gain 204 97 -119.16 gain 97 205 -119.56 gain 205 97 -118.74 gain 97 206 -124.09 gain 206 97 -127.79 gain 97 207 -119.08 gain 207 97 -115.14 gain 97 208 -124.20 gain 208 97 -126.04 gain 97 209 -121.70 gain 209 97 -124.53 gain 97 210 -121.09 gain 210 97 -120.86 gain 97 211 -126.84 gain 211 97 -128.63 gain 97 212 -114.67 gain 212 97 -115.00 gain 97 213 -123.11 gain 213 97 -122.64 gain 97 214 -129.15 gain 214 97 -128.56 gain 97 215 -121.38 gain 215 97 -117.21 gain 97 216 -120.58 gain 216 97 -121.07 gain 97 217 -118.78 gain 217 97 -119.78 gain 97 218 -122.93 gain 218 97 -126.13 gain 97 219 -121.73 gain 219 97 -116.29 gain 97 220 -118.36 gain 220 97 -123.40 gain 97 221 -121.24 gain 221 97 -121.93 gain 97 222 -124.05 gain 222 97 -125.06 gain 97 223 -123.10 gain 223 97 -122.73 gain 97 224 -119.92 gain 224 97 -122.24 gain 98 99 -98.71 gain 99 98 -96.53 gain 98 100 -103.32 gain 100 98 -100.70 gain 98 101 -111.69 gain 101 98 -109.24 gain 98 102 -111.75 gain 102 98 -110.07 gain 98 103 -114.15 gain 103 98 -109.97 gain 98 104 -115.55 gain 104 98 -116.74 gain 98 105 -115.88 gain 105 98 -113.01 gain 98 106 -120.99 gain 106 98 -119.21 gain 98 107 -115.85 gain 107 98 -120.63 gain 98 108 -116.65 gain 108 98 -113.75 gain 98 109 -116.91 gain 109 98 -117.50 gain 98 110 -108.87 gain 110 98 -107.93 gain 98 111 -100.35 gain 111 98 -99.09 gain 98 112 -94.70 gain 112 98 -92.32 gain 98 113 -98.68 gain 113 98 -95.11 gain 98 114 -95.39 gain 114 98 -95.12 gain 98 115 -101.80 gain 115 98 -95.83 gain 98 116 -106.85 gain 116 98 -108.43 gain 98 117 -112.27 gain 117 98 -115.34 gain 98 118 -115.13 gain 118 98 -116.53 gain 98 119 -122.47 gain 119 98 -118.52 gain 98 120 -120.20 gain 120 98 -120.77 gain 98 121 -120.57 gain 121 98 -120.42 gain 98 122 -116.43 gain 122 98 -118.41 gain 98 123 -118.92 gain 123 98 -121.67 gain 98 124 -122.06 gain 124 98 -121.22 gain 98 125 -112.92 gain 125 98 -113.42 gain 98 126 -100.44 gain 126 98 -98.89 gain 98 127 -108.62 gain 127 98 -110.53 gain 98 128 -104.09 gain 128 98 -103.94 gain 98 129 -101.44 gain 129 98 -99.20 gain 98 130 -109.73 gain 130 98 -105.31 gain 98 131 -109.33 gain 131 98 -112.00 gain 98 132 -111.30 gain 132 98 -113.60 gain 98 133 -109.81 gain 133 98 -110.18 gain 98 134 -116.51 gain 134 98 -113.58 gain 98 135 -119.05 gain 135 98 -119.69 gain 98 136 -121.99 gain 136 98 -123.24 gain 98 137 -114.66 gain 137 98 -113.39 gain 98 138 -122.59 gain 138 98 -120.32 gain 98 139 -114.19 gain 139 98 -112.91 gain 98 140 -117.29 gain 140 98 -118.61 gain 98 141 -109.81 gain 141 98 -109.80 gain 98 142 -104.96 gain 142 98 -104.27 gain 98 143 -111.18 gain 143 98 -110.10 gain 98 144 -110.28 gain 144 98 -110.22 gain 98 145 -115.27 gain 145 98 -113.65 gain 98 146 -115.35 gain 146 98 -112.65 gain 98 147 -114.70 gain 147 98 -109.08 gain 98 148 -115.04 gain 148 98 -109.14 gain 98 149 -119.79 gain 149 98 -117.06 gain 98 150 -113.20 gain 150 98 -113.15 gain 98 151 -117.44 gain 151 98 -117.59 gain 98 152 -111.62 gain 152 98 -108.75 gain 98 153 -114.24 gain 153 98 -108.95 gain 98 154 -115.96 gain 154 98 -119.21 gain 98 155 -114.50 gain 155 98 -117.65 gain 98 156 -118.74 gain 156 98 -116.28 gain 98 157 -108.92 gain 157 98 -109.41 gain 98 158 -109.88 gain 158 98 -112.96 gain 98 159 -113.84 gain 159 98 -113.53 gain 98 160 -117.01 gain 160 98 -113.81 gain 98 161 -116.97 gain 161 98 -117.27 gain 98 162 -109.96 gain 162 98 -109.12 gain 98 163 -115.23 gain 163 98 -116.55 gain 98 164 -114.41 gain 164 98 -116.77 gain 98 165 -128.11 gain 165 98 -126.50 gain 98 166 -122.71 gain 166 98 -122.67 gain 98 167 -125.89 gain 167 98 -127.94 gain 98 168 -119.43 gain 168 98 -119.93 gain 98 169 -119.68 gain 169 98 -124.38 gain 98 170 -114.30 gain 170 98 -110.53 gain 98 171 -110.75 gain 171 98 -112.00 gain 98 172 -118.45 gain 172 98 -114.40 gain 98 173 -115.82 gain 173 98 -111.20 gain 98 174 -110.51 gain 174 98 -110.19 gain 98 175 -107.39 gain 175 98 -110.63 gain 98 176 -115.86 gain 176 98 -111.11 gain 98 177 -124.19 gain 177 98 -127.25 gain 98 178 -122.69 gain 178 98 -121.57 gain 98 179 -121.05 gain 179 98 -118.33 gain 98 180 -122.71 gain 180 98 -121.45 gain 98 181 -116.42 gain 181 98 -115.23 gain 98 182 -126.67 gain 182 98 -127.86 gain 98 183 -119.12 gain 183 98 -113.70 gain 98 184 -122.14 gain 184 98 -121.51 gain 98 185 -122.11 gain 185 98 -118.97 gain 98 186 -115.34 gain 186 98 -112.48 gain 98 187 -115.03 gain 187 98 -114.71 gain 98 188 -122.09 gain 188 98 -125.03 gain 98 189 -113.25 gain 189 98 -113.71 gain 98 190 -120.59 gain 190 98 -118.06 gain 98 191 -118.21 gain 191 98 -116.77 gain 98 192 -125.35 gain 192 98 -126.77 gain 98 193 -121.04 gain 193 98 -123.71 gain 98 194 -123.62 gain 194 98 -120.11 gain 98 195 -121.41 gain 195 98 -118.53 gain 98 196 -129.25 gain 196 98 -130.40 gain 98 197 -119.96 gain 197 98 -117.18 gain 98 198 -123.32 gain 198 98 -120.06 gain 98 199 -123.03 gain 199 98 -123.69 gain 98 200 -114.86 gain 200 98 -112.46 gain 98 201 -120.00 gain 201 98 -118.40 gain 98 202 -114.77 gain 202 98 -117.17 gain 98 203 -126.27 gain 203 98 -128.29 gain 98 204 -117.26 gain 204 98 -116.57 gain 98 205 -117.79 gain 205 98 -116.17 gain 98 206 -118.65 gain 206 98 -121.55 gain 98 207 -118.98 gain 207 98 -114.24 gain 98 208 -117.60 gain 208 98 -118.64 gain 98 209 -128.61 gain 209 98 -130.64 gain 98 210 -127.63 gain 210 98 -126.60 gain 98 211 -124.94 gain 211 98 -125.93 gain 98 212 -125.96 gain 212 98 -125.50 gain 98 213 -116.28 gain 213 98 -115.00 gain 98 214 -127.61 gain 214 98 -126.23 gain 98 215 -128.64 gain 215 98 -123.67 gain 98 216 -121.96 gain 216 98 -121.65 gain 98 217 -115.67 gain 217 98 -115.88 gain 98 218 -126.37 gain 218 98 -128.76 gain 98 219 -119.11 gain 219 98 -112.87 gain 98 220 -125.21 gain 220 98 -129.46 gain 98 221 -123.76 gain 221 98 -123.65 gain 98 222 -121.57 gain 222 98 -121.79 gain 98 223 -128.26 gain 223 98 -127.09 gain 98 224 -129.20 gain 224 98 -130.72 gain 99 100 -89.74 gain 100 99 -89.31 gain 99 101 -96.02 gain 101 99 -95.75 gain 99 102 -103.85 gain 102 99 -104.36 gain 99 103 -112.43 gain 103 99 -110.42 gain 99 104 -112.19 gain 104 99 -115.56 gain 99 105 -119.75 gain 105 99 -119.06 gain 99 106 -115.49 gain 106 99 -115.89 gain 99 107 -117.41 gain 107 99 -124.37 gain 99 108 -122.54 gain 108 99 -121.82 gain 99 109 -117.96 gain 109 99 -120.73 gain 99 110 -109.42 gain 110 99 -110.66 gain 99 111 -105.11 gain 111 99 -106.03 gain 99 112 -108.15 gain 112 99 -107.95 gain 99 113 -99.62 gain 113 99 -98.23 gain 99 114 -88.49 gain 114 99 -90.39 gain 99 115 -99.43 gain 115 99 -95.64 gain 99 116 -97.01 gain 116 99 -100.76 gain 99 117 -107.71 gain 117 99 -112.97 gain 99 118 -107.51 gain 118 99 -111.08 gain 99 119 -107.58 gain 119 99 -105.81 gain 99 120 -120.71 gain 120 99 -123.46 gain 99 121 -115.19 gain 121 99 -117.23 gain 99 122 -113.70 gain 122 99 -117.86 gain 99 123 -117.59 gain 123 99 -122.52 gain 99 124 -114.61 gain 124 99 -115.95 gain 99 125 -112.05 gain 125 99 -114.72 gain 99 126 -109.39 gain 126 99 -110.02 gain 99 127 -107.42 gain 127 99 -111.52 gain 99 128 -99.84 gain 128 99 -101.87 gain 99 129 -104.50 gain 129 99 -104.44 gain 99 130 -106.75 gain 130 99 -104.52 gain 99 131 -111.05 gain 131 99 -115.90 gain 99 132 -103.33 gain 132 99 -107.81 gain 99 133 -111.50 gain 133 99 -114.05 gain 99 134 -110.49 gain 134 99 -109.74 gain 99 135 -120.80 gain 135 99 -123.62 gain 99 136 -121.00 gain 136 99 -124.43 gain 99 137 -117.09 gain 137 99 -118.00 gain 99 138 -114.85 gain 138 99 -114.76 gain 99 139 -114.22 gain 139 99 -115.12 gain 99 140 -111.43 gain 140 99 -114.94 gain 99 141 -110.64 gain 141 99 -112.82 gain 99 142 -111.25 gain 142 99 -112.74 gain 99 143 -109.41 gain 143 99 -110.51 gain 99 144 -108.53 gain 144 99 -110.64 gain 99 145 -106.74 gain 145 99 -107.31 gain 99 146 -112.96 gain 146 99 -112.44 gain 99 147 -116.31 gain 147 99 -112.88 gain 99 148 -109.61 gain 148 99 -105.90 gain 99 149 -106.90 gain 149 99 -106.35 gain 99 150 -130.92 gain 150 99 -133.06 gain 99 151 -112.02 gain 151 99 -114.36 gain 99 152 -120.40 gain 152 99 -119.71 gain 99 153 -116.71 gain 153 99 -113.60 gain 99 154 -121.28 gain 154 99 -126.71 gain 99 155 -112.36 gain 155 99 -117.69 gain 99 156 -113.89 gain 156 99 -113.60 gain 99 157 -109.83 gain 157 99 -112.50 gain 99 158 -109.72 gain 158 99 -114.98 gain 99 159 -107.35 gain 159 99 -109.23 gain 99 160 -116.35 gain 160 99 -115.33 gain 99 161 -116.73 gain 161 99 -119.21 gain 99 162 -123.24 gain 162 99 -124.58 gain 99 163 -111.46 gain 163 99 -114.95 gain 99 164 -108.80 gain 164 99 -113.34 gain 99 165 -124.82 gain 165 99 -125.40 gain 99 166 -120.56 gain 166 99 -122.70 gain 99 167 -121.92 gain 167 99 -126.16 gain 99 168 -121.12 gain 168 99 -123.80 gain 99 169 -117.74 gain 169 99 -124.62 gain 99 170 -109.84 gain 170 99 -108.25 gain 99 171 -115.52 gain 171 99 -118.95 gain 99 172 -115.43 gain 172 99 -113.56 gain 99 173 -113.66 gain 173 99 -111.23 gain 99 174 -118.62 gain 174 99 -120.48 gain 99 175 -114.55 gain 175 99 -119.97 gain 99 176 -114.64 gain 176 99 -112.07 gain 99 177 -118.99 gain 177 99 -124.23 gain 99 178 -118.43 gain 178 99 -119.49 gain 99 179 -115.61 gain 179 99 -115.06 gain 99 180 -122.67 gain 180 99 -123.60 gain 99 181 -121.01 gain 181 99 -122.00 gain 99 182 -114.38 gain 182 99 -117.76 gain 99 183 -125.26 gain 183 99 -122.02 gain 99 184 -120.30 gain 184 99 -121.85 gain 99 185 -118.91 gain 185 99 -117.95 gain 99 186 -118.25 gain 186 99 -117.57 gain 99 187 -112.86 gain 187 99 -114.72 gain 99 188 -113.57 gain 188 99 -118.69 gain 99 189 -120.58 gain 189 99 -123.22 gain 99 190 -120.79 gain 190 99 -120.44 gain 99 191 -119.06 gain 191 99 -119.80 gain 99 192 -120.61 gain 192 99 -124.21 gain 99 193 -121.80 gain 193 99 -126.66 gain 99 194 -109.59 gain 194 99 -108.26 gain 99 195 -126.27 gain 195 99 -125.57 gain 99 196 -121.39 gain 196 99 -124.73 gain 99 197 -122.73 gain 197 99 -122.13 gain 99 198 -117.32 gain 198 99 -116.24 gain 99 199 -122.28 gain 199 99 -125.12 gain 99 200 -120.01 gain 200 99 -119.79 gain 99 201 -116.95 gain 201 99 -117.53 gain 99 202 -109.83 gain 202 99 -114.41 gain 99 203 -119.88 gain 203 99 -124.09 gain 99 204 -120.84 gain 204 99 -122.32 gain 99 205 -118.41 gain 205 99 -118.97 gain 99 206 -114.76 gain 206 99 -119.84 gain 99 207 -118.19 gain 207 99 -115.64 gain 99 208 -118.51 gain 208 99 -121.73 gain 99 209 -119.67 gain 209 99 -123.89 gain 99 210 -123.88 gain 210 99 -125.03 gain 99 211 -122.43 gain 211 99 -125.60 gain 99 212 -122.03 gain 212 99 -123.75 gain 99 213 -128.27 gain 213 99 -129.18 gain 99 214 -123.31 gain 214 99 -124.11 gain 99 215 -116.78 gain 215 99 -113.99 gain 99 216 -112.82 gain 216 99 -114.69 gain 99 217 -121.11 gain 217 99 -123.49 gain 99 218 -124.95 gain 218 99 -129.53 gain 99 219 -121.62 gain 219 99 -117.55 gain 99 220 -115.48 gain 220 99 -121.91 gain 99 221 -119.40 gain 221 99 -121.47 gain 99 222 -117.48 gain 222 99 -119.88 gain 99 223 -115.72 gain 223 99 -116.73 gain 99 224 -114.00 gain 224 99 -117.70 gain 100 101 -88.85 gain 101 100 -89.01 gain 100 102 -93.22 gain 102 100 -94.17 gain 100 103 -113.30 gain 103 100 -111.73 gain 100 104 -110.07 gain 104 100 -113.87 gain 100 105 -128.52 gain 105 100 -128.27 gain 100 106 -114.94 gain 106 100 -115.77 gain 100 107 -116.17 gain 107 100 -123.56 gain 100 108 -119.49 gain 108 100 -119.21 gain 100 109 -111.51 gain 109 100 -114.71 gain 100 110 -117.37 gain 110 100 -119.04 gain 100 111 -115.93 gain 111 100 -117.28 gain 100 112 -103.89 gain 112 100 -104.12 gain 100 113 -100.97 gain 113 100 -100.01 gain 100 114 -98.98 gain 114 100 -101.32 gain 100 115 -92.13 gain 115 100 -88.78 gain 100 116 -99.08 gain 116 100 -103.27 gain 100 117 -97.24 gain 117 100 -102.92 gain 100 118 -102.48 gain 118 100 -106.48 gain 100 119 -112.86 gain 119 100 -111.53 gain 100 120 -116.95 gain 120 100 -120.14 gain 100 121 -121.83 gain 121 100 -124.30 gain 100 122 -120.71 gain 122 100 -125.30 gain 100 123 -116.24 gain 123 100 -121.61 gain 100 124 -116.99 gain 124 100 -118.77 gain 100 125 -113.52 gain 125 100 -116.63 gain 100 126 -107.76 gain 126 100 -108.83 gain 100 127 -107.86 gain 127 100 -112.39 gain 100 128 -104.22 gain 128 100 -106.69 gain 100 129 -97.35 gain 129 100 -97.73 gain 100 130 -101.17 gain 130 100 -99.37 gain 100 131 -108.77 gain 131 100 -114.06 gain 100 132 -107.29 gain 132 100 -112.20 gain 100 133 -108.95 gain 133 100 -111.93 gain 100 134 -118.30 gain 134 100 -117.98 gain 100 135 -118.49 gain 135 100 -121.74 gain 100 136 -120.21 gain 136 100 -124.08 gain 100 137 -120.82 gain 137 100 -122.16 gain 100 138 -115.66 gain 138 100 -116.00 gain 100 139 -113.96 gain 139 100 -115.29 gain 100 140 -118.39 gain 140 100 -122.33 gain 100 141 -110.03 gain 141 100 -112.64 gain 100 142 -107.92 gain 142 100 -109.84 gain 100 143 -102.69 gain 143 100 -104.22 gain 100 144 -108.26 gain 144 100 -110.81 gain 100 145 -109.54 gain 145 100 -110.54 gain 100 146 -106.60 gain 146 100 -106.51 gain 100 147 -99.74 gain 147 100 -96.74 gain 100 148 -113.83 gain 148 100 -110.54 gain 100 149 -109.38 gain 149 100 -109.27 gain 100 150 -121.01 gain 150 100 -123.58 gain 100 151 -120.85 gain 151 100 -123.61 gain 100 152 -124.64 gain 152 100 -124.38 gain 100 153 -112.83 gain 153 100 -110.15 gain 100 154 -120.96 gain 154 100 -126.83 gain 100 155 -117.17 gain 155 100 -122.94 gain 100 156 -115.56 gain 156 100 -115.72 gain 100 157 -110.06 gain 157 100 -113.16 gain 100 158 -114.15 gain 158 100 -119.85 gain 100 159 -111.14 gain 159 100 -113.45 gain 100 160 -107.26 gain 160 100 -106.68 gain 100 161 -107.41 gain 161 100 -110.32 gain 100 162 -119.71 gain 162 100 -121.49 gain 100 163 -108.54 gain 163 100 -112.47 gain 100 164 -110.68 gain 164 100 -115.65 gain 100 165 -125.74 gain 165 100 -126.75 gain 100 166 -119.68 gain 166 100 -122.26 gain 100 167 -116.79 gain 167 100 -121.45 gain 100 168 -120.70 gain 168 100 -123.82 gain 100 169 -116.77 gain 169 100 -124.09 gain 100 170 -121.96 gain 170 100 -120.80 gain 100 171 -115.75 gain 171 100 -119.62 gain 100 172 -116.61 gain 172 100 -115.17 gain 100 173 -114.54 gain 173 100 -112.54 gain 100 174 -111.09 gain 174 100 -113.38 gain 100 175 -112.14 gain 175 100 -117.99 gain 100 176 -114.98 gain 176 100 -112.84 gain 100 177 -111.95 gain 177 100 -117.62 gain 100 178 -116.01 gain 178 100 -117.51 gain 100 179 -114.84 gain 179 100 -114.73 gain 100 180 -123.55 gain 180 100 -124.90 gain 100 181 -117.20 gain 181 100 -118.63 gain 100 182 -121.29 gain 182 100 -125.10 gain 100 183 -125.39 gain 183 100 -122.59 gain 100 184 -123.60 gain 184 100 -125.59 gain 100 185 -113.26 gain 185 100 -112.73 gain 100 186 -111.06 gain 186 100 -110.82 gain 100 187 -111.49 gain 187 100 -113.78 gain 100 188 -109.20 gain 188 100 -114.75 gain 100 189 -116.96 gain 189 100 -120.03 gain 100 190 -108.94 gain 190 100 -109.02 gain 100 191 -116.82 gain 191 100 -117.99 gain 100 192 -114.24 gain 192 100 -118.27 gain 100 193 -118.29 gain 193 100 -123.58 gain 100 194 -112.58 gain 194 100 -111.68 gain 100 195 -127.50 gain 195 100 -127.24 gain 100 196 -128.43 gain 196 100 -132.20 gain 100 197 -124.01 gain 197 100 -123.85 gain 100 198 -122.07 gain 198 100 -121.43 gain 100 199 -117.97 gain 199 100 -121.24 gain 100 200 -126.73 gain 200 100 -126.94 gain 100 201 -121.46 gain 201 100 -122.48 gain 100 202 -114.94 gain 202 100 -119.95 gain 100 203 -112.22 gain 203 100 -116.86 gain 100 204 -120.41 gain 204 100 -122.34 gain 100 205 -120.27 gain 205 100 -121.26 gain 100 206 -116.73 gain 206 100 -122.24 gain 100 207 -116.27 gain 207 100 -114.15 gain 100 208 -118.10 gain 208 100 -121.75 gain 100 209 -120.47 gain 209 100 -125.12 gain 100 210 -127.20 gain 210 100 -128.78 gain 100 211 -121.62 gain 211 100 -125.22 gain 100 212 -125.47 gain 212 100 -127.62 gain 100 213 -123.37 gain 213 100 -124.71 gain 100 214 -130.27 gain 214 100 -131.50 gain 100 215 -123.10 gain 215 100 -120.74 gain 100 216 -117.36 gain 216 100 -119.66 gain 100 217 -117.83 gain 217 100 -120.65 gain 100 218 -114.36 gain 218 100 -119.38 gain 100 219 -121.26 gain 219 100 -117.63 gain 100 220 -119.23 gain 220 100 -126.09 gain 100 221 -120.53 gain 221 100 -123.03 gain 100 222 -121.09 gain 222 100 -123.92 gain 100 223 -121.94 gain 223 100 -123.39 gain 100 224 -118.26 gain 224 100 -122.40 gain 101 102 -87.68 gain 102 101 -88.46 gain 101 103 -97.69 gain 103 101 -95.95 gain 101 104 -97.73 gain 104 101 -101.37 gain 101 105 -129.53 gain 105 101 -129.12 gain 101 106 -120.64 gain 106 101 -121.30 gain 101 107 -116.23 gain 107 101 -123.47 gain 101 108 -123.11 gain 108 101 -122.67 gain 101 109 -119.60 gain 109 101 -122.64 gain 101 110 -114.02 gain 110 101 -115.53 gain 101 111 -118.15 gain 111 101 -119.34 gain 101 112 -111.80 gain 112 101 -111.87 gain 101 113 -107.22 gain 113 101 -106.10 gain 101 114 -103.87 gain 114 101 -106.05 gain 101 115 -96.75 gain 115 101 -93.23 gain 101 116 -88.91 gain 116 101 -92.94 gain 101 117 -94.76 gain 117 101 -100.28 gain 101 118 -105.51 gain 118 101 -109.35 gain 101 119 -103.93 gain 119 101 -102.43 gain 101 120 -126.80 gain 120 101 -129.82 gain 101 121 -125.23 gain 121 101 -127.54 gain 101 122 -123.84 gain 122 101 -128.27 gain 101 123 -121.45 gain 123 101 -126.65 gain 101 124 -117.42 gain 124 101 -119.03 gain 101 125 -115.11 gain 125 101 -118.06 gain 101 126 -105.60 gain 126 101 -106.50 gain 101 127 -115.65 gain 127 101 -120.01 gain 101 128 -106.63 gain 128 101 -108.93 gain 101 129 -103.88 gain 129 101 -104.09 gain 101 130 -105.11 gain 130 101 -103.15 gain 101 131 -99.51 gain 131 101 -104.63 gain 101 132 -97.93 gain 132 101 -102.67 gain 101 133 -102.30 gain 133 101 -105.12 gain 101 134 -105.52 gain 134 101 -105.03 gain 101 135 -120.80 gain 135 101 -123.89 gain 101 136 -121.54 gain 136 101 -125.24 gain 101 137 -121.66 gain 137 101 -122.84 gain 101 138 -119.07 gain 138 101 -119.25 gain 101 139 -118.87 gain 139 101 -120.03 gain 101 140 -118.88 gain 140 101 -122.66 gain 101 141 -117.07 gain 141 101 -119.51 gain 101 142 -111.93 gain 142 101 -113.69 gain 101 143 -111.38 gain 143 101 -112.75 gain 101 144 -102.83 gain 144 101 -105.22 gain 101 145 -103.97 gain 145 101 -104.80 gain 101 146 -102.05 gain 146 101 -101.79 gain 101 147 -104.92 gain 147 101 -101.76 gain 101 148 -97.90 gain 148 101 -94.46 gain 101 149 -110.03 gain 149 101 -109.75 gain 101 150 -122.08 gain 150 101 -124.49 gain 101 151 -120.43 gain 151 101 -123.03 gain 101 152 -117.18 gain 152 101 -116.76 gain 101 153 -112.80 gain 153 101 -109.96 gain 101 154 -125.91 gain 154 101 -131.61 gain 101 155 -120.57 gain 155 101 -126.17 gain 101 156 -116.16 gain 156 101 -116.15 gain 101 157 -113.99 gain 157 101 -116.92 gain 101 158 -108.39 gain 158 101 -113.92 gain 101 159 -114.83 gain 159 101 -116.97 gain 101 160 -114.28 gain 160 101 -113.54 gain 101 161 -104.41 gain 161 101 -107.16 gain 101 162 -124.25 gain 162 101 -125.86 gain 101 163 -113.04 gain 163 101 -116.80 gain 101 164 -117.33 gain 164 101 -122.14 gain 101 165 -120.30 gain 165 101 -121.15 gain 101 166 -125.47 gain 166 101 -127.88 gain 101 167 -118.77 gain 167 101 -123.27 gain 101 168 -117.48 gain 168 101 -120.43 gain 101 169 -116.43 gain 169 101 -123.58 gain 101 170 -118.23 gain 170 101 -116.91 gain 101 171 -116.06 gain 171 101 -119.76 gain 101 172 -109.62 gain 172 101 -108.02 gain 101 173 -112.49 gain 173 101 -110.33 gain 101 174 -117.85 gain 174 101 -119.98 gain 101 175 -115.80 gain 175 101 -121.49 gain 101 176 -118.13 gain 176 101 -115.83 gain 101 177 -116.55 gain 177 101 -122.06 gain 101 178 -117.86 gain 178 101 -119.19 gain 101 179 -116.78 gain 179 101 -116.50 gain 101 180 -120.71 gain 180 101 -121.91 gain 101 181 -123.95 gain 181 101 -125.21 gain 101 182 -116.33 gain 182 101 -119.98 gain 101 183 -125.82 gain 183 101 -122.86 gain 101 184 -120.75 gain 184 101 -122.57 gain 101 185 -116.56 gain 185 101 -115.86 gain 101 186 -117.98 gain 186 101 -117.57 gain 101 187 -116.68 gain 187 101 -118.81 gain 101 188 -113.43 gain 188 101 -118.82 gain 101 189 -116.29 gain 189 101 -119.20 gain 101 190 -117.19 gain 190 101 -117.10 gain 101 191 -116.55 gain 191 101 -117.56 gain 101 192 -116.60 gain 192 101 -120.47 gain 101 193 -117.90 gain 193 101 -123.03 gain 101 194 -118.50 gain 194 101 -117.44 gain 101 195 -119.56 gain 195 101 -119.13 gain 101 196 -125.20 gain 196 101 -128.81 gain 101 197 -121.55 gain 197 101 -121.23 gain 101 198 -122.45 gain 198 101 -121.64 gain 101 199 -126.17 gain 199 101 -129.28 gain 101 200 -118.00 gain 200 101 -118.05 gain 101 201 -121.53 gain 201 101 -122.38 gain 101 202 -121.89 gain 202 101 -126.75 gain 101 203 -117.53 gain 203 101 -122.00 gain 101 204 -120.39 gain 204 101 -122.15 gain 101 205 -113.70 gain 205 101 -114.54 gain 101 206 -117.86 gain 206 101 -123.22 gain 101 207 -113.69 gain 207 101 -111.41 gain 101 208 -116.36 gain 208 101 -119.85 gain 101 209 -112.66 gain 209 101 -117.15 gain 101 210 -128.35 gain 210 101 -129.77 gain 101 211 -124.56 gain 211 101 -128.00 gain 101 212 -118.66 gain 212 101 -120.64 gain 101 213 -129.32 gain 213 101 -130.49 gain 101 214 -124.37 gain 214 101 -125.44 gain 101 215 -123.33 gain 215 101 -120.81 gain 101 216 -118.34 gain 216 101 -120.48 gain 101 217 -120.65 gain 217 101 -123.31 gain 101 218 -116.05 gain 218 101 -120.90 gain 101 219 -123.10 gain 219 101 -119.31 gain 101 220 -124.72 gain 220 101 -131.41 gain 101 221 -116.92 gain 221 101 -119.26 gain 101 222 -119.73 gain 222 101 -122.40 gain 101 223 -111.56 gain 223 101 -112.84 gain 101 224 -124.47 gain 224 101 -128.44 gain 102 103 -85.96 gain 103 102 -83.45 gain 102 104 -103.57 gain 104 102 -106.43 gain 102 105 -123.86 gain 105 102 -122.66 gain 102 106 -125.61 gain 106 102 -125.49 gain 102 107 -122.43 gain 107 102 -128.89 gain 102 108 -117.47 gain 108 102 -116.24 gain 102 109 -121.01 gain 109 102 -123.27 gain 102 110 -118.77 gain 110 102 -119.50 gain 102 111 -112.24 gain 111 102 -112.65 gain 102 112 -116.25 gain 112 102 -115.54 gain 102 113 -105.98 gain 113 102 -104.07 gain 102 114 -111.59 gain 114 102 -112.99 gain 102 115 -103.78 gain 115 102 -99.48 gain 102 116 -93.51 gain 116 102 -96.75 gain 102 117 -94.06 gain 117 102 -98.80 gain 102 118 -95.87 gain 118 102 -98.94 gain 102 119 -105.74 gain 119 102 -103.46 gain 102 120 -126.56 gain 120 102 -128.80 gain 102 121 -129.86 gain 121 102 -131.39 gain 102 122 -121.95 gain 122 102 -125.60 gain 102 123 -123.66 gain 123 102 -128.08 gain 102 124 -122.62 gain 124 102 -123.46 gain 102 125 -114.12 gain 125 102 -116.28 gain 102 126 -120.96 gain 126 102 -121.08 gain 102 127 -109.83 gain 127 102 -113.42 gain 102 128 -118.82 gain 128 102 -120.34 gain 102 129 -109.66 gain 129 102 -109.09 gain 102 130 -105.98 gain 130 102 -103.24 gain 102 131 -105.11 gain 131 102 -109.45 gain 102 132 -93.80 gain 132 102 -97.77 gain 102 133 -108.22 gain 133 102 -110.25 gain 102 134 -108.67 gain 134 102 -107.40 gain 102 135 -132.58 gain 135 102 -134.89 gain 102 136 -129.00 gain 136 102 -131.92 gain 102 137 -125.61 gain 137 102 -126.01 gain 102 138 -119.72 gain 138 102 -119.12 gain 102 139 -116.25 gain 139 102 -116.64 gain 102 140 -118.19 gain 140 102 -121.18 gain 102 141 -112.92 gain 141 102 -114.59 gain 102 142 -108.93 gain 142 102 -109.90 gain 102 143 -108.44 gain 143 102 -109.03 gain 102 144 -105.77 gain 144 102 -107.38 gain 102 145 -113.17 gain 145 102 -113.23 gain 102 146 -111.28 gain 146 102 -110.25 gain 102 147 -107.58 gain 147 102 -103.64 gain 102 148 -110.79 gain 148 102 -106.57 gain 102 149 -106.47 gain 149 102 -105.41 gain 102 150 -127.81 gain 150 102 -129.44 gain 102 151 -121.88 gain 151 102 -123.70 gain 102 152 -127.70 gain 152 102 -126.50 gain 102 153 -121.18 gain 153 102 -117.55 gain 102 154 -125.09 gain 154 102 -130.01 gain 102 155 -120.54 gain 155 102 -125.36 gain 102 156 -114.94 gain 156 102 -114.15 gain 102 157 -117.09 gain 157 102 -119.25 gain 102 158 -111.98 gain 158 102 -116.73 gain 102 159 -111.82 gain 159 102 -113.18 gain 102 160 -114.41 gain 160 102 -112.88 gain 102 161 -116.09 gain 161 102 -118.06 gain 102 162 -113.28 gain 162 102 -114.11 gain 102 163 -107.41 gain 163 102 -110.39 gain 102 164 -108.20 gain 164 102 -112.22 gain 102 165 -123.41 gain 165 102 -123.47 gain 102 166 -124.48 gain 166 102 -126.12 gain 102 167 -123.56 gain 167 102 -127.28 gain 102 168 -126.35 gain 168 102 -128.52 gain 102 169 -119.22 gain 169 102 -125.59 gain 102 170 -121.33 gain 170 102 -119.23 gain 102 171 -117.73 gain 171 102 -120.66 gain 102 172 -117.59 gain 172 102 -115.21 gain 102 173 -113.85 gain 173 102 -110.91 gain 102 174 -113.30 gain 174 102 -114.65 gain 102 175 -117.92 gain 175 102 -122.83 gain 102 176 -116.11 gain 176 102 -113.03 gain 102 177 -112.66 gain 177 102 -117.39 gain 102 178 -109.96 gain 178 102 -110.52 gain 102 179 -115.83 gain 179 102 -114.77 gain 102 180 -128.21 gain 180 102 -128.63 gain 102 181 -124.96 gain 181 102 -125.44 gain 102 182 -117.46 gain 182 102 -120.33 gain 102 183 -124.62 gain 183 102 -120.87 gain 102 184 -125.79 gain 184 102 -126.83 gain 102 185 -123.39 gain 185 102 -121.91 gain 102 186 -118.82 gain 186 102 -117.63 gain 102 187 -118.67 gain 187 102 -120.02 gain 102 188 -117.93 gain 188 102 -122.54 gain 102 189 -119.60 gain 189 102 -121.73 gain 102 190 -112.93 gain 190 102 -112.06 gain 102 191 -114.31 gain 191 102 -114.53 gain 102 192 -118.69 gain 192 102 -121.78 gain 102 193 -116.54 gain 193 102 -120.89 gain 102 194 -116.06 gain 194 102 -114.21 gain 102 195 -130.69 gain 195 102 -129.48 gain 102 196 -127.20 gain 196 102 -130.03 gain 102 197 -127.78 gain 197 102 -126.67 gain 102 198 -123.54 gain 198 102 -121.95 gain 102 199 -126.39 gain 199 102 -128.72 gain 102 200 -123.59 gain 200 102 -122.86 gain 102 201 -127.59 gain 201 102 -127.66 gain 102 202 -121.64 gain 202 102 -125.72 gain 102 203 -116.13 gain 203 102 -119.82 gain 102 204 -120.93 gain 204 102 -121.91 gain 102 205 -114.72 gain 205 102 -114.77 gain 102 206 -122.90 gain 206 102 -127.47 gain 102 207 -122.93 gain 207 102 -119.86 gain 102 208 -122.79 gain 208 102 -125.50 gain 102 209 -116.81 gain 209 102 -120.51 gain 102 210 -122.35 gain 210 102 -122.99 gain 102 211 -127.71 gain 211 102 -130.37 gain 102 212 -124.02 gain 212 102 -125.23 gain 102 213 -120.43 gain 213 102 -120.83 gain 102 214 -115.30 gain 214 102 -115.58 gain 102 215 -124.23 gain 215 102 -120.93 gain 102 216 -121.91 gain 216 102 -123.27 gain 102 217 -117.17 gain 217 102 -119.05 gain 102 218 -113.06 gain 218 102 -117.13 gain 102 219 -126.46 gain 219 102 -121.89 gain 102 220 -126.15 gain 220 102 -132.07 gain 102 221 -117.31 gain 221 102 -118.87 gain 102 222 -121.69 gain 222 102 -123.58 gain 102 223 -119.31 gain 223 102 -119.81 gain 102 224 -117.48 gain 224 102 -120.67 gain 103 104 -88.83 gain 104 103 -94.21 gain 103 105 -121.20 gain 105 103 -122.52 gain 103 106 -124.58 gain 106 103 -126.98 gain 103 107 -114.91 gain 107 103 -123.88 gain 103 108 -126.85 gain 108 103 -128.13 gain 103 109 -121.31 gain 109 103 -126.09 gain 103 110 -114.21 gain 110 103 -117.46 gain 103 111 -116.45 gain 111 103 -119.38 gain 103 112 -108.72 gain 112 103 -110.52 gain 103 113 -109.13 gain 113 103 -109.74 gain 103 114 -110.78 gain 114 103 -114.69 gain 103 115 -109.09 gain 115 103 -107.30 gain 103 116 -100.45 gain 116 103 -106.21 gain 103 117 -96.46 gain 117 103 -103.72 gain 103 118 -90.09 gain 118 103 -95.67 gain 103 119 -98.08 gain 119 103 -98.32 gain 103 120 -123.02 gain 120 103 -127.78 gain 103 121 -124.83 gain 121 103 -128.87 gain 103 122 -120.48 gain 122 103 -126.64 gain 103 123 -124.55 gain 123 103 -131.49 gain 103 124 -117.10 gain 124 103 -120.45 gain 103 125 -122.81 gain 125 103 -127.49 gain 103 126 -112.04 gain 126 103 -114.67 gain 103 127 -105.75 gain 127 103 -111.85 gain 103 128 -108.95 gain 128 103 -112.99 gain 103 129 -113.37 gain 129 103 -115.32 gain 103 130 -108.48 gain 130 103 -108.25 gain 103 131 -101.09 gain 131 103 -107.95 gain 103 132 -99.09 gain 132 103 -105.57 gain 103 133 -101.38 gain 133 103 -105.93 gain 103 134 -104.12 gain 134 103 -105.37 gain 103 135 -131.24 gain 135 103 -136.07 gain 103 136 -122.24 gain 136 103 -127.67 gain 103 137 -116.32 gain 137 103 -119.24 gain 103 138 -119.92 gain 138 103 -121.84 gain 103 139 -113.70 gain 139 103 -116.60 gain 103 140 -113.58 gain 140 103 -119.09 gain 103 141 -118.82 gain 141 103 -123.00 gain 103 142 -123.70 gain 142 103 -127.19 gain 103 143 -108.11 gain 143 103 -111.21 gain 103 144 -114.60 gain 144 103 -118.72 gain 103 145 -108.55 gain 145 103 -111.12 gain 103 146 -106.26 gain 146 103 -107.74 gain 103 147 -107.13 gain 147 103 -105.70 gain 103 148 -107.23 gain 148 103 -105.52 gain 103 149 -105.38 gain 149 103 -106.84 gain 103 150 -122.23 gain 150 103 -126.37 gain 103 151 -116.21 gain 151 103 -120.55 gain 103 152 -122.99 gain 152 103 -124.31 gain 103 153 -114.33 gain 153 103 -113.23 gain 103 154 -124.78 gain 154 103 -132.22 gain 103 155 -112.43 gain 155 103 -119.77 gain 103 156 -121.87 gain 156 103 -123.59 gain 103 157 -113.35 gain 157 103 -118.02 gain 103 158 -108.93 gain 158 103 -116.19 gain 103 159 -108.41 gain 159 103 -112.29 gain 103 160 -113.44 gain 160 103 -114.43 gain 103 161 -105.25 gain 161 103 -109.73 gain 103 162 -105.82 gain 162 103 -109.17 gain 103 163 -114.16 gain 163 103 -119.66 gain 103 164 -107.26 gain 164 103 -113.80 gain 103 165 -122.63 gain 165 103 -125.21 gain 103 166 -124.17 gain 166 103 -128.32 gain 103 167 -120.13 gain 167 103 -126.37 gain 103 168 -116.89 gain 168 103 -121.59 gain 103 169 -122.06 gain 169 103 -130.95 gain 103 170 -121.85 gain 170 103 -122.27 gain 103 171 -121.24 gain 171 103 -126.68 gain 103 172 -125.41 gain 172 103 -125.55 gain 103 173 -122.07 gain 173 103 -121.64 gain 103 174 -111.41 gain 174 103 -115.27 gain 103 175 -110.77 gain 175 103 -118.19 gain 103 176 -110.88 gain 176 103 -110.31 gain 103 177 -120.54 gain 177 103 -127.79 gain 103 178 -108.95 gain 178 103 -112.02 gain 103 179 -111.00 gain 179 103 -112.46 gain 103 180 -127.49 gain 180 103 -130.42 gain 103 181 -130.03 gain 181 103 -133.03 gain 103 182 -125.12 gain 182 103 -130.50 gain 103 183 -123.66 gain 183 103 -122.44 gain 103 184 -130.84 gain 184 103 -134.40 gain 103 185 -118.70 gain 185 103 -119.74 gain 103 186 -114.98 gain 186 103 -116.30 gain 103 187 -121.73 gain 187 103 -125.59 gain 103 188 -113.06 gain 188 103 -120.18 gain 103 189 -117.72 gain 189 103 -122.36 gain 103 190 -121.08 gain 190 103 -122.73 gain 103 191 -115.88 gain 191 103 -118.63 gain 103 192 -113.39 gain 192 103 -119.00 gain 103 193 -113.58 gain 193 103 -120.44 gain 103 194 -113.06 gain 194 103 -113.73 gain 103 195 -119.68 gain 195 103 -120.99 gain 103 196 -124.01 gain 196 103 -129.35 gain 103 197 -131.49 gain 197 103 -132.89 gain 103 198 -123.80 gain 198 103 -124.73 gain 103 199 -126.07 gain 199 103 -130.92 gain 103 200 -116.92 gain 200 103 -118.70 gain 103 201 -117.98 gain 201 103 -120.57 gain 103 202 -118.49 gain 202 103 -125.08 gain 103 203 -114.79 gain 203 103 -121.00 gain 103 204 -114.27 gain 204 103 -117.76 gain 103 205 -113.36 gain 205 103 -115.92 gain 103 206 -107.71 gain 206 103 -114.80 gain 103 207 -121.81 gain 207 103 -121.26 gain 103 208 -115.96 gain 208 103 -121.18 gain 103 209 -111.84 gain 209 103 -118.06 gain 103 210 -124.06 gain 210 103 -127.22 gain 103 211 -127.97 gain 211 103 -133.14 gain 103 212 -126.30 gain 212 103 -130.02 gain 103 213 -118.64 gain 213 103 -121.55 gain 103 214 -122.79 gain 214 103 -125.59 gain 103 215 -117.37 gain 215 103 -116.59 gain 103 216 -123.10 gain 216 103 -126.97 gain 103 217 -118.52 gain 217 103 -122.92 gain 103 218 -119.98 gain 218 103 -126.57 gain 103 219 -123.07 gain 219 103 -121.01 gain 103 220 -117.81 gain 220 103 -126.24 gain 103 221 -124.12 gain 221 103 -128.19 gain 103 222 -121.43 gain 222 103 -125.83 gain 103 223 -119.79 gain 223 103 -122.81 gain 103 224 -117.07 gain 224 103 -122.77 gain 104 105 -129.04 gain 105 104 -124.98 gain 104 106 -130.99 gain 106 104 -128.01 gain 104 107 -124.43 gain 107 104 -128.02 gain 104 108 -127.39 gain 108 104 -123.30 gain 104 109 -129.08 gain 109 104 -128.48 gain 104 110 -128.21 gain 110 104 -126.08 gain 104 111 -126.51 gain 111 104 -124.06 gain 104 112 -111.88 gain 112 104 -108.31 gain 104 113 -114.41 gain 113 104 -109.65 gain 104 114 -116.85 gain 114 104 -115.38 gain 104 115 -112.15 gain 115 104 -104.99 gain 104 116 -105.70 gain 116 104 -106.08 gain 104 117 -104.65 gain 117 104 -106.53 gain 104 118 -94.58 gain 118 104 -94.79 gain 104 119 -95.07 gain 119 104 -89.93 gain 104 120 -120.81 gain 120 104 -120.19 gain 104 121 -129.30 gain 121 104 -127.97 gain 104 122 -127.58 gain 122 104 -128.37 gain 104 123 -120.69 gain 123 104 -122.25 gain 104 124 -128.04 gain 124 104 -126.01 gain 104 125 -127.67 gain 125 104 -126.97 gain 104 126 -120.29 gain 126 104 -117.55 gain 104 127 -115.15 gain 127 104 -115.88 gain 104 128 -118.03 gain 128 104 -116.69 gain 104 129 -125.52 gain 129 104 -122.09 gain 104 130 -118.10 gain 130 104 -112.49 gain 104 131 -109.38 gain 131 104 -110.86 gain 104 132 -106.90 gain 132 104 -108.01 gain 104 133 -104.76 gain 133 104 -103.94 gain 104 134 -113.28 gain 134 104 -109.16 gain 104 135 -125.46 gain 135 104 -124.91 gain 104 136 -125.11 gain 136 104 -125.17 gain 104 137 -133.70 gain 137 104 -131.24 gain 104 138 -132.49 gain 138 104 -129.03 gain 104 139 -130.62 gain 139 104 -128.15 gain 104 140 -125.50 gain 140 104 -125.64 gain 104 141 -125.89 gain 141 104 -124.70 gain 104 142 -120.70 gain 142 104 -118.82 gain 104 143 -120.37 gain 143 104 -118.10 gain 104 144 -119.91 gain 144 104 -118.65 gain 104 145 -119.41 gain 145 104 -116.61 gain 104 146 -113.36 gain 146 104 -109.46 gain 104 147 -108.82 gain 147 104 -102.01 gain 104 148 -112.83 gain 148 104 -105.74 gain 104 149 -107.35 gain 149 104 -103.43 gain 104 150 -126.28 gain 150 104 -125.04 gain 104 151 -130.89 gain 151 104 -129.85 gain 104 152 -131.63 gain 152 104 -127.57 gain 104 153 -121.47 gain 153 104 -114.99 gain 104 154 -121.03 gain 154 104 -123.09 gain 104 155 -128.20 gain 155 104 -130.16 gain 104 156 -125.20 gain 156 104 -121.55 gain 104 157 -127.57 gain 157 104 -126.87 gain 104 158 -122.56 gain 158 104 -124.45 gain 104 159 -122.07 gain 159 104 -120.58 gain 104 160 -120.67 gain 160 104 -116.29 gain 104 161 -112.10 gain 161 104 -111.21 gain 104 162 -116.61 gain 162 104 -114.58 gain 104 163 -115.35 gain 163 104 -115.47 gain 104 164 -112.87 gain 164 104 -114.04 gain 104 165 -129.45 gain 165 104 -126.66 gain 104 166 -126.18 gain 166 104 -124.95 gain 104 167 -121.36 gain 167 104 -122.22 gain 104 168 -125.50 gain 168 104 -124.81 gain 104 169 -126.81 gain 169 104 -130.32 gain 104 170 -124.11 gain 170 104 -119.15 gain 104 171 -132.15 gain 171 104 -132.21 gain 104 172 -122.02 gain 172 104 -116.78 gain 104 173 -125.25 gain 173 104 -119.44 gain 104 174 -120.66 gain 174 104 -119.15 gain 104 175 -122.78 gain 175 104 -124.83 gain 104 176 -114.31 gain 176 104 -108.37 gain 104 177 -111.42 gain 177 104 -113.29 gain 104 178 -117.21 gain 178 104 -114.90 gain 104 179 -122.20 gain 179 104 -118.28 gain 104 180 -133.40 gain 180 104 -130.95 gain 104 181 -126.60 gain 181 104 -124.23 gain 104 182 -130.80 gain 182 104 -130.81 gain 104 183 -132.26 gain 183 104 -125.66 gain 104 184 -118.48 gain 184 104 -116.66 gain 104 185 -133.26 gain 185 104 -128.93 gain 104 186 -129.62 gain 186 104 -125.57 gain 104 187 -128.43 gain 187 104 -126.92 gain 104 188 -119.70 gain 188 104 -121.45 gain 104 189 -123.29 gain 189 104 -122.56 gain 104 190 -124.61 gain 190 104 -120.88 gain 104 191 -123.70 gain 191 104 -121.07 gain 104 192 -114.28 gain 192 104 -114.52 gain 104 193 -119.23 gain 193 104 -120.72 gain 104 194 -118.98 gain 194 104 -114.27 gain 104 195 -135.88 gain 195 104 -131.81 gain 104 196 -134.86 gain 196 104 -134.83 gain 104 197 -136.20 gain 197 104 -132.23 gain 104 198 -124.42 gain 198 104 -119.97 gain 104 199 -129.61 gain 199 104 -129.08 gain 104 200 -126.98 gain 200 104 -123.39 gain 104 201 -129.64 gain 201 104 -126.86 gain 104 202 -125.10 gain 202 104 -126.32 gain 104 203 -125.79 gain 203 104 -126.63 gain 104 204 -123.77 gain 204 104 -121.89 gain 104 205 -124.31 gain 205 104 -121.50 gain 104 206 -117.23 gain 206 104 -118.94 gain 104 207 -123.28 gain 207 104 -117.35 gain 104 208 -119.08 gain 208 104 -118.93 gain 104 209 -127.39 gain 209 104 -128.23 gain 104 210 -135.88 gain 210 104 -133.66 gain 104 211 -132.97 gain 211 104 -132.78 gain 104 212 -128.70 gain 212 104 -127.05 gain 104 213 -131.31 gain 213 104 -128.85 gain 104 214 -127.68 gain 214 104 -125.10 gain 104 215 -125.01 gain 215 104 -118.85 gain 104 216 -130.30 gain 216 104 -128.80 gain 104 217 -117.99 gain 217 104 -117.01 gain 104 218 -120.15 gain 218 104 -121.36 gain 104 219 -128.40 gain 219 104 -120.97 gain 104 220 -126.41 gain 220 104 -129.47 gain 104 221 -128.28 gain 221 104 -126.98 gain 104 222 -122.31 gain 222 104 -121.34 gain 104 223 -122.15 gain 223 104 -119.79 gain 104 224 -121.23 gain 224 104 -121.56 gain 105 106 -87.06 gain 106 105 -88.14 gain 105 107 -100.75 gain 107 105 -108.40 gain 105 108 -109.10 gain 108 105 -109.07 gain 105 109 -107.09 gain 109 105 -110.55 gain 105 110 -109.96 gain 110 105 -111.89 gain 105 111 -110.49 gain 111 105 -112.10 gain 105 112 -118.90 gain 112 105 -119.39 gain 105 113 -119.38 gain 113 105 -118.67 gain 105 114 -122.44 gain 114 105 -125.04 gain 105 115 -122.50 gain 115 105 -119.39 gain 105 116 -123.16 gain 116 105 -127.60 gain 105 117 -122.05 gain 117 105 -127.99 gain 105 118 -131.86 gain 118 105 -136.12 gain 105 119 -132.56 gain 119 105 -131.48 gain 105 120 -99.70 gain 120 105 -103.14 gain 105 121 -93.98 gain 121 105 -96.71 gain 105 122 -107.41 gain 122 105 -112.25 gain 105 123 -102.46 gain 123 105 -108.08 gain 105 124 -109.08 gain 124 105 -111.11 gain 105 125 -110.47 gain 125 105 -113.83 gain 105 126 -121.08 gain 126 105 -122.40 gain 105 127 -115.41 gain 127 105 -120.19 gain 105 128 -123.36 gain 128 105 -126.07 gain 105 129 -115.98 gain 129 105 -116.61 gain 105 130 -120.68 gain 130 105 -119.13 gain 105 131 -124.55 gain 131 105 -130.09 gain 105 132 -125.49 gain 132 105 -130.66 gain 105 133 -122.08 gain 133 105 -125.32 gain 105 134 -122.74 gain 134 105 -122.67 gain 105 135 -104.95 gain 135 105 -108.45 gain 105 136 -98.98 gain 136 105 -103.10 gain 105 137 -110.25 gain 137 105 -111.85 gain 105 138 -110.39 gain 138 105 -110.99 gain 105 139 -117.27 gain 139 105 -118.85 gain 105 140 -112.05 gain 140 105 -116.25 gain 105 141 -113.03 gain 141 105 -115.89 gain 105 142 -118.09 gain 142 105 -120.26 gain 105 143 -122.01 gain 143 105 -123.80 gain 105 144 -119.30 gain 144 105 -122.11 gain 105 145 -123.57 gain 145 105 -124.82 gain 105 146 -123.61 gain 146 105 -123.77 gain 105 147 -115.45 gain 147 105 -112.71 gain 105 148 -122.65 gain 148 105 -119.62 gain 105 149 -124.05 gain 149 105 -124.19 gain 105 150 -105.02 gain 150 105 -107.85 gain 105 151 -103.49 gain 151 105 -106.51 gain 105 152 -109.52 gain 152 105 -109.52 gain 105 153 -115.95 gain 153 105 -113.52 gain 105 154 -112.71 gain 154 105 -118.84 gain 105 155 -114.60 gain 155 105 -120.62 gain 105 156 -114.83 gain 156 105 -115.23 gain 105 157 -118.11 gain 157 105 -121.46 gain 105 158 -117.59 gain 158 105 -123.53 gain 105 159 -118.89 gain 159 105 -121.45 gain 105 160 -117.14 gain 160 105 -116.82 gain 105 161 -129.70 gain 161 105 -132.87 gain 105 162 -123.73 gain 162 105 -125.76 gain 105 163 -131.32 gain 163 105 -135.49 gain 105 164 -128.87 gain 164 105 -134.09 gain 105 165 -105.55 gain 165 105 -106.81 gain 105 166 -113.77 gain 166 105 -116.60 gain 105 167 -104.40 gain 167 105 -109.32 gain 105 168 -111.02 gain 168 105 -114.39 gain 105 169 -114.29 gain 169 105 -121.86 gain 105 170 -114.94 gain 170 105 -114.04 gain 105 171 -116.80 gain 171 105 -120.92 gain 105 172 -118.56 gain 172 105 -117.37 gain 105 173 -119.93 gain 173 105 -118.19 gain 105 174 -118.02 gain 174 105 -120.57 gain 105 175 -113.49 gain 175 105 -119.59 gain 105 176 -119.35 gain 176 105 -117.47 gain 105 177 -132.53 gain 177 105 -138.45 gain 105 178 -125.76 gain 178 105 -127.51 gain 105 179 -129.20 gain 179 105 -129.34 gain 105 180 -116.41 gain 180 105 -118.02 gain 105 181 -112.49 gain 181 105 -114.16 gain 105 182 -109.77 gain 182 105 -113.84 gain 105 183 -115.59 gain 183 105 -113.05 gain 105 184 -116.15 gain 184 105 -118.39 gain 105 185 -108.03 gain 185 105 -107.75 gain 105 186 -118.22 gain 186 105 -118.22 gain 105 187 -116.82 gain 187 105 -119.37 gain 105 188 -120.74 gain 188 105 -126.55 gain 105 189 -123.88 gain 189 105 -127.21 gain 105 190 -130.32 gain 190 105 -130.65 gain 105 191 -120.30 gain 191 105 -121.72 gain 105 192 -131.32 gain 192 105 -135.61 gain 105 193 -129.81 gain 193 105 -135.35 gain 105 194 -127.86 gain 194 105 -127.21 gain 105 195 -112.71 gain 195 105 -112.69 gain 105 196 -114.74 gain 196 105 -118.76 gain 105 197 -111.47 gain 197 105 -111.56 gain 105 198 -120.28 gain 198 105 -119.89 gain 105 199 -118.37 gain 199 105 -121.89 gain 105 200 -119.28 gain 200 105 -119.75 gain 105 201 -120.27 gain 201 105 -121.54 gain 105 202 -116.27 gain 202 105 -121.54 gain 105 203 -119.56 gain 203 105 -124.45 gain 105 204 -124.98 gain 204 105 -127.15 gain 105 205 -123.49 gain 205 105 -124.74 gain 105 206 -126.21 gain 206 105 -131.98 gain 105 207 -125.85 gain 207 105 -123.98 gain 105 208 -120.13 gain 208 105 -124.04 gain 105 209 -122.95 gain 209 105 -127.85 gain 105 210 -113.04 gain 210 105 -114.87 gain 105 211 -119.35 gain 211 105 -123.21 gain 105 212 -114.33 gain 212 105 -116.73 gain 105 213 -117.82 gain 213 105 -119.41 gain 105 214 -116.44 gain 214 105 -117.92 gain 105 215 -118.87 gain 215 105 -116.76 gain 105 216 -115.95 gain 216 105 -118.50 gain 105 217 -127.63 gain 217 105 -130.71 gain 105 218 -124.53 gain 218 105 -129.79 gain 105 219 -123.71 gain 219 105 -120.34 gain 105 220 -118.68 gain 220 105 -125.80 gain 105 221 -120.90 gain 221 105 -123.66 gain 105 222 -122.56 gain 222 105 -125.65 gain 105 223 -127.32 gain 223 105 -129.02 gain 105 224 -130.59 gain 224 105 -134.98 gain 106 107 -93.91 gain 107 106 -100.48 gain 106 108 -102.56 gain 108 106 -101.44 gain 106 109 -110.50 gain 109 106 -112.88 gain 106 110 -111.94 gain 110 106 -112.78 gain 106 111 -121.15 gain 111 106 -121.67 gain 106 112 -117.76 gain 112 106 -117.16 gain 106 113 -124.69 gain 113 106 -122.90 gain 106 114 -126.17 gain 114 106 -127.68 gain 106 115 -117.37 gain 115 106 -113.19 gain 106 116 -122.59 gain 116 106 -125.95 gain 106 117 -129.51 gain 117 106 -134.37 gain 106 118 -117.46 gain 118 106 -120.64 gain 106 119 -125.92 gain 119 106 -123.75 gain 106 120 -102.77 gain 120 106 -105.13 gain 106 121 -94.61 gain 121 106 -96.25 gain 106 122 -102.73 gain 122 106 -106.49 gain 106 123 -98.49 gain 123 106 -103.03 gain 106 124 -106.56 gain 124 106 -107.50 gain 106 125 -109.46 gain 125 106 -111.74 gain 106 126 -115.59 gain 126 106 -115.83 gain 106 127 -115.42 gain 127 106 -119.12 gain 106 128 -119.86 gain 128 106 -121.50 gain 106 129 -119.13 gain 129 106 -118.67 gain 106 130 -123.65 gain 130 106 -121.02 gain 106 131 -125.11 gain 131 106 -129.56 gain 106 132 -124.93 gain 132 106 -129.01 gain 106 133 -133.26 gain 133 106 -135.41 gain 106 134 -123.61 gain 134 106 -122.47 gain 106 135 -108.17 gain 135 106 -110.59 gain 106 136 -103.22 gain 136 106 -106.25 gain 106 137 -106.64 gain 137 106 -107.16 gain 106 138 -112.51 gain 138 106 -112.03 gain 106 139 -106.43 gain 139 106 -106.93 gain 106 140 -116.02 gain 140 106 -119.13 gain 106 141 -113.56 gain 141 106 -115.34 gain 106 142 -114.26 gain 142 106 -115.35 gain 106 143 -121.88 gain 143 106 -122.59 gain 106 144 -126.37 gain 144 106 -128.09 gain 106 145 -131.93 gain 145 106 -132.10 gain 106 146 -127.00 gain 146 106 -126.08 gain 106 147 -121.24 gain 147 106 -117.41 gain 106 148 -121.10 gain 148 106 -116.99 gain 106 149 -129.00 gain 149 106 -128.06 gain 106 150 -112.30 gain 150 106 -114.04 gain 106 151 -110.06 gain 151 106 -111.99 gain 106 152 -107.04 gain 152 106 -105.95 gain 106 153 -114.77 gain 153 106 -111.27 gain 106 154 -116.86 gain 154 106 -121.90 gain 106 155 -113.79 gain 155 106 -118.73 gain 106 156 -115.33 gain 156 106 -114.66 gain 106 157 -116.50 gain 157 106 -118.77 gain 106 158 -115.12 gain 158 106 -119.98 gain 106 159 -121.68 gain 159 106 -123.17 gain 106 160 -123.70 gain 160 106 -122.29 gain 106 161 -123.17 gain 161 106 -125.25 gain 106 162 -120.39 gain 162 106 -121.34 gain 106 163 -129.90 gain 163 106 -133.00 gain 106 164 -123.10 gain 164 106 -127.23 gain 106 165 -108.53 gain 165 106 -108.71 gain 106 166 -108.56 gain 166 106 -110.31 gain 106 167 -102.16 gain 167 106 -105.99 gain 106 168 -104.22 gain 168 106 -106.51 gain 106 169 -118.16 gain 169 106 -124.65 gain 106 170 -108.94 gain 170 106 -106.96 gain 106 171 -115.89 gain 171 106 -118.93 gain 106 172 -112.19 gain 172 106 -109.93 gain 106 173 -119.38 gain 173 106 -116.55 gain 106 174 -120.71 gain 174 106 -122.18 gain 106 175 -128.23 gain 175 106 -133.25 gain 106 176 -120.25 gain 176 106 -117.28 gain 106 177 -122.28 gain 177 106 -127.13 gain 106 178 -122.64 gain 178 106 -123.30 gain 106 179 -129.73 gain 179 106 -128.79 gain 106 180 -111.04 gain 180 106 -111.57 gain 106 181 -115.20 gain 181 106 -115.80 gain 106 182 -111.33 gain 182 106 -114.31 gain 106 183 -118.98 gain 183 106 -115.35 gain 106 184 -109.27 gain 184 106 -110.42 gain 106 185 -115.10 gain 185 106 -113.74 gain 106 186 -114.12 gain 186 106 -113.05 gain 106 187 -130.06 gain 187 106 -131.53 gain 106 188 -116.44 gain 188 106 -121.16 gain 106 189 -121.62 gain 189 106 -123.86 gain 106 190 -122.66 gain 190 106 -121.91 gain 106 191 -125.37 gain 191 106 -125.71 gain 106 192 -118.45 gain 192 106 -121.66 gain 106 193 -127.54 gain 193 106 -132.00 gain 106 194 -124.65 gain 194 106 -122.92 gain 106 195 -111.75 gain 195 106 -110.66 gain 106 196 -116.82 gain 196 106 -119.77 gain 106 197 -116.90 gain 197 106 -115.91 gain 106 198 -124.15 gain 198 106 -122.68 gain 106 199 -118.04 gain 199 106 -120.48 gain 106 200 -113.73 gain 200 106 -113.11 gain 106 201 -112.74 gain 201 106 -112.93 gain 106 202 -119.18 gain 202 106 -123.37 gain 106 203 -117.51 gain 203 106 -121.32 gain 106 204 -127.67 gain 204 106 -128.77 gain 106 205 -117.93 gain 205 106 -118.10 gain 106 206 -123.44 gain 206 106 -128.13 gain 106 207 -123.64 gain 207 106 -120.69 gain 106 208 -136.10 gain 208 106 -138.93 gain 106 209 -130.88 gain 209 106 -134.70 gain 106 210 -115.80 gain 210 106 -116.56 gain 106 211 -117.90 gain 211 106 -120.67 gain 106 212 -118.51 gain 212 106 -119.83 gain 106 213 -112.07 gain 213 106 -112.58 gain 106 214 -123.02 gain 214 106 -123.42 gain 106 215 -124.63 gain 215 106 -121.44 gain 106 216 -131.35 gain 216 106 -132.82 gain 106 217 -126.60 gain 217 106 -128.59 gain 106 218 -122.77 gain 218 106 -126.96 gain 106 219 -125.53 gain 219 106 -121.07 gain 106 220 -117.37 gain 220 106 -123.40 gain 106 221 -124.22 gain 221 106 -125.89 gain 106 222 -131.32 gain 222 106 -133.32 gain 106 223 -126.48 gain 223 106 -127.10 gain 106 224 -126.06 gain 224 106 -129.37 gain 107 108 -101.89 gain 108 107 -94.21 gain 107 109 -100.63 gain 109 107 -96.44 gain 107 110 -113.14 gain 110 107 -107.42 gain 107 111 -116.65 gain 111 107 -110.60 gain 107 112 -117.63 gain 112 107 -110.46 gain 107 113 -131.11 gain 113 107 -122.75 gain 107 114 -125.61 gain 114 107 -120.56 gain 107 115 -132.43 gain 115 107 -121.68 gain 107 116 -128.31 gain 116 107 -125.10 gain 107 117 -129.03 gain 117 107 -127.32 gain 107 118 -127.08 gain 118 107 -123.69 gain 107 119 -124.22 gain 119 107 -115.49 gain 107 120 -111.38 gain 120 107 -107.17 gain 107 121 -103.23 gain 121 107 -98.31 gain 107 122 -98.91 gain 122 107 -96.10 gain 107 123 -99.91 gain 123 107 -97.88 gain 107 124 -97.95 gain 124 107 -92.33 gain 107 125 -108.48 gain 125 107 -104.19 gain 107 126 -112.27 gain 126 107 -105.94 gain 107 127 -117.67 gain 127 107 -114.80 gain 107 128 -127.68 gain 128 107 -122.75 gain 107 129 -128.60 gain 129 107 -121.58 gain 107 130 -137.59 gain 130 107 -128.40 gain 107 131 -131.72 gain 131 107 -129.61 gain 107 132 -132.53 gain 132 107 -130.04 gain 107 133 -126.57 gain 133 107 -122.15 gain 107 134 -133.38 gain 134 107 -125.67 gain 107 135 -112.57 gain 135 107 -108.42 gain 107 136 -115.23 gain 136 107 -111.69 gain 107 137 -109.13 gain 137 107 -103.08 gain 107 138 -114.48 gain 138 107 -107.43 gain 107 139 -114.28 gain 139 107 -108.21 gain 107 140 -119.95 gain 140 107 -116.49 gain 107 141 -113.36 gain 141 107 -108.57 gain 107 142 -117.66 gain 142 107 -112.18 gain 107 143 -119.03 gain 143 107 -113.17 gain 107 144 -121.60 gain 144 107 -116.76 gain 107 145 -129.21 gain 145 107 -122.82 gain 107 146 -126.21 gain 146 107 -118.72 gain 107 147 -130.55 gain 147 107 -120.15 gain 107 148 -132.40 gain 148 107 -121.73 gain 107 149 -133.72 gain 149 107 -126.20 gain 107 150 -120.85 gain 150 107 -116.03 gain 107 151 -120.77 gain 151 107 -116.14 gain 107 152 -109.46 gain 152 107 -101.81 gain 107 153 -111.30 gain 153 107 -101.22 gain 107 154 -121.20 gain 154 107 -119.67 gain 107 155 -116.30 gain 155 107 -114.67 gain 107 156 -122.08 gain 156 107 -114.84 gain 107 157 -127.45 gain 157 107 -123.15 gain 107 158 -127.42 gain 158 107 -125.71 gain 107 159 -127.35 gain 159 107 -122.26 gain 107 160 -124.09 gain 160 107 -116.11 gain 107 161 -127.49 gain 161 107 -123.01 gain 107 162 -129.14 gain 162 107 -123.52 gain 107 163 -132.90 gain 163 107 -129.43 gain 107 164 -132.11 gain 164 107 -129.68 gain 107 165 -123.99 gain 165 107 -117.60 gain 107 166 -116.46 gain 166 107 -111.64 gain 107 167 -113.51 gain 167 107 -110.78 gain 107 168 -109.33 gain 168 107 -105.05 gain 107 169 -123.16 gain 169 107 -123.08 gain 107 170 -123.82 gain 170 107 -115.26 gain 107 171 -124.64 gain 171 107 -121.11 gain 107 172 -117.73 gain 172 107 -108.90 gain 107 173 -119.85 gain 173 107 -110.45 gain 107 174 -126.29 gain 174 107 -121.19 gain 107 175 -127.55 gain 175 107 -126.00 gain 107 176 -130.49 gain 176 107 -120.96 gain 107 177 -128.37 gain 177 107 -126.64 gain 107 178 -129.61 gain 178 107 -123.71 gain 107 179 -126.07 gain 179 107 -118.56 gain 107 180 -122.55 gain 180 107 -116.51 gain 107 181 -115.53 gain 181 107 -109.55 gain 107 182 -116.40 gain 182 107 -112.82 gain 107 183 -126.40 gain 183 107 -116.21 gain 107 184 -120.24 gain 184 107 -114.83 gain 107 185 -118.66 gain 185 107 -110.73 gain 107 186 -121.91 gain 186 107 -114.26 gain 107 187 -123.48 gain 187 107 -118.38 gain 107 188 -126.17 gain 188 107 -124.33 gain 107 189 -122.15 gain 189 107 -117.82 gain 107 190 -122.39 gain 190 107 -115.07 gain 107 191 -134.55 gain 191 107 -128.32 gain 107 192 -130.91 gain 192 107 -127.55 gain 107 193 -131.33 gain 193 107 -129.22 gain 107 194 -126.23 gain 194 107 -117.94 gain 107 195 -128.04 gain 195 107 -120.38 gain 107 196 -123.50 gain 196 107 -119.88 gain 107 197 -123.04 gain 197 107 -115.47 gain 107 198 -124.16 gain 198 107 -116.12 gain 107 199 -128.89 gain 199 107 -124.77 gain 107 200 -126.99 gain 200 107 -119.81 gain 107 201 -125.70 gain 201 107 -119.32 gain 107 202 -123.43 gain 202 107 -121.05 gain 107 203 -130.52 gain 203 107 -127.76 gain 107 204 -128.20 gain 204 107 -122.73 gain 107 205 -132.76 gain 205 107 -126.36 gain 107 206 -134.36 gain 206 107 -132.48 gain 107 207 -127.28 gain 207 107 -117.76 gain 107 208 -129.49 gain 208 107 -125.75 gain 107 209 -126.60 gain 209 107 -123.85 gain 107 210 -126.34 gain 210 107 -120.53 gain 107 211 -128.00 gain 211 107 -124.21 gain 107 212 -120.42 gain 212 107 -115.17 gain 107 213 -121.97 gain 213 107 -115.91 gain 107 214 -127.12 gain 214 107 -120.95 gain 107 215 -119.19 gain 215 107 -109.44 gain 107 216 -129.45 gain 216 107 -124.36 gain 107 217 -122.46 gain 217 107 -117.89 gain 107 218 -135.75 gain 218 107 -133.36 gain 107 219 -128.03 gain 219 107 -117.00 gain 107 220 -129.29 gain 220 107 -128.76 gain 107 221 -127.19 gain 221 107 -122.30 gain 107 222 -132.37 gain 222 107 -127.80 gain 107 223 -134.46 gain 223 107 -128.51 gain 107 224 -130.08 gain 224 107 -126.82 gain 108 109 -93.59 gain 109 108 -97.08 gain 108 110 -101.28 gain 110 108 -103.23 gain 108 111 -102.99 gain 111 108 -104.63 gain 108 112 -113.93 gain 112 108 -114.45 gain 108 113 -114.41 gain 113 108 -113.74 gain 108 114 -120.18 gain 114 108 -122.81 gain 108 115 -118.18 gain 115 108 -115.11 gain 108 116 -124.17 gain 116 108 -128.64 gain 108 117 -123.60 gain 117 108 -129.57 gain 108 118 -120.26 gain 118 108 -124.56 gain 108 119 -121.18 gain 119 108 -120.13 gain 108 120 -109.20 gain 120 108 -112.67 gain 108 121 -101.35 gain 121 108 -104.11 gain 108 122 -99.43 gain 122 108 -104.30 gain 108 123 -97.00 gain 123 108 -102.65 gain 108 124 -86.57 gain 124 108 -88.63 gain 108 125 -99.43 gain 125 108 -102.83 gain 108 126 -99.17 gain 126 108 -100.52 gain 108 127 -104.45 gain 127 108 -109.26 gain 108 128 -113.69 gain 128 108 -116.44 gain 108 129 -113.69 gain 129 108 -114.35 gain 108 130 -122.29 gain 130 108 -120.77 gain 108 131 -124.05 gain 131 108 -129.62 gain 108 132 -125.28 gain 132 108 -130.47 gain 108 133 -121.55 gain 133 108 -124.82 gain 108 134 -119.21 gain 134 108 -119.17 gain 108 135 -108.77 gain 135 108 -112.30 gain 108 136 -108.84 gain 136 108 -112.99 gain 108 137 -103.00 gain 137 108 -104.63 gain 108 138 -102.34 gain 138 108 -102.97 gain 108 139 -103.36 gain 139 108 -104.97 gain 108 140 -107.11 gain 140 108 -111.33 gain 108 141 -111.29 gain 141 108 -114.19 gain 108 142 -115.40 gain 142 108 -117.60 gain 108 143 -118.08 gain 143 108 -119.90 gain 108 144 -116.14 gain 144 108 -118.97 gain 108 145 -114.31 gain 145 108 -115.59 gain 108 146 -110.93 gain 146 108 -111.13 gain 108 147 -110.67 gain 147 108 -107.95 gain 108 148 -123.34 gain 148 108 -120.35 gain 108 149 -123.78 gain 149 108 -123.95 gain 108 150 -107.47 gain 150 108 -110.32 gain 108 151 -104.63 gain 151 108 -107.68 gain 108 152 -110.59 gain 152 108 -110.62 gain 108 153 -107.55 gain 153 108 -105.15 gain 108 154 -106.93 gain 154 108 -113.08 gain 108 155 -104.01 gain 155 108 -110.06 gain 108 156 -101.92 gain 156 108 -102.36 gain 108 157 -114.44 gain 157 108 -117.82 gain 108 158 -109.68 gain 158 108 -115.65 gain 108 159 -116.68 gain 159 108 -119.28 gain 108 160 -113.71 gain 160 108 -113.42 gain 108 161 -118.58 gain 161 108 -121.78 gain 108 162 -118.68 gain 162 108 -120.74 gain 108 163 -113.60 gain 163 108 -117.81 gain 108 164 -128.78 gain 164 108 -134.03 gain 108 165 -105.62 gain 165 108 -106.91 gain 108 166 -109.13 gain 166 108 -111.99 gain 108 167 -109.03 gain 167 108 -113.99 gain 108 168 -109.27 gain 168 108 -112.67 gain 108 169 -108.32 gain 169 108 -115.93 gain 108 170 -109.90 gain 170 108 -109.02 gain 108 171 -106.31 gain 171 108 -110.46 gain 108 172 -112.80 gain 172 108 -111.65 gain 108 173 -110.53 gain 173 108 -108.81 gain 108 174 -113.21 gain 174 108 -115.79 gain 108 175 -119.74 gain 175 108 -125.88 gain 108 176 -121.68 gain 176 108 -119.82 gain 108 177 -128.36 gain 177 108 -134.32 gain 108 178 -120.98 gain 178 108 -122.76 gain 108 179 -126.00 gain 179 108 -126.18 gain 108 180 -115.32 gain 180 108 -116.96 gain 108 181 -109.50 gain 181 108 -111.21 gain 108 182 -104.54 gain 182 108 -108.63 gain 108 183 -115.03 gain 183 108 -112.52 gain 108 184 -107.62 gain 184 108 -109.89 gain 108 185 -110.83 gain 185 108 -110.59 gain 108 186 -113.32 gain 186 108 -113.36 gain 108 187 -110.41 gain 187 108 -112.99 gain 108 188 -115.72 gain 188 108 -121.56 gain 108 189 -121.38 gain 189 108 -124.74 gain 108 190 -118.80 gain 190 108 -119.17 gain 108 191 -113.44 gain 191 108 -114.89 gain 108 192 -114.17 gain 192 108 -118.49 gain 108 193 -123.32 gain 193 108 -128.89 gain 108 194 -121.28 gain 194 108 -120.66 gain 108 195 -118.39 gain 195 108 -118.41 gain 108 196 -120.80 gain 196 108 -124.85 gain 108 197 -117.39 gain 197 108 -117.51 gain 108 198 -117.54 gain 198 108 -117.19 gain 108 199 -117.79 gain 199 108 -121.35 gain 108 200 -111.38 gain 200 108 -111.87 gain 108 201 -108.43 gain 201 108 -109.73 gain 108 202 -122.77 gain 202 108 -128.07 gain 108 203 -112.36 gain 203 108 -117.29 gain 108 204 -114.74 gain 204 108 -116.95 gain 108 205 -117.01 gain 205 108 -118.29 gain 108 206 -121.83 gain 206 108 -127.63 gain 108 207 -124.40 gain 207 108 -122.56 gain 108 208 -121.77 gain 208 108 -125.71 gain 108 209 -120.59 gain 209 108 -125.52 gain 108 210 -115.95 gain 210 108 -117.82 gain 108 211 -115.52 gain 211 108 -119.41 gain 108 212 -120.35 gain 212 108 -122.79 gain 108 213 -115.42 gain 213 108 -117.05 gain 108 214 -118.98 gain 214 108 -120.49 gain 108 215 -111.13 gain 215 108 -109.06 gain 108 216 -114.67 gain 216 108 -117.26 gain 108 217 -114.91 gain 217 108 -118.01 gain 108 218 -118.92 gain 218 108 -124.22 gain 108 219 -118.71 gain 219 108 -115.37 gain 108 220 -127.27 gain 220 108 -134.42 gain 108 221 -124.55 gain 221 108 -127.34 gain 108 222 -122.21 gain 222 108 -125.32 gain 108 223 -126.23 gain 223 108 -127.96 gain 108 224 -132.98 gain 224 108 -137.40 gain 109 110 -90.50 gain 110 109 -88.97 gain 109 111 -104.21 gain 111 109 -102.36 gain 109 112 -115.38 gain 112 109 -112.40 gain 109 113 -109.67 gain 113 109 -105.51 gain 109 114 -112.22 gain 114 109 -111.36 gain 109 115 -112.80 gain 115 109 -106.24 gain 109 116 -120.20 gain 116 109 -121.19 gain 109 117 -115.61 gain 117 109 -118.09 gain 109 118 -127.85 gain 118 109 -128.66 gain 109 119 -129.62 gain 119 109 -125.08 gain 109 120 -105.80 gain 120 109 -105.78 gain 109 121 -102.64 gain 121 109 -101.90 gain 109 122 -106.67 gain 122 109 -108.05 gain 109 123 -96.81 gain 123 109 -98.97 gain 109 124 -95.99 gain 124 109 -94.56 gain 109 125 -103.89 gain 125 109 -103.79 gain 109 126 -105.61 gain 126 109 -103.47 gain 109 127 -110.19 gain 127 109 -111.52 gain 109 128 -117.91 gain 128 109 -117.18 gain 109 129 -116.92 gain 129 109 -114.09 gain 109 130 -123.47 gain 130 109 -118.46 gain 109 131 -120.99 gain 131 109 -123.07 gain 109 132 -127.66 gain 132 109 -129.37 gain 109 133 -121.66 gain 133 109 -121.44 gain 109 134 -127.99 gain 134 109 -124.47 gain 109 135 -115.62 gain 135 109 -115.66 gain 109 136 -112.73 gain 136 109 -113.39 gain 109 137 -107.86 gain 137 109 -106.00 gain 109 138 -107.55 gain 138 109 -104.69 gain 109 139 -103.95 gain 139 109 -102.08 gain 109 140 -107.67 gain 140 109 -108.40 gain 109 141 -107.26 gain 141 109 -106.67 gain 109 142 -113.34 gain 142 109 -112.05 gain 109 143 -110.11 gain 143 109 -108.44 gain 109 144 -115.99 gain 144 109 -115.34 gain 109 145 -121.58 gain 145 109 -119.37 gain 109 146 -119.84 gain 146 109 -116.54 gain 109 147 -122.84 gain 147 109 -116.63 gain 109 148 -127.27 gain 148 109 -120.79 gain 109 149 -125.97 gain 149 109 -122.65 gain 109 150 -114.53 gain 150 109 -113.89 gain 109 151 -109.27 gain 151 109 -108.83 gain 109 152 -107.57 gain 152 109 -104.11 gain 109 153 -107.42 gain 153 109 -101.53 gain 109 154 -104.53 gain 154 109 -107.19 gain 109 155 -115.35 gain 155 109 -117.92 gain 109 156 -112.31 gain 156 109 -109.25 gain 109 157 -108.95 gain 157 109 -108.85 gain 109 158 -109.65 gain 158 109 -112.14 gain 109 159 -120.57 gain 159 109 -119.68 gain 109 160 -110.85 gain 160 109 -107.07 gain 109 161 -116.46 gain 161 109 -116.17 gain 109 162 -128.52 gain 162 109 -127.09 gain 109 163 -124.66 gain 163 109 -125.38 gain 109 164 -125.57 gain 164 109 -127.33 gain 109 165 -118.43 gain 165 109 -116.24 gain 109 166 -115.34 gain 166 109 -114.71 gain 109 167 -108.12 gain 167 109 -109.59 gain 109 168 -108.83 gain 168 109 -108.74 gain 109 169 -108.44 gain 169 109 -112.55 gain 109 170 -109.71 gain 170 109 -105.35 gain 109 171 -120.10 gain 171 109 -120.76 gain 109 172 -108.89 gain 172 109 -104.25 gain 109 173 -116.30 gain 173 109 -111.09 gain 109 174 -116.59 gain 174 109 -115.68 gain 109 175 -127.52 gain 175 109 -130.17 gain 109 176 -125.29 gain 176 109 -119.95 gain 109 177 -117.97 gain 177 109 -120.44 gain 109 178 -123.50 gain 178 109 -121.79 gain 109 179 -122.54 gain 179 109 -119.23 gain 109 180 -122.09 gain 180 109 -120.24 gain 109 181 -122.83 gain 181 109 -121.05 gain 109 182 -118.72 gain 182 109 -119.33 gain 109 183 -117.39 gain 183 109 -111.38 gain 109 184 -121.18 gain 184 109 -119.96 gain 109 185 -115.34 gain 185 109 -111.61 gain 109 186 -120.80 gain 186 109 -117.35 gain 109 187 -124.59 gain 187 109 -123.68 gain 109 188 -119.96 gain 188 109 -122.31 gain 109 189 -117.64 gain 189 109 -117.51 gain 109 190 -115.45 gain 190 109 -112.32 gain 109 191 -128.11 gain 191 109 -126.07 gain 109 192 -128.50 gain 192 109 -129.34 gain 109 193 -123.12 gain 193 109 -125.20 gain 109 194 -126.74 gain 194 109 -122.64 gain 109 195 -114.46 gain 195 109 -110.99 gain 109 196 -117.60 gain 196 109 -118.17 gain 109 197 -125.75 gain 197 109 -122.38 gain 109 198 -124.17 gain 198 109 -120.32 gain 109 199 -118.21 gain 199 109 -118.28 gain 109 200 -118.34 gain 200 109 -115.34 gain 109 201 -126.05 gain 201 109 -123.86 gain 109 202 -115.91 gain 202 109 -117.72 gain 109 203 -114.40 gain 203 109 -115.84 gain 109 204 -120.96 gain 204 109 -119.68 gain 109 205 -124.93 gain 205 109 -122.72 gain 109 206 -116.68 gain 206 109 -118.99 gain 109 207 -129.72 gain 207 109 -124.40 gain 109 208 -120.73 gain 208 109 -121.18 gain 109 209 -123.44 gain 209 109 -124.88 gain 109 210 -120.74 gain 210 109 -119.12 gain 109 211 -112.95 gain 211 109 -113.36 gain 109 212 -122.84 gain 212 109 -121.78 gain 109 213 -113.30 gain 213 109 -111.43 gain 109 214 -117.57 gain 214 109 -115.60 gain 109 215 -127.13 gain 215 109 -121.57 gain 109 216 -124.89 gain 216 109 -123.99 gain 109 217 -120.35 gain 217 109 -119.97 gain 109 218 -123.01 gain 218 109 -124.82 gain 109 219 -128.28 gain 219 109 -121.45 gain 109 220 -120.64 gain 220 109 -124.30 gain 109 221 -125.26 gain 221 109 -124.56 gain 109 222 -118.70 gain 222 109 -118.33 gain 109 223 -121.36 gain 223 109 -119.61 gain 109 224 -130.53 gain 224 109 -131.46 gain 110 111 -87.68 gain 111 110 -87.36 gain 110 112 -112.16 gain 112 110 -110.72 gain 110 113 -111.38 gain 113 110 -108.74 gain 110 114 -113.46 gain 114 110 -114.13 gain 110 115 -116.01 gain 115 110 -110.99 gain 110 116 -120.16 gain 116 110 -122.68 gain 110 117 -119.60 gain 117 110 -123.61 gain 110 118 -120.89 gain 118 110 -123.22 gain 110 119 -127.42 gain 119 110 -124.42 gain 110 120 -123.66 gain 120 110 -125.17 gain 110 121 -106.25 gain 121 110 -107.05 gain 110 122 -110.30 gain 122 110 -113.21 gain 110 123 -105.21 gain 123 110 -108.90 gain 110 124 -100.87 gain 124 110 -100.97 gain 110 125 -94.00 gain 125 110 -95.43 gain 110 126 -95.43 gain 126 110 -94.82 gain 110 127 -97.47 gain 127 110 -100.33 gain 110 128 -105.79 gain 128 110 -106.58 gain 110 129 -112.40 gain 129 110 -111.10 gain 110 130 -117.44 gain 130 110 -113.96 gain 110 131 -111.52 gain 131 110 -115.13 gain 110 132 -117.74 gain 132 110 -120.97 gain 110 133 -121.13 gain 133 110 -122.43 gain 110 134 -128.65 gain 134 110 -126.65 gain 110 135 -117.55 gain 135 110 -119.13 gain 110 136 -112.06 gain 136 110 -114.25 gain 110 137 -112.19 gain 137 110 -111.86 gain 110 138 -104.84 gain 138 110 -103.51 gain 110 139 -101.68 gain 139 110 -101.34 gain 110 140 -99.60 gain 140 110 -101.87 gain 110 141 -101.81 gain 141 110 -102.75 gain 110 142 -108.25 gain 142 110 -108.49 gain 110 143 -118.03 gain 143 110 -117.89 gain 110 144 -111.71 gain 144 110 -112.59 gain 110 145 -115.42 gain 145 110 -114.74 gain 110 146 -113.80 gain 146 110 -112.04 gain 110 147 -123.98 gain 147 110 -119.31 gain 110 148 -114.00 gain 148 110 -109.04 gain 110 149 -117.28 gain 149 110 -115.49 gain 110 150 -112.31 gain 150 110 -113.20 gain 110 151 -114.37 gain 151 110 -115.46 gain 110 152 -111.99 gain 152 110 -110.05 gain 110 153 -114.11 gain 153 110 -109.76 gain 110 154 -110.55 gain 154 110 -114.75 gain 110 155 -110.90 gain 155 110 -115.00 gain 110 156 -107.60 gain 156 110 -106.08 gain 110 157 -116.95 gain 157 110 -118.38 gain 110 158 -112.35 gain 158 110 -116.37 gain 110 159 -119.56 gain 159 110 -120.19 gain 110 160 -121.87 gain 160 110 -119.62 gain 110 161 -114.84 gain 161 110 -116.08 gain 110 162 -115.93 gain 162 110 -116.04 gain 110 163 -124.88 gain 163 110 -127.14 gain 110 164 -119.86 gain 164 110 -123.15 gain 110 165 -115.36 gain 165 110 -114.69 gain 110 166 -118.29 gain 166 110 -119.20 gain 110 167 -113.53 gain 167 110 -116.53 gain 110 168 -113.92 gain 168 110 -115.37 gain 110 169 -114.09 gain 169 110 -119.73 gain 110 170 -108.75 gain 170 110 -105.92 gain 110 171 -116.14 gain 171 110 -118.33 gain 110 172 -110.06 gain 172 110 -106.95 gain 110 173 -110.14 gain 173 110 -106.47 gain 110 174 -111.90 gain 174 110 -112.52 gain 110 175 -114.50 gain 175 110 -118.68 gain 110 176 -115.52 gain 176 110 -111.71 gain 110 177 -119.45 gain 177 110 -123.45 gain 110 178 -118.19 gain 178 110 -118.02 gain 110 179 -127.14 gain 179 110 -125.36 gain 110 180 -116.42 gain 180 110 -116.10 gain 110 181 -118.64 gain 181 110 -118.39 gain 110 182 -114.65 gain 182 110 -116.79 gain 110 183 -116.58 gain 183 110 -112.11 gain 110 184 -108.96 gain 184 110 -109.27 gain 110 185 -114.32 gain 185 110 -112.12 gain 110 186 -109.67 gain 186 110 -107.75 gain 110 187 -114.28 gain 187 110 -114.90 gain 110 188 -115.93 gain 188 110 -119.81 gain 110 189 -114.75 gain 189 110 -116.14 gain 110 190 -114.19 gain 190 110 -112.59 gain 110 191 -116.33 gain 191 110 -115.83 gain 110 192 -119.01 gain 192 110 -121.38 gain 110 193 -125.55 gain 193 110 -129.17 gain 110 194 -125.71 gain 194 110 -123.14 gain 110 195 -126.83 gain 195 110 -124.89 gain 110 196 -113.91 gain 196 110 -116.01 gain 110 197 -118.53 gain 197 110 -116.69 gain 110 198 -116.19 gain 198 110 -113.88 gain 110 199 -113.61 gain 199 110 -115.21 gain 110 200 -113.20 gain 200 110 -111.73 gain 110 201 -112.71 gain 201 110 -112.05 gain 110 202 -117.71 gain 202 110 -121.06 gain 110 203 -122.23 gain 203 110 -125.19 gain 110 204 -126.82 gain 204 110 -127.07 gain 110 205 -123.74 gain 205 110 -123.07 gain 110 206 -122.21 gain 206 110 -126.05 gain 110 207 -126.08 gain 207 110 -122.28 gain 110 208 -124.43 gain 208 110 -126.41 gain 110 209 -133.30 gain 209 110 -136.27 gain 110 210 -126.12 gain 210 110 -126.03 gain 110 211 -115.62 gain 211 110 -117.55 gain 110 212 -125.98 gain 212 110 -126.46 gain 110 213 -114.28 gain 213 110 -113.95 gain 110 214 -117.49 gain 214 110 -117.04 gain 110 215 -123.36 gain 215 110 -119.33 gain 110 216 -124.31 gain 216 110 -124.94 gain 110 217 -120.42 gain 217 110 -121.57 gain 110 218 -127.76 gain 218 110 -131.10 gain 110 219 -125.89 gain 219 110 -120.59 gain 110 220 -121.41 gain 220 110 -126.59 gain 110 221 -121.37 gain 221 110 -122.20 gain 110 222 -118.91 gain 222 110 -120.07 gain 110 223 -128.21 gain 223 110 -127.98 gain 110 224 -126.30 gain 224 110 -128.76 gain 111 112 -94.54 gain 112 111 -93.42 gain 111 113 -100.30 gain 113 111 -97.98 gain 111 114 -108.07 gain 114 111 -109.06 gain 111 115 -105.72 gain 115 111 -101.01 gain 111 116 -114.85 gain 116 111 -117.69 gain 111 117 -123.60 gain 117 111 -127.93 gain 111 118 -117.01 gain 118 111 -119.67 gain 111 119 -121.02 gain 119 111 -118.33 gain 111 120 -113.43 gain 120 111 -115.26 gain 111 121 -120.84 gain 121 111 -121.96 gain 111 122 -108.41 gain 122 111 -111.64 gain 111 123 -102.92 gain 123 111 -106.93 gain 111 124 -91.55 gain 124 111 -91.98 gain 111 125 -96.50 gain 125 111 -98.26 gain 111 126 -85.73 gain 126 111 -85.44 gain 111 127 -102.15 gain 127 111 -105.32 gain 111 128 -101.96 gain 128 111 -103.07 gain 111 129 -110.29 gain 129 111 -109.31 gain 111 130 -114.33 gain 130 111 -111.17 gain 111 131 -113.40 gain 131 111 -117.33 gain 111 132 -117.27 gain 132 111 -120.83 gain 111 133 -122.25 gain 133 111 -123.88 gain 111 134 -121.15 gain 134 111 -119.48 gain 111 135 -116.01 gain 135 111 -117.91 gain 111 136 -116.73 gain 136 111 -119.24 gain 111 137 -116.63 gain 137 111 -116.62 gain 111 138 -111.91 gain 138 111 -110.90 gain 111 139 -106.72 gain 139 111 -106.70 gain 111 140 -104.28 gain 140 111 -106.87 gain 111 141 -102.11 gain 141 111 -103.37 gain 111 142 -110.82 gain 142 111 -111.38 gain 111 143 -102.73 gain 143 111 -102.91 gain 111 144 -110.17 gain 144 111 -111.37 gain 111 145 -103.09 gain 145 111 -102.74 gain 111 146 -119.84 gain 146 111 -118.40 gain 111 147 -117.90 gain 147 111 -113.55 gain 111 148 -117.82 gain 148 111 -113.18 gain 111 149 -120.09 gain 149 111 -118.62 gain 111 150 -115.95 gain 150 111 -117.17 gain 111 151 -118.23 gain 151 111 -119.64 gain 111 152 -118.82 gain 152 111 -117.21 gain 111 153 -105.25 gain 153 111 -101.22 gain 111 154 -106.89 gain 154 111 -111.41 gain 111 155 -110.41 gain 155 111 -114.83 gain 111 156 -105.46 gain 156 111 -104.27 gain 111 157 -110.90 gain 157 111 -112.65 gain 111 158 -105.34 gain 158 111 -109.68 gain 111 159 -113.24 gain 159 111 -114.20 gain 111 160 -116.31 gain 160 111 -114.38 gain 111 161 -115.85 gain 161 111 -117.42 gain 111 162 -120.16 gain 162 111 -120.59 gain 111 163 -120.68 gain 163 111 -123.25 gain 111 164 -114.15 gain 164 111 -117.76 gain 111 165 -128.51 gain 165 111 -128.16 gain 111 166 -114.31 gain 166 111 -115.53 gain 111 167 -118.77 gain 167 111 -122.09 gain 111 168 -119.16 gain 168 111 -120.92 gain 111 169 -105.81 gain 169 111 -111.78 gain 111 170 -112.51 gain 170 111 -110.00 gain 111 171 -115.15 gain 171 111 -117.66 gain 111 172 -112.09 gain 172 111 -109.30 gain 111 173 -113.16 gain 173 111 -109.80 gain 111 174 -118.04 gain 174 111 -118.98 gain 111 175 -114.32 gain 175 111 -118.82 gain 111 176 -115.62 gain 176 111 -112.13 gain 111 177 -120.84 gain 177 111 -125.16 gain 111 178 -125.01 gain 178 111 -125.15 gain 111 179 -126.78 gain 179 111 -125.32 gain 111 180 -116.75 gain 180 111 -116.75 gain 111 181 -120.40 gain 181 111 -120.47 gain 111 182 -116.99 gain 182 111 -119.44 gain 111 183 -115.45 gain 183 111 -111.30 gain 111 184 -117.56 gain 184 111 -118.20 gain 111 185 -115.59 gain 185 111 -113.71 gain 111 186 -114.03 gain 186 111 -112.43 gain 111 187 -115.36 gain 187 111 -116.30 gain 111 188 -120.94 gain 188 111 -125.14 gain 111 189 -116.76 gain 189 111 -118.48 gain 111 190 -111.13 gain 190 111 -109.86 gain 111 191 -118.73 gain 191 111 -118.54 gain 111 192 -116.55 gain 192 111 -119.24 gain 111 193 -124.19 gain 193 111 -128.13 gain 111 194 -129.73 gain 194 111 -127.48 gain 111 195 -126.38 gain 195 111 -124.76 gain 111 196 -115.43 gain 196 111 -117.85 gain 111 197 -122.17 gain 197 111 -120.66 gain 111 198 -118.36 gain 198 111 -116.36 gain 111 199 -111.43 gain 199 111 -113.35 gain 111 200 -118.58 gain 200 111 -117.44 gain 111 201 -117.12 gain 201 111 -116.79 gain 111 202 -116.97 gain 202 111 -120.64 gain 111 203 -114.77 gain 203 111 -118.06 gain 111 204 -114.98 gain 204 111 -115.55 gain 111 205 -114.67 gain 205 111 -114.31 gain 111 206 -118.77 gain 206 111 -122.93 gain 111 207 -118.43 gain 207 111 -114.96 gain 111 208 -126.63 gain 208 111 -128.93 gain 111 209 -119.32 gain 209 111 -122.61 gain 111 210 -124.51 gain 210 111 -124.74 gain 111 211 -124.12 gain 211 111 -126.37 gain 111 212 -113.64 gain 212 111 -114.44 gain 111 213 -117.97 gain 213 111 -117.96 gain 111 214 -116.73 gain 214 111 -116.61 gain 111 215 -119.64 gain 215 111 -115.93 gain 111 216 -112.02 gain 216 111 -112.97 gain 111 217 -119.57 gain 217 111 -121.04 gain 111 218 -118.33 gain 218 111 -121.99 gain 111 219 -115.73 gain 219 111 -110.75 gain 111 220 -124.40 gain 220 111 -129.91 gain 111 221 -118.05 gain 221 111 -119.20 gain 111 222 -123.73 gain 222 111 -125.21 gain 111 223 -122.08 gain 223 111 -122.17 gain 111 224 -125.60 gain 224 111 -128.38 gain 112 113 -92.03 gain 113 112 -90.83 gain 112 114 -99.87 gain 114 112 -101.98 gain 112 115 -104.91 gain 115 112 -101.32 gain 112 116 -107.14 gain 116 112 -111.09 gain 112 117 -114.48 gain 117 112 -119.93 gain 112 118 -118.89 gain 118 112 -122.66 gain 112 119 -115.33 gain 119 112 -113.77 gain 112 120 -119.08 gain 120 112 -122.03 gain 112 121 -114.09 gain 121 112 -116.33 gain 112 122 -107.32 gain 122 112 -111.68 gain 112 123 -104.10 gain 123 112 -109.24 gain 112 124 -97.01 gain 124 112 -98.55 gain 112 125 -103.42 gain 125 112 -106.30 gain 112 126 -92.34 gain 126 112 -93.17 gain 112 127 -85.05 gain 127 112 -89.34 gain 112 128 -99.63 gain 128 112 -101.86 gain 112 129 -107.21 gain 129 112 -107.35 gain 112 130 -108.72 gain 130 112 -106.68 gain 112 131 -101.00 gain 131 112 -106.06 gain 112 132 -116.09 gain 132 112 -120.77 gain 112 133 -119.29 gain 133 112 -122.04 gain 112 134 -121.05 gain 134 112 -120.50 gain 112 135 -123.91 gain 135 112 -126.93 gain 112 136 -114.90 gain 136 112 -118.53 gain 112 137 -110.66 gain 137 112 -111.77 gain 112 138 -103.10 gain 138 112 -103.21 gain 112 139 -109.30 gain 139 112 -110.39 gain 112 140 -104.22 gain 140 112 -107.92 gain 112 141 -105.18 gain 141 112 -107.56 gain 112 142 -98.53 gain 142 112 -100.21 gain 112 143 -105.82 gain 143 112 -107.12 gain 112 144 -105.30 gain 144 112 -107.62 gain 112 145 -110.78 gain 145 112 -111.55 gain 112 146 -117.90 gain 146 112 -117.57 gain 112 147 -111.01 gain 147 112 -107.78 gain 112 148 -118.39 gain 148 112 -114.87 gain 112 149 -113.19 gain 149 112 -112.84 gain 112 150 -118.14 gain 150 112 -120.48 gain 112 151 -112.70 gain 151 112 -115.24 gain 112 152 -118.58 gain 152 112 -118.09 gain 112 153 -112.40 gain 153 112 -109.48 gain 112 154 -117.94 gain 154 112 -123.58 gain 112 155 -109.16 gain 155 112 -114.69 gain 112 156 -111.04 gain 156 112 -110.96 gain 112 157 -108.38 gain 157 112 -111.25 gain 112 158 -108.30 gain 158 112 -113.76 gain 112 159 -108.22 gain 159 112 -110.30 gain 112 160 -111.61 gain 160 112 -110.80 gain 112 161 -113.09 gain 161 112 -115.77 gain 112 162 -117.91 gain 162 112 -119.45 gain 112 163 -114.96 gain 163 112 -118.65 gain 112 164 -120.86 gain 164 112 -125.60 gain 112 165 -115.69 gain 165 112 -116.46 gain 112 166 -122.57 gain 166 112 -124.91 gain 112 167 -119.58 gain 167 112 -124.02 gain 112 168 -120.70 gain 168 112 -123.58 gain 112 169 -111.54 gain 169 112 -118.62 gain 112 170 -108.86 gain 170 112 -107.47 gain 112 171 -111.63 gain 171 112 -115.26 gain 112 172 -113.26 gain 172 112 -111.59 gain 112 173 -108.12 gain 173 112 -105.88 gain 112 174 -117.57 gain 174 112 -119.63 gain 112 175 -114.24 gain 175 112 -119.86 gain 112 176 -115.54 gain 176 112 -113.17 gain 112 177 -114.74 gain 177 112 -120.18 gain 112 178 -115.03 gain 178 112 -116.30 gain 112 179 -119.24 gain 179 112 -118.90 gain 112 180 -124.21 gain 180 112 -125.34 gain 112 181 -117.92 gain 181 112 -119.12 gain 112 182 -118.82 gain 182 112 -122.40 gain 112 183 -111.18 gain 183 112 -108.15 gain 112 184 -107.93 gain 184 112 -109.69 gain 112 185 -115.38 gain 185 112 -114.62 gain 112 186 -118.46 gain 186 112 -117.98 gain 112 187 -118.95 gain 187 112 -121.01 gain 112 188 -116.96 gain 188 112 -122.28 gain 112 189 -119.63 gain 189 112 -122.47 gain 112 190 -124.06 gain 190 112 -123.91 gain 112 191 -114.42 gain 191 112 -115.36 gain 112 192 -114.85 gain 192 112 -118.65 gain 112 193 -123.99 gain 193 112 -129.04 gain 112 194 -123.39 gain 194 112 -122.26 gain 112 195 -124.25 gain 195 112 -123.75 gain 112 196 -121.84 gain 196 112 -125.38 gain 112 197 -110.40 gain 197 112 -110.00 gain 112 198 -119.00 gain 198 112 -118.12 gain 112 199 -113.33 gain 199 112 -116.37 gain 112 200 -115.72 gain 200 112 -115.69 gain 112 201 -105.46 gain 201 112 -106.24 gain 112 202 -113.09 gain 202 112 -117.88 gain 112 203 -115.70 gain 203 112 -120.11 gain 112 204 -110.82 gain 204 112 -112.51 gain 112 205 -118.81 gain 205 112 -119.57 gain 112 206 -118.96 gain 206 112 -124.25 gain 112 207 -119.78 gain 207 112 -117.43 gain 112 208 -124.85 gain 208 112 -128.27 gain 112 209 -121.97 gain 209 112 -126.39 gain 112 210 -125.54 gain 210 112 -126.89 gain 112 211 -110.17 gain 211 112 -113.55 gain 112 212 -120.91 gain 212 112 -122.83 gain 112 213 -119.50 gain 213 112 -120.61 gain 112 214 -122.56 gain 214 112 -123.55 gain 112 215 -117.70 gain 215 112 -115.11 gain 112 216 -120.93 gain 216 112 -123.01 gain 112 217 -120.78 gain 217 112 -123.37 gain 112 218 -115.46 gain 218 112 -120.24 gain 112 219 -113.90 gain 219 112 -110.03 gain 112 220 -121.18 gain 220 112 -127.81 gain 112 221 -120.28 gain 221 112 -122.56 gain 112 222 -113.25 gain 222 112 -115.85 gain 112 223 -114.36 gain 223 112 -115.57 gain 112 224 -114.88 gain 224 112 -118.77 gain 113 114 -89.68 gain 114 113 -92.99 gain 113 115 -107.06 gain 115 113 -104.66 gain 113 116 -107.88 gain 116 113 -113.03 gain 113 117 -108.08 gain 117 113 -114.73 gain 113 118 -111.20 gain 118 113 -116.17 gain 113 119 -118.76 gain 119 113 -118.39 gain 113 120 -118.56 gain 120 113 -122.71 gain 113 121 -115.36 gain 121 113 -118.80 gain 113 122 -118.33 gain 122 113 -123.88 gain 113 123 -111.43 gain 123 113 -117.76 gain 113 124 -110.22 gain 124 113 -112.95 gain 113 125 -108.99 gain 125 113 -113.06 gain 113 126 -104.21 gain 126 113 -106.23 gain 113 127 -94.88 gain 127 113 -100.37 gain 113 128 -88.44 gain 128 113 -91.87 gain 113 129 -92.62 gain 129 113 -93.95 gain 113 130 -99.80 gain 130 113 -98.96 gain 113 131 -109.23 gain 131 113 -115.47 gain 113 132 -105.67 gain 132 113 -111.55 gain 113 133 -109.93 gain 133 113 -113.88 gain 113 134 -110.69 gain 134 113 -111.33 gain 113 135 -122.88 gain 135 113 -127.10 gain 113 136 -115.55 gain 136 113 -120.38 gain 113 137 -113.08 gain 137 113 -115.39 gain 113 138 -109.92 gain 138 113 -111.23 gain 113 139 -107.83 gain 139 113 -110.12 gain 113 140 -103.10 gain 140 113 -108.00 gain 113 141 -102.22 gain 141 113 -105.79 gain 113 142 -94.66 gain 142 113 -97.54 gain 113 143 -99.84 gain 143 113 -102.34 gain 113 144 -108.13 gain 144 113 -111.65 gain 113 145 -103.06 gain 145 113 -105.02 gain 113 146 -107.77 gain 146 113 -108.65 gain 113 147 -117.54 gain 147 113 -115.51 gain 113 148 -101.91 gain 148 113 -99.59 gain 113 149 -109.88 gain 149 113 -110.73 gain 113 150 -120.17 gain 150 113 -123.71 gain 113 151 -117.42 gain 151 113 -121.15 gain 113 152 -116.29 gain 152 113 -117.00 gain 113 153 -110.82 gain 153 113 -109.11 gain 113 154 -116.17 gain 154 113 -123.01 gain 113 155 -110.66 gain 155 113 -117.38 gain 113 156 -106.84 gain 156 113 -107.96 gain 113 157 -102.44 gain 157 113 -106.51 gain 113 158 -105.39 gain 158 113 -112.05 gain 113 159 -109.78 gain 159 113 -113.05 gain 113 160 -111.58 gain 160 113 -111.96 gain 113 161 -108.38 gain 161 113 -112.25 gain 113 162 -110.99 gain 162 113 -113.73 gain 113 163 -113.67 gain 163 113 -118.56 gain 113 164 -118.36 gain 164 113 -124.29 gain 113 165 -120.25 gain 165 113 -122.22 gain 113 166 -115.53 gain 166 113 -119.07 gain 113 167 -118.02 gain 167 113 -123.65 gain 113 168 -108.83 gain 168 113 -112.91 gain 113 169 -110.66 gain 169 113 -118.94 gain 113 170 -107.34 gain 170 113 -107.15 gain 113 171 -123.28 gain 171 113 -128.10 gain 113 172 -115.09 gain 172 113 -114.61 gain 113 173 -110.44 gain 173 113 -109.40 gain 113 174 -116.04 gain 174 113 -119.30 gain 113 175 -106.43 gain 175 113 -113.24 gain 113 176 -111.19 gain 176 113 -110.02 gain 113 177 -118.12 gain 177 113 -124.76 gain 113 178 -112.52 gain 178 113 -114.98 gain 113 179 -122.14 gain 179 113 -122.99 gain 113 180 -117.82 gain 180 113 -120.14 gain 113 181 -125.34 gain 181 113 -127.73 gain 113 182 -121.76 gain 182 113 -126.54 gain 113 183 -119.95 gain 183 113 -118.11 gain 113 184 -113.75 gain 184 113 -116.70 gain 113 185 -115.04 gain 185 113 -115.47 gain 113 186 -106.38 gain 186 113 -107.10 gain 113 187 -112.07 gain 187 113 -115.33 gain 113 188 -115.28 gain 188 113 -121.80 gain 113 189 -112.49 gain 189 113 -116.52 gain 113 190 -113.76 gain 190 113 -114.80 gain 113 191 -107.96 gain 191 113 -110.10 gain 113 192 -114.90 gain 192 113 -119.90 gain 113 193 -112.23 gain 193 113 -118.48 gain 113 194 -123.30 gain 194 113 -123.36 gain 113 195 -113.84 gain 195 113 -114.53 gain 113 196 -119.19 gain 196 113 -123.93 gain 113 197 -118.44 gain 197 113 -119.23 gain 113 198 -120.45 gain 198 113 -120.77 gain 113 199 -106.66 gain 199 113 -110.89 gain 113 200 -117.55 gain 200 113 -118.72 gain 113 201 -117.82 gain 201 113 -119.80 gain 113 202 -113.76 gain 202 113 -119.74 gain 113 203 -113.68 gain 203 113 -119.28 gain 113 204 -111.21 gain 204 113 -114.09 gain 113 205 -115.43 gain 205 113 -117.39 gain 113 206 -116.62 gain 206 113 -123.10 gain 113 207 -115.35 gain 207 113 -114.19 gain 113 208 -122.20 gain 208 113 -126.82 gain 113 209 -120.44 gain 209 113 -126.04 gain 113 210 -118.05 gain 210 113 -120.59 gain 113 211 -113.86 gain 211 113 -118.43 gain 113 212 -116.91 gain 212 113 -120.02 gain 113 213 -121.66 gain 213 113 -123.96 gain 113 214 -119.16 gain 214 113 -121.35 gain 113 215 -116.83 gain 215 113 -115.44 gain 113 216 -118.73 gain 216 113 -122.00 gain 113 217 -108.70 gain 217 113 -112.48 gain 113 218 -110.49 gain 218 113 -116.46 gain 113 219 -122.44 gain 219 113 -119.77 gain 113 220 -110.73 gain 220 113 -118.55 gain 113 221 -117.11 gain 221 113 -120.58 gain 113 222 -122.56 gain 222 113 -126.36 gain 113 223 -120.77 gain 223 113 -123.17 gain 113 224 -126.27 gain 224 113 -131.36 gain 114 115 -89.85 gain 115 114 -84.15 gain 114 116 -102.53 gain 116 114 -104.37 gain 114 117 -116.93 gain 117 114 -120.27 gain 114 118 -108.18 gain 118 114 -109.84 gain 114 119 -114.52 gain 119 114 -110.85 gain 114 120 -126.82 gain 120 114 -127.67 gain 114 121 -122.37 gain 121 114 -122.50 gain 114 122 -116.47 gain 122 114 -118.72 gain 114 123 -118.81 gain 123 114 -121.83 gain 114 124 -115.74 gain 124 114 -115.18 gain 114 125 -106.11 gain 125 114 -106.88 gain 114 126 -108.21 gain 126 114 -106.93 gain 114 127 -111.40 gain 127 114 -113.59 gain 114 128 -99.70 gain 128 114 -99.83 gain 114 129 -93.29 gain 129 114 -91.32 gain 114 130 -92.20 gain 130 114 -88.06 gain 114 131 -103.93 gain 131 114 -106.87 gain 114 132 -111.60 gain 132 114 -114.17 gain 114 133 -115.11 gain 133 114 -115.75 gain 114 134 -117.46 gain 134 114 -114.80 gain 114 135 -121.39 gain 135 114 -122.30 gain 114 136 -120.85 gain 136 114 -122.37 gain 114 137 -122.89 gain 137 114 -121.89 gain 114 138 -121.65 gain 138 114 -119.65 gain 114 139 -115.05 gain 139 114 -114.04 gain 114 140 -111.98 gain 140 114 -113.57 gain 114 141 -103.87 gain 141 114 -104.14 gain 114 142 -104.17 gain 142 114 -103.74 gain 114 143 -108.61 gain 143 114 -107.80 gain 114 144 -102.62 gain 144 114 -102.83 gain 114 145 -98.43 gain 145 114 -97.09 gain 114 146 -103.01 gain 146 114 -100.58 gain 114 147 -113.80 gain 147 114 -108.46 gain 114 148 -115.27 gain 148 114 -109.64 gain 114 149 -117.77 gain 149 114 -115.31 gain 114 150 -123.53 gain 150 114 -123.76 gain 114 151 -115.07 gain 151 114 -115.50 gain 114 152 -119.87 gain 152 114 -117.27 gain 114 153 -119.29 gain 153 114 -114.27 gain 114 154 -114.47 gain 154 114 -117.99 gain 114 155 -113.69 gain 155 114 -117.11 gain 114 156 -116.09 gain 156 114 -113.90 gain 114 157 -114.33 gain 157 114 -115.09 gain 114 158 -114.55 gain 158 114 -117.90 gain 114 159 -114.97 gain 159 114 -114.93 gain 114 160 -107.84 gain 160 114 -104.91 gain 114 161 -117.00 gain 161 114 -117.57 gain 114 162 -112.18 gain 162 114 -111.61 gain 114 163 -116.97 gain 163 114 -118.55 gain 114 164 -118.77 gain 164 114 -121.39 gain 114 165 -128.56 gain 165 114 -127.23 gain 114 166 -125.43 gain 166 114 -125.67 gain 114 167 -123.05 gain 167 114 -125.38 gain 114 168 -121.26 gain 168 114 -122.04 gain 114 169 -113.45 gain 169 114 -118.43 gain 114 170 -113.39 gain 170 114 -109.89 gain 114 171 -116.00 gain 171 114 -117.52 gain 114 172 -110.16 gain 172 114 -106.38 gain 114 173 -111.85 gain 173 114 -107.50 gain 114 174 -117.53 gain 174 114 -117.49 gain 114 175 -104.70 gain 175 114 -108.20 gain 114 176 -112.95 gain 176 114 -108.47 gain 114 177 -107.95 gain 177 114 -111.28 gain 114 178 -118.74 gain 178 114 -117.89 gain 114 179 -120.51 gain 179 114 -118.06 gain 114 180 -126.08 gain 180 114 -125.10 gain 114 181 -112.30 gain 181 114 -111.38 gain 114 182 -121.55 gain 182 114 -123.02 gain 114 183 -119.50 gain 183 114 -114.36 gain 114 184 -118.54 gain 184 114 -118.19 gain 114 185 -123.39 gain 185 114 -120.52 gain 114 186 -116.44 gain 186 114 -113.85 gain 114 187 -119.53 gain 187 114 -119.48 gain 114 188 -115.00 gain 188 114 -118.21 gain 114 189 -118.27 gain 189 114 -118.99 gain 114 190 -116.55 gain 190 114 -114.29 gain 114 191 -121.32 gain 191 114 -120.15 gain 114 192 -116.74 gain 192 114 -118.44 gain 114 193 -117.05 gain 193 114 -120.00 gain 114 194 -118.60 gain 194 114 -115.36 gain 114 195 -125.42 gain 195 114 -122.81 gain 114 196 -124.47 gain 196 114 -125.90 gain 114 197 -121.02 gain 197 114 -118.51 gain 114 198 -123.36 gain 198 114 -120.37 gain 114 199 -119.25 gain 199 114 -120.19 gain 114 200 -121.71 gain 200 114 -119.58 gain 114 201 -116.44 gain 201 114 -115.11 gain 114 202 -117.67 gain 202 114 -120.35 gain 114 203 -119.56 gain 203 114 -121.86 gain 114 204 -117.42 gain 204 114 -117.00 gain 114 205 -118.71 gain 205 114 -117.36 gain 114 206 -122.29 gain 206 114 -125.46 gain 114 207 -120.74 gain 207 114 -116.28 gain 114 208 -116.88 gain 208 114 -118.19 gain 114 209 -109.66 gain 209 114 -111.97 gain 114 210 -124.66 gain 210 114 -123.90 gain 114 211 -127.27 gain 211 114 -128.53 gain 114 212 -124.81 gain 212 114 -124.62 gain 114 213 -120.09 gain 213 114 -119.09 gain 114 214 -119.87 gain 214 114 -118.75 gain 114 215 -122.69 gain 215 114 -117.99 gain 114 216 -118.15 gain 216 114 -118.11 gain 114 217 -117.32 gain 217 114 -117.81 gain 114 218 -113.29 gain 218 114 -115.96 gain 114 219 -120.68 gain 219 114 -114.71 gain 114 220 -119.98 gain 220 114 -124.50 gain 114 221 -122.73 gain 221 114 -122.89 gain 114 222 -123.00 gain 222 114 -123.49 gain 114 223 -118.58 gain 223 114 -117.69 gain 114 224 -122.80 gain 224 114 -124.59 gain 115 116 -89.23 gain 116 115 -96.77 gain 115 117 -94.17 gain 117 115 -103.21 gain 115 118 -103.76 gain 118 115 -111.12 gain 115 119 -105.60 gain 119 115 -107.62 gain 115 120 -120.94 gain 120 115 -127.48 gain 115 121 -121.40 gain 121 115 -127.23 gain 115 122 -113.47 gain 122 115 -121.41 gain 115 123 -109.22 gain 123 115 -117.94 gain 115 124 -109.28 gain 124 115 -114.42 gain 115 125 -104.92 gain 125 115 -111.39 gain 115 126 -111.09 gain 126 115 -115.51 gain 115 127 -97.23 gain 127 115 -105.11 gain 115 128 -99.59 gain 128 115 -105.41 gain 115 129 -87.80 gain 129 115 -91.53 gain 115 130 -87.68 gain 130 115 -89.23 gain 115 131 -91.14 gain 131 115 -99.78 gain 115 132 -104.90 gain 132 115 -113.16 gain 115 133 -107.32 gain 133 115 -113.66 gain 115 134 -105.05 gain 134 115 -108.08 gain 115 135 -112.92 gain 135 115 -119.53 gain 115 136 -119.51 gain 136 115 -126.73 gain 115 137 -114.89 gain 137 115 -119.59 gain 115 138 -112.52 gain 138 115 -116.22 gain 115 139 -112.18 gain 139 115 -116.86 gain 115 140 -113.79 gain 140 115 -121.09 gain 115 141 -112.77 gain 141 115 -118.73 gain 115 142 -108.25 gain 142 115 -113.52 gain 115 143 -99.71 gain 143 115 -104.59 gain 115 144 -93.41 gain 144 115 -99.31 gain 115 145 -97.40 gain 145 115 -101.76 gain 115 146 -94.14 gain 146 115 -97.40 gain 115 147 -100.65 gain 147 115 -101.00 gain 115 148 -103.57 gain 148 115 -103.64 gain 115 149 -109.48 gain 149 115 -112.72 gain 115 150 -113.42 gain 150 115 -119.35 gain 115 151 -119.82 gain 151 115 -125.95 gain 115 152 -112.41 gain 152 115 -115.50 gain 115 153 -113.93 gain 153 115 -114.60 gain 115 154 -115.58 gain 154 115 -124.81 gain 115 155 -106.00 gain 155 115 -115.12 gain 115 156 -107.09 gain 156 115 -110.60 gain 115 157 -108.54 gain 157 115 -115.00 gain 115 158 -108.71 gain 158 115 -117.76 gain 115 159 -103.85 gain 159 115 -109.52 gain 115 160 -105.50 gain 160 115 -108.28 gain 115 161 -95.85 gain 161 115 -102.12 gain 115 162 -100.88 gain 162 115 -106.01 gain 115 163 -112.85 gain 163 115 -120.13 gain 115 164 -111.43 gain 164 115 -119.75 gain 115 165 -113.09 gain 165 115 -117.45 gain 115 166 -117.49 gain 166 115 -123.42 gain 115 167 -116.57 gain 167 115 -124.59 gain 115 168 -114.98 gain 168 115 -121.45 gain 115 169 -115.31 gain 169 115 -125.99 gain 115 170 -112.95 gain 170 115 -115.15 gain 115 171 -110.24 gain 171 115 -117.47 gain 115 172 -108.88 gain 172 115 -110.80 gain 115 173 -106.25 gain 173 115 -107.61 gain 115 174 -109.46 gain 174 115 -115.11 gain 115 175 -107.08 gain 175 115 -116.28 gain 115 176 -104.99 gain 176 115 -106.21 gain 115 177 -111.83 gain 177 115 -120.86 gain 115 178 -110.85 gain 178 115 -115.70 gain 115 179 -115.91 gain 179 115 -119.15 gain 115 180 -123.42 gain 180 115 -128.14 gain 115 181 -121.60 gain 181 115 -126.38 gain 115 182 -115.93 gain 182 115 -123.09 gain 115 183 -116.97 gain 183 115 -117.53 gain 115 184 -115.64 gain 184 115 -120.98 gain 115 185 -117.83 gain 185 115 -120.65 gain 115 186 -107.16 gain 186 115 -110.26 gain 115 187 -110.73 gain 187 115 -116.38 gain 115 188 -110.81 gain 188 115 -119.72 gain 115 189 -104.11 gain 189 115 -110.53 gain 115 190 -109.02 gain 190 115 -112.45 gain 115 191 -110.91 gain 191 115 -115.43 gain 115 192 -105.46 gain 192 115 -112.85 gain 115 193 -106.97 gain 193 115 -115.61 gain 115 194 -113.40 gain 194 115 -115.85 gain 115 195 -119.07 gain 195 115 -122.16 gain 115 196 -114.98 gain 196 115 -122.11 gain 115 197 -118.58 gain 197 115 -121.77 gain 115 198 -112.97 gain 198 115 -115.69 gain 115 199 -116.60 gain 199 115 -123.23 gain 115 200 -107.27 gain 200 115 -110.84 gain 115 201 -118.89 gain 201 115 -123.26 gain 115 202 -118.18 gain 202 115 -126.55 gain 115 203 -108.52 gain 203 115 -116.52 gain 115 204 -112.26 gain 204 115 -117.54 gain 115 205 -111.52 gain 205 115 -115.87 gain 115 206 -115.07 gain 206 115 -123.94 gain 115 207 -108.55 gain 207 115 -109.78 gain 115 208 -115.36 gain 208 115 -122.37 gain 115 209 -110.51 gain 209 115 -118.52 gain 115 210 -113.17 gain 210 115 -118.11 gain 115 211 -125.22 gain 211 115 -132.19 gain 115 212 -115.31 gain 212 115 -120.82 gain 115 213 -117.50 gain 213 115 -122.20 gain 115 214 -122.26 gain 214 115 -126.84 gain 115 215 -114.97 gain 215 115 -115.97 gain 115 216 -112.81 gain 216 115 -118.47 gain 115 217 -107.24 gain 217 115 -113.42 gain 115 218 -113.13 gain 218 115 -121.50 gain 115 219 -108.49 gain 219 115 -108.22 gain 115 220 -114.08 gain 220 115 -124.30 gain 115 221 -118.50 gain 221 115 -124.36 gain 115 222 -108.30 gain 222 115 -114.48 gain 115 223 -116.39 gain 223 115 -121.19 gain 115 224 -115.37 gain 224 115 -122.86 gain 116 117 -97.31 gain 117 116 -98.81 gain 116 118 -103.74 gain 118 116 -103.56 gain 116 119 -110.87 gain 119 116 -105.35 gain 116 120 -124.20 gain 120 116 -123.20 gain 116 121 -125.83 gain 121 116 -124.11 gain 116 122 -121.27 gain 122 116 -121.67 gain 116 123 -123.08 gain 123 116 -124.26 gain 116 124 -113.07 gain 124 116 -110.66 gain 116 125 -123.89 gain 125 116 -122.82 gain 116 126 -118.80 gain 126 116 -115.68 gain 116 127 -111.03 gain 127 116 -111.38 gain 116 128 -107.54 gain 128 116 -105.82 gain 116 129 -100.44 gain 129 116 -96.62 gain 116 130 -100.22 gain 130 116 -94.23 gain 116 131 -95.10 gain 131 116 -96.20 gain 116 132 -95.98 gain 132 116 -96.71 gain 116 133 -109.01 gain 133 116 -107.80 gain 116 134 -104.93 gain 134 116 -100.42 gain 116 135 -130.13 gain 135 116 -129.19 gain 116 136 -123.77 gain 136 116 -123.45 gain 116 137 -125.53 gain 137 116 -122.69 gain 116 138 -132.49 gain 138 116 -128.65 gain 116 139 -123.94 gain 139 116 -121.09 gain 116 140 -120.39 gain 140 116 -120.14 gain 116 141 -117.58 gain 141 116 -116.00 gain 116 142 -114.11 gain 142 116 -111.84 gain 116 143 -114.77 gain 143 116 -112.12 gain 116 144 -105.46 gain 144 116 -103.82 gain 116 145 -102.34 gain 145 116 -99.16 gain 116 146 -103.28 gain 146 116 -99.01 gain 116 147 -105.42 gain 147 116 -98.23 gain 116 148 -106.49 gain 148 116 -99.02 gain 116 149 -113.47 gain 149 116 -109.17 gain 116 150 -126.15 gain 150 116 -124.54 gain 116 151 -131.91 gain 151 116 -130.49 gain 116 152 -126.48 gain 152 116 -122.04 gain 116 153 -127.75 gain 153 116 -120.88 gain 116 154 -125.81 gain 154 116 -127.49 gain 116 155 -119.56 gain 155 116 -121.14 gain 116 156 -118.18 gain 156 116 -114.14 gain 116 157 -111.15 gain 157 116 -110.06 gain 116 158 -117.39 gain 158 116 -118.90 gain 116 159 -110.60 gain 159 116 -108.73 gain 116 160 -114.32 gain 160 116 -109.55 gain 116 161 -106.92 gain 161 116 -105.64 gain 116 162 -110.36 gain 162 116 -107.95 gain 116 163 -122.96 gain 163 116 -122.70 gain 116 164 -116.74 gain 164 116 -117.52 gain 116 165 -129.49 gain 165 116 -126.31 gain 116 166 -131.09 gain 166 116 -129.48 gain 116 167 -128.56 gain 167 116 -129.04 gain 116 168 -127.35 gain 168 116 -126.29 gain 116 169 -120.75 gain 169 116 -123.88 gain 116 170 -123.75 gain 170 116 -118.40 gain 116 171 -120.76 gain 171 116 -120.44 gain 116 172 -116.28 gain 172 116 -110.66 gain 116 173 -125.78 gain 173 116 -119.60 gain 116 174 -120.94 gain 174 116 -119.05 gain 116 175 -113.15 gain 175 116 -114.81 gain 116 176 -113.28 gain 176 116 -106.96 gain 116 177 -112.12 gain 177 116 -113.61 gain 116 178 -114.05 gain 178 116 -111.37 gain 116 179 -121.54 gain 179 116 -117.24 gain 116 180 -122.92 gain 180 116 -120.09 gain 116 181 -124.21 gain 181 116 -121.45 gain 116 182 -124.27 gain 182 116 -123.90 gain 116 183 -129.34 gain 183 116 -122.35 gain 116 184 -118.36 gain 184 116 -116.15 gain 116 185 -127.15 gain 185 116 -122.44 gain 116 186 -123.07 gain 186 116 -118.64 gain 116 187 -119.46 gain 187 116 -117.57 gain 116 188 -117.33 gain 188 116 -118.70 gain 116 189 -120.53 gain 189 116 -119.41 gain 116 190 -115.05 gain 190 116 -110.94 gain 116 191 -114.06 gain 191 116 -111.04 gain 116 192 -115.85 gain 192 116 -115.70 gain 116 193 -115.76 gain 193 116 -116.86 gain 116 194 -112.69 gain 194 116 -107.60 gain 116 195 -129.53 gain 195 116 -125.08 gain 116 196 -126.08 gain 196 116 -125.67 gain 116 197 -130.48 gain 197 116 -126.13 gain 116 198 -132.62 gain 198 116 -127.79 gain 116 199 -129.29 gain 199 116 -128.38 gain 116 200 -118.65 gain 200 116 -114.67 gain 116 201 -124.13 gain 201 116 -120.96 gain 116 202 -121.16 gain 202 116 -121.99 gain 116 203 -114.74 gain 203 116 -115.19 gain 116 204 -122.37 gain 204 116 -120.10 gain 116 205 -121.78 gain 205 116 -118.59 gain 116 206 -121.46 gain 206 116 -122.79 gain 116 207 -116.23 gain 207 116 -109.92 gain 116 208 -121.67 gain 208 116 -121.13 gain 116 209 -125.55 gain 209 116 -126.01 gain 116 210 -129.71 gain 210 116 -127.11 gain 116 211 -124.04 gain 211 116 -123.46 gain 116 212 -130.81 gain 212 116 -128.77 gain 116 213 -121.28 gain 213 116 -118.44 gain 116 214 -124.27 gain 214 116 -121.32 gain 116 215 -126.10 gain 215 116 -119.55 gain 116 216 -123.21 gain 216 116 -121.33 gain 116 217 -121.55 gain 217 116 -120.18 gain 116 218 -121.75 gain 218 116 -122.57 gain 116 219 -120.22 gain 219 116 -112.40 gain 116 220 -119.87 gain 220 116 -122.55 gain 116 221 -126.72 gain 221 116 -125.03 gain 116 222 -120.26 gain 222 116 -118.90 gain 116 223 -118.24 gain 223 116 -115.50 gain 116 224 -119.21 gain 224 116 -119.15 gain 117 118 -95.69 gain 118 117 -94.01 gain 117 119 -108.90 gain 119 117 -101.89 gain 117 120 -133.54 gain 120 117 -131.04 gain 117 121 -131.15 gain 121 117 -127.94 gain 117 122 -120.15 gain 122 117 -119.06 gain 117 123 -124.03 gain 123 117 -123.71 gain 117 124 -126.89 gain 124 117 -122.98 gain 117 125 -125.10 gain 125 117 -122.53 gain 117 126 -123.73 gain 126 117 -119.11 gain 117 127 -116.81 gain 127 117 -115.65 gain 117 128 -113.33 gain 128 117 -110.11 gain 117 129 -115.78 gain 129 117 -110.47 gain 117 130 -104.28 gain 130 117 -96.80 gain 117 131 -101.06 gain 131 117 -100.66 gain 117 132 -91.71 gain 132 117 -90.94 gain 117 133 -106.35 gain 133 117 -103.65 gain 117 134 -112.78 gain 134 117 -106.77 gain 117 135 -127.17 gain 135 117 -124.73 gain 117 136 -122.05 gain 136 117 -120.23 gain 117 137 -126.63 gain 137 117 -122.29 gain 117 138 -128.10 gain 138 117 -122.76 gain 117 139 -125.21 gain 139 117 -120.86 gain 117 140 -123.23 gain 140 117 -121.48 gain 117 141 -117.07 gain 141 117 -113.99 gain 117 142 -123.66 gain 142 117 -119.89 gain 117 143 -117.21 gain 143 117 -113.06 gain 117 144 -115.33 gain 144 117 -112.19 gain 117 145 -106.42 gain 145 117 -101.73 gain 117 146 -103.77 gain 146 117 -97.99 gain 117 147 -106.75 gain 147 117 -98.06 gain 117 148 -112.94 gain 148 117 -103.97 gain 117 149 -110.99 gain 149 117 -105.18 gain 117 150 -130.19 gain 150 117 -127.07 gain 117 151 -129.87 gain 151 117 -126.96 gain 117 152 -129.00 gain 152 117 -123.06 gain 117 153 -136.39 gain 153 117 -128.03 gain 117 154 -120.85 gain 154 117 -121.03 gain 117 155 -127.52 gain 155 117 -127.60 gain 117 156 -114.99 gain 156 117 -109.46 gain 117 157 -122.01 gain 157 117 -119.43 gain 117 158 -121.42 gain 158 117 -121.43 gain 117 159 -118.07 gain 159 117 -114.70 gain 117 160 -118.69 gain 160 117 -112.43 gain 117 161 -115.83 gain 161 117 -113.06 gain 117 162 -107.55 gain 162 117 -103.65 gain 117 163 -110.17 gain 163 117 -108.41 gain 117 164 -110.88 gain 164 117 -110.17 gain 117 165 -129.73 gain 165 117 -125.05 gain 117 166 -134.15 gain 166 117 -131.05 gain 117 167 -128.35 gain 167 117 -127.33 gain 117 168 -130.66 gain 168 117 -128.09 gain 117 169 -126.57 gain 169 117 -128.20 gain 117 170 -128.45 gain 170 117 -121.60 gain 117 171 -122.21 gain 171 117 -120.39 gain 117 172 -128.04 gain 172 117 -120.92 gain 117 173 -126.06 gain 173 117 -118.38 gain 117 174 -118.95 gain 174 117 -115.56 gain 117 175 -112.05 gain 175 117 -112.21 gain 117 176 -110.47 gain 176 117 -102.65 gain 117 177 -122.24 gain 177 117 -122.23 gain 117 178 -105.58 gain 178 117 -101.39 gain 117 179 -116.42 gain 179 117 -110.62 gain 117 180 -138.97 gain 180 117 -134.64 gain 117 181 -121.62 gain 181 117 -117.36 gain 117 182 -125.85 gain 182 117 -123.97 gain 117 183 -128.92 gain 183 117 -120.44 gain 117 184 -133.95 gain 184 117 -130.25 gain 117 185 -125.21 gain 185 117 -118.99 gain 117 186 -125.92 gain 186 117 -119.99 gain 117 187 -115.13 gain 187 117 -111.74 gain 117 188 -121.37 gain 188 117 -121.24 gain 117 189 -119.14 gain 189 117 -116.52 gain 117 190 -122.55 gain 190 117 -116.94 gain 117 191 -116.78 gain 191 117 -112.27 gain 117 192 -119.91 gain 192 117 -118.27 gain 117 193 -121.47 gain 193 117 -121.08 gain 117 194 -117.10 gain 194 117 -110.52 gain 117 195 -136.83 gain 195 117 -130.88 gain 117 196 -127.42 gain 196 117 -125.51 gain 117 197 -133.85 gain 197 117 -128.00 gain 117 198 -129.01 gain 198 117 -122.68 gain 117 199 -125.67 gain 199 117 -123.26 gain 117 200 -128.99 gain 200 117 -123.51 gain 117 201 -128.85 gain 201 117 -124.18 gain 117 202 -127.50 gain 202 117 -126.83 gain 117 203 -119.06 gain 203 117 -118.01 gain 117 204 -121.25 gain 204 117 -117.48 gain 117 205 -123.22 gain 205 117 -118.53 gain 117 206 -120.85 gain 206 117 -120.68 gain 117 207 -128.25 gain 207 117 -120.44 gain 117 208 -121.16 gain 208 117 -119.13 gain 117 209 -117.65 gain 209 117 -116.61 gain 117 210 -133.42 gain 210 117 -129.31 gain 117 211 -129.67 gain 211 117 -127.60 gain 117 212 -121.14 gain 212 117 -117.60 gain 117 213 -135.34 gain 213 117 -131.00 gain 117 214 -137.51 gain 214 117 -133.06 gain 117 215 -127.75 gain 215 117 -119.71 gain 117 216 -125.36 gain 216 117 -121.98 gain 117 217 -120.92 gain 217 117 -118.06 gain 117 218 -124.16 gain 218 117 -123.49 gain 117 219 -129.02 gain 219 117 -119.70 gain 117 220 -124.73 gain 220 117 -125.91 gain 117 221 -119.59 gain 221 117 -116.41 gain 117 222 -123.23 gain 222 117 -120.37 gain 117 223 -120.22 gain 223 117 -115.98 gain 117 224 -130.88 gain 224 117 -129.32 gain 118 119 -97.41 gain 119 118 -92.07 gain 118 120 -126.88 gain 120 118 -126.06 gain 118 121 -128.92 gain 121 118 -127.38 gain 118 122 -131.29 gain 122 118 -131.87 gain 118 123 -129.41 gain 123 118 -130.76 gain 118 124 -120.02 gain 124 118 -117.79 gain 118 125 -124.15 gain 125 118 -123.25 gain 118 126 -118.20 gain 126 118 -115.25 gain 118 127 -117.08 gain 127 118 -117.60 gain 118 128 -113.81 gain 128 118 -112.27 gain 118 129 -121.87 gain 129 118 -118.23 gain 118 130 -110.64 gain 130 118 -104.84 gain 118 131 -105.95 gain 131 118 -107.22 gain 118 132 -99.94 gain 132 118 -100.84 gain 118 133 -97.21 gain 133 118 -96.18 gain 118 134 -99.00 gain 134 118 -94.67 gain 118 135 -125.32 gain 135 118 -124.56 gain 118 136 -128.82 gain 136 118 -128.67 gain 118 137 -131.44 gain 137 118 -128.78 gain 118 138 -118.87 gain 138 118 -115.21 gain 118 139 -125.30 gain 139 118 -122.62 gain 118 140 -124.15 gain 140 118 -124.08 gain 118 141 -116.17 gain 141 118 -114.77 gain 118 142 -120.17 gain 142 118 -118.08 gain 118 143 -120.91 gain 143 118 -118.44 gain 118 144 -118.04 gain 144 118 -116.58 gain 118 145 -112.98 gain 145 118 -109.97 gain 118 146 -115.17 gain 146 118 -111.07 gain 118 147 -104.65 gain 147 118 -97.64 gain 118 148 -99.08 gain 148 118 -91.79 gain 118 149 -98.37 gain 149 118 -94.24 gain 118 150 -124.40 gain 150 118 -122.96 gain 118 151 -127.09 gain 151 118 -125.85 gain 118 152 -125.41 gain 152 118 -121.14 gain 118 153 -124.18 gain 153 118 -117.50 gain 118 154 -124.38 gain 154 118 -126.24 gain 118 155 -123.10 gain 155 118 -124.86 gain 118 156 -131.51 gain 156 118 -127.66 gain 118 157 -117.61 gain 157 118 -116.70 gain 118 158 -117.24 gain 158 118 -118.93 gain 118 159 -121.78 gain 159 118 -120.08 gain 118 160 -112.60 gain 160 118 -108.01 gain 118 161 -109.94 gain 161 118 -108.85 gain 118 162 -115.85 gain 162 118 -113.62 gain 118 163 -108.19 gain 163 118 -108.11 gain 118 164 -113.81 gain 164 118 -114.77 gain 118 165 -119.61 gain 165 118 -116.61 gain 118 166 -130.23 gain 166 118 -128.80 gain 118 167 -132.30 gain 167 118 -132.96 gain 118 168 -127.41 gain 168 118 -126.52 gain 118 169 -125.01 gain 169 118 -128.32 gain 118 170 -120.88 gain 170 118 -115.71 gain 118 171 -119.00 gain 171 118 -118.86 gain 118 172 -116.29 gain 172 118 -110.85 gain 118 173 -113.70 gain 173 118 -107.69 gain 118 174 -120.65 gain 174 118 -118.94 gain 118 175 -115.04 gain 175 118 -116.88 gain 118 176 -118.76 gain 176 118 -112.61 gain 118 177 -105.86 gain 177 118 -107.52 gain 118 178 -108.51 gain 178 118 -106.00 gain 118 179 -109.00 gain 179 118 -104.88 gain 118 180 -129.10 gain 180 118 -126.45 gain 118 181 -128.23 gain 181 118 -125.64 gain 118 182 -122.75 gain 182 118 -122.56 gain 118 183 -128.45 gain 183 118 -121.64 gain 118 184 -127.03 gain 184 118 -125.01 gain 118 185 -127.07 gain 185 118 -122.54 gain 118 186 -117.82 gain 186 118 -113.57 gain 118 187 -121.17 gain 187 118 -119.45 gain 118 188 -123.23 gain 188 118 -124.77 gain 118 189 -116.00 gain 189 118 -115.06 gain 118 190 -119.37 gain 190 118 -115.44 gain 118 191 -115.60 gain 191 118 -112.77 gain 118 192 -119.70 gain 192 118 -119.73 gain 118 193 -119.96 gain 193 118 -121.24 gain 118 194 -120.26 gain 194 118 -115.35 gain 118 195 -131.57 gain 195 118 -127.30 gain 118 196 -129.87 gain 196 118 -129.64 gain 118 197 -132.78 gain 197 118 -128.61 gain 118 198 -130.90 gain 198 118 -126.25 gain 118 199 -125.64 gain 199 118 -124.90 gain 118 200 -125.83 gain 200 118 -122.03 gain 118 201 -123.98 gain 201 118 -120.99 gain 118 202 -124.34 gain 202 118 -125.35 gain 118 203 -126.11 gain 203 118 -126.74 gain 118 204 -123.81 gain 204 118 -121.73 gain 118 205 -125.88 gain 205 118 -122.87 gain 118 206 -118.01 gain 206 118 -119.51 gain 118 207 -122.08 gain 207 118 -115.95 gain 118 208 -126.85 gain 208 118 -126.50 gain 118 209 -115.26 gain 209 118 -115.90 gain 118 210 -133.32 gain 210 118 -130.90 gain 118 211 -128.48 gain 211 118 -128.08 gain 118 212 -124.73 gain 212 118 -122.87 gain 118 213 -125.15 gain 213 118 -122.48 gain 118 214 -120.35 gain 214 118 -117.57 gain 118 215 -128.24 gain 215 118 -121.88 gain 118 216 -125.29 gain 216 118 -123.58 gain 118 217 -127.26 gain 217 118 -126.08 gain 118 218 -126.10 gain 218 118 -127.10 gain 118 219 -125.63 gain 219 118 -117.99 gain 118 220 -130.07 gain 220 118 -132.92 gain 118 221 -123.97 gain 221 118 -122.47 gain 118 222 -114.80 gain 222 118 -113.62 gain 118 223 -113.97 gain 223 118 -111.41 gain 118 224 -123.21 gain 224 118 -123.33 gain 119 120 -125.14 gain 120 119 -129.65 gain 119 121 -118.59 gain 121 119 -122.40 gain 119 122 -128.74 gain 122 119 -134.66 gain 119 123 -119.25 gain 123 119 -125.95 gain 119 124 -123.02 gain 124 119 -126.13 gain 119 125 -122.86 gain 125 119 -127.30 gain 119 126 -118.60 gain 126 119 -121.00 gain 119 127 -118.84 gain 127 119 -124.70 gain 119 128 -115.79 gain 128 119 -119.59 gain 119 129 -116.30 gain 129 119 -118.01 gain 119 130 -106.09 gain 130 119 -105.62 gain 119 131 -109.01 gain 131 119 -115.63 gain 119 132 -106.55 gain 132 119 -112.79 gain 119 133 -86.59 gain 133 119 -90.90 gain 119 134 -85.93 gain 134 119 -86.94 gain 119 135 -124.96 gain 135 119 -129.55 gain 119 136 -119.35 gain 136 119 -124.54 gain 119 137 -130.61 gain 137 119 -133.29 gain 119 138 -118.83 gain 138 119 -120.51 gain 119 139 -124.72 gain 139 119 -127.38 gain 119 140 -121.76 gain 140 119 -127.03 gain 119 141 -116.35 gain 141 119 -120.29 gain 119 142 -117.09 gain 142 119 -120.34 gain 119 143 -114.03 gain 143 119 -116.90 gain 119 144 -121.64 gain 144 119 -125.52 gain 119 145 -114.07 gain 145 119 -116.40 gain 119 146 -100.65 gain 146 119 -101.89 gain 119 147 -98.16 gain 147 119 -96.49 gain 119 148 -104.97 gain 148 119 -103.02 gain 119 149 -99.25 gain 149 119 -100.46 gain 119 150 -121.10 gain 150 119 -125.00 gain 119 151 -120.08 gain 151 119 -124.18 gain 119 152 -127.21 gain 152 119 -128.28 gain 119 153 -121.43 gain 153 119 -120.08 gain 119 154 -123.61 gain 154 119 -130.81 gain 119 155 -121.75 gain 155 119 -128.85 gain 119 156 -114.92 gain 156 119 -116.40 gain 119 157 -123.20 gain 157 119 -127.64 gain 119 158 -115.38 gain 158 119 -122.40 gain 119 159 -110.42 gain 159 119 -114.07 gain 119 160 -109.09 gain 160 119 -109.84 gain 119 161 -106.93 gain 161 119 -111.18 gain 119 162 -109.60 gain 162 119 -112.71 gain 119 163 -101.57 gain 163 119 -106.82 gain 119 164 -106.24 gain 164 119 -112.54 gain 119 165 -131.93 gain 165 119 -134.27 gain 119 166 -130.45 gain 166 119 -134.36 gain 119 167 -123.86 gain 167 119 -129.86 gain 119 168 -125.65 gain 168 119 -130.10 gain 119 169 -123.96 gain 169 119 -132.61 gain 119 170 -114.24 gain 170 119 -114.41 gain 119 171 -116.39 gain 171 119 -121.59 gain 119 172 -119.19 gain 172 119 -119.09 gain 119 173 -119.84 gain 173 119 -119.17 gain 119 174 -115.86 gain 174 119 -119.49 gain 119 175 -109.96 gain 175 119 -117.14 gain 119 176 -112.14 gain 176 119 -111.33 gain 119 177 -108.57 gain 177 119 -115.57 gain 119 178 -108.00 gain 178 119 -110.83 gain 119 179 -103.23 gain 179 119 -104.45 gain 119 180 -129.89 gain 180 119 -132.58 gain 119 181 -129.72 gain 181 119 -132.48 gain 119 182 -122.98 gain 182 119 -128.13 gain 119 183 -115.23 gain 183 119 -113.76 gain 119 184 -117.61 gain 184 119 -120.93 gain 119 185 -125.55 gain 185 119 -126.35 gain 119 186 -121.87 gain 186 119 -122.96 gain 119 187 -108.58 gain 187 119 -112.21 gain 119 188 -112.75 gain 188 119 -119.64 gain 119 189 -117.06 gain 189 119 -121.46 gain 119 190 -109.91 gain 190 119 -111.32 gain 119 191 -114.51 gain 191 119 -117.01 gain 119 192 -111.39 gain 192 119 -116.76 gain 119 193 -112.72 gain 193 119 -119.34 gain 119 194 -111.26 gain 194 119 -111.69 gain 119 195 -123.83 gain 195 119 -124.89 gain 119 196 -123.41 gain 196 119 -128.52 gain 119 197 -126.35 gain 197 119 -127.51 gain 119 198 -124.96 gain 198 119 -125.65 gain 119 199 -119.76 gain 199 119 -124.36 gain 119 200 -123.06 gain 200 119 -124.60 gain 119 201 -109.88 gain 201 119 -112.22 gain 119 202 -117.58 gain 202 119 -123.93 gain 119 203 -124.19 gain 203 119 -130.16 gain 119 204 -117.09 gain 204 119 -120.34 gain 119 205 -118.76 gain 205 119 -121.09 gain 119 206 -112.32 gain 206 119 -119.16 gain 119 207 -116.62 gain 207 119 -115.83 gain 119 208 -115.41 gain 208 119 -120.40 gain 119 209 -114.23 gain 209 119 -120.21 gain 119 210 -126.36 gain 210 119 -129.28 gain 119 211 -133.41 gain 211 119 -138.35 gain 119 212 -123.49 gain 212 119 -126.97 gain 119 213 -127.42 gain 213 119 -130.10 gain 119 214 -120.28 gain 214 119 -122.84 gain 119 215 -123.68 gain 215 119 -122.65 gain 119 216 -119.30 gain 216 119 -122.94 gain 119 217 -120.93 gain 217 119 -125.08 gain 119 218 -123.27 gain 218 119 -129.61 gain 119 219 -123.04 gain 219 119 -120.74 gain 119 220 -112.64 gain 220 119 -120.83 gain 119 221 -110.76 gain 221 119 -114.60 gain 119 222 -118.13 gain 222 119 -122.29 gain 119 223 -116.70 gain 223 119 -119.47 gain 119 224 -112.58 gain 224 119 -118.05 gain 120 121 -102.38 gain 121 120 -101.67 gain 120 122 -106.98 gain 122 120 -108.38 gain 120 123 -102.43 gain 123 120 -104.61 gain 120 124 -107.87 gain 124 120 -106.46 gain 120 125 -114.93 gain 125 120 -114.85 gain 120 126 -124.27 gain 126 120 -122.15 gain 120 127 -118.22 gain 127 120 -119.57 gain 120 128 -119.24 gain 128 120 -118.53 gain 120 129 -125.21 gain 129 120 -122.40 gain 120 130 -114.52 gain 130 120 -109.53 gain 120 131 -125.20 gain 131 120 -127.30 gain 120 132 -130.86 gain 132 120 -132.58 gain 120 133 -128.93 gain 133 120 -128.73 gain 120 134 -126.14 gain 134 120 -122.64 gain 120 135 -95.53 gain 135 120 -95.59 gain 120 136 -94.67 gain 136 120 -95.34 gain 120 137 -101.01 gain 137 120 -99.17 gain 120 138 -112.19 gain 138 120 -109.35 gain 120 139 -116.57 gain 139 120 -114.71 gain 120 140 -119.38 gain 140 120 -120.14 gain 120 141 -122.92 gain 141 120 -122.35 gain 120 142 -116.06 gain 142 120 -114.79 gain 120 143 -119.09 gain 143 120 -117.44 gain 120 144 -126.98 gain 144 120 -126.35 gain 120 145 -129.84 gain 145 120 -127.66 gain 120 146 -123.02 gain 146 120 -119.74 gain 120 147 -129.46 gain 147 120 -123.27 gain 120 148 -130.70 gain 148 120 -124.24 gain 120 149 -129.33 gain 149 120 -126.03 gain 120 150 -106.70 gain 150 120 -106.09 gain 120 151 -110.27 gain 151 120 -109.85 gain 120 152 -102.15 gain 152 120 -98.71 gain 120 153 -106.89 gain 153 120 -101.03 gain 120 154 -113.49 gain 154 120 -116.17 gain 120 155 -112.86 gain 155 120 -115.44 gain 120 156 -120.28 gain 156 120 -117.25 gain 120 157 -119.79 gain 157 120 -119.71 gain 120 158 -127.71 gain 158 120 -130.22 gain 120 159 -118.36 gain 159 120 -117.49 gain 120 160 -127.29 gain 160 120 -123.53 gain 120 161 -129.80 gain 161 120 -129.53 gain 120 162 -129.76 gain 162 120 -128.36 gain 120 163 -122.33 gain 163 120 -123.07 gain 120 164 -124.40 gain 164 120 -126.19 gain 120 165 -110.81 gain 165 120 -108.63 gain 120 166 -110.86 gain 166 120 -110.25 gain 120 167 -111.43 gain 167 120 -112.91 gain 120 168 -116.35 gain 168 120 -116.28 gain 120 169 -115.37 gain 169 120 -119.50 gain 120 170 -116.19 gain 170 120 -111.85 gain 120 171 -120.13 gain 171 120 -120.82 gain 120 172 -129.36 gain 172 120 -124.74 gain 120 173 -123.76 gain 173 120 -118.57 gain 120 174 -128.80 gain 174 120 -127.91 gain 120 175 -122.69 gain 175 120 -125.36 gain 120 176 -131.32 gain 176 120 -126.00 gain 120 177 -130.80 gain 177 120 -133.28 gain 120 178 -126.44 gain 178 120 -124.75 gain 120 179 -130.32 gain 179 120 -127.03 gain 120 180 -113.94 gain 180 120 -112.11 gain 120 181 -113.74 gain 181 120 -111.98 gain 120 182 -113.75 gain 182 120 -114.38 gain 120 183 -111.65 gain 183 120 -105.67 gain 120 184 -108.93 gain 184 120 -107.73 gain 120 185 -124.21 gain 185 120 -120.49 gain 120 186 -118.08 gain 186 120 -114.64 gain 120 187 -123.22 gain 187 120 -122.33 gain 120 188 -119.06 gain 188 120 -121.43 gain 120 189 -120.52 gain 189 120 -120.40 gain 120 190 -126.17 gain 190 120 -123.07 gain 120 191 -125.61 gain 191 120 -123.59 gain 120 192 -130.58 gain 192 120 -131.43 gain 120 193 -131.19 gain 193 120 -133.30 gain 120 194 -122.46 gain 194 120 -118.37 gain 120 195 -117.52 gain 195 120 -114.07 gain 120 196 -117.46 gain 196 120 -118.05 gain 120 197 -117.76 gain 197 120 -114.41 gain 120 198 -114.82 gain 198 120 -110.99 gain 120 199 -119.38 gain 199 120 -119.46 gain 120 200 -122.59 gain 200 120 -119.62 gain 120 201 -116.28 gain 201 120 -114.11 gain 120 202 -118.55 gain 202 120 -120.38 gain 120 203 -123.82 gain 203 120 -125.27 gain 120 204 -123.46 gain 204 120 -122.20 gain 120 205 -123.35 gain 205 120 -121.16 gain 120 206 -128.17 gain 206 120 -130.50 gain 120 207 -128.77 gain 207 120 -123.46 gain 120 208 -127.99 gain 208 120 -128.46 gain 120 209 -136.36 gain 209 120 -137.82 gain 120 210 -121.51 gain 210 120 -119.91 gain 120 211 -116.09 gain 211 120 -116.51 gain 120 212 -119.12 gain 212 120 -118.08 gain 120 213 -114.84 gain 213 120 -112.99 gain 120 214 -116.50 gain 214 120 -114.54 gain 120 215 -117.89 gain 215 120 -112.35 gain 120 216 -121.30 gain 216 120 -120.42 gain 120 217 -126.91 gain 217 120 -126.54 gain 120 218 -131.85 gain 218 120 -133.68 gain 120 219 -131.38 gain 219 120 -124.56 gain 120 220 -122.44 gain 220 120 -126.11 gain 120 221 -130.01 gain 221 120 -129.33 gain 120 222 -141.62 gain 222 120 -141.26 gain 120 223 -129.48 gain 223 120 -127.74 gain 120 224 -123.83 gain 224 120 -124.78 gain 121 122 -92.30 gain 122 121 -94.41 gain 121 123 -99.38 gain 123 121 -102.27 gain 121 124 -110.67 gain 124 121 -109.98 gain 121 125 -112.05 gain 125 121 -112.69 gain 121 126 -117.53 gain 126 121 -116.12 gain 121 127 -107.89 gain 127 121 -109.95 gain 121 128 -123.61 gain 128 121 -123.61 gain 121 129 -116.31 gain 129 121 -114.21 gain 121 130 -117.18 gain 130 121 -112.91 gain 121 131 -123.34 gain 131 121 -126.15 gain 121 132 -131.94 gain 132 121 -134.38 gain 121 133 -126.78 gain 133 121 -127.29 gain 121 134 -129.83 gain 134 121 -127.04 gain 121 135 -100.10 gain 135 121 -100.88 gain 121 136 -92.41 gain 136 121 -93.80 gain 121 137 -106.06 gain 137 121 -104.93 gain 121 138 -105.02 gain 138 121 -102.90 gain 121 139 -110.35 gain 139 121 -109.21 gain 121 140 -114.14 gain 140 121 -115.60 gain 121 141 -113.70 gain 141 121 -113.84 gain 121 142 -115.05 gain 142 121 -114.49 gain 121 143 -124.46 gain 143 121 -123.52 gain 121 144 -117.48 gain 144 121 -117.56 gain 121 145 -125.14 gain 145 121 -123.66 gain 121 146 -117.58 gain 146 121 -115.01 gain 121 147 -124.39 gain 147 121 -118.91 gain 121 148 -122.72 gain 148 121 -116.96 gain 121 149 -130.45 gain 149 121 -127.86 gain 121 150 -113.80 gain 150 121 -113.90 gain 121 151 -108.91 gain 151 121 -109.20 gain 121 152 -105.85 gain 152 121 -103.12 gain 121 153 -109.00 gain 153 121 -103.85 gain 121 154 -109.54 gain 154 121 -112.93 gain 121 155 -113.77 gain 155 121 -117.06 gain 121 156 -117.40 gain 156 121 -115.08 gain 121 157 -113.56 gain 157 121 -114.19 gain 121 158 -115.19 gain 158 121 -118.41 gain 121 159 -123.28 gain 159 121 -123.12 gain 121 160 -125.27 gain 160 121 -122.21 gain 121 161 -131.19 gain 161 121 -131.63 gain 121 162 -125.18 gain 162 121 -124.49 gain 121 163 -128.13 gain 163 121 -129.58 gain 121 164 -126.79 gain 164 121 -129.29 gain 121 165 -112.95 gain 165 121 -111.49 gain 121 166 -106.62 gain 166 121 -106.72 gain 121 167 -108.41 gain 167 121 -110.60 gain 121 168 -109.66 gain 168 121 -110.31 gain 121 169 -114.45 gain 169 121 -119.30 gain 121 170 -111.88 gain 170 121 -108.25 gain 121 171 -116.00 gain 171 121 -117.40 gain 121 172 -115.22 gain 172 121 -111.31 gain 121 173 -118.96 gain 173 121 -114.49 gain 121 174 -120.20 gain 174 121 -120.03 gain 121 175 -123.30 gain 175 121 -126.68 gain 121 176 -125.01 gain 176 121 -120.40 gain 121 177 -131.88 gain 177 121 -135.08 gain 121 178 -127.30 gain 178 121 -126.33 gain 121 179 -133.09 gain 179 121 -130.51 gain 121 180 -110.65 gain 180 121 -109.53 gain 121 181 -115.71 gain 181 121 -114.66 gain 121 182 -108.29 gain 182 121 -109.63 gain 121 183 -110.10 gain 183 121 -104.83 gain 121 184 -123.96 gain 184 121 -123.47 gain 121 185 -110.63 gain 185 121 -107.63 gain 121 186 -113.86 gain 186 121 -111.14 gain 121 187 -121.09 gain 187 121 -120.91 gain 121 188 -124.12 gain 188 121 -127.20 gain 121 189 -126.60 gain 189 121 -127.20 gain 121 190 -120.82 gain 190 121 -118.43 gain 121 191 -123.92 gain 191 121 -122.62 gain 121 192 -124.86 gain 192 121 -126.42 gain 121 193 -126.13 gain 193 121 -128.95 gain 121 194 -135.25 gain 194 121 -131.88 gain 121 195 -111.80 gain 195 121 -109.06 gain 121 196 -117.84 gain 196 121 -119.14 gain 121 197 -115.08 gain 197 121 -112.44 gain 121 198 -121.97 gain 198 121 -118.85 gain 121 199 -113.09 gain 199 121 -113.89 gain 121 200 -120.60 gain 200 121 -118.34 gain 121 201 -122.26 gain 201 121 -120.81 gain 121 202 -118.54 gain 202 121 -121.09 gain 121 203 -123.25 gain 203 121 -125.42 gain 121 204 -120.69 gain 204 121 -120.14 gain 121 205 -122.90 gain 205 121 -121.42 gain 121 206 -128.19 gain 206 121 -131.24 gain 121 207 -120.38 gain 207 121 -115.79 gain 121 208 -125.87 gain 208 121 -127.05 gain 121 209 -123.76 gain 209 121 -125.93 gain 121 210 -117.71 gain 210 121 -116.82 gain 121 211 -116.38 gain 211 121 -117.52 gain 121 212 -121.44 gain 212 121 -121.12 gain 121 213 -119.52 gain 213 121 -118.38 gain 121 214 -122.53 gain 214 121 -121.28 gain 121 215 -122.99 gain 215 121 -118.16 gain 121 216 -118.83 gain 216 121 -118.66 gain 121 217 -118.75 gain 217 121 -119.10 gain 121 218 -127.95 gain 218 121 -130.49 gain 121 219 -121.11 gain 219 121 -115.01 gain 121 220 -127.93 gain 220 121 -132.32 gain 121 221 -122.16 gain 221 121 -122.19 gain 121 222 -126.74 gain 222 121 -127.10 gain 121 223 -133.12 gain 223 121 -132.10 gain 121 224 -120.60 gain 224 121 -122.26 gain 122 123 -98.17 gain 123 122 -98.95 gain 122 124 -103.75 gain 124 122 -100.94 gain 122 125 -105.41 gain 125 122 -103.93 gain 122 126 -114.86 gain 126 122 -111.33 gain 122 127 -121.89 gain 127 122 -121.83 gain 122 128 -119.56 gain 128 122 -117.44 gain 122 129 -116.91 gain 129 122 -112.70 gain 122 130 -126.71 gain 130 122 -120.32 gain 122 131 -127.31 gain 131 122 -128.01 gain 122 132 -121.12 gain 132 122 -121.44 gain 122 133 -123.65 gain 133 122 -122.05 gain 122 134 -129.83 gain 134 122 -124.92 gain 122 135 -121.16 gain 135 122 -119.82 gain 122 136 -106.14 gain 136 122 -105.42 gain 122 137 -94.55 gain 137 122 -91.31 gain 122 138 -100.46 gain 138 122 -96.21 gain 122 139 -109.12 gain 139 122 -105.86 gain 122 140 -110.81 gain 140 122 -110.16 gain 122 141 -111.12 gain 141 122 -109.14 gain 122 142 -115.43 gain 142 122 -112.76 gain 122 143 -119.55 gain 143 122 -116.50 gain 122 144 -126.14 gain 144 122 -124.10 gain 122 145 -120.29 gain 145 122 -116.70 gain 122 146 -123.12 gain 146 122 -118.44 gain 122 147 -133.63 gain 147 122 -126.04 gain 122 148 -126.24 gain 148 122 -118.37 gain 122 149 -125.74 gain 149 122 -121.04 gain 122 150 -106.53 gain 150 122 -104.51 gain 122 151 -104.84 gain 151 122 -103.02 gain 122 152 -112.91 gain 152 122 -108.06 gain 122 153 -101.09 gain 153 122 -93.82 gain 122 154 -115.88 gain 154 122 -117.16 gain 122 155 -116.85 gain 155 122 -118.03 gain 122 156 -112.32 gain 156 122 -107.89 gain 122 157 -118.88 gain 157 122 -117.39 gain 122 158 -114.35 gain 158 122 -115.45 gain 122 159 -129.74 gain 159 122 -127.47 gain 122 160 -115.89 gain 160 122 -110.73 gain 122 161 -124.75 gain 161 122 -123.07 gain 122 162 -127.16 gain 162 122 -124.35 gain 122 163 -128.53 gain 163 122 -127.86 gain 122 164 -128.77 gain 164 122 -129.15 gain 122 165 -104.09 gain 165 122 -100.51 gain 122 166 -106.67 gain 166 122 -104.66 gain 122 167 -107.63 gain 167 122 -107.71 gain 122 168 -108.89 gain 168 122 -107.43 gain 122 169 -114.66 gain 169 122 -117.39 gain 122 170 -116.28 gain 170 122 -110.54 gain 122 171 -116.62 gain 171 122 -115.90 gain 122 172 -111.63 gain 172 122 -105.61 gain 122 173 -113.32 gain 173 122 -106.73 gain 122 174 -119.09 gain 174 122 -116.80 gain 122 175 -128.39 gain 175 122 -129.65 gain 122 176 -121.21 gain 176 122 -114.48 gain 122 177 -126.63 gain 177 122 -127.71 gain 122 178 -130.56 gain 178 122 -127.47 gain 122 179 -137.05 gain 179 122 -132.35 gain 122 180 -117.08 gain 180 122 -113.85 gain 122 181 -117.52 gain 181 122 -114.36 gain 122 182 -115.27 gain 182 122 -114.49 gain 122 183 -113.45 gain 183 122 -106.06 gain 122 184 -113.62 gain 184 122 -111.01 gain 122 185 -119.52 gain 185 122 -114.40 gain 122 186 -119.39 gain 186 122 -114.55 gain 122 187 -122.35 gain 187 122 -120.06 gain 122 188 -132.10 gain 188 122 -133.07 gain 122 189 -129.03 gain 189 122 -127.51 gain 122 190 -121.82 gain 190 122 -117.32 gain 122 191 -129.92 gain 191 122 -126.51 gain 122 192 -128.39 gain 192 122 -127.84 gain 122 193 -129.00 gain 193 122 -129.70 gain 122 194 -132.96 gain 194 122 -127.47 gain 122 195 -120.13 gain 195 122 -115.27 gain 122 196 -114.34 gain 196 122 -113.53 gain 122 197 -120.14 gain 197 122 -115.39 gain 122 198 -121.91 gain 198 122 -116.68 gain 122 199 -120.19 gain 199 122 -118.88 gain 122 200 -114.57 gain 200 122 -110.20 gain 122 201 -118.93 gain 201 122 -115.36 gain 122 202 -125.31 gain 202 122 -125.74 gain 122 203 -122.13 gain 203 122 -122.18 gain 122 204 -132.90 gain 204 122 -130.24 gain 122 205 -127.07 gain 205 122 -123.47 gain 122 206 -121.60 gain 206 122 -122.53 gain 122 207 -130.42 gain 207 122 -123.71 gain 122 208 -133.75 gain 208 122 -132.82 gain 122 209 -130.80 gain 209 122 -130.86 gain 122 210 -116.42 gain 210 122 -113.41 gain 122 211 -128.00 gain 211 122 -127.02 gain 122 212 -112.65 gain 212 122 -110.21 gain 122 213 -121.15 gain 213 122 -117.91 gain 122 214 -120.93 gain 214 122 -117.57 gain 122 215 -112.72 gain 215 122 -105.78 gain 122 216 -117.84 gain 216 122 -115.56 gain 122 217 -123.36 gain 217 122 -121.59 gain 122 218 -122.23 gain 218 122 -122.65 gain 122 219 -120.45 gain 219 122 -112.23 gain 122 220 -128.47 gain 220 122 -130.74 gain 122 221 -124.72 gain 221 122 -122.64 gain 122 222 -131.06 gain 222 122 -129.30 gain 122 223 -122.97 gain 223 122 -119.82 gain 122 224 -134.48 gain 224 122 -134.03 gain 123 124 -101.65 gain 124 123 -98.06 gain 123 125 -105.91 gain 125 123 -103.66 gain 123 126 -113.71 gain 126 123 -109.41 gain 123 127 -118.34 gain 127 123 -117.50 gain 123 128 -112.88 gain 128 123 -109.98 gain 123 129 -120.84 gain 129 123 -115.84 gain 123 130 -117.98 gain 130 123 -110.81 gain 123 131 -127.41 gain 131 123 -127.33 gain 123 132 -128.29 gain 132 123 -127.84 gain 123 133 -129.01 gain 133 123 -126.63 gain 123 134 -127.81 gain 134 123 -122.13 gain 123 135 -113.12 gain 135 123 -111.01 gain 123 136 -108.18 gain 136 123 -106.68 gain 123 137 -103.68 gain 137 123 -99.66 gain 123 138 -95.33 gain 138 123 -90.31 gain 123 139 -100.10 gain 139 123 -96.07 gain 123 140 -107.88 gain 140 123 -106.45 gain 123 141 -114.10 gain 141 123 -111.35 gain 123 142 -112.44 gain 142 123 -108.99 gain 123 143 -117.78 gain 143 123 -113.95 gain 123 144 -117.41 gain 144 123 -114.59 gain 123 145 -121.92 gain 145 123 -117.56 gain 123 146 -120.79 gain 146 123 -115.33 gain 123 147 -125.58 gain 147 123 -117.21 gain 123 148 -128.79 gain 148 123 -120.14 gain 123 149 -134.52 gain 149 123 -129.04 gain 123 150 -111.87 gain 150 123 -109.08 gain 123 151 -111.28 gain 151 123 -108.68 gain 123 152 -106.29 gain 152 123 -100.67 gain 123 153 -105.12 gain 153 123 -97.07 gain 123 154 -102.86 gain 154 123 -103.37 gain 123 155 -113.99 gain 155 123 -114.39 gain 123 156 -116.86 gain 156 123 -111.65 gain 123 157 -122.27 gain 157 123 -120.00 gain 123 158 -118.78 gain 158 123 -119.11 gain 123 159 -125.87 gain 159 123 -122.81 gain 123 160 -126.12 gain 160 123 -120.17 gain 123 161 -119.83 gain 161 123 -117.37 gain 123 162 -131.62 gain 162 123 -128.03 gain 123 163 -136.60 gain 163 123 -135.16 gain 123 164 -129.35 gain 164 123 -128.95 gain 123 165 -113.96 gain 165 123 -109.60 gain 123 166 -113.31 gain 166 123 -110.52 gain 123 167 -108.58 gain 167 123 -107.88 gain 123 168 -108.39 gain 168 123 -106.14 gain 123 169 -112.10 gain 169 123 -114.05 gain 123 170 -116.66 gain 170 123 -110.14 gain 123 171 -118.79 gain 171 123 -117.29 gain 123 172 -119.14 gain 172 123 -112.34 gain 123 173 -119.35 gain 173 123 -111.99 gain 123 174 -127.44 gain 174 123 -124.38 gain 123 175 -123.99 gain 175 123 -124.47 gain 123 176 -125.79 gain 176 123 -118.29 gain 123 177 -124.36 gain 177 123 -124.66 gain 123 178 -119.27 gain 178 123 -115.40 gain 123 179 -125.10 gain 179 123 -119.62 gain 123 180 -119.54 gain 180 123 -115.54 gain 123 181 -109.55 gain 181 123 -105.61 gain 123 182 -114.94 gain 182 123 -113.39 gain 123 183 -108.54 gain 183 123 -100.37 gain 123 184 -117.42 gain 184 123 -114.04 gain 123 185 -117.30 gain 185 123 -111.40 gain 123 186 -122.82 gain 186 123 -117.21 gain 123 187 -125.01 gain 187 123 -121.94 gain 123 188 -122.94 gain 188 123 -123.13 gain 123 189 -122.80 gain 189 123 -120.50 gain 123 190 -125.63 gain 190 123 -120.35 gain 123 191 -125.25 gain 191 123 -121.05 gain 123 192 -128.10 gain 192 123 -126.77 gain 123 193 -129.31 gain 193 123 -129.24 gain 123 194 -129.71 gain 194 123 -123.45 gain 123 195 -119.68 gain 195 123 -114.05 gain 123 196 -111.80 gain 196 123 -110.20 gain 123 197 -116.96 gain 197 123 -111.43 gain 123 198 -119.36 gain 198 123 -113.35 gain 123 199 -114.19 gain 199 123 -112.10 gain 123 200 -119.66 gain 200 123 -114.51 gain 123 201 -123.61 gain 201 123 -119.26 gain 123 202 -116.34 gain 202 123 -115.99 gain 123 203 -118.01 gain 203 123 -117.29 gain 123 204 -125.44 gain 204 123 -121.99 gain 123 205 -114.35 gain 205 123 -109.98 gain 123 206 -126.70 gain 206 123 -126.85 gain 123 207 -134.11 gain 207 123 -126.62 gain 123 208 -123.18 gain 208 123 -121.47 gain 123 209 -132.04 gain 209 123 -131.32 gain 123 210 -129.64 gain 210 123 -125.86 gain 123 211 -116.74 gain 211 123 -114.98 gain 123 212 -115.12 gain 212 123 -111.90 gain 123 213 -121.88 gain 213 123 -117.85 gain 123 214 -126.37 gain 214 123 -122.23 gain 123 215 -126.20 gain 215 123 -118.48 gain 123 216 -116.57 gain 216 123 -113.51 gain 123 217 -123.40 gain 217 123 -120.86 gain 123 218 -124.22 gain 218 123 -123.87 gain 123 219 -122.15 gain 219 123 -113.16 gain 123 220 -132.27 gain 220 123 -133.77 gain 123 221 -124.13 gain 221 123 -121.27 gain 123 222 -130.99 gain 222 123 -128.46 gain 123 223 -121.27 gain 223 123 -117.35 gain 123 224 -125.01 gain 224 123 -123.78 gain 124 125 -91.97 gain 125 124 -93.31 gain 124 126 -103.03 gain 126 124 -102.32 gain 124 127 -103.65 gain 127 124 -106.41 gain 124 128 -104.87 gain 128 124 -105.56 gain 124 129 -111.57 gain 129 124 -110.17 gain 124 130 -120.66 gain 130 124 -117.09 gain 124 131 -117.49 gain 131 124 -121.00 gain 124 132 -124.37 gain 132 124 -127.51 gain 124 133 -124.50 gain 133 124 -125.71 gain 124 134 -124.83 gain 134 124 -122.74 gain 124 135 -108.03 gain 135 124 -109.51 gain 124 136 -101.44 gain 136 124 -103.53 gain 124 137 -106.09 gain 137 124 -105.66 gain 124 138 -94.77 gain 138 124 -93.34 gain 124 139 -93.85 gain 139 124 -93.41 gain 124 140 -107.87 gain 140 124 -110.03 gain 124 141 -111.42 gain 141 124 -112.26 gain 124 142 -115.47 gain 142 124 -115.61 gain 124 143 -112.51 gain 143 124 -112.27 gain 124 144 -116.36 gain 144 124 -117.14 gain 124 145 -117.98 gain 145 124 -117.21 gain 124 146 -112.97 gain 146 124 -111.10 gain 124 147 -121.34 gain 147 124 -116.57 gain 124 148 -121.65 gain 148 124 -116.60 gain 124 149 -117.19 gain 149 124 -115.30 gain 124 150 -119.82 gain 150 124 -120.62 gain 124 151 -123.80 gain 151 124 -124.79 gain 124 152 -109.37 gain 152 124 -107.34 gain 124 153 -104.23 gain 153 124 -99.78 gain 124 154 -99.64 gain 154 124 -103.73 gain 124 155 -107.35 gain 155 124 -111.34 gain 124 156 -108.36 gain 156 124 -106.74 gain 124 157 -115.79 gain 157 124 -117.12 gain 124 158 -116.24 gain 158 124 -120.15 gain 124 159 -117.50 gain 159 124 -118.04 gain 124 160 -116.92 gain 160 124 -114.57 gain 124 161 -120.99 gain 161 124 -122.12 gain 124 162 -118.56 gain 162 124 -118.56 gain 124 163 -124.82 gain 163 124 -126.98 gain 124 164 -123.85 gain 164 124 -127.04 gain 124 165 -122.51 gain 165 124 -121.75 gain 124 166 -109.54 gain 166 124 -110.34 gain 124 167 -111.72 gain 167 124 -114.61 gain 124 168 -106.86 gain 168 124 -108.20 gain 124 169 -112.12 gain 169 124 -117.66 gain 124 170 -103.66 gain 170 124 -100.73 gain 124 171 -108.03 gain 171 124 -110.12 gain 124 172 -117.24 gain 172 124 -114.03 gain 124 173 -108.01 gain 173 124 -104.23 gain 124 174 -117.27 gain 174 124 -117.79 gain 124 175 -118.76 gain 175 124 -122.84 gain 124 176 -115.43 gain 176 124 -111.51 gain 124 177 -117.70 gain 177 124 -121.60 gain 124 178 -122.33 gain 178 124 -122.05 gain 124 179 -124.39 gain 179 124 -122.50 gain 124 180 -119.75 gain 180 124 -119.34 gain 124 181 -112.56 gain 181 124 -112.21 gain 124 182 -114.74 gain 182 124 -116.77 gain 124 183 -113.40 gain 183 124 -108.83 gain 124 184 -106.32 gain 184 124 -106.52 gain 124 185 -117.96 gain 185 124 -115.65 gain 124 186 -109.45 gain 186 124 -107.43 gain 124 187 -114.89 gain 187 124 -115.41 gain 124 188 -115.00 gain 188 124 -118.78 gain 124 189 -115.84 gain 189 124 -117.14 gain 124 190 -112.30 gain 190 124 -110.61 gain 124 191 -113.95 gain 191 124 -113.35 gain 124 192 -116.70 gain 192 124 -118.96 gain 124 193 -125.52 gain 193 124 -129.03 gain 124 194 -129.74 gain 194 124 -127.06 gain 124 195 -115.18 gain 195 124 -113.13 gain 124 196 -118.21 gain 196 124 -120.21 gain 124 197 -123.32 gain 197 124 -121.38 gain 124 198 -117.37 gain 198 124 -114.95 gain 124 199 -113.62 gain 199 124 -115.12 gain 124 200 -112.28 gain 200 124 -110.72 gain 124 201 -112.22 gain 201 124 -111.46 gain 124 202 -119.32 gain 202 124 -122.56 gain 124 203 -111.28 gain 203 124 -114.14 gain 124 204 -119.55 gain 204 124 -119.70 gain 124 205 -114.98 gain 205 124 -114.20 gain 124 206 -120.59 gain 206 124 -124.33 gain 124 207 -118.43 gain 207 124 -114.53 gain 124 208 -116.37 gain 208 124 -118.25 gain 124 209 -112.32 gain 209 124 -115.19 gain 124 210 -115.09 gain 210 124 -114.90 gain 124 211 -113.26 gain 211 124 -115.09 gain 124 212 -118.65 gain 212 124 -119.02 gain 124 213 -117.52 gain 213 124 -117.09 gain 124 214 -108.93 gain 214 124 -108.38 gain 124 215 -116.25 gain 215 124 -112.12 gain 124 216 -113.30 gain 216 124 -113.83 gain 124 217 -118.78 gain 217 124 -119.83 gain 124 218 -119.11 gain 218 124 -122.34 gain 124 219 -124.26 gain 219 124 -118.86 gain 124 220 -122.42 gain 220 124 -127.50 gain 124 221 -119.54 gain 221 124 -120.27 gain 124 222 -121.08 gain 222 124 -122.13 gain 124 223 -116.62 gain 223 124 -116.29 gain 124 224 -120.82 gain 224 124 -123.17 gain 125 126 -100.31 gain 126 125 -98.27 gain 125 127 -108.62 gain 127 125 -110.04 gain 125 128 -111.00 gain 128 125 -110.36 gain 125 129 -114.68 gain 129 125 -111.94 gain 125 130 -123.01 gain 130 125 -118.10 gain 125 131 -119.63 gain 131 125 -121.80 gain 125 132 -122.49 gain 132 125 -124.29 gain 125 133 -121.86 gain 133 125 -121.73 gain 125 134 -126.33 gain 134 125 -122.90 gain 125 135 -113.61 gain 135 125 -113.75 gain 125 136 -111.49 gain 136 125 -112.24 gain 125 137 -105.20 gain 137 125 -103.43 gain 125 138 -100.61 gain 138 125 -97.84 gain 125 139 -92.54 gain 139 125 -90.76 gain 125 140 -97.39 gain 140 125 -98.22 gain 125 141 -100.83 gain 141 125 -100.33 gain 125 142 -103.04 gain 142 125 -101.84 gain 125 143 -106.97 gain 143 125 -105.39 gain 125 144 -111.02 gain 144 125 -110.46 gain 125 145 -116.38 gain 145 125 -114.27 gain 125 146 -120.20 gain 146 125 -117.00 gain 125 147 -119.24 gain 147 125 -113.13 gain 125 148 -120.43 gain 148 125 -114.03 gain 125 149 -119.39 gain 149 125 -116.16 gain 125 150 -116.41 gain 150 125 -115.87 gain 125 151 -117.51 gain 151 125 -117.17 gain 125 152 -107.14 gain 152 125 -103.77 gain 125 153 -118.21 gain 153 125 -112.42 gain 125 154 -104.72 gain 154 125 -107.48 gain 125 155 -100.73 gain 155 125 -103.38 gain 125 156 -111.52 gain 156 125 -108.57 gain 125 157 -108.31 gain 157 125 -108.29 gain 125 158 -115.77 gain 158 125 -118.35 gain 125 159 -117.92 gain 159 125 -117.12 gain 125 160 -118.80 gain 160 125 -115.11 gain 125 161 -120.01 gain 161 125 -119.81 gain 125 162 -119.57 gain 162 125 -118.24 gain 125 163 -119.88 gain 163 125 -120.69 gain 125 164 -120.11 gain 164 125 -121.96 gain 125 165 -116.28 gain 165 125 -114.18 gain 125 166 -112.42 gain 166 125 -111.89 gain 125 167 -110.60 gain 167 125 -112.16 gain 125 168 -112.81 gain 168 125 -112.82 gain 125 169 -110.49 gain 169 125 -114.70 gain 125 170 -116.09 gain 170 125 -111.82 gain 125 171 -103.38 gain 171 125 -104.13 gain 125 172 -114.02 gain 172 125 -109.47 gain 125 173 -107.49 gain 173 125 -102.38 gain 125 174 -110.59 gain 174 125 -109.78 gain 125 175 -111.15 gain 175 125 -113.89 gain 125 176 -124.24 gain 176 125 -118.99 gain 125 177 -120.06 gain 177 125 -122.63 gain 125 178 -123.83 gain 178 125 -122.21 gain 125 179 -119.75 gain 179 125 -116.53 gain 125 180 -113.67 gain 180 125 -111.91 gain 125 181 -121.02 gain 181 125 -119.34 gain 125 182 -121.63 gain 182 125 -122.34 gain 125 183 -111.38 gain 183 125 -105.47 gain 125 184 -112.07 gain 184 125 -110.95 gain 125 185 -113.71 gain 185 125 -110.07 gain 125 186 -117.74 gain 186 125 -114.38 gain 125 187 -118.58 gain 187 125 -117.76 gain 125 188 -117.29 gain 188 125 -119.74 gain 125 189 -122.08 gain 189 125 -122.04 gain 125 190 -119.06 gain 190 125 -116.02 gain 125 191 -118.54 gain 191 125 -116.60 gain 125 192 -122.98 gain 192 125 -123.91 gain 125 193 -124.56 gain 193 125 -126.74 gain 125 194 -118.58 gain 194 125 -114.57 gain 125 195 -128.61 gain 195 125 -125.23 gain 125 196 -120.02 gain 196 125 -120.69 gain 125 197 -116.14 gain 197 125 -112.86 gain 125 198 -120.41 gain 198 125 -116.65 gain 125 199 -115.01 gain 199 125 -115.17 gain 125 200 -114.60 gain 200 125 -111.70 gain 125 201 -111.05 gain 201 125 -108.95 gain 125 202 -113.90 gain 202 125 -115.81 gain 125 203 -122.15 gain 203 125 -123.68 gain 125 204 -119.45 gain 204 125 -118.26 gain 125 205 -123.85 gain 205 125 -121.74 gain 125 206 -120.93 gain 206 125 -123.34 gain 125 207 -118.88 gain 207 125 -113.65 gain 125 208 -123.71 gain 208 125 -124.25 gain 125 209 -118.52 gain 209 125 -120.05 gain 125 210 -120.85 gain 210 125 -119.32 gain 125 211 -118.84 gain 211 125 -119.34 gain 125 212 -128.68 gain 212 125 -127.72 gain 125 213 -121.12 gain 213 125 -119.35 gain 125 214 -123.15 gain 214 125 -121.27 gain 125 215 -118.34 gain 215 125 -112.88 gain 125 216 -122.62 gain 216 125 -121.81 gain 125 217 -118.23 gain 217 125 -117.94 gain 125 218 -114.49 gain 218 125 -116.39 gain 125 219 -118.47 gain 219 125 -111.73 gain 125 220 -118.01 gain 220 125 -121.76 gain 125 221 -125.50 gain 221 125 -124.89 gain 125 222 -127.29 gain 222 125 -127.01 gain 125 223 -121.34 gain 223 125 -119.68 gain 125 224 -127.96 gain 224 125 -128.98 gain 126 127 -93.33 gain 127 126 -96.80 gain 126 128 -98.98 gain 128 126 -100.38 gain 126 129 -110.41 gain 129 126 -109.72 gain 126 130 -114.92 gain 130 126 -112.06 gain 126 131 -112.98 gain 131 126 -117.20 gain 126 132 -118.20 gain 132 126 -122.04 gain 126 133 -116.69 gain 133 126 -118.60 gain 126 134 -115.21 gain 134 126 -113.83 gain 126 135 -116.84 gain 135 126 -119.02 gain 126 136 -119.42 gain 136 126 -122.22 gain 126 137 -109.78 gain 137 126 -110.06 gain 126 138 -108.72 gain 138 126 -108.00 gain 126 139 -106.18 gain 139 126 -106.45 gain 126 140 -92.68 gain 140 126 -95.55 gain 126 141 -98.27 gain 141 126 -99.82 gain 126 142 -89.19 gain 142 126 -90.05 gain 126 143 -99.70 gain 143 126 -100.17 gain 126 144 -105.28 gain 144 126 -106.77 gain 126 145 -108.17 gain 145 126 -108.11 gain 126 146 -112.62 gain 146 126 -111.47 gain 126 147 -117.07 gain 147 126 -113.00 gain 126 148 -116.32 gain 148 126 -111.97 gain 126 149 -110.26 gain 149 126 -109.08 gain 126 150 -113.68 gain 150 126 -115.18 gain 126 151 -110.75 gain 151 126 -112.46 gain 126 152 -113.40 gain 152 126 -112.08 gain 126 153 -105.39 gain 153 126 -101.65 gain 126 154 -104.57 gain 154 126 -109.37 gain 126 155 -104.04 gain 155 126 -108.74 gain 126 156 -96.19 gain 156 126 -95.27 gain 126 157 -102.83 gain 157 126 -104.86 gain 126 158 -104.53 gain 158 126 -109.16 gain 126 159 -116.49 gain 159 126 -117.74 gain 126 160 -112.27 gain 160 126 -110.63 gain 126 161 -113.23 gain 161 126 -115.08 gain 126 162 -115.53 gain 162 126 -116.24 gain 126 163 -111.87 gain 163 126 -114.74 gain 126 164 -114.07 gain 164 126 -117.97 gain 126 165 -119.25 gain 165 126 -119.19 gain 126 166 -113.21 gain 166 126 -114.72 gain 126 167 -114.56 gain 167 126 -118.17 gain 126 168 -113.44 gain 168 126 -115.50 gain 126 169 -106.40 gain 169 126 -112.65 gain 126 170 -106.00 gain 170 126 -103.78 gain 126 171 -104.44 gain 171 126 -107.25 gain 126 172 -101.58 gain 172 126 -99.08 gain 126 173 -119.02 gain 173 126 -115.96 gain 126 174 -116.89 gain 174 126 -118.12 gain 126 175 -111.05 gain 175 126 -115.83 gain 126 176 -116.60 gain 176 126 -113.40 gain 126 177 -116.39 gain 177 126 -121.00 gain 126 178 -116.29 gain 178 126 -116.72 gain 126 179 -127.22 gain 179 126 -126.04 gain 126 180 -117.84 gain 180 126 -118.14 gain 126 181 -114.14 gain 181 126 -114.50 gain 126 182 -114.58 gain 182 126 -117.32 gain 126 183 -114.03 gain 183 126 -110.16 gain 126 184 -109.39 gain 184 126 -110.30 gain 126 185 -114.79 gain 185 126 -113.19 gain 126 186 -110.42 gain 186 126 -109.11 gain 126 187 -109.09 gain 187 126 -110.32 gain 126 188 -113.59 gain 188 126 -118.08 gain 126 189 -120.03 gain 189 126 -122.03 gain 126 190 -120.40 gain 190 126 -119.42 gain 126 191 -115.40 gain 191 126 -115.51 gain 126 192 -115.50 gain 192 126 -118.48 gain 126 193 -124.40 gain 193 126 -128.62 gain 126 194 -119.91 gain 194 126 -117.95 gain 126 195 -123.63 gain 195 126 -122.29 gain 126 196 -118.94 gain 196 126 -121.65 gain 126 197 -119.07 gain 197 126 -117.84 gain 126 198 -121.24 gain 198 126 -119.53 gain 126 199 -116.28 gain 199 126 -118.48 gain 126 200 -114.02 gain 200 126 -113.16 gain 126 201 -112.58 gain 201 126 -112.53 gain 126 202 -113.00 gain 202 126 -116.96 gain 126 203 -115.46 gain 203 126 -119.04 gain 126 204 -117.57 gain 204 126 -118.43 gain 126 205 -120.41 gain 205 126 -120.34 gain 126 206 -119.60 gain 206 126 -124.05 gain 126 207 -116.33 gain 207 126 -113.15 gain 126 208 -124.47 gain 208 126 -127.06 gain 126 209 -123.64 gain 209 126 -127.22 gain 126 210 -124.01 gain 210 126 -124.53 gain 126 211 -121.51 gain 211 126 -124.05 gain 126 212 -117.71 gain 212 126 -118.79 gain 126 213 -109.39 gain 213 126 -109.66 gain 126 214 -116.11 gain 214 126 -116.27 gain 126 215 -121.76 gain 215 126 -118.33 gain 126 216 -119.47 gain 216 126 -120.71 gain 126 217 -122.82 gain 217 126 -124.57 gain 126 218 -120.44 gain 218 126 -124.39 gain 126 219 -119.53 gain 219 126 -114.84 gain 126 220 -115.93 gain 220 126 -121.73 gain 126 221 -114.55 gain 221 126 -115.99 gain 126 222 -119.80 gain 222 126 -121.57 gain 126 223 -118.98 gain 223 126 -119.36 gain 126 224 -122.50 gain 224 126 -125.57 gain 127 128 -99.26 gain 128 127 -97.20 gain 127 129 -104.48 gain 129 127 -100.32 gain 127 130 -111.21 gain 130 127 -104.88 gain 127 131 -116.65 gain 131 127 -117.41 gain 127 132 -117.64 gain 132 127 -118.02 gain 127 133 -119.73 gain 133 127 -118.18 gain 127 134 -128.33 gain 134 127 -123.49 gain 127 135 -117.55 gain 135 127 -116.28 gain 127 136 -122.95 gain 136 127 -122.29 gain 127 137 -125.73 gain 137 127 -122.55 gain 127 138 -117.24 gain 138 127 -113.06 gain 127 139 -107.47 gain 139 127 -104.27 gain 127 140 -109.91 gain 140 127 -109.32 gain 127 141 -98.86 gain 141 127 -96.95 gain 127 142 -96.63 gain 142 127 -94.02 gain 127 143 -103.81 gain 143 127 -100.81 gain 127 144 -108.48 gain 144 127 -106.50 gain 127 145 -109.12 gain 145 127 -105.59 gain 127 146 -120.11 gain 146 127 -115.49 gain 127 147 -122.59 gain 147 127 -115.06 gain 127 148 -114.84 gain 148 127 -107.03 gain 127 149 -119.36 gain 149 127 -114.72 gain 127 150 -122.70 gain 150 127 -120.75 gain 127 151 -116.17 gain 151 127 -114.41 gain 127 152 -122.95 gain 152 127 -118.17 gain 127 153 -120.23 gain 153 127 -113.03 gain 127 154 -112.97 gain 154 127 -114.31 gain 127 155 -108.89 gain 155 127 -110.13 gain 127 156 -108.28 gain 156 127 -103.90 gain 127 157 -101.89 gain 157 127 -100.46 gain 127 158 -103.53 gain 158 127 -104.69 gain 127 159 -112.33 gain 159 127 -110.11 gain 127 160 -110.58 gain 160 127 -105.47 gain 127 161 -118.28 gain 161 127 -116.67 gain 127 162 -114.45 gain 162 127 -111.70 gain 127 163 -115.57 gain 163 127 -114.96 gain 127 164 -116.81 gain 164 127 -117.25 gain 127 165 -124.93 gain 165 127 -121.41 gain 127 166 -120.57 gain 166 127 -118.62 gain 127 167 -123.58 gain 167 127 -123.72 gain 127 168 -123.51 gain 168 127 -122.10 gain 127 169 -116.54 gain 169 127 -119.33 gain 127 170 -104.98 gain 170 127 -99.30 gain 127 171 -111.30 gain 171 127 -110.64 gain 127 172 -104.06 gain 172 127 -98.10 gain 127 173 -109.52 gain 173 127 -102.99 gain 127 174 -111.37 gain 174 127 -109.13 gain 127 175 -106.79 gain 175 127 -108.11 gain 127 176 -115.03 gain 176 127 -108.36 gain 127 177 -123.68 gain 177 127 -124.82 gain 127 178 -126.18 gain 178 127 -123.15 gain 127 179 -122.64 gain 179 127 -118.00 gain 127 180 -117.46 gain 180 127 -114.29 gain 127 181 -128.69 gain 181 127 -125.59 gain 127 182 -114.62 gain 182 127 -113.91 gain 127 183 -121.94 gain 183 127 -114.61 gain 127 184 -114.78 gain 184 127 -112.24 gain 127 185 -112.02 gain 185 127 -106.96 gain 127 186 -109.10 gain 186 127 -104.33 gain 127 187 -112.51 gain 187 127 -110.28 gain 127 188 -118.56 gain 188 127 -119.58 gain 127 189 -119.68 gain 189 127 -118.22 gain 127 190 -120.46 gain 190 127 -116.01 gain 127 191 -117.27 gain 191 127 -113.91 gain 127 192 -120.30 gain 192 127 -119.81 gain 127 193 -119.66 gain 193 127 -120.42 gain 127 194 -122.18 gain 194 127 -116.75 gain 127 195 -127.31 gain 195 127 -122.51 gain 127 196 -123.22 gain 196 127 -122.46 gain 127 197 -120.97 gain 197 127 -116.27 gain 127 198 -112.56 gain 198 127 -107.39 gain 127 199 -120.94 gain 199 127 -119.69 gain 127 200 -115.05 gain 200 127 -110.74 gain 127 201 -111.55 gain 201 127 -108.03 gain 127 202 -121.61 gain 202 127 -122.10 gain 127 203 -118.23 gain 203 127 -118.34 gain 127 204 -118.94 gain 204 127 -116.33 gain 127 205 -117.93 gain 205 127 -114.40 gain 127 206 -125.84 gain 206 127 -126.82 gain 127 207 -122.48 gain 207 127 -115.83 gain 127 208 -126.89 gain 208 127 -126.02 gain 127 209 -125.18 gain 209 127 -125.30 gain 127 210 -127.01 gain 210 127 -124.07 gain 127 211 -124.90 gain 211 127 -123.98 gain 127 212 -122.85 gain 212 127 -120.47 gain 127 213 -130.75 gain 213 127 -127.56 gain 127 214 -119.90 gain 214 127 -116.60 gain 127 215 -117.34 gain 215 127 -110.46 gain 127 216 -121.53 gain 216 127 -119.31 gain 127 217 -117.90 gain 217 127 -116.20 gain 127 218 -117.41 gain 218 127 -117.90 gain 127 219 -115.92 gain 219 127 -107.76 gain 127 220 -116.24 gain 220 127 -118.57 gain 127 221 -124.87 gain 221 127 -122.85 gain 127 222 -132.09 gain 222 127 -130.40 gain 127 223 -119.37 gain 223 127 -116.29 gain 127 224 -121.16 gain 224 127 -120.77 gain 128 129 -94.21 gain 129 128 -92.12 gain 128 130 -103.19 gain 130 128 -98.93 gain 128 131 -102.60 gain 131 128 -105.42 gain 128 132 -114.56 gain 132 128 -117.01 gain 128 133 -117.39 gain 133 128 -117.90 gain 128 134 -121.70 gain 134 128 -118.91 gain 128 135 -125.11 gain 135 128 -125.89 gain 128 136 -124.62 gain 136 128 -126.01 gain 128 137 -124.05 gain 137 128 -122.93 gain 128 138 -117.22 gain 138 128 -115.10 gain 128 139 -111.04 gain 139 128 -109.90 gain 128 140 -110.55 gain 140 128 -112.02 gain 128 141 -110.93 gain 141 128 -111.07 gain 128 142 -97.84 gain 142 128 -97.29 gain 128 143 -94.75 gain 143 128 -93.81 gain 128 144 -94.90 gain 144 128 -94.99 gain 128 145 -103.47 gain 145 128 -102.00 gain 128 146 -112.00 gain 146 128 -109.44 gain 128 147 -119.24 gain 147 128 -113.78 gain 128 148 -123.38 gain 148 128 -117.63 gain 128 149 -115.40 gain 149 128 -112.82 gain 128 150 -115.07 gain 150 128 -115.18 gain 128 151 -124.73 gain 151 128 -125.03 gain 128 152 -119.92 gain 152 128 -117.20 gain 128 153 -113.97 gain 153 128 -108.82 gain 128 154 -122.15 gain 154 128 -125.55 gain 128 155 -111.46 gain 155 128 -114.76 gain 128 156 -113.03 gain 156 128 -110.72 gain 128 157 -93.43 gain 157 128 -94.06 gain 128 158 -99.47 gain 158 128 -102.70 gain 128 159 -98.94 gain 159 128 -98.78 gain 128 160 -103.06 gain 160 128 -100.02 gain 128 161 -106.70 gain 161 128 -107.14 gain 128 162 -112.16 gain 162 128 -111.47 gain 128 163 -112.88 gain 163 128 -114.34 gain 128 164 -111.93 gain 164 128 -114.43 gain 128 165 -119.60 gain 165 128 -118.14 gain 128 166 -123.49 gain 166 128 -123.60 gain 128 167 -121.34 gain 167 128 -123.54 gain 128 168 -121.44 gain 168 128 -122.10 gain 128 169 -118.65 gain 169 128 -123.50 gain 128 170 -110.48 gain 170 128 -106.86 gain 128 171 -106.22 gain 171 128 -107.62 gain 128 172 -111.63 gain 172 128 -107.73 gain 128 173 -107.74 gain 173 128 -103.27 gain 128 174 -110.38 gain 174 128 -110.21 gain 128 175 -113.23 gain 175 128 -116.62 gain 128 176 -112.15 gain 176 128 -107.55 gain 128 177 -117.27 gain 177 128 -120.48 gain 128 178 -116.38 gain 178 128 -115.41 gain 128 179 -119.05 gain 179 128 -116.48 gain 128 180 -116.80 gain 180 128 -115.69 gain 128 181 -120.93 gain 181 128 -119.89 gain 128 182 -119.38 gain 182 128 -120.73 gain 128 183 -122.06 gain 183 128 -116.80 gain 128 184 -111.04 gain 184 128 -110.56 gain 128 185 -104.67 gain 185 128 -101.68 gain 128 186 -117.09 gain 186 128 -114.38 gain 128 187 -111.35 gain 187 128 -111.18 gain 128 188 -110.08 gain 188 128 -113.17 gain 128 189 -109.38 gain 189 128 -109.98 gain 128 190 -115.89 gain 190 128 -113.50 gain 128 191 -114.88 gain 191 128 -113.59 gain 128 192 -116.37 gain 192 128 -117.95 gain 128 193 -119.93 gain 193 128 -122.75 gain 128 194 -124.89 gain 194 128 -121.53 gain 128 195 -119.61 gain 195 128 -116.88 gain 128 196 -114.29 gain 196 128 -115.60 gain 128 197 -125.38 gain 197 128 -122.75 gain 128 198 -120.96 gain 198 128 -117.86 gain 128 199 -119.48 gain 199 128 -120.29 gain 128 200 -123.47 gain 200 128 -121.21 gain 128 201 -114.13 gain 201 128 -112.68 gain 128 202 -120.01 gain 202 128 -122.56 gain 128 203 -114.14 gain 203 128 -116.31 gain 128 204 -119.21 gain 204 128 -118.67 gain 128 205 -117.60 gain 205 128 -116.13 gain 128 206 -115.60 gain 206 128 -118.65 gain 128 207 -121.22 gain 207 128 -116.63 gain 128 208 -120.51 gain 208 128 -121.70 gain 128 209 -118.71 gain 209 128 -120.89 gain 128 210 -123.43 gain 210 128 -122.55 gain 128 211 -121.93 gain 211 128 -123.07 gain 128 212 -121.59 gain 212 128 -121.27 gain 128 213 -117.88 gain 213 128 -116.75 gain 128 214 -118.42 gain 214 128 -117.18 gain 128 215 -120.02 gain 215 128 -115.20 gain 128 216 -118.65 gain 216 128 -118.49 gain 128 217 -116.09 gain 217 128 -116.44 gain 128 218 -110.80 gain 218 128 -113.34 gain 128 219 -117.85 gain 219 128 -111.76 gain 128 220 -116.97 gain 220 128 -121.36 gain 128 221 -116.08 gain 221 128 -116.12 gain 128 222 -124.81 gain 222 128 -125.18 gain 128 223 -128.27 gain 223 128 -127.25 gain 128 224 -123.05 gain 224 128 -124.71 gain 129 130 -92.61 gain 130 129 -90.44 gain 129 131 -104.87 gain 131 129 -109.78 gain 129 132 -107.78 gain 132 129 -112.32 gain 129 133 -107.30 gain 133 129 -109.91 gain 129 134 -117.59 gain 134 129 -116.90 gain 129 135 -117.45 gain 135 129 -120.32 gain 129 136 -123.90 gain 136 129 -127.39 gain 129 137 -117.12 gain 137 129 -118.09 gain 129 138 -113.60 gain 138 129 -113.58 gain 129 139 -119.28 gain 139 129 -120.23 gain 129 140 -114.03 gain 140 129 -117.60 gain 129 141 -105.00 gain 141 129 -107.23 gain 129 142 -100.84 gain 142 129 -102.39 gain 129 143 -101.62 gain 143 129 -102.78 gain 129 144 -94.34 gain 144 129 -96.52 gain 129 145 -110.27 gain 145 129 -110.89 gain 129 146 -99.44 gain 146 129 -98.97 gain 129 147 -104.12 gain 147 129 -100.74 gain 129 148 -112.17 gain 148 129 -108.51 gain 129 149 -117.45 gain 149 129 -116.96 gain 129 150 -117.09 gain 150 129 -119.28 gain 129 151 -118.69 gain 151 129 -121.08 gain 129 152 -113.74 gain 152 129 -113.11 gain 129 153 -117.37 gain 153 129 -114.31 gain 129 154 -112.05 gain 154 129 -117.54 gain 129 155 -112.63 gain 155 129 -118.02 gain 129 156 -109.37 gain 156 129 -109.15 gain 129 157 -109.59 gain 157 129 -112.32 gain 129 158 -101.05 gain 158 129 -106.37 gain 129 159 -101.42 gain 159 129 -103.35 gain 129 160 -106.56 gain 160 129 -105.60 gain 129 161 -102.89 gain 161 129 -105.43 gain 129 162 -114.15 gain 162 129 -115.56 gain 129 163 -104.23 gain 163 129 -107.78 gain 129 164 -113.66 gain 164 129 -118.26 gain 129 165 -127.74 gain 165 129 -128.38 gain 129 166 -124.82 gain 166 129 -127.02 gain 129 167 -122.42 gain 167 129 -126.71 gain 129 168 -119.28 gain 168 129 -122.02 gain 129 169 -108.87 gain 169 129 -115.82 gain 129 170 -112.30 gain 170 129 -110.77 gain 129 171 -114.62 gain 171 129 -118.12 gain 129 172 -100.73 gain 172 129 -98.92 gain 129 173 -110.60 gain 173 129 -108.23 gain 129 174 -106.74 gain 174 129 -108.66 gain 129 175 -99.89 gain 175 129 -105.36 gain 129 176 -105.28 gain 176 129 -102.77 gain 129 177 -111.11 gain 177 129 -116.41 gain 129 178 -112.43 gain 178 129 -113.55 gain 129 179 -111.37 gain 179 129 -110.88 gain 129 180 -128.02 gain 180 129 -129.00 gain 129 181 -117.96 gain 181 129 -119.01 gain 129 182 -117.23 gain 182 129 -120.67 gain 129 183 -118.09 gain 183 129 -114.91 gain 129 184 -114.80 gain 184 129 -116.41 gain 129 185 -113.94 gain 185 129 -113.04 gain 129 186 -121.96 gain 186 129 -121.34 gain 129 187 -105.16 gain 187 129 -107.08 gain 129 188 -108.15 gain 188 129 -113.33 gain 129 189 -98.45 gain 189 129 -101.14 gain 129 190 -111.14 gain 190 129 -110.84 gain 129 191 -108.53 gain 191 129 -109.32 gain 129 192 -108.67 gain 192 129 -112.34 gain 129 193 -125.28 gain 193 129 -130.19 gain 129 194 -118.98 gain 194 129 -117.70 gain 129 195 -120.59 gain 195 129 -119.95 gain 129 196 -115.31 gain 196 129 -118.71 gain 129 197 -121.53 gain 197 129 -120.99 gain 129 198 -119.24 gain 198 129 -118.23 gain 129 199 -117.71 gain 199 129 -120.61 gain 129 200 -112.54 gain 200 129 -112.38 gain 129 201 -111.25 gain 201 129 -111.89 gain 129 202 -111.54 gain 202 129 -116.18 gain 129 203 -112.97 gain 203 129 -117.24 gain 129 204 -109.39 gain 204 129 -110.94 gain 129 205 -112.28 gain 205 129 -112.91 gain 129 206 -108.50 gain 206 129 -113.64 gain 129 207 -114.74 gain 207 129 -112.24 gain 129 208 -120.02 gain 208 129 -123.30 gain 129 209 -124.30 gain 209 129 -128.57 gain 129 210 -122.28 gain 210 129 -123.49 gain 129 211 -115.62 gain 211 129 -118.86 gain 129 212 -120.96 gain 212 129 -122.73 gain 129 213 -119.09 gain 213 129 -120.05 gain 129 214 -112.26 gain 214 129 -113.11 gain 129 215 -117.45 gain 215 129 -114.72 gain 129 216 -121.90 gain 216 129 -123.83 gain 129 217 -114.54 gain 217 129 -116.99 gain 129 218 -119.02 gain 218 129 -123.65 gain 129 219 -115.19 gain 219 129 -111.19 gain 129 220 -116.27 gain 220 129 -122.76 gain 129 221 -115.80 gain 221 129 -117.93 gain 129 222 -120.17 gain 222 129 -122.62 gain 129 223 -117.00 gain 223 129 -118.07 gain 129 224 -115.10 gain 224 129 -118.85 gain 130 131 -88.98 gain 131 130 -96.07 gain 130 132 -93.38 gain 132 130 -100.09 gain 130 133 -100.59 gain 133 130 -105.37 gain 130 134 -111.84 gain 134 130 -113.32 gain 130 135 -121.24 gain 135 130 -126.29 gain 130 136 -124.00 gain 136 130 -129.66 gain 130 137 -123.44 gain 137 130 -126.58 gain 130 138 -114.99 gain 138 130 -117.14 gain 130 139 -111.07 gain 139 130 -114.20 gain 130 140 -113.57 gain 140 130 -119.31 gain 130 141 -100.73 gain 141 130 -105.14 gain 130 142 -106.44 gain 142 130 -110.16 gain 130 143 -91.86 gain 143 130 -95.19 gain 130 144 -94.90 gain 144 130 -99.26 gain 130 145 -83.72 gain 145 130 -86.53 gain 130 146 -97.85 gain 146 130 -99.56 gain 130 147 -94.75 gain 147 130 -93.55 gain 130 148 -105.62 gain 148 130 -104.14 gain 130 149 -108.86 gain 149 130 -110.55 gain 130 150 -125.75 gain 150 130 -130.12 gain 130 151 -115.06 gain 151 130 -119.62 gain 130 152 -121.07 gain 152 130 -122.61 gain 130 153 -111.87 gain 153 130 -110.99 gain 130 154 -117.14 gain 154 130 -124.81 gain 130 155 -106.84 gain 155 130 -114.41 gain 130 156 -101.14 gain 156 130 -103.09 gain 130 157 -105.06 gain 157 130 -109.96 gain 130 158 -112.80 gain 158 130 -120.29 gain 130 159 -105.94 gain 159 130 -110.05 gain 130 160 -100.68 gain 160 130 -101.90 gain 130 161 -95.19 gain 161 130 -99.91 gain 130 162 -99.21 gain 162 130 -102.79 gain 130 163 -110.12 gain 163 130 -115.84 gain 130 164 -109.48 gain 164 130 -116.25 gain 130 165 -115.84 gain 165 130 -118.65 gain 130 166 -121.20 gain 166 130 -125.58 gain 130 167 -112.50 gain 167 130 -118.97 gain 130 168 -116.75 gain 168 130 -121.67 gain 130 169 -118.42 gain 169 130 -127.54 gain 130 170 -111.41 gain 170 130 -112.05 gain 130 171 -118.18 gain 171 130 -123.85 gain 130 172 -115.25 gain 172 130 -115.62 gain 130 173 -106.42 gain 173 130 -106.22 gain 130 174 -112.39 gain 174 130 -116.49 gain 130 175 -106.69 gain 175 130 -114.34 gain 130 176 -102.47 gain 176 130 -102.14 gain 130 177 -107.42 gain 177 130 -114.89 gain 130 178 -113.22 gain 178 130 -116.51 gain 130 179 -115.37 gain 179 130 -117.06 gain 130 180 -122.54 gain 180 130 -125.70 gain 130 181 -105.39 gain 181 130 -108.62 gain 130 182 -116.45 gain 182 130 -122.06 gain 130 183 -115.03 gain 183 130 -114.03 gain 130 184 -105.59 gain 184 130 -109.37 gain 130 185 -113.11 gain 185 130 -114.38 gain 130 186 -109.03 gain 186 130 -110.58 gain 130 187 -108.53 gain 187 130 -112.63 gain 130 188 -107.86 gain 188 130 -115.21 gain 130 189 -115.12 gain 189 130 -119.99 gain 130 190 -111.17 gain 190 130 -113.05 gain 130 191 -109.69 gain 191 130 -112.66 gain 130 192 -109.52 gain 192 130 -115.36 gain 130 193 -115.25 gain 193 130 -122.34 gain 130 194 -112.64 gain 194 130 -113.54 gain 130 195 -116.64 gain 195 130 -118.18 gain 130 196 -119.09 gain 196 130 -124.66 gain 130 197 -117.20 gain 197 130 -118.83 gain 130 198 -122.75 gain 198 130 -123.91 gain 130 199 -124.64 gain 199 130 -129.72 gain 130 200 -111.07 gain 200 130 -113.09 gain 130 201 -116.54 gain 201 130 -119.36 gain 130 202 -115.79 gain 202 130 -122.61 gain 130 203 -121.86 gain 203 130 -128.30 gain 130 204 -109.03 gain 204 130 -112.75 gain 130 205 -115.71 gain 205 130 -118.51 gain 130 206 -111.78 gain 206 130 -119.10 gain 130 207 -109.22 gain 207 130 -108.89 gain 130 208 -108.38 gain 208 130 -113.84 gain 130 209 -111.71 gain 209 130 -118.16 gain 130 210 -126.42 gain 210 130 -129.81 gain 130 211 -122.07 gain 211 130 -127.48 gain 130 212 -123.35 gain 212 130 -127.30 gain 130 213 -122.93 gain 213 130 -126.07 gain 130 214 -117.73 gain 214 130 -120.76 gain 130 215 -118.91 gain 215 130 -118.35 gain 130 216 -120.83 gain 216 130 -124.93 gain 130 217 -123.48 gain 217 130 -128.10 gain 130 218 -118.11 gain 218 130 -124.92 gain 130 219 -107.56 gain 219 130 -105.73 gain 130 220 -115.27 gain 220 130 -123.93 gain 130 221 -113.62 gain 221 130 -117.93 gain 130 222 -117.26 gain 222 130 -121.89 gain 130 223 -106.22 gain 223 130 -109.46 gain 130 224 -118.59 gain 224 130 -124.53 gain 131 132 -92.93 gain 132 131 -92.56 gain 131 133 -110.98 gain 133 131 -108.68 gain 131 134 -114.83 gain 134 131 -109.23 gain 131 135 -128.26 gain 135 131 -126.23 gain 131 136 -125.97 gain 136 131 -124.55 gain 131 137 -124.34 gain 137 131 -120.40 gain 131 138 -127.29 gain 138 131 -122.36 gain 131 139 -124.27 gain 139 131 -120.32 gain 131 140 -113.86 gain 140 131 -112.51 gain 131 141 -121.62 gain 141 131 -118.95 gain 131 142 -120.30 gain 142 131 -116.94 gain 131 143 -109.63 gain 143 131 -105.88 gain 131 144 -107.54 gain 144 131 -104.80 gain 131 145 -100.76 gain 145 131 -96.47 gain 131 146 -95.89 gain 146 131 -90.52 gain 131 147 -103.50 gain 147 131 -95.21 gain 131 148 -111.88 gain 148 131 -103.31 gain 131 149 -107.24 gain 149 131 -101.84 gain 131 150 -129.78 gain 150 131 -127.07 gain 131 151 -131.52 gain 151 131 -129.00 gain 131 152 -120.37 gain 152 131 -114.83 gain 131 153 -122.62 gain 153 131 -114.66 gain 131 154 -116.12 gain 154 131 -116.71 gain 131 155 -123.58 gain 155 131 -124.06 gain 131 156 -116.93 gain 156 131 -111.80 gain 131 157 -113.67 gain 157 131 -111.48 gain 131 158 -117.30 gain 158 131 -117.71 gain 131 159 -106.13 gain 159 131 -103.15 gain 131 160 -111.34 gain 160 131 -105.48 gain 131 161 -108.29 gain 161 131 -105.92 gain 131 162 -105.01 gain 162 131 -101.50 gain 131 163 -104.56 gain 163 131 -103.20 gain 131 164 -108.66 gain 164 131 -108.34 gain 131 165 -126.51 gain 165 131 -122.24 gain 131 166 -132.77 gain 166 131 -130.06 gain 131 167 -122.58 gain 167 131 -121.97 gain 131 168 -125.01 gain 168 131 -122.85 gain 131 169 -125.87 gain 169 131 -127.91 gain 131 170 -126.58 gain 170 131 -120.13 gain 131 171 -120.20 gain 171 131 -118.78 gain 131 172 -118.74 gain 172 131 -112.02 gain 131 173 -113.52 gain 173 131 -106.23 gain 131 174 -111.58 gain 174 131 -108.59 gain 131 175 -111.09 gain 175 131 -111.66 gain 131 176 -111.45 gain 176 131 -104.03 gain 131 177 -109.95 gain 177 131 -110.34 gain 131 178 -115.27 gain 178 131 -111.48 gain 131 179 -123.27 gain 179 131 -117.88 gain 131 180 -131.34 gain 180 131 -127.41 gain 131 181 -131.22 gain 181 131 -127.36 gain 131 182 -125.61 gain 182 131 -124.14 gain 131 183 -130.69 gain 183 131 -122.61 gain 131 184 -118.97 gain 184 131 -115.66 gain 131 185 -124.65 gain 185 131 -118.84 gain 131 186 -126.42 gain 186 131 -120.89 gain 131 187 -115.62 gain 187 131 -112.63 gain 131 188 -117.48 gain 188 131 -117.75 gain 131 189 -113.86 gain 189 131 -111.65 gain 131 190 -109.45 gain 190 131 -104.24 gain 131 191 -112.84 gain 191 131 -108.73 gain 131 192 -116.23 gain 192 131 -114.98 gain 131 193 -116.27 gain 193 131 -116.28 gain 131 194 -119.63 gain 194 131 -113.44 gain 131 195 -132.15 gain 195 131 -126.60 gain 131 196 -130.17 gain 196 131 -128.66 gain 131 197 -125.93 gain 197 131 -120.48 gain 131 198 -126.94 gain 198 131 -121.01 gain 131 199 -123.22 gain 199 131 -121.21 gain 131 200 -123.12 gain 200 131 -118.05 gain 131 201 -127.98 gain 201 131 -123.71 gain 131 202 -118.58 gain 202 131 -118.31 gain 131 203 -127.64 gain 203 131 -126.99 gain 131 204 -120.11 gain 204 131 -116.75 gain 131 205 -129.59 gain 205 131 -125.30 gain 131 206 -117.89 gain 206 131 -118.12 gain 131 207 -121.20 gain 207 131 -113.79 gain 131 208 -118.98 gain 208 131 -117.35 gain 131 209 -118.42 gain 209 131 -117.78 gain 131 210 -131.42 gain 210 131 -127.72 gain 131 211 -136.98 gain 211 131 -135.31 gain 131 212 -128.37 gain 212 131 -125.23 gain 131 213 -128.48 gain 213 131 -124.53 gain 131 214 -124.24 gain 214 131 -120.18 gain 131 215 -131.29 gain 215 131 -123.65 gain 131 216 -124.69 gain 216 131 -121.71 gain 131 217 -126.50 gain 217 131 -124.04 gain 131 218 -121.89 gain 218 131 -121.61 gain 131 219 -118.89 gain 219 131 -109.98 gain 131 220 -125.22 gain 220 131 -126.80 gain 131 221 -110.74 gain 221 131 -107.96 gain 131 222 -123.71 gain 222 131 -121.26 gain 131 223 -127.59 gain 223 131 -123.75 gain 131 224 -118.20 gain 224 131 -117.05 gain 132 133 -97.79 gain 133 132 -95.86 gain 132 134 -103.42 gain 134 132 -98.19 gain 132 135 -127.69 gain 135 132 -126.03 gain 132 136 -128.83 gain 136 132 -127.78 gain 132 137 -123.83 gain 137 132 -120.27 gain 132 138 -124.49 gain 138 132 -119.92 gain 132 139 -124.05 gain 139 132 -120.47 gain 132 140 -122.21 gain 140 132 -121.24 gain 132 141 -116.42 gain 141 132 -114.12 gain 132 142 -120.15 gain 142 132 -117.16 gain 132 143 -114.01 gain 143 132 -110.63 gain 132 144 -108.94 gain 144 132 -106.58 gain 132 145 -105.22 gain 145 132 -101.31 gain 132 146 -95.31 gain 146 132 -90.31 gain 132 147 -95.24 gain 147 132 -87.33 gain 132 148 -102.43 gain 148 132 -94.23 gain 132 149 -111.75 gain 149 132 -106.72 gain 132 150 -132.02 gain 150 132 -129.68 gain 132 151 -131.77 gain 151 132 -129.63 gain 132 152 -129.46 gain 152 132 -124.29 gain 132 153 -126.56 gain 153 132 -118.97 gain 132 154 -121.30 gain 154 132 -122.26 gain 132 155 -123.82 gain 155 132 -124.67 gain 132 156 -120.40 gain 156 132 -115.64 gain 132 157 -114.34 gain 157 132 -112.53 gain 132 158 -114.28 gain 158 132 -115.06 gain 132 159 -112.74 gain 159 132 -110.14 gain 132 160 -110.59 gain 160 132 -105.10 gain 132 161 -111.95 gain 161 132 -109.95 gain 132 162 -100.92 gain 162 132 -97.78 gain 132 163 -113.82 gain 163 132 -112.83 gain 132 164 -110.31 gain 164 132 -110.36 gain 132 165 -125.67 gain 165 132 -121.77 gain 132 166 -129.83 gain 166 132 -127.50 gain 132 167 -128.02 gain 167 132 -127.78 gain 132 168 -122.60 gain 168 132 -120.81 gain 132 169 -120.16 gain 169 132 -122.56 gain 132 170 -120.34 gain 170 132 -114.27 gain 132 171 -116.98 gain 171 132 -115.94 gain 132 172 -115.80 gain 172 132 -109.45 gain 132 173 -128.33 gain 173 132 -121.42 gain 132 174 -123.66 gain 174 132 -121.04 gain 132 175 -107.37 gain 175 132 -108.31 gain 132 176 -115.44 gain 176 132 -108.39 gain 132 177 -111.27 gain 177 132 -112.03 gain 132 178 -108.63 gain 178 132 -105.22 gain 132 179 -118.10 gain 179 132 -113.08 gain 132 180 -132.87 gain 180 132 -129.32 gain 132 181 -128.56 gain 181 132 -125.08 gain 132 182 -136.49 gain 182 132 -135.39 gain 132 183 -120.78 gain 183 132 -113.07 gain 132 184 -122.14 gain 184 132 -119.22 gain 132 185 -118.57 gain 185 132 -113.13 gain 132 186 -120.85 gain 186 132 -115.70 gain 132 187 -117.32 gain 187 132 -114.70 gain 132 188 -116.72 gain 188 132 -117.36 gain 132 189 -115.72 gain 189 132 -113.88 gain 132 190 -122.52 gain 190 132 -117.69 gain 132 191 -114.45 gain 191 132 -110.71 gain 132 192 -119.97 gain 192 132 -119.10 gain 132 193 -111.01 gain 193 132 -111.39 gain 132 194 -119.44 gain 194 132 -113.63 gain 132 195 -128.18 gain 195 132 -123.00 gain 132 196 -126.06 gain 196 132 -124.92 gain 132 197 -127.09 gain 197 132 -122.01 gain 132 198 -121.94 gain 198 132 -116.39 gain 132 199 -119.56 gain 199 132 -117.92 gain 132 200 -119.86 gain 200 132 -115.16 gain 132 201 -120.08 gain 201 132 -116.18 gain 132 202 -112.62 gain 202 132 -112.73 gain 132 203 -124.99 gain 203 132 -124.72 gain 132 204 -116.61 gain 204 132 -113.62 gain 132 205 -118.10 gain 205 132 -114.19 gain 132 206 -116.75 gain 206 132 -117.35 gain 132 207 -117.44 gain 207 132 -110.40 gain 132 208 -122.67 gain 208 132 -121.41 gain 132 209 -122.80 gain 209 132 -122.53 gain 132 210 -128.29 gain 210 132 -124.96 gain 132 211 -137.02 gain 211 132 -135.71 gain 132 212 -131.77 gain 212 132 -129.01 gain 132 213 -130.82 gain 213 132 -127.24 gain 132 214 -131.04 gain 214 132 -127.36 gain 132 215 -130.02 gain 215 132 -122.75 gain 132 216 -126.73 gain 216 132 -124.13 gain 132 217 -125.07 gain 217 132 -122.98 gain 132 218 -127.51 gain 218 132 -127.62 gain 132 219 -122.43 gain 219 132 -113.89 gain 132 220 -121.87 gain 220 132 -123.82 gain 132 221 -121.87 gain 221 132 -119.46 gain 132 222 -123.72 gain 222 132 -121.64 gain 132 223 -114.16 gain 223 132 -110.69 gain 132 224 -126.57 gain 224 132 -125.79 gain 133 134 -93.16 gain 134 133 -89.86 gain 133 135 -126.04 gain 135 133 -126.31 gain 133 136 -127.75 gain 136 133 -128.63 gain 133 137 -129.26 gain 137 133 -127.63 gain 133 138 -126.93 gain 138 133 -124.30 gain 133 139 -118.74 gain 139 133 -117.09 gain 133 140 -123.47 gain 140 133 -124.43 gain 133 141 -119.88 gain 141 133 -119.51 gain 133 142 -115.15 gain 142 133 -114.08 gain 133 143 -118.04 gain 143 133 -116.59 gain 133 144 -109.18 gain 144 133 -108.75 gain 133 145 -115.66 gain 145 133 -113.68 gain 133 146 -102.60 gain 146 133 -99.53 gain 133 147 -97.69 gain 147 133 -91.71 gain 133 148 -93.48 gain 148 133 -87.21 gain 133 149 -98.29 gain 149 133 -95.20 gain 133 150 -137.08 gain 150 133 -136.66 gain 133 151 -128.38 gain 151 133 -128.16 gain 133 152 -128.85 gain 152 133 -125.61 gain 133 153 -123.42 gain 153 133 -117.76 gain 133 154 -130.38 gain 154 133 -133.27 gain 133 155 -120.27 gain 155 133 -123.06 gain 133 156 -121.82 gain 156 133 -118.99 gain 133 157 -120.56 gain 157 133 -120.68 gain 133 158 -117.15 gain 158 133 -119.86 gain 133 159 -111.96 gain 159 133 -111.28 gain 133 160 -114.17 gain 160 133 -110.61 gain 133 161 -107.58 gain 161 133 -107.51 gain 133 162 -104.94 gain 162 133 -103.74 gain 133 163 -109.39 gain 163 133 -110.34 gain 133 164 -103.83 gain 164 133 -105.82 gain 133 165 -127.83 gain 165 133 -125.85 gain 133 166 -124.69 gain 166 133 -124.29 gain 133 167 -121.65 gain 167 133 -123.33 gain 133 168 -130.18 gain 168 133 -130.32 gain 133 169 -130.20 gain 169 133 -134.54 gain 133 170 -122.04 gain 170 133 -117.91 gain 133 171 -122.17 gain 171 133 -123.05 gain 133 172 -114.29 gain 172 133 -109.87 gain 133 173 -119.55 gain 173 133 -114.57 gain 133 174 -112.96 gain 174 133 -112.27 gain 133 175 -109.95 gain 175 133 -112.82 gain 133 176 -110.46 gain 176 133 -105.34 gain 133 177 -106.69 gain 177 133 -109.38 gain 133 178 -102.85 gain 178 133 -101.37 gain 133 179 -113.31 gain 179 133 -110.22 gain 133 180 -122.38 gain 180 133 -120.75 gain 133 181 -126.33 gain 181 133 -124.77 gain 133 182 -123.17 gain 182 133 -124.00 gain 133 183 -125.62 gain 183 133 -119.84 gain 133 184 -122.32 gain 184 133 -121.32 gain 133 185 -125.02 gain 185 133 -121.51 gain 133 186 -118.30 gain 186 133 -115.08 gain 133 187 -119.45 gain 187 133 -118.76 gain 133 188 -116.55 gain 188 133 -119.12 gain 133 189 -122.79 gain 189 133 -122.88 gain 133 190 -115.88 gain 190 133 -112.98 gain 133 191 -110.70 gain 191 133 -108.89 gain 133 192 -112.65 gain 192 133 -113.70 gain 133 193 -115.07 gain 193 133 -117.38 gain 133 194 -112.66 gain 194 133 -108.78 gain 133 195 -133.78 gain 195 133 -130.53 gain 133 196 -131.07 gain 196 133 -131.86 gain 133 197 -125.42 gain 197 133 -122.27 gain 133 198 -128.92 gain 198 133 -125.29 gain 133 199 -126.09 gain 199 133 -126.39 gain 133 200 -120.27 gain 200 133 -117.50 gain 133 201 -119.45 gain 201 133 -117.49 gain 133 202 -113.71 gain 202 133 -115.74 gain 133 203 -122.76 gain 203 133 -124.42 gain 133 204 -106.44 gain 204 133 -105.38 gain 133 205 -122.01 gain 205 133 -120.03 gain 133 206 -118.48 gain 206 133 -121.01 gain 133 207 -116.25 gain 207 133 -111.15 gain 133 208 -112.56 gain 208 133 -113.23 gain 133 209 -116.39 gain 209 133 -118.06 gain 133 210 -130.78 gain 210 133 -129.38 gain 133 211 -128.03 gain 211 133 -128.66 gain 133 212 -130.00 gain 212 133 -129.17 gain 133 213 -128.67 gain 213 133 -127.03 gain 133 214 -124.39 gain 214 133 -122.64 gain 133 215 -128.33 gain 215 133 -123.00 gain 133 216 -119.98 gain 216 133 -119.31 gain 133 217 -125.15 gain 217 133 -124.99 gain 133 218 -127.02 gain 218 133 -129.05 gain 133 219 -120.39 gain 219 133 -113.78 gain 133 220 -115.61 gain 220 133 -119.49 gain 133 221 -118.26 gain 221 133 -117.79 gain 133 222 -110.70 gain 222 133 -110.55 gain 133 223 -116.82 gain 223 133 -115.28 gain 133 224 -115.34 gain 224 133 -116.49 gain 134 135 -128.75 gain 135 134 -132.32 gain 134 136 -126.69 gain 136 134 -130.87 gain 134 137 -121.79 gain 137 134 -123.46 gain 134 138 -119.32 gain 138 134 -119.98 gain 134 139 -121.47 gain 139 134 -123.12 gain 134 140 -119.35 gain 140 134 -123.61 gain 134 141 -118.23 gain 141 134 -121.16 gain 134 142 -116.81 gain 142 134 -119.04 gain 134 143 -108.92 gain 143 134 -110.77 gain 134 144 -114.68 gain 144 134 -117.55 gain 134 145 -105.48 gain 145 134 -106.80 gain 134 146 -100.96 gain 146 134 -101.19 gain 134 147 -103.51 gain 147 134 -100.82 gain 134 148 -93.80 gain 148 134 -90.84 gain 134 149 -89.50 gain 149 134 -89.70 gain 134 150 -130.41 gain 150 134 -133.30 gain 134 151 -124.92 gain 151 134 -128.01 gain 134 152 -126.24 gain 152 134 -126.30 gain 134 153 -122.74 gain 153 134 -120.38 gain 134 154 -122.87 gain 154 134 -129.06 gain 134 155 -118.58 gain 155 134 -124.66 gain 134 156 -119.03 gain 156 134 -119.50 gain 134 157 -113.59 gain 157 134 -117.01 gain 134 158 -120.01 gain 158 134 -126.02 gain 134 159 -110.46 gain 159 134 -113.09 gain 134 160 -110.62 gain 160 134 -110.36 gain 134 161 -116.69 gain 161 134 -119.92 gain 134 162 -103.89 gain 162 134 -105.99 gain 134 163 -101.71 gain 163 134 -105.95 gain 134 164 -98.84 gain 164 134 -104.12 gain 134 165 -122.54 gain 165 134 -123.87 gain 134 166 -117.38 gain 166 134 -120.28 gain 134 167 -124.69 gain 167 134 -129.68 gain 134 168 -120.35 gain 168 134 -123.79 gain 134 169 -122.27 gain 169 134 -129.90 gain 134 170 -120.64 gain 170 134 -119.80 gain 134 171 -124.79 gain 171 134 -128.98 gain 134 172 -119.56 gain 172 134 -118.45 gain 134 173 -113.42 gain 173 134 -111.74 gain 134 174 -116.33 gain 174 134 -118.94 gain 134 175 -112.77 gain 175 134 -118.93 gain 134 176 -109.47 gain 176 134 -107.65 gain 134 177 -109.81 gain 177 134 -115.81 gain 134 178 -100.47 gain 178 134 -102.29 gain 134 179 -100.26 gain 179 134 -100.47 gain 134 180 -127.57 gain 180 134 -129.25 gain 134 181 -123.10 gain 181 134 -124.84 gain 134 182 -120.86 gain 182 134 -124.99 gain 134 183 -117.89 gain 183 134 -115.41 gain 134 184 -122.29 gain 184 134 -124.59 gain 134 185 -117.67 gain 185 134 -117.46 gain 134 186 -117.89 gain 186 134 -117.96 gain 134 187 -119.89 gain 187 134 -122.50 gain 134 188 -120.20 gain 188 134 -126.07 gain 134 189 -110.40 gain 189 134 -113.78 gain 134 190 -114.98 gain 190 134 -115.38 gain 134 191 -112.36 gain 191 134 -113.85 gain 134 192 -113.41 gain 192 134 -117.77 gain 134 193 -107.34 gain 193 134 -112.94 gain 134 194 -119.94 gain 194 134 -119.36 gain 134 195 -132.59 gain 195 134 -132.64 gain 134 196 -125.55 gain 196 134 -129.64 gain 134 197 -123.67 gain 197 134 -123.82 gain 134 198 -125.18 gain 198 134 -124.86 gain 134 199 -120.38 gain 199 134 -123.97 gain 134 200 -123.61 gain 200 134 -124.14 gain 134 201 -120.23 gain 201 134 -121.56 gain 134 202 -119.94 gain 202 134 -125.28 gain 134 203 -117.25 gain 203 134 -122.20 gain 134 204 -116.88 gain 204 134 -119.12 gain 134 205 -112.22 gain 205 134 -113.54 gain 134 206 -120.33 gain 206 134 -126.16 gain 134 207 -102.99 gain 207 134 -101.18 gain 134 208 -110.53 gain 208 134 -114.51 gain 134 209 -111.09 gain 209 134 -116.06 gain 134 210 -132.92 gain 210 134 -134.82 gain 134 211 -134.25 gain 211 134 -138.18 gain 134 212 -126.04 gain 212 134 -128.51 gain 134 213 -124.16 gain 213 134 -125.81 gain 134 214 -116.88 gain 214 134 -118.42 gain 134 215 -125.40 gain 215 134 -123.36 gain 134 216 -126.92 gain 216 134 -129.54 gain 134 217 -118.61 gain 217 134 -121.75 gain 134 218 -116.76 gain 218 134 -122.10 gain 134 219 -119.95 gain 219 134 -116.64 gain 134 220 -116.40 gain 220 134 -123.58 gain 134 221 -111.19 gain 221 134 -114.02 gain 134 222 -115.28 gain 222 134 -118.42 gain 134 223 -108.02 gain 223 134 -109.78 gain 134 224 -111.47 gain 224 134 -115.92 gain 135 136 -89.17 gain 136 135 -89.78 gain 135 137 -100.17 gain 137 135 -98.27 gain 135 138 -112.40 gain 138 135 -109.49 gain 135 139 -110.62 gain 139 135 -108.70 gain 135 140 -107.48 gain 140 135 -108.17 gain 135 141 -120.98 gain 141 135 -120.34 gain 135 142 -121.17 gain 142 135 -119.84 gain 135 143 -122.16 gain 143 135 -120.44 gain 135 144 -120.94 gain 144 135 -120.24 gain 135 145 -129.78 gain 145 135 -127.53 gain 135 146 -129.32 gain 146 135 -125.97 gain 135 147 -123.74 gain 147 135 -117.49 gain 135 148 -116.89 gain 148 135 -110.35 gain 135 149 -130.05 gain 149 135 -126.69 gain 135 150 -95.43 gain 150 135 -94.75 gain 135 151 -101.39 gain 151 135 -100.90 gain 135 152 -105.29 gain 152 135 -101.78 gain 135 153 -104.17 gain 153 135 -98.24 gain 135 154 -113.25 gain 154 135 -115.87 gain 135 155 -115.66 gain 155 135 -118.18 gain 135 156 -118.29 gain 156 135 -115.19 gain 135 157 -123.31 gain 157 135 -123.16 gain 135 158 -125.72 gain 158 135 -128.16 gain 135 159 -118.93 gain 159 135 -117.99 gain 135 160 -125.20 gain 160 135 -121.37 gain 135 161 -125.70 gain 161 135 -125.36 gain 135 162 -127.15 gain 162 135 -125.68 gain 135 163 -126.95 gain 163 135 -127.62 gain 135 164 -128.57 gain 164 135 -130.28 gain 135 165 -108.06 gain 165 135 -105.82 gain 135 166 -101.99 gain 166 135 -101.32 gain 135 167 -105.53 gain 167 135 -106.95 gain 135 168 -114.19 gain 168 135 -114.06 gain 135 169 -120.70 gain 169 135 -124.76 gain 135 170 -119.45 gain 170 135 -115.04 gain 135 171 -121.67 gain 171 135 -122.29 gain 135 172 -121.24 gain 172 135 -116.55 gain 135 173 -122.59 gain 173 135 -117.34 gain 135 174 -123.19 gain 174 135 -122.23 gain 135 175 -127.52 gain 175 135 -130.12 gain 135 176 -126.18 gain 176 135 -120.79 gain 135 177 -137.81 gain 177 135 -140.23 gain 135 178 -136.65 gain 178 135 -134.90 gain 135 179 -131.78 gain 179 135 -128.42 gain 135 180 -120.69 gain 180 135 -118.80 gain 135 181 -109.01 gain 181 135 -107.18 gain 135 182 -113.72 gain 182 135 -114.28 gain 135 183 -120.00 gain 183 135 -113.95 gain 135 184 -114.07 gain 184 135 -112.80 gain 135 185 -125.43 gain 185 135 -121.65 gain 135 186 -116.06 gain 186 135 -112.56 gain 135 187 -115.73 gain 187 135 -114.77 gain 135 188 -121.29 gain 188 135 -123.59 gain 135 189 -121.95 gain 189 135 -121.76 gain 135 190 -126.81 gain 190 135 -123.64 gain 135 191 -131.91 gain 191 135 -129.83 gain 135 192 -123.83 gain 192 135 -124.62 gain 135 193 -131.98 gain 193 135 -134.01 gain 135 194 -133.10 gain 194 135 -128.95 gain 135 195 -116.12 gain 195 135 -112.60 gain 135 196 -119.69 gain 196 135 -120.21 gain 135 197 -114.14 gain 197 135 -110.72 gain 135 198 -118.71 gain 198 135 -114.81 gain 135 199 -119.84 gain 199 135 -119.86 gain 135 200 -118.77 gain 200 135 -115.73 gain 135 201 -122.53 gain 201 135 -120.29 gain 135 202 -122.71 gain 202 135 -124.47 gain 135 203 -127.40 gain 203 135 -128.79 gain 135 204 -126.36 gain 204 135 -125.03 gain 135 205 -123.49 gain 205 135 -121.23 gain 135 206 -127.99 gain 206 135 -130.26 gain 135 207 -129.26 gain 207 135 -123.89 gain 135 208 -128.77 gain 208 135 -129.18 gain 135 209 -130.65 gain 209 135 -132.05 gain 135 210 -115.22 gain 210 135 -113.55 gain 135 211 -107.94 gain 211 135 -108.29 gain 135 212 -113.42 gain 212 135 -112.32 gain 135 213 -121.54 gain 213 135 -119.63 gain 135 214 -117.79 gain 214 135 -115.76 gain 135 215 -124.13 gain 215 135 -118.52 gain 135 216 -117.91 gain 216 135 -116.96 gain 135 217 -124.82 gain 217 135 -124.40 gain 135 218 -127.12 gain 218 135 -128.88 gain 135 219 -120.71 gain 219 135 -113.84 gain 135 220 -128.69 gain 220 135 -132.30 gain 135 221 -128.83 gain 221 135 -128.08 gain 135 222 -128.51 gain 222 135 -128.09 gain 135 223 -131.48 gain 223 135 -129.67 gain 135 224 -120.92 gain 224 135 -121.81 gain 136 137 -91.18 gain 137 136 -88.66 gain 136 138 -104.62 gain 138 136 -101.10 gain 136 139 -105.08 gain 139 136 -102.55 gain 136 140 -111.94 gain 140 136 -112.02 gain 136 141 -119.64 gain 141 136 -118.39 gain 136 142 -109.75 gain 142 136 -107.81 gain 136 143 -126.41 gain 143 136 -124.08 gain 136 144 -126.23 gain 144 136 -124.92 gain 136 145 -130.12 gain 145 136 -127.26 gain 136 146 -128.07 gain 146 136 -124.12 gain 136 147 -115.89 gain 147 136 -109.02 gain 136 148 -127.88 gain 148 136 -120.74 gain 136 149 -129.58 gain 149 136 -125.60 gain 136 150 -94.58 gain 150 136 -93.29 gain 136 151 -92.58 gain 151 136 -91.49 gain 136 152 -102.13 gain 152 136 -98.02 gain 136 153 -109.43 gain 153 136 -102.89 gain 136 154 -110.62 gain 154 136 -112.62 gain 136 155 -117.87 gain 155 136 -119.77 gain 136 156 -123.34 gain 156 136 -119.63 gain 136 157 -116.81 gain 157 136 -116.05 gain 136 158 -113.85 gain 158 136 -115.68 gain 136 159 -126.81 gain 159 136 -125.26 gain 136 160 -123.96 gain 160 136 -119.52 gain 136 161 -122.95 gain 161 136 -122.00 gain 136 162 -127.76 gain 162 136 -125.67 gain 136 163 -130.27 gain 163 136 -130.33 gain 136 164 -122.73 gain 164 136 -123.83 gain 136 165 -99.48 gain 165 136 -96.63 gain 136 166 -107.45 gain 166 136 -106.17 gain 136 167 -109.76 gain 167 136 -110.56 gain 136 168 -113.77 gain 168 136 -113.02 gain 136 169 -111.46 gain 169 136 -114.92 gain 136 170 -111.13 gain 170 136 -106.11 gain 136 171 -110.29 gain 171 136 -110.29 gain 136 172 -121.26 gain 172 136 -115.96 gain 136 173 -123.43 gain 173 136 -117.56 gain 136 174 -123.41 gain 174 136 -121.84 gain 136 175 -129.97 gain 175 136 -131.96 gain 136 176 -125.76 gain 176 136 -119.76 gain 136 177 -129.41 gain 177 136 -131.23 gain 136 178 -129.83 gain 178 136 -127.47 gain 136 179 -130.57 gain 179 136 -126.59 gain 136 180 -111.08 gain 180 136 -108.57 gain 136 181 -108.39 gain 181 136 -105.95 gain 136 182 -114.22 gain 182 136 -114.17 gain 136 183 -111.76 gain 183 136 -105.10 gain 136 184 -113.88 gain 184 136 -112.01 gain 136 185 -118.92 gain 185 136 -114.53 gain 136 186 -121.03 gain 186 136 -116.92 gain 136 187 -121.66 gain 187 136 -120.09 gain 136 188 -121.17 gain 188 136 -122.86 gain 136 189 -123.99 gain 189 136 -123.20 gain 136 190 -126.16 gain 190 136 -122.38 gain 136 191 -118.62 gain 191 136 -115.93 gain 136 192 -127.47 gain 192 136 -127.65 gain 136 193 -124.23 gain 193 136 -125.65 gain 136 194 -135.56 gain 194 136 -130.80 gain 136 195 -110.49 gain 195 136 -106.36 gain 136 196 -110.80 gain 196 136 -110.71 gain 136 197 -114.64 gain 197 136 -110.61 gain 136 198 -113.18 gain 198 136 -108.68 gain 136 199 -112.87 gain 199 136 -112.28 gain 136 200 -114.66 gain 200 136 -111.00 gain 136 201 -117.32 gain 201 136 -114.47 gain 136 202 -122.19 gain 202 136 -123.34 gain 136 203 -126.06 gain 203 136 -126.84 gain 136 204 -121.33 gain 204 136 -119.39 gain 136 205 -134.82 gain 205 136 -131.95 gain 136 206 -126.14 gain 206 136 -127.80 gain 136 207 -129.77 gain 207 136 -123.79 gain 136 208 -132.98 gain 208 136 -132.77 gain 136 209 -126.05 gain 209 136 -126.84 gain 136 210 -115.48 gain 210 136 -113.20 gain 136 211 -113.80 gain 211 136 -113.54 gain 136 212 -114.96 gain 212 136 -113.25 gain 136 213 -109.46 gain 213 136 -106.94 gain 136 214 -120.56 gain 214 136 -117.92 gain 136 215 -112.72 gain 215 136 -106.50 gain 136 216 -121.22 gain 216 136 -119.66 gain 136 217 -117.66 gain 217 136 -116.62 gain 136 218 -122.63 gain 218 136 -123.78 gain 136 219 -126.03 gain 219 136 -118.54 gain 136 220 -126.53 gain 220 136 -129.53 gain 136 221 -122.47 gain 221 136 -121.11 gain 136 222 -134.31 gain 222 136 -133.27 gain 136 223 -125.38 gain 223 136 -122.96 gain 136 224 -135.48 gain 224 136 -135.75 gain 137 138 -92.96 gain 138 137 -91.95 gain 137 139 -98.65 gain 139 137 -98.63 gain 137 140 -108.12 gain 140 137 -110.71 gain 137 141 -106.78 gain 141 137 -108.04 gain 137 142 -120.66 gain 142 137 -121.23 gain 137 143 -116.15 gain 143 137 -116.34 gain 137 144 -115.39 gain 144 137 -116.60 gain 137 145 -116.38 gain 145 137 -116.04 gain 137 146 -122.63 gain 146 137 -121.19 gain 137 147 -117.00 gain 147 137 -112.65 gain 137 148 -121.98 gain 148 137 -117.35 gain 137 149 -130.35 gain 149 137 -128.89 gain 137 150 -103.96 gain 150 137 -105.18 gain 137 151 -106.42 gain 151 137 -107.84 gain 137 152 -92.80 gain 152 137 -91.20 gain 137 153 -92.36 gain 153 137 -88.34 gain 137 154 -107.81 gain 154 137 -112.33 gain 137 155 -112.49 gain 155 137 -116.91 gain 137 156 -114.02 gain 156 137 -112.83 gain 137 157 -110.17 gain 157 137 -111.92 gain 137 158 -111.62 gain 158 137 -115.97 gain 137 159 -116.36 gain 159 137 -117.32 gain 137 160 -125.33 gain 160 137 -123.41 gain 137 161 -128.91 gain 161 137 -130.47 gain 137 162 -120.10 gain 162 137 -120.53 gain 137 163 -120.12 gain 163 137 -122.70 gain 137 164 -129.60 gain 164 137 -133.22 gain 137 165 -105.52 gain 165 137 -105.19 gain 137 166 -99.65 gain 166 137 -100.88 gain 137 167 -97.57 gain 167 137 -100.89 gain 137 168 -99.84 gain 168 137 -101.61 gain 137 169 -111.31 gain 169 137 -117.28 gain 137 170 -102.53 gain 170 137 -100.02 gain 137 171 -115.27 gain 171 137 -117.79 gain 137 172 -115.00 gain 172 137 -112.22 gain 137 173 -114.54 gain 173 137 -111.19 gain 137 174 -113.79 gain 174 137 -114.74 gain 137 175 -114.84 gain 175 137 -119.35 gain 137 176 -115.13 gain 176 137 -111.65 gain 137 177 -126.82 gain 177 137 -131.15 gain 137 178 -129.73 gain 178 137 -129.88 gain 137 179 -124.10 gain 179 137 -122.64 gain 137 180 -116.73 gain 180 137 -116.75 gain 137 181 -107.94 gain 181 137 -108.02 gain 137 182 -111.26 gain 182 137 -113.72 gain 137 183 -110.69 gain 183 137 -106.54 gain 137 184 -107.50 gain 184 137 -108.14 gain 137 185 -113.74 gain 185 137 -111.87 gain 137 186 -105.84 gain 186 137 -104.25 gain 137 187 -119.17 gain 187 137 -120.12 gain 137 188 -122.21 gain 188 137 -126.42 gain 137 189 -111.70 gain 189 137 -113.42 gain 137 190 -126.33 gain 190 137 -125.06 gain 137 191 -121.70 gain 191 137 -121.53 gain 137 192 -121.41 gain 192 137 -124.10 gain 137 193 -123.46 gain 193 137 -127.40 gain 137 194 -118.11 gain 194 137 -115.86 gain 137 195 -111.34 gain 195 137 -109.72 gain 137 196 -109.08 gain 196 137 -111.51 gain 137 197 -102.68 gain 197 137 -101.17 gain 137 198 -107.97 gain 198 137 -105.98 gain 137 199 -112.96 gain 199 137 -114.89 gain 137 200 -112.82 gain 200 137 -111.68 gain 137 201 -111.47 gain 201 137 -111.14 gain 137 202 -122.45 gain 202 137 -126.12 gain 137 203 -117.89 gain 203 137 -121.18 gain 137 204 -115.45 gain 204 137 -116.02 gain 137 205 -130.14 gain 205 137 -129.79 gain 137 206 -118.26 gain 206 137 -122.43 gain 137 207 -128.86 gain 207 137 -125.39 gain 137 208 -128.89 gain 208 137 -131.19 gain 137 209 -124.89 gain 209 137 -128.19 gain 137 210 -108.96 gain 210 137 -109.20 gain 137 211 -121.41 gain 211 137 -123.67 gain 137 212 -114.46 gain 212 137 -115.27 gain 137 213 -117.45 gain 213 137 -117.45 gain 137 214 -108.15 gain 214 137 -108.04 gain 137 215 -112.63 gain 215 137 -108.92 gain 137 216 -113.19 gain 216 137 -114.15 gain 137 217 -113.80 gain 217 137 -115.27 gain 137 218 -123.31 gain 218 137 -126.98 gain 137 219 -116.89 gain 219 137 -111.92 gain 137 220 -121.95 gain 220 137 -127.46 gain 137 221 -124.01 gain 221 137 -125.17 gain 137 222 -127.99 gain 222 137 -129.47 gain 137 223 -124.18 gain 223 137 -124.28 gain 137 224 -128.78 gain 224 137 -131.57 gain 138 139 -94.96 gain 139 138 -95.95 gain 138 140 -99.11 gain 140 138 -102.70 gain 138 141 -98.41 gain 141 138 -100.67 gain 138 142 -104.02 gain 142 138 -105.59 gain 138 143 -109.93 gain 143 138 -111.12 gain 138 144 -116.53 gain 144 138 -118.74 gain 138 145 -117.19 gain 145 138 -117.85 gain 138 146 -116.60 gain 146 138 -116.16 gain 138 147 -121.45 gain 147 138 -118.10 gain 138 148 -122.86 gain 148 138 -119.23 gain 138 149 -120.83 gain 149 138 -120.37 gain 138 150 -106.79 gain 150 138 -109.02 gain 138 151 -105.12 gain 151 138 -107.54 gain 138 152 -95.33 gain 152 138 -94.72 gain 138 153 -98.55 gain 153 138 -95.53 gain 138 154 -96.20 gain 154 138 -101.72 gain 138 155 -99.47 gain 155 138 -104.89 gain 138 156 -106.05 gain 156 138 -105.86 gain 138 157 -117.23 gain 157 138 -119.98 gain 138 158 -114.09 gain 158 138 -119.44 gain 138 159 -113.01 gain 159 138 -114.98 gain 138 160 -118.60 gain 160 138 -117.67 gain 138 161 -122.25 gain 161 138 -124.82 gain 138 162 -119.34 gain 162 138 -120.77 gain 138 163 -122.07 gain 163 138 -125.65 gain 138 164 -120.90 gain 164 138 -125.52 gain 138 165 -110.19 gain 165 138 -110.85 gain 138 166 -108.42 gain 166 138 -110.65 gain 138 167 -105.52 gain 167 138 -109.85 gain 138 168 -97.45 gain 168 138 -100.23 gain 138 169 -98.76 gain 169 138 -105.73 gain 138 170 -102.04 gain 170 138 -100.54 gain 138 171 -108.29 gain 171 138 -111.82 gain 138 172 -111.67 gain 172 138 -109.89 gain 138 173 -114.20 gain 173 138 -111.85 gain 138 174 -117.54 gain 174 138 -119.49 gain 138 175 -117.87 gain 175 138 -123.37 gain 138 176 -118.36 gain 176 138 -115.88 gain 138 177 -114.84 gain 177 138 -120.16 gain 138 178 -122.16 gain 178 138 -123.31 gain 138 179 -120.03 gain 179 138 -119.57 gain 138 180 -112.73 gain 180 138 -113.74 gain 138 181 -109.84 gain 181 138 -110.92 gain 138 182 -119.56 gain 182 138 -123.03 gain 138 183 -112.37 gain 183 138 -109.22 gain 138 184 -107.53 gain 184 138 -109.17 gain 138 185 -111.54 gain 185 138 -110.67 gain 138 186 -113.33 gain 186 138 -112.74 gain 138 187 -113.75 gain 187 138 -115.70 gain 138 188 -112.14 gain 188 138 -117.35 gain 138 189 -112.07 gain 189 138 -114.79 gain 138 190 -127.16 gain 190 138 -126.89 gain 138 191 -119.15 gain 191 138 -119.97 gain 138 192 -121.43 gain 192 138 -125.12 gain 138 193 -125.76 gain 193 138 -130.71 gain 138 194 -120.88 gain 194 138 -119.64 gain 138 195 -109.40 gain 195 138 -108.79 gain 138 196 -106.76 gain 196 138 -110.19 gain 138 197 -113.31 gain 197 138 -112.80 gain 138 198 -116.45 gain 198 138 -115.46 gain 138 199 -112.59 gain 199 138 -115.52 gain 138 200 -109.94 gain 200 138 -109.80 gain 138 201 -111.80 gain 201 138 -112.47 gain 138 202 -109.77 gain 202 138 -114.44 gain 138 203 -116.65 gain 203 138 -120.95 gain 138 204 -116.63 gain 204 138 -118.21 gain 138 205 -121.50 gain 205 138 -122.15 gain 138 206 -120.82 gain 206 138 -125.99 gain 138 207 -120.69 gain 207 138 -118.22 gain 138 208 -112.66 gain 208 138 -115.97 gain 138 209 -119.50 gain 209 138 -123.80 gain 138 210 -111.61 gain 210 138 -112.85 gain 138 211 -113.81 gain 211 138 -117.07 gain 138 212 -103.94 gain 212 138 -105.74 gain 138 213 -116.01 gain 213 138 -117.01 gain 138 214 -113.44 gain 214 138 -114.32 gain 138 215 -112.48 gain 215 138 -109.78 gain 138 216 -114.64 gain 216 138 -116.60 gain 138 217 -112.13 gain 217 138 -114.61 gain 138 218 -116.64 gain 218 138 -121.31 gain 138 219 -120.30 gain 219 138 -116.33 gain 138 220 -117.87 gain 220 138 -124.39 gain 138 221 -121.23 gain 221 138 -123.39 gain 138 222 -124.25 gain 222 138 -126.74 gain 138 223 -121.56 gain 223 138 -122.66 gain 138 224 -131.17 gain 224 138 -134.96 gain 139 140 -103.75 gain 140 139 -106.36 gain 139 141 -104.73 gain 141 139 -106.01 gain 139 142 -107.60 gain 142 139 -108.19 gain 139 143 -114.13 gain 143 139 -114.33 gain 139 144 -116.66 gain 144 139 -117.88 gain 139 145 -116.90 gain 145 139 -116.57 gain 139 146 -119.43 gain 146 139 -118.01 gain 139 147 -115.03 gain 147 139 -110.70 gain 139 148 -122.16 gain 148 139 -117.55 gain 139 149 -119.60 gain 149 139 -118.15 gain 139 150 -115.46 gain 150 139 -116.70 gain 139 151 -109.19 gain 151 139 -110.62 gain 139 152 -104.48 gain 152 139 -102.89 gain 139 153 -100.19 gain 153 139 -96.18 gain 139 154 -94.27 gain 154 139 -98.81 gain 139 155 -98.94 gain 155 139 -103.38 gain 139 156 -104.90 gain 156 139 -103.72 gain 139 157 -111.17 gain 157 139 -112.94 gain 139 158 -116.51 gain 158 139 -120.87 gain 139 159 -113.09 gain 159 139 -114.07 gain 139 160 -123.29 gain 160 139 -121.38 gain 139 161 -121.77 gain 161 139 -123.35 gain 139 162 -114.78 gain 162 139 -115.22 gain 139 163 -124.70 gain 163 139 -127.29 gain 139 164 -122.84 gain 164 139 -126.48 gain 139 165 -122.04 gain 165 139 -121.72 gain 139 166 -107.11 gain 166 139 -108.36 gain 139 167 -108.03 gain 167 139 -111.37 gain 139 168 -100.02 gain 168 139 -101.81 gain 139 169 -101.64 gain 169 139 -107.63 gain 139 170 -112.35 gain 170 139 -109.87 gain 139 171 -108.53 gain 171 139 -111.07 gain 139 172 -108.52 gain 172 139 -105.76 gain 139 173 -114.00 gain 173 139 -110.67 gain 139 174 -114.77 gain 174 139 -115.74 gain 139 175 -117.86 gain 175 139 -122.38 gain 139 176 -114.25 gain 176 139 -110.78 gain 139 177 -118.69 gain 177 139 -123.03 gain 139 178 -119.01 gain 178 139 -119.18 gain 139 179 -114.07 gain 179 139 -112.63 gain 139 180 -120.21 gain 180 139 -120.24 gain 139 181 -109.90 gain 181 139 -109.99 gain 139 182 -109.66 gain 182 139 -112.14 gain 139 183 -109.33 gain 183 139 -105.20 gain 139 184 -106.33 gain 184 139 -106.98 gain 139 185 -111.23 gain 185 139 -109.36 gain 139 186 -109.39 gain 186 139 -107.82 gain 139 187 -111.81 gain 187 139 -112.77 gain 139 188 -115.49 gain 188 139 -119.72 gain 139 189 -115.65 gain 189 139 -117.39 gain 139 190 -125.67 gain 190 139 -124.42 gain 139 191 -125.04 gain 191 139 -124.88 gain 139 192 -121.18 gain 192 139 -123.88 gain 139 193 -115.68 gain 193 139 -119.64 gain 139 194 -126.55 gain 194 139 -124.32 gain 139 195 -108.24 gain 195 139 -106.64 gain 139 196 -114.27 gain 196 139 -116.71 gain 139 197 -108.21 gain 197 139 -106.72 gain 139 198 -117.80 gain 198 139 -115.83 gain 139 199 -110.19 gain 199 139 -112.14 gain 139 200 -108.17 gain 200 139 -107.05 gain 139 201 -113.60 gain 201 139 -113.29 gain 139 202 -108.63 gain 202 139 -112.32 gain 139 203 -119.02 gain 203 139 -122.32 gain 139 204 -114.10 gain 204 139 -114.69 gain 139 205 -119.37 gain 205 139 -119.04 gain 139 206 -114.94 gain 206 139 -119.13 gain 139 207 -123.69 gain 207 139 -120.24 gain 139 208 -122.53 gain 208 139 -124.85 gain 139 209 -121.09 gain 209 139 -124.40 gain 139 210 -119.24 gain 210 139 -119.49 gain 139 211 -107.43 gain 211 139 -109.71 gain 139 212 -117.18 gain 212 139 -118.00 gain 139 213 -118.57 gain 213 139 -118.58 gain 139 214 -114.97 gain 214 139 -114.87 gain 139 215 -122.30 gain 215 139 -118.61 gain 139 216 -113.34 gain 216 139 -114.32 gain 139 217 -114.92 gain 217 139 -116.41 gain 139 218 -112.66 gain 218 139 -116.34 gain 139 219 -117.62 gain 219 139 -112.66 gain 139 220 -116.86 gain 220 139 -122.39 gain 139 221 -117.52 gain 221 139 -118.69 gain 139 222 -122.06 gain 222 139 -123.56 gain 139 223 -120.85 gain 223 139 -120.96 gain 139 224 -124.20 gain 224 139 -127.00 gain 140 141 -95.73 gain 141 140 -94.40 gain 140 142 -110.61 gain 142 140 -108.59 gain 140 143 -107.28 gain 143 140 -104.88 gain 140 144 -121.47 gain 144 140 -120.09 gain 140 145 -114.64 gain 145 140 -111.70 gain 140 146 -114.10 gain 146 140 -110.07 gain 140 147 -119.68 gain 147 140 -112.74 gain 140 148 -126.93 gain 148 140 -119.71 gain 140 149 -129.54 gain 149 140 -125.49 gain 140 150 -119.10 gain 150 140 -117.73 gain 140 151 -115.90 gain 151 140 -114.73 gain 140 152 -110.32 gain 152 140 -106.13 gain 140 153 -112.72 gain 153 140 -106.10 gain 140 154 -102.26 gain 154 140 -104.19 gain 140 155 -101.07 gain 155 140 -102.90 gain 140 156 -97.83 gain 156 140 -94.04 gain 140 157 -110.88 gain 157 140 -110.04 gain 140 158 -112.03 gain 158 140 -113.78 gain 140 159 -114.99 gain 159 140 -113.36 gain 140 160 -119.36 gain 160 140 -114.84 gain 140 161 -117.45 gain 161 140 -116.42 gain 140 162 -123.14 gain 162 140 -120.98 gain 140 163 -126.88 gain 163 140 -126.87 gain 140 164 -121.12 gain 164 140 -122.15 gain 140 165 -117.21 gain 165 140 -114.28 gain 140 166 -119.12 gain 166 140 -117.76 gain 140 167 -115.09 gain 167 140 -115.81 gain 140 168 -107.13 gain 168 140 -106.31 gain 140 169 -114.26 gain 169 140 -117.64 gain 140 170 -105.30 gain 170 140 -100.21 gain 140 171 -105.91 gain 171 140 -105.84 gain 140 172 -105.66 gain 172 140 -100.29 gain 140 173 -116.80 gain 173 140 -110.86 gain 140 174 -121.07 gain 174 140 -119.43 gain 140 175 -116.53 gain 175 140 -118.44 gain 140 176 -113.74 gain 176 140 -107.66 gain 140 177 -116.67 gain 177 140 -118.41 gain 140 178 -120.40 gain 178 140 -117.96 gain 140 179 -119.56 gain 179 140 -115.52 gain 140 180 -118.20 gain 180 140 -115.62 gain 140 181 -117.72 gain 181 140 -115.21 gain 140 182 -111.28 gain 182 140 -111.15 gain 140 183 -114.61 gain 183 140 -107.87 gain 140 184 -108.53 gain 184 140 -106.57 gain 140 185 -107.61 gain 185 140 -103.15 gain 140 186 -112.54 gain 186 140 -108.36 gain 140 187 -101.92 gain 187 140 -100.28 gain 140 188 -121.22 gain 188 140 -122.83 gain 140 189 -109.33 gain 189 140 -108.46 gain 140 190 -126.30 gain 190 140 -122.44 gain 140 191 -114.93 gain 191 140 -112.16 gain 140 192 -123.01 gain 192 140 -123.10 gain 140 193 -118.82 gain 193 140 -120.17 gain 140 194 -123.41 gain 194 140 -118.57 gain 140 195 -119.25 gain 195 140 -115.04 gain 140 196 -121.50 gain 196 140 -121.33 gain 140 197 -120.66 gain 197 140 -116.56 gain 140 198 -117.62 gain 198 140 -113.03 gain 140 199 -110.40 gain 199 140 -109.73 gain 140 200 -107.40 gain 200 140 -103.67 gain 140 201 -111.30 gain 201 140 -108.38 gain 140 202 -111.12 gain 202 140 -112.20 gain 140 203 -115.36 gain 203 140 -116.06 gain 140 204 -115.35 gain 204 140 -113.34 gain 140 205 -132.03 gain 205 140 -129.09 gain 140 206 -117.33 gain 206 140 -118.91 gain 140 207 -124.76 gain 207 140 -118.70 gain 140 208 -124.44 gain 208 140 -124.15 gain 140 209 -124.65 gain 209 140 -125.36 gain 140 210 -125.48 gain 210 140 -123.13 gain 140 211 -124.26 gain 211 140 -123.92 gain 140 212 -118.52 gain 212 140 -116.73 gain 140 213 -117.57 gain 213 140 -114.97 gain 140 214 -114.63 gain 214 140 -111.92 gain 140 215 -113.93 gain 215 140 -107.64 gain 140 216 -128.07 gain 216 140 -126.44 gain 140 217 -114.66 gain 217 140 -113.54 gain 140 218 -122.77 gain 218 140 -123.84 gain 140 219 -129.47 gain 219 140 -121.91 gain 140 220 -122.19 gain 220 140 -125.11 gain 140 221 -118.68 gain 221 140 -117.24 gain 140 222 -118.26 gain 222 140 -117.16 gain 140 223 -122.74 gain 223 140 -120.24 gain 140 224 -128.29 gain 224 140 -128.49 gain 141 142 -87.87 gain 142 141 -87.17 gain 141 143 -100.11 gain 143 141 -99.03 gain 141 144 -112.27 gain 144 141 -112.21 gain 141 145 -108.63 gain 145 141 -107.01 gain 141 146 -116.64 gain 146 141 -113.94 gain 141 147 -114.28 gain 147 141 -108.67 gain 141 148 -114.58 gain 148 141 -108.68 gain 141 149 -126.29 gain 149 141 -123.57 gain 141 150 -114.92 gain 150 141 -114.88 gain 141 151 -117.20 gain 151 141 -117.35 gain 141 152 -112.64 gain 152 141 -109.77 gain 141 153 -109.07 gain 153 141 -103.78 gain 141 154 -103.91 gain 154 141 -107.17 gain 141 155 -95.31 gain 155 141 -98.46 gain 141 156 -93.56 gain 156 141 -91.10 gain 141 157 -99.78 gain 157 141 -100.27 gain 141 158 -107.24 gain 158 141 -110.33 gain 141 159 -113.78 gain 159 141 -113.48 gain 141 160 -109.77 gain 160 141 -106.58 gain 141 161 -118.06 gain 161 141 -118.36 gain 141 162 -120.38 gain 162 141 -119.55 gain 141 163 -118.69 gain 163 141 -120.01 gain 141 164 -118.98 gain 164 141 -121.34 gain 141 165 -125.68 gain 165 141 -124.07 gain 141 166 -120.02 gain 166 141 -119.98 gain 141 167 -111.99 gain 167 141 -114.04 gain 141 168 -104.80 gain 168 141 -105.30 gain 141 169 -109.68 gain 169 141 -114.39 gain 141 170 -108.44 gain 170 141 -104.67 gain 141 171 -105.92 gain 171 141 -107.17 gain 141 172 -108.75 gain 172 141 -104.70 gain 141 173 -109.07 gain 173 141 -104.45 gain 141 174 -115.00 gain 174 141 -114.69 gain 141 175 -115.67 gain 175 141 -118.91 gain 141 176 -111.44 gain 176 141 -106.70 gain 141 177 -118.50 gain 177 141 -121.56 gain 141 178 -123.27 gain 178 141 -122.15 gain 141 179 -120.10 gain 179 141 -117.38 gain 141 180 -120.06 gain 180 141 -118.81 gain 141 181 -123.22 gain 181 141 -122.04 gain 141 182 -110.96 gain 182 141 -112.16 gain 141 183 -112.18 gain 183 141 -106.77 gain 141 184 -106.01 gain 184 141 -105.39 gain 141 185 -104.56 gain 185 141 -101.42 gain 141 186 -109.70 gain 186 141 -106.84 gain 141 187 -110.41 gain 187 141 -110.09 gain 141 188 -109.32 gain 188 141 -112.27 gain 141 189 -120.39 gain 189 141 -120.85 gain 141 190 -114.47 gain 190 141 -111.93 gain 141 191 -110.26 gain 191 141 -108.82 gain 141 192 -118.43 gain 192 141 -119.86 gain 141 193 -125.17 gain 193 141 -127.85 gain 141 194 -117.93 gain 194 141 -114.42 gain 141 195 -120.51 gain 195 141 -117.63 gain 141 196 -115.98 gain 196 141 -117.15 gain 141 197 -121.87 gain 197 141 -119.09 gain 141 198 -116.19 gain 198 141 -112.94 gain 141 199 -115.94 gain 199 141 -116.60 gain 141 200 -115.32 gain 200 141 -112.92 gain 141 201 -117.54 gain 201 141 -115.94 gain 141 202 -110.61 gain 202 141 -113.02 gain 141 203 -112.03 gain 203 141 -114.05 gain 141 204 -116.54 gain 204 141 -115.85 gain 141 205 -114.78 gain 205 141 -113.17 gain 141 206 -119.64 gain 206 141 -122.55 gain 141 207 -122.56 gain 207 141 -117.82 gain 141 208 -126.13 gain 208 141 -127.18 gain 141 209 -121.18 gain 209 141 -123.21 gain 141 210 -118.96 gain 210 141 -117.93 gain 141 211 -121.11 gain 211 141 -122.10 gain 141 212 -122.35 gain 212 141 -121.89 gain 141 213 -116.78 gain 213 141 -115.51 gain 141 214 -116.44 gain 214 141 -115.05 gain 141 215 -114.11 gain 215 141 -109.14 gain 141 216 -117.14 gain 216 141 -116.83 gain 141 217 -118.22 gain 217 141 -118.43 gain 141 218 -117.17 gain 218 141 -119.57 gain 141 219 -115.00 gain 219 141 -108.76 gain 141 220 -119.10 gain 220 141 -123.35 gain 141 221 -121.04 gain 221 141 -120.94 gain 141 222 -112.93 gain 222 141 -113.15 gain 141 223 -130.46 gain 223 141 -129.29 gain 141 224 -114.55 gain 224 141 -116.07 gain 142 143 -88.82 gain 143 142 -88.44 gain 142 144 -104.60 gain 144 142 -105.23 gain 142 145 -101.64 gain 145 142 -100.72 gain 142 146 -105.69 gain 146 142 -103.68 gain 142 147 -118.87 gain 147 142 -113.95 gain 142 148 -115.15 gain 148 142 -109.95 gain 142 149 -115.00 gain 149 142 -112.97 gain 142 150 -118.77 gain 150 142 -119.42 gain 142 151 -125.29 gain 151 142 -126.14 gain 142 152 -114.29 gain 152 142 -112.12 gain 142 153 -111.43 gain 153 142 -106.83 gain 142 154 -104.35 gain 154 142 -108.30 gain 142 155 -102.79 gain 155 142 -106.64 gain 142 156 -100.89 gain 156 142 -99.13 gain 142 157 -94.79 gain 157 142 -95.97 gain 142 158 -97.51 gain 158 142 -101.29 gain 142 159 -101.77 gain 159 142 -102.17 gain 142 160 -106.93 gain 160 142 -104.44 gain 142 161 -108.28 gain 161 142 -109.27 gain 142 162 -121.12 gain 162 142 -120.98 gain 142 163 -115.57 gain 163 142 -117.58 gain 142 164 -124.28 gain 164 142 -127.32 gain 142 165 -118.15 gain 165 142 -117.24 gain 142 166 -119.84 gain 166 142 -120.50 gain 142 167 -115.61 gain 167 142 -118.36 gain 142 168 -109.32 gain 168 142 -110.52 gain 142 169 -107.54 gain 169 142 -112.94 gain 142 170 -104.43 gain 170 142 -101.36 gain 142 171 -97.29 gain 171 142 -99.24 gain 142 172 -109.87 gain 172 142 -106.52 gain 142 173 -101.76 gain 173 142 -97.84 gain 142 174 -109.75 gain 174 142 -110.13 gain 142 175 -108.70 gain 175 142 -112.64 gain 142 176 -116.08 gain 176 142 -112.03 gain 142 177 -118.09 gain 177 142 -121.84 gain 142 178 -122.24 gain 178 142 -121.82 gain 142 179 -122.12 gain 179 142 -120.09 gain 142 180 -129.79 gain 180 142 -129.23 gain 142 181 -119.12 gain 181 142 -118.62 gain 142 182 -118.72 gain 182 142 -120.61 gain 142 183 -110.95 gain 183 142 -106.23 gain 142 184 -114.57 gain 184 142 -114.64 gain 142 185 -113.35 gain 185 142 -110.90 gain 142 186 -113.12 gain 186 142 -110.95 gain 142 187 -99.81 gain 187 142 -100.18 gain 142 188 -117.67 gain 188 142 -121.30 gain 142 189 -108.21 gain 189 142 -109.36 gain 142 190 -114.47 gain 190 142 -112.63 gain 142 191 -112.72 gain 191 142 -111.97 gain 142 192 -115.34 gain 192 142 -117.46 gain 142 193 -114.49 gain 193 142 -117.86 gain 142 194 -118.50 gain 194 142 -115.68 gain 142 195 -129.81 gain 195 142 -127.63 gain 142 196 -123.74 gain 196 142 -125.60 gain 142 197 -120.37 gain 197 142 -118.29 gain 142 198 -109.61 gain 198 142 -107.05 gain 142 199 -119.67 gain 199 142 -121.03 gain 142 200 -113.20 gain 200 142 -111.49 gain 142 201 -115.94 gain 201 142 -115.04 gain 142 202 -112.62 gain 202 142 -115.72 gain 142 203 -113.19 gain 203 142 -115.91 gain 142 204 -118.25 gain 204 142 -118.25 gain 142 205 -125.06 gain 205 142 -124.14 gain 142 206 -114.94 gain 206 142 -118.54 gain 142 207 -121.17 gain 207 142 -117.13 gain 142 208 -111.17 gain 208 142 -112.91 gain 142 209 -124.30 gain 209 142 -127.03 gain 142 210 -122.86 gain 210 142 -122.53 gain 142 211 -125.92 gain 211 142 -127.61 gain 142 212 -122.08 gain 212 142 -122.31 gain 142 213 -116.44 gain 213 142 -115.87 gain 142 214 -113.39 gain 214 142 -112.70 gain 142 215 -111.60 gain 215 142 -107.32 gain 142 216 -112.06 gain 216 142 -112.45 gain 142 217 -118.73 gain 217 142 -119.63 gain 142 218 -110.49 gain 218 142 -113.59 gain 142 219 -114.47 gain 219 142 -108.92 gain 142 220 -122.12 gain 220 142 -127.07 gain 142 221 -119.86 gain 221 142 -120.45 gain 142 222 -118.62 gain 222 142 -119.53 gain 142 223 -116.68 gain 223 142 -116.21 gain 142 224 -122.82 gain 224 142 -125.03 gain 143 144 -89.35 gain 144 143 -90.37 gain 143 145 -109.00 gain 145 143 -108.47 gain 143 146 -107.17 gain 146 143 -105.54 gain 143 147 -107.07 gain 147 143 -102.54 gain 143 148 -121.14 gain 148 143 -116.32 gain 143 149 -118.45 gain 149 143 -116.80 gain 143 150 -116.66 gain 150 143 -117.70 gain 143 151 -123.50 gain 151 143 -124.73 gain 143 152 -110.52 gain 152 143 -108.73 gain 143 153 -117.11 gain 153 143 -112.90 gain 143 154 -112.14 gain 154 143 -116.47 gain 143 155 -105.77 gain 155 143 -110.00 gain 143 156 -106.88 gain 156 143 -105.50 gain 143 157 -99.88 gain 157 143 -101.45 gain 143 158 -94.37 gain 158 143 -98.53 gain 143 159 -99.48 gain 159 143 -100.25 gain 143 160 -103.04 gain 160 143 -100.93 gain 143 161 -106.49 gain 161 143 -107.87 gain 143 162 -110.27 gain 162 143 -110.51 gain 143 163 -115.92 gain 163 143 -118.31 gain 143 164 -116.73 gain 164 143 -120.16 gain 143 165 -120.80 gain 165 143 -120.27 gain 143 166 -122.92 gain 166 143 -123.96 gain 143 167 -115.40 gain 167 143 -118.54 gain 143 168 -116.93 gain 168 143 -118.52 gain 143 169 -101.79 gain 169 143 -107.57 gain 143 170 -112.27 gain 170 143 -109.58 gain 143 171 -105.79 gain 171 143 -108.12 gain 143 172 -101.53 gain 172 143 -98.56 gain 143 173 -103.51 gain 173 143 -99.97 gain 143 174 -108.24 gain 174 143 -109.01 gain 143 175 -108.60 gain 175 143 -112.92 gain 143 176 -106.48 gain 176 143 -102.80 gain 143 177 -108.13 gain 177 143 -112.27 gain 143 178 -119.41 gain 178 143 -119.37 gain 143 179 -113.88 gain 179 143 -112.24 gain 143 180 -123.07 gain 180 143 -122.89 gain 143 181 -122.15 gain 181 143 -122.05 gain 143 182 -124.70 gain 182 143 -126.98 gain 143 183 -120.43 gain 183 143 -116.10 gain 143 184 -111.76 gain 184 143 -112.21 gain 143 185 -113.61 gain 185 143 -111.55 gain 143 186 -107.06 gain 186 143 -105.28 gain 143 187 -103.74 gain 187 143 -104.50 gain 143 188 -102.17 gain 188 143 -106.19 gain 143 189 -117.07 gain 189 143 -118.61 gain 143 190 -108.79 gain 190 143 -107.34 gain 143 191 -102.19 gain 191 143 -101.82 gain 143 192 -114.07 gain 192 143 -116.58 gain 143 193 -119.52 gain 193 143 -123.27 gain 143 194 -112.05 gain 194 143 -109.62 gain 143 195 -124.25 gain 195 143 -122.45 gain 143 196 -115.13 gain 196 143 -117.37 gain 143 197 -120.87 gain 197 143 -119.17 gain 143 198 -119.70 gain 198 143 -117.53 gain 143 199 -118.59 gain 199 143 -120.33 gain 143 200 -110.39 gain 200 143 -109.07 gain 143 201 -109.28 gain 201 143 -108.77 gain 143 202 -112.90 gain 202 143 -116.38 gain 143 203 -110.75 gain 203 143 -113.85 gain 143 204 -107.86 gain 204 143 -108.24 gain 143 205 -114.68 gain 205 143 -114.14 gain 143 206 -112.96 gain 206 143 -116.95 gain 143 207 -119.02 gain 207 143 -115.36 gain 143 208 -111.91 gain 208 143 -114.03 gain 143 209 -119.63 gain 209 143 -122.75 gain 143 210 -129.58 gain 210 143 -129.63 gain 143 211 -115.35 gain 211 143 -117.42 gain 143 212 -121.41 gain 212 143 -122.02 gain 143 213 -123.21 gain 213 143 -123.02 gain 143 214 -120.30 gain 214 143 -120.00 gain 143 215 -113.63 gain 215 143 -109.74 gain 143 216 -116.68 gain 216 143 -117.45 gain 143 217 -109.35 gain 217 143 -110.64 gain 143 218 -118.10 gain 218 143 -121.58 gain 143 219 -111.05 gain 219 143 -105.89 gain 143 220 -115.79 gain 220 143 -121.12 gain 143 221 -119.93 gain 221 143 -120.90 gain 143 222 -122.34 gain 222 143 -123.64 gain 143 223 -121.75 gain 223 143 -121.66 gain 143 224 -130.78 gain 224 143 -133.38 gain 144 145 -99.88 gain 145 144 -98.33 gain 144 146 -106.20 gain 146 144 -103.56 gain 144 147 -100.02 gain 147 144 -94.47 gain 144 148 -109.98 gain 148 144 -104.15 gain 144 149 -126.04 gain 149 144 -123.38 gain 144 150 -123.49 gain 150 144 -123.51 gain 144 151 -123.64 gain 151 144 -123.86 gain 144 152 -116.55 gain 152 144 -113.74 gain 144 153 -122.92 gain 153 144 -117.69 gain 144 154 -115.85 gain 154 144 -119.17 gain 144 155 -113.71 gain 155 144 -116.92 gain 144 156 -112.34 gain 156 144 -109.95 gain 144 157 -111.84 gain 157 144 -112.38 gain 144 158 -95.44 gain 158 144 -98.58 gain 144 159 -95.78 gain 159 144 -95.54 gain 144 160 -111.00 gain 160 144 -107.87 gain 144 161 -103.73 gain 161 144 -104.09 gain 144 162 -100.91 gain 162 144 -100.14 gain 144 163 -116.62 gain 163 144 -118.00 gain 144 164 -116.03 gain 164 144 -118.45 gain 144 165 -125.11 gain 165 144 -123.57 gain 144 166 -118.45 gain 166 144 -118.48 gain 144 167 -123.93 gain 167 144 -126.05 gain 144 168 -117.03 gain 168 144 -117.60 gain 144 169 -124.82 gain 169 144 -129.58 gain 144 170 -116.36 gain 170 144 -112.65 gain 144 171 -114.57 gain 171 144 -115.89 gain 144 172 -107.15 gain 172 144 -103.16 gain 144 173 -102.68 gain 173 144 -98.13 gain 144 174 -100.19 gain 174 144 -99.94 gain 144 175 -106.97 gain 175 144 -110.27 gain 144 176 -106.89 gain 176 144 -102.20 gain 144 177 -114.42 gain 177 144 -117.54 gain 144 178 -114.53 gain 178 144 -113.48 gain 144 179 -117.69 gain 179 144 -115.03 gain 144 180 -128.00 gain 180 144 -126.81 gain 144 181 -124.11 gain 181 144 -122.98 gain 144 182 -120.72 gain 182 144 -121.98 gain 144 183 -116.68 gain 183 144 -111.34 gain 144 184 -122.58 gain 184 144 -122.02 gain 144 185 -117.73 gain 185 144 -114.65 gain 144 186 -113.75 gain 186 144 -110.95 gain 144 187 -102.01 gain 187 144 -101.75 gain 144 188 -106.17 gain 188 144 -109.17 gain 144 189 -106.51 gain 189 144 -107.03 gain 144 190 -111.64 gain 190 144 -109.17 gain 144 191 -109.75 gain 191 144 -108.37 gain 144 192 -108.99 gain 192 144 -110.47 gain 144 193 -115.58 gain 193 144 -118.32 gain 144 194 -113.44 gain 194 144 -109.99 gain 144 195 -120.10 gain 195 144 -117.28 gain 144 196 -119.45 gain 196 144 -120.68 gain 144 197 -117.59 gain 197 144 -114.87 gain 144 198 -115.08 gain 198 144 -111.89 gain 144 199 -113.19 gain 199 144 -113.91 gain 144 200 -111.70 gain 200 144 -109.36 gain 144 201 -114.96 gain 201 144 -113.42 gain 144 202 -117.18 gain 202 144 -119.65 gain 144 203 -106.99 gain 203 144 -109.08 gain 144 204 -114.54 gain 204 144 -113.91 gain 144 205 -112.31 gain 205 144 -110.76 gain 144 206 -109.90 gain 206 144 -112.87 gain 144 207 -111.55 gain 207 144 -106.87 gain 144 208 -116.38 gain 208 144 -117.48 gain 144 209 -120.57 gain 209 144 -122.67 gain 144 210 -133.64 gain 210 144 -132.67 gain 144 211 -125.16 gain 211 144 -126.22 gain 144 212 -114.67 gain 212 144 -114.26 gain 144 213 -124.88 gain 213 144 -123.67 gain 144 214 -120.47 gain 214 144 -119.15 gain 144 215 -113.53 gain 215 144 -108.62 gain 144 216 -121.76 gain 216 144 -121.52 gain 144 217 -117.92 gain 217 144 -118.20 gain 144 218 -117.05 gain 218 144 -119.52 gain 144 219 -110.53 gain 219 144 -104.35 gain 144 220 -112.73 gain 220 144 -117.04 gain 144 221 -124.43 gain 221 144 -124.39 gain 144 222 -106.84 gain 222 144 -107.12 gain 144 223 -114.83 gain 223 144 -113.72 gain 144 224 -117.84 gain 224 144 -119.42 gain 145 146 -90.32 gain 146 145 -89.23 gain 145 147 -108.62 gain 147 145 -104.62 gain 145 148 -101.90 gain 148 145 -97.61 gain 145 149 -105.01 gain 149 145 -103.90 gain 145 150 -124.31 gain 150 145 -125.88 gain 145 151 -116.66 gain 151 145 -118.42 gain 145 152 -119.03 gain 152 145 -117.77 gain 145 153 -115.84 gain 153 145 -112.16 gain 145 154 -119.35 gain 154 145 -124.22 gain 145 155 -114.48 gain 155 145 -119.24 gain 145 156 -106.75 gain 156 145 -105.91 gain 145 157 -104.74 gain 157 145 -106.84 gain 145 158 -104.77 gain 158 145 -109.47 gain 145 159 -97.29 gain 159 145 -98.60 gain 145 160 -85.99 gain 160 145 -84.41 gain 145 161 -103.40 gain 161 145 -105.31 gain 145 162 -102.35 gain 162 145 -103.13 gain 145 163 -115.68 gain 163 145 -118.60 gain 145 164 -113.65 gain 164 145 -117.62 gain 145 165 -124.17 gain 165 145 -124.18 gain 145 166 -125.82 gain 166 145 -127.40 gain 145 167 -122.85 gain 167 145 -126.51 gain 145 168 -118.09 gain 168 145 -120.20 gain 145 169 -120.55 gain 169 145 -126.87 gain 145 170 -123.74 gain 170 145 -121.58 gain 145 171 -116.88 gain 171 145 -119.74 gain 145 172 -102.59 gain 172 145 -100.15 gain 145 173 -109.34 gain 173 145 -106.33 gain 145 174 -102.49 gain 174 145 -103.79 gain 145 175 -92.30 gain 175 145 -97.15 gain 145 176 -96.23 gain 176 145 -93.09 gain 145 177 -111.76 gain 177 145 -116.43 gain 145 178 -105.04 gain 178 145 -105.54 gain 145 179 -117.32 gain 179 145 -116.21 gain 145 180 -124.48 gain 180 145 -124.84 gain 145 181 -122.69 gain 181 145 -123.12 gain 145 182 -114.11 gain 182 145 -116.92 gain 145 183 -121.27 gain 183 145 -117.47 gain 145 184 -115.55 gain 184 145 -116.54 gain 145 185 -114.63 gain 185 145 -113.10 gain 145 186 -111.85 gain 186 145 -110.60 gain 145 187 -109.66 gain 187 145 -110.95 gain 145 188 -115.68 gain 188 145 -120.23 gain 145 189 -115.65 gain 189 145 -117.72 gain 145 190 -112.21 gain 190 145 -111.29 gain 145 191 -111.50 gain 191 145 -111.67 gain 145 192 -109.34 gain 192 145 -112.38 gain 145 193 -114.99 gain 193 145 -119.28 gain 145 194 -110.88 gain 194 145 -108.98 gain 145 195 -130.38 gain 195 145 -129.11 gain 145 196 -117.65 gain 196 145 -120.42 gain 145 197 -127.36 gain 197 145 -126.19 gain 145 198 -120.40 gain 198 145 -118.76 gain 145 199 -120.75 gain 199 145 -123.02 gain 145 200 -115.77 gain 200 145 -114.98 gain 145 201 -117.93 gain 201 145 -117.95 gain 145 202 -112.31 gain 202 145 -116.32 gain 145 203 -103.22 gain 203 145 -106.86 gain 145 204 -111.34 gain 204 145 -112.26 gain 145 205 -110.21 gain 205 145 -110.21 gain 145 206 -105.88 gain 206 145 -110.40 gain 145 207 -104.35 gain 207 145 -101.23 gain 145 208 -117.69 gain 208 145 -120.34 gain 145 209 -115.85 gain 209 145 -119.50 gain 145 210 -128.00 gain 210 145 -128.58 gain 145 211 -124.48 gain 211 145 -127.09 gain 145 212 -121.98 gain 212 145 -123.13 gain 145 213 -117.13 gain 213 145 -117.47 gain 145 214 -121.19 gain 214 145 -121.42 gain 145 215 -116.97 gain 215 145 -113.62 gain 145 216 -122.99 gain 216 145 -124.29 gain 145 217 -112.08 gain 217 145 -113.91 gain 145 218 -119.35 gain 218 145 -123.37 gain 145 219 -124.29 gain 219 145 -119.67 gain 145 220 -112.88 gain 220 145 -118.74 gain 145 221 -113.92 gain 221 145 -115.43 gain 145 222 -117.84 gain 222 145 -119.67 gain 145 223 -117.54 gain 223 145 -117.98 gain 145 224 -117.81 gain 224 145 -120.94 gain 146 147 -95.37 gain 147 146 -92.46 gain 146 148 -102.72 gain 148 146 -99.53 gain 146 149 -102.44 gain 149 146 -102.41 gain 146 150 -128.58 gain 150 146 -131.24 gain 146 151 -123.74 gain 151 146 -126.60 gain 146 152 -119.99 gain 152 146 -119.82 gain 146 153 -119.10 gain 153 146 -116.51 gain 146 154 -111.72 gain 154 146 -117.68 gain 146 155 -115.91 gain 155 146 -121.77 gain 146 156 -120.54 gain 156 146 -120.78 gain 146 157 -105.11 gain 157 146 -108.30 gain 146 158 -108.17 gain 158 146 -113.95 gain 146 159 -102.29 gain 159 146 -104.69 gain 146 160 -92.62 gain 160 146 -92.13 gain 146 161 -93.41 gain 161 146 -96.42 gain 146 162 -103.12 gain 162 146 -104.99 gain 146 163 -103.09 gain 163 146 -107.10 gain 146 164 -100.35 gain 164 146 -105.41 gain 146 165 -115.80 gain 165 146 -116.90 gain 146 166 -120.37 gain 166 146 -123.04 gain 146 167 -111.87 gain 167 146 -116.63 gain 146 168 -127.54 gain 168 146 -130.75 gain 146 169 -119.49 gain 169 146 -126.89 gain 146 170 -110.94 gain 170 146 -109.87 gain 146 171 -107.71 gain 171 146 -111.67 gain 146 172 -113.69 gain 172 146 -112.34 gain 146 173 -101.68 gain 173 146 -99.77 gain 146 174 -105.13 gain 174 146 -107.52 gain 146 175 -104.19 gain 175 146 -110.13 gain 146 176 -98.37 gain 176 146 -96.32 gain 146 177 -105.37 gain 177 146 -111.13 gain 146 178 -99.97 gain 178 146 -101.56 gain 146 179 -115.07 gain 179 146 -115.05 gain 146 180 -132.22 gain 180 146 -133.67 gain 146 181 -122.44 gain 181 146 -123.95 gain 146 182 -125.15 gain 182 146 -129.05 gain 146 183 -117.13 gain 183 146 -114.42 gain 146 184 -116.36 gain 184 146 -118.44 gain 146 185 -116.34 gain 185 146 -115.90 gain 146 186 -104.88 gain 186 146 -104.72 gain 146 187 -117.54 gain 187 146 -119.92 gain 146 188 -102.51 gain 188 146 -108.16 gain 146 189 -111.62 gain 189 146 -114.77 gain 146 190 -108.37 gain 190 146 -108.54 gain 146 191 -103.57 gain 191 146 -104.83 gain 146 192 -104.15 gain 192 146 -108.27 gain 146 193 -110.48 gain 193 146 -115.86 gain 146 194 -117.30 gain 194 146 -116.49 gain 146 195 -122.13 gain 195 146 -121.95 gain 146 196 -120.45 gain 196 146 -124.31 gain 146 197 -119.71 gain 197 146 -119.64 gain 146 198 -121.16 gain 198 146 -120.60 gain 146 199 -119.42 gain 199 146 -122.79 gain 146 200 -109.31 gain 200 146 -109.61 gain 146 201 -117.32 gain 201 146 -118.43 gain 146 202 -110.84 gain 202 146 -115.95 gain 146 203 -115.66 gain 203 146 -120.38 gain 146 204 -109.67 gain 204 146 -111.69 gain 146 205 -112.65 gain 205 146 -113.74 gain 146 206 -105.15 gain 206 146 -110.76 gain 146 207 -111.57 gain 207 146 -109.54 gain 146 208 -113.74 gain 208 146 -117.49 gain 146 209 -112.08 gain 209 146 -116.82 gain 146 210 -120.88 gain 210 146 -122.56 gain 146 211 -122.72 gain 211 146 -126.41 gain 146 212 -120.50 gain 212 146 -122.74 gain 146 213 -116.89 gain 213 146 -118.32 gain 146 214 -123.22 gain 214 146 -124.54 gain 146 215 -113.37 gain 215 146 -111.11 gain 146 216 -116.82 gain 216 146 -119.22 gain 146 217 -118.36 gain 217 146 -121.27 gain 146 218 -117.24 gain 218 146 -122.34 gain 146 219 -116.80 gain 219 146 -113.27 gain 146 220 -106.15 gain 220 146 -113.10 gain 146 221 -108.70 gain 221 146 -111.30 gain 146 222 -110.42 gain 222 146 -113.34 gain 146 223 -109.45 gain 223 146 -110.99 gain 146 224 -117.88 gain 224 146 -122.10 gain 147 148 -89.44 gain 148 147 -89.16 gain 147 149 -97.74 gain 149 147 -100.62 gain 147 150 -125.60 gain 150 147 -131.17 gain 147 151 -122.03 gain 151 147 -127.79 gain 147 152 -123.24 gain 152 147 -125.98 gain 147 153 -119.72 gain 153 147 -120.04 gain 147 154 -116.31 gain 154 147 -125.18 gain 147 155 -108.90 gain 155 147 -117.66 gain 147 156 -114.92 gain 156 147 -118.07 gain 147 157 -112.04 gain 157 147 -118.14 gain 147 158 -97.90 gain 158 147 -106.59 gain 147 159 -98.10 gain 159 147 -103.41 gain 147 160 -101.74 gain 160 147 -104.17 gain 147 161 -84.71 gain 161 147 -90.62 gain 147 162 -94.35 gain 162 147 -99.12 gain 147 163 -97.58 gain 163 147 -104.51 gain 147 164 -98.53 gain 164 147 -106.50 gain 147 165 -124.00 gain 165 147 -128.00 gain 147 166 -115.23 gain 166 147 -120.80 gain 147 167 -126.14 gain 167 147 -133.81 gain 147 168 -118.41 gain 168 147 -124.52 gain 147 169 -117.69 gain 169 147 -128.00 gain 147 170 -110.95 gain 170 147 -112.80 gain 147 171 -112.25 gain 171 147 -119.11 gain 147 172 -111.36 gain 172 147 -112.92 gain 147 173 -106.00 gain 173 147 -107.00 gain 147 174 -106.47 gain 174 147 -111.76 gain 147 175 -106.75 gain 175 147 -115.60 gain 147 176 -94.88 gain 176 147 -95.74 gain 147 177 -97.93 gain 177 147 -106.60 gain 147 178 -100.85 gain 178 147 -105.35 gain 147 179 -98.27 gain 179 147 -101.16 gain 147 180 -121.49 gain 180 147 -125.85 gain 147 181 -125.68 gain 181 147 -130.10 gain 147 182 -121.41 gain 182 147 -128.22 gain 147 183 -119.14 gain 183 147 -119.34 gain 147 184 -114.52 gain 184 147 -119.51 gain 147 185 -119.99 gain 185 147 -122.46 gain 147 186 -117.34 gain 186 147 -120.09 gain 147 187 -111.34 gain 187 147 -116.63 gain 147 188 -113.57 gain 188 147 -122.12 gain 147 189 -105.44 gain 189 147 -111.51 gain 147 190 -107.90 gain 190 147 -110.98 gain 147 191 -102.41 gain 191 147 -106.58 gain 147 192 -101.24 gain 192 147 -108.28 gain 147 193 -99.45 gain 193 147 -107.74 gain 147 194 -110.59 gain 194 147 -112.69 gain 147 195 -115.81 gain 195 147 -118.54 gain 147 196 -113.53 gain 196 147 -120.31 gain 147 197 -115.28 gain 197 147 -118.12 gain 147 198 -120.37 gain 198 147 -122.72 gain 147 199 -117.90 gain 199 147 -124.17 gain 147 200 -118.37 gain 200 147 -121.59 gain 147 201 -122.63 gain 201 147 -126.65 gain 147 202 -112.61 gain 202 147 -120.63 gain 147 203 -117.07 gain 203 147 -124.71 gain 147 204 -111.14 gain 204 147 -116.07 gain 147 205 -108.73 gain 205 147 -112.73 gain 147 206 -103.64 gain 206 147 -112.15 gain 147 207 -104.02 gain 207 147 -104.90 gain 147 208 -105.71 gain 208 147 -112.36 gain 147 209 -107.11 gain 209 147 -114.75 gain 147 210 -121.44 gain 210 147 -126.02 gain 147 211 -125.65 gain 211 147 -132.26 gain 147 212 -120.06 gain 212 147 -125.21 gain 147 213 -119.00 gain 213 147 -123.34 gain 147 214 -122.14 gain 214 147 -126.37 gain 147 215 -116.28 gain 215 147 -116.92 gain 147 216 -121.37 gain 216 147 -126.67 gain 147 217 -118.98 gain 217 147 -124.80 gain 147 218 -119.45 gain 218 147 -127.47 gain 147 219 -117.13 gain 219 147 -116.51 gain 147 220 -110.37 gain 220 147 -120.23 gain 147 221 -108.78 gain 221 147 -114.28 gain 147 222 -111.49 gain 222 147 -117.32 gain 147 223 -109.26 gain 223 147 -113.70 gain 147 224 -115.65 gain 224 147 -122.78 gain 148 149 -87.76 gain 149 148 -90.92 gain 148 150 -127.02 gain 150 148 -132.87 gain 148 151 -120.63 gain 151 148 -126.68 gain 148 152 -119.89 gain 152 148 -122.92 gain 148 153 -121.29 gain 153 148 -121.90 gain 148 154 -123.23 gain 154 148 -132.38 gain 148 155 -118.62 gain 155 148 -127.66 gain 148 156 -115.87 gain 156 148 -119.30 gain 148 157 -116.53 gain 157 148 -122.92 gain 148 158 -111.09 gain 158 148 -120.06 gain 148 159 -104.52 gain 159 148 -110.12 gain 148 160 -104.01 gain 160 148 -106.71 gain 148 161 -96.76 gain 161 148 -102.95 gain 148 162 -93.87 gain 162 148 -98.92 gain 148 163 -89.45 gain 163 148 -96.66 gain 148 164 -92.86 gain 164 148 -101.11 gain 148 165 -117.40 gain 165 148 -121.69 gain 148 166 -120.83 gain 166 148 -126.69 gain 148 167 -121.02 gain 167 148 -128.97 gain 148 168 -122.31 gain 168 148 -128.71 gain 148 169 -125.43 gain 169 148 -136.03 gain 148 170 -119.13 gain 170 148 -121.26 gain 148 171 -113.48 gain 171 148 -120.63 gain 148 172 -109.87 gain 172 148 -111.71 gain 148 173 -114.51 gain 173 148 -115.79 gain 148 174 -103.77 gain 174 148 -109.35 gain 148 175 -105.32 gain 175 148 -114.46 gain 148 176 -98.86 gain 176 148 -100.00 gain 148 177 -96.51 gain 177 148 -105.46 gain 148 178 -95.24 gain 178 148 -100.02 gain 148 179 -101.20 gain 179 148 -104.38 gain 148 180 -117.34 gain 180 148 -121.98 gain 148 181 -125.61 gain 181 148 -130.32 gain 148 182 -114.80 gain 182 148 -121.89 gain 148 183 -116.72 gain 183 148 -117.20 gain 148 184 -117.22 gain 184 148 -122.49 gain 148 185 -115.86 gain 185 148 -118.61 gain 148 186 -118.47 gain 186 148 -121.50 gain 148 187 -115.53 gain 187 148 -121.10 gain 148 188 -103.09 gain 188 148 -111.92 gain 148 189 -108.98 gain 189 148 -115.33 gain 148 190 -103.50 gain 190 148 -106.86 gain 148 191 -104.41 gain 191 148 -108.86 gain 148 192 -103.78 gain 192 148 -111.10 gain 148 193 -95.04 gain 193 148 -103.61 gain 148 194 -107.06 gain 194 148 -109.45 gain 148 195 -119.34 gain 195 148 -122.36 gain 148 196 -130.80 gain 196 148 -137.86 gain 148 197 -122.63 gain 197 148 -125.75 gain 148 198 -116.61 gain 198 148 -119.25 gain 148 199 -111.89 gain 199 148 -118.45 gain 148 200 -114.43 gain 200 148 -117.93 gain 148 201 -116.54 gain 201 148 -120.84 gain 148 202 -118.44 gain 202 148 -126.74 gain 148 203 -115.65 gain 203 148 -123.57 gain 148 204 -113.96 gain 204 148 -119.16 gain 148 205 -106.61 gain 205 148 -110.89 gain 148 206 -104.83 gain 206 148 -113.63 gain 148 207 -101.60 gain 207 148 -102.76 gain 148 208 -106.46 gain 208 148 -113.40 gain 148 209 -114.27 gain 209 148 -122.20 gain 148 210 -116.33 gain 210 148 -121.20 gain 148 211 -121.29 gain 211 148 -128.18 gain 148 212 -122.45 gain 212 148 -127.88 gain 148 213 -116.01 gain 213 148 -120.64 gain 148 214 -123.19 gain 214 148 -127.70 gain 148 215 -112.61 gain 215 148 -113.53 gain 148 216 -121.68 gain 216 148 -127.26 gain 148 217 -111.02 gain 217 148 -117.13 gain 148 218 -116.93 gain 218 148 -125.23 gain 148 219 -107.61 gain 219 148 -107.26 gain 148 220 -106.77 gain 220 148 -116.91 gain 148 221 -107.99 gain 221 148 -113.78 gain 148 222 -114.42 gain 222 148 -120.53 gain 148 223 -103.68 gain 223 148 -108.41 gain 148 224 -112.28 gain 224 148 -119.69 gain 149 150 -123.09 gain 150 149 -125.77 gain 149 151 -125.47 gain 151 149 -128.36 gain 149 152 -117.12 gain 152 149 -116.98 gain 149 153 -131.05 gain 153 149 -128.49 gain 149 154 -121.68 gain 154 149 -127.66 gain 149 155 -116.78 gain 155 149 -122.66 gain 149 156 -122.17 gain 156 149 -122.44 gain 149 157 -122.10 gain 157 149 -125.32 gain 149 158 -116.56 gain 158 149 -122.37 gain 149 159 -107.96 gain 159 149 -110.39 gain 149 160 -117.88 gain 160 149 -117.42 gain 149 161 -110.67 gain 161 149 -113.70 gain 149 162 -105.87 gain 162 149 -107.76 gain 149 163 -95.13 gain 163 149 -99.17 gain 149 164 -92.39 gain 164 149 -97.47 gain 149 165 -123.39 gain 165 149 -124.52 gain 149 166 -127.68 gain 166 149 -130.37 gain 149 167 -122.16 gain 167 149 -126.94 gain 149 168 -127.85 gain 168 149 -131.08 gain 149 169 -123.11 gain 169 149 -130.54 gain 149 170 -128.71 gain 170 149 -127.67 gain 149 171 -121.12 gain 171 149 -125.10 gain 149 172 -110.21 gain 172 149 -108.89 gain 149 173 -116.89 gain 173 149 -115.00 gain 149 174 -114.63 gain 174 149 -117.04 gain 149 175 -111.38 gain 175 149 -117.35 gain 149 176 -114.48 gain 176 149 -112.46 gain 149 177 -100.92 gain 177 149 -106.71 gain 149 178 -96.43 gain 178 149 -98.05 gain 149 179 -100.36 gain 179 149 -100.36 gain 149 180 -125.76 gain 180 149 -127.24 gain 149 181 -123.31 gain 181 149 -124.86 gain 149 182 -124.21 gain 182 149 -128.14 gain 149 183 -115.53 gain 183 149 -112.85 gain 149 184 -119.27 gain 184 149 -121.37 gain 149 185 -116.77 gain 185 149 -116.36 gain 149 186 -116.45 gain 186 149 -116.32 gain 149 187 -122.31 gain 187 149 -124.72 gain 149 188 -117.28 gain 188 149 -122.95 gain 149 189 -118.10 gain 189 149 -121.28 gain 149 190 -114.93 gain 190 149 -115.13 gain 149 191 -112.84 gain 191 149 -114.12 gain 149 192 -105.64 gain 192 149 -109.79 gain 149 193 -106.61 gain 193 149 -112.01 gain 149 194 -100.78 gain 194 149 -99.99 gain 149 195 -122.39 gain 195 149 -122.24 gain 149 196 -130.94 gain 196 149 -134.83 gain 149 197 -121.36 gain 197 149 -121.31 gain 149 198 -121.24 gain 198 149 -120.72 gain 149 199 -124.75 gain 199 149 -128.14 gain 149 200 -123.25 gain 200 149 -123.58 gain 149 201 -115.29 gain 201 149 -116.43 gain 149 202 -125.51 gain 202 149 -130.64 gain 149 203 -123.29 gain 203 149 -128.04 gain 149 204 -112.77 gain 204 149 -114.81 gain 149 205 -112.71 gain 205 149 -113.82 gain 149 206 -117.04 gain 206 149 -122.67 gain 149 207 -112.68 gain 207 149 -110.67 gain 149 208 -114.58 gain 208 149 -118.35 gain 149 209 -110.44 gain 209 149 -115.20 gain 149 210 -132.48 gain 210 149 -134.18 gain 149 211 -126.15 gain 211 149 -129.87 gain 149 212 -119.33 gain 212 149 -121.59 gain 149 213 -125.40 gain 213 149 -126.85 gain 149 214 -123.72 gain 214 149 -125.07 gain 149 215 -127.06 gain 215 149 -124.82 gain 149 216 -116.87 gain 216 149 -119.30 gain 149 217 -124.92 gain 217 149 -127.86 gain 149 218 -113.84 gain 218 149 -118.97 gain 149 219 -118.86 gain 219 149 -115.35 gain 149 220 -118.48 gain 220 149 -125.46 gain 149 221 -109.39 gain 221 149 -112.01 gain 149 222 -118.81 gain 222 149 -121.75 gain 149 223 -120.68 gain 223 149 -122.24 gain 149 224 -114.64 gain 224 149 -118.89 gain 150 151 -98.68 gain 151 150 -98.88 gain 150 152 -104.54 gain 152 150 -101.71 gain 150 153 -106.88 gain 153 150 -101.63 gain 150 154 -119.10 gain 154 150 -122.40 gain 150 155 -114.73 gain 155 150 -117.93 gain 150 156 -122.17 gain 156 150 -119.76 gain 150 157 -114.74 gain 157 150 -115.27 gain 150 158 -121.89 gain 158 150 -125.01 gain 150 159 -122.59 gain 159 150 -122.33 gain 150 160 -122.62 gain 160 150 -119.47 gain 150 161 -122.34 gain 161 150 -122.68 gain 150 162 -131.17 gain 162 150 -130.38 gain 150 163 -128.68 gain 163 150 -130.03 gain 150 164 -134.81 gain 164 150 -137.20 gain 150 165 -93.41 gain 165 150 -91.85 gain 150 166 -110.59 gain 166 150 -110.60 gain 150 167 -103.80 gain 167 150 -105.90 gain 150 168 -111.65 gain 168 150 -112.20 gain 150 169 -108.66 gain 169 150 -113.41 gain 150 170 -111.64 gain 170 150 -107.92 gain 150 171 -116.59 gain 171 150 -117.89 gain 150 172 -117.53 gain 172 150 -113.53 gain 150 173 -124.80 gain 173 150 -120.23 gain 150 174 -129.42 gain 174 150 -129.14 gain 150 175 -127.01 gain 175 150 -130.29 gain 150 176 -122.85 gain 176 150 -118.14 gain 150 177 -132.08 gain 177 150 -135.18 gain 150 178 -124.14 gain 178 150 -123.07 gain 150 179 -133.78 gain 179 150 -131.10 gain 150 180 -105.63 gain 180 150 -104.41 gain 150 181 -103.44 gain 181 150 -102.30 gain 150 182 -114.58 gain 182 150 -115.82 gain 150 183 -107.35 gain 183 150 -101.98 gain 150 184 -107.00 gain 184 150 -106.41 gain 150 185 -114.46 gain 185 150 -111.36 gain 150 186 -118.67 gain 186 150 -115.85 gain 150 187 -123.09 gain 187 150 -122.82 gain 150 188 -119.78 gain 188 150 -122.76 gain 150 189 -118.16 gain 189 150 -118.65 gain 150 190 -120.92 gain 190 150 -118.43 gain 150 191 -123.42 gain 191 150 -122.02 gain 150 192 -126.68 gain 192 150 -128.15 gain 150 193 -125.58 gain 193 150 -128.30 gain 150 194 -130.16 gain 194 150 -126.68 gain 150 195 -108.81 gain 195 150 -105.97 gain 150 196 -110.53 gain 196 150 -111.74 gain 150 197 -106.67 gain 197 150 -103.94 gain 150 198 -113.84 gain 198 150 -110.62 gain 150 199 -109.02 gain 199 150 -109.72 gain 150 200 -118.92 gain 200 150 -116.57 gain 150 201 -121.60 gain 201 150 -120.05 gain 150 202 -121.39 gain 202 150 -123.83 gain 150 203 -118.29 gain 203 150 -120.36 gain 150 204 -118.60 gain 204 150 -117.95 gain 150 205 -122.43 gain 205 150 -120.85 gain 150 206 -133.51 gain 206 150 -136.46 gain 150 207 -125.90 gain 207 150 -121.20 gain 150 208 -126.65 gain 208 150 -127.73 gain 150 209 -127.64 gain 209 150 -129.72 gain 150 210 -110.22 gain 210 150 -109.23 gain 150 211 -112.69 gain 211 150 -113.72 gain 150 212 -104.93 gain 212 150 -104.51 gain 150 213 -120.14 gain 213 150 -118.91 gain 150 214 -115.34 gain 214 150 -114.00 gain 150 215 -116.78 gain 215 150 -111.85 gain 150 216 -117.81 gain 216 150 -117.54 gain 150 217 -120.08 gain 217 150 -120.33 gain 150 218 -123.95 gain 218 150 -126.39 gain 150 219 -123.27 gain 219 150 -117.08 gain 150 220 -122.00 gain 220 150 -126.30 gain 150 221 -124.00 gain 221 150 -123.93 gain 150 222 -127.90 gain 222 150 -128.16 gain 150 223 -132.38 gain 223 150 -131.25 gain 150 224 -138.23 gain 224 150 -139.80 gain 151 152 -94.32 gain 152 151 -91.29 gain 151 153 -98.17 gain 153 151 -92.72 gain 151 154 -109.38 gain 154 151 -112.48 gain 151 155 -108.34 gain 155 151 -111.34 gain 151 156 -121.27 gain 156 151 -118.65 gain 151 157 -123.33 gain 157 151 -123.67 gain 151 158 -121.78 gain 158 151 -124.71 gain 151 159 -113.83 gain 159 151 -113.37 gain 151 160 -127.10 gain 160 151 -123.76 gain 151 161 -130.01 gain 161 151 -130.16 gain 151 162 -132.12 gain 162 151 -131.13 gain 151 163 -131.00 gain 163 151 -132.16 gain 151 164 -118.66 gain 164 151 -120.86 gain 151 165 -104.03 gain 165 151 -102.27 gain 151 166 -98.01 gain 166 151 -97.82 gain 151 167 -97.46 gain 167 151 -99.36 gain 151 168 -105.36 gain 168 151 -105.72 gain 151 169 -108.65 gain 169 151 -113.20 gain 151 170 -110.97 gain 170 151 -107.05 gain 151 171 -120.62 gain 171 151 -121.72 gain 151 172 -112.87 gain 172 151 -108.66 gain 151 173 -118.78 gain 173 151 -114.01 gain 151 174 -123.95 gain 174 151 -123.48 gain 151 175 -118.75 gain 175 151 -121.84 gain 151 176 -123.68 gain 176 151 -118.77 gain 151 177 -126.31 gain 177 151 -129.22 gain 151 178 -134.76 gain 178 151 -133.49 gain 151 179 -131.63 gain 179 151 -128.76 gain 151 180 -104.55 gain 180 151 -103.14 gain 151 181 -96.42 gain 181 151 -95.08 gain 151 182 -105.20 gain 182 151 -106.25 gain 151 183 -112.31 gain 183 151 -106.74 gain 151 184 -117.31 gain 184 151 -116.53 gain 151 185 -118.03 gain 185 151 -114.73 gain 151 186 -118.18 gain 186 151 -115.17 gain 151 187 -111.72 gain 187 151 -111.24 gain 151 188 -120.63 gain 188 151 -123.42 gain 151 189 -118.81 gain 189 151 -119.12 gain 151 190 -123.41 gain 190 151 -120.72 gain 151 191 -127.39 gain 191 151 -125.79 gain 151 192 -131.74 gain 192 151 -133.01 gain 151 193 -115.61 gain 193 151 -118.13 gain 151 194 -126.67 gain 194 151 -123.00 gain 151 195 -112.39 gain 195 151 -109.35 gain 151 196 -101.44 gain 196 151 -102.45 gain 151 197 -114.40 gain 197 151 -111.47 gain 151 198 -108.83 gain 198 151 -105.42 gain 151 199 -108.93 gain 199 151 -109.43 gain 151 200 -113.88 gain 200 151 -111.33 gain 151 201 -107.28 gain 201 151 -105.52 gain 151 202 -121.83 gain 202 151 -124.08 gain 151 203 -121.13 gain 203 151 -123.00 gain 151 204 -120.80 gain 204 151 -119.96 gain 151 205 -121.84 gain 205 151 -120.06 gain 151 206 -128.03 gain 206 151 -130.78 gain 151 207 -126.00 gain 207 151 -121.11 gain 151 208 -126.83 gain 208 151 -127.72 gain 151 209 -127.29 gain 209 151 -129.17 gain 151 210 -114.60 gain 210 151 -113.41 gain 151 211 -111.65 gain 211 151 -112.49 gain 151 212 -104.47 gain 212 151 -103.85 gain 151 213 -114.13 gain 213 151 -112.71 gain 151 214 -112.28 gain 214 151 -110.75 gain 151 215 -109.04 gain 215 151 -103.91 gain 151 216 -118.21 gain 216 151 -117.74 gain 151 217 -115.46 gain 217 151 -115.51 gain 151 218 -111.77 gain 218 151 -114.02 gain 151 219 -119.25 gain 219 151 -112.86 gain 151 220 -120.31 gain 220 151 -124.41 gain 151 221 -128.03 gain 221 151 -127.77 gain 151 222 -123.10 gain 222 151 -123.16 gain 151 223 -127.72 gain 223 151 -126.40 gain 151 224 -124.19 gain 224 151 -125.55 gain 152 153 -93.16 gain 153 152 -90.74 gain 152 154 -106.63 gain 154 152 -112.75 gain 152 155 -107.76 gain 155 152 -113.78 gain 152 156 -109.82 gain 156 152 -110.23 gain 152 157 -111.81 gain 157 152 -115.16 gain 152 158 -119.32 gain 158 152 -125.27 gain 152 159 -117.08 gain 159 152 -119.65 gain 152 160 -114.60 gain 160 152 -114.28 gain 152 161 -118.48 gain 161 152 -121.65 gain 152 162 -116.87 gain 162 152 -118.90 gain 152 163 -119.91 gain 163 152 -124.09 gain 152 164 -122.77 gain 164 152 -127.99 gain 152 165 -105.74 gain 165 152 -107.01 gain 152 166 -88.04 gain 166 152 -90.88 gain 152 167 -88.06 gain 167 152 -92.99 gain 152 168 -102.65 gain 168 152 -106.03 gain 152 169 -106.80 gain 169 152 -114.38 gain 152 170 -107.50 gain 170 152 -106.60 gain 152 171 -109.61 gain 171 152 -113.74 gain 152 172 -105.64 gain 172 152 -104.46 gain 152 173 -117.09 gain 173 152 -115.34 gain 152 174 -115.84 gain 174 152 -118.39 gain 152 175 -116.57 gain 175 152 -122.68 gain 152 176 -122.48 gain 176 152 -120.60 gain 152 177 -123.02 gain 177 152 -128.95 gain 152 178 -118.37 gain 178 152 -120.13 gain 152 179 -119.70 gain 179 152 -119.84 gain 152 180 -101.49 gain 180 152 -103.10 gain 152 181 -98.31 gain 181 152 -100.00 gain 152 182 -101.40 gain 182 152 -105.47 gain 152 183 -100.83 gain 183 152 -98.29 gain 152 184 -103.12 gain 184 152 -105.36 gain 152 185 -108.89 gain 185 152 -108.61 gain 152 186 -110.46 gain 186 152 -110.47 gain 152 187 -113.30 gain 187 152 -115.85 gain 152 188 -110.96 gain 188 152 -116.77 gain 152 189 -121.43 gain 189 152 -124.75 gain 152 190 -118.94 gain 190 152 -119.28 gain 152 191 -119.83 gain 191 152 -121.26 gain 152 192 -114.66 gain 192 152 -118.95 gain 152 193 -125.44 gain 193 152 -130.98 gain 152 194 -123.59 gain 194 152 -122.95 gain 152 195 -106.08 gain 195 152 -106.07 gain 152 196 -108.55 gain 196 152 -112.58 gain 152 197 -108.27 gain 197 152 -108.36 gain 152 198 -100.82 gain 198 152 -100.43 gain 152 199 -102.25 gain 199 152 -105.78 gain 152 200 -112.50 gain 200 152 -112.97 gain 152 201 -111.72 gain 201 152 -112.99 gain 152 202 -117.34 gain 202 152 -122.61 gain 152 203 -115.95 gain 203 152 -120.84 gain 152 204 -119.70 gain 204 152 -121.88 gain 152 205 -115.22 gain 205 152 -116.47 gain 152 206 -119.39 gain 206 152 -125.16 gain 152 207 -124.75 gain 207 152 -122.89 gain 152 208 -124.32 gain 208 152 -128.23 gain 152 209 -118.16 gain 209 152 -123.06 gain 152 210 -110.89 gain 210 152 -112.73 gain 152 211 -105.41 gain 211 152 -109.28 gain 152 212 -108.63 gain 212 152 -111.04 gain 152 213 -112.87 gain 213 152 -114.47 gain 152 214 -106.66 gain 214 152 -108.14 gain 152 215 -109.71 gain 215 152 -107.61 gain 152 216 -107.43 gain 216 152 -109.99 gain 152 217 -119.51 gain 217 152 -122.59 gain 152 218 -112.38 gain 218 152 -117.65 gain 152 219 -120.22 gain 219 152 -116.85 gain 152 220 -116.38 gain 220 152 -123.50 gain 152 221 -118.48 gain 221 152 -121.24 gain 152 222 -118.33 gain 222 152 -121.42 gain 152 223 -122.87 gain 223 152 -124.57 gain 152 224 -115.71 gain 224 152 -120.10 gain 153 154 -92.56 gain 154 153 -101.11 gain 153 155 -97.66 gain 155 153 -106.10 gain 153 156 -104.99 gain 156 153 -107.83 gain 153 157 -96.19 gain 157 153 -101.97 gain 153 158 -116.65 gain 158 153 -125.02 gain 153 159 -112.22 gain 159 153 -117.21 gain 153 160 -114.04 gain 160 153 -116.14 gain 153 161 -113.13 gain 161 153 -118.72 gain 153 162 -110.51 gain 162 153 -114.96 gain 153 163 -112.50 gain 163 153 -119.10 gain 153 164 -119.14 gain 164 153 -126.79 gain 153 165 -99.22 gain 165 153 -102.90 gain 153 166 -103.62 gain 166 153 -108.88 gain 153 167 -91.42 gain 167 153 -98.77 gain 153 168 -91.71 gain 168 153 -97.51 gain 153 169 -95.72 gain 169 153 -105.71 gain 153 170 -103.85 gain 170 153 -105.37 gain 153 171 -107.02 gain 171 153 -113.56 gain 153 172 -104.11 gain 172 153 -105.35 gain 153 173 -110.21 gain 173 153 -110.89 gain 153 174 -113.63 gain 174 153 -118.60 gain 153 175 -115.02 gain 175 153 -123.55 gain 153 176 -115.95 gain 176 153 -116.49 gain 153 177 -127.52 gain 177 153 -135.87 gain 153 178 -109.77 gain 178 153 -113.94 gain 153 179 -116.91 gain 179 153 -119.48 gain 153 180 -100.93 gain 180 153 -104.96 gain 153 181 -101.61 gain 181 153 -105.71 gain 153 182 -95.31 gain 182 153 -101.80 gain 153 183 -92.97 gain 183 153 -92.85 gain 153 184 -93.58 gain 184 153 -98.24 gain 153 185 -103.93 gain 185 153 -106.08 gain 153 186 -106.84 gain 186 153 -109.27 gain 153 187 -110.82 gain 187 153 -115.80 gain 153 188 -110.04 gain 188 153 -118.28 gain 153 189 -104.56 gain 189 153 -110.31 gain 153 190 -115.57 gain 190 153 -118.33 gain 153 191 -120.67 gain 191 153 -124.52 gain 153 192 -122.31 gain 192 153 -129.02 gain 153 193 -123.64 gain 193 153 -131.61 gain 153 194 -125.07 gain 194 153 -126.85 gain 153 195 -107.83 gain 195 153 -110.24 gain 153 196 -107.49 gain 196 153 -113.95 gain 153 197 -107.88 gain 197 153 -110.39 gain 153 198 -100.12 gain 198 153 -102.16 gain 153 199 -104.38 gain 199 153 -110.34 gain 153 200 -103.75 gain 200 153 -106.64 gain 153 201 -106.83 gain 201 153 -110.53 gain 153 202 -104.84 gain 202 153 -112.54 gain 153 203 -115.59 gain 203 153 -122.90 gain 153 204 -111.84 gain 204 153 -116.44 gain 153 205 -112.66 gain 205 153 -116.33 gain 153 206 -121.54 gain 206 153 -129.74 gain 153 207 -125.19 gain 207 153 -125.75 gain 153 208 -123.06 gain 208 153 -129.40 gain 153 209 -127.08 gain 209 153 -134.40 gain 153 210 -110.68 gain 210 153 -114.94 gain 153 211 -106.20 gain 211 153 -112.48 gain 153 212 -105.53 gain 212 153 -110.35 gain 153 213 -105.95 gain 213 153 -109.97 gain 153 214 -108.18 gain 214 153 -112.09 gain 153 215 -109.24 gain 215 153 -109.56 gain 153 216 -110.59 gain 216 153 -115.57 gain 153 217 -107.11 gain 217 153 -112.61 gain 153 218 -108.39 gain 218 153 -116.08 gain 153 219 -113.03 gain 219 153 -112.09 gain 153 220 -121.27 gain 220 153 -130.81 gain 153 221 -116.92 gain 221 153 -122.11 gain 153 222 -114.68 gain 222 153 -120.19 gain 153 223 -120.70 gain 223 153 -124.82 gain 153 224 -124.36 gain 224 153 -131.17 gain 154 155 -93.78 gain 155 154 -93.67 gain 154 156 -109.44 gain 156 154 -103.73 gain 154 157 -117.32 gain 157 154 -114.55 gain 154 158 -118.94 gain 158 154 -118.76 gain 154 159 -119.56 gain 159 154 -116.00 gain 154 160 -121.61 gain 160 154 -115.16 gain 154 161 -132.65 gain 161 154 -129.70 gain 154 162 -122.91 gain 162 154 -118.82 gain 154 163 -131.24 gain 163 154 -129.29 gain 154 164 -132.08 gain 164 154 -131.18 gain 154 165 -124.63 gain 165 154 -119.77 gain 154 166 -117.67 gain 166 154 -114.38 gain 154 167 -107.41 gain 167 154 -106.21 gain 154 168 -100.50 gain 168 154 -97.75 gain 154 169 -100.89 gain 169 154 -102.34 gain 154 170 -105.10 gain 170 154 -98.07 gain 154 171 -111.70 gain 171 154 -109.69 gain 154 172 -106.43 gain 172 154 -99.12 gain 154 173 -119.26 gain 173 154 -111.39 gain 154 174 -119.77 gain 174 154 -116.20 gain 154 175 -125.61 gain 175 154 -125.59 gain 154 176 -129.87 gain 176 154 -121.86 gain 154 177 -125.61 gain 177 154 -125.41 gain 154 178 -123.66 gain 178 154 -119.28 gain 154 179 -127.17 gain 179 154 -121.19 gain 154 180 -113.89 gain 180 154 -109.38 gain 154 181 -115.30 gain 181 154 -110.85 gain 154 182 -117.07 gain 182 154 -115.02 gain 154 183 -107.30 gain 183 154 -98.64 gain 154 184 -100.98 gain 184 154 -97.09 gain 154 185 -107.60 gain 185 154 -101.20 gain 154 186 -105.66 gain 186 154 -99.54 gain 154 187 -123.11 gain 187 154 -119.53 gain 154 188 -116.51 gain 188 154 -116.19 gain 154 189 -115.25 gain 189 154 -112.45 gain 154 190 -118.66 gain 190 154 -112.88 gain 154 191 -125.26 gain 191 154 -120.56 gain 154 192 -130.50 gain 192 154 -128.67 gain 154 193 -124.55 gain 193 154 -123.97 gain 154 194 -129.67 gain 194 154 -122.90 gain 154 195 -115.90 gain 195 154 -109.77 gain 154 196 -116.85 gain 196 154 -114.76 gain 154 197 -114.57 gain 197 154 -108.54 gain 154 198 -114.53 gain 198 154 -108.02 gain 154 199 -115.64 gain 199 154 -113.05 gain 154 200 -114.43 gain 200 154 -108.77 gain 154 201 -112.90 gain 201 154 -108.04 gain 154 202 -112.24 gain 202 154 -111.39 gain 154 203 -115.13 gain 203 154 -113.90 gain 154 204 -120.18 gain 204 154 -116.23 gain 154 205 -128.84 gain 205 154 -123.97 gain 154 206 -121.06 gain 206 154 -120.71 gain 154 207 -120.12 gain 207 154 -112.13 gain 154 208 -123.15 gain 208 154 -120.94 gain 154 209 -129.44 gain 209 154 -128.21 gain 154 210 -121.15 gain 210 154 -116.87 gain 154 211 -113.80 gain 211 154 -111.53 gain 154 212 -119.27 gain 212 154 -115.55 gain 154 213 -115.77 gain 213 154 -111.24 gain 154 214 -119.66 gain 214 154 -115.02 gain 154 215 -118.17 gain 215 154 -109.95 gain 154 216 -121.98 gain 216 154 -118.42 gain 154 217 -118.78 gain 217 154 -115.73 gain 154 218 -118.26 gain 218 154 -117.40 gain 154 219 -114.88 gain 219 154 -105.38 gain 154 220 -128.25 gain 220 154 -129.25 gain 154 221 -128.23 gain 221 154 -124.86 gain 154 222 -130.72 gain 222 154 -127.68 gain 154 223 -124.19 gain 223 154 -119.77 gain 154 224 -126.84 gain 224 154 -125.10 gain 155 156 -90.61 gain 156 155 -85.00 gain 155 157 -107.68 gain 157 155 -105.01 gain 155 158 -106.37 gain 158 155 -106.29 gain 155 159 -115.81 gain 159 155 -112.36 gain 155 160 -119.84 gain 160 155 -113.50 gain 155 161 -122.53 gain 161 155 -119.67 gain 155 162 -123.20 gain 162 155 -119.21 gain 155 163 -124.06 gain 163 155 -122.22 gain 155 164 -130.33 gain 164 155 -129.53 gain 155 165 -120.55 gain 165 155 -115.79 gain 155 166 -114.36 gain 166 155 -111.17 gain 155 167 -103.26 gain 167 155 -102.16 gain 155 168 -113.27 gain 168 155 -110.62 gain 155 169 -101.79 gain 169 155 -103.34 gain 155 170 -97.78 gain 170 155 -90.85 gain 155 171 -99.35 gain 171 155 -97.45 gain 155 172 -106.90 gain 172 155 -99.70 gain 155 173 -116.45 gain 173 155 -108.68 gain 155 174 -113.60 gain 174 155 -110.13 gain 155 175 -121.22 gain 175 155 -121.30 gain 155 176 -117.14 gain 176 155 -109.24 gain 155 177 -122.15 gain 177 155 -122.06 gain 155 178 -119.29 gain 178 155 -115.02 gain 155 179 -126.58 gain 179 155 -120.71 gain 155 180 -117.63 gain 180 155 -113.22 gain 155 181 -108.79 gain 181 155 -104.45 gain 155 182 -119.55 gain 182 155 -117.60 gain 155 183 -112.84 gain 183 155 -104.28 gain 155 184 -112.35 gain 184 155 -108.57 gain 155 185 -109.32 gain 185 155 -103.03 gain 155 186 -111.50 gain 186 155 -105.49 gain 155 187 -102.99 gain 187 155 -99.52 gain 155 188 -115.38 gain 188 155 -115.17 gain 155 189 -120.33 gain 189 155 -117.64 gain 155 190 -117.11 gain 190 155 -111.42 gain 155 191 -121.98 gain 191 155 -117.38 gain 155 192 -125.81 gain 192 155 -124.08 gain 155 193 -120.87 gain 193 155 -120.39 gain 155 194 -125.68 gain 194 155 -119.01 gain 155 195 -114.34 gain 195 155 -108.31 gain 155 196 -113.22 gain 196 155 -111.22 gain 155 197 -111.48 gain 197 155 -105.55 gain 155 198 -117.45 gain 198 155 -111.04 gain 155 199 -115.83 gain 199 155 -113.34 gain 155 200 -109.48 gain 200 155 -103.93 gain 155 201 -112.43 gain 201 155 -107.68 gain 155 202 -112.31 gain 202 155 -111.56 gain 155 203 -119.47 gain 203 155 -118.34 gain 155 204 -114.73 gain 204 155 -110.88 gain 155 205 -118.63 gain 205 155 -113.86 gain 155 206 -122.38 gain 206 155 -122.13 gain 155 207 -119.76 gain 207 155 -111.87 gain 155 208 -127.58 gain 208 155 -125.47 gain 155 209 -124.52 gain 209 155 -123.40 gain 155 210 -127.73 gain 210 155 -123.54 gain 155 211 -121.34 gain 211 155 -119.18 gain 155 212 -121.59 gain 212 155 -117.98 gain 155 213 -119.16 gain 213 155 -114.73 gain 155 214 -117.22 gain 214 155 -112.68 gain 155 215 -115.95 gain 215 155 -107.83 gain 155 216 -113.60 gain 216 155 -110.14 gain 155 217 -117.94 gain 217 155 -115.00 gain 155 218 -117.30 gain 218 155 -116.55 gain 155 219 -119.34 gain 219 155 -109.95 gain 155 220 -125.34 gain 220 155 -126.43 gain 155 221 -121.50 gain 221 155 -118.24 gain 155 222 -123.59 gain 222 155 -120.66 gain 155 223 -132.60 gain 223 155 -128.28 gain 155 224 -128.16 gain 224 155 -126.52 gain 156 157 -98.25 gain 157 156 -101.20 gain 156 158 -98.57 gain 158 156 -104.11 gain 156 159 -106.42 gain 159 156 -108.57 gain 156 160 -113.86 gain 160 156 -113.13 gain 156 161 -117.29 gain 161 156 -120.05 gain 156 162 -110.79 gain 162 156 -112.41 gain 156 163 -122.46 gain 163 156 -126.23 gain 156 164 -122.79 gain 164 156 -127.60 gain 156 165 -116.90 gain 165 156 -117.76 gain 156 166 -112.92 gain 166 156 -115.35 gain 156 167 -111.66 gain 167 156 -116.17 gain 156 168 -109.69 gain 168 156 -112.66 gain 156 169 -104.31 gain 169 156 -111.47 gain 156 170 -88.02 gain 170 156 -86.71 gain 156 171 -93.09 gain 171 156 -96.80 gain 156 172 -97.42 gain 172 156 -95.83 gain 156 173 -109.13 gain 173 156 -106.98 gain 156 174 -106.27 gain 174 156 -108.41 gain 156 175 -108.33 gain 175 156 -114.03 gain 156 176 -115.01 gain 176 156 -112.72 gain 156 177 -109.92 gain 177 156 -115.44 gain 156 178 -109.14 gain 178 156 -110.48 gain 156 179 -116.29 gain 179 156 -116.03 gain 156 180 -116.53 gain 180 156 -117.73 gain 156 181 -114.40 gain 181 156 -115.67 gain 156 182 -118.48 gain 182 156 -122.14 gain 156 183 -112.90 gain 183 156 -109.95 gain 156 184 -102.41 gain 184 156 -104.24 gain 156 185 -96.13 gain 185 156 -95.45 gain 156 186 -99.53 gain 186 156 -99.13 gain 156 187 -104.08 gain 187 156 -106.22 gain 156 188 -106.63 gain 188 156 -112.03 gain 156 189 -109.93 gain 189 156 -112.84 gain 156 190 -112.65 gain 190 156 -112.58 gain 156 191 -119.55 gain 191 156 -120.56 gain 156 192 -119.45 gain 192 156 -123.34 gain 156 193 -118.41 gain 193 156 -123.55 gain 156 194 -120.96 gain 194 156 -119.91 gain 156 195 -115.30 gain 195 156 -114.88 gain 156 196 -115.23 gain 196 156 -118.85 gain 156 197 -111.86 gain 197 156 -111.54 gain 156 198 -107.69 gain 198 156 -106.89 gain 156 199 -110.57 gain 199 156 -113.69 gain 156 200 -107.11 gain 200 156 -107.16 gain 156 201 -104.42 gain 201 156 -105.29 gain 156 202 -102.91 gain 202 156 -107.77 gain 156 203 -112.92 gain 203 156 -117.40 gain 156 204 -115.92 gain 204 156 -117.69 gain 156 205 -106.81 gain 205 156 -107.65 gain 156 206 -113.45 gain 206 156 -118.81 gain 156 207 -118.40 gain 207 156 -116.12 gain 156 208 -118.60 gain 208 156 -122.10 gain 156 209 -118.52 gain 209 156 -123.02 gain 156 210 -118.16 gain 210 156 -119.59 gain 156 211 -116.03 gain 211 156 -119.48 gain 156 212 -113.14 gain 212 156 -115.14 gain 156 213 -115.67 gain 213 156 -116.86 gain 156 214 -115.20 gain 214 156 -116.27 gain 156 215 -112.89 gain 215 156 -110.38 gain 156 216 -109.62 gain 216 156 -111.77 gain 156 217 -112.74 gain 217 156 -115.41 gain 156 218 -107.72 gain 218 156 -112.58 gain 156 219 -122.67 gain 219 156 -118.89 gain 156 220 -115.49 gain 220 156 -122.20 gain 156 221 -117.64 gain 221 156 -119.99 gain 156 222 -125.03 gain 222 156 -127.71 gain 156 223 -115.41 gain 223 156 -116.71 gain 156 224 -114.99 gain 224 156 -118.97 gain 157 158 -94.26 gain 158 157 -96.86 gain 157 159 -106.42 gain 159 157 -105.63 gain 157 160 -105.16 gain 160 157 -101.48 gain 157 161 -108.09 gain 161 157 -107.90 gain 157 162 -109.89 gain 162 157 -108.57 gain 157 163 -119.60 gain 163 157 -120.43 gain 157 164 -122.04 gain 164 157 -123.91 gain 157 165 -126.58 gain 165 157 -124.49 gain 157 166 -122.81 gain 166 157 -122.29 gain 157 167 -113.74 gain 167 157 -115.31 gain 157 168 -113.06 gain 168 157 -113.08 gain 157 169 -113.82 gain 169 157 -118.04 gain 157 170 -103.60 gain 170 157 -99.34 gain 157 171 -101.92 gain 171 157 -102.68 gain 157 172 -96.45 gain 172 157 -91.92 gain 157 173 -98.99 gain 173 157 -93.89 gain 157 174 -109.70 gain 174 157 -108.89 gain 157 175 -108.70 gain 175 157 -111.45 gain 157 176 -117.19 gain 176 157 -111.95 gain 157 177 -110.28 gain 177 157 -112.86 gain 157 178 -115.82 gain 178 157 -114.22 gain 157 179 -114.32 gain 179 157 -111.11 gain 157 180 -122.37 gain 180 157 -120.63 gain 157 181 -120.38 gain 181 157 -118.71 gain 157 182 -114.25 gain 182 157 -114.97 gain 157 183 -110.69 gain 183 157 -104.80 gain 157 184 -114.84 gain 184 157 -113.73 gain 157 185 -115.16 gain 185 157 -111.53 gain 157 186 -114.47 gain 186 157 -111.12 gain 157 187 -96.44 gain 187 157 -95.64 gain 157 188 -105.32 gain 188 157 -107.78 gain 157 189 -104.44 gain 189 157 -104.41 gain 157 190 -111.88 gain 190 157 -108.86 gain 157 191 -113.07 gain 191 157 -111.15 gain 157 192 -112.17 gain 192 157 -113.11 gain 157 193 -124.93 gain 193 157 -127.12 gain 157 194 -120.44 gain 194 157 -116.44 gain 157 195 -117.31 gain 195 157 -113.95 gain 157 196 -116.29 gain 196 157 -116.97 gain 157 197 -120.41 gain 197 157 -117.15 gain 157 198 -109.90 gain 198 157 -106.16 gain 157 199 -117.85 gain 199 157 -118.03 gain 157 200 -111.51 gain 200 157 -108.62 gain 157 201 -114.33 gain 201 157 -112.25 gain 157 202 -106.96 gain 202 157 -108.88 gain 157 203 -110.29 gain 203 157 -111.83 gain 157 204 -110.35 gain 204 157 -109.18 gain 157 205 -121.14 gain 205 157 -119.03 gain 157 206 -115.54 gain 206 157 -117.96 gain 157 207 -119.25 gain 207 157 -114.03 gain 157 208 -121.62 gain 208 157 -122.18 gain 157 209 -121.19 gain 209 157 -122.74 gain 157 210 -121.51 gain 210 157 -120.00 gain 157 211 -127.55 gain 211 157 -128.06 gain 157 212 -118.36 gain 212 157 -117.40 gain 157 213 -123.56 gain 213 157 -121.80 gain 157 214 -113.74 gain 214 157 -111.87 gain 157 215 -109.08 gain 215 157 -103.63 gain 157 216 -115.08 gain 216 157 -114.28 gain 157 217 -120.04 gain 217 157 -119.77 gain 157 218 -117.51 gain 218 157 -119.43 gain 157 219 -112.04 gain 219 157 -105.31 gain 157 220 -114.35 gain 220 157 -118.11 gain 157 221 -113.62 gain 221 157 -113.03 gain 157 222 -112.67 gain 222 157 -112.40 gain 157 223 -127.83 gain 223 157 -126.18 gain 157 224 -119.57 gain 224 157 -120.61 gain 158 159 -99.51 gain 159 158 -96.12 gain 158 160 -102.87 gain 160 158 -96.60 gain 158 161 -113.30 gain 161 158 -110.52 gain 158 162 -106.41 gain 162 158 -102.50 gain 158 163 -121.30 gain 163 158 -119.54 gain 158 164 -113.90 gain 164 158 -113.17 gain 158 165 -125.66 gain 165 158 -120.98 gain 158 166 -122.07 gain 166 158 -118.96 gain 158 167 -122.45 gain 167 158 -121.43 gain 158 168 -122.28 gain 168 158 -119.70 gain 158 169 -117.77 gain 169 158 -119.40 gain 158 170 -106.96 gain 170 158 -100.11 gain 158 171 -107.03 gain 171 158 -105.21 gain 158 172 -102.46 gain 172 158 -95.33 gain 158 173 -96.13 gain 173 158 -88.43 gain 158 174 -107.66 gain 174 158 -104.27 gain 158 175 -117.81 gain 175 158 -117.96 gain 158 176 -108.50 gain 176 158 -100.67 gain 158 177 -112.37 gain 177 158 -112.35 gain 158 178 -117.94 gain 178 158 -113.75 gain 158 179 -113.01 gain 179 158 -107.20 gain 158 180 -115.74 gain 180 158 -111.40 gain 158 181 -120.61 gain 181 158 -116.35 gain 158 182 -126.85 gain 182 158 -124.97 gain 158 183 -114.04 gain 183 158 -105.55 gain 158 184 -117.05 gain 184 158 -113.34 gain 158 185 -113.05 gain 185 158 -106.82 gain 158 186 -113.37 gain 186 158 -107.43 gain 158 187 -105.42 gain 187 158 -102.02 gain 158 188 -111.24 gain 188 158 -111.10 gain 158 189 -113.44 gain 189 158 -110.81 gain 158 190 -111.88 gain 190 158 -106.26 gain 158 191 -115.92 gain 191 158 -111.40 gain 158 192 -114.50 gain 192 158 -112.84 gain 158 193 -127.68 gain 193 158 -127.28 gain 158 194 -122.16 gain 194 158 -115.57 gain 158 195 -118.21 gain 195 158 -112.25 gain 158 196 -121.29 gain 196 158 -119.37 gain 158 197 -123.21 gain 197 158 -117.35 gain 158 198 -121.35 gain 198 158 -115.02 gain 158 199 -110.99 gain 199 158 -108.57 gain 158 200 -116.04 gain 200 158 -110.56 gain 158 201 -118.54 gain 201 158 -113.86 gain 158 202 -113.58 gain 202 158 -112.91 gain 158 203 -112.33 gain 203 158 -111.28 gain 158 204 -106.16 gain 204 158 -102.39 gain 158 205 -111.91 gain 205 158 -107.22 gain 158 206 -120.51 gain 206 158 -120.33 gain 158 207 -121.77 gain 207 158 -113.96 gain 158 208 -109.74 gain 208 158 -107.70 gain 158 209 -126.17 gain 209 158 -125.12 gain 158 210 -125.00 gain 210 158 -120.89 gain 158 211 -125.07 gain 211 158 -122.98 gain 158 212 -121.41 gain 212 158 -117.86 gain 158 213 -119.78 gain 213 158 -115.42 gain 158 214 -117.59 gain 214 158 -113.13 gain 158 215 -120.91 gain 215 158 -112.86 gain 158 216 -114.83 gain 216 158 -111.44 gain 158 217 -115.83 gain 217 158 -112.96 gain 158 218 -112.44 gain 218 158 -111.76 gain 158 219 -107.87 gain 219 158 -98.55 gain 158 220 -121.15 gain 220 158 -122.32 gain 158 221 -112.51 gain 221 158 -109.32 gain 158 222 -129.76 gain 222 158 -126.90 gain 158 223 -125.73 gain 223 158 -121.48 gain 158 224 -124.36 gain 224 158 -122.80 gain 159 160 -89.32 gain 160 159 -86.43 gain 159 161 -100.04 gain 161 159 -100.64 gain 159 162 -104.39 gain 162 159 -103.86 gain 159 163 -113.41 gain 163 159 -115.03 gain 159 164 -117.81 gain 164 159 -120.47 gain 159 165 -120.40 gain 165 159 -119.10 gain 159 166 -120.45 gain 166 159 -120.72 gain 159 167 -125.74 gain 167 159 -128.10 gain 159 168 -115.18 gain 168 159 -115.98 gain 159 169 -110.68 gain 169 159 -115.69 gain 159 170 -118.04 gain 170 159 -114.57 gain 159 171 -114.78 gain 171 159 -116.34 gain 159 172 -97.56 gain 172 159 -93.81 gain 159 173 -98.87 gain 173 159 -94.55 gain 159 174 -91.63 gain 174 159 -91.61 gain 159 175 -98.67 gain 175 159 -102.21 gain 159 176 -103.49 gain 176 159 -99.04 gain 159 177 -100.59 gain 177 159 -103.95 gain 159 178 -112.72 gain 178 159 -111.90 gain 159 179 -115.34 gain 179 159 -112.92 gain 159 180 -121.47 gain 180 159 -120.52 gain 159 181 -119.14 gain 181 159 -118.26 gain 159 182 -124.99 gain 182 159 -126.49 gain 159 183 -115.87 gain 183 159 -110.76 gain 159 184 -114.59 gain 184 159 -114.27 gain 159 185 -114.86 gain 185 159 -112.02 gain 159 186 -110.70 gain 186 159 -108.14 gain 159 187 -111.04 gain 187 159 -111.03 gain 159 188 -102.95 gain 188 159 -106.19 gain 159 189 -98.70 gain 189 159 -99.46 gain 159 190 -107.86 gain 190 159 -105.63 gain 159 191 -105.22 gain 191 159 -104.08 gain 159 192 -105.73 gain 192 159 -107.46 gain 159 193 -109.76 gain 193 159 -112.74 gain 159 194 -125.82 gain 194 159 -122.60 gain 159 195 -126.38 gain 195 159 -123.80 gain 159 196 -120.84 gain 196 159 -122.31 gain 159 197 -113.23 gain 197 159 -110.75 gain 159 198 -119.45 gain 198 159 -116.49 gain 159 199 -112.03 gain 199 159 -113.00 gain 159 200 -106.70 gain 200 159 -104.60 gain 159 201 -105.13 gain 201 159 -103.83 gain 159 202 -113.27 gain 202 159 -115.97 gain 159 203 -110.10 gain 203 159 -112.43 gain 159 204 -108.83 gain 204 159 -108.44 gain 159 205 -103.62 gain 205 159 -102.30 gain 159 206 -114.43 gain 206 159 -117.64 gain 159 207 -116.76 gain 207 159 -112.33 gain 159 208 -117.30 gain 208 159 -118.65 gain 159 209 -117.30 gain 209 159 -119.64 gain 159 210 -135.32 gain 210 159 -134.59 gain 159 211 -117.55 gain 211 159 -118.85 gain 159 212 -122.75 gain 212 159 -122.58 gain 159 213 -128.75 gain 213 159 -127.78 gain 159 214 -118.72 gain 214 159 -117.64 gain 159 215 -115.83 gain 215 159 -111.16 gain 159 216 -113.73 gain 216 159 -113.72 gain 159 217 -113.01 gain 217 159 -113.52 gain 159 218 -114.85 gain 218 159 -117.55 gain 159 219 -112.50 gain 219 159 -106.57 gain 159 220 -113.52 gain 220 159 -118.07 gain 159 221 -109.69 gain 221 159 -109.88 gain 159 222 -109.78 gain 222 159 -110.30 gain 159 223 -112.75 gain 223 159 -111.88 gain 159 224 -118.33 gain 224 159 -120.15 gain 160 161 -83.27 gain 161 160 -86.76 gain 160 162 -97.21 gain 162 160 -99.57 gain 160 163 -100.53 gain 163 160 -105.04 gain 160 164 -107.00 gain 164 160 -112.55 gain 160 165 -123.94 gain 165 160 -125.52 gain 160 166 -111.06 gain 166 160 -114.22 gain 160 167 -119.45 gain 167 160 -124.69 gain 160 168 -112.76 gain 168 160 -116.46 gain 160 169 -109.36 gain 169 160 -117.26 gain 160 170 -110.50 gain 170 160 -109.92 gain 160 171 -107.07 gain 171 160 -111.52 gain 160 172 -108.69 gain 172 160 -107.84 gain 160 173 -98.94 gain 173 160 -97.51 gain 160 174 -90.73 gain 174 160 -93.61 gain 160 175 -91.49 gain 175 160 -97.92 gain 160 176 -91.32 gain 176 160 -89.75 gain 160 177 -104.05 gain 177 160 -110.30 gain 160 178 -104.79 gain 178 160 -106.86 gain 160 179 -110.11 gain 179 160 -110.57 gain 160 180 -120.09 gain 180 160 -122.02 gain 160 181 -124.54 gain 181 160 -126.55 gain 160 182 -114.09 gain 182 160 -118.48 gain 160 183 -123.46 gain 183 160 -121.24 gain 160 184 -118.39 gain 184 160 -120.95 gain 160 185 -112.87 gain 185 160 -112.92 gain 160 186 -106.90 gain 186 160 -107.24 gain 160 187 -109.07 gain 187 160 -111.94 gain 160 188 -105.04 gain 188 160 -111.17 gain 160 189 -100.34 gain 189 160 -103.99 gain 160 190 -92.85 gain 190 160 -93.50 gain 160 191 -99.79 gain 191 160 -101.54 gain 160 192 -106.76 gain 192 160 -111.38 gain 160 193 -111.22 gain 193 160 -117.09 gain 160 194 -112.70 gain 194 160 -112.37 gain 160 195 -123.50 gain 195 160 -123.81 gain 160 196 -114.14 gain 196 160 -118.49 gain 160 197 -115.51 gain 197 160 -115.92 gain 160 198 -122.84 gain 198 160 -122.77 gain 160 199 -119.19 gain 199 160 -123.04 gain 160 200 -115.64 gain 200 160 -116.43 gain 160 201 -117.20 gain 201 160 -118.80 gain 160 202 -111.21 gain 202 160 -116.80 gain 160 203 -109.45 gain 203 160 -114.67 gain 160 204 -104.19 gain 204 160 -106.69 gain 160 205 -104.53 gain 205 160 -106.11 gain 160 206 -107.72 gain 206 160 -113.81 gain 160 207 -108.14 gain 207 160 -106.60 gain 160 208 -111.84 gain 208 160 -116.07 gain 160 209 -114.39 gain 209 160 -119.61 gain 160 210 -124.00 gain 210 160 -126.16 gain 160 211 -120.28 gain 211 160 -124.47 gain 160 212 -118.54 gain 212 160 -121.27 gain 160 213 -114.00 gain 213 160 -115.92 gain 160 214 -114.49 gain 214 160 -116.29 gain 160 215 -110.21 gain 215 160 -108.44 gain 160 216 -122.27 gain 216 160 -125.15 gain 160 217 -110.83 gain 217 160 -114.23 gain 160 218 -112.04 gain 218 160 -117.63 gain 160 219 -110.13 gain 219 160 -107.08 gain 160 220 -107.22 gain 220 160 -114.66 gain 160 221 -105.40 gain 221 160 -108.48 gain 160 222 -101.61 gain 222 160 -105.02 gain 160 223 -118.50 gain 223 160 -120.52 gain 160 224 -119.35 gain 224 160 -124.06 gain 161 162 -95.92 gain 162 161 -94.79 gain 161 163 -102.94 gain 163 161 -103.95 gain 161 164 -106.87 gain 164 161 -108.93 gain 161 165 -121.52 gain 165 161 -119.62 gain 161 166 -127.30 gain 166 161 -126.97 gain 161 167 -127.84 gain 167 161 -129.60 gain 161 168 -117.38 gain 168 161 -117.59 gain 161 169 -120.73 gain 169 161 -125.13 gain 161 170 -121.92 gain 170 161 -117.85 gain 161 171 -125.27 gain 171 161 -126.23 gain 161 172 -110.47 gain 172 161 -106.12 gain 161 173 -111.00 gain 173 161 -106.09 gain 161 174 -108.37 gain 174 161 -107.75 gain 161 175 -105.27 gain 175 161 -108.21 gain 161 176 -98.17 gain 176 161 -93.12 gain 161 177 -91.96 gain 177 161 -94.73 gain 161 178 -108.67 gain 178 161 -107.25 gain 161 179 -117.18 gain 179 161 -114.16 gain 161 180 -120.62 gain 180 161 -119.07 gain 161 181 -120.70 gain 181 161 -119.21 gain 161 182 -124.25 gain 182 161 -125.15 gain 161 183 -118.14 gain 183 161 -112.43 gain 161 184 -119.21 gain 184 161 -118.28 gain 161 185 -114.03 gain 185 161 -110.59 gain 161 186 -112.63 gain 186 161 -109.47 gain 161 187 -109.64 gain 187 161 -109.02 gain 161 188 -106.90 gain 188 161 -109.54 gain 161 189 -102.10 gain 189 161 -102.25 gain 161 190 -104.88 gain 190 161 -102.05 gain 161 191 -99.28 gain 191 161 -97.54 gain 161 192 -97.58 gain 192 161 -98.71 gain 161 193 -110.30 gain 193 161 -112.67 gain 161 194 -116.70 gain 194 161 -112.88 gain 161 195 -130.62 gain 195 161 -127.44 gain 161 196 -126.62 gain 196 161 -127.48 gain 161 197 -122.56 gain 197 161 -119.48 gain 161 198 -122.15 gain 198 161 -118.60 gain 161 199 -116.75 gain 199 161 -117.11 gain 161 200 -121.71 gain 200 161 -119.01 gain 161 201 -123.30 gain 201 161 -121.40 gain 161 202 -124.52 gain 202 161 -126.62 gain 161 203 -114.86 gain 203 161 -116.58 gain 161 204 -109.06 gain 204 161 -108.07 gain 161 205 -110.72 gain 205 161 -108.81 gain 161 206 -102.45 gain 206 161 -105.06 gain 161 207 -105.33 gain 207 161 -100.29 gain 161 208 -109.98 gain 208 161 -110.73 gain 161 209 -107.80 gain 209 161 -109.54 gain 161 210 -124.17 gain 210 161 -122.84 gain 161 211 -126.55 gain 211 161 -127.24 gain 161 212 -122.38 gain 212 161 -121.62 gain 161 213 -125.16 gain 213 161 -123.59 gain 161 214 -118.27 gain 214 161 -116.58 gain 161 215 -121.66 gain 215 161 -116.39 gain 161 216 -116.59 gain 216 161 -115.98 gain 161 217 -114.59 gain 217 161 -114.50 gain 161 218 -114.04 gain 218 161 -116.14 gain 161 219 -113.70 gain 219 161 -107.16 gain 161 220 -118.78 gain 220 161 -122.73 gain 161 221 -108.44 gain 221 161 -108.03 gain 161 222 -111.80 gain 222 161 -111.72 gain 161 223 -115.60 gain 223 161 -114.13 gain 161 224 -115.91 gain 224 161 -117.13 gain 162 163 -93.18 gain 163 162 -95.33 gain 162 164 -103.85 gain 164 162 -107.04 gain 162 165 -127.30 gain 165 162 -126.53 gain 162 166 -120.65 gain 166 162 -121.46 gain 162 167 -123.29 gain 167 162 -126.18 gain 162 168 -119.63 gain 168 162 -120.97 gain 162 169 -118.94 gain 169 162 -124.48 gain 162 170 -112.01 gain 170 162 -109.07 gain 162 171 -115.77 gain 171 162 -117.86 gain 162 172 -117.82 gain 172 162 -114.61 gain 162 173 -111.03 gain 173 162 -107.25 gain 162 174 -107.18 gain 174 162 -107.70 gain 162 175 -103.11 gain 175 162 -107.19 gain 162 176 -96.91 gain 176 162 -92.99 gain 162 177 -93.82 gain 177 162 -97.72 gain 162 178 -99.19 gain 178 162 -98.91 gain 162 179 -106.05 gain 179 162 -104.17 gain 162 180 -130.03 gain 180 162 -129.61 gain 162 181 -120.94 gain 181 162 -120.58 gain 162 182 -122.80 gain 182 162 -124.84 gain 162 183 -129.06 gain 183 162 -124.49 gain 162 184 -124.57 gain 184 162 -124.78 gain 162 185 -118.40 gain 185 162 -116.09 gain 162 186 -118.41 gain 186 162 -116.39 gain 162 187 -115.54 gain 187 162 -116.06 gain 162 188 -108.91 gain 188 162 -112.69 gain 162 189 -107.30 gain 189 162 -108.59 gain 162 190 -113.39 gain 190 162 -111.69 gain 162 191 -111.53 gain 191 162 -110.92 gain 162 192 -115.34 gain 192 162 -117.60 gain 162 193 -107.87 gain 193 162 -111.39 gain 162 194 -98.24 gain 194 162 -95.56 gain 162 195 -120.41 gain 195 162 -118.37 gain 162 196 -125.58 gain 196 162 -127.57 gain 162 197 -128.87 gain 197 162 -126.93 gain 162 198 -114.24 gain 198 162 -111.82 gain 162 199 -124.31 gain 199 162 -125.81 gain 162 200 -113.25 gain 200 162 -111.69 gain 162 201 -122.89 gain 201 162 -122.13 gain 162 202 -120.38 gain 202 162 -123.62 gain 162 203 -113.94 gain 203 162 -116.80 gain 162 204 -112.68 gain 204 162 -112.83 gain 162 205 -110.79 gain 205 162 -110.01 gain 162 206 -114.38 gain 206 162 -118.12 gain 162 207 -109.49 gain 207 162 -105.59 gain 162 208 -113.89 gain 208 162 -115.77 gain 162 209 -99.25 gain 209 162 -102.12 gain 162 210 -121.94 gain 210 162 -121.74 gain 162 211 -120.67 gain 211 162 -122.50 gain 162 212 -131.92 gain 212 162 -132.29 gain 162 213 -119.43 gain 213 162 -118.99 gain 162 214 -120.88 gain 214 162 -120.33 gain 162 215 -117.37 gain 215 162 -113.24 gain 162 216 -117.85 gain 216 162 -118.38 gain 162 217 -120.08 gain 217 162 -121.12 gain 162 218 -119.42 gain 218 162 -122.66 gain 162 219 -115.80 gain 219 162 -110.39 gain 162 220 -106.27 gain 220 162 -111.36 gain 162 221 -109.99 gain 221 162 -110.72 gain 162 222 -117.47 gain 222 162 -118.53 gain 162 223 -113.67 gain 223 162 -113.33 gain 162 224 -112.24 gain 224 162 -114.59 gain 163 164 -97.42 gain 164 163 -98.46 gain 163 165 -131.26 gain 165 163 -128.34 gain 163 166 -130.02 gain 166 163 -128.67 gain 163 167 -128.60 gain 167 163 -129.34 gain 163 168 -128.28 gain 168 163 -127.47 gain 163 169 -123.15 gain 169 163 -126.54 gain 163 170 -120.26 gain 170 163 -115.18 gain 163 171 -120.69 gain 171 163 -120.63 gain 163 172 -120.20 gain 172 163 -114.84 gain 163 173 -125.06 gain 173 163 -119.14 gain 163 174 -118.77 gain 174 163 -117.15 gain 163 175 -108.16 gain 175 163 -110.09 gain 163 176 -104.39 gain 176 163 -98.33 gain 163 177 -105.45 gain 177 163 -107.19 gain 163 178 -93.19 gain 178 163 -90.76 gain 163 179 -93.40 gain 179 163 -89.37 gain 163 180 -134.41 gain 180 163 -131.85 gain 163 181 -126.92 gain 181 163 -124.41 gain 163 182 -127.26 gain 182 163 -127.15 gain 163 183 -121.55 gain 183 163 -114.83 gain 163 184 -120.97 gain 184 163 -119.03 gain 163 185 -124.21 gain 185 163 -119.75 gain 163 186 -120.12 gain 186 163 -115.95 gain 163 187 -119.19 gain 187 163 -117.55 gain 163 188 -119.02 gain 188 163 -120.65 gain 163 189 -112.44 gain 189 163 -111.58 gain 163 190 -113.18 gain 190 163 -109.34 gain 163 191 -109.15 gain 191 163 -106.39 gain 163 192 -98.44 gain 192 163 -98.55 gain 163 193 -100.26 gain 193 163 -101.62 gain 163 194 -110.50 gain 194 163 -105.68 gain 163 195 -129.23 gain 195 163 -125.04 gain 163 196 -127.12 gain 196 163 -126.96 gain 163 197 -122.88 gain 197 163 -118.79 gain 163 198 -125.50 gain 198 163 -120.93 gain 163 199 -130.81 gain 199 163 -130.16 gain 163 200 -121.90 gain 200 163 -118.19 gain 163 201 -120.50 gain 201 163 -117.59 gain 163 202 -115.32 gain 202 163 -116.41 gain 163 203 -119.72 gain 203 163 -120.43 gain 163 204 -113.51 gain 204 163 -111.51 gain 163 205 -110.24 gain 205 163 -107.31 gain 163 206 -117.59 gain 206 163 -119.18 gain 163 207 -99.04 gain 207 163 -92.99 gain 163 208 -109.33 gain 208 163 -109.06 gain 163 209 -114.20 gain 209 163 -114.92 gain 163 210 -129.97 gain 210 163 -127.62 gain 163 211 -139.02 gain 211 163 -138.70 gain 163 212 -122.83 gain 212 163 -121.06 gain 163 213 -127.56 gain 213 163 -124.98 gain 163 214 -121.38 gain 214 163 -118.68 gain 163 215 -126.98 gain 215 163 -120.70 gain 163 216 -121.98 gain 216 163 -120.36 gain 163 217 -132.25 gain 217 163 -131.15 gain 163 218 -122.84 gain 218 163 -123.93 gain 163 219 -127.97 gain 219 163 -120.42 gain 163 220 -119.73 gain 220 163 -122.66 gain 163 221 -109.92 gain 221 163 -108.50 gain 163 222 -108.84 gain 222 163 -107.74 gain 163 223 -114.63 gain 223 163 -112.15 gain 163 224 -111.07 gain 224 163 -111.27 gain 164 165 -131.48 gain 165 164 -127.52 gain 164 166 -124.43 gain 166 164 -122.04 gain 164 167 -130.41 gain 167 164 -130.11 gain 164 168 -129.84 gain 168 164 -127.99 gain 164 169 -132.86 gain 169 164 -135.21 gain 164 170 -131.22 gain 170 164 -125.10 gain 164 171 -123.88 gain 171 164 -122.78 gain 164 172 -121.62 gain 172 164 -115.22 gain 164 173 -119.98 gain 173 164 -113.01 gain 164 174 -124.08 gain 174 164 -121.41 gain 164 175 -114.86 gain 175 164 -115.74 gain 164 176 -112.68 gain 176 164 -105.58 gain 164 177 -104.34 gain 177 164 -105.04 gain 164 178 -110.20 gain 178 164 -106.73 gain 164 179 -96.72 gain 179 164 -91.64 gain 164 180 -129.33 gain 180 164 -125.72 gain 164 181 -130.19 gain 181 164 -126.65 gain 164 182 -134.45 gain 182 164 -133.29 gain 164 183 -129.76 gain 183 164 -122.00 gain 164 184 -126.47 gain 184 164 -123.49 gain 164 185 -127.83 gain 185 164 -122.33 gain 164 186 -122.10 gain 186 164 -116.89 gain 164 187 -121.50 gain 187 164 -118.83 gain 164 188 -115.91 gain 188 164 -116.49 gain 164 189 -106.39 gain 189 164 -104.49 gain 164 190 -126.10 gain 190 164 -121.21 gain 164 191 -116.99 gain 191 164 -113.19 gain 164 192 -113.14 gain 192 164 -112.21 gain 164 193 -104.28 gain 193 164 -104.60 gain 164 194 -108.64 gain 194 164 -102.77 gain 164 195 -137.21 gain 195 164 -131.98 gain 164 196 -128.07 gain 196 164 -126.88 gain 164 197 -136.34 gain 197 164 -131.21 gain 164 198 -122.31 gain 198 164 -116.70 gain 164 199 -122.15 gain 199 164 -120.45 gain 164 200 -121.65 gain 200 164 -116.90 gain 164 201 -125.02 gain 201 164 -121.07 gain 164 202 -130.71 gain 202 164 -130.76 gain 164 203 -121.85 gain 203 164 -121.52 gain 164 204 -115.36 gain 204 164 -112.32 gain 164 205 -117.28 gain 205 164 -113.31 gain 164 206 -113.93 gain 206 164 -114.48 gain 164 207 -116.90 gain 207 164 -109.81 gain 164 208 -115.78 gain 208 164 -114.47 gain 164 209 -106.20 gain 209 164 -105.88 gain 164 210 -132.60 gain 210 164 -129.21 gain 164 211 -126.15 gain 211 164 -124.78 gain 164 212 -127.86 gain 212 164 -125.04 gain 164 213 -125.09 gain 213 164 -121.46 gain 164 214 -119.32 gain 214 164 -115.59 gain 164 215 -132.20 gain 215 164 -124.88 gain 164 216 -132.37 gain 216 164 -129.71 gain 164 217 -125.93 gain 217 164 -123.78 gain 164 218 -117.59 gain 218 164 -117.64 gain 164 219 -123.40 gain 219 164 -114.80 gain 164 220 -108.89 gain 220 164 -110.79 gain 164 221 -121.72 gain 221 164 -119.26 gain 164 222 -114.11 gain 222 164 -111.97 gain 164 223 -113.48 gain 223 164 -109.96 gain 164 224 -114.70 gain 224 164 -113.87 gain 165 166 -97.42 gain 166 165 -98.99 gain 165 167 -105.48 gain 167 165 -109.13 gain 165 168 -106.79 gain 168 165 -108.90 gain 165 169 -108.12 gain 169 165 -114.43 gain 165 170 -113.59 gain 170 165 -111.42 gain 165 171 -118.36 gain 171 165 -121.22 gain 165 172 -122.40 gain 172 165 -119.95 gain 165 173 -125.35 gain 173 165 -122.34 gain 165 174 -126.54 gain 174 165 -127.83 gain 165 175 -118.11 gain 175 165 -122.95 gain 165 176 -120.24 gain 176 165 -117.09 gain 165 177 -129.54 gain 177 165 -134.21 gain 165 178 -123.26 gain 178 165 -123.74 gain 165 179 -131.01 gain 179 165 -129.89 gain 165 180 -91.39 gain 180 165 -91.74 gain 165 181 -92.32 gain 181 165 -92.74 gain 165 182 -105.40 gain 182 165 -108.20 gain 165 183 -102.46 gain 183 165 -98.65 gain 165 184 -108.36 gain 184 165 -109.34 gain 165 185 -117.50 gain 185 165 -115.96 gain 165 186 -121.91 gain 186 165 -120.66 gain 165 187 -115.71 gain 187 165 -116.99 gain 165 188 -110.53 gain 188 165 -115.08 gain 165 189 -119.21 gain 189 165 -121.27 gain 165 190 -127.28 gain 190 165 -126.35 gain 165 191 -121.99 gain 191 165 -122.15 gain 165 192 -122.30 gain 192 165 -125.33 gain 165 193 -124.35 gain 193 165 -128.63 gain 165 194 -124.10 gain 194 165 -122.19 gain 165 195 -105.11 gain 195 165 -103.84 gain 165 196 -102.52 gain 196 165 -105.28 gain 165 197 -106.22 gain 197 165 -105.05 gain 165 198 -118.28 gain 198 165 -116.63 gain 165 199 -114.64 gain 199 165 -116.91 gain 165 200 -116.37 gain 200 165 -115.57 gain 165 201 -116.89 gain 201 165 -116.90 gain 165 202 -122.52 gain 202 165 -126.53 gain 165 203 -120.32 gain 203 165 -123.95 gain 165 204 -122.49 gain 204 165 -123.40 gain 165 205 -124.26 gain 205 165 -124.25 gain 165 206 -125.36 gain 206 165 -129.87 gain 165 207 -130.17 gain 207 165 -127.04 gain 165 208 -130.59 gain 208 165 -133.24 gain 165 209 -124.00 gain 209 165 -127.64 gain 165 210 -99.47 gain 210 165 -100.05 gain 165 211 -101.28 gain 211 165 -103.88 gain 165 212 -108.54 gain 212 165 -109.67 gain 165 213 -111.63 gain 213 165 -111.96 gain 165 214 -112.82 gain 214 165 -113.04 gain 165 215 -114.62 gain 215 165 -111.25 gain 165 216 -122.37 gain 216 165 -123.66 gain 165 217 -118.11 gain 217 165 -119.93 gain 165 218 -114.86 gain 218 165 -118.87 gain 165 219 -124.85 gain 219 165 -120.22 gain 165 220 -119.37 gain 220 165 -125.22 gain 165 221 -122.64 gain 221 165 -124.14 gain 165 222 -129.15 gain 222 165 -130.97 gain 165 223 -123.14 gain 223 165 -123.57 gain 165 224 -126.08 gain 224 165 -129.20 gain 166 167 -96.70 gain 167 166 -98.79 gain 166 168 -104.60 gain 168 166 -105.14 gain 166 169 -108.71 gain 169 166 -113.45 gain 166 170 -118.32 gain 170 166 -114.59 gain 166 171 -118.32 gain 171 166 -119.61 gain 166 172 -113.33 gain 172 166 -109.32 gain 166 173 -119.25 gain 173 166 -114.67 gain 166 174 -124.24 gain 174 166 -123.96 gain 166 175 -118.76 gain 175 166 -122.03 gain 166 176 -125.25 gain 176 166 -120.54 gain 166 177 -123.55 gain 177 166 -126.65 gain 166 178 -127.41 gain 178 166 -126.33 gain 166 179 -129.85 gain 179 166 -127.16 gain 166 180 -96.22 gain 180 166 -95.00 gain 166 181 -91.23 gain 181 166 -90.08 gain 166 182 -93.64 gain 182 166 -94.88 gain 166 183 -104.54 gain 183 166 -99.17 gain 166 184 -107.21 gain 184 166 -106.62 gain 166 185 -111.90 gain 185 166 -108.79 gain 166 186 -114.46 gain 186 166 -111.63 gain 166 187 -122.36 gain 187 166 -122.08 gain 166 188 -126.88 gain 188 166 -129.86 gain 166 189 -120.75 gain 189 166 -121.24 gain 166 190 -121.55 gain 190 166 -119.05 gain 166 191 -120.37 gain 191 166 -118.96 gain 166 192 -124.78 gain 192 166 -126.24 gain 166 193 -126.51 gain 193 166 -129.22 gain 166 194 -123.81 gain 194 166 -120.33 gain 166 195 -103.50 gain 195 166 -100.65 gain 166 196 -99.15 gain 196 166 -100.35 gain 166 197 -99.59 gain 197 166 -96.84 gain 166 198 -110.54 gain 198 166 -107.32 gain 166 199 -108.06 gain 199 166 -108.75 gain 166 200 -121.26 gain 200 166 -118.90 gain 166 201 -116.33 gain 201 166 -114.77 gain 166 202 -114.94 gain 202 166 -117.38 gain 166 203 -112.55 gain 203 166 -114.61 gain 166 204 -123.34 gain 204 166 -122.68 gain 166 205 -122.33 gain 205 166 -120.75 gain 166 206 -122.67 gain 206 166 -125.61 gain 166 207 -128.89 gain 207 166 -124.19 gain 166 208 -124.49 gain 208 166 -125.57 gain 166 209 -129.58 gain 209 166 -131.65 gain 166 210 -113.14 gain 210 166 -112.14 gain 166 211 -108.62 gain 211 166 -109.65 gain 166 212 -108.43 gain 212 166 -108.00 gain 166 213 -111.40 gain 213 166 -110.16 gain 166 214 -117.48 gain 214 166 -116.13 gain 166 215 -114.26 gain 215 166 -109.33 gain 166 216 -121.19 gain 216 166 -120.92 gain 166 217 -116.03 gain 217 166 -116.27 gain 166 218 -119.13 gain 218 166 -121.56 gain 166 219 -126.26 gain 219 166 -120.05 gain 166 220 -122.41 gain 220 166 -126.70 gain 166 221 -124.23 gain 221 166 -124.16 gain 166 222 -122.02 gain 222 166 -122.27 gain 166 223 -127.20 gain 223 166 -126.07 gain 166 224 -134.80 gain 224 166 -136.36 gain 167 168 -91.57 gain 168 167 -90.02 gain 167 169 -110.18 gain 169 167 -112.83 gain 167 170 -106.82 gain 170 167 -101.00 gain 167 171 -115.92 gain 171 167 -115.12 gain 167 172 -112.90 gain 172 167 -106.79 gain 167 173 -114.71 gain 173 167 -108.04 gain 167 174 -122.31 gain 174 167 -119.94 gain 167 175 -120.63 gain 175 167 -121.81 gain 167 176 -125.35 gain 176 167 -118.55 gain 167 177 -125.51 gain 177 167 -126.51 gain 167 178 -126.21 gain 178 167 -123.04 gain 167 179 -128.63 gain 179 167 -123.85 gain 167 180 -111.66 gain 180 167 -108.35 gain 167 181 -101.22 gain 181 167 -97.98 gain 167 182 -97.52 gain 182 167 -96.67 gain 167 183 -102.44 gain 183 167 -94.97 gain 167 184 -106.15 gain 184 167 -103.47 gain 167 185 -121.86 gain 185 167 -116.66 gain 167 186 -107.18 gain 186 167 -102.26 gain 167 187 -113.50 gain 187 167 -111.12 gain 167 188 -119.56 gain 188 167 -120.45 gain 167 189 -126.96 gain 189 167 -125.36 gain 167 190 -124.10 gain 190 167 -119.52 gain 167 191 -123.44 gain 191 167 -119.94 gain 167 192 -125.40 gain 192 167 -124.77 gain 167 193 -129.01 gain 193 167 -129.63 gain 167 194 -131.88 gain 194 167 -126.32 gain 167 195 -107.34 gain 195 167 -102.40 gain 167 196 -109.31 gain 196 167 -108.42 gain 167 197 -96.94 gain 197 167 -92.11 gain 167 198 -100.48 gain 198 167 -95.17 gain 167 199 -103.79 gain 199 167 -102.40 gain 167 200 -116.63 gain 200 167 -112.18 gain 167 201 -119.74 gain 201 167 -116.09 gain 167 202 -121.15 gain 202 167 -121.50 gain 167 203 -118.30 gain 203 167 -118.27 gain 167 204 -115.68 gain 204 167 -112.94 gain 167 205 -125.81 gain 205 167 -122.14 gain 167 206 -128.56 gain 206 167 -129.41 gain 167 207 -127.97 gain 207 167 -121.18 gain 167 208 -133.60 gain 208 167 -132.59 gain 167 209 -126.88 gain 209 167 -126.86 gain 167 210 -111.34 gain 210 167 -108.25 gain 167 211 -103.59 gain 211 167 -102.53 gain 167 212 -106.34 gain 212 167 -103.82 gain 167 213 -112.63 gain 213 167 -109.30 gain 167 214 -114.45 gain 214 167 -111.01 gain 167 215 -114.03 gain 215 167 -107.00 gain 167 216 -122.63 gain 216 167 -120.26 gain 167 217 -114.97 gain 217 167 -113.12 gain 167 218 -122.38 gain 218 167 -122.72 gain 167 219 -124.23 gain 219 167 -115.93 gain 167 220 -125.95 gain 220 167 -128.15 gain 167 221 -126.87 gain 221 167 -124.70 gain 167 222 -132.70 gain 222 167 -130.86 gain 167 223 -131.82 gain 223 167 -128.60 gain 167 224 -122.54 gain 224 167 -122.01 gain 168 169 -85.19 gain 169 168 -89.39 gain 168 170 -101.42 gain 170 168 -97.14 gain 168 171 -111.00 gain 171 168 -111.75 gain 168 172 -120.68 gain 172 168 -116.12 gain 168 173 -117.19 gain 173 168 -112.07 gain 168 174 -117.69 gain 174 168 -116.87 gain 168 175 -124.25 gain 175 168 -126.98 gain 168 176 -125.98 gain 176 168 -120.73 gain 168 177 -122.13 gain 177 168 -124.68 gain 168 178 -125.58 gain 178 168 -123.96 gain 168 179 -125.77 gain 179 168 -122.54 gain 168 180 -111.23 gain 180 168 -109.47 gain 168 181 -102.70 gain 181 168 -101.01 gain 168 182 -103.74 gain 182 168 -104.44 gain 168 183 -96.79 gain 183 168 -90.87 gain 168 184 -97.99 gain 184 168 -96.86 gain 168 185 -109.81 gain 185 168 -106.16 gain 168 186 -109.26 gain 186 168 -105.90 gain 168 187 -119.39 gain 187 168 -118.56 gain 168 188 -116.08 gain 188 168 -118.52 gain 168 189 -120.24 gain 189 168 -120.19 gain 168 190 -121.44 gain 190 168 -118.40 gain 168 191 -122.01 gain 191 168 -120.06 gain 168 192 -117.95 gain 192 168 -118.87 gain 168 193 -123.31 gain 193 168 -125.48 gain 168 194 -129.12 gain 194 168 -125.10 gain 168 195 -107.49 gain 195 168 -104.11 gain 168 196 -109.45 gain 196 168 -110.11 gain 168 197 -99.53 gain 197 168 -96.25 gain 168 198 -95.15 gain 198 168 -91.38 gain 168 199 -100.92 gain 199 168 -101.08 gain 168 200 -114.20 gain 200 168 -111.29 gain 168 201 -110.16 gain 201 168 -108.06 gain 168 202 -114.58 gain 202 168 -116.48 gain 168 203 -116.49 gain 203 168 -118.01 gain 168 204 -114.10 gain 204 168 -112.90 gain 168 205 -123.24 gain 205 168 -121.11 gain 168 206 -127.06 gain 206 168 -129.45 gain 168 207 -129.49 gain 207 168 -124.25 gain 168 208 -123.82 gain 208 168 -124.36 gain 168 209 -124.52 gain 209 168 -126.05 gain 168 210 -109.90 gain 210 168 -108.36 gain 168 211 -108.97 gain 211 168 -109.46 gain 168 212 -108.46 gain 212 168 -107.49 gain 168 213 -105.23 gain 213 168 -103.45 gain 168 214 -110.18 gain 214 168 -108.29 gain 168 215 -108.32 gain 215 168 -102.85 gain 168 216 -112.99 gain 216 168 -112.18 gain 168 217 -119.46 gain 217 168 -119.16 gain 168 218 -119.34 gain 218 168 -121.23 gain 168 219 -124.72 gain 219 168 -117.97 gain 168 220 -125.72 gain 220 168 -129.47 gain 168 221 -129.09 gain 221 168 -128.48 gain 168 222 -117.83 gain 222 168 -117.54 gain 168 223 -122.27 gain 223 168 -120.60 gain 168 224 -127.60 gain 224 168 -128.62 gain 169 170 -97.07 gain 170 169 -88.59 gain 169 171 -103.87 gain 171 169 -100.42 gain 169 172 -113.07 gain 172 169 -104.32 gain 169 173 -118.37 gain 173 169 -109.05 gain 169 174 -120.02 gain 174 169 -115.00 gain 169 175 -122.27 gain 175 169 -120.80 gain 169 176 -119.33 gain 176 169 -109.87 gain 169 177 -122.77 gain 177 169 -121.13 gain 169 178 -138.28 gain 178 169 -132.46 gain 169 179 -125.06 gain 179 169 -117.63 gain 169 180 -117.48 gain 180 169 -111.52 gain 169 181 -115.79 gain 181 169 -109.90 gain 169 182 -114.64 gain 182 169 -111.13 gain 169 183 -102.81 gain 183 169 -92.69 gain 169 184 -106.73 gain 184 169 -101.40 gain 169 185 -104.37 gain 185 169 -96.53 gain 169 186 -109.39 gain 186 169 -101.83 gain 169 187 -113.40 gain 187 169 -108.38 gain 169 188 -118.58 gain 188 169 -116.82 gain 169 189 -113.69 gain 189 169 -109.44 gain 169 190 -125.66 gain 190 169 -118.43 gain 169 191 -126.79 gain 191 169 -120.65 gain 169 192 -121.72 gain 192 169 -118.44 gain 169 193 -124.85 gain 193 169 -122.82 gain 169 194 -133.36 gain 194 169 -125.14 gain 169 195 -117.75 gain 195 169 -110.16 gain 169 196 -118.42 gain 196 169 -114.88 gain 169 197 -110.56 gain 197 169 -103.08 gain 169 198 -111.15 gain 198 169 -103.19 gain 169 199 -111.55 gain 199 169 -107.50 gain 169 200 -106.48 gain 200 169 -99.38 gain 169 201 -110.02 gain 201 169 -103.72 gain 169 202 -120.75 gain 202 169 -118.45 gain 169 203 -117.86 gain 203 169 -115.18 gain 169 204 -127.81 gain 204 169 -122.42 gain 169 205 -121.58 gain 205 169 -115.26 gain 169 206 -129.50 gain 206 169 -127.70 gain 169 207 -132.35 gain 207 169 -122.91 gain 169 208 -117.45 gain 208 169 -113.79 gain 169 209 -124.41 gain 209 169 -121.74 gain 169 210 -124.99 gain 210 169 -119.26 gain 169 211 -110.26 gain 211 169 -106.55 gain 169 212 -116.94 gain 212 169 -111.77 gain 169 213 -116.87 gain 213 169 -110.89 gain 169 214 -116.77 gain 214 169 -110.68 gain 169 215 -110.80 gain 215 169 -101.12 gain 169 216 -121.63 gain 216 169 -116.62 gain 169 217 -120.22 gain 217 169 -115.73 gain 169 218 -117.31 gain 218 169 -115.00 gain 169 219 -122.56 gain 219 169 -111.61 gain 169 220 -122.67 gain 220 169 -122.22 gain 169 221 -123.98 gain 221 169 -119.17 gain 169 222 -128.03 gain 222 169 -123.54 gain 169 223 -133.36 gain 223 169 -127.49 gain 169 224 -131.10 gain 224 169 -127.92 gain 170 171 -97.46 gain 171 170 -102.48 gain 170 172 -101.17 gain 172 170 -100.89 gain 170 173 -101.81 gain 173 170 -100.97 gain 170 174 -111.76 gain 174 170 -115.21 gain 170 175 -109.18 gain 175 170 -116.18 gain 170 176 -109.84 gain 176 170 -108.86 gain 170 177 -125.23 gain 177 170 -132.06 gain 170 178 -119.91 gain 178 170 -122.57 gain 170 179 -121.32 gain 179 170 -122.37 gain 170 180 -109.62 gain 180 170 -112.13 gain 170 181 -101.39 gain 181 170 -103.97 gain 170 182 -102.32 gain 182 170 -107.29 gain 170 183 -104.08 gain 183 170 -102.44 gain 170 184 -96.50 gain 184 170 -99.64 gain 170 185 -86.77 gain 185 170 -87.39 gain 170 186 -97.28 gain 186 170 -98.19 gain 170 187 -102.72 gain 187 170 -106.17 gain 170 188 -103.10 gain 188 170 -109.81 gain 170 189 -105.22 gain 189 170 -109.45 gain 170 190 -114.22 gain 190 170 -115.45 gain 170 191 -117.37 gain 191 170 -119.70 gain 170 192 -111.18 gain 192 170 -116.37 gain 170 193 -112.60 gain 193 170 -119.05 gain 170 194 -120.05 gain 194 170 -120.30 gain 170 195 -105.50 gain 195 170 -106.39 gain 170 196 -109.57 gain 196 170 -114.50 gain 170 197 -105.20 gain 197 170 -106.19 gain 170 198 -109.66 gain 198 170 -110.18 gain 170 199 -101.98 gain 199 170 -106.41 gain 170 200 -100.71 gain 200 170 -102.08 gain 170 201 -100.47 gain 201 170 -102.65 gain 170 202 -104.62 gain 202 170 -110.80 gain 170 203 -114.71 gain 203 170 -120.50 gain 170 204 -105.90 gain 204 170 -108.98 gain 170 205 -109.46 gain 205 170 -111.62 gain 170 206 -116.68 gain 206 170 -123.35 gain 170 207 -117.76 gain 207 170 -116.79 gain 170 208 -117.25 gain 208 170 -122.06 gain 170 209 -120.68 gain 209 170 -126.48 gain 170 210 -107.86 gain 210 170 -110.60 gain 170 211 -112.74 gain 211 170 -117.51 gain 170 212 -107.34 gain 212 170 -110.64 gain 170 213 -101.67 gain 213 170 -104.17 gain 170 214 -105.31 gain 214 170 -107.70 gain 170 215 -107.20 gain 215 170 -106.00 gain 170 216 -110.25 gain 216 170 -113.71 gain 170 217 -108.97 gain 217 170 -112.95 gain 170 218 -104.93 gain 218 170 -111.10 gain 170 219 -109.55 gain 219 170 -107.08 gain 170 220 -114.64 gain 220 170 -122.66 gain 170 221 -120.83 gain 221 170 -124.49 gain 170 222 -121.45 gain 222 170 -125.44 gain 170 223 -117.52 gain 223 170 -120.12 gain 170 224 -122.11 gain 224 170 -127.40 gain 171 172 -94.69 gain 172 171 -89.39 gain 171 173 -103.59 gain 173 171 -97.73 gain 171 174 -107.66 gain 174 171 -106.08 gain 171 175 -113.45 gain 175 171 -115.44 gain 171 176 -116.20 gain 176 171 -110.19 gain 171 177 -117.61 gain 177 171 -119.41 gain 171 178 -122.00 gain 178 171 -119.63 gain 171 179 -126.40 gain 179 171 -122.43 gain 171 180 -118.58 gain 180 171 -116.08 gain 171 181 -118.88 gain 181 171 -116.44 gain 171 182 -114.42 gain 182 171 -114.36 gain 171 183 -109.64 gain 183 171 -102.97 gain 171 184 -104.42 gain 184 171 -102.54 gain 171 185 -100.49 gain 185 171 -96.09 gain 171 186 -98.78 gain 186 171 -94.67 gain 171 187 -105.06 gain 187 171 -103.49 gain 171 188 -104.64 gain 188 171 -106.33 gain 171 189 -112.04 gain 189 171 -111.24 gain 171 190 -114.91 gain 190 171 -111.13 gain 171 191 -120.55 gain 191 171 -117.85 gain 171 192 -123.01 gain 192 171 -123.18 gain 171 193 -122.85 gain 193 171 -124.27 gain 171 194 -125.75 gain 194 171 -120.98 gain 171 195 -118.96 gain 195 171 -114.82 gain 171 196 -114.04 gain 196 171 -113.95 gain 171 197 -120.77 gain 197 171 -116.73 gain 171 198 -118.20 gain 198 171 -113.69 gain 171 199 -108.32 gain 199 171 -107.73 gain 171 200 -105.85 gain 200 171 -102.19 gain 171 201 -96.58 gain 201 171 -93.73 gain 171 202 -106.87 gain 202 171 -108.02 gain 171 203 -110.27 gain 203 171 -111.04 gain 171 204 -111.77 gain 204 171 -109.83 gain 171 205 -115.12 gain 205 171 -112.25 gain 171 206 -112.76 gain 206 171 -114.41 gain 171 207 -117.23 gain 207 171 -111.24 gain 171 208 -124.59 gain 208 171 -124.38 gain 171 209 -128.44 gain 209 171 -129.22 gain 171 210 -123.26 gain 210 171 -120.97 gain 171 211 -121.80 gain 211 171 -121.54 gain 171 212 -111.83 gain 212 171 -110.11 gain 171 213 -114.04 gain 213 171 -111.51 gain 171 214 -111.17 gain 214 171 -108.53 gain 171 215 -114.04 gain 215 171 -107.81 gain 171 216 -114.68 gain 216 171 -113.12 gain 171 217 -113.97 gain 217 171 -112.92 gain 171 218 -112.39 gain 218 171 -113.54 gain 171 219 -114.60 gain 219 171 -107.10 gain 171 220 -117.25 gain 220 171 -120.25 gain 171 221 -116.92 gain 221 171 -115.56 gain 171 222 -119.18 gain 222 171 -118.14 gain 171 223 -124.85 gain 223 171 -122.43 gain 171 224 -125.93 gain 224 171 -126.19 gain 172 173 -92.84 gain 173 172 -92.27 gain 172 174 -99.47 gain 174 172 -103.20 gain 172 175 -102.06 gain 175 172 -109.35 gain 172 176 -110.77 gain 176 172 -110.06 gain 172 177 -105.53 gain 177 172 -112.64 gain 172 178 -114.43 gain 178 172 -117.36 gain 172 179 -110.83 gain 179 172 -112.15 gain 172 180 -116.63 gain 180 172 -119.43 gain 172 181 -113.34 gain 181 172 -116.20 gain 172 182 -112.60 gain 182 172 -117.84 gain 172 183 -108.11 gain 183 172 -106.75 gain 172 184 -108.42 gain 184 172 -111.84 gain 172 185 -101.10 gain 185 172 -102.01 gain 172 186 -90.67 gain 186 172 -91.86 gain 172 187 -89.50 gain 187 172 -93.23 gain 172 188 -100.74 gain 188 172 -107.73 gain 172 189 -99.35 gain 189 172 -103.86 gain 172 190 -110.01 gain 190 172 -111.52 gain 172 191 -108.32 gain 191 172 -110.92 gain 172 192 -112.76 gain 192 172 -118.23 gain 172 193 -104.09 gain 193 172 -110.81 gain 172 194 -119.89 gain 194 172 -120.42 gain 172 195 -118.13 gain 195 172 -119.30 gain 172 196 -109.40 gain 196 172 -114.61 gain 172 197 -112.48 gain 197 172 -113.75 gain 172 198 -108.98 gain 198 172 -109.78 gain 172 199 -106.51 gain 199 172 -111.22 gain 172 200 -103.87 gain 200 172 -105.52 gain 172 201 -101.36 gain 201 172 -103.81 gain 172 202 -103.04 gain 202 172 -109.49 gain 172 203 -104.81 gain 203 172 -110.88 gain 172 204 -98.23 gain 204 172 -101.59 gain 172 205 -109.42 gain 205 172 -111.86 gain 172 206 -105.22 gain 206 172 -112.17 gain 172 207 -110.08 gain 207 172 -109.39 gain 172 208 -118.74 gain 208 172 -123.83 gain 172 209 -114.98 gain 209 172 -121.06 gain 172 210 -111.29 gain 210 172 -114.31 gain 172 211 -115.24 gain 211 172 -120.28 gain 172 212 -118.02 gain 212 172 -121.60 gain 172 213 -113.09 gain 213 172 -115.87 gain 172 214 -109.32 gain 214 172 -111.99 gain 172 215 -106.29 gain 215 172 -105.37 gain 172 216 -105.09 gain 216 172 -108.83 gain 172 217 -106.18 gain 217 172 -110.44 gain 172 218 -102.27 gain 218 172 -108.72 gain 172 219 -110.85 gain 219 172 -108.66 gain 172 220 -105.67 gain 220 172 -113.97 gain 172 221 -114.42 gain 221 172 -118.36 gain 172 222 -99.93 gain 222 172 -104.19 gain 172 223 -114.51 gain 223 172 -117.39 gain 172 224 -119.56 gain 224 172 -125.13 gain 173 174 -89.67 gain 174 173 -93.97 gain 173 175 -100.87 gain 175 173 -108.72 gain 173 176 -102.58 gain 176 173 -102.44 gain 173 177 -107.90 gain 177 173 -115.57 gain 173 178 -111.80 gain 178 173 -115.30 gain 173 179 -104.22 gain 179 173 -106.11 gain 173 180 -121.84 gain 180 173 -125.20 gain 173 181 -120.12 gain 181 173 -123.55 gain 173 182 -107.83 gain 182 173 -113.64 gain 173 183 -108.07 gain 183 173 -107.27 gain 173 184 -112.01 gain 184 173 -116.00 gain 173 185 -107.55 gain 185 173 -109.02 gain 173 186 -102.57 gain 186 173 -104.33 gain 173 187 -89.59 gain 187 173 -93.89 gain 173 188 -92.04 gain 188 173 -99.60 gain 173 189 -94.73 gain 189 173 -99.80 gain 173 190 -96.67 gain 190 173 -98.75 gain 173 191 -104.59 gain 191 173 -107.76 gain 173 192 -106.22 gain 192 173 -112.26 gain 173 193 -110.83 gain 193 173 -118.12 gain 173 194 -110.56 gain 194 173 -111.66 gain 173 195 -117.28 gain 195 173 -119.01 gain 173 196 -117.28 gain 196 173 -123.06 gain 173 197 -114.53 gain 197 173 -116.37 gain 173 198 -109.09 gain 198 173 -110.45 gain 173 199 -111.38 gain 199 173 -116.65 gain 173 200 -106.31 gain 200 173 -108.52 gain 173 201 -111.45 gain 201 173 -114.47 gain 173 202 -99.56 gain 202 173 -106.58 gain 173 203 -93.38 gain 203 173 -100.02 gain 173 204 -98.42 gain 204 173 -102.35 gain 173 205 -103.87 gain 205 173 -106.86 gain 173 206 -106.57 gain 206 173 -114.09 gain 173 207 -109.90 gain 207 173 -109.78 gain 173 208 -110.21 gain 208 173 -115.87 gain 173 209 -112.05 gain 209 173 -118.69 gain 173 210 -116.40 gain 210 173 -119.99 gain 173 211 -115.37 gain 211 173 -120.98 gain 173 212 -119.32 gain 212 173 -123.47 gain 173 213 -113.16 gain 213 173 -116.50 gain 173 214 -107.91 gain 214 173 -111.14 gain 173 215 -112.30 gain 215 173 -111.94 gain 173 216 -107.48 gain 216 173 -111.79 gain 173 217 -103.62 gain 217 173 -108.45 gain 173 218 -97.06 gain 218 173 -104.08 gain 173 219 -105.52 gain 219 173 -103.90 gain 173 220 -112.82 gain 220 173 -121.68 gain 173 221 -103.17 gain 221 173 -107.67 gain 173 222 -108.20 gain 222 173 -113.03 gain 173 223 -113.32 gain 223 173 -116.76 gain 173 224 -113.89 gain 224 173 -120.02 gain 174 175 -88.70 gain 175 174 -92.26 gain 174 176 -105.26 gain 176 174 -100.83 gain 174 177 -108.21 gain 177 174 -111.59 gain 174 178 -116.39 gain 178 174 -115.59 gain 174 179 -116.90 gain 179 174 -114.49 gain 174 180 -121.83 gain 180 174 -120.89 gain 174 181 -119.79 gain 181 174 -118.92 gain 174 182 -122.40 gain 182 174 -123.91 gain 174 183 -117.49 gain 183 174 -112.39 gain 174 184 -117.80 gain 184 174 -117.48 gain 174 185 -109.15 gain 185 174 -106.33 gain 174 186 -115.70 gain 186 174 -113.15 gain 174 187 -108.66 gain 187 174 -108.66 gain 174 188 -96.24 gain 188 174 -99.50 gain 174 189 -96.08 gain 189 174 -96.85 gain 174 190 -92.36 gain 190 174 -90.14 gain 174 191 -103.59 gain 191 174 -102.46 gain 174 192 -102.52 gain 192 174 -104.26 gain 174 193 -108.76 gain 193 174 -111.75 gain 174 194 -118.14 gain 194 174 -114.95 gain 174 195 -120.45 gain 195 174 -117.89 gain 174 196 -123.42 gain 196 174 -124.90 gain 174 197 -121.54 gain 197 174 -119.08 gain 174 198 -117.25 gain 198 174 -114.31 gain 174 199 -111.80 gain 199 174 -112.78 gain 174 200 -115.78 gain 200 174 -113.69 gain 174 201 -119.29 gain 201 174 -118.01 gain 174 202 -105.99 gain 202 174 -108.71 gain 174 203 -107.02 gain 203 174 -109.37 gain 174 204 -101.49 gain 204 174 -101.11 gain 174 205 -108.57 gain 205 174 -107.27 gain 174 206 -103.02 gain 206 174 -106.24 gain 174 207 -109.85 gain 207 174 -105.43 gain 174 208 -113.98 gain 208 174 -115.34 gain 174 209 -122.53 gain 209 174 -124.88 gain 174 210 -123.48 gain 210 174 -122.77 gain 174 211 -121.26 gain 211 174 -122.57 gain 174 212 -122.10 gain 212 174 -121.95 gain 174 213 -115.08 gain 213 174 -114.12 gain 174 214 -120.58 gain 214 174 -119.51 gain 174 215 -114.28 gain 215 174 -109.62 gain 174 216 -116.44 gain 216 174 -116.45 gain 174 217 -111.09 gain 217 174 -111.61 gain 174 218 -103.64 gain 218 174 -106.36 gain 174 219 -108.88 gain 219 174 -102.95 gain 174 220 -108.28 gain 220 174 -112.85 gain 174 221 -115.03 gain 221 174 -115.24 gain 174 222 -111.45 gain 222 174 -111.98 gain 174 223 -108.72 gain 223 174 -107.87 gain 174 224 -121.83 gain 224 174 -123.67 gain 175 176 -98.87 gain 176 175 -90.88 gain 175 177 -98.73 gain 177 175 -98.55 gain 175 178 -121.00 gain 178 175 -116.65 gain 175 179 -121.44 gain 179 175 -115.48 gain 175 180 -125.67 gain 180 175 -121.18 gain 175 181 -126.47 gain 181 175 -122.04 gain 175 182 -127.57 gain 182 175 -125.53 gain 175 183 -129.34 gain 183 175 -120.69 gain 175 184 -123.74 gain 184 175 -119.88 gain 175 185 -113.93 gain 185 175 -107.55 gain 175 186 -120.66 gain 186 175 -114.56 gain 175 187 -110.24 gain 187 175 -106.69 gain 175 188 -109.95 gain 188 175 -109.65 gain 175 189 -103.52 gain 189 175 -100.73 gain 175 190 -96.48 gain 190 175 -90.71 gain 175 191 -96.77 gain 191 175 -92.09 gain 175 192 -106.47 gain 192 175 -104.66 gain 175 193 -110.17 gain 193 175 -109.61 gain 175 194 -113.53 gain 194 175 -106.78 gain 175 195 -124.70 gain 195 175 -118.58 gain 175 196 -124.96 gain 196 175 -122.88 gain 175 197 -118.48 gain 197 175 -112.46 gain 175 198 -127.05 gain 198 175 -120.56 gain 175 199 -126.55 gain 199 175 -123.97 gain 175 200 -117.64 gain 200 175 -112.01 gain 175 201 -114.07 gain 201 175 -109.24 gain 175 202 -112.26 gain 202 175 -111.43 gain 175 203 -108.28 gain 203 175 -107.07 gain 175 204 -115.98 gain 204 175 -112.05 gain 175 205 -107.40 gain 205 175 -102.55 gain 175 206 -104.39 gain 206 175 -104.06 gain 175 207 -111.34 gain 207 175 -103.36 gain 175 208 -109.19 gain 208 175 -107.00 gain 175 209 -114.91 gain 209 175 -113.71 gain 175 210 -127.97 gain 210 175 -123.71 gain 175 211 -131.69 gain 211 175 -129.45 gain 175 212 -137.86 gain 212 175 -134.15 gain 175 213 -123.66 gain 213 175 -119.15 gain 175 214 -126.05 gain 214 175 -121.43 gain 175 215 -116.41 gain 215 175 -108.21 gain 175 216 -118.51 gain 216 175 -114.96 gain 175 217 -120.22 gain 217 175 -117.19 gain 175 218 -111.86 gain 218 175 -111.02 gain 175 219 -110.96 gain 219 175 -101.49 gain 175 220 -110.26 gain 220 175 -111.27 gain 175 221 -115.76 gain 221 175 -112.41 gain 175 222 -115.36 gain 222 175 -112.34 gain 175 223 -118.57 gain 223 175 -114.17 gain 175 224 -119.17 gain 224 175 -117.45 gain 176 177 -91.23 gain 177 176 -99.04 gain 176 178 -100.82 gain 178 176 -104.46 gain 176 179 -103.59 gain 179 176 -105.62 gain 176 180 -125.19 gain 180 176 -128.69 gain 176 181 -122.49 gain 181 176 -126.06 gain 176 182 -109.58 gain 182 176 -115.53 gain 176 183 -114.07 gain 183 176 -113.41 gain 176 184 -109.04 gain 184 176 -113.17 gain 176 185 -119.33 gain 185 176 -120.94 gain 176 186 -109.07 gain 186 176 -110.97 gain 176 187 -107.09 gain 187 176 -111.52 gain 176 188 -101.32 gain 188 176 -109.02 gain 176 189 -97.93 gain 189 176 -103.14 gain 176 190 -88.87 gain 190 176 -91.09 gain 176 191 -92.43 gain 191 176 -95.73 gain 176 192 -93.25 gain 192 176 -99.42 gain 176 193 -97.13 gain 193 176 -104.55 gain 176 194 -104.21 gain 194 176 -105.45 gain 176 195 -121.17 gain 195 176 -123.05 gain 176 196 -120.59 gain 196 176 -126.50 gain 176 197 -116.45 gain 197 176 -118.42 gain 176 198 -108.02 gain 198 176 -109.51 gain 176 199 -113.89 gain 199 176 -119.30 gain 176 200 -114.93 gain 200 176 -117.28 gain 176 201 -118.34 gain 201 176 -121.49 gain 176 202 -108.99 gain 202 176 -116.14 gain 176 203 -106.88 gain 203 176 -113.66 gain 176 204 -98.06 gain 204 176 -102.12 gain 176 205 -99.78 gain 205 176 -102.92 gain 176 206 -97.78 gain 206 176 -105.44 gain 176 207 -95.05 gain 207 176 -95.06 gain 176 208 -103.39 gain 208 176 -109.19 gain 176 209 -101.04 gain 209 176 -107.82 gain 176 210 -130.23 gain 210 176 -133.95 gain 176 211 -118.81 gain 211 176 -124.55 gain 176 212 -118.54 gain 212 176 -122.82 gain 176 213 -118.13 gain 213 176 -121.61 gain 176 214 -115.51 gain 214 176 -118.88 gain 176 215 -106.15 gain 215 176 -105.93 gain 176 216 -105.09 gain 216 176 -109.54 gain 176 217 -116.36 gain 217 176 -121.33 gain 176 218 -112.03 gain 218 176 -119.18 gain 176 219 -100.97 gain 219 176 -99.48 gain 176 220 -97.74 gain 220 176 -106.74 gain 176 221 -106.38 gain 221 176 -111.02 gain 176 222 -108.68 gain 222 176 -113.65 gain 176 223 -104.77 gain 223 176 -108.36 gain 176 224 -102.01 gain 224 176 -108.28 gain 177 178 -87.20 gain 178 177 -83.03 gain 177 179 -96.22 gain 179 177 -90.43 gain 177 180 -137.74 gain 180 177 -133.42 gain 177 181 -128.26 gain 181 177 -124.01 gain 177 182 -127.34 gain 182 177 -125.48 gain 177 183 -127.40 gain 183 177 -118.92 gain 177 184 -122.27 gain 184 177 -118.58 gain 177 185 -118.07 gain 185 177 -111.86 gain 177 186 -120.37 gain 186 177 -114.45 gain 177 187 -119.92 gain 187 177 -116.54 gain 177 188 -114.40 gain 188 177 -114.28 gain 177 189 -105.72 gain 189 177 -103.12 gain 177 190 -111.52 gain 190 177 -105.93 gain 177 191 -100.53 gain 191 177 -96.03 gain 177 192 -101.36 gain 192 177 -99.72 gain 177 193 -100.46 gain 193 177 -100.08 gain 177 194 -109.66 gain 194 177 -103.08 gain 177 195 -130.95 gain 195 177 -125.01 gain 177 196 -123.22 gain 196 177 -121.32 gain 177 197 -122.41 gain 197 177 -116.57 gain 177 198 -122.91 gain 198 177 -116.59 gain 177 199 -119.46 gain 199 177 -117.06 gain 177 200 -130.85 gain 200 177 -125.39 gain 177 201 -117.43 gain 201 177 -112.78 gain 177 202 -119.19 gain 202 177 -118.54 gain 177 203 -116.67 gain 203 177 -115.64 gain 177 204 -113.62 gain 204 177 -109.87 gain 177 205 -109.74 gain 205 177 -105.07 gain 177 206 -110.22 gain 206 177 -110.06 gain 177 207 -104.59 gain 207 177 -96.79 gain 177 208 -101.64 gain 208 177 -99.62 gain 177 209 -102.97 gain 209 177 -101.94 gain 177 210 -129.52 gain 210 177 -125.43 gain 177 211 -130.03 gain 211 177 -127.96 gain 177 212 -132.82 gain 212 177 -129.29 gain 177 213 -123.39 gain 213 177 -119.06 gain 177 214 -125.33 gain 214 177 -120.89 gain 177 215 -119.44 gain 215 177 -111.41 gain 177 216 -124.25 gain 216 177 -120.88 gain 177 217 -119.38 gain 217 177 -116.53 gain 177 218 -120.12 gain 218 177 -119.46 gain 177 219 -117.06 gain 219 177 -107.76 gain 177 220 -116.22 gain 220 177 -117.40 gain 177 221 -106.38 gain 221 177 -103.21 gain 177 222 -110.61 gain 222 177 -107.77 gain 177 223 -110.19 gain 223 177 -105.97 gain 177 224 -106.69 gain 224 177 -105.15 gain 178 179 -88.87 gain 179 178 -87.26 gain 178 180 -126.44 gain 180 178 -126.31 gain 178 181 -129.70 gain 181 178 -129.63 gain 178 182 -128.75 gain 182 178 -131.06 gain 178 183 -127.45 gain 183 178 -123.15 gain 178 184 -125.71 gain 184 178 -126.20 gain 178 185 -130.84 gain 185 178 -128.81 gain 178 186 -123.95 gain 186 178 -122.21 gain 178 187 -117.95 gain 187 178 -118.74 gain 178 188 -113.87 gain 188 178 -117.93 gain 178 189 -116.15 gain 189 178 -117.72 gain 178 190 -105.84 gain 190 178 -104.42 gain 178 191 -97.72 gain 191 178 -97.39 gain 178 192 -98.21 gain 192 178 -100.75 gain 178 193 -89.19 gain 193 178 -92.98 gain 178 194 -89.80 gain 194 178 -87.41 gain 178 195 -116.70 gain 195 178 -114.93 gain 178 196 -124.90 gain 196 178 -127.18 gain 178 197 -130.67 gain 197 178 -129.01 gain 178 198 -127.44 gain 198 178 -125.30 gain 178 199 -117.76 gain 199 178 -119.54 gain 178 200 -127.34 gain 200 178 -126.05 gain 178 201 -116.41 gain 201 178 -115.93 gain 178 202 -117.08 gain 202 178 -120.60 gain 178 203 -110.27 gain 203 178 -113.41 gain 178 204 -110.74 gain 204 178 -111.16 gain 178 205 -112.14 gain 205 178 -111.64 gain 178 206 -102.55 gain 206 178 -106.57 gain 178 207 -102.29 gain 207 178 -98.67 gain 178 208 -102.99 gain 208 178 -105.15 gain 178 209 -107.52 gain 209 178 -110.67 gain 178 210 -126.42 gain 210 178 -126.50 gain 178 211 -129.21 gain 211 178 -131.32 gain 178 212 -130.83 gain 212 178 -131.48 gain 178 213 -124.30 gain 213 178 -124.14 gain 178 214 -118.65 gain 214 178 -118.38 gain 178 215 -122.62 gain 215 178 -118.76 gain 178 216 -116.53 gain 216 178 -117.34 gain 178 217 -115.06 gain 217 178 -116.38 gain 178 218 -118.65 gain 218 178 -122.16 gain 178 219 -108.96 gain 219 178 -103.83 gain 178 220 -112.38 gain 220 178 -117.75 gain 178 221 -108.76 gain 221 178 -109.77 gain 178 222 -102.79 gain 222 178 -104.12 gain 178 223 -106.88 gain 223 178 -106.83 gain 178 224 -107.34 gain 224 178 -109.98 gain 179 180 -135.56 gain 180 179 -137.03 gain 179 181 -124.22 gain 181 179 -125.76 gain 179 182 -119.19 gain 182 179 -123.11 gain 179 183 -122.41 gain 183 179 -119.72 gain 179 184 -113.80 gain 184 179 -115.89 gain 179 185 -125.23 gain 185 179 -124.81 gain 179 186 -116.35 gain 186 179 -116.21 gain 179 187 -116.63 gain 187 179 -119.04 gain 179 188 -114.57 gain 188 179 -120.24 gain 179 189 -114.99 gain 189 179 -118.17 gain 179 190 -114.24 gain 190 179 -114.43 gain 179 191 -103.50 gain 191 179 -104.78 gain 179 192 -102.99 gain 192 179 -107.14 gain 179 193 -95.47 gain 193 179 -100.87 gain 179 194 -96.45 gain 194 179 -95.66 gain 179 195 -125.15 gain 195 179 -124.99 gain 179 196 -129.68 gain 196 179 -133.57 gain 179 197 -119.22 gain 197 179 -119.17 gain 179 198 -124.20 gain 198 179 -123.67 gain 179 199 -116.86 gain 199 179 -120.25 gain 179 200 -118.09 gain 200 179 -118.41 gain 179 201 -118.62 gain 201 179 -119.74 gain 179 202 -115.69 gain 202 179 -120.82 gain 179 203 -107.87 gain 203 179 -112.62 gain 179 204 -114.08 gain 204 179 -116.12 gain 179 205 -109.96 gain 205 179 -111.07 gain 179 206 -106.04 gain 206 179 -111.67 gain 179 207 -108.54 gain 207 179 -106.53 gain 179 208 -97.72 gain 208 179 -101.48 gain 179 209 -104.21 gain 209 179 -108.97 gain 179 210 -134.33 gain 210 179 -136.02 gain 179 211 -130.25 gain 211 179 -133.96 gain 179 212 -126.48 gain 212 179 -128.74 gain 179 213 -124.50 gain 213 179 -125.95 gain 179 214 -129.39 gain 214 179 -130.72 gain 179 215 -127.04 gain 215 179 -124.80 gain 179 216 -123.05 gain 216 179 -125.47 gain 179 217 -114.04 gain 217 179 -116.97 gain 179 218 -114.63 gain 218 179 -119.75 gain 179 219 -114.10 gain 219 179 -110.58 gain 179 220 -111.25 gain 220 179 -118.22 gain 179 221 -113.26 gain 221 179 -115.87 gain 179 222 -110.34 gain 222 179 -113.28 gain 179 223 -103.18 gain 223 179 -104.73 gain 179 224 -105.84 gain 224 179 -110.08 gain 180 181 -87.76 gain 181 180 -87.82 gain 180 182 -91.51 gain 182 180 -93.97 gain 180 183 -105.82 gain 183 180 -101.66 gain 180 184 -106.52 gain 184 180 -107.15 gain 180 185 -105.43 gain 185 180 -103.54 gain 180 186 -128.14 gain 186 180 -126.54 gain 180 187 -114.98 gain 187 180 -115.92 gain 180 188 -119.99 gain 188 180 -124.19 gain 180 189 -119.82 gain 189 180 -121.54 gain 180 190 -130.93 gain 190 180 -129.65 gain 180 191 -130.03 gain 191 180 -129.84 gain 180 192 -120.57 gain 192 180 -123.25 gain 180 193 -130.12 gain 193 180 -134.05 gain 180 194 -129.04 gain 194 180 -126.78 gain 180 195 -92.66 gain 195 180 -91.03 gain 180 196 -100.97 gain 196 180 -103.39 gain 180 197 -104.04 gain 197 180 -102.52 gain 180 198 -107.07 gain 198 180 -105.07 gain 180 199 -111.30 gain 199 180 -113.22 gain 180 200 -111.07 gain 200 180 -109.92 gain 180 201 -120.13 gain 201 180 -119.79 gain 180 202 -117.99 gain 202 180 -121.65 gain 180 203 -116.76 gain 203 180 -120.04 gain 180 204 -127.13 gain 204 180 -127.69 gain 180 205 -118.81 gain 205 180 -118.45 gain 180 206 -121.32 gain 206 180 -125.48 gain 180 207 -130.80 gain 207 180 -127.32 gain 180 208 -125.45 gain 208 180 -127.74 gain 180 209 -124.70 gain 209 180 -127.98 gain 180 210 -90.79 gain 210 180 -91.02 gain 180 211 -103.04 gain 211 180 -105.29 gain 180 212 -98.46 gain 212 180 -99.25 gain 180 213 -114.33 gain 213 180 -114.31 gain 180 214 -109.58 gain 214 180 -109.45 gain 180 215 -108.59 gain 215 180 -104.87 gain 180 216 -114.54 gain 216 180 -115.49 gain 180 217 -120.18 gain 217 180 -121.64 gain 180 218 -124.72 gain 218 180 -128.37 gain 180 219 -120.66 gain 219 180 -115.68 gain 180 220 -124.20 gain 220 180 -129.71 gain 180 221 -117.60 gain 221 180 -118.74 gain 180 222 -128.49 gain 222 180 -129.96 gain 180 223 -127.90 gain 223 180 -127.99 gain 180 224 -126.79 gain 224 180 -129.56 gain 181 182 -90.27 gain 182 181 -92.66 gain 181 183 -102.53 gain 183 181 -98.30 gain 181 184 -109.94 gain 184 181 -110.49 gain 181 185 -109.31 gain 185 181 -107.36 gain 181 186 -114.09 gain 186 181 -112.42 gain 181 187 -110.55 gain 187 181 -111.42 gain 181 188 -114.27 gain 188 181 -118.39 gain 181 189 -118.73 gain 189 181 -120.37 gain 181 190 -123.35 gain 190 181 -122.01 gain 181 191 -120.91 gain 191 181 -120.66 gain 181 192 -121.99 gain 192 181 -124.61 gain 181 193 -129.26 gain 193 181 -133.13 gain 181 194 -129.30 gain 194 181 -126.97 gain 181 195 -92.61 gain 195 181 -90.91 gain 181 196 -93.28 gain 196 181 -95.63 gain 181 197 -93.68 gain 197 181 -92.09 gain 181 198 -96.63 gain 198 181 -94.56 gain 181 199 -109.06 gain 199 181 -110.91 gain 181 200 -112.47 gain 200 181 -111.26 gain 181 201 -119.82 gain 201 181 -119.41 gain 181 202 -110.44 gain 202 181 -114.03 gain 181 203 -118.10 gain 203 181 -121.31 gain 181 204 -120.70 gain 204 181 -121.20 gain 181 205 -119.08 gain 205 181 -118.65 gain 181 206 -120.77 gain 206 181 -124.86 gain 181 207 -115.68 gain 207 181 -112.13 gain 181 208 -124.27 gain 208 181 -126.50 gain 181 209 -128.77 gain 209 181 -132.00 gain 181 210 -104.95 gain 210 181 -105.11 gain 181 211 -106.87 gain 211 181 -109.05 gain 181 212 -105.00 gain 212 181 -105.72 gain 181 213 -105.36 gain 213 181 -105.28 gain 181 214 -112.90 gain 214 181 -112.70 gain 181 215 -116.09 gain 215 181 -112.31 gain 181 216 -116.76 gain 216 181 -117.64 gain 181 217 -116.02 gain 217 181 -117.42 gain 181 218 -115.47 gain 218 181 -119.06 gain 181 219 -116.77 gain 219 181 -111.72 gain 181 220 -126.63 gain 220 181 -132.07 gain 181 221 -124.10 gain 221 181 -125.18 gain 181 222 -127.58 gain 222 181 -128.98 gain 181 223 -126.18 gain 223 181 -126.20 gain 181 224 -121.80 gain 224 181 -124.51 gain 182 183 -101.70 gain 183 182 -95.08 gain 182 184 -106.04 gain 184 182 -104.21 gain 182 185 -110.61 gain 185 182 -106.27 gain 182 186 -110.47 gain 186 182 -106.41 gain 182 187 -111.13 gain 187 182 -109.61 gain 182 188 -121.94 gain 188 182 -123.69 gain 182 189 -130.60 gain 189 182 -129.85 gain 182 190 -126.44 gain 190 182 -122.71 gain 182 191 -123.09 gain 191 182 -120.45 gain 182 192 -125.08 gain 192 182 -125.30 gain 182 193 -123.88 gain 193 182 -125.35 gain 182 194 -122.26 gain 194 182 -117.55 gain 182 195 -103.52 gain 195 182 -99.44 gain 182 196 -100.11 gain 196 182 -100.08 gain 182 197 -95.09 gain 197 182 -91.12 gain 182 198 -95.27 gain 198 182 -90.81 gain 182 199 -100.69 gain 199 182 -100.15 gain 182 200 -114.37 gain 200 182 -110.77 gain 182 201 -112.47 gain 201 182 -109.67 gain 182 202 -108.90 gain 202 182 -110.10 gain 182 203 -129.20 gain 203 182 -130.02 gain 182 204 -128.65 gain 204 182 -126.76 gain 182 205 -118.97 gain 205 182 -116.15 gain 182 206 -121.06 gain 206 182 -122.77 gain 182 207 -120.99 gain 207 182 -115.06 gain 182 208 -123.13 gain 208 182 -122.97 gain 182 209 -125.42 gain 209 182 -126.26 gain 182 210 -107.48 gain 210 182 -105.25 gain 182 211 -113.85 gain 211 182 -113.65 gain 182 212 -101.80 gain 212 182 -100.14 gain 182 213 -104.89 gain 213 182 -102.42 gain 182 214 -106.79 gain 214 182 -104.21 gain 182 215 -110.99 gain 215 182 -104.82 gain 182 216 -117.23 gain 216 182 -115.72 gain 182 217 -116.21 gain 217 182 -115.22 gain 182 218 -115.28 gain 218 182 -116.48 gain 182 219 -119.53 gain 219 182 -112.09 gain 182 220 -118.24 gain 220 182 -121.29 gain 182 221 -125.74 gain 221 182 -124.44 gain 182 222 -125.37 gain 222 182 -124.39 gain 182 223 -124.76 gain 223 182 -122.39 gain 182 224 -136.68 gain 224 182 -137.00 gain 183 184 -88.13 gain 184 183 -92.92 gain 183 185 -95.32 gain 185 183 -97.59 gain 183 186 -102.48 gain 186 183 -105.03 gain 183 187 -112.30 gain 187 183 -117.39 gain 183 188 -109.79 gain 188 183 -118.14 gain 183 189 -113.25 gain 189 183 -119.11 gain 183 190 -112.45 gain 190 183 -115.33 gain 183 191 -122.80 gain 191 183 -126.77 gain 183 192 -122.01 gain 192 183 -128.85 gain 183 193 -121.22 gain 193 183 -129.31 gain 183 194 -123.54 gain 194 183 -125.44 gain 183 195 -102.68 gain 195 183 -105.21 gain 183 196 -98.13 gain 196 183 -104.70 gain 183 197 -91.41 gain 197 183 -94.04 gain 183 198 -89.45 gain 198 183 -91.60 gain 183 199 -102.71 gain 199 183 -108.78 gain 183 200 -95.08 gain 200 183 -98.09 gain 183 201 -105.12 gain 201 183 -108.93 gain 183 202 -99.87 gain 202 183 -107.69 gain 183 203 -106.39 gain 203 183 -113.83 gain 183 204 -112.91 gain 204 183 -117.64 gain 183 205 -114.36 gain 205 183 -118.15 gain 183 206 -120.44 gain 206 183 -128.75 gain 183 207 -111.53 gain 207 183 -112.21 gain 183 208 -111.96 gain 208 183 -118.41 gain 183 209 -113.92 gain 209 183 -121.36 gain 183 210 -101.62 gain 210 183 -106.00 gain 183 211 -102.16 gain 211 183 -108.56 gain 183 212 -105.77 gain 212 183 -110.72 gain 183 213 -92.81 gain 213 183 -96.95 gain 183 214 -97.00 gain 214 183 -101.03 gain 183 215 -97.64 gain 215 183 -98.08 gain 183 216 -111.34 gain 216 183 -116.44 gain 183 217 -108.81 gain 217 183 -114.43 gain 183 218 -119.58 gain 218 183 -127.39 gain 183 219 -108.27 gain 219 183 -107.44 gain 183 220 -115.18 gain 220 183 -124.84 gain 183 221 -119.13 gain 221 183 -124.43 gain 183 222 -114.24 gain 222 183 -119.87 gain 183 223 -119.76 gain 223 183 -124.00 gain 183 224 -122.25 gain 224 183 -129.18 gain 184 185 -99.70 gain 185 184 -97.19 gain 184 186 -96.48 gain 186 184 -94.25 gain 184 187 -104.28 gain 187 184 -104.59 gain 184 188 -107.80 gain 188 184 -111.37 gain 184 189 -121.83 gain 189 184 -122.91 gain 184 190 -118.71 gain 190 184 -116.81 gain 184 191 -115.22 gain 191 184 -114.41 gain 184 192 -117.64 gain 192 184 -119.70 gain 184 193 -120.89 gain 193 184 -124.20 gain 184 194 -122.21 gain 194 184 -119.33 gain 184 195 -115.09 gain 195 184 -112.84 gain 184 196 -108.62 gain 196 184 -110.41 gain 184 197 -101.92 gain 197 184 -99.77 gain 184 198 -95.34 gain 198 184 -92.72 gain 184 199 -90.16 gain 199 184 -91.45 gain 184 200 -100.21 gain 200 184 -98.44 gain 184 201 -101.44 gain 201 184 -100.47 gain 184 202 -109.23 gain 202 184 -112.26 gain 184 203 -114.32 gain 203 184 -116.98 gain 184 204 -114.87 gain 204 184 -114.80 gain 184 205 -116.80 gain 205 184 -115.81 gain 184 206 -121.45 gain 206 184 -124.98 gain 184 207 -125.16 gain 207 184 -121.05 gain 184 208 -120.96 gain 208 184 -122.63 gain 184 209 -120.42 gain 209 184 -123.08 gain 184 210 -112.86 gain 210 184 -112.46 gain 184 211 -109.66 gain 211 184 -111.29 gain 184 212 -106.08 gain 212 184 -106.24 gain 184 213 -101.99 gain 213 184 -101.34 gain 184 214 -103.11 gain 214 184 -102.36 gain 184 215 -106.17 gain 215 184 -101.83 gain 184 216 -100.12 gain 216 184 -100.44 gain 184 217 -111.00 gain 217 184 -111.84 gain 184 218 -118.47 gain 218 184 -121.49 gain 184 219 -113.35 gain 219 184 -107.74 gain 184 220 -119.17 gain 220 184 -124.05 gain 184 221 -118.43 gain 221 184 -118.96 gain 184 222 -122.61 gain 222 184 -123.46 gain 184 223 -126.11 gain 223 184 -125.58 gain 184 224 -122.48 gain 224 184 -124.63 gain 185 186 -94.45 gain 186 185 -94.73 gain 185 187 -102.52 gain 187 185 -105.35 gain 185 188 -105.77 gain 188 185 -111.85 gain 185 189 -112.70 gain 189 185 -116.29 gain 185 190 -107.92 gain 190 185 -108.53 gain 185 191 -112.78 gain 191 185 -114.48 gain 185 192 -119.26 gain 192 185 -123.83 gain 185 193 -119.59 gain 193 185 -125.41 gain 185 194 -118.28 gain 194 185 -117.91 gain 185 195 -114.84 gain 195 185 -115.10 gain 185 196 -110.84 gain 196 185 -115.14 gain 185 197 -106.75 gain 197 185 -107.11 gain 185 198 -105.90 gain 198 185 -105.79 gain 185 199 -95.25 gain 199 185 -99.05 gain 185 200 -88.24 gain 200 185 -88.98 gain 185 201 -90.87 gain 201 185 -92.42 gain 185 202 -96.19 gain 202 185 -101.74 gain 185 203 -109.53 gain 203 185 -114.70 gain 185 204 -115.27 gain 204 185 -117.72 gain 185 205 -106.39 gain 205 185 -107.91 gain 185 206 -113.04 gain 206 185 -119.09 gain 185 207 -113.67 gain 207 185 -112.08 gain 185 208 -116.30 gain 208 185 -120.49 gain 185 209 -122.94 gain 209 185 -128.11 gain 185 210 -112.32 gain 210 185 -114.44 gain 185 211 -108.55 gain 211 185 -112.68 gain 185 212 -109.16 gain 212 185 -111.84 gain 185 213 -102.31 gain 213 185 -104.18 gain 185 214 -98.31 gain 214 185 -100.07 gain 185 215 -95.74 gain 215 185 -93.91 gain 185 216 -92.97 gain 216 185 -95.80 gain 185 217 -104.50 gain 217 185 -107.86 gain 185 218 -107.60 gain 218 185 -113.15 gain 185 219 -108.13 gain 219 185 -105.03 gain 185 220 -108.08 gain 220 185 -115.48 gain 185 221 -115.79 gain 221 185 -118.83 gain 185 222 -125.20 gain 222 185 -128.56 gain 185 223 -115.10 gain 223 185 -117.08 gain 185 224 -126.07 gain 224 185 -130.73 gain 186 187 -86.99 gain 187 186 -89.53 gain 186 188 -99.97 gain 188 186 -105.77 gain 186 189 -98.31 gain 189 186 -101.62 gain 186 190 -101.43 gain 190 186 -101.76 gain 186 191 -105.93 gain 191 186 -107.35 gain 186 192 -103.96 gain 192 186 -108.24 gain 186 193 -127.95 gain 193 186 -133.49 gain 186 194 -121.11 gain 194 186 -120.45 gain 186 195 -112.84 gain 195 186 -112.82 gain 186 196 -113.89 gain 196 186 -117.91 gain 186 197 -107.69 gain 197 186 -107.78 gain 186 198 -108.20 gain 198 186 -107.80 gain 186 199 -103.83 gain 199 186 -107.35 gain 186 200 -95.40 gain 200 186 -95.86 gain 186 201 -89.20 gain 201 186 -90.46 gain 186 202 -95.28 gain 202 186 -100.54 gain 186 203 -105.30 gain 203 186 -110.18 gain 186 204 -103.66 gain 204 186 -105.83 gain 186 205 -106.64 gain 205 186 -107.89 gain 186 206 -112.21 gain 206 186 -117.97 gain 186 207 -117.69 gain 207 186 -115.82 gain 186 208 -111.28 gain 208 186 -115.18 gain 186 209 -118.63 gain 209 186 -123.53 gain 186 210 -114.41 gain 210 186 -116.24 gain 186 211 -116.76 gain 211 186 -120.61 gain 186 212 -108.92 gain 212 186 -111.31 gain 186 213 -102.63 gain 213 186 -104.21 gain 186 214 -102.31 gain 214 186 -103.79 gain 186 215 -99.01 gain 215 186 -96.90 gain 186 216 -99.82 gain 216 186 -102.37 gain 186 217 -101.56 gain 217 186 -104.63 gain 186 218 -108.80 gain 218 186 -114.06 gain 186 219 -102.81 gain 219 186 -99.43 gain 186 220 -107.27 gain 220 186 -114.38 gain 186 221 -112.28 gain 221 186 -115.04 gain 186 222 -118.07 gain 222 186 -121.15 gain 186 223 -120.84 gain 223 186 -122.53 gain 186 224 -121.02 gain 224 186 -125.40 gain 187 188 -92.08 gain 188 187 -95.34 gain 187 189 -103.73 gain 189 187 -104.51 gain 187 190 -105.38 gain 190 187 -103.16 gain 187 191 -109.65 gain 191 187 -108.52 gain 187 192 -113.34 gain 192 187 -115.08 gain 187 193 -117.20 gain 193 187 -120.20 gain 187 194 -122.85 gain 194 187 -119.66 gain 187 195 -116.98 gain 195 187 -114.42 gain 187 196 -109.42 gain 196 187 -110.90 gain 187 197 -117.02 gain 197 187 -114.56 gain 187 198 -110.32 gain 198 187 -107.38 gain 187 199 -112.68 gain 199 187 -113.66 gain 187 200 -103.67 gain 200 187 -101.59 gain 187 201 -85.88 gain 201 187 -84.60 gain 187 202 -96.06 gain 202 187 -98.78 gain 187 203 -97.41 gain 203 187 -99.75 gain 187 204 -107.02 gain 204 187 -106.65 gain 187 205 -106.74 gain 205 187 -105.44 gain 187 206 -109.69 gain 206 187 -112.92 gain 187 207 -107.49 gain 207 187 -103.07 gain 187 208 -117.63 gain 208 187 -118.99 gain 187 209 -115.01 gain 209 187 -117.37 gain 187 210 -120.40 gain 210 187 -119.69 gain 187 211 -116.11 gain 211 187 -117.43 gain 187 212 -114.98 gain 212 187 -114.83 gain 187 213 -117.94 gain 213 187 -116.99 gain 187 214 -105.91 gain 214 187 -104.85 gain 187 215 -104.49 gain 215 187 -99.84 gain 187 216 -102.95 gain 216 187 -102.97 gain 187 217 -96.12 gain 217 187 -96.65 gain 187 218 -103.71 gain 218 187 -106.43 gain 187 219 -108.92 gain 219 187 -103.00 gain 187 220 -104.18 gain 220 187 -108.75 gain 187 221 -116.40 gain 221 187 -116.61 gain 187 222 -121.62 gain 222 187 -122.16 gain 187 223 -117.36 gain 223 187 -116.51 gain 187 224 -117.47 gain 224 187 -119.31 gain 188 189 -90.62 gain 189 188 -88.13 gain 188 190 -104.90 gain 190 188 -99.43 gain 188 191 -115.60 gain 191 188 -111.22 gain 188 192 -108.10 gain 192 188 -106.58 gain 188 193 -118.36 gain 193 188 -118.09 gain 188 194 -120.24 gain 194 188 -113.78 gain 188 195 -120.17 gain 195 188 -114.35 gain 188 196 -121.25 gain 196 188 -119.47 gain 188 197 -119.01 gain 197 188 -113.29 gain 188 198 -117.56 gain 198 188 -111.36 gain 188 199 -116.02 gain 199 188 -113.74 gain 188 200 -110.29 gain 200 188 -104.95 gain 188 201 -111.38 gain 201 188 -106.84 gain 188 202 -99.20 gain 202 188 -98.66 gain 188 203 -90.68 gain 203 188 -89.76 gain 188 204 -96.27 gain 204 188 -92.64 gain 188 205 -104.18 gain 205 188 -99.62 gain 188 206 -109.08 gain 206 188 -109.04 gain 188 207 -114.52 gain 207 188 -106.84 gain 188 208 -113.89 gain 208 188 -111.99 gain 188 209 -118.62 gain 209 188 -117.71 gain 188 210 -124.89 gain 210 188 -120.92 gain 188 211 -123.40 gain 211 188 -121.45 gain 188 212 -121.02 gain 212 188 -117.62 gain 188 213 -119.45 gain 213 188 -115.23 gain 188 214 -115.36 gain 214 188 -111.04 gain 188 215 -109.25 gain 215 188 -101.34 gain 188 216 -114.27 gain 216 188 -111.02 gain 188 217 -108.39 gain 217 188 -105.66 gain 188 218 -106.45 gain 218 188 -105.91 gain 188 219 -108.39 gain 219 188 -99.21 gain 188 220 -111.91 gain 220 188 -113.22 gain 188 221 -116.82 gain 221 188 -113.77 gain 188 222 -118.80 gain 222 188 -116.07 gain 188 223 -116.93 gain 223 188 -112.82 gain 188 224 -117.98 gain 224 188 -116.56 gain 189 190 -96.35 gain 190 189 -93.36 gain 189 191 -101.47 gain 191 189 -99.58 gain 189 192 -106.11 gain 192 189 -107.07 gain 189 193 -109.66 gain 193 189 -111.88 gain 189 194 -111.81 gain 194 189 -107.84 gain 189 195 -115.34 gain 195 189 -112.00 gain 189 196 -125.06 gain 196 189 -125.76 gain 189 197 -111.79 gain 197 189 -108.56 gain 189 198 -117.85 gain 198 189 -114.13 gain 189 199 -117.25 gain 199 189 -117.46 gain 189 200 -108.18 gain 200 189 -105.33 gain 189 201 -105.00 gain 201 189 -102.95 gain 189 202 -105.44 gain 202 189 -107.39 gain 189 203 -101.68 gain 203 189 -103.25 gain 189 204 -93.42 gain 204 189 -92.27 gain 189 205 -97.64 gain 205 189 -95.56 gain 189 206 -103.86 gain 206 189 -106.31 gain 189 207 -106.67 gain 207 189 -101.48 gain 189 208 -108.15 gain 208 189 -108.73 gain 189 209 -113.67 gain 209 189 -115.25 gain 189 210 -118.68 gain 210 189 -117.19 gain 189 211 -127.24 gain 211 189 -127.78 gain 189 212 -120.10 gain 212 189 -119.18 gain 189 213 -114.42 gain 213 189 -112.69 gain 189 214 -110.23 gain 214 189 -108.39 gain 189 215 -111.39 gain 215 189 -105.97 gain 189 216 -105.75 gain 216 189 -104.99 gain 189 217 -108.16 gain 217 189 -107.91 gain 189 218 -97.25 gain 218 189 -99.19 gain 189 219 -106.28 gain 219 189 -99.58 gain 189 220 -107.34 gain 220 189 -111.13 gain 189 221 -103.74 gain 221 189 -103.17 gain 189 222 -111.13 gain 222 189 -110.89 gain 189 223 -115.48 gain 223 189 -113.85 gain 189 224 -111.07 gain 224 189 -112.13 gain 190 191 -88.32 gain 191 190 -89.41 gain 190 192 -106.95 gain 192 190 -110.91 gain 190 193 -102.29 gain 193 190 -107.50 gain 190 194 -101.81 gain 194 190 -100.83 gain 190 195 -119.18 gain 195 190 -118.83 gain 190 196 -111.12 gain 196 190 -114.81 gain 190 197 -119.43 gain 197 190 -119.19 gain 190 198 -117.39 gain 198 190 -116.67 gain 190 199 -116.16 gain 199 190 -119.35 gain 190 200 -109.85 gain 200 190 -109.98 gain 190 201 -119.51 gain 201 190 -120.44 gain 190 202 -105.89 gain 202 190 -110.83 gain 190 203 -102.61 gain 203 190 -107.17 gain 190 204 -101.17 gain 204 190 -103.01 gain 190 205 -91.20 gain 205 190 -92.11 gain 190 206 -102.24 gain 206 190 -107.68 gain 190 207 -106.23 gain 207 190 -104.03 gain 190 208 -105.83 gain 208 190 -109.41 gain 190 209 -110.85 gain 209 190 -115.42 gain 190 210 -123.17 gain 210 190 -124.67 gain 190 211 -120.14 gain 211 190 -123.67 gain 190 212 -121.98 gain 212 190 -124.05 gain 190 213 -101.75 gain 213 190 -103.01 gain 190 214 -112.69 gain 214 190 -113.84 gain 190 215 -114.07 gain 215 190 -111.63 gain 190 216 -115.33 gain 216 190 -117.56 gain 190 217 -107.53 gain 217 190 -110.28 gain 190 218 -106.57 gain 218 190 -111.50 gain 190 219 -101.94 gain 219 190 -98.23 gain 190 220 -97.59 gain 220 190 -104.37 gain 190 221 -104.35 gain 221 190 -106.78 gain 190 222 -103.46 gain 222 190 -106.21 gain 190 223 -107.44 gain 223 190 -108.81 gain 190 224 -105.26 gain 224 190 -109.31 gain 191 192 -83.14 gain 192 191 -86.00 gain 191 193 -98.05 gain 193 191 -102.17 gain 191 194 -106.26 gain 194 191 -104.19 gain 191 195 -119.93 gain 195 191 -118.49 gain 191 196 -119.77 gain 196 191 -122.37 gain 191 197 -127.85 gain 197 191 -126.51 gain 191 198 -124.47 gain 198 191 -122.65 gain 191 199 -110.69 gain 199 191 -112.79 gain 191 200 -109.32 gain 200 191 -108.36 gain 191 201 -113.44 gain 201 191 -113.29 gain 191 202 -109.33 gain 202 191 -113.18 gain 191 203 -103.89 gain 203 191 -107.36 gain 191 204 -100.03 gain 204 191 -100.78 gain 191 205 -90.46 gain 205 191 -90.28 gain 191 206 -98.78 gain 206 191 -103.12 gain 191 207 -92.94 gain 207 191 -89.65 gain 191 208 -105.14 gain 208 191 -107.63 gain 191 209 -103.83 gain 209 191 -107.31 gain 191 210 -122.14 gain 210 191 -122.55 gain 191 211 -124.19 gain 211 191 -126.63 gain 191 212 -119.63 gain 212 191 -120.61 gain 191 213 -127.44 gain 213 191 -127.61 gain 191 214 -115.13 gain 214 191 -115.19 gain 191 215 -121.15 gain 215 191 -117.62 gain 191 216 -114.32 gain 216 191 -115.46 gain 191 217 -114.44 gain 217 191 -116.09 gain 191 218 -114.88 gain 218 191 -118.73 gain 191 219 -102.50 gain 219 191 -97.70 gain 191 220 -95.77 gain 220 191 -101.47 gain 191 221 -99.39 gain 221 191 -100.73 gain 191 222 -102.07 gain 222 191 -103.73 gain 191 223 -108.73 gain 223 191 -109.00 gain 191 224 -109.75 gain 224 191 -112.71 gain 192 193 -93.28 gain 193 192 -94.54 gain 192 194 -109.52 gain 194 192 -104.58 gain 192 195 -126.83 gain 195 192 -122.52 gain 192 196 -128.85 gain 196 192 -128.59 gain 192 197 -126.07 gain 197 192 -121.86 gain 192 198 -124.01 gain 198 192 -119.33 gain 192 199 -121.93 gain 199 192 -121.16 gain 192 200 -131.09 gain 200 192 -127.27 gain 192 201 -122.13 gain 201 192 -119.11 gain 192 202 -115.14 gain 202 192 -116.12 gain 192 203 -112.94 gain 203 192 -113.54 gain 192 204 -105.14 gain 204 192 -103.03 gain 192 205 -102.09 gain 205 192 -99.05 gain 192 206 -99.73 gain 206 192 -101.20 gain 192 207 -98.69 gain 207 192 -92.53 gain 192 208 -104.32 gain 208 192 -103.94 gain 192 209 -114.17 gain 209 192 -114.78 gain 192 210 -129.09 gain 210 192 -126.63 gain 192 211 -124.54 gain 211 192 -124.11 gain 192 212 -128.13 gain 212 192 -126.24 gain 192 213 -122.60 gain 213 192 -119.90 gain 192 214 -129.04 gain 214 192 -126.23 gain 192 215 -118.03 gain 215 192 -111.63 gain 192 216 -113.73 gain 216 192 -112.00 gain 192 217 -114.99 gain 217 192 -113.78 gain 192 218 -112.65 gain 218 192 -113.62 gain 192 219 -111.81 gain 219 192 -104.14 gain 192 220 -104.15 gain 220 192 -106.98 gain 192 221 -103.00 gain 221 192 -101.47 gain 192 222 -107.07 gain 222 192 -105.87 gain 192 223 -115.76 gain 223 192 -113.17 gain 192 224 -106.64 gain 224 192 -106.73 gain 193 194 -97.84 gain 194 193 -91.65 gain 193 195 -129.49 gain 195 193 -123.94 gain 193 196 -122.20 gain 196 193 -120.68 gain 193 197 -123.11 gain 197 193 -117.65 gain 193 198 -122.27 gain 198 193 -116.34 gain 193 199 -123.23 gain 199 193 -121.22 gain 193 200 -120.85 gain 200 193 -115.77 gain 193 201 -127.44 gain 201 193 -123.17 gain 193 202 -121.23 gain 202 193 -120.95 gain 193 203 -121.10 gain 203 193 -120.45 gain 193 204 -119.01 gain 204 193 -115.64 gain 193 205 -113.59 gain 205 193 -109.30 gain 193 206 -108.83 gain 206 193 -109.05 gain 193 207 -97.74 gain 207 193 -90.33 gain 193 208 -108.54 gain 208 193 -106.90 gain 193 209 -99.92 gain 209 193 -99.28 gain 193 210 -128.58 gain 210 193 -124.88 gain 193 211 -127.42 gain 211 193 -125.74 gain 193 212 -123.40 gain 212 193 -120.26 gain 193 213 -130.05 gain 213 193 -126.11 gain 193 214 -120.47 gain 214 193 -116.41 gain 193 215 -129.93 gain 215 193 -122.29 gain 193 216 -128.88 gain 216 193 -125.89 gain 193 217 -121.19 gain 217 193 -118.72 gain 193 218 -114.04 gain 218 193 -113.77 gain 193 219 -117.00 gain 219 193 -108.09 gain 193 220 -119.87 gain 220 193 -121.44 gain 193 221 -112.17 gain 221 193 -109.38 gain 193 222 -112.85 gain 222 193 -110.39 gain 193 223 -103.03 gain 223 193 -99.19 gain 193 224 -102.26 gain 224 193 -101.10 gain 194 195 -134.14 gain 195 194 -134.78 gain 194 196 -121.03 gain 196 194 -125.70 gain 194 197 -118.70 gain 197 194 -119.44 gain 194 198 -126.87 gain 198 194 -127.13 gain 194 199 -123.80 gain 199 194 -127.98 gain 194 200 -115.38 gain 200 194 -116.49 gain 194 201 -123.20 gain 201 194 -125.12 gain 194 202 -113.81 gain 202 194 -119.73 gain 194 203 -114.38 gain 203 194 -119.92 gain 194 204 -114.28 gain 204 194 -117.10 gain 194 205 -107.70 gain 205 194 -109.60 gain 194 206 -103.83 gain 206 194 -110.25 gain 194 207 -97.75 gain 207 194 -96.53 gain 194 208 -95.02 gain 208 194 -99.57 gain 194 209 -90.71 gain 209 194 -96.26 gain 194 210 -126.82 gain 210 194 -129.30 gain 194 211 -121.20 gain 211 194 -125.71 gain 194 212 -122.25 gain 212 194 -125.30 gain 194 213 -120.40 gain 213 194 -122.64 gain 194 214 -118.02 gain 214 194 -120.15 gain 194 215 -113.40 gain 215 194 -111.94 gain 194 216 -117.41 gain 216 194 -120.61 gain 194 217 -108.97 gain 217 194 -112.70 gain 194 218 -115.78 gain 218 194 -121.70 gain 194 219 -108.07 gain 219 194 -105.34 gain 194 220 -107.08 gain 220 194 -114.84 gain 194 221 -104.27 gain 221 194 -107.68 gain 194 222 -102.28 gain 222 194 -106.01 gain 194 223 -98.79 gain 223 194 -101.14 gain 194 224 -98.96 gain 224 194 -103.99 gain 195 196 -88.34 gain 196 195 -92.38 gain 195 197 -100.04 gain 197 195 -100.14 gain 195 198 -109.55 gain 198 195 -109.17 gain 195 199 -103.93 gain 199 195 -107.47 gain 195 200 -115.09 gain 200 195 -115.57 gain 195 201 -116.04 gain 201 195 -117.32 gain 195 202 -119.11 gain 202 195 -124.40 gain 195 203 -119.10 gain 203 195 -124.00 gain 195 204 -125.15 gain 204 195 -127.34 gain 195 205 -124.43 gain 205 195 -125.69 gain 195 206 -123.96 gain 206 195 -129.75 gain 195 207 -128.09 gain 207 195 -126.24 gain 195 208 -126.02 gain 208 195 -129.94 gain 195 209 -130.12 gain 209 195 -135.04 gain 195 210 -84.11 gain 210 195 -85.96 gain 195 211 -100.13 gain 211 195 -104.00 gain 195 212 -104.61 gain 212 195 -107.02 gain 195 213 -100.96 gain 213 195 -102.56 gain 195 214 -107.90 gain 214 195 -109.40 gain 195 215 -111.82 gain 215 195 -109.73 gain 195 216 -113.94 gain 216 195 -116.51 gain 195 217 -121.71 gain 217 195 -124.80 gain 195 218 -119.21 gain 218 195 -124.49 gain 195 219 -121.61 gain 219 195 -118.25 gain 195 220 -121.16 gain 220 195 -128.29 gain 195 221 -121.75 gain 221 195 -124.52 gain 195 222 -118.51 gain 222 195 -121.60 gain 195 223 -125.87 gain 223 195 -127.58 gain 195 224 -126.05 gain 224 195 -130.45 gain 196 197 -92.45 gain 197 196 -88.51 gain 196 198 -104.78 gain 198 196 -100.37 gain 196 199 -110.67 gain 199 196 -110.17 gain 196 200 -121.46 gain 200 196 -117.89 gain 196 201 -119.70 gain 201 196 -116.94 gain 196 202 -119.32 gain 202 196 -120.57 gain 196 203 -120.17 gain 203 196 -121.03 gain 196 204 -122.05 gain 204 196 -120.20 gain 196 205 -128.69 gain 205 196 -125.91 gain 196 206 -120.38 gain 206 196 -122.13 gain 196 207 -132.39 gain 207 196 -126.49 gain 196 208 -132.57 gain 208 196 -132.45 gain 196 209 -123.74 gain 209 196 -124.61 gain 196 210 -102.66 gain 210 196 -100.47 gain 196 211 -99.53 gain 211 196 -99.37 gain 196 212 -101.17 gain 212 196 -99.54 gain 196 213 -106.48 gain 213 196 -104.05 gain 196 214 -119.77 gain 214 196 -117.23 gain 196 215 -115.77 gain 215 196 -109.64 gain 196 216 -111.71 gain 216 196 -110.24 gain 196 217 -119.91 gain 217 196 -118.96 gain 196 218 -126.62 gain 218 196 -127.86 gain 196 219 -117.00 gain 219 196 -109.60 gain 196 220 -124.97 gain 220 196 -128.06 gain 196 221 -128.11 gain 221 196 -126.84 gain 196 222 -129.47 gain 222 196 -128.53 gain 196 223 -120.56 gain 223 196 -118.23 gain 196 224 -131.39 gain 224 196 -131.75 gain 197 198 -97.20 gain 198 197 -96.72 gain 197 199 -96.46 gain 199 197 -99.89 gain 197 200 -110.22 gain 200 197 -110.59 gain 197 201 -101.59 gain 201 197 -102.77 gain 197 202 -112.99 gain 202 197 -118.17 gain 197 203 -116.14 gain 203 197 -120.94 gain 197 204 -111.14 gain 204 197 -113.23 gain 197 205 -122.18 gain 205 197 -123.34 gain 197 206 -119.91 gain 206 197 -125.60 gain 197 207 -118.85 gain 207 197 -116.90 gain 197 208 -115.39 gain 208 197 -119.21 gain 197 209 -125.50 gain 209 197 -130.31 gain 197 210 -109.41 gain 210 197 -111.16 gain 197 211 -94.63 gain 211 197 -98.40 gain 197 212 -96.64 gain 212 197 -98.95 gain 197 213 -92.51 gain 213 197 -94.01 gain 197 214 -100.26 gain 214 197 -101.65 gain 197 215 -103.80 gain 215 197 -101.61 gain 197 216 -102.97 gain 216 197 -105.44 gain 197 217 -117.20 gain 217 197 -120.19 gain 197 218 -114.87 gain 218 197 -120.05 gain 197 219 -119.98 gain 219 197 -116.52 gain 197 220 -119.89 gain 220 197 -126.92 gain 197 221 -120.93 gain 221 197 -123.60 gain 197 222 -121.19 gain 222 197 -124.18 gain 197 223 -120.33 gain 223 197 -121.94 gain 197 224 -119.50 gain 224 197 -123.80 gain 198 199 -87.22 gain 199 198 -91.14 gain 198 200 -94.45 gain 200 198 -95.30 gain 198 201 -108.14 gain 201 198 -109.80 gain 198 202 -121.23 gain 202 198 -126.89 gain 198 203 -115.35 gain 203 198 -120.63 gain 198 204 -112.24 gain 204 198 -114.81 gain 198 205 -119.85 gain 205 198 -121.49 gain 198 206 -121.99 gain 206 198 -128.15 gain 198 207 -112.02 gain 207 198 -110.54 gain 198 208 -116.56 gain 208 198 -120.86 gain 198 209 -124.02 gain 209 198 -129.31 gain 198 210 -103.53 gain 210 198 -105.75 gain 198 211 -103.70 gain 211 198 -107.95 gain 198 212 -96.39 gain 212 198 -99.18 gain 198 213 -88.24 gain 213 198 -90.22 gain 198 214 -96.12 gain 214 198 -97.99 gain 198 215 -99.92 gain 215 198 -98.20 gain 198 216 -109.43 gain 216 198 -112.38 gain 198 217 -114.42 gain 217 198 -117.89 gain 198 218 -120.48 gain 218 198 -126.14 gain 198 219 -121.96 gain 219 198 -118.98 gain 198 220 -117.65 gain 220 198 -125.15 gain 198 221 -123.55 gain 221 198 -126.70 gain 198 222 -125.39 gain 222 198 -128.86 gain 198 223 -122.20 gain 223 198 -124.28 gain 198 224 -120.21 gain 224 198 -124.99 gain 199 200 -94.76 gain 200 199 -91.70 gain 199 201 -96.88 gain 201 199 -94.62 gain 199 202 -112.25 gain 202 199 -113.99 gain 199 203 -114.38 gain 203 199 -115.75 gain 199 204 -114.07 gain 204 199 -112.71 gain 199 205 -111.43 gain 205 199 -109.16 gain 199 206 -121.57 gain 206 199 -123.82 gain 199 207 -117.55 gain 207 199 -112.16 gain 199 208 -127.19 gain 208 199 -127.57 gain 199 209 -124.51 gain 209 199 -125.88 gain 199 210 -117.44 gain 210 199 -115.75 gain 199 211 -111.82 gain 211 199 -112.15 gain 199 212 -110.24 gain 212 199 -109.12 gain 199 213 -101.91 gain 213 199 -99.98 gain 199 214 -89.06 gain 214 199 -87.01 gain 199 215 -99.15 gain 215 199 -93.52 gain 199 216 -104.66 gain 216 199 -103.69 gain 199 217 -110.90 gain 217 199 -110.45 gain 199 218 -110.11 gain 218 199 -111.85 gain 199 219 -118.12 gain 219 199 -111.22 gain 199 220 -121.08 gain 220 199 -124.67 gain 199 221 -124.93 gain 221 199 -124.16 gain 199 222 -123.23 gain 222 199 -122.78 gain 199 223 -120.79 gain 223 199 -118.96 gain 199 224 -125.79 gain 224 199 -126.64 gain 200 201 -91.42 gain 201 200 -92.23 gain 200 202 -102.90 gain 202 200 -107.71 gain 200 203 -108.30 gain 203 200 -112.73 gain 200 204 -112.50 gain 204 200 -114.21 gain 200 205 -109.01 gain 205 200 -109.79 gain 200 206 -111.84 gain 206 200 -117.14 gain 200 207 -111.53 gain 207 200 -109.20 gain 200 208 -114.32 gain 208 200 -117.76 gain 200 209 -119.04 gain 209 200 -123.47 gain 200 210 -116.02 gain 210 200 -117.39 gain 200 211 -107.50 gain 211 200 -110.90 gain 200 212 -110.74 gain 212 200 -112.67 gain 200 213 -109.23 gain 213 200 -110.36 gain 200 214 -95.74 gain 214 200 -96.75 gain 200 215 -97.83 gain 215 200 -95.26 gain 200 216 -96.40 gain 216 200 -98.50 gain 200 217 -97.95 gain 217 200 -100.57 gain 200 218 -103.71 gain 218 200 -108.51 gain 200 219 -109.65 gain 219 200 -105.81 gain 200 220 -117.38 gain 220 200 -124.04 gain 200 221 -118.75 gain 221 200 -121.05 gain 200 222 -115.91 gain 222 200 -118.53 gain 200 223 -118.36 gain 223 200 -119.59 gain 200 224 -117.73 gain 224 200 -121.65 gain 201 202 -93.24 gain 202 201 -97.24 gain 201 203 -102.61 gain 203 201 -106.23 gain 201 204 -105.26 gain 204 201 -106.16 gain 201 205 -109.42 gain 205 201 -109.40 gain 201 206 -119.73 gain 206 201 -124.23 gain 201 207 -116.53 gain 207 201 -113.40 gain 201 208 -122.62 gain 208 201 -125.26 gain 201 209 -126.46 gain 209 201 -130.09 gain 201 210 -121.98 gain 210 201 -122.54 gain 201 211 -108.89 gain 211 201 -111.48 gain 201 212 -120.64 gain 212 201 -121.78 gain 201 213 -105.11 gain 213 201 -105.43 gain 201 214 -102.40 gain 214 201 -102.62 gain 201 215 -90.83 gain 215 201 -87.45 gain 201 216 -92.08 gain 216 201 -93.37 gain 201 217 -91.30 gain 217 201 -93.11 gain 201 218 -104.48 gain 218 201 -108.48 gain 201 219 -109.60 gain 219 201 -104.95 gain 201 220 -112.92 gain 220 201 -118.77 gain 201 221 -115.47 gain 221 201 -116.96 gain 201 222 -114.83 gain 222 201 -116.64 gain 201 223 -116.47 gain 223 201 -116.90 gain 201 224 -119.62 gain 224 201 -122.74 gain 202 203 -90.43 gain 203 202 -90.05 gain 202 204 -101.18 gain 204 202 -98.09 gain 202 205 -104.03 gain 205 202 -100.01 gain 202 206 -120.00 gain 206 202 -120.50 gain 202 207 -117.25 gain 207 202 -110.11 gain 202 208 -117.94 gain 208 202 -116.58 gain 202 209 -120.06 gain 209 202 -119.69 gain 202 210 -125.84 gain 210 202 -122.40 gain 202 211 -125.41 gain 211 202 -124.00 gain 202 212 -118.90 gain 212 202 -116.03 gain 202 213 -110.77 gain 213 202 -107.09 gain 202 214 -105.31 gain 214 202 -101.52 gain 202 215 -115.67 gain 215 202 -108.30 gain 202 216 -101.38 gain 216 202 -98.67 gain 202 217 -98.95 gain 217 202 -96.76 gain 202 218 -96.34 gain 218 202 -96.34 gain 202 219 -101.55 gain 219 202 -92.91 gain 202 220 -105.83 gain 220 202 -107.68 gain 202 221 -120.26 gain 221 202 -117.75 gain 202 222 -114.08 gain 222 202 -111.89 gain 202 223 -124.20 gain 223 202 -120.62 gain 202 224 -126.25 gain 224 202 -125.37 gain 203 204 -97.13 gain 204 203 -94.41 gain 203 205 -98.87 gain 205 203 -95.23 gain 203 206 -110.16 gain 206 203 -111.03 gain 203 207 -113.48 gain 207 203 -106.72 gain 203 208 -114.57 gain 208 203 -113.58 gain 203 209 -121.40 gain 209 203 -121.41 gain 203 210 -121.06 gain 210 203 -118.01 gain 203 211 -122.11 gain 211 203 -121.07 gain 203 212 -124.23 gain 212 203 -121.73 gain 203 213 -120.34 gain 213 203 -117.04 gain 203 214 -112.88 gain 214 203 -109.47 gain 203 215 -116.85 gain 215 203 -109.85 gain 203 216 -105.04 gain 216 203 -102.71 gain 203 217 -97.21 gain 217 203 -95.40 gain 203 218 -98.82 gain 218 203 -99.19 gain 203 219 -99.92 gain 219 203 -91.65 gain 203 220 -98.05 gain 220 203 -100.27 gain 203 221 -111.44 gain 221 203 -109.30 gain 203 222 -111.93 gain 222 203 -110.12 gain 203 223 -123.68 gain 223 203 -120.48 gain 203 224 -112.38 gain 224 203 -111.87 gain 204 205 -94.15 gain 205 204 -93.22 gain 204 206 -96.20 gain 206 204 -99.80 gain 204 207 -106.79 gain 207 204 -102.74 gain 204 208 -103.17 gain 208 204 -104.91 gain 204 209 -110.37 gain 209 204 -113.09 gain 204 210 -120.92 gain 210 204 -120.58 gain 204 211 -122.50 gain 211 204 -124.19 gain 204 212 -123.84 gain 212 204 -124.06 gain 204 213 -121.12 gain 213 204 -120.54 gain 204 214 -118.69 gain 214 204 -118.00 gain 204 215 -105.79 gain 215 204 -101.52 gain 204 216 -102.68 gain 216 204 -103.06 gain 204 217 -108.11 gain 217 204 -109.01 gain 204 218 -102.10 gain 218 204 -105.19 gain 204 219 -91.96 gain 219 204 -86.41 gain 204 220 -102.56 gain 220 204 -107.50 gain 204 221 -105.13 gain 221 204 -105.71 gain 204 222 -107.06 gain 222 204 -107.97 gain 204 223 -117.20 gain 223 204 -116.72 gain 204 224 -115.24 gain 224 204 -117.45 gain 205 206 -88.83 gain 206 205 -93.35 gain 205 207 -110.17 gain 207 205 -107.05 gain 205 208 -111.49 gain 208 205 -114.15 gain 205 209 -116.00 gain 209 205 -119.65 gain 205 210 -116.45 gain 210 205 -117.03 gain 205 211 -117.93 gain 211 205 -120.54 gain 205 212 -119.94 gain 212 205 -121.09 gain 205 213 -118.26 gain 213 205 -118.61 gain 205 214 -114.91 gain 214 205 -115.14 gain 205 215 -117.99 gain 215 205 -114.63 gain 205 216 -109.33 gain 216 205 -110.64 gain 205 217 -109.81 gain 217 205 -111.63 gain 205 218 -107.85 gain 218 205 -111.87 gain 205 219 -95.37 gain 219 205 -90.75 gain 205 220 -92.58 gain 220 205 -98.44 gain 205 221 -102.23 gain 221 205 -103.74 gain 205 222 -106.45 gain 222 205 -108.28 gain 205 223 -110.74 gain 223 205 -111.19 gain 205 224 -114.69 gain 224 205 -117.83 gain 206 207 -102.09 gain 207 206 -94.45 gain 206 208 -105.95 gain 208 206 -104.09 gain 206 209 -108.03 gain 209 206 -107.16 gain 206 210 -122.76 gain 210 206 -118.83 gain 206 211 -121.50 gain 211 206 -119.59 gain 206 212 -128.63 gain 212 206 -125.26 gain 206 213 -125.91 gain 213 206 -121.73 gain 206 214 -120.37 gain 214 206 -116.08 gain 206 215 -124.36 gain 215 206 -116.49 gain 206 216 -124.15 gain 216 206 -120.94 gain 206 217 -119.38 gain 217 206 -116.69 gain 206 218 -113.80 gain 218 206 -113.30 gain 206 219 -109.55 gain 219 206 -100.40 gain 206 220 -95.91 gain 220 206 -97.25 gain 206 221 -97.07 gain 221 206 -94.06 gain 206 222 -103.72 gain 222 206 -101.04 gain 206 223 -104.92 gain 223 206 -100.85 gain 206 224 -114.82 gain 224 206 -113.44 gain 207 208 -92.07 gain 208 207 -97.85 gain 207 209 -99.89 gain 209 207 -106.66 gain 207 210 -125.01 gain 210 207 -128.71 gain 207 211 -122.65 gain 211 207 -128.38 gain 207 212 -119.97 gain 212 207 -124.24 gain 207 213 -118.82 gain 213 207 -122.29 gain 207 214 -110.80 gain 214 207 -114.15 gain 207 215 -110.12 gain 215 207 -109.89 gain 207 216 -111.91 gain 216 207 -116.33 gain 207 217 -111.22 gain 217 207 -116.17 gain 207 218 -106.35 gain 218 207 -113.48 gain 207 219 -101.92 gain 219 207 -100.41 gain 207 220 -100.88 gain 220 207 -109.87 gain 207 221 -93.02 gain 221 207 -97.65 gain 207 222 -97.43 gain 222 207 -102.38 gain 207 223 -85.78 gain 223 207 -89.35 gain 207 224 -96.05 gain 224 207 -102.31 gain 208 209 -94.24 gain 209 208 -95.24 gain 208 210 -135.98 gain 210 208 -133.91 gain 208 211 -124.55 gain 211 208 -124.50 gain 208 212 -126.70 gain 212 208 -125.20 gain 208 213 -122.87 gain 213 208 -120.56 gain 208 214 -133.55 gain 214 208 -131.13 gain 208 215 -113.69 gain 215 208 -107.68 gain 208 216 -116.59 gain 216 208 -115.24 gain 208 217 -120.12 gain 217 208 -119.29 gain 208 218 -117.70 gain 218 208 -119.06 gain 208 219 -111.54 gain 219 208 -104.26 gain 208 220 -100.33 gain 220 208 -103.53 gain 208 221 -103.91 gain 221 208 -102.76 gain 208 222 -102.51 gain 222 208 -101.68 gain 208 223 -89.75 gain 223 208 -87.54 gain 208 224 -100.98 gain 224 208 -101.46 gain 209 210 -134.19 gain 210 209 -131.13 gain 209 211 -130.60 gain 211 209 -129.56 gain 209 212 -122.58 gain 212 209 -120.08 gain 209 213 -130.06 gain 213 209 -126.76 gain 209 214 -121.07 gain 214 209 -117.66 gain 209 215 -121.35 gain 215 209 -114.35 gain 209 216 -121.35 gain 216 209 -119.01 gain 209 217 -122.59 gain 217 209 -120.77 gain 209 218 -120.47 gain 218 209 -120.83 gain 209 219 -119.96 gain 219 209 -111.69 gain 209 220 -109.31 gain 220 209 -111.52 gain 209 221 -105.84 gain 221 209 -103.70 gain 209 222 -104.90 gain 222 209 -103.08 gain 209 223 -99.02 gain 223 209 -95.82 gain 209 224 -90.12 gain 224 209 -89.61 gain 210 211 -94.09 gain 211 210 -96.11 gain 210 212 -103.86 gain 212 210 -104.43 gain 210 213 -108.55 gain 213 210 -108.31 gain 210 214 -108.59 gain 214 210 -108.23 gain 210 215 -112.61 gain 215 210 -108.67 gain 210 216 -119.22 gain 216 210 -119.94 gain 210 217 -116.72 gain 217 210 -117.96 gain 210 218 -121.75 gain 218 210 -125.18 gain 210 219 -121.91 gain 219 210 -116.70 gain 210 220 -124.54 gain 220 210 -129.82 gain 210 221 -127.82 gain 221 210 -128.74 gain 210 222 -128.61 gain 222 210 -129.86 gain 210 223 -120.91 gain 223 210 -120.77 gain 210 224 -126.73 gain 224 210 -129.28 gain 211 212 -101.25 gain 212 211 -99.79 gain 211 213 -103.86 gain 213 211 -101.59 gain 211 214 -113.26 gain 214 211 -110.88 gain 211 215 -112.71 gain 215 211 -106.75 gain 211 216 -110.45 gain 216 211 -109.15 gain 211 217 -121.06 gain 217 211 -120.28 gain 211 218 -116.25 gain 218 211 -117.66 gain 211 219 -123.44 gain 219 211 -116.21 gain 211 220 -119.10 gain 220 211 -122.35 gain 211 221 -126.74 gain 221 211 -125.64 gain 211 222 -128.42 gain 222 211 -127.64 gain 211 223 -128.56 gain 223 211 -126.40 gain 211 224 -130.71 gain 224 211 -131.24 gain 212 213 -93.90 gain 213 212 -93.09 gain 212 214 -98.82 gain 214 212 -97.90 gain 212 215 -106.78 gain 215 212 -102.27 gain 212 216 -115.80 gain 216 212 -115.96 gain 212 217 -115.38 gain 217 212 -116.05 gain 212 218 -116.04 gain 218 212 -118.90 gain 212 219 -118.61 gain 219 212 -112.84 gain 212 220 -124.42 gain 220 212 -129.14 gain 212 221 -114.97 gain 221 212 -115.33 gain 212 222 -120.41 gain 222 212 -121.10 gain 212 223 -126.37 gain 223 212 -125.67 gain 212 224 -129.67 gain 224 212 -131.66 gain 213 214 -90.06 gain 214 213 -89.95 gain 213 215 -99.19 gain 215 213 -95.49 gain 213 216 -104.19 gain 216 213 -105.15 gain 213 217 -109.14 gain 217 213 -110.63 gain 213 218 -113.14 gain 218 213 -116.82 gain 213 219 -115.09 gain 219 213 -110.12 gain 213 220 -117.72 gain 220 213 -123.24 gain 213 221 -113.51 gain 221 213 -114.67 gain 213 222 -125.41 gain 222 213 -126.90 gain 213 223 -116.55 gain 223 213 -116.65 gain 213 224 -120.51 gain 224 213 -123.30 gain 214 215 -84.18 gain 215 214 -80.60 gain 214 216 -101.67 gain 216 214 -102.75 gain 214 217 -103.90 gain 217 214 -105.50 gain 214 218 -113.41 gain 218 214 -117.19 gain 214 219 -115.60 gain 219 214 -110.75 gain 214 220 -115.14 gain 220 214 -120.78 gain 214 221 -116.20 gain 221 214 -117.47 gain 214 222 -112.56 gain 222 214 -114.17 gain 214 223 -117.72 gain 223 214 -117.93 gain 214 224 -125.95 gain 224 214 -128.85 gain 215 216 -87.85 gain 216 215 -92.51 gain 215 217 -97.57 gain 217 215 -102.75 gain 215 218 -105.17 gain 218 215 -112.54 gain 215 219 -106.31 gain 219 215 -105.03 gain 215 220 -111.16 gain 220 215 -120.38 gain 215 221 -109.85 gain 221 215 -114.71 gain 215 222 -120.11 gain 222 215 -125.30 gain 215 223 -121.72 gain 223 215 -125.52 gain 215 224 -111.39 gain 224 215 -117.88 gain 216 217 -93.49 gain 217 216 -94.01 gain 216 218 -102.43 gain 218 216 -105.14 gain 216 219 -109.62 gain 219 216 -103.68 gain 216 220 -111.24 gain 220 216 -115.79 gain 216 221 -116.05 gain 221 216 -116.25 gain 216 222 -117.44 gain 222 216 -117.96 gain 216 223 -125.51 gain 223 216 -124.65 gain 216 224 -127.51 gain 224 216 -129.34 gain 217 218 -93.19 gain 218 217 -95.38 gain 217 219 -104.84 gain 219 217 -98.38 gain 217 220 -109.58 gain 220 217 -113.62 gain 217 221 -113.27 gain 221 217 -112.95 gain 217 222 -114.18 gain 222 217 -114.19 gain 217 223 -120.82 gain 223 217 -119.44 gain 217 224 -122.61 gain 224 217 -123.92 gain 218 219 -99.31 gain 219 218 -90.67 gain 218 220 -101.75 gain 220 218 -103.60 gain 218 221 -105.57 gain 221 218 -103.06 gain 218 222 -110.01 gain 222 218 -107.83 gain 218 223 -117.94 gain 223 218 -114.37 gain 218 224 -124.76 gain 224 218 -123.88 gain 219 220 -83.18 gain 220 219 -93.67 gain 219 221 -101.03 gain 221 219 -107.16 gain 219 222 -106.00 gain 222 219 -112.46 gain 219 223 -110.12 gain 223 219 -115.20 gain 219 224 -115.39 gain 224 219 -123.15 gain 220 221 -95.48 gain 221 220 -91.12 gain 220 222 -113.64 gain 222 220 -109.61 gain 220 223 -103.84 gain 223 220 -98.43 gain 220 224 -116.53 gain 224 220 -113.80 gain 221 222 -96.91 gain 222 221 -97.24 gain 221 223 -105.92 gain 223 221 -104.86 gain 221 224 -106.49 gain 224 221 -108.11 gain 222 223 -94.21 gain 223 222 -92.82 gain 222 224 -109.03 gain 224 222 -110.33 gain 223 224 -93.67 gain 224 223 -96.35 noise 0 -105.70 4.00 noise 1 -104.42 4.00 noise 2 -104.49 4.00 noise 3 -103.88 4.00 noise 4 -102.86 4.00 noise 5 -104.46 4.00 noise 6 -108.60 4.00 noise 7 -103.14 4.00 noise 8 -106.80 4.00 noise 9 -107.16 4.00 noise 10 -106.34 4.00 noise 11 -107.12 4.00 noise 12 -104.98 4.00 noise 13 -106.47 4.00 noise 14 -106.28 4.00 noise 15 -103.44 4.00 noise 16 -104.69 4.00 noise 17 -106.96 4.00 noise 18 -106.94 4.00 noise 19 -104.95 4.00 noise 20 -106.22 4.00 noise 21 -106.53 4.00 noise 22 -105.96 4.00 noise 23 -103.35 4.00 noise 24 -108.16 4.00 noise 25 -101.45 4.00 noise 26 -107.06 4.00 noise 27 -107.00 4.00 noise 28 -107.73 4.00 noise 29 -105.69 4.00 noise 30 -105.04 4.00 noise 31 -104.15 4.00 noise 32 -104.37 4.00 noise 33 -106.73 4.00 noise 34 -104.45 4.00 noise 35 -104.77 4.00 noise 36 -103.65 4.00 noise 37 -105.51 4.00 noise 38 -103.87 4.00 noise 39 -104.15 4.00 noise 40 -103.32 4.00 noise 41 -106.14 4.00 noise 42 -105.75 4.00 noise 43 -106.26 4.00 noise 44 -101.75 4.00 noise 45 -104.18 4.00 noise 46 -104.22 4.00 noise 47 -103.68 4.00 noise 48 -106.13 4.00 noise 49 -103.72 4.00 noise 50 -100.91 4.00 noise 51 -104.91 4.00 noise 52 -108.21 4.00 noise 53 -105.24 4.00 noise 54 -105.63 4.00 noise 55 -107.22 4.00 noise 56 -103.43 4.00 noise 57 -103.82 4.00 noise 58 -102.45 4.00 noise 59 -105.54 4.00 noise 60 -104.59 4.00 noise 61 -107.82 4.00 noise 62 -103.25 4.00 noise 63 -109.61 4.00 noise 64 -106.24 4.00 noise 65 -102.05 4.00 noise 66 -108.67 4.00 noise 67 -104.85 4.00 noise 68 -104.59 4.00 noise 69 -104.46 4.00 noise 70 -105.50 4.00 noise 71 -107.82 4.00 noise 72 -105.34 4.00 noise 73 -107.64 4.00 noise 74 -103.48 4.00 noise 75 -103.08 4.00 noise 76 -107.50 4.00 noise 77 -105.18 4.00 noise 78 -99.53 4.00 noise 79 -106.32 4.00 noise 80 -107.08 4.00 noise 81 -106.19 4.00 noise 82 -106.69 4.00 noise 83 -103.79 4.00 noise 84 -105.58 4.00 noise 85 -107.23 4.00 noise 86 -104.94 4.00 noise 87 -105.47 4.00 noise 88 -103.83 4.00 noise 89 -105.62 4.00 noise 90 -107.21 4.00 noise 91 -105.44 4.00 noise 92 -107.11 4.00 noise 93 -106.46 4.00 noise 94 -107.30 4.00 noise 95 -101.40 4.00 noise 96 -105.68 4.00 noise 97 -105.99 4.00 noise 98 -106.44 4.00 noise 99 -106.55 4.00 noise 100 -107.24 4.00 noise 101 -107.73 4.00 noise 102 -106.19 4.00 noise 103 -108.66 4.00 noise 104 -104.25 4.00 noise 105 -107.94 4.00 noise 106 -103.81 4.00 noise 107 -101.67 4.00 noise 108 -106.00 4.00 noise 109 -100.64 4.00 noise 110 -105.66 4.00 noise 111 -105.95 4.00 noise 112 -105.63 4.00 noise 113 -106.92 4.00 noise 114 -102.55 4.00 noise 115 -107.39 4.00 noise 116 -106.82 4.00 noise 117 -100.91 4.00 noise 118 -102.21 4.00 noise 119 -106.76 4.00 noise 120 -103.35 4.00 noise 121 -106.23 4.00 noise 122 -104.95 4.00 noise 123 -104.72 4.00 noise 124 -105.94 4.00 noise 125 -104.47 4.00 noise 126 -103.52 4.00 noise 127 -104.98 4.00 noise 128 -104.71 4.00 noise 129 -106.22 4.00 noise 130 -104.07 4.00 noise 131 -103.86 4.00 noise 132 -105.61 4.00 noise 133 -105.76 4.00 noise 134 -105.29 4.00 noise 135 -104.34 4.00 noise 136 -105.60 4.00 noise 137 -104.91 4.00 noise 138 -107.88 4.00 noise 139 -104.91 4.00 noise 140 -104.84 4.00 noise 141 -102.45 4.00 noise 142 -104.19 4.00 noise 143 -106.56 4.00 noise 144 -105.56 4.00 noise 145 -107.18 4.00 noise 146 -104.89 4.00 noise 147 -108.47 4.00 noise 148 -108.46 4.00 noise 149 -106.74 4.00 noise 150 -104.96 4.00 noise 151 -102.78 4.00 noise 152 -106.21 4.00 noise 153 -109.02 4.00 noise 154 -104.99 4.00 noise 155 -103.82 4.00 noise 156 -104.94 4.00 noise 157 -104.32 4.00 noise 158 -103.15 4.00 noise 159 -103.97 4.00 noise 160 -107.18 4.00 noise 161 -104.74 4.00 noise 162 -104.62 4.00 noise 163 -105.56 4.00 noise 164 -102.63 4.00 noise 165 -105.82 4.00 noise 166 -103.21 4.00 noise 167 -103.17 4.00 noise 168 -102.17 4.00 noise 169 -104.06 4.00 noise 170 -107.67 4.00 noise 171 -104.67 4.00 noise 172 -108.32 4.00 noise 173 -107.65 4.00 noise 174 -106.16 4.00 noise 175 -105.63 4.00 noise 176 -108.63 4.00 noise 177 -103.02 4.00 noise 178 -105.96 4.00 noise 179 -107.23 4.00 noise 180 -104.95 4.00 noise 181 -103.90 4.00 noise 182 -103.83 4.00 noise 183 -109.16 4.00 noise 184 -103.90 4.00 noise 185 -107.83 4.00 noise 186 -106.99 4.00 noise 187 -106.47 4.00 noise 188 -104.39 4.00 noise 189 -102.88 4.00 noise 190 -107.63 4.00 noise 191 -106.83 4.00 noise 192 -103.00 4.00 noise 193 -103.50 4.00 noise 194 -105.60 4.00 noise 195 -105.12 4.00 noise 196 -106.37 4.00 noise 197 -107.20 4.00 noise 198 -106.28 4.00 noise 199 -104.01 4.00 noise 200 -105.85 4.00 noise 201 -105.60 4.00 noise 202 -103.91 4.00 noise 203 -105.07 4.00 noise 204 -105.75 4.00 noise 205 -104.77 4.00 noise 206 -102.30 4.00 noise 207 -107.39 4.00 noise 208 -105.65 4.00 noise 209 -102.82 4.00 noise 210 -109.21 4.00 noise 211 -105.20 4.00 noise 212 -103.75 4.00 noise 213 -106.22 4.00 noise 214 -104.94 4.00 noise 215 -108.01 4.00 noise 216 -105.58 4.00 noise 217 -105.94 4.00 noise 218 -102.37 4.00 noise 219 -107.01 4.00 noise 220 -102.30 4.00 noise 221 -104.20 4.00 noise 222 -105.14 4.00 noise 223 -103.82 4.00 noise 224 -105.47 4.00 tinyos-2.1.2+dfsg/apps/tests/TestNetwork/special-topo.txt000066400000000000000000000007641207233610700235260ustar00rootroot00000000000000noise 0 -105 5 noise 1 -105 5 noise 2 -105 5 noise 3 -105 5 noise 4 -105 5 noise 5 -105 5 gain 0 1 -80 gain 1 0 -90 gain 0 2 -80 gain 2 0 -83 gain 2 3 -70 gain 3 2 -80 gain 1 3 -90 gain 3 1 -92 gain 4 3 -88 gain 3 4 -85 gain 5 3 -60 gain 3 5 -76 gain 0 3 -110 gain 3 0 -110 gain 0 4 -110 gain 4 0 -110 gain 0 5 -110 gain 5 0 -110 gain 5 1 -110 gain 1 5 -110 gain 4 1 -110 gain 1 4 -110 gain 2 1 -90 gain 1 2 -90 gain 5 2 -110 gain 2 5 -110 gain 4 2 -110 gain 2 4 -110 gain 5 4 -90 gain 4 5 -90 tinyos-2.1.2+dfsg/apps/tests/TestNetwork/test.py000066400000000000000000000025331207233610700217130ustar00rootroot00000000000000from TOSSIM import * from tinyos.tossim.TossimApp import * from random import * import sys #n = NescApp("TestNetwork", "app.xml") #t = Tossim(n.variables.variables()) t = Tossim([]) r = t.radio() f = open("sparse-grid.txt", "r") lines = f.readlines() for line in lines: s = line.split() if (len(s) > 0): if s[0] == "gain": r.add(int(s[1]), int(s[2]), float(s[3])) noise = open("meyer-short.txt", "r") lines = noise.readlines() for line in lines: str = line.strip() if (str != ""): val = int(str) for i in range(0, 10): m = t.getNode(i); m.addNoiseTraceReading(val) for i in range(0, 10): m = t.getNode(i); m.createNoiseModel(); time = randint(t.ticksPerSecond(), 10 * t.ticksPerSecond()) m.bootAtTime(time) print "Booting ", i, " at time ", time print "Starting simulation." #t.addChannel("AM", sys.stdout) #t.addChannel("TreeRouting", sys.stdout) #t.addChannel("TestNetworkC", sys.stdout) #t.addChannel("Route", sys.stdout) #t.addChannel("PointerBug", sys.stdout) #t.addChannel("QueueC", sys.stdout) #t.addChannel("Gain", sys.stdout) t.addChannel("Forwarder", sys.stdout) t.addChannel("TestNetworkC", sys.stdout) #t.addChannel("App", sys.stdout) #t.addChannel("Traffic", sys.stdout) #t.addChannel("Acks", sys.stdout) while (t.time() < 1000 * t.ticksPerSecond()): t.runNextEvent() print "Completed simulation." tinyos-2.1.2+dfsg/apps/tests/TestNetwork/tn-injector.c000066400000000000000000000026461207233610700227670ustar00rootroot00000000000000#include #include #include #include "sfsource.h" #include "serialpacket.h" #include "test_network_msg.h" #include "set_rate_msg.h" #include "TestNetworkC.h" int main(int argc, char **argv) { int fd,i; if (argc != 5) { fprintf(stderr, "Usage: %s - change sample rate (ms/sample)\n", argv[0]); exit(2); } fd = open_sf_source(argv[1], atoi(argv[2])); if (fd < 0) { fprintf(stderr, "Couldn't open serial forwarder at %s:%s\n", argv[1], argv[2]); exit(1); } uint8_t len = DISSEMINATION_MESSAGE_SIZE + SPACKET_SIZE + sizeof(uint16_t); void* storage = malloc(len); tmsg_t* serialMsg = new_tmsg(storage, len); void* payload = storage + (spacket_data_offsetbits(0) / 8); tmsg_t* dataMsg = new_tmsg(payload, DISSEMINATION_MESSAGE_SIZE + sizeof(uint16_t)); void* data = payload + (dissemination_message_data_offsetbits(0) / 8); spacket_header_type_set(serialMsg, DISSEMINATION_MESSAGE_AM_TYPE); spacket_header_length_set(serialMsg, DISSEMINATION_MESSAGE_SIZE + sizeof(uint16_t)); dissemination_message_key_set(dataMsg, SAMPLE_RATE_KEY); dissemination_message_seqno_set(dataMsg, atoi(argv[3])); uint16_t* rate = (uint16_t*)data; *rate = (uint16_t)atoi(argv[4]); printf("Writing packet:\n "); for (i = 0; i < len; i++) { printf("%0.2x ", ((uint8_t*)storage)[i]); } printf("\n"); write_sf_packet(fd,storage,len); } tinyos-2.1.2+dfsg/apps/tests/TestNetwork/tn-listener.c000066400000000000000000000023071207233610700227710ustar00rootroot00000000000000#include #include #include #include "sfsource.h" #include "serialpacket.h" #include "test_network_msg.h" #include "collection_msg.h" #include "set_rate_msg.h" #include "TestNetworkC.h" int main(int argc, char **argv) { int fd,i; if (argc != 3) { fprintf(stderr, "Usage: %s - print received packets\n", argv[0]); exit(2); } fd = open_sf_source(argv[1], atoi(argv[2])); if (fd < 0) { fprintf(stderr, "Couldn't open serial forwarder at %s:%s\n", argv[1], argv[2]); exit(1); } for (;;) { int len, i; const unsigned char *packet = read_sf_packet(fd, &len); char* myPacket = (char*)malloc(len); memcpy(myPacket, packet, len); free((void*)packet); if (!packet) exit(0); else { tmsg_t* serialMsg = new_tmsg(myPacket, len); void* payload = (void*)myPacket + (spacket_data_offsetbits(0) / 8); tmsg_t* dataMsg = new_tmsg(payload, len - SPACKET_SIZE); void* data = payload + (dissemination_message_data_offsetbits(0) / 8); for (i = 0; i < len; i++) printf("%02x ", packet[i]); putchar('\n'); fflush(stdout); free((void *)myPacket); } } } tinyos-2.1.2+dfsg/apps/tests/TestNetwork/topo.txt000066400000000000000000036230511207233610700221130ustar00rootroot00000000000000gain 0 1 -70.06 gain 1 0 -71.36 gain 0 2 -82.89 gain 2 0 -84.00 gain 0 3 -83.00 gain 3 0 -78.45 gain 0 4 -96.02 gain 4 0 -92.74 gain 0 5 -97.77 gain 5 0 -94.42 gain 0 6 -98.31 gain 6 0 -97.76 gain 0 7 -100.26 gain 7 0 -98.81 gain 0 8 -102.08 gain 8 0 -99.28 gain 0 9 -109.70 gain 9 0 -109.09 gain 0 10 -108.84 gain 10 0 -106.68 gain 0 11 -96.82 gain 11 0 -94.11 gain 0 12 -110.53 gain 12 0 -104.88 gain 0 13 -109.67 gain 13 0 -107.03 gain 0 14 -107.54 gain 14 0 -104.38 gain 0 15 -76.93 gain 15 0 -76.50 gain 0 16 -73.76 gain 16 0 -68.76 gain 0 17 -88.89 gain 17 0 -89.43 gain 0 18 -93.02 gain 18 0 -87.60 gain 0 19 -97.29 gain 19 0 -100.16 gain 0 20 -97.71 gain 20 0 -96.75 gain 0 21 -99.83 gain 21 0 -98.67 gain 0 22 -105.55 gain 22 0 -102.73 gain 0 23 -96.99 gain 23 0 -96.61 gain 0 24 -107.49 gain 24 0 -105.02 gain 0 25 -107.81 gain 25 0 -106.32 gain 0 26 -108.43 gain 26 0 -107.40 gain 0 27 -104.34 gain 27 0 -102.66 gain 0 28 -117.72 gain 28 0 -117.98 gain 0 29 -107.91 gain 29 0 -99.81 gain 0 30 -87.26 gain 30 0 -90.85 gain 0 31 -83.94 gain 31 0 -84.60 gain 0 32 -88.27 gain 32 0 -84.07 gain 0 33 -98.93 gain 33 0 -93.51 gain 0 34 -102.22 gain 34 0 -103.78 gain 0 35 -103.39 gain 35 0 -102.87 gain 0 36 -101.84 gain 36 0 -100.14 gain 0 37 -100.16 gain 37 0 -97.85 gain 0 38 -108.44 gain 38 0 -107.34 gain 0 39 -111.31 gain 39 0 -107.67 gain 0 40 -109.19 gain 40 0 -107.62 gain 0 41 -110.87 gain 41 0 -108.93 gain 0 42 -108.43 gain 42 0 -109.51 gain 0 43 -112.87 gain 43 0 -114.47 gain 0 44 -111.66 gain 44 0 -111.26 gain 0 45 -84.41 gain 45 0 -80.04 gain 0 46 -100.37 gain 46 0 -98.86 gain 0 47 -94.01 gain 47 0 -94.35 gain 0 48 -95.21 gain 48 0 -92.56 gain 0 49 -97.60 gain 49 0 -91.59 gain 0 50 -97.21 gain 50 0 -93.09 gain 0 51 -106.12 gain 51 0 -103.79 gain 0 52 -100.64 gain 52 0 -94.74 gain 0 53 -102.57 gain 53 0 -101.16 gain 0 54 -109.37 gain 54 0 -104.47 gain 0 55 -103.41 gain 55 0 -101.64 gain 0 56 -106.70 gain 56 0 -108.02 gain 0 57 -116.34 gain 57 0 -119.70 gain 0 58 -109.82 gain 58 0 -112.74 gain 0 59 -120.43 gain 59 0 -121.51 gain 0 60 -92.17 gain 60 0 -91.66 gain 0 61 -100.39 gain 61 0 -92.76 gain 0 62 -94.42 gain 62 0 -89.58 gain 0 63 -89.32 gain 63 0 -83.49 gain 0 64 -100.50 gain 64 0 -99.06 gain 0 65 -99.51 gain 65 0 -98.12 gain 0 66 -108.56 gain 66 0 -106.47 gain 0 67 -103.14 gain 67 0 -101.17 gain 0 68 -108.43 gain 68 0 -106.42 gain 0 69 -113.42 gain 69 0 -109.66 gain 0 70 -105.70 gain 70 0 -104.65 gain 0 71 -104.30 gain 71 0 -104.00 gain 0 72 -111.77 gain 72 0 -113.32 gain 0 73 -108.60 gain 73 0 -107.21 gain 0 74 -120.64 gain 74 0 -115.24 gain 0 75 -95.81 gain 75 0 -90.79 gain 0 76 -101.54 gain 76 0 -99.02 gain 0 77 -103.77 gain 77 0 -99.55 gain 0 78 -95.77 gain 78 0 -100.18 gain 0 79 -94.45 gain 79 0 -93.40 gain 0 80 -109.77 gain 80 0 -107.06 gain 0 81 -108.87 gain 81 0 -110.43 gain 0 82 -100.81 gain 82 0 -101.53 gain 0 83 -111.63 gain 83 0 -111.93 gain 0 84 -106.26 gain 84 0 -103.63 gain 0 85 -107.02 gain 85 0 -108.97 gain 0 86 -109.51 gain 86 0 -104.64 gain 0 87 -111.08 gain 87 0 -109.02 gain 0 88 -113.56 gain 88 0 -111.78 gain 0 89 -117.35 gain 89 0 -116.21 gain 0 90 -99.73 gain 90 0 -102.12 gain 0 91 -104.98 gain 91 0 -102.95 gain 0 92 -103.38 gain 92 0 -104.93 gain 0 93 -103.29 gain 93 0 -98.75 gain 0 94 -96.83 gain 94 0 -94.73 gain 0 95 -105.24 gain 95 0 -106.17 gain 0 96 -103.17 gain 96 0 -100.37 gain 0 97 -100.52 gain 97 0 -99.00 gain 0 98 -108.75 gain 98 0 -104.41 gain 0 99 -107.38 gain 99 0 -107.13 gain 0 100 -106.16 gain 100 0 -103.75 gain 0 101 -114.96 gain 101 0 -111.22 gain 0 102 -111.34 gain 102 0 -108.26 gain 0 103 -112.80 gain 103 0 -108.94 gain 0 104 -111.12 gain 104 0 -103.69 gain 0 105 -100.41 gain 105 0 -98.39 gain 0 106 -104.09 gain 106 0 -101.37 gain 0 107 -102.86 gain 107 0 -103.16 gain 0 108 -104.39 gain 108 0 -102.75 gain 0 109 -105.75 gain 109 0 -100.95 gain 0 110 -113.33 gain 110 0 -110.77 gain 0 111 -104.80 gain 111 0 -99.44 gain 0 112 -103.72 gain 112 0 -100.37 gain 0 113 -107.79 gain 113 0 -111.37 gain 0 114 -113.46 gain 114 0 -112.67 gain 0 115 -104.24 gain 115 0 -104.31 gain 0 116 -108.73 gain 116 0 -104.82 gain 0 117 -116.56 gain 117 0 -112.50 gain 0 118 -113.19 gain 118 0 -117.30 gain 0 119 -105.86 gain 119 0 -101.52 gain 0 120 -106.86 gain 120 0 -102.62 gain 0 121 -111.80 gain 121 0 -110.31 gain 0 122 -112.47 gain 122 0 -113.55 gain 0 123 -102.75 gain 123 0 -104.09 gain 0 124 -105.36 gain 124 0 -100.30 gain 0 125 -106.23 gain 125 0 -103.10 gain 0 126 -108.96 gain 126 0 -110.72 gain 0 127 -107.75 gain 127 0 -104.26 gain 0 128 -110.34 gain 128 0 -109.91 gain 0 129 -104.94 gain 129 0 -101.72 gain 0 130 -116.92 gain 130 0 -115.88 gain 0 131 -115.22 gain 131 0 -112.54 gain 0 132 -113.15 gain 132 0 -106.75 gain 0 133 -107.90 gain 133 0 -105.92 gain 0 134 -112.18 gain 134 0 -108.20 gain 0 135 -98.54 gain 135 0 -90.15 gain 0 136 -97.12 gain 136 0 -97.51 gain 0 137 -109.42 gain 137 0 -106.46 gain 0 138 -103.80 gain 138 0 -102.86 gain 0 139 -113.86 gain 139 0 -114.62 gain 0 140 -108.89 gain 140 0 -109.46 gain 0 141 -110.69 gain 141 0 -106.95 gain 0 142 -108.60 gain 142 0 -106.01 gain 0 143 -108.17 gain 143 0 -108.03 gain 0 144 -106.97 gain 144 0 -102.74 gain 0 145 -111.20 gain 145 0 -111.51 gain 0 146 -111.44 gain 146 0 -108.20 gain 0 147 -112.79 gain 147 0 -110.74 gain 0 148 -108.81 gain 148 0 -107.29 gain 0 149 -114.73 gain 149 0 -109.57 gain 0 150 -107.48 gain 150 0 -105.71 gain 0 151 -103.84 gain 151 0 -104.54 gain 0 152 -107.42 gain 152 0 -106.49 gain 0 153 -106.99 gain 153 0 -105.76 gain 0 154 -109.28 gain 154 0 -109.18 gain 0 155 -102.99 gain 155 0 -100.19 gain 0 156 -115.15 gain 156 0 -113.47 gain 0 157 -108.01 gain 157 0 -107.63 gain 0 158 -107.58 gain 158 0 -109.17 gain 0 159 -110.57 gain 159 0 -106.19 gain 0 160 -106.21 gain 160 0 -103.21 gain 0 161 -116.15 gain 161 0 -114.21 gain 0 162 -116.18 gain 162 0 -113.86 gain 0 163 -110.10 gain 163 0 -105.20 gain 0 164 -116.69 gain 164 0 -119.02 gain 0 165 -108.95 gain 165 0 -108.63 gain 0 166 -114.06 gain 166 0 -115.40 gain 0 167 -111.85 gain 167 0 -112.02 gain 0 168 -116.28 gain 168 0 -115.51 gain 0 169 -110.20 gain 169 0 -105.95 gain 0 170 -106.15 gain 170 0 -102.83 gain 0 171 -111.34 gain 171 0 -108.60 gain 0 172 -108.08 gain 172 0 -108.14 gain 0 173 -112.46 gain 173 0 -106.84 gain 0 174 -109.75 gain 174 0 -110.08 gain 0 175 -112.22 gain 175 0 -104.35 gain 0 176 -113.50 gain 176 0 -109.85 gain 0 177 -118.27 gain 177 0 -116.99 gain 0 178 -107.31 gain 178 0 -103.63 gain 0 179 -119.46 gain 179 0 -118.82 gain 0 180 -111.15 gain 180 0 -109.25 gain 0 181 -106.37 gain 181 0 -107.88 gain 0 182 -108.97 gain 182 0 -106.60 gain 0 183 -108.37 gain 183 0 -101.89 gain 0 184 -109.91 gain 184 0 -109.65 gain 0 185 -108.91 gain 185 0 -107.16 gain 0 186 -115.75 gain 186 0 -114.70 gain 0 187 -110.38 gain 187 0 -109.35 gain 0 188 -107.11 gain 188 0 -110.53 gain 0 189 -107.68 gain 189 0 -107.16 gain 0 190 -112.06 gain 190 0 -104.36 gain 0 191 -114.22 gain 191 0 -109.70 gain 0 192 -117.92 gain 192 0 -117.07 gain 0 193 -115.16 gain 193 0 -110.33 gain 0 194 -116.79 gain 194 0 -111.85 gain 0 195 -114.38 gain 195 0 -107.41 gain 0 196 -109.03 gain 196 0 -109.73 gain 0 197 -114.88 gain 197 0 -113.07 gain 0 198 -103.59 gain 198 0 -104.43 gain 0 199 -106.78 gain 199 0 -101.63 gain 0 200 -105.41 gain 200 0 -102.18 gain 0 201 -108.98 gain 201 0 -108.84 gain 0 202 -113.33 gain 202 0 -111.49 gain 0 203 -103.40 gain 203 0 -101.66 gain 0 204 -114.06 gain 204 0 -110.53 gain 0 205 -119.81 gain 205 0 -115.96 gain 0 206 -115.77 gain 206 0 -113.23 gain 0 207 -95.97 gain 207 0 -91.18 gain 0 208 -115.44 gain 208 0 -113.95 gain 0 209 -113.70 gain 209 0 -111.25 gain 0 210 -113.77 gain 210 0 -115.32 gain 0 211 -114.78 gain 211 0 -113.72 gain 0 212 -111.38 gain 212 0 -108.87 gain 0 213 -108.51 gain 213 0 -108.74 gain 0 214 -105.31 gain 214 0 -103.72 gain 0 215 -112.29 gain 215 0 -112.52 gain 0 216 -112.60 gain 216 0 -109.72 gain 0 217 -118.83 gain 217 0 -120.40 gain 0 218 -113.36 gain 218 0 -116.24 gain 0 219 -113.00 gain 219 0 -113.46 gain 0 220 -110.57 gain 220 0 -108.15 gain 0 221 -117.39 gain 221 0 -115.95 gain 0 222 -118.68 gain 222 0 -113.83 gain 0 223 -115.04 gain 223 0 -112.47 gain 0 224 -117.02 gain 224 0 -111.39 gain 1 2 -76.97 gain 2 1 -76.79 gain 1 3 -88.65 gain 3 1 -82.80 gain 1 4 -97.52 gain 4 1 -92.94 gain 1 5 -94.43 gain 5 1 -89.78 gain 1 6 -101.69 gain 6 1 -99.84 gain 1 7 -103.97 gain 7 1 -101.22 gain 1 8 -102.79 gain 8 1 -98.68 gain 1 9 -108.21 gain 9 1 -106.30 gain 1 10 -106.79 gain 10 1 -103.34 gain 1 11 -107.89 gain 11 1 -103.89 gain 1 12 -107.30 gain 12 1 -100.36 gain 1 13 -114.03 gain 13 1 -110.10 gain 1 14 -107.78 gain 14 1 -103.32 gain 1 15 -92.27 gain 15 1 -90.55 gain 1 16 -65.70 gain 16 1 -59.41 gain 1 17 -81.59 gain 17 1 -80.83 gain 1 18 -79.47 gain 18 1 -72.77 gain 1 19 -89.52 gain 19 1 -91.10 gain 1 20 -99.11 gain 20 1 -96.86 gain 1 21 -103.47 gain 21 1 -101.01 gain 1 22 -99.25 gain 22 1 -95.14 gain 1 23 -104.28 gain 23 1 -102.61 gain 1 24 -103.98 gain 24 1 -100.21 gain 1 25 -107.81 gain 25 1 -105.03 gain 1 26 -104.07 gain 26 1 -101.75 gain 1 27 -110.38 gain 27 1 -107.40 gain 1 28 -111.37 gain 28 1 -110.34 gain 1 29 -117.72 gain 29 1 -108.32 gain 1 30 -96.77 gain 30 1 -99.06 gain 1 31 -87.99 gain 31 1 -87.37 gain 1 32 -90.14 gain 32 1 -84.65 gain 1 33 -97.87 gain 33 1 -91.15 gain 1 34 -96.58 gain 34 1 -96.85 gain 1 35 -99.70 gain 35 1 -97.89 gain 1 36 -97.96 gain 36 1 -94.96 gain 1 37 -108.70 gain 37 1 -105.10 gain 1 38 -101.99 gain 38 1 -99.59 gain 1 39 -104.99 gain 39 1 -100.06 gain 1 40 -109.79 gain 40 1 -106.92 gain 1 41 -100.75 gain 41 1 -97.52 gain 1 42 -111.27 gain 42 1 -111.06 gain 1 43 -106.37 gain 43 1 -106.68 gain 1 44 -113.50 gain 44 1 -111.81 gain 1 45 -96.20 gain 45 1 -90.52 gain 1 46 -90.90 gain 46 1 -88.10 gain 1 47 -96.19 gain 47 1 -95.24 gain 1 48 -99.24 gain 48 1 -95.29 gain 1 49 -97.34 gain 49 1 -90.03 gain 1 50 -104.29 gain 50 1 -98.88 gain 1 51 -105.24 gain 51 1 -101.61 gain 1 52 -105.57 gain 52 1 -98.37 gain 1 53 -99.54 gain 53 1 -96.83 gain 1 54 -108.69 gain 54 1 -102.50 gain 1 55 -106.97 gain 55 1 -103.91 gain 1 56 -104.12 gain 56 1 -104.15 gain 1 57 -110.65 gain 57 1 -112.72 gain 1 58 -110.97 gain 58 1 -112.59 gain 1 59 -115.39 gain 59 1 -115.17 gain 1 60 -103.86 gain 60 1 -102.05 gain 1 61 -91.93 gain 61 1 -83.01 gain 1 62 -101.05 gain 62 1 -94.92 gain 1 63 -92.10 gain 63 1 -84.99 gain 1 64 -101.93 gain 64 1 -99.20 gain 1 65 -101.17 gain 65 1 -98.48 gain 1 66 -102.83 gain 66 1 -99.45 gain 1 67 -103.33 gain 67 1 -100.07 gain 1 68 -104.92 gain 68 1 -101.61 gain 1 69 -109.41 gain 69 1 -104.37 gain 1 70 -108.01 gain 70 1 -105.66 gain 1 71 -108.35 gain 71 1 -106.76 gain 1 72 -112.59 gain 72 1 -112.85 gain 1 73 -116.65 gain 73 1 -113.96 gain 1 74 -113.47 gain 74 1 -106.78 gain 1 75 -104.87 gain 75 1 -98.56 gain 1 76 -95.51 gain 76 1 -91.69 gain 1 77 -102.04 gain 77 1 -96.52 gain 1 78 -95.52 gain 78 1 -98.64 gain 1 79 -107.28 gain 79 1 -104.94 gain 1 80 -104.20 gain 80 1 -100.19 gain 1 81 -109.73 gain 81 1 -110.00 gain 1 82 -103.00 gain 82 1 -102.42 gain 1 83 -102.08 gain 83 1 -101.08 gain 1 84 -109.62 gain 84 1 -105.70 gain 1 85 -109.40 gain 85 1 -110.06 gain 1 86 -117.96 gain 86 1 -111.80 gain 1 87 -107.01 gain 87 1 -103.66 gain 1 88 -108.13 gain 88 1 -105.06 gain 1 89 -120.86 gain 89 1 -118.42 gain 1 90 -103.03 gain 90 1 -104.12 gain 1 91 -101.63 gain 91 1 -98.31 gain 1 92 -101.81 gain 92 1 -102.07 gain 1 93 -104.71 gain 93 1 -98.87 gain 1 94 -94.82 gain 94 1 -91.42 gain 1 95 -107.22 gain 95 1 -106.86 gain 1 96 -110.66 gain 96 1 -106.57 gain 1 97 -110.85 gain 97 1 -108.04 gain 1 98 -111.45 gain 98 1 -105.82 gain 1 99 -108.28 gain 99 1 -106.74 gain 1 100 -110.09 gain 100 1 -106.38 gain 1 101 -112.79 gain 101 1 -107.75 gain 1 102 -114.67 gain 102 1 -110.29 gain 1 103 -116.09 gain 103 1 -110.95 gain 1 104 -116.01 gain 104 1 -107.29 gain 1 105 -96.39 gain 105 1 -93.07 gain 1 106 -104.05 gain 106 1 -100.04 gain 1 107 -102.73 gain 107 1 -101.73 gain 1 108 -104.15 gain 108 1 -101.22 gain 1 109 -113.45 gain 109 1 -107.36 gain 1 110 -110.70 gain 110 1 -106.85 gain 1 111 -107.62 gain 111 1 -100.96 gain 1 112 -112.12 gain 112 1 -107.47 gain 1 113 -115.13 gain 113 1 -117.41 gain 1 114 -107.64 gain 114 1 -105.56 gain 1 115 -106.83 gain 115 1 -105.60 gain 1 116 -112.61 gain 116 1 -107.41 gain 1 117 -119.74 gain 117 1 -114.39 gain 1 118 -117.68 gain 118 1 -120.50 gain 1 119 -112.97 gain 119 1 -107.33 gain 1 120 -101.22 gain 120 1 -95.69 gain 1 121 -104.09 gain 121 1 -101.31 gain 1 122 -104.64 gain 122 1 -104.43 gain 1 123 -112.25 gain 123 1 -112.30 gain 1 124 -99.91 gain 124 1 -93.55 gain 1 125 -100.49 gain 125 1 -96.07 gain 1 126 -115.33 gain 126 1 -115.79 gain 1 127 -111.23 gain 127 1 -106.44 gain 1 128 -111.52 gain 128 1 -109.79 gain 1 129 -108.63 gain 129 1 -104.11 gain 1 130 -113.58 gain 130 1 -111.25 gain 1 131 -110.83 gain 131 1 -106.86 gain 1 132 -111.50 gain 132 1 -103.80 gain 1 133 -106.99 gain 133 1 -103.72 gain 1 134 -115.12 gain 134 1 -109.85 gain 1 135 -115.08 gain 135 1 -105.39 gain 1 136 -110.72 gain 136 1 -109.80 gain 1 137 -104.33 gain 137 1 -100.08 gain 1 138 -110.77 gain 138 1 -108.54 gain 1 139 -110.79 gain 139 1 -110.26 gain 1 140 -108.62 gain 140 1 -107.89 gain 1 141 -109.36 gain 141 1 -104.32 gain 1 142 -111.72 gain 142 1 -107.84 gain 1 143 -115.95 gain 143 1 -114.51 gain 1 144 -111.50 gain 144 1 -105.97 gain 1 145 -109.78 gain 145 1 -108.80 gain 1 146 -103.46 gain 146 1 -98.92 gain 1 147 -117.65 gain 147 1 -114.31 gain 1 148 -114.28 gain 148 1 -111.46 gain 1 149 -115.68 gain 149 1 -109.23 gain 1 150 -103.55 gain 150 1 -100.49 gain 1 151 -108.99 gain 151 1 -108.41 gain 1 152 -107.55 gain 152 1 -105.33 gain 1 153 -111.50 gain 153 1 -108.97 gain 1 154 -111.89 gain 154 1 -110.50 gain 1 155 -104.43 gain 155 1 -100.33 gain 1 156 -110.45 gain 156 1 -107.48 gain 1 157 -115.67 gain 157 1 -114.00 gain 1 158 -111.30 gain 158 1 -111.59 gain 1 159 -109.65 gain 159 1 -103.98 gain 1 160 -115.13 gain 160 1 -110.84 gain 1 161 -107.89 gain 161 1 -104.65 gain 1 162 -110.14 gain 162 1 -106.53 gain 1 163 -111.78 gain 163 1 -105.59 gain 1 164 -112.25 gain 164 1 -113.28 gain 1 165 -114.01 gain 165 1 -112.40 gain 1 166 -117.29 gain 166 1 -117.34 gain 1 167 -106.65 gain 167 1 -105.52 gain 1 168 -111.55 gain 168 1 -109.48 gain 1 169 -107.50 gain 169 1 -101.95 gain 1 170 -103.63 gain 170 1 -99.03 gain 1 171 -111.73 gain 171 1 -107.70 gain 1 172 -110.09 gain 172 1 -108.85 gain 1 173 -119.26 gain 173 1 -112.35 gain 1 174 -111.70 gain 174 1 -110.74 gain 1 175 -107.56 gain 175 1 -98.39 gain 1 176 -113.03 gain 176 1 -108.09 gain 1 177 -115.72 gain 177 1 -113.14 gain 1 178 -114.23 gain 178 1 -109.25 gain 1 179 -118.00 gain 179 1 -116.07 gain 1 180 -105.38 gain 180 1 -102.19 gain 1 181 -114.00 gain 181 1 -114.20 gain 1 182 -109.59 gain 182 1 -105.93 gain 1 183 -110.64 gain 183 1 -102.87 gain 1 184 -104.30 gain 184 1 -102.75 gain 1 185 -109.71 gain 185 1 -106.66 gain 1 186 -102.33 gain 186 1 -99.99 gain 1 187 -115.07 gain 187 1 -112.75 gain 1 188 -117.38 gain 188 1 -119.50 gain 1 189 -112.92 gain 189 1 -111.10 gain 1 190 -119.26 gain 190 1 -110.27 gain 1 191 -114.24 gain 191 1 -108.43 gain 1 192 -118.39 gain 192 1 -116.25 gain 1 193 -119.40 gain 193 1 -113.28 gain 1 194 -119.01 gain 194 1 -112.78 gain 1 195 -111.80 gain 195 1 -103.54 gain 1 196 -116.56 gain 196 1 -115.97 gain 1 197 -109.34 gain 197 1 -106.24 gain 1 198 -114.60 gain 198 1 -114.14 gain 1 199 -112.90 gain 199 1 -106.46 gain 1 200 -109.34 gain 200 1 -104.81 gain 1 201 -116.93 gain 201 1 -115.50 gain 1 202 -114.26 gain 202 1 -111.12 gain 1 203 -119.57 gain 203 1 -116.53 gain 1 204 -118.51 gain 204 1 -113.69 gain 1 205 -124.04 gain 205 1 -118.89 gain 1 206 -106.87 gain 206 1 -103.04 gain 1 207 -116.57 gain 207 1 -110.49 gain 1 208 -115.37 gain 208 1 -112.59 gain 1 209 -120.85 gain 209 1 -117.11 gain 1 210 -116.13 gain 210 1 -116.39 gain 1 211 -113.10 gain 211 1 -110.75 gain 1 212 -115.36 gain 212 1 -111.56 gain 1 213 -113.26 gain 213 1 -112.19 gain 1 214 -114.29 gain 214 1 -111.40 gain 1 215 -112.53 gain 215 1 -111.46 gain 1 216 -111.90 gain 216 1 -107.72 gain 1 217 -118.32 gain 217 1 -118.60 gain 1 218 -114.20 gain 218 1 -115.79 gain 1 219 -116.45 gain 219 1 -115.62 gain 1 220 -123.38 gain 220 1 -119.66 gain 1 221 -112.04 gain 221 1 -109.31 gain 1 222 -119.30 gain 222 1 -113.15 gain 1 223 -112.98 gain 223 1 -109.12 gain 1 224 -118.97 gain 224 1 -112.04 gain 2 3 -76.00 gain 3 2 -70.33 gain 2 4 -91.27 gain 4 2 -86.88 gain 2 5 -94.71 gain 5 2 -90.25 gain 2 6 -91.33 gain 6 2 -89.67 gain 2 7 -98.54 gain 7 2 -95.97 gain 2 8 -101.23 gain 8 2 -97.30 gain 2 9 -104.52 gain 9 2 -102.79 gain 2 10 -105.05 gain 10 2 -101.77 gain 2 11 -108.95 gain 11 2 -105.13 gain 2 12 -109.02 gain 12 2 -102.26 gain 2 13 -104.27 gain 13 2 -100.52 gain 2 14 -113.75 gain 14 2 -109.47 gain 2 15 -87.75 gain 15 2 -86.20 gain 2 16 -81.19 gain 16 2 -75.07 gain 2 17 -81.46 gain 17 2 -80.88 gain 2 18 -82.34 gain 18 2 -75.81 gain 2 19 -90.91 gain 19 2 -92.66 gain 2 20 -93.52 gain 20 2 -91.45 gain 2 21 -100.67 gain 21 2 -98.40 gain 2 22 -104.32 gain 22 2 -100.38 gain 2 23 -99.61 gain 23 2 -98.12 gain 2 24 -100.17 gain 24 2 -96.58 gain 2 25 -107.63 gain 25 2 -105.02 gain 2 26 -108.67 gain 26 2 -106.53 gain 2 27 -116.16 gain 27 2 -113.36 gain 2 28 -117.36 gain 28 2 -116.51 gain 2 29 -110.51 gain 29 2 -101.29 gain 2 30 -85.57 gain 30 2 -88.04 gain 2 31 -87.08 gain 31 2 -86.63 gain 2 32 -95.82 gain 32 2 -90.51 gain 2 33 -88.51 gain 33 2 -81.97 gain 2 34 -95.80 gain 34 2 -96.25 gain 2 35 -89.11 gain 35 2 -87.47 gain 2 36 -103.74 gain 36 2 -100.92 gain 2 37 -95.60 gain 37 2 -92.18 gain 2 38 -100.58 gain 38 2 -98.36 gain 2 39 -102.04 gain 39 2 -97.29 gain 2 40 -105.46 gain 40 2 -102.76 gain 2 41 -106.06 gain 41 2 -103.01 gain 2 42 -112.66 gain 42 2 -112.63 gain 2 43 -114.00 gain 43 2 -114.49 gain 2 44 -105.09 gain 44 2 -103.57 gain 2 45 -98.49 gain 45 2 -92.99 gain 2 46 -97.68 gain 46 2 -95.05 gain 2 47 -89.04 gain 47 2 -88.27 gain 2 48 -89.24 gain 48 2 -85.47 gain 2 49 -90.61 gain 49 2 -83.48 gain 2 50 -92.91 gain 50 2 -87.67 gain 2 51 -105.45 gain 51 2 -102.00 gain 2 52 -101.76 gain 52 2 -94.73 gain 2 53 -102.21 gain 53 2 -99.68 gain 2 54 -106.82 gain 54 2 -100.81 gain 2 55 -101.43 gain 55 2 -98.54 gain 2 56 -105.27 gain 56 2 -105.48 gain 2 57 -114.77 gain 57 2 -117.02 gain 2 58 -108.12 gain 58 2 -109.92 gain 2 59 -108.09 gain 59 2 -108.05 gain 2 60 -99.23 gain 60 2 -97.60 gain 2 61 -94.15 gain 61 2 -85.40 gain 2 62 -94.87 gain 62 2 -88.92 gain 2 63 -107.03 gain 63 2 -100.09 gain 2 64 -100.18 gain 64 2 -97.63 gain 2 65 -93.99 gain 65 2 -91.48 gain 2 66 -99.99 gain 66 2 -96.79 gain 2 67 -103.99 gain 67 2 -100.90 gain 2 68 -107.35 gain 68 2 -104.22 gain 2 69 -106.07 gain 69 2 -101.20 gain 2 70 -104.95 gain 70 2 -102.79 gain 2 71 -113.36 gain 71 2 -111.95 gain 2 72 -116.10 gain 72 2 -116.54 gain 2 73 -105.99 gain 73 2 -103.48 gain 2 74 -109.04 gain 74 2 -102.53 gain 2 75 -98.78 gain 75 2 -92.64 gain 2 76 -98.29 gain 76 2 -94.66 gain 2 77 -101.57 gain 77 2 -96.23 gain 2 78 -100.14 gain 78 2 -103.43 gain 2 79 -96.57 gain 79 2 -94.40 gain 2 80 -96.90 gain 80 2 -93.07 gain 2 81 -104.24 gain 81 2 -104.68 gain 2 82 -112.62 gain 82 2 -112.22 gain 2 83 -104.36 gain 83 2 -103.54 gain 2 84 -110.33 gain 84 2 -106.59 gain 2 85 -117.01 gain 85 2 -117.85 gain 2 86 -119.58 gain 86 2 -113.60 gain 2 87 -107.10 gain 87 2 -103.92 gain 2 88 -109.36 gain 88 2 -106.47 gain 2 89 -120.00 gain 89 2 -117.74 gain 2 90 -102.76 gain 90 2 -104.03 gain 2 91 -102.00 gain 91 2 -98.86 gain 2 92 -106.30 gain 92 2 -106.73 gain 2 93 -99.35 gain 93 2 -93.69 gain 2 94 -99.73 gain 94 2 -96.51 gain 2 95 -101.93 gain 95 2 -101.75 gain 2 96 -105.29 gain 96 2 -101.38 gain 2 97 -99.77 gain 97 2 -97.13 gain 2 98 -109.06 gain 98 2 -103.60 gain 2 99 -115.61 gain 99 2 -114.24 gain 2 100 -109.28 gain 100 2 -105.76 gain 2 101 -106.91 gain 101 2 -102.05 gain 2 102 -107.08 gain 102 2 -102.88 gain 2 103 -111.59 gain 103 2 -106.62 gain 2 104 -112.44 gain 104 2 -103.90 gain 2 105 -106.91 gain 105 2 -103.77 gain 2 106 -99.20 gain 106 2 -95.37 gain 2 107 -100.41 gain 107 2 -99.59 gain 2 108 -113.44 gain 108 2 -110.68 gain 2 109 -105.19 gain 109 2 -99.27 gain 2 110 -104.04 gain 110 2 -100.37 gain 2 111 -109.01 gain 111 2 -102.54 gain 2 112 -108.24 gain 112 2 -103.77 gain 2 113 -106.02 gain 113 2 -108.48 gain 2 114 -111.34 gain 114 2 -109.44 gain 2 115 -108.49 gain 115 2 -107.45 gain 2 116 -118.47 gain 116 2 -113.45 gain 2 117 -109.81 gain 117 2 -104.63 gain 2 118 -109.50 gain 118 2 -112.50 gain 2 119 -120.00 gain 119 2 -114.54 gain 2 120 -107.48 gain 120 2 -102.13 gain 2 121 -106.94 gain 121 2 -104.33 gain 2 122 -106.88 gain 122 2 -106.85 gain 2 123 -99.22 gain 123 2 -99.44 gain 2 124 -104.19 gain 124 2 -98.01 gain 2 125 -108.08 gain 125 2 -103.84 gain 2 126 -111.10 gain 126 2 -111.74 gain 2 127 -111.63 gain 127 2 -107.02 gain 2 128 -107.40 gain 128 2 -105.85 gain 2 129 -109.01 gain 129 2 -104.68 gain 2 130 -106.98 gain 130 2 -104.82 gain 2 131 -103.04 gain 131 2 -99.24 gain 2 132 -116.82 gain 132 2 -109.30 gain 2 133 -117.77 gain 133 2 -114.68 gain 2 134 -115.38 gain 134 2 -110.28 gain 2 135 -100.63 gain 135 2 -91.12 gain 2 136 -107.92 gain 136 2 -107.19 gain 2 137 -107.23 gain 137 2 -103.16 gain 2 138 -109.83 gain 138 2 -107.77 gain 2 139 -111.41 gain 139 2 -111.06 gain 2 140 -102.02 gain 140 2 -101.47 gain 2 141 -116.57 gain 141 2 -111.72 gain 2 142 -109.65 gain 142 2 -105.95 gain 2 143 -104.83 gain 143 2 -103.57 gain 2 144 -110.67 gain 144 2 -105.31 gain 2 145 -109.54 gain 145 2 -108.73 gain 2 146 -103.84 gain 146 2 -99.48 gain 2 147 -113.53 gain 147 2 -110.36 gain 2 148 -118.13 gain 148 2 -115.49 gain 2 149 -108.44 gain 149 2 -102.17 gain 2 150 -102.06 gain 150 2 -99.18 gain 2 151 -111.32 gain 151 2 -110.92 gain 2 152 -108.38 gain 152 2 -106.34 gain 2 153 -111.82 gain 153 2 -109.47 gain 2 154 -110.04 gain 154 2 -108.82 gain 2 155 -105.19 gain 155 2 -101.26 gain 2 156 -113.30 gain 156 2 -110.51 gain 2 157 -117.49 gain 157 2 -115.99 gain 2 158 -111.52 gain 158 2 -111.99 gain 2 159 -112.13 gain 159 2 -106.63 gain 2 160 -97.90 gain 160 2 -93.78 gain 2 161 -110.28 gain 161 2 -107.22 gain 2 162 -116.01 gain 162 2 -112.57 gain 2 163 -117.66 gain 163 2 -111.65 gain 2 164 -113.86 gain 164 2 -115.08 gain 2 165 -109.94 gain 165 2 -108.51 gain 2 166 -112.32 gain 166 2 -112.55 gain 2 167 -100.51 gain 167 2 -99.56 gain 2 168 -114.62 gain 168 2 -112.74 gain 2 169 -114.47 gain 169 2 -109.11 gain 2 170 -110.31 gain 170 2 -105.88 gain 2 171 -104.42 gain 171 2 -100.57 gain 2 172 -111.34 gain 172 2 -110.28 gain 2 173 -103.10 gain 173 2 -96.36 gain 2 174 -109.24 gain 174 2 -108.46 gain 2 175 -111.37 gain 175 2 -102.38 gain 2 176 -116.97 gain 176 2 -112.20 gain 2 177 -116.69 gain 177 2 -114.29 gain 2 178 -115.72 gain 178 2 -110.92 gain 2 179 -113.80 gain 179 2 -112.05 gain 2 180 -104.52 gain 180 2 -101.51 gain 2 181 -111.01 gain 181 2 -111.40 gain 2 182 -113.90 gain 182 2 -110.42 gain 2 183 -108.71 gain 183 2 -101.11 gain 2 184 -110.11 gain 184 2 -108.74 gain 2 185 -106.23 gain 185 2 -103.36 gain 2 186 -119.61 gain 186 2 -117.44 gain 2 187 -115.53 gain 187 2 -113.39 gain 2 188 -116.75 gain 188 2 -119.04 gain 2 189 -113.36 gain 189 2 -111.71 gain 2 190 -109.34 gain 190 2 -100.53 gain 2 191 -112.20 gain 191 2 -106.57 gain 2 192 -118.34 gain 192 2 -116.37 gain 2 193 -114.41 gain 193 2 -108.47 gain 2 194 -118.51 gain 194 2 -112.46 gain 2 195 -112.40 gain 195 2 -104.32 gain 2 196 -109.51 gain 196 2 -109.10 gain 2 197 -109.82 gain 197 2 -106.90 gain 2 198 -112.17 gain 198 2 -111.90 gain 2 199 -108.24 gain 199 2 -101.97 gain 2 200 -106.17 gain 200 2 -101.82 gain 2 201 -116.14 gain 201 2 -114.89 gain 2 202 -111.56 gain 202 2 -108.60 gain 2 203 -110.82 gain 203 2 -107.96 gain 2 204 -118.28 gain 204 2 -113.64 gain 2 205 -111.70 gain 205 2 -106.73 gain 2 206 -117.44 gain 206 2 -113.80 gain 2 207 -119.20 gain 207 2 -113.30 gain 2 208 -116.70 gain 208 2 -114.10 gain 2 209 -114.69 gain 209 2 -111.12 gain 2 210 -115.20 gain 210 2 -115.63 gain 2 211 -113.47 gain 211 2 -111.30 gain 2 212 -113.19 gain 212 2 -109.56 gain 2 213 -106.38 gain 213 2 -105.49 gain 2 214 -117.37 gain 214 2 -114.67 gain 2 215 -116.41 gain 215 2 -115.52 gain 2 216 -117.06 gain 216 2 -113.06 gain 2 217 -107.06 gain 217 2 -107.51 gain 2 218 -110.50 gain 218 2 -112.27 gain 2 219 -109.48 gain 219 2 -108.82 gain 2 220 -116.61 gain 220 2 -113.07 gain 2 221 -113.98 gain 221 2 -111.43 gain 2 222 -117.56 gain 222 2 -111.59 gain 2 223 -111.88 gain 223 2 -108.19 gain 2 224 -113.99 gain 224 2 -107.24 gain 3 4 -74.03 gain 4 3 -75.30 gain 3 5 -78.39 gain 5 3 -79.59 gain 3 6 -85.13 gain 6 3 -89.13 gain 3 7 -92.39 gain 7 3 -95.48 gain 3 8 -94.54 gain 8 3 -96.28 gain 3 9 -95.44 gain 9 3 -99.37 gain 3 10 -102.00 gain 10 3 -104.39 gain 3 11 -97.52 gain 11 3 -99.36 gain 3 12 -93.41 gain 12 3 -92.31 gain 3 13 -102.82 gain 13 3 -104.73 gain 3 14 -102.36 gain 14 3 -103.75 gain 3 15 -87.95 gain 15 3 -92.07 gain 3 16 -86.95 gain 16 3 -86.50 gain 3 17 -78.22 gain 17 3 -83.30 gain 3 18 -77.86 gain 18 3 -77.00 gain 3 19 -76.74 gain 19 3 -84.16 gain 3 20 -86.07 gain 20 3 -89.66 gain 3 21 -88.01 gain 21 3 -91.40 gain 3 22 -94.27 gain 22 3 -96.00 gain 3 23 -101.67 gain 23 3 -105.84 gain 3 24 -95.16 gain 24 3 -97.24 gain 3 25 -97.70 gain 25 3 -100.76 gain 3 26 -94.67 gain 26 3 -98.19 gain 3 27 -102.50 gain 27 3 -105.36 gain 3 28 -104.17 gain 28 3 -108.98 gain 3 29 -111.71 gain 29 3 -108.15 gain 3 30 -92.45 gain 30 3 -100.58 gain 3 31 -94.92 gain 31 3 -100.14 gain 3 32 -83.56 gain 32 3 -83.91 gain 3 33 -80.63 gain 33 3 -79.75 gain 3 34 -79.62 gain 34 3 -85.73 gain 3 35 -85.30 gain 35 3 -89.33 gain 3 36 -88.49 gain 36 3 -91.33 gain 3 37 -89.95 gain 37 3 -92.19 gain 3 38 -87.07 gain 38 3 -90.52 gain 3 39 -96.41 gain 39 3 -97.32 gain 3 40 -105.15 gain 40 3 -108.12 gain 3 41 -94.67 gain 41 3 -97.29 gain 3 42 -99.91 gain 42 3 -105.55 gain 3 43 -109.18 gain 43 3 -115.34 gain 3 44 -104.31 gain 44 3 -108.46 gain 3 45 -101.35 gain 45 3 -101.52 gain 3 46 -89.84 gain 46 3 -92.88 gain 3 47 -84.97 gain 47 3 -89.86 gain 3 48 -89.19 gain 48 3 -91.08 gain 3 49 -85.16 gain 49 3 -83.69 gain 3 50 -86.45 gain 50 3 -86.87 gain 3 51 -92.17 gain 51 3 -94.38 gain 3 52 -98.59 gain 52 3 -97.24 gain 3 53 -97.27 gain 53 3 -100.40 gain 3 54 -95.35 gain 54 3 -95.00 gain 3 55 -104.84 gain 55 3 -107.62 gain 3 56 -107.00 gain 56 3 -112.88 gain 3 57 -104.43 gain 57 3 -112.34 gain 3 58 -101.86 gain 58 3 -109.32 gain 3 59 -112.08 gain 59 3 -117.71 gain 3 60 -96.64 gain 60 3 -100.68 gain 3 61 -98.22 gain 61 3 -95.14 gain 3 62 -88.20 gain 62 3 -87.91 gain 3 63 -96.62 gain 63 3 -95.34 gain 3 64 -93.64 gain 64 3 -96.75 gain 3 65 -90.98 gain 65 3 -94.13 gain 3 66 -94.68 gain 66 3 -97.14 gain 3 67 -95.24 gain 67 3 -97.82 gain 3 68 -99.97 gain 68 3 -102.50 gain 3 69 -94.31 gain 69 3 -95.10 gain 3 70 -97.76 gain 70 3 -101.26 gain 3 71 -112.28 gain 71 3 -116.53 gain 3 72 -100.50 gain 72 3 -106.60 gain 3 73 -102.22 gain 73 3 -105.37 gain 3 74 -99.06 gain 74 3 -98.21 gain 3 75 -91.15 gain 75 3 -90.68 gain 3 76 -92.66 gain 76 3 -94.69 gain 3 77 -89.60 gain 77 3 -89.92 gain 3 78 -90.11 gain 78 3 -99.07 gain 3 79 -94.09 gain 79 3 -97.59 gain 3 80 -100.07 gain 80 3 -101.90 gain 3 81 -101.39 gain 81 3 -107.50 gain 3 82 -92.89 gain 82 3 -98.16 gain 3 83 -100.33 gain 83 3 -105.18 gain 3 84 -99.50 gain 84 3 -101.42 gain 3 85 -106.68 gain 85 3 -113.18 gain 3 86 -108.91 gain 86 3 -108.60 gain 3 87 -99.72 gain 87 3 -102.21 gain 3 88 -101.09 gain 88 3 -103.86 gain 3 89 -102.74 gain 89 3 -106.15 gain 3 90 -94.30 gain 90 3 -101.23 gain 3 91 -105.38 gain 91 3 -107.90 gain 3 92 -91.76 gain 92 3 -97.86 gain 3 93 -94.79 gain 93 3 -94.80 gain 3 94 -90.80 gain 94 3 -93.24 gain 3 95 -99.87 gain 95 3 -105.35 gain 3 96 -94.68 gain 96 3 -96.43 gain 3 97 -94.96 gain 97 3 -97.99 gain 3 98 -96.90 gain 98 3 -97.11 gain 3 99 -98.70 gain 99 3 -103.00 gain 3 100 -104.93 gain 100 3 -107.06 gain 3 101 -101.72 gain 101 3 -102.52 gain 3 102 -104.16 gain 102 3 -105.62 gain 3 103 -102.20 gain 103 3 -102.89 gain 3 104 -109.70 gain 104 3 -106.82 gain 3 105 -90.52 gain 105 3 -93.04 gain 3 106 -97.49 gain 106 3 -99.32 gain 3 107 -98.24 gain 107 3 -103.08 gain 3 108 -95.22 gain 108 3 -98.13 gain 3 109 -99.05 gain 109 3 -98.80 gain 3 110 -105.89 gain 110 3 -107.88 gain 3 111 -98.41 gain 111 3 -97.60 gain 3 112 -88.79 gain 112 3 -89.98 gain 3 113 -98.30 gain 113 3 -106.42 gain 3 114 -102.01 gain 114 3 -105.77 gain 3 115 -103.86 gain 115 3 -108.48 gain 3 116 -102.98 gain 116 3 -103.63 gain 3 117 -107.60 gain 117 3 -108.08 gain 3 118 -100.81 gain 118 3 -109.47 gain 3 119 -105.96 gain 119 3 -106.17 gain 3 120 -101.02 gain 120 3 -101.33 gain 3 121 -102.32 gain 121 3 -105.37 gain 3 122 -110.23 gain 122 3 -115.85 gain 3 123 -102.23 gain 123 3 -108.12 gain 3 124 -94.18 gain 124 3 -93.67 gain 3 125 -95.20 gain 125 3 -96.62 gain 3 126 -102.27 gain 126 3 -108.57 gain 3 127 -96.46 gain 127 3 -97.51 gain 3 128 -94.84 gain 128 3 -98.95 gain 3 129 -108.80 gain 129 3 -110.13 gain 3 130 -104.55 gain 130 3 -108.06 gain 3 131 -100.69 gain 131 3 -102.55 gain 3 132 -102.29 gain 132 3 -100.43 gain 3 133 -107.51 gain 133 3 -110.08 gain 3 134 -103.81 gain 134 3 -104.37 gain 3 135 -106.29 gain 135 3 -102.44 gain 3 136 -97.25 gain 136 3 -102.18 gain 3 137 -92.13 gain 137 3 -93.72 gain 3 138 -102.27 gain 138 3 -105.87 gain 3 139 -100.35 gain 139 3 -105.66 gain 3 140 -98.85 gain 140 3 -103.96 gain 3 141 -102.10 gain 141 3 -102.90 gain 3 142 -105.95 gain 142 3 -107.90 gain 3 143 -105.27 gain 143 3 -109.68 gain 3 144 -104.66 gain 144 3 -104.97 gain 3 145 -107.98 gain 145 3 -112.84 gain 3 146 -109.44 gain 146 3 -110.74 gain 3 147 -117.59 gain 147 3 -120.08 gain 3 148 -102.98 gain 148 3 -106.00 gain 3 149 -102.64 gain 149 3 -102.04 gain 3 150 -102.75 gain 150 3 -105.53 gain 3 151 -101.34 gain 151 3 -106.60 gain 3 152 -100.91 gain 152 3 -104.52 gain 3 153 -102.81 gain 153 3 -106.12 gain 3 154 -102.49 gain 154 3 -106.94 gain 3 155 -109.34 gain 155 3 -111.08 gain 3 156 -104.98 gain 156 3 -107.84 gain 3 157 -103.23 gain 157 3 -107.40 gain 3 158 -93.96 gain 158 3 -100.10 gain 3 159 -104.16 gain 159 3 -104.32 gain 3 160 -109.96 gain 160 3 -111.51 gain 3 161 -107.92 gain 161 3 -110.52 gain 3 162 -102.63 gain 162 3 -104.86 gain 3 163 -112.73 gain 163 3 -112.38 gain 3 164 -98.97 gain 164 3 -105.85 gain 3 165 -100.76 gain 165 3 -104.99 gain 3 166 -103.65 gain 166 3 -109.55 gain 3 167 -103.67 gain 167 3 -108.39 gain 3 168 -103.72 gain 168 3 -107.50 gain 3 169 -99.24 gain 169 3 -99.53 gain 3 170 -103.47 gain 170 3 -104.70 gain 3 171 -102.92 gain 171 3 -104.72 gain 3 172 -110.92 gain 172 3 -115.52 gain 3 173 -109.25 gain 173 3 -108.17 gain 3 174 -112.25 gain 174 3 -117.13 gain 3 175 -103.98 gain 175 3 -100.66 gain 3 176 -102.73 gain 176 3 -103.63 gain 3 177 -109.63 gain 177 3 -112.89 gain 3 178 -109.33 gain 178 3 -110.20 gain 3 179 -108.37 gain 179 3 -112.28 gain 3 180 -110.83 gain 180 3 -113.48 gain 3 181 -102.40 gain 181 3 -108.45 gain 3 182 -108.34 gain 182 3 -110.52 gain 3 183 -108.34 gain 183 3 -106.41 gain 3 184 -102.42 gain 184 3 -106.71 gain 3 185 -104.70 gain 185 3 -107.49 gain 3 186 -106.55 gain 186 3 -110.04 gain 3 187 -112.12 gain 187 3 -115.64 gain 3 188 -105.75 gain 188 3 -113.71 gain 3 189 -113.08 gain 189 3 -117.10 gain 3 190 -102.74 gain 190 3 -99.59 gain 3 191 -105.22 gain 191 3 -105.25 gain 3 192 -100.89 gain 192 3 -104.59 gain 3 193 -116.84 gain 193 3 -116.56 gain 3 194 -108.52 gain 194 3 -108.13 gain 3 195 -104.65 gain 195 3 -102.23 gain 3 196 -106.25 gain 196 3 -111.50 gain 3 197 -108.13 gain 197 3 -110.88 gain 3 198 -105.94 gain 198 3 -111.33 gain 3 199 -111.35 gain 199 3 -110.75 gain 3 200 -105.80 gain 200 3 -107.12 gain 3 201 -112.47 gain 201 3 -116.88 gain 3 202 -110.99 gain 202 3 -113.70 gain 3 203 -108.22 gain 203 3 -111.02 gain 3 204 -111.89 gain 204 3 -112.92 gain 3 205 -103.26 gain 205 3 -103.95 gain 3 206 -107.18 gain 206 3 -109.19 gain 3 207 -109.41 gain 207 3 -109.17 gain 3 208 -115.19 gain 208 3 -118.25 gain 3 209 -106.26 gain 209 3 -108.35 gain 3 210 -112.78 gain 210 3 -118.87 gain 3 211 -103.21 gain 211 3 -106.70 gain 3 212 -104.59 gain 212 3 -106.63 gain 3 213 -111.07 gain 213 3 -115.85 gain 3 214 -102.16 gain 214 3 -105.12 gain 3 215 -110.56 gain 215 3 -115.34 gain 3 216 -107.80 gain 216 3 -109.47 gain 3 217 -108.13 gain 217 3 -114.25 gain 3 218 -100.63 gain 218 3 -108.06 gain 3 219 -110.32 gain 219 3 -115.33 gain 3 220 -106.13 gain 220 3 -108.26 gain 3 221 -110.39 gain 221 3 -113.51 gain 3 222 -115.91 gain 222 3 -115.60 gain 3 223 -109.68 gain 223 3 -111.66 gain 3 224 -108.59 gain 224 3 -107.50 gain 4 5 -76.76 gain 5 4 -76.69 gain 4 6 -82.96 gain 6 4 -85.70 gain 4 7 -84.33 gain 7 4 -86.15 gain 4 8 -89.28 gain 8 4 -89.75 gain 4 9 -99.63 gain 9 4 -102.29 gain 4 10 -98.89 gain 10 4 -100.02 gain 4 11 -97.14 gain 11 4 -97.72 gain 4 12 -100.88 gain 12 4 -98.52 gain 4 13 -98.62 gain 13 4 -99.26 gain 4 14 -104.08 gain 14 4 -104.20 gain 4 15 -92.84 gain 15 4 -95.69 gain 4 16 -89.00 gain 16 4 -87.29 gain 4 17 -81.25 gain 17 4 -85.06 gain 4 18 -83.10 gain 18 4 -80.97 gain 4 19 -76.93 gain 19 4 -83.08 gain 4 20 -80.99 gain 20 4 -83.31 gain 4 21 -81.67 gain 21 4 -83.79 gain 4 22 -92.95 gain 22 4 -93.41 gain 4 23 -87.79 gain 23 4 -90.70 gain 4 24 -96.88 gain 24 4 -97.69 gain 4 25 -93.84 gain 25 4 -95.63 gain 4 26 -98.55 gain 26 4 -100.81 gain 4 27 -94.80 gain 27 4 -96.40 gain 4 28 -101.49 gain 28 4 -105.04 gain 4 29 -111.82 gain 29 4 -106.99 gain 4 30 -92.74 gain 30 4 -99.61 gain 4 31 -98.65 gain 31 4 -102.60 gain 4 32 -90.54 gain 32 4 -89.63 gain 4 33 -86.69 gain 33 4 -84.55 gain 4 34 -86.61 gain 34 4 -91.46 gain 4 35 -80.96 gain 35 4 -83.72 gain 4 36 -89.80 gain 36 4 -91.37 gain 4 37 -88.35 gain 37 4 -89.33 gain 4 38 -97.19 gain 38 4 -99.37 gain 4 39 -91.19 gain 39 4 -90.83 gain 4 40 -99.24 gain 40 4 -100.94 gain 4 41 -98.49 gain 41 4 -99.84 gain 4 42 -108.74 gain 42 4 -113.11 gain 4 43 -99.00 gain 43 4 -103.89 gain 4 44 -102.40 gain 44 4 -105.28 gain 4 45 -95.21 gain 45 4 -94.11 gain 4 46 -85.63 gain 46 4 -87.41 gain 4 47 -89.38 gain 47 4 -93.01 gain 4 48 -93.07 gain 48 4 -93.70 gain 4 49 -90.42 gain 49 4 -87.69 gain 4 50 -92.92 gain 50 4 -92.08 gain 4 51 -87.94 gain 51 4 -88.88 gain 4 52 -89.98 gain 52 4 -87.35 gain 4 53 -93.82 gain 53 4 -95.69 gain 4 54 -98.72 gain 54 4 -97.11 gain 4 55 -93.25 gain 55 4 -94.77 gain 4 56 -101.10 gain 56 4 -105.71 gain 4 57 -102.20 gain 57 4 -108.85 gain 4 58 -106.38 gain 58 4 -112.57 gain 4 59 -99.03 gain 59 4 -103.39 gain 4 60 -97.11 gain 60 4 -99.88 gain 4 61 -98.04 gain 61 4 -93.69 gain 4 62 -92.08 gain 62 4 -90.53 gain 4 63 -83.59 gain 63 4 -81.05 gain 4 64 -91.41 gain 64 4 -93.26 gain 4 65 -85.80 gain 65 4 -87.69 gain 4 66 -91.27 gain 66 4 -92.46 gain 4 67 -89.45 gain 67 4 -90.76 gain 4 68 -107.18 gain 68 4 -108.45 gain 4 69 -94.65 gain 69 4 -94.18 gain 4 70 -95.70 gain 70 4 -97.93 gain 4 71 -93.77 gain 71 4 -96.76 gain 4 72 -102.59 gain 72 4 -107.42 gain 4 73 -101.10 gain 73 4 -102.99 gain 4 74 -105.19 gain 74 4 -103.07 gain 4 75 -99.16 gain 75 4 -97.42 gain 4 76 -98.81 gain 76 4 -99.57 gain 4 77 -95.25 gain 77 4 -94.31 gain 4 78 -96.54 gain 78 4 -104.23 gain 4 79 -95.94 gain 79 4 -98.18 gain 4 80 -95.66 gain 80 4 -96.23 gain 4 81 -88.15 gain 81 4 -92.99 gain 4 82 -91.75 gain 82 4 -95.76 gain 4 83 -93.25 gain 83 4 -96.83 gain 4 84 -96.63 gain 84 4 -97.28 gain 4 85 -93.24 gain 85 4 -98.47 gain 4 86 -103.15 gain 86 4 -101.57 gain 4 87 -101.94 gain 87 4 -103.16 gain 4 88 -98.21 gain 88 4 -99.71 gain 4 89 -104.91 gain 89 4 -107.04 gain 4 90 -104.37 gain 90 4 -110.04 gain 4 91 -99.53 gain 91 4 -100.79 gain 4 92 -99.34 gain 92 4 -104.17 gain 4 93 -95.53 gain 93 4 -94.27 gain 4 94 -101.39 gain 94 4 -102.56 gain 4 95 -91.20 gain 95 4 -95.41 gain 4 96 -90.75 gain 96 4 -91.24 gain 4 97 -102.24 gain 97 4 -104.00 gain 4 98 -100.21 gain 98 4 -99.15 gain 4 99 -104.05 gain 99 4 -107.08 gain 4 100 -103.11 gain 100 4 -103.98 gain 4 101 -109.62 gain 101 4 -109.15 gain 4 102 -102.18 gain 102 4 -102.38 gain 4 103 -103.37 gain 103 4 -102.80 gain 4 104 -106.20 gain 104 4 -102.05 gain 4 105 -99.13 gain 105 4 -100.39 gain 4 106 -99.27 gain 106 4 -99.83 gain 4 107 -94.19 gain 107 4 -97.76 gain 4 108 -100.21 gain 108 4 -101.85 gain 4 109 -87.74 gain 109 4 -86.23 gain 4 110 -95.85 gain 110 4 -96.57 gain 4 111 -97.90 gain 111 4 -95.82 gain 4 112 -106.23 gain 112 4 -106.15 gain 4 113 -105.81 gain 113 4 -112.67 gain 4 114 -101.28 gain 114 4 -103.78 gain 4 115 -102.59 gain 115 4 -105.94 gain 4 116 -102.13 gain 116 4 -101.51 gain 4 117 -107.24 gain 117 4 -106.46 gain 4 118 -100.46 gain 118 4 -107.85 gain 4 119 -107.92 gain 119 4 -106.86 gain 4 120 -111.90 gain 120 4 -110.95 gain 4 121 -102.25 gain 121 4 -104.04 gain 4 122 -104.16 gain 122 4 -108.52 gain 4 123 -98.82 gain 123 4 -103.44 gain 4 124 -106.20 gain 124 4 -104.42 gain 4 125 -102.59 gain 125 4 -102.74 gain 4 126 -102.77 gain 126 4 -107.81 gain 4 127 -96.09 gain 127 4 -95.88 gain 4 128 -102.45 gain 128 4 -105.30 gain 4 129 -109.10 gain 129 4 -109.16 gain 4 130 -107.10 gain 130 4 -109.34 gain 4 131 -106.68 gain 131 4 -107.28 gain 4 132 -100.66 gain 132 4 -97.54 gain 4 133 -113.17 gain 133 4 -114.48 gain 4 134 -111.37 gain 134 4 -110.67 gain 4 135 -110.59 gain 135 4 -105.48 gain 4 136 -102.09 gain 136 4 -105.76 gain 4 137 -97.91 gain 137 4 -98.23 gain 4 138 -95.05 gain 138 4 -97.39 gain 4 139 -103.99 gain 139 4 -108.03 gain 4 140 -104.54 gain 140 4 -108.39 gain 4 141 -102.84 gain 141 4 -102.38 gain 4 142 -107.37 gain 142 4 -108.06 gain 4 143 -104.65 gain 143 4 -107.79 gain 4 144 -99.91 gain 144 4 -98.95 gain 4 145 -103.56 gain 145 4 -107.16 gain 4 146 -99.27 gain 146 4 -99.30 gain 4 147 -106.34 gain 147 4 -107.57 gain 4 148 -108.86 gain 148 4 -110.62 gain 4 149 -107.18 gain 149 4 -105.31 gain 4 150 -104.08 gain 150 4 -105.59 gain 4 151 -112.66 gain 151 4 -116.65 gain 4 152 -104.57 gain 152 4 -106.92 gain 4 153 -113.52 gain 153 4 -115.57 gain 4 154 -104.34 gain 154 4 -107.51 gain 4 155 -106.75 gain 155 4 -107.22 gain 4 156 -110.16 gain 156 4 -111.76 gain 4 157 -109.68 gain 157 4 -112.58 gain 4 158 -101.95 gain 158 4 -106.81 gain 4 159 -104.19 gain 159 4 -103.09 gain 4 160 -102.31 gain 160 4 -102.59 gain 4 161 -107.59 gain 161 4 -108.93 gain 4 162 -100.93 gain 162 4 -101.90 gain 4 163 -103.45 gain 163 4 -101.84 gain 4 164 -107.37 gain 164 4 -112.98 gain 4 165 -106.36 gain 165 4 -109.33 gain 4 166 -103.09 gain 166 4 -107.72 gain 4 167 -100.39 gain 167 4 -103.84 gain 4 168 -104.23 gain 168 4 -106.74 gain 4 169 -104.32 gain 169 4 -103.34 gain 4 170 -109.01 gain 170 4 -108.98 gain 4 171 -106.92 gain 171 4 -107.46 gain 4 172 -112.84 gain 172 4 -116.18 gain 4 173 -103.68 gain 173 4 -101.34 gain 4 174 -102.34 gain 174 4 -105.95 gain 4 175 -105.75 gain 175 4 -101.16 gain 4 176 -101.15 gain 176 4 -100.78 gain 4 177 -109.73 gain 177 4 -111.73 gain 4 178 -106.24 gain 178 4 -105.85 gain 4 179 -108.79 gain 179 4 -111.44 gain 4 180 -106.78 gain 180 4 -108.16 gain 4 181 -114.95 gain 181 4 -119.73 gain 4 182 -114.03 gain 182 4 -114.94 gain 4 183 -111.82 gain 183 4 -108.62 gain 4 184 -110.45 gain 184 4 -113.48 gain 4 185 -108.30 gain 185 4 -109.83 gain 4 186 -102.62 gain 186 4 -104.85 gain 4 187 -110.01 gain 187 4 -112.27 gain 4 188 -104.26 gain 188 4 -110.95 gain 4 189 -104.74 gain 189 4 -107.49 gain 4 190 -107.98 gain 190 4 -103.56 gain 4 191 -110.59 gain 191 4 -109.35 gain 4 192 -115.11 gain 192 4 -117.54 gain 4 193 -109.30 gain 193 4 -107.76 gain 4 194 -107.28 gain 194 4 -105.63 gain 4 195 -112.91 gain 195 4 -109.23 gain 4 196 -105.14 gain 196 4 -109.13 gain 4 197 -104.87 gain 197 4 -106.35 gain 4 198 -107.20 gain 198 4 -111.32 gain 4 199 -110.34 gain 199 4 -108.48 gain 4 200 -106.41 gain 200 4 -106.46 gain 4 201 -110.68 gain 201 4 -113.83 gain 4 202 -112.14 gain 202 4 -113.58 gain 4 203 -109.84 gain 203 4 -111.37 gain 4 204 -105.05 gain 204 4 -104.81 gain 4 205 -109.32 gain 205 4 -108.74 gain 4 206 -107.94 gain 206 4 -108.68 gain 4 207 -109.82 gain 207 4 -108.31 gain 4 208 -117.27 gain 208 4 -119.06 gain 4 209 -106.68 gain 209 4 -107.51 gain 4 210 -107.55 gain 210 4 -112.38 gain 4 211 -111.18 gain 211 4 -113.40 gain 4 212 -116.43 gain 212 4 -117.20 gain 4 213 -109.51 gain 213 4 -113.02 gain 4 214 -115.79 gain 214 4 -117.48 gain 4 215 -100.23 gain 215 4 -103.73 gain 4 216 -110.33 gain 216 4 -110.73 gain 4 217 -113.26 gain 217 4 -118.11 gain 4 218 -110.60 gain 218 4 -116.77 gain 4 219 -111.91 gain 219 4 -115.65 gain 4 220 -107.30 gain 220 4 -108.15 gain 4 221 -109.48 gain 221 4 -111.33 gain 4 222 -110.75 gain 222 4 -109.17 gain 4 223 -107.57 gain 223 4 -108.29 gain 4 224 -112.56 gain 224 4 -110.21 gain 5 6 -71.18 gain 6 5 -73.98 gain 5 7 -85.81 gain 7 5 -87.71 gain 5 8 -91.14 gain 8 5 -91.68 gain 5 9 -92.89 gain 9 5 -95.62 gain 5 10 -95.24 gain 10 5 -96.43 gain 5 11 -98.57 gain 11 5 -99.22 gain 5 12 -101.00 gain 12 5 -98.71 gain 5 13 -97.15 gain 13 5 -97.86 gain 5 14 -98.08 gain 14 5 -98.27 gain 5 15 -92.47 gain 15 5 -95.39 gain 5 16 -98.34 gain 16 5 -96.70 gain 5 17 -87.42 gain 17 5 -91.30 gain 5 18 -80.71 gain 18 5 -78.65 gain 5 19 -75.69 gain 19 5 -81.91 gain 5 20 -69.98 gain 20 5 -72.38 gain 5 21 -76.39 gain 21 5 -78.57 gain 5 22 -79.85 gain 22 5 -80.38 gain 5 23 -89.53 gain 23 5 -92.51 gain 5 24 -97.00 gain 24 5 -97.88 gain 5 25 -93.67 gain 25 5 -95.53 gain 5 26 -104.26 gain 26 5 -106.58 gain 5 27 -103.01 gain 27 5 -104.68 gain 5 28 -98.84 gain 28 5 -102.45 gain 5 29 -100.62 gain 29 5 -95.86 gain 5 30 -97.49 gain 30 5 -104.43 gain 5 31 -96.46 gain 31 5 -100.48 gain 5 32 -90.95 gain 32 5 -90.11 gain 5 33 -86.36 gain 33 5 -84.29 gain 5 34 -82.32 gain 34 5 -87.23 gain 5 35 -81.46 gain 35 5 -84.28 gain 5 36 -85.34 gain 36 5 -86.98 gain 5 37 -85.79 gain 37 5 -86.84 gain 5 38 -100.75 gain 38 5 -103.00 gain 5 39 -97.39 gain 39 5 -97.10 gain 5 40 -102.41 gain 40 5 -104.18 gain 5 41 -94.97 gain 41 5 -96.38 gain 5 42 -100.82 gain 42 5 -105.25 gain 5 43 -103.47 gain 43 5 -108.42 gain 5 44 -102.75 gain 44 5 -105.70 gain 5 45 -93.27 gain 45 5 -92.24 gain 5 46 -94.30 gain 46 5 -96.14 gain 5 47 -86.85 gain 47 5 -90.54 gain 5 48 -91.79 gain 48 5 -92.49 gain 5 49 -92.65 gain 49 5 -89.98 gain 5 50 -90.79 gain 50 5 -90.02 gain 5 51 -91.30 gain 51 5 -92.31 gain 5 52 -90.99 gain 52 5 -88.44 gain 5 53 -87.92 gain 53 5 -89.86 gain 5 54 -91.25 gain 54 5 -89.71 gain 5 55 -100.43 gain 55 5 -102.01 gain 5 56 -102.96 gain 56 5 -107.64 gain 5 57 -97.14 gain 57 5 -103.85 gain 5 58 -99.69 gain 58 5 -105.95 gain 5 59 -105.76 gain 59 5 -110.19 gain 5 60 -98.52 gain 60 5 -101.35 gain 5 61 -99.79 gain 61 5 -95.51 gain 5 62 -90.04 gain 62 5 -88.55 gain 5 63 -94.57 gain 63 5 -92.10 gain 5 64 -94.64 gain 64 5 -96.56 gain 5 65 -92.24 gain 65 5 -94.20 gain 5 66 -97.91 gain 66 5 -99.17 gain 5 67 -88.00 gain 67 5 -89.38 gain 5 68 -90.66 gain 68 5 -92.00 gain 5 69 -97.29 gain 69 5 -96.88 gain 5 70 -92.36 gain 70 5 -94.66 gain 5 71 -100.04 gain 71 5 -103.09 gain 5 72 -98.83 gain 72 5 -103.73 gain 5 73 -109.83 gain 73 5 -111.78 gain 5 74 -101.19 gain 74 5 -99.14 gain 5 75 -92.35 gain 75 5 -90.69 gain 5 76 -101.27 gain 76 5 -102.10 gain 5 77 -97.89 gain 77 5 -97.01 gain 5 78 -94.26 gain 78 5 -102.03 gain 5 79 -92.91 gain 79 5 -95.22 gain 5 80 -90.86 gain 80 5 -91.50 gain 5 81 -92.96 gain 81 5 -97.86 gain 5 82 -96.25 gain 82 5 -100.32 gain 5 83 -99.76 gain 83 5 -103.41 gain 5 84 -104.10 gain 84 5 -104.82 gain 5 85 -98.67 gain 85 5 -103.97 gain 5 86 -101.31 gain 86 5 -99.80 gain 5 87 -100.57 gain 87 5 -101.86 gain 5 88 -98.87 gain 88 5 -100.44 gain 5 89 -106.26 gain 89 5 -108.46 gain 5 90 -97.18 gain 90 5 -102.92 gain 5 91 -99.31 gain 91 5 -100.63 gain 5 92 -102.10 gain 92 5 -106.99 gain 5 93 -97.43 gain 93 5 -96.24 gain 5 94 -99.20 gain 94 5 -100.45 gain 5 95 -93.02 gain 95 5 -97.31 gain 5 96 -93.95 gain 96 5 -94.50 gain 5 97 -98.91 gain 97 5 -100.74 gain 5 98 -99.52 gain 98 5 -98.53 gain 5 99 -96.39 gain 99 5 -99.49 gain 5 100 -108.10 gain 100 5 -109.04 gain 5 101 -101.85 gain 101 5 -101.45 gain 5 102 -109.84 gain 102 5 -110.10 gain 5 103 -109.01 gain 103 5 -108.51 gain 5 104 -107.24 gain 104 5 -103.16 gain 5 105 -100.55 gain 105 5 -101.88 gain 5 106 -100.24 gain 106 5 -100.87 gain 5 107 -104.06 gain 107 5 -107.70 gain 5 108 -104.68 gain 108 5 -106.39 gain 5 109 -98.95 gain 109 5 -97.50 gain 5 110 -102.90 gain 110 5 -103.69 gain 5 111 -99.26 gain 111 5 -97.25 gain 5 112 -104.22 gain 112 5 -104.21 gain 5 113 -103.57 gain 113 5 -110.49 gain 5 114 -100.65 gain 114 5 -103.21 gain 5 115 -108.64 gain 115 5 -112.06 gain 5 116 -104.17 gain 116 5 -103.61 gain 5 117 -99.90 gain 117 5 -99.19 gain 5 118 -101.43 gain 118 5 -108.89 gain 5 119 -106.79 gain 119 5 -105.80 gain 5 120 -100.77 gain 120 5 -99.88 gain 5 121 -98.84 gain 121 5 -100.69 gain 5 122 -102.51 gain 122 5 -106.94 gain 5 123 -102.39 gain 123 5 -107.08 gain 5 124 -105.71 gain 124 5 -103.99 gain 5 125 -96.18 gain 125 5 -96.40 gain 5 126 -99.39 gain 126 5 -104.49 gain 5 127 -109.69 gain 127 5 -109.55 gain 5 128 -98.55 gain 128 5 -101.46 gain 5 129 -103.56 gain 129 5 -103.69 gain 5 130 -100.99 gain 130 5 -103.30 gain 5 131 -104.46 gain 131 5 -105.12 gain 5 132 -110.82 gain 132 5 -107.76 gain 5 133 -107.98 gain 133 5 -109.35 gain 5 134 -108.35 gain 134 5 -107.72 gain 5 135 -101.42 gain 135 5 -96.38 gain 5 136 -109.38 gain 136 5 -113.11 gain 5 137 -107.81 gain 137 5 -108.20 gain 5 138 -105.03 gain 138 5 -107.43 gain 5 139 -108.81 gain 139 5 -112.93 gain 5 140 -104.79 gain 140 5 -108.71 gain 5 141 -107.01 gain 141 5 -106.62 gain 5 142 -100.62 gain 142 5 -101.38 gain 5 143 -100.42 gain 143 5 -103.63 gain 5 144 -109.42 gain 144 5 -108.54 gain 5 145 -105.81 gain 145 5 -109.47 gain 5 146 -106.26 gain 146 5 -106.36 gain 5 147 -105.46 gain 147 5 -106.75 gain 5 148 -106.88 gain 148 5 -108.70 gain 5 149 -102.24 gain 149 5 -100.44 gain 5 150 -114.96 gain 150 5 -116.54 gain 5 151 -109.95 gain 151 5 -114.01 gain 5 152 -106.35 gain 152 5 -108.77 gain 5 153 -101.82 gain 153 5 -103.94 gain 5 154 -105.29 gain 154 5 -108.54 gain 5 155 -105.04 gain 155 5 -105.58 gain 5 156 -109.33 gain 156 5 -111.00 gain 5 157 -110.64 gain 157 5 -113.60 gain 5 158 -100.20 gain 158 5 -105.14 gain 5 159 -104.89 gain 159 5 -103.86 gain 5 160 -109.00 gain 160 5 -109.35 gain 5 161 -105.35 gain 161 5 -106.76 gain 5 162 -103.60 gain 162 5 -104.63 gain 5 163 -116.47 gain 163 5 -114.92 gain 5 164 -106.18 gain 164 5 -111.86 gain 5 165 -101.78 gain 165 5 -104.82 gain 5 166 -103.39 gain 166 5 -108.09 gain 5 167 -108.29 gain 167 5 -111.80 gain 5 168 -108.65 gain 168 5 -111.23 gain 5 169 -103.85 gain 169 5 -102.94 gain 5 170 -106.18 gain 170 5 -106.22 gain 5 171 -106.95 gain 171 5 -107.55 gain 5 172 -106.98 gain 172 5 -110.39 gain 5 173 -113.32 gain 173 5 -111.05 gain 5 174 -107.60 gain 174 5 -111.29 gain 5 175 -110.67 gain 175 5 -106.15 gain 5 176 -104.38 gain 176 5 -104.08 gain 5 177 -106.05 gain 177 5 -108.12 gain 5 178 -109.85 gain 178 5 -109.52 gain 5 179 -113.38 gain 179 5 -116.10 gain 5 180 -103.46 gain 180 5 -104.92 gain 5 181 -106.60 gain 181 5 -111.45 gain 5 182 -108.76 gain 182 5 -109.75 gain 5 183 -106.69 gain 183 5 -103.56 gain 5 184 -103.10 gain 184 5 -106.19 gain 5 185 -107.11 gain 185 5 -108.71 gain 5 186 -104.01 gain 186 5 -106.30 gain 5 187 -104.46 gain 187 5 -106.78 gain 5 188 -108.29 gain 188 5 -115.06 gain 5 189 -106.38 gain 189 5 -109.21 gain 5 190 -109.20 gain 190 5 -104.86 gain 5 191 -105.34 gain 191 5 -104.16 gain 5 192 -109.63 gain 192 5 -112.14 gain 5 193 -113.99 gain 193 5 -112.51 gain 5 194 -106.23 gain 194 5 -104.65 gain 5 195 -105.87 gain 195 5 -102.26 gain 5 196 -109.46 gain 196 5 -113.52 gain 5 197 -107.99 gain 197 5 -109.54 gain 5 198 -100.79 gain 198 5 -104.98 gain 5 199 -103.30 gain 199 5 -101.50 gain 5 200 -111.38 gain 200 5 -111.49 gain 5 201 -110.57 gain 201 5 -113.78 gain 5 202 -110.69 gain 202 5 -112.20 gain 5 203 -108.47 gain 203 5 -110.08 gain 5 204 -114.29 gain 204 5 -114.12 gain 5 205 -100.01 gain 205 5 -99.50 gain 5 206 -108.71 gain 206 5 -109.53 gain 5 207 -110.35 gain 207 5 -108.91 gain 5 208 -114.73 gain 208 5 -116.59 gain 5 209 -107.31 gain 209 5 -108.21 gain 5 210 -116.92 gain 210 5 -121.82 gain 5 211 -113.58 gain 211 5 -115.87 gain 5 212 -103.11 gain 212 5 -103.95 gain 5 213 -103.10 gain 213 5 -106.68 gain 5 214 -106.26 gain 214 5 -108.02 gain 5 215 -109.22 gain 215 5 -112.80 gain 5 216 -108.55 gain 216 5 -109.02 gain 5 217 -106.69 gain 217 5 -111.61 gain 5 218 -102.89 gain 218 5 -109.13 gain 5 219 -108.22 gain 219 5 -112.03 gain 5 220 -102.00 gain 220 5 -102.93 gain 5 221 -107.47 gain 221 5 -109.39 gain 5 222 -116.27 gain 222 5 -114.77 gain 5 223 -109.74 gain 223 5 -110.52 gain 5 224 -109.34 gain 224 5 -107.05 gain 6 7 -74.38 gain 7 6 -73.47 gain 6 8 -83.84 gain 8 6 -81.58 gain 6 9 -91.92 gain 9 6 -91.85 gain 6 10 -88.51 gain 10 6 -86.90 gain 6 11 -102.67 gain 11 6 -100.52 gain 6 12 -98.31 gain 12 6 -93.21 gain 6 13 -105.96 gain 13 6 -103.87 gain 6 14 -105.03 gain 14 6 -102.42 gain 6 15 -105.97 gain 15 6 -106.09 gain 6 16 -101.77 gain 16 6 -97.33 gain 6 17 -89.79 gain 17 6 -90.87 gain 6 18 -101.67 gain 18 6 -96.80 gain 6 19 -88.92 gain 19 6 -92.35 gain 6 20 -79.26 gain 20 6 -78.85 gain 6 21 -73.49 gain 21 6 -72.88 gain 6 22 -83.33 gain 22 6 -81.06 gain 6 23 -81.13 gain 23 6 -81.31 gain 6 24 -94.39 gain 24 6 -92.47 gain 6 25 -91.64 gain 25 6 -90.70 gain 6 26 -99.81 gain 26 6 -99.34 gain 6 27 -100.93 gain 27 6 -99.79 gain 6 28 -94.93 gain 28 6 -95.74 gain 6 29 -107.73 gain 29 6 -100.17 gain 6 30 -105.08 gain 30 6 -109.22 gain 6 31 -104.52 gain 31 6 -105.74 gain 6 32 -101.39 gain 32 6 -97.75 gain 6 33 -97.72 gain 33 6 -92.85 gain 6 34 -87.38 gain 34 6 -89.49 gain 6 35 -83.49 gain 35 6 -83.52 gain 6 36 -83.01 gain 36 6 -81.85 gain 6 37 -94.35 gain 37 6 -92.59 gain 6 38 -89.14 gain 38 6 -88.59 gain 6 39 -93.58 gain 39 6 -90.50 gain 6 40 -103.76 gain 40 6 -102.73 gain 6 41 -105.07 gain 41 6 -103.69 gain 6 42 -100.42 gain 42 6 -102.06 gain 6 43 -99.13 gain 43 6 -101.28 gain 6 44 -99.14 gain 44 6 -99.28 gain 6 45 -96.47 gain 45 6 -92.64 gain 6 46 -93.16 gain 46 6 -92.20 gain 6 47 -88.34 gain 47 6 -89.23 gain 6 48 -91.57 gain 48 6 -89.47 gain 6 49 -94.84 gain 49 6 -89.38 gain 6 50 -95.23 gain 50 6 -91.66 gain 6 51 -92.23 gain 51 6 -90.44 gain 6 52 -86.09 gain 52 6 -80.74 gain 6 53 -89.56 gain 53 6 -88.70 gain 6 54 -86.75 gain 54 6 -82.40 gain 6 55 -92.71 gain 55 6 -91.49 gain 6 56 -92.39 gain 56 6 -94.27 gain 6 57 -101.37 gain 57 6 -105.29 gain 6 58 -102.53 gain 58 6 -105.99 gain 6 59 -102.26 gain 59 6 -103.88 gain 6 60 -105.36 gain 60 6 -105.39 gain 6 61 -104.83 gain 61 6 -97.75 gain 6 62 -105.29 gain 62 6 -101.01 gain 6 63 -98.52 gain 63 6 -93.25 gain 6 64 -93.15 gain 64 6 -92.26 gain 6 65 -88.96 gain 65 6 -88.11 gain 6 66 -104.54 gain 66 6 -103.00 gain 6 67 -101.92 gain 67 6 -100.50 gain 6 68 -92.80 gain 68 6 -91.33 gain 6 69 -95.93 gain 69 6 -92.73 gain 6 70 -98.87 gain 70 6 -98.37 gain 6 71 -104.85 gain 71 6 -105.10 gain 6 72 -98.40 gain 72 6 -100.50 gain 6 73 -103.76 gain 73 6 -102.91 gain 6 74 -109.97 gain 74 6 -105.12 gain 6 75 -97.47 gain 75 6 -93.00 gain 6 76 -103.18 gain 76 6 -101.21 gain 6 77 -100.44 gain 77 6 -96.76 gain 6 78 -101.40 gain 78 6 -106.36 gain 6 79 -100.09 gain 79 6 -99.60 gain 6 80 -93.77 gain 80 6 -91.61 gain 6 81 -89.37 gain 81 6 -91.48 gain 6 82 -97.86 gain 82 6 -99.13 gain 6 83 -104.17 gain 83 6 -105.02 gain 6 84 -96.73 gain 84 6 -94.66 gain 6 85 -94.78 gain 85 6 -97.28 gain 6 86 -104.69 gain 86 6 -100.38 gain 6 87 -103.90 gain 87 6 -102.38 gain 6 88 -107.15 gain 88 6 -105.92 gain 6 89 -104.78 gain 89 6 -104.19 gain 6 90 -109.37 gain 90 6 -112.30 gain 6 91 -108.28 gain 91 6 -106.80 gain 6 92 -104.83 gain 92 6 -106.92 gain 6 93 -104.63 gain 93 6 -100.64 gain 6 94 -95.78 gain 94 6 -94.22 gain 6 95 -100.08 gain 95 6 -101.57 gain 6 96 -99.85 gain 96 6 -97.61 gain 6 97 -101.67 gain 97 6 -100.70 gain 6 98 -102.00 gain 98 6 -98.21 gain 6 99 -102.20 gain 99 6 -102.50 gain 6 100 -101.53 gain 100 6 -99.67 gain 6 101 -99.55 gain 101 6 -96.35 gain 6 102 -113.18 gain 102 6 -110.65 gain 6 103 -107.49 gain 103 6 -104.18 gain 6 104 -108.00 gain 104 6 -101.12 gain 6 105 -105.48 gain 105 6 -104.00 gain 6 106 -109.41 gain 106 6 -107.24 gain 6 107 -107.78 gain 107 6 -108.62 gain 6 108 -111.14 gain 108 6 -110.05 gain 6 109 -100.72 gain 109 6 -96.47 gain 6 110 -99.54 gain 110 6 -97.54 gain 6 111 -108.11 gain 111 6 -103.30 gain 6 112 -104.68 gain 112 6 -101.87 gain 6 113 -103.53 gain 113 6 -107.66 gain 6 114 -111.98 gain 114 6 -111.74 gain 6 115 -99.92 gain 115 6 -100.54 gain 6 116 -104.44 gain 116 6 -101.09 gain 6 117 -105.77 gain 117 6 -102.26 gain 6 118 -111.01 gain 118 6 -115.67 gain 6 119 -106.89 gain 119 6 -103.10 gain 6 120 -100.35 gain 120 6 -96.66 gain 6 121 -103.61 gain 121 6 -102.67 gain 6 122 -106.58 gain 122 6 -108.21 gain 6 123 -106.26 gain 123 6 -108.15 gain 6 124 -107.01 gain 124 6 -102.49 gain 6 125 -104.41 gain 125 6 -101.83 gain 6 126 -97.58 gain 126 6 -99.88 gain 6 127 -106.00 gain 127 6 -103.06 gain 6 128 -104.08 gain 128 6 -104.19 gain 6 129 -106.98 gain 129 6 -104.31 gain 6 130 -96.44 gain 130 6 -95.95 gain 6 131 -102.92 gain 131 6 -100.79 gain 6 132 -112.61 gain 132 6 -106.75 gain 6 133 -102.27 gain 133 6 -100.84 gain 6 134 -108.10 gain 134 6 -104.67 gain 6 135 -111.55 gain 135 6 -103.71 gain 6 136 -112.41 gain 136 6 -113.34 gain 6 137 -112.13 gain 137 6 -109.72 gain 6 138 -105.61 gain 138 6 -105.21 gain 6 139 -105.37 gain 139 6 -106.68 gain 6 140 -111.05 gain 140 6 -112.17 gain 6 141 -101.26 gain 141 6 -98.06 gain 6 142 -108.35 gain 142 6 -106.31 gain 6 143 -105.52 gain 143 6 -105.92 gain 6 144 -108.49 gain 144 6 -104.80 gain 6 145 -105.99 gain 145 6 -106.85 gain 6 146 -108.23 gain 146 6 -105.53 gain 6 147 -106.50 gain 147 6 -105.00 gain 6 148 -104.19 gain 148 6 -103.21 gain 6 149 -107.16 gain 149 6 -102.56 gain 6 150 -108.19 gain 150 6 -106.98 gain 6 151 -107.46 gain 151 6 -108.72 gain 6 152 -104.87 gain 152 6 -104.49 gain 6 153 -111.45 gain 153 6 -110.76 gain 6 154 -110.25 gain 154 6 -110.69 gain 6 155 -112.73 gain 155 6 -110.47 gain 6 156 -109.29 gain 156 6 -108.16 gain 6 157 -105.68 gain 157 6 -105.85 gain 6 158 -112.77 gain 158 6 -114.90 gain 6 159 -115.15 gain 159 6 -111.32 gain 6 160 -110.43 gain 160 6 -107.98 gain 6 161 -106.82 gain 161 6 -105.42 gain 6 162 -108.04 gain 162 6 -106.27 gain 6 163 -111.35 gain 163 6 -107.01 gain 6 164 -113.35 gain 164 6 -116.23 gain 6 165 -113.55 gain 165 6 -113.78 gain 6 166 -110.77 gain 166 6 -112.66 gain 6 167 -103.65 gain 167 6 -104.37 gain 6 168 -116.27 gain 168 6 -116.05 gain 6 169 -97.50 gain 169 6 -93.80 gain 6 170 -106.86 gain 170 6 -104.10 gain 6 171 -107.14 gain 171 6 -104.94 gain 6 172 -103.93 gain 172 6 -104.53 gain 6 173 -106.07 gain 173 6 -101.00 gain 6 174 -111.86 gain 174 6 -112.74 gain 6 175 -113.59 gain 175 6 -106.27 gain 6 176 -101.65 gain 176 6 -98.55 gain 6 177 -110.77 gain 177 6 -110.04 gain 6 178 -112.34 gain 178 6 -109.21 gain 6 179 -114.72 gain 179 6 -114.63 gain 6 180 -105.24 gain 180 6 -103.89 gain 6 181 -112.83 gain 181 6 -114.88 gain 6 182 -105.81 gain 182 6 -104.00 gain 6 183 -106.38 gain 183 6 -100.45 gain 6 184 -102.26 gain 184 6 -102.55 gain 6 185 -106.47 gain 185 6 -105.26 gain 6 186 -103.76 gain 186 6 -103.26 gain 6 187 -108.19 gain 187 6 -107.71 gain 6 188 -101.06 gain 188 6 -105.02 gain 6 189 -113.68 gain 189 6 -113.70 gain 6 190 -111.95 gain 190 6 -104.81 gain 6 191 -114.29 gain 191 6 -110.32 gain 6 192 -109.52 gain 192 6 -109.22 gain 6 193 -118.16 gain 193 6 -113.88 gain 6 194 -110.22 gain 194 6 -105.84 gain 6 195 -108.25 gain 195 6 -101.84 gain 6 196 -112.27 gain 196 6 -113.53 gain 6 197 -108.51 gain 197 6 -107.25 gain 6 198 -107.07 gain 198 6 -108.46 gain 6 199 -107.65 gain 199 6 -103.05 gain 6 200 -105.88 gain 200 6 -103.20 gain 6 201 -105.33 gain 201 6 -105.74 gain 6 202 -111.04 gain 202 6 -109.75 gain 6 203 -112.40 gain 203 6 -111.20 gain 6 204 -114.72 gain 204 6 -111.74 gain 6 205 -107.52 gain 205 6 -104.21 gain 6 206 -116.67 gain 206 6 -114.68 gain 6 207 -107.95 gain 207 6 -103.71 gain 6 208 -124.76 gain 208 6 -123.82 gain 6 209 -115.50 gain 209 6 -113.60 gain 6 210 -114.21 gain 210 6 -116.31 gain 6 211 -113.63 gain 211 6 -113.12 gain 6 212 -109.14 gain 212 6 -107.18 gain 6 213 -110.09 gain 213 6 -110.87 gain 6 214 -106.61 gain 214 6 -105.57 gain 6 215 -107.63 gain 215 6 -108.40 gain 6 216 -112.80 gain 216 6 -110.47 gain 6 217 -106.56 gain 217 6 -108.68 gain 6 218 -115.01 gain 218 6 -118.45 gain 6 219 -108.65 gain 219 6 -109.66 gain 6 220 -116.12 gain 220 6 -114.24 gain 6 221 -107.61 gain 221 6 -106.73 gain 6 222 -105.76 gain 222 6 -101.46 gain 6 223 -112.92 gain 223 6 -110.90 gain 6 224 -107.65 gain 224 6 -102.56 gain 7 8 -77.04 gain 8 7 -75.68 gain 7 9 -83.50 gain 9 7 -84.34 gain 7 10 -81.65 gain 10 7 -80.94 gain 7 11 -97.12 gain 11 7 -95.87 gain 7 12 -100.78 gain 12 7 -96.58 gain 7 13 -102.25 gain 13 7 -101.07 gain 7 14 -100.93 gain 14 7 -99.23 gain 7 15 -103.56 gain 15 7 -104.58 gain 7 16 -95.81 gain 16 7 -92.26 gain 7 17 -97.59 gain 17 7 -99.57 gain 7 18 -94.85 gain 18 7 -90.90 gain 7 19 -94.46 gain 19 7 -98.79 gain 7 20 -84.88 gain 20 7 -85.38 gain 7 21 -85.60 gain 21 7 -85.90 gain 7 22 -79.02 gain 22 7 -77.66 gain 7 23 -80.92 gain 23 7 -82.00 gain 7 24 -87.76 gain 24 7 -86.75 gain 7 25 -87.62 gain 25 7 -87.58 gain 7 26 -91.44 gain 26 7 -91.87 gain 7 27 -91.60 gain 27 7 -91.37 gain 7 28 -98.97 gain 28 7 -100.69 gain 7 29 -104.74 gain 29 7 -98.09 gain 7 30 -106.23 gain 30 7 -111.27 gain 7 31 -104.98 gain 31 7 -107.10 gain 7 32 -92.81 gain 32 7 -90.07 gain 7 33 -98.30 gain 33 7 -94.34 gain 7 34 -94.16 gain 34 7 -97.19 gain 7 35 -89.33 gain 35 7 -90.27 gain 7 36 -84.47 gain 36 7 -84.21 gain 7 37 -89.72 gain 37 7 -88.87 gain 7 38 -91.56 gain 38 7 -91.91 gain 7 39 -86.28 gain 39 7 -84.10 gain 7 40 -93.31 gain 40 7 -93.19 gain 7 41 -91.52 gain 41 7 -91.04 gain 7 42 -98.54 gain 42 7 -101.08 gain 7 43 -102.76 gain 43 7 -105.82 gain 7 44 -92.71 gain 44 7 -93.76 gain 7 45 -97.47 gain 45 7 -94.54 gain 7 46 -100.98 gain 46 7 -100.93 gain 7 47 -100.17 gain 47 7 -101.97 gain 7 48 -95.38 gain 48 7 -94.18 gain 7 49 -87.79 gain 49 7 -83.23 gain 7 50 -94.31 gain 50 7 -91.64 gain 7 51 -90.32 gain 51 7 -89.44 gain 7 52 -86.05 gain 52 7 -81.60 gain 7 53 -89.10 gain 53 7 -89.14 gain 7 54 -97.48 gain 54 7 -94.04 gain 7 55 -100.45 gain 55 7 -100.14 gain 7 56 -92.71 gain 56 7 -95.49 gain 7 57 -92.27 gain 57 7 -97.09 gain 7 58 -101.24 gain 58 7 -105.61 gain 7 59 -106.01 gain 59 7 -108.54 gain 7 60 -98.93 gain 60 7 -99.87 gain 7 61 -103.26 gain 61 7 -97.08 gain 7 62 -101.24 gain 62 7 -97.86 gain 7 63 -106.05 gain 63 7 -101.68 gain 7 64 -89.61 gain 64 7 -89.63 gain 7 65 -99.28 gain 65 7 -99.34 gain 7 66 -92.84 gain 66 7 -92.20 gain 7 67 -95.26 gain 67 7 -94.75 gain 7 68 -96.81 gain 68 7 -96.26 gain 7 69 -90.31 gain 69 7 -88.01 gain 7 70 -101.26 gain 70 7 -101.67 gain 7 71 -103.35 gain 71 7 -104.51 gain 7 72 -101.20 gain 72 7 -104.20 gain 7 73 -100.70 gain 73 7 -100.77 gain 7 74 -102.07 gain 74 7 -98.12 gain 7 75 -103.60 gain 75 7 -100.04 gain 7 76 -109.41 gain 76 7 -108.35 gain 7 77 -103.99 gain 77 7 -101.23 gain 7 78 -100.41 gain 78 7 -106.28 gain 7 79 -94.38 gain 79 7 -94.79 gain 7 80 -93.12 gain 80 7 -91.87 gain 7 81 -100.42 gain 81 7 -103.43 gain 7 82 -102.22 gain 82 7 -104.40 gain 7 83 -92.48 gain 83 7 -94.23 gain 7 84 -104.37 gain 84 7 -103.20 gain 7 85 -102.56 gain 85 7 -105.97 gain 7 86 -98.41 gain 86 7 -95.01 gain 7 87 -100.86 gain 87 7 -100.25 gain 7 88 -101.01 gain 88 7 -100.68 gain 7 89 -108.55 gain 89 7 -108.86 gain 7 90 -107.00 gain 90 7 -110.84 gain 7 91 -109.19 gain 91 7 -108.62 gain 7 92 -103.07 gain 92 7 -106.07 gain 7 93 -109.55 gain 93 7 -106.46 gain 7 94 -101.94 gain 94 7 -101.29 gain 7 95 -97.31 gain 95 7 -99.70 gain 7 96 -96.06 gain 96 7 -94.73 gain 7 97 -97.34 gain 97 7 -97.28 gain 7 98 -97.84 gain 98 7 -94.95 gain 7 99 -95.42 gain 99 7 -96.63 gain 7 100 -105.38 gain 100 7 -104.42 gain 7 101 -101.53 gain 101 7 -99.24 gain 7 102 -98.45 gain 102 7 -96.82 gain 7 103 -99.32 gain 103 7 -96.92 gain 7 104 -106.17 gain 104 7 -100.20 gain 7 105 -99.47 gain 105 7 -98.90 gain 7 106 -111.12 gain 106 7 -109.85 gain 7 107 -102.62 gain 107 7 -104.37 gain 7 108 -102.09 gain 108 7 -101.91 gain 7 109 -101.76 gain 109 7 -98.42 gain 7 110 -101.91 gain 110 7 -100.81 gain 7 111 -104.44 gain 111 7 -100.53 gain 7 112 -96.68 gain 112 7 -94.78 gain 7 113 -103.69 gain 113 7 -108.72 gain 7 114 -99.17 gain 114 7 -99.83 gain 7 115 -97.56 gain 115 7 -99.08 gain 7 116 -100.16 gain 116 7 -97.70 gain 7 117 -108.38 gain 117 7 -105.78 gain 7 118 -96.98 gain 118 7 -102.55 gain 7 119 -112.10 gain 119 7 -109.22 gain 7 120 -107.56 gain 120 7 -104.78 gain 7 121 -103.99 gain 121 7 -103.95 gain 7 122 -105.62 gain 122 7 -108.15 gain 7 123 -106.59 gain 123 7 -109.38 gain 7 124 -102.05 gain 124 7 -98.44 gain 7 125 -100.97 gain 125 7 -99.30 gain 7 126 -107.73 gain 126 7 -110.93 gain 7 127 -106.42 gain 127 7 -104.38 gain 7 128 -98.02 gain 128 7 -99.04 gain 7 129 -103.04 gain 129 7 -101.28 gain 7 130 -99.07 gain 130 7 -99.48 gain 7 131 -110.06 gain 131 7 -108.84 gain 7 132 -102.41 gain 132 7 -97.46 gain 7 133 -101.65 gain 133 7 -101.13 gain 7 134 -106.97 gain 134 7 -104.44 gain 7 135 -107.97 gain 135 7 -101.03 gain 7 136 -104.13 gain 136 7 -105.97 gain 7 137 -113.19 gain 137 7 -111.69 gain 7 138 -106.15 gain 138 7 -106.66 gain 7 139 -101.18 gain 139 7 -103.40 gain 7 140 -99.54 gain 140 7 -101.56 gain 7 141 -98.87 gain 141 7 -96.59 gain 7 142 -105.45 gain 142 7 -104.31 gain 7 143 -103.12 gain 143 7 -104.43 gain 7 144 -108.06 gain 144 7 -105.28 gain 7 145 -109.32 gain 145 7 -111.09 gain 7 146 -100.19 gain 146 7 -98.40 gain 7 147 -111.03 gain 147 7 -110.43 gain 7 148 -111.68 gain 148 7 -111.60 gain 7 149 -107.23 gain 149 7 -103.54 gain 7 150 -106.66 gain 150 7 -106.35 gain 7 151 -102.27 gain 151 7 -104.43 gain 7 152 -101.92 gain 152 7 -102.45 gain 7 153 -107.36 gain 153 7 -107.58 gain 7 154 -104.52 gain 154 7 -105.88 gain 7 155 -99.67 gain 155 7 -98.32 gain 7 156 -109.98 gain 156 7 -109.75 gain 7 157 -109.45 gain 157 7 -110.52 gain 7 158 -111.46 gain 158 7 -114.50 gain 7 159 -109.46 gain 159 7 -106.53 gain 7 160 -106.69 gain 160 7 -105.14 gain 7 161 -104.87 gain 161 7 -104.38 gain 7 162 -107.03 gain 162 7 -106.17 gain 7 163 -103.47 gain 163 7 -100.02 gain 7 164 -107.88 gain 164 7 -111.67 gain 7 165 -113.01 gain 165 7 -114.15 gain 7 166 -99.89 gain 166 7 -102.69 gain 7 167 -109.06 gain 167 7 -110.69 gain 7 168 -104.31 gain 168 7 -104.99 gain 7 169 -107.29 gain 169 7 -104.49 gain 7 170 -105.14 gain 170 7 -103.28 gain 7 171 -108.42 gain 171 7 -107.14 gain 7 172 -109.64 gain 172 7 -111.15 gain 7 173 -104.71 gain 173 7 -100.54 gain 7 174 -106.84 gain 174 7 -108.63 gain 7 175 -111.52 gain 175 7 -105.10 gain 7 176 -102.91 gain 176 7 -100.72 gain 7 177 -106.94 gain 177 7 -107.11 gain 7 178 -114.99 gain 178 7 -112.77 gain 7 179 -113.57 gain 179 7 -114.39 gain 7 180 -112.48 gain 180 7 -112.04 gain 7 181 -105.93 gain 181 7 -108.89 gain 7 182 -114.43 gain 182 7 -113.52 gain 7 183 -107.08 gain 183 7 -102.06 gain 7 184 -108.59 gain 184 7 -109.79 gain 7 185 -111.67 gain 185 7 -111.37 gain 7 186 -108.91 gain 186 7 -109.31 gain 7 187 -101.65 gain 187 7 -102.08 gain 7 188 -103.06 gain 188 7 -107.93 gain 7 189 -108.29 gain 189 7 -109.22 gain 7 190 -107.69 gain 190 7 -101.45 gain 7 191 -111.90 gain 191 7 -108.84 gain 7 192 -108.42 gain 192 7 -109.02 gain 7 193 -114.81 gain 193 7 -111.44 gain 7 194 -108.57 gain 194 7 -105.09 gain 7 195 -107.05 gain 195 7 -101.54 gain 7 196 -106.91 gain 196 7 -109.07 gain 7 197 -98.94 gain 197 7 -98.59 gain 7 198 -110.06 gain 198 7 -112.35 gain 7 199 -108.34 gain 199 7 -104.65 gain 7 200 -116.43 gain 200 7 -114.65 gain 7 201 -113.14 gain 201 7 -114.46 gain 7 202 -112.07 gain 202 7 -111.68 gain 7 203 -112.57 gain 203 7 -112.28 gain 7 204 -117.44 gain 204 7 -115.37 gain 7 205 -113.31 gain 205 7 -110.90 gain 7 206 -107.20 gain 206 7 -106.12 gain 7 207 -103.85 gain 207 7 -100.51 gain 7 208 -116.86 gain 208 7 -116.83 gain 7 209 -113.85 gain 209 7 -112.86 gain 7 210 -111.94 gain 210 7 -114.94 gain 7 211 -107.35 gain 211 7 -107.75 gain 7 212 -112.03 gain 212 7 -110.97 gain 7 213 -108.39 gain 213 7 -110.08 gain 7 214 -111.76 gain 214 7 -111.63 gain 7 215 -103.79 gain 215 7 -105.47 gain 7 216 -108.72 gain 216 7 -107.30 gain 7 217 -110.59 gain 217 7 -113.61 gain 7 218 -114.58 gain 218 7 -118.92 gain 7 219 -117.99 gain 219 7 -119.91 gain 7 220 -112.32 gain 220 7 -111.35 gain 7 221 -113.32 gain 221 7 -113.34 gain 7 222 -116.46 gain 222 7 -113.06 gain 7 223 -112.00 gain 223 7 -110.89 gain 7 224 -120.33 gain 224 7 -116.14 gain 8 9 -75.51 gain 9 8 -77.70 gain 8 10 -79.54 gain 10 8 -80.19 gain 8 11 -81.86 gain 11 8 -81.96 gain 8 12 -89.79 gain 12 8 -86.95 gain 8 13 -97.72 gain 13 8 -97.89 gain 8 14 -98.80 gain 14 8 -98.45 gain 8 15 -99.87 gain 15 8 -102.25 gain 8 16 -105.63 gain 16 8 -103.45 gain 8 17 -95.48 gain 17 8 -98.82 gain 8 18 -98.71 gain 18 8 -96.11 gain 8 19 -87.89 gain 19 8 -93.57 gain 8 20 -87.11 gain 20 8 -88.97 gain 8 21 -85.12 gain 21 8 -86.77 gain 8 22 -77.82 gain 22 8 -77.81 gain 8 23 -82.62 gain 23 8 -85.05 gain 8 24 -86.81 gain 24 8 -87.15 gain 8 25 -83.99 gain 25 8 -85.31 gain 8 26 -91.74 gain 26 8 -93.52 gain 8 27 -95.21 gain 27 8 -96.34 gain 8 28 -101.09 gain 28 8 -104.17 gain 8 29 -102.45 gain 29 8 -97.16 gain 8 30 -101.72 gain 30 8 -108.12 gain 8 31 -108.13 gain 31 8 -111.61 gain 8 32 -95.60 gain 32 8 -94.21 gain 8 33 -102.98 gain 33 8 -100.37 gain 8 34 -94.14 gain 34 8 -98.52 gain 8 35 -88.49 gain 35 8 -90.77 gain 8 36 -84.96 gain 36 8 -86.06 gain 8 37 -80.61 gain 37 8 -81.12 gain 8 38 -83.02 gain 38 8 -84.73 gain 8 39 -83.01 gain 39 8 -82.18 gain 8 40 -90.42 gain 40 8 -91.65 gain 8 41 -87.12 gain 41 8 -88.00 gain 8 42 -94.09 gain 42 8 -97.99 gain 8 43 -97.15 gain 43 8 -101.56 gain 8 44 -96.69 gain 44 8 -99.09 gain 8 45 -106.68 gain 45 8 -105.11 gain 8 46 -101.51 gain 46 8 -102.81 gain 8 47 -100.15 gain 47 8 -103.30 gain 8 48 -89.76 gain 48 8 -89.91 gain 8 49 -100.08 gain 49 8 -96.87 gain 8 50 -92.97 gain 50 8 -91.65 gain 8 51 -96.89 gain 51 8 -97.36 gain 8 52 -91.19 gain 52 8 -88.09 gain 8 53 -87.09 gain 53 8 -88.49 gain 8 54 -96.35 gain 54 8 -94.26 gain 8 55 -98.38 gain 55 8 -99.42 gain 8 56 -94.67 gain 56 8 -98.81 gain 8 57 -98.90 gain 57 8 -105.08 gain 8 58 -98.83 gain 58 8 -104.55 gain 8 59 -96.51 gain 59 8 -100.39 gain 8 60 -102.09 gain 60 8 -104.39 gain 8 61 -103.86 gain 61 8 -99.04 gain 8 62 -99.75 gain 62 8 -97.72 gain 8 63 -100.33 gain 63 8 -97.31 gain 8 64 -97.61 gain 64 8 -98.98 gain 8 65 -100.47 gain 65 8 -101.88 gain 8 66 -93.59 gain 66 8 -94.31 gain 8 67 -93.00 gain 67 8 -93.84 gain 8 68 -96.59 gain 68 8 -97.39 gain 8 69 -92.97 gain 69 8 -92.02 gain 8 70 -95.56 gain 70 8 -97.31 gain 8 71 -88.90 gain 71 8 -91.41 gain 8 72 -101.33 gain 72 8 -105.69 gain 8 73 -96.34 gain 73 8 -97.75 gain 8 74 -104.65 gain 74 8 -102.06 gain 8 75 -100.12 gain 75 8 -97.91 gain 8 76 -96.00 gain 76 8 -96.29 gain 8 77 -101.49 gain 77 8 -100.08 gain 8 78 -104.27 gain 78 8 -111.49 gain 8 79 -92.84 gain 79 8 -94.61 gain 8 80 -96.90 gain 80 8 -97.00 gain 8 81 -94.45 gain 81 8 -98.81 gain 8 82 -92.90 gain 82 8 -96.43 gain 8 83 -96.77 gain 83 8 -99.88 gain 8 84 -94.34 gain 84 8 -94.53 gain 8 85 -98.95 gain 85 8 -103.71 gain 8 86 -93.12 gain 86 8 -91.07 gain 8 87 -87.12 gain 87 8 -87.87 gain 8 88 -95.65 gain 88 8 -96.67 gain 8 89 -107.81 gain 89 8 -109.48 gain 8 90 -100.16 gain 90 8 -105.36 gain 8 91 -107.48 gain 91 8 -108.27 gain 8 92 -104.15 gain 92 8 -108.51 gain 8 93 -102.52 gain 93 8 -100.79 gain 8 94 -101.11 gain 94 8 -101.81 gain 8 95 -98.22 gain 95 8 -101.96 gain 8 96 -105.24 gain 96 8 -105.26 gain 8 97 -94.43 gain 97 8 -95.73 gain 8 98 -97.15 gain 98 8 -95.62 gain 8 99 -92.48 gain 99 8 -95.04 gain 8 100 -106.22 gain 100 8 -106.61 gain 8 101 -100.94 gain 101 8 -100.00 gain 8 102 -108.78 gain 102 8 -108.50 gain 8 103 -106.38 gain 103 8 -105.33 gain 8 104 -99.21 gain 104 8 -94.59 gain 8 105 -100.59 gain 105 8 -101.37 gain 8 106 -102.90 gain 106 8 -102.99 gain 8 107 -102.77 gain 107 8 -105.87 gain 8 108 -97.53 gain 108 8 -98.69 gain 8 109 -100.53 gain 109 8 -98.55 gain 8 110 -104.72 gain 110 8 -104.97 gain 8 111 -102.27 gain 111 8 -99.72 gain 8 112 -97.94 gain 112 8 -97.40 gain 8 113 -96.74 gain 113 8 -103.13 gain 8 114 -97.27 gain 114 8 -99.29 gain 8 115 -98.18 gain 115 8 -101.05 gain 8 116 -106.76 gain 116 8 -105.67 gain 8 117 -101.80 gain 117 8 -100.55 gain 8 118 -106.31 gain 118 8 -113.23 gain 8 119 -104.58 gain 119 8 -103.05 gain 8 120 -108.52 gain 120 8 -107.10 gain 8 121 -111.81 gain 121 8 -113.13 gain 8 122 -107.70 gain 122 8 -111.59 gain 8 123 -108.80 gain 123 8 -112.95 gain 8 124 -102.06 gain 124 8 -99.80 gain 8 125 -96.09 gain 125 8 -95.77 gain 8 126 -102.96 gain 126 8 -107.52 gain 8 127 -100.61 gain 127 8 -99.93 gain 8 128 -101.45 gain 128 8 -103.82 gain 8 129 -96.88 gain 129 8 -96.47 gain 8 130 -103.64 gain 130 8 -105.41 gain 8 131 -95.19 gain 131 8 -95.32 gain 8 132 -103.78 gain 132 8 -100.18 gain 8 133 -101.08 gain 133 8 -101.91 gain 8 134 -99.06 gain 134 8 -97.88 gain 8 135 -110.39 gain 135 8 -104.80 gain 8 136 -99.32 gain 136 8 -102.51 gain 8 137 -107.23 gain 137 8 -107.08 gain 8 138 -102.58 gain 138 8 -104.45 gain 8 139 -110.18 gain 139 8 -113.75 gain 8 140 -102.52 gain 140 8 -105.90 gain 8 141 -101.01 gain 141 8 -100.08 gain 8 142 -105.99 gain 142 8 -106.21 gain 8 143 -104.32 gain 143 8 -106.99 gain 8 144 -106.95 gain 144 8 -105.52 gain 8 145 -102.03 gain 145 8 -105.15 gain 8 146 -106.54 gain 146 8 -106.10 gain 8 147 -106.28 gain 147 8 -107.03 gain 8 148 -105.84 gain 148 8 -107.12 gain 8 149 -106.43 gain 149 8 -104.09 gain 8 150 -109.82 gain 150 8 -110.86 gain 8 151 -108.24 gain 151 8 -111.76 gain 8 152 -119.37 gain 152 8 -121.25 gain 8 153 -104.67 gain 153 8 -106.25 gain 8 154 -100.72 gain 154 8 -103.42 gain 8 155 -109.16 gain 155 8 -109.16 gain 8 156 -104.53 gain 156 8 -105.65 gain 8 157 -102.65 gain 157 8 -105.07 gain 8 158 -101.04 gain 158 8 -105.43 gain 8 159 -107.39 gain 159 8 -105.82 gain 8 160 -114.76 gain 160 8 -114.57 gain 8 161 -104.33 gain 161 8 -105.19 gain 8 162 -103.39 gain 162 8 -103.89 gain 8 163 -106.80 gain 163 8 -104.72 gain 8 164 -102.21 gain 164 8 -107.35 gain 8 165 -105.98 gain 165 8 -108.48 gain 8 166 -115.20 gain 166 8 -119.35 gain 8 167 -114.86 gain 167 8 -117.84 gain 8 168 -104.22 gain 168 8 -106.26 gain 8 169 -102.95 gain 169 8 -101.50 gain 8 170 -115.52 gain 170 8 -115.02 gain 8 171 -107.75 gain 171 8 -107.81 gain 8 172 -100.60 gain 172 8 -103.46 gain 8 173 -97.94 gain 173 8 -95.12 gain 8 174 -107.35 gain 174 8 -110.49 gain 8 175 -107.09 gain 175 8 -102.03 gain 8 176 -111.62 gain 176 8 -110.78 gain 8 177 -109.49 gain 177 8 -111.01 gain 8 178 -109.18 gain 178 8 -108.31 gain 8 179 -103.27 gain 179 8 -105.45 gain 8 180 -110.32 gain 180 8 -111.23 gain 8 181 -109.20 gain 181 8 -113.51 gain 8 182 -103.18 gain 182 8 -103.62 gain 8 183 -108.38 gain 183 8 -104.71 gain 8 184 -109.28 gain 184 8 -111.83 gain 8 185 -104.46 gain 185 8 -105.52 gain 8 186 -105.38 gain 186 8 -107.13 gain 8 187 -108.82 gain 187 8 -110.61 gain 8 188 -103.26 gain 188 8 -109.49 gain 8 189 -115.20 gain 189 8 -117.48 gain 8 190 -109.51 gain 190 8 -104.63 gain 8 191 -105.47 gain 191 8 -103.75 gain 8 192 -114.87 gain 192 8 -116.83 gain 8 193 -108.79 gain 193 8 -106.78 gain 8 194 -108.73 gain 194 8 -106.60 gain 8 195 -109.00 gain 195 8 -104.84 gain 8 196 -110.79 gain 196 8 -114.30 gain 8 197 -112.03 gain 197 8 -113.04 gain 8 198 -106.48 gain 198 8 -110.13 gain 8 199 -108.72 gain 199 8 -106.39 gain 8 200 -101.88 gain 200 8 -101.46 gain 8 201 -106.03 gain 201 8 -108.70 gain 8 202 -108.09 gain 202 8 -109.05 gain 8 203 -106.31 gain 203 8 -107.38 gain 8 204 -107.47 gain 204 8 -106.76 gain 8 205 -118.73 gain 205 8 -117.68 gain 8 206 -111.01 gain 206 8 -111.28 gain 8 207 -112.25 gain 207 8 -110.27 gain 8 208 -104.18 gain 208 8 -105.50 gain 8 209 -107.92 gain 209 8 -108.28 gain 8 210 -117.12 gain 210 8 -121.48 gain 8 211 -109.64 gain 211 8 -111.39 gain 8 212 -114.53 gain 212 8 -114.83 gain 8 213 -106.15 gain 213 8 -109.19 gain 8 214 -113.41 gain 214 8 -114.63 gain 8 215 -110.23 gain 215 8 -113.27 gain 8 216 -111.23 gain 216 8 -111.16 gain 8 217 -109.88 gain 217 8 -114.26 gain 8 218 -113.38 gain 218 8 -119.07 gain 8 219 -117.38 gain 219 8 -120.65 gain 8 220 -107.20 gain 220 8 -107.59 gain 8 221 -96.46 gain 221 8 -97.84 gain 8 222 -115.18 gain 222 8 -113.14 gain 8 223 -112.38 gain 223 8 -112.62 gain 8 224 -108.73 gain 224 8 -105.91 gain 9 10 -74.63 gain 10 9 -73.10 gain 9 11 -79.76 gain 11 9 -77.67 gain 9 12 -96.02 gain 12 9 -90.99 gain 9 13 -101.06 gain 13 9 -99.04 gain 9 14 -92.52 gain 14 9 -89.98 gain 9 15 -108.67 gain 15 9 -108.86 gain 9 16 -107.75 gain 16 9 -103.37 gain 9 17 -97.56 gain 17 9 -98.71 gain 9 18 -98.82 gain 18 9 -94.02 gain 9 19 -94.53 gain 19 9 -98.02 gain 9 20 -102.09 gain 20 9 -101.75 gain 9 21 -90.67 gain 21 9 -90.13 gain 9 22 -90.73 gain 22 9 -88.53 gain 9 23 -92.18 gain 23 9 -92.43 gain 9 24 -72.24 gain 24 9 -70.39 gain 9 25 -79.50 gain 25 9 -78.63 gain 9 26 -88.10 gain 26 9 -87.70 gain 9 27 -87.37 gain 27 9 -86.31 gain 9 28 -94.51 gain 28 9 -95.40 gain 9 29 -94.09 gain 29 9 -86.60 gain 9 30 -109.61 gain 30 9 -113.81 gain 9 31 -105.12 gain 31 9 -106.41 gain 9 32 -102.17 gain 32 9 -98.60 gain 9 33 -103.75 gain 33 9 -98.95 gain 9 34 -98.79 gain 34 9 -100.97 gain 9 35 -88.05 gain 35 9 -88.15 gain 9 36 -93.56 gain 36 9 -92.47 gain 9 37 -91.92 gain 37 9 -90.23 gain 9 38 -78.52 gain 38 9 -78.05 gain 9 39 -89.04 gain 39 9 -86.03 gain 9 40 -88.30 gain 40 9 -87.34 gain 9 41 -88.13 gain 41 9 -86.82 gain 9 42 -104.29 gain 42 9 -106.00 gain 9 43 -93.56 gain 43 9 -95.79 gain 9 44 -94.58 gain 44 9 -94.80 gain 9 45 -112.03 gain 45 9 -108.27 gain 9 46 -103.43 gain 46 9 -102.55 gain 9 47 -102.88 gain 47 9 -103.84 gain 9 48 -100.34 gain 48 9 -98.31 gain 9 49 -88.84 gain 49 9 -83.45 gain 9 50 -96.78 gain 50 9 -93.28 gain 9 51 -95.94 gain 51 9 -94.23 gain 9 52 -104.11 gain 52 9 -98.82 gain 9 53 -92.57 gain 53 9 -91.78 gain 9 54 -94.52 gain 54 9 -90.25 gain 9 55 -90.05 gain 55 9 -88.91 gain 9 56 -102.80 gain 56 9 -104.75 gain 9 57 -94.01 gain 57 9 -98.00 gain 9 58 -93.27 gain 58 9 -96.80 gain 9 59 -102.55 gain 59 9 -104.25 gain 9 60 -104.48 gain 60 9 -104.58 gain 9 61 -109.01 gain 61 9 -102.00 gain 9 62 -112.78 gain 62 9 -108.57 gain 9 63 -104.72 gain 63 9 -99.52 gain 9 64 -107.48 gain 64 9 -106.67 gain 9 65 -100.73 gain 65 9 -99.96 gain 9 66 -101.90 gain 66 9 -100.43 gain 9 67 -100.12 gain 67 9 -98.77 gain 9 68 -93.55 gain 68 9 -92.16 gain 9 69 -86.34 gain 69 9 -83.21 gain 9 70 -93.46 gain 70 9 -93.03 gain 9 71 -93.80 gain 71 9 -94.13 gain 9 72 -101.18 gain 72 9 -103.35 gain 9 73 -99.72 gain 73 9 -98.95 gain 9 74 -101.32 gain 74 9 -96.54 gain 9 75 -107.56 gain 75 9 -103.16 gain 9 76 -104.33 gain 76 9 -102.43 gain 9 77 -107.39 gain 77 9 -103.79 gain 9 78 -109.10 gain 78 9 -114.13 gain 9 79 -105.76 gain 79 9 -105.34 gain 9 80 -99.82 gain 80 9 -97.72 gain 9 81 -110.03 gain 81 9 -112.21 gain 9 82 -105.03 gain 82 9 -106.37 gain 9 83 -96.90 gain 83 9 -97.82 gain 9 84 -98.33 gain 84 9 -96.33 gain 9 85 -94.49 gain 85 9 -97.06 gain 9 86 -91.04 gain 86 9 -86.80 gain 9 87 -95.15 gain 87 9 -93.71 gain 9 88 -94.34 gain 88 9 -93.18 gain 9 89 -103.44 gain 89 9 -102.92 gain 9 90 -106.48 gain 90 9 -109.49 gain 9 91 -105.79 gain 91 9 -104.39 gain 9 92 -98.39 gain 92 9 -100.56 gain 9 93 -109.96 gain 93 9 -106.04 gain 9 94 -100.76 gain 94 9 -99.27 gain 9 95 -96.64 gain 95 9 -98.20 gain 9 96 -101.86 gain 96 9 -99.68 gain 9 97 -102.61 gain 97 9 -101.71 gain 9 98 -91.88 gain 98 9 -88.16 gain 9 99 -101.69 gain 99 9 -102.06 gain 9 100 -100.60 gain 100 9 -98.81 gain 9 101 -101.89 gain 101 9 -98.76 gain 9 102 -99.98 gain 102 9 -97.51 gain 9 103 -110.06 gain 103 9 -106.83 gain 9 104 -102.43 gain 104 9 -95.62 gain 9 105 -110.17 gain 105 9 -108.76 gain 9 106 -106.23 gain 106 9 -104.13 gain 9 107 -114.95 gain 107 9 -115.87 gain 9 108 -110.68 gain 108 9 -109.66 gain 9 109 -108.02 gain 109 9 -103.85 gain 9 110 -103.05 gain 110 9 -101.12 gain 9 111 -105.48 gain 111 9 -100.74 gain 9 112 -105.37 gain 112 9 -102.63 gain 9 113 -101.72 gain 113 9 -105.92 gain 9 114 -98.11 gain 114 9 -97.95 gain 9 115 -106.56 gain 115 9 -107.25 gain 9 116 -102.84 gain 116 9 -99.55 gain 9 117 -103.51 gain 117 9 -100.06 gain 9 118 -105.63 gain 118 9 -110.36 gain 9 119 -107.79 gain 119 9 -104.07 gain 9 120 -115.99 gain 120 9 -112.37 gain 9 121 -109.94 gain 121 9 -109.06 gain 9 122 -106.74 gain 122 9 -108.44 gain 9 123 -104.86 gain 123 9 -106.82 gain 9 124 -106.23 gain 124 9 -101.78 gain 9 125 -107.64 gain 125 9 -105.13 gain 9 126 -106.71 gain 126 9 -109.08 gain 9 127 -98.53 gain 127 9 -95.66 gain 9 128 -104.20 gain 128 9 -104.38 gain 9 129 -101.61 gain 129 9 -99.01 gain 9 130 -101.87 gain 130 9 -101.45 gain 9 131 -108.17 gain 131 9 -106.11 gain 9 132 -100.15 gain 132 9 -94.36 gain 9 133 -104.37 gain 133 9 -103.02 gain 9 134 -108.47 gain 134 9 -105.11 gain 9 135 -107.68 gain 135 9 -99.91 gain 9 136 -105.24 gain 136 9 -106.25 gain 9 137 -105.81 gain 137 9 -103.47 gain 9 138 -109.71 gain 138 9 -109.39 gain 9 139 -110.15 gain 139 9 -111.53 gain 9 140 -107.72 gain 140 9 -108.91 gain 9 141 -105.25 gain 141 9 -102.13 gain 9 142 -102.13 gain 142 9 -100.16 gain 9 143 -105.61 gain 143 9 -106.09 gain 9 144 -104.52 gain 144 9 -100.90 gain 9 145 -105.04 gain 145 9 -105.97 gain 9 146 -106.00 gain 146 9 -103.37 gain 9 147 -106.40 gain 147 9 -104.97 gain 9 148 -106.34 gain 148 9 -105.44 gain 9 149 -108.26 gain 149 9 -103.73 gain 9 150 -108.01 gain 150 9 -106.86 gain 9 151 -110.63 gain 151 9 -111.96 gain 9 152 -112.26 gain 152 9 -111.95 gain 9 153 -109.50 gain 153 9 -108.89 gain 9 154 -105.50 gain 154 9 -106.01 gain 9 155 -111.77 gain 155 9 -109.58 gain 9 156 -113.00 gain 156 9 -111.94 gain 9 157 -106.49 gain 157 9 -106.73 gain 9 158 -101.91 gain 158 9 -104.11 gain 9 159 -111.85 gain 159 9 -108.09 gain 9 160 -109.45 gain 160 9 -107.07 gain 9 161 -111.11 gain 161 9 -109.78 gain 9 162 -103.54 gain 162 9 -101.84 gain 9 163 -106.70 gain 163 9 -102.42 gain 9 164 -113.51 gain 164 9 -116.46 gain 9 165 -113.49 gain 165 9 -113.80 gain 9 166 -110.60 gain 166 9 -112.56 gain 9 167 -115.65 gain 167 9 -116.44 gain 9 168 -115.11 gain 168 9 -114.96 gain 9 169 -111.05 gain 169 9 -107.42 gain 9 170 -110.72 gain 170 9 -108.03 gain 9 171 -113.01 gain 171 9 -110.88 gain 9 172 -114.06 gain 172 9 -114.74 gain 9 173 -109.89 gain 173 9 -104.89 gain 9 174 -99.17 gain 174 9 -100.13 gain 9 175 -106.52 gain 175 9 -99.27 gain 9 176 -108.75 gain 176 9 -105.72 gain 9 177 -113.26 gain 177 9 -112.60 gain 9 178 -106.88 gain 178 9 -103.82 gain 9 179 -113.22 gain 179 9 -113.20 gain 9 180 -113.35 gain 180 9 -112.07 gain 9 181 -105.54 gain 181 9 -107.66 gain 9 182 -107.14 gain 182 9 -105.39 gain 9 183 -114.94 gain 183 9 -109.08 gain 9 184 -113.32 gain 184 9 -113.68 gain 9 185 -106.40 gain 185 9 -105.27 gain 9 186 -110.52 gain 186 9 -110.09 gain 9 187 -100.28 gain 187 9 -99.88 gain 9 188 -111.68 gain 188 9 -115.71 gain 9 189 -109.58 gain 189 9 -109.67 gain 9 190 -110.82 gain 190 9 -103.74 gain 9 191 -116.65 gain 191 9 -112.74 gain 9 192 -106.56 gain 192 9 -106.33 gain 9 193 -106.50 gain 193 9 -102.29 gain 9 194 -113.68 gain 194 9 -109.37 gain 9 195 -110.63 gain 195 9 -104.28 gain 9 196 -118.74 gain 196 9 -120.06 gain 9 197 -113.28 gain 197 9 -112.09 gain 9 198 -111.02 gain 198 9 -112.47 gain 9 199 -107.57 gain 199 9 -103.04 gain 9 200 -108.34 gain 200 9 -105.73 gain 9 201 -115.53 gain 201 9 -116.02 gain 9 202 -112.31 gain 202 9 -111.09 gain 9 203 -111.95 gain 203 9 -110.82 gain 9 204 -110.77 gain 204 9 -107.87 gain 9 205 -110.19 gain 205 9 -106.95 gain 9 206 -106.48 gain 206 9 -104.57 gain 9 207 -109.83 gain 207 9 -105.66 gain 9 208 -105.46 gain 208 9 -104.59 gain 9 209 -111.94 gain 209 9 -110.11 gain 9 210 -108.29 gain 210 9 -110.46 gain 9 211 -112.35 gain 211 9 -111.91 gain 9 212 -107.58 gain 212 9 -105.69 gain 9 213 -104.77 gain 213 9 -105.62 gain 9 214 -106.33 gain 214 9 -105.36 gain 9 215 -101.11 gain 215 9 -101.96 gain 9 216 -108.43 gain 216 9 -106.17 gain 9 217 -111.98 gain 217 9 -114.17 gain 9 218 -114.24 gain 218 9 -117.75 gain 9 219 -114.09 gain 219 9 -115.17 gain 9 220 -110.88 gain 220 9 -109.07 gain 9 221 -105.14 gain 221 9 -104.32 gain 9 222 -110.85 gain 222 9 -106.62 gain 9 223 -113.88 gain 223 9 -111.94 gain 9 224 -106.20 gain 224 9 -101.19 gain 10 11 -81.30 gain 11 10 -80.76 gain 10 12 -82.21 gain 12 10 -78.72 gain 10 13 -83.13 gain 13 10 -82.65 gain 10 14 -97.28 gain 14 10 -96.28 gain 10 15 -108.56 gain 15 10 -110.29 gain 10 16 -105.26 gain 16 10 -102.43 gain 10 17 -106.80 gain 17 10 -109.49 gain 10 18 -99.62 gain 18 10 -96.36 gain 10 19 -106.52 gain 19 10 -111.55 gain 10 20 -96.63 gain 20 10 -97.84 gain 10 21 -93.76 gain 21 10 -94.76 gain 10 22 -88.64 gain 22 10 -87.98 gain 10 23 -89.93 gain 23 10 -91.71 gain 10 24 -89.40 gain 24 10 -89.09 gain 10 25 -73.81 gain 25 10 -74.48 gain 10 26 -78.75 gain 26 10 -79.89 gain 10 27 -83.06 gain 27 10 -83.53 gain 10 28 -90.58 gain 28 10 -93.01 gain 10 29 -93.41 gain 29 10 -87.46 gain 10 30 -110.50 gain 30 10 -116.24 gain 10 31 -101.12 gain 31 10 -103.94 gain 10 32 -108.64 gain 32 10 -106.60 gain 10 33 -91.81 gain 33 10 -88.54 gain 10 34 -101.65 gain 34 10 -105.37 gain 10 35 -100.65 gain 35 10 -102.28 gain 10 36 -98.51 gain 36 10 -98.96 gain 10 37 -94.50 gain 37 10 -94.35 gain 10 38 -92.28 gain 38 10 -93.34 gain 10 39 -90.18 gain 39 10 -88.70 gain 10 40 -86.83 gain 40 10 -87.41 gain 10 41 -89.43 gain 41 10 -89.66 gain 10 42 -80.06 gain 42 10 -83.31 gain 10 43 -89.48 gain 43 10 -93.24 gain 10 44 -87.32 gain 44 10 -89.08 gain 10 45 -110.23 gain 45 10 -108.01 gain 10 46 -101.72 gain 46 10 -102.37 gain 10 47 -101.68 gain 47 10 -104.18 gain 10 48 -101.33 gain 48 10 -100.83 gain 10 49 -97.98 gain 49 10 -94.13 gain 10 50 -97.01 gain 50 10 -95.05 gain 10 51 -94.72 gain 51 10 -94.55 gain 10 52 -92.18 gain 52 10 -88.43 gain 10 53 -88.63 gain 53 10 -89.38 gain 10 54 -92.58 gain 54 10 -89.85 gain 10 55 -88.93 gain 55 10 -89.32 gain 10 56 -92.93 gain 56 10 -96.41 gain 10 57 -97.48 gain 57 10 -103.00 gain 10 58 -94.69 gain 58 10 -99.76 gain 10 59 -94.79 gain 59 10 -98.03 gain 10 60 -109.47 gain 60 10 -111.12 gain 10 61 -105.71 gain 61 10 -100.24 gain 10 62 -101.00 gain 62 10 -98.32 gain 10 63 -99.33 gain 63 10 -95.66 gain 10 64 -96.94 gain 64 10 -97.66 gain 10 65 -100.47 gain 65 10 -101.23 gain 10 66 -96.53 gain 66 10 -96.60 gain 10 67 -95.95 gain 67 10 -96.14 gain 10 68 -96.34 gain 68 10 -96.49 gain 10 69 -91.27 gain 69 10 -89.68 gain 10 70 -89.64 gain 70 10 -90.75 gain 10 71 -89.53 gain 71 10 -91.40 gain 10 72 -94.26 gain 72 10 -97.97 gain 10 73 -103.47 gain 73 10 -104.24 gain 10 74 -94.08 gain 74 10 -90.84 gain 10 75 -102.07 gain 75 10 -99.21 gain 10 76 -113.19 gain 76 10 -112.82 gain 10 77 -102.22 gain 77 10 -100.16 gain 10 78 -104.46 gain 78 10 -111.03 gain 10 79 -107.42 gain 79 10 -108.53 gain 10 80 -91.47 gain 80 10 -90.92 gain 10 81 -97.51 gain 81 10 -101.23 gain 10 82 -103.47 gain 82 10 -106.35 gain 10 83 -102.89 gain 83 10 -105.35 gain 10 84 -98.70 gain 84 10 -98.24 gain 10 85 -93.87 gain 85 10 -97.98 gain 10 86 -94.80 gain 86 10 -92.10 gain 10 87 -103.51 gain 87 10 -103.61 gain 10 88 -96.19 gain 88 10 -96.57 gain 10 89 -98.51 gain 89 10 -99.52 gain 10 90 -106.92 gain 90 10 -111.47 gain 10 91 -103.34 gain 91 10 -103.48 gain 10 92 -102.36 gain 92 10 -106.06 gain 10 93 -98.16 gain 93 10 -95.78 gain 10 94 -107.91 gain 94 10 -107.96 gain 10 95 -100.89 gain 95 10 -103.98 gain 10 96 -104.06 gain 96 10 -103.42 gain 10 97 -100.07 gain 97 10 -100.71 gain 10 98 -96.69 gain 98 10 -94.51 gain 10 99 -90.59 gain 99 10 -92.50 gain 10 100 -99.19 gain 100 10 -98.94 gain 10 101 -99.37 gain 101 10 -97.78 gain 10 102 -98.66 gain 102 10 -97.73 gain 10 103 -98.46 gain 103 10 -96.76 gain 10 104 -95.12 gain 104 10 -89.85 gain 10 105 -105.69 gain 105 10 -105.83 gain 10 106 -104.59 gain 106 10 -104.03 gain 10 107 -110.42 gain 107 10 -112.87 gain 10 108 -106.38 gain 108 10 -106.90 gain 10 109 -102.49 gain 109 10 -99.85 gain 10 110 -103.90 gain 110 10 -103.50 gain 10 111 -103.02 gain 111 10 -99.82 gain 10 112 -103.85 gain 112 10 -102.65 gain 10 113 -91.42 gain 113 10 -97.16 gain 10 114 -97.20 gain 114 10 -98.57 gain 10 115 -109.09 gain 115 10 -111.31 gain 10 116 -98.77 gain 116 10 -97.02 gain 10 117 -102.94 gain 117 10 -101.03 gain 10 118 -104.25 gain 118 10 -110.52 gain 10 119 -100.82 gain 119 10 -98.64 gain 10 120 -107.58 gain 120 10 -105.51 gain 10 121 -106.66 gain 121 10 -107.32 gain 10 122 -105.74 gain 122 10 -108.98 gain 10 123 -103.40 gain 123 10 -106.89 gain 10 124 -109.31 gain 124 10 -106.41 gain 10 125 -104.03 gain 125 10 -103.06 gain 10 126 -104.20 gain 126 10 -108.11 gain 10 127 -99.50 gain 127 10 -98.17 gain 10 128 -102.82 gain 128 10 -104.54 gain 10 129 -109.10 gain 129 10 -108.04 gain 10 130 -96.61 gain 130 10 -97.73 gain 10 131 -99.59 gain 131 10 -99.07 gain 10 132 -95.71 gain 132 10 -91.46 gain 10 133 -103.74 gain 133 10 -103.92 gain 10 134 -100.43 gain 134 10 -98.61 gain 10 135 -117.33 gain 135 10 -111.10 gain 10 136 -110.22 gain 136 10 -112.76 gain 10 137 -111.90 gain 137 10 -111.10 gain 10 138 -107.39 gain 138 10 -108.61 gain 10 139 -106.86 gain 139 10 -109.78 gain 10 140 -103.46 gain 140 10 -106.18 gain 10 141 -101.84 gain 141 10 -100.26 gain 10 142 -108.07 gain 142 10 -107.64 gain 10 143 -111.09 gain 143 10 -113.11 gain 10 144 -103.31 gain 144 10 -101.23 gain 10 145 -105.90 gain 145 10 -108.37 gain 10 146 -107.22 gain 146 10 -106.14 gain 10 147 -101.00 gain 147 10 -101.11 gain 10 148 -103.17 gain 148 10 -103.80 gain 10 149 -108.07 gain 149 10 -105.08 gain 10 150 -100.21 gain 150 10 -100.60 gain 10 151 -115.23 gain 151 10 -118.10 gain 10 152 -106.45 gain 152 10 -107.68 gain 10 153 -107.72 gain 153 10 -108.65 gain 10 154 -112.99 gain 154 10 -115.04 gain 10 155 -109.60 gain 155 10 -108.95 gain 10 156 -115.03 gain 156 10 -115.50 gain 10 157 -102.09 gain 157 10 -103.87 gain 10 158 -96.81 gain 158 10 -100.56 gain 10 159 -102.23 gain 159 10 -100.01 gain 10 160 -102.55 gain 160 10 -101.71 gain 10 161 -113.25 gain 161 10 -113.46 gain 10 162 -108.09 gain 162 10 -107.93 gain 10 163 -101.01 gain 163 10 -98.27 gain 10 164 -104.93 gain 164 10 -109.41 gain 10 165 -110.99 gain 165 10 -112.84 gain 10 166 -111.85 gain 166 10 -115.35 gain 10 167 -104.96 gain 167 10 -107.29 gain 10 168 -114.94 gain 168 10 -116.33 gain 10 169 -106.87 gain 169 10 -104.77 gain 10 170 -107.93 gain 170 10 -106.78 gain 10 171 -106.12 gain 171 10 -105.53 gain 10 172 -104.98 gain 172 10 -107.19 gain 10 173 -97.88 gain 173 10 -94.42 gain 10 174 -104.26 gain 174 10 -106.75 gain 10 175 -109.02 gain 175 10 -103.31 gain 10 176 -106.46 gain 176 10 -104.97 gain 10 177 -108.39 gain 177 10 -109.26 gain 10 178 -111.80 gain 178 10 -110.28 gain 10 179 -108.99 gain 179 10 -110.52 gain 10 180 -111.16 gain 180 10 -111.42 gain 10 181 -112.89 gain 181 10 -116.55 gain 10 182 -111.52 gain 182 10 -111.31 gain 10 183 -108.70 gain 183 10 -104.37 gain 10 184 -100.28 gain 184 10 -102.19 gain 10 185 -116.18 gain 185 10 -116.58 gain 10 186 -107.76 gain 186 10 -108.86 gain 10 187 -106.73 gain 187 10 -107.87 gain 10 188 -113.01 gain 188 10 -118.58 gain 10 189 -105.39 gain 189 10 -107.02 gain 10 190 -106.17 gain 190 10 -100.63 gain 10 191 -107.27 gain 191 10 -104.91 gain 10 192 -107.25 gain 192 10 -108.56 gain 10 193 -106.72 gain 193 10 -104.05 gain 10 194 -116.83 gain 194 10 -114.05 gain 10 195 -109.61 gain 195 10 -104.81 gain 10 196 -116.79 gain 196 10 -119.65 gain 10 197 -111.59 gain 197 10 -111.94 gain 10 198 -110.22 gain 198 10 -113.22 gain 10 199 -104.02 gain 199 10 -101.03 gain 10 200 -108.97 gain 200 10 -107.90 gain 10 201 -109.07 gain 201 10 -111.09 gain 10 202 -104.40 gain 202 10 -104.72 gain 10 203 -108.93 gain 203 10 -109.35 gain 10 204 -108.72 gain 204 10 -107.36 gain 10 205 -103.83 gain 205 10 -102.13 gain 10 206 -102.90 gain 206 10 -102.52 gain 10 207 -103.11 gain 207 10 -100.48 gain 10 208 -111.79 gain 208 10 -112.45 gain 10 209 -112.42 gain 209 10 -112.13 gain 10 210 -111.51 gain 210 10 -115.22 gain 10 211 -109.43 gain 211 10 -110.53 gain 10 212 -108.88 gain 212 10 -108.53 gain 10 213 -110.96 gain 213 10 -113.35 gain 10 214 -106.02 gain 214 10 -106.59 gain 10 215 -109.19 gain 215 10 -111.57 gain 10 216 -112.53 gain 216 10 -111.81 gain 10 217 -104.25 gain 217 10 -107.98 gain 10 218 -106.04 gain 218 10 -111.09 gain 10 219 -109.32 gain 219 10 -111.94 gain 10 220 -108.00 gain 220 10 -107.73 gain 10 221 -102.48 gain 221 10 -103.20 gain 10 222 -112.78 gain 222 10 -110.08 gain 10 223 -105.21 gain 223 10 -104.80 gain 10 224 -117.06 gain 224 10 -113.58 gain 11 12 -74.31 gain 12 11 -71.37 gain 11 13 -88.17 gain 13 11 -88.23 gain 11 14 -89.71 gain 14 11 -89.26 gain 11 15 -105.94 gain 15 11 -108.21 gain 11 16 -106.24 gain 16 11 -103.95 gain 11 17 -104.89 gain 17 11 -108.12 gain 11 18 -103.38 gain 18 11 -100.68 gain 11 19 -96.83 gain 19 11 -102.41 gain 11 20 -104.45 gain 20 11 -106.20 gain 11 21 -101.22 gain 21 11 -102.76 gain 11 22 -93.98 gain 22 11 -93.87 gain 11 23 -97.22 gain 23 11 -99.55 gain 11 24 -91.13 gain 24 11 -91.37 gain 11 25 -83.62 gain 25 11 -84.84 gain 11 26 -68.40 gain 26 11 -70.08 gain 11 27 -76.85 gain 27 11 -77.87 gain 11 28 -86.52 gain 28 11 -89.49 gain 11 29 -87.36 gain 29 11 -81.96 gain 11 30 -107.35 gain 30 11 -113.64 gain 11 31 -106.63 gain 31 11 -110.01 gain 11 32 -103.76 gain 32 11 -102.27 gain 11 33 -109.33 gain 33 11 -106.61 gain 11 34 -102.00 gain 34 11 -106.27 gain 11 35 -97.08 gain 35 11 -99.26 gain 11 36 -93.98 gain 36 11 -94.98 gain 11 37 -102.43 gain 37 11 -102.83 gain 11 38 -94.53 gain 38 11 -96.13 gain 11 39 -89.35 gain 39 11 -88.42 gain 11 40 -83.29 gain 40 11 -84.42 gain 11 41 -83.39 gain 41 11 -84.16 gain 11 42 -82.50 gain 42 11 -86.30 gain 11 43 -90.73 gain 43 11 -95.04 gain 11 44 -98.14 gain 44 11 -100.44 gain 11 45 -117.44 gain 45 11 -115.77 gain 11 46 -105.02 gain 46 11 -106.22 gain 11 47 -109.91 gain 47 11 -112.95 gain 11 48 -106.76 gain 48 11 -106.81 gain 11 49 -102.01 gain 49 11 -98.70 gain 11 50 -99.19 gain 50 11 -97.77 gain 11 51 -94.91 gain 51 11 -95.28 gain 11 52 -92.43 gain 52 11 -89.23 gain 11 53 -90.82 gain 53 11 -92.12 gain 11 54 -91.96 gain 54 11 -89.77 gain 11 55 -86.35 gain 55 11 -87.29 gain 11 56 -90.09 gain 56 11 -94.12 gain 11 57 -94.87 gain 57 11 -100.94 gain 11 58 -90.61 gain 58 11 -96.22 gain 11 59 -98.37 gain 59 11 -102.15 gain 11 60 -107.05 gain 60 11 -109.24 gain 11 61 -105.63 gain 61 11 -100.71 gain 11 62 -108.31 gain 62 11 -106.18 gain 11 63 -96.99 gain 63 11 -93.88 gain 11 64 -103.30 gain 64 11 -104.57 gain 11 65 -94.46 gain 65 11 -95.77 gain 11 66 -94.57 gain 66 11 -95.19 gain 11 67 -99.34 gain 67 11 -100.07 gain 11 68 -96.55 gain 68 11 -97.24 gain 11 69 -90.43 gain 69 11 -89.39 gain 11 70 -91.97 gain 70 11 -93.62 gain 11 71 -95.75 gain 71 11 -98.16 gain 11 72 -87.75 gain 72 11 -92.01 gain 11 73 -91.10 gain 73 11 -92.41 gain 11 74 -91.07 gain 74 11 -88.38 gain 11 75 -110.19 gain 75 11 -107.88 gain 11 76 -100.75 gain 76 11 -100.93 gain 11 77 -104.20 gain 77 11 -102.69 gain 11 78 -105.96 gain 78 11 -113.08 gain 11 79 -107.89 gain 79 11 -109.55 gain 11 80 -104.55 gain 80 11 -104.54 gain 11 81 -99.05 gain 81 11 -103.31 gain 11 82 -101.09 gain 82 11 -104.52 gain 11 83 -98.87 gain 83 11 -101.88 gain 11 84 -96.34 gain 84 11 -96.42 gain 11 85 -103.70 gain 85 11 -108.36 gain 11 86 -90.45 gain 86 11 -88.29 gain 11 87 -94.81 gain 87 11 -95.46 gain 11 88 -96.02 gain 88 11 -96.94 gain 11 89 -103.82 gain 89 11 -105.38 gain 11 90 -103.51 gain 90 11 -108.61 gain 11 91 -109.64 gain 91 11 -110.32 gain 11 92 -101.24 gain 92 11 -105.49 gain 11 93 -109.94 gain 93 11 -108.10 gain 11 94 -103.43 gain 94 11 -104.03 gain 11 95 -95.88 gain 95 11 -99.52 gain 11 96 -102.98 gain 96 11 -102.89 gain 11 97 -104.92 gain 97 11 -106.11 gain 11 98 -102.43 gain 98 11 -100.80 gain 11 99 -99.21 gain 99 11 -101.66 gain 11 100 -98.50 gain 100 11 -98.79 gain 11 101 -98.55 gain 101 11 -97.50 gain 11 102 -96.95 gain 102 11 -96.56 gain 11 103 -91.96 gain 103 11 -90.81 gain 11 104 -105.13 gain 104 11 -100.41 gain 11 105 -109.62 gain 105 11 -110.29 gain 11 106 -106.67 gain 106 11 -106.66 gain 11 107 -107.58 gain 107 11 -110.58 gain 11 108 -104.23 gain 108 11 -105.30 gain 11 109 -104.04 gain 109 11 -101.95 gain 11 110 -96.09 gain 110 11 -96.24 gain 11 111 -102.55 gain 111 11 -99.90 gain 11 112 -101.43 gain 112 11 -100.77 gain 11 113 -106.51 gain 113 11 -112.79 gain 11 114 -99.04 gain 114 11 -100.96 gain 11 115 -98.63 gain 115 11 -101.40 gain 11 116 -102.75 gain 116 11 -101.55 gain 11 117 -96.88 gain 117 11 -95.53 gain 11 118 -99.83 gain 118 11 -106.64 gain 11 119 -101.29 gain 119 11 -99.66 gain 11 120 -104.10 gain 120 11 -102.57 gain 11 121 -111.02 gain 121 11 -112.24 gain 11 122 -109.79 gain 122 11 -113.58 gain 11 123 -108.76 gain 123 11 -112.80 gain 11 124 -100.16 gain 124 11 -97.80 gain 11 125 -105.18 gain 125 11 -104.76 gain 11 126 -103.24 gain 126 11 -107.70 gain 11 127 -111.47 gain 127 11 -110.68 gain 11 128 -98.06 gain 128 11 -100.33 gain 11 129 -104.65 gain 129 11 -104.13 gain 11 130 -105.62 gain 130 11 -107.29 gain 11 131 -110.65 gain 131 11 -110.68 gain 11 132 -106.77 gain 132 11 -103.07 gain 11 133 -100.02 gain 133 11 -100.74 gain 11 134 -99.36 gain 134 11 -98.08 gain 11 135 -105.31 gain 135 11 -99.62 gain 11 136 -110.41 gain 136 11 -113.49 gain 11 137 -111.82 gain 137 11 -111.57 gain 11 138 -104.16 gain 138 11 -105.92 gain 11 139 -107.30 gain 139 11 -110.76 gain 11 140 -102.84 gain 140 11 -106.11 gain 11 141 -103.38 gain 141 11 -102.35 gain 11 142 -94.62 gain 142 11 -94.73 gain 11 143 -104.88 gain 143 11 -107.44 gain 11 144 -101.86 gain 144 11 -100.32 gain 11 145 -101.30 gain 145 11 -104.31 gain 11 146 -100.79 gain 146 11 -100.25 gain 11 147 -104.57 gain 147 11 -105.22 gain 11 148 -102.33 gain 148 11 -103.50 gain 11 149 -105.67 gain 149 11 -103.23 gain 11 150 -109.62 gain 150 11 -110.56 gain 11 151 -112.21 gain 151 11 -115.62 gain 11 152 -112.98 gain 152 11 -114.75 gain 11 153 -105.86 gain 153 11 -107.33 gain 11 154 -102.90 gain 154 11 -105.50 gain 11 155 -105.70 gain 155 11 -105.60 gain 11 156 -109.15 gain 156 11 -110.17 gain 11 157 -104.51 gain 157 11 -106.83 gain 11 158 -101.90 gain 158 11 -106.19 gain 11 159 -101.31 gain 159 11 -99.64 gain 11 160 -112.04 gain 160 11 -111.75 gain 11 161 -102.66 gain 161 11 -103.42 gain 11 162 -110.70 gain 162 11 -111.08 gain 11 163 -107.77 gain 163 11 -105.57 gain 11 164 -108.35 gain 164 11 -113.39 gain 11 165 -104.59 gain 165 11 -106.98 gain 11 166 -104.54 gain 166 11 -108.59 gain 11 167 -101.87 gain 167 11 -104.74 gain 11 168 -104.15 gain 168 11 -106.09 gain 11 169 -109.79 gain 169 11 -108.24 gain 11 170 -109.51 gain 170 11 -108.90 gain 11 171 -101.62 gain 171 11 -101.58 gain 11 172 -112.97 gain 172 11 -115.73 gain 11 173 -110.70 gain 173 11 -107.78 gain 11 174 -110.44 gain 174 11 -113.48 gain 11 175 -103.37 gain 175 11 -98.21 gain 11 176 -108.02 gain 176 11 -107.08 gain 11 177 -108.79 gain 177 11 -110.21 gain 11 178 -99.98 gain 178 11 -99.01 gain 11 179 -105.57 gain 179 11 -107.63 gain 11 180 -110.83 gain 180 11 -111.64 gain 11 181 -116.99 gain 181 11 -121.19 gain 11 182 -112.30 gain 182 11 -112.63 gain 11 183 -106.77 gain 183 11 -102.99 gain 11 184 -105.93 gain 184 11 -108.38 gain 11 185 -113.11 gain 185 11 -114.06 gain 11 186 -109.17 gain 186 11 -110.83 gain 11 187 -106.07 gain 187 11 -107.75 gain 11 188 -106.15 gain 188 11 -112.27 gain 11 189 -96.40 gain 189 11 -98.58 gain 11 190 -113.36 gain 190 11 -108.37 gain 11 191 -102.40 gain 191 11 -100.58 gain 11 192 -105.88 gain 192 11 -107.74 gain 11 193 -106.30 gain 193 11 -104.18 gain 11 194 -108.43 gain 194 11 -106.20 gain 11 195 -107.52 gain 195 11 -103.26 gain 11 196 -113.26 gain 196 11 -116.67 gain 11 197 -111.45 gain 197 11 -112.35 gain 11 198 -106.31 gain 198 11 -109.85 gain 11 199 -108.02 gain 199 11 -105.58 gain 11 200 -110.37 gain 200 11 -109.85 gain 11 201 -108.18 gain 201 11 -110.75 gain 11 202 -108.76 gain 202 11 -109.62 gain 11 203 -107.02 gain 203 11 -107.98 gain 11 204 -109.65 gain 204 11 -108.83 gain 11 205 -110.44 gain 205 11 -109.29 gain 11 206 -114.28 gain 206 11 -114.45 gain 11 207 -105.05 gain 207 11 -102.96 gain 11 208 -111.96 gain 208 11 -113.18 gain 11 209 -106.14 gain 209 11 -106.39 gain 11 210 -115.22 gain 210 11 -119.47 gain 11 211 -106.08 gain 211 11 -107.73 gain 11 212 -111.09 gain 212 11 -111.29 gain 11 213 -107.68 gain 213 11 -110.61 gain 11 214 -114.96 gain 214 11 -116.07 gain 11 215 -112.62 gain 215 11 -115.55 gain 11 216 -105.88 gain 216 11 -105.70 gain 11 217 -110.54 gain 217 11 -114.81 gain 11 218 -114.92 gain 218 11 -120.51 gain 11 219 -108.41 gain 219 11 -111.57 gain 11 220 -102.27 gain 220 11 -102.55 gain 11 221 -110.07 gain 221 11 -111.35 gain 11 222 -110.73 gain 222 11 -108.57 gain 11 223 -112.12 gain 223 11 -112.26 gain 11 224 -100.10 gain 224 11 -97.17 gain 12 13 -72.62 gain 13 12 -75.63 gain 12 14 -75.03 gain 14 12 -77.52 gain 12 15 -96.40 gain 15 12 -101.62 gain 12 16 -103.50 gain 16 12 -104.16 gain 12 17 -101.36 gain 17 12 -107.55 gain 12 18 -99.37 gain 18 12 -99.61 gain 12 19 -95.11 gain 19 12 -103.63 gain 12 20 -95.59 gain 20 12 -100.29 gain 12 21 -94.60 gain 21 12 -99.09 gain 12 22 -97.65 gain 22 12 -100.48 gain 12 23 -95.58 gain 23 12 -100.86 gain 12 24 -85.09 gain 24 12 -88.27 gain 12 25 -76.60 gain 25 12 -80.76 gain 12 26 -73.27 gain 26 12 -77.89 gain 12 27 -75.34 gain 27 12 -79.30 gain 12 28 -79.55 gain 28 12 -85.47 gain 12 29 -86.16 gain 29 12 -83.70 gain 12 30 -105.29 gain 30 12 -114.53 gain 12 31 -103.85 gain 31 12 -110.17 gain 12 32 -113.74 gain 32 12 -115.20 gain 12 33 -102.36 gain 33 12 -102.59 gain 12 34 -99.49 gain 34 12 -106.71 gain 12 35 -97.06 gain 35 12 -102.18 gain 12 36 -96.04 gain 36 12 -99.98 gain 12 37 -94.94 gain 37 12 -98.28 gain 12 38 -91.57 gain 38 12 -96.12 gain 12 39 -88.10 gain 39 12 -90.12 gain 12 40 -84.83 gain 40 12 -88.90 gain 12 41 -83.42 gain 41 12 -87.13 gain 12 42 -80.84 gain 42 12 -87.57 gain 12 43 -85.47 gain 43 12 -92.72 gain 12 44 -89.19 gain 44 12 -94.44 gain 12 45 -102.11 gain 45 12 -103.38 gain 12 46 -105.01 gain 46 12 -109.15 gain 12 47 -109.05 gain 47 12 -115.04 gain 12 48 -100.67 gain 48 12 -103.67 gain 12 49 -105.78 gain 49 12 -105.41 gain 12 50 -97.62 gain 50 12 -99.15 gain 12 51 -93.43 gain 51 12 -96.75 gain 12 52 -92.70 gain 52 12 -92.44 gain 12 53 -91.16 gain 53 12 -95.40 gain 12 54 -90.32 gain 54 12 -91.07 gain 12 55 -91.49 gain 55 12 -95.37 gain 12 56 -91.62 gain 56 12 -98.60 gain 12 57 -95.21 gain 57 12 -104.22 gain 12 58 -87.87 gain 58 12 -96.43 gain 12 59 -86.56 gain 59 12 -93.28 gain 12 60 -102.21 gain 60 12 -107.34 gain 12 61 -101.13 gain 61 12 -99.15 gain 12 62 -101.68 gain 62 12 -102.50 gain 12 63 -97.85 gain 63 12 -97.68 gain 12 64 -96.55 gain 64 12 -100.76 gain 12 65 -95.68 gain 65 12 -99.94 gain 12 66 -102.79 gain 66 12 -106.35 gain 12 67 -93.81 gain 67 12 -97.49 gain 12 68 -96.95 gain 68 12 -100.59 gain 12 69 -84.77 gain 69 12 -86.67 gain 12 70 -91.21 gain 70 12 -95.80 gain 12 71 -89.40 gain 71 12 -94.76 gain 12 72 -88.19 gain 72 12 -95.39 gain 12 73 -87.46 gain 73 12 -91.72 gain 12 74 -95.05 gain 74 12 -95.30 gain 12 75 -110.64 gain 75 12 -111.27 gain 12 76 -107.39 gain 76 12 -110.52 gain 12 77 -101.94 gain 77 12 -103.37 gain 12 78 -103.24 gain 78 12 -113.30 gain 12 79 -102.59 gain 79 12 -107.19 gain 12 80 -97.34 gain 80 12 -100.28 gain 12 81 -97.52 gain 81 12 -104.73 gain 12 82 -96.92 gain 82 12 -103.29 gain 12 83 -93.31 gain 83 12 -99.25 gain 12 84 -101.25 gain 84 12 -104.28 gain 12 85 -95.10 gain 85 12 -102.71 gain 12 86 -89.63 gain 86 12 -90.42 gain 12 87 -93.40 gain 87 12 -96.99 gain 12 88 -95.23 gain 88 12 -99.10 gain 12 89 -86.94 gain 89 12 -91.45 gain 12 90 -103.83 gain 90 12 -111.87 gain 12 91 -101.56 gain 91 12 -105.18 gain 12 92 -97.91 gain 92 12 -105.11 gain 12 93 -93.54 gain 93 12 -94.65 gain 12 94 -98.76 gain 94 12 -102.31 gain 12 95 -98.92 gain 95 12 -105.50 gain 12 96 -106.87 gain 96 12 -109.72 gain 12 97 -104.45 gain 97 12 -108.58 gain 12 98 -99.05 gain 98 12 -100.36 gain 12 99 -96.82 gain 99 12 -102.22 gain 12 100 -103.24 gain 100 12 -106.48 gain 12 101 -97.87 gain 101 12 -99.77 gain 12 102 -93.60 gain 102 12 -96.16 gain 12 103 -88.40 gain 103 12 -90.20 gain 12 104 -97.04 gain 104 12 -95.26 gain 12 105 -106.12 gain 105 12 -109.74 gain 12 106 -109.64 gain 106 12 -112.57 gain 12 107 -103.79 gain 107 12 -109.73 gain 12 108 -100.40 gain 108 12 -104.41 gain 12 109 -100.18 gain 109 12 -101.03 gain 12 110 -106.85 gain 110 12 -109.95 gain 12 111 -99.17 gain 111 12 -99.46 gain 12 112 -101.62 gain 112 12 -103.91 gain 12 113 -94.83 gain 113 12 -104.06 gain 12 114 -96.70 gain 114 12 -101.56 gain 12 115 -94.60 gain 115 12 -100.32 gain 12 116 -98.82 gain 116 12 -100.57 gain 12 117 -96.51 gain 117 12 -98.10 gain 12 118 -97.14 gain 118 12 -106.90 gain 12 119 -98.99 gain 119 12 -100.30 gain 12 120 -106.02 gain 120 12 -107.43 gain 12 121 -103.68 gain 121 12 -107.84 gain 12 122 -106.58 gain 122 12 -113.31 gain 12 123 -105.33 gain 123 12 -112.31 gain 12 124 -95.31 gain 124 12 -95.89 gain 12 125 -112.21 gain 125 12 -114.73 gain 12 126 -109.24 gain 126 12 -116.64 gain 12 127 -94.04 gain 127 12 -96.19 gain 12 128 -98.98 gain 128 12 -104.19 gain 12 129 -101.59 gain 129 12 -104.02 gain 12 130 -104.69 gain 130 12 -109.30 gain 12 131 -94.51 gain 131 12 -97.48 gain 12 132 -93.96 gain 132 12 -93.21 gain 12 133 -102.46 gain 133 12 -106.13 gain 12 134 -94.76 gain 134 12 -96.43 gain 12 135 -103.51 gain 135 12 -100.76 gain 12 136 -107.79 gain 136 12 -113.82 gain 12 137 -103.53 gain 137 12 -106.22 gain 12 138 -103.93 gain 138 12 -108.63 gain 12 139 -98.44 gain 139 12 -104.85 gain 12 140 -101.29 gain 140 12 -107.51 gain 12 141 -102.82 gain 141 12 -104.73 gain 12 142 -105.00 gain 142 12 -108.06 gain 12 143 -93.61 gain 143 12 -99.12 gain 12 144 -87.56 gain 144 12 -88.97 gain 12 145 -100.03 gain 145 12 -105.99 gain 12 146 -103.25 gain 146 12 -105.65 gain 12 147 -108.71 gain 147 12 -112.31 gain 12 148 -98.95 gain 148 12 -103.07 gain 12 149 -104.33 gain 149 12 -104.83 gain 12 150 -106.01 gain 150 12 -109.89 gain 12 151 -101.00 gain 151 12 -107.36 gain 12 152 -100.40 gain 152 12 -105.12 gain 12 153 -104.42 gain 153 12 -108.83 gain 12 154 -107.83 gain 154 12 -113.37 gain 12 155 -106.86 gain 155 12 -109.70 gain 12 156 -105.90 gain 156 12 -109.86 gain 12 157 -100.63 gain 157 12 -105.90 gain 12 158 -103.18 gain 158 12 -110.41 gain 12 159 -108.53 gain 159 12 -109.80 gain 12 160 -99.66 gain 160 12 -102.31 gain 12 161 -100.63 gain 161 12 -104.33 gain 12 162 -98.65 gain 162 12 -101.98 gain 12 163 -105.40 gain 163 12 -106.15 gain 12 164 -109.72 gain 164 12 -117.70 gain 12 165 -108.56 gain 165 12 -113.89 gain 12 166 -108.19 gain 166 12 -115.18 gain 12 167 -111.23 gain 167 12 -117.04 gain 12 168 -110.53 gain 168 12 -115.41 gain 12 169 -107.81 gain 169 12 -109.20 gain 12 170 -100.90 gain 170 12 -103.23 gain 12 171 -108.03 gain 171 12 -110.93 gain 12 172 -110.68 gain 172 12 -116.38 gain 12 173 -99.34 gain 173 12 -99.36 gain 12 174 -102.76 gain 174 12 -108.74 gain 12 175 -106.06 gain 175 12 -103.84 gain 12 176 -102.07 gain 176 12 -104.07 gain 12 177 -100.93 gain 177 12 -105.29 gain 12 178 -101.32 gain 178 12 -103.28 gain 12 179 -97.87 gain 179 12 -102.88 gain 12 180 -114.61 gain 180 12 -118.36 gain 12 181 -107.00 gain 181 12 -114.15 gain 12 182 -114.72 gain 182 12 -118.00 gain 12 183 -111.87 gain 183 12 -111.04 gain 12 184 -108.61 gain 184 12 -114.01 gain 12 185 -101.52 gain 185 12 -105.41 gain 12 186 -101.99 gain 186 12 -106.59 gain 12 187 -103.83 gain 187 12 -108.46 gain 12 188 -101.79 gain 188 12 -110.85 gain 12 189 -104.02 gain 189 12 -109.14 gain 12 190 -110.92 gain 190 12 -108.87 gain 12 191 -105.92 gain 191 12 -107.04 gain 12 192 -100.91 gain 192 12 -105.71 gain 12 193 -110.21 gain 193 12 -111.04 gain 12 194 -104.81 gain 194 12 -105.52 gain 12 195 -107.92 gain 195 12 -106.60 gain 12 196 -111.47 gain 196 12 -117.82 gain 12 197 -108.94 gain 197 12 -112.78 gain 12 198 -104.99 gain 198 12 -111.48 gain 12 199 -111.07 gain 199 12 -111.57 gain 12 200 -113.11 gain 200 12 -115.53 gain 12 201 -108.55 gain 201 12 -114.06 gain 12 202 -98.39 gain 202 12 -102.19 gain 12 203 -111.07 gain 203 12 -114.97 gain 12 204 -107.61 gain 204 12 -109.74 gain 12 205 -111.42 gain 205 12 -113.21 gain 12 206 -106.60 gain 206 12 -109.71 gain 12 207 -106.30 gain 207 12 -107.15 gain 12 208 -106.10 gain 208 12 -110.26 gain 12 209 -101.41 gain 209 12 -104.61 gain 12 210 -120.39 gain 210 12 -127.59 gain 12 211 -113.06 gain 211 12 -117.65 gain 12 212 -107.86 gain 212 12 -111.00 gain 12 213 -103.09 gain 213 12 -108.97 gain 12 214 -105.43 gain 214 12 -109.49 gain 12 215 -103.32 gain 215 12 -109.19 gain 12 216 -105.82 gain 216 12 -108.59 gain 12 217 -115.27 gain 217 12 -122.49 gain 12 218 -110.43 gain 218 12 -118.96 gain 12 219 -101.27 gain 219 12 -107.38 gain 12 220 -114.06 gain 220 12 -117.28 gain 12 221 -105.79 gain 221 12 -110.00 gain 12 222 -110.88 gain 222 12 -111.67 gain 12 223 -103.22 gain 223 12 -106.31 gain 12 224 -112.24 gain 224 12 -112.25 gain 13 14 -77.22 gain 14 13 -76.70 gain 13 15 -118.45 gain 15 13 -120.66 gain 13 16 -110.09 gain 16 13 -107.73 gain 13 17 -104.61 gain 17 13 -107.78 gain 13 18 -107.65 gain 18 13 -104.88 gain 13 19 -103.54 gain 19 13 -109.05 gain 13 20 -102.39 gain 20 13 -104.07 gain 13 21 -95.73 gain 21 13 -97.21 gain 13 22 -101.88 gain 22 13 -101.70 gain 13 23 -97.47 gain 23 13 -99.73 gain 13 24 -93.65 gain 24 13 -93.82 gain 13 25 -86.23 gain 25 13 -87.38 gain 13 26 -80.85 gain 26 13 -82.46 gain 13 27 -73.72 gain 27 13 -74.67 gain 13 28 -69.30 gain 28 13 -72.20 gain 13 29 -75.33 gain 29 13 -69.86 gain 13 30 -106.58 gain 30 13 -112.80 gain 13 31 -110.36 gain 31 13 -113.67 gain 13 32 -102.33 gain 32 13 -100.77 gain 13 33 -108.09 gain 33 13 -105.31 gain 13 34 -105.39 gain 34 13 -109.59 gain 13 35 -100.76 gain 35 13 -102.88 gain 13 36 -106.41 gain 36 13 -107.35 gain 13 37 -92.42 gain 37 13 -92.76 gain 13 38 -97.73 gain 38 13 -99.27 gain 13 39 -88.15 gain 39 13 -87.15 gain 13 40 -88.24 gain 40 13 -89.31 gain 13 41 -81.91 gain 41 13 -82.61 gain 13 42 -81.14 gain 42 13 -84.87 gain 13 43 -84.71 gain 43 13 -88.96 gain 13 44 -88.59 gain 44 13 -90.82 gain 13 45 -109.93 gain 45 13 -108.19 gain 13 46 -103.98 gain 46 13 -105.12 gain 13 47 -99.65 gain 47 13 -102.63 gain 13 48 -104.94 gain 48 13 -104.93 gain 13 49 -105.11 gain 49 13 -101.74 gain 13 50 -102.50 gain 50 13 -101.02 gain 13 51 -97.09 gain 51 13 -97.40 gain 13 52 -99.89 gain 52 13 -96.63 gain 13 53 -106.76 gain 53 13 -107.99 gain 13 54 -96.29 gain 54 13 -94.03 gain 13 55 -91.37 gain 55 13 -92.24 gain 13 56 -90.69 gain 56 13 -94.66 gain 13 57 -92.03 gain 57 13 -98.04 gain 13 58 -89.60 gain 58 13 -95.15 gain 13 59 -90.39 gain 59 13 -94.10 gain 13 60 -113.10 gain 60 13 -115.22 gain 13 61 -107.32 gain 61 13 -102.33 gain 13 62 -105.66 gain 62 13 -103.46 gain 13 63 -96.62 gain 63 13 -93.44 gain 13 64 -107.69 gain 64 13 -108.89 gain 13 65 -103.63 gain 65 13 -104.87 gain 13 66 -104.29 gain 66 13 -104.84 gain 13 67 -99.17 gain 67 13 -99.84 gain 13 68 -91.01 gain 68 13 -91.64 gain 13 69 -97.62 gain 69 13 -96.50 gain 13 70 -87.94 gain 70 13 -89.52 gain 13 71 -96.65 gain 71 13 -98.99 gain 13 72 -97.34 gain 72 13 -101.54 gain 13 73 -91.63 gain 73 13 -92.87 gain 13 74 -85.22 gain 74 13 -82.46 gain 13 75 -102.42 gain 75 13 -100.05 gain 13 76 -109.36 gain 76 13 -109.48 gain 13 77 -109.50 gain 77 13 -107.92 gain 13 78 -106.73 gain 78 13 -113.78 gain 13 79 -103.10 gain 79 13 -104.69 gain 13 80 -107.20 gain 80 13 -107.13 gain 13 81 -94.57 gain 81 13 -98.77 gain 13 82 -107.64 gain 82 13 -111.00 gain 13 83 -100.03 gain 83 13 -102.97 gain 13 84 -97.57 gain 84 13 -97.58 gain 13 85 -101.03 gain 85 13 -105.62 gain 13 86 -100.83 gain 86 13 -98.61 gain 13 87 -93.42 gain 87 13 -93.99 gain 13 88 -97.47 gain 88 13 -98.33 gain 13 89 -101.86 gain 89 13 -103.35 gain 13 90 -112.14 gain 90 13 -117.16 gain 13 91 -107.67 gain 91 13 -108.28 gain 13 92 -101.85 gain 92 13 -106.04 gain 13 93 -105.79 gain 93 13 -103.89 gain 13 94 -102.58 gain 94 13 -103.11 gain 13 95 -104.23 gain 95 13 -107.80 gain 13 96 -106.28 gain 96 13 -106.13 gain 13 97 -110.46 gain 97 13 -111.58 gain 13 98 -103.54 gain 98 13 -101.84 gain 13 99 -102.20 gain 99 13 -104.59 gain 13 100 -98.96 gain 100 13 -99.19 gain 13 101 -102.30 gain 101 13 -101.19 gain 13 102 -97.49 gain 102 13 -97.04 gain 13 103 -94.31 gain 103 13 -93.09 gain 13 104 -103.26 gain 104 13 -98.47 gain 13 105 -106.58 gain 105 13 -107.20 gain 13 106 -111.51 gain 106 13 -111.42 gain 13 107 -109.89 gain 107 13 -112.83 gain 13 108 -108.20 gain 108 13 -109.19 gain 13 109 -112.24 gain 109 13 -110.09 gain 13 110 -106.58 gain 110 13 -106.66 gain 13 111 -113.75 gain 111 13 -111.03 gain 13 112 -98.82 gain 112 13 -98.10 gain 13 113 -98.95 gain 113 13 -105.17 gain 13 114 -107.27 gain 114 13 -109.12 gain 13 115 -99.83 gain 115 13 -102.54 gain 13 116 -106.11 gain 116 13 -104.84 gain 13 117 -102.18 gain 117 13 -100.75 gain 13 118 -104.06 gain 118 13 -110.81 gain 13 119 -95.64 gain 119 13 -93.94 gain 13 120 -107.99 gain 120 13 -106.39 gain 13 121 -112.72 gain 121 13 -113.87 gain 13 122 -113.28 gain 122 13 -117.00 gain 13 123 -108.26 gain 123 13 -112.24 gain 13 124 -109.71 gain 124 13 -107.29 gain 13 125 -101.95 gain 125 13 -101.46 gain 13 126 -101.10 gain 126 13 -105.50 gain 13 127 -106.18 gain 127 13 -105.33 gain 13 128 -110.27 gain 128 13 -112.48 gain 13 129 -101.75 gain 129 13 -101.17 gain 13 130 -99.47 gain 130 13 -101.07 gain 13 131 -101.09 gain 131 13 -101.05 gain 13 132 -103.86 gain 132 13 -100.09 gain 13 133 -93.67 gain 133 13 -94.33 gain 13 134 -99.14 gain 134 13 -97.79 gain 13 135 -117.01 gain 135 13 -111.25 gain 13 136 -102.28 gain 136 13 -105.30 gain 13 137 -113.50 gain 137 13 -113.18 gain 13 138 -104.16 gain 138 13 -105.85 gain 13 139 -101.06 gain 139 13 -104.46 gain 13 140 -109.24 gain 140 13 -112.45 gain 13 141 -103.92 gain 141 13 -102.81 gain 13 142 -98.94 gain 142 13 -98.98 gain 13 143 -106.65 gain 143 13 -109.15 gain 13 144 -100.16 gain 144 13 -98.56 gain 13 145 -103.29 gain 145 13 -106.24 gain 13 146 -97.97 gain 146 13 -97.36 gain 13 147 -103.05 gain 147 13 -103.64 gain 13 148 -95.14 gain 148 13 -96.26 gain 13 149 -104.54 gain 149 13 -102.02 gain 13 150 -109.73 gain 150 13 -110.60 gain 13 151 -106.11 gain 151 13 -109.45 gain 13 152 -112.82 gain 152 13 -114.53 gain 13 153 -110.24 gain 153 13 -111.64 gain 13 154 -107.49 gain 154 13 -110.02 gain 13 155 -110.68 gain 155 13 -110.51 gain 13 156 -104.53 gain 156 13 -105.48 gain 13 157 -103.38 gain 157 13 -105.63 gain 13 158 -110.85 gain 158 13 -115.07 gain 13 159 -105.57 gain 159 13 -103.82 gain 13 160 -102.65 gain 160 13 -102.29 gain 13 161 -107.19 gain 161 13 -107.88 gain 13 162 -103.84 gain 162 13 -104.15 gain 13 163 -101.46 gain 163 13 -99.20 gain 13 164 -101.89 gain 164 13 -106.85 gain 13 165 -111.54 gain 165 13 -113.86 gain 13 166 -114.56 gain 166 13 -118.54 gain 13 167 -110.93 gain 167 13 -113.74 gain 13 168 -117.33 gain 168 13 -119.21 gain 13 169 -108.25 gain 169 13 -106.63 gain 13 170 -112.40 gain 170 13 -111.73 gain 13 171 -105.78 gain 171 13 -105.67 gain 13 172 -105.03 gain 172 13 -107.72 gain 13 173 -108.48 gain 173 13 -105.50 gain 13 174 -107.61 gain 174 13 -110.58 gain 13 175 -108.31 gain 175 13 -103.08 gain 13 176 -102.43 gain 176 13 -101.42 gain 13 177 -102.06 gain 177 13 -103.41 gain 13 178 -107.37 gain 178 13 -106.33 gain 13 179 -112.48 gain 179 13 -114.49 gain 13 180 -108.48 gain 180 13 -109.22 gain 13 181 -109.28 gain 181 13 -113.42 gain 13 182 -114.52 gain 182 13 -114.79 gain 13 183 -104.81 gain 183 13 -100.97 gain 13 184 -106.81 gain 184 13 -109.20 gain 13 185 -110.70 gain 185 13 -111.59 gain 13 186 -109.80 gain 186 13 -111.39 gain 13 187 -109.04 gain 187 13 -110.65 gain 13 188 -100.11 gain 188 13 -106.17 gain 13 189 -108.00 gain 189 13 -110.12 gain 13 190 -100.94 gain 190 13 -95.88 gain 13 191 -104.33 gain 191 13 -102.45 gain 13 192 -110.92 gain 192 13 -112.71 gain 13 193 -102.54 gain 193 13 -100.36 gain 13 194 -104.49 gain 194 13 -102.20 gain 13 195 -111.82 gain 195 13 -107.50 gain 13 196 -115.26 gain 196 13 -118.61 gain 13 197 -108.52 gain 197 13 -109.36 gain 13 198 -112.54 gain 198 13 -116.01 gain 13 199 -107.63 gain 199 13 -105.12 gain 13 200 -110.65 gain 200 13 -110.05 gain 13 201 -112.54 gain 201 13 -115.04 gain 13 202 -106.27 gain 202 13 -107.07 gain 13 203 -105.63 gain 203 13 -106.53 gain 13 204 -106.12 gain 204 13 -105.24 gain 13 205 -105.98 gain 205 13 -104.76 gain 13 206 -112.09 gain 206 13 -112.19 gain 13 207 -110.21 gain 207 13 -108.06 gain 13 208 -105.47 gain 208 13 -106.62 gain 13 209 -108.72 gain 209 13 -108.90 gain 13 210 -107.12 gain 210 13 -111.31 gain 13 211 -115.67 gain 211 13 -117.25 gain 13 212 -113.61 gain 212 13 -113.74 gain 13 213 -110.82 gain 213 13 -113.69 gain 13 214 -113.99 gain 214 13 -115.04 gain 13 215 -103.14 gain 215 13 -106.00 gain 13 216 -103.55 gain 216 13 -103.30 gain 13 217 -108.71 gain 217 13 -112.92 gain 13 218 -106.69 gain 218 13 -112.22 gain 13 219 -115.42 gain 219 13 -118.52 gain 13 220 -109.20 gain 220 13 -109.41 gain 13 221 -107.65 gain 221 13 -108.86 gain 13 222 -103.44 gain 222 13 -101.23 gain 13 223 -113.29 gain 223 13 -113.36 gain 13 224 -105.08 gain 224 13 -102.08 gain 14 15 -104.46 gain 15 14 -107.19 gain 14 16 -109.50 gain 16 14 -107.67 gain 14 17 -115.02 gain 17 14 -118.71 gain 14 18 -106.72 gain 18 14 -104.47 gain 14 19 -105.22 gain 19 14 -111.25 gain 14 20 -99.73 gain 20 14 -101.93 gain 14 21 -107.11 gain 21 14 -109.11 gain 14 22 -104.75 gain 22 14 -105.09 gain 14 23 -93.75 gain 23 14 -96.53 gain 14 24 -96.26 gain 24 14 -96.95 gain 14 25 -92.62 gain 25 14 -94.29 gain 14 26 -90.99 gain 26 14 -93.12 gain 14 27 -90.34 gain 27 14 -91.81 gain 14 28 -74.10 gain 28 14 -77.52 gain 14 29 -71.44 gain 29 14 -66.49 gain 14 30 -110.12 gain 30 14 -116.87 gain 14 31 -108.05 gain 31 14 -111.88 gain 14 32 -108.73 gain 32 14 -107.69 gain 14 33 -112.41 gain 33 14 -110.15 gain 14 34 -106.46 gain 34 14 -111.18 gain 14 35 -106.63 gain 35 14 -109.27 gain 14 36 -104.98 gain 36 14 -106.43 gain 14 37 -102.33 gain 37 14 -103.18 gain 14 38 -102.11 gain 38 14 -104.17 gain 14 39 -94.64 gain 39 14 -94.17 gain 14 40 -95.70 gain 40 14 -97.28 gain 14 41 -90.22 gain 41 14 -91.45 gain 14 42 -91.29 gain 42 14 -95.53 gain 14 43 -88.01 gain 43 14 -92.77 gain 14 44 -84.32 gain 44 14 -87.07 gain 14 45 -110.86 gain 45 14 -109.64 gain 14 46 -108.86 gain 46 14 -110.51 gain 14 47 -107.22 gain 47 14 -110.72 gain 14 48 -107.94 gain 48 14 -108.44 gain 14 49 -101.37 gain 49 14 -98.51 gain 14 50 -107.33 gain 50 14 -106.37 gain 14 51 -99.90 gain 51 14 -100.73 gain 14 52 -101.99 gain 52 14 -99.24 gain 14 53 -94.75 gain 53 14 -96.50 gain 14 54 -89.50 gain 54 14 -87.76 gain 14 55 -92.46 gain 55 14 -93.85 gain 14 56 -92.63 gain 56 14 -97.11 gain 14 57 -89.92 gain 57 14 -96.44 gain 14 58 -95.21 gain 58 14 -101.28 gain 14 59 -86.80 gain 59 14 -91.03 gain 14 60 -110.32 gain 60 14 -112.96 gain 14 61 -109.53 gain 61 14 -105.05 gain 14 62 -109.78 gain 62 14 -108.11 gain 14 63 -115.57 gain 63 14 -112.90 gain 14 64 -104.77 gain 64 14 -106.49 gain 14 65 -102.34 gain 65 14 -104.11 gain 14 66 -105.69 gain 66 14 -106.76 gain 14 67 -103.91 gain 67 14 -105.10 gain 14 68 -100.34 gain 68 14 -101.48 gain 14 69 -101.41 gain 69 14 -100.82 gain 14 70 -96.24 gain 70 14 -98.34 gain 14 71 -96.34 gain 71 14 -99.20 gain 14 72 -89.94 gain 72 14 -94.65 gain 14 73 -93.84 gain 73 14 -95.61 gain 14 74 -104.17 gain 74 14 -101.93 gain 14 75 -108.77 gain 75 14 -106.91 gain 14 76 -113.75 gain 76 14 -114.38 gain 14 77 -103.13 gain 77 14 -102.07 gain 14 78 -109.62 gain 78 14 -117.20 gain 14 79 -106.19 gain 79 14 -108.31 gain 14 80 -105.98 gain 80 14 -106.42 gain 14 81 -100.44 gain 81 14 -105.16 gain 14 82 -106.16 gain 82 14 -110.04 gain 14 83 -103.48 gain 83 14 -106.94 gain 14 84 -104.77 gain 84 14 -105.30 gain 14 85 -104.72 gain 85 14 -109.84 gain 14 86 -93.73 gain 86 14 -92.03 gain 14 87 -99.26 gain 87 14 -100.36 gain 14 88 -96.53 gain 88 14 -97.91 gain 14 89 -94.07 gain 89 14 -96.09 gain 14 90 -108.50 gain 90 14 -114.05 gain 14 91 -104.82 gain 91 14 -105.95 gain 14 92 -106.99 gain 92 14 -111.70 gain 14 93 -108.63 gain 93 14 -107.25 gain 14 94 -108.16 gain 94 14 -109.21 gain 14 95 -110.72 gain 95 14 -114.81 gain 14 96 -109.27 gain 96 14 -109.63 gain 14 97 -106.18 gain 97 14 -107.82 gain 14 98 -106.44 gain 98 14 -105.25 gain 14 99 -97.94 gain 99 14 -100.85 gain 14 100 -107.37 gain 100 14 -108.12 gain 14 101 -99.84 gain 101 14 -99.25 gain 14 102 -98.46 gain 102 14 -98.53 gain 14 103 -89.54 gain 103 14 -88.84 gain 14 104 -99.81 gain 104 14 -95.54 gain 14 105 -109.51 gain 105 14 -110.64 gain 14 106 -111.44 gain 106 14 -111.88 gain 14 107 -109.05 gain 107 14 -112.50 gain 14 108 -104.06 gain 108 14 -105.57 gain 14 109 -109.45 gain 109 14 -107.81 gain 14 110 -108.27 gain 110 14 -108.87 gain 14 111 -108.39 gain 111 14 -106.19 gain 14 112 -104.46 gain 112 14 -104.26 gain 14 113 -100.86 gain 113 14 -107.59 gain 14 114 -99.52 gain 114 14 -101.89 gain 14 115 -106.03 gain 115 14 -109.26 gain 14 116 -105.38 gain 116 14 -104.64 gain 14 117 -99.98 gain 117 14 -99.08 gain 14 118 -98.82 gain 118 14 -106.09 gain 14 119 -100.89 gain 119 14 -99.71 gain 14 120 -110.50 gain 120 14 -109.43 gain 14 121 -107.32 gain 121 14 -108.99 gain 14 122 -116.55 gain 122 14 -120.79 gain 14 123 -108.24 gain 123 14 -112.73 gain 14 124 -108.08 gain 124 14 -106.18 gain 14 125 -111.10 gain 125 14 -111.13 gain 14 126 -109.50 gain 126 14 -114.41 gain 14 127 -105.07 gain 127 14 -104.73 gain 14 128 -100.87 gain 128 14 -103.60 gain 14 129 -102.87 gain 129 14 -102.80 gain 14 130 -101.65 gain 130 14 -103.77 gain 14 131 -105.91 gain 131 14 -106.39 gain 14 132 -102.14 gain 132 14 -98.89 gain 14 133 -100.99 gain 133 14 -102.17 gain 14 134 -98.44 gain 134 14 -97.62 gain 14 135 -116.62 gain 135 14 -111.38 gain 14 136 -108.69 gain 136 14 -112.23 gain 14 137 -105.93 gain 137 14 -106.13 gain 14 138 -107.79 gain 138 14 -110.00 gain 14 139 -115.03 gain 139 14 -118.95 gain 14 140 -113.83 gain 140 14 -117.56 gain 14 141 -108.34 gain 141 14 -107.76 gain 14 142 -106.91 gain 142 14 -107.47 gain 14 143 -106.87 gain 143 14 -109.89 gain 14 144 -102.03 gain 144 14 -100.95 gain 14 145 -105.85 gain 145 14 -109.32 gain 14 146 -107.92 gain 146 14 -107.83 gain 14 147 -103.81 gain 147 14 -104.91 gain 14 148 -93.42 gain 148 14 -95.05 gain 14 149 -107.56 gain 149 14 -105.57 gain 14 150 -115.14 gain 150 14 -116.53 gain 14 151 -113.70 gain 151 14 -117.57 gain 14 152 -108.85 gain 152 14 -111.08 gain 14 153 -112.03 gain 153 14 -113.95 gain 14 154 -110.22 gain 154 14 -113.28 gain 14 155 -113.83 gain 155 14 -114.18 gain 14 156 -109.40 gain 156 14 -110.88 gain 14 157 -105.11 gain 157 14 -107.89 gain 14 158 -103.59 gain 158 14 -108.34 gain 14 159 -109.15 gain 159 14 -107.93 gain 14 160 -106.83 gain 160 14 -106.99 gain 14 161 -106.70 gain 161 14 -107.92 gain 14 162 -104.80 gain 162 14 -105.64 gain 14 163 -107.54 gain 163 14 -105.80 gain 14 164 -103.06 gain 164 14 -108.55 gain 14 165 -109.58 gain 165 14 -112.42 gain 14 166 -117.14 gain 166 14 -121.64 gain 14 167 -107.38 gain 167 14 -110.70 gain 14 168 -112.72 gain 168 14 -115.12 gain 14 169 -106.57 gain 169 14 -105.48 gain 14 170 -113.26 gain 170 14 -113.11 gain 14 171 -103.35 gain 171 14 -103.76 gain 14 172 -111.21 gain 172 14 -114.42 gain 14 173 -102.05 gain 173 14 -99.58 gain 14 174 -106.62 gain 174 14 -110.11 gain 14 175 -107.47 gain 175 14 -102.76 gain 14 176 -108.81 gain 176 14 -108.32 gain 14 177 -108.11 gain 177 14 -109.99 gain 14 178 -101.64 gain 178 14 -101.12 gain 14 179 -111.37 gain 179 14 -113.90 gain 14 180 -108.14 gain 180 14 -109.40 gain 14 181 -110.27 gain 181 14 -114.93 gain 14 182 -116.82 gain 182 14 -117.61 gain 14 183 -112.20 gain 183 14 -108.88 gain 14 184 -110.79 gain 184 14 -113.69 gain 14 185 -110.52 gain 185 14 -111.93 gain 14 186 -103.55 gain 186 14 -105.65 gain 14 187 -112.50 gain 187 14 -114.63 gain 14 188 -108.82 gain 188 14 -115.39 gain 14 189 -109.31 gain 189 14 -111.94 gain 14 190 -100.41 gain 190 14 -95.88 gain 14 191 -103.03 gain 191 14 -101.67 gain 14 192 -108.50 gain 192 14 -110.81 gain 14 193 -107.80 gain 193 14 -106.13 gain 14 194 -110.16 gain 194 14 -108.38 gain 14 195 -111.86 gain 195 14 -108.05 gain 14 196 -108.35 gain 196 14 -112.22 gain 14 197 -115.17 gain 197 14 -116.52 gain 14 198 -111.30 gain 198 14 -115.30 gain 14 199 -107.27 gain 199 14 -105.28 gain 14 200 -102.89 gain 200 14 -102.81 gain 14 201 -114.88 gain 201 14 -117.90 gain 14 202 -109.84 gain 202 14 -111.16 gain 14 203 -113.83 gain 203 14 -115.25 gain 14 204 -107.78 gain 204 14 -107.41 gain 14 205 -111.93 gain 205 14 -111.23 gain 14 206 -106.21 gain 206 14 -106.83 gain 14 207 -109.82 gain 207 14 -108.18 gain 14 208 -111.41 gain 208 14 -113.08 gain 14 209 -114.53 gain 209 14 -115.23 gain 14 210 -113.14 gain 210 14 -117.85 gain 14 211 -114.32 gain 211 14 -116.42 gain 14 212 -113.50 gain 212 14 -114.15 gain 14 213 -109.64 gain 213 14 -113.03 gain 14 214 -106.89 gain 214 14 -108.46 gain 14 215 -106.63 gain 215 14 -110.01 gain 14 216 -108.94 gain 216 14 -109.21 gain 14 217 -113.05 gain 217 14 -117.78 gain 14 218 -114.07 gain 218 14 -120.11 gain 14 219 -114.83 gain 219 14 -118.45 gain 14 220 -107.18 gain 220 14 -107.91 gain 14 221 -110.68 gain 221 14 -112.41 gain 14 222 -111.02 gain 222 14 -109.33 gain 14 223 -109.01 gain 223 14 -109.60 gain 14 224 -112.66 gain 224 14 -110.18 gain 15 16 -70.94 gain 16 15 -66.38 gain 15 17 -87.51 gain 17 15 -88.47 gain 15 18 -95.26 gain 18 15 -90.28 gain 15 19 -85.18 gain 19 15 -88.48 gain 15 20 -103.74 gain 20 15 -103.21 gain 15 21 -103.57 gain 21 15 -102.84 gain 15 22 -107.10 gain 22 15 -104.71 gain 15 23 -109.97 gain 23 15 -110.02 gain 15 24 -103.92 gain 24 15 -101.88 gain 15 25 -111.83 gain 25 15 -110.77 gain 15 26 -113.62 gain 26 15 -113.03 gain 15 27 -108.04 gain 27 15 -106.79 gain 15 28 -106.07 gain 28 15 -106.76 gain 15 29 -112.98 gain 29 15 -105.30 gain 15 30 -78.74 gain 30 15 -82.76 gain 15 31 -84.98 gain 31 15 -86.07 gain 15 32 -90.50 gain 32 15 -86.74 gain 15 33 -87.92 gain 33 15 -82.93 gain 15 34 -88.46 gain 34 15 -90.46 gain 15 35 -101.14 gain 35 15 -101.04 gain 15 36 -97.40 gain 36 15 -96.12 gain 15 37 -105.87 gain 37 15 -103.99 gain 15 38 -105.27 gain 38 15 -104.60 gain 15 39 -101.68 gain 39 15 -98.47 gain 15 40 -100.17 gain 40 15 -99.03 gain 15 41 -111.42 gain 41 15 -109.91 gain 15 42 -112.85 gain 42 15 -114.37 gain 15 43 -110.71 gain 43 15 -112.75 gain 15 44 -108.08 gain 44 15 -108.11 gain 15 45 -86.88 gain 45 15 -82.93 gain 15 46 -92.15 gain 46 15 -91.07 gain 15 47 -88.61 gain 47 15 -89.38 gain 15 48 -97.42 gain 48 15 -95.19 gain 15 49 -102.35 gain 49 15 -96.77 gain 15 50 -103.18 gain 50 15 -99.49 gain 15 51 -105.19 gain 51 15 -103.28 gain 15 52 -106.19 gain 52 15 -100.71 gain 15 53 -109.53 gain 53 15 -108.55 gain 15 54 -109.33 gain 54 15 -104.87 gain 15 55 -106.59 gain 55 15 -105.25 gain 15 56 -107.72 gain 56 15 -109.48 gain 15 57 -108.77 gain 57 15 -112.56 gain 15 58 -114.33 gain 58 15 -117.67 gain 15 59 -110.55 gain 59 15 -112.06 gain 15 60 -89.16 gain 60 15 -89.07 gain 15 61 -92.93 gain 61 15 -85.73 gain 15 62 -94.70 gain 62 15 -90.30 gain 15 63 -102.83 gain 63 15 -97.43 gain 15 64 -101.45 gain 64 15 -100.44 gain 15 65 -103.35 gain 65 15 -102.39 gain 15 66 -93.23 gain 66 15 -91.56 gain 15 67 -105.28 gain 67 15 -103.75 gain 15 68 -108.85 gain 68 15 -107.27 gain 15 69 -101.24 gain 69 15 -97.92 gain 15 70 -101.15 gain 70 15 -100.53 gain 15 71 -111.14 gain 71 15 -111.27 gain 15 72 -107.53 gain 72 15 -109.52 gain 15 73 -110.90 gain 73 15 -109.93 gain 15 74 -111.66 gain 74 15 -106.69 gain 15 75 -95.83 gain 75 15 -91.25 gain 15 76 -96.43 gain 76 15 -94.34 gain 15 77 -98.19 gain 77 15 -94.40 gain 15 78 -100.39 gain 78 15 -105.23 gain 15 79 -102.62 gain 79 15 -102.00 gain 15 80 -98.48 gain 80 15 -96.19 gain 15 81 -105.90 gain 81 15 -107.89 gain 15 82 -101.69 gain 82 15 -102.84 gain 15 83 -112.25 gain 83 15 -112.98 gain 15 84 -104.63 gain 84 15 -102.43 gain 15 85 -105.48 gain 85 15 -107.86 gain 15 86 -113.63 gain 86 15 -109.19 gain 15 87 -109.24 gain 87 15 -107.61 gain 15 88 -110.76 gain 88 15 -109.41 gain 15 89 -116.53 gain 89 15 -115.82 gain 15 90 -92.52 gain 90 15 -95.34 gain 15 91 -95.81 gain 91 15 -94.21 gain 15 92 -97.33 gain 92 15 -99.30 gain 15 93 -95.52 gain 93 15 -91.41 gain 15 94 -101.05 gain 94 15 -99.38 gain 15 95 -101.69 gain 95 15 -103.05 gain 15 96 -110.68 gain 96 15 -108.31 gain 15 97 -107.95 gain 97 15 -106.86 gain 15 98 -91.77 gain 98 15 -87.86 gain 15 99 -107.40 gain 99 15 -107.57 gain 15 100 -103.57 gain 100 15 -101.59 gain 15 101 -112.45 gain 101 15 -109.13 gain 15 102 -109.80 gain 102 15 -107.14 gain 15 103 -110.68 gain 103 15 -107.25 gain 15 104 -109.05 gain 104 15 -102.05 gain 15 105 -102.45 gain 105 15 -100.85 gain 15 106 -97.90 gain 106 15 -95.61 gain 15 107 -104.71 gain 107 15 -105.43 gain 15 108 -106.06 gain 108 15 -104.85 gain 15 109 -105.99 gain 109 15 -101.62 gain 15 110 -103.76 gain 110 15 -101.63 gain 15 111 -99.81 gain 111 15 -94.88 gain 15 112 -101.27 gain 112 15 -98.34 gain 15 113 -107.28 gain 113 15 -111.29 gain 15 114 -105.34 gain 114 15 -104.98 gain 15 115 -108.02 gain 115 15 -108.52 gain 15 116 -108.04 gain 116 15 -104.56 gain 15 117 -100.22 gain 117 15 -96.59 gain 15 118 -106.63 gain 118 15 -111.17 gain 15 119 -114.01 gain 119 15 -110.10 gain 15 120 -100.68 gain 120 15 -96.87 gain 15 121 -107.52 gain 121 15 -106.46 gain 15 122 -108.01 gain 122 15 -109.52 gain 15 123 -103.21 gain 123 15 -104.98 gain 15 124 -107.54 gain 124 15 -102.91 gain 15 125 -104.02 gain 125 15 -101.31 gain 15 126 -109.80 gain 126 15 -111.98 gain 15 127 -102.85 gain 127 15 -99.78 gain 15 128 -109.99 gain 128 15 -109.99 gain 15 129 -113.03 gain 129 15 -110.24 gain 15 130 -113.48 gain 130 15 -112.87 gain 15 131 -107.47 gain 131 15 -105.22 gain 15 132 -111.78 gain 132 15 -105.81 gain 15 133 -116.26 gain 133 15 -114.71 gain 15 134 -113.77 gain 134 15 -110.22 gain 15 135 -102.57 gain 135 15 -94.60 gain 15 136 -103.04 gain 136 15 -103.85 gain 15 137 -105.39 gain 137 15 -102.86 gain 15 138 -100.59 gain 138 15 -100.08 gain 15 139 -102.06 gain 139 15 -103.25 gain 15 140 -109.95 gain 140 15 -110.94 gain 15 141 -108.52 gain 141 15 -105.20 gain 15 142 -105.69 gain 142 15 -103.53 gain 15 143 -108.58 gain 143 15 -108.87 gain 15 144 -111.01 gain 144 15 -107.20 gain 15 145 -111.18 gain 145 15 -111.92 gain 15 146 -107.00 gain 146 15 -104.19 gain 15 147 -108.29 gain 147 15 -106.66 gain 15 148 -116.09 gain 148 15 -114.99 gain 15 149 -111.63 gain 149 15 -106.90 gain 15 150 -106.22 gain 150 15 -104.88 gain 15 151 -102.01 gain 151 15 -103.15 gain 15 152 -110.18 gain 152 15 -109.68 gain 15 153 -110.56 gain 153 15 -109.76 gain 15 154 -105.37 gain 154 15 -105.70 gain 15 155 -106.39 gain 155 15 -104.01 gain 15 156 -104.14 gain 156 15 -102.88 gain 15 157 -107.98 gain 157 15 -108.03 gain 15 158 -105.56 gain 158 15 -107.57 gain 15 159 -105.64 gain 159 15 -101.69 gain 15 160 -118.95 gain 160 15 -116.37 gain 15 161 -108.80 gain 161 15 -107.28 gain 15 162 -108.86 gain 162 15 -106.97 gain 15 163 -112.17 gain 163 15 -107.71 gain 15 164 -118.54 gain 164 15 -121.30 gain 15 165 -105.40 gain 165 15 -105.52 gain 15 166 -102.31 gain 166 15 -104.09 gain 15 167 -116.51 gain 167 15 -117.11 gain 15 168 -108.54 gain 168 15 -108.20 gain 15 169 -110.32 gain 169 15 -106.49 gain 15 170 -105.50 gain 170 15 -102.61 gain 15 171 -108.26 gain 171 15 -105.94 gain 15 172 -110.50 gain 172 15 -110.98 gain 15 173 -104.08 gain 173 15 -98.89 gain 15 174 -115.76 gain 174 15 -116.52 gain 15 175 -118.06 gain 175 15 -110.61 gain 15 176 -109.34 gain 176 15 -106.12 gain 15 177 -114.39 gain 177 15 -113.53 gain 15 178 -117.29 gain 178 15 -114.04 gain 15 179 -119.51 gain 179 15 -119.31 gain 15 180 -114.09 gain 180 15 -112.62 gain 15 181 -112.81 gain 181 15 -114.74 gain 15 182 -116.22 gain 182 15 -114.28 gain 15 183 -101.86 gain 183 15 -95.81 gain 15 184 -105.96 gain 184 15 -106.13 gain 15 185 -104.74 gain 185 15 -103.42 gain 15 186 -108.29 gain 186 15 -107.67 gain 15 187 -105.18 gain 187 15 -104.58 gain 15 188 -116.52 gain 188 15 -120.36 gain 15 189 -108.46 gain 189 15 -108.36 gain 15 190 -115.64 gain 190 15 -108.38 gain 15 191 -115.61 gain 191 15 -111.51 gain 15 192 -116.74 gain 192 15 -116.32 gain 15 193 -115.11 gain 193 15 -110.72 gain 15 194 -107.29 gain 194 15 -102.78 gain 15 195 -107.12 gain 195 15 -100.58 gain 15 196 -111.66 gain 196 15 -112.79 gain 15 197 -115.77 gain 197 15 -114.39 gain 15 198 -111.31 gain 198 15 -112.58 gain 15 199 -104.10 gain 199 15 -99.38 gain 15 200 -117.10 gain 200 15 -114.30 gain 15 201 -113.37 gain 201 15 -113.66 gain 15 202 -106.08 gain 202 15 -104.66 gain 15 203 -120.92 gain 203 15 -119.60 gain 15 204 -114.19 gain 204 15 -111.09 gain 15 205 -114.52 gain 205 15 -111.09 gain 15 206 -113.83 gain 206 15 -111.73 gain 15 207 -115.12 gain 207 15 -110.76 gain 15 208 -116.16 gain 208 15 -115.10 gain 15 209 -121.50 gain 209 15 -119.48 gain 15 210 -112.45 gain 210 15 -114.43 gain 15 211 -109.48 gain 211 15 -108.85 gain 15 212 -108.21 gain 212 15 -106.13 gain 15 213 -110.89 gain 213 15 -111.55 gain 15 214 -112.20 gain 214 15 -111.04 gain 15 215 -108.69 gain 215 15 -109.35 gain 15 216 -116.87 gain 216 15 -114.42 gain 15 217 -106.03 gain 217 15 -108.03 gain 15 218 -114.95 gain 218 15 -118.26 gain 15 219 -112.57 gain 219 15 -113.46 gain 15 220 -122.07 gain 220 15 -120.07 gain 15 221 -112.54 gain 221 15 -111.53 gain 15 222 -119.93 gain 222 15 -115.50 gain 15 223 -115.17 gain 223 15 -113.03 gain 15 224 -119.36 gain 224 15 -114.15 gain 16 17 -69.08 gain 17 16 -74.61 gain 16 18 -82.40 gain 18 16 -81.99 gain 16 19 -83.29 gain 19 16 -91.16 gain 16 20 -95.47 gain 20 16 -99.51 gain 16 21 -91.70 gain 21 16 -95.54 gain 16 22 -92.08 gain 22 16 -94.26 gain 16 23 -101.66 gain 23 16 -106.28 gain 16 24 -100.56 gain 24 16 -103.09 gain 16 25 -107.05 gain 25 16 -110.56 gain 16 26 -98.22 gain 26 16 -102.19 gain 16 27 -102.98 gain 27 16 -106.29 gain 16 28 -102.06 gain 28 16 -107.32 gain 16 29 -106.25 gain 29 16 -103.14 gain 16 30 -74.04 gain 30 16 -82.63 gain 16 31 -76.64 gain 31 16 -82.31 gain 16 32 -82.25 gain 32 16 -83.05 gain 16 33 -80.61 gain 33 16 -80.18 gain 16 34 -86.47 gain 34 16 -93.04 gain 16 35 -90.85 gain 35 16 -95.32 gain 16 36 -83.99 gain 36 16 -87.28 gain 16 37 -95.78 gain 37 16 -98.47 gain 16 38 -97.57 gain 38 16 -101.46 gain 16 39 -101.48 gain 39 16 -102.84 gain 16 40 -105.23 gain 40 16 -108.65 gain 16 41 -105.80 gain 41 16 -108.86 gain 16 42 -101.58 gain 42 16 -107.66 gain 16 43 -108.00 gain 43 16 -114.60 gain 16 44 -103.96 gain 44 16 -108.55 gain 16 45 -85.03 gain 45 16 -85.64 gain 16 46 -71.99 gain 46 16 -75.48 gain 16 47 -78.96 gain 47 16 -84.30 gain 16 48 -84.37 gain 48 16 -86.71 gain 16 49 -95.83 gain 49 16 -94.81 gain 16 50 -87.76 gain 50 16 -88.63 gain 16 51 -95.89 gain 51 16 -98.55 gain 16 52 -97.63 gain 52 16 -96.72 gain 16 53 -97.97 gain 53 16 -101.56 gain 16 54 -105.54 gain 54 16 -105.64 gain 16 55 -104.46 gain 55 16 -107.69 gain 16 56 -105.88 gain 56 16 -112.21 gain 16 57 -104.46 gain 57 16 -112.83 gain 16 58 -108.01 gain 58 16 -115.92 gain 16 59 -107.18 gain 59 16 -113.26 gain 16 60 -88.15 gain 60 16 -92.63 gain 16 61 -84.83 gain 61 16 -82.20 gain 16 62 -88.97 gain 62 16 -89.13 gain 16 63 -93.08 gain 63 16 -92.25 gain 16 64 -95.85 gain 64 16 -99.41 gain 16 65 -99.72 gain 65 16 -103.32 gain 16 66 -95.81 gain 66 16 -98.72 gain 16 67 -94.02 gain 67 16 -97.05 gain 16 68 -96.77 gain 68 16 -99.76 gain 16 69 -97.65 gain 69 16 -98.89 gain 16 70 -107.53 gain 70 16 -111.48 gain 16 71 -102.47 gain 71 16 -107.17 gain 16 72 -102.91 gain 72 16 -109.46 gain 16 73 -105.28 gain 73 16 -108.88 gain 16 74 -107.15 gain 74 16 -106.75 gain 16 75 -96.79 gain 75 16 -96.77 gain 16 76 -92.33 gain 76 16 -94.81 gain 16 77 -91.22 gain 77 16 -91.99 gain 16 78 -85.26 gain 78 16 -94.67 gain 16 79 -96.77 gain 79 16 -100.72 gain 16 80 -90.59 gain 80 16 -92.88 gain 16 81 -97.06 gain 81 16 -103.61 gain 16 82 -104.54 gain 82 16 -110.26 gain 16 83 -97.37 gain 83 16 -102.67 gain 16 84 -97.70 gain 84 16 -100.07 gain 16 85 -100.80 gain 85 16 -107.76 gain 16 86 -106.73 gain 86 16 -106.86 gain 16 87 -105.03 gain 87 16 -107.97 gain 16 88 -105.74 gain 88 16 -108.95 gain 16 89 -106.72 gain 89 16 -110.57 gain 16 90 -91.51 gain 90 16 -98.90 gain 16 91 -93.49 gain 91 16 -96.46 gain 16 92 -83.76 gain 92 16 -90.31 gain 16 93 -95.37 gain 93 16 -95.82 gain 16 94 -94.41 gain 94 16 -97.30 gain 16 95 -99.47 gain 95 16 -105.40 gain 16 96 -91.93 gain 96 16 -94.13 gain 16 97 -101.15 gain 97 16 -104.63 gain 16 98 -98.89 gain 98 16 -99.54 gain 16 99 -102.89 gain 99 16 -107.63 gain 16 100 -108.08 gain 100 16 -110.67 gain 16 101 -103.91 gain 101 16 -105.15 gain 16 102 -106.14 gain 102 16 -108.05 gain 16 103 -104.18 gain 103 16 -105.32 gain 16 104 -111.38 gain 104 16 -108.95 gain 16 105 -101.16 gain 105 16 -104.13 gain 16 106 -103.08 gain 106 16 -105.36 gain 16 107 -94.06 gain 107 16 -99.35 gain 16 108 -101.64 gain 108 16 -104.99 gain 16 109 -98.46 gain 109 16 -98.66 gain 16 110 -102.22 gain 110 16 -104.66 gain 16 111 -101.40 gain 111 16 -101.04 gain 16 112 -95.86 gain 112 16 -97.50 gain 16 113 -99.07 gain 113 16 -107.64 gain 16 114 -99.83 gain 114 16 -104.04 gain 16 115 -103.86 gain 115 16 -108.92 gain 16 116 -103.38 gain 116 16 -104.47 gain 16 117 -102.32 gain 117 16 -103.25 gain 16 118 -103.89 gain 118 16 -113.00 gain 16 119 -108.88 gain 119 16 -109.53 gain 16 120 -88.50 gain 120 16 -89.26 gain 16 121 -98.59 gain 121 16 -102.09 gain 16 122 -96.83 gain 122 16 -102.91 gain 16 123 -91.30 gain 123 16 -97.63 gain 16 124 -96.16 gain 124 16 -96.10 gain 16 125 -95.73 gain 125 16 -97.60 gain 16 126 -97.87 gain 126 16 -104.63 gain 16 127 -98.37 gain 127 16 -99.87 gain 16 128 -108.50 gain 128 16 -113.06 gain 16 129 -99.40 gain 129 16 -101.18 gain 16 130 -109.68 gain 130 16 -113.64 gain 16 131 -107.87 gain 131 16 -110.19 gain 16 132 -110.02 gain 132 16 -108.61 gain 16 133 -102.14 gain 133 16 -105.16 gain 16 134 -96.24 gain 134 16 -97.25 gain 16 135 -98.61 gain 135 16 -95.21 gain 16 136 -101.96 gain 136 16 -107.34 gain 16 137 -103.01 gain 137 16 -105.05 gain 16 138 -100.51 gain 138 16 -104.57 gain 16 139 -106.13 gain 139 16 -111.89 gain 16 140 -99.00 gain 140 16 -104.56 gain 16 141 -99.86 gain 141 16 -101.12 gain 16 142 -95.44 gain 142 16 -97.85 gain 16 143 -101.62 gain 143 16 -106.48 gain 16 144 -112.26 gain 144 16 -113.02 gain 16 145 -102.80 gain 145 16 -108.11 gain 16 146 -113.36 gain 146 16 -115.12 gain 16 147 -100.26 gain 147 16 -103.20 gain 16 148 -105.57 gain 148 16 -109.04 gain 16 149 -108.47 gain 149 16 -108.31 gain 16 150 -99.05 gain 150 16 -102.27 gain 16 151 -99.94 gain 151 16 -105.65 gain 16 152 -93.35 gain 152 16 -97.42 gain 16 153 -96.00 gain 153 16 -99.76 gain 16 154 -107.36 gain 154 16 -112.26 gain 16 155 -103.63 gain 155 16 -105.83 gain 16 156 -96.92 gain 156 16 -100.23 gain 16 157 -107.21 gain 157 16 -111.82 gain 16 158 -106.96 gain 158 16 -113.54 gain 16 159 -105.93 gain 159 16 -106.55 gain 16 160 -99.17 gain 160 16 -101.16 gain 16 161 -110.42 gain 161 16 -113.47 gain 16 162 -111.19 gain 162 16 -113.87 gain 16 163 -99.95 gain 163 16 -100.05 gain 16 164 -110.01 gain 164 16 -117.34 gain 16 165 -104.95 gain 165 16 -109.63 gain 16 166 -106.81 gain 166 16 -113.15 gain 16 167 -99.63 gain 167 16 -104.80 gain 16 168 -108.13 gain 168 16 -112.36 gain 16 169 -107.37 gain 169 16 -108.12 gain 16 170 -101.63 gain 170 16 -103.31 gain 16 171 -103.06 gain 171 16 -105.31 gain 16 172 -102.34 gain 172 16 -107.40 gain 16 173 -104.55 gain 173 16 -103.92 gain 16 174 -107.01 gain 174 16 -112.34 gain 16 175 -109.14 gain 175 16 -106.26 gain 16 176 -107.07 gain 176 16 -108.42 gain 16 177 -113.20 gain 177 16 -116.91 gain 16 178 -109.44 gain 178 16 -110.76 gain 16 179 -103.81 gain 179 16 -108.18 gain 16 180 -106.20 gain 180 16 -109.29 gain 16 181 -93.78 gain 181 16 -100.28 gain 16 182 -102.50 gain 182 16 -105.13 gain 16 183 -105.90 gain 183 16 -104.42 gain 16 184 -107.41 gain 184 16 -112.15 gain 16 185 -103.72 gain 185 16 -106.96 gain 16 186 -102.92 gain 186 16 -106.86 gain 16 187 -104.14 gain 187 16 -108.11 gain 16 188 -99.95 gain 188 16 -108.37 gain 16 189 -109.60 gain 189 16 -114.07 gain 16 190 -105.28 gain 190 16 -102.59 gain 16 191 -105.92 gain 191 16 -106.40 gain 16 192 -104.21 gain 192 16 -108.36 gain 16 193 -102.56 gain 193 16 -102.73 gain 16 194 -103.98 gain 194 16 -104.04 gain 16 195 -102.98 gain 195 16 -101.01 gain 16 196 -106.33 gain 196 16 -112.04 gain 16 197 -106.05 gain 197 16 -109.24 gain 16 198 -104.92 gain 198 16 -110.75 gain 16 199 -105.73 gain 199 16 -105.58 gain 16 200 -107.66 gain 200 16 -109.43 gain 16 201 -105.42 gain 201 16 -110.27 gain 16 202 -108.62 gain 202 16 -111.78 gain 16 203 -108.76 gain 203 16 -112.01 gain 16 204 -109.28 gain 204 16 -110.75 gain 16 205 -111.81 gain 205 16 -112.95 gain 16 206 -106.56 gain 206 16 -109.02 gain 16 207 -108.88 gain 207 16 -109.09 gain 16 208 -107.82 gain 208 16 -111.33 gain 16 209 -108.18 gain 209 16 -110.72 gain 16 210 -102.76 gain 210 16 -109.30 gain 16 211 -106.43 gain 211 16 -110.37 gain 16 212 -102.83 gain 212 16 -105.32 gain 16 213 -112.21 gain 213 16 -117.43 gain 16 214 -101.53 gain 214 16 -104.94 gain 16 215 -103.35 gain 215 16 -108.57 gain 16 216 -96.57 gain 216 16 -98.69 gain 16 217 -110.07 gain 217 16 -116.64 gain 16 218 -107.49 gain 218 16 -115.38 gain 16 219 -108.33 gain 219 16 -113.79 gain 16 220 -110.13 gain 220 16 -112.70 gain 16 221 -109.84 gain 221 16 -113.41 gain 16 222 -109.90 gain 222 16 -110.04 gain 16 223 -113.68 gain 223 16 -116.11 gain 16 224 -115.53 gain 224 16 -114.89 gain 17 18 -75.85 gain 18 17 -69.90 gain 17 19 -83.65 gain 19 17 -85.99 gain 17 20 -88.74 gain 20 17 -87.26 gain 17 21 -96.54 gain 21 17 -94.85 gain 17 22 -98.56 gain 22 17 -95.21 gain 17 23 -104.34 gain 23 17 -103.44 gain 17 24 -104.25 gain 24 17 -101.25 gain 17 25 -100.09 gain 25 17 -98.06 gain 17 26 -104.94 gain 26 17 -103.38 gain 17 27 -107.72 gain 27 17 -105.50 gain 17 28 -111.18 gain 28 17 -110.91 gain 17 29 -116.48 gain 29 17 -107.84 gain 17 30 -84.40 gain 30 17 -87.46 gain 17 31 -79.07 gain 31 17 -79.21 gain 17 32 -80.54 gain 32 17 -75.81 gain 17 33 -77.03 gain 33 17 -71.07 gain 17 34 -90.12 gain 34 17 -91.15 gain 17 35 -90.33 gain 35 17 -89.27 gain 17 36 -108.61 gain 36 17 -106.37 gain 17 37 -101.85 gain 37 17 -99.01 gain 17 38 -101.13 gain 38 17 -99.50 gain 17 39 -99.16 gain 39 17 -94.99 gain 17 40 -100.59 gain 40 17 -98.48 gain 17 41 -102.45 gain 41 17 -99.99 gain 17 42 -115.31 gain 42 17 -115.87 gain 17 43 -108.48 gain 43 17 -109.55 gain 17 44 -106.93 gain 44 17 -106.00 gain 17 45 -92.48 gain 45 17 -87.57 gain 17 46 -90.33 gain 46 17 -88.30 gain 17 47 -88.55 gain 47 17 -88.36 gain 17 48 -92.49 gain 48 17 -89.31 gain 17 49 -87.18 gain 49 17 -80.64 gain 17 50 -97.37 gain 50 17 -92.72 gain 17 51 -99.19 gain 51 17 -96.33 gain 17 52 -100.60 gain 52 17 -94.16 gain 17 53 -99.78 gain 53 17 -97.83 gain 17 54 -104.82 gain 54 17 -99.40 gain 17 55 -104.19 gain 55 17 -101.90 gain 17 56 -108.17 gain 56 17 -108.97 gain 17 57 -114.60 gain 57 17 -117.44 gain 17 58 -114.59 gain 58 17 -116.97 gain 17 59 -109.23 gain 59 17 -109.77 gain 17 60 -91.66 gain 60 17 -90.61 gain 17 61 -85.84 gain 61 17 -77.68 gain 17 62 -91.72 gain 62 17 -86.35 gain 17 63 -97.97 gain 63 17 -91.61 gain 17 64 -99.18 gain 64 17 -97.21 gain 17 65 -94.74 gain 65 17 -92.81 gain 17 66 -96.98 gain 66 17 -94.36 gain 17 67 -105.06 gain 67 17 -102.56 gain 17 68 -102.02 gain 68 17 -99.48 gain 17 69 -99.99 gain 69 17 -95.71 gain 17 70 -108.02 gain 70 17 -106.43 gain 17 71 -104.31 gain 71 17 -103.49 gain 17 72 -109.85 gain 72 17 -110.88 gain 17 73 -101.62 gain 73 17 -99.70 gain 17 74 -113.07 gain 74 17 -107.14 gain 17 75 -102.60 gain 75 17 -97.05 gain 17 76 -92.16 gain 76 17 -89.11 gain 17 77 -93.69 gain 77 17 -88.94 gain 17 78 -94.11 gain 78 17 -97.99 gain 17 79 -106.16 gain 79 17 -104.58 gain 17 80 -105.92 gain 80 17 -102.67 gain 17 81 -92.17 gain 81 17 -93.19 gain 17 82 -100.38 gain 82 17 -100.57 gain 17 83 -105.55 gain 83 17 -105.32 gain 17 84 -102.13 gain 84 17 -98.97 gain 17 85 -103.02 gain 85 17 -104.45 gain 17 86 -102.69 gain 86 17 -97.30 gain 17 87 -101.68 gain 87 17 -99.09 gain 17 88 -109.05 gain 88 17 -106.73 gain 17 89 -111.11 gain 89 17 -109.44 gain 17 90 -106.48 gain 90 17 -108.33 gain 17 91 -98.57 gain 91 17 -96.01 gain 17 92 -101.80 gain 92 17 -102.82 gain 17 93 -104.00 gain 93 17 -98.93 gain 17 94 -98.19 gain 94 17 -95.55 gain 17 95 -100.25 gain 95 17 -100.65 gain 17 96 -101.59 gain 96 17 -98.26 gain 17 97 -100.93 gain 97 17 -98.88 gain 17 98 -102.06 gain 98 17 -97.19 gain 17 99 -103.28 gain 99 17 -102.49 gain 17 100 -103.86 gain 100 17 -100.92 gain 17 101 -107.57 gain 101 17 -103.29 gain 17 102 -113.40 gain 102 17 -109.78 gain 17 103 -111.26 gain 103 17 -106.87 gain 17 104 -115.99 gain 104 17 -108.03 gain 17 105 -98.07 gain 105 17 -95.52 gain 17 106 -93.10 gain 106 17 -89.85 gain 17 107 -99.95 gain 107 17 -99.71 gain 17 108 -102.55 gain 108 17 -100.38 gain 17 109 -97.69 gain 109 17 -92.36 gain 17 110 -98.71 gain 110 17 -95.62 gain 17 111 -107.95 gain 111 17 -102.06 gain 17 112 -107.31 gain 112 17 -103.42 gain 17 113 -100.74 gain 113 17 -103.78 gain 17 114 -112.48 gain 114 17 -111.16 gain 17 115 -109.86 gain 115 17 -109.40 gain 17 116 -109.68 gain 116 17 -105.25 gain 17 117 -113.84 gain 117 17 -109.24 gain 17 118 -109.38 gain 118 17 -112.96 gain 17 119 -109.23 gain 119 17 -104.36 gain 17 120 -101.83 gain 120 17 -97.06 gain 17 121 -98.05 gain 121 17 -96.03 gain 17 122 -111.63 gain 122 17 -112.18 gain 17 123 -103.83 gain 123 17 -104.64 gain 17 124 -103.58 gain 124 17 -97.99 gain 17 125 -101.19 gain 125 17 -97.53 gain 17 126 -106.17 gain 126 17 -107.39 gain 17 127 -109.90 gain 127 17 -105.88 gain 17 128 -110.31 gain 128 17 -109.34 gain 17 129 -109.62 gain 129 17 -105.87 gain 17 130 -105.13 gain 130 17 -103.56 gain 17 131 -113.68 gain 131 17 -110.47 gain 17 132 -113.11 gain 132 17 -106.17 gain 17 133 -107.56 gain 133 17 -105.05 gain 17 134 -112.62 gain 134 17 -108.11 gain 17 135 -100.25 gain 135 17 -91.33 gain 17 136 -103.57 gain 136 17 -103.42 gain 17 137 -107.84 gain 137 17 -104.35 gain 17 138 -107.14 gain 138 17 -105.66 gain 17 139 -108.23 gain 139 17 -108.46 gain 17 140 -104.33 gain 140 17 -104.37 gain 17 141 -111.89 gain 141 17 -107.62 gain 17 142 -107.87 gain 142 17 -104.75 gain 17 143 -107.16 gain 143 17 -106.49 gain 17 144 -115.40 gain 144 17 -110.63 gain 17 145 -104.71 gain 145 17 -104.49 gain 17 146 -108.69 gain 146 17 -104.91 gain 17 147 -106.21 gain 147 17 -103.62 gain 17 148 -107.22 gain 148 17 -105.16 gain 17 149 -113.25 gain 149 17 -107.56 gain 17 150 -109.09 gain 150 17 -106.78 gain 17 151 -107.62 gain 151 17 -107.79 gain 17 152 -110.19 gain 152 17 -108.73 gain 17 153 -103.03 gain 153 17 -101.26 gain 17 154 -105.30 gain 154 17 -104.66 gain 17 155 -109.77 gain 155 17 -106.43 gain 17 156 -114.89 gain 156 17 -112.68 gain 17 157 -108.97 gain 157 17 -108.05 gain 17 158 -108.67 gain 158 17 -109.73 gain 17 159 -114.64 gain 159 17 -109.72 gain 17 160 -109.59 gain 160 17 -106.05 gain 17 161 -110.72 gain 161 17 -108.25 gain 17 162 -113.49 gain 162 17 -110.64 gain 17 163 -119.06 gain 163 17 -113.63 gain 17 164 -116.42 gain 164 17 -118.22 gain 17 165 -108.04 gain 165 17 -107.19 gain 17 166 -104.56 gain 166 17 -105.37 gain 17 167 -111.12 gain 167 17 -110.76 gain 17 168 -102.33 gain 168 17 -101.03 gain 17 169 -103.80 gain 169 17 -99.01 gain 17 170 -105.01 gain 170 17 -101.17 gain 17 171 -110.21 gain 171 17 -106.94 gain 17 172 -110.17 gain 172 17 -109.69 gain 17 173 -109.30 gain 173 17 -103.14 gain 17 174 -108.20 gain 174 17 -108.00 gain 17 175 -109.86 gain 175 17 -101.46 gain 17 176 -109.98 gain 176 17 -105.80 gain 17 177 -112.53 gain 177 17 -110.72 gain 17 178 -108.43 gain 178 17 -104.22 gain 17 179 -113.72 gain 179 17 -112.56 gain 17 180 -110.91 gain 180 17 -108.48 gain 17 181 -108.72 gain 181 17 -109.69 gain 17 182 -110.24 gain 182 17 -107.34 gain 17 183 -113.49 gain 183 17 -106.48 gain 17 184 -105.59 gain 184 17 -104.81 gain 17 185 -105.03 gain 185 17 -102.74 gain 17 186 -107.97 gain 186 17 -106.38 gain 17 187 -110.66 gain 187 17 -109.10 gain 17 188 -111.51 gain 188 17 -114.40 gain 17 189 -118.25 gain 189 17 -117.19 gain 17 190 -112.24 gain 190 17 -104.01 gain 17 191 -106.18 gain 191 17 -101.13 gain 17 192 -109.93 gain 192 17 -108.55 gain 17 193 -116.36 gain 193 17 -111.00 gain 17 194 -116.08 gain 194 17 -110.61 gain 17 195 -107.57 gain 195 17 -100.07 gain 17 196 -108.30 gain 196 17 -108.47 gain 17 197 -103.77 gain 197 17 -101.43 gain 17 198 -107.05 gain 198 17 -107.36 gain 17 199 -105.17 gain 199 17 -99.49 gain 17 200 -105.85 gain 200 17 -102.09 gain 17 201 -108.39 gain 201 17 -107.72 gain 17 202 -115.46 gain 202 17 -113.08 gain 17 203 -107.49 gain 203 17 -105.22 gain 17 204 -109.74 gain 204 17 -105.68 gain 17 205 -116.76 gain 205 17 -112.37 gain 17 206 -114.73 gain 206 17 -111.67 gain 17 207 -116.69 gain 207 17 -111.36 gain 17 208 -111.64 gain 208 17 -109.61 gain 17 209 -112.85 gain 209 17 -109.87 gain 17 210 -108.53 gain 210 17 -109.55 gain 17 211 -114.15 gain 211 17 -112.56 gain 17 212 -112.87 gain 212 17 -109.82 gain 17 213 -114.79 gain 213 17 -114.49 gain 17 214 -104.87 gain 214 17 -102.75 gain 17 215 -108.25 gain 215 17 -107.94 gain 17 216 -111.27 gain 216 17 -107.85 gain 17 217 -106.26 gain 217 17 -107.29 gain 17 218 -111.05 gain 218 17 -113.41 gain 17 219 -113.77 gain 219 17 -113.70 gain 17 220 -111.84 gain 220 17 -108.88 gain 17 221 -119.01 gain 221 17 -117.05 gain 17 222 -111.93 gain 222 17 -106.54 gain 17 223 -111.07 gain 223 17 -107.97 gain 17 224 -111.51 gain 224 17 -105.34 gain 18 19 -71.65 gain 19 18 -79.93 gain 18 20 -79.86 gain 20 18 -84.32 gain 18 21 -86.95 gain 21 18 -91.20 gain 18 22 -93.73 gain 22 18 -96.32 gain 18 23 -97.94 gain 23 18 -102.98 gain 18 24 -94.14 gain 24 18 -97.08 gain 18 25 -93.64 gain 25 18 -97.56 gain 18 26 -98.39 gain 26 18 -102.78 gain 18 27 -97.85 gain 27 18 -101.58 gain 18 28 -106.63 gain 28 18 -112.31 gain 18 29 -103.38 gain 29 18 -100.68 gain 18 30 -88.73 gain 30 18 -97.73 gain 18 31 -88.10 gain 31 18 -94.18 gain 18 32 -79.66 gain 32 18 -80.88 gain 18 33 -71.17 gain 33 18 -71.16 gain 18 34 -82.51 gain 34 18 -89.49 gain 18 35 -84.39 gain 35 18 -89.28 gain 18 36 -81.58 gain 36 18 -85.29 gain 18 37 -89.36 gain 37 18 -92.47 gain 18 38 -88.71 gain 38 18 -93.02 gain 18 39 -95.87 gain 39 18 -97.64 gain 18 40 -89.79 gain 40 18 -93.62 gain 18 41 -101.34 gain 41 18 -104.82 gain 18 42 -102.10 gain 42 18 -108.60 gain 18 43 -100.90 gain 43 18 -107.92 gain 18 44 -101.07 gain 44 18 -106.08 gain 18 45 -87.51 gain 45 18 -88.55 gain 18 46 -90.04 gain 46 18 -93.95 gain 18 47 -83.75 gain 47 18 -89.50 gain 18 48 -75.01 gain 48 18 -77.77 gain 18 49 -85.88 gain 49 18 -85.28 gain 18 50 -84.26 gain 50 18 -85.56 gain 18 51 -79.56 gain 51 18 -82.64 gain 18 52 -94.63 gain 52 18 -94.14 gain 18 53 -96.18 gain 53 18 -100.19 gain 18 54 -97.00 gain 54 18 -97.52 gain 18 55 -100.16 gain 55 18 -103.80 gain 18 56 -102.93 gain 56 18 -109.67 gain 18 57 -95.81 gain 57 18 -104.59 gain 18 58 -99.63 gain 58 18 -107.96 gain 18 59 -107.96 gain 59 18 -114.45 gain 18 60 -82.98 gain 60 18 -87.88 gain 18 61 -89.34 gain 61 18 -87.12 gain 18 62 -87.54 gain 62 18 -88.12 gain 18 63 -86.30 gain 63 18 -85.89 gain 18 64 -90.98 gain 64 18 -94.95 gain 18 65 -84.69 gain 65 18 -88.71 gain 18 66 -88.22 gain 66 18 -91.55 gain 18 67 -87.15 gain 67 18 -90.59 gain 18 68 -90.26 gain 68 18 -93.66 gain 18 69 -99.38 gain 69 18 -101.04 gain 18 70 -97.01 gain 70 18 -101.37 gain 18 71 -101.47 gain 71 18 -106.59 gain 18 72 -109.05 gain 72 18 -116.02 gain 18 73 -94.63 gain 73 18 -98.65 gain 18 74 -98.73 gain 74 18 -98.74 gain 18 75 -95.95 gain 75 18 -96.35 gain 18 76 -92.81 gain 76 18 -95.70 gain 18 77 -94.40 gain 77 18 -95.59 gain 18 78 -96.91 gain 78 18 -106.74 gain 18 79 -86.86 gain 79 18 -91.23 gain 18 80 -94.17 gain 80 18 -96.87 gain 18 81 -89.16 gain 81 18 -96.14 gain 18 82 -91.80 gain 82 18 -97.93 gain 18 83 -92.30 gain 83 18 -98.01 gain 18 84 -91.63 gain 84 18 -94.42 gain 18 85 -106.36 gain 85 18 -113.73 gain 18 86 -99.08 gain 86 18 -99.63 gain 18 87 -95.86 gain 87 18 -99.21 gain 18 88 -107.65 gain 88 18 -111.28 gain 18 89 -106.89 gain 89 18 -111.16 gain 18 90 -93.32 gain 90 18 -101.12 gain 18 91 -96.35 gain 91 18 -99.74 gain 18 92 -97.42 gain 92 18 -104.38 gain 18 93 -89.77 gain 93 18 -90.64 gain 18 94 -94.21 gain 94 18 -97.52 gain 18 95 -97.04 gain 95 18 -103.39 gain 18 96 -90.44 gain 96 18 -93.06 gain 18 97 -94.37 gain 97 18 -98.27 gain 18 98 -90.83 gain 98 18 -91.90 gain 18 99 -97.99 gain 99 18 -103.15 gain 18 100 -93.30 gain 100 18 -96.30 gain 18 101 -98.15 gain 101 18 -99.81 gain 18 102 -91.24 gain 102 18 -93.57 gain 18 103 -95.25 gain 103 18 -96.81 gain 18 104 -104.56 gain 104 18 -102.55 gain 18 105 -90.20 gain 105 18 -93.59 gain 18 106 -95.75 gain 106 18 -98.44 gain 18 107 -106.70 gain 107 18 -112.41 gain 18 108 -81.78 gain 108 18 -85.55 gain 18 109 -93.79 gain 109 18 -94.41 gain 18 110 -103.34 gain 110 18 -106.20 gain 18 111 -96.61 gain 111 18 -96.67 gain 18 112 -98.36 gain 112 18 -100.42 gain 18 113 -94.96 gain 113 18 -103.95 gain 18 114 -111.79 gain 114 18 -116.41 gain 18 115 -100.43 gain 115 18 -105.92 gain 18 116 -110.99 gain 116 18 -112.50 gain 18 117 -101.44 gain 117 18 -102.79 gain 18 118 -105.74 gain 118 18 -115.27 gain 18 119 -108.84 gain 119 18 -109.91 gain 18 120 -95.84 gain 120 18 -97.01 gain 18 121 -97.53 gain 121 18 -101.45 gain 18 122 -101.99 gain 122 18 -108.49 gain 18 123 -91.95 gain 123 18 -98.69 gain 18 124 -100.57 gain 124 18 -100.92 gain 18 125 -94.59 gain 125 18 -96.88 gain 18 126 -102.73 gain 126 18 -109.89 gain 18 127 -104.40 gain 127 18 -106.32 gain 18 128 -98.96 gain 128 18 -103.93 gain 18 129 -98.28 gain 129 18 -100.47 gain 18 130 -99.43 gain 130 18 -103.80 gain 18 131 -103.48 gain 131 18 -106.22 gain 18 132 -101.74 gain 132 18 -100.75 gain 18 133 -107.53 gain 133 18 -110.97 gain 18 134 -110.34 gain 134 18 -111.77 gain 18 135 -101.84 gain 135 18 -98.86 gain 18 136 -105.83 gain 136 18 -111.62 gain 18 137 -99.95 gain 137 18 -102.40 gain 18 138 -98.39 gain 138 18 -102.86 gain 18 139 -96.19 gain 139 18 -102.36 gain 18 140 -108.24 gain 140 18 -114.22 gain 18 141 -98.11 gain 141 18 -99.78 gain 18 142 -105.58 gain 142 18 -108.40 gain 18 143 -99.50 gain 143 18 -104.78 gain 18 144 -101.41 gain 144 18 -102.58 gain 18 145 -102.71 gain 145 18 -108.43 gain 18 146 -102.08 gain 146 18 -104.25 gain 18 147 -106.88 gain 147 18 -110.24 gain 18 148 -101.87 gain 148 18 -105.76 gain 18 149 -109.35 gain 149 18 -109.61 gain 18 150 -106.49 gain 150 18 -110.13 gain 18 151 -101.62 gain 151 18 -107.75 gain 18 152 -102.40 gain 152 18 -106.88 gain 18 153 -97.37 gain 153 18 -101.55 gain 18 154 -98.31 gain 154 18 -103.62 gain 18 155 -103.51 gain 155 18 -106.11 gain 18 156 -102.85 gain 156 18 -106.58 gain 18 157 -99.93 gain 157 18 -104.95 gain 18 158 -102.46 gain 158 18 -109.46 gain 18 159 -99.61 gain 159 18 -100.64 gain 18 160 -100.13 gain 160 18 -102.54 gain 18 161 -106.06 gain 161 18 -109.53 gain 18 162 -105.71 gain 162 18 -108.80 gain 18 163 -105.87 gain 163 18 -106.39 gain 18 164 -114.10 gain 164 18 -121.84 gain 18 165 -106.94 gain 165 18 -112.04 gain 18 166 -101.74 gain 166 18 -108.50 gain 18 167 -102.99 gain 167 18 -108.57 gain 18 168 -102.20 gain 168 18 -106.84 gain 18 169 -97.68 gain 169 18 -98.84 gain 18 170 -104.78 gain 170 18 -106.88 gain 18 171 -99.11 gain 171 18 -101.78 gain 18 172 -108.68 gain 172 18 -114.15 gain 18 173 -104.45 gain 173 18 -104.24 gain 18 174 -102.67 gain 174 18 -108.41 gain 18 175 -105.25 gain 175 18 -102.79 gain 18 176 -100.55 gain 176 18 -102.31 gain 18 177 -106.10 gain 177 18 -110.22 gain 18 178 -109.04 gain 178 18 -110.77 gain 18 179 -107.85 gain 179 18 -112.62 gain 18 180 -100.06 gain 180 18 -103.58 gain 18 181 -102.40 gain 181 18 -109.31 gain 18 182 -105.27 gain 182 18 -108.31 gain 18 183 -103.95 gain 183 18 -102.88 gain 18 184 -97.98 gain 184 18 -103.14 gain 18 185 -103.44 gain 185 18 -107.10 gain 18 186 -96.86 gain 186 18 -101.22 gain 18 187 -108.32 gain 187 18 -112.71 gain 18 188 -102.43 gain 188 18 -111.26 gain 18 189 -109.84 gain 189 18 -114.73 gain 18 190 -105.82 gain 190 18 -103.54 gain 18 191 -104.72 gain 191 18 -105.62 gain 18 192 -107.53 gain 192 18 -112.09 gain 18 193 -108.50 gain 193 18 -109.09 gain 18 194 -105.17 gain 194 18 -105.65 gain 18 195 -110.04 gain 195 18 -108.49 gain 18 196 -106.43 gain 196 18 -112.54 gain 18 197 -99.94 gain 197 18 -103.55 gain 18 198 -97.97 gain 198 18 -104.22 gain 18 199 -107.89 gain 199 18 -108.16 gain 18 200 -101.47 gain 200 18 -103.66 gain 18 201 -106.78 gain 201 18 -112.05 gain 18 202 -107.96 gain 202 18 -111.53 gain 18 203 -106.15 gain 203 18 -109.82 gain 18 204 -110.00 gain 204 18 -111.89 gain 18 205 -100.28 gain 205 18 -101.83 gain 18 206 -100.83 gain 206 18 -103.71 gain 18 207 -109.60 gain 207 18 -110.22 gain 18 208 -100.11 gain 208 18 -104.04 gain 18 209 -108.77 gain 209 18 -111.73 gain 18 210 -105.29 gain 210 18 -112.25 gain 18 211 -103.07 gain 211 18 -107.43 gain 18 212 -109.35 gain 212 18 -112.25 gain 18 213 -100.09 gain 213 18 -105.73 gain 18 214 -100.21 gain 214 18 -104.04 gain 18 215 -107.59 gain 215 18 -113.23 gain 18 216 -108.56 gain 216 18 -111.09 gain 18 217 -109.24 gain 217 18 -116.23 gain 18 218 -105.53 gain 218 18 -113.83 gain 18 219 -102.29 gain 219 18 -108.16 gain 18 220 -100.83 gain 220 18 -103.82 gain 18 221 -104.41 gain 221 18 -108.39 gain 18 222 -106.89 gain 222 18 -107.44 gain 18 223 -116.03 gain 223 18 -118.87 gain 18 224 -101.59 gain 224 18 -101.36 gain 19 20 -82.29 gain 20 19 -78.47 gain 19 21 -90.48 gain 21 19 -86.45 gain 19 22 -92.43 gain 22 19 -86.74 gain 19 23 -98.35 gain 23 19 -95.11 gain 19 24 -99.65 gain 24 19 -94.31 gain 19 25 -98.43 gain 25 19 -94.07 gain 19 26 -101.08 gain 26 19 -97.18 gain 19 27 -109.55 gain 27 19 -105.00 gain 19 28 -117.46 gain 28 19 -114.85 gain 19 29 -109.32 gain 29 19 -98.34 gain 19 30 -102.40 gain 30 19 -103.12 gain 19 31 -95.34 gain 31 19 -93.14 gain 19 32 -86.89 gain 32 19 -79.82 gain 19 33 -77.84 gain 33 19 -69.55 gain 19 34 -79.52 gain 34 19 -78.21 gain 19 35 -82.34 gain 35 19 -78.95 gain 19 36 -95.80 gain 36 19 -91.22 gain 19 37 -96.32 gain 37 19 -91.14 gain 19 38 -105.44 gain 38 19 -101.47 gain 19 39 -101.79 gain 39 19 -95.28 gain 19 40 -103.37 gain 40 19 -98.92 gain 19 41 -107.06 gain 41 19 -102.26 gain 19 42 -106.78 gain 42 19 -105.00 gain 19 43 -104.22 gain 43 19 -102.96 gain 19 44 -114.09 gain 44 19 -110.82 gain 19 45 -99.47 gain 45 19 -92.22 gain 19 46 -93.49 gain 46 19 -89.11 gain 19 47 -90.25 gain 47 19 -87.72 gain 19 48 -94.24 gain 48 19 -88.71 gain 19 49 -92.46 gain 49 19 -83.58 gain 19 50 -87.34 gain 50 19 -80.35 gain 19 51 -93.25 gain 51 19 -88.05 gain 19 52 -98.65 gain 52 19 -89.87 gain 19 53 -102.40 gain 53 19 -98.12 gain 19 54 -101.75 gain 54 19 -93.99 gain 19 55 -110.73 gain 55 19 -106.09 gain 19 56 -104.26 gain 56 19 -102.72 gain 19 57 -106.80 gain 57 19 -107.30 gain 19 58 -113.94 gain 58 19 -113.98 gain 19 59 -109.79 gain 59 19 -108.00 gain 19 60 -96.67 gain 60 19 -93.29 gain 19 61 -101.73 gain 61 19 -91.23 gain 19 62 -89.01 gain 62 19 -81.31 gain 19 63 -91.46 gain 63 19 -82.76 gain 19 64 -88.60 gain 64 19 -84.29 gain 19 65 -96.96 gain 65 19 -92.69 gain 19 66 -93.37 gain 66 19 -88.40 gain 19 67 -99.82 gain 67 19 -94.99 gain 19 68 -109.16 gain 68 19 -104.27 gain 19 69 -110.14 gain 69 19 -103.52 gain 19 70 -108.30 gain 70 19 -104.38 gain 19 71 -102.82 gain 71 19 -99.66 gain 19 72 -107.12 gain 72 19 -105.80 gain 19 73 -109.16 gain 73 19 -104.89 gain 19 74 -106.12 gain 74 19 -97.85 gain 19 75 -104.26 gain 75 19 -96.37 gain 19 76 -101.62 gain 76 19 -96.22 gain 19 77 -103.97 gain 77 19 -96.88 gain 19 78 -98.70 gain 78 19 -100.24 gain 19 79 -93.77 gain 79 19 -89.85 gain 19 80 -99.94 gain 80 19 -94.36 gain 19 81 -91.81 gain 81 19 -90.50 gain 19 82 -98.73 gain 82 19 -96.58 gain 19 83 -107.12 gain 83 19 -104.55 gain 19 84 -104.32 gain 84 19 -98.82 gain 19 85 -106.91 gain 85 19 -105.99 gain 19 86 -109.79 gain 86 19 -102.06 gain 19 87 -112.02 gain 87 19 -107.09 gain 19 88 -110.76 gain 88 19 -106.11 gain 19 89 -109.24 gain 89 19 -105.22 gain 19 90 -107.56 gain 90 19 -107.08 gain 19 91 -106.15 gain 91 19 -101.26 gain 19 92 -99.50 gain 92 19 -98.17 gain 19 93 -101.54 gain 93 19 -94.13 gain 19 94 -99.21 gain 94 19 -94.23 gain 19 95 -106.30 gain 95 19 -104.36 gain 19 96 -109.97 gain 96 19 -104.31 gain 19 97 -104.97 gain 97 19 -100.58 gain 19 98 -100.47 gain 98 19 -93.26 gain 19 99 -109.30 gain 99 19 -106.17 gain 19 100 -105.47 gain 100 19 -100.19 gain 19 101 -112.28 gain 101 19 -105.66 gain 19 102 -113.69 gain 102 19 -107.73 gain 19 103 -114.78 gain 103 19 -108.05 gain 19 104 -110.74 gain 104 19 -100.44 gain 19 105 -101.11 gain 105 19 -96.21 gain 19 106 -106.88 gain 106 19 -101.28 gain 19 107 -104.67 gain 107 19 -102.10 gain 19 108 -110.18 gain 108 19 -105.67 gain 19 109 -105.18 gain 109 19 -97.51 gain 19 110 -98.11 gain 110 19 -92.68 gain 19 111 -106.41 gain 111 19 -98.18 gain 19 112 -99.86 gain 112 19 -93.64 gain 19 113 -104.04 gain 113 19 -104.74 gain 19 114 -96.99 gain 114 19 -93.33 gain 19 115 -108.31 gain 115 19 -105.51 gain 19 116 -107.24 gain 116 19 -100.47 gain 19 117 -110.99 gain 117 19 -104.05 gain 19 118 -111.52 gain 118 19 -112.76 gain 19 119 -117.11 gain 119 19 -109.90 gain 19 120 -102.32 gain 120 19 -95.21 gain 19 121 -114.65 gain 121 19 -110.29 gain 19 122 -116.30 gain 122 19 -114.51 gain 19 123 -107.00 gain 123 19 -105.46 gain 19 124 -104.01 gain 124 19 -96.08 gain 19 125 -108.28 gain 125 19 -102.28 gain 19 126 -101.11 gain 126 19 -99.99 gain 19 127 -111.67 gain 127 19 -105.31 gain 19 128 -115.09 gain 128 19 -111.79 gain 19 129 -110.58 gain 129 19 -104.49 gain 19 130 -111.92 gain 130 19 -108.01 gain 19 131 -112.46 gain 131 19 -106.91 gain 19 132 -108.08 gain 132 19 -98.80 gain 19 133 -110.43 gain 133 19 -105.59 gain 19 134 -110.57 gain 134 19 -103.72 gain 19 135 -108.30 gain 135 19 -97.03 gain 19 136 -104.16 gain 136 19 -101.67 gain 19 137 -109.66 gain 137 19 -103.83 gain 19 138 -111.16 gain 138 19 -107.34 gain 19 139 -107.74 gain 139 19 -105.63 gain 19 140 -99.46 gain 140 19 -97.16 gain 19 141 -105.36 gain 141 19 -98.75 gain 19 142 -101.81 gain 142 19 -96.34 gain 19 143 -111.23 gain 143 19 -108.21 gain 19 144 -107.13 gain 144 19 -100.02 gain 19 145 -112.16 gain 145 19 -109.60 gain 19 146 -112.02 gain 146 19 -105.90 gain 19 147 -111.02 gain 147 19 -106.10 gain 19 148 -116.64 gain 148 19 -112.24 gain 19 149 -117.79 gain 149 19 -109.76 gain 19 150 -113.74 gain 150 19 -109.10 gain 19 151 -114.94 gain 151 19 -112.77 gain 19 152 -104.47 gain 152 19 -100.67 gain 19 153 -111.30 gain 153 19 -107.19 gain 19 154 -105.66 gain 154 19 -102.69 gain 19 155 -107.83 gain 155 19 -102.15 gain 19 156 -108.52 gain 156 19 -103.97 gain 19 157 -108.57 gain 157 19 -105.31 gain 19 158 -111.18 gain 158 19 -109.89 gain 19 159 -109.07 gain 159 19 -101.82 gain 19 160 -112.80 gain 160 19 -106.93 gain 19 161 -111.17 gain 161 19 -106.35 gain 19 162 -110.64 gain 162 19 -105.45 gain 19 163 -107.62 gain 163 19 -99.85 gain 19 164 -116.57 gain 164 19 -116.03 gain 19 165 -111.92 gain 165 19 -108.74 gain 19 166 -116.72 gain 166 19 -115.19 gain 19 167 -108.15 gain 167 19 -105.45 gain 19 168 -107.00 gain 168 19 -103.36 gain 19 169 -115.88 gain 169 19 -108.76 gain 19 170 -111.56 gain 170 19 -105.38 gain 19 171 -116.62 gain 171 19 -111.00 gain 19 172 -109.32 gain 172 19 -106.51 gain 19 173 -113.81 gain 173 19 -105.32 gain 19 174 -104.26 gain 174 19 -101.72 gain 19 175 -113.39 gain 175 19 -102.65 gain 19 176 -109.33 gain 176 19 -102.81 gain 19 177 -107.38 gain 177 19 -103.22 gain 19 178 -114.34 gain 178 19 -107.79 gain 19 179 -113.75 gain 179 19 -110.24 gain 19 180 -123.77 gain 180 19 -119.00 gain 19 181 -110.52 gain 181 19 -109.15 gain 19 182 -112.44 gain 182 19 -107.20 gain 19 183 -113.20 gain 183 19 -103.85 gain 19 184 -106.78 gain 184 19 -103.66 gain 19 185 -111.86 gain 185 19 -107.23 gain 19 186 -112.14 gain 186 19 -108.22 gain 19 187 -105.84 gain 187 19 -101.94 gain 19 188 -106.73 gain 188 19 -107.28 gain 19 189 -116.31 gain 189 19 -112.91 gain 19 190 -117.61 gain 190 19 -107.04 gain 19 191 -115.94 gain 191 19 -108.55 gain 19 192 -114.30 gain 192 19 -110.58 gain 19 193 -116.91 gain 193 19 -109.22 gain 19 194 -117.39 gain 194 19 -109.58 gain 19 195 -111.11 gain 195 19 -101.27 gain 19 196 -107.26 gain 196 19 -105.09 gain 19 197 -107.87 gain 197 19 -103.19 gain 19 198 -113.11 gain 198 19 -111.08 gain 19 199 -108.36 gain 199 19 -100.34 gain 19 200 -114.37 gain 200 19 -108.27 gain 19 201 -116.83 gain 201 19 -113.82 gain 19 202 -110.39 gain 202 19 -105.68 gain 19 203 -109.38 gain 203 19 -104.77 gain 19 204 -115.44 gain 204 19 -109.04 gain 19 205 -113.74 gain 205 19 -107.02 gain 19 206 -117.27 gain 206 19 -111.87 gain 19 207 -110.66 gain 207 19 -103.00 gain 19 208 -123.08 gain 208 19 -118.72 gain 19 209 -116.18 gain 209 19 -110.86 gain 19 210 -110.67 gain 210 19 -109.35 gain 19 211 -118.75 gain 211 19 -114.82 gain 19 212 -113.81 gain 212 19 -108.43 gain 19 213 -116.08 gain 213 19 -113.43 gain 19 214 -113.20 gain 214 19 -108.74 gain 19 215 -121.95 gain 215 19 -119.31 gain 19 216 -114.10 gain 216 19 -108.35 gain 19 217 -114.63 gain 217 19 -113.33 gain 19 218 -114.48 gain 218 19 -114.49 gain 19 219 -119.12 gain 219 19 -116.72 gain 19 220 -113.57 gain 220 19 -108.27 gain 19 221 -117.43 gain 221 19 -113.12 gain 19 222 -111.12 gain 222 19 -103.40 gain 19 223 -111.54 gain 223 19 -106.10 gain 19 224 -120.80 gain 224 19 -112.30 gain 20 21 -67.86 gain 21 20 -67.65 gain 20 22 -97.80 gain 22 20 -95.94 gain 20 23 -91.38 gain 23 20 -91.96 gain 20 24 -91.39 gain 24 20 -89.88 gain 20 25 -89.45 gain 25 20 -88.91 gain 20 26 -104.46 gain 26 20 -104.39 gain 20 27 -102.93 gain 27 20 -102.20 gain 20 28 -102.89 gain 28 20 -104.11 gain 20 29 -114.82 gain 29 20 -107.67 gain 20 30 -102.40 gain 30 20 -106.94 gain 20 31 -93.39 gain 31 20 -95.01 gain 20 32 -97.53 gain 32 20 -94.29 gain 20 33 -94.12 gain 33 20 -89.65 gain 20 34 -77.74 gain 34 20 -80.26 gain 20 35 -76.62 gain 35 20 -77.05 gain 20 36 -85.93 gain 36 20 -85.17 gain 20 37 -88.60 gain 37 20 -87.25 gain 20 38 -94.16 gain 38 20 -94.01 gain 20 39 -94.70 gain 39 20 -92.02 gain 20 40 -99.80 gain 40 20 -99.18 gain 20 41 -97.95 gain 41 20 -96.97 gain 20 42 -94.05 gain 42 20 -96.09 gain 20 43 -102.79 gain 43 20 -105.35 gain 20 44 -102.34 gain 44 20 -102.89 gain 20 45 -95.46 gain 45 20 -92.04 gain 20 46 -94.60 gain 46 20 -94.05 gain 20 47 -86.25 gain 47 20 -87.55 gain 20 48 -84.80 gain 48 20 -83.11 gain 20 49 -90.17 gain 49 20 -85.11 gain 20 50 -79.62 gain 50 20 -76.46 gain 20 51 -79.82 gain 51 20 -78.44 gain 20 52 -93.37 gain 52 20 -88.42 gain 20 53 -97.52 gain 53 20 -97.06 gain 20 54 -98.96 gain 54 20 -95.02 gain 20 55 -91.23 gain 55 20 -90.41 gain 20 56 -99.41 gain 56 20 -101.69 gain 20 57 -106.93 gain 57 20 -111.25 gain 20 58 -108.43 gain 58 20 -112.30 gain 20 59 -102.31 gain 59 20 -104.34 gain 20 60 -95.38 gain 60 20 -95.82 gain 20 61 -93.46 gain 61 20 -86.78 gain 20 62 -95.78 gain 62 20 -91.90 gain 20 63 -93.61 gain 63 20 -88.74 gain 20 64 -91.26 gain 64 20 -90.77 gain 20 65 -87.86 gain 65 20 -87.42 gain 20 66 -95.28 gain 66 20 -94.15 gain 20 67 -92.67 gain 67 20 -91.65 gain 20 68 -92.88 gain 68 20 -91.83 gain 20 69 -94.18 gain 69 20 -91.39 gain 20 70 -101.06 gain 70 20 -100.96 gain 20 71 -104.29 gain 71 20 -104.95 gain 20 72 -105.38 gain 72 20 -107.89 gain 20 73 -106.04 gain 73 20 -105.60 gain 20 74 -100.89 gain 74 20 -96.45 gain 20 75 -104.90 gain 75 20 -100.84 gain 20 76 -106.00 gain 76 20 -104.43 gain 20 77 -96.16 gain 77 20 -92.89 gain 20 78 -94.55 gain 78 20 -99.91 gain 20 79 -93.87 gain 79 20 -93.78 gain 20 80 -101.28 gain 80 20 -99.52 gain 20 81 -91.17 gain 81 20 -93.69 gain 20 82 -86.82 gain 82 20 -88.49 gain 20 83 -99.56 gain 83 20 -100.81 gain 20 84 -108.73 gain 84 20 -107.05 gain 20 85 -108.26 gain 85 20 -111.17 gain 20 86 -97.21 gain 86 20 -93.30 gain 20 87 -107.20 gain 87 20 -106.09 gain 20 88 -107.25 gain 88 20 -106.43 gain 20 89 -109.30 gain 89 20 -109.11 gain 20 90 -95.60 gain 90 20 -98.94 gain 20 91 -97.76 gain 91 20 -96.69 gain 20 92 -95.02 gain 92 20 -97.52 gain 20 93 -100.43 gain 93 20 -96.85 gain 20 94 -93.22 gain 94 20 -92.06 gain 20 95 -94.15 gain 95 20 -96.04 gain 20 96 -100.53 gain 96 20 -98.70 gain 20 97 -99.33 gain 97 20 -98.76 gain 20 98 -101.21 gain 98 20 -97.83 gain 20 99 -101.27 gain 99 20 -101.97 gain 20 100 -105.22 gain 100 20 -103.77 gain 20 101 -105.76 gain 101 20 -102.97 gain 20 102 -110.28 gain 102 20 -108.15 gain 20 103 -106.17 gain 103 20 -103.27 gain 20 104 -110.48 gain 104 20 -104.01 gain 20 105 -103.67 gain 105 20 -102.60 gain 20 106 -98.55 gain 106 20 -96.78 gain 20 107 -100.38 gain 107 20 -101.63 gain 20 108 -99.04 gain 108 20 -98.36 gain 20 109 -92.28 gain 109 20 -88.44 gain 20 110 -99.60 gain 110 20 -98.00 gain 20 111 -103.88 gain 111 20 -99.48 gain 20 112 -92.68 gain 112 20 -90.27 gain 20 113 -104.66 gain 113 20 -109.19 gain 20 114 -101.77 gain 114 20 -101.93 gain 20 115 -95.87 gain 115 20 -96.89 gain 20 116 -102.89 gain 116 20 -99.94 gain 20 117 -104.45 gain 117 20 -101.34 gain 20 118 -110.57 gain 118 20 -115.64 gain 20 119 -102.40 gain 119 20 -99.02 gain 20 120 -110.98 gain 120 20 -107.69 gain 20 121 -98.17 gain 121 20 -97.63 gain 20 122 -102.83 gain 122 20 -104.86 gain 20 123 -109.04 gain 123 20 -111.33 gain 20 124 -98.28 gain 124 20 -94.17 gain 20 125 -102.33 gain 125 20 -100.15 gain 20 126 -102.33 gain 126 20 -105.03 gain 20 127 -97.88 gain 127 20 -95.34 gain 20 128 -98.12 gain 128 20 -98.64 gain 20 129 -100.76 gain 129 20 -98.50 gain 20 130 -101.52 gain 130 20 -101.44 gain 20 131 -107.50 gain 131 20 -105.77 gain 20 132 -112.19 gain 132 20 -106.74 gain 20 133 -104.30 gain 133 20 -103.28 gain 20 134 -109.10 gain 134 20 -106.07 gain 20 135 -103.35 gain 135 20 -95.91 gain 20 136 -113.38 gain 136 20 -114.72 gain 20 137 -107.97 gain 137 20 -105.96 gain 20 138 -98.38 gain 138 20 -98.39 gain 20 139 -104.05 gain 139 20 -105.77 gain 20 140 -103.35 gain 140 20 -104.88 gain 20 141 -100.59 gain 141 20 -97.80 gain 20 142 -103.55 gain 142 20 -101.91 gain 20 143 -103.62 gain 143 20 -104.44 gain 20 144 -102.50 gain 144 20 -99.22 gain 20 145 -101.82 gain 145 20 -103.09 gain 20 146 -102.10 gain 146 20 -99.81 gain 20 147 -113.63 gain 147 20 -112.53 gain 20 148 -110.52 gain 148 20 -109.95 gain 20 149 -107.11 gain 149 20 -102.91 gain 20 150 -106.87 gain 150 20 -106.05 gain 20 151 -105.06 gain 151 20 -106.72 gain 20 152 -107.68 gain 152 20 -107.70 gain 20 153 -107.82 gain 153 20 -107.54 gain 20 154 -110.34 gain 154 20 -111.19 gain 20 155 -105.38 gain 155 20 -103.53 gain 20 156 -103.29 gain 156 20 -102.56 gain 20 157 -101.96 gain 157 20 -102.53 gain 20 158 -106.79 gain 158 20 -109.33 gain 20 159 -107.24 gain 159 20 -103.82 gain 20 160 -107.27 gain 160 20 -105.22 gain 20 161 -107.06 gain 161 20 -106.06 gain 20 162 -103.37 gain 162 20 -102.00 gain 20 163 -109.55 gain 163 20 -105.61 gain 20 164 -107.74 gain 164 20 -111.03 gain 20 165 -108.71 gain 165 20 -109.35 gain 20 166 -102.11 gain 166 20 -104.40 gain 20 167 -105.05 gain 167 20 -106.18 gain 20 168 -105.31 gain 168 20 -105.50 gain 20 169 -107.84 gain 169 20 -104.54 gain 20 170 -104.13 gain 170 20 -101.77 gain 20 171 -110.21 gain 171 20 -108.42 gain 20 172 -104.45 gain 172 20 -105.46 gain 20 173 -109.49 gain 173 20 -104.82 gain 20 174 -102.76 gain 174 20 -104.05 gain 20 175 -106.08 gain 175 20 -99.17 gain 20 176 -107.26 gain 176 20 -104.57 gain 20 177 -109.48 gain 177 20 -109.15 gain 20 178 -110.44 gain 178 20 -107.72 gain 20 179 -115.58 gain 179 20 -115.90 gain 20 180 -108.44 gain 180 20 -107.50 gain 20 181 -107.99 gain 181 20 -110.45 gain 20 182 -106.86 gain 182 20 -105.45 gain 20 183 -114.31 gain 183 20 -108.78 gain 20 184 -105.71 gain 184 20 -106.41 gain 20 185 -101.31 gain 185 20 -100.52 gain 20 186 -105.88 gain 186 20 -105.78 gain 20 187 -107.66 gain 187 20 -107.59 gain 20 188 -111.58 gain 188 20 -115.95 gain 20 189 -102.92 gain 189 20 -103.34 gain 20 190 -111.49 gain 190 20 -104.75 gain 20 191 -108.34 gain 191 20 -104.78 gain 20 192 -111.56 gain 192 20 -111.66 gain 20 193 -104.09 gain 193 20 -100.22 gain 20 194 -107.70 gain 194 20 -103.72 gain 20 195 -113.30 gain 195 20 -107.29 gain 20 196 -110.27 gain 196 20 -111.93 gain 20 197 -106.42 gain 197 20 -105.57 gain 20 198 -108.03 gain 198 20 -109.82 gain 20 199 -107.45 gain 199 20 -103.26 gain 20 200 -108.22 gain 200 20 -105.94 gain 20 201 -107.54 gain 201 20 -108.35 gain 20 202 -109.29 gain 202 20 -108.41 gain 20 203 -111.03 gain 203 20 -110.24 gain 20 204 -110.70 gain 204 20 -108.13 gain 20 205 -107.98 gain 205 20 -105.07 gain 20 206 -110.04 gain 206 20 -108.47 gain 20 207 -111.14 gain 207 20 -107.31 gain 20 208 -120.21 gain 208 20 -119.67 gain 20 209 -112.42 gain 209 20 -110.92 gain 20 210 -111.38 gain 210 20 -113.89 gain 20 211 -112.31 gain 211 20 -112.20 gain 20 212 -117.53 gain 212 20 -115.98 gain 20 213 -115.95 gain 213 20 -117.13 gain 20 214 -114.24 gain 214 20 -113.61 gain 20 215 -109.29 gain 215 20 -110.47 gain 20 216 -106.72 gain 216 20 -104.79 gain 20 217 -107.82 gain 217 20 -110.34 gain 20 218 -114.79 gain 218 20 -118.63 gain 20 219 -113.93 gain 219 20 -115.35 gain 20 220 -110.59 gain 220 20 -109.12 gain 20 221 -111.61 gain 221 20 -111.13 gain 20 222 -108.11 gain 222 20 -104.21 gain 20 223 -111.07 gain 223 20 -109.46 gain 20 224 -103.49 gain 224 20 -98.81 gain 21 22 -72.57 gain 22 21 -70.91 gain 21 23 -86.63 gain 23 21 -87.42 gain 21 24 -89.34 gain 24 21 -88.03 gain 21 25 -98.03 gain 25 21 -97.70 gain 21 26 -99.21 gain 26 21 -99.34 gain 21 27 -96.05 gain 27 21 -95.52 gain 21 28 -98.81 gain 28 21 -100.24 gain 21 29 -108.57 gain 29 21 -101.63 gain 21 30 -106.51 gain 30 21 -111.26 gain 21 31 -97.18 gain 31 21 -99.01 gain 21 32 -96.80 gain 32 21 -93.77 gain 21 33 -87.91 gain 33 21 -83.65 gain 21 34 -85.93 gain 34 21 -88.66 gain 21 35 -85.45 gain 35 21 -86.09 gain 21 36 -76.35 gain 36 21 -75.81 gain 21 37 -69.92 gain 37 21 -68.78 gain 21 38 -85.09 gain 38 21 -85.15 gain 21 39 -91.17 gain 39 21 -88.69 gain 21 40 -95.44 gain 40 21 -95.03 gain 21 41 -96.34 gain 41 21 -95.57 gain 21 42 -94.71 gain 42 21 -96.96 gain 21 43 -103.84 gain 43 21 -106.61 gain 21 44 -100.84 gain 44 21 -101.60 gain 21 45 -104.14 gain 45 21 -100.92 gain 21 46 -94.95 gain 46 21 -94.60 gain 21 47 -92.27 gain 47 21 -93.77 gain 21 48 -99.41 gain 48 21 -97.92 gain 21 49 -85.18 gain 49 21 -80.32 gain 21 50 -85.45 gain 50 21 -82.49 gain 21 51 -80.87 gain 51 21 -79.70 gain 21 52 -84.30 gain 52 21 -79.56 gain 21 53 -87.58 gain 53 21 -87.33 gain 21 54 -92.15 gain 54 21 -88.42 gain 21 55 -94.90 gain 55 21 -94.29 gain 21 56 -99.92 gain 56 21 -102.41 gain 21 57 -103.40 gain 57 21 -107.93 gain 21 58 -107.98 gain 58 21 -112.06 gain 21 59 -112.40 gain 59 21 -114.64 gain 21 60 -98.78 gain 60 21 -99.43 gain 21 61 -104.14 gain 61 21 -97.67 gain 21 62 -104.58 gain 62 21 -100.91 gain 21 63 -98.50 gain 63 21 -93.84 gain 21 64 -90.51 gain 64 21 -90.24 gain 21 65 -93.15 gain 65 21 -92.91 gain 21 66 -89.26 gain 66 21 -88.33 gain 21 67 -89.44 gain 67 21 -88.63 gain 21 68 -92.92 gain 68 21 -92.07 gain 21 69 -96.62 gain 69 21 -94.03 gain 21 70 -94.01 gain 70 21 -94.11 gain 21 71 -100.30 gain 71 21 -101.16 gain 21 72 -101.94 gain 72 21 -104.66 gain 21 73 -98.46 gain 73 21 -98.22 gain 21 74 -100.64 gain 74 21 -96.40 gain 21 75 -109.42 gain 75 21 -105.56 gain 21 76 -95.81 gain 76 21 -94.45 gain 21 77 -104.22 gain 77 21 -101.16 gain 21 78 -94.43 gain 78 21 -100.00 gain 21 79 -104.23 gain 79 21 -104.34 gain 21 80 -92.55 gain 80 21 -91.00 gain 21 81 -87.87 gain 81 21 -90.59 gain 21 82 -92.97 gain 82 21 -94.85 gain 21 83 -95.29 gain 83 21 -96.75 gain 21 84 -107.40 gain 84 21 -105.94 gain 21 85 -100.68 gain 85 21 -103.80 gain 21 86 -96.63 gain 86 21 -92.93 gain 21 87 -107.54 gain 87 21 -106.64 gain 21 88 -108.20 gain 88 21 -107.58 gain 21 89 -107.02 gain 89 21 -107.04 gain 21 90 -104.48 gain 90 21 -108.03 gain 21 91 -105.28 gain 91 21 -104.42 gain 21 92 -104.86 gain 92 21 -107.57 gain 21 93 -104.44 gain 93 21 -101.06 gain 21 94 -97.37 gain 94 21 -96.42 gain 21 95 -96.01 gain 95 21 -98.10 gain 21 96 -105.68 gain 96 21 -104.05 gain 21 97 -92.73 gain 97 21 -92.38 gain 21 98 -101.91 gain 98 21 -98.72 gain 21 99 -102.90 gain 99 21 -103.81 gain 21 100 -98.19 gain 100 21 -96.94 gain 21 101 -111.74 gain 101 21 -109.15 gain 21 102 -109.77 gain 102 21 -107.84 gain 21 103 -104.07 gain 103 21 -101.37 gain 21 104 -110.62 gain 104 21 -104.36 gain 21 105 -111.14 gain 105 21 -110.28 gain 21 106 -103.54 gain 106 21 -101.98 gain 21 107 -99.63 gain 107 21 -101.08 gain 21 108 -100.08 gain 108 21 -99.60 gain 21 109 -97.98 gain 109 21 -94.34 gain 21 110 -99.39 gain 110 21 -98.00 gain 21 111 -100.72 gain 111 21 -96.52 gain 21 112 -104.37 gain 112 21 -102.17 gain 21 113 -104.03 gain 113 21 -108.77 gain 21 114 -92.99 gain 114 21 -93.36 gain 21 115 -101.62 gain 115 21 -102.85 gain 21 116 -107.18 gain 116 21 -104.44 gain 21 117 -94.47 gain 117 21 -91.57 gain 21 118 -106.11 gain 118 21 -111.38 gain 21 119 -98.14 gain 119 21 -94.96 gain 21 120 -101.90 gain 120 21 -98.83 gain 21 121 -97.46 gain 121 21 -97.13 gain 21 122 -109.67 gain 122 21 -111.91 gain 21 123 -106.06 gain 123 21 -108.55 gain 21 124 -103.85 gain 124 21 -99.95 gain 21 125 -105.85 gain 125 21 -103.88 gain 21 126 -105.09 gain 126 21 -108.00 gain 21 127 -101.19 gain 127 21 -98.86 gain 21 128 -100.91 gain 128 21 -101.63 gain 21 129 -106.46 gain 129 21 -104.40 gain 21 130 -107.14 gain 130 21 -107.26 gain 21 131 -102.88 gain 131 21 -101.36 gain 21 132 -101.84 gain 132 21 -96.60 gain 21 133 -106.34 gain 133 21 -105.53 gain 21 134 -100.28 gain 134 21 -97.46 gain 21 135 -112.50 gain 135 21 -105.26 gain 21 136 -109.75 gain 136 21 -111.29 gain 21 137 -106.85 gain 137 21 -105.05 gain 21 138 -107.76 gain 138 21 -107.98 gain 21 139 -108.06 gain 139 21 -109.99 gain 21 140 -106.22 gain 140 21 -107.95 gain 21 141 -107.95 gain 141 21 -105.37 gain 21 142 -102.66 gain 142 21 -101.23 gain 21 143 -101.50 gain 143 21 -102.52 gain 21 144 -96.10 gain 144 21 -93.02 gain 21 145 -109.62 gain 145 21 -111.09 gain 21 146 -103.96 gain 146 21 -101.87 gain 21 147 -107.23 gain 147 21 -106.34 gain 21 148 -106.13 gain 148 21 -105.76 gain 21 149 -112.62 gain 149 21 -108.63 gain 21 150 -109.73 gain 150 21 -109.12 gain 21 151 -111.31 gain 151 21 -113.18 gain 21 152 -113.92 gain 152 21 -114.15 gain 21 153 -102.69 gain 153 21 -102.62 gain 21 154 -112.60 gain 154 21 -113.66 gain 21 155 -93.74 gain 155 21 -92.09 gain 21 156 -110.90 gain 156 21 -110.38 gain 21 157 -101.98 gain 157 21 -102.76 gain 21 158 -107.82 gain 158 21 -110.56 gain 21 159 -103.73 gain 159 21 -100.51 gain 21 160 -114.83 gain 160 21 -112.99 gain 21 161 -105.40 gain 161 21 -104.62 gain 21 162 -105.54 gain 162 21 -104.38 gain 21 163 -111.25 gain 163 21 -107.52 gain 21 164 -113.75 gain 164 21 -117.24 gain 21 165 -110.16 gain 165 21 -111.01 gain 21 166 -102.24 gain 166 21 -104.74 gain 21 167 -103.21 gain 167 21 -104.54 gain 21 168 -107.84 gain 168 21 -108.23 gain 21 169 -106.71 gain 169 21 -103.62 gain 21 170 -104.03 gain 170 21 -101.88 gain 21 171 -109.51 gain 171 21 -107.93 gain 21 172 -106.95 gain 172 21 -108.17 gain 21 173 -104.00 gain 173 21 -99.54 gain 21 174 -110.41 gain 174 21 -111.90 gain 21 175 -105.62 gain 175 21 -98.90 gain 21 176 -104.94 gain 176 21 -102.45 gain 21 177 -112.39 gain 177 21 -112.26 gain 21 178 -108.90 gain 178 21 -106.38 gain 21 179 -106.01 gain 179 21 -106.54 gain 21 180 -101.51 gain 180 21 -100.77 gain 21 181 -115.89 gain 181 21 -118.56 gain 21 182 -111.68 gain 182 21 -110.48 gain 21 183 -108.26 gain 183 21 -102.94 gain 21 184 -107.68 gain 184 21 -108.59 gain 21 185 -107.54 gain 185 21 -106.95 gain 21 186 -107.95 gain 186 21 -108.06 gain 21 187 -114.05 gain 187 21 -114.18 gain 21 188 -102.79 gain 188 21 -107.36 gain 21 189 -109.49 gain 189 21 -110.12 gain 21 190 -108.97 gain 190 21 -102.43 gain 21 191 -109.60 gain 191 21 -106.24 gain 21 192 -111.21 gain 192 21 -111.52 gain 21 193 -109.29 gain 193 21 -105.62 gain 21 194 -115.09 gain 194 21 -111.31 gain 21 195 -113.61 gain 195 21 -107.81 gain 21 196 -110.59 gain 196 21 -112.46 gain 21 197 -114.14 gain 197 21 -113.50 gain 21 198 -105.82 gain 198 21 -107.82 gain 21 199 -112.29 gain 199 21 -108.30 gain 21 200 -110.02 gain 200 21 -107.95 gain 21 201 -99.26 gain 201 21 -100.28 gain 21 202 -106.76 gain 202 21 -106.08 gain 21 203 -110.91 gain 203 21 -110.32 gain 21 204 -107.66 gain 204 21 -105.29 gain 21 205 -108.78 gain 205 21 -106.09 gain 21 206 -110.23 gain 206 21 -108.86 gain 21 207 -112.82 gain 207 21 -109.19 gain 21 208 -105.88 gain 208 21 -105.55 gain 21 209 -105.78 gain 209 21 -104.49 gain 21 210 -112.39 gain 210 21 -115.10 gain 21 211 -101.47 gain 211 21 -101.57 gain 21 212 -110.73 gain 212 21 -109.38 gain 21 213 -104.66 gain 213 21 -106.05 gain 21 214 -114.34 gain 214 21 -113.91 gain 21 215 -110.71 gain 215 21 -112.10 gain 21 216 -106.37 gain 216 21 -104.65 gain 21 217 -109.95 gain 217 21 -112.68 gain 21 218 -99.71 gain 218 21 -103.76 gain 21 219 -106.16 gain 219 21 -107.78 gain 21 220 -110.19 gain 220 21 -108.92 gain 21 221 -112.35 gain 221 21 -112.08 gain 21 222 -112.50 gain 222 21 -108.80 gain 21 223 -112.50 gain 223 21 -111.09 gain 21 224 -112.96 gain 224 21 -108.48 gain 22 23 -73.80 gain 23 22 -76.25 gain 22 24 -82.82 gain 24 22 -83.17 gain 22 25 -88.39 gain 25 22 -89.72 gain 22 26 -93.28 gain 26 22 -95.07 gain 22 27 -92.68 gain 27 22 -93.81 gain 22 28 -96.25 gain 28 22 -99.34 gain 22 29 -99.40 gain 29 22 -94.11 gain 22 30 -98.20 gain 30 22 -104.61 gain 22 31 -99.77 gain 31 22 -103.26 gain 22 32 -100.30 gain 32 22 -98.92 gain 22 33 -89.66 gain 33 22 -87.06 gain 22 34 -88.02 gain 34 22 -92.40 gain 22 35 -84.02 gain 35 22 -86.32 gain 22 36 -78.07 gain 36 22 -79.18 gain 22 37 -77.46 gain 37 22 -77.97 gain 22 38 -84.73 gain 38 22 -86.45 gain 22 39 -81.83 gain 39 22 -81.01 gain 22 40 -89.74 gain 40 22 -90.98 gain 22 41 -102.31 gain 41 22 -103.19 gain 22 42 -90.89 gain 42 22 -94.79 gain 22 43 -102.04 gain 43 22 -106.46 gain 22 44 -100.87 gain 44 22 -103.28 gain 22 45 -111.16 gain 45 22 -109.60 gain 22 46 -97.36 gain 46 22 -98.67 gain 22 47 -98.51 gain 47 22 -101.67 gain 22 48 -95.65 gain 48 22 -95.82 gain 22 49 -91.16 gain 49 22 -87.96 gain 22 50 -88.34 gain 50 22 -87.04 gain 22 51 -90.83 gain 51 22 -91.32 gain 22 52 -82.43 gain 52 22 -79.35 gain 22 53 -78.40 gain 53 22 -79.81 gain 22 54 -85.66 gain 54 22 -83.59 gain 22 55 -96.17 gain 55 22 -97.22 gain 22 56 -87.51 gain 56 22 -91.65 gain 22 57 -99.26 gain 57 22 -105.45 gain 22 58 -101.37 gain 58 22 -107.10 gain 22 59 -104.96 gain 59 22 -108.86 gain 22 60 -103.87 gain 60 22 -106.17 gain 22 61 -101.81 gain 61 22 -97.00 gain 22 62 -99.78 gain 62 22 -97.77 gain 22 63 -97.61 gain 63 22 -94.61 gain 22 64 -96.08 gain 64 22 -97.47 gain 22 65 -89.28 gain 65 22 -90.71 gain 22 66 -93.71 gain 66 22 -94.44 gain 22 67 -89.73 gain 67 22 -90.58 gain 22 68 -85.83 gain 68 22 -86.64 gain 22 69 -84.95 gain 69 22 -84.01 gain 22 70 -92.47 gain 70 22 -94.24 gain 22 71 -96.21 gain 71 22 -98.73 gain 22 72 -94.43 gain 72 22 -98.80 gain 22 73 -95.92 gain 73 22 -97.35 gain 22 74 -100.51 gain 74 22 -97.93 gain 22 75 -108.59 gain 75 22 -106.39 gain 22 76 -105.58 gain 76 22 -105.88 gain 22 77 -96.90 gain 77 22 -95.50 gain 22 78 -99.19 gain 78 22 -106.43 gain 22 79 -98.04 gain 79 22 -99.81 gain 22 80 -94.30 gain 80 22 -94.40 gain 22 81 -98.45 gain 81 22 -102.82 gain 22 82 -94.43 gain 82 22 -97.98 gain 22 83 -97.75 gain 83 22 -100.87 gain 22 84 -94.91 gain 84 22 -95.11 gain 22 85 -97.28 gain 85 22 -102.05 gain 22 86 -94.77 gain 86 22 -92.73 gain 22 87 -103.37 gain 87 22 -104.13 gain 22 88 -102.94 gain 88 22 -103.98 gain 22 89 -100.76 gain 89 22 -102.43 gain 22 90 -103.83 gain 90 22 -109.04 gain 22 91 -96.95 gain 91 22 -97.75 gain 22 92 -107.56 gain 92 22 -111.93 gain 22 93 -96.51 gain 93 22 -94.79 gain 22 94 -98.80 gain 94 22 -99.51 gain 22 95 -99.32 gain 95 22 -103.07 gain 22 96 -96.52 gain 96 22 -96.54 gain 22 97 -88.78 gain 97 22 -90.08 gain 22 98 -103.32 gain 98 22 -101.80 gain 22 99 -99.59 gain 99 22 -102.16 gain 22 100 -98.95 gain 100 22 -99.36 gain 22 101 -102.86 gain 101 22 -101.93 gain 22 102 -95.52 gain 102 22 -95.25 gain 22 103 -100.03 gain 103 22 -98.99 gain 22 104 -105.05 gain 104 22 -100.45 gain 22 105 -106.41 gain 105 22 -107.20 gain 22 106 -99.98 gain 106 22 -100.08 gain 22 107 -95.87 gain 107 22 -98.99 gain 22 108 -96.36 gain 108 22 -97.54 gain 22 109 -100.01 gain 109 22 -98.03 gain 22 110 -98.61 gain 110 22 -98.87 gain 22 111 -100.53 gain 111 22 -97.99 gain 22 112 -94.08 gain 112 22 -93.54 gain 22 113 -91.69 gain 113 22 -98.09 gain 22 114 -95.29 gain 114 22 -97.32 gain 22 115 -100.79 gain 115 22 -103.68 gain 22 116 -101.28 gain 116 22 -100.19 gain 22 117 -102.68 gain 117 22 -101.43 gain 22 118 -103.80 gain 118 22 -110.73 gain 22 119 -105.55 gain 119 22 -104.03 gain 22 120 -102.88 gain 120 22 -101.47 gain 22 121 -105.13 gain 121 22 -106.45 gain 22 122 -103.19 gain 122 22 -107.08 gain 22 123 -99.97 gain 123 22 -104.12 gain 22 124 -105.71 gain 124 22 -103.46 gain 22 125 -102.47 gain 125 22 -102.16 gain 22 126 -101.91 gain 126 22 -106.48 gain 22 127 -99.41 gain 127 22 -98.73 gain 22 128 -103.56 gain 128 22 -105.94 gain 22 129 -97.52 gain 129 22 -97.12 gain 22 130 -100.40 gain 130 22 -102.18 gain 22 131 -100.65 gain 131 22 -100.78 gain 22 132 -104.35 gain 132 22 -100.77 gain 22 133 -103.64 gain 133 22 -104.48 gain 22 134 -103.39 gain 134 22 -102.22 gain 22 135 -109.01 gain 135 22 -103.44 gain 22 136 -100.55 gain 136 22 -103.75 gain 22 137 -110.87 gain 137 22 -110.73 gain 22 138 -103.84 gain 138 22 -105.71 gain 22 139 -101.64 gain 139 22 -105.22 gain 22 140 -103.39 gain 140 22 -106.78 gain 22 141 -99.28 gain 141 22 -98.35 gain 22 142 -94.43 gain 142 22 -94.66 gain 22 143 -102.61 gain 143 22 -105.29 gain 22 144 -100.42 gain 144 22 -99.00 gain 22 145 -99.05 gain 145 22 -102.18 gain 22 146 -100.46 gain 146 22 -100.03 gain 22 147 -106.50 gain 147 22 -107.27 gain 22 148 -112.39 gain 148 22 -113.68 gain 22 149 -107.37 gain 149 22 -105.03 gain 22 150 -98.82 gain 150 22 -99.87 gain 22 151 -110.63 gain 151 22 -114.16 gain 22 152 -99.24 gain 152 22 -101.13 gain 22 153 -102.96 gain 153 22 -104.54 gain 22 154 -107.12 gain 154 22 -109.84 gain 22 155 -105.07 gain 155 22 -105.09 gain 22 156 -104.36 gain 156 22 -105.50 gain 22 157 -100.14 gain 157 22 -102.58 gain 22 158 -96.54 gain 158 22 -100.94 gain 22 159 -105.78 gain 159 22 -104.22 gain 22 160 -99.81 gain 160 22 -99.63 gain 22 161 -107.46 gain 161 22 -108.33 gain 22 162 -107.40 gain 162 22 -107.90 gain 22 163 -109.86 gain 163 22 -107.79 gain 22 164 -106.05 gain 164 22 -111.20 gain 22 165 -111.24 gain 165 22 -113.74 gain 22 166 -104.98 gain 166 22 -109.14 gain 22 167 -103.59 gain 167 22 -106.58 gain 22 168 -109.59 gain 168 22 -111.65 gain 22 169 -103.78 gain 169 22 -102.35 gain 22 170 -102.37 gain 170 22 -101.88 gain 22 171 -103.81 gain 171 22 -103.88 gain 22 172 -108.10 gain 172 22 -110.98 gain 22 173 -98.58 gain 173 22 -95.78 gain 22 174 -102.83 gain 174 22 -105.98 gain 22 175 -101.91 gain 175 22 -96.86 gain 22 176 -102.36 gain 176 22 -101.53 gain 22 177 -108.33 gain 177 22 -109.87 gain 22 178 -102.52 gain 178 22 -101.66 gain 22 179 -110.28 gain 179 22 -112.46 gain 22 180 -105.74 gain 180 22 -106.66 gain 22 181 -103.80 gain 181 22 -108.12 gain 22 182 -101.32 gain 182 22 -101.78 gain 22 183 -102.09 gain 183 22 -98.43 gain 22 184 -111.93 gain 184 22 -114.49 gain 22 185 -103.22 gain 185 22 -104.28 gain 22 186 -108.14 gain 186 22 -109.91 gain 22 187 -104.84 gain 187 22 -106.63 gain 22 188 -103.17 gain 188 22 -109.41 gain 22 189 -103.43 gain 189 22 -105.73 gain 22 190 -98.26 gain 190 22 -93.38 gain 22 191 -105.69 gain 191 22 -103.99 gain 22 192 -104.29 gain 192 22 -106.25 gain 22 193 -104.07 gain 193 22 -102.06 gain 22 194 -109.33 gain 194 22 -107.21 gain 22 195 -104.58 gain 195 22 -100.43 gain 22 196 -108.05 gain 196 22 -111.57 gain 22 197 -105.44 gain 197 22 -106.46 gain 22 198 -103.34 gain 198 22 -107.00 gain 22 199 -108.93 gain 199 22 -106.61 gain 22 200 -108.91 gain 200 22 -108.50 gain 22 201 -110.08 gain 201 22 -112.76 gain 22 202 -106.00 gain 202 22 -106.97 gain 22 203 -113.61 gain 203 22 -114.68 gain 22 204 -108.16 gain 204 22 -107.45 gain 22 205 -108.56 gain 205 22 -107.52 gain 22 206 -101.56 gain 206 22 -101.84 gain 22 207 -100.55 gain 207 22 -98.58 gain 22 208 -112.18 gain 208 22 -113.51 gain 22 209 -104.36 gain 209 22 -104.73 gain 22 210 -105.13 gain 210 22 -109.49 gain 22 211 -105.53 gain 211 22 -107.29 gain 22 212 -101.36 gain 212 22 -101.67 gain 22 213 -108.54 gain 213 22 -111.58 gain 22 214 -106.15 gain 214 22 -107.38 gain 22 215 -108.87 gain 215 22 -111.92 gain 22 216 -106.74 gain 216 22 -106.68 gain 22 217 -116.32 gain 217 22 -120.71 gain 22 218 -111.36 gain 218 22 -117.06 gain 22 219 -107.59 gain 219 22 -110.87 gain 22 220 -108.33 gain 220 22 -108.72 gain 22 221 -103.15 gain 221 22 -104.54 gain 22 222 -115.57 gain 222 22 -113.54 gain 22 223 -108.06 gain 223 22 -108.31 gain 22 224 -108.84 gain 224 22 -106.02 gain 23 24 -77.87 gain 24 23 -75.78 gain 23 25 -80.87 gain 25 23 -79.75 gain 23 26 -97.43 gain 26 23 -96.77 gain 23 27 -97.47 gain 27 23 -96.16 gain 23 28 -101.77 gain 28 23 -102.41 gain 23 29 -87.52 gain 29 23 -79.78 gain 23 30 -101.81 gain 30 23 -105.77 gain 23 31 -98.49 gain 31 23 -99.53 gain 23 32 -105.81 gain 32 23 -101.99 gain 23 33 -99.49 gain 33 23 -94.44 gain 23 34 -95.07 gain 34 23 -97.01 gain 23 35 -90.86 gain 35 23 -90.71 gain 23 36 -83.33 gain 36 23 -82.00 gain 23 37 -79.46 gain 37 23 -77.53 gain 23 38 -73.48 gain 38 23 -72.76 gain 23 39 -78.64 gain 39 23 -75.38 gain 23 40 -78.70 gain 40 23 -77.50 gain 23 41 -98.64 gain 41 23 -97.08 gain 23 42 -99.28 gain 42 23 -100.74 gain 23 43 -100.75 gain 43 23 -102.73 gain 23 44 -104.42 gain 44 23 -104.39 gain 23 45 -97.42 gain 45 23 -93.42 gain 23 46 -102.65 gain 46 23 -101.52 gain 23 47 -98.82 gain 47 23 -99.53 gain 23 48 -94.76 gain 48 23 -92.49 gain 23 49 -96.14 gain 49 23 -90.50 gain 23 50 -87.66 gain 50 23 -83.91 gain 23 51 -92.04 gain 51 23 -90.09 gain 23 52 -88.60 gain 52 23 -83.07 gain 23 53 -87.50 gain 53 23 -86.47 gain 23 54 -89.93 gain 54 23 -85.41 gain 23 55 -95.22 gain 55 23 -93.83 gain 23 56 -99.43 gain 56 23 -101.13 gain 23 57 -99.77 gain 57 23 -103.51 gain 23 58 -99.45 gain 58 23 -102.74 gain 23 59 -107.69 gain 59 23 -109.14 gain 23 60 -107.93 gain 60 23 -107.79 gain 23 61 -110.58 gain 61 23 -103.32 gain 23 62 -99.34 gain 62 23 -94.88 gain 23 63 -95.81 gain 63 23 -90.36 gain 23 64 -94.91 gain 64 23 -93.85 gain 23 65 -102.82 gain 65 23 -101.80 gain 23 66 -85.78 gain 66 23 -84.07 gain 23 67 -93.25 gain 67 23 -91.66 gain 23 68 -90.34 gain 68 23 -88.70 gain 23 69 -89.66 gain 69 23 -86.29 gain 23 70 -84.38 gain 70 23 -83.70 gain 23 71 -91.29 gain 71 23 -91.36 gain 23 72 -91.09 gain 72 23 -93.02 gain 23 73 -97.45 gain 73 23 -96.43 gain 23 74 -99.06 gain 74 23 -94.03 gain 23 75 -108.52 gain 75 23 -103.88 gain 23 76 -103.94 gain 76 23 -101.79 gain 23 77 -105.69 gain 77 23 -101.85 gain 23 78 -108.83 gain 78 23 -113.61 gain 23 79 -93.85 gain 79 23 -93.18 gain 23 80 -101.70 gain 80 23 -99.36 gain 23 81 -90.04 gain 81 23 -91.98 gain 23 82 -90.92 gain 82 23 -92.02 gain 23 83 -92.76 gain 83 23 -93.43 gain 23 84 -93.56 gain 84 23 -91.31 gain 23 85 -105.18 gain 85 23 -107.51 gain 23 86 -102.38 gain 86 23 -97.90 gain 23 87 -95.78 gain 87 23 -94.09 gain 23 88 -101.62 gain 88 23 -100.21 gain 23 89 -107.38 gain 89 23 -106.61 gain 23 90 -102.19 gain 90 23 -104.95 gain 23 91 -107.88 gain 91 23 -106.23 gain 23 92 -109.36 gain 92 23 -111.28 gain 23 93 -112.74 gain 93 23 -108.58 gain 23 94 -103.13 gain 94 23 -101.40 gain 23 95 -99.29 gain 95 23 -100.60 gain 23 96 -97.42 gain 96 23 -95.01 gain 23 97 -101.62 gain 97 23 -100.48 gain 23 98 -94.46 gain 98 23 -90.49 gain 23 99 -94.93 gain 99 23 -95.05 gain 23 100 -94.60 gain 100 23 -92.56 gain 23 101 -105.23 gain 101 23 -101.85 gain 23 102 -102.24 gain 102 23 -99.53 gain 23 103 -102.47 gain 103 23 -98.99 gain 23 104 -95.55 gain 104 23 -88.49 gain 23 105 -113.79 gain 105 23 -112.14 gain 23 106 -110.83 gain 106 23 -108.48 gain 23 107 -104.49 gain 107 23 -105.16 gain 23 108 -103.50 gain 108 23 -102.24 gain 23 109 -100.37 gain 109 23 -95.95 gain 23 110 -100.66 gain 110 23 -98.48 gain 23 111 -100.79 gain 111 23 -95.81 gain 23 112 -101.64 gain 112 23 -98.66 gain 23 113 -102.64 gain 113 23 -106.60 gain 23 114 -105.18 gain 114 23 -104.77 gain 23 115 -100.06 gain 115 23 -100.50 gain 23 116 -108.37 gain 116 23 -104.84 gain 23 117 -103.17 gain 117 23 -99.48 gain 23 118 -99.71 gain 118 23 -104.20 gain 23 119 -101.66 gain 119 23 -97.70 gain 23 120 -109.06 gain 120 23 -105.19 gain 23 121 -104.23 gain 121 23 -103.11 gain 23 122 -105.37 gain 122 23 -106.83 gain 23 123 -105.37 gain 123 23 -107.08 gain 23 124 -97.97 gain 124 23 -93.29 gain 23 125 -106.85 gain 125 23 -104.10 gain 23 126 -109.44 gain 126 23 -111.57 gain 23 127 -100.72 gain 127 23 -97.60 gain 23 128 -103.65 gain 128 23 -103.58 gain 23 129 -101.53 gain 129 23 -98.69 gain 23 130 -107.77 gain 130 23 -107.11 gain 23 131 -106.07 gain 131 23 -103.76 gain 23 132 -97.00 gain 132 23 -90.97 gain 23 133 -101.76 gain 133 23 -100.15 gain 23 134 -110.99 gain 134 23 -107.38 gain 23 135 -106.70 gain 135 23 -98.68 gain 23 136 -116.34 gain 136 23 -117.10 gain 23 137 -105.25 gain 137 23 -102.67 gain 23 138 -103.61 gain 138 23 -103.04 gain 23 139 -105.02 gain 139 23 -106.15 gain 23 140 -102.60 gain 140 23 -103.54 gain 23 141 -106.87 gain 141 23 -103.50 gain 23 142 -103.31 gain 142 23 -101.10 gain 23 143 -95.78 gain 143 23 -96.02 gain 23 144 -89.20 gain 144 23 -85.33 gain 23 145 -101.94 gain 145 23 -102.62 gain 23 146 -104.73 gain 146 23 -101.86 gain 23 147 -109.99 gain 147 23 -108.31 gain 23 148 -104.78 gain 148 23 -103.62 gain 23 149 -104.82 gain 149 23 -100.05 gain 23 150 -109.43 gain 150 23 -108.03 gain 23 151 -114.57 gain 151 23 -115.65 gain 23 152 -109.38 gain 152 23 -108.82 gain 23 153 -104.28 gain 153 23 -103.42 gain 23 154 -111.27 gain 154 23 -111.54 gain 23 155 -111.97 gain 155 23 -109.54 gain 23 156 -108.27 gain 156 23 -106.96 gain 23 157 -101.19 gain 157 23 -101.18 gain 23 158 -104.65 gain 158 23 -106.61 gain 23 159 -93.77 gain 159 23 -89.77 gain 23 160 -108.05 gain 160 23 -105.43 gain 23 161 -111.56 gain 161 23 -109.98 gain 23 162 -104.49 gain 162 23 -102.55 gain 23 163 -111.63 gain 163 23 -107.10 gain 23 164 -104.85 gain 164 23 -107.55 gain 23 165 -119.75 gain 165 23 -119.81 gain 23 166 -107.09 gain 166 23 -108.80 gain 23 167 -113.80 gain 167 23 -114.35 gain 23 168 -107.78 gain 168 23 -107.38 gain 23 169 -105.08 gain 169 23 -101.20 gain 23 170 -102.17 gain 170 23 -99.23 gain 23 171 -108.54 gain 171 23 -106.17 gain 23 172 -106.72 gain 172 23 -107.15 gain 23 173 -105.55 gain 173 23 -100.30 gain 23 174 -110.12 gain 174 23 -110.82 gain 23 175 -113.76 gain 175 23 -106.27 gain 23 176 -103.78 gain 176 23 -100.51 gain 23 177 -107.70 gain 177 23 -106.79 gain 23 178 -102.72 gain 178 23 -99.41 gain 23 179 -99.58 gain 179 23 -99.32 gain 23 180 -115.41 gain 180 23 -113.89 gain 23 181 -113.00 gain 181 23 -114.87 gain 23 182 -114.15 gain 182 23 -112.16 gain 23 183 -112.93 gain 183 23 -106.82 gain 23 184 -113.79 gain 184 23 -113.91 gain 23 185 -110.04 gain 185 23 -108.66 gain 23 186 -113.74 gain 186 23 -113.07 gain 23 187 -111.85 gain 187 23 -111.20 gain 23 188 -103.56 gain 188 23 -107.35 gain 23 189 -98.65 gain 189 23 -98.50 gain 23 190 -104.32 gain 190 23 -97.00 gain 23 191 -107.23 gain 191 23 -103.08 gain 23 192 -117.81 gain 192 23 -117.34 gain 23 193 -103.86 gain 193 23 -99.41 gain 23 194 -104.48 gain 194 23 -99.92 gain 23 195 -107.28 gain 195 23 -100.69 gain 23 196 -110.77 gain 196 23 -111.85 gain 23 197 -109.66 gain 197 23 -108.23 gain 23 198 -113.44 gain 198 23 -114.66 gain 23 199 -112.36 gain 199 23 -107.58 gain 23 200 -108.58 gain 200 23 -105.73 gain 23 201 -105.60 gain 201 23 -105.83 gain 23 202 -107.05 gain 202 23 -105.58 gain 23 203 -102.28 gain 203 23 -100.91 gain 23 204 -115.30 gain 204 23 -112.15 gain 23 205 -106.96 gain 205 23 -103.48 gain 23 206 -111.25 gain 206 23 -109.09 gain 23 207 -104.86 gain 207 23 -100.44 gain 23 208 -114.42 gain 208 23 -113.30 gain 23 209 -115.42 gain 209 23 -113.34 gain 23 210 -121.93 gain 210 23 -123.85 gain 23 211 -111.27 gain 211 23 -110.59 gain 23 212 -108.87 gain 212 23 -106.74 gain 23 213 -113.16 gain 213 23 -113.77 gain 23 214 -115.48 gain 214 23 -114.27 gain 23 215 -109.25 gain 215 23 -109.85 gain 23 216 -109.26 gain 216 23 -106.75 gain 23 217 -114.49 gain 217 23 -116.43 gain 23 218 -109.46 gain 218 23 -112.72 gain 23 219 -114.90 gain 219 23 -115.74 gain 23 220 -111.80 gain 220 23 -109.75 gain 23 221 -108.23 gain 221 23 -107.17 gain 23 222 -109.18 gain 222 23 -104.70 gain 23 223 -116.80 gain 223 23 -114.61 gain 23 224 -106.78 gain 224 23 -101.52 gain 24 25 -70.57 gain 25 24 -71.55 gain 24 26 -88.38 gain 26 24 -89.82 gain 24 27 -86.62 gain 27 24 -87.40 gain 24 28 -89.76 gain 28 24 -92.50 gain 24 29 -100.91 gain 29 24 -95.27 gain 24 30 -99.90 gain 30 24 -105.95 gain 24 31 -110.52 gain 31 24 -113.65 gain 24 32 -104.21 gain 32 24 -102.48 gain 24 33 -97.82 gain 33 24 -94.86 gain 24 34 -95.59 gain 34 24 -99.62 gain 24 35 -98.87 gain 35 24 -100.81 gain 24 36 -87.23 gain 36 24 -87.99 gain 24 37 -87.02 gain 37 24 -87.18 gain 24 38 -80.31 gain 38 24 -81.68 gain 24 39 -68.60 gain 39 24 -67.43 gain 24 40 -80.51 gain 40 24 -81.40 gain 24 41 -76.54 gain 41 24 -77.07 gain 24 42 -82.36 gain 42 24 -85.91 gain 24 43 -92.00 gain 43 24 -96.07 gain 24 44 -95.63 gain 44 24 -97.69 gain 24 45 -102.97 gain 45 24 -101.06 gain 24 46 -92.88 gain 46 24 -93.84 gain 24 47 -100.01 gain 47 24 -102.82 gain 24 48 -101.29 gain 48 24 -101.11 gain 24 49 -100.37 gain 49 24 -96.82 gain 24 50 -94.93 gain 50 24 -93.28 gain 24 51 -93.44 gain 51 24 -93.57 gain 24 52 -92.48 gain 52 24 -89.05 gain 24 53 -83.86 gain 53 24 -84.91 gain 24 54 -81.14 gain 54 24 -78.71 gain 24 55 -79.68 gain 55 24 -80.38 gain 24 56 -91.83 gain 56 24 -95.62 gain 24 57 -94.49 gain 57 24 -100.32 gain 24 58 -96.09 gain 58 24 -101.47 gain 24 59 -102.50 gain 59 24 -106.05 gain 24 60 -101.99 gain 60 24 -103.94 gain 24 61 -103.40 gain 61 24 -98.24 gain 24 62 -102.64 gain 62 24 -100.27 gain 24 63 -99.28 gain 63 24 -95.92 gain 24 64 -93.26 gain 64 24 -94.29 gain 24 65 -93.54 gain 65 24 -94.61 gain 24 66 -97.73 gain 66 24 -98.11 gain 24 67 -90.33 gain 67 24 -90.83 gain 24 68 -97.70 gain 68 24 -98.16 gain 24 69 -93.57 gain 69 24 -92.28 gain 24 70 -90.36 gain 70 24 -91.78 gain 24 71 -93.48 gain 71 24 -95.65 gain 24 72 -92.52 gain 72 24 -96.55 gain 24 73 -92.71 gain 73 24 -93.78 gain 24 74 -93.73 gain 74 24 -90.80 gain 24 75 -107.22 gain 75 24 -104.67 gain 24 76 -101.77 gain 76 24 -101.71 gain 24 77 -98.01 gain 77 24 -96.25 gain 24 78 -94.33 gain 78 24 -101.21 gain 24 79 -103.70 gain 79 24 -105.12 gain 24 80 -98.46 gain 80 24 -98.22 gain 24 81 -97.15 gain 81 24 -101.17 gain 24 82 -99.57 gain 82 24 -102.76 gain 24 83 -92.15 gain 83 24 -94.91 gain 24 84 -88.91 gain 84 24 -88.75 gain 24 85 -96.27 gain 85 24 -100.69 gain 24 86 -98.04 gain 86 24 -95.65 gain 24 87 -101.91 gain 87 24 -102.32 gain 24 88 -91.29 gain 88 24 -91.97 gain 24 89 -95.77 gain 89 24 -97.10 gain 24 90 -98.53 gain 90 24 -103.38 gain 24 91 -103.19 gain 91 24 -103.64 gain 24 92 -107.72 gain 92 24 -111.73 gain 24 93 -97.66 gain 93 24 -95.59 gain 24 94 -101.08 gain 94 24 -101.44 gain 24 95 -96.34 gain 95 24 -99.74 gain 24 96 -103.46 gain 96 24 -103.13 gain 24 97 -96.88 gain 97 24 -97.83 gain 24 98 -94.35 gain 98 24 -92.47 gain 24 99 -92.39 gain 99 24 -94.60 gain 24 100 -94.50 gain 100 24 -94.56 gain 24 101 -100.33 gain 101 24 -99.04 gain 24 102 -102.36 gain 102 24 -101.74 gain 24 103 -99.77 gain 103 24 -98.38 gain 24 104 -99.67 gain 104 24 -94.71 gain 24 105 -107.26 gain 105 24 -107.70 gain 24 106 -105.38 gain 106 24 -105.12 gain 24 107 -104.73 gain 107 24 -107.50 gain 24 108 -100.14 gain 108 24 -100.96 gain 24 109 -103.42 gain 109 24 -101.09 gain 24 110 -104.74 gain 110 24 -104.65 gain 24 111 -93.81 gain 111 24 -90.91 gain 24 112 -92.22 gain 112 24 -91.33 gain 24 113 -100.42 gain 113 24 -106.47 gain 24 114 -98.99 gain 114 24 -100.67 gain 24 115 -96.28 gain 115 24 -98.81 gain 24 116 -96.20 gain 116 24 -94.76 gain 24 117 -97.55 gain 117 24 -95.95 gain 24 118 -105.39 gain 118 24 -111.97 gain 24 119 -96.09 gain 119 24 -94.21 gain 24 120 -112.49 gain 120 24 -110.72 gain 24 121 -106.73 gain 121 24 -107.71 gain 24 122 -98.51 gain 122 24 -102.06 gain 24 123 -103.16 gain 123 24 -106.97 gain 24 124 -102.44 gain 124 24 -99.84 gain 24 125 -105.81 gain 125 24 -105.15 gain 24 126 -102.09 gain 126 24 -106.31 gain 24 127 -102.09 gain 127 24 -101.06 gain 24 128 -92.96 gain 128 24 -94.99 gain 24 129 -92.65 gain 129 24 -91.90 gain 24 130 -101.48 gain 130 24 -102.90 gain 24 131 -98.37 gain 131 24 -98.16 gain 24 132 -98.93 gain 132 24 -94.99 gain 24 133 -102.53 gain 133 24 -103.02 gain 24 134 -104.76 gain 134 24 -103.25 gain 24 135 -113.13 gain 135 24 -107.20 gain 24 136 -115.66 gain 136 24 -118.51 gain 24 137 -108.51 gain 137 24 -108.02 gain 24 138 -102.84 gain 138 24 -104.36 gain 24 139 -98.37 gain 139 24 -101.60 gain 24 140 -105.36 gain 140 24 -108.40 gain 24 141 -101.76 gain 141 24 -100.48 gain 24 142 -109.47 gain 142 24 -109.34 gain 24 143 -103.00 gain 143 24 -105.33 gain 24 144 -104.79 gain 144 24 -103.02 gain 24 145 -106.07 gain 145 24 -108.85 gain 24 146 -98.06 gain 146 24 -97.28 gain 24 147 -102.85 gain 147 24 -103.26 gain 24 148 -102.30 gain 148 24 -103.25 gain 24 149 -104.37 gain 149 24 -101.68 gain 24 150 -113.82 gain 150 24 -114.52 gain 24 151 -113.58 gain 151 24 -116.76 gain 24 152 -104.96 gain 152 24 -106.50 gain 24 153 -99.67 gain 153 24 -100.90 gain 24 154 -105.29 gain 154 24 -107.65 gain 24 155 -107.54 gain 155 24 -107.21 gain 24 156 -108.77 gain 156 24 -109.56 gain 24 157 -100.26 gain 157 24 -102.34 gain 24 158 -102.86 gain 158 24 -106.91 gain 24 159 -106.77 gain 159 24 -104.86 gain 24 160 -103.32 gain 160 24 -102.79 gain 24 161 -100.62 gain 161 24 -101.14 gain 24 162 -112.85 gain 162 24 -113.00 gain 24 163 -103.91 gain 163 24 -101.49 gain 24 164 -107.13 gain 164 24 -111.93 gain 24 165 -112.79 gain 165 24 -114.95 gain 24 166 -107.38 gain 166 24 -111.19 gain 24 167 -105.06 gain 167 24 -107.69 gain 24 168 -101.90 gain 168 24 -103.60 gain 24 169 -107.36 gain 169 24 -105.57 gain 24 170 -102.48 gain 170 24 -101.64 gain 24 171 -102.15 gain 171 24 -101.87 gain 24 172 -107.96 gain 172 24 -110.48 gain 24 173 -104.92 gain 173 24 -101.76 gain 24 174 -101.89 gain 174 24 -104.69 gain 24 175 -100.61 gain 175 24 -95.21 gain 24 176 -104.26 gain 176 24 -103.08 gain 24 177 -103.89 gain 177 24 -105.07 gain 24 178 -102.65 gain 178 24 -101.44 gain 24 179 -102.55 gain 179 24 -104.38 gain 24 180 -113.72 gain 180 24 -114.29 gain 24 181 -104.57 gain 181 24 -108.54 gain 24 182 -110.30 gain 182 24 -110.40 gain 24 183 -105.57 gain 183 24 -101.56 gain 24 184 -103.88 gain 184 24 -106.09 gain 24 185 -109.73 gain 185 24 -110.44 gain 24 186 -107.72 gain 186 24 -109.14 gain 24 187 -107.26 gain 187 24 -108.70 gain 24 188 -107.71 gain 188 24 -113.59 gain 24 189 -103.80 gain 189 24 -105.74 gain 24 190 -112.26 gain 190 24 -107.03 gain 24 191 -102.94 gain 191 24 -100.88 gain 24 192 -107.29 gain 192 24 -108.91 gain 24 193 -112.13 gain 193 24 -109.77 gain 24 194 -109.04 gain 194 24 -106.57 gain 24 195 -110.93 gain 195 24 -106.43 gain 24 196 -103.24 gain 196 24 -106.41 gain 24 197 -113.93 gain 197 24 -114.60 gain 24 198 -112.72 gain 198 24 -116.02 gain 24 199 -107.80 gain 199 24 -105.12 gain 24 200 -115.57 gain 200 24 -114.81 gain 24 201 -109.79 gain 201 24 -112.12 gain 24 202 -113.57 gain 202 24 -114.20 gain 24 203 -104.37 gain 203 24 -105.09 gain 24 204 -102.99 gain 204 24 -101.94 gain 24 205 -107.90 gain 205 24 -106.51 gain 24 206 -96.71 gain 206 24 -96.64 gain 24 207 -104.05 gain 207 24 -101.72 gain 24 208 -109.74 gain 208 24 -110.72 gain 24 209 -101.58 gain 209 24 -101.60 gain 24 210 -110.83 gain 210 24 -114.84 gain 24 211 -110.66 gain 211 24 -112.08 gain 24 212 -110.31 gain 212 24 -110.27 gain 24 213 -111.97 gain 213 24 -114.67 gain 24 214 -107.16 gain 214 24 -108.04 gain 24 215 -112.65 gain 215 24 -115.34 gain 24 216 -108.93 gain 216 24 -108.51 gain 24 217 -110.24 gain 217 24 -114.28 gain 24 218 -104.83 gain 218 24 -110.18 gain 24 219 -103.66 gain 219 24 -106.59 gain 24 220 -117.34 gain 220 24 -117.38 gain 24 221 -110.93 gain 221 24 -111.96 gain 24 222 -108.33 gain 222 24 -105.94 gain 24 223 -106.57 gain 223 24 -106.47 gain 24 224 -110.34 gain 224 24 -107.18 gain 25 26 -77.03 gain 26 25 -77.50 gain 25 27 -83.71 gain 27 25 -83.51 gain 25 28 -90.18 gain 28 25 -91.93 gain 25 29 -92.23 gain 29 25 -85.61 gain 25 30 -103.76 gain 30 25 -108.84 gain 25 31 -102.94 gain 31 25 -105.10 gain 25 32 -104.12 gain 32 25 -101.42 gain 25 33 -96.98 gain 33 25 -93.05 gain 25 34 -107.02 gain 34 25 -110.07 gain 25 35 -100.14 gain 35 25 -101.10 gain 25 36 -90.27 gain 36 25 -90.06 gain 25 37 -87.93 gain 37 25 -87.11 gain 25 38 -84.95 gain 38 25 -85.34 gain 25 39 -72.27 gain 39 25 -70.12 gain 25 40 -79.71 gain 40 25 -79.62 gain 25 41 -71.14 gain 41 25 -70.70 gain 25 42 -82.93 gain 42 25 -85.51 gain 25 43 -96.79 gain 43 25 -99.88 gain 25 44 -93.36 gain 44 25 -94.44 gain 25 45 -106.30 gain 45 25 -103.41 gain 25 46 -103.81 gain 46 25 -103.79 gain 25 47 -102.53 gain 47 25 -104.36 gain 25 48 -95.31 gain 48 25 -94.15 gain 25 49 -93.10 gain 49 25 -88.57 gain 25 50 -96.95 gain 50 25 -94.31 gain 25 51 -102.46 gain 51 25 -101.62 gain 25 52 -95.47 gain 52 25 -91.05 gain 25 53 -94.55 gain 53 25 -94.63 gain 25 54 -80.36 gain 54 25 -76.96 gain 25 55 -90.26 gain 55 25 -89.98 gain 25 56 -83.61 gain 56 25 -86.42 gain 25 57 -92.60 gain 57 25 -97.46 gain 25 58 -92.65 gain 58 25 -97.05 gain 25 59 -96.85 gain 59 25 -99.42 gain 25 60 -104.06 gain 60 25 -105.03 gain 25 61 -106.07 gain 61 25 -99.93 gain 25 62 -96.99 gain 62 25 -93.64 gain 25 63 -103.01 gain 63 25 -98.67 gain 25 64 -97.75 gain 64 25 -97.81 gain 25 65 -91.41 gain 65 25 -91.51 gain 25 66 -97.50 gain 66 25 -96.90 gain 25 67 -87.89 gain 67 25 -87.41 gain 25 68 -90.04 gain 68 25 -89.52 gain 25 69 -87.72 gain 69 25 -85.45 gain 25 70 -90.59 gain 70 25 -91.03 gain 25 71 -96.48 gain 71 25 -97.67 gain 25 72 -99.01 gain 72 25 -102.05 gain 25 73 -97.55 gain 73 25 -97.65 gain 25 74 -100.42 gain 74 25 -96.51 gain 25 75 -104.79 gain 75 25 -101.26 gain 25 76 -109.76 gain 76 25 -108.73 gain 25 77 -100.38 gain 77 25 -97.65 gain 25 78 -102.65 gain 78 25 -108.55 gain 25 79 -106.11 gain 79 25 -106.56 gain 25 80 -101.29 gain 80 25 -100.06 gain 25 81 -98.94 gain 81 25 -101.99 gain 25 82 -102.19 gain 82 25 -104.40 gain 25 83 -100.69 gain 83 25 -102.48 gain 25 84 -95.97 gain 84 25 -94.83 gain 25 85 -92.27 gain 85 25 -95.71 gain 25 86 -95.87 gain 86 25 -92.50 gain 25 87 -91.23 gain 87 25 -90.66 gain 25 88 -99.28 gain 88 25 -98.98 gain 25 89 -103.91 gain 89 25 -104.25 gain 25 90 -107.26 gain 90 25 -111.14 gain 25 91 -107.23 gain 91 25 -106.69 gain 25 92 -109.25 gain 92 25 -112.28 gain 25 93 -95.99 gain 93 25 -92.94 gain 25 94 -106.49 gain 94 25 -105.87 gain 25 95 -102.59 gain 95 25 -105.02 gain 25 96 -102.99 gain 96 25 -101.68 gain 25 97 -99.26 gain 97 25 -99.23 gain 25 98 -96.43 gain 98 25 -93.57 gain 25 99 -99.23 gain 99 25 -100.47 gain 25 100 -99.16 gain 100 25 -98.24 gain 25 101 -104.15 gain 101 25 -101.89 gain 25 102 -95.14 gain 102 25 -93.54 gain 25 103 -93.52 gain 103 25 -91.15 gain 25 104 -106.50 gain 104 25 -100.56 gain 25 105 -110.04 gain 105 25 -109.51 gain 25 106 -114.37 gain 106 25 -113.14 gain 25 107 -99.70 gain 107 25 -101.49 gain 25 108 -102.52 gain 108 25 -102.37 gain 25 109 -105.34 gain 109 25 -102.03 gain 25 110 -98.95 gain 110 25 -97.88 gain 25 111 -94.89 gain 111 25 -91.02 gain 25 112 -102.36 gain 112 25 -100.50 gain 25 113 -105.04 gain 113 25 -110.11 gain 25 114 -93.62 gain 114 25 -94.32 gain 25 115 -93.61 gain 115 25 -95.17 gain 25 116 -100.32 gain 116 25 -97.91 gain 25 117 -98.53 gain 117 25 -95.95 gain 25 118 -98.93 gain 118 25 -104.53 gain 25 119 -101.77 gain 119 25 -98.92 gain 25 120 -106.26 gain 120 25 -103.52 gain 25 121 -109.08 gain 121 25 -109.07 gain 25 122 -107.98 gain 122 25 -110.55 gain 25 123 -108.07 gain 123 25 -110.89 gain 25 124 -113.86 gain 124 25 -110.29 gain 25 125 -111.57 gain 125 25 -109.93 gain 25 126 -102.80 gain 126 25 -106.04 gain 25 127 -105.54 gain 127 25 -103.53 gain 25 128 -97.89 gain 128 25 -98.95 gain 25 129 -98.99 gain 129 25 -97.26 gain 25 130 -97.87 gain 130 25 -98.32 gain 25 131 -91.45 gain 131 25 -90.26 gain 25 132 -103.40 gain 132 25 -98.48 gain 25 133 -101.55 gain 133 25 -101.06 gain 25 134 -104.77 gain 134 25 -102.28 gain 25 135 -104.33 gain 135 25 -97.42 gain 25 136 -114.33 gain 136 25 -116.20 gain 25 137 -108.13 gain 137 25 -106.66 gain 25 138 -109.50 gain 138 25 -110.05 gain 25 139 -110.26 gain 139 25 -112.51 gain 25 140 -106.71 gain 140 25 -108.77 gain 25 141 -97.77 gain 141 25 -95.51 gain 25 142 -107.55 gain 142 25 -106.45 gain 25 143 -110.41 gain 143 25 -111.76 gain 25 144 -103.42 gain 144 25 -100.67 gain 25 145 -105.37 gain 145 25 -107.18 gain 25 146 -101.70 gain 146 25 -99.94 gain 25 147 -102.55 gain 147 25 -101.98 gain 25 148 -101.39 gain 148 25 -101.35 gain 25 149 -107.57 gain 149 25 -103.91 gain 25 150 -109.32 gain 150 25 -109.04 gain 25 151 -107.80 gain 151 25 -110.00 gain 25 152 -106.06 gain 152 25 -106.62 gain 25 153 -111.16 gain 153 25 -111.42 gain 25 154 -100.27 gain 154 25 -101.65 gain 25 155 -100.69 gain 155 25 -99.37 gain 25 156 -100.26 gain 156 25 -100.07 gain 25 157 -106.77 gain 157 25 -107.87 gain 25 158 -105.69 gain 158 25 -108.76 gain 25 159 -108.05 gain 159 25 -105.16 gain 25 160 -106.35 gain 160 25 -104.83 gain 25 161 -102.80 gain 161 25 -102.34 gain 25 162 -105.99 gain 162 25 -105.16 gain 25 163 -95.96 gain 163 25 -92.55 gain 25 164 -104.09 gain 164 25 -107.91 gain 25 165 -109.47 gain 165 25 -110.64 gain 25 166 -102.94 gain 166 25 -105.77 gain 25 167 -108.64 gain 167 25 -110.30 gain 25 168 -107.84 gain 168 25 -108.56 gain 25 169 -102.77 gain 169 25 -100.00 gain 25 170 -108.50 gain 170 25 -106.68 gain 25 171 -110.08 gain 171 25 -108.83 gain 25 172 -102.37 gain 172 25 -103.91 gain 25 173 -97.01 gain 173 25 -92.87 gain 25 174 -106.13 gain 174 25 -107.95 gain 25 175 -107.13 gain 175 25 -100.75 gain 25 176 -107.28 gain 176 25 -105.12 gain 25 177 -106.40 gain 177 25 -106.61 gain 25 178 -105.53 gain 178 25 -103.33 gain 25 179 -109.45 gain 179 25 -110.31 gain 25 180 -113.75 gain 180 25 -113.34 gain 25 181 -112.24 gain 181 25 -115.24 gain 25 182 -109.86 gain 182 25 -108.99 gain 25 183 -105.35 gain 183 25 -100.36 gain 25 184 -107.50 gain 184 25 -108.73 gain 25 185 -104.17 gain 185 25 -103.91 gain 25 186 -112.17 gain 186 25 -112.61 gain 25 187 -108.83 gain 187 25 -109.29 gain 25 188 -106.58 gain 188 25 -111.48 gain 25 189 -100.39 gain 189 25 -101.35 gain 25 190 -106.08 gain 190 25 -99.88 gain 25 191 -103.37 gain 191 25 -100.34 gain 25 192 -110.67 gain 192 25 -111.31 gain 25 193 -105.35 gain 193 25 -102.02 gain 25 194 -106.73 gain 194 25 -103.28 gain 25 195 -108.78 gain 195 25 -103.30 gain 25 196 -113.67 gain 196 25 -115.86 gain 25 197 -110.47 gain 197 25 -110.15 gain 25 198 -110.08 gain 198 25 -112.41 gain 25 199 -108.52 gain 199 25 -104.86 gain 25 200 -110.32 gain 200 25 -108.58 gain 25 201 -106.40 gain 201 25 -107.75 gain 25 202 -108.89 gain 202 25 -108.53 gain 25 203 -115.27 gain 203 25 -115.02 gain 25 204 -106.46 gain 204 25 -104.43 gain 25 205 -107.54 gain 205 25 -105.17 gain 25 206 -113.58 gain 206 25 -112.53 gain 25 207 -111.05 gain 207 25 -107.75 gain 25 208 -115.15 gain 208 25 -115.15 gain 25 209 -109.25 gain 209 25 -108.29 gain 25 210 -109.83 gain 210 25 -112.87 gain 25 211 -116.85 gain 211 25 -117.29 gain 25 212 -112.10 gain 212 25 -111.08 gain 25 213 -112.09 gain 213 25 -113.81 gain 25 214 -107.93 gain 214 25 -107.83 gain 25 215 -113.36 gain 215 25 -115.08 gain 25 216 -111.94 gain 216 25 -110.55 gain 25 217 -102.99 gain 217 25 -106.05 gain 25 218 -108.08 gain 218 25 -112.45 gain 25 219 -107.65 gain 219 25 -109.60 gain 25 220 -104.53 gain 220 25 -103.59 gain 25 221 -107.19 gain 221 25 -107.25 gain 25 222 -103.65 gain 222 25 -100.29 gain 25 223 -113.66 gain 223 25 -112.58 gain 25 224 -115.95 gain 224 25 -111.80 gain 26 27 -83.73 gain 27 26 -83.07 gain 26 28 -94.40 gain 28 26 -95.69 gain 26 29 -98.15 gain 29 26 -91.07 gain 26 30 -110.59 gain 30 26 -115.20 gain 26 31 -106.03 gain 31 26 -107.72 gain 26 32 -104.31 gain 32 26 -101.14 gain 26 33 -98.51 gain 33 26 -94.11 gain 26 34 -99.54 gain 34 26 -102.14 gain 26 35 -105.00 gain 35 26 -105.50 gain 26 36 -99.44 gain 36 26 -98.76 gain 26 37 -95.51 gain 37 26 -94.23 gain 26 38 -92.41 gain 38 26 -92.34 gain 26 39 -89.56 gain 39 26 -86.95 gain 26 40 -79.58 gain 40 26 -79.03 gain 26 41 -78.66 gain 41 26 -77.76 gain 26 42 -77.28 gain 42 26 -79.39 gain 26 43 -86.50 gain 43 26 -89.13 gain 26 44 -89.32 gain 44 26 -89.94 gain 26 45 -107.18 gain 45 26 -103.83 gain 26 46 -94.84 gain 46 26 -94.36 gain 26 47 -106.28 gain 47 26 -107.65 gain 26 48 -99.26 gain 48 26 -97.63 gain 26 49 -100.94 gain 49 26 -95.95 gain 26 50 -96.91 gain 50 26 -93.81 gain 26 51 -105.88 gain 51 26 -104.57 gain 26 52 -95.86 gain 52 26 -90.98 gain 26 53 -91.61 gain 53 26 -91.22 gain 26 54 -80.89 gain 54 26 -77.02 gain 26 55 -88.42 gain 55 26 -87.68 gain 26 56 -83.79 gain 56 26 -86.14 gain 26 57 -83.62 gain 57 26 -88.01 gain 26 58 -91.70 gain 58 26 -95.64 gain 26 59 -89.06 gain 59 26 -91.16 gain 26 60 -113.08 gain 60 26 -113.60 gain 26 61 -110.12 gain 61 26 -103.51 gain 26 62 -108.02 gain 62 26 -104.21 gain 26 63 -94.82 gain 63 26 -90.03 gain 26 64 -101.73 gain 64 26 -101.32 gain 26 65 -105.28 gain 65 26 -104.91 gain 26 66 -98.00 gain 66 26 -96.94 gain 26 67 -93.02 gain 67 26 -92.08 gain 26 68 -99.59 gain 68 26 -98.60 gain 26 69 -95.62 gain 69 26 -92.89 gain 26 70 -92.51 gain 70 26 -92.49 gain 26 71 -86.94 gain 71 26 -87.67 gain 26 72 -86.55 gain 72 26 -89.13 gain 26 73 -93.49 gain 73 26 -93.13 gain 26 74 -96.35 gain 74 26 -91.98 gain 26 75 -110.93 gain 75 26 -106.94 gain 26 76 -105.72 gain 76 26 -104.23 gain 26 77 -104.56 gain 77 26 -101.36 gain 26 78 -94.96 gain 78 26 -100.40 gain 26 79 -104.28 gain 79 26 -104.26 gain 26 80 -106.82 gain 80 26 -105.13 gain 26 81 -97.04 gain 81 26 -99.62 gain 26 82 -92.94 gain 82 26 -94.69 gain 26 83 -96.28 gain 83 26 -97.61 gain 26 84 -95.77 gain 84 26 -94.17 gain 26 85 -86.20 gain 85 26 -89.18 gain 26 86 -91.76 gain 86 26 -87.93 gain 26 87 -97.83 gain 87 26 -96.79 gain 26 88 -94.66 gain 88 26 -93.90 gain 26 89 -100.46 gain 89 26 -100.34 gain 26 90 -105.44 gain 90 26 -108.85 gain 26 91 -111.24 gain 91 26 -110.25 gain 26 92 -108.11 gain 92 26 -110.68 gain 26 93 -102.13 gain 93 26 -98.61 gain 26 94 -96.97 gain 94 26 -95.89 gain 26 95 -104.72 gain 95 26 -106.68 gain 26 96 -108.48 gain 96 26 -106.71 gain 26 97 -99.30 gain 97 26 -98.81 gain 26 98 -99.94 gain 98 26 -96.62 gain 26 99 -98.49 gain 99 26 -99.27 gain 26 100 -96.27 gain 100 26 -94.88 gain 26 101 -94.23 gain 101 26 -91.51 gain 26 102 -102.95 gain 102 26 -100.89 gain 26 103 -106.22 gain 103 26 -103.39 gain 26 104 -101.88 gain 104 26 -95.48 gain 26 105 -117.61 gain 105 26 -116.61 gain 26 106 -106.13 gain 106 26 -104.44 gain 26 107 -113.12 gain 107 26 -114.44 gain 26 108 -90.49 gain 108 26 -89.88 gain 26 109 -104.76 gain 109 26 -100.98 gain 26 110 -106.45 gain 110 26 -104.92 gain 26 111 -103.98 gain 111 26 -99.65 gain 26 112 -111.26 gain 112 26 -108.93 gain 26 113 -96.31 gain 113 26 -100.92 gain 26 114 -98.99 gain 114 26 -99.22 gain 26 115 -103.80 gain 115 26 -104.89 gain 26 116 -99.33 gain 116 26 -96.45 gain 26 117 -99.06 gain 117 26 -96.02 gain 26 118 -97.72 gain 118 26 -102.85 gain 26 119 -105.91 gain 119 26 -102.59 gain 26 120 -108.38 gain 120 26 -105.17 gain 26 121 -110.75 gain 121 26 -110.29 gain 26 122 -105.39 gain 122 26 -107.50 gain 26 123 -105.96 gain 123 26 -108.32 gain 26 124 -108.49 gain 124 26 -104.45 gain 26 125 -101.07 gain 125 26 -98.97 gain 26 126 -102.07 gain 126 26 -104.85 gain 26 127 -105.01 gain 127 26 -102.55 gain 26 128 -100.16 gain 128 26 -100.75 gain 26 129 -111.51 gain 129 26 -109.31 gain 26 130 -98.70 gain 130 26 -98.69 gain 26 131 -107.51 gain 131 26 -105.86 gain 26 132 -103.94 gain 132 26 -98.56 gain 26 133 -102.17 gain 133 26 -101.22 gain 26 134 -97.56 gain 134 26 -94.61 gain 26 135 -106.39 gain 135 26 -99.02 gain 26 136 -111.04 gain 136 26 -112.45 gain 26 137 -106.09 gain 137 26 -104.15 gain 26 138 -108.65 gain 138 26 -108.73 gain 26 139 -103.21 gain 139 26 -104.99 gain 26 140 -108.38 gain 140 26 -109.98 gain 26 141 -106.97 gain 141 26 -104.25 gain 26 142 -96.65 gain 142 26 -95.08 gain 26 143 -107.61 gain 143 26 -108.50 gain 26 144 -95.12 gain 144 26 -91.91 gain 26 145 -107.96 gain 145 26 -109.30 gain 26 146 -97.76 gain 146 26 -95.54 gain 26 147 -103.75 gain 147 26 -102.72 gain 26 148 -102.33 gain 148 26 -101.83 gain 26 149 -105.23 gain 149 26 -101.11 gain 26 150 -108.39 gain 150 26 -107.64 gain 26 151 -116.28 gain 151 26 -118.01 gain 26 152 -115.48 gain 152 26 -115.58 gain 26 153 -106.08 gain 153 26 -105.87 gain 26 154 -109.25 gain 154 26 -110.18 gain 26 155 -104.64 gain 155 26 -102.86 gain 26 156 -103.11 gain 156 26 -102.46 gain 26 157 -111.72 gain 157 26 -112.36 gain 26 158 -108.10 gain 158 26 -110.71 gain 26 159 -107.10 gain 159 26 -103.75 gain 26 160 -104.74 gain 160 26 -102.76 gain 26 161 -100.94 gain 161 26 -100.02 gain 26 162 -91.90 gain 162 26 -90.61 gain 26 163 -107.83 gain 163 26 -103.96 gain 26 164 -102.65 gain 164 26 -106.01 gain 26 165 -122.87 gain 165 26 -123.58 gain 26 166 -116.43 gain 166 26 -118.80 gain 26 167 -108.55 gain 167 26 -109.74 gain 26 168 -111.08 gain 168 26 -111.34 gain 26 169 -110.48 gain 169 26 -107.26 gain 26 170 -107.09 gain 170 26 -104.80 gain 26 171 -104.61 gain 171 26 -102.90 gain 26 172 -116.23 gain 172 26 -117.31 gain 26 173 -103.44 gain 173 26 -98.84 gain 26 174 -113.06 gain 174 26 -114.41 gain 26 175 -106.89 gain 175 26 -100.05 gain 26 176 -109.90 gain 176 26 -107.27 gain 26 177 -101.64 gain 177 26 -101.38 gain 26 178 -111.17 gain 178 26 -108.52 gain 26 179 -105.98 gain 179 26 -106.37 gain 26 180 -109.70 gain 180 26 -108.82 gain 26 181 -114.07 gain 181 26 -116.59 gain 26 182 -117.29 gain 182 26 -115.95 gain 26 183 -105.97 gain 183 26 -100.51 gain 26 184 -104.07 gain 184 26 -104.84 gain 26 185 -108.51 gain 185 26 -107.78 gain 26 186 -114.09 gain 186 26 -114.06 gain 26 187 -108.66 gain 187 26 -108.66 gain 26 188 -118.55 gain 188 26 -122.99 gain 26 189 -112.79 gain 189 26 -113.29 gain 26 190 -107.89 gain 190 26 -101.22 gain 26 191 -117.80 gain 191 26 -114.30 gain 26 192 -111.12 gain 192 26 -111.30 gain 26 193 -109.80 gain 193 26 -106.00 gain 26 194 -107.23 gain 194 26 -103.32 gain 26 195 -107.51 gain 195 26 -101.57 gain 26 196 -112.21 gain 196 26 -113.94 gain 26 197 -108.06 gain 197 26 -107.28 gain 26 198 -109.20 gain 198 26 -111.07 gain 26 199 -112.91 gain 199 26 -108.79 gain 26 200 -112.03 gain 200 26 -109.83 gain 26 201 -114.52 gain 201 26 -115.41 gain 26 202 -110.96 gain 202 26 -110.14 gain 26 203 -111.92 gain 203 26 -111.20 gain 26 204 -103.89 gain 204 26 -101.39 gain 26 205 -111.83 gain 205 26 -109.00 gain 26 206 -106.23 gain 206 26 -104.73 gain 26 207 -113.19 gain 207 26 -109.42 gain 26 208 -111.54 gain 208 26 -111.07 gain 26 209 -104.11 gain 209 26 -102.69 gain 26 210 -115.29 gain 210 26 -117.87 gain 26 211 -107.48 gain 211 26 -107.45 gain 26 212 -108.43 gain 212 26 -106.95 gain 26 213 -118.19 gain 213 26 -119.45 gain 26 214 -107.75 gain 214 26 -107.19 gain 26 215 -113.20 gain 215 26 -114.45 gain 26 216 -114.04 gain 216 26 -112.19 gain 26 217 -114.54 gain 217 26 -117.14 gain 26 218 -110.80 gain 218 26 -114.71 gain 26 219 -112.72 gain 219 26 -114.20 gain 26 220 -117.83 gain 220 26 -116.44 gain 26 221 -105.62 gain 221 26 -105.21 gain 26 222 -109.99 gain 222 26 -106.16 gain 26 223 -109.99 gain 223 26 -108.45 gain 26 224 -108.69 gain 224 26 -104.08 gain 27 28 -77.59 gain 28 27 -79.54 gain 27 29 -83.10 gain 29 27 -76.68 gain 27 30 -109.06 gain 30 27 -114.33 gain 27 31 -100.92 gain 31 27 -103.28 gain 27 32 -98.13 gain 32 27 -95.62 gain 27 33 -114.06 gain 33 27 -110.32 gain 27 34 -108.81 gain 34 27 -112.07 gain 27 35 -109.71 gain 35 27 -110.87 gain 27 36 -104.11 gain 36 27 -104.09 gain 27 37 -97.06 gain 37 27 -96.44 gain 27 38 -101.80 gain 38 27 -102.38 gain 27 39 -98.13 gain 39 27 -96.18 gain 27 40 -77.38 gain 40 27 -77.48 gain 27 41 -82.85 gain 41 27 -82.61 gain 27 42 -75.34 gain 42 27 -78.11 gain 27 43 -86.91 gain 43 27 -90.20 gain 27 44 -77.51 gain 44 27 -78.80 gain 27 45 -109.08 gain 45 27 -106.39 gain 27 46 -105.78 gain 46 27 -105.95 gain 27 47 -108.28 gain 47 27 -110.31 gain 27 48 -97.91 gain 48 27 -96.94 gain 27 49 -103.34 gain 49 27 -99.01 gain 27 50 -108.17 gain 50 27 -105.73 gain 27 51 -98.39 gain 51 27 -97.74 gain 27 52 -96.11 gain 52 27 -91.89 gain 27 53 -103.81 gain 53 27 -104.09 gain 27 54 -89.54 gain 54 27 -86.33 gain 27 55 -93.36 gain 55 27 -93.28 gain 27 56 -85.51 gain 56 27 -88.52 gain 27 57 -86.78 gain 57 27 -91.83 gain 27 58 -85.30 gain 58 27 -89.90 gain 27 59 -94.73 gain 59 27 -97.49 gain 27 60 -113.25 gain 60 27 -114.43 gain 27 61 -108.45 gain 61 27 -102.51 gain 27 62 -110.84 gain 62 27 -107.69 gain 27 63 -105.45 gain 63 27 -101.31 gain 27 64 -105.82 gain 64 27 -106.07 gain 27 65 -107.26 gain 65 27 -107.55 gain 27 66 -100.04 gain 66 27 -99.63 gain 27 67 -93.51 gain 67 27 -93.22 gain 27 68 -96.04 gain 68 27 -95.72 gain 27 69 -91.70 gain 69 27 -89.64 gain 27 70 -89.99 gain 70 27 -90.62 gain 27 71 -85.80 gain 71 27 -87.19 gain 27 72 -85.07 gain 72 27 -88.31 gain 27 73 -82.75 gain 73 27 -83.04 gain 27 74 -94.80 gain 74 27 -91.08 gain 27 75 -112.94 gain 75 27 -109.61 gain 27 76 -108.74 gain 76 27 -107.90 gain 27 77 -110.15 gain 77 27 -107.61 gain 27 78 -109.74 gain 78 27 -115.84 gain 27 79 -107.50 gain 79 27 -108.14 gain 27 80 -101.29 gain 80 27 -100.26 gain 27 81 -102.47 gain 81 27 -105.71 gain 27 82 -102.44 gain 82 27 -104.84 gain 27 83 -96.39 gain 83 27 -98.37 gain 27 84 -94.45 gain 84 27 -93.51 gain 27 85 -89.60 gain 85 27 -93.24 gain 27 86 -97.54 gain 86 27 -94.36 gain 27 87 -91.63 gain 87 27 -91.25 gain 27 88 -95.84 gain 88 27 -95.74 gain 27 89 -93.15 gain 89 27 -93.69 gain 27 90 -100.36 gain 90 27 -104.43 gain 27 91 -107.76 gain 91 27 -107.42 gain 27 92 -111.00 gain 92 27 -114.23 gain 27 93 -103.49 gain 93 27 -100.63 gain 27 94 -101.27 gain 94 27 -100.85 gain 27 95 -107.71 gain 95 27 -110.33 gain 27 96 -103.79 gain 96 27 -102.68 gain 27 97 -99.38 gain 97 27 -99.55 gain 27 98 -95.17 gain 98 27 -92.51 gain 27 99 -92.11 gain 99 27 -93.54 gain 27 100 -97.93 gain 100 27 -97.20 gain 27 101 -105.81 gain 101 27 -103.74 gain 27 102 -98.63 gain 102 27 -97.23 gain 27 103 -99.06 gain 103 27 -96.89 gain 27 104 -97.10 gain 104 27 -91.36 gain 27 105 -111.05 gain 105 27 -110.71 gain 27 106 -110.60 gain 106 27 -109.56 gain 27 107 -106.35 gain 107 27 -108.33 gain 27 108 -105.14 gain 108 27 -105.18 gain 27 109 -111.59 gain 109 27 -108.48 gain 27 110 -104.09 gain 110 27 -103.22 gain 27 111 -102.72 gain 111 27 -99.04 gain 27 112 -105.01 gain 112 27 -103.34 gain 27 113 -106.53 gain 113 27 -111.79 gain 27 114 -108.80 gain 114 27 -109.69 gain 27 115 -99.89 gain 115 27 -101.65 gain 27 116 -100.12 gain 116 27 -97.90 gain 27 117 -92.77 gain 117 27 -90.40 gain 27 118 -95.87 gain 118 27 -101.67 gain 27 119 -102.63 gain 119 27 -99.98 gain 27 120 -108.23 gain 120 27 -105.68 gain 27 121 -107.87 gain 121 27 -108.06 gain 27 122 -109.26 gain 122 27 -112.02 gain 27 123 -106.27 gain 123 27 -109.29 gain 27 124 -107.61 gain 124 27 -104.24 gain 27 125 -100.66 gain 125 27 -99.21 gain 27 126 -101.86 gain 126 27 -105.30 gain 27 127 -105.06 gain 127 27 -103.25 gain 27 128 -103.49 gain 128 27 -104.74 gain 27 129 -100.42 gain 129 27 -98.89 gain 27 130 -99.97 gain 130 27 -100.61 gain 27 131 -101.16 gain 131 27 -100.16 gain 27 132 -103.68 gain 132 27 -98.96 gain 27 133 -97.76 gain 133 27 -97.46 gain 27 134 -97.01 gain 134 27 -94.72 gain 27 135 -110.75 gain 135 27 -104.04 gain 27 136 -114.26 gain 136 27 -116.33 gain 27 137 -111.36 gain 137 27 -110.08 gain 27 138 -102.67 gain 138 27 -103.41 gain 27 139 -112.93 gain 139 27 -115.38 gain 27 140 -108.57 gain 140 27 -110.83 gain 27 141 -107.53 gain 141 27 -105.48 gain 27 142 -105.85 gain 142 27 -104.94 gain 27 143 -104.84 gain 143 27 -106.39 gain 27 144 -105.81 gain 144 27 -103.26 gain 27 145 -104.57 gain 145 27 -106.57 gain 27 146 -108.48 gain 146 27 -106.92 gain 27 147 -105.23 gain 147 27 -104.86 gain 27 148 -101.54 gain 148 27 -101.69 gain 27 149 -104.14 gain 149 27 -100.67 gain 27 150 -112.11 gain 150 27 -112.03 gain 27 151 -114.55 gain 151 27 -116.94 gain 27 152 -105.23 gain 152 27 -105.98 gain 27 153 -110.42 gain 153 27 -110.87 gain 27 154 -102.45 gain 154 27 -104.03 gain 27 155 -107.53 gain 155 27 -106.41 gain 27 156 -102.83 gain 156 27 -102.83 gain 27 157 -102.92 gain 157 27 -104.22 gain 27 158 -104.08 gain 158 27 -107.35 gain 27 159 -113.66 gain 159 27 -110.97 gain 27 160 -104.95 gain 160 27 -103.64 gain 27 161 -108.38 gain 161 27 -108.12 gain 27 162 -98.44 gain 162 27 -97.81 gain 27 163 -100.41 gain 163 27 -97.20 gain 27 164 -112.74 gain 164 27 -116.75 gain 27 165 -110.27 gain 165 27 -111.64 gain 27 166 -100.21 gain 166 27 -103.24 gain 27 167 -109.58 gain 167 27 -111.43 gain 27 168 -108.18 gain 168 27 -109.10 gain 27 169 -104.88 gain 169 27 -102.32 gain 27 170 -107.33 gain 170 27 -105.70 gain 27 171 -101.94 gain 171 27 -100.88 gain 27 172 -110.78 gain 172 27 -112.52 gain 27 173 -111.05 gain 173 27 -107.11 gain 27 174 -107.41 gain 174 27 -109.43 gain 27 175 -106.28 gain 175 27 -100.09 gain 27 176 -108.67 gain 176 27 -106.71 gain 27 177 -103.98 gain 177 27 -104.38 gain 27 178 -98.04 gain 178 27 -96.04 gain 27 179 -110.66 gain 179 27 -111.71 gain 27 180 -109.65 gain 180 27 -109.44 gain 27 181 -106.82 gain 181 27 -110.00 gain 27 182 -110.16 gain 182 27 -109.48 gain 27 183 -110.05 gain 183 27 -105.25 gain 27 184 -109.38 gain 184 27 -110.81 gain 27 185 -103.17 gain 185 27 -103.10 gain 27 186 -108.25 gain 186 27 -108.88 gain 27 187 -108.43 gain 187 27 -109.09 gain 27 188 -107.76 gain 188 27 -112.86 gain 27 189 -110.92 gain 189 27 -112.08 gain 27 190 -107.83 gain 190 27 -101.83 gain 27 191 -108.08 gain 191 27 -105.24 gain 27 192 -104.17 gain 192 27 -105.00 gain 27 193 -107.87 gain 193 27 -104.73 gain 27 194 -108.02 gain 194 27 -104.77 gain 27 195 -117.15 gain 195 27 -111.87 gain 27 196 -110.98 gain 196 27 -113.37 gain 27 197 -112.49 gain 197 27 -112.37 gain 27 198 -107.05 gain 198 27 -109.57 gain 27 199 -119.12 gain 199 27 -115.65 gain 27 200 -115.21 gain 200 27 -113.66 gain 27 201 -118.04 gain 201 27 -119.58 gain 27 202 -110.01 gain 202 27 -109.85 gain 27 203 -107.42 gain 203 27 -107.36 gain 27 204 -110.00 gain 204 27 -108.16 gain 27 205 -105.02 gain 205 27 -102.85 gain 27 206 -112.59 gain 206 27 -111.74 gain 27 207 -103.13 gain 207 27 -100.03 gain 27 208 -103.03 gain 208 27 -103.22 gain 27 209 -110.63 gain 209 27 -109.87 gain 27 210 -116.73 gain 210 27 -119.97 gain 27 211 -109.72 gain 211 27 -110.35 gain 27 212 -106.85 gain 212 27 -106.03 gain 27 213 -105.57 gain 213 27 -107.48 gain 27 214 -114.26 gain 214 27 -114.35 gain 27 215 -108.72 gain 215 27 -110.63 gain 27 216 -106.86 gain 216 27 -105.66 gain 27 217 -111.03 gain 217 27 -114.28 gain 27 218 -95.62 gain 218 27 -100.19 gain 27 219 -110.37 gain 219 27 -112.52 gain 27 220 -114.33 gain 220 27 -113.60 gain 27 221 -109.80 gain 221 27 -110.05 gain 27 222 -104.86 gain 222 27 -101.69 gain 27 223 -107.79 gain 223 27 -106.91 gain 27 224 -118.73 gain 224 27 -114.78 gain 28 29 -79.06 gain 29 28 -70.69 gain 28 30 -112.18 gain 30 28 -115.50 gain 28 31 -106.40 gain 31 28 -106.80 gain 28 32 -112.95 gain 32 28 -108.49 gain 28 33 -113.06 gain 33 28 -107.38 gain 28 34 -102.55 gain 34 28 -103.85 gain 28 35 -111.46 gain 35 28 -110.67 gain 28 36 -98.50 gain 36 28 -96.53 gain 28 37 -99.23 gain 37 28 -96.66 gain 28 38 -98.89 gain 38 28 -97.52 gain 28 39 -99.59 gain 39 28 -95.69 gain 28 40 -86.43 gain 40 28 -84.58 gain 28 41 -87.05 gain 41 28 -84.85 gain 28 42 -81.69 gain 42 28 -82.52 gain 28 43 -69.88 gain 43 28 -71.22 gain 28 44 -82.93 gain 44 28 -82.26 gain 28 45 -104.20 gain 45 28 -99.56 gain 28 46 -107.20 gain 46 28 -105.43 gain 28 47 -116.79 gain 47 28 -116.87 gain 28 48 -103.24 gain 48 28 -100.32 gain 28 49 -113.18 gain 49 28 -106.90 gain 28 50 -113.07 gain 50 28 -108.69 gain 28 51 -113.46 gain 51 28 -110.86 gain 28 52 -107.36 gain 52 28 -101.19 gain 28 53 -95.46 gain 53 28 -93.78 gain 28 54 -97.02 gain 54 28 -91.86 gain 28 55 -94.99 gain 55 28 -92.96 gain 28 56 -97.16 gain 56 28 -98.22 gain 28 57 -90.00 gain 57 28 -93.10 gain 28 58 -84.16 gain 58 28 -86.81 gain 28 59 -85.98 gain 59 28 -86.79 gain 28 60 -105.20 gain 60 28 -104.42 gain 28 61 -103.51 gain 61 28 -95.61 gain 28 62 -110.49 gain 62 28 -105.39 gain 28 63 -105.96 gain 63 28 -99.87 gain 28 64 -105.52 gain 64 28 -103.82 gain 28 65 -109.62 gain 65 28 -107.96 gain 28 66 -107.56 gain 66 28 -105.20 gain 28 67 -106.51 gain 67 28 -104.27 gain 28 68 -108.13 gain 68 28 -105.85 gain 28 69 -95.66 gain 69 28 -91.64 gain 28 70 -97.72 gain 70 28 -96.40 gain 28 71 -100.87 gain 71 28 -100.31 gain 28 72 -89.14 gain 72 28 -90.42 gain 28 73 -90.85 gain 73 28 -89.19 gain 28 74 -91.76 gain 74 28 -86.10 gain 28 75 -107.16 gain 75 28 -101.88 gain 28 76 -120.90 gain 76 28 -118.11 gain 28 77 -109.83 gain 77 28 -105.34 gain 28 78 -115.52 gain 78 28 -119.67 gain 28 79 -107.44 gain 79 28 -106.13 gain 28 80 -112.25 gain 80 28 -109.27 gain 28 81 -101.40 gain 81 28 -102.69 gain 28 82 -99.22 gain 82 28 -99.68 gain 28 83 -106.64 gain 83 28 -106.67 gain 28 84 -98.43 gain 84 28 -95.54 gain 28 85 -96.09 gain 85 28 -97.78 gain 28 86 -100.00 gain 86 28 -94.88 gain 28 87 -94.63 gain 87 28 -92.30 gain 28 88 -92.13 gain 88 28 -90.08 gain 28 89 -94.73 gain 89 28 -93.32 gain 28 90 -109.22 gain 90 28 -111.34 gain 28 91 -110.35 gain 91 28 -108.06 gain 28 92 -103.28 gain 92 28 -104.56 gain 28 93 -105.93 gain 93 28 -101.12 gain 28 94 -115.22 gain 94 28 -112.85 gain 28 95 -103.09 gain 95 28 -103.76 gain 28 96 -103.80 gain 96 28 -100.74 gain 28 97 -99.66 gain 97 28 -97.88 gain 28 98 -98.75 gain 98 28 -94.14 gain 28 99 -97.38 gain 99 28 -96.86 gain 28 100 -101.23 gain 100 28 -98.55 gain 28 101 -102.68 gain 101 28 -98.67 gain 28 102 -99.67 gain 102 28 -96.32 gain 28 103 -100.01 gain 103 28 -95.89 gain 28 104 -93.63 gain 104 28 -85.93 gain 28 105 -115.18 gain 105 28 -112.89 gain 28 106 -107.65 gain 106 28 -104.66 gain 28 107 -110.44 gain 107 28 -110.47 gain 28 108 -115.79 gain 108 28 -113.88 gain 28 109 -114.08 gain 109 28 -109.02 gain 28 110 -109.81 gain 110 28 -106.99 gain 28 111 -109.66 gain 111 28 -104.03 gain 28 112 -107.97 gain 112 28 -104.35 gain 28 113 -105.52 gain 113 28 -108.83 gain 28 114 -102.01 gain 114 28 -100.95 gain 28 115 -107.12 gain 115 28 -106.92 gain 28 116 -98.83 gain 116 28 -94.66 gain 28 117 -96.64 gain 117 28 -92.31 gain 28 118 -102.78 gain 118 28 -106.63 gain 28 119 -98.13 gain 119 28 -93.52 gain 28 120 -110.71 gain 120 28 -106.21 gain 28 121 -111.15 gain 121 28 -109.40 gain 28 122 -107.06 gain 122 28 -107.87 gain 28 123 -109.95 gain 123 28 -111.02 gain 28 124 -111.15 gain 124 28 -105.82 gain 28 125 -107.79 gain 125 28 -104.40 gain 28 126 -110.48 gain 126 28 -111.97 gain 28 127 -103.76 gain 127 28 -100.00 gain 28 128 -105.99 gain 128 28 -105.29 gain 28 129 -104.18 gain 129 28 -100.69 gain 28 130 -100.22 gain 130 28 -98.92 gain 28 131 -101.41 gain 131 28 -98.47 gain 28 132 -108.23 gain 132 28 -101.56 gain 28 133 -97.41 gain 133 28 -95.17 gain 28 134 -106.31 gain 134 28 -102.06 gain 28 135 -118.35 gain 135 28 -109.69 gain 28 136 -113.40 gain 136 28 -113.52 gain 28 137 -115.36 gain 137 28 -112.14 gain 28 138 -103.07 gain 138 28 -101.86 gain 28 139 -104.31 gain 139 28 -104.81 gain 28 140 -110.64 gain 140 28 -110.94 gain 28 141 -103.48 gain 141 28 -99.47 gain 28 142 -106.48 gain 142 28 -103.62 gain 28 143 -101.15 gain 143 28 -100.74 gain 28 144 -112.56 gain 144 28 -108.06 gain 28 145 -99.77 gain 145 28 -99.81 gain 28 146 -109.15 gain 146 28 -105.64 gain 28 147 -103.94 gain 147 28 -101.62 gain 28 148 -107.10 gain 148 28 -105.31 gain 28 149 -104.48 gain 149 28 -99.07 gain 28 150 -111.79 gain 150 28 -109.75 gain 28 151 -112.13 gain 151 28 -112.58 gain 28 152 -110.54 gain 152 28 -109.35 gain 28 153 -116.27 gain 153 28 -114.77 gain 28 154 -107.56 gain 154 28 -107.19 gain 28 155 -110.77 gain 155 28 -107.70 gain 28 156 -109.65 gain 156 28 -107.70 gain 28 157 -105.67 gain 157 28 -105.02 gain 28 158 -105.86 gain 158 28 -107.18 gain 28 159 -104.50 gain 159 28 -99.85 gain 28 160 -107.13 gain 160 28 -103.87 gain 28 161 -109.56 gain 161 28 -107.34 gain 28 162 -98.94 gain 162 28 -96.36 gain 28 163 -115.87 gain 163 28 -110.71 gain 28 164 -104.52 gain 164 28 -106.59 gain 28 165 -113.81 gain 165 28 -113.23 gain 28 166 -116.77 gain 166 28 -117.85 gain 28 167 -120.95 gain 167 28 -120.85 gain 28 168 -113.68 gain 168 28 -112.65 gain 28 169 -111.42 gain 169 28 -106.90 gain 28 170 -107.89 gain 170 28 -104.31 gain 28 171 -112.28 gain 171 28 -109.27 gain 28 172 -106.23 gain 172 28 -106.02 gain 28 173 -106.44 gain 173 28 -100.55 gain 28 174 -110.81 gain 174 28 -110.88 gain 28 175 -115.73 gain 175 28 -107.59 gain 28 176 -113.22 gain 176 28 -109.30 gain 28 177 -115.10 gain 177 28 -113.55 gain 28 178 -98.19 gain 178 28 -94.25 gain 28 179 -105.25 gain 179 28 -104.35 gain 28 180 -116.19 gain 180 28 -114.03 gain 28 181 -115.62 gain 181 28 -116.86 gain 28 182 -107.19 gain 182 28 -104.56 gain 28 183 -114.18 gain 183 28 -107.43 gain 28 184 -112.47 gain 184 28 -111.95 gain 28 185 -112.22 gain 185 28 -110.20 gain 28 186 -108.74 gain 186 28 -107.42 gain 28 187 -107.40 gain 187 28 -106.11 gain 28 188 -108.98 gain 188 28 -112.13 gain 28 189 -115.30 gain 189 28 -114.51 gain 28 190 -111.34 gain 190 28 -103.38 gain 28 191 -103.52 gain 191 28 -98.73 gain 28 192 -110.37 gain 192 28 -109.26 gain 28 193 -108.70 gain 193 28 -103.61 gain 28 194 -108.83 gain 194 28 -103.63 gain 28 195 -111.88 gain 195 28 -104.65 gain 28 196 -112.26 gain 196 28 -112.70 gain 28 197 -108.69 gain 197 28 -106.62 gain 28 198 -109.73 gain 198 28 -110.30 gain 28 199 -114.71 gain 199 28 -109.30 gain 28 200 -113.47 gain 200 28 -109.98 gain 28 201 -106.16 gain 201 28 -105.76 gain 28 202 -112.11 gain 202 28 -110.00 gain 28 203 -109.24 gain 203 28 -107.22 gain 28 204 -106.87 gain 204 28 -103.08 gain 28 205 -110.14 gain 205 28 -106.01 gain 28 206 -109.58 gain 206 28 -106.78 gain 28 207 -108.25 gain 207 28 -103.20 gain 28 208 -106.51 gain 208 28 -104.76 gain 28 209 -114.89 gain 209 28 -112.17 gain 28 210 -114.23 gain 210 28 -115.52 gain 28 211 -120.98 gain 211 28 -119.66 gain 28 212 -116.77 gain 212 28 -114.00 gain 28 213 -113.09 gain 213 28 -113.06 gain 28 214 -115.41 gain 214 28 -113.56 gain 28 215 -118.28 gain 215 28 -118.24 gain 28 216 -110.09 gain 216 28 -106.94 gain 28 217 -110.91 gain 217 28 -112.21 gain 28 218 -115.12 gain 218 28 -117.74 gain 28 219 -117.24 gain 219 28 -117.43 gain 28 220 -112.60 gain 220 28 -109.91 gain 28 221 -112.59 gain 221 28 -110.90 gain 28 222 -115.89 gain 222 28 -110.77 gain 28 223 -115.70 gain 223 28 -112.87 gain 28 224 -118.19 gain 224 28 -112.29 gain 29 30 -106.46 gain 30 29 -118.15 gain 29 31 -95.83 gain 31 29 -104.60 gain 29 32 -103.42 gain 32 29 -107.33 gain 29 33 -99.88 gain 33 29 -102.56 gain 29 34 -99.37 gain 34 29 -109.04 gain 29 35 -102.77 gain 35 29 -110.35 gain 29 36 -91.27 gain 36 29 -97.67 gain 29 37 -90.68 gain 37 29 -96.48 gain 29 38 -97.86 gain 38 29 -104.86 gain 29 39 -82.86 gain 39 29 -87.32 gain 29 40 -88.05 gain 40 29 -94.58 gain 29 41 -89.20 gain 41 29 -95.37 gain 29 42 -79.98 gain 42 29 -89.17 gain 29 43 -73.23 gain 43 29 -82.94 gain 29 44 -70.01 gain 44 29 -77.71 gain 29 45 -99.17 gain 45 29 -102.89 gain 29 46 -104.45 gain 46 29 -111.05 gain 29 47 -102.97 gain 47 29 -111.42 gain 29 48 -102.23 gain 48 29 -107.68 gain 29 49 -106.24 gain 49 29 -108.33 gain 29 50 -98.18 gain 50 29 -102.16 gain 29 51 -96.66 gain 51 29 -102.43 gain 29 52 -90.06 gain 52 29 -92.26 gain 29 53 -94.93 gain 53 29 -101.63 gain 29 54 -88.63 gain 54 29 -91.84 gain 29 55 -89.60 gain 55 29 -95.94 gain 29 56 -89.33 gain 56 29 -98.76 gain 29 57 -87.54 gain 57 29 -99.01 gain 29 58 -77.57 gain 58 29 -88.59 gain 29 59 -80.02 gain 59 29 -89.20 gain 29 60 -100.98 gain 60 29 -108.58 gain 29 61 -97.93 gain 61 29 -98.41 gain 29 62 -95.20 gain 62 29 -98.47 gain 29 63 -104.63 gain 63 29 -106.92 gain 29 64 -101.15 gain 64 29 -107.82 gain 29 65 -108.93 gain 65 29 -115.64 gain 29 66 -96.72 gain 66 29 -102.74 gain 29 67 -96.41 gain 67 29 -102.55 gain 29 68 -95.15 gain 68 29 -101.25 gain 29 69 -91.53 gain 69 29 -95.88 gain 29 70 -91.08 gain 70 29 -98.13 gain 29 71 -85.46 gain 71 29 -93.27 gain 29 72 -85.97 gain 72 29 -95.63 gain 29 73 -85.82 gain 73 29 -92.53 gain 29 74 -83.68 gain 74 29 -86.39 gain 29 75 -106.19 gain 75 29 -109.28 gain 29 76 -106.95 gain 76 29 -112.54 gain 29 77 -99.38 gain 77 29 -103.26 gain 29 78 -101.39 gain 78 29 -113.91 gain 29 79 -102.44 gain 79 29 -109.50 gain 29 80 -99.79 gain 80 29 -105.18 gain 29 81 -100.93 gain 81 29 -110.60 gain 29 82 -97.63 gain 82 29 -106.46 gain 29 83 -96.72 gain 83 29 -105.12 gain 29 84 -101.18 gain 84 29 -106.66 gain 29 85 -88.16 gain 85 29 -98.22 gain 29 86 -88.55 gain 86 29 -91.80 gain 29 87 -84.28 gain 87 29 -90.32 gain 29 88 -89.63 gain 88 29 -95.95 gain 29 89 -86.93 gain 89 29 -93.89 gain 29 90 -100.01 gain 90 29 -110.50 gain 29 91 -114.25 gain 91 29 -120.34 gain 29 92 -102.93 gain 92 29 -112.58 gain 29 93 -99.96 gain 93 29 -103.53 gain 29 94 -103.83 gain 94 29 -109.83 gain 29 95 -101.09 gain 95 29 -110.13 gain 29 96 -103.08 gain 96 29 -108.39 gain 29 97 -97.60 gain 97 29 -104.19 gain 29 98 -91.37 gain 98 29 -95.14 gain 29 99 -95.03 gain 99 29 -102.88 gain 29 100 -101.86 gain 100 29 -107.56 gain 29 101 -87.21 gain 101 29 -91.57 gain 29 102 -88.14 gain 102 29 -93.16 gain 29 103 -95.39 gain 103 29 -99.64 gain 29 104 -82.96 gain 104 29 -83.64 gain 29 105 -108.25 gain 105 29 -114.33 gain 29 106 -100.59 gain 106 29 -105.98 gain 29 107 -102.51 gain 107 29 -110.91 gain 29 108 -101.00 gain 108 29 -107.47 gain 29 109 -106.50 gain 109 29 -109.81 gain 29 110 -100.66 gain 110 29 -106.21 gain 29 111 -96.30 gain 111 29 -99.05 gain 29 112 -94.95 gain 112 29 -99.70 gain 29 113 -98.37 gain 113 29 -110.06 gain 29 114 -99.56 gain 114 29 -106.87 gain 29 115 -95.22 gain 115 29 -103.39 gain 29 116 -88.40 gain 116 29 -92.60 gain 29 117 -87.67 gain 117 29 -91.71 gain 29 118 -90.28 gain 118 29 -102.49 gain 29 119 -89.49 gain 119 29 -93.25 gain 29 120 -104.86 gain 120 29 -108.73 gain 29 121 -94.47 gain 121 29 -101.09 gain 29 122 -99.65 gain 122 29 -108.84 gain 29 123 -100.08 gain 123 29 -109.52 gain 29 124 -96.43 gain 124 29 -99.48 gain 29 125 -103.26 gain 125 29 -108.24 gain 29 126 -93.32 gain 126 29 -103.18 gain 29 127 -92.41 gain 127 29 -97.02 gain 29 128 -102.83 gain 128 29 -110.50 gain 29 129 -94.86 gain 129 29 -99.75 gain 29 130 -91.70 gain 130 29 -98.77 gain 29 131 -99.88 gain 131 29 -105.30 gain 29 132 -94.88 gain 132 29 -96.58 gain 29 133 -94.20 gain 133 29 -100.33 gain 29 134 -91.99 gain 134 29 -96.12 gain 29 135 -104.20 gain 135 29 -103.91 gain 29 136 -103.10 gain 136 29 -111.59 gain 29 137 -106.66 gain 137 29 -111.80 gain 29 138 -100.02 gain 138 29 -107.18 gain 29 139 -107.36 gain 139 29 -116.23 gain 29 140 -99.64 gain 140 29 -108.32 gain 29 141 -102.19 gain 141 29 -106.55 gain 29 142 -101.91 gain 142 29 -107.42 gain 29 143 -109.28 gain 143 29 -117.25 gain 29 144 -100.01 gain 144 29 -103.88 gain 29 145 -97.52 gain 145 29 -105.94 gain 29 146 -92.07 gain 146 29 -96.93 gain 29 147 -92.49 gain 147 29 -98.54 gain 29 148 -93.35 gain 148 29 -99.93 gain 29 149 -92.42 gain 149 29 -95.37 gain 29 150 -107.16 gain 150 29 -113.50 gain 29 151 -110.32 gain 151 29 -119.14 gain 29 152 -107.98 gain 152 29 -115.16 gain 29 153 -105.80 gain 153 29 -112.67 gain 29 154 -101.95 gain 154 29 -109.96 gain 29 155 -102.06 gain 155 29 -107.36 gain 29 156 -105.69 gain 156 29 -112.11 gain 29 157 -103.62 gain 157 29 -111.34 gain 29 158 -97.44 gain 158 29 -107.13 gain 29 159 -101.59 gain 159 29 -105.32 gain 29 160 -96.39 gain 160 29 -101.49 gain 29 161 -103.79 gain 161 29 -109.95 gain 29 162 -98.31 gain 162 29 -104.10 gain 29 163 -107.26 gain 163 29 -110.47 gain 29 164 -99.03 gain 164 29 -109.47 gain 29 165 -105.51 gain 165 29 -113.30 gain 29 166 -98.14 gain 166 29 -107.59 gain 29 167 -100.51 gain 167 29 -108.78 gain 29 168 -107.70 gain 168 29 -115.04 gain 29 169 -111.85 gain 169 29 -115.70 gain 29 170 -110.03 gain 170 29 -114.82 gain 29 171 -106.09 gain 171 29 -111.46 gain 29 172 -102.48 gain 172 29 -110.64 gain 29 173 -91.36 gain 173 29 -93.84 gain 29 174 -107.69 gain 174 29 -116.13 gain 29 175 -101.59 gain 175 29 -101.82 gain 29 176 -98.31 gain 176 29 -102.77 gain 29 177 -101.73 gain 177 29 -108.55 gain 29 178 -92.16 gain 178 29 -96.58 gain 29 179 -105.08 gain 179 29 -112.55 gain 29 180 -103.49 gain 180 29 -109.69 gain 29 181 -108.26 gain 181 29 -117.87 gain 29 182 -100.30 gain 182 29 -106.04 gain 29 183 -106.62 gain 183 29 -108.24 gain 29 184 -98.38 gain 184 29 -106.24 gain 29 185 -99.96 gain 185 29 -106.31 gain 29 186 -105.84 gain 186 29 -112.90 gain 29 187 -109.41 gain 187 29 -116.48 gain 29 188 -98.69 gain 188 29 -110.21 gain 29 189 -97.30 gain 189 29 -104.88 gain 29 190 -101.02 gain 190 29 -101.43 gain 29 191 -96.85 gain 191 29 -100.44 gain 29 192 -96.37 gain 192 29 -103.63 gain 29 193 -102.41 gain 193 29 -105.69 gain 29 194 -99.25 gain 194 29 -102.42 gain 29 195 -103.18 gain 195 29 -104.32 gain 29 196 -104.64 gain 196 29 -113.45 gain 29 197 -105.35 gain 197 29 -111.65 gain 29 198 -105.97 gain 198 29 -114.91 gain 29 199 -102.12 gain 199 29 -105.08 gain 29 200 -103.10 gain 200 29 -107.98 gain 29 201 -104.79 gain 201 29 -112.75 gain 29 202 -104.07 gain 202 29 -110.34 gain 29 203 -100.22 gain 203 29 -106.58 gain 29 204 -102.63 gain 204 29 -107.22 gain 29 205 -101.43 gain 205 29 -105.68 gain 29 206 -97.91 gain 206 29 -103.49 gain 29 207 -101.68 gain 207 29 -105.00 gain 29 208 -102.36 gain 208 29 -108.97 gain 29 209 -97.06 gain 209 29 -102.71 gain 29 210 -112.69 gain 210 29 -122.35 gain 29 211 -107.07 gain 211 29 -114.12 gain 29 212 -106.32 gain 212 29 -111.91 gain 29 213 -104.41 gain 213 29 -112.74 gain 29 214 -105.94 gain 214 29 -112.46 gain 29 215 -111.86 gain 215 29 -120.19 gain 29 216 -104.49 gain 216 29 -109.71 gain 29 217 -105.50 gain 217 29 -115.18 gain 29 218 -100.21 gain 218 29 -111.21 gain 29 219 -104.90 gain 219 29 -113.47 gain 29 220 -98.38 gain 220 29 -104.07 gain 29 221 -108.85 gain 221 29 -115.53 gain 29 222 -104.23 gain 222 29 -107.48 gain 29 223 -102.50 gain 223 29 -108.04 gain 29 224 -106.98 gain 224 29 -109.45 gain 30 31 -81.41 gain 31 30 -78.49 gain 30 32 -90.01 gain 32 30 -82.23 gain 30 33 -100.19 gain 33 30 -91.18 gain 30 34 -92.51 gain 34 30 -90.50 gain 30 35 -99.77 gain 35 30 -95.66 gain 30 36 -99.35 gain 36 30 -94.05 gain 30 37 -108.29 gain 37 30 -102.40 gain 30 38 -109.31 gain 38 30 -104.62 gain 30 39 -110.31 gain 39 30 -103.09 gain 30 40 -113.78 gain 40 30 -108.61 gain 30 41 -111.31 gain 41 30 -105.79 gain 30 42 -111.15 gain 42 30 -108.65 gain 30 43 -125.86 gain 43 30 -123.88 gain 30 44 -119.84 gain 44 30 -115.85 gain 30 45 -80.10 gain 45 30 -72.13 gain 30 46 -87.50 gain 46 30 -82.41 gain 30 47 -85.14 gain 47 30 -81.90 gain 30 48 -97.04 gain 48 30 -90.80 gain 30 49 -99.92 gain 49 30 -90.32 gain 30 50 -110.68 gain 50 30 -102.97 gain 30 51 -109.64 gain 51 30 -103.72 gain 30 52 -104.44 gain 52 30 -94.95 gain 30 53 -113.01 gain 53 30 -108.01 gain 30 54 -110.45 gain 54 30 -101.97 gain 30 55 -115.65 gain 55 30 -110.30 gain 30 56 -109.43 gain 56 30 -107.17 gain 30 57 -113.09 gain 57 30 -112.87 gain 30 58 -112.69 gain 58 30 -112.01 gain 30 59 -115.12 gain 59 30 -112.62 gain 30 60 -88.30 gain 60 30 -84.20 gain 30 61 -84.83 gain 61 30 -73.61 gain 30 62 -98.70 gain 62 30 -90.28 gain 30 63 -99.06 gain 63 30 -89.65 gain 30 64 -103.67 gain 64 30 -98.65 gain 30 65 -105.30 gain 65 30 -100.32 gain 30 66 -111.67 gain 66 30 -106.00 gain 30 67 -105.02 gain 67 30 -99.46 gain 30 68 -107.55 gain 68 30 -101.95 gain 30 69 -116.06 gain 69 30 -108.72 gain 30 70 -108.01 gain 70 30 -103.37 gain 30 71 -114.11 gain 71 30 -110.23 gain 30 72 -118.08 gain 72 30 -116.05 gain 30 73 -112.59 gain 73 30 -107.61 gain 30 74 -112.39 gain 74 30 -103.41 gain 30 75 -102.44 gain 75 30 -93.83 gain 30 76 -96.38 gain 76 30 -90.27 gain 30 77 -95.32 gain 77 30 -87.51 gain 30 78 -98.16 gain 78 30 -98.99 gain 30 79 -98.85 gain 79 30 -94.21 gain 30 80 -108.74 gain 80 30 -102.44 gain 30 81 -104.29 gain 81 30 -102.26 gain 30 82 -110.05 gain 82 30 -107.18 gain 30 83 -104.37 gain 83 30 -101.09 gain 30 84 -108.46 gain 84 30 -102.25 gain 30 85 -110.87 gain 85 30 -109.24 gain 30 86 -116.62 gain 86 30 -108.18 gain 30 87 -104.26 gain 87 30 -98.61 gain 30 88 -115.09 gain 88 30 -109.72 gain 30 89 -121.47 gain 89 30 -116.74 gain 30 90 -97.33 gain 90 30 -96.13 gain 30 91 -98.07 gain 91 30 -92.46 gain 30 92 -99.39 gain 92 30 -97.35 gain 30 93 -101.08 gain 93 30 -92.95 gain 30 94 -107.16 gain 94 30 -101.47 gain 30 95 -113.89 gain 95 30 -111.24 gain 30 96 -105.69 gain 96 30 -99.31 gain 30 97 -112.63 gain 97 30 -107.53 gain 30 98 -110.10 gain 98 30 -102.17 gain 30 99 -113.42 gain 99 30 -109.58 gain 30 100 -113.37 gain 100 30 -107.37 gain 30 101 -112.66 gain 101 30 -105.33 gain 30 102 -112.82 gain 102 30 -106.15 gain 30 103 -117.12 gain 103 30 -109.68 gain 30 104 -117.53 gain 104 30 -106.51 gain 30 105 -101.34 gain 105 30 -95.73 gain 30 106 -98.24 gain 106 30 -91.93 gain 30 107 -108.50 gain 107 30 -105.21 gain 30 108 -108.81 gain 108 30 -103.59 gain 30 109 -104.73 gain 109 30 -96.34 gain 30 110 -102.95 gain 110 30 -96.80 gain 30 111 -107.94 gain 111 30 -99.00 gain 30 112 -104.52 gain 112 30 -97.58 gain 30 113 -119.19 gain 113 30 -119.19 gain 30 114 -117.36 gain 114 30 -112.98 gain 30 115 -116.36 gain 115 30 -112.84 gain 30 116 -114.48 gain 116 30 -106.99 gain 30 117 -113.31 gain 117 30 -105.67 gain 30 118 -120.20 gain 118 30 -120.72 gain 30 119 -110.01 gain 119 30 -102.09 gain 30 120 -112.99 gain 120 30 -105.17 gain 30 121 -105.02 gain 121 30 -99.94 gain 30 122 -112.80 gain 122 30 -110.29 gain 30 123 -115.79 gain 123 30 -113.54 gain 30 124 -106.17 gain 124 30 -97.52 gain 30 125 -108.52 gain 125 30 -101.81 gain 30 126 -106.84 gain 126 30 -105.01 gain 30 127 -107.35 gain 127 30 -100.27 gain 30 128 -111.78 gain 128 30 -107.76 gain 30 129 -107.18 gain 129 30 -100.38 gain 30 130 -116.24 gain 130 30 -111.62 gain 30 131 -116.93 gain 131 30 -110.66 gain 30 132 -117.39 gain 132 30 -107.40 gain 30 133 -119.81 gain 133 30 -114.25 gain 30 134 -111.77 gain 134 30 -104.20 gain 30 135 -112.95 gain 135 30 -100.97 gain 30 136 -101.18 gain 136 30 -97.98 gain 30 137 -110.47 gain 137 30 -103.92 gain 30 138 -106.49 gain 138 30 -101.96 gain 30 139 -98.08 gain 139 30 -95.26 gain 30 140 -98.13 gain 140 30 -95.11 gain 30 141 -105.02 gain 141 30 -97.69 gain 30 142 -111.49 gain 142 30 -105.32 gain 30 143 -104.30 gain 143 30 -100.57 gain 30 144 -108.45 gain 144 30 -100.63 gain 30 145 -107.52 gain 145 30 -104.25 gain 30 146 -118.85 gain 146 30 -112.01 gain 30 147 -117.94 gain 147 30 -112.30 gain 30 148 -119.71 gain 148 30 -114.60 gain 30 149 -115.76 gain 149 30 -107.02 gain 30 150 -107.74 gain 150 30 -102.39 gain 30 151 -107.29 gain 151 30 -104.42 gain 30 152 -106.91 gain 152 30 -102.39 gain 30 153 -114.39 gain 153 30 -109.57 gain 30 154 -108.93 gain 154 30 -105.24 gain 30 155 -116.27 gain 155 30 -109.88 gain 30 156 -110.73 gain 156 30 -105.47 gain 30 157 -114.30 gain 157 30 -110.33 gain 30 158 -108.72 gain 158 30 -106.72 gain 30 159 -112.77 gain 159 30 -104.80 gain 30 160 -119.85 gain 160 30 -113.26 gain 30 161 -116.13 gain 161 30 -110.60 gain 30 162 -113.73 gain 162 30 -107.82 gain 30 163 -119.29 gain 163 30 -110.81 gain 30 164 -114.22 gain 164 30 -112.96 gain 30 165 -111.76 gain 165 30 -107.86 gain 30 166 -113.05 gain 166 30 -110.81 gain 30 167 -111.40 gain 167 30 -107.98 gain 30 168 -112.25 gain 168 30 -107.89 gain 30 169 -110.22 gain 169 30 -102.39 gain 30 170 -105.13 gain 170 30 -98.23 gain 30 171 -111.43 gain 171 30 -105.10 gain 30 172 -110.44 gain 172 30 -106.91 gain 30 173 -120.39 gain 173 30 -111.18 gain 30 174 -120.91 gain 174 30 -117.66 gain 30 175 -117.84 gain 175 30 -106.39 gain 30 176 -115.22 gain 176 30 -107.98 gain 30 177 -116.34 gain 177 30 -111.47 gain 30 178 -115.71 gain 178 30 -108.44 gain 30 179 -119.70 gain 179 30 -115.48 gain 30 180 -119.44 gain 180 30 -113.96 gain 30 181 -106.66 gain 181 30 -104.58 gain 30 182 -114.92 gain 182 30 -108.97 gain 30 183 -104.77 gain 183 30 -94.70 gain 30 184 -108.40 gain 184 30 -104.56 gain 30 185 -111.02 gain 185 30 -105.68 gain 30 186 -117.31 gain 186 30 -112.67 gain 30 187 -119.38 gain 187 30 -114.76 gain 30 188 -116.33 gain 188 30 -116.16 gain 30 189 -116.44 gain 189 30 -112.33 gain 30 190 -109.60 gain 190 30 -98.32 gain 30 191 -117.40 gain 191 30 -109.30 gain 30 192 -111.54 gain 192 30 -107.11 gain 30 193 -109.89 gain 193 30 -101.48 gain 30 194 -125.43 gain 194 30 -116.91 gain 30 195 -111.74 gain 195 30 -101.19 gain 30 196 -112.75 gain 196 30 -109.87 gain 30 197 -114.06 gain 197 30 -108.67 gain 30 198 -111.62 gain 198 30 -108.87 gain 30 199 -110.12 gain 199 30 -101.39 gain 30 200 -109.01 gain 200 30 -102.19 gain 30 201 -115.17 gain 201 30 -111.45 gain 30 202 -115.59 gain 202 30 -110.16 gain 30 203 -113.77 gain 203 30 -108.44 gain 30 204 -110.42 gain 204 30 -103.31 gain 30 205 -111.25 gain 205 30 -103.81 gain 30 206 -115.16 gain 206 30 -109.05 gain 30 207 -122.07 gain 207 30 -113.70 gain 30 208 -120.18 gain 208 30 -115.10 gain 30 209 -114.36 gain 209 30 -108.32 gain 30 210 -106.57 gain 210 30 -104.53 gain 30 211 -111.64 gain 211 30 -106.99 gain 30 212 -112.65 gain 212 30 -106.55 gain 30 213 -114.32 gain 213 30 -110.97 gain 30 214 -117.06 gain 214 30 -111.89 gain 30 215 -111.23 gain 215 30 -107.87 gain 30 216 -118.20 gain 216 30 -111.73 gain 30 217 -120.20 gain 217 30 -118.18 gain 30 218 -113.82 gain 218 30 -113.12 gain 30 219 -120.43 gain 219 30 -117.30 gain 30 220 -118.64 gain 220 30 -112.63 gain 30 221 -117.71 gain 221 30 -112.69 gain 30 222 -118.27 gain 222 30 -109.83 gain 30 223 -119.38 gain 223 30 -113.23 gain 30 224 -120.48 gain 224 30 -111.26 gain 31 32 -73.02 gain 32 31 -68.16 gain 31 33 -82.61 gain 33 31 -76.52 gain 31 34 -101.97 gain 34 31 -102.87 gain 31 35 -95.09 gain 35 31 -93.90 gain 31 36 -96.48 gain 36 31 -94.10 gain 31 37 -97.71 gain 37 31 -94.74 gain 31 38 -104.10 gain 38 31 -102.33 gain 31 39 -102.39 gain 39 31 -98.08 gain 31 40 -103.31 gain 40 31 -101.07 gain 31 41 -109.70 gain 41 31 -107.10 gain 31 42 -108.95 gain 42 31 -109.37 gain 31 43 -104.10 gain 43 31 -105.04 gain 31 44 -104.14 gain 44 31 -103.07 gain 31 45 -84.13 gain 45 31 -79.08 gain 31 46 -78.91 gain 46 31 -76.74 gain 31 47 -78.20 gain 47 31 -77.88 gain 31 48 -89.22 gain 48 31 -85.90 gain 31 49 -97.28 gain 49 31 -90.60 gain 31 50 -90.25 gain 50 31 -85.47 gain 31 51 -100.22 gain 51 31 -97.22 gain 31 52 -99.60 gain 52 31 -93.03 gain 31 53 -100.47 gain 53 31 -98.39 gain 31 54 -104.16 gain 54 31 -98.60 gain 31 55 -109.95 gain 55 31 -107.52 gain 31 56 -106.61 gain 56 31 -107.27 gain 31 57 -106.14 gain 57 31 -108.84 gain 31 58 -115.14 gain 58 31 -117.38 gain 31 59 -103.32 gain 59 31 -103.73 gain 31 60 -86.69 gain 60 31 -85.51 gain 31 61 -87.02 gain 61 31 -78.72 gain 31 62 -86.93 gain 62 31 -81.43 gain 31 63 -91.70 gain 63 31 -85.21 gain 31 64 -94.73 gain 64 31 -92.63 gain 31 65 -101.24 gain 65 31 -99.18 gain 31 66 -95.44 gain 66 31 -92.68 gain 31 67 -96.09 gain 67 31 -93.45 gain 31 68 -100.82 gain 68 31 -98.14 gain 31 69 -100.22 gain 69 31 -95.80 gain 31 70 -112.18 gain 70 31 -110.46 gain 31 71 -110.71 gain 71 31 -109.75 gain 31 72 -109.92 gain 72 31 -110.81 gain 31 73 -117.94 gain 73 31 -115.88 gain 31 74 -112.66 gain 74 31 -106.59 gain 31 75 -89.36 gain 75 31 -83.68 gain 31 76 -91.80 gain 76 31 -88.61 gain 31 77 -99.07 gain 77 31 -94.18 gain 31 78 -93.11 gain 78 31 -96.86 gain 31 79 -102.63 gain 79 31 -100.92 gain 31 80 -106.12 gain 80 31 -102.74 gain 31 81 -106.07 gain 81 31 -106.96 gain 31 82 -101.93 gain 82 31 -101.99 gain 31 83 -106.81 gain 83 31 -106.44 gain 31 84 -104.45 gain 84 31 -101.16 gain 31 85 -101.03 gain 85 31 -102.32 gain 31 86 -108.61 gain 86 31 -103.09 gain 31 87 -118.50 gain 87 31 -115.77 gain 31 88 -106.93 gain 88 31 -104.48 gain 31 89 -112.64 gain 89 31 -110.83 gain 31 90 -91.80 gain 90 31 -93.52 gain 31 91 -102.63 gain 91 31 -99.94 gain 31 92 -103.52 gain 92 31 -104.40 gain 31 93 -99.78 gain 93 31 -94.57 gain 31 94 -100.05 gain 94 31 -97.28 gain 31 95 -100.79 gain 95 31 -101.05 gain 31 96 -103.27 gain 96 31 -99.81 gain 31 97 -105.37 gain 97 31 -103.18 gain 31 98 -107.04 gain 98 31 -102.03 gain 31 99 -106.08 gain 99 31 -105.16 gain 31 100 -116.43 gain 100 31 -113.35 gain 31 101 -101.62 gain 101 31 -97.20 gain 31 102 -105.24 gain 102 31 -101.49 gain 31 103 -114.59 gain 103 31 -110.06 gain 31 104 -106.46 gain 104 31 -98.37 gain 31 105 -99.48 gain 105 31 -96.78 gain 31 106 -98.54 gain 106 31 -95.15 gain 31 107 -100.47 gain 107 31 -100.10 gain 31 108 -106.41 gain 108 31 -104.10 gain 31 109 -103.17 gain 109 31 -97.71 gain 31 110 -103.58 gain 110 31 -100.35 gain 31 111 -105.23 gain 111 31 -99.21 gain 31 112 -105.37 gain 112 31 -101.35 gain 31 113 -105.71 gain 113 31 -108.62 gain 31 114 -115.99 gain 114 31 -114.53 gain 31 115 -109.83 gain 115 31 -109.23 gain 31 116 -109.96 gain 116 31 -105.39 gain 31 117 -112.56 gain 117 31 -107.83 gain 31 118 -103.81 gain 118 31 -107.25 gain 31 119 -111.62 gain 119 31 -106.62 gain 31 120 -101.30 gain 120 31 -96.40 gain 31 121 -104.40 gain 121 31 -102.24 gain 31 122 -105.38 gain 122 31 -105.79 gain 31 123 -103.87 gain 123 31 -104.54 gain 31 124 -93.88 gain 124 31 -88.15 gain 31 125 -101.89 gain 125 31 -98.09 gain 31 126 -100.91 gain 126 31 -102.00 gain 31 127 -101.27 gain 127 31 -97.11 gain 31 128 -107.56 gain 128 31 -106.46 gain 31 129 -104.20 gain 129 31 -100.31 gain 31 130 -107.79 gain 130 31 -106.08 gain 31 131 -109.64 gain 131 31 -106.29 gain 31 132 -110.98 gain 132 31 -103.91 gain 31 133 -115.67 gain 133 31 -113.03 gain 31 134 -110.58 gain 134 31 -105.93 gain 31 135 -106.80 gain 135 31 -97.74 gain 31 136 -110.99 gain 136 31 -110.71 gain 31 137 -99.98 gain 137 31 -96.35 gain 31 138 -101.00 gain 138 31 -99.38 gain 31 139 -102.11 gain 139 31 -102.21 gain 31 140 -103.90 gain 140 31 -103.80 gain 31 141 -103.77 gain 141 31 -99.36 gain 31 142 -103.37 gain 142 31 -100.12 gain 31 143 -106.36 gain 143 31 -105.55 gain 31 144 -101.60 gain 144 31 -96.69 gain 31 145 -113.58 gain 145 31 -113.22 gain 31 146 -115.34 gain 146 31 -111.42 gain 31 147 -117.47 gain 147 31 -114.75 gain 31 148 -107.22 gain 148 31 -105.02 gain 31 149 -120.51 gain 149 31 -114.69 gain 31 150 -102.98 gain 150 31 -100.54 gain 31 151 -111.92 gain 151 31 -111.96 gain 31 152 -101.98 gain 152 31 -100.38 gain 31 153 -106.13 gain 153 31 -104.23 gain 31 154 -106.89 gain 154 31 -106.12 gain 31 155 -112.65 gain 155 31 -109.17 gain 31 156 -103.37 gain 156 31 -101.02 gain 31 157 -106.16 gain 157 31 -105.11 gain 31 158 -110.31 gain 158 31 -111.23 gain 31 159 -105.23 gain 159 31 -100.18 gain 31 160 -112.68 gain 160 31 -109.01 gain 31 161 -109.49 gain 161 31 -106.88 gain 31 162 -109.30 gain 162 31 -106.31 gain 31 163 -113.30 gain 163 31 -107.74 gain 31 164 -108.61 gain 164 31 -110.28 gain 31 165 -105.72 gain 165 31 -104.73 gain 31 166 -109.39 gain 166 31 -110.07 gain 31 167 -102.37 gain 167 31 -101.87 gain 31 168 -106.57 gain 168 31 -105.14 gain 31 169 -106.07 gain 169 31 -101.15 gain 31 170 -104.67 gain 170 31 -100.69 gain 31 171 -105.14 gain 171 31 -101.73 gain 31 172 -112.11 gain 172 31 -111.49 gain 31 173 -107.75 gain 173 31 -101.46 gain 31 174 -111.61 gain 174 31 -111.28 gain 31 175 -116.08 gain 175 31 -107.55 gain 31 176 -108.93 gain 176 31 -104.61 gain 31 177 -113.23 gain 177 31 -111.27 gain 31 178 -112.80 gain 178 31 -108.45 gain 31 179 -115.29 gain 179 31 -113.99 gain 31 180 -106.62 gain 180 31 -104.06 gain 31 181 -114.03 gain 181 31 -114.86 gain 31 182 -109.70 gain 182 31 -106.67 gain 31 183 -106.39 gain 183 31 -99.24 gain 31 184 -108.54 gain 184 31 -107.62 gain 31 185 -108.78 gain 185 31 -106.36 gain 31 186 -103.85 gain 186 31 -102.13 gain 31 187 -113.61 gain 187 31 -111.92 gain 31 188 -110.05 gain 188 31 -112.79 gain 31 189 -116.59 gain 189 31 -115.40 gain 31 190 -111.54 gain 190 31 -103.18 gain 31 191 -111.89 gain 191 31 -106.70 gain 31 192 -113.44 gain 192 31 -111.92 gain 31 193 -116.19 gain 193 31 -110.70 gain 31 194 -110.73 gain 194 31 -105.12 gain 31 195 -111.77 gain 195 31 -104.14 gain 31 196 -102.83 gain 196 31 -102.87 gain 31 197 -106.38 gain 197 31 -103.91 gain 31 198 -119.46 gain 198 31 -119.63 gain 31 199 -115.52 gain 199 31 -109.71 gain 31 200 -113.73 gain 200 31 -109.83 gain 31 201 -108.63 gain 201 31 -107.82 gain 31 202 -109.08 gain 202 31 -106.57 gain 31 203 -111.97 gain 203 31 -109.56 gain 31 204 -111.27 gain 204 31 -107.08 gain 31 205 -114.39 gain 205 31 -109.87 gain 31 206 -111.92 gain 206 31 -108.71 gain 31 207 -112.99 gain 207 31 -107.54 gain 31 208 -113.96 gain 208 31 -111.80 gain 31 209 -117.38 gain 209 31 -114.26 gain 31 210 -110.04 gain 210 31 -110.92 gain 31 211 -110.60 gain 211 31 -108.88 gain 31 212 -115.03 gain 212 31 -111.85 gain 31 213 -108.00 gain 213 31 -107.57 gain 31 214 -107.07 gain 214 31 -104.81 gain 31 215 -119.31 gain 215 31 -118.87 gain 31 216 -115.68 gain 216 31 -112.14 gain 31 217 -116.37 gain 217 31 -117.27 gain 31 218 -108.95 gain 218 31 -111.17 gain 31 219 -109.49 gain 219 31 -109.28 gain 31 220 -110.99 gain 220 31 -107.90 gain 31 221 -119.17 gain 221 31 -117.07 gain 31 222 -107.20 gain 222 31 -101.68 gain 31 223 -110.94 gain 223 31 -107.71 gain 31 224 -119.14 gain 224 31 -112.83 gain 32 33 -73.72 gain 33 32 -72.49 gain 32 34 -83.69 gain 34 32 -89.45 gain 32 35 -84.66 gain 35 32 -88.33 gain 32 36 -87.34 gain 36 32 -89.82 gain 32 37 -93.16 gain 37 32 -95.05 gain 32 38 -90.71 gain 38 32 -93.80 gain 32 39 -104.24 gain 39 32 -104.80 gain 32 40 -101.55 gain 40 32 -104.17 gain 32 41 -101.90 gain 41 32 -104.16 gain 32 42 -97.58 gain 42 32 -102.86 gain 32 43 -102.26 gain 43 32 -108.06 gain 32 44 -113.06 gain 44 32 -116.85 gain 32 45 -84.51 gain 45 32 -84.32 gain 32 46 -79.85 gain 46 32 -82.54 gain 32 47 -75.14 gain 47 32 -79.68 gain 32 48 -77.47 gain 48 32 -79.01 gain 32 49 -82.14 gain 49 32 -80.32 gain 32 50 -93.79 gain 50 32 -93.86 gain 32 51 -90.62 gain 51 32 -92.48 gain 32 52 -87.28 gain 52 32 -85.57 gain 32 53 -96.25 gain 53 32 -99.03 gain 32 54 -95.44 gain 54 32 -94.74 gain 32 55 -95.18 gain 55 32 -97.60 gain 32 56 -94.65 gain 56 32 -100.17 gain 32 57 -94.83 gain 57 32 -102.39 gain 32 58 -104.61 gain 58 32 -111.72 gain 32 59 -106.20 gain 59 32 -111.47 gain 32 60 -92.98 gain 60 32 -96.66 gain 32 61 -81.63 gain 61 32 -78.19 gain 32 62 -78.31 gain 62 32 -77.68 gain 32 63 -88.57 gain 63 32 -86.95 gain 32 64 -86.54 gain 64 32 -89.30 gain 32 65 -83.97 gain 65 32 -86.77 gain 32 66 -95.45 gain 66 32 -97.56 gain 32 67 -99.83 gain 67 32 -102.06 gain 32 68 -94.83 gain 68 32 -97.01 gain 32 69 -99.19 gain 69 32 -99.64 gain 32 70 -94.04 gain 70 32 -97.18 gain 32 71 -100.13 gain 71 32 -104.03 gain 32 72 -107.13 gain 72 32 -112.88 gain 32 73 -96.93 gain 73 32 -99.73 gain 32 74 -102.89 gain 74 32 -101.69 gain 32 75 -83.24 gain 75 32 -82.41 gain 32 76 -85.35 gain 76 32 -87.02 gain 32 77 -88.54 gain 77 32 -88.51 gain 32 78 -84.42 gain 78 32 -93.03 gain 32 79 -91.11 gain 79 32 -94.26 gain 32 80 -95.61 gain 80 32 -97.09 gain 32 81 -95.93 gain 81 32 -101.69 gain 32 82 -94.13 gain 82 32 -99.05 gain 32 83 -98.40 gain 83 32 -102.90 gain 32 84 -98.65 gain 84 32 -100.22 gain 32 85 -105.54 gain 85 32 -111.69 gain 32 86 -101.72 gain 86 32 -101.06 gain 32 87 -108.49 gain 87 32 -110.62 gain 32 88 -108.21 gain 88 32 -110.62 gain 32 89 -103.69 gain 89 32 -106.74 gain 32 90 -86.54 gain 90 32 -93.12 gain 32 91 -91.89 gain 91 32 -94.06 gain 32 92 -89.37 gain 92 32 -95.11 gain 32 93 -89.09 gain 93 32 -88.75 gain 32 94 -90.32 gain 94 32 -92.41 gain 32 95 -94.94 gain 95 32 -100.07 gain 32 96 -98.98 gain 96 32 -100.39 gain 32 97 -92.93 gain 97 32 -95.60 gain 32 98 -95.50 gain 98 32 -95.35 gain 32 99 -105.63 gain 99 32 -109.57 gain 32 100 -102.46 gain 100 32 -104.25 gain 32 101 -100.21 gain 101 32 -100.65 gain 32 102 -102.00 gain 102 32 -103.11 gain 32 103 -100.24 gain 103 32 -100.58 gain 32 104 -103.28 gain 104 32 -100.05 gain 32 105 -99.27 gain 105 32 -101.44 gain 32 106 -89.99 gain 106 32 -91.47 gain 32 107 -92.60 gain 107 32 -97.09 gain 32 108 -98.64 gain 108 32 -101.20 gain 32 109 -95.83 gain 109 32 -95.23 gain 32 110 -91.45 gain 110 32 -93.09 gain 32 111 -99.61 gain 111 32 -98.44 gain 32 112 -104.26 gain 112 32 -105.10 gain 32 113 -95.59 gain 113 32 -103.37 gain 32 114 -103.48 gain 114 32 -106.89 gain 32 115 -95.31 gain 115 32 -99.58 gain 32 116 -105.27 gain 116 32 -105.56 gain 32 117 -107.51 gain 117 32 -107.64 gain 32 118 -108.97 gain 118 32 -117.28 gain 32 119 -104.31 gain 119 32 -104.16 gain 32 120 -103.72 gain 120 32 -103.68 gain 32 121 -94.65 gain 121 32 -97.35 gain 32 122 -97.99 gain 122 32 -103.26 gain 32 123 -94.17 gain 123 32 -99.70 gain 32 124 -90.16 gain 124 32 -89.30 gain 32 125 -97.60 gain 125 32 -98.66 gain 32 126 -100.44 gain 126 32 -106.39 gain 32 127 -100.92 gain 127 32 -101.62 gain 32 128 -102.11 gain 128 32 -105.87 gain 32 129 -100.73 gain 129 32 -101.70 gain 32 130 -100.78 gain 130 32 -103.94 gain 32 131 -99.83 gain 131 32 -101.35 gain 32 132 -111.29 gain 132 32 -109.08 gain 32 133 -102.87 gain 133 32 -105.09 gain 32 134 -111.07 gain 134 32 -111.29 gain 32 135 -96.25 gain 135 32 -92.05 gain 32 136 -96.95 gain 136 32 -101.52 gain 32 137 -95.34 gain 137 32 -96.58 gain 32 138 -95.74 gain 138 32 -98.99 gain 32 139 -91.48 gain 139 32 -96.44 gain 32 140 -103.03 gain 140 32 -107.80 gain 32 141 -93.75 gain 141 32 -94.20 gain 32 142 -104.11 gain 142 32 -105.71 gain 32 143 -97.72 gain 143 32 -101.77 gain 32 144 -102.21 gain 144 32 -102.16 gain 32 145 -105.03 gain 145 32 -109.54 gain 32 146 -100.13 gain 146 32 -101.08 gain 32 147 -108.78 gain 147 32 -110.92 gain 32 148 -110.98 gain 148 32 -113.64 gain 32 149 -115.53 gain 149 32 -114.57 gain 32 150 -101.91 gain 150 32 -104.33 gain 32 151 -100.84 gain 151 32 -105.74 gain 32 152 -98.30 gain 152 32 -101.57 gain 32 153 -100.86 gain 153 32 -103.82 gain 32 154 -98.29 gain 154 32 -102.38 gain 32 155 -96.53 gain 155 32 -97.92 gain 32 156 -106.11 gain 156 32 -108.62 gain 32 157 -99.21 gain 157 32 -103.02 gain 32 158 -106.59 gain 158 32 -112.37 gain 32 159 -104.02 gain 159 32 -103.83 gain 32 160 -100.61 gain 160 32 -101.80 gain 32 161 -106.95 gain 161 32 -109.20 gain 32 162 -107.12 gain 162 32 -108.99 gain 32 163 -106.57 gain 163 32 -105.87 gain 32 164 -110.36 gain 164 32 -116.89 gain 32 165 -100.50 gain 165 32 -104.39 gain 32 166 -101.50 gain 166 32 -107.04 gain 32 167 -101.43 gain 167 32 -105.79 gain 32 168 -99.78 gain 168 32 -103.21 gain 32 169 -106.13 gain 169 32 -106.07 gain 32 170 -101.46 gain 170 32 -102.34 gain 32 171 -101.75 gain 171 32 -103.20 gain 32 172 -106.06 gain 172 32 -110.31 gain 32 173 -104.66 gain 173 32 -103.23 gain 32 174 -105.79 gain 174 32 -110.32 gain 32 175 -101.61 gain 175 32 -97.93 gain 32 176 -111.94 gain 176 32 -112.49 gain 32 177 -108.35 gain 177 32 -111.26 gain 32 178 -108.61 gain 178 32 -109.13 gain 32 179 -102.52 gain 179 32 -106.08 gain 32 180 -104.36 gain 180 32 -106.65 gain 32 181 -104.27 gain 181 32 -109.96 gain 32 182 -100.88 gain 182 32 -102.71 gain 32 183 -102.45 gain 183 32 -100.17 gain 32 184 -100.97 gain 184 32 -104.91 gain 32 185 -103.30 gain 185 32 -105.74 gain 32 186 -100.43 gain 186 32 -103.57 gain 32 187 -104.48 gain 187 32 -107.65 gain 32 188 -98.99 gain 188 32 -106.60 gain 32 189 -97.12 gain 189 32 -100.79 gain 32 190 -106.33 gain 190 32 -102.84 gain 32 191 -107.91 gain 191 32 -107.58 gain 32 192 -106.30 gain 192 32 -109.65 gain 32 193 -105.32 gain 193 32 -104.69 gain 32 194 -108.06 gain 194 32 -107.32 gain 32 195 -109.00 gain 195 32 -106.23 gain 32 196 -104.18 gain 196 32 -109.08 gain 32 197 -103.39 gain 197 32 -105.78 gain 32 198 -104.81 gain 198 32 -109.84 gain 32 199 -108.06 gain 199 32 -107.11 gain 32 200 -106.91 gain 200 32 -107.87 gain 32 201 -98.21 gain 201 32 -102.27 gain 32 202 -112.20 gain 202 32 -114.55 gain 32 203 -110.76 gain 203 32 -113.21 gain 32 204 -108.40 gain 204 32 -109.07 gain 32 205 -105.20 gain 205 32 -105.54 gain 32 206 -105.98 gain 206 32 -107.64 gain 32 207 -107.75 gain 207 32 -107.16 gain 32 208 -107.75 gain 208 32 -110.45 gain 32 209 -106.28 gain 209 32 -108.03 gain 32 210 -100.39 gain 210 32 -106.14 gain 32 211 -107.10 gain 211 32 -110.24 gain 32 212 -108.95 gain 212 32 -110.63 gain 32 213 -107.40 gain 213 32 -111.82 gain 32 214 -100.92 gain 214 32 -103.53 gain 32 215 -105.20 gain 215 32 -109.62 gain 32 216 -102.32 gain 216 32 -103.64 gain 32 217 -115.71 gain 217 32 -121.48 gain 32 218 -104.89 gain 218 32 -111.98 gain 32 219 -109.04 gain 219 32 -113.70 gain 32 220 -110.16 gain 220 32 -111.93 gain 32 221 -113.75 gain 221 32 -116.51 gain 32 222 -112.27 gain 222 32 -111.61 gain 32 223 -116.23 gain 223 32 -117.86 gain 32 224 -105.85 gain 224 32 -104.41 gain 33 34 -65.76 gain 34 33 -72.75 gain 33 35 -77.38 gain 35 33 -82.28 gain 33 36 -83.85 gain 36 33 -87.57 gain 33 37 -88.60 gain 37 33 -91.71 gain 33 38 -98.09 gain 38 33 -102.42 gain 33 39 -100.19 gain 39 33 -101.97 gain 33 40 -95.10 gain 40 33 -98.95 gain 33 41 -96.83 gain 41 33 -100.32 gain 33 42 -101.10 gain 42 33 -107.61 gain 33 43 -90.47 gain 43 33 -97.50 gain 33 44 -107.88 gain 44 33 -112.90 gain 33 45 -89.84 gain 45 33 -90.88 gain 33 46 -80.52 gain 46 33 -84.43 gain 33 47 -84.27 gain 47 33 -90.04 gain 33 48 -67.50 gain 48 33 -70.27 gain 33 49 -78.66 gain 49 33 -78.07 gain 33 50 -78.20 gain 50 33 -79.50 gain 33 51 -91.68 gain 51 33 -94.77 gain 33 52 -87.79 gain 52 33 -87.30 gain 33 53 -97.10 gain 53 33 -101.11 gain 33 54 -99.71 gain 54 33 -100.24 gain 33 55 -98.72 gain 55 33 -102.37 gain 33 56 -103.62 gain 56 33 -110.37 gain 33 57 -93.99 gain 57 33 -102.77 gain 33 58 -106.28 gain 58 33 -114.61 gain 33 59 -101.79 gain 59 33 -108.29 gain 33 60 -87.30 gain 60 33 -92.21 gain 33 61 -79.60 gain 61 33 -77.40 gain 33 62 -84.34 gain 62 33 -84.93 gain 33 63 -77.72 gain 63 33 -77.32 gain 33 64 -83.71 gain 64 33 -87.69 gain 33 65 -83.58 gain 65 33 -87.60 gain 33 66 -87.49 gain 66 33 -90.83 gain 33 67 -90.10 gain 67 33 -93.56 gain 33 68 -94.67 gain 68 33 -98.08 gain 33 69 -96.49 gain 69 33 -98.16 gain 33 70 -93.35 gain 70 33 -97.72 gain 33 71 -93.02 gain 71 33 -98.14 gain 33 72 -99.67 gain 72 33 -106.64 gain 33 73 -105.62 gain 73 33 -109.65 gain 33 74 -100.63 gain 74 33 -100.65 gain 33 75 -87.15 gain 75 33 -87.56 gain 33 76 -87.16 gain 76 33 -90.06 gain 33 77 -96.11 gain 77 33 -97.31 gain 33 78 -88.19 gain 78 33 -98.03 gain 33 79 -84.44 gain 79 33 -88.82 gain 33 80 -87.09 gain 80 33 -89.79 gain 33 81 -84.63 gain 81 33 -91.62 gain 33 82 -89.46 gain 82 33 -95.60 gain 33 83 -94.29 gain 83 33 -100.01 gain 33 84 -98.26 gain 84 33 -101.05 gain 33 85 -104.78 gain 85 33 -112.16 gain 33 86 -101.33 gain 86 33 -101.89 gain 33 87 -97.25 gain 87 33 -100.61 gain 33 88 -103.32 gain 88 33 -106.96 gain 33 89 -105.44 gain 89 33 -109.72 gain 33 90 -97.10 gain 90 33 -104.91 gain 33 91 -94.58 gain 91 33 -97.98 gain 33 92 -88.96 gain 92 33 -95.93 gain 33 93 -88.49 gain 93 33 -89.37 gain 33 94 -91.19 gain 94 33 -94.51 gain 33 95 -87.55 gain 95 33 -93.91 gain 33 96 -88.43 gain 96 33 -91.06 gain 33 97 -90.43 gain 97 33 -94.34 gain 33 98 -90.90 gain 98 33 -91.98 gain 33 99 -98.40 gain 99 33 -103.57 gain 33 100 -100.40 gain 100 33 -103.41 gain 33 101 -95.22 gain 101 33 -96.89 gain 33 102 -97.08 gain 102 33 -99.42 gain 33 103 -107.38 gain 103 33 -108.95 gain 33 104 -103.43 gain 104 33 -101.43 gain 33 105 -99.28 gain 105 33 -102.68 gain 33 106 -97.25 gain 106 33 -99.95 gain 33 107 -96.07 gain 107 33 -101.79 gain 33 108 -97.65 gain 108 33 -101.43 gain 33 109 -90.72 gain 109 33 -91.34 gain 33 110 -83.98 gain 110 33 -86.85 gain 33 111 -96.32 gain 111 33 -96.38 gain 33 112 -94.34 gain 112 33 -96.40 gain 33 113 -102.68 gain 113 33 -111.68 gain 33 114 -86.92 gain 114 33 -91.55 gain 33 115 -89.52 gain 115 33 -95.01 gain 33 116 -107.31 gain 116 33 -108.83 gain 33 117 -110.10 gain 117 33 -111.46 gain 33 118 -105.21 gain 118 33 -114.74 gain 33 119 -107.24 gain 119 33 -108.33 gain 33 120 -97.56 gain 120 33 -98.75 gain 33 121 -93.31 gain 121 33 -97.24 gain 33 122 -101.66 gain 122 33 -108.16 gain 33 123 -97.31 gain 123 33 -104.07 gain 33 124 -97.08 gain 124 33 -97.44 gain 33 125 -98.02 gain 125 33 -100.32 gain 33 126 -97.71 gain 126 33 -104.89 gain 33 127 -93.75 gain 127 33 -95.68 gain 33 128 -92.07 gain 128 33 -97.06 gain 33 129 -98.57 gain 129 33 -100.77 gain 33 130 -98.62 gain 130 33 -103.00 gain 33 131 -101.38 gain 131 33 -104.12 gain 33 132 -100.78 gain 132 33 -99.80 gain 33 133 -110.43 gain 133 33 -113.88 gain 33 134 -98.86 gain 134 33 -100.31 gain 33 135 -95.27 gain 135 33 -92.30 gain 33 136 -100.06 gain 136 33 -105.86 gain 33 137 -98.48 gain 137 33 -100.94 gain 33 138 -100.23 gain 138 33 -104.71 gain 33 139 -97.51 gain 139 33 -103.69 gain 33 140 -92.64 gain 140 33 -98.63 gain 33 141 -100.06 gain 141 33 -101.74 gain 33 142 -106.24 gain 142 33 -109.08 gain 33 143 -97.44 gain 143 33 -102.72 gain 33 144 -115.25 gain 144 33 -116.43 gain 33 145 -103.64 gain 145 33 -109.37 gain 33 146 -102.77 gain 146 33 -104.94 gain 33 147 -102.81 gain 147 33 -106.18 gain 33 148 -103.97 gain 148 33 -107.86 gain 33 149 -100.46 gain 149 33 -100.73 gain 33 150 -91.92 gain 150 33 -95.57 gain 33 151 -98.32 gain 151 33 -104.46 gain 33 152 -103.82 gain 152 33 -108.31 gain 33 153 -103.20 gain 153 33 -107.39 gain 33 154 -94.88 gain 154 33 -100.20 gain 33 155 -98.98 gain 155 33 -101.59 gain 33 156 -93.39 gain 156 33 -97.13 gain 33 157 -102.69 gain 157 33 -107.72 gain 33 158 -101.86 gain 158 33 -108.86 gain 33 159 -97.63 gain 159 33 -98.68 gain 33 160 -104.06 gain 160 33 -106.49 gain 33 161 -97.85 gain 161 33 -101.33 gain 33 162 -109.64 gain 162 33 -112.75 gain 33 163 -99.03 gain 163 33 -99.56 gain 33 164 -108.51 gain 164 33 -116.26 gain 33 165 -98.52 gain 165 33 -103.63 gain 33 166 -94.45 gain 166 33 -101.22 gain 33 167 -100.46 gain 167 33 -106.05 gain 33 168 -106.48 gain 168 33 -111.14 gain 33 169 -103.22 gain 169 33 -104.39 gain 33 170 -98.20 gain 170 33 -100.31 gain 33 171 -100.96 gain 171 33 -103.64 gain 33 172 -102.28 gain 172 33 -107.75 gain 33 173 -97.80 gain 173 33 -97.59 gain 33 174 -103.97 gain 174 33 -109.72 gain 33 175 -102.50 gain 175 33 -100.05 gain 33 176 -103.54 gain 176 33 -105.32 gain 33 177 -108.00 gain 177 33 -112.14 gain 33 178 -107.09 gain 178 33 -108.83 gain 33 179 -108.68 gain 179 33 -113.47 gain 33 180 -101.97 gain 180 33 -105.49 gain 33 181 -107.32 gain 181 33 -114.25 gain 33 182 -105.94 gain 182 33 -109.00 gain 33 183 -105.37 gain 183 33 -104.31 gain 33 184 -103.28 gain 184 33 -108.45 gain 33 185 -99.74 gain 185 33 -103.41 gain 33 186 -100.72 gain 186 33 -105.09 gain 33 187 -100.00 gain 187 33 -104.39 gain 33 188 -106.17 gain 188 33 -115.01 gain 33 189 -106.54 gain 189 33 -111.43 gain 33 190 -108.40 gain 190 33 -106.13 gain 33 191 -108.56 gain 191 33 -109.46 gain 33 192 -101.85 gain 192 33 -106.42 gain 33 193 -106.99 gain 193 33 -107.59 gain 33 194 -106.11 gain 194 33 -106.60 gain 33 195 -106.29 gain 195 33 -104.75 gain 33 196 -102.58 gain 196 33 -108.70 gain 33 197 -110.96 gain 197 33 -114.58 gain 33 198 -95.36 gain 198 33 -101.62 gain 33 199 -107.12 gain 199 33 -107.39 gain 33 200 -103.92 gain 200 33 -106.11 gain 33 201 -104.48 gain 201 33 -109.76 gain 33 202 -110.63 gain 202 33 -114.21 gain 33 203 -107.82 gain 203 33 -111.50 gain 33 204 -104.26 gain 204 33 -106.15 gain 33 205 -104.19 gain 205 33 -105.75 gain 33 206 -107.90 gain 206 33 -110.79 gain 33 207 -103.31 gain 207 33 -103.94 gain 33 208 -108.74 gain 208 33 -112.67 gain 33 209 -109.50 gain 209 33 -112.47 gain 33 210 -100.91 gain 210 33 -107.88 gain 33 211 -102.28 gain 211 33 -106.65 gain 33 212 -96.33 gain 212 33 -99.24 gain 33 213 -109.52 gain 213 33 -115.17 gain 33 214 -97.19 gain 214 33 -101.03 gain 33 215 -103.60 gain 215 33 -109.24 gain 33 216 -109.11 gain 216 33 -111.65 gain 33 217 -102.27 gain 217 33 -109.26 gain 33 218 -107.45 gain 218 33 -115.76 gain 33 219 -97.61 gain 219 33 -103.49 gain 33 220 -101.83 gain 220 33 -104.83 gain 33 221 -106.29 gain 221 33 -110.28 gain 33 222 -111.04 gain 222 33 -111.60 gain 33 223 -105.63 gain 223 33 -108.48 gain 33 224 -105.31 gain 224 33 -105.10 gain 34 35 -83.00 gain 35 34 -80.91 gain 34 36 -90.12 gain 36 34 -86.85 gain 34 37 -93.50 gain 37 34 -89.62 gain 34 38 -101.40 gain 38 34 -98.74 gain 34 39 -105.00 gain 39 34 -99.80 gain 34 40 -97.37 gain 40 34 -94.22 gain 34 41 -102.33 gain 41 34 -98.83 gain 34 42 -105.27 gain 42 34 -104.79 gain 34 43 -106.60 gain 43 34 -106.63 gain 34 44 -109.72 gain 44 34 -107.75 gain 34 45 -101.79 gain 45 34 -95.84 gain 34 46 -95.11 gain 46 34 -92.03 gain 34 47 -89.60 gain 47 34 -88.37 gain 34 48 -80.40 gain 48 34 -76.18 gain 34 49 -85.54 gain 49 34 -77.96 gain 34 50 -86.93 gain 50 34 -81.25 gain 34 51 -94.31 gain 51 34 -90.41 gain 34 52 -95.52 gain 52 34 -88.05 gain 34 53 -94.66 gain 53 34 -91.68 gain 34 54 -95.21 gain 54 34 -88.74 gain 34 55 -101.42 gain 55 34 -98.08 gain 34 56 -106.74 gain 56 34 -106.50 gain 34 57 -106.04 gain 57 34 -107.84 gain 34 58 -109.68 gain 58 34 -111.03 gain 34 59 -114.31 gain 59 34 -113.82 gain 34 60 -96.59 gain 60 34 -94.51 gain 34 61 -97.87 gain 61 34 -88.67 gain 34 62 -89.25 gain 62 34 -82.85 gain 34 63 -95.84 gain 63 34 -88.45 gain 34 64 -86.34 gain 64 34 -83.34 gain 34 65 -90.60 gain 65 34 -87.64 gain 34 66 -89.68 gain 66 34 -86.02 gain 34 67 -97.44 gain 67 34 -93.90 gain 34 68 -87.79 gain 68 34 -84.21 gain 34 69 -98.19 gain 69 34 -92.88 gain 34 70 -102.19 gain 70 34 -99.57 gain 34 71 -112.12 gain 71 34 -110.26 gain 34 72 -107.02 gain 72 34 -107.01 gain 34 73 -106.55 gain 73 34 -103.59 gain 34 74 -107.59 gain 74 34 -100.62 gain 34 75 -97.92 gain 75 34 -91.34 gain 34 76 -96.64 gain 76 34 -92.55 gain 34 77 -91.96 gain 77 34 -86.18 gain 34 78 -86.34 gain 78 34 -89.18 gain 34 79 -93.12 gain 79 34 -90.51 gain 34 80 -97.07 gain 80 34 -92.79 gain 34 81 -102.98 gain 81 34 -102.98 gain 34 82 -102.02 gain 82 34 -101.18 gain 34 83 -88.51 gain 83 34 -87.25 gain 34 84 -102.94 gain 84 34 -98.75 gain 34 85 -101.96 gain 85 34 -102.35 gain 34 86 -116.89 gain 86 34 -110.46 gain 34 87 -106.40 gain 87 34 -102.78 gain 34 88 -111.12 gain 88 34 -107.77 gain 34 89 -108.62 gain 89 34 -105.91 gain 34 90 -103.04 gain 90 34 -103.86 gain 34 91 -99.65 gain 91 34 -96.06 gain 34 92 -96.37 gain 92 34 -96.35 gain 34 93 -93.65 gain 93 34 -87.54 gain 34 94 -97.99 gain 94 34 -94.31 gain 34 95 -99.63 gain 95 34 -99.00 gain 34 96 -95.70 gain 96 34 -91.34 gain 34 97 -98.74 gain 97 34 -95.65 gain 34 98 -103.18 gain 98 34 -97.27 gain 34 99 -98.58 gain 99 34 -96.77 gain 34 100 -105.06 gain 100 34 -101.09 gain 34 101 -111.53 gain 101 34 -106.22 gain 34 102 -99.94 gain 102 34 -95.28 gain 34 103 -106.81 gain 103 34 -101.38 gain 34 104 -116.00 gain 104 34 -107.01 gain 34 105 -108.01 gain 105 34 -104.42 gain 34 106 -97.32 gain 106 34 -93.03 gain 34 107 -98.55 gain 107 34 -97.28 gain 34 108 -99.60 gain 108 34 -96.39 gain 34 109 -95.20 gain 109 34 -88.83 gain 34 110 -94.36 gain 110 34 -90.24 gain 34 111 -93.15 gain 111 34 -86.22 gain 34 112 -95.85 gain 112 34 -90.93 gain 34 113 -106.42 gain 113 34 -108.43 gain 34 114 -105.71 gain 114 34 -103.35 gain 34 115 -96.00 gain 115 34 -94.50 gain 34 116 -105.28 gain 116 34 -99.81 gain 34 117 -114.05 gain 117 34 -108.42 gain 34 118 -107.68 gain 118 34 -110.23 gain 34 119 -104.43 gain 119 34 -98.53 gain 34 120 -106.41 gain 120 34 -100.61 gain 34 121 -99.76 gain 121 34 -96.71 gain 34 122 -106.15 gain 122 34 -105.66 gain 34 123 -96.42 gain 123 34 -96.19 gain 34 124 -102.47 gain 124 34 -95.84 gain 34 125 -112.61 gain 125 34 -107.91 gain 34 126 -101.13 gain 126 34 -101.31 gain 34 127 -104.14 gain 127 34 -99.08 gain 34 128 -107.30 gain 128 34 -105.30 gain 34 129 -103.93 gain 129 34 -99.14 gain 34 130 -107.04 gain 130 34 -104.43 gain 34 131 -110.29 gain 131 34 -106.04 gain 34 132 -114.04 gain 132 34 -106.07 gain 34 133 -108.71 gain 133 34 -105.17 gain 34 134 -109.46 gain 134 34 -103.92 gain 34 135 -108.07 gain 135 34 -98.11 gain 34 136 -102.94 gain 136 34 -101.75 gain 34 137 -105.56 gain 137 34 -101.03 gain 34 138 -106.13 gain 138 34 -103.62 gain 34 139 -105.05 gain 139 34 -104.24 gain 34 140 -103.85 gain 140 34 -102.85 gain 34 141 -97.03 gain 141 34 -91.72 gain 34 142 -104.33 gain 142 34 -100.18 gain 34 143 -104.47 gain 143 34 -102.76 gain 34 144 -108.27 gain 144 34 -102.46 gain 34 145 -112.23 gain 145 34 -110.98 gain 34 146 -108.29 gain 146 34 -103.48 gain 34 147 -106.22 gain 147 34 -102.60 gain 34 148 -113.39 gain 148 34 -110.30 gain 34 149 -115.85 gain 149 34 -109.13 gain 34 150 -103.04 gain 150 34 -99.70 gain 34 151 -112.74 gain 151 34 -111.89 gain 34 152 -106.69 gain 152 34 -104.19 gain 34 153 -114.57 gain 153 34 -111.77 gain 34 154 -104.39 gain 154 34 -102.72 gain 34 155 -106.44 gain 155 34 -102.07 gain 34 156 -103.10 gain 156 34 -99.85 gain 34 157 -103.05 gain 157 34 -101.10 gain 34 158 -111.11 gain 158 34 -111.13 gain 34 159 -109.69 gain 159 34 -103.75 gain 34 160 -108.20 gain 160 34 -103.64 gain 34 161 -111.35 gain 161 34 -107.84 gain 34 162 -110.92 gain 162 34 -107.03 gain 34 163 -108.61 gain 163 34 -102.14 gain 34 164 -112.79 gain 164 34 -113.56 gain 34 165 -111.31 gain 165 34 -109.42 gain 34 166 -104.94 gain 166 34 -104.71 gain 34 167 -108.89 gain 167 34 -107.49 gain 34 168 -104.24 gain 168 34 -101.91 gain 34 169 -110.73 gain 169 34 -104.91 gain 34 170 -117.10 gain 170 34 -112.22 gain 34 171 -109.89 gain 171 34 -105.58 gain 34 172 -106.22 gain 172 34 -104.71 gain 34 173 -113.99 gain 173 34 -106.80 gain 34 174 -111.67 gain 174 34 -110.44 gain 34 175 -106.86 gain 175 34 -97.43 gain 34 176 -113.33 gain 176 34 -108.11 gain 34 177 -109.02 gain 177 34 -106.17 gain 34 178 -106.67 gain 178 34 -101.42 gain 34 179 -118.76 gain 179 34 -116.56 gain 34 180 -104.38 gain 180 34 -100.92 gain 34 181 -107.89 gain 181 34 -107.83 gain 34 182 -105.26 gain 182 34 -101.32 gain 34 183 -111.71 gain 183 34 -103.66 gain 34 184 -110.19 gain 184 34 -108.37 gain 34 185 -113.13 gain 185 34 -109.81 gain 34 186 -112.55 gain 186 34 -109.93 gain 34 187 -102.78 gain 187 34 -100.19 gain 34 188 -107.71 gain 188 34 -109.56 gain 34 189 -109.16 gain 189 34 -107.07 gain 34 190 -111.37 gain 190 34 -102.11 gain 34 191 -112.79 gain 191 34 -106.70 gain 34 192 -114.07 gain 192 34 -111.65 gain 34 193 -108.27 gain 193 34 -101.88 gain 34 194 -116.24 gain 194 34 -109.73 gain 34 195 -120.66 gain 195 34 -112.12 gain 34 196 -114.10 gain 196 34 -113.24 gain 34 197 -109.54 gain 197 34 -106.17 gain 34 198 -106.11 gain 198 34 -105.38 gain 34 199 -110.33 gain 199 34 -103.62 gain 34 200 -106.67 gain 200 34 -101.87 gain 34 201 -112.05 gain 201 34 -110.34 gain 34 202 -114.44 gain 202 34 -111.03 gain 34 203 -106.54 gain 203 34 -103.22 gain 34 204 -110.42 gain 204 34 -105.33 gain 34 205 -116.64 gain 205 34 -111.21 gain 34 206 -114.45 gain 206 34 -110.35 gain 34 207 -114.37 gain 207 34 -108.02 gain 34 208 -121.87 gain 208 34 -118.81 gain 34 209 -114.31 gain 209 34 -110.29 gain 34 210 -113.60 gain 210 34 -113.59 gain 34 211 -114.68 gain 211 34 -112.06 gain 34 212 -108.15 gain 212 34 -104.08 gain 34 213 -111.81 gain 213 34 -110.47 gain 34 214 -111.25 gain 214 34 -108.09 gain 34 215 -103.93 gain 215 34 -102.59 gain 34 216 -114.36 gain 216 34 -109.91 gain 34 217 -113.41 gain 217 34 -113.42 gain 34 218 -113.10 gain 218 34 -114.42 gain 34 219 -117.93 gain 219 34 -116.82 gain 34 220 -116.67 gain 220 34 -112.68 gain 34 221 -112.92 gain 221 34 -109.92 gain 34 222 -113.32 gain 222 34 -106.90 gain 34 223 -120.54 gain 223 34 -116.41 gain 34 224 -118.76 gain 224 34 -111.55 gain 35 36 -75.41 gain 36 35 -74.23 gain 35 37 -84.15 gain 37 35 -82.37 gain 35 38 -84.73 gain 38 35 -84.15 gain 35 39 -92.59 gain 39 35 -89.48 gain 35 40 -100.09 gain 40 35 -99.03 gain 35 41 -105.63 gain 41 35 -104.22 gain 35 42 -100.07 gain 42 35 -101.69 gain 35 43 -111.21 gain 43 35 -113.34 gain 35 44 -105.93 gain 44 35 -106.05 gain 35 45 -92.73 gain 45 35 -88.87 gain 35 46 -94.61 gain 46 35 -93.62 gain 35 47 -96.19 gain 47 35 -97.06 gain 35 48 -85.07 gain 48 35 -82.94 gain 35 49 -80.35 gain 49 35 -74.86 gain 35 50 -74.63 gain 50 35 -71.04 gain 35 51 -75.40 gain 51 35 -73.59 gain 35 52 -82.91 gain 52 35 -77.52 gain 35 53 -94.47 gain 53 35 -93.58 gain 35 54 -101.71 gain 54 35 -97.34 gain 35 55 -98.99 gain 55 35 -97.75 gain 35 56 -100.42 gain 56 35 -102.27 gain 35 57 -103.58 gain 57 35 -107.47 gain 35 58 -104.48 gain 58 35 -107.91 gain 35 59 -109.75 gain 59 35 -111.35 gain 35 60 -92.86 gain 60 35 -92.87 gain 35 61 -94.65 gain 61 35 -87.55 gain 35 62 -89.80 gain 62 35 -85.49 gain 35 63 -94.45 gain 63 35 -89.15 gain 35 64 -85.69 gain 64 35 -84.78 gain 35 65 -87.17 gain 65 35 -86.30 gain 35 66 -74.62 gain 66 35 -73.05 gain 35 67 -93.98 gain 67 35 -92.54 gain 35 68 -92.29 gain 68 35 -90.80 gain 35 69 -103.08 gain 69 35 -99.85 gain 35 70 -105.57 gain 70 35 -105.04 gain 35 71 -102.42 gain 71 35 -102.64 gain 35 72 -99.42 gain 72 35 -101.49 gain 35 73 -114.12 gain 73 35 -113.25 gain 35 74 -105.91 gain 74 35 -101.03 gain 35 75 -93.21 gain 75 35 -88.72 gain 35 76 -101.85 gain 76 35 -99.85 gain 35 77 -96.33 gain 77 35 -92.64 gain 35 78 -104.00 gain 78 35 -108.94 gain 35 79 -89.49 gain 79 35 -88.97 gain 35 80 -88.27 gain 80 35 -86.08 gain 35 81 -93.20 gain 81 35 -95.29 gain 35 82 -87.71 gain 82 35 -88.96 gain 35 83 -101.50 gain 83 35 -102.32 gain 35 84 -90.40 gain 84 35 -88.29 gain 35 85 -97.46 gain 85 35 -99.94 gain 35 86 -94.91 gain 86 35 -90.57 gain 35 87 -104.98 gain 87 35 -103.44 gain 35 88 -109.61 gain 88 35 -108.36 gain 35 89 -106.23 gain 89 35 -105.61 gain 35 90 -102.73 gain 90 35 -105.64 gain 35 91 -89.25 gain 91 35 -87.75 gain 35 92 -96.72 gain 92 35 -98.79 gain 35 93 -103.24 gain 93 35 -99.23 gain 35 94 -98.82 gain 94 35 -97.23 gain 35 95 -92.01 gain 95 35 -93.46 gain 35 96 -95.70 gain 96 35 -93.43 gain 35 97 -98.93 gain 97 35 -97.94 gain 35 98 -93.19 gain 98 35 -89.37 gain 35 99 -95.01 gain 99 35 -95.29 gain 35 100 -99.99 gain 100 35 -98.10 gain 35 101 -101.21 gain 101 35 -97.98 gain 35 102 -100.74 gain 102 35 -98.18 gain 35 103 -107.84 gain 103 35 -104.51 gain 35 104 -112.38 gain 104 35 -105.48 gain 35 105 -98.98 gain 105 35 -97.47 gain 35 106 -102.85 gain 106 35 -100.66 gain 35 107 -102.95 gain 107 35 -103.77 gain 35 108 -90.47 gain 108 35 -89.35 gain 35 109 -99.92 gain 109 35 -95.64 gain 35 110 -94.64 gain 110 35 -92.61 gain 35 111 -99.33 gain 111 35 -94.50 gain 35 112 -108.20 gain 112 35 -105.36 gain 35 113 -102.39 gain 113 35 -106.49 gain 35 114 -96.87 gain 114 35 -96.61 gain 35 115 -110.16 gain 115 35 -110.76 gain 35 116 -100.93 gain 116 35 -97.55 gain 35 117 -107.26 gain 117 35 -103.72 gain 35 118 -107.67 gain 118 35 -112.31 gain 35 119 -107.84 gain 119 35 -104.03 gain 35 120 -101.72 gain 120 35 -98.01 gain 35 121 -104.50 gain 121 35 -103.53 gain 35 122 -100.04 gain 122 35 -101.64 gain 35 123 -97.63 gain 123 35 -99.49 gain 35 124 -105.39 gain 124 35 -100.86 gain 35 125 -103.37 gain 125 35 -100.76 gain 35 126 -103.11 gain 126 35 -105.39 gain 35 127 -108.01 gain 127 35 -105.04 gain 35 128 -107.50 gain 128 35 -107.59 gain 35 129 -101.09 gain 129 35 -98.39 gain 35 130 -103.04 gain 130 35 -102.52 gain 35 131 -107.41 gain 131 35 -105.26 gain 35 132 -102.07 gain 132 35 -96.19 gain 35 133 -108.22 gain 133 35 -106.76 gain 35 134 -101.36 gain 134 35 -97.90 gain 35 135 -103.39 gain 135 35 -95.52 gain 35 136 -94.65 gain 136 35 -95.56 gain 35 137 -106.73 gain 137 35 -104.29 gain 35 138 -101.44 gain 138 35 -101.02 gain 35 139 -96.40 gain 139 35 -97.68 gain 35 140 -102.39 gain 140 35 -103.48 gain 35 141 -102.02 gain 141 35 -98.80 gain 35 142 -103.83 gain 142 35 -101.76 gain 35 143 -108.30 gain 143 35 -108.69 gain 35 144 -105.98 gain 144 35 -102.27 gain 35 145 -102.56 gain 145 35 -103.40 gain 35 146 -101.42 gain 146 35 -98.70 gain 35 147 -104.25 gain 147 35 -102.72 gain 35 148 -112.87 gain 148 35 -111.86 gain 35 149 -111.74 gain 149 35 -107.11 gain 35 150 -108.94 gain 150 35 -107.69 gain 35 151 -106.26 gain 151 35 -107.49 gain 35 152 -103.28 gain 152 35 -102.87 gain 35 153 -106.77 gain 153 35 -106.06 gain 35 154 -103.87 gain 154 35 -104.29 gain 35 155 -103.89 gain 155 35 -101.60 gain 35 156 -104.77 gain 156 35 -103.61 gain 35 157 -104.64 gain 157 35 -104.78 gain 35 158 -100.97 gain 158 35 -103.08 gain 35 159 -110.60 gain 159 35 -106.74 gain 35 160 -104.84 gain 160 35 -102.36 gain 35 161 -112.38 gain 161 35 -110.95 gain 35 162 -106.08 gain 162 35 -104.28 gain 35 163 -111.64 gain 163 35 -107.27 gain 35 164 -104.12 gain 164 35 -106.98 gain 35 165 -111.81 gain 165 35 -112.02 gain 35 166 -108.82 gain 166 35 -110.69 gain 35 167 -110.49 gain 167 35 -111.18 gain 35 168 -101.07 gain 168 35 -100.82 gain 35 169 -108.01 gain 169 35 -104.28 gain 35 170 -100.41 gain 170 35 -97.62 gain 35 171 -111.27 gain 171 35 -109.05 gain 35 172 -107.65 gain 172 35 -108.22 gain 35 173 -102.59 gain 173 35 -97.49 gain 35 174 -103.21 gain 174 35 -104.06 gain 35 175 -104.56 gain 175 35 -97.21 gain 35 176 -109.10 gain 176 35 -105.97 gain 35 177 -107.14 gain 177 35 -106.38 gain 35 178 -108.86 gain 178 35 -105.70 gain 35 179 -104.16 gain 179 35 -104.04 gain 35 180 -104.51 gain 180 35 -103.13 gain 35 181 -108.23 gain 181 35 -110.26 gain 35 182 -106.74 gain 182 35 -104.90 gain 35 183 -102.42 gain 183 35 -96.46 gain 35 184 -103.05 gain 184 35 -103.32 gain 35 185 -103.25 gain 185 35 -102.02 gain 35 186 -101.27 gain 186 35 -100.74 gain 35 187 -96.34 gain 187 35 -95.84 gain 35 188 -107.91 gain 188 35 -111.85 gain 35 189 -110.97 gain 189 35 -110.96 gain 35 190 -112.59 gain 190 35 -105.42 gain 35 191 -111.92 gain 191 35 -107.92 gain 35 192 -113.16 gain 192 35 -112.83 gain 35 193 -113.11 gain 193 35 -108.80 gain 35 194 -113.77 gain 194 35 -109.36 gain 35 195 -108.41 gain 195 35 -101.97 gain 35 196 -106.18 gain 196 35 -107.41 gain 35 197 -108.82 gain 197 35 -107.53 gain 35 198 -102.84 gain 198 35 -104.20 gain 35 199 -108.44 gain 199 35 -103.82 gain 35 200 -109.88 gain 200 35 -107.17 gain 35 201 -113.99 gain 201 35 -114.37 gain 35 202 -105.08 gain 202 35 -103.76 gain 35 203 -110.49 gain 203 35 -109.27 gain 35 204 -109.62 gain 204 35 -106.62 gain 35 205 -101.52 gain 205 35 -98.19 gain 35 206 -110.51 gain 206 35 -108.50 gain 35 207 -109.61 gain 207 35 -105.34 gain 35 208 -110.03 gain 208 35 -109.06 gain 35 209 -115.26 gain 209 35 -113.33 gain 35 210 -112.72 gain 210 35 -114.79 gain 35 211 -112.96 gain 211 35 -112.42 gain 35 212 -113.45 gain 212 35 -111.46 gain 35 213 -110.39 gain 213 35 -111.14 gain 35 214 -105.33 gain 214 35 -104.27 gain 35 215 -110.51 gain 215 35 -111.26 gain 35 216 -110.13 gain 216 35 -107.77 gain 35 217 -111.55 gain 217 35 -113.65 gain 35 218 -114.39 gain 218 35 -117.80 gain 35 219 -114.99 gain 219 35 -115.97 gain 35 220 -111.27 gain 220 35 -109.37 gain 35 221 -114.07 gain 221 35 -113.16 gain 35 222 -109.57 gain 222 35 -105.23 gain 35 223 -117.02 gain 223 35 -114.98 gain 35 224 -113.09 gain 224 35 -107.97 gain 36 37 -79.63 gain 37 36 -79.03 gain 36 38 -92.68 gain 38 36 -93.29 gain 36 39 -82.45 gain 39 36 -80.52 gain 36 40 -99.84 gain 40 36 -99.97 gain 36 41 -97.11 gain 41 36 -96.88 gain 36 42 -97.49 gain 42 36 -100.28 gain 36 43 -97.59 gain 43 36 -100.90 gain 36 44 -108.44 gain 44 36 -109.75 gain 36 45 -96.32 gain 45 36 -93.64 gain 36 46 -98.57 gain 46 36 -98.77 gain 36 47 -96.17 gain 47 36 -98.22 gain 36 48 -84.94 gain 48 36 -83.99 gain 36 49 -93.46 gain 49 36 -89.15 gain 36 50 -76.30 gain 50 36 -73.89 gain 36 51 -82.48 gain 51 36 -81.85 gain 36 52 -83.89 gain 52 36 -79.69 gain 36 53 -82.85 gain 53 36 -83.14 gain 36 54 -89.08 gain 54 36 -85.89 gain 36 55 -94.50 gain 55 36 -94.44 gain 36 56 -100.11 gain 56 36 -103.15 gain 36 57 -102.48 gain 57 36 -107.55 gain 36 58 -100.46 gain 58 36 -105.08 gain 36 59 -106.20 gain 59 36 -108.98 gain 36 60 -95.07 gain 60 36 -96.26 gain 36 61 -99.05 gain 61 36 -93.12 gain 36 62 -101.06 gain 62 36 -97.94 gain 36 63 -95.26 gain 63 36 -91.14 gain 36 64 -83.93 gain 64 36 -84.20 gain 36 65 -88.07 gain 65 36 -88.38 gain 36 66 -75.01 gain 66 36 -74.63 gain 36 67 -88.54 gain 67 36 -88.28 gain 36 68 -88.87 gain 68 36 -88.56 gain 36 69 -93.27 gain 69 36 -91.22 gain 36 70 -91.07 gain 70 36 -91.72 gain 36 71 -98.65 gain 71 36 -100.06 gain 36 72 -100.10 gain 72 36 -103.36 gain 36 73 -99.33 gain 73 36 -99.65 gain 36 74 -98.97 gain 74 36 -95.28 gain 36 75 -95.55 gain 75 36 -92.24 gain 36 76 -102.48 gain 76 36 -101.67 gain 36 77 -98.40 gain 77 36 -95.88 gain 36 78 -87.21 gain 78 36 -93.33 gain 36 79 -97.74 gain 79 36 -98.40 gain 36 80 -91.58 gain 80 36 -90.57 gain 36 81 -87.60 gain 81 36 -90.86 gain 36 82 -85.55 gain 82 36 -87.98 gain 36 83 -92.08 gain 83 36 -94.09 gain 36 84 -102.09 gain 84 36 -101.17 gain 36 85 -97.56 gain 85 36 -101.22 gain 36 86 -98.74 gain 86 36 -95.59 gain 36 87 -95.86 gain 87 36 -95.50 gain 36 88 -104.69 gain 88 36 -104.62 gain 36 89 -106.95 gain 89 36 -107.51 gain 36 90 -102.03 gain 90 36 -106.12 gain 36 91 -97.99 gain 91 36 -97.68 gain 36 92 -105.04 gain 92 36 -108.29 gain 36 93 -104.29 gain 93 36 -101.45 gain 36 94 -90.25 gain 94 36 -89.85 gain 36 95 -91.88 gain 95 36 -94.52 gain 36 96 -96.28 gain 96 36 -95.20 gain 36 97 -93.77 gain 97 36 -93.96 gain 36 98 -94.24 gain 98 36 -91.60 gain 36 99 -101.04 gain 99 36 -102.49 gain 36 100 -97.22 gain 100 36 -96.52 gain 36 101 -102.19 gain 101 36 -100.15 gain 36 102 -105.93 gain 102 36 -104.55 gain 36 103 -103.36 gain 103 36 -101.21 gain 36 104 -99.80 gain 104 36 -94.08 gain 36 105 -105.60 gain 105 36 -105.28 gain 36 106 -99.16 gain 106 36 -98.15 gain 36 107 -98.93 gain 107 36 -100.93 gain 36 108 -91.00 gain 108 36 -91.06 gain 36 109 -97.14 gain 109 36 -94.05 gain 36 110 -102.89 gain 110 36 -102.04 gain 36 111 -95.82 gain 111 36 -92.16 gain 36 112 -97.33 gain 112 36 -95.68 gain 36 113 -89.40 gain 113 36 -94.68 gain 36 114 -95.05 gain 114 36 -95.97 gain 36 115 -91.96 gain 115 36 -93.73 gain 36 116 -97.81 gain 116 36 -95.61 gain 36 117 -98.81 gain 117 36 -96.45 gain 36 118 -100.06 gain 118 36 -105.88 gain 36 119 -102.48 gain 119 36 -99.84 gain 36 120 -101.46 gain 120 36 -98.93 gain 36 121 -106.59 gain 121 36 -106.80 gain 36 122 -99.53 gain 122 36 -102.32 gain 36 123 -98.49 gain 123 36 -101.53 gain 36 124 -104.40 gain 124 36 -101.04 gain 36 125 -100.80 gain 125 36 -99.38 gain 36 126 -97.43 gain 126 36 -100.89 gain 36 127 -106.20 gain 127 36 -104.42 gain 36 128 -91.10 gain 128 36 -92.37 gain 36 129 -105.67 gain 129 36 -104.16 gain 36 130 -100.00 gain 130 36 -100.67 gain 36 131 -103.02 gain 131 36 -102.04 gain 36 132 -102.42 gain 132 36 -97.72 gain 36 133 -101.11 gain 133 36 -100.84 gain 36 134 -102.89 gain 134 36 -100.62 gain 36 135 -104.99 gain 135 36 -98.31 gain 36 136 -102.13 gain 136 36 -104.22 gain 36 137 -112.17 gain 137 36 -110.92 gain 36 138 -96.89 gain 138 36 -97.65 gain 36 139 -101.19 gain 139 36 -103.66 gain 36 140 -99.57 gain 140 36 -101.85 gain 36 141 -100.44 gain 141 36 -98.40 gain 36 142 -100.64 gain 142 36 -99.75 gain 36 143 -104.53 gain 143 36 -106.10 gain 36 144 -104.68 gain 144 36 -102.15 gain 36 145 -109.31 gain 145 36 -111.33 gain 36 146 -108.98 gain 146 36 -107.44 gain 36 147 -104.74 gain 147 36 -104.39 gain 36 148 -102.30 gain 148 36 -102.48 gain 36 149 -105.36 gain 149 36 -101.91 gain 36 150 -112.00 gain 150 36 -111.94 gain 36 151 -116.47 gain 151 36 -118.89 gain 36 152 -105.77 gain 152 36 -106.55 gain 36 153 -104.53 gain 153 36 -105.00 gain 36 154 -100.08 gain 154 36 -101.68 gain 36 155 -105.30 gain 155 36 -104.21 gain 36 156 -102.29 gain 156 36 -102.31 gain 36 157 -104.53 gain 157 36 -105.85 gain 36 158 -105.82 gain 158 36 -109.11 gain 36 159 -108.45 gain 159 36 -105.78 gain 36 160 -97.29 gain 160 36 -95.99 gain 36 161 -103.20 gain 161 36 -102.96 gain 36 162 -108.88 gain 162 36 -108.27 gain 36 163 -108.75 gain 163 36 -105.56 gain 36 164 -114.40 gain 164 36 -118.43 gain 36 165 -102.95 gain 165 36 -104.34 gain 36 166 -104.22 gain 166 36 -107.27 gain 36 167 -101.80 gain 167 36 -103.67 gain 36 168 -107.44 gain 168 36 -108.37 gain 36 169 -99.98 gain 169 36 -97.43 gain 36 170 -108.10 gain 170 36 -106.49 gain 36 171 -103.36 gain 171 36 -102.32 gain 36 172 -115.54 gain 172 36 -117.30 gain 36 173 -105.12 gain 173 36 -101.21 gain 36 174 -106.74 gain 174 36 -108.78 gain 36 175 -100.25 gain 175 36 -94.08 gain 36 176 -104.48 gain 176 36 -102.54 gain 36 177 -105.59 gain 177 36 -106.02 gain 36 178 -109.70 gain 178 36 -107.73 gain 36 179 -103.29 gain 179 36 -104.36 gain 36 180 -114.55 gain 180 36 -114.36 gain 36 181 -109.73 gain 181 36 -112.94 gain 36 182 -109.21 gain 182 36 -108.55 gain 36 183 -100.67 gain 183 36 -95.89 gain 36 184 -107.81 gain 184 36 -109.27 gain 36 185 -99.68 gain 185 36 -99.63 gain 36 186 -106.51 gain 186 36 -107.17 gain 36 187 -102.41 gain 187 36 -103.09 gain 36 188 -105.45 gain 188 36 -110.57 gain 36 189 -107.94 gain 189 36 -109.12 gain 36 190 -105.42 gain 190 36 -99.44 gain 36 191 -105.03 gain 191 36 -102.22 gain 36 192 -107.93 gain 192 36 -108.79 gain 36 193 -110.34 gain 193 36 -107.22 gain 36 194 -111.25 gain 194 36 -108.02 gain 36 195 -112.88 gain 195 36 -107.62 gain 36 196 -108.87 gain 196 36 -111.28 gain 36 197 -112.15 gain 197 36 -112.05 gain 36 198 -107.07 gain 198 36 -109.62 gain 36 199 -115.65 gain 199 36 -112.21 gain 36 200 -103.66 gain 200 36 -102.14 gain 36 201 -106.42 gain 201 36 -107.99 gain 36 202 -103.20 gain 202 36 -103.07 gain 36 203 -103.66 gain 203 36 -103.62 gain 36 204 -114.51 gain 204 36 -112.69 gain 36 205 -111.16 gain 205 36 -109.01 gain 36 206 -106.29 gain 206 36 -105.46 gain 36 207 -108.77 gain 207 36 -105.69 gain 36 208 -104.76 gain 208 36 -104.98 gain 36 209 -112.06 gain 209 36 -111.31 gain 36 210 -107.69 gain 210 36 -110.94 gain 36 211 -113.82 gain 211 36 -114.47 gain 36 212 -112.41 gain 212 36 -111.60 gain 36 213 -112.52 gain 213 36 -114.45 gain 36 214 -109.71 gain 214 36 -109.83 gain 36 215 -111.62 gain 215 36 -113.55 gain 36 216 -106.30 gain 216 36 -105.13 gain 36 217 -112.10 gain 217 36 -115.37 gain 36 218 -112.15 gain 218 36 -116.75 gain 36 219 -115.51 gain 219 36 -117.68 gain 36 220 -110.02 gain 220 36 -109.30 gain 36 221 -112.66 gain 221 36 -112.94 gain 36 222 -109.45 gain 222 36 -106.30 gain 36 223 -100.96 gain 223 36 -100.10 gain 36 224 -110.15 gain 224 36 -106.22 gain 37 38 -69.05 gain 38 37 -70.25 gain 37 39 -81.45 gain 39 37 -80.12 gain 37 40 -88.75 gain 40 37 -89.48 gain 37 41 -95.16 gain 41 37 -95.53 gain 37 42 -92.28 gain 42 37 -95.67 gain 37 43 -95.75 gain 43 37 -99.66 gain 37 44 -98.62 gain 44 37 -100.53 gain 37 45 -105.70 gain 45 37 -103.63 gain 37 46 -99.51 gain 46 37 -100.31 gain 37 47 -89.72 gain 47 37 -92.37 gain 37 48 -87.71 gain 48 37 -87.37 gain 37 49 -94.37 gain 49 37 -90.66 gain 37 50 -81.67 gain 50 37 -79.86 gain 37 51 -72.35 gain 51 37 -72.33 gain 37 52 -67.07 gain 52 37 -63.47 gain 37 53 -82.22 gain 53 37 -83.11 gain 37 54 -82.13 gain 54 37 -79.54 gain 37 55 -98.20 gain 55 37 -98.73 gain 37 56 -99.75 gain 56 37 -103.38 gain 37 57 -99.67 gain 57 37 -105.34 gain 37 58 -97.16 gain 58 37 -102.38 gain 37 59 -94.72 gain 59 37 -98.10 gain 37 60 -103.12 gain 60 37 -104.91 gain 37 61 -97.46 gain 61 37 -92.13 gain 37 62 -104.81 gain 62 37 -102.28 gain 37 63 -88.23 gain 63 37 -84.71 gain 37 64 -85.97 gain 64 37 -86.84 gain 37 65 -94.59 gain 65 37 -95.50 gain 37 66 -81.29 gain 66 37 -81.51 gain 37 67 -78.06 gain 67 37 -78.40 gain 37 68 -79.70 gain 68 37 -80.00 gain 37 69 -90.19 gain 69 37 -88.75 gain 37 70 -90.31 gain 70 37 -91.56 gain 37 71 -99.87 gain 71 37 -101.88 gain 37 72 -95.35 gain 72 37 -99.21 gain 37 73 -91.13 gain 73 37 -92.04 gain 37 74 -97.26 gain 74 37 -94.17 gain 37 75 -97.84 gain 75 37 -95.13 gain 37 76 -101.31 gain 76 37 -101.10 gain 37 77 -100.07 gain 77 37 -98.15 gain 37 78 -98.71 gain 78 37 -105.43 gain 37 79 -92.58 gain 79 37 -93.84 gain 37 80 -84.48 gain 80 37 -84.08 gain 37 81 -90.17 gain 81 37 -94.04 gain 37 82 -100.74 gain 82 37 -103.77 gain 37 83 -90.79 gain 83 37 -93.40 gain 37 84 -91.74 gain 84 37 -91.42 gain 37 85 -92.22 gain 85 37 -96.48 gain 37 86 -96.77 gain 86 37 -94.21 gain 37 87 -98.73 gain 87 37 -98.97 gain 37 88 -96.77 gain 88 37 -97.30 gain 37 89 -100.21 gain 89 37 -101.37 gain 37 90 -109.52 gain 90 37 -114.21 gain 37 91 -97.85 gain 91 37 -98.13 gain 37 92 -94.03 gain 92 37 -97.88 gain 37 93 -97.33 gain 93 37 -95.10 gain 37 94 -101.82 gain 94 37 -102.02 gain 37 95 -87.86 gain 95 37 -91.10 gain 37 96 -95.62 gain 96 37 -95.14 gain 37 97 -92.63 gain 97 37 -93.42 gain 37 98 -93.27 gain 98 37 -91.23 gain 37 99 -99.45 gain 99 37 -101.51 gain 37 100 -93.67 gain 100 37 -93.57 gain 37 101 -101.38 gain 101 37 -99.94 gain 37 102 -101.05 gain 102 37 -100.27 gain 37 103 -97.61 gain 103 37 -96.06 gain 37 104 -98.91 gain 104 37 -93.79 gain 37 105 -100.55 gain 105 37 -100.83 gain 37 106 -99.54 gain 106 37 -99.12 gain 37 107 -102.67 gain 107 37 -105.27 gain 37 108 -94.70 gain 108 37 -95.37 gain 37 109 -93.26 gain 109 37 -90.77 gain 37 110 -95.33 gain 110 37 -95.08 gain 37 111 -92.83 gain 111 37 -89.77 gain 37 112 -91.47 gain 112 37 -90.42 gain 37 113 -91.11 gain 113 37 -96.99 gain 37 114 -101.50 gain 114 37 -103.02 gain 37 115 -97.43 gain 115 37 -99.81 gain 37 116 -95.33 gain 116 37 -93.73 gain 37 117 -102.45 gain 117 37 -100.70 gain 37 118 -103.47 gain 118 37 -109.89 gain 37 119 -106.05 gain 119 37 -104.02 gain 37 120 -102.23 gain 120 37 -100.30 gain 37 121 -103.52 gain 121 37 -104.34 gain 37 122 -108.21 gain 122 37 -111.60 gain 37 123 -103.09 gain 123 37 -106.74 gain 37 124 -104.75 gain 124 37 -102.00 gain 37 125 -101.02 gain 125 37 -100.19 gain 37 126 -99.92 gain 126 37 -103.98 gain 37 127 -98.86 gain 127 37 -97.68 gain 37 128 -99.11 gain 128 37 -100.98 gain 37 129 -93.83 gain 129 37 -92.92 gain 37 130 -106.01 gain 130 37 -107.28 gain 37 131 -98.39 gain 131 37 -98.02 gain 37 132 -101.89 gain 132 37 -97.79 gain 37 133 -105.42 gain 133 37 -105.75 gain 37 134 -100.59 gain 134 37 -98.91 gain 37 135 -105.48 gain 135 37 -99.40 gain 37 136 -105.57 gain 136 37 -108.26 gain 37 137 -106.35 gain 137 37 -105.70 gain 37 138 -96.24 gain 138 37 -97.61 gain 37 139 -102.09 gain 139 37 -105.16 gain 37 140 -102.96 gain 140 37 -105.84 gain 37 141 -99.38 gain 141 37 -97.94 gain 37 142 -101.40 gain 142 37 -101.11 gain 37 143 -94.74 gain 143 37 -96.90 gain 37 144 -101.23 gain 144 37 -99.30 gain 37 145 -96.70 gain 145 37 -99.31 gain 37 146 -106.71 gain 146 37 -105.77 gain 37 147 -101.17 gain 147 37 -101.42 gain 37 148 -106.56 gain 148 37 -107.34 gain 37 149 -106.75 gain 149 37 -103.90 gain 37 150 -97.34 gain 150 37 -97.87 gain 37 151 -104.15 gain 151 37 -107.16 gain 37 152 -108.27 gain 152 37 -109.64 gain 37 153 -107.96 gain 153 37 -109.04 gain 37 154 -99.65 gain 154 37 -101.85 gain 37 155 -97.80 gain 155 37 -97.30 gain 37 156 -97.36 gain 156 37 -97.99 gain 37 157 -98.60 gain 157 37 -100.53 gain 37 158 -112.29 gain 158 37 -116.18 gain 37 159 -108.22 gain 159 37 -106.15 gain 37 160 -101.57 gain 160 37 -100.88 gain 37 161 -102.73 gain 161 37 -103.09 gain 37 162 -104.72 gain 162 37 -104.71 gain 37 163 -107.64 gain 163 37 -105.05 gain 37 164 -111.44 gain 164 37 -116.08 gain 37 165 -109.23 gain 165 37 -111.22 gain 37 166 -105.56 gain 166 37 -109.21 gain 37 167 -106.07 gain 167 37 -108.54 gain 37 168 -110.89 gain 168 37 -112.43 gain 37 169 -102.98 gain 169 37 -101.04 gain 37 170 -104.56 gain 170 37 -103.55 gain 37 171 -109.92 gain 171 37 -109.49 gain 37 172 -107.38 gain 172 37 -109.74 gain 37 173 -110.84 gain 173 37 -107.52 gain 37 174 -107.37 gain 174 37 -110.00 gain 37 175 -101.02 gain 175 37 -95.45 gain 37 176 -104.34 gain 176 37 -102.99 gain 37 177 -102.74 gain 177 37 -103.76 gain 37 178 -100.57 gain 178 37 -99.20 gain 37 179 -112.98 gain 179 37 -114.65 gain 37 180 -107.72 gain 180 37 -108.13 gain 37 181 -115.54 gain 181 37 -119.35 gain 37 182 -108.23 gain 182 37 -108.17 gain 37 183 -104.65 gain 183 37 -100.47 gain 37 184 -103.47 gain 184 37 -105.52 gain 37 185 -110.85 gain 185 37 -111.40 gain 37 186 -101.53 gain 186 37 -102.78 gain 37 187 -111.16 gain 187 37 -112.44 gain 37 188 -91.88 gain 188 37 -97.60 gain 37 189 -106.16 gain 189 37 -107.94 gain 37 190 -105.91 gain 190 37 -100.52 gain 37 191 -108.66 gain 191 37 -106.45 gain 37 192 -105.31 gain 192 37 -106.77 gain 37 193 -108.56 gain 193 37 -106.04 gain 37 194 -118.06 gain 194 37 -115.43 gain 37 195 -104.53 gain 195 37 -99.88 gain 37 196 -112.73 gain 196 37 -115.74 gain 37 197 -105.91 gain 197 37 -106.41 gain 37 198 -110.38 gain 198 37 -113.53 gain 37 199 -100.48 gain 199 37 -97.64 gain 37 200 -108.53 gain 200 37 -107.60 gain 37 201 -101.78 gain 201 37 -103.94 gain 37 202 -101.89 gain 202 37 -102.35 gain 37 203 -107.61 gain 203 37 -108.17 gain 37 204 -105.01 gain 204 37 -103.79 gain 37 205 -103.63 gain 205 37 -102.08 gain 37 206 -106.66 gain 206 37 -106.43 gain 37 207 -105.47 gain 207 37 -102.99 gain 37 208 -106.57 gain 208 37 -107.39 gain 37 209 -121.11 gain 209 37 -120.97 gain 37 210 -111.19 gain 210 37 -115.05 gain 37 211 -108.10 gain 211 37 -109.35 gain 37 212 -105.73 gain 212 37 -105.52 gain 37 213 -106.82 gain 213 37 -109.35 gain 37 214 -109.74 gain 214 37 -110.46 gain 37 215 -113.38 gain 215 37 -115.91 gain 37 216 -102.86 gain 216 37 -102.29 gain 37 217 -103.31 gain 217 37 -107.19 gain 37 218 -104.64 gain 218 37 -109.84 gain 37 219 -106.76 gain 219 37 -109.53 gain 37 220 -107.16 gain 220 37 -107.04 gain 37 221 -110.14 gain 221 37 -111.01 gain 37 222 -107.96 gain 222 37 -105.41 gain 37 223 -107.15 gain 223 37 -106.89 gain 37 224 -106.63 gain 224 37 -103.30 gain 38 39 -71.68 gain 39 38 -69.14 gain 38 40 -80.66 gain 40 38 -80.18 gain 38 41 -89.16 gain 41 38 -88.33 gain 38 42 -95.98 gain 42 38 -98.17 gain 38 43 -100.45 gain 43 38 -103.16 gain 38 44 -97.61 gain 44 38 -98.31 gain 38 45 -101.53 gain 45 38 -98.25 gain 38 46 -99.50 gain 46 38 -99.09 gain 38 47 -103.18 gain 47 38 -104.62 gain 38 48 -96.60 gain 48 38 -95.05 gain 38 49 -94.80 gain 49 38 -89.89 gain 38 50 -90.07 gain 50 38 -87.05 gain 38 51 -88.10 gain 51 38 -86.86 gain 38 52 -82.37 gain 52 38 -77.57 gain 38 53 -77.85 gain 53 38 -77.54 gain 38 54 -79.27 gain 54 38 -75.47 gain 38 55 -91.35 gain 55 38 -90.68 gain 38 56 -94.87 gain 56 38 -97.29 gain 38 57 -95.12 gain 57 38 -99.59 gain 38 58 -98.04 gain 58 38 -102.05 gain 38 59 -97.18 gain 59 38 -99.35 gain 38 60 -100.13 gain 60 38 -100.72 gain 38 61 -99.22 gain 61 38 -92.69 gain 38 62 -97.69 gain 62 38 -93.96 gain 38 63 -105.90 gain 63 38 -101.17 gain 38 64 -106.09 gain 64 38 -105.76 gain 38 65 -87.48 gain 65 38 -87.19 gain 38 66 -88.98 gain 66 38 -87.99 gain 38 67 -82.58 gain 67 38 -81.71 gain 38 68 -91.06 gain 68 38 -90.15 gain 38 69 -87.31 gain 69 38 -84.65 gain 38 70 -95.14 gain 70 38 -95.18 gain 38 71 -95.50 gain 71 38 -96.31 gain 38 72 -95.01 gain 72 38 -97.66 gain 38 73 -101.13 gain 73 38 -100.83 gain 38 74 -102.52 gain 74 38 -98.23 gain 38 75 -99.94 gain 75 38 -96.02 gain 38 76 -103.63 gain 76 38 -102.21 gain 38 77 -103.24 gain 77 38 -100.12 gain 38 78 -104.53 gain 78 38 -110.04 gain 38 79 -100.74 gain 79 38 -100.79 gain 38 80 -89.95 gain 80 38 -88.33 gain 38 81 -97.52 gain 81 38 -100.18 gain 38 82 -93.14 gain 82 38 -94.96 gain 38 83 -90.37 gain 83 38 -91.77 gain 38 84 -92.61 gain 84 38 -91.09 gain 38 85 -83.42 gain 85 38 -86.48 gain 38 86 -93.23 gain 86 38 -89.47 gain 38 87 -92.96 gain 87 38 -91.99 gain 38 88 -101.60 gain 88 38 -100.92 gain 38 89 -107.37 gain 89 38 -107.33 gain 38 90 -107.68 gain 90 38 -111.17 gain 38 91 -104.33 gain 91 38 -103.41 gain 38 92 -109.69 gain 92 38 -112.34 gain 38 93 -104.22 gain 93 38 -100.78 gain 38 94 -92.66 gain 94 38 -91.65 gain 38 95 -99.89 gain 95 38 -101.92 gain 38 96 -86.75 gain 96 38 -85.05 gain 38 97 -95.84 gain 97 38 -95.42 gain 38 98 -99.79 gain 98 38 -96.55 gain 38 99 -101.54 gain 99 38 -102.39 gain 38 100 -96.59 gain 100 38 -95.28 gain 38 101 -101.74 gain 101 38 -99.09 gain 38 102 -101.17 gain 102 38 -99.19 gain 38 103 -100.73 gain 103 38 -97.98 gain 38 104 -102.26 gain 104 38 -95.93 gain 38 105 -103.71 gain 105 38 -102.79 gain 38 106 -101.60 gain 106 38 -99.97 gain 38 107 -100.98 gain 107 38 -102.37 gain 38 108 -105.18 gain 108 38 -104.64 gain 38 109 -106.96 gain 109 38 -103.26 gain 38 110 -103.34 gain 110 38 -101.89 gain 38 111 -97.77 gain 111 38 -93.51 gain 38 112 -97.90 gain 112 38 -95.65 gain 38 113 -104.87 gain 113 38 -109.54 gain 38 114 -102.74 gain 114 38 -103.05 gain 38 115 -97.92 gain 115 38 -99.09 gain 38 116 -94.77 gain 116 38 -91.96 gain 38 117 -104.54 gain 117 38 -101.58 gain 38 118 -106.24 gain 118 38 -111.45 gain 38 119 -102.94 gain 119 38 -99.70 gain 38 120 -107.22 gain 120 38 -104.08 gain 38 121 -110.31 gain 121 38 -109.92 gain 38 122 -100.24 gain 122 38 -102.42 gain 38 123 -101.36 gain 123 38 -103.79 gain 38 124 -94.88 gain 124 38 -90.92 gain 38 125 -107.05 gain 125 38 -105.02 gain 38 126 -107.24 gain 126 38 -110.10 gain 38 127 -97.16 gain 127 38 -94.77 gain 38 128 -97.85 gain 128 38 -98.52 gain 38 129 -102.18 gain 129 38 -100.06 gain 38 130 -103.12 gain 130 38 -103.18 gain 38 131 -102.08 gain 131 38 -100.50 gain 38 132 -114.16 gain 132 38 -108.86 gain 38 133 -104.97 gain 133 38 -104.09 gain 38 134 -105.39 gain 134 38 -102.51 gain 38 135 -102.89 gain 135 38 -95.59 gain 38 136 -105.99 gain 136 38 -107.47 gain 38 137 -107.12 gain 137 38 -105.26 gain 38 138 -100.03 gain 138 38 -100.18 gain 38 139 -103.83 gain 139 38 -105.69 gain 38 140 -100.33 gain 140 38 -102.00 gain 38 141 -103.24 gain 141 38 -100.60 gain 38 142 -104.72 gain 142 38 -103.23 gain 38 143 -102.43 gain 143 38 -103.39 gain 38 144 -97.98 gain 144 38 -94.84 gain 38 145 -97.94 gain 145 38 -99.35 gain 38 146 -98.75 gain 146 38 -96.60 gain 38 147 -99.40 gain 147 38 -98.45 gain 38 148 -103.44 gain 148 38 -103.02 gain 38 149 -107.68 gain 149 38 -103.63 gain 38 150 -106.36 gain 150 38 -105.69 gain 38 151 -101.87 gain 151 38 -103.68 gain 38 152 -113.72 gain 152 38 -113.89 gain 38 153 -106.36 gain 153 38 -106.22 gain 38 154 -101.42 gain 154 38 -102.42 gain 38 155 -104.33 gain 155 38 -102.62 gain 38 156 -99.23 gain 156 38 -98.65 gain 38 157 -107.74 gain 157 38 -108.45 gain 38 158 -104.47 gain 158 38 -107.15 gain 38 159 -105.09 gain 159 38 -101.81 gain 38 160 -105.65 gain 160 38 -103.75 gain 38 161 -108.00 gain 161 38 -107.15 gain 38 162 -110.21 gain 162 38 -108.99 gain 38 163 -107.03 gain 163 38 -103.23 gain 38 164 -99.59 gain 164 38 -103.02 gain 38 165 -115.12 gain 165 38 -115.90 gain 38 166 -106.35 gain 166 38 -108.80 gain 38 167 -107.78 gain 167 38 -109.05 gain 38 168 -103.25 gain 168 38 -103.58 gain 38 169 -108.35 gain 169 38 -105.20 gain 38 170 -102.00 gain 170 38 -99.78 gain 38 171 -103.33 gain 171 38 -101.68 gain 38 172 -102.52 gain 172 38 -103.68 gain 38 173 -110.80 gain 173 38 -106.27 gain 38 174 -102.33 gain 174 38 -103.76 gain 38 175 -102.86 gain 175 38 -96.09 gain 38 176 -102.88 gain 176 38 -100.33 gain 38 177 -104.11 gain 177 38 -103.92 gain 38 178 -106.29 gain 178 38 -103.71 gain 38 179 -107.03 gain 179 38 -107.49 gain 38 180 -111.61 gain 180 38 -110.81 gain 38 181 -106.22 gain 181 38 -108.82 gain 38 182 -104.22 gain 182 38 -102.95 gain 38 183 -106.73 gain 183 38 -101.35 gain 38 184 -110.41 gain 184 38 -111.25 gain 38 185 -108.00 gain 185 38 -107.35 gain 38 186 -108.62 gain 186 38 -108.67 gain 38 187 -107.94 gain 187 38 -108.02 gain 38 188 -113.52 gain 188 38 -118.03 gain 38 189 -114.55 gain 189 38 -115.13 gain 38 190 -105.92 gain 190 38 -99.32 gain 38 191 -102.17 gain 191 38 -98.75 gain 38 192 -107.62 gain 192 38 -107.87 gain 38 193 -103.41 gain 193 38 -99.68 gain 38 194 -113.47 gain 194 38 -109.63 gain 38 195 -111.81 gain 195 38 -105.95 gain 38 196 -111.34 gain 196 38 -113.14 gain 38 197 -113.51 gain 197 38 -112.81 gain 38 198 -108.03 gain 198 38 -109.97 gain 38 199 -115.38 gain 199 38 -111.33 gain 38 200 -109.39 gain 200 38 -107.26 gain 38 201 -102.55 gain 201 38 -103.51 gain 38 202 -111.09 gain 202 38 -110.34 gain 38 203 -107.54 gain 203 38 -106.89 gain 38 204 -114.06 gain 204 38 -111.63 gain 38 205 -104.01 gain 205 38 -101.26 gain 38 206 -115.25 gain 206 38 -113.81 gain 38 207 -108.71 gain 207 38 -105.02 gain 38 208 -105.67 gain 208 38 -105.28 gain 38 209 -105.01 gain 209 38 -103.65 gain 38 210 -114.91 gain 210 38 -117.56 gain 38 211 -104.67 gain 211 38 -104.71 gain 38 212 -109.97 gain 212 38 -108.56 gain 38 213 -117.21 gain 213 38 -118.54 gain 38 214 -107.51 gain 214 38 -107.02 gain 38 215 -107.33 gain 215 38 -108.66 gain 38 216 -114.69 gain 216 38 -112.91 gain 38 217 -105.32 gain 217 38 -107.99 gain 38 218 -109.87 gain 218 38 -113.86 gain 38 219 -109.54 gain 219 38 -111.10 gain 38 220 -113.31 gain 220 38 -111.99 gain 38 221 -113.93 gain 221 38 -113.60 gain 38 222 -110.96 gain 222 38 -107.21 gain 38 223 -104.88 gain 223 38 -103.42 gain 38 224 -102.99 gain 224 38 -98.45 gain 39 40 -68.72 gain 40 39 -70.78 gain 39 41 -88.02 gain 41 39 -89.72 gain 39 42 -87.74 gain 42 39 -92.46 gain 39 43 -92.53 gain 43 39 -97.77 gain 39 44 -97.28 gain 44 39 -100.51 gain 39 45 -98.54 gain 45 39 -97.80 gain 39 46 -95.67 gain 46 39 -97.80 gain 39 47 -98.33 gain 47 39 -102.31 gain 39 48 -98.77 gain 48 39 -99.75 gain 39 49 -94.40 gain 49 39 -92.02 gain 39 50 -85.44 gain 50 39 -84.95 gain 39 51 -87.47 gain 51 39 -88.78 gain 39 52 -90.25 gain 52 39 -87.99 gain 39 53 -73.96 gain 53 39 -76.18 gain 39 54 -77.78 gain 54 39 -76.53 gain 39 55 -76.97 gain 55 39 -78.84 gain 39 56 -78.67 gain 56 39 -83.64 gain 39 57 -85.07 gain 57 39 -92.07 gain 39 58 -87.58 gain 58 39 -94.13 gain 39 59 -99.26 gain 59 39 -103.98 gain 39 60 -100.44 gain 60 39 -103.57 gain 39 61 -103.79 gain 61 39 -99.79 gain 39 62 -94.96 gain 62 39 -93.76 gain 39 63 -101.24 gain 63 39 -99.06 gain 39 64 -94.25 gain 64 39 -96.46 gain 39 65 -86.83 gain 65 39 -89.08 gain 39 66 -87.24 gain 66 39 -88.79 gain 39 67 -92.56 gain 67 39 -94.23 gain 39 68 -87.11 gain 68 39 -88.74 gain 39 69 -94.15 gain 69 39 -94.04 gain 39 70 -85.66 gain 70 39 -88.24 gain 39 71 -90.88 gain 71 39 -94.22 gain 39 72 -86.08 gain 72 39 -91.27 gain 39 73 -95.45 gain 73 39 -97.69 gain 39 74 -96.57 gain 74 39 -94.81 gain 39 75 -102.99 gain 75 39 -101.61 gain 39 76 -103.83 gain 76 39 -104.95 gain 39 77 -99.13 gain 77 39 -98.54 gain 39 78 -101.38 gain 78 39 -109.43 gain 39 79 -91.21 gain 79 39 -93.80 gain 39 80 -91.78 gain 80 39 -92.71 gain 39 81 -100.41 gain 81 39 -105.61 gain 39 82 -87.70 gain 82 39 -92.06 gain 39 83 -81.98 gain 83 39 -85.92 gain 39 84 -86.13 gain 84 39 -87.14 gain 39 85 -81.84 gain 85 39 -87.43 gain 39 86 -101.08 gain 86 39 -99.85 gain 39 87 -95.43 gain 87 39 -97.01 gain 39 88 -95.88 gain 88 39 -97.73 gain 39 89 -102.26 gain 89 39 -104.75 gain 39 90 -108.88 gain 90 39 -114.91 gain 39 91 -96.58 gain 91 39 -98.20 gain 39 92 -102.47 gain 92 39 -107.65 gain 39 93 -100.10 gain 93 39 -99.20 gain 39 94 -103.01 gain 94 39 -104.54 gain 39 95 -100.78 gain 95 39 -105.35 gain 39 96 -90.46 gain 96 39 -91.31 gain 39 97 -94.28 gain 97 39 -96.39 gain 39 98 -96.65 gain 98 39 -95.94 gain 39 99 -86.53 gain 99 39 -89.92 gain 39 100 -91.47 gain 100 39 -92.70 gain 39 101 -98.87 gain 101 39 -98.76 gain 39 102 -100.26 gain 102 39 -100.81 gain 39 103 -93.83 gain 103 39 -93.61 gain 39 104 -96.77 gain 104 39 -92.98 gain 39 105 -111.49 gain 105 39 -113.11 gain 39 106 -105.25 gain 106 39 -106.17 gain 39 107 -101.41 gain 107 39 -105.34 gain 39 108 -92.97 gain 108 39 -94.96 gain 39 109 -100.23 gain 109 39 -99.07 gain 39 110 -99.39 gain 110 39 -100.48 gain 39 111 -97.97 gain 111 39 -96.25 gain 39 112 -93.39 gain 112 39 -93.67 gain 39 113 -98.79 gain 113 39 -106.01 gain 39 114 -88.48 gain 114 39 -91.32 gain 39 115 -94.19 gain 115 39 -97.89 gain 39 116 -97.52 gain 116 39 -97.25 gain 39 117 -96.84 gain 117 39 -96.41 gain 39 118 -99.64 gain 118 39 -107.39 gain 39 119 -103.92 gain 119 39 -103.22 gain 39 120 -105.89 gain 120 39 -105.29 gain 39 121 -105.34 gain 121 39 -107.48 gain 39 122 -102.91 gain 122 39 -107.62 gain 39 123 -95.25 gain 123 39 -100.22 gain 39 124 -99.46 gain 124 39 -98.03 gain 39 125 -101.50 gain 125 39 -102.01 gain 39 126 -94.61 gain 126 39 -100.00 gain 39 127 -103.23 gain 127 39 -103.38 gain 39 128 -96.97 gain 128 39 -100.17 gain 39 129 -105.42 gain 129 39 -105.84 gain 39 130 -95.58 gain 130 39 -98.17 gain 39 131 -94.86 gain 131 39 -95.82 gain 39 132 -98.21 gain 132 39 -95.44 gain 39 133 -97.26 gain 133 39 -98.92 gain 39 134 -94.79 gain 134 39 -94.45 gain 39 135 -113.58 gain 135 39 -108.82 gain 39 136 -106.02 gain 136 39 -110.04 gain 39 137 -111.49 gain 137 39 -112.17 gain 39 138 -92.90 gain 138 39 -95.59 gain 39 139 -95.81 gain 139 39 -100.21 gain 39 140 -99.04 gain 140 39 -103.25 gain 39 141 -100.63 gain 141 39 -100.52 gain 39 142 -95.39 gain 142 39 -96.44 gain 39 143 -96.36 gain 143 39 -99.86 gain 39 144 -95.40 gain 144 39 -94.79 gain 39 145 -97.26 gain 145 39 -101.21 gain 39 146 -95.01 gain 146 39 -95.40 gain 39 147 -103.58 gain 147 39 -105.17 gain 39 148 -102.81 gain 148 39 -104.92 gain 39 149 -95.63 gain 149 39 -94.12 gain 39 150 -105.84 gain 150 39 -107.71 gain 39 151 -102.21 gain 151 39 -106.56 gain 39 152 -100.57 gain 152 39 -103.27 gain 39 153 -104.96 gain 153 39 -107.36 gain 39 154 -99.00 gain 154 39 -102.54 gain 39 155 -107.26 gain 155 39 -108.09 gain 39 156 -100.25 gain 156 39 -102.21 gain 39 157 -98.90 gain 157 39 -102.15 gain 39 158 -99.94 gain 158 39 -105.17 gain 39 159 -102.64 gain 159 39 -101.90 gain 39 160 -96.18 gain 160 39 -96.82 gain 39 161 -100.84 gain 161 39 -102.53 gain 39 162 -106.35 gain 162 39 -107.67 gain 39 163 -105.20 gain 163 39 -103.94 gain 39 164 -102.07 gain 164 39 -108.04 gain 39 165 -107.31 gain 165 39 -110.63 gain 39 166 -108.73 gain 166 39 -113.72 gain 39 167 -98.71 gain 167 39 -102.52 gain 39 168 -101.69 gain 168 39 -104.56 gain 39 169 -108.99 gain 169 39 -108.38 gain 39 170 -93.14 gain 170 39 -93.47 gain 39 171 -99.32 gain 171 39 -100.22 gain 39 172 -112.62 gain 172 39 -116.31 gain 39 173 -103.26 gain 173 39 -101.27 gain 39 174 -103.47 gain 174 39 -107.44 gain 39 175 -101.93 gain 175 39 -97.70 gain 39 176 -99.78 gain 176 39 -99.77 gain 39 177 -97.97 gain 177 39 -100.32 gain 39 178 -103.32 gain 178 39 -103.28 gain 39 179 -108.16 gain 179 39 -111.16 gain 39 180 -109.25 gain 180 39 -110.99 gain 39 181 -105.50 gain 181 39 -110.63 gain 39 182 -106.67 gain 182 39 -107.94 gain 39 183 -113.24 gain 183 39 -110.40 gain 39 184 -98.73 gain 184 39 -102.11 gain 39 185 -104.65 gain 185 39 -106.54 gain 39 186 -106.70 gain 186 39 -109.28 gain 39 187 -106.95 gain 187 39 -109.56 gain 39 188 -110.35 gain 188 39 -117.40 gain 39 189 -103.17 gain 189 39 -106.29 gain 39 190 -98.51 gain 190 39 -94.46 gain 39 191 -107.65 gain 191 39 -106.76 gain 39 192 -101.56 gain 192 39 -104.35 gain 39 193 -109.33 gain 193 39 -108.15 gain 39 194 -105.90 gain 194 39 -104.60 gain 39 195 -101.66 gain 195 39 -98.34 gain 39 196 -111.33 gain 196 39 -115.68 gain 39 197 -106.04 gain 197 39 -107.87 gain 39 198 -103.89 gain 198 39 -108.36 gain 39 199 -96.70 gain 199 39 -95.19 gain 39 200 -102.07 gain 200 39 -102.47 gain 39 201 -106.61 gain 201 39 -110.11 gain 39 202 -102.06 gain 202 39 -103.85 gain 39 203 -108.85 gain 203 39 -110.74 gain 39 204 -106.17 gain 204 39 -106.28 gain 39 205 -113.98 gain 205 39 -113.76 gain 39 206 -103.12 gain 206 39 -104.22 gain 39 207 -103.31 gain 207 39 -102.15 gain 39 208 -109.57 gain 208 39 -111.72 gain 39 209 -108.09 gain 209 39 -109.28 gain 39 210 -104.99 gain 210 39 -110.17 gain 39 211 -110.72 gain 211 39 -113.30 gain 39 212 -108.74 gain 212 39 -109.87 gain 39 213 -107.11 gain 213 39 -110.97 gain 39 214 -102.14 gain 214 39 -104.19 gain 39 215 -101.10 gain 215 39 -104.96 gain 39 216 -114.22 gain 216 39 -114.97 gain 39 217 -110.61 gain 217 39 -115.82 gain 39 218 -106.76 gain 218 39 -113.29 gain 39 219 -104.83 gain 219 39 -108.93 gain 39 220 -106.67 gain 220 39 -107.89 gain 39 221 -106.49 gain 221 39 -108.69 gain 39 222 -107.20 gain 222 39 -105.99 gain 39 223 -99.05 gain 223 39 -100.12 gain 39 224 -101.45 gain 224 39 -99.45 gain 40 41 -73.24 gain 41 40 -72.88 gain 40 42 -88.36 gain 42 40 -91.02 gain 40 43 -89.85 gain 43 40 -93.04 gain 40 44 -96.26 gain 44 40 -97.44 gain 40 45 -106.04 gain 45 40 -103.24 gain 40 46 -103.22 gain 46 40 -103.29 gain 40 47 -102.75 gain 47 40 -104.67 gain 40 48 -106.98 gain 48 40 -105.91 gain 40 49 -103.05 gain 49 40 -98.61 gain 40 50 -94.59 gain 50 40 -92.05 gain 40 51 -98.07 gain 51 40 -97.31 gain 40 52 -95.30 gain 52 40 -90.97 gain 40 53 -88.35 gain 53 40 -88.51 gain 40 54 -85.98 gain 54 40 -82.66 gain 40 55 -74.36 gain 55 40 -74.17 gain 40 56 -77.04 gain 56 40 -79.94 gain 40 57 -89.15 gain 57 40 -94.09 gain 40 58 -89.84 gain 58 40 -94.33 gain 40 59 -97.20 gain 59 40 -99.85 gain 40 60 -108.92 gain 60 40 -109.98 gain 40 61 -103.21 gain 61 40 -97.15 gain 40 62 -105.61 gain 62 40 -102.36 gain 40 63 -98.86 gain 63 40 -94.62 gain 40 64 -99.62 gain 64 40 -99.76 gain 40 65 -93.68 gain 65 40 -93.86 gain 40 66 -93.06 gain 66 40 -92.55 gain 40 67 -93.74 gain 67 40 -93.35 gain 40 68 -97.28 gain 68 40 -96.85 gain 40 69 -87.28 gain 69 40 -85.11 gain 40 70 -88.56 gain 70 40 -89.09 gain 40 71 -93.38 gain 71 40 -94.66 gain 40 72 -83.48 gain 72 40 -86.61 gain 40 73 -100.45 gain 73 40 -100.63 gain 40 74 -93.11 gain 74 40 -89.29 gain 40 75 -108.28 gain 75 40 -104.84 gain 40 76 -100.75 gain 76 40 -99.80 gain 40 77 -106.00 gain 77 40 -103.35 gain 40 78 -99.67 gain 78 40 -105.67 gain 40 79 -101.51 gain 79 40 -102.04 gain 40 80 -96.79 gain 80 40 -95.65 gain 40 81 -95.13 gain 81 40 -98.27 gain 40 82 -96.52 gain 82 40 -98.82 gain 40 83 -91.67 gain 83 40 -93.54 gain 40 84 -94.09 gain 84 40 -93.04 gain 40 85 -90.60 gain 85 40 -94.13 gain 40 86 -87.14 gain 86 40 -83.86 gain 40 87 -95.53 gain 87 40 -95.04 gain 40 88 -87.16 gain 88 40 -86.96 gain 40 89 -106.06 gain 89 40 -106.49 gain 40 90 -109.36 gain 90 40 -113.33 gain 40 91 -105.41 gain 91 40 -104.97 gain 40 92 -93.84 gain 92 40 -96.96 gain 40 93 -102.88 gain 93 40 -99.92 gain 40 94 -105.74 gain 94 40 -105.21 gain 40 95 -101.60 gain 95 40 -104.12 gain 40 96 -99.05 gain 96 40 -97.83 gain 40 97 -96.10 gain 97 40 -96.16 gain 40 98 -91.52 gain 98 40 -88.75 gain 40 99 -93.93 gain 99 40 -95.26 gain 40 100 -92.48 gain 100 40 -91.65 gain 40 101 -97.40 gain 101 40 -95.23 gain 40 102 -97.01 gain 102 40 -95.50 gain 40 103 -94.76 gain 103 40 -92.48 gain 40 104 -97.55 gain 104 40 -91.70 gain 40 105 -102.67 gain 105 40 -102.22 gain 40 106 -108.91 gain 106 40 -107.77 gain 40 107 -102.47 gain 107 40 -104.34 gain 40 108 -107.13 gain 108 40 -107.06 gain 40 109 -98.58 gain 109 40 -95.36 gain 40 110 -94.52 gain 110 40 -93.54 gain 40 111 -98.03 gain 111 40 -94.25 gain 40 112 -102.33 gain 112 40 -100.55 gain 40 113 -100.77 gain 113 40 -105.93 gain 40 114 -99.52 gain 114 40 -100.31 gain 40 115 -97.34 gain 115 40 -98.99 gain 40 116 -98.55 gain 116 40 -96.22 gain 40 117 -97.43 gain 117 40 -94.95 gain 40 118 -100.36 gain 118 40 -106.05 gain 40 119 -99.49 gain 119 40 -96.73 gain 40 120 -114.58 gain 120 40 -111.92 gain 40 121 -111.86 gain 121 40 -111.94 gain 40 122 -104.15 gain 122 40 -106.80 gain 40 123 -106.90 gain 123 40 -109.82 gain 40 124 -112.88 gain 124 40 -109.40 gain 40 125 -102.93 gain 125 40 -101.38 gain 40 126 -98.20 gain 126 40 -101.53 gain 40 127 -100.01 gain 127 40 -98.09 gain 40 128 -93.99 gain 128 40 -95.14 gain 40 129 -97.76 gain 129 40 -96.11 gain 40 130 -98.07 gain 130 40 -98.60 gain 40 131 -97.76 gain 131 40 -96.65 gain 40 132 -99.02 gain 132 40 -94.19 gain 40 133 -101.46 gain 133 40 -101.06 gain 40 134 -101.29 gain 134 40 -98.89 gain 40 135 -108.52 gain 135 40 -101.70 gain 40 136 -109.05 gain 136 40 -111.01 gain 40 137 -107.08 gain 137 40 -105.70 gain 40 138 -114.77 gain 138 40 -115.40 gain 40 139 -104.27 gain 139 40 -106.61 gain 40 140 -104.30 gain 140 40 -106.45 gain 40 141 -100.48 gain 141 40 -98.31 gain 40 142 -101.28 gain 142 40 -100.27 gain 40 143 -96.92 gain 143 40 -98.36 gain 40 144 -100.43 gain 144 40 -97.77 gain 40 145 -104.75 gain 145 40 -106.64 gain 40 146 -103.88 gain 146 40 -102.21 gain 40 147 -104.18 gain 147 40 -103.71 gain 40 148 -102.38 gain 148 40 -102.43 gain 40 149 -105.66 gain 149 40 -102.09 gain 40 150 -116.21 gain 150 40 -116.02 gain 40 151 -108.81 gain 151 40 -111.10 gain 40 152 -105.41 gain 152 40 -106.06 gain 40 153 -106.78 gain 153 40 -107.13 gain 40 154 -109.03 gain 154 40 -110.51 gain 40 155 -101.27 gain 155 40 -100.04 gain 40 156 -102.94 gain 156 40 -102.84 gain 40 157 -103.97 gain 157 40 -105.17 gain 40 158 -102.22 gain 158 40 -105.38 gain 40 159 -103.47 gain 159 40 -100.66 gain 40 160 -109.88 gain 160 40 -108.45 gain 40 161 -105.94 gain 161 40 -105.57 gain 40 162 -107.48 gain 162 40 -106.74 gain 40 163 -111.04 gain 163 40 -107.72 gain 40 164 -102.06 gain 164 40 -105.97 gain 40 165 -103.32 gain 165 40 -104.58 gain 40 166 -105.02 gain 166 40 -107.94 gain 40 167 -104.37 gain 167 40 -106.11 gain 40 168 -106.34 gain 168 40 -107.15 gain 40 169 -104.16 gain 169 40 -101.48 gain 40 170 -103.59 gain 170 40 -101.85 gain 40 171 -107.36 gain 171 40 -106.19 gain 40 172 -103.52 gain 172 40 -105.15 gain 40 173 -98.27 gain 173 40 -94.23 gain 40 174 -103.71 gain 174 40 -105.62 gain 40 175 -106.16 gain 175 40 -99.87 gain 40 176 -108.87 gain 176 40 -106.80 gain 40 177 -99.19 gain 177 40 -99.48 gain 40 178 -102.10 gain 178 40 -99.99 gain 40 179 -110.41 gain 179 40 -111.35 gain 40 180 -122.94 gain 180 40 -122.62 gain 40 181 -103.87 gain 181 40 -106.95 gain 40 182 -103.61 gain 182 40 -102.82 gain 40 183 -110.75 gain 183 40 -105.85 gain 40 184 -103.00 gain 184 40 -104.33 gain 40 185 -101.94 gain 185 40 -101.76 gain 40 186 -105.01 gain 186 40 -105.54 gain 40 187 -105.29 gain 187 40 -105.84 gain 40 188 -107.30 gain 188 40 -112.30 gain 40 189 -107.70 gain 189 40 -108.75 gain 40 190 -99.32 gain 190 40 -93.20 gain 40 191 -102.18 gain 191 40 -99.24 gain 40 192 -110.95 gain 192 40 -111.68 gain 40 193 -105.00 gain 193 40 -101.75 gain 40 194 -102.46 gain 194 40 -99.10 gain 40 195 -111.07 gain 195 40 -105.69 gain 40 196 -112.89 gain 196 40 -115.17 gain 40 197 -112.07 gain 197 40 -111.85 gain 40 198 -101.76 gain 198 40 -104.17 gain 40 199 -106.32 gain 199 40 -102.75 gain 40 200 -116.50 gain 200 40 -114.85 gain 40 201 -111.24 gain 201 40 -112.68 gain 40 202 -106.84 gain 202 40 -106.58 gain 40 203 -104.24 gain 203 40 -104.07 gain 40 204 -100.70 gain 204 40 -98.75 gain 40 205 -101.44 gain 205 40 -99.15 gain 40 206 -102.98 gain 206 40 -102.02 gain 40 207 -108.41 gain 207 40 -105.19 gain 40 208 -100.96 gain 208 40 -101.05 gain 40 209 -110.81 gain 209 40 -109.93 gain 40 210 -114.98 gain 210 40 -118.11 gain 40 211 -110.82 gain 211 40 -111.34 gain 40 212 -106.03 gain 212 40 -105.10 gain 40 213 -112.89 gain 213 40 -114.70 gain 40 214 -116.72 gain 214 40 -116.70 gain 40 215 -116.11 gain 215 40 -117.91 gain 40 216 -108.76 gain 216 40 -107.45 gain 40 217 -108.44 gain 217 40 -111.59 gain 40 218 -106.07 gain 218 40 -110.53 gain 40 219 -107.58 gain 219 40 -109.62 gain 40 220 -107.82 gain 220 40 -106.97 gain 40 221 -101.92 gain 221 40 -102.06 gain 40 222 -110.29 gain 222 40 -107.01 gain 40 223 -105.81 gain 223 40 -104.82 gain 40 224 -108.32 gain 224 40 -104.26 gain 41 42 -81.14 gain 42 41 -84.16 gain 41 43 -94.76 gain 43 41 -98.30 gain 41 44 -89.62 gain 44 41 -91.15 gain 41 45 -106.04 gain 45 41 -103.59 gain 41 46 -109.38 gain 46 41 -109.81 gain 41 47 -101.23 gain 47 41 -103.50 gain 41 48 -98.73 gain 48 41 -98.01 gain 41 49 -97.94 gain 49 41 -93.86 gain 41 50 -95.73 gain 50 41 -93.54 gain 41 51 -96.90 gain 51 41 -96.50 gain 41 52 -89.51 gain 52 41 -85.54 gain 41 53 -87.30 gain 53 41 -87.82 gain 41 54 -89.69 gain 54 41 -86.73 gain 41 55 -79.92 gain 55 41 -80.09 gain 41 56 -80.05 gain 56 41 -83.31 gain 41 57 -82.97 gain 57 41 -88.27 gain 41 58 -82.60 gain 58 41 -87.45 gain 41 59 -89.23 gain 59 41 -92.24 gain 41 60 -108.59 gain 60 41 -110.01 gain 41 61 -99.72 gain 61 41 -94.02 gain 41 62 -104.45 gain 62 41 -101.55 gain 41 63 -106.41 gain 63 41 -102.52 gain 41 64 -98.55 gain 64 41 -99.05 gain 41 65 -104.84 gain 65 41 -105.38 gain 41 66 -98.58 gain 66 41 -98.42 gain 41 67 -99.92 gain 67 41 -99.89 gain 41 68 -91.89 gain 68 41 -91.81 gain 41 69 -92.90 gain 69 41 -91.08 gain 41 70 -89.27 gain 70 41 -90.15 gain 41 71 -79.88 gain 71 41 -81.52 gain 41 72 -85.60 gain 72 41 -89.08 gain 41 73 -85.42 gain 73 41 -85.96 gain 41 74 -89.38 gain 74 41 -85.91 gain 41 75 -111.58 gain 75 41 -108.49 gain 41 76 -103.26 gain 76 41 -102.67 gain 41 77 -98.24 gain 77 41 -95.95 gain 41 78 -104.24 gain 78 41 -110.59 gain 41 79 -102.90 gain 79 41 -103.79 gain 41 80 -100.94 gain 80 41 -100.16 gain 41 81 -91.82 gain 81 41 -95.31 gain 41 82 -96.68 gain 82 41 -99.33 gain 41 83 -92.19 gain 83 41 -94.42 gain 41 84 -95.37 gain 84 41 -94.68 gain 41 85 -91.90 gain 85 41 -95.78 gain 41 86 -89.69 gain 86 41 -86.76 gain 41 87 -87.97 gain 87 41 -87.84 gain 41 88 -92.44 gain 88 41 -92.59 gain 41 89 -90.78 gain 89 41 -91.56 gain 41 90 -106.11 gain 90 41 -110.43 gain 41 91 -106.69 gain 91 41 -106.60 gain 41 92 -101.28 gain 92 41 -104.76 gain 41 93 -109.17 gain 93 41 -106.56 gain 41 94 -106.00 gain 94 41 -105.82 gain 41 95 -97.73 gain 95 41 -100.60 gain 41 96 -102.89 gain 96 41 -102.03 gain 41 97 -98.13 gain 97 41 -98.54 gain 41 98 -97.01 gain 98 41 -94.60 gain 41 99 -100.38 gain 99 41 -102.06 gain 41 100 -88.53 gain 100 41 -88.05 gain 41 101 -101.65 gain 101 41 -99.83 gain 41 102 -87.03 gain 102 41 -85.88 gain 41 103 -100.43 gain 103 41 -98.50 gain 41 104 -98.53 gain 104 41 -93.04 gain 41 105 -111.16 gain 105 41 -111.07 gain 41 106 -105.59 gain 106 41 -104.81 gain 41 107 -113.81 gain 107 41 -116.03 gain 41 108 -104.43 gain 108 41 -104.72 gain 41 109 -106.35 gain 109 41 -103.48 gain 41 110 -104.00 gain 110 41 -103.38 gain 41 111 -99.12 gain 111 41 -95.69 gain 41 112 -100.16 gain 112 41 -98.74 gain 41 113 -100.54 gain 113 41 -106.05 gain 41 114 -99.38 gain 114 41 -100.53 gain 41 115 -102.29 gain 115 41 -104.29 gain 41 116 -97.66 gain 116 41 -95.69 gain 41 117 -98.15 gain 117 41 -96.02 gain 41 118 -102.25 gain 118 41 -108.30 gain 41 119 -104.83 gain 119 41 -102.43 gain 41 120 -103.65 gain 120 41 -101.35 gain 41 121 -109.11 gain 121 41 -109.55 gain 41 122 -100.40 gain 122 41 -103.42 gain 41 123 -100.95 gain 123 41 -104.22 gain 41 124 -104.38 gain 124 41 -101.25 gain 41 125 -107.73 gain 125 41 -106.54 gain 41 126 -110.68 gain 126 41 -114.36 gain 41 127 -96.53 gain 127 41 -94.97 gain 41 128 -101.08 gain 128 41 -102.57 gain 41 129 -93.21 gain 129 41 -91.92 gain 41 130 -98.65 gain 130 41 -99.54 gain 41 131 -93.88 gain 131 41 -93.13 gain 41 132 -95.12 gain 132 41 -90.65 gain 41 133 -103.70 gain 133 41 -103.66 gain 41 134 -108.44 gain 134 41 -106.39 gain 41 135 -105.00 gain 135 41 -98.54 gain 41 136 -107.53 gain 136 41 -109.85 gain 41 137 -106.37 gain 137 41 -105.34 gain 41 138 -109.28 gain 138 41 -110.27 gain 41 139 -107.07 gain 139 41 -109.77 gain 41 140 -98.79 gain 140 41 -101.29 gain 41 141 -103.44 gain 141 41 -101.63 gain 41 142 -93.65 gain 142 41 -92.99 gain 41 143 -106.52 gain 143 41 -108.31 gain 41 144 -99.86 gain 144 41 -97.55 gain 41 145 -103.56 gain 145 41 -105.80 gain 41 146 -104.03 gain 146 41 -102.72 gain 41 147 -100.67 gain 147 41 -100.55 gain 41 148 -100.40 gain 148 41 -100.80 gain 41 149 -106.18 gain 149 41 -102.96 gain 41 150 -103.77 gain 150 41 -103.94 gain 41 151 -110.02 gain 151 41 -112.66 gain 41 152 -108.99 gain 152 41 -109.99 gain 41 153 -106.54 gain 153 41 -107.24 gain 41 154 -107.69 gain 154 41 -109.52 gain 41 155 -109.06 gain 155 41 -108.18 gain 41 156 -95.84 gain 156 41 -96.10 gain 41 157 -106.92 gain 157 41 -108.47 gain 41 158 -104.49 gain 158 41 -108.00 gain 41 159 -102.25 gain 159 41 -99.80 gain 41 160 -107.73 gain 160 41 -106.66 gain 41 161 -107.81 gain 161 41 -107.80 gain 41 162 -100.29 gain 162 41 -99.90 gain 41 163 -98.40 gain 163 41 -95.44 gain 41 164 -107.82 gain 164 41 -112.08 gain 41 165 -114.65 gain 165 41 -116.27 gain 41 166 -114.81 gain 166 41 -118.09 gain 41 167 -109.63 gain 167 41 -111.73 gain 41 168 -111.68 gain 168 41 -112.85 gain 41 169 -107.83 gain 169 41 -105.51 gain 41 170 -103.98 gain 170 41 -102.60 gain 41 171 -107.15 gain 171 41 -106.34 gain 41 172 -106.01 gain 172 41 -108.00 gain 41 173 -108.63 gain 173 41 -104.94 gain 41 174 -102.18 gain 174 41 -104.44 gain 41 175 -106.18 gain 175 41 -100.24 gain 41 176 -106.37 gain 176 41 -104.66 gain 41 177 -103.71 gain 177 41 -104.36 gain 41 178 -111.63 gain 178 41 -109.89 gain 41 179 -102.24 gain 179 41 -103.54 gain 41 180 -120.04 gain 180 41 -120.07 gain 41 181 -110.13 gain 181 41 -113.56 gain 41 182 -105.39 gain 182 41 -104.96 gain 41 183 -103.05 gain 183 41 -98.50 gain 41 184 -114.29 gain 184 41 -115.97 gain 41 185 -109.19 gain 185 41 -109.37 gain 41 186 -107.93 gain 186 41 -108.81 gain 41 187 -113.24 gain 187 41 -114.15 gain 41 188 -103.27 gain 188 41 -108.62 gain 41 189 -103.80 gain 189 41 -105.21 gain 41 190 -108.46 gain 190 41 -102.70 gain 41 191 -104.83 gain 191 41 -102.24 gain 41 192 -102.89 gain 192 41 -103.97 gain 41 193 -105.32 gain 193 41 -102.42 gain 41 194 -108.24 gain 194 41 -105.23 gain 41 195 -113.15 gain 195 41 -108.12 gain 41 196 -104.26 gain 196 41 -106.89 gain 41 197 -113.40 gain 197 41 -113.53 gain 41 198 -113.07 gain 198 41 -115.84 gain 41 199 -107.90 gain 199 41 -104.69 gain 41 200 -111.76 gain 200 41 -110.46 gain 41 201 -103.55 gain 201 41 -105.35 gain 41 202 -104.21 gain 202 41 -104.30 gain 41 203 -104.80 gain 203 41 -104.99 gain 41 204 -102.88 gain 204 41 -101.29 gain 41 205 -111.29 gain 205 41 -109.37 gain 41 206 -116.36 gain 206 41 -115.76 gain 41 207 -100.30 gain 207 41 -97.44 gain 41 208 -106.47 gain 208 41 -106.91 gain 41 209 -110.07 gain 209 41 -109.56 gain 41 210 -110.15 gain 210 41 -113.63 gain 41 211 -110.69 gain 211 41 -111.57 gain 41 212 -108.10 gain 212 41 -107.52 gain 41 213 -106.72 gain 213 41 -108.88 gain 41 214 -110.99 gain 214 41 -111.33 gain 41 215 -115.89 gain 215 41 -118.05 gain 41 216 -117.83 gain 216 41 -116.88 gain 41 217 -102.82 gain 217 41 -106.33 gain 41 218 -107.68 gain 218 41 -112.50 gain 41 219 -108.70 gain 219 41 -111.10 gain 41 220 -112.97 gain 220 41 -112.48 gain 41 221 -105.25 gain 221 41 -105.75 gain 41 222 -114.72 gain 222 41 -111.79 gain 41 223 -101.95 gain 223 41 -101.32 gain 41 224 -107.83 gain 224 41 -104.13 gain 42 43 -76.51 gain 43 42 -77.02 gain 42 44 -87.93 gain 44 42 -86.44 gain 42 45 -101.78 gain 45 42 -96.31 gain 42 46 -111.61 gain 46 42 -109.01 gain 42 47 -110.77 gain 47 42 -110.03 gain 42 48 -109.68 gain 48 42 -105.94 gain 42 49 -103.23 gain 49 42 -96.12 gain 42 50 -98.82 gain 50 42 -93.61 gain 42 51 -103.74 gain 51 42 -100.32 gain 42 52 -105.21 gain 52 42 -98.21 gain 42 53 -99.38 gain 53 42 -96.88 gain 42 54 -96.41 gain 54 42 -90.43 gain 42 55 -87.80 gain 55 42 -84.94 gain 42 56 -89.03 gain 56 42 -89.27 gain 42 57 -82.54 gain 57 42 -84.82 gain 42 58 -75.04 gain 58 42 -76.87 gain 42 59 -87.41 gain 59 42 -87.39 gain 42 60 -111.12 gain 60 42 -109.52 gain 42 61 -108.02 gain 61 42 -99.30 gain 42 62 -107.66 gain 62 42 -101.74 gain 42 63 -107.59 gain 63 42 -100.68 gain 42 64 -112.67 gain 64 42 -110.15 gain 42 65 -105.53 gain 65 42 -103.05 gain 42 66 -102.23 gain 66 42 -99.05 gain 42 67 -101.26 gain 67 42 -98.20 gain 42 68 -101.90 gain 68 42 -98.80 gain 42 69 -93.21 gain 69 42 -88.37 gain 42 70 -95.93 gain 70 42 -93.79 gain 42 71 -93.96 gain 71 42 -92.57 gain 42 72 -85.45 gain 72 42 -85.92 gain 42 73 -90.10 gain 73 42 -87.62 gain 42 74 -86.15 gain 74 42 -79.66 gain 42 75 -113.50 gain 75 42 -107.39 gain 42 76 -104.07 gain 76 42 -100.46 gain 42 77 -110.86 gain 77 42 -105.55 gain 42 78 -112.01 gain 78 42 -115.33 gain 42 79 -112.05 gain 79 42 -109.91 gain 42 80 -103.30 gain 80 42 -99.49 gain 42 81 -101.86 gain 81 42 -102.33 gain 42 82 -103.28 gain 82 42 -102.92 gain 42 83 -103.52 gain 83 42 -102.73 gain 42 84 -94.52 gain 84 42 -90.81 gain 42 85 -91.72 gain 85 42 -92.58 gain 42 86 -93.78 gain 86 42 -87.83 gain 42 87 -89.45 gain 87 42 -86.30 gain 42 88 -90.63 gain 88 42 -87.76 gain 42 89 -90.83 gain 89 42 -88.59 gain 42 90 -107.92 gain 90 42 -109.22 gain 42 91 -107.24 gain 91 42 -104.13 gain 42 92 -111.06 gain 92 42 -111.52 gain 42 93 -107.49 gain 93 42 -101.86 gain 42 94 -106.57 gain 94 42 -103.37 gain 42 95 -108.44 gain 95 42 -108.29 gain 42 96 -104.57 gain 96 42 -100.68 gain 42 97 -103.29 gain 97 42 -100.68 gain 42 98 -102.90 gain 98 42 -97.47 gain 42 99 -104.38 gain 99 42 -103.04 gain 42 100 -93.23 gain 100 42 -89.73 gain 42 101 -96.62 gain 101 42 -91.78 gain 42 102 -93.84 gain 102 42 -89.66 gain 42 103 -102.63 gain 103 42 -97.68 gain 42 104 -99.60 gain 104 42 -91.09 gain 42 105 -113.71 gain 105 42 -110.60 gain 42 106 -109.10 gain 106 42 -105.29 gain 42 107 -106.33 gain 107 42 -105.54 gain 42 108 -114.31 gain 108 42 -111.58 gain 42 109 -101.71 gain 109 42 -95.82 gain 42 110 -112.01 gain 110 42 -108.37 gain 42 111 -104.62 gain 111 42 -98.17 gain 42 112 -97.60 gain 112 42 -93.16 gain 42 113 -107.04 gain 113 42 -109.53 gain 42 114 -98.13 gain 114 42 -96.26 gain 42 115 -101.36 gain 115 42 -100.34 gain 42 116 -97.83 gain 116 42 -92.84 gain 42 117 -94.11 gain 117 42 -88.96 gain 42 118 -94.40 gain 118 42 -97.42 gain 42 119 -99.34 gain 119 42 -93.91 gain 42 120 -109.43 gain 120 42 -104.10 gain 42 121 -103.00 gain 121 42 -100.42 gain 42 122 -111.67 gain 122 42 -111.66 gain 42 123 -111.38 gain 123 42 -111.62 gain 42 124 -99.87 gain 124 42 -93.72 gain 42 125 -112.71 gain 125 42 -108.49 gain 42 126 -102.25 gain 126 42 -102.92 gain 42 127 -106.31 gain 127 42 -101.73 gain 42 128 -103.91 gain 128 42 -102.39 gain 42 129 -102.59 gain 129 42 -98.28 gain 42 130 -99.89 gain 130 42 -97.76 gain 42 131 -104.40 gain 131 42 -100.63 gain 42 132 -97.78 gain 132 42 -90.28 gain 42 133 -103.55 gain 133 42 -100.49 gain 42 134 -98.02 gain 134 42 -92.95 gain 42 135 -117.09 gain 135 42 -107.61 gain 42 136 -108.95 gain 136 42 -108.24 gain 42 137 -106.22 gain 137 42 -102.17 gain 42 138 -107.95 gain 138 42 -105.91 gain 42 139 -108.53 gain 139 42 -108.21 gain 42 140 -113.03 gain 140 42 -112.51 gain 42 141 -102.55 gain 141 42 -97.72 gain 42 142 -108.35 gain 142 42 -104.67 gain 42 143 -108.14 gain 143 42 -106.91 gain 42 144 -104.67 gain 144 42 -99.34 gain 42 145 -107.57 gain 145 42 -106.79 gain 42 146 -107.77 gain 146 42 -103.44 gain 42 147 -98.78 gain 147 42 -95.64 gain 42 148 -103.85 gain 148 42 -101.23 gain 42 149 -101.67 gain 149 42 -95.43 gain 42 150 -114.49 gain 150 42 -111.63 gain 42 151 -108.78 gain 151 42 -108.40 gain 42 152 -119.43 gain 152 42 -117.41 gain 42 153 -115.46 gain 153 42 -113.14 gain 42 154 -112.24 gain 154 42 -111.05 gain 42 155 -110.00 gain 155 42 -106.10 gain 42 156 -113.06 gain 156 42 -110.29 gain 42 157 -106.08 gain 157 42 -104.61 gain 42 158 -99.52 gain 158 42 -100.01 gain 42 159 -101.36 gain 159 42 -95.89 gain 42 160 -102.46 gain 160 42 -98.37 gain 42 161 -104.66 gain 161 42 -101.62 gain 42 162 -100.38 gain 162 42 -96.97 gain 42 163 -102.87 gain 163 42 -96.89 gain 42 164 -105.58 gain 164 42 -106.82 gain 42 165 -112.61 gain 165 42 -111.21 gain 42 166 -108.46 gain 166 42 -108.71 gain 42 167 -112.20 gain 167 42 -111.28 gain 42 168 -110.55 gain 168 42 -108.70 gain 42 169 -114.25 gain 169 42 -108.91 gain 42 170 -109.47 gain 170 42 -105.06 gain 42 171 -99.89 gain 171 42 -96.06 gain 42 172 -117.39 gain 172 42 -116.36 gain 42 173 -107.01 gain 173 42 -100.30 gain 42 174 -102.73 gain 174 42 -101.98 gain 42 175 -113.66 gain 175 42 -104.70 gain 42 176 -102.61 gain 176 42 -97.87 gain 42 177 -109.41 gain 177 42 -107.04 gain 42 178 -110.41 gain 178 42 -105.64 gain 42 179 -106.40 gain 179 42 -104.67 gain 42 180 -105.61 gain 180 42 -102.62 gain 42 181 -116.18 gain 181 42 -116.59 gain 42 182 -115.27 gain 182 42 -111.81 gain 42 183 -116.41 gain 183 42 -108.84 gain 42 184 -113.09 gain 184 42 -111.74 gain 42 185 -118.02 gain 185 42 -115.17 gain 42 186 -114.14 gain 186 42 -112.00 gain 42 187 -106.63 gain 187 42 -104.51 gain 42 188 -111.08 gain 188 42 -113.41 gain 42 189 -107.12 gain 189 42 -105.50 gain 42 190 -102.25 gain 190 42 -93.47 gain 42 191 -110.37 gain 191 42 -104.76 gain 42 192 -105.92 gain 192 42 -103.99 gain 42 193 -105.13 gain 193 42 -99.22 gain 42 194 -110.06 gain 194 42 -104.04 gain 42 195 -115.95 gain 195 42 -107.89 gain 42 196 -112.06 gain 196 42 -111.68 gain 42 197 -112.70 gain 197 42 -109.80 gain 42 198 -114.68 gain 198 42 -114.43 gain 42 199 -109.20 gain 199 42 -102.96 gain 42 200 -107.24 gain 200 42 -102.93 gain 42 201 -113.80 gain 201 42 -112.57 gain 42 202 -111.50 gain 202 42 -108.57 gain 42 203 -108.51 gain 203 42 -105.68 gain 42 204 -115.58 gain 204 42 -110.97 gain 42 205 -111.46 gain 205 42 -106.51 gain 42 206 -115.48 gain 206 42 -111.86 gain 42 207 -118.79 gain 207 42 -112.91 gain 42 208 -107.44 gain 208 42 -104.86 gain 42 209 -117.25 gain 209 42 -113.71 gain 42 210 -120.67 gain 210 42 -121.13 gain 42 211 -109.19 gain 211 42 -107.04 gain 42 212 -110.65 gain 212 42 -107.05 gain 42 213 -114.67 gain 213 42 -113.81 gain 42 214 -114.02 gain 214 42 -111.34 gain 42 215 -117.02 gain 215 42 -116.16 gain 42 216 -111.88 gain 216 42 -107.91 gain 42 217 -108.35 gain 217 42 -108.83 gain 42 218 -114.01 gain 218 42 -115.81 gain 42 219 -110.90 gain 219 42 -110.28 gain 42 220 -107.43 gain 220 42 -103.91 gain 42 221 -109.04 gain 221 42 -106.52 gain 42 222 -113.74 gain 222 42 -107.80 gain 42 223 -107.91 gain 223 42 -104.25 gain 42 224 -111.88 gain 224 42 -105.16 gain 43 44 -83.90 gain 44 43 -81.89 gain 43 45 -120.41 gain 45 43 -114.42 gain 43 46 -116.09 gain 46 43 -112.98 gain 43 47 -103.57 gain 47 43 -102.31 gain 43 48 -117.15 gain 48 43 -112.89 gain 43 49 -109.10 gain 49 43 -101.48 gain 43 50 -110.29 gain 50 43 -104.57 gain 43 51 -106.22 gain 51 43 -102.29 gain 43 52 -101.04 gain 52 43 -93.53 gain 43 53 -96.58 gain 53 43 -93.57 gain 43 54 -96.57 gain 54 43 -90.07 gain 43 55 -96.91 gain 55 43 -93.54 gain 43 56 -86.90 gain 56 43 -86.62 gain 43 57 -81.86 gain 57 43 -83.62 gain 43 58 -78.08 gain 58 43 -79.38 gain 43 59 -87.69 gain 59 43 -87.16 gain 43 60 -111.03 gain 60 43 -108.91 gain 43 61 -114.20 gain 61 43 -104.96 gain 43 62 -103.55 gain 62 43 -97.11 gain 43 63 -111.56 gain 63 43 -104.13 gain 43 64 -106.90 gain 64 43 -103.86 gain 43 65 -113.39 gain 65 43 -110.39 gain 43 66 -98.17 gain 66 43 -94.48 gain 43 67 -98.06 gain 67 43 -94.48 gain 43 68 -104.05 gain 68 43 -100.43 gain 43 69 -98.23 gain 69 43 -92.87 gain 43 70 -95.95 gain 70 43 -93.29 gain 43 71 -94.78 gain 71 43 -92.88 gain 43 72 -89.90 gain 72 43 -89.85 gain 43 73 -86.56 gain 73 43 -83.56 gain 43 74 -91.61 gain 74 43 -84.60 gain 43 75 -108.89 gain 75 43 -102.27 gain 43 76 -102.53 gain 76 43 -98.40 gain 43 77 -110.03 gain 77 43 -104.20 gain 43 78 -109.97 gain 78 43 -112.78 gain 43 79 -104.82 gain 79 43 -102.17 gain 43 80 -102.90 gain 80 43 -98.58 gain 43 81 -110.84 gain 81 43 -110.80 gain 43 82 -106.23 gain 82 43 -105.35 gain 43 83 -103.54 gain 83 43 -102.24 gain 43 84 -94.37 gain 84 43 -90.14 gain 43 85 -93.38 gain 85 43 -93.73 gain 43 86 -95.93 gain 86 43 -89.46 gain 43 87 -94.47 gain 87 43 -90.80 gain 43 88 -95.05 gain 88 43 -91.66 gain 43 89 -98.73 gain 89 43 -95.98 gain 43 90 -110.53 gain 90 43 -111.32 gain 43 91 -104.92 gain 91 43 -101.29 gain 43 92 -111.87 gain 92 43 -111.81 gain 43 93 -110.70 gain 93 43 -104.56 gain 43 94 -106.61 gain 94 43 -102.90 gain 43 95 -111.55 gain 95 43 -110.87 gain 43 96 -100.95 gain 96 43 -96.55 gain 43 97 -105.52 gain 97 43 -102.40 gain 43 98 -94.10 gain 98 43 -88.15 gain 43 99 -103.78 gain 99 43 -101.93 gain 43 100 -93.06 gain 100 43 -89.05 gain 43 101 -104.67 gain 101 43 -99.32 gain 43 102 -100.49 gain 102 43 -95.79 gain 43 103 -93.43 gain 103 43 -87.97 gain 43 104 -100.13 gain 104 43 -91.10 gain 43 105 -110.25 gain 105 43 -106.62 gain 43 106 -119.07 gain 106 43 -114.75 gain 43 107 -111.36 gain 107 43 -110.06 gain 43 108 -115.91 gain 108 43 -112.66 gain 43 109 -117.86 gain 109 43 -111.46 gain 43 110 -108.59 gain 110 43 -104.43 gain 43 111 -107.11 gain 111 43 -100.14 gain 43 112 -110.08 gain 112 43 -105.12 gain 43 113 -109.08 gain 113 43 -111.05 gain 43 114 -96.52 gain 114 43 -94.13 gain 43 115 -95.75 gain 115 43 -94.21 gain 43 116 -96.16 gain 116 43 -90.65 gain 43 117 -97.04 gain 117 43 -91.37 gain 43 118 -95.13 gain 118 43 -97.64 gain 43 119 -99.95 gain 119 43 -94.01 gain 43 120 -114.23 gain 120 43 -108.39 gain 43 121 -115.73 gain 121 43 -112.64 gain 43 122 -114.26 gain 122 43 -113.73 gain 43 123 -107.75 gain 123 43 -107.48 gain 43 124 -106.80 gain 124 43 -100.13 gain 43 125 -111.06 gain 125 43 -106.33 gain 43 126 -108.03 gain 126 43 -108.18 gain 43 127 -104.65 gain 127 43 -99.55 gain 43 128 -105.78 gain 128 43 -103.73 gain 43 129 -95.26 gain 129 43 -90.44 gain 43 130 -103.64 gain 130 43 -101.00 gain 43 131 -104.19 gain 131 43 -99.91 gain 43 132 -103.72 gain 132 43 -95.71 gain 43 133 -103.57 gain 133 43 -99.99 gain 43 134 -100.04 gain 134 43 -94.46 gain 43 135 -119.50 gain 135 43 -109.50 gain 43 136 -112.00 gain 136 43 -110.77 gain 43 137 -115.93 gain 137 43 -111.37 gain 43 138 -110.14 gain 138 43 -107.59 gain 43 139 -117.51 gain 139 43 -116.66 gain 43 140 -113.86 gain 140 43 -112.82 gain 43 141 -115.41 gain 141 43 -110.07 gain 43 142 -111.68 gain 142 43 -107.48 gain 43 143 -106.16 gain 143 43 -104.41 gain 43 144 -105.42 gain 144 43 -99.58 gain 43 145 -96.27 gain 145 43 -94.98 gain 43 146 -103.77 gain 146 43 -98.92 gain 43 147 -109.83 gain 147 43 -106.17 gain 43 148 -100.90 gain 148 43 -97.77 gain 43 149 -106.49 gain 149 43 -99.73 gain 43 150 -113.02 gain 150 43 -109.65 gain 43 151 -112.91 gain 151 43 -112.01 gain 43 152 -114.38 gain 152 43 -111.84 gain 43 153 -109.37 gain 153 43 -106.53 gain 43 154 -101.38 gain 154 43 -99.68 gain 43 155 -111.69 gain 155 43 -107.27 gain 43 156 -108.63 gain 156 43 -105.35 gain 43 157 -114.47 gain 157 43 -112.49 gain 43 158 -107.48 gain 158 43 -107.46 gain 43 159 -103.04 gain 159 43 -97.06 gain 43 160 -104.66 gain 160 43 -100.05 gain 43 161 -108.14 gain 161 43 -104.59 gain 43 162 -103.96 gain 162 43 -100.03 gain 43 163 -104.50 gain 163 43 -98.00 gain 43 164 -104.98 gain 164 43 -105.71 gain 43 165 -112.06 gain 165 43 -110.14 gain 43 166 -114.42 gain 166 43 -114.16 gain 43 167 -109.90 gain 167 43 -108.47 gain 43 168 -111.84 gain 168 43 -109.47 gain 43 169 -109.23 gain 169 43 -103.37 gain 43 170 -113.09 gain 170 43 -108.18 gain 43 171 -112.63 gain 171 43 -108.28 gain 43 172 -110.05 gain 172 43 -108.50 gain 43 173 -107.32 gain 173 43 -100.09 gain 43 174 -106.65 gain 174 43 -105.38 gain 43 175 -109.44 gain 175 43 -99.96 gain 43 176 -101.97 gain 176 43 -96.71 gain 43 177 -106.50 gain 177 43 -103.61 gain 43 178 -99.93 gain 178 43 -94.65 gain 43 179 -107.70 gain 179 43 -105.46 gain 43 180 -110.37 gain 180 43 -106.86 gain 43 181 -116.14 gain 181 43 -116.04 gain 43 182 -119.69 gain 182 43 -115.72 gain 43 183 -116.77 gain 183 43 -108.68 gain 43 184 -111.38 gain 184 43 -109.52 gain 43 185 -114.76 gain 185 43 -111.40 gain 43 186 -117.65 gain 186 43 -114.99 gain 43 187 -115.29 gain 187 43 -112.66 gain 43 188 -112.17 gain 188 43 -113.98 gain 43 189 -108.54 gain 189 43 -106.41 gain 43 190 -113.53 gain 190 43 -104.23 gain 43 191 -105.52 gain 191 43 -99.40 gain 43 192 -110.40 gain 192 43 -107.94 gain 43 193 -102.24 gain 193 43 -95.81 gain 43 194 -113.21 gain 194 43 -106.67 gain 43 195 -120.55 gain 195 43 -111.98 gain 43 196 -113.18 gain 196 43 -112.28 gain 43 197 -110.25 gain 197 43 -106.83 gain 43 198 -118.47 gain 198 43 -117.71 gain 43 199 -117.66 gain 199 43 -110.91 gain 43 200 -109.47 gain 200 43 -104.63 gain 43 201 -112.12 gain 201 43 -110.37 gain 43 202 -114.59 gain 202 43 -111.14 gain 43 203 -103.42 gain 203 43 -100.07 gain 43 204 -110.30 gain 204 43 -105.17 gain 43 205 -109.28 gain 205 43 -103.81 gain 43 206 -104.76 gain 206 43 -100.63 gain 43 207 -112.41 gain 207 43 -106.02 gain 43 208 -114.10 gain 208 43 -111.01 gain 43 209 -109.53 gain 209 43 -105.47 gain 43 210 -118.23 gain 210 43 -118.18 gain 43 211 -116.08 gain 211 43 -113.42 gain 43 212 -122.80 gain 212 43 -118.68 gain 43 213 -116.20 gain 213 43 -114.83 gain 43 214 -116.62 gain 214 43 -113.42 gain 43 215 -115.24 gain 215 43 -113.86 gain 43 216 -112.13 gain 216 43 -107.64 gain 43 217 -118.71 gain 217 43 -118.68 gain 43 218 -113.50 gain 218 43 -114.78 gain 43 219 -109.18 gain 219 43 -108.03 gain 43 220 -109.97 gain 220 43 -105.94 gain 43 221 -117.23 gain 221 43 -114.20 gain 43 222 -109.93 gain 222 43 -103.47 gain 43 223 -105.47 gain 223 43 -101.30 gain 43 224 -113.70 gain 224 43 -106.46 gain 44 45 -109.58 gain 45 44 -105.60 gain 44 46 -110.66 gain 46 44 -109.55 gain 44 47 -107.07 gain 47 44 -107.82 gain 44 48 -103.93 gain 48 44 -101.68 gain 44 49 -113.89 gain 49 44 -108.28 gain 44 50 -109.45 gain 50 44 -105.73 gain 44 51 -103.33 gain 51 44 -101.40 gain 44 52 -101.94 gain 52 44 -96.44 gain 44 53 -101.79 gain 53 44 -100.78 gain 44 54 -103.04 gain 54 44 -98.55 gain 44 55 -82.91 gain 55 44 -81.54 gain 44 56 -94.09 gain 56 44 -95.82 gain 44 57 -82.23 gain 57 44 -86.00 gain 44 58 -87.72 gain 58 44 -91.03 gain 44 59 -82.26 gain 59 44 -83.74 gain 44 60 -111.69 gain 60 44 -111.58 gain 44 61 -104.59 gain 61 44 -97.37 gain 44 62 -107.15 gain 62 44 -102.71 gain 44 63 -108.80 gain 63 44 -103.38 gain 44 64 -110.18 gain 64 44 -109.14 gain 44 65 -107.74 gain 65 44 -106.75 gain 44 66 -103.97 gain 66 44 -102.28 gain 44 67 -115.00 gain 67 44 -113.43 gain 44 68 -96.70 gain 68 44 -95.10 gain 44 69 -91.64 gain 69 44 -88.29 gain 44 70 -94.93 gain 70 44 -94.28 gain 44 71 -95.71 gain 71 44 -95.82 gain 44 72 -93.54 gain 72 44 -95.49 gain 44 73 -86.10 gain 73 44 -85.10 gain 44 74 -88.65 gain 74 44 -83.65 gain 44 75 -102.42 gain 75 44 -97.81 gain 44 76 -108.10 gain 76 44 -105.98 gain 44 77 -106.91 gain 77 44 -103.09 gain 44 78 -111.14 gain 78 44 -115.96 gain 44 79 -109.32 gain 79 44 -108.67 gain 44 80 -103.55 gain 80 44 -101.24 gain 44 81 -109.14 gain 81 44 -111.10 gain 44 82 -102.42 gain 82 44 -103.54 gain 44 83 -100.22 gain 83 44 -100.92 gain 44 84 -103.28 gain 84 44 -101.06 gain 44 85 -95.59 gain 85 44 -97.94 gain 44 86 -97.34 gain 86 44 -92.88 gain 44 87 -98.50 gain 87 44 -96.84 gain 44 88 -93.81 gain 88 44 -92.43 gain 44 89 -90.48 gain 89 44 -89.74 gain 44 90 -115.70 gain 90 44 -118.49 gain 44 91 -108.56 gain 91 44 -106.94 gain 44 92 -104.93 gain 92 44 -106.88 gain 44 93 -105.99 gain 93 44 -101.86 gain 44 94 -108.09 gain 94 44 -106.39 gain 44 95 -112.38 gain 95 44 -113.72 gain 44 96 -103.73 gain 96 44 -101.34 gain 44 97 -107.08 gain 97 44 -105.96 gain 44 98 -103.90 gain 98 44 -99.96 gain 44 99 -98.68 gain 99 44 -98.83 gain 44 100 -103.16 gain 100 44 -101.16 gain 44 101 -97.19 gain 101 44 -93.85 gain 44 102 -100.15 gain 102 44 -97.46 gain 44 103 -92.63 gain 103 44 -89.17 gain 44 104 -97.34 gain 104 44 -90.32 gain 44 105 -107.13 gain 105 44 -105.50 gain 44 106 -109.11 gain 106 44 -106.79 gain 44 107 -113.07 gain 107 44 -113.76 gain 44 108 -114.52 gain 108 44 -113.28 gain 44 109 -103.19 gain 109 44 -98.80 gain 44 110 -106.41 gain 110 44 -104.25 gain 44 111 -103.24 gain 111 44 -98.28 gain 44 112 -111.61 gain 112 44 -108.66 gain 44 113 -102.67 gain 113 44 -106.65 gain 44 114 -104.48 gain 114 44 -104.09 gain 44 115 -108.74 gain 115 44 -109.21 gain 44 116 -92.18 gain 116 44 -88.67 gain 44 117 -94.97 gain 117 44 -91.31 gain 44 118 -102.41 gain 118 44 -106.93 gain 44 119 -97.34 gain 119 44 -93.41 gain 44 120 -113.48 gain 120 44 -109.64 gain 44 121 -115.39 gain 121 44 -114.30 gain 44 122 -113.01 gain 122 44 -114.49 gain 44 123 -110.62 gain 123 44 -112.36 gain 44 124 -112.49 gain 124 44 -107.83 gain 44 125 -112.42 gain 125 44 -109.70 gain 44 126 -104.51 gain 126 44 -106.66 gain 44 127 -103.66 gain 127 44 -100.57 gain 44 128 -98.09 gain 128 44 -98.05 gain 44 129 -109.85 gain 129 44 -107.03 gain 44 130 -101.05 gain 130 44 -100.42 gain 44 131 -100.04 gain 131 44 -97.76 gain 44 132 -100.52 gain 132 44 -94.52 gain 44 133 -102.22 gain 133 44 -100.64 gain 44 134 -90.95 gain 134 44 -87.37 gain 44 135 -121.01 gain 135 44 -113.02 gain 44 136 -115.24 gain 136 44 -116.02 gain 44 137 -115.86 gain 137 44 -113.30 gain 44 138 -114.26 gain 138 44 -113.71 gain 44 139 -110.37 gain 139 44 -111.53 gain 44 140 -102.62 gain 140 44 -103.59 gain 44 141 -102.47 gain 141 44 -99.13 gain 44 142 -104.51 gain 142 44 -102.32 gain 44 143 -104.91 gain 143 44 -105.17 gain 44 144 -110.92 gain 144 44 -107.08 gain 44 145 -102.15 gain 145 44 -102.86 gain 44 146 -108.10 gain 146 44 -105.26 gain 44 147 -100.56 gain 147 44 -98.90 gain 44 148 -96.03 gain 148 44 -94.91 gain 44 149 -99.37 gain 149 44 -94.62 gain 44 150 -110.05 gain 150 44 -108.69 gain 44 151 -111.62 gain 151 44 -112.73 gain 44 152 -111.48 gain 152 44 -110.95 gain 44 153 -110.15 gain 153 44 -109.32 gain 44 154 -115.39 gain 154 44 -115.69 gain 44 155 -104.83 gain 155 44 -102.42 gain 44 156 -115.44 gain 156 44 -114.16 gain 44 157 -105.30 gain 157 44 -105.32 gain 44 158 -103.52 gain 158 44 -105.51 gain 44 159 -112.10 gain 159 44 -108.12 gain 44 160 -97.62 gain 160 44 -95.03 gain 44 161 -100.36 gain 161 44 -98.82 gain 44 162 -105.00 gain 162 44 -103.09 gain 44 163 -97.83 gain 163 44 -93.33 gain 44 164 -104.47 gain 164 44 -107.20 gain 44 165 -110.77 gain 165 44 -110.86 gain 44 166 -116.88 gain 166 44 -118.63 gain 44 167 -114.67 gain 167 44 -115.24 gain 44 168 -99.02 gain 168 44 -98.65 gain 44 169 -108.48 gain 169 44 -104.63 gain 44 170 -109.66 gain 170 44 -106.75 gain 44 171 -113.59 gain 171 44 -111.25 gain 44 172 -109.23 gain 172 44 -109.69 gain 44 173 -107.75 gain 173 44 -102.53 gain 44 174 -104.43 gain 174 44 -105.16 gain 44 175 -107.93 gain 175 44 -100.46 gain 44 176 -107.39 gain 176 44 -104.14 gain 44 177 -108.08 gain 177 44 -107.20 gain 44 178 -102.72 gain 178 44 -99.44 gain 44 179 -111.88 gain 179 44 -111.65 gain 44 180 -114.08 gain 180 44 -112.59 gain 44 181 -111.65 gain 181 44 -113.55 gain 44 182 -116.72 gain 182 44 -114.76 gain 44 183 -111.02 gain 183 44 -104.94 gain 44 184 -108.92 gain 184 44 -109.07 gain 44 185 -111.16 gain 185 44 -109.80 gain 44 186 -108.93 gain 186 44 -108.28 gain 44 187 -106.96 gain 187 44 -106.34 gain 44 188 -113.75 gain 188 44 -117.57 gain 44 189 -109.79 gain 189 44 -109.66 gain 44 190 -110.77 gain 190 44 -103.48 gain 44 191 -102.53 gain 191 44 -98.41 gain 44 192 -100.53 gain 192 44 -100.08 gain 44 193 -102.65 gain 193 44 -98.23 gain 44 194 -99.83 gain 194 44 -95.29 gain 44 195 -118.64 gain 195 44 -112.08 gain 44 196 -109.61 gain 196 44 -110.72 gain 44 197 -118.16 gain 197 44 -116.76 gain 44 198 -114.37 gain 198 44 -115.61 gain 44 199 -114.36 gain 199 44 -109.62 gain 44 200 -107.16 gain 200 44 -104.33 gain 44 201 -107.19 gain 201 44 -107.45 gain 44 202 -108.63 gain 202 44 -107.19 gain 44 203 -110.57 gain 203 44 -109.23 gain 44 204 -113.80 gain 204 44 -110.67 gain 44 205 -107.49 gain 205 44 -104.04 gain 44 206 -105.52 gain 206 44 -103.38 gain 44 207 -105.78 gain 207 44 -101.40 gain 44 208 -107.33 gain 208 44 -106.24 gain 44 209 -109.89 gain 209 44 -107.84 gain 44 210 -111.87 gain 210 44 -113.82 gain 44 211 -109.21 gain 211 44 -108.56 gain 44 212 -110.85 gain 212 44 -108.75 gain 44 213 -110.96 gain 213 44 -111.59 gain 44 214 -105.75 gain 214 44 -104.56 gain 44 215 -113.97 gain 215 44 -114.60 gain 44 216 -110.26 gain 216 44 -107.79 gain 44 217 -110.94 gain 217 44 -112.92 gain 44 218 -110.61 gain 218 44 -113.90 gain 44 219 -109.16 gain 219 44 -110.02 gain 44 220 -113.69 gain 220 44 -111.67 gain 44 221 -107.71 gain 221 44 -106.68 gain 44 222 -111.43 gain 222 44 -106.98 gain 44 223 -108.65 gain 223 44 -106.49 gain 44 224 -105.33 gain 224 44 -100.10 gain 45 46 -75.30 gain 46 45 -78.17 gain 45 47 -87.49 gain 47 45 -92.21 gain 45 48 -88.67 gain 48 45 -90.40 gain 45 49 -89.69 gain 49 45 -88.06 gain 45 50 -99.87 gain 50 45 -100.13 gain 45 51 -91.37 gain 51 45 -93.42 gain 45 52 -95.02 gain 52 45 -93.49 gain 45 53 -99.30 gain 53 45 -102.27 gain 45 54 -90.77 gain 54 45 -90.26 gain 45 55 -102.57 gain 55 45 -105.19 gain 45 56 -101.25 gain 56 45 -106.96 gain 45 57 -105.29 gain 57 45 -113.03 gain 45 58 -101.12 gain 58 45 -108.41 gain 45 59 -103.96 gain 59 45 -109.42 gain 45 60 -70.60 gain 60 45 -74.47 gain 45 61 -78.19 gain 61 45 -74.94 gain 45 62 -86.94 gain 62 45 -86.48 gain 45 63 -85.93 gain 63 45 -84.49 gain 45 64 -96.42 gain 64 45 -99.36 gain 45 65 -91.93 gain 65 45 -94.91 gain 45 66 -100.35 gain 66 45 -102.64 gain 45 67 -98.88 gain 67 45 -101.30 gain 45 68 -107.61 gain 68 45 -109.97 gain 45 69 -105.51 gain 69 45 -106.14 gain 45 70 -110.33 gain 70 45 -113.66 gain 45 71 -102.70 gain 71 45 -106.79 gain 45 72 -111.89 gain 72 45 -117.82 gain 45 73 -106.04 gain 73 45 -109.03 gain 45 74 -113.19 gain 74 45 -112.17 gain 45 75 -78.97 gain 75 45 -78.33 gain 45 76 -85.94 gain 76 45 -87.79 gain 45 77 -90.28 gain 77 45 -90.44 gain 45 78 -88.56 gain 78 45 -97.36 gain 45 79 -93.86 gain 79 45 -97.19 gain 45 80 -94.89 gain 80 45 -96.55 gain 45 81 -99.00 gain 81 45 -104.94 gain 45 82 -91.54 gain 82 45 -96.64 gain 45 83 -99.91 gain 83 45 -104.59 gain 45 84 -103.76 gain 84 45 -105.51 gain 45 85 -100.45 gain 85 45 -106.78 gain 45 86 -100.00 gain 86 45 -99.52 gain 45 87 -111.29 gain 87 45 -113.60 gain 45 88 -102.87 gain 88 45 -105.47 gain 45 89 -106.59 gain 89 45 -109.83 gain 45 90 -98.52 gain 90 45 -105.29 gain 45 91 -84.19 gain 91 45 -86.55 gain 45 92 -93.11 gain 92 45 -99.04 gain 45 93 -95.45 gain 93 45 -95.29 gain 45 94 -89.57 gain 94 45 -91.84 gain 45 95 -99.17 gain 95 45 -104.48 gain 45 96 -99.85 gain 96 45 -101.43 gain 45 97 -98.09 gain 97 45 -100.95 gain 45 98 -103.81 gain 98 45 -103.85 gain 45 99 -97.13 gain 99 45 -101.26 gain 45 100 -102.52 gain 100 45 -104.49 gain 45 101 -99.62 gain 101 45 -100.25 gain 45 102 -106.93 gain 102 45 -108.22 gain 45 103 -107.94 gain 103 45 -108.46 gain 45 104 -110.38 gain 104 45 -107.33 gain 45 105 -94.10 gain 105 45 -96.46 gain 45 106 -88.13 gain 106 45 -89.79 gain 45 107 -92.20 gain 107 45 -96.87 gain 45 108 -93.41 gain 108 45 -96.15 gain 45 109 -98.63 gain 109 45 -98.22 gain 45 110 -93.94 gain 110 45 -95.77 gain 45 111 -96.99 gain 111 45 -96.01 gain 45 112 -97.14 gain 112 45 -98.16 gain 45 113 -102.56 gain 113 45 -110.51 gain 45 114 -98.55 gain 114 45 -102.14 gain 45 115 -103.97 gain 115 45 -108.42 gain 45 116 -108.29 gain 116 45 -108.76 gain 45 117 -108.52 gain 117 45 -108.83 gain 45 118 -106.74 gain 118 45 -115.23 gain 45 119 -114.66 gain 119 45 -114.70 gain 45 120 -93.36 gain 120 45 -93.50 gain 45 121 -94.13 gain 121 45 -97.02 gain 45 122 -92.35 gain 122 45 -97.81 gain 45 123 -94.04 gain 123 45 -99.76 gain 45 124 -99.03 gain 124 45 -98.35 gain 45 125 -99.34 gain 125 45 -100.59 gain 45 126 -94.81 gain 126 45 -100.94 gain 45 127 -111.51 gain 127 45 -112.39 gain 45 128 -106.71 gain 128 45 -110.65 gain 45 129 -96.44 gain 129 45 -97.60 gain 45 130 -97.71 gain 130 45 -101.05 gain 45 131 -104.10 gain 131 45 -105.80 gain 45 132 -106.12 gain 132 45 -104.10 gain 45 133 -108.86 gain 133 45 -111.26 gain 45 134 -105.14 gain 134 45 -105.54 gain 45 135 -101.55 gain 135 45 -97.53 gain 45 136 -93.64 gain 136 45 -98.40 gain 45 137 -98.16 gain 137 45 -99.58 gain 45 138 -91.46 gain 138 45 -94.89 gain 45 139 -98.67 gain 139 45 -103.81 gain 45 140 -100.20 gain 140 45 -105.15 gain 45 141 -101.75 gain 141 45 -102.39 gain 45 142 -100.17 gain 142 45 -101.96 gain 45 143 -98.87 gain 143 45 -103.11 gain 45 144 -101.20 gain 144 45 -101.34 gain 45 145 -102.45 gain 145 45 -107.14 gain 45 146 -102.06 gain 146 45 -103.19 gain 45 147 -107.30 gain 147 45 -109.63 gain 45 148 -107.39 gain 148 45 -110.24 gain 45 149 -111.33 gain 149 45 -110.56 gain 45 150 -99.67 gain 150 45 -102.28 gain 45 151 -99.55 gain 151 45 -104.64 gain 45 152 -104.03 gain 152 45 -107.48 gain 45 153 -100.07 gain 153 45 -103.21 gain 45 154 -101.66 gain 154 45 -105.93 gain 45 155 -101.25 gain 155 45 -102.82 gain 45 156 -107.31 gain 156 45 -110.01 gain 45 157 -101.36 gain 157 45 -105.36 gain 45 158 -105.72 gain 158 45 -111.68 gain 45 159 -104.91 gain 159 45 -104.91 gain 45 160 -103.04 gain 160 45 -104.42 gain 45 161 -109.12 gain 161 45 -111.55 gain 45 162 -105.17 gain 162 45 -107.23 gain 45 163 -104.29 gain 163 45 -103.77 gain 45 164 -105.27 gain 164 45 -111.98 gain 45 165 -104.89 gain 165 45 -108.95 gain 45 166 -101.54 gain 166 45 -107.26 gain 45 167 -94.85 gain 167 45 -99.39 gain 45 168 -97.63 gain 168 45 -101.24 gain 45 169 -98.79 gain 169 45 -98.92 gain 45 170 -103.41 gain 170 45 -104.48 gain 45 171 -101.74 gain 171 45 -103.38 gain 45 172 -105.75 gain 172 45 -110.18 gain 45 173 -108.30 gain 173 45 -107.05 gain 45 174 -104.60 gain 174 45 -109.31 gain 45 175 -107.27 gain 175 45 -103.78 gain 45 176 -102.71 gain 176 45 -103.44 gain 45 177 -100.16 gain 177 45 -103.25 gain 45 178 -108.32 gain 178 45 -109.02 gain 45 179 -114.07 gain 179 45 -117.82 gain 45 180 -98.50 gain 180 45 -100.98 gain 45 181 -95.62 gain 181 45 -101.50 gain 45 182 -103.61 gain 182 45 -105.62 gain 45 183 -107.14 gain 183 45 -105.04 gain 45 184 -109.29 gain 184 45 -113.42 gain 45 185 -95.46 gain 185 45 -98.09 gain 45 186 -109.19 gain 186 45 -112.52 gain 45 187 -99.12 gain 187 45 -102.47 gain 45 188 -105.33 gain 188 45 -113.12 gain 45 189 -107.34 gain 189 45 -111.19 gain 45 190 -113.13 gain 190 45 -109.82 gain 45 191 -110.19 gain 191 45 -110.05 gain 45 192 -111.02 gain 192 45 -114.55 gain 45 193 -106.08 gain 193 45 -105.63 gain 45 194 -113.42 gain 194 45 -112.87 gain 45 195 -106.94 gain 195 45 -104.35 gain 45 196 -101.91 gain 196 45 -107.00 gain 45 197 -99.47 gain 197 45 -102.05 gain 45 198 -100.68 gain 198 45 -105.89 gain 45 199 -106.10 gain 199 45 -105.33 gain 45 200 -102.44 gain 200 45 -103.59 gain 45 201 -107.91 gain 201 45 -112.14 gain 45 202 -107.75 gain 202 45 -110.29 gain 45 203 -104.07 gain 203 45 -106.70 gain 45 204 -110.63 gain 204 45 -111.48 gain 45 205 -106.71 gain 205 45 -107.23 gain 45 206 -111.71 gain 206 45 -113.56 gain 45 207 -110.33 gain 207 45 -109.92 gain 45 208 -102.64 gain 208 45 -105.53 gain 45 209 -106.87 gain 209 45 -108.80 gain 45 210 -103.54 gain 210 45 -109.46 gain 45 211 -102.42 gain 211 45 -105.75 gain 45 212 -107.03 gain 212 45 -108.90 gain 45 213 -106.82 gain 213 45 -111.43 gain 45 214 -105.06 gain 214 45 -107.85 gain 45 215 -108.38 gain 215 45 -112.99 gain 45 216 -100.32 gain 216 45 -101.82 gain 45 217 -109.26 gain 217 45 -115.21 gain 45 218 -106.14 gain 218 45 -113.40 gain 45 219 -105.72 gain 219 45 -110.56 gain 45 220 -111.18 gain 220 45 -113.14 gain 45 221 -102.51 gain 221 45 -105.46 gain 45 222 -106.80 gain 222 45 -106.32 gain 45 223 -112.67 gain 223 45 -114.48 gain 45 224 -105.85 gain 224 45 -104.60 gain 46 47 -76.10 gain 47 46 -77.95 gain 46 48 -84.34 gain 48 46 -83.20 gain 46 49 -97.49 gain 49 46 -92.98 gain 46 50 -90.78 gain 50 46 -88.17 gain 46 51 -97.52 gain 51 46 -96.69 gain 46 52 -99.28 gain 52 46 -94.88 gain 46 53 -101.36 gain 53 46 -101.46 gain 46 54 -98.94 gain 54 46 -95.55 gain 46 55 -99.47 gain 55 46 -99.21 gain 46 56 -107.84 gain 56 46 -110.67 gain 46 57 -103.61 gain 57 46 -108.48 gain 46 58 -108.01 gain 58 46 -112.43 gain 46 59 -104.98 gain 59 46 -107.57 gain 46 60 -77.85 gain 60 46 -78.85 gain 46 61 -74.06 gain 61 46 -67.93 gain 46 62 -79.98 gain 62 46 -76.65 gain 46 63 -85.51 gain 63 46 -81.20 gain 46 64 -93.30 gain 64 46 -93.37 gain 46 65 -96.14 gain 65 46 -96.25 gain 46 66 -105.04 gain 66 46 -104.46 gain 46 67 -100.55 gain 67 46 -100.09 gain 46 68 -105.04 gain 68 46 -104.53 gain 46 69 -100.80 gain 69 46 -98.56 gain 46 70 -103.21 gain 70 46 -103.66 gain 46 71 -101.77 gain 71 46 -102.98 gain 46 72 -101.83 gain 72 46 -104.89 gain 46 73 -106.95 gain 73 46 -107.06 gain 46 74 -112.26 gain 74 46 -108.37 gain 46 75 -85.56 gain 75 46 -82.05 gain 46 76 -78.12 gain 76 46 -77.11 gain 46 77 -86.26 gain 77 46 -83.55 gain 46 78 -90.41 gain 78 46 -96.33 gain 46 79 -93.30 gain 79 46 -93.76 gain 46 80 -95.04 gain 80 46 -93.84 gain 46 81 -98.63 gain 81 46 -101.70 gain 46 82 -96.79 gain 82 46 -99.02 gain 46 83 -99.48 gain 83 46 -101.29 gain 46 84 -103.85 gain 84 46 -102.73 gain 46 85 -106.22 gain 85 46 -109.68 gain 46 86 -106.52 gain 86 46 -103.16 gain 46 87 -109.16 gain 87 46 -108.61 gain 46 88 -111.19 gain 88 46 -110.92 gain 46 89 -111.57 gain 89 46 -111.93 gain 46 90 -83.65 gain 90 46 -87.54 gain 46 91 -94.80 gain 91 46 -94.28 gain 46 92 -87.96 gain 92 46 -91.01 gain 46 93 -94.05 gain 93 46 -91.02 gain 46 94 -97.71 gain 94 46 -97.11 gain 46 95 -102.62 gain 95 46 -105.06 gain 46 96 -93.09 gain 96 46 -91.80 gain 46 97 -98.26 gain 97 46 -98.25 gain 46 98 -106.64 gain 98 46 -103.80 gain 46 99 -113.55 gain 99 46 -114.81 gain 46 100 -105.95 gain 100 46 -105.04 gain 46 101 -110.39 gain 101 46 -108.15 gain 46 102 -106.39 gain 102 46 -104.81 gain 46 103 -105.40 gain 103 46 -103.06 gain 46 104 -111.73 gain 104 46 -105.81 gain 46 105 -100.34 gain 105 46 -99.82 gain 46 106 -95.29 gain 106 46 -94.07 gain 46 107 -93.11 gain 107 46 -94.92 gain 46 108 -92.78 gain 108 46 -92.65 gain 46 109 -88.11 gain 109 46 -84.82 gain 46 110 -96.73 gain 110 46 -95.68 gain 46 111 -97.16 gain 111 46 -93.31 gain 46 112 -107.37 gain 112 46 -105.52 gain 46 113 -105.26 gain 113 46 -110.34 gain 46 114 -102.80 gain 114 46 -103.52 gain 46 115 -101.19 gain 115 46 -102.76 gain 46 116 -106.56 gain 116 46 -104.16 gain 46 117 -109.82 gain 117 46 -107.27 gain 46 118 -111.57 gain 118 46 -117.19 gain 46 119 -108.74 gain 119 46 -105.91 gain 46 120 -98.77 gain 120 46 -96.04 gain 46 121 -96.79 gain 121 46 -96.80 gain 46 122 -94.17 gain 122 46 -96.75 gain 46 123 -93.52 gain 123 46 -96.36 gain 46 124 -98.08 gain 124 46 -94.52 gain 46 125 -105.49 gain 125 46 -103.87 gain 46 126 -101.01 gain 126 46 -104.27 gain 46 127 -100.84 gain 127 46 -98.85 gain 46 128 -105.16 gain 128 46 -106.23 gain 46 129 -103.86 gain 129 46 -102.15 gain 46 130 -104.86 gain 130 46 -105.33 gain 46 131 -104.32 gain 131 46 -103.14 gain 46 132 -109.85 gain 132 46 -104.95 gain 46 133 -112.59 gain 133 46 -112.12 gain 46 134 -112.39 gain 134 46 -109.92 gain 46 135 -97.71 gain 135 46 -90.83 gain 46 136 -104.02 gain 136 46 -105.91 gain 46 137 -105.23 gain 137 46 -103.77 gain 46 138 -94.96 gain 138 46 -95.52 gain 46 139 -94.52 gain 139 46 -96.79 gain 46 140 -93.99 gain 140 46 -96.07 gain 46 141 -100.56 gain 141 46 -98.33 gain 46 142 -105.92 gain 142 46 -104.84 gain 46 143 -110.74 gain 143 46 -112.11 gain 46 144 -104.76 gain 144 46 -102.03 gain 46 145 -99.98 gain 145 46 -101.80 gain 46 146 -106.12 gain 146 46 -104.38 gain 46 147 -108.93 gain 147 46 -108.39 gain 46 148 -104.17 gain 148 46 -104.15 gain 46 149 -105.51 gain 149 46 -101.86 gain 46 150 -102.58 gain 150 46 -102.31 gain 46 151 -95.87 gain 151 46 -98.09 gain 46 152 -100.72 gain 152 46 -101.29 gain 46 153 -106.13 gain 153 46 -106.40 gain 46 154 -105.68 gain 154 46 -107.09 gain 46 155 -101.97 gain 155 46 -100.67 gain 46 156 -111.63 gain 156 46 -111.45 gain 46 157 -98.00 gain 157 46 -99.12 gain 46 158 -104.54 gain 158 46 -107.63 gain 46 159 -107.95 gain 159 46 -105.08 gain 46 160 -111.01 gain 160 46 -109.51 gain 46 161 -112.83 gain 161 46 -112.39 gain 46 162 -108.80 gain 162 46 -107.99 gain 46 163 -114.16 gain 163 46 -110.77 gain 46 164 -107.96 gain 164 46 -111.80 gain 46 165 -107.18 gain 165 46 -108.37 gain 46 166 -102.15 gain 166 46 -105.00 gain 46 167 -101.57 gain 167 46 -103.25 gain 46 168 -103.62 gain 168 46 -104.36 gain 46 169 -101.78 gain 169 46 -99.04 gain 46 170 -104.53 gain 170 46 -102.72 gain 46 171 -109.43 gain 171 46 -108.19 gain 46 172 -108.25 gain 172 46 -109.81 gain 46 173 -103.82 gain 173 46 -99.70 gain 46 174 -111.49 gain 174 46 -113.33 gain 46 175 -116.90 gain 175 46 -110.53 gain 46 176 -105.08 gain 176 46 -102.93 gain 46 177 -113.72 gain 177 46 -113.94 gain 46 178 -109.16 gain 178 46 -106.98 gain 46 179 -110.74 gain 179 46 -111.61 gain 46 180 -101.24 gain 180 46 -100.85 gain 46 181 -102.89 gain 181 46 -105.90 gain 46 182 -104.74 gain 182 46 -103.88 gain 46 183 -104.02 gain 183 46 -99.05 gain 46 184 -111.04 gain 184 46 -112.30 gain 46 185 -108.91 gain 185 46 -108.66 gain 46 186 -99.59 gain 186 46 -100.05 gain 46 187 -103.55 gain 187 46 -104.03 gain 46 188 -107.78 gain 188 46 -112.70 gain 46 189 -109.47 gain 189 46 -110.45 gain 46 190 -102.35 gain 190 46 -96.16 gain 46 191 -110.09 gain 191 46 -107.07 gain 46 192 -107.22 gain 192 46 -107.88 gain 46 193 -115.01 gain 193 46 -111.69 gain 46 194 -115.98 gain 194 46 -112.55 gain 46 195 -100.82 gain 195 46 -95.37 gain 46 196 -105.99 gain 196 46 -108.20 gain 46 197 -104.74 gain 197 46 -104.45 gain 46 198 -99.17 gain 198 46 -101.52 gain 46 199 -104.24 gain 199 46 -100.60 gain 46 200 -112.04 gain 200 46 -110.32 gain 46 201 -110.89 gain 201 46 -112.26 gain 46 202 -111.32 gain 202 46 -110.99 gain 46 203 -109.52 gain 203 46 -109.28 gain 46 204 -106.35 gain 204 46 -104.33 gain 46 205 -112.80 gain 205 46 -110.45 gain 46 206 -110.61 gain 206 46 -109.59 gain 46 207 -114.57 gain 207 46 -111.28 gain 46 208 -109.93 gain 208 46 -109.95 gain 46 209 -112.94 gain 209 46 -111.99 gain 46 210 -110.33 gain 210 46 -113.39 gain 46 211 -107.50 gain 211 46 -107.95 gain 46 212 -111.25 gain 212 46 -110.25 gain 46 213 -108.54 gain 213 46 -110.27 gain 46 214 -102.63 gain 214 46 -102.55 gain 46 215 -106.29 gain 215 46 -108.02 gain 46 216 -112.77 gain 216 46 -111.39 gain 46 217 -108.21 gain 217 46 -111.29 gain 46 218 -109.76 gain 218 46 -114.16 gain 46 219 -109.59 gain 219 46 -111.56 gain 46 220 -110.74 gain 220 46 -109.82 gain 46 221 -109.89 gain 221 46 -109.97 gain 46 222 -115.97 gain 222 46 -112.62 gain 46 223 -123.01 gain 223 46 -121.95 gain 46 224 -110.93 gain 224 46 -106.80 gain 47 48 -74.74 gain 48 47 -71.74 gain 47 49 -85.12 gain 49 47 -78.77 gain 47 50 -102.20 gain 50 47 -97.74 gain 47 51 -95.06 gain 51 47 -92.38 gain 47 52 -94.84 gain 52 47 -88.60 gain 47 53 -100.14 gain 53 47 -98.39 gain 47 54 -94.22 gain 54 47 -88.98 gain 47 55 -103.25 gain 55 47 -101.14 gain 47 56 -102.45 gain 56 47 -103.44 gain 47 57 -106.33 gain 57 47 -109.35 gain 47 58 -117.58 gain 58 47 -120.15 gain 47 59 -110.53 gain 59 47 -111.27 gain 47 60 -86.08 gain 60 47 -85.23 gain 47 61 -79.58 gain 61 47 -71.61 gain 47 62 -78.49 gain 62 47 -73.32 gain 47 63 -79.89 gain 63 47 -73.73 gain 47 64 -93.63 gain 64 47 -91.85 gain 47 65 -94.59 gain 65 47 -92.85 gain 47 66 -100.27 gain 66 47 -97.84 gain 47 67 -100.15 gain 67 47 -97.84 gain 47 68 -98.35 gain 68 47 -95.99 gain 47 69 -108.58 gain 69 47 -104.49 gain 47 70 -105.64 gain 70 47 -104.25 gain 47 71 -102.54 gain 71 47 -101.90 gain 47 72 -111.39 gain 72 47 -112.60 gain 47 73 -112.06 gain 73 47 -110.32 gain 47 74 -104.56 gain 74 47 -98.82 gain 47 75 -88.31 gain 75 47 -82.95 gain 47 76 -86.88 gain 76 47 -84.02 gain 47 77 -85.31 gain 77 47 -80.75 gain 47 78 -82.58 gain 78 47 -86.65 gain 47 79 -90.45 gain 79 47 -89.07 gain 47 80 -96.00 gain 80 47 -92.94 gain 47 81 -89.05 gain 81 47 -90.27 gain 47 82 -100.87 gain 82 47 -101.25 gain 47 83 -96.07 gain 83 47 -96.03 gain 47 84 -100.24 gain 84 47 -97.27 gain 47 85 -96.86 gain 85 47 -98.47 gain 47 86 -102.54 gain 86 47 -97.34 gain 47 87 -108.34 gain 87 47 -105.94 gain 47 88 -112.92 gain 88 47 -110.80 gain 47 89 -107.42 gain 89 47 -105.93 gain 47 90 -97.04 gain 90 47 -99.09 gain 47 91 -99.96 gain 91 47 -97.60 gain 47 92 -94.19 gain 92 47 -95.39 gain 47 93 -97.19 gain 93 47 -92.31 gain 47 94 -91.07 gain 94 47 -88.62 gain 47 95 -96.08 gain 95 47 -96.67 gain 47 96 -105.20 gain 96 47 -102.07 gain 47 97 -103.01 gain 97 47 -101.15 gain 47 98 -101.18 gain 98 47 -96.49 gain 47 99 -105.27 gain 99 47 -104.68 gain 47 100 -109.59 gain 100 47 -106.83 gain 47 101 -104.96 gain 101 47 -100.86 gain 47 102 -106.46 gain 102 47 -103.03 gain 47 103 -115.00 gain 103 47 -110.81 gain 47 104 -109.66 gain 104 47 -101.89 gain 47 105 -93.30 gain 105 47 -90.93 gain 47 106 -99.10 gain 106 47 -96.04 gain 47 107 -96.15 gain 107 47 -96.11 gain 47 108 -98.00 gain 108 47 -96.02 gain 47 109 -94.76 gain 109 47 -89.63 gain 47 110 -97.70 gain 110 47 -94.80 gain 47 111 -108.42 gain 111 47 -102.72 gain 47 112 -102.08 gain 112 47 -98.38 gain 47 113 -106.86 gain 113 47 -110.09 gain 47 114 -107.54 gain 114 47 -106.41 gain 47 115 -104.11 gain 115 47 -103.84 gain 47 116 -114.91 gain 116 47 -110.66 gain 47 117 -111.08 gain 117 47 -106.67 gain 47 118 -106.66 gain 118 47 -110.43 gain 47 119 -111.90 gain 119 47 -107.22 gain 47 120 -97.00 gain 120 47 -92.43 gain 47 121 -109.64 gain 121 47 -107.80 gain 47 122 -100.40 gain 122 47 -101.13 gain 47 123 -97.58 gain 123 47 -98.57 gain 47 124 -99.84 gain 124 47 -94.44 gain 47 125 -99.25 gain 125 47 -95.78 gain 47 126 -102.56 gain 126 47 -103.97 gain 47 127 -106.26 gain 127 47 -102.42 gain 47 128 -96.00 gain 128 47 -95.22 gain 47 129 -108.59 gain 129 47 -105.03 gain 47 130 -105.96 gain 130 47 -104.58 gain 47 131 -113.70 gain 131 47 -110.67 gain 47 132 -114.00 gain 132 47 -107.25 gain 47 133 -110.47 gain 133 47 -108.15 gain 47 134 -110.43 gain 134 47 -106.10 gain 47 135 -98.11 gain 135 47 -89.38 gain 47 136 -103.50 gain 136 47 -103.54 gain 47 137 -99.75 gain 137 47 -96.45 gain 47 138 -102.42 gain 138 47 -101.14 gain 47 139 -106.14 gain 139 47 -106.56 gain 47 140 -109.85 gain 140 47 -110.07 gain 47 141 -100.37 gain 141 47 -96.28 gain 47 142 -105.58 gain 142 47 -102.64 gain 47 143 -104.67 gain 143 47 -104.18 gain 47 144 -108.75 gain 144 47 -104.17 gain 47 145 -115.12 gain 145 47 -115.09 gain 47 146 -102.14 gain 146 47 -98.55 gain 47 147 -111.42 gain 147 47 -109.02 gain 47 148 -114.43 gain 148 47 -112.56 gain 47 149 -114.82 gain 149 47 -109.32 gain 47 150 -102.98 gain 150 47 -100.87 gain 47 151 -100.01 gain 151 47 -100.37 gain 47 152 -102.66 gain 152 47 -101.39 gain 47 153 -101.36 gain 153 47 -99.79 gain 47 154 -99.50 gain 154 47 -99.05 gain 47 155 -101.88 gain 155 47 -98.73 gain 47 156 -106.07 gain 156 47 -104.05 gain 47 157 -112.07 gain 157 47 -111.35 gain 47 158 -100.69 gain 158 47 -101.93 gain 47 159 -105.69 gain 159 47 -100.97 gain 47 160 -112.82 gain 160 47 -109.47 gain 47 161 -111.88 gain 161 47 -109.59 gain 47 162 -110.45 gain 162 47 -107.79 gain 47 163 -114.05 gain 163 47 -108.81 gain 47 164 -116.00 gain 164 47 -117.99 gain 47 165 -104.10 gain 165 47 -103.44 gain 47 166 -96.31 gain 166 47 -97.32 gain 47 167 -95.70 gain 167 47 -95.53 gain 47 168 -108.32 gain 168 47 -107.21 gain 47 169 -101.10 gain 169 47 -96.51 gain 47 170 -105.41 gain 170 47 -101.75 gain 47 171 -103.13 gain 171 47 -100.05 gain 47 172 -102.03 gain 172 47 -101.74 gain 47 173 -104.40 gain 173 47 -98.43 gain 47 174 -109.58 gain 174 47 -109.57 gain 47 175 -108.15 gain 175 47 -99.93 gain 47 176 -110.86 gain 176 47 -106.87 gain 47 177 -111.28 gain 177 47 -109.66 gain 47 178 -116.68 gain 178 47 -112.66 gain 47 179 -118.38 gain 179 47 -117.40 gain 47 180 -105.14 gain 180 47 -102.90 gain 47 181 -104.43 gain 181 47 -105.59 gain 47 182 -105.35 gain 182 47 -102.64 gain 47 183 -106.60 gain 183 47 -99.77 gain 47 184 -110.34 gain 184 47 -109.74 gain 47 185 -102.79 gain 185 47 -100.70 gain 47 186 -107.82 gain 186 47 -106.42 gain 47 187 -107.46 gain 187 47 -106.09 gain 47 188 -101.41 gain 188 47 -104.49 gain 47 189 -105.89 gain 189 47 -105.02 gain 47 190 -102.95 gain 190 47 -94.91 gain 47 191 -113.49 gain 191 47 -108.63 gain 47 192 -114.51 gain 192 47 -113.32 gain 47 193 -108.19 gain 193 47 -103.02 gain 47 194 -109.82 gain 194 47 -104.54 gain 47 195 -105.71 gain 195 47 -98.40 gain 47 196 -104.40 gain 196 47 -104.76 gain 47 197 -109.81 gain 197 47 -107.66 gain 47 198 -111.76 gain 198 47 -112.26 gain 47 199 -110.95 gain 199 47 -105.47 gain 47 200 -107.98 gain 200 47 -104.41 gain 47 201 -114.72 gain 201 47 -114.24 gain 47 202 -105.12 gain 202 47 -102.93 gain 47 203 -106.92 gain 203 47 -104.83 gain 47 204 -110.08 gain 204 47 -106.21 gain 47 205 -111.41 gain 205 47 -107.21 gain 47 206 -102.89 gain 206 47 -100.02 gain 47 207 -112.96 gain 207 47 -107.83 gain 47 208 -108.88 gain 208 47 -107.04 gain 47 209 -113.86 gain 209 47 -111.06 gain 47 210 -108.10 gain 210 47 -109.31 gain 47 211 -115.97 gain 211 47 -114.57 gain 47 212 -107.25 gain 212 47 -104.39 gain 47 213 -107.54 gain 213 47 -107.43 gain 47 214 -114.92 gain 214 47 -112.99 gain 47 215 -112.79 gain 215 47 -112.67 gain 47 216 -105.21 gain 216 47 -101.99 gain 47 217 -103.47 gain 217 47 -104.69 gain 47 218 -108.93 gain 218 47 -111.47 gain 47 219 -112.59 gain 219 47 -112.71 gain 47 220 -115.56 gain 220 47 -112.79 gain 47 221 -109.45 gain 221 47 -107.68 gain 47 222 -109.51 gain 222 47 -104.31 gain 47 223 -121.03 gain 223 47 -118.12 gain 47 224 -116.51 gain 224 47 -110.53 gain 48 49 -76.80 gain 49 48 -73.44 gain 48 50 -83.13 gain 50 48 -81.66 gain 48 51 -85.97 gain 51 48 -86.29 gain 48 52 -89.98 gain 52 48 -86.72 gain 48 53 -94.95 gain 53 48 -96.19 gain 48 54 -94.75 gain 54 48 -92.51 gain 48 55 -104.41 gain 55 48 -105.30 gain 48 56 -106.55 gain 56 48 -110.53 gain 48 57 -103.41 gain 57 48 -109.43 gain 48 58 -107.73 gain 58 48 -113.29 gain 48 59 -105.09 gain 59 48 -108.82 gain 48 60 -93.21 gain 60 48 -95.35 gain 48 61 -82.17 gain 61 48 -77.19 gain 48 62 -77.36 gain 62 48 -75.18 gain 48 63 -78.99 gain 63 48 -75.82 gain 48 64 -68.74 gain 64 48 -69.96 gain 48 65 -79.59 gain 65 48 -80.85 gain 48 66 -93.61 gain 66 48 -94.17 gain 48 67 -95.39 gain 67 48 -96.07 gain 48 68 -94.02 gain 68 48 -94.66 gain 48 69 -103.53 gain 69 48 -102.43 gain 48 70 -104.01 gain 70 48 -105.61 gain 48 71 -97.23 gain 71 48 -99.59 gain 48 72 -103.94 gain 72 48 -108.15 gain 48 73 -97.74 gain 73 48 -99.00 gain 48 74 -106.87 gain 74 48 -104.12 gain 48 75 -91.32 gain 75 48 -88.95 gain 48 76 -90.92 gain 76 48 -91.05 gain 48 77 -81.11 gain 77 48 -79.54 gain 48 78 -82.43 gain 78 48 -89.50 gain 48 79 -84.17 gain 79 48 -85.78 gain 48 80 -83.40 gain 80 48 -83.34 gain 48 81 -92.53 gain 81 48 -96.75 gain 48 82 -94.56 gain 82 48 -97.94 gain 48 83 -97.72 gain 83 48 -100.67 gain 48 84 -97.46 gain 84 48 -97.49 gain 48 85 -101.87 gain 85 48 -106.48 gain 48 86 -108.43 gain 86 48 -106.22 gain 48 87 -102.01 gain 87 48 -102.60 gain 48 88 -108.21 gain 88 48 -109.08 gain 48 89 -102.78 gain 89 48 -104.29 gain 48 90 -94.83 gain 90 48 -99.87 gain 48 91 -94.90 gain 91 48 -95.53 gain 48 92 -86.85 gain 92 48 -91.05 gain 48 93 -88.86 gain 93 48 -86.97 gain 48 94 -92.70 gain 94 48 -93.25 gain 48 95 -91.03 gain 95 48 -94.62 gain 48 96 -87.63 gain 96 48 -87.49 gain 48 97 -96.59 gain 97 48 -97.72 gain 48 98 -108.99 gain 98 48 -107.30 gain 48 99 -102.09 gain 99 48 -104.49 gain 48 100 -101.28 gain 100 48 -101.53 gain 48 101 -102.73 gain 101 48 -101.64 gain 48 102 -99.76 gain 102 48 -99.33 gain 48 103 -103.30 gain 103 48 -102.10 gain 48 104 -103.42 gain 104 48 -98.65 gain 48 105 -97.31 gain 105 48 -97.93 gain 48 106 -87.91 gain 106 48 -87.85 gain 48 107 -97.29 gain 107 48 -100.23 gain 48 108 -100.39 gain 108 48 -101.40 gain 48 109 -89.54 gain 109 48 -87.39 gain 48 110 -94.21 gain 110 48 -94.31 gain 48 111 -98.07 gain 111 48 -95.36 gain 48 112 -106.77 gain 112 48 -106.07 gain 48 113 -100.52 gain 113 48 -106.75 gain 48 114 -98.03 gain 114 48 -99.89 gain 48 115 -95.77 gain 115 48 -98.49 gain 48 116 -102.76 gain 116 48 -101.51 gain 48 117 -105.70 gain 117 48 -104.29 gain 48 118 -103.69 gain 118 48 -110.46 gain 48 119 -107.55 gain 119 48 -105.86 gain 48 120 -92.54 gain 120 48 -90.96 gain 48 121 -99.98 gain 121 48 -101.14 gain 48 122 -95.57 gain 122 48 -99.31 gain 48 123 -95.29 gain 123 48 -99.28 gain 48 124 -98.34 gain 124 48 -95.93 gain 48 125 -97.28 gain 125 48 -96.81 gain 48 126 -102.46 gain 126 48 -106.87 gain 48 127 -101.02 gain 127 48 -100.18 gain 48 128 -108.18 gain 128 48 -110.40 gain 48 129 -108.04 gain 129 48 -107.47 gain 48 130 -102.00 gain 130 48 -103.61 gain 48 131 -106.45 gain 131 48 -106.42 gain 48 132 -108.38 gain 132 48 -104.62 gain 48 133 -111.01 gain 133 48 -111.69 gain 48 134 -100.94 gain 134 48 -99.61 gain 48 135 -101.09 gain 135 48 -95.35 gain 48 136 -99.11 gain 136 48 -102.14 gain 48 137 -100.04 gain 137 48 -99.73 gain 48 138 -95.66 gain 138 48 -97.36 gain 48 139 -95.84 gain 139 48 -99.25 gain 48 140 -97.43 gain 140 48 -100.65 gain 48 141 -100.75 gain 141 48 -99.66 gain 48 142 -97.26 gain 142 48 -97.33 gain 48 143 -100.27 gain 143 48 -102.78 gain 48 144 -97.54 gain 144 48 -95.95 gain 48 145 -102.55 gain 145 48 -105.51 gain 48 146 -101.59 gain 146 48 -101.00 gain 48 147 -102.90 gain 147 48 -103.50 gain 48 148 -110.58 gain 148 48 -111.70 gain 48 149 -108.65 gain 149 48 -106.15 gain 48 150 -100.03 gain 150 48 -100.91 gain 48 151 -98.59 gain 151 48 -101.95 gain 48 152 -98.09 gain 152 48 -99.81 gain 48 153 -93.43 gain 153 48 -94.85 gain 48 154 -105.38 gain 154 48 -107.93 gain 48 155 -94.81 gain 155 48 -94.66 gain 48 156 -95.88 gain 156 48 -96.85 gain 48 157 -104.34 gain 157 48 -106.61 gain 48 158 -95.51 gain 158 48 -99.75 gain 48 159 -97.79 gain 159 48 -96.07 gain 48 160 -105.56 gain 160 48 -105.21 gain 48 161 -107.03 gain 161 48 -107.74 gain 48 162 -110.22 gain 162 48 -110.56 gain 48 163 -108.98 gain 163 48 -106.73 gain 48 164 -107.00 gain 164 48 -111.98 gain 48 165 -95.30 gain 165 48 -97.64 gain 48 166 -99.61 gain 166 48 -103.60 gain 48 167 -104.87 gain 167 48 -107.69 gain 48 168 -98.47 gain 168 48 -100.36 gain 48 169 -99.16 gain 169 48 -97.56 gain 48 170 -102.17 gain 170 48 -101.51 gain 48 171 -101.75 gain 171 48 -101.66 gain 48 172 -102.34 gain 172 48 -105.04 gain 48 173 -103.79 gain 173 48 -100.82 gain 48 174 -103.11 gain 174 48 -106.10 gain 48 175 -108.92 gain 175 48 -103.70 gain 48 176 -102.59 gain 176 48 -101.60 gain 48 177 -105.05 gain 177 48 -106.42 gain 48 178 -104.70 gain 178 48 -103.68 gain 48 179 -105.99 gain 179 48 -108.01 gain 48 180 -104.11 gain 180 48 -104.86 gain 48 181 -95.35 gain 181 48 -99.51 gain 48 182 -100.65 gain 182 48 -100.94 gain 48 183 -104.51 gain 183 48 -100.68 gain 48 184 -103.77 gain 184 48 -106.17 gain 48 185 -105.41 gain 185 48 -106.31 gain 48 186 -100.87 gain 186 48 -102.47 gain 48 187 -107.97 gain 187 48 -109.59 gain 48 188 -102.54 gain 188 48 -108.61 gain 48 189 -102.83 gain 189 48 -104.95 gain 48 190 -104.93 gain 190 48 -99.89 gain 48 191 -112.01 gain 191 48 -110.14 gain 48 192 -101.86 gain 192 48 -103.66 gain 48 193 -106.92 gain 193 48 -104.75 gain 48 194 -110.50 gain 194 48 -108.21 gain 48 195 -109.94 gain 195 48 -105.62 gain 48 196 -100.66 gain 196 48 -104.01 gain 48 197 -106.93 gain 197 48 -107.78 gain 48 198 -107.80 gain 198 48 -111.29 gain 48 199 -109.28 gain 199 48 -106.79 gain 48 200 -108.02 gain 200 48 -107.45 gain 48 201 -103.92 gain 201 48 -106.43 gain 48 202 -104.99 gain 202 48 -105.80 gain 48 203 -105.43 gain 203 48 -106.34 gain 48 204 -108.73 gain 204 48 -107.86 gain 48 205 -107.01 gain 205 48 -105.81 gain 48 206 -110.23 gain 206 48 -110.35 gain 48 207 -101.12 gain 207 48 -98.98 gain 48 208 -108.93 gain 208 48 -110.09 gain 48 209 -102.34 gain 209 48 -102.54 gain 48 210 -105.99 gain 210 48 -110.19 gain 48 211 -107.45 gain 211 48 -109.05 gain 48 212 -110.46 gain 212 48 -110.61 gain 48 213 -108.60 gain 213 48 -111.49 gain 48 214 -100.47 gain 214 48 -101.53 gain 48 215 -102.34 gain 215 48 -105.22 gain 48 216 -107.01 gain 216 48 -106.78 gain 48 217 -104.63 gain 217 48 -108.85 gain 48 218 -109.55 gain 218 48 -115.09 gain 48 219 -112.91 gain 219 48 -116.03 gain 48 220 -113.00 gain 220 48 -113.23 gain 48 221 -113.04 gain 221 48 -114.26 gain 48 222 -103.22 gain 222 48 -101.02 gain 48 223 -109.85 gain 223 48 -109.93 gain 48 224 -107.48 gain 224 48 -104.50 gain 49 50 -67.76 gain 50 49 -69.65 gain 49 51 -87.91 gain 51 49 -91.59 gain 49 52 -90.05 gain 52 49 -90.16 gain 49 53 -82.92 gain 53 49 -87.52 gain 49 54 -89.98 gain 54 49 -91.10 gain 49 55 -91.72 gain 55 49 -95.96 gain 49 56 -98.75 gain 56 49 -106.09 gain 49 57 -92.19 gain 57 49 -101.57 gain 49 58 -96.13 gain 58 49 -105.06 gain 49 59 -99.16 gain 59 49 -106.25 gain 49 60 -87.95 gain 60 49 -93.45 gain 49 61 -81.94 gain 61 49 -80.33 gain 49 62 -85.09 gain 62 49 -86.27 gain 49 63 -77.46 gain 63 49 -77.65 gain 49 64 -77.78 gain 64 49 -82.35 gain 49 65 -72.17 gain 65 49 -76.78 gain 49 66 -86.05 gain 66 49 -89.98 gain 49 67 -86.97 gain 67 49 -91.02 gain 49 68 -91.31 gain 68 49 -95.31 gain 49 69 -91.28 gain 69 49 -93.55 gain 49 70 -93.79 gain 70 49 -98.75 gain 49 71 -88.16 gain 71 49 -93.88 gain 49 72 -104.24 gain 72 49 -111.81 gain 49 73 -98.79 gain 73 49 -103.41 gain 49 74 -96.29 gain 74 49 -96.90 gain 49 75 -88.44 gain 75 49 -89.44 gain 49 76 -85.92 gain 76 49 -89.41 gain 49 77 -84.29 gain 77 49 -86.08 gain 49 78 -75.06 gain 78 49 -85.48 gain 49 79 -80.36 gain 79 49 -85.33 gain 49 80 -81.40 gain 80 49 -84.70 gain 49 81 -81.57 gain 81 49 -89.14 gain 49 82 -84.01 gain 82 49 -90.74 gain 49 83 -93.82 gain 83 49 -100.14 gain 49 84 -100.78 gain 84 49 -104.17 gain 49 85 -93.58 gain 85 49 -101.55 gain 49 86 -90.05 gain 86 49 -91.21 gain 49 87 -93.06 gain 87 49 -97.01 gain 49 88 -96.13 gain 88 49 -100.36 gain 49 89 -98.13 gain 89 49 -103.00 gain 49 90 -90.39 gain 90 49 -98.80 gain 49 91 -86.22 gain 91 49 -90.21 gain 49 92 -93.24 gain 92 49 -100.80 gain 49 93 -87.05 gain 93 49 -88.52 gain 49 94 -82.59 gain 94 49 -86.50 gain 49 95 -91.54 gain 95 49 -98.49 gain 49 96 -91.92 gain 96 49 -95.14 gain 49 97 -90.94 gain 97 49 -95.44 gain 49 98 -96.19 gain 98 49 -97.86 gain 49 99 -95.03 gain 99 49 -100.79 gain 49 100 -98.32 gain 100 49 -101.93 gain 49 101 -95.52 gain 101 49 -97.78 gain 49 102 -106.66 gain 102 49 -109.59 gain 49 103 -101.98 gain 103 49 -104.14 gain 49 104 -97.39 gain 104 49 -95.97 gain 49 105 -92.20 gain 105 49 -96.19 gain 49 106 -90.59 gain 106 49 -93.88 gain 49 107 -93.03 gain 107 49 -99.34 gain 49 108 -86.85 gain 108 49 -91.22 gain 49 109 -92.06 gain 109 49 -93.28 gain 49 110 -87.03 gain 110 49 -90.49 gain 49 111 -93.01 gain 111 49 -93.67 gain 49 112 -99.21 gain 112 49 -101.87 gain 49 113 -100.67 gain 113 49 -110.26 gain 49 114 -95.56 gain 114 49 -100.79 gain 49 115 -96.34 gain 115 49 -102.42 gain 49 116 -95.31 gain 116 49 -97.41 gain 49 117 -104.19 gain 117 49 -106.14 gain 49 118 -100.68 gain 118 49 -110.81 gain 49 119 -100.05 gain 119 49 -101.73 gain 49 120 -94.05 gain 120 49 -95.83 gain 49 121 -93.91 gain 121 49 -98.43 gain 49 122 -93.61 gain 122 49 -100.71 gain 49 123 -94.01 gain 123 49 -101.36 gain 49 124 -88.57 gain 124 49 -89.52 gain 49 125 -94.38 gain 125 49 -97.26 gain 49 126 -94.27 gain 126 49 -102.03 gain 49 127 -90.96 gain 127 49 -93.48 gain 49 128 -94.96 gain 128 49 -100.54 gain 49 129 -93.13 gain 129 49 -95.93 gain 49 130 -95.87 gain 130 49 -100.84 gain 49 131 -94.36 gain 131 49 -97.69 gain 49 132 -97.38 gain 132 49 -96.98 gain 49 133 -101.93 gain 133 49 -105.96 gain 49 134 -102.62 gain 134 49 -104.66 gain 49 135 -91.90 gain 135 49 -89.52 gain 49 136 -94.15 gain 136 49 -100.54 gain 49 137 -88.99 gain 137 49 -92.04 gain 49 138 -95.28 gain 138 49 -100.35 gain 49 139 -98.70 gain 139 49 -105.48 gain 49 140 -91.23 gain 140 49 -97.82 gain 49 141 -94.53 gain 141 49 -96.80 gain 49 142 -101.64 gain 142 49 -105.06 gain 49 143 -102.03 gain 143 49 -107.90 gain 49 144 -93.48 gain 144 49 -95.25 gain 49 145 -99.27 gain 145 49 -105.59 gain 49 146 -95.55 gain 146 49 -98.32 gain 49 147 -93.87 gain 147 49 -97.83 gain 49 148 -96.23 gain 148 49 -100.71 gain 49 149 -111.42 gain 149 49 -112.28 gain 49 150 -98.45 gain 150 49 -102.70 gain 49 151 -94.72 gain 151 49 -101.45 gain 49 152 -97.47 gain 152 49 -102.56 gain 49 153 -103.83 gain 153 49 -108.61 gain 49 154 -98.96 gain 154 49 -104.87 gain 49 155 -102.98 gain 155 49 -106.19 gain 49 156 -92.99 gain 156 49 -97.32 gain 49 157 -99.28 gain 157 49 -104.91 gain 49 158 -93.28 gain 158 49 -100.88 gain 49 159 -98.23 gain 159 49 -99.87 gain 49 160 -99.81 gain 160 49 -102.82 gain 49 161 -96.47 gain 161 49 -100.54 gain 49 162 -97.39 gain 162 49 -101.08 gain 49 163 -101.03 gain 163 49 -102.15 gain 49 164 -108.86 gain 164 49 -117.21 gain 49 165 -102.62 gain 165 49 -108.32 gain 49 166 -101.96 gain 166 49 -109.32 gain 49 167 -106.82 gain 167 49 -113.00 gain 49 168 -92.21 gain 168 49 -97.46 gain 49 169 -96.59 gain 169 49 -98.35 gain 49 170 -96.57 gain 170 49 -99.27 gain 49 171 -97.15 gain 171 49 -100.43 gain 49 172 -108.27 gain 172 49 -114.34 gain 49 173 -95.82 gain 173 49 -96.21 gain 49 174 -97.67 gain 174 49 -104.02 gain 49 175 -102.93 gain 175 49 -101.07 gain 49 176 -94.24 gain 176 49 -96.61 gain 49 177 -103.07 gain 177 49 -107.80 gain 49 178 -103.68 gain 178 49 -106.01 gain 49 179 -108.91 gain 179 49 -114.29 gain 49 180 -100.71 gain 180 49 -104.82 gain 49 181 -100.26 gain 181 49 -107.77 gain 49 182 -101.02 gain 182 49 -104.67 gain 49 183 -102.77 gain 183 49 -102.31 gain 49 184 -102.86 gain 184 49 -108.62 gain 49 185 -95.57 gain 185 49 -99.83 gain 49 186 -91.54 gain 186 49 -96.50 gain 49 187 -97.80 gain 187 49 -102.79 gain 49 188 -102.50 gain 188 49 -111.93 gain 49 189 -92.95 gain 189 49 -98.44 gain 49 190 -106.62 gain 190 49 -104.94 gain 49 191 -108.09 gain 191 49 -109.58 gain 49 192 -103.08 gain 192 49 -108.25 gain 49 193 -106.11 gain 193 49 -107.30 gain 49 194 -104.93 gain 194 49 -106.01 gain 49 195 -101.07 gain 195 49 -100.12 gain 49 196 -94.42 gain 196 49 -101.14 gain 49 197 -106.27 gain 197 49 -110.48 gain 49 198 -98.44 gain 198 49 -105.29 gain 49 199 -103.24 gain 199 49 -104.10 gain 49 200 -95.30 gain 200 49 -98.09 gain 49 201 -97.69 gain 201 49 -103.56 gain 49 202 -99.21 gain 202 49 -103.38 gain 49 203 -105.55 gain 203 49 -109.82 gain 49 204 -100.44 gain 204 49 -102.93 gain 49 205 -108.52 gain 205 49 -110.68 gain 49 206 -110.67 gain 206 49 -114.16 gain 49 207 -105.39 gain 207 49 -106.61 gain 49 208 -106.09 gain 208 49 -110.61 gain 49 209 -109.23 gain 209 49 -112.80 gain 49 210 -95.99 gain 210 49 -103.55 gain 49 211 -112.88 gain 211 49 -117.84 gain 49 212 -103.74 gain 212 49 -107.25 gain 49 213 -107.76 gain 213 49 -114.01 gain 49 214 -102.24 gain 214 49 -106.67 gain 49 215 -105.17 gain 215 49 -111.41 gain 49 216 -98.27 gain 216 49 -101.40 gain 49 217 -102.57 gain 217 49 -110.15 gain 49 218 -109.07 gain 218 49 -117.96 gain 49 219 -98.93 gain 219 49 -105.40 gain 49 220 -106.70 gain 220 49 -110.29 gain 49 221 -100.55 gain 221 49 -105.13 gain 49 222 -102.17 gain 222 49 -103.33 gain 49 223 -100.20 gain 223 49 -103.64 gain 49 224 -106.03 gain 224 49 -106.41 gain 50 51 -72.05 gain 51 50 -73.83 gain 50 52 -84.29 gain 52 50 -82.50 gain 50 53 -89.66 gain 53 50 -92.37 gain 50 54 -97.60 gain 54 50 -96.82 gain 50 55 -99.68 gain 55 50 -102.03 gain 50 56 -95.10 gain 56 50 -100.55 gain 50 57 -99.60 gain 57 50 -107.09 gain 50 58 -93.69 gain 58 50 -100.72 gain 50 59 -104.92 gain 59 50 -110.12 gain 50 60 -98.95 gain 60 50 -102.56 gain 50 61 -87.36 gain 61 50 -83.85 gain 50 62 -90.47 gain 62 50 -89.75 gain 50 63 -88.05 gain 63 50 -86.34 gain 50 64 -77.70 gain 64 50 -80.38 gain 50 65 -71.40 gain 65 50 -74.13 gain 50 66 -78.43 gain 66 50 -80.46 gain 50 67 -81.00 gain 67 50 -83.16 gain 50 68 -96.45 gain 68 50 -98.56 gain 50 69 -99.70 gain 69 50 -100.07 gain 50 70 -95.91 gain 70 50 -98.98 gain 50 71 -99.75 gain 71 50 -103.58 gain 50 72 -97.94 gain 72 50 -103.62 gain 50 73 -102.31 gain 73 50 -105.04 gain 50 74 -106.70 gain 74 50 -105.42 gain 50 75 -90.73 gain 75 50 -89.83 gain 50 76 -91.04 gain 76 50 -92.64 gain 50 77 -89.73 gain 77 50 -89.63 gain 50 78 -87.27 gain 78 50 -95.81 gain 50 79 -80.40 gain 79 50 -83.47 gain 50 80 -79.72 gain 80 50 -81.12 gain 50 81 -83.49 gain 81 50 -89.17 gain 50 82 -91.90 gain 82 50 -96.75 gain 50 83 -84.72 gain 83 50 -89.14 gain 50 84 -89.27 gain 84 50 -90.76 gain 50 85 -98.62 gain 85 50 -104.70 gain 50 86 -98.68 gain 86 50 -97.93 gain 50 87 -105.01 gain 87 50 -107.07 gain 50 88 -96.84 gain 88 50 -99.18 gain 50 89 -100.36 gain 89 50 -103.33 gain 50 90 -99.14 gain 90 50 -105.65 gain 50 91 -88.06 gain 91 50 -90.16 gain 50 92 -88.55 gain 92 50 -94.22 gain 50 93 -86.76 gain 93 50 -86.34 gain 50 94 -91.27 gain 94 50 -93.29 gain 50 95 -85.95 gain 95 50 -91.00 gain 50 96 -98.55 gain 96 50 -99.88 gain 50 97 -93.32 gain 97 50 -95.92 gain 50 98 -94.72 gain 98 50 -94.50 gain 50 99 -98.32 gain 99 50 -102.19 gain 50 100 -91.74 gain 100 50 -93.45 gain 50 101 -99.33 gain 101 50 -99.70 gain 50 102 -104.32 gain 102 50 -105.36 gain 50 103 -102.88 gain 103 50 -103.15 gain 50 104 -100.65 gain 104 50 -97.34 gain 50 105 -102.81 gain 105 50 -104.91 gain 50 106 -88.65 gain 106 50 -90.05 gain 50 107 -84.38 gain 107 50 -88.79 gain 50 108 -101.17 gain 108 50 -103.65 gain 50 109 -98.56 gain 109 50 -97.88 gain 50 110 -88.66 gain 110 50 -90.23 gain 50 111 -102.21 gain 111 50 -100.97 gain 50 112 -89.25 gain 112 50 -90.01 gain 50 113 -95.12 gain 113 50 -102.82 gain 50 114 -91.74 gain 114 50 -95.07 gain 50 115 -93.14 gain 115 50 -97.33 gain 50 116 -92.51 gain 116 50 -92.73 gain 50 117 -100.20 gain 117 50 -100.25 gain 50 118 -107.05 gain 118 50 -115.28 gain 50 119 -96.82 gain 119 50 -96.60 gain 50 120 -95.24 gain 120 50 -95.12 gain 50 121 -88.93 gain 121 50 -91.56 gain 50 122 -96.22 gain 122 50 -101.42 gain 50 123 -95.02 gain 123 50 -100.48 gain 50 124 -103.06 gain 124 50 -102.12 gain 50 125 -92.10 gain 125 50 -93.10 gain 50 126 -88.25 gain 126 50 -94.12 gain 50 127 -93.20 gain 127 50 -93.82 gain 50 128 -98.08 gain 128 50 -101.77 gain 50 129 -96.02 gain 129 50 -96.92 gain 50 130 -97.03 gain 130 50 -100.12 gain 50 131 -105.55 gain 131 50 -106.99 gain 50 132 -92.46 gain 132 50 -90.18 gain 50 133 -105.98 gain 133 50 -108.13 gain 50 134 -98.76 gain 134 50 -98.90 gain 50 135 -93.01 gain 135 50 -88.73 gain 50 136 -94.73 gain 136 50 -99.23 gain 50 137 -101.83 gain 137 50 -102.99 gain 50 138 -97.90 gain 138 50 -101.08 gain 50 139 -102.34 gain 139 50 -107.22 gain 50 140 -89.89 gain 140 50 -94.58 gain 50 141 -97.29 gain 141 50 -97.67 gain 50 142 -95.77 gain 142 50 -97.30 gain 50 143 -96.68 gain 143 50 -100.66 gain 50 144 -102.99 gain 144 50 -102.87 gain 50 145 -102.70 gain 145 50 -107.13 gain 50 146 -101.80 gain 146 50 -102.67 gain 50 147 -102.76 gain 147 50 -104.83 gain 50 148 -106.07 gain 148 50 -108.66 gain 50 149 -104.94 gain 149 50 -103.90 gain 50 150 -106.20 gain 150 50 -108.55 gain 50 151 -98.36 gain 151 50 -103.19 gain 50 152 -98.73 gain 152 50 -101.92 gain 50 153 -95.56 gain 153 50 -98.44 gain 50 154 -97.63 gain 154 50 -101.64 gain 50 155 -101.37 gain 155 50 -102.68 gain 50 156 -94.81 gain 156 50 -97.25 gain 50 157 -96.08 gain 157 50 -99.81 gain 50 158 -96.77 gain 158 50 -102.48 gain 50 159 -99.49 gain 159 50 -99.23 gain 50 160 -102.32 gain 160 50 -103.44 gain 50 161 -106.34 gain 161 50 -108.51 gain 50 162 -109.47 gain 162 50 -111.27 gain 50 163 -107.23 gain 163 50 -106.45 gain 50 164 -114.02 gain 164 50 -120.47 gain 50 165 -99.93 gain 165 50 -103.74 gain 50 166 -103.00 gain 166 50 -108.47 gain 50 167 -103.52 gain 167 50 -107.80 gain 50 168 -101.49 gain 168 50 -104.84 gain 50 169 -100.21 gain 169 50 -100.07 gain 50 170 -107.56 gain 170 50 -108.37 gain 50 171 -105.68 gain 171 50 -107.05 gain 50 172 -95.06 gain 172 50 -99.23 gain 50 173 -99.61 gain 173 50 -98.11 gain 50 174 -97.45 gain 174 50 -101.90 gain 50 175 -102.76 gain 175 50 -99.01 gain 50 176 -104.37 gain 176 50 -104.84 gain 50 177 -101.54 gain 177 50 -104.37 gain 50 178 -105.99 gain 178 50 -106.43 gain 50 179 -111.53 gain 179 50 -115.01 gain 50 180 -104.70 gain 180 50 -106.92 gain 50 181 -103.51 gain 181 50 -109.13 gain 50 182 -105.81 gain 182 50 -107.56 gain 50 183 -106.87 gain 183 50 -104.51 gain 50 184 -102.21 gain 184 50 -106.08 gain 50 185 -100.25 gain 185 50 -102.62 gain 50 186 -100.43 gain 186 50 -103.50 gain 50 187 -95.27 gain 187 50 -98.37 gain 50 188 -106.36 gain 188 50 -113.89 gain 50 189 -101.98 gain 189 50 -105.58 gain 50 190 -104.26 gain 190 50 -100.68 gain 50 191 -103.35 gain 191 50 -102.95 gain 50 192 -104.01 gain 192 50 -107.28 gain 50 193 -109.88 gain 193 50 -109.17 gain 50 194 -102.05 gain 194 50 -101.23 gain 50 195 -101.36 gain 195 50 -98.51 gain 50 196 -102.61 gain 196 50 -107.43 gain 50 197 -104.99 gain 197 50 -107.31 gain 50 198 -105.76 gain 198 50 -110.72 gain 50 199 -102.84 gain 199 50 -101.82 gain 50 200 -100.32 gain 200 50 -101.21 gain 50 201 -104.42 gain 201 50 -108.40 gain 50 202 -106.63 gain 202 50 -108.90 gain 50 203 -95.83 gain 203 50 -98.20 gain 50 204 -110.20 gain 204 50 -110.80 gain 50 205 -105.78 gain 205 50 -106.04 gain 50 206 -106.72 gain 206 50 -108.31 gain 50 207 -105.97 gain 207 50 -105.30 gain 50 208 -100.32 gain 208 50 -102.95 gain 50 209 -104.44 gain 209 50 -106.11 gain 50 210 -104.10 gain 210 50 -109.77 gain 50 211 -109.48 gain 211 50 -112.54 gain 50 212 -107.24 gain 212 50 -108.85 gain 50 213 -110.35 gain 213 50 -114.70 gain 50 214 -101.97 gain 214 50 -104.51 gain 50 215 -106.01 gain 215 50 -110.35 gain 50 216 -102.81 gain 216 50 -104.05 gain 50 217 -104.04 gain 217 50 -109.73 gain 50 218 -106.97 gain 218 50 -113.98 gain 50 219 -109.77 gain 219 50 -114.35 gain 50 220 -103.08 gain 220 50 -104.77 gain 50 221 -109.23 gain 221 50 -111.92 gain 50 222 -101.15 gain 222 50 -100.42 gain 50 223 -116.35 gain 223 50 -117.90 gain 50 224 -99.69 gain 224 50 -98.17 gain 51 52 -76.05 gain 52 51 -72.48 gain 51 53 -77.77 gain 53 51 -78.69 gain 51 54 -94.89 gain 54 51 -92.32 gain 51 55 -91.33 gain 55 51 -91.90 gain 51 56 -93.65 gain 56 51 -97.31 gain 51 57 -95.21 gain 57 51 -100.91 gain 51 58 -101.03 gain 58 51 -106.27 gain 51 59 -103.77 gain 59 51 -107.18 gain 51 60 -97.80 gain 60 51 -99.62 gain 51 61 -94.77 gain 61 51 -89.47 gain 51 62 -94.96 gain 62 51 -92.46 gain 51 63 -89.58 gain 63 51 -86.09 gain 51 64 -89.14 gain 64 51 -90.04 gain 51 65 -83.69 gain 65 51 -84.63 gain 51 66 -70.79 gain 66 51 -71.04 gain 51 67 -74.76 gain 67 51 -75.13 gain 51 68 -93.58 gain 68 51 -93.91 gain 51 69 -87.86 gain 69 51 -86.44 gain 51 70 -93.56 gain 70 51 -94.84 gain 51 71 -100.18 gain 71 51 -102.22 gain 51 72 -98.33 gain 72 51 -102.22 gain 51 73 -100.07 gain 73 51 -101.01 gain 51 74 -105.07 gain 74 51 -102.00 gain 51 75 -102.53 gain 75 51 -99.84 gain 51 76 -95.75 gain 76 51 -95.56 gain 51 77 -91.01 gain 77 51 -89.12 gain 51 78 -97.68 gain 78 51 -104.42 gain 51 79 -89.94 gain 79 51 -91.23 gain 51 80 -88.15 gain 80 51 -87.77 gain 51 81 -83.23 gain 81 51 -87.13 gain 51 82 -81.27 gain 82 51 -84.32 gain 51 83 -87.53 gain 83 51 -90.16 gain 51 84 -87.22 gain 84 51 -86.93 gain 51 85 -92.66 gain 85 51 -96.95 gain 51 86 -95.01 gain 86 51 -92.48 gain 51 87 -95.64 gain 87 51 -95.92 gain 51 88 -101.88 gain 88 51 -102.43 gain 51 89 -101.11 gain 89 51 -102.30 gain 51 90 -102.73 gain 90 51 -107.45 gain 51 91 -96.08 gain 91 51 -96.39 gain 51 92 -99.10 gain 92 51 -102.98 gain 51 93 -98.43 gain 93 51 -96.22 gain 51 94 -94.51 gain 94 51 -94.74 gain 51 95 -93.69 gain 95 51 -96.96 gain 51 96 -87.62 gain 96 51 -87.16 gain 51 97 -84.41 gain 97 51 -85.23 gain 51 98 -82.79 gain 98 51 -80.78 gain 51 99 -91.22 gain 99 51 -93.30 gain 51 100 -94.41 gain 100 51 -94.34 gain 51 101 -102.02 gain 101 51 -100.61 gain 51 102 -103.31 gain 102 51 -102.55 gain 51 103 -100.14 gain 103 51 -98.62 gain 51 104 -102.50 gain 104 51 -97.41 gain 51 105 -99.17 gain 105 51 -99.47 gain 51 106 -94.16 gain 106 51 -93.78 gain 51 107 -97.26 gain 107 51 -99.89 gain 51 108 -99.44 gain 108 51 -100.13 gain 51 109 -92.29 gain 109 51 -89.83 gain 51 110 -94.98 gain 110 51 -94.76 gain 51 111 -95.84 gain 111 51 -92.81 gain 51 112 -95.93 gain 112 51 -94.90 gain 51 113 -100.00 gain 113 51 -105.91 gain 51 114 -93.42 gain 114 51 -94.97 gain 51 115 -97.75 gain 115 51 -100.15 gain 51 116 -97.93 gain 116 51 -96.36 gain 51 117 -108.07 gain 117 51 -106.34 gain 51 118 -105.48 gain 118 51 -111.93 gain 51 119 -109.41 gain 119 51 -107.41 gain 51 120 -102.10 gain 120 51 -100.20 gain 51 121 -107.63 gain 121 51 -108.47 gain 51 122 -103.97 gain 122 51 -107.38 gain 51 123 -94.23 gain 123 51 -97.90 gain 51 124 -98.12 gain 124 51 -95.40 gain 51 125 -98.01 gain 125 51 -97.22 gain 51 126 -99.31 gain 126 51 -103.40 gain 51 127 -102.60 gain 127 51 -101.44 gain 51 128 -94.32 gain 128 51 -96.21 gain 51 129 -104.11 gain 129 51 -103.23 gain 51 130 -99.73 gain 130 51 -101.02 gain 51 131 -105.03 gain 131 51 -104.68 gain 51 132 -106.16 gain 132 51 -102.09 gain 51 133 -106.98 gain 133 51 -107.34 gain 51 134 -106.17 gain 134 51 -104.52 gain 51 135 -104.33 gain 135 51 -98.27 gain 51 136 -99.96 gain 136 51 -102.68 gain 51 137 -102.79 gain 137 51 -102.17 gain 51 138 -98.98 gain 138 51 -100.37 gain 51 139 -101.46 gain 139 51 -104.56 gain 51 140 -95.70 gain 140 51 -98.60 gain 51 141 -98.59 gain 141 51 -97.18 gain 51 142 -97.63 gain 142 51 -97.38 gain 51 143 -99.48 gain 143 51 -101.67 gain 51 144 -95.64 gain 144 51 -93.73 gain 51 145 -97.90 gain 145 51 -100.54 gain 51 146 -105.10 gain 146 51 -104.19 gain 51 147 -110.18 gain 147 51 -110.46 gain 51 148 -105.49 gain 148 51 -106.30 gain 51 149 -104.19 gain 149 51 -101.37 gain 51 150 -96.43 gain 150 51 -96.99 gain 51 151 -99.45 gain 151 51 -102.49 gain 51 152 -106.34 gain 152 51 -107.74 gain 51 153 -104.88 gain 153 51 -105.98 gain 51 154 -93.07 gain 154 51 -95.30 gain 51 155 -101.06 gain 155 51 -100.58 gain 51 156 -102.22 gain 156 51 -102.87 gain 51 157 -106.88 gain 157 51 -108.83 gain 51 158 -102.67 gain 158 51 -106.58 gain 51 159 -96.25 gain 159 51 -94.20 gain 51 160 -105.33 gain 160 51 -104.66 gain 51 161 -105.85 gain 161 51 -106.24 gain 51 162 -102.69 gain 162 51 -102.71 gain 51 163 -94.75 gain 163 51 -92.19 gain 51 164 -108.76 gain 164 51 -113.42 gain 51 165 -113.61 gain 165 51 -115.63 gain 51 166 -97.89 gain 166 51 -101.56 gain 51 167 -98.86 gain 167 51 -101.37 gain 51 168 -104.45 gain 168 51 -106.01 gain 51 169 -102.34 gain 169 51 -100.42 gain 51 170 -98.59 gain 170 51 -97.61 gain 51 171 -100.38 gain 171 51 -99.97 gain 51 172 -102.70 gain 172 51 -105.09 gain 51 173 -100.86 gain 173 51 -97.57 gain 51 174 -102.61 gain 174 51 -105.28 gain 51 175 -104.04 gain 175 51 -98.50 gain 51 176 -109.64 gain 176 51 -108.32 gain 51 177 -101.85 gain 177 51 -102.90 gain 51 178 -106.39 gain 178 51 -105.04 gain 51 179 -118.58 gain 179 51 -120.28 gain 51 180 -104.68 gain 180 51 -105.11 gain 51 181 -100.56 gain 181 51 -104.40 gain 51 182 -105.12 gain 182 51 -105.08 gain 51 183 -104.40 gain 183 51 -100.26 gain 51 184 -103.73 gain 184 51 -105.81 gain 51 185 -107.29 gain 185 51 -107.87 gain 51 186 -100.43 gain 186 51 -101.71 gain 51 187 -106.53 gain 187 51 -107.83 gain 51 188 -96.91 gain 188 51 -102.66 gain 51 189 -99.74 gain 189 51 -101.55 gain 51 190 -110.09 gain 190 51 -104.73 gain 51 191 -107.58 gain 191 51 -105.39 gain 51 192 -102.37 gain 192 51 -103.86 gain 51 193 -109.82 gain 193 51 -107.32 gain 51 194 -108.26 gain 194 51 -105.65 gain 51 195 -112.77 gain 195 51 -108.14 gain 51 196 -111.52 gain 196 51 -114.55 gain 51 197 -101.89 gain 197 51 -102.42 gain 51 198 -104.77 gain 198 51 -107.94 gain 51 199 -108.26 gain 199 51 -105.44 gain 51 200 -104.69 gain 200 51 -103.79 gain 51 201 -105.09 gain 201 51 -107.29 gain 51 202 -105.31 gain 202 51 -105.80 gain 51 203 -104.98 gain 203 51 -105.57 gain 51 204 -106.01 gain 204 51 -104.82 gain 51 205 -106.20 gain 205 51 -104.68 gain 51 206 -104.19 gain 206 51 -103.99 gain 51 207 -109.57 gain 207 51 -107.11 gain 51 208 -107.48 gain 208 51 -108.33 gain 51 209 -110.17 gain 209 51 -110.05 gain 51 210 -111.40 gain 210 51 -115.28 gain 51 211 -111.63 gain 211 51 -112.91 gain 51 212 -103.30 gain 212 51 -103.12 gain 51 213 -110.74 gain 213 51 -113.31 gain 51 214 -103.72 gain 214 51 -104.47 gain 51 215 -106.87 gain 215 51 -109.43 gain 51 216 -107.42 gain 216 51 -106.87 gain 51 217 -108.41 gain 217 51 -112.31 gain 51 218 -107.13 gain 218 51 -112.35 gain 51 219 -105.96 gain 219 51 -108.76 gain 51 220 -104.72 gain 220 51 -104.63 gain 51 221 -103.69 gain 221 51 -104.59 gain 51 222 -110.07 gain 222 51 -107.54 gain 51 223 -106.10 gain 223 51 -105.87 gain 51 224 -105.94 gain 224 51 -102.64 gain 52 53 -72.50 gain 53 52 -77.00 gain 52 54 -77.05 gain 54 52 -78.06 gain 52 55 -79.30 gain 55 52 -83.44 gain 52 56 -86.77 gain 56 52 -94.00 gain 52 57 -86.60 gain 57 52 -95.87 gain 52 58 -94.63 gain 58 52 -103.44 gain 52 59 -97.06 gain 59 52 -104.04 gain 52 60 -93.20 gain 60 52 -98.59 gain 52 61 -102.18 gain 61 52 -100.45 gain 52 62 -96.08 gain 62 52 -97.15 gain 52 63 -91.20 gain 63 52 -91.29 gain 52 64 -94.58 gain 64 52 -99.06 gain 52 65 -81.98 gain 65 52 -86.49 gain 52 66 -75.44 gain 66 52 -79.25 gain 52 67 -74.27 gain 67 52 -78.21 gain 52 68 -78.46 gain 68 52 -82.36 gain 52 69 -78.86 gain 69 52 -81.02 gain 52 70 -86.22 gain 70 52 -91.07 gain 52 71 -92.55 gain 71 52 -98.16 gain 52 72 -97.81 gain 72 52 -105.27 gain 52 73 -99.42 gain 73 52 -103.93 gain 52 74 -102.92 gain 74 52 -103.43 gain 52 75 -97.28 gain 75 52 -98.17 gain 52 76 -96.76 gain 76 52 -100.14 gain 52 77 -96.40 gain 77 52 -98.08 gain 52 78 -95.74 gain 78 52 -106.06 gain 52 79 -83.12 gain 79 52 -87.98 gain 52 80 -83.32 gain 80 52 -86.52 gain 52 81 -83.62 gain 81 52 -91.09 gain 52 82 -86.77 gain 82 52 -93.40 gain 52 83 -78.27 gain 83 52 -84.47 gain 52 84 -82.74 gain 84 52 -86.02 gain 52 85 -86.80 gain 85 52 -94.66 gain 52 86 -93.81 gain 86 52 -94.85 gain 52 87 -94.60 gain 87 52 -98.45 gain 52 88 -96.48 gain 88 52 -100.60 gain 52 89 -100.76 gain 89 52 -105.52 gain 52 90 -102.84 gain 90 52 -111.13 gain 52 91 -97.53 gain 91 52 -101.41 gain 52 92 -96.82 gain 92 52 -104.27 gain 52 93 -90.53 gain 93 52 -91.89 gain 52 94 -88.99 gain 94 52 -92.79 gain 52 95 -95.14 gain 95 52 -101.98 gain 52 96 -87.89 gain 96 52 -91.01 gain 52 97 -91.51 gain 97 52 -95.90 gain 52 98 -84.17 gain 98 52 -85.74 gain 52 99 -92.71 gain 99 52 -98.36 gain 52 100 -90.34 gain 100 52 -93.83 gain 52 101 -99.41 gain 101 52 -101.56 gain 52 102 -90.44 gain 102 52 -93.26 gain 52 103 -94.46 gain 103 52 -96.51 gain 52 104 -97.76 gain 104 52 -96.24 gain 52 105 -99.07 gain 105 52 -102.95 gain 52 106 -92.04 gain 106 52 -95.23 gain 52 107 -88.12 gain 107 52 -94.32 gain 52 108 -97.33 gain 108 52 -101.59 gain 52 109 -88.26 gain 109 52 -89.37 gain 52 110 -92.09 gain 110 52 -95.44 gain 52 111 -88.01 gain 111 52 -88.56 gain 52 112 -95.41 gain 112 52 -97.96 gain 52 113 -95.16 gain 113 52 -104.65 gain 52 114 -94.31 gain 114 52 -99.42 gain 52 115 -90.76 gain 115 52 -96.74 gain 52 116 -97.89 gain 116 52 -99.89 gain 52 117 -96.10 gain 117 52 -97.94 gain 52 118 -90.88 gain 118 52 -100.89 gain 52 119 -99.69 gain 119 52 -101.26 gain 52 120 -99.90 gain 120 52 -101.57 gain 52 121 -94.53 gain 121 52 -98.94 gain 52 122 -108.92 gain 122 52 -115.91 gain 52 123 -103.74 gain 123 52 -110.98 gain 52 124 -91.95 gain 124 52 -92.80 gain 52 125 -89.83 gain 125 52 -92.60 gain 52 126 -90.68 gain 126 52 -98.34 gain 52 127 -90.20 gain 127 52 -92.61 gain 52 128 -86.72 gain 128 52 -92.19 gain 52 129 -100.17 gain 129 52 -102.85 gain 52 130 -97.79 gain 130 52 -102.66 gain 52 131 -89.91 gain 131 52 -93.13 gain 52 132 -96.05 gain 132 52 -95.55 gain 52 133 -96.67 gain 133 52 -100.60 gain 52 134 -97.32 gain 134 52 -99.24 gain 52 135 -99.88 gain 135 52 -97.40 gain 52 136 -93.09 gain 136 52 -99.38 gain 52 137 -95.14 gain 137 52 -98.08 gain 52 138 -98.91 gain 138 52 -103.87 gain 52 139 -91.42 gain 139 52 -98.09 gain 52 140 -99.80 gain 140 52 -106.27 gain 52 141 -99.49 gain 141 52 -101.66 gain 52 142 -95.49 gain 142 52 -98.81 gain 52 143 -95.07 gain 143 52 -100.84 gain 52 144 -90.84 gain 144 52 -92.51 gain 52 145 -95.68 gain 145 52 -101.90 gain 52 146 -93.52 gain 146 52 -96.18 gain 52 147 -102.06 gain 147 52 -105.91 gain 52 148 -101.71 gain 148 52 -106.09 gain 52 149 -97.52 gain 149 52 -98.27 gain 52 150 -102.46 gain 150 52 -106.60 gain 52 151 -104.89 gain 151 52 -111.51 gain 52 152 -95.28 gain 152 52 -100.26 gain 52 153 -93.50 gain 153 52 -98.17 gain 52 154 -101.70 gain 154 52 -107.50 gain 52 155 -103.98 gain 155 52 -107.08 gain 52 156 -90.91 gain 156 52 -95.14 gain 52 157 -92.12 gain 157 52 -97.64 gain 52 158 -100.19 gain 158 52 -107.68 gain 52 159 -102.70 gain 159 52 -104.22 gain 52 160 -93.87 gain 160 52 -96.77 gain 52 161 -97.68 gain 161 52 -101.64 gain 52 162 -99.09 gain 162 52 -102.67 gain 52 163 -101.13 gain 163 52 -102.14 gain 52 164 -100.91 gain 164 52 -109.15 gain 52 165 -106.19 gain 165 52 -111.79 gain 52 166 -105.56 gain 166 52 -112.81 gain 52 167 -100.88 gain 167 52 -106.95 gain 52 168 -94.01 gain 168 52 -99.15 gain 52 169 -105.86 gain 169 52 -107.51 gain 52 170 -96.84 gain 170 52 -99.43 gain 52 171 -99.33 gain 171 52 -102.49 gain 52 172 -97.76 gain 172 52 -103.72 gain 52 173 -97.11 gain 173 52 -97.39 gain 52 174 -99.77 gain 174 52 -106.01 gain 52 175 -92.69 gain 175 52 -90.72 gain 52 176 -107.87 gain 176 52 -110.13 gain 52 177 -98.39 gain 177 52 -103.01 gain 52 178 -109.19 gain 178 52 -111.42 gain 52 179 -105.14 gain 179 52 -110.41 gain 52 180 -101.10 gain 180 52 -105.11 gain 52 181 -107.97 gain 181 52 -115.37 gain 52 182 -97.42 gain 182 52 -100.96 gain 52 183 -102.62 gain 183 52 -102.05 gain 52 184 -104.07 gain 184 52 -109.72 gain 52 185 -94.52 gain 185 52 -98.67 gain 52 186 -98.96 gain 186 52 -103.82 gain 52 187 -97.08 gain 187 52 -101.96 gain 52 188 -100.96 gain 188 52 -110.28 gain 52 189 -103.32 gain 189 52 -108.70 gain 52 190 -97.93 gain 190 52 -96.14 gain 52 191 -111.22 gain 191 52 -112.61 gain 52 192 -100.69 gain 192 52 -105.74 gain 52 193 -110.21 gain 193 52 -111.29 gain 52 194 -105.72 gain 194 52 -106.69 gain 52 195 -106.62 gain 195 52 -105.56 gain 52 196 -102.17 gain 196 52 -108.78 gain 52 197 -104.44 gain 197 52 -108.54 gain 52 198 -100.53 gain 198 52 -107.27 gain 52 199 -95.04 gain 199 52 -95.80 gain 52 200 -107.43 gain 200 52 -110.10 gain 52 201 -103.76 gain 201 52 -109.53 gain 52 202 -94.28 gain 202 52 -98.35 gain 52 203 -106.78 gain 203 52 -110.94 gain 52 204 -91.62 gain 204 52 -94.01 gain 52 205 -101.48 gain 205 52 -103.53 gain 52 206 -108.58 gain 206 52 -111.95 gain 52 207 -101.39 gain 207 52 -102.50 gain 52 208 -100.53 gain 208 52 -104.94 gain 52 209 -102.45 gain 209 52 -105.90 gain 52 210 -99.31 gain 210 52 -106.76 gain 52 211 -104.46 gain 211 52 -109.31 gain 52 212 -104.95 gain 212 52 -108.34 gain 52 213 -101.91 gain 213 52 -108.04 gain 52 214 -101.68 gain 214 52 -106.00 gain 52 215 -109.99 gain 215 52 -116.12 gain 52 216 -106.77 gain 216 52 -109.79 gain 52 217 -103.00 gain 217 52 -110.47 gain 52 218 -100.00 gain 218 52 -108.79 gain 52 219 -99.50 gain 219 52 -105.87 gain 52 220 -102.62 gain 220 52 -106.10 gain 52 221 -107.93 gain 221 52 -112.40 gain 52 222 -99.97 gain 222 52 -101.02 gain 52 223 -101.53 gain 223 52 -104.87 gain 52 224 -104.16 gain 224 52 -104.43 gain 53 54 -77.59 gain 54 53 -74.10 gain 53 55 -90.98 gain 55 53 -90.62 gain 53 56 -85.74 gain 56 53 -88.48 gain 53 57 -97.62 gain 57 53 -102.39 gain 53 58 -98.28 gain 58 53 -102.60 gain 53 59 -97.87 gain 59 53 -100.36 gain 53 60 -100.82 gain 60 53 -101.72 gain 53 61 -104.79 gain 61 53 -98.57 gain 53 62 -95.68 gain 62 53 -92.26 gain 53 63 -91.54 gain 63 53 -87.13 gain 53 64 -96.04 gain 64 53 -96.01 gain 53 65 -88.05 gain 65 53 -88.07 gain 53 66 -88.19 gain 66 53 -87.51 gain 53 67 -80.80 gain 67 53 -80.25 gain 53 68 -73.81 gain 68 53 -73.21 gain 53 69 -81.09 gain 69 53 -78.74 gain 53 70 -95.77 gain 70 53 -96.13 gain 53 71 -90.30 gain 71 53 -91.42 gain 53 72 -93.64 gain 72 53 -96.60 gain 53 73 -93.49 gain 73 53 -93.50 gain 53 74 -98.80 gain 74 53 -94.82 gain 53 75 -100.40 gain 75 53 -96.80 gain 53 76 -99.10 gain 76 53 -97.99 gain 53 77 -99.37 gain 77 53 -96.56 gain 53 78 -98.28 gain 78 53 -104.10 gain 53 79 -95.93 gain 79 53 -96.30 gain 53 80 -85.54 gain 80 53 -84.24 gain 53 81 -92.70 gain 81 53 -95.67 gain 53 82 -94.44 gain 82 53 -96.57 gain 53 83 -94.01 gain 83 53 -95.72 gain 53 84 -85.00 gain 84 53 -83.78 gain 53 85 -83.76 gain 85 53 -87.12 gain 53 86 -95.90 gain 86 53 -92.45 gain 53 87 -100.41 gain 87 53 -99.76 gain 53 88 -100.15 gain 88 53 -99.78 gain 53 89 -106.48 gain 89 53 -106.75 gain 53 90 -104.76 gain 90 53 -108.56 gain 53 91 -108.49 gain 91 53 -107.88 gain 53 92 -96.86 gain 92 53 -99.82 gain 53 93 -105.06 gain 93 53 -101.93 gain 53 94 -92.11 gain 94 53 -91.41 gain 53 95 -97.55 gain 95 53 -99.89 gain 53 96 -84.76 gain 96 53 -83.38 gain 53 97 -92.21 gain 97 53 -92.11 gain 53 98 -85.85 gain 98 53 -82.92 gain 53 99 -90.96 gain 99 53 -92.11 gain 53 100 -96.31 gain 100 53 -95.31 gain 53 101 -92.62 gain 101 53 -90.28 gain 53 102 -92.74 gain 102 53 -91.06 gain 53 103 -99.76 gain 103 53 -97.32 gain 53 104 -100.07 gain 104 53 -94.06 gain 53 105 -110.57 gain 105 53 -109.96 gain 53 106 -97.52 gain 106 53 -96.21 gain 53 107 -103.68 gain 107 53 -105.39 gain 53 108 -94.75 gain 108 53 -94.52 gain 53 109 -95.57 gain 109 53 -92.18 gain 53 110 -101.92 gain 110 53 -100.78 gain 53 111 -96.97 gain 111 53 -93.02 gain 53 112 -99.56 gain 112 53 -97.61 gain 53 113 -95.24 gain 113 53 -100.23 gain 53 114 -91.75 gain 114 53 -92.37 gain 53 115 -93.83 gain 115 53 -95.31 gain 53 116 -93.16 gain 116 53 -90.67 gain 53 117 -98.71 gain 117 53 -96.06 gain 53 118 -97.36 gain 118 53 -102.88 gain 53 119 -107.59 gain 119 53 -104.66 gain 53 120 -110.19 gain 120 53 -107.37 gain 53 121 -110.78 gain 121 53 -110.70 gain 53 122 -99.74 gain 122 53 -102.23 gain 53 123 -102.10 gain 123 53 -104.84 gain 53 124 -95.48 gain 124 53 -91.83 gain 53 125 -91.95 gain 125 53 -90.24 gain 53 126 -98.46 gain 126 53 -101.62 gain 53 127 -96.29 gain 127 53 -94.21 gain 53 128 -95.45 gain 128 53 -96.42 gain 53 129 -88.51 gain 129 53 -86.70 gain 53 130 -98.36 gain 130 53 -98.73 gain 53 131 -99.91 gain 131 53 -98.64 gain 53 132 -99.87 gain 132 53 -94.87 gain 53 133 -104.64 gain 133 53 -104.08 gain 53 134 -94.61 gain 134 53 -92.04 gain 53 135 -108.89 gain 135 53 -101.91 gain 53 136 -106.38 gain 136 53 -108.18 gain 53 137 -104.13 gain 137 53 -102.58 gain 53 138 -102.58 gain 138 53 -103.05 gain 53 139 -98.73 gain 139 53 -100.90 gain 53 140 -103.62 gain 140 53 -105.60 gain 53 141 -105.63 gain 141 53 -103.30 gain 53 142 -92.29 gain 142 53 -91.11 gain 53 143 -102.44 gain 143 53 -103.71 gain 53 144 -102.19 gain 144 53 -99.37 gain 53 145 -104.78 gain 145 53 -106.51 gain 53 146 -92.17 gain 146 53 -90.34 gain 53 147 -100.22 gain 147 53 -99.58 gain 53 148 -105.61 gain 148 53 -105.50 gain 53 149 -105.35 gain 149 53 -101.61 gain 53 150 -110.25 gain 150 53 -109.89 gain 53 151 -110.97 gain 151 53 -113.09 gain 53 152 -105.52 gain 152 53 -106.00 gain 53 153 -103.97 gain 153 53 -104.15 gain 53 154 -100.54 gain 154 53 -101.85 gain 53 155 -106.19 gain 155 53 -104.79 gain 53 156 -104.77 gain 156 53 -104.50 gain 53 157 -105.94 gain 157 53 -106.97 gain 53 158 -91.76 gain 158 53 -94.76 gain 53 159 -102.53 gain 159 53 -99.56 gain 53 160 -102.67 gain 160 53 -101.08 gain 53 161 -95.20 gain 161 53 -94.67 gain 53 162 -107.48 gain 162 53 -106.57 gain 53 163 -105.34 gain 163 53 -101.86 gain 53 164 -103.47 gain 164 53 -107.22 gain 53 165 -106.27 gain 165 53 -107.37 gain 53 166 -105.85 gain 166 53 -108.60 gain 53 167 -107.72 gain 167 53 -109.30 gain 53 168 -104.68 gain 168 53 -105.32 gain 53 169 -101.63 gain 169 53 -98.79 gain 53 170 -104.30 gain 170 53 -102.39 gain 53 171 -108.80 gain 171 53 -107.46 gain 53 172 -99.47 gain 172 53 -100.94 gain 53 173 -110.26 gain 173 53 -106.05 gain 53 174 -108.04 gain 174 53 -109.78 gain 53 175 -113.03 gain 175 53 -106.57 gain 53 176 -99.94 gain 176 53 -97.70 gain 53 177 -105.49 gain 177 53 -105.61 gain 53 178 -99.87 gain 178 53 -97.60 gain 53 179 -110.65 gain 179 53 -111.43 gain 53 180 -115.11 gain 180 53 -114.62 gain 53 181 -109.60 gain 181 53 -112.51 gain 53 182 -104.33 gain 182 53 -103.37 gain 53 183 -106.79 gain 183 53 -101.72 gain 53 184 -97.99 gain 184 53 -99.15 gain 53 185 -107.29 gain 185 53 -106.94 gain 53 186 -107.74 gain 186 53 -108.10 gain 53 187 -106.47 gain 187 53 -106.85 gain 53 188 -107.06 gain 188 53 -111.89 gain 53 189 -107.46 gain 189 53 -108.34 gain 53 190 -106.11 gain 190 53 -99.83 gain 53 191 -104.76 gain 191 53 -101.65 gain 53 192 -109.53 gain 192 53 -110.10 gain 53 193 -107.81 gain 193 53 -104.39 gain 53 194 -105.38 gain 194 53 -101.85 gain 53 195 -110.78 gain 195 53 -105.23 gain 53 196 -113.75 gain 196 53 -115.86 gain 53 197 -111.34 gain 197 53 -110.94 gain 53 198 -103.61 gain 198 53 -105.86 gain 53 199 -110.62 gain 199 53 -106.88 gain 53 200 -113.27 gain 200 53 -111.45 gain 53 201 -107.44 gain 201 53 -108.71 gain 53 202 -103.42 gain 202 53 -102.99 gain 53 203 -109.68 gain 203 53 -109.35 gain 53 204 -106.55 gain 204 53 -104.44 gain 53 205 -104.80 gain 205 53 -102.36 gain 53 206 -111.67 gain 206 53 -110.55 gain 53 207 -110.27 gain 207 53 -106.89 gain 53 208 -110.56 gain 208 53 -110.48 gain 53 209 -112.87 gain 209 53 -111.83 gain 53 210 -104.18 gain 210 53 -107.14 gain 53 211 -110.54 gain 211 53 -110.90 gain 53 212 -107.32 gain 212 53 -106.23 gain 53 213 -109.22 gain 213 53 -110.86 gain 53 214 -99.48 gain 214 53 -99.31 gain 53 215 -112.33 gain 215 53 -113.96 gain 53 216 -107.80 gain 216 53 -106.33 gain 53 217 -107.45 gain 217 53 -110.43 gain 53 218 -105.97 gain 218 53 -110.26 gain 53 219 -108.33 gain 219 53 -110.21 gain 53 220 -109.17 gain 220 53 -108.16 gain 53 221 -107.91 gain 221 53 -107.89 gain 53 222 -108.56 gain 222 53 -105.12 gain 53 223 -112.18 gain 223 53 -111.03 gain 53 224 -108.88 gain 224 53 -104.65 gain 54 55 -78.65 gain 55 54 -81.78 gain 54 56 -85.19 gain 56 54 -91.41 gain 54 57 -91.67 gain 57 54 -99.93 gain 54 58 -93.61 gain 58 54 -101.41 gain 54 59 -95.06 gain 59 54 -101.03 gain 54 60 -106.84 gain 60 54 -111.23 gain 54 61 -101.94 gain 61 54 -99.21 gain 54 62 -99.18 gain 62 54 -99.24 gain 54 63 -99.11 gain 63 54 -98.18 gain 54 64 -92.40 gain 64 54 -95.86 gain 54 65 -93.37 gain 65 54 -96.87 gain 54 66 -89.18 gain 66 54 -91.99 gain 54 67 -88.05 gain 67 54 -90.97 gain 54 68 -72.78 gain 68 54 -75.66 gain 54 69 -72.56 gain 69 54 -73.71 gain 54 70 -75.31 gain 70 54 -79.15 gain 54 71 -83.44 gain 71 54 -88.04 gain 54 72 -85.40 gain 72 54 -91.85 gain 54 73 -90.31 gain 73 54 -93.81 gain 54 74 -94.38 gain 74 54 -93.87 gain 54 75 -101.88 gain 75 54 -101.76 gain 54 76 -98.53 gain 76 54 -100.90 gain 54 77 -95.67 gain 77 54 -96.35 gain 54 78 -95.86 gain 78 54 -105.17 gain 54 79 -90.38 gain 79 54 -94.23 gain 54 80 -92.96 gain 80 54 -95.14 gain 54 81 -88.50 gain 81 54 -94.95 gain 54 82 -86.56 gain 82 54 -92.18 gain 54 83 -86.48 gain 83 54 -91.68 gain 54 84 -80.60 gain 84 54 -82.87 gain 54 85 -91.06 gain 85 54 -97.91 gain 54 86 -84.03 gain 86 54 -84.06 gain 54 87 -90.76 gain 87 54 -93.59 gain 54 88 -87.84 gain 88 54 -90.95 gain 54 89 -96.58 gain 89 54 -100.33 gain 54 90 -102.11 gain 90 54 -109.40 gain 54 91 -94.97 gain 91 54 -97.84 gain 54 92 -102.96 gain 92 54 -109.40 gain 54 93 -102.21 gain 93 54 -102.56 gain 54 94 -96.19 gain 94 54 -98.98 gain 54 95 -95.82 gain 95 54 -101.65 gain 54 96 -88.96 gain 96 54 -91.06 gain 54 97 -88.74 gain 97 54 -92.12 gain 54 98 -86.57 gain 98 54 -87.12 gain 54 99 -94.15 gain 99 54 -98.79 gain 54 100 -84.33 gain 100 54 -86.82 gain 54 101 -84.47 gain 101 54 -85.61 gain 54 102 -96.72 gain 102 54 -98.52 gain 54 103 -94.22 gain 103 54 -95.25 gain 54 104 -100.24 gain 104 54 -97.71 gain 54 105 -96.77 gain 105 54 -99.64 gain 54 106 -95.49 gain 106 54 -97.66 gain 54 107 -91.38 gain 107 54 -96.57 gain 54 108 -104.51 gain 108 54 -107.76 gain 54 109 -94.05 gain 109 54 -94.15 gain 54 110 -96.05 gain 110 54 -98.39 gain 54 111 -84.09 gain 111 54 -83.62 gain 54 112 -91.00 gain 112 54 -92.54 gain 54 113 -95.73 gain 113 54 -104.20 gain 54 114 -90.78 gain 114 54 -94.88 gain 54 115 -84.19 gain 115 54 -89.16 gain 54 116 -94.65 gain 116 54 -95.64 gain 54 117 -92.80 gain 117 54 -93.63 gain 54 118 -97.61 gain 118 54 -106.62 gain 54 119 -100.27 gain 119 54 -100.82 gain 54 120 -92.20 gain 120 54 -92.86 gain 54 121 -104.61 gain 121 54 -108.01 gain 54 122 -96.31 gain 122 54 -102.29 gain 54 123 -103.64 gain 123 54 -109.87 gain 54 124 -94.56 gain 124 54 -94.39 gain 54 125 -90.90 gain 125 54 -92.67 gain 54 126 -94.81 gain 126 54 -101.46 gain 54 127 -99.59 gain 127 54 -100.99 gain 54 128 -90.89 gain 128 54 -95.35 gain 54 129 -92.07 gain 129 54 -93.74 gain 54 130 -97.74 gain 130 54 -101.60 gain 54 131 -97.87 gain 131 54 -100.09 gain 54 132 -101.04 gain 132 54 -99.53 gain 54 133 -98.33 gain 133 54 -101.25 gain 54 134 -95.21 gain 134 54 -96.13 gain 54 135 -108.39 gain 135 54 -104.89 gain 54 136 -104.54 gain 136 54 -109.82 gain 54 137 -106.55 gain 137 54 -108.49 gain 54 138 -102.92 gain 138 54 -106.87 gain 54 139 -95.08 gain 139 54 -100.74 gain 54 140 -92.87 gain 140 54 -98.33 gain 54 141 -92.55 gain 141 54 -93.70 gain 54 142 -89.90 gain 142 54 -92.21 gain 54 143 -101.05 gain 143 54 -105.80 gain 54 144 -92.22 gain 144 54 -92.88 gain 54 145 -100.91 gain 145 54 -106.12 gain 54 146 -99.83 gain 146 54 -101.48 gain 54 147 -100.12 gain 147 54 -102.97 gain 54 148 -102.57 gain 148 54 -105.94 gain 54 149 -97.21 gain 149 54 -96.95 gain 54 150 -107.92 gain 150 54 -111.04 gain 54 151 -104.23 gain 151 54 -109.83 gain 54 152 -103.06 gain 152 54 -107.02 gain 54 153 -99.87 gain 153 54 -103.53 gain 54 154 -99.04 gain 154 54 -103.84 gain 54 155 -95.35 gain 155 54 -97.44 gain 54 156 -103.03 gain 156 54 -106.25 gain 54 157 -106.99 gain 157 54 -111.50 gain 54 158 -102.51 gain 158 54 -108.98 gain 54 159 -95.69 gain 159 54 -96.20 gain 54 160 -95.43 gain 160 54 -97.32 gain 54 161 -99.60 gain 161 54 -102.55 gain 54 162 -98.00 gain 162 54 -100.57 gain 54 163 -102.95 gain 163 54 -102.95 gain 54 164 -96.90 gain 164 54 -104.13 gain 54 165 -108.42 gain 165 54 -113.00 gain 54 166 -106.95 gain 166 54 -113.18 gain 54 167 -103.69 gain 167 54 -108.75 gain 54 168 -104.57 gain 168 54 -108.70 gain 54 169 -98.47 gain 169 54 -99.11 gain 54 170 -101.90 gain 170 54 -103.49 gain 54 171 -100.02 gain 171 54 -102.17 gain 54 172 -101.48 gain 172 54 -106.42 gain 54 173 -96.33 gain 173 54 -95.60 gain 54 174 -95.70 gain 174 54 -100.93 gain 54 175 -92.20 gain 175 54 -89.22 gain 54 176 -98.48 gain 176 54 -99.72 gain 54 177 -97.83 gain 177 54 -101.44 gain 54 178 -102.73 gain 178 54 -103.95 gain 54 179 -102.09 gain 179 54 -106.35 gain 54 180 -103.94 gain 180 54 -106.94 gain 54 181 -114.89 gain 181 54 -121.28 gain 54 182 -101.00 gain 182 54 -103.52 gain 54 183 -104.59 gain 183 54 -103.00 gain 54 184 -106.44 gain 184 54 -111.08 gain 54 185 -105.50 gain 185 54 -108.64 gain 54 186 -109.72 gain 186 54 -113.56 gain 54 187 -100.40 gain 187 54 -104.26 gain 54 188 -103.75 gain 188 54 -112.06 gain 54 189 -97.14 gain 189 54 -101.51 gain 54 190 -104.25 gain 190 54 -101.45 gain 54 191 -102.00 gain 191 54 -102.38 gain 54 192 -101.42 gain 192 54 -105.47 gain 54 193 -102.65 gain 193 54 -102.72 gain 54 194 -105.75 gain 194 54 -105.71 gain 54 195 -107.97 gain 195 54 -105.90 gain 54 196 -107.90 gain 196 54 -113.50 gain 54 197 -104.16 gain 197 54 -107.25 gain 54 198 -106.22 gain 198 54 -111.95 gain 54 199 -111.96 gain 199 54 -111.70 gain 54 200 -102.73 gain 200 54 -104.39 gain 54 201 -101.94 gain 201 54 -106.70 gain 54 202 -97.12 gain 202 54 -100.17 gain 54 203 -101.15 gain 203 54 -104.29 gain 54 204 -101.66 gain 204 54 -103.03 gain 54 205 -96.39 gain 205 54 -97.42 gain 54 206 -103.39 gain 206 54 -105.75 gain 54 207 -97.85 gain 207 54 -97.96 gain 54 208 -99.73 gain 208 54 -103.14 gain 54 209 -100.65 gain 209 54 -103.10 gain 54 210 -107.78 gain 210 54 -114.22 gain 54 211 -102.87 gain 211 54 -106.71 gain 54 212 -104.07 gain 212 54 -106.46 gain 54 213 -107.43 gain 213 54 -112.56 gain 54 214 -106.44 gain 214 54 -109.74 gain 54 215 -105.73 gain 215 54 -110.85 gain 54 216 -107.07 gain 216 54 -109.09 gain 54 217 -106.42 gain 217 54 -112.88 gain 54 218 -108.29 gain 218 54 -116.08 gain 54 219 -104.82 gain 219 54 -110.18 gain 54 220 -101.68 gain 220 54 -104.15 gain 54 221 -111.59 gain 221 54 -115.05 gain 54 222 -100.99 gain 222 54 -101.02 gain 54 223 -96.82 gain 223 54 -99.14 gain 54 224 -104.81 gain 224 54 -104.07 gain 55 56 -80.97 gain 56 55 -84.06 gain 55 57 -83.87 gain 57 55 -89.01 gain 55 58 -96.18 gain 58 55 -100.86 gain 55 59 -92.79 gain 59 55 -95.63 gain 55 60 -104.67 gain 60 55 -105.92 gain 55 61 -113.50 gain 61 55 -107.63 gain 55 62 -99.93 gain 62 55 -96.86 gain 55 63 -103.77 gain 63 55 -99.72 gain 55 64 -104.77 gain 64 55 -105.10 gain 55 65 -91.58 gain 65 55 -91.95 gain 55 66 -90.44 gain 66 55 -90.12 gain 55 67 -86.67 gain 67 55 -86.47 gain 55 68 -96.91 gain 68 55 -96.67 gain 55 69 -73.37 gain 69 55 -71.38 gain 55 70 -70.89 gain 70 55 -71.61 gain 55 71 -75.87 gain 71 55 -77.34 gain 55 72 -90.62 gain 72 55 -93.95 gain 55 73 -84.89 gain 73 55 -85.26 gain 55 74 -87.87 gain 74 55 -84.24 gain 55 75 -110.31 gain 75 55 -107.06 gain 55 76 -103.51 gain 76 55 -102.76 gain 55 77 -104.63 gain 77 55 -102.18 gain 55 78 -101.07 gain 78 55 -107.25 gain 55 79 -99.48 gain 79 55 -100.20 gain 55 80 -96.41 gain 80 55 -95.46 gain 55 81 -93.97 gain 81 55 -97.30 gain 55 82 -93.30 gain 82 55 -95.78 gain 55 83 -94.84 gain 83 55 -96.91 gain 55 84 -84.60 gain 84 55 -83.74 gain 55 85 -89.58 gain 85 55 -93.30 gain 55 86 -84.14 gain 86 55 -81.05 gain 55 87 -89.80 gain 87 55 -89.50 gain 55 88 -96.30 gain 88 55 -96.29 gain 55 89 -94.64 gain 89 55 -95.27 gain 55 90 -103.90 gain 90 55 -108.06 gain 55 91 -111.87 gain 91 55 -111.62 gain 55 92 -105.21 gain 92 55 -108.52 gain 55 93 -105.42 gain 93 55 -102.64 gain 55 94 -103.81 gain 94 55 -103.47 gain 55 95 -102.57 gain 95 55 -105.27 gain 55 96 -97.16 gain 96 55 -96.14 gain 55 97 -93.74 gain 97 55 -93.99 gain 55 98 -95.51 gain 98 55 -92.93 gain 55 99 -85.51 gain 99 55 -87.03 gain 55 100 -91.74 gain 100 55 -91.09 gain 55 101 -92.09 gain 101 55 -90.11 gain 55 102 -90.47 gain 102 55 -89.15 gain 55 103 -100.58 gain 103 55 -98.49 gain 55 104 -97.37 gain 104 55 -91.71 gain 55 105 -99.13 gain 105 55 -98.87 gain 55 106 -107.50 gain 106 55 -106.54 gain 55 107 -99.47 gain 107 55 -101.53 gain 55 108 -95.88 gain 108 55 -96.01 gain 55 109 -103.71 gain 109 55 -100.68 gain 55 110 -104.50 gain 110 55 -103.71 gain 55 111 -96.77 gain 111 55 -93.18 gain 55 112 -91.53 gain 112 55 -89.94 gain 55 113 -99.26 gain 113 55 -104.60 gain 55 114 -90.29 gain 114 55 -91.27 gain 55 115 -96.45 gain 115 55 -98.28 gain 55 116 -95.08 gain 116 55 -92.94 gain 55 117 -91.04 gain 117 55 -88.75 gain 55 118 -97.26 gain 118 55 -103.14 gain 55 119 -97.19 gain 119 55 -94.62 gain 55 120 -112.23 gain 120 55 -109.76 gain 55 121 -107.65 gain 121 55 -107.93 gain 55 122 -106.96 gain 122 55 -109.81 gain 55 123 -99.08 gain 123 55 -102.18 gain 55 124 -102.74 gain 124 55 -99.45 gain 55 125 -95.56 gain 125 55 -94.20 gain 55 126 -100.35 gain 126 55 -103.87 gain 55 127 -100.59 gain 127 55 -98.86 gain 55 128 -94.65 gain 128 55 -95.98 gain 55 129 -95.07 gain 129 55 -93.62 gain 55 130 -93.54 gain 130 55 -94.27 gain 55 131 -100.22 gain 131 55 -99.31 gain 55 132 -100.99 gain 132 55 -96.35 gain 55 133 -100.15 gain 133 55 -99.94 gain 55 134 -96.19 gain 134 55 -93.98 gain 55 135 -110.53 gain 135 55 -103.91 gain 55 136 -99.12 gain 136 55 -101.27 gain 55 137 -106.32 gain 137 55 -105.12 gain 55 138 -106.70 gain 138 55 -107.52 gain 55 139 -102.13 gain 139 55 -104.66 gain 55 140 -105.64 gain 140 55 -107.97 gain 55 141 -97.78 gain 141 55 -95.80 gain 55 142 -105.62 gain 142 55 -104.79 gain 55 143 -106.98 gain 143 55 -108.61 gain 55 144 -96.63 gain 144 55 -94.16 gain 55 145 -97.27 gain 145 55 -99.35 gain 55 146 -99.35 gain 146 55 -97.87 gain 55 147 -100.72 gain 147 55 -100.43 gain 55 148 -99.34 gain 148 55 -99.58 gain 55 149 -100.38 gain 149 55 -96.99 gain 55 150 -107.77 gain 150 55 -107.77 gain 55 151 -108.36 gain 151 55 -110.84 gain 55 152 -108.96 gain 152 55 -109.80 gain 55 153 -107.71 gain 153 55 -108.24 gain 55 154 -105.90 gain 154 55 -107.57 gain 55 155 -103.24 gain 155 55 -102.21 gain 55 156 -108.21 gain 156 55 -108.29 gain 55 157 -100.67 gain 157 55 -102.05 gain 55 158 -100.66 gain 158 55 -104.01 gain 55 159 -105.82 gain 159 55 -103.21 gain 55 160 -103.57 gain 160 55 -102.34 gain 55 161 -106.25 gain 161 55 -106.07 gain 55 162 -110.84 gain 162 55 -110.29 gain 55 163 -97.87 gain 163 55 -94.74 gain 55 164 -103.59 gain 164 55 -107.69 gain 55 165 -115.09 gain 165 55 -116.54 gain 55 166 -110.22 gain 166 55 -113.33 gain 55 167 -107.48 gain 167 55 -109.42 gain 55 168 -109.77 gain 168 55 -110.77 gain 55 169 -99.01 gain 169 55 -96.53 gain 55 170 -100.59 gain 170 55 -99.05 gain 55 171 -99.63 gain 171 55 -98.65 gain 55 172 -100.16 gain 172 55 -101.98 gain 55 173 -106.49 gain 173 55 -102.63 gain 55 174 -100.15 gain 174 55 -102.25 gain 55 175 -104.86 gain 175 55 -98.75 gain 55 176 -102.17 gain 176 55 -100.29 gain 55 177 -106.64 gain 177 55 -107.13 gain 55 178 -100.95 gain 178 55 -99.04 gain 55 179 -99.49 gain 179 55 -100.63 gain 55 180 -115.67 gain 180 55 -115.54 gain 55 181 -108.70 gain 181 55 -111.97 gain 55 182 -119.80 gain 182 55 -119.20 gain 55 183 -107.51 gain 183 55 -102.80 gain 55 184 -111.43 gain 184 55 -112.94 gain 55 185 -102.26 gain 185 55 -102.28 gain 55 186 -100.21 gain 186 55 -100.93 gain 55 187 -107.66 gain 187 55 -108.40 gain 55 188 -113.27 gain 188 55 -118.45 gain 55 189 -106.64 gain 189 55 -107.89 gain 55 190 -98.69 gain 190 55 -92.77 gain 55 191 -98.03 gain 191 55 -95.28 gain 55 192 -110.81 gain 192 55 -111.73 gain 55 193 -106.09 gain 193 55 -103.03 gain 55 194 -98.20 gain 194 55 -95.04 gain 55 195 -110.14 gain 195 55 -104.94 gain 55 196 -101.58 gain 196 55 -104.05 gain 55 197 -106.20 gain 197 55 -106.16 gain 55 198 -105.19 gain 198 55 -107.80 gain 55 199 -113.97 gain 199 55 -110.59 gain 55 200 -107.94 gain 200 55 -106.47 gain 55 201 -101.73 gain 201 55 -103.36 gain 55 202 -104.81 gain 202 55 -104.73 gain 55 203 -114.87 gain 203 55 -114.89 gain 55 204 -107.46 gain 204 55 -105.70 gain 55 205 -106.23 gain 205 55 -104.14 gain 55 206 -105.27 gain 206 55 -104.51 gain 55 207 -108.24 gain 207 55 -105.22 gain 55 208 -106.07 gain 208 55 -106.35 gain 55 209 -105.41 gain 209 55 -104.73 gain 55 210 -105.92 gain 210 55 -109.23 gain 55 211 -107.42 gain 211 55 -108.13 gain 55 212 -103.72 gain 212 55 -102.98 gain 55 213 -116.32 gain 213 55 -118.32 gain 55 214 -105.03 gain 214 55 -105.21 gain 55 215 -112.00 gain 215 55 -113.99 gain 55 216 -116.23 gain 216 55 -115.11 gain 55 217 -112.23 gain 217 55 -115.57 gain 55 218 -106.46 gain 218 55 -111.12 gain 55 219 -102.45 gain 219 55 -104.68 gain 55 220 -112.82 gain 220 55 -112.16 gain 55 221 -103.33 gain 221 55 -103.66 gain 55 222 -100.77 gain 222 55 -97.69 gain 55 223 -106.54 gain 223 55 -105.74 gain 55 224 -114.70 gain 224 55 -110.83 gain 56 57 -75.41 gain 57 56 -77.45 gain 56 58 -84.25 gain 58 56 -85.84 gain 56 59 -92.09 gain 59 56 -91.84 gain 56 60 -114.49 gain 60 56 -112.65 gain 56 61 -119.15 gain 61 56 -110.20 gain 56 62 -106.76 gain 62 56 -100.60 gain 56 63 -105.25 gain 63 56 -98.10 gain 56 64 -109.25 gain 64 56 -106.49 gain 56 65 -96.84 gain 65 56 -94.12 gain 56 66 -103.87 gain 66 56 -100.46 gain 56 67 -93.14 gain 67 56 -89.85 gain 56 68 -93.42 gain 68 56 -90.08 gain 56 69 -90.74 gain 69 56 -85.66 gain 56 70 -84.01 gain 70 56 -81.63 gain 56 71 -79.12 gain 71 56 -77.50 gain 56 72 -83.52 gain 72 56 -83.75 gain 56 73 -83.19 gain 73 56 -80.47 gain 56 74 -91.29 gain 74 56 -84.57 gain 56 75 -111.23 gain 75 56 -104.88 gain 56 76 -105.35 gain 76 56 -101.50 gain 56 77 -110.17 gain 77 56 -104.62 gain 56 78 -107.51 gain 78 56 -110.60 gain 56 79 -101.53 gain 79 56 -99.16 gain 56 80 -103.02 gain 80 56 -98.98 gain 56 81 -103.73 gain 81 56 -103.97 gain 56 82 -96.30 gain 82 56 -95.70 gain 56 83 -97.45 gain 83 56 -96.42 gain 56 84 -93.41 gain 84 56 -89.46 gain 56 85 -93.55 gain 85 56 -94.18 gain 56 86 -90.33 gain 86 56 -84.14 gain 56 87 -93.74 gain 87 56 -90.35 gain 56 88 -88.69 gain 88 56 -85.58 gain 56 89 -99.10 gain 89 56 -96.63 gain 56 90 -103.72 gain 90 56 -104.78 gain 56 91 -107.83 gain 91 56 -104.48 gain 56 92 -111.86 gain 92 56 -112.08 gain 56 93 -103.79 gain 93 56 -97.92 gain 56 94 -108.43 gain 94 56 -105.00 gain 56 95 -106.73 gain 95 56 -106.34 gain 56 96 -100.81 gain 96 56 -96.69 gain 56 97 -110.58 gain 97 56 -107.74 gain 56 98 -104.91 gain 98 56 -99.24 gain 56 99 -93.19 gain 99 56 -91.62 gain 56 100 -102.52 gain 100 56 -98.78 gain 56 101 -88.42 gain 101 56 -83.35 gain 56 102 -90.26 gain 102 56 -85.85 gain 56 103 -91.83 gain 103 56 -86.65 gain 56 104 -101.54 gain 104 56 -92.78 gain 56 105 -114.25 gain 105 56 -110.90 gain 56 106 -104.83 gain 106 56 -100.78 gain 56 107 -112.84 gain 107 56 -111.81 gain 56 108 -120.30 gain 108 56 -117.33 gain 56 109 -107.40 gain 109 56 -101.27 gain 56 110 -102.16 gain 110 56 -98.27 gain 56 111 -103.00 gain 111 56 -96.32 gain 56 112 -102.93 gain 112 56 -98.25 gain 56 113 -103.02 gain 113 56 -105.27 gain 56 114 -96.35 gain 114 56 -94.23 gain 56 115 -97.68 gain 115 56 -96.43 gain 56 116 -95.10 gain 116 56 -89.87 gain 56 117 -91.30 gain 117 56 -85.91 gain 56 118 -94.63 gain 118 56 -97.42 gain 56 119 -89.27 gain 119 56 -83.60 gain 56 120 -107.38 gain 120 56 -101.82 gain 56 121 -112.57 gain 121 56 -109.75 gain 56 122 -111.82 gain 122 56 -111.57 gain 56 123 -106.95 gain 123 56 -106.96 gain 56 124 -106.14 gain 124 56 -99.75 gain 56 125 -112.38 gain 125 56 -107.93 gain 56 126 -105.92 gain 126 56 -106.35 gain 56 127 -99.80 gain 127 56 -94.98 gain 56 128 -106.91 gain 128 56 -105.15 gain 56 129 -105.95 gain 129 56 -101.41 gain 56 130 -102.23 gain 130 56 -99.87 gain 56 131 -98.68 gain 131 56 -94.67 gain 56 132 -96.04 gain 132 56 -88.31 gain 56 133 -100.66 gain 133 56 -97.35 gain 56 134 -102.26 gain 134 56 -96.96 gain 56 135 -114.70 gain 135 56 -104.98 gain 56 136 -108.10 gain 136 56 -107.16 gain 56 137 -104.59 gain 137 56 -100.30 gain 56 138 -113.62 gain 138 56 -111.34 gain 56 139 -107.11 gain 139 56 -106.54 gain 56 140 -105.83 gain 140 56 -105.07 gain 56 141 -101.65 gain 141 56 -96.58 gain 56 142 -105.77 gain 142 56 -101.85 gain 56 143 -101.45 gain 143 56 -99.98 gain 56 144 -100.33 gain 144 56 -94.77 gain 56 145 -109.72 gain 145 56 -108.71 gain 56 146 -103.13 gain 146 56 -98.56 gain 56 147 -100.44 gain 147 56 -97.06 gain 56 148 -108.78 gain 148 56 -105.93 gain 56 149 -108.49 gain 149 56 -102.01 gain 56 150 -114.28 gain 150 56 -111.18 gain 56 151 -110.00 gain 151 56 -109.38 gain 56 152 -109.58 gain 152 56 -107.32 gain 56 153 -103.16 gain 153 56 -100.59 gain 56 154 -108.18 gain 154 56 -106.75 gain 56 155 -110.22 gain 155 56 -106.09 gain 56 156 -103.75 gain 156 56 -100.75 gain 56 157 -110.62 gain 157 56 -108.91 gain 56 158 -108.79 gain 158 56 -109.04 gain 56 159 -111.16 gain 159 56 -105.45 gain 56 160 -104.20 gain 160 56 -99.88 gain 56 161 -104.05 gain 161 56 -100.78 gain 56 162 -108.83 gain 162 56 -105.18 gain 56 163 -101.97 gain 163 56 -95.75 gain 56 164 -108.08 gain 164 56 -109.09 gain 56 165 -109.39 gain 165 56 -107.75 gain 56 166 -114.86 gain 166 56 -114.88 gain 56 167 -119.46 gain 167 56 -118.30 gain 56 168 -108.17 gain 168 56 -106.08 gain 56 169 -105.53 gain 169 56 -99.96 gain 56 170 -105.40 gain 170 56 -100.76 gain 56 171 -100.59 gain 171 56 -96.52 gain 56 172 -101.52 gain 172 56 -100.25 gain 56 173 -105.48 gain 173 56 -98.53 gain 56 174 -103.95 gain 174 56 -102.96 gain 56 175 -108.10 gain 175 56 -98.90 gain 56 176 -109.62 gain 176 56 -104.65 gain 56 177 -105.75 gain 177 56 -103.13 gain 56 178 -101.24 gain 178 56 -96.24 gain 56 179 -106.03 gain 179 56 -104.07 gain 56 180 -114.21 gain 180 56 -110.99 gain 56 181 -112.30 gain 181 56 -112.48 gain 56 182 -107.39 gain 182 56 -103.70 gain 56 183 -113.13 gain 183 56 -105.32 gain 56 184 -114.38 gain 184 56 -112.80 gain 56 185 -106.40 gain 185 56 -103.32 gain 56 186 -111.71 gain 186 56 -109.33 gain 56 187 -104.60 gain 187 56 -102.24 gain 56 188 -102.56 gain 188 56 -104.65 gain 56 189 -108.66 gain 189 56 -106.81 gain 56 190 -97.05 gain 190 56 -88.03 gain 56 191 -108.15 gain 191 56 -102.30 gain 56 192 -110.16 gain 192 56 -107.98 gain 56 193 -101.94 gain 193 56 -95.78 gain 56 194 -102.24 gain 194 56 -95.98 gain 56 195 -112.05 gain 195 56 -103.76 gain 56 196 -109.56 gain 196 56 -108.93 gain 56 197 -113.63 gain 197 56 -110.50 gain 56 198 -109.94 gain 198 56 -109.45 gain 56 199 -107.06 gain 199 56 -100.58 gain 56 200 -112.56 gain 200 56 -108.00 gain 56 201 -110.15 gain 201 56 -108.69 gain 56 202 -101.37 gain 202 56 -98.20 gain 56 203 -118.13 gain 203 56 -115.06 gain 56 204 -106.53 gain 204 56 -101.68 gain 56 205 -108.66 gain 205 56 -103.48 gain 56 206 -107.90 gain 206 56 -104.04 gain 56 207 -110.46 gain 207 56 -104.34 gain 56 208 -104.75 gain 208 56 -101.94 gain 56 209 -115.03 gain 209 56 -111.26 gain 56 210 -115.52 gain 210 56 -115.75 gain 56 211 -112.58 gain 211 56 -110.19 gain 56 212 -111.13 gain 212 56 -107.30 gain 56 213 -112.29 gain 213 56 -111.20 gain 56 214 -111.16 gain 214 56 -108.25 gain 56 215 -118.28 gain 215 56 -117.18 gain 56 216 -115.48 gain 216 56 -111.27 gain 56 217 -110.60 gain 217 56 -110.85 gain 56 218 -108.05 gain 218 56 -109.61 gain 56 219 -113.27 gain 219 56 -112.41 gain 56 220 -106.54 gain 220 56 -102.79 gain 56 221 -109.91 gain 221 56 -107.15 gain 56 222 -104.75 gain 222 56 -98.57 gain 56 223 -103.35 gain 223 56 -99.46 gain 56 224 -111.72 gain 224 56 -104.76 gain 57 58 -82.37 gain 58 57 -81.92 gain 57 59 -85.88 gain 59 57 -83.60 gain 57 60 -109.69 gain 60 57 -105.82 gain 57 61 -110.83 gain 61 57 -99.83 gain 57 62 -109.68 gain 62 57 -101.48 gain 57 63 -107.23 gain 63 57 -98.05 gain 57 64 -109.83 gain 64 57 -105.03 gain 57 65 -104.56 gain 65 57 -99.80 gain 57 66 -106.63 gain 66 57 -101.18 gain 57 67 -100.80 gain 67 57 -95.47 gain 57 68 -103.93 gain 68 57 -98.55 gain 57 69 -97.12 gain 69 57 -90.00 gain 57 70 -87.90 gain 70 57 -83.49 gain 57 71 -88.44 gain 71 57 -84.78 gain 57 72 -76.63 gain 72 57 -74.82 gain 57 73 -87.23 gain 73 57 -82.47 gain 57 74 -93.04 gain 74 57 -84.28 gain 57 75 -102.32 gain 75 57 -93.94 gain 57 76 -113.37 gain 76 57 -107.48 gain 57 77 -108.04 gain 77 57 -100.45 gain 57 78 -104.77 gain 78 57 -105.82 gain 57 79 -106.11 gain 79 57 -101.70 gain 57 80 -104.62 gain 80 57 -98.54 gain 57 81 -111.65 gain 81 57 -109.85 gain 57 82 -108.12 gain 82 57 -105.48 gain 57 83 -95.88 gain 83 57 -92.81 gain 57 84 -100.13 gain 84 57 -94.14 gain 57 85 -92.57 gain 85 57 -91.16 gain 57 86 -83.30 gain 86 57 -75.08 gain 57 87 -89.22 gain 87 57 -83.79 gain 57 88 -92.11 gain 88 57 -86.96 gain 57 89 -96.31 gain 89 57 -91.80 gain 57 90 -107.87 gain 90 57 -106.90 gain 57 91 -114.57 gain 91 57 -109.18 gain 57 92 -105.31 gain 92 57 -103.49 gain 57 93 -115.05 gain 93 57 -107.15 gain 57 94 -106.93 gain 94 57 -101.46 gain 57 95 -105.25 gain 95 57 -102.81 gain 57 96 -102.52 gain 96 57 -96.36 gain 57 97 -100.64 gain 97 57 -95.76 gain 57 98 -102.93 gain 98 57 -95.22 gain 57 99 -104.15 gain 99 57 -100.53 gain 57 100 -98.86 gain 100 57 -93.08 gain 57 101 -95.92 gain 101 57 -88.81 gain 57 102 -98.94 gain 102 57 -92.49 gain 57 103 -99.99 gain 103 57 -92.76 gain 57 104 -97.71 gain 104 57 -86.92 gain 57 105 -116.01 gain 105 57 -110.61 gain 57 106 -111.37 gain 106 57 -105.28 gain 57 107 -113.15 gain 107 57 -110.08 gain 57 108 -107.96 gain 108 57 -102.96 gain 57 109 -110.43 gain 109 57 -102.27 gain 57 110 -104.66 gain 110 57 -98.74 gain 57 111 -103.87 gain 111 57 -95.14 gain 57 112 -110.01 gain 112 57 -103.28 gain 57 113 -106.49 gain 113 57 -106.71 gain 57 114 -107.42 gain 114 57 -103.27 gain 57 115 -94.55 gain 115 57 -91.25 gain 57 116 -101.21 gain 116 57 -93.94 gain 57 117 -97.90 gain 117 57 -90.47 gain 57 118 -97.11 gain 118 57 -97.85 gain 57 119 -101.33 gain 119 57 -93.63 gain 57 120 -114.25 gain 120 57 -106.65 gain 57 121 -117.45 gain 121 57 -112.60 gain 57 122 -110.39 gain 122 57 -108.11 gain 57 123 -109.43 gain 123 57 -107.40 gain 57 124 -110.78 gain 124 57 -102.35 gain 57 125 -108.54 gain 125 57 -102.05 gain 57 126 -110.47 gain 126 57 -108.85 gain 57 127 -106.95 gain 127 57 -100.09 gain 57 128 -106.98 gain 128 57 -103.18 gain 57 129 -104.38 gain 129 57 -97.80 gain 57 130 -110.86 gain 130 57 -106.46 gain 57 131 -104.65 gain 131 57 -98.60 gain 57 132 -106.29 gain 132 57 -96.51 gain 57 133 -102.56 gain 133 57 -97.21 gain 57 134 -102.85 gain 134 57 -95.50 gain 57 135 -111.84 gain 135 57 -100.08 gain 57 136 -113.63 gain 136 57 -110.64 gain 57 137 -114.08 gain 137 57 -107.76 gain 57 138 -113.31 gain 138 57 -109.00 gain 57 139 -115.88 gain 139 57 -113.27 gain 57 140 -116.42 gain 140 57 -113.62 gain 57 141 -107.84 gain 141 57 -100.73 gain 57 142 -112.67 gain 142 57 -106.72 gain 57 143 -105.13 gain 143 57 -101.63 gain 57 144 -104.47 gain 144 57 -96.86 gain 57 145 -99.26 gain 145 57 -96.21 gain 57 146 -104.65 gain 146 57 -98.04 gain 57 147 -102.50 gain 147 57 -97.08 gain 57 148 -106.88 gain 148 57 -101.99 gain 57 149 -108.26 gain 149 57 -99.74 gain 57 150 -113.54 gain 150 57 -108.40 gain 57 151 -106.77 gain 151 57 -104.11 gain 57 152 -119.50 gain 152 57 -115.20 gain 57 153 -108.49 gain 153 57 -103.89 gain 57 154 -113.28 gain 154 57 -109.81 gain 57 155 -109.65 gain 155 57 -103.48 gain 57 156 -111.50 gain 156 57 -106.45 gain 57 157 -109.61 gain 157 57 -105.86 gain 57 158 -105.35 gain 158 57 -103.56 gain 57 159 -105.16 gain 159 57 -97.41 gain 57 160 -102.38 gain 160 57 -96.02 gain 57 161 -105.30 gain 161 57 -99.98 gain 57 162 -112.60 gain 162 57 -106.92 gain 57 163 -113.30 gain 163 57 -105.04 gain 57 164 -106.85 gain 164 57 -105.81 gain 57 165 -112.16 gain 165 57 -108.48 gain 57 166 -116.12 gain 166 57 -114.09 gain 57 167 -116.93 gain 167 57 -113.74 gain 57 168 -112.23 gain 168 57 -108.10 gain 57 169 -109.60 gain 169 57 -101.99 gain 57 170 -109.85 gain 170 57 -103.18 gain 57 171 -104.53 gain 171 57 -98.42 gain 57 172 -108.03 gain 172 57 -104.72 gain 57 173 -111.51 gain 173 57 -102.52 gain 57 174 -108.92 gain 174 57 -105.88 gain 57 175 -107.48 gain 175 57 -96.25 gain 57 176 -111.20 gain 176 57 -104.19 gain 57 177 -111.22 gain 177 57 -106.57 gain 57 178 -106.04 gain 178 57 -99.00 gain 57 179 -109.56 gain 179 57 -105.56 gain 57 180 -114.22 gain 180 57 -108.95 gain 57 181 -109.80 gain 181 57 -107.94 gain 57 182 -115.78 gain 182 57 -110.05 gain 57 183 -118.90 gain 183 57 -109.06 gain 57 184 -115.27 gain 184 57 -111.65 gain 57 185 -115.42 gain 185 57 -110.30 gain 57 186 -114.33 gain 186 57 -109.91 gain 57 187 -118.23 gain 187 57 -113.84 gain 57 188 -108.39 gain 188 57 -108.44 gain 57 189 -109.97 gain 189 57 -106.07 gain 57 190 -114.81 gain 190 57 -103.75 gain 57 191 -113.51 gain 191 57 -105.63 gain 57 192 -113.29 gain 192 57 -109.08 gain 57 193 -110.95 gain 193 57 -102.76 gain 57 194 -110.79 gain 194 57 -102.49 gain 57 195 -114.56 gain 195 57 -104.23 gain 57 196 -118.99 gain 196 57 -116.33 gain 57 197 -115.44 gain 197 57 -110.27 gain 57 198 -117.26 gain 198 57 -114.73 gain 57 199 -107.63 gain 199 57 -99.12 gain 57 200 -111.19 gain 200 57 -104.59 gain 57 201 -111.91 gain 201 57 -108.40 gain 57 202 -113.58 gain 202 57 -108.38 gain 57 203 -112.04 gain 203 57 -106.93 gain 57 204 -110.92 gain 204 57 -104.03 gain 57 205 -111.39 gain 205 57 -104.17 gain 57 206 -113.41 gain 206 57 -107.51 gain 57 207 -105.59 gain 207 57 -97.43 gain 57 208 -112.53 gain 208 57 -107.67 gain 57 209 -113.44 gain 209 57 -107.62 gain 57 210 -112.66 gain 210 57 -110.84 gain 57 211 -119.45 gain 211 57 -115.03 gain 57 212 -115.62 gain 212 57 -109.74 gain 57 213 -112.35 gain 213 57 -109.21 gain 57 214 -117.65 gain 214 57 -112.70 gain 57 215 -111.69 gain 215 57 -108.55 gain 57 216 -107.07 gain 216 57 -100.83 gain 57 217 -111.78 gain 217 57 -109.99 gain 57 218 -108.86 gain 218 57 -108.38 gain 57 219 -115.13 gain 219 57 -112.23 gain 57 220 -104.78 gain 220 57 -98.99 gain 57 221 -115.95 gain 221 57 -111.16 gain 57 222 -115.60 gain 222 57 -107.38 gain 57 223 -109.84 gain 223 57 -103.90 gain 57 224 -117.13 gain 224 57 -108.13 gain 58 59 -83.34 gain 59 58 -81.51 gain 58 60 -120.08 gain 60 58 -116.66 gain 58 61 -117.10 gain 61 58 -106.55 gain 58 62 -106.90 gain 62 58 -99.15 gain 58 63 -108.38 gain 63 58 -99.65 gain 58 64 -112.02 gain 64 58 -107.67 gain 58 65 -107.54 gain 65 58 -103.23 gain 58 66 -109.01 gain 66 58 -104.00 gain 58 67 -103.29 gain 67 58 -98.41 gain 58 68 -105.48 gain 68 58 -100.56 gain 58 69 -109.14 gain 69 58 -102.47 gain 58 70 -91.36 gain 70 58 -87.40 gain 58 71 -90.57 gain 71 58 -87.36 gain 58 72 -87.11 gain 72 58 -85.75 gain 58 73 -76.21 gain 73 58 -71.90 gain 58 74 -89.30 gain 74 58 -80.99 gain 58 75 -117.11 gain 75 58 -109.18 gain 58 76 -113.40 gain 76 58 -107.97 gain 58 77 -116.75 gain 77 58 -109.62 gain 58 78 -106.53 gain 78 58 -108.03 gain 58 79 -104.49 gain 79 58 -100.53 gain 58 80 -114.00 gain 80 58 -108.37 gain 58 81 -103.43 gain 81 58 -102.08 gain 58 82 -106.77 gain 82 58 -104.58 gain 58 83 -110.23 gain 83 58 -107.62 gain 58 84 -102.65 gain 84 58 -97.11 gain 58 85 -92.85 gain 85 58 -91.89 gain 58 86 -98.04 gain 86 58 -90.27 gain 58 87 -89.20 gain 87 58 -84.22 gain 58 88 -85.95 gain 88 58 -81.26 gain 58 89 -94.38 gain 89 58 -90.32 gain 58 90 -114.76 gain 90 58 -114.23 gain 58 91 -114.18 gain 91 58 -109.24 gain 58 92 -117.23 gain 92 58 -115.86 gain 58 93 -111.85 gain 93 58 -104.40 gain 58 94 -112.65 gain 94 58 -107.63 gain 58 95 -112.10 gain 95 58 -110.12 gain 58 96 -111.77 gain 96 58 -106.07 gain 58 97 -108.93 gain 97 58 -104.50 gain 58 98 -103.65 gain 98 58 -96.40 gain 58 99 -101.82 gain 99 58 -98.65 gain 58 100 -101.84 gain 100 58 -96.52 gain 58 101 -98.34 gain 101 58 -91.68 gain 58 102 -98.68 gain 102 58 -92.68 gain 58 103 -98.14 gain 103 58 -91.37 gain 58 104 -94.60 gain 104 58 -84.26 gain 58 105 -112.56 gain 105 58 -107.62 gain 58 106 -108.93 gain 106 58 -103.30 gain 58 107 -114.25 gain 107 58 -111.63 gain 58 108 -109.46 gain 108 58 -104.91 gain 58 109 -111.23 gain 109 58 -103.52 gain 58 110 -110.77 gain 110 58 -105.30 gain 58 111 -102.20 gain 111 58 -93.92 gain 58 112 -101.90 gain 112 58 -95.63 gain 58 113 -106.61 gain 113 58 -107.28 gain 58 114 -97.46 gain 114 58 -93.76 gain 58 115 -102.27 gain 115 58 -99.42 gain 58 116 -95.10 gain 116 58 -88.28 gain 58 117 -106.87 gain 117 58 -99.90 gain 58 118 -101.70 gain 118 58 -102.90 gain 58 119 -97.50 gain 119 58 -90.25 gain 58 120 -112.00 gain 120 58 -104.85 gain 58 121 -122.34 gain 121 58 -117.94 gain 58 122 -119.05 gain 122 58 -117.22 gain 58 123 -113.44 gain 123 58 -111.86 gain 58 124 -107.23 gain 124 58 -99.25 gain 58 125 -105.70 gain 125 58 -99.66 gain 58 126 -109.18 gain 126 58 -108.02 gain 58 127 -107.51 gain 127 58 -101.10 gain 58 128 -111.01 gain 128 58 -107.66 gain 58 129 -110.27 gain 129 58 -104.14 gain 58 130 -100.90 gain 130 58 -96.95 gain 58 131 -100.68 gain 131 58 -95.09 gain 58 132 -100.93 gain 132 58 -91.61 gain 58 133 -98.53 gain 133 58 -93.64 gain 58 134 -107.60 gain 134 58 -100.71 gain 58 135 -116.76 gain 135 58 -105.45 gain 58 136 -117.71 gain 136 58 -115.17 gain 58 137 -108.52 gain 137 58 -102.65 gain 58 138 -117.36 gain 138 58 -113.50 gain 58 139 -109.20 gain 139 58 -107.04 gain 58 140 -105.67 gain 140 58 -103.33 gain 58 141 -105.81 gain 141 58 -99.16 gain 58 142 -110.54 gain 142 58 -105.04 gain 58 143 -99.12 gain 143 58 -96.07 gain 58 144 -105.21 gain 144 58 -98.06 gain 58 145 -101.07 gain 145 58 -98.47 gain 58 146 -103.96 gain 146 58 -97.80 gain 58 147 -102.44 gain 147 58 -97.47 gain 58 148 -98.76 gain 148 58 -94.32 gain 58 149 -106.82 gain 149 58 -98.75 gain 58 150 -121.61 gain 150 58 -116.93 gain 58 151 -116.43 gain 151 58 -114.23 gain 58 152 -122.12 gain 152 58 -118.28 gain 58 153 -108.14 gain 153 58 -103.99 gain 58 154 -108.18 gain 154 58 -105.17 gain 58 155 -116.71 gain 155 58 -111.00 gain 58 156 -108.11 gain 156 58 -103.52 gain 58 157 -102.91 gain 157 58 -99.61 gain 58 158 -107.85 gain 158 58 -106.53 gain 58 159 -107.52 gain 159 58 -100.23 gain 58 160 -108.46 gain 160 58 -102.55 gain 58 161 -110.41 gain 161 58 -105.55 gain 58 162 -109.20 gain 162 58 -103.97 gain 58 163 -102.23 gain 163 58 -94.42 gain 58 164 -104.90 gain 164 58 -104.32 gain 58 165 -108.91 gain 165 58 -105.69 gain 58 166 -117.45 gain 166 58 -115.88 gain 58 167 -118.35 gain 167 58 -115.60 gain 58 168 -115.83 gain 168 58 -112.15 gain 58 169 -114.48 gain 169 58 -107.32 gain 58 170 -113.55 gain 170 58 -107.32 gain 58 171 -105.86 gain 171 58 -100.20 gain 58 172 -104.10 gain 172 58 -101.24 gain 58 173 -112.29 gain 173 58 -103.76 gain 58 174 -114.81 gain 174 58 -112.23 gain 58 175 -112.83 gain 175 58 -102.04 gain 58 176 -106.85 gain 176 58 -100.29 gain 58 177 -113.37 gain 177 58 -109.17 gain 58 178 -108.72 gain 178 58 -102.13 gain 58 179 -102.32 gain 179 58 -98.77 gain 58 180 -117.03 gain 180 58 -112.22 gain 58 181 -111.52 gain 181 58 -110.11 gain 58 182 -109.15 gain 182 58 -103.88 gain 58 183 -127.39 gain 183 58 -118.00 gain 58 184 -119.91 gain 184 58 -116.74 gain 58 185 -113.25 gain 185 58 -108.58 gain 58 186 -112.54 gain 186 58 -108.57 gain 58 187 -115.81 gain 187 58 -111.87 gain 58 188 -107.81 gain 188 58 -108.31 gain 58 189 -108.31 gain 189 58 -104.87 gain 58 190 -114.67 gain 190 58 -104.06 gain 58 191 -108.96 gain 191 58 -101.53 gain 58 192 -117.58 gain 192 58 -113.82 gain 58 193 -109.94 gain 193 58 -102.20 gain 58 194 -114.35 gain 194 58 -106.50 gain 58 195 -109.59 gain 195 58 -99.72 gain 58 196 -115.78 gain 196 58 -113.57 gain 58 197 -118.73 gain 197 58 -114.01 gain 58 198 -117.46 gain 198 58 -115.39 gain 58 199 -116.98 gain 199 58 -108.92 gain 58 200 -115.23 gain 200 58 -109.09 gain 58 201 -108.42 gain 201 58 -105.36 gain 58 202 -112.65 gain 202 58 -107.89 gain 58 203 -109.53 gain 203 58 -104.87 gain 58 204 -115.54 gain 204 58 -109.10 gain 58 205 -120.97 gain 205 58 -114.20 gain 58 206 -113.10 gain 206 58 -107.65 gain 58 207 -109.71 gain 207 58 -102.00 gain 58 208 -106.87 gain 208 58 -102.47 gain 58 209 -113.40 gain 209 58 -108.04 gain 58 210 -110.09 gain 210 58 -108.73 gain 58 211 -111.56 gain 211 58 -107.59 gain 58 212 -116.50 gain 212 58 -111.08 gain 58 213 -124.46 gain 213 58 -121.78 gain 58 214 -111.70 gain 214 58 -107.20 gain 58 215 -116.49 gain 215 58 -113.80 gain 58 216 -110.02 gain 216 58 -104.23 gain 58 217 -112.10 gain 217 58 -110.75 gain 58 218 -111.90 gain 218 58 -111.87 gain 58 219 -118.50 gain 219 58 -116.05 gain 58 220 -115.71 gain 220 58 -110.38 gain 58 221 -112.21 gain 221 58 -107.87 gain 58 222 -109.56 gain 222 58 -101.79 gain 58 223 -116.55 gain 223 58 -111.07 gain 58 224 -105.05 gain 224 58 -96.50 gain 59 60 -113.37 gain 60 59 -111.78 gain 59 61 -108.76 gain 61 59 -100.05 gain 59 62 -109.70 gain 62 59 -103.79 gain 59 63 -110.95 gain 63 59 -104.05 gain 59 64 -108.96 gain 64 59 -106.44 gain 59 65 -113.72 gain 65 59 -111.24 gain 59 66 -107.21 gain 66 59 -104.04 gain 59 67 -97.83 gain 67 59 -94.79 gain 59 68 -103.81 gain 68 59 -100.72 gain 59 69 -103.78 gain 69 59 -98.95 gain 59 70 -99.31 gain 70 59 -97.19 gain 59 71 -96.02 gain 71 59 -94.65 gain 59 72 -87.19 gain 72 59 -87.66 gain 59 73 -83.10 gain 73 59 -80.63 gain 59 74 -77.65 gain 74 59 -71.18 gain 59 75 -112.32 gain 75 59 -106.23 gain 59 76 -109.28 gain 76 59 -105.68 gain 59 77 -105.89 gain 77 59 -100.59 gain 59 78 -113.20 gain 78 59 -116.54 gain 59 79 -107.22 gain 79 59 -105.10 gain 59 80 -109.16 gain 80 59 -105.37 gain 59 81 -112.80 gain 81 59 -113.29 gain 59 82 -100.93 gain 82 59 -100.58 gain 59 83 -101.39 gain 83 59 -100.61 gain 59 84 -99.02 gain 84 59 -95.32 gain 59 85 -93.26 gain 85 59 -94.14 gain 59 86 -99.10 gain 86 59 -93.17 gain 59 87 -86.31 gain 87 59 -83.17 gain 59 88 -85.47 gain 88 59 -82.61 gain 59 89 -93.34 gain 89 59 -91.12 gain 59 90 -111.17 gain 90 59 -112.48 gain 59 91 -116.49 gain 91 59 -113.39 gain 59 92 -100.50 gain 92 59 -100.97 gain 59 93 -112.20 gain 93 59 -106.58 gain 59 94 -103.71 gain 94 59 -100.53 gain 59 95 -110.14 gain 95 59 -110.00 gain 59 96 -105.44 gain 96 59 -101.57 gain 59 97 -101.19 gain 97 59 -98.60 gain 59 98 -104.34 gain 98 59 -98.92 gain 59 99 -102.77 gain 99 59 -101.44 gain 59 100 -101.02 gain 100 59 -97.53 gain 59 101 -91.23 gain 101 59 -86.41 gain 59 102 -85.12 gain 102 59 -80.95 gain 59 103 -92.13 gain 103 59 -87.20 gain 59 104 -96.95 gain 104 59 -88.45 gain 59 105 -115.28 gain 105 59 -112.18 gain 59 106 -108.72 gain 106 59 -104.92 gain 59 107 -108.66 gain 107 59 -107.88 gain 59 108 -113.39 gain 108 59 -110.67 gain 59 109 -114.03 gain 109 59 -108.15 gain 59 110 -111.34 gain 110 59 -107.71 gain 59 111 -106.19 gain 111 59 -99.75 gain 59 112 -108.76 gain 112 59 -104.32 gain 59 113 -110.05 gain 113 59 -112.55 gain 59 114 -103.31 gain 114 59 -101.45 gain 59 115 -96.47 gain 115 59 -95.46 gain 59 116 -99.92 gain 116 59 -94.94 gain 59 117 -99.09 gain 117 59 -93.95 gain 59 118 -100.35 gain 118 59 -103.39 gain 59 119 -92.95 gain 119 59 -87.54 gain 59 120 -116.04 gain 120 59 -110.72 gain 59 121 -112.47 gain 121 59 -109.90 gain 59 122 -113.44 gain 122 59 -113.45 gain 59 123 -115.53 gain 123 59 -115.79 gain 59 124 -111.79 gain 124 59 -105.65 gain 59 125 -111.36 gain 125 59 -107.16 gain 59 126 -101.92 gain 126 59 -102.60 gain 59 127 -110.97 gain 127 59 -106.40 gain 59 128 -103.82 gain 128 59 -102.31 gain 59 129 -106.76 gain 129 59 -102.46 gain 59 130 -97.07 gain 130 59 -94.95 gain 59 131 -105.04 gain 131 59 -101.28 gain 59 132 -89.17 gain 132 59 -81.69 gain 59 133 -104.46 gain 133 59 -101.40 gain 59 134 -98.14 gain 134 59 -93.08 gain 59 135 -110.51 gain 135 59 -101.04 gain 59 136 -115.62 gain 136 59 -114.92 gain 59 137 -106.13 gain 137 59 -102.10 gain 59 138 -105.31 gain 138 59 -103.29 gain 59 139 -112.13 gain 139 59 -111.82 gain 59 140 -116.01 gain 140 59 -115.51 gain 59 141 -108.08 gain 141 59 -103.26 gain 59 142 -109.47 gain 142 59 -105.80 gain 59 143 -110.01 gain 143 59 -108.79 gain 59 144 -108.45 gain 144 59 -103.13 gain 59 145 -104.14 gain 145 59 -103.38 gain 59 146 -102.18 gain 146 59 -97.86 gain 59 147 -100.88 gain 147 59 -97.75 gain 59 148 -102.74 gain 148 59 -100.13 gain 59 149 -109.47 gain 149 59 -103.24 gain 59 150 -118.04 gain 150 59 -115.20 gain 59 151 -107.57 gain 151 59 -107.20 gain 59 152 -113.77 gain 152 59 -111.76 gain 59 153 -113.86 gain 153 59 -111.55 gain 59 154 -111.36 gain 154 59 -110.18 gain 59 155 -109.42 gain 155 59 -105.54 gain 59 156 -112.02 gain 156 59 -109.26 gain 59 157 -108.75 gain 157 59 -107.29 gain 59 158 -106.81 gain 158 59 -107.32 gain 59 159 -111.92 gain 159 59 -106.46 gain 59 160 -101.40 gain 160 59 -97.32 gain 59 161 -106.25 gain 161 59 -103.23 gain 59 162 -102.69 gain 162 59 -99.30 gain 59 163 -110.04 gain 163 59 -104.06 gain 59 164 -102.45 gain 164 59 -103.70 gain 59 165 -112.83 gain 165 59 -111.44 gain 59 166 -104.15 gain 166 59 -104.42 gain 59 167 -111.05 gain 167 59 -110.14 gain 59 168 -108.12 gain 168 59 -106.27 gain 59 169 -109.05 gain 169 59 -103.72 gain 59 170 -116.02 gain 170 59 -111.63 gain 59 171 -116.19 gain 171 59 -112.38 gain 59 172 -107.90 gain 172 59 -106.88 gain 59 173 -108.75 gain 173 59 -102.05 gain 59 174 -104.31 gain 174 59 -103.57 gain 59 175 -107.72 gain 175 59 -98.77 gain 59 176 -107.08 gain 176 59 -102.35 gain 59 177 -107.03 gain 177 59 -104.67 gain 59 178 -103.83 gain 178 59 -99.07 gain 59 179 -115.19 gain 179 59 -113.48 gain 59 180 -113.97 gain 180 59 -110.99 gain 59 181 -116.63 gain 181 59 -117.06 gain 59 182 -110.86 gain 182 59 -107.42 gain 59 183 -107.89 gain 183 59 -100.33 gain 59 184 -111.37 gain 184 59 -110.04 gain 59 185 -112.55 gain 185 59 -109.72 gain 59 186 -112.47 gain 186 59 -110.34 gain 59 187 -111.71 gain 187 59 -109.61 gain 59 188 -110.99 gain 188 59 -113.33 gain 59 189 -111.82 gain 189 59 -110.22 gain 59 190 -114.50 gain 190 59 -105.73 gain 59 191 -112.13 gain 191 59 -106.53 gain 59 192 -107.81 gain 192 59 -105.89 gain 59 193 -108.24 gain 193 59 -102.34 gain 59 194 -107.60 gain 194 59 -101.59 gain 59 195 -117.20 gain 195 59 -109.16 gain 59 196 -119.96 gain 196 59 -119.59 gain 59 197 -114.55 gain 197 59 -111.67 gain 59 198 -112.07 gain 198 59 -111.83 gain 59 199 -106.81 gain 199 59 -100.59 gain 59 200 -110.43 gain 200 59 -106.13 gain 59 201 -105.89 gain 201 59 -104.67 gain 59 202 -111.33 gain 202 59 -108.41 gain 59 203 -111.46 gain 203 59 -108.64 gain 59 204 -113.01 gain 204 59 -108.41 gain 59 205 -114.80 gain 205 59 -109.87 gain 59 206 -107.71 gain 206 59 -104.10 gain 59 207 -108.36 gain 207 59 -102.49 gain 59 208 -111.61 gain 208 59 -109.04 gain 59 209 -103.06 gain 209 59 -99.53 gain 59 210 -117.17 gain 210 59 -117.64 gain 59 211 -120.53 gain 211 59 -118.39 gain 59 212 -111.32 gain 212 59 -107.74 gain 59 213 -119.95 gain 213 59 -119.10 gain 59 214 -120.19 gain 214 59 -117.53 gain 59 215 -114.02 gain 215 59 -113.17 gain 59 216 -109.05 gain 216 59 -105.10 gain 59 217 -111.10 gain 217 59 -111.60 gain 59 218 -114.77 gain 218 59 -116.58 gain 59 219 -114.58 gain 219 59 -113.97 gain 59 220 -108.11 gain 220 59 -104.61 gain 59 221 -114.66 gain 221 59 -112.15 gain 59 222 -103.08 gain 222 59 -97.15 gain 59 223 -105.83 gain 223 59 -102.19 gain 59 224 -114.33 gain 224 59 -107.62 gain 60 61 -76.16 gain 61 60 -69.04 gain 60 62 -79.92 gain 62 60 -75.60 gain 60 63 -85.24 gain 63 60 -79.93 gain 60 64 -102.49 gain 64 60 -101.56 gain 60 65 -98.37 gain 65 60 -97.49 gain 60 66 -102.78 gain 66 60 -101.20 gain 60 67 -99.90 gain 67 60 -98.44 gain 60 68 -98.73 gain 68 60 -97.23 gain 60 69 -105.66 gain 69 60 -102.42 gain 60 70 -102.54 gain 70 60 -102.00 gain 60 71 -114.54 gain 71 60 -114.76 gain 60 72 -108.54 gain 72 60 -110.60 gain 60 73 -112.79 gain 73 60 -111.91 gain 60 74 -118.07 gain 74 60 -113.18 gain 60 75 -73.89 gain 75 60 -69.39 gain 60 76 -84.16 gain 76 60 -82.15 gain 60 77 -85.70 gain 77 60 -81.99 gain 60 78 -95.34 gain 78 60 -100.27 gain 60 79 -93.24 gain 79 60 -92.70 gain 60 80 -101.21 gain 80 60 -99.01 gain 60 81 -91.71 gain 81 60 -93.78 gain 60 82 -98.06 gain 82 60 -99.30 gain 60 83 -101.04 gain 83 60 -101.85 gain 60 84 -111.65 gain 84 60 -109.54 gain 60 85 -107.20 gain 85 60 -109.67 gain 60 86 -102.33 gain 86 60 -97.98 gain 60 87 -108.24 gain 87 60 -106.69 gain 60 88 -121.14 gain 88 60 -119.87 gain 60 89 -109.05 gain 89 60 -108.42 gain 60 90 -86.13 gain 90 60 -89.03 gain 60 91 -92.87 gain 91 60 -91.36 gain 60 92 -88.24 gain 92 60 -90.30 gain 60 93 -99.20 gain 93 60 -95.17 gain 60 94 -100.95 gain 94 60 -99.35 gain 60 95 -103.43 gain 95 60 -104.88 gain 60 96 -99.12 gain 96 60 -96.84 gain 60 97 -109.10 gain 97 60 -108.09 gain 60 98 -103.81 gain 98 60 -99.98 gain 60 99 -108.10 gain 99 60 -108.36 gain 60 100 -107.15 gain 100 60 -105.26 gain 60 101 -120.46 gain 101 60 -117.22 gain 60 102 -109.35 gain 102 60 -106.77 gain 60 103 -111.98 gain 103 60 -108.63 gain 60 104 -108.56 gain 104 60 -101.64 gain 60 105 -93.25 gain 105 60 -91.74 gain 60 106 -89.21 gain 106 60 -87.01 gain 60 107 -96.80 gain 107 60 -97.61 gain 60 108 -95.45 gain 108 60 -94.32 gain 60 109 -96.67 gain 109 60 -92.39 gain 60 110 -102.43 gain 110 60 -100.38 gain 60 111 -103.75 gain 111 60 -98.90 gain 60 112 -107.08 gain 112 60 -104.24 gain 60 113 -104.51 gain 113 60 -108.60 gain 60 114 -111.79 gain 114 60 -111.52 gain 60 115 -111.12 gain 115 60 -111.70 gain 60 116 -112.38 gain 116 60 -108.99 gain 60 117 -108.78 gain 117 60 -105.23 gain 60 118 -115.62 gain 118 60 -120.24 gain 60 119 -109.31 gain 119 60 -105.49 gain 60 120 -95.57 gain 120 60 -91.84 gain 60 121 -94.54 gain 121 60 -93.56 gain 60 122 -103.99 gain 122 60 -105.58 gain 60 123 -109.61 gain 123 60 -111.46 gain 60 124 -96.16 gain 124 60 -91.61 gain 60 125 -102.37 gain 125 60 -99.76 gain 60 126 -102.40 gain 126 60 -104.66 gain 60 127 -106.60 gain 127 60 -103.62 gain 60 128 -101.81 gain 128 60 -101.89 gain 60 129 -106.31 gain 129 60 -103.61 gain 60 130 -109.27 gain 130 60 -108.75 gain 60 131 -106.66 gain 131 60 -104.49 gain 60 132 -110.08 gain 132 60 -104.19 gain 60 133 -105.09 gain 133 60 -103.63 gain 60 134 -109.14 gain 134 60 -105.67 gain 60 135 -92.95 gain 135 60 -85.07 gain 60 136 -105.11 gain 136 60 -106.01 gain 60 137 -101.12 gain 137 60 -98.67 gain 60 138 -103.69 gain 138 60 -103.26 gain 60 139 -108.13 gain 139 60 -109.40 gain 60 140 -96.69 gain 140 60 -97.77 gain 60 141 -104.71 gain 141 60 -101.48 gain 60 142 -112.88 gain 142 60 -110.80 gain 60 143 -108.24 gain 143 60 -108.61 gain 60 144 -104.98 gain 144 60 -101.26 gain 60 145 -107.09 gain 145 60 -107.91 gain 60 146 -114.75 gain 146 60 -112.01 gain 60 147 -105.12 gain 147 60 -103.58 gain 60 148 -109.05 gain 148 60 -108.04 gain 60 149 -112.26 gain 149 60 -107.62 gain 60 150 -98.46 gain 150 60 -97.21 gain 60 151 -105.59 gain 151 60 -106.81 gain 60 152 -94.46 gain 152 60 -94.04 gain 60 153 -100.54 gain 153 60 -99.82 gain 60 154 -103.88 gain 154 60 -104.29 gain 60 155 -106.20 gain 155 60 -103.91 gain 60 156 -102.65 gain 156 60 -101.48 gain 60 157 -109.37 gain 157 60 -109.50 gain 60 158 -99.76 gain 158 60 -101.86 gain 60 159 -102.81 gain 159 60 -98.94 gain 60 160 -112.03 gain 160 60 -109.54 gain 60 161 -110.47 gain 161 60 -109.04 gain 60 162 -108.62 gain 162 60 -106.81 gain 60 163 -105.49 gain 163 60 -101.11 gain 60 164 -106.25 gain 164 60 -109.09 gain 60 165 -102.09 gain 165 60 -102.29 gain 60 166 -96.49 gain 166 60 -98.35 gain 60 167 -105.21 gain 167 60 -105.89 gain 60 168 -103.60 gain 168 60 -103.35 gain 60 169 -107.52 gain 169 60 -103.78 gain 60 170 -108.55 gain 170 60 -105.74 gain 60 171 -108.30 gain 171 60 -106.07 gain 60 172 -111.82 gain 172 60 -112.39 gain 60 173 -98.83 gain 173 60 -93.71 gain 60 174 -107.17 gain 174 60 -108.02 gain 60 175 -107.08 gain 175 60 -99.72 gain 60 176 -115.92 gain 176 60 -112.78 gain 60 177 -101.69 gain 177 60 -100.92 gain 60 178 -119.89 gain 178 60 -116.72 gain 60 179 -107.06 gain 179 60 -106.93 gain 60 180 -104.39 gain 180 60 -103.01 gain 60 181 -103.07 gain 181 60 -105.08 gain 60 182 -108.26 gain 182 60 -106.41 gain 60 183 -117.09 gain 183 60 -111.12 gain 60 184 -101.76 gain 184 60 -102.02 gain 60 185 -110.21 gain 185 60 -108.97 gain 60 186 -105.41 gain 186 60 -104.87 gain 60 187 -111.37 gain 187 60 -110.85 gain 60 188 -114.31 gain 188 60 -118.24 gain 60 189 -114.35 gain 189 60 -114.33 gain 60 190 -108.29 gain 190 60 -101.11 gain 60 191 -109.29 gain 191 60 -105.28 gain 60 192 -115.85 gain 192 60 -115.52 gain 60 193 -108.60 gain 193 60 -104.29 gain 60 194 -110.09 gain 194 60 -105.67 gain 60 195 -108.33 gain 195 60 -101.87 gain 60 196 -101.28 gain 196 60 -102.49 gain 60 197 -111.10 gain 197 60 -109.81 gain 60 198 -106.20 gain 198 60 -107.55 gain 60 199 -104.47 gain 199 60 -99.84 gain 60 200 -109.54 gain 200 60 -106.82 gain 60 201 -111.82 gain 201 60 -112.19 gain 60 202 -114.51 gain 202 60 -113.18 gain 60 203 -107.66 gain 203 60 -106.43 gain 60 204 -109.45 gain 204 60 -106.44 gain 60 205 -105.32 gain 205 60 -101.97 gain 60 206 -106.16 gain 206 60 -104.14 gain 60 207 -111.27 gain 207 60 -106.99 gain 60 208 -115.96 gain 208 60 -114.98 gain 60 209 -116.45 gain 209 60 -114.52 gain 60 210 -111.77 gain 210 60 -113.83 gain 60 211 -112.62 gain 211 60 -112.08 gain 60 212 -107.43 gain 212 60 -105.43 gain 60 213 -105.32 gain 213 60 -106.06 gain 60 214 -108.67 gain 214 60 -107.59 gain 60 215 -103.92 gain 215 60 -104.66 gain 60 216 -114.97 gain 216 60 -112.60 gain 60 217 -112.49 gain 217 60 -114.57 gain 60 218 -108.68 gain 218 60 -112.08 gain 60 219 -113.57 gain 219 60 -114.54 gain 60 220 -110.77 gain 220 60 -108.85 gain 60 221 -112.36 gain 221 60 -111.44 gain 60 222 -112.05 gain 222 60 -107.70 gain 60 223 -113.42 gain 223 60 -111.36 gain 60 224 -116.93 gain 224 60 -111.81 gain 61 62 -61.06 gain 62 61 -63.86 gain 61 63 -77.14 gain 63 61 -78.94 gain 61 64 -84.97 gain 64 61 -91.17 gain 61 65 -90.94 gain 65 61 -97.17 gain 61 66 -92.45 gain 66 61 -97.99 gain 61 67 -101.50 gain 67 61 -107.16 gain 61 68 -93.60 gain 68 61 -99.22 gain 61 69 -100.09 gain 69 61 -103.97 gain 61 70 -104.81 gain 70 61 -111.38 gain 61 71 -98.83 gain 71 61 -106.16 gain 61 72 -97.53 gain 72 61 -106.71 gain 61 73 -97.42 gain 73 61 -103.66 gain 61 74 -95.40 gain 74 61 -97.63 gain 61 75 -82.00 gain 75 61 -84.61 gain 61 76 -74.30 gain 76 61 -79.41 gain 61 77 -79.51 gain 77 61 -82.92 gain 61 78 -84.08 gain 78 61 -96.13 gain 61 79 -83.74 gain 79 61 -90.32 gain 61 80 -95.46 gain 80 61 -100.37 gain 61 81 -87.64 gain 81 61 -96.83 gain 61 82 -94.90 gain 82 61 -103.25 gain 61 83 -94.81 gain 83 61 -102.74 gain 61 84 -94.55 gain 84 61 -99.55 gain 61 85 -102.63 gain 85 61 -112.22 gain 61 86 -106.60 gain 86 61 -109.37 gain 61 87 -101.13 gain 87 61 -106.70 gain 61 88 -105.66 gain 88 61 -111.51 gain 61 89 -110.17 gain 89 61 -116.65 gain 61 90 -81.09 gain 90 61 -91.11 gain 61 91 -79.25 gain 91 61 -84.86 gain 61 92 -80.74 gain 92 61 -89.91 gain 61 93 -89.67 gain 93 61 -92.76 gain 61 94 -92.79 gain 94 61 -98.31 gain 61 95 -87.50 gain 95 61 -96.06 gain 61 96 -83.46 gain 96 61 -88.30 gain 61 97 -97.15 gain 97 61 -103.27 gain 61 98 -94.38 gain 98 61 -97.67 gain 61 99 -101.69 gain 99 61 -109.07 gain 61 100 -94.83 gain 100 61 -100.05 gain 61 101 -101.11 gain 101 61 -104.99 gain 61 102 -97.17 gain 102 61 -101.71 gain 61 103 -106.68 gain 103 61 -110.46 gain 61 104 -97.20 gain 104 61 -97.40 gain 61 105 -79.52 gain 105 61 -85.12 gain 61 106 -79.68 gain 106 61 -84.59 gain 61 107 -81.94 gain 107 61 -89.87 gain 61 108 -90.58 gain 108 61 -96.57 gain 61 109 -90.70 gain 109 61 -93.53 gain 61 110 -90.36 gain 110 61 -95.43 gain 61 111 -98.81 gain 111 61 -101.08 gain 61 112 -101.37 gain 112 61 -105.65 gain 61 113 -95.26 gain 113 61 -106.47 gain 61 114 -103.59 gain 114 61 -110.43 gain 61 115 -96.35 gain 115 61 -104.05 gain 61 116 -99.42 gain 116 61 -103.14 gain 61 117 -101.57 gain 117 61 -105.14 gain 61 118 -105.89 gain 118 61 -117.63 gain 61 119 -104.04 gain 119 61 -107.33 gain 61 120 -86.98 gain 120 61 -90.37 gain 61 121 -82.63 gain 121 61 -88.77 gain 61 122 -93.18 gain 122 61 -101.89 gain 61 123 -92.30 gain 123 61 -101.27 gain 61 124 -92.81 gain 124 61 -95.38 gain 61 125 -86.48 gain 125 61 -90.98 gain 61 126 -98.87 gain 126 61 -108.25 gain 61 127 -97.23 gain 127 61 -101.37 gain 61 128 -94.61 gain 128 61 -101.80 gain 61 129 -98.43 gain 129 61 -102.85 gain 61 130 -99.00 gain 130 61 -105.59 gain 61 131 -103.01 gain 131 61 -107.96 gain 61 132 -103.58 gain 132 61 -104.81 gain 61 133 -101.94 gain 133 61 -107.59 gain 61 134 -107.44 gain 134 61 -111.09 gain 61 135 -96.01 gain 135 61 -95.24 gain 61 136 -90.14 gain 136 61 -98.15 gain 61 137 -93.54 gain 137 61 -98.21 gain 61 138 -91.22 gain 138 61 -97.91 gain 61 139 -98.59 gain 139 61 -106.98 gain 61 140 -101.66 gain 140 61 -109.86 gain 61 141 -96.69 gain 141 61 -100.58 gain 61 142 -105.70 gain 142 61 -110.74 gain 61 143 -100.99 gain 143 61 -108.47 gain 61 144 -101.76 gain 144 61 -105.15 gain 61 145 -97.72 gain 145 61 -105.66 gain 61 146 -103.40 gain 146 61 -107.78 gain 61 147 -102.23 gain 147 61 -107.81 gain 61 148 -100.47 gain 148 61 -106.58 gain 61 149 -99.38 gain 149 61 -101.86 gain 61 150 -93.54 gain 150 61 -99.40 gain 61 151 -96.37 gain 151 61 -104.71 gain 61 152 -98.34 gain 152 61 -105.04 gain 61 153 -94.38 gain 153 61 -100.77 gain 61 154 -94.21 gain 154 61 -101.74 gain 61 155 -91.74 gain 155 61 -96.57 gain 61 156 -98.48 gain 156 61 -104.43 gain 61 157 -101.83 gain 157 61 -109.08 gain 61 158 -101.60 gain 158 61 -110.82 gain 61 159 -95.24 gain 159 61 -98.49 gain 61 160 -108.77 gain 160 61 -113.40 gain 61 161 -102.28 gain 161 61 -107.96 gain 61 162 -103.58 gain 162 61 -108.89 gain 61 163 -104.45 gain 163 61 -107.18 gain 61 164 -100.07 gain 164 61 -110.03 gain 61 165 -96.09 gain 165 61 -103.41 gain 61 166 -93.40 gain 166 61 -102.37 gain 61 167 -96.49 gain 167 61 -104.29 gain 61 168 -96.60 gain 168 61 -103.46 gain 61 169 -98.68 gain 169 61 -102.06 gain 61 170 -109.97 gain 170 61 -114.29 gain 61 171 -95.78 gain 171 61 -100.67 gain 61 172 -95.97 gain 172 61 -103.65 gain 61 173 -99.99 gain 173 61 -102.00 gain 61 174 -96.94 gain 174 61 -104.90 gain 61 175 -97.63 gain 175 61 -97.39 gain 61 176 -107.86 gain 176 61 -111.85 gain 61 177 -98.44 gain 177 61 -104.78 gain 61 178 -97.83 gain 178 61 -101.78 gain 61 179 -105.55 gain 179 61 -112.55 gain 61 180 -87.80 gain 180 61 -93.54 gain 61 181 -98.75 gain 181 61 -107.88 gain 61 182 -99.95 gain 182 61 -105.21 gain 61 183 -97.40 gain 183 61 -98.55 gain 61 184 -101.81 gain 184 61 -109.19 gain 61 185 -94.86 gain 185 61 -100.74 gain 61 186 -103.53 gain 186 61 -110.11 gain 61 187 -95.31 gain 187 61 -101.91 gain 61 188 -102.19 gain 188 61 -113.23 gain 61 189 -100.37 gain 189 61 -107.47 gain 61 190 -97.82 gain 190 61 -97.76 gain 61 191 -111.11 gain 191 61 -114.22 gain 61 192 -108.44 gain 192 61 -115.22 gain 61 193 -106.58 gain 193 61 -109.38 gain 61 194 -103.83 gain 194 61 -106.53 gain 61 195 -98.00 gain 195 61 -98.66 gain 61 196 -100.64 gain 196 61 -108.98 gain 61 197 -86.39 gain 197 61 -92.21 gain 61 198 -105.30 gain 198 61 -113.77 gain 61 199 -100.40 gain 199 61 -102.89 gain 61 200 -95.09 gain 200 61 -99.49 gain 61 201 -105.48 gain 201 61 -112.97 gain 61 202 -98.97 gain 202 61 -104.76 gain 61 203 -101.79 gain 203 61 -107.68 gain 61 204 -100.55 gain 204 61 -104.66 gain 61 205 -98.62 gain 205 61 -102.39 gain 61 206 -103.10 gain 206 61 -108.20 gain 61 207 -99.75 gain 207 61 -102.59 gain 61 208 -103.07 gain 208 61 -109.21 gain 61 209 -105.02 gain 209 61 -110.20 gain 61 210 -94.86 gain 210 61 -104.04 gain 61 211 -98.62 gain 211 61 -105.19 gain 61 212 -102.52 gain 212 61 -107.64 gain 61 213 -101.58 gain 213 61 -109.43 gain 61 214 -103.28 gain 214 61 -109.32 gain 61 215 -100.13 gain 215 61 -107.98 gain 61 216 -111.25 gain 216 61 -116.00 gain 61 217 -103.19 gain 217 61 -112.39 gain 61 218 -106.69 gain 218 61 -117.21 gain 61 219 -101.48 gain 219 61 -109.57 gain 61 220 -105.05 gain 220 61 -110.26 gain 61 221 -100.76 gain 221 61 -106.96 gain 61 222 -105.76 gain 222 61 -108.53 gain 61 223 -102.40 gain 223 61 -107.46 gain 61 224 -110.96 gain 224 61 -112.96 gain 62 63 -75.61 gain 63 62 -74.62 gain 62 64 -83.72 gain 64 62 -87.12 gain 62 65 -85.58 gain 65 62 -89.02 gain 62 66 -90.16 gain 66 62 -92.90 gain 62 67 -97.31 gain 67 62 -100.17 gain 62 68 -102.34 gain 68 62 -105.16 gain 62 69 -95.10 gain 69 62 -96.18 gain 62 70 -103.56 gain 70 62 -107.34 gain 62 71 -94.26 gain 71 62 -98.80 gain 62 72 -103.14 gain 72 62 -109.53 gain 62 73 -100.93 gain 73 62 -104.37 gain 62 74 -107.04 gain 74 62 -106.47 gain 62 75 -85.47 gain 75 62 -85.29 gain 62 76 -78.98 gain 76 62 -81.30 gain 62 77 -78.00 gain 77 62 -78.62 gain 62 78 -87.56 gain 78 62 -96.81 gain 62 79 -83.84 gain 79 62 -87.63 gain 62 80 -88.73 gain 80 62 -90.85 gain 62 81 -96.93 gain 81 62 -103.33 gain 62 82 -93.08 gain 82 62 -98.64 gain 62 83 -99.53 gain 83 62 -104.66 gain 62 84 -95.45 gain 84 62 -97.66 gain 62 85 -107.98 gain 85 62 -114.77 gain 62 86 -104.83 gain 86 62 -104.80 gain 62 87 -101.47 gain 87 62 -104.24 gain 62 88 -99.02 gain 88 62 -102.07 gain 62 89 -96.48 gain 89 62 -100.17 gain 62 90 -85.50 gain 90 62 -92.72 gain 62 91 -85.00 gain 91 62 -87.81 gain 62 92 -81.78 gain 92 62 -88.16 gain 62 93 -88.99 gain 93 62 -89.28 gain 62 94 -88.72 gain 94 62 -91.45 gain 62 95 -94.71 gain 95 62 -100.48 gain 62 96 -92.53 gain 96 62 -94.57 gain 62 97 -97.15 gain 97 62 -100.47 gain 62 98 -92.93 gain 98 62 -93.42 gain 62 99 -103.32 gain 99 62 -107.90 gain 62 100 -105.34 gain 100 62 -107.76 gain 62 101 -98.76 gain 101 62 -99.84 gain 62 102 -96.57 gain 102 62 -98.32 gain 62 103 -98.87 gain 103 62 -99.85 gain 62 104 -107.25 gain 104 62 -104.66 gain 62 105 -94.37 gain 105 62 -97.18 gain 62 106 -91.52 gain 106 62 -93.64 gain 62 107 -92.78 gain 107 62 -97.91 gain 62 108 -79.03 gain 108 62 -82.23 gain 62 109 -92.40 gain 109 62 -92.44 gain 62 110 -89.33 gain 110 62 -91.61 gain 62 111 -93.76 gain 111 62 -93.23 gain 62 112 -87.98 gain 112 62 -89.45 gain 62 113 -100.25 gain 113 62 -108.66 gain 62 114 -87.13 gain 114 62 -91.18 gain 62 115 -95.31 gain 115 62 -100.21 gain 62 116 -108.87 gain 116 62 -109.80 gain 62 117 -97.17 gain 117 62 -97.94 gain 62 118 -104.61 gain 118 62 -113.56 gain 62 119 -109.23 gain 119 62 -109.72 gain 62 120 -91.44 gain 120 62 -92.04 gain 62 121 -91.97 gain 121 62 -95.31 gain 62 122 -92.69 gain 122 62 -98.61 gain 62 123 -87.04 gain 123 62 -93.21 gain 62 124 -86.44 gain 124 62 -86.22 gain 62 125 -93.88 gain 125 62 -95.59 gain 62 126 -104.31 gain 126 62 -110.90 gain 62 127 -95.28 gain 127 62 -96.62 gain 62 128 -96.35 gain 128 62 -100.75 gain 62 129 -101.64 gain 129 62 -103.25 gain 62 130 -97.11 gain 130 62 -100.90 gain 62 131 -102.93 gain 131 62 -105.08 gain 62 132 -106.63 gain 132 62 -105.06 gain 62 133 -106.12 gain 133 62 -108.97 gain 62 134 -102.59 gain 134 62 -103.44 gain 62 135 -97.30 gain 135 62 -93.74 gain 62 136 -90.03 gain 136 62 -95.24 gain 62 137 -92.81 gain 137 62 -94.68 gain 62 138 -88.85 gain 138 62 -92.74 gain 62 139 -93.71 gain 139 62 -99.31 gain 62 140 -103.14 gain 140 62 -108.54 gain 62 141 -103.65 gain 141 62 -104.74 gain 62 142 -99.11 gain 142 62 -101.35 gain 62 143 -99.14 gain 143 62 -103.84 gain 62 144 -97.58 gain 144 62 -98.17 gain 62 145 -97.54 gain 145 62 -102.68 gain 62 146 -104.87 gain 146 62 -106.46 gain 62 147 -101.72 gain 147 62 -104.50 gain 62 148 -108.15 gain 148 62 -111.46 gain 62 149 -108.43 gain 149 62 -108.11 gain 62 150 -102.11 gain 150 62 -105.18 gain 62 151 -100.26 gain 151 62 -105.80 gain 62 152 -99.99 gain 152 62 -103.89 gain 62 153 -103.50 gain 153 62 -107.10 gain 62 154 -97.31 gain 154 62 -102.04 gain 62 155 -94.99 gain 155 62 -97.02 gain 62 156 -101.15 gain 156 62 -104.30 gain 62 157 -103.03 gain 157 62 -107.48 gain 62 158 -105.63 gain 158 62 -112.05 gain 62 159 -90.54 gain 159 62 -91.00 gain 62 160 -95.02 gain 160 62 -96.85 gain 62 161 -101.30 gain 161 62 -104.19 gain 62 162 -102.94 gain 162 62 -105.45 gain 62 163 -104.57 gain 163 62 -104.51 gain 62 164 -113.74 gain 164 62 -120.90 gain 62 165 -98.23 gain 165 62 -102.75 gain 62 166 -96.26 gain 166 62 -102.44 gain 62 167 -99.05 gain 167 62 -104.05 gain 62 168 -100.55 gain 168 62 -104.61 gain 62 169 -98.39 gain 169 62 -98.97 gain 62 170 -94.28 gain 170 62 -95.80 gain 62 171 -93.52 gain 171 62 -95.61 gain 62 172 -101.88 gain 172 62 -106.77 gain 62 173 -103.12 gain 173 62 -102.33 gain 62 174 -100.91 gain 174 62 -106.08 gain 62 175 -109.57 gain 175 62 -106.53 gain 62 176 -107.28 gain 176 62 -108.46 gain 62 177 -105.20 gain 177 62 -108.74 gain 62 178 -110.19 gain 178 62 -111.34 gain 62 179 -104.26 gain 179 62 -108.46 gain 62 180 -95.78 gain 180 62 -98.71 gain 62 181 -100.10 gain 181 62 -106.44 gain 62 182 -102.43 gain 182 62 -104.90 gain 62 183 -104.03 gain 183 62 -102.38 gain 62 184 -105.05 gain 184 62 -109.63 gain 62 185 -103.21 gain 185 62 -106.29 gain 62 186 -99.98 gain 186 62 -103.76 gain 62 187 -99.34 gain 187 62 -103.15 gain 62 188 -97.28 gain 188 62 -105.53 gain 62 189 -108.84 gain 189 62 -113.15 gain 62 190 -107.35 gain 190 62 -104.49 gain 62 191 -95.87 gain 191 62 -96.18 gain 62 192 -105.73 gain 192 62 -109.72 gain 62 193 -107.24 gain 193 62 -107.24 gain 62 194 -107.51 gain 194 62 -107.41 gain 62 195 -98.80 gain 195 62 -96.67 gain 62 196 -101.32 gain 196 62 -106.86 gain 62 197 -99.62 gain 197 62 -102.65 gain 62 198 -97.04 gain 198 62 -102.71 gain 62 199 -103.69 gain 199 62 -103.38 gain 62 200 -105.23 gain 200 62 -106.84 gain 62 201 -103.83 gain 201 62 -108.53 gain 62 202 -104.48 gain 202 62 -107.47 gain 62 203 -111.44 gain 203 62 -114.53 gain 62 204 -104.24 gain 204 62 -105.55 gain 62 205 -115.72 gain 205 62 -116.70 gain 62 206 -98.96 gain 206 62 -101.26 gain 62 207 -103.76 gain 207 62 -103.81 gain 62 208 -104.32 gain 208 62 -107.66 gain 62 209 -105.13 gain 209 62 -107.51 gain 62 210 -108.64 gain 210 62 -115.02 gain 62 211 -104.10 gain 211 62 -107.87 gain 62 212 -101.17 gain 212 62 -103.50 gain 62 213 -104.04 gain 213 62 -109.11 gain 62 214 -100.82 gain 214 62 -104.07 gain 62 215 -99.93 gain 215 62 -104.99 gain 62 216 -108.58 gain 216 62 -110.53 gain 62 217 -101.96 gain 217 62 -108.37 gain 62 218 -97.16 gain 218 62 -104.88 gain 62 219 -105.92 gain 219 62 -111.22 gain 62 220 -102.75 gain 220 62 -105.16 gain 62 221 -98.64 gain 221 62 -102.04 gain 62 222 -111.30 gain 222 62 -111.28 gain 62 223 -109.02 gain 223 62 -111.29 gain 62 224 -107.95 gain 224 62 -107.14 gain 63 64 -69.42 gain 64 63 -73.81 gain 63 65 -84.04 gain 65 63 -88.47 gain 63 66 -87.28 gain 66 63 -91.01 gain 63 67 -87.44 gain 67 63 -91.29 gain 63 68 -93.02 gain 68 63 -96.83 gain 63 69 -96.27 gain 69 63 -98.34 gain 63 70 -98.25 gain 70 63 -103.02 gain 63 71 -102.91 gain 71 63 -108.44 gain 63 72 -99.05 gain 72 63 -106.43 gain 63 73 -105.24 gain 73 63 -109.67 gain 63 74 -99.07 gain 74 63 -99.49 gain 63 75 -83.26 gain 75 63 -84.06 gain 63 76 -83.10 gain 76 63 -86.40 gain 63 77 -75.25 gain 77 63 -76.85 gain 63 78 -77.73 gain 78 63 -87.97 gain 63 79 -75.50 gain 79 63 -80.28 gain 63 80 -81.48 gain 80 63 -84.59 gain 63 81 -80.77 gain 81 63 -88.15 gain 63 82 -88.99 gain 82 63 -95.53 gain 63 83 -90.00 gain 83 63 -96.12 gain 63 84 -93.92 gain 84 63 -97.11 gain 63 85 -90.97 gain 85 63 -98.74 gain 63 86 -93.19 gain 86 63 -94.15 gain 63 87 -99.37 gain 87 63 -103.13 gain 63 88 -97.41 gain 88 63 -101.45 gain 63 89 -97.00 gain 89 63 -101.68 gain 63 90 -84.88 gain 90 63 -93.09 gain 63 91 -85.44 gain 91 63 -89.24 gain 63 92 -92.13 gain 92 63 -99.50 gain 63 93 -78.55 gain 93 63 -79.83 gain 63 94 -81.73 gain 94 63 -85.44 gain 63 95 -85.13 gain 95 63 -91.89 gain 63 96 -88.69 gain 96 63 -91.72 gain 63 97 -98.81 gain 97 63 -103.12 gain 63 98 -96.48 gain 98 63 -97.96 gain 63 99 -99.00 gain 99 63 -104.57 gain 63 100 -95.66 gain 100 63 -99.07 gain 63 101 -103.61 gain 101 63 -105.68 gain 63 102 -102.49 gain 102 63 -105.22 gain 63 103 -98.58 gain 103 63 -100.55 gain 63 104 -97.78 gain 104 63 -96.17 gain 63 105 -93.36 gain 105 63 -97.16 gain 63 106 -88.33 gain 106 63 -91.44 gain 63 107 -78.61 gain 107 63 -84.73 gain 63 108 -87.05 gain 108 63 -91.23 gain 63 109 -85.92 gain 109 63 -86.94 gain 63 110 -91.25 gain 110 63 -94.52 gain 63 111 -87.73 gain 111 63 -88.20 gain 63 112 -86.28 gain 112 63 -88.74 gain 63 113 -99.44 gain 113 63 -108.84 gain 63 114 -93.46 gain 114 63 -98.49 gain 63 115 -101.58 gain 115 63 -107.47 gain 63 116 -101.94 gain 116 63 -103.86 gain 63 117 -103.57 gain 117 63 -105.33 gain 63 118 -107.60 gain 118 63 -117.54 gain 63 119 -104.30 gain 119 63 -105.78 gain 63 120 -89.85 gain 120 63 -91.44 gain 63 121 -88.34 gain 121 63 -92.67 gain 63 122 -96.12 gain 122 63 -103.02 gain 63 123 -92.59 gain 123 63 -99.75 gain 63 124 -96.49 gain 124 63 -97.25 gain 63 125 -94.13 gain 125 63 -96.82 gain 63 126 -97.31 gain 126 63 -104.89 gain 63 127 -89.31 gain 127 63 -91.64 gain 63 128 -97.14 gain 128 63 -102.53 gain 63 129 -93.03 gain 129 63 -95.64 gain 63 130 -105.32 gain 130 63 -110.10 gain 63 131 -98.36 gain 131 63 -101.50 gain 63 132 -104.45 gain 132 63 -103.86 gain 63 133 -106.13 gain 133 63 -109.98 gain 63 134 -102.73 gain 134 63 -104.57 gain 63 135 -95.04 gain 135 63 -92.47 gain 63 136 -95.82 gain 136 63 -102.03 gain 63 137 -91.05 gain 137 63 -93.91 gain 63 138 -95.32 gain 138 63 -100.20 gain 63 139 -90.67 gain 139 63 -97.26 gain 63 140 -92.53 gain 140 63 -98.92 gain 63 141 -96.03 gain 141 63 -98.11 gain 63 142 -100.38 gain 142 63 -103.62 gain 63 143 -98.85 gain 143 63 -104.53 gain 63 144 -103.40 gain 144 63 -104.99 gain 63 145 -103.61 gain 145 63 -109.74 gain 63 146 -99.08 gain 146 63 -101.65 gain 63 147 -104.77 gain 147 63 -108.54 gain 63 148 -99.10 gain 148 63 -103.40 gain 63 149 -104.82 gain 149 63 -105.49 gain 63 150 -94.97 gain 150 63 -99.03 gain 63 151 -97.47 gain 151 63 -104.01 gain 63 152 -100.01 gain 152 63 -104.90 gain 63 153 -95.62 gain 153 63 -100.21 gain 63 154 -88.96 gain 154 63 -94.68 gain 63 155 -96.62 gain 155 63 -99.64 gain 63 156 -99.66 gain 156 63 -103.80 gain 63 157 -97.99 gain 157 63 -103.43 gain 63 158 -100.29 gain 158 63 -107.69 gain 63 159 -98.12 gain 159 63 -99.56 gain 63 160 -93.59 gain 160 63 -96.42 gain 63 161 -107.43 gain 161 63 -111.31 gain 63 162 -102.74 gain 162 63 -106.25 gain 63 163 -103.90 gain 163 63 -104.82 gain 63 164 -99.50 gain 164 63 -107.66 gain 63 165 -100.57 gain 165 63 -106.07 gain 63 166 -99.05 gain 166 63 -106.21 gain 63 167 -97.00 gain 167 63 -102.99 gain 63 168 -97.18 gain 168 63 -102.24 gain 63 169 -96.89 gain 169 63 -98.46 gain 63 170 -98.53 gain 170 63 -101.03 gain 63 171 -103.47 gain 171 63 -106.55 gain 63 172 -104.37 gain 172 63 -110.25 gain 63 173 -98.18 gain 173 63 -98.38 gain 63 174 -103.77 gain 174 63 -109.93 gain 63 175 -106.74 gain 175 63 -104.69 gain 63 176 -101.42 gain 176 63 -103.60 gain 63 177 -103.65 gain 177 63 -108.19 gain 63 178 -110.23 gain 178 63 -112.37 gain 63 179 -103.38 gain 179 63 -108.56 gain 63 180 -105.61 gain 180 63 -109.53 gain 63 181 -100.63 gain 181 63 -107.96 gain 63 182 -104.55 gain 182 63 -108.00 gain 63 183 -96.92 gain 183 63 -96.26 gain 63 184 -102.10 gain 184 63 -107.67 gain 63 185 -97.50 gain 185 63 -101.57 gain 63 186 -101.99 gain 186 63 -106.76 gain 63 187 -99.88 gain 187 63 -104.67 gain 63 188 -100.50 gain 188 63 -109.74 gain 63 189 -95.64 gain 189 63 -100.93 gain 63 190 -100.68 gain 190 63 -98.80 gain 63 191 -111.97 gain 191 63 -113.27 gain 63 192 -98.49 gain 192 63 -103.46 gain 63 193 -111.89 gain 193 63 -112.89 gain 63 194 -108.96 gain 194 63 -109.85 gain 63 195 -105.96 gain 195 63 -104.82 gain 63 196 -103.28 gain 196 63 -109.80 gain 63 197 -100.16 gain 197 63 -104.18 gain 63 198 -105.55 gain 198 63 -112.21 gain 63 199 -104.80 gain 199 63 -105.47 gain 63 200 -96.91 gain 200 63 -99.50 gain 63 201 -105.58 gain 201 63 -111.26 gain 63 202 -101.47 gain 202 63 -105.45 gain 63 203 -103.48 gain 203 63 -107.55 gain 63 204 -99.66 gain 204 63 -101.96 gain 63 205 -101.55 gain 205 63 -103.51 gain 63 206 -100.56 gain 206 63 -103.84 gain 63 207 -104.45 gain 207 63 -105.48 gain 63 208 -100.28 gain 208 63 -104.61 gain 63 209 -108.11 gain 209 63 -111.48 gain 63 210 -99.42 gain 210 63 -106.79 gain 63 211 -103.55 gain 211 63 -108.32 gain 63 212 -95.23 gain 212 63 -98.55 gain 63 213 -103.42 gain 213 63 -109.47 gain 63 214 -104.70 gain 214 63 -108.94 gain 63 215 -100.72 gain 215 63 -106.77 gain 63 216 -104.86 gain 216 63 -107.81 gain 63 217 -105.48 gain 217 63 -112.88 gain 63 218 -108.35 gain 218 63 -117.06 gain 63 219 -97.89 gain 219 63 -104.18 gain 63 220 -103.27 gain 220 63 -106.67 gain 63 221 -105.35 gain 221 63 -109.74 gain 63 222 -104.61 gain 222 63 -105.58 gain 63 223 -109.87 gain 223 63 -113.13 gain 63 224 -103.45 gain 224 63 -103.63 gain 64 65 -78.25 gain 65 64 -78.29 gain 64 66 -92.40 gain 66 64 -91.75 gain 64 67 -91.95 gain 67 64 -91.42 gain 64 68 -89.29 gain 68 64 -88.71 gain 64 69 -101.76 gain 69 64 -99.45 gain 64 70 -94.45 gain 70 64 -94.83 gain 64 71 -102.37 gain 71 64 -103.51 gain 64 72 -104.47 gain 72 64 -107.46 gain 64 73 -105.53 gain 73 64 -105.57 gain 64 74 -100.64 gain 74 64 -96.67 gain 64 75 -94.22 gain 75 64 -90.64 gain 64 76 -94.45 gain 76 64 -93.36 gain 64 77 -84.19 gain 77 64 -81.40 gain 64 78 -81.44 gain 78 64 -87.29 gain 64 79 -77.43 gain 79 64 -77.82 gain 64 80 -83.81 gain 80 64 -82.53 gain 64 81 -86.07 gain 81 64 -89.06 gain 64 82 -91.24 gain 82 64 -93.40 gain 64 83 -97.76 gain 83 64 -99.49 gain 64 84 -100.14 gain 84 64 -98.95 gain 64 85 -99.77 gain 85 64 -103.16 gain 64 86 -105.16 gain 86 64 -101.73 gain 64 87 -107.98 gain 87 64 -107.35 gain 64 88 -109.32 gain 88 64 -108.98 gain 64 89 -107.87 gain 89 64 -108.16 gain 64 90 -87.96 gain 90 64 -91.78 gain 64 91 -97.02 gain 91 64 -96.43 gain 64 92 -98.87 gain 92 64 -101.85 gain 64 93 -88.19 gain 93 64 -85.09 gain 64 94 -85.23 gain 94 64 -84.56 gain 64 95 -83.69 gain 95 64 -86.06 gain 64 96 -99.08 gain 96 64 -97.72 gain 64 97 -89.48 gain 97 64 -89.40 gain 64 98 -101.15 gain 98 64 -98.24 gain 64 99 -101.18 gain 99 64 -102.36 gain 64 100 -102.31 gain 100 64 -101.33 gain 64 101 -95.27 gain 101 64 -92.95 gain 64 102 -107.99 gain 102 64 -106.34 gain 64 103 -103.04 gain 103 64 -100.62 gain 64 104 -100.18 gain 104 64 -94.19 gain 64 105 -96.42 gain 105 64 -95.83 gain 64 106 -92.26 gain 106 64 -90.97 gain 64 107 -89.35 gain 107 64 -91.08 gain 64 108 -86.50 gain 108 64 -86.30 gain 64 109 -88.61 gain 109 64 -85.25 gain 64 110 -92.14 gain 110 64 -91.02 gain 64 111 -95.66 gain 111 64 -91.74 gain 64 112 -97.73 gain 112 64 -95.81 gain 64 113 -106.18 gain 113 64 -111.20 gain 64 114 -95.93 gain 114 64 -96.58 gain 64 115 -102.95 gain 115 64 -104.45 gain 64 116 -109.67 gain 116 64 -107.20 gain 64 117 -104.37 gain 117 64 -101.74 gain 64 118 -105.62 gain 118 64 -111.16 gain 64 119 -107.33 gain 119 64 -104.43 gain 64 120 -99.92 gain 120 64 -97.12 gain 64 121 -96.14 gain 121 64 -96.09 gain 64 122 -97.12 gain 122 64 -99.64 gain 64 123 -98.41 gain 123 64 -101.18 gain 64 124 -93.80 gain 124 64 -90.17 gain 64 125 -100.09 gain 125 64 -98.40 gain 64 126 -96.60 gain 126 64 -99.79 gain 64 127 -96.27 gain 127 64 -94.21 gain 64 128 -99.84 gain 128 64 -100.84 gain 64 129 -99.32 gain 129 64 -97.53 gain 64 130 -111.98 gain 130 64 -112.37 gain 64 131 -104.63 gain 131 64 -103.39 gain 64 132 -101.43 gain 132 64 -96.46 gain 64 133 -110.76 gain 133 64 -110.22 gain 64 134 -104.79 gain 134 64 -102.25 gain 64 135 -101.37 gain 135 64 -94.41 gain 64 136 -95.96 gain 136 64 -97.78 gain 64 137 -97.47 gain 137 64 -95.95 gain 64 138 -102.65 gain 138 64 -103.14 gain 64 139 -91.53 gain 139 64 -93.73 gain 64 140 -96.91 gain 140 64 -98.91 gain 64 141 -93.02 gain 141 64 -90.72 gain 64 142 -97.87 gain 142 64 -96.71 gain 64 143 -98.31 gain 143 64 -99.60 gain 64 144 -102.61 gain 144 64 -99.81 gain 64 145 -105.62 gain 145 64 -107.37 gain 64 146 -103.91 gain 146 64 -102.10 gain 64 147 -103.63 gain 147 64 -103.01 gain 64 148 -106.68 gain 148 64 -106.59 gain 64 149 -104.96 gain 149 64 -101.24 gain 64 150 -106.85 gain 150 64 -106.52 gain 64 151 -105.15 gain 151 64 -107.29 gain 64 152 -107.16 gain 152 64 -107.66 gain 64 153 -102.21 gain 153 64 -102.41 gain 64 154 -91.12 gain 154 64 -92.45 gain 64 155 -99.09 gain 155 64 -97.72 gain 64 156 -95.79 gain 156 64 -95.54 gain 64 157 -100.49 gain 157 64 -101.54 gain 64 158 -105.77 gain 158 64 -108.79 gain 64 159 -106.03 gain 159 64 -103.09 gain 64 160 -101.28 gain 160 64 -99.72 gain 64 161 -101.85 gain 161 64 -101.34 gain 64 162 -106.91 gain 162 64 -106.03 gain 64 163 -109.93 gain 163 64 -106.46 gain 64 164 -109.22 gain 164 64 -112.99 gain 64 165 -94.51 gain 165 64 -95.63 gain 64 166 -108.55 gain 166 64 -111.33 gain 64 167 -100.46 gain 167 64 -102.06 gain 64 168 -103.94 gain 168 64 -104.61 gain 64 169 -109.06 gain 169 64 -106.24 gain 64 170 -100.95 gain 170 64 -99.07 gain 64 171 -101.76 gain 171 64 -100.46 gain 64 172 -102.59 gain 172 64 -104.08 gain 64 173 -98.42 gain 173 64 -94.23 gain 64 174 -109.50 gain 174 64 -111.27 gain 64 175 -102.08 gain 175 64 -95.64 gain 64 176 -110.41 gain 176 64 -108.19 gain 64 177 -109.38 gain 177 64 -109.53 gain 64 178 -100.94 gain 178 64 -98.70 gain 64 179 -108.87 gain 179 64 -109.67 gain 64 180 -101.34 gain 180 64 -100.88 gain 64 181 -101.69 gain 181 64 -104.63 gain 64 182 -100.88 gain 182 64 -99.95 gain 64 183 -106.99 gain 183 64 -101.94 gain 64 184 -104.93 gain 184 64 -106.11 gain 64 185 -99.80 gain 185 64 -99.48 gain 64 186 -98.28 gain 186 64 -98.66 gain 64 187 -107.55 gain 187 64 -107.96 gain 64 188 -97.52 gain 188 64 -102.37 gain 64 189 -102.56 gain 189 64 -103.47 gain 64 190 -113.65 gain 190 64 -107.40 gain 64 191 -107.57 gain 191 64 -104.49 gain 64 192 -102.66 gain 192 64 -103.24 gain 64 193 -110.64 gain 193 64 -107.25 gain 64 194 -110.32 gain 194 64 -106.82 gain 64 195 -109.22 gain 195 64 -103.69 gain 64 196 -102.58 gain 196 64 -104.72 gain 64 197 -100.38 gain 197 64 -100.01 gain 64 198 -107.99 gain 198 64 -110.26 gain 64 199 -99.54 gain 199 64 -95.83 gain 64 200 -102.78 gain 200 64 -100.98 gain 64 201 -103.68 gain 201 64 -104.98 gain 64 202 -105.51 gain 202 64 -105.10 gain 64 203 -106.71 gain 203 64 -106.40 gain 64 204 -105.42 gain 204 64 -103.33 gain 64 205 -97.57 gain 205 64 -95.15 gain 64 206 -110.74 gain 206 64 -109.64 gain 64 207 -105.45 gain 207 64 -102.10 gain 64 208 -99.44 gain 208 64 -99.39 gain 64 209 -111.61 gain 209 64 -110.59 gain 64 210 -102.27 gain 210 64 -105.26 gain 64 211 -111.51 gain 211 64 -111.88 gain 64 212 -103.75 gain 212 64 -102.67 gain 64 213 -102.28 gain 213 64 -103.94 gain 64 214 -103.39 gain 214 64 -103.23 gain 64 215 -107.76 gain 215 64 -109.42 gain 64 216 -109.47 gain 216 64 -108.03 gain 64 217 -107.17 gain 217 64 -110.18 gain 64 218 -100.33 gain 218 64 -104.65 gain 64 219 -105.07 gain 219 64 -106.97 gain 64 220 -103.58 gain 220 64 -102.60 gain 64 221 -104.36 gain 221 64 -104.36 gain 64 222 -115.18 gain 222 64 -111.76 gain 64 223 -108.56 gain 223 64 -107.43 gain 64 224 -107.54 gain 224 64 -103.33 gain 65 66 -77.99 gain 66 65 -77.29 gain 65 67 -81.83 gain 67 65 -81.25 gain 65 68 -86.64 gain 68 65 -86.03 gain 65 69 -93.09 gain 69 65 -90.73 gain 65 70 -100.90 gain 70 65 -101.24 gain 65 71 -109.68 gain 71 65 -110.78 gain 65 72 -99.98 gain 72 65 -102.92 gain 65 73 -104.24 gain 73 65 -104.24 gain 65 74 -102.61 gain 74 65 -98.61 gain 65 75 -97.72 gain 75 65 -94.09 gain 65 76 -98.68 gain 76 65 -97.55 gain 65 77 -98.11 gain 77 65 -95.28 gain 65 78 -81.59 gain 78 65 -87.40 gain 65 79 -80.92 gain 79 65 -81.27 gain 65 80 -75.98 gain 80 65 -74.66 gain 65 81 -75.37 gain 81 65 -78.32 gain 65 82 -88.56 gain 82 65 -90.67 gain 65 83 -89.80 gain 83 65 -91.50 gain 65 84 -92.07 gain 84 65 -90.84 gain 65 85 -93.96 gain 85 65 -97.31 gain 65 86 -106.47 gain 86 65 -103.00 gain 65 87 -104.07 gain 87 65 -103.41 gain 65 88 -108.96 gain 88 65 -108.57 gain 65 89 -100.53 gain 89 65 -100.78 gain 65 90 -95.24 gain 90 65 -99.02 gain 65 91 -95.41 gain 91 65 -94.78 gain 65 92 -94.98 gain 92 65 -97.92 gain 65 93 -91.10 gain 93 65 -87.95 gain 65 94 -87.10 gain 94 65 -86.38 gain 65 95 -82.10 gain 95 65 -84.43 gain 65 96 -88.17 gain 96 65 -86.78 gain 65 97 -94.90 gain 97 65 -94.78 gain 65 98 -90.13 gain 98 65 -87.18 gain 65 99 -98.74 gain 99 65 -99.88 gain 65 100 -98.18 gain 100 65 -97.16 gain 65 101 -104.10 gain 101 65 -101.75 gain 65 102 -101.41 gain 102 65 -99.72 gain 65 103 -102.80 gain 103 65 -100.34 gain 65 104 -102.73 gain 104 65 -96.70 gain 65 105 -97.30 gain 105 65 -96.67 gain 65 106 -98.97 gain 106 65 -97.64 gain 65 107 -94.20 gain 107 65 -95.89 gain 65 108 -92.02 gain 108 65 -91.78 gain 65 109 -86.73 gain 109 65 -83.33 gain 65 110 -93.84 gain 110 65 -92.68 gain 65 111 -93.37 gain 111 65 -89.41 gain 65 112 -93.06 gain 112 65 -91.10 gain 65 113 -91.43 gain 113 65 -96.40 gain 65 114 -94.74 gain 114 65 -95.35 gain 65 115 -93.91 gain 115 65 -95.38 gain 65 116 -102.69 gain 116 65 -100.18 gain 65 117 -105.38 gain 117 65 -102.71 gain 65 118 -97.99 gain 118 65 -103.50 gain 65 119 -109.50 gain 119 65 -106.55 gain 65 120 -96.84 gain 120 65 -94.00 gain 65 121 -100.50 gain 121 65 -100.40 gain 65 122 -94.15 gain 122 65 -96.62 gain 65 123 -92.09 gain 123 65 -94.82 gain 65 124 -91.57 gain 124 65 -87.90 gain 65 125 -94.92 gain 125 65 -93.19 gain 65 126 -93.89 gain 126 65 -97.04 gain 65 127 -99.02 gain 127 65 -96.92 gain 65 128 -95.01 gain 128 65 -95.96 gain 65 129 -100.12 gain 129 65 -98.30 gain 65 130 -103.06 gain 130 65 -103.41 gain 65 131 -103.54 gain 131 65 -102.26 gain 65 132 -110.14 gain 132 65 -105.13 gain 65 133 -102.15 gain 133 65 -101.57 gain 65 134 -99.65 gain 134 65 -97.06 gain 65 135 -107.75 gain 135 65 -100.75 gain 65 136 -99.73 gain 136 65 -101.51 gain 65 137 -95.62 gain 137 65 -94.06 gain 65 138 -98.09 gain 138 65 -98.54 gain 65 139 -92.12 gain 139 65 -94.28 gain 65 140 -103.31 gain 140 65 -105.28 gain 65 141 -101.19 gain 141 65 -98.84 gain 65 142 -101.42 gain 142 65 -100.22 gain 65 143 -98.89 gain 143 65 -100.15 gain 65 144 -97.87 gain 144 65 -95.03 gain 65 145 -95.47 gain 145 65 -97.17 gain 65 146 -95.43 gain 146 65 -93.58 gain 65 147 -99.70 gain 147 65 -99.04 gain 65 148 -109.55 gain 148 65 -109.41 gain 65 149 -108.90 gain 149 65 -105.14 gain 65 150 -106.79 gain 150 65 -106.42 gain 65 151 -99.74 gain 151 65 -101.84 gain 65 152 -100.83 gain 152 65 -101.29 gain 65 153 -103.42 gain 153 65 -103.58 gain 65 154 -104.74 gain 154 65 -106.03 gain 65 155 -96.34 gain 155 65 -94.93 gain 65 156 -99.10 gain 156 65 -98.81 gain 65 157 -96.74 gain 157 65 -97.75 gain 65 158 -93.13 gain 158 65 -96.11 gain 65 159 -101.02 gain 159 65 -98.03 gain 65 160 -102.64 gain 160 65 -101.04 gain 65 161 -92.73 gain 161 65 -92.18 gain 65 162 -103.61 gain 162 65 -102.68 gain 65 163 -102.99 gain 163 65 -99.49 gain 65 164 -95.33 gain 164 65 -99.05 gain 65 165 -99.01 gain 165 65 -100.09 gain 65 166 -103.12 gain 166 65 -105.86 gain 65 167 -105.04 gain 167 65 -106.60 gain 65 168 -106.05 gain 168 65 -106.67 gain 65 169 -100.12 gain 169 65 -97.26 gain 65 170 -100.04 gain 170 65 -98.13 gain 65 171 -103.23 gain 171 65 -101.88 gain 65 172 -104.41 gain 172 65 -105.86 gain 65 173 -103.51 gain 173 65 -99.28 gain 65 174 -105.36 gain 174 65 -107.08 gain 65 175 -104.75 gain 175 65 -98.28 gain 65 176 -106.06 gain 176 65 -103.81 gain 65 177 -109.13 gain 177 65 -109.24 gain 65 178 -107.99 gain 178 65 -105.70 gain 65 179 -109.74 gain 179 65 -110.50 gain 65 180 -98.21 gain 180 65 -97.71 gain 65 181 -98.90 gain 181 65 -101.80 gain 65 182 -109.99 gain 182 65 -109.02 gain 65 183 -102.76 gain 183 65 -97.68 gain 65 184 -100.38 gain 184 65 -101.52 gain 65 185 -108.38 gain 185 65 -108.02 gain 65 186 -111.89 gain 186 65 -112.23 gain 65 187 -101.43 gain 187 65 -101.79 gain 65 188 -102.50 gain 188 65 -107.31 gain 65 189 -105.81 gain 189 65 -106.68 gain 65 190 -103.98 gain 190 65 -97.68 gain 65 191 -113.72 gain 191 65 -110.60 gain 65 192 -107.17 gain 192 65 -107.72 gain 65 193 -103.71 gain 193 65 -100.28 gain 65 194 -107.80 gain 194 65 -104.26 gain 65 195 -104.87 gain 195 65 -99.30 gain 65 196 -105.56 gain 196 65 -107.66 gain 65 197 -103.30 gain 197 65 -102.89 gain 65 198 -101.23 gain 198 65 -103.46 gain 65 199 -104.31 gain 199 65 -100.56 gain 65 200 -96.81 gain 200 65 -94.97 gain 65 201 -107.45 gain 201 65 -108.70 gain 65 202 -102.41 gain 202 65 -101.96 gain 65 203 -103.76 gain 203 65 -103.41 gain 65 204 -107.21 gain 204 65 -105.08 gain 65 205 -111.73 gain 205 65 -109.27 gain 65 206 -98.16 gain 206 65 -97.02 gain 65 207 -109.14 gain 207 65 -105.75 gain 65 208 -107.65 gain 208 65 -107.55 gain 65 209 -110.62 gain 209 65 -109.56 gain 65 210 -107.34 gain 210 65 -110.28 gain 65 211 -108.09 gain 211 65 -108.42 gain 65 212 -105.35 gain 212 65 -104.23 gain 65 213 -111.14 gain 213 65 -112.77 gain 65 214 -108.96 gain 214 65 -108.76 gain 65 215 -103.40 gain 215 65 -105.02 gain 65 216 -106.01 gain 216 65 -104.52 gain 65 217 -99.82 gain 217 65 -102.79 gain 65 218 -107.62 gain 218 65 -111.90 gain 65 219 -109.56 gain 219 65 -111.42 gain 65 220 -100.82 gain 220 65 -99.79 gain 65 221 -110.27 gain 221 65 -110.23 gain 65 222 -112.91 gain 222 65 -109.45 gain 65 223 -104.45 gain 223 65 -103.28 gain 65 224 -117.24 gain 224 65 -112.99 gain 66 67 -81.76 gain 67 66 -81.88 gain 66 68 -80.26 gain 68 66 -80.34 gain 66 69 -99.59 gain 69 66 -97.93 gain 66 70 -91.62 gain 70 66 -92.66 gain 66 71 -96.48 gain 71 66 -98.28 gain 66 72 -94.13 gain 72 66 -97.78 gain 66 73 -95.08 gain 73 66 -95.77 gain 66 74 -95.51 gain 74 66 -92.20 gain 66 75 -96.97 gain 75 66 -94.04 gain 66 76 -97.32 gain 76 66 -96.89 gain 66 77 -91.33 gain 77 66 -89.20 gain 66 78 -93.49 gain 78 66 -99.99 gain 66 79 -89.39 gain 79 66 -90.43 gain 66 80 -72.44 gain 80 66 -71.82 gain 66 81 -77.14 gain 81 66 -80.78 gain 66 82 -82.10 gain 82 66 -84.91 gain 66 83 -87.44 gain 83 66 -89.83 gain 66 84 -93.49 gain 84 66 -92.96 gain 66 85 -98.01 gain 85 66 -102.06 gain 66 86 -97.33 gain 86 66 -94.56 gain 66 87 -104.56 gain 87 66 -104.59 gain 66 88 -102.17 gain 88 66 -102.48 gain 66 89 -101.12 gain 89 66 -102.07 gain 66 90 -106.25 gain 90 66 -110.73 gain 66 91 -93.71 gain 91 66 -93.77 gain 66 92 -96.86 gain 92 66 -100.50 gain 66 93 -100.66 gain 93 66 -98.21 gain 66 94 -85.79 gain 94 66 -85.78 gain 66 95 -86.80 gain 95 66 -89.82 gain 66 96 -82.00 gain 96 66 -81.30 gain 66 97 -85.26 gain 97 66 -85.83 gain 66 98 -86.98 gain 98 66 -84.73 gain 66 99 -92.84 gain 99 66 -94.68 gain 66 100 -96.42 gain 100 66 -96.10 gain 66 101 -98.89 gain 101 66 -97.23 gain 66 102 -99.16 gain 102 66 -98.16 gain 66 103 -107.36 gain 103 66 -105.60 gain 66 104 -102.34 gain 104 66 -97.00 gain 66 105 -99.87 gain 105 66 -99.93 gain 66 106 -99.96 gain 106 66 -99.33 gain 66 107 -94.44 gain 107 66 -96.82 gain 66 108 -92.52 gain 108 66 -92.96 gain 66 109 -90.98 gain 109 66 -88.27 gain 66 110 -89.97 gain 110 66 -89.50 gain 66 111 -84.71 gain 111 66 -81.44 gain 66 112 -95.77 gain 112 66 -94.50 gain 66 113 -92.89 gain 113 66 -98.56 gain 66 114 -89.46 gain 114 66 -90.76 gain 66 115 -92.51 gain 115 66 -94.67 gain 66 116 -100.06 gain 116 66 -98.24 gain 66 117 -103.67 gain 117 66 -101.70 gain 66 118 -102.67 gain 118 66 -108.87 gain 66 119 -101.68 gain 119 66 -99.43 gain 66 120 -106.02 gain 120 66 -103.88 gain 66 121 -98.70 gain 121 66 -99.30 gain 66 122 -95.43 gain 122 66 -98.60 gain 66 123 -95.20 gain 123 66 -98.63 gain 66 124 -92.23 gain 124 66 -89.26 gain 66 125 -97.29 gain 125 66 -96.25 gain 66 126 -89.29 gain 126 66 -93.13 gain 66 127 -92.40 gain 127 66 -91.00 gain 66 128 -96.82 gain 128 66 -98.48 gain 66 129 -91.24 gain 129 66 -90.11 gain 66 130 -104.86 gain 130 66 -105.91 gain 66 131 -96.44 gain 131 66 -95.85 gain 66 132 -99.06 gain 132 66 -94.74 gain 66 133 -104.48 gain 133 66 -104.59 gain 66 134 -103.00 gain 134 66 -101.11 gain 66 135 -105.79 gain 135 66 -99.49 gain 66 136 -104.19 gain 136 66 -106.67 gain 66 137 -97.76 gain 137 66 -96.89 gain 66 138 -96.58 gain 138 66 -97.72 gain 66 139 -101.25 gain 139 66 -104.10 gain 66 140 -97.60 gain 140 66 -100.26 gain 66 141 -96.81 gain 141 66 -95.16 gain 66 142 -101.30 gain 142 66 -100.80 gain 66 143 -104.12 gain 143 66 -106.07 gain 66 144 -94.57 gain 144 66 -92.42 gain 66 145 -101.16 gain 145 66 -103.56 gain 66 146 -104.72 gain 146 66 -103.56 gain 66 147 -104.57 gain 147 66 -104.61 gain 66 148 -104.08 gain 148 66 -104.64 gain 66 149 -103.72 gain 149 66 -100.66 gain 66 150 -101.28 gain 150 66 -101.60 gain 66 151 -96.21 gain 151 66 -99.01 gain 66 152 -101.99 gain 152 66 -103.15 gain 66 153 -102.58 gain 153 66 -103.44 gain 66 154 -102.69 gain 154 66 -104.68 gain 66 155 -98.42 gain 155 66 -97.71 gain 66 156 -99.52 gain 156 66 -99.92 gain 66 157 -93.51 gain 157 66 -95.22 gain 66 158 -93.47 gain 158 66 -97.15 gain 66 159 -102.76 gain 159 66 -100.47 gain 66 160 -104.71 gain 160 66 -103.80 gain 66 161 -100.95 gain 161 66 -101.09 gain 66 162 -109.46 gain 162 66 -109.23 gain 66 163 -100.40 gain 163 66 -97.60 gain 66 164 -109.18 gain 164 66 -113.60 gain 66 165 -102.08 gain 165 66 -103.86 gain 66 166 -99.94 gain 166 66 -103.38 gain 66 167 -101.52 gain 167 66 -103.77 gain 66 168 -100.53 gain 168 66 -101.85 gain 66 169 -100.47 gain 169 66 -98.31 gain 66 170 -105.53 gain 170 66 -104.31 gain 66 171 -108.48 gain 171 66 -107.83 gain 66 172 -98.40 gain 172 66 -100.54 gain 66 173 -97.10 gain 173 66 -93.57 gain 66 174 -106.74 gain 174 66 -109.16 gain 66 175 -97.95 gain 175 66 -92.17 gain 66 176 -112.26 gain 176 66 -110.70 gain 66 177 -104.97 gain 177 66 -105.77 gain 66 178 -106.90 gain 178 66 -105.31 gain 66 179 -102.94 gain 179 66 -104.40 gain 66 180 -109.27 gain 180 66 -109.46 gain 66 181 -107.34 gain 181 66 -110.93 gain 66 182 -105.82 gain 182 66 -105.54 gain 66 183 -103.04 gain 183 66 -98.65 gain 66 184 -96.43 gain 184 66 -98.27 gain 66 185 -100.83 gain 185 66 -101.16 gain 66 186 -114.66 gain 186 66 -115.70 gain 66 187 -97.65 gain 187 66 -98.71 gain 66 188 -99.74 gain 188 66 -105.24 gain 66 189 -108.40 gain 189 66 -109.96 gain 66 190 -105.31 gain 190 66 -99.71 gain 66 191 -104.45 gain 191 66 -102.02 gain 66 192 -98.02 gain 192 66 -99.27 gain 66 193 -98.57 gain 193 66 -95.83 gain 66 194 -105.88 gain 194 66 -103.03 gain 66 195 -103.59 gain 195 66 -98.71 gain 66 196 -102.51 gain 196 66 -105.31 gain 66 197 -107.33 gain 197 66 -107.61 gain 66 198 -100.67 gain 198 66 -103.60 gain 66 199 -105.76 gain 199 66 -102.71 gain 66 200 -103.56 gain 200 66 -102.42 gain 66 201 -102.04 gain 201 66 -103.99 gain 66 202 -102.26 gain 202 66 -102.51 gain 66 203 -109.25 gain 203 66 -109.60 gain 66 204 -107.38 gain 204 66 -105.94 gain 66 205 -114.61 gain 205 66 -112.84 gain 66 206 -111.17 gain 206 66 -110.72 gain 66 207 -103.61 gain 207 66 -100.91 gain 66 208 -103.88 gain 208 66 -104.48 gain 66 209 -110.91 gain 209 66 -110.55 gain 66 210 -101.15 gain 210 66 -104.79 gain 66 211 -104.49 gain 211 66 -105.52 gain 66 212 -104.28 gain 212 66 -103.86 gain 66 213 -97.55 gain 213 66 -99.87 gain 66 214 -104.36 gain 214 66 -104.86 gain 66 215 -109.50 gain 215 66 -111.82 gain 66 216 -100.17 gain 216 66 -99.38 gain 66 217 -105.91 gain 217 66 -109.58 gain 66 218 -112.38 gain 218 66 -117.36 gain 66 219 -110.12 gain 219 66 -112.68 gain 66 220 -107.00 gain 220 66 -106.66 gain 66 221 -103.05 gain 221 66 -103.70 gain 66 222 -109.45 gain 222 66 -106.68 gain 66 223 -108.64 gain 223 66 -108.17 gain 66 224 -108.19 gain 224 66 -104.64 gain 67 68 -73.64 gain 68 67 -73.60 gain 67 69 -82.42 gain 69 67 -80.64 gain 67 70 -93.69 gain 70 67 -94.61 gain 67 71 -84.97 gain 71 67 -86.64 gain 67 72 -89.17 gain 72 67 -92.69 gain 67 73 -98.21 gain 73 67 -98.78 gain 67 74 -104.01 gain 74 67 -100.58 gain 67 75 -108.32 gain 75 67 -105.27 gain 67 76 -104.58 gain 76 67 -104.02 gain 67 77 -100.59 gain 77 67 -98.34 gain 67 78 -90.41 gain 78 67 -96.79 gain 67 79 -88.49 gain 79 67 -89.41 gain 67 80 -81.52 gain 80 67 -80.78 gain 67 81 -81.09 gain 81 67 -84.62 gain 67 82 -76.98 gain 82 67 -79.67 gain 67 83 -77.70 gain 83 67 -79.97 gain 67 84 -91.95 gain 84 67 -91.29 gain 67 85 -88.30 gain 85 67 -92.22 gain 67 86 -98.37 gain 86 67 -95.48 gain 67 87 -93.77 gain 87 67 -93.67 gain 67 88 -99.76 gain 88 67 -99.95 gain 67 89 -99.92 gain 89 67 -100.74 gain 67 90 -99.98 gain 90 67 -104.34 gain 67 91 -98.38 gain 91 67 -98.32 gain 67 92 -88.69 gain 92 67 -92.21 gain 67 93 -94.63 gain 93 67 -92.06 gain 67 94 -88.01 gain 94 67 -87.87 gain 67 95 -89.63 gain 95 67 -92.53 gain 67 96 -86.08 gain 96 67 -85.25 gain 67 97 -83.87 gain 97 67 -84.32 gain 67 98 -95.61 gain 98 67 -93.23 gain 67 99 -88.53 gain 99 67 -90.25 gain 67 100 -91.39 gain 100 67 -90.94 gain 67 101 -89.45 gain 101 67 -87.67 gain 67 102 -92.31 gain 102 67 -91.19 gain 67 103 -99.89 gain 103 67 -98.00 gain 67 104 -106.15 gain 104 67 -100.69 gain 67 105 -106.69 gain 105 67 -106.63 gain 67 106 -100.08 gain 106 67 -99.32 gain 67 107 -97.91 gain 107 67 -100.18 gain 67 108 -93.32 gain 108 67 -93.64 gain 67 109 -92.32 gain 109 67 -89.49 gain 67 110 -91.39 gain 110 67 -90.80 gain 67 111 -83.66 gain 111 67 -80.26 gain 67 112 -81.61 gain 112 67 -80.22 gain 67 113 -87.20 gain 113 67 -92.75 gain 67 114 -90.95 gain 114 67 -92.13 gain 67 115 -99.88 gain 115 67 -101.92 gain 67 116 -93.72 gain 116 67 -91.78 gain 67 117 -91.69 gain 117 67 -89.60 gain 67 118 -102.43 gain 118 67 -108.51 gain 67 119 -96.18 gain 119 67 -93.81 gain 67 120 -99.34 gain 120 67 -97.07 gain 67 121 -100.87 gain 121 67 -101.35 gain 67 122 -108.84 gain 122 67 -111.88 gain 67 123 -97.75 gain 123 67 -101.05 gain 67 124 -94.28 gain 124 67 -91.19 gain 67 125 -92.78 gain 125 67 -91.62 gain 67 126 -103.06 gain 126 67 -106.79 gain 67 127 -95.56 gain 127 67 -94.03 gain 67 128 -92.94 gain 128 67 -94.48 gain 67 129 -91.94 gain 129 67 -90.69 gain 67 130 -91.97 gain 130 67 -92.90 gain 67 131 -98.13 gain 131 67 -97.42 gain 67 132 -96.28 gain 132 67 -91.84 gain 67 133 -103.18 gain 133 67 -103.17 gain 67 134 -101.99 gain 134 67 -99.98 gain 67 135 -106.02 gain 135 67 -99.59 gain 67 136 -109.80 gain 136 67 -112.15 gain 67 137 -103.43 gain 137 67 -102.44 gain 67 138 -98.10 gain 138 67 -99.13 gain 67 139 -100.46 gain 139 67 -103.19 gain 67 140 -93.53 gain 140 67 -96.07 gain 67 141 -91.77 gain 141 67 -89.99 gain 67 142 -98.87 gain 142 67 -98.25 gain 67 143 -100.86 gain 143 67 -102.69 gain 67 144 -100.79 gain 144 67 -98.52 gain 67 145 -99.93 gain 145 67 -102.21 gain 67 146 -100.83 gain 146 67 -99.55 gain 67 147 -105.21 gain 147 67 -105.12 gain 67 148 -99.24 gain 148 67 -99.68 gain 67 149 -98.12 gain 149 67 -94.94 gain 67 150 -107.12 gain 150 67 -107.32 gain 67 151 -109.75 gain 151 67 -112.43 gain 67 152 -97.12 gain 152 67 -98.16 gain 67 153 -104.16 gain 153 67 -104.89 gain 67 154 -99.11 gain 154 67 -100.97 gain 67 155 -98.42 gain 155 67 -97.58 gain 67 156 -102.31 gain 156 67 -102.60 gain 67 157 -95.81 gain 157 67 -97.39 gain 67 158 -100.87 gain 158 67 -104.42 gain 67 159 -90.61 gain 159 67 -88.20 gain 67 160 -102.27 gain 160 67 -101.24 gain 67 161 -106.21 gain 161 67 -106.23 gain 67 162 -103.69 gain 162 67 -103.34 gain 67 163 -100.02 gain 163 67 -97.09 gain 67 164 -110.02 gain 164 67 -114.32 gain 67 165 -107.90 gain 165 67 -109.55 gain 67 166 -103.46 gain 166 67 -106.78 gain 67 167 -94.93 gain 167 67 -97.06 gain 67 168 -106.55 gain 168 67 -107.75 gain 67 169 -104.89 gain 169 67 -102.60 gain 67 170 -103.85 gain 170 67 -102.51 gain 67 171 -102.34 gain 171 67 -101.56 gain 67 172 -102.05 gain 172 67 -104.07 gain 67 173 -99.40 gain 173 67 -95.74 gain 67 174 -105.37 gain 174 67 -107.67 gain 67 175 -102.83 gain 175 67 -96.93 gain 67 176 -106.21 gain 176 67 -104.52 gain 67 177 -111.06 gain 177 67 -111.75 gain 67 178 -101.59 gain 178 67 -99.88 gain 67 179 -111.83 gain 179 67 -113.16 gain 67 180 -105.40 gain 180 67 -105.47 gain 67 181 -111.02 gain 181 67 -114.49 gain 67 182 -100.48 gain 182 67 -100.08 gain 67 183 -104.73 gain 183 67 -100.22 gain 67 184 -101.75 gain 184 67 -103.47 gain 67 185 -107.98 gain 185 67 -108.20 gain 67 186 -105.00 gain 186 67 -105.92 gain 67 187 -103.63 gain 187 67 -104.57 gain 67 188 -102.82 gain 188 67 -108.20 gain 67 189 -106.30 gain 189 67 -107.74 gain 67 190 -108.24 gain 190 67 -102.51 gain 67 191 -103.85 gain 191 67 -101.29 gain 67 192 -106.80 gain 192 67 -107.92 gain 67 193 -102.95 gain 193 67 -100.09 gain 67 194 -106.35 gain 194 67 -103.39 gain 67 195 -107.03 gain 195 67 -102.04 gain 67 196 -103.66 gain 196 67 -106.34 gain 67 197 -106.66 gain 197 67 -106.82 gain 67 198 -107.61 gain 198 67 -110.42 gain 67 199 -102.76 gain 199 67 -99.58 gain 67 200 -103.26 gain 200 67 -101.99 gain 67 201 -99.53 gain 201 67 -101.36 gain 67 202 -112.41 gain 202 67 -112.54 gain 67 203 -111.90 gain 203 67 -112.12 gain 67 204 -100.23 gain 204 67 -98.68 gain 67 205 -103.27 gain 205 67 -101.38 gain 67 206 -103.00 gain 206 67 -102.43 gain 67 207 -103.29 gain 207 67 -100.47 gain 67 208 -107.82 gain 208 67 -108.30 gain 67 209 -111.16 gain 209 67 -110.68 gain 67 210 -103.25 gain 210 67 -106.77 gain 67 211 -105.52 gain 211 67 -106.43 gain 67 212 -103.97 gain 212 67 -103.43 gain 67 213 -110.89 gain 213 67 -113.08 gain 67 214 -103.22 gain 214 67 -103.60 gain 67 215 -105.44 gain 215 67 -107.64 gain 67 216 -104.21 gain 216 67 -103.30 gain 67 217 -105.31 gain 217 67 -108.84 gain 67 218 -109.78 gain 218 67 -114.64 gain 67 219 -107.38 gain 219 67 -109.81 gain 67 220 -103.82 gain 220 67 -103.36 gain 67 221 -103.61 gain 221 67 -104.15 gain 67 222 -105.88 gain 222 67 -102.99 gain 67 223 -109.62 gain 223 67 -109.02 gain 67 224 -107.64 gain 224 67 -103.97 gain 68 69 -73.99 gain 69 68 -72.25 gain 68 70 -86.20 gain 70 68 -87.16 gain 68 71 -90.09 gain 71 68 -91.81 gain 68 72 -99.73 gain 72 68 -103.29 gain 68 73 -95.81 gain 73 68 -96.43 gain 68 74 -101.65 gain 74 68 -98.26 gain 68 75 -108.25 gain 75 68 -105.25 gain 68 76 -101.64 gain 76 68 -101.13 gain 68 77 -107.80 gain 77 68 -105.59 gain 68 78 -99.50 gain 78 68 -105.92 gain 68 79 -95.92 gain 79 68 -96.89 gain 68 80 -91.68 gain 80 68 -90.98 gain 68 81 -86.05 gain 81 68 -89.62 gain 68 82 -83.40 gain 82 68 -86.13 gain 68 83 -72.36 gain 83 68 -74.67 gain 68 84 -80.56 gain 84 68 -79.95 gain 68 85 -82.05 gain 85 68 -86.02 gain 68 86 -92.71 gain 86 68 -89.86 gain 68 87 -96.42 gain 87 68 -96.37 gain 68 88 -92.50 gain 88 68 -92.73 gain 68 89 -97.35 gain 89 68 -98.22 gain 68 90 -107.11 gain 90 68 -111.51 gain 68 91 -106.92 gain 91 68 -106.91 gain 68 92 -102.96 gain 92 68 -106.52 gain 68 93 -98.17 gain 93 68 -95.64 gain 68 94 -95.83 gain 94 68 -95.74 gain 68 95 -88.94 gain 95 68 -91.89 gain 68 96 -86.18 gain 96 68 -85.40 gain 68 97 -82.04 gain 97 68 -82.54 gain 68 98 -87.17 gain 98 68 -84.84 gain 68 99 -84.44 gain 99 68 -86.20 gain 68 100 -93.84 gain 100 68 -93.44 gain 68 101 -85.25 gain 101 68 -83.51 gain 68 102 -87.76 gain 102 68 -86.68 gain 68 103 -98.59 gain 103 68 -96.74 gain 68 104 -94.67 gain 104 68 -89.26 gain 68 105 -105.72 gain 105 68 -105.71 gain 68 106 -100.20 gain 106 68 -99.49 gain 68 107 -93.44 gain 107 68 -95.74 gain 68 108 -93.24 gain 108 68 -93.61 gain 68 109 -99.04 gain 109 68 -96.25 gain 68 110 -92.92 gain 110 68 -92.37 gain 68 111 -89.67 gain 111 68 -86.32 gain 68 112 -90.25 gain 112 68 -88.91 gain 68 113 -96.56 gain 113 68 -102.15 gain 68 114 -95.00 gain 114 68 -96.23 gain 68 115 -98.87 gain 115 68 -100.95 gain 68 116 -90.21 gain 116 68 -88.31 gain 68 117 -95.46 gain 117 68 -93.41 gain 68 118 -103.45 gain 118 68 -109.58 gain 68 119 -98.82 gain 119 68 -96.50 gain 68 120 -99.76 gain 120 68 -97.54 gain 68 121 -104.43 gain 121 68 -104.95 gain 68 122 -103.56 gain 122 68 -106.65 gain 68 123 -100.10 gain 123 68 -103.44 gain 68 124 -93.83 gain 124 68 -90.78 gain 68 125 -98.78 gain 125 68 -97.67 gain 68 126 -93.33 gain 126 68 -97.09 gain 68 127 -93.75 gain 127 68 -92.27 gain 68 128 -87.29 gain 128 68 -88.86 gain 68 129 -91.92 gain 129 68 -90.71 gain 68 130 -90.33 gain 130 68 -91.30 gain 68 131 -88.59 gain 131 68 -87.92 gain 68 132 -91.67 gain 132 68 -87.27 gain 68 133 -97.58 gain 133 68 -97.62 gain 68 134 -99.49 gain 134 68 -97.52 gain 68 135 -107.34 gain 135 68 -100.96 gain 68 136 -103.12 gain 136 68 -105.51 gain 68 137 -97.57 gain 137 68 -96.62 gain 68 138 -105.47 gain 138 68 -106.54 gain 68 139 -108.19 gain 139 68 -110.96 gain 68 140 -99.94 gain 140 68 -102.52 gain 68 141 -98.19 gain 141 68 -96.46 gain 68 142 -100.84 gain 142 68 -100.26 gain 68 143 -97.84 gain 143 68 -99.71 gain 68 144 -97.57 gain 144 68 -95.35 gain 68 145 -100.21 gain 145 68 -102.54 gain 68 146 -91.04 gain 146 68 -89.80 gain 68 147 -101.67 gain 147 68 -101.63 gain 68 148 -106.94 gain 148 68 -107.42 gain 68 149 -106.01 gain 149 68 -102.87 gain 68 150 -105.91 gain 150 68 -106.15 gain 68 151 -101.49 gain 151 68 -104.21 gain 68 152 -100.85 gain 152 68 -101.93 gain 68 153 -106.67 gain 153 68 -107.44 gain 68 154 -101.19 gain 154 68 -103.10 gain 68 155 -101.88 gain 155 68 -101.09 gain 68 156 -99.42 gain 156 68 -99.75 gain 68 157 -95.02 gain 157 68 -96.65 gain 68 158 -104.94 gain 158 68 -108.54 gain 68 159 -100.73 gain 159 68 -98.37 gain 68 160 -95.61 gain 160 68 -94.62 gain 68 161 -102.08 gain 161 68 -102.14 gain 68 162 -102.32 gain 162 68 -102.01 gain 68 163 -98.36 gain 163 68 -95.47 gain 68 164 -101.88 gain 164 68 -106.22 gain 68 165 -101.07 gain 165 68 -102.77 gain 68 166 -99.45 gain 166 68 -102.80 gain 68 167 -102.91 gain 167 68 -105.09 gain 68 168 -111.76 gain 168 68 -113.01 gain 68 169 -94.84 gain 169 68 -92.60 gain 68 170 -96.55 gain 170 68 -95.24 gain 68 171 -97.27 gain 171 68 -96.54 gain 68 172 -98.84 gain 172 68 -100.91 gain 68 173 -106.89 gain 173 68 -103.28 gain 68 174 -104.84 gain 174 68 -107.19 gain 68 175 -102.47 gain 175 68 -96.61 gain 68 176 -102.13 gain 176 68 -100.49 gain 68 177 -103.37 gain 177 68 -104.10 gain 68 178 -112.08 gain 178 68 -110.41 gain 68 179 -97.27 gain 179 68 -98.65 gain 68 180 -109.70 gain 180 68 -109.82 gain 68 181 -108.56 gain 181 68 -112.07 gain 68 182 -101.22 gain 182 68 -100.86 gain 68 183 -102.34 gain 183 68 -97.87 gain 68 184 -95.12 gain 184 68 -96.88 gain 68 185 -105.52 gain 185 68 -105.78 gain 68 186 -99.93 gain 186 68 -100.89 gain 68 187 -99.70 gain 187 68 -100.69 gain 68 188 -103.96 gain 188 68 -109.38 gain 68 189 -98.80 gain 189 68 -100.28 gain 68 190 -105.61 gain 190 68 -99.93 gain 68 191 -105.11 gain 191 68 -102.60 gain 68 192 -102.86 gain 192 68 -104.02 gain 68 193 -97.61 gain 193 68 -94.80 gain 68 194 -103.09 gain 194 68 -100.17 gain 68 195 -110.09 gain 195 68 -105.14 gain 68 196 -108.51 gain 196 68 -111.22 gain 68 197 -109.47 gain 197 68 -109.67 gain 68 198 -107.93 gain 198 68 -110.78 gain 68 199 -107.19 gain 199 68 -104.06 gain 68 200 -101.47 gain 200 68 -100.25 gain 68 201 -100.09 gain 201 68 -101.96 gain 68 202 -102.81 gain 202 68 -102.98 gain 68 203 -106.90 gain 203 68 -107.16 gain 68 204 -96.15 gain 204 68 -94.63 gain 68 205 -102.70 gain 205 68 -100.85 gain 68 206 -105.55 gain 206 68 -105.03 gain 68 207 -107.59 gain 207 68 -104.81 gain 68 208 -99.59 gain 208 68 -100.11 gain 68 209 -105.83 gain 209 68 -105.39 gain 68 210 -108.39 gain 210 68 -111.96 gain 68 211 -110.18 gain 211 68 -111.14 gain 68 212 -108.44 gain 212 68 -107.94 gain 68 213 -104.77 gain 213 68 -107.01 gain 68 214 -111.75 gain 214 68 -112.17 gain 68 215 -108.49 gain 215 68 -110.73 gain 68 216 -98.64 gain 216 68 -97.77 gain 68 217 -106.43 gain 217 68 -110.01 gain 68 218 -101.68 gain 218 68 -106.58 gain 68 219 -108.23 gain 219 68 -110.71 gain 68 220 -97.98 gain 220 68 -97.57 gain 68 221 -103.61 gain 221 68 -104.19 gain 68 222 -108.52 gain 222 68 -105.68 gain 68 223 -103.89 gain 223 68 -103.34 gain 68 224 -102.23 gain 224 68 -98.61 gain 69 70 -74.07 gain 70 69 -76.77 gain 69 71 -83.86 gain 71 69 -87.31 gain 69 72 -87.06 gain 72 69 -92.37 gain 69 73 -95.41 gain 73 69 -97.77 gain 69 74 -95.61 gain 74 69 -93.96 gain 69 75 -100.67 gain 75 69 -99.40 gain 69 76 -103.72 gain 76 69 -104.95 gain 69 77 -101.37 gain 77 69 -100.90 gain 69 78 -94.98 gain 78 69 -103.15 gain 69 79 -98.46 gain 79 69 -101.17 gain 69 80 -90.85 gain 80 69 -91.89 gain 69 81 -82.12 gain 81 69 -87.44 gain 69 82 -84.50 gain 82 69 -88.97 gain 69 83 -76.58 gain 83 69 -80.63 gain 69 84 -76.72 gain 84 69 -77.84 gain 69 85 -87.13 gain 85 69 -92.84 gain 69 86 -77.94 gain 86 69 -76.84 gain 69 87 -83.03 gain 87 69 -84.72 gain 69 88 -91.25 gain 88 69 -93.22 gain 69 89 -102.89 gain 89 69 -105.49 gain 69 90 -100.04 gain 90 69 -106.18 gain 69 91 -105.58 gain 91 69 -107.31 gain 69 92 -97.32 gain 92 69 -102.62 gain 69 93 -99.99 gain 93 69 -99.20 gain 69 94 -93.22 gain 94 69 -94.87 gain 69 95 -98.58 gain 95 69 -103.26 gain 69 96 -90.49 gain 96 69 -91.45 gain 69 97 -81.62 gain 97 69 -83.85 gain 69 98 -91.92 gain 98 69 -91.32 gain 69 99 -83.57 gain 99 69 -87.07 gain 69 100 -83.43 gain 100 69 -84.77 gain 69 101 -83.12 gain 101 69 -83.12 gain 69 102 -98.50 gain 102 69 -99.16 gain 69 103 -92.70 gain 103 69 -92.60 gain 69 104 -94.78 gain 104 69 -91.11 gain 69 105 -107.50 gain 105 69 -109.23 gain 69 106 -99.05 gain 106 69 -100.08 gain 69 107 -102.48 gain 107 69 -106.53 gain 69 108 -103.28 gain 108 69 -105.39 gain 69 109 -99.13 gain 109 69 -98.09 gain 69 110 -100.71 gain 110 69 -101.90 gain 69 111 -86.96 gain 111 69 -85.36 gain 69 112 -86.78 gain 112 69 -87.17 gain 69 113 -85.52 gain 113 69 -92.85 gain 69 114 -87.08 gain 114 69 -90.05 gain 69 115 -90.24 gain 115 69 -94.06 gain 69 116 -90.15 gain 116 69 -90.00 gain 69 117 -85.93 gain 117 69 -85.62 gain 69 118 -98.19 gain 118 69 -106.05 gain 69 119 -94.73 gain 119 69 -94.14 gain 69 120 -104.55 gain 120 69 -104.06 gain 69 121 -97.67 gain 121 69 -99.93 gain 69 122 -100.69 gain 122 69 -105.52 gain 69 123 -100.40 gain 123 69 -105.49 gain 69 124 -92.90 gain 124 69 -91.59 gain 69 125 -98.34 gain 125 69 -98.96 gain 69 126 -90.18 gain 126 69 -95.69 gain 69 127 -96.23 gain 127 69 -96.49 gain 69 128 -94.80 gain 128 69 -98.12 gain 69 129 -88.86 gain 129 69 -89.40 gain 69 130 -102.14 gain 130 69 -104.85 gain 69 131 -94.89 gain 131 69 -95.97 gain 69 132 -93.41 gain 132 69 -90.76 gain 69 133 -102.70 gain 133 69 -104.47 gain 69 134 -93.04 gain 134 69 -92.81 gain 69 135 -102.86 gain 135 69 -98.22 gain 69 136 -103.65 gain 136 69 -107.78 gain 69 137 -105.64 gain 137 69 -106.43 gain 69 138 -103.65 gain 138 69 -106.45 gain 69 139 -104.14 gain 139 69 -108.65 gain 69 140 -105.83 gain 140 69 -110.16 gain 69 141 -99.81 gain 141 69 -99.82 gain 69 142 -95.06 gain 142 69 -96.22 gain 69 143 -86.77 gain 143 69 -90.38 gain 69 144 -95.87 gain 144 69 -95.38 gain 69 145 -95.40 gain 145 69 -99.47 gain 69 146 -97.02 gain 146 69 -97.52 gain 69 147 -97.88 gain 147 69 -99.58 gain 69 148 -94.13 gain 148 69 -96.35 gain 69 149 -104.04 gain 149 69 -102.64 gain 69 150 -103.85 gain 150 69 -105.84 gain 69 151 -99.92 gain 151 69 -104.39 gain 69 152 -106.99 gain 152 69 -109.81 gain 69 153 -100.79 gain 153 69 -103.31 gain 69 154 -102.81 gain 154 69 -106.46 gain 69 155 -97.96 gain 155 69 -98.90 gain 69 156 -100.33 gain 156 69 -102.40 gain 69 157 -99.27 gain 157 69 -102.64 gain 69 158 -103.32 gain 158 69 -108.65 gain 69 159 -96.37 gain 159 69 -95.75 gain 69 160 -96.10 gain 160 69 -96.85 gain 69 161 -94.25 gain 161 69 -96.06 gain 69 162 -97.63 gain 162 69 -99.06 gain 69 163 -93.93 gain 163 69 -92.78 gain 69 164 -98.29 gain 164 69 -104.38 gain 69 165 -101.31 gain 165 69 -104.75 gain 69 166 -105.20 gain 166 69 -110.30 gain 69 167 -99.98 gain 167 69 -103.90 gain 69 168 -106.84 gain 168 69 -109.82 gain 69 169 -95.48 gain 169 69 -94.98 gain 69 170 -101.54 gain 170 69 -101.98 gain 69 171 -99.82 gain 171 69 -100.83 gain 69 172 -100.97 gain 172 69 -104.78 gain 69 173 -96.56 gain 173 69 -94.69 gain 69 174 -97.99 gain 174 69 -102.07 gain 69 175 -98.06 gain 175 69 -93.94 gain 69 176 -107.49 gain 176 69 -107.60 gain 69 177 -95.36 gain 177 69 -97.82 gain 69 178 -96.71 gain 178 69 -96.78 gain 69 179 -109.49 gain 179 69 -112.60 gain 69 180 -107.32 gain 180 69 -109.18 gain 69 181 -105.56 gain 181 69 -110.81 gain 69 182 -104.00 gain 182 69 -105.39 gain 69 183 -105.48 gain 183 69 -102.75 gain 69 184 -97.67 gain 184 69 -101.17 gain 69 185 -102.55 gain 185 69 -104.55 gain 69 186 -98.99 gain 186 69 -101.69 gain 69 187 -103.21 gain 187 69 -105.94 gain 69 188 -101.79 gain 188 69 -108.95 gain 69 189 -98.31 gain 189 69 -101.54 gain 69 190 -93.02 gain 190 69 -89.08 gain 69 191 -97.85 gain 191 69 -97.08 gain 69 192 -99.30 gain 192 69 -102.20 gain 69 193 -102.54 gain 193 69 -101.47 gain 69 194 -106.20 gain 194 69 -105.02 gain 69 195 -112.05 gain 195 69 -108.84 gain 69 196 -112.30 gain 196 69 -116.76 gain 69 197 -106.66 gain 197 69 -108.61 gain 69 198 -105.79 gain 198 69 -110.38 gain 69 199 -98.05 gain 199 69 -96.65 gain 69 200 -102.77 gain 200 69 -103.29 gain 69 201 -105.29 gain 201 69 -108.90 gain 69 202 -101.69 gain 202 69 -103.60 gain 69 203 -100.22 gain 203 69 -102.23 gain 69 204 -100.90 gain 204 69 -101.13 gain 69 205 -110.54 gain 205 69 -110.44 gain 69 206 -101.67 gain 206 69 -102.89 gain 69 207 -99.36 gain 207 69 -98.33 gain 69 208 -105.07 gain 208 69 -107.34 gain 69 209 -103.54 gain 209 69 -104.84 gain 69 210 -109.05 gain 210 69 -114.36 gain 69 211 -109.82 gain 211 69 -112.51 gain 69 212 -108.59 gain 212 69 -109.83 gain 69 213 -113.12 gain 213 69 -117.10 gain 69 214 -99.14 gain 214 69 -101.30 gain 69 215 -94.36 gain 215 69 -98.34 gain 69 216 -101.31 gain 216 69 -102.18 gain 69 217 -105.48 gain 217 69 -110.81 gain 69 218 -98.78 gain 218 69 -105.42 gain 69 219 -102.89 gain 219 69 -107.10 gain 69 220 -106.48 gain 220 69 -107.80 gain 69 221 -101.36 gain 221 69 -103.68 gain 69 222 -97.17 gain 222 69 -96.06 gain 69 223 -107.37 gain 223 69 -108.55 gain 69 224 -105.14 gain 224 69 -103.25 gain 70 71 -73.15 gain 71 70 -73.90 gain 70 72 -77.52 gain 72 70 -80.13 gain 70 73 -91.81 gain 73 70 -91.47 gain 70 74 -99.68 gain 74 70 -95.34 gain 70 75 -102.64 gain 75 70 -98.68 gain 70 76 -104.95 gain 76 70 -103.48 gain 70 77 -108.62 gain 77 70 -105.45 gain 70 78 -96.17 gain 78 70 -101.64 gain 70 79 -97.26 gain 79 70 -97.27 gain 70 80 -102.03 gain 80 70 -100.37 gain 70 81 -101.91 gain 81 70 -104.53 gain 70 82 -89.30 gain 82 70 -91.07 gain 70 83 -90.56 gain 83 70 -91.92 gain 70 84 -78.38 gain 84 70 -76.81 gain 70 85 -74.01 gain 85 70 -77.02 gain 70 86 -82.52 gain 86 70 -78.71 gain 70 87 -89.35 gain 87 70 -88.34 gain 70 88 -87.29 gain 88 70 -86.56 gain 70 89 -90.63 gain 89 70 -90.53 gain 70 90 -113.04 gain 90 70 -116.48 gain 70 91 -99.89 gain 91 70 -98.92 gain 70 92 -98.79 gain 92 70 -101.39 gain 70 93 -99.92 gain 93 70 -96.43 gain 70 94 -93.74 gain 94 70 -92.69 gain 70 95 -93.25 gain 95 70 -95.23 gain 70 96 -101.70 gain 96 70 -99.96 gain 70 97 -98.82 gain 97 70 -98.35 gain 70 98 -93.46 gain 98 70 -90.17 gain 70 99 -96.29 gain 99 70 -97.09 gain 70 100 -78.12 gain 100 70 -76.76 gain 70 101 -86.97 gain 101 70 -84.28 gain 70 102 -94.05 gain 102 70 -92.02 gain 70 103 -94.60 gain 103 70 -91.79 gain 70 104 -103.85 gain 104 70 -97.47 gain 70 105 -107.86 gain 105 70 -106.89 gain 70 106 -101.44 gain 106 70 -99.77 gain 70 107 -104.02 gain 107 70 -105.37 gain 70 108 -102.69 gain 108 70 -102.10 gain 70 109 -105.53 gain 109 70 -101.79 gain 70 110 -100.01 gain 110 70 -98.51 gain 70 111 -93.45 gain 111 70 -89.14 gain 70 112 -97.28 gain 112 70 -94.97 gain 70 113 -88.71 gain 113 70 -93.34 gain 70 114 -87.93 gain 114 70 -88.19 gain 70 115 -96.34 gain 115 70 -97.46 gain 70 116 -94.89 gain 116 70 -92.03 gain 70 117 -97.21 gain 117 70 -94.20 gain 70 118 -96.58 gain 118 70 -101.74 gain 70 119 -99.23 gain 119 70 -95.94 gain 70 120 -104.51 gain 120 70 -101.33 gain 70 121 -109.59 gain 121 70 -109.15 gain 70 122 -105.74 gain 122 70 -107.88 gain 70 123 -102.35 gain 123 70 -104.74 gain 70 124 -105.65 gain 124 70 -101.64 gain 70 125 -100.53 gain 125 70 -98.45 gain 70 126 -102.09 gain 126 70 -104.89 gain 70 127 -99.98 gain 127 70 -97.54 gain 70 128 -87.79 gain 128 70 -88.41 gain 70 129 -95.22 gain 129 70 -93.06 gain 70 130 -91.02 gain 130 70 -91.03 gain 70 131 -97.02 gain 131 70 -95.39 gain 70 132 -89.13 gain 132 70 -83.77 gain 70 133 -93.52 gain 133 70 -92.59 gain 70 134 -94.73 gain 134 70 -91.80 gain 70 135 -103.20 gain 135 70 -95.86 gain 70 136 -103.75 gain 136 70 -105.18 gain 70 137 -111.71 gain 137 70 -109.80 gain 70 138 -98.17 gain 138 70 -98.28 gain 70 139 -107.20 gain 139 70 -109.02 gain 70 140 -98.08 gain 140 70 -99.70 gain 70 141 -101.72 gain 141 70 -99.03 gain 70 142 -101.08 gain 142 70 -99.54 gain 70 143 -98.07 gain 143 70 -98.99 gain 70 144 -101.18 gain 144 70 -97.99 gain 70 145 -94.63 gain 145 70 -95.99 gain 70 146 -102.61 gain 146 70 -100.42 gain 70 147 -93.53 gain 147 70 -92.53 gain 70 148 -95.07 gain 148 70 -94.60 gain 70 149 -102.25 gain 149 70 -98.15 gain 70 150 -105.33 gain 150 70 -104.62 gain 70 151 -102.65 gain 151 70 -104.41 gain 70 152 -98.71 gain 152 70 -98.83 gain 70 153 -108.56 gain 153 70 -108.38 gain 70 154 -100.94 gain 154 70 -101.89 gain 70 155 -107.65 gain 155 70 -105.89 gain 70 156 -101.61 gain 156 70 -100.98 gain 70 157 -106.83 gain 157 70 -107.50 gain 70 158 -87.96 gain 158 70 -90.60 gain 70 159 -99.57 gain 159 70 -96.24 gain 70 160 -99.10 gain 160 70 -97.15 gain 70 161 -91.58 gain 161 70 -90.68 gain 70 162 -97.88 gain 162 70 -96.61 gain 70 163 -94.67 gain 163 70 -90.82 gain 70 164 -98.87 gain 164 70 -102.25 gain 70 165 -108.75 gain 165 70 -109.49 gain 70 166 -101.59 gain 166 70 -103.99 gain 70 167 -110.05 gain 167 70 -111.27 gain 70 168 -107.76 gain 168 70 -108.04 gain 70 169 -105.47 gain 169 70 -102.27 gain 70 170 -107.40 gain 170 70 -105.14 gain 70 171 -106.60 gain 171 70 -104.91 gain 70 172 -105.07 gain 172 70 -106.17 gain 70 173 -100.43 gain 173 70 -95.86 gain 70 174 -96.32 gain 174 70 -97.71 gain 70 175 -105.82 gain 175 70 -99.00 gain 70 176 -102.92 gain 176 70 -100.32 gain 70 177 -108.65 gain 177 70 -108.41 gain 70 178 -98.68 gain 178 70 -96.05 gain 70 179 -105.68 gain 179 70 -106.10 gain 70 180 -112.50 gain 180 70 -111.66 gain 70 181 -99.20 gain 181 70 -101.76 gain 70 182 -106.15 gain 182 70 -104.84 gain 70 183 -106.15 gain 183 70 -100.72 gain 70 184 -108.52 gain 184 70 -109.32 gain 70 185 -102.48 gain 185 70 -101.77 gain 70 186 -102.61 gain 186 70 -102.61 gain 70 187 -101.69 gain 187 70 -101.72 gain 70 188 -104.24 gain 188 70 -108.71 gain 70 189 -106.51 gain 189 70 -107.04 gain 70 190 -108.42 gain 190 70 -101.78 gain 70 191 -106.66 gain 191 70 -103.19 gain 70 192 -108.37 gain 192 70 -108.57 gain 70 193 -102.82 gain 193 70 -99.04 gain 70 194 -101.53 gain 194 70 -97.65 gain 70 195 -111.90 gain 195 70 -105.98 gain 70 196 -107.24 gain 196 70 -109.00 gain 70 197 -117.65 gain 197 70 -116.90 gain 70 198 -107.74 gain 198 70 -109.63 gain 70 199 -103.80 gain 199 70 -99.70 gain 70 200 -104.04 gain 200 70 -101.87 gain 70 201 -104.90 gain 201 70 -105.81 gain 70 202 -99.44 gain 202 70 -98.65 gain 70 203 -106.49 gain 203 70 -105.80 gain 70 204 -113.70 gain 204 70 -111.23 gain 70 205 -105.08 gain 205 70 -102.27 gain 70 206 -102.00 gain 206 70 -100.52 gain 70 207 -100.28 gain 207 70 -96.54 gain 70 208 -97.36 gain 208 70 -96.92 gain 70 209 -114.73 gain 209 70 -113.33 gain 70 210 -106.47 gain 210 70 -109.07 gain 70 211 -112.24 gain 211 70 -112.24 gain 70 212 -106.84 gain 212 70 -105.38 gain 70 213 -106.35 gain 213 70 -107.63 gain 70 214 -109.03 gain 214 70 -108.49 gain 70 215 -109.72 gain 215 70 -111.00 gain 70 216 -105.48 gain 216 70 -103.65 gain 70 217 -105.87 gain 217 70 -108.49 gain 70 218 -112.06 gain 218 70 -116.00 gain 70 219 -107.50 gain 219 70 -109.01 gain 70 220 -110.75 gain 220 70 -109.38 gain 70 221 -111.79 gain 221 70 -111.41 gain 70 222 -110.58 gain 222 70 -106.78 gain 70 223 -115.21 gain 223 70 -113.69 gain 70 224 -106.30 gain 224 70 -101.72 gain 71 72 -78.15 gain 72 71 -80.00 gain 71 73 -86.05 gain 73 71 -84.96 gain 71 74 -93.44 gain 74 71 -88.34 gain 71 75 -112.18 gain 75 71 -107.46 gain 71 76 -105.29 gain 76 71 -103.07 gain 71 77 -104.22 gain 77 71 -100.30 gain 71 78 -97.85 gain 78 71 -102.56 gain 71 79 -106.00 gain 79 71 -105.25 gain 71 80 -102.36 gain 80 71 -99.95 gain 71 81 -97.49 gain 81 71 -99.35 gain 71 82 -87.29 gain 82 71 -88.31 gain 71 83 -93.73 gain 83 71 -94.32 gain 71 84 -92.29 gain 84 71 -89.96 gain 71 85 -86.61 gain 85 71 -88.86 gain 71 86 -80.53 gain 86 71 -75.96 gain 71 87 -83.34 gain 87 71 -81.58 gain 71 88 -89.91 gain 88 71 -88.43 gain 71 89 -98.41 gain 89 71 -97.56 gain 71 90 -109.81 gain 90 71 -112.49 gain 71 91 -116.46 gain 91 71 -114.74 gain 71 92 -105.88 gain 92 71 -107.72 gain 71 93 -109.76 gain 93 71 -105.52 gain 71 94 -103.50 gain 94 71 -101.69 gain 71 95 -106.19 gain 95 71 -107.42 gain 71 96 -95.27 gain 96 71 -92.77 gain 71 97 -95.33 gain 97 71 -94.10 gain 71 98 -92.43 gain 98 71 -88.38 gain 71 99 -88.73 gain 99 71 -88.78 gain 71 100 -85.81 gain 100 71 -83.69 gain 71 101 -90.92 gain 101 71 -87.47 gain 71 102 -90.48 gain 102 71 -87.69 gain 71 103 -88.92 gain 103 71 -85.36 gain 71 104 -94.24 gain 104 71 -87.11 gain 71 105 -109.60 gain 105 71 -107.87 gain 71 106 -97.81 gain 106 71 -95.39 gain 71 107 -107.95 gain 107 71 -108.54 gain 71 108 -110.68 gain 108 71 -109.33 gain 71 109 -98.90 gain 109 71 -94.39 gain 71 110 -107.61 gain 110 71 -105.35 gain 71 111 -97.12 gain 111 71 -92.06 gain 71 112 -98.77 gain 112 71 -95.71 gain 71 113 -96.50 gain 113 71 -100.37 gain 71 114 -92.45 gain 114 71 -91.96 gain 71 115 -88.96 gain 115 71 -89.32 gain 71 116 -83.69 gain 116 71 -80.08 gain 71 117 -100.41 gain 117 71 -96.64 gain 71 118 -100.76 gain 118 71 -105.16 gain 71 119 -94.35 gain 119 71 -90.30 gain 71 120 -108.47 gain 120 71 -104.53 gain 71 121 -107.51 gain 121 71 -106.31 gain 71 122 -100.92 gain 122 71 -102.30 gain 71 123 -113.68 gain 123 71 -115.31 gain 71 124 -107.74 gain 124 71 -102.97 gain 71 125 -104.27 gain 125 71 -101.44 gain 71 126 -98.08 gain 126 71 -100.13 gain 71 127 -100.79 gain 127 71 -97.59 gain 71 128 -98.41 gain 128 71 -98.27 gain 71 129 -94.54 gain 129 71 -91.62 gain 71 130 -98.70 gain 130 71 -97.96 gain 71 131 -91.47 gain 131 71 -89.09 gain 71 132 -95.67 gain 132 71 -89.56 gain 71 133 -98.64 gain 133 71 -96.96 gain 71 134 -94.53 gain 134 71 -90.84 gain 71 135 -107.45 gain 135 71 -99.35 gain 71 136 -113.16 gain 136 71 -113.84 gain 71 137 -100.71 gain 137 71 -98.04 gain 71 138 -103.94 gain 138 71 -103.29 gain 71 139 -97.82 gain 139 71 -98.88 gain 71 140 -106.51 gain 140 71 -107.38 gain 71 141 -94.30 gain 141 71 -90.86 gain 71 142 -101.02 gain 142 71 -98.72 gain 71 143 -98.76 gain 143 71 -98.92 gain 71 144 -103.53 gain 144 71 -99.58 gain 71 145 -98.31 gain 145 71 -98.92 gain 71 146 -94.74 gain 146 71 -91.79 gain 71 147 -98.12 gain 147 71 -96.36 gain 71 148 -97.97 gain 148 71 -96.74 gain 71 149 -97.45 gain 149 71 -92.60 gain 71 150 -107.72 gain 150 71 -106.25 gain 71 151 -111.78 gain 151 71 -112.78 gain 71 152 -112.83 gain 152 71 -112.19 gain 71 153 -111.72 gain 153 71 -110.79 gain 71 154 -108.56 gain 154 71 -108.75 gain 71 155 -111.28 gain 155 71 -108.77 gain 71 156 -101.99 gain 156 71 -100.60 gain 71 157 -101.22 gain 157 71 -101.13 gain 71 158 -103.73 gain 158 71 -105.61 gain 71 159 -89.08 gain 159 71 -85.00 gain 71 160 -96.77 gain 160 71 -94.07 gain 71 161 -99.13 gain 161 71 -97.48 gain 71 162 -101.61 gain 162 71 -99.59 gain 71 163 -95.21 gain 163 71 -90.61 gain 71 164 -96.22 gain 164 71 -98.84 gain 71 165 -116.97 gain 165 71 -116.95 gain 71 166 -109.43 gain 166 71 -111.07 gain 71 167 -104.88 gain 167 71 -105.34 gain 71 168 -105.74 gain 168 71 -105.27 gain 71 169 -109.30 gain 169 71 -105.34 gain 71 170 -104.90 gain 170 71 -101.88 gain 71 171 -101.36 gain 171 71 -98.91 gain 71 172 -108.63 gain 172 71 -108.98 gain 71 173 -103.42 gain 173 71 -98.09 gain 71 174 -108.33 gain 174 71 -108.96 gain 71 175 -109.07 gain 175 71 -101.50 gain 71 176 -96.53 gain 176 71 -93.17 gain 71 177 -105.93 gain 177 71 -104.94 gain 71 178 -105.54 gain 178 71 -102.15 gain 71 179 -94.38 gain 179 71 -94.04 gain 71 180 -103.35 gain 180 71 -101.75 gain 71 181 -111.60 gain 181 71 -113.40 gain 71 182 -114.84 gain 182 71 -112.77 gain 71 183 -104.59 gain 183 71 -98.40 gain 71 184 -101.61 gain 184 71 -101.65 gain 71 185 -109.28 gain 185 71 -107.82 gain 71 186 -99.97 gain 186 71 -99.21 gain 71 187 -105.65 gain 187 71 -104.91 gain 71 188 -110.61 gain 188 71 -114.32 gain 71 189 -100.00 gain 189 71 -99.77 gain 71 190 -103.37 gain 190 71 -95.97 gain 71 191 -94.13 gain 191 71 -89.91 gain 71 192 -99.69 gain 192 71 -99.13 gain 71 193 -103.96 gain 193 71 -99.43 gain 71 194 -107.76 gain 194 71 -103.12 gain 71 195 -105.07 gain 195 71 -98.40 gain 71 196 -111.27 gain 196 71 -112.27 gain 71 197 -101.98 gain 197 71 -100.47 gain 71 198 -110.51 gain 198 71 -111.64 gain 71 199 -106.46 gain 199 71 -101.61 gain 71 200 -106.54 gain 200 71 -103.60 gain 71 201 -107.41 gain 201 71 -107.57 gain 71 202 -109.29 gain 202 71 -107.74 gain 71 203 -103.09 gain 203 71 -101.64 gain 71 204 -104.56 gain 204 71 -101.34 gain 71 205 -115.78 gain 205 71 -112.21 gain 71 206 -107.82 gain 206 71 -105.58 gain 71 207 -102.70 gain 207 71 -98.20 gain 71 208 -109.55 gain 208 71 -108.35 gain 71 209 -100.47 gain 209 71 -98.32 gain 71 210 -109.30 gain 210 71 -111.15 gain 71 211 -109.91 gain 211 71 -109.15 gain 71 212 -106.74 gain 212 71 -104.53 gain 71 213 -109.65 gain 213 71 -110.18 gain 71 214 -113.82 gain 214 71 -112.52 gain 71 215 -112.02 gain 215 71 -112.54 gain 71 216 -105.98 gain 216 71 -103.40 gain 71 217 -113.06 gain 217 71 -114.93 gain 71 218 -104.13 gain 218 71 -107.31 gain 71 219 -99.52 gain 219 71 -100.28 gain 71 220 -111.79 gain 220 71 -109.66 gain 71 221 -97.98 gain 221 71 -96.85 gain 71 222 -107.46 gain 222 71 -102.90 gain 71 223 -103.34 gain 223 71 -101.06 gain 71 224 -110.73 gain 224 71 -105.39 gain 72 73 -86.25 gain 73 72 -83.31 gain 72 74 -95.37 gain 74 72 -88.42 gain 72 75 -117.67 gain 75 72 -111.10 gain 72 76 -106.33 gain 76 72 -102.26 gain 72 77 -99.93 gain 77 72 -94.16 gain 72 78 -101.87 gain 78 72 -104.72 gain 72 79 -110.48 gain 79 72 -107.88 gain 72 80 -103.17 gain 80 72 -98.90 gain 72 81 -101.47 gain 81 72 -101.47 gain 72 82 -93.89 gain 82 72 -93.06 gain 72 83 -98.14 gain 83 72 -96.89 gain 72 84 -101.49 gain 84 72 -97.32 gain 72 85 -87.37 gain 85 72 -87.77 gain 72 86 -82.26 gain 86 72 -75.84 gain 72 87 -76.19 gain 87 72 -72.57 gain 72 88 -82.27 gain 88 72 -78.93 gain 72 89 -84.27 gain 89 72 -81.57 gain 72 90 -115.57 gain 90 72 -116.40 gain 72 91 -111.35 gain 91 72 -107.77 gain 72 92 -107.83 gain 92 72 -107.82 gain 72 93 -99.60 gain 93 72 -93.51 gain 72 94 -108.80 gain 94 72 -105.14 gain 72 95 -101.75 gain 95 72 -101.13 gain 72 96 -103.63 gain 96 72 -99.28 gain 72 97 -101.81 gain 97 72 -98.74 gain 72 98 -95.18 gain 98 72 -89.29 gain 72 99 -89.75 gain 99 72 -87.94 gain 72 100 -90.12 gain 100 72 -86.16 gain 72 101 -91.39 gain 101 72 -86.08 gain 72 102 -87.96 gain 102 72 -83.32 gain 72 103 -95.56 gain 103 72 -90.15 gain 72 104 -96.27 gain 104 72 -87.29 gain 72 105 -112.73 gain 105 72 -109.15 gain 72 106 -111.98 gain 106 72 -107.71 gain 72 107 -112.86 gain 107 72 -111.60 gain 72 108 -106.93 gain 108 72 -103.73 gain 72 109 -106.48 gain 109 72 -100.13 gain 72 110 -104.55 gain 110 72 -100.44 gain 72 111 -103.79 gain 111 72 -96.88 gain 72 112 -105.62 gain 112 72 -100.71 gain 72 113 -92.97 gain 113 72 -95.00 gain 72 114 -98.54 gain 114 72 -96.20 gain 72 115 -93.06 gain 115 72 -91.57 gain 72 116 -94.95 gain 116 72 -89.49 gain 72 117 -96.12 gain 117 72 -90.51 gain 72 118 -88.88 gain 118 72 -91.43 gain 72 119 -91.29 gain 119 72 -85.40 gain 72 120 -108.56 gain 120 72 -102.77 gain 72 121 -108.65 gain 121 72 -105.60 gain 72 122 -109.01 gain 122 72 -108.54 gain 72 123 -108.44 gain 123 72 -108.22 gain 72 124 -111.08 gain 124 72 -104.47 gain 72 125 -106.04 gain 125 72 -101.36 gain 72 126 -102.81 gain 126 72 -103.01 gain 72 127 -104.58 gain 127 72 -99.53 gain 72 128 -97.58 gain 128 72 -95.59 gain 72 129 -100.58 gain 129 72 -95.81 gain 72 130 -95.66 gain 130 72 -93.07 gain 72 131 -99.96 gain 131 72 -95.73 gain 72 132 -97.06 gain 132 72 -89.10 gain 72 133 -95.98 gain 133 72 -92.45 gain 72 134 -93.07 gain 134 72 -87.54 gain 72 135 -112.71 gain 135 72 -102.76 gain 72 136 -107.44 gain 136 72 -106.26 gain 72 137 -112.04 gain 137 72 -107.53 gain 72 138 -110.12 gain 138 72 -107.62 gain 72 139 -114.03 gain 139 72 -113.24 gain 72 140 -106.80 gain 140 72 -105.82 gain 72 141 -103.87 gain 141 72 -98.57 gain 72 142 -104.12 gain 142 72 -99.98 gain 72 143 -98.99 gain 143 72 -97.29 gain 72 144 -97.87 gain 144 72 -92.08 gain 72 145 -108.53 gain 145 72 -107.29 gain 72 146 -102.95 gain 146 72 -98.15 gain 72 147 -90.21 gain 147 72 -86.61 gain 72 148 -103.49 gain 148 72 -100.41 gain 72 149 -95.26 gain 149 72 -88.56 gain 72 150 -107.34 gain 150 72 -104.01 gain 72 151 -106.40 gain 151 72 -105.55 gain 72 152 -110.42 gain 152 72 -107.94 gain 72 153 -107.17 gain 153 72 -104.38 gain 72 154 -109.69 gain 154 72 -108.03 gain 72 155 -101.25 gain 155 72 -96.89 gain 72 156 -103.36 gain 156 72 -100.12 gain 72 157 -103.18 gain 157 72 -101.25 gain 72 158 -99.15 gain 158 72 -99.18 gain 72 159 -97.11 gain 159 72 -91.18 gain 72 160 -104.34 gain 160 72 -99.78 gain 72 161 -103.35 gain 161 72 -99.84 gain 72 162 -99.27 gain 162 72 -95.40 gain 72 163 -99.68 gain 163 72 -93.23 gain 72 164 -105.70 gain 164 72 -106.48 gain 72 165 -105.06 gain 165 72 -103.19 gain 72 166 -108.46 gain 166 72 -108.25 gain 72 167 -105.69 gain 167 72 -104.30 gain 72 168 -115.02 gain 168 72 -112.70 gain 72 169 -119.34 gain 169 72 -113.53 gain 72 170 -111.06 gain 170 72 -106.19 gain 72 171 -109.43 gain 171 72 -105.13 gain 72 172 -115.00 gain 172 72 -113.50 gain 72 173 -105.17 gain 173 72 -97.99 gain 72 174 -100.47 gain 174 72 -99.25 gain 72 175 -101.77 gain 175 72 -92.35 gain 72 176 -104.37 gain 176 72 -99.17 gain 72 177 -103.20 gain 177 72 -100.36 gain 72 178 -105.58 gain 178 72 -100.34 gain 72 179 -108.46 gain 179 72 -106.27 gain 72 180 -122.38 gain 180 72 -118.92 gain 72 181 -111.07 gain 181 72 -111.02 gain 72 182 -102.39 gain 182 72 -98.47 gain 72 183 -111.60 gain 183 72 -103.56 gain 72 184 -108.78 gain 184 72 -106.97 gain 72 185 -112.89 gain 185 72 -109.58 gain 72 186 -110.58 gain 186 72 -107.97 gain 72 187 -107.08 gain 187 72 -104.49 gain 72 188 -111.03 gain 188 72 -112.89 gain 72 189 -113.23 gain 189 72 -111.15 gain 72 190 -110.43 gain 190 72 -101.18 gain 72 191 -109.75 gain 191 72 -103.68 gain 72 192 -119.75 gain 192 72 -117.34 gain 72 193 -106.72 gain 193 72 -100.34 gain 72 194 -113.79 gain 194 72 -107.30 gain 72 195 -114.84 gain 195 72 -106.32 gain 72 196 -110.95 gain 196 72 -110.10 gain 72 197 -112.17 gain 197 72 -108.81 gain 72 198 -117.64 gain 198 72 -116.93 gain 72 199 -116.58 gain 199 72 -109.88 gain 72 200 -111.47 gain 200 72 -106.68 gain 72 201 -103.84 gain 201 72 -102.15 gain 72 202 -115.61 gain 202 72 -112.22 gain 72 203 -103.37 gain 203 72 -100.08 gain 72 204 -117.17 gain 204 72 -112.09 gain 72 205 -103.50 gain 205 72 -98.09 gain 72 206 -109.70 gain 206 72 -105.61 gain 72 207 -104.17 gain 207 72 -97.83 gain 72 208 -106.61 gain 208 72 -103.57 gain 72 209 -105.09 gain 209 72 -101.08 gain 72 210 -115.21 gain 210 72 -115.20 gain 72 211 -114.94 gain 211 72 -112.33 gain 72 212 -117.39 gain 212 72 -113.32 gain 72 213 -110.46 gain 213 72 -109.13 gain 72 214 -117.44 gain 214 72 -114.30 gain 72 215 -113.89 gain 215 72 -112.56 gain 72 216 -101.30 gain 216 72 -96.86 gain 72 217 -110.44 gain 217 72 -110.46 gain 72 218 -108.81 gain 218 72 -110.14 gain 72 219 -103.79 gain 219 72 -102.70 gain 72 220 -113.22 gain 220 72 -109.24 gain 72 221 -109.12 gain 221 72 -106.14 gain 72 222 -102.58 gain 222 72 -96.18 gain 72 223 -105.02 gain 223 72 -100.90 gain 72 224 -108.57 gain 224 72 -101.38 gain 73 74 -77.92 gain 74 73 -73.91 gain 73 75 -107.43 gain 75 73 -103.80 gain 73 76 -103.09 gain 76 73 -101.96 gain 73 77 -108.88 gain 77 73 -106.06 gain 73 78 -105.59 gain 78 73 -111.39 gain 73 79 -106.21 gain 79 73 -106.56 gain 73 80 -104.53 gain 80 73 -103.21 gain 73 81 -106.45 gain 81 73 -109.40 gain 73 82 -98.91 gain 82 73 -101.02 gain 73 83 -98.63 gain 83 73 -100.32 gain 73 84 -100.49 gain 84 73 -99.26 gain 73 85 -94.19 gain 85 73 -97.54 gain 73 86 -88.09 gain 86 73 -84.62 gain 73 87 -74.75 gain 87 73 -74.08 gain 73 88 -78.61 gain 88 73 -78.22 gain 73 89 -81.47 gain 89 73 -81.72 gain 73 90 -106.25 gain 90 73 -110.03 gain 73 91 -105.10 gain 91 73 -104.47 gain 73 92 -101.32 gain 92 73 -104.26 gain 73 93 -108.96 gain 93 73 -105.81 gain 73 94 -100.81 gain 94 73 -100.09 gain 73 95 -96.94 gain 95 73 -99.27 gain 73 96 -99.97 gain 96 73 -98.57 gain 73 97 -99.86 gain 97 73 -99.73 gain 73 98 -102.81 gain 98 73 -99.86 gain 73 99 -104.81 gain 99 73 -105.95 gain 73 100 -95.87 gain 100 73 -94.85 gain 73 101 -84.34 gain 101 73 -81.98 gain 73 102 -89.10 gain 102 73 -87.40 gain 73 103 -78.90 gain 103 73 -76.44 gain 73 104 -84.61 gain 104 73 -78.58 gain 73 105 -104.28 gain 105 73 -103.65 gain 73 106 -108.92 gain 106 73 -107.59 gain 73 107 -105.52 gain 107 73 -107.21 gain 73 108 -107.48 gain 108 73 -107.23 gain 73 109 -98.90 gain 109 73 -95.50 gain 73 110 -102.59 gain 110 73 -101.43 gain 73 111 -100.34 gain 111 73 -96.37 gain 73 112 -102.85 gain 112 73 -100.89 gain 73 113 -99.01 gain 113 73 -103.98 gain 73 114 -101.46 gain 114 73 -102.06 gain 73 115 -85.27 gain 115 73 -86.73 gain 73 116 -93.43 gain 116 73 -90.92 gain 73 117 -91.84 gain 117 73 -89.17 gain 73 118 -93.25 gain 118 73 -98.75 gain 73 119 -94.52 gain 119 73 -91.57 gain 73 120 -106.09 gain 120 73 -103.24 gain 73 121 -107.98 gain 121 73 -107.88 gain 73 122 -110.59 gain 122 73 -113.06 gain 73 123 -102.31 gain 123 73 -105.04 gain 73 124 -105.79 gain 124 73 -102.12 gain 73 125 -99.32 gain 125 73 -97.59 gain 73 126 -96.74 gain 126 73 -99.89 gain 73 127 -94.07 gain 127 73 -91.97 gain 73 128 -96.02 gain 128 73 -96.98 gain 73 129 -104.69 gain 129 73 -102.87 gain 73 130 -93.84 gain 130 73 -94.19 gain 73 131 -97.65 gain 131 73 -96.37 gain 73 132 -102.56 gain 132 73 -97.55 gain 73 133 -90.24 gain 133 73 -89.65 gain 73 134 -96.27 gain 134 73 -93.69 gain 73 135 -113.93 gain 135 73 -106.93 gain 73 136 -105.78 gain 136 73 -107.55 gain 73 137 -103.88 gain 137 73 -102.32 gain 73 138 -108.41 gain 138 73 -108.85 gain 73 139 -107.04 gain 139 73 -109.19 gain 73 140 -104.60 gain 140 73 -106.57 gain 73 141 -108.65 gain 141 73 -106.30 gain 73 142 -104.17 gain 142 73 -102.97 gain 73 143 -95.63 gain 143 73 -96.88 gain 73 144 -99.40 gain 144 73 -96.56 gain 73 145 -101.52 gain 145 73 -103.23 gain 73 146 -101.03 gain 146 73 -99.18 gain 73 147 -94.18 gain 147 73 -93.52 gain 73 148 -100.23 gain 148 73 -100.09 gain 73 149 -96.86 gain 149 73 -93.10 gain 73 150 -106.23 gain 150 73 -105.85 gain 73 151 -111.24 gain 151 73 -113.35 gain 73 152 -113.10 gain 152 73 -113.56 gain 73 153 -111.65 gain 153 73 -111.80 gain 73 154 -105.61 gain 154 73 -106.90 gain 73 155 -104.93 gain 155 73 -103.52 gain 73 156 -103.65 gain 156 73 -103.36 gain 73 157 -104.91 gain 157 73 -105.92 gain 73 158 -107.79 gain 158 73 -110.77 gain 73 159 -100.00 gain 159 73 -97.02 gain 73 160 -90.71 gain 160 73 -89.10 gain 73 161 -100.05 gain 161 73 -99.50 gain 73 162 -97.66 gain 162 73 -96.73 gain 73 163 -106.65 gain 163 73 -103.15 gain 73 164 -97.80 gain 164 73 -101.52 gain 73 165 -114.37 gain 165 73 -115.45 gain 73 166 -102.16 gain 166 73 -104.90 gain 73 167 -108.82 gain 167 73 -110.38 gain 73 168 -109.90 gain 168 73 -110.53 gain 73 169 -108.54 gain 169 73 -105.68 gain 73 170 -109.35 gain 170 73 -107.43 gain 73 171 -113.22 gain 171 73 -111.87 gain 73 172 -112.80 gain 172 73 -114.24 gain 73 173 -112.21 gain 173 73 -107.98 gain 73 174 -103.00 gain 174 73 -104.73 gain 73 175 -104.98 gain 175 73 -98.50 gain 73 176 -104.68 gain 176 73 -102.43 gain 73 177 -97.11 gain 177 73 -97.22 gain 73 178 -102.77 gain 178 73 -100.48 gain 73 179 -100.90 gain 179 73 -101.66 gain 73 180 -110.58 gain 180 73 -110.07 gain 73 181 -108.07 gain 181 73 -110.97 gain 73 182 -116.21 gain 182 73 -115.24 gain 73 183 -99.81 gain 183 73 -94.72 gain 73 184 -109.08 gain 184 73 -110.22 gain 73 185 -108.80 gain 185 73 -108.44 gain 73 186 -99.99 gain 186 73 -100.33 gain 73 187 -107.57 gain 187 73 -107.94 gain 73 188 -108.97 gain 188 73 -113.78 gain 73 189 -106.62 gain 189 73 -107.49 gain 73 190 -98.80 gain 190 73 -92.50 gain 73 191 -103.42 gain 191 73 -100.29 gain 73 192 -100.29 gain 192 73 -100.84 gain 73 193 -102.16 gain 193 73 -98.73 gain 73 194 -99.75 gain 194 73 -96.21 gain 73 195 -114.88 gain 195 73 -109.30 gain 73 196 -121.19 gain 196 73 -123.29 gain 73 197 -114.32 gain 197 73 -113.91 gain 73 198 -111.94 gain 198 73 -114.18 gain 73 199 -103.16 gain 199 73 -99.41 gain 73 200 -108.13 gain 200 73 -106.29 gain 73 201 -102.51 gain 201 73 -103.76 gain 73 202 -106.90 gain 202 73 -106.45 gain 73 203 -100.35 gain 203 73 -100.00 gain 73 204 -111.82 gain 204 73 -109.69 gain 73 205 -107.03 gain 205 73 -104.57 gain 73 206 -115.35 gain 206 73 -114.21 gain 73 207 -106.84 gain 207 73 -103.45 gain 73 208 -104.81 gain 208 73 -104.71 gain 73 209 -107.42 gain 209 73 -106.36 gain 73 210 -112.77 gain 210 73 -115.72 gain 73 211 -117.77 gain 211 73 -118.11 gain 73 212 -112.65 gain 212 73 -111.53 gain 73 213 -106.47 gain 213 73 -108.09 gain 73 214 -109.14 gain 214 73 -108.95 gain 73 215 -104.65 gain 215 73 -106.27 gain 73 216 -114.55 gain 216 73 -113.07 gain 73 217 -115.66 gain 217 73 -118.62 gain 73 218 -104.78 gain 218 73 -109.06 gain 73 219 -103.99 gain 219 73 -105.85 gain 73 220 -110.28 gain 220 73 -109.25 gain 73 221 -103.77 gain 221 73 -103.73 gain 73 222 -106.03 gain 222 73 -102.57 gain 73 223 -102.89 gain 223 73 -101.71 gain 73 224 -104.30 gain 224 73 -100.06 gain 74 75 -113.47 gain 75 74 -113.85 gain 74 76 -106.07 gain 76 74 -108.95 gain 74 77 -108.79 gain 77 74 -109.96 gain 74 78 -104.73 gain 78 74 -114.54 gain 74 79 -101.47 gain 79 74 -105.83 gain 74 80 -98.21 gain 80 74 -100.90 gain 74 81 -95.70 gain 81 74 -102.66 gain 74 82 -102.03 gain 82 74 -108.15 gain 74 83 -91.22 gain 83 74 -96.92 gain 74 84 -86.04 gain 84 74 -88.81 gain 74 85 -90.07 gain 85 74 -97.43 gain 74 86 -93.43 gain 86 74 -93.97 gain 74 87 -80.12 gain 87 74 -83.46 gain 74 88 -66.85 gain 88 74 -70.47 gain 74 89 -76.86 gain 89 74 -81.11 gain 74 90 -108.40 gain 90 74 -116.19 gain 74 91 -110.51 gain 91 74 -113.89 gain 74 92 -108.45 gain 92 74 -115.40 gain 74 93 -101.73 gain 93 74 -102.59 gain 74 94 -100.12 gain 94 74 -103.41 gain 74 95 -98.20 gain 95 74 -104.53 gain 74 96 -97.56 gain 96 74 -100.16 gain 74 97 -105.61 gain 97 74 -109.50 gain 74 98 -96.42 gain 98 74 -97.47 gain 74 99 -89.20 gain 99 74 -94.35 gain 74 100 -94.96 gain 100 74 -97.95 gain 74 101 -90.61 gain 101 74 -92.26 gain 74 102 -90.13 gain 102 74 -92.44 gain 74 103 -79.88 gain 103 74 -81.42 gain 74 104 -87.51 gain 104 74 -85.49 gain 74 105 -110.59 gain 105 74 -113.96 gain 74 106 -108.23 gain 106 74 -110.91 gain 74 107 -106.93 gain 107 74 -112.62 gain 74 108 -105.46 gain 108 74 -109.21 gain 74 109 -102.23 gain 109 74 -102.83 gain 74 110 -101.43 gain 110 74 -104.28 gain 74 111 -97.29 gain 111 74 -97.32 gain 74 112 -100.72 gain 112 74 -102.77 gain 74 113 -97.96 gain 113 74 -106.94 gain 74 114 -96.79 gain 114 74 -101.40 gain 74 115 -96.41 gain 115 74 -101.88 gain 74 116 -91.54 gain 116 74 -93.03 gain 74 117 -96.49 gain 117 74 -97.82 gain 74 118 -89.71 gain 118 74 -99.22 gain 74 119 -79.15 gain 119 74 -80.21 gain 74 120 -105.42 gain 120 74 -106.59 gain 74 121 -100.55 gain 121 74 -104.46 gain 74 122 -100.01 gain 122 74 -106.48 gain 74 123 -107.76 gain 123 74 -114.49 gain 74 124 -99.32 gain 124 74 -99.66 gain 74 125 -101.41 gain 125 74 -103.68 gain 74 126 -103.72 gain 126 74 -110.87 gain 74 127 -99.13 gain 127 74 -101.04 gain 74 128 -97.85 gain 128 74 -102.81 gain 74 129 -92.35 gain 129 74 -94.52 gain 74 130 -93.25 gain 130 74 -97.61 gain 74 131 -96.88 gain 131 74 -99.60 gain 74 132 -89.86 gain 132 74 -88.85 gain 74 133 -86.06 gain 133 74 -89.48 gain 74 134 -91.01 gain 134 74 -92.43 gain 74 135 -107.92 gain 135 74 -104.92 gain 74 136 -103.60 gain 136 74 -109.38 gain 74 137 -108.03 gain 137 74 -110.47 gain 74 138 -105.56 gain 138 74 -110.02 gain 74 139 -103.53 gain 139 74 -109.69 gain 74 140 -95.70 gain 140 74 -101.67 gain 74 141 -104.55 gain 141 74 -106.20 gain 74 142 -102.57 gain 142 74 -105.38 gain 74 143 -107.29 gain 143 74 -112.55 gain 74 144 -95.61 gain 144 74 -96.77 gain 74 145 -101.54 gain 145 74 -107.25 gain 74 146 -99.96 gain 146 74 -102.11 gain 74 147 -98.29 gain 147 74 -101.64 gain 74 148 -89.03 gain 148 74 -92.90 gain 74 149 -91.40 gain 149 74 -91.64 gain 74 150 -103.54 gain 150 74 -107.17 gain 74 151 -104.93 gain 151 74 -111.04 gain 74 152 -98.35 gain 152 74 -102.82 gain 74 153 -111.41 gain 153 74 -115.57 gain 74 154 -103.26 gain 154 74 -108.55 gain 74 155 -107.86 gain 155 74 -110.45 gain 74 156 -105.30 gain 156 74 -109.01 gain 74 157 -98.10 gain 157 74 -103.11 gain 74 158 -103.56 gain 158 74 -110.55 gain 74 159 -98.58 gain 159 74 -99.60 gain 74 160 -94.95 gain 160 74 -97.35 gain 74 161 -104.80 gain 161 74 -108.25 gain 74 162 -95.48 gain 162 74 -98.56 gain 74 163 -97.84 gain 163 74 -98.34 gain 74 164 -91.33 gain 164 74 -99.06 gain 74 165 -106.06 gain 165 74 -111.14 gain 74 166 -106.97 gain 166 74 -113.71 gain 74 167 -104.07 gain 167 74 -109.64 gain 74 168 -108.33 gain 168 74 -112.97 gain 74 169 -95.30 gain 169 74 -96.44 gain 74 170 -107.06 gain 170 74 -109.14 gain 74 171 -102.50 gain 171 74 -105.16 gain 74 172 -105.74 gain 172 74 -111.19 gain 74 173 -96.89 gain 173 74 -96.66 gain 74 174 -103.21 gain 174 74 -108.94 gain 74 175 -99.09 gain 175 74 -96.62 gain 74 176 -95.01 gain 176 74 -96.76 gain 74 177 -97.73 gain 177 74 -101.85 gain 74 178 -99.00 gain 178 74 -100.72 gain 74 179 -98.59 gain 179 74 -103.36 gain 74 180 -109.93 gain 180 74 -113.43 gain 74 181 -113.96 gain 181 74 -120.86 gain 74 182 -103.62 gain 182 74 -106.65 gain 74 183 -109.49 gain 183 74 -108.41 gain 74 184 -103.89 gain 184 74 -109.03 gain 74 185 -99.03 gain 185 74 -102.67 gain 74 186 -107.43 gain 186 74 -111.78 gain 74 187 -105.21 gain 187 74 -109.58 gain 74 188 -103.95 gain 188 74 -112.76 gain 74 189 -101.08 gain 189 74 -105.95 gain 74 190 -103.74 gain 190 74 -101.44 gain 74 191 -105.17 gain 191 74 -106.05 gain 74 192 -93.84 gain 192 74 -98.39 gain 74 193 -100.60 gain 193 74 -101.17 gain 74 194 -99.93 gain 194 74 -100.39 gain 74 195 -113.96 gain 195 74 -112.39 gain 74 196 -106.81 gain 196 74 -112.91 gain 74 197 -110.38 gain 197 74 -113.97 gain 74 198 -104.98 gain 198 74 -111.22 gain 74 199 -113.73 gain 199 74 -113.99 gain 74 200 -108.41 gain 200 74 -110.57 gain 74 201 -103.50 gain 201 74 -108.76 gain 74 202 -103.05 gain 202 74 -106.61 gain 74 203 -100.65 gain 203 74 -104.30 gain 74 204 -104.40 gain 204 74 -106.28 gain 74 205 -96.89 gain 205 74 -98.43 gain 74 206 -105.24 gain 206 74 -108.11 gain 74 207 -96.15 gain 207 74 -96.75 gain 74 208 -106.78 gain 208 74 -110.69 gain 74 209 -104.65 gain 209 74 -107.60 gain 74 210 -109.71 gain 210 74 -116.65 gain 74 211 -104.75 gain 211 74 -109.09 gain 74 212 -107.24 gain 212 74 -110.13 gain 74 213 -105.96 gain 213 74 -111.59 gain 74 214 -109.40 gain 214 74 -113.21 gain 74 215 -104.35 gain 215 74 -109.97 gain 74 216 -106.88 gain 216 74 -109.40 gain 74 217 -102.04 gain 217 74 -109.01 gain 74 218 -109.54 gain 218 74 -117.82 gain 74 219 -101.71 gain 219 74 -107.57 gain 74 220 -101.34 gain 220 74 -104.32 gain 74 221 -105.67 gain 221 74 -109.63 gain 74 222 -102.17 gain 222 74 -102.72 gain 74 223 -99.20 gain 223 74 -102.03 gain 74 224 -104.70 gain 224 74 -104.46 gain 75 76 -62.60 gain 76 75 -65.09 gain 75 77 -79.76 gain 77 75 -80.56 gain 75 78 -83.19 gain 78 75 -92.62 gain 75 79 -93.50 gain 79 75 -97.47 gain 75 80 -87.86 gain 80 75 -90.16 gain 75 81 -97.84 gain 81 75 -104.42 gain 75 82 -96.42 gain 82 75 -102.16 gain 75 83 -105.28 gain 83 75 -110.60 gain 75 84 -104.34 gain 84 75 -106.74 gain 75 85 -105.43 gain 85 75 -112.41 gain 75 86 -107.34 gain 86 75 -107.50 gain 75 87 -108.35 gain 87 75 -111.31 gain 75 88 -108.46 gain 88 75 -111.70 gain 75 89 -105.00 gain 89 75 -108.88 gain 75 90 -74.44 gain 90 75 -81.85 gain 75 91 -78.73 gain 91 75 -81.72 gain 75 92 -76.78 gain 92 75 -83.34 gain 75 93 -87.83 gain 93 75 -88.31 gain 75 94 -85.96 gain 94 75 -88.87 gain 75 95 -98.85 gain 95 75 -104.80 gain 75 96 -98.12 gain 96 75 -100.34 gain 75 97 -99.28 gain 97 75 -102.78 gain 75 98 -93.70 gain 98 75 -94.38 gain 75 99 -96.81 gain 99 75 -101.57 gain 75 100 -103.19 gain 100 75 -105.80 gain 75 101 -94.95 gain 101 75 -96.21 gain 75 102 -102.27 gain 102 75 -104.20 gain 75 103 -106.48 gain 103 75 -107.64 gain 75 104 -115.08 gain 104 75 -112.67 gain 75 105 -88.28 gain 105 75 -91.27 gain 75 106 -82.95 gain 106 75 -85.25 gain 75 107 -90.27 gain 107 75 -95.58 gain 75 108 -91.59 gain 108 75 -94.96 gain 75 109 -93.41 gain 109 75 -93.63 gain 75 110 -95.98 gain 110 75 -98.44 gain 75 111 -97.13 gain 111 75 -96.79 gain 75 112 -92.15 gain 112 75 -93.81 gain 75 113 -101.45 gain 113 75 -110.05 gain 75 114 -100.62 gain 114 75 -104.85 gain 75 115 -104.05 gain 115 75 -109.14 gain 75 116 -108.69 gain 116 75 -109.80 gain 75 117 -101.50 gain 117 75 -102.46 gain 75 118 -108.73 gain 118 75 -117.86 gain 75 119 -108.50 gain 119 75 -109.18 gain 75 120 -89.41 gain 120 75 -90.19 gain 75 121 -88.47 gain 121 75 -92.00 gain 75 122 -85.92 gain 122 75 -92.02 gain 75 123 -92.68 gain 123 75 -99.03 gain 75 124 -101.00 gain 124 75 -100.95 gain 75 125 -94.16 gain 125 75 -96.05 gain 75 126 -95.60 gain 126 75 -102.37 gain 75 127 -108.04 gain 127 75 -109.57 gain 75 128 -98.71 gain 128 75 -103.29 gain 75 129 -103.79 gain 129 75 -105.59 gain 75 130 -106.02 gain 130 75 -110.00 gain 75 131 -102.00 gain 131 75 -104.34 gain 75 132 -102.09 gain 132 75 -100.70 gain 75 133 -98.65 gain 133 75 -101.69 gain 75 134 -117.10 gain 134 75 -118.14 gain 75 135 -90.11 gain 135 75 -86.73 gain 75 136 -88.68 gain 136 75 -94.08 gain 75 137 -83.57 gain 137 75 -85.63 gain 75 138 -97.07 gain 138 75 -101.14 gain 75 139 -97.86 gain 139 75 -103.64 gain 75 140 -96.89 gain 140 75 -102.47 gain 75 141 -104.82 gain 141 75 -106.09 gain 75 142 -93.20 gain 142 75 -95.63 gain 75 143 -97.33 gain 143 75 -102.21 gain 75 144 -105.92 gain 144 75 -106.70 gain 75 145 -102.71 gain 145 75 -108.04 gain 75 146 -108.73 gain 146 75 -110.50 gain 75 147 -104.95 gain 147 75 -107.92 gain 75 148 -106.30 gain 148 75 -109.79 gain 75 149 -101.74 gain 149 75 -101.61 gain 75 150 -94.35 gain 150 75 -97.60 gain 75 151 -100.98 gain 151 75 -106.71 gain 75 152 -94.88 gain 152 75 -98.97 gain 75 153 -93.86 gain 153 75 -97.65 gain 75 154 -87.57 gain 154 75 -92.49 gain 75 155 -99.99 gain 155 75 -102.20 gain 75 156 -100.39 gain 156 75 -103.72 gain 75 157 -90.52 gain 157 75 -95.15 gain 75 158 -102.39 gain 158 75 -108.99 gain 75 159 -99.19 gain 159 75 -99.83 gain 75 160 -109.05 gain 160 75 -111.07 gain 75 161 -99.46 gain 161 75 -102.53 gain 75 162 -107.66 gain 162 75 -110.35 gain 75 163 -116.01 gain 163 75 -116.13 gain 75 164 -107.66 gain 164 75 -115.01 gain 75 165 -94.16 gain 165 75 -98.86 gain 75 166 -94.44 gain 166 75 -100.81 gain 75 167 -97.07 gain 167 75 -102.25 gain 75 168 -94.57 gain 168 75 -98.82 gain 75 169 -99.86 gain 169 75 -100.63 gain 75 170 -97.88 gain 170 75 -99.59 gain 75 171 -99.14 gain 171 75 -101.41 gain 75 172 -101.69 gain 172 75 -106.76 gain 75 173 -100.39 gain 173 75 -99.78 gain 75 174 -101.93 gain 174 75 -107.28 gain 75 175 -102.71 gain 175 75 -99.86 gain 75 176 -101.82 gain 176 75 -103.19 gain 75 177 -110.66 gain 177 75 -114.39 gain 75 178 -106.93 gain 178 75 -108.27 gain 75 179 -108.06 gain 179 75 -112.44 gain 75 180 -91.23 gain 180 75 -94.35 gain 75 181 -88.13 gain 181 75 -94.65 gain 75 182 -94.13 gain 182 75 -96.78 gain 75 183 -102.20 gain 183 75 -100.73 gain 75 184 -101.52 gain 184 75 -106.29 gain 75 185 -104.98 gain 185 75 -108.24 gain 75 186 -104.66 gain 186 75 -108.62 gain 75 187 -106.91 gain 187 75 -110.90 gain 75 188 -105.08 gain 188 75 -113.51 gain 75 189 -100.96 gain 189 75 -105.45 gain 75 190 -100.82 gain 190 75 -98.15 gain 75 191 -109.89 gain 191 75 -110.39 gain 75 192 -108.11 gain 192 75 -112.28 gain 75 193 -104.45 gain 193 75 -104.64 gain 75 194 -104.90 gain 194 75 -104.98 gain 75 195 -98.54 gain 195 75 -96.59 gain 75 196 -98.30 gain 196 75 -104.02 gain 75 197 -107.50 gain 197 75 -110.72 gain 75 198 -97.76 gain 198 75 -103.62 gain 75 199 -95.12 gain 199 75 -94.99 gain 75 200 -100.05 gain 200 75 -101.84 gain 75 201 -105.89 gain 201 75 -110.77 gain 75 202 -101.12 gain 202 75 -104.29 gain 75 203 -102.97 gain 203 75 -106.24 gain 75 204 -100.92 gain 204 75 -102.41 gain 75 205 -98.66 gain 205 75 -99.82 gain 75 206 -110.19 gain 206 75 -112.67 gain 75 207 -110.29 gain 207 75 -110.52 gain 75 208 -105.24 gain 208 75 -108.77 gain 75 209 -111.47 gain 209 75 -114.04 gain 75 210 -105.51 gain 210 75 -112.08 gain 75 211 -104.17 gain 211 75 -108.13 gain 75 212 -102.32 gain 212 75 -104.83 gain 75 213 -113.82 gain 213 75 -119.07 gain 75 214 -103.28 gain 214 75 -106.71 gain 75 215 -95.78 gain 215 75 -101.03 gain 75 216 -99.13 gain 216 75 -101.27 gain 75 217 -101.79 gain 217 75 -108.38 gain 75 218 -95.76 gain 218 75 -103.66 gain 75 219 -108.37 gain 219 75 -113.85 gain 75 220 -109.25 gain 220 75 -111.84 gain 75 221 -110.81 gain 221 75 -114.39 gain 75 222 -107.51 gain 222 75 -107.67 gain 75 223 -112.48 gain 223 75 -114.93 gain 75 224 -111.93 gain 224 75 -111.31 gain 76 77 -70.22 gain 77 76 -68.52 gain 76 78 -83.18 gain 78 76 -90.12 gain 76 79 -90.73 gain 79 76 -92.21 gain 76 80 -86.78 gain 80 76 -86.58 gain 76 81 -92.21 gain 81 76 -96.29 gain 76 82 -99.40 gain 82 76 -102.65 gain 76 83 -102.49 gain 83 76 -105.31 gain 76 84 -95.69 gain 84 76 -95.58 gain 76 85 -104.75 gain 85 76 -109.23 gain 76 86 -106.85 gain 86 76 -104.51 gain 76 87 -106.35 gain 87 76 -106.81 gain 76 88 -110.57 gain 88 76 -111.31 gain 76 89 -108.82 gain 89 76 -110.19 gain 76 90 -74.67 gain 90 76 -79.58 gain 76 91 -72.15 gain 91 76 -72.65 gain 76 92 -76.43 gain 92 76 -80.50 gain 76 93 -84.72 gain 93 76 -82.70 gain 76 94 -91.66 gain 94 76 -92.08 gain 76 95 -88.74 gain 95 76 -92.20 gain 76 96 -91.79 gain 96 76 -91.52 gain 76 97 -92.71 gain 97 76 -93.72 gain 76 98 -101.63 gain 98 76 -99.80 gain 76 99 -103.08 gain 99 76 -105.35 gain 76 100 -102.73 gain 100 76 -102.84 gain 76 101 -105.13 gain 101 76 -103.90 gain 76 102 -113.11 gain 102 76 -112.54 gain 76 103 -113.73 gain 103 76 -112.40 gain 76 104 -114.98 gain 104 76 -110.07 gain 76 105 -88.14 gain 105 76 -88.64 gain 76 106 -82.95 gain 106 76 -82.75 gain 76 107 -88.41 gain 107 76 -91.22 gain 76 108 -91.28 gain 108 76 -92.16 gain 76 109 -82.62 gain 109 76 -80.35 gain 76 110 -93.46 gain 110 76 -93.42 gain 76 111 -95.11 gain 111 76 -92.27 gain 76 112 -95.58 gain 112 76 -94.75 gain 76 113 -103.14 gain 113 76 -109.24 gain 76 114 -99.50 gain 114 76 -101.23 gain 76 115 -103.30 gain 115 76 -105.89 gain 76 116 -117.31 gain 116 76 -115.92 gain 76 117 -99.99 gain 117 76 -98.45 gain 76 118 -106.09 gain 118 76 -112.73 gain 76 119 -115.66 gain 119 76 -113.84 gain 76 120 -94.25 gain 120 76 -92.54 gain 76 121 -87.54 gain 121 76 -88.57 gain 76 122 -85.51 gain 122 76 -89.11 gain 76 123 -88.17 gain 123 76 -92.02 gain 76 124 -97.27 gain 124 76 -94.73 gain 76 125 -95.02 gain 125 76 -94.41 gain 76 126 -96.69 gain 126 76 -100.96 gain 76 127 -107.66 gain 127 76 -106.68 gain 76 128 -107.69 gain 128 76 -109.77 gain 76 129 -100.08 gain 129 76 -99.38 gain 76 130 -102.77 gain 130 76 -104.25 gain 76 131 -109.37 gain 131 76 -109.21 gain 76 132 -104.16 gain 132 76 -100.27 gain 76 133 -106.88 gain 133 76 -107.42 gain 76 134 -112.74 gain 134 76 -111.28 gain 76 135 -93.17 gain 135 76 -87.30 gain 76 136 -88.71 gain 136 76 -91.61 gain 76 137 -87.85 gain 137 76 -87.41 gain 76 138 -90.03 gain 138 76 -91.60 gain 76 139 -94.43 gain 139 76 -97.71 gain 76 140 -93.11 gain 140 76 -96.20 gain 76 141 -91.91 gain 141 76 -90.69 gain 76 142 -105.82 gain 142 76 -105.75 gain 76 143 -97.93 gain 143 76 -100.31 gain 76 144 -101.33 gain 144 76 -99.61 gain 76 145 -103.85 gain 145 76 -106.68 gain 76 146 -101.48 gain 146 76 -100.75 gain 76 147 -107.81 gain 147 76 -108.27 gain 76 148 -104.53 gain 148 76 -105.52 gain 76 149 -113.12 gain 149 76 -110.49 gain 76 150 -96.53 gain 150 76 -97.28 gain 76 151 -101.51 gain 151 76 -104.74 gain 76 152 -93.48 gain 152 76 -95.07 gain 76 153 -96.72 gain 153 76 -98.00 gain 76 154 -96.92 gain 154 76 -99.34 gain 76 155 -102.52 gain 155 76 -102.24 gain 76 156 -98.18 gain 156 76 -99.02 gain 76 157 -106.57 gain 157 76 -108.71 gain 76 158 -100.32 gain 158 76 -104.42 gain 76 159 -102.77 gain 159 76 -100.91 gain 76 160 -106.66 gain 160 76 -106.18 gain 76 161 -104.17 gain 161 76 -104.74 gain 76 162 -104.65 gain 162 76 -104.86 gain 76 163 -111.96 gain 163 76 -109.58 gain 76 164 -114.87 gain 164 76 -119.73 gain 76 165 -102.33 gain 165 76 -104.53 gain 76 166 -97.19 gain 166 76 -101.06 gain 76 167 -101.66 gain 167 76 -104.35 gain 76 168 -104.93 gain 168 76 -106.68 gain 76 169 -96.02 gain 169 76 -94.29 gain 76 170 -100.53 gain 170 76 -99.74 gain 76 171 -94.09 gain 171 76 -93.86 gain 76 172 -104.19 gain 172 76 -106.77 gain 76 173 -112.48 gain 173 76 -109.38 gain 76 174 -106.07 gain 174 76 -108.93 gain 76 175 -110.12 gain 175 76 -104.77 gain 76 176 -104.76 gain 176 76 -103.63 gain 76 177 -108.21 gain 177 76 -109.45 gain 76 178 -109.36 gain 178 76 -108.20 gain 76 179 -109.61 gain 179 76 -111.50 gain 76 180 -105.29 gain 180 76 -105.92 gain 76 181 -95.42 gain 181 76 -99.44 gain 76 182 -106.37 gain 182 76 -106.53 gain 76 183 -105.60 gain 183 76 -101.64 gain 76 184 -96.62 gain 184 76 -98.89 gain 76 185 -101.19 gain 185 76 -101.96 gain 76 186 -103.25 gain 186 76 -104.72 gain 76 187 -98.71 gain 187 76 -100.21 gain 76 188 -107.44 gain 188 76 -113.37 gain 76 189 -110.42 gain 189 76 -112.42 gain 76 190 -102.24 gain 190 76 -97.07 gain 76 191 -103.90 gain 191 76 -101.90 gain 76 192 -110.16 gain 192 76 -111.83 gain 76 193 -110.99 gain 193 76 -108.69 gain 76 194 -116.48 gain 194 76 -114.06 gain 76 195 -104.35 gain 195 76 -99.90 gain 76 196 -104.33 gain 196 76 -107.55 gain 76 197 -98.54 gain 197 76 -99.26 gain 76 198 -102.44 gain 198 76 -105.80 gain 76 199 -101.19 gain 199 76 -98.56 gain 76 200 -98.27 gain 200 76 -97.56 gain 76 201 -97.34 gain 201 76 -99.73 gain 76 202 -104.42 gain 202 76 -105.10 gain 76 203 -108.46 gain 203 76 -109.23 gain 76 204 -109.13 gain 204 76 -108.12 gain 76 205 -104.06 gain 205 76 -102.73 gain 76 206 -111.85 gain 206 76 -111.84 gain 76 207 -114.76 gain 207 76 -112.49 gain 76 208 -103.52 gain 208 76 -104.55 gain 76 209 -103.62 gain 209 76 -103.69 gain 76 210 -105.21 gain 210 76 -109.28 gain 76 211 -108.33 gain 211 76 -109.80 gain 76 212 -105.49 gain 212 76 -105.50 gain 76 213 -103.37 gain 213 76 -106.12 gain 76 214 -102.63 gain 214 76 -103.56 gain 76 215 -104.53 gain 215 76 -107.28 gain 76 216 -111.71 gain 216 76 -111.35 gain 76 217 -105.44 gain 217 76 -109.53 gain 76 218 -104.78 gain 218 76 -110.19 gain 76 219 -107.65 gain 219 76 -110.63 gain 76 220 -105.91 gain 220 76 -106.01 gain 76 221 -116.70 gain 221 76 -117.79 gain 76 222 -108.18 gain 222 76 -105.85 gain 76 223 -104.36 gain 223 76 -104.31 gain 76 224 -106.79 gain 224 76 -103.67 gain 77 78 -69.91 gain 78 77 -78.55 gain 77 79 -82.15 gain 79 77 -85.33 gain 77 80 -86.77 gain 80 77 -88.27 gain 77 81 -92.99 gain 81 77 -98.77 gain 77 82 -95.20 gain 82 77 -100.15 gain 77 83 -97.09 gain 83 77 -101.61 gain 77 84 -100.00 gain 84 77 -101.60 gain 77 85 -95.44 gain 85 77 -101.61 gain 77 86 -102.59 gain 86 77 -101.95 gain 77 87 -94.53 gain 87 77 -96.69 gain 77 88 -109.61 gain 88 77 -112.05 gain 77 89 -108.26 gain 89 77 -111.33 gain 77 90 -80.31 gain 90 77 -86.92 gain 77 91 -75.03 gain 91 77 -77.23 gain 77 92 -72.94 gain 92 77 -78.71 gain 77 93 -74.00 gain 93 77 -73.68 gain 77 94 -93.49 gain 94 77 -95.60 gain 77 95 -87.48 gain 95 77 -92.63 gain 77 96 -94.08 gain 96 77 -95.51 gain 77 97 -86.63 gain 97 77 -89.33 gain 77 98 -101.57 gain 98 77 -101.45 gain 77 99 -104.39 gain 99 77 -108.36 gain 77 100 -104.68 gain 100 77 -106.49 gain 77 101 -96.32 gain 101 77 -96.79 gain 77 102 -103.62 gain 102 77 -104.75 gain 77 103 -103.85 gain 103 77 -104.21 gain 77 104 -105.45 gain 104 77 -102.25 gain 77 105 -89.96 gain 105 77 -92.16 gain 77 106 -85.70 gain 106 77 -87.20 gain 77 107 -84.22 gain 107 77 -88.74 gain 77 108 -73.97 gain 108 77 -76.55 gain 77 109 -88.89 gain 109 77 -88.31 gain 77 110 -91.96 gain 110 77 -93.62 gain 77 111 -92.02 gain 111 77 -90.88 gain 77 112 -99.92 gain 112 77 -100.79 gain 77 113 -103.08 gain 113 77 -110.88 gain 77 114 -97.46 gain 114 77 -100.89 gain 77 115 -94.94 gain 115 77 -99.23 gain 77 116 -107.51 gain 116 77 -107.83 gain 77 117 -101.49 gain 117 77 -101.64 gain 77 118 -105.56 gain 118 77 -113.89 gain 77 119 -108.42 gain 119 77 -108.30 gain 77 120 -90.42 gain 120 77 -90.41 gain 77 121 -83.05 gain 121 77 -85.78 gain 77 122 -88.78 gain 122 77 -94.08 gain 77 123 -89.96 gain 123 77 -95.51 gain 77 124 -88.28 gain 124 77 -87.44 gain 77 125 -91.93 gain 125 77 -93.02 gain 77 126 -95.03 gain 126 77 -101.01 gain 77 127 -99.28 gain 127 77 -100.01 gain 77 128 -103.18 gain 128 77 -106.96 gain 77 129 -103.24 gain 129 77 -104.25 gain 77 130 -106.29 gain 130 77 -109.47 gain 77 131 -102.84 gain 131 77 -104.38 gain 77 132 -105.61 gain 132 77 -103.43 gain 77 133 -104.55 gain 133 77 -106.79 gain 77 134 -101.48 gain 134 77 -101.72 gain 77 135 -95.67 gain 135 77 -91.50 gain 77 136 -87.25 gain 136 77 -91.86 gain 77 137 -88.99 gain 137 77 -90.25 gain 77 138 -91.97 gain 138 77 -95.24 gain 77 139 -94.95 gain 139 77 -99.93 gain 77 140 -88.93 gain 140 77 -93.72 gain 77 141 -98.72 gain 141 77 -99.20 gain 77 142 -93.37 gain 142 77 -95.00 gain 77 143 -102.23 gain 143 77 -106.31 gain 77 144 -102.78 gain 144 77 -102.76 gain 77 145 -94.50 gain 145 77 -99.04 gain 77 146 -110.37 gain 146 77 -111.35 gain 77 147 -107.69 gain 147 77 -109.85 gain 77 148 -102.35 gain 148 77 -105.04 gain 77 149 -112.09 gain 149 77 -111.15 gain 77 150 -90.22 gain 150 77 -92.68 gain 77 151 -94.66 gain 151 77 -99.59 gain 77 152 -96.57 gain 152 77 -99.86 gain 77 153 -90.86 gain 153 77 -93.85 gain 77 154 -93.72 gain 154 77 -97.84 gain 77 155 -101.02 gain 155 77 -102.44 gain 77 156 -98.46 gain 156 77 -101.00 gain 77 157 -94.87 gain 157 77 -98.70 gain 77 158 -99.60 gain 158 77 -105.40 gain 77 159 -100.73 gain 159 77 -100.57 gain 77 160 -101.96 gain 160 77 -103.18 gain 77 161 -95.75 gain 161 77 -98.03 gain 77 162 -96.05 gain 162 77 -97.95 gain 77 163 -104.78 gain 163 77 -104.11 gain 77 164 -101.86 gain 164 77 -108.41 gain 77 165 -94.76 gain 165 77 -98.67 gain 77 166 -92.44 gain 166 77 -98.01 gain 77 167 -98.35 gain 167 77 -102.74 gain 77 168 -100.64 gain 168 77 -104.09 gain 77 169 -91.99 gain 169 77 -91.96 gain 77 170 -93.30 gain 170 77 -94.21 gain 77 171 -98.69 gain 171 77 -100.17 gain 77 172 -91.06 gain 172 77 -95.33 gain 77 173 -103.74 gain 173 77 -102.34 gain 77 174 -100.53 gain 174 77 -105.08 gain 77 175 -99.22 gain 175 77 -95.57 gain 77 176 -100.99 gain 176 77 -101.56 gain 77 177 -105.22 gain 177 77 -108.15 gain 77 178 -112.35 gain 178 77 -112.89 gain 77 179 -112.36 gain 179 77 -115.95 gain 77 180 -100.60 gain 180 77 -102.92 gain 77 181 -94.53 gain 181 77 -100.25 gain 77 182 -94.30 gain 182 77 -96.16 gain 77 183 -103.75 gain 183 77 -101.49 gain 77 184 -99.40 gain 184 77 -103.37 gain 77 185 -102.10 gain 185 77 -104.57 gain 77 186 -97.92 gain 186 77 -101.09 gain 77 187 -100.76 gain 187 77 -103.95 gain 77 188 -105.18 gain 188 77 -112.82 gain 77 189 -97.74 gain 189 77 -101.43 gain 77 190 -104.79 gain 190 77 -101.32 gain 77 191 -106.82 gain 191 77 -106.52 gain 77 192 -106.64 gain 192 77 -110.01 gain 77 193 -110.81 gain 193 77 -110.20 gain 77 194 -105.77 gain 194 77 -105.06 gain 77 195 -93.59 gain 195 77 -90.84 gain 77 196 -104.06 gain 196 77 -108.99 gain 77 197 -100.43 gain 197 77 -102.84 gain 77 198 -99.51 gain 198 77 -104.57 gain 77 199 -102.89 gain 199 77 -101.97 gain 77 200 -106.17 gain 200 77 -107.16 gain 77 201 -99.55 gain 201 77 -103.63 gain 77 202 -103.38 gain 202 77 -105.76 gain 77 203 -106.58 gain 203 77 -109.06 gain 77 204 -104.74 gain 204 77 -105.44 gain 77 205 -108.34 gain 205 77 -108.70 gain 77 206 -106.89 gain 206 77 -108.58 gain 77 207 -108.10 gain 207 77 -107.53 gain 77 208 -104.89 gain 208 77 -107.62 gain 77 209 -112.59 gain 209 77 -114.36 gain 77 210 -104.65 gain 210 77 -110.43 gain 77 211 -96.93 gain 211 77 -100.10 gain 77 212 -96.75 gain 212 77 -98.46 gain 77 213 -108.57 gain 213 77 -113.02 gain 77 214 -97.52 gain 214 77 -100.15 gain 77 215 -100.82 gain 215 77 -105.26 gain 77 216 -99.57 gain 216 77 -100.91 gain 77 217 -105.46 gain 217 77 -111.25 gain 77 218 -102.06 gain 218 77 -109.17 gain 77 219 -104.75 gain 219 77 -109.43 gain 77 220 -102.97 gain 220 77 -104.76 gain 77 221 -108.01 gain 221 77 -110.80 gain 77 222 -109.44 gain 222 77 -108.81 gain 77 223 -110.03 gain 223 77 -111.68 gain 77 224 -106.91 gain 224 77 -105.50 gain 78 79 -74.76 gain 79 78 -69.30 gain 78 80 -87.73 gain 80 78 -80.61 gain 78 81 -93.19 gain 81 78 -90.34 gain 78 82 -97.56 gain 82 78 -93.86 gain 78 83 -108.25 gain 83 78 -104.13 gain 78 84 -108.07 gain 84 78 -101.04 gain 78 85 -107.98 gain 85 78 -105.52 gain 78 86 -104.84 gain 86 78 -95.56 gain 78 87 -108.07 gain 87 78 -101.60 gain 78 88 -114.59 gain 88 78 -108.40 gain 78 89 -112.49 gain 89 78 -106.93 gain 78 90 -94.22 gain 90 78 -92.20 gain 78 91 -97.93 gain 91 78 -91.50 gain 78 92 -82.15 gain 92 78 -79.28 gain 78 93 -80.86 gain 93 78 -71.90 gain 78 94 -82.88 gain 94 78 -76.36 gain 78 95 -89.15 gain 95 78 -85.67 gain 78 96 -88.96 gain 96 78 -81.75 gain 78 97 -102.79 gain 97 78 -96.86 gain 78 98 -101.89 gain 98 78 -93.13 gain 78 99 -101.66 gain 99 78 -97.00 gain 78 100 -111.45 gain 100 78 -104.63 gain 78 101 -112.12 gain 101 78 -103.95 gain 78 102 -110.61 gain 102 78 -103.11 gain 78 103 -106.34 gain 103 78 -98.07 gain 78 104 -122.24 gain 104 78 -110.40 gain 78 105 -96.90 gain 105 78 -90.46 gain 78 106 -89.84 gain 106 78 -82.71 gain 78 107 -91.77 gain 107 78 -87.65 gain 78 108 -91.40 gain 108 78 -85.34 gain 78 109 -95.69 gain 109 78 -86.47 gain 78 110 -91.98 gain 110 78 -85.01 gain 78 111 -99.91 gain 111 78 -90.13 gain 78 112 -107.82 gain 112 78 -100.05 gain 78 113 -99.79 gain 113 78 -98.96 gain 78 114 -100.65 gain 114 78 -95.44 gain 78 115 -114.15 gain 115 78 -109.80 gain 78 116 -115.58 gain 116 78 -107.26 gain 78 117 -109.10 gain 117 78 -100.62 gain 78 118 -117.57 gain 118 78 -117.27 gain 78 119 -119.61 gain 119 78 -110.86 gain 78 120 -100.15 gain 120 78 -91.50 gain 78 121 -102.84 gain 121 78 -96.93 gain 78 122 -98.59 gain 122 78 -95.25 gain 78 123 -95.73 gain 123 78 -92.66 gain 78 124 -97.64 gain 124 78 -88.16 gain 78 125 -93.00 gain 125 78 -85.46 gain 78 126 -101.54 gain 126 78 -98.88 gain 78 127 -108.01 gain 127 78 -100.11 gain 78 128 -107.06 gain 128 78 -102.21 gain 78 129 -105.50 gain 129 78 -97.87 gain 78 130 -104.56 gain 130 78 -99.11 gain 78 131 -107.89 gain 131 78 -100.79 gain 78 132 -115.47 gain 132 78 -104.65 gain 78 133 -114.17 gain 133 78 -107.78 gain 78 134 -112.10 gain 134 78 -103.71 gain 78 135 -103.81 gain 135 78 -91.00 gain 78 136 -101.84 gain 136 78 -97.80 gain 78 137 -96.69 gain 137 78 -89.32 gain 78 138 -96.42 gain 138 78 -91.06 gain 78 139 -96.03 gain 139 78 -92.38 gain 78 140 -92.14 gain 140 78 -88.30 gain 78 141 -103.01 gain 141 78 -94.86 gain 78 142 -104.52 gain 142 78 -97.52 gain 78 143 -105.87 gain 143 78 -101.31 gain 78 144 -103.21 gain 144 78 -94.56 gain 78 145 -111.43 gain 145 78 -107.32 gain 78 146 -109.01 gain 146 78 -101.35 gain 78 147 -109.58 gain 147 78 -103.12 gain 78 148 -110.31 gain 148 78 -104.37 gain 78 149 -113.62 gain 149 78 -104.05 gain 78 150 -106.47 gain 150 78 -100.29 gain 78 151 -100.27 gain 151 78 -96.56 gain 78 152 -103.05 gain 152 78 -97.70 gain 78 153 -101.63 gain 153 78 -95.98 gain 78 154 -102.64 gain 154 78 -98.12 gain 78 155 -110.28 gain 155 78 -103.06 gain 78 156 -110.08 gain 156 78 -103.98 gain 78 157 -105.58 gain 157 78 -100.78 gain 78 158 -105.64 gain 158 78 -102.82 gain 78 159 -107.84 gain 159 78 -99.05 gain 78 160 -107.92 gain 160 78 -100.51 gain 78 161 -107.99 gain 161 78 -101.63 gain 78 162 -116.33 gain 162 78 -109.60 gain 78 163 -119.20 gain 163 78 -109.89 gain 78 164 -113.10 gain 164 78 -111.02 gain 78 165 -113.93 gain 165 78 -109.20 gain 78 166 -116.50 gain 166 78 -113.43 gain 78 167 -102.50 gain 167 78 -98.26 gain 78 168 -102.05 gain 168 78 -96.87 gain 78 169 -104.09 gain 169 78 -95.42 gain 78 170 -100.17 gain 170 78 -92.44 gain 78 171 -109.55 gain 171 78 -102.40 gain 78 172 -106.56 gain 172 78 -102.21 gain 78 173 -105.57 gain 173 78 -95.53 gain 78 174 -113.60 gain 174 78 -109.52 gain 78 175 -104.60 gain 175 78 -92.31 gain 78 176 -108.83 gain 176 78 -100.77 gain 78 177 -119.80 gain 177 78 -114.10 gain 78 178 -116.29 gain 178 78 -108.20 gain 78 179 -107.17 gain 179 78 -102.12 gain 78 180 -113.99 gain 180 78 -107.68 gain 78 181 -109.57 gain 181 78 -106.66 gain 78 182 -105.77 gain 182 78 -98.99 gain 78 183 -106.54 gain 183 78 -95.65 gain 78 184 -105.65 gain 184 78 -100.99 gain 78 185 -112.49 gain 185 78 -106.32 gain 78 186 -100.90 gain 186 78 -95.43 gain 78 187 -115.11 gain 187 78 -109.67 gain 78 188 -118.30 gain 188 78 -117.31 gain 78 189 -109.36 gain 189 78 -104.42 gain 78 190 -111.76 gain 190 78 -99.65 gain 78 191 -108.60 gain 191 78 -99.67 gain 78 192 -118.81 gain 192 78 -113.54 gain 78 193 -113.67 gain 193 78 -104.43 gain 78 194 -119.89 gain 194 78 -110.54 gain 78 195 -101.62 gain 195 78 -90.24 gain 78 196 -108.21 gain 196 78 -104.50 gain 78 197 -110.31 gain 197 78 -104.09 gain 78 198 -112.60 gain 198 78 -109.03 gain 78 199 -114.83 gain 199 78 -105.28 gain 78 200 -107.71 gain 200 78 -100.06 gain 78 201 -116.82 gain 201 78 -112.27 gain 78 202 -117.49 gain 202 78 -111.23 gain 78 203 -112.34 gain 203 78 -106.18 gain 78 204 -115.93 gain 204 78 -108.00 gain 78 205 -111.77 gain 205 78 -103.50 gain 78 206 -115.46 gain 206 78 -108.52 gain 78 207 -103.79 gain 207 78 -94.58 gain 78 208 -99.47 gain 208 78 -93.57 gain 78 209 -112.28 gain 209 78 -105.41 gain 78 210 -115.41 gain 210 78 -112.55 gain 78 211 -114.09 gain 211 78 -108.62 gain 78 212 -110.94 gain 212 78 -104.02 gain 78 213 -118.43 gain 213 78 -114.25 gain 78 214 -111.92 gain 214 78 -105.92 gain 78 215 -115.52 gain 215 78 -111.33 gain 78 216 -114.09 gain 216 78 -106.80 gain 78 217 -108.15 gain 217 78 -105.30 gain 78 218 -111.54 gain 218 78 -110.01 gain 78 219 -113.75 gain 219 78 -109.80 gain 78 220 -110.25 gain 220 78 -103.41 gain 78 221 -118.52 gain 221 78 -112.67 gain 78 222 -113.93 gain 222 78 -104.66 gain 78 223 -121.40 gain 223 78 -114.42 gain 78 224 -115.15 gain 224 78 -105.10 gain 79 80 -69.61 gain 80 79 -67.94 gain 79 81 -85.85 gain 81 79 -88.45 gain 79 82 -88.05 gain 82 79 -89.82 gain 79 83 -95.17 gain 83 79 -96.51 gain 79 84 -85.68 gain 84 79 -84.10 gain 79 85 -101.72 gain 85 79 -104.72 gain 79 86 -102.96 gain 86 79 -99.14 gain 79 87 -102.68 gain 87 79 -101.66 gain 79 88 -102.75 gain 88 79 -102.02 gain 79 89 -111.71 gain 89 79 -111.61 gain 79 90 -91.22 gain 90 79 -94.66 gain 79 91 -96.71 gain 91 79 -95.73 gain 79 92 -96.45 gain 92 79 -99.04 gain 79 93 -83.11 gain 93 79 -79.62 gain 79 94 -76.19 gain 94 79 -75.13 gain 79 95 -80.20 gain 95 79 -82.18 gain 79 96 -80.37 gain 96 79 -78.62 gain 79 97 -95.22 gain 97 79 -94.74 gain 79 98 -96.45 gain 98 79 -93.15 gain 79 99 -95.56 gain 99 79 -96.36 gain 79 100 -100.96 gain 100 79 -99.60 gain 79 101 -102.22 gain 101 79 -99.52 gain 79 102 -108.33 gain 102 79 -106.29 gain 79 103 -109.80 gain 103 79 -106.99 gain 79 104 -103.58 gain 104 79 -97.20 gain 79 105 -94.25 gain 105 79 -93.27 gain 79 106 -89.53 gain 106 79 -87.85 gain 79 107 -88.87 gain 107 79 -90.21 gain 79 108 -81.25 gain 108 79 -80.66 gain 79 109 -93.18 gain 109 79 -89.43 gain 79 110 -82.99 gain 110 79 -81.47 gain 79 111 -90.89 gain 111 79 -86.58 gain 79 112 -96.72 gain 112 79 -94.41 gain 79 113 -91.21 gain 113 79 -95.83 gain 79 114 -99.49 gain 114 79 -99.74 gain 79 115 -103.75 gain 115 79 -104.86 gain 79 116 -104.65 gain 116 79 -101.79 gain 79 117 -97.72 gain 117 79 -94.70 gain 79 118 -104.90 gain 118 79 -110.06 gain 79 119 -103.53 gain 119 79 -100.24 gain 79 120 -101.89 gain 120 79 -98.69 gain 79 121 -92.56 gain 121 79 -92.12 gain 79 122 -92.36 gain 122 79 -94.48 gain 79 123 -91.33 gain 123 79 -93.71 gain 79 124 -83.86 gain 124 79 -79.85 gain 79 125 -92.24 gain 125 79 -90.16 gain 79 126 -91.22 gain 126 79 -94.02 gain 79 127 -96.51 gain 127 79 -94.06 gain 79 128 -95.96 gain 128 79 -96.57 gain 79 129 -97.68 gain 129 79 -95.51 gain 79 130 -100.94 gain 130 79 -100.94 gain 79 131 -114.52 gain 131 79 -112.88 gain 79 132 -104.66 gain 132 79 -99.30 gain 79 133 -106.94 gain 133 79 -106.01 gain 79 134 -107.76 gain 134 79 -104.83 gain 79 135 -100.39 gain 135 79 -93.04 gain 79 136 -89.26 gain 136 79 -90.69 gain 79 137 -98.91 gain 137 79 -97.00 gain 79 138 -94.76 gain 138 79 -94.86 gain 79 139 -86.79 gain 139 79 -88.59 gain 79 140 -99.24 gain 140 79 -100.86 gain 79 141 -100.69 gain 141 79 -97.99 gain 79 142 -95.97 gain 142 79 -94.43 gain 79 143 -97.16 gain 143 79 -98.06 gain 79 144 -100.67 gain 144 79 -97.48 gain 79 145 -105.64 gain 145 79 -107.00 gain 79 146 -113.30 gain 146 79 -111.10 gain 79 147 -107.16 gain 147 79 -106.15 gain 79 148 -106.15 gain 148 79 -105.67 gain 79 149 -106.66 gain 149 79 -102.55 gain 79 150 -97.10 gain 150 79 -96.38 gain 79 151 -95.64 gain 151 79 -97.40 gain 79 152 -94.48 gain 152 79 -94.60 gain 79 153 -102.93 gain 153 79 -102.74 gain 79 154 -96.06 gain 154 79 -97.01 gain 79 155 -93.05 gain 155 79 -91.29 gain 79 156 -100.03 gain 156 79 -99.40 gain 79 157 -102.62 gain 157 79 -103.28 gain 79 158 -106.16 gain 158 79 -108.79 gain 79 159 -95.71 gain 159 79 -92.38 gain 79 160 -105.67 gain 160 79 -103.72 gain 79 161 -101.27 gain 161 79 -100.37 gain 79 162 -103.41 gain 162 79 -102.14 gain 79 163 -99.12 gain 163 79 -95.27 gain 79 164 -113.92 gain 164 79 -117.30 gain 79 165 -96.10 gain 165 79 -96.83 gain 79 166 -105.71 gain 166 79 -108.10 gain 79 167 -98.38 gain 167 79 -99.59 gain 79 168 -104.07 gain 168 79 -104.35 gain 79 169 -96.41 gain 169 79 -93.20 gain 79 170 -93.18 gain 170 79 -90.91 gain 79 171 -100.44 gain 171 79 -98.74 gain 79 172 -107.05 gain 172 79 -108.14 gain 79 173 -100.85 gain 173 79 -96.27 gain 79 174 -104.39 gain 174 79 -105.76 gain 79 175 -96.54 gain 175 79 -89.71 gain 79 176 -107.52 gain 176 79 -104.92 gain 79 177 -105.41 gain 177 79 -105.17 gain 79 178 -111.48 gain 178 79 -108.84 gain 79 179 -108.22 gain 179 79 -108.63 gain 79 180 -110.87 gain 180 79 -110.02 gain 79 181 -106.40 gain 181 79 -108.94 gain 79 182 -104.39 gain 182 79 -103.07 gain 79 183 -101.77 gain 183 79 -96.33 gain 79 184 -102.32 gain 184 79 -103.12 gain 79 185 -104.09 gain 185 79 -103.38 gain 79 186 -103.07 gain 186 79 -103.06 gain 79 187 -104.11 gain 187 79 -104.13 gain 79 188 -102.92 gain 188 79 -107.38 gain 79 189 -102.56 gain 189 79 -103.08 gain 79 190 -107.25 gain 190 79 -100.60 gain 79 191 -105.76 gain 191 79 -102.28 gain 79 192 -106.23 gain 192 79 -106.43 gain 79 193 -107.89 gain 193 79 -104.11 gain 79 194 -107.95 gain 194 79 -104.05 gain 79 195 -102.45 gain 195 79 -96.53 gain 79 196 -100.99 gain 196 79 -102.74 gain 79 197 -100.21 gain 197 79 -99.45 gain 79 198 -105.09 gain 198 79 -106.97 gain 79 199 -114.25 gain 199 79 -110.15 gain 79 200 -98.66 gain 200 79 -96.48 gain 79 201 -103.73 gain 201 79 -104.64 gain 79 202 -100.75 gain 202 79 -99.95 gain 79 203 -107.95 gain 203 79 -107.25 gain 79 204 -112.84 gain 204 79 -110.36 gain 79 205 -109.42 gain 205 79 -106.61 gain 79 206 -100.25 gain 206 79 -98.76 gain 79 207 -111.96 gain 207 79 -108.21 gain 79 208 -107.18 gain 208 79 -106.73 gain 79 209 -110.34 gain 209 79 -108.93 gain 79 210 -109.65 gain 210 79 -112.25 gain 79 211 -105.86 gain 211 79 -105.85 gain 79 212 -109.40 gain 212 79 -107.93 gain 79 213 -107.11 gain 213 79 -108.39 gain 79 214 -102.11 gain 214 79 -101.57 gain 79 215 -106.15 gain 215 79 -107.43 gain 79 216 -104.98 gain 216 79 -103.14 gain 79 217 -111.28 gain 217 79 -113.89 gain 79 218 -108.06 gain 218 79 -112.00 gain 79 219 -105.75 gain 219 79 -107.26 gain 79 220 -116.25 gain 220 79 -114.88 gain 79 221 -115.23 gain 221 79 -114.84 gain 79 222 -105.97 gain 222 79 -102.16 gain 79 223 -108.23 gain 223 79 -106.71 gain 79 224 -111.41 gain 224 79 -106.82 gain 80 81 -77.60 gain 81 80 -81.88 gain 80 82 -87.38 gain 82 80 -90.82 gain 80 83 -93.16 gain 83 80 -96.17 gain 80 84 -86.85 gain 84 80 -86.94 gain 80 85 -106.16 gain 85 80 -110.83 gain 80 86 -94.11 gain 86 80 -91.97 gain 80 87 -104.79 gain 87 80 -105.45 gain 80 88 -97.65 gain 88 80 -98.58 gain 80 89 -99.66 gain 89 80 -101.23 gain 80 90 -100.62 gain 90 80 -105.72 gain 80 91 -90.68 gain 91 80 -91.37 gain 80 92 -92.79 gain 92 80 -97.05 gain 80 93 -81.66 gain 93 80 -79.84 gain 80 94 -75.78 gain 94 80 -76.39 gain 80 95 -79.19 gain 95 80 -82.84 gain 80 96 -83.62 gain 96 80 -83.54 gain 80 97 -91.58 gain 97 80 -92.77 gain 80 98 -97.23 gain 98 80 -95.60 gain 80 99 -96.98 gain 99 80 -99.44 gain 80 100 -92.93 gain 100 80 -93.23 gain 80 101 -103.01 gain 101 80 -101.97 gain 80 102 -101.99 gain 102 80 -101.61 gain 80 103 -103.88 gain 103 80 -102.73 gain 80 104 -93.47 gain 104 80 -88.76 gain 80 105 -94.76 gain 105 80 -95.45 gain 80 106 -99.52 gain 106 80 -99.51 gain 80 107 -95.39 gain 107 80 -98.40 gain 80 108 -89.08 gain 108 80 -90.16 gain 80 109 -82.56 gain 109 80 -80.47 gain 80 110 -79.42 gain 110 80 -79.58 gain 80 111 -87.44 gain 111 80 -84.79 gain 80 112 -91.21 gain 112 80 -90.57 gain 80 113 -97.15 gain 113 80 -103.44 gain 80 114 -92.80 gain 114 80 -94.73 gain 80 115 -98.92 gain 115 80 -101.71 gain 80 116 -90.99 gain 116 80 -89.80 gain 80 117 -94.03 gain 117 80 -92.68 gain 80 118 -108.27 gain 118 80 -115.09 gain 80 119 -110.04 gain 119 80 -108.41 gain 80 120 -96.93 gain 120 80 -95.40 gain 80 121 -91.37 gain 121 80 -92.59 gain 80 122 -90.95 gain 122 80 -94.74 gain 80 123 -93.94 gain 123 80 -97.99 gain 80 124 -94.04 gain 124 80 -91.70 gain 80 125 -92.73 gain 125 80 -92.31 gain 80 126 -91.46 gain 126 80 -95.93 gain 80 127 -88.10 gain 127 80 -87.32 gain 80 128 -87.51 gain 128 80 -89.79 gain 80 129 -104.43 gain 129 80 -103.92 gain 80 130 -107.61 gain 130 80 -109.28 gain 80 131 -100.16 gain 131 80 -100.19 gain 80 132 -105.70 gain 132 80 -102.01 gain 80 133 -107.55 gain 133 80 -108.28 gain 80 134 -109.42 gain 134 80 -108.15 gain 80 135 -90.24 gain 135 80 -84.56 gain 80 136 -98.24 gain 136 80 -101.34 gain 80 137 -95.31 gain 137 80 -95.07 gain 80 138 -98.04 gain 138 80 -99.81 gain 80 139 -88.84 gain 139 80 -92.31 gain 80 140 -93.51 gain 140 80 -96.80 gain 80 141 -99.06 gain 141 80 -98.03 gain 80 142 -96.13 gain 142 80 -96.25 gain 80 143 -92.79 gain 143 80 -95.36 gain 80 144 -94.64 gain 144 80 -93.11 gain 80 145 -101.86 gain 145 80 -104.89 gain 80 146 -100.79 gain 146 80 -100.26 gain 80 147 -102.10 gain 147 80 -102.76 gain 80 148 -100.50 gain 148 80 -101.69 gain 80 149 -102.62 gain 149 80 -100.18 gain 80 150 -100.18 gain 150 80 -101.12 gain 80 151 -95.06 gain 151 80 -98.49 gain 80 152 -99.22 gain 152 80 -101.01 gain 80 153 -92.67 gain 153 80 -94.15 gain 80 154 -92.21 gain 154 80 -94.82 gain 80 155 -93.59 gain 155 80 -93.49 gain 80 156 -90.14 gain 156 80 -91.17 gain 80 157 -94.57 gain 157 80 -96.90 gain 80 158 -98.73 gain 158 80 -103.03 gain 80 159 -103.60 gain 159 80 -101.93 gain 80 160 -107.13 gain 160 80 -106.84 gain 80 161 -102.96 gain 161 80 -103.72 gain 80 162 -104.91 gain 162 80 -105.31 gain 80 163 -105.67 gain 163 80 -103.49 gain 80 164 -102.88 gain 164 80 -107.93 gain 80 165 -104.00 gain 165 80 -106.40 gain 80 166 -99.20 gain 166 80 -103.25 gain 80 167 -95.37 gain 167 80 -98.25 gain 80 168 -97.39 gain 168 80 -99.34 gain 80 169 -97.14 gain 169 80 -95.60 gain 80 170 -96.94 gain 170 80 -96.34 gain 80 171 -103.95 gain 171 80 -103.92 gain 80 172 -100.27 gain 172 80 -103.04 gain 80 173 -106.42 gain 173 80 -103.51 gain 80 174 -102.73 gain 174 80 -105.78 gain 80 175 -101.34 gain 175 80 -96.18 gain 80 176 -97.97 gain 176 80 -97.04 gain 80 177 -109.80 gain 177 80 -111.23 gain 80 178 -104.93 gain 178 80 -103.96 gain 80 179 -107.35 gain 179 80 -109.42 gain 80 180 -108.99 gain 180 80 -109.80 gain 80 181 -97.96 gain 181 80 -102.18 gain 80 182 -101.28 gain 182 80 -101.63 gain 80 183 -104.14 gain 183 80 -100.37 gain 80 184 -101.08 gain 184 80 -103.54 gain 80 185 -97.32 gain 185 80 -98.29 gain 80 186 -100.10 gain 186 80 -101.76 gain 80 187 -94.82 gain 187 80 -96.51 gain 80 188 -97.61 gain 188 80 -103.73 gain 80 189 -102.06 gain 189 80 -104.25 gain 80 190 -106.61 gain 190 80 -101.63 gain 80 191 -104.09 gain 191 80 -102.28 gain 80 192 -103.78 gain 192 80 -105.65 gain 80 193 -110.64 gain 193 80 -108.53 gain 80 194 -108.79 gain 194 80 -106.57 gain 80 195 -107.20 gain 195 80 -102.95 gain 80 196 -107.20 gain 196 80 -110.62 gain 80 197 -103.60 gain 197 80 -104.51 gain 80 198 -112.99 gain 198 80 -116.54 gain 80 199 -90.77 gain 199 80 -88.34 gain 80 200 -100.20 gain 200 80 -99.69 gain 80 201 -104.84 gain 201 80 -107.41 gain 80 202 -107.97 gain 202 80 -108.84 gain 80 203 -104.40 gain 203 80 -105.37 gain 80 204 -107.87 gain 204 80 -107.06 gain 80 205 -103.82 gain 205 80 -102.68 gain 80 206 -102.85 gain 206 80 -103.03 gain 80 207 -105.20 gain 207 80 -103.12 gain 80 208 -115.14 gain 208 80 -116.36 gain 80 209 -111.23 gain 209 80 -111.50 gain 80 210 -105.41 gain 210 80 -109.67 gain 80 211 -106.99 gain 211 80 -108.65 gain 80 212 -97.72 gain 212 80 -97.92 gain 80 213 -107.85 gain 213 80 -110.79 gain 80 214 -108.20 gain 214 80 -109.33 gain 80 215 -103.00 gain 215 80 -105.94 gain 80 216 -101.84 gain 216 80 -101.67 gain 80 217 -95.61 gain 217 80 -99.90 gain 80 218 -100.42 gain 218 80 -106.02 gain 80 219 -107.99 gain 219 80 -111.16 gain 80 220 -110.44 gain 220 80 -110.73 gain 80 221 -109.35 gain 221 80 -110.63 gain 80 222 -105.18 gain 222 80 -103.04 gain 80 223 -105.06 gain 223 80 -105.20 gain 80 224 -113.90 gain 224 80 -110.98 gain 81 82 -76.97 gain 82 81 -76.13 gain 81 83 -86.71 gain 83 81 -85.45 gain 81 84 -92.12 gain 84 81 -87.93 gain 81 85 -106.59 gain 85 81 -106.99 gain 81 86 -104.08 gain 86 81 -97.66 gain 81 87 -98.52 gain 87 81 -94.90 gain 81 88 -103.63 gain 88 81 -100.29 gain 81 89 -109.82 gain 89 81 -107.12 gain 81 90 -102.75 gain 90 81 -103.58 gain 81 91 -99.37 gain 91 81 -95.79 gain 81 92 -97.34 gain 92 81 -97.33 gain 81 93 -96.60 gain 93 81 -90.50 gain 81 94 -92.76 gain 94 81 -89.09 gain 81 95 -83.64 gain 95 81 -83.01 gain 81 96 -75.51 gain 96 81 -71.15 gain 81 97 -84.24 gain 97 81 -81.16 gain 81 98 -86.77 gain 98 81 -80.87 gain 81 99 -87.39 gain 99 81 -85.58 gain 81 100 -94.06 gain 100 81 -90.09 gain 81 101 -97.16 gain 101 81 -91.86 gain 81 102 -99.99 gain 102 81 -95.35 gain 81 103 -99.12 gain 103 81 -93.71 gain 81 104 -103.42 gain 104 81 -94.43 gain 81 105 -101.07 gain 105 81 -97.49 gain 81 106 -96.16 gain 106 81 -91.88 gain 81 107 -100.55 gain 107 81 -99.29 gain 81 108 -94.84 gain 108 81 -91.64 gain 81 109 -90.22 gain 109 81 -83.87 gain 81 110 -94.32 gain 110 81 -90.21 gain 81 111 -87.02 gain 111 81 -80.10 gain 81 112 -90.81 gain 112 81 -85.90 gain 81 113 -96.27 gain 113 81 -98.29 gain 81 114 -94.64 gain 114 81 -92.30 gain 81 115 -103.25 gain 115 81 -101.76 gain 81 116 -98.39 gain 116 81 -92.92 gain 81 117 -98.14 gain 117 81 -92.51 gain 81 118 -96.03 gain 118 81 -98.58 gain 81 119 -105.76 gain 119 81 -99.87 gain 81 120 -106.84 gain 120 81 -101.04 gain 81 121 -98.29 gain 121 81 -95.24 gain 81 122 -99.61 gain 122 81 -99.13 gain 81 123 -95.37 gain 123 81 -95.15 gain 81 124 -99.07 gain 124 81 -92.45 gain 81 125 -92.93 gain 125 81 -88.24 gain 81 126 -94.87 gain 126 81 -95.06 gain 81 127 -91.76 gain 127 81 -86.71 gain 81 128 -91.07 gain 128 81 -89.07 gain 81 129 -93.99 gain 129 81 -89.21 gain 81 130 -106.64 gain 130 81 -104.04 gain 81 131 -107.61 gain 131 81 -103.37 gain 81 132 -105.53 gain 132 81 -97.56 gain 81 133 -99.75 gain 133 81 -96.21 gain 81 134 -101.91 gain 134 81 -96.37 gain 81 135 -103.90 gain 135 81 -93.94 gain 81 136 -108.29 gain 136 81 -107.12 gain 81 137 -96.52 gain 137 81 -92.00 gain 81 138 -103.32 gain 138 81 -100.81 gain 81 139 -99.80 gain 139 81 -99.00 gain 81 140 -97.87 gain 140 81 -96.88 gain 81 141 -92.87 gain 141 81 -87.56 gain 81 142 -102.07 gain 142 81 -97.92 gain 81 143 -98.48 gain 143 81 -96.78 gain 81 144 -94.88 gain 144 81 -89.08 gain 81 145 -103.61 gain 145 81 -102.37 gain 81 146 -104.83 gain 146 81 -100.02 gain 81 147 -103.99 gain 147 81 -100.38 gain 81 148 -108.44 gain 148 81 -105.35 gain 81 149 -118.90 gain 149 81 -112.19 gain 81 150 -106.32 gain 150 81 -103.00 gain 81 151 -106.61 gain 151 81 -105.76 gain 81 152 -99.21 gain 152 81 -96.72 gain 81 153 -98.84 gain 153 81 -96.04 gain 81 154 -95.39 gain 154 81 -93.73 gain 81 155 -95.76 gain 155 81 -91.39 gain 81 156 -102.53 gain 156 81 -99.29 gain 81 157 -100.71 gain 157 81 -98.77 gain 81 158 -102.01 gain 158 81 -102.04 gain 81 159 -97.41 gain 159 81 -91.47 gain 81 160 -103.60 gain 160 81 -99.04 gain 81 161 -93.64 gain 161 81 -90.14 gain 81 162 -106.73 gain 162 81 -102.85 gain 81 163 -103.96 gain 163 81 -97.50 gain 81 164 -109.19 gain 164 81 -109.97 gain 81 165 -104.54 gain 165 81 -102.66 gain 81 166 -105.16 gain 166 81 -104.94 gain 81 167 -102.41 gain 167 81 -101.02 gain 81 168 -105.98 gain 168 81 -103.66 gain 81 169 -103.20 gain 169 81 -97.39 gain 81 170 -106.97 gain 170 81 -102.10 gain 81 171 -104.83 gain 171 81 -100.52 gain 81 172 -106.60 gain 172 81 -105.10 gain 81 173 -101.35 gain 173 81 -94.17 gain 81 174 -108.94 gain 174 81 -107.71 gain 81 175 -103.41 gain 175 81 -93.98 gain 81 176 -103.74 gain 176 81 -98.53 gain 81 177 -103.38 gain 177 81 -100.53 gain 81 178 -103.37 gain 178 81 -98.13 gain 81 179 -106.32 gain 179 81 -104.13 gain 81 180 -108.17 gain 180 81 -104.71 gain 81 181 -103.48 gain 181 81 -103.42 gain 81 182 -106.16 gain 182 81 -102.24 gain 81 183 -111.14 gain 183 81 -103.10 gain 81 184 -107.69 gain 184 81 -105.88 gain 81 185 -99.56 gain 185 81 -96.25 gain 81 186 -108.08 gain 186 81 -105.47 gain 81 187 -111.37 gain 187 81 -108.79 gain 81 188 -105.47 gain 188 81 -107.32 gain 81 189 -112.12 gain 189 81 -110.03 gain 81 190 -101.24 gain 190 81 -91.98 gain 81 191 -105.43 gain 191 81 -99.35 gain 81 192 -106.37 gain 192 81 -103.96 gain 81 193 -111.82 gain 193 81 -105.43 gain 81 194 -107.63 gain 194 81 -101.13 gain 81 195 -106.92 gain 195 81 -98.40 gain 81 196 -112.28 gain 196 81 -111.43 gain 81 197 -101.98 gain 197 81 -98.61 gain 81 198 -101.19 gain 198 81 -100.46 gain 81 199 -108.01 gain 199 81 -101.31 gain 81 200 -105.43 gain 200 81 -100.64 gain 81 201 -103.95 gain 201 81 -102.25 gain 81 202 -104.05 gain 202 81 -100.65 gain 81 203 -102.89 gain 203 81 -99.59 gain 81 204 -106.93 gain 204 81 -101.84 gain 81 205 -112.59 gain 205 81 -107.17 gain 81 206 -109.82 gain 206 81 -105.73 gain 81 207 -108.29 gain 207 81 -101.94 gain 81 208 -108.79 gain 208 81 -105.74 gain 81 209 -108.70 gain 209 81 -104.69 gain 81 210 -107.19 gain 210 81 -107.18 gain 81 211 -115.93 gain 211 81 -113.32 gain 81 212 -104.83 gain 212 81 -100.76 gain 81 213 -106.07 gain 213 81 -104.74 gain 81 214 -108.75 gain 214 81 -105.60 gain 81 215 -102.83 gain 215 81 -101.50 gain 81 216 -112.72 gain 216 81 -108.28 gain 81 217 -106.78 gain 217 81 -106.80 gain 81 218 -102.61 gain 218 81 -103.94 gain 81 219 -106.32 gain 219 81 -105.22 gain 81 220 -112.04 gain 220 81 -108.06 gain 81 221 -113.20 gain 221 81 -110.20 gain 81 222 -113.88 gain 222 81 -107.46 gain 81 223 -105.12 gain 223 81 -100.99 gain 81 224 -106.21 gain 224 81 -99.01 gain 82 83 -77.85 gain 83 82 -77.43 gain 82 84 -77.35 gain 84 82 -74.00 gain 82 85 -97.38 gain 85 82 -98.62 gain 82 86 -94.18 gain 86 82 -88.60 gain 82 87 -96.09 gain 87 82 -93.31 gain 82 88 -97.54 gain 88 82 -95.04 gain 82 89 -108.56 gain 89 82 -106.70 gain 82 90 -102.17 gain 90 82 -103.83 gain 82 91 -99.42 gain 91 82 -96.67 gain 82 92 -94.62 gain 92 82 -95.44 gain 82 93 -100.30 gain 93 82 -95.04 gain 82 94 -87.29 gain 94 82 -84.46 gain 82 95 -92.85 gain 95 82 -93.06 gain 82 96 -85.98 gain 96 82 -82.47 gain 82 97 -74.86 gain 97 82 -72.62 gain 82 98 -88.67 gain 98 82 -83.60 gain 82 99 -85.30 gain 99 82 -84.32 gain 82 100 -97.60 gain 100 82 -94.46 gain 82 101 -100.19 gain 101 82 -95.72 gain 82 102 -93.56 gain 102 82 -89.75 gain 82 103 -100.21 gain 103 82 -95.63 gain 82 104 -104.43 gain 104 82 -96.28 gain 82 105 -105.58 gain 105 82 -102.83 gain 82 106 -98.70 gain 106 82 -95.26 gain 82 107 -99.60 gain 107 82 -99.17 gain 82 108 -91.84 gain 108 82 -89.48 gain 82 109 -99.92 gain 109 82 -94.40 gain 82 110 -93.10 gain 110 82 -89.82 gain 82 111 -88.87 gain 111 82 -82.79 gain 82 112 -88.75 gain 112 82 -84.67 gain 82 113 -93.99 gain 113 82 -96.84 gain 82 114 -91.28 gain 114 82 -89.77 gain 82 115 -101.17 gain 115 82 -100.52 gain 82 116 -102.65 gain 116 82 -98.03 gain 82 117 -100.42 gain 117 82 -95.63 gain 82 118 -98.80 gain 118 82 -102.19 gain 82 119 -108.11 gain 119 82 -103.05 gain 82 120 -107.81 gain 120 82 -102.85 gain 82 121 -97.04 gain 121 82 -94.83 gain 82 122 -100.70 gain 122 82 -101.06 gain 82 123 -101.02 gain 123 82 -101.63 gain 82 124 -100.33 gain 124 82 -94.55 gain 82 125 -95.93 gain 125 82 -92.08 gain 82 126 -91.78 gain 126 82 -92.81 gain 82 127 -93.30 gain 127 82 -89.09 gain 82 128 -92.21 gain 128 82 -91.06 gain 82 129 -97.33 gain 129 82 -93.38 gain 82 130 -98.70 gain 130 82 -96.94 gain 82 131 -96.27 gain 131 82 -92.87 gain 82 132 -101.73 gain 132 82 -94.60 gain 82 133 -104.98 gain 133 82 -102.28 gain 82 134 -103.77 gain 134 82 -99.07 gain 82 135 -105.32 gain 135 82 -96.20 gain 82 136 -104.31 gain 136 82 -103.97 gain 82 137 -113.47 gain 137 82 -109.78 gain 82 138 -94.30 gain 138 82 -92.63 gain 82 139 -99.92 gain 139 82 -99.96 gain 82 140 -98.55 gain 140 82 -98.40 gain 82 141 -92.60 gain 141 82 -88.13 gain 82 142 -90.82 gain 142 82 -87.51 gain 82 143 -99.51 gain 143 82 -98.65 gain 82 144 -101.09 gain 144 82 -96.12 gain 82 145 -100.85 gain 145 82 -100.44 gain 82 146 -101.17 gain 146 82 -97.20 gain 82 147 -101.11 gain 147 82 -98.34 gain 82 148 -102.21 gain 148 82 -99.96 gain 82 149 -109.45 gain 149 82 -103.58 gain 82 150 -112.30 gain 150 82 -109.81 gain 82 151 -102.41 gain 151 82 -102.39 gain 82 152 -104.60 gain 152 82 -102.95 gain 82 153 -95.65 gain 153 82 -93.70 gain 82 154 -104.65 gain 154 82 -103.83 gain 82 155 -101.13 gain 155 82 -97.60 gain 82 156 -102.58 gain 156 82 -100.18 gain 82 157 -99.54 gain 157 82 -98.44 gain 82 158 -97.93 gain 158 82 -98.80 gain 82 159 -104.65 gain 159 82 -99.55 gain 82 160 -98.71 gain 160 82 -94.99 gain 82 161 -99.40 gain 161 82 -96.73 gain 82 162 -102.86 gain 162 82 -99.82 gain 82 163 -96.74 gain 163 82 -91.12 gain 82 164 -103.50 gain 164 82 -105.11 gain 82 165 -108.86 gain 165 82 -107.82 gain 82 166 -106.60 gain 166 82 -107.23 gain 82 167 -105.41 gain 167 82 -104.86 gain 82 168 -99.47 gain 168 82 -97.98 gain 82 169 -109.19 gain 169 82 -104.21 gain 82 170 -105.72 gain 170 82 -101.68 gain 82 171 -103.23 gain 171 82 -99.76 gain 82 172 -103.76 gain 172 82 -103.09 gain 82 173 -96.85 gain 173 82 -90.50 gain 82 174 -95.42 gain 174 82 -95.03 gain 82 175 -103.78 gain 175 82 -95.19 gain 82 176 -99.86 gain 176 82 -95.49 gain 82 177 -102.34 gain 177 82 -100.33 gain 82 178 -103.37 gain 178 82 -98.97 gain 82 179 -111.47 gain 179 82 -110.11 gain 82 180 -100.52 gain 180 82 -97.90 gain 82 181 -113.46 gain 181 82 -114.24 gain 82 182 -113.42 gain 182 82 -110.33 gain 82 183 -100.95 gain 183 82 -93.75 gain 82 184 -100.28 gain 184 82 -99.30 gain 82 185 -99.73 gain 185 82 -97.26 gain 82 186 -103.29 gain 186 82 -101.51 gain 82 187 -100.05 gain 187 82 -98.30 gain 82 188 -103.52 gain 188 82 -106.21 gain 82 189 -110.83 gain 189 82 -109.58 gain 82 190 -108.52 gain 190 82 -100.10 gain 82 191 -103.27 gain 191 82 -98.03 gain 82 192 -104.73 gain 192 82 -103.16 gain 82 193 -111.09 gain 193 82 -105.54 gain 82 194 -112.95 gain 194 82 -107.29 gain 82 195 -109.34 gain 195 82 -101.65 gain 82 196 -108.58 gain 196 82 -108.56 gain 82 197 -102.46 gain 197 82 -99.93 gain 82 198 -102.74 gain 198 82 -102.86 gain 82 199 -106.24 gain 199 82 -100.37 gain 82 200 -96.89 gain 200 82 -92.94 gain 82 201 -103.44 gain 201 82 -102.58 gain 82 202 -107.13 gain 202 82 -104.56 gain 82 203 -105.97 gain 203 82 -103.50 gain 82 204 -112.46 gain 204 82 -108.22 gain 82 205 -103.09 gain 205 82 -98.51 gain 82 206 -102.33 gain 206 82 -99.07 gain 82 207 -105.83 gain 207 82 -100.31 gain 82 208 -106.46 gain 208 82 -104.25 gain 82 209 -107.72 gain 209 82 -104.55 gain 82 210 -109.28 gain 210 82 -110.10 gain 82 211 -109.64 gain 211 82 -107.86 gain 82 212 -102.11 gain 212 82 -98.88 gain 82 213 -106.11 gain 213 82 -105.62 gain 82 214 -104.39 gain 214 82 -102.08 gain 82 215 -109.94 gain 215 82 -109.44 gain 82 216 -112.11 gain 216 82 -108.51 gain 82 217 -104.69 gain 217 82 -105.54 gain 82 218 -107.02 gain 218 82 -109.18 gain 82 219 -109.18 gain 219 82 -108.92 gain 82 220 -100.26 gain 220 82 -97.11 gain 82 221 -107.10 gain 221 82 -104.94 gain 82 222 -112.98 gain 222 82 -107.40 gain 82 223 -112.86 gain 223 82 -109.57 gain 82 224 -110.00 gain 224 82 -103.64 gain 83 84 -75.36 gain 84 83 -72.44 gain 83 85 -82.84 gain 85 83 -84.50 gain 83 86 -89.65 gain 86 83 -84.49 gain 83 87 -94.27 gain 87 83 -91.91 gain 83 88 -97.56 gain 88 83 -95.48 gain 83 89 -100.04 gain 89 83 -98.59 gain 83 90 -108.31 gain 90 83 -110.40 gain 83 91 -97.86 gain 91 83 -95.54 gain 83 92 -95.66 gain 92 83 -96.91 gain 83 93 -95.97 gain 93 83 -91.13 gain 83 94 -96.78 gain 94 83 -94.38 gain 83 95 -94.87 gain 95 83 -95.51 gain 83 96 -91.10 gain 96 83 -88.01 gain 83 97 -77.76 gain 97 83 -75.94 gain 83 98 -76.53 gain 98 83 -71.89 gain 83 99 -84.02 gain 99 83 -83.46 gain 83 100 -92.00 gain 100 83 -89.29 gain 83 101 -92.22 gain 101 83 -88.17 gain 83 102 -97.87 gain 102 83 -94.48 gain 83 103 -97.49 gain 103 83 -93.34 gain 83 104 -98.01 gain 104 83 -90.29 gain 83 105 -110.86 gain 105 83 -108.54 gain 83 106 -96.75 gain 106 83 -93.73 gain 83 107 -98.37 gain 107 83 -98.36 gain 83 108 -110.53 gain 108 83 -108.59 gain 83 109 -99.60 gain 109 83 -94.51 gain 83 110 -96.36 gain 110 83 -93.51 gain 83 111 -92.18 gain 111 83 -86.53 gain 83 112 -92.67 gain 112 83 -89.02 gain 83 113 -80.37 gain 113 83 -83.65 gain 83 114 -94.04 gain 114 83 -92.95 gain 83 115 -94.09 gain 115 83 -93.86 gain 83 116 -93.13 gain 116 83 -88.93 gain 83 117 -90.27 gain 117 83 -85.91 gain 83 118 -105.10 gain 118 83 -108.92 gain 83 119 -112.53 gain 119 83 -107.89 gain 83 120 -107.06 gain 120 83 -102.53 gain 83 121 -99.15 gain 121 83 -97.36 gain 83 122 -98.62 gain 122 83 -99.40 gain 83 123 -98.18 gain 123 83 -99.21 gain 83 124 -95.89 gain 124 83 -90.53 gain 83 125 -98.07 gain 125 83 -94.65 gain 83 126 -92.57 gain 126 83 -94.03 gain 83 127 -89.39 gain 127 83 -85.60 gain 83 128 -96.20 gain 128 83 -95.46 gain 83 129 -98.65 gain 129 83 -95.13 gain 83 130 -99.16 gain 130 83 -97.82 gain 83 131 -103.75 gain 131 83 -100.77 gain 83 132 -96.97 gain 132 83 -90.27 gain 83 133 -98.21 gain 133 83 -95.94 gain 83 134 -97.71 gain 134 83 -93.43 gain 83 135 -112.11 gain 135 83 -103.42 gain 83 136 -101.79 gain 136 83 -101.87 gain 83 137 -100.99 gain 137 83 -97.73 gain 83 138 -100.73 gain 138 83 -99.49 gain 83 139 -100.48 gain 139 83 -100.95 gain 83 140 -94.83 gain 140 83 -95.10 gain 83 141 -94.82 gain 141 83 -90.78 gain 83 142 -93.66 gain 142 83 -90.77 gain 83 143 -97.89 gain 143 83 -97.45 gain 83 144 -97.29 gain 144 83 -92.75 gain 83 145 -90.70 gain 145 83 -90.71 gain 83 146 -103.25 gain 146 83 -99.70 gain 83 147 -101.35 gain 147 83 -99.00 gain 83 148 -103.95 gain 148 83 -102.13 gain 83 149 -101.09 gain 149 83 -95.64 gain 83 150 -100.34 gain 150 83 -98.27 gain 83 151 -102.90 gain 151 83 -103.31 gain 83 152 -100.66 gain 152 83 -99.43 gain 83 153 -109.74 gain 153 83 -108.21 gain 83 154 -100.53 gain 154 83 -100.12 gain 83 155 -108.03 gain 155 83 -104.92 gain 83 156 -95.85 gain 156 83 -93.87 gain 83 157 -96.23 gain 157 83 -95.55 gain 83 158 -100.05 gain 158 83 -101.33 gain 83 159 -95.68 gain 159 83 -91.00 gain 83 160 -98.82 gain 160 83 -95.52 gain 83 161 -94.39 gain 161 83 -92.14 gain 83 162 -103.42 gain 162 83 -100.81 gain 83 163 -106.00 gain 163 83 -100.80 gain 83 164 -104.92 gain 164 83 -106.96 gain 83 165 -102.63 gain 165 83 -102.01 gain 83 166 -107.23 gain 166 83 -108.27 gain 83 167 -106.49 gain 167 83 -106.36 gain 83 168 -104.46 gain 168 83 -103.39 gain 83 169 -107.90 gain 169 83 -103.35 gain 83 170 -100.00 gain 170 83 -96.39 gain 83 171 -103.41 gain 171 83 -100.37 gain 83 172 -108.94 gain 172 83 -108.69 gain 83 173 -97.14 gain 173 83 -91.21 gain 83 174 -99.37 gain 174 83 -99.40 gain 83 175 -100.81 gain 175 83 -92.64 gain 83 176 -105.60 gain 176 83 -101.65 gain 83 177 -100.59 gain 177 83 -99.00 gain 83 178 -107.58 gain 178 83 -103.60 gain 83 179 -112.43 gain 179 83 -111.49 gain 83 180 -106.77 gain 180 83 -104.57 gain 83 181 -110.45 gain 181 83 -111.65 gain 83 182 -113.04 gain 182 83 -110.37 gain 83 183 -103.91 gain 183 83 -97.13 gain 83 184 -105.37 gain 184 83 -104.82 gain 83 185 -103.63 gain 185 83 -101.57 gain 83 186 -104.33 gain 186 83 -102.98 gain 83 187 -103.42 gain 187 83 -102.10 gain 83 188 -100.23 gain 188 83 -103.34 gain 83 189 -109.72 gain 189 83 -108.89 gain 83 190 -105.61 gain 190 83 -97.62 gain 83 191 -108.22 gain 191 83 -103.40 gain 83 192 -103.64 gain 192 83 -102.50 gain 83 193 -105.41 gain 193 83 -100.29 gain 83 194 -110.88 gain 194 83 -105.65 gain 83 195 -106.61 gain 195 83 -99.35 gain 83 196 -102.47 gain 196 83 -102.88 gain 83 197 -105.84 gain 197 83 -103.73 gain 83 198 -104.51 gain 198 83 -105.05 gain 83 199 -103.82 gain 199 83 -98.38 gain 83 200 -108.66 gain 200 83 -105.13 gain 83 201 -105.02 gain 201 83 -104.58 gain 83 202 -102.14 gain 202 83 -100.00 gain 83 203 -100.09 gain 203 83 -98.05 gain 83 204 -95.84 gain 204 83 -92.01 gain 83 205 -110.23 gain 205 83 -106.07 gain 83 206 -100.97 gain 206 83 -98.14 gain 83 207 -105.16 gain 207 83 -100.07 gain 83 208 -105.14 gain 208 83 -103.35 gain 83 209 -108.59 gain 209 83 -105.84 gain 83 210 -103.20 gain 210 83 -104.46 gain 83 211 -109.75 gain 211 83 -108.40 gain 83 212 -119.52 gain 212 83 -116.71 gain 83 213 -115.68 gain 213 83 -115.61 gain 83 214 -105.73 gain 214 83 -103.84 gain 83 215 -103.49 gain 215 83 -103.42 gain 83 216 -99.98 gain 216 83 -96.80 gain 83 217 -106.35 gain 217 83 -107.62 gain 83 218 -107.89 gain 218 83 -110.48 gain 83 219 -112.43 gain 219 83 -112.60 gain 83 220 -104.30 gain 220 83 -101.58 gain 83 221 -103.20 gain 221 83 -101.47 gain 83 222 -106.65 gain 222 83 -101.50 gain 83 223 -110.37 gain 223 83 -107.50 gain 83 224 -109.41 gain 224 83 -103.48 gain 84 85 -75.46 gain 85 84 -80.04 gain 84 86 -81.12 gain 86 84 -78.88 gain 84 87 -87.34 gain 87 84 -87.90 gain 84 88 -92.53 gain 88 84 -93.38 gain 84 89 -99.74 gain 89 84 -101.22 gain 84 90 -98.58 gain 90 84 -103.60 gain 84 91 -103.69 gain 91 84 -104.29 gain 84 92 -101.66 gain 92 84 -105.83 gain 84 93 -96.42 gain 93 84 -94.51 gain 84 94 -96.16 gain 94 84 -96.68 gain 84 95 -86.48 gain 95 84 -90.04 gain 84 96 -98.07 gain 96 84 -97.91 gain 84 97 -88.16 gain 97 84 -89.27 gain 84 98 -82.35 gain 98 84 -80.63 gain 84 99 -79.76 gain 99 84 -82.14 gain 84 100 -76.98 gain 100 84 -77.20 gain 84 101 -85.40 gain 101 84 -84.28 gain 84 102 -89.92 gain 102 84 -89.45 gain 84 103 -94.81 gain 103 84 -93.58 gain 84 104 -89.25 gain 104 84 -84.45 gain 84 105 -98.18 gain 105 84 -98.78 gain 84 106 -107.45 gain 106 84 -107.36 gain 84 107 -106.42 gain 107 84 -109.34 gain 84 108 -99.58 gain 108 84 -100.56 gain 84 109 -100.77 gain 109 84 -98.60 gain 84 110 -98.77 gain 110 84 -98.84 gain 84 111 -86.98 gain 111 84 -84.24 gain 84 112 -90.35 gain 112 84 -89.62 gain 84 113 -80.42 gain 113 84 -86.62 gain 84 114 -79.37 gain 114 84 -81.21 gain 84 115 -79.42 gain 115 84 -82.11 gain 84 116 -89.98 gain 116 84 -88.70 gain 84 117 -91.30 gain 117 84 -89.86 gain 84 118 -100.10 gain 118 84 -106.84 gain 84 119 -101.57 gain 119 84 -99.85 gain 84 120 -103.86 gain 120 84 -102.24 gain 84 121 -105.91 gain 121 84 -107.05 gain 84 122 -111.39 gain 122 84 -115.09 gain 84 123 -100.75 gain 123 84 -104.71 gain 84 124 -100.19 gain 124 84 -97.75 gain 84 125 -96.52 gain 125 84 -96.01 gain 84 126 -97.60 gain 126 84 -101.98 gain 84 127 -94.99 gain 127 84 -94.13 gain 84 128 -85.35 gain 128 84 -87.54 gain 84 129 -92.70 gain 129 84 -92.11 gain 84 130 -95.25 gain 130 84 -96.84 gain 84 131 -85.94 gain 131 84 -85.88 gain 84 132 -91.70 gain 132 84 -87.92 gain 84 133 -95.81 gain 133 84 -96.46 gain 84 134 -96.31 gain 134 84 -94.95 gain 84 135 -102.59 gain 135 84 -96.82 gain 84 136 -109.67 gain 136 84 -112.67 gain 84 137 -98.88 gain 137 84 -98.54 gain 84 138 -100.14 gain 138 84 -101.82 gain 84 139 -101.66 gain 139 84 -105.05 gain 84 140 -99.13 gain 140 84 -102.32 gain 84 141 -92.58 gain 141 84 -91.46 gain 84 142 -95.01 gain 142 84 -95.04 gain 84 143 -89.52 gain 143 84 -92.01 gain 84 144 -94.31 gain 144 84 -92.70 gain 84 145 -93.30 gain 145 84 -96.24 gain 84 146 -99.72 gain 146 84 -99.10 gain 84 147 -93.70 gain 147 84 -94.27 gain 84 148 -93.32 gain 148 84 -94.42 gain 84 149 -94.84 gain 149 84 -92.32 gain 84 150 -102.58 gain 150 84 -103.44 gain 84 151 -107.87 gain 151 84 -111.21 gain 84 152 -101.62 gain 152 84 -103.32 gain 84 153 -97.51 gain 153 84 -98.90 gain 84 154 -98.31 gain 154 84 -100.83 gain 84 155 -99.44 gain 155 84 -99.26 gain 84 156 -100.29 gain 156 84 -101.24 gain 84 157 -94.25 gain 157 84 -96.49 gain 84 158 -102.26 gain 158 84 -106.47 gain 84 159 -95.26 gain 159 84 -93.51 gain 84 160 -97.16 gain 160 84 -96.78 gain 84 161 -95.07 gain 161 84 -95.75 gain 84 162 -97.42 gain 162 84 -97.73 gain 84 163 -105.16 gain 163 84 -102.89 gain 84 164 -104.00 gain 164 84 -108.95 gain 84 165 -107.54 gain 165 84 -109.85 gain 84 166 -104.55 gain 166 84 -108.52 gain 84 167 -105.49 gain 167 84 -108.28 gain 84 168 -107.26 gain 168 84 -109.12 gain 84 169 -102.46 gain 169 84 -100.83 gain 84 170 -102.91 gain 170 84 -102.22 gain 84 171 -95.83 gain 171 84 -95.71 gain 84 172 -96.97 gain 172 84 -99.65 gain 84 173 -96.20 gain 173 84 -93.20 gain 84 174 -101.66 gain 174 84 -104.62 gain 84 175 -100.00 gain 175 84 -94.75 gain 84 176 -96.93 gain 176 84 -95.91 gain 84 177 -100.43 gain 177 84 -101.77 gain 84 178 -98.08 gain 178 84 -97.03 gain 84 179 -107.78 gain 179 84 -109.77 gain 84 180 -106.91 gain 180 84 -107.64 gain 84 181 -106.63 gain 181 84 -110.76 gain 84 182 -107.80 gain 182 84 -108.06 gain 84 183 -107.03 gain 183 84 -103.18 gain 84 184 -103.80 gain 184 84 -106.17 gain 84 185 -100.94 gain 185 84 -101.81 gain 84 186 -102.86 gain 186 84 -104.43 gain 84 187 -100.47 gain 187 84 -102.06 gain 84 188 -102.01 gain 188 84 -108.05 gain 84 189 -102.39 gain 189 84 -104.49 gain 84 190 -97.07 gain 190 84 -92.00 gain 84 191 -95.67 gain 191 84 -93.77 gain 84 192 -94.30 gain 192 84 -96.07 gain 84 193 -101.64 gain 193 84 -99.44 gain 84 194 -111.55 gain 194 84 -109.23 gain 84 195 -104.83 gain 195 84 -100.50 gain 84 196 -107.89 gain 196 84 -111.22 gain 84 197 -107.88 gain 197 84 -108.70 gain 84 198 -109.47 gain 198 84 -112.93 gain 84 199 -106.17 gain 199 84 -103.65 gain 84 200 -104.68 gain 200 84 -104.07 gain 84 201 -96.95 gain 201 84 -99.44 gain 84 202 -101.71 gain 202 84 -102.50 gain 84 203 -96.96 gain 203 84 -97.84 gain 84 204 -93.65 gain 204 84 -92.76 gain 84 205 -107.01 gain 205 84 -105.78 gain 84 206 -108.23 gain 206 84 -108.32 gain 84 207 -102.98 gain 207 84 -100.81 gain 84 208 -106.80 gain 208 84 -107.94 gain 84 209 -104.31 gain 209 84 -104.48 gain 84 210 -105.64 gain 210 84 -109.82 gain 84 211 -98.56 gain 211 84 -100.13 gain 84 212 -104.39 gain 212 84 -104.50 gain 84 213 -102.34 gain 213 84 -105.20 gain 84 214 -104.57 gain 214 84 -105.61 gain 84 215 -110.90 gain 215 84 -113.75 gain 84 216 -103.28 gain 216 84 -103.03 gain 84 217 -110.73 gain 217 84 -114.92 gain 84 218 -107.15 gain 218 84 -112.66 gain 84 219 -97.38 gain 219 84 -100.46 gain 84 220 -106.40 gain 220 84 -106.60 gain 84 221 -98.52 gain 221 84 -99.71 gain 84 222 -100.70 gain 222 84 -98.47 gain 84 223 -109.11 gain 223 84 -109.17 gain 84 224 -109.15 gain 224 84 -106.13 gain 85 86 -80.50 gain 86 85 -73.68 gain 85 87 -87.57 gain 87 85 -83.56 gain 85 88 -86.97 gain 88 85 -83.23 gain 85 89 -99.51 gain 89 85 -96.41 gain 85 90 -110.94 gain 90 85 -111.38 gain 85 91 -108.35 gain 91 85 -104.37 gain 85 92 -98.29 gain 92 85 -97.89 gain 85 93 -98.56 gain 93 85 -92.06 gain 85 94 -105.15 gain 94 85 -101.08 gain 85 95 -111.42 gain 95 85 -110.40 gain 85 96 -88.72 gain 96 85 -83.97 gain 85 97 -96.84 gain 97 85 -93.37 gain 85 98 -86.85 gain 98 85 -80.56 gain 85 99 -82.37 gain 99 85 -80.16 gain 85 100 -79.69 gain 100 85 -75.32 gain 85 101 -82.08 gain 101 85 -76.38 gain 85 102 -88.28 gain 102 85 -83.23 gain 85 103 -100.41 gain 103 85 -94.60 gain 85 104 -99.38 gain 104 85 -90.00 gain 85 105 -112.08 gain 105 85 -108.10 gain 85 106 -105.35 gain 106 85 -100.67 gain 85 107 -111.64 gain 107 85 -109.98 gain 85 108 -96.02 gain 108 85 -92.42 gain 85 109 -107.11 gain 109 85 -100.36 gain 85 110 -98.09 gain 110 85 -93.58 gain 85 111 -102.53 gain 111 85 -95.21 gain 85 112 -95.34 gain 112 85 -90.03 gain 85 113 -92.22 gain 113 85 -93.85 gain 85 114 -91.54 gain 114 85 -88.80 gain 85 115 -91.07 gain 115 85 -89.18 gain 85 116 -85.83 gain 116 85 -79.97 gain 85 117 -92.55 gain 117 85 -86.53 gain 85 118 -93.47 gain 118 85 -95.62 gain 85 119 -104.73 gain 119 85 -98.44 gain 85 120 -107.80 gain 120 85 -101.61 gain 85 121 -106.23 gain 121 85 -102.78 gain 85 122 -110.12 gain 122 85 -109.24 gain 85 123 -105.69 gain 123 85 -105.07 gain 85 124 -106.25 gain 124 85 -99.23 gain 85 125 -108.59 gain 125 85 -103.50 gain 85 126 -91.53 gain 126 85 -91.33 gain 85 127 -95.04 gain 127 85 -89.59 gain 85 128 -99.23 gain 128 85 -96.84 gain 85 129 -102.05 gain 129 85 -96.88 gain 85 130 -90.98 gain 130 85 -87.99 gain 85 131 -96.31 gain 131 85 -91.67 gain 85 132 -97.90 gain 132 85 -89.54 gain 85 133 -97.89 gain 133 85 -93.96 gain 85 134 -100.74 gain 134 85 -94.80 gain 85 135 -114.33 gain 135 85 -103.98 gain 85 136 -111.27 gain 136 85 -109.69 gain 85 137 -103.87 gain 137 85 -98.95 gain 85 138 -107.54 gain 138 85 -104.64 gain 85 139 -108.15 gain 139 85 -106.96 gain 85 140 -101.48 gain 140 85 -100.09 gain 85 141 -103.84 gain 141 85 -98.14 gain 85 142 -95.04 gain 142 85 -90.49 gain 85 143 -100.53 gain 143 85 -98.43 gain 85 144 -92.93 gain 144 85 -86.73 gain 85 145 -97.24 gain 145 85 -95.60 gain 85 146 -99.94 gain 146 85 -94.74 gain 85 147 -96.82 gain 147 85 -92.81 gain 85 148 -99.40 gain 148 85 -95.92 gain 85 149 -98.98 gain 149 85 -91.88 gain 85 150 -110.28 gain 150 85 -106.56 gain 85 151 -109.41 gain 151 85 -108.17 gain 85 152 -109.29 gain 152 85 -106.41 gain 85 153 -110.89 gain 153 85 -107.70 gain 85 154 -105.52 gain 154 85 -103.46 gain 85 155 -109.60 gain 155 85 -104.84 gain 85 156 -109.08 gain 156 85 -105.45 gain 85 157 -98.27 gain 157 85 -95.93 gain 85 158 -90.40 gain 158 85 -90.02 gain 85 159 -99.63 gain 159 85 -93.30 gain 85 160 -108.17 gain 160 85 -103.22 gain 85 161 -103.03 gain 161 85 -99.13 gain 85 162 -97.67 gain 162 85 -93.40 gain 85 163 -96.39 gain 163 85 -89.54 gain 85 164 -110.79 gain 164 85 -111.16 gain 85 165 -112.06 gain 165 85 -109.79 gain 85 166 -106.99 gain 166 85 -106.38 gain 85 167 -114.96 gain 167 85 -113.17 gain 85 168 -108.10 gain 168 85 -105.38 gain 85 169 -111.14 gain 169 85 -104.93 gain 85 170 -103.64 gain 170 85 -98.37 gain 85 171 -106.74 gain 171 85 -102.04 gain 85 172 -102.87 gain 172 85 -100.97 gain 85 173 -102.53 gain 173 85 -94.95 gain 85 174 -99.76 gain 174 85 -98.13 gain 85 175 -99.22 gain 175 85 -89.39 gain 85 176 -96.76 gain 176 85 -91.16 gain 85 177 -103.46 gain 177 85 -100.22 gain 85 178 -101.99 gain 178 85 -96.36 gain 85 179 -105.73 gain 179 85 -103.14 gain 85 180 -115.37 gain 180 85 -111.52 gain 85 181 -114.28 gain 181 85 -113.82 gain 85 182 -115.66 gain 182 85 -111.34 gain 85 183 -115.11 gain 183 85 -106.67 gain 85 184 -108.84 gain 184 85 -106.64 gain 85 185 -106.83 gain 185 85 -103.12 gain 85 186 -96.15 gain 186 85 -93.14 gain 85 187 -106.45 gain 187 85 -103.47 gain 85 188 -101.10 gain 188 85 -102.56 gain 85 189 -105.23 gain 189 85 -102.75 gain 85 190 -103.88 gain 190 85 -94.23 gain 85 191 -106.76 gain 191 85 -100.29 gain 85 192 -96.43 gain 192 85 -93.63 gain 85 193 -105.54 gain 193 85 -98.76 gain 85 194 -106.58 gain 194 85 -99.68 gain 85 195 -109.99 gain 195 85 -101.07 gain 85 196 -108.77 gain 196 85 -107.52 gain 85 197 -102.26 gain 197 85 -98.50 gain 85 198 -111.57 gain 198 85 -110.46 gain 85 199 -112.41 gain 199 85 -105.31 gain 85 200 -112.93 gain 200 85 -107.75 gain 85 201 -108.31 gain 201 85 -106.21 gain 85 202 -107.51 gain 202 85 -103.71 gain 85 203 -109.29 gain 203 85 -105.59 gain 85 204 -106.11 gain 204 85 -100.64 gain 85 205 -103.44 gain 205 85 -97.63 gain 85 206 -106.87 gain 206 85 -102.38 gain 85 207 -110.21 gain 207 85 -103.47 gain 85 208 -104.01 gain 208 85 -100.57 gain 85 209 -101.61 gain 209 85 -97.20 gain 85 210 -112.67 gain 210 85 -112.27 gain 85 211 -112.20 gain 211 85 -109.19 gain 85 212 -111.17 gain 212 85 -106.70 gain 85 213 -117.15 gain 213 85 -115.43 gain 85 214 -109.26 gain 214 85 -105.72 gain 85 215 -112.91 gain 215 85 -111.18 gain 85 216 -108.21 gain 216 85 -103.38 gain 85 217 -111.75 gain 217 85 -111.36 gain 85 218 -106.33 gain 218 85 -107.26 gain 85 219 -108.51 gain 219 85 -107.02 gain 85 220 -108.25 gain 220 85 -103.87 gain 85 221 -108.41 gain 221 85 -105.02 gain 85 222 -101.05 gain 222 85 -94.24 gain 85 223 -104.78 gain 223 85 -100.26 gain 85 224 -117.37 gain 224 85 -109.78 gain 86 87 -74.95 gain 87 86 -77.75 gain 86 88 -83.43 gain 88 86 -86.51 gain 86 89 -94.89 gain 89 86 -98.60 gain 86 90 -108.56 gain 90 86 -115.81 gain 86 91 -100.67 gain 91 86 -103.51 gain 86 92 -100.53 gain 92 86 -106.93 gain 86 93 -108.07 gain 93 86 -108.39 gain 86 94 -104.75 gain 94 86 -107.50 gain 86 95 -96.95 gain 95 86 -102.75 gain 86 96 -96.55 gain 96 86 -98.62 gain 86 97 -91.84 gain 97 86 -95.19 gain 86 98 -93.92 gain 98 86 -94.44 gain 86 99 -78.19 gain 99 86 -82.80 gain 86 100 -71.32 gain 100 86 -73.77 gain 86 101 -74.00 gain 101 86 -75.11 gain 86 102 -83.72 gain 102 86 -85.49 gain 86 103 -82.17 gain 103 86 -83.18 gain 86 104 -85.76 gain 104 86 -83.20 gain 86 105 -105.78 gain 105 86 -108.62 gain 86 106 -105.68 gain 106 86 -107.82 gain 86 107 -102.47 gain 107 86 -107.62 gain 86 108 -98.68 gain 108 86 -101.90 gain 86 109 -92.63 gain 109 86 -92.69 gain 86 110 -99.71 gain 110 86 -102.01 gain 86 111 -94.00 gain 111 86 -93.50 gain 86 112 -93.49 gain 112 86 -94.99 gain 86 113 -87.96 gain 113 86 -96.40 gain 86 114 -78.93 gain 114 86 -83.00 gain 86 115 -85.60 gain 115 86 -90.53 gain 86 116 -83.78 gain 116 86 -84.73 gain 86 117 -77.85 gain 117 86 -78.65 gain 86 118 -84.77 gain 118 86 -93.74 gain 86 119 -94.32 gain 119 86 -94.84 gain 86 120 -101.73 gain 120 86 -102.35 gain 86 121 -103.85 gain 121 86 -107.22 gain 86 122 -103.09 gain 122 86 -109.03 gain 86 123 -95.90 gain 123 86 -102.09 gain 86 124 -98.69 gain 124 86 -98.49 gain 86 125 -98.96 gain 125 86 -100.69 gain 86 126 -96.40 gain 126 86 -103.01 gain 86 127 -97.42 gain 127 86 -98.79 gain 86 128 -94.18 gain 128 86 -98.60 gain 86 129 -84.04 gain 129 86 -85.68 gain 86 130 -83.14 gain 130 86 -86.96 gain 86 131 -79.34 gain 131 86 -81.52 gain 86 132 -86.69 gain 132 86 -85.15 gain 86 133 -91.31 gain 133 86 -94.19 gain 86 134 -88.40 gain 134 86 -89.28 gain 86 135 -106.46 gain 135 86 -102.93 gain 86 136 -100.89 gain 136 86 -106.14 gain 86 137 -98.76 gain 137 86 -100.66 gain 86 138 -98.81 gain 138 86 -102.73 gain 86 139 -105.93 gain 139 86 -111.56 gain 86 140 -102.51 gain 140 86 -107.94 gain 86 141 -100.74 gain 141 86 -101.86 gain 86 142 -108.76 gain 142 86 -111.03 gain 86 143 -96.37 gain 143 86 -101.09 gain 86 144 -89.64 gain 144 86 -90.27 gain 86 145 -94.07 gain 145 86 -99.24 gain 86 146 -89.23 gain 146 86 -90.85 gain 86 147 -87.47 gain 147 86 -90.28 gain 86 148 -87.86 gain 148 86 -91.19 gain 86 149 -97.39 gain 149 86 -97.10 gain 86 150 -102.28 gain 150 86 -105.37 gain 86 151 -105.28 gain 151 86 -110.85 gain 86 152 -100.16 gain 152 86 -104.09 gain 86 153 -103.95 gain 153 86 -107.58 gain 86 154 -98.98 gain 154 86 -103.74 gain 86 155 -97.35 gain 155 86 -99.41 gain 86 156 -99.78 gain 156 86 -102.96 gain 86 157 -99.29 gain 157 86 -103.77 gain 86 158 -98.79 gain 158 86 -105.24 gain 86 159 -96.50 gain 159 86 -96.98 gain 86 160 -91.80 gain 160 86 -93.66 gain 86 161 -96.90 gain 161 86 -99.82 gain 86 162 -90.54 gain 162 86 -93.08 gain 86 163 -93.41 gain 163 86 -93.37 gain 86 164 -97.94 gain 164 86 -105.13 gain 86 165 -101.69 gain 165 86 -106.23 gain 86 166 -107.96 gain 166 86 -114.17 gain 86 167 -101.93 gain 167 86 -106.95 gain 86 168 -102.89 gain 168 86 -106.98 gain 86 169 -102.30 gain 169 86 -102.91 gain 86 170 -105.49 gain 170 86 -107.04 gain 86 171 -100.90 gain 171 86 -103.02 gain 86 172 -97.76 gain 172 86 -102.68 gain 86 173 -96.93 gain 173 86 -96.16 gain 86 174 -94.17 gain 174 86 -99.36 gain 86 175 -89.96 gain 175 86 -86.95 gain 86 176 -87.84 gain 176 86 -89.05 gain 86 177 -92.63 gain 177 86 -96.20 gain 86 178 -97.36 gain 178 86 -98.54 gain 86 179 -97.03 gain 179 86 -101.26 gain 86 180 -101.59 gain 180 86 -104.56 gain 86 181 -99.36 gain 181 86 -105.73 gain 86 182 -101.81 gain 182 86 -104.31 gain 86 183 -98.22 gain 183 86 -96.60 gain 86 184 -92.38 gain 184 86 -96.99 gain 86 185 -104.62 gain 185 86 -107.72 gain 86 186 -99.06 gain 186 86 -102.87 gain 86 187 -99.35 gain 187 86 -103.19 gain 86 188 -91.41 gain 188 86 -99.69 gain 86 189 -99.55 gain 189 86 -103.89 gain 86 190 -92.00 gain 190 86 -89.17 gain 86 191 -102.52 gain 191 86 -102.86 gain 86 192 -100.13 gain 192 86 -104.15 gain 86 193 -102.98 gain 193 86 -103.01 gain 86 194 -85.64 gain 194 86 -85.56 gain 86 195 -108.15 gain 195 86 -106.05 gain 86 196 -107.32 gain 196 86 -112.89 gain 86 197 -99.17 gain 197 86 -102.22 gain 86 198 -101.25 gain 198 86 -106.94 gain 86 199 -103.21 gain 199 86 -102.92 gain 86 200 -102.26 gain 200 86 -103.89 gain 86 201 -107.43 gain 201 86 -112.15 gain 86 202 -98.52 gain 202 86 -101.54 gain 86 203 -106.53 gain 203 86 -109.64 gain 86 204 -98.31 gain 204 86 -99.65 gain 86 205 -100.93 gain 205 86 -101.93 gain 86 206 -97.04 gain 206 86 -99.37 gain 86 207 -99.93 gain 207 86 -100.00 gain 86 208 -100.89 gain 208 86 -104.26 gain 86 209 -100.69 gain 209 86 -103.10 gain 86 210 -105.78 gain 210 86 -112.20 gain 86 211 -104.14 gain 211 86 -107.95 gain 86 212 -110.90 gain 212 86 -113.25 gain 86 213 -110.11 gain 213 86 -115.20 gain 86 214 -105.06 gain 214 86 -108.34 gain 86 215 -104.68 gain 215 86 -109.77 gain 86 216 -103.67 gain 216 86 -105.65 gain 86 217 -102.44 gain 217 86 -108.87 gain 86 218 -100.54 gain 218 86 -108.29 gain 86 219 -108.72 gain 219 86 -114.04 gain 86 220 -101.02 gain 220 86 -103.46 gain 86 221 -106.34 gain 221 86 -109.77 gain 86 222 -98.28 gain 222 86 -98.29 gain 86 223 -103.21 gain 223 86 -105.50 gain 86 224 -104.49 gain 224 86 -103.71 gain 87 88 -75.10 gain 88 87 -75.38 gain 87 89 -85.16 gain 89 87 -86.08 gain 87 90 -115.76 gain 90 87 -120.21 gain 87 91 -103.65 gain 91 87 -103.69 gain 87 92 -111.73 gain 92 87 -115.34 gain 87 93 -103.45 gain 93 87 -100.97 gain 87 94 -104.14 gain 94 87 -104.10 gain 87 95 -103.77 gain 95 87 -106.77 gain 87 96 -86.23 gain 96 87 -85.50 gain 87 97 -94.87 gain 97 87 -95.42 gain 87 98 -86.76 gain 98 87 -84.48 gain 87 99 -92.00 gain 99 87 -93.81 gain 87 100 -85.27 gain 100 87 -84.92 gain 87 101 -77.59 gain 101 87 -75.90 gain 87 102 -64.60 gain 102 87 -63.58 gain 87 103 -81.36 gain 103 87 -79.57 gain 87 104 -87.52 gain 104 87 -82.16 gain 87 105 -106.62 gain 105 87 -106.66 gain 87 106 -102.19 gain 106 87 -101.53 gain 87 107 -117.48 gain 107 87 -119.83 gain 87 108 -96.06 gain 108 87 -96.48 gain 87 109 -100.57 gain 109 87 -97.84 gain 87 110 -94.66 gain 110 87 -94.17 gain 87 111 -105.51 gain 111 87 -102.21 gain 87 112 -93.76 gain 112 87 -92.46 gain 87 113 -99.31 gain 113 87 -104.95 gain 87 114 -96.83 gain 114 87 -98.10 gain 87 115 -90.74 gain 115 87 -92.87 gain 87 116 -79.66 gain 116 87 -77.82 gain 87 117 -92.47 gain 117 87 -90.47 gain 87 118 -84.28 gain 118 87 -90.45 gain 87 119 -92.37 gain 119 87 -90.09 gain 87 120 -113.31 gain 120 87 -111.13 gain 87 121 -110.05 gain 121 87 -110.62 gain 87 122 -104.83 gain 122 87 -107.97 gain 87 123 -105.07 gain 123 87 -108.47 gain 87 124 -109.73 gain 124 87 -106.73 gain 87 125 -104.71 gain 125 87 -103.64 gain 87 126 -100.51 gain 126 87 -104.32 gain 87 127 -97.36 gain 127 87 -95.93 gain 87 128 -97.91 gain 128 87 -99.54 gain 87 129 -93.63 gain 129 87 -92.47 gain 87 130 -88.82 gain 130 87 -89.84 gain 87 131 -86.69 gain 131 87 -86.07 gain 87 132 -96.30 gain 132 87 -91.95 gain 87 133 -84.98 gain 133 87 -85.06 gain 87 134 -89.68 gain 134 87 -87.76 gain 87 135 -108.61 gain 135 87 -102.27 gain 87 136 -112.09 gain 136 87 -114.54 gain 87 137 -102.66 gain 137 87 -101.76 gain 87 138 -102.10 gain 138 87 -103.21 gain 87 139 -100.93 gain 139 87 -103.75 gain 87 140 -92.55 gain 140 87 -95.18 gain 87 141 -98.59 gain 141 87 -96.91 gain 87 142 -90.89 gain 142 87 -90.36 gain 87 143 -100.22 gain 143 87 -102.14 gain 87 144 -99.01 gain 144 87 -96.83 gain 87 145 -98.59 gain 145 87 -100.96 gain 87 146 -90.50 gain 146 87 -89.31 gain 87 147 -86.14 gain 147 87 -86.14 gain 87 148 -94.28 gain 148 87 -94.81 gain 87 149 -96.26 gain 149 87 -93.17 gain 87 150 -114.72 gain 150 87 -115.01 gain 87 151 -112.23 gain 151 87 -115.00 gain 87 152 -103.41 gain 152 87 -104.54 gain 87 153 -97.93 gain 153 87 -98.75 gain 87 154 -94.05 gain 154 87 -96.00 gain 87 155 -106.41 gain 155 87 -105.66 gain 87 156 -102.34 gain 156 87 -102.72 gain 87 157 -94.68 gain 157 87 -96.35 gain 87 158 -97.28 gain 158 87 -100.92 gain 87 159 -96.32 gain 159 87 -94.00 gain 87 160 -99.14 gain 160 87 -98.20 gain 87 161 -96.10 gain 161 87 -96.21 gain 87 162 -92.38 gain 162 87 -92.12 gain 87 163 -101.60 gain 163 87 -98.76 gain 87 164 -100.67 gain 164 87 -105.06 gain 87 165 -107.04 gain 165 87 -108.79 gain 87 166 -103.01 gain 166 87 -106.42 gain 87 167 -104.52 gain 167 87 -106.74 gain 87 168 -107.44 gain 168 87 -108.73 gain 87 169 -100.49 gain 169 87 -98.30 gain 87 170 -105.81 gain 170 87 -104.56 gain 87 171 -102.83 gain 171 87 -102.15 gain 87 172 -97.78 gain 172 87 -99.90 gain 87 173 -97.82 gain 173 87 -94.25 gain 87 174 -95.07 gain 174 87 -97.47 gain 87 175 -96.33 gain 175 87 -90.52 gain 87 176 -100.57 gain 176 87 -98.98 gain 87 177 -100.55 gain 177 87 -101.33 gain 87 178 -101.79 gain 178 87 -100.17 gain 87 179 -98.27 gain 179 87 -99.69 gain 87 180 -110.96 gain 180 87 -111.12 gain 87 181 -109.72 gain 181 87 -113.29 gain 87 182 -111.04 gain 182 87 -110.74 gain 87 183 -110.74 gain 183 87 -106.32 gain 87 184 -104.90 gain 184 87 -106.70 gain 87 185 -110.72 gain 185 87 -111.02 gain 87 186 -102.62 gain 186 87 -103.63 gain 87 187 -108.02 gain 187 87 -109.06 gain 87 188 -105.19 gain 188 87 -110.67 gain 87 189 -107.23 gain 189 87 -108.77 gain 87 190 -106.14 gain 190 87 -100.51 gain 87 191 -105.42 gain 191 87 -102.96 gain 87 192 -107.23 gain 192 87 -108.45 gain 87 193 -96.64 gain 193 87 -93.87 gain 87 194 -98.70 gain 194 87 -95.83 gain 87 195 -109.00 gain 195 87 -104.10 gain 87 196 -115.67 gain 196 87 -118.44 gain 87 197 -109.37 gain 197 87 -109.63 gain 87 198 -108.95 gain 198 87 -111.85 gain 87 199 -102.74 gain 199 87 -99.66 gain 87 200 -110.16 gain 200 87 -108.99 gain 87 201 -106.08 gain 201 87 -108.00 gain 87 202 -102.82 gain 202 87 -103.04 gain 87 203 -103.83 gain 203 87 -104.14 gain 87 204 -105.34 gain 204 87 -103.87 gain 87 205 -101.54 gain 205 87 -99.75 gain 87 206 -97.67 gain 206 87 -97.19 gain 87 207 -94.57 gain 207 87 -91.84 gain 87 208 -101.09 gain 208 87 -101.66 gain 87 209 -107.20 gain 209 87 -106.81 gain 87 210 -109.60 gain 210 87 -113.21 gain 87 211 -104.54 gain 211 87 -105.54 gain 87 212 -104.80 gain 212 87 -104.35 gain 87 213 -110.43 gain 213 87 -112.72 gain 87 214 -115.32 gain 214 87 -115.79 gain 87 215 -102.87 gain 215 87 -105.16 gain 87 216 -107.16 gain 216 87 -106.34 gain 87 217 -100.71 gain 217 87 -104.34 gain 87 218 -104.15 gain 218 87 -109.10 gain 87 219 -114.14 gain 219 87 -116.66 gain 87 220 -99.78 gain 220 87 -99.42 gain 87 221 -105.91 gain 221 87 -106.54 gain 87 222 -98.41 gain 222 87 -95.62 gain 87 223 -105.58 gain 223 87 -105.08 gain 87 224 -101.81 gain 224 87 -98.23 gain 88 89 -74.02 gain 89 88 -74.65 gain 88 90 -112.11 gain 90 88 -116.28 gain 88 91 -108.99 gain 91 88 -108.75 gain 88 92 -113.64 gain 92 88 -116.97 gain 88 93 -108.27 gain 93 88 -105.51 gain 88 94 -105.18 gain 94 88 -104.85 gain 88 95 -100.29 gain 95 88 -103.01 gain 88 96 -102.10 gain 96 88 -101.09 gain 88 97 -100.54 gain 97 88 -100.80 gain 88 98 -98.12 gain 98 88 -95.56 gain 88 99 -89.86 gain 99 88 -91.39 gain 88 100 -91.84 gain 100 88 -91.21 gain 88 101 -89.58 gain 101 88 -87.61 gain 88 102 -85.47 gain 102 88 -84.17 gain 88 103 -69.71 gain 103 88 -67.63 gain 88 104 -91.61 gain 104 88 -85.97 gain 88 105 -108.96 gain 105 88 -108.72 gain 88 106 -106.51 gain 106 88 -105.58 gain 88 107 -106.13 gain 107 88 -108.21 gain 88 108 -109.66 gain 108 88 -109.80 gain 88 109 -106.61 gain 109 88 -103.59 gain 88 110 -106.00 gain 110 88 -105.22 gain 88 111 -104.28 gain 111 88 -100.71 gain 88 112 -99.31 gain 112 88 -97.74 gain 88 113 -97.43 gain 113 88 -102.79 gain 88 114 -91.61 gain 114 88 -92.60 gain 88 115 -94.00 gain 115 88 -95.85 gain 88 116 -85.68 gain 116 88 -83.56 gain 88 117 -88.59 gain 117 88 -86.31 gain 88 118 -81.49 gain 118 88 -87.39 gain 88 119 -80.38 gain 119 88 -77.82 gain 88 120 -108.20 gain 120 88 -105.75 gain 88 121 -108.88 gain 121 88 -109.17 gain 88 122 -105.92 gain 122 88 -108.78 gain 88 123 -112.82 gain 123 88 -115.94 gain 88 124 -108.31 gain 124 88 -105.03 gain 88 125 -104.98 gain 125 88 -103.63 gain 88 126 -102.28 gain 126 88 -105.82 gain 88 127 -101.58 gain 127 88 -99.86 gain 88 128 -93.42 gain 128 88 -94.76 gain 88 129 -98.26 gain 129 88 -96.82 gain 88 130 -88.24 gain 130 88 -88.98 gain 88 131 -92.90 gain 131 88 -92.00 gain 88 132 -94.41 gain 132 88 -89.79 gain 88 133 -92.20 gain 133 88 -92.01 gain 88 134 -92.31 gain 134 88 -90.11 gain 88 135 -115.26 gain 135 88 -108.65 gain 88 136 -119.36 gain 136 88 -121.53 gain 88 137 -100.98 gain 137 88 -99.80 gain 88 138 -104.82 gain 138 88 -105.65 gain 88 139 -99.51 gain 139 88 -102.05 gain 88 140 -102.64 gain 140 88 -104.99 gain 88 141 -111.42 gain 141 88 -109.46 gain 88 142 -103.84 gain 142 88 -103.03 gain 88 143 -102.45 gain 143 88 -104.09 gain 88 144 -90.96 gain 144 88 -88.50 gain 88 145 -101.65 gain 145 88 -103.75 gain 88 146 -93.67 gain 146 88 -92.21 gain 88 147 -89.08 gain 147 88 -88.81 gain 88 148 -98.80 gain 148 88 -99.06 gain 88 149 -90.73 gain 149 88 -87.36 gain 88 150 -115.14 gain 150 88 -115.16 gain 88 151 -109.35 gain 151 88 -111.84 gain 88 152 -112.12 gain 152 88 -112.97 gain 88 153 -108.22 gain 153 88 -108.76 gain 88 154 -101.66 gain 154 88 -103.34 gain 88 155 -107.30 gain 155 88 -106.28 gain 88 156 -97.78 gain 156 88 -97.88 gain 88 157 -108.16 gain 157 88 -109.55 gain 88 158 -108.93 gain 158 88 -112.30 gain 88 159 -100.38 gain 159 88 -97.78 gain 88 160 -94.65 gain 160 88 -93.43 gain 88 161 -100.72 gain 161 88 -100.56 gain 88 162 -96.04 gain 162 88 -95.50 gain 88 163 -99.31 gain 163 88 -96.19 gain 88 164 -90.40 gain 164 88 -94.52 gain 88 165 -112.32 gain 165 88 -113.79 gain 88 166 -106.26 gain 166 88 -109.39 gain 88 167 -115.80 gain 167 88 -117.75 gain 88 168 -108.30 gain 168 88 -109.31 gain 88 169 -103.80 gain 169 88 -101.33 gain 88 170 -100.34 gain 170 88 -98.81 gain 88 171 -103.65 gain 171 88 -102.68 gain 88 172 -96.08 gain 172 88 -97.92 gain 88 173 -98.98 gain 173 88 -95.13 gain 88 174 -105.71 gain 174 88 -107.82 gain 88 175 -101.65 gain 175 88 -95.56 gain 88 176 -98.98 gain 176 88 -97.12 gain 88 177 -103.89 gain 177 88 -104.38 gain 88 178 -99.07 gain 178 88 -97.18 gain 88 179 -97.43 gain 179 88 -98.58 gain 88 180 -112.35 gain 180 88 -112.23 gain 88 181 -109.47 gain 181 88 -112.76 gain 88 182 -110.78 gain 182 88 -110.20 gain 88 183 -108.25 gain 183 88 -103.55 gain 88 184 -105.76 gain 184 88 -107.29 gain 88 185 -112.72 gain 185 88 -112.74 gain 88 186 -107.68 gain 186 88 -108.41 gain 88 187 -102.03 gain 187 88 -102.78 gain 88 188 -99.55 gain 188 88 -104.75 gain 88 189 -101.10 gain 189 88 -102.35 gain 88 190 -105.33 gain 190 88 -99.41 gain 88 191 -100.39 gain 191 88 -97.65 gain 88 192 -106.80 gain 192 88 -107.74 gain 88 193 -97.73 gain 193 88 -94.69 gain 88 194 -105.51 gain 194 88 -102.36 gain 88 195 -107.06 gain 195 88 -101.87 gain 88 196 -111.39 gain 196 88 -113.87 gain 88 197 -113.14 gain 197 88 -113.12 gain 88 198 -114.40 gain 198 88 -117.02 gain 88 199 -106.20 gain 199 88 -102.83 gain 88 200 -114.95 gain 200 88 -113.50 gain 88 201 -105.90 gain 201 88 -107.54 gain 88 202 -106.80 gain 202 88 -106.74 gain 88 203 -106.54 gain 203 88 -106.58 gain 88 204 -102.25 gain 204 88 -100.51 gain 88 205 -105.01 gain 205 88 -102.93 gain 88 206 -102.66 gain 206 88 -101.90 gain 88 207 -103.40 gain 207 88 -100.39 gain 88 208 -96.54 gain 208 88 -96.83 gain 88 209 -105.84 gain 209 88 -105.17 gain 88 210 -109.55 gain 210 88 -112.88 gain 88 211 -107.39 gain 211 88 -108.12 gain 88 212 -114.83 gain 212 88 -114.11 gain 88 213 -101.77 gain 213 88 -103.78 gain 88 214 -109.54 gain 214 88 -109.73 gain 88 215 -104.01 gain 215 88 -106.01 gain 88 216 -99.86 gain 216 88 -98.76 gain 88 217 -101.73 gain 217 88 -105.08 gain 88 218 -110.84 gain 218 88 -115.51 gain 88 219 -106.57 gain 219 88 -108.82 gain 88 220 -109.97 gain 220 88 -109.32 gain 88 221 -102.30 gain 221 88 -102.65 gain 88 222 -101.14 gain 222 88 -98.07 gain 88 223 -106.03 gain 223 88 -105.24 gain 88 224 -104.71 gain 224 88 -100.85 gain 89 90 -103.62 gain 90 89 -107.15 gain 89 91 -115.21 gain 91 89 -114.33 gain 89 92 -106.58 gain 92 89 -109.27 gain 89 93 -104.45 gain 93 89 -101.06 gain 89 94 -109.26 gain 94 89 -108.29 gain 89 95 -104.00 gain 95 89 -106.08 gain 89 96 -110.97 gain 96 89 -109.32 gain 89 97 -105.73 gain 97 89 -105.35 gain 89 98 -102.06 gain 98 89 -98.86 gain 89 99 -102.84 gain 99 89 -103.73 gain 89 100 -86.93 gain 100 89 -85.66 gain 89 101 -91.29 gain 101 89 -88.69 gain 89 102 -91.19 gain 102 89 -89.25 gain 89 103 -80.90 gain 103 89 -78.19 gain 89 104 -72.46 gain 104 89 -66.18 gain 89 105 -111.40 gain 105 89 -110.52 gain 89 106 -108.25 gain 106 89 -106.67 gain 89 107 -108.56 gain 107 89 -110.00 gain 89 108 -109.49 gain 108 89 -108.99 gain 89 109 -111.51 gain 109 89 -107.86 gain 89 110 -105.81 gain 110 89 -104.40 gain 89 111 -111.18 gain 111 89 -106.97 gain 89 112 -105.82 gain 112 89 -103.61 gain 89 113 -101.40 gain 113 89 -106.12 gain 89 114 -103.44 gain 114 89 -103.79 gain 89 115 -93.42 gain 115 89 -94.63 gain 89 116 -90.89 gain 116 89 -88.13 gain 89 117 -86.49 gain 117 89 -83.57 gain 89 118 -83.29 gain 118 89 -88.54 gain 89 119 -86.61 gain 119 89 -83.41 gain 89 120 -120.33 gain 120 89 -117.23 gain 89 121 -106.99 gain 121 89 -106.64 gain 89 122 -106.73 gain 122 89 -108.95 gain 89 123 -102.97 gain 123 89 -105.45 gain 89 124 -106.72 gain 124 89 -102.80 gain 89 125 -110.34 gain 125 89 -108.35 gain 89 126 -104.46 gain 126 89 -107.36 gain 89 127 -97.78 gain 127 89 -95.43 gain 89 128 -96.80 gain 128 89 -97.51 gain 89 129 -100.76 gain 129 89 -98.69 gain 89 130 -101.29 gain 130 89 -101.39 gain 89 131 -102.02 gain 131 89 -100.48 gain 89 132 -91.44 gain 132 89 -86.18 gain 89 133 -87.56 gain 133 89 -86.72 gain 89 134 -95.38 gain 134 89 -92.54 gain 89 135 -114.41 gain 135 89 -107.16 gain 89 136 -108.02 gain 136 89 -109.55 gain 89 137 -110.48 gain 137 89 -108.66 gain 89 138 -105.57 gain 138 89 -105.77 gain 89 139 -106.69 gain 139 89 -108.60 gain 89 140 -102.78 gain 140 89 -104.49 gain 89 141 -106.64 gain 141 89 -104.04 gain 89 142 -105.22 gain 142 89 -103.78 gain 89 143 -105.60 gain 143 89 -106.61 gain 89 144 -97.46 gain 144 89 -94.37 gain 89 145 -100.78 gain 145 89 -102.24 gain 89 146 -109.09 gain 146 89 -106.99 gain 89 147 -100.09 gain 147 89 -99.18 gain 89 148 -89.99 gain 148 89 -89.61 gain 89 149 -93.26 gain 149 89 -89.26 gain 89 150 -103.40 gain 150 89 -102.77 gain 89 151 -116.18 gain 151 89 -118.03 gain 89 152 -111.89 gain 152 89 -112.10 gain 89 153 -108.91 gain 153 89 -108.82 gain 89 154 -102.49 gain 154 89 -103.53 gain 89 155 -112.66 gain 155 89 -111.00 gain 89 156 -101.53 gain 156 89 -100.99 gain 89 157 -106.54 gain 157 89 -107.30 gain 89 158 -100.30 gain 158 89 -103.03 gain 89 159 -95.73 gain 159 89 -92.49 gain 89 160 -105.93 gain 160 89 -104.08 gain 89 161 -94.60 gain 161 89 -93.80 gain 89 162 -100.11 gain 162 89 -98.94 gain 89 163 -98.20 gain 163 89 -94.45 gain 89 164 -100.54 gain 164 89 -104.01 gain 89 165 -111.26 gain 165 89 -112.09 gain 89 166 -106.90 gain 166 89 -109.39 gain 89 167 -110.59 gain 167 89 -111.90 gain 89 168 -108.38 gain 168 89 -108.76 gain 89 169 -112.01 gain 169 89 -108.90 gain 89 170 -109.88 gain 170 89 -107.71 gain 89 171 -107.84 gain 171 89 -106.24 gain 89 172 -108.60 gain 172 89 -109.80 gain 89 173 -107.35 gain 173 89 -102.87 gain 89 174 -98.67 gain 174 89 -100.15 gain 89 175 -98.91 gain 175 89 -92.18 gain 89 176 -91.28 gain 176 89 -88.77 gain 89 177 -101.26 gain 177 89 -101.12 gain 89 178 -99.03 gain 178 89 -96.50 gain 89 179 -98.93 gain 179 89 -99.44 gain 89 180 -111.48 gain 180 89 -110.73 gain 89 181 -109.21 gain 181 89 -111.86 gain 89 182 -109.39 gain 182 89 -108.17 gain 89 183 -104.94 gain 183 89 -99.60 gain 89 184 -105.25 gain 184 89 -106.14 gain 89 185 -107.40 gain 185 89 -106.79 gain 89 186 -107.89 gain 186 89 -107.99 gain 89 187 -110.75 gain 187 89 -110.86 gain 89 188 -104.51 gain 188 89 -109.07 gain 89 189 -104.03 gain 189 89 -104.65 gain 89 190 -104.17 gain 190 89 -97.62 gain 89 191 -95.14 gain 191 89 -91.76 gain 89 192 -105.71 gain 192 89 -106.00 gain 89 193 -95.46 gain 193 89 -91.78 gain 89 194 -100.67 gain 194 89 -96.88 gain 89 195 -110.09 gain 195 89 -104.27 gain 89 196 -104.87 gain 196 89 -106.71 gain 89 197 -119.94 gain 197 89 -119.28 gain 89 198 -113.94 gain 198 89 -115.92 gain 89 199 -111.41 gain 199 89 -107.41 gain 89 200 -108.84 gain 200 89 -106.76 gain 89 201 -110.37 gain 201 89 -111.38 gain 89 202 -101.18 gain 202 89 -100.48 gain 89 203 -110.84 gain 203 89 -110.24 gain 89 204 -108.16 gain 204 89 -105.78 gain 89 205 -104.72 gain 205 89 -102.00 gain 89 206 -99.75 gain 206 89 -98.36 gain 89 207 -104.35 gain 207 89 -100.70 gain 89 208 -113.28 gain 208 89 -112.93 gain 89 209 -101.63 gain 209 89 -100.32 gain 89 210 -107.89 gain 210 89 -110.59 gain 89 211 -120.36 gain 211 89 -120.44 gain 89 212 -113.72 gain 212 89 -112.36 gain 89 213 -118.68 gain 213 89 -120.05 gain 89 214 -117.38 gain 214 89 -116.94 gain 89 215 -102.54 gain 215 89 -103.91 gain 89 216 -108.95 gain 216 89 -107.22 gain 89 217 -109.69 gain 217 89 -112.41 gain 89 218 -113.09 gain 218 89 -117.12 gain 89 219 -110.32 gain 219 89 -111.93 gain 89 220 -104.85 gain 220 89 -103.57 gain 89 221 -105.22 gain 221 89 -104.93 gain 89 222 -117.51 gain 222 89 -113.80 gain 89 223 -101.26 gain 223 89 -99.84 gain 89 224 -99.98 gain 224 89 -95.49 gain 90 91 -81.67 gain 91 90 -77.26 gain 90 92 -88.85 gain 92 90 -88.01 gain 90 93 -96.86 gain 93 90 -89.93 gain 90 94 -98.91 gain 94 90 -94.41 gain 90 95 -103.40 gain 95 90 -101.95 gain 90 96 -103.21 gain 96 90 -98.03 gain 90 97 -98.78 gain 97 90 -94.87 gain 90 98 -111.51 gain 98 90 -104.78 gain 90 99 -103.31 gain 99 90 -100.67 gain 90 100 -113.46 gain 100 90 -108.66 gain 90 101 -108.51 gain 101 90 -102.37 gain 90 102 -119.33 gain 102 90 -113.85 gain 90 103 -117.72 gain 103 90 -111.47 gain 90 104 -111.99 gain 104 90 -102.17 gain 90 105 -79.97 gain 105 90 -75.56 gain 90 106 -79.66 gain 106 90 -74.55 gain 90 107 -83.29 gain 107 90 -81.20 gain 90 108 -96.17 gain 108 90 -92.14 gain 90 109 -92.50 gain 109 90 -85.31 gain 90 110 -106.25 gain 110 90 -101.30 gain 90 111 -97.52 gain 111 90 -89.77 gain 90 112 -109.26 gain 112 90 -103.51 gain 90 113 -105.04 gain 113 90 -106.23 gain 90 114 -110.15 gain 114 90 -106.97 gain 90 115 -111.57 gain 115 90 -109.25 gain 90 116 -104.19 gain 116 90 -97.90 gain 90 117 -108.45 gain 117 90 -101.99 gain 90 118 -118.35 gain 118 90 -120.07 gain 90 119 -111.67 gain 119 90 -104.94 gain 90 120 -89.18 gain 120 90 -82.55 gain 90 121 -98.91 gain 121 90 -95.03 gain 90 122 -93.01 gain 122 90 -91.70 gain 90 123 -93.10 gain 123 90 -92.04 gain 90 124 -107.88 gain 124 90 -100.43 gain 90 125 -100.42 gain 125 90 -94.90 gain 90 126 -109.87 gain 126 90 -109.24 gain 90 127 -107.61 gain 127 90 -101.72 gain 90 128 -104.63 gain 128 90 -101.81 gain 90 129 -109.98 gain 129 90 -104.37 gain 90 130 -113.43 gain 130 90 -110.00 gain 90 131 -112.95 gain 131 90 -107.88 gain 90 132 -112.42 gain 132 90 -103.62 gain 90 133 -120.35 gain 133 90 -115.98 gain 90 134 -112.29 gain 134 90 -105.92 gain 90 135 -91.39 gain 135 90 -80.61 gain 90 136 -95.85 gain 136 90 -93.84 gain 90 137 -96.34 gain 137 90 -90.99 gain 90 138 -103.75 gain 138 90 -100.41 gain 90 139 -98.41 gain 139 90 -96.78 gain 90 140 -109.26 gain 140 90 -107.44 gain 90 141 -105.36 gain 141 90 -99.23 gain 90 142 -104.43 gain 142 90 -99.45 gain 90 143 -107.10 gain 143 90 -104.57 gain 90 144 -111.97 gain 144 90 -105.34 gain 90 145 -110.73 gain 145 90 -108.65 gain 90 146 -115.82 gain 146 90 -110.19 gain 90 147 -114.41 gain 147 90 -109.96 gain 90 148 -114.51 gain 148 90 -110.60 gain 90 149 -114.77 gain 149 90 -107.22 gain 90 150 -108.21 gain 150 90 -104.05 gain 90 151 -96.16 gain 151 90 -94.48 gain 90 152 -96.63 gain 152 90 -93.31 gain 90 153 -94.09 gain 153 90 -90.47 gain 90 154 -98.46 gain 154 90 -95.97 gain 90 155 -109.38 gain 155 90 -104.18 gain 90 156 -99.81 gain 156 90 -95.74 gain 90 157 -109.15 gain 157 90 -106.38 gain 90 158 -111.68 gain 158 90 -110.87 gain 90 159 -103.91 gain 159 90 -97.15 gain 90 160 -113.85 gain 160 90 -108.46 gain 90 161 -110.10 gain 161 90 -105.76 gain 90 162 -112.67 gain 162 90 -107.96 gain 90 163 -112.60 gain 163 90 -105.31 gain 90 164 -117.13 gain 164 90 -117.07 gain 90 165 -100.13 gain 165 90 -97.42 gain 90 166 -102.91 gain 166 90 -101.86 gain 90 167 -109.55 gain 167 90 -107.33 gain 90 168 -109.67 gain 168 90 -106.51 gain 90 169 -106.28 gain 169 90 -99.63 gain 90 170 -102.79 gain 170 90 -97.09 gain 90 171 -109.42 gain 171 90 -104.28 gain 90 172 -106.37 gain 172 90 -104.04 gain 90 173 -110.84 gain 173 90 -102.83 gain 90 174 -112.93 gain 174 90 -110.87 gain 90 175 -106.02 gain 175 90 -95.76 gain 90 176 -115.96 gain 176 90 -109.93 gain 90 177 -119.58 gain 177 90 -115.91 gain 90 178 -115.98 gain 178 90 -109.91 gain 90 179 -117.27 gain 179 90 -114.25 gain 90 180 -109.83 gain 180 90 -105.54 gain 90 181 -105.88 gain 181 90 -104.99 gain 90 182 -106.88 gain 182 90 -102.13 gain 90 183 -103.64 gain 183 90 -94.77 gain 90 184 -102.71 gain 184 90 -100.07 gain 90 185 -99.93 gain 185 90 -95.79 gain 90 186 -110.90 gain 186 90 -107.46 gain 90 187 -114.39 gain 187 90 -110.97 gain 90 188 -116.82 gain 188 90 -117.84 gain 90 189 -113.78 gain 189 90 -110.87 gain 90 190 -102.20 gain 190 90 -92.11 gain 90 191 -118.12 gain 191 90 -111.21 gain 90 192 -107.56 gain 192 90 -104.32 gain 90 193 -113.37 gain 193 90 -106.16 gain 90 194 -123.04 gain 194 90 -115.72 gain 90 195 -108.38 gain 195 90 -99.02 gain 90 196 -112.98 gain 196 90 -111.29 gain 90 197 -110.65 gain 197 90 -106.46 gain 90 198 -102.56 gain 198 90 -101.01 gain 90 199 -99.73 gain 199 90 -92.20 gain 90 200 -101.87 gain 200 90 -96.25 gain 90 201 -110.86 gain 201 90 -108.33 gain 90 202 -110.24 gain 202 90 -106.00 gain 90 203 -112.87 gain 203 90 -108.74 gain 90 204 -108.31 gain 204 90 -102.39 gain 90 205 -115.03 gain 205 90 -108.78 gain 90 206 -109.91 gain 206 90 -104.98 gain 90 207 -107.57 gain 207 90 -100.39 gain 90 208 -112.89 gain 208 90 -109.01 gain 90 209 -111.90 gain 209 90 -107.06 gain 90 210 -95.74 gain 210 90 -94.90 gain 90 211 -102.98 gain 211 90 -99.54 gain 90 212 -106.49 gain 212 90 -101.59 gain 90 213 -111.61 gain 213 90 -109.45 gain 90 214 -107.18 gain 214 90 -103.20 gain 90 215 -109.44 gain 215 90 -107.27 gain 90 216 -106.22 gain 216 90 -100.95 gain 90 217 -112.76 gain 217 90 -111.94 gain 90 218 -113.85 gain 218 90 -114.34 gain 90 219 -114.46 gain 219 90 -112.53 gain 90 220 -117.22 gain 220 90 -112.41 gain 90 221 -109.45 gain 221 90 -105.62 gain 90 222 -115.63 gain 222 90 -108.38 gain 90 223 -118.14 gain 223 90 -113.18 gain 90 224 -113.23 gain 224 90 -105.20 gain 91 92 -77.48 gain 92 91 -81.05 gain 91 93 -90.26 gain 93 91 -87.74 gain 91 94 -91.83 gain 94 91 -91.74 gain 91 95 -94.05 gain 95 91 -97.01 gain 91 96 -100.15 gain 96 91 -99.38 gain 91 97 -102.87 gain 97 91 -103.37 gain 91 98 -104.05 gain 98 91 -101.73 gain 91 99 -104.06 gain 99 91 -105.83 gain 91 100 -103.56 gain 100 91 -103.17 gain 91 101 -105.66 gain 101 91 -103.94 gain 91 102 -106.07 gain 102 91 -105.00 gain 91 103 -110.85 gain 103 91 -109.01 gain 91 104 -105.27 gain 104 91 -99.86 gain 91 105 -72.71 gain 105 91 -72.71 gain 91 106 -75.69 gain 106 91 -74.99 gain 91 107 -80.84 gain 107 91 -83.16 gain 91 108 -87.65 gain 108 91 -88.03 gain 91 109 -96.05 gain 109 91 -93.27 gain 91 110 -93.69 gain 110 91 -93.15 gain 91 111 -97.79 gain 111 91 -94.45 gain 91 112 -101.90 gain 112 91 -100.57 gain 91 113 -106.85 gain 113 91 -112.45 gain 91 114 -100.66 gain 114 91 -101.90 gain 91 115 -97.44 gain 115 91 -99.53 gain 91 116 -102.91 gain 116 91 -101.03 gain 91 117 -105.46 gain 117 91 -103.42 gain 91 118 -106.88 gain 118 91 -113.02 gain 91 119 -111.28 gain 119 91 -108.97 gain 91 120 -80.89 gain 120 91 -78.67 gain 91 121 -82.89 gain 121 91 -83.42 gain 91 122 -93.42 gain 122 91 -96.52 gain 91 123 -88.08 gain 123 91 -91.44 gain 91 124 -89.16 gain 124 91 -86.13 gain 91 125 -99.51 gain 125 91 -98.41 gain 91 126 -92.80 gain 126 91 -96.58 gain 91 127 -107.45 gain 127 91 -105.98 gain 91 128 -105.94 gain 128 91 -107.53 gain 91 129 -102.30 gain 129 91 -101.11 gain 91 130 -102.20 gain 130 91 -103.19 gain 91 131 -110.96 gain 131 91 -110.31 gain 91 132 -105.07 gain 132 91 -100.69 gain 91 133 -97.36 gain 133 91 -97.40 gain 91 134 -117.19 gain 134 91 -115.24 gain 91 135 -91.41 gain 135 91 -85.04 gain 91 136 -92.27 gain 136 91 -94.68 gain 91 137 -94.61 gain 137 91 -93.67 gain 91 138 -95.50 gain 138 91 -96.57 gain 91 139 -87.43 gain 139 91 -90.21 gain 91 140 -98.86 gain 140 91 -101.45 gain 91 141 -92.33 gain 141 91 -90.61 gain 91 142 -98.65 gain 142 91 -98.08 gain 91 143 -99.41 gain 143 91 -101.30 gain 91 144 -108.33 gain 144 91 -106.11 gain 91 145 -108.66 gain 145 91 -110.99 gain 91 146 -102.73 gain 146 91 -101.51 gain 91 147 -106.94 gain 147 91 -106.91 gain 91 148 -107.08 gain 148 91 -107.57 gain 91 149 -102.10 gain 149 91 -98.97 gain 91 150 -89.49 gain 150 91 -89.74 gain 91 151 -88.18 gain 151 91 -90.91 gain 91 152 -91.63 gain 152 91 -92.72 gain 91 153 -97.96 gain 153 91 -98.75 gain 91 154 -105.86 gain 154 91 -107.78 gain 91 155 -99.84 gain 155 91 -99.06 gain 91 156 -99.12 gain 156 91 -99.46 gain 91 157 -109.77 gain 157 91 -111.41 gain 91 158 -103.28 gain 158 91 -106.88 gain 91 159 -98.78 gain 159 91 -96.42 gain 91 160 -107.62 gain 160 91 -106.64 gain 91 161 -107.09 gain 161 91 -107.17 gain 91 162 -111.65 gain 162 91 -111.35 gain 91 163 -112.36 gain 163 91 -109.49 gain 91 164 -102.95 gain 164 91 -107.30 gain 91 165 -94.75 gain 165 91 -96.46 gain 91 166 -92.42 gain 166 91 -95.79 gain 91 167 -95.89 gain 167 91 -98.08 gain 91 168 -100.37 gain 168 91 -101.62 gain 91 169 -98.23 gain 169 91 -96.00 gain 91 170 -105.34 gain 170 91 -104.04 gain 91 171 -100.22 gain 171 91 -99.50 gain 91 172 -99.01 gain 172 91 -101.09 gain 91 173 -98.02 gain 173 91 -94.42 gain 91 174 -98.88 gain 174 91 -101.23 gain 91 175 -103.33 gain 175 91 -97.48 gain 91 176 -112.70 gain 176 91 -111.07 gain 91 177 -109.04 gain 177 91 -109.78 gain 91 178 -112.56 gain 178 91 -110.91 gain 91 179 -103.66 gain 179 91 -105.05 gain 91 180 -97.92 gain 180 91 -98.05 gain 91 181 -101.93 gain 181 91 -105.45 gain 91 182 -104.26 gain 182 91 -103.92 gain 91 183 -96.80 gain 183 91 -92.34 gain 91 184 -100.67 gain 184 91 -102.43 gain 91 185 -98.59 gain 185 91 -98.86 gain 91 186 -103.47 gain 186 91 -104.44 gain 91 187 -102.78 gain 187 91 -103.77 gain 91 188 -102.44 gain 188 91 -107.88 gain 91 189 -105.30 gain 189 91 -106.80 gain 91 190 -105.58 gain 190 91 -99.91 gain 91 191 -106.16 gain 191 91 -103.66 gain 91 192 -111.28 gain 192 91 -112.45 gain 91 193 -114.20 gain 193 91 -111.40 gain 91 194 -113.14 gain 194 91 -110.22 gain 91 195 -104.65 gain 195 91 -99.70 gain 91 196 -101.20 gain 196 91 -103.93 gain 91 197 -102.36 gain 197 91 -102.58 gain 91 198 -104.65 gain 198 91 -107.51 gain 91 199 -95.06 gain 199 91 -91.94 gain 91 200 -103.18 gain 200 91 -101.97 gain 91 201 -104.22 gain 201 91 -106.11 gain 91 202 -100.30 gain 202 91 -100.48 gain 91 203 -101.38 gain 203 91 -101.66 gain 91 204 -111.90 gain 204 91 -110.39 gain 91 205 -105.64 gain 205 91 -103.80 gain 91 206 -111.26 gain 206 91 -110.75 gain 91 207 -112.70 gain 207 91 -109.93 gain 91 208 -110.62 gain 208 91 -111.15 gain 91 209 -111.22 gain 209 91 -110.79 gain 91 210 -108.31 gain 210 91 -111.88 gain 91 211 -103.52 gain 211 91 -104.48 gain 91 212 -100.00 gain 212 91 -99.51 gain 91 213 -99.45 gain 213 91 -101.70 gain 91 214 -102.41 gain 214 91 -102.84 gain 91 215 -105.03 gain 215 91 -107.28 gain 91 216 -103.80 gain 216 91 -102.95 gain 91 217 -97.08 gain 217 91 -100.67 gain 91 218 -103.37 gain 218 91 -108.28 gain 91 219 -111.95 gain 219 91 -114.43 gain 91 220 -108.94 gain 220 91 -108.54 gain 91 221 -112.24 gain 221 91 -112.83 gain 91 222 -106.10 gain 222 91 -103.27 gain 91 223 -109.27 gain 223 91 -108.72 gain 91 224 -105.15 gain 224 91 -101.53 gain 92 93 -79.30 gain 93 92 -73.21 gain 92 94 -90.42 gain 94 92 -86.77 gain 92 95 -95.67 gain 95 92 -95.06 gain 92 96 -97.98 gain 96 92 -93.64 gain 92 97 -107.57 gain 97 92 -104.50 gain 92 98 -101.65 gain 98 92 -95.76 gain 92 99 -108.38 gain 99 92 -106.58 gain 92 100 -107.79 gain 100 92 -103.84 gain 92 101 -106.03 gain 101 92 -100.73 gain 92 102 -111.31 gain 102 92 -106.67 gain 92 103 -112.89 gain 103 92 -107.49 gain 92 104 -110.51 gain 104 92 -101.54 gain 92 105 -92.77 gain 105 92 -89.20 gain 92 106 -83.96 gain 106 92 -79.70 gain 92 107 -79.46 gain 107 92 -78.21 gain 92 108 -84.86 gain 108 92 -81.67 gain 92 109 -86.40 gain 109 92 -80.06 gain 92 110 -94.48 gain 110 92 -90.37 gain 92 111 -103.43 gain 111 92 -96.52 gain 92 112 -102.74 gain 112 92 -97.83 gain 92 113 -109.38 gain 113 92 -111.42 gain 92 114 -103.53 gain 114 92 -101.20 gain 92 115 -108.55 gain 115 92 -107.07 gain 92 116 -106.98 gain 116 92 -101.53 gain 92 117 -105.37 gain 117 92 -99.76 gain 92 118 -115.25 gain 118 92 -117.82 gain 92 119 -111.21 gain 119 92 -105.32 gain 92 120 -96.85 gain 120 92 -91.07 gain 92 121 -88.44 gain 121 92 -85.40 gain 92 122 -88.17 gain 122 92 -87.71 gain 92 123 -86.82 gain 123 92 -86.61 gain 92 124 -93.26 gain 124 92 -86.65 gain 92 125 -94.95 gain 125 92 -90.28 gain 92 126 -102.14 gain 126 92 -102.34 gain 92 127 -103.59 gain 127 92 -98.55 gain 92 128 -99.08 gain 128 92 -97.10 gain 92 129 -108.41 gain 129 92 -103.64 gain 92 130 -102.83 gain 130 92 -100.25 gain 92 131 -107.04 gain 131 92 -102.81 gain 92 132 -105.38 gain 132 92 -97.43 gain 92 133 -108.24 gain 133 92 -104.72 gain 92 134 -103.91 gain 134 92 -98.39 gain 92 135 -88.90 gain 135 92 -78.96 gain 92 136 -98.53 gain 136 92 -97.37 gain 92 137 -93.17 gain 137 92 -88.67 gain 92 138 -93.57 gain 138 92 -91.08 gain 92 139 -94.56 gain 139 92 -93.78 gain 92 140 -89.62 gain 140 92 -88.65 gain 92 141 -99.65 gain 141 92 -94.36 gain 92 142 -101.08 gain 142 92 -96.94 gain 92 143 -96.57 gain 143 92 -94.88 gain 92 144 -101.11 gain 144 92 -95.32 gain 92 145 -103.67 gain 145 92 -102.43 gain 92 146 -103.66 gain 146 92 -98.87 gain 92 147 -115.27 gain 147 92 -111.67 gain 92 148 -102.70 gain 148 92 -99.62 gain 92 149 -113.66 gain 149 92 -106.96 gain 92 150 -105.58 gain 150 92 -102.26 gain 92 151 -103.47 gain 151 92 -102.64 gain 92 152 -93.27 gain 152 92 -90.80 gain 92 153 -94.48 gain 153 92 -91.70 gain 92 154 -95.11 gain 154 92 -93.46 gain 92 155 -100.13 gain 155 92 -95.77 gain 92 156 -103.13 gain 156 92 -99.90 gain 92 157 -101.15 gain 157 92 -99.22 gain 92 158 -104.59 gain 158 92 -104.62 gain 92 159 -102.23 gain 159 92 -96.31 gain 92 160 -105.47 gain 160 92 -100.92 gain 92 161 -118.33 gain 161 92 -114.84 gain 92 162 -103.54 gain 162 92 -99.68 gain 92 163 -111.76 gain 163 92 -105.32 gain 92 164 -115.57 gain 164 92 -116.35 gain 92 165 -99.92 gain 165 92 -98.06 gain 92 166 -93.64 gain 166 92 -93.44 gain 92 167 -98.75 gain 167 92 -97.38 gain 92 168 -96.37 gain 168 92 -94.06 gain 92 169 -104.68 gain 169 92 -98.89 gain 92 170 -101.67 gain 170 92 -96.81 gain 92 171 -106.66 gain 171 92 -102.37 gain 92 172 -104.81 gain 172 92 -103.32 gain 92 173 -108.32 gain 173 92 -101.15 gain 92 174 -103.38 gain 174 92 -102.16 gain 92 175 -107.69 gain 175 92 -98.28 gain 92 176 -111.19 gain 176 92 -106.00 gain 92 177 -119.95 gain 177 92 -117.12 gain 92 178 -109.77 gain 178 92 -104.54 gain 92 179 -113.48 gain 179 92 -111.29 gain 92 180 -108.29 gain 180 92 -104.85 gain 92 181 -102.59 gain 181 92 -102.55 gain 92 182 -104.24 gain 182 92 -100.33 gain 92 183 -98.61 gain 183 92 -90.59 gain 92 184 -102.75 gain 184 92 -100.96 gain 92 185 -100.41 gain 185 92 -97.11 gain 92 186 -101.09 gain 186 92 -98.49 gain 92 187 -104.09 gain 187 92 -101.52 gain 92 188 -112.97 gain 188 92 -114.84 gain 92 189 -105.63 gain 189 92 -103.56 gain 92 190 -104.02 gain 190 92 -94.78 gain 92 191 -113.26 gain 191 92 -107.19 gain 92 192 -113.13 gain 192 92 -110.73 gain 92 193 -111.75 gain 193 92 -105.38 gain 92 194 -117.86 gain 194 92 -111.38 gain 92 195 -108.13 gain 195 92 -99.62 gain 92 196 -94.95 gain 196 92 -94.11 gain 92 197 -106.02 gain 197 92 -102.67 gain 92 198 -102.60 gain 198 92 -101.89 gain 92 199 -109.78 gain 199 92 -103.09 gain 92 200 -106.97 gain 200 92 -102.19 gain 92 201 -103.25 gain 201 92 -101.57 gain 92 202 -100.18 gain 202 92 -96.79 gain 92 203 -100.22 gain 203 92 -96.93 gain 92 204 -110.91 gain 204 92 -105.84 gain 92 205 -110.99 gain 205 92 -105.59 gain 92 206 -105.55 gain 206 92 -101.47 gain 92 207 -107.54 gain 207 92 -101.21 gain 92 208 -110.08 gain 208 92 -107.05 gain 92 209 -111.52 gain 209 92 -107.52 gain 92 210 -104.07 gain 210 92 -104.08 gain 92 211 -97.98 gain 211 92 -95.37 gain 92 212 -107.41 gain 212 92 -103.35 gain 92 213 -104.49 gain 213 92 -103.17 gain 92 214 -107.67 gain 214 92 -104.54 gain 92 215 -101.03 gain 215 92 -99.71 gain 92 216 -103.02 gain 216 92 -98.59 gain 92 217 -111.57 gain 217 92 -111.59 gain 92 218 -111.56 gain 218 92 -112.90 gain 92 219 -110.95 gain 219 92 -109.86 gain 92 220 -109.08 gain 220 92 -105.11 gain 92 221 -111.10 gain 221 92 -108.12 gain 92 222 -111.02 gain 222 92 -104.62 gain 92 223 -117.87 gain 223 92 -113.76 gain 92 224 -119.24 gain 224 92 -112.05 gain 93 94 -73.82 gain 94 93 -76.25 gain 93 95 -81.48 gain 95 93 -86.95 gain 93 96 -93.70 gain 96 93 -95.45 gain 93 97 -82.02 gain 97 93 -85.04 gain 93 98 -93.98 gain 98 93 -94.18 gain 93 99 -95.97 gain 99 93 -100.26 gain 93 100 -94.55 gain 100 93 -96.68 gain 93 101 -100.68 gain 101 93 -101.48 gain 93 102 -95.05 gain 102 93 -96.51 gain 93 103 -108.06 gain 103 93 -108.74 gain 93 104 -106.31 gain 104 93 -103.42 gain 93 105 -89.77 gain 105 93 -92.28 gain 93 106 -85.56 gain 106 93 -87.38 gain 93 107 -75.09 gain 107 93 -79.93 gain 93 108 -77.76 gain 108 93 -80.66 gain 93 109 -76.75 gain 109 93 -76.49 gain 93 110 -81.11 gain 110 93 -83.09 gain 93 111 -87.80 gain 111 93 -86.98 gain 93 112 -85.42 gain 112 93 -86.60 gain 93 113 -100.51 gain 113 93 -108.63 gain 93 114 -92.58 gain 114 93 -96.33 gain 93 115 -95.81 gain 115 93 -100.42 gain 93 116 -102.17 gain 116 93 -102.80 gain 93 117 -103.79 gain 117 93 -104.27 gain 93 118 -109.52 gain 118 93 -118.17 gain 93 119 -103.74 gain 119 93 -103.94 gain 93 120 -92.40 gain 120 93 -92.71 gain 93 121 -86.13 gain 121 93 -89.18 gain 93 122 -92.19 gain 122 93 -97.81 gain 93 123 -84.88 gain 123 93 -90.76 gain 93 124 -83.41 gain 124 93 -82.88 gain 93 125 -82.73 gain 125 93 -84.14 gain 93 126 -93.29 gain 126 93 -99.58 gain 93 127 -99.12 gain 127 93 -100.17 gain 93 128 -96.22 gain 128 93 -100.33 gain 93 129 -102.00 gain 129 93 -103.32 gain 93 130 -101.23 gain 130 93 -104.73 gain 93 131 -102.83 gain 131 93 -104.69 gain 93 132 -98.70 gain 132 93 -96.83 gain 93 133 -96.43 gain 133 93 -99.00 gain 93 134 -108.89 gain 134 93 -109.45 gain 93 135 -91.49 gain 135 93 -87.63 gain 93 136 -91.42 gain 136 93 -96.34 gain 93 137 -88.65 gain 137 93 -90.23 gain 93 138 -84.27 gain 138 93 -87.86 gain 93 139 -82.16 gain 139 93 -87.47 gain 93 140 -91.76 gain 140 93 -96.87 gain 93 141 -86.51 gain 141 93 -87.30 gain 93 142 -94.52 gain 142 93 -96.47 gain 93 143 -97.51 gain 143 93 -101.91 gain 93 144 -102.30 gain 144 93 -102.60 gain 93 145 -102.90 gain 145 93 -107.75 gain 93 146 -102.49 gain 146 93 -103.79 gain 93 147 -110.72 gain 147 93 -113.21 gain 93 148 -103.35 gain 148 93 -106.36 gain 93 149 -102.89 gain 149 93 -102.28 gain 93 150 -93.09 gain 150 93 -95.86 gain 93 151 -91.82 gain 151 93 -97.07 gain 93 152 -91.37 gain 152 93 -94.98 gain 93 153 -93.86 gain 153 93 -97.17 gain 93 154 -89.03 gain 154 93 -93.47 gain 93 155 -87.50 gain 155 93 -89.23 gain 93 156 -90.95 gain 156 93 -93.81 gain 93 157 -102.10 gain 157 93 -106.26 gain 93 158 -94.77 gain 158 93 -100.90 gain 93 159 -100.38 gain 159 93 -100.54 gain 93 160 -99.76 gain 160 93 -101.29 gain 93 161 -101.14 gain 161 93 -103.73 gain 93 162 -98.22 gain 162 93 -100.44 gain 93 163 -108.67 gain 163 93 -108.32 gain 93 164 -106.65 gain 164 93 -113.52 gain 93 165 -98.45 gain 165 93 -102.67 gain 93 166 -90.39 gain 166 93 -96.27 gain 93 167 -89.82 gain 167 93 -94.52 gain 93 168 -91.69 gain 168 93 -95.46 gain 93 169 -94.48 gain 169 93 -94.77 gain 93 170 -92.95 gain 170 93 -94.18 gain 93 171 -97.24 gain 171 93 -99.04 gain 93 172 -99.01 gain 172 93 -103.60 gain 93 173 -94.79 gain 173 93 -93.70 gain 93 174 -96.99 gain 174 93 -101.87 gain 93 175 -105.53 gain 175 93 -102.20 gain 93 176 -108.94 gain 176 93 -109.83 gain 93 177 -98.55 gain 177 93 -101.80 gain 93 178 -102.17 gain 178 93 -103.03 gain 93 179 -105.79 gain 179 93 -109.69 gain 93 180 -97.83 gain 180 93 -100.47 gain 93 181 -98.16 gain 181 93 -104.20 gain 93 182 -92.77 gain 182 93 -94.94 gain 93 183 -95.54 gain 183 93 -93.60 gain 93 184 -93.84 gain 184 93 -98.12 gain 93 185 -101.45 gain 185 93 -104.23 gain 93 186 -102.36 gain 186 93 -105.85 gain 93 187 -107.23 gain 187 93 -110.74 gain 93 188 -100.76 gain 188 93 -108.71 gain 93 189 -92.87 gain 189 93 -96.89 gain 93 190 -98.85 gain 190 93 -95.70 gain 93 191 -99.86 gain 191 93 -99.88 gain 93 192 -104.61 gain 192 93 -108.30 gain 93 193 -98.46 gain 193 93 -98.17 gain 93 194 -110.06 gain 194 93 -109.67 gain 93 195 -99.92 gain 195 93 -97.50 gain 93 196 -95.17 gain 196 93 -100.42 gain 93 197 -102.44 gain 197 93 -105.17 gain 93 198 -97.58 gain 198 93 -102.96 gain 93 199 -97.53 gain 199 93 -96.93 gain 93 200 -97.93 gain 200 93 -99.24 gain 93 201 -93.45 gain 201 93 -97.85 gain 93 202 -104.61 gain 202 93 -107.30 gain 93 203 -103.78 gain 203 93 -106.58 gain 93 204 -108.89 gain 204 93 -109.91 gain 93 205 -101.79 gain 205 93 -102.47 gain 93 206 -104.67 gain 206 93 -106.67 gain 93 207 -103.58 gain 207 93 -103.33 gain 93 208 -109.92 gain 208 93 -112.97 gain 93 209 -103.32 gain 209 93 -105.41 gain 93 210 -104.23 gain 210 93 -110.31 gain 93 211 -102.91 gain 211 93 -106.39 gain 93 212 -98.75 gain 212 93 -100.78 gain 93 213 -95.65 gain 213 93 -100.42 gain 93 214 -101.95 gain 214 93 -104.90 gain 93 215 -97.54 gain 215 93 -102.31 gain 93 216 -99.55 gain 216 93 -101.21 gain 93 217 -100.59 gain 217 93 -106.70 gain 93 218 -95.28 gain 218 93 -102.71 gain 93 219 -101.20 gain 219 93 -106.20 gain 93 220 -104.51 gain 220 93 -106.63 gain 93 221 -103.87 gain 221 93 -106.97 gain 93 222 -104.05 gain 222 93 -103.74 gain 93 223 -103.94 gain 223 93 -105.91 gain 93 224 -110.95 gain 224 93 -109.85 gain 94 95 -70.23 gain 95 94 -73.27 gain 94 96 -86.69 gain 96 94 -86.01 gain 94 97 -85.54 gain 97 94 -86.13 gain 94 98 -96.03 gain 98 94 -93.80 gain 94 99 -97.01 gain 99 94 -98.86 gain 94 100 -97.09 gain 100 94 -96.78 gain 94 101 -100.98 gain 101 94 -99.33 gain 94 102 -102.37 gain 102 94 -101.39 gain 94 103 -103.53 gain 103 94 -101.78 gain 94 104 -108.52 gain 104 94 -103.20 gain 94 105 -99.71 gain 105 94 -99.79 gain 94 106 -90.92 gain 106 94 -90.31 gain 94 107 -87.66 gain 107 94 -90.07 gain 94 108 -83.27 gain 108 94 -83.73 gain 94 109 -78.80 gain 109 94 -76.11 gain 94 110 -84.31 gain 110 94 -83.86 gain 94 111 -86.30 gain 111 94 -83.04 gain 94 112 -92.66 gain 112 94 -91.41 gain 94 113 -97.85 gain 113 94 -103.53 gain 94 114 -95.83 gain 114 94 -97.15 gain 94 115 -98.75 gain 115 94 -100.93 gain 94 116 -100.25 gain 116 94 -98.45 gain 94 117 -103.11 gain 117 94 -101.16 gain 94 118 -109.89 gain 118 94 -116.11 gain 94 119 -106.38 gain 119 94 -104.15 gain 94 120 -88.66 gain 120 94 -86.53 gain 94 121 -93.71 gain 121 94 -94.33 gain 94 122 -89.59 gain 122 94 -92.77 gain 94 123 -86.41 gain 123 94 -89.85 gain 94 124 -79.64 gain 124 94 -76.69 gain 94 125 -89.88 gain 125 94 -88.86 gain 94 126 -92.36 gain 126 94 -96.22 gain 94 127 -92.95 gain 127 94 -91.57 gain 94 128 -95.81 gain 128 94 -97.48 gain 94 129 -99.06 gain 129 94 -97.95 gain 94 130 -95.91 gain 130 94 -96.98 gain 94 131 -101.64 gain 131 94 -101.07 gain 94 132 -102.55 gain 132 94 -98.25 gain 94 133 -104.11 gain 133 94 -104.24 gain 94 134 -104.82 gain 134 94 -102.95 gain 94 135 -95.80 gain 135 94 -89.51 gain 94 136 -101.86 gain 136 94 -104.35 gain 94 137 -87.25 gain 137 94 -86.40 gain 94 138 -89.93 gain 138 94 -91.09 gain 94 139 -86.69 gain 139 94 -89.55 gain 94 140 -87.10 gain 140 94 -89.78 gain 94 141 -92.89 gain 141 94 -91.26 gain 94 142 -94.08 gain 142 94 -93.59 gain 94 143 -94.19 gain 143 94 -96.16 gain 94 144 -95.56 gain 144 94 -93.43 gain 94 145 -98.28 gain 145 94 -100.70 gain 94 146 -104.87 gain 146 94 -103.73 gain 94 147 -103.39 gain 147 94 -103.44 gain 94 148 -108.75 gain 148 94 -109.33 gain 94 149 -112.61 gain 149 94 -109.57 gain 94 150 -103.78 gain 150 94 -104.12 gain 94 151 -95.42 gain 151 94 -98.24 gain 94 152 -96.89 gain 152 94 -98.07 gain 94 153 -94.34 gain 153 94 -95.21 gain 94 154 -98.09 gain 154 94 -100.09 gain 94 155 -96.74 gain 155 94 -96.04 gain 94 156 -101.03 gain 156 94 -101.46 gain 94 157 -96.89 gain 157 94 -98.62 gain 94 158 -99.32 gain 158 94 -103.02 gain 94 159 -102.75 gain 159 94 -100.47 gain 94 160 -103.23 gain 160 94 -102.33 gain 94 161 -106.75 gain 161 94 -106.91 gain 94 162 -106.28 gain 162 94 -106.07 gain 94 163 -105.50 gain 163 94 -102.71 gain 94 164 -105.89 gain 164 94 -110.33 gain 94 165 -101.79 gain 165 94 -103.58 gain 94 166 -100.46 gain 166 94 -103.91 gain 94 167 -95.38 gain 167 94 -97.65 gain 94 168 -99.06 gain 168 94 -100.40 gain 94 169 -94.22 gain 169 94 -92.07 gain 94 170 -98.95 gain 170 94 -97.74 gain 94 171 -106.75 gain 171 94 -106.12 gain 94 172 -95.34 gain 172 94 -97.50 gain 94 173 -102.27 gain 173 94 -98.75 gain 94 174 -106.90 gain 174 94 -109.33 gain 94 175 -97.20 gain 175 94 -91.43 gain 94 176 -103.25 gain 176 94 -101.71 gain 94 177 -111.25 gain 177 94 -112.07 gain 94 178 -106.12 gain 178 94 -104.55 gain 94 179 -110.13 gain 179 94 -111.60 gain 94 180 -104.71 gain 180 94 -104.91 gain 94 181 -103.25 gain 181 94 -106.86 gain 94 182 -94.27 gain 182 94 -94.01 gain 94 183 -96.30 gain 183 94 -91.93 gain 94 184 -105.16 gain 184 94 -107.01 gain 94 185 -102.86 gain 185 94 -103.21 gain 94 186 -105.85 gain 186 94 -106.91 gain 94 187 -100.81 gain 187 94 -101.89 gain 94 188 -105.66 gain 188 94 -111.19 gain 94 189 -103.87 gain 189 94 -105.45 gain 94 190 -104.31 gain 190 94 -98.73 gain 94 191 -102.80 gain 191 94 -100.38 gain 94 192 -105.36 gain 192 94 -106.62 gain 94 193 -99.95 gain 193 94 -97.23 gain 94 194 -112.10 gain 194 94 -109.27 gain 94 195 -103.28 gain 195 94 -98.43 gain 94 196 -100.74 gain 196 94 -103.56 gain 94 197 -97.91 gain 197 94 -98.21 gain 94 198 -99.40 gain 198 94 -102.34 gain 94 199 -106.30 gain 199 94 -103.27 gain 94 200 -99.96 gain 200 94 -98.84 gain 94 201 -108.42 gain 201 94 -110.39 gain 94 202 -101.33 gain 202 94 -101.59 gain 94 203 -101.50 gain 203 94 -101.86 gain 94 204 -102.88 gain 204 94 -101.46 gain 94 205 -108.17 gain 205 94 -106.42 gain 94 206 -101.13 gain 206 94 -100.71 gain 94 207 -107.89 gain 207 94 -105.21 gain 94 208 -108.41 gain 208 94 -109.03 gain 94 209 -110.21 gain 209 94 -109.87 gain 94 210 -105.18 gain 210 94 -108.83 gain 94 211 -101.17 gain 211 94 -102.22 gain 94 212 -104.96 gain 212 94 -104.56 gain 94 213 -96.79 gain 213 94 -99.13 gain 94 214 -100.97 gain 214 94 -101.48 gain 94 215 -96.48 gain 215 94 -98.81 gain 94 216 -107.09 gain 216 94 -106.32 gain 94 217 -96.73 gain 217 94 -100.40 gain 94 218 -104.86 gain 218 94 -109.85 gain 94 219 -104.68 gain 219 94 -107.25 gain 94 220 -110.69 gain 220 94 -110.38 gain 94 221 -106.56 gain 221 94 -107.23 gain 94 222 -109.20 gain 222 94 -106.45 gain 94 223 -115.52 gain 223 94 -115.06 gain 94 224 -108.98 gain 224 94 -105.45 gain 95 96 -86.37 gain 96 95 -82.64 gain 95 97 -85.40 gain 97 95 -82.95 gain 95 98 -88.55 gain 98 95 -83.27 gain 95 99 -94.17 gain 99 95 -92.98 gain 95 100 -100.43 gain 100 95 -97.08 gain 95 101 -101.96 gain 101 95 -97.28 gain 95 102 -107.34 gain 102 95 -103.31 gain 95 103 -102.75 gain 103 95 -97.96 gain 95 104 -105.63 gain 104 95 -97.27 gain 95 105 -99.44 gain 105 95 -96.48 gain 95 106 -97.01 gain 106 95 -93.36 gain 95 107 -94.76 gain 107 95 -94.12 gain 95 108 -88.94 gain 108 95 -86.37 gain 95 109 -89.05 gain 109 95 -83.32 gain 95 110 -81.04 gain 110 95 -77.55 gain 95 111 -84.37 gain 111 95 -78.07 gain 95 112 -88.88 gain 112 95 -84.59 gain 95 113 -86.12 gain 113 95 -88.77 gain 95 114 -101.23 gain 114 95 -99.50 gain 95 115 -102.37 gain 115 95 -101.50 gain 95 116 -98.58 gain 116 95 -93.74 gain 95 117 -107.28 gain 117 95 -102.28 gain 95 118 -105.89 gain 118 95 -109.06 gain 95 119 -111.05 gain 119 95 -105.78 gain 95 120 -104.91 gain 120 95 -99.74 gain 95 121 -95.92 gain 121 95 -93.50 gain 95 122 -94.88 gain 122 95 -95.02 gain 95 123 -97.18 gain 123 95 -97.58 gain 95 124 -87.78 gain 124 95 -81.78 gain 95 125 -85.45 gain 125 95 -81.39 gain 95 126 -92.99 gain 126 95 -93.81 gain 95 127 -87.21 gain 127 95 -82.79 gain 95 128 -92.80 gain 128 95 -91.43 gain 95 129 -95.96 gain 129 95 -91.80 gain 95 130 -106.17 gain 130 95 -104.20 gain 95 131 -100.07 gain 131 95 -96.46 gain 95 132 -103.32 gain 132 95 -95.98 gain 95 133 -115.06 gain 133 95 -112.15 gain 95 134 -110.90 gain 134 95 -105.98 gain 95 135 -94.15 gain 135 95 -84.82 gain 95 136 -95.12 gain 136 95 -94.56 gain 95 137 -99.17 gain 137 95 -95.28 gain 95 138 -96.10 gain 138 95 -94.22 gain 95 139 -98.87 gain 139 95 -98.70 gain 95 140 -94.45 gain 140 95 -94.08 gain 95 141 -86.16 gain 141 95 -81.48 gain 95 142 -97.75 gain 142 95 -94.22 gain 95 143 -97.14 gain 143 95 -96.07 gain 95 144 -94.32 gain 144 95 -89.15 gain 95 145 -99.73 gain 145 95 -99.11 gain 95 146 -104.53 gain 146 95 -100.35 gain 95 147 -107.72 gain 147 95 -104.73 gain 95 148 -104.95 gain 148 95 -102.49 gain 95 149 -114.22 gain 149 95 -108.14 gain 95 150 -103.29 gain 150 95 -100.58 gain 95 151 -96.10 gain 151 95 -95.87 gain 95 152 -100.56 gain 152 95 -98.69 gain 95 153 -92.38 gain 153 95 -90.22 gain 95 154 -96.00 gain 154 95 -94.96 gain 95 155 -98.02 gain 155 95 -94.27 gain 95 156 -97.02 gain 156 95 -94.41 gain 95 157 -98.45 gain 157 95 -97.14 gain 95 158 -103.87 gain 158 95 -104.52 gain 95 159 -104.96 gain 159 95 -99.65 gain 95 160 -95.43 gain 160 95 -91.50 gain 95 161 -109.24 gain 161 95 -106.36 gain 95 162 -97.22 gain 162 95 -93.96 gain 95 163 -108.58 gain 163 95 -102.75 gain 95 164 -109.79 gain 164 95 -111.19 gain 95 165 -96.79 gain 165 95 -95.54 gain 95 166 -103.54 gain 166 95 -103.95 gain 95 167 -105.47 gain 167 95 -104.71 gain 95 168 -104.25 gain 168 95 -102.55 gain 95 169 -98.83 gain 169 95 -93.64 gain 95 170 -100.13 gain 170 95 -95.88 gain 95 171 -103.25 gain 171 95 -99.57 gain 95 172 -100.12 gain 172 95 -99.24 gain 95 173 -97.44 gain 173 95 -90.88 gain 95 174 -99.03 gain 174 95 -98.43 gain 95 175 -105.04 gain 175 95 -96.24 gain 95 176 -101.31 gain 176 95 -96.73 gain 95 177 -109.14 gain 177 95 -106.92 gain 95 178 -106.41 gain 178 95 -101.80 gain 95 179 -105.56 gain 179 95 -103.99 gain 95 180 -104.50 gain 180 95 -101.67 gain 95 181 -101.24 gain 181 95 -101.80 gain 95 182 -97.99 gain 182 95 -94.69 gain 95 183 -108.30 gain 183 95 -100.89 gain 95 184 -103.88 gain 184 95 -102.70 gain 95 185 -98.85 gain 185 95 -96.16 gain 95 186 -109.14 gain 186 95 -107.15 gain 95 187 -103.78 gain 187 95 -101.82 gain 95 188 -108.33 gain 188 95 -110.81 gain 95 189 -102.25 gain 189 95 -100.78 gain 95 190 -103.92 gain 190 95 -95.29 gain 95 191 -103.59 gain 191 95 -98.14 gain 95 192 -106.80 gain 192 95 -105.01 gain 95 193 -113.62 gain 193 95 -107.86 gain 95 194 -118.69 gain 194 95 -112.82 gain 95 195 -110.45 gain 195 95 -102.55 gain 95 196 -102.98 gain 196 95 -102.75 gain 95 197 -110.00 gain 197 95 -107.26 gain 95 198 -97.78 gain 198 95 -97.69 gain 95 199 -100.45 gain 199 95 -94.37 gain 95 200 -105.12 gain 200 95 -100.95 gain 95 201 -98.62 gain 201 95 -97.55 gain 95 202 -109.86 gain 202 95 -107.08 gain 95 203 -103.54 gain 203 95 -100.87 gain 95 204 -106.12 gain 204 95 -101.66 gain 95 205 -103.06 gain 205 95 -98.26 gain 95 206 -113.23 gain 206 95 -109.76 gain 95 207 -100.41 gain 207 95 -94.69 gain 95 208 -117.39 gain 208 95 -114.96 gain 95 209 -111.42 gain 209 95 -108.03 gain 95 210 -101.49 gain 210 95 -102.11 gain 95 211 -107.29 gain 211 95 -105.30 gain 95 212 -111.60 gain 212 95 -108.16 gain 95 213 -104.40 gain 213 95 -103.69 gain 95 214 -107.07 gain 214 95 -104.55 gain 95 215 -100.42 gain 215 95 -99.71 gain 95 216 -105.29 gain 216 95 -101.47 gain 95 217 -102.33 gain 217 95 -102.97 gain 95 218 -108.44 gain 218 95 -110.39 gain 95 219 -104.98 gain 219 95 -104.51 gain 95 220 -104.36 gain 220 95 -101.01 gain 95 221 -101.31 gain 221 95 -98.94 gain 95 222 -116.54 gain 222 95 -110.75 gain 95 223 -114.96 gain 223 95 -111.46 gain 95 224 -111.01 gain 224 95 -104.44 gain 96 97 -79.85 gain 97 96 -81.13 gain 96 98 -84.13 gain 98 96 -82.58 gain 96 99 -94.77 gain 99 96 -97.31 gain 96 100 -94.46 gain 100 96 -94.85 gain 96 101 -89.81 gain 101 96 -88.86 gain 96 102 -101.97 gain 102 96 -101.67 gain 96 103 -100.61 gain 103 96 -99.55 gain 96 104 -99.50 gain 104 96 -94.87 gain 96 105 -97.31 gain 105 96 -98.08 gain 96 106 -96.93 gain 106 96 -97.00 gain 96 107 -93.74 gain 107 96 -96.83 gain 96 108 -86.40 gain 108 96 -87.55 gain 96 109 -88.16 gain 109 96 -86.15 gain 96 110 -79.90 gain 110 96 -80.14 gain 96 111 -79.80 gain 111 96 -77.23 gain 96 112 -79.44 gain 112 96 -78.88 gain 96 113 -85.70 gain 113 96 -92.07 gain 96 114 -93.04 gain 114 96 -95.05 gain 96 115 -94.99 gain 115 96 -97.85 gain 96 116 -103.32 gain 116 96 -102.21 gain 96 117 -92.25 gain 117 96 -90.98 gain 96 118 -100.92 gain 118 96 -107.82 gain 96 119 -103.40 gain 119 96 -101.85 gain 96 120 -104.12 gain 120 96 -102.68 gain 96 121 -95.58 gain 121 96 -96.88 gain 96 122 -94.42 gain 122 96 -98.30 gain 96 123 -99.89 gain 123 96 -104.02 gain 96 124 -80.60 gain 124 96 -78.33 gain 96 125 -84.74 gain 125 96 -84.40 gain 96 126 -85.71 gain 126 96 -90.25 gain 96 127 -88.63 gain 127 96 -87.93 gain 96 128 -89.34 gain 128 96 -91.70 gain 96 129 -87.62 gain 129 96 -87.19 gain 96 130 -90.58 gain 130 96 -92.33 gain 96 131 -100.21 gain 131 96 -100.32 gain 96 132 -101.02 gain 132 96 -97.41 gain 96 133 -95.72 gain 133 96 -96.54 gain 96 134 -105.48 gain 134 96 -104.29 gain 96 135 -91.80 gain 135 96 -86.20 gain 96 136 -85.76 gain 136 96 -88.94 gain 96 137 -101.18 gain 137 96 -101.02 gain 96 138 -89.10 gain 138 96 -90.94 gain 96 139 -94.84 gain 139 96 -98.40 gain 96 140 -92.85 gain 140 96 -96.22 gain 96 141 -85.27 gain 141 96 -84.33 gain 96 142 -84.87 gain 142 96 -85.07 gain 96 143 -91.52 gain 143 96 -94.17 gain 96 144 -96.27 gain 144 96 -94.83 gain 96 145 -95.74 gain 145 96 -98.85 gain 96 146 -97.95 gain 146 96 -97.49 gain 96 147 -105.24 gain 147 96 -105.98 gain 96 148 -101.90 gain 148 96 -103.17 gain 96 149 -103.72 gain 149 96 -101.36 gain 96 150 -105.28 gain 150 96 -106.30 gain 96 151 -90.41 gain 151 96 -93.92 gain 96 152 -91.10 gain 152 96 -92.97 gain 96 153 -99.30 gain 153 96 -100.86 gain 96 154 -95.89 gain 154 96 -98.58 gain 96 155 -94.19 gain 155 96 -94.18 gain 96 156 -91.03 gain 156 96 -92.14 gain 96 157 -98.06 gain 157 96 -100.47 gain 96 158 -94.88 gain 158 96 -99.26 gain 96 159 -98.18 gain 159 96 -96.60 gain 96 160 -100.62 gain 160 96 -100.41 gain 96 161 -96.38 gain 161 96 -97.22 gain 96 162 -94.76 gain 162 96 -95.23 gain 96 163 -97.80 gain 163 96 -95.69 gain 96 164 -97.78 gain 164 96 -102.90 gain 96 165 -97.31 gain 165 96 -99.79 gain 96 166 -95.41 gain 166 96 -99.55 gain 96 167 -95.13 gain 167 96 -98.09 gain 96 168 -98.48 gain 168 96 -100.50 gain 96 169 -99.02 gain 169 96 -97.56 gain 96 170 -93.98 gain 170 96 -93.46 gain 96 171 -100.77 gain 171 96 -100.82 gain 96 172 -100.53 gain 172 96 -103.38 gain 96 173 -99.84 gain 173 96 -97.01 gain 96 174 -92.41 gain 174 96 -95.54 gain 96 175 -96.42 gain 175 96 -91.34 gain 96 176 -102.24 gain 176 96 -101.38 gain 96 177 -101.75 gain 177 96 -103.26 gain 96 178 -98.82 gain 178 96 -97.93 gain 96 179 -105.27 gain 179 96 -107.42 gain 96 180 -100.94 gain 180 96 -101.84 gain 96 181 -97.37 gain 181 96 -101.67 gain 96 182 -105.92 gain 182 96 -106.34 gain 96 183 -106.81 gain 183 96 -103.12 gain 96 184 -95.31 gain 184 96 -97.85 gain 96 185 -98.28 gain 185 96 -99.32 gain 96 186 -93.37 gain 186 96 -95.11 gain 96 187 -89.21 gain 187 96 -90.97 gain 96 188 -103.99 gain 188 96 -110.20 gain 96 189 -102.26 gain 189 96 -104.52 gain 96 190 -101.79 gain 190 96 -96.89 gain 96 191 -100.66 gain 191 96 -98.93 gain 96 192 -104.39 gain 192 96 -106.33 gain 96 193 -100.40 gain 193 96 -98.37 gain 96 194 -102.38 gain 194 96 -100.24 gain 96 195 -102.13 gain 195 96 -97.96 gain 96 196 -105.56 gain 196 96 -109.06 gain 96 197 -98.97 gain 197 96 -99.96 gain 96 198 -99.02 gain 198 96 -102.66 gain 96 199 -101.34 gain 199 96 -98.98 gain 96 200 -102.54 gain 200 96 -102.10 gain 96 201 -103.81 gain 201 96 -106.47 gain 96 202 -104.11 gain 202 96 -105.06 gain 96 203 -97.35 gain 203 96 -98.40 gain 96 204 -101.92 gain 204 96 -101.19 gain 96 205 -99.77 gain 205 96 -98.70 gain 96 206 -104.20 gain 206 96 -104.46 gain 96 207 -105.55 gain 207 96 -103.56 gain 96 208 -104.23 gain 208 96 -105.53 gain 96 209 -103.78 gain 209 96 -104.12 gain 96 210 -103.41 gain 210 96 -107.75 gain 96 211 -101.30 gain 211 96 -103.04 gain 96 212 -94.75 gain 212 96 -95.03 gain 96 213 -102.48 gain 213 96 -105.50 gain 96 214 -104.30 gain 214 96 -105.51 gain 96 215 -100.47 gain 215 96 -103.48 gain 96 216 -100.25 gain 216 96 -100.16 gain 96 217 -104.87 gain 217 96 -109.23 gain 96 218 -102.55 gain 218 96 -108.23 gain 96 219 -103.78 gain 219 96 -107.03 gain 96 220 -94.61 gain 220 96 -94.98 gain 96 221 -95.48 gain 221 96 -96.84 gain 96 222 -98.50 gain 222 96 -96.44 gain 96 223 -109.41 gain 223 96 -109.64 gain 96 224 -97.19 gain 224 96 -94.35 gain 97 98 -75.48 gain 98 97 -72.65 gain 97 99 -80.98 gain 99 97 -82.24 gain 97 100 -85.84 gain 100 97 -84.95 gain 97 101 -84.97 gain 101 97 -82.74 gain 97 102 -96.98 gain 102 97 -95.41 gain 97 103 -102.46 gain 103 97 -100.13 gain 97 104 -102.04 gain 104 97 -96.14 gain 97 105 -103.71 gain 105 97 -103.20 gain 97 106 -105.03 gain 106 97 -103.83 gain 97 107 -96.94 gain 107 97 -98.75 gain 97 108 -96.85 gain 108 97 -96.72 gain 97 109 -89.04 gain 109 97 -85.76 gain 97 110 -87.39 gain 110 97 -86.35 gain 97 111 -85.40 gain 111 97 -81.56 gain 97 112 -71.62 gain 112 97 -69.78 gain 97 113 -72.56 gain 113 97 -77.66 gain 97 114 -86.67 gain 114 97 -87.40 gain 97 115 -86.11 gain 115 97 -87.70 gain 97 116 -95.39 gain 116 97 -93.00 gain 97 117 -95.07 gain 117 97 -92.52 gain 97 118 -104.15 gain 118 97 -109.78 gain 97 119 -104.90 gain 119 97 -102.08 gain 97 120 -100.78 gain 120 97 -98.06 gain 97 121 -93.59 gain 121 97 -93.61 gain 97 122 -100.17 gain 122 97 -102.76 gain 97 123 -93.36 gain 123 97 -96.21 gain 97 124 -92.92 gain 124 97 -89.38 gain 97 125 -98.04 gain 125 97 -96.43 gain 97 126 -88.36 gain 126 97 -91.63 gain 97 127 -84.18 gain 127 97 -82.20 gain 97 128 -86.46 gain 128 97 -87.55 gain 97 129 -90.07 gain 129 97 -88.37 gain 97 130 -88.18 gain 130 97 -88.66 gain 97 131 -92.69 gain 131 97 -91.52 gain 97 132 -107.74 gain 132 97 -102.85 gain 97 133 -102.02 gain 133 97 -101.56 gain 97 134 -95.50 gain 134 97 -93.04 gain 97 135 -107.07 gain 135 97 -100.19 gain 97 136 -100.51 gain 136 97 -102.41 gain 97 137 -104.53 gain 137 97 -103.09 gain 97 138 -93.57 gain 138 97 -94.14 gain 97 139 -95.38 gain 139 97 -97.66 gain 97 140 -94.30 gain 140 97 -96.39 gain 97 141 -91.29 gain 141 97 -89.07 gain 97 142 -89.00 gain 142 97 -87.93 gain 97 143 -89.02 gain 143 97 -90.40 gain 97 144 -87.67 gain 144 97 -84.95 gain 97 145 -94.22 gain 145 97 -96.05 gain 97 146 -94.50 gain 146 97 -92.77 gain 97 147 -109.14 gain 147 97 -108.60 gain 97 148 -104.13 gain 148 97 -104.13 gain 97 149 -100.52 gain 149 97 -96.88 gain 97 150 -105.66 gain 150 97 -105.41 gain 97 151 -106.63 gain 151 97 -108.86 gain 97 152 -89.74 gain 152 97 -90.33 gain 97 153 -97.04 gain 153 97 -97.32 gain 97 154 -94.92 gain 154 97 -96.33 gain 97 155 -94.36 gain 155 97 -93.07 gain 97 156 -99.48 gain 156 97 -99.32 gain 97 157 -95.17 gain 157 97 -96.30 gain 97 158 -94.83 gain 158 97 -97.93 gain 97 159 -89.87 gain 159 97 -87.00 gain 97 160 -95.50 gain 160 97 -94.02 gain 97 161 -107.28 gain 161 97 -106.85 gain 97 162 -98.58 gain 162 97 -97.78 gain 97 163 -106.52 gain 163 97 -103.14 gain 97 164 -108.01 gain 164 97 -111.86 gain 97 165 -101.77 gain 165 97 -102.97 gain 97 166 -103.02 gain 166 97 -105.89 gain 97 167 -109.28 gain 167 97 -110.97 gain 97 168 -102.88 gain 168 97 -103.63 gain 97 169 -102.40 gain 169 97 -99.66 gain 97 170 -100.20 gain 170 97 -98.41 gain 97 171 -95.60 gain 171 97 -94.38 gain 97 172 -92.15 gain 172 97 -93.73 gain 97 173 -95.46 gain 173 97 -91.35 gain 97 174 -98.61 gain 174 97 -100.46 gain 97 175 -95.16 gain 175 97 -88.80 gain 97 176 -96.37 gain 176 97 -94.24 gain 97 177 -99.98 gain 177 97 -100.21 gain 97 178 -101.20 gain 178 97 -99.03 gain 97 179 -104.05 gain 179 97 -104.93 gain 97 180 -100.91 gain 180 97 -100.53 gain 97 181 -103.74 gain 181 97 -106.76 gain 97 182 -96.43 gain 182 97 -95.59 gain 97 183 -103.19 gain 183 97 -98.22 gain 97 184 -106.87 gain 184 97 -108.13 gain 97 185 -95.35 gain 185 97 -95.11 gain 97 186 -102.15 gain 186 97 -102.62 gain 97 187 -94.51 gain 187 97 -95.00 gain 97 188 -99.49 gain 188 97 -104.43 gain 97 189 -104.60 gain 189 97 -105.59 gain 97 190 -97.23 gain 190 97 -91.05 gain 97 191 -101.31 gain 191 97 -98.31 gain 97 192 -100.70 gain 192 97 -101.37 gain 97 193 -103.63 gain 193 97 -100.32 gain 97 194 -108.35 gain 194 97 -104.93 gain 97 195 -110.50 gain 195 97 -105.05 gain 97 196 -102.62 gain 196 97 -104.84 gain 97 197 -98.05 gain 197 97 -97.76 gain 97 198 -112.28 gain 198 97 -114.63 gain 97 199 -99.25 gain 199 97 -95.62 gain 97 200 -100.82 gain 200 97 -99.11 gain 97 201 -103.85 gain 201 97 -105.23 gain 97 202 -105.00 gain 202 97 -104.67 gain 97 203 -103.13 gain 203 97 -102.90 gain 97 204 -101.52 gain 204 97 -99.51 gain 97 205 -98.69 gain 205 97 -96.35 gain 97 206 -107.45 gain 206 97 -106.44 gain 97 207 -103.49 gain 207 97 -100.22 gain 97 208 -104.64 gain 208 97 -104.66 gain 97 209 -105.45 gain 209 97 -104.52 gain 97 210 -104.55 gain 210 97 -107.62 gain 97 211 -102.59 gain 211 97 -103.05 gain 97 212 -102.59 gain 212 97 -101.60 gain 97 213 -102.43 gain 213 97 -104.18 gain 97 214 -101.96 gain 214 97 -101.89 gain 97 215 -102.91 gain 215 97 -104.65 gain 97 216 -105.20 gain 216 97 -103.84 gain 97 217 -104.54 gain 217 97 -107.63 gain 97 218 -101.98 gain 218 97 -106.39 gain 97 219 -109.79 gain 219 97 -111.77 gain 97 220 -116.02 gain 220 97 -115.11 gain 97 221 -105.66 gain 221 97 -105.75 gain 97 222 -103.26 gain 222 97 -99.92 gain 97 223 -105.95 gain 223 97 -104.90 gain 97 224 -109.57 gain 224 97 -105.45 gain 98 99 -70.31 gain 99 98 -74.40 gain 98 100 -76.85 gain 100 98 -78.79 gain 98 101 -84.06 gain 101 98 -84.66 gain 98 102 -89.63 gain 102 98 -90.88 gain 98 103 -91.71 gain 103 98 -92.20 gain 98 104 -97.73 gain 104 98 -94.64 gain 98 105 -95.46 gain 105 98 -97.78 gain 98 106 -101.53 gain 106 98 -103.16 gain 98 107 -92.13 gain 107 98 -96.76 gain 98 108 -91.65 gain 108 98 -94.35 gain 98 109 -88.04 gain 109 98 -87.58 gain 98 110 -84.69 gain 110 98 -86.48 gain 98 111 -82.76 gain 111 98 -81.75 gain 98 112 -79.47 gain 112 98 -80.45 gain 98 113 -72.61 gain 113 98 -80.53 gain 98 114 -80.12 gain 114 98 -83.68 gain 98 115 -78.81 gain 115 98 -83.22 gain 98 116 -90.60 gain 116 98 -91.04 gain 98 117 -92.73 gain 117 98 -93.01 gain 98 118 -95.01 gain 118 98 -103.46 gain 98 119 -104.51 gain 119 98 -104.52 gain 98 120 -95.31 gain 120 98 -95.41 gain 98 121 -97.34 gain 121 98 -100.19 gain 98 122 -101.75 gain 122 98 -107.17 gain 98 123 -97.36 gain 123 98 -103.03 gain 98 124 -96.33 gain 124 98 -95.61 gain 98 125 -93.57 gain 125 98 -94.78 gain 98 126 -87.25 gain 126 98 -93.35 gain 98 127 -85.86 gain 127 98 -86.71 gain 98 128 -79.01 gain 128 98 -82.92 gain 98 129 -83.93 gain 129 98 -85.05 gain 98 130 -95.49 gain 130 98 -98.79 gain 98 131 -93.56 gain 131 98 -95.23 gain 98 132 -92.87 gain 132 98 -90.81 gain 98 133 -95.43 gain 133 98 -97.79 gain 98 134 -97.36 gain 134 98 -97.72 gain 98 135 -103.39 gain 135 98 -99.34 gain 98 136 -102.62 gain 136 98 -107.34 gain 98 137 -99.34 gain 137 98 -100.73 gain 98 138 -90.25 gain 138 98 -93.65 gain 98 139 -87.46 gain 139 98 -92.56 gain 98 140 -99.07 gain 140 98 -103.98 gain 98 141 -92.52 gain 141 98 -93.12 gain 98 142 -85.91 gain 142 98 -87.67 gain 98 143 -87.10 gain 143 98 -91.31 gain 98 144 -84.31 gain 144 98 -84.42 gain 98 145 -94.67 gain 145 98 -99.32 gain 98 146 -92.31 gain 146 98 -93.41 gain 98 147 -95.99 gain 147 98 -98.28 gain 98 148 -91.92 gain 148 98 -94.73 gain 98 149 -103.01 gain 149 98 -102.20 gain 98 150 -101.48 gain 150 98 -104.05 gain 98 151 -99.20 gain 151 98 -104.25 gain 98 152 -103.09 gain 152 98 -106.50 gain 98 153 -95.98 gain 153 98 -99.09 gain 98 154 -105.04 gain 154 98 -109.28 gain 98 155 -87.70 gain 155 98 -89.24 gain 98 156 -94.14 gain 156 98 -96.80 gain 98 157 -91.87 gain 157 98 -95.83 gain 98 158 -91.53 gain 158 98 -97.45 gain 98 159 -93.77 gain 159 98 -93.73 gain 98 160 -96.58 gain 160 98 -97.92 gain 98 161 -101.67 gain 161 98 -104.07 gain 98 162 -87.95 gain 162 98 -89.98 gain 98 163 -98.99 gain 163 98 -98.43 gain 98 164 -96.28 gain 164 98 -102.95 gain 98 165 -110.32 gain 165 98 -114.35 gain 98 166 -101.51 gain 166 98 -107.20 gain 98 167 -101.64 gain 167 98 -106.15 gain 98 168 -99.02 gain 168 98 -102.60 gain 98 169 -104.56 gain 169 98 -104.65 gain 98 170 -102.87 gain 170 98 -103.90 gain 98 171 -91.96 gain 171 98 -93.56 gain 98 172 -94.05 gain 172 98 -98.45 gain 98 173 -91.59 gain 173 98 -90.31 gain 98 174 -87.76 gain 174 98 -92.43 gain 98 175 -93.57 gain 175 98 -90.04 gain 98 176 -95.22 gain 176 98 -95.92 gain 98 177 -98.39 gain 177 98 -101.44 gain 98 178 -95.86 gain 178 98 -96.53 gain 98 179 -98.30 gain 179 98 -102.01 gain 98 180 -104.41 gain 180 98 -106.85 gain 98 181 -102.06 gain 181 98 -107.90 gain 98 182 -108.86 gain 182 98 -110.84 gain 98 183 -104.53 gain 183 98 -102.39 gain 98 184 -100.82 gain 184 98 -104.91 gain 98 185 -98.23 gain 185 98 -100.82 gain 98 186 -99.13 gain 186 98 -102.42 gain 98 187 -97.02 gain 187 98 -100.34 gain 98 188 -99.30 gain 188 98 -107.06 gain 98 189 -93.45 gain 189 98 -97.27 gain 98 190 -89.73 gain 190 98 -86.38 gain 98 191 -99.22 gain 191 98 -99.04 gain 98 192 -97.61 gain 192 98 -101.10 gain 98 193 -101.54 gain 193 98 -101.06 gain 98 194 -97.67 gain 194 98 -97.07 gain 98 195 -103.00 gain 195 98 -100.38 gain 98 196 -97.14 gain 196 98 -102.19 gain 98 197 -97.14 gain 197 98 -99.68 gain 98 198 -106.53 gain 198 98 -111.72 gain 98 199 -96.03 gain 199 98 -95.23 gain 98 200 -98.41 gain 200 98 -99.53 gain 98 201 -97.19 gain 201 98 -101.40 gain 98 202 -95.44 gain 202 98 -97.94 gain 98 203 -94.68 gain 203 98 -97.28 gain 98 204 -98.55 gain 204 98 -99.37 gain 98 205 -98.17 gain 205 98 -98.66 gain 98 206 -108.09 gain 206 98 -109.90 gain 98 207 -105.45 gain 207 98 -105.01 gain 98 208 -105.43 gain 208 98 -108.28 gain 98 209 -92.97 gain 209 98 -94.86 gain 98 210 -101.13 gain 210 98 -107.03 gain 98 211 -104.63 gain 211 98 -107.92 gain 98 212 -104.17 gain 212 98 -106.00 gain 98 213 -103.54 gain 213 98 -108.11 gain 98 214 -105.81 gain 214 98 -108.56 gain 98 215 -97.23 gain 215 98 -101.80 gain 98 216 -106.58 gain 216 98 -108.04 gain 98 217 -102.12 gain 217 98 -108.03 gain 98 218 -103.58 gain 218 98 -110.81 gain 98 219 -97.63 gain 219 98 -102.43 gain 98 220 -107.20 gain 220 98 -109.12 gain 98 221 -102.11 gain 221 98 -105.02 gain 98 222 -96.42 gain 222 98 -95.91 gain 98 223 -106.14 gain 223 98 -107.92 gain 98 224 -106.16 gain 224 98 -104.87 gain 99 100 -72.32 gain 100 99 -70.16 gain 99 101 -94.80 gain 101 99 -91.31 gain 99 102 -93.05 gain 102 99 -90.21 gain 99 103 -98.02 gain 103 99 -94.41 gain 99 104 -97.94 gain 104 99 -90.76 gain 99 105 -105.45 gain 105 99 -103.68 gain 99 106 -104.79 gain 106 99 -102.33 gain 99 107 -103.34 gain 107 99 -103.89 gain 99 108 -101.02 gain 108 99 -99.63 gain 99 109 -94.03 gain 109 99 -89.48 gain 99 110 -94.95 gain 110 99 -92.64 gain 99 111 -93.17 gain 111 99 -88.06 gain 99 112 -82.67 gain 112 99 -79.57 gain 99 113 -76.96 gain 113 99 -80.79 gain 99 114 -73.70 gain 114 99 -73.16 gain 99 115 -79.95 gain 115 99 -80.27 gain 99 116 -86.60 gain 116 99 -82.95 gain 99 117 -96.22 gain 117 99 -92.41 gain 99 118 -92.36 gain 118 99 -96.72 gain 99 119 -96.26 gain 119 99 -92.17 gain 99 120 -105.59 gain 120 99 -101.60 gain 99 121 -109.96 gain 121 99 -108.72 gain 99 122 -109.33 gain 122 99 -110.67 gain 99 123 -102.13 gain 123 99 -103.71 gain 99 124 -100.73 gain 124 99 -95.92 gain 99 125 -97.82 gain 125 99 -94.95 gain 99 126 -98.70 gain 126 99 -100.71 gain 99 127 -90.51 gain 127 99 -87.27 gain 99 128 -93.81 gain 128 99 -93.63 gain 99 129 -87.53 gain 129 99 -84.56 gain 99 130 -91.09 gain 130 99 -90.30 gain 99 131 -91.87 gain 131 99 -89.44 gain 99 132 -97.93 gain 132 99 -91.78 gain 99 133 -99.73 gain 133 99 -98.01 gain 99 134 -102.11 gain 134 99 -98.38 gain 99 135 -106.25 gain 135 99 -98.10 gain 99 136 -102.84 gain 136 99 -103.47 gain 99 137 -100.88 gain 137 99 -98.18 gain 99 138 -97.71 gain 138 99 -97.01 gain 99 139 -99.29 gain 139 99 -100.30 gain 99 140 -97.00 gain 140 99 -97.82 gain 99 141 -99.49 gain 141 99 -96.00 gain 99 142 -98.38 gain 142 99 -96.04 gain 99 143 -93.56 gain 143 99 -93.67 gain 99 144 -87.45 gain 144 99 -83.46 gain 99 145 -90.23 gain 145 99 -90.79 gain 99 146 -96.23 gain 146 99 -93.23 gain 99 147 -93.21 gain 147 99 -91.41 gain 99 148 -94.36 gain 148 99 -93.08 gain 99 149 -100.26 gain 149 99 -95.36 gain 99 150 -108.27 gain 150 99 -106.75 gain 99 151 -106.12 gain 151 99 -107.09 gain 99 152 -107.52 gain 152 99 -106.84 gain 99 153 -102.71 gain 153 99 -101.73 gain 99 154 -102.65 gain 154 99 -102.80 gain 99 155 -100.67 gain 155 99 -98.12 gain 99 156 -92.75 gain 156 99 -91.32 gain 99 157 -96.54 gain 157 99 -96.41 gain 99 158 -97.07 gain 158 99 -98.91 gain 99 159 -99.16 gain 159 99 -95.03 gain 99 160 -98.21 gain 160 99 -95.46 gain 99 161 -87.25 gain 161 99 -85.55 gain 99 162 -97.90 gain 162 99 -95.84 gain 99 163 -97.22 gain 163 99 -92.57 gain 99 164 -112.69 gain 164 99 -115.27 gain 99 165 -105.86 gain 165 99 -105.79 gain 99 166 -98.76 gain 166 99 -100.35 gain 99 167 -106.69 gain 167 99 -107.11 gain 99 168 -103.40 gain 168 99 -102.88 gain 99 169 -110.11 gain 169 99 -106.11 gain 99 170 -95.34 gain 170 99 -92.28 gain 99 171 -92.58 gain 171 99 -90.09 gain 99 172 -101.54 gain 172 99 -101.85 gain 99 173 -98.29 gain 173 99 -92.91 gain 99 174 -99.08 gain 174 99 -99.66 gain 99 175 -92.43 gain 175 99 -84.81 gain 99 176 -100.61 gain 176 99 -97.22 gain 99 177 -103.60 gain 177 99 -102.57 gain 99 178 -95.40 gain 178 99 -91.97 gain 99 179 -100.49 gain 179 99 -100.11 gain 99 180 -114.41 gain 180 99 -112.77 gain 99 181 -107.08 gain 181 99 -108.84 gain 99 182 -107.02 gain 182 99 -104.91 gain 99 183 -110.03 gain 183 99 -103.80 gain 99 184 -100.89 gain 184 99 -100.88 gain 99 185 -99.16 gain 185 99 -97.66 gain 99 186 -106.24 gain 186 99 -105.44 gain 99 187 -101.25 gain 187 99 -100.47 gain 99 188 -101.37 gain 188 99 -105.04 gain 99 189 -101.02 gain 189 99 -100.74 gain 99 190 -94.96 gain 190 99 -87.52 gain 99 191 -104.72 gain 191 99 -100.45 gain 99 192 -101.83 gain 192 99 -101.23 gain 99 193 -105.38 gain 193 99 -100.81 gain 99 194 -102.97 gain 194 99 -98.29 gain 99 195 -109.72 gain 195 99 -103.01 gain 99 196 -107.97 gain 196 99 -108.93 gain 99 197 -103.81 gain 197 99 -102.25 gain 99 198 -110.07 gain 198 99 -111.16 gain 99 199 -100.45 gain 199 99 -95.56 gain 99 200 -103.25 gain 200 99 -100.27 gain 99 201 -107.88 gain 201 99 -107.99 gain 99 202 -105.01 gain 202 99 -103.41 gain 99 203 -99.27 gain 203 99 -97.77 gain 99 204 -103.93 gain 204 99 -100.66 gain 99 205 -97.62 gain 205 99 -94.01 gain 99 206 -97.15 gain 206 99 -94.87 gain 99 207 -106.65 gain 207 99 -102.11 gain 99 208 -102.13 gain 208 99 -100.89 gain 99 209 -104.95 gain 209 99 -102.75 gain 99 210 -101.80 gain 210 99 -103.60 gain 99 211 -107.86 gain 211 99 -107.06 gain 99 212 -115.47 gain 212 99 -113.21 gain 99 213 -108.21 gain 213 99 -108.69 gain 99 214 -100.58 gain 214 99 -99.24 gain 99 215 -103.52 gain 215 99 -103.99 gain 99 216 -103.79 gain 216 99 -101.17 gain 99 217 -104.79 gain 217 99 -106.62 gain 99 218 -98.30 gain 218 99 -101.44 gain 99 219 -104.81 gain 219 99 -105.52 gain 99 220 -102.33 gain 220 99 -100.16 gain 99 221 -107.12 gain 221 99 -105.93 gain 99 222 -100.18 gain 222 99 -95.58 gain 99 223 -103.67 gain 223 99 -101.35 gain 99 224 -101.92 gain 224 99 -96.54 gain 100 101 -71.77 gain 101 100 -70.44 gain 100 102 -86.98 gain 102 100 -86.30 gain 100 103 -92.47 gain 103 100 -91.02 gain 100 104 -97.10 gain 104 100 -92.08 gain 100 105 -106.36 gain 105 100 -106.74 gain 100 106 -105.03 gain 106 100 -104.72 gain 100 107 -107.32 gain 107 100 -110.02 gain 100 108 -99.40 gain 108 100 -100.17 gain 100 109 -95.45 gain 109 100 -93.06 gain 100 110 -93.08 gain 110 100 -92.93 gain 100 111 -90.57 gain 111 100 -87.62 gain 100 112 -85.00 gain 112 100 -84.06 gain 100 113 -81.67 gain 113 100 -87.66 gain 100 114 -79.82 gain 114 100 -81.44 gain 100 115 -67.00 gain 115 100 -69.48 gain 100 116 -74.62 gain 116 100 -73.12 gain 100 117 -87.29 gain 117 100 -85.64 gain 100 118 -93.02 gain 118 100 -99.54 gain 100 119 -95.45 gain 119 100 -93.52 gain 100 120 -107.80 gain 120 100 -105.98 gain 100 121 -102.83 gain 121 100 -103.75 gain 100 122 -103.12 gain 122 100 -106.61 gain 100 123 -97.36 gain 123 100 -101.10 gain 100 124 -97.70 gain 124 100 -95.05 gain 100 125 -103.93 gain 125 100 -103.21 gain 100 126 -97.65 gain 126 100 -101.81 gain 100 127 -92.60 gain 127 100 -91.52 gain 100 128 -87.14 gain 128 100 -89.12 gain 100 129 -87.27 gain 129 100 -86.46 gain 100 130 -84.17 gain 130 100 -85.54 gain 100 131 -87.37 gain 131 100 -87.09 gain 100 132 -89.00 gain 132 100 -85.00 gain 100 133 -94.08 gain 133 100 -94.52 gain 100 134 -89.86 gain 134 100 -88.29 gain 100 135 -103.99 gain 135 100 -98.01 gain 100 136 -110.50 gain 136 100 -113.29 gain 100 137 -96.05 gain 137 100 -95.50 gain 100 138 -96.00 gain 138 100 -97.46 gain 100 139 -101.56 gain 139 100 -104.73 gain 100 140 -102.25 gain 140 100 -105.23 gain 100 141 -96.78 gain 141 100 -95.45 gain 100 142 -98.76 gain 142 100 -98.58 gain 100 143 -96.78 gain 143 100 -99.05 gain 100 144 -90.17 gain 144 100 -88.34 gain 100 145 -87.21 gain 145 100 -89.93 gain 100 146 -85.26 gain 146 100 -84.43 gain 100 147 -93.33 gain 147 100 -93.68 gain 100 148 -94.43 gain 148 100 -95.32 gain 100 149 -96.47 gain 149 100 -93.73 gain 100 150 -108.47 gain 150 100 -109.11 gain 100 151 -103.60 gain 151 100 -106.72 gain 100 152 -109.39 gain 152 100 -110.87 gain 100 153 -100.80 gain 153 100 -101.98 gain 100 154 -95.08 gain 154 100 -97.39 gain 100 155 -100.95 gain 155 100 -100.55 gain 100 156 -101.84 gain 156 100 -102.57 gain 100 157 -96.55 gain 157 100 -98.57 gain 100 158 -96.28 gain 158 100 -100.27 gain 100 159 -94.56 gain 159 100 -92.59 gain 100 160 -96.22 gain 160 100 -95.63 gain 100 161 -88.64 gain 161 100 -89.11 gain 100 162 -101.35 gain 162 100 -101.44 gain 100 163 -93.20 gain 163 100 -90.71 gain 100 164 -94.15 gain 164 100 -98.89 gain 100 165 -106.22 gain 165 100 -108.32 gain 100 166 -108.03 gain 166 100 -111.78 gain 100 167 -107.94 gain 167 100 -110.52 gain 100 168 -99.56 gain 168 100 -101.20 gain 100 169 -99.98 gain 169 100 -98.14 gain 100 170 -100.59 gain 170 100 -99.68 gain 100 171 -100.95 gain 171 100 -100.61 gain 100 172 -104.55 gain 172 100 -107.01 gain 100 173 -95.10 gain 173 100 -91.89 gain 100 174 -92.88 gain 174 100 -95.63 gain 100 175 -93.46 gain 175 100 -88.00 gain 100 176 -95.73 gain 176 100 -94.49 gain 100 177 -102.36 gain 177 100 -103.48 gain 100 178 -86.66 gain 178 100 -85.39 gain 100 179 -104.60 gain 179 100 -106.37 gain 100 180 -107.01 gain 180 100 -107.52 gain 100 181 -98.56 gain 181 100 -102.47 gain 100 182 -104.86 gain 182 100 -104.91 gain 100 183 -102.50 gain 183 100 -98.43 gain 100 184 -101.54 gain 184 100 -103.70 gain 100 185 -96.35 gain 185 100 -97.01 gain 100 186 -97.29 gain 186 100 -98.65 gain 100 187 -102.75 gain 187 100 -104.13 gain 100 188 -92.91 gain 188 100 -98.73 gain 100 189 -92.18 gain 189 100 -94.07 gain 100 190 -99.31 gain 190 100 -94.03 gain 100 191 -104.94 gain 191 100 -102.83 gain 100 192 -97.67 gain 192 100 -99.23 gain 100 193 -96.27 gain 193 100 -93.85 gain 100 194 -92.06 gain 194 100 -89.53 gain 100 195 -103.71 gain 195 100 -99.15 gain 100 196 -110.07 gain 196 100 -113.18 gain 100 197 -106.95 gain 197 100 -107.55 gain 100 198 -105.53 gain 198 100 -108.78 gain 100 199 -99.34 gain 199 100 -96.60 gain 100 200 -98.39 gain 200 100 -97.57 gain 100 201 -102.77 gain 201 100 -105.04 gain 100 202 -104.89 gain 202 100 -105.46 gain 100 203 -100.56 gain 203 100 -101.23 gain 100 204 -95.87 gain 204 100 -94.76 gain 100 205 -101.78 gain 205 100 -100.33 gain 100 206 -93.81 gain 206 100 -93.69 gain 100 207 -107.83 gain 207 100 -105.45 gain 100 208 -94.03 gain 208 100 -94.95 gain 100 209 -99.89 gain 209 100 -99.85 gain 100 210 -107.60 gain 210 100 -111.56 gain 100 211 -107.93 gain 211 100 -109.29 gain 100 212 -101.70 gain 212 100 -101.60 gain 100 213 -106.19 gain 213 100 -108.83 gain 100 214 -108.73 gain 214 100 -109.55 gain 100 215 -104.56 gain 215 100 -107.20 gain 100 216 -102.25 gain 216 100 -101.78 gain 100 217 -111.95 gain 217 100 -115.93 gain 100 218 -99.34 gain 218 100 -104.64 gain 100 219 -103.25 gain 219 100 -106.12 gain 100 220 -99.14 gain 220 100 -99.13 gain 100 221 -97.30 gain 221 100 -98.28 gain 100 222 -108.24 gain 222 100 -105.79 gain 100 223 -101.44 gain 223 100 -101.28 gain 100 224 -110.13 gain 224 100 -106.90 gain 101 102 -76.85 gain 102 101 -77.51 gain 101 103 -83.86 gain 103 101 -83.75 gain 101 104 -89.73 gain 104 101 -86.05 gain 101 105 -106.60 gain 105 101 -108.32 gain 101 106 -109.46 gain 106 101 -110.48 gain 101 107 -103.72 gain 107 101 -107.76 gain 101 108 -98.38 gain 108 101 -100.49 gain 101 109 -93.98 gain 109 101 -92.94 gain 101 110 -101.75 gain 110 101 -102.94 gain 101 111 -89.51 gain 111 101 -87.90 gain 101 112 -93.22 gain 112 101 -93.62 gain 101 113 -87.46 gain 113 101 -94.78 gain 101 114 -78.50 gain 114 101 -81.46 gain 101 115 -86.06 gain 115 101 -89.88 gain 101 116 -68.23 gain 116 101 -68.07 gain 101 117 -85.76 gain 117 101 -85.45 gain 101 118 -86.28 gain 118 101 -94.14 gain 101 119 -87.30 gain 119 101 -86.71 gain 101 120 -101.07 gain 120 101 -100.58 gain 101 121 -103.86 gain 121 101 -106.12 gain 101 122 -101.44 gain 122 101 -106.27 gain 101 123 -94.47 gain 123 101 -99.56 gain 101 124 -100.72 gain 124 101 -99.40 gain 101 125 -96.73 gain 125 101 -97.35 gain 101 126 -101.13 gain 126 101 -106.63 gain 101 127 -99.32 gain 127 101 -99.58 gain 101 128 -86.00 gain 128 101 -89.31 gain 101 129 -89.90 gain 129 101 -90.43 gain 101 130 -85.77 gain 130 101 -88.48 gain 101 131 -78.40 gain 131 101 -79.46 gain 101 132 -82.20 gain 132 101 -79.54 gain 101 133 -90.10 gain 133 101 -91.87 gain 101 134 -89.82 gain 134 101 -89.59 gain 101 135 -104.64 gain 135 101 -100.00 gain 101 136 -100.92 gain 136 101 -105.05 gain 101 137 -112.55 gain 137 101 -113.34 gain 101 138 -109.93 gain 138 101 -112.74 gain 101 139 -101.61 gain 139 101 -106.12 gain 101 140 -101.02 gain 140 101 -105.34 gain 101 141 -102.80 gain 141 101 -102.81 gain 101 142 -89.53 gain 142 101 -90.69 gain 101 143 -91.02 gain 143 101 -94.63 gain 101 144 -91.05 gain 144 101 -90.56 gain 101 145 -83.33 gain 145 101 -87.40 gain 101 146 -85.18 gain 146 101 -85.68 gain 101 147 -87.87 gain 147 101 -89.56 gain 101 148 -85.90 gain 148 101 -88.12 gain 101 149 -82.27 gain 149 101 -80.87 gain 101 150 -100.40 gain 150 101 -102.38 gain 101 151 -109.89 gain 151 101 -114.34 gain 101 152 -100.83 gain 152 101 -103.65 gain 101 153 -100.23 gain 153 101 -102.74 gain 101 154 -94.01 gain 154 101 -97.66 gain 101 155 -99.00 gain 155 101 -99.95 gain 101 156 -95.00 gain 156 101 -97.07 gain 101 157 -95.38 gain 157 101 -98.74 gain 101 158 -93.10 gain 158 101 -98.43 gain 101 159 -96.75 gain 159 101 -96.12 gain 101 160 -96.46 gain 160 101 -97.21 gain 101 161 -93.70 gain 161 101 -95.50 gain 101 162 -94.40 gain 162 101 -95.83 gain 101 163 -94.29 gain 163 101 -93.14 gain 101 164 -89.99 gain 164 101 -96.07 gain 101 165 -107.79 gain 165 101 -111.22 gain 101 166 -98.53 gain 166 101 -103.62 gain 101 167 -107.81 gain 167 101 -111.73 gain 101 168 -100.84 gain 168 101 -103.82 gain 101 169 -103.15 gain 169 101 -102.65 gain 101 170 -102.75 gain 170 101 -103.19 gain 101 171 -109.23 gain 171 101 -110.24 gain 101 172 -94.12 gain 172 101 -97.92 gain 101 173 -97.21 gain 173 101 -95.33 gain 101 174 -90.11 gain 174 101 -94.19 gain 101 175 -100.69 gain 175 101 -96.56 gain 101 176 -95.81 gain 176 101 -95.92 gain 101 177 -96.95 gain 177 101 -99.41 gain 101 178 -98.39 gain 178 101 -98.46 gain 101 179 -95.50 gain 179 101 -98.61 gain 101 180 -105.16 gain 180 101 -107.01 gain 101 181 -101.28 gain 181 101 -106.53 gain 101 182 -103.33 gain 182 101 -104.71 gain 101 183 -101.21 gain 183 101 -98.48 gain 101 184 -104.21 gain 184 101 -107.71 gain 101 185 -100.09 gain 185 101 -102.08 gain 101 186 -107.16 gain 186 101 -109.85 gain 101 187 -95.86 gain 187 101 -98.58 gain 101 188 -104.78 gain 188 101 -111.95 gain 101 189 -97.26 gain 189 101 -100.48 gain 101 190 -93.96 gain 190 101 -90.02 gain 101 191 -88.92 gain 191 101 -88.14 gain 101 192 -99.60 gain 192 101 -102.50 gain 101 193 -99.95 gain 193 101 -98.87 gain 101 194 -108.89 gain 194 101 -107.70 gain 101 195 -108.31 gain 195 101 -105.10 gain 101 196 -102.93 gain 196 101 -107.39 gain 101 197 -106.25 gain 197 101 -108.19 gain 101 198 -101.37 gain 198 101 -105.95 gain 101 199 -96.16 gain 199 101 -94.77 gain 101 200 -98.45 gain 200 101 -98.97 gain 101 201 -109.23 gain 201 101 -112.84 gain 101 202 -96.31 gain 202 101 -98.21 gain 101 203 -98.11 gain 203 101 -100.11 gain 101 204 -99.47 gain 204 101 -99.70 gain 101 205 -99.39 gain 205 101 -99.28 gain 101 206 -98.79 gain 206 101 -100.01 gain 101 207 -104.21 gain 207 101 -103.17 gain 101 208 -98.83 gain 208 101 -101.09 gain 101 209 -100.71 gain 209 101 -102.01 gain 101 210 -106.85 gain 210 101 -112.14 gain 101 211 -102.67 gain 211 101 -105.36 gain 101 212 -103.38 gain 212 101 -104.62 gain 101 213 -108.20 gain 213 101 -112.18 gain 101 214 -100.42 gain 214 101 -102.58 gain 101 215 -103.48 gain 215 101 -107.45 gain 101 216 -105.55 gain 216 101 -106.42 gain 101 217 -101.38 gain 217 101 -106.70 gain 101 218 -106.55 gain 218 101 -113.18 gain 101 219 -106.17 gain 219 101 -110.38 gain 101 220 -102.38 gain 220 101 -103.71 gain 101 221 -102.05 gain 221 101 -104.37 gain 101 222 -99.21 gain 222 101 -98.10 gain 101 223 -99.95 gain 223 101 -101.13 gain 101 224 -101.97 gain 224 101 -100.08 gain 102 103 -76.54 gain 103 102 -75.77 gain 102 104 -89.18 gain 104 102 -84.84 gain 102 105 -101.13 gain 105 102 -102.19 gain 102 106 -102.64 gain 106 102 -103.01 gain 102 107 -107.84 gain 107 102 -111.22 gain 102 108 -98.65 gain 108 102 -100.10 gain 102 109 -99.55 gain 109 102 -97.84 gain 102 110 -107.25 gain 110 102 -107.78 gain 102 111 -100.66 gain 111 102 -98.39 gain 102 112 -100.12 gain 112 102 -99.85 gain 102 113 -94.23 gain 113 102 -100.89 gain 102 114 -86.82 gain 114 102 -89.12 gain 102 115 -86.90 gain 115 102 -90.06 gain 102 116 -82.03 gain 116 102 -81.22 gain 102 117 -73.44 gain 117 102 -72.46 gain 102 118 -84.33 gain 118 102 -91.52 gain 102 119 -83.89 gain 119 102 -82.64 gain 102 120 -108.45 gain 120 102 -107.30 gain 102 121 -106.13 gain 121 102 -107.73 gain 102 122 -105.66 gain 122 102 -109.82 gain 102 123 -105.77 gain 123 102 -110.19 gain 102 124 -95.27 gain 124 102 -93.30 gain 102 125 -96.50 gain 125 102 -96.46 gain 102 126 -100.85 gain 126 102 -105.69 gain 102 127 -103.20 gain 127 102 -102.79 gain 102 128 -92.43 gain 128 102 -95.09 gain 102 129 -96.72 gain 129 102 -96.59 gain 102 130 -95.03 gain 130 102 -97.07 gain 102 131 -87.50 gain 131 102 -87.90 gain 102 132 -75.07 gain 132 102 -71.76 gain 102 133 -78.67 gain 133 102 -79.78 gain 102 134 -82.70 gain 134 102 -81.80 gain 102 135 -100.72 gain 135 102 -95.41 gain 102 136 -111.89 gain 136 102 -115.36 gain 102 137 -107.32 gain 137 102 -107.45 gain 102 138 -99.36 gain 138 102 -101.50 gain 102 139 -109.51 gain 139 102 -113.36 gain 102 140 -97.03 gain 140 102 -100.68 gain 102 141 -92.32 gain 141 102 -91.67 gain 102 142 -99.92 gain 142 102 -100.42 gain 102 143 -94.56 gain 143 102 -97.50 gain 102 144 -84.67 gain 144 102 -83.52 gain 102 145 -87.61 gain 145 102 -91.01 gain 102 146 -84.51 gain 146 102 -84.36 gain 102 147 -89.92 gain 147 102 -90.96 gain 102 148 -87.30 gain 148 102 -88.86 gain 102 149 -91.75 gain 149 102 -89.69 gain 102 150 -104.56 gain 150 102 -105.88 gain 102 151 -98.59 gain 151 102 -102.38 gain 102 152 -98.44 gain 152 102 -100.60 gain 102 153 -106.50 gain 153 102 -108.35 gain 102 154 -107.04 gain 154 102 -110.03 gain 102 155 -97.91 gain 155 102 -98.19 gain 102 156 -103.03 gain 156 102 -104.43 gain 102 157 -96.70 gain 157 102 -99.41 gain 102 158 -93.63 gain 158 102 -98.30 gain 102 159 -90.31 gain 159 102 -89.02 gain 102 160 -96.30 gain 160 102 -96.39 gain 102 161 -90.81 gain 161 102 -91.95 gain 102 162 -91.70 gain 162 102 -92.47 gain 102 163 -95.89 gain 163 102 -94.08 gain 102 164 -90.90 gain 164 102 -96.31 gain 102 165 -112.08 gain 165 102 -114.85 gain 102 166 -108.33 gain 166 102 -112.76 gain 102 167 -107.23 gain 167 102 -110.48 gain 102 168 -106.89 gain 168 102 -109.21 gain 102 169 -106.75 gain 169 102 -105.58 gain 102 170 -98.49 gain 170 102 -98.26 gain 102 171 -103.61 gain 171 102 -103.95 gain 102 172 -104.66 gain 172 102 -107.80 gain 102 173 -100.46 gain 173 102 -97.92 gain 102 174 -90.80 gain 174 102 -94.22 gain 102 175 -94.56 gain 175 102 -89.78 gain 102 176 -96.40 gain 176 102 -95.84 gain 102 177 -95.53 gain 177 102 -97.33 gain 102 178 -94.94 gain 178 102 -94.35 gain 102 179 -96.28 gain 179 102 -98.73 gain 102 180 -107.58 gain 180 102 -108.77 gain 102 181 -102.04 gain 181 102 -106.63 gain 102 182 -108.26 gain 182 102 -108.98 gain 102 183 -105.98 gain 183 102 -102.58 gain 102 184 -98.96 gain 184 102 -101.79 gain 102 185 -104.05 gain 185 102 -105.38 gain 102 186 -100.89 gain 186 102 -102.92 gain 102 187 -104.19 gain 187 102 -106.25 gain 102 188 -97.15 gain 188 102 -103.65 gain 102 189 -99.41 gain 189 102 -101.98 gain 102 190 -98.78 gain 190 102 -94.17 gain 102 191 -99.37 gain 191 102 -97.94 gain 102 192 -98.73 gain 192 102 -100.97 gain 102 193 -93.78 gain 193 102 -92.04 gain 102 194 -94.75 gain 194 102 -92.90 gain 102 195 -107.24 gain 195 102 -103.36 gain 102 196 -107.37 gain 196 102 -111.16 gain 102 197 -106.72 gain 197 102 -108.00 gain 102 198 -108.31 gain 198 102 -112.23 gain 102 199 -96.26 gain 199 102 -94.20 gain 102 200 -102.97 gain 200 102 -102.82 gain 102 201 -104.57 gain 201 102 -107.52 gain 102 202 -99.98 gain 202 102 -101.22 gain 102 203 -96.78 gain 203 102 -98.12 gain 102 204 -101.34 gain 204 102 -100.90 gain 102 205 -101.60 gain 205 102 -100.83 gain 102 206 -93.07 gain 206 102 -93.63 gain 102 207 -93.53 gain 207 102 -91.83 gain 102 208 -103.59 gain 208 102 -105.19 gain 102 209 -102.52 gain 209 102 -103.15 gain 102 210 -110.53 gain 210 102 -115.16 gain 102 211 -105.99 gain 211 102 -108.02 gain 102 212 -108.63 gain 212 102 -109.21 gain 102 213 -108.96 gain 213 102 -112.28 gain 102 214 -107.37 gain 214 102 -108.87 gain 102 215 -103.19 gain 215 102 -106.50 gain 102 216 -106.31 gain 216 102 -106.52 gain 102 217 -96.44 gain 217 102 -101.10 gain 102 218 -100.31 gain 218 102 -106.29 gain 102 219 -102.98 gain 219 102 -106.53 gain 102 220 -106.39 gain 220 102 -107.06 gain 102 221 -101.11 gain 221 102 -102.77 gain 102 222 -91.70 gain 222 102 -89.93 gain 102 223 -107.87 gain 223 102 -108.39 gain 102 224 -101.27 gain 224 102 -98.72 gain 103 104 -73.35 gain 104 103 -69.78 gain 103 105 -108.25 gain 105 103 -110.08 gain 103 106 -102.75 gain 106 103 -103.89 gain 103 107 -98.49 gain 107 103 -102.64 gain 103 108 -100.43 gain 108 103 -102.65 gain 103 109 -101.94 gain 109 103 -101.00 gain 103 110 -104.13 gain 110 103 -105.42 gain 103 111 -93.94 gain 111 103 -92.44 gain 103 112 -97.99 gain 112 103 -98.49 gain 103 113 -95.95 gain 113 103 -103.38 gain 103 114 -95.67 gain 114 103 -98.74 gain 103 115 -89.48 gain 115 103 -93.41 gain 103 116 -86.30 gain 116 103 -86.25 gain 103 117 -77.95 gain 117 103 -77.74 gain 103 118 -79.56 gain 118 103 -87.53 gain 103 119 -79.88 gain 119 103 -79.40 gain 103 120 -111.09 gain 120 103 -110.71 gain 103 121 -106.74 gain 121 103 -109.11 gain 103 122 -109.25 gain 122 103 -114.19 gain 103 123 -105.03 gain 123 103 -110.22 gain 103 124 -112.57 gain 124 103 -111.36 gain 103 125 -104.77 gain 125 103 -105.49 gain 103 126 -91.46 gain 126 103 -97.07 gain 103 127 -102.71 gain 127 103 -103.07 gain 103 128 -94.69 gain 128 103 -98.11 gain 103 129 -86.48 gain 129 103 -87.11 gain 103 130 -94.53 gain 130 103 -97.35 gain 103 131 -90.21 gain 131 103 -91.38 gain 103 132 -82.23 gain 132 103 -79.68 gain 103 133 -87.99 gain 133 103 -89.87 gain 103 134 -84.74 gain 134 103 -84.62 gain 103 135 -108.15 gain 135 103 -103.61 gain 103 136 -104.58 gain 136 103 -108.81 gain 103 137 -105.50 gain 137 103 -106.40 gain 103 138 -108.35 gain 138 103 -111.26 gain 103 139 -98.49 gain 139 103 -103.10 gain 103 140 -104.14 gain 140 103 -108.57 gain 103 141 -93.62 gain 141 103 -93.73 gain 103 142 -98.17 gain 142 103 -99.44 gain 103 143 -102.23 gain 143 103 -105.95 gain 103 144 -97.24 gain 144 103 -96.85 gain 103 145 -93.81 gain 145 103 -97.98 gain 103 146 -88.89 gain 146 103 -89.50 gain 103 147 -93.07 gain 147 103 -94.87 gain 103 148 -90.04 gain 148 103 -92.37 gain 103 149 -88.05 gain 149 103 -86.75 gain 103 150 -102.61 gain 150 103 -104.70 gain 103 151 -110.32 gain 151 103 -114.89 gain 103 152 -103.96 gain 152 103 -106.89 gain 103 153 -102.59 gain 153 103 -105.21 gain 103 154 -100.47 gain 154 103 -104.23 gain 103 155 -101.87 gain 155 103 -102.92 gain 103 156 -96.23 gain 156 103 -98.41 gain 103 157 -98.30 gain 157 103 -101.77 gain 103 158 -93.95 gain 158 103 -99.38 gain 103 159 -99.70 gain 159 103 -99.18 gain 103 160 -105.92 gain 160 103 -106.77 gain 103 161 -97.66 gain 161 103 -99.56 gain 103 162 -92.72 gain 162 103 -94.26 gain 103 163 -88.77 gain 163 103 -87.73 gain 103 164 -94.77 gain 164 103 -100.96 gain 103 165 -108.33 gain 165 103 -111.87 gain 103 166 -112.49 gain 166 103 -117.69 gain 103 167 -106.87 gain 167 103 -110.89 gain 103 168 -113.99 gain 168 103 -117.08 gain 103 169 -106.19 gain 169 103 -105.79 gain 103 170 -101.68 gain 170 103 -102.22 gain 103 171 -96.57 gain 171 103 -97.69 gain 103 172 -96.25 gain 172 103 -100.16 gain 103 173 -93.32 gain 173 103 -91.55 gain 103 174 -95.20 gain 174 103 -99.38 gain 103 175 -91.46 gain 175 103 -87.44 gain 103 176 -85.50 gain 176 103 -85.71 gain 103 177 -89.90 gain 177 103 -92.47 gain 103 178 -92.30 gain 178 103 -92.47 gain 103 179 -92.80 gain 179 103 -96.02 gain 103 180 -112.13 gain 180 103 -114.09 gain 103 181 -109.42 gain 181 103 -114.78 gain 103 182 -108.13 gain 182 103 -109.62 gain 103 183 -102.35 gain 183 103 -99.73 gain 103 184 -109.81 gain 184 103 -113.42 gain 103 185 -97.48 gain 185 103 -99.58 gain 103 186 -99.52 gain 186 103 -102.33 gain 103 187 -100.40 gain 187 103 -103.23 gain 103 188 -105.54 gain 188 103 -112.81 gain 103 189 -102.31 gain 189 103 -105.64 gain 103 190 -99.75 gain 190 103 -95.91 gain 103 191 -108.23 gain 191 103 -107.57 gain 103 192 -94.24 gain 192 103 -97.24 gain 103 193 -97.88 gain 193 103 -96.91 gain 103 194 -91.49 gain 194 103 -90.41 gain 103 195 -106.55 gain 195 103 -103.44 gain 103 196 -112.81 gain 196 103 -117.37 gain 103 197 -102.62 gain 197 103 -104.67 gain 103 198 -107.46 gain 198 103 -112.15 gain 103 199 -104.79 gain 199 103 -103.50 gain 103 200 -105.11 gain 200 103 -105.73 gain 103 201 -107.37 gain 201 103 -111.08 gain 103 202 -108.10 gain 202 103 -110.11 gain 103 203 -103.22 gain 203 103 -105.33 gain 103 204 -101.97 gain 204 103 -102.30 gain 103 205 -97.33 gain 205 103 -97.33 gain 103 206 -102.21 gain 206 103 -103.53 gain 103 207 -98.47 gain 207 103 -97.54 gain 103 208 -97.19 gain 208 103 -99.55 gain 103 209 -103.05 gain 209 103 -104.46 gain 103 210 -103.91 gain 210 103 -109.32 gain 103 211 -110.80 gain 211 103 -113.59 gain 103 212 -111.86 gain 212 103 -113.21 gain 103 213 -102.37 gain 213 103 -106.45 gain 103 214 -110.37 gain 214 103 -112.64 gain 103 215 -102.00 gain 215 103 -106.08 gain 103 216 -104.12 gain 216 103 -105.10 gain 103 217 -99.32 gain 217 103 -104.74 gain 103 218 -105.79 gain 218 103 -112.54 gain 103 219 -99.63 gain 219 103 -103.94 gain 103 220 -94.81 gain 220 103 -96.24 gain 103 221 -104.02 gain 221 103 -106.44 gain 103 222 -98.72 gain 222 103 -97.72 gain 103 223 -98.94 gain 223 103 -100.23 gain 103 224 -100.20 gain 224 103 -98.42 gain 104 105 -105.01 gain 105 104 -110.41 gain 104 106 -104.97 gain 106 104 -109.68 gain 104 107 -97.58 gain 107 104 -105.30 gain 104 108 -99.58 gain 108 104 -105.36 gain 104 109 -100.67 gain 109 104 -103.30 gain 104 110 -97.65 gain 110 104 -102.52 gain 104 111 -97.21 gain 111 104 -99.28 gain 104 112 -87.52 gain 112 104 -91.59 gain 104 113 -92.39 gain 113 104 -103.40 gain 104 114 -87.88 gain 114 104 -94.52 gain 104 115 -94.28 gain 115 104 -101.77 gain 104 116 -84.99 gain 116 104 -88.51 gain 104 117 -81.72 gain 117 104 -85.08 gain 104 118 -81.17 gain 118 104 -92.70 gain 104 119 -75.35 gain 119 104 -78.44 gain 104 120 -111.03 gain 120 104 -114.22 gain 104 121 -101.42 gain 121 104 -107.35 gain 104 122 -99.49 gain 122 104 -108.00 gain 104 123 -88.03 gain 123 104 -96.80 gain 104 124 -100.42 gain 124 104 -102.79 gain 104 125 -96.23 gain 125 104 -100.52 gain 104 126 -101.04 gain 126 104 -110.22 gain 104 127 -90.17 gain 127 104 -94.10 gain 104 128 -97.58 gain 128 104 -104.57 gain 104 129 -94.38 gain 129 104 -98.59 gain 104 130 -90.84 gain 130 104 -97.23 gain 104 131 -85.64 gain 131 104 -90.38 gain 104 132 -87.14 gain 132 104 -88.16 gain 104 133 -82.19 gain 133 104 -87.64 gain 104 134 -83.55 gain 134 104 -87.00 gain 104 135 -101.18 gain 135 104 -100.21 gain 104 136 -102.26 gain 136 104 -110.07 gain 104 137 -108.58 gain 137 104 -113.05 gain 104 138 -107.47 gain 138 104 -113.95 gain 104 139 -98.03 gain 139 104 -106.22 gain 104 140 -99.05 gain 140 104 -107.04 gain 104 141 -93.32 gain 141 104 -97.01 gain 104 142 -94.43 gain 142 104 -99.26 gain 104 143 -90.37 gain 143 104 -97.66 gain 104 144 -84.81 gain 144 104 -87.99 gain 104 145 -89.74 gain 145 104 -97.47 gain 104 146 -90.09 gain 146 104 -94.27 gain 104 147 -79.62 gain 147 104 -84.99 gain 104 148 -85.37 gain 148 104 -91.27 gain 104 149 -79.46 gain 149 104 -81.74 gain 104 150 -106.01 gain 150 104 -111.67 gain 104 151 -106.65 gain 151 104 -114.79 gain 104 152 -103.71 gain 152 104 -110.21 gain 104 153 -101.85 gain 153 104 -108.04 gain 104 154 -102.60 gain 154 104 -109.92 gain 104 155 -99.79 gain 155 104 -104.41 gain 104 156 -97.94 gain 156 104 -103.69 gain 104 157 -94.56 gain 157 104 -101.60 gain 104 158 -95.99 gain 158 104 -105.00 gain 104 159 -94.55 gain 159 104 -97.59 gain 104 160 -93.02 gain 160 104 -97.44 gain 104 161 -89.32 gain 161 104 -94.80 gain 104 162 -91.61 gain 162 104 -96.71 gain 104 163 -86.50 gain 163 104 -89.03 gain 104 164 -86.39 gain 164 104 -96.15 gain 104 165 -106.11 gain 165 104 -113.22 gain 104 166 -103.37 gain 166 104 -112.15 gain 104 167 -99.51 gain 167 104 -107.11 gain 104 168 -104.67 gain 168 104 -111.33 gain 104 169 -97.48 gain 169 104 -100.65 gain 104 170 -105.07 gain 170 104 -109.19 gain 104 171 -96.96 gain 171 104 -101.64 gain 104 172 -94.85 gain 172 104 -102.33 gain 104 173 -100.25 gain 173 104 -102.05 gain 104 174 -99.90 gain 174 104 -107.66 gain 104 175 -102.51 gain 175 104 -102.06 gain 104 176 -90.91 gain 176 104 -94.69 gain 104 177 -87.20 gain 177 104 -93.34 gain 104 178 -86.43 gain 178 104 -90.18 gain 104 179 -90.95 gain 179 104 -97.74 gain 104 180 -113.53 gain 180 104 -119.06 gain 104 181 -102.12 gain 181 104 -111.04 gain 104 182 -105.61 gain 182 104 -110.67 gain 104 183 -105.14 gain 183 104 -106.08 gain 104 184 -101.55 gain 184 104 -108.72 gain 104 185 -101.49 gain 185 104 -107.17 gain 104 186 -97.55 gain 186 104 -103.93 gain 104 187 -90.63 gain 187 104 -97.03 gain 104 188 -90.47 gain 188 104 -101.31 gain 104 189 -104.62 gain 189 104 -111.53 gain 104 190 -87.48 gain 190 104 -87.21 gain 104 191 -95.15 gain 191 104 -98.05 gain 104 192 -100.83 gain 192 104 -107.41 gain 104 193 -92.04 gain 193 104 -94.64 gain 104 194 -96.25 gain 194 104 -98.74 gain 104 195 -106.71 gain 195 104 -107.17 gain 104 196 -105.97 gain 196 104 -114.10 gain 104 197 -105.75 gain 197 104 -111.37 gain 104 198 -99.89 gain 198 104 -108.16 gain 104 199 -96.24 gain 199 104 -98.52 gain 104 200 -104.61 gain 200 104 -108.81 gain 104 201 -96.27 gain 201 104 -103.56 gain 104 202 -104.67 gain 202 104 -110.25 gain 104 203 -99.38 gain 203 104 -105.06 gain 104 204 -102.15 gain 204 104 -106.05 gain 104 205 -96.24 gain 205 104 -99.81 gain 104 206 -99.11 gain 206 104 -104.00 gain 104 207 -94.46 gain 207 104 -97.10 gain 104 208 -97.37 gain 208 104 -103.30 gain 104 209 -91.26 gain 209 104 -96.23 gain 104 210 -104.68 gain 210 104 -113.65 gain 104 211 -108.82 gain 211 104 -115.19 gain 104 212 -105.29 gain 212 104 -110.20 gain 104 213 -100.77 gain 213 104 -108.43 gain 104 214 -97.18 gain 214 104 -103.02 gain 104 215 -105.65 gain 215 104 -113.30 gain 104 216 -99.04 gain 216 104 -103.58 gain 104 217 -102.19 gain 217 104 -111.19 gain 104 218 -100.20 gain 218 104 -110.51 gain 104 219 -104.13 gain 219 104 -112.02 gain 104 220 -98.34 gain 220 104 -103.34 gain 104 221 -89.76 gain 221 104 -95.75 gain 104 222 -102.88 gain 222 104 -105.45 gain 104 223 -91.47 gain 223 104 -96.33 gain 104 224 -102.59 gain 224 104 -104.38 gain 105 106 -72.23 gain 106 105 -71.54 gain 105 107 -84.45 gain 107 105 -86.77 gain 105 108 -89.58 gain 108 105 -89.96 gain 105 109 -92.90 gain 109 105 -90.13 gain 105 110 -87.42 gain 110 105 -86.89 gain 105 111 -97.29 gain 111 105 -93.96 gain 105 112 -105.27 gain 112 105 -103.94 gain 105 113 -97.98 gain 113 105 -103.58 gain 105 114 -108.90 gain 114 105 -110.14 gain 105 115 -102.18 gain 115 105 -104.28 gain 105 116 -116.73 gain 116 105 -114.85 gain 105 117 -110.99 gain 117 105 -108.95 gain 105 118 -104.24 gain 118 105 -110.38 gain 105 119 -103.07 gain 119 105 -100.76 gain 105 120 -66.96 gain 120 105 -64.75 gain 105 121 -82.73 gain 121 105 -83.26 gain 105 122 -89.86 gain 122 105 -92.96 gain 105 123 -82.63 gain 123 105 -85.99 gain 105 124 -92.68 gain 124 105 -89.64 gain 105 125 -96.57 gain 125 105 -95.47 gain 105 126 -102.22 gain 126 105 -106.00 gain 105 127 -104.27 gain 127 105 -102.80 gain 105 128 -98.89 gain 128 105 -100.48 gain 105 129 -109.61 gain 129 105 -108.41 gain 105 130 -110.08 gain 130 105 -111.06 gain 105 131 -101.88 gain 131 105 -101.22 gain 105 132 -109.74 gain 132 105 -105.36 gain 105 133 -108.59 gain 133 105 -108.64 gain 105 134 -109.04 gain 134 105 -107.08 gain 105 135 -90.91 gain 135 105 -84.54 gain 105 136 -87.21 gain 136 105 -89.62 gain 105 137 -88.20 gain 137 105 -87.27 gain 105 138 -86.44 gain 138 105 -87.52 gain 105 139 -96.65 gain 139 105 -99.44 gain 105 140 -101.86 gain 140 105 -104.45 gain 105 141 -96.83 gain 141 105 -95.11 gain 105 142 -93.87 gain 142 105 -93.30 gain 105 143 -101.60 gain 143 105 -103.48 gain 105 144 -100.61 gain 144 105 -98.39 gain 105 145 -111.61 gain 145 105 -113.95 gain 105 146 -106.52 gain 146 105 -105.30 gain 105 147 -106.38 gain 147 105 -106.36 gain 105 148 -108.46 gain 148 105 -108.96 gain 105 149 -110.58 gain 149 105 -107.45 gain 105 150 -85.87 gain 150 105 -86.13 gain 105 151 -93.17 gain 151 105 -95.91 gain 105 152 -88.57 gain 152 105 -89.67 gain 105 153 -83.17 gain 153 105 -83.96 gain 105 154 -96.93 gain 154 105 -98.85 gain 105 155 -90.47 gain 155 105 -89.69 gain 105 156 -104.11 gain 156 105 -104.45 gain 105 157 -113.57 gain 157 105 -115.21 gain 105 158 -104.35 gain 158 105 -107.96 gain 105 159 -104.80 gain 159 105 -102.44 gain 105 160 -112.82 gain 160 105 -111.84 gain 105 161 -111.39 gain 161 105 -111.47 gain 105 162 -107.82 gain 162 105 -107.53 gain 105 163 -111.06 gain 163 105 -108.19 gain 105 164 -112.70 gain 164 105 -117.06 gain 105 165 -93.16 gain 165 105 -94.87 gain 105 166 -85.95 gain 166 105 -89.32 gain 105 167 -93.14 gain 167 105 -95.33 gain 105 168 -101.12 gain 168 105 -102.38 gain 105 169 -89.32 gain 169 105 -87.09 gain 105 170 -99.33 gain 170 105 -98.04 gain 105 171 -97.46 gain 171 105 -96.75 gain 105 172 -100.04 gain 172 105 -102.12 gain 105 173 -103.72 gain 173 105 -100.12 gain 105 174 -113.50 gain 174 105 -115.85 gain 105 175 -100.24 gain 175 105 -94.40 gain 105 176 -113.46 gain 176 105 -111.84 gain 105 177 -108.50 gain 177 105 -109.24 gain 105 178 -108.35 gain 178 105 -106.69 gain 105 179 -110.88 gain 179 105 -112.27 gain 105 180 -97.80 gain 180 105 -97.92 gain 105 181 -98.32 gain 181 105 -101.85 gain 105 182 -91.53 gain 182 105 -91.19 gain 105 183 -101.00 gain 183 105 -96.54 gain 105 184 -98.00 gain 184 105 -99.77 gain 105 185 -96.29 gain 185 105 -96.56 gain 105 186 -108.43 gain 186 105 -109.41 gain 105 187 -97.29 gain 187 105 -98.28 gain 105 188 -97.45 gain 188 105 -102.89 gain 105 189 -103.90 gain 189 105 -105.40 gain 105 190 -107.07 gain 190 105 -101.40 gain 105 191 -108.59 gain 191 105 -106.10 gain 105 192 -107.36 gain 192 105 -108.54 gain 105 193 -116.42 gain 193 105 -113.62 gain 105 194 -114.58 gain 194 105 -111.67 gain 105 195 -100.23 gain 195 105 -95.29 gain 105 196 -97.00 gain 196 105 -99.73 gain 105 197 -99.98 gain 197 105 -100.20 gain 105 198 -102.27 gain 198 105 -105.13 gain 105 199 -103.21 gain 199 105 -100.09 gain 105 200 -100.04 gain 200 105 -98.84 gain 105 201 -107.16 gain 201 105 -109.04 gain 105 202 -98.19 gain 202 105 -98.38 gain 105 203 -105.51 gain 203 105 -105.79 gain 105 204 -105.37 gain 204 105 -103.87 gain 105 205 -111.23 gain 205 105 -109.40 gain 105 206 -103.99 gain 206 105 -103.48 gain 105 207 -107.96 gain 207 105 -105.19 gain 105 208 -110.61 gain 208 105 -111.15 gain 105 209 -116.23 gain 209 105 -115.80 gain 105 210 -99.62 gain 210 105 -103.19 gain 105 211 -98.72 gain 211 105 -99.68 gain 105 212 -101.06 gain 212 105 -100.57 gain 105 213 -106.68 gain 213 105 -108.93 gain 105 214 -102.60 gain 214 105 -103.03 gain 105 215 -99.99 gain 215 105 -102.25 gain 105 216 -110.06 gain 216 105 -109.21 gain 105 217 -100.73 gain 217 105 -104.32 gain 105 218 -105.87 gain 218 105 -110.78 gain 105 219 -109.58 gain 219 105 -112.07 gain 105 220 -104.13 gain 220 105 -103.73 gain 105 221 -111.46 gain 221 105 -112.05 gain 105 222 -108.14 gain 222 105 -105.31 gain 105 223 -103.02 gain 223 105 -102.48 gain 105 224 -117.96 gain 224 105 -114.35 gain 106 107 -80.67 gain 107 106 -83.69 gain 106 108 -83.78 gain 108 106 -84.86 gain 106 109 -85.62 gain 109 106 -83.54 gain 106 110 -94.39 gain 110 106 -94.56 gain 106 111 -93.29 gain 111 106 -90.65 gain 106 112 -100.97 gain 112 106 -100.33 gain 106 113 -97.48 gain 113 106 -103.78 gain 106 114 -103.55 gain 114 106 -105.48 gain 106 115 -105.46 gain 115 106 -108.25 gain 106 116 -110.58 gain 116 106 -109.40 gain 106 117 -102.18 gain 117 106 -100.84 gain 106 118 -110.25 gain 118 106 -117.09 gain 106 119 -103.58 gain 119 106 -101.96 gain 106 120 -86.23 gain 120 106 -84.72 gain 106 121 -76.36 gain 121 106 -77.58 gain 106 122 -74.56 gain 122 106 -78.36 gain 106 123 -81.36 gain 123 106 -85.41 gain 106 124 -93.45 gain 124 106 -91.11 gain 106 125 -88.48 gain 125 106 -88.07 gain 106 126 -92.99 gain 126 106 -97.46 gain 106 127 -99.61 gain 127 106 -98.84 gain 106 128 -99.43 gain 128 106 -101.72 gain 106 129 -99.71 gain 129 106 -99.21 gain 106 130 -103.88 gain 130 106 -105.56 gain 106 131 -109.16 gain 131 106 -109.20 gain 106 132 -109.65 gain 132 106 -105.96 gain 106 133 -103.29 gain 133 106 -104.04 gain 106 134 -105.53 gain 134 106 -104.27 gain 106 135 -91.50 gain 135 106 -85.83 gain 106 136 -79.45 gain 136 106 -82.55 gain 106 137 -84.75 gain 137 106 -84.51 gain 106 138 -85.97 gain 138 106 -87.75 gain 106 139 -92.71 gain 139 106 -96.19 gain 106 140 -96.10 gain 140 106 -99.39 gain 106 141 -97.14 gain 141 106 -96.12 gain 106 142 -97.18 gain 142 106 -97.31 gain 106 143 -100.12 gain 143 106 -102.70 gain 106 144 -101.18 gain 144 106 -99.67 gain 106 145 -106.58 gain 145 106 -109.61 gain 106 146 -109.24 gain 146 106 -108.72 gain 106 147 -105.60 gain 147 106 -106.27 gain 106 148 -107.19 gain 148 106 -108.38 gain 106 149 -111.57 gain 149 106 -109.14 gain 106 150 -91.79 gain 150 106 -92.74 gain 106 151 -88.42 gain 151 106 -91.85 gain 106 152 -89.09 gain 152 106 -90.88 gain 106 153 -90.06 gain 153 106 -91.54 gain 106 154 -98.47 gain 154 106 -101.08 gain 106 155 -95.79 gain 155 106 -95.70 gain 106 156 -95.72 gain 156 106 -96.76 gain 106 157 -96.57 gain 157 106 -98.91 gain 106 158 -104.94 gain 158 106 -109.25 gain 106 159 -99.98 gain 159 106 -98.32 gain 106 160 -100.30 gain 160 106 -100.02 gain 106 161 -102.04 gain 161 106 -102.81 gain 106 162 -105.70 gain 162 106 -106.11 gain 106 163 -107.27 gain 163 106 -105.10 gain 106 164 -109.19 gain 164 106 -114.25 gain 106 165 -93.36 gain 165 106 -95.76 gain 106 166 -93.28 gain 166 106 -97.35 gain 106 167 -95.57 gain 167 106 -98.46 gain 106 168 -90.30 gain 168 106 -92.25 gain 106 169 -92.62 gain 169 106 -91.09 gain 106 170 -99.71 gain 170 106 -99.12 gain 106 171 -103.86 gain 171 106 -103.84 gain 106 172 -100.70 gain 172 106 -103.48 gain 106 173 -98.73 gain 173 106 -95.83 gain 106 174 -110.37 gain 174 106 -113.43 gain 106 175 -111.29 gain 175 106 -106.14 gain 106 176 -104.05 gain 176 106 -103.12 gain 106 177 -118.74 gain 177 106 -120.18 gain 106 178 -105.98 gain 178 106 -105.02 gain 106 179 -112.07 gain 179 106 -114.15 gain 106 180 -89.62 gain 180 106 -90.44 gain 106 181 -104.97 gain 181 106 -109.19 gain 106 182 -95.81 gain 182 106 -96.16 gain 106 183 -93.80 gain 183 106 -90.04 gain 106 184 -90.57 gain 184 106 -93.04 gain 106 185 -97.13 gain 185 106 -98.10 gain 106 186 -102.09 gain 186 106 -103.76 gain 106 187 -107.16 gain 187 106 -108.86 gain 106 188 -110.52 gain 188 106 -116.66 gain 106 189 -107.60 gain 189 106 -109.79 gain 106 190 -102.73 gain 190 106 -97.76 gain 106 191 -109.72 gain 191 106 -107.92 gain 106 192 -109.69 gain 192 106 -111.56 gain 106 193 -110.68 gain 193 106 -108.57 gain 106 194 -111.72 gain 194 106 -109.50 gain 106 195 -98.61 gain 195 106 -94.36 gain 106 196 -98.12 gain 196 106 -101.54 gain 106 197 -104.21 gain 197 106 -105.13 gain 106 198 -100.76 gain 198 106 -104.32 gain 106 199 -98.85 gain 199 106 -96.43 gain 106 200 -100.90 gain 200 106 -100.39 gain 106 201 -97.46 gain 201 106 -100.04 gain 106 202 -96.92 gain 202 106 -97.80 gain 106 203 -107.06 gain 203 106 -108.03 gain 106 204 -104.56 gain 204 106 -103.76 gain 106 205 -105.88 gain 205 106 -104.74 gain 106 206 -112.38 gain 206 106 -112.57 gain 106 207 -107.49 gain 207 106 -105.42 gain 106 208 -108.94 gain 208 106 -110.17 gain 106 209 -114.25 gain 209 106 -114.52 gain 106 210 -106.16 gain 210 106 -110.43 gain 106 211 -99.52 gain 211 106 -101.18 gain 106 212 -98.85 gain 212 106 -99.06 gain 106 213 -102.42 gain 213 106 -105.37 gain 106 214 -103.97 gain 214 106 -105.10 gain 106 215 -99.84 gain 215 106 -102.79 gain 106 216 -100.36 gain 216 106 -100.20 gain 106 217 -99.04 gain 217 106 -103.33 gain 106 218 -107.61 gain 218 106 -113.22 gain 106 219 -103.35 gain 219 106 -106.53 gain 106 220 -105.79 gain 220 106 -106.08 gain 106 221 -114.79 gain 221 106 -116.08 gain 106 222 -107.60 gain 222 106 -105.46 gain 106 223 -108.28 gain 223 106 -108.44 gain 106 224 -111.76 gain 224 106 -108.84 gain 107 108 -81.64 gain 108 107 -79.70 gain 107 109 -91.80 gain 109 107 -86.71 gain 107 110 -84.12 gain 110 107 -81.27 gain 107 111 -103.46 gain 111 107 -97.81 gain 107 112 -100.53 gain 112 107 -96.87 gain 107 113 -103.15 gain 113 107 -106.43 gain 107 114 -105.82 gain 114 107 -104.74 gain 107 115 -103.75 gain 115 107 -103.53 gain 107 116 -106.63 gain 116 107 -102.43 gain 107 117 -107.25 gain 117 107 -102.90 gain 107 118 -114.53 gain 118 107 -118.35 gain 107 119 -106.08 gain 119 107 -101.44 gain 107 120 -87.02 gain 120 107 -82.49 gain 107 121 -74.00 gain 121 107 -72.21 gain 107 122 -75.01 gain 122 107 -75.79 gain 107 123 -88.89 gain 123 107 -89.93 gain 107 124 -84.45 gain 124 107 -79.09 gain 107 125 -86.08 gain 125 107 -82.65 gain 107 126 -99.20 gain 126 107 -100.66 gain 107 127 -101.79 gain 127 107 -98.00 gain 107 128 -95.27 gain 128 107 -94.54 gain 107 129 -102.77 gain 129 107 -99.25 gain 107 130 -104.54 gain 130 107 -103.20 gain 107 131 -105.39 gain 131 107 -102.41 gain 107 132 -106.98 gain 132 107 -100.28 gain 107 133 -103.35 gain 133 107 -101.08 gain 107 134 -104.05 gain 134 107 -99.78 gain 107 135 -95.43 gain 135 107 -86.74 gain 107 136 -95.20 gain 136 107 -95.28 gain 107 137 -89.07 gain 137 107 -85.81 gain 107 138 -85.58 gain 138 107 -84.34 gain 107 139 -93.65 gain 139 107 -94.12 gain 107 140 -91.96 gain 140 107 -92.24 gain 107 141 -96.08 gain 141 107 -92.04 gain 107 142 -107.04 gain 142 107 -104.16 gain 107 143 -93.33 gain 143 107 -92.89 gain 107 144 -107.62 gain 144 107 -103.09 gain 107 145 -105.04 gain 145 107 -105.06 gain 107 146 -106.26 gain 146 107 -102.72 gain 107 147 -113.87 gain 147 107 -111.52 gain 107 148 -114.83 gain 148 107 -113.01 gain 107 149 -115.69 gain 149 107 -110.24 gain 107 150 -92.66 gain 150 107 -90.60 gain 107 151 -97.19 gain 151 107 -97.61 gain 107 152 -89.08 gain 152 107 -87.85 gain 107 153 -92.54 gain 153 107 -91.01 gain 107 154 -94.75 gain 154 107 -94.35 gain 107 155 -93.88 gain 155 107 -90.78 gain 107 156 -104.66 gain 156 107 -102.68 gain 107 157 -101.35 gain 157 107 -100.67 gain 107 158 -99.43 gain 158 107 -100.72 gain 107 159 -101.91 gain 159 107 -97.23 gain 107 160 -102.88 gain 160 107 -99.58 gain 107 161 -103.17 gain 161 107 -100.93 gain 107 162 -106.85 gain 162 107 -104.24 gain 107 163 -108.22 gain 163 107 -103.03 gain 107 164 -108.90 gain 164 107 -110.94 gain 107 165 -99.39 gain 165 107 -98.78 gain 107 166 -95.95 gain 166 107 -97.00 gain 107 167 -99.21 gain 167 107 -99.08 gain 107 168 -100.99 gain 168 107 -99.92 gain 107 169 -92.44 gain 169 107 -87.89 gain 107 170 -100.27 gain 170 107 -96.66 gain 107 171 -102.62 gain 171 107 -99.58 gain 107 172 -93.12 gain 172 107 -92.88 gain 107 173 -103.77 gain 173 107 -97.85 gain 107 174 -110.16 gain 174 107 -110.20 gain 107 175 -107.16 gain 175 107 -99.00 gain 107 176 -112.54 gain 176 107 -108.60 gain 107 177 -106.83 gain 177 107 -105.25 gain 107 178 -112.58 gain 178 107 -108.61 gain 107 179 -104.29 gain 179 107 -103.36 gain 107 180 -99.54 gain 180 107 -97.35 gain 107 181 -97.00 gain 181 107 -98.21 gain 107 182 -98.75 gain 182 107 -96.09 gain 107 183 -99.70 gain 183 107 -92.92 gain 107 184 -97.38 gain 184 107 -96.83 gain 107 185 -109.57 gain 185 107 -107.52 gain 107 186 -104.94 gain 186 107 -103.59 gain 107 187 -99.33 gain 187 107 -98.01 gain 107 188 -104.68 gain 188 107 -107.79 gain 107 189 -104.80 gain 189 107 -103.98 gain 107 190 -108.15 gain 190 107 -100.16 gain 107 191 -109.07 gain 191 107 -104.26 gain 107 192 -108.09 gain 192 107 -106.95 gain 107 193 -108.35 gain 193 107 -103.23 gain 107 194 -108.31 gain 194 107 -103.08 gain 107 195 -104.63 gain 195 107 -97.37 gain 107 196 -99.03 gain 196 107 -99.44 gain 107 197 -104.33 gain 197 107 -102.23 gain 107 198 -106.53 gain 198 107 -107.08 gain 107 199 -103.18 gain 199 107 -97.74 gain 107 200 -100.26 gain 200 107 -96.74 gain 107 201 -99.25 gain 201 107 -98.81 gain 107 202 -107.27 gain 202 107 -105.14 gain 107 203 -110.53 gain 203 107 -108.49 gain 107 204 -104.69 gain 204 107 -100.87 gain 107 205 -106.93 gain 205 107 -102.78 gain 107 206 -112.93 gain 206 107 -110.10 gain 107 207 -113.71 gain 207 107 -108.62 gain 107 208 -113.49 gain 208 107 -111.71 gain 107 209 -112.42 gain 209 107 -109.68 gain 107 210 -110.82 gain 210 107 -112.07 gain 107 211 -107.52 gain 211 107 -106.17 gain 107 212 -102.15 gain 212 107 -99.34 gain 107 213 -97.05 gain 213 107 -96.98 gain 107 214 -104.63 gain 214 107 -102.74 gain 107 215 -105.97 gain 215 107 -105.90 gain 107 216 -104.66 gain 216 107 -101.48 gain 107 217 -103.60 gain 217 107 -104.88 gain 107 218 -105.05 gain 218 107 -107.64 gain 107 219 -110.17 gain 219 107 -110.33 gain 107 220 -102.34 gain 220 107 -99.62 gain 107 221 -107.94 gain 221 107 -106.21 gain 107 222 -104.85 gain 222 107 -99.70 gain 107 223 -110.07 gain 223 107 -107.20 gain 107 224 -112.61 gain 224 107 -106.68 gain 108 109 -71.95 gain 109 108 -68.80 gain 108 110 -79.00 gain 110 108 -78.09 gain 108 111 -83.45 gain 111 108 -79.73 gain 108 112 -93.94 gain 112 108 -92.22 gain 108 113 -98.30 gain 113 108 -103.52 gain 108 114 -99.84 gain 114 108 -100.69 gain 108 115 -100.27 gain 115 108 -101.98 gain 108 116 -101.35 gain 116 108 -99.09 gain 108 117 -110.17 gain 117 108 -107.74 gain 108 118 -110.36 gain 118 108 -116.11 gain 108 119 -106.66 gain 119 108 -103.97 gain 108 120 -95.27 gain 120 108 -92.68 gain 108 121 -85.94 gain 121 108 -86.09 gain 108 122 -75.77 gain 122 108 -78.49 gain 108 123 -76.30 gain 123 108 -79.27 gain 108 124 -75.74 gain 124 108 -72.32 gain 108 125 -78.91 gain 125 108 -77.43 gain 108 126 -100.95 gain 126 108 -104.35 gain 108 127 -93.85 gain 127 108 -92.00 gain 108 128 -95.18 gain 128 108 -96.38 gain 108 129 -102.47 gain 129 108 -100.90 gain 108 130 -104.88 gain 130 108 -105.48 gain 108 131 -103.84 gain 131 108 -102.80 gain 108 132 -102.31 gain 132 108 -97.54 gain 108 133 -104.94 gain 133 108 -104.60 gain 108 134 -100.91 gain 134 108 -98.57 gain 108 135 -97.79 gain 135 108 -91.03 gain 108 136 -92.09 gain 136 108 -94.11 gain 108 137 -82.96 gain 137 108 -81.64 gain 108 138 -80.04 gain 138 108 -80.74 gain 108 139 -82.77 gain 139 108 -85.17 gain 108 140 -96.05 gain 140 108 -98.26 gain 108 141 -91.79 gain 141 108 -89.68 gain 108 142 -92.28 gain 142 108 -91.33 gain 108 143 -100.75 gain 143 108 -102.25 gain 108 144 -107.85 gain 144 108 -105.25 gain 108 145 -97.95 gain 145 108 -99.90 gain 108 146 -105.56 gain 146 108 -103.95 gain 108 147 -99.59 gain 147 108 -99.18 gain 108 148 -109.65 gain 148 108 -109.76 gain 108 149 -110.00 gain 149 108 -106.49 gain 108 150 -92.43 gain 150 108 -92.30 gain 108 151 -89.15 gain 151 108 -91.50 gain 108 152 -89.36 gain 152 108 -90.07 gain 108 153 -92.57 gain 153 108 -92.98 gain 108 154 -95.50 gain 154 108 -97.04 gain 108 155 -95.76 gain 155 108 -94.59 gain 108 156 -95.50 gain 156 108 -95.46 gain 108 157 -97.57 gain 157 108 -98.83 gain 108 158 -103.22 gain 158 108 -106.44 gain 108 159 -100.52 gain 159 108 -97.78 gain 108 160 -97.73 gain 160 108 -96.37 gain 108 161 -101.96 gain 161 108 -101.66 gain 108 162 -109.92 gain 162 108 -109.24 gain 108 163 -105.59 gain 163 108 -102.33 gain 108 164 -105.38 gain 164 108 -109.35 gain 108 165 -103.73 gain 165 108 -105.05 gain 108 166 -105.69 gain 166 108 -108.68 gain 108 167 -96.43 gain 167 108 -98.24 gain 108 168 -96.31 gain 168 108 -97.19 gain 108 169 -92.72 gain 169 108 -90.11 gain 108 170 -93.75 gain 170 108 -92.08 gain 108 171 -93.53 gain 171 108 -92.43 gain 108 172 -96.81 gain 172 108 -98.51 gain 108 173 -106.19 gain 173 108 -102.20 gain 108 174 -101.87 gain 174 108 -103.85 gain 108 175 -109.44 gain 175 108 -103.21 gain 108 176 -103.06 gain 176 108 -101.06 gain 108 177 -112.84 gain 177 108 -113.19 gain 108 178 -97.45 gain 178 108 -95.41 gain 108 179 -108.68 gain 179 108 -109.69 gain 108 180 -101.97 gain 180 108 -101.72 gain 108 181 -98.29 gain 181 108 -101.43 gain 108 182 -95.59 gain 182 108 -94.86 gain 108 183 -101.55 gain 183 108 -96.71 gain 108 184 -97.76 gain 184 108 -99.15 gain 108 185 -96.46 gain 185 108 -96.34 gain 108 186 -97.68 gain 186 108 -98.27 gain 108 187 -90.18 gain 187 108 -90.79 gain 108 188 -99.01 gain 188 108 -104.06 gain 108 189 -100.83 gain 189 108 -101.94 gain 108 190 -99.79 gain 190 108 -93.74 gain 108 191 -102.81 gain 191 108 -99.93 gain 108 192 -95.05 gain 192 108 -95.85 gain 108 193 -104.11 gain 193 108 -100.92 gain 108 194 -107.18 gain 194 108 -103.88 gain 108 195 -98.79 gain 195 108 -93.47 gain 108 196 -99.75 gain 196 108 -102.10 gain 108 197 -99.95 gain 197 108 -99.79 gain 108 198 -111.13 gain 198 108 -113.61 gain 108 199 -100.20 gain 199 108 -96.70 gain 108 200 -102.37 gain 200 108 -100.78 gain 108 201 -103.33 gain 201 108 -104.83 gain 108 202 -105.32 gain 202 108 -105.12 gain 108 203 -100.37 gain 203 108 -100.27 gain 108 204 -101.94 gain 204 108 -100.05 gain 108 205 -107.55 gain 205 108 -105.34 gain 108 206 -108.10 gain 206 108 -107.20 gain 108 207 -108.04 gain 207 108 -104.89 gain 108 208 -108.86 gain 208 108 -109.01 gain 108 209 -106.65 gain 209 108 -105.84 gain 108 210 -104.19 gain 210 108 -107.38 gain 108 211 -100.40 gain 211 108 -100.99 gain 108 212 -106.96 gain 212 108 -106.09 gain 108 213 -105.45 gain 213 108 -107.32 gain 108 214 -102.72 gain 214 108 -102.77 gain 108 215 -98.72 gain 215 108 -100.58 gain 108 216 -98.75 gain 216 108 -97.52 gain 108 217 -99.25 gain 217 108 -102.46 gain 108 218 -103.72 gain 218 108 -108.25 gain 108 219 -108.32 gain 219 108 -110.42 gain 108 220 -101.59 gain 220 108 -100.81 gain 108 221 -104.37 gain 221 108 -104.58 gain 108 222 -110.99 gain 222 108 -107.78 gain 108 223 -103.03 gain 223 108 -102.10 gain 108 224 -106.47 gain 224 108 -102.48 gain 109 110 -67.40 gain 110 109 -69.64 gain 109 111 -75.37 gain 111 109 -74.81 gain 109 112 -92.97 gain 112 109 -94.42 gain 109 113 -83.69 gain 113 109 -92.07 gain 109 114 -98.60 gain 114 109 -102.60 gain 109 115 -97.32 gain 115 109 -102.18 gain 109 116 -98.48 gain 116 109 -99.37 gain 109 117 -94.81 gain 117 109 -95.55 gain 109 118 -98.81 gain 118 109 -107.72 gain 109 119 -94.89 gain 119 109 -95.35 gain 109 120 -88.87 gain 120 109 -89.43 gain 109 121 -87.39 gain 121 109 -90.69 gain 109 122 -85.40 gain 122 109 -91.28 gain 109 123 -82.07 gain 123 109 -88.21 gain 109 124 -69.49 gain 124 109 -69.22 gain 109 125 -73.33 gain 125 109 -75.00 gain 109 126 -81.54 gain 126 109 -88.09 gain 109 127 -92.12 gain 127 109 -93.42 gain 109 128 -85.66 gain 128 109 -90.02 gain 109 129 -98.48 gain 129 109 -100.05 gain 109 130 -96.94 gain 130 109 -100.70 gain 109 131 -96.90 gain 131 109 -99.02 gain 109 132 -88.58 gain 132 109 -86.97 gain 109 133 -104.13 gain 133 109 -106.95 gain 109 134 -102.82 gain 134 109 -103.64 gain 109 135 -91.93 gain 135 109 -88.33 gain 109 136 -85.12 gain 136 109 -90.30 gain 109 137 -90.67 gain 137 109 -92.50 gain 109 138 -79.51 gain 138 109 -83.37 gain 109 139 -82.18 gain 139 109 -87.74 gain 109 140 -81.59 gain 140 109 -86.95 gain 109 141 -89.82 gain 141 109 -90.87 gain 109 142 -94.73 gain 142 109 -96.94 gain 109 143 -88.61 gain 143 109 -93.26 gain 109 144 -99.22 gain 144 109 -99.77 gain 109 145 -98.54 gain 145 109 -103.65 gain 109 146 -94.27 gain 146 109 -95.82 gain 109 147 -95.60 gain 147 109 -98.35 gain 109 148 -100.12 gain 148 109 -103.39 gain 109 149 -100.16 gain 149 109 -99.80 gain 109 150 -94.84 gain 150 109 -97.87 gain 109 151 -94.29 gain 151 109 -99.79 gain 109 152 -86.84 gain 152 109 -90.71 gain 109 153 -83.69 gain 153 109 -87.25 gain 109 154 -88.30 gain 154 109 -93.00 gain 109 155 -90.74 gain 155 109 -92.73 gain 109 156 -91.31 gain 156 109 -94.43 gain 109 157 -88.31 gain 157 109 -92.72 gain 109 158 -92.71 gain 158 109 -99.09 gain 109 159 -97.17 gain 159 109 -97.59 gain 109 160 -104.33 gain 160 109 -106.12 gain 109 161 -95.21 gain 161 109 -98.06 gain 109 162 -101.55 gain 162 109 -104.03 gain 109 163 -95.27 gain 163 109 -95.17 gain 109 164 -99.22 gain 164 109 -106.35 gain 109 165 -97.80 gain 165 109 -102.28 gain 109 166 -93.66 gain 166 109 -99.80 gain 109 167 -87.27 gain 167 109 -92.24 gain 109 168 -98.50 gain 168 109 -102.53 gain 109 169 -95.13 gain 169 109 -95.67 gain 109 170 -93.21 gain 170 109 -94.69 gain 109 171 -87.19 gain 171 109 -89.25 gain 109 172 -96.66 gain 172 109 -101.51 gain 109 173 -96.70 gain 173 109 -95.88 gain 109 174 -98.49 gain 174 109 -103.62 gain 109 175 -104.48 gain 175 109 -101.41 gain 109 176 -107.63 gain 176 109 -108.78 gain 109 177 -99.04 gain 177 109 -102.55 gain 109 178 -105.06 gain 178 109 -106.17 gain 109 179 -105.21 gain 179 109 -109.38 gain 109 180 -99.10 gain 180 109 -101.99 gain 109 181 -97.35 gain 181 109 -103.65 gain 109 182 -90.49 gain 182 109 -92.92 gain 109 183 -90.13 gain 183 109 -88.45 gain 109 184 -100.71 gain 184 109 -105.26 gain 109 185 -97.31 gain 185 109 -100.35 gain 109 186 -93.95 gain 186 109 -97.69 gain 109 187 -93.46 gain 187 109 -97.23 gain 109 188 -99.00 gain 188 109 -107.21 gain 109 189 -100.98 gain 189 109 -105.25 gain 109 190 -98.81 gain 190 109 -95.92 gain 109 191 -94.14 gain 191 109 -94.42 gain 109 192 -100.98 gain 192 109 -104.93 gain 109 193 -103.60 gain 193 109 -103.57 gain 109 194 -103.42 gain 194 109 -103.28 gain 109 195 -106.68 gain 195 109 -104.51 gain 109 196 -95.97 gain 196 109 -101.47 gain 109 197 -103.55 gain 197 109 -106.54 gain 109 198 -97.55 gain 198 109 -103.19 gain 109 199 -96.61 gain 199 109 -96.26 gain 109 200 -98.83 gain 200 109 -100.39 gain 109 201 -92.47 gain 201 109 -97.13 gain 109 202 -100.97 gain 202 109 -103.93 gain 109 203 -102.82 gain 203 109 -105.87 gain 109 204 -91.85 gain 204 109 -93.12 gain 109 205 -96.69 gain 205 109 -97.63 gain 109 206 -95.66 gain 206 109 -97.92 gain 109 207 -101.50 gain 207 109 -101.50 gain 109 208 -102.69 gain 208 109 -106.00 gain 109 209 -108.12 gain 209 109 -110.46 gain 109 210 -95.05 gain 210 109 -101.39 gain 109 211 -97.93 gain 211 109 -101.67 gain 109 212 -98.54 gain 212 109 -100.82 gain 109 213 -104.27 gain 213 109 -109.30 gain 109 214 -104.12 gain 214 109 -107.32 gain 109 215 -98.86 gain 215 109 -103.88 gain 109 216 -105.57 gain 216 109 -107.49 gain 109 217 -90.49 gain 217 109 -96.86 gain 109 218 -94.56 gain 218 109 -102.24 gain 109 219 -94.86 gain 219 109 -100.12 gain 109 220 -103.18 gain 220 109 -105.56 gain 109 221 -106.13 gain 221 109 -109.49 gain 109 222 -99.45 gain 222 109 -99.39 gain 109 223 -109.28 gain 223 109 -111.51 gain 109 224 -107.71 gain 224 109 -106.87 gain 110 111 -75.78 gain 111 110 -72.98 gain 110 112 -75.23 gain 112 110 -74.43 gain 110 113 -81.78 gain 113 110 -87.91 gain 110 114 -95.90 gain 114 110 -97.67 gain 110 115 -100.49 gain 115 110 -103.11 gain 110 116 -94.82 gain 116 110 -93.47 gain 110 117 -101.23 gain 117 110 -99.73 gain 110 118 -99.34 gain 118 110 -106.00 gain 110 119 -103.88 gain 119 110 -102.10 gain 110 120 -91.14 gain 120 110 -89.46 gain 110 121 -92.74 gain 121 110 -93.80 gain 110 122 -101.79 gain 122 110 -105.43 gain 110 123 -81.82 gain 123 110 -85.71 gain 110 124 -86.79 gain 124 110 -84.29 gain 110 125 -75.86 gain 125 110 -75.29 gain 110 126 -85.88 gain 126 110 -90.19 gain 110 127 -85.08 gain 127 110 -84.15 gain 110 128 -89.67 gain 128 110 -91.79 gain 110 129 -91.93 gain 129 110 -91.26 gain 110 130 -98.37 gain 130 110 -99.88 gain 110 131 -97.47 gain 131 110 -97.35 gain 110 132 -103.77 gain 132 110 -99.92 gain 110 133 -94.65 gain 133 110 -95.23 gain 110 134 -101.60 gain 134 110 -100.18 gain 110 135 -86.29 gain 135 110 -80.45 gain 110 136 -95.14 gain 136 110 -98.08 gain 110 137 -88.85 gain 137 110 -88.45 gain 110 138 -85.73 gain 138 110 -87.34 gain 110 139 -83.22 gain 139 110 -86.53 gain 110 140 -90.36 gain 140 110 -93.48 gain 110 141 -95.50 gain 141 110 -94.31 gain 110 142 -95.69 gain 142 110 -95.65 gain 110 143 -98.47 gain 143 110 -100.88 gain 110 144 -96.78 gain 144 110 -95.09 gain 110 145 -98.05 gain 145 110 -100.92 gain 110 146 -102.03 gain 146 110 -101.34 gain 110 147 -95.19 gain 147 110 -95.70 gain 110 148 -99.71 gain 148 110 -100.74 gain 110 149 -104.88 gain 149 110 -102.29 gain 110 150 -96.13 gain 150 110 -96.92 gain 110 151 -99.29 gain 151 110 -102.56 gain 110 152 -90.55 gain 152 110 -92.18 gain 110 153 -91.59 gain 153 110 -92.91 gain 110 154 -87.93 gain 154 110 -90.38 gain 110 155 -92.50 gain 155 110 -92.25 gain 110 156 -90.04 gain 156 110 -90.92 gain 110 157 -91.15 gain 157 110 -93.32 gain 110 158 -98.65 gain 158 110 -102.79 gain 110 159 -98.65 gain 159 110 -96.83 gain 110 160 -92.65 gain 160 110 -92.20 gain 110 161 -98.08 gain 161 110 -98.69 gain 110 162 -105.41 gain 162 110 -105.65 gain 110 163 -109.93 gain 163 110 -107.59 gain 110 164 -100.14 gain 164 110 -105.02 gain 110 165 -92.20 gain 165 110 -94.45 gain 110 166 -101.53 gain 166 110 -105.43 gain 110 167 -89.70 gain 167 110 -92.43 gain 110 168 -95.93 gain 168 110 -97.71 gain 110 169 -96.48 gain 169 110 -94.78 gain 110 170 -96.54 gain 170 110 -95.78 gain 110 171 -94.15 gain 171 110 -93.96 gain 110 172 -95.71 gain 172 110 -98.32 gain 110 173 -99.97 gain 173 110 -96.90 gain 110 174 -93.62 gain 174 110 -96.50 gain 110 175 -101.77 gain 175 110 -96.45 gain 110 176 -100.35 gain 176 110 -99.26 gain 110 177 -93.08 gain 177 110 -94.36 gain 110 178 -98.85 gain 178 110 -97.73 gain 110 179 -99.53 gain 179 110 -101.45 gain 110 180 -101.88 gain 180 110 -102.54 gain 110 181 -105.54 gain 181 110 -109.60 gain 110 182 -95.30 gain 182 110 -95.49 gain 110 183 -102.07 gain 183 110 -98.14 gain 110 184 -91.57 gain 184 110 -93.88 gain 110 185 -93.44 gain 185 110 -94.24 gain 110 186 -92.32 gain 186 110 -93.83 gain 110 187 -94.20 gain 187 110 -95.73 gain 110 188 -96.13 gain 188 110 -102.10 gain 110 189 -103.37 gain 189 110 -105.40 gain 110 190 -98.88 gain 190 110 -93.74 gain 110 191 -105.92 gain 191 110 -103.95 gain 110 192 -90.70 gain 192 110 -92.41 gain 110 193 -104.94 gain 193 110 -102.67 gain 110 194 -111.17 gain 194 110 -108.79 gain 110 195 -98.81 gain 195 110 -94.40 gain 110 196 -103.89 gain 196 110 -107.15 gain 110 197 -97.53 gain 197 110 -98.28 gain 110 198 -95.67 gain 198 110 -99.06 gain 110 199 -101.90 gain 199 110 -99.31 gain 110 200 -104.65 gain 200 110 -103.97 gain 110 201 -102.70 gain 201 110 -105.12 gain 110 202 -95.33 gain 202 110 -96.04 gain 110 203 -94.55 gain 203 110 -95.36 gain 110 204 -103.63 gain 204 110 -102.66 gain 110 205 -105.54 gain 205 110 -104.23 gain 110 206 -105.11 gain 206 110 -105.14 gain 110 207 -112.75 gain 207 110 -110.51 gain 110 208 -100.90 gain 208 110 -101.96 gain 110 209 -105.88 gain 209 110 -105.99 gain 110 210 -103.67 gain 210 110 -107.78 gain 110 211 -93.84 gain 211 110 -95.34 gain 110 212 -99.97 gain 212 110 -100.02 gain 110 213 -98.75 gain 213 110 -101.53 gain 110 214 -101.73 gain 214 110 -102.69 gain 110 215 -104.28 gain 215 110 -107.06 gain 110 216 -100.55 gain 216 110 -100.22 gain 110 217 -93.09 gain 217 110 -97.21 gain 110 218 -102.24 gain 218 110 -107.68 gain 110 219 -98.88 gain 219 110 -101.89 gain 110 220 -104.23 gain 220 110 -104.36 gain 110 221 -107.70 gain 221 110 -108.83 gain 110 222 -102.21 gain 222 110 -99.91 gain 110 223 -107.06 gain 223 110 -107.05 gain 110 224 -108.98 gain 224 110 -105.90 gain 111 112 -72.74 gain 112 111 -74.74 gain 111 113 -84.39 gain 113 111 -93.33 gain 111 114 -90.94 gain 114 111 -95.52 gain 111 115 -88.65 gain 115 111 -94.08 gain 111 116 -96.87 gain 116 111 -98.32 gain 111 117 -94.63 gain 117 111 -95.93 gain 111 118 -99.11 gain 118 111 -108.58 gain 111 119 -100.97 gain 119 111 -101.99 gain 111 120 -91.95 gain 120 111 -93.07 gain 111 121 -94.09 gain 121 111 -97.96 gain 111 122 -89.66 gain 122 111 -96.10 gain 111 123 -88.83 gain 123 111 -95.52 gain 111 124 -85.99 gain 124 111 -86.29 gain 111 125 -79.02 gain 125 111 -81.25 gain 111 126 -67.23 gain 126 111 -74.34 gain 111 127 -71.07 gain 127 111 -72.94 gain 111 128 -84.26 gain 128 111 -89.18 gain 111 129 -82.98 gain 129 111 -85.12 gain 111 130 -87.73 gain 130 111 -92.05 gain 111 131 -99.76 gain 131 111 -102.44 gain 111 132 -95.44 gain 132 111 -94.39 gain 111 133 -102.55 gain 133 111 -105.94 gain 111 134 -96.35 gain 134 111 -97.73 gain 111 135 -92.69 gain 135 111 -89.66 gain 111 136 -97.69 gain 136 111 -103.43 gain 111 137 -84.28 gain 137 111 -86.68 gain 111 138 -87.31 gain 138 111 -91.73 gain 111 139 -80.73 gain 139 111 -86.86 gain 111 140 -82.15 gain 140 111 -88.08 gain 111 141 -79.14 gain 141 111 -80.76 gain 111 142 -83.97 gain 142 111 -86.74 gain 111 143 -88.98 gain 143 111 -94.20 gain 111 144 -88.62 gain 144 111 -89.74 gain 111 145 -89.51 gain 145 111 -95.19 gain 111 146 -91.98 gain 146 111 -94.10 gain 111 147 -101.39 gain 147 111 -104.70 gain 111 148 -102.15 gain 148 111 -105.98 gain 111 149 -91.77 gain 149 111 -91.97 gain 111 150 -97.40 gain 150 111 -101.00 gain 111 151 -92.07 gain 151 111 -98.14 gain 111 152 -90.02 gain 152 111 -94.45 gain 111 153 -90.59 gain 153 111 -94.72 gain 111 154 -89.80 gain 154 111 -95.06 gain 111 155 -90.53 gain 155 111 -93.09 gain 111 156 -84.14 gain 156 111 -87.82 gain 111 157 -93.05 gain 157 111 -98.03 gain 111 158 -94.06 gain 158 111 -101.01 gain 111 159 -91.98 gain 159 111 -92.96 gain 111 160 -81.71 gain 160 111 -84.07 gain 111 161 -102.02 gain 161 111 -105.43 gain 111 162 -94.47 gain 162 111 -97.51 gain 111 163 -97.04 gain 163 111 -97.50 gain 111 164 -99.64 gain 164 111 -107.33 gain 111 165 -98.71 gain 165 111 -103.75 gain 111 166 -101.32 gain 166 111 -108.02 gain 111 167 -94.56 gain 167 111 -100.08 gain 111 168 -95.00 gain 168 111 -99.59 gain 111 169 -91.48 gain 169 111 -92.59 gain 111 170 -90.26 gain 170 111 -92.31 gain 111 171 -94.34 gain 171 111 -96.95 gain 111 172 -85.56 gain 172 111 -90.98 gain 111 173 -91.73 gain 173 111 -91.47 gain 111 174 -93.59 gain 174 111 -99.29 gain 111 175 -98.29 gain 175 111 -95.78 gain 111 176 -96.82 gain 176 111 -98.53 gain 111 177 -101.39 gain 177 111 -105.46 gain 111 178 -97.83 gain 178 111 -99.51 gain 111 179 -102.95 gain 179 111 -107.68 gain 111 180 -102.51 gain 180 111 -105.97 gain 111 181 -95.16 gain 181 111 -102.03 gain 111 182 -96.69 gain 182 111 -99.69 gain 111 183 -91.97 gain 183 111 -90.85 gain 111 184 -91.96 gain 184 111 -97.07 gain 111 185 -92.41 gain 185 111 -96.01 gain 111 186 -97.46 gain 186 111 -101.77 gain 111 187 -92.55 gain 187 111 -96.88 gain 111 188 -98.49 gain 188 111 -107.26 gain 111 189 -99.97 gain 189 111 -104.80 gain 111 190 -94.23 gain 190 111 -91.90 gain 111 191 -96.84 gain 191 111 -97.68 gain 111 192 -103.04 gain 192 111 -107.55 gain 111 193 -97.49 gain 193 111 -98.03 gain 111 194 -109.85 gain 194 111 -110.28 gain 111 195 -100.35 gain 195 111 -98.74 gain 111 196 -103.28 gain 196 111 -109.35 gain 111 197 -98.83 gain 197 111 -102.39 gain 111 198 -91.46 gain 198 111 -97.66 gain 111 199 -102.54 gain 199 111 -102.75 gain 111 200 -100.08 gain 200 111 -102.21 gain 111 201 -97.51 gain 201 111 -102.73 gain 111 202 -95.36 gain 202 111 -98.88 gain 111 203 -91.44 gain 203 111 -95.06 gain 111 204 -97.78 gain 204 111 -99.61 gain 111 205 -101.07 gain 205 111 -102.57 gain 111 206 -105.65 gain 206 111 -108.48 gain 111 207 -106.06 gain 207 111 -106.63 gain 111 208 -98.33 gain 208 111 -102.20 gain 111 209 -98.51 gain 209 111 -101.42 gain 111 210 -101.14 gain 210 111 -108.05 gain 111 211 -100.10 gain 211 111 -104.40 gain 111 212 -96.98 gain 212 111 -99.83 gain 111 213 -93.37 gain 213 111 -98.95 gain 111 214 -97.95 gain 214 111 -101.72 gain 111 215 -97.53 gain 215 111 -103.12 gain 111 216 -95.18 gain 216 111 -97.66 gain 111 217 -95.21 gain 217 111 -102.14 gain 111 218 -92.10 gain 218 111 -100.35 gain 111 219 -96.18 gain 219 111 -102.00 gain 111 220 -103.94 gain 220 111 -106.88 gain 111 221 -95.21 gain 221 111 -99.13 gain 111 222 -99.13 gain 222 111 -99.64 gain 111 223 -101.76 gain 223 111 -104.56 gain 111 224 -105.92 gain 224 111 -105.64 gain 112 113 -77.87 gain 113 112 -84.80 gain 112 114 -83.10 gain 114 112 -85.67 gain 112 115 -86.77 gain 115 112 -90.20 gain 112 116 -86.14 gain 116 112 -85.59 gain 112 117 -99.77 gain 117 112 -99.06 gain 112 118 -97.72 gain 118 112 -105.19 gain 112 119 -99.59 gain 119 112 -98.61 gain 112 120 -97.03 gain 120 112 -96.15 gain 112 121 -98.43 gain 121 112 -100.30 gain 112 122 -89.57 gain 122 112 -94.01 gain 112 123 -92.04 gain 123 112 -96.73 gain 112 124 -86.62 gain 124 112 -84.91 gain 112 125 -85.70 gain 125 112 -85.92 gain 112 126 -73.30 gain 126 112 -78.41 gain 112 127 -69.15 gain 127 112 -69.02 gain 112 128 -77.52 gain 128 112 -80.44 gain 112 129 -84.78 gain 129 112 -84.92 gain 112 130 -87.66 gain 130 112 -89.97 gain 112 131 -92.92 gain 131 112 -93.60 gain 112 132 -98.93 gain 132 112 -95.88 gain 112 133 -96.88 gain 133 112 -98.25 gain 112 134 -94.41 gain 134 112 -93.78 gain 112 135 -103.34 gain 135 112 -98.31 gain 112 136 -102.96 gain 136 112 -106.70 gain 112 137 -94.35 gain 137 112 -94.75 gain 112 138 -93.23 gain 138 112 -95.64 gain 112 139 -90.96 gain 139 112 -95.08 gain 112 140 -91.98 gain 140 112 -95.91 gain 112 141 -75.96 gain 141 112 -75.57 gain 112 142 -84.91 gain 142 112 -85.67 gain 112 143 -83.74 gain 143 112 -86.95 gain 112 144 -87.61 gain 144 112 -86.73 gain 112 145 -91.75 gain 145 112 -95.42 gain 112 146 -97.53 gain 146 112 -97.64 gain 112 147 -95.06 gain 147 112 -96.36 gain 112 148 -92.11 gain 148 112 -93.94 gain 112 149 -104.59 gain 149 112 -102.80 gain 112 150 -105.12 gain 150 112 -106.71 gain 112 151 -103.52 gain 151 112 -107.59 gain 112 152 -105.21 gain 152 112 -107.64 gain 112 153 -98.28 gain 153 112 -100.40 gain 112 154 -87.56 gain 154 112 -90.81 gain 112 155 -89.13 gain 155 112 -89.68 gain 112 156 -88.86 gain 156 112 -90.54 gain 112 157 -93.60 gain 157 112 -96.57 gain 112 158 -88.80 gain 158 112 -93.74 gain 112 159 -93.18 gain 159 112 -92.16 gain 112 160 -97.94 gain 160 112 -98.30 gain 112 161 -97.57 gain 161 112 -98.98 gain 112 162 -97.87 gain 162 112 -98.91 gain 112 163 -100.42 gain 163 112 -98.88 gain 112 164 -102.28 gain 164 112 -107.97 gain 112 165 -105.99 gain 165 112 -109.04 gain 112 166 -100.52 gain 166 112 -105.22 gain 112 167 -95.25 gain 167 112 -98.77 gain 112 168 -95.96 gain 168 112 -98.55 gain 112 169 -98.40 gain 169 112 -97.51 gain 112 170 -96.47 gain 170 112 -96.51 gain 112 171 -102.50 gain 171 112 -103.12 gain 112 172 -93.77 gain 172 112 -97.18 gain 112 173 -99.50 gain 173 112 -97.23 gain 112 174 -98.78 gain 174 112 -102.47 gain 112 175 -97.83 gain 175 112 -93.32 gain 112 176 -97.98 gain 176 112 -97.69 gain 112 177 -95.58 gain 177 112 -97.65 gain 112 178 -100.32 gain 178 112 -100.00 gain 112 179 -97.47 gain 179 112 -100.19 gain 112 180 -101.09 gain 180 112 -102.54 gain 112 181 -98.00 gain 181 112 -102.86 gain 112 182 -99.73 gain 182 112 -100.72 gain 112 183 -95.59 gain 183 112 -92.46 gain 112 184 -102.82 gain 184 112 -105.92 gain 112 185 -93.37 gain 185 112 -94.97 gain 112 186 -88.23 gain 186 112 -90.54 gain 112 187 -93.64 gain 187 112 -95.97 gain 112 188 -91.90 gain 188 112 -98.67 gain 112 189 -98.84 gain 189 112 -101.67 gain 112 190 -98.80 gain 190 112 -94.46 gain 112 191 -98.37 gain 191 112 -97.21 gain 112 192 -100.61 gain 192 112 -103.11 gain 112 193 -97.65 gain 193 112 -96.18 gain 112 194 -106.44 gain 194 112 -104.86 gain 112 195 -105.09 gain 195 112 -101.48 gain 112 196 -102.81 gain 196 112 -106.87 gain 112 197 -92.31 gain 197 112 -93.86 gain 112 198 -101.08 gain 198 112 -105.27 gain 112 199 -99.34 gain 199 112 -97.55 gain 112 200 -95.69 gain 200 112 -95.82 gain 112 201 -92.18 gain 201 112 -95.39 gain 112 202 -93.34 gain 202 112 -94.85 gain 112 203 -96.75 gain 203 112 -98.37 gain 112 204 -99.11 gain 204 112 -98.95 gain 112 205 -99.15 gain 205 112 -98.64 gain 112 206 -102.92 gain 206 112 -103.74 gain 112 207 -94.98 gain 207 112 -93.54 gain 112 208 -99.57 gain 208 112 -101.44 gain 112 209 -109.63 gain 209 112 -110.53 gain 112 210 -102.81 gain 210 112 -107.71 gain 112 211 -102.07 gain 211 112 -104.37 gain 112 212 -96.33 gain 212 112 -97.18 gain 112 213 -103.57 gain 213 112 -107.16 gain 112 214 -100.43 gain 214 112 -102.20 gain 112 215 -99.60 gain 215 112 -103.18 gain 112 216 -101.39 gain 216 112 -101.86 gain 112 217 -102.51 gain 217 112 -107.44 gain 112 218 -96.09 gain 218 112 -102.33 gain 112 219 -105.51 gain 219 112 -109.33 gain 112 220 -101.63 gain 220 112 -102.56 gain 112 221 -91.38 gain 221 112 -93.31 gain 112 222 -101.48 gain 222 112 -99.98 gain 112 223 -107.76 gain 223 112 -108.55 gain 112 224 -107.68 gain 224 112 -105.40 gain 113 114 -81.74 gain 114 113 -77.37 gain 113 115 -94.24 gain 115 113 -90.73 gain 113 116 -87.95 gain 116 113 -80.47 gain 113 117 -104.90 gain 117 113 -97.26 gain 113 118 -97.70 gain 118 113 -98.23 gain 113 119 -105.62 gain 119 113 -97.70 gain 113 120 -108.11 gain 120 113 -100.30 gain 113 121 -105.79 gain 121 113 -100.72 gain 113 122 -102.04 gain 122 113 -99.54 gain 113 123 -100.89 gain 123 113 -98.65 gain 113 124 -103.20 gain 124 113 -94.56 gain 113 125 -94.36 gain 125 113 -87.65 gain 113 126 -85.25 gain 126 113 -83.43 gain 113 127 -81.66 gain 127 113 -74.59 gain 113 128 -77.69 gain 128 113 -73.68 gain 113 129 -81.56 gain 129 113 -74.76 gain 113 130 -91.71 gain 130 113 -87.10 gain 113 131 -100.19 gain 131 113 -93.93 gain 113 132 -100.28 gain 132 113 -90.30 gain 113 133 -102.37 gain 133 113 -96.82 gain 113 134 -109.06 gain 134 113 -101.50 gain 113 135 -105.01 gain 135 113 -93.03 gain 113 136 -110.49 gain 136 113 -107.29 gain 113 137 -103.00 gain 137 113 -96.46 gain 113 138 -105.86 gain 138 113 -101.34 gain 113 139 -95.80 gain 139 113 -92.98 gain 113 140 -87.54 gain 140 113 -84.53 gain 113 141 -103.39 gain 141 113 -96.07 gain 113 142 -88.75 gain 142 113 -82.59 gain 113 143 -89.72 gain 143 113 -86.00 gain 113 144 -93.09 gain 144 113 -85.27 gain 113 145 -98.15 gain 145 113 -94.89 gain 113 146 -100.75 gain 146 113 -93.92 gain 113 147 -106.05 gain 147 113 -100.42 gain 113 148 -106.43 gain 148 113 -101.33 gain 113 149 -103.97 gain 149 113 -95.24 gain 113 150 -108.86 gain 150 113 -103.52 gain 113 151 -112.19 gain 151 113 -109.32 gain 113 152 -106.20 gain 152 113 -101.70 gain 113 153 -109.21 gain 153 113 -104.39 gain 113 154 -105.43 gain 154 113 -101.75 gain 113 155 -99.82 gain 155 113 -93.44 gain 113 156 -95.59 gain 156 113 -90.33 gain 113 157 -104.04 gain 157 113 -100.08 gain 113 158 -100.27 gain 158 113 -98.28 gain 113 159 -100.88 gain 159 113 -92.92 gain 113 160 -102.57 gain 160 113 -95.99 gain 113 161 -103.91 gain 161 113 -98.38 gain 113 162 -91.98 gain 162 113 -86.09 gain 113 163 -106.71 gain 163 113 -98.23 gain 113 164 -107.95 gain 164 113 -106.70 gain 113 165 -103.71 gain 165 113 -99.82 gain 113 166 -104.37 gain 166 113 -102.14 gain 113 167 -112.53 gain 167 113 -109.12 gain 113 168 -104.74 gain 168 113 -100.39 gain 113 169 -112.22 gain 169 113 -104.39 gain 113 170 -98.54 gain 170 113 -91.65 gain 113 171 -96.37 gain 171 113 -90.05 gain 113 172 -92.47 gain 172 113 -88.95 gain 113 173 -89.99 gain 173 113 -80.78 gain 113 174 -97.67 gain 174 113 -94.42 gain 113 175 -97.81 gain 175 113 -86.36 gain 113 176 -102.39 gain 176 113 -95.16 gain 113 177 -105.38 gain 177 113 -100.51 gain 113 178 -101.71 gain 178 113 -94.46 gain 113 179 -111.01 gain 179 113 -106.80 gain 113 180 -108.35 gain 180 113 -102.87 gain 113 181 -110.70 gain 181 113 -108.62 gain 113 182 -110.40 gain 182 113 -104.46 gain 113 183 -105.95 gain 183 113 -95.89 gain 113 184 -105.46 gain 184 113 -101.63 gain 113 185 -101.47 gain 185 113 -96.14 gain 113 186 -101.39 gain 186 113 -96.76 gain 113 187 -101.63 gain 187 113 -97.03 gain 113 188 -104.26 gain 188 113 -104.10 gain 113 189 -102.38 gain 189 113 -98.28 gain 113 190 -103.94 gain 190 113 -92.67 gain 113 191 -99.51 gain 191 113 -91.41 gain 113 192 -100.91 gain 192 113 -96.48 gain 113 193 -105.73 gain 193 113 -97.33 gain 113 194 -106.64 gain 194 113 -98.13 gain 113 195 -116.53 gain 195 113 -105.99 gain 113 196 -118.51 gain 196 113 -115.64 gain 113 197 -105.54 gain 197 113 -100.15 gain 113 198 -106.56 gain 198 113 -103.82 gain 113 199 -109.92 gain 199 113 -101.20 gain 113 200 -100.89 gain 200 113 -94.08 gain 113 201 -110.95 gain 201 113 -107.23 gain 113 202 -98.55 gain 202 113 -93.13 gain 113 203 -106.16 gain 203 113 -100.84 gain 113 204 -102.53 gain 204 113 -95.42 gain 113 205 -105.64 gain 205 113 -98.20 gain 113 206 -107.29 gain 206 113 -101.18 gain 113 207 -104.64 gain 207 113 -96.27 gain 113 208 -109.92 gain 208 113 -104.85 gain 113 209 -111.28 gain 209 113 -105.25 gain 113 210 -115.62 gain 210 113 -113.59 gain 113 211 -110.07 gain 211 113 -105.43 gain 113 212 -108.64 gain 212 113 -102.55 gain 113 213 -110.92 gain 213 113 -107.57 gain 113 214 -111.18 gain 214 113 -106.01 gain 113 215 -106.23 gain 215 113 -102.88 gain 113 216 -108.04 gain 216 113 -101.58 gain 113 217 -117.16 gain 217 113 -115.15 gain 113 218 -106.84 gain 218 113 -106.15 gain 113 219 -102.35 gain 219 113 -99.24 gain 113 220 -104.05 gain 220 113 -98.05 gain 113 221 -110.12 gain 221 113 -105.11 gain 113 222 -108.98 gain 222 113 -100.55 gain 113 223 -105.92 gain 223 113 -99.78 gain 113 224 -112.93 gain 224 113 -103.71 gain 114 115 -71.49 gain 115 114 -72.34 gain 114 116 -84.84 gain 116 114 -81.72 gain 114 117 -84.03 gain 117 114 -80.76 gain 114 118 -93.45 gain 118 114 -98.35 gain 114 119 -101.01 gain 119 114 -97.46 gain 114 120 -97.41 gain 120 114 -93.96 gain 114 121 -106.08 gain 121 114 -105.38 gain 114 122 -109.11 gain 122 114 -110.97 gain 114 123 -97.20 gain 123 114 -99.32 gain 114 124 -95.12 gain 124 114 -90.85 gain 114 125 -94.06 gain 125 114 -91.72 gain 114 126 -89.42 gain 126 114 -91.97 gain 114 127 -88.35 gain 127 114 -85.64 gain 114 128 -86.04 gain 128 114 -86.40 gain 114 129 -70.32 gain 129 114 -67.89 gain 114 130 -81.12 gain 130 114 -80.86 gain 114 131 -84.66 gain 131 114 -82.76 gain 114 132 -86.09 gain 132 114 -80.47 gain 114 133 -97.32 gain 133 114 -96.13 gain 114 134 -99.69 gain 134 114 -96.50 gain 114 135 -108.22 gain 135 114 -100.61 gain 114 136 -99.61 gain 136 114 -100.78 gain 114 137 -97.18 gain 137 114 -95.01 gain 114 138 -101.19 gain 138 114 -101.03 gain 114 139 -97.83 gain 139 114 -99.38 gain 114 140 -95.08 gain 140 114 -96.44 gain 114 141 -93.12 gain 141 114 -90.17 gain 114 142 -83.78 gain 142 114 -81.98 gain 114 143 -81.76 gain 143 114 -82.41 gain 114 144 -82.02 gain 144 114 -78.57 gain 114 145 -86.90 gain 145 114 -88.00 gain 114 146 -89.42 gain 146 114 -86.97 gain 114 147 -90.35 gain 147 114 -89.08 gain 114 148 -97.76 gain 148 114 -97.03 gain 114 149 -95.01 gain 149 114 -90.65 gain 114 150 -103.96 gain 150 114 -102.98 gain 114 151 -101.87 gain 151 114 -103.37 gain 114 152 -98.40 gain 152 114 -98.26 gain 114 153 -100.11 gain 153 114 -99.67 gain 114 154 -101.76 gain 154 114 -102.45 gain 114 155 -100.63 gain 155 114 -98.62 gain 114 156 -95.73 gain 156 114 -94.83 gain 114 157 -95.37 gain 157 114 -95.77 gain 114 158 -93.97 gain 158 114 -96.34 gain 114 159 -90.65 gain 159 114 -87.06 gain 114 160 -92.58 gain 160 114 -90.37 gain 114 161 -91.06 gain 161 114 -89.90 gain 114 162 -94.68 gain 162 114 -93.15 gain 114 163 -98.66 gain 163 114 -94.56 gain 114 164 -103.03 gain 164 114 -106.15 gain 114 165 -106.61 gain 165 114 -107.09 gain 114 166 -104.61 gain 166 114 -106.74 gain 114 167 -104.35 gain 167 114 -105.31 gain 114 168 -105.42 gain 168 114 -105.44 gain 114 169 -103.52 gain 169 114 -100.06 gain 114 170 -100.02 gain 170 114 -97.49 gain 114 171 -106.87 gain 171 114 -104.91 gain 114 172 -93.38 gain 172 114 -94.23 gain 114 173 -89.68 gain 173 114 -84.84 gain 114 174 -94.16 gain 174 114 -95.28 gain 114 175 -93.53 gain 175 114 -86.45 gain 114 176 -96.53 gain 176 114 -93.67 gain 114 177 -98.93 gain 177 114 -98.44 gain 114 178 -94.66 gain 178 114 -91.77 gain 114 179 -103.60 gain 179 114 -103.76 gain 114 180 -112.59 gain 180 114 -111.48 gain 114 181 -102.36 gain 181 114 -104.65 gain 114 182 -110.31 gain 182 114 -108.73 gain 114 183 -109.63 gain 183 114 -103.94 gain 114 184 -106.16 gain 184 114 -106.69 gain 114 185 -99.20 gain 185 114 -98.23 gain 114 186 -102.96 gain 186 114 -102.70 gain 114 187 -98.54 gain 187 114 -98.30 gain 114 188 -100.73 gain 188 114 -104.94 gain 114 189 -93.99 gain 189 114 -94.25 gain 114 190 -99.01 gain 190 114 -92.10 gain 114 191 -97.71 gain 191 114 -93.98 gain 114 192 -103.22 gain 192 114 -103.16 gain 114 193 -101.65 gain 193 114 -97.61 gain 114 194 -105.84 gain 194 114 -101.70 gain 114 195 -99.44 gain 195 114 -93.26 gain 114 196 -102.79 gain 196 114 -104.28 gain 114 197 -103.08 gain 197 114 -102.06 gain 114 198 -105.41 gain 198 114 -107.03 gain 114 199 -110.18 gain 199 114 -105.82 gain 114 200 -105.44 gain 200 114 -103.00 gain 114 201 -97.39 gain 201 114 -98.03 gain 114 202 -103.41 gain 202 114 -102.35 gain 114 203 -103.23 gain 203 114 -102.28 gain 114 204 -102.36 gain 204 114 -99.63 gain 114 205 -98.77 gain 205 114 -95.70 gain 114 206 -101.99 gain 206 114 -100.24 gain 114 207 -104.08 gain 207 114 -100.08 gain 114 208 -100.23 gain 208 114 -99.53 gain 114 209 -103.81 gain 209 114 -102.14 gain 114 210 -107.74 gain 210 114 -110.08 gain 114 211 -108.18 gain 211 114 -107.91 gain 114 212 -105.97 gain 212 114 -104.25 gain 114 213 -103.61 gain 213 114 -104.63 gain 114 214 -98.67 gain 214 114 -97.87 gain 114 215 -106.57 gain 215 114 -107.59 gain 114 216 -105.53 gain 216 114 -103.44 gain 114 217 -105.30 gain 217 114 -107.66 gain 114 218 -97.84 gain 218 114 -101.51 gain 114 219 -102.39 gain 219 114 -103.64 gain 114 220 -96.32 gain 220 114 -94.68 gain 114 221 -101.81 gain 221 114 -101.17 gain 114 222 -98.53 gain 222 114 -94.46 gain 114 223 -103.18 gain 223 114 -101.40 gain 114 224 -102.83 gain 224 114 -97.98 gain 115 116 -74.81 gain 116 115 -70.83 gain 115 117 -86.64 gain 117 115 -82.50 gain 115 118 -92.62 gain 118 115 -96.66 gain 115 119 -93.10 gain 119 115 -88.69 gain 115 120 -105.70 gain 120 115 -101.40 gain 115 121 -108.78 gain 121 115 -107.22 gain 115 122 -102.53 gain 122 115 -103.54 gain 115 123 -103.16 gain 123 115 -104.42 gain 115 124 -102.24 gain 124 115 -97.11 gain 115 125 -96.17 gain 125 115 -92.97 gain 115 126 -98.94 gain 126 115 -100.63 gain 115 127 -96.55 gain 127 115 -92.99 gain 115 128 -92.28 gain 128 115 -91.77 gain 115 129 -86.85 gain 129 115 -83.56 gain 115 130 -82.57 gain 130 115 -81.46 gain 115 131 -91.02 gain 131 115 -88.27 gain 115 132 -87.96 gain 132 115 -81.48 gain 115 133 -86.02 gain 133 115 -83.98 gain 115 134 -93.62 gain 134 115 -89.57 gain 115 135 -101.63 gain 135 115 -93.17 gain 115 136 -106.13 gain 136 115 -106.45 gain 115 137 -105.23 gain 137 115 -102.20 gain 115 138 -97.70 gain 138 115 -96.69 gain 115 139 -101.46 gain 139 115 -102.15 gain 115 140 -101.32 gain 140 115 -101.82 gain 115 141 -102.02 gain 141 115 -98.21 gain 115 142 -86.49 gain 142 115 -83.83 gain 115 143 -91.89 gain 143 115 -91.68 gain 115 144 -84.59 gain 144 115 -80.29 gain 115 145 -85.80 gain 145 115 -86.04 gain 115 146 -88.70 gain 146 115 -85.38 gain 115 147 -88.11 gain 147 115 -85.99 gain 115 148 -96.41 gain 148 115 -94.81 gain 115 149 -91.00 gain 149 115 -85.78 gain 115 150 -107.72 gain 150 115 -105.88 gain 115 151 -107.67 gain 151 115 -108.31 gain 115 152 -104.66 gain 152 115 -103.66 gain 115 153 -100.62 gain 153 115 -99.31 gain 115 154 -101.18 gain 154 115 -101.01 gain 115 155 -102.14 gain 155 115 -99.26 gain 115 156 -99.71 gain 156 115 -97.96 gain 115 157 -96.37 gain 157 115 -95.91 gain 115 158 -88.75 gain 158 115 -90.26 gain 115 159 -96.67 gain 159 115 -92.22 gain 115 160 -91.51 gain 160 115 -88.44 gain 115 161 -91.75 gain 161 115 -89.73 gain 115 162 -92.45 gain 162 115 -90.06 gain 115 163 -93.40 gain 163 115 -88.43 gain 115 164 -102.63 gain 164 115 -104.90 gain 115 165 -110.40 gain 165 115 -110.01 gain 115 166 -102.34 gain 166 115 -103.62 gain 115 167 -113.92 gain 167 115 -114.02 gain 115 168 -108.01 gain 168 115 -107.17 gain 115 169 -99.47 gain 169 115 -95.15 gain 115 170 -104.66 gain 170 115 -101.28 gain 115 171 -93.73 gain 171 115 -90.91 gain 115 172 -99.91 gain 172 115 -99.89 gain 115 173 -97.77 gain 173 115 -92.07 gain 115 174 -98.29 gain 174 115 -98.55 gain 115 175 -94.16 gain 175 115 -86.22 gain 115 176 -103.20 gain 176 115 -99.48 gain 115 177 -92.74 gain 177 115 -91.39 gain 115 178 -95.50 gain 178 115 -91.75 gain 115 179 -100.72 gain 179 115 -100.02 gain 115 180 -119.04 gain 180 115 -117.07 gain 115 181 -103.14 gain 181 115 -104.58 gain 115 182 -110.17 gain 182 115 -107.74 gain 115 183 -103.10 gain 183 115 -96.55 gain 115 184 -107.31 gain 184 115 -106.99 gain 115 185 -98.03 gain 185 115 -96.21 gain 115 186 -101.14 gain 186 115 -100.02 gain 115 187 -91.69 gain 187 115 -90.59 gain 115 188 -102.14 gain 188 115 -105.49 gain 115 189 -99.76 gain 189 115 -99.17 gain 115 190 -104.07 gain 190 115 -96.31 gain 115 191 -92.14 gain 191 115 -87.55 gain 115 192 -104.05 gain 192 115 -103.13 gain 115 193 -102.63 gain 193 115 -97.74 gain 115 194 -105.82 gain 194 115 -100.81 gain 115 195 -108.51 gain 195 115 -101.47 gain 115 196 -109.01 gain 196 115 -109.65 gain 115 197 -103.94 gain 197 115 -102.07 gain 115 198 -104.58 gain 198 115 -105.35 gain 115 199 -98.28 gain 199 115 -93.06 gain 115 200 -109.88 gain 200 115 -106.58 gain 115 201 -94.54 gain 201 115 -94.33 gain 115 202 -101.91 gain 202 115 -99.99 gain 115 203 -99.87 gain 203 115 -98.05 gain 115 204 -101.84 gain 204 115 -98.24 gain 115 205 -107.05 gain 205 115 -103.12 gain 115 206 -101.00 gain 206 115 -98.40 gain 115 207 -100.90 gain 207 115 -96.04 gain 115 208 -103.58 gain 208 115 -102.02 gain 115 209 -98.83 gain 209 115 -96.31 gain 115 210 -112.95 gain 210 115 -114.43 gain 115 211 -104.46 gain 211 115 -103.33 gain 115 212 -104.32 gain 212 115 -101.74 gain 115 213 -104.50 gain 213 115 -104.66 gain 115 214 -108.39 gain 214 115 -106.73 gain 115 215 -101.46 gain 215 115 -101.62 gain 115 216 -105.71 gain 216 115 -102.76 gain 115 217 -111.75 gain 217 115 -113.25 gain 115 218 -104.62 gain 218 115 -107.43 gain 115 219 -105.99 gain 219 115 -106.38 gain 115 220 -99.05 gain 220 115 -96.56 gain 115 221 -101.49 gain 221 115 -99.99 gain 115 222 -104.41 gain 222 115 -99.48 gain 115 223 -99.19 gain 223 115 -96.55 gain 115 224 -100.21 gain 224 115 -94.51 gain 116 117 -73.50 gain 117 116 -73.34 gain 116 118 -84.47 gain 118 116 -92.49 gain 116 119 -90.79 gain 119 116 -90.36 gain 116 120 -102.85 gain 120 116 -102.52 gain 116 121 -106.89 gain 121 116 -109.31 gain 116 122 -97.80 gain 122 116 -102.78 gain 116 123 -99.37 gain 123 116 -104.61 gain 116 124 -94.69 gain 124 116 -93.53 gain 116 125 -94.78 gain 125 116 -95.56 gain 116 126 -95.08 gain 126 116 -100.74 gain 116 127 -96.50 gain 127 116 -96.91 gain 116 128 -90.46 gain 128 116 -93.93 gain 116 129 -79.16 gain 129 116 -79.85 gain 116 130 -74.18 gain 130 116 -77.05 gain 116 131 -73.33 gain 131 116 -74.55 gain 116 132 -66.36 gain 132 116 -63.86 gain 116 133 -82.71 gain 133 116 -84.64 gain 116 134 -90.23 gain 134 116 -90.15 gain 116 135 -111.35 gain 135 116 -106.87 gain 116 136 -102.30 gain 136 116 -106.59 gain 116 137 -103.70 gain 137 116 -104.65 gain 116 138 -106.36 gain 138 116 -109.32 gain 116 139 -95.93 gain 139 116 -100.60 gain 116 140 -103.59 gain 140 116 -108.06 gain 116 141 -96.87 gain 141 116 -97.03 gain 116 142 -93.33 gain 142 116 -94.65 gain 116 143 -91.60 gain 143 116 -95.36 gain 116 144 -84.45 gain 144 116 -84.12 gain 116 145 -84.89 gain 145 116 -89.10 gain 116 146 -78.99 gain 146 116 -79.65 gain 116 147 -86.28 gain 147 116 -88.13 gain 116 148 -85.80 gain 148 116 -88.18 gain 116 149 -90.81 gain 149 116 -89.56 gain 116 150 -105.59 gain 150 116 -107.72 gain 116 151 -101.49 gain 151 116 -106.11 gain 116 152 -102.80 gain 152 116 -105.78 gain 116 153 -94.20 gain 153 116 -96.87 gain 116 154 -106.86 gain 154 116 -110.66 gain 116 155 -94.38 gain 155 116 -95.48 gain 116 156 -100.98 gain 156 116 -103.21 gain 116 157 -93.59 gain 157 116 -97.11 gain 116 158 -90.10 gain 158 116 -95.59 gain 116 159 -94.91 gain 159 116 -94.44 gain 116 160 -87.35 gain 160 116 -88.26 gain 116 161 -88.99 gain 161 116 -90.94 gain 116 162 -88.52 gain 162 116 -90.10 gain 116 163 -84.29 gain 163 116 -83.30 gain 116 164 -97.83 gain 164 116 -104.07 gain 116 165 -105.00 gain 165 116 -108.59 gain 116 166 -96.04 gain 166 116 -101.29 gain 116 167 -105.45 gain 167 116 -109.52 gain 116 168 -105.52 gain 168 116 -108.66 gain 116 169 -99.15 gain 169 116 -98.80 gain 116 170 -102.66 gain 170 116 -103.25 gain 116 171 -97.13 gain 171 116 -98.29 gain 116 172 -100.69 gain 172 116 -104.65 gain 116 173 -91.18 gain 173 116 -89.46 gain 116 174 -97.58 gain 174 116 -101.82 gain 116 175 -87.80 gain 175 116 -83.83 gain 116 176 -89.56 gain 176 116 -89.82 gain 116 177 -84.99 gain 177 116 -87.61 gain 116 178 -91.01 gain 178 116 -91.24 gain 116 179 -94.95 gain 179 116 -98.22 gain 116 180 -103.36 gain 180 116 -105.36 gain 116 181 -99.52 gain 181 116 -104.92 gain 116 182 -101.02 gain 182 116 -102.56 gain 116 183 -99.22 gain 183 116 -96.65 gain 116 184 -105.39 gain 184 116 -109.05 gain 116 185 -97.53 gain 185 116 -99.68 gain 116 186 -97.80 gain 186 116 -100.65 gain 116 187 -95.69 gain 187 116 -98.57 gain 116 188 -103.77 gain 188 116 -111.09 gain 116 189 -100.83 gain 189 116 -104.20 gain 116 190 -101.28 gain 190 116 -97.49 gain 116 191 -93.15 gain 191 116 -92.54 gain 116 192 -97.34 gain 192 116 -100.40 gain 116 193 -90.97 gain 193 116 -90.05 gain 116 194 -93.40 gain 194 116 -92.37 gain 116 195 -109.32 gain 195 116 -106.26 gain 116 196 -107.63 gain 196 116 -112.24 gain 116 197 -100.65 gain 197 116 -102.75 gain 116 198 -112.85 gain 198 116 -117.59 gain 116 199 -100.66 gain 199 116 -99.42 gain 116 200 -97.86 gain 200 116 -98.53 gain 116 201 -92.89 gain 201 116 -96.65 gain 116 202 -93.39 gain 202 116 -95.46 gain 116 203 -92.63 gain 203 116 -94.79 gain 116 204 -100.57 gain 204 116 -100.96 gain 116 205 -101.05 gain 205 116 -101.09 gain 116 206 -95.33 gain 206 116 -96.70 gain 116 207 -97.73 gain 207 116 -96.85 gain 116 208 -96.52 gain 208 116 -98.94 gain 116 209 -94.73 gain 209 116 -96.18 gain 116 210 -109.10 gain 210 116 -114.56 gain 116 211 -110.18 gain 211 116 -113.03 gain 116 212 -110.72 gain 212 116 -112.11 gain 116 213 -106.56 gain 213 116 -110.70 gain 116 214 -104.38 gain 214 116 -106.69 gain 116 215 -96.84 gain 215 116 -100.97 gain 116 216 -99.00 gain 216 116 -100.02 gain 116 217 -96.56 gain 217 116 -102.04 gain 116 218 -97.13 gain 218 116 -103.93 gain 116 219 -98.72 gain 219 116 -103.09 gain 116 220 -105.73 gain 220 116 -107.22 gain 116 221 -92.81 gain 221 116 -95.28 gain 116 222 -96.84 gain 222 116 -95.89 gain 116 223 -97.86 gain 223 116 -99.20 gain 116 224 -98.52 gain 224 116 -96.79 gain 117 118 -83.84 gain 118 117 -92.01 gain 117 119 -84.84 gain 119 117 -84.56 gain 117 120 -109.95 gain 120 117 -109.77 gain 117 121 -100.80 gain 121 117 -103.37 gain 117 122 -107.44 gain 122 117 -112.58 gain 117 123 -94.64 gain 123 117 -100.04 gain 117 124 -92.70 gain 124 117 -91.70 gain 117 125 -99.94 gain 125 117 -100.88 gain 117 126 -91.30 gain 126 117 -97.12 gain 117 127 -91.19 gain 127 117 -91.76 gain 117 128 -96.47 gain 128 117 -100.10 gain 117 129 -85.10 gain 129 117 -85.95 gain 117 130 -80.38 gain 130 117 -83.40 gain 117 131 -80.61 gain 131 117 -81.99 gain 117 132 -67.77 gain 132 117 -65.42 gain 117 133 -84.27 gain 133 117 -86.35 gain 117 134 -86.72 gain 134 117 -86.80 gain 117 135 -104.44 gain 135 117 -100.11 gain 117 136 -98.69 gain 136 117 -103.14 gain 117 137 -106.01 gain 137 117 -107.11 gain 117 138 -96.91 gain 138 117 -100.03 gain 117 139 -99.85 gain 139 117 -104.67 gain 117 140 -104.22 gain 140 117 -108.85 gain 117 141 -98.08 gain 141 117 -98.41 gain 117 142 -92.45 gain 142 117 -93.92 gain 117 143 -93.46 gain 143 117 -97.39 gain 117 144 -88.09 gain 144 117 -87.91 gain 117 145 -86.20 gain 145 117 -90.58 gain 117 146 -85.51 gain 146 117 -86.32 gain 117 147 -79.29 gain 147 117 -81.30 gain 117 148 -85.79 gain 148 117 -88.33 gain 117 149 -86.82 gain 149 117 -85.73 gain 117 150 -99.02 gain 150 117 -101.32 gain 117 151 -101.60 gain 151 117 -106.37 gain 117 152 -105.55 gain 152 117 -108.69 gain 117 153 -106.44 gain 153 117 -109.27 gain 117 154 -110.73 gain 154 117 -114.69 gain 117 155 -96.35 gain 155 117 -97.61 gain 117 156 -90.09 gain 156 117 -92.47 gain 117 157 -100.71 gain 157 117 -104.39 gain 117 158 -98.97 gain 158 117 -104.61 gain 117 159 -94.38 gain 159 117 -94.06 gain 117 160 -90.58 gain 160 117 -91.64 gain 117 161 -88.56 gain 161 117 -90.68 gain 117 162 -86.95 gain 162 117 -88.69 gain 117 163 -89.89 gain 163 117 -89.06 gain 117 164 -95.17 gain 164 117 -101.56 gain 117 165 -98.72 gain 165 117 -102.47 gain 117 166 -107.47 gain 166 117 -112.88 gain 117 167 -94.58 gain 167 117 -98.81 gain 117 168 -98.55 gain 168 117 -101.85 gain 117 169 -107.87 gain 169 117 -107.68 gain 117 170 -104.88 gain 170 117 -105.63 gain 117 171 -101.71 gain 171 117 -103.03 gain 117 172 -95.42 gain 172 117 -99.54 gain 117 173 -102.14 gain 173 117 -100.58 gain 117 174 -89.19 gain 174 117 -93.58 gain 117 175 -94.54 gain 175 117 -90.73 gain 117 176 -93.34 gain 176 117 -93.76 gain 117 177 -82.68 gain 177 117 -85.46 gain 117 178 -88.93 gain 178 117 -89.31 gain 117 179 -92.27 gain 179 117 -95.70 gain 117 180 -98.28 gain 180 117 -100.45 gain 117 181 -104.75 gain 181 117 -110.32 gain 117 182 -103.33 gain 182 117 -105.03 gain 117 183 -102.21 gain 183 117 -99.79 gain 117 184 -95.05 gain 184 117 -98.86 gain 117 185 -99.58 gain 185 117 -101.89 gain 117 186 -104.02 gain 186 117 -107.03 gain 117 187 -91.88 gain 187 117 -94.92 gain 117 188 -96.66 gain 188 117 -104.14 gain 117 189 -95.59 gain 189 117 -99.12 gain 117 190 -94.71 gain 190 117 -91.07 gain 117 191 -94.23 gain 191 117 -93.77 gain 117 192 -95.43 gain 192 117 -98.65 gain 117 193 -92.29 gain 193 117 -91.52 gain 117 194 -92.61 gain 194 117 -91.74 gain 117 195 -115.01 gain 195 117 -112.11 gain 117 196 -103.77 gain 196 117 -108.53 gain 117 197 -104.77 gain 197 117 -107.03 gain 117 198 -101.69 gain 198 117 -106.59 gain 117 199 -102.99 gain 199 117 -101.90 gain 117 200 -98.22 gain 200 117 -99.06 gain 117 201 -100.74 gain 201 117 -104.67 gain 117 202 -103.31 gain 202 117 -105.53 gain 117 203 -101.85 gain 203 117 -104.17 gain 117 204 -100.92 gain 204 117 -101.46 gain 117 205 -101.14 gain 205 117 -101.34 gain 117 206 -98.19 gain 206 117 -99.72 gain 117 207 -94.40 gain 207 117 -93.67 gain 117 208 -96.72 gain 208 117 -99.29 gain 117 209 -95.58 gain 209 117 -97.19 gain 117 210 -104.89 gain 210 117 -110.50 gain 117 211 -106.35 gain 211 117 -109.35 gain 117 212 -98.81 gain 212 117 -100.36 gain 117 213 -107.13 gain 213 117 -111.42 gain 117 214 -105.22 gain 214 117 -107.70 gain 117 215 -108.13 gain 215 117 -112.42 gain 117 216 -107.10 gain 216 117 -108.28 gain 117 217 -101.90 gain 217 117 -107.54 gain 117 218 -101.98 gain 218 117 -108.93 gain 117 219 -94.94 gain 219 117 -99.46 gain 117 220 -103.34 gain 220 117 -104.98 gain 117 221 -93.90 gain 221 117 -96.53 gain 117 222 -91.89 gain 222 117 -91.10 gain 117 223 -102.20 gain 223 117 -103.70 gain 117 224 -95.84 gain 224 117 -94.26 gain 118 119 -81.63 gain 119 118 -73.18 gain 118 120 -115.40 gain 120 118 -107.05 gain 118 121 -106.41 gain 121 118 -100.80 gain 118 122 -114.65 gain 122 118 -111.62 gain 118 123 -112.65 gain 123 118 -109.88 gain 118 124 -108.58 gain 124 118 -99.40 gain 118 125 -114.10 gain 125 118 -106.86 gain 118 126 -102.28 gain 126 118 -99.92 gain 118 127 -101.37 gain 127 118 -93.77 gain 118 128 -107.61 gain 128 118 -103.07 gain 118 129 -98.67 gain 129 118 -91.34 gain 118 130 -92.04 gain 130 118 -86.89 gain 118 131 -94.90 gain 131 118 -88.11 gain 118 132 -80.38 gain 132 118 -69.87 gain 118 133 -82.62 gain 133 118 -76.53 gain 118 134 -88.37 gain 134 118 -80.27 gain 118 135 -113.76 gain 135 118 -101.26 gain 118 136 -113.79 gain 136 118 -110.06 gain 118 137 -105.12 gain 137 118 -98.05 gain 118 138 -111.04 gain 138 118 -105.98 gain 118 139 -109.20 gain 139 118 -105.85 gain 118 140 -109.65 gain 140 118 -106.11 gain 118 141 -109.90 gain 141 118 -102.04 gain 118 142 -99.14 gain 142 118 -92.44 gain 118 143 -97.74 gain 143 118 -93.49 gain 118 144 -103.04 gain 144 118 -94.69 gain 118 145 -99.91 gain 145 118 -96.11 gain 118 146 -91.78 gain 146 118 -84.42 gain 118 147 -92.05 gain 147 118 -85.88 gain 118 148 -92.24 gain 148 118 -86.60 gain 118 149 -100.21 gain 149 118 -90.95 gain 118 150 -117.50 gain 150 118 -111.62 gain 118 151 -118.00 gain 151 118 -114.60 gain 118 152 -111.26 gain 152 118 -106.22 gain 118 153 -111.90 gain 153 118 -106.56 gain 118 154 -110.25 gain 154 118 -106.03 gain 118 155 -111.29 gain 155 118 -104.37 gain 118 156 -109.60 gain 156 118 -103.81 gain 118 157 -104.38 gain 157 118 -99.89 gain 118 158 -109.63 gain 158 118 -107.10 gain 118 159 -103.30 gain 159 118 -94.81 gain 118 160 -95.63 gain 160 118 -88.51 gain 118 161 -97.62 gain 161 118 -91.56 gain 118 162 -94.04 gain 162 118 -87.61 gain 118 163 -102.01 gain 163 118 -93.00 gain 118 164 -97.47 gain 164 118 -95.69 gain 118 165 -113.34 gain 165 118 -108.92 gain 118 166 -117.48 gain 166 118 -114.71 gain 118 167 -109.64 gain 167 118 -105.70 gain 118 168 -108.96 gain 168 118 -104.08 gain 118 169 -113.44 gain 169 118 -105.07 gain 118 170 -110.54 gain 170 118 -103.12 gain 118 171 -108.78 gain 171 118 -101.92 gain 118 172 -112.78 gain 172 118 -108.72 gain 118 173 -104.20 gain 173 118 -94.46 gain 118 174 -106.15 gain 174 118 -102.37 gain 118 175 -100.83 gain 175 118 -88.84 gain 118 176 -102.45 gain 176 118 -94.69 gain 118 177 -100.47 gain 177 118 -95.07 gain 118 178 -102.75 gain 178 118 -94.96 gain 118 179 -101.15 gain 179 118 -96.41 gain 118 180 -116.42 gain 180 118 -110.41 gain 118 181 -112.41 gain 181 118 -109.80 gain 118 182 -113.30 gain 182 118 -106.82 gain 118 183 -111.28 gain 183 118 -100.68 gain 118 184 -111.50 gain 184 118 -107.14 gain 118 185 -104.88 gain 185 118 -99.02 gain 118 186 -102.61 gain 186 118 -97.45 gain 118 187 -104.27 gain 187 118 -99.13 gain 118 188 -105.98 gain 188 118 -105.28 gain 118 189 -103.77 gain 189 118 -99.13 gain 118 190 -113.98 gain 190 118 -102.17 gain 118 191 -105.32 gain 191 118 -96.69 gain 118 192 -100.47 gain 192 118 -95.51 gain 118 193 -99.69 gain 193 118 -90.75 gain 118 194 -98.93 gain 194 118 -89.88 gain 118 195 -117.04 gain 195 118 -105.97 gain 118 196 -119.57 gain 196 118 -116.17 gain 118 197 -113.22 gain 197 118 -107.30 gain 118 198 -112.54 gain 198 118 -109.26 gain 118 199 -118.26 gain 199 118 -109.00 gain 118 200 -115.79 gain 200 118 -108.45 gain 118 201 -113.90 gain 201 118 -109.64 gain 118 202 -103.04 gain 202 118 -97.09 gain 118 203 -107.14 gain 203 118 -101.28 gain 118 204 -113.08 gain 204 118 -105.44 gain 118 205 -111.13 gain 205 118 -103.16 gain 118 206 -101.69 gain 206 118 -95.05 gain 118 207 -106.12 gain 207 118 -97.21 gain 118 208 -111.97 gain 208 118 -106.37 gain 118 209 -106.62 gain 209 118 -100.06 gain 118 210 -116.38 gain 210 118 -113.82 gain 118 211 -114.91 gain 211 118 -109.74 gain 118 212 -114.19 gain 212 118 -107.56 gain 118 213 -111.03 gain 213 118 -107.15 gain 118 214 -113.53 gain 214 118 -107.83 gain 118 215 -117.17 gain 215 118 -113.28 gain 118 216 -110.96 gain 216 118 -103.96 gain 118 217 -114.25 gain 217 118 -111.71 gain 118 218 -108.20 gain 218 118 -106.98 gain 118 219 -103.00 gain 219 118 -99.35 gain 118 220 -108.85 gain 220 118 -102.31 gain 118 221 -104.14 gain 221 118 -98.60 gain 118 222 -110.41 gain 222 118 -101.45 gain 118 223 -104.50 gain 223 118 -97.82 gain 118 224 -105.67 gain 224 118 -95.92 gain 119 120 -102.20 gain 120 119 -102.30 gain 119 121 -110.28 gain 121 119 -113.13 gain 119 122 -103.51 gain 122 119 -108.93 gain 119 123 -102.51 gain 123 119 -108.18 gain 119 124 -105.12 gain 124 119 -104.40 gain 119 125 -100.08 gain 125 119 -101.29 gain 119 126 -96.30 gain 126 119 -102.39 gain 119 127 -93.74 gain 127 119 -94.59 gain 119 128 -102.25 gain 128 119 -106.15 gain 119 129 -95.57 gain 129 119 -96.69 gain 119 130 -99.02 gain 130 119 -102.32 gain 119 131 -83.06 gain 131 119 -84.72 gain 119 132 -80.49 gain 132 119 -78.43 gain 119 133 -78.75 gain 133 119 -81.11 gain 119 134 -74.76 gain 134 119 -75.12 gain 119 135 -107.81 gain 135 119 -103.75 gain 119 136 -100.78 gain 136 119 -105.50 gain 119 137 -111.34 gain 137 119 -112.72 gain 119 138 -100.77 gain 138 119 -104.17 gain 119 139 -97.10 gain 139 119 -102.20 gain 119 140 -98.71 gain 140 119 -103.62 gain 119 141 -99.22 gain 141 119 -99.82 gain 119 142 -95.51 gain 142 119 -97.26 gain 119 143 -97.98 gain 143 119 -102.18 gain 119 144 -96.71 gain 144 119 -96.81 gain 119 145 -91.32 gain 145 119 -95.97 gain 119 146 -87.41 gain 146 119 -88.50 gain 119 147 -83.05 gain 147 119 -85.33 gain 119 148 -78.83 gain 148 119 -81.64 gain 119 149 -81.84 gain 149 119 -81.03 gain 119 150 -106.87 gain 150 119 -109.44 gain 119 151 -111.30 gain 151 119 -116.35 gain 119 152 -102.89 gain 152 119 -106.30 gain 119 153 -106.48 gain 153 119 -109.58 gain 119 154 -104.99 gain 154 119 -109.22 gain 119 155 -105.07 gain 155 119 -106.60 gain 119 156 -110.07 gain 156 119 -112.72 gain 119 157 -99.88 gain 157 119 -103.83 gain 119 158 -107.80 gain 158 119 -113.72 gain 119 159 -105.37 gain 159 119 -105.33 gain 119 160 -87.63 gain 160 119 -88.97 gain 119 161 -94.19 gain 161 119 -96.59 gain 119 162 -87.59 gain 162 119 -89.61 gain 119 163 -87.83 gain 163 119 -87.28 gain 119 164 -93.76 gain 164 119 -100.43 gain 119 165 -109.62 gain 165 119 -113.64 gain 119 166 -107.47 gain 166 119 -113.15 gain 119 167 -102.21 gain 167 119 -106.72 gain 119 168 -102.30 gain 168 119 -105.87 gain 119 169 -101.89 gain 169 119 -101.97 gain 119 170 -100.12 gain 170 119 -101.15 gain 119 171 -102.78 gain 171 119 -104.38 gain 119 172 -96.33 gain 172 119 -100.72 gain 119 173 -101.65 gain 173 119 -100.36 gain 119 174 -105.62 gain 174 119 -110.30 gain 119 175 -104.61 gain 175 119 -101.07 gain 119 176 -93.25 gain 176 119 -93.94 gain 119 177 -93.00 gain 177 119 -96.05 gain 119 178 -95.87 gain 178 119 -96.53 gain 119 179 -91.32 gain 179 119 -95.02 gain 119 180 -103.68 gain 180 119 -106.12 gain 119 181 -108.24 gain 181 119 -114.08 gain 119 182 -104.04 gain 182 119 -106.01 gain 119 183 -112.37 gain 183 119 -110.23 gain 119 184 -108.19 gain 184 119 -112.27 gain 119 185 -101.99 gain 185 119 -104.57 gain 119 186 -105.35 gain 186 119 -108.64 gain 119 187 -100.01 gain 187 119 -103.33 gain 119 188 -102.30 gain 188 119 -110.06 gain 119 189 -98.46 gain 189 119 -102.27 gain 119 190 -97.15 gain 190 119 -93.80 gain 119 191 -100.52 gain 191 119 -100.33 gain 119 192 -90.71 gain 192 119 -94.20 gain 119 193 -91.85 gain 193 119 -91.36 gain 119 194 -88.59 gain 194 119 -87.99 gain 119 195 -101.30 gain 195 119 -98.67 gain 119 196 -111.55 gain 196 119 -116.59 gain 119 197 -106.47 gain 197 119 -109.00 gain 119 198 -101.97 gain 198 119 -107.14 gain 119 199 -105.44 gain 199 119 -104.64 gain 119 200 -105.21 gain 200 119 -106.32 gain 119 201 -106.80 gain 201 119 -111.00 gain 119 202 -104.22 gain 202 119 -106.72 gain 119 203 -95.32 gain 203 119 -97.92 gain 119 204 -101.75 gain 204 119 -102.56 gain 119 205 -93.42 gain 205 119 -93.90 gain 119 206 -99.36 gain 206 119 -101.16 gain 119 207 -96.44 gain 207 119 -95.98 gain 119 208 -98.60 gain 208 119 -101.45 gain 119 209 -90.13 gain 209 119 -92.02 gain 119 210 -111.45 gain 210 119 -117.34 gain 119 211 -107.78 gain 211 119 -111.06 gain 119 212 -104.86 gain 212 119 -106.69 gain 119 213 -108.23 gain 213 119 -112.80 gain 119 214 -103.72 gain 214 119 -106.47 gain 119 215 -107.69 gain 215 119 -112.25 gain 119 216 -105.48 gain 216 119 -106.94 gain 119 217 -96.95 gain 217 119 -102.86 gain 119 218 -100.13 gain 218 119 -107.35 gain 119 219 -105.99 gain 219 119 -110.79 gain 119 220 -101.41 gain 220 119 -103.33 gain 119 221 -99.30 gain 221 119 -102.21 gain 119 222 -91.56 gain 222 119 -91.05 gain 119 223 -98.67 gain 223 119 -100.45 gain 119 224 -101.41 gain 224 119 -100.11 gain 120 121 -77.40 gain 121 120 -80.14 gain 120 122 -83.16 gain 122 120 -88.48 gain 120 123 -83.11 gain 123 120 -88.68 gain 120 124 -87.32 gain 124 120 -86.49 gain 120 125 -95.49 gain 125 120 -96.59 gain 120 126 -95.73 gain 126 120 -101.72 gain 120 127 -95.70 gain 127 120 -96.44 gain 120 128 -95.65 gain 128 120 -99.45 gain 120 129 -107.18 gain 129 120 -108.20 gain 120 130 -105.93 gain 130 120 -109.12 gain 120 131 -99.98 gain 131 120 -101.54 gain 120 132 -103.49 gain 132 120 -101.32 gain 120 133 -104.61 gain 133 120 -106.87 gain 120 134 -110.28 gain 134 120 -110.54 gain 120 135 -70.29 gain 135 120 -66.13 gain 120 136 -75.49 gain 136 120 -80.11 gain 120 137 -74.16 gain 137 120 -75.44 gain 120 138 -87.58 gain 138 120 -90.88 gain 120 139 -86.60 gain 139 120 -91.60 gain 120 140 -95.19 gain 140 120 -99.99 gain 120 141 -98.95 gain 141 120 -99.45 gain 120 142 -86.79 gain 142 120 -88.44 gain 120 143 -96.49 gain 143 120 -100.59 gain 120 144 -98.21 gain 144 120 -98.21 gain 120 145 -102.18 gain 145 120 -106.73 gain 120 146 -111.72 gain 146 120 -112.71 gain 120 147 -106.07 gain 147 120 -108.26 gain 120 148 -104.40 gain 148 120 -107.11 gain 120 149 -101.20 gain 149 120 -100.29 gain 120 150 -81.33 gain 150 120 -83.79 gain 120 151 -87.23 gain 151 120 -92.18 gain 120 152 -86.67 gain 152 120 -89.97 gain 120 153 -89.88 gain 153 120 -92.88 gain 120 154 -97.46 gain 154 120 -101.60 gain 120 155 -89.90 gain 155 120 -91.33 gain 120 156 -97.30 gain 156 120 -99.86 gain 120 157 -104.35 gain 157 120 -108.20 gain 120 158 -98.61 gain 158 120 -104.43 gain 120 159 -106.48 gain 159 120 -106.34 gain 120 160 -98.76 gain 160 120 -100.00 gain 120 161 -102.49 gain 161 120 -104.78 gain 120 162 -100.59 gain 162 120 -102.51 gain 120 163 -117.74 gain 163 120 -117.08 gain 120 164 -105.04 gain 164 120 -111.60 gain 120 165 -88.44 gain 165 120 -92.36 gain 120 166 -87.31 gain 166 120 -92.89 gain 120 167 -95.23 gain 167 120 -99.63 gain 120 168 -92.41 gain 168 120 -95.88 gain 120 169 -95.45 gain 169 120 -95.43 gain 120 170 -100.52 gain 170 120 -101.44 gain 120 171 -100.54 gain 171 120 -102.03 gain 120 172 -103.96 gain 172 120 -108.25 gain 120 173 -101.14 gain 173 120 -99.76 gain 120 174 -100.78 gain 174 120 -105.35 gain 120 175 -99.59 gain 175 120 -95.95 gain 120 176 -108.87 gain 176 120 -109.46 gain 120 177 -106.96 gain 177 120 -109.92 gain 120 178 -106.54 gain 178 120 -107.10 gain 120 179 -103.24 gain 179 120 -106.84 gain 120 180 -93.51 gain 180 120 -95.85 gain 120 181 -90.67 gain 181 120 -96.41 gain 120 182 -93.65 gain 182 120 -95.52 gain 120 183 -93.38 gain 183 120 -91.14 gain 120 184 -98.84 gain 184 120 -102.82 gain 120 185 -105.54 gain 185 120 -108.02 gain 120 186 -102.88 gain 186 120 -106.06 gain 120 187 -100.42 gain 187 120 -103.63 gain 120 188 -102.86 gain 188 120 -110.51 gain 120 189 -98.92 gain 189 120 -102.63 gain 120 190 -102.59 gain 190 120 -99.14 gain 120 191 -100.91 gain 191 120 -100.63 gain 120 192 -96.14 gain 192 120 -99.53 gain 120 193 -106.14 gain 193 120 -105.55 gain 120 194 -107.73 gain 194 120 -107.03 gain 120 195 -92.31 gain 195 120 -89.58 gain 120 196 -94.87 gain 196 120 -99.81 gain 120 197 -101.70 gain 197 120 -104.13 gain 120 198 -100.80 gain 198 120 -105.87 gain 120 199 -100.92 gain 199 120 -100.01 gain 120 200 -97.20 gain 200 120 -98.21 gain 120 201 -106.84 gain 201 120 -110.94 gain 120 202 -101.88 gain 202 120 -104.27 gain 120 203 -103.95 gain 203 120 -106.44 gain 120 204 -110.26 gain 204 120 -110.97 gain 120 205 -100.25 gain 205 120 -100.63 gain 120 206 -106.61 gain 206 120 -108.31 gain 120 207 -101.04 gain 207 120 -100.48 gain 120 208 -114.27 gain 208 120 -117.02 gain 120 209 -101.83 gain 209 120 -103.62 gain 120 210 -89.68 gain 210 120 -95.46 gain 120 211 -85.74 gain 211 120 -88.92 gain 120 212 -98.27 gain 212 120 -99.99 gain 120 213 -100.85 gain 213 120 -105.31 gain 120 214 -99.15 gain 214 120 -101.79 gain 120 215 -99.68 gain 215 120 -104.15 gain 120 216 -98.66 gain 216 120 -100.02 gain 120 217 -97.04 gain 217 120 -102.85 gain 120 218 -106.46 gain 218 120 -113.58 gain 120 219 -100.53 gain 219 120 -105.23 gain 120 220 -105.29 gain 220 120 -107.10 gain 120 221 -113.78 gain 221 120 -116.59 gain 120 222 -109.90 gain 222 120 -109.28 gain 120 223 -108.75 gain 223 120 -110.42 gain 120 224 -111.40 gain 224 120 -110.00 gain 121 122 -83.08 gain 122 121 -85.65 gain 121 123 -86.12 gain 123 121 -88.95 gain 121 124 -87.37 gain 124 121 -83.80 gain 121 125 -89.49 gain 125 121 -87.86 gain 121 126 -98.31 gain 126 121 -101.55 gain 121 127 -108.84 gain 127 121 -106.84 gain 121 128 -103.50 gain 128 121 -104.56 gain 121 129 -99.95 gain 129 121 -98.22 gain 121 130 -113.91 gain 130 121 -114.36 gain 121 131 -99.23 gain 131 121 -98.04 gain 121 132 -109.05 gain 132 121 -104.13 gain 121 133 -106.08 gain 133 121 -105.60 gain 121 134 -110.02 gain 134 121 -107.53 gain 121 135 -80.90 gain 135 121 -73.99 gain 121 136 -71.61 gain 136 121 -73.49 gain 121 137 -84.72 gain 137 121 -83.25 gain 121 138 -81.22 gain 138 121 -81.77 gain 121 139 -82.50 gain 139 121 -84.76 gain 121 140 -90.01 gain 140 121 -92.07 gain 121 141 -104.12 gain 141 121 -101.87 gain 121 142 -104.60 gain 142 121 -103.50 gain 121 143 -100.56 gain 143 121 -101.91 gain 121 144 -98.46 gain 144 121 -95.71 gain 121 145 -102.49 gain 145 121 -104.29 gain 121 146 -99.27 gain 146 121 -97.51 gain 121 147 -114.93 gain 147 121 -114.37 gain 121 148 -102.88 gain 148 121 -102.85 gain 121 149 -101.02 gain 149 121 -97.36 gain 121 150 -87.81 gain 150 121 -87.53 gain 121 151 -87.72 gain 151 121 -89.92 gain 121 152 -88.04 gain 152 121 -88.60 gain 121 153 -90.26 gain 153 121 -90.52 gain 121 154 -91.69 gain 154 121 -93.08 gain 121 155 -90.98 gain 155 121 -89.66 gain 121 156 -99.37 gain 156 121 -99.18 gain 121 157 -101.03 gain 157 121 -102.14 gain 121 158 -103.25 gain 158 121 -106.32 gain 121 159 -103.23 gain 159 121 -100.35 gain 121 160 -105.31 gain 160 121 -103.80 gain 121 161 -108.21 gain 161 121 -107.76 gain 121 162 -108.88 gain 162 121 -108.05 gain 121 163 -106.87 gain 163 121 -103.47 gain 121 164 -112.16 gain 164 121 -115.99 gain 121 165 -76.08 gain 165 121 -77.26 gain 121 166 -87.56 gain 166 121 -90.40 gain 121 167 -93.10 gain 167 121 -94.76 gain 121 168 -91.55 gain 168 121 -92.27 gain 121 169 -90.33 gain 169 121 -87.57 gain 121 170 -102.90 gain 170 121 -101.08 gain 121 171 -95.19 gain 171 121 -93.94 gain 121 172 -100.47 gain 172 121 -102.02 gain 121 173 -103.43 gain 173 121 -99.30 gain 121 174 -93.89 gain 174 121 -95.71 gain 121 175 -104.01 gain 175 121 -97.63 gain 121 176 -107.91 gain 176 121 -105.76 gain 121 177 -108.69 gain 177 121 -108.90 gain 121 178 -117.31 gain 178 121 -115.12 gain 121 179 -109.53 gain 179 121 -110.39 gain 121 180 -98.35 gain 180 121 -97.95 gain 121 181 -91.79 gain 181 121 -94.78 gain 121 182 -87.97 gain 182 121 -87.10 gain 121 183 -95.89 gain 183 121 -90.90 gain 121 184 -96.37 gain 184 121 -97.61 gain 121 185 -94.97 gain 185 121 -94.70 gain 121 186 -100.51 gain 186 121 -100.95 gain 121 187 -105.06 gain 187 121 -105.52 gain 121 188 -99.79 gain 188 121 -104.70 gain 121 189 -103.84 gain 189 121 -104.81 gain 121 190 -101.69 gain 190 121 -95.49 gain 121 191 -106.42 gain 191 121 -103.39 gain 121 192 -99.97 gain 192 121 -100.61 gain 121 193 -108.21 gain 193 121 -104.88 gain 121 194 -112.37 gain 194 121 -108.92 gain 121 195 -97.73 gain 195 121 -92.26 gain 121 196 -93.25 gain 196 121 -95.45 gain 121 197 -97.18 gain 197 121 -96.86 gain 121 198 -101.96 gain 198 121 -104.29 gain 121 199 -94.91 gain 199 121 -91.26 gain 121 200 -104.72 gain 200 121 -102.98 gain 121 201 -103.57 gain 201 121 -104.92 gain 121 202 -100.49 gain 202 121 -100.14 gain 121 203 -106.79 gain 203 121 -106.54 gain 121 204 -105.54 gain 204 121 -103.51 gain 121 205 -110.36 gain 205 121 -107.99 gain 121 206 -104.42 gain 206 121 -103.38 gain 121 207 -112.11 gain 207 121 -108.81 gain 121 208 -109.36 gain 208 121 -109.36 gain 121 209 -107.11 gain 209 121 -106.15 gain 121 210 -92.99 gain 210 121 -96.03 gain 121 211 -90.63 gain 211 121 -91.07 gain 121 212 -103.29 gain 212 121 -102.28 gain 121 213 -98.25 gain 213 121 -99.98 gain 121 214 -97.74 gain 214 121 -97.64 gain 121 215 -98.84 gain 215 121 -100.55 gain 121 216 -105.74 gain 216 121 -104.35 gain 121 217 -101.02 gain 217 121 -104.08 gain 121 218 -96.59 gain 218 121 -100.97 gain 121 219 -104.19 gain 219 121 -106.14 gain 121 220 -113.76 gain 220 121 -112.83 gain 121 221 -101.05 gain 221 121 -101.11 gain 121 222 -103.30 gain 222 121 -99.94 gain 121 223 -108.10 gain 223 121 -107.03 gain 121 224 -109.53 gain 224 121 -105.39 gain 122 123 -85.09 gain 123 122 -85.34 gain 122 124 -95.30 gain 124 122 -89.16 gain 122 125 -95.57 gain 125 122 -91.36 gain 122 126 -99.17 gain 126 122 -99.84 gain 122 127 -97.16 gain 127 122 -92.59 gain 122 128 -101.43 gain 128 122 -99.91 gain 122 129 -99.54 gain 129 122 -95.24 gain 122 130 -103.04 gain 130 122 -100.92 gain 122 131 -101.25 gain 131 122 -97.49 gain 122 132 -114.91 gain 132 122 -107.42 gain 122 133 -110.86 gain 133 122 -107.80 gain 122 134 -113.33 gain 134 122 -108.27 gain 122 135 -96.61 gain 135 122 -87.13 gain 122 136 -81.54 gain 136 122 -80.85 gain 122 137 -75.81 gain 137 122 -71.77 gain 122 138 -81.06 gain 138 122 -79.03 gain 122 139 -85.69 gain 139 122 -85.37 gain 122 140 -96.34 gain 140 122 -95.83 gain 122 141 -91.69 gain 141 122 -86.87 gain 122 142 -98.09 gain 142 122 -94.42 gain 122 143 -103.25 gain 143 122 -102.03 gain 122 144 -102.90 gain 144 122 -97.58 gain 122 145 -103.74 gain 145 122 -102.98 gain 122 146 -108.11 gain 146 122 -103.79 gain 122 147 -107.92 gain 147 122 -104.78 gain 122 148 -108.19 gain 148 122 -105.58 gain 122 149 -115.12 gain 149 122 -108.89 gain 122 150 -90.59 gain 150 122 -87.74 gain 122 151 -89.22 gain 151 122 -88.85 gain 122 152 -88.71 gain 152 122 -86.70 gain 122 153 -88.80 gain 153 122 -86.48 gain 122 154 -86.41 gain 154 122 -85.22 gain 122 155 -87.66 gain 155 122 -83.77 gain 122 156 -90.95 gain 156 122 -88.19 gain 122 157 -99.65 gain 157 122 -98.18 gain 122 158 -98.09 gain 158 122 -98.59 gain 122 159 -106.65 gain 159 122 -101.19 gain 122 160 -106.72 gain 160 122 -102.64 gain 122 161 -95.24 gain 161 122 -92.21 gain 122 162 -106.06 gain 162 122 -102.66 gain 122 163 -107.62 gain 163 122 -101.65 gain 122 164 -114.03 gain 164 122 -115.28 gain 122 165 -98.33 gain 165 122 -96.93 gain 122 166 -92.45 gain 166 122 -92.71 gain 122 167 -99.19 gain 167 122 -98.28 gain 122 168 -92.08 gain 168 122 -90.23 gain 122 169 -102.77 gain 169 122 -97.43 gain 122 170 -101.36 gain 170 122 -96.96 gain 122 171 -106.42 gain 171 122 -102.60 gain 122 172 -105.76 gain 172 122 -104.73 gain 122 173 -109.31 gain 173 122 -102.61 gain 122 174 -103.78 gain 174 122 -103.03 gain 122 175 -111.13 gain 175 122 -102.18 gain 122 176 -116.13 gain 176 122 -111.40 gain 122 177 -106.59 gain 177 122 -104.22 gain 122 178 -108.03 gain 178 122 -103.27 gain 122 179 -112.30 gain 179 122 -110.59 gain 122 180 -100.27 gain 180 122 -97.29 gain 122 181 -97.18 gain 181 122 -97.61 gain 122 182 -98.79 gain 182 122 -95.34 gain 122 183 -99.48 gain 183 122 -91.92 gain 122 184 -100.71 gain 184 122 -99.38 gain 122 185 -99.62 gain 185 122 -96.79 gain 122 186 -103.82 gain 186 122 -101.69 gain 122 187 -109.90 gain 187 122 -107.80 gain 122 188 -102.35 gain 188 122 -104.69 gain 122 189 -112.20 gain 189 122 -110.60 gain 122 190 -106.61 gain 190 122 -97.84 gain 122 191 -107.85 gain 191 122 -102.25 gain 122 192 -108.29 gain 192 122 -106.36 gain 122 193 -107.53 gain 193 122 -101.62 gain 122 194 -111.77 gain 194 122 -105.75 gain 122 195 -99.66 gain 195 122 -91.62 gain 122 196 -102.15 gain 196 122 -101.77 gain 122 197 -103.35 gain 197 122 -100.47 gain 122 198 -100.12 gain 198 122 -99.88 gain 122 199 -103.64 gain 199 122 -97.42 gain 122 200 -95.07 gain 200 122 -90.76 gain 122 201 -107.27 gain 201 122 -106.05 gain 122 202 -104.88 gain 202 122 -101.95 gain 122 203 -98.77 gain 203 122 -95.94 gain 122 204 -104.15 gain 204 122 -99.54 gain 122 205 -106.54 gain 205 122 -101.60 gain 122 206 -114.70 gain 206 122 -111.08 gain 122 207 -111.19 gain 207 122 -105.32 gain 122 208 -112.85 gain 208 122 -110.28 gain 122 209 -105.37 gain 209 122 -101.84 gain 122 210 -101.23 gain 210 122 -101.70 gain 122 211 -98.46 gain 211 122 -96.32 gain 122 212 -100.49 gain 212 122 -96.90 gain 122 213 -101.00 gain 213 122 -100.15 gain 122 214 -105.95 gain 214 122 -103.28 gain 122 215 -104.36 gain 215 122 -103.50 gain 122 216 -105.88 gain 216 122 -101.92 gain 122 217 -97.10 gain 217 122 -97.59 gain 122 218 -106.60 gain 218 122 -108.41 gain 122 219 -106.47 gain 219 122 -105.85 gain 122 220 -114.86 gain 220 122 -111.35 gain 122 221 -108.33 gain 221 122 -105.82 gain 122 222 -111.95 gain 222 122 -106.02 gain 122 223 -112.04 gain 223 122 -108.40 gain 122 224 -113.19 gain 224 122 -106.47 gain 123 124 -72.23 gain 124 123 -65.83 gain 123 125 -83.76 gain 125 123 -79.30 gain 123 126 -84.32 gain 126 123 -84.74 gain 123 127 -99.56 gain 127 123 -94.73 gain 123 128 -105.59 gain 128 123 -103.82 gain 123 129 -93.67 gain 129 123 -89.11 gain 123 130 -102.47 gain 130 123 -100.10 gain 123 131 -101.01 gain 131 123 -96.99 gain 123 132 -107.08 gain 132 123 -99.34 gain 123 133 -103.74 gain 133 123 -100.43 gain 123 134 -116.44 gain 134 123 -111.13 gain 123 135 -89.56 gain 135 123 -79.83 gain 123 136 -86.79 gain 136 123 -85.84 gain 123 137 -92.57 gain 137 123 -88.27 gain 123 138 -87.20 gain 138 123 -84.92 gain 123 139 -80.84 gain 139 123 -80.26 gain 123 140 -95.81 gain 140 123 -95.04 gain 123 141 -97.30 gain 141 123 -92.22 gain 123 142 -96.03 gain 142 123 -92.10 gain 123 143 -98.02 gain 143 123 -96.54 gain 123 144 -99.23 gain 144 123 -93.66 gain 123 145 -104.35 gain 145 123 -103.33 gain 123 146 -106.34 gain 146 123 -101.76 gain 123 147 -109.81 gain 147 123 -106.42 gain 123 148 -112.71 gain 148 123 -109.85 gain 123 149 -114.02 gain 149 123 -107.53 gain 123 150 -97.00 gain 150 123 -93.90 gain 123 151 -96.49 gain 151 123 -95.86 gain 123 152 -88.49 gain 152 123 -86.22 gain 123 153 -90.17 gain 153 123 -87.60 gain 123 154 -89.72 gain 154 123 -88.28 gain 123 155 -98.26 gain 155 123 -94.12 gain 123 156 -95.12 gain 156 123 -92.11 gain 123 157 -99.37 gain 157 123 -97.65 gain 123 158 -99.67 gain 158 123 -99.92 gain 123 159 -106.66 gain 159 123 -100.95 gain 123 160 -98.51 gain 160 123 -94.18 gain 123 161 -110.77 gain 161 123 -107.49 gain 123 162 -113.05 gain 162 123 -109.40 gain 123 163 -109.74 gain 163 123 -103.51 gain 123 164 -113.03 gain 164 123 -114.02 gain 123 165 -91.28 gain 165 123 -89.63 gain 123 166 -94.76 gain 166 123 -94.77 gain 123 167 -92.11 gain 167 123 -90.94 gain 123 168 -90.05 gain 168 123 -87.95 gain 123 169 -94.22 gain 169 123 -88.64 gain 123 170 -98.56 gain 170 123 -93.91 gain 123 171 -92.16 gain 171 123 -88.08 gain 123 172 -91.26 gain 172 123 -89.97 gain 123 173 -102.60 gain 173 123 -95.64 gain 123 174 -100.91 gain 174 123 -99.91 gain 123 175 -93.98 gain 175 123 -84.77 gain 123 176 -103.08 gain 176 123 -98.10 gain 123 177 -110.66 gain 177 123 -108.04 gain 123 178 -109.83 gain 178 123 -104.81 gain 123 179 -116.31 gain 179 123 -114.33 gain 123 180 -91.38 gain 180 123 -88.15 gain 123 181 -97.43 gain 181 123 -97.60 gain 123 182 -97.47 gain 182 123 -93.77 gain 123 183 -97.93 gain 183 123 -90.12 gain 123 184 -92.70 gain 184 123 -91.11 gain 123 185 -98.94 gain 185 123 -95.85 gain 123 186 -100.44 gain 186 123 -98.05 gain 123 187 -103.69 gain 187 123 -101.33 gain 123 188 -99.21 gain 188 123 -101.29 gain 123 189 -95.63 gain 189 123 -93.77 gain 123 190 -111.06 gain 190 123 -102.03 gain 123 191 -102.62 gain 191 123 -96.77 gain 123 192 -108.95 gain 192 123 -106.77 gain 123 193 -107.42 gain 193 123 -101.26 gain 123 194 -110.72 gain 194 123 -104.45 gain 123 195 -101.00 gain 195 123 -92.70 gain 123 196 -108.42 gain 196 123 -107.79 gain 123 197 -100.05 gain 197 123 -96.91 gain 123 198 -103.41 gain 198 123 -102.91 gain 123 199 -97.60 gain 199 123 -91.12 gain 123 200 -101.62 gain 200 123 -97.06 gain 123 201 -105.23 gain 201 123 -103.76 gain 123 202 -99.64 gain 202 123 -96.46 gain 123 203 -105.45 gain 203 123 -102.37 gain 123 204 -101.36 gain 204 123 -96.50 gain 123 205 -107.42 gain 205 123 -102.23 gain 123 206 -108.04 gain 206 123 -104.17 gain 123 207 -108.55 gain 207 123 -102.42 gain 123 208 -108.06 gain 208 123 -105.23 gain 123 209 -109.80 gain 209 123 -106.02 gain 123 210 -104.37 gain 210 123 -104.58 gain 123 211 -100.67 gain 211 123 -98.28 gain 123 212 -102.69 gain 212 123 -98.84 gain 123 213 -97.66 gain 213 123 -96.55 gain 123 214 -101.80 gain 214 123 -98.88 gain 123 215 -95.14 gain 215 123 -94.03 gain 123 216 -104.15 gain 216 123 -99.93 gain 123 217 -101.67 gain 217 123 -101.90 gain 123 218 -102.80 gain 218 123 -104.35 gain 123 219 -110.27 gain 219 123 -109.40 gain 123 220 -108.39 gain 220 123 -104.63 gain 123 221 -104.75 gain 221 123 -101.98 gain 123 222 -106.39 gain 222 123 -100.20 gain 123 223 -116.28 gain 223 123 -112.38 gain 123 224 -111.53 gain 224 123 -104.56 gain 124 125 -74.57 gain 125 124 -76.50 gain 124 126 -84.65 gain 126 124 -91.47 gain 124 127 -90.03 gain 127 124 -91.60 gain 124 128 -87.67 gain 128 124 -92.29 gain 124 129 -95.17 gain 129 124 -97.01 gain 124 130 -87.69 gain 130 124 -91.71 gain 124 131 -92.10 gain 131 124 -94.48 gain 124 132 -97.05 gain 132 124 -95.71 gain 124 133 -98.30 gain 133 124 -101.38 gain 124 134 -103.98 gain 134 124 -105.06 gain 124 135 -89.96 gain 135 124 -86.63 gain 124 136 -97.56 gain 136 124 -103.01 gain 124 137 -80.14 gain 137 124 -82.24 gain 124 138 -80.98 gain 138 124 -85.10 gain 124 139 -73.64 gain 139 124 -79.46 gain 124 140 -78.86 gain 140 124 -84.49 gain 124 141 -84.10 gain 141 124 -85.42 gain 124 142 -97.97 gain 142 124 -100.44 gain 124 143 -97.14 gain 143 124 -102.06 gain 124 144 -88.88 gain 144 124 -89.71 gain 124 145 -97.25 gain 145 124 -102.62 gain 124 146 -98.74 gain 146 124 -100.55 gain 124 147 -98.58 gain 147 124 -101.59 gain 124 148 -91.41 gain 148 124 -94.95 gain 124 149 -105.95 gain 149 124 -105.86 gain 124 150 -100.87 gain 150 124 -104.16 gain 124 151 -89.03 gain 151 124 -94.80 gain 124 152 -86.97 gain 152 124 -91.10 gain 124 153 -87.65 gain 153 124 -91.48 gain 124 154 -79.09 gain 154 124 -84.05 gain 124 155 -81.00 gain 155 124 -83.26 gain 124 156 -85.02 gain 156 124 -88.40 gain 124 157 -93.45 gain 157 124 -98.13 gain 124 158 -84.80 gain 158 124 -91.44 gain 124 159 -97.42 gain 159 124 -98.10 gain 124 160 -95.81 gain 160 124 -97.87 gain 124 161 -97.59 gain 161 124 -100.70 gain 124 162 -99.09 gain 162 124 -101.84 gain 124 163 -101.47 gain 163 124 -101.64 gain 124 164 -100.40 gain 164 124 -107.80 gain 124 165 -93.02 gain 165 124 -97.76 gain 124 166 -96.18 gain 166 124 -102.58 gain 124 167 -87.50 gain 167 124 -92.73 gain 124 168 -92.02 gain 168 124 -96.32 gain 124 169 -92.36 gain 169 124 -93.16 gain 124 170 -89.17 gain 170 124 -90.92 gain 124 171 -89.70 gain 171 124 -92.02 gain 124 172 -97.56 gain 172 124 -102.67 gain 124 173 -87.44 gain 173 124 -86.88 gain 124 174 -97.63 gain 174 124 -103.02 gain 124 175 -96.86 gain 175 124 -94.05 gain 124 176 -92.32 gain 176 124 -93.73 gain 124 177 -104.49 gain 177 124 -108.26 gain 124 178 -101.12 gain 178 124 -102.50 gain 124 179 -108.80 gain 179 124 -113.23 gain 124 180 -95.66 gain 180 124 -98.82 gain 124 181 -95.06 gain 181 124 -101.62 gain 124 182 -85.63 gain 182 124 -88.33 gain 124 183 -89.99 gain 183 124 -88.58 gain 124 184 -94.40 gain 184 124 -99.21 gain 124 185 -97.38 gain 185 124 -100.69 gain 124 186 -91.56 gain 186 124 -95.57 gain 124 187 -86.87 gain 187 124 -90.91 gain 124 188 -102.54 gain 188 124 -111.02 gain 124 189 -95.63 gain 189 124 -100.16 gain 124 190 -93.50 gain 190 124 -90.87 gain 124 191 -101.51 gain 191 124 -102.05 gain 124 192 -106.11 gain 192 124 -110.33 gain 124 193 -106.90 gain 193 124 -107.14 gain 124 194 -101.96 gain 194 124 -102.09 gain 124 195 -92.01 gain 195 124 -90.11 gain 124 196 -99.19 gain 196 124 -104.96 gain 124 197 -94.97 gain 197 124 -98.22 gain 124 198 -88.04 gain 198 124 -93.93 gain 124 199 -98.89 gain 199 124 -98.81 gain 124 200 -98.46 gain 200 124 -100.29 gain 124 201 -95.08 gain 201 124 -100.01 gain 124 202 -94.77 gain 202 124 -97.99 gain 124 203 -97.28 gain 203 124 -100.59 gain 124 204 -99.88 gain 204 124 -101.41 gain 124 205 -103.29 gain 205 124 -104.49 gain 124 206 -103.45 gain 206 124 -105.98 gain 124 207 -100.46 gain 207 124 -100.73 gain 124 208 -98.19 gain 208 124 -101.76 gain 124 209 -105.09 gain 209 124 -107.70 gain 124 210 -98.42 gain 210 124 -105.03 gain 124 211 -97.46 gain 211 124 -101.47 gain 124 212 -97.21 gain 212 124 -99.76 gain 124 213 -90.83 gain 213 124 -96.12 gain 124 214 -89.51 gain 214 124 -92.98 gain 124 215 -92.78 gain 215 124 -98.07 gain 124 216 -92.50 gain 216 124 -94.68 gain 124 217 -96.10 gain 217 124 -102.73 gain 124 218 -104.88 gain 218 124 -112.83 gain 124 219 -105.61 gain 219 124 -111.14 gain 124 220 -94.93 gain 220 124 -97.57 gain 124 221 -99.22 gain 221 124 -102.85 gain 124 222 -101.18 gain 222 124 -101.39 gain 124 223 -116.92 gain 223 124 -119.41 gain 124 224 -102.81 gain 224 124 -102.23 gain 125 126 -75.19 gain 126 125 -80.08 gain 125 127 -90.79 gain 127 125 -90.43 gain 125 128 -86.51 gain 128 125 -89.21 gain 125 129 -93.59 gain 129 125 -93.50 gain 125 130 -93.71 gain 130 125 -95.80 gain 125 131 -92.86 gain 131 125 -93.31 gain 125 132 -106.26 gain 132 125 -102.98 gain 125 133 -100.18 gain 133 125 -101.33 gain 125 134 -100.40 gain 134 125 -99.55 gain 125 135 -98.19 gain 135 125 -92.93 gain 125 136 -98.61 gain 136 125 -102.12 gain 125 137 -84.92 gain 137 125 -85.09 gain 125 138 -87.71 gain 138 125 -89.89 gain 125 139 -74.20 gain 139 125 -78.09 gain 125 140 -74.33 gain 140 125 -78.03 gain 125 141 -78.25 gain 141 125 -77.64 gain 125 142 -84.98 gain 142 125 -85.52 gain 125 143 -96.21 gain 143 125 -99.20 gain 125 144 -89.59 gain 144 125 -88.48 gain 125 145 -91.89 gain 145 125 -95.33 gain 125 146 -95.69 gain 146 125 -95.57 gain 125 147 -102.56 gain 147 125 -103.64 gain 125 148 -102.72 gain 148 125 -104.32 gain 125 149 -106.12 gain 149 125 -104.10 gain 125 150 -93.23 gain 150 125 -94.59 gain 125 151 -97.66 gain 151 125 -101.49 gain 125 152 -86.39 gain 152 125 -88.59 gain 125 153 -92.63 gain 153 125 -94.53 gain 125 154 -84.22 gain 154 125 -87.25 gain 125 155 -82.73 gain 155 125 -83.05 gain 125 156 -82.30 gain 156 125 -83.75 gain 125 157 -80.93 gain 157 125 -83.68 gain 125 158 -89.94 gain 158 125 -94.65 gain 125 159 -88.57 gain 159 125 -87.32 gain 125 160 -102.61 gain 160 125 -102.74 gain 125 161 -95.36 gain 161 125 -96.54 gain 125 162 -100.53 gain 162 125 -101.34 gain 125 163 -105.23 gain 163 125 -103.47 gain 125 164 -106.51 gain 164 125 -111.97 gain 125 165 -96.03 gain 165 125 -98.84 gain 125 166 -94.06 gain 166 125 -98.53 gain 125 167 -92.75 gain 167 125 -96.05 gain 125 168 -92.67 gain 168 125 -95.03 gain 125 169 -97.03 gain 169 125 -95.90 gain 125 170 -95.61 gain 170 125 -95.42 gain 125 171 -87.59 gain 171 125 -87.97 gain 125 172 -88.67 gain 172 125 -91.85 gain 125 173 -93.48 gain 173 125 -90.99 gain 125 174 -96.23 gain 174 125 -99.69 gain 125 175 -98.70 gain 175 125 -93.96 gain 125 176 -100.15 gain 176 125 -99.63 gain 125 177 -101.12 gain 177 125 -102.96 gain 125 178 -105.90 gain 178 125 -105.35 gain 125 179 -105.23 gain 179 125 -107.72 gain 125 180 -100.69 gain 180 125 -101.92 gain 125 181 -97.83 gain 181 125 -102.46 gain 125 182 -93.26 gain 182 125 -94.03 gain 125 183 -102.41 gain 183 125 -99.05 gain 125 184 -88.76 gain 184 125 -91.64 gain 125 185 -91.25 gain 185 125 -92.62 gain 125 186 -85.89 gain 186 125 -87.96 gain 125 187 -92.04 gain 187 125 -94.14 gain 125 188 -84.86 gain 188 125 -91.41 gain 125 189 -94.16 gain 189 125 -96.77 gain 125 190 -103.01 gain 190 125 -98.45 gain 125 191 -100.20 gain 191 125 -98.81 gain 125 192 -97.83 gain 192 125 -100.10 gain 125 193 -98.93 gain 193 125 -97.23 gain 125 194 -103.30 gain 194 125 -101.49 gain 125 195 -99.98 gain 195 125 -96.14 gain 125 196 -94.95 gain 196 125 -98.78 gain 125 197 -92.21 gain 197 125 -93.54 gain 125 198 -91.02 gain 198 125 -94.98 gain 125 199 -100.61 gain 199 125 -98.59 gain 125 200 -94.24 gain 200 125 -94.13 gain 125 201 -90.19 gain 201 125 -93.17 gain 125 202 -96.46 gain 202 125 -97.75 gain 125 203 -96.42 gain 203 125 -97.80 gain 125 204 -96.70 gain 204 125 -96.30 gain 125 205 -108.30 gain 205 125 -107.57 gain 125 206 -104.86 gain 206 125 -105.46 gain 125 207 -106.51 gain 207 125 -104.84 gain 125 208 -105.67 gain 208 125 -107.31 gain 125 209 -108.85 gain 209 125 -109.53 gain 125 210 -96.12 gain 210 125 -100.80 gain 125 211 -100.43 gain 211 125 -102.51 gain 125 212 -98.14 gain 212 125 -98.76 gain 125 213 -99.29 gain 213 125 -102.65 gain 125 214 -100.82 gain 214 125 -102.36 gain 125 215 -99.51 gain 215 125 -102.86 gain 125 216 -103.90 gain 216 125 -104.15 gain 125 217 -94.17 gain 217 125 -98.87 gain 125 218 -104.22 gain 218 125 -110.23 gain 125 219 -98.51 gain 219 125 -102.10 gain 125 220 -97.44 gain 220 125 -98.15 gain 125 221 -104.26 gain 221 125 -105.95 gain 125 222 -97.48 gain 222 125 -95.76 gain 125 223 -100.28 gain 223 125 -100.84 gain 125 224 -103.99 gain 224 125 -101.48 gain 126 127 -73.47 gain 127 126 -68.23 gain 126 128 -92.62 gain 128 126 -90.43 gain 126 129 -91.03 gain 129 126 -86.06 gain 126 130 -96.22 gain 130 126 -93.43 gain 126 131 -100.55 gain 131 126 -96.11 gain 126 132 -105.98 gain 132 126 -97.82 gain 126 133 -102.77 gain 133 126 -99.04 gain 126 134 -108.99 gain 134 126 -103.26 gain 126 135 -108.82 gain 135 126 -98.67 gain 126 136 -104.51 gain 136 126 -103.14 gain 126 137 -98.17 gain 137 126 -93.46 gain 126 138 -94.08 gain 138 126 -91.38 gain 126 139 -86.96 gain 139 126 -85.96 gain 126 140 -78.22 gain 140 126 -77.03 gain 126 141 -79.74 gain 141 126 -74.25 gain 126 142 -86.60 gain 142 126 -82.25 gain 126 143 -92.30 gain 143 126 -90.41 gain 126 144 -90.61 gain 144 126 -84.62 gain 126 145 -92.15 gain 145 126 -90.70 gain 126 146 -99.95 gain 146 126 -94.95 gain 126 147 -101.79 gain 147 126 -97.99 gain 126 148 -96.03 gain 148 126 -92.75 gain 126 149 -109.15 gain 149 126 -102.24 gain 126 150 -106.88 gain 150 126 -103.36 gain 126 151 -102.20 gain 151 126 -101.16 gain 126 152 -96.92 gain 152 126 -94.24 gain 126 153 -98.31 gain 153 126 -95.33 gain 126 154 -91.13 gain 154 126 -89.27 gain 126 155 -82.30 gain 155 126 -77.74 gain 126 156 -84.98 gain 156 126 -81.54 gain 126 157 -88.87 gain 157 126 -86.73 gain 126 158 -95.04 gain 158 126 -94.87 gain 126 159 -95.56 gain 159 126 -89.43 gain 126 160 -104.35 gain 160 126 -99.59 gain 126 161 -103.07 gain 161 126 -99.37 gain 126 162 -106.36 gain 162 126 -102.28 gain 126 163 -101.85 gain 163 126 -95.20 gain 126 164 -108.81 gain 164 126 -109.38 gain 126 165 -105.76 gain 165 126 -103.69 gain 126 166 -112.23 gain 166 126 -111.82 gain 126 167 -102.16 gain 167 126 -100.57 gain 126 168 -95.09 gain 168 126 -92.57 gain 126 169 -95.82 gain 169 126 -89.82 gain 126 170 -91.19 gain 170 126 -86.13 gain 126 171 -96.54 gain 171 126 -92.04 gain 126 172 -92.66 gain 172 126 -90.96 gain 126 173 -90.57 gain 173 126 -83.19 gain 126 174 -89.70 gain 174 126 -88.28 gain 126 175 -89.33 gain 175 126 -79.70 gain 126 176 -102.04 gain 176 126 -96.63 gain 126 177 -103.73 gain 177 126 -100.69 gain 126 178 -104.25 gain 178 126 -98.82 gain 126 179 -105.83 gain 179 126 -103.44 gain 126 180 -107.03 gain 180 126 -103.38 gain 126 181 -106.42 gain 181 126 -106.16 gain 126 182 -95.71 gain 182 126 -91.59 gain 126 183 -109.31 gain 183 126 -101.08 gain 126 184 -99.34 gain 184 126 -97.33 gain 126 185 -95.82 gain 185 126 -92.31 gain 126 186 -95.69 gain 186 126 -92.88 gain 126 187 -89.45 gain 187 126 -86.66 gain 126 188 -98.25 gain 188 126 -99.91 gain 126 189 -104.13 gain 189 126 -101.85 gain 126 190 -102.29 gain 190 126 -92.84 gain 126 191 -107.86 gain 191 126 -101.59 gain 126 192 -101.07 gain 192 126 -98.47 gain 126 193 -102.34 gain 193 126 -95.76 gain 126 194 -111.53 gain 194 126 -104.84 gain 126 195 -105.96 gain 195 126 -97.24 gain 126 196 -109.02 gain 196 126 -107.97 gain 126 197 -105.50 gain 197 126 -101.94 gain 126 198 -100.20 gain 198 126 -99.28 gain 126 199 -98.09 gain 199 126 -91.19 gain 126 200 -100.40 gain 200 126 -95.42 gain 126 201 -102.73 gain 201 126 -100.84 gain 126 202 -107.01 gain 202 126 -103.41 gain 126 203 -100.72 gain 203 126 -97.22 gain 126 204 -101.80 gain 204 126 -96.52 gain 126 205 -102.18 gain 205 126 -96.57 gain 126 206 -104.79 gain 206 126 -100.50 gain 126 207 -103.50 gain 207 126 -96.96 gain 126 208 -105.55 gain 208 126 -102.31 gain 126 209 -103.06 gain 209 126 -98.86 gain 126 210 -105.45 gain 210 126 -105.24 gain 126 211 -103.95 gain 211 126 -101.14 gain 126 212 -104.70 gain 212 126 -100.44 gain 126 213 -105.51 gain 213 126 -103.98 gain 126 214 -98.61 gain 214 126 -95.27 gain 126 215 -103.39 gain 215 126 -101.86 gain 126 216 -100.57 gain 216 126 -95.94 gain 126 217 -99.92 gain 217 126 -99.74 gain 126 218 -99.05 gain 218 126 -100.19 gain 126 219 -104.21 gain 219 126 -102.92 gain 126 220 -101.69 gain 220 126 -97.51 gain 126 221 -105.51 gain 221 126 -102.32 gain 126 222 -102.78 gain 222 126 -96.17 gain 126 223 -106.07 gain 223 126 -101.75 gain 126 224 -111.68 gain 224 126 -104.29 gain 127 128 -72.43 gain 128 127 -75.49 gain 127 129 -84.43 gain 129 127 -84.71 gain 127 130 -88.30 gain 130 127 -90.75 gain 127 131 -87.87 gain 131 127 -88.68 gain 127 132 -98.69 gain 132 127 -95.78 gain 127 133 -94.43 gain 133 127 -95.95 gain 127 134 -92.49 gain 134 127 -92.00 gain 127 135 -100.36 gain 135 127 -95.46 gain 127 136 -93.58 gain 136 127 -97.46 gain 127 137 -93.24 gain 137 127 -93.77 gain 127 138 -93.20 gain 138 127 -95.75 gain 127 139 -90.15 gain 139 127 -94.40 gain 127 140 -81.97 gain 140 127 -86.03 gain 127 141 -77.03 gain 141 127 -76.78 gain 127 142 -74.69 gain 142 127 -75.59 gain 127 143 -83.51 gain 143 127 -86.87 gain 127 144 -84.85 gain 144 127 -84.10 gain 127 145 -89.69 gain 145 127 -93.49 gain 127 146 -91.13 gain 146 127 -91.38 gain 127 147 -96.73 gain 147 127 -98.17 gain 127 148 -97.42 gain 148 127 -99.38 gain 127 149 -99.84 gain 149 127 -98.18 gain 127 150 -101.27 gain 150 127 -102.99 gain 127 151 -99.81 gain 151 127 -104.02 gain 127 152 -95.32 gain 152 127 -97.88 gain 127 153 -96.44 gain 153 127 -98.70 gain 127 154 -86.12 gain 154 127 -89.51 gain 127 155 -90.76 gain 155 127 -91.45 gain 127 156 -81.29 gain 156 127 -83.10 gain 127 157 -79.91 gain 157 127 -83.02 gain 127 158 -77.31 gain 158 127 -82.38 gain 127 159 -86.59 gain 159 127 -85.70 gain 127 160 -89.05 gain 160 127 -89.54 gain 127 161 -87.71 gain 161 127 -89.26 gain 127 162 -99.91 gain 162 127 -101.09 gain 127 163 -101.43 gain 163 127 -100.02 gain 127 164 -98.13 gain 164 127 -103.96 gain 127 165 -99.74 gain 165 127 -102.92 gain 127 166 -97.02 gain 166 127 -101.85 gain 127 167 -96.25 gain 167 127 -99.91 gain 127 168 -95.77 gain 168 127 -98.50 gain 127 169 -92.41 gain 169 127 -91.65 gain 127 170 -90.33 gain 170 127 -90.51 gain 127 171 -84.34 gain 171 127 -85.09 gain 127 172 -89.73 gain 172 127 -93.28 gain 127 173 -85.42 gain 173 127 -83.29 gain 127 174 -82.22 gain 174 127 -86.04 gain 127 175 -93.26 gain 175 127 -88.88 gain 127 176 -91.90 gain 176 127 -91.74 gain 127 177 -101.74 gain 177 127 -103.94 gain 127 178 -99.04 gain 178 127 -98.85 gain 127 179 -97.89 gain 179 127 -100.74 gain 127 180 -98.14 gain 180 127 -99.74 gain 127 181 -105.22 gain 181 127 -110.21 gain 127 182 -101.85 gain 182 127 -102.97 gain 127 183 -93.74 gain 183 127 -90.75 gain 127 184 -95.48 gain 184 127 -98.72 gain 127 185 -96.98 gain 185 127 -98.72 gain 127 186 -91.58 gain 186 127 -94.02 gain 127 187 -94.73 gain 187 127 -97.19 gain 127 188 -94.38 gain 188 127 -101.28 gain 127 189 -99.61 gain 189 127 -102.58 gain 127 190 -96.12 gain 190 127 -91.92 gain 127 191 -90.33 gain 191 127 -89.30 gain 127 192 -102.53 gain 192 127 -105.17 gain 127 193 -100.28 gain 193 127 -98.94 gain 127 194 -104.11 gain 194 127 -102.66 gain 127 195 -106.94 gain 195 127 -103.46 gain 127 196 -104.01 gain 196 127 -108.20 gain 127 197 -101.10 gain 197 127 -102.78 gain 127 198 -90.19 gain 198 127 -94.52 gain 127 199 -100.30 gain 199 127 -98.64 gain 127 200 -91.13 gain 200 127 -91.39 gain 127 201 -85.39 gain 201 127 -88.74 gain 127 202 -89.92 gain 202 127 -91.56 gain 127 203 -92.51 gain 203 127 -94.25 gain 127 204 -97.50 gain 204 127 -97.47 gain 127 205 -101.37 gain 205 127 -101.00 gain 127 206 -94.91 gain 206 127 -95.87 gain 127 207 -99.87 gain 207 127 -98.57 gain 127 208 -95.58 gain 208 127 -97.58 gain 127 209 -106.40 gain 209 127 -107.44 gain 127 210 -104.11 gain 210 127 -109.15 gain 127 211 -102.35 gain 211 127 -104.79 gain 127 212 -103.78 gain 212 127 -104.76 gain 127 213 -97.93 gain 213 127 -101.66 gain 127 214 -96.70 gain 214 127 -98.60 gain 127 215 -96.66 gain 215 127 -100.38 gain 127 216 -92.83 gain 216 127 -93.44 gain 127 217 -102.39 gain 217 127 -107.45 gain 127 218 -90.59 gain 218 127 -96.97 gain 127 219 -109.14 gain 219 127 -113.09 gain 127 220 -90.93 gain 220 127 -92.00 gain 127 221 -95.12 gain 221 127 -97.18 gain 127 222 -98.79 gain 222 127 -97.43 gain 127 223 -98.18 gain 223 127 -99.10 gain 127 224 -102.20 gain 224 127 -100.05 gain 128 129 -73.73 gain 129 128 -70.94 gain 128 130 -83.85 gain 130 128 -83.25 gain 128 131 -89.01 gain 131 128 -86.77 gain 128 132 -96.30 gain 132 128 -90.33 gain 128 133 -93.01 gain 133 128 -91.47 gain 128 134 -98.20 gain 134 128 -94.66 gain 128 135 -99.93 gain 135 128 -91.97 gain 128 136 -102.46 gain 136 128 -103.27 gain 128 137 -100.89 gain 137 128 -98.37 gain 128 138 -94.37 gain 138 128 -93.86 gain 128 139 -95.75 gain 139 128 -96.95 gain 128 140 -89.30 gain 140 128 -90.31 gain 128 141 -79.44 gain 141 128 -76.13 gain 128 142 -90.92 gain 142 128 -88.76 gain 128 143 -82.55 gain 143 128 -82.85 gain 128 144 -79.35 gain 144 128 -75.55 gain 128 145 -87.33 gain 145 128 -88.08 gain 128 146 -93.59 gain 146 128 -90.78 gain 128 147 -86.71 gain 147 128 -85.10 gain 128 148 -96.73 gain 148 128 -95.64 gain 128 149 -98.21 gain 149 128 -93.49 gain 128 150 -109.13 gain 150 128 -107.80 gain 128 151 -104.95 gain 151 128 -106.09 gain 128 152 -102.48 gain 152 128 -101.99 gain 128 153 -102.00 gain 153 128 -101.20 gain 128 154 -91.35 gain 154 128 -91.69 gain 128 155 -96.19 gain 155 128 -93.82 gain 128 156 -97.27 gain 156 128 -96.03 gain 128 157 -84.30 gain 157 128 -84.35 gain 128 158 -82.82 gain 158 128 -84.84 gain 128 159 -88.24 gain 159 128 -84.29 gain 128 160 -86.85 gain 160 128 -84.29 gain 128 161 -91.76 gain 161 128 -90.25 gain 128 162 -88.05 gain 162 128 -86.16 gain 128 163 -106.84 gain 163 128 -102.38 gain 128 164 -105.46 gain 164 128 -108.23 gain 128 165 -102.18 gain 165 128 -102.30 gain 128 166 -102.05 gain 166 128 -103.83 gain 128 167 -100.36 gain 167 128 -100.96 gain 128 168 -96.63 gain 168 128 -96.30 gain 128 169 -98.77 gain 169 128 -94.95 gain 128 170 -92.52 gain 170 128 -89.64 gain 128 171 -91.18 gain 171 128 -88.88 gain 128 172 -95.26 gain 172 128 -95.76 gain 128 173 -88.88 gain 173 128 -83.69 gain 128 174 -87.36 gain 174 128 -88.13 gain 128 175 -93.98 gain 175 128 -86.54 gain 128 176 -99.36 gain 176 128 -96.15 gain 128 177 -96.48 gain 177 128 -95.63 gain 128 178 -103.09 gain 178 128 -99.84 gain 128 179 -104.60 gain 179 128 -104.40 gain 128 180 -108.89 gain 180 128 -107.43 gain 128 181 -94.18 gain 181 128 -96.12 gain 128 182 -102.05 gain 182 128 -100.12 gain 128 183 -102.55 gain 183 128 -96.51 gain 128 184 -99.44 gain 184 128 -99.63 gain 128 185 -98.07 gain 185 128 -96.75 gain 128 186 -99.81 gain 186 128 -99.20 gain 128 187 -91.95 gain 187 128 -91.36 gain 128 188 -104.27 gain 188 128 -108.12 gain 128 189 -94.06 gain 189 128 -93.97 gain 128 190 -94.18 gain 190 128 -86.93 gain 128 191 -97.53 gain 191 128 -93.45 gain 128 192 -106.62 gain 192 128 -106.21 gain 128 193 -104.33 gain 193 128 -99.94 gain 128 194 -97.94 gain 194 128 -93.44 gain 128 195 -105.22 gain 195 128 -98.69 gain 128 196 -110.90 gain 196 128 -112.04 gain 128 197 -102.82 gain 197 128 -101.45 gain 128 198 -99.22 gain 198 128 -100.49 gain 128 199 -100.14 gain 199 128 -95.43 gain 128 200 -101.22 gain 200 128 -98.43 gain 128 201 -98.99 gain 201 128 -99.28 gain 128 202 -97.10 gain 202 128 -95.70 gain 128 203 -101.61 gain 203 128 -100.30 gain 128 204 -102.86 gain 204 128 -99.77 gain 128 205 -99.53 gain 205 128 -96.11 gain 128 206 -103.94 gain 206 128 -101.84 gain 128 207 -103.48 gain 207 128 -99.12 gain 128 208 -99.63 gain 208 128 -98.58 gain 128 209 -100.13 gain 209 128 -98.11 gain 128 210 -106.56 gain 210 128 -108.55 gain 128 211 -110.13 gain 211 128 -109.51 gain 128 212 -106.98 gain 212 128 -104.91 gain 128 213 -108.11 gain 213 128 -108.77 gain 128 214 -104.20 gain 214 128 -103.05 gain 128 215 -96.32 gain 215 128 -96.98 gain 128 216 -96.84 gain 216 128 -94.40 gain 128 217 -107.57 gain 217 128 -109.58 gain 128 218 -93.86 gain 218 128 -97.19 gain 128 219 -99.14 gain 219 128 -100.04 gain 128 220 -109.25 gain 220 128 -107.26 gain 128 221 -102.67 gain 221 128 -101.67 gain 128 222 -105.62 gain 222 128 -101.20 gain 128 223 -105.34 gain 223 128 -103.21 gain 128 224 -112.29 gain 224 128 -107.08 gain 129 130 -78.58 gain 130 129 -80.76 gain 129 131 -82.42 gain 131 129 -82.95 gain 129 132 -91.31 gain 132 129 -88.12 gain 129 133 -93.73 gain 133 129 -94.97 gain 129 134 -95.14 gain 134 129 -94.38 gain 129 135 -102.81 gain 135 129 -97.64 gain 129 136 -101.16 gain 136 129 -104.76 gain 129 137 -102.21 gain 137 129 -102.47 gain 129 138 -93.35 gain 138 129 -95.62 gain 129 139 -97.28 gain 139 129 -101.27 gain 129 140 -91.41 gain 140 129 -95.20 gain 129 141 -90.99 gain 141 129 -90.47 gain 129 142 -88.48 gain 142 129 -89.11 gain 129 143 -79.46 gain 143 129 -82.54 gain 129 144 -74.30 gain 144 129 -73.28 gain 129 145 -85.90 gain 145 129 -89.43 gain 129 146 -85.05 gain 146 129 -85.02 gain 129 147 -94.39 gain 147 129 -95.56 gain 129 148 -95.04 gain 148 129 -96.73 gain 129 149 -97.45 gain 149 129 -95.52 gain 129 150 -101.82 gain 150 129 -103.27 gain 129 151 -102.50 gain 151 129 -106.43 gain 129 152 -103.63 gain 152 129 -105.92 gain 129 153 -100.36 gain 153 129 -102.35 gain 129 154 -92.14 gain 154 129 -95.26 gain 129 155 -97.23 gain 155 129 -97.64 gain 129 156 -86.45 gain 156 129 -87.99 gain 129 157 -90.35 gain 157 129 -93.18 gain 129 158 -84.94 gain 158 129 -89.75 gain 129 159 -81.02 gain 159 129 -79.86 gain 129 160 -77.86 gain 160 129 -78.08 gain 129 161 -89.18 gain 161 129 -90.45 gain 129 162 -77.44 gain 162 129 -78.34 gain 129 163 -98.79 gain 163 129 -97.12 gain 129 164 -92.64 gain 164 129 -98.19 gain 129 165 -103.70 gain 165 129 -106.61 gain 129 166 -94.73 gain 166 129 -99.30 gain 129 167 -105.55 gain 167 129 -108.94 gain 129 168 -99.32 gain 168 129 -101.77 gain 129 169 -97.70 gain 169 129 -96.66 gain 129 170 -92.28 gain 170 129 -92.19 gain 129 171 -86.28 gain 171 129 -86.76 gain 129 172 -93.37 gain 172 129 -96.64 gain 129 173 -89.03 gain 173 129 -86.62 gain 129 174 -93.30 gain 174 129 -96.86 gain 129 175 -87.60 gain 175 129 -82.95 gain 129 176 -97.23 gain 176 129 -96.80 gain 129 177 -90.03 gain 177 129 -91.96 gain 129 178 -102.03 gain 178 129 -101.57 gain 129 179 -98.43 gain 179 129 -101.02 gain 129 180 -108.95 gain 180 129 -110.27 gain 129 181 -107.72 gain 181 129 -112.44 gain 129 182 -97.09 gain 182 129 -97.95 gain 129 183 -96.80 gain 183 129 -93.54 gain 129 184 -99.68 gain 184 129 -102.64 gain 129 185 -93.37 gain 185 129 -94.84 gain 129 186 -90.23 gain 186 129 -92.40 gain 129 187 -95.44 gain 187 129 -97.63 gain 129 188 -98.10 gain 188 129 -104.73 gain 129 189 -96.02 gain 189 129 -98.71 gain 129 190 -92.77 gain 190 129 -88.30 gain 129 191 -93.55 gain 191 129 -92.25 gain 129 192 -98.72 gain 192 129 -101.09 gain 129 193 -98.59 gain 193 129 -96.98 gain 129 194 -99.75 gain 194 129 -98.03 gain 129 195 -104.11 gain 195 129 -100.37 gain 129 196 -105.77 gain 196 129 -109.69 gain 129 197 -104.68 gain 197 129 -106.09 gain 129 198 -98.06 gain 198 129 -102.12 gain 129 199 -92.72 gain 199 129 -90.79 gain 129 200 -94.65 gain 200 129 -94.64 gain 129 201 -98.77 gain 201 129 -101.85 gain 129 202 -90.70 gain 202 129 -92.07 gain 129 203 -91.33 gain 203 129 -92.81 gain 129 204 -90.44 gain 204 129 -90.13 gain 129 205 -91.47 gain 205 129 -90.83 gain 129 206 -97.26 gain 206 129 -97.95 gain 129 207 -105.11 gain 207 129 -103.54 gain 129 208 -96.64 gain 208 129 -98.37 gain 129 209 -103.40 gain 209 129 -104.17 gain 129 210 -102.65 gain 210 129 -107.42 gain 129 211 -100.96 gain 211 129 -103.12 gain 129 212 -103.14 gain 212 129 -103.85 gain 129 213 -105.21 gain 213 129 -108.66 gain 129 214 -103.97 gain 214 129 -105.60 gain 129 215 -98.70 gain 215 129 -102.15 gain 129 216 -95.08 gain 216 129 -95.42 gain 129 217 -95.30 gain 217 129 -100.09 gain 129 218 -100.61 gain 218 129 -106.72 gain 129 219 -101.13 gain 219 129 -104.81 gain 129 220 -96.05 gain 220 129 -96.85 gain 129 221 -97.57 gain 221 129 -99.36 gain 129 222 -98.08 gain 222 129 -96.44 gain 129 223 -99.55 gain 223 129 -100.21 gain 129 224 -106.18 gain 224 129 -103.76 gain 130 131 -83.40 gain 131 130 -81.76 gain 130 132 -92.74 gain 132 130 -87.38 gain 130 133 -93.05 gain 133 130 -92.11 gain 130 134 -95.61 gain 134 130 -92.67 gain 130 135 -108.68 gain 135 130 -101.32 gain 130 136 -107.59 gain 136 130 -109.01 gain 130 137 -101.76 gain 137 130 -99.84 gain 130 138 -106.37 gain 138 130 -106.46 gain 130 139 -105.76 gain 139 130 -107.56 gain 130 140 -100.72 gain 140 130 -102.33 gain 130 141 -90.12 gain 141 130 -87.41 gain 130 142 -96.01 gain 142 130 -94.45 gain 130 143 -85.12 gain 143 130 -86.02 gain 130 144 -79.44 gain 144 130 -76.24 gain 130 145 -79.32 gain 145 130 -80.67 gain 130 146 -79.37 gain 146 130 -77.17 gain 130 147 -85.73 gain 147 130 -84.72 gain 130 148 -100.08 gain 148 130 -99.59 gain 130 149 -99.76 gain 149 130 -95.65 gain 130 150 -111.90 gain 150 130 -111.17 gain 130 151 -106.62 gain 151 130 -108.37 gain 130 152 -101.43 gain 152 130 -101.54 gain 130 153 -97.39 gain 153 130 -97.19 gain 130 154 -95.84 gain 154 130 -96.78 gain 130 155 -102.86 gain 155 130 -101.10 gain 130 156 -94.44 gain 156 130 -93.80 gain 130 157 -87.11 gain 157 130 -87.76 gain 130 158 -85.11 gain 158 130 -87.73 gain 130 159 -91.03 gain 159 130 -87.69 gain 130 160 -81.84 gain 160 130 -79.88 gain 130 161 -86.42 gain 161 130 -85.52 gain 130 162 -91.22 gain 162 130 -89.94 gain 130 163 -97.94 gain 163 130 -94.08 gain 130 164 -94.22 gain 164 130 -97.59 gain 130 165 -107.84 gain 165 130 -108.57 gain 130 166 -107.64 gain 166 130 -110.03 gain 130 167 -107.95 gain 167 130 -109.15 gain 130 168 -99.39 gain 168 130 -99.66 gain 130 169 -101.26 gain 169 130 -98.05 gain 130 170 -102.26 gain 170 130 -99.98 gain 130 171 -98.68 gain 171 130 -96.97 gain 130 172 -88.14 gain 172 130 -89.23 gain 130 173 -89.12 gain 173 130 -84.53 gain 130 174 -95.52 gain 174 130 -96.90 gain 130 175 -90.73 gain 175 130 -83.90 gain 130 176 -86.63 gain 176 130 -84.03 gain 130 177 -101.39 gain 177 130 -101.15 gain 130 178 -88.79 gain 178 130 -86.15 gain 130 179 -95.95 gain 179 130 -96.35 gain 130 180 -102.04 gain 180 130 -101.18 gain 130 181 -103.80 gain 181 130 -106.34 gain 130 182 -103.43 gain 182 130 -102.10 gain 130 183 -103.26 gain 183 130 -97.82 gain 130 184 -98.23 gain 184 130 -99.01 gain 130 185 -97.44 gain 185 130 -96.73 gain 130 186 -90.73 gain 186 130 -90.72 gain 130 187 -97.24 gain 187 130 -97.26 gain 130 188 -92.52 gain 188 130 -96.98 gain 130 189 -97.44 gain 189 130 -97.95 gain 130 190 -101.30 gain 190 130 -94.64 gain 130 191 -100.70 gain 191 130 -97.21 gain 130 192 -94.80 gain 192 130 -94.99 gain 130 193 -93.30 gain 193 130 -89.52 gain 130 194 -101.34 gain 194 130 -97.44 gain 130 195 -107.99 gain 195 130 -102.07 gain 130 196 -114.28 gain 196 130 -116.02 gain 130 197 -108.67 gain 197 130 -107.91 gain 130 198 -104.03 gain 198 130 -105.91 gain 130 199 -110.60 gain 199 130 -106.50 gain 130 200 -104.54 gain 200 130 -102.35 gain 130 201 -89.23 gain 201 130 -90.13 gain 130 202 -93.66 gain 202 130 -92.85 gain 130 203 -94.35 gain 203 130 -93.65 gain 130 204 -96.24 gain 204 130 -93.75 gain 130 205 -95.82 gain 205 130 -93.00 gain 130 206 -99.75 gain 206 130 -98.25 gain 130 207 -95.17 gain 207 130 -91.42 gain 130 208 -95.45 gain 208 130 -95.00 gain 130 209 -98.66 gain 209 130 -97.24 gain 130 210 -112.52 gain 210 130 -115.11 gain 130 211 -107.51 gain 211 130 -107.50 gain 130 212 -107.75 gain 212 130 -106.28 gain 130 213 -104.12 gain 213 130 -105.39 gain 130 214 -100.61 gain 214 130 -100.07 gain 130 215 -104.72 gain 215 130 -105.98 gain 130 216 -104.54 gain 216 130 -102.69 gain 130 217 -93.29 gain 217 130 -95.90 gain 130 218 -102.70 gain 218 130 -106.62 gain 130 219 -88.49 gain 219 130 -89.99 gain 130 220 -96.65 gain 220 130 -95.26 gain 130 221 -100.65 gain 221 130 -100.25 gain 130 222 -104.09 gain 222 130 -100.28 gain 130 223 -94.27 gain 223 130 -92.74 gain 130 224 -104.57 gain 224 130 -99.98 gain 131 132 -66.17 gain 132 131 -62.45 gain 131 133 -86.36 gain 133 131 -87.06 gain 131 134 -92.50 gain 134 131 -91.20 gain 131 135 -104.21 gain 135 131 -98.49 gain 131 136 -107.08 gain 136 131 -110.14 gain 131 137 -96.70 gain 137 131 -96.43 gain 131 138 -99.00 gain 138 131 -100.74 gain 131 139 -96.63 gain 139 131 -100.07 gain 131 140 -99.41 gain 140 131 -102.66 gain 131 141 -96.47 gain 141 131 -95.41 gain 131 142 -91.01 gain 142 131 -91.10 gain 131 143 -94.37 gain 143 131 -96.91 gain 131 144 -84.85 gain 144 131 -83.29 gain 131 145 -83.89 gain 145 131 -86.88 gain 131 146 -76.08 gain 146 131 -75.51 gain 131 147 -77.29 gain 147 131 -77.92 gain 131 148 -86.63 gain 148 131 -87.79 gain 131 149 -91.05 gain 149 131 -88.58 gain 131 150 -113.04 gain 150 131 -113.96 gain 131 151 -104.67 gain 151 131 -108.06 gain 131 152 -102.12 gain 152 131 -103.87 gain 131 153 -93.40 gain 153 131 -94.84 gain 131 154 -98.32 gain 154 131 -100.90 gain 131 155 -103.97 gain 155 131 -103.84 gain 131 156 -94.28 gain 156 131 -95.28 gain 131 157 -89.47 gain 157 131 -91.77 gain 131 158 -87.73 gain 158 131 -92.00 gain 131 159 -92.48 gain 159 131 -90.79 gain 131 160 -87.11 gain 160 131 -86.79 gain 131 161 -82.02 gain 161 131 -82.75 gain 131 162 -78.09 gain 162 131 -78.45 gain 131 163 -88.66 gain 163 131 -86.44 gain 131 164 -88.07 gain 164 131 -93.08 gain 131 165 -100.41 gain 165 131 -102.78 gain 131 166 -107.08 gain 166 131 -111.11 gain 131 167 -108.58 gain 167 131 -111.43 gain 131 168 -101.61 gain 168 131 -103.52 gain 131 169 -103.69 gain 169 131 -102.12 gain 131 170 -106.35 gain 170 131 -105.71 gain 131 171 -88.40 gain 171 131 -88.34 gain 131 172 -92.12 gain 172 131 -94.85 gain 131 173 -99.34 gain 173 131 -96.40 gain 131 174 -83.04 gain 174 131 -86.06 gain 131 175 -88.40 gain 175 131 -83.21 gain 131 176 -91.25 gain 176 131 -90.28 gain 131 177 -86.07 gain 177 131 -87.46 gain 131 178 -101.80 gain 178 131 -100.80 gain 131 179 -92.38 gain 179 131 -94.42 gain 131 180 -112.29 gain 180 131 -113.08 gain 131 181 -101.42 gain 181 131 -105.60 gain 131 182 -106.39 gain 182 131 -106.70 gain 131 183 -103.62 gain 183 131 -99.82 gain 131 184 -101.19 gain 184 131 -103.62 gain 131 185 -105.30 gain 185 131 -106.23 gain 131 186 -105.51 gain 186 131 -107.14 gain 131 187 -97.94 gain 187 131 -99.60 gain 131 188 -93.75 gain 188 131 -99.85 gain 131 189 -98.17 gain 189 131 -100.32 gain 131 190 -86.50 gain 190 131 -81.49 gain 131 191 -89.66 gain 191 131 -87.82 gain 131 192 -86.79 gain 192 131 -88.63 gain 131 193 -91.56 gain 193 131 -89.42 gain 131 194 -98.67 gain 194 131 -96.42 gain 131 195 -105.47 gain 195 131 -101.19 gain 131 196 -106.39 gain 196 131 -109.78 gain 131 197 -105.52 gain 197 131 -106.40 gain 131 198 -100.97 gain 198 131 -104.49 gain 131 199 -102.57 gain 199 131 -100.11 gain 131 200 -97.76 gain 200 131 -97.21 gain 131 201 -96.81 gain 201 131 -99.35 gain 131 202 -108.57 gain 202 131 -109.41 gain 131 203 -93.13 gain 203 131 -94.06 gain 131 204 -102.51 gain 204 131 -101.67 gain 131 205 -98.94 gain 205 131 -97.76 gain 131 206 -94.23 gain 206 131 -94.38 gain 131 207 -97.78 gain 207 131 -95.67 gain 131 208 -98.10 gain 208 131 -99.29 gain 131 209 -98.71 gain 209 131 -98.94 gain 131 210 -108.49 gain 210 131 -112.72 gain 131 211 -106.61 gain 211 131 -108.24 gain 131 212 -113.30 gain 212 131 -113.47 gain 131 213 -108.30 gain 213 131 -111.21 gain 131 214 -108.42 gain 214 131 -109.52 gain 131 215 -99.74 gain 215 131 -102.65 gain 131 216 -100.35 gain 216 131 -100.15 gain 131 217 -100.13 gain 217 131 -104.38 gain 131 218 -99.15 gain 218 131 -104.71 gain 131 219 -101.00 gain 219 131 -104.14 gain 131 220 -93.00 gain 220 131 -93.26 gain 131 221 -101.46 gain 221 131 -102.71 gain 131 222 -106.01 gain 222 131 -103.84 gain 131 223 -100.80 gain 223 131 -100.91 gain 131 224 -101.75 gain 224 131 -98.80 gain 132 133 -71.70 gain 133 132 -76.12 gain 132 134 -80.30 gain 134 132 -82.73 gain 132 135 -102.80 gain 135 132 -100.82 gain 132 136 -105.01 gain 136 132 -111.80 gain 132 137 -106.75 gain 137 132 -110.20 gain 132 138 -97.83 gain 138 132 -103.30 gain 132 139 -92.00 gain 139 132 -99.16 gain 132 140 -95.48 gain 140 132 -102.45 gain 132 141 -99.50 gain 141 132 -102.16 gain 132 142 -93.73 gain 142 132 -97.54 gain 132 143 -86.64 gain 143 132 -92.91 gain 132 144 -78.77 gain 144 132 -80.94 gain 132 145 -83.24 gain 145 132 -89.96 gain 132 146 -73.34 gain 146 132 -76.50 gain 132 147 -68.54 gain 147 132 -72.89 gain 132 148 -77.21 gain 148 132 -82.09 gain 132 149 -77.53 gain 149 132 -78.79 gain 132 150 -110.67 gain 150 132 -115.31 gain 132 151 -99.90 gain 151 132 -107.02 gain 132 152 -101.00 gain 152 132 -106.47 gain 132 153 -103.07 gain 153 132 -108.24 gain 132 154 -104.50 gain 154 132 -110.81 gain 132 155 -96.21 gain 155 132 -99.81 gain 132 156 -92.35 gain 156 132 -97.07 gain 132 157 -90.14 gain 157 132 -96.16 gain 132 158 -92.39 gain 158 132 -100.38 gain 132 159 -86.51 gain 159 132 -88.53 gain 132 160 -86.41 gain 160 132 -89.82 gain 132 161 -82.31 gain 161 132 -86.77 gain 132 162 -83.80 gain 162 132 -87.89 gain 132 163 -82.61 gain 163 132 -84.12 gain 132 164 -78.57 gain 164 132 -87.30 gain 132 165 -104.35 gain 165 132 -110.44 gain 132 166 -101.60 gain 166 132 -109.35 gain 132 167 -103.45 gain 167 132 -110.02 gain 132 168 -97.67 gain 168 132 -103.31 gain 132 169 -101.35 gain 169 132 -103.51 gain 132 170 -100.71 gain 170 132 -103.80 gain 132 171 -95.95 gain 171 132 -99.61 gain 132 172 -96.24 gain 172 132 -102.70 gain 132 173 -96.18 gain 173 132 -96.96 gain 132 174 -83.21 gain 174 132 -89.95 gain 132 175 -81.38 gain 175 132 -79.92 gain 132 176 -89.13 gain 176 132 -91.89 gain 132 177 -88.30 gain 177 132 -93.42 gain 132 178 -84.40 gain 178 132 -87.13 gain 132 179 -86.61 gain 179 132 -92.39 gain 132 180 -105.72 gain 180 132 -110.22 gain 132 181 -104.98 gain 181 132 -112.88 gain 132 182 -103.06 gain 182 132 -107.10 gain 132 183 -98.62 gain 183 132 -98.54 gain 132 184 -106.25 gain 184 132 -112.40 gain 132 185 -95.88 gain 185 132 -100.54 gain 132 186 -96.98 gain 186 132 -102.33 gain 132 187 -96.09 gain 187 132 -101.47 gain 132 188 -94.11 gain 188 132 -103.93 gain 132 189 -90.47 gain 189 132 -96.35 gain 132 190 -93.43 gain 190 132 -92.15 gain 132 191 -93.77 gain 191 132 -95.65 gain 132 192 -92.14 gain 192 132 -97.70 gain 132 193 -83.75 gain 193 132 -85.33 gain 132 194 -89.29 gain 194 132 -90.76 gain 132 195 -101.47 gain 195 132 -100.91 gain 132 196 -106.15 gain 196 132 -113.26 gain 132 197 -109.78 gain 197 132 -114.38 gain 132 198 -106.18 gain 198 132 -113.42 gain 132 199 -98.88 gain 199 132 -100.14 gain 132 200 -102.80 gain 200 132 -105.98 gain 132 201 -99.10 gain 201 132 -105.36 gain 132 202 -92.06 gain 202 132 -96.63 gain 132 203 -95.68 gain 203 132 -100.34 gain 132 204 -88.73 gain 204 132 -91.62 gain 132 205 -92.44 gain 205 132 -94.99 gain 132 206 -93.89 gain 206 132 -97.76 gain 132 207 -92.25 gain 207 132 -93.87 gain 132 208 -93.56 gain 208 132 -98.47 gain 132 209 -99.61 gain 209 132 -103.56 gain 132 210 -103.08 gain 210 132 -111.03 gain 132 211 -112.20 gain 211 132 -117.55 gain 132 212 -97.92 gain 212 132 -101.82 gain 132 213 -108.69 gain 213 132 -115.32 gain 132 214 -106.43 gain 214 132 -111.24 gain 132 215 -98.17 gain 215 132 -104.81 gain 132 216 -96.76 gain 216 132 -100.28 gain 132 217 -105.93 gain 217 132 -113.91 gain 132 218 -101.23 gain 218 132 -110.52 gain 132 219 -93.70 gain 219 132 -100.57 gain 132 220 -101.32 gain 220 132 -105.31 gain 132 221 -95.53 gain 221 132 -100.50 gain 132 222 -98.26 gain 222 132 -99.81 gain 132 223 -94.02 gain 223 132 -97.86 gain 132 224 -98.20 gain 224 132 -98.97 gain 133 134 -78.26 gain 134 133 -76.26 gain 133 135 -110.54 gain 135 133 -104.12 gain 133 136 -103.76 gain 136 133 -106.12 gain 133 137 -106.95 gain 137 133 -105.97 gain 133 138 -102.62 gain 138 133 -103.65 gain 133 139 -107.29 gain 139 133 -110.02 gain 133 140 -110.57 gain 140 133 -113.11 gain 133 141 -105.66 gain 141 133 -103.89 gain 133 142 -99.06 gain 142 133 -98.45 gain 133 143 -96.84 gain 143 133 -98.67 gain 133 144 -86.42 gain 144 133 -84.16 gain 133 145 -88.67 gain 145 133 -90.96 gain 133 146 -85.17 gain 146 133 -83.90 gain 133 147 -81.32 gain 147 133 -81.24 gain 133 148 -69.33 gain 148 133 -69.78 gain 133 149 -75.77 gain 149 133 -72.59 gain 133 150 -103.28 gain 150 133 -103.49 gain 133 151 -102.33 gain 151 133 -105.01 gain 133 152 -107.30 gain 152 133 -108.35 gain 133 153 -107.80 gain 153 133 -108.54 gain 133 154 -93.54 gain 154 133 -95.42 gain 133 155 -104.08 gain 155 133 -103.25 gain 133 156 -105.57 gain 156 133 -105.87 gain 133 157 -95.08 gain 157 133 -96.67 gain 133 158 -100.03 gain 158 133 -103.59 gain 133 159 -85.91 gain 159 133 -83.51 gain 133 160 -89.33 gain 160 133 -88.30 gain 133 161 -87.16 gain 161 133 -87.19 gain 133 162 -89.26 gain 162 133 -88.92 gain 133 163 -81.70 gain 163 133 -78.78 gain 133 164 -86.36 gain 164 133 -90.67 gain 133 165 -109.72 gain 165 133 -111.38 gain 133 166 -111.67 gain 166 133 -114.99 gain 133 167 -116.94 gain 167 133 -119.08 gain 133 168 -107.22 gain 168 133 -108.43 gain 133 169 -107.26 gain 169 133 -104.98 gain 133 170 -103.64 gain 170 133 -102.30 gain 133 171 -104.47 gain 171 133 -103.70 gain 133 172 -94.40 gain 172 133 -96.43 gain 133 173 -94.92 gain 173 133 -91.28 gain 133 174 -99.78 gain 174 133 -102.09 gain 133 175 -92.26 gain 175 133 -86.37 gain 133 176 -92.14 gain 176 133 -90.46 gain 133 177 -85.40 gain 177 133 -86.09 gain 133 178 -90.91 gain 178 133 -89.21 gain 133 179 -98.04 gain 179 133 -99.38 gain 133 180 -111.61 gain 180 133 -111.69 gain 133 181 -105.09 gain 181 133 -108.57 gain 133 182 -108.16 gain 182 133 -107.77 gain 133 183 -103.65 gain 183 133 -99.15 gain 133 184 -100.57 gain 184 133 -102.30 gain 133 185 -97.19 gain 185 133 -97.41 gain 133 186 -104.88 gain 186 133 -105.81 gain 133 187 -102.71 gain 187 133 -103.66 gain 133 188 -98.63 gain 188 133 -104.03 gain 133 189 -93.90 gain 189 133 -95.35 gain 133 190 -93.43 gain 190 133 -87.71 gain 133 191 -93.77 gain 191 133 -91.22 gain 133 192 -97.86 gain 192 133 -98.99 gain 133 193 -102.68 gain 193 133 -99.83 gain 133 194 -100.26 gain 194 133 -97.30 gain 133 195 -113.84 gain 195 133 -108.85 gain 133 196 -115.70 gain 196 133 -118.38 gain 133 197 -103.28 gain 197 133 -103.45 gain 133 198 -112.77 gain 198 133 -115.59 gain 133 199 -104.43 gain 199 133 -101.26 gain 133 200 -102.63 gain 200 133 -101.38 gain 133 201 -97.29 gain 201 133 -99.12 gain 133 202 -97.73 gain 202 133 -97.87 gain 133 203 -102.07 gain 203 133 -102.31 gain 133 204 -103.40 gain 204 133 -101.86 gain 133 205 -99.62 gain 205 133 -97.74 gain 133 206 -94.49 gain 206 133 -93.93 gain 133 207 -96.27 gain 207 133 -93.46 gain 133 208 -96.38 gain 208 133 -96.87 gain 133 209 -97.78 gain 209 133 -97.31 gain 133 210 -113.00 gain 210 133 -116.53 gain 133 211 -108.46 gain 211 133 -109.38 gain 133 212 -107.83 gain 212 133 -107.30 gain 133 213 -108.62 gain 213 133 -110.82 gain 133 214 -106.86 gain 214 133 -107.25 gain 133 215 -100.47 gain 215 133 -102.68 gain 133 216 -103.69 gain 216 133 -102.78 gain 133 217 -104.31 gain 217 133 -107.85 gain 133 218 -105.27 gain 218 133 -110.13 gain 133 219 -101.27 gain 219 133 -103.71 gain 133 220 -103.99 gain 220 133 -103.55 gain 133 221 -93.83 gain 221 133 -94.37 gain 133 222 -97.25 gain 222 133 -94.37 gain 133 223 -97.99 gain 223 133 -97.40 gain 133 224 -97.60 gain 224 133 -93.94 gain 134 135 -110.60 gain 135 134 -106.18 gain 134 136 -103.94 gain 136 134 -108.30 gain 134 137 -112.06 gain 137 134 -113.08 gain 134 138 -103.35 gain 138 134 -106.38 gain 134 139 -100.39 gain 139 134 -105.14 gain 134 140 -101.56 gain 140 134 -106.11 gain 134 141 -95.77 gain 141 134 -96.01 gain 134 142 -95.49 gain 142 134 -96.88 gain 134 143 -94.39 gain 143 134 -98.23 gain 134 144 -97.17 gain 144 134 -96.91 gain 134 145 -89.47 gain 145 134 -93.76 gain 134 146 -88.23 gain 146 134 -88.97 gain 134 147 -83.78 gain 147 134 -85.71 gain 134 148 -73.94 gain 148 134 -76.40 gain 134 149 -76.39 gain 149 134 -75.22 gain 134 150 -114.38 gain 150 134 -116.59 gain 134 151 -109.74 gain 151 134 -114.43 gain 134 152 -97.61 gain 152 134 -100.66 gain 134 153 -110.22 gain 153 134 -112.96 gain 134 154 -96.95 gain 154 134 -100.83 gain 134 155 -107.25 gain 155 134 -108.42 gain 134 156 -96.76 gain 156 134 -99.06 gain 134 157 -104.24 gain 157 134 -107.84 gain 134 158 -101.76 gain 158 134 -107.33 gain 134 159 -101.75 gain 159 134 -101.35 gain 134 160 -98.34 gain 160 134 -99.32 gain 134 161 -91.98 gain 161 134 -94.01 gain 134 162 -87.01 gain 162 134 -88.68 gain 134 163 -77.78 gain 163 134 -76.87 gain 134 164 -77.75 gain 164 134 -84.06 gain 134 165 -107.03 gain 165 134 -110.69 gain 134 166 -103.01 gain 166 134 -108.34 gain 134 167 -100.75 gain 167 134 -104.89 gain 134 168 -112.53 gain 168 134 -115.74 gain 134 169 -104.06 gain 169 134 -103.79 gain 134 170 -98.59 gain 170 134 -99.26 gain 134 171 -106.35 gain 171 134 -107.59 gain 134 172 -102.99 gain 172 134 -107.02 gain 134 173 -98.01 gain 173 134 -96.36 gain 134 174 -92.12 gain 174 134 -96.44 gain 134 175 -103.65 gain 175 134 -99.76 gain 134 176 -98.15 gain 176 134 -98.48 gain 134 177 -86.36 gain 177 134 -89.05 gain 134 178 -88.84 gain 178 134 -89.14 gain 134 179 -94.22 gain 179 134 -97.57 gain 134 180 -105.92 gain 180 134 -108.00 gain 134 181 -111.47 gain 181 134 -116.96 gain 134 182 -101.70 gain 182 134 -103.32 gain 134 183 -101.59 gain 183 134 -99.09 gain 134 184 -96.79 gain 184 134 -100.52 gain 134 185 -108.53 gain 185 134 -110.76 gain 134 186 -96.08 gain 186 134 -99.01 gain 134 187 -100.86 gain 187 134 -103.81 gain 134 188 -107.07 gain 188 134 -114.47 gain 134 189 -104.20 gain 189 134 -107.65 gain 134 190 -93.90 gain 190 134 -90.19 gain 134 191 -102.58 gain 191 134 -102.04 gain 134 192 -99.70 gain 192 134 -102.83 gain 134 193 -89.27 gain 193 134 -88.43 gain 134 194 -89.91 gain 194 134 -88.95 gain 134 195 -103.24 gain 195 134 -100.25 gain 134 196 -114.43 gain 196 134 -119.12 gain 134 197 -109.94 gain 197 134 -112.11 gain 134 198 -106.48 gain 198 134 -111.30 gain 134 199 -110.86 gain 199 134 -109.69 gain 134 200 -104.92 gain 200 134 -105.67 gain 134 201 -100.12 gain 201 134 -103.96 gain 134 202 -98.51 gain 202 134 -100.64 gain 134 203 -101.06 gain 203 134 -103.29 gain 134 204 -95.53 gain 204 134 -95.99 gain 134 205 -98.62 gain 205 134 -98.75 gain 134 206 -93.76 gain 206 134 -95.20 gain 134 207 -95.64 gain 207 134 -94.83 gain 134 208 -95.33 gain 208 134 -97.82 gain 134 209 -93.84 gain 209 134 -95.37 gain 134 210 -100.57 gain 210 134 -106.10 gain 134 211 -111.21 gain 211 134 -114.13 gain 134 212 -110.28 gain 212 134 -111.75 gain 134 213 -107.11 gain 213 134 -111.32 gain 134 214 -105.04 gain 214 134 -107.44 gain 134 215 -103.65 gain 215 134 -107.86 gain 134 216 -104.71 gain 216 134 -105.81 gain 134 217 -102.81 gain 217 134 -108.36 gain 134 218 -101.33 gain 218 134 -108.20 gain 134 219 -103.89 gain 219 134 -108.33 gain 134 220 -96.99 gain 220 134 -98.54 gain 134 221 -100.11 gain 221 134 -102.66 gain 134 222 -96.33 gain 222 134 -95.45 gain 134 223 -92.63 gain 223 134 -94.05 gain 134 224 -99.93 gain 224 134 -98.27 gain 135 136 -62.84 gain 136 135 -71.62 gain 135 137 -81.40 gain 137 135 -86.84 gain 135 138 -86.76 gain 138 135 -94.21 gain 135 139 -87.78 gain 139 135 -96.93 gain 135 140 -93.81 gain 140 135 -102.77 gain 135 141 -93.12 gain 141 135 -97.77 gain 135 142 -87.02 gain 142 135 -92.82 gain 135 143 -98.59 gain 143 135 -106.85 gain 135 144 -97.04 gain 144 135 -101.19 gain 135 145 -102.14 gain 145 135 -110.85 gain 135 146 -102.94 gain 146 135 -108.09 gain 135 147 -106.83 gain 147 135 -113.17 gain 135 148 -99.55 gain 148 135 -106.42 gain 135 149 -107.85 gain 149 135 -111.09 gain 135 150 -69.97 gain 150 135 -76.60 gain 135 151 -78.92 gain 151 135 -88.03 gain 135 152 -85.76 gain 152 135 -93.22 gain 135 153 -81.59 gain 153 135 -88.75 gain 135 154 -86.11 gain 154 135 -94.40 gain 135 155 -87.96 gain 155 135 -93.54 gain 135 156 -103.67 gain 156 135 -110.38 gain 135 157 -86.08 gain 157 135 -94.09 gain 135 158 -88.01 gain 158 135 -97.99 gain 135 159 -95.54 gain 159 135 -99.56 gain 135 160 -102.14 gain 160 135 -107.54 gain 135 161 -100.15 gain 161 135 -106.60 gain 135 162 -95.73 gain 162 135 -101.80 gain 135 163 -107.66 gain 163 135 -111.16 gain 135 164 -99.23 gain 164 135 -109.95 gain 135 165 -77.06 gain 165 135 -85.14 gain 135 166 -77.82 gain 166 135 -87.56 gain 135 167 -84.64 gain 167 135 -93.20 gain 135 168 -85.54 gain 168 135 -93.17 gain 135 169 -89.00 gain 169 135 -93.14 gain 135 170 -93.37 gain 170 135 -98.45 gain 135 171 -100.46 gain 171 135 -106.11 gain 135 172 -96.78 gain 172 135 -105.22 gain 135 173 -99.17 gain 173 135 -101.94 gain 135 174 -98.91 gain 174 135 -107.63 gain 135 175 -96.40 gain 175 135 -96.92 gain 135 176 -102.05 gain 176 135 -106.79 gain 135 177 -101.65 gain 177 135 -108.76 gain 135 178 -103.23 gain 178 135 -107.95 gain 135 179 -100.59 gain 179 135 -108.35 gain 135 180 -85.52 gain 180 135 -92.02 gain 135 181 -79.72 gain 181 135 -89.61 gain 135 182 -80.72 gain 182 135 -86.75 gain 135 183 -84.94 gain 183 135 -86.85 gain 135 184 -91.32 gain 184 135 -99.46 gain 135 185 -92.47 gain 185 135 -99.11 gain 135 186 -94.49 gain 186 135 -101.83 gain 135 187 -90.90 gain 187 135 -98.27 gain 135 188 -94.19 gain 188 135 -105.99 gain 135 189 -96.01 gain 189 135 -103.88 gain 135 190 -98.85 gain 190 135 -99.55 gain 135 191 -97.77 gain 191 135 -101.64 gain 135 192 -104.51 gain 192 135 -112.05 gain 135 193 -95.83 gain 193 135 -99.39 gain 135 194 -101.70 gain 194 135 -105.15 gain 135 195 -93.53 gain 195 135 -94.95 gain 135 196 -93.25 gain 196 135 -102.35 gain 135 197 -83.73 gain 197 135 -90.32 gain 135 198 -89.59 gain 198 135 -98.82 gain 135 199 -95.32 gain 199 135 -98.56 gain 135 200 -90.60 gain 200 135 -95.77 gain 135 201 -98.61 gain 201 135 -106.86 gain 135 202 -94.77 gain 202 135 -101.32 gain 135 203 -97.69 gain 203 135 -104.34 gain 135 204 -100.01 gain 204 135 -104.87 gain 135 205 -95.99 gain 205 135 -100.52 gain 135 206 -101.28 gain 206 135 -107.14 gain 135 207 -100.53 gain 207 135 -104.13 gain 135 208 -102.49 gain 208 135 -109.39 gain 135 209 -104.54 gain 209 135 -110.48 gain 135 210 -89.24 gain 210 135 -99.18 gain 135 211 -89.19 gain 211 135 -96.52 gain 135 212 -94.20 gain 212 135 -100.08 gain 135 213 -85.37 gain 213 135 -93.99 gain 135 214 -93.04 gain 214 135 -99.84 gain 135 215 -101.58 gain 215 135 -110.20 gain 135 216 -93.49 gain 216 135 -99.00 gain 135 217 -103.23 gain 217 135 -113.20 gain 135 218 -103.78 gain 218 135 -115.06 gain 135 219 -97.95 gain 219 135 -106.80 gain 135 220 -103.68 gain 220 135 -109.65 gain 135 221 -97.27 gain 221 135 -104.23 gain 135 222 -106.69 gain 222 135 -110.23 gain 135 223 -100.09 gain 223 135 -105.92 gain 135 224 -108.19 gain 224 135 -110.95 gain 136 137 -77.10 gain 137 136 -73.76 gain 136 138 -94.21 gain 138 136 -92.88 gain 136 139 -90.78 gain 139 136 -91.16 gain 136 140 -92.98 gain 140 136 -93.17 gain 136 141 -92.74 gain 141 136 -88.61 gain 136 142 -106.68 gain 142 136 -103.71 gain 136 143 -109.40 gain 143 136 -108.88 gain 136 144 -105.38 gain 144 136 -100.76 gain 136 145 -107.48 gain 145 136 -107.41 gain 136 146 -110.68 gain 146 136 -107.05 gain 136 147 -105.45 gain 147 136 -103.02 gain 136 148 -103.45 gain 148 136 -101.54 gain 136 149 -114.26 gain 149 136 -108.72 gain 136 150 -83.58 gain 150 136 -81.43 gain 136 151 -75.65 gain 151 136 -75.98 gain 136 152 -79.31 gain 152 136 -78.00 gain 136 153 -87.07 gain 153 136 -85.46 gain 136 154 -96.34 gain 154 136 -95.86 gain 136 155 -108.43 gain 155 136 -105.25 gain 136 156 -96.55 gain 156 136 -94.49 gain 136 157 -100.09 gain 157 136 -99.33 gain 136 158 -107.06 gain 158 136 -108.26 gain 136 159 -105.56 gain 159 136 -100.80 gain 136 160 -111.51 gain 160 136 -108.12 gain 136 161 -106.18 gain 161 136 -103.85 gain 136 162 -104.48 gain 162 136 -101.78 gain 136 163 -115.05 gain 163 136 -109.77 gain 136 164 -110.33 gain 164 136 -112.28 gain 136 165 -91.03 gain 165 136 -90.33 gain 136 166 -85.95 gain 166 136 -86.91 gain 136 167 -84.34 gain 167 136 -84.13 gain 136 168 -87.53 gain 168 136 -86.39 gain 136 169 -91.37 gain 169 136 -86.73 gain 136 170 -98.91 gain 170 136 -95.21 gain 136 171 -101.12 gain 171 136 -97.99 gain 136 172 -99.95 gain 172 136 -99.62 gain 136 173 -106.10 gain 173 136 -100.10 gain 136 174 -100.93 gain 174 136 -100.88 gain 136 175 -104.18 gain 175 136 -95.93 gain 136 176 -106.77 gain 176 136 -102.74 gain 136 177 -108.26 gain 177 136 -106.59 gain 136 178 -115.08 gain 178 136 -111.02 gain 136 179 -118.63 gain 179 136 -117.62 gain 136 180 -96.17 gain 180 136 -93.89 gain 136 181 -90.19 gain 181 136 -91.31 gain 136 182 -94.86 gain 182 136 -92.11 gain 136 183 -86.94 gain 183 136 -80.08 gain 136 184 -100.96 gain 184 136 -100.32 gain 136 185 -91.54 gain 185 136 -89.41 gain 136 186 -97.20 gain 186 136 -95.76 gain 136 187 -102.90 gain 187 136 -101.49 gain 136 188 -107.89 gain 188 136 -110.92 gain 136 189 -102.04 gain 189 136 -101.13 gain 136 190 -110.25 gain 190 136 -102.17 gain 136 191 -108.10 gain 191 136 -103.20 gain 136 192 -105.53 gain 192 136 -104.30 gain 136 193 -106.82 gain 193 136 -101.62 gain 136 194 -111.20 gain 194 136 -105.88 gain 136 195 -92.64 gain 195 136 -85.29 gain 136 196 -97.72 gain 196 136 -98.05 gain 136 197 -100.48 gain 197 136 -98.30 gain 136 198 -93.38 gain 198 136 -93.84 gain 136 199 -95.84 gain 199 136 -90.31 gain 136 200 -105.74 gain 200 136 -102.12 gain 136 201 -104.12 gain 201 136 -103.59 gain 136 202 -101.15 gain 202 136 -98.93 gain 136 203 -104.62 gain 203 136 -102.49 gain 136 204 -108.01 gain 204 136 -104.11 gain 136 205 -104.14 gain 205 136 -99.90 gain 136 206 -109.03 gain 206 136 -106.11 gain 136 207 -112.81 gain 207 136 -107.64 gain 136 208 -113.72 gain 208 136 -111.85 gain 136 209 -111.74 gain 209 136 -108.90 gain 136 210 -96.98 gain 210 136 -98.15 gain 136 211 -90.00 gain 211 136 -88.56 gain 136 212 -106.44 gain 212 136 -103.55 gain 136 213 -104.59 gain 213 136 -104.44 gain 136 214 -101.92 gain 214 136 -99.95 gain 136 215 -100.54 gain 215 136 -100.39 gain 136 216 -97.77 gain 216 136 -94.51 gain 136 217 -102.09 gain 217 136 -103.28 gain 136 218 -102.24 gain 218 136 -104.74 gain 136 219 -105.65 gain 219 136 -105.73 gain 136 220 -112.71 gain 220 136 -109.90 gain 136 221 -109.58 gain 221 136 -107.76 gain 136 222 -117.92 gain 222 136 -112.69 gain 136 223 -115.03 gain 223 136 -112.09 gain 136 224 -111.68 gain 224 136 -105.66 gain 137 138 -80.54 gain 138 137 -82.55 gain 137 139 -92.43 gain 139 137 -96.15 gain 137 140 -92.50 gain 140 137 -96.02 gain 137 141 -93.99 gain 141 137 -93.21 gain 137 142 -98.53 gain 142 137 -98.89 gain 137 143 -93.71 gain 143 137 -96.53 gain 137 144 -95.06 gain 144 137 -93.78 gain 137 145 -98.14 gain 145 137 -101.41 gain 137 146 -101.44 gain 146 137 -101.15 gain 137 147 -107.68 gain 147 137 -108.59 gain 137 148 -105.00 gain 148 137 -106.43 gain 137 149 -105.71 gain 149 137 -103.51 gain 137 150 -89.15 gain 150 137 -90.34 gain 137 151 -79.04 gain 151 137 -82.71 gain 137 152 -82.97 gain 152 137 -85.00 gain 137 153 -76.57 gain 153 137 -78.29 gain 137 154 -89.09 gain 154 137 -91.94 gain 137 155 -83.95 gain 155 137 -84.10 gain 137 156 -93.89 gain 156 137 -95.17 gain 137 157 -98.15 gain 157 137 -100.73 gain 137 158 -93.57 gain 158 137 -98.11 gain 137 159 -107.93 gain 159 137 -106.51 gain 137 160 -100.61 gain 160 137 -100.56 gain 137 161 -94.37 gain 161 137 -95.38 gain 137 162 -101.84 gain 162 137 -102.48 gain 137 163 -104.40 gain 163 137 -102.46 gain 137 164 -108.40 gain 164 137 -113.69 gain 137 165 -90.64 gain 165 137 -93.29 gain 137 166 -84.00 gain 166 137 -88.30 gain 137 167 -85.48 gain 167 137 -88.61 gain 137 168 -85.73 gain 168 137 -87.92 gain 137 169 -86.57 gain 169 137 -85.27 gain 137 170 -94.45 gain 170 137 -94.10 gain 137 171 -98.66 gain 171 137 -98.88 gain 137 172 -96.26 gain 172 137 -99.27 gain 137 173 -95.04 gain 173 137 -92.37 gain 137 174 -101.00 gain 174 137 -104.29 gain 137 175 -101.74 gain 175 137 -96.83 gain 137 176 -104.01 gain 176 137 -103.32 gain 137 177 -106.91 gain 177 137 -108.59 gain 137 178 -109.20 gain 178 137 -108.48 gain 137 179 -108.73 gain 179 137 -111.05 gain 137 180 -88.57 gain 180 137 -89.64 gain 137 181 -80.57 gain 181 137 -85.03 gain 137 182 -88.13 gain 182 137 -88.72 gain 137 183 -97.59 gain 183 137 -94.06 gain 137 184 -83.57 gain 184 137 -86.28 gain 137 185 -87.04 gain 185 137 -88.25 gain 137 186 -97.00 gain 186 137 -98.90 gain 137 187 -99.02 gain 187 137 -100.95 gain 137 188 -98.75 gain 188 137 -105.13 gain 137 189 -101.89 gain 189 137 -104.32 gain 137 190 -104.82 gain 190 137 -100.08 gain 137 191 -104.82 gain 191 137 -103.26 gain 137 192 -102.17 gain 192 137 -104.28 gain 137 193 -106.52 gain 193 137 -104.65 gain 137 194 -103.54 gain 194 137 -101.57 gain 137 195 -97.02 gain 195 137 -93.01 gain 137 196 -95.26 gain 196 137 -98.92 gain 137 197 -91.42 gain 197 137 -92.57 gain 137 198 -96.41 gain 198 137 -100.21 gain 137 199 -96.38 gain 199 137 -94.19 gain 137 200 -97.95 gain 200 137 -97.68 gain 137 201 -104.14 gain 201 137 -106.96 gain 137 202 -97.66 gain 202 137 -98.77 gain 137 203 -96.80 gain 203 137 -98.01 gain 137 204 -100.42 gain 204 137 -99.85 gain 137 205 -105.16 gain 205 137 -104.26 gain 137 206 -108.19 gain 206 137 -108.62 gain 137 207 -108.13 gain 207 137 -106.30 gain 137 208 -105.39 gain 208 137 -106.86 gain 137 209 -108.13 gain 209 137 -108.64 gain 137 210 -88.25 gain 210 137 -92.76 gain 137 211 -94.21 gain 211 137 -96.11 gain 137 212 -95.94 gain 212 137 -96.39 gain 137 213 -99.30 gain 213 137 -102.49 gain 137 214 -98.67 gain 214 137 -100.04 gain 137 215 -90.49 gain 215 137 -93.68 gain 137 216 -93.82 gain 216 137 -93.90 gain 137 217 -102.11 gain 217 137 -106.64 gain 137 218 -102.64 gain 218 137 -108.49 gain 137 219 -100.68 gain 219 137 -104.10 gain 137 220 -112.16 gain 220 137 -112.69 gain 137 221 -109.36 gain 221 137 -110.89 gain 137 222 -109.53 gain 222 137 -107.64 gain 137 223 -107.44 gain 223 137 -107.83 gain 137 224 -99.76 gain 224 137 -97.09 gain 138 139 -78.74 gain 139 138 -80.45 gain 138 140 -87.54 gain 140 138 -89.06 gain 138 141 -85.48 gain 141 138 -82.68 gain 138 142 -92.79 gain 142 138 -91.15 gain 138 143 -99.20 gain 143 138 -100.01 gain 138 144 -98.16 gain 144 138 -94.87 gain 138 145 -96.46 gain 145 138 -97.72 gain 138 146 -104.36 gain 146 138 -102.06 gain 138 147 -101.74 gain 147 138 -100.63 gain 138 148 -105.15 gain 148 138 -104.57 gain 138 149 -109.60 gain 149 138 -105.39 gain 138 150 -100.70 gain 150 138 -99.87 gain 138 151 -89.65 gain 151 138 -91.30 gain 138 152 -81.96 gain 152 138 -81.97 gain 138 153 -71.10 gain 153 138 -70.81 gain 138 154 -80.05 gain 154 138 -80.89 gain 138 155 -88.10 gain 155 138 -86.24 gain 138 156 -84.75 gain 156 138 -84.01 gain 138 157 -100.79 gain 157 138 -101.35 gain 138 158 -99.52 gain 158 138 -102.05 gain 138 159 -96.98 gain 159 138 -93.54 gain 138 160 -101.59 gain 160 138 -99.54 gain 138 161 -101.19 gain 161 138 -100.19 gain 138 162 -106.70 gain 162 138 -105.33 gain 138 163 -103.29 gain 163 138 -99.34 gain 138 164 -112.90 gain 164 138 -116.17 gain 138 165 -87.89 gain 165 138 -88.52 gain 138 166 -95.18 gain 166 138 -97.46 gain 138 167 -81.79 gain 167 138 -82.90 gain 138 168 -84.73 gain 168 138 -84.91 gain 138 169 -84.69 gain 169 138 -81.38 gain 138 170 -85.27 gain 170 138 -82.91 gain 138 171 -96.16 gain 171 138 -94.36 gain 138 172 -90.58 gain 172 138 -91.58 gain 138 173 -93.76 gain 173 138 -89.08 gain 138 174 -100.79 gain 174 138 -102.07 gain 138 175 -101.21 gain 175 138 -94.28 gain 138 176 -100.83 gain 176 138 -98.13 gain 138 177 -106.90 gain 177 138 -106.56 gain 138 178 -107.82 gain 178 138 -105.08 gain 138 179 -110.00 gain 179 138 -110.31 gain 138 180 -99.19 gain 180 138 -98.23 gain 138 181 -93.88 gain 181 138 -96.32 gain 138 182 -92.15 gain 182 138 -90.73 gain 138 183 -88.76 gain 183 138 -83.23 gain 138 184 -86.68 gain 184 138 -87.37 gain 138 185 -89.90 gain 185 138 -89.10 gain 138 186 -93.03 gain 186 138 -92.92 gain 138 187 -95.72 gain 187 138 -95.63 gain 138 188 -101.48 gain 188 138 -105.84 gain 138 189 -95.84 gain 189 138 -96.26 gain 138 190 -96.20 gain 190 138 -89.45 gain 138 191 -104.03 gain 191 138 -100.45 gain 138 192 -106.00 gain 192 138 -106.10 gain 138 193 -112.13 gain 193 138 -108.25 gain 138 194 -112.16 gain 194 138 -108.17 gain 138 195 -89.10 gain 195 138 -83.08 gain 138 196 -100.43 gain 196 138 -102.08 gain 138 197 -94.76 gain 197 138 -93.90 gain 138 198 -96.23 gain 198 138 -98.01 gain 138 199 -89.43 gain 199 138 -85.22 gain 138 200 -98.92 gain 200 138 -96.64 gain 138 201 -103.89 gain 201 138 -104.70 gain 138 202 -102.68 gain 202 138 -101.78 gain 138 203 -97.42 gain 203 138 -96.62 gain 138 204 -98.33 gain 204 138 -95.75 gain 138 205 -97.64 gain 205 138 -94.72 gain 138 206 -112.24 gain 206 138 -110.65 gain 138 207 -106.90 gain 207 138 -103.06 gain 138 208 -111.36 gain 208 138 -110.82 gain 138 209 -104.71 gain 209 138 -103.21 gain 138 210 -103.25 gain 210 138 -105.75 gain 138 211 -99.52 gain 211 138 -99.41 gain 138 212 -97.13 gain 212 138 -95.56 gain 138 213 -95.13 gain 213 138 -96.31 gain 138 214 -99.35 gain 214 138 -98.70 gain 138 215 -100.64 gain 215 138 -101.82 gain 138 216 -93.86 gain 216 138 -91.92 gain 138 217 -100.98 gain 217 138 -103.49 gain 138 218 -103.73 gain 218 138 -107.56 gain 138 219 -100.25 gain 219 138 -101.65 gain 138 220 -107.82 gain 220 138 -106.34 gain 138 221 -108.58 gain 221 138 -108.09 gain 138 222 -107.38 gain 222 138 -103.47 gain 138 223 -111.24 gain 223 138 -109.62 gain 138 224 -111.04 gain 224 138 -106.35 gain 139 140 -83.16 gain 140 139 -82.97 gain 139 141 -86.33 gain 141 139 -81.83 gain 139 142 -91.21 gain 142 139 -87.85 gain 139 143 -93.05 gain 143 139 -92.14 gain 139 144 -96.54 gain 144 139 -91.53 gain 139 145 -109.85 gain 145 139 -109.40 gain 139 146 -109.34 gain 146 139 -105.33 gain 139 147 -107.01 gain 147 139 -104.20 gain 139 148 -108.93 gain 148 139 -106.64 gain 139 149 -106.03 gain 149 139 -100.12 gain 139 150 -95.80 gain 150 139 -93.27 gain 139 151 -88.95 gain 151 139 -88.90 gain 139 152 -87.55 gain 152 139 -85.86 gain 139 153 -78.07 gain 153 139 -76.07 gain 139 154 -81.89 gain 154 139 -81.02 gain 139 155 -87.50 gain 155 139 -83.93 gain 139 156 -96.15 gain 156 139 -93.70 gain 139 157 -97.86 gain 157 139 -96.71 gain 139 158 -97.64 gain 158 139 -98.46 gain 139 159 -98.92 gain 159 139 -93.78 gain 139 160 -102.85 gain 160 139 -99.09 gain 139 161 -106.47 gain 161 139 -103.76 gain 139 162 -100.03 gain 162 139 -96.95 gain 139 163 -107.30 gain 163 139 -101.65 gain 139 164 -99.90 gain 164 139 -101.47 gain 139 165 -93.45 gain 165 139 -92.37 gain 139 166 -97.78 gain 166 139 -98.36 gain 139 167 -95.14 gain 167 139 -94.54 gain 139 168 -91.31 gain 168 139 -89.78 gain 139 169 -90.43 gain 169 139 -85.41 gain 139 170 -90.95 gain 170 139 -86.88 gain 139 171 -89.42 gain 171 139 -85.92 gain 139 172 -99.18 gain 172 139 -98.47 gain 139 173 -107.20 gain 173 139 -100.81 gain 139 174 -99.41 gain 174 139 -98.98 gain 139 175 -103.97 gain 175 139 -95.34 gain 139 176 -98.17 gain 176 139 -93.75 gain 139 177 -102.00 gain 177 139 -99.95 gain 139 178 -107.57 gain 178 139 -103.12 gain 139 179 -108.53 gain 179 139 -107.14 gain 139 180 -100.49 gain 180 139 -97.83 gain 139 181 -106.49 gain 181 139 -107.23 gain 139 182 -99.96 gain 182 139 -96.83 gain 139 183 -94.16 gain 183 139 -86.92 gain 139 184 -91.70 gain 184 139 -90.69 gain 139 185 -90.02 gain 185 139 -87.50 gain 139 186 -93.25 gain 186 139 -91.44 gain 139 187 -102.39 gain 187 139 -100.60 gain 139 188 -98.63 gain 188 139 -101.29 gain 139 189 -101.43 gain 189 139 -100.14 gain 139 190 -98.41 gain 190 139 -89.95 gain 139 191 -98.19 gain 191 139 -92.90 gain 139 192 -104.91 gain 192 139 -103.30 gain 139 193 -107.31 gain 193 139 -101.73 gain 139 194 -106.80 gain 194 139 -101.10 gain 139 195 -100.83 gain 195 139 -93.10 gain 139 196 -104.01 gain 196 139 -103.95 gain 139 197 -98.79 gain 197 139 -96.23 gain 139 198 -97.12 gain 198 139 -97.20 gain 139 199 -97.72 gain 199 139 -91.82 gain 139 200 -95.66 gain 200 139 -91.67 gain 139 201 -102.65 gain 201 139 -101.75 gain 139 202 -97.50 gain 202 139 -94.90 gain 139 203 -98.46 gain 203 139 -95.95 gain 139 204 -98.37 gain 204 139 -94.09 gain 139 205 -101.32 gain 205 139 -96.70 gain 139 206 -112.20 gain 206 139 -108.90 gain 139 207 -104.87 gain 207 139 -99.32 gain 139 208 -115.12 gain 208 139 -112.87 gain 139 209 -108.50 gain 209 139 -105.29 gain 139 210 -106.20 gain 210 139 -106.99 gain 139 211 -105.58 gain 211 139 -103.76 gain 139 212 -103.39 gain 212 139 -100.12 gain 139 213 -104.27 gain 213 139 -103.74 gain 139 214 -107.14 gain 214 139 -104.79 gain 139 215 -98.17 gain 215 139 -97.63 gain 139 216 -97.79 gain 216 139 -94.14 gain 139 217 -98.62 gain 217 139 -99.43 gain 139 218 -97.17 gain 218 139 -99.30 gain 139 219 -100.48 gain 219 139 -100.18 gain 139 220 -108.25 gain 220 139 -105.06 gain 139 221 -103.06 gain 221 139 -100.86 gain 139 222 -110.20 gain 222 139 -104.59 gain 139 223 -102.77 gain 223 139 -99.44 gain 139 224 -102.24 gain 224 139 -95.84 gain 140 141 -76.23 gain 141 140 -71.92 gain 140 142 -88.32 gain 142 140 -85.16 gain 140 143 -91.48 gain 143 140 -90.77 gain 140 144 -99.75 gain 144 140 -94.94 gain 140 145 -98.49 gain 145 140 -98.23 gain 140 146 -109.72 gain 146 140 -105.90 gain 140 147 -106.77 gain 147 140 -104.15 gain 140 148 -105.86 gain 148 140 -103.76 gain 140 149 -104.42 gain 149 140 -98.70 gain 140 150 -96.46 gain 150 140 -94.13 gain 140 151 -93.31 gain 151 140 -93.45 gain 140 152 -101.53 gain 152 140 -100.03 gain 140 153 -79.46 gain 153 140 -77.66 gain 140 154 -85.38 gain 154 140 -84.70 gain 140 155 -80.65 gain 155 140 -77.28 gain 140 156 -84.41 gain 156 140 -82.16 gain 140 157 -92.68 gain 157 140 -91.73 gain 140 158 -92.24 gain 158 140 -93.25 gain 140 159 -94.55 gain 159 140 -89.60 gain 140 160 -96.99 gain 160 140 -93.42 gain 140 161 -94.39 gain 161 140 -91.88 gain 140 162 -97.61 gain 162 140 -94.72 gain 140 163 -98.36 gain 163 140 -92.90 gain 140 164 -107.43 gain 164 140 -109.19 gain 140 165 -103.11 gain 165 140 -102.23 gain 140 166 -89.53 gain 166 140 -90.30 gain 140 167 -98.50 gain 167 140 -98.10 gain 140 168 -92.59 gain 168 140 -91.25 gain 140 169 -90.11 gain 169 140 -85.29 gain 140 170 -76.31 gain 170 140 -72.43 gain 140 171 -93.73 gain 171 140 -90.42 gain 140 172 -88.74 gain 172 140 -88.22 gain 140 173 -96.15 gain 173 140 -89.96 gain 140 174 -95.74 gain 174 140 -95.51 gain 140 175 -101.69 gain 175 140 -93.25 gain 140 176 -102.25 gain 176 140 -98.03 gain 140 177 -103.71 gain 177 140 -101.86 gain 140 178 -107.61 gain 178 140 -103.36 gain 140 179 -110.79 gain 179 140 -109.59 gain 140 180 -103.57 gain 180 140 -101.10 gain 140 181 -93.35 gain 181 140 -94.28 gain 140 182 -101.42 gain 182 140 -98.49 gain 140 183 -89.43 gain 183 140 -82.38 gain 140 184 -89.58 gain 184 140 -88.76 gain 140 185 -93.51 gain 185 140 -91.19 gain 140 186 -91.95 gain 186 140 -90.33 gain 140 187 -95.08 gain 187 140 -93.49 gain 140 188 -104.98 gain 188 140 -107.83 gain 140 189 -96.66 gain 189 140 -95.57 gain 140 190 -105.02 gain 190 140 -96.75 gain 140 191 -105.28 gain 191 140 -100.19 gain 140 192 -112.70 gain 192 140 -111.28 gain 140 193 -101.74 gain 193 140 -96.35 gain 140 194 -110.22 gain 194 140 -104.71 gain 140 195 -98.10 gain 195 140 -90.56 gain 140 196 -95.02 gain 196 140 -95.16 gain 140 197 -95.56 gain 197 140 -93.19 gain 140 198 -95.47 gain 198 140 -95.74 gain 140 199 -95.66 gain 199 140 -89.95 gain 140 200 -90.64 gain 200 140 -86.84 gain 140 201 -96.03 gain 201 140 -95.33 gain 140 202 -101.59 gain 202 140 -99.17 gain 140 203 -102.01 gain 203 140 -99.69 gain 140 204 -101.31 gain 204 140 -97.22 gain 140 205 -108.22 gain 205 140 -103.79 gain 140 206 -99.26 gain 206 140 -96.15 gain 140 207 -106.07 gain 207 140 -100.72 gain 140 208 -107.28 gain 208 140 -105.22 gain 140 209 -107.50 gain 209 140 -104.48 gain 140 210 -98.66 gain 210 140 -99.64 gain 140 211 -101.14 gain 211 140 -99.51 gain 140 212 -101.93 gain 212 140 -98.85 gain 140 213 -93.46 gain 213 140 -93.12 gain 140 214 -101.80 gain 214 140 -99.64 gain 140 215 -93.82 gain 215 140 -93.48 gain 140 216 -103.19 gain 216 140 -99.74 gain 140 217 -101.75 gain 217 140 -102.75 gain 140 218 -105.43 gain 218 140 -107.75 gain 140 219 -101.46 gain 219 140 -101.35 gain 140 220 -106.51 gain 220 140 -103.52 gain 140 221 -101.74 gain 221 140 -99.74 gain 140 222 -112.94 gain 222 140 -107.52 gain 140 223 -105.44 gain 223 140 -102.31 gain 140 224 -106.71 gain 224 140 -100.50 gain 141 142 -82.52 gain 142 141 -83.67 gain 141 143 -81.30 gain 143 141 -84.90 gain 141 144 -84.72 gain 144 141 -84.23 gain 141 145 -94.07 gain 145 141 -98.13 gain 141 146 -91.50 gain 146 141 -91.99 gain 141 147 -100.59 gain 147 141 -102.28 gain 141 148 -98.65 gain 148 141 -100.87 gain 141 149 -100.51 gain 149 141 -99.10 gain 141 150 -102.79 gain 150 141 -104.76 gain 141 151 -92.37 gain 151 141 -96.82 gain 141 152 -89.59 gain 152 141 -92.40 gain 141 153 -89.05 gain 153 141 -91.56 gain 141 154 -85.97 gain 154 141 -89.61 gain 141 155 -85.00 gain 155 141 -85.94 gain 141 156 -75.94 gain 156 141 -78.01 gain 141 157 -79.00 gain 157 141 -82.35 gain 141 158 -88.51 gain 158 141 -93.83 gain 141 159 -91.44 gain 159 141 -90.80 gain 141 160 -92.19 gain 160 141 -92.93 gain 141 161 -93.86 gain 161 141 -95.65 gain 141 162 -96.51 gain 162 141 -97.93 gain 141 163 -97.34 gain 163 141 -96.18 gain 141 164 -105.57 gain 164 141 -111.65 gain 141 165 -97.29 gain 165 141 -100.72 gain 141 166 -94.00 gain 166 141 -99.09 gain 141 167 -93.22 gain 167 141 -97.13 gain 141 168 -94.53 gain 168 141 -97.51 gain 141 169 -89.07 gain 169 141 -88.56 gain 141 170 -79.95 gain 170 141 -80.38 gain 141 171 -77.33 gain 171 141 -78.33 gain 141 172 -82.13 gain 172 141 -85.92 gain 141 173 -84.57 gain 173 141 -82.69 gain 141 174 -88.69 gain 174 141 -92.76 gain 141 175 -92.04 gain 175 141 -87.91 gain 141 176 -91.35 gain 176 141 -91.44 gain 141 177 -103.41 gain 177 141 -105.87 gain 141 178 -96.23 gain 178 141 -96.29 gain 141 179 -96.78 gain 179 141 -99.88 gain 141 180 -95.23 gain 180 141 -97.08 gain 141 181 -100.16 gain 181 141 -105.40 gain 141 182 -92.62 gain 182 141 -94.00 gain 141 183 -94.88 gain 183 141 -92.14 gain 141 184 -88.59 gain 184 141 -92.08 gain 141 185 -95.41 gain 185 141 -97.40 gain 141 186 -90.44 gain 186 141 -93.13 gain 141 187 -89.11 gain 187 141 -91.83 gain 141 188 -94.91 gain 188 141 -102.06 gain 141 189 -96.32 gain 189 141 -99.54 gain 141 190 -99.22 gain 190 141 -95.27 gain 141 191 -100.96 gain 191 141 -100.19 gain 141 192 -104.57 gain 192 141 -107.46 gain 141 193 -97.66 gain 193 141 -96.58 gain 141 194 -94.82 gain 194 141 -93.63 gain 141 195 -89.19 gain 195 141 -85.97 gain 141 196 -102.94 gain 196 141 -107.39 gain 141 197 -94.63 gain 197 141 -96.57 gain 141 198 -93.16 gain 198 141 -97.74 gain 141 199 -90.38 gain 199 141 -88.98 gain 141 200 -95.12 gain 200 141 -95.63 gain 141 201 -89.47 gain 201 141 -93.08 gain 141 202 -87.08 gain 202 141 -88.98 gain 141 203 -94.94 gain 203 141 -96.93 gain 141 204 -95.95 gain 204 141 -96.17 gain 141 205 -92.73 gain 205 141 -92.61 gain 141 206 -104.93 gain 206 141 -106.14 gain 141 207 -98.93 gain 207 141 -97.88 gain 141 208 -102.69 gain 208 141 -104.95 gain 141 209 -103.59 gain 209 141 -104.88 gain 141 210 -96.69 gain 210 141 -101.98 gain 141 211 -97.41 gain 211 141 -100.10 gain 141 212 -100.74 gain 212 141 -101.97 gain 141 213 -100.14 gain 213 141 -104.11 gain 141 214 -97.28 gain 214 141 -99.44 gain 141 215 -92.93 gain 215 141 -96.89 gain 141 216 -91.12 gain 216 141 -91.98 gain 141 217 -94.56 gain 217 141 -99.87 gain 141 218 -99.07 gain 218 141 -105.70 gain 141 219 -101.68 gain 219 141 -105.89 gain 141 220 -91.23 gain 220 141 -92.55 gain 141 221 -100.10 gain 221 141 -102.40 gain 141 222 -104.56 gain 222 141 -103.45 gain 141 223 -105.68 gain 223 141 -106.86 gain 141 224 -101.94 gain 224 141 -100.05 gain 142 143 -83.47 gain 143 142 -85.92 gain 142 144 -89.11 gain 144 142 -87.46 gain 142 145 -88.51 gain 145 142 -91.41 gain 142 146 -90.83 gain 146 142 -90.18 gain 142 147 -91.83 gain 147 142 -92.37 gain 142 148 -100.85 gain 148 142 -101.91 gain 142 149 -97.54 gain 149 142 -94.98 gain 142 150 -98.29 gain 150 142 -99.11 gain 142 151 -95.37 gain 151 142 -98.67 gain 142 152 -95.29 gain 152 142 -96.95 gain 142 153 -95.54 gain 153 142 -96.90 gain 142 154 -92.84 gain 154 142 -95.32 gain 142 155 -89.27 gain 155 142 -89.05 gain 142 156 -80.13 gain 156 142 -81.04 gain 142 157 -69.63 gain 157 142 -71.84 gain 142 158 -87.61 gain 158 142 -91.78 gain 142 159 -89.08 gain 159 142 -87.29 gain 142 160 -85.24 gain 160 142 -84.83 gain 142 161 -94.40 gain 161 142 -95.05 gain 142 162 -98.35 gain 162 142 -98.63 gain 142 163 -93.86 gain 163 142 -91.55 gain 142 164 -101.11 gain 164 142 -106.04 gain 142 165 -102.81 gain 165 142 -105.09 gain 142 166 -101.20 gain 166 142 -105.14 gain 142 167 -97.70 gain 167 142 -100.46 gain 142 168 -97.22 gain 168 142 -99.04 gain 142 169 -89.82 gain 169 142 -88.16 gain 142 170 -86.92 gain 170 142 -86.20 gain 142 171 -84.68 gain 171 142 -84.52 gain 142 172 -82.37 gain 172 142 -85.01 gain 142 173 -76.92 gain 173 142 -73.88 gain 142 174 -87.37 gain 174 142 -90.30 gain 142 175 -92.63 gain 175 142 -87.35 gain 142 176 -94.18 gain 176 142 -93.12 gain 142 177 -92.21 gain 177 142 -93.51 gain 142 178 -98.34 gain 178 142 -97.25 gain 142 179 -96.98 gain 179 142 -98.94 gain 142 180 -106.95 gain 180 142 -107.64 gain 142 181 -103.63 gain 181 142 -107.72 gain 142 182 -106.30 gain 182 142 -106.52 gain 142 183 -100.67 gain 183 142 -96.78 gain 142 184 -97.44 gain 184 142 -99.78 gain 142 185 -95.23 gain 185 142 -96.06 gain 142 186 -97.89 gain 186 142 -99.43 gain 142 187 -83.36 gain 187 142 -84.93 gain 142 188 -92.42 gain 188 142 -98.43 gain 142 189 -92.32 gain 189 142 -94.38 gain 142 190 -90.32 gain 190 142 -85.22 gain 142 191 -91.17 gain 191 142 -89.24 gain 142 192 -99.05 gain 192 142 -100.80 gain 142 193 -103.24 gain 193 142 -101.00 gain 142 194 -104.83 gain 194 142 -102.49 gain 142 195 -99.20 gain 195 142 -94.83 gain 142 196 -109.99 gain 196 142 -113.29 gain 142 197 -98.11 gain 197 142 -98.89 gain 142 198 -94.44 gain 198 142 -97.87 gain 142 199 -92.73 gain 199 142 -90.18 gain 142 200 -102.60 gain 200 142 -101.96 gain 142 201 -88.16 gain 201 142 -90.62 gain 142 202 -97.37 gain 202 142 -98.11 gain 142 203 -92.39 gain 203 142 -93.24 gain 142 204 -87.44 gain 204 142 -86.51 gain 142 205 -95.47 gain 205 142 -94.21 gain 142 206 -101.68 gain 206 142 -101.73 gain 142 207 -98.83 gain 207 142 -96.63 gain 142 208 -100.78 gain 208 142 -101.88 gain 142 209 -105.69 gain 209 142 -105.83 gain 142 210 -101.16 gain 210 142 -105.30 gain 142 211 -105.82 gain 211 142 -107.35 gain 142 212 -97.49 gain 212 142 -97.57 gain 142 213 -101.24 gain 213 142 -104.06 gain 142 214 -93.79 gain 214 142 -94.79 gain 142 215 -92.42 gain 215 142 -95.23 gain 142 216 -97.19 gain 216 142 -96.90 gain 142 217 -93.62 gain 217 142 -97.78 gain 142 218 -101.63 gain 218 142 -107.11 gain 142 219 -88.17 gain 219 142 -91.23 gain 142 220 -95.97 gain 220 142 -96.14 gain 142 221 -109.86 gain 221 142 -111.02 gain 142 222 -102.90 gain 222 142 -100.63 gain 142 223 -100.84 gain 223 142 -100.86 gain 142 224 -106.54 gain 224 142 -103.49 gain 143 144 -71.85 gain 144 143 -67.75 gain 143 145 -92.24 gain 145 143 -92.70 gain 143 146 -91.40 gain 146 143 -88.30 gain 143 147 -92.52 gain 147 143 -90.61 gain 143 148 -100.60 gain 148 143 -99.21 gain 143 149 -102.45 gain 149 143 -97.43 gain 143 150 -106.94 gain 150 143 -105.31 gain 143 151 -100.00 gain 151 143 -100.85 gain 143 152 -96.52 gain 152 143 -95.73 gain 143 153 -101.91 gain 153 143 -100.81 gain 143 154 -102.32 gain 154 143 -102.36 gain 143 155 -91.49 gain 155 143 -88.83 gain 143 156 -88.52 gain 156 143 -86.97 gain 143 157 -78.21 gain 157 143 -77.97 gain 143 158 -77.51 gain 158 143 -79.24 gain 143 159 -82.90 gain 159 143 -78.66 gain 143 160 -89.94 gain 160 143 -87.08 gain 143 161 -94.05 gain 161 143 -92.24 gain 143 162 -95.41 gain 162 143 -93.23 gain 143 163 -94.11 gain 163 143 -89.36 gain 143 164 -100.99 gain 164 143 -103.47 gain 143 165 -107.39 gain 165 143 -107.22 gain 143 166 -103.90 gain 166 143 -105.39 gain 143 167 -96.52 gain 167 143 -96.82 gain 143 168 -100.15 gain 168 143 -99.52 gain 143 169 -98.53 gain 169 143 -94.42 gain 143 170 -88.11 gain 170 143 -84.93 gain 143 171 -86.56 gain 171 143 -83.96 gain 143 172 -88.85 gain 172 143 -89.04 gain 143 173 -85.24 gain 173 143 -79.75 gain 143 174 -90.39 gain 174 143 -90.86 gain 143 175 -87.09 gain 175 143 -79.36 gain 143 176 -96.13 gain 176 143 -92.62 gain 143 177 -96.78 gain 177 143 -95.64 gain 143 178 -99.37 gain 178 143 -95.83 gain 143 179 -105.78 gain 179 143 -105.28 gain 143 180 -105.80 gain 180 143 -104.04 gain 143 181 -99.84 gain 181 143 -101.48 gain 143 182 -108.86 gain 182 143 -106.63 gain 143 183 -104.50 gain 183 143 -98.16 gain 143 184 -97.16 gain 184 143 -97.04 gain 143 185 -97.12 gain 185 143 -95.50 gain 143 186 -100.02 gain 186 143 -99.11 gain 143 187 -94.64 gain 187 143 -93.75 gain 143 188 -94.84 gain 188 143 -98.40 gain 143 189 -94.27 gain 189 143 -93.89 gain 143 190 -90.66 gain 190 143 -83.11 gain 143 191 -95.05 gain 191 143 -90.67 gain 143 192 -102.80 gain 192 143 -102.10 gain 143 193 -101.25 gain 193 143 -96.56 gain 143 194 -95.40 gain 194 143 -90.60 gain 143 195 -108.55 gain 195 143 -101.72 gain 143 196 -108.79 gain 196 143 -109.63 gain 143 197 -105.92 gain 197 143 -104.25 gain 143 198 -99.25 gain 198 143 -100.22 gain 143 199 -109.22 gain 199 143 -104.21 gain 143 200 -99.93 gain 200 143 -96.84 gain 143 201 -103.21 gain 201 143 -103.21 gain 143 202 -96.54 gain 202 143 -94.84 gain 143 203 -98.70 gain 203 143 -97.09 gain 143 204 -101.56 gain 204 143 -98.17 gain 143 205 -98.63 gain 205 143 -94.91 gain 143 206 -97.67 gain 206 143 -95.28 gain 143 207 -96.70 gain 207 143 -92.05 gain 143 208 -103.25 gain 208 143 -101.90 gain 143 209 -104.56 gain 209 143 -102.24 gain 143 210 -103.61 gain 210 143 -105.30 gain 143 211 -102.59 gain 211 143 -101.67 gain 143 212 -105.51 gain 212 143 -103.14 gain 143 213 -109.90 gain 213 143 -110.27 gain 143 214 -99.77 gain 214 143 -98.32 gain 143 215 -101.56 gain 215 143 -101.92 gain 143 216 -99.53 gain 216 143 -96.79 gain 143 217 -96.09 gain 217 143 -97.80 gain 143 218 -97.08 gain 218 143 -100.10 gain 143 219 -100.82 gain 219 143 -101.42 gain 143 220 -99.90 gain 220 143 -97.62 gain 143 221 -105.31 gain 221 143 -104.01 gain 143 222 -94.68 gain 222 143 -89.96 gain 143 223 -106.70 gain 223 143 -104.28 gain 143 224 -101.91 gain 224 143 -96.41 gain 144 145 -70.52 gain 145 144 -75.07 gain 144 146 -87.43 gain 146 144 -88.43 gain 144 147 -84.56 gain 147 144 -86.75 gain 144 148 -89.85 gain 148 144 -92.56 gain 144 149 -98.37 gain 149 144 -97.45 gain 144 150 -103.25 gain 150 144 -105.72 gain 144 151 -89.79 gain 151 144 -94.74 gain 144 152 -92.56 gain 152 144 -95.87 gain 144 153 -94.54 gain 153 144 -97.55 gain 144 154 -93.85 gain 154 144 -97.99 gain 144 155 -87.51 gain 155 144 -88.94 gain 144 156 -92.33 gain 156 144 -94.89 gain 144 157 -78.67 gain 157 144 -82.52 gain 144 158 -82.62 gain 158 144 -88.44 gain 144 159 -83.05 gain 159 144 -82.91 gain 144 160 -82.08 gain 160 144 -83.32 gain 144 161 -85.47 gain 161 144 -87.76 gain 144 162 -83.90 gain 162 144 -85.82 gain 144 163 -82.33 gain 163 144 -81.67 gain 144 164 -91.56 gain 164 144 -98.13 gain 144 165 -99.04 gain 165 144 -102.96 gain 144 166 -88.32 gain 166 144 -93.90 gain 144 167 -97.45 gain 167 144 -101.86 gain 144 168 -86.75 gain 168 144 -90.22 gain 144 169 -90.91 gain 169 144 -90.89 gain 144 170 -100.77 gain 170 144 -101.69 gain 144 171 -87.75 gain 171 144 -89.25 gain 144 172 -89.69 gain 172 144 -93.98 gain 144 173 -74.82 gain 173 144 -73.43 gain 144 174 -78.71 gain 174 144 -83.28 gain 144 175 -79.11 gain 175 144 -75.48 gain 144 176 -92.41 gain 176 144 -93.00 gain 144 177 -88.82 gain 177 144 -91.77 gain 144 178 -91.54 gain 178 144 -92.10 gain 144 179 -95.10 gain 179 144 -98.70 gain 144 180 -98.23 gain 180 144 -100.57 gain 144 181 -109.95 gain 181 144 -115.69 gain 144 182 -106.96 gain 182 144 -108.83 gain 144 183 -99.27 gain 183 144 -97.02 gain 144 184 -93.79 gain 184 144 -97.77 gain 144 185 -90.82 gain 185 144 -93.30 gain 144 186 -95.51 gain 186 144 -98.70 gain 144 187 -87.19 gain 187 144 -90.40 gain 144 188 -89.00 gain 188 144 -96.65 gain 144 189 -88.29 gain 189 144 -92.00 gain 144 190 -88.81 gain 190 144 -85.35 gain 144 191 -91.14 gain 191 144 -90.85 gain 144 192 -89.60 gain 192 144 -92.99 gain 144 193 -97.64 gain 193 144 -97.05 gain 144 194 -96.36 gain 194 144 -95.66 gain 144 195 -105.06 gain 195 144 -102.33 gain 144 196 -97.25 gain 196 144 -102.20 gain 144 197 -95.83 gain 197 144 -98.26 gain 144 198 -101.84 gain 198 144 -106.92 gain 144 199 -97.73 gain 199 144 -96.82 gain 144 200 -99.22 gain 200 144 -100.23 gain 144 201 -99.63 gain 201 144 -103.72 gain 144 202 -89.76 gain 202 144 -92.15 gain 144 203 -89.60 gain 203 144 -92.09 gain 144 204 -88.19 gain 204 144 -88.91 gain 144 205 -90.40 gain 205 144 -90.78 gain 144 206 -91.11 gain 206 144 -92.82 gain 144 207 -92.75 gain 207 144 -92.19 gain 144 208 -97.59 gain 208 144 -100.34 gain 144 209 -96.97 gain 209 144 -98.76 gain 144 210 -107.84 gain 210 144 -113.63 gain 144 211 -101.86 gain 211 144 -105.04 gain 144 212 -103.05 gain 212 144 -104.78 gain 144 213 -102.86 gain 213 144 -107.33 gain 144 214 -98.55 gain 214 144 -101.20 gain 144 215 -105.20 gain 215 144 -109.67 gain 144 216 -95.72 gain 216 144 -97.08 gain 144 217 -102.38 gain 217 144 -108.19 gain 144 218 -97.96 gain 218 144 -105.08 gain 144 219 -88.98 gain 219 144 -93.69 gain 144 220 -95.27 gain 220 144 -97.08 gain 144 221 -96.25 gain 221 144 -99.05 gain 144 222 -94.74 gain 222 144 -94.12 gain 144 223 -99.57 gain 223 144 -101.24 gain 144 224 -101.87 gain 224 144 -100.48 gain 145 146 -72.22 gain 146 145 -68.67 gain 145 147 -92.11 gain 147 145 -89.75 gain 145 148 -90.30 gain 148 145 -88.46 gain 145 149 -91.09 gain 149 145 -85.63 gain 145 150 -105.06 gain 150 145 -102.97 gain 145 151 -106.92 gain 151 145 -107.32 gain 145 152 -108.85 gain 152 145 -107.61 gain 145 153 -106.50 gain 153 145 -104.96 gain 145 154 -104.41 gain 154 145 -104.00 gain 145 155 -101.65 gain 155 145 -98.53 gain 145 156 -97.80 gain 156 145 -95.81 gain 145 157 -90.79 gain 157 145 -90.10 gain 145 158 -95.83 gain 158 145 -97.10 gain 145 159 -75.65 gain 159 145 -70.96 gain 145 160 -79.55 gain 160 145 -76.24 gain 145 161 -92.04 gain 161 145 -89.78 gain 145 162 -93.23 gain 162 145 -90.60 gain 145 163 -88.79 gain 163 145 -83.58 gain 145 164 -99.23 gain 164 145 -101.24 gain 145 165 -100.55 gain 165 145 -99.93 gain 145 166 -106.84 gain 166 145 -107.87 gain 145 167 -108.69 gain 167 145 -108.55 gain 145 168 -103.97 gain 168 145 -102.89 gain 145 169 -98.33 gain 169 145 -93.76 gain 145 170 -104.48 gain 170 145 -100.85 gain 145 171 -99.26 gain 171 145 -96.21 gain 145 172 -94.32 gain 172 145 -94.06 gain 145 173 -92.16 gain 173 145 -86.22 gain 145 174 -91.01 gain 174 145 -91.03 gain 145 175 -94.49 gain 175 145 -86.30 gain 145 176 -85.98 gain 176 145 -82.02 gain 145 177 -95.26 gain 177 145 -93.66 gain 145 178 -98.38 gain 178 145 -94.39 gain 145 179 -97.01 gain 179 145 -96.06 gain 145 180 -100.44 gain 180 145 -98.23 gain 145 181 -102.16 gain 181 145 -103.35 gain 145 182 -105.26 gain 182 145 -102.58 gain 145 183 -105.07 gain 183 145 -98.28 gain 145 184 -102.01 gain 184 145 -101.44 gain 145 185 -104.36 gain 185 145 -102.29 gain 145 186 -96.83 gain 186 145 -95.46 gain 145 187 -92.94 gain 187 145 -91.60 gain 145 188 -89.45 gain 188 145 -92.55 gain 145 189 -91.95 gain 189 145 -91.12 gain 145 190 -87.67 gain 190 145 -79.66 gain 145 191 -95.57 gain 191 145 -90.73 gain 145 192 -97.79 gain 192 145 -96.62 gain 145 193 -92.74 gain 193 145 -87.60 gain 145 194 -101.07 gain 194 145 -95.83 gain 145 195 -109.09 gain 195 145 -101.81 gain 145 196 -111.80 gain 196 145 -112.20 gain 145 197 -101.04 gain 197 145 -98.92 gain 145 198 -105.10 gain 198 145 -105.63 gain 145 199 -106.45 gain 199 145 -100.99 gain 145 200 -99.60 gain 200 145 -96.06 gain 145 201 -105.39 gain 201 145 -104.93 gain 145 202 -102.17 gain 202 145 -100.01 gain 145 203 -105.98 gain 203 145 -103.92 gain 145 204 -95.92 gain 204 145 -92.09 gain 145 205 -98.07 gain 205 145 -93.90 gain 145 206 -96.75 gain 206 145 -93.91 gain 145 207 -97.48 gain 207 145 -92.38 gain 145 208 -100.98 gain 208 145 -99.18 gain 145 209 -96.42 gain 209 145 -93.65 gain 145 210 -107.09 gain 210 145 -108.33 gain 145 211 -111.72 gain 211 145 -110.35 gain 145 212 -111.94 gain 212 145 -109.12 gain 145 213 -107.64 gain 213 145 -107.55 gain 145 214 -108.10 gain 214 145 -106.20 gain 145 215 -110.34 gain 215 145 -110.25 gain 145 216 -106.35 gain 216 145 -103.16 gain 145 217 -105.60 gain 217 145 -106.86 gain 145 218 -104.33 gain 218 145 -106.90 gain 145 219 -101.52 gain 219 145 -101.67 gain 145 220 -103.54 gain 220 145 -100.81 gain 145 221 -97.32 gain 221 145 -95.58 gain 145 222 -95.18 gain 222 145 -90.01 gain 145 223 -102.70 gain 223 145 -99.82 gain 145 224 -96.98 gain 224 145 -91.03 gain 146 147 -77.15 gain 147 146 -78.34 gain 146 148 -90.37 gain 148 146 -92.09 gain 146 149 -95.00 gain 149 146 -93.10 gain 146 150 -105.80 gain 150 146 -107.28 gain 146 151 -106.03 gain 151 146 -109.98 gain 146 152 -103.57 gain 152 146 -105.89 gain 146 153 -104.60 gain 153 146 -106.61 gain 146 154 -93.78 gain 154 146 -96.93 gain 146 155 -102.77 gain 155 146 -103.21 gain 146 156 -93.38 gain 156 146 -94.95 gain 146 157 -87.89 gain 157 146 -90.75 gain 146 158 -84.99 gain 158 146 -89.82 gain 146 159 -83.59 gain 159 146 -82.46 gain 146 160 -76.84 gain 160 146 -77.08 gain 146 161 -70.89 gain 161 146 -72.19 gain 146 162 -76.20 gain 162 146 -77.13 gain 146 163 -88.98 gain 163 146 -87.33 gain 146 164 -86.02 gain 164 146 -91.60 gain 146 165 -108.38 gain 165 146 -111.32 gain 146 166 -97.51 gain 166 146 -102.10 gain 146 167 -105.79 gain 167 146 -109.21 gain 146 168 -98.79 gain 168 146 -101.27 gain 146 169 -102.26 gain 169 146 -101.25 gain 146 170 -99.26 gain 170 146 -99.19 gain 146 171 -99.66 gain 171 146 -100.17 gain 146 172 -88.34 gain 172 146 -91.64 gain 146 173 -95.63 gain 173 146 -93.25 gain 146 174 -87.98 gain 174 146 -91.56 gain 146 175 -83.16 gain 175 146 -78.54 gain 146 176 -81.41 gain 176 146 -81.01 gain 146 177 -80.18 gain 177 146 -82.14 gain 146 178 -95.13 gain 178 146 -94.70 gain 146 179 -96.84 gain 179 146 -99.45 gain 146 180 -103.36 gain 180 146 -104.71 gain 146 181 -110.06 gain 181 146 -114.81 gain 146 182 -110.46 gain 182 146 -111.34 gain 146 183 -91.00 gain 183 146 -87.76 gain 146 184 -103.69 gain 184 146 -106.69 gain 146 185 -100.14 gain 185 146 -101.64 gain 146 186 -100.99 gain 186 146 -103.18 gain 146 187 -94.44 gain 187 146 -96.66 gain 146 188 -90.32 gain 188 146 -96.98 gain 146 189 -96.17 gain 189 146 -98.89 gain 146 190 -92.32 gain 190 146 -87.87 gain 146 191 -92.36 gain 191 146 -91.08 gain 146 192 -85.74 gain 192 146 -88.13 gain 146 193 -89.32 gain 193 146 -87.74 gain 146 194 -95.22 gain 194 146 -93.53 gain 146 195 -106.59 gain 195 146 -102.87 gain 146 196 -103.25 gain 196 146 -107.20 gain 146 197 -108.37 gain 197 146 -109.81 gain 146 198 -107.87 gain 198 146 -111.95 gain 146 199 -106.48 gain 199 146 -104.58 gain 146 200 -99.89 gain 200 146 -99.91 gain 146 201 -98.18 gain 201 146 -101.28 gain 146 202 -97.59 gain 202 146 -99.00 gain 146 203 -98.88 gain 203 146 -100.38 gain 146 204 -85.00 gain 204 146 -84.72 gain 146 205 -93.03 gain 205 146 -92.41 gain 146 206 -85.29 gain 206 146 -86.00 gain 146 207 -94.67 gain 207 146 -93.13 gain 146 208 -96.42 gain 208 146 -98.18 gain 146 209 -92.38 gain 209 146 -93.17 gain 146 210 -108.18 gain 210 146 -112.97 gain 146 211 -104.96 gain 211 146 -107.14 gain 146 212 -104.69 gain 212 146 -105.42 gain 146 213 -95.54 gain 213 146 -99.01 gain 146 214 -100.68 gain 214 146 -102.34 gain 146 215 -105.55 gain 215 146 -109.03 gain 146 216 -97.70 gain 216 146 -98.06 gain 146 217 -92.12 gain 217 146 -96.94 gain 146 218 -97.17 gain 218 146 -103.30 gain 146 219 -105.32 gain 219 146 -109.02 gain 146 220 -88.88 gain 220 146 -89.70 gain 146 221 -99.52 gain 221 146 -101.33 gain 146 222 -96.37 gain 222 146 -94.76 gain 146 223 -102.13 gain 223 146 -102.81 gain 146 224 -95.80 gain 224 146 -93.41 gain 147 148 -73.93 gain 148 147 -74.45 gain 147 149 -82.87 gain 149 147 -79.77 gain 147 150 -106.66 gain 150 147 -106.94 gain 147 151 -106.97 gain 151 147 -109.73 gain 147 152 -103.72 gain 152 147 -104.85 gain 147 153 -99.74 gain 153 147 -100.56 gain 147 154 -101.80 gain 154 147 -103.75 gain 147 155 -104.64 gain 155 147 -103.89 gain 147 156 -96.93 gain 156 147 -97.30 gain 147 157 -93.41 gain 157 147 -95.08 gain 147 158 -94.16 gain 158 147 -97.79 gain 147 159 -91.66 gain 159 147 -89.34 gain 147 160 -89.79 gain 160 147 -88.84 gain 147 161 -78.18 gain 161 147 -78.29 gain 147 162 -77.66 gain 162 147 -77.40 gain 147 163 -87.48 gain 163 147 -84.63 gain 147 164 -89.75 gain 164 147 -94.14 gain 147 165 -101.90 gain 165 147 -103.64 gain 147 166 -104.34 gain 166 147 -107.73 gain 147 167 -107.76 gain 167 147 -109.98 gain 147 168 -106.69 gain 168 147 -107.98 gain 147 169 -96.92 gain 169 147 -94.72 gain 147 170 -98.65 gain 170 147 -97.38 gain 147 171 -94.93 gain 171 147 -94.24 gain 147 172 -95.90 gain 172 147 -98.01 gain 147 173 -96.90 gain 173 147 -93.33 gain 147 174 -93.79 gain 174 147 -96.18 gain 147 175 -97.72 gain 175 147 -91.90 gain 147 176 -82.16 gain 176 147 -80.57 gain 147 177 -82.12 gain 177 147 -82.88 gain 147 178 -84.92 gain 178 147 -83.29 gain 147 179 -94.99 gain 179 147 -96.40 gain 147 180 -100.70 gain 180 147 -100.85 gain 147 181 -107.81 gain 181 147 -111.37 gain 147 182 -106.89 gain 182 147 -106.58 gain 147 183 -108.79 gain 183 147 -104.36 gain 147 184 -103.28 gain 184 147 -105.08 gain 147 185 -97.39 gain 185 147 -97.69 gain 147 186 -93.49 gain 186 147 -94.49 gain 147 187 -99.47 gain 187 147 -100.49 gain 147 188 -89.48 gain 188 147 -94.95 gain 147 189 -100.85 gain 189 147 -102.38 gain 147 190 -91.50 gain 190 147 -85.86 gain 147 191 -87.47 gain 191 147 -85.00 gain 147 192 -89.76 gain 192 147 -90.96 gain 147 193 -89.58 gain 193 147 -86.81 gain 147 194 -86.58 gain 194 147 -83.70 gain 147 195 -109.24 gain 195 147 -104.33 gain 147 196 -112.18 gain 196 147 -114.93 gain 147 197 -109.88 gain 197 147 -110.12 gain 147 198 -102.98 gain 198 147 -105.87 gain 147 199 -109.37 gain 199 147 -106.28 gain 147 200 -109.98 gain 200 147 -108.80 gain 147 201 -103.23 gain 201 147 -105.14 gain 147 202 -91.60 gain 202 147 -91.81 gain 147 203 -93.81 gain 203 147 -94.11 gain 147 204 -97.72 gain 204 147 -96.25 gain 147 205 -93.42 gain 205 147 -91.61 gain 147 206 -92.56 gain 206 147 -92.08 gain 147 207 -92.66 gain 207 147 -89.92 gain 147 208 -94.04 gain 208 147 -94.60 gain 147 209 -103.46 gain 209 147 -103.06 gain 147 210 -111.51 gain 210 147 -115.11 gain 147 211 -115.88 gain 211 147 -116.87 gain 147 212 -102.25 gain 212 147 -101.80 gain 147 213 -104.82 gain 213 147 -107.10 gain 147 214 -104.48 gain 214 147 -104.94 gain 147 215 -103.54 gain 215 147 -105.82 gain 147 216 -102.12 gain 216 147 -101.29 gain 147 217 -104.35 gain 217 147 -107.97 gain 147 218 -108.66 gain 218 147 -113.59 gain 147 219 -103.66 gain 219 147 -106.18 gain 147 220 -99.00 gain 220 147 -98.63 gain 147 221 -95.95 gain 221 147 -96.57 gain 147 222 -98.96 gain 222 147 -96.16 gain 147 223 -96.89 gain 223 147 -96.38 gain 147 224 -94.03 gain 224 147 -90.44 gain 148 149 -70.86 gain 149 148 -67.24 gain 148 150 -111.12 gain 150 148 -110.88 gain 148 151 -106.29 gain 151 148 -108.52 gain 148 152 -108.51 gain 152 148 -109.11 gain 148 153 -102.91 gain 153 148 -103.20 gain 148 154 -100.84 gain 154 148 -102.26 gain 148 155 -107.44 gain 155 148 -106.16 gain 148 156 -100.67 gain 156 148 -100.52 gain 148 157 -100.59 gain 157 148 -101.73 gain 148 158 -97.37 gain 158 148 -100.48 gain 148 159 -93.12 gain 159 148 -90.27 gain 148 160 -100.31 gain 160 148 -98.84 gain 148 161 -89.16 gain 161 148 -88.74 gain 148 162 -86.58 gain 162 148 -85.79 gain 148 163 -77.15 gain 163 148 -73.78 gain 148 164 -86.32 gain 164 148 -90.18 gain 148 165 -103.82 gain 165 148 -105.03 gain 148 166 -108.07 gain 166 148 -110.94 gain 148 167 -108.91 gain 167 148 -110.61 gain 148 168 -106.29 gain 168 148 -107.05 gain 148 169 -113.06 gain 169 148 -110.33 gain 148 170 -99.57 gain 170 148 -97.78 gain 148 171 -102.37 gain 171 148 -101.16 gain 148 172 -99.86 gain 172 148 -101.44 gain 148 173 -97.28 gain 173 148 -93.19 gain 148 174 -96.08 gain 174 148 -97.94 gain 148 175 -92.25 gain 175 148 -85.90 gain 148 176 -89.30 gain 176 148 -87.17 gain 148 177 -79.36 gain 177 148 -79.60 gain 148 178 -81.93 gain 178 148 -79.78 gain 148 179 -83.18 gain 179 148 -84.07 gain 148 180 -111.62 gain 180 148 -111.24 gain 148 181 -103.34 gain 181 148 -106.37 gain 148 182 -104.62 gain 182 148 -103.78 gain 148 183 -113.45 gain 183 148 -108.50 gain 148 184 -106.01 gain 184 148 -107.28 gain 148 185 -102.10 gain 185 148 -101.87 gain 148 186 -99.44 gain 186 148 -99.92 gain 148 187 -105.74 gain 187 148 -106.24 gain 148 188 -98.11 gain 188 148 -103.05 gain 148 189 -97.17 gain 189 148 -98.17 gain 148 190 -95.70 gain 190 148 -89.53 gain 148 191 -91.57 gain 191 148 -88.58 gain 148 192 -98.04 gain 192 148 -98.72 gain 148 193 -88.36 gain 193 148 -85.06 gain 148 194 -86.32 gain 194 148 -82.91 gain 148 195 -107.67 gain 195 148 -102.24 gain 148 196 -108.68 gain 196 148 -110.91 gain 148 197 -109.56 gain 197 148 -109.28 gain 148 198 -112.19 gain 198 148 -114.55 gain 148 199 -103.05 gain 199 148 -99.43 gain 148 200 -99.22 gain 200 148 -97.52 gain 148 201 -107.42 gain 201 148 -108.81 gain 148 202 -106.06 gain 202 148 -105.75 gain 148 203 -95.44 gain 203 148 -95.22 gain 148 204 -98.77 gain 204 148 -96.77 gain 148 205 -96.80 gain 205 148 -94.47 gain 148 206 -102.91 gain 206 148 -101.90 gain 148 207 -95.66 gain 207 148 -92.40 gain 148 208 -92.58 gain 208 148 -92.62 gain 148 209 -97.66 gain 209 148 -96.73 gain 148 210 -113.43 gain 210 148 -116.50 gain 148 211 -102.45 gain 211 148 -102.92 gain 148 212 -112.04 gain 212 148 -111.05 gain 148 213 -110.68 gain 213 148 -112.44 gain 148 214 -103.04 gain 214 148 -102.97 gain 148 215 -105.50 gain 215 148 -107.25 gain 148 216 -107.17 gain 216 148 -105.81 gain 148 217 -102.02 gain 217 148 -105.12 gain 148 218 -102.59 gain 218 148 -107.01 gain 148 219 -105.25 gain 219 148 -107.24 gain 148 220 -100.52 gain 220 148 -99.62 gain 148 221 -98.53 gain 221 148 -98.63 gain 148 222 -94.27 gain 222 148 -90.94 gain 148 223 -98.13 gain 223 148 -97.09 gain 148 224 -94.14 gain 224 148 -90.03 gain 149 150 -107.34 gain 150 149 -110.72 gain 149 151 -103.22 gain 151 149 -109.08 gain 149 152 -102.45 gain 152 149 -106.67 gain 149 153 -107.17 gain 153 149 -111.09 gain 149 154 -97.57 gain 154 149 -102.61 gain 149 155 -99.36 gain 155 149 -101.71 gain 149 156 -97.15 gain 156 149 -100.62 gain 149 157 -96.59 gain 157 149 -101.36 gain 149 158 -97.84 gain 158 149 -104.58 gain 149 159 -93.88 gain 159 149 -94.65 gain 149 160 -87.00 gain 160 149 -89.15 gain 149 161 -85.79 gain 161 149 -89.00 gain 149 162 -72.33 gain 162 149 -75.17 gain 149 163 -77.93 gain 163 149 -78.18 gain 149 164 -69.08 gain 164 149 -76.57 gain 149 165 -104.01 gain 165 149 -108.85 gain 149 166 -108.56 gain 166 149 -115.06 gain 149 167 -106.94 gain 167 149 -112.27 gain 149 168 -107.84 gain 168 149 -112.22 gain 149 169 -99.56 gain 169 149 -100.46 gain 149 170 -92.15 gain 170 149 -93.99 gain 149 171 -103.90 gain 171 149 -106.31 gain 149 172 -99.93 gain 172 149 -105.13 gain 149 173 -94.00 gain 173 149 -93.52 gain 149 174 -94.69 gain 174 149 -100.18 gain 149 175 -88.23 gain 175 149 -85.51 gain 149 176 -95.40 gain 176 149 -96.90 gain 149 177 -89.31 gain 177 149 -93.18 gain 149 178 -81.46 gain 178 149 -82.93 gain 149 179 -77.05 gain 179 149 -81.56 gain 149 180 -106.20 gain 180 149 -109.45 gain 149 181 -102.10 gain 181 149 -108.75 gain 149 182 -106.43 gain 182 149 -109.22 gain 149 183 -105.78 gain 183 149 -104.45 gain 149 184 -106.34 gain 184 149 -111.24 gain 149 185 -99.21 gain 185 149 -102.61 gain 149 186 -98.17 gain 186 149 -102.27 gain 149 187 -94.63 gain 187 149 -98.75 gain 149 188 -91.17 gain 188 149 -99.74 gain 149 189 -93.15 gain 189 149 -97.78 gain 149 190 -93.26 gain 190 149 -90.72 gain 149 191 -95.15 gain 191 149 -95.79 gain 149 192 -95.69 gain 192 149 -99.99 gain 149 193 -93.39 gain 193 149 -93.72 gain 149 194 -88.04 gain 194 149 -88.26 gain 149 195 -105.43 gain 195 149 -103.61 gain 149 196 -109.81 gain 196 149 -115.67 gain 149 197 -98.95 gain 197 149 -102.30 gain 149 198 -103.20 gain 198 149 -109.19 gain 149 199 -112.31 gain 199 149 -112.32 gain 149 200 -102.94 gain 200 149 -104.86 gain 149 201 -107.55 gain 201 149 -112.56 gain 149 202 -99.17 gain 202 149 -102.48 gain 149 203 -95.92 gain 203 149 -99.33 gain 149 204 -100.05 gain 204 149 -101.68 gain 149 205 -90.72 gain 205 149 -92.02 gain 149 206 -88.28 gain 206 149 -90.90 gain 149 207 -89.60 gain 207 149 -89.96 gain 149 208 -89.09 gain 208 149 -92.76 gain 149 209 -87.54 gain 209 149 -90.25 gain 149 210 -109.86 gain 210 149 -116.56 gain 149 211 -112.85 gain 211 149 -116.95 gain 149 212 -105.34 gain 212 149 -107.99 gain 149 213 -111.01 gain 213 149 -116.39 gain 149 214 -108.63 gain 214 149 -112.19 gain 149 215 -98.08 gain 215 149 -103.46 gain 149 216 -102.56 gain 216 149 -104.83 gain 149 217 -95.38 gain 217 149 -102.10 gain 149 218 -108.18 gain 218 149 -116.22 gain 149 219 -93.96 gain 219 149 -99.58 gain 149 220 -93.90 gain 220 149 -96.63 gain 149 221 -92.71 gain 221 149 -96.43 gain 149 222 -93.31 gain 222 149 -93.60 gain 149 223 -99.84 gain 223 149 -102.43 gain 149 224 -108.38 gain 224 149 -107.90 gain 150 151 -72.03 gain 151 150 -74.51 gain 150 152 -81.67 gain 152 150 -82.51 gain 150 153 -92.80 gain 153 150 -93.33 gain 150 154 -99.61 gain 154 150 -101.27 gain 150 155 -83.84 gain 155 150 -82.81 gain 150 156 -102.66 gain 156 150 -102.74 gain 150 157 -102.13 gain 157 150 -103.52 gain 150 158 -100.39 gain 158 150 -103.74 gain 150 159 -97.42 gain 159 150 -94.81 gain 150 160 -107.31 gain 160 150 -106.08 gain 150 161 -111.26 gain 161 150 -111.08 gain 150 162 -110.10 gain 162 150 -109.55 gain 150 163 -110.55 gain 163 150 -107.43 gain 150 164 -108.40 gain 164 150 -112.50 gain 150 165 -69.07 gain 165 150 -70.52 gain 150 166 -76.84 gain 166 150 -79.95 gain 150 167 -80.86 gain 167 150 -82.80 gain 150 168 -84.40 gain 168 150 -85.40 gain 150 169 -97.66 gain 169 150 -95.17 gain 150 170 -91.46 gain 170 150 -89.91 gain 150 171 -97.31 gain 171 150 -96.34 gain 150 172 -97.60 gain 172 150 -99.43 gain 150 173 -97.15 gain 173 150 -93.29 gain 150 174 -109.69 gain 174 150 -111.79 gain 150 175 -109.03 gain 175 150 -102.93 gain 150 176 -108.63 gain 176 150 -106.75 gain 150 177 -109.63 gain 177 150 -110.11 gain 150 178 -116.49 gain 178 150 -114.58 gain 150 179 -113.59 gain 179 150 -114.73 gain 150 180 -79.23 gain 180 150 -79.10 gain 150 181 -82.69 gain 181 150 -85.96 gain 150 182 -84.69 gain 182 150 -84.09 gain 150 183 -90.05 gain 183 150 -85.34 gain 150 184 -88.81 gain 184 150 -90.33 gain 150 185 -100.45 gain 185 150 -100.47 gain 150 186 -103.54 gain 186 150 -104.26 gain 150 187 -103.95 gain 187 150 -104.69 gain 150 188 -104.86 gain 188 150 -110.04 gain 150 189 -106.18 gain 189 150 -107.43 gain 150 190 -108.63 gain 190 150 -102.70 gain 150 191 -104.45 gain 191 150 -101.70 gain 150 192 -112.13 gain 192 150 -113.04 gain 150 193 -116.91 gain 193 150 -113.85 gain 150 194 -109.10 gain 194 150 -105.93 gain 150 195 -93.37 gain 195 150 -88.18 gain 150 196 -87.18 gain 196 150 -89.65 gain 150 197 -90.96 gain 197 150 -90.92 gain 150 198 -86.45 gain 198 150 -89.06 gain 150 199 -95.50 gain 199 150 -92.12 gain 150 200 -100.80 gain 200 150 -99.34 gain 150 201 -100.39 gain 201 150 -102.02 gain 150 202 -101.67 gain 202 150 -101.60 gain 150 203 -105.80 gain 203 150 -105.82 gain 150 204 -103.77 gain 204 150 -102.01 gain 150 205 -110.49 gain 205 150 -108.40 gain 150 206 -116.65 gain 206 150 -115.88 gain 150 207 -112.32 gain 207 150 -109.30 gain 150 208 -111.11 gain 208 150 -111.39 gain 150 209 -118.86 gain 209 150 -118.17 gain 150 210 -91.71 gain 210 150 -95.03 gain 150 211 -89.69 gain 211 150 -90.40 gain 150 212 -91.27 gain 212 150 -90.53 gain 150 213 -94.68 gain 213 150 -96.68 gain 150 214 -100.69 gain 214 150 -100.87 gain 150 215 -101.29 gain 215 150 -103.28 gain 150 216 -97.35 gain 216 150 -96.24 gain 150 217 -104.56 gain 217 150 -107.90 gain 150 218 -102.93 gain 218 150 -107.58 gain 150 219 -102.91 gain 219 150 -105.14 gain 150 220 -107.57 gain 220 150 -106.92 gain 150 221 -112.91 gain 221 150 -113.24 gain 150 222 -103.73 gain 222 150 -100.65 gain 150 223 -106.71 gain 223 150 -105.91 gain 150 224 -112.62 gain 224 150 -108.75 gain 151 152 -73.29 gain 152 151 -71.65 gain 151 153 -82.06 gain 153 151 -80.11 gain 151 154 -95.16 gain 154 151 -94.35 gain 151 155 -98.35 gain 155 151 -94.84 gain 151 156 -104.27 gain 156 151 -101.88 gain 151 157 -98.03 gain 157 151 -96.94 gain 151 158 -99.21 gain 158 151 -100.08 gain 151 159 -110.48 gain 159 151 -105.40 gain 151 160 -103.70 gain 160 151 -99.99 gain 151 161 -107.33 gain 161 151 -104.67 gain 151 162 -107.64 gain 162 151 -104.61 gain 151 163 -115.68 gain 163 151 -110.07 gain 151 164 -106.06 gain 164 151 -107.68 gain 151 165 -88.87 gain 165 151 -87.85 gain 151 166 -76.05 gain 166 151 -76.69 gain 151 167 -87.84 gain 167 151 -87.30 gain 151 168 -91.66 gain 168 151 -90.18 gain 151 169 -89.46 gain 169 151 -84.50 gain 151 170 -96.31 gain 170 151 -92.29 gain 151 171 -102.22 gain 171 151 -98.77 gain 151 172 -106.76 gain 172 151 -106.10 gain 151 173 -99.69 gain 173 151 -93.36 gain 151 174 -102.49 gain 174 151 -102.11 gain 151 175 -100.90 gain 175 151 -92.32 gain 151 176 -106.08 gain 176 151 -101.72 gain 151 177 -111.37 gain 177 151 -109.37 gain 151 178 -113.92 gain 178 151 -109.53 gain 151 179 -112.60 gain 179 151 -111.26 gain 151 180 -91.37 gain 180 151 -88.76 gain 151 181 -84.07 gain 181 151 -84.86 gain 151 182 -86.57 gain 182 151 -83.50 gain 151 183 -94.76 gain 183 151 -87.57 gain 151 184 -105.00 gain 184 151 -104.04 gain 151 185 -96.42 gain 185 151 -93.96 gain 151 186 -102.04 gain 186 151 -100.28 gain 151 187 -100.15 gain 187 151 -98.42 gain 151 188 -99.19 gain 188 151 -101.89 gain 151 189 -106.38 gain 189 151 -105.15 gain 151 190 -109.84 gain 190 151 -101.44 gain 151 191 -112.10 gain 191 151 -106.87 gain 151 192 -107.35 gain 192 151 -105.79 gain 151 193 -115.41 gain 193 151 -109.88 gain 151 194 -106.77 gain 194 151 -101.12 gain 151 195 -99.23 gain 195 151 -91.56 gain 151 196 -101.37 gain 196 151 -101.37 gain 151 197 -94.57 gain 197 151 -92.05 gain 151 198 -102.24 gain 198 151 -102.36 gain 151 199 -102.41 gain 199 151 -96.56 gain 151 200 -103.27 gain 200 151 -99.33 gain 151 201 -97.74 gain 201 151 -96.89 gain 151 202 -105.60 gain 202 151 -103.05 gain 151 203 -107.78 gain 203 151 -105.32 gain 151 204 -106.90 gain 204 151 -102.67 gain 151 205 -99.98 gain 205 151 -95.41 gain 151 206 -111.83 gain 206 151 -108.58 gain 151 207 -111.40 gain 207 151 -105.90 gain 151 208 -110.48 gain 208 151 -108.28 gain 151 209 -111.43 gain 209 151 -108.27 gain 151 210 -90.95 gain 210 151 -91.79 gain 151 211 -98.82 gain 211 151 -97.05 gain 151 212 -102.49 gain 212 151 -99.28 gain 151 213 -92.78 gain 213 151 -92.30 gain 151 214 -98.50 gain 214 151 -96.20 gain 151 215 -98.66 gain 215 151 -98.17 gain 151 216 -94.87 gain 216 151 -91.28 gain 151 217 -113.64 gain 217 151 -114.51 gain 151 218 -108.37 gain 218 151 -110.55 gain 151 219 -116.18 gain 219 151 -115.93 gain 151 220 -108.26 gain 220 151 -105.13 gain 151 221 -112.26 gain 221 151 -110.12 gain 151 222 -107.04 gain 222 151 -101.48 gain 151 223 -113.17 gain 223 151 -109.90 gain 151 224 -110.81 gain 224 151 -104.47 gain 152 153 -73.83 gain 153 152 -73.52 gain 152 154 -84.75 gain 154 152 -85.58 gain 152 155 -91.33 gain 155 152 -89.46 gain 152 156 -93.65 gain 156 152 -92.89 gain 152 157 -87.25 gain 157 152 -87.79 gain 152 158 -99.83 gain 158 152 -102.35 gain 152 159 -105.85 gain 159 152 -102.40 gain 152 160 -102.81 gain 160 152 -100.74 gain 152 161 -104.55 gain 161 152 -103.54 gain 152 162 -102.43 gain 162 152 -101.04 gain 152 163 -110.41 gain 163 152 -106.44 gain 152 164 -111.02 gain 164 152 -114.28 gain 152 165 -81.07 gain 165 152 -81.69 gain 152 166 -82.43 gain 166 152 -84.71 gain 152 167 -77.44 gain 167 152 -78.54 gain 152 168 -77.36 gain 168 152 -77.52 gain 152 169 -86.74 gain 169 152 -83.42 gain 152 170 -90.90 gain 170 152 -88.52 gain 152 171 -89.90 gain 171 152 -88.09 gain 152 172 -95.80 gain 172 152 -96.79 gain 152 173 -99.83 gain 173 152 -95.14 gain 152 174 -105.60 gain 174 152 -106.87 gain 152 175 -102.09 gain 175 152 -95.15 gain 152 176 -108.83 gain 176 152 -106.11 gain 152 177 -107.83 gain 177 152 -107.47 gain 152 178 -110.73 gain 178 152 -107.98 gain 152 179 -113.79 gain 179 152 -114.08 gain 152 180 -92.98 gain 180 152 -92.02 gain 152 181 -83.61 gain 181 152 -86.04 gain 152 182 -89.58 gain 182 152 -88.14 gain 152 183 -83.26 gain 183 152 -77.71 gain 152 184 -84.91 gain 184 152 -85.59 gain 152 185 -94.31 gain 185 152 -93.49 gain 152 186 -84.63 gain 186 152 -84.50 gain 152 187 -97.86 gain 187 152 -97.77 gain 152 188 -105.23 gain 188 152 -109.57 gain 152 189 -105.61 gain 189 152 -106.01 gain 152 190 -99.89 gain 190 152 -93.13 gain 152 191 -107.38 gain 191 152 -103.79 gain 152 192 -108.10 gain 192 152 -108.18 gain 152 193 -115.28 gain 193 152 -111.39 gain 152 194 -105.82 gain 194 152 -101.81 gain 152 195 -92.08 gain 195 152 -86.05 gain 152 196 -92.29 gain 196 152 -93.93 gain 152 197 -92.73 gain 197 152 -91.85 gain 152 198 -95.96 gain 198 152 -97.73 gain 152 199 -94.71 gain 199 152 -90.49 gain 152 200 -92.91 gain 200 152 -90.61 gain 152 201 -101.56 gain 201 152 -102.35 gain 152 202 -108.09 gain 202 152 -107.18 gain 152 203 -99.20 gain 203 152 -98.39 gain 152 204 -98.21 gain 204 152 -95.62 gain 152 205 -100.60 gain 205 152 -97.67 gain 152 206 -102.86 gain 206 152 -101.25 gain 152 207 -104.57 gain 207 152 -100.71 gain 152 208 -103.10 gain 208 152 -102.54 gain 152 209 -115.22 gain 209 152 -113.70 gain 152 210 -92.81 gain 210 152 -95.29 gain 152 211 -97.08 gain 211 152 -96.96 gain 152 212 -97.01 gain 212 152 -95.43 gain 152 213 -94.85 gain 213 152 -96.01 gain 152 214 -89.29 gain 214 152 -88.63 gain 152 215 -97.13 gain 215 152 -98.29 gain 152 216 -97.95 gain 216 152 -96.00 gain 152 217 -102.44 gain 217 152 -104.94 gain 152 218 -102.07 gain 218 152 -105.89 gain 152 219 -103.82 gain 219 152 -105.21 gain 152 220 -104.33 gain 220 152 -102.83 gain 152 221 -100.23 gain 221 152 -99.72 gain 152 222 -102.30 gain 222 152 -98.37 gain 152 223 -112.60 gain 223 152 -110.97 gain 152 224 -118.48 gain 224 152 -113.77 gain 153 154 -78.65 gain 154 153 -79.78 gain 153 155 -91.38 gain 155 153 -89.81 gain 153 156 -93.36 gain 156 153 -92.92 gain 153 157 -94.29 gain 157 153 -95.14 gain 153 158 -93.41 gain 158 153 -96.23 gain 153 159 -98.84 gain 159 153 -95.70 gain 153 160 -99.22 gain 160 153 -97.46 gain 153 161 -102.82 gain 161 153 -102.11 gain 153 162 -104.39 gain 162 153 -103.31 gain 153 163 -105.33 gain 163 153 -101.67 gain 153 164 -107.26 gain 164 153 -110.83 gain 153 165 -92.08 gain 165 153 -93.00 gain 153 166 -84.31 gain 166 153 -86.89 gain 153 167 -81.08 gain 167 153 -82.49 gain 153 168 -76.56 gain 168 153 -77.02 gain 153 169 -84.16 gain 169 153 -81.14 gain 153 170 -89.03 gain 170 153 -86.96 gain 153 171 -99.20 gain 171 153 -97.69 gain 153 172 -91.27 gain 172 153 -92.56 gain 153 173 -92.21 gain 173 153 -87.81 gain 153 174 -96.24 gain 174 153 -97.81 gain 153 175 -103.56 gain 175 153 -96.93 gain 153 176 -102.25 gain 176 153 -99.84 gain 153 177 -110.06 gain 177 153 -110.01 gain 153 178 -115.74 gain 178 153 -113.29 gain 153 179 -104.77 gain 179 153 -105.37 gain 153 180 -87.52 gain 180 153 -86.85 gain 153 181 -88.12 gain 181 153 -90.85 gain 153 182 -87.03 gain 182 153 -85.90 gain 153 183 -86.45 gain 183 153 -81.20 gain 153 184 -93.12 gain 184 153 -94.10 gain 153 185 -90.78 gain 185 153 -90.26 gain 153 186 -88.73 gain 186 153 -88.91 gain 153 187 -89.24 gain 187 153 -89.45 gain 153 188 -89.52 gain 188 153 -94.17 gain 153 189 -97.87 gain 189 153 -98.57 gain 153 190 -103.91 gain 190 153 -97.45 gain 153 191 -108.07 gain 191 153 -104.78 gain 153 192 -109.38 gain 192 153 -109.77 gain 153 193 -107.35 gain 193 153 -103.76 gain 153 194 -105.71 gain 194 153 -102.00 gain 153 195 -96.31 gain 195 153 -90.58 gain 153 196 -95.68 gain 196 153 -97.62 gain 153 197 -87.93 gain 197 153 -87.36 gain 153 198 -90.08 gain 198 153 -92.15 gain 153 199 -89.86 gain 199 153 -85.95 gain 153 200 -105.02 gain 200 153 -103.02 gain 153 201 -93.33 gain 201 153 -94.42 gain 153 202 -102.96 gain 202 153 -102.35 gain 153 203 -98.52 gain 203 153 -98.01 gain 153 204 -100.57 gain 204 153 -98.28 gain 153 205 -112.22 gain 205 153 -109.60 gain 153 206 -98.12 gain 206 153 -96.82 gain 153 207 -102.34 gain 207 153 -98.78 gain 153 208 -110.24 gain 208 153 -109.99 gain 153 209 -113.29 gain 209 153 -112.07 gain 153 210 -95.48 gain 210 153 -98.26 gain 153 211 -97.16 gain 211 153 -97.34 gain 153 212 -94.44 gain 212 153 -93.16 gain 153 213 -92.46 gain 213 153 -93.92 gain 153 214 -93.98 gain 214 153 -93.63 gain 153 215 -98.26 gain 215 153 -99.72 gain 153 216 -98.19 gain 216 153 -96.54 gain 153 217 -100.45 gain 217 153 -103.25 gain 153 218 -96.52 gain 218 153 -100.64 gain 153 219 -109.84 gain 219 153 -111.54 gain 153 220 -104.81 gain 220 153 -103.62 gain 153 221 -105.52 gain 221 153 -105.32 gain 153 222 -106.34 gain 222 153 -102.72 gain 153 223 -103.75 gain 223 153 -102.42 gain 153 224 -103.19 gain 224 153 -98.79 gain 154 155 -71.83 gain 155 154 -69.13 gain 154 156 -81.68 gain 156 154 -80.10 gain 154 157 -89.05 gain 157 154 -88.77 gain 154 158 -95.82 gain 158 154 -97.51 gain 154 159 -96.64 gain 159 154 -92.36 gain 154 160 -106.40 gain 160 154 -103.50 gain 154 161 -101.54 gain 161 154 -99.69 gain 154 162 -108.19 gain 162 154 -105.97 gain 154 163 -110.13 gain 163 154 -105.34 gain 154 164 -109.26 gain 164 154 -111.69 gain 154 165 -99.82 gain 165 154 -99.61 gain 154 166 -96.10 gain 166 154 -97.55 gain 154 167 -94.75 gain 167 154 -95.03 gain 154 168 -92.33 gain 168 154 -91.66 gain 154 169 -76.05 gain 169 154 -71.90 gain 154 170 -79.95 gain 170 154 -76.74 gain 154 171 -92.79 gain 171 154 -90.15 gain 154 172 -84.74 gain 172 154 -84.90 gain 154 173 -101.52 gain 173 154 -96.00 gain 154 174 -94.59 gain 174 154 -95.03 gain 154 175 -103.31 gain 175 154 -95.54 gain 154 176 -105.54 gain 176 154 -101.99 gain 154 177 -104.62 gain 177 154 -103.44 gain 154 178 -108.72 gain 178 154 -105.15 gain 154 179 -109.69 gain 179 154 -109.16 gain 154 180 -96.13 gain 180 154 -94.34 gain 154 181 -92.73 gain 181 154 -94.34 gain 154 182 -94.37 gain 182 154 -92.11 gain 154 183 -80.98 gain 183 154 -74.60 gain 154 184 -92.95 gain 184 154 -92.80 gain 154 185 -78.99 gain 185 154 -77.34 gain 154 186 -90.62 gain 186 154 -89.67 gain 154 187 -95.98 gain 187 154 -95.06 gain 154 188 -99.76 gain 188 154 -103.28 gain 154 189 -97.15 gain 189 154 -96.72 gain 154 190 -98.13 gain 190 154 -90.54 gain 154 191 -108.35 gain 191 154 -103.93 gain 154 192 -109.22 gain 192 154 -108.48 gain 154 193 -112.07 gain 193 154 -107.35 gain 154 194 -108.49 gain 194 154 -103.66 gain 154 195 -105.07 gain 195 154 -98.21 gain 154 196 -98.32 gain 196 154 -99.13 gain 154 197 -91.50 gain 197 154 -89.79 gain 154 198 -87.00 gain 198 154 -87.94 gain 154 199 -91.22 gain 199 154 -86.18 gain 154 200 -90.21 gain 200 154 -87.08 gain 154 201 -96.40 gain 201 154 -96.36 gain 154 202 -94.18 gain 202 154 -92.44 gain 154 203 -98.14 gain 203 154 -96.49 gain 154 204 -102.96 gain 204 154 -99.54 gain 154 205 -100.00 gain 205 154 -96.25 gain 154 206 -106.19 gain 206 154 -103.76 gain 154 207 -105.44 gain 207 154 -100.75 gain 154 208 -106.91 gain 208 154 -105.52 gain 154 209 -109.91 gain 209 154 -107.56 gain 154 210 -98.60 gain 210 154 -100.26 gain 154 211 -97.37 gain 211 154 -96.42 gain 154 212 -97.42 gain 212 154 -95.02 gain 154 213 -92.64 gain 213 154 -92.97 gain 154 214 -97.74 gain 214 154 -96.26 gain 154 215 -94.38 gain 215 154 -94.71 gain 154 216 -88.96 gain 216 154 -86.18 gain 154 217 -100.53 gain 217 154 -102.20 gain 154 218 -102.58 gain 218 154 -105.57 gain 154 219 -102.51 gain 219 154 -103.07 gain 154 220 -98.58 gain 220 154 -96.26 gain 154 221 -106.64 gain 221 154 -105.31 gain 154 222 -102.45 gain 222 154 -97.70 gain 154 223 -104.28 gain 223 154 -101.82 gain 154 224 -102.98 gain 224 154 -97.44 gain 155 156 -77.60 gain 156 155 -78.73 gain 155 157 -81.03 gain 157 155 -83.45 gain 155 158 -91.17 gain 158 155 -95.56 gain 155 159 -95.68 gain 159 155 -94.11 gain 155 160 -99.80 gain 160 155 -99.61 gain 155 161 -98.50 gain 161 155 -99.36 gain 155 162 -105.65 gain 162 155 -106.14 gain 155 163 -107.52 gain 163 155 -105.43 gain 155 164 -104.44 gain 164 155 -109.57 gain 155 165 -87.72 gain 165 155 -90.21 gain 155 166 -92.56 gain 166 155 -96.71 gain 155 167 -94.68 gain 167 155 -97.65 gain 155 168 -78.15 gain 168 155 -80.19 gain 155 169 -79.71 gain 169 155 -78.26 gain 155 170 -69.93 gain 170 155 -69.42 gain 155 171 -82.94 gain 171 155 -83.01 gain 155 172 -85.04 gain 172 155 -87.90 gain 155 173 -95.29 gain 173 155 -92.47 gain 155 174 -96.40 gain 174 155 -99.54 gain 155 175 -97.18 gain 175 155 -92.11 gain 155 176 -103.79 gain 176 155 -102.95 gain 155 177 -101.73 gain 177 155 -103.25 gain 155 178 -103.85 gain 178 155 -102.97 gain 155 179 -100.17 gain 179 155 -102.34 gain 155 180 -98.03 gain 180 155 -98.94 gain 155 181 -92.99 gain 181 155 -97.30 gain 155 182 -92.17 gain 182 155 -92.61 gain 155 183 -82.77 gain 183 155 -79.09 gain 155 184 -88.32 gain 184 155 -90.87 gain 155 185 -82.06 gain 185 155 -83.11 gain 155 186 -85.47 gain 186 155 -87.23 gain 155 187 -82.63 gain 187 155 -84.41 gain 155 188 -90.72 gain 188 155 -96.95 gain 155 189 -96.40 gain 189 155 -98.68 gain 155 190 -100.06 gain 190 155 -95.17 gain 155 191 -103.81 gain 191 155 -102.09 gain 155 192 -106.15 gain 192 155 -108.10 gain 155 193 -104.20 gain 193 155 -102.18 gain 155 194 -102.79 gain 194 155 -100.66 gain 155 195 -109.42 gain 195 155 -105.26 gain 155 196 -89.22 gain 196 155 -92.73 gain 155 197 -94.71 gain 197 155 -95.71 gain 155 198 -93.36 gain 198 155 -97.00 gain 155 199 -88.82 gain 199 155 -86.48 gain 155 200 -90.14 gain 200 155 -89.72 gain 155 201 -91.80 gain 201 155 -94.46 gain 155 202 -95.77 gain 202 155 -96.73 gain 155 203 -94.67 gain 203 155 -95.73 gain 155 204 -101.38 gain 204 155 -100.66 gain 155 205 -88.98 gain 205 155 -87.92 gain 155 206 -99.47 gain 206 155 -99.74 gain 155 207 -100.24 gain 207 155 -98.26 gain 155 208 -100.53 gain 208 155 -101.84 gain 155 209 -103.86 gain 209 155 -104.21 gain 155 210 -98.74 gain 210 155 -103.10 gain 155 211 -102.81 gain 211 155 -104.56 gain 155 212 -93.24 gain 212 155 -93.54 gain 155 213 -91.64 gain 213 155 -94.67 gain 155 214 -101.15 gain 214 155 -102.36 gain 155 215 -91.59 gain 215 155 -94.62 gain 155 216 -90.18 gain 216 155 -90.10 gain 155 217 -93.70 gain 217 155 -98.08 gain 155 218 -100.93 gain 218 155 -106.62 gain 155 219 -102.94 gain 219 155 -106.20 gain 155 220 -97.70 gain 220 155 -98.08 gain 155 221 -101.94 gain 221 155 -103.32 gain 155 222 -107.57 gain 222 155 -105.52 gain 155 223 -107.38 gain 223 155 -107.62 gain 155 224 -106.80 gain 224 155 -103.97 gain 156 157 -82.39 gain 157 156 -83.69 gain 156 158 -85.78 gain 158 156 -89.05 gain 156 159 -92.17 gain 159 156 -89.47 gain 156 160 -98.82 gain 160 156 -97.50 gain 156 161 -94.96 gain 161 156 -94.70 gain 156 162 -96.26 gain 162 156 -95.62 gain 156 163 -101.87 gain 163 156 -98.66 gain 156 164 -98.57 gain 164 156 -102.59 gain 156 165 -98.48 gain 165 156 -99.85 gain 156 166 -100.57 gain 166 156 -103.60 gain 156 167 -99.15 gain 167 156 -101.00 gain 156 168 -85.13 gain 168 156 -86.05 gain 156 169 -91.97 gain 169 156 -89.40 gain 156 170 -75.64 gain 170 156 -74.01 gain 156 171 -77.20 gain 171 156 -76.14 gain 156 172 -77.25 gain 172 156 -78.98 gain 156 173 -89.96 gain 173 156 -86.02 gain 156 174 -87.30 gain 174 156 -89.31 gain 156 175 -90.01 gain 175 156 -83.82 gain 156 176 -99.89 gain 176 156 -97.92 gain 156 177 -110.01 gain 177 156 -110.41 gain 156 178 -94.23 gain 178 156 -92.24 gain 156 179 -104.19 gain 179 156 -105.23 gain 156 180 -103.32 gain 180 156 -103.10 gain 156 181 -101.53 gain 181 156 -104.71 gain 156 182 -91.56 gain 182 156 -90.88 gain 156 183 -90.83 gain 183 156 -86.04 gain 156 184 -87.67 gain 184 156 -89.10 gain 156 185 -80.34 gain 185 156 -80.27 gain 156 186 -88.98 gain 186 156 -89.61 gain 156 187 -88.60 gain 187 156 -89.25 gain 156 188 -85.16 gain 188 156 -90.26 gain 156 189 -92.68 gain 189 156 -93.83 gain 156 190 -90.85 gain 190 156 -84.83 gain 156 191 -101.98 gain 191 156 -99.14 gain 156 192 -98.11 gain 192 156 -98.95 gain 156 193 -105.31 gain 193 156 -102.17 gain 156 194 -100.53 gain 194 156 -97.27 gain 156 195 -101.51 gain 195 156 -96.23 gain 156 196 -96.49 gain 196 156 -98.88 gain 156 197 -98.08 gain 197 156 -97.95 gain 156 198 -91.39 gain 198 156 -93.91 gain 156 199 -89.33 gain 199 156 -85.87 gain 156 200 -103.64 gain 200 156 -102.09 gain 156 201 -89.10 gain 201 156 -90.64 gain 156 202 -89.05 gain 202 156 -88.89 gain 156 203 -88.99 gain 203 156 -88.92 gain 156 204 -90.20 gain 204 156 -88.35 gain 156 205 -93.00 gain 205 156 -90.82 gain 156 206 -98.75 gain 206 156 -97.90 gain 156 207 -104.68 gain 207 156 -101.57 gain 156 208 -100.40 gain 208 156 -100.59 gain 156 209 -99.40 gain 209 156 -98.63 gain 156 210 -101.65 gain 210 156 -104.88 gain 156 211 -104.39 gain 211 156 -105.02 gain 156 212 -96.86 gain 212 156 -96.03 gain 156 213 -97.09 gain 213 156 -99.00 gain 156 214 -100.20 gain 214 156 -100.29 gain 156 215 -92.29 gain 215 156 -94.19 gain 156 216 -92.53 gain 216 156 -91.33 gain 156 217 -94.16 gain 217 156 -97.41 gain 156 218 -92.44 gain 218 156 -97.00 gain 156 219 -104.47 gain 219 156 -106.62 gain 156 220 -101.31 gain 220 156 -100.56 gain 156 221 -95.21 gain 221 156 -95.46 gain 156 222 -101.30 gain 222 156 -98.13 gain 156 223 -101.38 gain 223 156 -100.50 gain 156 224 -103.29 gain 224 156 -99.34 gain 157 158 -73.44 gain 158 157 -75.41 gain 157 159 -91.92 gain 159 157 -87.92 gain 157 160 -94.47 gain 160 157 -91.85 gain 157 161 -94.27 gain 161 157 -92.71 gain 157 162 -93.55 gain 162 157 -91.62 gain 157 163 -98.15 gain 163 157 -93.64 gain 157 164 -93.70 gain 164 157 -96.42 gain 157 165 -101.01 gain 165 157 -101.08 gain 157 166 -97.90 gain 166 157 -99.62 gain 157 167 -94.04 gain 167 157 -94.59 gain 157 168 -93.07 gain 168 157 -92.69 gain 157 169 -89.18 gain 169 157 -85.32 gain 157 170 -90.42 gain 170 157 -87.49 gain 157 171 -80.23 gain 171 157 -77.87 gain 157 172 -80.03 gain 172 157 -80.47 gain 157 173 -89.35 gain 173 157 -84.11 gain 157 174 -83.18 gain 174 157 -83.90 gain 157 175 -88.43 gain 175 157 -80.94 gain 157 176 -94.88 gain 176 157 -91.62 gain 157 177 -97.11 gain 177 157 -96.21 gain 157 178 -98.82 gain 178 157 -95.53 gain 157 179 -100.86 gain 179 157 -100.61 gain 157 180 -99.88 gain 180 157 -98.37 gain 157 181 -97.60 gain 181 157 -99.49 gain 157 182 -95.20 gain 182 157 -93.22 gain 157 183 -95.22 gain 183 157 -89.13 gain 157 184 -92.13 gain 184 157 -92.27 gain 157 185 -93.71 gain 185 157 -92.34 gain 157 186 -88.41 gain 186 157 -87.75 gain 157 187 -77.05 gain 187 157 -76.41 gain 157 188 -91.03 gain 188 157 -94.83 gain 157 189 -89.66 gain 189 157 -89.52 gain 157 190 -92.36 gain 190 157 -85.05 gain 157 191 -97.43 gain 191 157 -93.29 gain 157 192 -96.96 gain 192 157 -96.49 gain 157 193 -101.33 gain 193 157 -96.89 gain 157 194 -102.21 gain 194 157 -97.66 gain 157 195 -105.12 gain 195 157 -98.54 gain 157 196 -100.85 gain 196 157 -101.94 gain 157 197 -106.84 gain 197 157 -105.42 gain 157 198 -102.92 gain 198 157 -104.14 gain 157 199 -98.01 gain 199 157 -93.25 gain 157 200 -90.23 gain 200 157 -87.38 gain 157 201 -94.60 gain 201 157 -94.85 gain 157 202 -92.20 gain 202 157 -90.75 gain 157 203 -91.59 gain 203 157 -90.23 gain 157 204 -100.15 gain 204 157 -97.01 gain 157 205 -100.19 gain 205 157 -96.72 gain 157 206 -97.15 gain 206 157 -95.00 gain 157 207 -93.41 gain 207 157 -89.00 gain 157 208 -101.90 gain 208 157 -100.79 gain 157 209 -108.11 gain 209 157 -106.04 gain 157 210 -111.07 gain 210 157 -113.00 gain 157 211 -101.15 gain 211 157 -100.48 gain 157 212 -96.02 gain 212 157 -93.90 gain 157 213 -97.84 gain 213 157 -98.46 gain 157 214 -94.58 gain 214 157 -93.38 gain 157 215 -95.73 gain 215 157 -96.34 gain 157 216 -95.54 gain 216 157 -93.05 gain 157 217 -93.51 gain 217 157 -95.46 gain 157 218 -97.64 gain 218 157 -100.91 gain 157 219 -96.48 gain 219 157 -97.33 gain 157 220 -103.56 gain 220 157 -101.52 gain 157 221 -94.16 gain 221 157 -93.12 gain 157 222 -107.72 gain 222 157 -103.25 gain 157 223 -105.63 gain 223 157 -103.44 gain 157 224 -106.94 gain 224 157 -101.69 gain 158 159 -81.04 gain 159 158 -75.08 gain 158 160 -89.08 gain 160 158 -84.49 gain 158 161 -87.14 gain 161 158 -83.61 gain 158 162 -98.85 gain 162 158 -94.95 gain 158 163 -102.10 gain 163 158 -95.62 gain 158 164 -97.94 gain 164 158 -98.69 gain 158 165 -107.49 gain 165 158 -105.59 gain 158 166 -101.21 gain 166 158 -100.97 gain 158 167 -98.94 gain 167 158 -97.52 gain 158 168 -103.17 gain 168 158 -100.82 gain 158 169 -101.44 gain 169 158 -95.60 gain 158 170 -93.11 gain 170 158 -88.21 gain 158 171 -84.21 gain 171 158 -79.88 gain 158 172 -81.94 gain 172 158 -80.41 gain 158 173 -80.82 gain 173 158 -73.61 gain 158 174 -84.31 gain 174 158 -83.05 gain 158 175 -88.84 gain 175 158 -79.39 gain 158 176 -93.94 gain 176 158 -88.70 gain 158 177 -97.64 gain 177 158 -94.77 gain 158 178 -95.92 gain 178 158 -90.66 gain 158 179 -111.46 gain 179 158 -109.24 gain 158 180 -111.72 gain 180 158 -108.23 gain 158 181 -106.85 gain 181 158 -106.76 gain 158 182 -98.63 gain 182 158 -94.68 gain 158 183 -99.46 gain 183 158 -91.39 gain 158 184 -97.79 gain 184 158 -95.95 gain 158 185 -95.33 gain 185 158 -92.00 gain 158 186 -90.89 gain 186 158 -88.26 gain 158 187 -93.37 gain 187 158 -90.76 gain 158 188 -87.58 gain 188 158 -89.41 gain 158 189 -93.52 gain 189 158 -91.41 gain 158 190 -101.16 gain 190 158 -91.88 gain 158 191 -97.87 gain 191 158 -91.76 gain 158 192 -97.86 gain 192 158 -95.43 gain 158 193 -95.83 gain 193 158 -89.42 gain 158 194 -108.73 gain 194 158 -102.20 gain 158 195 -109.33 gain 195 158 -100.78 gain 158 196 -105.81 gain 196 158 -104.93 gain 158 197 -110.81 gain 197 158 -107.42 gain 158 198 -95.36 gain 198 158 -94.61 gain 158 199 -96.17 gain 199 158 -89.44 gain 158 200 -98.20 gain 200 158 -93.38 gain 158 201 -92.36 gain 201 158 -90.63 gain 158 202 -92.98 gain 202 158 -89.55 gain 158 203 -97.01 gain 203 158 -93.68 gain 158 204 -94.67 gain 204 158 -89.57 gain 158 205 -93.93 gain 205 158 -88.49 gain 158 206 -91.15 gain 206 158 -87.04 gain 158 207 -101.62 gain 207 158 -95.24 gain 158 208 -104.76 gain 208 158 -101.69 gain 158 209 -102.28 gain 209 158 -98.25 gain 158 210 -111.66 gain 210 158 -111.62 gain 158 211 -109.17 gain 211 158 -106.53 gain 158 212 -110.37 gain 212 158 -106.27 gain 158 213 -105.99 gain 213 158 -104.63 gain 158 214 -103.08 gain 214 158 -99.90 gain 158 215 -98.27 gain 215 158 -96.91 gain 158 216 -92.58 gain 216 158 -88.12 gain 158 217 -99.11 gain 217 158 -99.09 gain 158 218 -96.08 gain 218 158 -97.39 gain 158 219 -91.65 gain 219 158 -90.52 gain 158 220 -91.97 gain 220 158 -87.96 gain 158 221 -95.98 gain 221 158 -92.97 gain 158 222 -103.91 gain 222 158 -97.47 gain 158 223 -109.09 gain 223 158 -104.94 gain 158 224 -101.51 gain 224 158 -94.29 gain 159 160 -80.63 gain 160 159 -82.01 gain 159 161 -75.97 gain 161 159 -78.41 gain 159 162 -83.12 gain 162 159 -85.18 gain 159 163 -92.48 gain 163 159 -91.96 gain 159 164 -93.77 gain 164 159 -100.48 gain 159 165 -106.96 gain 165 159 -111.03 gain 159 166 -96.81 gain 166 159 -102.54 gain 159 167 -98.99 gain 167 159 -103.54 gain 159 168 -97.63 gain 168 159 -101.24 gain 159 169 -100.80 gain 169 159 -100.93 gain 159 170 -90.87 gain 170 159 -91.94 gain 159 171 -90.32 gain 171 159 -91.96 gain 159 172 -86.96 gain 172 159 -91.40 gain 159 173 -81.01 gain 173 159 -79.76 gain 159 174 -73.55 gain 174 159 -78.26 gain 159 175 -81.48 gain 175 159 -77.98 gain 159 176 -86.14 gain 176 159 -86.87 gain 159 177 -82.05 gain 177 159 -85.15 gain 159 178 -91.37 gain 178 159 -92.08 gain 159 179 -94.96 gain 179 159 -98.70 gain 159 180 -101.08 gain 180 159 -103.56 gain 159 181 -98.33 gain 181 159 -104.21 gain 159 182 -107.33 gain 182 159 -109.34 gain 159 183 -103.22 gain 183 159 -101.12 gain 159 184 -95.00 gain 184 159 -99.12 gain 159 185 -91.07 gain 185 159 -93.70 gain 159 186 -91.86 gain 186 159 -95.19 gain 159 187 -84.62 gain 187 159 -87.98 gain 159 188 -91.44 gain 188 159 -99.24 gain 159 189 -83.28 gain 189 159 -87.13 gain 159 190 -79.11 gain 190 159 -75.80 gain 159 191 -84.21 gain 191 159 -84.07 gain 159 192 -85.83 gain 192 159 -89.36 gain 159 193 -92.31 gain 193 159 -91.86 gain 159 194 -88.24 gain 194 159 -87.69 gain 159 195 -109.49 gain 195 159 -106.90 gain 159 196 -105.42 gain 196 159 -110.51 gain 159 197 -97.72 gain 197 159 -100.30 gain 159 198 -88.96 gain 198 159 -94.18 gain 159 199 -96.57 gain 199 159 -95.81 gain 159 200 -98.86 gain 200 159 -100.01 gain 159 201 -98.33 gain 201 159 -102.57 gain 159 202 -91.09 gain 202 159 -93.63 gain 159 203 -92.27 gain 203 159 -94.90 gain 159 204 -81.65 gain 204 159 -82.50 gain 159 205 -82.16 gain 205 159 -82.68 gain 159 206 -95.06 gain 206 159 -96.91 gain 159 207 -88.42 gain 207 159 -88.01 gain 159 208 -88.77 gain 208 159 -91.66 gain 159 209 -95.68 gain 209 159 -97.61 gain 159 210 -101.67 gain 210 159 -107.60 gain 159 211 -103.06 gain 211 159 -106.38 gain 159 212 -100.22 gain 212 159 -102.09 gain 159 213 -102.67 gain 213 159 -107.28 gain 159 214 -99.37 gain 214 159 -102.16 gain 159 215 -93.65 gain 215 159 -98.26 gain 159 216 -94.64 gain 216 159 -96.14 gain 159 217 -82.09 gain 217 159 -88.04 gain 159 218 -91.84 gain 218 159 -99.11 gain 159 219 -92.03 gain 219 159 -96.87 gain 159 220 -91.45 gain 220 159 -93.40 gain 159 221 -100.53 gain 221 159 -103.48 gain 159 222 -86.68 gain 222 159 -86.21 gain 159 223 -96.04 gain 223 159 -97.85 gain 159 224 -96.37 gain 224 159 -95.11 gain 160 161 -70.77 gain 161 160 -71.82 gain 160 162 -85.80 gain 162 160 -86.49 gain 160 163 -88.13 gain 163 160 -86.24 gain 160 164 -93.69 gain 164 160 -99.02 gain 160 165 -104.45 gain 165 160 -107.14 gain 160 166 -102.77 gain 166 160 -107.12 gain 160 167 -101.12 gain 167 160 -104.29 gain 160 168 -97.20 gain 168 160 -99.44 gain 160 169 -98.49 gain 169 160 -97.24 gain 160 170 -92.32 gain 170 160 -92.01 gain 160 171 -94.29 gain 171 160 -94.55 gain 160 172 -92.49 gain 172 160 -95.55 gain 160 173 -91.67 gain 173 160 -89.04 gain 160 174 -80.04 gain 174 160 -83.37 gain 160 175 -79.23 gain 175 160 -74.36 gain 160 176 -80.77 gain 176 160 -80.13 gain 160 177 -84.60 gain 177 160 -86.32 gain 160 178 -82.69 gain 178 160 -82.01 gain 160 179 -92.31 gain 179 160 -94.68 gain 160 180 -99.46 gain 180 160 -100.56 gain 160 181 -105.16 gain 181 160 -109.66 gain 160 182 -103.20 gain 182 160 -103.84 gain 160 183 -100.43 gain 183 160 -96.95 gain 160 184 -100.08 gain 184 160 -102.83 gain 160 185 -98.99 gain 185 160 -100.23 gain 160 186 -91.91 gain 186 160 -93.86 gain 160 187 -88.64 gain 187 160 -90.61 gain 160 188 -90.07 gain 188 160 -96.49 gain 160 189 -80.06 gain 189 160 -82.53 gain 160 190 -85.84 gain 190 160 -81.15 gain 160 191 -90.81 gain 191 160 -89.28 gain 160 192 -88.97 gain 192 160 -91.12 gain 160 193 -92.14 gain 193 160 -90.31 gain 160 194 -95.35 gain 194 160 -93.41 gain 160 195 -104.86 gain 195 160 -100.90 gain 160 196 -103.28 gain 196 160 -106.98 gain 160 197 -109.88 gain 197 160 -111.07 gain 160 198 -96.35 gain 198 160 -100.19 gain 160 199 -101.15 gain 199 160 -99.01 gain 160 200 -104.09 gain 200 160 -103.86 gain 160 201 -96.87 gain 201 160 -99.73 gain 160 202 -94.23 gain 202 160 -95.39 gain 160 203 -93.05 gain 203 160 -94.30 gain 160 204 -90.99 gain 204 160 -90.46 gain 160 205 -83.51 gain 205 160 -82.65 gain 160 206 -91.16 gain 206 160 -91.62 gain 160 207 -101.45 gain 207 160 -99.66 gain 160 208 -89.73 gain 208 160 -91.24 gain 160 209 -91.17 gain 209 160 -91.72 gain 160 210 -108.02 gain 210 160 -112.57 gain 160 211 -111.69 gain 211 160 -113.63 gain 160 212 -100.95 gain 212 160 -101.44 gain 160 213 -99.97 gain 213 160 -103.20 gain 160 214 -92.68 gain 214 160 -94.09 gain 160 215 -102.31 gain 215 160 -105.53 gain 160 216 -100.40 gain 216 160 -100.52 gain 160 217 -95.52 gain 217 160 -100.09 gain 160 218 -100.59 gain 218 160 -106.47 gain 160 219 -91.10 gain 219 160 -94.57 gain 160 220 -90.34 gain 220 160 -90.92 gain 160 221 -90.58 gain 221 160 -92.15 gain 160 222 -101.85 gain 222 160 -100.00 gain 160 223 -94.00 gain 223 160 -94.43 gain 160 224 -90.48 gain 224 160 -87.84 gain 161 162 -77.42 gain 162 161 -77.04 gain 161 163 -91.03 gain 163 161 -88.08 gain 161 164 -88.02 gain 164 161 -92.30 gain 161 165 -103.84 gain 165 161 -105.48 gain 161 166 -111.09 gain 166 161 -114.38 gain 161 167 -96.49 gain 167 161 -98.60 gain 161 168 -100.82 gain 168 161 -102.00 gain 161 169 -99.60 gain 169 161 -97.30 gain 161 170 -92.32 gain 170 161 -90.95 gain 161 171 -101.90 gain 171 161 -101.11 gain 161 172 -93.97 gain 172 161 -95.97 gain 161 173 -93.15 gain 173 161 -89.47 gain 161 174 -87.82 gain 174 161 -90.10 gain 161 175 -76.28 gain 175 161 -70.36 gain 161 176 -79.59 gain 176 161 -77.89 gain 161 177 -84.92 gain 177 161 -85.58 gain 161 178 -92.31 gain 178 161 -90.57 gain 161 179 -89.75 gain 179 161 -91.06 gain 161 180 -107.59 gain 180 161 -107.64 gain 161 181 -98.35 gain 181 161 -101.80 gain 161 182 -99.22 gain 182 161 -98.80 gain 161 183 -100.63 gain 183 161 -96.09 gain 161 184 -101.63 gain 184 161 -103.33 gain 161 185 -101.14 gain 185 161 -101.33 gain 161 186 -98.52 gain 186 161 -99.42 gain 161 187 -99.86 gain 187 161 -100.78 gain 161 188 -97.83 gain 188 161 -103.19 gain 161 189 -91.78 gain 189 161 -93.20 gain 161 190 -80.48 gain 190 161 -74.74 gain 161 191 -79.99 gain 191 161 -77.42 gain 161 192 -86.75 gain 192 161 -87.85 gain 161 193 -91.54 gain 193 161 -88.66 gain 161 194 -95.79 gain 194 161 -92.80 gain 161 195 -112.43 gain 195 161 -107.41 gain 161 196 -103.13 gain 196 161 -105.79 gain 161 197 -102.29 gain 197 161 -102.43 gain 161 198 -110.43 gain 198 161 -113.22 gain 161 199 -104.76 gain 199 161 -101.56 gain 161 200 -103.26 gain 200 161 -101.97 gain 161 201 -92.99 gain 201 161 -94.80 gain 161 202 -96.11 gain 202 161 -96.21 gain 161 203 -101.19 gain 203 161 -101.39 gain 161 204 -92.90 gain 204 161 -91.32 gain 161 205 -92.77 gain 205 161 -90.86 gain 161 206 -79.69 gain 206 161 -79.11 gain 161 207 -87.76 gain 207 161 -84.92 gain 161 208 -94.74 gain 208 161 -95.19 gain 161 209 -98.52 gain 209 161 -98.02 gain 161 210 -109.85 gain 210 161 -113.34 gain 161 211 -109.72 gain 211 161 -110.61 gain 161 212 -101.09 gain 212 161 -100.53 gain 161 213 -107.19 gain 213 161 -109.37 gain 161 214 -108.28 gain 214 161 -108.64 gain 161 215 -99.19 gain 215 161 -101.36 gain 161 216 -99.84 gain 216 161 -98.90 gain 161 217 -96.93 gain 217 161 -100.45 gain 161 218 -97.32 gain 218 161 -102.15 gain 161 219 -101.42 gain 219 161 -103.83 gain 161 220 -97.77 gain 220 161 -97.29 gain 161 221 -92.15 gain 221 161 -92.66 gain 161 222 -90.49 gain 222 161 -87.58 gain 161 223 -103.49 gain 223 161 -102.87 gain 161 224 -94.37 gain 224 161 -90.68 gain 162 163 -79.85 gain 163 162 -77.27 gain 162 164 -84.07 gain 164 162 -88.72 gain 162 165 -104.68 gain 165 162 -106.68 gain 162 166 -110.91 gain 166 162 -114.57 gain 162 167 -110.38 gain 167 162 -112.87 gain 162 168 -104.66 gain 168 162 -106.21 gain 162 169 -102.60 gain 169 162 -100.66 gain 162 170 -92.38 gain 170 162 -91.38 gain 162 171 -96.74 gain 171 162 -96.32 gain 162 172 -102.07 gain 172 162 -104.44 gain 162 173 -88.14 gain 173 162 -84.84 gain 162 174 -94.49 gain 174 162 -97.14 gain 162 175 -87.18 gain 175 162 -81.63 gain 162 176 -83.61 gain 176 162 -82.28 gain 162 177 -71.91 gain 177 162 -72.94 gain 162 178 -77.22 gain 178 162 -75.86 gain 162 179 -91.68 gain 179 162 -93.37 gain 162 180 -104.46 gain 180 162 -104.88 gain 162 181 -108.98 gain 181 162 -112.80 gain 162 182 -106.98 gain 182 162 -106.93 gain 162 183 -107.61 gain 183 162 -103.45 gain 162 184 -104.85 gain 184 162 -106.92 gain 162 185 -103.99 gain 185 162 -104.55 gain 162 186 -100.82 gain 186 162 -102.09 gain 162 187 -94.98 gain 187 162 -96.27 gain 162 188 -91.40 gain 188 162 -97.13 gain 162 189 -83.22 gain 189 162 -85.01 gain 162 190 -91.37 gain 190 162 -86.00 gain 162 191 -82.75 gain 191 162 -80.55 gain 162 192 -80.29 gain 192 162 -81.76 gain 162 193 -82.73 gain 193 162 -80.22 gain 162 194 -84.20 gain 194 162 -81.58 gain 162 195 -116.07 gain 195 162 -111.43 gain 162 196 -103.52 gain 196 162 -106.54 gain 162 197 -110.14 gain 197 162 -110.65 gain 162 198 -107.36 gain 198 162 -110.51 gain 162 199 -107.27 gain 199 162 -104.44 gain 162 200 -105.96 gain 200 162 -105.05 gain 162 201 -99.03 gain 201 162 -101.20 gain 162 202 -103.87 gain 202 162 -104.35 gain 162 203 -96.63 gain 203 162 -97.20 gain 162 204 -95.57 gain 204 162 -94.37 gain 162 205 -91.37 gain 205 162 -89.83 gain 162 206 -93.89 gain 206 162 -93.68 gain 162 207 -87.90 gain 207 162 -85.43 gain 162 208 -84.53 gain 208 162 -85.36 gain 162 209 -84.98 gain 209 162 -84.85 gain 162 210 -110.98 gain 210 162 -114.85 gain 162 211 -103.02 gain 211 162 -104.28 gain 162 212 -104.92 gain 212 162 -104.73 gain 162 213 -102.28 gain 213 162 -104.82 gain 162 214 -102.04 gain 214 162 -102.77 gain 162 215 -95.87 gain 215 162 -98.41 gain 162 216 -101.90 gain 216 162 -101.33 gain 162 217 -100.33 gain 217 162 -104.22 gain 162 218 -96.62 gain 218 162 -101.83 gain 162 219 -95.20 gain 219 162 -97.98 gain 162 220 -95.71 gain 220 162 -95.61 gain 162 221 -99.40 gain 221 162 -100.29 gain 162 222 -96.26 gain 222 162 -93.72 gain 162 223 -92.38 gain 223 162 -92.13 gain 162 224 -89.32 gain 224 162 -86.00 gain 163 164 -71.83 gain 164 163 -79.06 gain 163 165 -102.69 gain 165 163 -107.27 gain 163 166 -99.11 gain 166 163 -105.35 gain 163 167 -112.15 gain 167 163 -117.22 gain 163 168 -106.84 gain 168 163 -110.97 gain 163 169 -110.69 gain 169 163 -111.34 gain 163 170 -97.81 gain 170 163 -99.39 gain 163 171 -96.63 gain 171 163 -98.78 gain 163 172 -96.51 gain 172 163 -101.46 gain 163 173 -91.47 gain 173 163 -90.74 gain 163 174 -89.90 gain 174 163 -95.13 gain 163 175 -86.25 gain 175 163 -83.27 gain 163 176 -92.17 gain 176 163 -93.42 gain 163 177 -80.16 gain 177 163 -83.77 gain 163 178 -75.57 gain 178 163 -76.79 gain 163 179 -81.13 gain 179 163 -85.39 gain 163 180 -110.12 gain 180 163 -113.11 gain 163 181 -103.13 gain 181 163 -109.53 gain 163 182 -99.52 gain 182 163 -102.05 gain 163 183 -103.69 gain 183 163 -102.11 gain 163 184 -103.70 gain 184 163 -108.34 gain 163 185 -109.62 gain 185 163 -112.76 gain 163 186 -97.34 gain 186 163 -101.19 gain 163 187 -97.37 gain 187 163 -101.24 gain 163 188 -89.42 gain 188 163 -97.73 gain 163 189 -87.87 gain 189 163 -92.24 gain 163 190 -91.77 gain 190 163 -88.97 gain 163 191 -94.03 gain 191 163 -94.40 gain 163 192 -86.20 gain 192 163 -90.25 gain 163 193 -81.01 gain 193 163 -81.08 gain 163 194 -84.17 gain 194 163 -84.13 gain 163 195 -104.72 gain 195 163 -102.65 gain 163 196 -108.39 gain 196 163 -113.99 gain 163 197 -99.82 gain 197 163 -102.91 gain 163 198 -104.32 gain 198 163 -110.05 gain 163 199 -111.78 gain 199 163 -111.53 gain 163 200 -102.78 gain 200 163 -104.44 gain 163 201 -97.86 gain 201 163 -102.62 gain 163 202 -95.75 gain 202 163 -98.81 gain 163 203 -98.12 gain 203 163 -101.27 gain 163 204 -94.13 gain 204 163 -95.51 gain 163 205 -91.02 gain 205 163 -92.06 gain 163 206 -92.18 gain 206 163 -94.54 gain 163 207 -82.81 gain 207 163 -82.91 gain 163 208 -82.61 gain 208 163 -86.02 gain 163 209 -88.89 gain 209 163 -91.34 gain 163 210 -107.98 gain 210 163 -114.43 gain 163 211 -101.69 gain 211 163 -105.53 gain 163 212 -105.65 gain 212 163 -108.04 gain 163 213 -103.01 gain 213 163 -108.14 gain 163 214 -102.53 gain 214 163 -105.84 gain 163 215 -104.31 gain 215 163 -109.44 gain 163 216 -99.64 gain 216 163 -101.65 gain 163 217 -97.34 gain 217 163 -103.80 gain 163 218 -90.42 gain 218 163 -98.20 gain 163 219 -92.20 gain 219 163 -97.56 gain 163 220 -88.77 gain 220 163 -91.25 gain 163 221 -93.66 gain 221 163 -97.12 gain 163 222 -86.42 gain 222 163 -86.46 gain 163 223 -98.94 gain 223 163 -101.27 gain 163 224 -96.42 gain 224 163 -95.68 gain 164 165 -106.83 gain 165 164 -104.18 gain 164 166 -112.93 gain 166 164 -111.94 gain 164 167 -108.68 gain 167 164 -106.52 gain 164 168 -111.82 gain 168 164 -108.73 gain 164 169 -107.77 gain 169 164 -101.18 gain 164 170 -111.27 gain 170 164 -105.63 gain 164 171 -115.07 gain 171 164 -110.00 gain 164 172 -103.32 gain 172 164 -101.04 gain 164 173 -107.28 gain 173 164 -99.32 gain 164 174 -107.68 gain 174 164 -105.68 gain 164 175 -101.53 gain 175 164 -91.33 gain 164 176 -96.50 gain 176 164 -90.52 gain 164 177 -89.36 gain 177 164 -85.74 gain 164 178 -83.85 gain 178 164 -77.84 gain 164 179 -79.23 gain 179 164 -76.27 gain 164 180 -108.59 gain 180 164 -104.36 gain 164 181 -112.31 gain 181 164 -111.48 gain 164 182 -116.06 gain 182 164 -111.37 gain 164 183 -112.79 gain 183 164 -103.98 gain 164 184 -107.46 gain 184 164 -104.87 gain 164 185 -107.48 gain 185 164 -103.39 gain 164 186 -109.46 gain 186 164 -106.08 gain 164 187 -103.78 gain 187 164 -100.42 gain 164 188 -96.10 gain 188 164 -97.18 gain 164 189 -104.04 gain 189 164 -101.18 gain 164 190 -101.82 gain 190 164 -91.80 gain 164 191 -89.70 gain 191 164 -82.85 gain 164 192 -93.87 gain 192 164 -90.69 gain 164 193 -94.62 gain 193 164 -87.46 gain 164 194 -92.85 gain 194 164 -85.58 gain 164 195 -117.14 gain 195 164 -107.84 gain 164 196 -118.29 gain 196 164 -116.67 gain 164 197 -113.77 gain 197 164 -109.64 gain 164 198 -106.98 gain 198 164 -105.48 gain 164 199 -103.83 gain 199 164 -96.35 gain 164 200 -109.64 gain 200 164 -104.08 gain 164 201 -111.96 gain 201 164 -109.48 gain 164 202 -108.83 gain 202 164 -104.66 gain 164 203 -108.74 gain 203 164 -104.66 gain 164 204 -100.56 gain 204 164 -94.71 gain 164 205 -100.50 gain 205 164 -94.31 gain 164 206 -98.69 gain 206 164 -93.82 gain 164 207 -92.50 gain 207 164 -85.38 gain 164 208 -100.36 gain 208 164 -96.54 gain 164 209 -99.74 gain 209 164 -94.96 gain 164 210 -121.11 gain 210 164 -120.33 gain 164 211 -115.26 gain 211 164 -111.87 gain 164 212 -108.47 gain 212 164 -103.63 gain 164 213 -109.82 gain 213 164 -107.71 gain 164 214 -112.06 gain 214 164 -108.14 gain 164 215 -113.66 gain 215 164 -111.56 gain 164 216 -106.56 gain 216 164 -101.34 gain 164 217 -105.99 gain 217 164 -105.23 gain 164 218 -107.27 gain 218 164 -107.82 gain 164 219 -99.30 gain 219 164 -97.43 gain 164 220 -99.43 gain 220 164 -94.67 gain 164 221 -103.04 gain 221 164 -99.28 gain 164 222 -102.73 gain 222 164 -95.54 gain 164 223 -99.81 gain 223 164 -94.91 gain 164 224 -97.59 gain 224 164 -89.63 gain 165 166 -76.96 gain 166 165 -78.62 gain 165 167 -86.11 gain 167 165 -86.59 gain 165 168 -87.50 gain 168 165 -87.05 gain 165 169 -95.57 gain 169 165 -91.64 gain 165 170 -96.75 gain 170 165 -93.75 gain 165 171 -101.88 gain 171 165 -99.45 gain 165 172 -102.87 gain 172 165 -103.24 gain 165 173 -97.02 gain 173 165 -91.71 gain 165 174 -112.06 gain 174 165 -112.70 gain 165 175 -107.32 gain 175 165 -99.77 gain 165 176 -107.86 gain 176 165 -104.52 gain 165 177 -106.99 gain 177 165 -106.02 gain 165 178 -119.86 gain 178 165 -116.49 gain 165 179 -112.19 gain 179 165 -111.87 gain 165 180 -83.80 gain 180 165 -82.22 gain 165 181 -83.95 gain 181 165 -85.76 gain 165 182 -89.34 gain 182 165 -87.29 gain 165 183 -94.09 gain 183 165 -87.93 gain 165 184 -88.80 gain 184 165 -88.86 gain 165 185 -99.50 gain 185 165 -98.06 gain 165 186 -112.76 gain 186 165 -112.02 gain 165 187 -107.10 gain 187 165 -106.39 gain 165 188 -94.99 gain 188 165 -98.72 gain 165 189 -107.23 gain 189 165 -107.02 gain 165 190 -111.47 gain 190 165 -104.09 gain 165 191 -110.31 gain 191 165 -106.10 gain 165 192 -118.84 gain 192 165 -118.30 gain 165 193 -107.88 gain 193 165 -103.37 gain 165 194 -110.96 gain 194 165 -106.34 gain 165 195 -90.02 gain 195 165 -83.37 gain 165 196 -92.65 gain 196 165 -93.67 gain 165 197 -83.14 gain 197 165 -81.65 gain 165 198 -95.98 gain 198 165 -97.14 gain 165 199 -95.74 gain 199 165 -90.91 gain 165 200 -102.27 gain 200 165 -99.36 gain 165 201 -101.62 gain 201 165 -101.79 gain 165 202 -105.21 gain 202 165 -103.68 gain 165 203 -102.84 gain 203 165 -101.41 gain 165 204 -101.81 gain 204 165 -98.60 gain 165 205 -110.49 gain 205 165 -106.95 gain 165 206 -113.26 gain 206 165 -111.04 gain 165 207 -111.82 gain 207 165 -107.34 gain 165 208 -116.23 gain 208 165 -115.05 gain 165 209 -112.55 gain 209 165 -110.41 gain 165 210 -96.13 gain 210 165 -97.99 gain 165 211 -85.81 gain 211 165 -85.07 gain 165 212 -97.28 gain 212 165 -95.08 gain 165 213 -102.36 gain 213 165 -102.90 gain 165 214 -99.95 gain 214 165 -98.68 gain 165 215 -98.86 gain 215 165 -99.40 gain 165 216 -101.58 gain 216 165 -99.02 gain 165 217 -106.59 gain 217 165 -108.47 gain 165 218 -106.17 gain 218 165 -109.37 gain 165 219 -111.64 gain 219 165 -112.41 gain 165 220 -104.92 gain 220 165 -102.81 gain 165 221 -109.30 gain 221 165 -108.18 gain 165 222 -109.07 gain 222 165 -104.52 gain 165 223 -114.89 gain 223 165 -112.64 gain 165 224 -111.62 gain 224 165 -106.30 gain 166 167 -77.75 gain 167 166 -76.57 gain 166 168 -92.89 gain 168 166 -90.77 gain 166 169 -87.39 gain 169 166 -81.80 gain 166 170 -95.32 gain 170 166 -90.66 gain 166 171 -92.72 gain 171 166 -88.63 gain 166 172 -108.12 gain 172 166 -106.83 gain 166 173 -115.53 gain 173 166 -108.56 gain 166 174 -100.08 gain 174 166 -99.07 gain 166 175 -110.16 gain 175 166 -100.95 gain 166 176 -110.57 gain 176 166 -105.58 gain 166 177 -110.94 gain 177 166 -108.31 gain 166 178 -104.21 gain 178 166 -99.19 gain 166 179 -108.59 gain 179 166 -106.61 gain 166 180 -87.17 gain 180 166 -83.92 gain 166 181 -79.79 gain 181 166 -79.95 gain 166 182 -94.17 gain 182 166 -90.46 gain 166 183 -90.18 gain 183 166 -82.35 gain 166 184 -101.03 gain 184 166 -99.43 gain 166 185 -94.84 gain 185 166 -91.74 gain 166 186 -100.63 gain 186 166 -98.24 gain 166 187 -102.79 gain 187 166 -100.42 gain 166 188 -98.18 gain 188 166 -100.25 gain 166 189 -100.42 gain 189 166 -98.55 gain 166 190 -107.87 gain 190 166 -98.84 gain 166 191 -103.96 gain 191 166 -98.10 gain 166 192 -109.78 gain 192 166 -107.59 gain 166 193 -102.52 gain 193 166 -96.35 gain 166 194 -112.76 gain 194 166 -106.48 gain 166 195 -91.31 gain 195 166 -83.00 gain 166 196 -95.48 gain 196 166 -94.84 gain 166 197 -90.09 gain 197 166 -86.94 gain 166 198 -97.66 gain 198 166 -97.15 gain 166 199 -95.52 gain 199 166 -89.03 gain 166 200 -96.96 gain 200 166 -92.39 gain 166 201 -102.46 gain 201 166 -100.98 gain 166 202 -107.94 gain 202 166 -104.76 gain 166 203 -95.76 gain 203 166 -92.67 gain 166 204 -101.93 gain 204 166 -97.07 gain 166 205 -108.25 gain 205 166 -103.05 gain 166 206 -105.91 gain 206 166 -102.03 gain 166 207 -109.27 gain 207 166 -103.14 gain 166 208 -111.20 gain 208 166 -108.36 gain 166 209 -114.74 gain 209 166 -110.95 gain 166 210 -95.22 gain 210 166 -95.43 gain 166 211 -94.05 gain 211 166 -91.65 gain 166 212 -91.72 gain 212 166 -87.87 gain 166 213 -92.33 gain 213 166 -91.22 gain 166 214 -95.49 gain 214 166 -92.56 gain 166 215 -103.14 gain 215 166 -102.02 gain 166 216 -92.65 gain 216 166 -88.43 gain 166 217 -109.61 gain 217 166 -109.83 gain 166 218 -97.36 gain 218 166 -98.90 gain 166 219 -108.44 gain 219 166 -107.56 gain 166 220 -109.45 gain 220 166 -105.68 gain 166 221 -106.79 gain 221 166 -104.02 gain 166 222 -115.09 gain 222 166 -108.89 gain 166 223 -109.79 gain 223 166 -105.88 gain 166 224 -96.27 gain 224 166 -89.29 gain 167 168 -74.35 gain 168 167 -73.41 gain 167 169 -88.12 gain 169 167 -83.70 gain 167 170 -93.65 gain 170 167 -90.17 gain 167 171 -94.32 gain 171 167 -91.41 gain 167 172 -101.32 gain 172 167 -101.21 gain 167 173 -102.31 gain 173 167 -96.52 gain 167 174 -101.88 gain 174 167 -102.04 gain 167 175 -104.86 gain 175 167 -96.82 gain 167 176 -113.33 gain 176 167 -109.52 gain 167 177 -109.80 gain 177 167 -108.35 gain 167 178 -111.17 gain 178 167 -107.33 gain 167 179 -105.82 gain 179 167 -105.02 gain 167 180 -87.25 gain 180 167 -85.19 gain 167 181 -91.88 gain 181 167 -93.21 gain 167 182 -79.01 gain 182 167 -76.48 gain 167 183 -87.49 gain 183 167 -80.84 gain 167 184 -83.66 gain 184 167 -83.24 gain 167 185 -93.07 gain 185 167 -91.15 gain 167 186 -90.29 gain 186 167 -89.07 gain 167 187 -103.40 gain 187 167 -102.20 gain 167 188 -99.26 gain 188 167 -102.50 gain 167 189 -100.31 gain 189 167 -99.62 gain 167 190 -112.42 gain 190 167 -104.56 gain 167 191 -100.65 gain 191 167 -95.96 gain 167 192 -111.30 gain 192 167 -110.28 gain 167 193 -111.46 gain 193 167 -106.46 gain 167 194 -105.78 gain 194 167 -100.68 gain 167 195 -90.58 gain 195 167 -83.45 gain 167 196 -86.15 gain 196 167 -86.68 gain 167 197 -87.64 gain 197 167 -85.67 gain 167 198 -92.42 gain 198 167 -93.09 gain 167 199 -91.87 gain 199 167 -86.56 gain 167 200 -95.77 gain 200 167 -92.37 gain 167 201 -99.32 gain 201 167 -99.02 gain 167 202 -98.94 gain 202 167 -96.93 gain 167 203 -100.36 gain 203 167 -98.45 gain 167 204 -101.82 gain 204 167 -98.13 gain 167 205 -103.15 gain 205 167 -99.12 gain 167 206 -110.25 gain 206 167 -107.55 gain 167 207 -114.43 gain 207 167 -109.47 gain 167 208 -107.17 gain 208 167 -105.51 gain 167 209 -103.49 gain 209 167 -100.87 gain 167 210 -86.85 gain 210 167 -88.23 gain 167 211 -97.06 gain 211 167 -95.84 gain 167 212 -93.83 gain 212 167 -91.16 gain 167 213 -95.00 gain 213 167 -95.06 gain 167 214 -99.04 gain 214 167 -97.29 gain 167 215 -97.44 gain 215 167 -97.50 gain 167 216 -98.59 gain 216 167 -95.54 gain 167 217 -100.44 gain 217 167 -101.85 gain 167 218 -101.96 gain 218 167 -104.68 gain 167 219 -108.87 gain 219 167 -109.16 gain 167 220 -105.08 gain 220 167 -102.48 gain 167 221 -112.53 gain 221 167 -110.93 gain 167 222 -111.22 gain 222 167 -106.20 gain 167 223 -107.05 gain 223 167 -104.31 gain 167 224 -112.87 gain 224 167 -107.07 gain 168 169 -83.50 gain 169 168 -80.02 gain 168 170 -86.05 gain 170 168 -83.50 gain 168 171 -94.47 gain 171 168 -92.49 gain 168 172 -98.76 gain 172 168 -99.58 gain 168 173 -93.54 gain 173 168 -88.68 gain 168 174 -101.93 gain 174 168 -103.03 gain 168 175 -98.03 gain 175 168 -90.92 gain 168 176 -106.49 gain 176 168 -103.61 gain 168 177 -108.92 gain 177 168 -108.40 gain 168 178 -105.70 gain 178 168 -102.79 gain 168 179 -107.49 gain 179 168 -107.62 gain 168 180 -93.41 gain 180 168 -92.28 gain 168 181 -88.97 gain 181 168 -91.24 gain 168 182 -76.80 gain 182 168 -75.20 gain 168 183 -77.93 gain 183 168 -72.21 gain 168 184 -85.35 gain 184 168 -85.87 gain 168 185 -89.73 gain 185 168 -88.74 gain 168 186 -93.79 gain 186 168 -93.51 gain 168 187 -94.28 gain 187 168 -94.02 gain 168 188 -99.61 gain 188 168 -103.79 gain 168 189 -104.42 gain 189 168 -104.67 gain 168 190 -102.23 gain 190 168 -95.30 gain 168 191 -99.42 gain 191 168 -95.67 gain 168 192 -110.12 gain 192 168 -110.04 gain 168 193 -110.41 gain 193 168 -106.36 gain 168 194 -110.73 gain 194 168 -106.56 gain 168 195 -96.55 gain 195 168 -90.35 gain 168 196 -90.81 gain 196 168 -92.28 gain 168 197 -87.25 gain 197 168 -86.21 gain 168 198 -84.66 gain 198 168 -86.26 gain 168 199 -92.04 gain 199 168 -87.66 gain 168 200 -91.94 gain 200 168 -89.48 gain 168 201 -96.13 gain 201 168 -96.76 gain 168 202 -97.73 gain 202 168 -96.65 gain 168 203 -96.99 gain 203 168 -96.01 gain 168 204 -102.78 gain 204 168 -100.02 gain 168 205 -105.42 gain 205 168 -102.33 gain 168 206 -107.67 gain 206 168 -105.90 gain 168 207 -109.74 gain 207 168 -105.72 gain 168 208 -108.73 gain 208 168 -108.00 gain 168 209 -109.45 gain 209 168 -107.77 gain 168 210 -104.10 gain 210 168 -106.42 gain 168 211 -90.65 gain 211 168 -90.36 gain 168 212 -92.89 gain 212 168 -91.15 gain 168 213 -92.74 gain 213 168 -93.74 gain 168 214 -98.33 gain 214 168 -97.51 gain 168 215 -90.78 gain 215 168 -91.78 gain 168 216 -96.19 gain 216 168 -94.08 gain 168 217 -99.28 gain 217 168 -101.62 gain 168 218 -108.07 gain 218 168 -111.72 gain 168 219 -98.69 gain 219 168 -99.92 gain 168 220 -100.39 gain 220 168 -98.73 gain 168 221 -107.00 gain 221 168 -106.34 gain 168 222 -103.24 gain 222 168 -99.15 gain 168 223 -111.91 gain 223 168 -110.11 gain 168 224 -107.33 gain 224 168 -102.46 gain 169 170 -71.67 gain 170 169 -72.61 gain 169 171 -79.92 gain 171 169 -81.43 gain 169 172 -95.14 gain 172 169 -99.45 gain 169 173 -94.25 gain 173 169 -92.87 gain 169 174 -96.55 gain 174 169 -101.13 gain 169 175 -96.95 gain 175 169 -93.33 gain 169 176 -101.32 gain 176 169 -101.93 gain 169 177 -100.53 gain 177 169 -103.50 gain 169 178 -95.95 gain 178 169 -96.53 gain 169 179 -110.55 gain 179 169 -114.17 gain 169 180 -101.12 gain 180 169 -103.48 gain 169 181 -80.15 gain 181 169 -85.91 gain 169 182 -84.05 gain 182 169 -85.93 gain 169 183 -88.97 gain 183 169 -86.74 gain 169 184 -63.17 gain 184 169 -67.17 gain 169 185 -78.90 gain 185 169 -81.40 gain 169 186 -86.01 gain 186 169 -89.21 gain 169 187 -97.64 gain 187 169 -100.87 gain 169 188 -94.50 gain 188 169 -102.17 gain 169 189 -95.59 gain 189 169 -99.31 gain 169 190 -94.28 gain 190 169 -90.84 gain 169 191 -98.54 gain 191 169 -98.27 gain 169 192 -102.05 gain 192 169 -105.46 gain 169 193 -103.84 gain 193 169 -103.27 gain 169 194 -100.22 gain 194 169 -99.53 gain 169 195 -95.82 gain 195 169 -93.10 gain 169 196 -89.44 gain 196 169 -94.40 gain 169 197 -88.37 gain 197 169 -90.82 gain 169 198 -90.67 gain 198 169 -95.76 gain 169 199 -87.48 gain 199 169 -86.59 gain 169 200 -81.24 gain 200 169 -82.27 gain 169 201 -98.62 gain 201 169 -102.73 gain 169 202 -83.08 gain 202 169 -85.49 gain 169 203 -93.76 gain 203 169 -96.26 gain 169 204 -93.64 gain 204 169 -94.36 gain 169 205 -94.39 gain 205 169 -94.78 gain 169 206 -102.37 gain 206 169 -104.08 gain 169 207 -96.63 gain 207 169 -96.09 gain 169 208 -96.90 gain 208 169 -99.66 gain 169 209 -108.21 gain 209 169 -110.01 gain 169 210 -93.55 gain 210 169 -99.35 gain 169 211 -90.91 gain 211 169 -94.10 gain 169 212 -91.05 gain 212 169 -92.80 gain 169 213 -87.16 gain 213 169 -91.64 gain 169 214 -86.78 gain 214 169 -89.44 gain 169 215 -91.21 gain 215 169 -95.69 gain 169 216 -92.53 gain 216 169 -93.90 gain 169 217 -88.77 gain 217 169 -94.60 gain 169 218 -93.90 gain 218 169 -101.03 gain 169 219 -96.62 gain 219 169 -101.33 gain 169 220 -103.47 gain 220 169 -105.30 gain 169 221 -93.98 gain 221 169 -96.80 gain 169 222 -100.58 gain 222 169 -99.98 gain 169 223 -107.38 gain 223 169 -109.07 gain 169 224 -102.11 gain 224 169 -100.73 gain 170 171 -72.23 gain 171 170 -72.80 gain 170 172 -85.56 gain 172 170 -88.93 gain 170 173 -81.28 gain 173 170 -78.97 gain 170 174 -97.31 gain 174 170 -100.95 gain 170 175 -93.13 gain 175 170 -88.57 gain 170 176 -98.36 gain 176 170 -98.03 gain 170 177 -94.48 gain 177 170 -96.51 gain 170 178 -97.48 gain 178 170 -97.11 gain 170 179 -103.10 gain 179 170 -105.78 gain 170 180 -89.13 gain 180 170 -90.55 gain 170 181 -92.61 gain 181 170 -97.42 gain 170 182 -87.92 gain 182 170 -88.86 gain 170 183 -78.43 gain 183 170 -75.26 gain 170 184 -76.16 gain 184 170 -79.22 gain 170 185 -75.49 gain 185 170 -77.05 gain 170 186 -82.45 gain 186 170 -84.72 gain 170 187 -86.28 gain 187 170 -88.57 gain 170 188 -92.69 gain 188 170 -99.42 gain 170 189 -89.80 gain 189 170 -92.59 gain 170 190 -91.36 gain 190 170 -86.98 gain 170 191 -94.57 gain 191 170 -93.36 gain 170 192 -99.59 gain 192 170 -102.05 gain 170 193 -95.22 gain 193 170 -93.71 gain 170 194 -101.86 gain 194 170 -100.24 gain 170 195 -98.93 gain 195 170 -95.28 gain 170 196 -91.86 gain 196 170 -95.88 gain 170 197 -86.63 gain 197 170 -88.14 gain 170 198 -94.35 gain 198 170 -98.50 gain 170 199 -84.66 gain 199 170 -82.83 gain 170 200 -80.33 gain 200 170 -80.42 gain 170 201 -82.60 gain 201 170 -85.77 gain 170 202 -93.18 gain 202 170 -94.65 gain 170 203 -99.08 gain 203 170 -100.65 gain 170 204 -98.05 gain 204 170 -97.84 gain 170 205 -96.00 gain 205 170 -95.46 gain 170 206 -93.29 gain 206 170 -94.07 gain 170 207 -99.03 gain 207 170 -97.56 gain 170 208 -102.22 gain 208 170 -104.04 gain 170 209 -103.86 gain 209 170 -104.72 gain 170 210 -99.36 gain 210 170 -104.22 gain 170 211 -90.47 gain 211 170 -92.73 gain 170 212 -96.63 gain 212 170 -97.43 gain 170 213 -92.53 gain 213 170 -96.07 gain 170 214 -85.82 gain 214 170 -87.54 gain 170 215 -84.57 gain 215 170 -88.11 gain 170 216 -90.85 gain 216 170 -91.28 gain 170 217 -85.72 gain 217 170 -90.60 gain 170 218 -91.04 gain 218 170 -97.24 gain 170 219 -89.13 gain 219 170 -92.90 gain 170 220 -96.06 gain 220 170 -96.95 gain 170 221 -98.98 gain 221 170 -100.86 gain 170 222 -94.37 gain 222 170 -92.83 gain 170 223 -102.68 gain 223 170 -103.43 gain 170 224 -103.45 gain 224 170 -101.12 gain 171 172 -74.61 gain 172 171 -77.41 gain 171 173 -83.12 gain 173 171 -80.24 gain 171 174 -83.85 gain 174 171 -86.92 gain 171 175 -100.37 gain 175 171 -95.25 gain 171 176 -97.46 gain 176 171 -96.56 gain 171 177 -101.71 gain 177 171 -103.17 gain 171 178 -103.88 gain 178 171 -102.94 gain 171 179 -98.03 gain 179 171 -100.14 gain 171 180 -98.61 gain 180 171 -99.45 gain 171 181 -99.17 gain 181 171 -103.41 gain 171 182 -91.56 gain 182 171 -91.94 gain 171 183 -85.04 gain 183 171 -81.30 gain 171 184 -90.38 gain 184 171 -92.87 gain 171 185 -83.10 gain 185 171 -84.09 gain 171 186 -80.13 gain 186 171 -81.82 gain 171 187 -72.35 gain 187 171 -74.07 gain 171 188 -90.89 gain 188 171 -97.04 gain 171 189 -93.54 gain 189 171 -95.76 gain 171 190 -91.25 gain 190 171 -86.30 gain 171 191 -102.04 gain 191 171 -100.27 gain 171 192 -100.36 gain 192 171 -102.25 gain 171 193 -98.69 gain 193 171 -96.60 gain 171 194 -103.86 gain 194 171 -101.67 gain 171 195 -94.44 gain 195 171 -90.22 gain 171 196 -95.27 gain 196 171 -98.72 gain 171 197 -89.66 gain 197 171 -90.59 gain 171 198 -89.13 gain 198 171 -92.71 gain 171 199 -87.21 gain 199 171 -84.81 gain 171 200 -93.28 gain 200 171 -92.79 gain 171 201 -78.60 gain 201 171 -81.20 gain 171 202 -87.55 gain 202 171 -88.45 gain 171 203 -88.87 gain 203 171 -89.87 gain 171 204 -93.38 gain 204 171 -92.60 gain 171 205 -88.82 gain 205 171 -87.70 gain 171 206 -98.76 gain 206 171 -98.97 gain 171 207 -104.61 gain 207 171 -102.56 gain 171 208 -99.23 gain 208 171 -100.48 gain 171 209 -103.41 gain 209 171 -103.71 gain 171 210 -102.81 gain 210 171 -107.11 gain 171 211 -101.78 gain 211 171 -103.46 gain 171 212 -91.81 gain 212 171 -92.04 gain 171 213 -84.37 gain 213 171 -87.34 gain 171 214 -93.06 gain 214 171 -94.21 gain 171 215 -87.74 gain 215 171 -90.71 gain 171 216 -82.16 gain 216 171 -82.02 gain 171 217 -87.86 gain 217 171 -92.17 gain 171 218 -91.06 gain 218 171 -96.69 gain 171 219 -96.88 gain 219 171 -100.09 gain 171 220 -91.74 gain 220 171 -92.06 gain 171 221 -94.15 gain 221 171 -95.46 gain 171 222 -98.35 gain 222 171 -96.24 gain 171 223 -104.57 gain 223 171 -104.75 gain 171 224 -101.25 gain 224 171 -98.36 gain 172 173 -79.34 gain 173 172 -73.66 gain 172 174 -92.97 gain 174 172 -93.25 gain 172 175 -93.28 gain 175 172 -85.35 gain 172 176 -90.16 gain 176 172 -86.46 gain 172 177 -103.29 gain 177 172 -101.95 gain 172 178 -100.46 gain 178 172 -96.72 gain 172 179 -97.26 gain 179 172 -96.57 gain 172 180 -104.22 gain 180 172 -102.27 gain 172 181 -105.75 gain 181 172 -107.19 gain 172 182 -97.72 gain 182 172 -95.30 gain 172 183 -96.38 gain 183 172 -89.85 gain 172 184 -94.37 gain 184 172 -94.06 gain 172 185 -90.70 gain 185 172 -88.89 gain 172 186 -81.03 gain 186 172 -79.92 gain 172 187 -82.45 gain 187 172 -81.37 gain 172 188 -86.96 gain 188 172 -90.32 gain 172 189 -90.54 gain 189 172 -89.96 gain 172 190 -91.44 gain 190 172 -83.69 gain 172 191 -97.21 gain 191 172 -92.64 gain 172 192 -97.88 gain 192 172 -96.98 gain 172 193 -98.42 gain 193 172 -93.54 gain 172 194 -106.64 gain 194 172 -101.65 gain 172 195 -108.16 gain 195 172 -101.14 gain 172 196 -105.05 gain 196 172 -105.70 gain 172 197 -105.17 gain 197 172 -103.31 gain 172 198 -101.48 gain 198 172 -102.27 gain 172 199 -94.67 gain 199 172 -89.47 gain 172 200 -85.78 gain 200 172 -82.49 gain 172 201 -78.53 gain 201 172 -78.33 gain 172 202 -83.64 gain 202 172 -81.74 gain 172 203 -91.14 gain 203 172 -89.34 gain 172 204 -91.98 gain 204 172 -88.40 gain 172 205 -91.54 gain 205 172 -87.63 gain 172 206 -95.59 gain 206 172 -93.00 gain 172 207 -99.81 gain 207 172 -94.96 gain 172 208 -100.86 gain 208 172 -99.32 gain 172 209 -105.68 gain 209 172 -103.17 gain 172 210 -111.16 gain 210 172 -112.65 gain 172 211 -94.66 gain 211 172 -93.55 gain 172 212 -101.38 gain 212 172 -98.82 gain 172 213 -95.40 gain 213 172 -95.57 gain 172 214 -92.18 gain 214 172 -90.54 gain 172 215 -94.58 gain 215 172 -94.75 gain 172 216 -96.79 gain 216 172 -93.86 gain 172 217 -97.23 gain 217 172 -98.74 gain 172 218 -89.66 gain 218 172 -92.49 gain 172 219 -100.08 gain 219 172 -100.49 gain 172 220 -94.95 gain 220 172 -92.47 gain 172 221 -107.02 gain 221 172 -105.53 gain 172 222 -97.05 gain 222 172 -92.14 gain 172 223 -94.83 gain 223 172 -92.21 gain 172 224 -105.57 gain 224 172 -99.88 gain 173 174 -75.99 gain 174 173 -81.95 gain 173 175 -83.71 gain 175 173 -81.47 gain 173 176 -86.01 gain 176 173 -87.99 gain 173 177 -90.67 gain 177 173 -95.01 gain 173 178 -90.91 gain 178 173 -92.85 gain 173 179 -93.17 gain 179 173 -98.16 gain 173 180 -102.84 gain 180 173 -106.57 gain 173 181 -96.73 gain 181 173 -103.85 gain 173 182 -96.40 gain 182 173 -99.66 gain 173 183 -92.46 gain 183 173 -91.60 gain 173 184 -91.02 gain 184 173 -96.40 gain 173 185 -86.78 gain 185 173 -90.65 gain 173 186 -89.32 gain 186 173 -93.89 gain 173 187 -73.31 gain 187 173 -77.91 gain 173 188 -73.31 gain 188 173 -82.35 gain 173 189 -74.25 gain 189 173 -79.35 gain 173 190 -84.87 gain 190 173 -82.80 gain 173 191 -87.46 gain 191 173 -88.56 gain 173 192 -98.10 gain 192 173 -102.88 gain 173 193 -91.07 gain 193 173 -91.87 gain 173 194 -89.44 gain 194 173 -90.13 gain 173 195 -99.42 gain 195 173 -98.08 gain 173 196 -99.95 gain 196 173 -106.28 gain 173 197 -88.98 gain 197 173 -92.80 gain 173 198 -92.08 gain 198 173 -98.55 gain 173 199 -90.59 gain 199 173 -91.07 gain 173 200 -92.01 gain 200 173 -94.40 gain 173 201 -84.93 gain 201 173 -90.42 gain 173 202 -79.36 gain 202 173 -83.14 gain 173 203 -79.19 gain 203 173 -83.07 gain 173 204 -89.65 gain 204 173 -91.75 gain 173 205 -82.19 gain 205 173 -83.96 gain 173 206 -92.65 gain 206 173 -95.74 gain 173 207 -95.53 gain 207 173 -96.37 gain 173 208 -97.17 gain 208 173 -101.30 gain 173 209 -91.48 gain 209 173 -94.65 gain 173 210 -92.24 gain 210 173 -99.42 gain 173 211 -99.84 gain 211 173 -104.41 gain 173 212 -92.33 gain 212 173 -95.45 gain 173 213 -97.99 gain 213 173 -103.85 gain 173 214 -91.94 gain 214 173 -95.98 gain 173 215 -88.59 gain 215 173 -94.44 gain 173 216 -98.37 gain 216 173 -101.12 gain 173 217 -91.58 gain 217 173 -98.78 gain 173 218 -86.79 gain 218 173 -95.30 gain 173 219 -90.76 gain 219 173 -96.85 gain 173 220 -90.93 gain 220 173 -94.13 gain 173 221 -90.20 gain 221 173 -94.39 gain 173 222 -89.78 gain 222 173 -90.55 gain 173 223 -98.04 gain 223 173 -101.09 gain 173 224 -97.70 gain 224 173 -97.69 gain 174 175 -81.82 gain 175 174 -73.61 gain 174 176 -87.96 gain 176 174 -83.98 gain 174 177 -90.86 gain 177 174 -89.25 gain 174 178 -97.56 gain 178 174 -93.55 gain 174 179 -94.79 gain 179 174 -93.83 gain 174 180 -99.08 gain 180 174 -96.85 gain 174 181 -109.11 gain 181 174 -110.28 gain 174 182 -109.92 gain 182 174 -107.22 gain 174 183 -99.09 gain 183 174 -92.27 gain 174 184 -101.71 gain 184 174 -101.13 gain 174 185 -100.39 gain 185 174 -98.30 gain 174 186 -94.36 gain 186 174 -92.98 gain 174 187 -89.39 gain 187 174 -88.03 gain 174 188 -80.09 gain 188 174 -83.17 gain 174 189 -76.16 gain 189 174 -75.30 gain 174 190 -79.87 gain 190 174 -71.84 gain 174 191 -94.23 gain 191 174 -89.38 gain 174 192 -97.24 gain 192 174 -96.06 gain 174 193 -98.82 gain 193 174 -93.67 gain 174 194 -97.16 gain 194 174 -91.89 gain 174 195 -114.83 gain 195 174 -107.54 gain 174 196 -108.51 gain 196 174 -108.88 gain 174 197 -109.14 gain 197 174 -107.01 gain 174 198 -104.01 gain 198 174 -104.52 gain 174 199 -97.93 gain 199 174 -92.45 gain 174 200 -94.35 gain 200 174 -90.79 gain 174 201 -101.45 gain 201 174 -100.98 gain 174 202 -92.97 gain 202 174 -90.80 gain 174 203 -92.83 gain 203 174 -90.75 gain 174 204 -85.47 gain 204 174 -81.62 gain 174 205 -91.08 gain 205 174 -86.89 gain 174 206 -95.30 gain 206 174 -92.43 gain 174 207 -91.07 gain 207 174 -85.95 gain 174 208 -95.04 gain 208 174 -93.22 gain 174 209 -104.06 gain 209 174 -101.28 gain 174 210 -113.79 gain 210 174 -115.01 gain 174 211 -106.58 gain 211 174 -105.19 gain 174 212 -99.32 gain 212 174 -96.48 gain 174 213 -104.13 gain 213 174 -104.02 gain 174 214 -98.96 gain 214 174 -97.04 gain 174 215 -103.03 gain 215 174 -102.93 gain 174 216 -101.23 gain 216 174 -98.01 gain 174 217 -89.73 gain 217 174 -90.97 gain 174 218 -86.02 gain 218 174 -88.57 gain 174 219 -92.38 gain 219 174 -92.51 gain 174 220 -93.98 gain 220 174 -91.23 gain 174 221 -95.37 gain 221 174 -93.60 gain 174 222 -102.03 gain 222 174 -96.85 gain 174 223 -103.04 gain 223 174 -100.14 gain 174 224 -105.12 gain 224 174 -99.15 gain 175 176 -71.09 gain 176 175 -75.31 gain 175 177 -75.46 gain 177 175 -82.05 gain 175 178 -83.26 gain 178 175 -87.46 gain 175 179 -86.89 gain 179 175 -94.12 gain 175 180 -96.45 gain 180 175 -102.42 gain 175 181 -96.35 gain 181 175 -105.72 gain 175 182 -96.96 gain 182 175 -102.47 gain 175 183 -94.60 gain 183 175 -96.00 gain 175 184 -97.29 gain 184 175 -104.91 gain 175 185 -91.15 gain 185 175 -97.26 gain 175 186 -82.50 gain 186 175 -89.32 gain 175 187 -84.93 gain 187 175 -91.77 gain 175 188 -80.11 gain 188 175 -91.40 gain 175 189 -79.44 gain 189 175 -86.78 gain 175 190 -65.16 gain 190 175 -65.34 gain 175 191 -68.45 gain 191 175 -71.80 gain 175 192 -73.58 gain 192 175 -80.60 gain 175 193 -87.29 gain 193 175 -90.34 gain 175 194 -92.32 gain 194 175 -95.26 gain 175 195 -97.60 gain 195 175 -98.50 gain 175 196 -103.85 gain 196 175 -112.42 gain 175 197 -97.95 gain 197 175 -104.01 gain 175 198 -92.44 gain 198 175 -101.15 gain 175 199 -100.32 gain 199 175 -103.05 gain 175 200 -88.93 gain 200 175 -93.57 gain 175 201 -92.04 gain 201 175 -99.77 gain 175 202 -87.20 gain 202 175 -93.23 gain 175 203 -80.57 gain 203 175 -86.70 gain 175 204 -77.77 gain 204 175 -82.12 gain 175 205 -81.51 gain 205 175 -85.52 gain 175 206 -77.54 gain 206 175 -82.87 gain 175 207 -86.67 gain 207 175 -89.75 gain 175 208 -90.58 gain 208 175 -96.97 gain 175 209 -89.13 gain 209 175 -94.55 gain 175 210 -105.35 gain 210 175 -114.77 gain 175 211 -101.41 gain 211 175 -108.23 gain 175 212 -95.52 gain 212 175 -100.88 gain 175 213 -91.75 gain 213 175 -99.85 gain 175 214 -92.12 gain 214 175 -98.40 gain 175 215 -90.58 gain 215 175 -98.68 gain 175 216 -93.60 gain 216 175 -98.59 gain 175 217 -86.59 gain 217 175 -96.04 gain 175 218 -85.43 gain 218 175 -96.18 gain 175 219 -83.05 gain 219 175 -91.39 gain 175 220 -80.67 gain 220 175 -86.12 gain 175 221 -81.65 gain 221 175 -88.09 gain 175 222 -87.96 gain 222 175 -90.98 gain 175 223 -88.23 gain 223 175 -93.53 gain 175 224 -96.85 gain 224 175 -99.09 gain 176 177 -64.65 gain 177 176 -67.02 gain 176 178 -86.14 gain 178 176 -86.10 gain 176 179 -90.26 gain 179 176 -93.27 gain 176 180 -108.16 gain 180 176 -109.91 gain 176 181 -101.45 gain 181 176 -106.60 gain 176 182 -103.03 gain 182 176 -104.31 gain 176 183 -102.89 gain 183 176 -100.06 gain 176 184 -96.94 gain 184 176 -100.33 gain 176 185 -88.32 gain 185 176 -90.22 gain 176 186 -101.28 gain 186 176 -103.88 gain 176 187 -87.34 gain 187 176 -89.96 gain 176 188 -85.47 gain 188 176 -92.53 gain 176 189 -79.95 gain 189 176 -83.08 gain 176 190 -82.77 gain 190 176 -78.73 gain 176 191 -77.58 gain 191 176 -76.70 gain 176 192 -76.08 gain 192 176 -78.88 gain 176 193 -87.15 gain 193 176 -85.98 gain 176 194 -81.55 gain 194 176 -80.26 gain 176 195 -104.45 gain 195 176 -101.13 gain 176 196 -104.19 gain 196 176 -108.54 gain 176 197 -100.83 gain 197 176 -102.67 gain 176 198 -99.84 gain 198 176 -104.33 gain 176 199 -101.06 gain 199 176 -99.56 gain 176 200 -108.92 gain 200 176 -109.34 gain 176 201 -85.51 gain 201 176 -89.02 gain 176 202 -90.37 gain 202 176 -92.17 gain 176 203 -84.04 gain 203 176 -85.95 gain 176 204 -93.97 gain 204 176 -94.10 gain 176 205 -79.08 gain 205 176 -78.87 gain 176 206 -87.47 gain 206 176 -88.58 gain 176 207 -83.51 gain 207 176 -82.37 gain 176 208 -92.49 gain 208 176 -94.65 gain 176 209 -85.58 gain 209 176 -86.78 gain 176 210 -106.50 gain 210 176 -111.70 gain 176 211 -106.95 gain 211 176 -109.54 gain 176 212 -108.38 gain 212 176 -109.52 gain 176 213 -95.89 gain 213 176 -99.77 gain 176 214 -99.01 gain 214 176 -101.07 gain 176 215 -102.32 gain 215 176 -106.20 gain 176 216 -95.85 gain 216 176 -96.62 gain 176 217 -88.65 gain 217 176 -93.87 gain 176 218 -90.12 gain 218 176 -96.65 gain 176 219 -84.37 gain 219 176 -88.48 gain 176 220 -82.42 gain 220 176 -83.65 gain 176 221 -90.80 gain 221 176 -93.02 gain 176 222 -90.43 gain 222 176 -89.22 gain 176 223 -86.74 gain 223 176 -87.82 gain 176 224 -98.66 gain 224 176 -96.68 gain 177 178 -72.51 gain 178 177 -70.12 gain 177 179 -81.20 gain 179 177 -81.85 gain 177 180 -98.02 gain 180 177 -97.41 gain 177 181 -105.95 gain 181 177 -108.74 gain 177 182 -108.70 gain 182 177 -107.62 gain 177 183 -102.46 gain 183 177 -97.27 gain 177 184 -109.28 gain 184 177 -110.31 gain 177 185 -101.10 gain 185 177 -100.63 gain 177 186 -102.15 gain 186 177 -102.38 gain 177 187 -94.28 gain 187 177 -94.54 gain 177 188 -95.82 gain 188 177 -100.52 gain 177 189 -91.69 gain 189 177 -92.45 gain 177 190 -87.80 gain 190 177 -81.39 gain 177 191 -86.16 gain 191 177 -82.92 gain 177 192 -82.70 gain 192 177 -83.14 gain 177 193 -82.19 gain 193 177 -78.65 gain 177 194 -92.42 gain 194 177 -88.77 gain 177 195 -104.87 gain 195 177 -99.19 gain 177 196 -108.14 gain 196 177 -110.13 gain 177 197 -112.39 gain 197 177 -111.87 gain 177 198 -111.40 gain 198 177 -113.52 gain 177 199 -103.65 gain 199 177 -99.79 gain 177 200 -99.55 gain 200 177 -97.60 gain 177 201 -100.49 gain 201 177 -101.64 gain 177 202 -98.82 gain 202 177 -98.26 gain 177 203 -99.35 gain 203 177 -98.89 gain 177 204 -101.16 gain 204 177 -98.92 gain 177 205 -88.22 gain 205 177 -85.64 gain 177 206 -90.84 gain 206 177 -89.59 gain 177 207 -83.31 gain 207 177 -79.81 gain 177 208 -78.68 gain 208 177 -78.48 gain 177 209 -87.90 gain 209 177 -86.73 gain 177 210 -109.73 gain 210 177 -112.56 gain 177 211 -103.62 gain 211 177 -103.85 gain 177 212 -108.56 gain 212 177 -107.33 gain 177 213 -106.11 gain 213 177 -107.62 gain 177 214 -106.33 gain 214 177 -106.02 gain 177 215 -104.09 gain 215 177 -105.60 gain 177 216 -94.32 gain 216 177 -92.72 gain 177 217 -96.47 gain 217 177 -99.33 gain 177 218 -105.78 gain 218 177 -109.96 gain 177 219 -90.69 gain 219 177 -92.44 gain 177 220 -97.49 gain 220 177 -96.35 gain 177 221 -90.25 gain 221 177 -90.11 gain 177 222 -90.84 gain 222 177 -87.27 gain 177 223 -95.65 gain 223 177 -94.37 gain 177 224 -87.74 gain 224 177 -83.39 gain 178 179 -77.67 gain 179 178 -80.72 gain 178 180 -116.26 gain 180 178 -118.04 gain 178 181 -115.16 gain 181 178 -120.34 gain 178 182 -93.70 gain 182 178 -95.01 gain 178 183 -102.08 gain 183 178 -99.28 gain 178 184 -105.73 gain 184 178 -109.16 gain 178 185 -92.46 gain 185 178 -94.39 gain 178 186 -103.63 gain 186 178 -106.26 gain 178 187 -96.11 gain 187 178 -98.77 gain 178 188 -94.29 gain 188 178 -101.38 gain 178 189 -94.08 gain 189 178 -97.23 gain 178 190 -92.74 gain 190 178 -88.72 gain 178 191 -85.65 gain 191 178 -84.81 gain 178 192 -81.51 gain 192 178 -84.34 gain 178 193 -76.17 gain 193 178 -75.02 gain 178 194 -79.84 gain 194 178 -78.59 gain 178 195 -107.27 gain 195 178 -103.98 gain 178 196 -104.39 gain 196 178 -108.78 gain 178 197 -112.64 gain 197 178 -114.52 gain 178 198 -97.28 gain 198 178 -101.80 gain 178 199 -103.68 gain 199 178 -102.21 gain 178 200 -97.98 gain 200 178 -98.43 gain 178 201 -99.65 gain 201 178 -103.19 gain 178 202 -100.98 gain 202 178 -102.82 gain 178 203 -97.67 gain 203 178 -99.60 gain 178 204 -98.63 gain 204 178 -98.79 gain 178 205 -90.62 gain 205 178 -90.45 gain 178 206 -89.51 gain 206 178 -90.65 gain 178 207 -84.82 gain 207 178 -83.71 gain 178 208 -88.06 gain 208 178 -90.25 gain 178 209 -82.24 gain 209 178 -83.46 gain 178 210 -111.46 gain 210 178 -116.69 gain 178 211 -103.01 gain 211 178 -105.63 gain 178 212 -108.24 gain 212 178 -109.41 gain 178 213 -109.28 gain 213 178 -113.19 gain 178 214 -96.22 gain 214 178 -98.31 gain 178 215 -109.59 gain 215 178 -113.49 gain 178 216 -100.36 gain 216 178 -101.16 gain 178 217 -91.52 gain 217 178 -96.77 gain 178 218 -96.69 gain 218 178 -103.25 gain 178 219 -94.81 gain 219 178 -98.95 gain 178 220 -89.01 gain 220 178 -90.26 gain 178 221 -90.82 gain 221 178 -93.06 gain 178 222 -88.72 gain 222 178 -87.55 gain 178 223 -88.77 gain 223 178 -89.88 gain 178 224 -84.58 gain 224 178 -82.62 gain 179 180 -110.24 gain 180 179 -108.98 gain 179 181 -111.47 gain 181 179 -113.60 gain 179 182 -112.97 gain 182 179 -111.24 gain 179 183 -110.77 gain 183 179 -104.92 gain 179 184 -99.64 gain 184 179 -100.02 gain 179 185 -115.51 gain 185 179 -114.39 gain 179 186 -111.47 gain 186 179 -111.05 gain 179 187 -103.57 gain 187 179 -103.17 gain 179 188 -98.78 gain 188 179 -102.83 gain 179 189 -99.84 gain 189 179 -99.95 gain 179 190 -92.10 gain 190 179 -85.04 gain 179 191 -92.80 gain 191 179 -88.91 gain 179 192 -88.11 gain 192 179 -87.89 gain 179 193 -77.70 gain 193 179 -73.51 gain 179 194 -79.75 gain 194 179 -75.45 gain 179 195 -115.50 gain 195 179 -109.17 gain 179 196 -104.27 gain 196 179 -105.61 gain 179 197 -111.15 gain 197 179 -109.98 gain 179 198 -108.71 gain 198 179 -110.18 gain 179 199 -109.70 gain 199 179 -105.19 gain 179 200 -102.41 gain 200 179 -99.81 gain 179 201 -102.24 gain 201 179 -102.73 gain 179 202 -101.25 gain 202 179 -100.04 gain 179 203 -102.26 gain 203 179 -101.15 gain 179 204 -95.75 gain 204 179 -92.86 gain 179 205 -104.09 gain 205 179 -100.87 gain 179 206 -92.32 gain 206 179 -90.42 gain 179 207 -91.28 gain 207 179 -87.13 gain 179 208 -86.10 gain 208 179 -85.24 gain 179 209 -83.44 gain 209 179 -81.63 gain 179 210 -108.22 gain 210 179 -110.40 gain 179 211 -114.46 gain 211 179 -114.04 gain 179 212 -114.30 gain 212 179 -112.42 gain 179 213 -107.12 gain 213 179 -107.99 gain 179 214 -105.61 gain 214 179 -104.65 gain 179 215 -114.02 gain 215 179 -114.88 gain 179 216 -101.10 gain 216 179 -98.85 gain 179 217 -102.05 gain 217 179 -104.26 gain 179 218 -104.57 gain 218 179 -108.09 gain 179 219 -95.64 gain 219 179 -96.74 gain 179 220 -96.09 gain 220 179 -94.30 gain 179 221 -91.82 gain 221 179 -91.02 gain 179 222 -98.18 gain 222 179 -93.96 gain 179 223 -89.65 gain 223 179 -87.72 gain 179 224 -92.65 gain 224 179 -87.65 gain 180 181 -72.24 gain 181 180 -75.64 gain 180 182 -87.78 gain 182 180 -87.31 gain 180 183 -89.01 gain 183 180 -84.42 gain 180 184 -103.15 gain 184 180 -104.79 gain 180 185 -95.77 gain 185 180 -95.91 gain 180 186 -100.19 gain 186 180 -101.04 gain 180 187 -113.61 gain 187 180 -114.48 gain 180 188 -105.10 gain 188 180 -110.41 gain 180 189 -102.45 gain 189 180 -103.82 gain 180 190 -106.86 gain 190 180 -101.07 gain 180 191 -107.86 gain 191 180 -105.24 gain 180 192 -107.61 gain 192 180 -108.66 gain 180 193 -113.68 gain 193 180 -110.75 gain 180 194 -107.00 gain 194 180 -103.97 gain 180 195 -79.77 gain 195 180 -74.71 gain 180 196 -82.02 gain 196 180 -84.62 gain 180 197 -88.32 gain 197 180 -88.42 gain 180 198 -94.45 gain 198 180 -97.19 gain 180 199 -95.40 gain 199 180 -92.15 gain 180 200 -99.58 gain 200 180 -98.24 gain 180 201 -100.32 gain 201 180 -102.07 gain 180 202 -104.50 gain 202 180 -104.55 gain 180 203 -109.45 gain 203 180 -109.61 gain 180 204 -108.30 gain 204 180 -106.68 gain 180 205 -103.79 gain 205 180 -101.83 gain 180 206 -107.99 gain 206 180 -107.35 gain 180 207 -103.47 gain 207 180 -100.57 gain 180 208 -111.06 gain 208 180 -111.47 gain 180 209 -120.70 gain 209 180 -120.15 gain 180 210 -83.07 gain 210 180 -86.52 gain 180 211 -83.32 gain 211 180 -84.16 gain 180 212 -92.02 gain 212 180 -91.41 gain 180 213 -89.25 gain 213 180 -91.38 gain 180 214 -97.46 gain 214 180 -97.77 gain 180 215 -101.92 gain 215 180 -104.05 gain 180 216 -95.39 gain 216 180 -94.41 gain 180 217 -106.22 gain 217 180 -109.69 gain 180 218 -106.86 gain 218 180 -111.64 gain 180 219 -105.95 gain 219 180 -108.31 gain 180 220 -104.75 gain 220 180 -104.23 gain 180 221 -102.61 gain 221 180 -103.08 gain 180 222 -105.82 gain 222 180 -102.87 gain 180 223 -111.61 gain 223 180 -110.94 gain 180 224 -102.64 gain 224 180 -98.90 gain 181 182 -77.33 gain 182 181 -73.46 gain 181 183 -82.84 gain 183 181 -74.85 gain 181 184 -95.64 gain 184 181 -93.88 gain 181 185 -100.04 gain 185 181 -96.79 gain 181 186 -106.61 gain 186 181 -104.06 gain 181 187 -101.29 gain 187 181 -98.76 gain 181 188 -104.53 gain 188 181 -106.44 gain 181 189 -107.09 gain 189 181 -105.06 gain 181 190 -105.40 gain 190 181 -96.21 gain 181 191 -103.88 gain 191 181 -97.86 gain 181 192 -109.68 gain 192 181 -107.33 gain 181 193 -103.39 gain 193 181 -97.07 gain 181 194 -108.90 gain 194 181 -102.47 gain 181 195 -80.86 gain 195 181 -72.39 gain 181 196 -83.13 gain 196 181 -82.34 gain 181 197 -82.35 gain 197 181 -79.04 gain 181 198 -86.44 gain 198 181 -85.78 gain 181 199 -94.20 gain 199 181 -87.55 gain 181 200 -89.62 gain 200 181 -84.89 gain 181 201 -100.34 gain 201 181 -98.70 gain 181 202 -103.59 gain 202 181 -100.24 gain 181 203 -101.86 gain 203 181 -98.61 gain 181 204 -111.39 gain 204 181 -106.36 gain 181 205 -104.00 gain 205 181 -98.64 gain 181 206 -105.38 gain 206 181 -101.35 gain 181 207 -107.81 gain 207 181 -101.51 gain 181 208 -112.05 gain 208 181 -109.06 gain 181 209 -115.05 gain 209 181 -111.10 gain 181 210 -94.46 gain 210 181 -94.51 gain 181 211 -91.28 gain 211 181 -88.72 gain 181 212 -96.61 gain 212 181 -92.60 gain 181 213 -91.43 gain 213 181 -90.16 gain 181 214 -98.77 gain 214 181 -95.68 gain 181 215 -97.25 gain 215 181 -95.97 gain 181 216 -106.58 gain 216 181 -102.20 gain 181 217 -102.24 gain 217 181 -102.31 gain 181 218 -108.66 gain 218 181 -110.05 gain 181 219 -100.14 gain 219 181 -99.10 gain 181 220 -109.73 gain 220 181 -105.81 gain 181 221 -111.00 gain 221 181 -108.07 gain 181 222 -120.92 gain 222 181 -114.56 gain 181 223 -112.90 gain 223 181 -108.83 gain 181 224 -113.02 gain 224 181 -105.89 gain 182 183 -79.69 gain 183 182 -75.58 gain 182 184 -83.88 gain 184 182 -86.00 gain 182 185 -93.87 gain 185 182 -94.48 gain 182 186 -89.78 gain 186 182 -91.10 gain 182 187 -98.35 gain 187 182 -99.69 gain 182 188 -96.14 gain 188 182 -101.92 gain 182 189 -102.46 gain 189 182 -104.30 gain 182 190 -106.50 gain 190 182 -101.17 gain 182 191 -102.88 gain 191 182 -100.72 gain 182 192 -98.86 gain 192 182 -100.37 gain 182 193 -107.48 gain 193 182 -105.02 gain 182 194 -108.73 gain 194 182 -106.16 gain 182 195 -95.80 gain 195 182 -91.20 gain 182 196 -77.86 gain 196 182 -80.93 gain 182 197 -71.28 gain 197 182 -71.84 gain 182 198 -77.95 gain 198 182 -81.15 gain 182 199 -86.85 gain 199 182 -84.07 gain 182 200 -81.84 gain 200 182 -80.98 gain 182 201 -93.98 gain 201 182 -96.21 gain 182 202 -99.24 gain 202 182 -99.76 gain 182 203 -99.74 gain 203 182 -100.36 gain 182 204 -100.50 gain 204 182 -99.34 gain 182 205 -96.00 gain 205 182 -94.51 gain 182 206 -100.34 gain 206 182 -100.17 gain 182 207 -111.70 gain 207 182 -109.28 gain 182 208 -109.17 gain 208 182 -110.05 gain 182 209 -106.84 gain 209 182 -106.76 gain 182 210 -91.38 gain 210 182 -95.29 gain 182 211 -84.94 gain 211 182 -86.25 gain 182 212 -91.09 gain 212 182 -90.95 gain 182 213 -80.15 gain 213 182 -82.74 gain 182 214 -93.76 gain 214 182 -94.54 gain 182 215 -81.06 gain 215 182 -83.65 gain 182 216 -98.76 gain 216 182 -98.24 gain 182 217 -93.64 gain 217 182 -97.58 gain 182 218 -93.92 gain 218 182 -99.17 gain 182 219 -108.87 gain 219 182 -111.70 gain 182 220 -98.54 gain 220 182 -98.48 gain 182 221 -101.95 gain 221 182 -102.89 gain 182 222 -107.15 gain 222 182 -104.66 gain 182 223 -108.60 gain 223 182 -108.40 gain 182 224 -108.54 gain 224 182 -105.26 gain 183 184 -75.74 gain 184 183 -81.97 gain 183 185 -76.06 gain 185 183 -80.79 gain 183 186 -82.62 gain 186 183 -88.04 gain 183 187 -83.67 gain 187 183 -89.12 gain 183 188 -92.62 gain 188 183 -102.52 gain 183 189 -93.69 gain 189 183 -99.64 gain 183 190 -105.39 gain 190 183 -104.18 gain 183 191 -92.09 gain 191 183 -94.05 gain 183 192 -97.75 gain 192 183 -103.38 gain 183 193 -98.70 gain 193 183 -100.35 gain 183 194 -105.51 gain 194 183 -107.05 gain 183 195 -92.10 gain 195 183 -91.61 gain 183 196 -82.80 gain 196 183 -89.99 gain 183 197 -78.19 gain 197 183 -82.87 gain 183 198 -69.03 gain 198 183 -76.35 gain 183 199 -74.39 gain 199 183 -75.73 gain 183 200 -79.00 gain 200 183 -82.25 gain 183 201 -79.75 gain 201 183 -86.09 gain 183 202 -93.40 gain 202 183 -98.04 gain 183 203 -95.16 gain 203 183 -99.90 gain 183 204 -99.37 gain 204 183 -102.32 gain 183 205 -94.66 gain 205 183 -97.28 gain 183 206 -100.64 gain 206 183 -104.59 gain 183 207 -95.80 gain 207 183 -97.49 gain 183 208 -97.89 gain 208 183 -102.88 gain 183 209 -101.51 gain 209 183 -105.54 gain 183 210 -88.64 gain 210 183 -96.67 gain 183 211 -82.59 gain 211 183 -88.01 gain 183 212 -75.79 gain 212 183 -79.76 gain 183 213 -76.11 gain 213 183 -82.82 gain 183 214 -82.72 gain 214 183 -87.61 gain 183 215 -83.41 gain 215 183 -90.11 gain 183 216 -83.39 gain 216 183 -86.99 gain 183 217 -85.20 gain 217 183 -93.25 gain 183 218 -86.98 gain 218 183 -96.35 gain 183 219 -91.48 gain 219 183 -98.42 gain 183 220 -103.60 gain 220 183 -107.66 gain 183 221 -96.52 gain 221 183 -101.57 gain 183 222 -102.00 gain 222 183 -103.62 gain 183 223 -99.32 gain 223 183 -103.23 gain 183 224 -94.43 gain 224 183 -95.27 gain 184 185 -76.99 gain 185 184 -75.49 gain 184 186 -90.13 gain 186 184 -89.33 gain 184 187 -92.72 gain 187 184 -91.94 gain 184 188 -93.14 gain 188 184 -96.81 gain 184 189 -95.39 gain 189 184 -95.12 gain 184 190 -94.89 gain 190 184 -87.45 gain 184 191 -104.11 gain 191 184 -99.84 gain 184 192 -100.84 gain 192 184 -100.24 gain 184 193 -108.81 gain 193 184 -104.24 gain 184 194 -102.83 gain 194 184 -98.15 gain 184 195 -94.00 gain 195 184 -87.29 gain 184 196 -91.58 gain 196 184 -92.53 gain 184 197 -83.53 gain 197 184 -81.98 gain 184 198 -76.42 gain 198 184 -77.52 gain 184 199 -80.36 gain 199 184 -75.46 gain 184 200 -80.84 gain 200 184 -77.87 gain 184 201 -81.81 gain 201 184 -81.92 gain 184 202 -91.90 gain 202 184 -90.31 gain 184 203 -101.37 gain 203 184 -99.87 gain 184 204 -101.54 gain 204 184 -98.27 gain 184 205 -100.64 gain 205 184 -97.04 gain 184 206 -98.88 gain 206 184 -96.60 gain 184 207 -105.43 gain 207 184 -100.89 gain 184 208 -106.62 gain 208 184 -105.38 gain 184 209 -108.15 gain 209 184 -105.95 gain 184 210 -100.81 gain 210 184 -102.61 gain 184 211 -91.47 gain 211 184 -90.67 gain 184 212 -91.44 gain 212 184 -89.19 gain 184 213 -89.06 gain 213 184 -89.54 gain 184 214 -80.61 gain 214 184 -79.27 gain 184 215 -90.17 gain 215 184 -90.65 gain 184 216 -94.19 gain 216 184 -91.57 gain 184 217 -92.21 gain 217 184 -94.03 gain 184 218 -95.44 gain 218 184 -98.58 gain 184 219 -100.46 gain 219 184 -101.17 gain 184 220 -95.63 gain 220 184 -93.46 gain 184 221 -110.79 gain 221 184 -109.61 gain 184 222 -111.40 gain 222 184 -106.80 gain 184 223 -113.64 gain 223 184 -111.33 gain 184 224 -102.09 gain 224 184 -96.71 gain 185 186 -76.81 gain 186 185 -77.51 gain 185 187 -77.29 gain 187 185 -78.02 gain 185 188 -91.74 gain 188 185 -96.91 gain 185 189 -98.17 gain 189 185 -99.40 gain 185 190 -93.53 gain 190 185 -87.59 gain 185 191 -101.51 gain 191 185 -98.74 gain 185 192 -99.42 gain 192 185 -100.33 gain 185 193 -103.74 gain 193 185 -100.67 gain 185 194 -101.21 gain 194 185 -98.03 gain 185 195 -92.65 gain 195 185 -87.43 gain 185 196 -98.77 gain 196 185 -101.23 gain 185 197 -94.24 gain 197 185 -94.19 gain 185 198 -84.11 gain 198 185 -86.70 gain 185 199 -82.15 gain 199 185 -78.76 gain 185 200 -76.70 gain 200 185 -75.23 gain 185 201 -86.48 gain 201 185 -88.10 gain 185 202 -91.60 gain 202 185 -91.51 gain 185 203 -96.24 gain 203 185 -96.25 gain 185 204 -88.60 gain 204 185 -86.83 gain 185 205 -97.47 gain 205 185 -95.37 gain 185 206 -99.05 gain 206 185 -98.27 gain 185 207 -109.15 gain 207 185 -106.11 gain 185 208 -105.70 gain 208 185 -105.96 gain 185 209 -106.64 gain 209 185 -105.94 gain 185 210 -95.70 gain 210 185 -99.00 gain 185 211 -97.90 gain 211 185 -98.60 gain 185 212 -92.77 gain 212 185 -92.02 gain 185 213 -98.68 gain 213 185 -100.67 gain 185 214 -82.06 gain 214 185 -82.22 gain 185 215 -83.93 gain 215 185 -85.91 gain 185 216 -76.29 gain 216 185 -75.16 gain 185 217 -93.12 gain 217 185 -96.44 gain 185 218 -90.90 gain 218 185 -95.54 gain 185 219 -97.51 gain 219 185 -99.73 gain 185 220 -95.64 gain 220 185 -94.97 gain 185 221 -99.44 gain 221 185 -99.76 gain 185 222 -101.97 gain 222 185 -98.87 gain 185 223 -98.91 gain 223 185 -98.10 gain 185 224 -106.91 gain 224 185 -103.03 gain 186 187 -79.31 gain 187 186 -79.34 gain 186 188 -85.25 gain 188 186 -89.71 gain 186 189 -94.47 gain 189 186 -95.00 gain 186 190 -95.08 gain 190 186 -88.44 gain 186 191 -104.12 gain 191 186 -100.65 gain 186 192 -95.40 gain 192 186 -95.60 gain 186 193 -101.73 gain 193 186 -97.95 gain 186 194 -101.66 gain 194 186 -97.77 gain 186 195 -98.75 gain 195 186 -92.84 gain 186 196 -96.40 gain 196 186 -98.15 gain 186 197 -95.17 gain 197 186 -94.42 gain 186 198 -92.24 gain 198 186 -94.14 gain 186 199 -85.93 gain 199 186 -81.84 gain 186 200 -76.28 gain 200 186 -74.10 gain 186 201 -72.90 gain 201 186 -73.81 gain 186 202 -88.25 gain 202 186 -87.45 gain 186 203 -87.66 gain 203 186 -86.96 gain 186 204 -89.15 gain 204 186 -86.68 gain 186 205 -94.92 gain 205 186 -92.12 gain 186 206 -103.31 gain 206 186 -101.83 gain 186 207 -93.82 gain 207 186 -90.08 gain 186 208 -105.75 gain 208 186 -105.31 gain 186 209 -103.79 gain 209 186 -102.39 gain 186 210 -96.88 gain 210 186 -99.48 gain 186 211 -101.21 gain 211 186 -101.21 gain 186 212 -95.85 gain 212 186 -94.40 gain 186 213 -92.29 gain 213 186 -93.57 gain 186 214 -85.58 gain 214 186 -85.04 gain 186 215 -85.77 gain 215 186 -87.05 gain 186 216 -85.17 gain 216 186 -83.34 gain 186 217 -81.86 gain 217 186 -84.48 gain 186 218 -81.01 gain 218 186 -84.95 gain 186 219 -89.88 gain 219 186 -91.39 gain 186 220 -95.23 gain 220 186 -93.86 gain 186 221 -97.90 gain 221 186 -97.52 gain 186 222 -99.33 gain 222 186 -95.52 gain 186 223 -103.64 gain 223 186 -102.12 gain 186 224 -110.03 gain 224 186 -105.45 gain 187 188 -77.04 gain 188 187 -81.48 gain 187 189 -86.82 gain 189 187 -87.32 gain 187 190 -87.69 gain 190 187 -81.02 gain 187 191 -95.23 gain 191 187 -91.74 gain 187 192 -103.58 gain 192 187 -103.76 gain 187 193 -99.54 gain 193 187 -95.74 gain 187 194 -106.26 gain 194 187 -102.36 gain 187 195 -105.28 gain 195 187 -99.35 gain 187 196 -102.27 gain 196 187 -104.00 gain 187 197 -96.54 gain 197 187 -95.77 gain 187 198 -98.52 gain 198 187 -100.39 gain 187 199 -90.04 gain 199 187 -85.92 gain 187 200 -79.01 gain 200 187 -76.81 gain 187 201 -78.59 gain 201 187 -79.48 gain 187 202 -77.92 gain 202 187 -77.11 gain 187 203 -87.94 gain 203 187 -87.22 gain 187 204 -88.89 gain 204 187 -86.40 gain 187 205 -88.47 gain 205 187 -85.64 gain 187 206 -87.27 gain 206 187 -85.76 gain 187 207 -98.96 gain 207 187 -95.20 gain 187 208 -104.14 gain 208 187 -103.67 gain 187 209 -110.42 gain 209 187 -109.00 gain 187 210 -103.38 gain 210 187 -105.96 gain 187 211 -94.69 gain 211 187 -94.67 gain 187 212 -93.54 gain 212 187 -92.06 gain 187 213 -96.59 gain 213 187 -97.85 gain 187 214 -90.16 gain 214 187 -89.60 gain 187 215 -88.29 gain 215 187 -89.54 gain 187 216 -91.21 gain 216 187 -89.35 gain 187 217 -86.42 gain 217 187 -89.02 gain 187 218 -90.76 gain 218 187 -94.67 gain 187 219 -84.94 gain 219 187 -86.43 gain 187 220 -89.95 gain 220 187 -88.55 gain 187 221 -102.18 gain 221 187 -101.77 gain 187 222 -93.08 gain 222 187 -89.25 gain 187 223 -103.26 gain 223 187 -101.72 gain 187 224 -95.05 gain 224 187 -90.44 gain 188 189 -77.66 gain 189 188 -73.72 gain 188 190 -88.87 gain 190 188 -77.76 gain 188 191 -105.56 gain 191 188 -97.62 gain 188 192 -94.13 gain 192 188 -89.86 gain 188 193 -97.31 gain 193 188 -89.07 gain 188 194 -101.08 gain 194 188 -92.72 gain 188 195 -112.11 gain 195 188 -101.73 gain 188 196 -106.29 gain 196 188 -103.58 gain 188 197 -100.06 gain 197 188 -94.84 gain 188 198 -99.47 gain 198 188 -96.89 gain 188 199 -96.17 gain 199 188 -87.60 gain 188 200 -91.18 gain 200 188 -84.53 gain 188 201 -93.66 gain 201 188 -90.11 gain 188 202 -82.51 gain 202 188 -77.25 gain 188 203 -74.59 gain 203 188 -69.43 gain 188 204 -86.62 gain 204 188 -79.69 gain 188 205 -99.17 gain 205 188 -91.90 gain 188 206 -98.18 gain 206 188 -92.24 gain 188 207 -99.97 gain 207 188 -91.76 gain 188 208 -106.13 gain 208 188 -101.23 gain 188 209 -106.98 gain 209 188 -101.11 gain 188 210 -113.51 gain 210 188 -111.65 gain 188 211 -104.92 gain 211 188 -100.45 gain 188 212 -107.20 gain 212 188 -101.28 gain 188 213 -104.81 gain 213 188 -101.62 gain 188 214 -100.71 gain 214 188 -95.70 gain 188 215 -99.85 gain 215 188 -96.66 gain 188 216 -99.30 gain 216 188 -93.01 gain 188 217 -93.42 gain 217 188 -91.58 gain 188 218 -86.47 gain 218 188 -85.94 gain 188 219 -89.84 gain 219 188 -86.89 gain 188 220 -97.15 gain 220 188 -91.31 gain 188 221 -98.74 gain 221 188 -93.90 gain 188 222 -102.56 gain 222 188 -94.29 gain 188 223 -99.90 gain 223 188 -93.92 gain 188 224 -111.17 gain 224 188 -102.12 gain 189 190 -73.75 gain 190 189 -66.58 gain 189 191 -86.83 gain 191 189 -82.83 gain 189 192 -93.97 gain 192 189 -93.64 gain 189 193 -97.28 gain 193 189 -92.98 gain 189 194 -101.17 gain 194 189 -96.76 gain 189 195 -109.02 gain 195 189 -102.58 gain 189 196 -103.05 gain 196 189 -104.28 gain 189 197 -98.63 gain 197 189 -97.35 gain 189 198 -100.33 gain 198 189 -101.69 gain 189 199 -103.47 gain 199 189 -98.85 gain 189 200 -97.13 gain 200 189 -94.43 gain 189 201 -94.74 gain 201 189 -95.12 gain 189 202 -87.22 gain 202 189 -85.90 gain 189 203 -81.74 gain 203 189 -80.52 gain 189 204 -76.21 gain 204 189 -73.21 gain 189 205 -81.59 gain 205 189 -78.25 gain 189 206 -87.62 gain 206 189 -85.62 gain 189 207 -94.48 gain 207 189 -90.22 gain 189 208 -95.73 gain 208 189 -94.77 gain 189 209 -94.90 gain 209 189 -92.97 gain 189 210 -112.23 gain 210 189 -114.30 gain 189 211 -107.47 gain 211 189 -106.94 gain 189 212 -98.29 gain 212 189 -96.30 gain 189 213 -105.03 gain 213 189 -105.78 gain 189 214 -95.09 gain 214 189 -94.03 gain 189 215 -94.94 gain 215 189 -95.70 gain 189 216 -96.03 gain 216 189 -93.68 gain 189 217 -91.17 gain 217 189 -93.26 gain 189 218 -84.82 gain 218 189 -88.23 gain 189 219 -83.71 gain 219 189 -84.70 gain 189 220 -90.28 gain 220 189 -88.38 gain 189 221 -92.73 gain 221 189 -91.83 gain 189 222 -100.24 gain 222 189 -95.92 gain 189 223 -91.41 gain 223 189 -89.36 gain 189 224 -92.94 gain 224 189 -87.83 gain 190 191 -64.93 gain 191 190 -68.10 gain 190 192 -78.58 gain 192 190 -85.42 gain 190 193 -81.13 gain 193 190 -84.00 gain 190 194 -91.22 gain 194 190 -93.98 gain 190 195 -99.73 gain 195 190 -100.46 gain 190 196 -93.80 gain 196 190 -102.20 gain 190 197 -99.87 gain 197 190 -105.76 gain 190 198 -94.48 gain 198 190 -103.02 gain 190 199 -94.16 gain 199 190 -96.71 gain 190 200 -90.07 gain 200 190 -94.53 gain 190 201 -83.98 gain 201 190 -91.53 gain 190 202 -74.62 gain 202 190 -80.47 gain 190 203 -76.92 gain 203 190 -82.87 gain 190 204 -75.95 gain 204 190 -80.12 gain 190 205 -67.98 gain 205 190 -71.82 gain 190 206 -72.86 gain 206 190 -78.02 gain 190 207 -87.25 gain 207 190 -90.16 gain 190 208 -85.81 gain 208 190 -92.01 gain 190 209 -86.54 gain 209 190 -91.79 gain 190 210 -97.31 gain 210 190 -106.55 gain 190 211 -99.63 gain 211 190 -106.27 gain 190 212 -100.26 gain 212 190 -105.45 gain 190 213 -92.58 gain 213 190 -100.50 gain 190 214 -92.53 gain 214 190 -98.63 gain 190 215 -98.45 gain 215 190 -106.37 gain 190 216 -87.14 gain 216 190 -91.96 gain 190 217 -82.29 gain 217 190 -91.55 gain 190 218 -83.87 gain 218 190 -94.45 gain 190 219 -75.89 gain 219 190 -84.05 gain 190 220 -72.35 gain 220 190 -77.62 gain 190 221 -83.34 gain 221 190 -89.61 gain 190 222 -79.18 gain 222 190 -82.02 gain 190 223 -88.23 gain 223 190 -93.35 gain 190 224 -81.75 gain 224 190 -83.80 gain 191 192 -71.54 gain 192 191 -75.21 gain 191 193 -88.58 gain 193 191 -88.28 gain 191 194 -84.01 gain 194 191 -83.59 gain 191 195 -109.98 gain 195 191 -107.53 gain 191 196 -97.57 gain 196 191 -102.79 gain 191 197 -101.10 gain 197 191 -103.82 gain 191 198 -94.08 gain 198 191 -99.44 gain 191 199 -96.43 gain 199 191 -95.80 gain 191 200 -96.16 gain 200 191 -97.45 gain 191 201 -94.67 gain 201 191 -99.05 gain 191 202 -89.29 gain 202 191 -91.97 gain 191 203 -92.98 gain 203 191 -95.75 gain 191 204 -83.79 gain 204 191 -84.79 gain 191 205 -80.01 gain 205 191 -80.68 gain 191 206 -74.80 gain 206 191 -76.79 gain 191 207 -73.42 gain 207 191 -73.15 gain 191 208 -87.16 gain 208 191 -90.19 gain 191 209 -89.56 gain 209 191 -91.63 gain 191 210 -98.54 gain 210 191 -104.61 gain 191 211 -103.37 gain 211 191 -106.83 gain 191 212 -108.79 gain 212 191 -110.80 gain 191 213 -101.71 gain 213 191 -106.46 gain 191 214 -98.01 gain 214 191 -100.94 gain 191 215 -100.11 gain 215 191 -104.85 gain 191 216 -89.94 gain 216 191 -91.58 gain 191 217 -92.64 gain 217 191 -98.73 gain 191 218 -89.00 gain 218 191 -96.41 gain 191 219 -82.34 gain 219 191 -87.33 gain 191 220 -83.84 gain 220 191 -85.94 gain 191 221 -81.14 gain 221 191 -84.23 gain 191 222 -90.67 gain 222 191 -90.33 gain 191 223 -87.49 gain 223 191 -89.45 gain 191 224 -87.35 gain 224 191 -86.24 gain 192 193 -80.73 gain 193 192 -76.76 gain 192 194 -84.87 gain 194 192 -80.78 gain 192 195 -111.08 gain 195 192 -104.97 gain 192 196 -117.64 gain 196 192 -119.20 gain 192 197 -103.62 gain 197 192 -102.67 gain 192 198 -101.20 gain 198 192 -102.89 gain 192 199 -97.92 gain 199 192 -93.62 gain 192 200 -90.97 gain 200 192 -88.59 gain 192 201 -98.19 gain 201 192 -98.90 gain 192 202 -96.47 gain 202 192 -95.47 gain 192 203 -97.87 gain 203 192 -96.97 gain 192 204 -85.52 gain 204 192 -82.85 gain 192 205 -81.16 gain 205 192 -78.15 gain 192 206 -84.89 gain 206 192 -83.20 gain 192 207 -76.42 gain 207 192 -72.48 gain 192 208 -82.48 gain 208 192 -81.83 gain 192 209 -87.38 gain 209 192 -85.78 gain 192 210 -108.53 gain 210 192 -110.93 gain 192 211 -102.78 gain 211 192 -102.57 gain 192 212 -107.72 gain 212 192 -106.06 gain 192 213 -106.55 gain 213 192 -107.62 gain 192 214 -100.85 gain 214 192 -100.11 gain 192 215 -104.32 gain 215 192 -105.39 gain 192 216 -102.67 gain 216 192 -100.64 gain 192 217 -105.41 gain 217 192 -107.83 gain 192 218 -91.27 gain 218 192 -95.01 gain 192 219 -89.69 gain 219 192 -91.00 gain 192 220 -89.48 gain 220 192 -87.91 gain 192 221 -90.35 gain 221 192 -89.77 gain 192 222 -85.51 gain 222 192 -81.51 gain 192 223 -85.84 gain 223 192 -84.12 gain 192 224 -87.06 gain 224 192 -82.27 gain 193 194 -71.44 gain 194 193 -71.33 gain 193 195 -103.41 gain 195 193 -101.27 gain 193 196 -107.11 gain 196 193 -112.64 gain 193 197 -99.52 gain 197 193 -102.54 gain 193 198 -97.22 gain 198 193 -102.89 gain 193 199 -97.79 gain 199 193 -97.47 gain 193 200 -99.91 gain 200 193 -101.51 gain 193 201 -97.15 gain 201 193 -101.84 gain 193 202 -89.31 gain 202 193 -92.29 gain 193 203 -90.99 gain 203 193 -94.07 gain 193 204 -84.14 gain 204 193 -85.44 gain 193 205 -89.17 gain 205 193 -90.13 gain 193 206 -85.27 gain 206 193 -87.56 gain 193 207 -76.11 gain 207 193 -76.15 gain 193 208 -80.37 gain 208 193 -83.71 gain 193 209 -73.99 gain 209 193 -76.36 gain 193 210 -110.43 gain 210 193 -116.80 gain 193 211 -106.97 gain 211 193 -110.74 gain 193 212 -105.90 gain 212 193 -108.21 gain 193 213 -104.45 gain 213 193 -109.50 gain 193 214 -108.55 gain 214 193 -111.79 gain 193 215 -100.64 gain 215 193 -105.69 gain 193 216 -98.45 gain 216 193 -100.39 gain 193 217 -92.76 gain 217 193 -99.15 gain 193 218 -97.96 gain 218 193 -105.68 gain 193 219 -83.03 gain 219 193 -88.32 gain 193 220 -83.21 gain 220 193 -85.61 gain 193 221 -85.02 gain 221 193 -88.41 gain 193 222 -84.72 gain 222 193 -84.69 gain 193 223 -74.77 gain 223 193 -77.03 gain 193 224 -89.90 gain 224 193 -89.09 gain 194 195 -106.08 gain 195 194 -104.05 gain 194 196 -108.30 gain 196 194 -113.94 gain 194 197 -101.19 gain 197 194 -104.32 gain 194 198 -108.40 gain 198 194 -114.17 gain 194 199 -102.33 gain 199 194 -102.12 gain 194 200 -99.62 gain 200 194 -101.32 gain 194 201 -96.66 gain 201 194 -101.46 gain 194 202 -99.13 gain 202 194 -102.22 gain 194 203 -100.55 gain 203 194 -103.74 gain 194 204 -96.49 gain 204 194 -97.90 gain 194 205 -82.93 gain 205 194 -84.01 gain 194 206 -87.69 gain 206 194 -90.10 gain 194 207 -81.07 gain 207 194 -81.22 gain 194 208 -65.38 gain 208 194 -68.82 gain 194 209 -72.53 gain 209 194 -75.01 gain 194 210 -105.00 gain 210 194 -111.48 gain 194 211 -101.69 gain 211 194 -105.57 gain 194 212 -103.98 gain 212 194 -106.41 gain 194 213 -110.42 gain 213 194 -115.58 gain 194 214 -101.11 gain 214 194 -104.46 gain 194 215 -107.33 gain 215 194 -112.49 gain 194 216 -96.80 gain 216 194 -98.86 gain 194 217 -99.05 gain 217 194 -105.56 gain 194 218 -99.06 gain 218 194 -106.88 gain 194 219 -97.70 gain 219 194 -103.10 gain 194 220 -94.71 gain 220 194 -97.22 gain 194 221 -96.91 gain 221 194 -100.41 gain 194 222 -89.49 gain 222 194 -89.57 gain 194 223 -87.80 gain 223 194 -90.17 gain 194 224 -76.62 gain 224 194 -75.92 gain 195 196 -71.58 gain 196 195 -79.25 gain 195 197 -70.73 gain 197 195 -75.89 gain 195 198 -83.96 gain 198 195 -91.76 gain 195 199 -94.45 gain 199 195 -96.27 gain 195 200 -94.31 gain 200 195 -98.04 gain 195 201 -101.09 gain 201 195 -107.91 gain 195 202 -97.50 gain 202 195 -102.62 gain 195 203 -94.06 gain 203 195 -99.27 gain 195 204 -99.94 gain 204 195 -103.38 gain 195 205 -110.38 gain 205 195 -113.49 gain 195 206 -108.04 gain 206 195 -112.47 gain 195 207 -94.20 gain 207 195 -96.37 gain 195 208 -103.79 gain 208 195 -109.27 gain 195 209 -110.84 gain 209 195 -115.35 gain 195 210 -62.79 gain 210 195 -71.30 gain 195 211 -74.88 gain 211 195 -80.79 gain 195 212 -81.99 gain 212 195 -86.44 gain 195 213 -85.80 gain 213 195 -93.00 gain 195 214 -91.85 gain 214 195 -97.22 gain 195 215 -92.11 gain 215 195 -99.30 gain 195 216 -90.88 gain 216 195 -94.96 gain 195 217 -111.66 gain 217 195 -120.20 gain 195 218 -94.03 gain 218 195 -103.88 gain 195 219 -95.79 gain 219 195 -103.21 gain 195 220 -99.66 gain 220 195 -104.20 gain 195 221 -95.41 gain 221 195 -100.94 gain 195 222 -105.84 gain 222 195 -107.95 gain 195 223 -99.85 gain 223 195 -104.25 gain 195 224 -104.64 gain 224 195 -105.97 gain 196 197 -73.24 gain 197 196 -70.73 gain 196 198 -86.42 gain 198 196 -86.56 gain 196 199 -89.30 gain 199 196 -83.45 gain 196 200 -98.26 gain 200 196 -94.33 gain 196 201 -100.13 gain 201 196 -99.29 gain 196 202 -109.01 gain 202 196 -106.46 gain 196 203 -99.28 gain 203 196 -96.83 gain 196 204 -105.09 gain 204 196 -100.86 gain 196 205 -103.23 gain 205 196 -98.66 gain 196 206 -101.60 gain 206 196 -98.36 gain 196 207 -107.86 gain 207 196 -102.37 gain 196 208 -111.88 gain 208 196 -109.68 gain 196 209 -114.35 gain 209 196 -111.19 gain 196 210 -75.91 gain 210 196 -76.75 gain 196 211 -74.10 gain 211 196 -72.33 gain 196 212 -79.61 gain 212 196 -76.39 gain 196 213 -86.26 gain 213 196 -85.79 gain 196 214 -96.71 gain 214 196 -94.42 gain 196 215 -89.91 gain 215 196 -89.43 gain 196 216 -100.42 gain 216 196 -96.83 gain 196 217 -108.23 gain 217 196 -109.09 gain 196 218 -106.08 gain 218 196 -108.26 gain 196 219 -107.21 gain 219 196 -106.96 gain 196 220 -103.94 gain 220 196 -100.81 gain 196 221 -114.55 gain 221 196 -112.41 gain 196 222 -111.91 gain 222 196 -106.35 gain 196 223 -112.13 gain 223 196 -108.86 gain 196 224 -106.04 gain 224 196 -99.70 gain 197 198 -76.29 gain 198 197 -78.94 gain 197 199 -82.09 gain 199 197 -78.75 gain 197 200 -89.00 gain 200 197 -87.58 gain 197 201 -99.96 gain 201 197 -101.62 gain 197 202 -101.18 gain 202 197 -101.14 gain 197 203 -104.35 gain 203 197 -104.41 gain 197 204 -101.19 gain 204 197 -99.47 gain 197 205 -107.43 gain 205 197 -105.37 gain 197 206 -107.08 gain 206 197 -106.36 gain 197 207 -114.51 gain 207 197 -111.52 gain 197 208 -105.18 gain 208 197 -105.50 gain 197 209 -101.07 gain 209 197 -100.43 gain 197 210 -84.76 gain 210 197 -88.12 gain 197 211 -81.75 gain 211 197 -82.50 gain 197 212 -75.57 gain 212 197 -74.86 gain 197 213 -93.26 gain 213 197 -95.29 gain 197 214 -80.96 gain 214 197 -81.18 gain 197 215 -96.63 gain 215 197 -98.66 gain 197 216 -94.57 gain 216 197 -93.49 gain 197 217 -93.76 gain 217 197 -97.13 gain 197 218 -100.97 gain 218 197 -105.67 gain 197 219 -101.19 gain 219 197 -103.46 gain 197 220 -104.12 gain 220 197 -103.50 gain 197 221 -105.90 gain 221 197 -106.27 gain 197 222 -104.18 gain 222 197 -101.13 gain 197 223 -108.74 gain 223 197 -107.98 gain 197 224 -106.57 gain 224 197 -102.74 gain 198 199 -80.91 gain 199 198 -74.92 gain 198 200 -90.68 gain 200 198 -86.62 gain 198 201 -85.56 gain 201 198 -84.58 gain 198 202 -95.36 gain 202 198 -92.68 gain 198 203 -92.69 gain 203 198 -90.11 gain 198 204 -102.50 gain 204 198 -98.14 gain 198 205 -102.77 gain 205 198 -98.07 gain 198 206 -107.79 gain 206 198 -104.42 gain 198 207 -107.89 gain 207 198 -102.26 gain 198 208 -111.70 gain 208 198 -109.37 gain 198 209 -109.95 gain 209 198 -106.66 gain 198 210 -93.44 gain 210 198 -94.15 gain 198 211 -89.43 gain 211 198 -87.54 gain 198 212 -87.59 gain 212 198 -84.25 gain 198 213 -73.93 gain 213 198 -73.32 gain 198 214 -76.52 gain 214 198 -74.09 gain 198 215 -84.77 gain 215 198 -84.16 gain 198 216 -94.23 gain 216 198 -90.51 gain 198 217 -96.31 gain 217 198 -97.04 gain 198 218 -105.06 gain 218 198 -107.10 gain 198 219 -105.94 gain 219 198 -105.57 gain 198 220 -106.90 gain 220 198 -103.64 gain 198 221 -102.36 gain 221 198 -100.09 gain 198 222 -103.30 gain 222 198 -97.60 gain 198 223 -113.66 gain 223 198 -110.26 gain 198 224 -105.77 gain 224 198 -99.29 gain 199 200 -71.39 gain 200 199 -73.30 gain 199 201 -85.30 gain 201 199 -90.30 gain 199 202 -84.55 gain 202 199 -87.85 gain 199 203 -94.38 gain 203 199 -97.78 gain 199 204 -93.60 gain 204 199 -95.22 gain 199 205 -93.07 gain 205 199 -94.35 gain 199 206 -95.77 gain 206 199 -98.39 gain 199 207 -100.15 gain 207 199 -100.51 gain 199 208 -94.83 gain 208 199 -98.48 gain 199 209 -108.83 gain 209 199 -111.52 gain 199 210 -89.15 gain 210 199 -95.85 gain 199 211 -84.60 gain 211 199 -88.69 gain 199 212 -79.99 gain 212 199 -82.63 gain 199 213 -72.65 gain 213 199 -78.02 gain 199 214 -67.42 gain 214 199 -70.97 gain 199 215 -80.90 gain 215 199 -86.27 gain 199 216 -88.89 gain 216 199 -91.15 gain 199 217 -87.15 gain 217 199 -93.87 gain 199 218 -81.06 gain 218 199 -89.09 gain 199 219 -93.59 gain 219 199 -99.20 gain 199 220 -102.93 gain 220 199 -105.65 gain 199 221 -92.19 gain 221 199 -95.90 gain 199 222 -105.29 gain 222 199 -105.58 gain 199 223 -104.88 gain 223 199 -107.46 gain 199 224 -97.86 gain 224 199 -97.36 gain 200 201 -75.61 gain 201 200 -78.70 gain 200 202 -80.75 gain 202 200 -82.14 gain 200 203 -86.41 gain 203 200 -87.89 gain 200 204 -95.87 gain 204 200 -95.58 gain 200 205 -96.76 gain 205 200 -96.13 gain 200 206 -92.69 gain 206 200 -93.38 gain 200 207 -96.35 gain 207 200 -94.79 gain 200 208 -101.40 gain 208 200 -103.15 gain 200 209 -104.04 gain 209 200 -104.82 gain 200 210 -89.51 gain 210 200 -94.29 gain 200 211 -96.68 gain 211 200 -98.86 gain 200 212 -86.37 gain 212 200 -87.09 gain 200 213 -81.64 gain 213 200 -85.10 gain 200 214 -73.17 gain 214 200 -74.81 gain 200 215 -71.31 gain 215 200 -74.76 gain 200 216 -76.95 gain 216 200 -77.30 gain 200 217 -82.14 gain 217 200 -86.94 gain 200 218 -82.22 gain 218 200 -88.34 gain 200 219 -86.27 gain 219 200 -89.96 gain 200 220 -97.41 gain 220 200 -98.22 gain 200 221 -96.53 gain 221 200 -98.33 gain 200 222 -97.65 gain 222 200 -96.02 gain 200 223 -97.34 gain 223 200 -98.00 gain 200 224 -107.72 gain 224 200 -105.31 gain 201 202 -75.82 gain 202 201 -74.12 gain 201 203 -87.85 gain 203 201 -86.25 gain 201 204 -90.01 gain 204 201 -86.62 gain 201 205 -93.68 gain 205 201 -89.96 gain 201 206 -98.09 gain 206 201 -95.70 gain 201 207 -98.37 gain 207 201 -93.72 gain 201 208 -99.36 gain 208 201 -98.01 gain 201 209 -101.73 gain 209 201 -99.42 gain 201 210 -97.91 gain 210 201 -99.60 gain 201 211 -96.14 gain 211 201 -95.22 gain 201 212 -99.32 gain 212 201 -96.95 gain 201 213 -92.72 gain 213 201 -93.09 gain 201 214 -91.86 gain 214 201 -90.41 gain 201 215 -75.75 gain 215 201 -76.12 gain 201 216 -78.12 gain 216 201 -75.38 gain 201 217 -85.51 gain 217 201 -87.22 gain 201 218 -91.37 gain 218 201 -94.40 gain 201 219 -84.62 gain 219 201 -85.22 gain 201 220 -90.92 gain 220 201 -88.63 gain 201 221 -99.82 gain 221 201 -98.53 gain 201 222 -99.97 gain 222 201 -95.26 gain 201 223 -97.94 gain 223 201 -95.51 gain 201 224 -104.69 gain 224 201 -99.20 gain 202 203 -77.86 gain 203 202 -77.96 gain 202 204 -80.89 gain 204 202 -79.21 gain 202 205 -96.90 gain 205 202 -94.88 gain 202 206 -96.15 gain 206 202 -95.46 gain 202 207 -97.38 gain 207 202 -94.43 gain 202 208 -93.28 gain 208 202 -93.63 gain 202 209 -103.01 gain 209 202 -102.40 gain 202 210 -99.88 gain 210 202 -103.28 gain 202 211 -101.80 gain 211 202 -102.59 gain 202 212 -95.39 gain 212 202 -94.73 gain 202 213 -93.98 gain 213 202 -96.05 gain 202 214 -93.47 gain 214 202 -93.72 gain 202 215 -90.13 gain 215 202 -92.20 gain 202 216 -81.69 gain 216 202 -80.65 gain 202 217 -77.73 gain 217 202 -81.14 gain 202 218 -81.23 gain 218 202 -85.96 gain 202 219 -83.24 gain 219 202 -85.55 gain 202 220 -91.13 gain 220 202 -90.55 gain 202 221 -90.14 gain 221 202 -90.55 gain 202 222 -98.55 gain 222 202 -95.54 gain 202 223 -93.56 gain 223 202 -92.84 gain 202 224 -96.99 gain 224 202 -93.19 gain 203 204 -80.35 gain 204 203 -78.57 gain 203 205 -81.40 gain 205 203 -79.29 gain 203 206 -85.09 gain 206 203 -84.30 gain 203 207 -88.82 gain 207 203 -85.78 gain 203 208 -95.21 gain 208 203 -95.47 gain 203 209 -103.42 gain 209 203 -102.72 gain 203 210 -104.91 gain 210 203 -108.21 gain 203 211 -106.47 gain 211 203 -107.15 gain 203 212 -97.42 gain 212 203 -96.66 gain 203 213 -96.74 gain 213 203 -98.72 gain 203 214 -98.77 gain 214 203 -98.93 gain 203 215 -94.34 gain 215 203 -96.31 gain 203 216 -90.57 gain 216 203 -89.44 gain 203 217 -81.96 gain 217 203 -85.27 gain 203 218 -71.41 gain 218 203 -76.04 gain 203 219 -79.42 gain 219 203 -81.63 gain 203 220 -83.04 gain 220 203 -82.36 gain 203 221 -91.45 gain 221 203 -91.76 gain 203 222 -88.80 gain 222 203 -85.69 gain 203 223 -91.06 gain 223 203 -90.23 gain 203 224 -97.58 gain 224 203 -93.69 gain 204 205 -75.79 gain 205 204 -75.46 gain 204 206 -85.45 gain 206 204 -86.44 gain 204 207 -89.61 gain 207 204 -88.34 gain 204 208 -101.57 gain 208 204 -103.60 gain 204 209 -98.26 gain 209 204 -99.34 gain 204 210 -105.79 gain 210 204 -110.87 gain 204 211 -95.78 gain 211 204 -98.25 gain 204 212 -93.41 gain 212 204 -94.42 gain 204 213 -100.30 gain 213 204 -104.06 gain 204 214 -95.28 gain 214 204 -97.22 gain 204 215 -94.41 gain 215 204 -98.16 gain 204 216 -90.84 gain 216 204 -91.48 gain 204 217 -85.01 gain 217 204 -90.11 gain 204 218 -80.48 gain 218 204 -86.89 gain 204 219 -75.91 gain 219 204 -79.90 gain 204 220 -79.72 gain 220 204 -80.82 gain 204 221 -84.95 gain 221 204 -87.04 gain 204 222 -88.21 gain 222 204 -86.88 gain 204 223 -93.66 gain 223 204 -94.61 gain 204 224 -94.53 gain 224 204 -92.42 gain 205 206 -78.83 gain 206 205 -80.16 gain 205 207 -88.01 gain 207 205 -87.08 gain 205 208 -88.42 gain 208 205 -90.79 gain 205 209 -92.28 gain 209 205 -93.69 gain 205 210 -107.26 gain 210 205 -112.67 gain 205 211 -107.37 gain 211 205 -110.18 gain 205 212 -93.76 gain 212 205 -95.10 gain 205 213 -96.05 gain 213 205 -100.14 gain 205 214 -98.28 gain 214 205 -100.55 gain 205 215 -87.05 gain 215 205 -91.14 gain 205 216 -94.06 gain 216 205 -95.04 gain 205 217 -91.21 gain 217 205 -96.64 gain 205 218 -83.34 gain 218 205 -90.08 gain 205 219 -73.66 gain 219 205 -77.98 gain 205 220 -73.96 gain 220 205 -75.39 gain 205 221 -80.84 gain 221 205 -83.27 gain 205 222 -82.65 gain 222 205 -81.66 gain 205 223 -87.29 gain 223 205 -88.58 gain 205 224 -93.44 gain 224 205 -91.66 gain 206 207 -70.23 gain 207 206 -67.97 gain 206 208 -86.18 gain 208 206 -87.23 gain 206 209 -94.66 gain 209 206 -94.74 gain 206 210 -104.23 gain 210 206 -108.31 gain 206 211 -106.72 gain 211 206 -108.20 gain 206 212 -108.26 gain 212 206 -108.28 gain 206 213 -99.67 gain 213 206 -102.43 gain 206 214 -99.58 gain 214 206 -100.52 gain 206 215 -93.02 gain 215 206 -95.78 gain 206 216 -99.80 gain 216 206 -99.45 gain 206 217 -98.19 gain 217 206 -102.30 gain 206 218 -88.74 gain 218 206 -94.16 gain 206 219 -84.70 gain 219 206 -87.70 gain 206 220 -68.32 gain 220 206 -68.43 gain 206 221 -71.72 gain 221 206 -72.82 gain 206 222 -80.03 gain 222 206 -77.71 gain 206 223 -90.60 gain 223 206 -90.56 gain 206 224 -92.27 gain 224 206 -89.16 gain 207 208 -74.23 gain 208 207 -77.54 gain 207 209 -82.76 gain 209 207 -85.10 gain 207 210 -106.93 gain 210 207 -113.27 gain 207 211 -98.50 gain 211 207 -102.23 gain 207 212 -103.14 gain 212 207 -105.42 gain 207 213 -99.29 gain 213 207 -104.31 gain 207 214 -101.80 gain 214 207 -105.00 gain 207 215 -98.94 gain 215 207 -103.95 gain 207 216 -98.19 gain 216 207 -100.10 gain 207 217 -91.19 gain 217 207 -97.55 gain 207 218 -89.76 gain 218 207 -97.43 gain 207 219 -89.36 gain 219 207 -94.61 gain 207 220 -78.77 gain 220 207 -81.13 gain 207 221 -76.28 gain 221 207 -79.64 gain 207 222 -71.51 gain 222 207 -71.44 gain 207 223 -72.43 gain 223 207 -74.66 gain 207 224 -79.38 gain 224 207 -78.53 gain 208 209 -77.90 gain 209 208 -76.93 gain 208 210 -107.37 gain 210 208 -110.41 gain 208 211 -109.42 gain 211 208 -109.86 gain 208 212 -110.06 gain 212 208 -109.04 gain 208 213 -102.06 gain 213 208 -103.78 gain 208 214 -112.54 gain 214 208 -112.44 gain 208 215 -105.92 gain 215 208 -107.64 gain 208 216 -104.86 gain 216 208 -103.47 gain 208 217 -99.63 gain 217 208 -102.69 gain 208 218 -100.14 gain 218 208 -104.52 gain 208 219 -95.25 gain 219 208 -97.20 gain 208 220 -90.91 gain 220 208 -89.98 gain 208 221 -90.96 gain 221 208 -91.02 gain 208 222 -84.67 gain 222 208 -81.30 gain 208 223 -71.50 gain 223 208 -70.42 gain 208 224 -80.98 gain 224 208 -76.83 gain 209 210 -113.37 gain 210 209 -117.37 gain 209 211 -101.72 gain 211 209 -103.11 gain 209 212 -101.83 gain 212 209 -101.78 gain 209 213 -102.28 gain 213 209 -104.96 gain 209 214 -104.42 gain 214 209 -105.28 gain 209 215 -103.04 gain 215 209 -105.72 gain 209 216 -98.15 gain 216 209 -97.72 gain 209 217 -98.18 gain 217 209 -102.20 gain 209 218 -97.45 gain 218 209 -102.79 gain 209 219 -96.37 gain 219 209 -99.29 gain 209 220 -91.20 gain 220 209 -91.23 gain 209 221 -89.53 gain 221 209 -90.55 gain 209 222 -84.68 gain 222 209 -82.28 gain 209 223 -80.89 gain 223 209 -80.77 gain 209 224 -76.85 gain 224 209 -73.67 gain 210 211 -80.75 gain 211 210 -78.15 gain 210 212 -89.46 gain 212 210 -85.41 gain 210 213 -89.83 gain 213 210 -88.51 gain 210 214 -91.83 gain 214 210 -88.69 gain 210 215 -90.54 gain 215 210 -89.22 gain 210 216 -109.80 gain 216 210 -105.37 gain 210 217 -102.51 gain 217 210 -102.53 gain 210 218 -104.86 gain 218 210 -106.20 gain 210 219 -110.77 gain 219 210 -109.69 gain 210 220 -115.25 gain 220 210 -111.27 gain 210 221 -114.01 gain 221 210 -111.03 gain 210 222 -111.56 gain 222 210 -105.15 gain 210 223 -118.67 gain 223 210 -114.55 gain 210 224 -116.18 gain 224 210 -108.99 gain 211 212 -78.81 gain 212 211 -77.36 gain 211 213 -83.83 gain 213 211 -85.12 gain 211 214 -90.86 gain 214 211 -90.33 gain 211 215 -93.94 gain 215 211 -95.22 gain 211 216 -96.16 gain 216 211 -94.33 gain 211 217 -94.26 gain 217 211 -96.88 gain 211 218 -109.20 gain 218 211 -113.15 gain 211 219 -107.19 gain 219 211 -108.71 gain 211 220 -104.75 gain 220 211 -103.38 gain 211 221 -103.09 gain 221 211 -102.72 gain 211 222 -98.83 gain 222 211 -95.03 gain 211 223 -106.52 gain 223 211 -105.01 gain 211 224 -105.96 gain 224 211 -101.38 gain 212 213 -74.55 gain 213 212 -77.29 gain 212 214 -81.78 gain 214 212 -82.70 gain 212 215 -94.74 gain 215 212 -97.48 gain 212 216 -90.96 gain 216 212 -90.59 gain 212 217 -94.32 gain 217 212 -98.40 gain 212 218 -105.02 gain 218 212 -110.42 gain 212 219 -101.89 gain 219 212 -104.86 gain 212 220 -105.60 gain 220 212 -105.68 gain 212 221 -105.95 gain 221 212 -107.03 gain 212 222 -101.20 gain 222 212 -98.85 gain 212 223 -104.68 gain 223 212 -104.62 gain 212 224 -106.86 gain 224 212 -103.73 gain 213 214 -82.93 gain 214 213 -81.11 gain 213 215 -91.47 gain 215 213 -91.47 gain 213 216 -91.94 gain 216 213 -88.83 gain 213 217 -99.51 gain 217 213 -100.85 gain 213 218 -97.88 gain 218 213 -100.54 gain 213 219 -99.65 gain 219 213 -99.88 gain 213 220 -109.46 gain 220 213 -106.80 gain 213 221 -103.04 gain 221 213 -101.38 gain 213 222 -110.14 gain 222 213 -105.06 gain 213 223 -107.66 gain 223 213 -104.86 gain 213 224 -109.81 gain 224 213 -103.95 gain 214 215 -72.45 gain 215 214 -74.27 gain 214 216 -81.30 gain 216 214 -80.01 gain 214 217 -86.43 gain 217 214 -89.59 gain 214 218 -91.69 gain 218 214 -96.17 gain 214 219 -95.31 gain 219 214 -97.36 gain 214 220 -98.73 gain 220 214 -97.89 gain 214 221 -98.25 gain 221 214 -98.41 gain 214 222 -99.92 gain 222 214 -96.66 gain 214 223 -101.76 gain 223 214 -100.78 gain 214 224 -107.57 gain 224 214 -103.52 gain 215 216 -76.02 gain 216 215 -72.91 gain 215 217 -87.80 gain 217 215 -89.15 gain 215 218 -97.04 gain 218 215 -99.70 gain 215 219 -102.45 gain 219 215 -102.69 gain 215 220 -103.43 gain 220 215 -100.78 gain 215 221 -104.49 gain 221 215 -102.83 gain 215 222 -101.73 gain 222 215 -96.65 gain 215 223 -104.15 gain 223 215 -101.36 gain 215 224 -105.93 gain 224 215 -100.07 gain 216 217 -71.13 gain 217 216 -75.58 gain 216 218 -80.70 gain 218 216 -86.47 gain 216 219 -87.88 gain 219 216 -91.23 gain 216 220 -95.32 gain 220 216 -95.78 gain 216 221 -95.24 gain 221 216 -96.69 gain 216 222 -103.08 gain 222 216 -101.10 gain 216 223 -104.16 gain 223 216 -104.47 gain 216 224 -95.36 gain 224 216 -92.61 gain 217 218 -81.16 gain 218 217 -82.47 gain 217 219 -89.38 gain 219 217 -88.27 gain 217 220 -93.81 gain 220 217 -89.82 gain 217 221 -96.99 gain 221 217 -93.99 gain 217 222 -96.24 gain 222 217 -89.81 gain 217 223 -103.65 gain 223 217 -99.52 gain 217 224 -109.32 gain 224 217 -102.11 gain 218 219 -75.75 gain 219 218 -73.33 gain 218 220 -87.07 gain 220 218 -81.76 gain 218 221 -90.71 gain 221 218 -86.39 gain 218 222 -96.37 gain 222 218 -88.63 gain 218 223 -105.47 gain 223 218 -100.02 gain 218 224 -104.37 gain 224 218 -95.85 gain 219 220 -78.27 gain 220 219 -75.38 gain 219 221 -91.95 gain 221 219 -90.05 gain 219 222 -88.05 gain 222 219 -82.74 gain 219 223 -94.02 gain 223 219 -91.00 gain 219 224 -105.17 gain 224 219 -99.07 gain 220 221 -73.97 gain 221 220 -74.96 gain 220 222 -79.39 gain 222 220 -76.96 gain 220 223 -86.68 gain 223 220 -86.54 gain 220 224 -85.01 gain 224 220 -81.80 gain 221 222 -78.11 gain 222 221 -74.68 gain 221 223 -83.57 gain 223 221 -82.44 gain 221 224 -88.74 gain 224 221 -84.54 gain 222 223 -73.06 gain 223 222 -75.35 gain 222 224 -82.84 gain 224 222 -82.06 gain 223 224 -75.27 gain 224 223 -72.20 noise 0 -104.54 4.00 noise 1 -103.79 4.00 noise 2 -101.87 4.00 noise 3 -106.08 4.00 noise 4 -105.32 4.00 noise 5 -104.45 4.00 noise 6 -102.09 4.00 noise 7 -105.22 4.00 noise 8 -104.99 4.00 noise 9 -104.47 4.00 noise 10 -105.74 4.00 noise 11 -104.33 4.00 noise 12 -105.70 4.00 noise 13 -106.20 4.00 noise 14 -105.95 4.00 noise 15 -103.36 4.00 noise 16 -105.46 4.00 noise 17 -106.54 4.00 noise 18 -106.48 4.00 noise 19 -101.26 4.00 noise 20 -105.48 4.00 noise 21 -105.17 4.00 noise 22 -105.10 4.00 noise 23 -105.98 4.00 noise 24 -106.55 4.00 noise 25 -104.52 4.00 noise 26 -105.15 4.00 noise 27 -104.74 4.00 noise 28 -102.79 4.00 noise 29 -109.32 4.00 noise 30 -102.53 4.00 noise 31 -102.64 4.00 noise 32 -107.20 4.00 noise 33 -109.02 4.00 noise 34 -102.55 4.00 noise 35 -103.90 4.00 noise 36 -104.98 4.00 noise 37 -105.06 4.00 noise 38 -104.27 4.00 noise 39 -104.86 4.00 noise 40 -102.73 4.00 noise 41 -107.87 4.00 noise 42 -102.67 4.00 noise 43 -103.69 4.00 noise 44 -105.80 4.00 noise 45 -110.47 4.00 noise 46 -106.64 4.00 noise 47 -105.95 4.00 noise 48 -105.30 4.00 noise 49 -107.79 4.00 noise 50 -105.86 4.00 noise 51 -106.22 4.00 noise 52 -106.60 4.00 noise 53 -103.74 4.00 noise 54 -107.67 4.00 noise 55 -104.18 4.00 noise 56 -104.09 4.00 noise 57 -103.29 4.00 noise 58 -104.05 4.00 noise 59 -103.91 4.00 noise 60 -104.10 4.00 noise 61 -108.48 4.00 noise 62 -106.10 4.00 noise 63 -106.53 4.00 noise 64 -105.07 4.00 noise 65 -103.99 4.00 noise 66 -108.07 4.00 noise 67 -105.87 4.00 noise 68 -104.60 4.00 noise 69 -107.30 4.00 noise 70 -107.30 4.00 noise 71 -105.26 4.00 noise 72 -100.45 4.00 noise 73 -105.87 4.00 noise 74 -106.10 4.00 noise 75 -106.90 4.00 noise 76 -106.32 4.00 noise 77 -107.06 4.00 noise 78 -102.14 4.00 noise 79 -105.68 4.00 noise 80 -106.48 4.00 noise 81 -102.20 4.00 noise 82 -104.73 4.00 noise 83 -106.16 4.00 noise 84 -104.31 4.00 noise 85 -104.19 4.00 noise 86 -106.97 4.00 noise 87 -107.50 4.00 noise 88 -105.13 4.00 noise 89 -102.95 4.00 noise 90 -102.71 4.00 noise 91 -106.49 4.00 noise 92 -101.72 4.00 noise 93 -103.98 4.00 noise 94 -104.48 4.00 noise 95 -103.22 4.00 noise 96 -106.64 4.00 noise 97 -105.89 4.00 noise 98 -107.24 4.00 noise 99 -104.28 4.00 noise 100 -105.73 4.00 noise 101 -108.52 4.00 noise 102 -106.10 4.00 noise 103 -104.87 4.00 noise 104 -105.58 4.00 noise 105 -107.13 4.00 noise 106 -106.00 4.00 noise 107 -101.40 4.00 noise 108 -107.03 4.00 noise 109 -108.88 4.00 noise 110 -104.71 4.00 noise 111 -107.31 4.00 noise 112 -103.73 4.00 noise 113 -102.53 4.00 noise 114 -102.65 4.00 noise 115 -105.76 4.00 noise 116 -104.72 4.00 noise 117 -103.01 4.00 noise 118 -102.86 4.00 noise 119 -105.58 4.00 noise 120 -104.07 4.00 noise 121 -105.55 4.00 noise 122 -101.86 4.00 noise 123 -103.65 4.00 noise 124 -107.65 4.00 noise 125 -106.27 4.00 noise 126 -104.26 4.00 noise 127 -105.62 4.00 noise 128 -106.85 4.00 noise 129 -108.41 4.00 noise 130 -105.94 4.00 noise 131 -104.63 4.00 noise 132 -108.30 4.00 noise 133 -103.40 4.00 noise 134 -106.03 4.00 noise 135 -108.60 4.00 noise 136 -104.05 4.00 noise 137 -104.67 4.00 noise 138 -103.63 4.00 noise 139 -105.61 4.00 noise 140 -105.50 4.00 noise 141 -106.44 4.00 noise 142 -106.80 4.00 noise 143 -103.99 4.00 noise 144 -107.34 4.00 noise 145 -105.23 4.00 noise 146 -104.53 4.00 noise 147 -105.55 4.00 noise 148 -106.40 4.00 noise 149 -107.64 4.00 noise 150 -107.72 4.00 noise 151 -100.45 4.00 noise 152 -103.47 4.00 noise 153 -104.38 4.00 noise 154 -104.80 4.00 noise 155 -108.24 4.00 noise 156 -106.12 4.00 noise 157 -104.14 4.00 noise 158 -104.84 4.00 noise 159 -104.72 4.00 noise 160 -102.00 4.00 noise 161 -106.60 4.00 noise 162 -104.81 4.00 noise 163 -108.87 4.00 noise 164 -103.71 4.00 noise 165 -102.58 4.00 noise 166 -101.49 4.00 noise 167 -105.32 4.00 noise 168 -104.48 4.00 noise 169 -106.44 4.00 noise 170 -107.46 4.00 noise 171 -104.56 4.00 noise 172 -105.14 4.00 noise 173 -106.17 4.00 noise 174 -103.92 4.00 noise 175 -108.82 4.00 noise 176 -107.80 4.00 noise 177 -103.64 4.00 noise 178 -105.16 4.00 noise 179 -105.01 4.00 noise 180 -106.44 4.00 noise 181 -103.30 4.00 noise 182 -106.61 4.00 noise 183 -107.62 4.00 noise 184 -103.79 4.00 noise 185 -105.15 4.00 noise 186 -104.53 4.00 noise 187 -106.04 4.00 noise 188 -103.39 4.00 noise 189 -103.88 4.00 noise 190 -106.80 4.00 noise 191 -107.83 4.00 noise 192 -105.03 4.00 noise 193 -106.80 4.00 noise 194 -104.66 4.00 noise 195 -108.63 4.00 noise 196 -104.61 4.00 noise 197 -107.59 4.00 noise 198 -103.22 4.00 noise 199 -107.19 4.00 noise 200 -107.44 4.00 noise 201 -104.85 4.00 noise 202 -105.26 4.00 noise 203 -105.66 4.00 noise 204 -109.45 4.00 noise 205 -107.63 4.00 noise 206 -105.19 4.00 noise 207 -105.82 4.00 noise 208 -104.71 4.00 noise 209 -105.68 4.00 noise 210 -103.54 4.00 noise 211 -106.32 4.00 noise 212 -104.62 4.00 noise 213 -104.03 4.00 noise 214 -106.30 4.00 noise 215 -103.40 4.00 noise 216 -105.08 4.00 noise 217 -104.01 4.00 noise 218 -102.13 4.00 noise 219 -101.03 4.00 noise 220 -106.55 4.00 noise 221 -105.11 4.00 noise 222 -104.38 4.00 noise 223 -106.19 4.00 noise 224 -106.60 4.00 tinyos-2.1.2+dfsg/apps/tests/TestNetworkLpl/000077500000000000000000000000001207233610700210275ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestNetworkLpl/Makefile000066400000000000000000000044741207233610700225000ustar00rootroot00000000000000COMPONENT=TestNetworkLplAppC CFLAGS += -DLOW_POWER_LISTENING CFLAGS += -DLPL_DEF_LOCAL_WAKEUP=512 CFLAGS += -DLPL_DEF_REMOTE_WAKEUP=512 CFLAGS += -DDELAY_AFTER_RECEIVE=20 # CFLAGS += -DCC2420_DEF_CHANNEL=12 CFLAGS += -I. CFLAGS += -I../TestNetwork CFLAGS += -I$(TOSDIR)/lib/net \ -I$(TOSDIR)/lib/net/drip \ -I$(TOSDIR)/lib/net/4bitle \ -I$(TOSDIR)/lib/net/ctp -DNO_DEBUG TFLAGS += -I$(TOSDIR)/../apps/tests/TestDissemination \ -I$(TOSDIR)/../support/sdk/c \ -I$(TOSDIR)/types \ -I. LIBMOTE = $(TOSDIR)/../support/sdk/c/libmote.a #BUILD_EXTRA_DEPS += tn-injector #tn-listener LISTEN_OBJS = collection_msg.o test_network_msg.o tn-listener.o $(LIBMOTE) INJECT_OBJS = set_rate_msg.o tn-injector.o collection_debug_msg.o $(LIBMOTE) # arguments: output filename stem, input filename, struct name define mig_templ MIGFILES += $(1).c $(1).h $(1).java $(1).o $(1).c: mig -o $(1).h c -target=$$(PLATFORM) $$(CFLAGS) $$(TFLAGS) $(2) $(3) $(1).java: mig -o $(1).java java -target=$$(PLATFORM) $$(CFLAGS) $$(TFLAGS) $(2) $(3) endef $(eval $(call mig_templ,test_network_msg,TestNetwork.h,TestNetworkMsg)) $(eval $(call mig_templ,set_rate_msg,$(TOSDIR)/lib/net/DisseminationEngine.h,dissemination_message)) $(eval $(call mig_templ,collection_debug_msg,$(TOSDIR)/lib/net/collection/CollectionDebugMsg.h,CollectionDebugMsg)) %.o: %.c gcc -v $(TFLAGS) $(CFLAGS) -c -o $@ $< tn-listener: $(LISTEN_OBJS) gcc -v $(TFLAGS) $(CFLAGS) -o $@ $(LISTEN_OBJS) tn-injector: $(INJECT_OBJS) gcc -v $(TFLAGS) $(CFLAGS) -o $@ $(INJECT_OBJS) #tn-listener.o: tn-listener.c # gcc $(TFLAGS) $(CFLAGS) -c -o $@ $< tn-injector.o: tn-injector.c test_network_msg.c gcc $(TFLAGS) $(CFLAGS) -c -o $@ $< #test_network_msg.c: # mig -o test_network_msg.h c -target=$(PLATFORM) $(CFLAGS) $(TFLAGS) TestNetwork.h TestNetworkMsg #set_rate_msg.c: # mig -o set_rate_msg.h c -target=$(PLATFORM) $(CFLAGS) $(TFLAGS) $(TOSDIR)/lib/net/DisseminationEngine.h dissemination_message #set_rate_msg.o: set_rate_msg.c # gcc $(CFLAGS) $(TFLAGS) -c -o $@ $< #test_network_msg.o: test_network_msg.c # gcc $(CFLAGS) $(TFLAGS) -c -o $@ $< #collection_msg.c: # mig -o collection_msg.h c -target=$(PLATFORM) $(CFLAGS) $(TFLAGS) $(TOSDIR)/lib/net/collection/ForwardingEngine.h collection_header include $(MAKERULES) migclean: rm -rf $(MIGFILES) tinyos-2.1.2+dfsg/apps/tests/TestNetworkLpl/README.txt000066400000000000000000000007661207233610700225360ustar00rootroot00000000000000README for TestNetworkLpl Author/Contact: tinyos-help@millennium.berkeley.edu Description: This is a version of the TestNetworkLpl application that is using the default LowPowerListening mechanism to reduce the power consumption. The settings for default lpl are controlled by the following lines from the Makefile: CFLAGS += -DLOW_POWER_LISTENING CFLAGS += -DLPL_DEF_LOCAL_WAKEUP=512 CFLAGS += -DLPL_DEF_REMOTE_WAKEUP=512 CFLAGS += -DDELAY_AFTER_RECEIVE=20 Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/TestNetworkLpl/TestNetworkLplAppC.nc000066400000000000000000000050131207233610700250550ustar00rootroot00000000000000/** * TestNetworkLplC exercises the basic networking layers, collection and * dissemination. The application samples DemoSensorC at a basic rate * and sends packets up a collection tree. The rate is configurable * through dissemination. * * See TEP118: Dissemination, TEP 119: Collection, and TEP 123: The * Collection Tree Protocol for details. * * @author Philip Levis * @version $Revision: 1.1 $ $Date: 2009-09-16 00:53:47 $ */ #include "TestNetwork.h" #include "Ctp.h" configuration TestNetworkLplAppC {} implementation { components TestNetworkLplC, MainC, LedsC, ActiveMessageC; components DisseminationC; components new DisseminatorC(uint32_t, SAMPLE_RATE_KEY) as Object32C; components CollectionC as Collector; components new CollectionSenderC(CL_TEST); components new TimerMilliC(); components new DemoSensorC(); components new SerialAMSenderC(CL_TEST); components SerialActiveMessageC; #ifndef NO_DEBUG components new SerialAMSenderC(AM_COLLECTION_DEBUG) as UARTSender; components UARTDebugSenderP as DebugSender; #endif components RandomC; components new QueueC(message_t*, 12); components new PoolC(message_t, 12); TestNetworkLplC.Boot -> MainC; TestNetworkLplC.RadioControl -> ActiveMessageC; TestNetworkLplC.SerialControl -> SerialActiveMessageC; TestNetworkLplC.RoutingControl -> Collector; TestNetworkLplC.DisseminationControl -> DisseminationC; TestNetworkLplC.Leds -> LedsC; TestNetworkLplC.Timer -> TimerMilliC; TestNetworkLplC.DisseminationPeriod -> Object32C; TestNetworkLplC.Send -> CollectionSenderC; TestNetworkLplC.ReadSensor -> DemoSensorC; TestNetworkLplC.RootControl -> Collector; TestNetworkLplC.Receive -> Collector.Receive[CL_TEST]; TestNetworkLplC.UARTSend -> SerialAMSenderC.AMSend; TestNetworkLplC.CollectionPacket -> Collector; TestNetworkLplC.CtpInfo -> Collector; TestNetworkLplC.CtpCongestion -> Collector; TestNetworkLplC.Random -> RandomC; TestNetworkLplC.Pool -> PoolC; TestNetworkLplC.Queue -> QueueC; TestNetworkLplC.RadioPacket -> ActiveMessageC; TestNetworkLplC.LowPowerListening -> ActiveMessageC; #ifndef NO_DEBUG components new PoolC(message_t, 10) as DebugMessagePool; components new QueueC(message_t*, 10) as DebugSendQueue; DebugSender.Boot -> MainC; DebugSender.UARTSend -> UARTSender; DebugSender.MessagePool -> DebugMessagePool; DebugSender.SendQueue -> DebugSendQueue; Collector.CollectionDebug -> DebugSender; TestNetworkLplC.CollectionDebug -> DebugSender; #endif TestNetworkLplC.AMPacket -> ActiveMessageC; } tinyos-2.1.2+dfsg/apps/tests/TestNetworkLpl/TestNetworkLplC.nc000066400000000000000000000142521207233610700244210ustar00rootroot00000000000000/** * TestNetworkC exercises the basic networking layers, collection and * dissemination. The application samples DemoSensorC at a basic rate * and sends packets up a collection tree. The rate is configurable * through dissemination. The default send rate is every 10s. * * See TEP118: Dissemination and TEP 119: Collection for details. * * @author Philip Levis * @version $Revision: 1.1 $ $Date: 2009-09-16 00:53:47 $ */ #include #include "TestNetwork.h" #include "CtpDebugMsg.h" module TestNetworkLplC { uses interface Boot; uses interface SplitControl as RadioControl; uses interface SplitControl as SerialControl; uses interface StdControl as RoutingControl; uses interface StdControl as DisseminationControl; uses interface DisseminationValue as DisseminationPeriod; uses interface Send; uses interface Leds; uses interface Read as ReadSensor; uses interface Timer; uses interface RootControl; uses interface Receive; uses interface AMSend as UARTSend; uses interface CollectionPacket; uses interface CtpInfo; uses interface CtpCongestion; uses interface Random; uses interface Queue; uses interface Pool; uses interface CollectionDebug; uses interface AMPacket; uses interface Packet as RadioPacket; uses interface LowPowerListening; } implementation { task void uartEchoTask(); message_t packet; message_t uartpacket; message_t* recvPtr = &uartpacket; uint8_t msglen; bool sendBusy = FALSE; bool uartbusy = FALSE; bool firstTimer = TRUE; uint16_t seqno; enum { SEND_INTERVAL = 60*1024U, }; event void ReadSensor.readDone(error_t err, uint16_t val) { } event void Boot.booted() { call SerialControl.start(); } event void SerialControl.startDone(error_t err) { if (TOS_NODE_ID % 500 == 0) { call LowPowerListening.setLocalWakeupInterval(0); } call RadioControl.start(); } event void RadioControl.startDone(error_t err) { if (err != SUCCESS) { call RadioControl.start(); } else { //call DisseminationControl.start(); call RoutingControl.start(); if (TOS_NODE_ID % 500 == 0) { call RootControl.setRoot(); } seqno = 0; call Timer.startOneShot(call Random.rand32() % SEND_INTERVAL); } } event void RadioControl.stopDone(error_t err) {} event void SerialControl.stopDone(error_t err) {} void failedSend() { dbg("App", "%s: Send failed.\n", __FUNCTION__); call CollectionDebug.logEvent(NET_C_DBG_1); } void sendMessage() { TestNetworkMsg* msg = (TestNetworkMsg*)call Send.getPayload(&packet, sizeof(TestNetworkMsg)); uint16_t metric; am_addr_t parent = 0; call CtpInfo.getParent(&parent); call CtpInfo.getEtx(&metric); msg->source = TOS_NODE_ID; msg->seqno = seqno; msg->data = 0xCAFE; msg->parent = parent; msg->hopcount = 0; msg->metric = metric; if (call Send.send(&packet, sizeof(TestNetworkMsg)) != SUCCESS) { failedSend(); call Leds.led0On(); dbg("TestNetworkC", "%s: Transmission failed.\n", __FUNCTION__); } else { sendBusy = TRUE; seqno++; dbg("TestNetworkC", "%s: Transmission succeeded.\n", __FUNCTION__); } } event void Timer.fired() { uint32_t nextInt; call Leds.led0Toggle(); dbg("TestNetworkC", "TestNetworkC: Timer fired.\n"); nextInt = call Random.rand32() % SEND_INTERVAL; nextInt += SEND_INTERVAL >> 1; call Timer.startOneShot(nextInt); if (!sendBusy) sendMessage(); } event void Send.sendDone(message_t* m, error_t err) { if (err != SUCCESS) { // call Leds.led0On(); } sendBusy = FALSE; dbg("TestNetworkC", "Send completed.\n"); } event void DisseminationPeriod.changed() { const uint32_t* newVal = call DisseminationPeriod.get(); call Timer.stop(); call Timer.startPeriodic(*newVal); } event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) { dbg("TestNetworkC", "Received packet at %s from node %hhu.\n", sim_time_string(), call CollectionPacket.getOrigin(msg)); call Leds.led1Toggle(); if (!call Pool.size() <= (TEST_NETWORK_QUEUE_SIZE < 4)? 1:3) { // call CtpCongestion.setClientCongested(TRUE); } if (!call Pool.empty() && call Queue.size() < call Queue.maxSize()) { message_t* tmp = call Pool.get(); call Queue.enqueue(msg); if (!uartbusy) { post uartEchoTask(); } return tmp; } return msg; } task void uartEchoTask() { dbg("Traffic", "Sending packet to UART.\n"); if (call Queue.empty()) { return; } else if (!uartbusy) { message_t* msg = call Queue.dequeue(); dbg("Traffic", "Sending packet to UART.\n"); if (call UARTSend.send(0xffff, msg, call RadioPacket.payloadLength(msg)) == SUCCESS) { uartbusy = TRUE; } else { call CollectionDebug.logEventMsg(NET_C_DBG_2, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); } } } event void UARTSend.sendDone(message_t *msg, error_t error) { dbg("Traffic", "UART send done.\n"); uartbusy = FALSE; call Pool.put(msg); if (!call Queue.empty()) { post uartEchoTask(); } else { // call CtpCongestion.setClientCongested(FALSE); } } /* Default implementations for CollectionDebug calls. * These allow CollectionDebug not to be wired to anything if debugging * is not desired. */ default command error_t CollectionDebug.logEvent(uint8_t type) { return SUCCESS; } default command error_t CollectionDebug.logEventSimple(uint8_t type, uint16_t arg) { return SUCCESS; } default command error_t CollectionDebug.logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3) { return SUCCESS; } default command error_t CollectionDebug.logEventMsg(uint8_t type, uint16_t msg, am_addr_t origin, am_addr_t node) { return SUCCESS; } default command error_t CollectionDebug.logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t metric) { return SUCCESS; } } tinyos-2.1.2+dfsg/apps/tests/TestNetworkLpl/ctp-dump.py000077500000000000000000000031571207233610700231430ustar00rootroot00000000000000#!/usr/bin/env python import sys, time import tos class Test(tos.Packet): def __init__(self, payload = None): tos.Packet.__init__(self, [('source', 'int', 2), ('seqno', 'int', 2), ('parent', 'int', 2), ('metric', 'int', 2), ('data', 'int', 2), ('hopcount', 'int', 1), ('sendCount','int', 2), ('sendSuccessCount','int', 2)], payload) class CtpData(tos.Packet): def __init__(self, payload = None): tos.Packet.__init__(self, [('options', 'int', 1), ('thl', 'int', 1), ('etx', 'int', 2), ('origin', 'int', 2), ('originSeqNo', 'int', 1), ('collectionId','int', 1), ('data', 'blob', None)], payload) if len(sys.argv) < 2: print "Usage:", sys.argv[0], "serial@/dev/ttyUSB0:57600" sys.exit() #s = tos.Serial(sys.argv[1], int(sys.argv[2]), debug=False) am = tos.AM() while True: p = am.read() if p: if p.type == 238: ts = "%.4f" % time.time() ctp = CtpData(p.data) test = Test(ctp.data) print ts, '\t', ctp print ts, '\t', test else: print p tinyos-2.1.2+dfsg/apps/tests/TestRPL/000077500000000000000000000000001207233610700173635ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestRPL/udp/000077500000000000000000000000001207233610700201535ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestRPL/udp/LocalIeeeEui64C.nc000066400000000000000000000013241207233610700232370ustar00rootroot00000000000000#include "PlatformIeeeEui64.h" module LocalIeeeEui64C { provides interface LocalIeeeEui64; } implementation { command ieee_eui64_t LocalIeeeEui64.getId() { ieee_eui64_t eui; eui.data[0] = IEEE_EUI64_COMPANY_ID_0; eui.data[1] = IEEE_EUI64_COMPANY_ID_1; eui.data[2] = IEEE_EUI64_COMPANY_ID_2; // 16 bits of the ID is generated by software // could be used for hardware model id and revision, for example eui.data[3] = IEEE_EUI64_SERIAL_ID_0; eui.data[4] = IEEE_EUI64_SERIAL_ID_1; eui.data[5] = 0; //eui.data[4] = TOS_NODE_ID << 8; //eui.data[5] = TOS_NODE_ID; //eui.data[6] = TOS_NODE_ID << 8; eui.data[6] = 0; eui.data[7] = TOS_NODE_ID; return eui; } } tinyos-2.1.2+dfsg/apps/tests/TestRPL/udp/Makefile000066400000000000000000000016341207233610700216170ustar00rootroot00000000000000COMPONENT=TestRPLAppC # NB : # DEFAULT_LOCAL_GROUP=0xabcd # radio settings CFLAGS+=-DCC2420_DEF_CHANNEL=25 CFLAGS+=-DCC2520_DEF_CHANNEL=25 # enable RPL CFLAGS+=-DRPL_ROUTING -DRPL_STORING_MODE -I$(LOWPAN_ROOT)/tos/lib/net/rpl # but not MRHOF # CFLAGS+=-DRPL_OF_MRHOF # use short addresses so it's easier to debug CFLAGS+=-DBLIP_DERIVE_SHORTADDRS # the sleep interval needs to be set the same for all participating devices # CFLAGS += -DLOW_POWER_LISTENING -DLPL_SLEEP_INTERVAL=200 # also modifiy blip's L2 parameters to reduce media overload CFLAGS +=-DBLIP_L2_RETRIES=3 -DBLIP_L2_DELAY=103 # 5 second packet generation interval CFLAGS+=-DPACKET_INTERVAL=5120UL CFLAGS+=-DRPL_ROOT_ADDR=11 #USE_CPPOPT = -fno-rtti -fno-exceptions #PFLAGS+=-DIN6_PREFIX=\"fec0::\" PFLAGS+=-DIN6_PREFIX=\"aaaa::/64\" # enable printf CFLAGS += -DNEW_PRINTF_SEMANTICS -DPRINTFUART_ENABLED -DPRINTF_BUFFER_SIZE=1024 include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestRPL/udp/TestRPL.h000066400000000000000000000002441207233610700216210ustar00rootroot00000000000000#ifndef TEST_RPL_H #define TEST_RPL_H typedef nx_struct radio_count_msg { nx_uint16_t counter; } radio_count_msg_t; enum { AM_RADIO_COUNT_MSG = 6, }; #endif tinyos-2.1.2+dfsg/apps/tests/TestRPL/udp/TestRPLAppC.nc000066400000000000000000000056551207233610700225510ustar00rootroot00000000000000// $Id: RadioCountToLedsAppC.nc,v 1.4 2006/12/12 18:22:48 vlahan Exp $ /* tab:4 * "Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "TestRPL.h" #include "printf.h" /** * Configuration for the RadioCountToLeds application. RadioCountToLeds * maintains a 4Hz counter, broadcasting its value in an AM packet * every time it gets updated. A RadioCountToLeds node that hears a counter * displays the bottom three bits on its LEDs. This application is a useful * test to show that basic AM communication and timers work. * * @author Philip Levis * @date June 6 2005 */ configuration TestRPLAppC {} implementation { components MainC, TestRPLC as App, LedsC; components new TimerMilliC(); components new TimerMilliC() as Timer; components RandomC; components RPLRankC; components RPLRoutingEngineC; components IPDispatchC; //components RPLForwardingEngineC; components RPLDAORoutingEngineC; components IPStackC; components IPProtocolsP; App.Boot -> MainC.Boot; App.SplitControl -> IPStackC;//IPDispatchC; App.Leds -> LedsC; App.MilliTimer -> TimerMilliC; App.RPLRoute -> RPLRoutingEngineC; App.RootControl -> RPLRoutingEngineC; App.RoutingControl -> RPLRoutingEngineC; components new UdpSocketC() as RPLUDP; App.RPLUDP -> RPLUDP; App.RPLDAO -> RPLDAORoutingEngineC; App.Timer -> Timer; App.Random -> RandomC; #ifdef RPL_ROUTING components RPLRoutingC; #endif #ifdef PRINTFUART_ENABLED components PrintfC; components SerialStartC; #endif //components LcdC; //App.Lcd -> LcdC; //App.Draw -> LcdC; } tinyos-2.1.2+dfsg/apps/tests/TestRPL/udp/TestRPLC.nc000066400000000000000000000116641207233610700221050ustar00rootroot00000000000000// $Id: RadioCountToLedsC.nc,v 1.6 2008/06/24 05:32:31 regehr Exp $ /* tab:4 * "Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "Timer.h" #include "TestRPL.h" #include "lib6lowpan/ip.h" //#include "color.h" #include "blip_printf.h" /** * Implementation of the RadioCountToLeds application. RadioCountToLeds * maintains a 4Hz counter, broadcasting its value in an AM packet * every time it gets updated. A RadioCountToLeds node that hears a counter * displays the bottom three bits on its LEDs. This application is a useful * test to show that basic AM communication and timers work. * * @author Philip Levis * @date June 6 2005 */ module TestRPLC @safe() { uses { interface Leds; interface Boot; interface Timer as MilliTimer; interface Timer as Timer; interface RPLRoutingEngine as RPLRoute; interface RootControl; interface StdControl as RoutingControl; interface SplitControl; //interface IP as RPL; interface UDP as RPLUDP; //interface RPLForwardingEngine; interface RPLDAORoutingEngine as RPLDAO; interface Random; //interface Lcd; //interface Draw; } } implementation { #ifndef RPL_ROOT_ADDR #define RPL_ROOT_ADDR 1 #endif #define UDP_PORT 5678 //uint8_t payload[10]; //struct in6_addr dest; struct in6_addr MULTICAST_ADDR; bool locked; uint16_t counter = 0; event void Boot.booted() { memset(MULTICAST_ADDR.s6_addr, 0, 16); MULTICAST_ADDR.s6_addr[0] = 0xFF; MULTICAST_ADDR.s6_addr[1] = 0x2; MULTICAST_ADDR.s6_addr[15] = 0x1A; //call Lcd.initialize(); if(TOS_NODE_ID == RPL_ROOT_ADDR){ call RootControl.setRoot(); } call RoutingControl.start(); //call RoutingControl.start(); call SplitControl.start(); call RPLUDP.bind(UDP_PORT); } /* event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { } else { call Draw.fill(COLOR_RED); call Lcd.start(); } } event void Lcd.startDone() { } */ uint32_t countrx = 0; uint32_t counttx = 0; event void RPLUDP.recvfrom(struct sockaddr_in6 *from, void *payload, uint16_t len, struct ip6_metadata *meta){ nx_uint16_t temp[10]; memcpy(temp, (uint8_t*)payload, len); call Leds.led2Toggle(); printf(">>>> RX %d %d %d %lu \n", TOS_NODE_ID, temp[0], temp[9], ++countrx); printfflush(); } event void SplitControl.startDone(error_t err){ while( call RPLDAO.startDAO() != SUCCESS ); if(TOS_NODE_ID != RPL_ROOT_ADDR){ call Timer.startOneShot((call Random.rand16()%2)*2048U); } } event void Timer.fired(){ call MilliTimer.startOneShot(PACKET_INTERVAL + (call Random.rand16() % 100)); } task void sendTask(){ struct sockaddr_in6 dest; nx_uint16_t temp[10]; uint8_t i; //call Draw.fill(COLOR_BLACK); for(i=0;i<10;i++){ temp[i] = 0xABCD; } temp[0] = TOS_NODE_ID; temp[9] = counttx; memcpy(dest.sin6_addr.s6_addr, call RPLRoute.getDodagId(), sizeof(struct in6_addr)); if(dest.sin6_addr.s6_addr[15] != 0) // destination is set as root! ++counttx; //if(dest.sin6_addr.s6_addr[0] == 0xAA) call Leds.led0Toggle(); dest.sin6_port = htons(UDP_PORT); printf("Generate Packet at %d \n", TOS_NODE_ID); call RPLUDP.sendto(&dest, temp, 20); } event void MilliTimer.fired(){ //call Leds.led1Toggle(); call MilliTimer.startOneShot(PACKET_INTERVAL + (call Random.rand16() % 100)); post sendTask(); } event void SplitControl.stopDone(error_t err){} } tinyos-2.1.2+dfsg/apps/tests/TestSerial/000077500000000000000000000000001207233610700201455ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestSerial/Makefile000066400000000000000000000005671207233610700216150ustar00rootroot00000000000000COMPONENT=TestSerialAppC BUILD_EXTRA_DEPS += TestSerial.class CLEAN_EXTRA = *.class TestSerialMsg.java CFLAGS += -I$(TOSDIR)/lib/T2Hack TestSerial.class: $(wildcard *.java) TestSerialMsg.java javac -target 1.4 -source 1.4 *.java TestSerialMsg.java: mig java -target=null $(CFLAGS) -java-classname=TestSerialMsg TestSerial.h test_serial_msg -o $@ include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestSerial/README.txt000066400000000000000000000017121207233610700216440ustar00rootroot00000000000000README for TestSerial Author/Contact: tinyos-help@millennium.berkeley.edu Description: TestSerial is a simple application that may be used to test that the TinyOS java toolchain can communicate with a mote over the serial port. The java application sends packets to the serial port at 1Hz: the packet contains an incrementing counter. When the mote application receives a counter packet, it displays the bottom three bits on its LEDs. (This application is similar to RadioCountToLeds, except that it operates over the serial port.) Likewise, the mote also sends packets to the serial port at 1Hz. Upon reception of a packet, the java application prints the counter's value to standard out. Java Application Usage: java TestSerial [-comm ] If not specified, the defaults to sf@localhost:9002 or to your MOTECOM environment variable (if defined). Python Usage: tos-dump /dev/ttyUSB0 57600 Tools: Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/TestSerial/TestSerial.h000066400000000000000000000002561207233610700224000ustar00rootroot00000000000000 #ifndef TEST_SERIAL_H #define TEST_SERIAL_H typedef nx_struct test_serial_msg { nx_uint16_t counter; } test_serial_msg_t; enum { AM_TEST_SERIAL_MSG = 0x89, }; #endif tinyos-2.1.2+dfsg/apps/tests/TestSerial/TestSerial.java000066400000000000000000000067231207233610700230770ustar00rootroot00000000000000/* tab:4 * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Java-side application for testing serial port communication. * * * @author Phil Levis * @date August 12 2005 */ import java.io.IOException; import net.tinyos.message.*; import net.tinyos.packet.*; import net.tinyos.util.*; public class TestSerial implements MessageListener { private MoteIF moteIF; public TestSerial(MoteIF moteIF) { this.moteIF = moteIF; this.moteIF.registerListener(new TestSerialMsg(), this); } public void sendPackets() { int counter = 0; TestSerialMsg payload = new TestSerialMsg(); try { while (true) { System.out.println("Sending packet " + counter); payload.set_counter(counter); moteIF.send(0, payload); counter++; try {Thread.sleep(1000);} catch (InterruptedException exception) {} } } catch (IOException exception) { System.err.println("Exception thrown when sending packets. Exiting."); System.err.println(exception); } } public void messageReceived(int to, Message message) { TestSerialMsg msg = (TestSerialMsg)message; System.out.println("Received packet sequence number " + msg.get_counter()); } private static void usage() { System.err.println("usage: TestSerial [-comm ]"); } public static void main(String[] args) throws Exception { String source = null; if (args.length == 2) { if (!args[0].equals("-comm")) { usage(); System.exit(1); } source = args[1]; } else if (args.length != 0) { usage(); System.exit(1); } PhoenixSource phoenix; if (source == null) { phoenix = BuildSource.makePhoenix(PrintStreamMessenger.err); } else { phoenix = BuildSource.makePhoenix(source, PrintStreamMessenger.err); } MoteIF mif = new MoteIF(phoenix); TestSerial serial = new TestSerial(mif); serial.sendPackets(); } } tinyos-2.1.2+dfsg/apps/tests/TestSerial/TestSerialAppC.nc000066400000000000000000000061001207233610700233070ustar00rootroot00000000000000// $Id: TestSerialAppC.nc,v 1.6 2010-06-29 22:07:25 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Application to test that the TinyOS java toolchain can communicate * with motes over the serial port. The application sends packets to * the serial port at 1Hz: the packet contains an incrementing * counter. When the application receives a counter packet, it * displays the bottom three bits on its LEDs. This application is * very similar to RadioCountToLeds, except that it operates over the * serial port. There is Java application for testing the mote * application: run TestSerial to print out the received packets and * send packets to the mote. * * @author Gilman Tolle * @author Philip Levis * * @date Aug 12 2005 * **/ #include "TestSerial.h" configuration TestSerialAppC {} implementation { components TestSerialC as App, LedsC, MainC; components SerialActiveMessageC as AM; components new TimerMilliC(); App.Boot -> MainC.Boot; App.Control -> AM; App.Receive -> AM.Receive[AM_TEST_SERIAL_MSG]; App.AMSend -> AM.AMSend[AM_TEST_SERIAL_MSG]; App.Leds -> LedsC; App.MilliTimer -> TimerMilliC; App.Packet -> AM; } tinyos-2.1.2+dfsg/apps/tests/TestSerial/TestSerialC.nc000066400000000000000000000077141207233610700226620ustar00rootroot00000000000000// $Id: TestSerialC.nc,v 1.7 2010-06-29 22:07:25 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Application to test that the TinyOS java toolchain can communicate * with motes over the serial port. * * @author Gilman Tolle * @author Philip Levis * * @date Aug 12 2005 * **/ #include "Timer.h" #include "TestSerial.h" module TestSerialC { uses { interface SplitControl as Control; interface Leds; interface Boot; interface Receive; interface AMSend; interface Timer as MilliTimer; interface Packet; } } implementation { message_t packet; bool locked = FALSE; uint16_t counter = 0; event void Boot.booted() { call Control.start(); } event void MilliTimer.fired() { counter++; if (locked) { return; } else { test_serial_msg_t* rcm = (test_serial_msg_t*)call Packet.getPayload(&packet, sizeof(test_serial_msg_t)); if (rcm == NULL) {return;} if (call Packet.maxPayloadLength() < sizeof(test_serial_msg_t)) { return; } rcm->counter = counter; if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(test_serial_msg_t)) == SUCCESS) { locked = TRUE; } } } event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) { if (len != sizeof(test_serial_msg_t)) {return bufPtr;} else { test_serial_msg_t* rcm = (test_serial_msg_t*)payload; if (rcm->counter & 0x1) { call Leds.led0On(); } else { call Leds.led0Off(); } if (rcm->counter & 0x2) { call Leds.led1On(); } else { call Leds.led1Off(); } if (rcm->counter & 0x4) { call Leds.led2On(); } else { call Leds.led2Off(); } return bufPtr; } } event void AMSend.sendDone(message_t* bufPtr, error_t error) { if (&packet == bufPtr) { locked = FALSE; } } event void Control.startDone(error_t err) { if (err == SUCCESS) { call MilliTimer.startPeriodic(1000); } } event void Control.stopDone(error_t err) {} } tinyos-2.1.2+dfsg/apps/tests/TestSerialPrintf/000077500000000000000000000000001207233610700213305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestSerialPrintf/Makefile000066400000000000000000000001121207233610700227620ustar00rootroot00000000000000COMPONENT=TestAppC PFLAGS += -I$(TOSDIR)/lib/printf include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestSerialPrintf/TestAppC.nc000066400000000000000000000036631207233610700233450ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Trivial test application for the SerialPrintfC component. * * The application will loop continuously printing a message and a * incrementing serial number to the console. * * @author Peter A. Bigot */ configuration TestAppC { } implementation { components TestP; components MainC; TestP.Boot -> MainC; components SerialPrintfC; } tinyos-2.1.2+dfsg/apps/tests/TestSerialPrintf/TestP.nc000066400000000000000000000037251207233610700227200ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include module TestP @safe() { uses interface Boot; } implementation { event void Boot.booted() { int ctr = 0; while (++ctr) { volatile uint16_t idlectr = 0; printf("Hello iteration %d\n", ctr); /* "Portable" arbitrary delay, just to reduce the stream going * to the serial port. */ while (++idlectr) { ; } } } } tinyos-2.1.2+dfsg/apps/tests/TestSimComm/000077500000000000000000000000001207233610700202725ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestSimComm/Makefile000066400000000000000000000000561207233610700217330ustar00rootroot00000000000000COMPONENT=TestCommAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestSimComm/README000066400000000000000000000046341207233610700211610ustar00rootroot00000000000000TestSimComm, 5/22/07 This application tests the TOSSIM radio model by setting up a simple hidden terminal case. It checks whether packets collide correctly and whether SNR thresholds work correctly.. The relevant output channel is "TestComm". There are three test cases: test-equal.py: Tests whether two nodes that are hidden terminals cause collisions. The two nodes have equal signal strengths, so a collision should corrupt both packets. If one packet is lost due to a collision, the other should be too. Note that packets can be lost in the absence of collisions due to external interference. test-unequal.py: Tests whether two nodes that are hidden terminals cause collisions. The two nodes have signal strengths that differ by 10dB, and node 1 is stronger. This means that node 2 should hear node 1's packets if they start first, but not second. If a packet from node 1 is lost, the packet from node 3 should be as well. However, a loss from node 3 does not imply a loss from node 1, as it is stronger. test-asym.py: Tests whether asymmetric links can have high delivery rates but low acknowledgement rates. Checks that acknowledgements follow SNR curves properly. In this test, both 1 and 3 have high quality links (-60 dBm) to node 2, but the reverse links (2 to 1 and 2 to 3) are much worse (-80 dBm). You should see packet deliveries like test-equal.py but few acknowledgements. The ./run script runs all the three tests and counts the number of ACKed and non-ACKed send packets. The output will look something like this: test-equal.log ACK NOACK total 1 21197 19666 40863 3 21320 19543 40863 test-asym.log ACK NOACK total 1 4930 35923 40853 3 4983 35870 40853 test-unequal.log ACK NOACK total 1 27619 12966 40585 3 21040 19545 40585 ACK is the number of acknowledged packets from that node to node 2; NOACK is the number of unacknowledged packets. Total is the sum. The output should show three things: 1) In test-equal, both node 1 and node 3 have very similar delivery ratios, losing about half of their packets. 2) In test-asym, the number of ACKs is much less than in test-equal because the reverse links are poor. 3) In test-unequal, node 1 has more acknowledged packets than node 3, because it has a higher SNR link. Philip Levis tinyos-2.1.2+dfsg/apps/tests/TestSimComm/TestCommAppC.nc000066400000000000000000000062411207233610700231160ustar00rootroot00000000000000// $Id: TestCommAppC.nc,v 1.4 2010-06-29 22:07:25 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * This application sends a single active message broadcast if it has * address 0, and then starts a timer at 1Hz. If it has any address * other than 0, it starts a timer at 1 Hz upon receiving a broadcast * message. The idea is to have one base station with address 0 send * out a broadacst message to synchronize itself with all receivers. * All Leds from the base station and any receivers of the broadcast * should blink together. * It uses the radio HIL component * ActiveMessageC, and its packets are AM type 240. * * @author Phil Levis * @author Kevin Klues * @date Nov 7 2005 */ configuration TestCommAppC {} implementation { enum { AM_TEST = 133 }; components MainC, TestCommC as App, RandomC, ActiveMessageC, TossimActiveMessageC; components new TimerMilliC(), new AMSenderC(AM_TEST), new AMReceiverC(AM_TEST); App.Boot -> MainC.Boot; App.SplitControl -> ActiveMessageC; App.Timer -> TimerMilliC; App.AMSend -> AMSenderC; App.Receive -> AMReceiverC; App.Random -> RandomC; App.AMPacket -> AMSenderC; App.PacketAcknowledgements -> AMSenderC; App.TossimPacket -> TossimActiveMessageC; } tinyos-2.1.2+dfsg/apps/tests/TestSimComm/TestCommC.nc000066400000000000000000000072431207233610700224600ustar00rootroot00000000000000// $Id: TestCommC.nc,v 1.4 2010-06-29 22:07:25 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implementation of the TestTimer application. * * @author Phil Levis * @date April 7 2007 * **/ module TestCommC { uses { interface Boot; interface Timer as Timer; interface Receive; interface AMSend; interface Random; interface SplitControl; interface AMPacket; interface PacketAcknowledgements; interface TossimPacket; } } implementation { message_t packet; uint8_t busy; event void Boot.booted() { dbg("TestComm", "Booted @ %s.\n", sim_time_string()); call SplitControl.start(); } event void SplitControl.startDone(error_t e) { if (TOS_NODE_ID == 1 || TOS_NODE_ID == 3) { call Timer.startPeriodic(128); } } event void SplitControl.stopDone(error_t e) { } event void Timer.fired() { if (!busy) { call PacketAcknowledgements.requestAck(&packet); if (call AMSend.send(2, &packet, call AMSend.maxPayloadLength()) == SUCCESS) { dbg("TestComm", "Send succeeded @ %s\n", sim_time_string()); busy = TRUE; } else { dbg("TestComm", "Send failed at @ %s\n", sim_time_string()); } } else { dbg("TestComm", "Send when busy at @ %s\n", sim_time_string()); } } event void AMSend.sendDone(message_t* m, error_t s) { dbg("TestComm", "Send completed with %s @ %s\n", call PacketAcknowledgements.wasAcked(m)? "ACK":"NOACK", sim_time_string()); busy = FALSE; } event message_t* Receive.receive(message_t* msg, void* p, uint8_t l) { dbg("TestComm", "Received message from %hu @ %s with strength %hhi\n", call AMPacket.source(msg), sim_time_string(), call TossimPacket.strength(msg)); return msg; } } tinyos-2.1.2+dfsg/apps/tests/TestSimComm/meyer-short.txt000066400000000000000000000076331207233610700233220ustar00rootroot00000000000000-41 -41 -41 -41 -41 -41 -41 -91 -41 -41 -41 -41 -41 -48 -41 -41 -41 -83 -98 -80 -80 -79 -79 -79 -79 -98 -79 -80 -79 -80 -80 -80 -83 -83 -83 -83 -82 -82 -41 -82 -82 -82 -82 -82 -82 -41 -94 -93 -93 -87 -89 -90 -45 -92 -85 -98 -80 -80 -79 -78 -79 -79 -79 -97 -94 -83 -81 -80 -82 -81 -81 -84 -84 -86 -98 -89 -79 -79 -79 -79 -79 -79 -57 -79 -79 -79 -79 -79 -79 -79 -41 -84 -96 -97 -79 -90 -98 -79 -79 -79 -79 -79 -79 -92 -83 -83 -82 -81 -83 -80 -85 -82 -81 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -98 -98 -79 -79 -79 -79 -79 -78 -97 -91 -96 -91 -82 -82 -82 -82 -82 -82 -77 -82 -82 -82 -82 -82 -82 -98 -79 -79 -79 -79 -79 -79 -94 -98 -96 -81 -82 -82 -82 -82 -82 -91 -91 -93 -91 -91 -91 -91 -93 -91 -91 -91 -91 -91 -92 -91 -91 -87 -84 -79 -79 -79 -79 -79 -78 -94 -79 -79 -79 -79 -80 -79 -94 -98 -82 -83 -82 -82 -83 -83 -82 -41 -81 -98 -98 -98 -86 -82 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -90 -79 -79 -79 -78 -78 -79 -79 -79 -78 -79 -79 -79 -98 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -90 -82 -81 -82 -82 -81 -81 -82 -82 -82 -80 -82 -81 -81 -81 -42 -61 -96 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -98 -98 -98 -98 -41 -41 -98 -99 -84 -98 -41 -98 -98 -98 -85 -98 -96 -96 -91 -87 -98 -96 -99 -98 -90 -88 -86 -88 -96 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -84 -93 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -80 -80 -80 -79 -80 -80 -80 -80 -79 -79 -80 -80 -73 -80 -80 -80 -79 -78 -80 -80 -80 -80 -80 -79 -80 -74 -40 -40 -91 -40 -40 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -91 -91 -90 -97 -40 -40 -91 -91 -40 -40 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -96 -79 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -41 -40 -40 -40 -98 -80 -79 -79 -79 -79 -80 -80 -80 -80 -79 -80 -79 -40 -40 -40 -79 -79 -79 -79 -79 -79 -79 -79 -80 -80 -80 -79 -92 -83 -82 -83 -82 -82 -82 -83 -82 -81 -82 -82 -82 -90 -92 -82 -82 -83 -83 -83 -83 -83 -82 -82 -83 -83 -82 -42 -40 -40 -70 -82 -68 -80 -79 -80 -79 -80 -78 -80 -80 -80 -96 -80 -79 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -60 -79 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -99 -80 -80 -80 -80 -80 -79 -80 -80 -80 -79 -80 -80 -99 -84 -83 -83 -83 -84 -83 -83 -83 -84 -84 -84 -84 -84 -48 -79 -80 -80 -80 -80 -79 -80 -79 -80 -80 -79 -80 -91 -91 -91 -92 -91 -92 -94 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -58 -99 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -98 -80 -92 -92 -87 -98 -98 -86 -98 -98 -95 -98 -97 -99 -97 -41 -72 -87 -84 -84 -83 -82 -84 -78 -78 -79 -79 -79 -83 -85 -94 -83 -86 -87 -96 -84 -86 -88 -98 -96 -95 -85 -90 -98 -98 -98 -80 -80 -95 -98 -98 -96 -98 -98 -80 -99 -96 -80 -98 -96 -94 -98 -96 -99 -80 -80 -80 -80 -80 -45 -80 -91 -80 -80 -80 -82 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -40 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -40 -97 -84 -84 -84 -84 -84 -84 -84 -85 -84 -81 -84 -85 -97 -85 -85 -86 -85 -85 -82 -85 -85 -85 -85 -85 -85 -87 -86 -85 -86 -86 -85 -84 -86 -84 -85 -86 -86 -70 -86 -86 -86 -86 -86 -86 -86 -86 -86 -86 -86 -86 -41 -94 -41 -40 -97 -80 -40 -91 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -40 -93 -93 -40 -40 -93 -93 -98 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -40 -40 -93 -85 -85 -82 -82 -83 -86 -85 -86 -84 -85 -82 -83 -84 -85 -40 -40 -78 -40 -98 -98 -98 -99 -41 -80 -80 -78 -81 -79 -81 -81 -79 -81 -81 -81 -81 -96 -98 -80 -93 -80 -96 -98 -98 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -98 -80 -80 -81 -80 -80 -80 -80 -80 -80 -81 -80 -80 -99 -90 -84 -82 -86 -85 -85 -85 -85 -86 -86 -85 -86 -86 -98 -96 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -81 -80 -48 -90 -89 -79 -93 -91 -95 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -95 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -96 -98 -98 -99 -71 -98 -98 -99 -98 -98 -98 -98 -98 tinyos-2.1.2+dfsg/apps/tests/TestSimComm/run000077500000000000000000000007541207233610700210320ustar00rootroot00000000000000#!/bin/bash make micaz sim for t in test-equal.py test-asym.py test-unequal.py do echo Running $t... python $t > `basename $t .py`.log done make clean for l in test-equal.log test-asym.log test-unequal.log do echo $l echo -e '\t ACK \t\t NOACK \t total' for i in 1 3 do N1=`grep 'Send completed' $l | grep ' ACK' | grep "($i)" | wc -l` N2=`grep 'Send completed' $l | grep 'NOACK' | grep "($i)" | wc -l` echo -e "\t $i $N1 \t $N2 \t" `expr $N1 + $N2` done done tinyos-2.1.2+dfsg/apps/tests/TestSimComm/test-asym.py000066400000000000000000000017331207233610700225760ustar00rootroot00000000000000from TOSSIM import * import sys import time t = Tossim([]) r = t.radio(); t.addChannel("TestComm", sys.stdout) t.addChannel("SNRLoss", sys.stdout) #t.addChannel("Acks", sys.stdout) #t.addChannel("Gain", sys.stdout) #t.addChannel("CpmModelC", sys.stdout) #t.addChannel("AM", sys.stdout) start = time.time(); m1 = t.getNode(1) m2 = t.getNode(2) m3 = t.getNode(3) # Set up a hidden terminal problem, where 1 and 3 # are closely synchronized, but cannot hear each other. m1.bootAtTime(345321); m2.bootAtTime(82123411); m3.bootAtTime(345325); r.add(1, 2, -60.0); r.add(2, 1, -80.0); r.add(3, 2, -60.0); r.add(2, 3, -80.0); noise = open("meyer-short.txt", "r") lines = noise.readlines() for line in lines: str = line.strip() if (str != ""): val = int(str) m1.addNoiseTraceReading(val) m2.addNoiseTraceReading(val) m3.addNoiseTraceReading(val) m1.createNoiseModel() m2.createNoiseModel() m3.createNoiseModel() for i in range(0, 200000): t.runNextEvent(); tinyos-2.1.2+dfsg/apps/tests/TestSimComm/test-equal.py000066400000000000000000000017331207233610700227340ustar00rootroot00000000000000from TOSSIM import * import sys import time t = Tossim([]) r = t.radio(); t.addChannel("TestComm", sys.stdout) t.addChannel("SNRLoss", sys.stdout) #t.addChannel("Acks", sys.stdout) #t.addChannel("Gain", sys.stdout) #t.addChannel("CpmModelC", sys.stdout) #t.addChannel("AM", sys.stdout) start = time.time(); m1 = t.getNode(1) m2 = t.getNode(2) m3 = t.getNode(3) # Set up a hidden terminal problem, where 1 and 3 # are closely synchronized, but cannot hear each other. m1.bootAtTime(345321); m2.bootAtTime(82123411); m3.bootAtTime(345325); r.add(1, 2, -60.0); r.add(2, 1, -60.0); r.add(2, 3, -60.0); r.add(3, 2, -60.0); noise = open("meyer-short.txt", "r") lines = noise.readlines() for line in lines: str = line.strip() if (str != ""): val = int(str) m1.addNoiseTraceReading(val) m2.addNoiseTraceReading(val) m3.addNoiseTraceReading(val) m1.createNoiseModel() m2.createNoiseModel() m3.createNoiseModel() for i in range(0, 200000): t.runNextEvent(); tinyos-2.1.2+dfsg/apps/tests/TestSimComm/test-unequal.py000066400000000000000000000017321207233610700232760ustar00rootroot00000000000000from TOSSIM import * import sys import time t = Tossim([]) r = t.radio(); t.addChannel("TestComm", sys.stdout) t.addChannel("SNRLoss", sys.stdout) #t.addChannel("Acks", sys.stdout) #t.addChannel("Gain", sys.stdout) #t.addChannel("CpmModelC", sys.stdout) #t.addChannel("AM", sys.stdout) start = time.time(); m1 = t.getNode(1) m2 = t.getNode(2) m3 = t.getNode(3) # Set up a hidden terminal problem, where 1 and 3 # are closely synchronized, but cannot hear each other. m1.bootAtTime(345321); m2.bootAtTime(82123411); m3.bootAtTime(345325); r.add(1, 2, -50.0); r.add(2, 1, -50.0); r.add(2, 3, -60.0); r.add(3, 2, -60.0); noise = open("meyer-short.txt", "r") lines = noise.readlines() for line in lines: str = line.strip() if (str != ""): val = int(str) m1.addNoiseTraceReading(val) m2.addNoiseTraceReading(val) m3.addNoiseTraceReading(val) m1.createNoiseModel() m2.createNoiseModel() m3.createNoiseModel() for i in range(0, 200000): t.runNextEvent(); tinyos-2.1.2+dfsg/apps/tests/TestSrp/000077500000000000000000000000001207233610700174725ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/TestSrp/Makefile000066400000000000000000000001211207233610700211240ustar00rootroot00000000000000COMPONENT=TestSrpAppC CFLAGS += -I$(TOSDIR)/lib/net/srp include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/TestSrp/TestSrpAppC.nc000066400000000000000000000033301207233610700221630ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Doug Carlson */ #include configuration TestSrpAppC{ } implementation { components TestSrpC, MainC; TestSrpC.Boot -> MainC; } tinyos-2.1.2+dfsg/apps/tests/TestSrp/TestSrpC.nc000066400000000000000000000043271207233610700215310ustar00rootroot00000000000000/** * Copyright (c) 2010 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Doug Carlson */ configuration TestSrpC { uses { interface Boot; } } implementation { components TestSrpP; components new TimerMilliC() as Timer; components RandomC; components ActiveMessageC; components SourceRoutingC; components new SourceRouteSenderC(1); components new SourceRouteReceiverC(1); TestSrpP.Boot = Boot; TestSrpP.RadioSplitControl -> ActiveMessageC.SplitControl; TestSrpP.Timer -> Timer; TestSrpP.Random -> RandomC; TestSrpP.SourceRouteSend -> SourceRouteSenderC.SourceRouteSend; TestSrpP.Receive -> SourceRouteReceiverC; TestSrpP.SourceRoutePacket -> SourceRouteSenderC.SourceRoutePacket; } tinyos-2.1.2+dfsg/apps/tests/TestSrp/TestSrpP.nc000066400000000000000000000075111207233610700215440ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Doug Carlson */ module TestSrpP { uses { interface Boot; interface Timer; interface SourceRouteSend; interface SourceRoutePacket; interface Receive; interface Random; interface SplitControl as RadioSplitControl; } } implementation { message_t myMsg; uint8_t myCount = 0; #define SEND_INTERVAL 50 #define SEND_COUNT 200 typedef struct { uint8_t len; am_addr_t route[SRP_MAX_PATHLEN]; } test_route_t; test_route_t routes[6] = { {0, {}}, {3, {1,2,3}}, {2, {2,3}}, {0, {}}, {3, {4,2,3}}, {3, {5,2,3}}, }; typedef nx_struct { nx_uint8_t count; } test_payload_t; event void Boot.booted() { dbg("TestSrpP", "booted\n"); call RadioSplitControl.start(); } event void Timer.fired() { test_payload_t* payload; error_t err; myCount++; payload = ((test_payload_t*) call SourceRouteSend.getPayload(&myMsg, sizeof(test_payload_t))); payload -> count = myCount; //NOTE we don't want space allocated for the route outside of the header, so this is kind of awkward. //NOTE it seems bad that the sender needs to specify themselves, and also that the user needs to remember that a 1-hop path has 2 nodes in it. err = call SourceRouteSend.send(routes[TOS_NODE_ID].route, routes[TOS_NODE_ID].len , &myMsg, sizeof(test_payload_t)); dbg("TestSrpP", "Sending %d : %d\n",myCount, err); } event void SourceRouteSend.sendDone(message_t* msg, error_t error) { //dbg("TestSrpP", "SendDone: %d\n", error); if (myCount < SEND_COUNT) { call Timer.startOneShot(call Random.rand16() % SEND_INTERVAL); } } event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) { test_payload_t* tPayload; //dbg("TestSrpP", "Receive msg %p payload %p\n", msg, payload); tPayload = (test_payload_t*) payload; dbg("TestSrpP","Receive p->count %d from %d \n", tPayload->count, (call SourceRoutePacket.getRoute(msg))[0]); return msg; } event void RadioSplitControl.startDone(error_t error) { dbg("TestSrpP", "Radio startDone %d\n", error); if (routes[TOS_NODE_ID].len > 0 ) { call Timer.startOneShot(call Random.rand16() % SEND_INTERVAL); } } event void RadioSplitControl.stopDone(error_t error) { } } tinyos-2.1.2+dfsg/apps/tests/TestSrp/sim.py000066400000000000000000000014371207233610700206410ustar00rootroot00000000000000import TOSSIM import sys t = TOSSIM.Tossim([]) m = t.mac() r = t.radio() t.init() t.addChannel("TestSrpP", sys.stdout) #t.addChannel("SourceRouteEngineP", sys.stdout) #t.addChannel("SRPDebug", sys.stdout) #t.addChannel("SRPInfo", sys.stdout) t.addChannel("SRPError", sys.stdout) f = open("topo.txt", "r") lines = f.readlines() edges = {} for [src, dest, gain] in [line.split()[1:] for line in lines if line.startswith("gain")]: src = int(src) dest = int(dest) r.add(src, dest, float(gain)) edges[src] = edges.get(src, [])+[dest] for nodeId in edges: n = t.getNode(nodeId) for i in range(100): n.addNoiseTraceReading(-105) n.createNoiseModel() n.bootAtTime(t.ticksPerSecond()/4 * nodeId ) while t.time() / t.ticksPerSecond() < 300: t.runNextEvent() tinyos-2.1.2+dfsg/apps/tests/TestSrp/topo.txt000066400000000000000000000003001207233610700212050ustar00rootroot00000000000000# 3 # | # 2 # / | \ # 1 4 5 gain 1 2 0 gain 2 1 0 gain 3 2 0 gain 2 3 0 gain 4 2 0 gain 2 4 0 gain 5 2 0 gain 2 5 0 tinyos-2.1.2+dfsg/apps/tests/arbiters/000077500000000000000000000000001207233610700177015ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/arbiters/TestFcfsArbiter/000077500000000000000000000000001207233610700227335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/arbiters/TestFcfsArbiter/Makefile000066400000000000000000000001031207233610700243650ustar00rootroot00000000000000COMPONENT=TestFcfsArbiterAppC OPTFLAGS = -O0 include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/arbiters/TestFcfsArbiter/README.txt000066400000000000000000000023671207233610700244410ustar00rootroot00000000000000README for TestFcfsArbiter Author/Contact: tinyos-help@millennium.berkeley.edu @author Kevin Klues Description: Please refer to TEP 108 for more information about the components this application is used to test. This application is used to test the functionality of the FcfsArbiter component developed using the Resource interface. Three Resource users are created and all three request control of the resource before any one of them is granted it. Once the first user is granted control of the resource, a timer is set to allow this user to have control of it for a specific amount of time. Once this timer expires, the resource is released and then immediately requested again. Upon releasing the resource control will be granted to the next user that has requested it in FCFS order. Initial requests are made by the three resource users in the following order. -- Resource 0 -- Resource 2 -- Resource 1 It is expected then that using a first-come-first-serve policy, control of the resource will be granted in the order of 0,2,1 and the Leds corresponding to each resource will flash whenever this occurs. -- Led 0 -> Resource 0 -- Led 1 -> Resource 1 -- Led 2 -> Resource 2 Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/arbiters/TestFcfsArbiter/TestFcfsArbiterAppC.nc000066400000000000000000000071321207233610700270560ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Please refer to TEP 108 for more information about the components * this application is used to test.

* * This application is used to test the functionality of the * FcfsArbiter component developed using the Resource * interface. Three Resource users are created and all three request * control of the resource before any one of them is granted it. * Once the first user is granted control of the resource, a timer * is set to allow this user to have control of it for a specific * amount of time. Once this timer expires, the resource is released * and then immediately requested again. Upon releasing the resource * control will be granted to the next user that has * requested it in FCFS order. Initial requests are made * by the three resource users in the following order
*
  • Resource 0 *
  • Resource 2 *
  • Resource 1 *
    * It is expected then that using a first-come-first-serve policy, control of the * resource will be granted in the order of 0,2,1 and the Leds * corresponding to each resource will flash whenever this occurs.
    *
  • Led 0 -> Resource 0 *
  • Led 1 -> Resource 1 *
  • Led 2 -> Resource 2 *
    * * @author Kevin Klues * @version $Revision: 1.2 $ * @date $Date: 2009-12-22 08:34:09 $ */ #define TEST_ARBITER_RESOURCE "Test.Arbiter.Resource" configuration TestFcfsArbiterAppC{ } implementation { components MainC, TestFcfsArbiterC as App,LedsC, new TimerMilliC() as Timer0, new TimerMilliC() as Timer1, new TimerMilliC() as Timer2, new FcfsArbiterC(TEST_ARBITER_RESOURCE) as Arbiter; enum { RESOURCE0_ID = unique(TEST_ARBITER_RESOURCE), RESOURCE1_ID = unique(TEST_ARBITER_RESOURCE), RESOURCE2_ID = unique(TEST_ARBITER_RESOURCE), }; App -> MainC.Boot; App.Resource0 -> Arbiter.Resource[RESOURCE0_ID]; App.Resource1 -> Arbiter.Resource[RESOURCE1_ID]; App.Resource2 -> Arbiter.Resource[RESOURCE2_ID]; App.Timer0 -> Timer0; App.Timer1 -> Timer1; App.Timer2 -> Timer2; App.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/arbiters/TestFcfsArbiter/TestFcfsArbiterC.nc000066400000000000000000000101171207233610700264120ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * Please refer to TEP 108 for more information about the components * this application is used to test * * This application is used to test the functionality of the * FcfsArbiter component developed using the Resource * interface. Three Resource users are created and all three request * control of the resource before any one of them is granted it. * Once the first user is granted control of the resource, a timer * is set to allow this user to have control of it for a specific * amount of time. Once this timer expires, the resource is released * and then immediately requested again. Upon releasing the resource * control will be granted to the next user that has * requested it in FCFS order. Initial requests are made * by the three resource users in the following order
    *
  • Resource 0 *
  • Resource 2 *
  • Resource 1 *
    * It is expected then that using a first-come-first-serve policy, control of the * resource will be granted in the order of 0,2,1 and the Leds * corresponding to each resource will flash whenever this occurs.
    *
  • Led 0 -> Resource 0 *
  • Led 1 -> Resource 1 *
  • Led 2 -> Resource 2 *
    * * @author Kevin Klues * @version $Revision: 1.2 $ * @date $Date: 2009-12-22 08:34:09 $ */ module TestFcfsArbiterC { uses { interface Boot; interface Leds; interface Resource as Resource0; interface Resource as Resource1; interface Resource as Resource2; interface Timer as Timer0; interface Timer as Timer1; interface Timer as Timer2; } } implementation { #define HOLD_PERIOD 250 //All resources try to gain access event void Boot.booted() { call Resource0.request(); call Resource2.request(); call Resource1.request(); } //If granted the resource, turn on an LED event void Resource0.granted() { call Timer0.startOneShot(HOLD_PERIOD); call Leds.led0Toggle(); } event void Resource1.granted() { call Timer1.startOneShot(HOLD_PERIOD); call Leds.led1Toggle(); } event void Resource2.granted() { call Timer2.startOneShot(HOLD_PERIOD); call Leds.led2Toggle(); } //After the hold period release the resource event void Timer0.fired() { call Resource0.release(); call Resource0.request(); } event void Timer1.fired() { call Resource1.release(); call Resource1.request(); } event void Timer2.fired() { call Resource2.release(); call Resource2.request(); } } tinyos-2.1.2+dfsg/apps/tests/arbiters/TestRoundRobinArbiter/000077500000000000000000000000001207233610700241335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/arbiters/TestRoundRobinArbiter/Makefile000066400000000000000000000001111207233610700255640ustar00rootroot00000000000000COMPONENT=TestRoundRobinArbiterAppC OPTFLAGS = -O0 include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/arbiters/TestRoundRobinArbiter/README.txt000066400000000000000000000023771207233610700256420ustar00rootroot00000000000000README for TestRoundRobinArbiter Author/Contact: tinyos-help@millennium.berkeley.edu @author Kevin Klues Description: Please refer to TEP 108 for more information about the components this application is used to test. This application is used to test the functionality of the RoundRobinArbiter component developed using the Resource interface. Three Resource users are created and all three request control of the resource before any one of them is granted it. Once the first user is granted control of the resource, a timer is set to allow this user to have control of it for a specific amount of time. Once this timer expires, the resource is released and then immediately requested again. Upon releasing the resource control will be granted to the next user that has requested it in round robin order. Initial requests are made by the three resource users in the following order. -- Resource 0 -- Resource 2 -- Resource 1 It is expected then that using a round robin policy, control of the resource will be granted in the order of 0,1,2 and the Leds corresponding to each resource will flash whenever this occurs. -- Led 0 -> Resource 0 -- Led 1 -> Resource 1 -- Led 2 -> Resource 2 Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/arbiters/TestRoundRobinArbiter/TestRoundRobinArbiterAppC.nc000066400000000000000000000071631207233610700314620ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Please refer to TEP 108 for more information about the components * this application is used to test.

    * * This application is used to test the functionality of the * RoundRobinArbiter component developed using the Resource * interface. Three Resource users are created and all three request * control of the resource before any one of them is granted it. * Once the first user is granted control of the resource, a timer * is set to allow this user to have control of it for a specific * amount of time. Once this timer expires, the resource is released * and then immediately requested again. Upon releasing the resource * control will be granted to the next user that has * requested it in Round Robin order. Initial requests are made * by the three resource users in the following order
    *
  • Resource 0 *
  • Resource 2 *
  • Resource 1 *
    * It is expected then that using a round robin policy, control of the * resource will be granted in the order of 0,1,2, and the Leds * corresponding to each resource will flash whenever this occurs.
    *
  • Led 0 -> Resource 0 *
  • Led 1 -> Resource 1 *
  • Led 2 -> Resource 2 *
    * * @author Kevin Klues * @version $Revision: 1.2 $ * @date $Date: 2009-12-22 08:34:10 $ */ #define TEST_ARBITER_RESOURCE "Test.Arbiter.Resource" configuration TestRoundRobinArbiterAppC{ } implementation { components MainC, TestRoundRobinArbiterC as App,LedsC, new TimerMilliC() as Timer0, new TimerMilliC() as Timer1, new TimerMilliC() as Timer2, new RoundRobinArbiterC(TEST_ARBITER_RESOURCE) as Arbiter; enum { RESOURCE0_ID = unique(TEST_ARBITER_RESOURCE), RESOURCE1_ID = unique(TEST_ARBITER_RESOURCE), RESOURCE2_ID = unique(TEST_ARBITER_RESOURCE), }; App -> MainC.Boot; App.Resource0 -> Arbiter.Resource[RESOURCE0_ID]; App.Resource1 -> Arbiter.Resource[RESOURCE1_ID]; App.Resource2 -> Arbiter.Resource[RESOURCE2_ID]; App.Timer0 -> Timer0; App.Timer1 -> Timer1; App.Timer2 -> Timer2; App.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/arbiters/TestRoundRobinArbiter/TestRoundRobinArbiterC.nc000066400000000000000000000101301207233610700310050ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * Please refer to TEP 108 for more information about the components * this application is used to test * * This application is used to test the functionality of the * RoundRobinArbiter component developed using the Resource * interface. Three Resource users are created and all three request * control of the resource before any one of them is granted it. * Once the first user is granted control of the resource, a timer * is set to allow this user to have control of it for a specific * amount of time. Once this timer expires, the resource is released * and then immediately requested again. Upon releasing the resource * control will be granted to the next user that has * requested it in Round Robin order. Initial requests are made * by the three resource users in the following order
    *
  • Resource 0 *
  • Resource 2 *
  • Resource 1 *
    * It is expected then that using a round robin policy, control of the * resource will be granted in the order of 0,1,2, and the Leds * corresponding to each resource will flash whenever this occurs.
    *
  • Led 0 -> Resource 0 *
  • Led 1 -> Resource 1 *
  • Led 2 -> Resource 2 *
    * * @author Kevin Klues * @version $Revision: 1.2 $ * @date $Date: 2009-12-22 08:34:10 $ */ module TestRoundRobinArbiterC { uses { interface Boot; interface Leds; interface Resource as Resource0; interface Resource as Resource1; interface Resource as Resource2; interface Timer as Timer0; interface Timer as Timer1; interface Timer as Timer2; } } implementation { #define HOLD_PERIOD 250 //All resources try to gain access event void Boot.booted() { call Resource0.request(); call Resource2.request(); call Resource1.request(); } //If granted the resource, turn on an LED event void Resource0.granted() { call Timer0.startOneShot(HOLD_PERIOD); call Leds.led0Toggle(); } event void Resource1.granted() { call Timer1.startOneShot(HOLD_PERIOD); call Leds.led1Toggle(); } event void Resource2.granted() { call Timer2.startOneShot(HOLD_PERIOD); call Leds.led2Toggle(); } //After the hold period release the resource event void Timer0.fired() { call Resource0.release(); call Resource0.request(); } event void Timer1.fired() { call Resource1.release(); call Resource1.request(); } event void Timer2.fired() { call Resource2.release(); call Resource2.request(); } } tinyos-2.1.2+dfsg/apps/tests/blip/000077500000000000000000000000001207233610700170145ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/blip/TestLinkLocal/000077500000000000000000000000001207233610700215245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/blip/TestLinkLocal/Makefile000066400000000000000000000002051207233610700231610ustar00rootroot00000000000000COMPONENT=TestLinkLocalAppC include $(MAKERULES) CFLAGS += -DIN6_NO_GLOBAL -DLIB6LOWPAN_HC_VERSION=-1 CFLAGS += -DPRINTFUART_ENABLED tinyos-2.1.2+dfsg/apps/tests/blip/TestLinkLocal/README.txt000066400000000000000000000026311207233610700232240ustar00rootroot00000000000000README for TestLinkLocal Author/Contact: Stephen Dawson-Haggerty Description: TestLinkLocal tests the basic Link-Local communication functionality of blip. It verifies that the radio is working, and address resolution is correct, and that 64-bit addressing mode works correctly. Build with: $ make epic blip Install on at least two motes -- the node ID's don't matter since they will use only 64-bit address mode. 1. Once per second, each mote transmits a packet (an echo request) to the link-local multicast all-nodes group (ff02::1). Led0 is toggled each time this happens. The source address is the node's link-local unicast address derived from an EUI-64. 2. All nodes receiving an echo request toggle Led1. They also reply to the echo request with a unicast packet to the originator. 3. Nodes receiving a unicast reply to one of their echo requests toggle Led2. Therefore, if everything is working, you should see Led0 and Led2 blinking together, and Led1 blinking in sequence with the other mote's transmission. This application can help troubleshoot problems with the header compression layer; to disable header compression, edit the Makefile to uncommment "-DLIB6LOWPAN_HC_VERSION=-1". Additional debugging output is availiable via printf; on Linux, you can examine it with $ stty -F /dev/ttyUSB0 57600 && tail -f /dev/ttyUSB0 Tools: Known bugs/limitations: tinyos-2.1.2+dfsg/apps/tests/blip/TestLinkLocal/TestLinkLocalAppC.nc000066400000000000000000000006721207233610700253270ustar00rootroot00000000000000/** Test the link-local communication in the blip stack */ configuration TestLinkLocalAppC { } implementation { components MainC, LedsC; components TestLinkLocalC; components IPStackC; components new TimerMilliC(); components new UdpSocketC(); TestLinkLocalC.Boot -> MainC; TestLinkLocalC.SplitControl -> IPStackC; TestLinkLocalC.Sock -> UdpSocketC; TestLinkLocalC.Timer -> TimerMilliC; TestLinkLocalC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/blip/TestLinkLocal/TestLinkLocalC.nc000066400000000000000000000030271207233610700246630ustar00rootroot00000000000000 #include #include module TestLinkLocalC { uses { interface Boot; interface SplitControl; interface UDP as Sock; interface Timer; interface Leds; } } implementation { nx_struct echo_state { nx_int8_t cmd; nx_uint32_t seqno; } m_data; enum { SVC_PORT = 10210, CMD_ECHO = 1, CMD_REPLY = 2, }; event void Boot.booted() { printfUART_init(); call SplitControl.start(); m_data.seqno = 0; } event void SplitControl.startDone(error_t e) { call Timer.startPeriodic(2048); call Sock.bind(SVC_PORT); } event void SplitControl.stopDone(error_t e) {} event void Timer.fired() { struct sockaddr_in6 dest; inet_pton6("ff02::1", &dest.sin6_addr); dest.sin6_port = htons(SVC_PORT); m_data.cmd = CMD_ECHO; m_data.seqno ++; call Sock.sendto(&dest, &m_data, sizeof(m_data)); call Leds.led0Toggle(); } event void Sock.recvfrom(struct sockaddr_in6 *src, void *payload, uint16_t len, struct ip6_metadata *meta) { nx_struct echo_state *cmd = payload; printfUART("TestLinkLocalC: recv from: "); printfUART_in6addr(&src->sin6_addr); printfUART("\n"); if (cmd->cmd == CMD_ECHO) { cmd->cmd = CMD_REPLY; call Sock.sendto(src, payload, len); call Leds.led1Toggle(); } else { printfUART("TestLinkLocalC: reply seqno: %li\n", cmd->seqno); call Leds.led2Toggle(); } } } tinyos-2.1.2+dfsg/apps/tests/cc2420/000077500000000000000000000000001207233610700167635ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/cc2420/LplBroadcastCountToLeds/000077500000000000000000000000001207233610700234615ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/cc2420/LplBroadcastCountToLeds/Makefile000066400000000000000000000011571207233610700251250ustar00rootroot00000000000000COMPONENT=RadioCountToLedsAppC CFLAGS += -DACK_LOW_POWER_LISTENING #CFLAGS += -DNOACK_LOW_POWER_LISTENING BUILD_EXTRA_DEPS = RadioCountMsg.py RadioCountMsg.class CLEAN_EXTRA = *.class *.pyc RadioCountMsg.py RadioCountMsg.java RadioCountMsg.py: RadioCountToLeds.h mig python -target=$(PLATFORM) $(CFLAGS) -python-classname=RadioCountMsg RadioCountToLeds.h radio_count_msg -o $@ RadioCountMsg.class: RadioCountMsg.java javac RadioCountMsg.java RadioCountMsg.java: RadioCountToLeds.h mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=RadioCountMsg RadioCountToLeds.h radio_count_msg -o $@ include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/cc2420/LplBroadcastCountToLeds/README.txt000066400000000000000000000026651207233610700251700ustar00rootroot00000000000000README for LplBroadcastCountToLeds Author/Contact: tinyos-help@millennium.berkeley.edu Description: This is a low power listening version of RadioCountToLeds, using the broadcast address to delivery packets. That means the delivery will remain on for the full duration of the receiver's LPL check to ensure all listeners get the message. Each node is performing 1 second receive checks, but there is a 1.5 second delay between each transmission. Verification: * Install the application on two motes * Both motes should count up their LED's just like RadioCountToLeds - This indicates they are communicating with each other. * LED's will not toggle in rhythm. - Being a broadcast LPL transmission, you'll sometimes see the LED's count up one at a time, or multiple counts at a time. This is normal. If you see LED's waggling on both motes, the test passed. LplBroadcastCountToLeds maintains a 4Hz counter, broadcasting its value in an AM packet every time it gets updated. A RadioCountToLeds node that hears a counter displays the bottom three bits on its LEDs. This application is a useful test to show that basic AM communication and timers work. Tools: RadioCountMsg.java is a Java class representing the message that this application sends. RadioCountMsg.py is a Python class representing the message that this application sends. Known bugs/limitations: None. $Id: README.txt,v 1.5 2008-07-26 02:32:44 klueska Exp $ tinyos-2.1.2+dfsg/apps/tests/cc2420/LplBroadcastCountToLeds/RadioCountToLeds.h000066400000000000000000000002741207233610700270170ustar00rootroot00000000000000#ifndef RADIO_COUNT_TO_LEDS_H #define RADIO_COUNT_TO_LEDS_H typedef nx_struct radio_count_msg { nx_uint16_t counter; } radio_count_msg_t; enum { AM_RADIO_COUNT_MSG = 134, }; #endif tinyos-2.1.2+dfsg/apps/tests/cc2420/LplBroadcastCountToLeds/RadioCountToLedsAppC.nc000066400000000000000000000066351207233610700277430ustar00rootroot00000000000000// $Id: RadioCountToLedsAppC.nc,v 1.7 2010-06-29 22:07:25 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "RadioCountToLeds.h" /** * Configuration for the RadioCountToLeds application. RadioCountToLeds * maintains a 4Hz counter, broadcasting its value in an AM packet * every time it gets updated. A RadioCountToLeds node that hears a counter * displays the bottom three bits on its LEDs. This application is a useful * test to show that basic AM communication and timers work. *

    * This version uses low-power listening. * * @author Philip Levis * @date June 24 2008 */ configuration RadioCountToLedsAppC {} implementation { components MainC, RadioCountToLedsC as App, LedsC; components new AMSenderC(AM_RADIO_COUNT_MSG); components new AMReceiverC(AM_RADIO_COUNT_MSG); components new TimerMilliC(); components ActiveMessageC; App.Boot -> MainC.Boot; App.LowPowerListening -> LplC; App.Receive -> AMReceiverC; App.AMSend -> AMSenderC; App.AMControl -> ActiveMessageC; App.Leds -> LedsC; App.MilliTimer -> TimerMilliC; App.Packet -> AMSenderC; #if defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) components CC1000ActiveMessageC as LplC; #elif defined(PLATFORM_MICAZ) || defined(PLATFORM_TELOSB) || defined(PLATFORM_SHIMMER) || defined(PLATFORM_SHIMMER2) || defined(PLATFORM_INTELMOTE2) || defined(PLATFORM_EPIC) || defined(PLATFORM_Z1) components CC2420ActiveMessageC as LplC; #else #error "LPL testing not supported on this platform" #endif } tinyos-2.1.2+dfsg/apps/tests/cc2420/LplBroadcastCountToLeds/RadioCountToLedsC.nc000066400000000000000000000111151207233610700272670ustar00rootroot00000000000000// $Id: RadioCountToLedsC.nc,v 1.5 2010-06-29 22:07:25 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "Timer.h" #include "RadioCountToLeds.h" /** * Implementation of the RadioCountToLeds application. RadioCountToLeds * maintains a 4Hz counter, broadcasting its value in an AM packet * every time it gets updated. A RadioCountToLeds node that hears a counter * displays the bottom three bits on its LEDs. This application is a useful * test to show that basic AM communication and timers work. *

    * This version uses low-power listening. * * @author Philip Levis * @date June 24 2008 */ module RadioCountToLedsC { uses { interface Leds; interface Boot; interface Receive; interface AMSend; interface Timer as MilliTimer; interface SplitControl as AMControl; interface Packet; interface LowPowerListening; } } implementation { message_t packet; bool locked; uint16_t counter = 0; event void Boot.booted() { call AMControl.start(); } event void AMControl.startDone(error_t err) { if (err == SUCCESS) { // Note we can setup LPL before or after the radio turns on call LowPowerListening.setLocalWakeupInterval(1000); call MilliTimer.startOneShot(1500); } else { call AMControl.start(); } } event void AMControl.stopDone(error_t err) { // do nothing } event void MilliTimer.fired() { counter++; dbg("RadioCountToLedsC", "RadioCountToLedsC: timer fired, counter is %hu.\n", counter); if (locked) { return; } else { radio_count_msg_t* rcm = (radio_count_msg_t*)call Packet.getPayload(&packet, sizeof(radio_count_msg_t)); if (call Packet.maxPayloadLength() < sizeof(radio_count_msg_t)) { return; } rcm->counter = counter; call LowPowerListening.setRemoteWakeupInterval(&packet, 1000); if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(radio_count_msg_t)) == SUCCESS) { dbg("RadioCountToLedsC", "RadioCountToLedsC: packet sent.\n", counter); locked = TRUE; } } } event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) { dbg("RadioCountToLedsC", "Received packet of length %hhu.\n", len); if (len != sizeof(radio_count_msg_t)) { return bufPtr; } else { call Leds.set(((radio_count_msg_t*) payload)->counter); return bufPtr; } } event void AMSend.sendDone(message_t* bufPtr, error_t error) { call MilliTimer.startOneShot(1500); if (&packet == bufPtr) { locked = FALSE; } } } tinyos-2.1.2+dfsg/apps/tests/cc2420/LplBroadcastPeriodicDelivery/000077500000000000000000000000001207233610700245205ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/cc2420/LplBroadcastPeriodicDelivery/Makefile000066400000000000000000000002001207233610700261500ustar00rootroot00000000000000COMPONENT=TestPeriodicAppC CFLAGS += -DACK_LOW_POWER_LISTENING #CFLAGS += -DNOACK_LOW_POWER_LISTENING include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/cc2420/LplBroadcastPeriodicDelivery/README.txt000066400000000000000000000026001207233610700262140ustar00rootroot00000000000000README for LplBroadcastPeriodicDelivery Author/Contact: tinyos-help@millennium.berkeley.edu Description: Install the application to two nodes with the following ID's: Node 0 (Receiver node): id = 0 Node 1 (Transmitter node): id = 1 Do this at compile time by adding the flag NODEID=, thus: make NODEID= ... This app sends a message from Transmitter node to AM_BROADCAST_ADDR and waits 1000 ms between each delivery so the Rx mote's radio shuts back off and has to redetect to receive the next message. EXPECTED OUTPUT Transmitter Node: * Toggles its led0 every second. - led0 ON indicates transmission, which lasts for a full second. Receiver Node: * led1 remains on (except at the beginning) * If led0 lights up after the beginning of the test, without resetting the transmitter node, there is a problem. This means a duplicate message was received * led2 toggles once each for each transmission received. Summary: Receiver node's led2 should be toggling once a second and led0 should never light up (except at the beginning). Tools: RadioCountMsg.java is a Java class representing the message that this application sends. RadioCountMsg.py is a Python class representing the message that this application sends. Known bugs/limitations: None. $Id: README.txt,v 1.7 2010-01-06 18:57:20 ayer1 Exp $ tinyos-2.1.2+dfsg/apps/tests/cc2420/LplBroadcastPeriodicDelivery/TestPeriodic.h000066400000000000000000000002531207233610700272670ustar00rootroot00000000000000 #ifndef TESTPERIODIC_H #define TESTPERIODIC_H typedef nx_struct TestPeriodicMsg { nx_uint8_t count; } TestPeriodicMsg; enum { AM_TESTPERIODICMSG = 133, }; #endif tinyos-2.1.2+dfsg/apps/tests/cc2420/LplBroadcastPeriodicDelivery/TestPeriodicAppC.nc000066400000000000000000000056061207233610700302130ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "TestPeriodic.h" /** * This app sends a message from Transmitter node to AM_BROADCAST_ADDR * and waits 1000 ms between each delivery so the Rx mote's radio * shuts back off and has to redetect to receive the next message. * Receiver: TOS_NODE_ID != 1 * Transmitter: TOS_NODE_ID == 1 * * @author David Moss */ configuration TestPeriodicAppC { } implementation { components TestPeriodicC, MainC, ActiveMessageC, new TimerMilliC(), new AMSenderC(AM_TESTPERIODICMSG), new AMReceiverC(AM_TESTPERIODICMSG), LedsC; TestPeriodicC.Boot -> MainC; TestPeriodicC.SplitControl -> ActiveMessageC; TestPeriodicC.LowPowerListening -> Lpl; TestPeriodicC.AMPacket -> ActiveMessageC; TestPeriodicC.AMSend -> AMSenderC; TestPeriodicC.Receive -> AMReceiverC; TestPeriodicC.Packet -> ActiveMessageC; TestPeriodicC.Timer -> TimerMilliC; TestPeriodicC.Leds -> LedsC; #if defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) components CC1000ActiveMessageC as Lpl; #elif defined(PLATFORM_MICAZ) || defined(PLATFORM_TELOSB) || defined(PLATFORM_SHIMMER) || defined(PLATFORM_SHIMMER2) || defined(PLATFORM_INTELMOTE2) || defined(PLATFORM_EPIC) || defined(PLATFORM_Z1) components CC2420ActiveMessageC as Lpl; #else #error "LPL testing not supported on this platform" #endif } tinyos-2.1.2+dfsg/apps/tests/cc2420/LplBroadcastPeriodicDelivery/TestPeriodicC.nc000066400000000000000000000077211207233610700275520ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "TestPeriodic.h" /** * This app sends a message from Transmitter node to AM_BROADCAST_ADDR * and waits 1000 ms between each delivery so the Rx mote's radio * shuts back off and has to redetect to receive the next message. * Receiver: TOS_NODE_ID != 1. * Transmitter: TOS_NODE_ID == 1. * * @author David Moss */ module TestPeriodicC { uses { interface Boot; interface SplitControl; interface LowPowerListening; interface AMSend; interface Receive; interface AMPacket; interface Packet; interface Leds; interface Timer; } } implementation { uint8_t count; message_t fullMsg; bool transmitter; uint8_t lastCount; /**************** Prototypes ****************/ task void send(); /**************** Boot Events ****************/ event void Boot.booted() { transmitter = (call AMPacket.address() == 1); count = 0; call LowPowerListening.setLocalWakeupInterval(1000); call SplitControl.start(); } event void SplitControl.startDone(error_t error) { if(transmitter) { post send(); } } event void SplitControl.stopDone(error_t error) { } /**************** Send Receive Events *****************/ event void AMSend.sendDone(message_t *msg, error_t error) { if(transmitter) { count++; call Timer.startOneShot(1000); call Leds.led0Off(); } } event message_t *Receive.receive(message_t *msg, void *payload, uint8_t len) { TestPeriodicMsg *periodicMsg = (TestPeriodicMsg *) payload; if(!transmitter) { if(lastCount == periodicMsg->count) { call Leds.led0On(); call Leds.led1Off(); } else { call Leds.led1On(); call Leds.led0Off(); } lastCount = periodicMsg->count; call Leds.led2Toggle(); } return msg; } /**************** Timer Events ****************/ event void Timer.fired() { if(transmitter) { post send(); } } /**************** Tasks ****************/ task void send() { TestPeriodicMsg *periodicMsg = (TestPeriodicMsg *) call Packet.getPayload(&fullMsg, sizeof(TestPeriodicMsg)); periodicMsg->count = count; call LowPowerListening.setRemoteWakeupInterval(&fullMsg, 1000); if(call AMSend.send(AM_BROADCAST_ADDR, &fullMsg, sizeof(TestPeriodicMsg)) != SUCCESS) { post send(); } else { call Leds.led0On(); } } } tinyos-2.1.2+dfsg/apps/tests/cc2420/LplUnicastPeriodicDelivery/000077500000000000000000000000001207233610700242245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/cc2420/LplUnicastPeriodicDelivery/Makefile000066400000000000000000000002001207233610700256540ustar00rootroot00000000000000COMPONENT=TestPeriodicAppC CFLAGS += -DACK_LOW_POWER_LISTENING #CFLAGS += -DNOACK_LOW_POWER_LISTENING include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/cc2420/LplUnicastPeriodicDelivery/README.txt000066400000000000000000000016131207233610700257230ustar00rootroot00000000000000README for LplUnicastPeriodicDelivery Author/Contact: tinyos-help@millennium.berkeley.edu Description: Install the application to two nodes with the following ID's: Node 0 (Receiver node): id = 0 Node 1 (Transmitter node): id = 1 (or.. id > 0) This app sends a message from Transmitter node to the recevier node and waits 1000 ms between each delivery so the Rx mote's radio shuts back off and has to redetect to receive the next message. EXPECTED OUTPUT Transmitter Node: * Toggles its led0 every second. - led0 ON indicates transmission, which lasts for much shorter than a second. When the receiver performs its receive check, the transmitter stops delivering the message. Receiver Node: * led1 toggles once a second, indicating reception. Tools: None. Known bugs/limitations: None. $Id: README.txt,v 1.4 2008-07-26 02:32:44 klueska Exp $ tinyos-2.1.2+dfsg/apps/tests/cc2420/LplUnicastPeriodicDelivery/TestPeriodic.h000066400000000000000000000002531207233610700267730ustar00rootroot00000000000000 #ifndef TESTPERIODIC_H #define TESTPERIODIC_H typedef nx_struct TestPeriodicMsg { nx_uint8_t count; } TestPeriodicMsg; enum { AM_TESTPERIODICMSG = 133, }; #endif tinyos-2.1.2+dfsg/apps/tests/cc2420/LplUnicastPeriodicDelivery/TestPeriodicAppC.nc000066400000000000000000000056071207233610700277200ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "TestPeriodic.h" /** * This app sends a message from Transmitter node to the recevier node * and waits 1000 ms between each delivery so the Rx mote's radio * shuts back off and has to redetect to receive the next message. * Receiver: TOS_NODE_ID != 1. * Transmitter: TOS_NODE_ID == 1. * * @author David Moss */ configuration TestPeriodicAppC { } implementation { components TestPeriodicC, MainC, ActiveMessageC, new TimerMilliC(), new AMSenderC(AM_TESTPERIODICMSG), new AMReceiverC(AM_TESTPERIODICMSG), LedsC; TestPeriodicC.Boot -> MainC; TestPeriodicC.SplitControl -> ActiveMessageC; TestPeriodicC.LowPowerListening -> Lpl; TestPeriodicC.AMPacket -> ActiveMessageC; TestPeriodicC.AMSend -> AMSenderC; TestPeriodicC.Receive -> AMReceiverC; TestPeriodicC.Packet -> ActiveMessageC; TestPeriodicC.Timer -> TimerMilliC; TestPeriodicC.Leds -> LedsC; #if defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) components CC1000ActiveMessageC as Lpl; #elif defined(PLATFORM_MICAZ) || defined(PLATFORM_TELOSB) || defined(PLATFORM_SHIMMER) || defined(PLATFORM_SHIMMER2) || defined(PLATFORM_INTELMOTE2) || defined(PLATFORM_EPIC) || defined(PLATFORM_Z1) components CC2420ActiveMessageC as Lpl; #else #error "LPL testing not supported on this platform" #endif } tinyos-2.1.2+dfsg/apps/tests/cc2420/LplUnicastPeriodicDelivery/TestPeriodicC.nc000066400000000000000000000072141207233610700272530ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "TestPeriodic.h" /** * This app sends a message from Transmitter node to the recevier node * and waits 1000 ms between each delivery so the Rx mote's radio * shuts back off and has to redetect to receive the next message. * Receiver: TOS_NODE_ID != 1. * Transmitter: TOS_NODE_ID == 1. * * @author David Moss */ module TestPeriodicC { uses { interface Boot; interface SplitControl; interface LowPowerListening; interface AMSend; interface Receive; interface AMPacket; interface Packet; interface Leds; interface Timer; } } implementation { uint8_t count; message_t fullMsg; bool transmitter; /**************** Prototypes ****************/ task void send(); /**************** Boot Events ****************/ event void Boot.booted() { transmitter = (call AMPacket.address() != 0); count = 0; call LowPowerListening.setLocalWakeupInterval(1000); call SplitControl.start(); } event void SplitControl.startDone(error_t error) { if(transmitter) { post send(); } } event void SplitControl.stopDone(error_t error) { } /**************** Send Receive Events *****************/ event void AMSend.sendDone(message_t *msg, error_t error) { if(transmitter) { count++; call Timer.startOneShot(1000); call Leds.led0Off(); } } event message_t *Receive.receive(message_t *msg, void *payload, uint8_t len) { if(!transmitter) { call Leds.led1Toggle(); } return msg; } /**************** Timer Events ****************/ event void Timer.fired() { if(transmitter) { post send(); } } /**************** Tasks ****************/ task void send() { TestPeriodicMsg *periodicMsg = (TestPeriodicMsg *) call Packet.getPayload(&fullMsg, sizeof(TestPeriodicMsg)); periodicMsg->count = count; call LowPowerListening.setRemoteWakeupInterval(&fullMsg, 1000); if(call AMSend.send(0, &fullMsg, sizeof(TestPeriodicMsg)) != SUCCESS) { post send(); } else { call Leds.led0On(); } } } tinyos-2.1.2+dfsg/apps/tests/cc2420/README.txt000066400000000000000000000005001207233610700204540ustar00rootroot00000000000000README for cc2420 Author/Contact: tinyos-help@millennium.berkeley.edu Description: This directory contains a number of test applications specific to the TI CC2420 radio chip. See the individual test applications for more details. Known bugs/limitations: None. $Id: README.txt,v 1.1 2008-06-24 17:40:30 idgay Exp $ tinyos-2.1.2+dfsg/apps/tests/cc2420/RssiToSerial/000077500000000000000000000000001207233610700213465ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/cc2420/RssiToSerial/Makefile000066400000000000000000000005501207233610700230060ustar00rootroot00000000000000COMPONENT=RssiToSerialC BUILD_EXTRA_DEPS = RssiSerialMsg.java SpecAnalyzer.class CLEAN_EXTRA = *.class RssiSerialMsg.java RssiSerialMsg.java: RssiToSerial.h mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=RssiSerialMsg RssiToSerial.h rssi_serial_msg -o $@ SpecAnalyzer.class: $(wildcard *.java) SpecAnalyzer.java javac *.java include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/cc2420/RssiToSerial/README.txt000066400000000000000000000016261207233610700230510ustar00rootroot00000000000000README for RssiToSerial Author/Contact: tinyos-help@millennium.berkeley.edu Description: This is more of a general demonstration than a test. Install this application to one node, connected to the computer. The node will measure the environmental RSSI from the CC2420 and sending those readings over the serial port. Use the Java application to display the relative RSSI readings. No activity: [+++++++++++++++ ] Transmitter nearby: [+++++++++++++++++++++++++++++++++++ ] Since the Java side has to convert the readings into a CLI bar graph, it's scaled by some (possibly non-linear) factor. Tools: java SpecAnalyzer [-comm ] If not specified, the defaults to sf@localhost:9002 or to your MOTECOM environment variable (if defined). Known bugs/limitations: None. $Id: README.txt,v 1.3 2008-07-26 02:32:44 klueska Exp $ tinyos-2.1.2+dfsg/apps/tests/cc2420/RssiToSerial/RssiToSerial.h000066400000000000000000000044771207233610700241160ustar00rootroot00000000000000 /* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jared Hill */ #ifndef RSSI_TO_SERIAL_H #define RSSI_TO_SERIAL_H typedef nx_struct rssi_serial_msg { nx_uint16_t rssiAvgValue; nx_uint16_t rssiLargestValue; nx_uint8_t channel; } rssi_serial_msg_t; enum { AM_RSSI_SERIAL_MSG = 134, WAIT_TIME = 256, //* Using log2 samples to avoid a divide. Sending a packet every 1 second will allow //* allow about 5000 samples. A packet every half second allows for 2500 samples, and //* a packet every quarter second allows for 1250 samples. // When to send a packet is based upon how many samples have been taken, not a // predetermined amount of time. Rough estimates of time can be found using the // conversion stated above. LOG2SAMPLES = 7, }; #endif tinyos-2.1.2+dfsg/apps/tests/cc2420/RssiToSerial/RssiToSerialC.nc000066400000000000000000000047411207233610700243640ustar00rootroot00000000000000 /* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "RssiToSerial.h" /** * This is more of a general demonstration than a test. * * Install this application to one node, connected to the computer. * The node will measure the environmental RSSI from the CC2420 and * sending those readings over the serial port. * * Use the Java application to display the relative RSSI readings. * * @author Jared Hill * @date 23 March 2007 */ configuration RssiToSerialC {} implementation { components MainC, RssiToSerialP as App, LedsC; components new TimerMilliC(); components SerialActiveMessageC as AM; components ActiveMessageC; components CC2420ControlC; App.Boot -> MainC.Boot; App.SerialControl -> AM; App.AMSend -> AM.AMSend[AM_RSSI_SERIAL_MSG]; App.AMControl -> ActiveMessageC; App.Leds -> LedsC; App.Packet -> AM; App.ReadRssi -> CC2420ControlC.ReadRssi; App.Config -> CC2420ControlC.CC2420Config; } tinyos-2.1.2+dfsg/apps/tests/cc2420/RssiToSerial/RssiToSerialP.nc000066400000000000000000000114571207233610700244030ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "Timer.h" #include "RssiToSerial.h" /** * This is more of a general demonstration than a test. * * Install this application to one node, connected to the computer. * The node will measure the environmental RSSI from the CC2420 and * sending those readings over the serial port. * * Use the Java application to display the relative RSSI readings. * * @author Jared Hill * @date 23 March 2007 */ module RssiToSerialP { uses { interface Leds; interface Boot; interface AMSend; interface SplitControl as AMControl; interface SplitControl as SerialControl; interface Packet; interface Read as ReadRssi; interface CC2420Config as Config; } } implementation { /******* Global Variables ****************/ message_t packet; bool locked; uint32_t total; uint16_t largest; uint16_t reads; /******** Declare Tasks *******************/ task void readRssi(); task void sendSerialMsg(); /************ Boot Events *****************/ event void Boot.booted() { call AMControl.start(); total = 0; largest = 0; reads = 0; locked = FALSE; } /************ AMControl Events ******************/ event void AMControl.startDone(error_t err) { if (err == SUCCESS) { call SerialControl.start(); } else { call AMControl.start(); } } event void AMControl.stopDone(error_t err) { // do nothing } /***************SerialControl Events*****************/ event void SerialControl.startDone(error_t error){ if (error == SUCCESS) { post readRssi(); } else { call AMControl.start(); } } event void SerialControl.stopDone(error_t error){ //do nothing } /***************** AMSend Events ****************************/ event void AMSend.sendDone(message_t* bufPtr, error_t error) { if (&packet == bufPtr) { locked = FALSE; } //post readRssi(); } /**************** ReadRssi Events *************************/ event void ReadRssi.readDone(error_t result, uint16_t val ){ if(result != SUCCESS){ post readRssi(); return; } atomic{ total += val; reads ++; if(largest < val){ largest = val; } } if(reads == (1<rssiAvgValue = (total >> (LOG2SAMPLES)); rsm->rssiLargestValue = largest; total = 0; largest = 0; reads = 0; } rsm->channel = call Config.getChannel(); if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(rssi_serial_msg_t)) == SUCCESS) { locked = TRUE; } } } } tinyos-2.1.2+dfsg/apps/tests/cc2420/RssiToSerial/SpecAnalyzer.java000066400000000000000000000112621207233610700246130ustar00rootroot00000000000000 /* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Java class to display RSSI readings returned from a mote running the * RssiToSerial application. * * @author Jared Hill */ import net.tinyos.message.Message; import net.tinyos.message.MessageListener; import net.tinyos.message.MoteIF; import net.tinyos.message.SerialPacket; import net.tinyos.packet.BuildSource; import net.tinyos.packet.PhoenixSource; import net.tinyos.util.PrintStreamMessenger; public class SpecAnalyzer implements MessageListener { /** Communication with the mote */ private MoteIF mote; /** Broadcast Address */ public static final short TOS_BCAST_ADDR = (short) 0xffff; /** The message from the mote */ private RssiSerialMsg rssiMsg; /** The total number of characters written last time */ private int lastCharsWritten = 0; /** The maximum size of the bar on the command line, in characters */ private static final int MAX_CHARACTERS = 50; /** * Constructor * * @param argv */ public SpecAnalyzer(MoteIF mif) { try { System.out.println("Connecting to serial forwarder..."); mote = mif; mote.registerListener(new RssiSerialMsg(), this); } catch (Exception e) { System.err.println("Couldn't contact serial forwarder"); } } /** * Received a message from the mote */ synchronized public void messageReceived(int dest, Message m) { rssiMsg = (RssiSerialMsg) m; updateSpectrum(rssiMsg.get_rssiLargestValue(), rssiMsg.get_rssiAvgValue()); } /** * Overwrites the current command line prompt with blank space * */ void clearSpectrum() { for(int i = 0; i < lastCharsWritten; i++) { System.out.print('\b'); } } /** * Prints the magnitude of the spectrum to stdout. Specifically, it prints * (largest - average) "+" signs to stdout. * * @param largest * the largest rssi value taken during the sample period * @param avg * the average rssi value taken during the sample period */ void updateSpectrum(int largest, int avg) { clearSpectrum(); String bar = "["; int size = (int) ((float) largest * (float) ((float) MAX_CHARACTERS / (float) (255))); for(int i = 0; i < size && i < MAX_CHARACTERS; i++) { bar += "+"; } for(int i = 0; i < (MAX_CHARACTERS - size); i++) { bar += " "; } bar += "]"; lastCharsWritten = bar.length(); System.out.print(bar); } private static void usage() { System.err.println("usage: SpecAnalyzer [-comm ]"); } /** * Main Method * * @param argv */ public static void main(String[] args) { String source = null; if (args.length == 2) { if (!args[0].equals("-comm")) { usage(); System.exit(1); } source = args[1]; } else if (args.length != 0) { usage(); System.exit(1); } PhoenixSource phoenix; if (source == null) { phoenix = BuildSource.makePhoenix(PrintStreamMessenger.err); } else { phoenix = BuildSource.makePhoenix(source, PrintStreamMessenger.err); } MoteIF mif = new MoteIF(phoenix); new SpecAnalyzer(mif); } } tinyos-2.1.2+dfsg/apps/tests/cc2420/TestAcks/000077500000000000000000000000001207233610700205045ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/cc2420/TestAcks/Makefile000066400000000000000000000000561207233610700221450ustar00rootroot00000000000000COMPONENT=TestAcksC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/cc2420/TestAcks/README.txt000066400000000000000000000010171207233610700222010ustar00rootroot00000000000000README for TestAcks Author/Contact: tinyos-help@millennium.berkeley.edu Description: Compile and install this application to two motes, both using ID 1 Expectations: Led0 Toggles on a dropped ack Led1 Toggles on a received ack Led2 Toggles when a message is received In short, Leds 1&2 should be toggling the majority of the time, until the other receiver stops receiving packets by turning off or moving out of range. Tools: None. Known bugs/limitations: None. $Id: README.txt,v 1.3 2008-07-26 02:32:44 klueska Exp $ tinyos-2.1.2+dfsg/apps/tests/cc2420/TestAcks/TestAcksC.nc000066400000000000000000000043211207233610700226520ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Test for radio acknowledgements * Program all motes up with ID 1 * Led0 = Received a message * Led1 = Got an ack * Led2 = Missed an ack * @author David Moss */ configuration TestAcksC { } implementation { components TestAcksP, MainC, ActiveMessageC, new AMSenderC(128), new AMReceiverC(128), new TimerMilliC(), LedsC; TestAcksP.Boot -> MainC; TestAcksP.SplitControl -> ActiveMessageC; TestAcksP.Leds -> LedsC; TestAcksP.AMSend -> AMSenderC; TestAcksP.Receive -> AMReceiverC; TestAcksP.PacketAcknowledgements -> ActiveMessageC; TestAcksP.Timer -> TimerMilliC; } tinyos-2.1.2+dfsg/apps/tests/cc2420/TestAcks/TestAcksP.nc000066400000000000000000000065711207233610700227000ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Test for radio acknowledgements * Program all motes up with ID 1 * Led0 = Missed an ack * Led1 = Got an ack * Led2 = Sent a message * @author David Moss */ module TestAcksP { uses { interface Boot; interface SplitControl; interface AMSend; interface Receive; interface Leds; interface PacketAcknowledgements; interface Timer; } } implementation { /** Message to transmit */ message_t myMsg; enum { DELAY_BETWEEN_MESSAGES = 50, }; /***************** Prototypes ****************/ task void send(); /***************** Boot Events ****************/ event void Boot.booted() { call SplitControl.start(); } /***************** SplitControl Events ****************/ event void SplitControl.startDone(error_t error) { post send(); } event void SplitControl.stopDone(error_t error) { } /***************** Receive Events ****************/ event message_t *Receive.receive(message_t *msg, void *payload, uint8_t len) { call Leds.led2Toggle(); return msg; } /***************** AMSend Events ****************/ event void AMSend.sendDone(message_t *msg, error_t error) { if(call PacketAcknowledgements.wasAcked(msg)) { call Leds.led1Toggle(); call Leds.led0Off(); } else { call Leds.led0Toggle(); call Leds.led1Off(); } if(DELAY_BETWEEN_MESSAGES > 0) { call Timer.startOneShot(DELAY_BETWEEN_MESSAGES); } else { post send(); } } /***************** Timer Events ****************/ event void Timer.fired() { post send(); } /***************** Tasks ****************/ task void send() { call PacketAcknowledgements.requestAck(&myMsg); if(call AMSend.send(1, &myMsg, 0) != SUCCESS) { post send(); } } } tinyos-2.1.2+dfsg/apps/tests/cc2420/TestPacketLink/000077500000000000000000000000001207233610700216505ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/cc2420/TestPacketLink/Makefile000066400000000000000000000006111207233610700233060ustar00rootroot00000000000000COMPONENT=TestPacketLinkC CFLAGS += -DPACKET_LINK BUILD_EXTRA_DEPS = PacketLinkMsg.java TestPacketLink.class CLEAN_EXTRA = *.class PacketLinkMsg.java PacketLinkMsg.java: TestPacketLink.h mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=PacketLinkMsg TestPacketLink.h PacketLinkMsg -o $@ TestPacketLink.class: $(wildcard *.java) TestPacketLink.java javac *.java include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/cc2420/TestPacketLink/README.txt000066400000000000000000000024421207233610700233500ustar00rootroot00000000000000README for TestPacketLink Author/Contact: tinyos-help@millennium.berkeley.edu Description: Test the effectiveness of the PacketLink layer INSTALL Transmitter: id == 1, 2, 3, 4, or 5 (up to MAX_TRANSMITTERS) Receiver: id == 0, plugged into the computer EXPECTATIONS Transmitter (ID not 0) - led1 toggling on every successfully delivered message led0 toggling on every unsuccessfully delivered message (and stay on until the next dropped packet) Receiver (ID 0) - Leds represent the binary count of sets of messages that were dropped. Ideally, if the transmitter and receiver are in range of each other, the receiver's LEDs should never turn on. You can pull the receiver out of range for up to two seconds before the transmission will fail. If you aren't convinced the receiver is doing anything because its leds aren't flashing, just turn it off and watch the transmitter's reaction. Tools: java TestPacketLink [-comm ] If not specified, the defaults to sf@localhost:9002 or to your MOTECOM environment variable (if defined). This application will report dropped and duplicate packets as seen on the receiver. Known bugs/limitations: None. $Id: README.txt,v 1.5 2008-09-22 20:52:39 idgay Exp $ tinyos-2.1.2+dfsg/apps/tests/cc2420/TestPacketLink/TestPacketLink.h000066400000000000000000000036321207233610700247120ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #ifndef TESTPACKETLINK_H #define TESTPACKETLINK_H typedef nx_struct PacketLinkMsg { nx_uint32_t count; nx_uint16_t src; nx_uint8_t cmd; } PacketLinkMsg; enum { AM_PACKETLINKMSG = 128, }; enum { CMD_DROPPED_PACKET = 0, CMD_DUPLICATE_PACKET = 1, }; #ifndef MAX_TRANSMITTERS #define MAX_TRANSMITTERS 5 #endif #endif tinyos-2.1.2+dfsg/apps/tests/cc2420/TestPacketLink/TestPacketLink.java000066400000000000000000000065411207233610700254060ustar00rootroot00000000000000 /* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ import net.tinyos.message.Message; import net.tinyos.message.MessageListener; import net.tinyos.message.MoteIF; import net.tinyos.message.SerialPacket; import net.tinyos.packet.BuildSource; import net.tinyos.packet.PhoenixSource; import net.tinyos.util.PrintStreamMessenger; /** * Feedback on from a TestPacketLink receiver * whether packets have been dropped or duplicated * @author David Moss * */ public class TestPacketLink implements MessageListener { private MoteIF moteIF; private static final short CMD_DROPPED_PACKET = 0; private static final short CMD_DUPLICATE_PACKET = 1; /** * Constructor * @param moteIF */ public TestPacketLink(MoteIF moteIF) { this.moteIF = moteIF; this.moteIF.registerListener(new PacketLinkMsg(), this); } public void messageReceived(int s, Message message) { PacketLinkMsg msg = (PacketLinkMsg) message; if(msg.get_cmd() == CMD_DROPPED_PACKET) { System.out.println("Dropped packet from source " + msg.get_src()); } else { System.out.println("Duplicate packet from source " + msg.get_src()); } } private static void usage() { System.err.println("usage: TestSerial [-comm ]"); } public static void main(String[] args) throws Exception { String source = null; if (args.length == 2) { if (!args[0].equals("-comm")) { usage(); System.exit(1); } source = args[1]; } else if (args.length != 0) { usage(); System.exit(1); } PhoenixSource phoenix; if (source == null) { phoenix = BuildSource.makePhoenix(PrintStreamMessenger.err); } else { phoenix = BuildSource.makePhoenix(source, PrintStreamMessenger.err); } MoteIF mif = new MoteIF(phoenix); new TestPacketLink(mif); } } tinyos-2.1.2+dfsg/apps/tests/cc2420/TestPacketLink/TestPacketLinkC.nc000066400000000000000000000064431207233610700251710ustar00rootroot00000000000000 /* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "TestPacketLink.h" /** * Test the effectiveness of the PacketLink layer * * Transmitter == 1, 2, 3, 4, or 5 (up to MAX_TRANSMITTERS) * Receiver == 0 * * Expect: * Transmitter (ID not 0) - * led1 toggling on every successfully delivered message * led0 toggling on every unsuccessfully delivered message (and stay on * until the next dropped packet) * * Receiver (ID 0) - * Leds represent the binary count of sets of messages that were dropped * or duplicated. * * Ideally, if the transmitter and receiver are in range of each other, * the receiver's LEDs should never turn on. You can pull the receiver * out of range for up to two seconds before the transmission will fail. * If you aren't convinced the receiver is doing anything because its * leds aren't flashing, just turn it off and watch the transmitter's * reaction. * * @author David Moss */ configuration TestPacketLinkC { } implementation { components TestPacketLinkP, MainC, ActiveMessageC, CC2420ActiveMessageC, new AMSenderC(AM_PACKETLINKMSG), new AMReceiverC(AM_PACKETLINKMSG), SerialActiveMessageC, new SerialAMSenderC(AM_PACKETLINKMSG), new TimerMilliC(), LedsC; TestPacketLinkP.Boot -> MainC; TestPacketLinkP.RadioSplitControl -> ActiveMessageC; TestPacketLinkP.SerialSplitControl -> SerialActiveMessageC; TestPacketLinkP.SerialAMSend -> SerialAMSenderC; TestPacketLinkP.PacketLink -> CC2420ActiveMessageC; TestPacketLinkP.AMPacket -> ActiveMessageC; TestPacketLinkP.AMSend -> AMSenderC; TestPacketLinkP.Receive -> AMReceiverC; TestPacketLinkP.Timer -> TimerMilliC; TestPacketLinkP.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/cc2420/TestPacketLink/TestPacketLinkP.nc000066400000000000000000000146501207233610700252050ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "TestPacketLink.h" /** * Test the effectiveness of the PacketLink layer * * Transmitter == 1, 2, 3, 4, or 5 (up to MAX_TRANSMITTERS) * Receiver == 0 * * Expect: * Transmitter (ID not 0) - * led1 toggling on every successfully delivered message * led0 toggling on every unsuccessfully delivered message (and stay on * until the next dropped packet) * * Receiver (ID 0) - * Leds represent the binary count of sets of messages that were dropped * or duplicated. * * Ideally, if the transmitter and receiver are in range of each other, * the receiver's LEDs should never turn on. You can pull the receiver * out of range for up to two seconds before the transmission will fail. * If you aren't convinced the receiver is doing anything because its * leds aren't flashing, just turn it off and watch the transmitter's * reaction. * * @author David Moss */ module TestPacketLinkP { uses { interface Boot; interface SplitControl as RadioSplitControl; interface SplitControl as SerialSplitControl; interface AMSend; interface AMSend as SerialAMSend; interface AMPacket; interface Receive; interface PacketLink; interface Leds; interface Timer; } } implementation { /** The message we'll be sending */ message_t myMsg; /** Serial message for status */ message_t serialMsg; /** The local count we're sending or should receive on each unique message */ uint32_t count[MAX_TRANSMITTERS]; /** The total number of packets missed by the receiver */ uint8_t missedPackets; /** True if this mote is the transmitter mote */ bool transmitter; enum { MSG_DESTINATION = 0, }; /***************** Prototypes ****************/ task void send(); task void sendSerial(); /***************** Boot Events ****************/ event void Boot.booted() { int i; /* * Setup this message in advance to retry up to 50 times with 40 ms of * delay between each message. 50 * 40 ms = 2 seconds before it quits. * It only needs to be setup once to be stored in the msg's metadata. */ call PacketLink.setRetries(&myMsg, 50); call PacketLink.setRetryDelay(&myMsg, 40); missedPackets = 0; for(i = 0; i < MAX_TRANSMITTERS; i++) { count[i] = 0; } transmitter = (call AMPacket.address() != 0); call RadioSplitControl.start(); if(!transmitter) { call SerialSplitControl.start(); } } /***************** SplitControl Events *****************/ event void RadioSplitControl.startDone(error_t error) { if(transmitter) { post send(); } } event void RadioSplitControl.stopDone(error_t error) { } /***************** SerialSplitControl Events ****************/ event void SerialSplitControl.startDone(error_t error) { } event void SerialSplitControl.stopDone(error_t error) { } /***************** AMSend Events ****************/ event void AMSend.sendDone(message_t *msg, error_t error) { if(call PacketLink.wasDelivered(msg)) { count[0]++; call Leds.led1Toggle(); } else { call Leds.led0Toggle(); } ((PacketLinkMsg *) call AMSend.getPayload(&myMsg, sizeof(PacketLinkMsg)))->count = count[0]; call Timer.startOneShot(50); } /***************** SerialAMSend Events ****************/ event void SerialAMSend.sendDone(message_t *msg, error_t error) { } /***************** Receive Events ****************/ event message_t *Receive.receive(message_t *msg, void *payload, uint8_t len) { PacketLinkMsg *linkMsg = (PacketLinkMsg *) payload; uint16_t source = call AMPacket.source(msg); if(transmitter || source > MAX_TRANSMITTERS - 1) { return msg; } if(linkMsg->count != count[source]) { ((PacketLinkMsg *) (call SerialAMSend.getPayload(&serialMsg, sizeof(PacketLinkMsg))))->src = source; if(linkMsg->count > count[source]) { ((PacketLinkMsg *) (call SerialAMSend.getPayload(&serialMsg, sizeof(PacketLinkMsg))))->cmd = CMD_DROPPED_PACKET; } else { ((PacketLinkMsg *) (call SerialAMSend.getPayload(&serialMsg, sizeof(PacketLinkMsg))))->cmd = CMD_DUPLICATE_PACKET; } post sendSerial(); if(count[source] != 0) { missedPackets++; call Leds.set(missedPackets); } } count[source] = linkMsg->count; count[source]++; return msg; } /***************** Timer Events ***************/ event void Timer.fired() { post send(); } /***************** Tasks ****************/ task void send() { if(call AMSend.send(MSG_DESTINATION, &myMsg, sizeof(PacketLinkMsg)) != SUCCESS) { post send(); } } task void sendSerial() { if(call SerialAMSend.send(0, &serialMsg, sizeof(PacketLinkMsg)) != SUCCESS) { post sendSerial(); } } } tinyos-2.1.2+dfsg/apps/tests/cc2420/TestSecurity/000077500000000000000000000000001207233610700214325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/cc2420/TestSecurity/BaseStation/000077500000000000000000000000001207233610700236465ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/cc2420/TestSecurity/BaseStation/BaseStationC.nc000066400000000000000000000101611207233610700265060ustar00rootroot00000000000000// $Id: BaseStationC.nc,v 1.3 2010-06-29 22:07:25 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The TinyOS 2.x base station that forwards packets between the UART * and radio.It replaces the GenericBase of TinyOS 1.0 and the * TOSBase of TinyOS 1.1. * *

    On the serial link, BaseStation sends and receives simple active * messages (not particular radio packets): on the radio link, it * sends radio active messages, whose format depends on the network * stack being used. BaseStation will copy its compiled-in group ID to * messages moving from the serial link to the radio, and will filter * out incoming radio messages that do not contain that group ID.

    * *

    BaseStation includes queues in both directions, with a guarantee * that once a message enters a queue, it will eventually leave on the * other interface. The queues allow the BaseStation to handle load * spikes.

    * *

    BaseStation acknowledges a message arriving over the serial link * only if that message was successfully enqueued for delivery to the * radio link.

    * *

    The LEDS are programmed to toggle as follows:

    *
      *
    • RED Toggle:: Message bridged from serial to radio
    • *
    • GREEN Toggle: Message bridged from radio to serial
    • *
    • YELLOW/BLUE Toggle: Dropped message due to queue overflow in either direction
    • *
    * * @author Phil Buonadonna * @author Gilman Tolle * @author David Gay * @author Philip Levis * @date August 10 2005 */ configuration BaseStationC { } implementation { components MainC, BaseStationP, LedsC; components ActiveMessageC as Radio, SerialActiveMessageC as Serial; components CC2420KeysC; MainC.Boot <- BaseStationP; BaseStationP.RadioControl -> Radio; BaseStationP.SerialControl -> Serial; BaseStationP.UartSend -> Serial; BaseStationP.UartReceive -> Serial.Receive; BaseStationP.UartPacket -> Serial; BaseStationP.UartAMPacket -> Serial; BaseStationP.RadioSend -> Radio; BaseStationP.RadioReceive -> Radio.Receive; BaseStationP.RadioSnoop -> Radio.Snoop; BaseStationP.RadioPacket -> Radio; BaseStationP.RadioAMPacket -> Radio; BaseStationP.Leds -> LedsC; BaseStationP.CC2420Keys -> CC2420KeysC; } tinyos-2.1.2+dfsg/apps/tests/cc2420/TestSecurity/BaseStation/BaseStationP.nc000066400000000000000000000177111207233610700265330ustar00rootroot00000000000000// $Id: BaseStationP.nc,v 1.3 2010-06-29 22:07:27 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * @author Phil Buonadonna * @author Gilman Tolle * @author David Gay * Revision: $Id: BaseStationP.nc,v 1.3 2010-06-29 22:07:27 scipio Exp $ */ /* * BaseStationP bridges packets between a serial channel and the radio. * Messages moving from serial to radio will be tagged with the group * ID compiled into the TOSBase, and messages moving from radio to * serial will be filtered by that same group id. */ #include "AM.h" #include "Serial.h" module BaseStationP @safe() { uses { interface Boot; interface SplitControl as SerialControl; interface SplitControl as RadioControl; interface AMSend as UartSend[am_id_t id]; interface Receive as UartReceive[am_id_t id]; interface Packet as UartPacket; interface AMPacket as UartAMPacket; interface AMSend as RadioSend[am_id_t id]; interface Receive as RadioReceive[am_id_t id]; interface Receive as RadioSnoop[am_id_t id]; interface Packet as RadioPacket; interface AMPacket as RadioAMPacket; interface CC2420Keys; interface Leds; } } implementation { enum { UART_QUEUE_LEN = 12, RADIO_QUEUE_LEN = 12, }; message_t uartQueueBufs[UART_QUEUE_LEN]; message_t * ONE_NOK uartQueue[UART_QUEUE_LEN]; uint8_t uartIn, uartOut; bool uartBusy, uartFull; message_t radioQueueBufs[RADIO_QUEUE_LEN]; message_t * ONE_NOK radioQueue[RADIO_QUEUE_LEN]; uint8_t radioIn, radioOut; bool radioBusy, radioFull; uint8_t key[16] = {0x98,0x67,0x7F,0xAF,0xD6,0xAD,0xB7,0x0C,0x59,0xE8,0xD9,0x47,0xC9,0x71,0x15,0x0F}; task void uartSendTask(); task void radioSendTask(); void dropBlink() { call Leds.led2Toggle(); } void failBlink() { call Leds.led2Toggle(); } event void Boot.booted() { uint8_t i; for (i = 0; i < UART_QUEUE_LEN; i++) uartQueue[i] = &uartQueueBufs[i]; uartIn = uartOut = 0; uartBusy = FALSE; uartFull = TRUE; for (i = 0; i < RADIO_QUEUE_LEN; i++) radioQueue[i] = &radioQueueBufs[i]; radioIn = radioOut = 0; radioBusy = FALSE; radioFull = TRUE; call RadioControl.start(); call SerialControl.start(); } event void RadioControl.startDone(error_t error) { if (error == SUCCESS) { radioFull = FALSE; call CC2420Keys.setKey(1, key); } } event void SerialControl.startDone(error_t error) { if (error == SUCCESS) { uartFull = FALSE; } } event void SerialControl.stopDone(error_t error) {} event void RadioControl.stopDone(error_t error) {} event void CC2420Keys.setKeyDone(uint8_t keyNo, uint8_t* skey) {} uint8_t count = 0; message_t* ONE receive(message_t* ONE msg, void* payload, uint8_t len); event message_t *RadioSnoop.receive[am_id_t id](message_t *msg, void *payload, uint8_t len) { return receive(msg, payload, len); } event message_t *RadioReceive.receive[am_id_t id](message_t *msg, void *payload, uint8_t len) { return receive(msg, payload, len); } message_t* receive(message_t *msg, void *payload, uint8_t len) { message_t *ret = msg; atomic { if (!uartFull) { ret = uartQueue[uartIn]; uartQueue[uartIn] = msg; uartIn = (uartIn + 1) % UART_QUEUE_LEN; if (uartIn == uartOut) uartFull = TRUE; if (!uartBusy) { post uartSendTask(); uartBusy = TRUE; } } else dropBlink(); } return ret; } uint8_t tmpLen; task void uartSendTask() { uint8_t len; am_id_t id; am_addr_t addr, src; message_t* msg; atomic if (uartIn == uartOut && !uartFull) { uartBusy = FALSE; return; } msg = uartQueue[uartOut]; tmpLen = len = call RadioPacket.payloadLength(msg); id = call RadioAMPacket.type(msg); addr = call RadioAMPacket.destination(msg); src = call RadioAMPacket.source(msg); call UartPacket.clear(msg); call UartAMPacket.setSource(msg, src); if (call UartSend.send[id](addr, uartQueue[uartOut], len) == SUCCESS) call Leds.led1Toggle(); else { failBlink(); post uartSendTask(); } } event void UartSend.sendDone[am_id_t id](message_t* msg, error_t error) { if (error != SUCCESS) failBlink(); else atomic if (msg == uartQueue[uartOut]) { if (++uartOut >= UART_QUEUE_LEN) uartOut = 0; if (uartFull) uartFull = FALSE; } post uartSendTask(); } event message_t *UartReceive.receive[am_id_t id](message_t *msg, void *payload, uint8_t len) { message_t *ret = msg; bool reflectToken = FALSE; atomic if (!radioFull) { reflectToken = TRUE; ret = radioQueue[radioIn]; radioQueue[radioIn] = msg; if (++radioIn >= RADIO_QUEUE_LEN) radioIn = 0; if (radioIn == radioOut) radioFull = TRUE; if (!radioBusy) { post radioSendTask(); radioBusy = TRUE; } } else dropBlink(); if (reflectToken) { //call UartTokenReceive.ReflectToken(Token); } return ret; } task void radioSendTask() { uint8_t len; am_id_t id; am_addr_t addr,source; message_t* msg; atomic if (radioIn == radioOut && !radioFull) { radioBusy = FALSE; return; } msg = radioQueue[radioOut]; len = call UartPacket.payloadLength(msg); addr = call UartAMPacket.destination(msg); source = call UartAMPacket.source(msg); id = call UartAMPacket.type(msg); call RadioPacket.clear(msg); call RadioAMPacket.setSource(msg, source); if (call RadioSend.send[id](addr, msg, len) == SUCCESS) call Leds.led0Toggle(); else { failBlink(); post radioSendTask(); } } event void RadioSend.sendDone[am_id_t id](message_t* msg, error_t error) { if (error != SUCCESS) failBlink(); else atomic if (msg == radioQueue[radioOut]) { if (++radioOut >= RADIO_QUEUE_LEN) radioOut = 0; if (radioFull) radioFull = FALSE; } post radioSendTask(); } } tinyos-2.1.2+dfsg/apps/tests/cc2420/TestSecurity/BaseStation/Makefile000066400000000000000000000003661207233610700253130ustar00rootroot00000000000000COMPONENT=BaseStationC CFLAGS += -DCC2420_NO_ACKNOWLEDGEMENTS CFLAGS += -DCC2420_NO_ADDRESS_RECOGNITION CFLAGS += -DCC2420_HW_SECURITY CFLAGS += -DTFRAMES_ENABLED CFLAGS += -DTOSH_DATA_LENGTH=115 CFLAGS += -DTASKLET_IS_TASK include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/cc2420/TestSecurity/README.txt000066400000000000000000000017051207233610700231330ustar00rootroot00000000000000README for TestSecurity Author/Contact: JeongGil Ko Razvan Musaloiu-E. Jong Hyun Lim Description: Test the CC2420 hardware security support Applications: 1. RadioCountToLeds1/ This application is a modification to the RadioCountToLeds/ application with CC2420 security features added to outgoing packets. The packets are decrypted at the receiver node. > INSTALL Compile one node with ID 1 as the transmitter and other nodes with any node IDs to receive the decrypted packets >EXPECTATIONS LEDs on the receiver nodes will blink their LEDs sequentially like the original RadioCountToLeds/ application. The LEDs on the transmitter will stay off. 2. Basestation/ The BaseStation application with the security extensions > INSTALL Follow instructions on apps/BaseStation/README.txt > EXPECTATIONS Identical to the expectations in apps/BaseStation/README.txt Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/cc2420/TestSecurity/RadioCountToLeds1/000077500000000000000000000000001207233610700246755ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/cc2420/TestSecurity/RadioCountToLeds1/Makefile000066400000000000000000000005101207233610700263310ustar00rootroot00000000000000COMPONENT=RadioCountToLedsAppC CFLAGS+=-DCC2420_HW_ACKNOWLEDGEMENTS CFLAGS+=-DCC2420_HW_SECURITY #CFLAGS+=-DCC2420_DEF_CHANNEL=25 CFLAGS+=-DTFRAMES_ENABLED CFLAGS+=-DPACKET_LINK CFLAGS+=-DTOSH_DATA_LENGTH=115 #CFLAGS+=-I%T/lib/printf CFLAGS+=-I$(TOSDIR)/lib/printf CFLAGS+=-DPRINTFUART_ENABLED CFLAGS+=-I./ include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/cc2420/TestSecurity/RadioCountToLeds1/RadioCountToLeds.h000066400000000000000000000042051207233610700302310ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef RADIO_COUNT_TO_LEDS_H #define RADIO_COUNT_TO_LEDS_H typedef nx_struct radio_count_msg { nx_uint16_t counter; nx_uint16_t counter2[20]; } radio_count_msg_t; enum { AM_RADIO_COUNT_MSG = 6, }; #endif tinyos-2.1.2+dfsg/apps/tests/cc2420/TestSecurity/RadioCountToLeds1/RadioCountToLedsAppC.nc000066400000000000000000000057751207233610700311630ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "RadioCountToLeds.h" /** * Configuration for the RadioCountToLeds application. RadioCountToLeds * maintains a 4Hz counter, broadcasting its value in an AM packet * every time it gets updated. A RadioCountToLeds node that hears a counter * displays the bottom three bits on its LEDs. This application is a useful * test to show that basic AM communication and timers work. * * @author Philip Levis * @date June 6 2005 */ configuration RadioCountToLedsAppC {} implementation { components MainC, RadioCountToLedsC as App, LedsC, NoLedsC; components new SecAMSenderC(AM_RADIO_COUNT_MSG) as AMSenderC; components new AMReceiverC(AM_RADIO_COUNT_MSG); components new TimerMilliC(); components CC2420KeysC; components ActiveMessageC; App.Boot -> MainC.Boot; App.Receive -> AMReceiverC; App.AMSend -> AMSenderC; App.AMControl -> ActiveMessageC; App.Leds -> LedsC; App.MilliTimer -> TimerMilliC; App.Packet -> AMSenderC; App.CC2420Security -> AMSenderC; App.CC2420Keys -> CC2420KeysC; components CC2420ActiveMessageC as Radio; App.PacketLink -> Radio; } tinyos-2.1.2+dfsg/apps/tests/cc2420/TestSecurity/RadioCountToLeds1/RadioCountToLedsC.nc000066400000000000000000000116521207233610700305110ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "Timer.h" #include "RadioCountToLeds.h" /** * Implementation of the RadioCountToLeds application. RadioCountToLeds * maintains a 4Hz counter, broadcasting its value in an AM packet * every time it gets updated. A RadioCountToLeds node that hears a counter * displays the bottom three bits on its LEDs. This application is a useful * test to show that basic AM communication and timers work. * * @author Philip Levis * @date June 6 2005 */ module RadioCountToLedsC { uses { interface Leds; interface Boot; interface Receive; interface AMSend; interface Timer as MilliTimer; interface SplitControl as AMControl; interface Packet; interface CC2420SecurityMode as CC2420Security; interface CC2420Keys; interface PacketLink; } } implementation { message_t packet; uint8_t key[16] = {0x98,0x67,0x7F,0xAF,0xD6,0xAD,0xB7,0x0C,0x59,0xE8,0xD9,0x47,0xC9,0x71,0x15,0x0F}; uint8_t keyReady = 0; // should be set to 1 when key setting is done bool locked; uint16_t counter = 0; event void Boot.booted() { call AMControl.start(); } event void AMControl.startDone(error_t err) { if (err == SUCCESS) { call CC2420Keys.setKey(1, key); if(TOS_NODE_ID == 1) call MilliTimer.startPeriodic(128); } else { call AMControl.start(); } } event void AMControl.stopDone(error_t err) { } event void CC2420Keys.setKeyDone(uint8_t keyNo, uint8_t* skey) { keyReady = 1; } event void MilliTimer.fired() { counter++; dbg("RadioCountToLedsC", "RadioCountToLedsC: timer fired, counter is %hu.\n", counter); if (locked) { return; } else if(keyReady == 1) { radio_count_msg_t* rcm = (radio_count_msg_t*)call Packet.getPayload(&packet, sizeof(radio_count_msg_t)); if (rcm == NULL) { return; } rcm->counter = counter; call CC2420Security.setCtr(&packet, 0, 0); //call CC2420Security.setCbcMac(&packet, 0, 0, 16); //call CC2420Security.setCcm(&packet, 1, 0, 16); call PacketLink.setRetries(&packet, 1); if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(radio_count_msg_t)) == SUCCESS) { dbg("RadioCountToLedsC", "RadioCountToLedsC: packet sent.\n", counter); locked = TRUE; } } } event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) { dbg("RadioCountToLedsC", "Received packet of length %hhu.\n", len); if (len != sizeof(radio_count_msg_t)) {return bufPtr;} else { radio_count_msg_t* rcm = (radio_count_msg_t*)payload; if (rcm->counter & 0x1) { call Leds.led0On(); } else { call Leds.led0Off(); } if (rcm->counter & 0x2) { call Leds.led1On(); } else { call Leds.led1Off(); } if (rcm->counter & 0x4) { call Leds.led2On(); } else { call Leds.led2Off(); } return bufPtr; } } event void AMSend.sendDone(message_t* msg, error_t error) { if (&packet == msg) { locked = FALSE; } } } tinyos-2.1.2+dfsg/apps/tests/cc2420/TxThroughput/000077500000000000000000000000001207233610700214505ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/cc2420/TxThroughput/Makefile000066400000000000000000000010431207233610700231060ustar00rootroot00000000000000COMPONENT=TxThroughputC BUILD_EXTRA_DEPS = ThroughputMsg.py ThroughputMsg.java ThroughputMsg.class CLEAN_EXTRA = *.class *.pyc ThroughputMsg.py ThroughputMsg.java ThroughputMsg.py: TxThroughput.h mig python -target=$(PLATFORM) $(CFLAGS) -python-classname=ThroughputMsg TxThroughput.h ThroughputMsg -o $@ ThroughputMsg.java: TxThroughput.h mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=ThroughputMsg TxThroughput.h ThroughputMsg -o $@ ThroughputMsg.class: $(wildcard *.java) ThroughputMsg.java javac *.java include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/cc2420/TxThroughput/README.txt000066400000000000000000000021101207233610700231400ustar00rootroot00000000000000README for TxThroughput Author/Contact: tinyos-help@millennium.berkeley.edu Description: This application is used more for characterization rather than a test. It measures the maximum radio throughput using the largest message payload size, and does not use low power listening. INSTALL Compile and install this application to one mote. Leave the mote connected to the computer. EXPECTATIONS Led1 will toggle as each message is transmitted. Once a second, the mote will send a packet through the serial port to the computer. Tools: Run the TxThroughput java application: Linux: java TxThroughput.class [-comm ] Windows: java TxThroughput [-comm ] The TxThroughput Java application will display the number of packets per second and the number of bytes sent in the payload per second: [Packets/s]: 124; [(Payload Bytes)/s]: 3472 [Packets/s]: 126; [(Payload Bytes)/s]: 3528 [Packets/s]: 115; [(Payload Bytes)/s]: 3220 [Packets/s]: 124; [(Payload Bytes)/s]: 3472 Known bugs/limitations: None. $Id: README.txt,v 1.4 2008-07-26 02:32:44 klueska Exp $ tinyos-2.1.2+dfsg/apps/tests/cc2420/TxThroughput/TxThroughput.h000066400000000000000000000043041207233610700243070ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author David Moss */ #ifndef TXTHROUGHPUT_H #define TXTHROUGHPUT_H /** * Optionally override the default payload length with our own to see how it * affects throughput. Be sure to re-mig your messages. */ #ifndef TOSH_DATA_LENGTH #define TOSH_DATA_LENGTH 28 #endif #include "message.h" typedef nx_struct ThroughputMsg { nx_uint16_t packetsPerSecond; nx_uint8_t fillBytes[TOSH_DATA_LENGTH - 2]; } ThroughputMsg; enum { AM_THROUGHPUTMSG = 133, }; /** * Set this to 1 if you want to see how acknowledgements affects throughput */ #ifndef USE_ACKNOWLEDGEMENTS #define USE_ACKNOWLEDGEMENTS 0 #endif #endif tinyos-2.1.2+dfsg/apps/tests/cc2420/TxThroughput/TxThroughput.java000066400000000000000000000057311207233610700250060ustar00rootroot00000000000000 /* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Java-side application for examining the radio Tx throughput * * @author David Moss */ import java.io.IOException; import net.tinyos.message.*; import net.tinyos.packet.*; import net.tinyos.util.*; public class TxThroughput implements MessageListener { private MoteIF moteIF; public TxThroughput(MoteIF moteIF) { this.moteIF = moteIF; this.moteIF.registerListener(new ThroughputMsg(), this); } public void messageReceived(int dest, Message message) { System.out.println("[Packets/s]: " + ((ThroughputMsg) message).get_packetsPerSecond() + "; [(Payload Bytes)/s]: " + ((((ThroughputMsg) message).numElements_fillBytes() + 2) * ((ThroughputMsg) message).get_packetsPerSecond())); } private static void usage() { System.err.println("usage: TxThroughput [-comm ]"); } public static void main(String[] args) throws Exception { String source = null; if (args.length == 2) { if (!args[0].equals("-comm")) { usage(); System.exit(1); } source = args[1]; } else if (args.length != 0) { usage(); System.exit(1); } PhoenixSource phoenix; if (source == null) { phoenix = BuildSource.makePhoenix(PrintStreamMessenger.err); } else { phoenix = BuildSource.makePhoenix(source, PrintStreamMessenger.err); } MoteIF mif = new MoteIF(phoenix); new TxThroughput(mif); } }tinyos-2.1.2+dfsg/apps/tests/cc2420/TxThroughput/TxThroughputC.nc000066400000000000000000000047131207233610700245670ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "TxThroughput.h" /** * This application is used more for characterization rather than a * test. It measures the maximum radio throughput using the largest * message payload size, and does not use low power listening. * * @author David Moss */ configuration TxThroughputC { } implementation { components TxThroughputP, MainC, SerialActiveMessageC, new SerialAMSenderC(AM_THROUGHPUTMSG), ActiveMessageC, new AMSenderC(AM_THROUGHPUTMSG), new TimerMilliC(), LedsC; TxThroughputP.Boot -> MainC; TxThroughputP.SerialSplitControl -> SerialActiveMessageC; TxThroughputP.RadioSplitControl -> ActiveMessageC; TxThroughputP.SerialAMSend -> SerialAMSenderC; TxThroughputP.RadioAMSend -> AMSenderC; TxThroughputP.PacketAcknowledgements -> ActiveMessageC; TxThroughputP.Timer -> TimerMilliC; TxThroughputP.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/cc2420/TxThroughput/TxThroughputP.nc000066400000000000000000000100611207233610700245750ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "TxThroughput.h" /** * This application is used more for characterization rather than a * test. It measures the maximum radio throughput using the largest * message payload size, and does not use low power listening. * * @author David Moss */ module TxThroughputP { uses { interface Boot; interface SplitControl as SerialSplitControl; interface SplitControl as RadioSplitControl; interface AMSend as SerialAMSend; interface AMSend as RadioAMSend; interface PacketAcknowledgements; interface Timer; interface Leds; } } implementation { message_t radioMsg; message_t serialMsg; uint16_t packetsPerSecond; enum { MSG_DESTINATION = 1, }; /***************** Prototypes ****************/ task void sendRadio(); task void sendSerial(); /***************** Boot Events ****************/ event void Boot.booted() { if(USE_ACKNOWLEDGEMENTS) { call PacketAcknowledgements.requestAck(&radioMsg); } else { call PacketAcknowledgements.noAck(&radioMsg); } call RadioSplitControl.start(); call SerialSplitControl.start(); } /***************** RadioSplitControl Events ****************/ event void RadioSplitControl.startDone(error_t error) { packetsPerSecond = 0; post sendRadio(); } event void RadioSplitControl.stopDone(error_t error) { } /***************** SerialSplitControl Events ****************/ event void SerialSplitControl.startDone(error_t error) { call Timer.startPeriodic(1024); } event void SerialSplitControl.stopDone(error_t error) { } /***************** AMSend Events ****************/ event void RadioAMSend.sendDone(message_t *msg, error_t error) { packetsPerSecond++; call Leds.led1Toggle(); post sendRadio(); } event void SerialAMSend.sendDone(message_t *msg, error_t error) { } /***************** Timer Events ***************/ event void Timer.fired() { ((ThroughputMsg *) call SerialAMSend.getPayload(&serialMsg, sizeof(ThroughputMsg)))->packetsPerSecond = packetsPerSecond; packetsPerSecond = 0; post sendSerial(); } /****************** Tasks ****************/ task void sendRadio() { if(call RadioAMSend.send(MSG_DESTINATION, &radioMsg, sizeof(ThroughputMsg)) != SUCCESS) { post sendRadio(); } } task void sendSerial() { if(call SerialAMSend.send(0, &serialMsg, sizeof(ThroughputMsg)) != SUCCESS) { post sendSerial(); } } } tinyos-2.1.2+dfsg/apps/tests/deluge/000077500000000000000000000000001207233610700173335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/deluge/Basestation/000077500000000000000000000000001207233610700216075ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/deluge/Basestation/BasestationAppC.nc000066400000000000000000000033641207233610700251570ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ configuration BasestationAppC {} implementation { components DelugeC; } tinyos-2.1.2+dfsg/apps/tests/deluge/Basestation/Makefile000066400000000000000000000001431207233610700232450ustar00rootroot00000000000000COMPONENT=BasestationAppC BOOTLOADER=tosboot CFLAGS += -DDELUGE_BASESTATION include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/deluge/Basestation/README.txt000066400000000000000000000010441207233610700233040ustar00rootroot00000000000000README for apps/tests/deluge/Basestation Author/Contact: Chieh-Jan Mike Liang Razvan Musaloiu-E. Description: This is a sample application for Deluge T2. The application is similar with GoldenImage, but it includes the basestation behavior by using the CFLAGS=-DDELUGE_BASESTATION flag. For telosb the command to install the program is like this: make telosb install bsl,/dev/ttyUSB0 Prerequisites: Python 2.4 with pySerial References: The Deluge T2 wiki page from http://docs.tinyos.net/ tinyos-2.1.2+dfsg/apps/tests/deluge/Basestation/volumes-at45db.xml000066400000000000000000000003141207233610700251020ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/deluge/Basestation/volumes-stm25p.xml000066400000000000000000000003211207233610700251470ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/deluge/Blink/000077500000000000000000000000001207233610700203725ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/deluge/Blink/BlinkAppC.nc000066400000000000000000000050341207233610700225210ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Blink is a basic application that toggles a mote's LED periodically. * It does so by starting a Timer that fires every second. It uses the * OSKI TimerMilli service to achieve this goal. * * @author tinyos-help@millennium.berkeley.edu * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. **/ configuration BlinkAppC { } implementation { components MainC, BlinkC, LedsC; components new TimerMilliC() as Timer0; components DelugeC; DelugeC.Leds -> LedsC; BlinkC -> MainC.Boot; BlinkC.Timer0 -> Timer0; BlinkC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/deluge/Blink/BlinkC.nc000066400000000000000000000051211207233610700220550ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implementation for Blink application. Toggle the red LED when a * Timer fires. * * @author tinyos-help@millennium.berkeley.edu * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. **/ #include "Timer.h" module BlinkC { uses interface Timer as Timer0; uses interface Leds; uses interface Boot; } implementation { event void Boot.booted() { call Timer0.startPeriodic( 500 ); } event void Timer0.fired() { dbg("BlinkC", "Timer 0 fired @ %s.\n", sim_time_string()); #ifndef BLINK_REVERSE call Leds.led0Toggle(); #else call Leds.led2Toggle(); #endif } } tinyos-2.1.2+dfsg/apps/tests/deluge/Blink/Makefile000066400000000000000000000002041207233610700220260ustar00rootroot00000000000000COMPONENT=BlinkAppC BOOTLOADER=tosboot #CFLAGS += -DDELUGE_BASESTATION #CFLAGS += -DDELUGE_LIGHT_BASESTATION include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/deluge/Blink/README.txt000066400000000000000000000032001207233610700220630ustar00rootroot00000000000000README for apps/tests/deluge/Blink Author/Contact: Chieh-Jan Mike Liang Razvan Musaloiu-E. Description: This application serves two purposes. First, it contains two test cases for Deluge T2: testing base station functionality and network-wide reprogramming. Second, it is a sample application referenced in the Deluge T2 wiki page to illustrate some of the basics in reprogramming. These are done with the two burn scripts in the directory. The "burn" script performs the following tasks (on the basestation only): 1) Compile and load the program normally. After this step the mote will blink led 0. 2) Compile another version of blink that blinks led 2. 3) Upload the new blink to flash volume 1. 4) Instruct the mote to reprogram with the new blink. If all the steps are executed properly the mote end up blinking the led 2. The "burn-net" script performs the following tasks: 1) Compile and load the program normally on multiple motes. The last mote is designated to be the basestation. 2) Compile another version of blink that blinks led 2. 3) Upload the new blink to flash volume 1 on the base station. 4) Give the command to base station to disseminate-and-reprogram. To help testing, "burn-net" script describes what the user should expect in each step. At the end of all the steps the base station should blink led 0 and all the rest of the motes should blink led 2. For a more detailed discussion on Deluge T2, please refer to the Deluge T2 wiki page. Prerequisites: Python 2.4 with pySerial References: The Deluge T2 wiki page from http://docs.tinyos.net/ tinyos-2.1.2+dfsg/apps/tests/deluge/Blink/burn000077500000000000000000000064401207233610700212720ustar00rootroot00000000000000#!/bin/bash TOS_DELUGE=`type -p tos-deluge` if [[ ! -x ${TOS_DELUGE} ]] ; then TOS_DELUGE=../../../../tools/tinyos/misc/tos-deluge fi $TOS_DELUGE > /dev/null if [[ $? != 0 ]] then echo "Unable to locate tos-deluge." exit 2 fi if [[ $# -ne 3 ]]; then echo "Usage: $0 " echo " bsl,PORT | mib510,PORT | eprb,HOST | sm16cf,PORT" echo " serial@PORT:SPEED | network@HOST:PORT" echo " micaz | telosb | iris | epic | mulle" echo " Common combinations" echo " " echo " bsl,PORT serial@PORT:SPEED telosb|iris" echo " mib510,PORT serial@PORT:SPEED micaz" echo " eprb,HOST network@HOST:PORT micaz" echo " sm16cf,PORT serial@PORT:SPEED mulle" exit 2 fi PPORT=$1 CPORT=$2 PLATFORM=$3 if [ ${PLATFORM} != 'micaz' -a \ ${PLATFORM} != 'telosb' -a \ ${PLATFORM} != 'iris' -a \ ${PLATFORM} != 'mulle' -a \ ${PLATFORM} != 'tinynode' -a \ ${PLATFORM} != 'epic' ] then echo "\"${PLATFORM}\" is not a supported platform" exit 2 fi echo ========================== Compile tosboot for ${PLATFORM} =========================== ( cd $TOSDIR/lib/tosboot ; make ${PLATFORM} ) make clean echo ============================ Compile and load Blink ============================ CFLAGS=-DDELUGE_BASESTATION make ${PLATFORM} install ${PPORT} echo ' +-------------------------------------------------------+' echo ' | |' echo ' | At this point the first led (red) should be blinking. |' echo ' | |' echo ' | Press ENTER to continue... |' echo ' | |' echo ' +-------------------------------------------------------+' read echo ============================= Compile a new Blink ============================== CFLAGS=-DBLINK_REVERSE\ -DDELUGE_BASESTATION make ${PLATFORM} echo =============================== Upload the image =============================== ${TOS_DELUGE} ${CPORT} -i 1 build/${PLATFORM}/tos_image.xml echo ' +----------------------------------------------------------------+' echo ' | |' echo ' | In the next step the following things will take place: |' echo ' | - the mote will be rebooted |' echo ' | - all the leds will blink for some time as the |' echo ' | reprogramming by tosboot takes place. |' echo ' | - a fading of the leds will indicate the exiting from tosboot. |' echo ' | - the mote should start blinking the 3rd led (blue/yellow). |' echo ' | |' echo ' | Press ENTER to continue... |' echo ' | |' echo ' +----------------------------------------------------------------+' read echo =========================== Reboot the base station ============================ ${TOS_DELUGE} ${CPORT} -r 1 tinyos-2.1.2+dfsg/apps/tests/deluge/Blink/burn-net000077500000000000000000000107411207233610700220550ustar00rootroot00000000000000#!/bin/bash TOS_DELUGE=`type -p tos-deluge` if [[ ! -x ${TOS_DELUGE} ]] ; then TOS_DELUGE=../../../../tools/tinyos/misc/tos-deluge fi $TOS_DELUGE > /dev/null if [[ $? != 0 ]] then echo "Unable to locate tos-deluge." exit 2 fi if [ $# -ne 2 ]; then echo "Usage: $0 " echo " micaz, telosb, iris or mulle" echo " how many motes will be used in the test" exit 2 fi PLATFORM=$1 NO_MOTES=$2 if [ ${PLATFORM} != 'micaz' -a \ ${PLATFORM} != 'telosb' -a \ ${PLATFORM} != 'iris' \ ${PLATFORM} != 'iris' -a \ ${PLATFORM} != 'mulle' -a \ ${PLATFORM} != 'epic' ] then echo "\"${PLAFTORM}\" is not a supported platform" exit 2 fi if ! [ -a ${TOSDIR}/lib/tosboot/build/${PLATFORM}/main.ihex ] then echo ========================== Compile tosboot for ${PLATFORM} =========================== ( cd $TOSDIR/lib/tosboot ; make ${PLATFORM} ) fi echo ================================ Compile Blink ================================= make clean ID=0 function burn_one() { ID=`expr $ID + 1` echo -n ">>> Please plug mote $ID and type the programming sorce (bsl,PORT | mib510,PORT | eprb,HOST): " read PORT CFLAGS=$1 make ${PLATFORM} install,$ID ${PORT} } while [[ ${NO_MOTES} > 1 ]] do burn_one -DDELUGE_LIGHT_BASESTATION NO_MOTES=`expr ${NO_MOTES} - 1` done echo ">>> Note: this last mote will be the basestation! <<<" burn_one -DDELUGE_BASESTATION echo -n ">>> Please plug mote $ID and type the communication sorce (serial@PORT:SPEED | network@HOST:PORT) to continue: " read CPORT echo ' +------------------------------------------------------------------------+' echo ' | |' echo ' | At this point the first led (red) of all the motes should be blinking. |' echo ' | |' echo ' | Press ENTER to continue... |' echo ' | |' echo ' +------------------------------------------------------------------------+' read echo ============================= Compile a new Blink ============================== CFLAGS=-DBLINK_REVERSE\ -DDELUGE_LIGHT_BASESTATION make ${PLATFORM} echo ========= Upload the new image to the external flash of the last mote ========== ${TOS_DELUGE} ${CPORT} -i 1 build/${PLATFORM}/tos_image.xml echo ' +-----------------------------------------------------+' echo ' | |' echo ' | In the next step the dissemination will be started. |' echo ' | When a node receives a page, the second led (green) |' echo ' | will blink. |' echo ' | |' echo ' | Press ENTER to continue... |' echo ' | |' echo ' +-----------------------------------------------------+' read echo ============================= Start dissemination ============================== ${TOS_DELUGE} ${CPORT} -dr 1 echo ' +------------------------------------------------------------+' echo ' | |' echo ' | The dissemination is completed when the second and third |' echo ' | led from all the motes except the last one stops blinking. |' echo ' | |' echo ' | After a mote gets the whole image he will reboot and |' echo ' | reprogram itself. If the new image contains Deluge he will |' echo ' | continue participating in dissemination. |' echo ' | |' echo ' | In the next step all the motes except the basestation will |' echo ' | be rebooted to allow the reprogramming to take place. |' echo ' | |' echo ' | After reboot the motes should start blinking the 3rd led |' echo ' | (blue/yellow). |' echo ' | |' echo ' +------------------------------------------------------------+' tinyos-2.1.2+dfsg/apps/tests/deluge/Blink/volumes-at45db.xml000066400000000000000000000003141207233610700236650ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/deluge/Blink/volumes-stm25p.xml000066400000000000000000000003211207233610700237320ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/deluge/GoldenImage/000077500000000000000000000000001207233610700215065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/deluge/GoldenImage/GoldenImageAppC.nc000066400000000000000000000034421207233610700247520ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ configuration GoldenImageAppC {} implementation { components DelugeC; components LedsC; DelugeC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/deluge/GoldenImage/Makefile000066400000000000000000000001471207233610700231500ustar00rootroot00000000000000COMPONENT=GoldenImageAppC BOOTLOADER=tosboot CFLAGS+=-DDELUGE_LIGHT_BASESTATION include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/deluge/GoldenImage/README.txt000066400000000000000000000007361207233610700232120ustar00rootroot00000000000000README for apps/tests/deluge/GoldenImage Author/Contact: Chieh-Jan Mike Liang Razvan Musaloiu-E. Description: This is a sample application for Deluge T2. The application is similar to Null, but it includes Deluge T2. The Makefile includes the DELUGE_LIGHT_BASESTATION flag to allow the nodes to be pinged using tos-deluge. Prerequisites: Python 2.4 with pySerial References: The Deluge T2 wiki page from http://docs.tinyos.net/ tinyos-2.1.2+dfsg/apps/tests/deluge/GoldenImage/volumes-at45db.xml000066400000000000000000000003141207233610700250010ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/deluge/GoldenImage/volumes-stm25p.xml000066400000000000000000000003211207233610700250460ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/deluge/SerialBlink/000077500000000000000000000000001207233610700215325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/deluge/SerialBlink/BlinkAppC.nc000066400000000000000000000050771207233610700236700ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Blink is a basic application that toggles the a mote LED periodically. * It does so by starting a Timer that fires every second. It uses the * OSKI TimerMilli service to achieve this goal. * * @author tinyos-help@millennium.berkeley.edu * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. **/ configuration BlinkAppC { } implementation { components MainC, BlinkC, LedsC, DelugeC; components new TimerMilliC() as Timer0; components new SerialAMSenderC(0); BlinkC -> MainC.Boot; BlinkC.Timer0 -> Timer0; BlinkC.Leds -> LedsC; BlinkC.AMSend -> SerialAMSenderC; } tinyos-2.1.2+dfsg/apps/tests/deluge/SerialBlink/BlinkC.nc000066400000000000000000000055371207233610700232300ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implementation for Blink application. Toggle the red LED when a * Timer fires. * * @author tinyos-help@millennium.berkeley.edu * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. **/ #include "Timer.h" module BlinkC { uses interface Timer as Timer0; uses interface Leds; uses interface Boot; uses interface AMSend; } implementation { message_t byte_msg; event void Boot.booted() { call Timer0.startPeriodic( 1024 ); } event void Timer0.fired() { char *payload = call AMSend.getPayload(&byte_msg, 1); dbg("BlinkC", "Timer 0 fired @ %s.\n", sim_time_string()); #ifndef BLINK_REVERSE call Leds.led0Toggle(); payload[0] = 0; #else call Leds.led2Toggle(); payload[0] = 2; #endif call AMSend.send(AM_BROADCAST_ADDR, &byte_msg, 1); } event void AMSend.sendDone(message_t* msg, error_t error) { }; } tinyos-2.1.2+dfsg/apps/tests/deluge/SerialBlink/Makefile000066400000000000000000000002041207233610700231660ustar00rootroot00000000000000COMPONENT=BlinkAppC BOOTLOADER=tosboot #CFLAGS += -DDELUGE_BASESTATION #CFLAGS += -DDELUGE_LIGHT_BASESTATION include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/deluge/SerialBlink/README.txt000066400000000000000000000027611207233610700232360ustar00rootroot00000000000000README for apps/tests/deluge/SerialBlink Author/Contact: Chieh-Jan Mike Liang Razvan Musaloiu-E. Description: This is a sample application for Deluge T2. The program blinks and sends a serial message every second. On a testbed equipped with a serial back-channel the following test can be run: 1) Compile and burn the program on all the motes on the testbed. The serial messages send by the motes is one-byte value of 0. 2) Compile and burn a base station. This can be done by adding CFLAGS=-DDELUGE_BASESTATION to the make command. For telosb this will look like this: CFLAGS=-DDELUGE_BASESTATION make telosb 3) Compile a different version of SerialBlink by adding CFLAGS=-DBLINK_REVERSE to the make command. For telosb this will look like this: CFLAGS=-DBLINK_REVERSE make telosb 4) Upload the new SerialBlink to the base station. For a telosb connected to /dev/ttyUSB0 this can be accomplish using this command: tos-deluge /dev/ttyUSB0 telosb -i 1 build/telosb/tos_image.xml 5) Give the command to disseminate-and-reboot: tos-deluge /dev/ttyUSB0 telosb -dr 1 As the motes get and reprogram with the new image they will start sending on the serial a one-byte value of 2. For a more detailed discussion on Deluge T2, please refer to the Deluge T2 wiki page. Prerequisites: Python 2.4 with pySerial References: The Deluge T2 wiki page from http://docs.tinyos.net/ tinyos-2.1.2+dfsg/apps/tests/deluge/SerialBlink/volumes-at45db.xml000066400000000000000000000003141207233610700250250ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/deluge/SerialBlink/volumes-stm25p.xml000066400000000000000000000003211207233610700250720ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/mts400/000077500000000000000000000000001207233610700171155ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/mts400/DataMsg.h000066400000000000000000000035131207233610700206100ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #ifndef DATAMSG_H #define DATAMSG_H enum{ AM_DATAMSG=1, }; typedef nx_struct datamsg{ nx_uint16_t AccelX_data; nx_uint16_t AccelY_data; nx_int16_t Intersema_data[2]; nx_uint16_t Temp_data; nx_uint16_t Hum_data; nx_uint16_t VisLight_data; nx_uint16_t InfLight_data; }datamsg_t; #endiftinyos-2.1.2+dfsg/apps/tests/mts400/DataMsg.java000066400000000000000000000410361207233610700213040ustar00rootroot00000000000000/** * This class is automatically generated by mig. DO NOT EDIT THIS FILE. * This class implements a Java interface to the 'DataMsg' * message type. */ public class DataMsg extends net.tinyos.message.Message { /** The default size of this message type in bytes. */ public static final int DEFAULT_MESSAGE_SIZE = 16; /** The Active Message type associated with this message. */ public static final int AM_TYPE = 1; /** Create a new DataMsg of size 16. */ public DataMsg() { super(DEFAULT_MESSAGE_SIZE); amTypeSet(AM_TYPE); } /** Create a new DataMsg of the given data_length. */ public DataMsg(int data_length) { super(data_length); amTypeSet(AM_TYPE); } /** * Create a new DataMsg with the given data_length * and base offset. */ public DataMsg(int data_length, int base_offset) { super(data_length, base_offset); amTypeSet(AM_TYPE); } /** * Create a new DataMsg using the given byte array * as backing store. */ public DataMsg(byte[] data) { super(data); amTypeSet(AM_TYPE); } /** * Create a new DataMsg using the given byte array * as backing store, with the given base offset. */ public DataMsg(byte[] data, int base_offset) { super(data, base_offset); amTypeSet(AM_TYPE); } /** * Create a new DataMsg using the given byte array * as backing store, with the given base offset and data length. */ public DataMsg(byte[] data, int base_offset, int data_length) { super(data, base_offset, data_length); amTypeSet(AM_TYPE); } /** * Create a new DataMsg embedded in the given message * at the given base offset. */ public DataMsg(net.tinyos.message.Message msg, int base_offset) { super(msg, base_offset, DEFAULT_MESSAGE_SIZE); amTypeSet(AM_TYPE); } /** * Create a new DataMsg embedded in the given message * at the given base offset and length. */ public DataMsg(net.tinyos.message.Message msg, int base_offset, int data_length) { super(msg, base_offset, data_length); amTypeSet(AM_TYPE); } /** /* Return a String representation of this message. Includes the * message type name and the non-indexed field values. */ public String toString() { String s = "Message \n"; try { s += " [AccelX_data=0x"+Long.toHexString(get_AccelX_data())+"]\n"; } catch (ArrayIndexOutOfBoundsException aioobe) { /* Skip field */ } try { s += " [AccelY_data=0x"+Long.toHexString(get_AccelY_data())+"]\n"; } catch (ArrayIndexOutOfBoundsException aioobe) { /* Skip field */ } try { s += " [Intersema_data="; for (int i = 0; i < 2; i++) { s += "0x"+Long.toHexString(getElement_Intersema_data(i) & 0xffff)+" "; } s += "]\n"; } catch (ArrayIndexOutOfBoundsException aioobe) { /* Skip field */ } try { s += " [Temp_data=0x"+Long.toHexString(get_Temp_data())+"]\n"; } catch (ArrayIndexOutOfBoundsException aioobe) { /* Skip field */ } try { s += " [Hum_data=0x"+Long.toHexString(get_Hum_data())+"]\n"; } catch (ArrayIndexOutOfBoundsException aioobe) { /* Skip field */ } try { s += " [VisLight_data=0x"+Long.toHexString(get_VisLight_data())+"]\n"; } catch (ArrayIndexOutOfBoundsException aioobe) { /* Skip field */ } try { s += " [InfLight_data=0x"+Long.toHexString(get_InfLight_data())+"]\n"; } catch (ArrayIndexOutOfBoundsException aioobe) { /* Skip field */ } return s; } // Message-type-specific access methods appear below. ///////////////////////////////////////////////////////// // Accessor methods for field: AccelX_data // Field type: int, unsigned // Offset (bits): 0 // Size (bits): 16 ///////////////////////////////////////////////////////// /** * Return whether the field 'AccelX_data' is signed (false). */ public static boolean isSigned_AccelX_data() { return false; } /** * Return whether the field 'AccelX_data' is an array (false). */ public static boolean isArray_AccelX_data() { return false; } /** * Return the offset (in bytes) of the field 'AccelX_data' */ public static int offset_AccelX_data() { return (0 / 8); } /** * Return the offset (in bits) of the field 'AccelX_data' */ public static int offsetBits_AccelX_data() { return 0; } /** * Return the value (as a int) of the field 'AccelX_data' */ public int get_AccelX_data() { return (int)getUIntBEElement(offsetBits_AccelX_data(), 16); } /** * Set the value of the field 'AccelX_data' */ public void set_AccelX_data(int value) { setUIntBEElement(offsetBits_AccelX_data(), 16, value); } /** * Return the size, in bytes, of the field 'AccelX_data' */ public static int size_AccelX_data() { return (16 / 8); } /** * Return the size, in bits, of the field 'AccelX_data' */ public static int sizeBits_AccelX_data() { return 16; } ///////////////////////////////////////////////////////// // Accessor methods for field: AccelY_data // Field type: int, unsigned // Offset (bits): 16 // Size (bits): 16 ///////////////////////////////////////////////////////// /** * Return whether the field 'AccelY_data' is signed (false). */ public static boolean isSigned_AccelY_data() { return false; } /** * Return whether the field 'AccelY_data' is an array (false). */ public static boolean isArray_AccelY_data() { return false; } /** * Return the offset (in bytes) of the field 'AccelY_data' */ public static int offset_AccelY_data() { return (16 / 8); } /** * Return the offset (in bits) of the field 'AccelY_data' */ public static int offsetBits_AccelY_data() { return 16; } /** * Return the value (as a int) of the field 'AccelY_data' */ public int get_AccelY_data() { return (int)getUIntBEElement(offsetBits_AccelY_data(), 16); } /** * Set the value of the field 'AccelY_data' */ public void set_AccelY_data(int value) { setUIntBEElement(offsetBits_AccelY_data(), 16, value); } /** * Return the size, in bytes, of the field 'AccelY_data' */ public static int size_AccelY_data() { return (16 / 8); } /** * Return the size, in bits, of the field 'AccelY_data' */ public static int sizeBits_AccelY_data() { return 16; } ///////////////////////////////////////////////////////// // Accessor methods for field: Intersema_data // Field type: short[], unsigned // Offset (bits): 32 // Size of each element (bits): 16 ///////////////////////////////////////////////////////// /** * Return whether the field 'Intersema_data' is signed (false). */ public static boolean isSigned_Intersema_data() { return false; } /** * Return whether the field 'Intersema_data' is an array (true). */ public static boolean isArray_Intersema_data() { return true; } /** * Return the offset (in bytes) of the field 'Intersema_data' */ public static int offset_Intersema_data(int index1) { int offset = 32; if (index1 < 0 || index1 >= 2) throw new ArrayIndexOutOfBoundsException(); offset += 0 + index1 * 16; return (offset / 8); } /** * Return the offset (in bits) of the field 'Intersema_data' */ public static int offsetBits_Intersema_data(int index1) { int offset = 32; if (index1 < 0 || index1 >= 2) throw new ArrayIndexOutOfBoundsException(); offset += 0 + index1 * 16; return offset; } /** * Return the entire array 'Intersema_data' as a short[] */ public short[] get_Intersema_data() { short[] tmp = new short[2]; for (int index0 = 0; index0 < numElements_Intersema_data(0); index0++) { tmp[index0] = getElement_Intersema_data(index0); } return tmp; } /** * Set the contents of the array 'Intersema_data' from the given short[] */ public void set_Intersema_data(short[] value) { for (int index0 = 0; index0 < value.length; index0++) { setElement_Intersema_data(index0, value[index0]); } } /** * Return an element (as a short) of the array 'Intersema_data' */ public short getElement_Intersema_data(int index1) { return (short)getSIntBEElement(offsetBits_Intersema_data(index1), 16); } /** * Set an element of the array 'Intersema_data' */ public void setElement_Intersema_data(int index1, short value) { setSIntBEElement(offsetBits_Intersema_data(index1), 16, value); } /** * Return the total size, in bytes, of the array 'Intersema_data' */ public static int totalSize_Intersema_data() { return (32 / 8); } /** * Return the total size, in bits, of the array 'Intersema_data' */ public static int totalSizeBits_Intersema_data() { return 32; } /** * Return the size, in bytes, of each element of the array 'Intersema_data' */ public static int elementSize_Intersema_data() { return (16 / 8); } /** * Return the size, in bits, of each element of the array 'Intersema_data' */ public static int elementSizeBits_Intersema_data() { return 16; } /** * Return the number of dimensions in the array 'Intersema_data' */ public static int numDimensions_Intersema_data() { return 1; } /** * Return the number of elements in the array 'Intersema_data' */ public static int numElements_Intersema_data() { return 2; } /** * Return the number of elements in the array 'Intersema_data' * for the given dimension. */ public static int numElements_Intersema_data(int dimension) { int array_dims[] = { 2, }; if (dimension < 0 || dimension >= 1) throw new ArrayIndexOutOfBoundsException(); if (array_dims[dimension] == 0) throw new IllegalArgumentException("Array dimension "+dimension+" has unknown size"); return array_dims[dimension]; } ///////////////////////////////////////////////////////// // Accessor methods for field: Temp_data // Field type: int, unsigned // Offset (bits): 64 // Size (bits): 16 ///////////////////////////////////////////////////////// /** * Return whether the field 'Temp_data' is signed (false). */ public static boolean isSigned_Temp_data() { return false; } /** * Return whether the field 'Temp_data' is an array (false). */ public static boolean isArray_Temp_data() { return false; } /** * Return the offset (in bytes) of the field 'Temp_data' */ public static int offset_Temp_data() { return (64 / 8); } /** * Return the offset (in bits) of the field 'Temp_data' */ public static int offsetBits_Temp_data() { return 64; } /** * Return the value (as a int) of the field 'Temp_data' */ public int get_Temp_data() { return (int)getUIntBEElement(offsetBits_Temp_data(), 16); } /** * Set the value of the field 'Temp_data' */ public void set_Temp_data(int value) { setUIntBEElement(offsetBits_Temp_data(), 16, value); } /** * Return the size, in bytes, of the field 'Temp_data' */ public static int size_Temp_data() { return (16 / 8); } /** * Return the size, in bits, of the field 'Temp_data' */ public static int sizeBits_Temp_data() { return 16; } ///////////////////////////////////////////////////////// // Accessor methods for field: Hum_data // Field type: int, unsigned // Offset (bits): 80 // Size (bits): 16 ///////////////////////////////////////////////////////// /** * Return whether the field 'Hum_data' is signed (false). */ public static boolean isSigned_Hum_data() { return false; } /** * Return whether the field 'Hum_data' is an array (false). */ public static boolean isArray_Hum_data() { return false; } /** * Return the offset (in bytes) of the field 'Hum_data' */ public static int offset_Hum_data() { return (80 / 8); } /** * Return the offset (in bits) of the field 'Hum_data' */ public static int offsetBits_Hum_data() { return 80; } /** * Return the value (as a int) of the field 'Hum_data' */ public int get_Hum_data() { return (int)getUIntBEElement(offsetBits_Hum_data(), 16); } /** * Set the value of the field 'Hum_data' */ public void set_Hum_data(int value) { setUIntBEElement(offsetBits_Hum_data(), 16, value); } /** * Return the size, in bytes, of the field 'Hum_data' */ public static int size_Hum_data() { return (16 / 8); } /** * Return the size, in bits, of the field 'Hum_data' */ public static int sizeBits_Hum_data() { return 16; } ///////////////////////////////////////////////////////// // Accessor methods for field: VisLight_data // Field type: int, unsigned // Offset (bits): 96 // Size (bits): 16 ///////////////////////////////////////////////////////// /** * Return whether the field 'VisLight_data' is signed (false). */ public static boolean isSigned_VisLight_data() { return false; } /** * Return whether the field 'VisLight_data' is an array (false). */ public static boolean isArray_VisLight_data() { return false; } /** * Return the offset (in bytes) of the field 'VisLight_data' */ public static int offset_VisLight_data() { return (96 / 8); } /** * Return the offset (in bits) of the field 'VisLight_data' */ public static int offsetBits_VisLight_data() { return 96; } /** * Return the value (as a int) of the field 'VisLight_data' */ public int get_VisLight_data() { return (int)getUIntBEElement(offsetBits_VisLight_data(), 16); } /** * Set the value of the field 'VisLight_data' */ public void set_VisLight_data(int value) { setUIntBEElement(offsetBits_VisLight_data(), 16, value); } /** * Return the size, in bytes, of the field 'VisLight_data' */ public static int size_VisLight_data() { return (16 / 8); } /** * Return the size, in bits, of the field 'VisLight_data' */ public static int sizeBits_VisLight_data() { return 16; } ///////////////////////////////////////////////////////// // Accessor methods for field: InfLight_data // Field type: int, unsigned // Offset (bits): 112 // Size (bits): 16 ///////////////////////////////////////////////////////// /** * Return whether the field 'InfLight_data' is signed (false). */ public static boolean isSigned_InfLight_data() { return false; } /** * Return whether the field 'InfLight_data' is an array (false). */ public static boolean isArray_InfLight_data() { return false; } /** * Return the offset (in bytes) of the field 'InfLight_data' */ public static int offset_InfLight_data() { return (112 / 8); } /** * Return the offset (in bits) of the field 'InfLight_data' */ public static int offsetBits_InfLight_data() { return 112; } /** * Return the value (as a int) of the field 'InfLight_data' */ public int get_InfLight_data() { return (int)getUIntBEElement(offsetBits_InfLight_data(), 16); } /** * Set the value of the field 'InfLight_data' */ public void set_InfLight_data(int value) { setUIntBEElement(offsetBits_InfLight_data(), 16, value); } /** * Return the size, in bytes, of the field 'InfLight_data' */ public static int size_InfLight_data() { return (16 / 8); } /** * Return the size, in bits, of the field 'InfLight_data' */ public static int sizeBits_InfLight_data() { return 16; } } tinyos-2.1.2+dfsg/apps/tests/mts400/Makefile000066400000000000000000000005131207233610700205540ustar00rootroot00000000000000COMPONENT=Mts400TesterC SENSORBOARD=mts400 BUILD_EXTRA_DEPS = DataMsg.java Mts400Tester.class CLEAN_EXTRA = $(BULID_EXTRA_DEPS) *.class DataMsg.java: DataMsg.h mig -target=null -java-classname=DataMsg java DataMsg.h datamsg -o $@ Mts400Tester.class: Mts400Tester.java DataMsg.java javac Mts400Tester.java include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/mts400/Mts400Tester.java000066400000000000000000000077651207233610700221550ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ import static java.lang.System.out; import net.tinyos.message.*; import net.tinyos.util.*; import net.tinyos.packet.*; class Mts400Tester implements MessageListener{ private PhoenixSource phoenix; private MoteIF mif; public Mts400Tester(final String source){ phoenix=BuildSource.makePhoenix(source, PrintStreamMessenger.err); mif = new MoteIF(phoenix); mif.registerListener(new DataMsg(),this); } public void messageReceived(int dest_addr,Message msg){ if(msg instanceof DataMsg){ DataMsg results = (DataMsg)msg; int[] taosCalcData = null; double[] sensirionCalcData=null; out.println("The measured results are "); out.println(); out.println("Accelerometer X axis: "+results.get_AccelX_data()); out.println("Accelerometer Y axis: "+results.get_AccelY_data()); out.println("Intersema temperature: "+results.getElement_Intersema_data(0)); out.println("Intersema pressure: "+results.getElement_Intersema_data(1)); sensirionCalcData=calculateSensirion(results.get_Temp_data(),results.get_Hum_data()); out.printf("Sensirion temperature: %.2f\n",sensirionCalcData[0]); out.printf("Sensirion humidity: %.2f\n",sensirionCalcData[1]); taosCalcData=calculateTaos(results.get_VisLight_data(),results.get_InfLight_data()); out.println("Taos visible light: "+taosCalcData[0]); out.println("Taos infrared light: "+taosCalcData[1]); } } private int[] calculateTaos(int VisibleLight,int InfraredLight){ final int CHORD_VAL[]={0,16,49,115,247,511,1039,2095}; final int STEP_VAL[]={1,2,4,8,16,32,64,128}; int chordVal,stepVal; int[] lightVal=new int[2]; chordVal=(VisibleLight>>4) & 7; stepVal=VisibleLight & 15; lightVal[0]=CHORD_VAL [chordVal]+stepVal*STEP_VAL[chordVal]; chordVal=(InfraredLight>>4)&7; stepVal=VisibleLight & 15; lightVal[1]=CHORD_VAL[chordVal]+stepVal*STEP_VAL[chordVal]; return lightVal; } private double[] calculateSensirion(int Temperature,int Humidity){ double [] converted = new double[2]; converted[0]=-39.4+(0.01*(double)Temperature); converted[1]=(-2.0468+0.0367*(double)Humidity-0.0000015955*Math.pow((double)Humidity,(double )2))+(converted[0]-25)*(0.01+0.00008*(double)Humidity); return converted; } public static void main (String[] args) { if ( args.length == 2 && args[0].equals("-comm") ) { Mts400Tester hy = new Mts400Tester(args[1]); } else { System.err.println("usage: java Mts400Tester [-comm ]"); System.exit(1); } } }tinyos-2.1.2+dfsg/apps/tests/mts400/Mts400TesterC.nc000066400000000000000000000044071207233610700217250ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #include "DataMsg.h" configuration Mts400TesterC { } implementation { components MainC; components LedsC; components new Accel202C(); components new Intersema5534C(); components new SensirionSht11C(); components new Taos2550C(); components ActiveMessageC; components new AMSenderC(AM_DATAMSG); components Mts400TesterP as App; App.Boot -> MainC; App.Leds -> LedsC; App.AMSend -> AMSenderC; App.SplitControl -> ActiveMessageC; App.X_Axis -> Accel202C.X_Axis; App.Y_Axis -> Accel202C.Y_Axis; App.Intersema -> Intersema5534C.Intersema; App.Temperature -> SensirionSht11C.Temperature; App.Humidity -> SensirionSht11C.Humidity; App.VisibleLight -> Taos2550C.VisibleLight; App.InfraredLight -> Taos2550C.InfraredLight; } tinyos-2.1.2+dfsg/apps/tests/mts400/Mts400TesterP.nc000066400000000000000000000073051207233610700217420ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #include "DataMsg.h" module Mts400TesterP { uses interface Boot; uses interface Leds; uses interface SplitControl; uses interface Read as X_Axis; uses interface Read as Y_Axis; uses interface Intersema; uses interface Read as Temperature; uses interface Read as Humidity; uses interface Read as VisibleLight; uses interface Read as InfraredLight; uses interface AMSend; } implementation { uint16_t AccelX_data,AccelY_data,Temp_data,Hum_data,VisLight_data; int16_t Intersema_data[2]; event void Boot.booted() { call SplitControl.start(); } event void SplitControl.startDone(error_t err){ if(err==SUCCESS){ call X_Axis.read(); call Leds.led0On(); }else{ call SplitControl.start(); } } event void X_Axis.readDone(error_t err, uint16_t data){ AccelX_data=data; call Y_Axis.read(); } event void Y_Axis.readDone(error_t err, uint16_t data){ AccelY_data=data; call Intersema.read(); } event void Intersema.readDone(error_t err, int16_t* data){ Intersema_data[0]=data[0]; Intersema_data[1]=data[1]; call Temperature.read(); } event void Temperature.readDone(error_t err, uint16_t data){ Temp_data=data; call Humidity.read(); } event void Humidity.readDone(error_t err, uint16_t data){ Hum_data=data; call VisibleLight.read(); } event void VisibleLight.readDone(error_t err, uint8_t data){ VisLight_data=data; call InfraredLight.read(); } message_t message; event void InfraredLight.readDone(error_t err, uint8_t data){ datamsg_t* packet = (datamsg_t*)(call AMSend.getPayload(&message, sizeof(datamsg_t))); packet-> AccelX_data=AccelX_data; packet-> AccelY_data = AccelY_data; packet-> Intersema_data[0] = Intersema_data[0]; packet-> Intersema_data[1] = Intersema_data[1]; packet-> Temp_data =Temp_data; packet-> Hum_data = Hum_data; packet-> VisLight_data = VisLight_data; packet-> InfLight_data = data; call AMSend.send(AM_BROADCAST_ADDR, &message, sizeof(datamsg_t)); } event void AMSend.sendDone(message_t* bufPtr, error_t error){ call X_Axis.read(); call Leds.led1Toggle(); } event void SplitControl.stopDone(error_t err){} } tinyos-2.1.2+dfsg/apps/tests/mts400/README.txt000066400000000000000000000046501207233610700206200ustar00rootroot00000000000000README for Mts400Tester Author/Contact: Zoltn Kincses, kincsesz@inf.u-szeged.hu Description: This is a demo application for the mts400 sensor board. This board contains a 2-Axis accelerometer (Analog Devices ADXL202JE), a barometric pressure and temperature sensor (Intersema MS5534), a humidity and temperature sensor (Sensirion SHT11), and a light sensor (Taos TSL2550). You can find detailed description about the board at the http://courses.ece.ubc.ca/494/files/MTS-MDA_Series_Users_Manual_7430-0020-04_B.pdf website. In this application, the Accel202C sensor is sampled first in the X and then in the Y direction. In the next step, the Intersema5534C sensor is sampled, and the read values are stored in an array. The first element is the temperature and the second is the pressure. After this, the SensirionSht11C sensor is sampled, where the raw temperature and then humidity data is read. Finally, the Taos255C sensor is sampled, where the raw visible and then infrared light data is read. The read values are sent to the basestation, and the sampling process starts again. The raw data read from the SensirionSht11C and Taos2550C sensors have to be converted, according to the datasheets of the sensors. The required conversions are done in the example java code. To compile the application, two include directories are required, which can be found in the Makefile of the application. The output normally looks like the following: Accelerometer X axis: the measured value (in g) Accelerometer Y axis: the measured value (in g) Intersema temperature: the measured value (in degree centigrade) Intersema pressure: the measured value (in mbar) Sensirion temperature: the converted value (in degree centigrade) Sensirion humidity: the converted value (in %RH) Taos visible light: the converted value (in Lux) Taos infrared light: the converted value (in Lux) The displayed Intersema temperature and pressure values always contain one decimal digit. For example, if the measured temperature value is 262, it means that the temperature is 26.2 degree centigrade. Similarly if the measured pressure value is 9922, it means the pressure is 992.2 mbar. During the operation of the application, the led0 indicates that the mote is on, and the led1 indicates the mote sent the measured data to the basestation. Tools: The Mts400Tester.java is the example java code. Known bugs/limitations: None. $Id: README.txt,v 1.1 2010-06-21 22:56:11 mmaroti Exp $ tinyos-2.1.2+dfsg/apps/tests/rfxlink/000077500000000000000000000000001207233610700175435ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/rfxlink/RadioSniffer/000077500000000000000000000000001207233610700221165ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/rfxlink/RadioSniffer/Makefile000066400000000000000000000003351207233610700235570ustar00rootroot00000000000000COMPONENT=RadioSnifferC CFLAGS += -I$(TOSDIR)/lib/diagmsg CFLAGS += -DTASKLET_IS_TASK CFLAGS += -DDIAGMSG_RECORDED_MSGS=60 CFLAGS += -DRADIO_DEBUG -DRADIO_DEBUG_MESSAGES CFLAGS += -DRF230_RSSI_ENERGY include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/rfxlink/RadioSniffer/RadioSnifferC.nc000066400000000000000000000073001207233610700251160ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ configuration RadioSnifferC { } implementation { #define UQ_METADATA_FLAGS "UQ_METADATA_FLAGS" #define UQ_RADIO_ALARM "UQ_RADIO_ALARM" components RadioSnifferP, MainC, SerialActiveMessageC, AssertC; RadioSnifferP.Boot -> MainC; RadioSnifferP.SplitControl -> SerialActiveMessageC; RadioSnifferP.RadioState -> RadioDriverLayerC; // just to avoid a timer compilation bug components new TimerMilliC(); // -------- ActiveMessage components new Ieee154PacketLayerC(); Ieee154PacketLayerC.SubPacket -> TimeStampingLayerC; // -------- TimeStamping components new TimeStampingLayerC(); TimeStampingLayerC.LocalTimeRadio -> RadioDriverLayerC; TimeStampingLayerC.SubPacket -> MetadataFlagsLayerC; TimeStampingLayerC.TimeStampFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; // -------- MetadataFlags components new MetadataFlagsLayerC(); MetadataFlagsLayerC.SubPacket -> RadioDriverLayerC; // -------- RadioAlarm components new RadioAlarmC(); RadioAlarmC.Alarm -> RadioDriverLayerC; // -------- RadioDriver #if defined(PLATFORM_IRIS) || defined(PLATFORM_MULLE) || defined(PLATFORM_MESHBEAN) components RF230DriverLayerC as RadioDriverLayerC; components RF230RadioP as RadioP; #elif defined(PLATFORM_MESHBEAN900) components RF212DriverLayerC as RadioDriverLayerC; components RF212RadioP as RadioP; #elif defined(PLATFORM_MICAZ) || defined(PLATFORM_TELOSA) || defined(PLATFORM_TELOSB) components CC2420XDriverLayerC as RadioDriverLayerC; components CC2420XRadioP as RadioP; #elif defined(PLATFORM_UCMINI) components RFA1DriverLayerC as RadioDriverLayerC; components RFA1RadioP as RadioP; #endif RadioDriverLayerC.PacketTimeStamp -> TimeStampingLayerC; RadioDriverLayerC.Config -> RadioP; RadioP.Ieee154PacketLayer -> Ieee154PacketLayerC; RadioDriverLayerC.TransmitPowerFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.RSSIFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.TimeSyncFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; } tinyos-2.1.2+dfsg/apps/tests/rfxlink/RadioSniffer/RadioSnifferP.nc000066400000000000000000000042021207233610700251310ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include module RadioSnifferP { uses { interface Boot; interface SplitControl; interface RadioState; } } implementation { task void serialPowerUp() { if( call SplitControl.start() != SUCCESS ) post serialPowerUp(); } event void SplitControl.startDone(error_t error) { if( error != SUCCESS ) post serialPowerUp(); else call RadioState.turnOn(); } event void SplitControl.stopDone(error_t error) { } event void Boot.booted() { post serialPowerUp(); } tasklet_async event void RadioState.done() { } } tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestPacketTimeSync/000077500000000000000000000000001207233610700232665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestPacketTimeSync/Makefile000066400000000000000000000013371207233610700247320ustar00rootroot00000000000000COMPONENT=TestPacketTimeSyncAppC PFLAGS+=-DTIMESYNC_TMICRO PFLAGS+=-DTASKLET_IS_TASK #PFLAGS+=-DRADIO_DEBUG -DRADIO_DEBUG_MESSAGES BUILD_EXTRA_DEPS = PingMsg.class PongMsg.class TestPacketTimeSync.class CLEAN_EXTRA = *.class PongMsg.java PingMsg.java PingMsg.class: PingMsg.java javac PingMsg.java PongMsg.class: PongMsg.java javac PongMsg.java PingMsg.java: TestPacketTimeSync.h mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=PingMsg TestPacketTimeSync.h real_ping_msg -o $@ PongMsg.java: TestPacketTimeSync.h mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=PongMsg TestPacketTimeSync.h pong_msg -o $@ TestPacketTimeSync.class: PongMsg.class PingMsg.class javac TestPacketTimeSync.java include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestPacketTimeSync/NoSleepC.nc000066400000000000000000000023211207233610700252560ustar00rootroot00000000000000/* * Copyright (c) 2002-2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ configuration NoSleepC { } implementation { components McuSleepC, NoSleepP; McuSleepC.McuPowerOverride -> NoSleepP; }tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestPacketTimeSync/NoSleepP.nc000066400000000000000000000032161207233610700252770ustar00rootroot00000000000000/* * Copyright (c) 2002-2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ module NoSleepP { provides interface McuPowerOverride; } implementation { async command mcu_power_t McuPowerOverride.lowestState() { #if defined(PLATFORM_TELOS) || defined(PLATFORM_TELOSA) || defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) return MSP430_POWER_ACTIVE; #elif defined(PLATFORM_MICA2) || defined(PLATFORM_MICAZ) || defined(PLATFORM_XSM) || defined(PLATFORM_IRIS) || defined(PLATFORM_ZIGBIT) return ATM128_POWER_IDLE; #else #warning Assuming 0 is the IDLE power state that prevents MCU from sleep return 0; #endif } }tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestPacketTimeSync/Ping.java000066400000000000000000000061121207233610700250260ustar00rootroot00000000000000import java.util.*; import java.io.*; public class Ping { int pinger; long ping_counter; short ping_tx_timestamp_is_valid; long ping_tx_timestamp; long ping_event_time; PingMsg pingMsg; Set pongs = new TreeSet(); public Ping(PingMsg m) { setPingMsg(m); } public Ping(int pinger, long ping_counter) { this.pinger = pinger; this.ping_counter = ping_counter; } public int get_pinger() { if(pingMsg == null) return pinger; else return pingMsg.get_pinger(); } public long get_ping_counter() { if(pingMsg == null) return ping_counter; else return pingMsg.get_ping_counter(); } public long get_ping_event_time() { if(pingMsg == null) return ping_event_time; else return pingMsg.get_ping_event_time(); } public void set_ping_event_time(long l) { ping_event_time = l; } public short get_ping_tx_timestamp_is_valid() { return ping_tx_timestamp_is_valid; } public void set_ping_tx_timestamp_is_valid(short s) { ping_tx_timestamp_is_valid = s; } public long get_ping_tx_timestamp() { return ping_tx_timestamp; } public void set_ping_tx_timestamp(long l) { ping_tx_timestamp = l; } public void setPingMsg(PingMsg m) { this.pingMsg = m; } public PingMsg getPingMsg() { return this.pingMsg; } public void addPong(Pong p) { pongs.add(p); } public void printHeader(PrintStream out) { out.print("#pinger\t"); out.print("counter\t"); out.print("Te_tx\t"); out.print("Ttx_vld\t"); out.print("Ttx\t"); out.print("ponger\t"); out.print("Trx_vld\t"); out.print("Te_vld\t"); out.print("Trx\t"); out.print("Te_rx\t"); out.print("Trx-Ttx\t"); out.print("Te_rx-Te_tx\n"); } public void print(PrintStream out) { Iterator it = pongs.iterator(); while(it.hasNext()) { printHeader(out); Pong pong = (Pong)it.next(); out.print(get_pinger()+"\t"); out.print(get_ping_counter()+"\t"); out.print(get_ping_event_time()+"\t"); out.print(get_ping_tx_timestamp_is_valid()+"\t"); out.print(get_ping_tx_timestamp()+"\t"); out.print(pong.getPongMsg().get_ponger()+"\t"); out.print(pong.getPongMsg().get_ping_rx_timestamp_is_valid()+"\t"); out.print(pong.getPongMsg().get_ping_event_time_is_valid()+"\t"); out.print(pong.getPongMsg().get_ping_rx_timestamp()+"\t"); out.print(pong.getPongMsg().get_ping_event_time()+"\t"); long tTxOffset = pong.getPongMsg().get_ping_rx_timestamp()-get_ping_tx_timestamp(); // for 16-bit timestamping //if(tTxOffset<0) tTxOffset+=Math.pow(2,16); // for 32-bit timestamping if(tTxOffset<0) tTxOffset+=Math.pow(2,32); out.print(tTxOffset+"\t"); long tEvtOffset = pong.getPongMsg().get_ping_event_time()-get_ping_event_time(); // for 16-bit timestamping //if(tEvtOffset<0) tEvtOffset+=Math.pow(2,16); // for 32-bit timestamping if(tEvtOffset<0) tEvtOffset+=Math.pow(2,32); out.print(tEvtOffset+"\n"); } out.print("\n"); } } tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestPacketTimeSync/Pong.java000066400000000000000000000007361207233610700250420ustar00rootroot00000000000000public class Pong implements Comparable { PongMsg pongMsg; public Pong(PongMsg m) { setPongMsg(m); } public void setPongMsg(PongMsg m) { this.pongMsg = m; } public PongMsg getPongMsg() { return this.pongMsg; } public int compareTo(Object o) { if(o instanceof Pong) { Pong p = (Pong)o; return new Integer(this.getPongMsg().get_ponger()).compareTo(new Integer(p.getPongMsg().get_ponger())); } else { return 0; } } } tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestPacketTimeSync/README.txt000066400000000000000000000074151207233610700247730ustar00rootroot00000000000000TestPacketTimeSync Description: The TestPacketTimeSync application is used to test/benchmark the packet-level time synchronization capability (as described in TEP133) of the radio stack. Usage: The test setup consists of a pinger node (programmed with node id 1), one or more ponger nodes, and a base station. The test application operates as follows: The pinger node periodically sends out ping messages using the TimeSyncAMSend interface. All ping messages have event times attached: these are timestamps taken short before the message was sent. Also, a ping message contains the transmission timestamp of the preceding ping message. Ponger nodes respond to the ping messages by sending pong messages, which contain the received event time and the reception timestamp of the ping message. The java application TestPacketTimeSync is used to collects all this information on the PC. 1. Build the TestPacketTimeSync application (e.g. make telosb cc2420x) 2. Install pinger node with node id 1 (e.g. make telosb reinstall,1 bsl,10) 3. Install ponger node(s) (with node id other than 1) 4. Set up a node as base station (use ../BaseStation) 5. Start the java application (change the communications port to match local setup): java TestPacketTimeSync -comm serial@telosb:com15 In order to store the data in a log file, redirect the output to a file: e.g. java TestPacketTimeSync -comm serial@telosb:com15 > tep133.log To load the data in excel, preprocess it first with grep: cat tep133.log | grep -v pinger | grep -v "^$" > tep133_log_for_excel.txt The recorded data (after sorting) will look as follows: #pinger counter Te_tx Ttx_vld Ttx ponger Trx_vld Te_vld Trx Te_rx Trx-Ttx Te_rx-Te_tx 1 1 855200 1 860421 2 1 1 20632897 20627676 19772476 19772476 1 2 1117344 1 1119109 2 1 1 20891589 20889824 19772480 19772480 1 3 1379520 1 1384005 2 1 1 21156488 21152003 19772483 19772483 1 4 1641664 1 1649253 2 1 1 21421754 21414165 19772501 19772501 1 5 1903808 1 1913797 2 1 1 21686285 21676296 19772488 19772488 1 6 2165920 1 2174149 2 1 1 21946630 21938401 19772481 19772481 1 7 2428096 1 2437061 2 1 1 22209575 22200610 19772514 19772514 1 8 2690240 1 2696773 2 1 1 22469271 22462738 19772498 19772498 1 9 2952352 1 2958117 2 1 1 22730612 22724847 19772495 19772495 1 10 3214496 1 3218053 2 1 1 22990568 22987011 19772515 19772515 1 11 3476640 1 3480645 2 1 1 23253145 23249140 19772500 19772500 1 12 3738784 1 3741253 2 1 1 23513760 23511291 19772507 19772507 1 13 4000960 1 4011877 2 1 1 23784386 23773469 19772509 19772509 1 14 4263104 1 4271877 2 1 1 24044393 24035620 19772516 19772516 1 15 4525248 1 4530309 2 1 1 24302792 24297731 19772483 19772483 Ideally, Trx-Ttx values (the clock offset between the transmitter and the receiver) should be constant for the same ponger node (with some clock drift). Also, the difference between the pinger's and a given ponger's event times (Te_rx-Te_tx) should be constant over (with some clock drift). tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestPacketTimeSync/TestPacketTimeSync.h000066400000000000000000000040111207233610700271560ustar00rootroot00000000000000/* * Copyright (c) 2002-2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #ifndef TEST_PACKET_TIMESYNC_H #define TEST_PACKET_TIMESYNC_H typedef nx_struct ping_msg { nx_uint16_t pinger; nx_uint32_t ping_counter; nx_uint32_t ping_event_time; nx_uint32_t prev_ping_counter; nx_uint8_t prev_ping_tx_timestamp_is_valid; nx_uint32_t prev_ping_tx_timestamp; } ping_msg_t; typedef nx_struct real_ping_msg { nx_uint16_t pinger; nx_uint32_t ping_counter; nx_uint32_t ping_event_time; nx_uint32_t prev_ping_counter; nx_uint8_t prev_ping_tx_timestamp_is_valid; nx_uint32_t prev_ping_tx_timestamp; nx_uint32_t am_id; // am-over-am am id } real_ping_msg_t; typedef nx_struct pong_msg { nx_uint16_t ponger; nx_uint16_t pinger; nx_uint32_t ping_counter; nx_uint32_t ping_event_time; nx_uint8_t ping_rx_timestamp_is_valid; nx_uint8_t ping_event_time_is_valid; nx_uint32_t ping_rx_timestamp; } pong_msg_t; enum { AM_PING_MSG = 16, AM_REAL_PING_MSG = 0x3d, // packettimesync am id AM_PONG_MSG = 17, }; #endif tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestPacketTimeSync/TestPacketTimeSync.java000066400000000000000000000077041207233610700276640ustar00rootroot00000000000000/* * Copyright (c) 2002-2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ import java.util.*; import net.tinyos.message.*; import net.tinyos.packet.*; import net.tinyos.util.*; public class TestPacketTimeSync implements net.tinyos.message.MessageListener { private MoteIF moteIF; private Map pingMap = new HashMap(); public TestPacketTimeSync(String source) throws Exception { if (source != null) { moteIF = new MoteIF(BuildSource.makePhoenix(source, PrintStreamMessenger.err)); } else { moteIF = new MoteIF(BuildSource.makePhoenix(PrintStreamMessenger.err)); } } public void start() { } public void messageReceived(int to, Message message) { long t = System.currentTimeMillis(); System.err.println("INFO: received message type = "+message.amType()+ " length=" + message.dataLength()); if(message instanceof PongMsg) { PongMsg pongMsg = (PongMsg)message; if(pongMsg.get_ping_counter()==0) return; String key= "_"+pongMsg.get_pinger()+"_"+pongMsg.get_ping_counter(); Ping ping = (Ping)pingMap.get(key); if (ping!=null) { ping.addPong(new Pong(pongMsg)); } else { System.err.println("ERROR: cannot find ping msg with counter value "+pongMsg.get_ping_counter()); } } if(message instanceof PingMsg) { PingMsg pingMsg = (PingMsg)message; if(pingMsg.get_ping_counter()==0) return; String key= "_"+pingMsg.get_pinger()+"_"+pingMsg.get_ping_counter(); Ping ping = (Ping)pingMap.get(key); if (ping==null) { ping = new Ping(pingMsg); pingMap.put(key,ping); String prevKey= "_"+pingMsg.get_pinger()+"_"+pingMsg.get_prev_ping_counter(); Ping prevPing = (Ping)pingMap.get(prevKey); if(prevPing==null) { System.err.println("ERROR: cannot find previous ping msg with counter value "+pingMsg.get_prev_ping_counter()); } else { prevPing.set_ping_tx_timestamp_is_valid(pingMsg.get_prev_ping_tx_timestamp_is_valid()); prevPing.set_ping_tx_timestamp(pingMsg.get_prev_ping_tx_timestamp()); prevPing.print(System.out); pingMap.remove(prevPing); } } else { System.err.println("ERROR: received duplicate ping msg "+pingMsg.get_ping_counter()); } } } private static void usage() { System.err.println("usage: TestPacketTimeSync [-comm ]"); } private void addMsgType(Message msg) { moteIF.registerListener(msg, this); } public static void main(String[] args) throws Exception { String source = null; if (args.length > 0) { for (int i = 0; i < args.length; i++) { if (args[i].equals("-comm")) { source = args[++i]; } } } else if (args.length != 0) { usage(); System.exit(1); } TestPacketTimeSync me = new TestPacketTimeSync(source); me.moteIF.registerListener(new PingMsg(),me); me.moteIF.registerListener(new PongMsg(),me); me.start(); } } tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestPacketTimeSync/TestPacketTimeSyncAppC.nc000066400000000000000000000035161207233610700301040ustar00rootroot00000000000000/* * Copyright (c) 2002-2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include "TestPacketTimeSync.h" configuration TestPacketTimeSyncAppC {} implementation { components MainC, TestPacketTimeSyncC as App, LedsC; components ActiveMessageC; components TimeSyncMessageC; components new TimerMilliC(); components LocalTimeMicroC; components NoSleepC; App.Boot -> MainC.Boot; App.PingReceive -> TimeSyncMessageC.Receive[AM_PING_MSG]; App.PingAMSend -> TimeSyncMessageC.TimeSyncAMSendRadio[AM_PING_MSG]; App.PongAMSend -> ActiveMessageC.AMSend[AM_PONG_MSG]; App.AMControl -> ActiveMessageC; App.Leds -> LedsC; App.MilliTimer -> TimerMilliC; App.Packet -> ActiveMessageC; App.AMPacket -> ActiveMessageC; App.PacketTimeStamp -> ActiveMessageC; App.TimeSyncPacket -> TimeSyncMessageC; App.LocalTime -> LocalTimeMicroC; } tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestPacketTimeSync/TestPacketTimeSyncC.nc000066400000000000000000000131321207233610700274360ustar00rootroot00000000000000/* * Copyright (c) 2002-2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include "Timer.h" #include "TestPacketTimeSync.h" module TestPacketTimeSyncC { uses { interface Leds; interface Boot; interface Receive as PingReceive; interface AMSend as PongAMSend; interface AMPacket; interface Timer as MilliTimer; interface SplitControl as AMControl; interface Packet; #if defined(TIMESYNC_T32KHZ) interface PacketTimeStamp; interface TimeSyncPacket; interface TimeSyncAMSend as PingAMSend; interface LocalTime; #elif defined(TIMESYNC_TMICRO) interface PacketTimeStamp; interface TimeSyncPacket; interface TimeSyncAMSend as PingAMSend; interface LocalTime; #else interface PacketTimeStamp; interface TimeSyncPacket; interface TimeSyncAMSend as PingAMSend; interface LocalTime; #endif } } implementation { message_t ping_packet; message_t pong_packet; bool locked; uint32_t counter = 0; event void Boot.booted() { memset(&ping_packet, 0, sizeof(ping_packet)); memset(&pong_packet, 0, sizeof(pong_packet)); call AMControl.start(); } task void nullTask() { // just to prevent the MCU from sleeping post nullTask(); } event void AMControl.startDone(error_t err) { if (err == SUCCESS) { if(call AMPacket.address() == 1) { call MilliTimer.startPeriodic(1024/4); } #if defined(PINGER) else { call MilliTimer.startPeriodic(1024/4); } #endif #if !defined(TOSSIM) post nullTask(); #endif } else { call AMControl.start(); } } event void AMControl.stopDone(error_t err) { // do nothing } event void MilliTimer.fired() { call Leds.led1Toggle(); if (locked) { return; } else { ping_msg_t* ping = (ping_msg_t*)call Packet.getPayload(&ping_packet, sizeof(ping_msg_t)); uint32_t eventTime = call LocalTime.get(); if (ping == NULL) { return; } ping->pinger = TOS_NODE_ID; ping->ping_counter = counter++; ping->ping_event_time = eventTime; if (call PingAMSend.send(AM_BROADCAST_ADDR, &ping_packet, sizeof(ping_msg_t), eventTime) == SUCCESS) { dbg("TestPacketTimeSync", "%d: TestPacketTimeSync: Sending ping #%d with event time %d\n", call LocalTime.get(), ping->ping_counter, eventTime); call Leds.led0On(); locked = TRUE; } } } event message_t* PingReceive.receive(message_t* bufPtr, void* payload, uint8_t len) { call Leds.led2Toggle(); dbg("TestPacketTimeSync", "%d: TestPacketTimeSync: Received ping of size %d (%d expected)\n", call LocalTime.get(), len, sizeof(ping_msg_t)+4); if (locked /*|| len != sizeof(ping_msg_t)*/) { return bufPtr; } else { ping_msg_t* ping = (ping_msg_t*)payload; pong_msg_t* pong = (pong_msg_t*)call Packet.getPayload(&pong_packet, sizeof(pong_msg_t)); pong->ponger = TOS_NODE_ID; pong->pinger = ping->pinger; pong->ping_counter = ping->ping_counter; pong->ping_event_time = call TimeSyncPacket.eventTime(bufPtr); pong->ping_rx_timestamp_is_valid = call PacketTimeStamp.isValid(bufPtr); pong->ping_event_time_is_valid = call TimeSyncPacket.isValid(bufPtr); if(pong->ping_rx_timestamp_is_valid > 0) pong->ping_rx_timestamp_is_valid = 1; pong->ping_rx_timestamp = call PacketTimeStamp.timestamp(bufPtr); dbg("TestPacketTimeSync", "%d: TestPacketTimeSync: Received ping #%d with event time %d\n", call LocalTime.get(), ping->ping_counter, pong->ping_event_time); if (call PongAMSend.send(AM_BROADCAST_ADDR, &pong_packet, sizeof(pong_msg_t)) == SUCCESS) { call Leds.led0On(); locked = TRUE; } return bufPtr; } } event void PingAMSend.sendDone(message_t* bufPtr, error_t error) { if (&ping_packet == bufPtr) { ping_msg_t* ping = (ping_msg_t*)call Packet.getPayload(&ping_packet, sizeof(ping_msg_t)); ping->prev_ping_counter = ping->ping_counter; ping->prev_ping_tx_timestamp_is_valid = call PacketTimeStamp.isValid(bufPtr); if(ping->prev_ping_tx_timestamp_is_valid > 0) ping->prev_ping_tx_timestamp_is_valid = 1; ping->prev_ping_tx_timestamp = call PacketTimeStamp.timestamp(bufPtr); call Leds.led0Off(); locked = FALSE; } } event void PongAMSend.sendDone(message_t* bufPtr, error_t error) { if (&pong_packet == bufPtr) { call Leds.led0Off(); locked = FALSE; } } } tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTimeStamping/000077500000000000000000000000001207233610700230045ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTimeStamping/Analize.java000066400000000000000000000156401207233610700252400ustar00rootroot00000000000000/** Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ import net.tinyos.message.*; import net.tinyos.packet.*; import net.tinyos.util.*; import java.util.*; public class Analize implements MessageListener { static final int NUMBER_OF_MOTES = TestMsg.numElements_history_times(0); static final int HISTORY_SIZE = TestMsg.numElements_history_times(1); int maxSamples = 100; int samples = 0; public static void main(String[] args) { Analize analize = new Analize(); String comm = null; for(int i = 0; i < args.length; ++i) { if( args[i].equals("-comm") && i < args.length-1 ) comm = args[++i]; else if( args[i].equals("-samples") && i < args.length-1 ) analize.maxSamples = Integer.parseInt(args[++i]); else { System.err.println("usage: Analize [-comm ] [-samples ]"); System.exit(1); } } PhoenixSource phoenix; if( comm == null ) phoenix = BuildSource.makePhoenix(PrintStreamMessenger.err); else phoenix = BuildSource.makePhoenix(args[1], PrintStreamMessenger.err); MoteIF mote = new MoteIF(phoenix); System.out.println("Collecting " + analize.maxSamples + " synchronization points from " + NUMBER_OF_MOTES + " motes..."); mote.registerListener(new TestMsg(), analize); } int[] seqnos = new int[NUMBER_OF_MOTES]; int resolveSeqno(int sender, int seqno) { seqno &= 0xFF; while( (seqnos[sender] & 0xFF) != seqno ) seqnos[sender] += 1; return seqnos[sender]; } static class Entry { int sender; int seqno; long[] times = new long[NUMBER_OF_MOTES]; boolean reported = false; boolean isFull() { for(int i = 0; i < times.length; ++i) if( times[i] == 0 ) return false; return true; } public String toString() { String s = "sender " + sender + " :"; for(int i = 0; i < times.length; ++i) s += " " + times[i]; return s; } } ArrayList entries = new ArrayList(); Entry getEntry(int sender, int seqno) { for(Entry entry : entries) { if( entry.sender == sender && entry.seqno == seqno ) return entry; } Entry entry = new Entry(); entry.sender = sender; entry.seqno = seqno; entries.add(entry); return entry; } public synchronized void messageReceived(int dest_addr, Message amsg) { if( !(amsg instanceof TestMsg) ) { System.err.println("Incorrect message format"); return; } TestMsg msg = (TestMsg)amsg; int reporter = msg.getSerialPacket().get_header_src(); if( reporter < 0 || reporter >= NUMBER_OF_MOTES ) { System.err.println("Incorrect nodeid in message"); return; } for(int sender = 0; sender < NUMBER_OF_MOTES; ++sender) { int seqNo = resolveSeqno(sender, msg.getElement_history_seqno(sender)); for(int history = HISTORY_SIZE - 1; history >= 0; --history) { if( seqNo - history < 0 ) continue; Entry entry = getEntry(sender, seqNo - history); long time = msg.getElement_history_times(sender, history); if( entry.times[reporter] != 0 && entry.times[reporter] != time ) System.err.println("Conflicting times received"); entry.times[reporter] = time; if( entry.isFull() && ! entry.reported ) { samples += 1; entry.reported = true; System.out.println(entry); if( samples >= maxSamples ) analize(); } else if( samples == 0 && entries.size() >= 20 ) { System.err.println("Messages are not received form all motes"); System.exit(1); } } } } void analize() { System.out.println("Analizing data..."); LinearEquations equations = new LinearEquations(); for(Entry entry : entries) { if( ! entry.isFull() ) continue; for(int receiver = 0; receiver < NUMBER_OF_MOTES; ++receiver) { if( receiver == entry.sender ) continue; LinearEquations.Equation equation = equations.createEquation(); if( entry.sender != 0 ) { equation.addCoefficient("offset" + entry.sender, 1.0); equation.addCoefficient("skew" + entry.sender, entry.times[entry.sender]); } else equation.addConstant(-entry.times[0]); if( receiver != 0 ) { equation.addCoefficient("offset" + receiver, -1.0); equation.addCoefficient("skew" + receiver, -entry.times[receiver]); } else equation.addConstant(entry.times[0]); equation.addCoefficient("delay", 1.0); equations.addEquation(equation); } } LinearEquations.Solution solution = equations.solveLeastSquares(); for(int i = 0; i < NUMBER_OF_MOTES; ++i) { System.out.println("offset " + i + " = " + (i == 0 ? 0.0 : solution.getValue("offset" + i)) + "\tskew " + i + " = " + (i == 0 ? 1.0 : solution.getValue("skew" + i))); } System.out.println("transmit delay = " + solution.getValue("delay")); System.out.println("maximum error = " + solution.getMaximumError()); System.out.println("average error = " + solution.getAverageError()); System.exit(0); } } tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTimeStamping/Jama-1.0.2.jar000066400000000000000000001000071207233610700250040ustar00rootroot00000000000000PK}2 META-INF/PKPK}2META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMu +h)f&W+x%irrPKGGPK2 Jama/CholeskyDecomposition.classuUMP[Uy//gCZ A P,%Ԃ:qOg ɣIB7q\S:S .L[tB]R7wnqJ7w_L]wsw=瞛5F=Bш ]|=x!:T7ϸ6N+mƴfŤ:}x'})pȇ0(㰊C8Ë8#'ͳLt2 F*ȥ2F04m̋`K[9R`Ƥ1O8, d*gm%ai-@*˙A`:P:բ1t/$|Y6h7ֹYc цL+Һ .Z)[[;(Up \OrY/TNG)*=j^M]EҼ&bn:.z_TCzFTy#d̝+~M_E ѤGJWVɼl*>ATۯ\ǩNI"9̚Z~/:(۬]6V1 7z>5@:9C](FЍq$bx =0ыeqЏ5z~C9p?~bH>NIFlR1,Ԋ8qe'T5F4r[v^<˗a.NqĎQꉆMn+hD6[ʚ\k)l#Ԝc!MДHHsRGqFRQ1+QTh,ʔk[QJ1H)#8W%̃ s( 6ZQn/`15k-6;81G}G]}\w} ?R?6 'm[FyPK/_PK2"Jama/EigenvalueDecomposition.class:i`U眹o>Ƽ_UE A5!!<ƒ`ѴhZ\XdFQ nbEZh[ԥ({ů?> sf,sf2gnxO@ A8_6e3X'{(# p$(IX6HdO?t}V=)(SL9peR@fljeSzIsl<0 !8wZ?u4e8wg"F#lnAp5oNaKs}]S16,Yэ/4yBʹ<̙Tn3~.%;t8Q4K["t(=ϘVsIC} piq(P?k~yj2U54I'5֟(5d(&f'64&gQ3&3O} ̄ .gf^fa@sA_TĹ ̓@!`a>JX^pZΒse3@6bcemXr-U}fj3vڌZajL_X3qm=CɫLg{LS8J;G_NfrR4\Pki5}Ҫ*IȪxȇ47,)) KΜ4kxcSJe#2OtL.ӥP> i  F6RPJC(x~iԳ\xD7Aɾc oCl?v/XO*DplΥpvWR}P%OS}lrW0c\(JNYfj475gM$j-M156඼[_*JMon 0a7V4#5}Z•Ic L75ZuepU@MIF@2Scdx=`k+D)=lԘY3HX[q{L6iEe2cTѯDC-H²rk+CFHm4TdXBdŅXi#u{{ױ#)6_*HcUdzQZf524V! O4{k6TrJ~7ӥH=<=WMQeZţMRP+lI`d?W=_'nG9nK?c\2 sVag 9ơXy Z|,z潅ǫ` a Tvg"Su6Çp|kh|5`& af<9Ђq0[om1fNwոc_,OZ A (,2gx!ja51~.DWn6ӽ(g`5=XCZXGzul(2`#.1dUT=bl^~{TH^MvԶAJ8cNRSYESInz\O.vC@J e;qTz!8Tz By%t%Vw;ڼl!> o^HZA3 !K7VK"3hxJBl"=:8Ik:Wuekkl(D.LG\Vfڑja+̵:iOѭn^(6<ce*ʈUh*Xf0au4Δڑת͈'ԓVD*k* X91t\3#)ZĢx]*$u5R,1=L##'X3j&L3aH쐴y#:txQ3\wԗ6EZBWȊܺQUG|eos1>vF! 0ޖv'\lRG/uETkg%M'gr۹ S4g9[l9KhWa)샛8-?Jx 6p6{aw= A8?( #gc9@8* '?p|`as[_~7nø~=~χo 7P'D7ՠK 0HP54݃0vg1@`>}З<>Q:‹E"E2,Xqv&YQ۹Kp$=IaSf袲Ҋl*tâ\IɌTW߹x)"ANa U隄cP5}VU2&QY؞un"᥋̀Cvh B̀NZ$طMI)ŗp^Z+?/4?F-u;zTj\ l?:[ /DːmO48 veni1Y#0g9aR6l:Fʌ!ʝ0GI62KfKfX5I1TM >q阇0@|hA \]eh9 h58\]Uyp#[pla;Bx=8g1^=#v0`1NŮx)p*fL ^p6Ls52~gVl]8 _b'C_c (- [)Wr/R\HE4S^CW1\4Kn6U~ ۱ wB .=pLJZ>eL,Qk;CyhPvdIt)j/KQKu !߀7u\ |ˡ?§+<7o\ZNeN1ot\ Բ薏CLB֭*Q#ʯz#[[/V/S#\ ﹨7nXYh EThgBmQnRFﰈ$nqPR tgOfX>g=fNlJ>poKU70 # I8.eJO(#ti rPo9>rҩˈ5CN(Q $ ˥#ymքRyHŀCxC:gqI䃋ϭ".NJ`WEjͳmQXvoIbb;1$>b.!מt99pʳ(> !7Cɬ=Tǰ3~f~5vjJ\$ ָ4RʺlgN,k :N/7[in&9T{ioR)! }nvSwP42IjU.d I-^kj 9_vo{)i_f22bRtV))?K#9U)<&5#9YR]N͑!@ m;vgf\-dȥiSq(EGy7XWx܃;]OUTbvIzoLUy,Vs]TɬQkh%~zݓ~k>l (PiNX~&& pvƭa=>p> 3*> 9+8/w2uxg8.{އp~OY_ƿ^>Ã9~_%d? ~CQFw4#OԌGfHMh%vw9jvCsP"JݵA s*w -r5Ľuoܻ-u_ѯ2OzBSFxzӭtVxJ*ƭm*;=FkZ [ExVo]Bym]ݻqoS=v{?GCGz'iY_gzWL_O/.b8^5+K^_3O]Kn}Uo Oov۾'+_:K+ }BNsR7s[˿~?EEG)PHGhy& -pp;0Cxzo"z`^{EN`x_t |!r? #qJ0_{HpDa:Q[EWLjDYh(=CX%QzS }(z\"b>B NJz-FK*}bBw0%O +✩Pg^01Fw_Dy i'5~ܳ(sk;(1N/uH֗%X/:YW}!Wà,qa>t"Ԋo?o6TVD%5t1X'!G@1 zZ'lq\(`17B41 IxyGˢ^ `XUX߉Ha'aTaO7`)[>.)w_yNݑ-im܎s(Cɩ‰k=襤Ip;2IŎ>.G+J~uwPt~]%p>ڿ$g_6|MDE*TR&[3cP.~06lP,{& C0QLsxPK*(PK2Jama/LUDecomposition.classV[levb@۲ ܴ -K TkQٶ2 ^&'A4SMF@Q(*/&xy0^3ۂ>9ss9gN{^N7!PNuImVKm|\ 2rRl1sejZzybΰ2YԵl:q9 {k:m0%X:/5sf:վ'z bljDgT՝!ᰁ TUCC7!2O`e#إuKQ1RV,bj- Ǡ,+ Yu!%]`Emq>}ێtDNYA4*Ɲ]=su'oelV);KqU'Q3\;k "уŭ[f1wUo=U<**ChN,/ Jz%vVq;)w\Zke=JCp19ȍ6 S1wM_6%m2cH y .-=XZZpo#q Pqv&KWCm=Ob8U ‡ub1KUv;|V<.k@3Ip?+PK { PK2Jama/Matrix.classY x[ŵ>sqĎD !q$/Cq'΂N uc ˒ђBKڲCҰ%08}l .% -@K3jx}dF3sf?9sjz'mIsN~T3'頃 'z/ot/4rWN5ti.qҳ CO>O);}?t:\(\\h9i = { ]sr:mZ(p1Z]1(tҩCE-p;8;D.JXnRLu1I*uF& EB9lMM3N- A͡2ٽш l Fc,5cڣx"lOJt.lT('4/ tWicp4}E9+9PD:WmH48G i3-!hkNKzCN5CGUEg :E!. aeMϏu$!S薸;Ox; o݆7lD:UdAɈgu o‰POF7y, 7R6%>\%kUD`< ژn7 ڍA8VLu4A>Q}t(\4@#FLSo,3 lh9gp.HE?2Ju^E\ݍ_b1{Յ%*D%[ g|B݁鴈Giֽ1%5XK|E':8)Y. ]uy@ l nMtvv# BhE\,~9%O-^y)uf1д*]&[{ lV-F#^{|V,s%V.[-NI)>M"pUxS $Caj{\@Fo(MD^Px8A/(e}KuQAe r3eB\l(Ͳ ¡f7R@s7Cљ^j`#_p݁z4V_is[O4r4 Bܺ-0hbA'Y<9-)k[+54dˋG.3UAXK.@x4*_E jZI߃]r1cruY>`v?9J=}4jee/굔[ AHyJq&'[(ʽ9XJ!rvt2jF݂ӑ] NJ-R^TiHWCs|Y4W0).-_$֟A6xSGn&Q?G=tG&2KdP"" Oܞ c쓳R{chNiq8ӆ {R%|2Digzs`yxs`YHFM=y)͝RGܹaCRSC St:NF{ _Ѳ/=h?h?a hUsE(D'#pcrǢ<_Al#4mpke(D{i=v4KnGYPk?AP~O @ \PP)M1SEKEb2ciJU8jD G֊tK߲pLuT .a&ݶ /p+kd#vP$if^Rp9B̥| .34W2zDc̶Rv3dp])!vXk+:C%d{b{c(* *+iXM^q z14Z%)TZ/N3f@rf.\aeM@ D۫а0%1,:9̝`s70~A:٘fEj3Z27'vBȚm /{-ݺi 2Kc(wf#q^HcE˅tjhi0{Ob4'ݴ0WZYd%ܐ1z4aGQ`z' 0=L?eGT-5blA')r$43Tzڋ󐼜lrﲺ35ɑbBfxY~*lI~M/إ;$eR+(_UWhxMØ uSQUw/˽Eyс+ie}q7;#)U* #hY,36~zdiRifYJ)\(*V\4 uڵJ>N,M#g,%3-*a<zCs5\(wttp5\))v =(9(VX0R^߽A)ob E˔ ;ԥK =ڢO+UU>] ?Q>OfޕO8* *(o;orGC rŋPNw 7\qq'h'OCQ+nMOT5R)HSB8IzXszi*ħq3f+[h |~i{ˋM4='/VPK&.r:PgzJشt|'.*.2(3>W~ViNQOU {^kn1}& G߱fO~3`%*r%Cو1ƑǨPݛVR()S5?w&W%`8 ay*KKe\*JJ=T/$WyyQOǷQ ŀG'҉%Ku%ZY/$˓K4fD6R7Pz#; ;{wn@=4AbY< '!>=^P{iV]++#}vp?ͩUQEo/͕BQ g4S=H ǩ * Z/LR ?/;T|>= Я#W"?_OK`+0TI=Gkdom}@VUZ ~v OS;Z{i!?YwyV][hkS{u񻗾0x},%p5-ƞ#_^ Qo`ɇG2d;R{Q[}x 0oЉ4[-Qߢmڠ {G}:BC\Q?]'t7zR^RAoGD&[SD)&5=p,=RR>`~;M:pq|!ƟJ_PKc,PK2Jama/QRDecomposition.classmUYpSUn6 i)M)%@J Z(d錦I&% ̨FPgeqAfĥDp@gq'Q^}soڦs;꿟]zjsQyb:/v IJІz jhr qtMNL'0Kip\Hwo{pܱ0lQ^W5?2꽾2>QfGUouZu%fJי4V<8Yh8uC K]X<]f4RRlD BXmhC+4^q<ͩ:pX/c£DF@qLLcA qi<5&}[[y;fSr82AiJ"BD'P8znuOc!g =MBKv}+"]:x'H:+\gŇ1>FT9u ѝ/ǟ8Ct4E7-+1i}nuW>bJ[Ә:JW唌[)Ѭ4{҆'nJ́`r193Pha6LQl19OP>'縻H+`=qW3l\yScʦB/VAAq0uSa]$8mMV3k6]ڄxg{ sD;EkגҘhiE(l=cEky$QVvt<@~" +{ڣ] =YY|3jgY˄Dg hgQpDOWuF9Ckj%:V'ĻQD/0ε! l8ΰT| ڰp TP lbX mX6\Ć[h 1*GF5env=%n".'F/hG㗋RT73+1zJjV@H)ڹ&Ic3GzWhG̞ *wD;ΕhcUV'^S yu i\4-L5SA# $Vc:+3TxNi_8ΩA#`$g i^nPUwV]}R(Sn0%Hdf8fUtҒ 2T6WhGf}q60q̐0lPc5HRr-0/lwvg՛X*@ՄX7 bV>CD+9-mrs|ak_l|~ڽ'`ƶ-6%cq#+(";ZnH|T̼9ReT2d'Iderz0 JT ̯Χc ͡i7L-6 n~(| M%3;Se(zys]"/=G1=ib'حB(L\hp ;MxqSZhQbw6SE =46qNpEę;y)dPT`[TALHwAJ q`"'s!y!=[(, MM54) ~t?$CZ4 ] ]$Fiz}jK0\(V>(ܭt~pqzVn!#fs3 Un)Be!sݴ$%r)[`:J9sUuU#5 %YNcgҡ2W) y~ԉRItJfnJ|ϦܔrT#hկ=5sH?Q+i6\Ap , IA0$2 wذ-qKbt%•C<Up[(nUr w+6*pEz(nu/UTKWƼq/ձp m}N- 5wu%w#hN#Zs] Dj̣mE c܀ +#in|rL>c1'pLCLLv,\3wGU#)EvgRS.k2qM$:'pDzt{Z/<)S3/S37S3?S3?d-![ql9CF8WTk{Y3R=غ?s-=s GԺ>,ei}8%N(r$͹9|McU."Cs I2l0a YD3"YD3C艘4'cXL|=B3c&tF͍64[3 ΂a.`; x޳DQX _ћqX&4c*XXa΁JUx ; |M.\_z6HkɅ4NkD|AZFn"z="p<% #D߃-UUv`\;:){phd+F<.xR~vɏn_}?y_|^TPg+G등A!8AU8I'q~?Niب?MaQe 6qq&4&D3o,… \d/4n%fl6~Rc7.3 zL\ =x;=KROd{O]XmO="v >cg;E{'×oU/!_N$ڈ{gw.Ƿp8X`2_@t,@#fK, dP%Hm5dhx(]\#M%+0B4|+U~v֝)PhK -@[>ǑdF}8׍n(he3lk yctci%L}(I8Tt;<*Z*Z֘Q|Wpub%Q#U2t.[8' ?G>MO4?Ћ~kFII 4^{fy`o ~[N~ԧȱ7ln-~_h[RF`&Vz +˄n{4ZrUC4]IP֏' E3MO3Vu''iiF-^cJ[1+i 4T4{5hW̡QKGRo6{^ 9;G6)3, \̐smXӳC=}3x]7b8ѹ7KMG:b1 ;gzLz7idr-]KH=T}-βBSsF265R6(!CB*lѦzW'1Jdu2|9C>]mXLﳘZJz 7xtZ P%LQBjRS0kTUt ;R\N'|Rp '''x(̍d"GaRL)YDDPɽ!2 0s!]) GD(qo^ 9.]SUEsJ+4 WTs ᠫs|n\ԩ4>ٯ9D(WHhsBq[a9妠73]Sǰ.0Ė蛡(pBY2b:eFMaRp2aGyiYdS5M:GmPԣ'>,wy/BS'%q/2'IJykܓh"}lUxfƊNկFF_j;J&22ڢGkjxruq2*# xXDg;uS_gt~J60ZK l ?+-S&36+)-Yѹ=v@=/a)^Gxps~A_q.6^*^u$xC,e o.\1*U1wi'b맼_PKV PK2Jama/test/TestMatrix.class{|T{gRai 4ZAd nBDĊ"v<}^PSyܻ5/wfNsfδ{|p!~ 0TE?SKU'U)LUz*TorT2 UkN5} =JU#5zeaUbERPm,UJJQM)p<e!ȠAe,0g.E Zdhea6ycg`%\k)e2,gJN=*^fp/08k`99t.o|z2\2s60r\ \*^5 \^'- nnbnm m ngp.w= 3}u?v;xu'<ȫc7<`y2x'/eJ|`Bv8^Vd^!Oph=yބWwe ?3Ag_7 b&G~RJ25(]5QQƨQQ VEmu0dŨʨ=BBFv`'b7>^h_FQgtP?-bFK-ā -1?*1s,75JF㬡8yuBGQ1?bs0:^xd =fy'1ZY:N`2Sgt*d:] ,L΢ =ȉᏹq*)4H1hbma4f2:]"HL[ebH@ cM! p$41:/ׂCk0][Spdphl\j\e٢fƪV;1,Des @ [$bO'C8;:^s0ܒa,~)Kjk9255Ƈy8 -2bZ8]RL5F#D,٘`)0%(k %Deeet4AJ@ |Ȓ`KO-ظ(@> BCmp4DĂXti1‘d HL7Զ[c󓭡Hb\ Jb+̀ܥ)@ͯXpKD}M`%-Pu,\^i -LLjMFis@wHkҒBK! .I)f Fۖs?t)]))HQ#VPc"MDз$dExOCb +L@H$ [Ho e?%rGMse1tO'hPsq%KkF$u!F kl%㮦gp3EtI=w aCMXa.ŵ" -kIᛇ)b|TkAG҅EPx O鑴 +]G }l<*͍o!:/Tk³Ma܋c!.migcE=q}8BDVbRejr^<8s6 +d .i!̔8_ߊthSqxۄ($-N[#KF+y[[ˡeUF}}cJ:W4g3q;aψvd.t#YFj..RWq 5'jK;ON? 4 q̫9fIv*u5n_7>z3Ng;y-G->:ܼN gCeFD#8vbˊSZV3] '_0NujN}\-=qDhY&n aT6 /ZxKuѩ[E[2JI9xDbf p|2pΌ^+. QM,MfmV/~RIS}(ql\ȕo[m8Oĭ_T|2\9Q b*.$^Iō4^[d;Ecd_r,Ѱ';ܧo)#_[(cW%c1 6c!~ [. ';sKI;"ۭzEr6X" G<{[Z|zbIe/w2mbҲf9F/ږ( Y 'TOU {hҼ{`[=t;.l=Y>Z}~Nި'+F+}QgPB4랱#ȹ)>i$.stɯL)j5 ڔlp%s2 %z86mpg9s*& f[3q]ҷt+} ̝ESsU^k%qH / gEǩxE2}EZku+}CVVEȒP,=zfuF[<{xeIHٷ;2} -=*̀"2FTtDl({}~`{yƅ"K:_ފ5KCr#eG!m?$k9@TKKv^>I[ѡh/"bNҏdJ?W㮥믬s5O3J?)|t7sY6p9$QNodw\o9_+ֶ`,[^lm(_N1W)#?k`CQ%~8ʇTK;vS| rA*..y]9S^<:ߦ3#F3;/^W) :~6 'ڢԢɎl+V[4f^Vb@f;R\;P :SٝJZKSm, #ѸC cv`*ɕGRhS_,2T+K ʁ ZeiRܔ᠗r@ 6Cʇ^ aCcvcw! .wʺz:t'VFz7N$#Tdd]Iɨa6EFDg  ^/^~^&JPJqKKɸQ{ BHۯxx="'i!"U CP5䝤v'9Q=IHtA)B\^T)T;Rȕ_T2+&<`Op@ٕKBsOpd'7P║N֧6 W %.R&vKLԼ4Rސ Ye'7QooA(xl(=uyNO]nb9i$PARJѹ7x \kkrewFyu"s<^k7@ߠS nߘzcf`t"VssuOlSpk­[RܖpXsEܑzw[(ݙ{zWƱc`ܓƸ{&9TOLdG`;vɮ]dw.Pgyxy$0;;‰kģޑ]qxB<<<C| 9yXF.淓+ ^΍ͨ(H͛QO޼M΂nyS Ď@ww`]2 {=?-U?-ŏ}zXOҋ)}QƏVtlZO8gZ~ &>懀/rTJ }]x,&O!^posDˈ|_X?PR8+%?9gxC;ka?O#ϯ*[oY=!˿n UĦ@ȴvFͱ); gl{y,vع$cN0p#[%W[q%Wqak`46lRwt)*̞`v78R4D*¡I'F .VKExCw*HOy G A]M&b놮]P J᩠m݇wëH)Uk:+X7tqn7q3ʓAeB;᜞%ޱޱ ^igk8@/7֖1"vu ON7MuG@ ExRpt޺GHมPҰJ0 ;K7 g;Td Aàaa^֐*CЄm^I]F3mc|׍?d2:SSXRe4M1MÒO#Sf-~Դϴdlr ȃQr5)J+'eX7Wm( '!32FDoGl2˂հ[lۄfv[oF>e߳*3{a3#v- %<||o1?f~˧͟?Rʔ RHJ2T)(+UXlR[Qn>mW~Q~%UDzRmۓIK,s,[,[9,_ߑUP 1:Ϛ.Cc׭oVevm5ۖVb{lliۅ_mdwۻ:{?Pl`nEU5ؾ~la_h9qt%Gc;f9fc{cc5/q B򒳛ssy'ARet!_wwp5:"Jֻv]m=.?׋}XPԩEH \/(רcy?=n CG|{zƓ(OZfX{^J :Sy/]JG$r1d9JHXI1Ÿd !eBRN i,L֒ci=."IF2Lpn2Bz^$h G^TKG2Y:H dAp0xLC/2's Igijאy0 3BCDq/24CՐ$p!6:0l%Imd^Yfx,7N2H6N5G3~LUq )A/D^U94L>m6 ӣ3ӛs>=p_>#_~#_&rWod qVJA'8<W_<+T<%/"'A+@y3`|o|XG.? EPW).y/-tBf)НY d;yǁ >ba GP̂gP"0-Ry0ml3ö8 Cvd o7 e{`{F`{F}0*Ta/e?Cg aL4`0<ͣay0ϼ [ټ'aiXh~?+h13DM  K2XTRXJR&Je g(QX Upru&8WVs- )|e;\쁋WbLy.Q¥ʗA6)Fw"fK7n*K1\ck-p-7i-9mU/:r.b9nl-[.Vò l{,my[ބv>xvX> ;x{2^ XkSMVz|i} > X_ooG|o`~I ࠭;jO[n;(`;l(MdjFMfll[FT:jOKj@˩vun{hN]mB3Ea}K{~}mP/nG٭M.tmGŴ>هR{Wr >OC1/C1:̾Z:~>ioUkX ھAZcxD6`NL'IoOtL;[c^k :@?Wej_._7j=VoՑ~߫ՙ'u.=j#E_7 zSHRzDJ)I}Q}Y2oKf=IV??IV]HNWK_rK{v ܳ.FnHͽR@TB__r! p"Z*v"R&z r3\+ *<'H=3~tX"ғ󬔆zJ%pfijiZiVi]RJKz4d߂r+Ku7r9i%1KUZEJT 9=|K A՟%9Bŝ /aZ` ha,HHt6&CK+1i0](Bovrq;TeŨ1f!#Tݩ'l%Xdtx1 .'$3K,hMyjY@-]'#DQo:[Gu/P]%ΰTvIaݎv99PK%MPK2Jama/util/Maths.classePJ@=N.B0U0, c`Ӧ֟(nܺW~% 83w>?iBm}7l(ڗ *aNF~^H?ֿI2bym%UM>Pv3օ=}DۺݡɱjF&؆}tUNj+_ PKѢ5PK}2 META-INF/PK}2GG=META-INF/MANIFEST.MFPK2/_ Jama/CholeskyDecomposition.classPK2*("sJama/EigenvalueDecomposition.classPK2 { Jama/LUDecomposition.classPK2c,#Jama/Matrix.classPK26|  8Jama/QRDecomposition.classPK2o =%&?Jama/SingularValueDecomposition.classPK2V &rLJama/examples/MagicSquareExample.classPK2%MUJama/test/TestMatrix.classPK2Ѣ5]{Jama/util/Maths.classPK |tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTimeStamping/LinearEquations.java000066400000000000000000000251401207233610700267540ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author:Miklos Maroti */ import java.util.*; import Jama.*; /** * This class solves systems of linear equations. * @author mmaroti */ public class LinearEquations { /** * Holds a map from variable names to variable indices */ protected TreeMap variables = new TreeMap(); /** * Get the index of a variable with this method. */ protected int getVariable(String name) { if( variables.containsKey(name) ) return ((Integer)variables.get(name)).intValue(); int n = variables.size(); variables.put(name, new Integer(n)); return n; } protected String getVariableName(int id){ Set set=variables.keySet(); for(String key:set){ if(getVariable(key)==id) return key; } return "no variable"; } /** * Returns the set of variable names in the system. */ public Set getVariables() { return variables.keySet(); } /** * Represents one equation of the system. * Create the equation, set the coefficient of * specific elements and then set the constant. */ public class Equation { protected Equation() { coefficients = new double[LinearEquations.this.variables.size() + 10]; } protected int getVariableIndex(String name) { int n = LinearEquations.this.getVariable(name); if( coefficients.length <= n ) { double[] c = new double[n + 10]; System.arraycopy(coefficients, 0, c, 0, coefficients.length); coefficients = c; } return n; } public double getCoefficient(String name) { int n = getVariableIndex(name); return coefficients[n]; } public void setCoefficient(String name, double value) { int n = getVariableIndex(name); coefficients[n] = value; } public void addCoefficient(String name, double value) { int n = getVariableIndex(name); coefficients[n] += value; } public void subCoefficient(String name, double value) { int n = getVariableIndex(name); coefficients[n] -= value; } public double getConstant() { return constant; } public void setConstant(double value) { constant = value; } public void addConstant(double value) { constant += value; } public void subConstant(double value) { constant -= value; } /** * Multiplies each coefficient and the constant with this value. * The new equation will hold if and only if the originial does, * but with the multiplied version can count with different strength * in a least square solutions. */ public void multiply(double value) { for(int i = 0; i < coefficients.length; ++i) coefficients[i] *= value; constant *= value; } /** * Returns the difference of the constant and the left hand side * containing the variables. */ public double getSignedError(Solution solution) { double values[] = solution.values; double e = constant; int i = coefficients.length; if( values.length < i ) i = values.length; while( --i >= 0 ) e -= coefficients[i] * values[i]; return e; } public double getAbsoluteError(Solution solution) { return Math.abs(getSignedError(solution)); } /** * Returns the value of the left hand side. This * value does not depend on the constant. */ public double getLeftHandSide(Solution solution) { return constant - getSignedError(solution); } protected double[] coefficients; protected double constant; } /** * Returns a new empty equation */ public Equation createEquation() { return new Equation(); } /** * Holds the list of equations. */ protected List equations = new ArrayList(); /** * Returns the list of equations in the system. */ public List getEquations() { return equations; } public void printEquations(){ for(int i=0;iNaN if the variable does not occur in * the solution. */ public double getValue(String name) { if( variables.containsKey(name) ) return values[((Integer)variables.get(name)).intValue()]; return Double.NaN; } protected Solution(Matrix X) { this.values = new double[variables.size()]; if( X.getColumnDimension() != 1 || X.getRowDimension() != values.length ) throw new IllegalArgumentException(); for(int i = 0; i < values.length; ++i) values[i] = X.get(i,0); } /** * Prints out the solution and some statistics on the errors. */ public void print() { Iterator iter = variables.keySet().iterator(); while( iter.hasNext() ) { String name = (String)iter.next(); int index = ((Integer)variables.get(name)).intValue(); System.out.println(name + " = " + values[index]); } System.out.println("Average Error " + getAverageError()); System.out.println("Maximum Error " + getMaximumError()); } /** * Returns the average error in the system of equations. */ public double getAverageError() { double d = 0.0; Iterator iter = equations.iterator(); while( iter.hasNext() ) { Equation equation = (Equation)iter.next(); d += equation.getAbsoluteError(this); } return d / equations.size(); } /** * Returns the maximum error in the system of equations. */ public double getMaximumError() { double d = 0.0; Iterator iter = equations.iterator(); while( iter.hasNext() ) { Equation equation = (Equation)iter.next(); double e = equation.getAbsoluteError(this); if( e > d ) d = e; } return d; } public Equation getMaximumErrorEquation() { double d = -1.0; Equation a = null; Iterator iter = equations.iterator(); while( iter.hasNext() ) { Equation equation = (Equation)iter.next(); double e = equation.getAbsoluteError(this); if( e > d ) { d = e; a = equation; } } return a; } } /** * Returns the solution where the least squares of errors * of the equations is the smallest. */ public Solution solveLeastSquares() { Matrix A = new Matrix(equations.size(), variables.size()); Matrix B = new Matrix(equations.size(), 1); for(int i = 0; i < equations.size(); ++i) { Equation equation = (Equation)equations.get(i); int j = equation.coefficients.length; if( j > variables.size() ) j = variables.size(); while( --j >= 0 ) A.set(i, j, equation.coefficients[j]); B.set(i, 0, equation.constant); } Matrix X = A.solve(B); return new Solution(X); } /** * Returns a solution of a system of equations where the equations * are (almost) linearly dependent. Normalize singular values * that are larger than alpha. */ public Solution solveWithSVD(double alpha) { int M = equations.size(); int N = variables.size(); Matrix A = new Matrix(M,N); Matrix B = new Matrix(M,1); for(int i = 0; i < M; ++i) { Equation equation = (Equation)equations.get(i); int j = equation.coefficients.length; if( j > N ) j = N; while( --j >= 0 ) A.set(i, j, equation.coefficients[j]); B.set(i, 0, equation.constant); } SingularValueDecomposition svd = A.svd(); Matrix V = svd.getV(); double[] singularValues = svd.getSingularValues(); alpha *= singularValues[0]; Matrix X = new Matrix(N,N); for(int j = 0; j < N && singularValues[j] > alpha; ++j) { double a = 1.0 / singularValues[j]; for(int i = 0; i < N; ++i) X.set(i,j, V.get(i,j) * a); } X = X.times(svd.getU().transpose().times(B)); return new Solution(X); } } tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTimeStamping/Makefile000066400000000000000000000012201207233610700244370ustar00rootroot00000000000000COMPONENT=TestTimeStampingC CFLAGS += -DTOSH_DATA_LENGTH=39 BUILD_EXTRA_DEPS = Analize.class TestMsg.class LinearEquations.class CLEAN_EXTRA = TestMsg.class TestMsg.java \ Analize.class Analize\$$Entry.class \ LinearEquations.class LinearEquations\$$Solution.class LinearEquations\$$Equation.class %.class : %.java TestMsg.java if cygpath -w / >/dev/null 2>/dev/null; \ then CLASSPATH="$$CLASSPATH;Jama-1.0.2.jar" javac $<; \ else CLASSPATH="$$CLASSPATH:Jama-1.0.2.jar" javac $<; fi TestMsg.java: TestTimeStamping.h Makefile mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=TestMsg TestTimeStamping.h test_msg_t -o $@ include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTimeStamping/README000066400000000000000000000045521207233610700236720ustar00rootroot00000000000000TestTimeStamping: Author/Contact: mmaroti@gmail.com (Miklos Maroti) The TestTimeStamping component verifies the time stamping precision of the radio stack. You need to program 3 motes with node ids: 0, 1 and 2. Start them. The yellow (LED1) is toggled if the mote is sending a message, the green (LED2) is toggled if the mote is receiving a message, and the red (LED0) is toggled if there is some error. Connect a BaseStation (with TOSH_DATA_LENGTH at least 39) to your PC, then type ./run.sh -comm serial@com12:57600 where you can specify your connection string (try the -help option for help). This program will connect 100 synchronization data points, i.e. timestamps from a sender node and the other two receiver nodes that correspond to the same message. The output will be something like this: Collecting 100 synchronization points from 3 motes... sender 0 : 27623602 27792046 27871327 sender 0 : 27656411 27824855 27904136 sender 1 : 27618867 27787310 27866591 sender 1 : 27651827 27820270 27899551 sender 2 : 27605316 27773758 27853039 sender 2 : 27638008 27806450 27885731 sender 2 : 27670656 27839098 27918379 sender 1 : 27684407 27852849 27932130 sender 0 : 27689126 27857570 27936851 ... sender 2 : 28686477 28854919 28934197 Analizing data... offset 0 = 0.0 skew 0 = 1.0 offset 1 = -168468.7899618484 skew 1 = 1.000000925316579 offset 2 = -247828.76012311116 skew 2 = 1.0000037553451404 transmit delay = 0.5840716886662126 maximum error = 1.2824957221746445 average error = 0.4213230623113422 The offset of mote 0 is always 0.0, and its skew is 1.0. The offset and skew of the other motes are relative to mote 0. The transmit delay is the amount of time that elapses between the sender timestamp and the receiver timestamp (this should be very close to 0). The maximum and minimum errors are calculated using a system of equations of the form: sender_offset + sender_timestamp * sender_skew + transmit_delay = receiver_offest + receiver_timestamp * receiver_skew The component uses these equations (2 for each time sync point) to get the offsets, skews and transmit delay using the least square method. This program uses ONLY the PacketTimeStamping interface. You can change the type of test_precision_t from TMilli in TestTimeStamping.h if you want to test the precision of another PacketTimeStamping interface. tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTimeStamping/TestTimeStamping.h000066400000000000000000000036361207233610700264260ustar00rootroot00000000000000/** Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __TESTTIMESTAMPING_H__ #define __TESTTIMESTAMPING_H__ #include "Timer.h" typedef TMilli test_precision_t; enum { HISTORY_SIZE = 3, NUMBER_OF_MOTES = 3, AM_TEST_MSG_T = 0x17, }; typedef nx_struct history_t { nx_uint8_t seqno; nx_uint32_t times[HISTORY_SIZE]; } history_t; typedef nx_struct test_msg_t { history_t history[NUMBER_OF_MOTES]; } test_msg_t; #endif tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTimeStamping/TestTimeStampingC.nc000066400000000000000000000042241207233610700266740ustar00rootroot00000000000000/** Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TestTimeStamping.h" configuration TestTimeStampingC { } implementation { components TestTimeStampingP, MainC, LedsC, new TimerMilliC(), ActiveMessageC, new AMSenderC(AM_TEST_MSG_T), new AMReceiverC(AM_TEST_MSG_T); TestTimeStampingP.Boot -> MainC; TestTimeStampingP.Leds -> LedsC; TestTimeStampingP.Timer -> TimerMilliC; TestTimeStampingP.RadioControl -> ActiveMessageC; TestTimeStampingP.AMSend -> AMSenderC; TestTimeStampingP.Receive -> AMReceiverC; TestTimeStampingP.Packet -> ActiveMessageC; TestTimeStampingP.AMPacket -> ActiveMessageC; TestTimeStampingP.PacketTimeStamp -> ActiveMessageC; } tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTimeStamping/TestTimeStampingP.nc000066400000000000000000000075741207233610700267240ustar00rootroot00000000000000/** Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "Timer.h" #include "TestTimeStamping.h" module TestTimeStampingP { uses { interface Boot; interface Leds; interface Timer; interface SplitControl as RadioControl; interface AMSend; interface Receive; interface Packet; interface AMPacket; interface PacketTimeStamp; } } implementation { message_t test_packet; event void Boot.booted() { call Packet.clear(&test_packet); call RadioControl.start(); call Timer.startPeriodic(512); } event void RadioControl.startDone(error_t error) { } event void RadioControl.stopDone(error_t error) { } event void Timer.fired() { uint8_t i; test_msg_t *test_msg = call Packet.getPayload(&test_packet, sizeof(test_msg_t)); history_t *history = &(test_msg->history[TOS_NODE_ID]); history->seqno += 1; if( call AMSend.send(AM_BROADCAST_ADDR, &test_packet, sizeof(test_msg_t)) != SUCCESS ) call Leds.led0On(); for(i = HISTORY_SIZE-1; i > 0; --i) history->times[i] = history->times[i-1]; history->times[0] = 0; } event void AMSend.sendDone(message_t *msg, error_t error) { if( error == SUCCESS && msg == &test_packet && TOS_NODE_ID < NUMBER_OF_MOTES ) { test_msg_t *test_msg = call Packet.getPayload(&test_packet, sizeof(test_msg_t)); history_t *history = &(test_msg->history[TOS_NODE_ID]); history->times[0] = call PacketTimeStamp.isValid(&test_packet) ? call PacketTimeStamp.timestamp(&test_packet) : 0; call Leds.led2Toggle(); } else call Leds.led0On(); } event message_t* Receive.receive(message_t *msg, void *data, uint8_t length) { uint8_t sender = call AMPacket.source(msg); if( sender < NUMBER_OF_MOTES && sender != TOS_NODE_ID && length == sizeof(test_msg_t) ) { test_msg_t *my_test_msg = call Packet.getPayload(&test_packet, sizeof(test_msg_t)); history_t *my_history = &(my_test_msg->history[sender]); test_msg_t *his_test_msg = data; history_t *his_history = &(his_test_msg->history[sender]); while( my_history->seqno != his_history->seqno ) { uint8_t i; my_history->seqno += 1; for(i = HISTORY_SIZE-1; i > 0; --i) my_history->times[i] = my_history->times[i-1]; my_history->times[0] = 0; } my_history->times[0] = call PacketTimeStamp.isValid(msg) ? call PacketTimeStamp.timestamp(msg) : 0; call Leds.led1Toggle(); } return msg; } } tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTimeStamping/run.sh000077500000000000000000000002371207233610700241510ustar00rootroot00000000000000#!/bin/sh if cygpath -w / >/dev/null 2>/dev/null; then CLASSPATH="$CLASSPATH;Jama-1.0.2.jar" else CLASSPATH="$CLASSPATH:Jama-1.0.2.jar" fi java Analize $@ tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTransmit/000077500000000000000000000000001207233610700222045ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTransmit/Makefile000066400000000000000000000003561207233610700236500ustar00rootroot00000000000000COMPONENT=TestRadioDriverC # send every 2 milliseconds CFLAGS += -DSEND_INTERVAL=2000 CFLAGS += -I$(TOSDIR)/lib/diagmsg CFLAGS += -DDIAGMSG_RECORDED_MSGS=60 CFLAGS += -DRADIO_DEBUG CFLAGS += -DRADIO_DEBUG_PARTNUM include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTransmit/README000066400000000000000000000020361207233610700230650ustar00rootroot00000000000000TestTransmit: This application sends a very short message (2 bytes) every 2 millisec without checking for other traffic. We want to test if the radio driver locks up because we want to transmit while receiving another message. You can change the sending interval in the makefile. It blinks the 0th LED (red) when 256 times RadioSend.send() returns with an error. It blinks the 1st LED (green) when 256 times the RadioSend.send() returns with success. It blinks the 2nd LED (yellow) when 256 times RadioReceiver.receive is called. Program two or more motes with this application, then start them. You should see the 2nd LED (yellow) blink continuously, and the 1st and 0th LED (green and red) blink too. If both the 0th and 1st LED stops blinking the the radio driver locked up. You can also reset one of the motes to verify that the other keeps receiving messages. You can also connect one of your motes to your PC and run there the java.net.tinyos.util.DiagMsg application. This should print out ASSERTS of the radio driver. tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTransmit/RadioDriverConfigP.nc000066400000000000000000000054151207233610700262130ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "Tasklet.h" #include "RadioAssert.h" #include "message.h" #include "RadioConfig.h" module RadioDriverConfigP { provides { #if defined(PLATFORM_IRIS) || defined(PLATFORM_MULLE) || defined(PLATFORM_MESHBEAN) interface RF230DriverConfig as RadioDriverConfig; #elif defined(PLATFORM_MESHBEAN900) interface RF212DriverConfig as RadioDriverConfig; #elif defined(PLATFORM_MICAZ) || defined(PLATFORM_TELOSA) || defined(PLATFORM_TELOSB) interface CC2420XDriverConfig as RadioDriverConfig; #elif defined(PLATFORM_UCMINI) interface RFA1DriverConfig as RadioDriverConfig; #elif defined(PLATFORM_UCDUAL) interface Si443xDriverConfig as RadioDriverConfig; #endif } } implementation { async command uint8_t RadioDriverConfig.headerLength(message_t* msg) { return 0; } async command uint8_t RadioDriverConfig.maxPayloadLength() { return sizeof(message_header_t) + TOSH_DATA_LENGTH; } async command uint8_t RadioDriverConfig.metadataLength(message_t* msg) { return 0; } #if ! defined(PLATFORM_UCMINI) async command uint8_t RadioDriverConfig.headerPreloadLength() { return 7; } #endif async command bool RadioDriverConfig.requiresRssiCca(message_t* msg) { return FALSE; } } tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTransmit/TestRadioDriverC.nc000066400000000000000000000077771207233610700257250ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ configuration TestRadioDriverC { } implementation { #define UQ_METADATA_FLAGS "UQ_METADATA_FLAGS" #define UQ_RADIO_ALARM "UQ_RADIO_ALARM" components TestRadioDriverP, MainC, SerialActiveMessageC, AssertC, LedsC; TestRadioDriverP.Boot -> MainC; TestRadioDriverP.SplitControl -> SerialActiveMessageC; TestRadioDriverP.RadioState -> RadioDriverLayerC; TestRadioDriverP.RadioSend -> RadioDriverLayerC; TestRadioDriverP.RadioReceive -> RadioDriverLayerC; TestRadioDriverP.RadioPacket -> TimeStampingLayerC; TestRadioDriverP.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; TestRadioDriverP.Leds -> LedsC; // just to avoid a timer compilation bug components new TimerMilliC(); // -------- TimeStamping components new TimeStampingLayerC(); TimeStampingLayerC.LocalTimeRadio -> RadioDriverLayerC; TimeStampingLayerC.SubPacket -> MetadataFlagsLayerC; TimeStampingLayerC.TimeStampFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; // -------- MetadataFlags components new MetadataFlagsLayerC(); MetadataFlagsLayerC.SubPacket -> RadioDriverLayerC; // -------- RadioAlarm components new RadioAlarmC(); RadioAlarmC.Alarm -> RadioDriverLayerC; // -------- RadioDriver #if defined(PLATFORM_IRIS) || defined(PLATFORM_MULLE) || defined(PLATFORM_MESHBEAN) components RF230DriverLayerC as RadioDriverLayerC; components RF230RadioP as RadioP; #elif defined(PLATFORM_MESHBEAN900) components RF212DriverLayerC as RadioDriverLayerC; components RF212RadioP as RadioP; #elif defined(PLATFORM_MICAZ) || defined(PLATFORM_TELOSA) || defined(PLATFORM_TELOSB) components CC2420XDriverLayerC as RadioDriverLayerC; components CC2420XRadioP as RadioP; #elif defined(PLATFORM_UCMINI) components RFA1DriverLayerC as RadioDriverLayerC; components RFA1RadioP as RadioP; #elif defined(PLATFORM_UCDUAL) components Si443xDriverLayerC as RadioDriverLayerC; components Si443xRadioP as RadioP; #endif components RadioDriverConfigP; RadioDriverLayerC.PacketTimeStamp -> TimeStampingLayerC; RadioDriverLayerC.Config -> RadioDriverConfigP; RadioDriverLayerC.TransmitPowerFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.RSSIFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.TimeSyncFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; #if !defined(PLATFORM_UCMINI) RadioDriverLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; #endif } tinyos-2.1.2+dfsg/apps/tests/rfxlink/TestTransmit/TestRadioDriverP.nc000066400000000000000000000072661207233610700257330ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "Tasklet.h" #include "RadioAssert.h" #include "message.h" #include "RadioConfig.h" module TestRadioDriverP { uses { interface Boot; interface SplitControl; interface Leds; interface RadioState; interface RadioPacket; interface RadioAlarm; interface RadioSend; interface RadioReceive; } } implementation { tasklet_norace uint8_t failureCount; tasklet_norace uint8_t successCount; tasklet_norace uint8_t receiveCount; tasklet_norace uint8_t timerCount; message_t msgbuffer; event void Boot.booted() { error_t error; error = call SplitControl.start(); RADIO_ASSERT( error == SUCCESS ); } event void SplitControl.startDone(error_t error) { RADIO_ASSERT( error == SUCCESS ); error = call RadioState.turnOn(); RADIO_ASSERT( error == SUCCESS ); } event void SplitControl.stopDone(error_t error) { } tasklet_async event void RadioState.done() { call RadioPacket.clear(&msgbuffer); call RadioPacket.setPayloadLength(&msgbuffer, 2); RADIO_ASSERT( call RadioAlarm.isFree() ); call RadioAlarm.wait(1); } tasklet_norace tradio_size next; tasklet_async event void RadioAlarm.fired() { uint8_t *payload; error_t error; int32_t delay; next += SEND_INTERVAL * RADIO_ALARM_MICROSEC; atomic { delay = next - call RadioAlarm.getNow(); if( delay <= 0 ) delay = 1; call RadioAlarm.wait(delay); } RADIO_ASSERT( delay > 1 ); payload = ((void*)&msgbuffer) + call RadioPacket.headerLength(&msgbuffer); payload[0] = TOS_NODE_ID; payload[1] = ++timerCount; error = call RadioSend.send(&msgbuffer); if( error != SUCCESS ) { if( ++failureCount == 0 ) call Leds.led0Toggle(); } else { if( ++successCount == 0 ) call Leds.led1Toggle(); } } tasklet_async event void RadioSend.sendDone(error_t error) { RADIO_ASSERT( error == SUCCESS ); } tasklet_async event void RadioSend.ready() { } tasklet_async event bool RadioReceive.header(message_t* msg) { return TRUE; } tasklet_async event message_t* RadioReceive.receive(message_t* msg) { if( ++receiveCount == 0 ) call Leds.led2Toggle(); return msg; } } tinyos-2.1.2+dfsg/apps/tests/sam3/000077500000000000000000000000001207233610700167315ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/README000066400000000000000000000001621207233610700176100ustar00rootroot00000000000000This directory contains SAM3 specific test applications. For more details, see in the particular sub directories. tinyos-2.1.2+dfsg/apps/tests/sam3/TestADE7753/000077500000000000000000000000001207233610700205105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/TestADE7753/Makefile000066400000000000000000000006561207233610700221570ustar00rootroot00000000000000COMPONENT=TestADE7753AppC BUILD_EXTRA_DEPS = TestADE7753Msg.py CLEAN_EXTRA = TestADE7753Msg.py *.pyc TestADE7753Msg.py: TestADE7753.h mig python -target=$(PLATFORM) $(CFLAGS) -python-classname=TestADE7753Msg TestADE7753.h testade7753_msg -o $@ CFLAGS += -I$(TOSDIR)/chips/ade7753 CFLAGS += -DTOSH_DATA_LENGTH=100 #CFLAGS += -I$(TOSDIR)/lib/diagmsg #CFLAGS += -DDIAGMSG_RADIO #CFLAGS += -DDEBUG_ADE7753 include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/TestADE7753/README000066400000000000000000000020411207233610700213650ustar00rootroot00000000000000This is a test application that shows how to use the ADE7753 power metering chip. We assume that you use a Sam3s-ek evaluation development kit. You have to make the following modifications to the kit: - remove resistors: R26, R27, R28, R31, R33, R34, R35, R36, R37 (all on the top side near the serial DB9 USART connector) - remove capacitor C46 (on the bottom side, opposit of the Sam3s Chip footprint). - solder a wire to pin 74 of the Sam3s chip. Note that numbered through holes are provided for this! Connect the ADE775 chip as follows: - DVDD (5V) -> J12.1 - \RESET -> J12.2 - DIN -> PA13 - DOUT -> PA12 - SCLK -> PA14 - \CS -> PA22 - \IRQ -> PA21 - ZX -> PA0 (This is the wire you soldered to pin 74!) - GND -> Any GND pin, e.g. J12.37 Setup: Program one sam3s-ek board with the TestADE7753 application. Program a second node with a BaseStation. Run the logger script like this: python TestADE7753Logger.py sf@localhost:9002 We assume you are running a serial forwarder for the BaseStation mote. tinyos-2.1.2+dfsg/apps/tests/sam3/TestADE7753/SpiConfigC.nc000066400000000000000000000056401207233610700230230ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SPI Configuration for the Sam3s * * @author Thomas Schmid */ module SpiConfigC { provides { interface Init; interface ResourceConfigure; } uses { interface HplSam3SpiChipSelConfig; interface HplSam3SpiConfig; } } implementation { command error_t Init.init() { // configure clock call HplSam3SpiChipSelConfig.setBaud(20); call HplSam3SpiChipSelConfig.setClockPolarity(0); // logic zero is inactive call HplSam3SpiChipSelConfig.setClockPhase(1); // out on rising, in on falling call HplSam3SpiChipSelConfig.disableAutoCS(); // disable automatic rising of CS after each transfer //call HplSam3SpiChipSelConfig.enableAutoCS(); // if the CS line is not risen automatically after the last tx. The lastxfer bit has to be used. call HplSam3SpiChipSelConfig.enableCSActive(); //call HplSam3SpiChipSelConfig.disableCSActive(); call HplSam3SpiChipSelConfig.setBitsPerTransfer(SPI_CSR_BITS_8); call HplSam3SpiChipSelConfig.setTxDelay(0); call HplSam3SpiChipSelConfig.setClkDelay(0); return SUCCESS; } async command void ResourceConfigure.configure() { // Do stuff here } async command void ResourceConfigure.unconfigure() { // Do stuff here... } } tinyos-2.1.2+dfsg/apps/tests/sam3/TestADE7753/TestADE7753.h000066400000000000000000000034771207233610700224530ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #ifndef TESTADE7753_H #define TESTADE7753_H #define BUF_SIZE 10 typedef nx_struct testade7753_msg { nx_uint16_t counter; nx_uint32_t energy[BUF_SIZE]; } testade7753_msg_t; enum { AM_TESTADE7753_MSG = 7, }; #endif tinyos-2.1.2+dfsg/apps/tests/sam3/TestADE7753/TestADE7753AppC.nc000066400000000000000000000053601207233610700233610ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Test application for the ADE7753 chip. It implements a simple power meter * that retrieves the real energy from the ADE7753 chip once a second. * * @author Thomas Schmid * @date March 2011 */ #include "TestADE7753.h" configuration TestADE7753AppC {} implementation { components MainC, TestADE7753C as App, LedsC; components new AMSenderC(AM_TESTADE7753_MSG); components new AMReceiverC(AM_TESTADE7753_MSG); components new TimerMilliC(); components ActiveMessageC; App.Boot -> MainC.Boot; App.Receive -> AMReceiverC; App.AMSend -> AMSenderC; App.AMControl -> ActiveMessageC; App.Leds -> LedsC; App.MilliTimer -> TimerMilliC; App.Packet -> AMSenderC; components new Sam3Spi3C() as SpiC; components ACMeterC as Meter; Meter.SpiPacket -> SpiC; Meter.SpiResource -> SpiC; components SpiConfigC; SpiConfigC.Init <- SpiC; SpiConfigC.ResourceConfigure <- SpiC; SpiConfigC.HplSam3SpiChipSelConfig -> SpiC; components HplSam3sGeneralIOC as IO; Meter.CSN -> IO.PioA22; Meter.RelayIO -> IO.PioA23; App.MeterControl -> Meter; App.ReadEnergy -> Meter; App.RelayConfig -> Meter; App.GainConfig -> Meter; App.GetPeriod32 -> Meter; } tinyos-2.1.2+dfsg/apps/tests/sam3/TestADE7753/TestADE7753C.nc000066400000000000000000000111401207233610700227110ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid * @date March 2011 */ #include "Timer.h" #include "TestADE7753.h" #include "ACMeter.h" module TestADE7753C @safe() { uses { interface Leds; interface Boot; interface Receive; interface AMSend; interface Timer as MilliTimer; interface SplitControl as AMControl; interface Packet; interface SplitControl as MeterControl; interface ReadStream as ReadEnergy; interface GetSet as RelayConfig; interface GetSet as GainConfig; interface Get as GetPeriod32; } } implementation { message_t packet; bool locked; uint16_t counter = 0; uint32_t energyBuffer1[BUF_SIZE]; uint32_t energyBuffer2[BUF_SIZE]; uint32_t *currBuffer; event void Boot.booted() { call AMControl.start(); } event void AMControl.startDone(error_t err) { call MeterControl.start(); } void readEnergy() { // setup the buffers call ReadEnergy.postBuffer(energyBuffer1, BUF_SIZE); call ReadEnergy.postBuffer(energyBuffer2, BUF_SIZE); // setup the current buffer currBuffer = energyBuffer1; // start reading energy in 1s intervals call ReadEnergy.read(1000000); } event void MeterControl.startDone(error_t err) { readEnergy(); } event void AMControl.stopDone(error_t err) { // do nothing } event void MeterControl.stopDone(error_t err) { // do nothing } event void MilliTimer.fired() { } task void sendData() { uint8_t i; counter++; if (locked) { return; } else { testade7753_msg_t* rcm = (testade7753_msg_t*)call Packet.getPayload(&packet, sizeof(testade7753_msg_t)); if (rcm == NULL) { return; } // we can't do a memcopy because it's a newtork type! for(i=0; ienergy[i] = (int32_t)currBuffer[i]; // post the buffer again call ReadEnergy.postBuffer(currBuffer, BUF_SIZE); rcm->counter = counter; if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(testade7753_msg_t)) == SUCCESS) { dbg("TestADE7753C", "TestADE7753C: packet sent.\n", counter); locked = TRUE; } } } event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) { dbg("TestADE7753C", "TestADE7753 packet of length %hhu.\n", len); if (len != sizeof(testade7753_msg_t)) {return bufPtr;} else { //testade7753_msg_t* rcm = (testade7753_msg_t*)payload; return bufPtr; } } event void AMSend.sendDone(message_t* bufPtr, error_t error) { if (&packet == bufPtr) { locked = FALSE; } } event void ReadEnergy.bufferDone(error_t result, uint32_t* buf, uint16_t count) { // do something with the buffer here call Leds.led0Toggle(); currBuffer = buf; post sendData(); } event void ReadEnergy.readDone(error_t result, uint32_t usActualPeriod) { // we should never get here... it would be really bad as we loose samples! // Just in case, start energy reading again. readEnergy(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/TestADE7753/TestADE7753Logger.py000066400000000000000000000017411207233610700240040ustar00rootroot00000000000000import sys import os import time import struct #tos stuff import TestADE7753Msg from tinyos.message import * from tinyos.message.Message import * from tinyos.message.SerialPacket import * from tinyos.packet.Serial import Serial class DataLogger: def __init__(self, motestring): self.mif = MoteIF.MoteIF() self.tos_source = self.mif.addSource(motestring) self.mif.addListener(self, TestADE7753Msg.TestADE7753Msg) def receive(self, src, msg): if msg.get_amType() == TestADE7753Msg.AM_TYPE: m = TestADE7753Msg.TestADE7753Msg(msg.dataGet()) print time.time(), m def main_loop(self): while 1: time.sleep(1) def main(): if '-h' in sys.argv: print "Usage:", sys.argv[0], "sf@localhost:9002" sys.exit() dl = DataLogger(sys.argv[1]) dl.main_loop() # don't expect this to return... if __name__ == "__main__": try: main() except KeyboardInterrupt: pass tinyos-2.1.2+dfsg/apps/tests/sam3/TestMpu/000077500000000000000000000000001207233610700203325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/TestMpu/Makefile000066400000000000000000000000531207233610700217700ustar00rootroot00000000000000COMPONENT=TestMpuAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/TestMpu/TestMpuAppC.nc000066400000000000000000000035641207233610700230310ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic application to test the MPU and the corresponding exception. * * @author Wanja Hofer **/ configuration TestMpuAppC { } implementation { components MainC, TestMpuC, LedsC, HplSam3uMpuC; TestMpuC -> MainC.Boot; TestMpuC.Leds -> LedsC; TestMpuC.HplSam3uMpu -> HplSam3uMpuC; } tinyos-2.1.2+dfsg/apps/tests/sam3/TestMpu/TestMpuC.nc000066400000000000000000000112121207233610700223550ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic application to test the MPU and the corresponding exception. * * @author Wanja Hofer **/ // choose exactly one of the following #define TEST_WRITE_PROTECTION //#define TEST_EXECUTE_PROTECTION // choose exactly one of the following #define PROTECTED //#define UNPROTECTED /* Running either one of the write/execute tests *with* protection should first light up LED 0 (green), * then LED 2 (red) to indicate an MPU fault. LED 1 (green) should not light up, * since that would indicate a successful write/execution despite MPU protection. * Running either one of the write/execute tests *without* protection should first light up LED 0 (green), * then LED 1 (green) to indicate a successful write/execution. LED 2 (red) should not light up, * since that would indicate an MPU fault. */ /* Caveat: currently, the linker ignores the alignment for the function and spits out * warning: `aligned' attribute directive ignored * When setting up the region, the function address is aligned, and the first instruction of the function * will be protected, triggering the trap if protected. */ typedef struct { uint32_t word1; uint32_t word2; uint32_t word3; uint32_t word4; uint32_t word5; uint32_t word6; uint32_t word7; uint32_t word8; } struct32bytes; volatile struct32bytes __attribute__((aligned(32))) structure; // 32 bytes aligned void __attribute__((noinline)) __attribute__((aligned(32))) protected(); void protected() { volatile int i = 0; for (; i < 50; i++); } module TestMpuC { uses interface Leds; uses interface Boot; uses interface HplSam3uMpu; } implementation { void fatal(); event void Boot.booted() { // setup MPU call HplSam3uMpu.enableDefaultBackgroundRegion(); call HplSam3uMpu.disableMpuDuringHardFaults(); // first iteration should be successful, MPU not yet active #ifdef TEST_WRITE_PROTECTION structure.word1 = 13; #endif #ifdef TEST_EXECUTE_PROTECTION protected(); #endif call Leds.led0On(); // LED 0: successful write/execute (should always happen) #ifdef TEST_WRITE_PROTECTION #ifdef PROTECTED // activate MPU and write-protect structure if ((call HplSam3uMpu.setupRegion(0, TRUE, (void *) &structure, 32, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, 0)) == FAIL) { fatal(); } #endif #endif #ifdef TEST_EXECUTE_PROTECTION #ifdef PROTECTED // activate MPU and execute-protect protected() if ((call HplSam3uMpu.setupRegion(0, TRUE, (void *) (((uint32_t) &protected) & (~ (32 - 1))), 32, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, 0)) == FAIL) { // aligned fatal(); } #endif #endif #ifdef PROTECTED call HplSam3uMpu.enableMpu(); #endif #ifdef TEST_WRITE_PROTECTION structure.word1 = 42; #endif #ifdef TEST_EXECUTE_PROTECTION protected(); #endif call Leds.led1On(); // LED 1: successful protected write/execute (should not happen if protected) while(1); } void fatal() { while(1) { volatile int i; for (i = 0; i < 100000; i++); call Leds.led2Toggle(); // Led 2 (red) blinking: fatal } } async event void HplSam3uMpu.mpuFault() { call Leds.led2On(); // LED 2 (red): MPU fault while(1); } } tinyos-2.1.2+dfsg/apps/tests/sam3/TestSvc/000077500000000000000000000000001207233610700203245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/TestSvc/Makefile000066400000000000000000000000531207233610700217620ustar00rootroot00000000000000COMPONENT=TestSvcAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/TestSvc/TestSvcAppC.nc000066400000000000000000000035311207233610700230070ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Minimal app to test the svc instruction on the SAM3U and the * dispatching of its arguments. * * @author Wanja Hofer */ configuration TestSvcAppC { } implementation { components MainC, TestSvcC, LedsC; TestSvcC -> MainC.Boot; TestSvcC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/sam3/TestSvc/TestSvcC.nc000066400000000000000000000060751207233610700223540ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Minimal app to test the svc instruction on the SAM3U and the * dispatching of its arguments. * * @author Wanja Hofer */ module TestSvcC { uses interface Leds; uses interface Boot; } implementation { error_t syscall(uint8_t id, uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3) { volatile uint32_t result; //__nesc_disable_interrupt(); // svc cannot be called with IRQs disabled asm volatile("mov r0, %0" : : "r" (p0)); asm volatile("mov r1, %0" : : "r" (p1)); asm volatile("mov r2, %0" : : "r" (p2)); asm volatile("mov r3, %0" : : "r" (p3)); asm volatile("svc %0" : : "i" (id)); // result is in r0 asm volatile("mov %0, r0" : "=r" (result)); return result; } event void Boot.booted() { volatile uint32_t result = syscall(0x42, 0x00, 0x11, 0x22, 0x33); result++; while(1); return; } void ActualSVCallHandler(uint32_t *args) @C() @spontaneous() { volatile uint32_t svc_id; volatile uint32_t svc_r0; volatile uint32_t svc_r1; volatile uint32_t svc_r2; volatile uint32_t svc_r3; svc_id = ((uint8_t *) args[6])[-2]; svc_r0 = ((uint32_t) args[0]); svc_r1 = ((uint32_t) args[1]); svc_r2 = ((uint32_t) args[2]); svc_r3 = ((uint32_t) args[3]); args[0] = 0x23; return; } void SVCallHandler() @C() @spontaneous() __attribute__((naked)) { asm volatile( "tst lr, #4\n" "ite eq\n" "mrseq r0, msp\n" "mrsne r0, psp\n" "b ActualSVCallHandler\n" ); // return from ActualSVCallHandler() returns to svc call site (through lr) } } tinyos-2.1.2+dfsg/apps/tests/sam3/TestUart/000077500000000000000000000000001207233610700205045ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/TestUart/Makefile000066400000000000000000000000541207233610700221430ustar00rootroot00000000000000COMPONENT=TestUartAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/TestUart/TestUartAppC.nc000066400000000000000000000041521207233610700233470ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic application that tests the SAM3U UART. * * @author Wanja Hofer **/ configuration TestUartAppC { } implementation { components MainC, TestUartC, LedsC; TestUartC -> MainC.Boot; TestUartC.Leds -> LedsC; components HplNVICC; #if defined(PLATFORM_SAM3U_EK) TestUartC.UartIrqControl -> HplNVICC.DBGUInterrupt; #else TestUartC.UartIrqControl -> HplNVICC.UART0Interrupt; #endif components HilSam3UartC; TestUartC.UartControl -> HilSam3UartC; TestUartC.UartByte -> HilSam3UartC; TestUartC.UartStream -> HilSam3UartC; } tinyos-2.1.2+dfsg/apps/tests/sam3/TestUart/TestUartC.nc000066400000000000000000000054301207233610700227060ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic application that tests the SAM3U UART. * * @author Wanja Hofer **/ module TestUartC { uses interface Leds; uses interface Boot; uses interface HplNVICInterruptCntl as UartIrqControl; uses interface StdControl as UartControl; uses interface UartByte; uses interface UartStream; } implementation { uint8_t buffer[10]; task void sendTask(); task void receiveTask(); event void Boot.booted() { call UartIrqControl.configure(0xff); call UartIrqControl.enable(); call UartControl.start(); // __nesc_enable_interrupt(); post receiveTask(); } task void receiveTask() { call UartStream.receive(buffer, 10); } async event void UartStream.receiveDone(uint8_t* buf, uint16_t len, error_t error) { call Leds.led0Toggle(); // Led 0 (green) = received something post sendTask(); } task void sendTask() { // send out received buffer call UartStream.send(buffer, 10); } async event void UartStream.sendDone(uint8_t* buf, uint16_t len, error_t error) { call Leds.led1Toggle(); // Led 1 (green) = sent something post receiveTask(); } async event void UartStream.receivedByte(uint8_t byte) { call Leds.led2Toggle(); // Led 2 (red) = received something w/o a buffer } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/000077500000000000000000000000001207233610700174605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReader/000077500000000000000000000000001207233610700212725ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReader/AdcReaderC.nc000066400000000000000000000035771207233610700235450ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ configuration AdcReaderC { provides interface Read; } implementation { components new AdcReadClientC(), AdcReaderP; Read = AdcReadClientC; AdcReadClientC.AdcConfigure -> AdcReaderP; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReader/AdcReaderP.nc000066400000000000000000000055751207233610700235620ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ #include "sam3sadchardware.h" module AdcReaderP { provides interface AdcConfigure; } implementation { const sam3s_adc_channel_config_t config = { channel : 5, trgen : 0, // 0: trigger disabled trgsel : 0, // 0: external trigger lowres : 0, // 0: 12-bit sleep : 0, // 0: normal, adc core and vref are kept on between conversions fwup : 0, // 0: normal, sleep mode is defined by sleep bit freerun : 0, // 0: normal mode, wait for trigger prescal : 2, // ADCClock = MCK / ((prescal + 1)*2) startup : 7, // 112 periods of ADCClock settling : 1, // 5 periods of ADCClock anach : 0, // 0: no analog changed on channel switching tracktim : 1, // Tracking Time = (tracktim + 1) * ADCClock periods transfer : 1, // Transfer Period = (transfer*1+3) * ADCClock periods useq : 0, // 0: normal, converts channel in sequence ibctl : 1, diff : 0, gain : 0, offset : 0, }; async command const sam3s_adc_channel_config_t* AdcConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReader/Makefile000066400000000000000000000002341207233610700227310ustar00rootroot00000000000000COMPONENT=MoteAppC CFLAGS += -DTOSH_DATA_LENGTH=114 CFLAGS += -DTFRAME_ENABLED #CFLAGS+=-I$(TOSDIR)/lib/printf CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReader/MoteAppC.nc000066400000000000000000000041561207233610700232720ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC Read with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ configuration MoteAppC {} implementation { components MainC, LedsC, NoLedsC, new TimerMilliC() as TimerC, SerialActiveMessageC, AdcReaderC, LcdC, MoteP; MoteP.Boot -> MainC; MoteP.Leds -> LedsC; MoteP.Read -> AdcReaderC; MoteP.SerialSplitControl -> SerialActiveMessageC; MoteP.Packet -> SerialActiveMessageC; MoteP.Timer -> TimerC; MoteP.Lcd -> LcdC; MoteP.Draw -> LcdC; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReader/MoteP.nc000066400000000000000000000064611207233610700226470ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC Read with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ #include #include module MoteP { uses { interface Boot; interface Leds; interface Read; interface SplitControl as SerialSplitControl; interface Packet; interface Timer; interface Lcd; interface Draw; } } implementation { event void Boot.booted() { while (call SerialSplitControl.start() != SUCCESS); call Lcd.initialize(); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { } else { call Draw.fill(COLOR_RED); call Lcd.start(); } } event void Lcd.startDone(){ } event void SerialSplitControl.startDone(error_t error) { if (error != SUCCESS) { while (call SerialSplitControl.start() != SUCCESS); }else{ call Timer.startPeriodic(256); } } event void SerialSplitControl.stopDone(error_t error) {} task void sample() { const char *start = "Start Sampling"; call Leds.led0Toggle(); call Draw.fill(COLOR_BLUE); call Draw.drawString(10,50,start,COLOR_RED); if(call Read.read() != SUCCESS) { const char *fail = "Read Failed"; call Draw.drawString(10,70, fail, COLOR_RED); } } event void Read.readDone(error_t result, uint16_t value) { const char *fail = "Read done error"; const char *good = "Read done success"; call Draw.fill(COLOR_GREEN); if (result != SUCCESS) { call Draw.drawString(10,70,fail,COLOR_BLACK); }else{ call Draw.drawString(10,70,good,COLOR_BLACK); call Draw.drawInt(100,100,value,1,COLOR_BLACK); } } event void Timer.fired() { post sample(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderNow/000077500000000000000000000000001207233610700217565ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderNow/AdcReaderC.nc000066400000000000000000000037151207233610700242230ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ configuration AdcReaderC { provides interface ReadNow; provides interface Resource; } implementation { components new AdcReadNowClientC(), AdcReaderP; ReadNow = AdcReadNowClientC; Resource = AdcReadNowClientC; AdcReadNowClientC.AdcConfigure -> AdcReaderP; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderNow/AdcReaderP.nc000066400000000000000000000055751207233610700242460ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ #include "sam3sadchardware.h" module AdcReaderP { provides interface AdcConfigure; } implementation { const sam3s_adc_channel_config_t config = { channel : 5, trgen : 0, // 0: trigger disabled trgsel : 0, // 0: external trigger lowres : 0, // 0: 12-bit sleep : 0, // 0: normal, adc core and vref are kept on between conversions fwup : 0, // 0: normal, sleep mode is defined by sleep bit freerun : 0, // 0: normal mode, wait for trigger prescal : 2, // ADCClock = MCK / ((prescal + 1)*2) startup : 7, // 112 periods of ADCClock settling : 1, // 5 periods of ADCClock anach : 0, // 0: no analog changed on channel switching tracktim : 1, // Tracking Time = (tracktim + 1) * ADCClock periods transfer : 1, // Transfer Period = (transfer*1+3) * ADCClock periods useq : 0, // 0: normal, converts channel in sequence ibctl : 1, diff : 0, gain : 0, offset : 0, }; async command const sam3s_adc_channel_config_t* AdcConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderNow/Makefile000066400000000000000000000001741207233610700234200ustar00rootroot00000000000000COMPONENT=MoteAppC CFLAGS += -DTOSH_DATA_LENGTH=114 CFLAGS += -DTFRAME_ENABLED CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderNow/MoteAppC.nc000066400000000000000000000042251207233610700237530ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC ReadNow with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ configuration MoteAppC {} implementation { components MainC, LedsC, NoLedsC, new TimerMilliC() as TimerC, SerialActiveMessageC, AdcReaderC, LcdC, MoteP; MoteP.Boot -> MainC; MoteP.Leds -> NoLedsC; MoteP.ReadNow -> AdcReaderC; MoteP.Resource -> AdcReaderC; MoteP.SerialSplitControl -> SerialActiveMessageC; MoteP.Packet -> SerialActiveMessageC; MoteP.Timer -> TimerC; MoteP.Lcd -> LcdC; MoteP.Draw -> LcdC; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderNow/MoteP.nc000066400000000000000000000073021207233610700233260ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC ReadNow with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ //#include "sam3uDmahardware.h" #include #include module MoteP { uses { interface Boot; interface Leds; interface ReadNow; interface Resource; interface SplitControl as SerialSplitControl; interface Packet; interface Timer; interface Lcd; interface Draw; } } implementation { norace error_t resultError; norace uint16_t resultValue; event void Boot.booted() { while (call SerialSplitControl.start() != SUCCESS); call Lcd.initialize(); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { } else { call Draw.fill(COLOR_RED); call Lcd.start(); } } event void Lcd.startDone(){ call Timer.startPeriodic(512); } event void SerialSplitControl.startDone(error_t error) { if (error != SUCCESS) { while (call SerialSplitControl.start() != SUCCESS); } } event void SerialSplitControl.stopDone(error_t error) {} task void sample() { const char *start = "Start Sampling"; //call Draw.fill(COLOR_BLUE); call Draw.drawString(10,50,start,COLOR_BLACK); call Resource.request(); } event void Resource.granted(){ /* FOR dma testing ONLY*//* DMAC->saddr0.bits.saddrx = (uint32_t) 0x20180000; call Draw.fill(COLOR_GREEN); call Draw.drawInt(100, 100, DMAC->saddr0.bits.saddrx, 1, COLOR_BLACK); */ call ReadNow.read(); } task void drawResult(){ const char *fail = "Read done error"; const char *good = "Read done success"; call Draw.fill(COLOR_GREEN); if (resultError != SUCCESS) { atomic call Draw.drawString(10,70,fail,COLOR_BLACK); }else{ call Draw.drawString(10,70,good,COLOR_BLACK); call Draw.drawInt(100,100,resultValue,1,COLOR_BLACK); } } async event void ReadNow.readDone(error_t error, uint16_t value) { atomic resultError = error; atomic resultValue = value; post drawResult(); } event void Timer.fired() { post sample(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderStream/000077500000000000000000000000001207233610700224465ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderStream/AdcReaderC.nc000066400000000000000000000036351207233610700247140ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ configuration AdcReaderC { provides interface ReadStream; } implementation { components new AdcReadStreamClientC(), AdcReaderP; ReadStream = AdcReadStreamClientC; AdcReadStreamClientC.AdcConfigure -> AdcReaderP; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderStream/AdcReaderP.nc000066400000000000000000000055751207233610700247360ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ #include "sam3sadchardware.h" module AdcReaderP { provides interface AdcConfigure; } implementation { const sam3s_adc_channel_config_t config = { channel : 5, trgen : 0, // 0: trigger disabled trgsel : 0, // 0: external trigger lowres : 0, // 0: 12-bit sleep : 0, // 0: normal, adc core and vref are kept on between conversions fwup : 0, // 0: normal, sleep mode is defined by sleep bit freerun : 0, // 0: normal mode, wait for trigger prescal : 2, // ADCClock = MCK / ((prescal + 1)*2) startup : 7, // 112 periods of ADCClock settling : 1, // 5 periods of ADCClock anach : 0, // 0: no analog changed on channel switching tracktim : 1, // Tracking Time = (tracktim + 1) * ADCClock periods transfer : 1, // Transfer Period = (transfer*1+3) * ADCClock periods useq : 0, // 0: normal, converts channel in sequence ibctl : 1, diff : 0, gain : 0, offset : 0, }; async command const sam3s_adc_channel_config_t* AdcConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderStream/Makefile000066400000000000000000000002331207233610700241040ustar00rootroot00000000000000COMPONENT=MoteAppC CFLAGS += -DTOSH_DATA_LENGTH=114 CFLAGS += -DTFRAME_ENABLED #CFLAGS += -DSAM3U_ADC12B_PDC CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderStream/MoteAppC.nc000066400000000000000000000041711207233610700244430ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC ReadStream with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ configuration MoteAppC {} implementation { components MainC, LedsC, NoLedsC, new TimerMilliC() as TimerC, SerialActiveMessageC, AdcReaderC, LcdC, MoteP; MoteP.Boot -> MainC; MoteP.Leds -> LedsC; MoteP.ReadStream -> AdcReaderC; MoteP.SerialSplitControl -> SerialActiveMessageC; MoteP.Packet -> SerialActiveMessageC; MoteP.Timer -> TimerC; MoteP.Lcd -> LcdC; MoteP.Draw -> LcdC; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderStream/MoteP.nc000066400000000000000000000101651207233610700240170ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC ReadStream with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ #include #include #define SAMPLE_BUFFER_SIZE BOARD_LCD_WIDTH #define NUM_SAMPLES_PER_PACKET (TOSH_DATA_LENGTH / sizeof(uint16_t)) module MoteP { uses { interface Boot; interface Leds; interface ReadStream; interface SplitControl as SerialSplitControl; interface Packet; interface Timer; interface Lcd; interface Draw; } } implementation { uint16_t buf[SAMPLE_BUFFER_SIZE]; task void clear(){ /* Reset the target buffer for the ReadStream interface */ uint32_t i; for (i = 0; i < SAMPLE_BUFFER_SIZE; i++) { buf[i] = 0xFFFF; } } event void Boot.booted() { post clear(); while (call SerialSplitControl.start() != SUCCESS); call Lcd.initialize(); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { } else { call Draw.fill(COLOR_RED); call Lcd.start(); } } event void Lcd.startDone(){ } task void sample() { //const char *start = "Start Sampling"; //call Draw.fill(COLOR_BLUE); //call Draw.drawString(10,50,start,COLOR_RED); call ReadStream.postBuffer(buf, SAMPLE_BUFFER_SIZE); call ReadStream.read(10000); } event void SerialSplitControl.startDone(error_t error) { if (error != SUCCESS) { while (call SerialSplitControl.start() != SUCCESS); }else{ //call Timer.startPeriodic(5*1024U); post sample(); } } event void SerialSplitControl.stopDone(error_t error) {} event void ReadStream.readDone(error_t result, uint32_t usActualPeriod) { if (result != SUCCESS) { }else{ } } event void ReadStream.bufferDone(error_t result, uint16_t* buffer, uint16_t count) { const char *fail = "Read done error"; const char *good = "Read done success"; call Leds.led1Toggle(); call Draw.fill(COLOR_GREEN); if (result != SUCCESS) { call Draw.drawString(10,70,fail,COLOR_BLACK); }else{ uint16_t i; call Draw.drawString(10,70,good,COLOR_BLACK); call Draw.drawInt(100,100,buffer[0],1,COLOR_BLACK); call Draw.drawInt(200,100,count,1,COLOR_BLACK); for(i=0; i; } implementation { components new AdcReadStreamClientC(), AdcReaderP; ReadStream = AdcReadStreamClientC; AdcReadStreamClientC.AdcConfigure -> AdcReaderP; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderStreamPDC/AdcReaderP.nc000066400000000000000000000055751207233610700252650ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ #include "sam3sadchardware.h" module AdcReaderP { provides interface AdcConfigure; } implementation { const sam3s_adc_channel_config_t config = { channel : 5, trgen : 0, // 0: trigger disabled trgsel : 0, // 0: external trigger lowres : 0, // 0: 12-bit sleep : 0, // 0: normal, adc core and vref are kept on between conversions fwup : 0, // 0: normal, sleep mode is defined by sleep bit freerun : 0, // 0: normal mode, wait for trigger prescal : 2, // ADCClock = MCK / ((prescal + 1)*2) startup : 7, // 112 periods of ADCClock settling : 1, // 5 periods of ADCClock anach : 0, // 0: no analog changed on channel switching tracktim : 1, // Tracking Time = (tracktim + 1) * ADCClock periods transfer : 1, // Transfer Period = (transfer*1+3) * ADCClock periods useq : 0, // 0: normal, converts channel in sequence ibctl : 1, diff : 0, gain : 0, offset : 0, }; async command const sam3s_adc_channel_config_t* AdcConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderStreamPDC/Makefile000066400000000000000000000002271207233610700244360ustar00rootroot00000000000000COMPONENT=MoteAppC CFLAGS += -DTOSH_DATA_LENGTH=114 CFLAGS += -DTFRAME_ENABLED CFLAGS += -DSAM3S_ADC_PDC CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderStreamPDC/MoteAppC.nc000066400000000000000000000041731207233610700247740ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC ReadStream with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ configuration MoteAppC {} implementation { components MainC, LedsC, NoLedsC, new TimerMilliC() as TimerC, SerialActiveMessageC, AdcReaderC, LcdC, MoteP; MoteP.Boot -> MainC; MoteP.Leds -> NoLedsC; MoteP.ReadStream -> AdcReaderC; MoteP.SerialSplitControl -> SerialActiveMessageC; MoteP.Packet -> SerialActiveMessageC; MoteP.Timer -> TimerC; MoteP.Lcd -> LcdC; MoteP.Draw -> LcdC; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc/AdcReaderStreamPDC/MoteP.nc000066400000000000000000000101011207233610700243340ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC ReadStream with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ #include #include #define SAMPLE_BUFFER_SIZE BOARD_LCD_WIDTH #define NUM_SAMPLES_PER_PACKET (TOSH_DATA_LENGTH / sizeof(uint16_t)) module MoteP { uses { interface Boot; interface Leds; interface ReadStream; interface SplitControl as SerialSplitControl; interface Packet; interface Timer; interface Lcd; interface Draw; } } implementation { uint16_t buf[SAMPLE_BUFFER_SIZE]; task void clear(){ /* Reset the target buffer for the ReadStream interface */ uint32_t i; for (i = 0; i < SAMPLE_BUFFER_SIZE; i++) { buf[i] = 0xFFFF; } } event void Boot.booted() { post clear(); while (call SerialSplitControl.start() != SUCCESS); call Lcd.initialize(); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { } else { call Draw.fill(COLOR_RED); call Lcd.start(); } } event void Lcd.startDone(){ } task void sample() { const char *start = "Start Sampling"; call Draw.fill(COLOR_BLUE); call Draw.drawString(10,50,start,COLOR_RED); call ReadStream.postBuffer(buf, SAMPLE_BUFFER_SIZE); call ReadStream.read(10000); } event void SerialSplitControl.startDone(error_t error) { if (error != SUCCESS) { while (call SerialSplitControl.start() != SUCCESS); }else{ //call Timer.startPeriodic(5*1024U); post clear(); post sample(); } } event void SerialSplitControl.stopDone(error_t error) {} event void ReadStream.readDone(error_t result, uint32_t usActualPeriod) { if (result != SUCCESS) { }else{ } } event void ReadStream.bufferDone(error_t result, uint16_t* buffer, uint16_t count) { const char *fail = "Read done error"; const char *good = "Read done success"; call Leds.led1Toggle(); call Draw.fill(COLOR_GREEN); if (result != SUCCESS) { call Draw.drawString(10,70,fail,COLOR_BLACK); }else{ uint16_t i; call Draw.drawString(10,70,good,COLOR_BLACK); call Draw.drawInt(100,100,buffer[0],1,COLOR_BLACK); call Draw.drawInt(200,100,count,1,COLOR_BLACK); for(i=0; i @author Thomas Schmid To use PDC with ADC, the sampling rate MUST be controlled by properly setting the startup, prescal and lowres registers. Setting the sam3s_adc_channel_config_t config can properly set these registers. tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/000077500000000000000000000000001207233610700177655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReader/000077500000000000000000000000001207233610700215775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReader/AdcReaderC.nc000066400000000000000000000035771207233610700240520ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ configuration AdcReaderC { provides interface Read; } implementation { components new AdcReadClientC(), AdcReaderP; Read = AdcReadClientC; AdcReadClientC.AdcConfigure -> AdcReaderP; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReader/AdcReaderP.nc000066400000000000000000000041541207233610700240570ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" module AdcReaderP { provides interface AdcConfigure; } implementation { const sam3u_adc12_channel_config_t config = { channel: 0, diff: 0, prescal: 2, lowres: 0, shtim: 15, ibctl: 1, sleep: 0, startup: 104, trgen: 0, trgsel: 0 }; async command const sam3u_adc12_channel_config_t* AdcConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReader/Makefile000066400000000000000000000002341207233610700232360ustar00rootroot00000000000000COMPONENT=MoteAppC CFLAGS += -DTOSH_DATA_LENGTH=114 CFLAGS += -DTFRAME_ENABLED #CFLAGS+=-I$(TOSDIR)/lib/printf CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReader/MoteAppC.nc000066400000000000000000000041601207233610700235720ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC Read with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ configuration MoteAppC {} implementation { components MainC, LedsC, NoLedsC, new TimerMilliC() as TimerC, SerialActiveMessageC, AdcReaderC, LcdC, MoteP; MoteP.Boot -> MainC; MoteP.Leds -> NoLedsC; MoteP.Read -> AdcReaderC; MoteP.SerialSplitControl -> SerialActiveMessageC; MoteP.Packet -> SerialActiveMessageC; MoteP.Timer -> TimerC; MoteP.Lcd -> LcdC; MoteP.Draw -> LcdC; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReader/MoteP.nc000066400000000000000000000063021207233610700231460ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC Read with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ #include #include module MoteP { uses { interface Boot; interface Leds; interface Read; interface SplitControl as SerialSplitControl; interface Packet; interface Timer; interface Lcd; interface Draw; } } implementation { event void Boot.booted() { while (call SerialSplitControl.start() != SUCCESS); call Lcd.initialize(); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { } else { call Draw.fill(COLOR_RED); call Lcd.start(); } } event void Lcd.startDone(){ } event void SerialSplitControl.startDone(error_t error) { if (error != SUCCESS) { while (call SerialSplitControl.start() != SUCCESS); }else{ call Timer.startPeriodic(512); } } event void SerialSplitControl.stopDone(error_t error) {} task void sample() { const char *start = "Start Sampling"; call Leds.led0Toggle(); call Draw.fill(COLOR_BLUE); call Draw.drawString(10,50,start,COLOR_RED); call Read.read(); } event void Read.readDone(error_t result, uint16_t value) { const char *fail = "Read done error"; const char *good = "Read done success"; call Draw.fill(COLOR_GREEN); if (result != SUCCESS) { call Draw.drawString(10,70,fail,COLOR_BLACK); }else{ call Draw.drawString(10,70,good,COLOR_BLACK); call Draw.drawInt(100,100,value,1,COLOR_BLACK); } } event void Timer.fired() { post sample(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderNow/000077500000000000000000000000001207233610700222635ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderNow/AdcReaderC.nc000066400000000000000000000037151207233610700245300ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ configuration AdcReaderC { provides interface ReadNow; provides interface Resource; } implementation { components new AdcReadNowClientC(), AdcReaderP; ReadNow = AdcReadNowClientC; Resource = AdcReadNowClientC; AdcReadNowClientC.AdcConfigure -> AdcReaderP; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderNow/AdcReaderP.nc000066400000000000000000000041551207233610700245440ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" module AdcReaderP { provides interface AdcConfigure; } implementation { const sam3u_adc12_channel_config_t config = { channel: 0, diff: 0, prescal: 2, lowres: 0, shtim: 15, ibctl: 1, sleep: 0, startup: 104, trgen: 0, trgsel: 0 }; async command const sam3u_adc12_channel_config_t* AdcConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderNow/Makefile000066400000000000000000000001741207233610700237250ustar00rootroot00000000000000COMPONENT=MoteAppC CFLAGS += -DTOSH_DATA_LENGTH=114 CFLAGS += -DTFRAME_ENABLED CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderNow/MoteAppC.nc000066400000000000000000000042251207233610700242600ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC ReadNow with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ configuration MoteAppC {} implementation { components MainC, LedsC, NoLedsC, new TimerMilliC() as TimerC, SerialActiveMessageC, AdcReaderC, LcdC, MoteP; MoteP.Boot -> MainC; MoteP.Leds -> NoLedsC; MoteP.ReadNow -> AdcReaderC; MoteP.Resource -> AdcReaderC; MoteP.SerialSplitControl -> SerialActiveMessageC; MoteP.Packet -> SerialActiveMessageC; MoteP.Timer -> TimerC; MoteP.Lcd -> LcdC; MoteP.Draw -> LcdC; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderNow/MoteP.nc000066400000000000000000000073001207233610700236310ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC ReadNow with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ #include "sam3uDmahardware.h" #include #include module MoteP { uses { interface Boot; interface Leds; interface ReadNow; interface Resource; interface SplitControl as SerialSplitControl; interface Packet; interface Timer; interface Lcd; interface Draw; } } implementation { norace error_t resultError; norace uint16_t resultValue; event void Boot.booted() { while (call SerialSplitControl.start() != SUCCESS); call Lcd.initialize(); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { } else { call Draw.fill(COLOR_RED); call Lcd.start(); } } event void Lcd.startDone(){ call Timer.startPeriodic(512); } event void SerialSplitControl.startDone(error_t error) { if (error != SUCCESS) { while (call SerialSplitControl.start() != SUCCESS); } } event void SerialSplitControl.stopDone(error_t error) {} task void sample() { const char *start = "Start Sampling"; //call Draw.fill(COLOR_BLUE); call Draw.drawString(10,50,start,COLOR_BLACK); call Resource.request(); } event void Resource.granted(){ /* FOR dma testing ONLY*//* DMAC->saddr0.bits.saddrx = (uint32_t) 0x20180000; call Draw.fill(COLOR_GREEN); call Draw.drawInt(100, 100, DMAC->saddr0.bits.saddrx, 1, COLOR_BLACK); */ call ReadNow.read(); } task void drawResult(){ const char *fail = "Read done error"; const char *good = "Read done success"; call Draw.fill(COLOR_GREEN); if (resultError != SUCCESS) { atomic call Draw.drawString(10,70,fail,COLOR_BLACK); }else{ call Draw.drawString(10,70,good,COLOR_BLACK); call Draw.drawInt(100,100,resultValue,1,COLOR_BLACK); } } async event void ReadNow.readDone(error_t error, uint16_t value) { atomic resultError = error; atomic resultValue = value; post drawResult(); } event void Timer.fired() { post sample(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderStream/000077500000000000000000000000001207233610700227535ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderStream/AdcReaderC.nc000066400000000000000000000036351207233610700252210ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ configuration AdcReaderC { provides interface ReadStream; } implementation { components new AdcReadStreamClientC(), AdcReaderP; ReadStream = AdcReadStreamClientC; AdcReadStreamClientC.AdcConfigure -> AdcReaderP; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderStream/AdcReaderP.nc000066400000000000000000000041541207233610700252330ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" module AdcReaderP { provides interface AdcConfigure; } implementation { const sam3u_adc12_channel_config_t config = { channel: 0, diff: 0, prescal: 2, lowres: 0, shtim: 15, ibctl: 1, sleep: 0, startup: 104, trgen: 0, trgsel: 0 }; async command const sam3u_adc12_channel_config_t* AdcConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderStream/Makefile000066400000000000000000000002331207233610700244110ustar00rootroot00000000000000COMPONENT=MoteAppC CFLAGS += -DTOSH_DATA_LENGTH=114 CFLAGS += -DTFRAME_ENABLED #CFLAGS += -DSAM3U_ADC12B_PDC CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderStream/MoteAppC.nc000066400000000000000000000041711207233610700247500ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC ReadStream with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ configuration MoteAppC {} implementation { components MainC, LedsC, NoLedsC, new TimerMilliC() as TimerC, SerialActiveMessageC, AdcReaderC, LcdC, MoteP; MoteP.Boot -> MainC; MoteP.Leds -> LedsC; MoteP.ReadStream -> AdcReaderC; MoteP.SerialSplitControl -> SerialActiveMessageC; MoteP.Packet -> SerialActiveMessageC; MoteP.Timer -> TimerC; MoteP.Lcd -> LcdC; MoteP.Draw -> LcdC; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderStream/MoteP.nc000066400000000000000000000075571207233610700243370ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC ReadStream with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ #include #include #define SAMPLE_BUFFER_SIZE 10000 #define NUM_SAMPLES_PER_PACKET (TOSH_DATA_LENGTH / sizeof(uint16_t)) module MoteP { uses { interface Boot; interface Leds; interface ReadStream; interface SplitControl as SerialSplitControl; interface Packet; interface Timer; interface Lcd; interface Draw; } } implementation { uint16_t buf[SAMPLE_BUFFER_SIZE]; task void clear(){ /* Reset the target buffer for the ReadStream interface */ uint32_t i; for (i = 0; i < SAMPLE_BUFFER_SIZE; i++) { buf[i] = 0xFFFF; } } event void Boot.booted() { post clear(); while (call SerialSplitControl.start() != SUCCESS); call Lcd.initialize(); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { } else { call Draw.fill(COLOR_RED); call Lcd.start(); } } event void Lcd.startDone(){ } event void SerialSplitControl.startDone(error_t error) { if (error != SUCCESS) { while (call SerialSplitControl.start() != SUCCESS); }else{ call Timer.startPeriodic(5*1024U); } } event void SerialSplitControl.stopDone(error_t error) {} task void sample() { const char *start = "Start Sampling"; call Draw.fill(COLOR_BLUE); call Draw.drawString(10,50,start,COLOR_RED); call ReadStream.postBuffer(buf, SAMPLE_BUFFER_SIZE); call ReadStream.read(100); } event void ReadStream.readDone(error_t result, uint32_t usActualPeriod) { if (result != SUCCESS) { }else{ } } event void ReadStream.bufferDone(error_t result, uint16_t* buffer, uint16_t count) { const char *fail = "Read done error"; const char *good = "Read done success"; call Leds.led1Toggle(); call Draw.fill(COLOR_GREEN); if (result != SUCCESS) { call Draw.drawString(10,70,fail,COLOR_BLACK); }else{ call Draw.drawString(10,70,good,COLOR_BLACK); call Draw.drawInt(100,100,buffer[0],1,COLOR_BLACK); call Draw.drawInt(100,160,count,1,COLOR_BLACK); } } event void Timer.fired() { call Leds.led0Toggle(); post clear(); post sample(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderStreamPDC/000077500000000000000000000000001207233610700233025ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderStreamPDC/AdcReaderC.nc000066400000000000000000000036351207233610700255500ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ configuration AdcReaderC { provides interface ReadStream; } implementation { components new AdcReadStreamClientC(), AdcReaderP; ReadStream = AdcReadStreamClientC; AdcReadStreamClientC.AdcConfigure -> AdcReaderP; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderStreamPDC/AdcReaderP.nc000066400000000000000000000041541207233610700255620ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" module AdcReaderP { provides interface AdcConfigure; } implementation { const sam3u_adc12_channel_config_t config = { channel: 0, diff: 0, prescal: 4, lowres: 0, shtim: 15, ibctl: 1, sleep: 0, startup: 104, trgen: 0, trgsel: 0 }; async command const sam3u_adc12_channel_config_t* AdcConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderStreamPDC/Makefile000066400000000000000000000002321207233610700247370ustar00rootroot00000000000000COMPONENT=MoteAppC CFLAGS += -DTOSH_DATA_LENGTH=114 CFLAGS += -DTFRAME_ENABLED CFLAGS += -DSAM3U_ADC12B_PDC CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderStreamPDC/MoteAppC.nc000066400000000000000000000041711207233610700252770ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC ReadStream with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ configuration MoteAppC {} implementation { components MainC, LedsC, NoLedsC, new TimerMilliC() as TimerC, SerialActiveMessageC, AdcReaderC, LcdC, MoteP; MoteP.Boot -> MainC; MoteP.Leds -> LedsC; MoteP.ReadStream -> AdcReaderC; MoteP.SerialSplitControl -> SerialActiveMessageC; MoteP.Packet -> SerialActiveMessageC; MoteP.Timer -> TimerC; MoteP.Lcd -> LcdC; MoteP.Draw -> LcdC; } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderStreamPDC/MoteP.nc000066400000000000000000000076171207233610700246630ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC ReadStream with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ #include #include #define SAMPLE_BUFFER_SIZE 10000 #define NUM_SAMPLES_PER_PACKET (TOSH_DATA_LENGTH / sizeof(uint16_t)) module MoteP { uses { interface Boot; interface Leds; interface ReadStream; interface SplitControl as SerialSplitControl; interface Packet; interface Timer; interface Lcd; interface Draw; } } implementation { uint16_t buf[SAMPLE_BUFFER_SIZE]; task void clear(){ /* Reset the target buffer for the ReadStream interface */ uint32_t i; for (i = 0; i < SAMPLE_BUFFER_SIZE; i++) { buf[i] = 0xFFFF; } } event void Boot.booted() { post clear(); while (call SerialSplitControl.start() != SUCCESS); call Lcd.initialize(); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { } else { call Draw.fill(COLOR_RED); call Lcd.start(); } } event void Lcd.startDone(){ } event void SerialSplitControl.startDone(error_t error) { if (error != SUCCESS) { while (call SerialSplitControl.start() != SUCCESS); }else{ call Timer.startPeriodic(3*1024); } } event void SerialSplitControl.stopDone(error_t error) {} task void sample() { const char *start = "Start Sampling"; call Draw.fill(COLOR_BLUE); call Draw.drawString(10,50,start,COLOR_RED); //call Leds.led1Toggle(); call ReadStream.postBuffer(buf, SAMPLE_BUFFER_SIZE); call ReadStream.read(100); } event void ReadStream.readDone(error_t result, uint32_t usActualPeriod) { if (result != SUCCESS) { }else{ } } event void ReadStream.bufferDone(error_t result, uint16_t* buffer, uint16_t count) { const char *fail = "Read done error"; const char *good = "Read done success"; call Draw.fill(COLOR_GREEN); if (result != SUCCESS) { call Draw.drawString(10,70,fail,COLOR_BLACK); }else{ call Draw.drawString(10,70,good,COLOR_BLACK); call Draw.drawInt(100,100,buffer[0],1,COLOR_BLACK); call Draw.drawInt(100,120,buffer[9],1,COLOR_BLACK); call Draw.drawInt(100,160,count,1,COLOR_BLACK); } } event void Timer.fired() { post clear(); post sample(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/adc12b/AdcReaderStreamPDC/README000066400000000000000000000004361207233610700241650ustar00rootroot0000000000000012 bit ADC test program for SAM3U with PDC @author JeongGil Ko To use PDC with ADC, the sampling rate MUST be controlled by properly setting the startup, prescal and lowres registers. Setting the sam3u_adc12_channel_config_t config can properly set these registers.tinyos-2.1.2+dfsg/apps/tests/sam3/clock/000077500000000000000000000000001207233610700200245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/clock/showSpeed/000077500000000000000000000000001207233610700217655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/clock/showSpeed/ClockSpeedAppC.nc000066400000000000000000000042471207233610700250760ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic application that displays the current clock speed on the LCD. * * @author Thomas Schmid **/ configuration ClockSpeedAppC { } implementation { components MainC, ClockSpeedC, LedsC; ClockSpeedC -> MainC.Boot; ClockSpeedC.Leds -> LedsC; components LcdC; ClockSpeedC.Lcd -> LcdC; ClockSpeedC.Draw -> LcdC; components HplSam3uClockC; ClockSpeedC.HplSam3uClock -> HplSam3uClockC; components HplSam3uGeneralIOC; ClockSpeedC.Pck0Pin -> HplSam3uGeneralIOC.HplPioA21; components new TimerMilliC() as T1; ClockSpeedC.ChangeTimer -> T1; } tinyos-2.1.2+dfsg/apps/tests/sam3/clock/showSpeed/ClockSpeedC.nc000066400000000000000000000123461207233610700244340ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid **/ #include #include #include module ClockSpeedC { uses { interface Leds; interface Boot; interface HplSam3uClock; interface HplSam3uGeneralIOPin as Pck0Pin; interface Timer as ChangeTimer; interface Lcd; interface Draw; } } implementation { uint8_t state; uint8_t speed; enum { SLOW = 0, MAIN = 1, PLLA = 2, MASTER = 4, }; enum { RC12, MC48, MC84, }; event void Boot.booted() { pmc_pck_t pck0 = PMC->pck0; pmc_scer_t scer = PMC->scer; state = SLOW; speed = RC12; // output slow clock on PCK0 pck0.bits.css = SLOW; PMC->pck0 = pck0; scer.bits.pck0 = 1; PMC->scer = scer; call Lcd.initialize(); call Pck0Pin.disablePioControl(); call Pck0Pin.selectPeripheralB(); // output programmable clock 0 on pin } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { call Leds.led1On(); } else { call Draw.fill(COLOR_WHITE); call Lcd.start(); } } event void Lcd.startDone() { call Leds.led0On(); call Draw.drawString(10, 10, "Init Clock:", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 30, call HplSam3uClock.getMainClockSpeed(), 1, COLOR_BLACK); call HplSam3uClock.mckInit84(); call ChangeTimer.startPeriodic(10000); } event void ChangeTimer.fired() { pmc_pck_t pck0 = PMC->pck0; call Draw.fill(COLOR_WHITE); call Draw.drawString(10, 50, "MCK Speed:", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 70, call HplSam3uClock.getMainClockSpeed(), 1, COLOR_BLACK); switch(state) { case SLOW: pck0.bits.css = state; PMC->pck0 = pck0; call Draw.drawString(10, 90, "Slow Clock on PA21", COLOR_BLACK); state = MAIN; break; case MAIN: pck0.bits.css = state; PMC->pck0 = pck0; call Draw.drawString(10, 90, "Main Clock on PA21", COLOR_BLACK); state = PLLA; break; case PLLA: pck0.bits.css = state; PMC->pck0 = pck0; call Draw.drawString(10, 90, "PLLA Clock on PA21", COLOR_BLACK); state = MASTER; break; case MASTER: pck0.bits.css = state; PMC->pck0 = pck0; call Draw.drawString(10, 90, "Master Clock on PA21", COLOR_BLACK); state = SLOW; switch(speed) { case RC12: call Draw.drawString(10, 10, "RC12 Clock:", COLOR_BLACK); call HplSam3uClock.mckInit12RC(); speed = MC48; break; case MC48: call Draw.drawString(10, 10, "MC48 Clock:", COLOR_BLACK); call HplSam3uClock.mckInit84(); speed = MC84; break; case MC84: call Draw.drawString(10, 10, "MC84 Clock:", COLOR_BLACK); call HplSam3uClock.mckInit48(); speed = RC12; break; } break; } } async event void HplSam3uClock.mainClockChanged() { } } tinyos-2.1.2+dfsg/apps/tests/sam3/clock/showSpeed/Makefile000066400000000000000000000000561207233610700234260ustar00rootroot00000000000000COMPONENT=ClockSpeedAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/dac/000077500000000000000000000000001207233610700174605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/dac/README000066400000000000000000000010041207233610700203330ustar00rootroot00000000000000These test applications generate a tone on the two DAC outputs. The tone can be observed on PB13 and PB14, or on the headset output with a loudspeaker/headphones. Carefull, some of the tones are LOUD! timer: This application uses a timer to trigger the samples being sent to the DAC. fast: This application writes as fast as it can to the DAC in a busy loop. pdc: This application uses the PDC controller to transfer the samples from memory to the DAC. It uses the PWM controller to generate the sampling signal. tinyos-2.1.2+dfsg/apps/tests/sam3/dac/fast/000077500000000000000000000000001207233610700204155ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/dac/fast/DacAppC.nc000066400000000000000000000036701207233610700222000ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * DACC Demo application for the Sam3s. We generate a sine wave that can be * observed on both DAC0 (PB13) and DAC1 (PB14). * * @author Thomas Schmid */ configuration DacAppC { } implementation { components MainC, DacC, LedsC, NoLedsC; DacC -> MainC.Boot; DacC.Leds -> LedsC; components Sam3sDacC; DacC.DacControl -> Sam3sDacC; DacC.Dac -> Sam3sDacC; } tinyos-2.1.2+dfsg/apps/tests/sam3/dac/fast/DacC.nc000066400000000000000000000073761207233610700215460ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ #include "Timer.h" module DacC @safe() { uses { interface Leds; interface Boot; interface StdControl as DacControl; interface Sam3sDac as Dac; } } implementation { #define SAMPLES 100 const int16_t sine_data[SAMPLES]= { 0x0, 0x080, 0x100, 0x17f, 0x1fd, 0x278, 0x2f1, 0x367, 0x3da, 0x449, 0x4b3, 0x519, 0x579, 0x5d4, 0x629, 0x678, 0x6c0, 0x702, 0x73c, 0x76f, 0x79b, 0x7bf, 0x7db, 0x7ef, 0x7fb, 0x7ff, 0x7fb, 0x7ef, 0x7db, 0x7bf, 0x79b, 0x76f, 0x73c, 0x702, 0x6c0, 0x678, 0x629, 0x5d4, 0x579, 0x519, 0x4b3, 0x449, 0x3da, 0x367, 0x2f1, 0x278, 0x1fd, 0x17f, 0x100, 0x080, -0x0, -0x080, -0x100, -0x17f, -0x1fd, -0x278, -0x2f1, -0x367, -0x3da, -0x449, -0x4b3, -0x519, -0x579, -0x5d4, -0x629, -0x678, -0x6c0, -0x702, -0x73c, -0x76f, -0x79b, -0x7bf, -0x7db, -0x7ef, -0x7fb, -0x7ff, -0x7fb, -0x7ef, -0x7db, -0x7bf, -0x79b, -0x76f, -0x73c, -0x702, -0x6c0, -0x678, -0x629, -0x5d4, -0x579, -0x519, -0x4b3, -0x449, -0x3da, -0x367, -0x2f1, -0x278, -0x1fd, -0x17f, -0x100, -0x080 }; uint8_t index = 0; event void Boot.booted() { uint32_t data; uint32_t d0; uint32_t d1; call DacControl.start(); call Dac.configure( 0, // enable external trigger mode 0, // select trigger source 1, // 1: word transfer, 0: half-word 0, // 1: sleep mode, 0: normal mode 0, // fast wakeup 1, // refresh period = 1024 * REFRESH/DACC Clock 0, // select channel 1, // 1: bits 13-12 in data select channel 0, // 1: max speed mode enabled 8); call Dac.enable(0); call Dac.enable(1); while(1) { d0 = sine_data[index] * 1024 / (1<<11) + (1 << 11); d1 = sine_data[(index+SAMPLES/4)%SAMPLES] * 1024 / (1<<11) + (1 << 11); // format: data = (((0 << 12) + d0) << 16) + ((1 << 12) + d1); call Leds.led0Toggle(); if(call Dac.set(data) == SUCCESS) { call Leds.led1Toggle(); index++; if(index >= SAMPLES) { index = 0; } } } } async event void Dac.bufferDone(error_t error, uint32_t* buffer, uint16_t length) {} } tinyos-2.1.2+dfsg/apps/tests/sam3/dac/fast/Makefile000066400000000000000000000000501207233610700220500ustar00rootroot00000000000000COMPONENT=DacAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/dac/pdc/000077500000000000000000000000001207233610700202265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/dac/pdc/DacAppC.nc000066400000000000000000000036701207233610700220110ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * DACC Demo application for the Sam3s. We generate a sine wave that can be * observed on both DAC0 (PB13) and DAC1 (PB14). * * @author Thomas Schmid */ configuration DacAppC { } implementation { components MainC, DacC, LedsC, NoLedsC; DacC -> MainC.Boot; DacC.Leds -> LedsC; components Sam3sDacC; DacC.DacControl -> Sam3sDacC; DacC.Dac -> Sam3sDacC; } tinyos-2.1.2+dfsg/apps/tests/sam3/dac/pdc/DacC.nc000066400000000000000000000076231207233610700213520ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ #include "Timer.h" module DacC @safe() { uses { interface Leds; interface Boot; interface StdControl as DacControl; interface Sam3sDac as Dac; } } implementation { #define SAMPLES 100 const int16_t sine_data[SAMPLES]= { 0x0, 0x080, 0x100, 0x17f, 0x1fd, 0x278, 0x2f1, 0x367, 0x3da, 0x449, 0x4b3, 0x519, 0x579, 0x5d4, 0x629, 0x678, 0x6c0, 0x702, 0x73c, 0x76f, 0x79b, 0x7bf, 0x7db, 0x7ef, 0x7fb, 0x7ff, 0x7fb, 0x7ef, 0x7db, 0x7bf, 0x79b, 0x76f, 0x73c, 0x702, 0x6c0, 0x678, 0x629, 0x5d4, 0x579, 0x519, 0x4b3, 0x449, 0x3da, 0x367, 0x2f1, 0x278, 0x1fd, 0x17f, 0x100, 0x080, -0x0, -0x080, -0x100, -0x17f, -0x1fd, -0x278, -0x2f1, -0x367, -0x3da, -0x449, -0x4b3, -0x519, -0x579, -0x5d4, -0x629, -0x678, -0x6c0, -0x702, -0x73c, -0x76f, -0x79b, -0x7bf, -0x7db, -0x7ef, -0x7fb, -0x7ff, -0x7fb, -0x7ef, -0x7db, -0x7bf, -0x79b, -0x76f, -0x73c, -0x702, -0x6c0, -0x678, -0x629, -0x5d4, -0x579, -0x519, -0x4b3, -0x449, -0x3da, -0x367, -0x2f1, -0x278, -0x1fd, -0x17f, -0x100, -0x080 }; uint32_t sine[SAMPLES] = {0}; event void Boot.booted() { uint32_t d0; uint32_t d1; uint16_t i; for(i=0; i sine[i] = (((0 << 12) + d0) << 16) + ((1 << 12) + d1); } call DacControl.start(); call Dac.configure( 0, // enable external trigger mode 0, // select trigger source 1, // 1: word transfer, 0: half-word 0, // 1: sleep mode, 0: normal mode 0, // fast wakeup 1, // refresh period = 1024 * REFRESH/DACC Clock 0, // select channel 1, // 1: bits 13-12 in data select channel 0, // 1: max speed mode enabled 8); call Dac.enable(0); call Dac.enable(1); call Dac.setFrequency(12000); // for some reason, we currently have to double the DAC frequency call Dac.setBuffer(sine, SAMPLES); call Dac.startPdc(); while(call Dac.setBuffer(sine, SAMPLES) == SUCCESS) { } } async event void Dac.bufferDone(error_t error, uint32_t *buffer, uint16_t length) { call Leds.led2Toggle(); while(call Dac.setBuffer(sine, SAMPLES) == SUCCESS) { } } } tinyos-2.1.2+dfsg/apps/tests/sam3/dac/pdc/Makefile000066400000000000000000000000501207233610700216610ustar00rootroot00000000000000COMPONENT=DacAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/dac/timer/000077500000000000000000000000001207233610700206005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/dac/timer/DacAppC.nc000066400000000000000000000037731207233610700223670ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * DACC Demo application for the Sam3s. We generate a sine wave that can be * observed on both DAC0 (PB13) and DAC1 (PB14). * * @author Thomas Schmid */ configuration DacAppC { } implementation { components MainC, DacC, LedsC, NoLedsC; components new AlarmTMicro16C() as Alarm; DacC -> MainC.Boot; DacC.Alarm -> Alarm; DacC.Leds -> LedsC; components Sam3sDacC; DacC.DacControl -> Sam3sDacC; DacC.Dac -> Sam3sDacC; } tinyos-2.1.2+dfsg/apps/tests/sam3/dac/timer/DacC.nc000066400000000000000000000074001207233610700217150ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ #include "Timer.h" module DacC @safe() { uses { interface Alarm as Alarm; interface Leds; interface Boot; interface StdControl as DacControl; interface Sam3sDac as Dac; } } implementation { #define SAMPLES 100 const int16_t sine_data[SAMPLES]= { 0x0, 0x080, 0x100, 0x17f, 0x1fd, 0x278, 0x2f1, 0x367, 0x3da, 0x449, 0x4b3, 0x519, 0x579, 0x5d4, 0x629, 0x678, 0x6c0, 0x702, 0x73c, 0x76f, 0x79b, 0x7bf, 0x7db, 0x7ef, 0x7fb, 0x7ff, 0x7fb, 0x7ef, 0x7db, 0x7bf, 0x79b, 0x76f, 0x73c, 0x702, 0x6c0, 0x678, 0x629, 0x5d4, 0x579, 0x519, 0x4b3, 0x449, 0x3da, 0x367, 0x2f1, 0x278, 0x1fd, 0x17f, 0x100, 0x080, -0x0, -0x080, -0x100, -0x17f, -0x1fd, -0x278, -0x2f1, -0x367, -0x3da, -0x449, -0x4b3, -0x519, -0x579, -0x5d4, -0x629, -0x678, -0x6c0, -0x702, -0x73c, -0x76f, -0x79b, -0x7bf, -0x7db, -0x7ef, -0x7fb, -0x7ff, -0x7fb, -0x7ef, -0x7db, -0x7bf, -0x79b, -0x76f, -0x73c, -0x702, -0x6c0, -0x678, -0x629, -0x5d4, -0x579, -0x519, -0x4b3, -0x449, -0x3da, -0x367, -0x2f1, -0x278, -0x1fd, -0x17f, -0x100, -0x080 }; uint8_t index = 0; event void Boot.booted() { call DacControl.start(); call Dac.configure( 0, // enable external trigger mode 0, // select trigger source 1, // 1: word transfer, 0: half-word 0, // 1: sleep mode, 0: normal mode 0, // fast wakeup 1, // refresh period = 1024 * REFRESH/DACC Clock 0, // select channel 1, // 1: bits 15-13 in data select channel 0, // 1: max speed mode enabled 8); call Dac.enable(0); call Dac.enable(1); call Alarm.start(100); } async event void Alarm.fired() { uint32_t data; uint32_t d0 = sine_data[index] * 1024 / (1<<11) + (1 << 11); uint32_t d1 = sine_data[(index+SAMPLES/4)%SAMPLES] * 1024 / (1<<11) + (1 << 11); call Leds.led0Toggle(); // format: data = (((0 << 12) + d0) << 16) + ((1 << 12) + d1); call Dac.set(data); index++; if(index >= SAMPLES) { index = 0; } call Alarm.start(100); } async event void Dac.bufferDone(error_t error, uint32_t* buffer, uint16_t length) {} } tinyos-2.1.2+dfsg/apps/tests/sam3/dac/timer/Makefile000066400000000000000000000000501207233610700222330ustar00rootroot00000000000000COMPONENT=DacAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/dma/000077500000000000000000000000001207233610700174725ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/dma/Makefile000066400000000000000000000002341207233610700211310ustar00rootroot00000000000000COMPONENT=MoteAppC CFLAGS += -DTOSH_DATA_LENGTH=114 CFLAGS += -DTFRAME_ENABLED #CFLAGS+=-I$(TOSDIR)/lib/printf CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/dma/MoteAppC.nc000066400000000000000000000042701207233610700214670ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC Read with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ configuration MoteAppC {} implementation { components MainC, LedsC, NoLedsC, new TimerMilliC() as TimerC, SerialActiveMessageC, LcdC, Sam3uDmaC, HplNVICC, HplSam3uClockC, MoteP; MoteP.Boot -> MainC; MoteP.Leds -> LedsC; MoteP.SerialSplitControl -> SerialActiveMessageC; MoteP.Packet -> SerialActiveMessageC; MoteP.Timer -> TimerC; MoteP.Dma -> Sam3uDmaC.Channel0; MoteP.DMAControl -> Sam3uDmaC; MoteP.Lcd -> LcdC; MoteP.Draw -> LcdC; } tinyos-2.1.2+dfsg/apps/tests/sam3/dma/MoteP.nc000066400000000000000000000073261207233610700210500ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uDmahardware.h" #include "sam3updchardware.h" #include "sam3uadc12bhardware.h" #include "sam3umatrixhardware.h" #include #include module MoteP { uses { interface Boot; interface Leds; interface SplitControl as SerialSplitControl; interface Packet; interface Timer; interface Lcd; interface Draw; interface Sam3uDmaControl as DMAControl; interface Sam3uDmaChannel as Dma; } } implementation{ uint16_t msg = 48; uint16_t msg2 = 0; uint8_t channel = 0; task void setup(); task void tx(); event void Boot.booted(){ call Lcd.initialize(); call DMAControl.init(); call DMAControl.setArbitor(TRUE); post setup(); post tx(); call Timer.startPeriodic(1024); } event void Lcd.initializeDone(error_t err){ if(err != SUCCESS){ }else{ call Draw.fill(COLOR_GREEN); call Lcd.start(); } } uint8_t tmp_s = 88; uint8_t tmp_d = 0; task void setup(){ call Dma.setupTransfer(0, (uint32_t*)&tmp_s, (uint32_t*)&tmp_d, 1 , 0, 0, 0, 0, 1, 1, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); //post tx(); } task void tx(){ call Draw.fill(COLOR_WHITE); call Draw.drawInt(100,80,tmp_s,1,COLOR_RED); call Draw.drawInt(150,80,tmp_d,1,COLOR_RED); tmp_d = 0; call Leds.led1Toggle(); call Dma.startTransfer(0); call Draw.drawInt(100,100,tmp_s,1,COLOR_RED); call Draw.drawInt(150,100,tmp_d,1,COLOR_RED); } task void repeat(){ call Draw.fill(COLOR_WHITE); call Draw.drawInt(100,80,tmp_s,1,COLOR_RED); call Draw.drawInt(150,80,tmp_d,1,COLOR_RED); tmp_s++; tmp_d = 0; call Draw.drawInt(100,100,tmp_s,1,COLOR_RED); call Draw.drawInt(150,100,tmp_d,1,COLOR_RED); call Leds.led1Toggle(); call Dma.repeatTransfer((uint32_t*)&tmp_s, (uint32_t*)&tmp_d, 1, 0); } async event void Dma.transferDone(error_t success){ call Leds.led0Toggle(); } event void Timer.fired() { post repeat(); } event void Lcd.startDone(){} event void SerialSplitControl.startDone(error_t error){} event void SerialSplitControl.stopDone(error_t error) {} } tinyos-2.1.2+dfsg/apps/tests/sam3/eefc/000077500000000000000000000000001207233610700176335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/eefc/erase/000077500000000000000000000000001207233610700207325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/eefc/erase/Makefile000066400000000000000000000000501207233610700223650ustar00rootroot00000000000000COMPONENT=MoteAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/eefc/erase/MoteAppC.nc000066400000000000000000000040001207233610700227160ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "AT91SAM3U4.h" configuration MoteAppC {} implementation { components MainC; components MoteP; components LedsC; components new HplSam3uEefcC((uint32_t)AT91C_BASE_EFC1, AT91C_IFLASH1, AT91C_IFLASH1_PAGE_SIZE, AT91C_IFLASH1_SIZE) as IFlash; MainC.SoftwareInit -> IFlash; MoteP.Boot -> MainC; MoteP.Leds -> LedsC; MoteP.IFlash -> IFlash; } tinyos-2.1.2+dfsg/apps/tests/sam3/eefc/erase/MoteP.nc000066400000000000000000000035031207233610700223010ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module MoteP { uses { interface Boot; interface HplSam3uEefc as IFlash; interface Leds; } } implementation { event void Boot.booted() { call IFlash.erase(); call Leds.led1On(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/eefc/read_write/000077500000000000000000000000001207233610700217605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/eefc/read_write/Makefile000066400000000000000000000000741207233610700234210ustar00rootroot00000000000000COMPONENT=MoteAppC #BOOTLOADER=tosboot include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/eefc/read_write/MoteAppC.nc000066400000000000000000000036071207233610700237600ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "AT91SAM3U4.h" configuration MoteAppC {} implementation { components MainC; components Sam3uEefcC; components LedsC; components new MoteP((uint32_t)AT91C_IFLASH0); MoteP.IFlash -> Sam3uEefcC.InternalFlash0; MoteP.Boot -> MainC; MoteP.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/sam3/eefc/read_write/MoteP.nc000066400000000000000000000076621207233610700233410ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ generic module MoteP(uint32_t base_addr) { uses { interface Boot; interface InternalFlash as IFlash; interface Leds; } } implementation { __attribute__((noinline)) void verySimpleTest() { #define BUFFER0_SIZE 256 uint8_t buf[BUFFER0_SIZE]; uint8_t *addr; uint16_t size; int i; for(i=0; iimageAddr); e = ecombine(e, bootArgs.gestureCount != iflashArgs->gestureCount); e = ecombine(e, bootArgs.address != iflashArgs->address); e = ecombine(e, bootArgs.noReprogram != iflashArgs->noReprogram); if(e) { call Leds.led0On(); while(1); } } } event void Boot.booted() { verySimpleTest(); // simpleTest(); // testBootArgs(); call Leds.led1On(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/hsmci/000077500000000000000000000000001207233610700200345ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/hsmci/fatfs/000077500000000000000000000000001207233610700211375ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/hsmci/fatfs/Makefile000066400000000000000000000002351207233610700225770ustar00rootroot00000000000000COMPONENT=MoteAppC CFLAGS += -DTOSH_DATA_LENGTH=114 CFLAGS += -DTFRAME_ENABLED CFLAGS += -I$(TOSDIR)/lib/printf CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/hsmci/fatfs/MoteAppC.nc000066400000000000000000000035741207233610700231420ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's SD Card Implementation with FatFS * @author Kevin Klues */ configuration MoteAppC {} implementation { components MainC; components MoteP; components FatFsC; components LedsC; MoteP.Boot -> MainC; MoteP.FatFs ->FatFsC; MoteP.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/sam3/hsmci/fatfs/MoteP.nc000066400000000000000000000046161207233610700225140ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's HSMCI HPL interface * @author Kevin Klues */ #include "sam3uhsmcihardware.h" #include "FatFs.h" module MoteP { uses { interface Boot; interface FatFs; interface Leds; } } implementation { FATFS fs; DIR dp; FIL fp; #define BUF_SIZE 1024 uint8_t buf[BUF_SIZE]; uint bytes_written; event void Boot.booted() { int i; for(i=0; i */ #include configuration MoteAppC {} implementation { components MainC; components MoteP; components Sam3uHsmciC; components LedsC; enum { RESOURCE_ID = unique(SAM3U_HSMCI_RESOURCE) }; MoteP.Boot -> MainC; MoteP.Resource -> Sam3uHsmciC.Resource[RESOURCE_ID]; MoteP.Sam3uHsmciInit -> Sam3uHsmciC.Sam3uHsmciInit; MoteP.Sam3uHsmci -> Sam3uHsmciC.Sam3uHsmci[RESOURCE_ID]; MoteP.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/sam3/hsmci/hil/MoteP.nc000066400000000000000000000062471207233610700221670ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's HSMCI HPL interface * @author Kevin Klues */ #include "sam3uhsmcihardware.h" module MoteP { uses { interface Boot; interface Resource; interface Sam3uHsmciInit; interface Sam3uHsmci; interface Leds; } } implementation { #define NUM_BLOCKS 1000 #define WORDS_PER_BLOCK 128 norace int next_block = 0; norace uint32_t tx_buf[WORDS_PER_BLOCK]; norace uint32_t rx_buf[WORDS_PER_BLOCK]; event void Boot.booted() { int i; for(i=0; i */ configuration MoteAppC {} implementation { components MainC; components MoteP; components HplSam3uHsmciC; components LedsC; components BusyWaitMicroC; MoteP.Boot -> MainC; MoteP.AsyncStdControl -> HplSam3uHsmciC; MoteP.HplSam3uHsmci -> HplSam3uHsmciC; MoteP.Leds -> LedsC; MoteP.BusyWait -> BusyWaitMicroC; } tinyos-2.1.2+dfsg/apps/tests/sam3/hsmci/hpl/MoteP.nc000066400000000000000000000102511207233610700221640ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's HSMCI HPL interface * @author Kevin Klues */ #include "sam3uhsmcihardware.h" module MoteP { uses { interface Boot; interface AsyncStdControl; interface HplSam3uHsmci; interface Leds; interface BusyWait; } } implementation { #define NUM_BLOCKS 1000 #define WORDS_PER_BLOCK 128 enum { SD_STANDARD_CAP, SD_HIGHEXT_CAP, }; norace int next_block = 0; norace int block_multiplier = 512; norace int card_type = SD_STANDARD_CAP; uint16_t card_size = 0; norace uint32_t rca_addr; norace uint32_t trans_buf[WORDS_PER_BLOCK]; uint32_t *trans_buf_ptr; event void Boot.booted() { int i; call AsyncStdControl.start(); trans_buf_ptr = trans_buf; call HplSam3uHsmci.init(&trans_buf_ptr); for(i=0; irca << 16; call HplSam3uHsmci.sendCommand(CMD9, rca_addr); } } async event void* HplSam3uHsmci.sendCommandDone(uint8_t cmd, void* rsp, error_t error) { if(error == SUCCESS) { switch(cmd) { case CMD9: { hsmci_sd_r2_t *r2 = (hsmci_sd_r2_t*)rsp; card_type = r2->csd.csd_structure; block_multiplier = card_type ? 1 : 512; //TODO: compute the card size so one can query it call HplSam3uHsmci.sendCommand(CMD7, rca_addr); break; } case CMD7: call HplSam3uHsmci.sendCommand(ACMD6, 2); break; case ACMD6: call Leds.led2Toggle(); call HplSam3uHsmci.sendCommand(CMD16, 512); break; case CMD16: call HplSam3uHsmci.sendCommand(CMD24, next_block*block_multiplier); break; case CMD24: break; case CMD17: break; default: } } return rsp; } async event void HplSam3uHsmci.txDone(error_t error) { int i; if(error != SUCCESS) call Leds.led0On(); for(i=0; i */ #include configuration MoteAppC {} implementation { components MainC; components MoteP; components SDC; components LedsC; MoteP.Boot -> MainC; MoteP.StdControl -> SDC; MoteP.SD -> SDC.SD; MoteP.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/sam3/hsmci/sd/MoteP.nc000066400000000000000000000057711207233610700220220ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's HSMCI HPL interface * @author Kevin Klues */ #include "sam3uhsmcihardware.h" #include "printf.h" module MoteP { uses { interface Boot; interface StdControl; interface SD; interface Leds; } } implementation { #define NUM_BLOCKS 1000 #define BYTES_PER_BLOCK 512 int next_block = 0; uint8_t tx_buf[BYTES_PER_BLOCK]; uint8_t rx_buf[BYTES_PER_BLOCK]; task void writeTask(); task void readTask(); event void Boot.booted() { int i; uint32_t size; for(i=0; i MainC.Boot; TestLcdC.Leds -> LedsC; components LcdC; TestLcdC.Lcd -> LcdC; TestLcdC.Draw -> LcdC; components new TimerMilliC() as T0; TestLcdC.ChangeTimer -> T0; components RandomC; TestLcdC.Random -> RandomC; } tinyos-2.1.2+dfsg/apps/tests/sam3/lcd/TestLcdC.nc000066400000000000000000000113621207233610700214650ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid **/ #include #include module TestLcdC { uses { interface Timer as ChangeTimer; interface Leds; interface Boot; interface Random; interface Lcd; interface Draw; } } implementation { enum { RED, GREEN, BLUE, WHITE, STRING, RAND, }; uint8_t state; uint8_t backgrnd; event void Boot.booted() { state = RED; backgrnd = 0; call Lcd.initialize(); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { call Leds.led1On(); } else { call Draw.fill(COLOR_RED); call Lcd.start(); } } event void Lcd.startDone() { call Leds.led0On(); call ChangeTimer.startPeriodic(1024); } event void ChangeTimer.fired() { switch(state) { case RED: call Draw.fill(COLOR_RED); state = GREEN; break; case GREEN: call Draw.fill(COLOR_GREEN); state = BLUE; break; case BLUE: call Draw.fill(COLOR_BLUE); state = WHITE; break; case WHITE: call Draw.fill(COLOR_WHITE); state = STRING; break; case STRING: { const char *hi = "Hello World"; const char *l1 = "I am running"; const char *l2 = "the SAM3U port"; const char *l3 = "of TinyOS!"; const char *l4 = "wiki.github.com/"; const char *l5 = "tschmid/tinyos-2.x"; call ChangeTimer.stop(); call Draw.fill(COLOR_WHITE); call Draw.drawString(10, 50, hi, COLOR_RED); call Draw.drawString(10, 70, l1, COLOR_ORANGE); call Draw.drawString(10, 90, l2, COLOR_BLUE); call Draw.drawString(10, 110, l3, COLOR_NAVY); call Draw.drawString(10, 170, l4, COLOR_BLACK); call Draw.drawString(10, 190, l5, COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 210, 123456789L, 1, COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 230, 987654321L, -1, COLOR_BLACK); call ChangeTimer.startOneShot(10000); state = RAND; break; } case RAND: { uint32_t x; for (x=0; x<10*BOARD_LCD_WIDTH*BOARD_LCD_HEIGHT; x++) { uint32_t r = call Random.rand32(); call Draw.drawPixel((r & 0x0000FFFF)%BOARD_LCD_WIDTH, ((r >> 16) & 0x0000FFFF)%BOARD_LCD_HEIGHT, r%COLOR_WHITE); } call ChangeTimer.startPeriodic(1024); state = RED; break; } } } } tinyos-2.1.2+dfsg/apps/tests/sam3/mpu/000077500000000000000000000000001207233610700175325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/mpu/TestMpuProtection/000077500000000000000000000000001207233610700232025ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/mpu/TestMpuProtection/Makefile000066400000000000000000000000651207233610700246430ustar00rootroot00000000000000COMPONENT=TestMpuProtectionAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/mpu/TestMpuProtection/TestMpuProtectionAppC.nc000066400000000000000000000037661207233610700277540ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic application to test thread isolation. * * @author Wanja Hofer **/ configuration TestMpuProtectionAppC { } implementation { components MainC, TestMpuProtectionC, LedsC; components new ThreadC(0x200) as Thread0; components new ThreadC(0x200) as Thread1; TestMpuProtectionC -> MainC.Boot; TestMpuProtectionC.Leds -> LedsC; TestMpuProtectionC.Thread0 -> Thread0; TestMpuProtectionC.Thread1 -> Thread1; } tinyos-2.1.2+dfsg/apps/tests/sam3/mpu/TestMpuProtection/TestMpuProtectionC.nc000066400000000000000000000070631207233610700273050ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic application to test thread isolation. * * @author Wanja Hofer **/ // Depending on if MPU protection is enabled or not, thread 1 will be able to // write to thread 0's data or not, and, therefore, after LED 0 lights up, either // LED 1 should light up (not protected) or LED 2 (red) should light up (protected) typedef struct { uint32_t word1; uint32_t word2; uint32_t word3; uint32_t word4; uint32_t word5; uint32_t word6; uint32_t word7; uint32_t word8; } struct32bytes; module TestMpuProtectionC { uses interface Leds; uses interface Boot; uses interface Thread as Thread0; uses interface Thread as Thread1; } implementation { // does not normally have to be volatile, but here it does // so that the compiler does not optimize the artificial check // for manipulation in the test case volatile struct32bytes data0 __attribute__((section(".bssthread0"))); // belongs to thread 0 volatile struct32bytes data1 __attribute__((section(".bssthread1"))); // belongs to thread 1 void fatal(); void wait() { volatile unsigned int i; for (i = 0; i < 1000000; i++); } event void Boot.booted() { call Thread0.start(NULL); call Thread1.start(NULL); } event void Thread0.run(void* arg) { // initialize own data data0.word1 = 1; data0.word2 = 1; data0.word3 = 1; data0.word4 = 1; data0.word5 = 1; data0.word6 = 1; data0.word7 = 1; data0.word8 = 1; // check if data has been manipulated while (1) { if (data0.word1 != 1) { call Leds.led1On(); // LED 1 (green): data has been manipulated } } } event void Thread1.run(void* arg) { volatile uint32_t i; for (i = 0; i < 4; i++) { // wait for some time wait(); } // then manipulate foreign data call Leds.led0On(); // LED 0 (green): manipulation attempt about to happen data0.word1 = 2; while (1); // wait forever } void fatal() { while (1) { volatile int i; for (i = 0; i < 100000; i++); call Leds.led2Toggle(); // Led 2 (red) blinking: fatal } } } tinyos-2.1.2+dfsg/apps/tests/sam3/mpu/TestMpuProtectionSyscall/000077500000000000000000000000001207233610700245355ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/mpu/TestMpuProtectionSyscall/Makefile000066400000000000000000000001711207233610700261740ustar00rootroot00000000000000COMPONENT=TestMpuProtectionSyscallAppC CFLAGS += -I$(TOSDIR)/lib/tosthreads/sensorboards/universal include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/mpu/TestMpuProtectionSyscall/TestMpuProtectionSyscallAppC.nc000066400000000000000000000046741207233610700326410ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic app to test thread isolation with system calls. * Based on Kevin's TestSineSensorAppC. * * @author Wanja Hofer */ configuration TestMpuProtectionSyscallAppC { } implementation { components MainC, TestMpuProtectionSyscallC; components new ThreadC(0x200) as Thread0; components new BlockingSineSensorC(); components BlockingSerialActiveMessageC; components new BlockingSerialAMSenderC(228); MainC.Boot <- TestMpuProtectionSyscallC; MainC.SoftwareInit -> BlockingSineSensorC; TestMpuProtectionSyscallC.Thread0 -> Thread0; TestMpuProtectionSyscallC.BlockingRead -> BlockingSineSensorC; TestMpuProtectionSyscallC.AMControl -> BlockingSerialActiveMessageC; TestMpuProtectionSyscallC.BlockingAMSend -> BlockingSerialAMSenderC; //TestMpuProtectionSyscallC.Packet -> BlockingSerialAMSenderC; components LedsC; TestMpuProtectionSyscallC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/sam3/mpu/TestMpuProtectionSyscall/TestMpuProtectionSyscallC.nc000066400000000000000000000047601207233610700321740ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic app to test thread isolation with system calls. * Based on Kevin's TestSineSensorAppC. * * @author Wanja Hofer */ module TestMpuProtectionSyscallC { uses { interface Boot; interface Thread as Thread0; interface BlockingRead; interface BlockingStdControl as AMControl; interface BlockingAMSend; //interface Packet; interface Leds; } } implementation { void wait() { volatile unsigned int i; for (i = 0; i < 1000000; i++); } event void Boot.booted() { call Thread0.start(NULL); } event void Thread0.run(void* arg) { uint16_t* var = NULL; message_t msg; //var = call Packet.getPayload(&msg, sizeof(uint16_t)); while( call AMControl.start() != SUCCESS ); for(;;){ while( call BlockingRead.read(var) != SUCCESS ); while( call BlockingAMSend.send(AM_BROADCAST_ADDR, &msg, sizeof(uint16_t)) != SUCCESS ); call Leds.led0Toggle(); wait(); } } } tinyos-2.1.2+dfsg/apps/tests/sam3/pdc/000077500000000000000000000000001207233610700174775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/pdc/Makefile000066400000000000000000000002341207233610700211360ustar00rootroot00000000000000COMPONENT=MoteAppC CFLAGS += -DTOSH_DATA_LENGTH=114 CFLAGS += -DTFRAME_ENABLED #CFLAGS+=-I$(TOSDIR)/lib/printf CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/pdc/MoteAppC.nc000066400000000000000000000044741207233610700215020ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's 12 bit ADC Read with LCD * @author Chieh-Jan Mike Liang * @author JeongGil Ko */ configuration MoteAppC {} implementation { components MainC, LedsC, NoLedsC, new TimerMilliC() as TimerC, SerialActiveMessageC, LcdC, Sam3uDmaC, HplNVICC, HplSam3uClockC, HplSam3uPdcC, MoteP; MoteP.Boot -> MainC; MoteP.Leds -> LedsC; MoteP.SerialSplitControl -> SerialActiveMessageC; MoteP.Packet -> SerialActiveMessageC; MoteP.Timer -> TimerC; //MoteP.ClockControl -> HplSam3uClockC.DBGUPPCntl; //MoteP.PDC -> HplSam3uPdcC.UartPdcControl; MoteP.ClockControl -> HplSam3uClockC.TWI0PPCntl; MoteP.PDC -> HplSam3uPdcC.Twi0PdcControl; MoteP.Lcd -> LcdC; MoteP.Draw -> LcdC; } tinyos-2.1.2+dfsg/apps/tests/sam3/pdc/MoteP.nc000066400000000000000000000111331207233610700210440ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This example validates that the values for the PDC registers are correctly written * * @author JeongGil Ko */ #include "sam3uDmahardware.h" #include "sam3updchardware.h" #include "sam3uadc12bhardware.h" #include "sam3umatrixhardware.h" #include #include module MoteP { uses { interface Boot; interface Leds; interface SplitControl as SerialSplitControl; interface Packet; interface Timer; interface Lcd; interface Draw; interface HplSam3uPdc as PDC; interface HplSam3uPeripheralClockCntl as ClockControl; } } implementation{ uint16_t msg = 48; uint16_t msg2 = 0; uint8_t channel = 0; uint32_t addr = 0; task void setup(); task void tx(); event void Boot.booted() { call Lcd.initialize(); call ClockControl.enable(); call Timer.startPeriodic(1024); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { } else { call Draw.fill(COLOR_GREEN); call Lcd.start(); } } event void Lcd.startDone(){ } event void SerialSplitControl.startDone(error_t error) { if (error != SUCCESS) { while (call SerialSplitControl.start() != SUCCESS); }else{ } } event void SerialSplitControl.stopDone(error_t error) {} uint8_t tmp_s = 88; uint8_t tmp_d = 0; task void setup(){ post tx(); } uint8_t temp = 99; uint8_t temp_d = 0; bool status; enum { UART_BASE = 0x400E0600, USART0_BASE = 0x40090000, USART1_BASE = 0x40094000, USART2_BASE = 0x40098000, USART3_BASE = 0x4009C000, TWI0_BASE = 0x40084000, TWI1_BASE = 0x40088000, PWM_BASE = 0x4008C000 }; task void tx() { volatile periph_rpr_t* RPR = (volatile periph_rpr_t*) (TWI0_BASE + 0x100); volatile periph_rcr_t* RCR = (volatile periph_rcr_t*) (TWI0_BASE + 0x104); volatile periph_tpr_t* TPR = (volatile periph_tpr_t*) (TWI0_BASE + 0x108); volatile periph_tcr_t* TCR = (volatile periph_tcr_t*) (TWI0_BASE + 0x10C); volatile periph_ptcr_t* PTCR = (volatile periph_ptcr_t*) (TWI0_BASE + 0x120); volatile periph_ptsr_t* PTSR = (volatile periph_ptsr_t*) (TWI0_BASE + 0x124); call PDC.setRxPtr((uint32_t*)&temp); call PDC.setTxPtr((uint32_t*)&temp_d); call PDC.setTxCounter(10); call PDC.setRxCounter(10); call PDC.enablePdcRx(); call Draw.fill(COLOR_WHITE); call Leds.led1Toggle(); call Draw.drawInt(180,10,RPR->bits.rxptr,1,COLOR_BLUE); call Draw.drawInt(180,30,(uint32_t)&temp,1,COLOR_RED); call Draw.drawInt(180,50,TPR->bits.txptr,1,COLOR_BLUE); call Draw.drawInt(180,70,(uint32_t)&temp_d,1,COLOR_GREEN); call Draw.drawInt(100,90,RCR->bits.rxctr,1,COLOR_RED); call Draw.drawInt(100,110,TCR->bits.txctr,1,COLOR_RED); call Draw.drawInt(100,130,PTCR->bits.rxten,1,COLOR_RED); call Draw.drawInt(100,150,PTSR->bits.rxten,1,COLOR_RED); /*For testing*/ ADC12B->mr.bits.startup = 104; call Draw.drawInt(100,210,ADC12B->mr.bits.startup,1,COLOR_BLUE); } event void Timer.fired() { post tx(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/pin/000077500000000000000000000000001207233610700175175ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/pin/capture/000077500000000000000000000000001207233610700211625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/pin/capture/Makefile000066400000000000000000000001221207233610700226150ustar00rootroot00000000000000COMPONENT=TestCaptureAppC CFLAGS += -I$(TOSDIR)/lib/printf include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/pin/capture/TestCaptureAppC.nc000066400000000000000000000046361207233610700245240ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic application that tests the SAM3U Captures. Connect a switch to PA1 * and watch the LCD for rising/falling time measurements. * * @author Thomas Schmid **/ configuration TestCaptureAppC { } implementation { components MainC, TestCaptureC, LedsC, LcdC; TestCaptureC -> MainC.Boot; TestCaptureC.Leds -> LedsC; TestCaptureC.Lcd -> LcdC; TestCaptureC.Draw -> LcdC; components HplSam3uGeneralIOC as GeneralIOC; components HplSam3uTCC; components new GpioCaptureC() as CaptureSFDC; CaptureSFDC.TCCapture -> HplSam3uTCC.TC0Capture; CaptureSFDC.GeneralIO -> GeneralIOC.HplPioA1; TestCaptureC.Capture -> CaptureSFDC; TestCaptureC.SFD -> GeneralIOC.PioA1; components new Alarm32khz32C(); TestCaptureC.InitAlarm -> Alarm32khz32C; TestCaptureC.Alarm32 -> Alarm32khz32C; } tinyos-2.1.2+dfsg/apps/tests/sam3/pin/capture/TestCaptureC.nc000066400000000000000000000073701207233610700240610ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid **/ #include #include module TestCaptureC { uses { interface Leds; interface Boot; interface Lcd; interface Draw; interface GpioCapture as Capture; interface GeneralIO as SFD; interface Init as InitAlarm; interface Alarm as Alarm32; } } implementation { bool falling; uint32_t lastTime; event void Boot.booted() { atomic lastTime = 0; call InitAlarm.init(); call Lcd.initialize(); } event void Lcd.initializeDone(error_t result) { if(result != SUCCESS) { call Leds.led0On(); } else { call Draw.fill(COLOR_WHITE); call Lcd.start(); } } event void Lcd.startDone() { atomic falling = TRUE; call SFD.makeInput(); call Capture.captureRisingEdge(); call Draw.drawString(10, 10, "Rising on PA0", COLOR_BLACK); } async event void Capture.captured(uint16_t time) { uint32_t now = (call Alarm32.getNow() & 0xFFFF0000L) + time; call Draw.fill(COLOR_WHITE); call Leds.led0Toggle(); atomic { if(falling) { call Draw.drawString(10, 10, "Rising at:", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH - 10, 30, now, 1, COLOR_BLACK); call Draw.drawString(10, 50, "Since last:", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH - 10, 70, now-lastTime, 1, COLOR_BLACK); falling = FALSE; call Capture.captureFallingEdge(); } else { call Draw.drawString(10, 10, "Falling at:", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH - 10, 30, now, 1, COLOR_BLACK); call Draw.drawString(10, 50, "Since last:", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH - 10, 70, now-lastTime, 1, COLOR_BLACK); falling = TRUE; call Capture.captureRisingEdge(); } lastTime = now; } } async event void Alarm32.fired() {} } tinyos-2.1.2+dfsg/apps/tests/sam3/pin/interrupt/000077500000000000000000000000001207233610700215535ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/pin/interrupt/Makefile000066400000000000000000000000611207233610700232100ustar00rootroot00000000000000COMPONENT=TestInterruptAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/pin/interrupt/TestInterruptAppC.nc000066400000000000000000000043571207233610700255060ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic application that tests the SAM3U Interrupts. It toggles LED0 and LED1 * by pushing the "left" and "right" button on the SAM3U EK devkit. * * @author Thomas Schmid **/ configuration TestInterruptAppC { } implementation { components MainC, TestInterruptC, LedsC; TestInterruptC -> MainC.Boot; TestInterruptC.Leds -> LedsC; components HplSam3uGeneralIOC; TestInterruptC.GpioInterruptLeft -> HplSam3uGeneralIOC.InterruptPioA18; TestInterruptC.ButtonLeft -> HplSam3uGeneralIOC.HplPioA18; TestInterruptC.GpioInterruptRight -> HplSam3uGeneralIOC.InterruptPioA19; TestInterruptC.ButtonRight -> HplSam3uGeneralIOC.HplPioA19; } tinyos-2.1.2+dfsg/apps/tests/sam3/pin/interrupt/TestInterruptC.nc000066400000000000000000000047571207233610700250510ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid **/ module TestInterruptC { uses interface Leds; uses interface Boot; uses interface GpioInterrupt as GpioInterruptLeft; uses interface HplSam3uGeneralIOPin as ButtonLeft; uses interface GpioInterrupt as GpioInterruptRight; uses interface HplSam3uGeneralIOPin as ButtonRight; } implementation { event void Boot.booted() { //call ButtonLeft.enablePioControl(); //call ButtonRight.enablePioControl(); // schematic demands that we pull up the pins! call ButtonLeft.enablePullUpResistor(); call ButtonRight.enablePullUpResistor(); call GpioInterruptLeft.enableFallingEdge(); call GpioInterruptRight.enableFallingEdge(); } async event void GpioInterruptLeft.fired() { call Leds.led0Toggle(); } async event void GpioInterruptRight.fired() { call Leds.led1Toggle(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/spi/000077500000000000000000000000001207233610700175245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/spi/Makefile000066400000000000000000000000531207233610700211620ustar00rootroot00000000000000COMPONENT=TestSpiAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/spi/SpiConfigC.nc000066400000000000000000000024361207233610700220370ustar00rootroot00000000000000 module SpiConfigC { provides { interface Init; interface ResourceConfigure; } uses { interface HplSam3SpiChipSelConfig; interface HplSam3SpiConfig; } } implementation { command error_t Init.init() { // configure clock call HplSam3SpiChipSelConfig.setBaud(20); call HplSam3SpiChipSelConfig.setClockPolarity(0); // logic zero is inactive call HplSam3SpiChipSelConfig.setClockPhase(1); // out on rising, in on falling call HplSam3SpiChipSelConfig.disableAutoCS(); // disable automatic rising of CS after each transfer //call HplSam3uSpiChipSelConfig.enableAutoCS(); // if the CS line is not risen automatically after the last tx. The lastxfer bit has to be used. call HplSam3SpiChipSelConfig.enableCSActive(); //call HplSam3uSpiChipSelConfig.disableCSActive(); call HplSam3SpiChipSelConfig.setBitsPerTransfer(SPI_CSR_BITS_8); call HplSam3SpiChipSelConfig.setTxDelay(0); call HplSam3SpiChipSelConfig.setClkDelay(0); return SUCCESS; } async command void ResourceConfigure.configure() { // Do stuff here } async command void ResourceConfigure.unconfigure() { // Do stuff here... } } tinyos-2.1.2+dfsg/apps/tests/sam3/spi/TestSpiAppC.nc000066400000000000000000000043311207233610700222060ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic application that tests the SAM3U SPI. * * @author Thomas Schmid **/ configuration TestSpiAppC { } implementation { components MainC, TestSpiC, LedsC; TestSpiC -> MainC.Boot; TestSpiC.Leds -> LedsC; components new Sam3Spi0C() as SpiC; TestSpiC.SpiByte -> SpiC; TestSpiC.SpiPacket -> SpiC; TestSpiC.SpiResource -> SpiC; //components HplSam3uGeneralIOC; //TestSpiC.CSN -> HplSam3uGeneralIOC.PioA16; components SpiConfigC; SpiConfigC.Init <- SpiC; SpiConfigC.ResourceConfigure <- SpiC; SpiConfigC.HplSam3SpiChipSelConfig -> SpiC; components HilSam3SpiC; TestSpiC.SpiConfig -> HilSam3SpiC; } tinyos-2.1.2+dfsg/apps/tests/sam3/spi/TestSpiC.nc000066400000000000000000000061551207233610700215530ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid **/ module TestSpiC { uses interface Leds; uses interface Boot; uses interface SpiByte; uses interface SpiPacket; uses interface HplSam3SpiConfig as SpiConfig; uses interface Resource as SpiResource; } implementation { task void transferPacketTask() { uint8_t tx_buf[10]; uint8_t rx_buf[10]; uint8_t i; for(i=0; i<10; i++) { tx_buf[i] = 0xA0 + i; rx_buf[i] = 0; } call SpiPacket.send(tx_buf, rx_buf, 10); } task void transferTask() { uint8_t byte; byte = call SpiByte.write(0xCD); if(byte == 0xCD) { call Leds.led0Toggle(); } else { call Leds.led1Toggle(); } byte = call SpiByte.write(0xAB); if(byte == 0xAB) { call Leds.led0Toggle(); } else { call Leds.led1Toggle(); } post transferPacketTask(); //post transferTask(); } event void Boot.booted() { call SpiResource.request(); } event void SpiResource.granted() { call SpiConfig.enableLoopBack(); post transferTask(); //post transferPacketTask(); } async event void SpiPacket.sendDone(uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len, error_t error) { uint8_t i; if(error == SUCCESS) { if(len == 10) { for(i=0; i<10; i++){ if(rx_buf[i] != 0xCD) { call Leds.led1Toggle(); } else { call Leds.led2Toggle(); } } call Leds.led0Toggle(); } } call Leds.led1Toggle(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/timer/000077500000000000000000000000001207233610700200515ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/timer/Alarm32khz/000077500000000000000000000000001207233610700217675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/timer/Alarm32khz/Makefile000066400000000000000000000000621207233610700234250ustar00rootroot00000000000000COMPONENT=TestAlarm32khzAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/timer/Alarm32khz/TestAlarm32khzAppC.nc000066400000000000000000000040741207233610700256400ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic application that generates an alarm, blinks LEDs, and displays the * current alarm on the LCD. * * @author Thomas Schmid **/ configuration TestAlarm32khzAppC { } implementation { components MainC, TestAlarm32khzP, LedsC; TestAlarm32khzP -> MainC.Boot; TestAlarm32khzP.Leds -> LedsC; components LcdC; TestAlarm32khzP.Lcd -> LcdC; TestAlarm32khzP.Draw -> LcdC; components new Alarm32khz32C() as Alarm32; TestAlarm32khzP.Alarm -> Alarm32; } tinyos-2.1.2+dfsg/apps/tests/sam3/timer/Alarm32khz/TestAlarm32khzP.nc000066400000000000000000000067511207233610700252200ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid **/ #include #include module TestAlarm32khzP { uses { interface Leds; interface Boot; interface Lcd; interface Draw; interface Alarm; } } implementation { uint32_t delta = 32768; event void Boot.booted() { call Lcd.initialize(); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { call Leds.led0On(); call Leds.led1On(); call Leds.led2On(); } else { call Draw.fill(COLOR_WHITE); call Lcd.start(); } } event void Lcd.startDone() { uint32_t now = call Alarm.getNow(); call Leds.led0Off(); call Leds.led1Off(); call Leds.led2Off(); call Draw.fill(COLOR_WHITE); call Draw.drawString(10, 10, "AlarmTest:", COLOR_BLACK); call Draw.drawString(10, 50, "Now: ", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 50, now, 1, COLOR_BLACK); call Draw.drawString(10, 70, "Alarm: ", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 70, now+delta, 1, COLOR_BLACK); call Alarm.startAt(now, delta); } async event void Alarm.fired() { uint32_t now = call Alarm.getNow(); call Draw.fill(COLOR_WHITE); call Draw.drawString(10, 10, "AlarmTest:", COLOR_BLACK); call Draw.drawString(10, 50, "Now: ", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 50, now, 1, COLOR_BLACK); call Draw.drawString(10, 70, "Err: ", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 70, now - call Alarm.getAlarm(), 1, COLOR_BLACK); call Draw.drawString(10, 90, "Next: ", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 90, now+delta, 1, COLOR_BLACK); call Alarm.startAt(now, delta); } } tinyos-2.1.2+dfsg/apps/tests/sam3/timer/AlarmTMicro/000077500000000000000000000000001207233610700222235ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/timer/AlarmTMicro/Makefile000066400000000000000000000000631207233610700236620ustar00rootroot00000000000000COMPONENT=TestAlarmTMicroAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/timer/AlarmTMicro/TestAlarmTMicroAppC.nc000066400000000000000000000042531207233610700263270ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic application that generates an alarm, blinks LEDs, and displays the * current alarm on the LCD. * * @author Thomas Schmid **/ configuration TestAlarmTMicroAppC { } implementation { components MainC, TestAlarmTMicroP, LedsC; TestAlarmTMicroP -> MainC.Boot; TestAlarmTMicroP.Leds -> LedsC; components LcdC; TestAlarmTMicroP.Lcd -> LcdC; TestAlarmTMicroP.Draw -> LcdC; components new AlarmTMicro32C() as Alarm32; TestAlarmTMicroP.Alarm -> Alarm32; components HilSam3uTCCounterTMicroC as HilCounter; TestAlarmTMicroP.HilCounter -> HilCounter; } tinyos-2.1.2+dfsg/apps/tests/sam3/timer/AlarmTMicro/TestAlarmTMicroP.nc000066400000000000000000000076531207233610700257120ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid **/ #include #include module TestAlarmTMicroP { uses { interface Leds; interface Boot; interface Lcd; interface Draw; interface Alarm; interface HplSam3uTCChannel as HilCounter; } } implementation { uint32_t delta = 1e6; event void Boot.booted() { call Lcd.initialize(); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { call Leds.led0On(); call Leds.led1On(); call Leds.led2On(); } else { call Draw.fill(COLOR_WHITE); call Lcd.start(); } } event void Lcd.startDone() { uint32_t now = call Alarm.getNow(); call Leds.led0Off(); call Leds.led1Off(); call Leds.led2Off(); call Draw.fill(COLOR_WHITE); call Draw.drawString(10, 10, "AlarmTest:", COLOR_BLACK); call Draw.drawString(10, 50, "Now: ", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 50, now, 1, COLOR_BLACK); call Draw.drawString(10, 70, "Alarm: ", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 70, now+delta, 1, COLOR_BLACK); call Draw.drawString(10, 110, "Frequency kHz:", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 130, call HilCounter.getTimerFrequency(), 1, COLOR_BLACK); call Alarm.startAt(now, delta); } async event void Alarm.fired() { uint32_t now = call Alarm.getNow(); call Draw.fill(COLOR_WHITE); call Draw.drawString(10, 10, "AlarmTest:", COLOR_BLACK); call Draw.drawString(10, 50, "Now: ", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 50, now, 1, COLOR_BLACK); call Draw.drawString(10, 70, "Err: ", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 70, now - call Alarm.getAlarm(), 1, COLOR_BLACK); call Draw.drawString(10, 90, "Next: ", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 90, now+delta, 1, COLOR_BLACK); call Draw.drawString(10, 110, "Frequency kHz:", COLOR_BLACK); call Draw.drawInt(BOARD_LCD_WIDTH-20, 130, call HilCounter.getTimerFrequency(), 1, COLOR_BLACK); call Alarm.startAt(now, delta); } async event void HilCounter.overflow() {} } tinyos-2.1.2+dfsg/apps/tests/sam3/twi/000077500000000000000000000000001207233610700175345ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/twi/Makefile000066400000000000000000000001751207233610700211770ustar00rootroot00000000000000COMPONENT=MoteAppC CFLAGS += -DTOSH_DATA_LENGTH=114 CFLAGS += -DTFRAME_ENABLED CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/twi/MoteAppC.nc000066400000000000000000000042671207233610700215370ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's TWI with LCD * @author JeongGil Ko */ configuration MoteAppC {} implementation { components MainC, LedsC, NoLedsC, new TimerMilliC() as TimerC, SerialActiveMessageC, TwiReaderC, LcdC, MoteP; MoteP.Boot -> MainC; MoteP.Leds -> NoLedsC; MoteP.TWI -> TwiReaderC; MoteP.Resource -> TwiReaderC; MoteP.SerialSplitControl -> SerialActiveMessageC; MoteP.Packet -> SerialActiveMessageC; MoteP.Timer -> TimerC; MoteP.Lcd -> LcdC; MoteP.Draw -> LcdC; MoteP.ResourceConfigure -> TwiReaderC.ResourceConfigure[0]; MoteP.InternalAddr -> TwiReaderC; } tinyos-2.1.2+dfsg/apps/tests/sam3/twi/MoteP.nc000066400000000000000000000121741207233610700211070ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3utwihardware.h" #include #include module MoteP { uses { interface Boot; interface Leds; interface I2CPacket as TWI; interface Resource; interface SplitControl as SerialSplitControl; interface Packet; interface Timer; interface Lcd; interface Draw; interface ResourceConfigure; interface Sam3uTwiInternalAddress as InternalAddr; } } implementation { norace error_t resultError; norace uint32_t resultValue; uint8_t temp[4]; uint8_t tempWrite[2];// = 0x60606060; // for 12bit resolution on temp sensor uint16_t tempWriteLimit = 0x4680; event void Boot.booted() { while (call SerialSplitControl.start() != SUCCESS); tempWrite[0] = 0x60;//70; tempWrite[1] = 0x60;//128; call Lcd.initialize(); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { } else { call Draw.fill(COLOR_RED); call Lcd.start(); } } task void sample() { const char *start = "Resource Request!"; call Draw.fill(COLOR_BLUE); call Draw.drawString(10,50,start,COLOR_BLACK); call Resource.request(); } event void Lcd.startDone(){ post sample(); call Timer.startPeriodic(4*1024U); } event void SerialSplitControl.startDone(error_t error) { if (error != SUCCESS) { while (call SerialSplitControl.start() != SUCCESS); } } event void SerialSplitControl.stopDone(error_t error) {} volatile twi_mmr_t* MMR = (volatile twi_mmr_t *) (TWI0_BASE_ADDR + 0x4); volatile twi_cwgr_t* CWGR = (volatile twi_cwgr_t *) (TWI0_BASE_ADDR + 0x10); task void read(){ const char *start = "TWI!!"; call Draw.fill(COLOR_GREEN); call Draw.fill(COLOR_WHITE); call Draw.drawString(10,30,start,COLOR_BLACK); call ResourceConfigure.configure(); call InternalAddr.setInternalAddrSize(1); //call InternalAddr.setInternalAddr(1); // 1 byte configuration register call InternalAddr.setInternalAddr(1); // temp Limit register call TWI.write(1, 0x48, 1, (uint8_t*)&tempWrite); call Draw.drawInt(180,50,MMR->bits.dadr,1,COLOR_BLUE); call Draw.drawInt(180,70,MMR->bits.mread,1,COLOR_BLUE); call Draw.drawInt(180,90,CWGR->bits.cldiv,1,COLOR_BLUE); } event void Resource.granted(){ post read(); } task void drawResult(){ const char *fail = "Done error"; const char *good = "Done success"; //call Draw.fill(COLOR_GREEN); if (resultError != SUCCESS) { atomic call Draw.drawString(10,150,fail,COLOR_BLACK); }else{ call Draw.drawString(10,150,good,COLOR_BLACK); call Draw.drawInt(100,170,temp[0],1,COLOR_BLACK); call Draw.drawInt(100,190,temp[1],1,COLOR_BLACK); call Draw.drawInt(100,210,temp[2],1,COLOR_BLACK); call Draw.drawInt(100,230,temp[3],1,COLOR_BLACK); call Draw.drawInt(100,250,resultValue,1,COLOR_BLACK); } } task void callRead(){ call ResourceConfigure.configure(); call InternalAddr.setInternalAddrSize(1); call InternalAddr.setInternalAddr(0); // 2 byte temperature register call TWI.read(1, 0x48, 2, (uint8_t*)temp); } async event void TWI.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data){ resultError = error; resultValue = length; post drawResult(); post callRead(); } async event void TWI.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { resultError = error; resultValue = *data; post drawResult(); } event void Timer.fired() { post read(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/twi/TwiReaderC.nc000066400000000000000000000041771207233610700220600ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ configuration TwiReaderC { provides interface I2CPacket; provides interface Resource; provides interface ResourceConfigure[uint8_t id]; provides interface Sam3uTwiInternalAddress; } implementation { components Sam3uTwiC as TwiC; components TwiReaderP; I2CPacket = TwiC.TwiBasicAddr0; Resource = TwiC; ResourceConfigure = TwiC.Configure0; Sam3uTwiInternalAddress = TwiC.InternalAddress0; TwiC.TwiConfig0 -> TwiReaderP; } tinyos-2.1.2+dfsg/apps/tests/sam3/twi/TwiReaderP.nc000066400000000000000000000037441207233610700220740ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ #include "sam3utwihardware.h" module TwiReaderP { provides interface Sam3uTwiConfigure; } implementation { const sam3u_twi_union_config_t config = { cldiv: 59, chdiv: 59, ckdiv: 3 }; async command const sam3u_twi_union_config_t* Sam3uTwiConfigure.getConfig(){ return &config; } } tinyos-2.1.2+dfsg/apps/tests/sam3/twi_pdc/000077500000000000000000000000001207233610700203625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/twi_pdc/Makefile000066400000000000000000000002271207233610700220230ustar00rootroot00000000000000COMPONENT=MoteAppC CFLAGS += -DTOSH_DATA_LENGTH=114 CFLAGS += -DTFRAME_ENABLED CFLAGS += -DSAM3U_TWI_PDC CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/twi_pdc/MoteAppC.nc000066400000000000000000000042651207233610700223630ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's TWI with LCD * @author JeongGil Ko */ configuration MoteAppC {} implementation { components MainC, LedsC, NoLedsC, new TimerMilliC() as TimerC, SerialActiveMessageC, TwiReaderC, LcdC, MoteP; MoteP.Boot -> MainC; MoteP.Leds -> LedsC; MoteP.TWI -> TwiReaderC; MoteP.Resource -> TwiReaderC; MoteP.SerialSplitControl -> SerialActiveMessageC; MoteP.Packet -> SerialActiveMessageC; MoteP.Timer -> TimerC; MoteP.Lcd -> LcdC; MoteP.Draw -> LcdC; MoteP.ResourceConfigure -> TwiReaderC.ResourceConfigure[0]; MoteP.InternalAddr -> TwiReaderC; } tinyos-2.1.2+dfsg/apps/tests/sam3/twi_pdc/MoteP.nc000066400000000000000000000200551207233610700217320ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3utwihardware.h" #include #include module MoteP { uses { interface Boot; interface Leds; interface I2CPacket as TWI; interface Resource; interface SplitControl as SerialSplitControl; interface Packet; interface Timer; interface Lcd; interface Draw; interface ResourceConfigure; interface Sam3uTwiInternalAddress as InternalAddr; } } implementation { norace uint8_t resultError; norace uint32_t resultValue; uint8_t rx_len,tx_len; uint8_t temp[4]; uint8_t tempWrite[2];// = 0x60606060; // for 12bit resolution on temp sensor uint16_t tempWriteLimit = 0x4680; event void Boot.booted() { while (call SerialSplitControl.start() != SUCCESS); tempWrite[0] = 0x60;//70; tempWrite[1] = 0x60;//128; call Lcd.initialize(); } event void Lcd.initializeDone(error_t err) { if(err != SUCCESS) { } else { call Draw.fill(COLOR_RED); call Lcd.start(); } } task void sample() { const char *start = "Resource Request!"; call Draw.fill(COLOR_BLUE); call Draw.drawString(10,50,start,COLOR_BLACK); call Resource.request(); } event void Lcd.startDone(){ post sample(); call Timer.startPeriodic(2*1024U); } event void SerialSplitControl.startDone(error_t error) { if (error != SUCCESS) { while (call SerialSplitControl.start() != SUCCESS); } } event void SerialSplitControl.stopDone(error_t error) {} volatile twi_mmr_t* MMR = (volatile twi_mmr_t *) (TWI0_BASE_ADDR + 0x4); volatile twi_sr_t* SR = (volatile twi_sr_t *) (TWI0_BASE_ADDR + 0x20); volatile twi_cwgr_t* CWGR = (volatile twi_cwgr_t *) (TWI0_BASE_ADDR + 0x10); volatile periph_ptsr_t* PTSR = (volatile periph_ptsr_t *) (0x40084000 + 0x124); volatile periph_rpr_t* RPR = (volatile periph_rpr_t *) (0x40084000 + 0x100); volatile periph_rcr_t* RCR = (volatile periph_rcr_t *) (0x40084000 + 0x104); volatile periph_tcr_t* TCR = (volatile periph_tcr_t *) (0x40084000 + 0x10C); uint8_t count = 0; task void read(){ call Draw.fill(COLOR_WHITE); call Draw.drawInt(100,10,SR->bits.txcomp,1,COLOR_BLUE); call Draw.drawInt(100,30,SR->bits.rxrdy,1,COLOR_RED); call Draw.drawInt(100,50,SR->bits.txrdy,1,COLOR_BLUE); call Draw.drawInt(100,70,SR->bits.svread,1,COLOR_BLUE); call Draw.drawInt(100,90,SR->bits.svacc,1,COLOR_BLUE); call Draw.drawInt(100,110,SR->bits.gacc,1,COLOR_BLUE); call Draw.drawInt(100,130,SR->bits.ovre,1,COLOR_BLUE); call Draw.drawInt(100,150,SR->bits.nack,1,COLOR_BLUE); call Draw.drawInt(100,170,SR->bits.arblst,1,COLOR_BLUE); call Draw.drawInt(100,190,SR->bits.sclws,1,COLOR_BLUE); call Draw.drawInt(100,210,SR->bits.eosacc,1,COLOR_BLUE); call Draw.drawInt(100,230,SR->bits.endrx,1,COLOR_BLACK); call Draw.drawInt(100,250,SR->bits.endtx,1,COLOR_BLUE); call Draw.drawInt(100,270,SR->bits.rxbuff,1,COLOR_BLUE); call Draw.drawInt(100,290,SR->bits.txbufe,1,COLOR_BLUE); count++; call ResourceConfigure.configure(); call InternalAddr.setInternalAddrSize(1); call InternalAddr.setInternalAddr(1); // sensor config register call TWI.write(1, 0x48, 1, (uint8_t*)&tempWrite); call Draw.drawInt(140,230,TCR->bits.txctr,1,COLOR_BLUE); call Draw.drawInt(140,250,SR->bits.endtx,1,COLOR_BLUE); call Draw.drawInt(140,270,SR->bits.txbufe,1,COLOR_BLUE); /* call Draw.drawInt(180,70,MMR->bits.dadr,1,COLOR_BLUE); call Draw.drawInt(180,90,MMR->bits.mread,1,COLOR_BLUE); call Draw.drawInt(180,110,CWGR->bits.cldiv,1,COLOR_BLUE); call Draw.drawInt(180,130,PTSR->bits.rxten,1,COLOR_BLUE); call Draw.drawInt(180,150,RPR->bits.rxptr,1,COLOR_BLUE); call Draw.drawInt(180,170,RCR->bits.rxctr,1,COLOR_BLUE); call Draw.drawInt(180,230,SR->bits.endrx,1,COLOR_BLUE); call Draw.drawInt(100,250,temp[0],1,COLOR_BLACK); call Draw.drawInt(100,270,temp[1],1,COLOR_BLACK); */ } event void Resource.granted(){ post read(); } task void drawResult(){ const char *fail = "Done error"; //call Draw.fill(COLOR_GREEN); if (0/*resultError != SUCCESS*/) { atomic call Draw.drawString(10,70,fail,COLOR_BLACK); }else{ call Draw.drawInt(180,10,SR->bits.txcomp,1,COLOR_BLUE); call Draw.drawInt(180,30,SR->bits.rxrdy,1,COLOR_RED); call Draw.drawInt(180,50,SR->bits.txrdy,1,COLOR_BLUE); call Draw.drawInt(180,70,SR->bits.svread,1,COLOR_BLUE); call Draw.drawInt(180,90,SR->bits.svacc,1,COLOR_BLUE); call Draw.drawInt(180,110,SR->bits.gacc,1,COLOR_BLUE); call Draw.drawInt(180,130,SR->bits.ovre,1,COLOR_BLUE); call Draw.drawInt(180,150,SR->bits.nack,1,COLOR_BLUE); call Draw.drawInt(180,170,SR->bits.arblst,1,COLOR_BLUE); call Draw.drawInt(180,190,SR->bits.sclws,1,COLOR_BLUE); call Draw.drawInt(180,210,SR->bits.eosacc,1,COLOR_BLUE); call Draw.drawInt(180,230,SR->bits.endrx,1,COLOR_BLACK); call Draw.drawInt(180,250,SR->bits.endtx,1,COLOR_BLUE); call Draw.drawInt(180,270,SR->bits.rxbuff,1,COLOR_BLUE); call Draw.drawInt(180,290,SR->bits.txbufe,1,COLOR_BLUE); call Draw.drawInt(140,170,TCR->bits.txctr,1,COLOR_RED); call Draw.drawInt(140,190,PTSR->bits.txten,1,COLOR_BLACK); call Draw.drawInt(30,180,resultValue,1,COLOR_DARKCYAN); call Draw.drawInt(30,200,resultError,1,COLOR_DARKCYAN); //call Draw.drawInt(30,100,temp[0],1,COLOR_BLACK); //call Draw.drawInt(30,120,temp[1],1,COLOR_BLACK); } } task void readread(){ call Draw.drawInt(30,80,rx_len,1,COLOR_DARKGREEN); call Draw.drawInt(30,100,temp[0],1,COLOR_DARKGREEN); call Draw.drawInt(30,120,temp[1],1,COLOR_DARKGREEN); call Draw.drawInt(30,140,temp[2],1,COLOR_DARKGREEN); call Draw.drawInt(30,160,temp[3],1,COLOR_DARKGREEN); } task void callRead(){ call ResourceConfigure.configure(); call InternalAddr.setInternalAddrSize(1); call InternalAddr.setInternalAddr(0); // 2 byte temperature register call TWI.read(1, 0x48, 2, (uint8_t*)temp); } async event void TWI.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data){ resultError = error; resultValue = length; post drawResult(); post callRead(); } async event void TWI.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { //resultError = error; //resultValue = *data; //post drawResult(); rx_len=length; post readread(); } event void Timer.fired() { post read(); } } tinyos-2.1.2+dfsg/apps/tests/sam3/twi_pdc/TwiReaderC.nc000066400000000000000000000041771207233610700227060ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ configuration TwiReaderC { provides interface I2CPacket; provides interface Resource; provides interface ResourceConfigure[uint8_t id]; provides interface Sam3uTwiInternalAddress; } implementation { components Sam3uTwiC as TwiC; components TwiReaderP; I2CPacket = TwiC.TwiBasicAddr0; Resource = TwiC; ResourceConfigure = TwiC.Configure0; Sam3uTwiInternalAddress = TwiC.InternalAddress0; TwiC.TwiConfig0 -> TwiReaderP; } tinyos-2.1.2+dfsg/apps/tests/sam3/twi_pdc/TwiReaderP.nc000066400000000000000000000037441207233610700227220ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADC configuration settings (part of test application) for SAM3U's 12 bit ADC * @author JeongGil Ko */ #include "sam3utwihardware.h" module TwiReaderP { provides interface Sam3uTwiConfigure; } implementation { const sam3u_twi_union_config_t config = { cldiv: 59, chdiv: 59, ckdiv: 3 }; async command const sam3u_twi_union_config_t* Sam3uTwiConfigure.getConfig(){ return &config; } } tinyos-2.1.2+dfsg/apps/tests/sam3/usb/000077500000000000000000000000001207233610700175225ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/sam3/usb/Makefile000066400000000000000000000000511207233610700211560ustar00rootroot00000000000000COMPONENT=MoteAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/sam3/usb/MoteAppC.nc000066400000000000000000000043161207233610700215200ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's UDPHS HPL interface * @author Kevin Klues */ configuration MoteAppC {} implementation { components MainC; components MoteP; components Sam3uUsbSerialP; components HplNVICC; components HplSam3uClockC; components LedsC; MainC.SoftwareInit -> Sam3uUsbSerialP; Sam3uUsbSerialP.UDPHSInterrupt -> HplNVICC.MCI0Interrupt; Sam3uUsbSerialP.UDPHSClockControl -> HplSam3uClockC.UDPHSPPCntl; MoteP.Boot -> MainC; MoteP.StdControl -> Sam3uUsbSerialP; MoteP.UartStream -> Sam3uUsbSerialP; MoteP.Leds -> LedsC; components McuSleepC; Sam3uUsbSerialP.UdphsInterruptWrapper -> McuSleepC; } tinyos-2.1.2+dfsg/apps/tests/sam3/usb/MoteP.nc000066400000000000000000000052651207233610700211000ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple test program for SAM3U's UDPHS HPL interface * @author Kevin Klues */ //#include //#include module MoteP { uses { interface Boot; interface StdControl; interface UartStream; interface Leds; } } implementation { #define READBUFFERSIZE 64 #define WRITEBUFFERSIZE 100 int i=0; uint8_t readBuffer[READBUFFERSIZE]; uint8_t writeBuffer[WRITEBUFFERSIZE]; event void Boot.booted() { // Start it up! call StdControl.start(); for(i=0; i.xml file in this directory describing the a 256kB volume named BLOCKTEST for your flash chip. The mote id is of the form T*100 + k, where k is a random seed and T specifies the test to be performed: T = 0: perform a full test T = 2: read a previously written block with the same seed T = 3: write a block with the given seed For example, install with an id of 310 to write some data to the flash, then with an id of 210 to check that the data is correct. Or install with an id of 10 to do a combined write+read test. A successful test will blink LED 2 a few times, then turn on LED 1. A failed test will turn on LED 0. A serial message whose last byte is 0x80 for success and all other values indicate failure is also sent at the end of the test. Tools: Known bugs/limitations: None. $Id: README.txt,v 1.5 2007-02-09 21:30:29 idgay Exp $ tinyos-2.1.2+dfsg/apps/tests/storage/Block/RandRWAppC.nc000066400000000000000000000017751207233610700230210ustar00rootroot00000000000000/* $Id: RandRWAppC.nc,v 1.5 2008-06-25 01:29:44 konradlorincz Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Block storage test application. Does a pattern of random reads and * writes, based on mote id. See README.txt for more details. * * @author David Gay */ #include "StorageVolumes.h" configuration RandRWAppC { } implementation { components RandRWC, new BlockStorageC(VOLUME_BLOCKTEST), MainC, LedsC, PlatformC, SerialActiveMessageC; MainC.Boot <- RandRWC; RandRWC.SerialControl -> SerialActiveMessageC; RandRWC.AMSend -> SerialActiveMessageC.AMSend[139]; RandRWC.BlockRead -> BlockStorageC.BlockRead; RandRWC.BlockWrite -> BlockStorageC.BlockWrite; RandRWC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/storage/Block/RandRWC.nc000066400000000000000000000110411207233610700223430ustar00rootroot00000000000000/* $Id: RandRWC.nc,v 1.6 2008-06-25 01:29:44 konradlorincz Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Block storage test application. Does a pattern of random reads and * writes, based on mote id. See README.txt for more details. * * @author David Gay */ module RandRWC { uses { interface Boot; interface Leds; interface BlockRead; interface BlockWrite; interface AMSend; interface SplitControl as SerialControl; } } implementation { enum { SIZE = 1024L * 256, NWRITES = SIZE / 4096, }; uint16_t shiftReg; uint16_t initSeed; uint16_t mask; /* Return the next 16 bit random number */ uint16_t rand() { bool endbit; uint16_t tmpShiftReg; tmpShiftReg = shiftReg; endbit = ((tmpShiftReg & 0x8000) != 0); tmpShiftReg <<= 1; if (endbit) tmpShiftReg ^= 0x100b; tmpShiftReg++; shiftReg = tmpShiftReg; tmpShiftReg = tmpShiftReg ^ mask; return tmpShiftReg; } void resetSeed() { shiftReg = 119 * 119 * ((TOS_NODE_ID % 100) + 1); initSeed = shiftReg; mask = 137 * 29 * ((TOS_NODE_ID % 100) + 1); } uint8_t data[512], rdata[512]; int count, testCount; uint32_t addr, len; uint16_t offset; message_t reportMsg; void done(); void report(error_t e) { uint8_t *msg = call AMSend.getPayload(&reportMsg, 1); msg[0] = e; if (call AMSend.send(AM_BROADCAST_ADDR, &reportMsg, 1) != SUCCESS) call Leds.led0On(); } event void AMSend.sendDone(message_t* msg, error_t error) { if (error != SUCCESS) call Leds.led0On(); } void fail(error_t e) { call Leds.led0On(); report(e); } void success() { call Leds.led1On(); report(0x80); } bool scheck(error_t r) __attribute__((noinline)) { if (r != SUCCESS) fail(r); return r == SUCCESS; } bool bcheck(bool b) { if (!b) fail(FAIL); return b; } void setParameters() { addr = (uint32_t)count << 12 | (rand() >> 6); len = rand() >> 7; if (addr + len > SIZE) addr = SIZE - len; offset = rand() >> 8; if (offset + len > sizeof data) offset = sizeof data - len; } event void Boot.booted() { call SerialControl.start(); } event void SerialControl.stopDone(error_t e) { } event void SerialControl.startDone(error_t e) { int i; if (e != SUCCESS) { call Leds.led0On(); return; } resetSeed(); for (i = 0; i < sizeof data; i++) data[i++] = rand() >> 8; done(); } void nextRead() { if (++count == NWRITES) done(); else { setParameters(); scheck(call BlockRead.read(addr, rdata, len)); } } void nextWrite() { if (++count == NWRITES) { call Leds.led2Toggle(); scheck(call BlockWrite.sync()); } else { setParameters(); scheck(call BlockWrite.write(addr, data + offset, len)); } } event void BlockWrite.writeDone(storage_addr_t x, void* buf, storage_len_t y, error_t result) { if (scheck(result)) nextWrite(); } event void BlockWrite.eraseDone(error_t result) { if (scheck(result)) { call Leds.led2Toggle(); nextWrite(); } } event void BlockWrite.syncDone(error_t result) { if (scheck(result)) done(); } event void BlockRead.readDone(storage_addr_t x, void* buf, storage_len_t rlen, error_t result) __attribute__((noinline)) { if (scheck(result) && bcheck(x == addr && rlen == len && buf == rdata && memcmp(data + offset, rdata, rlen) == 0)) nextRead(); } event void BlockRead.computeCrcDone(storage_addr_t x, storage_len_t y, uint16_t z, error_t result) { } enum { A_READ = 2, A_WRITE }; void doAction(int act) { count = 0; resetSeed(); switch (act) { case A_WRITE: scheck(call BlockWrite.erase()); break; case A_READ: nextRead(); break; } } const uint8_t actions[] = { A_WRITE, A_READ }; void done() { uint8_t act = TOS_NODE_ID / 100; call Leds.led2Toggle(); switch (act) { case 0: if (testCount < sizeof actions) doAction(actions[testCount]); else success(); break; case A_READ: case A_WRITE: if (testCount) success(); else doAction(act); break; default: fail(FAIL); break; } testCount++; } } tinyos-2.1.2+dfsg/apps/tests/storage/Block/volumes-at45db.xml000066400000000000000000000001121207233610700240530ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/Block/volumes-pxa27xp30.xml000066400000000000000000000001131207233610700244450ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/Block/volumes-stm25p.xml000066400000000000000000000001121207233610700241220ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/CircularLog/000077500000000000000000000000001207233610700217405ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/storage/CircularLog/Makefile000066400000000000000000000000521207233610700233750ustar00rootroot00000000000000COMPONENT=RandRWAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/storage/CircularLog/README.txt000066400000000000000000000025511207233610700234410ustar00rootroot00000000000000README for CircularLog Author/Contact: tinyos-help@millennium.berkeley.edu Description: Application to test the LogStorageC abstraction, using the log in circular mode. There must be a volumes-.xml file in this directory describing the a 256kB volume named LOGTEST for your flash chip. The mote id is of the form T*100 + k, where k is a random seed and T specifies the test to be performed: T = 0: perform a full test T = 1: erase the log T = 2: read the log T = 3: write some data to the log The write test writes a random sequence of 4095 32-byte records chosen from a set of 16 possible records. The read test checks that the log contains that all records in the log are one of the 16 possible records. The valid records depend on the seed. Running 2 write tests will fill the log, and the third one will wrap around. So for instance, you could run the test with id = 117 (erase), then 317 three times (fill the log and wrap around), then 217 to check that the log is valid. Or just run it with id = 17 to perform a full test. A successful test will turn on LED 1. A failed test will turn on the LED 0. LED 1 is turned on after erase is complete. A serial message whose last byte is 0x80 for success and all other values indicate failure is also sent at the end of the test. Tools: Known bugs/limitations: None. $Id: README.txt,v 1.5 2007-07-09 20:45:54 idgay Exp $ tinyos-2.1.2+dfsg/apps/tests/storage/CircularLog/RandRWAppC.nc000066400000000000000000000017631207233610700241720ustar00rootroot00000000000000/* $Id: RandRWAppC.nc,v 1.5 2008-06-25 01:29:44 konradlorincz Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Block storage test application. Does a pattern of random reads and * writes, based on mote id. See README.txt for more details. * * @author David Gay */ #include "StorageVolumes.h" configuration RandRWAppC { } implementation { components RandRWC, new LogStorageC(VOLUME_LOGTEST, TRUE), MainC, LedsC, PlatformC, SerialActiveMessageC; MainC.Boot <- RandRWC; RandRWC.SerialControl -> SerialActiveMessageC; RandRWC.AMSend -> SerialActiveMessageC.AMSend[139]; RandRWC.LogRead -> LogStorageC.LogRead; RandRWC.LogWrite -> LogStorageC.LogWrite; RandRWC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/storage/CircularLog/RandRWC.nc000066400000000000000000000107051207233610700235250ustar00rootroot00000000000000/* $Id: RandRWC.nc,v 1.6 2008-06-25 01:29:44 konradlorincz Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Log storage test application. Does a pattern of random reads and * writes, based on mote id. See README.txt for more details. * * @author David Gay */ module RandRWC { uses { interface Boot; interface Leds; interface LogRead; interface LogWrite; interface AMSend; interface SplitControl as SerialControl; } } implementation { enum { SIZE = 1024L * 256, RECSIZE = 32, NRECS = 16, NWRITES = SIZE / (2 * RECSIZE), }; uint16_t shiftReg; uint16_t initSeed; uint16_t mask; void done(); /* Return the next 16 bit random number */ uint16_t rand() { bool endbit; uint16_t tmpShiftReg; tmpShiftReg = shiftReg; endbit = ((tmpShiftReg & 0x8000) != 0); tmpShiftReg <<= 1; if (endbit) tmpShiftReg ^= 0x100b; tmpShiftReg++; shiftReg = tmpShiftReg; tmpShiftReg = tmpShiftReg ^ mask; return tmpShiftReg; } void resetSeed() { shiftReg = 119 * 119 * ((TOS_NODE_ID % 100) + 1); initSeed = shiftReg; mask = 137 * 29 * ((TOS_NODE_ID % 100) + 1); } uint8_t data[NRECS * RECSIZE], rdata[RECSIZE]; int count, testCount; message_t reportMsg; void report(error_t e) { uint8_t *msg = call AMSend.getPayload(&reportMsg, 1); msg[0] = e; if (call AMSend.send(AM_BROADCAST_ADDR, &reportMsg, 1) != SUCCESS) call Leds.led0On(); } event void AMSend.sendDone(message_t* msg, error_t error) { if (error != SUCCESS) call Leds.led0On(); } void fail(error_t e) { call Leds.led0On(); report(e); } void success() { call Leds.led1On(); report(0x80); } bool scheck(error_t r) __attribute__((noinline)) { if (r != SUCCESS) fail(r); return r == SUCCESS; } bool bcheck(bool b) { if (!b) fail(FAIL); return b; } void nextRead() { scheck(call LogRead.read(rdata, RECSIZE)); } event void LogRead.readDone(void* buf, storage_len_t rlen, error_t result) __attribute__((noinline)) { if (rlen == 0) done(); else if (scheck(result) && bcheck(rlen == RECSIZE && buf == rdata)) { int i; /* It must be one of our possible records */ for (i = 0; i < sizeof data; i += RECSIZE) if (memcmp(buf, data + i, RECSIZE) == 0) { nextRead(); return; } bcheck(FALSE); } } event void LogRead.seekDone(error_t error) { } void nextWrite() { if (count++ == NWRITES) scheck(call LogWrite.sync()); else { int offset = ((rand() >> 8) % NRECS) * RECSIZE; scheck(call LogWrite.append(data + offset, RECSIZE)); } } event void LogWrite.appendDone(void *buf, storage_len_t y, bool recordsLost, error_t result) { if (scheck(result)) nextWrite(); } event void LogWrite.eraseDone(error_t result) { if (scheck(result)) done(); } event void LogWrite.syncDone(error_t result) { if (scheck(result)) done(); } event void Boot.booted() { int i; resetSeed(); for (i = 0; i < sizeof data; i++) data[i++] = rand() >> 8; call SerialControl.start(); } event void SerialControl.stopDone(error_t e) { } event void SerialControl.startDone(error_t e) { if (e != SUCCESS) { call Leds.led0On(); return; } testCount = 0; done(); } enum { A_ERASE = 1, A_READ, A_WRITE }; void doAction(int act) { switch (act) { case A_ERASE: scheck(call LogWrite.erase()); break; case A_WRITE: resetSeed(); count = 0; nextWrite(); break; case A_READ: resetSeed(); count = 0; nextRead(); break; } } const uint8_t actions[] = { A_ERASE, A_READ, A_WRITE, A_READ, A_WRITE, A_WRITE, A_WRITE, A_READ, }; void done() { uint8_t act = TOS_NODE_ID / 100; call Leds.led2Toggle(); switch (act) { case 0: if (testCount < sizeof actions) doAction(actions[testCount]); else success(); break; case A_ERASE: case A_READ: case A_WRITE: if (testCount) success(); else doAction(act); break; default: fail(FAIL); break; } testCount++; } } tinyos-2.1.2+dfsg/apps/tests/storage/CircularLog/volumes-at45db.xml000066400000000000000000000001101207233610700252250ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/CircularLog/volumes-pxa27xp30.xml000066400000000000000000000001111207233610700256170ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/CircularLog/volumes-stm25p.xml000066400000000000000000000001111207233610700252750ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/Config/000077500000000000000000000000001207233610700207375ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/storage/Config/Makefile000066400000000000000000000000521207233610700223740ustar00rootroot00000000000000COMPONENT=RandRWAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/storage/Config/README.txt000066400000000000000000000015751207233610700224450ustar00rootroot00000000000000README for Config Author/Contact: tinyos-help@millennium.berkeley.edu Description: Application to test the ConfigStorageC abstraction. There must be a volumes-.xml file in this directory describing the a volume named CONFIGTEST capable of storing 2kB of config data. The mote id is of the form T*100 + k, where k is a random seed and T specifies the test to be performed: T = 0: do a bunch of writes, reads and commits T != 0: check if the contents of the volume are consistent with a previous run with T = 0 and the same random seed A successful test will turn on LED 1. A failed test will turn on the LED 0. LED 2 blinks to indicate test progress. A serial message whose last byte is 0x80 for success and all other values indicate failure is also sent at the end of the test. Tools: Known bugs/limitations: None. $Id: README.txt,v 1.5 2007-07-09 20:45:54 idgay Exp $ tinyos-2.1.2+dfsg/apps/tests/storage/Config/RandRWAppC.nc000066400000000000000000000020051207233610700231570ustar00rootroot00000000000000/* $Id: RandRWAppC.nc,v 1.5 2008-06-25 01:29:44 konradlorincz Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Block storage test application. Does a pattern of random reads and * writes, based on mote id. See README.txt for more details. * * @author David Gay */ #include "StorageVolumes.h" configuration RandRWAppC { } implementation { components RandRWC, new ConfigStorageC(VOLUME_CONFIGTEST), MainC, LedsC, PlatformC, SerialActiveMessageC; MainC.Boot <- RandRWC; RandRWC.SerialControl -> SerialActiveMessageC; RandRWC.AMSend -> SerialActiveMessageC.AMSend[139]; RandRWC.ConfigStorage -> ConfigStorageC.ConfigStorage; RandRWC.ConfigMount -> ConfigStorageC.Mount; RandRWC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/storage/Config/RandRWC.nc000066400000000000000000000131501207233610700225210ustar00rootroot00000000000000/* $Id: RandRWC.nc,v 1.8 2008-06-25 01:29:44 konradlorincz Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Config storage test application. Does a pattern of random reads and * writes, based on mote id. See README.txt for more details. * * @author David Gay */ module RandRWC @safe() { uses { interface Boot; interface Leds; interface ConfigStorage; interface AMSend; interface SplitControl as SerialControl; interface Mount as ConfigMount; } } implementation { enum { SIZE = 2048, NWRITES = 100, }; uint16_t shiftReg; uint16_t initSeed; uint16_t mask; uint8_t data[512], rdata[512]; int count, testCount, writeCount, countAtCommit; struct { uint32_t addr; void *COUNT_NOK(len) data; uint16_t len; } ops[NWRITES]; message_t reportMsg; void done(); /* Return the next 16 bit random number */ uint16_t rand() { bool endbit; uint16_t tmpShiftReg; tmpShiftReg = shiftReg; endbit = ((tmpShiftReg & 0x8000) != 0); tmpShiftReg <<= 1; if (endbit) tmpShiftReg ^= 0x100b; tmpShiftReg++; shiftReg = tmpShiftReg; tmpShiftReg = tmpShiftReg ^ mask; return tmpShiftReg; } void resetSeed(int offset) { shiftReg = 119 * 119 * ((TOS_NODE_ID % 100) + 1 + offset); initSeed = shiftReg; mask = 137 * 29 * ((TOS_NODE_ID % 100) + 1 + offset); } void report(error_t e) { uint8_t *msg = call AMSend.getPayload(&reportMsg, 1); msg[0] = e; if (call AMSend.send(AM_BROADCAST_ADDR, &reportMsg, 1) != SUCCESS) call Leds.led0On(); } event void AMSend.sendDone(message_t* msg, error_t error) { if (error != SUCCESS) call Leds.led0On(); } void fail(error_t e) { call Leds.led0On(); report(e); } void success() { call Leds.led1On(); report(0x80); } bool scheck(error_t r) __attribute__((noinline)) { if (r != SUCCESS) fail(r); return r == SUCCESS; } bool bcheck(bool b) { if (!b) fail(FAIL); return b; } void setupOps(int wcount) { int i; uint16_t offset; count = 0; resetSeed(wcount); for (i = 0; i < NWRITES; i++) { uint16_t addr = rand() & (SIZE - 1); uint16_t len = rand() >> 7; if (addr + len > SIZE) addr = SIZE - len; ops[i].addr = addr; ops[i].data = NULL; ops[i].len = len; offset = rand() >> 8; if (offset + ops[i].len > sizeof data) offset = sizeof data - ops[i].len; ops[i].data = data + offset; } } int overlap(int a, int b) { return ops[a].addr >= ops[b].addr && ops[a].addr < ops[b].addr + ops[b].len; } int overwritten(int c) { int i; /* True if write c is overwritten by a later write */ for (i = c + 1; i < NWRITES; i++) if (overlap(i, c) || overlap(c, i)) return TRUE; return FALSE; } void nextRead() { int c = count++; if (c == NWRITES) done(); else scheck(call ConfigStorage.read(ops[c].addr, rdata, ops[c].len)); } event void ConfigStorage.readDone(storage_addr_t x, void* buf, storage_len_t rlen, error_t result) __attribute__((noinline)) { int c = count - 1; if (scheck(result) && bcheck(x == ops[c].addr && rlen == ops[c].len && buf == rdata) && bcheck(overwritten(c) || memcmp(ops[c].data, rdata, rlen) == 0)) nextRead(); } void nextWrite() { int c = count++; if (c == NWRITES) done(); else scheck(call ConfigStorage.write(ops[c].addr, ops[c].data, ops[c].len)); } event void ConfigStorage.writeDone(storage_addr_t x, void *buf, storage_len_t y, error_t result) { int c = count - 1; if (scheck(result) && bcheck(x == ops[c].addr && y == ops[c].len && buf == ops[c].data)) nextWrite(); } event void ConfigStorage.commitDone(error_t result) { if (scheck(result)) done(); } event void Boot.booted() { int i; resetSeed(0); for (i = 0; i < sizeof data; i++) data[i++] = rand() >> 8; call SerialControl.start(); } event void SerialControl.startDone(error_t e) { if (e != SUCCESS) { call Leds.led0On(); return; } scheck(call ConfigMount.mount()); } event void ConfigMount.mountDone(error_t e) { if (e != SUCCESS) fail(e); else done(); } enum { A_COMMIT, A_READ, A_WRITE }; void doAction(int act) { switch (act) { case A_COMMIT: countAtCommit = writeCount; scheck(call ConfigStorage.commit()); break; case A_WRITE: setupOps(++writeCount); nextWrite(); break; case A_READ: setupOps(countAtCommit); nextRead(); break; } } const uint8_t actions[] = { A_WRITE, A_COMMIT, A_READ, A_WRITE, A_COMMIT, A_READ, A_WRITE, A_READ }; void done() { uint8_t act = TOS_NODE_ID / 100; call Leds.led2Toggle(); switch (act) { case 0: if (testCount < sizeof actions) doAction(actions[testCount]); else success(); break; default: if (testCount) success(); else { uint8_t i, nwrites = 0; /* Figure out countAtCommit */ for (i = 0; i < sizeof actions; i++) switch (actions[i]) { case A_WRITE: nwrites++; break; case A_COMMIT: countAtCommit = nwrites; break; } /* And check we have the right data */ doAction(A_READ); } break; } testCount++; } event void SerialControl.stopDone(error_t e) { } } tinyos-2.1.2+dfsg/apps/tests/storage/Config/volumes-at45db.xml000066400000000000000000000001621207233610700242330ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/Config/volumes-pxa27xp30.xml000066400000000000000000000001141207233610700246210ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/Config/volumes-stm25p.xml000066400000000000000000000001641207233610700243040ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/Log/000077500000000000000000000000001207233610700202535ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/storage/Log/Makefile000066400000000000000000000000521207233610700217100ustar00rootroot00000000000000COMPONENT=RandRWAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/storage/Log/README.txt000066400000000000000000000025571207233610700217620ustar00rootroot00000000000000README for Log Author/Contact: tinyos-help@millennium.berkeley.edu Description: Application to test the LogStorageC abstraction, using the log in linear mode. There must be a volumes-.xml file in this directory describing a 256kB volume named LOGTEST for your flash chip. The mote id is of the form T*100 + k, where k is a random seed and T specifies the test to be performed: T = 0: perform a full test T = 1: erase the log T = 2: read the log T = 3: write some data to the log The read test expects to see one or more consecutive results of the data written by the write test (with the same seed). The last write data can be partial. So, for instance, you could run the test with mote id = 104, then 304 twice to erase the log and write 2 copies of the data sequence for k = 4, then run with mote id = 204 to test all these writes. Or you can just run the test with mote id = 4 to do a complete test. If the log fills up (which should take 4 or 5 write operations), the write will fail, but a subsequent read will succeed. A successful test will turn on the LED 1. A failed test will turn on the LED 0. LED 1 blinks during the steps of the full test. A serial message whose last byte is 0x80 for success and all other values indicate failure is also sent at the end of the test. Tools: Known bugs/limitations: None. $Id: README.txt,v 1.5 2007-07-09 20:45:54 idgay Exp $ tinyos-2.1.2+dfsg/apps/tests/storage/Log/RandRWAppC.nc000066400000000000000000000017641207233610700225060ustar00rootroot00000000000000/* $Id: RandRWAppC.nc,v 1.5 2008-06-25 01:29:44 konradlorincz Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Block storage test application. Does a pattern of random reads and * writes, based on mote id. See README.txt for more details. * * @author David Gay */ #include "StorageVolumes.h" configuration RandRWAppC { } implementation { components RandRWC, new LogStorageC(VOLUME_LOGTEST, FALSE), MainC, LedsC, PlatformC, SerialActiveMessageC; MainC.Boot <- RandRWC; RandRWC.SerialControl -> SerialActiveMessageC; RandRWC.AMSend -> SerialActiveMessageC.AMSend[139]; RandRWC.LogRead -> LogStorageC.LogRead; RandRWC.LogWrite -> LogStorageC.LogWrite; RandRWC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/storage/Log/RandRWC.nc000066400000000000000000000115141207233610700220370ustar00rootroot00000000000000/* $Id: RandRWC.nc,v 1.8 2010-02-10 19:13:06 scipio Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Log storage test application. Does a pattern of random reads and * writes, based on mote id. See README.txt for more details. * * @author David Gay */ module RandRWC { uses { interface Boot; interface Leds; interface LogRead; interface LogWrite; interface AMSend; interface SplitControl as SerialControl; } } implementation { enum { SIZE = 1024L * 256, NWRITES = SIZE / 512, }; uint16_t shiftReg; uint16_t initSeed; uint16_t mask; void done(); /* Return the next 16 bit random number */ uint16_t rand() { bool endbit; uint16_t tmpShiftReg; tmpShiftReg = shiftReg; endbit = ((tmpShiftReg & 0x8000) != 0); tmpShiftReg <<= 1; if (endbit) tmpShiftReg ^= 0x100b; tmpShiftReg++; shiftReg = tmpShiftReg; tmpShiftReg = tmpShiftReg ^ mask; return tmpShiftReg; } void resetSeed() { shiftReg = 119 * 119 * ((TOS_NODE_ID % 100) + 1); initSeed = shiftReg; mask = 137 * 29 * ((TOS_NODE_ID % 100) + 1); } uint8_t data[512], rdata[512]; int count, testCount; uint32_t len; uint16_t offset; message_t reportMsg; void report(error_t e) { uint8_t *msg = call AMSend.getPayload(&reportMsg, 1); if (msg) { msg[0] = e; if (call AMSend.send(AM_BROADCAST_ADDR, &reportMsg, 1) == SUCCESS) return; } call Leds.led0On(); } event void AMSend.sendDone(message_t* msg, error_t error) { if (error != SUCCESS) call Leds.led0On(); } void fail(error_t e) { call Leds.led0On(); report(e); } void success() { call Leds.led1On(); report(0x80); } bool scheck(error_t r) __attribute__((noinline)) { if (r != SUCCESS) fail(r); return r == SUCCESS; } bool bcheck(bool b) { if (!b) fail(FAIL); return b; } volatile int x; void setParameters() { len = rand() >> 8; offset = rand() >> 9; if ( len > 254 ) len = 254; if (offset + len > sizeof data) offset = sizeof data - len; } void nextRead() { if (count == NWRITES) count = 0; if (count++ == 0) resetSeed(); setParameters(); scheck(call LogRead.read(rdata, len)); } event void LogRead.readDone(void* buf, storage_len_t rlen, error_t result) __attribute__((noinline)) { if (len != 0 && rlen == 0) done(); else if (scheck(result) && bcheck(rlen == len && buf == rdata && memcmp(data + offset, rdata, rlen) == 0)) nextRead(); } event void LogRead.seekDone(error_t error) { } void nextWrite() { if (count++ == NWRITES) scheck(call LogWrite.sync()); else { error_t result; setParameters(); result = call LogWrite.append(data + offset, len); if (result == ESIZE) { // We have reached the end of the log, sync it scheck(call LogWrite.sync()); } else { scheck(result); } } } event void LogWrite.appendDone(void *buf, storage_len_t y, bool recordsLost, error_t result) { if (result == ESIZE) scheck(call LogWrite.sync()); else if (scheck(result)) nextWrite(); } event void LogWrite.eraseDone(error_t result) { if (scheck(result)) done(); } event void LogWrite.syncDone(error_t result) { if (scheck(result)) done(); } event void Boot.booted() { int i; resetSeed(); for (i = 0; i < sizeof data; i++) data[i++] = rand() >> 8; call SerialControl.start(); } event void SerialControl.stopDone(error_t e) { } event void SerialControl.startDone(error_t e) { if (e != SUCCESS) { call Leds.led0On(); return; } testCount = 0; done(); } enum { A_ERASE = 1, A_READ, A_WRITE }; void doAction(int act) { switch (act) { case A_ERASE: scheck(call LogWrite.erase()); break; case A_WRITE: resetSeed(); count = 0; nextWrite(); break; case A_READ: resetSeed(); count = 0; nextRead(); break; } } const uint8_t actions[] = { A_ERASE, A_READ, A_WRITE, A_READ, A_WRITE, A_WRITE, A_WRITE, A_READ, A_ERASE, A_READ, A_WRITE, A_WRITE }; void done() { uint8_t act = TOS_NODE_ID / 100; call Leds.led2Toggle(); switch (act) { case 0: if (testCount < sizeof actions) doAction(actions[testCount]); else success(); break; case A_ERASE: case A_READ: case A_WRITE: if (testCount) success(); else doAction(act); break; default: fail(FAIL); break; } testCount++; } } tinyos-2.1.2+dfsg/apps/tests/storage/Log/volumes-at45db.xml000066400000000000000000000001101207233610700235400ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/Log/volumes-pxa27xp30.xml000066400000000000000000000001111207233610700241320ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/Log/volumes-stm25p.xml000066400000000000000000000001111207233610700236100ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/SyncLog/000077500000000000000000000000001207233610700211105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/storage/SyncLog/Makefile000066400000000000000000000000531207233610700225460ustar00rootroot00000000000000COMPONENT=SyncLogAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/storage/SyncLog/README.txt000066400000000000000000000014751207233610700226150ustar00rootroot00000000000000README for SyncLog Author/Contact: tinyos-help@millennium.berkeley.edu Description: Application to test 'sync' functionality in the LogStorageC abstraction, using the log in linear mode. There must be a volumes-.xml file in this directory describing a 64kB volume named SYNCLOG for your flash chip. A successful test will send serial messages (id 139) with increasing sequence numbers (approximately 2 messages every 5 seconds) - the easiest way to see these messages is to connect the mote with the SyncLog code to your PC and run the java Listen tool: MOTECOM=serial@ java net.tinyos.tools.Listen This test is based on code and a bug report from Mayur Maheshwari (mayur.maheshwari@gmail.com). Tools: Known bugs/limitations: None. $Id: README.txt,v 1.3 2008-06-25 01:29:44 konradlorincz Exp $ tinyos-2.1.2+dfsg/apps/tests/storage/SyncLog/SyncLogAppC.nc000066400000000000000000000013111207233610700235500ustar00rootroot00000000000000/** * Test reading and writing to a log with lots of syncs. See README.txt for * more details. * * @author Mayur Maheshwari (mayur.maheshwari@gmail.com) * @author David Gay */ #include "StorageVolumes.h" configuration SyncLogAppC { } implementation { components SyncLogC, new TimerMilliC() as Timer0, new TimerMilliC() as Timer1, new LogStorageC(VOLUME_SYNCLOG, FALSE), SerialActiveMessageC, MainC, LedsC; SyncLogC.Leds -> LedsC; SyncLogC.Boot -> MainC; SyncLogC.Timer0 -> Timer0; SyncLogC.Timer1 -> Timer1; SyncLogC.LogWrite -> LogStorageC; SyncLogC.LogRead -> LogStorageC; SyncLogC.AMSend -> SerialActiveMessageC.AMSend[139]; SyncLogC.AMControl -> SerialActiveMessageC; } tinyos-2.1.2+dfsg/apps/tests/storage/SyncLog/SyncLogC.nc000066400000000000000000000050761207233610700231230ustar00rootroot00000000000000/** * Test reading and writing to a log with lots of syncs. See README.txt for * more details. * * @author Mayur Maheshwari (mayur.maheshwari@gmail.com) * @author David Gay */ module SyncLogC { uses { interface Leds; interface Boot; interface SplitControl as AMControl; interface LogWrite; interface LogRead; interface Timer as Timer0; interface Timer as Timer1; interface AMSend; } } implementation { uint16_t data = 0; uint16_t readings = 0; message_t pkt; bool busy = FALSE; bool logBusy = FALSE; task void sendTask(); storage_cookie_t readCookie; storage_cookie_t writeCookie; #define SAMPLING_FREQUENCY 2333 #define TIMER_PERIOD_MILLI 5120 event void Boot.booted() { call AMControl.start(); } event void AMControl.startDone(error_t err) { if (err == SUCCESS) call LogWrite.erase(); else call AMControl.start(); } event void LogWrite.eraseDone(error_t result) { call Timer1.startPeriodic(SAMPLING_FREQUENCY); call Timer0.startPeriodic(TIMER_PERIOD_MILLI); } event void Timer1.fired() { readings++; if (!logBusy) { logBusy = TRUE; call LogWrite.append(&readings, sizeof(readings)); } } event void LogWrite.appendDone(void *buf, storage_len_t len, bool recordsLost, error_t result) { if (result == SUCCESS) call LogWrite.sync(); } event void LogWrite.syncDone(error_t result) { logBusy = FALSE; call Leds.led2Toggle(); } event void Timer0.fired() { call Timer1.stop(); if (!logBusy) { call Leds.led0Toggle(); logBusy = TRUE; call LogRead.read(&data, sizeof data); } } event void LogRead.readDone(void* buf, storage_len_t len, error_t error) { if (error == SUCCESS) if (len == sizeof data) post sendTask(); else { logBusy = FALSE; call Timer1.startPeriodic(SAMPLING_FREQUENCY); } } typedef nx_struct { nx_uint16_t nodeid; nx_uint16_t payloadData; } SenseStoreRadioMsg; task void sendTask() { if (!busy) { SenseStoreRadioMsg* ssrpkt = (SenseStoreRadioMsg*)(call AMSend.getPayload(&pkt, sizeof(SenseStoreRadioMsg))); ssrpkt->nodeid = TOS_NODE_ID; ssrpkt->payloadData = data; if (call AMSend.send(AM_BROADCAST_ADDR, &pkt, sizeof(SenseStoreRadioMsg)) == SUCCESS) busy = TRUE; } } event void AMSend.sendDone(message_t* msg, error_t err) { if (&pkt == msg) { busy = FALSE; call LogRead.read(&data, sizeof data); } } event void LogRead.seekDone(error_t error) { } event void AMControl.stopDone(error_t err) { } } tinyos-2.1.2+dfsg/apps/tests/storage/SyncLog/volumes-at45db.xml000066400000000000000000000001071207233610700244030ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/SyncLog/volumes-pxa27xp30.xml000066400000000000000000000001111207233610700247670ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/storage/SyncLog/volumes-stm25p.xml000066400000000000000000000001071207233610700244520ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/tkn154/000077500000000000000000000000001207233610700171145ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/Makefile000066400000000000000000000027751207233610700205670ustar00rootroot00000000000000#-*-makefile-*- ###################################################################### # # Makes the entire suite of TinyOS applications for a given platform. # # Author: Martin Turon # Date: August 18, 2005 # ###################################################################### # $Id: Makefile,v 1.4 2006-12-12 18:22:48 vlahan Exp $ # MAKECMDGOALS is the way to get the arguments passed into a Makefile ... TARGET=$(MAKECMDGOALS) NESDOC_TARGET=$(filter-out nesdoc,$(TARGET)) # Here is a way to get the list of subdirectories in a Makefile ... ROOT=. SUBDIRS := $(shell find * -type d) # Okay, match any target, and recurse the subdirectories %: @for i in $(SUBDIRS); do \ HERE=$$PWD; \ if [ -f $$i/Makefile ]; then \ echo Building ... $(PWD)/$$i; \ echo make $(TARGET); \ cd $$i; \ $(MAKE) $(TARGET); \ cd $$HERE; \ fi; \ done BASEDIR = $(shell pwd | sed 's@\(.*\)/apps.*$$@\1@' ) # The output directory for generated documentation DOCDIR = $(BASEDIR)/doc/nesdoc nesdoc: @echo This target rebuilds documentation for all known platforms. @echo It DOES NOT overwrite any existing documentation, thus, it @echo is best run after deleting all old documentation. @echo @echo To delete all old documentation, delete the contents of the @echo $(DOCDIR) directory. @echo @echo Press Enter to continue, or ^C to abort. @read for platform in `ncc -print-platforms`; do \ $(MAKE) $$platform docs.nohtml.preserve; \ nesdoc -o $(DOCDIR) -html -target=$$platform; \ done tinyos-2.1.2+dfsg/apps/tests/tkn154/README.txt000066400000000000000000000041621207233610700206150ustar00rootroot00000000000000README for tkn154 test applications Author/Contact: Jan Hauer Description: This folder contains test applications for "TKN15.4", a platform-independent IEEE 802.15.4-2006 MAC implementation. Applications that use the beacon-enabled mode are located in the "beacon-enabled" folder, applications that use the nonbeacon-enabled mode are in the "nonbeacon-enabled" folder. Every test application resides in a separate subdirectory which includes a README.txt describing what it does and how it can be installed. The TKN15.4 implementation can be found in tinyos-2.x/tos/lib/mac/tkn154 (start with the README.txt in that directory). If you want to use the TKN15.4 MAC instead of your platform's default MAC protocol in your own application, all you need to do is add the line include $(TOSDIR)/lib/mac/tkn154/Makefile.include in your application's Makefile after the "include $(MAKERULES)" line as shown in the example applications. This is also true, if your application uses the Active Message abstraction and you want to use the TKN15.4 MAC underneath AM. The full-blown MAC consumes quite a lot of program memory, but you can remove some functionality at compile time by setting IEEE154_X_DISABLED flags defined in $(TOSDIR)/lib/mac/tkn154/TKN154.h (e.g. adding them to the CFLAGS in your Makefile). The MAC interfaces are located in tos/lib/mac/tkn154/interfaces and TKN154.h is typically the only MAC header file that your application needs to include. If you pass "tkn154debug" to the make system, then a debug mode is enabled, where useful information is sent over the serial line and can be displayed with the java PrintfClient (see TinyOS tutorial "The TinyOS printf Library"). Example: "make telosb install tkn154debug" To display debug messages run (replace XXX): "java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSBXXX:telosb" Note: TEP3 recommends that interface names "should be mixed case, starting upper case". To match the syntax used in the IEEE 802.15.4 standard the interfaces provided by the MAC to the next higher layer deviate from this convention (they are all caps, e.g. MLME_START). tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/000077500000000000000000000000001207233610700217335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestAssociate/000077500000000000000000000000001207233610700245065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestAssociate/README.txt000066400000000000000000000026671207233610700262170ustar00rootroot00000000000000README for TestAssociate Author/Contact: Jan Hauer Description: In this application one node takes the role of a PAN coordinator in a beacon-enabled 802.15.4 PAN, it transmits periodic beacons and waits for devices to request association to its PAN. Whenever a device tries to associate, the PAN coordinator accepts the association and assigns to the device a unique short address (starting from zero, incremented for every new association request). A second node acts as a device, it first scans the pre-defined channel for beacons from the coordinator and once it finds a beacon it tries to associate to the PAN. A short time after association the device then disassociates from the PAN. Criteria for a successful test: Both, coordinator and device, should toggle LED1 in unison about once every 5 seconds. The coordinator should also toggle LED2 every second. Tools: NONE Usage: 1. Install the coordinator: $ cd coordinator; make install 2. Install one (or more) devices: $ cd device; make install You can change some of the configuration parameters in app_profile.h Known bugs/limitations: - Many TinyOS 2 platforms do not have a clock that satisfies the precision/accuracy requirements of the IEEE 802.15.4 standard (e.g. 62.500 Hz, +-40 ppm in the 2.4 GHz band); in this case the MAC timing is not standard compliant $Id: README.txt,v 1.3 2010-01-05 17:12:56 janhauer Exp $o tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestAssociate/app_profile.h000066400000000000000000000037711207233610700271670ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 16:21:54 $ * @author: Jan Hauer * ======================================================================== */ #ifndef __APP_PROFILE_H #define __APP_PROFILE_H enum { RADIO_CHANNEL = 26, PAN_ID = 0x1238, COORDINATOR_ADDRESS = 0x9182, BEACON_ORDER = 6, SUPERFRAME_ORDER = 6, }; #endif tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestAssociate/coordinator/000077500000000000000000000000001207233610700270315ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestAssociate/coordinator/Makefile000066400000000000000000000006721207233610700304760ustar00rootroot00000000000000COMPONENT=TestAssociateAppC CFLAGS += -DIEEE154_BEACON_SYNC_DISABLED CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestAssociate/coordinator/TestAssociateAppC.nc000066400000000000000000000043651207233610700327020ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 16:21:55 $ * @author: Jan Hauer * ======================================================================== */ configuration TestAssociateAppC { } implementation { components MainC, LedsC, Ieee802154BeaconEnabledC as MAC; components TestCoordC as App; MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.MLME_START -> MAC; App.MLME_ASSOCIATE -> MAC; App.MLME_DISASSOCIATE -> MAC; App.MLME_COMM_STATUS -> MAC; App.Frame -> MAC; App.IEEE154TxBeaconPayload -> MAC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestAssociate/coordinator/TestCoordC.nc000066400000000000000000000130131207233610700313620ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2010-01-05 17:12:56 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestCoordC { uses { interface Boot; interface MLME_RESET; interface MLME_START; interface MLME_ASSOCIATE; interface MLME_DISASSOCIATE; interface MLME_COMM_STATUS; interface MLME_SET; interface MLME_GET; interface IEEE154Frame as Frame; interface IEEE154TxBeaconPayload; interface Leds; } } implementation { uint16_t m_assignedShortAddress; event void Boot.booted() { call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status != IEEE154_SUCCESS) return; call MLME_SET.macShortAddress(COORDINATOR_ADDRESS); call MLME_SET.macAssociationPermit(TRUE); call MLME_START.request( PAN_ID, // PANId RADIO_CHANNEL, // LogicalChannel 0, // ChannelPage, 0, // StartTime, BEACON_ORDER, // BeaconOrder SUPERFRAME_ORDER, // SuperframeOrder TRUE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment 0, // no realignment security 0 // no beacon security ); } event void MLME_START.confirm(ieee154_status_t status) { } event void MLME_ASSOCIATE.indication ( uint64_t DeviceAddress, ieee154_CapabilityInformation_t CapabilityInformation, ieee154_security_t *security ) { call MLME_ASSOCIATE.response(DeviceAddress, m_assignedShortAddress++, IEEE154_ASSOCIATION_SUCCESSFUL, 0); } event void MLME_DISASSOCIATE.indication ( uint64_t DeviceAddress, ieee154_disassociation_reason_t DisassociateReason, ieee154_security_t *security ) { call Leds.led1Off(); } event void MLME_COMM_STATUS.indication ( uint16_t PANId, uint8_t SrcAddrMode, ieee154_address_t SrcAddr, uint8_t DstAddrMode, ieee154_address_t DstAddr, ieee154_status_t status, ieee154_security_t *security ) { if (status == IEEE154_SUCCESS){ // association was successful call Leds.led1On(); } else { call Leds.led1Off(); } } event void MLME_DISASSOCIATE.confirm ( ieee154_status_t status, uint8_t DeviceAddrMode, uint16_t DevicePANID, ieee154_address_t DeviceAddress ){} event void MLME_ASSOCIATE.confirm ( uint16_t AssocShortAddress, uint8_t status, ieee154_security_t *security ){} event void IEEE154TxBeaconPayload.aboutToTransmit() { } event void IEEE154TxBeaconPayload.setBeaconPayloadDone(void *beaconPayload, uint8_t length) { } event void IEEE154TxBeaconPayload.modifyBeaconPayloadDone(uint8_t offset, void *buffer, uint8_t bufferLength) { } event void IEEE154TxBeaconPayload.beaconTransmitted() { ieee154_macBSN_t beaconSequenceNumber = call MLME_GET.macBSN(); if (beaconSequenceNumber & 1) call Leds.led2On(); else call Leds.led2Off(); } } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestAssociate/device/000077500000000000000000000000001207233610700257455ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestAssociate/device/Makefile000066400000000000000000000006701207233610700274100ustar00rootroot00000000000000COMPONENT=TestAssociateAppC CFLAGS += -DIEEE154_BEACON_TX_DISABLED CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestAssociate/device/TestAssociateAppC.nc000066400000000000000000000045711207233610700316150ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 16:21:55 $ * @author: Jan Hauer * ======================================================================== */ configuration TestAssociateAppC { } implementation { components MainC, LedsC, Ieee802154BeaconEnabledC as MAC, new Timer62500C() as Timer; components TestDeviceC as App; MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.DisassociateTimer -> Timer; App.MLME_SCAN -> MAC; App.MLME_SYNC -> MAC; App.MLME_BEACON_NOTIFY -> MAC; App.MLME_SYNC_LOSS -> MAC; App.MLME_ASSOCIATE -> MAC; App.MLME_DISASSOCIATE -> MAC; App.MLME_COMM_STATUS -> MAC; App.BeaconFrame -> MAC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestAssociate/device/TestDeviceC.nc000066400000000000000000000212111207233610700304260ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2010-01-05 17:12:56 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestDeviceC { uses { interface Boot; interface MLME_RESET; interface MLME_SET; interface MLME_GET; interface MLME_SCAN; interface MLME_SYNC; interface MLME_ASSOCIATE; interface MLME_DISASSOCIATE; interface MLME_COMM_STATUS; interface MLME_BEACON_NOTIFY; interface MLME_SYNC_LOSS; interface Leds; interface IEEE154BeaconFrame as BeaconFrame; interface Timer as DisassociateTimer; } } implementation { ieee154_CapabilityInformation_t m_capabilityInformation; ieee154_PANDescriptor_t m_PANDescriptor; bool m_wasScanSuccessful; void startApp(); event void Boot.booted() { m_capabilityInformation.AlternatePANCoordinator = 0; m_capabilityInformation.DeviceType = 0; m_capabilityInformation.PowerSource = 0; m_capabilityInformation.ReceiverOnWhenIdle = 0; m_capabilityInformation.Reserved = 0; m_capabilityInformation.SecurityCapability = 0; m_capabilityInformation.AllocateAddress = 1; call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status == IEEE154_SUCCESS) startApp(); } void startApp() { ieee154_phyChannelsSupported_t channel; uint8_t scanDuration = BEACON_ORDER; // scan only one channel (to save time) channel = ((uint32_t) 1) << RADIO_CHANNEL; // we want all received beacons to be signalled // through the MLME_BEACON_NOTIFY interface, i.e. // we set the macAutoRequest attribute to FALSE call MLME_SET.macAutoRequest(FALSE); m_wasScanSuccessful = FALSE; call MLME_SCAN.request ( PASSIVE_SCAN, // ScanType channel, // ScanChannels scanDuration, // ScanDuration 0x00, // ChannelPage 0, // EnergyDetectListNumEntries NULL, // EnergyDetectList 0, // PANDescriptorListNumEntries NULL, // PANDescriptorList NULL // security ); } event message_t* MLME_BEACON_NOTIFY.indication (message_t* frame) { // received a beacon frame ieee154_phyCurrentPage_t page = call MLME_GET.phyCurrentPage(); if (!m_wasScanSuccessful) { if (call BeaconFrame.parsePANDescriptor( frame, RADIO_CHANNEL, page, &m_PANDescriptor) == SUCCESS){ // let's see if the beacon is from the coordinator we expect... if (m_PANDescriptor.CoordAddrMode == ADDR_MODE_SHORT_ADDRESS && m_PANDescriptor.CoordPANId == PAN_ID && m_PANDescriptor.CoordAddress.shortAddress == COORDINATOR_ADDRESS){ // yes - wait until SCAN is finished, then syncronize to beacons m_wasScanSuccessful = TRUE; } } } return frame; } event void MLME_SCAN.confirm ( ieee154_status_t status, uint8_t ScanType, uint8_t ChannelPage, uint32_t UnscannedChannels, uint8_t EnergyDetectListNumEntries, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumEntries, ieee154_PANDescriptor_t* PANDescriptorList ) { if (m_wasScanSuccessful) { call MLME_SET.macPANId(m_PANDescriptor.CoordPANId); call MLME_SET.macCoordShortAddress(m_PANDescriptor.CoordAddress.shortAddress); call MLME_SYNC.request(m_PANDescriptor.LogicalChannel, m_PANDescriptor.ChannelPage, TRUE); call MLME_ASSOCIATE.request( m_PANDescriptor.LogicalChannel, m_PANDescriptor.ChannelPage, m_PANDescriptor.CoordAddrMode, m_PANDescriptor.CoordPANId, m_PANDescriptor.CoordAddress, m_capabilityInformation, NULL // security ); } else startApp(); } event void MLME_ASSOCIATE.confirm ( uint16_t AssocShortAddress, uint8_t status, ieee154_security_t *security ) { if ( status == IEEE154_SUCCESS ) { // we are now associated - set a timer for disassociation call Leds.led1On(); call DisassociateTimer.startOneShot(312500U); } else { call MLME_ASSOCIATE.request( m_PANDescriptor.LogicalChannel, m_PANDescriptor.ChannelPage, m_PANDescriptor.CoordAddrMode, m_PANDescriptor.CoordPANId, m_PANDescriptor.CoordAddress, m_capabilityInformation, NULL // security ); } } event void DisassociateTimer.fired() { if (call MLME_DISASSOCIATE.request ( m_PANDescriptor.CoordAddrMode, m_PANDescriptor.CoordPANId, m_PANDescriptor.CoordAddress, IEEE154_DEVICE_WISHES_TO_LEAVE, FALSE, NULL ) != IEEE154_SUCCESS) call DisassociateTimer.startOneShot(312500U); } event void MLME_DISASSOCIATE.confirm ( ieee154_status_t status, uint8_t DeviceAddrMode, uint16_t DevicePANID, ieee154_address_t DeviceAddress ) { if (status == IEEE154_SUCCESS){ call Leds.led1Off(); } else { call DisassociateTimer.startOneShot(312500U); } } event void MLME_ASSOCIATE.indication ( uint64_t DeviceAddress, ieee154_CapabilityInformation_t CapabilityInformation, ieee154_security_t *security ){} event void MLME_SYNC_LOSS.indication( ieee154_status_t lossReason, uint16_t PANId, uint8_t LogicalChannel, uint8_t ChannelPage, ieee154_security_t *security) { startApp(); } event void MLME_DISASSOCIATE.indication ( uint64_t DeviceAddress, ieee154_disassociation_reason_t DisassociateReason, ieee154_security_t *security ){} event void MLME_COMM_STATUS.indication ( uint16_t PANId, uint8_t SrcAddrMode, ieee154_address_t SrcAddr, uint8_t DstAddrMode, ieee154_address_t DstAddr, ieee154_status_t status, ieee154_security_t *security ) { } } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestData/000077500000000000000000000000001207233610700234445ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestData/README.txt000066400000000000000000000030121207233610700251360ustar00rootroot00000000000000README for TestData Author/Contact: Jan Hauer Description: In this application one node takes the role of a PAN coordinator in a beacon-enabled 802.15.4 PAN, it transmits periodic beacons and waits for incoming DATA frames. A second node acts as a device, it first scans the pre-defined channel for beacons from the coordinator and once it finds a beacon it tries to synchronize to and track all future beacons. It then starts to transmit DATA frames to the coordinator as fast as possible (direct transmission in the contention access period, CAP). Criteria for a successful test: Coordinator and device should both toggle LED2 about twice per second in unison. They should also each toggle LED1 about 5 times per second (but not necessarily in unison). Note: the nodes should be close to each other, because the transmission power is reduced to -20 dBm. Tools: NONE Usage: 1. Install the coordinator: $ cd coordinator; make install 2. Install one or more devices $ cd device; make install,X where X is a pre-assigned short address and should be different for every device. You can change some of the configuration parameters in app_profile.h Known bugs/limitations: - Many TinyOS 2 platforms do not have a clock that satisfies the precision/accuracy requirements of the IEEE 802.15.4 standard (e.g. 62.500 Hz, +-40 ppm in the 2.4 GHz band); in this case the MAC timing is not standard compliant $Id: README.txt,v 1.3 2010-01-05 17:12:56 janhauer Exp $o tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestData/app_profile.h000066400000000000000000000040251207233610700261160ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2010-01-05 17:12:56 $ * @author: Jan Hauer * ======================================================================== */ #ifndef __APP_PROFILE_H #define __APP_PROFILE_H enum { RADIO_CHANNEL = 26, PAN_ID = 0x8172, COORDINATOR_ADDRESS = 0x4331, BEACON_ORDER = 5, SUPERFRAME_ORDER = 5, TX_POWER = -20, // in dBm }; #endif tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestData/coordinator/000077500000000000000000000000001207233610700257675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestData/coordinator/Makefile000066400000000000000000000007401207233610700274300ustar00rootroot00000000000000COMPONENT=TestDataAppC CFLAGS += -DIEEE154_BEACON_SYNC_DISABLED -DTKN154_ACTIVE_MESSAGE_SUPPORT_DISABLED CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestData/coordinator/TestCoordReceiverC.nc000066400000000000000000000103441207233610700320110ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2010-01-05 17:12:56 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestCoordReceiverC { uses { interface Boot; interface MCPS_DATA; interface MLME_RESET; interface MLME_START; interface MLME_SET; interface MLME_GET; interface IEEE154Frame as Frame; interface IEEE154TxBeaconPayload; interface Leds; } } implementation { bool m_ledCount; event void Boot.booted() { call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status != IEEE154_SUCCESS) return; call MLME_SET.phyTransmitPower(TX_POWER); call MLME_SET.macShortAddress(COORDINATOR_ADDRESS); call MLME_SET.macAssociationPermit(FALSE); call MLME_START.request( PAN_ID, // PANId RADIO_CHANNEL, // LogicalChannel 0, // ChannelPage, 0, // StartTime, BEACON_ORDER, // BeaconOrder SUPERFRAME_ORDER, // SuperframeOrder TRUE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment 0, // CoordRealignSecurity, 0 // BeaconSecurity ); } event message_t* MCPS_DATA.indication ( message_t* frame ) { if (m_ledCount++ == 20){ m_ledCount = 0; call Leds.led1Toggle(); } return frame; } event void MLME_START.confirm(ieee154_status_t status) {} event void MCPS_DATA.confirm( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t Timestamp ){} event void IEEE154TxBeaconPayload.aboutToTransmit() { } event void IEEE154TxBeaconPayload.setBeaconPayloadDone(void *beaconPayload, uint8_t length) { } event void IEEE154TxBeaconPayload.modifyBeaconPayloadDone(uint8_t offset, void *buffer, uint8_t bufferLength) { } event void IEEE154TxBeaconPayload.beaconTransmitted() { ieee154_macBSN_t beaconSequenceNumber = call MLME_GET.macBSN(); if (beaconSequenceNumber & 1) call Leds.led2On(); else call Leds.led2Off(); } } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestData/coordinator/TestDataAppC.nc000066400000000000000000000043131207233610700305670ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 16:21:55 $ * @author: Jan Hauer * ======================================================================== */ #include "app_profile.h" configuration TestDataAppC { } implementation { components MainC, LedsC, Ieee802154BeaconEnabledC as MAC; components TestCoordReceiverC as App; App.MLME_START -> MAC; App.MCPS_DATA -> MAC; App.Frame -> MAC; MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.IEEE154TxBeaconPayload -> MAC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestData/device/000077500000000000000000000000001207233610700247035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestData/device/Makefile000066400000000000000000000006641207233610700263510ustar00rootroot00000000000000COMPONENT=TestDataAppC CFLAGS += -DIEEE154_BEACON_TX_DISABLED CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestData/device/TestDataAppC.nc000066400000000000000000000044521207233610700275070ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 16:21:55 $ * @author: Jan Hauer * ======================================================================== */ #include "app_profile.h" configuration TestDataAppC { } implementation { components MainC, LedsC, Ieee802154BeaconEnabledC as MAC; components TestDeviceSenderC as App; App.MLME_SCAN -> MAC; App.MLME_SYNC -> MAC; App.MLME_BEACON_NOTIFY -> MAC; App.MLME_SYNC_LOSS -> MAC; App.MCPS_DATA -> MAC; App.Frame -> MAC; App.BeaconFrame -> MAC; App.Packet -> MAC; MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestData/device/TestDeviceSenderC.nc000066400000000000000000000172631207233610700305410ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2010-01-05 17:12:56 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestDeviceSenderC { uses { interface Boot; interface MCPS_DATA; interface MLME_RESET; interface MLME_SET; interface MLME_GET; interface MLME_SCAN; interface MLME_SYNC; interface MLME_BEACON_NOTIFY; interface MLME_SYNC_LOSS; interface IEEE154Frame as Frame; interface IEEE154BeaconFrame as BeaconFrame; interface Leds; interface Packet; } } implementation { message_t m_frame; uint8_t m_payloadLen; ieee154_PANDescriptor_t m_PANDescriptor; bool m_ledCount; bool m_wasScanSuccessful; void startApp(); task void packetSendTask(); event void Boot.booted() { char payload[] = "Hello Coordinator!"; uint8_t *payloadRegion; m_payloadLen = strlen(payload); payloadRegion = call Packet.getPayload(&m_frame, m_payloadLen); if (m_payloadLen <= call Packet.maxPayloadLength()){ memcpy(payloadRegion, payload, m_payloadLen); call MLME_RESET.request(TRUE); } } event void MLME_RESET.confirm(ieee154_status_t status) { if (status == IEEE154_SUCCESS) startApp(); } void startApp() { ieee154_phyChannelsSupported_t channelMask; uint8_t scanDuration = BEACON_ORDER; call MLME_SET.phyTransmitPower(TX_POWER); call MLME_SET.macShortAddress(TOS_NODE_ID); // scan only the channel where we expect the coordinator channelMask = ((uint32_t) 1) << RADIO_CHANNEL; // we want all received beacons to be signalled // through the MLME_BEACON_NOTIFY interface, i.e. // we set the macAutoRequest attribute to FALSE call MLME_SET.macAutoRequest(FALSE); m_wasScanSuccessful = FALSE; call MLME_SCAN.request ( PASSIVE_SCAN, // ScanType channelMask, // ScanChannels scanDuration, // ScanDuration 0x00, // ChannelPage 0, // EnergyDetectListNumEntries NULL, // EnergyDetectList 0, // PANDescriptorListNumEntries NULL, // PANDescriptorList 0 // security ); } event message_t* MLME_BEACON_NOTIFY.indication (message_t* frame) { // received a beacon frame ieee154_phyCurrentPage_t page = call MLME_GET.phyCurrentPage(); ieee154_macBSN_t beaconSequenceNumber = call BeaconFrame.getBSN(frame); if (!m_wasScanSuccessful) { // received a beacon during channel scanning if (call BeaconFrame.parsePANDescriptor( frame, RADIO_CHANNEL, page, &m_PANDescriptor) == SUCCESS) { // let's see if the beacon is from our coordinator... if (m_PANDescriptor.CoordAddrMode == ADDR_MODE_SHORT_ADDRESS && m_PANDescriptor.CoordPANId == PAN_ID && m_PANDescriptor.CoordAddress.shortAddress == COORDINATOR_ADDRESS){ // yes! wait until SCAN is finished, then syncronize to the beacons m_wasScanSuccessful = TRUE; } } } else { // received a beacon during synchronization, toggle LED2 if (beaconSequenceNumber & 1) call Leds.led2On(); else call Leds.led2Off(); } return frame; } event void MLME_SCAN.confirm ( ieee154_status_t status, uint8_t ScanType, uint8_t ChannelPage, uint32_t UnscannedChannels, uint8_t EnergyDetectListNumEntries, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumEntries, ieee154_PANDescriptor_t* PANDescriptorList ) { if (m_wasScanSuccessful) { // we received a beacon from the coordinator before call MLME_SET.macCoordShortAddress(m_PANDescriptor.CoordAddress.shortAddress); call MLME_SET.macPANId(m_PANDescriptor.CoordPANId); call MLME_SYNC.request(m_PANDescriptor.LogicalChannel, m_PANDescriptor.ChannelPage, TRUE); call Frame.setAddressingFields( &m_frame, ADDR_MODE_SHORT_ADDRESS, // SrcAddrMode, ADDR_MODE_SHORT_ADDRESS, // DstAddrMode, m_PANDescriptor.CoordPANId, // DstPANId, &m_PANDescriptor.CoordAddress, // DstAddr, NULL // security ); post packetSendTask(); } else startApp(); } task void packetSendTask() { if (!m_wasScanSuccessful) return; else if (call MCPS_DATA.request ( &m_frame, // frame, m_payloadLen, // payloadLength, 0, // msduHandle, TX_OPTIONS_ACK // TxOptions, ) != IEEE154_SUCCESS) call Leds.led0On(); } event void MCPS_DATA.confirm ( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t timestamp ) { if (status == IEEE154_SUCCESS && m_ledCount++ >= 20) { m_ledCount = 0; call Leds.led1Toggle(); } post packetSendTask(); } event void MLME_SYNC_LOSS.indication( ieee154_status_t lossReason, uint16_t PANId, uint8_t LogicalChannel, uint8_t ChannelPage, ieee154_security_t *security) { m_wasScanSuccessful = FALSE; call Leds.led1Off(); call Leds.led2Off(); } event message_t* MCPS_DATA.indication (message_t* frame) { // we don't expect data return frame; } } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestGTS/000077500000000000000000000000001207233610700232305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestGTS/README.txt000066400000000000000000000047401207233610700247330ustar00rootroot00000000000000README for TestGts Author/Contact: Ricardo Severino Stefano Tennina Description: In this application one node takes the role of a PAN coordinator in a beacon-enabled 802.15.4 PAN, it transmits periodic beacons and waits for an incoming GTS request. A second node acts as a device, it first scans the pre-defined channel for beacons from the coordinator and once it finds a beacon it tries to synchronize to and track all future beacons. It then requests a (transmit) GTS slot from the coordinator via the MLME-GTS.request() primitive. As soon as the slot is granted and signalled in the beacon frame, the device starts to send its data within that slot. A second GTS slot is then requested for reception. If the request is successfull, the PAN Coordinator will begin to transmit to the device in that slot. In the meanwhile, the first GTS is deallocated by the device which stops transmitting. This causes a reallocation of the GTS slots. Later, the PAN Coordinator stops transmitting, but the second GTS remains in beacon, although unused. When it finally expires, the PAN Coordinator removes it. To use the GTS services in your own application make sure you define the IEEE154_GTS_DEVICE_ENABLED (device) or IEEE154_GTS_COORD_ENABLE (PAN coordinator) preprocessor macro, for example, by adding the line "CFLAGS += -DIEEE154_GTS_DEVICE_ENABLED" in your application's Makefile. Criteria for a successful test: Coordinator and device should both toggle LED2 once per two per second in unison. After a few seconds the device will turn LED1 for about a second (and then turn it off). Afterwards the coordinator will turn its LED1 on (it will remain on). This assumes a setup of: 1 device + 1 coordinator. Tools: NONE Usage: 1. Install the coordinator: $ cd coordinator; make install 2. Install one or more devices $ cd device; make install,X where X is a pre-assigned short address and should be different for every device. You can change some of the configuration parameters in app_profile.h Known bugs/limitations: - The coordinator will transmit data only to a single device, even if more devices are in use - Many TinyOS 2 platforms do not have a clock that satisfies the precision/accuracy requirements of the IEEE 802.15.4 standard (e.g. 62.500 Hz, +-40 ppm in the 2.4 GHz band); in this case the MAC timing is not standard compliant tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestGTS/app_profile.h000066400000000000000000000037011207233610700257020ustar00rootroot00000000000000/* * Copyright (c) 2010, CISTER/ISEP - Polytechnic Institute of Porto * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * * @author Ricardo Severino * ======================================================================== */ #ifndef __APP_PROFILE_H #define __APP_PROFILE_H enum { RADIO_CHANNEL = 26, PAN_ID = 0x1FF1, COORDINATOR_ADDRESS = 0x4891, BEACON_ORDER = 7, SUPERFRAME_ORDER = 7, }; #endif tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestGTS/coordinator/000077500000000000000000000000001207233610700255535ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestGTS/coordinator/Makefile000066400000000000000000000010131207233610700272060ustar00rootroot00000000000000COMPONENT=TestGTSAppC CFLAGS += -DIEEE154_GTS_COORD_ENABLED CFLAGS += -I$(shell pwd)/.. CFLAGS += -DIEEE154_PROMISCUOUS_MODE_DISABLED -DTKN154_ACTIVE_MESSAGE_SUPPORT_DISABLED # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestGTS/coordinator/TestCoordC.nc000066400000000000000000000142471207233610700301160ustar00rootroot00000000000000/* * Copyright (c) 2010, CISTER/ISEP - Polytechnic Institute of Porto * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * * @author Ricardo Severino * @author Stefano Tennina * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestCoordC { uses { interface Boot; interface MCPS_DATA; interface MLME_RESET; interface MLME_START; interface MLME_SET; interface MLME_GET; interface IEEE154Frame as Frame; interface IEEE154TxBeaconPayload; interface Leds; interface MLME_GTS; interface Packet; } } implementation { bool m_ledCount; uint8_t m_payloadLen; uint8_t m_gotSlot; uint8_t m_messageCount; message_t m_frame; ieee154_address_t m_destAddr; message_t m_frame; ieee154_address_t m_dstAddr; uint8_t *payloadRegion; bool GtsGetDirection(uint8_t gtsCharacteristics) { if ( (gtsCharacteristics & 0x10) == 0x10) return GTS_RX_DIRECTION; else return GTS_TX_DIRECTION; } event void Boot.booted() { char payload[]="GTS TEST!"; m_messageCount=0; m_payloadLen=strlen(payload); payloadRegion=call Packet.getPayload(&m_frame, m_payloadLen); if (m_payloadLen <= call Packet.maxPayloadLength()){ memcpy(payloadRegion, payload, m_payloadLen); m_gotSlot=0; call MLME_RESET.request(TRUE); } } event void MLME_RESET.confirm(ieee154_status_t status) { if (status != IEEE154_SUCCESS) return; call MLME_SET.macShortAddress(COORDINATOR_ADDRESS); call MLME_SET.macAssociationPermit(FALSE); call MLME_SET.macGTSPermit(TRUE); //RARS GTS call MLME_START.request( PAN_ID, // PANId RADIO_CHANNEL, // LogicalChannel 0, // ChannelPage, 0, // StartTime, BEACON_ORDER, // BeaconOrder SUPERFRAME_ORDER, // SuperframeOrder TRUE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment 0, // CoordRealignSecurity, 0 // BeaconSecurity ); } task void packetSendTask() { call Frame.setAddressingFields( &m_frame, ADDR_MODE_SHORT_ADDRESS, // SrcAddrMode, ADDR_MODE_SHORT_ADDRESS, // DstAddrMode, call MLME_GET.macPANId(), // DstPANId, &m_dstAddr, // DstAddr, NULL // security ); m_messageCount++; if (m_messageCount < 10) { call MCPS_DATA.request ( &m_frame, // frame, m_payloadLen, // payloadLength, 0, // msduHandle, TX_OPTIONS_ACK | TX_OPTIONS_GTS // TxOptions, ); } } event message_t* MCPS_DATA.indication ( message_t* frame ) { call Leds.led1Toggle(); return frame; } event void MLME_START.confirm(ieee154_status_t status) {} event void MCPS_DATA.confirm( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t Timestamp ) { } event void IEEE154TxBeaconPayload.aboutToTransmit() { } event void IEEE154TxBeaconPayload.setBeaconPayloadDone(void *beaconPayload, uint8_t length) { } event void IEEE154TxBeaconPayload.modifyBeaconPayloadDone(uint8_t offset, void *buffer, uint8_t bufferLength) { } event void IEEE154TxBeaconPayload.beaconTransmitted() { ieee154_macBSN_t beaconSequenceNumber = call MLME_GET.macBSN(); if (beaconSequenceNumber & 1) call Leds.led2On(); else call Leds.led2Off(); if (m_gotSlot) post packetSendTask(); } event void MLME_GTS.indication ( uint16_t DeviceAddress, uint8_t GtsCharacteristics, ieee154_security_t *security ) { if (GtsGetDirection(GtsCharacteristics) == GTS_RX_DIRECTION && m_gotSlot == 0) { m_dstAddr.shortAddress=DeviceAddress; m_gotSlot=1; m_messageCount=0; post packetSendTask(); } } event void MLME_GTS.confirm ( uint8_t GtsCharacteristics, ieee154_status_t status ){} } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestGTS/coordinator/TestGTSAppC.nc000066400000000000000000000042671207233610700301470ustar00rootroot00000000000000/* * Copyright (c) 2010, CISTER/ISEP - Polytechnic Institute of Porto * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * * @author Ricardo Severino * @author Stefano Tennina * ======================================================================== */ #include "app_profile.h" configuration TestGTSAppC {} implementation { components MainC, LedsC, Ieee802154BeaconEnabledC as MAC; components TestCoordC as App; App.MLME_GTS -> MAC; App.MLME_START -> MAC; App.MCPS_DATA -> MAC; App.Frame -> MAC; MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.Packet -> MAC; App.IEEE154TxBeaconPayload -> MAC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestGTS/device/000077500000000000000000000000001207233610700244675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestGTS/device/Makefile000066400000000000000000000010641207233610700261300ustar00rootroot00000000000000COMPONENT=TestGTSAppC CFLAGS += -DIEEE154_GTS_DEVICE_ENABLED CFLAGS += -DIEEE154_BEACON_TX_DISABLED CFLAGS += -I$(shell pwd)/.. CFLAGS += -DIEEE154_PROMISCUOUS_MODE_DISABLED -DTKN154_ACTIVE_MESSAGE_SUPPORT_DISABLED # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestGTS/device/TestDeviceC.nc000066400000000000000000000224601207233610700271570ustar00rootroot00000000000000/* * Copyright (c) 2010, CISTER/ISEP - Polytechnic Institute of Porto * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * * @author Ricardo Severino * @author Stefano Tennina * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" #include "GTS.h" module TestDeviceC { uses { interface Boot; interface MCPS_DATA; interface MLME_RESET; interface MLME_SET; interface MLME_GET; interface MLME_SCAN; interface MLME_SYNC; interface MLME_BEACON_NOTIFY; interface MLME_SYNC_LOSS; interface IEEE154Frame as Frame; interface IEEE154BeaconFrame as BeaconFrame; interface Leds; interface Packet; interface MLME_GTS; } } implementation { message_t m_frame; uint8_t m_payloadLen; ieee154_PANDescriptor_t m_PANDescriptor; bool m_ledCount; bool m_wasScanSuccessful; void startApp(); uint8_t m_messageCount; task void packetSendTask(); norace uint8_t m_step; uint8_t m_gtsCharacteristics; uint8_t GtsSetCharacteristics(uint8_t gtsLength, uint8_t gtsDirection, uint8_t characteristicType) { return ( (gtsLength << 0) | (gtsDirection << 4) | (characteristicType << 5)); } event void Boot.booted() { char payload[]="GTS TEST!"; uint8_t *payloadRegion; m_payloadLen=strlen(payload); payloadRegion=call Packet.getPayload(&m_frame, m_payloadLen); if (m_payloadLen <= call Packet.maxPayloadLength()){ memcpy(payloadRegion, payload, m_payloadLen); call MLME_RESET.request(TRUE); } } event void MLME_RESET.confirm(ieee154_status_t status) { if (status == IEEE154_SUCCESS) startApp(); } void startApp() { ieee154_phyChannelsSupported_t channelMask; uint8_t scanDuration = BEACON_ORDER; call MLME_SET.macShortAddress(TOS_NODE_ID); // scan only the channel where we expect the coordinator channelMask = ((uint32_t) 1) << RADIO_CHANNEL; // we want all received beacons to be signalled // through the MLME_BEACON_NOTIFY interface, i.e. // we set the macAutoRequest attribute to FALSE call MLME_SET.macAutoRequest(FALSE); m_wasScanSuccessful = FALSE; call MLME_SCAN.request ( PASSIVE_SCAN, // ScanType channelMask, // ScanChannels scanDuration, // ScanDuration 0x00, // ChannelPage 0, // EnergyDetectListNumEntries NULL, // EnergyDetectList 0, // PANDescriptorListNumEntries NULL, // PANDescriptorListGtsSetCharacteristics 0 // security ); } event message_t* MLME_BEACON_NOTIFY.indication (message_t* frame) { // received a beacon frame ieee154_phyCurrentPage_t page = call MLME_GET.phyCurrentPage(); ieee154_macBSN_t beaconSequenceNumber = call BeaconFrame.getBSN(frame); if (!m_wasScanSuccessful) { // received a beacon during channel scanning if (call BeaconFrame.parsePANDescriptor( frame, RADIO_CHANNEL, page, &m_PANDescriptor) == SUCCESS) { // let's see if the beacon is from our coordinator... if (m_PANDescriptor.CoordAddrMode == ADDR_MODE_SHORT_ADDRESS && m_PANDescriptor.CoordPANId == PAN_ID && m_PANDescriptor.CoordAddress.shortAddress == COORDINATOR_ADDRESS){ // yes! wait until SCAN is finished, then syncronize to the beacons m_wasScanSuccessful = TRUE; } } } else { // received a beacon during synchronization, toggle LED2 if (beaconSequenceNumber & 1) call Leds.led2On(); else call Leds.led2Off(); } if (m_step == 1) post packetSendTask(); return frame; } event void MLME_SCAN.confirm ( ieee154_status_t status, uint8_t ScanType, uint8_t ChannelPage, uint32_t UnscannedChannels, uint8_t EnergyDetectListNumEntries, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumEntries, ieee154_PANDescriptor_t* PANDescriptorList ) { if (m_wasScanSuccessful) { // we received a beacon from the coordinator before call MLME_SET.macCoordShortAddress(m_PANDescriptor.CoordAddress.shortAddress); call MLME_SET.macPANId(m_PANDescriptor.CoordPANId); call MLME_SYNC.request(m_PANDescriptor.LogicalChannel, m_PANDescriptor.ChannelPage, TRUE); call Frame.setAddressingFields( &m_frame, ADDR_MODE_SHORT_ADDRESS, // SrcAddrMode, ADDR_MODE_SHORT_ADDRESS, // DstAddrMode, m_PANDescriptor.CoordPANId, // DstPANId, &m_PANDescriptor.CoordAddress, // DstAddr, NULL // security ); // allocate a gts for TX - GTS 1 m_gtsCharacteristics=GtsSetCharacteristics(2,GTS_TX_DIRECTION,1); //setup gts characteristics //1st argument: number of slots //2nd argument: Gts direction (tx or rx) //3rd argument: characteristicType (Allocation or Deallocation) call MLME_GTS.request(m_gtsCharacteristics,0); //send the gts slot request call Leds.led1On(); } else startApp(); } task void packetSendTask() { if (!m_wasScanSuccessful) return; m_messageCount++; if (m_messageCount == 3 && m_step == 1) { // allocate a second gts for RX - GTS 2 m_gtsCharacteristics=GtsSetCharacteristics(2,GTS_RX_DIRECTION,1); //setup gts characteristics call MLME_GTS.request(m_gtsCharacteristics,0); //send the gts slot request return; } if (m_messageCount < 7 && m_step == 1) { call MCPS_DATA.request ( &m_frame, // frame, m_payloadLen, // payloadLength, 0, // msduHandle, TX_OPTIONS_ACK | TX_OPTIONS_GTS // TxOptions, ); } else { m_step=2; //deallocate GTS 1 m_gtsCharacteristics=GtsSetCharacteristics(2,GTS_TX_DIRECTION,0); //setup gts characteristics call MLME_GTS.request(m_gtsCharacteristics,0); //send the gts slot request } } event void MCPS_DATA.confirm ( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t timestamp ) {} event void MLME_SYNC_LOSS.indication( ieee154_status_t lossReason, uint16_t PANId, uint8_t LogicalChannel, uint8_t ChannelPage, ieee154_security_t *security) { m_wasScanSuccessful = FALSE; call Leds.led1Off(); call Leds.led2Off(); call Leds.led0On(); m_messageCount=0; m_step=0; startApp(); } event message_t* MCPS_DATA.indication (message_t* frame) { // we don't expect data return frame; } event void MLME_GTS.indication ( uint16_t DeviceAddress, uint8_t GtsCharacteristics, ieee154_security_t *security ){} event void MLME_GTS.confirm ( uint8_t GtsCharacteristics, ieee154_status_t status ) { if (status == IEEE154_SUCCESS && m_step==0) { m_step=1; call Leds.led1Off(); call Leds.led0Off(); } } } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestGTS/device/TestGTSAppC.nc000066400000000000000000000044011207233610700270510ustar00rootroot00000000000000/* * Copyright (c) 2010, CISTER/ISEP - Polytechnic Institute of Porto * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * * @author Ricardo Severino * @author Stefano Tennina * ======================================================================== */ #include "app_profile.h" configuration TestGTSAppC {} implementation { components MainC, LedsC, Ieee802154BeaconEnabledC as MAC; components TestDeviceC as App; App.MLME_SCAN -> MAC; App.MLME_GTS -> MAC; App.MLME_SYNC -> MAC; App.MLME_BEACON_NOTIFY -> MAC; App.MLME_SYNC_LOSS -> MAC; App.MCPS_DATA -> MAC; App.Frame -> MAC; App.BeaconFrame -> MAC; App.Packet -> MAC; MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestIndirect/000077500000000000000000000000001207233610700243345ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestIndirect/README.txt000066400000000000000000000025611207233610700260360ustar00rootroot00000000000000README for TestIndirect Author/Contact: Jan Hauer Description: In this application one node takes the role of a PAN coordinator in a beacon-enabled 802.15.4 PAN, it transmits periodic beacons and additionally in every beacon interval it tries to transmit one DATA frame to a device using indirect tranmission. A second node that takes the role of a device first scans the pre-defined channel for beacons from the coordinator and once it finds a beacon it tries to synchronize to and track all future beacons. Whenever the coordinator has data to send (indicated in the beacon), the device extracts the DATA frame from the coordinator. Criteria for a successful test: Both nodes should toggle the LED1 in unison, about once every half second. The coordinator should also toggle LED2 with the same frequency. Tools: NONE Usage: 1. Install the coordinator: $ cd coordinator; make install 2. Install one device $ cd device; make install You can change some of the configuration parameters in app_profile.h Known bugs/limitations: - Many TinyOS 2 platforms do not have a clock that satisfies the precision/accuracy requirements of the IEEE 802.15.4 standard (e.g. 62.500 Hz, +-40 ppm in the 2.4 GHz band); in this case the MAC timing is not standard compliant $Id: README.txt,v 1.3 2010-01-05 17:12:56 janhauer Exp $ tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestIndirect/app_profile.h000066400000000000000000000040241207233610700270050ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 16:21:55 $ * @author: Jan Hauer * ======================================================================== */ #ifndef __APP_PROFILE_H #define __APP_PROFILE_H enum { RADIO_CHANNEL = 26, PAN_ID = 0x1152, DEVICE_ADDRESS = 0x4342, COORDINATOR_ADDRESS = 0x5341, BEACON_ORDER = 5, SUPERFRAME_ORDER = 5, }; #endif tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestIndirect/coordinator/000077500000000000000000000000001207233610700266575ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestIndirect/coordinator/Makefile000066400000000000000000000007211207233610700303170ustar00rootroot00000000000000COMPONENT=TestIndirectAppC CFLAGS += -DIEEE154_BEACON_SYNC_DISABLED -DIEEE154_SCAN_DISABLED CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestIndirect/coordinator/TestCoordSenderC.nc000066400000000000000000000124751207233610700323640ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2010-01-05 17:12:56 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestCoordSenderC { uses { interface Boot; interface MCPS_DATA; interface MLME_RESET; interface MLME_START; interface MLME_SET; interface MLME_GET; interface Leds; interface IEEE154Frame as Frame; interface IEEE154TxBeaconPayload; interface Packet; } } implementation { message_t m_frame; uint8_t m_payloadLen; event void Boot.booted() { call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status != IEEE154_SUCCESS) return; call MLME_SET.macShortAddress(COORDINATOR_ADDRESS); call MLME_SET.macAssociationPermit(FALSE); call MLME_START.request( PAN_ID, // PANId RADIO_CHANNEL, // LogicalChannel 0, // ChannelPage, 0, // StartTime, BEACON_ORDER, // BeaconOrder SUPERFRAME_ORDER, // SuperframeOrder TRUE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment 0, // CoordRealignSecurity 0 // BeaconSecurity ); } void dataRequest() { call MCPS_DATA.request ( &m_frame, // msdu, m_payloadLen, // payloadLength, 0, // msduHandle, TX_OPTIONS_ACK | TX_OPTIONS_INDIRECT // TxOptions, ); } event void MLME_START.confirm(ieee154_status_t status) { char payload[] = "Hello Device!"; uint8_t *payloadRegion; ieee154_address_t deviceShortAddress; // construct the frame m_payloadLen = strlen(payload); payloadRegion = call Packet.getPayload(&m_frame, m_payloadLen); deviceShortAddress.shortAddress = DEVICE_ADDRESS; // destination if (status == IEEE154_SUCCESS && m_payloadLen <= call Packet.maxPayloadLength()) { memcpy(payloadRegion, payload, m_payloadLen); call Frame.setAddressingFields( &m_frame, ADDR_MODE_SHORT_ADDRESS, // SrcAddrMode, ADDR_MODE_SHORT_ADDRESS, // DstAddrMode, PAN_ID, // DstPANId, &deviceShortAddress, // DstAddr, NULL // security ); dataRequest(); } } event void MCPS_DATA.confirm( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t Timestamp ) { if (status == IEEE154_SUCCESS) call Leds.led1Toggle(); dataRequest(); } event message_t* MCPS_DATA.indication ( message_t* frame) { return frame; } event void IEEE154TxBeaconPayload.aboutToTransmit() { } event void IEEE154TxBeaconPayload.setBeaconPayloadDone(void *beaconPayload, uint8_t length) { } event void IEEE154TxBeaconPayload.modifyBeaconPayloadDone(uint8_t offset, void *buffer, uint8_t bufferLength) { } event void IEEE154TxBeaconPayload.beaconTransmitted() { ieee154_macBSN_t beaconSequenceNumber = call MLME_GET.macBSN(); if (beaconSequenceNumber & 1) call Leds.led2On(); else call Leds.led2Off(); } } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestIndirect/coordinator/TestIndirectAppC.nc000066400000000000000000000043121207233610700323460ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 16:21:55 $ * @author: Jan Hauer * ======================================================================== */ configuration TestIndirectAppC { } implementation { components MainC, LedsC, Ieee802154BeaconEnabledC as MAC; components TestCoordSenderC as App; MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.MLME_START -> MAC; App.MCPS_DATA -> MAC; App.Frame -> MAC; App.IEEE154TxBeaconPayload -> MAC; App.Packet -> MAC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestIndirect/device/000077500000000000000000000000001207233610700255735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestIndirect/device/Makefile000066400000000000000000000006671207233610700272440ustar00rootroot00000000000000COMPONENT=TestIndirectAppC CFLAGS += -DIEEE154_BEACON_TX_DISABLED CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestIndirect/device/TestDeviceReceiverC.nc000066400000000000000000000141771207233610700317560ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2010-01-05 17:12:56 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestDeviceReceiverC { uses { interface Boot; interface MCPS_DATA; interface MLME_RESET; interface MLME_SET; interface MLME_GET; interface MLME_SCAN; interface MLME_SYNC; interface MLME_BEACON_NOTIFY; interface MLME_SYNC_LOSS; interface IEEE154BeaconFrame as BeaconFrame; interface Leds; } } implementation { ieee154_address_t m_coordAddress; uint8_t m_coordAddressMode; ieee154_macPANId_t m_coordPANID; ieee154_PANDescriptor_t m_PANDescriptor; bool m_wasScanSuccessful; void startApp(); event void Boot.booted() { call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status == IEEE154_SUCCESS) startApp(); } void startApp() { ieee154_phyChannelsSupported_t channel; uint8_t scanDuration = BEACON_ORDER; // in this application the coordinator assumes that // the device has a certain short address call MLME_SET.macShortAddress(DEVICE_ADDRESS); channel = ((uint32_t) 1) << RADIO_CHANNEL; // we want all received beacons to be signalled // through the MLME_BEACON_NOTIFY interface, i.e. // we set the macAutoRequest attribute to FALSE call MLME_SET.macAutoRequest(FALSE); m_wasScanSuccessful = FALSE; call MLME_SCAN.request ( PASSIVE_SCAN, // ScanType channel, // ScanChannels scanDuration, // ScanDuration 0x00, // ChannelPage 0, // EnergyDetectListNumEntries NULL, // EnergyDetectList 0, // PANDescriptorListNumEntries NULL, // PANDescriptorList 0 // security ); } event message_t* MLME_BEACON_NOTIFY.indication (message_t* frame) { // received a beacon frame during SCAN ieee154_phyCurrentPage_t page = call MLME_GET.phyCurrentPage(); if (!m_wasScanSuccessful && call BeaconFrame.parsePANDescriptor( frame, RADIO_CHANNEL, page, &m_PANDescriptor) == SUCCESS){ // let's see if the beacon is from our coordinator... if (m_PANDescriptor.CoordAddrMode == ADDR_MODE_SHORT_ADDRESS && m_PANDescriptor.CoordPANId == PAN_ID && m_PANDescriptor.CoordAddress.shortAddress == COORDINATOR_ADDRESS){ // wait until SCAN is finished, then syncronize to beacons m_wasScanSuccessful = TRUE; } } return frame; } event void MLME_SCAN.confirm ( ieee154_status_t status, uint8_t ScanType, uint8_t ChannelPage, uint32_t UnscannedChannels, uint8_t EnergyDetectListNumEntries, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumEntries, ieee154_PANDescriptor_t* PANDescriptorList ) { if (m_wasScanSuccessful){ // set the macAutoRequest attribute to TRUE, so indirect // transmissions are automatically carried through call MLME_SET.macAutoRequest(TRUE); call MLME_SET.macCoordShortAddress(m_PANDescriptor.CoordAddress.shortAddress); call MLME_SET.macPANId(m_PANDescriptor.CoordPANId); call MLME_SYNC.request(m_PANDescriptor.LogicalChannel, m_PANDescriptor.ChannelPage, TRUE); } else startApp(); } event void MCPS_DATA.confirm( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t Timestamp ) { } event void MLME_SYNC_LOSS.indication( ieee154_status_t lossReason, uint16_t PANId, uint8_t LogicalChannel, uint8_t ChannelPage, ieee154_security_t *security) { call Leds.led1Off(); } event message_t* MCPS_DATA.indication (message_t* frame) { call Leds.led1Toggle(); return frame; } } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestIndirect/device/TestIndirectAppC.nc000066400000000000000000000043561207233610700312720ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 16:21:55 $ * @author: Jan Hauer * ======================================================================== */ configuration TestIndirectAppC { } implementation { components MainC, LedsC, Ieee802154BeaconEnabledC as MAC; components TestDeviceReceiverC as App; MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.MLME_SCAN -> MAC; App.MLME_SYNC -> MAC; App.MLME_BEACON_NOTIFY -> MAC; App.MLME_SYNC_LOSS -> MAC; App.MCPS_DATA -> MAC; App.BeaconFrame -> MAC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/000077500000000000000000000000001207233610700243745ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/README.txt000066400000000000000000000116101207233610700260710ustar00rootroot00000000000000README for TestClusterTree Author/Contact: Jasper Buesch ------------------------------------------------------------------------------- Description: This application creates a multihop topology out of three nodes: a PAN Coordinator, a "Router" (Coordinator and Device role) and a Device. The Router associates to the PAN Coordinator and the Device associates to the Router, so the topology is: PAN Coordinator <-> Router <-> Device PAN Coordinator and Router send periodic beacons, but their active portions are shifted in time (so they don't overlap, see detailed explanation below). The Device can send packets only to the Router. And that's what is happening: after the Router has associated and synchronized with the PAN Coordinator it starts transmitting periodic beacons itself. Once the Device receives these beacon it associates and synchronizes to the Router. Then the device starts sending periodic DATA packets to the Router (1 packet/s). Whenever the Router receives a DATA packet from the device it forwards the packet to the PAN Coordinator. A node toggles its LED2 (Telos: blue) every time a beacon is sent or received and it toggles LED1 (Telos: green) every time a DATA frame is sent or received. Therefore, the Router's LEDs should to toggle twice as fast as the LEDs of the other nodes. LEDs are toggling in unison / at the same time. Criteria for a successful test: Device and PAN Coordinator should toggle LED1 and LED2 with the same frequency. The Router should toggle LED1 and LED2 with twice that frequency. LEDs are not toggled in unison. ------------------------------------------------------------------------------- Superframe structure: PAN Coordinator and Router send beacons with the same frequency. Each beacon is followed by an active period (see IEEE 802.15.4-2006 Sect. 5.5.1). It is important that the active periods of the PAN Coordinator and Router do not overlap, i.e. we want a configuation like this: Superframe structure PAN coordinator: ||---------------------------|--------------------------------------------| || Active period | Inactive period | ||---------------------------|--------------------------------------------| |<----- defined by SO ------>| Superframe structure Router: |----------------------------------------||---------------------------|---| | Inactive period || Active period | | |----------------------------------------||---------------------------|---| |<----- defined by SO ------>| |<- "StartTime" in MLME_START.request()->| |<---------------------------- defined by BO ----------------------------->| So the parameters that influence a superframe structure are Beacon Order(BO) and Superframe Order(SO) and the parameter that influences the time offset between the active periods of the PAN Coordinator and Router is "StartTime" in the MLME_START.request() interface (used only on the Router). => Formula to transform Beacon Order(BO) and Superframe Order(SO) values into symbols and seconds (refer to section "7.5.1.1 Superframe structure"): - 0 ≤ BO ≤ 14; 0 ≤ SO ≤ 14 - symbol-time in seconds = 16 us (microseconds) - aBaseSlotDuration = 60 - aNumSuperframeSlots = 16 - aBaseSuperframeDuration = aBaseSlotDuration * aNumSuperframeSlots = 960 - Beaconintervall BI in symbols = aBaseSuperframeDuration * 2^BO = 960 * 2^BO - Beaconintervall BI in seconds = BI (in symbols) * 16 us Example: BO = 4 BI in symbols = 960 symbols * 2^4 = 15360 symbols BI in seconds = 15360 symbols * 16us = 0.24576 seconds => The "StartTime" parameter in MLME_START.request() The "StartTime" time offset in the router is defined in symbols. The value has to be chosen so that the active portions of router and PAN coordinator are not overlapping (refer to the figure above). One can, for example, use the duration of the active portion of PAN coordinator as "StartTime" on the Router. ------------------------------------------------------------------------------- Tools: NONE Usage: 1. Install the PAN coordinator: $ cd pancoord; make install 2. Install the router node: $ cd router; make install 3. Install the device node: $ cd device; make install You can change some of the configuration parameters in app_profile.h ------------------------------------------------------------------------------- Known bugs/limitations: - Many TinyOS 2 platforms do not have a clock that satisfies the precision/accuracy requirements of the IEEE 802.15.4 standard (e.g. 62.500 Hz, +-40 ppm in the 2.4 GHz band); in this case the MAC timing is not standard compliant tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/app_profile.h000066400000000000000000000043211207233610700270450ustar00rootroot00000000000000/* * Copyright (c) 2010, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.0 $ * $Date: 2010/08/26 16:07:34 $ * @author: Jasper Buesch * ======================================================================== */ #ifndef __APP_PROFILE_H #define __APP_PROFILE_H enum{ PAN_ID = 0x3901, PAN_COORDINATOR_SHORT_ADDRESS = 0xEF01, ROUTER_SHORT_ADDRESS = 0xEF02, DEVICE_SHORT_ADDRESS = 0xEF03, BEACON_ORDER = 6, SUPERFRAME_ORDER = 4, RADIO_CHANNEL = 26, DATA_TRANSFER_PERIOD = 62500U, // timebase 62500U = 1 second ROUTER_BEACON_START_OFFSET = 30720U, ROUTER_FRAME_POOL_SIZE = 5, }; #endif tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/device/000077500000000000000000000000001207233610700256335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/device/Makefile000066400000000000000000000006651207233610700273020ustar00rootroot00000000000000COMPONENT=TestDeviceAppC CFLAGS += -DIEEE154_BEACON_TX_DISABLED CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/device/TestDeviceAppC.nc000066400000000000000000000046041207233610700307640ustar00rootroot00000000000000/* * Copyright (c) 2010, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.0 $ * $Date: 2010/08/26 16:07:34 $ * @author: Jasper Buesch * ======================================================================== */ configuration TestDeviceAppC { } implementation { components MainC, LedsC, Ieee802154BeaconEnabledC as MAC; components TestDeviceC as App; components new Timer62500C() as DataTimer; MainC.Boot <- App; App.MLME_RESET -> MAC; App.MLME_SCAN -> MAC; App.MLME_BEACON_NOTIFY -> MAC; App.MLME_SYNC -> MAC; App.MLME_SYNC_LOSS -> MAC; App.MLME_ASSOCIATE -> MAC; App.MCPS_DATA -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.BeaconFrame -> MAC; App.Frame -> MAC; App.Packet -> MAC; App.Leds -> LedsC; App.DataTimer -> DataTimer; } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/device/TestDeviceC.nc000066400000000000000000000206221207233610700303210ustar00rootroot00000000000000/* * Copyright (c) 2010, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.0 $ * $Date: 2010/08/26 16:07:34 $ * @author: Jasper Buesch * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestDeviceC { uses { interface Boot; interface MLME_RESET; interface MLME_SCAN; interface MLME_SYNC; interface MLME_SYNC_LOSS; interface MLME_BEACON_NOTIFY; interface MLME_ASSOCIATE; interface MCPS_DATA; interface MLME_SET; interface MLME_GET; interface IEEE154Frame as Frame; interface IEEE154BeaconFrame as BeaconFrame; interface Packet; interface Leds; interface Timer as DataTimer; } } implementation { ieee154_CapabilityInformation_t m_capabilityInformation; ieee154_PANDescriptor_t m_panDescriptor; message_t m_frame; bool m_routerWasFound; bool m_associatedToRouter; bool m_dataConfirmPending; uint8_t m_payloadLen; void scanForRouter(); event void Boot.booted() { m_capabilityInformation.AlternatePANCoordinator = 0; m_capabilityInformation.DeviceType = 0; m_capabilityInformation.PowerSource = 0; m_capabilityInformation.ReceiverOnWhenIdle = 0; m_capabilityInformation.Reserved = 0; m_capabilityInformation.SecurityCapability = 0; m_capabilityInformation.AllocateAddress = 1; call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { char myPayload[] = "This is a packet for the PAN Coordinator!"; uint8_t *p; m_payloadLen = strlen(myPayload); p = call Packet.getPayload(&m_frame, m_payloadLen); if (status == IEEE154_SUCCESS && p != NULL) { memcpy(p, myPayload, m_payloadLen); scanForRouter(); } } void scanForRouter() { ieee154_phyChannelsSupported_t channel; // we only scan the single channel on which we expect the Router uint8_t scanDuration = BEACON_ORDER; channel = ((uint32_t) 1) << RADIO_CHANNEL; // we want to be signalled every single beacon that is received during the // channel SCAN-phase, that's why we set "macAutoRequest" to FALSE call MLME_SET.macAutoRequest(FALSE); m_routerWasFound = FALSE; m_associatedToRouter = FALSE; call MLME_SCAN.request( PASSIVE_SCAN, // ScanType channel, // ScanChannels scanDuration, // ScanDuration 0x00, // ChannelPage 0, // EnergyDetectListNumEntries NULL, // EnergyDetectList 0, // PANDescriptorListNumEntries NULL, // PANDescriptorList 0 // security ); } event message_t* MLME_BEACON_NOTIFY.indication(message_t* frame) { ieee154_phyCurrentPage_t page = call MLME_GET.phyCurrentPage(); if (m_associatedToRouter) { // we are already associated to the Router // and just received one of its periodic beacons call Leds.led2Toggle(); return frame; } else { // we have received "some" beacon during the SCAN-phase, let's // check if it is the beacon from our Router if (!m_routerWasFound && call BeaconFrame.parsePANDescriptor( frame, RADIO_CHANNEL, page, &m_panDescriptor) == SUCCESS) { if (m_panDescriptor.CoordAddrMode == ADDR_MODE_SHORT_ADDRESS && m_panDescriptor.CoordPANId == PAN_ID && m_panDescriptor.CoordAddress.shortAddress == ROUTER_SHORT_ADDRESS) { m_routerWasFound = TRUE; // yes! } } } return frame; } event void MLME_SCAN.confirm( ieee154_status_t status, uint8_t ScanType, uint8_t ChannelPage, uint32_t UnscannedChannels, uint8_t EnergyDetectListNumEntries, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumEntries, ieee154_PANDescriptor_t* PANDescriptorList ) { if (m_routerWasFound) { // our Router is out there sending beacons, // let's try to associate with it call MLME_SET.macCoordShortAddress(m_panDescriptor.CoordAddress.shortAddress); call MLME_SET.macPANId(m_panDescriptor.CoordPANId); call MLME_SYNC.request(m_panDescriptor.LogicalChannel, m_panDescriptor.ChannelPage, TRUE); call MLME_ASSOCIATE.request( m_panDescriptor.LogicalChannel, // LogicalChannel m_panDescriptor.ChannelPage, // ChannelPage ADDR_MODE_SHORT_ADDRESS, // CoordAddrMode PAN_ID, // CoordPANID m_panDescriptor.CoordAddress, // CoordAddress m_capabilityInformation, // CapabilityInformation 0 // Security ); } else { scanForRouter(); } } event void MLME_ASSOCIATE.confirm( uint16_t AssocShortAddress, uint8_t status, ieee154_security_t *security ) { if (status == IEEE154_ASSOCIATION_SUCCESSFUL) { m_associatedToRouter = TRUE; call MLME_SET.macShortAddress(AssocShortAddress); call Leds.led1Off(); call DataTimer.startPeriodic(DATA_TRANSFER_PERIOD); } else { scanForRouter(); } } event void DataTimer.fired() { ieee154_address_t deviceShortAddress; deviceShortAddress.shortAddress = ROUTER_SHORT_ADDRESS; // destination if (!m_associatedToRouter || m_dataConfirmPending) return; call Frame.setAddressingFields( &m_frame, ADDR_MODE_SHORT_ADDRESS, // SrcAddrMode, ADDR_MODE_SHORT_ADDRESS, // DstAddrMode, PAN_ID, // DstPANId, &deviceShortAddress, // DstAddr, NULL // security ); if (call MCPS_DATA.request( &m_frame, // msdu, m_payloadLen, // payloadLength, 0, // msduHandle, TX_OPTIONS_ACK // TxOptions, ) == IEEE154_SUCCESS) m_dataConfirmPending = TRUE; call Leds.led1Toggle(); } event void MCPS_DATA.confirm( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t Timestamp ) { m_dataConfirmPending = FALSE; } event void MLME_SYNC_LOSS.indication( ieee154_status_t lossReason, uint16_t PANId, uint8_t LogicalChannel, uint8_t ChannelPage, ieee154_security_t *security ) { call DataTimer.stop(); scanForRouter(); } event message_t* MCPS_DATA.indication(message_t* frame) { return frame; } event void MLME_ASSOCIATE.indication( uint64_t DeviceAddress, ieee154_CapabilityInformation_t CapabilityInformation, ieee154_security_t *security ) { } } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/pancoord/000077500000000000000000000000001207233610700262015ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/pancoord/Makefile000066400000000000000000000011421207233610700276370ustar00rootroot00000000000000COMPONENT=TestPanCoordinatorAppC CFLAGS += -DIEEE154_PROMISCUOUS_MODE_DISABLED -DIEEE154_RXENABLE_DISABLED -DIEEE154_DISASSOCIATION_DISABLED -DIEEE154_COORD_REALIGNMENT_DISABLED -DIEEE154_COORD_BROADCAST_DISABLED -DIEEE154_SCAN_DISABLED CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/pancoord/TestPanCoordinatorAppC.nc000066400000000000000000000043751207233610700330620ustar00rootroot00000000000000/* * Copyright (c) 2010, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.0 $ * $Date: 2010/08/26 16:07:34 $ * @author: Jasper Buesch * ======================================================================== */ configuration TestPanCoordinatorAppC { } implementation { components MainC, LedsC, Ieee802154BeaconEnabledC as MAC; components TestPanCoordinatorC as App; MainC.Boot <- App; App.MLME_RESET -> MAC; App.MLME_START -> MAC; App.MLME_ASSOCIATE -> MAC; App.MCPS_DATA -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.IEEE154TxBeaconPayload -> MAC; App.Frame -> MAC; App.Packet -> MAC; App.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/pancoord/TestPanCoordinatorC.nc000066400000000000000000000120561207233610700324140ustar00rootroot00000000000000/* * Copyright (c) 2010, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.0 $ * $Date: 2010/08/26 16:07:34 $ * @author: Jasper Buesch * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestPanCoordinatorC { uses { interface Boot; interface MLME_RESET; interface MLME_START; interface MLME_ASSOCIATE; interface MCPS_DATA; interface MLME_SET; interface MLME_GET; interface IEEE154TxBeaconPayload; interface IEEE154Frame as Frame; interface Packet; interface Leds; } } implementation { event void Boot.booted() { call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status != IEEE154_SUCCESS) return; call MLME_SET.macShortAddress(PAN_COORDINATOR_SHORT_ADDRESS); call MLME_SET.macAssociationPermit(TRUE); call MLME_START.request( PAN_ID, // PANId RADIO_CHANNEL, // LogicalChannel 0, // ChannelPage, 0, // StartTime, BEACON_ORDER, // BeaconOrder SUPERFRAME_ORDER, // SuperframeOrder TRUE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment 0, // CoordRealignSecurity 0 // BeaconSecurity ); } event void MLME_START.confirm(ieee154_status_t status) { if (status != IEEE154_SUCCESS) call MLME_RESET.request(TRUE); } event message_t* MCPS_DATA.indication(message_t* frame) { // we received a packet from the "router" -> toggle LED1 call Leds.led1Toggle(); return frame; } event void MCPS_DATA.confirm( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t timestamp ) { } /* ------------------------------------------------------------------------------ */ event void MLME_ASSOCIATE.confirm( uint16_t assocShortAddress, uint8_t status, ieee154_security_t *security ) { } event void MLME_ASSOCIATE.indication( uint64_t deviceAddress, ieee154_CapabilityInformation_t capabilityInformation, ieee154_security_t *security ) { call MLME_ASSOCIATE.response( deviceAddress, ROUTER_SHORT_ADDRESS, IEEE154_ASSOCIATION_SUCCESSFUL, 0 ); } /* ------------------------------------------------------------------------------ */ event void IEEE154TxBeaconPayload.aboutToTransmit() { } event void IEEE154TxBeaconPayload.setBeaconPayloadDone(void *beaconPayload, uint8_t length) { } event void IEEE154TxBeaconPayload.modifyBeaconPayloadDone(uint8_t offset, void *buffer, uint8_t bufferLength) { } event void IEEE154TxBeaconPayload.beaconTransmitted() { call Leds.led2Toggle(); } } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/router/000077500000000000000000000000001207233610700257145ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/router/Makefile000066400000000000000000000011021207233610700273460ustar00rootroot00000000000000COMPONENT=TestRouterAppC CFLAGS += -DIEEE154_PROMISCUOUS_MODE_DISABLED -DIEEE154_RXENABLE_DISABLED -DIEEE154_DISASSOCIATION_DISABLED -DIEEE154_COORD_REALIGNMENT_DISABLED -DIEEE154_COORD_BROADCAST_DISABLED CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/router/TestRouterAppC.nc000066400000000000000000000050121207233610700311200ustar00rootroot00000000000000/* * Copyright (c) 2010, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.0 $ * $Date: 2010/08/26 16:07:34 $ * @author: Jasper Buesch * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" configuration TestRouterAppC { } implementation { components MainC, LedsC, Ieee802154BeaconEnabledC as MAC; components TestRouterC as App; components new PoolC(message_t, ROUTER_FRAME_POOL_SIZE) as FramePool; MainC.Boot <- App; App.MLME_RESET -> MAC; App.MLME_SCAN -> MAC; App.MLME_BEACON_NOTIFY -> MAC; App.MLME_SYNC -> MAC; App.MLME_SYNC_LOSS -> MAC; App.MLME_ASSOCIATE -> MAC; App.MLME_START -> MAC; App.MCPS_DATA -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.IEEE154TxBeaconPayload -> MAC; App.BeaconFrame -> MAC; App.Frame -> MAC; App.Packet -> MAC; App.FramePool -> FramePool; App.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestMultihop/router/TestRouterC.nc000066400000000000000000000277111207233610700304710ustar00rootroot00000000000000/* * Copyright (c) 2010, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.0 $ * $Date: 2010/08/26 16:07:34 $ * @author: Jasper Buesch * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestRouterC { uses { interface Boot; interface MLME_RESET; interface MLME_SCAN; interface MLME_SYNC; interface MLME_SYNC_LOSS; interface MLME_BEACON_NOTIFY; interface MLME_ASSOCIATE; interface MLME_START; interface MCPS_DATA; interface MLME_GET; interface MLME_SET; interface IEEE154TxBeaconPayload; interface IEEE154BeaconFrame as BeaconFrame; interface IEEE154Frame as Frame; interface Packet; interface Pool as FramePool; interface Leds; } } implementation { ieee154_CapabilityInformation_t m_capabilityInformation; ieee154_PANDescriptor_t m_PANDescriptor; uint8_t m_panCoordinatorWasFound = FALSE; uint8_t m_associatedToPanCoord = FALSE; void scanForPanCoord(); /* ------------------------------------------------------------------------------ */ event void Boot.booted() { m_capabilityInformation.AlternatePANCoordinator = 0; m_capabilityInformation.DeviceType = 1; m_capabilityInformation.PowerSource = 0; m_capabilityInformation.ReceiverOnWhenIdle = 0; m_capabilityInformation.Reserved = 0; m_capabilityInformation.SecurityCapability = 0; m_capabilityInformation.AllocateAddress = 1; m_panCoordinatorWasFound = FALSE; m_associatedToPanCoord = FALSE; call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status != IEEE154_SUCCESS) return; else scanForPanCoord(); } void scanForPanCoord() { uint8_t scanDuration = BEACON_ORDER; // we only scan the single channel on which we expect the PAN coordinator ieee154_phyChannelsSupported_t channel = ((uint32_t) 1) << RADIO_CHANNEL; // we want to be signalled every single beacon that is received during the // channel SCAN-phase, that's why we set "macAutoRequest" to FALSE call MLME_SET.macAutoRequest(FALSE); m_panCoordinatorWasFound = FALSE; m_associatedToPanCoord = FALSE; call MLME_SCAN.request( PASSIVE_SCAN, // ScanType channel, // ScanChannels scanDuration, // ScanDuration 0x00, // ChannelPage 0, // EnergyDetectListNumEntries NULL, // EnergyDetectList 0, // PANDescriptorListNumEntries NULL, // PANDescriptorList 0 // security ); } event message_t* MLME_BEACON_NOTIFY.indication(message_t* frame) { ieee154_phyCurrentPage_t page; if (m_associatedToPanCoord == TRUE) { // we are already associated with the PAN Coordinator // and just received one of its periodic beacons call Leds.led2Toggle(); } else { // we have received "some" beacon during the SCAN-phase, let's // check if it is the beacon from our PAN Coordinator page = call MLME_GET.phyCurrentPage(); if ((m_panCoordinatorWasFound == FALSE) && call BeaconFrame.parsePANDescriptor( frame, RADIO_CHANNEL, page, &m_PANDescriptor) == SUCCESS) { if (m_PANDescriptor.CoordAddrMode == ADDR_MODE_SHORT_ADDRESS && m_PANDescriptor.CoordPANId == PAN_ID && m_PANDescriptor.CoordAddress.shortAddress == PAN_COORDINATOR_SHORT_ADDRESS) { m_panCoordinatorWasFound = TRUE; // yes! } } } return frame; } event void MLME_SCAN.confirm( ieee154_status_t status, uint8_t ScanType, uint8_t ChannelPage, uint32_t UnscannedChannels, uint8_t EnergyDetectListNumEntries, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumEntries, ieee154_PANDescriptor_t* PANDescriptorList ) { if (m_panCoordinatorWasFound) { // our PAN Coordinator is out there sending beacons, // let's try to associate with it call MLME_SET.macCoordShortAddress(m_PANDescriptor.CoordAddress.shortAddress); call MLME_SET.macPANId(m_PANDescriptor.CoordPANId); call MLME_SYNC.request(m_PANDescriptor.LogicalChannel, m_PANDescriptor.ChannelPage, TRUE); call MLME_ASSOCIATE.request( m_PANDescriptor.LogicalChannel, // LogicalChannel m_PANDescriptor.ChannelPage, // ChannelPage ADDR_MODE_SHORT_ADDRESS, // CoordAddrMode PAN_ID, // CoordPANID m_PANDescriptor.CoordAddress, // CoordAddress m_capabilityInformation, // CapabilityInformation 0 // Security ); } else { scanForPanCoord(); } } event void MLME_ASSOCIATE.confirm( uint16_t assocShortAddress, uint8_t status, ieee154_security_t *security ) { if (status == IEEE154_ASSOCIATION_SUCCESSFUL) { // we have successfully associated with the PAN Coordinator. // now we should start sending our own beacons, so the device // can associate with us; but we must make sure that our active // period does not overlap with PAN Coordinator's active period // (via the "StartTime" parameter to "MLME_START.request") call Leds.led1Off(); m_associatedToPanCoord = TRUE; call MLME_SET.macShortAddress(assocShortAddress); call MLME_SET.macAssociationPermit(TRUE); call MLME_START.request( PAN_ID, // PANId RADIO_CHANNEL, // LogicalChannel 0, // ChannelPage, (uint32_t) ROUTER_BEACON_START_OFFSET, // StartTime, BEACON_ORDER, // BeaconOrder SUPERFRAME_ORDER, // SuperframeOrder FALSE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment 0, // CoordRealignSecurity 0 // BeaconSecurity ); } else { scanForPanCoord(); } } event void MLME_START.confirm(ieee154_status_t status) { if (status != IEEE154_SUCCESS) scanForPanCoord(); } event void MLME_SYNC_LOSS.indication( ieee154_status_t lossReason, uint16_t panId, uint8_t logicalChannel, uint8_t channelPage, ieee154_security_t *security ) { // We have lost track of our PAN Coordinator's beacons :( // We stop sending our own beacons, until we have synchronized with // the PAN Coordinator again. if (lossReason == IEEE154_BEACON_LOSS) { call Leds.led2Off(); call MLME_START.request( PAN_ID, // PANId RADIO_CHANNEL, // LogicalChannel 0, // ChannelPage, 0, // StartTime, 15, // BeaconOrder 15, // SuperframeOrder FALSE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment 0, // CoordRealignSecurity 0 // BeaconSecurity ); scanForPanCoord(); } } /* ------------------------------------------------------------------------------ */ /* Everything above was about finding and associating with the PAN Coordinator and * then starting to send our own beacons. The code below is about allowing the device * to associate, receiving data from it and forwarding it to the PAN Coordinator.*/ event void MLME_ASSOCIATE.indication( uint64_t deviceAddress, ieee154_CapabilityInformation_t capabilityInformation, ieee154_security_t *security ) { // The device wants to associate ... call MLME_ASSOCIATE.response( deviceAddress, DEVICE_SHORT_ADDRESS, IEEE154_ASSOCIATION_SUCCESSFUL, 0 ); } event message_t* MCPS_DATA.indication(message_t* receivedFrame) { message_t* returnFrame; ieee154_address_t panCoordAddr; uint8_t payloadLen = call Frame.getPayloadLength(receivedFrame); panCoordAddr.shortAddress = PAN_COORDINATOR_SHORT_ADDRESS; call Leds.led1Toggle(); // if we are no more associated with the PAN coordinator, we drop the frame if (m_associatedToPanCoord == FALSE) { return receivedFrame; } // This event handler has to return a frame buffer to the MAC. // We don't want to return "receivedFrame", because we will try // to forward that to the PAN Coordinator. Instead we get an "empty" // frame through the PoolC component and return that to the MAC. returnFrame = call FramePool.get(); if (returnFrame == NULL) return receivedFrame; // no empty frame left! // to forward the frame to the PAN Coordinator we update // the addressing part (the payload part remains unchanged!) call Frame.setAddressingFields( receivedFrame, ADDR_MODE_SHORT_ADDRESS, // SrcAddrMode, ADDR_MODE_SHORT_ADDRESS, // DstAddrMode, PAN_ID, // DstPANId, &panCoordAddr, // DstAddr, NULL // security ); call MCPS_DATA.request( receivedFrame, // msdu, payloadLen, // payloadLength, 0, // msduHandle, TX_OPTIONS_ACK // TxOptions, ); return returnFrame; } event void MCPS_DATA.confirm( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t Timestamp ) { call Leds.led1Toggle(); call FramePool.put(msg); } /* ------------------------------------------------------------------------------ */ event void IEEE154TxBeaconPayload.aboutToTransmit() { } event void IEEE154TxBeaconPayload.setBeaconPayloadDone(void *beaconPayload, uint8_t length) { } event void IEEE154TxBeaconPayload.modifyBeaconPayloadDone(uint8_t offset, void *buffer, uint8_t bufferLength) { } event void IEEE154TxBeaconPayload.beaconTransmitted() { call Leds.led2Toggle(); } } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestStartSync/000077500000000000000000000000001207233610700245255ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestStartSync/README.txt000066400000000000000000000022151207233610700262230ustar00rootroot00000000000000README for TestStartSync Author/Contact: Jan Hauer Description: In this application one node takes the role of a PAN coordinator in a beacon-enabled 802.15.4 PAN, it transmits periodic beacons with a frequency defined in the app_profile.h file. A second node acts as a device, it first scans all available channels for beacons from the coordinator and once it finds a beacon it tries to synchronize to and track all future beacons. Criteria for a successful test: After a few seconds all nodes should have the LED1 turned on and LED2 toggling in unison every second. Tools: NONE Usage: 1. Install the coordinator: $ cd coordinator; make install 2. Install one (or more) devices: $ cd device; make install You can change some of the configuration parameters in app_profile.h Known bugs/limitations: - Many TinyOS 2 platforms do not have a clock that satisfies the precision/accuracy requirements of the IEEE 802.15.4 standard (e.g. 62.500 Hz, +-40 ppm in the 2.4 GHz band); in this case the MAC timing is not standard compliant $Id: README.txt,v 1.3 2010-01-05 17:12:56 janhauer Exp $ tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestStartSync/app_profile.h000066400000000000000000000037711207233610700272060ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 16:21:55 $ * @author: Jan Hauer * ======================================================================== */ #ifndef __APP_PROFILE_H #define __APP_PROFILE_H enum { RADIO_CHANNEL = 26, PAN_ID = 0x7761, COORDINATOR_ADDRESS = 0x1832, BEACON_ORDER = 5, SUPERFRAME_ORDER = 5, }; #endif tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestStartSync/coordinator/000077500000000000000000000000001207233610700270505ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestStartSync/coordinator/Makefile000066400000000000000000000007221207233610700305110ustar00rootroot00000000000000COMPONENT=TestStartSyncAppC CFLAGS += -I$(shell pwd)/.. CFLAGS += -DIEEE154_SCAN_DISABLED -DIEEE154_BEACON_SYNC_DISABLED # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestStartSync/coordinator/TestCoordC.nc000066400000000000000000000073331207233610700314110ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 16:21:55 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestCoordC { uses { interface Boot; interface MLME_RESET; interface MLME_START; interface MLME_SET; interface MLME_GET; interface Leds; interface IEEE154TxBeaconPayload; } } implementation { uint8_t m_beaconPayload[] = {0x01, 0x02, 0x03, 0x04, 0x05}; event void Boot.booted() { call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status == IEEE154_SUCCESS){ call MLME_SET.macShortAddress(COORDINATOR_ADDRESS); call MLME_SET.macAssociationPermit(FALSE); call MLME_START.request( PAN_ID, // PANId RADIO_CHANNEL, // LogicalChannel 0, // ChannelPage, 0, // StartTime, BEACON_ORDER, // BeaconOrder SUPERFRAME_ORDER, // SuperframeOrder TRUE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment 0, // no realignment security 0 // no beacon security ); } } event void MLME_START.confirm(ieee154_status_t status) { if (status == IEEE154_SUCCESS){ call IEEE154TxBeaconPayload.setBeaconPayload(m_beaconPayload, sizeof(m_beaconPayload)); call Leds.led1On(); } } event void IEEE154TxBeaconPayload.aboutToTransmit() { } event void IEEE154TxBeaconPayload.setBeaconPayloadDone(void *beaconPayload, uint8_t length) { } event void IEEE154TxBeaconPayload.modifyBeaconPayloadDone(uint8_t offset, void *buffer, uint8_t bufferLength) { } event void IEEE154TxBeaconPayload.beaconTransmitted() { ieee154_macBSN_t beaconSequenceNumber = call MLME_GET.macBSN(); if (beaconSequenceNumber & 1) call Leds.led2On(); else call Leds.led2Off(); } } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestStartSync/coordinator/TestStartSyncAppC.nc000066400000000000000000000042221207233610700327300ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 16:21:55 $ * @author: Jan Hauer * ======================================================================== */ configuration TestStartSyncAppC { } implementation { components MainC, LedsC, Ieee802154BeaconEnabledC as MAC; components TestCoordC as App; MainC.Boot <- App; App.MLME_START -> MAC; App.IEEE154TxBeaconPayload -> MAC; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestStartSync/device/000077500000000000000000000000001207233610700257645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestStartSync/device/Makefile000066400000000000000000000012401207233610700274210ustar00rootroot00000000000000COMPONENT=TestStartSyncAppC CFLAGS += -DIEEE154_BEACON_TX_DISABLED -DIEEE154_PROMISCUOUS_MODE_DISABLED -DIEEE154_RXENABLE_DISABLED -DIEEE154_ASSOCIATION_DISABLED -DIEEE154_DISASSOCIATION_DISABLED -DIEEE154_COORD_REALIGNMENT_DISABLED -DIEEE154_COORD_BROADCAST_DISABLED -DIEEE154_INDIRECT_TX_DISABLED CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/beacon-enabled/TestStartSync/device/TestDeviceC.nc000066400000000000000000000133411207233610700304520ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 16:21:55 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestDeviceC { uses { interface Boot; interface MLME_RESET; interface MLME_SET; interface MLME_GET; interface MLME_SCAN; interface MLME_SYNC; interface MLME_BEACON_NOTIFY; interface MLME_SYNC_LOSS; interface Leds; interface IEEE154BeaconFrame as BeaconFrame; } } implementation { enum { NUM_PAN_DESCRIPTORS = 10, }; ieee154_PANDescriptor_t m_PANDescriptor[NUM_PAN_DESCRIPTORS]; void startApp(); event void Boot.booted() { call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status == IEEE154_SUCCESS) startApp(); } void startApp() { ieee154_phyChannelsSupported_t scanChannels; uint8_t scanDuration = BEACON_ORDER; // set the short address to whatever was passed // as a parameter to make system ("make install,X") call MLME_SET.macShortAddress(TOS_NODE_ID); scanChannels = call MLME_GET.phyChannelsSupported(); //scanChannels = (uint32_t) 1 << RADIO_CHANNEL; // setting the macAutoRequest attribute to TRUE means // that during the scan beacons will not be signalled // through MLME_BEACON_NOTIFY call MLME_SET.macAutoRequest(TRUE); call MLME_SCAN.request ( PASSIVE_SCAN, // ScanType scanChannels, // ScanChannels scanDuration, // ScanDuration 0x00, // ChannelPage 0, // EnergyDetectListNumEntries NULL, // EnergyDetectList NUM_PAN_DESCRIPTORS, // PANDescriptorListNumEntries m_PANDescriptor, // PANDescriptorList 0 // security ); } event void MLME_SCAN.confirm ( ieee154_status_t status, uint8_t ScanType, uint8_t ChannelPage, uint32_t UnscannedChannels, uint8_t EnergyDetectListNumEntries, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumEntries, ieee154_PANDescriptor_t* PANDescriptorList ) { uint8_t i; switch (status){ case IEEE154_NO_BEACON: startApp(); break; case IEEE154_SUCCESS: if (PANDescriptorListNumEntries > 0){ for (i=0; i * ======================================================================== */ configuration TestStartSyncAppC { } implementation { components MainC, LedsC, Ieee802154BeaconEnabledC as MAC; components TestDeviceC as App; App.MLME_SCAN -> MAC; App.MLME_SYNC -> MAC; App.MLME_BEACON_NOTIFY -> MAC; App.MLME_SYNC_LOSS -> MAC; App.BeaconFrame -> MAC; MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; #ifdef PRINTF_ENABLED components PrintfC; App.PrintfControl -> PrintfC; App.PrintfFlush -> PrintfC; #endif } tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/000077500000000000000000000000001207233610700224465ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestActiveScan/000077500000000000000000000000001207233610700253265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestActiveScan/README.txt000066400000000000000000000022541207233610700270270ustar00rootroot00000000000000README for TestActiveScan Author/Contact: Jan Hauer Description: In this application one node takes the role of a PAN coordinator in a nonbeacon-enabled 802.15.4 PAN, it switches its radio to receive mode. A second node acts as a device, it switches to the pre-defined channel and periodically performs active-scans (i.e. sends out beacon request frames) on the predefined channel and expects beacon frames in return. Criteria for a successful test: The coordinator should toggle LED1 once every 2 seconds. The device should toggle LED1 and LED2 every 2 seconds (not necessarily simultaneously). Tools: NONE Usage: 1. Install the coordinator: $ cd coordinator; make install 2. Install one (or more) devices: $ cd device; make install You can change some of the configuration parameters in app_profile.h Known bugs/limitations: - Many TinyOS 2 platforms do not have a clock that satisfies the precision/accuracy requirements of the IEEE 802.15.4 standard (e.g. 62.500 Hz, +-40 ppm in the 2.4 GHz band); in this case the MAC timing is not standard compliant $Id: README.txt,v 1.3 2010-01-05 17:12:56 janhauer Exp $o tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestActiveScan/app_profile.h000066400000000000000000000037731207233610700300110ustar00rootroot00000000000000/* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-06-10 09:38:41 $ * @author: Jasper Buesch * ======================================================================== */ #ifndef __APP_PROFILE_H #define __APP_PROFILE_H enum { RADIO_CHANNEL = 26, PAN_ID = 0x1234, COORDINATOR_ADDRESS = 0x2345, DEVICE_ADDRESS = 0x2346 }; #endif tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestActiveScan/coordinator/000077500000000000000000000000001207233610700276515ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestActiveScan/coordinator/Makefile000066400000000000000000000006271207233610700313160ustar00rootroot00000000000000COMPONENT=TestActiveScanCoordAppC CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include TestActiveScanCoordAppC.nc000066400000000000000000000043571207233610700345400ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestActiveScan/coordinator/* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-06-10 09:38:41 $ * @author: Jasper Buesch * ======================================================================== */ configuration TestActiveScanCoordAppC { } implementation { components MainC, LedsC, Ieee802154NonBeaconEnabledC as MAC; components new Timer62500C() as Timer1; components TestActiveScanCoordC as App; MainC.Boot <- App; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.MLME_START -> MAC; App.IEEE154TxBeaconPayload -> MAC; App.Led1Timer -> Timer1; App.Leds -> LedsC; } TestActiveScanCoordC.nc000066400000000000000000000073261207233610700340760ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestActiveScan/coordinator/* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-06-10 09:38:41 $ * @author: Jasper Buesch * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestActiveScanCoordC { uses { interface Boot; interface MLME_RESET; interface MLME_START; interface MLME_SET; interface MLME_GET; interface IEEE154TxBeaconPayload; interface Leds; interface Timer as Led1Timer; } } implementation { event void Boot.booted() { call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status != IEEE154_SUCCESS) return; call MLME_SET.macShortAddress(COORDINATOR_ADDRESS); call MLME_SET.macAssociationPermit(FALSE); call MLME_SET.macRxOnWhenIdle(TRUE); call MLME_START.request( PAN_ID, // PANId RADIO_CHANNEL, // LogicalChannel 0, // ChannelPage, 0, // StartTime, 15, // BeaconOrder 15, // SuperframeOrder TRUE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment NULL, // no realignment security NULL // no beacon security ); } event void MLME_START.confirm(ieee154_status_t status) {} event void IEEE154TxBeaconPayload.aboutToTransmit() { call Leds.led1On(); call Led1Timer.startOneShot(62500U); } event void Led1Timer.fired(){ call Leds.led1Off(); } event void IEEE154TxBeaconPayload.setBeaconPayloadDone(void *beaconPayload, uint8_t length){} event void IEEE154TxBeaconPayload.modifyBeaconPayloadDone(uint8_t offset, void *buffer, uint8_t bufferLength){} event void IEEE154TxBeaconPayload.beaconTransmitted(){} } tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestActiveScan/device/000077500000000000000000000000001207233610700265655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestActiveScan/device/Makefile000066400000000000000000000006301207233610700302240ustar00rootroot00000000000000COMPONENT=TestActiveScanDeviceAppC CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include TestActiveScanDeviceAppC.nc000066400000000000000000000046371207233610700336060ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestActiveScan/device/* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-06-10 09:38:41 $ * @author: Jasper Buesch * ======================================================================== */ configuration TestActiveScanDeviceAppC { } implementation { components MainC, LedsC, Ieee802154NonBeaconEnabledC as MAC, new Timer62500C() as Timer1, new Timer62500C() as Timer2, new Timer62500C() as Timer3, new Timer62500C() as Timer4; components TestActiveScanDeviceC as App; MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.MLME_SCAN -> MAC; App.ScanTimer -> Timer1; App.Led0Timer -> Timer2; App.Led1Timer -> Timer3; App.Led2Timer -> Timer4; } tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestActiveScan/device/TestActiveScanDeviceC.nc000066400000000000000000000112651207233610700332170ustar00rootroot00000000000000/* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2010-01-05 17:12:56 $ * @author: Jasper Buesch * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestActiveScanDeviceC { uses { interface Boot; interface MLME_RESET; interface MLME_SET; interface MLME_GET; interface MLME_SCAN; interface Leds; interface Timer as ScanTimer; interface Timer as Led1Timer; interface Timer as Led0Timer; interface Timer as Led2Timer; } } implementation { ieee154_PANDescriptor_t m_PANDescriptor[5]; event void Boot.booted() { call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status == IEEE154_SUCCESS){ call ScanTimer.startPeriodic(125000U); } } event void ScanTimer.fired() { ieee154_phyChannelsSupported_t channelMask; channelMask = ((uint32_t) 1) << RADIO_CHANNEL; call Leds.led2On(); call Led2Timer.startOneShot(62500U); call MLME_SCAN.request ( ACTIVE_SCAN, // ScanType channelMask, // ScanChannels 5, // ScanDuration 0x00, // ChannelPage 0, // EnergyDetectListNumEntries NULL, // EnergyDetectList 5, // PANDescriptorListNumEntries m_PANDescriptor, // PANDescriptorList 0 // security ); } event void MLME_SCAN.confirm ( ieee154_status_t status, uint8_t ScanType, uint8_t ChannelPage, uint32_t UnscannedChannels, uint8_t EnergyDetectListNumEntries, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumEntries, ieee154_PANDescriptor_t* PANDescriptorList ){ uint8_t scanIndex; uint8_t rightCoordFound = FALSE; for(scanIndex = 0; scanIndex < PANDescriptorListNumEntries; scanIndex++){ if( (PANDescriptorList[scanIndex].CoordAddrMode == ADDR_MODE_SHORT_ADDRESS) && (PANDescriptorList[scanIndex].CoordAddress.shortAddress == COORDINATOR_ADDRESS) && (PANDescriptorList[scanIndex].CoordPANId == PAN_ID) ) { call Leds.led1On(); call Led1Timer.startOneShot(62500U); rightCoordFound = TRUE; break; } } if(rightCoordFound == FALSE) { // call Leds.led0On(); // call Led0Timer.startOneShot(62500U); } } event void Led0Timer.fired(){ call Leds.led0Off(); } event void Led1Timer.fired(){ call Leds.led1Off(); } event void Led2Timer.fired(){ call Leds.led2Off(); } } tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestAssociate/000077500000000000000000000000001207233610700252215ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestAssociate/README.txt000066400000000000000000000026411207233610700267220ustar00rootroot00000000000000README for TestAssociate Author/Contact: Jan Hauer Description: In this application one node takes the role of a PAN coordinator in a nonbeacon-enabled 802.15.4 PAN, it switches its radio to receive mode and waits for devices to request association to its PAN. Whenever a device tries to associate, the PAN coordinator allows association and assigns to the device a unique short address (starting from zero, incremented for every device requesting association). A second node acts as a device, it switches to the pre-defined channel and tries to associate to the PAN. A short time after association the device then disassociates from the PAN. Criteria for a successful test: Assuming one coordinator and one device has been installed, both should simultaneously switch on LED1. About 5 seconds later both should switch LED1 off. That's all. Tools: NONE Usage: 1. Install the coordinator: $ cd coordinator; make install 2. Install one (or more) devices: $ cd device; make install You can change some of the configuration parameters in app_profile.h Known bugs/limitations: - Many TinyOS 2 platforms do not have a clock that satisfies the precision/accuracy requirements of the IEEE 802.15.4 standard (e.g. 62.500 Hz, +-40 ppm in the 2.4 GHz band); in this case the MAC timing is not standard compliant $Id: README.txt,v 1.3 2010-01-05 17:12:56 janhauer Exp $o tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestAssociate/app_profile.h000066400000000000000000000037151207233610700277000ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 17:13:02 $ * @author: Jan Hauer * ======================================================================== */ #ifndef __APP_PROFILE_H #define __APP_PROFILE_H enum { RADIO_CHANNEL = 26, PAN_ID = 0x9678, COORDINATOR_ADDRESS = 0x7722, }; #endif tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestAssociate/coordinator/000077500000000000000000000000001207233610700275445ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestAssociate/coordinator/Makefile000066400000000000000000000006211207233610700312030ustar00rootroot00000000000000COMPONENT=TestAssociateAppC CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestAssociate/coordinator/TestAssociateAppC.nc000066400000000000000000000042771207233610700334170ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 17:13:02 $ * @author: Jan Hauer * ======================================================================== */ configuration TestAssociateAppC { } implementation { components MainC, LedsC, Ieee802154NonBeaconEnabledC as MAC; components TestCoordC as App; MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.MLME_START -> MAC; App.MLME_ASSOCIATE -> MAC; App.MLME_DISASSOCIATE -> MAC; App.MLME_COMM_STATUS -> MAC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestAssociate/coordinator/TestCoordC.nc000066400000000000000000000121711207233610700321010ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 17:13:02 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestCoordC { uses { interface Boot; interface MLME_RESET; interface MLME_START; interface MLME_ASSOCIATE; interface MLME_DISASSOCIATE; interface MLME_COMM_STATUS; interface MLME_SET; interface MLME_GET; interface Leds; } } implementation { ieee154_address_t m_lastDevice; uint16_t m_shortAddress; event void Boot.booted() { call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status != IEEE154_SUCCESS) return; call MLME_SET.macShortAddress(COORDINATOR_ADDRESS); call MLME_SET.macAssociationPermit(TRUE); call MLME_SET.macRxOnWhenIdle(TRUE); call MLME_START.request( PAN_ID, // PANId RADIO_CHANNEL, // LogicalChannel 0, // ChannelPage, 0, // StartTime, 15, // BeaconOrder 15, // SuperframeOrder TRUE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment NULL, // no realignment security NULL // no beacon security ); } event void MLME_START.confirm(ieee154_status_t status) { // good, let's wait for association requests ... } event void MLME_ASSOCIATE.indication ( uint64_t DeviceAddress, ieee154_CapabilityInformation_t CapabilityInformation, ieee154_security_t *security ) { call MLME_ASSOCIATE.response(DeviceAddress, m_shortAddress++, IEEE154_ASSOCIATION_SUCCESSFUL, 0); } event void MLME_DISASSOCIATE.indication ( uint64_t DeviceAddress, ieee154_disassociation_reason_t DisassociateReason, ieee154_security_t *security ) { call Leds.led1Off(); } event void MLME_COMM_STATUS.indication ( uint16_t PANId, uint8_t SrcAddrMode, ieee154_address_t SrcAddr, uint8_t DstAddrMode, ieee154_address_t DstAddr, ieee154_status_t status, ieee154_security_t *security ) { if (status == IEEE154_SUCCESS){ // association was successful call Leds.led1On(); m_lastDevice.extendedAddress = DstAddr.extendedAddress; } else { call Leds.led1Off(); } } event void MLME_DISASSOCIATE.confirm ( ieee154_status_t status, uint8_t DeviceAddrMode, uint16_t DevicePANID, ieee154_address_t DeviceAddress ){} event void MLME_ASSOCIATE.confirm ( uint16_t AssocShortAddress, uint8_t status, ieee154_security_t *security ){} } tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestAssociate/device/000077500000000000000000000000001207233610700264605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestAssociate/device/Makefile000066400000000000000000000006211207233610700301170ustar00rootroot00000000000000COMPONENT=TestAssociateAppC CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestAssociate/device/TestAssociateAppC.nc000066400000000000000000000043641207233610700323300ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 17:13:02 $ * @author: Jan Hauer * ======================================================================== */ configuration TestAssociateAppC { } implementation { components MainC, LedsC, Ieee802154NonBeaconEnabledC as MAC, new Timer62500C() as Timer; components TestDeviceC as App; MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.DisassociateTimer -> Timer; App.MLME_ASSOCIATE -> MAC; App.MLME_DISASSOCIATE -> MAC; App.MLME_COMM_STATUS -> MAC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestAssociate/device/TestDeviceC.nc000066400000000000000000000127311207233610700311500ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-09-10 12:00:49 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestDeviceC { uses { interface Boot; interface MLME_RESET; interface MLME_SET; interface MLME_GET; interface MLME_ASSOCIATE; interface MLME_DISASSOCIATE; interface MLME_COMM_STATUS; interface Leds; interface Timer as DisassociateTimer; } } implementation { ieee154_CapabilityInformation_t m_capabilityInformation; void startApp(); event void Boot.booted() { m_capabilityInformation.AlternatePANCoordinator = 0; m_capabilityInformation.DeviceType = 0; m_capabilityInformation.PowerSource = 0; m_capabilityInformation.ReceiverOnWhenIdle = 0; m_capabilityInformation.Reserved = 0; m_capabilityInformation.SecurityCapability = 0; m_capabilityInformation.AllocateAddress = 1; call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status == IEEE154_SUCCESS) startApp(); } void startApp() { ieee154_address_t coordAdr; coordAdr.shortAddress = COORDINATOR_ADDRESS; call MLME_SET.phyCurrentChannel(RADIO_CHANNEL); call MLME_SET.macAutoRequest(FALSE); call MLME_SET.macPANId(PAN_ID); call MLME_SET.macCoordShortAddress(COORDINATOR_ADDRESS); call MLME_ASSOCIATE.request( RADIO_CHANNEL, call MLME_GET.phyCurrentPage(), ADDR_MODE_SHORT_ADDRESS, PAN_ID, coordAdr, m_capabilityInformation, NULL // security ); } event void MLME_ASSOCIATE.confirm ( uint16_t AssocShortAddress, uint8_t status, ieee154_security_t *security ) { if ( status == IEEE154_SUCCESS ){ // we are now associated - set a timer for disassociation call Leds.led1On(); call DisassociateTimer.startOneShot(312500U); } else { startApp(); // retry } } event void DisassociateTimer.fired() { ieee154_address_t coordAdr; coordAdr.shortAddress = COORDINATOR_ADDRESS; if (call MLME_DISASSOCIATE.request ( ADDR_MODE_SHORT_ADDRESS, PAN_ID, coordAdr, IEEE154_DEVICE_WISHES_TO_LEAVE, FALSE, NULL ) != IEEE154_SUCCESS) call DisassociateTimer.startOneShot(312500U); } event void MLME_DISASSOCIATE.confirm ( ieee154_status_t status, uint8_t DeviceAddrMode, uint16_t DevicePANID, ieee154_address_t DeviceAddress ) { if (status == IEEE154_SUCCESS){ call Leds.led1Off(); } else { call DisassociateTimer.startOneShot(312500U); } } event void MLME_ASSOCIATE.indication ( uint64_t DeviceAddress, ieee154_CapabilityInformation_t CapabilityInformation, ieee154_security_t *security ){} event void MLME_DISASSOCIATE.indication ( uint64_t DeviceAddress, ieee154_disassociation_reason_t DisassociateReason, ieee154_security_t *security ){} event void MLME_COMM_STATUS.indication ( uint16_t PANId, uint8_t SrcAddrMode, ieee154_address_t SrcAddr, uint8_t DstAddrMode, ieee154_address_t DstAddr, ieee154_status_t status, ieee154_security_t *security ) {} } tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestIndirectData/000077500000000000000000000000001207233610700256415ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestIndirectData/README.txt000066400000000000000000000023611207233610700273410ustar00rootroot00000000000000README for TestIndirectData Author/Contact: Jan Hauer Description: In this application one node takes the role of a PAN coordinator in a nonbeacon-enabled 802.15.4 PAN, every 3 seconds it sends a packet to a device using indirect transmission (i.e. the packet is buffered until it is polled by the device). A second node acts as the device, it switches to the pre-defined channel and polls the coordinator every 1 second for outstanding indirect transmissions. Criteria for a successful test: Assuming one coordinator and one device has been installed, the coordinator should briefly flash LED1 every 3 seconds. The device should briefly flash LED2 every 1 second. Tools: NONE Usage: 1. Install the coordinator: $ cd coordinator; make install 2. Install one (or more) devices: $ cd device; make install You can change some of the configuration parameters in app_profile.h Known bugs/limitations: - Many TinyOS 2 platforms do not have a clock that satisfies the precision/accuracy requirements of the IEEE 802.15.4 standard (e.g. 62.500 Hz, +-40 ppm in the 2.4 GHz band); in this case the MAC timing is not standard compliant $Id: README.txt,v 1.3 2010-01-05 17:12:56 janhauer Exp $o tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestIndirectData/app_profile.h000066400000000000000000000037711207233610700303220ustar00rootroot00000000000000/* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-06-10 09:23:45 $ * @author: Jasper Buesch * ======================================================================== */ #ifndef __APP_PROFILE_H #define __APP_PROFILE_H enum { RADIO_CHANNEL = 26, PAN_ID = 0x4927, COORDINATOR_ADDRESS = 0x6287, DEVICE_ADDRESS = 0x6288 }; #endif tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestIndirectData/coordinator/000077500000000000000000000000001207233610700301645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestIndirectData/coordinator/Makefile000066400000000000000000000006311207233610700316240ustar00rootroot00000000000000COMPONENT=TestIndirectDataCoordAppC CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include TestIndirectDataCoordAppC.nc000066400000000000000000000046311207233610700353610ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestIndirectData/coordinator/* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-06-10 09:23:45 $ * @author: Jasper Buesch * ======================================================================== */ configuration TestIndirectDataCoordAppC { } implementation { components MainC, LedsC, Ieee802154NonBeaconEnabledC as MAC; components TestIndirectDataCoordC as App; components new Timer62500C() as Timer1; components new Timer62500C() as Timer2; components new Timer62500C() as Timer3; MainC.Boot <- App; App.MCPS_DATA -> MAC; App.Frame -> MAC; App.Packet -> MAC; App.DataTimer -> Timer1; App.Led1Timer -> Timer2; App.Led0Timer -> Timer3; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.MLME_START -> MAC; } TestIndirectDataCoordC.nc000066400000000000000000000130241207233610700347140ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestIndirectData/coordinator/* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-06-10 09:23:45 $ * @author: Jasper Buesch * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestIndirectDataCoordC { uses { interface Boot; interface MLME_RESET; interface MLME_START; interface MLME_SET; interface MLME_GET; interface MCPS_DATA; interface IEEE154Frame as Frame; interface Leds; interface Packet; interface Timer as DataTimer; interface Timer as Led1Timer; interface Timer as Led0Timer; } } implementation { message_t frame; uint8_t *payloadRegion; uint8_t m_payloadLen; char payload[] = "TestIndirect, Coordinator talking now!"; void sendIndirectData(); event void Boot.booted() { m_payloadLen = strlen(payload); payloadRegion = call Packet.getPayload(&frame, m_payloadLen); if (m_payloadLen <= call Packet.maxPayloadLength()){ memcpy(payloadRegion, payload, m_payloadLen); call MLME_RESET.request(TRUE); } } event void MLME_RESET.confirm(ieee154_status_t status) { if (status != IEEE154_SUCCESS) return; call MLME_SET.macShortAddress(COORDINATOR_ADDRESS); call MLME_SET.macAssociationPermit(FALSE); call MLME_SET.macRxOnWhenIdle(TRUE); call MLME_START.request( PAN_ID, // PANId RADIO_CHANNEL, // LogicalChannel 0, // ChannelPage, 0, // StartTime, 15, // BeaconOrder 15, // SuperframeOrder TRUE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment NULL, // no realignment security NULL // no beacon security ); } void sendIndirectData(){ ieee154_address_t deviceAddress; deviceAddress.shortAddress = DEVICE_ADDRESS; call Frame.setAddressingFields( &frame, ADDR_MODE_SHORT_ADDRESS, // SrcAddrMode, ADDR_MODE_SHORT_ADDRESS, // DstAddrMode, PAN_ID, // DstPANId, &deviceAddress, // DstAddr, NULL // security ); call MCPS_DATA.request( &frame, // frame, strlen(payload), // payloadLength, 0, // msduHandle, TX_OPTIONS_INDIRECT | TX_OPTIONS_ACK // TxOptions, ); call Leds.led1On(); call Led1Timer.startOneShot(12500U); } event void MLME_START.confirm(ieee154_status_t status) { sendIndirectData(); } event void DataTimer.fired(){ sendIndirectData(); } event void Led1Timer.fired(){ call Leds.led1Off(); } event void MCPS_DATA.confirm( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t Timestamp ) { if(status == IEEE154_TRANSACTION_EXPIRED){ call Leds.led0On(); call Led0Timer.startOneShot(125000U); sendIndirectData(); }else if (status == IEEE154_SUCCESS){ call DataTimer.startOneShot(125000U); } } event void Led0Timer.fired(){ call Leds.led0Off(); } event message_t* MCPS_DATA.indication ( message_t* frame__ ){ return frame__; } } tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestIndirectData/device/000077500000000000000000000000001207233610700271005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestIndirectData/device/Makefile000066400000000000000000000006321207233610700305410ustar00rootroot00000000000000COMPONENT=TestIndirectDataDeviceAppC CFLAGS += -I$(shell pwd)/.. # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include TestIndirectDataDeviceAppC.nc000066400000000000000000000044551207233610700344320ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestIndirectData/device/* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-06-10 09:23:45 $ * @author: Jasper Buesch * ======================================================================== */ configuration TestIndirectDataDeviceAppC { } implementation { components MainC, LedsC, Ieee802154NonBeaconEnabledC as MAC, new Timer62500C() as Timer1, new Timer62500C() as Timer2; components TestIndirectDataDeviceC as App; MainC.Boot <- App; App.MCPS_DATA -> MAC; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.PollTimer -> Timer1; App.Led2Timer -> Timer2; App.MLME_POLL -> MAC; } TestIndirectDataDeviceC.nc000066400000000000000000000072131207233610700337640ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestIndirectData/device/* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-09-10 12:00:50 $ * @author: Jasper Buesch * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module TestIndirectDataDeviceC { uses { interface Boot; interface MCPS_DATA; interface MLME_RESET; interface MLME_SET; interface MLME_GET; interface MLME_POLL; interface Leds; interface Timer as PollTimer; interface Timer as Led2Timer; } } implementation { void startApp(); event void Boot.booted() { call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status == IEEE154_SUCCESS) startApp(); } void startApp() { call MLME_SET.phyCurrentChannel(RADIO_CHANNEL); call MLME_SET.macAutoRequest(FALSE); call MLME_SET.macPANId(PAN_ID); call MLME_SET.macCoordShortAddress(COORDINATOR_ADDRESS); call MLME_SET.macShortAddress(DEVICE_ADDRESS); call PollTimer.startPeriodic(62500U); } event void PollTimer.fired(){ // check the coordinator for outstanding transmissions ieee154_address_t coordAdr; coordAdr.shortAddress = COORDINATOR_ADDRESS; call MLME_POLL.request ( ADDR_MODE_SHORT_ADDRESS, PAN_ID, coordAdr, NULL ); } event void MLME_POLL.confirm ( ieee154_status_t status ){} event void MCPS_DATA.confirm( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t Timestamp ){} event message_t* MCPS_DATA.indication ( message_t* frame__ ){ call Leds.led2On(); call Led2Timer.startOneShot(12500U); return frame__; } event void Led2Timer.fired(){ call Leds.led2Off(); } } tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestPromiscuous/000077500000000000000000000000001207233610700256365ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestPromiscuous/Makefile000066400000000000000000000012661207233610700273030ustar00rootroot00000000000000COMPONENT=TestPromiscuousAppC CFLAGS += -I$(TOSDIR)/lib/printf -DPRINTF_BUFFER_SIZE=1000 CFLAGS += -DIEEE154_SCAN_DISABLED -DIEEE154_BEACON_SYNC_DISABLED -DIEEE154_BEACON_TX_DISABLED -DIEEE154_RXENABLE_DISABLED -DIEEE154_ASSOCIATION_DISABLED -DIEEE154_DISASSOCIATION_DISABLED -DIEEE154_COORD_REALIGNMENT_DISABLED -DIEEE154_COORD_BROADCAST_DISABLED # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestPromiscuous/README.txt000066400000000000000000000026111207233610700273340ustar00rootroot00000000000000README for TestPromiscuous Author/Contact: Jan Hauer Description: In this application the node enables promiscuous mode, i.e. its radio is switched to receive mode and all incoming frames that pass the CRC check are signalled to the upper layer. The application uses the TinyOS printf library (tos/lib/printf) to output information on the MAC header fields and payload for every received frame over the serial port. The second (TelosB: green) LED is toggled whenever a frame is received. Criteria for a successful test: A successful test means that for every received frame LED1 is toggled and the java application outputs some text. To see this effect you need a second node sending a packet, for example, use the ../../beacon-enabled/TestStartSync/coordinator application to send periodic beacon packets. In this case LED1 should toggle every half second and printf java client should output some text on the frame content. Tools: The printf java client in $TOSDIR/../apps/tests/TestPrintf Usage: Install the application on a node $ make install Start the printf client, e.g. $ java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSBXXX: (http://docs.tinyos.net/ has a section on how to use the TinyOS printf library) Known bugs/limitations: - The timestamps for ACKs are incorrect $Id: README.txt,v 1.2 2010-01-05 17:12:56 janhauer Exp $ tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestPromiscuous/TestPromiscuousAppC.nc000066400000000000000000000044301207233610700321150ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-10-29 17:42:56 $ * @author: Jan Hauer * ======================================================================== */ #define NEW_PRINTF_SEMANTICS #include "printf.h" configuration TestPromiscuousAppC { } implementation { components MainC, TestPromiscuousC as App, LedsC, Ieee802154NonBeaconEnabledC as MAC; components PrintfC; components SerialStartC; MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.MCPS_DATA -> MAC; App.Frame -> MAC; App.BeaconFrame -> MAC; App.PromiscuousMode -> MAC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/nonbeacon-enabled/TestPromiscuous/TestPromiscuousC.nc000066400000000000000000000137741207233610700314670ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-10-29 17:42:56 $ * @author: Jan Hauer * ======================================================================== */ #include "printf.h" #include "TKN154.h" module TestPromiscuousC { uses { interface Boot; interface MLME_RESET; interface MLME_SET; interface MLME_GET; interface MCPS_DATA; interface Leds; interface IEEE154Frame as Frame; interface IEEE154BeaconFrame as BeaconFrame; interface SplitControl as PromiscuousMode; } } implementation { const char *m_frametype[] = {"Beacon", "Data","Acknowledgement","MAC command", "Unknown"}; const char *m_cmdframetype[] = {"unknown command", "Association request","Association response", "Disassociation notification","Data request","PAN ID conflict notification", "Orphan notification", "Beacon request", "Coordinator realignment", "GTS request"}; enum { RADIO_CHANNEL = 26, }; event void Boot.booted() { call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { call MLME_SET.phyCurrentChannel(RADIO_CHANNEL); call PromiscuousMode.start(); } event message_t* MCPS_DATA.indication (message_t* frame) { uint8_t i; uint8_t *payload = call Frame.getPayload(frame); uint8_t payloadLen = call Frame.getPayloadLength(frame); uint8_t *header = call Frame.getHeader(frame); uint8_t headerLen = call Frame.getHeaderLength(frame); uint8_t SrcAddrMode, DstAddrMode; uint8_t frameType, cmdFrameType; ieee154_address_t SrcAddress, DstAddress; uint16_t SrcPANId=0, DstPANId=0; if (call Frame.hasStandardCompliantHeader(frame)){ frameType = call Frame.getFrameType(frame); if (frameType > FRAMETYPE_CMD) frameType = 4; call Frame.getSrcPANId(frame, &SrcPANId); call Frame.getDstPANId(frame, &DstPANId); call Frame.getSrcAddr(frame, &SrcAddress); call Frame.getDstAddr(frame, &DstAddress); SrcAddrMode = call Frame.getSrcAddrMode(frame); DstAddrMode = call Frame.getDstAddrMode(frame); printf("\n"); printf("Frametype: %s", m_frametype[frameType]); if (frameType == FRAMETYPE_CMD){ cmdFrameType = payload[0]; if (cmdFrameType > 9) cmdFrameType = 0; printf(" (%s)", m_cmdframetype[cmdFrameType]); } printf("\n"); printf("SrcAddrMode: %d\n", SrcAddrMode); printf("SrcAddr: "); if (SrcAddrMode == ADDR_MODE_SHORT_ADDRESS){ printf("0x%02X\n", SrcAddress.shortAddress); printf("SrcPANId: 0x%02X\n", SrcPANId); } else if (SrcAddrMode == ADDR_MODE_EXTENDED_ADDRESS){ for (i=0; i<8; i++) printf("0x%02X ", ((uint8_t*) &(SrcAddress.extendedAddress))[i]); printf("\n"); printf("SrcPANId: 0x%02X\n", SrcPANId); } else printf("\n"); printf("DstAddrMode: %d\n", DstAddrMode); printf("DstAddr: "); if ( DstAddrMode == ADDR_MODE_SHORT_ADDRESS){ printf("0x%02X\n", DstAddress.shortAddress); printf("DestPANId: 0x%02X\n", DstPANId); } else if ( DstAddrMode == ADDR_MODE_EXTENDED_ADDRESS) { for (i=0; i<8; i++) printf("0x%02X ", ((uint8_t*) &(DstAddress.extendedAddress))[i]); printf("\n"); printf("DestPANId: 0x%02X\n", DstPANId); } else printf("\n"); printf("DSN: %d\n", call Frame.getDSN(frame)); printf("MHRLen: %d\n", headerLen); printf("MHR: "); for (i=0; i verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/apps/tests/tkn154/packetsniffer/README.txt000066400000000000000000000050751207233610700234450ustar00rootroot00000000000000README for Sniffer Author/Contact: tinyos-help@millennium.berkeley.edu Description: This application uses a single node to passively monitor all traffic on a given wireless channel and forward the content of any received IEEE 802.15.4 frame over the serial line. The information that is forwarded per received frame is the following: 1. the length of the MAC header + MAC payload portion 2. the entire MAC header 3. the entire MAC payload 4. some frame-specific metadata (RSSI, LQI, timestamp, etc.) On the PC-side (a) with a few changes "$TOSROOT/apps/BaseStation15.4/seriallisten15-4.c" can be adapted to display textual information on the frame content (if this is sufficient for you, also take a look at ../nonbeacon-enabled/TestPromiscuous app); (b) there exists a tool that visualizes the frame fields in a JAVA GUI, it's available here: http://www.z-monitor.org (c) another option might be to update wireshark to display frames received by this application (but I have not started to look into this). The exact format of the data exchanged over the serial line is best explained on an example: assuming a MAC DATA frame of MPDU size 15 byte (= PHY length field) with a 9 byte MAC header (including destination PAN, destination address and source address) and a 4 byte MAC payload the data sent by the mote to the PC over serial would be as follows: 0x02 0x0d 0x41 0x88 0x44 0x22 0x00 0xff 0xff 0x01 0x00 0x3f 0x06 0x01 0x45 0x6a 0xee 0x01 0x09 0x1a 0x56 0x20 0xcc 0x00 The first byte is always "0x02". This is a dispatch ID which tells that the serial packet is not an active message (AM), but an 802.15.4 frame. In particular, this means that a SerialForwarder will not accept the packet (because it would expect a "0x00" there, see Serial.h). The next byte ("0x0d" = 13) is the size of the MAC header + payload portion. Note that the MAC footer (CRC) is *not* taken into consideration, i.e. the second byte is identical to the PHY length field minus 2. What follows is the MAC header ("0x41 0x88 0x44 0x22 0x00 0xff 0xff 0x01 0x00") and MAC payload ("0x3f 0x06 0x01 0x45"). The remaining 9 byte are the matadata contained in the nx_struct "sniffer_metadata" defined in the "./app_profile.h" file. Note that, like the 802.15.4 formatting convention, the metadata is little-endian encoded. Criteria for a successful test: LED2 should always be on; LED1 should toggle every time a packet is received (and forwarded over serial line); LED0 denotes an error and should never be on. Known bugs/limitations: - The timestamps for ACKs are incorrect $Id: README.txt,v 1.1 2009/10/29 17:42:56 janhauer Exp $ tinyos-2.1.2+dfsg/apps/tests/tkn154/packetsniffer/SerialPacketInfo802_15_4P.nc000066400000000000000000000041461207233610700265540ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009/10/29 17:42:56 $ * @author: Jan Hauer * ======================================================================== */ /** * This component is shadowing tos/lib/serial/SerialPacketInfo802_15_4P * to forward the SerialPacketInfo interface to our sniffer */ configuration SerialPacketInfo802_15_4P { provides interface SerialPacketInfo as Info; } implementation { components SnifferC; Info = SnifferC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/packetsniffer/SnifferAppC.nc000066400000000000000000000047461207233610700244350ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009/10/29 17:42:56 $ * @author: Jan Hauer * ======================================================================== */ #include "app_profile.h" #include "platform_message.h" #include "message.h" configuration SnifferAppC { } implementation { components MainC, SnifferC as App, LedsC, Ieee802154NonBeaconEnabledC as MAC, Serial802_15_4C as Serial, new QueueC(message_t*, RX_QUEUE_SIZE), new PoolC(message_t, RX_QUEUE_SIZE); MainC.Boot <- App; App.Leds -> LedsC; App.MLME_RESET -> MAC; App.MLME_SET -> MAC; App.MLME_GET -> MAC; App.MCPS_DATA -> MAC; App.Frame -> MAC; App.BeaconFrame -> MAC; App.PromiscuousMode -> MAC; App.SerialControl -> Serial; App.SerialSend -> Serial; App.Pool -> PoolC; App.Queue -> QueueC; } tinyos-2.1.2+dfsg/apps/tests/tkn154/packetsniffer/SnifferC.nc000066400000000000000000000163451207233610700237720ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009/10/29 17:42:56 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154.h" #include "app_profile.h" module SnifferC { provides interface SerialPacketInfo; uses { interface Boot; interface MLME_RESET; interface MLME_SET; interface MLME_GET; interface MCPS_DATA; interface Leds; interface Queue as Queue; interface Pool as Pool; interface IEEE154Frame as Frame; interface IEEE154BeaconFrame as BeaconFrame; interface SplitControl as PromiscuousMode; interface SplitControl as SerialControl; interface Send as SerialSend; } } implementation { bool m_serialSendBusy; task void serialSendTask(); event void Boot.booted() { m_serialSendBusy = FALSE; if (call Pool.maxSize() != call Queue.maxSize() || call SerialControl.start() != SUCCESS) call Leds.led0On(); // error } event void SerialControl.startDone(error_t error) { if (error != SUCCESS) call Leds.led0On(); // error else call MLME_RESET.request(TRUE); } event void MLME_RESET.confirm(ieee154_status_t status) { if (status != IEEE154_SUCCESS) call Leds.led0On(); // error else { call MLME_SET.phyCurrentChannel(INITAL_RADIO_CHANNEL); if (call PromiscuousMode.start() != SUCCESS) call Leds.led0On(); // error } } event void PromiscuousMode.startDone(error_t error) { // ready - we're now in "sniffing mode" ... call Leds.led2On(); } event message_t* MCPS_DATA.indication (message_t* frame) { // -> received a frame: queue it and post a task to // forward it over serial call Leds.led1Toggle(); if (call Queue.enqueue(frame) != SUCCESS) { call Leds.led0On(); // overflow return frame; } else { post serialSendTask(); return call Pool.get(); } } task void serialSendTask() { message_t* frame; sniffer_metadata_t *snifferMetadata; uint8_t headerLen; uint8_t payloadLen; uint8_t serialLen; ieee154_metadata_t *radioMetadata; uint8_t rssi, lqi; uint8_t *header; uint32_t timestamp; uint8_t *phyLenField; if (call Queue.empty() || m_serialSendBusy) return; frame = call Queue.head(); radioMetadata = (ieee154_metadata_t*) &frame->metadata; rssi = radioMetadata->rssi; lqi = radioMetadata->linkQuality; timestamp = radioMetadata->timestamp; headerLen = call Frame.getHeaderLength(frame); payloadLen = call Frame.getPayloadLength(frame); header = call Frame.getHeader(frame); // update PHY length field: set it to the length of // MHR + payload (ignoring CRC footer) phyLenField = (uint8_t*) frame + call SerialPacketInfo.offset(); *phyLenField = headerLen + payloadLen; // need to move the payload to the front, because there can be a // gap between the end of the header and the start of the payload // section (-> do not touch the frame via Frame interface afterwards) memmove(header + headerLen, call Frame.getPayload(frame), payloadLen); snifferMetadata = (sniffer_metadata_t *) (header + headerLen + payloadLen); if ((uint8_t*) snifferMetadata + sizeof(sniffer_metadata_t) > (uint8_t*) frame + sizeof(message_t)) { // message_t is too small to hold frame content + sniffer_metadata_t // (this cannot happen, unless someone messes with the header files) call Leds.led0On(); return; } snifferMetadata->lqi = lqi; snifferMetadata->rssi = rssi - 45; // substract offset (see CC2420 datasheet) // IEEE 802.15.4 Std: incoming packets with incorrect CRC // are discarded even in promiscuous mode (so all frames // we get here must have passed the CRC check already) snifferMetadata->crc = 1; snifferMetadata->mhrLen = headerLen; snifferMetadata->channel = call MLME_GET.phyCurrentChannel(); snifferMetadata->timestamp = timestamp; serialLen = 1 + // for the PHY length field headerLen + payloadLen + sizeof(sniffer_metadata_t); m_serialSendBusy = TRUE; if (call SerialSend.send(frame, serialLen) != SUCCESS) call Leds.led0On(); } event void SerialSend.sendDone(message_t* frame, error_t error) { if (error != SUCCESS) call Leds.led0On(); else { call Pool.put(call Queue.dequeue()); m_serialSendBusy = FALSE; if (!call Queue.empty()) post serialSendTask(); } } async command uint8_t SerialPacketInfo.offset() { return offsetof(message_t, header) + offsetof(message_header_t, ieee154) + offsetof(ieee154_header_t, length); } async command uint8_t SerialPacketInfo.dataLinkLength(message_t* frame, uint8_t upperLen) { // returns size of the serial PDU uint8_t length = *((uint8_t*) frame + call SerialPacketInfo.offset()); return 1 + length + sizeof(sniffer_metadata_t); // 1 for the length-field itself } async command uint8_t SerialPacketInfo.upperLength(message_t* msg, uint8_t dataLinkLen) { // returns size of the serial PDU minus the MAC header length uint8_t *phyLenField = (uint8_t*) msg + call SerialPacketInfo.offset(); sniffer_metadata_t *snifferMetadata = (sniffer_metadata_t *) (phyLenField + *phyLenField); return *phyLenField + sizeof(sniffer_metadata_t) - snifferMetadata->mhrLen; } event void MCPS_DATA.confirm( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t Timestamp){} event void PromiscuousMode.stopDone(error_t error) {} event void SerialControl.stopDone(error_t error) {} } tinyos-2.1.2+dfsg/apps/tests/tkn154/packetsniffer/app_profile.h000066400000000000000000000050441207233610700244140ustar00rootroot00000000000000/* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009/06/10 09:23:45 $ * @author: Jasper Buesch * ======================================================================== */ #ifndef __APP_PROFILE_H #define __APP_PROFILE_H enum { INITAL_RADIO_CHANNEL = 26, // may be changed later via command over serial line RX_QUEUE_SIZE = 10, // max. packets queued after received over radio }; typedef nx_struct sniffer_metadata { nxle_uint8_t lqi; // LQI (see CC2420 datasheet for definition) nxle_int8_t rssi; // RSSI in dBm nxle_uint8_t crc; // 0: CRC check failed, 1: CRC check passed nxle_uint8_t mhrLen; // length of the MAC header (for convenience) nxle_uint8_t channel; // 802.15.4 channel on which the frame was received (11..26) nxle_uint32_t timestamp; // elapsed time since booting in symbols (1 tick = 16 us) } sniffer_metadata_t; #endif tinyos-2.1.2+dfsg/apps/tests/ucmini/000077500000000000000000000000001207233610700173525ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/ucmini/SensorTest/000077500000000000000000000000001207233610700214635ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/ucmini/SensorTest/Makefile000066400000000000000000000010061207233610700231200ustar00rootroot00000000000000COMPONENT=UcminiSensorC BUILD_EXTRA_DEPS += UcminiSensor.class CLEAN_EXTRA = *.class UcminiSensorMeas.java UcminiSensorCalib.java UcminiSensor.class: UcminiSensor.java UcminiSensorCalib.java UcminiSensorMeas.java javac UcminiSensor.java UcminiSensorMeas.java: mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=UcminiSensorMeas UcminiSensor.h measurement -o $@ UcminiSensorCalib.java: mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=UcminiSensorCalib UcminiSensor.h calib -o $@ include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/ucmini/SensorTest/TODO000066400000000000000000000000241207233610700221470ustar00rootroot00000000000000Voltage meter BMA180tinyos-2.1.2+dfsg/apps/tests/ucmini/SensorTest/UcminiSensor.h000066400000000000000000000036241207233610700242570ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #ifndef UCMINISENSOR_H #define UCMINISENSOR_H typedef nx_struct measurement { nx_uint32_t press; nx_int16_t temp2; nx_uint16_t temp; nx_uint16_t humi; nx_uint16_t light; nx_uint16_t temp3; nx_uint16_t voltage; } measurement_t; typedef nx_struct calib { nx_uint16_t coefficient[6]; } calib_t; enum{ AM_MEASUREMENT = 10, AM_CALIB = 11, }; #endif tinyos-2.1.2+dfsg/apps/tests/ucmini/SensorTest/UcminiSensor.java000066400000000000000000000111361207233610700247460ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ import java.io.IOException; import net.tinyos.message.*; import net.tinyos.packet.*; import net.tinyos.util.*; public class UcminiSensor implements MessageListener { private MoteIF moteIF; private long calibration[]=new long[6]; public UcminiSensor(MoteIF moteIF) { this.moteIF = moteIF; this.moteIF.registerListener(new UcminiSensorCalib(), this); this.moteIF.registerListener(new UcminiSensorMeas(), this); UcminiSensorCalib payload=new UcminiSensorCalib(); try{ this.moteIF.send(0xffff, payload); } catch (IOException exception) { System.err.println("Exception thrown when sending packets. Exiting."); System.err.println(exception); System.exit(1); } } public void messageReceived(int to, Message message) { if(message instanceof UcminiSensorCalib){ UcminiSensorCalib msg = (UcminiSensorCalib)message; calibration[0]=msg.getElement_coefficient(0); calibration[1]=msg.getElement_coefficient(1); calibration[2]=msg.getElement_coefficient(2); calibration[3]=msg.getElement_coefficient(3); calibration[4]=msg.getElement_coefficient(4); calibration[5]=msg.getElement_coefficient(5); System.out.println("Ms5607 calibration:"); System.out.println("c1="+calibration[0]+"; c2="+calibration[1]+"; c3="+calibration[2]+"; c4="+calibration[3]+ "; c5="+calibration[4]+"; c6="+calibration[5]); } else if(message instanceof UcminiSensorMeas){ UcminiSensorMeas msg = (UcminiSensorMeas)message; double rh=-6+125*((double)msg.get_humi()/65536); System.out.format("Humidity (sht21):\t\t%8.3f %% \t(%d)\n",rh, msg.get_humi()); double temp=-46.85+175.72*((double)msg.get_temp()/65536); System.out.format("Temperature (sht21):\t\t%8.3f \u00B0C \t(%d)\n",temp,msg.get_temp()); double temp3=1.13*msg.get_temp3()-272.8; System.out.format("Temperature (atmega128rfa1):\t%8.3f \u00B0C \t(%d)\n", temp3, msg.get_temp3()); System.out.format("Temperature (ms5607):\t\t%8.3f \u00B0C \t(%d)\n",(double)msg.get_temp2()/100,msg.get_temp2()); System.out.format("Pressure (ms5607):\t\t%8.3f mbar \t(%d)\n",(double)msg.get_press()/100,msg.get_press()); System.out.format("Light (bh1750fvi):\t\t%8d lx\n",msg.get_light()); // System.out.println("Voltage (atmega128rfa1):\t"+msg.get_voltage()); System.out.println(); } } private static void usage() { System.err.println("usage: UcminiSensor [-comm ]. Default source: serial@/dev/ttyUSB0:ucmini"); } public static void main(String[] args) throws Exception { String source = null; if (args.length == 2) { if (!args[0].equals("-comm")) { usage(); System.exit(1); } source = args[1]; } else if (args.length != 0) { usage(); System.exit(1); } PhoenixSource phoenix; if (source == null) { source = "serial@/dev/ttyUSB0:ucmini"; } phoenix = BuildSource.makePhoenix(source, PrintStreamMessenger.err); MoteIF mif = new MoteIF(phoenix); UcminiSensor serial = new UcminiSensor(mif); } } tinyos-2.1.2+dfsg/apps/tests/ucmini/SensorTest/UcminiSensorC.nc000066400000000000000000000052121207233610700245260ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "UcminiSensor.h" configuration UcminiSensorC { } implementation { components UcminiSensorP, MainC, LedsC, new TimerMilliC(); components new AtmegaTemperatureC(), new AtmegaVoltageC(), new LightC(), new PressureC(), new Ms5607TemperatureC() as Temperature1C, new Ms5607CalibrationC(), new TemperatureC(), new HumidityC(); components SerialStartC, new SerialAMSenderC(AM_MEASUREMENT) as MeasSend, new SerialAMSenderC(AM_CALIB) as CalibSend, new SerialAMReceiverC(AM_CALIB); UcminiSensorP.Boot -> MainC; UcminiSensorP.TempRead -> TemperatureC; UcminiSensorP.HumiRead -> HumidityC; UcminiSensorP.LightRead -> LightC; UcminiSensorP.PressRead -> PressureC; UcminiSensorP.Temp2Read -> Temperature1C; UcminiSensorP.ReadRef -> Ms5607CalibrationC; UcminiSensorP.Temp3Read -> AtmegaTemperatureC; UcminiSensorP.VoltageRead -> AtmegaVoltageC; UcminiSensorP.Timer->TimerMilliC; UcminiSensorP.MeasSend->MeasSend; UcminiSensorP.CalibSend->CalibSend; UcminiSensorP.Receive->SerialAMReceiverC; UcminiSensorP.Packet->MeasSend; UcminiSensorP.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tests/ucmini/SensorTest/UcminiSensorP.nc000066400000000000000000000107471207233610700245540ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "Ms5607.h" module UcminiSensorP { uses { interface Boot; interface Read as TempRead; interface Read as HumiRead; interface Read as LightRead; interface Read as PressRead; interface Read as Temp2Read; interface Read as Temp3Read; interface Read as VoltageRead; interface ReadRef; interface DiagMsg; interface AMSend as CalibSend; interface AMSend as MeasSend; interface Receive; interface Packet; interface Timer; interface Leds; } } implementation { measurement_t *meas; message_t message, calibmessage; calibration_t *calib; bool starting=TRUE; event void Boot.booted() { calib = (calibration_t*)call Packet.getPayload(&calibmessage, sizeof(calibration_t)); meas = (measurement_t*)call Packet.getPayload(&message, sizeof(measurement_t)); call ReadRef.read(calib); } event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len){ if(!starting) call CalibSend.send(AM_BROADCAST_ADDR, &calibmessage, sizeof(calibration_t)); return msg; } event void ReadRef.readDone(error_t error, calibration_t *data){ call CalibSend.send(AM_BROADCAST_ADDR, &calibmessage, sizeof(calibration_t)); } event void CalibSend.sendDone(message_t* msg, error_t error){ if(starting) call Timer.startPeriodic(512); } event void Timer.fired(){ if(!starting) call MeasSend.send(AM_BROADCAST_ADDR, &message, sizeof(measurement_t)); else starting=FALSE; call TempRead.read(); call HumiRead.read(); call LightRead.read(); call PressRead.read(); call Temp2Read.read(); call Temp3Read.read(); call VoltageRead.read(); } event void TempRead.readDone(error_t error, uint16_t data){ if(error==SUCCESS){ meas->temp=data; } else call Leds.led3Toggle(); } event void HumiRead.readDone(error_t error, uint16_t data) { if(error==SUCCESS){ meas->humi=data; } else call Leds.led3Toggle(); } event void LightRead.readDone(error_t error, uint16_t data) { if(error==SUCCESS){ meas->light=data; } else call Leds.led3Toggle(); } event void PressRead.readDone(error_t error, uint32_t data) { if(error==SUCCESS){ meas->press=data; } else call Leds.led3Toggle(); } event void Temp2Read.readDone(error_t error, int16_t data) { if(error==SUCCESS){ meas->temp2=data; } else call Leds.led3Toggle(); } event void VoltageRead.readDone(error_t error, uint16_t data) { if(error==SUCCESS){ meas->voltage=data; } else call Leds.led3Toggle(); } event void Temp3Read.readDone(error_t error, uint16_t data) { if(error==SUCCESS){ meas->temp3=data; } else call Leds.led3Toggle(); } event void MeasSend.sendDone(message_t* msg, error_t error){} } tinyos-2.1.2+dfsg/apps/tests/z1/000077500000000000000000000000001207233610700164205ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/000077500000000000000000000000001207233610700211725ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestADXL345-XYZ/000077500000000000000000000000001207233610700235065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestADXL345-XYZ/Makefile000066400000000000000000000001521207233610700251440ustar00rootroot00000000000000COMPONENT=TestADXL345AppC CFLAGS += -DPRINTFUART_ENABLED CFLAGS += -DMSP430XSPEED8 include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestADXL345-XYZ/README000066400000000000000000000010751207233610700243710ustar00rootroot00000000000000README for ADXL35 sensor test app Author/Contact: Antonio Linan Description: This application simple polls periodically the ADXL345 sensor for data and toggles the red led when all axis are read The data is printed over the serial port, using a client like putty or picocom you can see the readings of the sensor adjusting the serial port to this configuration: bauds: 115200 bits: 8 parity: none The ADXL345 sensor is a temperature sensor and its already integrated as part of the Zolertia Z1 mote. Tools: None Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestADXL345-XYZ/TestADXL345AppC.nc000066400000000000000000000041211207233610700264160ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to read at the same time all axis of the * ADXL345 sssAccelerometer built-in Zolertia Z1 motes * * @author: Antonio Linan */ #include "PrintfUART.h" configuration TestADXL345AppC {} implementation { components MainC, TestADXL345C as App, LedsC; App.Leds -> LedsC; App.Boot -> MainC.Boot; components new TimerMilliC() as TestTimer; App.TestTimer -> TestTimer; components new ADXL345C(); App.axis -> ADXL345C.XYZ; App.AccelControl -> ADXL345C.SplitControl; } tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestADXL345-XYZ/TestADXL345C.nc000066400000000000000000000060221207233610700257570ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to read at the same time all axis of the * ADXL345 Accelerometer built-in Zolertia Z1 motes * * @author: Antonio Linan */ #include "PrintfUART.h" #include "ADXL345.h" module TestADXL345C { uses { interface Leds; interface Boot; interface Timer as TestTimer; interface Read as axis; interface HplMsp430GeneralIO as PinTest1; interface HplMsp430GeneralIO as PinTest2; interface SplitControl as AccelControl; } } implementation { void printTitles(){ printfUART("\n\n"); printfUART(" ###############################\n"); printfUART(" # Z1 ADXL345 Test #\n"); printfUART(" ###############################\n"); printfUART("\n"); } event void Boot.booted() { uint8_t state = 0; printfUART_init(); printTitles(); call TestTimer.startPeriodic(1024); } event void TestTimer.fired(){ call AccelControl.start(); } event void AccelControl.startDone(error_t err) { if (err == SUCCESS){ call axis.read(); } else { printfUART("Bad start\n"); } } event void AccelControl.stopDone(error_t err) {} event void axis.readDone(error_t result, adxl345_readxyt_t data){ if (result == SUCCESS){ call Leds.led0Toggle(); printfUART("X [%d] Y [%d] Z [%d]\n", data.x_axis, data.y_axis, data.z_axis); } else { printfUART("Error reading axis\n"); } } } tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestADXL345/000077500000000000000000000000001207233610700230165ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestADXL345/Makefile000066400000000000000000000001521207233610700244540ustar00rootroot00000000000000COMPONENT=TestADXL345AppC CFLAGS += -DPRINTFUART_ENABLED CFLAGS += -DMSP430XSPEED8 include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestADXL345/README000066400000000000000000000011761207233610700237030ustar00rootroot00000000000000README for ADXL35 sensor test app Author/Contact: Antonio Linan Description: This application simple polls periodically the ADXL345 sensor for data and toggles a led when a specific axis is read: * X axis: red led. * Y axis: green led. * Z axis: blue led. The data is printed over the serial port, using a client like putty or picocom you can see the readings of the sensor adjusting the serial port to this configuration: bauds: 115200 bits: 8 parity: none The ADXL345 sensor is a temperature sensor and its already integrated as part of the Zolertia Z1 mote. Tools: None Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestADXL345/TestADXL345AppC.nc000066400000000000000000000041771207233610700257410ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to read individually the axis of the ADLX345 * Accelerometer built-in Zolertia Z1 motes * * @author: Antonio Linan */ #include "PrintfUART.h" configuration TestADXL345AppC {} implementation { components MainC, TestADXL345C as App, LedsC; App.Leds -> LedsC; App.Boot -> MainC.Boot; components new TimerMilliC() as TestTimer; App.TestTimer -> TestTimer; components new ADXL345C(); App.Xaxis -> ADXL345C.X; App.Yaxis -> ADXL345C.Y; App.Zaxis -> ADXL345C.Z; App.AccelControl -> ADXL345C.SplitControl; } tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestADXL345/TestADXL345C.nc000066400000000000000000000066051207233610700252760ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to read individually the axis of the ADLX345 * Accelerometer built-in Zolertia Z1 motes * * @author: Antonio Linan */ #include "PrintfUART.h" module TestADXL345C { uses { interface Leds; interface Boot; interface Timer as TestTimer; interface Read as Xaxis; interface Read as Yaxis; interface Read as Zaxis; interface SplitControl as AccelControl; } } implementation { void printTitles(){ printfUART("\n\n"); printfUART(" ###############################\n"); printfUART(" # Z1 ADXL345 Test #\n"); printfUART(" ###############################\n"); printfUART("\n"); } event void Boot.booted() { uint8_t state = 0; printfUART_init(); printTitles(); call TestTimer.startPeriodic(1024); } event void TestTimer.fired(){ call AccelControl.start(); } event void AccelControl.startDone(error_t err) { if (err == SUCCESS){ call Xaxis.read(); } else { printfUART("Bad Start\n"); } } event void AccelControl.stopDone(error_t err) {} event void Xaxis.readDone(error_t result, uint16_t data){ if (result == SUCCESS){ call Leds.led0Toggle(); printfUART("Xaxis: %d\n", data); call Yaxis.read(); } else { printfUART("Bad X\n"); } } event void Yaxis.readDone(error_t result, uint16_t data){ if (result == SUCCESS){ call Leds.led1Toggle(); printfUART("Yaxis: %d\n", data); call Zaxis.read(); } else { printfUART("Bad Y\n"); } } event void Zaxis.readDone(error_t result, uint16_t data){ if (result == SUCCESS){ call Leds.led2Toggle(); printfUART("Zaxis: %d\n", data); } else { printfUART("Bad Z\n"); } } } tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestIntADXL345/000077500000000000000000000000001207233610700234715ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestIntADXL345/Makefile000066400000000000000000000000571207233610700251330ustar00rootroot00000000000000COMPONENT=TestIntADXLAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestIntADXL345/README000066400000000000000000000006561207233610700243600ustar00rootroot00000000000000README for ADXL35 interruptions test app Author/Contact: Antonio Linan Description: This application test the Accelerometer interruptions in the following manner: * Single tap: toggle led red * Double tap: toggle green led * Free fall: toggle blue led The ADXL345 sensor is a temperature sensor and its already integrated as part of the Zolertia Z1 mote. Tools: None Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestIntADXL345/TestIntADXLAppC.nc000066400000000000000000000042201207233610700266200ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to test the interruptions (single and * double tap, free fall) of the ADLX345 Accelerometer built-in * Zolertia Z1 motes * * @author: Antonio Linan */ configuration TestIntADXLAppC { } implementation{ components MainC, TestIntADXLC as App; App -> MainC.Boot; components LedsC; App.Leds -> LedsC; components new ADXL345C(); App.IntSource -> ADXL345C.IntSource; App.AccelControl -> ADXL345C.SplitControl; App.IntAccel1 -> ADXL345C.Int1; App.IntAccel2 -> ADXL345C.Int2; App.ADXLControl -> ADXL345C.ADXL345Control; } tinyos-2.1.2+dfsg/apps/tests/z1/Accelerometer/TestIntADXL345/TestIntADXLC.nc000066400000000000000000000072171207233610700261700ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to test the interruptions (single and * double tap, free fall) of the ADLX345 Accelerometer built-in * Zolertia Z1 motes * * @author: Antonio Linan */ #include "ADXL345.h" module TestIntADXLC{ uses interface Boot; uses interface Leds; uses interface Read as IntSource; uses interface SplitControl as AccelControl; uses interface Notify as IntAccel1; uses interface Notify as IntAccel2; uses interface ADXL345Control as ADXLControl; } implementation{ bool source_int2=FALSE; event void Boot.booted(){ call AccelControl.start(); } event void IntAccel1.notify(adxlint_state_t val) { source_int2=FALSE; call Leds.led0Toggle(); call IntSource.read(); //this will clear the interruption } event void IntAccel2.notify(adxlint_state_t val) { source_int2=TRUE; call IntSource.read(); //this will clear the interruption; } event void AccelControl.startDone(error_t err) { call ADXLControl.setInterrups( ADXLINT_DOUBLE_TAP | ADXLINT_SINGLE_TAP | ADXLINT_FREE_FALL ); } event void AccelControl.stopDone(error_t err) { } event void IntSource.readDone(error_t result, uint8_t data){ if(source_int2) { if(data & ADXLINT_FREE_FALL) call Leds.led2Toggle(); else call Leds.led1Toggle(); } } event void ADXLControl.setInterruptsDone(error_t error){ call ADXLControl.setIntMap(ADXLINT_DOUBLE_TAP | ADXLINT_FREE_FALL); } event void ADXLControl.setIntMapDone(error_t error){ call IntAccel1.enable(); call IntAccel2.enable(); call IntSource.read(); //this will clear the interruption } event void ADXLControl.setDurationDone(error_t error) { } //not used event void ADXLControl.setWindowDone(error_t error) { } //not used event void ADXLControl.setLatentDone(error_t error) { } //not used event void ADXLControl.setRegisterDone(error_t error) { } //not used event void ADXLControl.setRangeDone(error_t error) { } //not used event void ADXLControl.setReadAddressDone(error_t error) { } //not used } tinyos-2.1.2+dfsg/apps/tests/z1/FastADC/000077500000000000000000000000001207233610700176255ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/FastADC/FastADCAppC.nc000066400000000000000000000045501207233610700221240ustar00rootroot00000000000000/* * Copyright (c) 2010-2011 DEXMA SENSORS SL * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to test ADC + DMA bundle * * @author: Xavier Orduna * @author: Antonio Linan */ #include "StorageVolumes.h" configuration FastADCAppC { } implementation { components MainC, FastADCC as App; App -> MainC.Boot; components LedsC; App.Leds -> LedsC; components new TimerMilliC() as TimerBlink; App.TimerBlink -> TimerBlink; components new TimerMilliC() as TimerSample; App.TimerSample -> TimerSample; components new Msp430Adc12ClientAutoDMAC() as Fadc; App.overflow -> Fadc; App.adc -> Fadc; App.Resource -> Fadc; components new BlockStorageC(VOLUME_BLOCKTEST); App.BlockWrite -> BlockStorageC.BlockWrite; App.BlockRead -> BlockStorageC.BlockRead; } tinyos-2.1.2+dfsg/apps/tests/z1/FastADC/FastADCC.nc000066400000000000000000000117521207233610700214650ustar00rootroot00000000000000/* * Copyright (c) 2010-2011 DEXMA SENSORS SL * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to test ADC + DMA bundle * * @author: Xavier Orduna * @author: Antonio Linan */ #include "Timer.h" #include "printfZ1.h" #define FADSAMPLES 2000 #define PRINTBUF 20 module FastADCC{ uses interface Boot; uses interface Leds; uses interface Timer as TimerBlink; uses interface Timer as TimerSample; uses interface Msp430Adc12Overflow as overflow; uses interface Msp430Adc12SingleChannel as adc; uses interface Resource; uses interface BlockWrite; uses interface BlockRead; } implementation{ uint16_t adb[FADSAMPLES]; uint16_t pb[PRINTBUF]; uint16_t pos; msp430adc12_channel_config_t adcconfig = { // inch: INPUT_CHANNEL_A7, inch: TEMPERATURE_DIODE_CHANNEL, sref: REFERENCE_AVcc_AVss, /* For battery readings */ // inch: SUPPLY_VOLTAGE_HALF_CHANNEL, // sref: REFERENCE_VREFplus_AVss, ref2_5v: REFVOLT_LEVEL_1_5, adc12ssel: SHT_SOURCE_ACLK, adc12div: SHT_CLOCK_DIV_1, sht: SAMPLE_HOLD_4_CYCLES, sampcon_ssel: SAMPCON_SOURCE_SMCLK, sampcon_id: SAMPCON_CLOCK_DIV_1 }; void showerror(){ call Leds.led0On(); } void configureSingle(){ error_t e; printfz1("configuring single\n"); e = call adc.configureSingle(&adcconfig); if(e != SUCCESS) showerror(); printfz1("error %d\n", e); } void configureMultiple(){ error_t e; printfz1("configuring multiple\n"); e = call adc.configureMultiple(&adcconfig, adb, FADSAMPLES, 0); if(e != SUCCESS) showerror(); printfz1("error %d\n", e); } void printadb(){ uint16_t i; printfz1("printing buffer\n"); for(i = 0; i < FADSAMPLES; i++){ printfz1("adb[%d] = %d\n", i, adb[i]); } } void writeadb(){ printfz1("writing adb\n"); call BlockWrite.write(0, adb, FADSAMPLES); } void readadb(){ } event void Boot.booted(){ printfz1_init(); printfz1("Booting\n"); call Resource.request(); } event void TimerBlink.fired(){ call Leds.led0Toggle(); call Leds.led1Toggle(); call Leds.led2Toggle(); } event void TimerSample.fired(){ error_t e; printfz1("starting conversion\n"); e = call adc.getData(); printfz1("error %d\n", e); } async event void overflow.conversionTimeOverflow(){ } async event void overflow.memOverflow(){ } async event uint16_t *adc.multipleDataReady(uint16_t *buffer, uint16_t numSamples){ printfz1("samples ready\n"); writeadb(); printadb(); return buffer; } async event error_t adc.singleDataReady(uint16_t data){ // printfz1("sample: %d\n", data); return SUCCESS; } event void Resource.granted(){ printfz1("Resource granted\n"); configureMultiple(); call TimerSample.startOneShot(1000); } event void BlockRead.readDone(storage_addr_t x, void* buf, storage_len_t y, error_t result) { } event void BlockWrite.eraseDone(error_t result) { } event void BlockWrite.writeDone(storage_addr_t x, void* buf, storage_len_t y, error_t result) { printfz1("write done -> %d\n", result); if (result == SUCCESS){ printfz1("syncing\n"); call BlockWrite.sync(); } } event void BlockWrite.syncDone(error_t result) { printfz1("sync done -> %d\n", result); } event void BlockRead.computeCrcDone(storage_addr_t x, storage_len_t y, uint16_t z, error_t result) { } } tinyos-2.1.2+dfsg/apps/tests/z1/FastADC/Makefile000066400000000000000000000002751207233610700212710ustar00rootroot00000000000000COMPONENT=FastADCAppC CFLAGS += -DPRINTFUART_ENABLED CFLAGS += -DADC12_ONLY_WITH_DMA # already defined in msp430/adc12/Msp430Adc12.h #CFLAGS += -DADC12_TIMERA_ENABLED include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/z1/FastADC/README000066400000000000000000000011601207233610700205030ustar00rootroot00000000000000README for FastADC test application Author/Contact: Antonio Linan Description: Thanks to the DMA implemented in the msp430, it is possible to use in conjunction with TimerA to perform High Speed sampling. Data is read and stored in flash. When using DMA and TimerA for ADC sampling be sure to include in makefile: CFLAGS += -DADC12_ONLY_WITH_DMA The data is printed over the serial port, using a client like putty or picocom you can see the readings of the sensor adjusting the serial port to this configuration: bauds: 115200 bits: 8 parity: none Tools: None Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/z1/FastADC/volumes-stm25p.xml000066400000000000000000000001111207233610700231620ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tests/z1/Print/000077500000000000000000000000001207233610700175145ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/Print/Makefile000066400000000000000000000001071207233610700211520ustar00rootroot00000000000000COMPONENT=PrintAppC CFLAGS += -DPRINTFUART_ENABLED include $(MAKERULES)tinyos-2.1.2+dfsg/apps/tests/z1/Print/PrintAppC.nc000066400000000000000000000037721207233610700217070ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * Copyright (c) 2011 Eric B. Decker * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to test printf adaptation made for Zolertia * Z1 motes * * @author: Antonio Linan * @author Eric B. Decker */ configuration PrintAppC { } implementation{ components MainC, PrintC as App; App -> MainC.Boot; components LedsC; App.Leds -> LedsC; components new TimerMilliC() as TimerPrint; App.TimerPrint -> TimerPrint; } tinyos-2.1.2+dfsg/apps/tests/z1/Print/PrintC.nc000066400000000000000000000077141207233610700212460ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * Copyright (c) 2011 Eric B. Decker * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to test printf adaptation made for Zolertia * Z1 motes * * @author: Antonio Linan * @author Eric B. Decker *//* * Copyright (c) 20011 ZOLERTIA LABS * Copyright (c) 2011 Eric B. Decker * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to test printf adaptation made for Zolertia * Z1 motes * * @author: Antonio Linan * @author Eric B. Decker */ #include "printfZ1.h" module PrintC{ uses interface Boot; uses interface Leds; uses interface Timer as TimerPrint; } implementation{ uint8_t counter; event void Boot.booted(){ printfz1_init(); counter = 0; call TimerPrint.startPeriodic( 1024 ); } event void TimerPrint.fired(){ call Leds.led0Toggle(); printfz1("Print num: %d\n", counter); counter++; } } tinyos-2.1.2+dfsg/apps/tests/z1/Print/README000066400000000000000000000007321207233610700203760ustar00rootroot00000000000000README for Printf Z1 app Author/Contact: Antonio Linan Description: This application simple increments a timer and prints its value over the serial port using a printf implementation for the Z1 mote. The data is printed over the serial port, using a client like putty or picocom you can see the readings of the sensor adjusting the serial port to this configuration: bauds: 115200 bits: 8 parity: none Tools: None Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/z1/Temperature/000077500000000000000000000000001207233610700207155ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/Temperature/Makefile000066400000000000000000000001511207233610700223520ustar00rootroot00000000000000COMPONENT=TestTmp102AppC CFLAGS += -DPRINTFUART_ENABLED CFLAGS += -DMSP430XSPEED8 include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/z1/Temperature/README000066400000000000000000000010141207233610700215710ustar00rootroot00000000000000README for Tmp102 sensor test app Author/Contact: Antonio Linan Description: This application simple polls periodically the Tmp102 sensor for data. The Tmp102 sensor is a temperature sensor and its already integrated as part of the Zolertia Z1 mote. The data is printed over the serial port, using a client like putty or picocom you can see the readings of the sensor adjusting the serial port to this configuration: bauds: 115200 bits: 8 parity: none Tools: None Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/z1/Temperature/TestTmp102AppC.nc000066400000000000000000000040411207233610700236250ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to test the TMP102 temperature sensor * built-in Zolertia Z1 motes * * @author: Antonio Linan */ #include "PrintfUART.h" configuration TestTmp102AppC {} implementation { components MainC, TestTmp102C as App, LedsC; App.Leds -> LedsC; App.Boot -> MainC.Boot; components new TimerMilliC() as TestTimer; App.TestTimer -> TestTimer; components new SimpleTMP102C() as Temperature; App.TempSensor -> Temperature; } tinyos-2.1.2+dfsg/apps/tests/z1/Temperature/TestTmp102C.nc000066400000000000000000000053251207233610700231720ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to test the TMP102 temperature sensor * built-in Zolertia Z1 motes * * @author: Antonio Linan */ #include "Timer.h" #include "PrintfUART.h" module TestTmp102C { uses { interface Leds; interface Boot; interface Timer as TestTimer; interface Read as TempSensor; } } implementation { void printTitles(){ printfUART("\n\n"); printfUART(" ###############################\n"); printfUART(" # #\n"); printfUART(" # TMP102 TEST #\n"); printfUART(" # #\n"); printfUART(" ###############################\n"); printfUART("\n"); } event void Boot.booted() { printfUART_init(); printTitles(); call TestTimer.startPeriodic(1024); } event void TestTimer.fired(){ call TempSensor.read(); } event void TempSensor.readDone(error_t error, uint16_t data){ if (error == SUCCESS){ call Leds.led2Toggle(); if (data > 2047) data -= (1<<12); data *=0.625; printfUART("Temp: %2d.%1.2d\n", data/10, data>>2); } } } tinyos-2.1.2+dfsg/apps/tests/z1/TestBatt/000077500000000000000000000000001207233610700201525ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/TestBatt/Makefile000066400000000000000000000001511207233610700216070ustar00rootroot00000000000000COMPONENT=TestBattAppC CFLAGS += -DPRINTFUART_ENABLED CFLAGS += -DMSP430XSPEED8 include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/z1/TestBatt/README000066400000000000000000000006261207233610700210360ustar00rootroot00000000000000README for Z1 Battery test Author/Contact: Antonio Linan Description: This application simple read the battery level of the Z1 mote The data is printed over the serial port, using a client like putty or picocom you can see the readings of the sensor adjusting the serial port to this configuration: bauds: 115200 bits: 8 parity: none Tools: None Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/z1/TestBatt/TestBattAppC.nc000066400000000000000000000037321207233610700227770ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * App to read the Battery level of Zolertia Z1 motes * * @author: Antonio Linan */ #include "PrintfUART.h" configuration TestBattAppC {} implementation { components MainC, TestBattC as App, LedsC; App.Leds -> LedsC; App.Boot -> MainC.Boot; components new TimerMilliC() as TestTimer; App.TestTimer -> TestTimer; components new BatteryC(); App.Battery -> BatteryC.Read; } tinyos-2.1.2+dfsg/apps/tests/z1/TestBatt/TestBattC.nc000066400000000000000000000050731207233610700223360ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * App to read the Battery level of Zolertia Z1 motes * * @author: Antonio Linan */ #include "Timer.h" #include "PrintfUART.h" module TestBattC { uses { interface Leds; interface Boot; interface Timer as TestTimer; interface Read as Battery; } } implementation { uint32_t aux = 0; uint16_t battery = 0; void printTitles(){ printfUART("\n\n"); printfUART(" ###############################\n"); printfUART(" # Test Battery #\n"); printfUART(" ###############################\n"); printfUART("\n"); } event void Boot.booted() { printfUART_init(); printTitles(); call TestTimer.startPeriodic(512); } event void TestTimer.fired(){ call Battery.read(); } event void Battery.readDone(error_t error, uint16_t batt){ if(error==SUCCESS) { aux = batt; aux *= 300; aux /= 4096; battery = aux; printfUART("Battery [%d]\n", battery); } } } tinyos-2.1.2+dfsg/apps/tests/z1/TestEui/000077500000000000000000000000001207233610700200025ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/TestEui/Makefile000066400000000000000000000001131207233610700214350ustar00rootroot00000000000000COMPONENT=TestEuiAppC CFLAGS += -DPRINTFUART_ENABLED include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/z1/TestEui/README.txt000066400000000000000000000006111207233610700214760ustar00rootroot00000000000000$Id: README.txt,v 1.1 2008-10-31 17:01:31 sallai Exp $ README for TestEui Author/Contact: tinyos-help@millennium.berkeley.edu Description: The TestEui application prints out the IEEE EUI64 of the device periodically using printfUART, ported to Zolertia Z1 mote. Tools: Any serial reader, like putty or picocom Usage: bauds: 115200 bits: 8 parity: none Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/z1/TestEui/TestEuiAppC.nc000066400000000000000000000040371207233610700224560ustar00rootroot00000000000000// $Id: TestEuiAppC.nc,v 1.2 2010-06-29 22:07:22 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ /** * This application reads the 64-bit EUI of the device at initialization time * and then periodically prints it out using printf. * */ configuration TestEuiAppC{} implementation { components MainC, TestEuiC, LedsC, LocalIeeeEui64C, new TimerMilliC(); MainC.Boot <- TestEuiC; TestEuiC.Timer -> TimerMilliC; TestEuiC -> LedsC.Leds; TestEuiC.LocalIeeeEui64 -> LocalIeeeEui64C; } tinyos-2.1.2+dfsg/apps/tests/z1/TestEui/TestEuiC.nc000066400000000000000000000044641207233610700220210ustar00rootroot00000000000000// $Id: TestEuiC.nc,v 1.2 2010-06-29 22:07:23 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ /** * This application reads the 64-bit EUI of the device at initialization time * and then periodically, and prints it out using printf. * */ #include "PrintfUART.h" module TestEuiC{ uses interface Boot; uses interface Timer; uses interface Leds; uses interface LocalIeeeEui64; } implementation{ event void Boot.booted() { printfUART_init(); call Timer.startPeriodic(1000); } event void Timer.fired() { int i; ieee_eui64_t id; call Leds.led0Toggle(); id = call LocalIeeeEui64.getId(); printfUART("IEEE 64-bit UID: "); for(i=0;i<8;i++) { printfUART("%d ", id.data[i]); } printfUART("\n"); } } tinyos-2.1.2+dfsg/apps/tests/z1/TestGPIO/000077500000000000000000000000001207233610700200165ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/TestGPIO/Makefile000066400000000000000000000001471207233610700214600ustar00rootroot00000000000000COMPONENT=TestGPIOAppC CFLAGS += -DPRINTFUART_ENABLED CFLAGS += -DMSP430XSPEED8 include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/z1/TestGPIO/README000066400000000000000000000007221207233610700206770ustar00rootroot00000000000000README for the GPIO pin test of Zolertia Z1 mote Author/Contact: Antonio Linan Description: This application test configuring the pull-up resistors and the GPIO pins by starting a PWM signal. The data is printed over the serial port, using a client like putty or picocom you can see the readings of the sensor adjusting the serial port to this configuration: bauds: 115200 bits: 8 parity: none Tools: None Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/z1/TestGPIO/TestGPIOAppC.nc000066400000000000000000000041771207233610700225130ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple application to test the GPIO pins of the Z1 mote, by configuring * the pull-up resistors and starting a PWM signal. * * @author: Antonio Linan */ #include "PrintfUART.h" configuration TestGPIOAppC {} implementation { components MainC, TestGPIOC as App, LedsC; App.Leds -> LedsC; App.Boot -> MainC.Boot; components new TimerMilliC() as TestTimer; App.TestTimer -> TestTimer; components new TimerMilliC() as OffTimer; App.OffTimer -> OffTimer; components HplMsp430GeneralIOC as PinMap; App.PinTest1 -> PinMap.Port52; } tinyos-2.1.2+dfsg/apps/tests/z1/TestGPIO/TestGPIOC.nc000066400000000000000000000067551207233610700220560ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple application to test the GPIO pins of the Z1 mote, by configuring * the pull-up resistors and starting a PWM signal. * * @author: Antonio Linan */ #include "Timer.h" #include "PrintfUART.h" module TestGPIOC { uses { interface Leds; interface Boot; interface Timer as TestTimer; interface Timer as OffTimer; interface HplMsp430GeneralIO as PinTest1; } } implementation { void printTitles(){ printfUART("\n\n"); printfUART(" ###############################\n"); printfUART(" # GPIO TEST #\n"); printfUART(" ###############################\n"); printfUART("\n"); } event void Boot.booted() { uint8_t state = 0xFF; printfUART_init(); printTitles(); /* Prints the available states of resistors */ printfUART("INVALID [%d] OFF [%d] PULLDOWN [%d] PULLUP [%d]\n\n", MSP430_PORT_RESISTOR_INVALID,MSP430_PORT_RESISTOR_OFF, MSP430_PORT_RESISTOR_PULLDOWN, MSP430_PORT_RESISTOR_PULLUP); /* Disable resistor */ call PinTest1.setResistor(MSP430_PORT_RESISTOR_OFF); state = call PinTest1.getResistor(); if (state == MSP430_PORT_RESISTOR_OFF){ printfUART("Resistor disabled -> %d\n", state); } else { printfUART("Failed -> %d\n", state); } /* Enable pullup resistor */ call PinTest1.setResistor(MSP430_PORT_RESISTOR_PULLUP); state = call PinTest1.getResistor(); if (state == MSP430_PORT_RESISTOR_PULLUP){ printfUART("Pullup resistor -> %d\n", state); } else { printfUART("Failed -> %d\n", state); } /* slow PWM */ call PinTest1.makeOutput(); call PinTest1.clr(); call TestTimer.startPeriodic(2048); } event void TestTimer.fired(){ call Leds.led2Toggle(); call PinTest1.set(); call OffTimer.startOneShot(1024); } event void OffTimer.fired(){ call PinTest1.clr(); } } tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/000077500000000000000000000000001207233610700200415ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/SimpleTSL2563/000077500000000000000000000000001207233610700221755ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/SimpleTSL2563/Makefile000066400000000000000000000001461207233610700236360ustar00rootroot00000000000000COMPONENT=TestTSLAppC CFLAGS += -DPRINTFUART_ENABLED CFLAGS += -DMSP430XSPEED8 include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/SimpleTSL2563/README000066400000000000000000000007511207233610700230600ustar00rootroot00000000000000README for the ZIG-LIGHT ziglet test application Author/Contact: Antonio Linan Description: This application test the light ziglet based in TAOS TSL-2563 light sensor, light readings are periodically taken at 1Hz. The data is printed over the serial port, using a client like putty or picocom you can see the readings of the sensor adjusting the serial port to this configuration: bauds: 115200 bits: 8 parity: none Tools: None Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/SimpleTSL2563/TSLC.nc000066400000000000000000000042701207233610700232670ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple driver for the ZIG-LIGHT Ziglet, based on the TAOS TSL2563 * digital light sensor, features only a read light command. * * @author: Antonio Linan */ #include "PrintfUART.h" configuration TSLC { provides { interface Read as Light; } } implementation { components TSLP; Light = TSLP; components new Msp430I2C1C() as I2C; TSLP.Resource -> I2C; TSLP.ResourceRequested -> I2C; TSLP.I2CBasicAddr -> I2C; components new TimerMilliC() as TimeoutTimer; TSLP.TimeoutTimer -> TimeoutTimer; components new TimerMilliC() as TimerUp; TSLP.TimerUp -> TimerUp; } tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/SimpleTSL2563/TSLP.nc000066400000000000000000000125151207233610700233050ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple driver for the ZIG-LIGHT Ziglet, based on the TAOS TSL2563 * digital light sensor, features only a read light command. * * @author: Antonio Linan */ #include "tsl2563.h" #include "PrintfUART.h" module TSLP { provides{ interface Read as Light; } uses { interface I2CPacket as I2CBasicAddr; interface Resource; interface ResourceRequested; interface Timer as TimerUp; interface Timer as TimeoutTimer; interface Leds; } } implementation { norace uint8_t state = TSLCMD_IDLE; norace uint8_t pointer; norace uint8_t setreg; norace uint8_t lightBuff[4]; norace uint16_t reading[2]; norace uint16_t lux; uint16_t calculatelux(){ uint32_t ch0, ch1 = 0; uint32_t aux = (1<<14); uint32_t ratio; uint32_t lratio; uint32_t tmp=0; ch0 = (reading[0]*aux) >> 10; ch1 = (reading[1]*aux) >> 10; ratio = (ch1 << 10)/ch0; lratio = (ratio+1) >> 1; if ((lratio >= 0) && (lratio <= K1T)) tmp = (ch0*B1T) - (ch1*M1T); else if (lratio <= K2T) tmp = (ch0*B2T) - (ch1*M2T); else if (lratio <= K3T) tmp = (ch0*B3T) - (ch1*M3T); else if (lratio <= K4T) tmp = (ch0*B4T) - (ch1*M4T); else if (lratio <= K5T) tmp = (ch0*B5T) - (ch1*M5T); else if (lratio <= K6T) tmp = (ch0*B6T) - (ch1*M6T); else if (lratio <= K7T) tmp = (ch0*B7T) - (ch1*M7T); else if (lratio > K8T) tmp = (ch0*B8T) - (ch1*M8T); if (tmp < 0) tmp = 0; tmp += (1<<13); return (tmp >> 14); } task void signalEvent(){ signal Light.readDone(SUCCESS, lux); } command error_t Light.read(){ state = TSLCMD_START; call TimeoutTimer.startOneShot(1024); call TimerUp.startOneShot(100); return SUCCESS; } event void TimerUp.fired(){ call Resource.request(); } event void Resource.granted(){ error_t error; setreg = TSL256X_CONTROL_POWER_ON; pointer = TSL256X_PTR_DATA0LOW | TSL256X_COMMAND_CMD | TSL256X_COMMAND_WORD; error = call I2CBasicAddr.write((I2C_START | I2C_STOP), TSL2563_ADDRESS, 1, &setreg); if (error){ call Resource.release(); signal Light.readDone(error, 0xFFFF); } } async event void I2CBasicAddr.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t *data){ error_t e = FAIL; if(call Resource.isOwner()){ if(state == TSLCMD_START){ state = TSLCMD_READ; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), TSL2563_ADDRESS, 1, &pointer); } else if (state == TSLCMD_READ){ e = call I2CBasicAddr.read((I2C_START | I2C_STOP), TSL2563_ADDRESS, 4, lightBuff); } if (e){ call Resource.release(); signal Light.readDone(error, 0xFFFF); } } } async event void I2CBasicAddr.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t *data){ if (call Resource.isOwner()){ uint16_t tmp; state = TSLCMD_IDLE; /* The new msp430-gcc 4.6.3 toolchain eliminates the delay, the intrinsic * __delay_cycles() function is an elegant solution to an ugly hack but * breaks the compatibility with 3.2.3 toolchain */ //__delay_cycles(8000); for(tmp=0;tmp<0xffee;tmp++) asm("nop"); //delay call Resource.release(); call TimeoutTimer.stop(); reading[0] = (data[1] << 8) + data[0]; reading[1] = (data[3] << 8) + data[2]; lux = calculatelux(); post signalEvent(); } } event void TimeoutTimer.fired(){ call Resource.release(); signal Light.readDone(FAIL, 0); } default event void Light.readDone(error_t error, uint16_t data){ return; } async event void ResourceRequested.requested(){} async event void ResourceRequested.immediateRequested(){} } tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/SimpleTSL2563/TestTSLAppC.nc000066400000000000000000000040141207233610700245640ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to poll data from the ZIG-LIGHT Ziglet, based * on the TAOS TSL2563 digital light sensor. * * @author: Antonio Linan */ #include "PrintfUART.h" configuration TestTSLAppC {} implementation { components MainC, TestTSLC as App, LedsC; App.Leds -> LedsC; App.Boot -> MainC.Boot; components new TimerMilliC() as TestTimer; App.TestTimer -> TestTimer; components TSLC; App.Light -> TSLC.Light; } tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/SimpleTSL2563/TestTSLC.nc000066400000000000000000000050251207233610700241260ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to poll data from the ZIG-LIGHT Ziglet, based * on the TAOS TSL2563 digital light sensor. * * @author: Antonio Linan */ #include "Timer.h" #include "PrintfUART.h" module TestTSLC { uses { interface Leds; interface Boot; interface Timer as TestTimer; interface Read as Light; } } implementation { void printTitles(){ printfUART("\n\n"); printfUART(" ###############################\n"); printfUART(" # Light TEST #\n"); printfUART(" ###############################\n"); printfUART("\n"); } event void Boot.booted() { printfUART_init(); printTitles(); call TestTimer.startPeriodic(1024); } event void TestTimer.fired(){ call Light.read(); } event void Light.readDone(error_t error, uint16_t data){ if (error == SUCCESS){ printfUART("Light: %d\n", data); call Leds.led2Toggle(); } } } tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/SimpleTSL2563/tsl2563.h000066400000000000000000000020621207233610700234700ustar00rootroot00000000000000 #ifndef TESTSENSOR_H #define TESTSENSOR_H #define TSL2563_ADDRESS 0x39 #define TSL256X_CONTROL_POWER_ON (0x3) #define TSL256X_CONTROL_POWER_OFF (0x0) #define TSL256X_PTR_CONTROL (0x0) #define TSL256X_COMMAND_CMD (1<<7) #define TSL256X_COMMAND_CLEAR (1<<6) #define TSL256X_COMMAND_WORD (1<<5) #define TSL256X_COMMAND_BLOCK (1<<4) #define TSL256X_COMMAND_ADDRESS(_x) ((_x) & 0xF) #define TSL256X_PTR_DATA0LOW (0xC) #define TSL256X_PTR_DATA0HIGH (0xD) #define TSL256X_PTR_DATA1LOW (0xE) #define TSL256X_PTR_DATA1HIGH (0xF) #define K1T 0X0040 #define B1T 0x01f2 #define M1T 0x01b2 #define K2T 0x0080 #define B2T 0x0214 #define M2T 0x02d1 #define K3T 0x00c0 #define B3T 0x023f #define M3T 0x037b #define K4T 0x0100 #define B4T 0x0270 #define M4T 0x03fe #define K5T 0x0138 #define B5T 0x016f #define M5T 0x01fc #define K6T 0x019a #define B6T 0x00d2 #define M6T 0x00fb #define K7T 0x029a #define B7T 0x0018 #define M7T 0x0012 #define K8T 0x029a #define B8T 0x0000 #define M8T 0x0000 enum { TSLCMD_IDLE = 0, TSLCMD_START, TSLCMD_READ, TSLCMD_STOP, } CMD; #endif tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/TestBMP085/000077500000000000000000000000001207233610700215545ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/TestBMP085/BMP085C.nc000066400000000000000000000045041207233610700230570ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple driver for the BMP085 sensor, only reads the calibration values and * returns the atmospheric pressure level * * @author: Antonio Linan */ configuration BMP085C { provides { interface Read as Pressure; interface SplitControl as BMPSwitch; } } implementation { components BMP085P; Pressure = BMP085P.Pressure; BMPSwitch = BMP085P.BMPSwitch; components new Msp430I2C1C() as I2C; BMP085P.Resource -> I2C; BMP085P.ResourceRequested -> I2C; BMP085P.I2CBasicAddr -> I2C; components HplMsp430GeneralIOC as GeneralIOC; components new Msp430GpioC() as XCLR; XCLR -> GeneralIOC.Port42; BMP085P.Reset -> XCLR; components new TimerMilliC() as TimeoutTimer; BMP085P.TimeoutTimer -> TimeoutTimer; } tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/TestBMP085/BMP085P.nc000066400000000000000000000215621207233610700230770ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple driver for the BMP085 sensor, only reads the calibration values and * returns the atmospheric pressure level * * @author: Antonio Linan */ #include "PrintfUART.h" #include "bmp085.h" module BMP085P{ provides{ interface Read as Pressure; interface SplitControl as BMPSwitch; } uses { interface Resource; interface ResourceRequested; interface I2CPacket as I2CBasicAddr; interface GeneralIO as Reset; interface Timer as TimeoutTimer; } } implementation{ enum { S_STARTED, S_STOPPED, S_IDLE, }; norace uint8_t state = S_IDLE; norace uint8_t bmp085cmd; norace uint8_t databuf[22]; norace error_t error_return= FAIL; norace int32_t b5 = 0; norace int16_t temp; norace int32_t press = 0; norace int16_t pressure = 0; norace bool readPres = FALSE; norace bool readAlt = FALSE; // Calibration registers int16_t ac1, ac2, ac3, b1, b2, mb, mc, md = 0; uint16_t ac4, ac5, ac6 = 0; task void stopTimeout(){ call TimeoutTimer.stop(); } task void signalEvent(){ if (error_return == SUCCESS){ if (call TimeoutTimer.isRunning()) call TimeoutTimer.stop(); } if (call Resource.isOwner()) call Resource.release(); switch(bmp085cmd){ case BMPCMD_READ_CALIB: if (error_return == SUCCESS) state = S_STARTED; signal BMPSwitch.startDone(error_return); break; case BMPCMD_READ_PRES: signal Pressure.readDone(error_return, pressure); break; } } void calcTemp(uint32_t tmp){ int32_t x1, x2 = 0; atomic{ x1 = (((int32_t)tmp - (int32_t)ac6) * (int32_t)ac5) >> 15; x2 = ((int32_t)mc << 11) / (x1 + md); b5 = x1 + x2; temp = (b5 + 8) >> 4; } #ifdef DEBUG_ZIGLET printfUART("[BMP085] Temp [%d.%d C]\n", temp/10, temp<<2); #endif } void calcPres(int32_t tmp){ uint32_t b4, b7 = 0; int32_t x1, x2, x3, b3, b6, p = 0; atomic{ b6 = b5 - 4000; x1 = (b2 * (b6 * b6 >> 12)) >> 11; x2 = ac2 * b6 >> 11; x3 = x1 + x2; b3 = ((((int32_t)ac1) * 4 + x3) + 2) >> 2; // printfUART("b6[%ld] x1[%ld] x2[%ld] x3[%ld] b3[%ld]\n", b6, x1, x2, x3, b3); x1 = (ac3 * b6) >> 13; x2 = (b1 * ((b6 * b6) >> 12)) >> 16; x3 = ((x1 + x2) + 2) >> 2; b4 = (ac4 * ((uint32_t)(x3 + 32768))) >> 15; b7 = ((uint32_t) tmp - b3) * 50000; // printfUART("b7[%lu] x1[%ld] x2[%ld] x3[%ld] b4[%lu]\n", b7, x1, x2, x3, b4); if (b7 < 0x80000000){ p = (b7 << 1) / b4; } else { p = (b7 / b4) << 1; } x1 = (p >> 8) * (p >> 8); x1 = (x1 * 3038) >> 16; x2 = (-7357 * p) >> 16; press = (p + ((x1 + x2 + 3791) >> 4)); press /= 10; pressure = press; } #ifdef DEBUG_ZIGLET printfUART("[BMP085] Pressure [%u mbar]\n", pressure); #endif readPres = FALSE; error_return = SUCCESS; post signalEvent(); } command error_t BMPSwitch.start(){ error_t e; uint8_t i; error_return = FAIL; atomic P5DIR |= 0x06; call TimeoutTimer.startOneShot(1024); if(state != S_STARTED){ bmp085cmd = BMPCMD_START; for (i=0;i<22;i++) databuf[i] = 0; e = call Resource.request(); if (e == SUCCESS) return SUCCESS; } return e; } command error_t BMPSwitch.stop(){ error_t e = FAIL; if(state != S_STARTED){ state = S_STOPPED; e = SUCCESS; } signal BMPSwitch.stopDone(e); return e; } command error_t Pressure.read(){ error_t e; error_return = FAIL; atomic P5DIR |= 0x06; call TimeoutTimer.startOneShot(1024); if (state == S_STARTED){ bmp085cmd = BMPCMD_READ_UT; readPres = TRUE; e = call Resource.request(); if (e == SUCCESS) return SUCCESS; } return e; } event void Resource.granted(){ error_t e; switch(bmp085cmd){ case BMPCMD_START: bmp085cmd = BMPCMD_READ_CALIB; databuf[0] = BMP085_AC1_MSB; // 0xAA e = call I2CBasicAddr.write((I2C_START | I2C_STOP), BMP085_ADDR, 1, databuf); #ifdef DEBUG_ZIGLET if(e != SUCCESS) printfUART("[BMP085] Error at start (%d)\n", e); #endif break; case BMPCMD_READ_UT: databuf[0] = BMP085_CTLREG; // 0xF4 databuf[1] = BMP085_UT_NOSRX; // 0x2E e = call I2CBasicAddr.write((I2C_START | I2C_STOP), BMP085_ADDR, 2, databuf); #ifdef DEBUG_ZIGLET if (e != SUCCESS) printfUART("[BMP085] Error at UT (%d)\n", e); #endif break; case BMPCMD_READ_UP: databuf[0] = BMP085_CTLREG; // 0xF4 databuf[1] = BMP085_UP_OSRS0; // 0x34 e = call I2CBasicAddr.write((I2C_START | I2C_STOP), BMP085_ADDR, 2, databuf); #ifdef DEBUG_ZIGLET if (e != SUCCESS) printfUART("[BMP085] Error at UP (%d)\n", e); #endif break; } } async event void I2CBasicAddr.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t *data){ error_t e; if(call Resource.isOwner()){ switch(bmp085cmd){ case BMPCMD_READ_UT: case BMPCMD_READ_UP: if (bmp085cmd == BMPCMD_READ_UT){ bmp085cmd = BMPCMD_READ_TEMP; } else { bmp085cmd = BMPCMD_READ_PRES; } databuf[0] = BMP085_DATA_MSB; // 0xF6 e = call I2CBasicAddr.write((I2C_START | I2C_STOP), BMP085_ADDR, 1, databuf); break; case BMPCMD_READ_CALIB: e = call I2CBasicAddr.read((I2C_START | I2C_STOP), BMP085_ADDR, 22, databuf); break; case BMPCMD_READ_TEMP: case BMPCMD_READ_PRES: e = call I2CBasicAddr.read((I2C_START | I2C_STOP), BMP085_ADDR, 2, databuf); break; } } } async event void I2CBasicAddr.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t *data){ int16_t utemp = 0; int32_t upres = 0; if (call Resource.isOwner()){ switch(bmp085cmd){ case BMPCMD_READ_CALIB: if (error == SUCCESS){ post stopTimeout(); atomic { ac1 = (data[0]<<8) + data[1]; ac2 = (data[2]<<8) + data[3]; ac3 = (data[4]<<8) + data[5]; ac4 = (data[6]<<8) + data[7]; ac5 = (data[8]<<8) + data[9]; ac6 = (data[10]<<8) + data[11]; b1 = (data[12]<<8) + data[13]; b2 = (data[14]<<8) + data[15]; mb = (data[16]<<8) + data[17]; mc = (data[18]<<8) + data[19]; md = (data[20]<<8) + data[21]; error_return = SUCCESS; } } post signalEvent(); break; case BMPCMD_READ_TEMP: utemp = (data[0]<<8) + data[1]; calcTemp(utemp); break; case BMPCMD_READ_PRES: upres = ((int32_t)data[0] << 8) + (int32_t)data[1]; calcPres(upres); break; } call Resource.release(); if (readPres){ bmp085cmd = BMPCMD_READ_UP; call Resource.request(); } } } event void TimeoutTimer.fired(){ post signalEvent(); } async event void ResourceRequested.requested(){} async event void ResourceRequested.immediateRequested(){} default event void Pressure.readDone(error_t error, uint16_t data){ return; } } tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/TestBMP085/Makefile000066400000000000000000000002021207233610700232060ustar00rootroot00000000000000COMPONENT=TestBMPAppC CFLAGS += -DPRINTFUART_ENABLED # CFLAGS += -DDEBUG_ZIGLET CFLAGS += -DUSCI_X2XXX_DELAY include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/TestBMP085/README000066400000000000000000000007721207233610700224420ustar00rootroot00000000000000README for BMP085 sensor test application Author/Contact: Antonio Linan Description: This application periodically polls the BMP085 sensor for data. To get more output from the sensor, uncomment the ZIGLET_DEBUG flag in Makefile The data is printed over the serial port, using a client like putty or picocom you can see the readings of the sensor adjusting the serial port to this configuration: bauds: 115200 bits: 8 parity: none Tools: None Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/TestBMP085/TestBMPAppC.nc000066400000000000000000000042201207233610700241160ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to read atmospheric pressure values from the ZIG-BAR * Ziglet, based on the BMP085 sensor. * * @author: Antonio Linan */ #include "PrintfUART.h" configuration TestBMPAppC {} implementation { components MainC, TestBMPC as App, LedsC; App.Leds -> LedsC; App.Boot -> MainC.Boot; components new TimerMilliC() as TestTimer; App.TestTimer -> TestTimer; components new TimerMilliC() as StartTimer; App.StartTimer -> StartTimer; components BMP085C; App.BMPSwitch -> BMP085C.BMPSwitch; App.Pressure -> BMP085C.Pressure; } tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/TestBMP085/TestBMPC.nc000066400000000000000000000056511207233610700234660ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to read atmospheric pressure values from the ZIG-BAR * Ziglet, based on the BMP085 sensor. * * @author: Antonio Linan */ #include "Timer.h" #include "PrintfUART.h" module TestBMPC { uses { interface Leds; interface Boot; interface SplitControl as BMPSwitch; interface Timer as TestTimer; interface Timer as StartTimer; interface Read as Pressure; } } implementation { void printTitles(){ printfUART("\n\n"); printfUART(" ###############################\n"); printfUART(" # BMP085 TEST #\n"); printfUART(" ###############################\n"); printfUART("\n"); } event void Boot.booted() { printfUART_init(); printTitles(); call StartTimer.startOneShot(1024); } event void StartTimer.fired(){ call BMPSwitch.start(); } event void BMPSwitch.startDone(error_t err){ if (err == SUCCESS){ call TestTimer.startPeriodic(1024); } } event void TestTimer.fired(){ call Pressure.read(); } event void BMPSwitch.stopDone(error_t err){ call StartTimer.startOneShot(1024); } event void Pressure.readDone(error_t error, uint16_t data){ if (error == SUCCESS){ int16_t buff = (int16_t) data; printfUART("Pressure: %d.%2d\n", buff/10, buff>>2); } } } tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/TestBMP085/bmp085.h000066400000000000000000000032251207233610700227420ustar00rootroot00000000000000#ifndef BMP085_H #define BMP085_H // Address, R/W, CTL #define BMP085_ADDR 0x77 #define BMP085_ADDR_READ 0xEF #define BMP085_ADDR_WRITE 0xEE #define BMP085_CTLREG 0xF4 // Read commands #define BMP085_UT_NOSRX 0x2E // 4.5ms #define BMP085_UP_OSRS0 0x34 // 4.5ms #define BMP085_UP_OSRS1 0x74 // 4.5ms #define BMP085_UP_OSRS2 0xB4 // 13.5ms #define BMP085_UP_OSRS3 0xF4 // 25.5ms // Data Registers (read from) #define BMP085_DATA_MSB 0xF6 #define BMP085_DATA_LSB 0xF7 #define BMP085_DATA_XLSB 0xF8 // EEPROM Calibration registers #define BMP085_AC1_MSB 0xAA #define BMP085_AC1_LSB 0xAB #define BMP085_AC2_MSB 0xAC #define BMP085_AC2_LSB 0xAD #define BMP085_AC3_MSB 0xAE #define BMP085_AC3_LSB 0xAF #define BMP085_AC4_MSB 0xB0 #define BMP085_AC4_LSB 0xB1 #define BMP085_AC5_MSB 0xB2 #define BMP085_AC5_LSB 0xB3 #define BMP085_AC6_MSB 0xB4 #define BMP085_AC6_LSB 0xB5 #define BMP085_B1_MSB 0xB6 #define BMP085_B1_LSB 0xB7 #define BMP085_B2_MSB 0xB8 #define BMP085_B2_LSB 0xB9 #define BMP085_MB_MSB 0xBA #define BMP085_MB_LSB 0xBB #define BMP085_MC_MSB 0xBC #define BMP085_MC_LSB 0xBD #define BMP085_MD_MSB 0xBE #define BMP085_MD_LSB 0xBF // Ultra low power mode // Oversampling = 0, internal samples = 1, conversion press = 4.5ms // Current = 3uA/sample, RMS noise = 0.06hPa // Reading // UP = pressure data (16 or 19 bits) // UT = Temp (16 bit) // EOC = end of conversion // XCLR = reset (1 pulso 1us) // Start -> Meas UT -> 4.5ms -> Read UT -> Meas UP -> 4.5ms -> Read UP enum { BMPCMD_IDLE = 0, BMPCMD_START, BMPCMD_READ_CALIB, BMPCMD_READ_UT, BMPCMD_READ_UP, BMPCMD_READ_TEMP, BMPCMD_READ_PRES, } BMP085_CMD; #endif tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/TestSht11/000077500000000000000000000000001207233610700216015ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/TestSht11/Makefile000066400000000000000000000001761207233610700232450ustar00rootroot00000000000000COMPONENT=TestSht11AppC CFLAGS += -DPRINTFUART_ENABLED CFLAGS += -DMSP430XSPEED8 CFLAGS += -DIS_ZIGLET include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/TestSht11/README000066400000000000000000000013001207233610700224530ustar00rootroot00000000000000README for SHT1X sensor test app Author/Contact: Antonio Linan Description: This application simple polls periodically the SHT1X sensor for data (temperature and humidity). The data is printed over the serial port, using a client like putty or picocom you can see the readings of the sensor adjusting the serial port to this configuration: bauds: 115200 bits: 8 parity: none The SHT1X sensor is a part of the ZIGTH11 board, which can be connected to a Ziglet port (an I2C digital port of the Z1 mote), or to regular GPIO port (depending on how you connect it), if using as a Ziglet make sure IS_ZIGLET is uncommented in Makefile. Tools: None Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/TestSht11/TestSht11AppC.nc000066400000000000000000000042311207233610700244270ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to read Temp & Humidity values from the ZIGTH11 * Ziglet, based on the SHT1X sensor. * * @author: Antonio Linan */ #include "PrintfUART.h" configuration TestSht11AppC {} implementation { components MainC, TestSht11C as App, LedsC; App.Leds -> LedsC; App.Boot -> MainC.Boot; components new TimerMilliC() as TestTimer; App.TestTimer -> TestTimer; components new SensirionSht11C() as Temperature; App.Temperature -> Temperature.Temperature; components new SensirionSht11C() as Humidity; App.Humidity -> Humidity.Humidity; } tinyos-2.1.2+dfsg/apps/tests/z1/Ziglets/TestSht11/TestSht11C.nc000066400000000000000000000057601207233610700237760ustar00rootroot00000000000000/* * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Simple test application to read Temp & Humidity values from the ZIGTH11 * Ziglet, based on the SHT1X sensor. * * @author: Antonio Linan */ #include "Timer.h" #include "PrintfUART.h" module TestSht11C { uses { interface Leds; interface Boot; interface Timer as TestTimer; interface Read as Temperature; interface Read as Humidity; } } implementation { uint8_t pass; void printTitles(){ printfUART("\n\n"); printfUART(" ###############################\n"); printfUART(" # TEST SHT1X #\n"); printfUART(" ###############################\n"); printfUART("\n"); } event void Boot.booted() { printfUART_init(); printTitles(); call TestTimer.startPeriodic(1024); } event void TestTimer.fired(){ pass++; if (pass % 2 == 0){ call Temperature.read(); } else { call Humidity.read(); } } event void Temperature.readDone(error_t error, uint16_t data){ uint16_t temp; if (error == SUCCESS){ call Leds.led2Toggle(); temp = (data/10) -400; printfUART("Temp: %d.%d\n", temp/10, temp>>2); } } event void Humidity.readDone(error_t error, uint16_t data){ uint16_t hum; if (error == SUCCESS){ hum = data*0.0367; hum -= 2.0468; if (hum>100) hum = 100; call Leds.led2Toggle(); printfUART("Hum: %d\n", hum); } } } tinyos-2.1.2+dfsg/apps/tosthreads/000077500000000000000000000000001207233610700171045ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/README000066400000000000000000000022321207233610700177630ustar00rootroot00000000000000Author: Kevin Klues The applications contained in this directory are both 'example' and 'test' applications for running TOSThreads based applications in TinyOS. All applications in the 'apps' directory can be compiled by running the command: make threads and all applications in the 'capps' directory can be compiled by running: make cthreads Some applications may be platform specific, but in general TOSThreads currently supports the following platforms: tmote, telosb, iris, mica2, and micaz To compile all applications under 'apps' for a given platform, simpley 'cd' into the 'apps' directory and run the 'make' command specified above. Similarly, 'cd' into the 'capps' directory and run the 'cthreads' version of the make command to compile all of those applications too. There are READMEs contained in each application subdirectory that explain how the application works, and hwo one can verify that it is operating correctly. I hope everyone finds these applications and their descriptions useful. And I hope everyone finds TOSThreads both intuitive and easy to use. Enjoy. ~Kevin Klues tinyos-2.1.2+dfsg/apps/tosthreads/apps/000077500000000000000000000000001207233610700200475ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/apps/BaseStation/000077500000000000000000000000001207233610700222635ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/apps/BaseStation/BaseSendReceiveP.nc000066400000000000000000000156121207233610700257210ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * BaseStation is a reimplementation of the standard BaseStation application using * the TOSThreads thread library. It transparently forwards any AM messages it * receives from its radio interface to its serial interface and vice versa. * *

    On the serial link, BaseStation sends and receives simple active * messages (not particular radio packets): on the radio link, it * sends radio active messages, whose format depends on the network * stack being used. BaseStation will copy its compiled-in group ID to * messages moving from the serial link to the radio, and will filter * out incoming radio messages that do not contain that group ID.

    * *

    BaseStation includes queues in both directions, with a guarantee * that once a message enters a queue, it will eventually leave on the * other interface. The queues allow the BaseStation to handle load * spikes.

    * *

    BaseStation acknowledges a message arriving over the serial link * only if that message was successfully enqueued for delivery to the * radio link.

    * *

    The LEDS are programmed to toggle as follows:

    *
      *
    • LED0: Message bridged from serial to radio
    • *
    • LED1: Message bridged from radio to serial
    • *
    • LED2: Dropped message due to queue overflow in either direction
    • *
    * * @author Kevin Klues * @author Chieh-Jan Mike Liang */ generic module BaseSendReceiveP() { uses { interface Boot; interface Thread as ReceiveThread; interface Thread as SnoopThread; interface Thread as SendThread; interface ConditionVariable; interface Mutex; interface Pool; interface Queue; interface Leds; interface BlockingReceive as BlockingReceiveAny; interface BlockingReceive as BlockingSnoopAny; interface BlockingAMSend as BlockingAMSend[uint8_t id]; interface Packet as ReceivePacket; interface Packet as SendPacket; interface AMPacket as ReceiveAMPacket; interface AMPacket as SendAMPacket; } } implementation { condvar_t c_queue, c_pool; mutex_t m_queue, m_pool; event void Boot.booted() { call ConditionVariable.init(&c_queue); call ConditionVariable.init(&c_pool); call Mutex.init(&m_queue); call Mutex.init(&m_pool); call ReceiveThread.start(NULL); call SnoopThread.start(NULL); call SendThread.start(NULL); } event void ReceiveThread.run(void* arg) { message_t* msg; call Mutex.lock(&m_pool); msg = call Pool.get(); call Mutex.unlock(&m_pool); for(;;) { if(call BlockingReceiveAny.receive(msg, 0) == SUCCESS) { call Leds.led0Toggle(); call Mutex.lock(&m_queue); call Queue.enqueue(msg); call Mutex.unlock(&m_queue); if( call Queue.size() == 1 ) { call ConditionVariable.signalAll(&c_queue); } call Mutex.lock(&m_pool); while( call Pool.empty() ) call ConditionVariable.wait(&c_pool, &m_pool); msg = call Pool.get(); call Mutex.unlock(&m_pool); } else call Leds.led2Toggle(); } } event void SnoopThread.run(void* arg) { message_t* msg; call Mutex.lock(&m_pool); msg = call Pool.get(); call Mutex.unlock(&m_pool); for(;;) { if(call BlockingSnoopAny.receive(msg, 0) == SUCCESS) { call Leds.led0Toggle(); call Mutex.lock(&m_queue); call Queue.enqueue(msg); call Mutex.unlock(&m_queue); if( call Queue.size() == 1 ) { call ConditionVariable.signalAll(&c_queue); } call Mutex.lock(&m_pool); while( call Pool.empty() ) call ConditionVariable.wait(&c_pool, &m_pool); msg = call Pool.get(); call Mutex.unlock(&m_pool); } else call Leds.led2Toggle(); } } event void SendThread.run(void* arg) { message_t* msg; am_id_t id; am_addr_t source; am_addr_t dest; uint8_t len; for(;;) { call Mutex.lock(&m_queue); while( call Queue.empty() ) call ConditionVariable.wait(&c_queue, &m_queue); msg = call Queue.dequeue(); call Mutex.unlock(&m_queue); id = call ReceiveAMPacket.type(msg); source = call ReceiveAMPacket.source(msg); dest = call ReceiveAMPacket.destination(msg); len = call ReceivePacket.payloadLength(msg); call SendPacket.clear(msg); call SendAMPacket.setSource(msg, source); call BlockingAMSend.send[id](dest, msg, len); call Leds.led1Toggle(); call Mutex.lock(&m_pool); call Pool.put(msg); call Mutex.unlock(&m_pool); if( call Pool.size() == 1 ) { call ConditionVariable.signalAll(&c_pool); } } } default command error_t BlockingSnoopAny.receive(message_t* m, uint32_t timeout) { return FAIL; } default command void* BlockingSnoopAny.getPayload(message_t* msg, uint8_t len) { return NULL; } default command error_t SnoopThread.start(void* arg) { return FAIL; } default command error_t SnoopThread.stop() { return FAIL; } default command error_t SnoopThread.pause() { return FAIL; } default command error_t SnoopThread.resume() { return FAIL; } default command error_t SnoopThread.sleep(uint32_t milli) { return FAIL; } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/BaseStation/BaseStationAppC.nc000066400000000000000000000147241207233610700255750ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * BaseStation is a reimplementation of the standard BaseStation application using * the TOSThreads thread library. It transparently forwards any AM messages it * receives from its radio interface to its serial interface and vice versa. * *

    On the serial link, BaseStation sends and receives simple active * messages (not particular radio packets): on the radio link, it * sends radio active messages, whose format depends on the network * stack being used. BaseStation will copy its compiled-in group ID to * messages moving from the serial link to the radio, and will filter * out incoming radio messages that do not contain that group ID.

    * *

    BaseStation includes queues in both directions, with a guarantee * that once a message enters a queue, it will eventually leave on the * other interface. The queues allow the BaseStation to handle load * spikes.

    * *

    BaseStation acknowledges a message arriving over the serial link * only if that message was successfully enqueued for delivery to the * radio link.

    * *

    The LEDS are programmed to toggle as follows:

    *
      *
    • LED0: Message bridged from serial to radio
    • *
    • LED1: Message bridged from radio to serial
    • *
    • LED2: Dropped message due to queue overflow in either direction
    • *
    * * @author Kevin Klues * @author Chieh-Jan Mike Liang */ #include "base_station.h" #include "stack.h" #include "message.h" configuration BaseStationAppC {} implementation { components MainC, BaseStationC, new BaseSendReceiveP() as RadioReceiveSerialSendP, new BaseSendReceiveP() as SerialReceiveRadioSendP, new ThreadC(BOOT_THREAD_STACK_SIZE) as BootThread, new ThreadC(RADIO_RECEIVE_THREAD_STACK_SIZE) as RadioReceiveThread, new ThreadC(RADIO_SNOOP_THREAD_STACK_SIZE) as RadioSnoopThread, new ThreadC(SERIAL_SEND_THREAD_STACK_SIZE) as SerialSendThread, new ThreadC(SERIAL_RECEIVE_THREAD_STACK_SIZE) as SerialReceiveThread, new ThreadC(RADIO_SEND_THREAD_STACK_SIZE) as RadioSendThread, new PoolC(message_t, BASE_STATION_MSG_QUEUE_SIZE) as RadioReceivePool, new QueueC(message_t*, BASE_STATION_MSG_QUEUE_SIZE) as RadioReceiveQueue, new PoolC(message_t, BASE_STATION_MSG_QUEUE_SIZE) as SerialReceivePool, new QueueC(message_t*, BASE_STATION_MSG_QUEUE_SIZE) as SerialReceiveQueue, ThreadSynchronizationC, LedsC; BaseStationC.Boot -> MainC; RadioReceiveSerialSendP.Boot -> BaseStationC; SerialReceiveRadioSendP.Boot -> BaseStationC; BaseStationC.BootThread -> BootThread; RadioReceiveSerialSendP.ReceiveThread -> RadioReceiveThread; RadioReceiveSerialSendP.SnoopThread -> RadioSnoopThread; RadioReceiveSerialSendP.SendThread -> SerialSendThread; SerialReceiveRadioSendP.ReceiveThread -> SerialReceiveThread; SerialReceiveRadioSendP.SendThread -> RadioSendThread; RadioReceiveSerialSendP.Pool -> RadioReceivePool; RadioReceiveSerialSendP.Queue -> RadioReceiveQueue; SerialReceiveRadioSendP.Pool -> SerialReceivePool; SerialReceiveRadioSendP.Queue -> SerialReceiveQueue; RadioReceiveSerialSendP.ConditionVariable -> ThreadSynchronizationC; RadioReceiveSerialSendP.Mutex -> ThreadSynchronizationC; RadioReceiveSerialSendP.Leds -> LedsC; SerialReceiveRadioSendP.ConditionVariable -> ThreadSynchronizationC; SerialReceiveRadioSendP.Mutex -> ThreadSynchronizationC; SerialReceiveRadioSendP.Leds -> LedsC; components BlockingActiveMessageC as BlockingRadioActiveMessageC, BlockingSerialActiveMessageC; BaseStationC.BlockingRadioAMControl -> BlockingRadioActiveMessageC; BaseStationC.BlockingSerialAMControl -> BlockingSerialActiveMessageC; RadioReceiveSerialSendP.ReceivePacket -> BlockingRadioActiveMessageC; RadioReceiveSerialSendP.SendPacket -> BlockingSerialActiveMessageC; RadioReceiveSerialSendP.ReceiveAMPacket -> BlockingRadioActiveMessageC; RadioReceiveSerialSendP.SendAMPacket -> BlockingSerialActiveMessageC; RadioReceiveSerialSendP.BlockingReceiveAny -> BlockingRadioActiveMessageC.BlockingReceiveAny; RadioReceiveSerialSendP.BlockingSnoopAny -> BlockingRadioActiveMessageC.BlockingSnoopAny; RadioReceiveSerialSendP.BlockingAMSend -> BlockingSerialActiveMessageC; SerialReceiveRadioSendP.ReceivePacket -> BlockingSerialActiveMessageC; SerialReceiveRadioSendP.SendPacket -> BlockingRadioActiveMessageC; SerialReceiveRadioSendP.ReceiveAMPacket -> BlockingSerialActiveMessageC; SerialReceiveRadioSendP.SendAMPacket -> BlockingRadioActiveMessageC; SerialReceiveRadioSendP.BlockingReceiveAny -> BlockingSerialActiveMessageC.BlockingReceiveAny; SerialReceiveRadioSendP.BlockingAMSend -> BlockingRadioActiveMessageC; } tinyos-2.1.2+dfsg/apps/tosthreads/apps/BaseStation/BaseStationC.nc000066400000000000000000000067001207233610700251270ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * BaseStation is a reimplementation of the standard BaseStation application using * the TOSThreads thread library. It transparently forwards any AM messages it * receives from its radio interface to its serial interface and vice versa. * *

    On the serial link, BaseStation sends and receives simple active * messages (not particular radio packets): on the radio link, it * sends radio active messages, whose format depends on the network * stack being used. BaseStation will copy its compiled-in group ID to * messages moving from the serial link to the radio, and will filter * out incoming radio messages that do not contain that group ID.

    * *

    BaseStation includes queues in both directions, with a guarantee * that once a message enters a queue, it will eventually leave on the * other interface. The queues allow the BaseStation to handle load * spikes.

    * *

    BaseStation acknowledges a message arriving over the serial link * only if that message was successfully enqueued for delivery to the * radio link.

    * *

    The LEDS are programmed to toggle as follows:

    *
      *
    • LED0: Message bridged from serial to radio
    • *
    • LED1: Message bridged from radio to serial
    • *
    • LED2: Dropped message due to queue overflow in either direction
    • *
    * * @author Kevin Klues */ module BaseStationC { provides { interface Boot as BaseStationBoot; } uses { interface Boot; interface Thread as BootThread; interface BlockingStdControl as BlockingRadioAMControl; interface BlockingStdControl as BlockingSerialAMControl; } } implementation { event void Boot.booted() { call BootThread.start(NULL); } event void BootThread.run(void* arg) { call BlockingRadioAMControl.start(); call BlockingSerialAMControl.start(); signal BaseStationBoot.booted(); } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/BaseStation/Makefile000066400000000000000000000002351207233610700237230ustar00rootroot00000000000000COMPONENT=BaseStationAppC CFLAGS+=-DCC2420_NO_ACKNOWLEDGEMENTS CFLAGS+=-DCC2420_NO_ADDRESS_RECOGNITION CFLAGS+=-DTOSH_DATA_LENGTH=115 include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/apps/BaseStation/README000066400000000000000000000047271207233610700231550ustar00rootroot00000000000000README for TOSThreads BaseStation Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: BaseStation is a reimplementation of the standard BaseStation application using the TOSThreads thread library. It transparently forwards any AM messages it receives from its radio interface to its serial interface and vice versa. Upon successful reception of a packet, LED0 is toggled, and upon successful forwarding, LED1 is toggled. If there are any errors, LED2 is toggled. To run this application install it on a mote via the command: make threads install.45 Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic Installing with NODE_ID 45 (i.e. AM_ADDRESS 45) is just to verify that the application forwards packets with an arbitrarily chosen id, which it should. To test the correct operation of this application, you need two motes: one with this BaseStation application installed on it, and one with an application that is sending messages installed, (let's use the RadioStress application from the current directory). On one mote install the Base station via the command above, and on the other install RadioStress via the command: make threads install.1 Don't forget the '.1' when you install, or RadioStress will be configured to receive rather than send messages. Messages are sent to AM_ADDRESS 0. A successful test will result in the RadioStress mote constantly flickering all of its leds very rapidly, and the BaseStation mote flickering its LED0 and LED1 leds rapidly. Additionally, messages should be forwarded over the serial interface as verified by running the following for the platform of interest: java net.tinyos.tools.Listen -comm serial@/dev/ttyUSBXXX: NOTE:: The baud rate 57600 must be used telos based motes, as its configuration has been changed to work with this baud rate when compiled for tosthreads. I.e. DO NOT just substitute 'telosb' or 'tmote' for above. Explicitly set it to 57600. Once this java application is running, you should see output of the sort constantly being streamed to your terminal: 00 00 00 00 01 00 00 14 00 00 00 00 01 00 00 16 00 00 00 00 01 00 00 15 00 00 00 00 01 00 00 14 00 00 00 00 01 00 00 16 00 00 00 00 01 00 00 15 00 00 00 00 01 00 00 14 00 00 00 00 01 00 00 16 00 00 00 00 01 00 00 15 00 00 00 00 01 00 00 14 Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/apps/BaseStation/base_station.h000066400000000000000000000035631207233610700251160ustar00rootroot00000000000000 /* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Header file for declaring constants and AM types for use by the * BaseStation application * * @author Kevin Klues */ #ifndef BASE_STATION_H #define BASE_STATION_H enum { BASE_STATION_MSG_QUEUE_SIZE = 3, }; enum { AM_SERIAL_BASE_MSG = 0, }; #endif //BASE_STATION_H tinyos-2.1.2+dfsg/apps/tosthreads/apps/BaseStation/stack.h000066400000000000000000000037501207233610700235460ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef BASE_STATION_APP_STACK_H #define BASE_STATION_APP_STACK_H enum { BOOT_THREAD_STACK_SIZE = 200, RADIO_RECEIVE_THREAD_STACK_SIZE = 200, RADIO_SNOOP_THREAD_STACK_SIZE = 200, SERIAL_SEND_THREAD_STACK_SIZE = 200, SERIAL_RECEIVE_THREAD_STACK_SIZE = 200, RADIO_SEND_THREAD_STACK_SIZE = 200, }; #endif //BASE_STATION_APP_STACK_H tinyos-2.1.2+dfsg/apps/tosthreads/apps/Blink/000077500000000000000000000000001207233610700211065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/apps/Blink/BlinkAppC.nc000066400000000000000000000044731207233610700232430ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Blink is a simple application used to test the basic functionality of * TOSThreads. * * Upon a successful burn, you should see LED0 flashing with a period of every * 200ms, and LED1 and LED2 flashing in unison with a period of 1000ms. * * @author Kevin Klues (klueska@cs.stanford.edu) */ configuration BlinkAppC { } implementation { components MainC, BlinkC, LedsC; components new ThreadC(100) as NullThread; components new ThreadC(100) as TinyThread0; components new ThreadC(100) as TinyThread1; components new ThreadC(100) as TinyThread2; MainC.Boot <- BlinkC; BlinkC.NullThread -> NullThread; BlinkC.TinyThread0 -> TinyThread0; BlinkC.TinyThread1 -> TinyThread1; BlinkC.TinyThread2 -> TinyThread2; BlinkC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tosthreads/apps/Blink/BlinkC.nc000066400000000000000000000053161207233610700225770ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Blink is a simple application used to test the basic functionality of * TOSThreads. * * Upon a successful burn, you should see LED0 flashing with a period of every * 200ms, and LED1 and LED2 flashing in unison with a period of 1000ms. * * @author Kevin Klues (klueska@cs.stanford.edu) */ module BlinkC { uses { interface Boot; interface Thread as NullThread; interface Thread as TinyThread0; interface Thread as TinyThread1; interface Thread as TinyThread2; interface Leds; } } implementation { event void Boot.booted() { //call NullThread.start(NULL); call TinyThread0.start(NULL); call TinyThread1.start(NULL); call TinyThread2.start(NULL); } event void NullThread.run(void* arg) { for(;;){ } } event void TinyThread0.run(void* arg) { for(;;){ call Leds.led0Toggle(); call TinyThread0.sleep(200); } } event void TinyThread1.run(void* arg) { for(;;){ call Leds.led1Toggle(); call TinyThread1.sleep(1000); } } event void TinyThread2.run(void* arg) { for(;;){ call Leds.led2Toggle(); call TinyThread2.sleep(1000); } } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/Blink/Makefile000066400000000000000000000000521207233610700225430ustar00rootroot00000000000000COMPONENT=BlinkAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/apps/Blink/README000066400000000000000000000011371207233610700217700ustar00rootroot00000000000000README for TOSThreads Blink Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: Blink is a simple application used to test the basic functionality of TOSThreads. You can install Blink on a mote via the following command: make threads install Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic Upon a successful burn, you should see LED0 flashing with a period of every 200ms, and LED1 and LED2 flashing in unison with a period of 1000ms. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/apps/Blink_DynamicThreads/000077500000000000000000000000001207233610700240655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/apps/Blink_DynamicThreads/BlinkAppC.nc000066400000000000000000000042061207233610700262140ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Blink is a simple application used to test the basic functionality of * TOSThreads using dynamic threads rather than static threads. * * Upon a successful burn, you should see LED0 flashing with a period of every * 200ms, and LED1 and LED2 flashing in unison with a period of 1000ms. * * @author Chieh-Jan Mike Liang */ configuration BlinkAppC {} implementation { components MainC, BlinkC, LedsC, DynamicThreadC; BlinkC.Boot -> MainC; BlinkC.Leds -> LedsC; BlinkC.DynamicThread -> DynamicThreadC; } tinyos-2.1.2+dfsg/apps/tosthreads/apps/Blink_DynamicThreads/BlinkC.nc000066400000000000000000000054131207233610700255540ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Blink is a simple application used to test the basic functionality of * TOSThreads using dynamic threads rather than static threads. * * Upon a successful burn, you should see LED0 flashing with a period of every * 200ms, and LED1 and LED2 flashing in unison with a period of 1000ms. * * @author Chieh-Jan Mike Liang */ module BlinkC { uses { interface Boot; interface Leds; interface DynamicThread; } } implementation { tosthread_t blink1; tosthread_t blink2; tosthread_t blink3; uint16_t a1 = 1; uint16_t a2 = 2; uint16_t a3 = 3; void blink_thread(void* arg) { uint16_t *a = (uint16_t *)arg; for (;;) { if (*a == 1) { call Leds.led0Toggle(); call DynamicThread.sleep(200); } else if (*a == 2) { call Leds.led1Toggle(); call DynamicThread.sleep(1000); } else if (*a == 3) { call Leds.led2Toggle(); call DynamicThread.sleep(1000); } } } event void Boot.booted() { call DynamicThread.create(&blink1, blink_thread, &a1, 500); call DynamicThread.create(&blink2, blink_thread, &a2, 500); call DynamicThread.create(&blink3, blink_thread, &a3, 500); } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/Blink_DynamicThreads/Makefile000066400000000000000000000000521207233610700255220ustar00rootroot00000000000000COMPONENT=BlinkAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/apps/Blink_DynamicThreads/README000066400000000000000000000011521207233610700247440ustar00rootroot00000000000000README for TOSThreads Blink_DynamicThreads Author/Contact: tinyos-help@millennium.berkeley.edu Author: Chieh-Jan Mike Liang Description: Blink_DynamicThreads is the dynamic-thread version of Blink. You can install Blink_DynamicThread on a mote via the following command: make threads install Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic Upon a successful burn, you should see LED0 flashing with a period of every 200ms, and LED1 and LED2 flashing in unison with a period of 1000ms. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/apps/Bounce/000077500000000000000000000000001207233610700212625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/apps/Bounce/BarrierBounceAppC.nc000066400000000000000000000117361207233610700251020ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application is derived from a similar application in the TinyThread * implementation by William P. McCartney from Cleveland State University (2006) * * This application implements a threaded approach to bouncing messages back and forth * between two motes. To run it you will need to burn one mote with node ID 0, and a * second mote with node ID 1. Three different threads run that each send a * message and then wait to receive a message before sending their next one. After * each message reception, an LED is toggled to indicate that it was received. Thread * 0 blinks led0, thread 1 blinks led1, and thread 2 blinks led2. The three * threads run independently, and three different messages are bounced back and * forth between the two motes in an unsynchronized fashion. In contrast to the simple * Bounce application also found in this directory, once a thread receives a message * it waits on a Barrier before continuing on and turning on its led. A synchronization * thread is used to wait until all three messages have been received before unblocking * the barrier. In this way, messages are still bounced back and forth between the * two motes in an asynchronous fashion, but all leds come on at the same time * because of the Barrier and the synchronization thread. The effect is that all three * leds on one mote flash in unison, followed by all three on the other mote back * and forth forever. * * @author Kevin Klues */ #include "barrier_bounce.h" #include "stack.h" configuration BarrierBounceAppC { } implementation { components MainC, BarrierBounceC as BounceC, LedsC; components BlockingActiveMessageC; MainC.Boot <- BounceC; BounceC.BlockingAMControl -> BlockingActiveMessageC; BounceC.Leds -> LedsC; // Included to allow the use of barriers in our application components ThreadSynchronizationC; BounceC.Barrier -> ThreadSynchronizationC; // Thread and Bounce Message handlers for thread 0 components new ThreadC(BOUNCE_THREAD0_STACK_SIZE) as BounceThread0; components new BlockingAMSenderC(AM_BOUNCE0_MSG) as BlockingAMSender0; components new BlockingAMReceiverC(AM_BOUNCE0_MSG) as BlockingAMReceiver0; BounceC.BounceThread0 -> BounceThread0; BounceC.BlockingAMSend0 -> BlockingAMSender0; BounceC.BlockingReceive0 -> BlockingAMReceiver0; // Thread and Bounce Message handlers for thread 1 components new ThreadC(BOUNCE_THREAD1_STACK_SIZE) as BounceThread1; components new BlockingAMSenderC(AM_BOUNCE1_MSG) as BlockingAMSender1; components new BlockingAMReceiverC(AM_BOUNCE1_MSG) as BlockingAMReceiver1; BounceC.BounceThread1 -> BounceThread1; BounceC.BlockingAMSend1 -> BlockingAMSender1; BounceC.BlockingReceive1 -> BlockingAMReceiver1; // Thread and Bounce Message handlers for thread 2 components new ThreadC(BOUNCE_THREAD2_STACK_SIZE) as BounceThread2; components new BlockingAMSenderC(AM_BOUNCE2_MSG) as BlockingAMSender2; components new BlockingAMReceiverC(AM_BOUNCE2_MSG) as BlockingAMReceiver2; BounceC.BounceThread2 -> BounceThread2; BounceC.BlockingAMSend2 -> BlockingAMSender2; BounceC.BlockingReceive2 -> BlockingAMReceiver2; // Synchronization thread to keep all threads in sync so that // none of them are able to continue execution until all of them // have both sent and received a message components new ThreadC(SYNC_THREAD_STACK_SIZE) as SyncThread; BounceC.SyncThread -> SyncThread; } tinyos-2.1.2+dfsg/apps/tosthreads/apps/Bounce/BarrierBounceC.nc000066400000000000000000000123421207233610700244330ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application is derived from a similar application in the TinyThread * implementation by William P. McCartney from Cleveland State University (2006) * * This application implements a threaded approach to bouncing messages back and forth * between two motes. To run it you will need to burn one mote with node ID 0, and a * second mote with node ID 1. Three different threads run that each send a * message and then wait to receive a message before sending their next one. After * each message reception, an LED is toggled to indicate that it was received. Thread * 0 blinks led0, thread 1 blinks led1, and thread 2 blinks led2. The three * threads run independently, and three different messages are bounced back and * forth between the two motes in an unsynchronized fashion. In contrast to the simple * Bounce application also found in this directory, once a thread receives a message * it waits on a Barrier before continuing on and turning on its led. A synchronization * thread is used to wait until all three messages have been received before unblocking * the barrier. In this way, messages are still bounced back and forth between the * two motes in an asynchronous fashion, but all leds come on at the same time * because of the Barrier and the synchronization thread. The effect is that all three * leds on one mote flash in unison, followed by all three on the other mote back * and forth forever. * * @author Kevin Klues */ module BarrierBounceC { uses { interface Boot; interface BlockingStdControl as BlockingAMControl; interface Barrier; interface Thread as BounceThread0; interface BlockingAMSend as BlockingAMSend0; interface BlockingReceive as BlockingReceive0; interface Thread as BounceThread1; interface BlockingAMSend as BlockingAMSend1; interface BlockingReceive as BlockingReceive1; interface Thread as BounceThread2; interface BlockingAMSend as BlockingAMSend2; interface BlockingReceive as BlockingReceive2; interface Thread as SyncThread; interface Leds; } } implementation { message_t m0,m1,m2; barrier_t b0; event void Boot.booted() { //Reset all barriers used in this program at initialization call Barrier.reset(&b0, 4); //Start the sync thread to power up the AM layer call SyncThread.start(NULL); } event void BounceThread0.run(void* arg) { for(;;) { call Leds.led0Off(); call BlockingAMSend0.send(!TOS_NODE_ID, &m0, 0); if(call BlockingReceive0.receive(&m0, 5000) == SUCCESS) { call Barrier.block(&b0); call Leds.led0On(); call BounceThread0.sleep(500); } } } event void BounceThread1.run(void* arg) { for(;;) { call Leds.led1Off(); call BlockingAMSend1.send(!TOS_NODE_ID, &m1, 0); if(call BlockingReceive1.receive(&m1, 5000) == SUCCESS) { call Barrier.block(&b0); call Leds.led1On(); call BounceThread1.sleep(500); } } } event void BounceThread2.run(void* arg) { for(;;) { call Leds.led2Off(); call BlockingAMSend2.send(!TOS_NODE_ID, &m2, 0); if(call BlockingReceive2.receive(&m2, 5000) == SUCCESS) { call Barrier.block(&b0); call Leds.led2On(); call BounceThread2.sleep(500); } } } event void SyncThread.run(void* arg) { //Once the am layer is powered on, start the rest of // the threads call BlockingAMControl.start(); call BounceThread0.start(NULL); call BounceThread1.start(NULL); call BounceThread2.start(NULL); for(;;) { call Barrier.block(&b0); call Barrier.reset(&b0, 4); } } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/Bounce/Makefile000066400000000000000000000001301207233610700227140ustar00rootroot00000000000000COMPONENT=BarrierBounceAppC PFLAGS += -DCC2420_HW_ACKNOWLEDGEMENTS include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/apps/Bounce/README000066400000000000000000000036741207233610700221540ustar00rootroot00000000000000README for TOSThreads Bounce Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: This application is derived from a similar application in the TinyThread implementation by William P. McCartney from Cleveland State University (2006) This application stresses the operation of the thread based AM commands for packet transmission and reception. To run this application you will need to burn it on one mote with NODE_ID 0, and a second mote with NODE_ID 1. You can install Bounce on a mote via the following command: make threads install.0 make threads install.1 Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic Three different threads run, and each contains an infinite loop that first sends a message and then waits to receive a message before returning to the top of the loop. After each message reception, one of the onboard LEDs is toggled to indicate that it was received. Thread 0 blinks LED0, thread 1 blinks LED1, and thread 2 blinks LED2. The three threads run independently, and three different messages are bounced back and forth between the two motes in an unsynchronized fashion. In contrast to the simple Bounce application found in the cthreads version of this application, once a thread receives a message it waits on a Barrier before continuing on and turning on its led. A synchronization thread is used to wait until all three messages have been received by each thread before unblocking the barrier. In this way, messages are still bounced back and forth between the two motes in an asynchronous fashion, but all leds come on at the same time because of the Barrier and the synchronization thread. Successful running of this application results in all three leds coming on in unison on one mote and then coming on in unison on the other mote, back and forth forever. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/apps/Bounce/barrier_bounce.h000066400000000000000000000035761207233610700244270ustar00rootroot00000000000000 /* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Header file for declaring AM types for Bounce messages * in the BarrierBounce application * * @author Kevin Klues */ #ifndef BARRIER_BOUNCE_H #define BARRIER_BOUNCE_H enum { AM_BOUNCE0_MSG = 0x90, AM_BOUNCE1_MSG = 0x91, AM_BOUNCE2_MSG = 0x92, }; #endif //BARRIER_BOUNCE_H tinyos-2.1.2+dfsg/apps/tosthreads/apps/Bounce/stack.h000066400000000000000000000035711207233610700225460ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef BARRIER_BOUNCE_APP_STACK_H #define BARRIER_BOUNCE_APP_STACK_H enum { BOUNCE_THREAD0_STACK_SIZE = 600, BOUNCE_THREAD1_STACK_SIZE = 600, BOUNCE_THREAD2_STACK_SIZE = 600, SYNC_THREAD_STACK_SIZE = 600, }; #endif //BARRIER_BOUNCE_APP_STACK_H tinyos-2.1.2+dfsg/apps/tosthreads/apps/Makefile000066400000000000000000000030521207233610700215070ustar00rootroot00000000000000#-*-makefile-*- ###################################################################### # # Makes the entire suite of TinyOS applications for a given platform. # # Author: Martin Turon # Date: August 18, 2005 # ###################################################################### # $Id: Makefile,v 1.1 2008-06-12 15:11:38 klueska Exp $ # MAKECMDGOALS is the way to get the arguments passed into a Makefile ... TARGET=$(MAKECMDGOALS) NESDOC_TARGET=$(filter-out nesdoc,$(TARGET)) # Here is a way to get the list of subdirectories in a Makefile ... ROOT=. SUBDIRS := $(shell find * -type d) # Okay, match any target, and recurse the subdirectories %: @for i in $(SUBDIRS); do \ HERE=$$PWD; \ if [ -f $$i/Makefile ]; then \ echo Building ... $(PWD)/$$i; \ echo make $(TARGET); \ cd $$i; \ $(MAKE) $(TARGET); \ cd $$HERE; \ fi; \ done threads: @: cthreads: @: dynthreads: @: BASEDIR = $(shell pwd | sed 's@\(.*\)/apps.*$$@\1@' ) # The output directory for generated documentation DOCDIR = $(BASEDIR)/doc/nesdoc nesdoc: @echo This target rebuilds documentation for all known platforms. @echo It DOES NOT overwrite any existing documentation, thus, it @echo is best run after deleting all old documentation. @echo @echo To delete all old documentation, delete the contents of the @echo $(DOCDIR) directory. @echo @echo Press Enter to continue, or ^C to abort. @read for platform in `ncc -print-platforms`; do \ $(MAKE) $$platform docs.nohtml.preserve; \ nesdoc -o $(DOCDIR) -html -target=$$platform; \ done tinyos-2.1.2+dfsg/apps/tosthreads/apps/RadioStress/000077500000000000000000000000001207233610700223115ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/apps/RadioStress/Makefile000066400000000000000000000000601207233610700237450ustar00rootroot00000000000000COMPONENT=RadioStressAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/apps/RadioStress/README000066400000000000000000000030161207233610700231710ustar00rootroot00000000000000README for TOSThreads RadioStress Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: This application stresses the operation of the thread based AM commands for packet transmission and reception. To run this application you will need to burn it on one mote with NODE_ID 0, and a second mote with NODE_ID 1. You can install RadioStress on a mote via the following command: make threads install.0 make threads install.1 Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic The application burned with NODE_ID 0 will be programmed as a receiver and will wait for messages from the sender programmed with NODE_ID 1. In the case of the sender, messages with three different AM ids are sent from three different threads in an infinite loop, and one of LED0, LED1, and LED2 is toggled upon successful transmission. In the case of the receiver, three different threads are used to wait for messages in an infinite loop from the three sending threads on the sender mote. Upon successful reception, one of LED0, LED1, or LED2 is toggled depending on the AM id received. Successful running of this application will result in all three leds flashing very rapidly on both motes, with the receiver mote flashing less rapidly if the sender mote is turned off (i.e. once every 5000ms because there is a timeout on how long it waits for messages to be received before retrying). Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/apps/RadioStress/RadioStressAppC.nc000066400000000000000000000066431207233610700256520ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application stresses the blocking send and receive commands for the TinyOS * thread implementation. Three threads are run, each thread toggling a different * colored LED. If a node has TOS_NODE_ID == 0 it will try and receive in * an infinite loop, toggling one of the three Leds upon reception. If it has * TOS_NODE_ID == 1, it will try to send in an infinite loop, toggling one of the three * Leds upon the completion of a send. Thread 0 toggles the Led0, Thread 1 toggles * Led1, and Thread 2 toggles Led2. * * @author Kevin Klues */ configuration RadioStressAppC { } implementation { components MainC, RadioStressC, LedsC; components BlockingActiveMessageC; MainC.Boot <- RadioStressC; RadioStressC.BlockingAMControl -> BlockingActiveMessageC; RadioStressC.Leds -> LedsC; components new ThreadC(300) as RadioStressThread0; components new BlockingAMSenderC(220) as BlockingAMSender0; components new BlockingAMReceiverC(220) as BlockingAMReceiver0; RadioStressC.RadioStressThread0 -> RadioStressThread0; RadioStressC.BlockingAMSend0 -> BlockingAMSender0; RadioStressC.BlockingReceive0 -> BlockingAMReceiver0; components new ThreadC(300) as RadioStressThread1; components new BlockingAMSenderC(221) as BlockingAMSender1; components new BlockingAMReceiverC(221) as BlockingAMReceiver1; RadioStressC.RadioStressThread1 -> RadioStressThread1; RadioStressC.BlockingAMSend1 -> BlockingAMSender1; RadioStressC.BlockingReceive1 -> BlockingAMReceiver1; components new ThreadC(300) as RadioStressThread2; components new BlockingAMSenderC(222) as BlockingAMSender2; components new BlockingAMReceiverC(222) as BlockingAMReceiver2; RadioStressC.RadioStressThread2 -> RadioStressThread2; RadioStressC.BlockingAMSend2 -> BlockingAMSender2; RadioStressC.BlockingReceive2 -> BlockingAMReceiver2; } tinyos-2.1.2+dfsg/apps/tosthreads/apps/RadioStress/RadioStressC.nc000066400000000000000000000101071207233610700251770ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application stresses the blocking send and receive commands for the TinyOS * thread implementation. Three threads are run, each thread toggling a different * colored LED. If a node has TOS_NODE_ID == 0 it will try and receive in * an infinite loop, toggling one of the three Leds upon reception. If it has * TOS_NODE_ID == 1, it will try to send in an infinite loop, toggling one of the three * Leds upon the completion of a send. Thread 0 toggles the Led0, Thread 1 toggles * Led1, and Thread 2 toggles Led2. * * @author Kevin Klues */ #include "AM.h" module RadioStressC { uses { interface Boot; interface BlockingStdControl as BlockingAMControl; interface Thread as RadioStressThread0; interface BlockingAMSend as BlockingAMSend0; interface BlockingReceive as BlockingReceive0; interface Thread as RadioStressThread1; interface BlockingAMSend as BlockingAMSend1; interface BlockingReceive as BlockingReceive1; interface Thread as RadioStressThread2; interface BlockingAMSend as BlockingAMSend2; interface BlockingReceive as BlockingReceive2; interface Leds; } } implementation { message_t m0; message_t m1; message_t m2; event void Boot.booted() { call RadioStressThread0.start(NULL); call RadioStressThread1.start(NULL); call RadioStressThread2.start(NULL); } event void RadioStressThread0.run(void* arg) { call BlockingAMControl.start(); for(;;) { if(TOS_NODE_ID == 0) { call BlockingReceive0.receive(&m0, 5000); call Leds.led0Toggle(); } else { call BlockingAMSend0.send(!TOS_NODE_ID, &m0, 0); call Leds.led0Toggle(); //call RadioStressThread0.sleep(500); } } } event void RadioStressThread1.run(void* arg) { call BlockingAMControl.start(); for(;;) { if(TOS_NODE_ID == 0) { call BlockingReceive1.receive(&m1, 5000); call Leds.led1Toggle(); } else { call BlockingAMSend1.send(!TOS_NODE_ID, &m1, 0); call Leds.led1Toggle(); //call RadioStressThread1.sleep(500); } } } event void RadioStressThread2.run(void* arg) { call BlockingAMControl.start(); for(;;) { if(TOS_NODE_ID == 0) { call BlockingReceive2.receive(&m2, 5000); call Leds.led2Toggle(); } else { call BlockingAMSend2.send(!TOS_NODE_ID, &m2, 0); call Leds.led2Toggle(); //call RadioStressThread2.sleep(500); } } } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestBasicsbSensors/000077500000000000000000000000001207233610700236325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestBasicsbSensors/Makefile000066400000000000000000000005571207233610700253010ustar00rootroot00000000000000COMPONENT=TestBasicsbSensorsAppC CFLAGS += -I$(TOSDIR)/sensorboards/basicsb CFLAGS += -I$(TOSDIR)/lib/tosthreads/sensorboards/basicsb ifneq ($(filter mica2 mica2dot micaz iris clean,$(MAKECMDGOALS)),) include $(MAKERULES) else %: @echo " Sorry, this application is only written to work with mica based motes and the basicsb sensorboards.." threads: @: endif tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestBasicsbSensors/README000066400000000000000000000022111207233610700245060ustar00rootroot00000000000000README for TOSThreads TestBasicsbSensors Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: This application is used to test the threaded version of the API for accessing sensors on the basicsb sensor board. You can install TestBasicsbSensors on a mote via the following command: make threads install Valid platforms are currently: mica2, micaz and iris This application simply takes sensor readings in an infinite loop from the Photo and Temperature sensors on the basicsb sensor board and forwards them over the serial interface. Upon successful transmission, LED0 is toggled. A successful test will result in the TestBasicsbSensors mote constantly flickering LED0. Additionally, messages containing the sensor readings should be forwarded over the serial interface as verified by running the following for the platform of interest: java net.tinyos.tools.Listen -comm serial@/dev/ttyUSBXXX: Once this java application is running, you should see output containing the sensor readings being streamed to your terminal. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestBasicsbSensors/TestBasicsbSensorsAppC.nc000066400000000000000000000062411207233610700305060ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application is used to test the threaded version of the API for accessing * sensors on the basicsb sensor board. * * This application simply takes sensor readings in an infinite loop from the * Photo and Temperature sensors on the basicsb sensor board and forwards them * over the serial interface. Upon successful transmission, LED0 is toggled. * * A successful test will result in the TestBasicsbSensors mote constantly * flickering LED0. Additionally, messages containing the sensor readings should * be forwarded over the serial interface as verified by running the following * for the platform of interest: * java net.tinyos.tools.Listen -comm serial@/dev/ttyUSBXXX: * * Once this java application is running, you should see output containing the * sensor readings being streamed to your terminal. * * @author Kevin Klues (klueska@cs.stanford.edu) */ configuration TestBasicsbSensorsAppC { } implementation { components MainC, TestBasicsbSensorsC; components new ThreadC(125) as MainThread; components new BlockingPhotoC(); components new BlockingTempC(); components BlockingSerialActiveMessageC; components new BlockingSerialAMSenderC(128); MainC.Boot <- TestBasicsbSensorsC; TestBasicsbSensorsC.MainThread -> MainThread; TestBasicsbSensorsC.Photo -> BlockingPhotoC; TestBasicsbSensorsC.Temp -> BlockingTempC; TestBasicsbSensorsC.AMControl -> BlockingSerialActiveMessageC; TestBasicsbSensorsC.BlockingAMSend -> BlockingSerialAMSenderC; TestBasicsbSensorsC.Packet -> BlockingSerialAMSenderC; components LedsC; TestBasicsbSensorsC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestBasicsbSensors/TestBasicsbSensorsC.nc000066400000000000000000000051751207233610700300520ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ module TestBasicsbSensorsC { uses { interface Boot; interface Thread as MainThread; interface BlockingRead as Photo; interface BlockingRead as Temp; interface BlockingStdControl as AMControl; interface BlockingAMSend; interface Packet; interface Leds; } } implementation { typedef struct sensor_readings { uint16_t photo; uint16_t temp; } sensor_readings_t; event void Boot.booted() { call MainThread.start(NULL); } event void MainThread.run(void* arg) { sensor_readings_t* readings; message_t msg; readings = call Packet.getPayload(&msg, sizeof(sensor_readings_t)); while( call AMControl.start() != SUCCESS ); for(;;){ while( call Photo.read(&(readings->photo)) != SUCCESS ); while( call Temp.read(&(readings->temp)) != SUCCESS ); while( call BlockingAMSend.send(AM_BROADCAST_ADDR, &msg, sizeof(sensor_readings_t)) != SUCCESS ); call Leds.led0Toggle(); call MainThread.sleep(512); } } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestBlockStorage/000077500000000000000000000000001207233610700232665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestBlockStorage/Makefile000066400000000000000000000011731207233610700247300ustar00rootroot00000000000000COMPONENT=TestBlockStorageAppC THIS_SUPPORTED_PLATFORMS=tmote telos telosb eyesIFXv1 eyesIFXv2 mica2 mica2dot telosa eyesIFX micaz iris tinynode mulle ifneq ($(filter $(THIS_SUPPORTED_PLATFORMS) clean,$(MAKECMDGOALS)),) ifneq ($(filter tmote telos telosb eyesIFXv1,$(MAKECMDGOALS)),) CFLAGS+=-DUSE_STM25P endif ifneq ($(filter mica2 telosa mica2dot eyesIFX eyesIFXv2 micaz iris tinynode mulle,$(MAKECMDGOALS)),) CFLAGS+=-DUSE_AT45DB endif include $(MAKERULES) else %: @echo " Sorry, this application is only written to work with the following platforms:" @echo " $(THIS_SUPPORTED_PLATFORMS)" threads: @: endif tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestBlockStorage/README000066400000000000000000000015471207233610700241550ustar00rootroot00000000000000README for TOSThreads TestBlockStorage Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: This application is used to test the threaded version of the API for performing block storage. You can install TestBlockStorage on a mote via the following command: make threads install Valid platforms are currently: tmote, telosb, mica2, micaz, iris and mulle This application first checks the size of the block storage volume, and erases it. Then, it randomly writes records, followed by a verification with read. Successful running of this application results in LED0 being ON throughout the duration of the erase, write, and read sequence. Finally, if all tests pass, LED1 is turned ON. Otherwise, all three LEDs are turned ON to indicate problems. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestBlockStorage/TestBlockStorageAppC.nc000066400000000000000000000052541207233610700276010ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application is used to test the threaded version of the API for performing * block storage. * * This application first checks the size of the block storage volume, and * erases it. Then, it randomly writes records, followed by a verification * with read. * * Successful running of this application results in LED0 being ON * throughout the duration of the erase, write, and read sequence. Finally, * if all tests pass, LED1 is turned ON. Otherwise, all three LEDs are * turned ON to indicate problems. * * @author Chieh-Jan Mike Liang */ #include "StorageVolumes.h" configuration TestBlockStorageAppC {} implementation { components MainC, TestBlockStorageP, LedsC, new ThreadC(500) as TinyThread1, new BlockingBlockStorageC(VOLUME_TESTBLOCKSTORAGE1) as BlockingBlockStorage1, RandomC; TestBlockStorageP.Boot -> MainC; TestBlockStorageP.Leds -> LedsC; TestBlockStorageP.BlockingBlock1 -> BlockingBlockStorage1; TestBlockStorageP.TinyThread1 -> TinyThread1; TestBlockStorageP.Random -> RandomC; } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestBlockStorage/TestBlockStorageP.nc000066400000000000000000000067771207233610700271700ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application is used to test the threaded version of the API for performing * block storage. * * This application first checks the size of the block storage volume, and * erases it. Then, it randomly writes records, followed by a verification * with read. * * Successful running of this application results in LED0 being ON * throughout the duration of the erase, write, and read sequence. Finally, * if all tests pass, LED1 is turned ON. Otherwise, all three LEDs are * turned ON to indicate problems. * * @author Chieh-Jan Mike Liang */ #include "Storage.h" module TestBlockStorageP { uses { interface Boot; interface Leds; interface Thread as TinyThread1; interface BlockingBlock as BlockingBlock1; interface Random; } } implementation { event void Boot.booted() { call TinyThread1.start(NULL); } event void TinyThread1.run(void* arg) { int i; error_t error; #if defined USE_AT45DB storage_len_t expectedVolumeSize = 262144; #elif defined USE_STM25P storage_len_t expectedVolumeSize = 1048576; #endif call Leds.set(1); if (call BlockingBlock1.getSize() != expectedVolumeSize) { call Leds.set(7); return; } error = call BlockingBlock1.erase(); if (error != SUCCESS) { call Leds.set(7); return; } for (i = 0; i < 50; i++) { storage_addr_t writeAddr = call Random.rand32() % (call BlockingBlock1.getSize() - sizeof(storage_addr_t)); storage_len_t len = sizeof(storage_addr_t); storage_addr_t readBuf; error = call BlockingBlock1.write(writeAddr, &writeAddr, &len); if (error == SUCCESS) { len = sizeof(storage_addr_t); call BlockingBlock1.read(writeAddr, &readBuf, &len); if (readBuf != writeAddr) { call Leds.set(7); return; } } else { call Leds.set(7); return; } } call Leds.set(2); } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestBlockStorage/volumes-at45db.xml000066400000000000000000000001371207233610700265640ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestBlockStorage/volumes-stm25p.xml000066400000000000000000000001401207233610700266250ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/000077500000000000000000000000001207233610700230025ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/Makefile000066400000000000000000000004561207233610700244470ustar00rootroot00000000000000COMPONENT=TestCollectionAppC CFLAGS += -I$(TOSDIR)/lib/tosthreads/sensorboards/universal CFLAGS += -I$(TOSDIR)/lib/tosthreads/lib/net/ CFLAGS += -I$(TOSDIR)/lib/net/ CFLAGS += -I$(TOSDIR)/lib/tosthreads/lib/net/ctp CFLAGS += -I$(TOSDIR)/lib/net/ctp -I$(TOSDIR)/lib/net/4bitle include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/MultihopOscilloscope.h000066400000000000000000000017721207233610700273420ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * @author David Gay * @author Kyle Jamieson */ #ifndef MULTIHOP_OSCILLOSCOPE_H #define MULTIHOP_OSCILLOSCOPE_H enum { /* Number of readings per message. If you increase this, you may have to increase the message_t size. */ NREADINGS = 5, /* Default sampling period. */ DEFAULT_INTERVAL = 1024, AM_OSCILLOSCOPE = 0x93 }; typedef nx_struct oscilloscope { nx_uint16_t version; /* Version of the interval. */ nx_uint16_t interval; /* Samping period. */ nx_uint16_t id; /* Mote id of sending mote. */ nx_uint16_t count; /* The readings are samples count * NREADINGS onwards */ nx_uint16_t readings[NREADINGS]; } oscilloscope_t; #endif tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/README000066400000000000000000000051431207233610700236650ustar00rootroot00000000000000README for TOSThreads TestCollection Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: TestCollection is a reimplementation of the Multihop Oscilloscope application using TOSThreads. It periodically samples a universal software-based SineSensor and broadcasts a message every few readings. These readings can be displayed by the Java "Oscilloscope" application found in the the TestCollection/java subdirectory. The sampling rate starts at 4Hz, but can be changed from the Java application. You can install TestCollection on a mote via the following command: make threads install Valid platforms are currently: tmote, telosb, shimmer*, span, mica2, micaz, iris, and epic At least two motes must be used by this application, with one of them installed as a base station. Base station motes can be created by installing them with NODE_ID % 500 == 0. i.e. make threads install.0 make threads install.500 make threads install.1000 All other nodes can be installed with arbitrary NODE_IDs. make threads install.123 Successful running of this application is verified by all NON-base station motes periodically flashing LED1 upon sending a message, and the base station mote, flashing LED2 upon successful reception of a message. Additionally, correct operation should be verified by running the java tool described in the following section. Tools: The Java application displays readings it receives from motes running the MultihopOscilloscope demo via a serial forwarder. To run it, change to the TestCollection/java subdirectory and type: make java net.tinyos.sf.SerialForwarder -comm serial@: # e.g., java net.tinyos.sf.SerialForwarder -comm serial@/dev/ttyUSB0:mica2 # or java net.tinyos.sf.SerialForwarder -comm serial@COM2:telosb ./run NOTE:: The baud rate 57600 must be used telos based motes, as its configuration has been changed to work with this baud rate when compiled for TOSThreads. I.e. DO NOT just substitute 'telosb' or 'tmote' for above. Explicitly set it to 57600. The controls at the bottom of the screen allow you to zoom in or out the X axis, change the range of the Y axis, and clear all received data. You can change the color used to display a mote by clicking on its color in the mote table. Notes: By default, the Makefile for TestCollection is setup to run CTP as the underlying collection protocol. The makefile can be modified to work with MultihopLQI by changing the appropriate include directories. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/TestCollectionAppC.nc000066400000000000000000000100761207233610700270270ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * TestCollection is a reimplementation of the Multihop Oscilloscope application * using TOSThreads. It periodically samples a universal software-based SineSensor * and broadcasts a message every few readings. These readings can be displayed by * the Java "Oscilloscope" application found in the the TestCollection/java * subdirectory. The sampling rate starts at 4Hz, but can be changed from the Java * application. * * At least two motes must be used by this application, with one of them installed * as a base station. Base station motes can be created by installing them with * NODE_ID % 500 == 0. * i.e. make threads install.0 * make threads install.500 * make threads install.1000 * * All other nodes can be installed with arbitrary NODE_IDs. * make threads install.123 * * Successful running of this application is verified by all NON-base station motes * periodically flashing LED1 upon sending a message, and the base station mote, * flashing LED2 upon successful reception of a message. Additionally, correct * operation should be verified by running the java tool described in the following * section. * * @author Chieh-Jan Mike Liang */ #include "MultihopOscilloscope.h" configuration TestCollectionAppC {} implementation { components TestCollectionC, new BlockingSineSensorC(), LedsC, BlockingActiveMessageC, BlockingCollectionControlC, new BlockingCollectionSenderC(AM_OSCILLOSCOPE), new BlockingCollectionReceiverC(AM_OSCILLOSCOPE), new ThreadC(800) as MainThread, MainC, BlockingSerialActiveMessageC, new BlockingSerialAMSenderC(AM_OSCILLOSCOPE); TestCollectionC.MainThread -> MainThread; TestCollectionC.Boot -> MainC; TestCollectionC.BlockingRead -> BlockingSineSensorC; TestCollectionC.Leds -> LedsC; TestCollectionC.BlockingRead -> BlockingSineSensorC; TestCollectionC.RadioStdControl -> BlockingActiveMessageC; TestCollectionC.RoutingControl -> BlockingCollectionControlC; TestCollectionC.RootControl -> BlockingCollectionControlC; TestCollectionC.Packet -> BlockingCollectionSenderC; TestCollectionC.BlockingSend -> BlockingCollectionSenderC; TestCollectionC.BlockingReceive -> BlockingCollectionReceiverC; TestCollectionC.SerialStdControl -> BlockingSerialActiveMessageC; TestCollectionC.SerialBlockingSend -> BlockingSerialAMSenderC; } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/TestCollectionC.nc000066400000000000000000000130651207233610700263670ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * TestCollection is a reimplementation of the Multihop Oscilloscope application * using TOSThreads. It periodically samples a universal software-based SineSensor * and broadcasts a message every few readings. These readings can be displayed by * the Java "Oscilloscope" application found in the the TestCollection/java * subdirectory. The sampling rate starts at 4Hz, but can be changed from the Java * application. * * At least two motes must be used by this application, with one of them installed * as a base station. Base station motes can be created by installing them with * NODE_ID % 500 == 0. * i.e. make threads install.0 * make threads install.500 * make threads install.1000 * * All other nodes can be installed with arbitrary NODE_IDs. * make threads install.123 * * Successful running of this application is verified by all NON-base station motes * periodically flashing LED1 upon sending a message, and the base station mote, * flashing LED2 upon successful reception of a message. Additionally, correct * operation should be verified by running the java tool described in the following * section. * * @author Chieh-Jan Mike Liang */ #include "MultihopOscilloscope.h" module TestCollectionC { uses { interface Boot; interface Thread as MainThread; interface BlockingRead; interface BlockingStdControl as RadioStdControl; interface Packet; interface BlockingSend; interface BlockingReceive; interface BlockingStdControl as RoutingControl; interface RootControl; interface Leds; interface BlockingStdControl as SerialStdControl; interface BlockingAMSend as SerialBlockingSend; } } implementation { static void fatal_problem(); oscilloscope_t local; uint8_t reading = 0; /* 0 to NREADINGS */ message_t sendbuf; message_t recvbuf; void fatal_problem(); void report_problem(); void report_sent(); void report_received(); event void Boot.booted() { local.interval = DEFAULT_INTERVAL; local.id = TOS_NODE_ID; local.version = 0; call MainThread.start(NULL); } event void MainThread.run(void* arg) { while (call RadioStdControl.start() != SUCCESS); while (call RoutingControl.start() != SUCCESS); if (local.id % 500 == 0) { while (call SerialStdControl.start() != SUCCESS); call RootControl.setRoot(); for (;;) { if (call BlockingReceive.receive(&recvbuf, 0) == SUCCESS) { oscilloscope_t *recv_o = (oscilloscope_t *) call BlockingReceive.getPayload(&recvbuf, sizeof(oscilloscope_t)); oscilloscope_t *send_o = (oscilloscope_t *) call SerialBlockingSend.getPayload(&sendbuf, sizeof(oscilloscope_t)); memcpy(send_o, recv_o, sizeof(oscilloscope_t)); call SerialBlockingSend.send(AM_BROADCAST_ADDR, &sendbuf, sizeof(oscilloscope_t)); report_received(); } } } else { uint16_t var; for (;;) { if (reading == NREADINGS) { oscilloscope_t *o = (oscilloscope_t *) call BlockingSend.getPayload(&sendbuf, sizeof(oscilloscope_t)); if (o == NULL) { fatal_problem(); return; } memcpy(o, &local, sizeof(oscilloscope_t)); if (call BlockingSend.send(&sendbuf, sizeof(oscilloscope_t)) == SUCCESS) { local.count++; report_sent(); } else { report_problem(); } reading = 0; } if (call BlockingRead.read(&var) == SUCCESS) { local.readings[reading++] = var; } call MainThread.sleep(local.interval); } } } // Use LEDs to report various status issues. void fatal_problem() { call Leds.led0On(); call Leds.led1On(); call Leds.led2On(); } void report_problem() { call Leds.led0Toggle(); } void report_sent() { call Leds.led1Toggle(); } void report_received() { call Leds.led2Toggle(); } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/java/000077500000000000000000000000001207233610700237235ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/java/ColorCellEditor.java000066400000000000000000000032621207233610700276160ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; /* Editor for table cells representing colors. Popup a color chooser. */ public class ColorCellEditor extends AbstractCellEditor implements TableCellEditor { private Color color; private JButton button; public ColorCellEditor(String title) { button = new JButton(); final JColorChooser chooser = new JColorChooser(); final JDialog dialog = JColorChooser.createDialog (button, title, true, chooser, new ActionListener() { public void actionPerformed(ActionEvent e) { color = chooser.getColor(); } }, null); button.setBorderPainted(false); button.addActionListener (new ActionListener () { public void actionPerformed(ActionEvent e) { button.setBackground(color); chooser.setColor(color); dialog.setVisible(true); fireEditingStopped(); } } ); } public Object getCellEditorValue() { return color; } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { color = (Color)value; return button; } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/java/Data.java000066400000000000000000000040451207233610700254420ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import java.util.*; /* Hold all data received from motes */ class Data { /* The mote data is stored in a flat array indexed by a mote's identifier. A null value indicates no mote with that identifier. */ private Node[] nodes = new Node[256]; private Oscilloscope parent; Data(Oscilloscope parent) { this.parent = parent; } /* Data received from mote nodeId containing NREADINGS samples from messageId * NREADINGS onwards. Tell parent if this is a new node. */ void update(int nodeId, int messageId, int readings[]) { if (nodeId >= nodes.length) { int newLength = nodes.length * 2; if (nodeId >= newLength) newLength = nodeId + 1; Node newNodes[] = new Node[newLength]; System.arraycopy(nodes, 0, newNodes, 0, nodes.length); nodes = newNodes; } Node node = nodes[nodeId]; if (node == null) { nodes[nodeId] = node = new Node(nodeId); parent.newNode(nodeId); } node.update(messageId, readings); } /* Return value of sample x for mote nodeId, or -1 for missing data */ int getData(int nodeId, int x) { if (nodeId >= nodes.length || nodes[nodeId] == null) return -1; return nodes[nodeId].getData(x); } /* Return number of last known sample on mote nodeId. Returns 0 for unknown motes. */ int maxX(int nodeId) { if (nodeId >= nodes.length || nodes[nodeId] == null) return 0; return nodes[nodeId].maxX(); } /* Return number of largest known sample on all motes (0 if there are no motes) */ int maxX() { int max = 0; for (int i = 0; i < nodes.length; i++) if (nodes[i] != null) { int nmax = nodes[i].maxX(); if (nmax > max) max = nmax; } return max; } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/java/Graph.java000066400000000000000000000147621207233610700256410ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.font.*; import java.awt.geom.*; import java.util.*; /* Panel for drawing mote-data graphs */ class Graph extends JPanel { final static int BORDER_LEFT = 40; final static int BORDER_RIGHT = 0; final static int BORDER_TOP = 10; final static int BORDER_BOTTOM = 10; final static int TICK_SPACING = 40; final static int MAX_TICKS = 16; final static int TICK_WIDTH = 10; final static int MIN_WIDTH = 50; int gx0, gx1, gy0, gy1; // graph bounds int scale = 2; // gx1 - gx0 == MIN_WIDTH << scale Window parent; /* Graph to screen coordinate conversion support */ int height, width; double xscale, yscale; void updateConversion() { height = getHeight() - BORDER_TOP - BORDER_BOTTOM; width = getWidth() - BORDER_LEFT - BORDER_RIGHT; if (height < 1) height = 1; if (width < 1) width = 1; xscale = (double)width / (gx1 - gx0 + 1); yscale = (double)height / (gy1 - gy0 + 1); } Graphics makeClip(Graphics g) { return g.create(BORDER_LEFT, BORDER_TOP, width, height); } // Note that these do not include the border offset! int screenX(int gx) { return (int)(xscale * (gx - gx0) + 0.5); } int screenY(int gy) { return (int)(height - yscale * (gy - gy0)); } int graphX(int sx) { return (int)(sx / xscale + gx0 + 0.5); } Graph(Window parent) { this.parent = parent; gy0 = 0; gy1 = 0xffff; gx0 = 0; gx1 = MIN_WIDTH << scale; } void rightDrawString(Graphics2D g, String s, int x, int y) { TextLayout layout = new TextLayout(s, parent.smallFont, g.getFontRenderContext()); Rectangle2D bounds = layout.getBounds(); layout.draw(g, x - (float)bounds.getWidth(), y + (float)bounds.getHeight() / 2); } protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; /* Repaint. Synchronize on Oscilloscope to avoid data changing. Simply clear panel, draw Y axis and all the mote graphs. */ synchronized (parent.parent) { updateConversion(); g2d.setColor(Color.BLACK); g2d.fillRect(0, 0, getWidth(), getHeight()); drawYAxis(g2d); Graphics clipped = makeClip(g2d); int count = parent.moteListModel.size(); for (int i = 0; i < count; i++) { clipped.setColor(parent.moteListModel.getColor(i)); drawGraph(clipped, parent.moteListModel.get(i)); } } } /* Draw the Y-axis */ protected void drawYAxis(Graphics2D g) { int axis_x = BORDER_LEFT - 1; int height = getHeight() - BORDER_BOTTOM - BORDER_TOP; g.setColor(Color.WHITE); g.drawLine(axis_x, BORDER_TOP, axis_x, BORDER_TOP + height - 1); /* Draw a reasonable set of tick marks */ int nTicks = height / TICK_SPACING; if (nTicks > MAX_TICKS) nTicks = MAX_TICKS; int tickInterval = (gy1 - gy0 + 1) / nTicks; if (tickInterval == 0) tickInterval = 1; /* Tick interval should be of the family A * 10^B, where A = 1, 2 * or 5. We tend more to rounding A up, to reduce rather than increase the number of ticks. */ int B = (int)(Math.log(tickInterval) / Math.log(10)); int A = (int)(tickInterval / Math.pow(10, B) + 0.5); if (A > 2) A = 5; else if (A > 5) A = 10; tickInterval = A * (int)Math.pow(10, B); /* Ticks are printed at multiples of tickInterval */ int tick = ((gy0 + tickInterval - 1) / tickInterval) * tickInterval; while (tick <= gy1) { int stick = screenY(tick) + BORDER_TOP; rightDrawString(g, "" + tick, axis_x - TICK_WIDTH / 2 - 2, stick); g.drawLine(axis_x - TICK_WIDTH / 2, stick, axis_x - TICK_WIDTH / 2 + TICK_WIDTH, stick); tick += tickInterval; } } /* Draw graph for mote nodeId */ protected void drawGraph(Graphics g, int nodeId) { SingleGraph sg = new SingleGraph(g, nodeId); if (gx1 - gx0 >= width) // More points than pixels-iterate by pixel for (int sx = 0; sx < width; sx++) sg.nextPoint(g, graphX(sx), sx); else // Less points than pixel-iterate by points for (int gx = gx0; gx <= gx1; gx++) sg.nextPoint(g, gx, screenX(gx)); } /* Inner class to simplify drawing a graph. Simplify initialise it, then feed it the X screen and graph coordinates, from left to right. */ private class SingleGraph { int lastsx, lastsy, nodeId; /* Start drawing the graph mote id */ SingleGraph(Graphics g, int id) { nodeId = id; lastsx = -1; lastsy = -1; } /* Next point in mote's graph is at x value gx, screen coordinate sx */ void nextPoint(Graphics g, int gx, int sx) { int gy = parent.parent.data.getData(nodeId, gx); int sy = -1; if (gy >= 0) { // Ignore missing values double rsy = height - yscale * (gy - gy0); // Ignore problem values if (rsy >= -1e6 && rsy <= 1e6) sy = (int)(rsy + 0.5); if (lastsy >= 0 && sy >= 0) g.drawLine(lastsx, lastsy, sx, sy); } lastsx = sx; lastsy = sy; } } /* Update X-axis range in GUI */ void updateXLabel() { parent.xLabel.setText("X: " + gx0 + " - " + gx1); } /* Ensure that graph is nicely positioned on screen. max is the largest sample number received from any mote. */ private void recenter(int max) { // New data will show up at the 3/4 point // The 2nd term ensures that gx1 will be >= max int scrollby = ((gx1 - gx0) >> 2) + (max - gx1); gx0 += scrollby; gx1 += scrollby; if (gx0 < 0) { // don't bother showing negative sample numbers gx1 -= gx0; gx0 = 0; } updateXLabel(); } /* New data received. Redraw graph, scrolling if necessary */ void newData() { int max = parent.parent.data.maxX(); if (max > gx1 || max < gx0) // time to scroll recenter(max); repaint(); } /* User set the X-axis scale to newScale */ void setScale(int newScale) { gx1 = gx0 + (MIN_WIDTH << newScale); scale = newScale; recenter(parent.parent.data.maxX()); repaint(); } /* User attempted to set Y-axis range to newy0..newy1. Refuse bogus values (return false), or accept, redraw and return true. */ boolean setYAxis(int newy0, int newy1) { if (newy0 >= newy1 || newy0 < 0 || newy0 > 65535 || newy1 < 0 || newy1 > 65535) return false; gy0 = newy0; gy1 = newy1; repaint(); return true; } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/java/Makefile000066400000000000000000000010461207233610700253640ustar00rootroot00000000000000GEN=OscilloscopeMsg.java Constants.java all: oscilloscope.jar oscilloscope.jar: Oscilloscope.class jar cf $@ *.class OscilloscopeMsg.java: ../MultihopOscilloscope.h mig -target=null -java-classname=OscilloscopeMsg java ../MultihopOscilloscope.h oscilloscope -o $@ Constants.java: ../MultihopOscilloscope.h ncg -target=null -java-classname=Constants java ../MultihopOscilloscope.h NREADINGS DEFAULT_INTERVAL -o $@ Oscilloscope.class: $(wildcard *.java) $(GEN) javac *.java clean: rm -f *.class $(GEN) veryclean: clean rm oscilloscope.jar tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/java/Node.java000066400000000000000000000063161207233610700254610ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Class holding all data received from a mote. */ class Node { /* Data is hold in an array whose size is a multiple of INCREMENT, and INCREMENT itself must be a multiple of Constant.NREADINGS. This simplifies handling the extension and clipping of old data (see setEnd) */ final static int INCREMENT = 100 * Constants.NREADINGS; final static int MAX_SIZE = 100 * INCREMENT; // Must be multiple of INCREMENT /* The mote's identifier */ int id; /* Data received from the mote. data[0] is the dataStart'th sample Indexes 0 through dataEnd - dataStart - 1 hold data. Samples are 16-bit unsigned numbers, -1 indicates missing data. */ int[] data; int dataStart, dataEnd; Node(int _id) { id = _id; } /* Update data to hold received samples newDataIndex .. newEnd. If we receive data with a lower index, we discard newer data (we assume the mote rebooted). */ private void setEnd(int newDataIndex, int newEnd) { if (newDataIndex < dataStart || data == null) { /* New data is before the start of what we have. Just throw it all away and start again */ dataStart = newDataIndex; data = new int[INCREMENT]; } if (newEnd > dataStart + data.length) { /* Try extending first */ if (data.length < MAX_SIZE) { int newLength = (newEnd - dataStart + INCREMENT - 1) / INCREMENT * INCREMENT; if (newLength >= MAX_SIZE) newLength = MAX_SIZE; int[] newData = new int[newLength]; System.arraycopy(data, 0, newData, 0, data.length); data = newData; } if (newEnd > dataStart + data.length) { /* Still doesn't fit. Squish. We assume INCREMENT >= (newEnd - newDataIndex), and ensure that dataStart + data.length - INCREMENT = newDataIndex */ int newStart = newDataIndex + INCREMENT - data.length; if (dataStart + data.length > newStart) System.arraycopy(data, newStart - dataStart, data, 0, data.length - (newStart - dataStart)); dataStart = newStart; } } /* Mark any missing data as invalid */ for (int i = dataEnd < dataStart ? dataStart : dataEnd; i < newDataIndex; i++) data[i - dataStart] = -1; /* If we receive a count less than the old count, we assume the old data is invalid */ dataEnd = newEnd; } /* Data received containing NREADINGS samples from messageId * NREADINGS onwards */ void update(int messageId, int readings[]) { int start = messageId * Constants.NREADINGS; setEnd(start, start + Constants.NREADINGS); for (int i = 0; i < readings.length; i++) data[start - dataStart + i] = readings[i]; } /* Return value of sample x, or -1 for missing data */ int getData(int x) { if (x < dataStart || x >= dataEnd) return -1; else return data[x - dataStart]; } /* Return number of last known sample */ int maxX() { return dataEnd - 1; } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/java/Oscilloscope.java000066400000000000000000000076771207233610700272450ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import net.tinyos.message.*; import net.tinyos.util.*; import java.io.*; /* The "Oscilloscope" demo app. Displays graphs showing data received from the Oscilloscope mote application, and allows the user to: - zoom in or out on the X axis - set the scale on the Y axis - change the sampling period - change the color of each mote's graph - clear all data This application is in three parts: - the Node and Data objects store data received from the motes and support simple queries - the Window and Graph and miscellaneous support objects implement the GUI and graph drawing - the Oscilloscope object talks to the motes and coordinates the other objects Synchronization is handled through the Oscilloscope object. Any operation that reads or writes the mote data must be synchronized on Oscilloscope. Note that the messageReceived method below is synchronized, so no further synchronization is needed when updating state based on received messages. */ public class Oscilloscope implements MessageListener { MoteIF mote; Data data; Window window; /* The current sampling period. If we receive a message from a mote with a newer version, we update our interval. If we receive a message with an older version, we broadcast a message with the current interval and version. If the user changes the interval, we increment the version and broadcast the new interval and version. */ int interval = Constants.DEFAULT_INTERVAL; int version = -1; /* Main entry point */ void run() { data = new Data(this); window = new Window(this); window.setup(); mote = new MoteIF(PrintStreamMessenger.err); mote.registerListener(new OscilloscopeMsg(), this); } /* The data object has informed us that nodeId is a previously unknown mote. Update the GUI. */ void newNode(int nodeId) { window.newNode(nodeId); } synchronized public void messageReceived(int dest_addr, Message msg) { if (msg instanceof OscilloscopeMsg) { OscilloscopeMsg omsg = (OscilloscopeMsg)msg; /* Update interval and mote data */ periodUpdate(omsg.get_version(), omsg.get_interval()); data.update(omsg.get_id(), omsg.get_count(), omsg.get_readings()); /* Inform the GUI that new data showed up */ window.newData(); } } /* A potentially new version and interval has been received from the mote */ void periodUpdate(int moteVersion, int moteInterval) { if (moteVersion > version) { /* It's new. Update our vision of the interval. */ version = moteVersion; interval = moteInterval; window.updateSamplePeriod(); } else if (moteVersion < version) { /* It's old. Update the mote's vision of the interval. */ sendInterval(); } } /* The user wants to set the interval to newPeriod. Refuse bogus values and return false, or accept the change, broadcast it, and return true */ synchronized boolean setInterval(int newPeriod) { if (newPeriod < 1 || newPeriod > 65535) return false; interval = newPeriod; version++; sendInterval(); return true; } /* Broadcast a version+interval message. */ void sendInterval() { OscilloscopeMsg omsg = new OscilloscopeMsg(); omsg.set_version(version); omsg.set_interval(interval); try { mote.send(MoteIF.TOS_BCAST_ADDR, omsg); } catch (IOException e) { window.error("Cannot send message to mote"); } } /* User wants to clear all data. */ void clear() { data = new Data(this); } public static void main(String[] args) { Oscilloscope me = new Oscilloscope(); me.run(); } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/java/Window.java000066400000000000000000000207401207233610700260400ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import javax.swing.table.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; import java.util.*; /* The main GUI object. Build the GUI and coordinate all user activities */ class Window { Oscilloscope parent; Graph graph; Font smallFont = new Font("Dialog", Font.PLAIN, 8); Font boldFont = new Font("Dialog", Font.BOLD, 12); Font normalFont = new Font("Dialog", Font.PLAIN, 12); MoteTableModel moteListModel; // GUI view of mote list JLabel xLabel; // Label displaying X axis range JTextField sampleText, yText; // inputs for sample period and Y axis range JFrame frame; Window(Oscilloscope parent) { this.parent = parent; } /* A model for the mote table, and general utility operations on the mote list */ class MoteTableModel extends AbstractTableModel { private ArrayList motes = new ArrayList(); private ArrayList colors = new ArrayList(); /* Initial mote colors cycle through this list. Add more colors if you want. */ private Color[] cycle = { Color.RED, Color.WHITE, Color.GREEN, Color.MAGENTA, Color.YELLOW, Color.GRAY, Color.YELLOW }; int cycleIndex; /* TableModel methods for achieving our table appearance */ public String getColumnName(int col) { if (col == 0) return "Mote"; else return "Color"; } public int getColumnCount() { return 2; } public synchronized int getRowCount() { return motes.size(); } public synchronized Object getValueAt(int row, int col) { if (col == 0) return motes.get(row); else return colors.get(row); } public Class getColumnClass(int col) { return getValueAt(0, col).getClass(); } public boolean isCellEditable(int row, int col) { return col == 1; } public synchronized void setValueAt(Object value, int row, int col) { colors.set(row, value); fireTableCellUpdated(row, col); graph.repaint(); } /* Return mote id of i'th mote */ int get(int i) { return ((Integer)motes.get(i)).intValue(); } /* Return color of i'th mote */ Color getColor(int i) { return (Color)colors.get(i); } /* Return number of motes */ int size() { return motes.size(); } /* Add a new mote */ synchronized void newNode(int nodeId) { /* Shock, horror. No binary search. */ int i, len = motes.size(); for (i = 0; ; i++) if (i == len || nodeId < get(i)) { motes.add(i, new Integer(nodeId)); // Cycle through a set of initial colors colors.add(i, cycle[cycleIndex++ % cycle.length]); break; } fireTableRowsInserted(i, i); } /* Remove all motes */ void clear() { motes = new ArrayList(); colors = new ArrayList(); fireTableDataChanged(); } } /* A simple full-color cell */ static class MoteColor extends JLabel implements TableCellRenderer { public MoteColor() { setOpaque(true); } public Component getTableCellRendererComponent (JTable table, Object color, boolean isSelected, boolean hasFocus, int row, int column) { setBackground((Color)color); return this; } } /* Convenience methods for making buttons, labels and textfields. Simplifies code and ensures a consistent style. */ JButton makeButton(String label, ActionListener action) { JButton button = new JButton(); button.setText(label); button.setFont(boldFont); button.addActionListener(action); return button; } JLabel makeLabel(String txt, int alignment) { JLabel label = new JLabel(txt, alignment); label.setFont(boldFont); return label; } JLabel makeSmallLabel(String txt, int alignment) { JLabel label = new JLabel(txt, alignment); label.setFont(smallFont); return label; } JTextField makeTextField(int columns, ActionListener action) { JTextField tf = new JTextField(columns); tf.setFont(normalFont); tf.setMaximumSize(tf.getPreferredSize()); tf.addActionListener(action); return tf; } /* Build the GUI */ void setup() { JPanel main = new JPanel(new BorderLayout()); main.setMinimumSize(new Dimension(500, 250)); main.setPreferredSize(new Dimension(800, 400)); // Three panels: mote list, graph, controls moteListModel = new MoteTableModel(); JTable moteList = new JTable(moteListModel); moteList.setDefaultRenderer(Color.class, new MoteColor()); moteList.setDefaultEditor(Color.class, new ColorCellEditor("Pick Mote Color")); moteList.setPreferredScrollableViewportSize(new Dimension(100, 400)); JScrollPane motePanel = new JScrollPane(); motePanel.getViewport().add(moteList, null); main.add(motePanel, BorderLayout.WEST); graph = new Graph(this); main.add(graph, BorderLayout.CENTER); // Controls. Organised using box layouts. // Sample period. JLabel sampleLabel = makeLabel("Sample period (ms):", JLabel.RIGHT); sampleText = makeTextField(6, new ActionListener() { public void actionPerformed(ActionEvent e) { setSamplePeriod(); } } ); updateSamplePeriod(); // Clear data. JButton clearButton = makeButton("Clear data", new ActionListener() { public void actionPerformed(ActionEvent e) { clearData(); } } ); // Adjust X-axis zoom. Box xControl = new Box(BoxLayout.Y_AXIS); xLabel = makeLabel("", JLabel.CENTER); final JSlider xSlider = new JSlider(JSlider.HORIZONTAL, 0, 8, graph.scale); Hashtable xTable = new Hashtable(); for (int i = 0; i <= 8; i += 2) xTable.put(new Integer(i), makeSmallLabel("" + (Graph.MIN_WIDTH << i), JLabel.CENTER)); xSlider.setLabelTable(xTable); xSlider.setPaintLabels(true); graph.updateXLabel(); graph.setScale(graph.scale); xSlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { //if (!xSlider.getValueIsAdjusting()) graph.setScale((int)xSlider.getValue()); } }); xControl.add(xLabel); xControl.add(xSlider); // Adjust Y-axis range. JLabel yLabel = makeLabel("Y:", JLabel.RIGHT); yText = makeTextField(12, new ActionListener() { public void actionPerformed(ActionEvent e) { setYAxis(); } } ); yText.setText(graph.gy0 + " - " + graph.gy1); Box controls = new Box(BoxLayout.X_AXIS); controls.add(clearButton); controls.add(Box.createHorizontalGlue()); controls.add(Box.createRigidArea(new Dimension(20, 0))); controls.add(sampleLabel); controls.add(sampleText); controls.add(Box.createHorizontalGlue()); controls.add(Box.createRigidArea(new Dimension(20, 0))); controls.add(xControl); controls.add(yLabel); controls.add(yText); main.add(controls, BorderLayout.SOUTH); // The frame part frame = new JFrame("Oscilloscope"); frame.setSize(main.getPreferredSize()); frame.getContentPane().add(main); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } /* User operation: clear data */ void clearData() { synchronized (parent) { moteListModel.clear(); parent.clear(); graph.newData(); } } /* User operation: set Y-axis range. */ void setYAxis() { String val = yText.getText(); try { int dash = val.indexOf('-'); if (dash >= 0) { String min = val.substring(0, dash).trim(); String max = val.substring(dash + 1).trim(); if (!graph.setYAxis(Integer.parseInt(min), Integer.parseInt(max))) error("Invalid range " + min + " - " + max + " (expected values between 0 and 65535)"); return; } } catch (NumberFormatException e) { } error("Invalid range " + val + " (expected NN-MM)"); } /* User operation: set sample period. */ void setSamplePeriod() { String periodS = sampleText.getText().trim(); try { int newPeriod = Integer.parseInt(periodS); if (parent.setInterval(newPeriod)) return; } catch (NumberFormatException e) { } error("Invalid sample period " + periodS); } /* Notification: sample period changed. */ void updateSamplePeriod() { sampleText.setText("" + parent.interval); } /* Notification: new node. */ void newNode(int nodeId) { moteListModel.newNode(nodeId); } /* Notification: new data. */ void newData() { graph.newData(); } void error(String msg) { JOptionPane.showMessageDialog(frame, msg, "Error", JOptionPane.ERROR_MESSAGE); } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/java/build.xml000066400000000000000000000006201207233610700255420ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/java/oscilloscope.jar000066400000000000000000000454701207233610700271310ustar00rootroot00000000000000PKd8 META-INF/PKPKd8META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMu +h8*8(x%irrPK_FFPKd8ColorCellEditor$1.class}RmOA~=8{\~Ԙ&*&tɱ.ejGgL/ٙyynO;؜DX `)2VBA3j S#^F ˽C>⧙9 {х.; u;0ӻB*i_2d5Pj= TQ_xp[{Q~0ObF)kF ё|F|t2_B6K({Bj.;:.{ F_4Jg1Љاc#;KaZi\3eN: nP 7PKS$h%ZWPKd8ColorCellEditor.classTiOQ= 㰴QE.Rp-P`*`Hi!e<ߐD?xmi hw.s:?}`/U#.0̨JTHRх9y cyyੂg 2 El; }=H" CGPbbi&_xn X0-S,@e o `6C k8Coδ~;B<].\^+v!9#zMaU!VO-_lCfZy _5ESTaNykemT"0JqEʬL/Ki̋ɣ[S\u 1#y5<Ǣ!coSa]N 5O2A۰,dˆrW/ixe +ȶIJKȪ53\\ 0rQFH6)$tfKkEFeZ$mQvr(Lʙ&#\N;o r怞#m%M(.0_6u&G_$|Rda[t;B'dcbUw*8 ~u}/HTѵKT)3hVM z{):GbjRA1Aʌ6 -)AK994Jct%~~B=E00G3u.իEX<Z#D LK;:{mvx=;iRwH ӯ.>5PKcѢ/PKd8Constants.class=Ok@5j{ࡷփ"&Z6v)M< zy̾߿) tLtMuo؋hFhSuʄB p >V^lBY{e7SZn"y Dci~e?4ދo|HO&h/wPWttA&s ;[\~ΰ`:s4Y[ZPK8>1!PKd8 Data.classmR]OQ=ҺE*-lMx/,e%%mQy`L|A)F#1깷ǝ33??d& tp =Bч065$#D€k`X^,mzvִWU٥J._(*Ҿꬂs9XQ=bl/mf'-Jp25W؞g WTTGr頜JHz/<au4hAH蘁q3]4ŢzV,x殟ʖ+ˇ^rCZ9ϑ\RBeW//%SAG^K 6B:ڠ)P܈@uO}โv6h"2B(+oҏRQ5HcaRj}'YQMҢӺ1])1]tgMv[:_XN\Kk<Ьft1YB9eEكbo5Mk/)!l m`n}d@Of}si:ӴYa:` BS`5buIJX9" zn mO|Ihq-MC~)O@NbP-%Cw B7[:;>`q`>cG8qt碟8PKDcPKd8 Graph.classW |[e$[`ҤVҭu[.,MjvE (d( 7d>?Zp?)d 8|Xǧ707PO ɇqV^܁ωB>//KTv |Q)ݲG}Iv|ه{Wu|͇\}2/!u!'CķDQdzP:ITOZ1(0iJ٬k[lv*P &7Sٜʭ5 w9jkWt |suH|H\]Ѧ:ڗ6EW-Wm[~:DO hs Y*@gpM !ZLZ }fJxbxz-Vg e@"cAG[idșfb[l"`ZjS:X"ede:Mkn>`"b5IMtgkKep0Z- xQD*;WCNR@3@G. TPWƂ0iz Ѩg&Rto_:eizsS q՜*Qʖ(v}d%MV*)k̙\Z…@ 8:n5!>ɩw]"j{mnuB6* %dLO>~`q|c؜N:\Jtgl{ϟH^ H@7:^6 ^53/p@9=bx]~%ao .2Џ V6te?O"f/O$c3"m jmF Ac ) $I$_4tvl2o_;V9 qޙSr5n=VnK(PϩG FXB X ,rB^3lMKjt%+9^9qV?J[GkkF,ݟ3Y=Xކ5V7-/8c\G ,VD2v,RmJ'ӬmYliJؑ+0:Zӂźg3MɈQ87bl->s{:N{{J.0lbU(yƗ]T`DVD;[.>}}m+N,tIhf{6xs KzQ"r^SW9ȇ=^78#)ckmq-CA\`ʼnڋ2u'J;LQ**GCU۱ o9jbŝaj٦pwIKEٸ.{c(SBCCxCSGMM@LZ+V m 3ۊ*,gVPg8:ŴpXUiyL_³r1掻~rjSUc+ PCUadO</?mO]c]=Yy_rIIP]H-ǜ抸uUO47BGHNneo^J洜$< .B%3_NM#f[A⪞ZH4-!%'zgˈUނ *S-?e? }QQ;LFԀGq Ɉn[q!*&M` aNnJv1E`r@EH;DހF-жD<مh(Toc @C>̫?5x8-L6%jڌx;VbX1;pNsXݵyf-0 oɥW>\؎q50ƵxߦX:u+oMvPfN_UBI.I;1> y!*=j;J.Q"+J{Lk5n)@hnf::e.*mMYLf+x<s~Yl)Fm7.uq^Q9M8[l.2qΘm>F,<`?~ZXφf&6cf==r_O0ƴK:>L ,.((lFlsOWD}UBIL\ 74Xf%D, 'bvxBv0jIG9(wlJDU:, + 颭o/_WgVU~[qUL-Nr:bgECx3Ql_fMVР/+׳,/hgGok©ahjY_R5sFMmZl`>asU*2Kٶq9d4k9 'TO`z/lh)kt%0E>;{沙v5໖] \$[VӖpVxep@ qID{e\ڡ30cI {^5uEtƫhK_8hlY x~_({,հ= sS˪LO Y0;)";s3+^-Se_Ы3X<_ي97qa ÛU35>̺)*aR5@?mq着s,'+V{i+l"CtݾKv@\&ei^Gy2씾_ _:k2T{s7jj>vot޿1'wW+,cf=9 ;'cщpR[4yR/+xʁWg$Y'3 Js<]7M/E/)8/lnT|K |[H4uI I4xC2[ vNxWe_xpdlj$OEİ@`ZbZncB 86ہd*f$sn\eK 0i=;؏w}\yxP a-..FglxiZ;#vr<GŹJkJtr!7v?nqiJŌsR$tRj"$;(ӣ?H ^xkUvv`6 ,hOhZ@2>Hbscըbϫô|5s)DZ+~H]*;X@=8 ͊%;޼E1G;/j}K`7h?OO7}cC]62j>G^釼&`hֹ vrk8}kS7a62$bZW`[`vйW v j6S{+҆vܻݥs njݺ^8Hi UzHB;`0${u#L}G偑'g,^%ru+pi˨?{ rH O jGJqװYm >T<:)܏[3{Xϣ8^ye3hax1ŘFo.֒%gdH۴v3眽7+Nõ(#(ȋC1ÝP1"fTGb>3&(Q\`BR'|SnSm|*؁˲2%ToZ➊kԜkUSi1{NATJJUSHcMe޻]6(yfV}HaҲ˵yt޲-Є`Vf6GfLgܘM%܌=bpߗ5]I]Dz+݊lWA 1D ]t}_ :gOהgܵFMg3f-[nkH* L}̶z q9h ZslmV7XCO+I]XsJUKt5>*4$qXd !k8A oa`aVb1u18D6Ü 384i5cA<%Jx -+"m׬,]E=hH`HxGIk8( S*[hwhy6dn!UKcY'~(7͎Xӹxg I*K5ev?͑ۚhuCb޵ 2gˆk9射QqivQBǜ5,;ZoI( kvt<6W L3,c/C CFBɂЁXLFMPp/O^|K.# 'c_P"E=΢Z}K*Y¦ fmIF䳇 㗽"ɧtNϱF2vq}'ʳ_% ޳"%0t?q#zrݦL:{0ȮR_4]}]~T42%GρPKPKd8 Window.classX xTdd (NbD@!"$I@їcLg&$*m֥.jmZRܺh[KֶZWz{/L2u8sѭwKj8A{4xpgV!9! ]|)dܭaW*pB~)WBX ~a@L P^!9 0T?i-fQx\COBRz3s*,)y*^Pӿ*xI"<$ŗeT/ KWa9S7zM>{CC+To m⸷4GChс#'Ӱl"><*(p5T"*S|B4)4^CO1B5 MҐâ4MMa°SiT ?Ft*`chB4KvV  ^HjN9 |ɬٜ'-0q#13 莛Ɉ'JLO,Ofz)PM}LxkR'o1 FAv'gQK$,|#c{D$?PF(h7Ed >А% G\^2Fo*n5vZ0[cf<"owDJ7^s \pűD,9BEuo3+%ffg_oUe%zl6 9n ܕM3~Ӱcmنe=X2!09M58H\u)VS)d_<^ywCmMWfl_Pz⦑n1WbTyef%L_*bdB0;mzCm' L%[+.ZW/c$9D$u\kdжČx2ʫto:.rp>aR(Ԁt:tc3z\ sN p Pe^tLۓ}YA^[bf"ÁFhNh·Gk2'vukN62s?4r #)컄O̼qJˀʣfvMĽӌtv"[>-u޾^GrjVXq:S06!n<`yf6BUo*fbjqAZMF_<{/-%[ mˇ f,0n".fk4GeCF]CKM50f 3e tT2>:7dz LܺpP_Vr;+Vje5tX dT۱04V"e}Ξ[pVHoo5F,lxd,J`>/ۋ\jm,]kZg&SBڢ)dWEjS&MxU2mÈ9G"xZx.]8gDu=H%c˕w|&܎9ǻ %$VtN-^}MM~ug)қ壗',o&m{survqt`s _@kqiEfsd:SOYE/9i!-eNjbwǡ=d# ~M(APm"ru(u]_wںPwnX`ͽ`sca&'zyY_ga\}(ϱ0<21w8qruՃ•@gOς;y~'!C8?9?T]U&*UI&[˦|8G;?ŵjI}:p_A^CUު{( VЅ60G53rfef 90+ tP_3Z us<2Ÿ,yH'0,ZWk0F'wcAC/.\lFommyYDBn,f%TGZXXw͍e޹+rh K X9UJmQjJ_z%Wκtr*}X8е~s;J@6x-'ca} ([8>PK+,>PPdhcNKNȢ]5ϳ~r>,%b6gb{2/W^gdşB}]eVE̓^¥B\z+^|hRRb, a.i3ƲJQ?Kl. .R 7^܄G[!rTۨS˰V.tKiOډyx) PKd8 META-INF/PKd8_FF=META-INF/MANIFEST.MFPKd8,ColorCellEditor$1.classPKd8S$h%ZWColorCellEditor$2.classPKd8cѢ/rColorCellEditor.classPKd88>1!Constants.classPKd8 )sɃ Data.classPKd8Dc Graph$SingleGraph.classPKd8$EN1  \Graph.classPKd8_{ Node.classPKd8\ާROscilloscope.classPKd8#f@!OscilloscopeMsg.classPKd83[)Window$1.classPKd8#'[W+Window$2.classPKd8`-Window$3.classPKd8Z/Window$4.classPKd8Q0Window$5.classPKd8k%82Window$MoteColor.classPKd83Window$MoteTableModel.classPKd8I>)  9Window.classPK7Ftinyos-2.1.2+dfsg/apps/tosthreads/apps/TestCollection/java/run000077500000000000000000000002451207233610700244560ustar00rootroot00000000000000#!/bin/sh if cygpath -w / >/dev/null 2>/dev/null; then CLASSPATH="oscilloscope.jar;$CLASSPATH" else CLASSPATH="oscilloscope.jar:$CLASSPATH" fi java Oscilloscope tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestJoin/000077500000000000000000000000001207233610700216065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestJoin/Makefile000066400000000000000000000000551207233610700232460ustar00rootroot00000000000000COMPONENT=TestJoinAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestJoin/README000066400000000000000000000017061207233610700224720ustar00rootroot00000000000000README for TOSThreads TestJoin Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: TestJoin is a simple application used to test the basic functionality of the join() system call for waiting on a set of threads in a TOSThreads based application. You can install TestJoin on a mote via the following command: make threads install Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic Upon a successful burn, you should see all LEDs toggle in the following pattern, repeating every 8 seconds: 0s: (110) LED0 ON, LED1 ON, LED2 OFF 1s: (000) LED0 OFF, LED1 OFF, LED2 OFF 2s: (010) LED0 OFF, LED1 ON, LED2 OFF 3s: (000) LED0 OFF, LED1 OFF, LED2 OFF 4s: (111) LED0 ON, LED1 ON, LED2 ON 5s: (001) LED0 OFF, LED1 OFF, LED2 ON 6s: (011) LED0 OFF, LED1 ON, LED2 ON 7s: (001) LED0 OFF, LED1 OFF, LED2 ON Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestJoin/TestJoinAppC.nc000066400000000000000000000052621207233610700244400ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * TestJoin is a simple application used to test the basic functionality of * the join() system call for waiting on a set of threads in a TOSThreads * based application. * * Upon a successful burn, you should see all LEDs toggle in the following pattern, * repeating every 8 seconds: * * 0s: (110) LED0 ON, LED1 ON, LED2 OFF
    * 1s: (000) LED0 OFF, LED1 OFF, LED2 OFF
    * 2s: (010) LED0 OFF, LED1 ON, LED2 OFF
    * 3s: (000) LED0 OFF, LED1 OFF, LED2 OFF
    * 4s: (111) LED0 ON, LED1 ON, LED2 ON
    * 5s: (001) LED0 OFF, LED1 OFF, LED2 ON
    * 6s: (011) LED0 OFF, LED1 ON, LED2 ON
    * 7s: (001) LED0 OFF, LED1 OFF, LED2 ON
    * * @author Kevin Klues (klueska@cs.stanford.edu) */ configuration TestJoinAppC { } implementation { components MainC, TestJoinC, LedsC; components new ThreadC(100) as NullThread; components new ThreadC(100) as TinyThread0; components new ThreadC(100) as TinyThread1; MainC.Boot <- TestJoinC; TestJoinC.NullThread -> NullThread; TestJoinC.TinyThread0 -> TinyThread0; TestJoinC.TinyThread1 -> TinyThread1; TestJoinC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestJoin/TestJoinC.nc000066400000000000000000000061101207233610700237700ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * TestJoin is a simple application used to test the basic functionality of * the join() system call for waiting on a set of threads in a TOSThreads * based application. * * Upon a successful burn, you should see all LEDs toggle in the following pattern, * repeating every 8 seconds: * * 0s: (110) LED0 ON, LED1 ON, LED2 OFF
    * 1s: (000) LED0 OFF, LED1 OFF, LED2 OFF
    * 2s: (010) LED0 OFF, LED1 ON, LED2 OFF
    * 3s: (000) LED0 OFF, LED1 OFF, LED2 OFF
    * 4s: (111) LED0 ON, LED1 ON, LED2 ON
    * 5s: (001) LED0 OFF, LED1 OFF, LED2 ON
    * 6s: (011) LED0 OFF, LED1 ON, LED2 ON
    * 7s: (001) LED0 OFF, LED1 OFF, LED2 ON
    * * @author Kevin Klues (klueska@cs.stanford.edu) */ module TestJoinC { uses { interface Boot; interface Thread as NullThread; interface Thread as TinyThread0; interface Thread as TinyThread1; interface Leds; } } implementation { event void Boot.booted() { call NullThread.start(NULL); } event void NullThread.run(void* arg) { for(;;){ call TinyThread0.start(NULL); call TinyThread1.start(NULL); call TinyThread0.join(); call TinyThread1.join(); call Leds.led2Toggle(); } } event void TinyThread0.run(void* arg) { int i; for(i=0; i<2; i++){ call Leds.led0Toggle(); call TinyThread0.sleep(1000); } } event void TinyThread1.run(void* arg) { int i; for(i=0; i<4; i++){ call Leds.led1Toggle(); call TinyThread1.sleep(1000); } } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestPrintf/000077500000000000000000000000001207233610700221515ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestPrintf/Makefile000066400000000000000000000001371207233610700236120ustar00rootroot00000000000000COMPONENT=TestPrintfAppC PFLAGS += -I$(TOSDIR)/lib/tosthreads/lib/printf include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestPrintf/README000066400000000000000000000025151207233610700230340ustar00rootroot00000000000000README for TOSThreads TestPrintf Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: This application tests the operation of the Printf client in TOSThreads. It continuously prints the value of a counter starting at 0, increasing as it prints. You can install TestPrintf on a mote via the following command: make threads install Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic Once burned on a mote, the java based PrintfClient must be ran to verify proper operation of the application. For example, to connect PrintfClient to a mote over a USB serial port: java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSBXXX: NOTE:: The baud rate 57600 must be used telos based motes, as its configuration has been changed to work with this baud rate when compiled for tosthreads. I.e. DO NOT just substitute 'telosb' or 'tmote' for above. Explicitly set it to 57600. Once this java application is running, you should see output of the sort continuously being streamed to your terminal: ... ... Counter: 4549 Counter: 4550 Counter: 4551 Counter: 4552 Counter: 4553 Counter: 4554 Counter: 4555 Counter: 4556 Counter: 4557 Counter: 4558 Counter: 4559 ... ... Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestPrintf/TestPrintfAppC.nc000066400000000000000000000040661207233610700253470ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application tests the operation of the Printf client in TOSThreads. It * continuously prints the value of a counter starting at 0, increasing as it * prints. * * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "printf.h" configuration TestPrintfAppC { } implementation { components MainC, TestPrintfC; components PrintfC; components new ThreadC(200); MainC.Boot <- TestPrintfC; TestPrintfC.Thread -> ThreadC; components LedsC; TestPrintfC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestPrintf/TestPrintfC.nc000066400000000000000000000041311207233610700246770ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application tests the operation of the Printf client in TOSThreads. It * continuously prints the value of a counter starting at 0, increasing as it * prints. * * @author Kevin Klues (klueska@cs.stanford.edu) */ module TestPrintfC { uses { interface Boot; interface Thread; interface Leds; } } implementation { event void Boot.booted() { call Thread.start(NULL); } event void Thread.run(void* arg) { uint32_t counter = 0; for(;;){ printf("Counter: %lu\n", counter++); } } } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestSineSensor/000077500000000000000000000000001207233610700227775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestSineSensor/Makefile000066400000000000000000000001571207233610700244420ustar00rootroot00000000000000COMPONENT=TestSineSensorAppC CFLAGS += -I$(TOSDIR)/lib/tosthreads/sensorboards/universal include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestSineSensor/README000066400000000000000000000026451207233610700236660ustar00rootroot00000000000000README for TOSThreads TestSineSensor Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: This application is used to test the threaded version of the API for accessing the software based SineSensor usable by any platform for demonstration purposes. You can install TestSineSensor on a mote via the following command: make threads install Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic This application simply takes sensor readings in an infinite loop from the SineSensor and forwards them over the serial interface. Upon successful transmission, LED0 is toggled. A successful test will result in the TestSineSensor mote constantly flickering LED0. Additionally, messages containing the sensor readings should be forwarded over the serial interface as verified by running the following for the platform of interest: java net.tinyos.tools.Listen -comm serial@/dev/ttyUSBXXX: NOTE:: The baud rate 57600 must be used telos based motes, as its configuration has been changed to work with this baud rate when compiled for tosthreads. I.e. DO NOT just substitute 'telosb' or 'tmote' for above. Explicitly set it to 57600. Once this java application is running, you should see output containing the sensor readings being streamed to your terminal. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestSineSensor/TestSineSensorAppC.nc000066400000000000000000000052101207233610700270130ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application is used to test the threaded version of the API for accessing * the software based SineSensor usable by any platform for demonstration purposes. * * This application simply takes sensor readings in an infinite loop from the * SineSensor and forwards them over the serial interface. Upon successful * transmission, LED0 is toggled. * * @author Kevin Klues (klueska@cs.stanford.edu) */ configuration TestSineSensorAppC { } implementation { components MainC, TestSineSensorC; components new ThreadC(150) as MainThread; components new BlockingSineSensorC(); components BlockingSerialActiveMessageC; components new BlockingSerialAMSenderC(228); MainC.Boot <- TestSineSensorC; MainC.SoftwareInit -> BlockingSineSensorC; TestSineSensorC.MainThread -> MainThread; TestSineSensorC.BlockingRead -> BlockingSineSensorC; TestSineSensorC.AMControl -> BlockingSerialActiveMessageC; TestSineSensorC.BlockingAMSend -> BlockingSerialAMSenderC; TestSineSensorC.Packet -> BlockingSerialAMSenderC; components LedsC; TestSineSensorC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tosthreads/apps/TestSineSensor/TestSineSensorC.nc000066400000000000000000000052751207233610700263650ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application is used to test the threaded version of the API for accessing * the software based SineSensor usable by any platform for demonstration purposes. * * This application simply takes sensor readings in an infinite loop from the * SineSensor and forwards them over the serial interface. Upon successful * transmission, LED0 is toggled. * * @author Kevin Klues (klueska@cs.stanford.edu) */ module TestSineSensorC { uses { interface Boot; interface Thread as MainThread; interface BlockingRead; interface BlockingStdControl as AMControl; interface BlockingAMSend; interface Packet; interface Leds; } } implementation { event void Boot.booted() { call MainThread.start(NULL); } event void MainThread.run(void* arg) { uint16_t* var; message_t msg; var = call Packet.getPayload(&msg, sizeof(uint16_t)); while( call AMControl.start() != SUCCESS ); for(;;){ while( call BlockingRead.read(var) != SUCCESS ); while( call BlockingAMSend.send(AM_BROADCAST_ADDR, &msg, sizeof(uint16_t)) != SUCCESS ); call Leds.led0Toggle(); } } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/000077500000000000000000000000001207233610700202125ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/BaseStation/000077500000000000000000000000001207233610700224265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/BaseStation/BaseStation.c000066400000000000000000000170721207233610700250150ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * BaseStation is a reimplementation of the standard BaseStation application using * the TOSThreads thread library. It transparently forwards any AM messages it * receives from its radio interface to its serial interface and vice versa. * *

    On the serial link, BaseStation sends and receives simple active * messages (not particular radio packets): on the radio link, it * sends radio active messages, whose format depends on the network * stack being used. BaseStation will copy its compiled-in group ID to * messages moving from the serial link to the radio, and will filter * out incoming radio messages that do not contain that group ID.

    * *

    BaseStation includes queues in both directions, with a guarantee * that once a message enters a queue, it will eventually leave on the * other interface. The queues allow the BaseStation to handle load * spikes.

    * *

    BaseStation acknowledges a message arriving over the serial link * only if that message was successfully enqueued for delivery to the * radio link.

    * *

    The LEDS are programmed to toggle as follows:

    *
      *
    • LED0: Message bridged from serial to radio
    • *
    • LED1: Message bridged from radio to serial
    • *
    • LED2: Dropped message due to queue overflow in either direction
    • *
    * * @author Kevin Klues */ //#include "stack.h" #include "tosthread.h" #include "tosthread_amradio.h" #include "tosthread_amserial.h" #include "tosthread_leds.h" #include "tosthread_threadsync.h" #define MSG_QUEUE_SIZE 3 //Parameters associated with each of the two base station paths // radio -> serial // serial -> radio typedef struct bs_params { tosthread_t receive_handle; tosthread_t snoop_handle; tosthread_t send_handle; mutex_t mutex; condvar_t condvar; message_t shared_msgs[MSG_QUEUE_SIZE]; uint8_t shared_msg_queue_size; uint8_t shared_msg_queue_index; } bs_params_t; //Declare parameters associated with radio RX thread bs_params_t radioRx_params; void radioReceive_thread(void* arg); void radioSnoop_thread(void* arg); void serialSend_thread(void* arg); //Declare parameters associated with serial RX thread bs_params_t serialRx_params; void serialReceive_thread(void* arg); void radioSend_thread(void* arg); /********* Initialize base station parameters ********/ void bs_params_init(bs_params_t* p) { mutex_init( &(p->mutex) ); condvar_init( &(p->condvar) ); p->shared_msg_queue_size = 0; p->shared_msg_queue_index = 0; } /*********** Main function thread ************/ void tosthread_main(void* arg) { bs_params_init( &radioRx_params ); bs_params_init( &serialRx_params ); amRadioStart(); amSerialStart(); tosthread_create(&(radioRx_params.receive_handle), radioReceive_thread, NULL, 200); tosthread_create(&(radioRx_params.snoop_handle), radioSnoop_thread, NULL, 200); tosthread_create(&(radioRx_params.send_handle), serialSend_thread, NULL, 200); tosthread_create(&(serialRx_params.receive_handle), serialReceive_thread, NULL, 200); tosthread_create(&(serialRx_params.send_handle), radioSend_thread, NULL, 200); } /******************** Enqueue and dequeue Messages ****************/ error_t enqueueMsg(bs_params_t* p, message_t* m) { if(p->shared_msg_queue_size < MSG_QUEUE_SIZE) { (p->shared_msgs)[p->shared_msg_queue_index] = *m; (p->shared_msg_queue_index) = (p->shared_msg_queue_index + 1) % MSG_QUEUE_SIZE; (p->shared_msg_queue_size)++; return SUCCESS; } return FAIL; } message_t* dequeueMsg(bs_params_t* p) { if(p->shared_msg_queue_size > 0) { message_t* m; m = &((p->shared_msgs)[(p->shared_msg_queue_index + (MSG_QUEUE_SIZE - p->shared_msg_queue_size)) % MSG_QUEUE_SIZE]); (p->shared_msg_queue_size)--; return m; } return NULL; } /******************** Send Serial vs. Radio Messages ****************/ error_t sendSerialMsg(message_t* msg) { am_id_t id = amRadioGetType(msg); am_addr_t source = amRadioGetSource(msg); am_addr_t dest = amRadioGetDestination(msg); uint8_t len = radioGetPayloadLength(msg); serialClear(msg); amSerialSetSource(msg, source); return amSerialSend(dest, msg, len, id); } error_t sendRadioMsg(message_t* msg) { am_id_t id = amSerialGetType(msg); am_addr_t source = amSerialGetSource(msg); am_addr_t dest = amSerialGetDestination(msg); uint8_t len = serialGetPayloadLength(msg); radioClear(msg); amRadioSetSource(msg, source); return amRadioSend(dest, msg, len, id); } /***********************************************************/ /** Generic implementations of send/receive functionality **/ /***********************************************************/ void bs_receive(error_t (*recv_func)(message_t*, uint32_t, am_id_t), bs_params_t* p) { message_t m; for(;;) { if( (*(recv_func))(&m, 0, AM_RECEIVE_FROM_ANY) == SUCCESS ) { led0Toggle(); mutex_lock( &(p->mutex) ); while( enqueueMsg(p, &m) == FAIL ) condvar_wait( &(p->condvar), &(p->mutex) ); mutex_unlock( &(p->mutex) ); condvar_signalAll( &(p->condvar) ); } else led2Toggle(); } } void bs_send(void* send_func, bs_params_t* p) { message_t m; message_t* m_ptr; for(;;) { mutex_lock( &(p->mutex) ); while( (m_ptr = dequeueMsg(p)) == NULL ) condvar_wait( &(p->condvar), &(p->mutex) ); m = *m_ptr; mutex_unlock( &(p->mutex) ); condvar_signalAll( &(p->condvar) ); if(send_func == amSerialSend) sendSerialMsg(&m); else sendRadioMsg(&m); led1Toggle(); } } /******************** Actual thread implementations ******************/ void radioReceive_thread(void* arg) { bs_receive(amRadioReceive, &radioRx_params); } void radioSnoop_thread(void* arg) { bs_receive(amRadioSnoop, &radioRx_params); } void serialSend_thread(void* arg) { bs_send(amSerialSend, &radioRx_params); } void serialReceive_thread(void* arg) { bs_receive(amSerialReceive, &serialRx_params); } void radioSend_thread(void* arg) { bs_send(amRadioSend, &serialRx_params); } tinyos-2.1.2+dfsg/apps/tosthreads/capps/BaseStation/Makefile000066400000000000000000000002041207233610700240620ustar00rootroot00000000000000TOSTHREAD_MAIN=BaseStation.c CFLAGS += -DCC2420_NO_ACKNOWLEDGEMENTS CFLAGS += -DCC2420_NO_ADDRESS_RECOGNITION include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/capps/BaseStation/README000066400000000000000000000047231207233610700233140ustar00rootroot00000000000000README for TOSThreads BaseStation Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: BaseStation is a reimplementation of the standard BaseStation application using the TOSThreads thread library. It transparently forwards any AM messages it receives from its radio interface to its serial interface and vice versa. Upon successful reception of a packet, LED0 is toggled, and upon successful forwarding, LED1 is toggled. If there are any errors, LED2 is toggled. To run this application install it on a mote via the command: make cthreads install.45 Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, and micaz Installing with NODE_ID 45 (i.e. AM_ADDRESS 45) is just to verify that the application forwards packets with an arbitrarily chosen id, which it should. To test the correct operation of this application, you need two motes: one with this BaseStation application installed on it, and one with an application that is sending messages installed, (let's use the RadioStress application from the current directory). On one mote install the Base station via the command above, and on the other install RadioStress via the command: make cthreads install.1 Don't forget the '.1' when you install, or RadioStress will be configured to receive rather than send messages. Messages are sent to AM_ADDRESS 0. A successful test will result in the RadioStress mote constantly flickering all of its leds very rapidly, and the BaseStation mote flickering its LED0 and LED1 leds rapidly. Additionally, messages should be forwarded over the serial interface as verified by running the following for the platform of interest: java net.tinyos.tools.Listen -comm serial@/dev/ttyUSBXXX: NOTE: The baud rate 57600 must be used telos based motes, as its configuration has been changed to work with this baud rate when compiled for tosthreads. I.e. DO NOT just substitute 'telosb' or 'tmote' for above. Explicitly set it to 57600. Once this java application is running, you should see output of the sort constantly being streamed to your terminal: 00 00 00 00 01 00 00 14 00 00 00 00 01 00 00 16 00 00 00 00 01 00 00 15 00 00 00 00 01 00 00 14 00 00 00 00 01 00 00 16 00 00 00 00 01 00 00 15 00 00 00 00 01 00 00 14 00 00 00 00 01 00 00 16 00 00 00 00 01 00 00 15 00 00 00 00 01 00 00 14 Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/capps/Blink/000077500000000000000000000000001207233610700212515ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/Blink/Blink.c000066400000000000000000000053531207233610700224620ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Blink is a simple application used to test the basic functionality of * TOSThreads. * * Upon a successful burn, you should see LED0 flashing with a period of every * 200ms, and LED1 and LED2 flashing in unison with a period of 1000ms. * * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "stack.h" #include "tosthread.h" #include "tosthread_leds.h" //Initialize variables associated with each thread tosthread_t blink0; tosthread_t blink1; tosthread_t blink2; void blink0_thread(void* arg); void blink1_thread(void* arg); void blink2_thread(void* arg); void tosthread_main(void* arg) { //Use stack estimator to calculate maximum stack size // on a thread by thread basis tosthread_create(&blink0, blink0_thread, NULL, BLINK0_STACK_SIZE); tosthread_create(&blink1, blink1_thread, NULL, BLINK1_STACK_SIZE); tosthread_create(&blink2, blink2_thread, NULL, BLINK2_STACK_SIZE); } void blink0_thread(void* arg) { for(;;) { led0Toggle(); tosthread_sleep(200); } } void blink1_thread(void* arg) { for(;;) { led1Toggle(); tosthread_sleep(1000); } } void blink2_thread(void* arg) { for(;;) { led2Toggle(); tosthread_sleep(1000); } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/Blink/Makefile000066400000000000000000000000551207233610700227110ustar00rootroot00000000000000TOSTHREAD_MAIN=Blink.c include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/capps/Blink/README000066400000000000000000000011401207233610700221250ustar00rootroot00000000000000README for TOSThreads Blink Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: Blink is a simple application used to test the basic functionality of TOSThreads. You can install Blink on a mote via the following command: make cthreads install Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic Upon a successful burn, you should see LED0 flashing with a period of every 200ms, and LED1 and LED2 flashing in unison with a period of 1000ms. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/capps/Blink/stack.h000066400000000000000000000033211207233610700225260ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ enum { BLINK0_STACK_SIZE = 200, BLINK1_STACK_SIZE = 200, BLINK2_STACK_SIZE = 200, }; tinyos-2.1.2+dfsg/apps/tosthreads/capps/Bounce/000077500000000000000000000000001207233610700214255ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/Bounce/Bounce.c000066400000000000000000000110521207233610700230030ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application is derived from a similar application in the TinyThread * implementation by William P. McCartney from Cleveland State University (2006) * * This application stresses the operation of the thread based AM commands for * packet transmission and reception. To run this application you will need to * burn it on one mote with NODE_ID 0, and a second mote with NODE_ID 1. * * Three different threads run that each contain an infinite loop that first sends * a message and then waits to receive a message before returning to the top of the * loop. After each message reception, one of the onboard LEDs is toggled to * indicate that it was received. Thread 0 blinks LED0, thread 1 blinks LED1, and * thread 2 blinks LED2. The three threads run independently, and three different * messages are bounced back and forth between the two motes in an unsynchronized * fashion. In contrast to the more complicated Bounce application found in the * normal nesC threads version of this application, once a thread receives a * message it will immediately flip on its LED instead of waiting on a Barrier and * synchronizing the LEDs to come on only once messages have been received from all * threads. In this way, messages are bounced back and forth between the two motes * in an asynchronous fashion, and LEDS are toggled immediately upon message * reception.. * * Successful running of this application results in each LED bouncing back and * forth between each mote independent of one another. This will continue in an * finite loop forever. * * @author Chieh-Jan Mike Liang */ #include "tosthread.h" #include "tosthread_leds.h" #include "tosthread_amradio.h" //Initialize variables associated with each thread tosthread_t bounceThread0; tosthread_t bounceThread1; tosthread_t bounceThread2; void bounceThread0_start(void* arg); void bounceThread1_start(void* arg); void bounceThread2_start(void* arg); void tosthread_main(void* arg) { amRadioStart(); tosthread_create(&bounceThread0, bounceThread0_start, NULL, 300); tosthread_create(&bounceThread1, bounceThread1_start, NULL, 300); tosthread_create(&bounceThread2, bounceThread2_start, NULL, 300); } void bounceThread0_start(void *arg) { message_t msg0; for(;;) { while (amRadioSend(AM_BROADCAST_ADDR, &msg0, 0, 20) == EBUSY) {} led0Off(); if(amRadioReceive(&msg0, 5000, 20) == SUCCESS) { led0On(); } tosthread_sleep(500); } } void bounceThread1_start(void *arg) { message_t msg1; for(;;) { while (amRadioSend(AM_BROADCAST_ADDR, &msg1, 0, 21) == EBUSY) {} led1Off(); if(amRadioReceive(&msg1, 5000, 21) == SUCCESS) { led1On(); } tosthread_sleep(500); } } void bounceThread2_start(void *arg) { message_t msg2; for(;;) { while (amRadioSend(AM_BROADCAST_ADDR, &msg2, 0, 22) == EBUSY) {} led2Off(); if(amRadioReceive(&msg2, 5000, 22) == SUCCESS) { led2On(); } tosthread_sleep(500); } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/Bounce/Makefile000066400000000000000000000000561207233610700230660ustar00rootroot00000000000000TOSTHREAD_MAIN=Bounce.c include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/capps/Bounce/README000066400000000000000000000036121207233610700223070ustar00rootroot00000000000000README for TOSThreads Bounce Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: This application is derived from a similar application in the TinyThread implementation by William P. McCartney from Cleveland State University (2006) This application stresses the operation of the thread based AM commands for packet transmission and reception. To run this application you will need to burn it on one mote with NODE_ID 0, and a second mote with NODE_ID 1. You can install Bounce on a mote via the following command: make cthreads install.0 make cthreads install.1 Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic Three different threads run that each contain an infinite loop that first sends a message and then waits to receive a message before returning to the top of the loop. After each message reception, one of the onboard LEDs is toggled to indicate that it was received. Thread 0 blinks LED0, thread 1 blinks LED1, and thread 2 blinks LED2. The three threads run independently, and three different messages are bounced back and forth between the two motes in an unsynchronized fashion. In contrast to the more complicated Bounce application found in the normal nesC threads version of this application, once a thread receives a message it will immediately flip on its LED instead of waiting on a Barrier and synchronizing the LEDs to come on only once messages have been received from all threads. In this way, messages are bounced back and forth between the two motes in an asynchronous fashion, and LEDS are toggled immediately upon message reception.. Successful running of this application results in each LED bouncing back and forth between each mote independent of one another. This will continue in an finite loop forever. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/capps/Makefile000066400000000000000000000030521207233610700216520ustar00rootroot00000000000000#-*-makefile-*- ###################################################################### # # Makes the entire suite of TinyOS applications for a given platform. # # Author: Martin Turon # Date: August 18, 2005 # ###################################################################### # $Id: Makefile,v 1.1 2008-06-12 15:11:39 klueska Exp $ # MAKECMDGOALS is the way to get the arguments passed into a Makefile ... TARGET=$(MAKECMDGOALS) NESDOC_TARGET=$(filter-out nesdoc,$(TARGET)) # Here is a way to get the list of subdirectories in a Makefile ... ROOT=. SUBDIRS := $(shell find * -type d) # Okay, match any target, and recurse the subdirectories %: @for i in $(SUBDIRS); do \ HERE=$$PWD; \ if [ -f $$i/Makefile ]; then \ echo Building ... $(PWD)/$$i; \ echo make $(TARGET); \ cd $$i; \ $(MAKE) $(TARGET); \ cd $$HERE; \ fi; \ done threads: @: cthreads: @: dynthreads: @: BASEDIR = $(shell pwd | sed 's@\(.*\)/apps.*$$@\1@' ) # The output directory for generated documentation DOCDIR = $(BASEDIR)/doc/nesdoc nesdoc: @echo This target rebuilds documentation for all known platforms. @echo It DOES NOT overwrite any existing documentation, thus, it @echo is best run after deleting all old documentation. @echo @echo To delete all old documentation, delete the contents of the @echo $(DOCDIR) directory. @echo @echo Press Enter to continue, or ^C to abort. @read for platform in `ncc -print-platforms`; do \ $(MAKE) $$platform docs.nohtml.preserve; \ nesdoc -o $(DOCDIR) -html -target=$$platform; \ done tinyos-2.1.2+dfsg/apps/tosthreads/capps/Null/000077500000000000000000000000001207233610700211245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/Null/Makefile000066400000000000000000000000541207233610700225630ustar00rootroot00000000000000TOSTHREAD_MAIN=Null.c include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/capps/Null/Null.c000066400000000000000000000041041207233610700222010ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Null is an empty skeleton application for testing the basic compilation and * runtime of a c-based tosthreads application. It is useful to test that the build * environment is functional in its most minimal sense, i.e., you can correctly * compile an application. It is also useful to test the minimum power consumption * of a node when it has absolutely no interrupts or resources active. * * @author Chieh-Jan Mike Liang */ #include "tosthread.h" void tosthread_main(void* arg) {} tinyos-2.1.2+dfsg/apps/tosthreads/capps/Null/README000066400000000000000000000012511207233610700220030ustar00rootroot00000000000000README for TOSTHREADS Null Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: Null is an empty skeleton application for testing the basic compilation and runtime of a c-based tosthreads application. It is useful to test that the build environment is functional in its most minimal sense, i.e., you can correctly compile an application. It is also useful to test the minimum power consumption of a node when it has absolutely no interrupts or resources active. Successful running of this application is that it simply compiles and installs. No LEDs should be flashed. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/capps/RadioStress/000077500000000000000000000000001207233610700224545ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/RadioStress/Makefile000066400000000000000000000000631207233610700241130ustar00rootroot00000000000000TOSTHREAD_MAIN=RadioStress.c include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/capps/RadioStress/README000066400000000000000000000030211207233610700233300ustar00rootroot00000000000000README for TOSThreads RadioStress Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: This application stresses the operation of the thread based AM commands for packet transmission and reception. To run this application you will need to burn it on one mote with NODE_ID 0, and a second mote with NODE_ID 1. You can install RadioStress on a mote via the following command: make cthreads install.0 make cthreads install.1 Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic The application burned with NODE_ID 0 will be programmed as a Receiver and will wait for messages from the sender programmed with NODE_ID 1. In the case of the sender, messages with three different AM ids are sent from three different threads in an infinite loop, and one of LED0, LED1, and LED2 are toggled upon successful transmission. In the case of the receiver, three different threads are used to wait for messages in an infinite loop from the three sending threads on the sender mote. Upon successful reception, one of LED0, LED1, or LED2 is toggled depending on the AM id received. Successful running of this application will result in all three leds flashing very rapidly on both motes, with the receiver mote flashing less rapidly if the sender mote is turned off (i.e. once every 5000ms because there is a timeout on how long it waits for messages to be received before retrying). Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/capps/RadioStress/RadioStress.c000066400000000000000000000072301207233610700250640ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application stresses the blocking send and receive commands for the c based * API of tosthreads. Three threads are run, each thread toggling a different * colored LED. If a node has TOS_NODE_ID == 0 it will try and receive in * an infinite loop, toggling one of the three Leds upon reception. If it has * TOS_NODE_ID == 1, it will try to send in an infinite loop, toggling one of the three * Leds upon the completion of a send. Thread 0 toggles the Led0, Thread 1 toggles * Led1, and Thread 2 toggles Led2. * * @author Kevin Klues */ //#include "stack.h" #include "tosthread.h" #include "tosthread_amradio.h" #include "tosthread_leds.h" //Initialize variables associated with each thread tosthread_t radioStress0; tosthread_t radioStress1; tosthread_t radioStress2; void radioStress0_thread(void* arg); void radioStress1_thread(void* arg); void radioStress2_thread(void* arg); //Initialize messages for sending out over the radio message_t msg0; message_t msg1; message_t msg2; void tosthread_main(void* arg) { while( amRadioStart() != SUCCESS ); tosthread_create(&radioStress0, radioStress0_thread, &msg0, 200); tosthread_create(&radioStress1, radioStress1_thread, &msg1, 200); tosthread_create(&radioStress2, radioStress2_thread, &msg2, 200); } void radioStress0_thread(void* arg) { message_t* m = (message_t*)arg; for(;;) { if(TOS_NODE_ID == 0) { amRadioReceive(m, 2000, 20); led0Toggle(); } else { if(amRadioSend(!TOS_NODE_ID, m, 0, 20) == SUCCESS) led0Toggle(); } } } void radioStress1_thread(void* arg) { message_t* m = (message_t*)arg; for(;;) { if(TOS_NODE_ID == 0) { amRadioReceive(m, 2000, 21); led1Toggle(); } else { if(amRadioSend(!TOS_NODE_ID, m, 0, 21) == SUCCESS) led1Toggle(); } } } void radioStress2_thread(void* arg) { message_t* m = (message_t*)arg; for(;;) { if(TOS_NODE_ID == 0) { amRadioReceive(m, 2000, 22); led2Toggle(); } else { if(amRadioSend(!TOS_NODE_ID, m, 0, 22) == SUCCESS) led2Toggle(); } } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/SenseAndSend/000077500000000000000000000000001207233610700225245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/SenseAndSend/Makefile000066400000000000000000000005221207233610700241630ustar00rootroot00000000000000TOSTHREAD_MAIN=SenseAndSend.c CFLAGS += -I$(TOSDIR)/lib/tosthreads/sensorboards/tmote_onboard ifneq ($(filter telosb tmote epic clean,$(MAKECMDGOALS)),) include $(MAKERULES) else %: @echo " Sorry, this application is only written to work with telos based motes equipped with onboard sensors.." cthreads: @: dynthreads: @: endif tinyos-2.1.2+dfsg/apps/tosthreads/capps/SenseAndSend/README000066400000000000000000000024101207233610700234010ustar00rootroot00000000000000README for TOSThreads SenseAndSend Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: SenseAndSend is a threaded implementation of an application that takes various sensor readings in parallel (by dedicating one thread to each reading), and assembling them into a packet to be sent out over the radio. It is written specifically for use with the tmote onboard sensor package, and will not compile for any other platforms. To run this application install it on a mote via the command: make cthreads install Valid platforms are currently: tmote, telosb with onboard sensors Readings are taken from each of the 4 oboard sensors and sent out over the radio interface in an infinite loop. Upon successful transmission, LED0 is toggled, and the process starts over again. A successful test will result in LED0 toggling periodically at a rate of approximately 220ms (the time it takes to take a humidity + temperature sensor reading since they share the same hardware and cannot be taken in parallel). Additionally, a base station application should be run to verify the reception of packets sent from a SenseAndSend mote, with reasonable looking sensor data. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/capps/SenseAndSend/SenseAndSend.c000066400000000000000000000123431207233610700252050ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SenseAndSend is a threaded implementation of an application that takes various * sensor readings in parallel (by dedicating one thread to each reading), and * assembling them into a packet to be sent out over the radio. It is written * specifically for use with the tmote onboard sensor package, and will not compile * for any other platforms. * * Readings are taken from each of the 4 oboard sensors and sent out over the radio * interface in an infinite loop. Upon successful transmission, LED0 is toggled, * and the process starts over again. * * A successful test will result in LED0 toggling periodically at a rate of * approximately 220ms (the time it takes to take a humidity + temperature sensor * reading since they share the same hardware and cannot be taken in parallel). * * Additionally, a base station application should be run to verify the reception * of packets sent from a SenseAndSend mote, with reasonable looking sensor data. * * @author Kevin Klues */ #include "tosthread.h" #include "tosthread_amradio.h" #include "tosthread_leds.h" #include "tosthread_threadsync.h" #include "tosthread_hamamatsuS1087.h" #include "tosthread_hamamatsuS10871.h" #include "tosthread_sensirionSht11.h" #define NUM_SENSORS 4 #define SAMPLING_PERIOD 3000 #define AM_SENSOR_DATA_MSG 0x25 //Data structure for storing sensor data typedef struct sensor_data { nx_uint32_t seq_no; nx_uint16_t hum; nx_uint16_t temp; nx_uint16_t tsr; nx_uint16_t par; } sensor_data_t; //Initialize variables associated with each thread tosthread_t humidity; tosthread_t temperature; tosthread_t total_solar; tosthread_t photo_active; tosthread_t send_handler; message_t send_msg; sensor_data_t* sensor_data; //pointer into message structure mutex_t data_mutex; barrier_t send_barrier; barrier_t sense_barrier; void humidity_thread(void* arg); void temperature_thread(void* arg); void total_solar_thread(void* arg); void photo_active_thread(void* arg); void send_thread(void* arg); void tosthread_main(void* arg) { mutex_init(&data_mutex); barrier_reset(&send_barrier, NUM_SENSORS+1); barrier_reset(&sense_barrier, NUM_SENSORS+1); sensor_data = radioGetPayload(&send_msg, sizeof(sensor_data_t)); sensor_data->seq_no = 0; amRadioStart(); tosthread_create(&humidity, humidity_thread, NULL, 200); tosthread_create(&temperature, temperature_thread, NULL, 200); tosthread_create(&total_solar, total_solar_thread, NULL, 200); tosthread_create(&photo_active, photo_active_thread, NULL, 200); tosthread_create(&send_handler, send_thread, NULL, 200); } void read_sensor(error_t (*read)(uint16_t*), nx_uint16_t* nx_val) { uint16_t val; for(;;) { (*read)(&val); mutex_lock(&data_mutex); *nx_val = val; mutex_unlock(&data_mutex); barrier_block(&send_barrier); barrier_block(&sense_barrier); } } void humidity_thread(void* arg) { read_sensor(sensirionSht11_humidity_read, &(sensor_data->hum)); } void temperature_thread(void* arg) { read_sensor(sensirionSht11_temperature_read, &(sensor_data->temp)); } void total_solar_thread(void* arg) { read_sensor(hamamatsuS10871_tsr_read, &(sensor_data->tsr)); } void photo_active_thread(void* arg) { read_sensor(hamamatsuS1087_par_read, &(sensor_data->par)); } void send_thread(void* arg) { for(;;) { barrier_block(&send_barrier); barrier_reset(&send_barrier, NUM_SENSORS + 1); if(amRadioSend(AM_BROADCAST_ADDR, &send_msg, sizeof(sensor_data_t), AM_SENSOR_DATA_MSG) == SUCCESS) { sensor_data->seq_no++; led0Toggle(); } //tosthread_sleep(SAMPLING_PERIOD); barrier_block(&sense_barrier); barrier_reset(&sense_barrier, NUM_SENSORS + 1); } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/SenseStoreAndForward/000077500000000000000000000000001207233610700242545ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/SenseStoreAndForward/Makefile000066400000000000000000000005241207233610700257150ustar00rootroot00000000000000TOSTHREAD_MAIN=SenseStoreAndForward.c CFLAGS += -I$(TOSDIR)/lib/tosthreads/sensorboards/tmote_onboard ifneq ($(filter telosb tmote clean,$(MAKECMDGOALS)),) include $(MAKERULES) else %: @echo " Sorry, this application is only written to work with telos based motes equipped with onboard sensors.." cthreads: @: dynthreads: @: endif tinyos-2.1.2+dfsg/apps/tosthreads/capps/SenseStoreAndForward/README000066400000000000000000000040701207233610700251350ustar00rootroot00000000000000README for TOSThreads SenseStoreAndForward Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: SenseStoreAndForward is a threaded implementation of an application that takes various sensor readings in parallel (by dedicating one thread to each reading), logs them to flash, and then sends them out over the radio at some later time. In the current implementation, sensor readings are taken as quickly as possible, and records containing a set of readings from each iteration are batched out over the radio every 10000ms. This application is written specifically for use with the tmote onboard sensor package, and will not compile for any other platforms. To run this application install it on a mote via the command: make cthreads install Valid platforms are currently: tmote, telosb with onboard sensors Readings are taken from three oboard sensors and logged to flash as one record in an infinite loop. Records are then read out of flash and and sent out over the radio interface in separate infinite loop. Before the application starts running, the entire contents of the flash drive are erased. A successful test will result in LED0 remaining solid for approximately 6s while the flash is being erased. After that LED0 will toggle with each successful set of sensor readings logged to flash, at a rate of approximately 220ms (the time it takes to take a humidity + temperature sensor reading since they share the same hardware and cannot be taken in parallel). Also, LED1 will begin toggling in rapid succession once every 10000ms as records are successfully read from flash and sent out over the radio. Once all of the records currently recorded to flash since the last batch of sends have been sent out, LED2 Toggles to indicate completion. This process continues in an infinite loop forever. Additionally, a base station application should be run to verify the reception of packets sent from a SenseStoreAndForward mote, with reasonable looking sensor data. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/capps/SenseStoreAndForward/SenseStoreAndForward.c000066400000000000000000000163141207233610700304670ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SenseStoreAndForward is a threaded implementation of an application that takes * various sensor readings in parallel (by dedicating one thread to each reading), * logs them to flash, and then sends them out over the radio at some later time. * In the current implementation, sensor readings are taken as quickly as possible, * and records containing a set of readings from each iteration are batched out * over the radio every 10000ms. This application is written specifically for use * with the tmote onboard sensor package, and will not compile for any other * platforms. * * Readings are taken from each of the 4 oboard sensors and logged to flash as one * record in an infinite loop. Records are then read out of flash and and sent out * over the radio interface in separate infinite loop. Before the application * starts running, the entire contents of the flash drive are erased. * * A successful test will result in LED0 remaining solid for approximately 6s while * the flash is being erased. After that LED0 will toggle with each successful set * of sensor readings logged to flash, at a rate of approximately 220ms (the time * it takes to take a humidity + temperature sensor reading since they share the * same hardware and cannot be taken in parallel). Also, LED1 will begin toggling * in rapid succession once every 10000ms as records are successfully read from * flash and sent out over the radio. Once all of the records currently recorded * to flash since the last batch of sends have been sent out, LED2 Toggles to * indicate completion. This process continues in an infinite loop forever. * * Additionally, a base station application should be run to verify the reception * of packets sent from a SenseStoreAndForward mote, with reasonable looking sensor * data. * * @author Kevin Klues */ #include "tosthread.h" #include "tosthread_amradio.h" #include "tosthread_leds.h" #include "tosthread_threadsync.h" #include "tosthread_logstorage.h" #include "tmote_onboard_sensors.h" #include "StorageVolumes.h" #define NUM_SENSORS 3 #define SAMPLING_PERIOD 3000 #define SENDING_PERIOD 10000 #define AM_SENSOR_DATA_MSG 0x25 //Data structure for storing sensor data typedef struct sensor_data { nx_uint32_t seq_no; nx_uint16_t hum; nx_uint16_t temp; nx_uint16_t tsr; // nx_uint16_t par; } sensor_data_t; //Initialize variables associated with each thread tosthread_t humidity; tosthread_t temperature; tosthread_t total_solar; //tosthread_t photo_active; tosthread_t store_handler; tosthread_t send_handler; message_t send_msg; sensor_data_t storing_sensor_data; sensor_data_t* sending_sensor_data; //pointer into message structure mutex_t data_mutex; mutex_t log_mutex; barrier_t send_barrier; barrier_t sense_barrier; void humidity_thread(void* arg); void temperature_thread(void* arg); void total_solar_thread(void* arg); //void photo_active_thread(void* arg); void store_thread(void* arg); void send_thread(void* arg); void tosthread_main(void* arg) { mutex_init(&data_mutex); mutex_init(&log_mutex); barrier_reset(&send_barrier, NUM_SENSORS+1); barrier_reset(&sense_barrier, NUM_SENSORS+1); sending_sensor_data = radioGetPayload(&send_msg, sizeof(sensor_data_t)); storing_sensor_data.seq_no = 0; amRadioStart(); led0Toggle(); volumeLogErase(VOLUME_SENSORLOG); volumeLogSeek(VOLUME_SENSORLOG, SEEK_BEGINNING); tosthread_create(&humidity, humidity_thread, NULL, 200); tosthread_create(&temperature, temperature_thread, NULL, 200); tosthread_create(&total_solar, total_solar_thread, NULL, 200); // tosthread_create(&photo_active, photo_active_thread, NULL, 200); tosthread_create(&store_handler, store_thread, NULL, 200); tosthread_create(&send_handler, send_thread, NULL, 200); } void read_sensor(error_t (*read)(uint16_t*), nx_uint16_t* nx_val) { uint16_t val; for(;;) { (*read)(&val); mutex_lock(&data_mutex); *nx_val = val; mutex_unlock(&data_mutex); barrier_block(&send_barrier); barrier_block(&sense_barrier); } } void humidity_thread(void* arg) { read_sensor(sensirionSht11_humidity_read, &(storing_sensor_data.hum)); } void temperature_thread(void* arg) { read_sensor(sensirionSht11_temperature_read, &(storing_sensor_data.temp)); } void total_solar_thread(void* arg) { read_sensor(hamamatsuS10871_tsr_read, &(storing_sensor_data.tsr)); } //void photo_active_thread(void* arg) { // read_sensor(hamamatsuS1087_par_read, &(storing_sensor_data.par)); //} void store_thread(void* arg) { storage_len_t sensor_data_len; bool sensor_records_lost; for(;;) { barrier_block(&send_barrier); barrier_reset(&send_barrier, NUM_SENSORS + 1); mutex_lock(&log_mutex); sensor_data_len = sizeof(sensor_data_t); while( volumeLogAppend(VOLUME_SENSORLOG, &storing_sensor_data, &sensor_data_len, &sensor_records_lost) != SUCCESS ); mutex_unlock(&log_mutex); storing_sensor_data.seq_no++; led0Toggle(); //tosthread_sleep(SAMPLING_PERIOD); barrier_block(&sense_barrier); barrier_reset(&sense_barrier, NUM_SENSORS + 1); } } void send_thread(void* arg) { storage_len_t sensor_data_len; for(;;) { tosthread_sleep(SENDING_PERIOD); while( volumeLogCurrentReadOffset(VOLUME_SENSORLOG) != volumeLogCurrentWriteOffset(VOLUME_SENSORLOG) ) { sensor_data_len = sizeof(sensor_data_t); mutex_lock(&log_mutex); while( volumeLogRead(VOLUME_SENSORLOG, sending_sensor_data, &sensor_data_len) != SUCCESS ); mutex_unlock(&log_mutex); while( amRadioSend(AM_BROADCAST_ADDR, &send_msg, sizeof(sensor_data_t), AM_SENSOR_DATA_MSG) != SUCCESS ); led1Toggle(); } led2Toggle(); } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/SenseStoreAndForward/volumes-at45db.xml000066400000000000000000000001451207233610700275510ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tosthreads/capps/SenseStoreAndForward/volumes-stm25p.xml000066400000000000000000000001461207233610700276210ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/000077500000000000000000000000001207233610700231455ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/Makefile000066400000000000000000000010541207233610700246050ustar00rootroot00000000000000TOSTHREAD_MAIN=TestCollection.c CFLAGS += -I$(TOSDIR)/lib/tosthreads/sensorboards/universal CFLAGS += -I$(TOSDIR)/lib/tosthreads/lib/net/ CFLAGS += -I$(TOSDIR)/lib/net/ CFLAGS += -I$(TOSDIR)/lib/tosthreads/lib/net/ctp CFLAGS += -I$(TOSDIR)/lib/net/ctp -I$(TOSDIR)/lib/net/4bitle ifneq ($(filter telosb tmote tinynode shimmer shimmer2 shimmer2r span iris epic clean,$(MAKECMDGOALS)),) include $(MAKERULES) else %: @echo " Sorry, this application only works on platforms with >8kB of RAM (telos, iris, etc.)" cthreads: @: dynthreads: @: endif tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/MultihopOscilloscope.h000066400000000000000000000017721207233610700275050ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * @author David Gay * @author Kyle Jamieson */ #ifndef MULTIHOP_OSCILLOSCOPE_H #define MULTIHOP_OSCILLOSCOPE_H enum { /* Number of readings per message. If you increase this, you may have to increase the message_t size. */ NREADINGS = 5, /* Default sampling period. */ DEFAULT_INTERVAL = 1024, AM_OSCILLOSCOPE = 0x93 }; typedef nx_struct oscilloscope { nx_uint16_t version; /* Version of the interval. */ nx_uint16_t interval; /* Samping period. */ nx_uint16_t id; /* Mote id of sending mote. */ nx_uint16_t count; /* The readings are samples count * NREADINGS onwards */ nx_uint16_t readings[NREADINGS]; } oscilloscope_t; #endif tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/README000066400000000000000000000054661207233610700240400ustar00rootroot00000000000000README for TOSThreads TestCollection Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: TestCollection is a reimplementation of the Multihop Oscilloscope application using TOSThreads. It periodically samples a universal software-based SineSensor and broadcasts a message every few readings. These readings can be displayed by the Java "Oscilloscope" application found in the the TestCollection/java subdirectory. The sampling rate starts at 4Hz, but can be changed from the Java application. You can install TestCollection on a mote via the following command: make cthreads install Valid platforms are currently: tmote, telosb, shimmer*, span, mica2, micaz, iris, and epic At least two motes must be used by this application, with one of them installed as a base station. Base station motes can be created by installing them with NODE_ID % 500 == 0. i.e. make cthreads install.0 make cthreads install.500 make cthreads install.1000 All other nodes can be installed with arbitrary NODE_IDs. make cthreads install.123 Successful running of this application is verified by all NON-base station motes periodically flashing LED0 upon sending a message, and the base station mote, flashing LED2 upon successful reception of a message. Additionally, correct operation should be verified by running the java tool described in the following section. Tools: The Java application displays readings it receives from motes via a serial forwarder. To run it, change to the java subdirectory and type: make java net.tinyos.sf.SerialForwarder -comm serial@: # e.g., java net.tinyos.sf.SerialForwarder -comm serial@/dev/ttyUSB0:mica2 # or java net.tinyos.sf.SerialForwarder -comm serial@COM2:57600 ./run NOTE:: The baud rate 57600 must be used telos based motes, as its configuration has been changed to work with this baud rate when compiled for tosthreads. I.e. DO NOT just substitute 'telosb' or 'tmote' for above. Explicitly set it to 57600. The controls at the bottom of the screen allow you to zoom in or out the X axis, change the range of the Y axis, and clear all received data. You can change the color used to display a mote by clicking on its color in the mote table. Notes: By default, the Makefile for TestCollection is setup to run CTP as the underlying collection protocol. The makefile can be modified to work with MultihopLQI by changing the appropriate include directories. The baud rate 57600 must be used telos based motes, as its configuration has been changed to work with this baud rate when compiled for tosthreads. I.e. DO NOT just substitute 'telosb' or 'tmote' for above. Explicitly set it to 57600. Known bugs/limitations: None tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/TestCollection.c000066400000000000000000000124461207233610700262530ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * TestCollection is a reimplementation of the Multihop Oscilloscope application * using TOSThreads. It periodically samples a universal software-based SineSensor * and broadcasts a message every few readings. These readings can be displayed by * the Java "Oscilloscope" application found in the the TestCollection/java * subdirectory. The sampling rate starts at 4Hz, but can be changed from the Java * application. * * At least two motes must be used by this application, with one of them installed * as a base station. Base station motes can be created by installing them with * NODE_ID % 500 == 0. * i.e. make cthreads install.0 * make cthreads install.500 * make cthreads install.1000 * * All other nodes can be installed with arbitrary NODE_IDs. * make cthreads install.123 * * Successful running of this application is verified by all NON-base station motes * periodically flashing LED1 upon sending a message, and the base station mote, * flashing LED2 upon successful reception of a message. Additionally, correct * operation should be verified by running the java tool described in the following * section. * * @author Kevin Klues * @author Chieh-Jan Mike Liang */ #include "tosthread.h" #include "tosthread_amradio.h" #include "tosthread_amserial.h" #include "tosthread_leds.h" #include "tosthread_collection.h" #include "tosthread_sinesensor.h" #include "MultihopOscilloscope.h" void fatal_problem(); void report_problem(); void report_sent(); void report_received(); oscilloscope_t local; uint8_t reading = 0; /* 0 to NREADINGS */ message_t sendbuf; message_t recvbuf; enum { MY_COLLECTION_ID = NEW_COLLECTION_CLIENT_ID(), // Gets a collection sender instance }; void tosthread_main(void* arg) { local.interval = DEFAULT_INTERVAL; local.id = TOS_NODE_ID; local.version = 0; while ( amRadioStart() != SUCCESS ); while ( collectionRoutingStart() != SUCCESS ); collectionSetCollectionId(MY_COLLECTION_ID, AM_OSCILLOSCOPE); // Associates the collection sender // with AM_OSCILLOSCOPE collection ID if (local.id % 500 == 0) { while ( amSerialStart() != SUCCESS ); collectionSetRoot(); for (;;) { // Waits for incoming packets with AM_OSCILLOSCOPE collection ID if (collectionReceive(&recvbuf, 0, AM_OSCILLOSCOPE) == SUCCESS) { oscilloscope_t *recv_o = (oscilloscope_t *) collectionGetPayload(&recvbuf, sizeof(oscilloscope_t)); oscilloscope_t *send_o = (oscilloscope_t *) serialGetPayload(&sendbuf, sizeof(oscilloscope_t)); memcpy(send_o, recv_o, sizeof(oscilloscope_t)); amSerialSend(AM_BROADCAST_ADDR, &sendbuf, sizeof(local), AM_OSCILLOSCOPE); report_received(); } } } else { uint16_t var; for (;;) { if (reading == NREADINGS) { oscilloscope_t *o = (oscilloscope_t *) collectionGetPayload(&sendbuf, sizeof(oscilloscope_t)); if (o == NULL) { fatal_problem(); return; } memcpy(o, &local, sizeof(local)); if (collectionSend(&sendbuf, sizeof(local), MY_COLLECTION_ID) == SUCCESS) { local.count++; report_sent(); } else { report_problem(); } reading = 0; } if (sinesensor_read(&var) == SUCCESS) { local.readings[reading++] = var; } tosthread_sleep(local.interval); } } } // Use LEDs to report various status issues. void fatal_problem() { led0On(); led1On(); led2On(); } void report_problem() { led0Toggle(); } void report_sent() { led1Toggle(); } void report_received() { led2Toggle(); } tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/java/000077500000000000000000000000001207233610700240665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/java/ColorCellEditor.java000066400000000000000000000032621207233610700277610ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; /* Editor for table cells representing colors. Popup a color chooser. */ public class ColorCellEditor extends AbstractCellEditor implements TableCellEditor { private Color color; private JButton button; public ColorCellEditor(String title) { button = new JButton(); final JColorChooser chooser = new JColorChooser(); final JDialog dialog = JColorChooser.createDialog (button, title, true, chooser, new ActionListener() { public void actionPerformed(ActionEvent e) { color = chooser.getColor(); } }, null); button.setBorderPainted(false); button.addActionListener (new ActionListener () { public void actionPerformed(ActionEvent e) { button.setBackground(color); chooser.setColor(color); dialog.setVisible(true); fireEditingStopped(); } } ); } public Object getCellEditorValue() { return color; } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { color = (Color)value; return button; } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/java/Data.java000066400000000000000000000040451207233610700256050ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import java.util.*; /* Hold all data received from motes */ class Data { /* The mote data is stored in a flat array indexed by a mote's identifier. A null value indicates no mote with that identifier. */ private Node[] nodes = new Node[256]; private Oscilloscope parent; Data(Oscilloscope parent) { this.parent = parent; } /* Data received from mote nodeId containing NREADINGS samples from messageId * NREADINGS onwards. Tell parent if this is a new node. */ void update(int nodeId, int messageId, int readings[]) { if (nodeId >= nodes.length) { int newLength = nodes.length * 2; if (nodeId >= newLength) newLength = nodeId + 1; Node newNodes[] = new Node[newLength]; System.arraycopy(nodes, 0, newNodes, 0, nodes.length); nodes = newNodes; } Node node = nodes[nodeId]; if (node == null) { nodes[nodeId] = node = new Node(nodeId); parent.newNode(nodeId); } node.update(messageId, readings); } /* Return value of sample x for mote nodeId, or -1 for missing data */ int getData(int nodeId, int x) { if (nodeId >= nodes.length || nodes[nodeId] == null) return -1; return nodes[nodeId].getData(x); } /* Return number of last known sample on mote nodeId. Returns 0 for unknown motes. */ int maxX(int nodeId) { if (nodeId >= nodes.length || nodes[nodeId] == null) return 0; return nodes[nodeId].maxX(); } /* Return number of largest known sample on all motes (0 if there are no motes) */ int maxX() { int max = 0; for (int i = 0; i < nodes.length; i++) if (nodes[i] != null) { int nmax = nodes[i].maxX(); if (nmax > max) max = nmax; } return max; } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/java/Graph.java000066400000000000000000000147621207233610700260040ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.font.*; import java.awt.geom.*; import java.util.*; /* Panel for drawing mote-data graphs */ class Graph extends JPanel { final static int BORDER_LEFT = 40; final static int BORDER_RIGHT = 0; final static int BORDER_TOP = 10; final static int BORDER_BOTTOM = 10; final static int TICK_SPACING = 40; final static int MAX_TICKS = 16; final static int TICK_WIDTH = 10; final static int MIN_WIDTH = 50; int gx0, gx1, gy0, gy1; // graph bounds int scale = 2; // gx1 - gx0 == MIN_WIDTH << scale Window parent; /* Graph to screen coordinate conversion support */ int height, width; double xscale, yscale; void updateConversion() { height = getHeight() - BORDER_TOP - BORDER_BOTTOM; width = getWidth() - BORDER_LEFT - BORDER_RIGHT; if (height < 1) height = 1; if (width < 1) width = 1; xscale = (double)width / (gx1 - gx0 + 1); yscale = (double)height / (gy1 - gy0 + 1); } Graphics makeClip(Graphics g) { return g.create(BORDER_LEFT, BORDER_TOP, width, height); } // Note that these do not include the border offset! int screenX(int gx) { return (int)(xscale * (gx - gx0) + 0.5); } int screenY(int gy) { return (int)(height - yscale * (gy - gy0)); } int graphX(int sx) { return (int)(sx / xscale + gx0 + 0.5); } Graph(Window parent) { this.parent = parent; gy0 = 0; gy1 = 0xffff; gx0 = 0; gx1 = MIN_WIDTH << scale; } void rightDrawString(Graphics2D g, String s, int x, int y) { TextLayout layout = new TextLayout(s, parent.smallFont, g.getFontRenderContext()); Rectangle2D bounds = layout.getBounds(); layout.draw(g, x - (float)bounds.getWidth(), y + (float)bounds.getHeight() / 2); } protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; /* Repaint. Synchronize on Oscilloscope to avoid data changing. Simply clear panel, draw Y axis and all the mote graphs. */ synchronized (parent.parent) { updateConversion(); g2d.setColor(Color.BLACK); g2d.fillRect(0, 0, getWidth(), getHeight()); drawYAxis(g2d); Graphics clipped = makeClip(g2d); int count = parent.moteListModel.size(); for (int i = 0; i < count; i++) { clipped.setColor(parent.moteListModel.getColor(i)); drawGraph(clipped, parent.moteListModel.get(i)); } } } /* Draw the Y-axis */ protected void drawYAxis(Graphics2D g) { int axis_x = BORDER_LEFT - 1; int height = getHeight() - BORDER_BOTTOM - BORDER_TOP; g.setColor(Color.WHITE); g.drawLine(axis_x, BORDER_TOP, axis_x, BORDER_TOP + height - 1); /* Draw a reasonable set of tick marks */ int nTicks = height / TICK_SPACING; if (nTicks > MAX_TICKS) nTicks = MAX_TICKS; int tickInterval = (gy1 - gy0 + 1) / nTicks; if (tickInterval == 0) tickInterval = 1; /* Tick interval should be of the family A * 10^B, where A = 1, 2 * or 5. We tend more to rounding A up, to reduce rather than increase the number of ticks. */ int B = (int)(Math.log(tickInterval) / Math.log(10)); int A = (int)(tickInterval / Math.pow(10, B) + 0.5); if (A > 2) A = 5; else if (A > 5) A = 10; tickInterval = A * (int)Math.pow(10, B); /* Ticks are printed at multiples of tickInterval */ int tick = ((gy0 + tickInterval - 1) / tickInterval) * tickInterval; while (tick <= gy1) { int stick = screenY(tick) + BORDER_TOP; rightDrawString(g, "" + tick, axis_x - TICK_WIDTH / 2 - 2, stick); g.drawLine(axis_x - TICK_WIDTH / 2, stick, axis_x - TICK_WIDTH / 2 + TICK_WIDTH, stick); tick += tickInterval; } } /* Draw graph for mote nodeId */ protected void drawGraph(Graphics g, int nodeId) { SingleGraph sg = new SingleGraph(g, nodeId); if (gx1 - gx0 >= width) // More points than pixels-iterate by pixel for (int sx = 0; sx < width; sx++) sg.nextPoint(g, graphX(sx), sx); else // Less points than pixel-iterate by points for (int gx = gx0; gx <= gx1; gx++) sg.nextPoint(g, gx, screenX(gx)); } /* Inner class to simplify drawing a graph. Simplify initialise it, then feed it the X screen and graph coordinates, from left to right. */ private class SingleGraph { int lastsx, lastsy, nodeId; /* Start drawing the graph mote id */ SingleGraph(Graphics g, int id) { nodeId = id; lastsx = -1; lastsy = -1; } /* Next point in mote's graph is at x value gx, screen coordinate sx */ void nextPoint(Graphics g, int gx, int sx) { int gy = parent.parent.data.getData(nodeId, gx); int sy = -1; if (gy >= 0) { // Ignore missing values double rsy = height - yscale * (gy - gy0); // Ignore problem values if (rsy >= -1e6 && rsy <= 1e6) sy = (int)(rsy + 0.5); if (lastsy >= 0 && sy >= 0) g.drawLine(lastsx, lastsy, sx, sy); } lastsx = sx; lastsy = sy; } } /* Update X-axis range in GUI */ void updateXLabel() { parent.xLabel.setText("X: " + gx0 + " - " + gx1); } /* Ensure that graph is nicely positioned on screen. max is the largest sample number received from any mote. */ private void recenter(int max) { // New data will show up at the 3/4 point // The 2nd term ensures that gx1 will be >= max int scrollby = ((gx1 - gx0) >> 2) + (max - gx1); gx0 += scrollby; gx1 += scrollby; if (gx0 < 0) { // don't bother showing negative sample numbers gx1 -= gx0; gx0 = 0; } updateXLabel(); } /* New data received. Redraw graph, scrolling if necessary */ void newData() { int max = parent.parent.data.maxX(); if (max > gx1 || max < gx0) // time to scroll recenter(max); repaint(); } /* User set the X-axis scale to newScale */ void setScale(int newScale) { gx1 = gx0 + (MIN_WIDTH << newScale); scale = newScale; recenter(parent.parent.data.maxX()); repaint(); } /* User attempted to set Y-axis range to newy0..newy1. Refuse bogus values (return false), or accept, redraw and return true. */ boolean setYAxis(int newy0, int newy1) { if (newy0 >= newy1 || newy0 < 0 || newy0 > 65535 || newy1 < 0 || newy1 > 65535) return false; gy0 = newy0; gy1 = newy1; repaint(); return true; } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/java/Makefile000066400000000000000000000010461207233610700255270ustar00rootroot00000000000000GEN=OscilloscopeMsg.java Constants.java all: oscilloscope.jar oscilloscope.jar: Oscilloscope.class jar cf $@ *.class OscilloscopeMsg.java: ../MultihopOscilloscope.h mig -target=null -java-classname=OscilloscopeMsg java ../MultihopOscilloscope.h oscilloscope -o $@ Constants.java: ../MultihopOscilloscope.h ncg -target=null -java-classname=Constants java ../MultihopOscilloscope.h NREADINGS DEFAULT_INTERVAL -o $@ Oscilloscope.class: $(wildcard *.java) $(GEN) javac *.java clean: rm -f *.class $(GEN) veryclean: clean rm oscilloscope.jar tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/java/Node.java000066400000000000000000000063161207233610700256240ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Class holding all data received from a mote. */ class Node { /* Data is hold in an array whose size is a multiple of INCREMENT, and INCREMENT itself must be a multiple of Constant.NREADINGS. This simplifies handling the extension and clipping of old data (see setEnd) */ final static int INCREMENT = 100 * Constants.NREADINGS; final static int MAX_SIZE = 100 * INCREMENT; // Must be multiple of INCREMENT /* The mote's identifier */ int id; /* Data received from the mote. data[0] is the dataStart'th sample Indexes 0 through dataEnd - dataStart - 1 hold data. Samples are 16-bit unsigned numbers, -1 indicates missing data. */ int[] data; int dataStart, dataEnd; Node(int _id) { id = _id; } /* Update data to hold received samples newDataIndex .. newEnd. If we receive data with a lower index, we discard newer data (we assume the mote rebooted). */ private void setEnd(int newDataIndex, int newEnd) { if (newDataIndex < dataStart || data == null) { /* New data is before the start of what we have. Just throw it all away and start again */ dataStart = newDataIndex; data = new int[INCREMENT]; } if (newEnd > dataStart + data.length) { /* Try extending first */ if (data.length < MAX_SIZE) { int newLength = (newEnd - dataStart + INCREMENT - 1) / INCREMENT * INCREMENT; if (newLength >= MAX_SIZE) newLength = MAX_SIZE; int[] newData = new int[newLength]; System.arraycopy(data, 0, newData, 0, data.length); data = newData; } if (newEnd > dataStart + data.length) { /* Still doesn't fit. Squish. We assume INCREMENT >= (newEnd - newDataIndex), and ensure that dataStart + data.length - INCREMENT = newDataIndex */ int newStart = newDataIndex + INCREMENT - data.length; if (dataStart + data.length > newStart) System.arraycopy(data, newStart - dataStart, data, 0, data.length - (newStart - dataStart)); dataStart = newStart; } } /* Mark any missing data as invalid */ for (int i = dataEnd < dataStart ? dataStart : dataEnd; i < newDataIndex; i++) data[i - dataStart] = -1; /* If we receive a count less than the old count, we assume the old data is invalid */ dataEnd = newEnd; } /* Data received containing NREADINGS samples from messageId * NREADINGS onwards */ void update(int messageId, int readings[]) { int start = messageId * Constants.NREADINGS; setEnd(start, start + Constants.NREADINGS); for (int i = 0; i < readings.length; i++) data[start - dataStart + i] = readings[i]; } /* Return value of sample x, or -1 for missing data */ int getData(int x) { if (x < dataStart || x >= dataEnd) return -1; else return data[x - dataStart]; } /* Return number of last known sample */ int maxX() { return dataEnd - 1; } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/java/Oscilloscope.java000066400000000000000000000076771207233610700274100ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import net.tinyos.message.*; import net.tinyos.util.*; import java.io.*; /* The "Oscilloscope" demo app. Displays graphs showing data received from the Oscilloscope mote application, and allows the user to: - zoom in or out on the X axis - set the scale on the Y axis - change the sampling period - change the color of each mote's graph - clear all data This application is in three parts: - the Node and Data objects store data received from the motes and support simple queries - the Window and Graph and miscellaneous support objects implement the GUI and graph drawing - the Oscilloscope object talks to the motes and coordinates the other objects Synchronization is handled through the Oscilloscope object. Any operation that reads or writes the mote data must be synchronized on Oscilloscope. Note that the messageReceived method below is synchronized, so no further synchronization is needed when updating state based on received messages. */ public class Oscilloscope implements MessageListener { MoteIF mote; Data data; Window window; /* The current sampling period. If we receive a message from a mote with a newer version, we update our interval. If we receive a message with an older version, we broadcast a message with the current interval and version. If the user changes the interval, we increment the version and broadcast the new interval and version. */ int interval = Constants.DEFAULT_INTERVAL; int version = -1; /* Main entry point */ void run() { data = new Data(this); window = new Window(this); window.setup(); mote = new MoteIF(PrintStreamMessenger.err); mote.registerListener(new OscilloscopeMsg(), this); } /* The data object has informed us that nodeId is a previously unknown mote. Update the GUI. */ void newNode(int nodeId) { window.newNode(nodeId); } synchronized public void messageReceived(int dest_addr, Message msg) { if (msg instanceof OscilloscopeMsg) { OscilloscopeMsg omsg = (OscilloscopeMsg)msg; /* Update interval and mote data */ periodUpdate(omsg.get_version(), omsg.get_interval()); data.update(omsg.get_id(), omsg.get_count(), omsg.get_readings()); /* Inform the GUI that new data showed up */ window.newData(); } } /* A potentially new version and interval has been received from the mote */ void periodUpdate(int moteVersion, int moteInterval) { if (moteVersion > version) { /* It's new. Update our vision of the interval. */ version = moteVersion; interval = moteInterval; window.updateSamplePeriod(); } else if (moteVersion < version) { /* It's old. Update the mote's vision of the interval. */ sendInterval(); } } /* The user wants to set the interval to newPeriod. Refuse bogus values and return false, or accept the change, broadcast it, and return true */ synchronized boolean setInterval(int newPeriod) { if (newPeriod < 1 || newPeriod > 65535) return false; interval = newPeriod; version++; sendInterval(); return true; } /* Broadcast a version+interval message. */ void sendInterval() { OscilloscopeMsg omsg = new OscilloscopeMsg(); omsg.set_version(version); omsg.set_interval(interval); try { mote.send(MoteIF.TOS_BCAST_ADDR, omsg); } catch (IOException e) { window.error("Cannot send message to mote"); } } /* User wants to clear all data. */ void clear() { data = new Data(this); } public static void main(String[] args) { Oscilloscope me = new Oscilloscope(); me.run(); } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/java/Window.java000066400000000000000000000207401207233610700262030ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import javax.swing.*; import javax.swing.table.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; import java.util.*; /* The main GUI object. Build the GUI and coordinate all user activities */ class Window { Oscilloscope parent; Graph graph; Font smallFont = new Font("Dialog", Font.PLAIN, 8); Font boldFont = new Font("Dialog", Font.BOLD, 12); Font normalFont = new Font("Dialog", Font.PLAIN, 12); MoteTableModel moteListModel; // GUI view of mote list JLabel xLabel; // Label displaying X axis range JTextField sampleText, yText; // inputs for sample period and Y axis range JFrame frame; Window(Oscilloscope parent) { this.parent = parent; } /* A model for the mote table, and general utility operations on the mote list */ class MoteTableModel extends AbstractTableModel { private ArrayList motes = new ArrayList(); private ArrayList colors = new ArrayList(); /* Initial mote colors cycle through this list. Add more colors if you want. */ private Color[] cycle = { Color.RED, Color.WHITE, Color.GREEN, Color.MAGENTA, Color.YELLOW, Color.GRAY, Color.YELLOW }; int cycleIndex; /* TableModel methods for achieving our table appearance */ public String getColumnName(int col) { if (col == 0) return "Mote"; else return "Color"; } public int getColumnCount() { return 2; } public synchronized int getRowCount() { return motes.size(); } public synchronized Object getValueAt(int row, int col) { if (col == 0) return motes.get(row); else return colors.get(row); } public Class getColumnClass(int col) { return getValueAt(0, col).getClass(); } public boolean isCellEditable(int row, int col) { return col == 1; } public synchronized void setValueAt(Object value, int row, int col) { colors.set(row, value); fireTableCellUpdated(row, col); graph.repaint(); } /* Return mote id of i'th mote */ int get(int i) { return ((Integer)motes.get(i)).intValue(); } /* Return color of i'th mote */ Color getColor(int i) { return (Color)colors.get(i); } /* Return number of motes */ int size() { return motes.size(); } /* Add a new mote */ synchronized void newNode(int nodeId) { /* Shock, horror. No binary search. */ int i, len = motes.size(); for (i = 0; ; i++) if (i == len || nodeId < get(i)) { motes.add(i, new Integer(nodeId)); // Cycle through a set of initial colors colors.add(i, cycle[cycleIndex++ % cycle.length]); break; } fireTableRowsInserted(i, i); } /* Remove all motes */ void clear() { motes = new ArrayList(); colors = new ArrayList(); fireTableDataChanged(); } } /* A simple full-color cell */ static class MoteColor extends JLabel implements TableCellRenderer { public MoteColor() { setOpaque(true); } public Component getTableCellRendererComponent (JTable table, Object color, boolean isSelected, boolean hasFocus, int row, int column) { setBackground((Color)color); return this; } } /* Convenience methods for making buttons, labels and textfields. Simplifies code and ensures a consistent style. */ JButton makeButton(String label, ActionListener action) { JButton button = new JButton(); button.setText(label); button.setFont(boldFont); button.addActionListener(action); return button; } JLabel makeLabel(String txt, int alignment) { JLabel label = new JLabel(txt, alignment); label.setFont(boldFont); return label; } JLabel makeSmallLabel(String txt, int alignment) { JLabel label = new JLabel(txt, alignment); label.setFont(smallFont); return label; } JTextField makeTextField(int columns, ActionListener action) { JTextField tf = new JTextField(columns); tf.setFont(normalFont); tf.setMaximumSize(tf.getPreferredSize()); tf.addActionListener(action); return tf; } /* Build the GUI */ void setup() { JPanel main = new JPanel(new BorderLayout()); main.setMinimumSize(new Dimension(500, 250)); main.setPreferredSize(new Dimension(800, 400)); // Three panels: mote list, graph, controls moteListModel = new MoteTableModel(); JTable moteList = new JTable(moteListModel); moteList.setDefaultRenderer(Color.class, new MoteColor()); moteList.setDefaultEditor(Color.class, new ColorCellEditor("Pick Mote Color")); moteList.setPreferredScrollableViewportSize(new Dimension(100, 400)); JScrollPane motePanel = new JScrollPane(); motePanel.getViewport().add(moteList, null); main.add(motePanel, BorderLayout.WEST); graph = new Graph(this); main.add(graph, BorderLayout.CENTER); // Controls. Organised using box layouts. // Sample period. JLabel sampleLabel = makeLabel("Sample period (ms):", JLabel.RIGHT); sampleText = makeTextField(6, new ActionListener() { public void actionPerformed(ActionEvent e) { setSamplePeriod(); } } ); updateSamplePeriod(); // Clear data. JButton clearButton = makeButton("Clear data", new ActionListener() { public void actionPerformed(ActionEvent e) { clearData(); } } ); // Adjust X-axis zoom. Box xControl = new Box(BoxLayout.Y_AXIS); xLabel = makeLabel("", JLabel.CENTER); final JSlider xSlider = new JSlider(JSlider.HORIZONTAL, 0, 8, graph.scale); Hashtable xTable = new Hashtable(); for (int i = 0; i <= 8; i += 2) xTable.put(new Integer(i), makeSmallLabel("" + (Graph.MIN_WIDTH << i), JLabel.CENTER)); xSlider.setLabelTable(xTable); xSlider.setPaintLabels(true); graph.updateXLabel(); graph.setScale(graph.scale); xSlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { //if (!xSlider.getValueIsAdjusting()) graph.setScale((int)xSlider.getValue()); } }); xControl.add(xLabel); xControl.add(xSlider); // Adjust Y-axis range. JLabel yLabel = makeLabel("Y:", JLabel.RIGHT); yText = makeTextField(12, new ActionListener() { public void actionPerformed(ActionEvent e) { setYAxis(); } } ); yText.setText(graph.gy0 + " - " + graph.gy1); Box controls = new Box(BoxLayout.X_AXIS); controls.add(clearButton); controls.add(Box.createHorizontalGlue()); controls.add(Box.createRigidArea(new Dimension(20, 0))); controls.add(sampleLabel); controls.add(sampleText); controls.add(Box.createHorizontalGlue()); controls.add(Box.createRigidArea(new Dimension(20, 0))); controls.add(xControl); controls.add(yLabel); controls.add(yText); main.add(controls, BorderLayout.SOUTH); // The frame part frame = new JFrame("Oscilloscope"); frame.setSize(main.getPreferredSize()); frame.getContentPane().add(main); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } /* User operation: clear data */ void clearData() { synchronized (parent) { moteListModel.clear(); parent.clear(); graph.newData(); } } /* User operation: set Y-axis range. */ void setYAxis() { String val = yText.getText(); try { int dash = val.indexOf('-'); if (dash >= 0) { String min = val.substring(0, dash).trim(); String max = val.substring(dash + 1).trim(); if (!graph.setYAxis(Integer.parseInt(min), Integer.parseInt(max))) error("Invalid range " + min + " - " + max + " (expected values between 0 and 65535)"); return; } } catch (NumberFormatException e) { } error("Invalid range " + val + " (expected NN-MM)"); } /* User operation: set sample period. */ void setSamplePeriod() { String periodS = sampleText.getText().trim(); try { int newPeriod = Integer.parseInt(periodS); if (parent.setInterval(newPeriod)) return; } catch (NumberFormatException e) { } error("Invalid sample period " + periodS); } /* Notification: sample period changed. */ void updateSamplePeriod() { sampleText.setText("" + parent.interval); } /* Notification: new node. */ void newNode(int nodeId) { moteListModel.newNode(nodeId); } /* Notification: new data. */ void newData() { graph.newData(); } void error(String msg) { JOptionPane.showMessageDialog(frame, msg, "Error", JOptionPane.ERROR_MESSAGE); } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/java/build.xml000066400000000000000000000006201207233610700257050ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/java/oscilloscope.jar000066400000000000000000000454701207233610700272740ustar00rootroot00000000000000PKd8 META-INF/PKPKd8META-INF/MANIFEST.MFMLK-. K-*ϳR03r.JM,IMu +h8*8(x%irrPK_FFPKd8ColorCellEditor$1.class}RmOA~=8{\~Ԙ&*&tɱ.ejGgL/ٙyynO;؜DX `)2VBA3j S#^F ˽C>⧙9 {х.; u;0ӻB*i_2d5Pj= TQ_xp[{Q~0ObF)kF ё|F|t2_B6K({Bj.;:.{ F_4Jg1Љاc#;KaZi\3eN: nP 7PKS$h%ZWPKd8ColorCellEditor.classTiOQ= 㰴QE.Rp-P`*`Hi!e<ߐD?xmi hw.s:?}`/U#.0̨JTHRх9y cyyੂg 2 El; }=H" CGPbbi&_xn X0-S,@e o `6C k8Coδ~;B<].\^+v!9#zMaU!VO-_lCfZy _5ESTaNykemT"0JqEʬL/Ki̋ɣ[S\u 1#y5<Ǣ!coSa]N 5O2A۰,dˆrW/ixe +ȶIJKȪ53\\ 0rQFH6)$tfKkEFeZ$mQvr(Lʙ&#\N;o r怞#m%M(.0_6u&G_$|Rda[t;B'dcbUw*8 ~u}/HTѵKT)3hVM z{):GbjRA1Aʌ6 -)AK994Jct%~~B=E00G3u.իEX<Z#D LK;:{mvx=;iRwH ӯ.>5PKcѢ/PKd8Constants.class=Ok@5j{ࡷփ"&Z6v)M< zy̾߿) tLtMuo؋hFhSuʄB p >V^lBY{e7SZn"y Dci~e?4ދo|HO&h/wPWttA&s ;[\~ΰ`:s4Y[ZPK8>1!PKd8 Data.classmR]OQ=ҺE*-lMx/,e%%mQy`L|A)F#1깷ǝ33??d& tp =Bч065$#D€k`X^,mzvִWU٥J._(*Ҿꬂs9XQ=bl/mf'-Jp25W؞g WTTGr頜JHz/<au4hAH蘁q3]4ŢzV,x殟ʖ+ˇ^rCZ9ϑ\RBeW//%SAG^K 6B:ڠ)P܈@uO}โv6h"2B(+oҏRQ5HcaRj}'YQMҢӺ1])1]tgMv[:_XN\Kk<Ьft1YB9eEكbo5Mk/)!l m`n}d@Of}si:ӴYa:` BS`5buIJX9" zn mO|Ihq-MC~)O@NbP-%Cw B7[:;>`q`>cG8qt碟8PKDcPKd8 Graph.classW |[e$[`ҤVҭu[.,MjvE (d( 7d>?Zp?)d 8|Xǧ707PO ɇqV^܁ωB>//KTv |Q)ݲG}Iv|ه{Wu|͇\}2/!u!'CķDQdzP:ITOZ1(0iJ٬k[lv*P &7Sٜʭ5 w9jkWt |suH|H\]Ѧ:ڗ6EW-Wm[~:DO hs Y*@gpM !ZLZ }fJxbxz-Vg e@"cAG[idșfb[l"`ZjS:X"ede:Mkn>`"b5IMtgkKep0Z- xQD*;WCNR@3@G. TPWƂ0iz Ѩg&Rto_:eizsS q՜*Qʖ(v}d%MV*)k̙\Z…@ 8:n5!>ɩw]"j{mnuB6* %dLO>~`q|c؜N:\Jtgl{ϟH^ H@7:^6 ^53/p@9=bx]~%ao .2Џ V6te?O"f/O$c3"m jmF Ac ) $I$_4tvl2o_;V9 qޙSr5n=VnK(PϩG FXB X ,rB^3lMKjt%+9^9qV?J[GkkF,ݟ3Y=Xކ5V7-/8c\G ,VD2v,RmJ'ӬmYliJؑ+0:Zӂźg3MɈQ87bl->s{:N{{J.0lbU(yƗ]T`DVD;[.>}}m+N,tIhf{6xs KzQ"r^SW9ȇ=^78#)ckmq-CA\`ʼnڋ2u'J;LQ**GCU۱ o9jbŝaj٦pwIKEٸ.{c(SBCCxCSGMM@LZ+V m 3ۊ*,gVPg8:ŴpXUiyL_³r1掻~rjSUc+ PCUadO</?mO]c]=Yy_rIIP]H-ǜ抸uUO47BGHNneo^J洜$< .B%3_NM#f[A⪞ZH4-!%'zgˈUނ *S-?e? }QQ;LFԀGq Ɉn[q!*&M` aNnJv1E`r@EH;DހF-жD<مh(Toc @C>̫?5x8-L6%jڌx;VbX1;pNsXݵyf-0 oɥW>\؎q50ƵxߦX:u+oMvPfN_UBI.I;1> y!*=j;J.Q"+J{Lk5n)@hnf::e.*mMYLf+x<s~Yl)Fm7.uq^Q9M8[l.2qΘm>F,<`?~ZXφf&6cf==r_O0ƴK:>L ,.((lFlsOWD}UBIL\ 74Xf%D, 'bvxBv0jIG9(wlJDU:, + 颭o/_WgVU~[qUL-Nr:bgECx3Ql_fMVР/+׳,/hgGok©ahjY_R5sFMmZl`>asU*2Kٶq9d4k9 'TO`z/lh)kt%0E>;{沙v5໖] \$[VӖpVxep@ qID{e\ڡ30cI {^5uEtƫhK_8hlY x~_({,հ= sS˪LO Y0;)";s3+^-Se_Ы3X<_ي97qa ÛU35>̺)*aR5@?mq着s,'+V{i+l"CtݾKv@\&ei^Gy2씾_ _:k2T{s7jj>vot޿1'wW+,cf=9 ;'cщpR[4yR/+xʁWg$Y'3 Js<]7M/E/)8/lnT|K |[H4uI I4xC2[ vNxWe_xpdlj$OEİ@`ZbZncB 86ہd*f$sn\eK 0i=;؏w}\yxP a-..FglxiZ;#vr<GŹJkJtr!7v?nqiJŌsR$tRj"$;(ӣ?H ^xkUvv`6 ,hOhZ@2>Hbscըbϫô|5s)DZ+~H]*;X@=8 ͊%;޼E1G;/j}K`7h?OO7}cC]62j>G^釼&`hֹ vrk8}kS7a62$bZW`[`vйW v j6S{+҆vܻݥs njݺ^8Hi UzHB;`0${u#L}G偑'g,^%ru+pi˨?{ rH O jGJqװYm >T<:)܏[3{Xϣ8^ye3hax1ŘFo.֒%gdH۴v3眽7+Nõ(#(ȋC1ÝP1"fTGb>3&(Q\`BR'|SnSm|*؁˲2%ToZ➊kԜkUSi1{NATJJUSHcMe޻]6(yfV}HaҲ˵yt޲-Є`Vf6GfLgܘM%܌=bpߗ5]I]Dz+݊lWA 1D ]t}_ :gOהgܵFMg3f-[nkH* L}̶z q9h ZslmV7XCO+I]XsJUKt5>*4$qXd !k8A oa`aVb1u18D6Ü 384i5cA<%Jx -+"m׬,]E=hH`HxGIk8( S*[hwhy6dn!UKcY'~(7͎Xӹxg I*K5ev?͑ۚhuCb޵ 2gˆk9射QqivQBǜ5,;ZoI( kvt<6W L3,c/C CFBɂЁXLFMPp/O^|K.# 'c_P"E=΢Z}K*Y¦ fmIF䳇 㗽"ɧtNϱF2vq}'ʳ_% ޳"%0t?q#zrݦL:{0ȮR_4]}]~T42%GρPKPKd8 Window.classX xTdd (NbD@!"$I@їcLg&$*m֥.jmZRܺh[KֶZWz{/L2u8sѭwKj8A{4xpgV!9! ]|)dܭaW*pB~)WBX ~a@L P^!9 0T?i-fQx\COBRz3s*,)y*^Pӿ*xI"<$ŗeT/ KWa9S7zM>{CC+To m⸷4GChс#'Ӱl"><*(p5T"*S|B4)4^CO1B5 MҐâ4MMa°SiT ?Ft*`chB4KvV  ^HjN9 |ɬٜ'-0q#13 莛Ɉ'JLO,Ofz)PM}LxkR'o1 FAv'gQK$,|#c{D$?PF(h7Ed >А% G\^2Fo*n5vZ0[cf<"owDJ7^s \pűD,9BEuo3+%ffg_oUe%zl6 9n ܕM3~Ӱcmنe=X2!09M58H\u)VS)d_<^ywCmMWfl_Pz⦑n1WbTyef%L_*bdB0;mzCm' L%[+.ZW/c$9D$u\kdжČx2ʫto:.rp>aR(Ԁt:tc3z\ sN p Pe^tLۓ}YA^[bf"ÁFhNh·Gk2'vukN62s?4r #)컄O̼qJˀʣfvMĽӌtv"[>-u޾^GrjVXq:S06!n<`yf6BUo*fbjqAZMF_<{/-%[ mˇ f,0n".fk4GeCF]CKM50f 3e tT2>:7dz LܺpP_Vr;+Vje5tX dT۱04V"e}Ξ[pVHoo5F,lxd,J`>/ۋ\jm,]kZg&SBڢ)dWEjS&MxU2mÈ9G"xZx.]8gDu=H%c˕w|&܎9ǻ %$VtN-^}MM~ug)қ壗',o&m{survqt`s _@kqiEfsd:SOYE/9i!-eNjbwǡ=d# ~M(APm"ru(u]_wںPwnX`ͽ`sca&'zyY_ga\}(ϱ0<21w8qruՃ•@gOς;y~'!C8?9?T]U&*UI&[˦|8G;?ŵjI}:p_A^CUު{( VЅ60G53rfef 90+ tP_3Z us<2Ÿ,yH'0,ZWk0F'wcAC/.\lFommyYDBn,f%TGZXXw͍e޹+rh K X9UJmQjJ_z%Wκtr*}X8е~s;J@6x-'ca} ([8>PK+,>PPdhcNKNȢ]5ϳ~r>,%b6gb{2/W^gdşB}]eVE̓^¥B\z+^|hRRb, a.i3ƲJQ?Kl. .R 7^܄G[!rTۨS˰V.tKiOډyx) PKd8 META-INF/PKd8_FF=META-INF/MANIFEST.MFPKd8,ColorCellEditor$1.classPKd8S$h%ZWColorCellEditor$2.classPKd8cѢ/rColorCellEditor.classPKd88>1!Constants.classPKd8 )sɃ Data.classPKd8Dc Graph$SingleGraph.classPKd8$EN1  \Graph.classPKd8_{ Node.classPKd8\ާROscilloscope.classPKd8#f@!OscilloscopeMsg.classPKd83[)Window$1.classPKd8#'[W+Window$2.classPKd8`-Window$3.classPKd8Z/Window$4.classPKd8Q0Window$5.classPKd8k%82Window$MoteColor.classPKd83Window$MoteTableModel.classPKd8I>)  9Window.classPK7Ftinyos-2.1.2+dfsg/apps/tosthreads/capps/TestCollection/java/run000077500000000000000000000002451207233610700246210ustar00rootroot00000000000000#!/bin/sh if cygpath -w / >/dev/null 2>/dev/null; then CLASSPATH="oscilloscope.jar;$CLASSPATH" else CLASSPATH="oscilloscope.jar:$CLASSPATH" fi java Oscilloscope tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestJoin/000077500000000000000000000000001207233610700217515ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestJoin/Makefile000066400000000000000000000000601207233610700234050ustar00rootroot00000000000000TOSTHREAD_MAIN=TestJoin.c include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestJoin/README000066400000000000000000000017121207233610700226320ustar00rootroot00000000000000README for TOSThreads TestJoin Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: TestJoin is a simple application used to test the basic functionality of the join() system call for waiting on a set of threads in a TOSThreads based application. You can install TestJoin on a mote via the following command: make threads install Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic Upon a successful burn, you should see all LEDs toggle in the following pattern, repeating every 8 seconds: 0s: (110) LED0 ON, LED1 ON, LED2 OFF 1s: (000) LED0 OFF, LED1 OFF, LED2 OFF 2s: (010) LED0 OFF, LED1 ON, LED2 OFF 3s: (000) LED0 OFF, LED1 OFF, LED2 OFF 4s: (111) LED0 ON, LED1 ON, LED2 ON 5s: (001) LED0 OFF, LED1 OFF, LED2 ON 6s: (011) LED0 OFF, LED1 ON, LED2 ON 7s: (001) LED0 OFF, LED1 OFF, LED2 ON Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestJoin/TestJoin.c000066400000000000000000000063411207233610700236600ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * TestJoin is a simple application used to test the basic functionality of * the join() system call for waiting on a set of threads in a TOSThreads * based application. * * Upon a successful burn, you should see all LEDs toggle in the following pattern, * repeating every 8 seconds: * * 0s: (110) LED0 ON, LED1 ON, LED2 OFF
    * 1s: (000) LED0 OFF, LED1 OFF, LED2 OFF
    * 2s: (010) LED0 OFF, LED1 ON, LED2 OFF
    * 3s: (000) LED0 OFF, LED1 OFF, LED2 OFF
    * 4s: (111) LED0 ON, LED1 ON, LED2 ON
    * 5s: (001) LED0 OFF, LED1 OFF, LED2 ON
    * 6s: (011) LED0 OFF, LED1 ON, LED2 ON
    * 7s: (001) LED0 OFF, LED1 OFF, LED2 ON
    * * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "stack.h" #include "tosthread.h" #include "tosthread_leds.h" //Initialize variables associated with each thread tosthread_t init; tosthread_t blink0; tosthread_t blink1; void init_thread(void* arg); void blink0_thread(void* arg); void blink1_thread(void* arg); void tosthread_main(void* arg) { //Use stack estimator to calculate maximum stack size // on a thread by thread basis tosthread_create(&init, init_thread, NULL, INIT_STACK_SIZE); } void init_thread(void* arg) { for(;;) { tosthread_create(&blink0, blink0_thread, NULL, BLINK0_STACK_SIZE); tosthread_create(&blink1, blink1_thread, NULL, BLINK1_STACK_SIZE); tosthread_join(&blink0); tosthread_join(&blink1); led2Toggle(); } } void blink0_thread(void* arg) { int i; for(i=0; i<2; i++) { led0Toggle(); tosthread_sleep(1000); } } void blink1_thread(void* arg) { int i; for(i=0; i<4; i++) { led1Toggle(); tosthread_sleep(1000); } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestJoin/stack.h000066400000000000000000000033511207233610700232310ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ enum { INIT_STACK_SIZE = 50, BLINK0_STACK_SIZE = 200, BLINK1_STACK_SIZE = 200, BLINK2_STACK_SIZE = 200, }; tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestLogStorage/000077500000000000000000000000001207233610700231205ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestLogStorage/Makefile000066400000000000000000000012711207233610700245610ustar00rootroot00000000000000TOSTHREAD_MAIN=TestLogStorage.c THIS_SUPPORTED_PLATFORMS=tmote telos telosb eyesIFXv1 eyesIFXv2 mica2 mica2dot telosa eyesIFX micaz iris tinynode epic ifneq ($(filter $(THIS_SUPPORTED_PLATFORMS) clean,$(MAKECMDGOALS)),) ifneq ($(filter tmote telos telosb eyesIFXv1,$(MAKECMDGOALS)),) CFLAGS+=-DUSE_STM25P endif ifneq ($(filter mica2 telosa mica2dot eyesIFX eyesIFXv2 micaz iris tinynode epic,$(MAKECMDGOALS)),) CFLAGS+=-DUSE_AT45DB endif include $(MAKERULES) else %: @echo " Sorry, this application is only written to work with the following platforms:" @echo " $(THIS_SUPPORTED_PLATFORMS)" cthreads: @: endif tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestLogStorage/README000066400000000000000000000054331207233610700240050ustar00rootroot00000000000000README for TOSThreads TestLogStorage Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: TestLogStorage is a threaded application that takes dummy sensor readings of a counter, logs them to flash, and then sends out over the serial port at some later time. In the current implementation, each sensor reading is taken once every 3000ms, and records containing a set of readings from each iteration are batched out over the radio every 10000ms. This application is very similar to the SenseStoreAndForward application contained in this same directory, except that it uses a dummy sensor instead of sensors specific to the tmote onboard suite. In this way, the LogStorage functionality can be tested in conjunction with the sending facility in a platform independent way. To run this application install it on a mote via the command: make cthreads install Valid platforms are currently: tmote, telosb, iris, mica2, micaz, and epic Readings are taken from the dummy sensor and logged to flash as one record in an infinite loop. Records are then read out of flash and and sent out over the serial interface in separate infinite loop. Before the application starts running, the entire contents of the flash drive are erased. A successful test will result in LED0 remaining solid for approximately 6s while the flash is being erased. After that LED0 will toggle with each successful sensor readings logged to flash, at a rate of 3000ms. Also, LED1 will begin toggling in rapid succession once every 10000ms as records are successfully read from flash and sent out over the serial port. Once all of the records currently recorded to flash since the last batch of sends have been sent out, LED2 Toggles to indicate completion. This process continues in an infinite loop forever. Since the TestLogStorage mote writes its records out to the serial port, you can test that the application is working properly by reading these packets (e.g., through seriallisten): java net.tinyos.tools.Listen -comm serial@/dev/ttyUSBXXX: Once this java application is running, you should see output containing the sensor readings being streamed to your terminal. Check that the output has reasonable values, counting up from 0. E.g.: 00 ff ff 00 00 06 00 25 00 00 00 9f 00 9f 00 ff ff 00 00 06 00 25 00 00 00 a0 00 a0 00 ff ff 00 00 06 00 25 00 00 00 a1 00 a1 00 ff ff 00 00 06 00 25 00 00 00 a2 00 a2 00 ff ff 00 00 06 00 25 00 00 00 a3 00 a3 NOTE: The baud rate 57600 must be used telos based motes, as its configuration has been changed to work with this baud rate when compiled for tosthreads. I.e. DO NOT just substitute 'telosb' or 'tmote' for above. Explicitly set it to 57600. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestLogStorage/TestLogStorage.c000066400000000000000000000144031207233610700261740ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * TestLogStorage is a threaded implementation of an application that takes a dummy * sensor readings of a counter, logs it flash, and then sends it out over the * serial port at some later time. In the current implementation, each sensor reading is * taken once every 3000ms, and records containing a set of readings from each * iteration are batched out over the radio every 10000ms. This application is * very similar to the SenseStoreAndForward application contained in this same * directory, except that it is written using a dummy sensor value instead of * sensors specific to the tmote onboard suite. In this way, the LogStorage * functionality can be tested in conjunction with the sending facility in a * platform independent way. * * Readings are taken from the dummy sensor and logged to flash as one record in an * infinite loop. Records are then read out of flash and and sent out over the * serial interface in separate infinite loop. Before the application starts * running, the entire contents of the flash drive are erased. * * A successful test will result in LED0 remaining solid for approximately 6s while * the flash is being erased. After that LED0 will toggle with each successful * sensor readings logged to flash, at a rate of 3000ms. Also, LED1 will begin * toggling in rapid succession once every 10000ms as records are successfully read * from flash and sent out over the serial port. Once all of the records currently * recorded to flash since the last batch of sends have been sent out, LED2 Toggles * to indicate completion. This process continues in an infinite loop forever. * * @author Kevin Klues */ #include "tosthread.h" #include "tosthread_amserial.h" #include "tosthread_leds.h" #include "tosthread_threadsync.h" #include "tosthread_logstorage.h" #include "StorageVolumes.h" #define NUM_SENSORS 1 #define SAMPLING_PERIOD 3000 #define SENDING_PERIOD 10000 #define AM_SENSOR_DATA_MSG 0x25 //Data structure for storing sensor data typedef struct sensor_data { nx_uint32_t seq_no; nx_uint16_t sample; } sensor_data_t; //Initialize variables associated with each thread tosthread_t dummy_sensor; tosthread_t store_handler; tosthread_t send_handler; message_t send_msg; sensor_data_t storing_sensor_data; sensor_data_t* sending_sensor_data; //pointer into message structure mutex_t data_mutex; mutex_t log_mutex; barrier_t send_barrier; barrier_t sense_barrier; void sensor_thread(void* arg); void store_thread(void* arg); void send_thread(void* arg); void tosthread_main(void* arg) { mutex_init(&data_mutex); mutex_init(&log_mutex); barrier_reset(&send_barrier, NUM_SENSORS+1); barrier_reset(&sense_barrier, NUM_SENSORS+1); sending_sensor_data = serialGetPayload(&send_msg, sizeof(sensor_data_t)); storing_sensor_data.seq_no = 0; amSerialStart(); led0Toggle(); volumeLogErase(VOLUME_TESTLOGSTORAGE); volumeLogSeek(VOLUME_TESTLOGSTORAGE, SEEK_BEGINNING); tosthread_create(&dummy_sensor, sensor_thread, NULL, 200); tosthread_create(&store_handler, store_thread, NULL, 200); tosthread_create(&send_handler, send_thread, NULL, 200); } void read_sensor(error_t (*read)(uint16_t*), nx_uint16_t* nx_val) { } void sensor_thread(void* arg) { //Dummy sensor just counts up on each iteration uint16_t val = -1; for(;;) { val++; mutex_lock(&data_mutex); storing_sensor_data.sample = val; mutex_unlock(&data_mutex); barrier_block(&send_barrier); barrier_block(&sense_barrier); } } void store_thread(void* arg) { storage_len_t sensor_data_len; bool sensor_records_lost; for(;;) { barrier_block(&send_barrier); barrier_reset(&send_barrier, NUM_SENSORS + 1); mutex_lock(&log_mutex); sensor_data_len = sizeof(sensor_data_t); while( volumeLogAppend(VOLUME_TESTLOGSTORAGE, &storing_sensor_data, &sensor_data_len, &sensor_records_lost) != SUCCESS ); mutex_unlock(&log_mutex); storing_sensor_data.seq_no++; led0Toggle(); tosthread_sleep(SAMPLING_PERIOD); barrier_block(&sense_barrier); barrier_reset(&sense_barrier, NUM_SENSORS + 1); } } void send_thread(void* arg) { storage_len_t sensor_data_len; for(;;) { tosthread_sleep(SENDING_PERIOD); while( volumeLogCurrentReadOffset(VOLUME_TESTLOGSTORAGE) != volumeLogCurrentWriteOffset(VOLUME_TESTLOGSTORAGE) ) { sensor_data_len = sizeof(sensor_data_t); mutex_lock(&log_mutex); while( volumeLogRead(VOLUME_TESTLOGSTORAGE, sending_sensor_data, &sensor_data_len) != SUCCESS ); mutex_unlock(&log_mutex); while( amSerialSend(AM_BROADCAST_ADDR, &send_msg, sizeof(sensor_data_t), AM_SENSOR_DATA_MSG) != SUCCESS ); led1Toggle(); } led2Toggle(); } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestLogStorage/volumes-at45db.xml000066400000000000000000000001521207233610700264130ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestLogStorage/volumes-pxa27xp30.xml000066400000000000000000000001531207233610700270050ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestLogStorage/volumes-stm25p.xml000066400000000000000000000001531207233610700264630ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestPrintf/000077500000000000000000000000001207233610700223145ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestPrintf/Makefile000066400000000000000000000001421207233610700237510ustar00rootroot00000000000000TOSTHREAD_MAIN=TestPrintf.c CFLAGS += -I$(TOSDIR)/lib/tosthreads/lib/printf include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestPrintf/README000066400000000000000000000024061207233610700231760ustar00rootroot00000000000000README for TOSThreads TestPrintf Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: This application tests the operation of the Printf client in TOSThreads. It continuously prints the value of a counter starting at 0, increasing as it prints. You can install TestPrintf on a mote via the following command: make cthreads install Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic Once burned on a mote, the java based PrintfClient must be ran to verify proper operation of the application. java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSBXXX: NOTE: The baud rate 57600 must be used telos based motes, as its configuration has been changed to work with this baud rate when compiled for tosthreads. I.e. DO NOT just substitute 'telosb' or 'tmote' for above. Explicitly set it to 57600. Once this java application is running, you should see output of the sort continuously being streamed to your terminal: ... ... Counter: 4549 Counter: 4550 Counter: 4551 Counter: 4552 Counter: 4553 Counter: 4554 Counter: 4555 Counter: 4556 Counter: 4557 Counter: 4558 Counter: 4559 ... ... Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestPrintf/TestPrintf.c000066400000000000000000000042111207233610700245600ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application tests the operation of the Printf client in TOSThreads. It * continuously prints the value of a counter starting at 0, increasing as it * prints. * * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "tosthread.h" #include "printf.h" //Initialize variables associated with each thread tosthread_t printf_thread; void thread_run(void* arg); void tosthread_main(void* arg) { tosthread_create(&printf_thread, thread_run, NULL, 200); } void thread_run(void* arg) { uint32_t counter = 0; for(;;) { printf("Counter: %lu\n", counter++); } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestSineSensor/000077500000000000000000000000001207233610700231425ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestSineSensor/Makefile000066400000000000000000000001621207233610700246010ustar00rootroot00000000000000TOSTHREAD_MAIN=TestSineSensor.c CFLAGS += -I$(TOSDIR)/lib/tosthreads/sensorboards/universal include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestSineSensor/README000066400000000000000000000026441207233610700240300ustar00rootroot00000000000000README for TOSThreads TestSineSensor Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: This application is used to test the threaded version of the API for accessing the software based SineSensor usable by any platform for demonstration purposes. You can install TestSineSensor on a mote via the following comand: make cthreads install Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic This application simply takes sensor readings in an infinite loop from the SineSensor and forwards them over the serial interface. Upon successful transmission, LED0 is toggled. A successful test will result in the TestSineSensor mote constantly flickering LED0. Additionally, messages containing the sensor readings should be forwarded over the serial interface as verified by running the following for the platform of interest: java net.tinyos.tools.Listen -comm serial@/dev/ttyUSBXXX: NOTE: The baud rate 57600 must be used telos based motes, as its configuration has been changed to work with this baud rate when compiled for tosthreads. I.e. DO NOT just substitute 'telosb' or 'tmote' for above. Explicitly set it to 57600. Once this java application is running, you should see output containing the sensor readings being streamed to your terminal. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/capps/TestSineSensor/TestSineSensor.c000066400000000000000000000046321207233610700262430ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application is used to test the threaded version of the API for accessing * the software based SineSensor usable by any platform for demonstration purposes. * * This application simply takes sensor readings in an infinite loop from the * SineSensor and forwards them over the serial interface. Upon successful * transmission, LED0 is toggled. * * @author Kevin Klues */ #include "tosthread.h" #include "tosthread_amserial.h" #include "tosthread_leds.h" #include "tosthread_sinesensor.h" void tosthread_main(void* arg) { uint16_t* var; message_t msg; var = serialGetPayload(&msg, sizeof(uint16_t)); while( amSerialStart() != SUCCESS ); for(;;) { while( sinesensor_read(var) != SUCCESS ); while( amSerialSend(AM_BROADCAST_ADDR, &msg, sizeof(uint16_t), 228) != SUCCESS ); led0Toggle(); } } tinyos-2.1.2+dfsg/apps/tosthreads/capps/ThreadStress/000077500000000000000000000000001207233610700226255ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/capps/ThreadStress/Makefile000066400000000000000000000001461207233610700242660ustar00rootroot00000000000000TOSTHREAD_MAIN=ThreadStress.c PFLAGS += -I$(TOS_THREADS_DIR)/tos/csystem/Loader include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/capps/ThreadStress/README000066400000000000000000000022111207233610700235010ustar00rootroot00000000000000README for TOSThreads ThreadStress Author/Contact: tinyos-help@millennium.berkeley.edu Author: Kevin Klues Description: This application stresses the creation and destruction of dynamic threads by spawning lots and lots of threads over and over again and letting them run to completion. Three different thread start functions are used, each toggling one of LED0, LED1, and LED2 every 256 spawnings. The time at which each LED is toggled is offset so that the three LEDS do not come on in unison. You can install ThreadStress on a mote via the following command: make cthreads install Valid platforms are currently: tmote, telosb, iris, shimmer*, span, mica2, micaz, and epic Successful running of this application will result in all three leds flashing at a rate determined by how long it takes to spawn a thread on a given platform. All three LEDs should flash at this rate in an infinite loop forever. Given the dynamics on the mote the rate may vary over time, but the important thing is that all three LEDs continue to toggle at a reasonably visible rate. Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/capps/ThreadStress/ThreadStress.c000066400000000000000000000073461207233610700254160ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application stresses the creation and destruction of dynamic threads by * spawning lots and lots of threads over and over again and letting them run to * completion. Three different thread start functions are used, each toggling one * of LED0, LED1, and LED2 every 256 spawnings. The time at which each LED is * toggled is offset so that the three LEDS do not come on in unison. * * Successful running of this application will result in all three leds flashing at * a rate determined by how long it takes to spawn a thread on a given platform. * All three LEDs should flash at this rate in an infinite loop forever. Given the * dynamics on the mote the rate may vary over time, but the important thing is * that all three LEDs continue to toggle at a reasonably visible rate. * * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "tosthread.h" #include "tosthread_leds.h" //Initialize variables associated with each thread tosthread_t thread_handler; void blink0_thread(void* arg); void blink1_thread(void* arg); void blink2_thread(void* arg); void tosthread_main(void* arg) { while(1) { tosthread_create(&thread_handler, blink0_thread, NULL, 100); tosthread_create(&thread_handler, blink1_thread, NULL, 100); tosthread_create(&thread_handler, blink2_thread, NULL, 100); } } uint8_t blink0_count = 0; void blink0_thread(void* arg) { if(blink0_count++ == 0) led0Toggle(); tosthread_create(&thread_handler, blink1_thread, NULL, 100); tosthread_create(&thread_handler, blink2_thread, NULL, 100); tosthread_create(&thread_handler, blink0_thread, NULL, 100); } uint8_t blink1_count = 0; void blink1_thread(void* arg) { if(blink1_count++ == 85) led1Toggle(); tosthread_create(&thread_handler, blink2_thread, NULL, 100); tosthread_create(&thread_handler, blink0_thread, NULL, 100); tosthread_create(&thread_handler, blink1_thread, NULL, 100); } uint8_t blink2_count = 0; void blink2_thread(void* arg) { if(blink2_count++ == 170) led2Toggle(); tosthread_create(&thread_handler, blink0_thread, NULL, 100); tosthread_create(&thread_handler, blink1_thread, NULL, 100); tosthread_create(&thread_handler, blink2_thread, NULL, 100); } tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/000077500000000000000000000000001207233610700204075ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/LoadFromRAM/000077500000000000000000000000001207233610700224525ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/LoadFromRAM/LoadFromRAMAppC.nc000066400000000000000000000040671207233610700256120ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * LoadFromRAM is a simple program that dynamically loads two loadable * programs hardcoded in the byte arrays; One program is Blink, and the * other one is Basestation. * * @author Chieh-Jan Mike Liang */ configuration LoadFromRAMAppC {} implementation { components MainC, LoadFromRAMP, DynamicLoaderC, LedsC; LoadFromRAMP.Boot -> MainC; LoadFromRAMP.DynamicLoader -> DynamicLoaderC; LoadFromRAMP.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/LoadFromRAM/LoadFromRAMP.nc000066400000000000000000000230551207233610700251640ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * LoadFromRAM is a simple program that dynamically loads two loadable * programs hardcoded in the byte arrays; One program is Blink, and the * other one is Basestation. * * @author Chieh-Jan Mike Liang */ module LoadFromRAMP { uses { interface Boot; interface DynamicLoader; interface Leds; } } implementation { // The following blinks led 2 uint8_t code1[] = { 0x1c, 0x00, 0x01, 0x00, 0x03, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x01, 0x00, 0x2c, 0x00, 0x08, 0x00, 0x44, 0x00, 0x09, 0x00, 0x56, 0x00, 0x0a, 0x00, 0x32, 0x00, 0x30, 0x00, 0x24, 0x00, 0x0f, 0x42, 0x12, 0xc3, 0x0f, 0x10, 0x0f, 0x11, 0x0f, 0x11, 0x5f, 0xf3, 0x32, 0xc2, 0x03, 0x43, 0x7f, 0xf3, 0x30, 0x41, 0x4f, 0x93, 0x01, 0x24, 0x32, 0xd2, 0x30, 0x41, 0x3c, 0x40, 0xf4, 0x01, 0x0d, 0x43, 0x3e, 0x40, 0x00, 0x00, 0x3f, 0x40, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x00, 0x30, 0x41, 0xb0, 0x12, 0x00, 0x00, 0x3e, 0x40, 0xe8, 0x03, 0x0f, 0x43, 0xb0, 0x12, 0x4e, 0x00, 0xf8, 0x3f, 0x30, 0x41, 0xb0, 0x12, 0x00, 0x00, 0x3e, 0x40, 0xe8, 0x03, 0x0f, 0x43, 0xb0, 0x12, 0x60, 0x00, 0xf8, 0x3f, 0x30, 0x41, 0xb0, 0x12, 0x00, 0x00, 0x3e, 0x40, 0xe8, 0x03, 0x0f, 0x43, 0xb0, 0x12, 0x00, 0x00, 0xf8, 0x3f, 0x30, 0x41 }; // The following is BaseStationForC uint8_t code2[] = { 0x1c, 0x00, 0x05, 0x00, 0x58, 0x01, 0x1e, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x26, 0x03, 0xac, 0x00, 0x26, 0x00, 0xae, 0x00, 0x88, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x01, 0x00, 0x52, 0x00, 0x02, 0x00, 0x64, 0x00, 0x01, 0x00, 0x44, 0x00, 0x08, 0x00, 0xe2, 0x00, 0x09, 0x00, 0x00, 0x02, 0x0a, 0x00, 0xdc, 0x00, 0x0b, 0x00, 0x32, 0x00, 0x0d, 0x00, 0x10, 0x03, 0x0e, 0x00, 0x98, 0x01, 0x11, 0x00, 0xd6, 0x02, 0x12, 0x00, 0xce, 0x02, 0x14, 0x00, 0x9c, 0x02, 0x16, 0x00, 0xc6, 0x02, 0x1a, 0x00, 0x94, 0x02, 0x1b, 0x00, 0xde, 0x02, 0x22, 0x00, 0x2e, 0x00, 0x24, 0x00, 0xb6, 0x00, 0x25, 0x00, 0xfa, 0x02, 0x28, 0x00, 0x84, 0x02, 0x29, 0x00, 0x7c, 0x02, 0x2b, 0x00, 0xee, 0x02, 0x2d, 0x00, 0x74, 0x02, 0x31, 0x00, 0xe6, 0x02, 0x32, 0x00, 0x8c, 0x02, 0x3f, 0x00, 0xa2, 0x00, 0x40, 0x00, 0x04, 0x01, 0x42, 0x00, 0x18, 0x01, 0x44, 0x00, 0x98, 0x00, 0x45, 0x00, 0xec, 0x00, 0x46, 0x00, 0x0e, 0x01, 0x51, 0x00, 0x8a, 0x01, 0x6d, 0x00, 0x6c, 0x01, 0x90, 0x00, 0x22, 0x00, 0xb0, 0x00, 0x3c, 0x00, 0x84, 0x01, 0x4e, 0x00, 0x92, 0x01, 0x60, 0x00, 0x0a, 0x03, 0x72, 0x00, 0x18, 0x03, 0x84, 0x00, 0xbe, 0x00, 0xba, 0x00, 0x28, 0x01, 0xf4, 0x00, 0x00, 0x00, 0x46, 0x01, 0xa0, 0x01, 0x9c, 0x01, 0x18, 0x02, 0xbc, 0x01, 0xb8, 0x02, 0xfc, 0x01, 0x66, 0x02, 0x08, 0x02, 0x0f, 0x42, 0x12, 0xc3, 0x0f, 0x10, 0x0f, 0x11, 0x0f, 0x11, 0x5f, 0xf3, 0x32, 0xc2, 0x03, 0x43, 0x7f, 0xf3, 0x30, 0x41, 0x4f, 0x93, 0x01, 0x24, 0x32, 0xd2, 0x30, 0x41, 0x3f, 0x40, 0x40, 0x00, 0xb0, 0x12, 0x2a, 0x00, 0x3f, 0x40, 0x76, 0x00, 0xb0, 0x12, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x00, 0x3c, 0x40, 0xc8, 0x00, 0x0d, 0x43, 0x3e, 0x40, 0x00, 0x00, 0x3f, 0x40, 0xb2, 0x00, 0xb0, 0x12, 0x56, 0x00, 0x3c, 0x40, 0xc8, 0x00, 0x0d, 0x43, 0x3e, 0x40, 0x00, 0x00, 0x3f, 0x40, 0x00, 0x00, 0xb0, 0x12, 0x68, 0x00, 0x3c, 0x40, 0xc8, 0x00, 0x0d, 0x43, 0x3e, 0x40, 0x00, 0x00, 0x3f, 0x40, 0x00, 0x00, 0xb0, 0x12, 0x7a, 0x00, 0x3c, 0x40, 0xc8, 0x00, 0x0d, 0x43, 0x3e, 0x40, 0x00, 0x00, 0x3f, 0x40, 0x0c, 0x03, 0xb0, 0x12, 0x8c, 0x00, 0x3c, 0x40, 0xc8, 0x00, 0x0d, 0x43, 0x3e, 0x40, 0x00, 0x00, 0x3f, 0x40, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x00, 0x30, 0x41, 0x0b, 0x12, 0x0b, 0x4f, 0x2f, 0x52, 0xb0, 0x12, 0x00, 0x00, 0x0f, 0x4b, 0x3f, 0x50, 0x0a, 0x00, 0xb0, 0x12, 0x00, 0x00, 0xcb, 0x43, 0xaa, 0x00, 0xcb, 0x43, 0xab, 0x00, 0x3b, 0x41, 0x30, 0x41, 0x3e, 0x40, 0x86, 0x01, 0x3f, 0x40, 0x00, 0x00, 0xb0, 0x12, 0x8e, 0x01, 0x30, 0x41, 0x0b, 0x12, 0x0a, 0x12, 0x09, 0x12, 0x31, 0x80, 0x34, 0x00, 0x09, 0x4f, 0x0b, 0x4e, 0x7c, 0x43, 0x0d, 0x43, 0x0e, 0x43, 0x0f, 0x41, 0x89, 0x12, 0x4f, 0x93, 0x03, 0x24, 0xb0, 0x12, 0x00, 0x00, 0xf6, 0x3f, 0xb0, 0x12, 0x00, 0x00, 0x0a, 0x4b, 0x2a, 0x52, 0x0f, 0x4a, 0xb0, 0x12, 0xb6, 0x01, 0x0e, 0x41, 0x0f, 0x4b, 0xb0, 0x12, 0x00, 0x00, 0x5f, 0x93, 0x07, 0x20, 0x0e, 0x4a, 0x0f, 0x4b, 0x3f, 0x50, 0x0a, 0x00, 0xb0, 0x12, 0xcc, 0x01, 0xf3, 0x3f, 0x0f, 0x4b, 0x2f, 0x52, 0xb0, 0x12, 0xe6, 0x01, 0x0f, 0x4b, 0x3f, 0x50, 0x0a, 0x00, 0xb0, 0x12, 0xf0, 0x01, 0xd8, 0x3f, 0x31, 0x50, 0x34, 0x00, 0x39, 0x41, 0x3a, 0x41, 0x3b, 0x41, 0x30, 0x41, 0x0b, 0x12, 0x0a, 0x12, 0x09, 0x12, 0x09, 0x4f, 0x0d, 0x4e, 0xff, 0x90, 0x03, 0x00, 0xaa, 0x00, 0x20, 0x2c, 0x5f, 0x4f, 0xab, 0x00, 0x0a, 0x4f, 0x3c, 0x40, 0x34, 0x00, 0xb0, 0x12, 0x48, 0x02, 0x0e, 0x59, 0x3e, 0x50, 0x0e, 0x00, 0x0f, 0x4d, 0x3d, 0x40, 0x34, 0x00, 0xfe, 0x4f, 0x00, 0x00, 0x1e, 0x53, 0x1d, 0x83, 0xfb, 0x23, 0x5f, 0x49, 0xab, 0x00, 0x1f, 0x53, 0x0c, 0x4f, 0x3a, 0x40, 0x03, 0x00, 0xb0, 0x12, 0x3e, 0x02, 0xc9, 0x4e, 0xab, 0x00, 0xd9, 0x53, 0xaa, 0x00, 0x0f, 0x43, 0x01, 0x3c, 0x1f, 0x43, 0x39, 0x41, 0x3a, 0x41, 0x3b, 0x41, 0x30, 0x41, 0x3e, 0x40, 0x94, 0x01, 0x3f, 0x40, 0x00, 0x00, 0xb0, 0x12, 0x14, 0x03, 0x30, 0x41, 0x3e, 0x40, 0x00, 0x00, 0x3f, 0x40, 0xf4, 0x01, 0xb0, 0x12, 0x22, 0x03, 0x30, 0x41, 0x0b, 0x12, 0x0a, 0x12, 0x09, 0x12, 0x31, 0x80, 0x34, 0x00, 0x09, 0x4f, 0x0b, 0x4e, 0x0a, 0x4b, 0x2a, 0x52, 0x0f, 0x4a, 0xb0, 0x12, 0x00, 0x00, 0x0f, 0x4b, 0xb0, 0x12, 0x00, 0x00, 0x0f, 0x93, 0x07, 0x20, 0x0e, 0x4a, 0x0f, 0x4b, 0x3f, 0x50, 0x0a, 0x00, 0xb0, 0x12, 0x00, 0x00, 0xf4, 0x3f, 0x0d, 0x41, 0x3e, 0x40, 0x34, 0x00, 0xfd, 0x4f, 0x00, 0x00, 0x1d, 0x53, 0x1e, 0x83, 0xfb, 0x23, 0x0f, 0x4b, 0x2f, 0x52, 0xb0, 0x12, 0x00, 0x00, 0x0f, 0x4b, 0x3f, 0x50, 0x0a, 0x00, 0xb0, 0x12, 0x00, 0x00, 0x39, 0x90, 0xa8, 0x02, 0x06, 0x24, 0x0f, 0x41, 0xb0, 0x12, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x00, 0xd5, 0x3f, 0x0f, 0x41, 0xb0, 0x12, 0x00, 0x00, 0xf9, 0x3f, 0x31, 0x50, 0x34, 0x00, 0x39, 0x41, 0x3a, 0x41, 0x3b, 0x41, 0x30, 0x41, 0x0b, 0x12, 0x0a, 0x12, 0x09, 0x12, 0x08, 0x12, 0x09, 0x4f, 0x58, 0x4f, 0xaa, 0x00, 0x48, 0x93, 0x18, 0x24, 0x5f, 0x4f, 0xab, 0x00, 0x4e, 0x48, 0x0f, 0x8e, 0x3f, 0x50, 0x03, 0x00, 0x0c, 0x4f, 0x3a, 0x40, 0x03, 0x00, 0xb0, 0x12, 0x00, 0x00, 0x0a, 0x4e, 0x3c, 0x40, 0x34, 0x00, 0xb0, 0x12, 0x00, 0x00, 0x0f, 0x4e, 0x0f, 0x59, 0x78, 0x53, 0xc9, 0x48, 0xaa, 0x00, 0x3f, 0x50, 0x0e, 0x00, 0x01, 0x3c, 0x0f, 0x43, 0x38, 0x41, 0x39, 0x41, 0x3a, 0x41, 0x3b, 0x41, 0x30, 0x41, 0x0b, 0x12, 0x0a, 0x12, 0x09, 0x12, 0x08, 0x12, 0x07, 0x12, 0x0b, 0x4f, 0xb0, 0x12, 0x00, 0x00, 0x47, 0x4f, 0x0f, 0x4b, 0xb0, 0x12, 0x00, 0x00, 0x09, 0x4f, 0x0f, 0x4b, 0xb0, 0x12, 0x00, 0x00, 0x08, 0x4f, 0x0f, 0x4b, 0xb0, 0x12, 0x00, 0x00, 0x4a, 0x4f, 0x0f, 0x4b, 0xb0, 0x12, 0x00, 0x00, 0x0e, 0x49, 0x0f, 0x4b, 0xb0, 0x12, 0x00, 0x00, 0x4c, 0x47, 0x4d, 0x4a, 0x0e, 0x4b, 0x0f, 0x48, 0xb0, 0x12, 0x00, 0x00, 0x7f, 0xf3, 0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3a, 0x41, 0x3b, 0x41, 0x30, 0x41, 0x0b, 0x12, 0x0a, 0x12, 0x09, 0x12, 0x08, 0x12, 0x07, 0x12, 0x0b, 0x4f, 0xb0, 0x12, 0x00, 0x00, 0x47, 0x4f, 0x0f, 0x4b, 0xb0, 0x12, 0x00, 0x00, 0x09, 0x4f, 0x0f, 0x4b, 0xb0, 0x12, 0x00, 0x00, 0x08, 0x4f, 0x0f, 0x4b, 0xb0, 0x12, 0x00, 0x00, 0x4a, 0x4f, 0x0f, 0x4b, 0xb0, 0x12, 0x00, 0x00, 0x0e, 0x49, 0x0f, 0x4b, 0xb0, 0x12, 0x00, 0x00, 0x4c, 0x47, 0x4d, 0x4a, 0x0e, 0x4b, 0x0f, 0x48, 0xb0, 0x12, 0x1e, 0x03, 0x7f, 0xf3, 0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3a, 0x41, 0x3b, 0x41, 0x30, 0x41, 0x3e, 0x40, 0x1a, 0x03, 0x3f, 0x40, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x00, 0x30, 0x41, 0x3e, 0x40, 0x00, 0x00, 0x3f, 0x40, 0x00, 0x00, 0xb0, 0x12, 0x00, 0x00, 0x30, 0x41 }; task void loadCode1() { call DynamicLoader.loadFromMemory(code1); } task void loadCode2() { call DynamicLoader.loadFromMemory(code2); } event void DynamicLoader.loadFromMemoryDone(void *addr, tosthread_t id, error_t error) { if (addr == code1) { post loadCode2(); } } event void Boot.booted() { post loadCode1(); } event void DynamicLoader.loadFromFlashDone(uint8_t volumeId, tosthread_t id, error_t error) {} } tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/LoadFromRAM/Makefile000066400000000000000000000007611207233610700241160ustar00rootroot00000000000000COMPONENT=LoadFromRAMAppC GOALS += threads THREADS_DIR ?= $(TOSDIR)/lib/tosthreads CFLAGS += -I$(THREADS_DIR)/lib/tinyld CFLAGS += -I$(THREADS_DIR)/csystem CFLAGS += -I$(THREADS_DIR)/sensorboards/tmote_onboard CFLAGS += -I$(THREADS_DIR)/sensorboards/universal CFLAGS += -I$(THREADS_DIR)/lib/net/ctp CFLAGS += -I$(THREADS_DIR)/lib/net CFLAGS += -I$(TOSDIR)/lib/net CFLAGS += -I$(TOSDIR)/lib/net/ctp CFLAGS += -I$(TOSDIR)/lib/net/4bitle CFLAGS += -I$(THREADS_DIR)/lib/printf include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/LoadFromRAM/README000066400000000000000000000011371207233610700233340ustar00rootroot00000000000000README for LoadFromRAM Author/Contact: Chieh-Jan Mike Liang Description: LoadFromRAM is a simple program that dynamically loads two loadable programs hardcoded in the byte arrays; One program is Blink, and the other one is Basestation. You can install LoadFromRAM on a mote via the following command: make install If you would like to generate your own loadable program run, for example: cd ../../capps/Blink make telosb dynthreads (the output file needed is ../../capps/Blink/build/telosb/dynthreads/main.tos) Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/LoadFromRAM/volumes-at45db.xml000066400000000000000000000001451207233610700257470ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/LoadFromRAM/volumes-stm25p.xml000077500000000000000000000001321207233610700260150ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/Makefile000066400000000000000000000030521207233610700220470ustar00rootroot00000000000000#-*-makefile-*- ###################################################################### # # Makes the entire suite of TinyOS applications for a given platform. # # Author: Martin Turon # Date: August 18, 2005 # ###################################################################### # $Id: Makefile,v 1.1 2009-12-23 18:08:47 klueska Exp $ # MAKECMDGOALS is the way to get the arguments passed into a Makefile ... TARGET=$(MAKECMDGOALS) NESDOC_TARGET=$(filter-out nesdoc,$(TARGET)) # Here is a way to get the list of subdirectories in a Makefile ... ROOT=. SUBDIRS := $(shell find * -type d) # Okay, match any target, and recurse the subdirectories %: @for i in $(SUBDIRS); do \ HERE=$$PWD; \ if [ -f $$i/Makefile ]; then \ echo Building ... $(PWD)/$$i; \ echo make $(TARGET); \ cd $$i; \ $(MAKE) $(TARGET); \ cd $$HERE; \ fi; \ done threads: @: cthreads: @: dynthreads: @: BASEDIR = $(shell pwd | sed 's@\(.*\)/apps.*$$@\1@' ) # The output directory for generated documentation DOCDIR = $(BASEDIR)/doc/nesdoc nesdoc: @echo This target rebuilds documentation for all known platforms. @echo It DOES NOT overwrite any existing documentation, thus, it @echo is best run after deleting all old documentation. @echo @echo To delete all old documentation, delete the contents of the @echo $(DOCDIR) directory. @echo @echo Press Enter to continue, or ^C to abort. @read for platform in `ncc -print-platforms`; do \ $(MAKE) $$platform docs.nohtml.preserve; \ nesdoc -o $(DOCDIR) -html -target=$$platform; \ done tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoader/000077500000000000000000000000001207233610700227555ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoader/Makefile000077500000000000000000000012101207233610700244120ustar00rootroot00000000000000COMPONENT=SerialLoaderAppC GOALS += threads THREADS_DIR ?= $(TOSDIR)/lib/tosthreads CFLAGS += -I$(THREADS_DIR)/lib/tinyld CFLAGS += -I$(THREADS_DIR)/csystem CFLAGS += -I$(THREADS_DIR)/sensorboards/tmote_onboard CFLAGS += -I$(THREADS_DIR)/sensorboards/universal CFLAGS += -I$(THREADS_DIR)/lib/net/ctp CFLAGS += -I$(THREADS_DIR)/lib/net CFLAGS += -I$(TOSDIR)/lib/net CFLAGS += -I$(TOSDIR)/lib/net/ctp CFLAGS += -I$(TOSDIR)/lib/net/4bitle CFLAGS += -I$(THREADS_DIR)/lib/printf ifdef TENET CFLAGS += -DTOSTHREAD_TENET=1 endif CFLAGS += -DDISABLE_LOADER_FLASH=1 CFLAGS += -DDISABLE_LOADER_USERBUTTON=1 CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoader/README000066400000000000000000000014551207233610700236420ustar00rootroot00000000000000README for SerialLoader Author/Contact: Chieh-Jan Mike Liang Description: SerialLoader receives loadable programs from the serial port and stores it in a byte array. Then, when it receives the command to load the code, it makes the call to the dynamic loader. Here are the steps: 1.) Load SerialLoader: make telosb install bsl, 2.) Create the loadable code, main.tos: cd ../../capps/Blink make telosb dynthreads (the output file needed is ../../capps/Blink/build/telosb/dynthreads/main.tos) 3.) Clear the byte array in the mote RAM buffer: ./serialloader.py 0 4.) Upload the binary: ./serialloader.py 1 main.tos 5.) Run the binary: ./serialloader.py 7 Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoader/SerialLoader.h000077500000000000000000000042701207233610700255020ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #ifndef SERIALLOADER_H #define SERIALLOADER_H #define MAX_BIN_SIZE 2000 #define SERIALMSG_ERASE 0 #define SERIALMSG_WRITE 1 #define SERIALMSG_READ 2 #define SERIALMSG_CRC 3 #define SERIALMSG_LEDS 5 #define SERIALMSG_RUN 7 typedef nx_struct SerialReqPacket { nx_uint8_t msg_type; nx_uint8_t pad; nx_uint16_t offset; nx_uint16_t len; nx_uint8_t data[0]; } SerialReqPacket; #define SERIALMSG_SUCCESS 0 #define SERIALMSG_FAIL 1 typedef nx_struct SerialReplyPacket { nx_uint8_t error; nx_uint8_t pad; nx_uint8_t data[0]; } SerialReplyPacket; #endif tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoader/SerialLoaderAppC.nc000077500000000000000000000047671207233610700264320ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SerialLoader receives loadable programs from the serial port and stores * it in a byte array. Then, when it receives the command to load the code, * it makes the call to the dynamic loader. * * @author Chieh-Jan Mike Liang * @author Jeongyeup Paek */ #include "AM.h" #include "SerialLoader.h" configuration SerialLoaderAppC {} implementation { components MainC, SerialActiveMessageC, new SerialAMSenderC(0xAB), new SerialAMReceiverC(0xAB), SerialLoaderP, BigCrcC, LedsC; SerialLoaderP.Boot -> MainC; SerialLoaderP.SerialSplitControl -> SerialActiveMessageC; SerialLoaderP.SerialAMSender -> SerialAMSenderC; SerialLoaderP.SerialAMReceiver -> SerialAMReceiverC; SerialLoaderP.Leds -> LedsC; SerialLoaderP.BigCrc -> BigCrcC; components DynamicLoaderC; SerialLoaderP.DynamicLoader -> DynamicLoaderC; } tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoader/SerialLoaderP.nc000077500000000000000000000131201207233610700257650ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SerialLoader receives loadable programs from the serial port and stores * it in a byte array. Then, when it receives the command to load the code, * it makes the call to the dynamic loader. * * @author Chieh-Jan Mike Liang * @author Jeongyeup Paek **/ #include "SerialLoader.h" module SerialLoaderP { uses { interface Boot; interface SplitControl as SerialSplitControl; interface AMSend as SerialAMSender; interface Receive as SerialAMReceiver; interface Leds; interface DynamicLoader; interface BigCrc; } } implementation { message_t serialMsg; uint32_t dumpAddr = 0; uint8_t image[MAX_BIN_SIZE]; event void Boot.booted() { call SerialSplitControl.start(); } event void SerialSplitControl.startDone(error_t error) { if (error != SUCCESS) { call SerialSplitControl.start(); } } event void SerialSplitControl.stopDone(error_t error) {} void sendReply(error_t error, uint8_t len) { SerialReplyPacket *srpkt = (SerialReplyPacket *)call SerialAMSender.getPayload(&serialMsg, sizeof(SerialReplyPacket)); if (error == SUCCESS) { srpkt->error = SERIALMSG_SUCCESS; } else { srpkt->error = SERIALMSG_FAIL; } call SerialAMSender.send(AM_BROADCAST_ADDR, &serialMsg, len); } event void SerialAMSender.sendDone(message_t* msg, error_t error) {} error_t write_image(uint16_t offset, void *data, uint16_t len) { if ((offset + len > MAX_BIN_SIZE) || (data == NULL)) return FAIL; memcpy(&image[offset], data, len); return SUCCESS; } error_t read_image(uint16_t offset, void *readbuf, uint16_t len) { if ((offset + len > MAX_BIN_SIZE) || (readbuf == NULL)) return FAIL; memcpy(readbuf, &image[offset], len); return SUCCESS; } event void DynamicLoader.loadFromFlashDone(uint8_t volumeId, tosthread_t id, error_t error) {} event void DynamicLoader.loadFromMemoryDone(void *addr, tosthread_t id, error_t error) { sendReply(error, sizeof(SerialReplyPacket)); } event void BigCrc.computeCrcDone(void* buf, uint16_t len, uint16_t crc, error_t error) { SerialReplyPacket *srpkt = (SerialReplyPacket *)call SerialAMSender.getPayload(&serialMsg, sizeof(SerialReplyPacket)); srpkt->data[1] = crc & 0xFF; srpkt->data[0] = (crc >> 8) & 0xFF; sendReply(SUCCESS, 2 + sizeof(SerialReplyPacket)); } void sendCrcReply(uint16_t offset, uint16_t len) { call BigCrc.computeCrc(&(image[offset]), len); } event message_t* SerialAMReceiver.receive(message_t* msg, void* payload, uint8_t len) { uint16_t i; error_t error = FAIL; SerialReqPacket *srpkt = (SerialReqPacket *)payload; SerialReplyPacket *serialMsg_payload = (SerialReplyPacket *)call SerialAMSender.getPayload(&serialMsg, sizeof(SerialReplyPacket)); switch (srpkt->msg_type) { case SERIALMSG_ERASE : for (i = 0; i < MAX_BIN_SIZE; i++) { image[i] = 0; } call Leds.set(7); for (i = 0; i < 2000; i++) {} call Leds.set(0); sendReply(SUCCESS, sizeof(SerialReplyPacket)); break; case SERIALMSG_RUN : error = call DynamicLoader.loadFromMemory(image); if (error != SUCCESS) sendReply(error, sizeof(SerialReplyPacket)); break; case SERIALMSG_WRITE : error = write_image(srpkt->offset, srpkt->data, srpkt->len); if (error != SUCCESS) call Leds.led0On(); sendReply(error, sizeof(SerialReplyPacket)); break; case SERIALMSG_READ : error = read_image(srpkt->offset, serialMsg_payload->data, srpkt->len); if (error != SUCCESS) sendReply(error, sizeof(SerialReplyPacket)); else sendReply(error, len + sizeof(SerialReplyPacket)); break; case SERIALMSG_LEDS: call Leds.set(7); for (i = 0; i < 2000; i++) {} call Leds.set(0); break; case SERIALMSG_CRC : sendCrcReply(srpkt->offset, srpkt->len); break; } return msg; } } tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoader/serialloader.py000077500000000000000000000206431207233610700260050ustar00rootroot00000000000000#!/usr/bin/env python # Copyright (c) 2008 Johns Hopkins University. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of the copyright holders nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL # THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # @author Chieh-Jan Mike Liang import sys, os, stat, struct import tinyos SERIAL_BAUDRATE = 57600 SERIALMSG_AMGROUP = 0 SERIALMSG_AMID = 0xAB SERIALMSG_ERASE = 0 SERIALMSG_WRITE = 1 SERIALMSG_READ = 2 SERIALMSG_CRC = 3 SERIALMSG_LEDS = 5 SERIALMSG_RUN = 7 SERIALMSG_SUCCESS = 0 SERIALMSG_FAIL = 1 SERIALMSG_DATA_PAYLOAD_SIZE = 20 MAX_BIN_SIZE = 2000 HEX_OUTPUT_LINE_SIZE = 16 class SerialReqPacket(tinyos.GenericPacket): def __init__(self, packet = None): tinyos.GenericPacket.__init__(self, [('msg_type', 'int', 1), ('pad', 'int', 1), ('offset', 'int', 2), ('len', 'int', 2), ('data', 'blob', None)], packet) class SerialReplyPacket(tinyos.GenericPacket): def __init__(self, packet = None): tinyos.GenericPacket.__init__(self, [('error', 'int', 1), ('pad', 'int', 1), ('data', 'blob', None)], packet) # Display an integer representation of byte stream to hex representation def print_hex(start_addr, byte_stream): byte_stream = ["%02x" % one_byte for one_byte in byte_stream] # Converts to each byte to hex num_iterations = int( (len(byte_stream) - 1) / HEX_OUTPUT_LINE_SIZE ) num_iterations += 1 for i in range(num_iterations): line = "%07x" % start_addr + " " # Prints memory address for j in range(HEX_OUTPUT_LINE_SIZE): if (i * HEX_OUTPUT_LINE_SIZE + j) < len(byte_stream): line += byte_stream[i * HEX_OUTPUT_LINE_SIZE + j] + " " print line start_addr += HEX_OUTPUT_LINE_SIZE def op_run(s, sreqpkt): success = s.write_packet(SERIALMSG_AMGROUP, SERIALMSG_AMID, sreqpkt.payload()) if success == True: packet = s.read_packet() sreplypkt = SerialReplyPacket(packet[1]) return (sreplypkt.error == SERIALMSG_SUCCESS) def op_erase(s, sreqpkt): success = s.write_packet(SERIALMSG_AMGROUP, SERIALMSG_AMID, sreqpkt.payload()) if success == True: packet = s.read_packet() sreplypkt = SerialReplyPacket(packet[1]) return (sreplypkt.error == SERIALMSG_SUCCESS) def op_print(s, sreqpkt, offset, length): if (offset + length) <= DELUGE_VOLUME_SIZE: while length > 0: sreqpkt.offset = offset # Calculates the payload size for the reply packet if length >= HEX_OUTPUT_LINE_SIZE: sreqpkt.len = HEX_OUTPUT_LINE_SIZE else: sreqpkt.len = length success = s.write_packet(SERIALMSG_AMGROUP, SERIALMSG_AMID, sreqpkt.payload()) if success == True: packet = s.read_packet() sreplypkt = SerialReplyPacket(packet[1]) if sreplypkt.error != SERIALMSG_SUCCESS: return False print_hex(offset, sreplypkt.data) length -= sreqpkt.len offset += sreqpkt.len else: print "ERROR: Specified offset and length are too large for the flash volume" return False return True def op_write(s, sreqpkt, input_file, length): local_crc = 0 input_file_size = length sreqpkt.offset = 0 while length > 0: # Calculates the payload size for the current packet if length >= SERIALMSG_DATA_PAYLOAD_SIZE: sreqpkt.len = SERIALMSG_DATA_PAYLOAD_SIZE else: sreqpkt.len = length sreqpkt.data = [] # Reads in the file we want to transmit for i in range(sreqpkt.len): sreqpkt.data.append(struct.unpack("B", input_file.read(1))[0]) # Sends over serial to the mote if s.write_packet(SERIALMSG_AMGROUP, SERIALMSG_AMID, sreqpkt.payload()) == True: # Waiting for confirmation packet = s.read_packet() sreplypkt = SerialReplyPacket(packet[1]) if sreplypkt.error != SERIALMSG_SUCCESS: print "ERROR: !SUCCESS" return False local_crc = s.crc16(local_crc, sreqpkt.data) # Computes running CRC else: print "ERROR: Unable to write to flash" return False length -= sreqpkt.len sreqpkt.offset += sreqpkt.len # Check local and remote CRC sreqpkt.msg_type = SERIALMSG_CRC remote_crc = op_crc(s, sreqpkt, 0, input_file_size) if remote_crc != None: local_crc = [(local_crc >> 8) & 0xFF, local_crc & 0xFF] print "Local CRC: " + ("%02x" % local_crc[0]) + " " + ("%02x" % local_crc[1]) print "Remote CRC: " + ("%02x" % remote_crc[0]) + " " + ("%02x" % remote_crc[1]) if remote_crc != local_crc: print "ERROR: Remote CRC doesn't match local CRC" return False else: print "ERROR: Unable to verify CRC" return False return True def op_crc(s, sreqpkt, offset, length): sreqpkt.offset = offset sreqpkt.len = length success = s.write_packet(SERIALMSG_AMGROUP, SERIALMSG_AMID, sreqpkt.payload()) if success == True: packet = s.read_packet() sreplypkt = SerialReplyPacket(packet[1]) if sreplypkt.error == SERIALMSG_SUCCESS: return sreplypkt.data else: return None def op_leds(s, sreqpkt): success = s.write_packet(SERIALMSG_AMGROUP, SERIALMSG_AMID, sreqpkt.payload()) # ======== MAIN ======== # if len(sys.argv) >= 3: sys.argv[2] = int(sys.argv[2]) s = tinyos.Serial(sys.argv[1], SERIAL_BAUDRATE) s.set_debug(False) # Disables debug msg sreqpkt = SerialReqPacket((sys.argv[2], 0, 0, 0, [])) # msg_type, pad, offset, length, data if sys.argv[2] == SERIALMSG_RUN: if op_run(s, sreqpkt) == True: print "Loaded image should be running now!" else: print "ERROR: Unable to run loaded image" elif sys.argv[2] == SERIALMSG_ERASE: if op_erase(s, sreqpkt) == True: print "Flash volume has been erased" else: print "ERROR: Unable to erase flash volume" elif sys.argv[2] == SERIALMSG_WRITE: input_file = file(sys.argv[3], 'rb') fileStats = os.stat(sys.argv[3]) if fileStats[stat.ST_SIZE] <= MAX_BIN_SIZE: #sreqpkt = SerialReqPacket((SERIALMSG_LEDS, 0, 0, 0, [])) #op_leds(s, sreqpkt) sreqpkt = SerialReqPacket((sys.argv[2], 0, 0, 0, [])) if op_write(s, sreqpkt, input_file, fileStats[stat.ST_SIZE]) == True: print "File has been successfully transmitted (" + str(fileStats[stat.ST_SIZE]) + " bytes)" else: print "ERROR: Unable to transmit file" sreqpkt = SerialReqPacket((SERIALMSG_LEDS, 0, 0, 0, [])) op_leds(s, sreqpkt) else: print "ERROR: File is larger than max buffer size (" + str(MAX_BIN_SIZE) + ")" elif sys.argv[2] == SERIALMSG_READ: data = op_print(s, sreqpkt, int(sys.argv[3]), int(sys.argv[4])) if data != True: print "ERROR: Unable to read the specified range" elif sys.argv[2] == SERIALMSG_CRC: remote_crc = op_crc(s, sreqpkt, int(sys.argv[3]), int(sys.argv[4])) if remote_crc != None: print_hex(0, remote_crc) else: print "ERROR: Unable to compute remote CRC" tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoader/tinyos.py000077500000000000000000000142411207233610700246610ustar00rootroot00000000000000import struct, time, serial class Serial: HDLC_FLAG_BYTE = 0x7e HDLC_CTLESC_BYTE = 0x7d TOS_SERIAL_ACTIVE_MESSAGE_ID = 0 TOS_SERIAL_CC1000_ID = 1 TOS_SERIAL_802_15_4_ID = 2 TOS_SERIAL_UNKNOWN_ID = 255 SERIAL_PROTO_ACK = 67 SERIAL_PROTO_PACKET_ACK = 68 SERIAL_PROTO_PACKET_NOACK = 69 SERIAL_PROTO_PACKET_UNKNOWN = 255 __s = None; # An instance of serial.Serial object __debug = True # Debug mode def __init__(self, port, baudrate): self.__s = serial.Serial(port, baudrate, rtscts=0) def __format_packet(self, packet): return " ".join(["%02x" % p for p in packet]) + " | " + \ " ".join(["%d" % p for p in packet]) def crc16(self, base_crc, frame_data): crc = base_crc for b in frame_data: crc = crc ^ (b << 8) for i in range(0, 8): if crc & 0x8000 == 0x8000: crc = (crc << 1) ^ 0x1021 else: crc = crc << 1 crc = crc & 0xffff return crc def __encode(self, val, dim): output = [] for i in range(dim): output.append(val & 0xFF) val = val >> 8 return output def __decode(self, v): r = long(0) for i in v[::-1]: r = (r << 8) + i return r def __get_byte(self): r = struct.unpack("B", self.__s.read())[0] return r def __put_bytes(self, data): for b in data: self.__s.write(struct.pack('B', b)) def __unescape(self, packet): r = [] esc = False for b in packet: if esc: r.append(b ^ 0x20) esc = False elif b == self.HDLC_CTLESC_BYTE: esc = True else: r.append(b) return r def __escape(self, packet): r = [] for b in packet: if b == self.HDLC_FLAG_BYTE or b == self.HDLC_CTLESC_BYTE: r.append(self.HDLC_CTLESC_BYTE) r.append(b ^ 0x20) else: r.append(b) return r def read_packet(self): d = self.__get_byte() ts = time.time() while d != self.HDLC_FLAG_BYTE: d = self.__get_byte() ts = time.time() packet = [d] d = self.__get_byte() if d == self.HDLC_FLAG_BYTE: d = self.__get_byte() ts = time.time() else: packet.append(d) while d != self.HDLC_FLAG_BYTE: d = self.__get_byte() packet.append(d) un_packet = self.__unescape(packet) crc = self.crc16(0, un_packet[1:-3]) packet_crc = self.__decode(un_packet[-3:-1]) if crc != packet_crc: print "Warning: wrong CRC!" if self.__debug == True: print "Recv:", self.__format_packet(un_packet) return (ts, un_packet) def write_packet(self, am_group, am_id, data): # The first byte after SERIAL_PROTO_PACKET_ACK is a sequence # number that will be send back by the mote to ack the receive of # the data. packet = [self.SERIAL_PROTO_PACKET_ACK, 0, self.TOS_SERIAL_ACTIVE_MESSAGE_ID, 0xff, 0xff, 0, 0, len(data), am_group, am_id] + data; crc = self.crc16(0, packet) packet.append(crc & 0xff) packet.append((crc >> 8) & 0xff) packet = [self.HDLC_FLAG_BYTE] + self.__escape(packet) + [self.HDLC_FLAG_BYTE] if self.__debug == True: print "Send:", self.__format_packet(packet) self.__put_bytes(packet) # Waiting for ACK packet = self.read_packet() if len(packet) > 1 and len(packet[1]) > 1: return ((packet[1])[1] == self.SERIAL_PROTO_ACK) return False def set_debug(self, debug): self.__debug = debug class GenericPacket: """ GenericPacket """ def __decode(self, v): r = long(0) for i in v: r = (r << 8) + i return r def __encode(self, val, dim): output = [] for i in range(dim): output.append(int(val & 0xFF)) val = val >> 8 output.reverse() return output def __init__(self, desc, packet = None): self.__dict__['_schema'] = [(t, s) for (n, t, s) in desc] self.__dict__['_names'] = [n for (n, t, s) in desc] self.__dict__['_values'] = [] offset = 10 if type(packet) == type([]): for (t, s) in self._schema: if t == 'int': self._values.append(self.__decode(packet[offset:offset + s])) offset += s elif t == 'blob': if s: self._values.append(packet[offset:offset + s]) offset += s else: self._values.append(packet[offset:-3]) elif type(packet) == type(()): for i in packet: self._values.append(i) else: for v in self._schema: self._values.append(None) def __repr__(self): return self._values.__repr__() def __str__(self): return self._values.__str__() # Implement the map behavior def __getitem__(self, key): return self.__getattr__(key) def __setitem__(self, key, value): self.__setattr__(key, value) def __len__(self): return len(self._values) def keys(self): return self._names def values(self): return self._names # Implement the struct behavior def __getattr__(self, name): if type(name) == type(0): return self._names[name] else: return self._values[self._names.index(name)] def __setattr__(self, name, value): if type(name) == type(0): self._values[name] = value else: self._values[self._names.index(name)] = value # Custom def names(self): return self._names def sizes(self): return self._schema def payload(self): r = [] for i in range(len(self._schema)): (t, s) = self._schema[i] if t == 'int': r += self.__encode(self._values[i], s) else: r += self._values[i] return r tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoaderFlash/000077500000000000000000000000001207233610700237335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoaderFlash/FlashVolumeManager.h000077500000000000000000000043031207233610700276270ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #ifndef FLASHVOLUMEMANAGER_H #define FLASHVOLUMEMANAGER_H #define SERIALMSG_ERASE 0 #define SERIALMSG_WRITE 1 #define SERIALMSG_READ 2 #define SERIALMSG_CRC 3 //#define SERIALMSG_ADDR 4 #define SERIALMSG_LEDS 5 #define SERIALMSG_RUN 7 typedef nx_struct SerialReqPacket { nx_uint8_t msg_type; nx_uint8_t pad; nx_uint16_t offset; nx_uint16_t len; nx_uint8_t data[0]; } SerialReqPacket; #define SERIALMSG_SUCCESS 0 #define SERIALMSG_FAIL 1 typedef nx_struct SerialReplyPacket { nx_uint8_t error; nx_uint8_t pad; nx_uint8_t data[0]; } SerialReplyPacket; #endif tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoaderFlash/FlashVolumeManagerC.nc000077500000000000000000000052211207233610700301030ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SerialLoaderFlash is similar to SerialLoader in that it receives * loadable programs from the serial port. However, SerialLoaderFlash * stores them on the external flash. Then, when it receives the command to * load the code, it makes the call to the dynamic loader. * * @author Chieh-Jan Mike Liang */ #include "AM.h" generic configuration FlashVolumeManagerC(am_id_t AMId) { uses { interface BlockRead; interface BlockWrite; interface DynamicLoader; } } implementation { components MainC, SerialActiveMessageC, new SerialAMSenderC(AMId), new SerialAMReceiverC(AMId), new FlashVolumeManagerP(), NoLedsC, LedsC; DynamicLoader = FlashVolumeManagerP; BlockRead = FlashVolumeManagerP; BlockWrite = FlashVolumeManagerP; FlashVolumeManagerP.Boot -> MainC; FlashVolumeManagerP.SerialSplitControl -> SerialActiveMessageC; FlashVolumeManagerP.SerialAMSender -> SerialAMSenderC; FlashVolumeManagerP.SerialAMReceiver -> SerialAMReceiverC; FlashVolumeManagerP.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoaderFlash/FlashVolumeManagerP.nc000077500000000000000000000135131207233610700301230ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SerialLoaderFlash is similar to SerialLoader in that it receives * loadable programs from the serial port. However, SerialLoaderFlash * stores them on the external flash. Then, when it receives the command to * load the code, it makes the call to the dynamic loader. * * @author Chieh-Jan Mike Liang */ #include "FlashVolumeManager.h" #include "StorageVolumes.h" generic module FlashVolumeManagerP() { uses { interface Boot; interface SplitControl as SerialSplitControl; interface BlockRead; interface BlockWrite; interface AMSend as SerialAMSender; interface Receive as SerialAMReceiver; interface Leds; interface DynamicLoader; } } implementation { message_t serialMsg; storage_addr_t dumpAddr = 0; event void Boot.booted() { while (call SerialSplitControl.start() != SUCCESS); } event void SerialSplitControl.startDone(error_t error) { if (error != SUCCESS) { while (call SerialSplitControl.start() != SUCCESS); } } void sendReply(error_t error, storage_len_t len) { SerialReplyPacket *srpkt = (SerialReplyPacket *)call SerialAMSender.getPayload(&serialMsg, sizeof(SerialReplyPacket)); if (error == SUCCESS) { srpkt->error = SERIALMSG_SUCCESS; } else { srpkt->error = SERIALMSG_FAIL; } call SerialAMSender.send(AM_BROADCAST_ADDR, &serialMsg, len); } event void BlockRead.readDone(storage_addr_t addr, void* buf, storage_len_t len, error_t error) { sendReply(error, len + sizeof(SerialReplyPacket)); } event void BlockRead.computeCrcDone(storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) { if (error == SUCCESS) { SerialReplyPacket *srpkt = (SerialReplyPacket *)call SerialAMSender.getPayload(&serialMsg, sizeof(SerialReplyPacket)); srpkt->data[1] = crc & 0xFF; srpkt->data[0] = (crc >> 8) & 0xFF; } sendReply(error, 2 + sizeof(SerialReplyPacket)); } event void BlockWrite.writeDone(storage_addr_t addr, void* buf, storage_len_t len, error_t error) { if (error != SUCCESS) { call Leds.led1On(); } sendReply(error, sizeof(SerialReplyPacket)); } event void BlockWrite.eraseDone(error_t error) { sendReply(error, sizeof(SerialReplyPacket)); } event message_t* SerialAMReceiver.receive(message_t* msg, void* payload, uint8_t len) { uint16_t i; error_t error = SUCCESS; SerialReqPacket *srpkt = (SerialReqPacket *)payload; SerialReplyPacket *serialMsg_payload = (SerialReplyPacket *)call SerialAMSender.getPayload(&serialMsg, sizeof(SerialReplyPacket)); switch (srpkt->msg_type) { case SERIALMSG_ERASE : error = call BlockWrite.erase(); if (error != SUCCESS) { sendReply(error, sizeof(SerialReplyPacket)); } break; case SERIALMSG_WRITE : call Leds.led2On(); error = call BlockWrite.write(srpkt->offset, srpkt->data, srpkt->len); if (error != SUCCESS) { sendReply(error, sizeof(SerialReplyPacket)); call Leds.led0On(); } break; case SERIALMSG_READ : error = call BlockRead.read(srpkt->offset, serialMsg_payload->data, srpkt->len); if (error != SUCCESS) { sendReply(error, sizeof(SerialReplyPacket)); } break; case SERIALMSG_CRC : error = call BlockRead.computeCrc(srpkt->offset, srpkt->len, 0); if (error != SUCCESS) { sendReply(error, sizeof(SerialReplyPacket)); } break; case SERIALMSG_LEDS: call Leds.set(7); for (i = 0; i < 2000; i++) {} call Leds.set(0); break; case SERIALMSG_RUN : error = call DynamicLoader.loadFromFlash(VOLUME_MICROEXEIMAGE); if (error != SUCCESS) sendReply(error, sizeof(SerialReplyPacket)); break; } return msg; } event void DynamicLoader.loadFromFlashDone(uint8_t volumeId, tosthread_t id, error_t error) { sendReply(error, sizeof(SerialReplyPacket)); } event void DynamicLoader.loadFromMemoryDone(void *addr, tosthread_t id, error_t error) {} event void BlockWrite.syncDone(error_t error) {} event void SerialAMSender.sendDone(message_t* msg, error_t error) {} event void SerialSplitControl.stopDone(error_t error) {} } tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoaderFlash/Makefile000077500000000000000000000011031207233610700253710ustar00rootroot00000000000000COMPONENT=SerialLoaderFlashAppC GOALS += threads THREADS_DIR ?= $(TOSDIR)/lib/tosthreads CFLAGS += -I$(THREADS_DIR)/lib/tinyld CFLAGS += -I$(THREADS_DIR)/csystem CFLAGS += -I$(THREADS_DIR)/sensorboards/tmote_onboard CFLAGS += -I$(THREADS_DIR)/sensorboards/universal CFLAGS += -I$(THREADS_DIR)/lib/net/ctp CFLAGS += -I$(THREADS_DIR)/lib/net CFLAGS += -I$(TOSDIR)/lib/net CFLAGS += -I$(TOSDIR)/lib/net/ctp CFLAGS += -I$(TOSDIR)/lib/net/4bitle CFLAGS += -I$(THREADS_DIR)/lib/printf # Creates VolumeMapC.nc VOLUME_ALLOCATOR_FLAGS += -t CLEAN_EXTRA += *.pyc include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoaderFlash/README000077500000000000000000000015521207233610700246210ustar00rootroot00000000000000README for SerialLoaderFlash Author/Contact: Chieh-Jan Mike Liang Description: SerialLoaderFlash is similar to SerialLoader in that it receives loadable programs from the serial port. However, SerialLoaderFlash stores them on the external flash. Then, when it receives the command to load the code, it makes the call to the dynamic loader. Here are the steps: 1.) Load SerialLoader: make telosb install bsl, 2.) Create the loadable code, main.tos: cd ../../capps/Blink make telosb dynthreads (the output file needed is ../../capps/Blink/build/telosb/dynthreads/main.tos) 3.) Erase the external flash: ./serialloader.py 0 4.) Upload the binary: ./serialloader.py 1 main.tos 5.) Run the binary: ./serialloader.py 7 Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoaderFlash/SerialLoaderFlashAppC.nc000077500000000000000000000045031207233610700303520ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SerialLoaderFlash is similar to SerialLoader in that it receives * loadable programs from the serial port. However, SerialLoaderFlash * stores them on the external flash. Then, when it receives the command to * load the code, it makes the call to the dynamic loader. * * @author Kevin Klues (klueska@cs.stanford.edu) * @author Chieh-Jan Mike Liang */ #include "StorageVolumes.h" configuration SerialLoaderFlashAppC {} implementation { components DynamicLoaderC, new FlashVolumeManagerC(0xAB), new BlockStorageC(VOLUME_MICROEXEIMAGE) as ImageVolume; FlashVolumeManagerC.BlockRead -> ImageVolume; FlashVolumeManagerC.BlockWrite -> ImageVolume; FlashVolumeManagerC.DynamicLoader -> DynamicLoaderC; } tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoaderFlash/serialloader.py000077500000000000000000000205551207233610700267650ustar00rootroot00000000000000#!/usr/bin/env python # Copyright (c) 2008 Johns Hopkins University. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of the copyright holders nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL # THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # @author Chieh-Jan Mike Liang import sys, os, stat, struct import tinyos SERIALMSG_AMGROUP = 0 SERIALMSG_AMID = 0xAB SERIALMSG_ERASE = 0 SERIALMSG_WRITE = 1 SERIALMSG_READ = 2 SERIALMSG_CRC = 3 SERIALMSG_LEDS = 5 SERIALMSG_RUN = 7 SERIALMSG_SUCCESS = 0 SERIALMSG_FAIL = 1 SERIALMSG_DATA_PAYLOAD_SIZE = 20 DELUGE_VOLUME_SIZE = 262144 HEX_OUTPUT_LINE_SIZE = 16 class SerialReqPacket(tinyos.GenericPacket): def __init__(self, packet = None): tinyos.GenericPacket.__init__(self, [('msg_type', 'int', 1), ('pad', 'int', 1), ('offset', 'int', 2), ('len', 'int', 2), ('data', 'blob', None)], packet) class SerialReplyPacket(tinyos.GenericPacket): def __init__(self, packet = None): tinyos.GenericPacket.__init__(self, [('error', 'int', 1), ('pad', 'int', 1), ('data', 'blob', None)], packet) # Display an integer representation of byte stream to hex representation def print_hex(start_addr, byte_stream): byte_stream = ["%02x" % one_byte for one_byte in byte_stream] # Converts to each byte to hex num_iterations = int( (len(byte_stream) - 1) / HEX_OUTPUT_LINE_SIZE ) num_iterations += 1 for i in range(num_iterations): line = "%07x" % start_addr + " " # Prints memory address for j in range(HEX_OUTPUT_LINE_SIZE): if (i * HEX_OUTPUT_LINE_SIZE + j) < len(byte_stream): line += byte_stream[i * HEX_OUTPUT_LINE_SIZE + j] + " " print line start_addr += HEX_OUTPUT_LINE_SIZE def op_run(s, sreqpkt): success = s.write_packet(SERIALMSG_AMGROUP, SERIALMSG_AMID, sreqpkt.payload()) if success == True: packet = s.read_packet() sreplypkt = SerialReplyPacket(packet[1]) return (sreplypkt.error == SERIALMSG_SUCCESS) def op_erase(s, sreqpkt): success = s.write_packet(SERIALMSG_AMGROUP, SERIALMSG_AMID, sreqpkt.payload()) if success == True: packet = s.read_packet() sreplypkt = SerialReplyPacket(packet[1]) return (sreplypkt.error == SERIALMSG_SUCCESS) def op_print(s, sreqpkt, offset, length): if (offset + length) <= DELUGE_VOLUME_SIZE: while length > 0: sreqpkt.offset = offset # Calculates the payload size for the reply packet if length >= HEX_OUTPUT_LINE_SIZE: sreqpkt.len = HEX_OUTPUT_LINE_SIZE else: sreqpkt.len = length success = s.write_packet(SERIALMSG_AMGROUP, SERIALMSG_AMID, sreqpkt.payload()) if success == True: packet = s.read_packet() sreplypkt = SerialReplyPacket(packet[1]) if sreplypkt.error != SERIALMSG_SUCCESS: return False print_hex(offset, sreplypkt.data) length -= sreqpkt.len offset += sreqpkt.len else: print "ERROR: Specified offset and length are too large for the flash volume" return False return True def op_write(s, sreqpkt, input_file, length): local_crc = 0 input_file_size = length sreqpkt.offset = 0 while length > 0: # Calculates the payload size for the current packet if length >= SERIALMSG_DATA_PAYLOAD_SIZE: sreqpkt.len = SERIALMSG_DATA_PAYLOAD_SIZE else: sreqpkt.len = length sreqpkt.data = [] # Reads in the file we want to transmit for i in range(sreqpkt.len): sreqpkt.data.append(struct.unpack("B", input_file.read(1))[0]) # Sends over serial to the mote if s.write_packet(SERIALMSG_AMGROUP, SERIALMSG_AMID, sreqpkt.payload()) == True: # Waiting for confirmation packet = s.read_packet() sreplypkt = SerialReplyPacket(packet[1]) if sreplypkt.error != SERIALMSG_SUCCESS: return False local_crc = s.crc16(local_crc, sreqpkt.data) # Computes running CRC else: print "ERROR: Unable to write to flash" return False length -= sreqpkt.len sreqpkt.offset += sreqpkt.len # Check local and remote CRC sreqpkt.msg_type = SERIALMSG_CRC remote_crc = op_crc(s, sreqpkt, 0, input_file_size) if remote_crc != None: local_crc = [(local_crc >> 8) & 0xFF, local_crc & 0xFF] print "Local CRC: " + ("%02x" % local_crc[0]) + " " + ("%02x" % local_crc[1]) print "Remote CRC: " + ("%02x" % remote_crc[0]) + " " + ("%02x" % remote_crc[1]) if remote_crc != local_crc: print "ERROR: Remote CRC doesn't match local CRC" return False else: print "ERROR: Unable to verify CRC" return False return True def op_crc(s, sreqpkt, offset, length): sreqpkt.offset = offset sreqpkt.len = length success = s.write_packet(SERIALMSG_AMGROUP, SERIALMSG_AMID, sreqpkt.payload()) if success == True: packet = s.read_packet() sreplypkt = SerialReplyPacket(packet[1]) if sreplypkt.error == SERIALMSG_SUCCESS: return sreplypkt.data else: return None def op_leds(s, sreqpkt): success = s.write_packet(SERIALMSG_AMGROUP, SERIALMSG_AMID, sreqpkt.payload()) # ======== MAIN ======== # if len(sys.argv) >= 3: sys.argv[2] = int(sys.argv[2]) s = tinyos.Serial(sys.argv[1], 57600) s.set_debug(False) # Disables debug msg sreqpkt = SerialReqPacket((sys.argv[2], 0, 0, 0, [])) # msg_type, pad, offset, length, data if sys.argv[2] == SERIALMSG_RUN: if op_run(s, sreqpkt) == True: print "Loaded image should be running now!" else: print "ERROR: Unable to run loaded image" elif sys.argv[2] == SERIALMSG_ERASE: if op_erase(s, sreqpkt) == True: print "Flash volume has been erased" else: print "ERROR: Unable to erase flash volume" elif sys.argv[2] == SERIALMSG_WRITE: input_file = file(sys.argv[3], 'rb') fileStats = os.stat(sys.argv[3]) if fileStats[stat.ST_SIZE] <= DELUGE_VOLUME_SIZE: #sreqpkt = SerialReqPacket((SERIALMSG_LEDS, 0, 0, 0, [])) #op_leds(s, sreqpkt) sreqpkt = SerialReqPacket((sys.argv[2], 0, 0, 0, [])) if op_write(s, sreqpkt, input_file, fileStats[stat.ST_SIZE]) == True: print "File has been successfully transmitted (" + str(fileStats[stat.ST_SIZE]) + " bytes)" else: print "ERROR: Unable to transmit file" sreqpkt = SerialReqPacket((SERIALMSG_LEDS, 0, 0, 0, [])) op_leds(s, sreqpkt) else: print "ERROR: File is larger than flash volume (" + DELUGE_VOLUME_SIZE + ")" elif sys.argv[2] == SERIALMSG_READ: data = op_print(s, sreqpkt, int(sys.argv[3]), int(sys.argv[4])) if data != True: print "ERROR: Unable to read the specified range" elif sys.argv[2] == SERIALMSG_CRC: remote_crc = op_crc(s, sreqpkt, int(sys.argv[3]), int(sys.argv[4])) if remote_crc != None: print_hex(0, remote_crc) else: print "ERROR: Unable to compute remote CRC" tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoaderFlash/tinyos.py000077500000000000000000000142411207233610700256370ustar00rootroot00000000000000import struct, time, serial class Serial: HDLC_FLAG_BYTE = 0x7e HDLC_CTLESC_BYTE = 0x7d TOS_SERIAL_ACTIVE_MESSAGE_ID = 0 TOS_SERIAL_CC1000_ID = 1 TOS_SERIAL_802_15_4_ID = 2 TOS_SERIAL_UNKNOWN_ID = 255 SERIAL_PROTO_ACK = 67 SERIAL_PROTO_PACKET_ACK = 68 SERIAL_PROTO_PACKET_NOACK = 69 SERIAL_PROTO_PACKET_UNKNOWN = 255 __s = None; # An instance of serial.Serial object __debug = True # Debug mode def __init__(self, port, baudrate): self.__s = serial.Serial(port, baudrate, rtscts=0) def __format_packet(self, packet): return " ".join(["%02x" % p for p in packet]) + " | " + \ " ".join(["%d" % p for p in packet]) def crc16(self, base_crc, frame_data): crc = base_crc for b in frame_data: crc = crc ^ (b << 8) for i in range(0, 8): if crc & 0x8000 == 0x8000: crc = (crc << 1) ^ 0x1021 else: crc = crc << 1 crc = crc & 0xffff return crc def __encode(self, val, dim): output = [] for i in range(dim): output.append(val & 0xFF) val = val >> 8 return output def __decode(self, v): r = long(0) for i in v[::-1]: r = (r << 8) + i return r def __get_byte(self): r = struct.unpack("B", self.__s.read())[0] return r def __put_bytes(self, data): for b in data: self.__s.write(struct.pack('B', b)) def __unescape(self, packet): r = [] esc = False for b in packet: if esc: r.append(b ^ 0x20) esc = False elif b == self.HDLC_CTLESC_BYTE: esc = True else: r.append(b) return r def __escape(self, packet): r = [] for b in packet: if b == self.HDLC_FLAG_BYTE or b == self.HDLC_CTLESC_BYTE: r.append(self.HDLC_CTLESC_BYTE) r.append(b ^ 0x20) else: r.append(b) return r def read_packet(self): d = self.__get_byte() ts = time.time() while d != self.HDLC_FLAG_BYTE: d = self.__get_byte() ts = time.time() packet = [d] d = self.__get_byte() if d == self.HDLC_FLAG_BYTE: d = self.__get_byte() ts = time.time() else: packet.append(d) while d != self.HDLC_FLAG_BYTE: d = self.__get_byte() packet.append(d) un_packet = self.__unescape(packet) crc = self.crc16(0, un_packet[1:-3]) packet_crc = self.__decode(un_packet[-3:-1]) if crc != packet_crc: print "Warning: wrong CRC!" if self.__debug == True: print "Recv:", self.__format_packet(un_packet) return (ts, un_packet) def write_packet(self, am_group, am_id, data): # The first byte after SERIAL_PROTO_PACKET_ACK is a sequence # number that will be send back by the mote to ack the receive of # the data. packet = [self.SERIAL_PROTO_PACKET_ACK, 0, self.TOS_SERIAL_ACTIVE_MESSAGE_ID, 0xff, 0xff, 0, 0, len(data), am_group, am_id] + data; crc = self.crc16(0, packet) packet.append(crc & 0xff) packet.append((crc >> 8) & 0xff) packet = [self.HDLC_FLAG_BYTE] + self.__escape(packet) + [self.HDLC_FLAG_BYTE] if self.__debug == True: print "Send:", self.__format_packet(packet) self.__put_bytes(packet) # Waiting for ACK packet = self.read_packet() if len(packet) > 1 and len(packet[1]) > 1: return ((packet[1])[1] == self.SERIAL_PROTO_ACK) return False def set_debug(self, debug): self.__debug = debug class GenericPacket: """ GenericPacket """ def __decode(self, v): r = long(0) for i in v: r = (r << 8) + i return r def __encode(self, val, dim): output = [] for i in range(dim): output.append(int(val & 0xFF)) val = val >> 8 output.reverse() return output def __init__(self, desc, packet = None): self.__dict__['_schema'] = [(t, s) for (n, t, s) in desc] self.__dict__['_names'] = [n for (n, t, s) in desc] self.__dict__['_values'] = [] offset = 10 if type(packet) == type([]): for (t, s) in self._schema: if t == 'int': self._values.append(self.__decode(packet[offset:offset + s])) offset += s elif t == 'blob': if s: self._values.append(packet[offset:offset + s]) offset += s else: self._values.append(packet[offset:-3]) elif type(packet) == type(()): for i in packet: self._values.append(i) else: for v in self._schema: self._values.append(None) def __repr__(self): return self._values.__repr__() def __str__(self): return self._values.__str__() # Implement the map behavior def __getitem__(self, key): return self.__getattr__(key) def __setitem__(self, key, value): self.__setattr__(key, value) def __len__(self): return len(self._values) def keys(self): return self._names def values(self): return self._names # Implement the struct behavior def __getattr__(self, name): if type(name) == type(0): return self._names[name] else: return self._values[self._names.index(name)] def __setattr__(self, name, value): if type(name) == type(0): self._values[name] = value else: self._values[self._names.index(name)] = value # Custom def names(self): return self._names def sizes(self): return self._schema def payload(self): r = [] for i in range(len(self._schema)): (t, s) = self._schema[i] if t == 'int': r += self.__encode(self._values[i], s) else: r += self._values[i] return r tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoaderFlash/volumes-at45db.xml000066400000000000000000000001451207233610700272300ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tosthreads/tinyld/SerialLoaderFlash/volumes-stm25p.xml000077500000000000000000000001331207233610700272770ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tutorials/000077500000000000000000000000001207233610700167525ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/BlinkConfig/000077500000000000000000000000001207233610700211375ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/BlinkConfig/BlinkConfigAppC.nc000066400000000000000000000045251207233610700244200ustar00rootroot00000000000000// $Id: BlinkConfigAppC.nc,v 1.6 2010-06-29 22:07:40 scipio Exp $ /* * Copyright (c) 2000-2006 The Regents of the University of * California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "StorageVolumes.h" #include "Timer.h" /** * Application to demonstrate the ConfigStorageC abstraction. A timer * period is read from flash, divided by two, and written back to * flash. An LED is toggled each time the timer fires. * * @author Prabal Dutta */ configuration BlinkConfigAppC { } implementation { components BlinkConfigC as App; components new ConfigStorageC(VOLUME_CONFIGTEST); components MainC, LedsC, PlatformC, SerialActiveMessageC; components new TimerMilliC() as Timer0; App.Boot -> MainC.Boot; App.Config -> ConfigStorageC.ConfigStorage; App.Mount -> ConfigStorageC.Mount; App.Leds -> LedsC; App.Timer0 -> Timer0; } tinyos-2.1.2+dfsg/apps/tutorials/BlinkConfig/BlinkConfigC.nc000066400000000000000000000102571207233610700237560ustar00rootroot00000000000000// $Id: BlinkConfigC.nc,v 1.7 2010-06-29 22:07:40 scipio Exp $ /* * Copyright (c) 2000-2006 The Regents of the University of * California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Application to demonstrate the ConfigStorageC abstraction. A timer * period is read from flash, divided by two, and written back to * flash. An LED is toggled each time the timer fires. * * @author Prabal Dutta */ #include module BlinkConfigC { uses { interface Boot; interface Leds; interface ConfigStorage as Config; interface Mount as Mount; interface Timer as Timer0; } } implementation { typedef struct config_t { uint16_t version; uint16_t period; } config_t; enum { CONFIG_ADDR = 0, CONFIG_VERSION = 1, DEFAULT_PERIOD = 1024, MIN_PERIOD = 128, MAX_PERIOD = 1024 }; uint8_t state; config_t conf; event void Boot.booted() { conf.period = DEFAULT_PERIOD; if (call Mount.mount() != SUCCESS) { // Handle failure } } event void Mount.mountDone(error_t error) { if (error == SUCCESS) { if (call Config.valid() == TRUE) { if (call Config.read(CONFIG_ADDR, &conf, sizeof(conf)) != SUCCESS) { // Handle failure } } else { // Invalid volume. Commit to make valid. call Leds.led1On(); if (call Config.commit() == SUCCESS) { call Leds.led0On(); } else { // Handle failure } } } else{ // Handle failure } } event void Config.readDone(storage_addr_t addr, void* buf, storage_len_t len, error_t err) __attribute__((noinline)) { if (err == SUCCESS) { memcpy(&conf, buf, len); if (conf.version == CONFIG_VERSION) { conf.period = conf.period/2; conf.period = conf.period > MAX_PERIOD ? MAX_PERIOD : conf.period; conf.period = conf.period < MIN_PERIOD ? MAX_PERIOD : conf.period; } else { // Version mismatch. Restore default. call Leds.led1On(); conf.version = CONFIG_VERSION; conf.period = DEFAULT_PERIOD; } call Leds.led0On(); call Config.write(CONFIG_ADDR, &conf, sizeof(conf)); } else { // Handle failure. } } event void Config.writeDone(storage_addr_t addr, void *buf, storage_len_t len, error_t err) { // Verify addr and len if (err == SUCCESS) { if (call Config.commit() != SUCCESS) { // Handle failure } } else { // Handle failure } } event void Config.commitDone(error_t err) { call Leds.led0Off(); call Timer0.startPeriodic(conf.period); if (err == SUCCESS) { // Handle failure } } event void Timer0.fired() { call Leds.led2Toggle(); } } tinyos-2.1.2+dfsg/apps/tutorials/BlinkConfig/Makefile000066400000000000000000000000571207233610700226010ustar00rootroot00000000000000COMPONENT=BlinkConfigAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tutorials/BlinkConfig/README.txt000066400000000000000000000023671207233610700226450ustar00rootroot00000000000000$Id: README.txt,v 1.7 2007-04-06 02:48:44 prabal Exp $ README for Config Author/Contact: tinyos-help@millennium.berkeley.edu Description: Application to demonstrate the ConfigStorageC abstraction. A timer period is read from flash, divided by two, and written back to flash. An LED is toggled each time the timer fires. To use this application: (i) Program a mote with this application (e.g. make telos install) (ii) Wait until the red LED turns off (writing to flash is done) (iii) Power cycle the mote and wait until the red LED turns off. (iv) Repeat step (iii) and notice that the blink rate of the blue (yellow) LED doubles each time the mote is power cycled. The blink rate cycles through the following values: 1Hz, 2Hz, 4Hz, and 8Hz. The first two times this application is installed, the green LED will light up and remain on (the first time indicating that the storage volume is not valid and second time that the volume does not have the expected version number). The red LED will remain lit during the flash write/commit operation. The blue (yellow) LED blinks with the period stored and read from flash. See Lesson 7 for details. Tools: Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tutorials/BlinkConfig/volumes-at45db.xml000066400000000000000000000001621207233610700244330ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tutorials/BlinkConfig/volumes-stm25p.xml000066400000000000000000000001641207233610700245040ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tutorials/BlinkFail/000077500000000000000000000000001207233610700206055ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/BlinkFail/BlinkFailAppC.nc000066400000000000000000000051521207233610700235310ustar00rootroot00000000000000// $Id: BlinkFailAppC.nc,v 1.3 2010-06-29 22:07:40 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * BlinkFail is a basic application that toggles the a mote LED periodically and * then accesses out of bounds storage as a demonstration and sanity check for * Safe TinyOS. * * @author tinyos-help@millennium.berkeley.edu **/ configuration BlinkFailAppC { } implementation { components MainC, BlinkFailC, LedsC; components new TimerMilliC() as Timer0; components new TimerMilliC() as Timer1; components new TimerMilliC() as Timer2; BlinkFailC -> MainC.Boot; BlinkFailC.Timer0 -> Timer0; BlinkFailC.Timer1 -> Timer1; BlinkFailC.Timer2 -> Timer2; BlinkFailC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tutorials/BlinkFail/BlinkFailC.nc000066400000000000000000000060411207233610700230660ustar00rootroot00000000000000// $Id: BlinkFailC.nc,v 1.3 2010-06-29 22:07:40 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implementation for BlinkFail application. Toggle the LEDs when a * Timer fires. Access out of bounds storage after a few seconds. **/ #include "Timer.h" module BlinkFailC @safe() { uses interface Timer as Timer0; uses interface Timer as Timer1; uses interface Timer as Timer2; uses interface Leds; uses interface Boot; } implementation { event void Boot.booted() { call Timer0.startPeriodic( 250 ); call Timer1.startPeriodic( 500 ); call Timer2.startPeriodic( 1000 ); } event void Timer0.fired() { dbg("BlinkFailC", "Timer 0 fired @ %s.\n", sim_time_string()); call Leds.led0Toggle(); } int a[10]; int i; event void Timer1.fired() { dbg("BlinkFailC", "Timer 1 fired @ %s \n", sim_time_string()); call Leds.led1Toggle(); // here we violate memory safety on the 11th signal of this event a[i++] = 1; } event void Timer2.fired() { dbg("BlinkFailC", "Timer 2 fired @ %s.\n", sim_time_string()); call Leds.led2Toggle(); } } tinyos-2.1.2+dfsg/apps/tutorials/BlinkFail/Makefile000066400000000000000000000000561207233610700222460ustar00rootroot00000000000000COMPONENT=BlinkFailAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tutorials/BlinkFail/README.txt000066400000000000000000000016611207233610700223070ustar00rootroot00000000000000README for Blink Author/Contact: tinyos-help@millennium.berkeley.edu Description: BlinkFail is based on Blink (described below). It is designed to violate memory safety after a few seconds and is used as a demonstration and sanity check for Safe TinyOS. For more information about Safe TinyOS see here: http://www.cs.utah.edu/~coop/safetinyos/ Blink is a simple application that blinks the 3 mote LEDs. It tests that the boot sequence and millisecond timers are working properly. The three LEDs blink at 1Hz, 2Hz, and 4Hz. Because each is driven by an independent timer, visual inspection can determine whether there are bugs in the timer system that are causing drift. Note that this method is different than RadioCountToLeds, which fires a single timer at a steady rate and uses the bottom three bits of a counter to display on the LEDs. Tools: Known bugs/limitations: None. $Id: README.txt,v 1.2 2008-07-03 18:41:36 regehr Exp $ tinyos-2.1.2+dfsg/apps/tutorials/BlinkTask/000077500000000000000000000000001207233610700206345ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/BlinkTask/BlinkTaskAppC.nc000066400000000000000000000044471207233610700236150ustar00rootroot00000000000000// $Id: BlinkTaskAppC.nc,v 1.5 2010-06-29 22:07:40 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * @author tinyos-help@millennium.berkeley.edu **/ configuration BlinkTaskAppC { } implementation { components MainC, BlinkTaskC, LedsC; components new TimerMilliC() as Timer0; BlinkTaskC -> MainC.Boot; BlinkTaskC.Timer0 -> Timer0; BlinkTaskC.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tutorials/BlinkTask/BlinkTaskC.nc000066400000000000000000000050671207233610700231530ustar00rootroot00000000000000// $Id: BlinkTaskC.nc,v 1.5 2010-06-29 22:07:40 scipio Exp $ /* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * */ /** * BlinkTask demo application: simple example of posting a task in TinyOS. * * @author Kristin Wright * */ /** * Blink Led0 every second. For expository purposes, use a task to * toggle the LED. **/ #include "Timer.h" module BlinkTaskC { uses interface Timer as Timer0; uses interface Leds; uses interface Boot; } implementation { task void toggle() { call Leds.led0Toggle(); } event void Boot.booted() { call Timer0.startPeriodic( 1000 ); } event void Timer0.fired() { post toggle(); } } tinyos-2.1.2+dfsg/apps/tutorials/BlinkTask/Makefile000066400000000000000000000000571207233610700222760ustar00rootroot00000000000000COMPONENT=BlinkTaskAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tutorials/BlinkTask/README.txt000066400000000000000000000006521207233610700223350ustar00rootroot00000000000000$Id: README.txt,v 1.4 2006-12-12 18:22:52 vlahan Exp $ README for BlinkTask Author/Contact: tinyos-help@millennium.berkeley.edu Description: The BlinkTask application: a simple example of how to post a task in TinyOS. A periodic timer is set to fire every second. The Timer.fired() event posts a task to toggle the LEDs rather than toggling the LEDs directly. Tools: None Known bugs/limitations: None.tinyos-2.1.2+dfsg/apps/tutorials/BlinkToRadio/000077500000000000000000000000001207233610700212735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/BlinkToRadio/BlinkToRadio.h000066400000000000000000000004271207233610700237700ustar00rootroot00000000000000// $Id: BlinkToRadio.h,v 1.4 2006-12-12 18:22:52 vlahan Exp $ #ifndef BLINKTORADIO_H #define BLINKTORADIO_H enum { AM_BLINKTORADIO = 6, TIMER_PERIOD_MILLI = 250 }; typedef nx_struct BlinkToRadioMsg { nx_uint16_t nodeid; nx_uint16_t counter; } BlinkToRadioMsg; #endif tinyos-2.1.2+dfsg/apps/tutorials/BlinkToRadio/BlinkToRadioAppC.nc000066400000000000000000000055041207233610700247060ustar00rootroot00000000000000// $Id: BlinkToRadioAppC.nc,v 1.5 2010-06-29 22:07:40 scipio Exp $ /* * Copyright (c) 2000-2006 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Application file for the BlinkToRadio application. A counter is * incremented and a radio message is sent whenever a timer fires. * Whenever a radio message is received, the three least significant * bits of the counter in the message payload are displayed on the * LEDs. Program two motes with this application. As long as they * are both within range of each other, the LEDs on both will keep * changing. If the LEDs on one (or both) of the nodes stops changing * and hold steady, then that node is no longer receiving any messages * from the other node. * * @author Prabal Dutta * @date Feb 1, 2006 */ #include #include "BlinkToRadio.h" configuration BlinkToRadioAppC { } implementation { components MainC; components LedsC; components BlinkToRadioC as App; components new TimerMilliC() as Timer0; components ActiveMessageC; components new AMSenderC(AM_BLINKTORADIO); components new AMReceiverC(AM_BLINKTORADIO); App.Boot -> MainC; App.Leds -> LedsC; App.Timer0 -> Timer0; App.Packet -> AMSenderC; App.AMPacket -> AMSenderC; App.AMControl -> ActiveMessageC; App.AMSend -> AMSenderC; App.Receive -> AMReceiverC; } tinyos-2.1.2+dfsg/apps/tutorials/BlinkToRadio/BlinkToRadioC.nc000066400000000000000000000077501207233610700242520ustar00rootroot00000000000000// $Id: BlinkToRadioC.nc,v 1.6 2010-06-29 22:07:40 scipio Exp $ /* * Copyright (c) 2000-2006 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Implementation of the BlinkToRadio application. A counter is * incremented and a radio message is sent whenever a timer fires. * Whenever a radio message is received, the three least significant * bits of the counter in the message payload are displayed on the * LEDs. Program two motes with this application. As long as they * are both within range of each other, the LEDs on both will keep * changing. If the LEDs on one (or both) of the nodes stops changing * and hold steady, then that node is no longer receiving any messages * from the other node. * * @author Prabal Dutta * @date Feb 1, 2006 */ #include #include "BlinkToRadio.h" module BlinkToRadioC { uses interface Boot; uses interface Leds; uses interface Timer as Timer0; uses interface Packet; uses interface AMPacket; uses interface AMSend; uses interface Receive; uses interface SplitControl as AMControl; } implementation { uint16_t counter; message_t pkt; bool busy = FALSE; void setLeds(uint16_t val) { if (val & 0x01) call Leds.led0On(); else call Leds.led0Off(); if (val & 0x02) call Leds.led1On(); else call Leds.led1Off(); if (val & 0x04) call Leds.led2On(); else call Leds.led2Off(); } event void Boot.booted() { call AMControl.start(); } event void AMControl.startDone(error_t err) { if (err == SUCCESS) { call Timer0.startPeriodic(TIMER_PERIOD_MILLI); } else { call AMControl.start(); } } event void AMControl.stopDone(error_t err) { } event void Timer0.fired() { counter++; if (!busy) { BlinkToRadioMsg* btrpkt = (BlinkToRadioMsg*)(call Packet.getPayload(&pkt, sizeof(BlinkToRadioMsg))); if (btrpkt == NULL) { return; } btrpkt->nodeid = TOS_NODE_ID; btrpkt->counter = counter; if (call AMSend.send(AM_BROADCAST_ADDR, &pkt, sizeof(BlinkToRadioMsg)) == SUCCESS) { busy = TRUE; } } } event void AMSend.sendDone(message_t* msg, error_t err) { if (&pkt == msg) { busy = FALSE; } } event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len){ if (len == sizeof(BlinkToRadioMsg)) { BlinkToRadioMsg* btrpkt = (BlinkToRadioMsg*)payload; setLeds(btrpkt->counter); } return msg; } } tinyos-2.1.2+dfsg/apps/tutorials/BlinkToRadio/Makefile000066400000000000000000000000611207233610700227300ustar00rootroot00000000000000COMPONENT=BlinkToRadioAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tutorials/BlinkToRadio/README.txt000066400000000000000000000013371207233610700227750ustar00rootroot00000000000000$Id: README.txt,v 1.4 2006-12-12 18:22:52 vlahan Exp $ README for Blink Author/Contact: tinyos-help@millennium.berkeley.edu Description: The BlinkToRadio application. A counter is incremented and a radio message is sent whenever a timer fires. Whenever a radio message is received, the three least significant bits of the counter in the message payload are displayed on the LEDs. Program two motes with this application. As long as they are both within range of each other, the LEDs on both will keep changing. If the LEDs on one (or both) of the nodes stops changing and hold steady, then that node is no longer receiving any messages from the other node. Tools: None Known bugs/limitations: None.tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/000077500000000000000000000000001207233610700220575ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/Base/000077500000000000000000000000001207233610700227315ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/Base/LowPowerSensingBaseAppC.nc000066400000000000000000000063771207233610700277340ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #include "LowPowerSensingConstants.h" configuration LowPowerSensingBaseAppC{} implementation { components MainC, LowPowerSensingBaseC as App; components new QueueC(message_t, MSG_QUEUE_SIZE) as Queue; components LedsC; MainC.Boot <- App; App.MsgQueue -> Queue; App.Leds -> LedsC; components SerialActiveMessageC as Serial; App.SerialAMControl -> Serial; App.SerialAMPacket -> Serial; App.SerialPacket -> Serial; components ActiveMessageC as Radio; App.RadioAMControl -> Radio; App.RadioAMPacket -> Radio; App.RadioPacket -> Radio; components new SerialAMReceiverC(AM_SERIAL_REQUEST_SAMPLES_MSG) as SerialRequestSampleMsgsReceiver; components new AMSenderC(AM_REQUEST_SAMPLES_MSG) as RadioRequestSampleMsgsSender; App.SerialRequestSampleMsgsReceive -> SerialRequestSampleMsgsReceiver; App.RadioRequestSampleMsgsSend -> RadioRequestSampleMsgsSender; components new AMReceiverC(AM_SAMPLE_MSG) as RadioSampleMsgReceiver; components new SerialAMSenderC(AM_SERIAL_SAMPLE_MSG) as SerialSampleMsgSender; App.RadioSampleMsgReceive -> RadioSampleMsgReceiver; App.SerialSampleMsgSend -> SerialSampleMsgSender; //Nasty hack since no uniform way of prividing LPL support as of yet #if defined(PLATFORM_TELOSB) || defined(PLATFORM_TMOTE) || defined(PLATFORM_MICAZ) || defined(PLATFORM_Z1) components CC2420ActiveMessageC as LPLProvider; App.LPL -> LPLProvider; #endif #if defined(PLATFORM_MICA2) components CC1000CsmaRadioC as LPLProvider; App.LPL -> LPLProvider; #endif #if defined(PLATFORM_IRIS) || defined(PLATFORM_UCMINI) components ActiveMessageC as LPLProvider; App.LPL -> LPLProvider; #endif } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/Base/LowPowerSensingBaseC.nc000066400000000000000000000105441207233610700272620ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #include "LowPowerSensingConstants.h" module LowPowerSensingBaseC { uses { interface Boot; interface Queue as MsgQueue; interface Leds; interface LowPowerListening as LPL; interface SplitControl as SerialAMControl; interface AMPacket as SerialAMPacket; interface Packet as SerialPacket; interface SplitControl as RadioAMControl; interface AMPacket as RadioAMPacket; interface Packet as RadioPacket; interface Receive as SerialRequestSampleMsgsReceive; interface AMSend as RadioRequestSampleMsgsSend; interface Receive as RadioSampleMsgReceive; interface AMSend as SerialSampleMsgSend; } } implementation { bool serialSending; am_addr_t dest_addr; message_t request_samples_msg; message_t sample_msg; serial_sample_msg_t* sample_msg_payload; event void Boot.booted() { serialSending = FALSE; sample_msg_payload = (serial_sample_msg_t*)call SerialPacket.getPayload(&sample_msg, sizeof(serial_sample_msg_t)); call RadioAMControl.start(); } event void RadioAMControl.startDone(error_t error) { call SerialAMControl.start(); } event void SerialAMControl.startDone(error_t error) { } event void RadioAMControl.stopDone(error_t error) { } event void SerialAMControl.stopDone(error_t error) { } event message_t* SerialRequestSampleMsgsReceive.receive(message_t* msg, void* payload, uint8_t len) { serial_request_samples_msg_t* request_msg = payload; call Leds.led0On(); call LPL.setRemoteWakeupInterval(&request_samples_msg, LPL_INTERVAL+100); call RadioRequestSampleMsgsSend.send(request_msg->addr, &request_samples_msg, sizeof(request_samples_msg_t)); return msg; } event void RadioRequestSampleMsgsSend.sendDone(message_t* msg, error_t error) { if(error == SUCCESS) call Leds.led0Off(); } event message_t* RadioSampleMsgReceive.receive(message_t* msg, void* payload, uint8_t len) { call Leds.led2Toggle(); if(call MsgQueue.empty() == FALSE || serialSending == TRUE) call MsgQueue.enqueue(*msg); else { sample_msg_payload->src_addr = call RadioAMPacket.source(msg); sample_msg_payload->sample = *((nx_sensor_sample_t*)payload); dest_addr = call SerialAMPacket.destination(msg); serialSending = TRUE; call SerialSampleMsgSend.send(dest_addr, &sample_msg, sizeof(*sample_msg_payload)); } return msg; } event void SerialSampleMsgSend.sendDone(message_t* msg, error_t error) { if(call MsgQueue.empty() == FALSE) { sample_msg = call MsgQueue.dequeue(); dest_addr = call SerialAMPacket.destination(msg); call SerialSampleMsgSend.send(dest_addr, &sample_msg, sizeof(serial_sample_msg_t)); } else serialSending = FALSE; } } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/Base/Makefile000066400000000000000000000003311207233610700243660ustar00rootroot00000000000000COMPONENT=LowPowerSensingBaseAppC CFLAGS += -I.. -I../universal_sensors CFLAGS += -DLOW_POWER_LISTENING #CFLAGS += -I.. -I../tmote_onboard_sensors #CFLAGS += -DCC1K_DEFAULT_FREQ=CC1K_914_077_MHZ include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/Base/volumes-at45db.xml000066400000000000000000000001171207233610700262250ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/Base/volumes-stm25p.xml000066400000000000000000000001101207233610700262650ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/LowPowerSensingConstants.h000066400000000000000000000037341207233610700272410ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #ifndef LOWPOWERSENSINGCONSTANTS_H #define LOWPOWERSENSINGCONSTANTS_H #ifndef LOWPOWERSENSING_JAVA_MAKEFILE #include "StorageVolumes.h" #endif #include "LowPowerSensingMsgs.h" enum { LPL_INTERVAL = 2000, SAMPLING_INTERVAL = 3000, MSG_QUEUE_SIZE = 50, BASE_STATION_ADDR = 0, }; #endif //LOWPOWERSENSINGCONSTANTS_H tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/LowPowerSensingMsgs.h000066400000000000000000000045521207233610700261750ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #ifndef LOWPOWERSENSINGMSGS_H #define LOWPOWERSENSINGMSGS_H #include "message.h" #include "SensorSample.h" enum { AM_SERIAL_REQUEST_SAMPLES_MSG = 0x92, AM_REQUEST_SAMPLES_MSG = 0x93, AM_SAMPLE_MSG = 0x98, AM_SERIAL_SAMPLE_MSG = 0x99, }; typedef nx_struct serial_request_samples_msg { nx_am_addr_t addr; nx_uint32_t sample_num; } serial_request_samples_msg_t; typedef nx_struct request_samples_msg { } request_samples_msg_t; typedef nx_struct sample_msg { nx_sensor_sample_t sample; } sample_msg_t; typedef nx_struct serial_sample_msg { nx_am_addr_t src_addr; nx_sensor_sample_t sample; } serial_sample_msg_t; #endif //LOWPOWERSENSINGMSGS_H tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/README000066400000000000000000000212031207233610700227350ustar00rootroot00000000000000======================================================================== README: LowPowerSensing Application Created: 2-March-2008 Author: Kevin Klues (klueska@cs.stanford.edu) ======================================================================== This README is intended to give an overview of the organizational structure of the LowPowerSensing Application application as well as how to best utilize and customize some of the features it contains. This document is divided into three sections. The first section contains an overview of how the application is organized and what it is capable of doing. The second section gives instructions on how to install the application and interact with it from your PC. The third section demonstrates how to customize the application to meet your particualr needs. ------------------------------------------------------------------------ Organizational Structure and Overview ------------------------------------------------------------------------ The LowPowerSensing application is actually made up of three separate mini-applications: one mote base station application, one mote sampling application, and one java based application used to interact with the mote applications. The code for all three applications is divided up among several directories: LowPowerSensing ./Base ./java ./sampleLog ./Sampler ./tmote_onboard_sensors ./universal_sensors The code specific to the base station aplication is contained under the 'Base' directory, and code for the sampling application is found under 'Sampler'. Code shared between them is found either in the top level directory (LowPowerSensing) or in the subdirectories 'sampleLog', 'tmote_onboard_sensors', and 'universal_sensors'. Code for the java application is found in the 'java' directory. Now the application itself is fairly straightforward. The sampler application periodically takes some sensor readings, logs them to flash, and waits for requests from the base station to stream out the contents or its flash over the radio. Requests originate from end users of the java application and simply get forwarded on to a mote running the sampler application through the base station application. Conversely, whenever the base station receives any packets from the sampler application, it forwards these packets back to the java application for further processing. Any number of motes running the sampler application can exist simultaneously, and data can be requested from them using a unique address assigned to each of them. What sensors are sampled, the periodicity of sampling, and the check interval for performing LowPowerListening the are all configurable options that can easily be set by the user at compile time. This application is admittedly *not* robust in the sense that no reliable transfer protocol is implemented for the exchange of data, data can only be retreived from one mote at a time, and there is no code anywhere to recover from node failures at any point in time. This application is intended more for demonstration purposes, and as a starting point for developers learning how to write low power sensornet applications. Enjoy! ------------------------------------------------------------------------ Installation Instructions and Running the Applications ------------------------------------------------------------------------ The default configuration of the LowPowerSensing applcation has been designed to compile and run on any platform that supports LowPowerListening and has a LogStorage component defined for its external flash (i.e. telos, mica2, micaz, eyesIFX, etc.). For purposes of illustration the instructions below are given for installation on the telosb platform, but should be applicable to other platforms as well. To run the LowPowerSensing application with its default configuration do the following: 1) Install the base station application on a mote and connect it to your PC via whatever serial interface you normally use to communicate with it. IMPORTANT: the base station mote must be installed with address 0 cd Base make telosb install.0 2) Install the sampler application on a mote. You can install this application on any number of motes, remembering to change the TOS_NODE_ID of each installation instance (in the example below I use 5, 10, and 20, but any number is acceptable as long as its not 0). cd Sampler make telosb install.5 make telosb install.10 make telosb install.20 3) Compile and run the java application. You first need to start up an instance of serial forwarder to do so. cd java make java net.tinyos.sf.SerialForwarder -comm serial@/dev/ttyUSB0:telosb & java LowePowerSensingApp After starting the java application you will be presented with a user prompt that looks like: Enter 's' to request samples >> Just type 's' and hit enter in order to request samples from one of your sampler motes. After doing so, you will be presented with a prompt for the address of the mote from which you are requesting data. You should enter the TOS_NODE_ID of one of the motes you installed the sampler application on before. Enter Address: Once the address has been entered, a request message will be sent from the java application through the base station mote and out to the mote running the sampling application. Once the sampler mote receives this request, it will start streaming back any data it has logged to flash since the last time a request was received. If this is the first request message it is receiving, it will send all of the samples back that it has logged since the time it was booted up. ------------------------------------------------------------------------ Changing the default Configuration ------------------------------------------------------------------------ The LowPowerSensing Application is set up by default to use a software based Sinusoidal generator sensor with a sampling period of 3s, and an LPL check interval of 2s. The code for using this sensor can be found in the 'universal_sensors' directory. The pattern followed by the set of files found in this directory can be used to setup other types of sensors for sampling by the LowPowerSensing application. If you take a look in the 'tmote_onboard_sensors' directory you will see the exact same set of files as you do in the 'universal_sensors' directory. Of course, these files are set up to use the set of sensors found onboard the tmote sky motes: namely a temperature sensor, a humidity sensor, a photo active sensor, and a total solar sensor. Because the files in each directory are named identically, we can tell the LowPowerSensing application which set of sensors to expect completely at compile time by simply setting a few compiler flags. So if you happen to have a tmote laying around and you want to sample its onboard sensors instead of using the default sinusoidal sensor you need to do the following: Open up the makefiles for both the the Sampler and Base station applications and change this line: CFLAGS += -I.. -I../sampleLog -I../universal_sensors to CFLAGS += -I.. -I../sampleLog -I../tmote_onboard_sensors Additionally, to allow the java application to recognize the new types of sensors being sampled you need to change this line in the makefile of the java directory: SENSOR_DIR = universal_sensors to SENSOR_DIR = tmote_onboard_sensors And thats it. You should now be sampling the oboard tmote sensors instead of the sinusoaidal one. If you wish to create a custom set of sensors to sample using the LowPowerSensing application (such as those from one of the mica sensorboards), just follow the pattern found in the 'universal_sensors' and 'tmote_onboard_sensors' and then change the compiler flags appropriately. Additionally, if you wish to change the LowPowerListening check interval or the sampling period of the Sampler application you can eitheropen up the 'LowPowerSensingConsants.h' file and directly change them there, or pass new values for them at compile time through the makefile (all values are in binary milliseconds i.e. 1s is specified as 1024 not 1000). To change them via the makefile add lines such as the following to your makefile in both the Base and Sampler application directories (its important that its in both makefiles for the LPL check interval, but only necessary in the Sampler application if you are only changing the sampling period): PFLAGS += -DSAMPLING_INTERVAL=10000 PFLAGS += -DLPL_INTERVAL=3000 PFLAGS += -DSAMPLING_INTERVAL=10000 -DLPL_INTERVAL=3000 And that should be it. The rest of it involves sifting through the code and figuring out how the application does what it does. If you have any questions feel free to email me (Kevin) at klueska@cs.stanford.edu . tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/Sampler/000077500000000000000000000000001207233610700234625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/Sampler/LowPowerSensingPeriodicSamplerAppC.nc000066400000000000000000000057071207233610700326710ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #include "LowPowerSensingConstants.h" #include "SensorSample.h" configuration LowPowerSensingPeriodicSamplerAppC {} implementation { components new SamplePeriodicLogC(SAMPLING_INTERVAL, VOLUME_SENSOR_SAMPLES); components MainC, LowPowerSensingPeriodicSamplerC as App; components SampleNxConverterC; MainC.Boot <- App; App.SampleLogRead -> SamplePeriodicLogC; App.SampleNxConverter -> SampleNxConverterC; components ActiveMessageC; App.AMControl -> ActiveMessageC; App.AMPacket -> ActiveMessageC; App.Packet -> ActiveMessageC; components new AMSenderC(AM_SAMPLE_MSG) as SampleSender; App.SampleSend -> SampleSender; components new AMReceiverC(AM_REQUEST_SAMPLES_MSG) as RequestSamplesReceiver; App.RequestSamplesReceive -> RequestSamplesReceiver; components LedsC as LedsC; App.Leds -> LedsC; //Nasty hack since no uniform way of prividing LPL support as of yet #if defined(PLATFORM_TELOSB) || defined(PLATFORM_TMOTE) || defined(PLATFORM_MICAZ) || \ defined(PLATFORM_Z1) components CC2420ActiveMessageC as LPLProvider; App.LPL -> LPLProvider; #endif #if defined(PLATFORM_MICA2) components CC1000CsmaRadioC as LPLProvider; App.LPL -> LPLProvider; #endif #if defined(PLATFORM_IRIS) || defined(PLATFORM_UCMINI) components ActiveMessageC as LPLProvider; App.LPL -> LPLProvider; #endif } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/Sampler/LowPowerSensingPeriodicSamplerC.nc000066400000000000000000000073561207233610700322320ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #include "LowPowerSensingConstants.h" #include "SensorSample.h" module LowPowerSensingPeriodicSamplerC { uses { interface Boot; interface SampleLogRead; interface SampleNxConverter; interface Leds; interface SplitControl as AMControl; interface AMPacket; interface Packet; interface AMSend as SampleSend; interface Receive as RequestSamplesReceive; interface LowPowerListening as LPL; } } implementation { message_t sample_msg; bool sendBusy = FALSE; task void readNextTask(); task void sendSampleMsgTask(); void readNext() { error_t error = call SampleLogRead.readNext(); if(error == FAIL) post readNextTask(); else if(error == ECANCEL) { sendBusy = FALSE; call Leds.led1Toggle(); } } void sendSampleMsg() { call LPL.setRemoteWakeupInterval(&sample_msg, 0); if(call SampleSend.send(BASE_STATION_ADDR, &sample_msg, sizeof(nx_sensor_sample_t)) != SUCCESS) post sendSampleMsgTask(); else call Leds.led2On(); } task void readNextTask() { readNext(); } task void sendSampleMsgTask() { sendSampleMsg(); } event void Boot.booted() { call LPL.setLocalWakeupInterval(LPL_INTERVAL); call AMControl.start(); } event void AMControl.startDone(error_t e) { if(e != SUCCESS) call AMControl.start(); } event void AMControl.stopDone(error_t e) { } event void SampleLogRead.readDone(sensor_sample_t* sample, error_t error) { if(error == SUCCESS) { nx_sensor_sample_t* nx_sample = call SampleSend.getPayload(&sample_msg, sizeof(nx_sample)); call SampleNxConverter.copyToNx(nx_sample, sample); sendSampleMsg(); } else post readNextTask(); } event message_t* RequestSamplesReceive.receive(message_t* msg, void* payload, uint8_t len) { call Leds.led0Toggle(); if(sendBusy == FALSE) { sendBusy = TRUE; readNext(); } return msg; } event void SampleSend.sendDone(message_t* msg, error_t error) { if(error != SUCCESS) post sendSampleMsgTask(); else { call Leds.led2Off(); readNext(); } } } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/Sampler/Makefile000066400000000000000000000004021207233610700251160ustar00rootroot00000000000000COMPONENT=LowPowerSensingPeriodicSamplerAppC CFLAGS += -I.. -I../sampleLog CFLAGS += -I.. -I../universal_sensors CFLAGS += -DLOW_POWER_LISTENING #CFLAGS += -I.. -I../tmote_onboard_sensors #CFLAGS += -DCC1K_DEFAULT_FREQ=CC1K_914_077_MHZ include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/Sampler/volumes-at45db.xml000066400000000000000000000001171207233610700267560ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/Sampler/volumes-stm25p.xml000066400000000000000000000001171207233610700270250ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/java/000077500000000000000000000000001207233610700230005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/java/LowPowerSensingApp.java000066400000000000000000000062101207233610700274100ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ import net.tinyos.message.*; import net.tinyos.util.*; import java.io.*; /** */ public class LowPowerSensingApp implements MessageListener { MoteIF mote; /* Main entry point */ void run() { mote = new MoteIF(PrintStreamMessenger.err); mote.registerListener(new SerialSampleMsg(), this); } synchronized public void messageReceived(int dest_addr, Message msg) { if (msg instanceof SerialSampleMsg) { System.out.print(msg.toString()); } } synchronized public void requestSamples(int addr) { SerialRequestSamplesMsg msg = new SerialRequestSamplesMsg(); msg.set_addr(addr); try { mote.send(MoteIF.TOS_BCAST_ADDR, msg); } catch (IOException e) { System.err.println("Cannot send message to mote"); } } public static void main(String[] args) { LowPowerSensingApp me = new LowPowerSensingApp(); me.run(); InputStreamReader cin = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(cin); String input = ""; System.out.print("Enter 's' to request samples\n"); System.out.print(">> "); for(;;) { try { input = in.readLine(); if(input.equals("s")) { System.out.print("Enter Address: "); input = in.readLine(); me.requestSamples(Integer.parseInt(input)); } else System.out.println("Invalid Input!!!!: "); System.out.print(">> "); } catch (IOException e) { System.out.print("Error On Input!!"); } } } } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/java/Makefile000066400000000000000000000020671207233610700244450ustar00rootroot00000000000000GEN=SerialRequestSamplesMsg.java SerialSampleMsg.java Constants.java SENSOR_DIR = universal_sensors #SENSOR_DIR = tmote_onboard_sensors SENSOR_DEPS = ../$(SENSOR_DIR)/SensorSample.h all: LowPowerSensingApp.jar LowPowerSensingApp.jar: LowPowerSensingApp.class jar cf $@ *.class SerialRequestSamplesMsg.java: ../LowPowerSensingMsgs.h $(SENSOR_DEPS) mig -I../$(SENSOR_DIR) -target=null \ -java-classname=SerialRequestSamplesMsg java ../LowPowerSensingMsgs.h serial_request_samples_msg -o $@ SerialSampleMsg.java: ../LowPowerSensingMsgs.h $(SENSOR_DEPS) mig -I../$(SENSOR_DIR) -target=null \ -java-classname=SerialSampleMsg java ../LowPowerSensingMsgs.h serial_sample_msg -o $@ Constants.java: ../LowPowerSensingConstants.h ncg -I../$(SENSOR_DIR) -DLOWPOWERSENSING_JAVA_MAKEFILE -target=null \ -java-classname=Constants java ../LowPowerSensingConstants.h BASE_STATION_ADDR SAMPLING_INTERVAL \ MSG_QUEUE_SIZE LPL_INTERVAL -o $@ LowPowerSensingApp.class: $(wildcard *.java) $(GEN) javac *.java clean: rm -f *.class $(GEN) veryclean: clean rm -f LowPowerSensingApp.jar tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/sampleLog/000077500000000000000000000000001207233610700240025ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/sampleLog/GenericSensorSample.h000066400000000000000000000040031207233610700300600ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #ifndef GENERICSENSORSAMPLE_H #define GENERICSENSORSAMPLE_H typedef struct generic_sensor_sample { uint32_t sample_num; sensor_type_t values[num_sensors]; } generic_sensor_sample_t; typedef union generic_sensor_sample_type_union { uint8_t u8; uint16_t u16; uint32_t u32; sensor_type_t st; } generic_sensor_sample_type_union_t; #endif //GENERICSENSORSAMPLE_H tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/sampleLog/PeriodicSampleLogger16C.nc000066400000000000000000000041611207233610700306400ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ generic configuration PeriodicSampleLogger16C(uint32_t period, uint8_t num_sensors){ uses { interface Boot; interface LogWrite; interface Read as Sensor[uint8_t]; } } implementation { Boot = Logger.Boot; Sensor = Logger; components new PeriodicSampleLoggerP(period, num_sensors, uint16_t) as Logger; components new TimerMilliC(); Logger.LogWrite = LogWrite; Logger.Timer -> TimerMilliC; components NoLedsC as LedsC; Logger.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/sampleLog/PeriodicSampleLoggerP.nc000066400000000000000000000075561207233610700305210ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ generic module PeriodicSampleLoggerP(uint32_t period_ms, uint8_t num_sensors, typedef sensor_type_t) { uses { interface Boot; interface Read as Sensor[uint8_t]; interface Timer as Timer; interface LogWrite; interface Leds; } } implementation { #include "GenericSensorSample.h" generic_sensor_sample_t sample[2]; generic_sensor_sample_t* current_sample; uint8_t current_sample_id; task void eraseTask(); task void appendTask(); void readSensors() { int i; for(i=0; ivalues[i] = val; call Leds.led1Toggle(); } else { current_sample->values[i] = ((generic_sensor_sample_type_union_t)(0xFFFFFFFF)).st; call Leds.led2Toggle(); } } event void LogWrite.appendDone(void* buf, storage_len_t len, bool recordsLost, error_t error){ if(error != SUCCESS) post appendTask(); else ((generic_sensor_sample_t*)buf)->sample_num+=2; } event void LogWrite.syncDone(error_t error) {} default command error_t Sensor.read[uint8_t i]() {return SUCCESS;} } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/sampleLog/SampleLogRead.nc000066400000000000000000000034611207233610700270070ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ interface SampleLogRead { command error_t readFirst(); command error_t readNext(); event void readDone(sample_type_t* entry, error_t error); } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/sampleLog/SampleLogReaderC.nc000066400000000000000000000037671207233610700274520ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ generic configuration SampleLogReaderC(typedef sample_type_t) { provides { interface SampleLogRead; } uses { interface LogRead; interface LogWrite; } } implementation { components new SampleLogReaderP(sample_type_t) as LogReader; SampleLogRead = LogReader; LogReader.LogRead = LogRead; LogReader.LogWrite = LogWrite; } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/sampleLog/SampleLogReaderP.nc000066400000000000000000000056261207233610700274630ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ generic module SampleLogReaderP(typedef sample_type_t) { provides { interface SampleLogRead; } uses { interface LogRead; interface LogWrite; } } implementation { sample_type_t sample; storage_cookie_t writeLocation; command error_t SampleLogRead.readFirst() { return call LogRead.seek(SEEK_BEGINNING); } command error_t SampleLogRead.readNext() { atomic writeLocation = call LogWrite.currentOffset(); if(call LogRead.currentOffset() == writeLocation) return ECANCEL; else return call LogRead.read(&sample, sizeof(sample)); } event void LogRead.readDone(void* buf, storage_len_t len, error_t error) { signal SampleLogRead.readDone((sample_type_t*)buf, error); } event void LogRead.seekDone(error_t error) { if(error == SUCCESS) { error = call SampleLogRead.readNext(); if(error != SUCCESS) signal SampleLogRead.readDone(&sample, error); } else signal SampleLogRead.readDone(&sample, error); } event void LogWrite.appendDone(void* buf, storage_len_t len, bool recordsLost, error_t error) {} event void LogWrite.eraseDone(error_t error) {} event void LogWrite.syncDone(error_t error) {} default event void SampleLogRead.readDone(sample_type_t* s, error_t error) {} } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/sampleLog/SampleNxConverter.nc000066400000000000000000000035331207233610700277470ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #include "SensorSample.h" interface SampleNxConverter { command void copyToNx(nx_sensor_sample_t* dest, sensor_sample_t* src); command void copyFromNx(sensor_sample_t* dest, nx_sensor_sample_t* src); } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/tmote_onboard_sensors/000077500000000000000000000000001207233610700264675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/tmote_onboard_sensors/SampleNxConverterC.nc000066400000000000000000000045321207233610700325370ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #include "SensorSample.h" module SampleNxConverterC { provides interface SampleNxConverter; } implementation { command void SampleNxConverter.copyToNx(nx_sensor_sample_t* dest, sensor_sample_t* src) { dest->sample_num = src->sample_num; dest->humidity = src->humidity; dest->temperature = src->temperature; dest->photo_active = src->photo_active; dest->total_solar = src->total_solar; } command void SampleNxConverter.copyFromNx(sensor_sample_t* dest, nx_sensor_sample_t* src) { dest->sample_num = src->sample_num; dest->humidity = src->humidity; dest->temperature = src->temperature; dest->photo_active = src->photo_active; dest->total_solar = src->total_solar; } } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/tmote_onboard_sensors/SamplePeriodicLogC.nc000066400000000000000000000053431207233610700324630ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #include "SensorSample.h" #include "Storage.h" generic configuration SamplePeriodicLogC(uint32_t sampling_period, volume_id_t volume) { provides{ interface SampleLogRead; } } implementation { //Change sensors based on sensorboard........ components new PeriodicSampleLogger16C(sampling_period, 4) as PeriodicLogger; components new SensirionSht11C() as HumidityTempC; components new HamamatsuS10871TsrC() as PhotoActiveC; components new HamamatsuS1087ParC() as TotalSolarC; PeriodicLogger.Sensor[0] -> HumidityTempC.Humidity; PeriodicLogger.Sensor[1] -> HumidityTempC.Temperature; PeriodicLogger.Sensor[2] -> PhotoActiveC; PeriodicLogger.Sensor[3] -> TotalSolarC; //Don't change........ just copy components MainC; components new LogStorageC(volume, TRUE); components new SampleLogReaderC(sensor_sample_t) as LogReader; SampleLogRead = LogReader; MainC.Boot <- PeriodicLogger; PeriodicLogger.LogWrite -> LogStorageC; LogReader.LogRead -> LogStorageC; LogReader.LogWrite -> LogStorageC; } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/tmote_onboard_sensors/SensorSample.h000066400000000000000000000040741207233610700312600ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #ifndef SENSORSAMPLE_H #define SENSORSAMPLE_H typedef struct sensor_sample { uint32_t sample_num; uint16_t humidity; uint16_t temperature; uint16_t photo_active; uint16_t total_solar; } sensor_sample_t; typedef nx_struct nx_sensor_sample { nx_uint32_t sample_num; nx_uint16_t humidity; nx_uint16_t temperature; nx_uint16_t photo_active; nx_uint16_t total_solar; } nx_sensor_sample_t; #endif //SENSORSAMPLE_H tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/universal_sensors/000077500000000000000000000000001207233610700256435ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/universal_sensors/SampleNxConverterC.nc000066400000000000000000000041361207233610700317130ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #include "SensorSample.h" module SampleNxConverterC { provides interface SampleNxConverter; } implementation { command void SampleNxConverter.copyToNx(nx_sensor_sample_t* dest, sensor_sample_t* src) { dest->sample_num = src->sample_num; dest->sin_value = src->sin_value; } command void SampleNxConverter.copyFromNx(sensor_sample_t* dest, nx_sensor_sample_t* src) { dest->sample_num = src->sample_num; dest->sin_value = src->sin_value; } } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/universal_sensors/SamplePeriodicLogC.nc000066400000000000000000000046621207233610700316420ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #include "SensorSample.h" #include "Storage.h" generic configuration SamplePeriodicLogC(uint32_t sampling_period, volume_id_t volume) { provides{ interface SampleLogRead; } } implementation { //Change sensors based on sensorboard........ components new PeriodicSampleLogger16C(sampling_period, 1) as PeriodicLogger; components new SineSensorC(); PeriodicLogger.Sensor[0] -> SineSensorC; //Don't change..... just copy for different sensorboard implementations components MainC; components new LogStorageC(volume, TRUE); components new SampleLogReaderC(sensor_sample_t) as LogReader; MainC.Boot <- PeriodicLogger; PeriodicLogger.LogWrite -> LogStorageC; SampleLogRead = LogReader; LogReader.LogRead -> LogStorageC; LogReader.LogWrite -> LogStorageC; } tinyos-2.1.2+dfsg/apps/tutorials/LowPowerSensing/universal_sensors/SensorSample.h000066400000000000000000000036431207233610700304350ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date July 24, 2007 */ #ifndef SENSORSAMPLE_H #define SENSORSAMPLE_H typedef struct sensor_sample { uint32_t sample_num; uint16_t sin_value; } sensor_sample_t; typedef nx_struct nx_sensor_sample { nx_uint32_t sample_num; nx_uint16_t sin_value; } nx_sensor_sample_t; #endif //SENSORSAMPLE_H tinyos-2.1.2+dfsg/apps/tutorials/PacketParrot/000077500000000000000000000000001207233610700213515ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/PacketParrot/Makefile000066400000000000000000000000551207233610700230110ustar00rootroot00000000000000COMPONENT=PacketParrotC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tutorials/PacketParrot/PacketParrotC.nc000066400000000000000000000057571207233610700244130ustar00rootroot00000000000000/* tab:2 * * Copyright (c) 2000-2007 The Regents of the University of * California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Demonstrates the LogRead and LogWrite * abstractions. The application logs packets it receives from the * radio to flash. On a subsequent power cycle, the application * transmits logged packets, erases the log, and then continues to log * packets again. The red LED is on when the log is being erased. * The blue (yellow) LED blinks when packets are being received and * logged, and remains on when packets are being received but are not * logged (because the log is being erased). The green LED blinks * rapidly after a power cycle when logged packets are transmitted. * * @author Prabal Dutta * @date Apr 6, 2007 * @author Janos Sallai * @date Jan 25, 2012 */ #include #include "StorageVolumes.h" configuration PacketParrotC { } implementation { components MainC; components LedsC; components PacketParrotP as App; components ActiveMessageC; components new LogStorageC(VOLUME_LOGTEST, TRUE); components new TimerMilliC() as Timer0; App.Boot -> MainC; App.Leds -> LedsC; App.Packet -> ActiveMessageC; App.AMPacket -> ActiveMessageC; App.AMControl -> ActiveMessageC; App.AMSend -> ActiveMessageC; App.Receive -> ActiveMessageC.Receive; App.Snoop -> ActiveMessageC.Snoop; App.LogRead -> LogStorageC; App.LogWrite -> LogStorageC; App.Timer0 -> Timer0; } tinyos-2.1.2+dfsg/apps/tutorials/PacketParrot/PacketParrotP.nc000066400000000000000000000111021207233610700244050ustar00rootroot00000000000000/* tab:2 * * Copyright (c) 2000-2007 The Regents of the University of * California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Implementation of the PacketParrot application. * * @author Prabal Dutta * @date Apr 6, 2007 * @author Janos Sallai * @date Jan 25, 2012 */ module PacketParrotP { uses { interface Boot; interface Leds; interface Packet; interface AMPacket; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface SplitControl as AMControl; interface LogRead; interface LogWrite; interface Timer as Timer0; } } implementation { enum { INTER_PACKET_INTERVAL = 25 }; typedef nx_struct logentry_t { nx_uint8_t len; message_t msg; } logentry_t; bool m_busy = TRUE; logentry_t m_entry; event void Boot.booted() { call AMControl.start(); } event void AMControl.startDone(error_t err) { if (err == SUCCESS) { if (call LogRead.read(&m_entry, sizeof(logentry_t)) != SUCCESS) { // Handle error. } } else { call AMControl.start(); } } event void AMControl.stopDone(error_t err) { } event void LogRead.readDone(void* buf, storage_len_t len, error_t err) { if ( (len == sizeof(logentry_t)) && (buf == &m_entry) ) { call AMSend.send[call AMPacket.type(&m_entry.msg)](call AMPacket.destination(&m_entry.msg), &m_entry.msg, m_entry.len); call Leds.led1On(); } else { if (call LogWrite.erase() != SUCCESS) { // Handle error. } call Leds.led0On(); } } event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { call Leds.led1Off(); if ( (err == SUCCESS) && (msg == &m_entry.msg) ) { call Packet.clear(&m_entry.msg); if (call LogRead.read(&m_entry, sizeof(logentry_t)) != SUCCESS) { // Handle error. } } else { call Timer0.startOneShot(INTER_PACKET_INTERVAL); } } event void Timer0.fired() { call AMSend.send[call AMPacket.type(&m_entry.msg)](call AMPacket.destination(&m_entry.msg), &m_entry.msg, m_entry.len); } event void LogWrite.eraseDone(error_t err) { if (err == SUCCESS) { m_busy = FALSE; } else { // Handle error. } call Leds.led0Off(); } event message_t* Receive.receive[uint8_t id](message_t* msg, void* payload, uint8_t len) { call Leds.led2On(); if (!m_busy) { m_busy = TRUE; m_entry.len = len; m_entry.msg = *msg; if (call LogWrite.append(&m_entry, sizeof(logentry_t)) != SUCCESS) { m_busy = FALSE; } } return msg; } event message_t* Snoop.receive[uint8_t id](message_t* msg, void* payload, uint8_t len) { return signal Receive.receive[id](msg, payload, len); } event void LogWrite.appendDone(void* buf, storage_len_t len, bool recordsLost, error_t err) { m_busy = FALSE; call Leds.led2Off(); } event void LogRead.seekDone(error_t err) { } event void LogWrite.syncDone(error_t err) { } } tinyos-2.1.2+dfsg/apps/tutorials/PacketParrot/README.txt000066400000000000000000000045721207233610700230570ustar00rootroot00000000000000$Id: README.txt,v 1.3 2007-04-19 07:39:18 prabal Exp $ README for PacketParrot Author/Contact: tinyos-help@millennium.berkeley.edu Description: PacketParrot demonstrates use of LogWrite and LogRead abstractions. A node writes received packets to a circular log and retransmits the logged packets (or at least the parts of the packets above the AM layer) when power cycled. The application logs packets it receives from the radio to flash. On a subsequent power cycle, the application transmits any logged packets, erases the log, and then continues to log packets again. The red LED is on when the log is being erased. The blue (yellow) LED turns on when a packet is received and turns off when a packet has been logged successfully. The blue (yellow) LED remains on when packets are being received but are not logged (because the log is being erased). The green LED flickers rapidly after a power cycle when logged packets are transmitted. To use this application: (i) Program one node (the "parrot") with this application using the typical command (e.g. make telosb install) (ii) Program a second node with the BlinkToRadio application. (iii) Turn the parrot node on. The red LED will turn on briefly, indicating that the flash volume is being erased. (iv) Turn the second node on. Nothing should happen on the second node but the blue (yellow) LED on the parrot node should start to blink, indicating it is receiving packets and logging them to flash. (v) After a few tens of seconds, focus you attention on the second node's LEDs and then power cycle the parrot node. The LEDs on the second node should rapidly flash as if they were displaying the three low-order bits of a counter. At the same time, the green LED on the parrot node should flicker rapidly, in unison with the LEDs on the second node, indicating that packets are being transmitted. (vi) Repeat step (v) a few times and notice that the parrot's blue (yellow) LED turns on and doesn't turn off until just a bit after the red LED, indicating that one or more packets were received (the LED turned on) but these packets were not logged (since the LED does not turn off) because the log is being erased. Tools: None Known bugs/limitations: None tinyos-2.1.2+dfsg/apps/tutorials/PacketParrot/volumes-at45db.xml000066400000000000000000000001621207233610700246450ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tutorials/PacketParrot/volumes-stm25p.xml000066400000000000000000000001641207233610700247160ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/apps/tutorials/Printf/000077500000000000000000000000001207233610700202145ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/Printf/Makefile000066400000000000000000000001621207233610700216530ustar00rootroot00000000000000COMPONENT=TestPrintfAppC CFLAGS += -I$(TOSDIR)/lib/printf #CFLAGS += -DNEW_PRINTF_SEMANTICS include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tutorials/Printf/README.txt000066400000000000000000000015641207233610700217200ustar00rootroot00000000000000$Id: README.txt,v 1.4 2006-12-12 18:22:52 vlahan Exp $ README for Printf Author/Contact: tinyos-help@millennium.berkeley.edu Description: This application is used to test the basic functionality of the printf service. After starting the service, calls to the standard c-style printf command are made to print various strings of text over the serial line. The output can be displayed using the PrintfClient, for example using the following command line: java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB0:115200 Successful execution of the application is indicated by repeated output of the following string sequence: Hi I am writing to you from my TinyOS application!! Here is a uint8: 123 Here is a uint16: 12345 Here is a uint32: 1234567890 ... Tools: net.tinyos.tools.PrintfClient Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tutorials/Printf/TestPrintfAppC.nc000066400000000000000000000051501207233610700234050ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This application is used to test the basic functionality of the printf service. * It is initiated by calling the start() command of the SplitControl interface * provided by the PrintfC component. After starting the printf service, calls to * the standard c-style printf command are made to print various strings of text * over the serial line. Only upon calling PrintfFlush.flush() does the data * actually get sent out over the serial line. * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.3 $ * @date $Date: 2010-06-29 22:07:40 $ */ // Note: You can also add this define in your makefile to supress the // warning about the new printf semanics. Just all the following line: // CFLAGS += -DNEW_PRINTF_SEMANTICS #define NEW_PRINTF_SEMANTICS #include "printf.h" configuration TestPrintfAppC{ } implementation { components MainC, TestPrintfC; components new TimerMilliC(); components PrintfC; components SerialStartC; TestPrintfC.Boot -> MainC; TestPrintfC.Timer -> TimerMilliC; } tinyos-2.1.2+dfsg/apps/tutorials/Printf/TestPrintfC.nc000066400000000000000000000052731207233610700227520ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * This application is used to test the basic functionality of the printf service. * It is initiated by calling the start() command of the SplitControl interface * provided by the PrintfC component. After starting the printf service, calls to * the standard c-style printf command are made to print various strings of text * over the serial line. Only upon calling PrintfFlush.flush() does the data * actually get sent out over the serial line. * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.3 $ * @date $Date: 2010-06-29 22:07:40 $ */ #include "printf.h" module TestPrintfC { uses { interface Boot; interface Timer; } } implementation { uint8_t dummyVar1 = 123; uint16_t dummyVar2 = 12345; uint32_t dummyVar3 = 1234567890; event void Boot.booted() { call Timer.startPeriodic(1000); } event void Timer.fired() { printf("Hi I am writing to you from my TinyOS application!!\n"); printf("Here is a uint8: %u\n", dummyVar1); printf("Here is a uint16: %u\n", dummyVar2); printf("Here is a uint32: %ld\n", dummyVar3); printfflush(); } } tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/000077500000000000000000000000001207233610700204775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/InterceptBase/000077500000000000000000000000001207233610700232275ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/InterceptBase/BaseStationC.nc000066400000000000000000000103311207233610700260660ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The TinyOS 2.x base station that forwards packets between the UART * and radio.It replaces the GenericBase of TinyOS 1.0 and the * TOSBase of TinyOS 1.1. * *

    On the serial link, BaseStation sends and receives simple active * messages (not particular radio packets): on the radio link, it * sends radio active messages, whose format depends on the network * stack being used. BaseStation will copy its compiled-in group ID to * messages moving from the serial link to the radio, and will filter * out incoming radio messages that do not contain that group ID.

    * *

    BaseStation includes queues in both directions, with a guarantee * that once a message enters a queue, it will eventually leave on the * other interface. The queues allow the BaseStation to handle load * spikes.

    * *

    BaseStation acknowledges a message arriving over the serial link * only if that message was successfully enqueued for delivery to the * radio link.

    * *

    The LEDS are programmed to toggle as follows:

    *
      *
    • RED Toggle:: Message bridged from serial to radio
    • *
    • GREEN Toggle: Message bridged from radio to serial
    • *
    • YELLOW/BLUE Toggle: Dropped message due to queue overflow in either direction
    • *
    * * @author Phil Buonadonna * @author Gilman Tolle * @author David Gay * @author Philip Levis * @author Dimas Abreu Dutra * @date January 29 2008 */ configuration BaseStationC { provides interface Intercept as RadioIntercept[am_id_t amid]; provides interface Intercept as SerialIntercept[am_id_t amid]; } implementation { components MainC, BaseStationP, LedsC; components ActiveMessageC as Radio, SerialActiveMessageC as Serial; RadioIntercept = BaseStationP.RadioIntercept; SerialIntercept = BaseStationP.SerialIntercept; MainC.Boot <- BaseStationP; BaseStationP.RadioControl -> Radio; BaseStationP.SerialControl -> Serial; BaseStationP.UartSend -> Serial; BaseStationP.UartReceive -> Serial; BaseStationP.UartPacket -> Serial; BaseStationP.UartAMPacket -> Serial; BaseStationP.RadioSend -> Radio; BaseStationP.RadioReceive -> Radio.Receive; BaseStationP.RadioSnoop -> Radio.Snoop; BaseStationP.RadioPacket -> Radio; BaseStationP.RadioAMPacket -> Radio; BaseStationP.Leds -> LedsC; } tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/InterceptBase/BaseStationP.nc000066400000000000000000000200301207233610700261000ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * @author Phil Buonadonna * @author Gilman Tolle * @author David Gay * @author Dimas Abreu Dutra */ /* * BaseStationP bridges packets between a serial channel and the radio. * Messages moving from serial to radio will be tagged with the group * ID compiled into the TOSBase, and messages moving from radio to * serial will be filtered by that same group id. */ #include "AM.h" #include "Serial.h" module BaseStationP @safe() { uses { interface Boot; interface SplitControl as SerialControl; interface SplitControl as RadioControl; interface AMSend as UartSend[am_id_t id]; interface Receive as UartReceive[am_id_t id]; interface Packet as UartPacket; interface AMPacket as UartAMPacket; interface AMSend as RadioSend[am_id_t id]; interface Receive as RadioReceive[am_id_t id]; interface Receive as RadioSnoop[am_id_t id]; interface Packet as RadioPacket; interface AMPacket as RadioAMPacket; interface Leds; } provides interface Intercept as RadioIntercept[am_id_t amid]; provides interface Intercept as SerialIntercept[am_id_t amid]; } implementation { enum { UART_QUEUE_LEN = 12, RADIO_QUEUE_LEN = 12, }; message_t uartQueueBufs[UART_QUEUE_LEN]; message_t *uartQueue[UART_QUEUE_LEN]; uint8_t uartIn, uartOut; bool uartBusy, uartFull; message_t radioQueueBufs[RADIO_QUEUE_LEN]; message_t *radioQueue[RADIO_QUEUE_LEN]; uint8_t radioIn, radioOut; bool radioBusy, radioFull; task void uartSendTask(); task void radioSendTask(); void dropBlink() { call Leds.led2Toggle(); } void failBlink() { call Leds.led2Toggle(); } event void Boot.booted() { uint8_t i; for (i = 0; i < UART_QUEUE_LEN; i++) uartQueue[i] = &uartQueueBufs[i]; uartIn = uartOut = 0; uartBusy = FALSE; uartFull = TRUE; for (i = 0; i < RADIO_QUEUE_LEN; i++) radioQueue[i] = &radioQueueBufs[i]; radioIn = radioOut = 0; radioBusy = FALSE; radioFull = TRUE; call RadioControl.start(); call SerialControl.start(); } event void RadioControl.startDone(error_t error) { if (error == SUCCESS) { radioFull = FALSE; } } event void SerialControl.startDone(error_t error) { if (error == SUCCESS) { uartFull = FALSE; } } event void SerialControl.stopDone(error_t error) {} event void RadioControl.stopDone(error_t error) {} uint8_t count = 0; message_t* receive(message_t* msg, void* payload, uint8_t len, am_id_t id); event message_t *RadioSnoop.receive[am_id_t id](message_t *msg, void *payload, uint8_t len) { return receive(msg, payload, len, id); } event message_t *RadioReceive.receive[am_id_t id](message_t *msg, void *payload, uint8_t len) { return receive(msg, payload, len, id); } message_t* receive(message_t *msg, void *payload, uint8_t len, am_id_t id) { message_t *ret = msg; if (!signal RadioIntercept.forward[id](msg,payload,len)) return ret; atomic { if (!uartFull) { ret = uartQueue[uartIn]; uartQueue[uartIn] = msg; uartIn = (uartIn + 1) % UART_QUEUE_LEN; if (uartIn == uartOut) uartFull = TRUE; if (!uartBusy) { post uartSendTask(); uartBusy = TRUE; } } else dropBlink(); } return ret; } uint8_t tmpLen; task void uartSendTask() { uint8_t len; am_id_t id; am_addr_t addr, src; message_t* msg; atomic if (uartIn == uartOut && !uartFull) { uartBusy = FALSE; return; } msg = uartQueue[uartOut]; tmpLen = len = call RadioPacket.payloadLength(msg); id = call RadioAMPacket.type(msg); addr = call RadioAMPacket.destination(msg); src = call RadioAMPacket.source(msg); call UartAMPacket.setSource(msg, src); if (call UartSend.send[id](addr, uartQueue[uartOut], len) == SUCCESS) call Leds.led1Toggle(); else { failBlink(); post uartSendTask(); } } event void UartSend.sendDone[am_id_t id](message_t* msg, error_t error) { if (error != SUCCESS) failBlink(); else atomic if (msg == uartQueue[uartOut]) { if (++uartOut >= UART_QUEUE_LEN) uartOut = 0; if (uartFull) uartFull = FALSE; } post uartSendTask(); } event message_t *UartReceive.receive[am_id_t id](message_t *msg, void *payload, uint8_t len) { message_t *ret = msg; bool reflectToken = FALSE; if (!signal SerialIntercept.forward[id](msg,payload,len)) return ret; atomic if (!radioFull) { reflectToken = TRUE; ret = radioQueue[radioIn]; radioQueue[radioIn] = msg; if (++radioIn >= RADIO_QUEUE_LEN) radioIn = 0; if (radioIn == radioOut) radioFull = TRUE; if (!radioBusy) { post radioSendTask(); radioBusy = TRUE; } } else dropBlink(); if (reflectToken) { //call UartTokenReceive.ReflectToken(Token); } return ret; } task void radioSendTask() { uint8_t len; am_id_t id; am_addr_t addr; message_t* msg; atomic if (radioIn == radioOut && !radioFull) { radioBusy = FALSE; return; } msg = radioQueue[radioOut]; len = call UartPacket.payloadLength(msg); addr = call UartAMPacket.destination(msg); id = call UartAMPacket.type(msg); if (call RadioSend.send[id](addr, msg, len) == SUCCESS) call Leds.led0Toggle(); else { failBlink(); post radioSendTask(); } } event void RadioSend.sendDone[am_id_t id](message_t* msg, error_t error) { if (error != SUCCESS) failBlink(); else atomic if (msg == radioQueue[radioOut]) { if (++radioOut >= RADIO_QUEUE_LEN) radioOut = 0; if (radioFull) radioFull = FALSE; } post radioSendTask(); } default event bool RadioIntercept.forward[am_id_t amid](message_t* msg, void* payload, uint8_t len) { return TRUE; } default event bool SerialIntercept.forward[am_id_t amid](message_t* msg, void* payload, uint8_t len) { return TRUE; } } tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/InterceptBase/Makefile000066400000000000000000000001771207233610700246740ustar00rootroot00000000000000COMPONENT=BaseStationC CFLAGS += -DCC2420_NO_ACKNOWLEDGEMENTS CFLAGS += -DCC2420_NO_ADDRESS_RECOGNITION include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/RssiBase/000077500000000000000000000000001207233610700222125ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/RssiBase/ApplicationDefinitions.h000066400000000000000000000033521207233610700270250ustar00rootroot00000000000000/* * Copyright (c) 2008 Dimas Abreu Dutra * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIMAS ABREU * DUTRA OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Dimas Abreu Dutra */ #ifndef APPLICATIONDEFINITIONS_H__ #define APPLICATIONDEFINITIONS_H__ enum { SEND_INTERVAL_MS = 250 }; #endif //APPLICATIONDEFINITIONS_H__ tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/RssiBase/Makefile000066400000000000000000000003201207233610700236450ustar00rootroot00000000000000COMPONENT=RssiBaseAppC INCLUDES= -I.. \ -I../InterceptBase CFLAGS += $(INCLUDES) ifneq ($(filter iris,$(MAKECMDGOALS)),) CFLAGS += -DRF230_RSSI_ENERGY endif include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/RssiBase/RssiBaseAppC.nc000066400000000000000000000043401207233610700250140ustar00rootroot00000000000000/* * Copyright (c) 2008 Dimas Abreu Dutra * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIMAS ABREU * DUTRA OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Dimas Abreu Dutra */ #include "RssiDemoMessages.h" #include "message.h" configuration RssiBaseAppC { } implementation { components BaseStationC; components RssiBaseC as App; #ifdef __CC2420_H__ components CC2420ActiveMessageC; App -> CC2420ActiveMessageC.CC2420Packet; #elif defined(PLATFORM_IRIS) components RF230ActiveMessageC; App -> RF230ActiveMessageC.PacketRSSI; #elif defined(PLATFORM_UCMINI) components RFA1ActiveMessageC; App -> RFA1ActiveMessageC.PacketRSSI; #elif defined(TDA5250_MESSAGE_H) components Tda5250ActiveMessageC; App -> Tda5250ActiveMessageC.Tda5250Packet; #endif App-> BaseStationC.RadioIntercept[AM_RSSIMSG]; } tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/RssiBase/RssiBaseC.nc000066400000000000000000000056651207233610700243660ustar00rootroot00000000000000/* * Copyright (c) 2008 Dimas Abreu Dutra * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIMAS ABREU * DUTRA OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Dimas Abreu Dutra */ #include "ApplicationDefinitions.h" #include "RssiDemoMessages.h" module RssiBaseC { uses interface Intercept as RssiMsgIntercept; #ifdef __CC2420_H__ uses interface CC2420Packet; #elif defined(TDA5250_MESSAGE_H) uses interface Tda5250Packet; #else uses interface PacketField as PacketRSSI; #endif } implementation { uint16_t getRssi(message_t *msg); event bool RssiMsgIntercept.forward(message_t *msg, void *payload, uint8_t len) { RssiMsg *rssiMsg = (RssiMsg*) payload; rssiMsg->rssi = getRssi(msg); return TRUE; } #ifdef __CC2420_H__ uint16_t getRssi(message_t *msg){ return (uint16_t) call CC2420Packet.getRssi(msg); } #elif defined(CC1K_RADIO_MSG_H) uint16_t getRssi(message_t *msg){ cc1000_metadata_t *md =(cc1000_metadata_t*) msg->metadata; return md->strength_or_preamble; } #elif defined(PLATFORM_IRIS) || defined(PLATFORM_UCMINI) uint16_t getRssi(message_t *msg){ if(call PacketRSSI.isSet(msg)) return (uint16_t) call PacketRSSI.get(msg); else return 0xFFFF; } #elif defined(TDA5250_MESSAGE_H) uint16_t getRssi(message_t *msg){ return call Tda5250Packet.getSnr(msg); } #else #error Radio chip not supported! This demo currently works only \ for motes with CC1000, CC2420, RF230, RFA1 or TDA5250 radios. #endif } tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/RssiDemoMessages.h000066400000000000000000000034131207233610700240660ustar00rootroot00000000000000/* * Copyright (c) 2008 Dimas Abreu Dutra * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIMAS ABREU * DUTRA OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Dimas Abreu Dutra */ #ifndef RSSIDEMOMESSAGES_H__ #define RSSIDEMOMESSAGES_H__ enum { AM_RSSIMSG = 10 }; typedef nx_struct RssiMsg{ nx_int16_t rssi; } RssiMsg; #endif //RSSIDEMOMESSAGES_H__ tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/SendingMote/000077500000000000000000000000001207233610700227135ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/SendingMote/ApplicationDefinitions.h000066400000000000000000000033521207233610700275260ustar00rootroot00000000000000/* * Copyright (c) 2008 Dimas Abreu Dutra * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIMAS ABREU * DUTRA OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Dimas Abreu Dutra */ #ifndef APPLICATIONDEFINITIONS_H__ #define APPLICATIONDEFINITIONS_H__ enum { SEND_INTERVAL_MS = 250 }; #endif //APPLICATIONDEFINITIONS_H__ tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/SendingMote/Makefile000066400000000000000000000001271207233610700243530ustar00rootroot00000000000000COMPONENT=SendingMoteAppC INCLUDES= -I.. CFLAGS += $(INCLUDES) include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/SendingMote/SendingMoteAppC.nc000066400000000000000000000037371207233610700262270ustar00rootroot00000000000000/* * Copyright (c) 2008 Dimas Abreu Dutra * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIMAS ABREU * DUTRA OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Dimas Abreu Dutra */ #include "RssiDemoMessages.h" configuration SendingMoteAppC { } implementation { components ActiveMessageC, MainC; components new AMSenderC(AM_RSSIMSG) as RssiMsgSender; components new TimerMilliC() as SendTimer; components SendingMoteC as App; App.Boot -> MainC; App.SendTimer -> SendTimer; App.RssiMsgSend -> RssiMsgSender; App.RadioControl -> ActiveMessageC; } tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/SendingMote/SendingMoteC.nc000066400000000000000000000044171207233610700255620ustar00rootroot00000000000000/* * Copyright (c) 2008 Dimas Abreu Dutra * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIMAS ABREU * DUTRA OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Dimas Abreu Dutra */ #include "ApplicationDefinitions.h" #include "RssiDemoMessages.h" module SendingMoteC { uses interface Boot; uses interface Timer as SendTimer; uses interface AMSend as RssiMsgSend; uses interface SplitControl as RadioControl; } implementation { message_t msg; event void Boot.booted(){ call RadioControl.start(); } event void RadioControl.startDone(error_t result){ call SendTimer.startPeriodic(SEND_INTERVAL_MS); } event void RadioControl.stopDone(error_t result){} event void SendTimer.fired(){ call RssiMsgSend.send(AM_BROADCAST_ADDR, &msg, sizeof(RssiMsg)); } event void RssiMsgSend.sendDone(message_t *m, error_t error){} } tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/java/000077500000000000000000000000001207233610700214205ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/java/Makefile000066400000000000000000000003261207233610700230610ustar00rootroot00000000000000all: RssiDemo.class RssiMsg.class: RssiMsg.java javac $< RssiDemo.class: RssiDemo.java RssiMsg.java javac $^ RssiMsg.java: ../RssiDemoMessages.h mig java -target=null -java-classname=RssiMsg $< RssiMsg -o $@ tinyos-2.1.2+dfsg/apps/tutorials/RssiDemo/java/RssiDemo.java000066400000000000000000000062241207233610700240140ustar00rootroot00000000000000/* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * This is a modified version of TestSerial.java, from apps/tests/TestSerial * from TinyOS 2.x (www.tinyos.net) */ /** * Java-side application for testing the RSSI demo * * @author Phil Levis * @author Dimas Abreu Dutra * @date April 11 2008 */ import java.io.IOException; import net.tinyos.message.*; import net.tinyos.packet.*; import net.tinyos.util.*; public class RssiDemo implements MessageListener { private MoteIF moteIF; public RssiDemo(MoteIF moteIF) { this.moteIF = moteIF; this.moteIF.registerListener(new RssiMsg(), this); } public void messageReceived(int to, Message message) { RssiMsg msg = (RssiMsg) message; int source = message.getSerialPacket().get_header_src(); System.out.println("Rssi Message received from node " + source + ": Rssi = " + msg.get_rssi()); } private static void usage() { System.err.println("usage: RssiDemo [-comm ]"); } public static void main(String[] args) throws Exception { String source = null; if (args.length == 2) { if (!args[0].equals("-comm")) { usage(); System.exit(1); } source = args[1]; } else if (args.length != 0) { usage(); System.exit(1); } PhoenixSource phoenix; if (source == null) { phoenix = BuildSource.makePhoenix(PrintStreamMessenger.err); } else { phoenix = BuildSource.makePhoenix(source, PrintStreamMessenger.err); } MoteIF mif = new MoteIF(phoenix); RssiDemo serial = new RssiDemo(mif); } } tinyos-2.1.2+dfsg/apps/tutorials/SharedResourceDemo/000077500000000000000000000000001207233610700224755ustar00rootroot00000000000000tinyos-2.1.2+dfsg/apps/tutorials/SharedResourceDemo/Makefile000066400000000000000000000000671207233610700241400ustar00rootroot00000000000000COMPONENT=SharedResourceDemoAppC include $(MAKERULES) tinyos-2.1.2+dfsg/apps/tutorials/SharedResourceDemo/README.txt000066400000000000000000000022371207233610700241770ustar00rootroot00000000000000README for SharedResourceDemo Author/Contact: tinyos-help@millennium.berkeley.edu @author Kevin Klues Description: This application is used to test the use of Shared Resources. Three Resource users are created and all three request control of the resource before any one of them is granted it. Once the first user is granted control of the resource, it performs some operation on it. Once this operation has completed, a timer is set to allow this user to have control of it for a specific amount of time. Once this timer expires, the resource is released and then immediately requested again. Upon releasing the resource control will be granted to the next user that has requested it in round robin order. Initial requests are made by the three resource users in the following order. -- Resource 0 -- Resource 2 -- Resource 1 It is expected then that using a round robin policy, control of the resource will be granted in the order of 0,1,2 and the Leds corresponding to each resource will flash whenever this occurs. -- Led 0 -> Resource 0 -- Led 1 -> Resource 1 -- Led 2 -> Resource 2 Tools: None. Known bugs/limitations: None. tinyos-2.1.2+dfsg/apps/tutorials/SharedResourceDemo/ResourceOperations.nc000066400000000000000000000040741207233610700266570ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * An EXAMPLE of an interface for performing operations on a resource. * In this test application it is provided by the dedicated ResourceP component * and passed through all of the proper components before being exposed by the * shared resource at the topmost level. * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.2 $ * @date $Date: 2010-06-29 22:07:40 $ */ interface ResourceOperations { command error_t operation(); event void operationDone(error_t error); } tinyos-2.1.2+dfsg/apps/tutorials/SharedResourceDemo/ResourceP.nc000066400000000000000000000052461207233610700247350ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This is an example implementation of a dedicated resource. * It provides the SplitControl interface for power management * of the resource and an EXAMPLE ResourceOperations interface * for performing operations on it. * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.2 $ * @date $Date: 2010-06-29 22:07:40 $ */ module ResourceP { provides { interface SplitControl; interface ResourceOperations; } } implementation { bool lock; task void startDone() { lock = FALSE; signal SplitControl.startDone(SUCCESS); } task void stopDone() { signal SplitControl.stopDone(SUCCESS); } task void operationDone() { lock = FALSE; signal ResourceOperations.operationDone(SUCCESS); } command error_t SplitControl.start() { post startDone(); return SUCCESS; } command error_t SplitControl.stop() { lock = TRUE; post stopDone(); return SUCCESS; } command error_t ResourceOperations.operation() { if(lock == FALSE) { lock = TRUE; post operationDone(); return SUCCESS; } return FAIL; } } tinyos-2.1.2+dfsg/apps/tutorials/SharedResourceDemo/SharedResourceC.nc000066400000000000000000000051511207233610700260420ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SharedResourceC is used to provide a generic configuration around * the SharedResourceP component so that new instantiations of * it provide a single set of interfaces that are all properly associated * with one another rather than requiring the user to deal with the complexity * of doing this themselves. * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.2 $ * @date $Date: 2010-06-29 22:07:40 $ */ #define UQ_SHARED_RESOURCE "Shared.Resource" generic configuration SharedResourceC() { provides interface Resource; provides interface ResourceRequested; provides interface ResourceOperations; uses interface ResourceConfigure; } implementation { components SharedResourceP; enum { RESOURCE_ID = unique(UQ_SHARED_RESOURCE) }; Resource = SharedResourceP.Resource[RESOURCE_ID]; ResourceRequested = SharedResourceP.ResourceRequested[RESOURCE_ID]; ResourceOperations = SharedResourceP.ResourceOperations[RESOURCE_ID]; ResourceConfigure = SharedResourceP.ResourceConfigure[RESOURCE_ID]; } tinyos-2.1.2+dfsg/apps/tutorials/SharedResourceDemo/SharedResourceDemoAppC.nc000066400000000000000000000066231207233610700273150ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * This application is used to test the use of Shared Resources. * Three Resource users are created and all three request * control of the resource before any one of them is granted it. * Once the first user is granted control of the resource, it performs * some operation on it. Once this operation has completed, a timer * is set to allow this user to have control of it for a specific * amount of time. Once this timer expires, the resource is released * and then immediately requested again. Upon releasing the resource * control will be granted to the next user that has requested it in * round robin order. Initial requests are made by the three resource * users in the following order.
    *
  • Resource 0 *
  • Resource 2 *
  • Resource 1 *
    * It is expected then that using a round robin policy, control of the * resource will be granted in the order of 0,1,2 and the Leds * corresponding to each resource will flash whenever this occurs.
    *
  • Led 0 -> Resource 0 *
  • Led 1 -> Resource 1 *
  • Led 2 -> Resource 2 *
    * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.2 $ * @date $Date: 2010-06-29 22:07:40 $ */ configuration SharedResourceDemoAppC{ } implementation { components MainC,LedsC, SharedResourceDemoC as App, new TimerMilliC() as Timer0, new TimerMilliC() as Timer1, new TimerMilliC() as Timer2; App -> MainC.Boot; App.Leds -> LedsC; App.Timer0 -> Timer0; App.Timer1 -> Timer1; App.Timer2 -> Timer2; components new SharedResourceC() as Resource0, new SharedResourceC() as Resource1, new SharedResourceC() as Resource2; App.Resource0 -> Resource0; App.Resource1 -> Resource1; App.Resource2 -> Resource2; App.ResourceOperations0 -> Resource0; App.ResourceOperations1 -> Resource1; App.ResourceOperations2 -> Resource2; } tinyos-2.1.2+dfsg/apps/tutorials/SharedResourceDemo/SharedResourceDemoC.nc000066400000000000000000000111421207233610700266440ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * * This application is used to test the use of Shared Resources. * Three Resource users are created and all three request * control of the resource before any one of them is granted it. * Once the first user is granted control of the resource, it performs * some operation on it. Once this operation has completed, a timer * is set to allow this user to have control of it for a specific * amount of time. Once this timer expires, the resource is released * and then immediately requested again. Upon releasing the resource * control will be granted to the next user that has requested it in * round robin order. Initial requests are made by the three resource * users in the following order.
    *
  • Resource 0 *
  • Resource 2 *
  • Resource 1 *
    * It is expected then that using a round robin policy, control of the * resource will be granted in the order of 0,1,2 and the Leds * corresponding to each resource will flash whenever this occurs.
    *
  • Led 0 -> Resource 0 *
  • Led 1 -> Resource 1 *
  • Led 2 -> Resource 2 *
    * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.2 $ * @date $Date: 2010-06-29 22:07:40 $ */ module SharedResourceDemoC { uses { interface Boot; interface Leds; interface Timer as Timer0; interface Timer as Timer1; interface Timer as Timer2; interface Resource as Resource0; interface ResourceOperations as ResourceOperations0; interface Resource as Resource1; interface ResourceOperations as ResourceOperations1; interface Resource as Resource2; interface ResourceOperations as ResourceOperations2; } } implementation { #define HOLD_PERIOD 250 //All resources try to gain access event void Boot.booted() { call Resource0.request(); call Resource2.request(); call Resource1.request(); } //If granted the resource, run some operation event void Resource0.granted() { call ResourceOperations0.operation(); } event void Resource1.granted() { call ResourceOperations1.operation(); } event void Resource2.granted() { call ResourceOperations2.operation(); } //When the operation completes, flash the LED and hold the resource for a while event void ResourceOperations0.operationDone(error_t error) { call Timer0.startOneShot(HOLD_PERIOD); call Leds.led0Toggle(); } event void ResourceOperations1.operationDone(error_t error) { call Timer1.startOneShot(HOLD_PERIOD); call Leds.led1Toggle(); } event void ResourceOperations2.operationDone(error_t error) { call Timer2.startOneShot(HOLD_PERIOD); call Leds.led2Toggle(); } //After the hold period release the resource and request it again event void Timer0.fired() { call Resource0.release(); call Resource0.request(); } event void Timer1.fired() { call Resource1.release(); call Resource1.request(); } event void Timer2.fired() { call Resource2.release(); call Resource2.request(); } } tinyos-2.1.2+dfsg/apps/tutorials/SharedResourceDemo/SharedResourceImplP.nc000066400000000000000000000052171207233610700267040ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The SharedResourceImplP component is used to wrap all of the operations * from a dedicated resource so that access to them is protected when * it is used as a shared resource. It uses the ArbiterInfo interface * provided by an Arbiter to accomplish this. * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.2 $ * @date $Date: 2010-06-29 22:07:40 $ */ module SharedResourceImplP { provides { interface ResourceOperations as SharedResourceOperations[uint8_t id]; } uses { interface ArbiterInfo; interface ResourceOperations; } } implementation { uint8_t current_id = 0xFF; event void ResourceOperations.operationDone(error_t error) { signal SharedResourceOperations.operationDone[current_id](error); } command error_t SharedResourceOperations.operation[uint8_t id]() { if(call ArbiterInfo.userId() == id && call ResourceOperations.operation() == SUCCESS) { current_id = id; return SUCCESS; } return FAIL; } default event void SharedResourceOperations.operationDone[uint8_t id](error_t error) {} } tinyos-2.1.2+dfsg/apps/tutorials/SharedResourceDemo/SharedResourceP.nc000066400000000000000000000051111207233610700260530ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The SharedResourceP component is used to create a shared resource * out of a dedicated one. * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.2 $ * @date $Date: 2010-06-29 22:07:40 $ */ #define UQ_SHARED_RESOURCE "Shared.Resource" configuration SharedResourceP { provides interface Resource[uint8_t id]; provides interface ResourceRequested[uint8_t id]; provides interface ResourceOperations[uint8_t id]; uses interface ResourceConfigure[uint8_t id]; } implementation { components new RoundRobinArbiterC(UQ_SHARED_RESOURCE) as Arbiter; components new SplitControlPowerManagerC() as PowerManager; components ResourceP; components SharedResourceImplP; ResourceOperations = SharedResourceImplP; Resource = Arbiter; ResourceRequested = Arbiter; ResourceConfigure = Arbiter; SharedResourceImplP.ArbiterInfo -> Arbiter; PowerManager.ResourceDefaultOwner -> Arbiter; PowerManager.SplitControl -> ResourceP; SharedResourceImplP.ResourceOperations -> ResourceP; } tinyos-2.1.2+dfsg/licenses/000077500000000000000000000000001207233610700155665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/licenses/bsd.txt000066400000000000000000000030621207233610700171000ustar00rootroot00000000000000/* * Copyright (c) 2011 * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ tinyos-2.1.2+dfsg/release-notes.txt000066400000000000000000000066351207233610700173020ustar00rootroot00000000000000These release notes are as of: $Date: 2010-01-20 20:00:48 $ 2.1.2: Suports updated msp430 and avr compilers Added RPL stack Fixed bugs in RFX2xx radio stack 2.1.1: Added support for automatic default LPL interval Added platform-indepdent TOS_SLEEP_NONE for McuPowerOverride Added support for mulle platform Added support for epic platform Added support for shimmer2 platform Added DHV dissemination protocol in lib/net/dhv Added 6lowpan/IP support in lib/net/blip Improved CTP forwarder code to save code and RAM Improved MSP430 sleep code to default to LPM4 Improved TOSSIM PRR curve to prevent very low SNR packets Improved Queue performance by changing % to inequality test Improved TOSThreads tutorials and documentation Improved python sdk Refactored AM layer to better support 6lowpan Fixed TOSSIM bug where nodes could receive while transmitting Fixed TOSSIM ack bug for nodes that change their AM id at runtime Fixed Trickle bugs that could cause timers to fire slightly off Fixed Pool bug that did not allow large (> 127 element) pools 2.1: Added support for iris platform Added support for shimmer platform Added 4-bit link estimator to CTP in lib/net/4bitle Added DIP dissemination protocol in lib/net/dip Added FTSP time synchronization service in lib/ftsp Added TOSThreads library in lib/tosthreads Added SafeTinyOS support with 'safe' make option Added support for 802.15.4 T-Frames through 'tframe' make option Added TKN15.4, a platform-independent 802.15.4-2006 MAC implementation Added low-power application tutorial Added printf tutorial Added TEPs Changed 802.15.4 stacks to use I-Frames by default (TEP 125) Changed Packet interface to better support type checking Changed Receive interface to support fan-in Changed atm128 I2C bus to obey same addressing as MSP430 Changed printf implementation to no longer require explicit wiring of PrintfC component Fixed memory leak in CTP on duplicate suppression 2.0.2: Added reimplementation of low-power CC2420 stack to support AUTOACK and SACK Added Deluge and related tools (support for micaZ and telosb only) Added TEPs Added 64-bit support for Java support code Fixed oscillator calibration bug in MSP430 USART Fixed clear channel detection bug in TOSSIM Fixed errors in tutorial text Fixed deadlock in C-based serial forwarder Fixed bugs in at45db and stm25p storage stacks 2.0.1: Added low-power cc2420 stack as default on relevant platforms Added lib/printf (simple serial messages) Added lib/net/lqi (LQI-based collection layer for CC2420 platforms) Added sensorboards/mts300 (mica sensor board) Added noise modeling to TOSSIM (captures temporal correlation) Added TEPs Added tutorials Changes to Resource management interfaces and components Change to atmega128 ADC: output is no longer left-justified Fixed cancellation bug in active message layers (no sendDone) Fixed errors in tutorial text Fixed interface errors in dissemination Fixed lockup bug in atmega128 streaming reads Fixed lockup bug in atmega128 SPI stack (0-length writes) Fixed lockup bug in atmega128 I2C stack (power management) Fixed memory access bugs in serial stack and AM queue (from John Regehr) Fixed TMote sleep power consumption for newest RHoS nodes New atmega128 timer stack fixes mica-family timer problems Numerous optimizations and performance improvements Numerous additional bug fixes tinyos-2.1.2+dfsg/support/000077500000000000000000000000001207233610700154755ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/make/000077500000000000000000000000001207233610700164125ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/make/Makedefaults000066400000000000000000000012061207233610700207410ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: Makedefaults,v 1.8 2008-06-18 20:22:51 razvanm Exp $ DEFAULT_LOCAL_GROUP ?= 0x22 OPTFLAGS ?= -Os NESC_FLAGS ?= -Wnesc-all GOALS += ident_flags tos_image tosboot define DEFAULT_HELP Welcome to the TinyOS make system! You must specify one of the valid targets and possibly some combination of the extra options. Many targets have custom extras and extended help, so be sure to try "make help" to learn of all the available features. Global extras: docs : compile additional nescdoc documentation tinysec : compile with TinySec secure communication endef HELP += $(DEFAULT_HELP) tinyos-2.1.2+dfsg/support/make/Makefile000066400000000000000000000000231207233610700200450ustar00rootroot00000000000000include Makerules tinyos-2.1.2+dfsg/support/make/Makerules000066400000000000000000000156551207233610700203010ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: Makerules,v 1.6 2008/09/26 20:13:58 klueska Exp $ # @author Cory Sharp ### --- This makefile requires GNU Make version 3.80 or newer. ### --- ### --- Prepare variables ### --- # Get TOSDIR from ncc if it isn't set already. ifndef TOSDIR TOSDIR := $(shell ncc -print-tosdir) endif # Mung MAKERULES for Cygwin; see the warning below for more details. ifneq ($(findstring \,$(MAKERULES)),) MAKERULES := $(subst \,/,$(MAKERULES)) define BACKSLASH_WARNING warning, MAKERULES contains backslashes. The environment variable MAKERULES contains backslashes \'s. This can cause shell scripts including ones in this make system to fail in strange ways. I've changed those to forward slashes for you for this build. However, you are strongly encouraged to respecify MAKERULES as either a standard unix-style path or as a mixed-style path where the backslashes are replaced with forward slashes /'s. endef $(warning $(BACKSLASH_WARNING)) endif # Deduce TINYOS_MAKE_PATH, the path to this file, if it's not defined already. ifndef TINYOS_MAKE_PATH ifdef MAKERULES TINYOS_MAKE_PATH := $(dir $(MAKERULES)) TINYOS_MAKE_PATH := $(TINYOS_MAKE_PATH:%/=%) else TINYOS_MAKE_PATH := $(TOSDIR)/../support/make endif endif # Use a default Makelocal if it's not defined already. TINYOS_MAKELOCAL ?= $(TINYOS_MAKE_PATH)/Makelocal # Use a default Makedefaults if it's not defined already. TINYOS_MAKEDEFAULTS ?= $(TINYOS_MAKE_PATH)/Makedefaults # Allow users to specify additional directories to find TOSMake files. TOSMAKE_PATH += $(TINYOS_MAKE_PATH) # Save makecmdgoals (a read only var) to goals so that we can modify it. GOALS += $(MAKECMDGOALS) # Extract user options from goals of the form opt,arg, transform to opt=arg, # and evaluate. Then, reduce GOALS to have the args removed. OptRE := [,.] GoalOpts := $(shell perl -e 'print join " ", map {s{^(.*?)$(OptRE)}{\U$$1=};$$_} grep /$(OptRE)/, split /\s+/, "$(GOALS)";') GOALS := $(shell perl -e '$$_="$(GOALS)"; s{$(OptRE)\S*}{}g; print;') $(foreach opt,$(GoalOpts),$(eval $(opt))) ### --- ### --- Define make functions. ### --- (Lord, this is ugly. I want a real scripting language so bad.) ### --- ### --- The functions a user will generally be interested in are ### --- TOSMake_include(file) ### --- TOSMake_include_platform(dir) ### --- # names(words) # Produce option names, like junk from /path/to/junk.target. names = $(sort $(basename $(notdir $(1)))) # TOSMake_find(file_or_dir) # Search for file_or_dir within TOSMAKE_PATH. For the special case of # initializing TOSMAKE_PATH itself, this function does not search # TOSMAKE_PATH if file_or_dir begins with +. sh_search = for a in $(TOSMAKE_PATH); do [ -e "$$a/$$n" ] && echo "$$a/$$n" && break; done TOSMake_find = $(if $(filter +%,$(1)),$(1:+%=%),$(shell n="$(1)"; $(sh_search))) # TOSMake_makelist(dir,extension) # Get a list of files with the given extension from a directory which MUST # be a subdir under TOSMAKE_PATH. TOSMake_makelist = $(wildcard $(call TOSMake_find,$(1))/*.$(2)) # TOSMake_include(file) # Include a makefile which MUST be in a dir or subdir under TOSMAKE_PATH. TOSMake_include = $(eval include $(call TOSMake_find,$(1))) # TOSMake_extra_targets(name) # Create a default make targets for a TOSMake extra full with its possible # options afterward. define TOSMake_extra_targets $(subst :,%,$(1)): FORCE @: endef # TOSMake_include_dir(dir) # Pull in .extras and .targets from a directory which MUST be a subdir # under TOSMAKE_PATH. Create default extra rules as necessary, etc. TOSMake_include_dir = $(eval $(call TOSMake_include_dir_define,$(1))) define TOSMake_include_dir_define $(eval NEW_EXTRAS := $(call TOSMake_makelist,$(1),extra)) $(eval NEW_TARGETS := $(call TOSMake_makelist,$(1),target)) $(eval VALID_EXTRAS += $(NEW_EXTRAS)) $(eval VALID_TARGETS += $(NEW_TARGETS)) $(eval EXTRAS = $(filter $(call names,$(VALID_EXTRAS)),$(GOALS))) $(eval TARGETS = $(filter $(call names,$(VALID_TARGETS)),$(GOALS))) $(eval OTHERS = $(filter-out $(EXTRAS) $(TARGETS),$(GOALS))) $(foreach file,$(NEW_EXTRAS) $(NEW_TARGETS),$(if $(filter $(call names,$(file)),$(GOALS)),$(eval include $(file)))) endef TOSMake_accum_dir = $(eval $(call TOSMake_accum_dir_define,$(1))) define TOSMake_accum_dir_define $(eval NEW_EXTRAS := $(call TOSMake_makelist,$(1),extra)) $(eval NEW_TARGETS := $(call TOSMake_makelist,$(1),target)) $(eval VALID_EXTRAS += $(NEW_EXTRAS)) $(eval VALID_TARGETS += $(NEW_TARGETS)) $(eval TARGETS = $(filter $(call names,$(VALID_TARGETS)),$(GOALS))) endef # TOSMake_include_platform(dir) # Pull in a directory as a new TOSMake platform, which MUST be a subdir of # TOSMAKE_PATH. A platform directory must also have a .rules file, which # is automatically evaluated. TOSMake_include_platform=$(eval $(call TOSMake_include_platform_define,$(1))) define TOSMake_include_platform_define $(call TOSMake_include_dir,$(1)) $(call TOSMake_include,$(1)/$(1).rules) endef ### --- ### --- Include Makelocal and Makedefaults ### --- # Makelocal comes first to allow overriding Makedefaults. -include $(TINYOS_MAKELOCAL) -include $(TINYOS_MAKEDEFAULTS) PLATFORMDIR ?= $(TOSDIR)/platforms/$(PLATFORM) # Mark TOSMAKE_PATH with a + so that they're not searched for by TOSMake_find. $(foreach incdir,$(addprefix +,$(TOSMAKE_PATH)),$(call TOSMake_accum_dir,$(incdir))) $(foreach file,$(VALID_EXTRAS),$(if $(filter $(call names,$(file)),$(GOALS)),$(eval include $(file)))) $(foreach file,$(VALID_TARGETS),$(if $(filter $(call names,$(file)),$(GOALS)),$(eval include $(file)))) # Make default rules for each extra with full argument $(foreach goal,$(MAKECMDGOALS),$(if $(filter-out $(TARGETS) help,$(goal)),$(eval $(call TOSMake_extra_targets,$(goal))))) ### --- ### --- Define USAGE, print help if necessary or requested, etc. ### --- # USAGE is printed out when help is requested. Files other than this should # add text to HELP, not USAGE. define USAGE Usage: make make help Valid targets: $(call names,$(VALID_TARGETS)) Valid extras: $(call names,$(VALID_EXTRAS)) $(HELP) endef # If no target or an invalid target is specified, print usage. ifeq ($(TARGETS),) ifeq ($(GOALS),) $(error $(USAGE)Please specify a valid target) else $(error $(USAGE)ERROR, "$(GOALS)" does not specify a valid target) endif endif # If the user specifically had help on the command line, don't build any # targets, instead display help information and exit with a nice error. ifeq ($(filter help,$(GOALS)),help) define USAGE Usage: make $(TARGETS) Valid targets: $(call names,$(VALID_TARGETS)) Valid extras: $(call names,$(VALID_EXTRAS)) $(HELP) endef $(error $(USAGE)Thank you) endif $(COMPONENT).nc: @echo "ERROR: You need to create a top level file called $(COMPONENT).nc, or modify your local Makefile to point to the real name of your top level component." @false .PHONY: FORCE tinyos-2.1.2+dfsg/support/make/README000066400000000000000000000120601207233610700172710ustar00rootroot00000000000000README for the TinyOS Make System created on 7 Jan 2004 written by Cory Sharp updated on 16 Apr 2004 by Cory Sharp To describe new TOSMAKE_INCLUDE variable for user make subdirectories. $Id: README,v 1.4 2006-12-12 18:22:55 vlahan Exp $ ---------------------------------------------------------------------------- Introduction ---------------------------------------------------------------------------- This is a new make system. It's nicer than the old apps/Makerules, especially for adding new targets and platforms. Basically, new features can be added without getting in the way of existing make platforms and rules. ---------------------------------------------------------------------------- Quick Start ---------------------------------------------------------------------------- To use this build system, GNU Make 3.80 or greater is required; check with "make --version". Then, set MAKERULES, find an application, and try make export MAKERULES=`ncc -print-tosdir`/../tools/make/Makerules cd `ncc -print-tosdir`/../apps/Blink #or any app dir make telos help The end of this document has a few notes on some issues that can arise with GNU Make 3.80. ---------------------------------------------------------------------------- Directory Structure and Naming Conventions ---------------------------------------------------------------------------- The root of the make system is the make/ directory in which this README is located. You'll find two main types of files with the extensions .target and .extra. Both types of files define valid make goals. A target file must define a valid make target of the same name. An extra file automatically has a dummy target created for it, making it useful for defining extra make variables given a particular goal on the command line. There are also subdirectories in make/, such as make/avr/ and make/hc08/. Files in these directories are not exposed to the current build unless imported from another goal. For instance, the mica2 target imports the avr/ directory with the command "$(call TOSMake_include_platform,avr)", which further exposes the target and extra files in the avr subdirectory as valid goals for the current build. The TOSMake_include_platform function expects to find a .rules file of the same name as the directory, such as avr/avr.rules. It is expected that the primary build behavior occurs in a platform/platform.rules file (such as avr/avr.rules). Further target and extra goals in that platform make directory should augment the behavior of the rules file. Then, platform build targets are globally exposed by creating a simple .target file in the make/ root. Overall, this structure gives a lot of opportunity to change the behavior of a build given goals on the command line with few or no ifdef's in the makefiles. And, each make behavior is localized to a single file, which I think should be pretty nice. There's also a make/Makerules file. Do not edit make/Makerules. No new build features should ever be exposed via make/Makerules, but rather though the .rules, .target, and .extra files. Let me repeat, do not edit make/Makerules, add new features elsewhere. make/Makerules is the frontend that defines the structure and behavior on those special file extensions. ---------------------------------------------------------------------------- User make/ directories ---------------------------------------------------------------------------- I've added a new variable TOSMAKE_PATH that allows you to define additional root directories for the TinyOS Make System that behave just like the primary make/ directory. In one of your own make files, just add one or more directories to TOSMAKE_PATH sometime before make/Makerules is included: TOSMAKE_PATH += $(TOSDIR)/../contrib/eyes/make That's all you need, and you're in business. Enjoy. ---------------------------------------------------------------------------- make 3.80 ---------------------------------------------------------------------------- The standard version of GNU Make 3.80 (based on October 2002 source) has a bug which this make system can trigger. If a make variable is longer than 200 bytes (characters), then make will report that it has run out of virtual memory and exit. This can happen if, for example, your application depends on a lot of Java/mig message classes, which are BUILD_EXTRA_DEPS. The only way to fix this problem is to use a newer, patched version of make 3.80. All TinyOS releases after 1.1.8 should have a patched version, and will work properly. Pre-1.1.7 versions, however, may run into this problem; you can either upgrade to >= 1.1.8, or download the make source, apply the patch 'eval-crash.diff' in this directory, and compile then install the patched version. ---------------------------------------------------------------------------- Go go go ---------------------------------------------------------------------------- ... okay, hopefully that's enough head's up that you can poke around this directory tree and add new targets, extras, and platforms. Good luck, and holler if you want more documentation. tinyos-2.1.2+dfsg/support/make/all.target000066400000000000000000000004151207233610700203720ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: all.target,v 1.4 2006-12-12 18:22:55 vlahan Exp $ PLATFORMS ?= mica mica2 mica2dot telos micaz pc all: FORCE for target in $(filter-out $(INVALID_PLATFORMS),$(PLATFORMS)); do cmd="make $$target"; echo ".... $$cmd"; $$cmd; done tinyos-2.1.2+dfsg/support/make/appdoc.extra000066400000000000000000000012541207233610700207270ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: appdoc.extra,v 1.2 2008-05-02 20:49:44 idgay Exp $ # configure the base for the app dirs. This is used to generate more # useful package names in the documentation. ifeq ($(BASEDIR)_x, _x) BASEDIR := $(shell pwd | sed 's@\(.*\)/apps.*$$@\1@' ) endif BUILD_DEPS = appdoc_ ifeq ($(filter quiet,$(APPDOC)),quiet) QUIET = -quiet endif appdoc_: FORCE @echo " Making application documentation for $(COMPONENT) on $(PLATFORM)" # first generate the xml files nesdoc -o build $(NESDOC_FLAGS) $(PFLAGS) $(CFLAGS) $(COMPONENT).nc -app $(QUIET) # generate html from the xml files nesdoc -o build -html -target=$(PLATFORM) $(QUIET) tinyos-2.1.2+dfsg/support/make/avr/000077500000000000000000000000001207233610700172025ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/make/avr/avr-studio-debug.extra000066400000000000000000000015701207233610700234330ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: avr-studio-debug.extra,v 1.2 2009-01-21 16:26:55 sallai Exp $ BUILD_DEPS = srec tosimage bytes $(POST_BUILD_EXTRA_DEPS) buildelf APPC_WINPATH = $(BUILDDIR)/app-winpath.c MAIN_ELF = $(BUILDDIR)/main.elf # no inlining or optimizations OPTFLAGS += -O0 -fnesc-no-inline # produce dwarf-2 debug information for AVR Studio OPTFLAGS += -gdwarf-2 # we use ncc to invoke gcc thus need to allow dollars in identifiers #OPTFLAGS += -fdollars-in-identifiers # alternatively, we can use a different separator PFLAGS += -fnesc-separator=__ buildelf: FORCE @echo " building ELF output $(MAIN_ELF) for debugging in AVR Studio" @perl -pe 's/#(.*)\"(.*)\"/ "#$$1\"".`cygpath -ma $$2`."\""/e; s/\n\"/\"/;' $(BUILDDIR)/app.c > $(APPC_WINPATH) @$(NCC) -o $(MAIN_ELF) $(NCC_SAFE_TINYOS_FLAGS) $(OPTFLAGS) $(PFLAGS) $(CFLAGS) $(APPC_WINPATH) $(LIBS) $(LDFLAGS) tinyos-2.1.2+dfsg/support/make/avr/avr.rules000066400000000000000000000113261207233610700210510ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: avr.rules,v 1.29 2010-03-17 00:38:04 klueska Exp $ define AVR_HELP AVR extras: debug : compile with minimal optimization and debug symbols debugopt : compile with debug symbols Programmer options: dapa : (default) use parallel port programmer mib510, : use MIB510/MIB520 serial port programming board at port eprb, : use EPRB (MIB600) at hostname avrisp, : use AVRISP serial programmer at port The dev or host parameter for the programmer option need not be specified, in which case it is expected to be defined as in an environment variable of the same name in all caps (such as MIB510, EPRB, or AVRISP). endef HELP += $(AVR_HELP) ifdef MAKE_DEPUTY_FLAG NCC_SAFE_TINYOS_FLAGS = -DSAFE_TINYOS -I$(TOSDIR)/lib/safe -fnesc-deputy -fnesc-deputy-args='-I$(TOSDIR)/lib/safe/include --FLIDs=build/$(PLATFORM)/flids.txt --envmachine -DSAFE_TINYOS --nolib ' else NCC_SAFE_TINYOS_FLAGS = endif OBJCOPY = avr-objcopy OBJDUMP = avr-objdump SET_ID = tos-set-symbols PROGRAMMER ?= uisp NCC = ncc LIBS = -lm # Use __ as the separator - requires nesC 1.2.9 or later ifneq ($(filter sim,$(GOALS)),sim) ifneq ($(filter sim-sf,$(GOALS)),sim-sf) PFLAGS += -fnesc-separator=__ endif endif AMADDR = ActiveMessageAddressC__addr BUILDDIR ?= build/$(PLATFORM) MAIN_EXE = $(BUILDDIR)/main.exe MAIN_SREC = $(BUILDDIR)/main.srec MAIN_IHEX = $(BUILDDIR)/main.ihex INSTALL_SREC = $(MAIN_SREC).out$(if $(NODEID),-$(NODEID),) VOLUMEFILE ?= volumes-at45db.xml VOLUME_ALLOCATOR ?= tos-storage-at45db VOLUME_ALLOCATOR_FLAGS ?= PFLAGS += -Wall -Wshadow $(NESC_FLAGS) PFLAGS += -target=$(PLATFORM) -fnesc-cfile=$(BUILDDIR)/app.c -board=$(SENSORBOARD) ifdef MSG_SIZE PFLAGS += -DTOSH_DATA_LENGTH=$(MSG_SIZE) endif ifdef DEFAULT_LOCAL_GROUP PFLAGS += -DDEFINED_TOS_AM_GROUP=$(DEFAULT_LOCAL_GROUP) endif AVRGCCMAJOR = $(shell avr-gcc -v 2>&1 | grep "gcc version" | sed -n 's/gcc version \([2-5]\)\.\([0-9]\)\.\([0-9]\).*/\1/p') ifeq ($(AVRGCCMAJOR),4) PFLAGS += --param max-inline-insns-single=100000 else PFLAGS += -finline-limit=100000 endif ifeq ($(PROGRAMMER),avrdude) ifeq ($(findstring Darwin, $(shell uname)), Darwin) AVRDUDE_CONF ?= /opt/local/etc/avrdude.conf endif ifeq ($(shell [ -f /etc/avrdude/avrdude.conf ] && echo subdir),subdir) AVRDUDE_CONF ?= /etc/avrdude/avrdude.conf else AVRDUDE_CONF ?= /etc/avrdude.conf endif ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin) AVRDUDE_CONF := $(shell cygpath -ms $(AVRDUDE_CONF)) endif PROGRAMMER_EXTRA_FLAGS += -C$(AVRDUDE_CONF) # PROGRAMMER_EXTRA_FLAGS += -v -v endif ifdef DEFAULT_PROGRAM_AVR DEFAULT_PROGRAM = $(DEFAULT_PROGRAM_AVR) endif DEFAULT_PROGRAM ?= dapa BUILDLESS_DEPS += bytes ifndef NOWIRING include $(TINYOS_MAKE_PATH)/wiring.extra endif # Use the 'if' function instead of the 'ifdef' construct because ifdef freaks # out with call in there. I don't know why. $(if $(PROGRAM),,$(call TOSMake_include,avr/$(DEFAULT_PROGRAM).extra)) # Build storage file if volumes.xml present ifneq ($(wildcard $(VOLUMEFILE)), ) build_storage: $(BUILDDIR)/StorageVolumes.h exe0: build_storage VOLUME_ALLOCATOR_FLAGS ?= $(BUILDDIR)/StorageVolumes.h: $(VOLUMEFILE) $(VOLUME_ALLOCATOR) $(VOLUME_ALLOCATOR_FLAGS) $(PLATFORMDIR) <$(VOLUMEFILE) >$@ || rm -f $@ PFLAGS += -I$(BUILDDIR) else build_storage: endif ifndef BUILD_DEPS ifeq ($(filter $(BUILDLESS_DEPS),$(GOALS)),) BUILD_DEPS = srec tosimage bytes $(POST_BUILD_EXTRA_DEPS) endif endif setid: FORCE @cmd () { echo "$$@"; $$@; }; if [ x = x$(NODEID) ]; then cmd cp $(MAIN_SREC) $(INSTALL_SREC); else cmd $(SET_ID) $(MAIN_SREC) $(INSTALL_SREC) TOS_NODE_ID=$(NODEID) $(AMADDR)=$(NODEID) ; fi delsetid: FORCE rm -f $(subst .srec.,.exe.,$(INSTALL_SREC)) $(INSTALL_SREC) srec: exe FORCE $(OBJCOPY) --output-target=srec $(MAIN_EXE) $(MAIN_SREC) tos_buildinfo: ihex build_buildinfo FORCE @: tosimage: ihex build_tosimage FORCE @: ihex: exe FORCE $(OBJCOPY) --output-target=ihex $(MAIN_EXE) $(MAIN_IHEX) exe: exe0 bytes FORCE @: exe0: builddir $(BUILD_EXTRA_DEPS) $(COMPONENT).nc FORCE @echo " compiling $(COMPONENT) to a $(PLATFORM) binary" $(NCC) -o $(MAIN_EXE) $(NCC_SAFE_TINYOS_FLAGS) $(OPTFLAGS) $(PFLAGS) $(CFLAGS) $(WIRING_CHECK_FLAGS) $(COMPONENT).nc $(LIBS) $(LDFLAGS) ifdef WIRING_CHECK_FILE @nescc-wiring $(WIRING_CHECK_FILE) endif ifdef STACK_CHECK @echo @-tos-ramsize $(PLATFORM) $(MAIN_EXE) @echo endif @echo " compiled $(COMPONENT) to $(MAIN_EXE)" builddir: FORCE mkdir -p $(BUILDDIR) bytes: FORCE @$(OBJDUMP) -h $(MAIN_EXE) | perl -ne '$$b{$$1}=hex $$2 if /^\s*\d+\s*\.(text|data|bss)\s+(\S+)/; END { printf("%16d bytes in ROM\n%16d bytes in RAM\n",$$b{text}+$$b{data},$$b{data}+$$b{bss}); }' tinyos-2.1.2+dfsg/support/make/avr/avr109.extra000066400000000000000000000020441207233610700212710ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make ifeq ($(AVR109),) $(error AVR109 must be defined, try "make $(TARGETS) help") endif PROGRAM = avr109 AVR109_BAUDRATE ?= 57600 ifeq ($(PROGRAMMER),avrdude) ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin) AVR109 := '\\.\$(AVR109)' endif ifdef BOOTLOADER_IMG ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin) BOOTLOADER_IMG := $(shell cygpath -m $(BOOTLOADER_IMG)) endif endif PROGRAMMER_FLAGS = -cavr109 -P$(AVR109) -b$(AVR109_BAUDRATE) $(PROGRAMMER_PART) $(PROGRAMMER_EXTRA_FLAGS) PROGRAMMER_INSTALL_SREC_FLAGS = -U flash:w:$(INSTALL_SREC):a PROGRAMMER_INSTALL_BOOTLOADER_FLAGS = -V -D -U flash:w:$(BOOTLOADER_IMG):a endif program: FORCE $(RESET_LINE) $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_SREC_FLAGS) program_bl: FORCE java org.szte.wsn.zigbit.Programmer -port $(AVR109) -baudrate $(BOOTLOADER_BAUDRATE) -reset -askforreset -sleep $(AVR109_SLEEP) $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_BOOTLOADER_FLAGS) tinyos-2.1.2+dfsg/support/make/avr/avrisp.extra000066400000000000000000000025051207233610700215550ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: avrisp.extra,v 1.8 2008-09-22 15:41:35 sallai Exp $ ifeq ($(AVRISP),) $(error AVRISP must be defined, try "make $(TARGETS) help") endif PROGRAM = avrisp ifeq ($(PROGRAMMER),avrdude) ifdef BOOTLOADER_IMG ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin) BOOTLOADER_IMG := $(shell cygpath -m $(BOOTLOADER_IMG)) endif endif PROGRAMMER_FLAGS = -cstk500 -P$(AVRISP) -U hfuse:w:$(AVR_FUSE_H):m $(PROGRAMMER_PART) $(PROGRAMMER_EXTRA_FLAGS) $(PROGRAMMER_EXTRA_FLAGS_AVRISP) PROGRAMMER_INSTALL_SREC_FLAGS = -U flash:w:$(INSTALL_SREC):a PROGRAMMER_INSTALL_BOOTLOADER_FLAGS = -V -D -U flash:w:$(BOOTLOADER_IMG):a endif ifeq ($(PROGRAMMER),uisp) PROGRAMMER_FLAGS = -dprog=stk500 -dserial=$(AVRISP) --wr_fuse_h=$(AVR_FUSE_H) $(PROGRAMMER_PART) $(PROGRAMMER_EXTRA_FLAGS) $(PROGRAMMER_EXTRA_FLAGS_AVRISP) PROGRAMMER_INSTALL_SREC_FLAGS = --erase --upload if=$(INSTALL_SREC) --verify PROGRAMMER_INSTALL_BOOTLOADER_FLAGS = --upload if=$(BOOTLOADER_IMG) --verify endif program: FORCE @echo " installing $(PLATFORM) binary using avrisp" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_SREC_FLAGS) program_bl: FORCE @echo " installing $(PLATFORM) bootloader using avrisp" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_BOOTLOADER_FLAGS) tinyos-2.1.2+dfsg/support/make/avr/avrispmkii.extra000066400000000000000000000021371207233610700224300ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: avrispmkii.extra,v 1.1 2008-09-23 15:47:56 sallai Exp $ ifeq ($(AVRISPMKII),) $(error AVRISPMKII must be defined, try "make $(TARGETS) help") endif PROGRAM = avrispmkii ifeq ($(PROGRAMMER),avrdude) ifdef BOOTLOADER_IMG ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin) BOOTLOADER_IMG := $(shell cygpath -m $(BOOTLOADER_IMG)) endif endif PROGRAMMER_FLAGS = -cavrispmkII -P$(AVRISPMKII) -U hfuse:w:$(AVR_FUSE_H):m $(PROGRAMMER_PART) $(PROGRAMMER_EXTRA_FLAGS) $(PROGRAMMER_EXTRA_FLAGS_AVRISPMKII) PROGRAMMER_INSTALL_SREC_FLAGS = -U flash:w:$(INSTALL_SREC):a PROGRAMMER_INSTALL_BOOTLOADER_FLAGS = -V -D -U flash:w:$(BOOTLOADER_IMG):a endif ifeq ($(PROGRAMMER),uisp) $(error uisp is not supported, please use avrdude") endif program: FORCE @echo " installing $(PLATFORM) binary using avrispmkii" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_SREC_FLAGS) program_bl: FORCE @echo " installing $(PLATFORM) bootloader using avrispmkii" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_BOOTLOADER_FLAGS) tinyos-2.1.2+dfsg/support/make/avr/dapa.extra000066400000000000000000000023471207233610700211620ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: dapa.extra,v 1.7 2008-06-18 20:22:51 razvanm Exp $ PROGRAM = dapa ifeq ($(PROGRAMMER),avrdude) ifdef BOOTLOADER_IMG ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin) BOOTLOADER_IMG := $(shell cygpath -m $(BOOTLOADER_IMG)) endif endif PROGRAMMER_FLAGS = -cdapa -U hfuse:w:$(AVR_FUSE_H):m $(PROGRAMMER_PART) $(PROGRAMMER_EXTRA_FLAGS) $(PROGRAMMER_EXTRA_FLAGS_MIB) PROGRAMMER_INSTALL_SREC_FLAGS = -U flash:w:$(INSTALL_SREC):a PROGRAMMER_INSTALL_BOOTLOADER_FLAGS = -V -D -U flash:w:$(BOOTLOADER_IMG):a endif ifeq ($(PROGRAMMER),uisp) PROGRAMMER_FLAGS = -dprog=dapa --wr_fuse_h=$(AVR_FUSE_H) $(PROGRAMMER_PART) $(PROGRAMMER_EXTRA_FLAGS) $(PROGRAMMER_EXTRA_FLAGS_MIB) PROGRAMMER_INSTALL_SREC_FLAGS = --erase --upload if=$(INSTALL_SREC) --verify PROGRAMMER_INSTALL_BOOTLOADER_FLAGS = --upload if=$(BOOTLOADER_IMG) --verify endif program: FORCE @echo " installing $(PLATFORM) binary using dapa" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_SREC_FLAGS) program_bl: FORCE @echo " installing $(PLATFORM) bootloader using dapa" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_BOOTLOADER_FLAGS) tinyos-2.1.2+dfsg/support/make/avr/debug.extra000066400000000000000000000002351207233610700213350ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: debug.extra,v 1.4 2006-12-12 18:22:59 vlahan Exp $ CFLAGS += -DENABLE_JTAG_DEBUG OPTFLAGS += -O1 -g -fnesc-no-inline tinyos-2.1.2+dfsg/support/make/avr/debugopt.extra000066400000000000000000000001551207233610700220610ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: debugopt.extra,v 1.4 2006-12-12 18:22:59 vlahan Exp $ OPTFLAGS += -g tinyos-2.1.2+dfsg/support/make/avr/dragonjtag.extra000066400000000000000000000014251207233610700223710ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make DRAGONJTAG?=usb PROGRAM = dragonjtag ifeq ($(PROGRAMMER),avrdude) ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin) DRAGONJTAG := '\\.\$(DRAGONJTAG)' endif ifdef BOOTLOADER_IMG ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin) BOOTLOADER_IMG := $(shell cygpath -m $(BOOTLOADER_IMG)) endif endif PROGRAMMER_FLAGS = -cdragon_jtag -P$(DRAGONJTAG) $(PROGRAMMER_PART) $(PROGRAMMER_EXTRA_FLAGS) PROGRAMMER_INSTALL_SREC_FLAGS = -U flash:w:$(INSTALL_SREC):a PROGRAMMER_INSTALL_BOOTLOADER_FLAGS = -V -D -U flash:w:$(BOOTLOADER_IMG):a endif program: FORCE @echo " installing $(PLATFORM) binary using dragonjtag" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_SREC_FLAGS) tinyos-2.1.2+dfsg/support/make/avr/eprb.extra000066400000000000000000000024761207233610700212100ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: eprb.extra,v 1.10 2008-09-22 20:56:36 idgay Exp $ ifeq ($(EPRB),) $(error EPRB must be defined, try "make $(TARGETS) help") endif PROGRAM = eprb ifeq ($(PROGRAMMER),avrdude) ifdef BOOTLOADER_IMG ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin) BOOTLOADER_IMG := $(shell cygpath -m $(BOOTLOADER_IMG)) endif endif PROGRAMMER_FLAGS = -cmib510 -Pnet:$(EPRB):10001 -U hfuse:w:$(AVR_FUSE_H):m $(PROGRAMMER_PART) $(PROGRAMMER_EXTRA_FLAGS) $(PROGRAMMER_EXTRA_FLAGS_STK) PROGRAMMER_INSTALL_SREC_FLAGS = -U flash:w:$(INSTALL_SREC):a PROGRAMMER_INSTALL_BOOTLOADER_FLAGS = -V -D -U flash:w:$(BOOTLOADER_IMG):a endif ifeq ($(PROGRAMMER),uisp) PROGRAMMER_FLAGS = -dprog=stk500 -dhost=$(EPRB) --wr_fuse_h=$(AVR_FUSE_H) $(PROGRAMMER_PART) $(PROGRAMMER_EXTRA_FLAGS) $(PROGRAMMER_EXTRA_FLAGS_STK) PROGRAMMER_INSTALL_SREC_FLAGS = --erase --upload if=$(INSTALL_SREC) --verify PROGRAMMER_INSTALL_BOOTLOADER_FLAGS = --upload if=$(BOOTLOADER_IMG) --verify endif program: FORCE @echo " installing $(PLATFORM) binary using eprb" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_SREC_FLAGS) program_bl: FORCE @echo " installing $(PLATFORM) bootloader using eprb" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_BOOTLOADER_FLAGS) tinyos-2.1.2+dfsg/support/make/avr/install.extra000066400000000000000000000004361207233610700217200ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: install.extra,v 1.5 2008-06-18 20:22:51 razvanm Exp $ NODEID = $(INSTALL) BUILD_DEPS = srec tosimage bytes $(POST_BUILD_EXTRA_DEPS) setid program delsetid ifdef BOOTLOADER ifeq ($(BOOTLOADER),tosboot) BUILD_DEPS += program_bl endif endif tinyos-2.1.2+dfsg/support/make/avr/jtagicemkii.extra000066400000000000000000000017521207233610700225340ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make ifeq ($(JTAGICEMKII),) $(error JTAGICEMKII must be defined, try "make $(TARGETS) help") endif PROGRAM = jtagicemkii ifeq ($(PROGRAMMER),avrdude) ifdef BOOTLOADER_IMG ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin) BOOTLOADER_IMG := $(shell cygpath -m $(BOOTLOADER_IMG)) endif endif PROGRAMMER_FLAGS = -c jtag2fast -P $(JTAGICEMKII) -U hfuse:w:$(AVR_FUSE_H):m -U lfuse:w:$(AVR_FUSE_L):m $(PROGRAMMER_PART) $(PROGRAMMER_EXTRA_FLAGS) PROGRAMMER_INSTALL_SREC_FLAGS = -U flash:w:$(INSTALL_SREC):a PROGRAMMER_INSTALL_BOOTLOADER_FLAGS = -D -U flash:w:$(BOOTLOADER_IMG):a endif program: FORCE @echo " installing $(PLATFORM) binary using AVR JTAGICE mkII" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_SREC_FLAGS) program_bl: FORCE @echo " installing $(PLATFORM) bootloader using AVR JTAGICE mkII" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_BOOTLOADER_FLAGS) tinyos-2.1.2+dfsg/support/make/avr/mib510.extra000066400000000000000000000026531207233610700212520ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: mib510.extra,v 1.9 2009-02-04 19:38:30 sallai Exp $ ifeq ($(MIB510),) $(error MIB510 must be defined, try "make $(TARGETS) help") endif PROGRAM = mib510 ifeq ($(PROGRAMMER),avrdude) ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin) MIB510 := '\\.\$(MIB510)' endif ifdef BOOTLOADER_IMG ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin) BOOTLOADER_IMG := $(shell cygpath -m $(BOOTLOADER_IMG)) endif endif PROGRAMMER_FLAGS = -cmib510 -P$(MIB510) -U hfuse:w:$(AVR_FUSE_H):m $(PROGRAMMER_PART) $(PROGRAMMER_EXTRA_FLAGS) $(PROGRAMMER_EXTRA_FLAGS_MIB) PROGRAMMER_INSTALL_SREC_FLAGS = -U flash:w:$(INSTALL_SREC):a PROGRAMMER_INSTALL_BOOTLOADER_FLAGS = -V -D -U flash:w:$(BOOTLOADER_IMG):a endif ifeq ($(PROGRAMMER),uisp) PROGRAMMER_FLAGS = -dprog=mib510 -dserial=$(MIB510) --wr_fuse_h=$(AVR_FUSE_H) $(PROGRAMMER_PART) $(PROGRAMMER_EXTRA_FLAGS) $(PROGRAMMER_EXTRA_FLAGS_MIB) PROGRAMMER_INSTALL_SREC_FLAGS = --erase --upload if=$(INSTALL_SREC) --verify PROGRAMMER_INSTALL_BOOTLOADER_FLAGS = --upload if=$(BOOTLOADER_IMG) --verify endif program: FORCE @echo " installing $(PLATFORM) binary using mib510" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_SREC_FLAGS) program_bl: FORCE @echo " installing $(PLATFORM) bootloader using mib510" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(PROGRAMMER_INSTALL_BOOTLOADER_FLAGS) tinyos-2.1.2+dfsg/support/make/avr/mib520.extra000066400000000000000000000003611207233610700212450ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: mib520.extra,v 1.1 2008-04-23 20:31:58 sallai Exp $ # The MIB520 uses the same protocol as the MIB510, so we # just include mib510.extra MIB510 = $(MIB520) include $(TINYOS_MAKE_PATH)/avr/mib510.extra tinyos-2.1.2+dfsg/support/make/avr/reinstall.extra000066400000000000000000000003651207233610700222500ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: reinstall.extra,v 1.5 2008-06-18 20:22:51 razvanm Exp $ NODEID = $(REINSTALL) BUILD_DEPS = setid program delsetid ifdef BOOTLOADER ifeq ($(BOOTLOADER),tosboot) BUILD_DEPS += program_bl endif endif tinyos-2.1.2+dfsg/support/make/avr/reset.target000066400000000000000000000003201207233610700215270ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: reset.target,v 1.4 2006-12-12 18:22:59 vlahan Exp $ BUILD_DEPS = harmless reset: FORCE @echo " resetting $(PLATFORM)" $(PROGRAMMER) $(PROGRAMMER_FLAGS) harmless: tinyos-2.1.2+dfsg/support/make/avr/zbp.extra000066400000000000000000000006261207233610700210460ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: zbp.extra,v 1.2 2010-07-19 08:00:44 mmaroti Exp $ PROGRAM = zbp ifneq ($(ZBP),) ZBP_PORT = $(ZBP) endif ifneq ($(ZBP_BAUDRATE),) ZBP_BAUDRATE = " -baudrate $(ZBP_BAUDRATE)" endif program: FORCE @echo " installing $(PLATFORM) binary using zigbit bootloader" java net.tinyos.util.ZigbitProgrammer -port $(ZBP_PORT)$(ZBP_BAUDRATE) -reset -upload $(INSTALL_SREC) tinyos-2.1.2+dfsg/support/make/blip.extra000066400000000000000000000021031207233610700204010ustar00rootroot00000000000000# -*- makefile -*- PFLAGS += -DCC2420_HW_ACKNOWLEDGEMENTS PFLAGS += -DCC2420_HW_ADDRESS_RECOGNITION PFLAGS += -DPACKET_LINK ifdef BLIP_L2_MTU PFLAGS += -DTOSH_DATA_LENGTH=$(BLIP_L2_MTU) else PFLAGS += -DTOSH_DATA_LENGTH=112 endif ifndef LOWPAN_ROOT LOWPAN_ROOT=$(TOSROOT) endif PFLAGS+=-I$(TOSDIR)/lib/net/ PFLAGS+=-I$(TOSDIR)/lib/printf/ PFLAGS+=-I$(LOWPAN_ROOT)/support/sdk/c/blip/ PFLAGS+=-I$(LOWPAN_ROOT)/tos/lib/net/blip/ PFLAGS+=-I$(LOWPAN_ROOT)/tos/lib/net/blip/interfaces/ PFLAGS+=-I$(LOWPAN_ROOT)/tos/lib/net/blip/nwprog/ PFLAGS+=-I$(LOWPAN_ROOT)/tos/lib/net/blip/shell/ PFLAGS+=-I$(LOWPAN_ROOT)/tos/lib/net/blip/serial/ PFLAGS+=-I$(LOWPAN_ROOT)/tos/lib/net/blip/platform/ PFLAGS+=-I$(LOWPAN_ROOT)/tos/lib/net/blip/icmp/ PFLAGS+=-I$(LOWPAN_ROOT)/tos/lib/net/blip/dhcp/ PFLAGS+=$(LOWPAN_ROOT)/support/sdk/c/blip/lib6lowpan/iovec.c PFLAGS+=$(LOWPAN_ROOT)/support/sdk/c/blip/lib6lowpan/in_cksum.c PFLAGS+=$(LOWPAN_ROOT)/support/sdk/c/blip/lib6lowpan/ip_malloc.c PFLAGS+=$(LOWPAN_ROOT)/support/sdk/c/blip/lib6lowpan/utility.c PFLAGS+=$(LOWPAN_ROOT)/tos/lib/net/blip/table.c tinyos-2.1.2+dfsg/support/make/cc2420x.extra000066400000000000000000000047561207233610700205600ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: cc2420x.extra,v 1.4 2009-11-10 07:03:34 rflury Exp $ CFLAGS += -DCC2420X ifeq ($(TARGETS),micaz) PFLAGS+=-I$(TOSDIR)/platforms/micaz/chips/cc2420x PFLAGS+=-I$(TOSDIR)/chips/cc2420x PFLAGS+=-I$(TOSDIR)/lib/rfxlink/layers PFLAGS+=-I$(TOSDIR)/lib/rfxlink/util endif ifeq ($(TARGETS),telosb) PFLAGS+=-I$(TOSDIR)/platforms/telosa/chips/cc2420x/tmicro PFLAGS+=-I$(TOSDIR)/platforms/telosa/chips/cc2420x/tmicro/am PFLAGS+=-I$(TOSDIR)/platforms/telosa/chips/cc2420x PFLAGS+=-I$(TOSDIR)/chips/cc2420x PFLAGS+=-I$(TOSDIR)/lib/rfxlink/layers PFLAGS+=-I$(TOSDIR)/lib/rfxlink/util endif ifeq ($(TARGETS),epic) PFLAGS+=-I$(TOSDIR)/platforms/telosa/chips/cc2420x/tmicro PFLAGS+=-I$(TOSDIR)/platforms/telosa/chips/cc2420x/tmicro/am PFLAGS+=-I$(TOSDIR)/platforms/telosa/chips/cc2420x PFLAGS+=-I$(TOSDIR)/chips/cc2420x PFLAGS+=-I$(TOSDIR)/lib/rfxlink/layers PFLAGS+=-I$(TOSDIR)/lib/rfxlink/util endif ifeq ($(TARGETS),shimmer) PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/tmicro PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/tmicro/am PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x PFLAGS+=-I$(TOSDIR)/chips/cc2420x PFLAGS+=-I$(TOSDIR)/lib/rfxlink/layers PFLAGS+=-I$(TOSDIR)/lib/rfxlink/util endif ifeq ($(TARGETS),shimmer2) PFLAGS+=-I$(TOSDIR)/platforms/shimmer2/chips/cc2420x/tmicro PFLAGS+=-I$(TOSDIR)/platforms/shimmer2/chips/cc2420x PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/tmicro PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/tmicro/am PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x PFLAGS+=-I$(TOSDIR)/chips/cc2420x PFLAGS+=-I$(TOSDIR)/lib/rfxlink/layers PFLAGS+=-I$(TOSDIR)/lib/rfxlink/util PFLAGS+=-I$(TOSDIR)/lib/diagmsg endif ifeq ($(TARGETS),shimmer2r) PFLAGS+=-I$(TOSDIR)/platforms/shimmer2r/chips/cc2420x/tmicro PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/tmicro PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/tmicro/am PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x PFLAGS+=-I$(TOSDIR)/chips/cc2420x PFLAGS+=-I$(TOSDIR)/lib/rfxlink/layers PFLAGS+=-I$(TOSDIR)/lib/rfxlink/util endif ifeq ($(TARGETS),span) PFLAGS+=-I$(TOSDIR)/platforms/span/chips/cc2420x/tmicro PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/tmicro PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/tmicro/am PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x PFLAGS+=-I$(TOSDIR)/chips/cc2420x PFLAGS+=-I$(TOSDIR)/lib/rfxlink/layers PFLAGS+=-I$(TOSDIR)/lib/rfxlink/util endif tinyos-2.1.2+dfsg/support/make/cc2420x_32khz.extra000066400000000000000000000040361207233610700215700ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: cc2420x_32khz.extra,v 1.4 2009-11-10 07:03:34 rflury Exp $ CFLAGS += -DCC2420X ifeq ($(TARGETS),telosb) PFLAGS+=-I$(TOSDIR)/platforms/telosa/chips/cc2420x/t32khz PFLAGS+=-I$(TOSDIR)/platforms/telosa/chips/cc2420x/t32khz/am PFLAGS+=-I$(TOSDIR)/platforms/telosa/chips/cc2420x PFLAGS+=-I$(TOSDIR)/chips/cc2420x PFLAGS+=-I$(TOSDIR)/lib/rfxlink/layers PFLAGS+=-I$(TOSDIR)/lib/rfxlink/util endif ifeq ($(TARGETS),shimmer) PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/t32khz PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/t32khz/am PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x PFLAGS+=-I$(TOSDIR)/chips/cc2420x PFLAGS+=-I$(TOSDIR)/lib/rfxlink/layers PFLAGS+=-I$(TOSDIR)/lib/rfxlink/util endif ifeq ($(TARGETS),shimmer2) PFLAGS+=-I$(TOSDIR)/platforms/shimmer2/chips/cc2420x/t32khz PFLAGS+=-I$(TOSDIR)/platforms/shimmer2/chips/cc2420x PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/t32khz PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/t32khz/am PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x PFLAGS+=-I$(TOSDIR)/chips/cc2420x PFLAGS+=-I$(TOSDIR)/lib/rfxlink/layers PFLAGS+=-I$(TOSDIR)/lib/rfxlink/util PFLAGS+=-I$(TOSDIR)/lib/diagmsg endif ifeq ($(TARGETS),shimmer2r) PFLAGS+=-I$(TOSDIR)/platforms/shimmer2r/chips/cc2420x/t32khz PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/t32khz PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/t32khz/am PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x PFLAGS+=-I$(TOSDIR)/chips/cc2420x PFLAGS+=-I$(TOSDIR)/lib/rfxlink/layers PFLAGS+=-I$(TOSDIR)/lib/rfxlink/util endif ifeq ($(TARGETS),span) PFLAGS+=-I$(TOSDIR)/platforms/span/chips/cc2420x/t32khz PFLAGS+=-I$(TOSDIR)/platforms/span/chips/cc2420x PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/t32khz PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x/t32khz/am PFLAGS+=-I$(TOSDIR)/platforms/shimmer/chips/cc2420x PFLAGS+=-I$(TOSDIR)/chips/cc2420x PFLAGS+=-I$(TOSDIR)/lib/rfxlink/layers PFLAGS+=-I$(TOSDIR)/lib/rfxlink/util endif tinyos-2.1.2+dfsg/support/make/clean.target000066400000000000000000000004511207233610700207040ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: clean.target,v 1.7 2008-09-22 20:54:11 idgay Exp $ clean: FORCE rm -rf build $(CLEAN_EXTRA) pp rm -rf _TOSSIMmodule.so TOSSIM.pyc TOSSIM.py app.xml simbuild rm -rf VolumeMapC.nc rm -f $(COMPONENT).cmap $(COMPONENT).dot $(COMPONENT).html $(COMPONENT).png tinyos-2.1.2+dfsg/support/make/coap.extra000066400000000000000000000012401207233610700203760ustar00rootroot00000000000000# -*- makefile -*- PFLAGS += -DBIG_ENDIAN=4321 PFLAGS += -DLITTLE_ENDIAN=1234 PFLAGS += -DBYTE_ORDER=LITTLE_ENDIAN #PFLAGS += -DBYTE_ORDER=BIG_ENDIAN PFLAGS += -DNDEBUG=1 PFLAGS+=-I$(TOSROOT)/tos/lib/net/coap/ PFLAGS+=-I$(TOSROOT)/tos/lib/app/coap/interfaces/ PFLAGS+=-I$(TOSROOT)/support/sdk/c/coap PFLAGS+=$(TOSROOT)/tos/lib/net/coap/tinyos_net.c PFLAGS+=$(TOSROOT)/support/sdk/c/coap/encode.c PFLAGS+=$(TOSROOT)/support/sdk/c/coap/list.c PFLAGS+=$(TOSROOT)/support/sdk/c/coap/net.c PFLAGS+=$(TOSROOT)/support/sdk/c/coap/pdu.c PFLAGS+=$(TOSROOT)/support/sdk/c/coap/str.c PFLAGS+=$(TOSROOT)/support/sdk/c/coap/subscribe.c PFLAGS+=$(TOSROOT)/support/sdk/c/coap/uri.c tinyos-2.1.2+dfsg/support/make/cthreads.extra000066400000000000000000000015671207233610700212650ustar00rootroot00000000000000# Extra threads Makefile target to enable thread support for tinyos # Kevin Klues May 16th, 2008 #Get all the normal include directories for a threads build $(call TOSMake_include,threads.extra) PFLAGS += -DCTHREADS #Include directories required specifically for cthreads builds THREADS_CSYSTEM_DIR = $(TOS_THREADS_DIR)/csystem CFLAGS += -I$(THREADS_CSYSTEM_DIR) #Setup flag to pass to storage volume allocator to indicate threads are being used VOLUME_ALLOCATOR_FLAGS = -t #Set up extra c file to compile functions for thread manipulation #Also define the top level nesC component as the TinyOSEntryPointC component COMPONENT=$(THREADS_CSYSTEM_DIR)/TinyOSEntryPointC TOSTHREAD_MAIN_PATH=$(shell pwd)/$(TOSTHREAD_MAIN) ifdef TOSTHREAD_MAIN ifndef MAKE_DYNTHREADS ifneq ($(wildcard $(TOSTHREAD_MAIN_PATH)), ) CFLAGS += -DMAIN_APP=\"$(TOSTHREAD_MAIN_PATH)\" endif endif endif tinyos-2.1.2+dfsg/support/make/docs.extra000066400000000000000000000017611207233610700204140ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: docs.extra,v 1.5 2008-05-02 20:49:44 idgay Exp $ # configure the base for the app dirs. This is used to generate more # useful package names in the documentation. ifeq ($(BASEDIR)_x, _x) BASEDIR := $(shell pwd | sed 's@\(.*\)/apps.*$$@\1@' ) endif # The output directory for generated documentation ifeq ($(DOCDIR)_x, _x) DOCDIR := $(BASEDIR)/doc/nesdoc endif COMMA=, DOCS := $(subst $(COMMA), ,$(subst ., ,$(DOCS))) ifeq ($(filter here,$(DOCS)),here) DOCDIR = doc endif ifeq ($(filter preserve,$(DOCS)),preserve) PFLAGS += -preserve endif ifeq ($(filter quiet,$(DOCS)),quiet) QUIET = -quiet endif BUILD_DEPS = docs_ docs_: FORCE @echo " Making documentation for $(COMPONENT) on $(PLATFORM)" # first generate the xml files nesdoc -o $(DOCDIR) $(NESDOC_FLAGS) $(PFLAGS) $(CFLAGS) $(QUIET) $(COMPONENT).nc ifneq ($(filter nohtml,$(DOCS)),nohtml) # generate html from the xml files nesdoc -o $(DOCDIR) -html $(QUIET) -target=$(PLATFORM) endif tinyos-2.1.2+dfsg/support/make/dynthreads.extra000066400000000000000000000031071207233610700216250ustar00rootroot00000000000000# Extra threads Makefile target to enable thread support for tinyos # Kevin Klues May 16th, 2008 MAKE_DYNTHREADS = BUILD_DEPS = dynthreads_all #Get all the normal include directories for a cthreads build $(call TOSMake_include,cthreads.extra) PFLAGS += -DDYNTHREADS #Stuff to build dynamically loadable binary DYNLOAD_CFILE = $(TOSTHREAD_MAIN_PATH) CFLAGS += -c PFLAGS += -x nesc BUILDDIR = build/$(PLATFORM)/dynthreads #DYNLOAD_BASENAME = $(shell basename $(DYNLOAD_CFILE) .c) DYNLOAD_BASENAME = main DYNLOAD_OBJFILE = $(BUILDDIR)/$(DYNLOAD_BASENAME).o DYNLOAD_BINFILE = $(BUILDDIR)/$(DYNLOAD_BASENAME).bin DYNLOAD_TOSFILE = $(BUILDDIR)/$(DYNLOAD_BASENAME).tos DYNLOAD_NCC_COMMAND = $(NCC) -o $(DYNLOAD_OBJFILE) $(PFLAGS) $(OPTFLAGS) $(CFLAGS) $(DYNLOAD_CFILE) DYNLOAD_OBJCOPY_COMMAND = $(OBJCOPY) --output-target=binary $(DYNLOAD_OBJFILE) $(DYNLOAD_BINFILE) DYNLOAD_GENTOS_COMMAND = tosthreads-dynamic-app $(DYNLOAD_OBJFILE) $(DYNLOAD_BINFILE) $(DYNLOAD_TOSFILE) dynthreads_build: dynthreads_builddir build_storage @echo " compiling $(DYNLOAD_CFILE) to a $(PLATFORM) dynamically loadable binary" $(DYNLOAD_NCC_COMMAND) $(DYNLOAD_OBJCOPY_COMMAND) $(DYNLOAD_GENTOS_COMMAND) ifneq ($(shell uname),Darwin) dynthreads_all: dynthreads_build @echo " $(shell stat -t $(DYNLOAD_TOSFILE) | perl -lane 'print $$F[1];') bytes in BINARY" @echo " writing TOS image" else dynthreads_all: dynthreads_build @echo " $(shell stat -F $(DYNLOAD_TOSFILE) | perl -lane 'print $$F[4];') bytes in BINARY" @echo " writing TOS image" endif dynthreads_builddir: mkdir -p $(BUILDDIR) tinyos-2.1.2+dfsg/support/make/epic.target000066400000000000000000000007771207233610700205550ustar00rootroot00000000000000#-*-Makefile-*- #$Id: epic.target,v 1.5 2010-02-26 23:36:34 sdhsdh Exp $ PLATFORM ?= epic # Default BSL assumes telosb-like programming interface MSP_BSL ?= tos-bsl MSP_BSL_FLAGS = --telosb VOLUME_FILE = volumes-at45db.xml VOLUME_ALLOCATOR ?= tos-storage-at45db ifdef CC2420_CHANNEL PFLAGS += -DCC2420_DEF_CHANNEL=$(CC2420_CHANNEL) endif # Include the epic-specific targets $(call TOSMake_include_platform,epic) # Include the msp extra targets $(call TOSMake_include_platform,msp) epic: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/epic/000077500000000000000000000000001207233610700173325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/make/epic/digi.extra000066400000000000000000000001051207233610700213070ustar00rootroot00000000000000MSP_BSL_FLAGS = --slow --swap-reset-test --invert-reset --invert-testtinyos-2.1.2+dfsg/support/make/epic/epic.rules000066400000000000000000000000001207233610700213140ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/make/epic/miniprog.extra000066400000000000000000000002711207233610700222230ustar00rootroot00000000000000#-*-Makefile-*- #$Id: miniprog.extra,v 1.1 2008-08-07 06:38:02 prabal Exp $ # Special flags for Epic USB Mini Programmer MSP_BSL_FLAGS = --swap-reset-test --invert-reset --invert-test tinyos-2.1.2+dfsg/support/make/eval-crash.diff000066400000000000000000000043111207233610700212700ustar00rootroot00000000000000Index: variable.h =================================================================== RCS file: /cvsroot/make/make/variable.h,v retrieving revision 1.24 diff -u -B -b -r1.24 variable.h --- variable.h 8 Aug 2002 00:11:19 -0000 1.24 +++ variable.h 25 Oct 2002 21:37:32 -0000 @@ -107,6 +107,8 @@ extern char *expand_argument PARAMS ((char *str, char *end)); extern char *variable_expand_string PARAMS ((char *line, char *string, long length)); +extern void install_variable_buffer PARAMS ((char **bufp, unsigned int *lenp)); +extern void restore_variable_buffer PARAMS ((char *buf, unsigned int len)); /* function.c */ extern int handle_function PARAMS ((char **op, char **stringp)); Index: expand.c =================================================================== RCS file: /cvsroot/make/make/expand.c,v retrieving revision 1.33 diff -u -B -b -r1.33 expand.c --- expand.c 14 Oct 2002 21:54:04 -0000 1.33 +++ expand.c 25 Oct 2002 21:37:32 -0000 @@ -545,3 +545,28 @@ return value; } + +/* Install a new variable_buffer context, returning the current one for + safe-keeping. */ + +void +install_variable_buffer (char **bufp, unsigned int *lenp) +{ + *bufp = variable_buffer; + *lenp = variable_buffer_length; + + variable_buffer = 0; + initialize_variable_output (); +} + +/* Restore a previously-saved variable_buffer setting (free the current one). + */ + +void +restore_variable_buffer (char *buf, unsigned int len) +{ + free (variable_buffer); + + variable_buffer = buf; + variable_buffer_length = len; +} Index: function.c =================================================================== RCS file: /cvsroot/make/make/function.c,v retrieving revision 1.71 diff -u -B -b -r1.71 function.c --- function.c 14 Oct 2002 21:54:04 -0000 1.71 +++ function.c 25 Oct 2002 21:37:32 -0000 @@ -1196,7 +1196,17 @@ static char * func_eval (char *o, char **argv, const char *funcname) { + char *buf; + unsigned int len; + + /* Eval the buffer. Pop the current variable buffer setting so that the + eval'd code can use its own without conflicting. */ + + install_variable_buffer (&buf, &len); + eval_buffer (argv[0]); + + restore_variable_buffer (buf, len); return o; } tinyos-2.1.2+dfsg/support/make/eyesIFX.target000066400000000000000000000003161207233610700211360ustar00rootroot00000000000000EYES_IFX_VER ?= v2 ifeq ($(EYES_IFX_VER),v2) EYES_IFX_TARGET = eyesIFXv2.target else EYES_IFX_TARGET = eyesIFXv1.target endif $(call TOSMake_include,$(EYES_IFX_TARGET)) eyesIFX: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/eyesIFXv1.target000066400000000000000000000005201207233610700214020ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: eyesIFXv1.target,v 1.5 2008-03-11 09:34:13 klueska Exp $ PLATFORM = eyesIFXv1 MSP_MCU = msp430f149 ifndef DEFAULT_PROGRAM DEFAULT_PROGRAM = jtag endif VOLUME_FILE = volumes-stm25p.xml VOLUME_ALLOCATOR ?= tos-storage-stm25p $(call TOSMake_include_platform,msp) eyesIFXv1: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/eyesIFXv2.target000066400000000000000000000010301207233610700214000ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: eyesIFXv2.target,v 1.5 2008-03-11 09:34:13 klueska Exp $ PLATFORM = eyesIFXv2 MSP_MCU = msp430f1611 #Flash Config VOLUME_FILE = volumes-at45db.xml VOLUME_ALLOCATOR ?= tos-storage-at45db ifndef DEFAULT_PROGRAM DEFAULT_PROGRAM = bsl endif MSP_BSL_FLAGS ?= --invert-test --invert-reset --f1x BSL?=/dev/ttyUSB1 ifeq (,$(findstring /dev/ttyUSB,$(BSL))) ifneq (,$(findstring USB,$(BSL))) BSL:=/dev/tty$(BSL) endif endif $(call TOSMake_include_platform,msp) eyesIFXv2: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/ident_flags.extra000066400000000000000000000005411207233610700217360ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: ident_flags.extra,v 1.4 2006-12-12 18:22:55 vlahan Exp $ IDENT_PL ?= tos-ident-flags IDENT_PROGRAM_NAME ?= $(COMPONENT) IDENT_FLAGS := $(shell $(IDENT_PL) "$(IDENT_PROGRAM_NAME)") CFLAGS += $(IDENT_FLAGS) BUILD_EXTRA_DEPS += ident_cache ident_cache: FORCE @echo '$(IDENT_FLAGS)' > $(BUILDDIR)/ident_flags.txt tinyos-2.1.2+dfsg/support/make/intelmote2.target000066400000000000000000000010321207233610700217000ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make PLATFORM = intelmote2 ifdef CC2420_CHANNEL PFLAGS += -DCC2420_DEF_CHANNEL=$(CC2420_CHANNEL) endif VOLUME_FILE = volumes-pxa27xp30.xml VOLUME_ALLOCATOR ?= tos-storage-pxa27xp30 #ASSEMBLY_FILES += $(PLATFORM_DIR)/../imote2/flash.s $(PLATFORM_DIR)/../imote2/binarymover.s ASSEMBLY_FILES += $(TOSDIR)/platforms/intelmote2/toscrt0.s $(TOSDIR)/chips/pxa27x/pxa27x_util.s CFLAGS += -DPXA27X_13M -T$(TOSDIR)/platforms/intelmote2/tos.x $(call TOSMake_include_platform,pxa27x) intelmote2: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/iris.target000066400000000000000000000007571207233610700206010ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: iris.target,v 1.5 2009-03-10 15:09:55 sallai Exp $ PLATFORM = iris SENSORBOARD ?= micasb PROGRAMMER ?= avrdude ifeq ($(PROGRAMMER),avrdude) PROGRAMMER_PART ?= -pm1281 -U efuse:w:0xff:m endif ifeq ($(PROGRAMMER),uisp) PROGRAMMER_PART ?= -dpart=ATmega1281 --wr_fuse_e=ff endif AVR_FUSE_H ?= 0xd9 AVR_FUSE_L ?= 0xff ifdef RF230_CHANNEL PFLAGS += -DRF230_DEF_CHANNEL=$(RF230_CHANNEL) endif $(call TOSMake_include_platform,avr) iris: $(BUILD_DEPS) @:tinyos-2.1.2+dfsg/support/make/m16c60/000077500000000000000000000000001207233610700173265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/make/m16c60/crt_62p.S000077500000000000000000000124721207233610700207420ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Henrik Makitaavola * @author Per Lindgren * @author Johan Eriksson * @author Johan Nordlander * @author Simon Aittamaa */ .set PM0, 0x04 .set PRCR, 0x0a .text .global __vector_default .global m32c_jsri16 .extern _main .section .init0,"ax",@progbits .global _start _start: /* Setup processor mode, single chip mode, and stack pointers */ ldc #_istack, isp mov.b #0x02, PRCR mov.b #0x00, PM0 mov.b #0x00, PRCR /* Setup the FLG register to some sane defaults. */ ldc #0, flg /* Clear the U flag. This sets the stack pointer to the interrupt stack. This is done so that only one stack is used by both interrupt routines and other code. There would else be a problem when threads are changed in interrupt routines in the tosthread library. */ fclr u /* Setup interrupt vector. */ ldc #%hi16(_vectors_variable), intbh ldc #%lo16(_vectors_variable), intbl /* Copy .data. */ mov.b #%hi8(__data_start), r1h mov.w #%lo16(__data_start), a0 mov.w #__ram_start, a1 mov.w #__data_size, r3 smovf.b /* Zero out .bss. */ mov.b #0x00, R0L mov.w #__bss_size, r3 mov.w #__bss_start, a1 sstr.b /* Enter main(). */ jsr.a _main /* In case we return, should realy generate a reset :/ */ jmp.b 0 m32c_jsri16: add.w #-1, sp /* Read the address (16 bits) and return address (24 bits) off the stack. */ mov.w 4[sp], r0 mov.w 1[sp], r3 mov.b 3[sp], a0 /* This zero-extends, so the high byte has zero in it. */ /* Write the return address, then new address, to the stack. */ mov.w a0, 1[sp] /* Just to get the zero in 2[sp]. */ mov.w r0, 0[sp] mov.w r3, 3[sp] mov.b a0, 5[sp] /* This "returns" to the target address, leaving the pending return address on the stack. */ rts /* We should probably not get here. */ __vector_default: jmp.a __vector_default /* Fixed hardware vector table. */ .section .vectors_fixed, "a",@progbits .size _vectors_fixed, 36 .type _vectors_fixed, @object _vectors_fixed: .long 0 /* Undefined Instruction. */ .long 0 /* Overflow INTO Instruction. */ .long 0 /* BRK Instruction.*/ .long 0 /* Address Match Interupt. */ .long 0 /* Single Step Interrupt. */ .long 0 /* Watchdog, Oscillation, Voltage Interrupt. */ .long 0 /* DBC. */ .long 0 /* NMI. */ .long _start /* Reset. */ /* Variable vector table. */ .section .vectors_variable .size _vectors_variable, 256 .type _vectors_variable, @object _vectors_variable: .long __vector_0 .long __vector_1 .long __vector_2 .long __vector_3 .long __vector_4 .long __vector_5 .long __vector_6 .long __vector_7 .long __vector_8 .long __vector_9 .long __vector_10 .long __vector_11 .long __vector_12 .long __vector_13 .long __vector_14 .long __vector_15 .long __vector_16 .long __vector_17 .long __vector_18 .long __vector_19 .long __vector_20 .long __vector_21 .long __vector_22 .long __vector_23 .long __vector_24 .long __vector_25 .long __vector_26 .long __vector_27 .long __vector_28 .long __vector_29 .long __vector_30 .long __vector_31 .long __vector_32 .long __vector_33 .long __vector_34 .long __vector_35 .long __vector_36 .long __vector_37 .long __vector_38 .long __vector_39 .long __vector_40 .long __vector_41 .long __vector_42 .long __vector_43 .long __vector_44 .long __vector_45 .long __vector_46 .long __vector_47 .long __vector_48 .long __vector_49 .long __vector_50 .long __vector_51 .long __vector_52 .long __vector_53 .long __vector_54 .long __vector_55 .long __vector_56 .long __vector_57 .long __vector_58 .long __vector_59 .long __vector_60 .long __vector_61 .long __vector_62 .long __vector_63 tinyos-2.1.2+dfsg/support/make/m16c60/crt_65.S000066400000000000000000000145131207233610700205600ustar00rootroot00000000000000/*--------------------------------------------------------------------------------*/ /* * Copyright (c) 2010 Eistec AB. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * *--------------------------------------------------------------------------------*/ .section .init0,"ax",@progbits .global __vector_72 .global __init_watchdog __init_watchdog: ldc #__istack, isp /* Load stack pointer address. */ fset u ldc #__ustack, sp /* Load stack pointer address. */ ldc #%hi16(__rvectors), intbh /* Load relocatable vector table address. */ ldc #%lo16(__rvectors), intbl mov.b #%hi8 (__data_rom_start), r1h /* Copy initialized data from ROM to RAM */ mov.w #%lo16(__data_rom_start), a0 mov.w #__data_start, a1 mov.w #__data_count, r3 smovf.b mov.b #0x00,r0l /* Fill uninitialized data in RAM with 0s */ mov.w #__bss_start, a1 mov.w #__bss_count, r3 sstr.b jsr.a _watchdog __vector_72: ldc #__istack, isp /* Load stack pointer address. */ fset u ldc #__ustack, sp /* Load stack pointer address. */ ldc #%hi16(__rvectors), intbh /* Load relocatable vector table address. */ ldc #%lo16(__rvectors), intbl mov.b #0x01, 0x000A /* Setup main clock and sub clock */ mov.b #0x00, 0x0006 mov.b #0x00, 0x0007 mov.b #0x00, 0x000C mov.b #0x00, 0x000A mov.b #%hi8 (__data_rom_start), r1h /* Copy initialized data from ROM to RAM */ mov.w #%lo16(__data_rom_start), a0 mov.w #__data_start, a1 mov.w #__data_count, r3 smovf.b mov.b #0x00,r0l /* Fill uninitialized data in RAM with 0s */ mov.w #__bss_start, a1 mov.w #__bss_count, r3 sstr.b jsr.a _main /* Jump to main function. */ jsr.a __vector_72 /* Restart if main function returns. */ /*--------------------------------------------------------------------------------*/ /* */ .text .global m32c_jsri16 m32c_jsri16: add.w #-1, sp /* Read the address (16 bits) and return address (24 bits) off the stack. */ mov.w 4[sp], r0 mov.w 1[sp], r3 mov.b 3[sp], a0 /* This zero-extends, so the high byte has zero in it. */ /* Write the return address, then new address, to the stack. */ mov.w a0, 1[sp] /* Just to get the zero in 2[sp]. */ mov.w r0, 0[sp] mov.w r3, 3[sp] mov.b a0, 5[sp] /* This "returns" to the target address, leaving the pending return address on the stack. */ rts /*--------------------------------------------------------------------------------*/ /* Relocatable vector table */ .section .rvectors, "a", @progbits .long __vector_0 .long __vector_1 .long __vector_2 .long __vector_3 .long __vector_4 .long __vector_5 .long __vector_6 .long __vector_7 .long __vector_8 .long __vector_9 .long __vector_10 .long __vector_11 .long __vector_12 .long __vector_13 .long __vector_14 .long __vector_15 .long __vector_16 .long __vector_17 .long __vector_18 .long __vector_19 .long __vector_20 .long __vector_21 .long __vector_22 .long __vector_23 .long __vector_24 .long __vector_25 .long __vector_26 .long __vector_27 .long __vector_28 .long __vector_29 .long __vector_30 .long __vector_31 .long __vector_32 .long __vector_33 .long __vector_34 .long __vector_35 .long __vector_36 .long __vector_37 .long __vector_38 .long __vector_39 .long __vector_40 .long __vector_41 .long __vector_42 .long __vector_43 .long __vector_44 .long __vector_45 .long __vector_46 .long __vector_47 .long __vector_48 .long __vector_49 .long __vector_50 .long __vector_51 .long __vector_52 .long __vector_53 .long __vector_54 .long __vector_55 .long __vector_56 .long __vector_57 .long __vector_58 .long __vector_59 .long __vector_60 .long __vector_61 .long __vector_62 .long __vector_63 /*--------------------------------------------------------------------------------*/ /* Fixed vector table */ .section .fvectors, "a", @progbits .long __vector_64 + 0x00000000 /* Set all ID bytes to 0x00. */ .long __vector_65 + 0x00000000 .long __vector_66 + 0x00000000 .long __vector_67 + 0x00000000 .long __vector_68 + 0x00000000 .long __vector_69 + 0x00000000 .long __vector_70 + 0x00000000 .long __vector_71 + 0x00000000 .long __vector_72 + 0x9F000000 /* Enable power-on reset in OFS register. */ tinyos-2.1.2+dfsg/support/make/m16c60/debug.extra000077500000000000000000000001051207233610700214600ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make OPTFLAGS = -O1 -g -fnesc-no-inline tinyos-2.1.2+dfsg/support/make/m16c60/debugopt.extra000077500000000000000000000000611207233610700222040ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make OPTFLAGS += -g tinyos-2.1.2+dfsg/support/make/m16c60/install.extra000077500000000000000000000003421207233610700220430ustar00rootroot00000000000000#-#-Makefile-#- vim:syntax=make NODEID = $(INSTALL) BUILD_DEPS = srec tosimage bytes $(POST_BUILD_EXTRA_DEPS) setid program delsetid ifdef BOOTLOADER ifeq ($(BOOTLOADER),tosboot) BUILD_DEPS += program_bl endif endif tinyos-2.1.2+dfsg/support/make/m16c60/linker_62p.x000077500000000000000000000131151207233610700214760ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Henrik Makitaavola * @author Per Lindgren * @author Johan Eriksson * @author Johan Nordlander * @author Simon Aittamaa */ ENTRY(_start) MEMORY { ram (rw) : o = 0x0000400, l = 31k flash (rx) : o = 0x00a0000, l = 384k } /* Provide any vector symbols not defined. */ PROVIDE(__vector_0 = __vector_default); PROVIDE(__vector_1 = __vector_default); PROVIDE(__vector_2 = __vector_default); PROVIDE(__vector_3 = __vector_default); PROVIDE(__vector_4 = __vector_default); PROVIDE(__vector_5 = __vector_default); PROVIDE(__vector_6 = __vector_default); PROVIDE(__vector_7 = __vector_default); PROVIDE(__vector_8 = __vector_default); PROVIDE(__vector_9 = __vector_default); PROVIDE(__vector_10 = __vector_default); PROVIDE(__vector_11 = __vector_default); PROVIDE(__vector_12 = __vector_default); PROVIDE(__vector_13 = __vector_default); PROVIDE(__vector_14 = __vector_default); PROVIDE(__vector_15 = __vector_default); PROVIDE(__vector_16 = __vector_default); PROVIDE(__vector_17 = __vector_default); PROVIDE(__vector_18 = __vector_default); PROVIDE(__vector_19 = __vector_default); PROVIDE(__vector_20 = __vector_default); PROVIDE(__vector_21 = __vector_default); PROVIDE(__vector_22 = __vector_default); PROVIDE(__vector_23 = __vector_default); PROVIDE(__vector_24 = __vector_default); PROVIDE(__vector_25 = __vector_default); PROVIDE(__vector_26 = __vector_default); PROVIDE(__vector_27 = __vector_default); PROVIDE(__vector_28 = __vector_default); PROVIDE(__vector_29 = __vector_default); PROVIDE(__vector_30 = __vector_default); PROVIDE(__vector_31 = __vector_default); PROVIDE(__vector_32 = __vector_default); PROVIDE(__vector_33 = __vector_default); PROVIDE(__vector_34 = __vector_default); PROVIDE(__vector_35 = __vector_default); PROVIDE(__vector_36 = __vector_default); PROVIDE(__vector_37 = __vector_default); PROVIDE(__vector_38 = __vector_default); PROVIDE(__vector_39 = __vector_default); PROVIDE(__vector_40 = __vector_default); PROVIDE(__vector_41 = __vector_default); PROVIDE(__vector_42 = __vector_default); PROVIDE(__vector_43 = __vector_default); PROVIDE(__vector_44 = __vector_default); PROVIDE(__vector_45 = __vector_default); PROVIDE(__vector_46 = __vector_default); PROVIDE(__vector_47 = __vector_default); PROVIDE(__vector_48 = __vector_default); PROVIDE(__vector_49 = __vector_default); PROVIDE(__vector_50 = __vector_default); PROVIDE(__vector_51 = __vector_default); PROVIDE(__vector_52 = __vector_default); PROVIDE(__vector_53 = __vector_default); PROVIDE(__vector_54 = __vector_default); PROVIDE(__vector_55 = __vector_default); PROVIDE(__vector_56 = __vector_default); PROVIDE(__vector_57 = __vector_default); PROVIDE(__vector_58 = __vector_default); PROVIDE(__vector_59 = __vector_default); PROVIDE(__vector_60 = __vector_default); PROVIDE(__vector_61 = __vector_default); PROVIDE(__vector_62 = __vector_default); PROVIDE(__vector_63 = __vector_default); SECTIONS { /* * Ram starts at 0x400 but for some reason it does not allow med to * start placing data at 0x400 since it's not into the ram... Life * is great. */ __ram_start = 0x500; __ram_end = 0x400 + 31k - 1; .start : { *(.init0); } > flash .data __ram_start : { *(.data); *(.rodata); /* Do NOT place in '.text'. */ *(.rodata.*); /* Do NOT place in '.text'. */ *(.plt); /* Do NOT place in '.text'. */ } > ram AT > flash __data_start = LOADADDR(.data); __data_size = SIZEOF(.data); .bss : { *(.bss); *(COMMON); } > ram __bss_start = ADDR(.bss); __bss_size = SIZEOF(.bss); .text /*0xc0000*/: { *(.text); *(.vectors_variable); } > flash PROVIDE(_end = __bss_start + __bss_size); /* User Stack Pointer */ .ustack 0x00007000 : { _ustack = .; } > ram /* Interrupt Stack Pointer */ .istack 0x00008000 : { _istack = .; } > ram /* Vector offset is fixed. */ .vectors 0x000FFFDC : { *(.vectors_fixed); } > flash } tinyos-2.1.2+dfsg/support/make/m16c60/linker_65.x000066400000000000000000000131351207233610700213200ustar00rootroot00000000000000/*--------------------------------------------------------------------------------*/ /* * Copyright (c) 2010 Eistec AB. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * *--------------------------------------------------------------------------------*/ MEMORY { RAM (wx) : ORIGIN = 0x00400, LENGTH = 47K DBG (rx) : ORIGIN = 0x13000, LENGTH = 4K ROM (rx) : ORIGIN = 0x80000, LENGTH = 512K } __ram = 0x00400; __ram_size = 47K; __ram_end = __ram + __ram_size; __rom = 0x80000; __rom_size = 512K; __rom_end = __rom + __rom_size; __ustack = __ram_end - 0x00200; /* Size of interrupt stack. */ __istack = __ram_end; PROVIDE(__vector_0 = __vector_72); PROVIDE(__vector_1 = __vector_72); PROVIDE(__vector_2 = __vector_72); PROVIDE(__vector_3 = __vector_72); PROVIDE(__vector_4 = __vector_72); PROVIDE(__vector_5 = __vector_72); PROVIDE(__vector_6 = __vector_72); PROVIDE(__vector_7 = __vector_72); PROVIDE(__vector_8 = __vector_72); PROVIDE(__vector_9 = __vector_72); PROVIDE(__vector_10 = __vector_72); PROVIDE(__vector_11 = __vector_72); PROVIDE(__vector_12 = __vector_72); PROVIDE(__vector_13 = __vector_72); PROVIDE(__vector_14 = __vector_72); PROVIDE(__vector_15 = __vector_72); PROVIDE(__vector_16 = __vector_72); PROVIDE(__vector_17 = __vector_72); PROVIDE(__vector_18 = __vector_72); PROVIDE(__vector_19 = __vector_72); PROVIDE(__vector_20 = __vector_72); PROVIDE(__vector_21 = __vector_72); PROVIDE(__vector_22 = __vector_72); PROVIDE(__vector_23 = __vector_72); PROVIDE(__vector_24 = __vector_72); PROVIDE(__vector_25 = __vector_72); PROVIDE(__vector_26 = __vector_72); PROVIDE(__vector_27 = __vector_72); PROVIDE(__vector_28 = __vector_72); PROVIDE(__vector_29 = __vector_72); PROVIDE(__vector_30 = __vector_72); PROVIDE(__vector_31 = __vector_72); PROVIDE(__vector_32 = __vector_72); PROVIDE(__vector_33 = __vector_72); PROVIDE(__vector_34 = __vector_72); PROVIDE(__vector_35 = __vector_72); PROVIDE(__vector_36 = __vector_72); PROVIDE(__vector_37 = __vector_72); PROVIDE(__vector_38 = __vector_72); PROVIDE(__vector_39 = __vector_72); PROVIDE(__vector_40 = __vector_72); PROVIDE(__vector_41 = __vector_72); PROVIDE(__vector_42 = __vector_72); PROVIDE(__vector_43 = __vector_72); PROVIDE(__vector_44 = __vector_72); PROVIDE(__vector_45 = __vector_72); PROVIDE(__vector_46 = __vector_72); PROVIDE(__vector_47 = __vector_72); PROVIDE(__vector_48 = __vector_72); PROVIDE(__vector_49 = __vector_72); PROVIDE(__vector_50 = __vector_72); PROVIDE(__vector_51 = __vector_72); PROVIDE(__vector_52 = __vector_72); PROVIDE(__vector_53 = __vector_72); PROVIDE(__vector_54 = __vector_72); PROVIDE(__vector_55 = __vector_72); PROVIDE(__vector_56 = __vector_72); PROVIDE(__vector_57 = __vector_72); PROVIDE(__vector_58 = __vector_72); PROVIDE(__vector_59 = __vector_72); PROVIDE(__vector_60 = __vector_72); PROVIDE(__vector_61 = __vector_72); PROVIDE(__vector_62 = __vector_72); PROVIDE(__vector_63 = __vector_72); PROVIDE(__vector_64 = __vector_72); PROVIDE(__vector_65 = __vector_72); PROVIDE(__vector_66 = __vector_72); PROVIDE(__vector_67 = __vector_72); PROVIDE(__vector_68 = __vector_72); PROVIDE(__vector_69 = __vector_72); PROVIDE(__vector_70 = __vector_72); PROVIDE(__vector_71 = __vector_72); PROVIDE(_watchdog = __vector_72); SECTIONS { .start : { *(.init0); } > ROM AT > ROM .data : { *(.data) *(.data.*) *(.rodata) *(.rodata.*) *(.plt) *(.eh_frame_hdr) *(.eh_frame) } > RAM AT > ROM __data_rom_start = LOADADDR(.data); __data_start = ADDR(.data); __data_count = SIZEOF(.data); .bss : { *(.bss) *(COMMON) } > RAM AT > RAM __bss_start = ADDR(.bss); __bss_count = SIZEOF(.bss); PROVIDE(_end = .); /* Provide heap pointer for sbrk(). */ .text : { *(.init) *(.fini) *(.text) *(.text.*) __rvectors = .; /* ensure faster interrupt execution. */ *(.rvectors) } > ROM AT > ROM .debugger 0x13000 : AT(0x13000) /* On-chip debugger monitor area. */ { __debugger = .; *(.debugger) } .fvectors 0xFFFDC : AT(0xFFFDC) /* Fixed vector table. */ { /* Must be placed on address 0xFFFDC. */ __fvectors = .; *(.fvectors) } } tinyos-2.1.2+dfsg/support/make/m16c60/m16c60.rules000077500000000000000000000116161207233610700213260ustar00rootroot00000000000000#-#-Makefile-#- vim:syntax=make ifeq ($(M16C60_MCU),62p) define M16C60_HELP Programmer options: sm16cf : use SM16CF programmer on port '/dev/ttyUSB0'. sm16cf, : use SM16CF programmer on port . endef DEFAULT_PROGRAM ?= sm16cf endif ifeq ($(M16C60_MCU),65) define M16C60_HELP Programmer options: sflash : use SFLASH programmer on port '/dev/ttyUSB0'. sflash, : use SFLASH programmer on port . endef DEFAULT_PROGRAM ?= sflash endif HELP += $(M16C60_HELP) THIS_FOLDER = m16c60 #ifdef MAKE_DEPUTY_FLAG # NCC_SAFE_TINYOS_FLAGS = -DSAFE_TINYOS -fnesc-deputy -fnesc-deputy-args='-I$(TOSDIR)/lib/safe/include --FLIDs=build/$(PLATFORM)/flids.txt --envmachine -DSAFE_TINYOS --nolib ' $(TOSDIR)/lib/safe/avr/fail.c #else # NCC_SAFE_TINYOS_FLAGS = #endif OBJCOPY = m32c-elf-objcopy OBJDUMP = m32c-elf-objdump SET_ID = tos-set-symbols --objcopy $(OBJCOPY) --objdump $(OBJDUMP) NCC = ncc LIBS = #-lm -lc -lgcc AMADDR = _ActiveMessageAddressC\$$addr # Uncomment the next two lines if you have a toolchain without the dollar sign # patch. This needs nesc 1.2.8 or newer (1.2.9 is recommended). #PFLAGS += -fnesc-separator=__ #AMADDR = ActiveMessageAddressC__addr BUILDDIR ?= build/$(PLATFORM) MAIN_EXE = $(BUILDDIR)/main.exe MAIN_SREC = $(BUILDDIR)/main.srec MAIN_IHEX = $(BUILDDIR)/main.ihex INSTALL_SREC = $(MAIN_SREC).out$(if $(NODEID),-$(NODEID),) PFLAGS += -Wshadow $(NESC_FLAGS) PFLAGS += -target=$(PLATFORM) -fnesc-cfile=$(BUILDDIR)/app.c -board=$(SENSORBOARD) ifdef MSG_SIZE PFLAGS += -DTOSH_DATA_LENGTH=$(MSG_SIZE) endif ifdef DEFAULT_LOCAL_GROUP PFLAGS += -DDEFINED_TOS_AM_GROUP=$(DEFAULT_LOCAL_GROUP) endif # We need a different start address for the flash in the linker script when building TOSBoot. ifeq ($(M16C60_MCU),62p) ifeq ($(COMPONENT),TosBootC) $(shell sed -e "s/0x00a0000/0x00f8000/ig" $(TINYOS_MAKE_PATH)/$(THIS_FOLDER)/linker_62p.x > $(TINYOS_MAKE_PATH)/$(THIS_FOLDER)/linker_62p_bootloader.x) LDFLAGS += -nostartfiles -T$(TINYOS_MAKE_PATH)/$(THIS_FOLDER)/linker_62p_bootloader.x $(TINYOS_MAKE_PATH)/$(THIS_FOLDER)/crt_62p.S else LDFLAGS += -nostartfiles -T$(TINYOS_MAKE_PATH)/$(THIS_FOLDER)/linker_62p.x $(TINYOS_MAKE_PATH)/$(THIS_FOLDER)/crt_62p.S endif endif ifeq ($(M16C60_MCU),65) ifeq ($(COMPONENT),TosBootC) $(shell sed -e "s/0x80000/0xC0000/ig" $(TINYOS_MAKE_PATH)/$(THIS_FOLDER)/linker_65.x > $(TINYOS_MAKE_PATH)/$(THIS_FOLDER)/linker_65_bootloader.x) LDFLAGS += -nostartfiles -T$(TINYOS_MAKE_PATH)/$(THIS_FOLDER)/linker_65_bootloader.x $(TINYOS_MAKE_PATH)/$(THIS_FOLDER)/crt_65.S else LDFLAGS += -nostartfiles -T$(TINYOS_MAKE_PATH)/$(THIS_FOLDER)/linker_65.x $(TINYOS_MAKE_PATH)/$(THIS_FOLDER)/crt_65.S endif endif # This is needed so that we know that the BusyWaitMicroC.BusyWait.wait() # function always gets aligned. CFLAGS += -falign-functions=2 # Use the 'if' function instead of the 'ifdef' construct because ifdef freaks # out with call in there. I don't know why. $(if $(PROGRAM),,$(call TOSMake_include,$(THIS_FOLDER)/$(DEFAULT_PROGRAM).extra)) # Build storage file if volumes.xml present ifneq ($(wildcard $(VOLUMEFILE)), ) build_storage: $(BUILDDIR)/StorageVolumes.h exe0: build_storage VOLUME_ALLOCATOR_FLAGS ?= $(BUILDDIR)/StorageVolumes.h: $(VOLUMEFILE) $(VOLUME_ALLOCATOR) $(VOLUME_ALLOCATOR_FLAGS) $(PLATFORMDIR) <$(VOLUMEFILE) >$@ || rm -f $@ PFLAGS += -I$(BUILDDIR) else build_storage: endif ifndef BUILD_DEPS ifeq ($(filter $(BUILDLESS_DEPS),$(GOALS)),) BUILD_DEPS = srec bytes tosimage $(POST_BUILD_EXTRA_DEPS) endif endif setid: FORCE @cmd () { echo "$$@"; $$@; }; if [ x = x$(NODEID) ]; then cmd cp $(MAIN_SREC) $(INSTALL_SREC); else cmd $(SET_ID) $(MAIN_SREC) $(INSTALL_SREC) _TOS_NODE_ID=$(NODEID) $(AMADDR)=$(NODEID) ; fi delsetid: FORCE rm -f $(subst .srec.,.exe.,$(INSTALL_SREC)) $(INSTALL_SREC) srec: exe FORCE $(OBJCOPY) --output-target=srec $(MAIN_EXE) $(MAIN_SREC) tos_buildinfo: ihex build_buildinfo FORCE @: # TODO(henrik) Remove interrupt vector table from the image. tosimage: ihex build_tosimage FORCE @: ihex: exe FORCE $(OBJCOPY) --output-target=ihex $(MAIN_EXE) $(MAIN_IHEX) exe: exe0 FORCE bytes @: exe0: builddir check_mcu $(BUILD_EXTRA_DEPS) $(COMPONENT).nc FORCE @echo " compiling $(COMPONENT) to a $(PLATFORM) binary" $(NCC) -o $(MAIN_EXE) $(NCC_SAFE_TINYOS_FLAGS) $(OPTFLAGS) $(PFLAGS) $(CFLAGS) $(WIRING_CHECK_FLAGS) $(COMPONENT).nc $(LIBS) $(LDFLAGS) ifdef WIRING_CHECK_FILE @nescc-wiring $(WIRING_CHECK_FILE) endif @echo " compiled $(COMPONENT) to $(MAIN_EXE)" builddir: FORCE mkdir -p $(BUILDDIR) # bug fix 2009-3-11 by ZHF, here display the ROM and RAM consumption information. bytes: FORCE @$(OBJDUMP) -h $(MAIN_EXE) | perl -ne '$$b{$$1}=hex $$2 if /^\s*\d+\s*\.(text|data|bss)\s+(\S+)/; END { printf("%16d bytes in ROM\n%16d bytes in RAM\n",$$b{text}+$$b{data},$$b{data}+$$b{bss}); }' check_mcu: FORCE ifndef M16C60_MCU @echo "---Error, MCU not defined.---" @exit 1 endif tinyos-2.1.2+dfsg/support/make/m16c60/reinstall.extra000066400000000000000000000001241207233610700223650ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make NODEID = $(REINSTALL) BUILD_DEPS = setid program tinyos-2.1.2+dfsg/support/make/m16c60/sflash.extra000077500000000000000000000012641207233610700216610ustar00rootroot00000000000000### # @author Henrik Makitaavola ## ifeq ($(SFLASH), ) SFLASH = /dev/ttyUSB0 endif PROGRAM = sflash PROGRAMMER = sflash ifdef BOOTLOADER program: FORCE @echo " installing $(PLATFORM) with bootloader using sflash" srec_cat $(BOOTLOADER_IMG) $(INSTALL_SREC) -exclude 0x000FFFDC 0x00100000 -o $(BUILDDIR)/main_boot.srec -CRLF sed '/S5/d' $(BUILDDIR)/main_boot.srec > $(BUILDDIR)/main_boot2.srec $(PROGRAMMER) -p $(SFLASH) $(BUILDDIR)/main_boot2.srec rm $(BUILDDIR)/main_boot.srec rm $(BUILDDIR)/main_boot2.srec else program: FORCE @echo " installing $(PLATFORM) using slash" $(PROGRAMMER) -p $(SFLASH) $(INSTALL_SREC) endif program_bl: FORCE tinyos-2.1.2+dfsg/support/make/m16c60/sm16cf.extra000077500000000000000000000014371207233610700215020ustar00rootroot00000000000000### # @author Henrik Makitaavola ## ifeq ($(SM16CF), ) SM16CF = /dev/ttyUSB0 endif PROGRAM = sm16cf PROGRAMMER = sm16cf ifdef BOOTLOADER program: FORCE @echo " installing $(PLATFORM) with bootloader using sm16cf" srec_cat $(BOOTLOADER_IMG) $(INSTALL_SREC) -exclude 0x000FFFDC 0x00100000 -o $(BUILDDIR)/main_boot.srec -CRLF sed '/S5/d' $(BUILDDIR)/main_boot.srec > $(BUILDDIR)/main_boot2.srec $(PROGRAMMER) --baud-rate=57600 --device=$(SM16CF) --input-file=$(BUILDDIR)/main_boot2.srec --flash-program rm $(BUILDDIR)/main_boot.srec rm $(BUILDDIR)/main_boot2.srec else program: FORCE @echo " installing $(PLATFORM) using sm16cf" $(PROGRAMMER) --baud-rate=57600 --device=$(SM16CF) --input-file=$(INSTALL_SREC) --flash-program endif program_bl: FORCE tinyos-2.1.2+dfsg/support/make/mica2.target000066400000000000000000000006231207233610700206160ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: mica2.target,v 1.5 2007-11-06 19:32:56 sallai Exp $ PLATFORM = mica2 SENSORBOARD ?= micasb PROGRAMMER ?= uisp ifeq ($(PROGRAMMER),avrdude) PROGRAMMER_PART ?= -pm128 -U efuse:w:0xff:m endif ifeq ($(PROGRAMMER),uisp) PROGRAMMER_PART ?= -dpart=ATmega128 --wr_fuse_e=ff endif AVR_FUSE_H ?= 0xd9 $(call TOSMake_include_platform,avr) mica2: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/mica2dot.target000066400000000000000000000006071207233610700213270ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: mica2dot.target,v 1.5 2007-11-06 19:32:56 sallai Exp $ PLATFORM = mica2dot PROGRAMMER ?= uisp ifeq ($(PROGRAMMER),avrdude) PROGRAMMER_PART ?= -pm128 -U efuse:w:0xff:m endif ifeq ($(PROGRAMMER),uisp) PROGRAMMER_PART ?= -dpart=ATmega128 --wr_fuse_e=ff endif AVR_FUSE_H ?= 0xd9 $(call TOSMake_include_platform,avr) mica2dot: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/micaz.target000066400000000000000000000007401207233610700207260ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: micaz.target,v 1.6 2008-07-09 15:36:50 sallai Exp $ PLATFORM = micaz SENSORBOARD ?= micasb PROGRAMMER ?= uisp ifeq ($(PROGRAMMER),avrdude) PROGRAMMER_PART ?= -pm128 -U efuse:w:0xff:m endif ifeq ($(PROGRAMMER),uisp) PROGRAMMER_PART ?= -dpart=ATmega128 --wr_fuse_e=ff endif AVR_FUSE_H ?= 0xd9 ifdef CC2420_CHANNEL PFLAGS += -DCC2420_DEF_CHANNEL=$(CC2420_CHANNEL) endif $(call TOSMake_include_platform,avr) micaz: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/msp/000077500000000000000000000000001207233610700172115ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/make/msp/bsl.extra000066400000000000000000000041521207233610700210400ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: bsl.extra,v 1.7 2008-06-18 20:22:51 razvanm Exp $ # BSL arguments: # # bsl, # install onto the given port name # # bsl,auto # uses motelist to install onto the first listed mote # # bsl,ref, # uses motelist to install onto the mote with the given reference number PROGRAM = bsl MSP_BSL ?= msp430-bsl # BSL is the comm port, can be specified as "bsl,2" when making BSL ?= auto MSP_BSL_FLAGS ?= --telos MOTELIST ?= motelist ifeq ($(BSL),auto) BSLTEST = $(shell $(MOTELIST) -c | perl -e '<> =~ /^[^,]+,(\S+?(\d+)[^,]*)/; print $$1;' ) BSLTEST_COMMENT = "using bsl,auto" BSL = $(shell $(MOTELIST) -c | perl -e '<> =~ /^[^,]+,(\S+?(\d+)[^,]*)/; ($$s,$$n)=($$1,$$2); if($$s=~/^com/i) { print $$n-1 } else { print $$s; };' ) BSL_TARGETS += bsltest else ifeq ($(BSL:ref,%=ref),ref) BSLREF := $(BSL:ref,%=%) BSLTEST_COMMENT = "using bsl,ref,$(BSLREF)" BSLTEST := $(shell $(MOTELIST) -c | perl -e '$$r=shift; while(<>) { if(/^$$r,([^,]+)/) { print $$1; exit; } }' $(BSLREF)) BSL = $(BSLTEST) BSL_TARGETS += bsltest endif endif # bsltest is a separate rule so that make doesn't resolve BSL along with # BSLTEST, which saves an invocation of motelist. It also avoids the test # all together if bsl,auto was not specified (whew). bsltest: FORCE @N=$(BSLTEST); [ x$$N = x ] && echo " found no motes ($(BSLTEST_COMMENT))" && exit 1 || echo " found mote on $$N ($(BSLTEST_COMMENT))" program: $(BSL_TARGETS) $(TELOS_PROGRAM_DEPS) FORCE @echo " installing $(PLATFORM) binary using bsl" $(MSP_BSL) $(MSP_BSL_FLAGS) -c $(BSL) -r -e -I -p $(INSTALL_IHEX) rm -f $(subst .ihex.,.exe.,$(INSTALL_IHEX)) $(INSTALL_IHEX) program_no_e: $(BSL_TARGETS) $(TELOS_PROGRAM_DEPS) FORCE @echo " installing $(PLATFORM) binary using bsl (without mass erase)" $(MSP_BSL) $(MSP_BSL_FLAGS) -c $(BSL) -r -I -p $(INSTALL_IHEX) rm -f $(subst .ihex.,.exe.,$(INSTALL_IHEX)) $(INSTALL_IHEX) program_bl: $(BSL_TARGETS) $(TELOS_PROGRAM_DEPS) FORCE @echo " installing $(PLATFORM) bootloader using bsl" $(MSP_BSL) $(MSP_BSL_FLAGS) -c $(BSL) -r -e -I -p $(BOOTLOADER_IMG) program_input: ihex @: tinyos-2.1.2+dfsg/support/make/msp/debug.extra000066400000000000000000000001761207233610700213500ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: debug.extra,v 1.4 2006-12-12 18:22:59 vlahan Exp $ OPTFLAGS = -O1 -g -fnesc-no-inline tinyos-2.1.2+dfsg/support/make/msp/debugopt.extra000066400000000000000000000001551207233610700220700ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: debugopt.extra,v 1.4 2006-12-12 18:22:59 vlahan Exp $ OPTFLAGS += -g tinyos-2.1.2+dfsg/support/make/msp/id.extra000066400000000000000000000004061207233610700206520ustar00rootroot00000000000000# The id.extra will simply output the binary with altered node id's and # will not install the application to the node. You can install it manually. # Usage: make telosb id.3 # ==> Outputs main.ihex.out-3 NODEID = $(ID) BUILD_DEPS = setid tinyos-2.1.2+dfsg/support/make/msp/install.extra000066400000000000000000000005061207233610700217250ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: install.extra,v 1.5 2008-06-18 20:22:51 razvanm Exp $ NODEID = $(INSTALL) BUILD_DEPS = tosimage $(POST_BUILD_EXTRA_DEPS) bytes setid program ifdef BOOTLOADER ifeq ($(BOOTLOADER),tosboot) BUILD_DEPS = tosimage $(POST_BUILD_EXTRA_DEPS) setid program_bl program_no_e endif endif tinyos-2.1.2+dfsg/support/make/msp/jtag.extra000066400000000000000000000011501207233610700212000ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: jtag.extra,v 1.5 2008-06-18 20:22:51 razvanm Exp $ PROGRAM = jtag ifndef MSP_JTAG MSP_JTAG = msp430-jtag endif program: FORCE @echo " installing $(PLATFORM) binary using the parallel port jtag adapter" $(MSP_JTAG) $(MSP_JTAG_FLAGS) -Iepr $(INSTALL_IHEX) program_no_e: FORCE @echo " installing $(PLATFORM) binary using jtag (without mass erase)" $(MSP_JTAG) $(MSP_JTAG_FLAGS) -r -I -p $(INSTALL_IHEX) program_bl: FORCE @echo " installing $(PLATFORM) bootloader using jtag" $(MSP_JTAG) $(MSP_JTAG_FLAGS) -r -e -I -p $(BOOTLOADER_IMG) program_input: ihex @: tinyos-2.1.2+dfsg/support/make/msp/msp.rules000066400000000000000000000072301207233610700210660ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: msp.rules,v 1.20 2010-03-17 00:38:05 klueska Exp $ define MSP_HELP MSP extras: debug : compile with minimal optimization and debug symbols debugopt : compile with debug symbols Programmer options: bsl,auto : (default) use BSL programmer on the first mote found bsl, : use BSL programmer on serial port bsl,ref, : use BSL programmer on the mote with reference The dev or host parameter for the programmer option need not be specified, in which case it is expected to be defined as in an environment variable of the same name in all caps (such as BSL). endef HELP += $(MSP_HELP) ifdef MAKE_DEPUTY_FLAG NCC_SAFE_TINYOS_FLAGS = -DSAFE_TINYOS -I$(TOSDIR)/lib/safe -fnesc-deputy -fnesc-deputy-args='-I$(TOSDIR)/lib/safe/include --FLIDs=build/$(PLATFORM)/flids.txt --envmachine -DSAFE_TINYOS --nolib ' else NCC_SAFE_TINYOS_FLAGS = endif MSPGCC_MIN_VER := 4.6.3 MSPGCC_VER_OK := $(shell expr `msp430-gcc -dumpversion` \>= '$(MSPGCC_MIN_VER)') OBJCOPY = msp430-objcopy OBJDUMP = msp430-objdump SET_ID = tos-set-symbols NCC = ncc LIBS = -lm # Use __ as the separator - requires nesC 1.2.9 or later ifneq ($(filter sim,$(GOALS)),sim) PFLAGS += -fnesc-separator=__ endif AMADDR = ActiveMessageAddressC__addr BUILDDIR ?= build/$(PLATFORM) MAIN_EXE = $(BUILDDIR)/main.exe MAIN_IHEX = $(BUILDDIR)/main.ihex INSTALL_IHEX = $(MAIN_IHEX).out$(if $(NODEID),-$(NODEID),) PFLAGS += -Wall -Wshadow $(NESC_FLAGS) PFLAGS += -target=$(PLATFORM) -fnesc-cfile=$(BUILDDIR)/app.c -board=$(SENSORBOARD) ifdef MSG_SIZE PFLAGS += -DTOSH_DATA_LENGTH=$(MSG_SIZE) endif ifdef DEFAULT_LOCAL_GROUP PFLAGS += -DDEFINED_TOS_AM_GROUP=$(DEFAULT_LOCAL_GROUP) endif DEFAULT_PROGRAM ?= bsl BUILDLESS_DEPS += bytes # Use the 'if' function instead of the 'ifdef' construct because ifdef freaks # out with call in there. I don't know why. $(if $(PROGRAM),,$(call TOSMake_include,msp/$(DEFAULT_PROGRAM).extra)) # Build storage file if volumes.xml present ifneq ($(wildcard $(VOLUME_FILE)), ) build_storage: $(BUILDDIR)/StorageVolumes.h exe0: build_storage VOLUME_ALLOCATOR_FLAGS ?= $(BUILDDIR)/StorageVolumes.h: $(VOLUME_FILE) $(VOLUME_ALLOCATOR) $(VOLUME_ALLOCATOR_FLAGS) $(PLATFORMDIR) <$(VOLUME_FILE) >$@ || rm -f $@ PFLAGS += -I$(BUILDDIR) else build_storage: endif ifndef BUILD_DEPS ifeq ($(filter $(BUILDLESS_DEPS),$(GOALS)),) BUILD_DEPS = tosimage $(POST_BUILD_EXTRA_DEPS) endif endif setid: FORCE @cmd () { echo "$$@"; $$@; }; if [ x = x$(NODEID) ]; then cmd cp $(MAIN_IHEX) $(INSTALL_IHEX); else cmd $(SET_ID) --objcopy $(OBJCOPY) --objdump $(OBJDUMP) --target ihex $(MAIN_IHEX) $(INSTALL_IHEX) TOS_NODE_ID=$(NODEID) $(AMADDR)=$(NODEID); fi tos_buildinfo: ihex build_buildinfo FORCE @: tosimage: ihex build_tosimage FORCE @: ihex: exe FORCE $(OBJCOPY) --output-target=ihex $(MAIN_EXE) $(MAIN_IHEX) exe: exe0 bytes FORCE @: exe0: builddir $(BUILD_EXTRA_DEPS) $(COMPONENT).nc FORCE @echo " compiling $(COMPONENT) to a $(PLATFORM) binary" ifeq ("$(MSPGCC_VER_OK)","0") @echo @echo " WARNING: Minimum recommended msp430-gcc version for this TinyOS release is $(MSPGCC_MIN_VER)!!!" @echo endif $(NCC) -o $(MAIN_EXE) $(NCC_SAFE_TINYOS_FLAGS) $(OPTFLAGS) $(PFLAGS) $(CFLAGS) $(WIRING_CHECK_FLAGS) $(COMPONENT).nc $(LIBS) $(LDFLAGS) ifdef WIRING_CHECK_FILE @nescc-wiring $(WIRING_CHECK_FILE) endif @echo " compiled $(COMPONENT) to $(MAIN_EXE)" builddir: FORCE mkdir -p $(BUILDDIR) bytes: FORCE @$(OBJDUMP) -h $(MAIN_EXE) | perl -ne '$$b{$$1}=hex $$2 if /^\s*\d+\s*\.(text|data|bss)\s+(\S+)/; END { printf("%16d bytes in ROM\n%16d bytes in RAM\n",$$b{text}+$$b{data},$$b{data}+$$b{bss}); }' tinyos-2.1.2+dfsg/support/make/msp/reinstall.extra000066400000000000000000000007211207233610700222530ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: reinstall.extra,v 1.5 2008-06-18 20:22:51 razvanm Exp $ NODEID = $(REINSTALL) BUILD_DEPS = setid program ifdef BOOTLOADER ifeq ($(BOOTLOADER),tosboot) BUILD_DEPS = setid program_bl program_no_e endif endif check_tosboot: FORCE @perl -e 'exit 0 if (<> =~ /^\:103000/); print "\nERROR: Trying to install with tosboot support.\n main.ihex was not built properly, please recompile.\n\n"; exit 1;' $(INSTALL_IHEX) tinyos-2.1.2+dfsg/support/make/mulle.target000077500000000000000000000040441207233610700207450ustar00rootroot00000000000000#-#-Makefile-#- vim:syntax=make ## # Copyright (c) 2009 Communication Group and Eislab at # Lulea University of Technology # # Contact: Laurynas Riliskis, LTU # Mail: laurynas.riliskis@ltu.se # All rights reserved. # # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of Communication Group at Lulea University of Technology # nor the names of its contributors may be used to endorse or promote # products derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD # UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. ## # @author Henrik Makitaavola PLATFORM = mulle # Flash settings VOLUMEFILE = volumes-at45db.xml VOLUME_ALLOCATOR ?= tos-storage-at45db VOLUME_ALLOCATOR_FLAGS ?= -s 512 -f 4096 #MCU settings M16C60_MCU=62p $(call TOSMake_include_platform,m16c60) mulle: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/nowiring.extra000066400000000000000000000000541207233610700213120ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make NOWIRING=1 tinyos-2.1.2+dfsg/support/make/null.target000066400000000000000000000003131207233610700205710ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: null.target,v 1.4 2006-12-12 18:22:55 vlahan Exp $ PLATFORM = null PFLAGS += -finline-limit=100000 $(call TOSMake_include_platform,null) null: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/null/000077500000000000000000000000001207233610700173645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/make/null/debug.extra000066400000000000000000000001761207233610700215230ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: debug.extra,v 1.4 2006-12-12 18:22:59 vlahan Exp $ OPTFLAGS += -O1 -g -fnesc-no-inline tinyos-2.1.2+dfsg/support/make/null/null.rules000066400000000000000000000037251207233610700214210ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: null.rules,v 1.10 2010-03-17 00:38:05 klueska Exp $ define NULL_HELP NULL extras: debug : compile with minimal optimization and debug symbols endef HELP += $(NULL_HELP) export GCC=gcc OBJCOPY = objcopy OBJDUMP = objdump NCC = ncc LIBS = -lm BUILDDIR ?= build/$(PLATFORM) MAIN_EXE = $(BUILDDIR)/main.exe MAIN_SREC = $(BUILDDIR)/main.srec MAIN_IHEX = $(BUILDDIR)/main.ihex INSTALL_SREC = $(MAIN_SREC).out$(if $(NODEID),-$(NODEID),) VOLUMEFILE = volumes-at45db.xml VOLUME_ALLOCATOR ?= tos-storage-at45db PFLAGS += -Wall -Wshadow -fnesc-gcc=$(GCC) $(NESC_FLAGS) PFLAGS += -target=$(PLATFORM) -fnesc-cfile=$(BUILDDIR)/app.c ifdef MSG_SIZE PFLAGS += -DTOSH_DATA_LENGTH=$(MSG_SIZE) endif ifdef DEFAULT_LOCAL_GROUP PFLAGS += -DDEFINED_TOS_AM_GROUP=$(DEFAULT_LOCAL_GROUP) endif ifeq ($(findstring Darwin, $(shell uname)), Darwin) CFLAGS += -D_FORTIFY_SOURCE=0 OBJCOPY = /usr/bin/true OBJDUMP = /usr/bin/true endif BUILDLESS_DEPS += bytes # Build storage file if volumes.xml present # We "steal" the at45db storage spec ifneq ($(wildcard $(VOLUMEFILE)), ) build_storage: $(BUILDDIR)/StorageVolumes.h exe0: build_storage $(BUILDDIR)/StorageVolumes.h: $(VOLUMEFILE) $(VOLUME_ALLOCATOR) $(VOLUME_ALLOCATOR_FLAGS) <$(VOLUMEFILE) >$@ PFLAGS += -I$(BUILDDIR) else build_storage: endif ifndef BUILD_DEPS ifeq ($(filter $(BUILDLESS_DEPS),$(GOALS)),) BUILD_DEPS = exe bytes $(POST_BUILD_EXTRA_DEPS) endif endif exe: exe0 bytes FORCE @: exe0: builddir $(BUILD_EXTRA_DEPS) $(COMPONENT).nc FORCE @echo " compiling $(COMPONENT) to a $(PLATFORM) binary" $(NCC) -o $(MAIN_EXE) $(OPTFLAGS) $(PFLAGS) $(CFLAGS) $(COMPONENT).nc $(LIBS) $(LDFLAGS) @echo " compiled $(COMPONENT) to $(MAIN_EXE)" builddir: FORCE mkdir -p $(BUILDDIR) bytes: FORCE @$(OBJDUMP) -h $(MAIN_EXE) | perl -ne '$$b{$$1}=hex $$2 if /^\s*\d+\s*\.(text|data|bss)\s+(\S+)/; END { printf("%16d bytes in ROM\n%16d bytes in RAM\n",$$b{text}+$$b{data},$$b{data}+$$b{bss}); }' tinyos-2.1.2+dfsg/support/make/pxa27x/000077500000000000000000000000001207233610700175435ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/make/pxa27x/debug.extra000066400000000000000000000002361207233610700216770ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: debug.extra,v 1.4 2006-12-12 18:22:59 vlahan Exp $ #OPTFLAGS = -O1 -g -fnesc-no-inline OPTFLAGS = -g -fnesc-no-inline tinyos-2.1.2+dfsg/support/make/pxa27x/debugopt.extra000066400000000000000000000001611207233610700224170ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: debugopt.extra,v 1.4 2006-12-12 18:22:59 vlahan Exp $ OPTFLAGS += -O3 -g tinyos-2.1.2+dfsg/support/make/pxa27x/install.extra000066400000000000000000000002261207233610700222560ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: install.extra,v 1.4 2006-12-12 18:22:59 vlahan Exp $ NODEID = $(INSTALL) BUILD_DEPS = bin bytes setid program tinyos-2.1.2+dfsg/support/make/pxa27x/jflashmm.extra000066400000000000000000000007001207233610700224060ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: jflashmm.extra,v 1.5 2008-05-27 18:21:43 kusy Exp $ PROGRAM = jflashmm PROGRAMMER ?= jflashmm.exe PROGRAMMER_FLAGS = bulbcx16 POST_INSTALL_BIN_FLAGS = P 0x0 PXA27X_JTAG_DEV ?= "JTAG CPU" #PXA27X_JTAG_DEV ?= "INTEL(R) JTAG CABLE" program: FORCE @echo " installing $(PLATFORM) binary using $(PROGRAM)" $(PROGRAMMER) $(PROGRAMMER_FLAGS) $(INSTALL_BIN) $(POST_INSTALL_BIN_FLAGS) program_input: bin @: tinyos-2.1.2+dfsg/support/make/pxa27x/openocd.extra000066400000000000000000000006051207233610700222400ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make # # To install OpenOCD, see the following wiki page: # http://docs.tinyos.net/index.php/OpenOCD_for_IMote2 # PROGRAM = imote2-ocd-program.py PROGRAMMER ?= $(TOSROOT)/tools/platforms/intelmote2/openocd/imote2-ocd-program.py program: FORCE @echo " installing $(PLATFORM) binary using $(PROGRAM)" $(PROGRAMMER) $(INSTALL_BIN) program_input: bin @: tinyos-2.1.2+dfsg/support/make/pxa27x/pxa27x.rules000066400000000000000000000063251207233610700217560ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: pxa27x.rules,v 1.12 2010-03-17 00:38:05 klueska Exp $ define PXA27X_HELP PXA27x extras: debug : compile with minimal optimization and debug symbols debugopt : compile with debug symbols Programmer extras: jflashmm : (default) use the Intel JFLASHMM tool to install xflash : Use the Intel XFLASH tool to install openocd : Use openocd to install endef HELP += $(PXA27X_HELP) GAS = xscale-elf-gcc -c # This ensures .c and .s compiled object are compatible OBJCOPY = xscale-elf-objcopy OBJDUMP = xscale-elf-objdump SET_ID = tos-set-symbols XDB_SYMBOL_EXTRACT = dwarf2bd NCC = ncc LIBS = -lm AMADDR = ActiveMessageAddressC\$$addr BUILDDIR ?= build/$(PLATFORM) MAIN_EXE = $(BUILDDIR)/main.exe MAIN_BIN = $(BUILDDIR)/main.bin INSTALL_BIN = $(MAIN_BIN).out$(if $(NODEID),-$(NODEID),) #PLATFORM_DIR = $(TOSDIR)/chips/pxa27x #ASSEMBLY_FILES += $(PLATFORM_DIR)/mmu_table.s $(PLATFORM_DIR)/util.s ASSEMBLY_OBJS = $(BUILDDIR)/asms.o #LIBRARY_OBJS = $(PLATFORM_DIR)/lib/profile.o $(PLATFORM_DIR)/lib/queue.o OPTFLAGS ?= -O3 -g PFLAGS += -Wall -Wshadow $(NESC_FLAGS) PFLAGS += -target=$(PLATFORM) -fnesc-cfile=$(BUILDDIR)/app.c -board=$(SENSORBOARD) ifdef MSG_SIZE PFLAGS += -DTOSH_DATA_LENGTH=$(MSG_SIZE) endif ifdef DEFAULT_LOCAL_GROUP PFLAGS += -DDEFINED_TOS_AM_GROUP=$(DEFAULT_LOCAL_GROUP) endif DEFAULT_PROGRAM ?= jflashmm BUILDLESS_DEPS += bytes # Use the 'if' function instead of the 'ifdef' construct because ifdef freaks # out with call in there. I don't know why. $(if $(PROGRAM),,$(call TOSMake_include,pxa27x/$(DEFAULT_PROGRAM).extra)) # Build storage file if volumes.xml present ifneq ($(wildcard $(VOLUME_FILE)), ) build_storage: $(BUILDDIR)/StorageVolumes.h exe0: build_storage VOLUME_ALLOCATOR_FLAGS ?= $(BUILDDIR)/StorageVolumes.h: $(VOLUME_FILE) $(VOLUME_ALLOCATOR) $(VOLUME_ALLOCATOR_FLAGS) $(PLATFORMDIR) <$(VOLUME_FILE) >$@ || rm -f $@ PFLAGS += -I$(BUILDDIR) else build_storage: endif ifndef BUILD_DEPS ifeq ($(filter $(BUILDLESS_DEPS),$(GOALS)),) BUILD_DEPS = bin bytes $(POST_BUILD_EXTRA_DEPS) endif endif setid: FORCE @cmd () { echo "$$@"; $$@; }; if [ x = x$(NODEID) ]; then cmd $(OBJCOPY) --output-target=binary $(MAIN_EXE) $(INSTALL_BIN); else cmd $(SET_ID) --objcopy $(OBJCOPY) --objdump $(OBJDUMP) --target binary $(MAIN_EXE) $(INSTALL_BIN) TOS_NODE_ID=$(NODEID) $(AMADDR)=$(NODEID); fi bin: exe FORCE @cmd () { echo "$$@"; $$@; }; if [ "${PROGRAM}" = "xflash" ]; then $(XDB_SYMBOL_EXTRACT) $(MAIN_EXE); fi exe: exe0 bytes FORCE @: exe0: builddir asms $(BUILD_EXTRA_DEPS) $(COMPONENT).nc FORCE @echo " compiling $(COMPONENT) to a $(PLATFORM) binary" $(NCC) -o $(MAIN_EXE) $(OPTFLAGS) $(PFLAGS) $(CFLAGS) $(WIRING_CHECK_FLAGS) $(COMPONENT).nc $(LIBS) $(LDFLAGS) $(ASSEMBLY_OBJS) $(LIBRARY_OBJS) ifdef WIRING_CHECK_FILE @nescc-wiring $(WIRING_CHECK_FILE) endif @echo " compiled $(COMPONENT) to $(MAIN_EXE)" builddir: FORCE mkdir -p $(BUILDDIR) bytes: FORCE @$(OBJDUMP) -h $(MAIN_EXE) | perl -ne '$$b{$$1}=hex $$2 if /^\s*\d+\s*\.(text|data|bss)\s+(\S+)/; END { printf("%16d bytes in ROM\n%16d bytes in RAM\n",$$b{text}+$$b{data},$$b{data}+$$b{bss}); }' asms: $(GAS) $(ASSEMBLY_FILES) -o $(BUILDDIR)/asms.o library: cd $(PLATFORM_DIR)/lib; make; tinyos-2.1.2+dfsg/support/make/pxa27x/reinstall.extra000066400000000000000000000002211207233610700226000ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: reinstall.extra,v 1.4 2006-12-12 18:22:59 vlahan Exp $ NODEID = $(REINSTALL) BUILD_DEPS = setid program tinyos-2.1.2+dfsg/support/make/pxa27x/xflash.extra000066400000000000000000000005561207233610700221030ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: xflash.extra,v 1.5 2008-05-29 20:16:43 kusy Exp $ PROGRAM = xflash PROGRAMMER ?= xflash.exe PROGRAMMER_FLAGS = -p imote2 PXA27X_JTAG_DEV ?= "JTAG CPU" program: FORCE @echo " installing $(PLATFORM) binary using $(PROGRAM)" $(PROGRAMMER) $(PROGRAMMER_FLAGS) -tt $(PXA27X_JTAG_DEV) $(INSTALL_BIN) program_input: bin @: tinyos-2.1.2+dfsg/support/make/rst.extra000066400000000000000000000000621207233610700202650ustar00rootroot00000000000000BUILD_DEPS = res AVR109=$(RST) res: $(RESET_LINE)tinyos-2.1.2+dfsg/support/make/safe.extra000066400000000000000000000001011207233610700203650ustar00rootroot00000000000000#-*-Makefile-*- MAKE_DEPUTY_FLAG := 1 #export MAKE_DEPUTY_FLAG tinyos-2.1.2+dfsg/support/make/sam3/000077500000000000000000000000001207233610700172555ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/make/sam3/debug.extra000066400000000000000000000001301207233610700214020ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make OPTFLAGS = -g -fnesc-no-inline CFLAGS += -DDEBUG_CORE tinyos-2.1.2+dfsg/support/make/sam3/debugopt.extra000066400000000000000000000000611207233610700221300ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make OPTFLAGS += -g tinyos-2.1.2+dfsg/support/make/sam3/install.extra000066400000000000000000000005421207233610700217710ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: install.extra,v 1.4 2006/12/12 18:22:59 vlahan Exp $ NODEID = $(INSTALL) BUILD_DEPS = bin tosimage bytes setid ifdef BOOTLOADER ifeq ($(BOOTLOADER),tosboot) ifdef INSTALL_GOLDENIMAGE BUILD_DEPS += program_gi else BUILD_DEPS += program_ngi endif endif else BUILD_DEPS += program endif tinyos-2.1.2+dfsg/support/make/sam3/mpu.extra000066400000000000000000000002361207233610700211240ustar00rootroot00000000000000# use special linker file to provide symbols and alignment for memory protection LINKERFILE_PREFIX ?= sam3u-ek-flash LINKERFILE ?= $(LINKERFILE_PREFIX)-mp.x tinyos-2.1.2+dfsg/support/make/sam3/sam-ba-3s.extra000066400000000000000000000030761207233610700220130ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make PROGRAM = samba-program.py SAM-BA ?= /dev/ttyUSB10 START_ADDR ?= 0x400000 PROGRAMMER ?= $(PROGRAM) DELUGE_BASE_EXE=$(BUILDDIR)/deluge-base.exe DELUGE_BASE_BIN=$(BUILDDIR)/deluge-base.bin program: FORCE @echo " installing $(PLATFORM) binary using $(PROGRAM)" $(PROGRAMMER) -b $(INSTALL_BIN) -s $(START_ADDR) -t at91sam3s4-ek -p $(SAM-BA) -r -c deluge_base_bin: FORCE @echo "Compiling $(PLATFORM) deluge base station" @$(NCC) -o $(DELUGE_BASE_EXE) $(OPTFLAGS) $(PFLAGS) -DDELUGE_BASESTATION $(CFLAGS) $(WIRING_CHECK_FLAGS) $(COMPONENT).nc $(LIBS) $(LDFLAGS) @$(OBJCOPY) --output-target=binary $(DELUGE_BASE_EXE) $(DELUGE_BASE_BIN) program_gi: deluge_base_bin FORCE @echo "Installing $(PLATFORM) deluge base station using $(PROGRAM)" $(PROGRAMMER) -b $(DELUGE_BASE_BIN) -s $(TOSBOOT_REALPROG_START) -t at91sam3s4-ek -p $(SAM-BA) -c @echo "Installing $(PLATFORM) bootloader using $(PROGRAM)" $(PROGRAMMER) -b $(BOOTLOADER_IMG) -s $(TOSBOOT_START) -t at91sam3s4-ek -p $(SAM-BA) -r -c @echo "Injecting $(PLATFORM) golden image" @sleep 5 tos-deluge $(INSTALL_GOLDENIMAGE) -i 0 $(BUILDDIR)/tos_image.xml @echo "Rebooting into $(PLATFORM) golden image" @sleep 1 tos-deluge $(INSTALL_GOLDENIMAGE) -r 0 program_ngi: FORCE @echo "Installing $(PLATFORM) binary using $(PROGRAM)" $(PROGRAMMER) -b $(INSTALL_BIN) -s $(TOSBOOT_REALPROG_START) -t at91sam3s4-ek -p $(SAM-BA) -c @echo "Installing $(PLATFORM) bootloader using $(PROGRAM)" $(PROGRAMMER) -b $(BOOTLOADER_IMG) -s $(TOSBOOT_START) -t at91sam3s4-ek -p $(SAM-BA) -r -c program_input: bin @: tinyos-2.1.2+dfsg/support/make/sam3/sam-ba.extra000066400000000000000000000030671207233610700214700ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make PROGRAM = samba-program.py SAM-BA ?= /dev/ttyUSB0 START_ADDR ?= 0x80000 BOARD ?= at91sam3u4-ek PROGRAMMER ?= $(PROGRAM) DELUGE_BASE_EXE=$(BUILDDIR)/deluge-base.exe DELUGE_BASE_BIN=$(BUILDDIR)/deluge-base.bin program: FORCE @echo " installing $(PLATFORM) binary using $(PROGRAM)" $(PROGRAMMER) -b $(INSTALL_BIN) -s $(START_ADDR) -t $(BOARD) -p $(SAM-BA) -r deluge_base_bin: FORCE @echo "Compiling $(PLATFORM) deluge base station" @$(NCC) -o $(DELUGE_BASE_EXE) $(OPTFLAGS) $(PFLAGS) -DDELUGE_BASESTATION $(CFLAGS) $(WIRING_CHECK_FLAGS) $(COMPONENT).nc $(LIBS) $(LDFLAGS) @$(OBJCOPY) --output-target=binary $(DELUGE_BASE_EXE) $(DELUGE_BASE_BIN) program_gi: deluge_base_bin FORCE @echo "Installing $(PLATFORM) deluge base station using $(PROGRAM)" $(PROGRAMMER) -b $(DELUGE_BASE_BIN) -s $(TOSBOOT_REALPROG_START) -t $(BOARD) -p $(SAM-BA) -c @echo "Installing $(PLATFORM) bootloader using $(PROGRAM)" $(PROGRAMMER) -b $(BOOTLOADER_IMG) -s $(TOSBOOT_START) -t $(BOARD) -p $(SAM-BA) -r -c @echo "Injecting $(PLATFORM) golden image" @sleep 5 tos-deluge $(INSTALL_GOLDENIMAGE) -i 0 $(BUILDDIR)/tos_image.xml @echo "Rebooting into $(PLATFORM) golden image" @sleep 1 tos-deluge $(INSTALL_GOLDENIMAGE) -r 0 program_ngi: FORCE @echo "Installing $(PLATFORM) binary using $(PROGRAM)" $(PROGRAMMER) -b $(INSTALL_BIN) -s $(TOSBOOT_REALPROG_START) -t $(BOARD) -p $(SAM-BA) -c @echo "Installing $(PLATFORM) bootloader using $(PROGRAM)" $(PROGRAMMER) -b $(BOOTLOADER_IMG) -s $(TOSBOOT_START) -t $(BOARD) -p $(SAM-BA) -r -c program_input: bin @: tinyos-2.1.2+dfsg/support/make/sam3/sam3.rules000066400000000000000000000057361207233610700212070ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make define SAM3_HELP SAM3 extras: None available at the moment. endef HELP += $(SAM3_HELP) OBJCOPY = arm-none-eabi-objcopy OBJDUMP = arm-none-eabi-objdump SET_ID = tos-set-symbols NCC = ncc LIBS = -lm AMADDR = ActiveMessageAddressC\$$addr BUILDDIR ?= build/$(PLATFORM) MAIN_EXE = $(BUILDDIR)/main.exe MAIN_BIN = $(BUILDDIR)/main.bin MAIN_IHEX = $(BUILDDIR)/main.ihex INSTALL_BIN = $(MAIN_BIN).out$(if $(NODEID),-$(NODEID),) INCLUDE_DIRS ?= $(TOSDIR)/platforms/$(PLATFORM) EXTRA_MODULES ?= $(TOSDIR)/platforms/$(PLATFORM)/vectors.c OPTFLAGS ?= -O3 -g CFLAGS += -mcpu=cortex-m3 -mthumb -fno-strict-aliasing PFLAGS += $(EXTRA_MODULES) PFLAGS += -I$(INCLUDE_DIRS) PFLAGS += -Wall -Wshadow $(NESC_FLAGS) PFLAGS += -target=$(PLATFORM) -fnesc-cfile=$(BUILDDIR)/app.c PFLAGS += -finline-limit=100000 PFLAGS += -board=$(SENSORBOARD) # can be overridden by MP-enabled linker file (see mpu.extra) LINKERFILE_PREFIX ?= sam3u-ek-flash LINKERFILE ?= $(LINKERFILE_PREFIX).x LDFLAGS += -L$(INCLUDE_DIRS) -T $(LINKERFILE) BUILDLESS_DEPS += bytes # Build storage file if volumes.xml present ifneq ($(wildcard $(VOLUME_FILE)), ) build_storage: $(BUILDDIR)/StorageVolumes.h exe0: build_storage VOLUME_ALLOCATOR_FLAGS ?= $(BUILDDIR)/StorageVolumes.h: $(VOLUME_FILE) $(VOLUME_ALLOCATOR) $(VOLUME_ALLOCATOR_FLAGS) $(PLATFORMDIR) <$(VOLUME_FILE) >$@ || rm -f $@ PFLAGS += -I$(BUILDDIR) else build_storage: endif ifndef BUILD_DEPS ifeq ($(filter $(BUILDLESS_DEPS),$(GOALS)),) BUILD_DEPS = bin tosimage bytes $(POST_BUILD_EXTRA_DEPS) endif endif ifdef MSG_SIZE PFLAGS += -DTOSH_DATA_LENGTH=$(MSG_SIZE) endif ifdef DEFAULT_LOCAL_GROUP PFLAGS += -DDEFINED_TOS_AM_GROUP=$(DEFAULT_LOCAL_GROUP) endif DEFAULT_PROGRAM ?= sam-ba # Use the 'if' function instead of the 'ifdef' construct because ifdef freaks # out with call in there. I don't know why. $(if $(PROGRAM),,$(call TOSMake_include,sam3/$(DEFAULT_PROGRAM).extra)) exe: exe0 bytes FORCE @: exe0: builddir $(BUILD_EXTRA_DEPS) FORCE @echo " compiling $(COMPONENT) to a $(PLATFORM) binary" $(NCC) -o $(MAIN_EXE) $(OPTFLAGS) $(PFLAGS) $(CFLAGS) $(WIRING_CHECK_FLAGS) $(COMPONENT).nc $(LIBS) $(LDFLAGS) ifdef WIRING_CHECK_FILE @nescc-wiring $(WIRING_CHECK_FILE) endif @echo " compiled $(COMPONENT) to $(MAIN_EXE)" builddir: FORCE mkdir -p $(BUILDDIR) setid: FORCE @cmd () { echo "$$@"; $$@; }; if [ x = x$(NODEID) ]; then cmd $(OBJCOPY) --output-target=binary $(MAIN_EXE) $(INSTALL_BIN); else cmd $(SET_ID) --objcopy $(OBJCOPY) --objdump $(OBJDUMP) --target binary $(MAIN_EXE) $(INSTALL_BIN) TOS_NODE_ID=$(NODEID) $(AMADDR)=$(NODEID); fi tosimage: ihex build_tosimage FORCE @: bin: exe FORCE $(OBJCOPY) --output-target=binary $(MAIN_EXE) $(MAIN_BIN) ihex: exe FORCE $(OBJCOPY) --output-target=ihex $(MAIN_EXE) $(MAIN_IHEX) bytes: FORCE @$(OBJDUMP) -h $(MAIN_EXE) | perl -ne '$$b{$$1}=hex $$2 if /^\s*\d+\s*\.(text|data|bss)\s+(\S+)/; END { printf("%16d bytes in ROM\n%16d bytes in RAM\n",$$b{text}+$$b{data},$$b{data}+$$b{bss}); }' tinyos-2.1.2+dfsg/support/make/sam3s_ek.target000066400000000000000000000004501207233610700213260ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make PLATFORM = sam3s_ek LINKERFILE_PREFIX?=sam3s-ek-flash SAM-BA?=/dev/ttyUSB10 START_ADDR?=0x400000 BOARD?=at91sam3s4-ek ifdef CC2520_CHANNEL PFLAGS += -DCC2520_DEF_CHANNEL=$(CC2520_CHANNEL) endif $(call TOSMake_include_platform,sam3) sam3s_ek: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/sam3u_ek.target000066400000000000000000000003051207233610700213270ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make PLATFORM = sam3u_ek ifdef CC2420_CHANNEL PFLAGS += -DCC2420_DEF_CHANNEL=$(CC2420_CHANNEL) endif $(call TOSMake_include_platform,sam3) sam3u_ek: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/savepp.extra000066400000000000000000000001561207233610700207570ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make PFLAGS += -fnesc-cppdir=pp BUILD_EXTRA_DEPS += rmpp rmpp: FORCE rm -rf pp tinyos-2.1.2+dfsg/support/make/shimmer.target000066400000000000000000000005221207233610700212650ustar00rootroot00000000000000PLATFORM = shimmer # Remove MSP430 hardware multiply disable: new msp430-gcc fixes # PFLAGS += -mdisable-hwmul #OPTFLAGS += -O MSP_BSL ?= tos-bsl MSP_BSL_FLAGS = --invert-test --invert-reset ifdef CC2420_CHANNEL PFLAGS += -DCC2420_DEF_CHANNEL=$(CC2420_CHANNEL) endif $(call TOSMake_include_platform,msp) shimmer: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/shimmer2.target000066400000000000000000000005241207233610700213510ustar00rootroot00000000000000PLATFORM = shimmer2 # Remove MSP430 hardware multiply disable: new msp430-gcc fixes # PFLAGS += -mdisable-hwmul #OPTFLAGS += -O MSP_BSL ?= tos-bsl MSP_BSL_FLAGS = --invert-test --invert-reset ifdef CC2420_CHANNEL PFLAGS += -DCC2420_DEF_CHANNEL=$(CC2420_CHANNEL) endif $(call TOSMake_include_platform,msp) shimmer2: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/shimmer2r.target000066400000000000000000000005251207233610700215340ustar00rootroot00000000000000PLATFORM = shimmer2r # Remove MSP430 hardware multiply disable: new msp430-gcc fixes #PFLAGS += -mdisable-hwmul #OPTFLAGS += -O MSP_BSL ?= tos-bsl MSP_BSL_FLAGS = --invert-test --invert-reset ifdef CC2420_CHANNEL PFLAGS += -DCC2420_DEF_CHANNEL=$(CC2420_CHANNEL) endif $(call TOSMake_include_platform,msp) shimmer2r: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/sim-fast.extra000066400000000000000000000064501207233610700212070ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: sim-fast.extra,v 1.8 2010-04-08 04:27:24 regehr Exp $ GCC=gcc GPP=g++ OPTFLAGS = -g -O3 LIBS = -lm -lstdc++ PFLAGS += -tossim -fnesc-nido-tosnodes=1000 -fnesc-simulate -fnesc-nido-motenumber=sim_node\(\) -DTOSSIM_NO_DEBUG WFLAGS = -Wno-nesc-data-race PYTHON_VERSION ?= $(shell python --version 2>&1 | sed 's/Python 2\.\([0-9]\)\.[0-9]+\{0,1\}/2.\1/') BUILDDIR = simbuild/$(PLATFORM) CFILE = $(BUILDDIR)/sim.c OBJFILE = $(BUILDDIR)/sim.o CXXFILE = $(TOSDIR)/lib/tossim/tossim.c CXXOBJFILE = $(BUILDDIR)/tossim.o HASHFILE = $(TOSDIR)/lib/tossim/hashtable.c HASHOBJFILE = $(BUILDDIR)/c-support.o PYFILE = $(TOSDIR)/lib/tossim/tossim_wrap.cxx PYOBJFILE = $(BUILDDIR)/pytossim.o PYDIR =/usr/include/python$(PYTHON_VERSION) SIMDIR =$(TOSDIR)/lib/tossim XML = app.xml DUMPTYPES = -fnesc-dump=components -fnesc-dump=variables -fnesc-dump=constants -fnesc-dump=typedefs -fnesc-dump=interfacedefs -fnesc-dump=tags ifeq ($(findstring cygwin, $(OSTYPE)),cygwin) PLATFORM_FLAGS=-DUSE_DL_IMPORT -fpic SHARED_OBJECT=_TOSSIM.dll PLATFORM_BUILD_FLAGS= -fpic -W1,--enabled-auto-image-base PLATFORM_LIB_FLAGS = -L/usr/lib/python$(PYTHON_VERSION)/config -L/$(PYDIR)/config -lstdc++ -lpython$(PYTHON_VERSION) else ifeq ($(OS),Windows_NT) # Some TinyOS installs are like this PLATFORM_FLAGS=-DUSE_DL_IMPORT -fpic SHARED_OBJECT=_TOSSIM.dll PLATFORM_BUILD_FLAGS= -fpic -W1,--enabled-auto-image-base PLATFORM_LIB_FLAGS = -L/usr/lib/python$(PYTHON_VERSION)/config -L/$(PYDIR)/config -lstdc++ -lpython$(PYTHON_VERSION) else ifeq ($(findstring darwin, $(OSTYPE)), darwin) PLATFORM_FLAGS=-fPIC PLATFORM_CC_FLAGS=-bundle SHARED_OBJECT=_TOSSIMmodule.so PLATFORM_BUILD_FLAGS=-flat_namespace -undefined suppress PLATFORM_LIB_FLAGS = -lstdc++ else # linux PLATFORM_FLAGS=-shared -fPIC SHARED_OBJECT=_TOSSIMmodule.so PLATFORM_LIB_FLAGS = -lstdc++ PLATFORM_BUILD_FLAGS= -shared -fPIC endif endif endif BUILD_DEPS = sim-exe # lib/tossim has to come at the end in order to ensure basic TOSSIM # implementations are the last resort, so put it directly in the call sim-exe: builddir $(BUILD_EXTRA_DEPS) FORCE @echo " placing object files in $(BUILDDIR)" @echo " writing XML schema to $(XML)" @echo " compiling $(COMPONENT) to object file sim.o" $(NCC) -c $(PLATFORM_FLAGS) -o $(OBJFILE) $(OPTFLAGS) $(PFLAGS) $(CFLAGS) $(WFLAGS) $(COMPONENT).nc $(LDFLAGS) $(DUMPTYPES) -fnesc-dumpfile=$(XML) @echo " compiling Python support and C libraries into pytossim.o, tossim.o, and c-support.o" $(GPP) -c $(PLATFORM_CC_FLAGS) $(PLATFORM_FLAGS) -o $(PYOBJFILE) $(OPTFLAGS) $(CFLAGS) $(PYFILE) -I$(PYDIR) -I$(SIMDIR) -DHAVE_CONFIG_H $(GPP) -c $(PLATFORM_CC_FLAGS) $(PLATFORM_FLAGS) -o $(CXXOBJFILE) $(OPTFLAGS) $(CFLAGS) $(CXXFILE) -I$(PYDIR) -I$(SIMDIR) $(GPP) -c $(PLATFORM_CC_FLAGS) $(PLATFORM_FLAGS) -o $(HASHOBJFILE) $(OPTFLAGS) $(CFLAGS) $(HASHFILE) -I$(PYDIR) -I$(SIMDIR) @echo " linking into shared object ./$(SHARED_OBJECT)" $(GPP) $(PLATFORM_BUILD_FLAGS) $(PLATFORM_CC_FLAGS) $(PYOBJFILE) $(OBJFILE) $(CXXOBJFILE) $(HASHOBJFILE) $(PLATFORM_LIB_FLAGS) -o $(SHARED_OBJECT) @echo " copying Python script interface TOSSIM.py from lib/tossim to local directory" @cp $(TOSDIR)/lib/tossim/TOSSIM.py . @echo " " @echo "*** Successfully built $(PLATFORM) TOSSIM library. " tinyos-2.1.2+dfsg/support/make/sim-sf.extra000066400000000000000000000135621207233610700206640ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: sim-sf.extra,v 1.1 2007-10-03 02:09:59 hiro Exp $ # Copyright (c) 2007 Toilers Research Group - Colorado School of Mines # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of Toilers Research Group - Colorado School of # Mines nor the names of its contributors may be used to endorse # or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD # UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # # Author: Chad Metcalf SF_DIR=$(TOSDIR)/lib/tossim/sf SF_FLAGS=-I$(SF_DIR) GCC=gcc GPP=g++ OPTFLAGS = -g -O0 LIBS = -lm -lstdc++ PFLAGS += -tossim -fnesc-nido-tosnodes=1000 -fnesc-simulate -fnesc-nido-motenumber=sim_node\(\) $(SF_FLAGS) WFLAGS = -Wno-nesc-data-race PYTHON_VERSION ?= $(shell python --version 2>&1 | sed 's/Python 2\.\([0-9]\)\.[0-9]+\{0,1\}/2.\1/') BUILDDIR = simbuild/$(PLATFORM) CFILE = $(BUILDDIR)/sim.c OBJFILE = $(BUILDDIR)/sim.o CSFFILE = $(SF_DIR)/sim_serial_forwarder.c CSFOBJFILE = $(BUILDDIR)/c-sf.o SFFILE = $(SF_DIR)/SerialForwarder.c SFOBJFILE = $(BUILDDIR)/sf.o THROTTLEFILE = $(SF_DIR)/Throttle.cpp THROTTLEOBJFILE = $(BUILDDIR)/throttle.o PYFILE = $(SF_DIR)/tossim_wrap.cxx PYOBJFILE = $(BUILDDIR)/pytossim.o CXXFILE = $(SF_DIR)/tossim.c CXXOBJFILE = $(BUILDDIR)/tossim.o HASHFILE = $(TOSDIR)/lib/tossim/hashtable.c HASHOBJFILE = $(BUILDDIR)/c-support.o PYDIR = /usr/include/python$(PYTHON_VERSION) SIMDIR = $(TOSDIR)/lib/tossim XML = app.xml DUMPTYPES = -fnesc-dump=components -fnesc-dump=variables -fnesc-dump=constants -fnesc-dump=typedefs -fnesc-dump=interfacedefs -fnesc-dump=tags ifeq ($(findstring cygwin, $(OSTYPE)),cygwin) PLATFORM_FLAGS=-DUSE_DL_IMPORT -fpic SHARED_OBJECT=_TOSSIM.dll PLATFORM_BUILD_FLAGS= -fpic -W1,--enabled-auto-image-base PLATFORM_LIB_FLAGS = -L/usr/lib/python$(PYTHON_VERSION)/config -L/$(PYDIR)/config -lstdc++ -lpython$(PYTHON_VERSION) else ifeq ($(OS), Windows_NT) # Some TinyOS installs are like this PLATFORM_FLAGS=-DUSE_DL_IMPORT -fpic SHARED_OBJECT=_TOSSIM.dll PLATFORM_BUILD_FLAGS= -fpic -W1,--enabled-auto-image-base PLATFORM_LIB_FLAGS =-shared -L/usr/lib/python$(PYTHON_VERSION)/config -L/$(PYDIR)/config -lstdc++ -lpython$(PYTHON_VERSION) else ifeq ($(findstring darwin, $(OSTYPE)), darwin) PLATFORM_FLAGS=-fPIC PLATFORM_CC_FLAGS=-bundle SHARED_OBJECT=_TOSSIMmodule.so PLATFORM_BUILD_FLAGS=-flat_namespace -undefined suppress PLATFORM_LIB_FLAGS = -lstdc++ else # linux PLATFORM_FLAGS=-shared -fPIC SHARED_OBJECT=_TOSSIMmodule.so PLATFORM_LIB_FLAGS = -lstdc++ PLATFORM_BUILD_FLAGS= -shared -fPIC endif endif endif BUILD_DEPS = sim-exe # lib/tossim has to come at the end in order to ensure basic TOSSIM # implementations are the last resort, so put it directly in the call sim-exe: builddir $(BUILD_EXTRA_DEPS) FORCE @echo " placing object files in $(BUILDDIR)" @echo " writing XML schema to $(XML)" @echo " compiling $(COMPONENT) to object file sim.o" $(NCC) -c $(PLATFORM_FLAGS) -o $(OBJFILE) $(OPTFLAGS) $(PFLAGS) $(CFLAGS) $(WFLAGS) $(COMPONENT).nc $(LDFLAGS) $(DUMPTYPES) -fnesc-dumpfile=$(XML) @echo " compiling Python support and C libraries into pytossim.o, tossim.o, and c-support.o" $(GPP) -c $(PLATFORM_CC_FLAGS) $(PLATFORM_FLAGS) -o $(PYOBJFILE) $(OPTFLAGS) $(CFLAGS) $(SIM_CFLAGS) $(SF_FLAGS) $(PYFILE) -I$(PYDIR) -I$(SIMDIR) -DHAVE_CONFIG_H $(GPP) -c $(PLATFORM_CC_FLAGS) $(PLATFORM_FLAGS) -o $(CXXOBJFILE) $(OPTFLAGS) $(CFLAGS) $(SIM_CFLAGS) $(SF_FLAGS) $(CXXFILE) -I$(PYDIR) -I$(SIMDIR) $(GPP) -c $(PLATFORM_CC_FLAGS) $(PLATFORM_FLAGS) -o $(HASHOBJFILE) $(OPTFLAGS) $(CFLAGS) $(SIM_CFLAGS) $(SF_FLAGS) $(HASHFILE) -I$(PYDIR) -I$(SIMDIR) @echo " compiling sf support and C libraries into sf.o, c-sf.o, and throttle.o" $(GPP) -c $(PLATFORM_CC_FLAGS) $(PLATFORM_FLAGS) -o $(CSFOBJFILE) $(OPTFLAGS) $(CFLAGS) $(SIM_CFLAGS) $(SF_FLAGS) $(CSFFILE) -I$(PYDIR) -I$(SIMDIR) $(GPP) -c $(PLATFORM_CC_FLAGS) $(PLATFORM_FLAGS) -o $(SFOBJFILE) $(OPTFLAGS) $(CFLAGS) $(SIM_CFLAGS) $(SF_FLAGS) $(SFFILE) -I$(PYDIR) -I$(SIMDIR) $(GPP) -c $(PLATFORM_CC_FLAGS) $(PLATFORM_FLAGS) -o $(THROTTLEOBJFILE) $(OPTFLAGS) $(CFLAGS) $(SIM_CFLAGS) $(SF_FLAGS) $(THROTTLEFILE) -I$(PYDIR) -I$(SIMDIR) @echo " linking into shared object ./$(SHARED_OBJECT)" $(GPP) $(PLATFORM_BUILD_FLAGS) $(PLATFORM_CC_FLAGS) $(PYOBJFILE) $(OBJFILE) $(CXXOBJFILE) $(HASHOBJFILE) $(CSFOBJFILE) $(SFOBJFILE) $(THROTTLEOBJFILE) $(PLATFORM_LIB_FLAGS) $(LIBS) -o $(SHARED_OBJECT) @echo " copying Python script interface TOSSIM.py from lib/tossim to local directory" @cp $(SF_DIR)/TOSSIM.py . @echo " " @echo "*** Successfully built $(PLATFORM) TOSSIM library with TOSSIM Live extensions. " tinyos-2.1.2+dfsg/support/make/sim.extra000066400000000000000000000067661207233610700202660ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: sim.extra,v 1.14 2009-11-14 02:14:18 razvanm Exp $ export GCC=gcc GPP=g++ OPTFLAGS = -g -O0 LIBS = -lm -lstdc++ PFLAGS += -tossim -fnesc-nido-tosnodes=1000 -fnesc-simulate -fnesc-nido-motenumber=sim_node\(\) -fnesc-gcc=$(GCC) WFLAGS = -Wno-nesc-data-race PYTHON_VERSION ?= $(shell python --version 2>&1 | sed 's/Python 2\.\([0-9]\)\.[0-9]+\{0,1\}/2.\1/') BUILDDIR = simbuild/$(PLATFORM) CFILE = $(BUILDDIR)/sim.c OBJFILE = $(BUILDDIR)/sim.o CXXFILE = $(TOSDIR)/lib/tossim/tossim.c CXXOBJFILE = $(BUILDDIR)/tossim.o HASHFILE = $(TOSDIR)/lib/tossim/hashtable.c HASHOBJFILE = $(BUILDDIR)/c-support.o PYFILE = $(TOSDIR)/lib/tossim/tossim_wrap.cxx PYOBJFILE = $(BUILDDIR)/pytossim.o PYDIR = $(shell python$(PYTHON_VERSION)-config --prefix)/include/python$(PYTHON_VERSION) SIMDIR =$(TOSDIR)/lib/tossim XML = app.xml DUMPTYPES = -fnesc-dump=components -fnesc-dump=variables -fnesc-dump=constants -fnesc-dump=typedefs -fnesc-dump=interfacedefs -fnesc-dump=tags ifeq ($(findstring cygwin, $(OSTYPE)),cygwin) PLATFORM_FLAGS=-DUSE_DL_IMPORT -fpic SHARED_OBJECT=_TOSSIM.dll PLATFORM_BUILD_FLAGS= -fpic -W1,--enabled-auto-image-base PLATFORM_LIB_FLAGS = -L/usr/lib/python$(PYTHON_VERSION)/config -L/$(PYDIR)/config -lstdc++ -lpython$(PYTHON_VERSION) else ifeq ($(OS), Windows_NT) # Some TinyOS installs are like this PLATFORM_FLAGS=-DUSE_DL_IMPORT -fpic SHARED_OBJECT=_TOSSIM.dll PLATFORM_BUILD_FLAGS= -fpic -W1,--enabled-auto-image-base PLATFORM_LIB_FLAGS =-shared -L/usr/lib/python$(PYTHON_VERSION)/config -L/$(PYDIR)/config -lstdc++ -lpython$(PYTHON_VERSION) else ifeq ($(findstring darwin, $(OSTYPE)), darwin) SIM_DARWIN=TRUE else ifeq ($(findstring Darwin, $(shell uname)), Darwin) SIM_DARWIN = TRUE else # linux PLATFORM_FLAGS=-shared -fPIC SHARED_OBJECT=_TOSSIMmodule.so PLATFORM_LIB_FLAGS = -lstdc++ PLATFORM_BUILD_FLAGS= -shared -fPIC endif endif endif endif ifdef SIM_DARWIN PLATFORM_FLAGS=-fPIC -D_FORTIFY_SOURCE=0 PLATFORM_CC_FLAGS=-bundle SHARED_OBJECT=_TOSSIMmodule.so PLATFORM_BUILD_FLAGS=-flat_namespace -undefined suppress PLATFORM_LIB_FLAGS = -lstdc++ endif BUILD_DEPS = sim-exe # lib/tossim has to come at the end in order to ensure basic TOSSIM # implementations are the last resort, so put it directly in the call sim-exe: builddir $(BUILD_EXTRA_DEPS) FORCE @echo " placing object files in $(BUILDDIR)" @echo " writing XML schema to $(XML)" @echo " compiling $(COMPONENT) to object file sim.o" $(NCC) -c $(PLATFORM_FLAGS) -o $(OBJFILE) $(OPTFLAGS) $(PFLAGS) $(CFLAGS) $(WFLAGS) $(COMPONENT).nc $(LDFLAGS) $(DUMPTYPES) -fnesc-dumpfile=$(XML) @echo " compiling Python support and C libraries into pytossim.o, tossim.o, and c-support.o" $(GPP) -c $(PLATFORM_CC_FLAGS) $(PLATFORM_FLAGS) -o $(PYOBJFILE) $(OPTFLAGS) $(CFLAGS) $(PYFILE) -I$(PYDIR) -I$(SIMDIR) -DHAVE_CONFIG_H $(GPP) -c $(PLATFORM_CC_FLAGS) $(PLATFORM_FLAGS) -o $(CXXOBJFILE) $(OPTFLAGS) $(CFLAGS) $(CXXFILE) -I$(PYDIR) -I$(SIMDIR) $(GPP) -c $(PLATFORM_CC_FLAGS) $(PLATFORM_FLAGS) -o $(HASHOBJFILE) $(OPTFLAGS) $(CFLAGS) $(HASHFILE) -I$(PYDIR) -I$(SIMDIR) @echo " linking into shared object ./$(SHARED_OBJECT)" $(GPP) $(PLATFORM_BUILD_FLAGS) $(PLATFORM_CC_FLAGS) $(PYOBJFILE) $(OBJFILE) $(CXXOBJFILE) $(HASHOBJFILE) $(PLATFORM_LIB_FLAGS) -o $(SHARED_OBJECT) @echo " copying Python script interface TOSSIM.py from lib/tossim to local directory" @cp $(TOSDIR)/lib/tossim/TOSSIM.py . @echo " " @echo "*** Successfully built $(PLATFORM) TOSSIM library. " tinyos-2.1.2+dfsg/support/make/span.target000066400000000000000000000005361207233610700205670ustar00rootroot00000000000000PLATFORM = span # Remove MSP430 hardware multiply disable: new msp430-gcc fixes # PFLAGS += -mdisable-hwmul #OPTFLAGS += -O MSP_BSL ?= tos-bsl MSP_BSL_FLAGS = --invert-test --invert-reset ifdef CC2420_CHANNEL PFLAGS += -DCC2420_DEF_CHANNEL=$(CC2420_CHANNEL) endif $(call TOSMake_include_platform,msp) span: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/stack-check.extra000066400000000000000000000000611207233610700216340ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make STACK_CHECK = 1 tinyos-2.1.2+dfsg/support/make/telos.target000066400000000000000000000003641207233610700207530ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: telos.target,v 1.4 2006-12-12 18:22:55 vlahan Exp $ TELOS_REV ?= A ifeq ($(TELOS_REV),A) TELOS_TARGET = telosa.target else TELOS_TARGET = telosb.target endif $(call TOSMake_include,$(TELOS_TARGET)) tinyos-2.1.2+dfsg/support/make/telosa.target000066400000000000000000000006141207233610700211120ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: telosa.target,v 1.6 2008-03-11 09:34:13 klueska Exp $ PLATFORM ?= telosa MSP_MCU = msp430f149 MSP_BSL ?= tos-bsl ifdef CC2420_CHANNEL PFLAGS += -DCC2420_DEF_CHANNEL=$(CC2420_CHANNEL) endif VOLUME_FILE = volumes-at45db.xml VOLUME_ALLOCATOR ?= tos-storage-at45db $(call TOSMake_include_platform,msp) telos: $(BUILD_DEPS) @: telosa: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/telosb.target000066400000000000000000000006161207233610700211150ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: telosb.target,v 1.5 2008-03-11 09:34:13 klueska Exp $ PLATFORM ?= telosb MSP_BSL ?= tos-bsl MSP_BSL_FLAGS = --telosb VOLUME_FILE = volumes-stm25p.xml VOLUME_ALLOCATOR ?= tos-storage-stm25p ifdef CC2420_CHANNEL PFLAGS += -DCC2420_DEF_CHANNEL=$(CC2420_CHANNEL) endif $(call TOSMake_include_platform,msp) telos: $(BUILD_DEPS) @: telosb: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/tframe.extra000066400000000000000000000004201207233610700207310ustar00rootroot00000000000000# Makefile extra for compiling 802.15.4 TinyOS apps with t-frames. # T-frames are not interoperable with 6lowpan networks. # Please see TEP 125 for details. # Philip Levis, June 15 2008. #Include directory where T-Frame implementation lies. CFLAGS += -DTFRAMES_ENABLED tinyos-2.1.2+dfsg/support/make/threads.extra000066400000000000000000000141241207233610700211130ustar00rootroot00000000000000# Extra threads Makefile target to enable thread support for tinyos # Kevin Klues May 16th, 2008 # Chieh-Jan Mike Liang July 11th, 2008 #Set up flag signifying threads are enabled THREADS = THREADS PFLAGS += -D$(THREADS) TOS_THREADS_DIR ?= $(TOSDIR)/lib/tosthreads #Include directories required by all platforms and mcus CFLAGS += -I$(TOS_THREADS_DIR)/system CFLAGS += -I$(TOS_THREADS_DIR)/interfaces CFLAGS += -I$(TOS_THREADS_DIR)/types CFLAGS += -I$(TOS_THREADS_DIR)/lib/serial #Setup the thread scheduler for use by redefining the name of the task scheduler to use PFLAGS += -tosscheduler=SchedulerBasicP,TinyTaskSchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask #Msp430 specific include directories on tested platforms THREADS_MSP430_DIR = $(TOS_THREADS_DIR)/chips/msp430 THREADS_MSP430_INCLUDE_DIRS = -I$(THREADS_MSP430_DIR) THREADS_MSP430_INCLUDE_DIRS += -I$(THREADS_MSP430_DIR)/adc12 THREADS_MSP430_INCLUDE_DIRS += -I$(THREADS_MSP430_DIR)/sensors #Atm128 specific include directories on tested platforms THREADS_ATM128_DIR = $(TOS_THREADS_DIR)/chips/atm128 THREADS_ATM128_INCLUDE_DIRS = -I$(THREADS_ATM128_DIR) THREADS_ATM128_INCLUDE_DIRS += -I$(THREADS_ATM128_DIR)/adc #Atm1281 specific include directories on tested platforms THREADS_ATM1281_DIR = $(TOS_THREADS_DIR)/chips/atm1281 THREADS_ATM1281_INCLUDE_DIRS = -I$(THREADS_ATM1281_DIR) #CC1000 specific include directories on tested platforms THREADS_CC1000_DIR = $(TOS_THREADS_DIR)/chips/cc1000 THREADS_CC1000_INCLUDE_DIRS = -I$(THREADS_CC1000_DIR) #CC2420 specific include directories on tested platforms THREADS_CC2420_DIR = $(TOS_THREADS_DIR)/chips/cc2420 THREADS_CC2420_INCLUDE_DIRS = -I$(THREADS_CC2420_DIR) #RF230 specific include directories on tested platforms THREADS_RF230_DIR = $(TOS_THREADS_DIR)/chips/rf230 THREADS_RF230_INCLUDE_DIRS = -I$(THREADS_RF230_DIR) #TDA5250 specific include directories on tested platforms THREADS_TDA5250_DIR = $(TOS_THREADS_DIR)/chips/tda5250 THREADS_TDA5250_INCLUDE_DIRS = -I$(THREADS_TDA5250_DIR) #XE1205 specific include directories on tested platforms THREADS_XE1205_DIR = $(TOS_THREADS_DIR)/chips/xe1205 THREADS_XE1205_INCLUDE_DIRS = -I$(THREADS_XE1205_DIR) #Telos specific include directories THREADS_TELOS_INCLUDE_DIRS = -I$(TOS_THREADS_DIR)/platforms/telosa #Mica2 specific include directories THREADS_MICA2_INCLUDE_DIRS = -I$(TOS_THREADS_DIR)/platforms/mica2 THREADS_MICA2_INCLUDE_DIRS += -I$(TOS_THREADS_DIR)/platforms/mica2/chips/cc1000 #Mica2dot specific include directories THREADS_MICA2DOT_INCLUDE_DIRS = -I$(TOS_THREADS_DIR)/platforms/mica2dot THREADS_MICA2DOT_INCLUDE_DIRS += -I$(TOS_THREADS_DIR)/platforms/mica2dot/chips/cc1000 #MicaZ specific include directories THREADS_MICAZ_INCLUDE_DIRS = -I$(TOS_THREADS_DIR)/platforms/micaz #IRIS specific include directories THREADS_IRIS_INCLUDE_DIRS = -I$(TOS_THREADS_DIR)/platforms/iris #TinyNode specific include directories THREADS_TINYNODE_INCLUDE_DIRS = -I$(TOS_THREADS_DIR)/platforms/tinynode #eyesIFX specific include directories THREADS_EYES_INCLUDE_DIRS = -I$(TOS_THREADS_DIR)/platforms/eyesIFX #Shimmer specific include directories THREADS_SHIMMER_INCLUDE_DIRS = -I$(TOS_THREADS_DIR)/platforms/shimmer #Epic specific include directories THREADS_EPIC_INCLUDE_DIRS = -I$(TOS_THREADS_DIR)/platforms/epic #M16c60 specific include directories on tested platforms THREADS_M16C60_DIR = $(TOS_THREADS_DIR)/chips/m16c60 THREADS_M16C60_INCLUDE_DIRS = -I$(THREADS_M16C60_DIR) #Mulle specific include directories THREADS_MULLE_INCLUDE_DIRS = -I$(TOS_THREADS_DIR)/platforms/mulle #Add CFLAGS for supported platforms ifneq ($(filter telos telosa telosb tmote,$(MAKECMDGOALS)),) CFLAGS += $(THREADS_MSP430_INCLUDE_DIRS) CFLAGS += $(THREADS_CC2420_INCLUDE_DIRS) CFLAGS += $(THREADS_TELOS_INCLUDE_DIRS) #Since Telosb has some sensors not on other platforms, this helps us figure out #what components should be included ifneq ($(filter telosb,$(MAKECMDGOALS)),) CFLAGS += -DPLATFORM_TELOSB endif endif ifneq ($(filter epic,$(MAKECMDGOALS)),) CFLAGS += $(THREADS_MSP430_INCLUDE_DIRS) CFLAGS += $(THREADS_CC2420_INCLUDE_DIRS) CFLAGS += $(THREADS_EPIC_INCLUDE_DIRS) endif ifneq ($(filter mica2,$(MAKECMDGOALS)),) CFLAGS += $(THREADS_ATM128_INCLUDE_DIRS) CFLAGS += $(THREADS_CC1000_INCLUDE_DIRS) CFLAGS += $(THREADS_MICA2_INCLUDE_DIRS) endif ifneq ($(filter mica2dot,$(MAKECMDGOALS)),) CFLAGS += $(THREADS_ATM128_INCLUDE_DIRS) CFLAGS += $(THREADS_CC1000_INCLUDE_DIRS) CFLAGS += $(THREADS_MICA2DOT_INCLUDE_DIRS) CFLAGS += $(THREADS_MICA2_INCLUDE_DIRS) endif ifneq ($(filter micaz,$(MAKECMDGOALS)),) CFLAGS += $(THREADS_ATM128_INCLUDE_DIRS) CFLAGS += $(THREADS_CC2420_INCLUDE_DIRS) CFLAGS += $(THREADS_MICAZ_INCLUDE_DIRS) endif ifneq ($(filter iris,$(MAKECMDGOALS)),) CFLAGS += $(THREADS_ATM1281_INCLUDE_DIRS) CFLAGS += $(THREADS_ATM128_INCLUDE_DIRS) CFLAGS += $(THREADS_RF230_INCLUDE_DIRS) CFLAGS += $(THREADS_IRIS_INCLUDE_DIRS) endif ifneq ($(filter tinynode,$(MAKECMDGOALS)),) CFLAGS += $(THREADS_MSP430_INCLUDE_DIRS) CFLAGS += $(THREADS_XE1205_INCLUDE_DIRS) CFLAGS += $(THREADS_TINYNODE_INCLUDE_DIRS) endif ifneq ($(filter eyesIFX eyesIFXv2,$(MAKECMDGOALS)),) CFLAGS += $(THREADS_MSP430_INCLUDE_DIRS) CFLAGS += $(THREADS_TDA5250_INCLUDE_DIRS) CFLAGS += $(THREADS_EYES_INCLUDE_DIRS) endif ifneq ($(filter shimmer,$(MAKECMDGOALS)),) CFLAGS += $(THREADS_MSP430_INCLUDE_DIRS) CFLAGS += $(THREADS_CC2420_INCLUDE_DIRS) CFLAGS += $(THREADS_SHIMMER_INCLUDE_DIRS) endif ifneq ($(filter shimmer2,$(MAKECMDGOALS)),) CFLAGS += $(THREADS_MSP430_INCLUDE_DIRS) CFLAGS += $(THREADS_CC2420_INCLUDE_DIRS) CFLAGS += $(THREADS_SHIMMER_INCLUDE_DIRS) endif ifneq ($(filter shimmer2r,$(MAKECMDGOALS)),) CFLAGS += $(THREADS_MSP430_INCLUDE_DIRS) CFLAGS += $(THREADS_CC2420_INCLUDE_DIRS) CFLAGS += $(THREADS_SHIMMER_INCLUDE_DIRS) endif ifneq ($(filter span,$(MAKECMDGOALS)),) CFLAGS += $(THREADS_MSP430_INCLUDE_DIRS) CFLAGS += $(THREADS_CC2420_INCLUDE_DIRS) CFLAGS += $(THREADS_SHIMMER_INCLUDE_DIRS) endif ifneq ($(filter mulle,$(MAKECMDGOALS)),) CFLAGS += $(THREADS_M16C60_INCLUDE_DIRS) CFLAGS += $(THREADS_RF230_INCLUDE_DIRS) CFLAGS += $(THREADS_MULLE_INCLUDE_DIRS) endif tinyos-2.1.2+dfsg/support/make/tinynode.target000066400000000000000000000006251207233610700214560ustar00rootroot00000000000000#-*-Makefile-*- #$Id: tinynode.target,v 1.5 2008-03-11 09:34:13 klueska Exp $ PLATFORM = tinynode ifndef TOSDIR TOSDIR := $(shell ncc -print-tosdir) endif MSP_BSL ?= tos-bsl #Flash Config VOLUME_FILE = volumes-at45db.xml VOLUME_ALLOCATOR ?= tos-storage-at45db OPTFLAGS += -Os #OPTFLAGS = $(call TOSMake_include_platform,tinynode) $(call TOSMake_include_platform,msp) tinynode: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/tinynode/000077500000000000000000000000001207233610700202435ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/make/tinynode/bsl.extra000066400000000000000000000001711207233610700220670ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: bsl.extra,v 1.4 2006-12-12 18:22:59 vlahan Exp $ MSP_BSL_FLAGS += --invert-reset tinyos-2.1.2+dfsg/support/make/tinynode/digi.extra000066400000000000000000000001771207233610700222310ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: digi.extra,v 1.4 2006-12-12 18:22:59 vlahan Exp $ MSP_BSL_FLAGS = --slow --invert-test tinyos-2.1.2+dfsg/support/make/tinynode/flash.gdb.in000066400000000000000000000001731207233610700224240ustar00rootroot00000000000000# Erase and program flash. monitor erase all load @EXE@ # Reset the chip to get to a known state. monitor reset flushregs tinyos-2.1.2+dfsg/support/make/tinynode/gdb.extra000066400000000000000000000017521207233610700220510ustar00rootroot00000000000000#-*-Makefile-*- PROGRAM = gdb INIT_GDB = $(call TOSMake_find,tinynode/init.gdb.in) FLASH_GDB ?= $(call TOSMake_find,tinynode/flash.gdb.in) FLASH_GDB_NO_E ?= $(call TOSMake_find,tinynode/flashnoerase.gdb.in) PROXY_HOST ?= localhost ifdef BATCH GDB_ARGS = -batch endif program: FORCE cat $(INIT_GDB) $(FLASH_GDB) $(GDB_SCRIPT) | sed -e "s/@HOST@/$(PROXY_HOST)/g" -e "s#@EXE@#$(MAIN_EXE)#g" -e "s#@PROMPT@#msp-gdb $(COMPONENT)#g"> build/init.gdb; \ msp430-gdb $(GDB_ARGS) -silent -x build/init.gdb -se $(MAIN_EXE); \ program_no_e: FORCE @echo " ...done" program_bl: FORCE @echo " installing $(PLATFORM) bootloader using gdb" @echo " installing $(PLATFORM) binary using gdb (without mass erase)" cat $(INIT_GDB) $(FLASH_GDB) $(FLASH_GDB_NO_E) $(GDB_SCRIPT) | sed -e "s/@HOST@/$(PROXY_HOST)/g" -e "s#@EXE@#$(BOOTLOADER_IMG)#g" -e "s#@MAIN@#$(MAIN_EXE)#g" -e "s#@PROMPT@#msp-gdb $(COMPONENT)#g"> build/init.gdb; \ msp430-gdb $(GDB_ARGS) -silent -x build/init.gdb -se $(MAIN_EXE);tinyos-2.1.2+dfsg/support/make/tinynode/init.gdb.in000066400000000000000000000012111207233610700222640ustar00rootroot00000000000000set complaints 1 #set output-radix 16 #set input-radix 16 dir . set prompt (@PROMPT@) # Various personal settings display/i $pc # Connect to msp430-gdbproxy. set remoteaddresssize 16 set remotetimeout 999999 target remote @HOST@:3333 # Increase the packet size to improve upload speed. set remote memory-read-packet-size 1024 set remote memory-read-packet-size fixed set remote memory-write-packet-size 1024 set remote memory-write-packet-size fixed b 'XE1205PhyP$xe1205error' b 'XE1205SpiImplP$xe1205error' b 'XE1205SendReceiveP$xe1205error' b 'XE1205IrqConfP$xe1205error' b 'XE1205PhyRssiConfP$xe1205error' #b 'TestXE1205C$xe1205error' tinyos-2.1.2+dfsg/support/make/tinynode/noflash.extra000066400000000000000000000000711207233610700227400ustar00rootroot00000000000000FLASH_GDB = $(call TOSMake_find,tinynode/noflash.gdb.in) tinyos-2.1.2+dfsg/support/make/tinynode/noflash.gdb.in000066400000000000000000000001021207233610700227510ustar00rootroot00000000000000# Reset the chip to get to a known state. monitor reset flushregs tinyos-2.1.2+dfsg/support/make/tinynode/tinynode.rules000066400000000000000000000000771207233610700231540ustar00rootroot00000000000000ifndef NOWIRING include $(TINYOS_MAKE_PATH)/wiring.extra endif tinyos-2.1.2+dfsg/support/make/tinynode/xedebug.in000066400000000000000000000001341207233610700222140ustar00rootroot00000000000000b 'XE1205PhyP$xe1205error' b 'XE1205SpiImplP$xe1205error' b 'XE1205IrqConfP$xe1205error' tinyos-2.1.2+dfsg/support/make/tmote.target000066400000000000000000000005071207233610700207540ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: tmote.target,v 1.4 2006-12-12 18:22:55 vlahan Exp $ TMOTE_REV ?= SKY # tmote sky == telosb ifeq ($(TMOTE_REV),SKY) TMOTE_TARGET = telosb.target endif # if tmote rev is unknown, use telosb TMOTE_TARGET ?= telosb.target $(call TOSMake_include,$(TMOTE_TARGET)) tmote: $(BUILD_DEPS) @:tinyos-2.1.2+dfsg/support/make/tos_buildinfo.extra000066400000000000000000000005531207233610700223220ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: tos_buildinfo.extra,v 1.1 2007-08-17 15:47:30 beutel Exp $ TOS_BUILDINFO_PL ?= tos-write-buildinfo IDENT_PROGRAM_NAME ?= $(COMPONENT) build_buildinfo: FORCE @echo " writing TOS buildinfo" @$(TOS_BUILDINFO_PL) $(IDENT_FLAGS) --exe="$(MAIN_EXE)" --size="$(SIZE)" --platform="$(PLATFORM)" > $(BUILDDIR)/tos_buildinfo.xml tinyos-2.1.2+dfsg/support/make/tos_image.extra000066400000000000000000000005561207233610700214340ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: tos_image.extra,v 1.5 2007-04-27 05:01:25 prabal Exp $ TOS_IMAGE_PL ?= tos-write-image IDENT_PROGRAM_NAME ?= $(COMPONENT) build_tosimage: FORCE @echo " writing TOS image" @$(TOS_IMAGE_PL) $(IDENT_FLAGS) --ihex="$(MAIN_IHEX)" --exe="$(MAIN_EXE)" --objdump="$(OBJDUMP)" --platform="$(PLATFORM)" > $(BUILDDIR)/tos_image.xml tinyos-2.1.2+dfsg/support/make/tosboot.extra000066400000000000000000000050141207233610700211500ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: tosboot.extra,v 1.4 2009-11-10 07:03:34 rflury Exp $ DELUGE_DIR ?= $(TOSDIR)/lib/net/Deluge DELUGE_EXTRA ?= $(DELUGE_DIR)/extra TOSBOOT_DIR ?= $(TOSDIR)/lib/tosboot/build ifeq ($(BOOTLOADER),tosboot) CFLAGS += -DDELUGE CFLAGS += -I$(TOSDIR)/lib/net -I$(TOSDIR)/lib/net/drip -I$(DELUGE_DIR) -I$(DELUGE_DIR)/FlashVolumeManager -I$(DELUGE_DIR)/BlockStorageManager ifneq ($(filter telosb tmote epic,$(TARGETS)),) CFLAGS += -I$(DELUGE_EXTRA) -I$(DELUGE_EXTRA)/msp430 -I$(DELUGE_EXTRA)/telos ifeq ($(filter docs,$(GOALS)),) CFLAGS += -Wl,--section-start=.text=0x4a00,--defsym=_reset_vector__=0x4000 # Pull back in mspgcc CRT code discarded by the redefinition of # _reset_vector__. CFLAGS += -Wl,--undefined=__init_stack CFLAGS += -Wl,--undefined=__low_level_init CFLAGS += -Wl,--undefined=__do_copy_data CFLAGS += -Wl,--undefined=__do_clear_bss CFLAGS += -Wl,--undefined=__stop_progExec__ CFLAGS += -Wl,--undefined=_endless_loop__ ifeq ("$(shell expr `msp430-gcc -dumpversion` \>= '4.6.3')","1") CFLAGS += -Wl,--undefined=__watchdog_support endif endif ifeq ($(TARGETS),telosb) CFLAGS += -I$(DELUGE_EXTRA)/telosb BOOTLOADER_IMG ?= $(TOSBOOT_DIR)/telosb/main.ihex endif ifeq ($(TARGETS),epic) CFLAGS += -I$(DELUGE_EXTRA)/epic BOOTLOADER_IMG ?= $(TOSBOOT_DIR)/epic/main.ihex endif ifeq ($(shell [ -f /bin/cygwin1.dll ] && echo cygwin),cygwin) BOOTLOADER_IMG := $(shell cygpath -m $(BOOTLOADER_IMG)) endif endif ifeq ($(TARGETS),micaz) CFLAGS += -I$(DELUGE_EXTRA) -I$(DELUGE_EXTRA)/avr -I$(DELUGE_EXTRA)/micaz -I$(DELUGE_EXTRA)/mica2 BOOTLOADER_IMG ?= $(TOSBOOT_DIR)/micaz/main.ihex AVR_FUSE_H ?= 0xda endif ifeq ($(TARGETS),mulle) CFLAGS += -I$(DELUGE_EXTRA) -I$(DELUGE_EXTRA)/mulle -I$(DELUGE_EXTRA)/m16c60 -I$(DELUGE_EXTRA)/m16c60/62p BOOTLOADER_IMG ?= $(TOSBOOT_DIR)/mulle/main.srec endif ifeq ($(TARGETS),iris) CFLAGS += -I$(DELUGE_EXTRA)/iris -I$(DELUGE_EXTRA)/micaz -I$(DELUGE_EXTRA)/mica2 -I$(DELUGE_EXTRA)/avr -I$(DELUGE_EXTRA) BOOTLOADER_IMG ?= $(TOSBOOT_DIR)/iris/main.ihex AVR_FUSE_H ?= 0xda endif ifeq ($(TARGETS),tinynode) CFLAGS += -I$(DELUGE_EXTRA)/tinynode CFLAGS += -I$(DELUGE_EXTRA) -I$(DELUGE_EXTRA)/msp430 -I$(DELUGE_EXTRA)/msp430f1611 ifeq ($(filter docs,$(GOALS)),) CFLAGS += -Wl,--section-start=.text=0x4a00,--defsym=_reset_vector__=0x4000 endif BOOTLOADER_IMG ?= $(TOSBOOT_DIR)/tinynode/main.ihex endif endif tinyos-2.1.2+dfsg/support/make/tunit.extra000066400000000000000000000006571207233610700206320ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make #$Id: tunit.extra,v 1.1 2008-03-10 21:55:20 rincon Exp $ # @author Miklos Maroti CFLAGS += -I$(TOSCONTRIB)/tunit/tos/lib/tunit CFLAGS += -I$(TOSCONTRIB)/tunit/tos/lib/tunitstats CFLAGS += -I$(TOSCONTRIB)/tunit/tos/system/ CFLAGS += -I$(TOSCONTRIB)/tunit/tos/interfaces CFLAGS += -I$(TOSCONTRIB)/tunit/tos/lib/directserial CFLAGS += -I$(TOSCONTRIB)/tunit/tos/lib/fifoqueue CFLAGS += $(TUNITCFLAGS) tinyos-2.1.2+dfsg/support/make/ucmini.target000066400000000000000000000005351207233610700211110ustar00rootroot00000000000000#$Id: PLATFORM = ucmini PROGRAMMER ?= avrdude PROGRAMMER_PART ?= -pm128rfa1 VOLUMEFILE = volumes-stm25p.xml VOLUME_ALLOCATOR ?= tos-storage-stm25p -s32 AVR109_SLEEP ?= 0 RESET_LINE = java net.tinyos.util.ZigbitProgrammer -port $(AVR109) -reset -askforreset -sleep $(AVR109_SLEEP) $(call TOSMake_include_platform,avr) ucmini: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/make/verbose.extra000066400000000000000000000002271207233610700211250ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make # @file verbose.extra # @author Martin Turon # $Id: verbose.extra,v 1.4 2006-12-12 18:22:55 vlahan Exp $ PFLAGS += -v tinyos-2.1.2+dfsg/support/make/wiring.extra000066400000000000000000000003711207233610700207570ustar00rootroot00000000000000#-*-Makefile-*- vim:syntax=make WIRING_CHECK_FLAGS = -fnesc-dump=wiring -fnesc-dump='interfaces(!abstract())' -fnesc-dump='referenced(interfacedefs, components)' -fnesc-dumpfile=$(WIRING_CHECK_FILE) WIRING_CHECK_FILE = $(BUILDDIR)/wiring-check.xml tinyos-2.1.2+dfsg/support/make/z1.target000066400000000000000000000010071207233610700201520ustar00rootroot00000000000000PLATFORM = z1 MSP_BSL ?= tos-bsl MOTELIST ?= motelist MSP_BSL_FLAGS = --z1 MSP_MCU ?= msp430f2617 MSP_GCC ?= msp430-gcc MSP_NESC_TARGET ?= msp430 # test the compiler to see if -mdata-64k is supported and if so tell it # to put data into lower 64k. HAS_MDATA = $(shell msp430-gcc --target-help | grep mdata-64k | awk '{print $1}') ifneq "$(HAS_MDATA)" "" PFLAGS += -mdata-64k endif VOLUME_FILE = volumes-stm25p.xml VOLUME_ALLOCATOR ?= tos-storage-stm25p $(call TOSMake_include_platform,msp) z1: $(BUILD_DEPS) @: tinyos-2.1.2+dfsg/support/sdk/000077500000000000000000000000001207233610700162565ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/000077500000000000000000000000001207233610700165005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/6lowpan/000077500000000000000000000000001207233610700200665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/6lowpan/serial_tun/000077500000000000000000000000001207233610700222335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/6lowpan/serial_tun/6lowpan.h000066400000000000000000000301001207233610700237640ustar00rootroot00000000000000/* * Copyright (c) 2007 Matus Harvan * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * The structures are based on the ones from FreeBSD header files * in /usr/include/netinet6/, which are distributed unred the following * copyright: * * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * Copyright (c) 1982, 1986, 1990, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef __6LOWPAN_H__ #define __6LOWPAN_H__ #include typedef uint8_t u_int8_t; typedef uint16_t u_int16_t; typedef uint32_t u_int32_t; #define LOWPAN_MTU 1280 #define LOWPAN_OVERHEAD 17 // 16 bytes opt. headers and 1 byte dispatch #define LINK_DATA_MTU 100 // 802.15.4 space left after the 802.15.4 header: 128 - xx = 102 bytes max /* Active Message */ typedef struct __attribute__ ((__packed__))_AMPacket_t { uint8_t pkt_type; uint16_t dst; uint16_t src; uint8_t length; uint8_t group; uint8_t type; uint8_t data[LINK_DATA_MTU]; } am_packet_t; /* 802.15.4 address */ enum { HW_ADDR_SHORT, HW_ADDR_LONG }; typedef struct hw_addr { uint8_t type; // HW_ADDR_SHORT | HW_ADDR_LONG union { uint8_t addr_short[2]; uint8_t addr_long[8]; }; } hw_addr_t; /* IPv6 address */ typedef struct __attribute__ ((__packed__)) _ip_6_addr_t { uint8_t addr[16]; } ip6_addr_t; #define FRAG_BUFS 1 #define FRAG_BUF_SIZE 1280 #define FRAG_TIMEOUT 60 // 60 seconds #define FRAG_FREE -1 #define LOWPAN_APP_DATA_LEN 1517 //#define LOWPAN_HEADER_LEN 49 #define LOWPAN_HEADER_LEN 102 #define DISPATCH_UNCOMPRESSED_IPV6 0x41 #define DISPATCH_COMPRESSED_IPV6 0x42 #define DISPATCH_FIRST_FRAG 0xC0 #define DISPATCH_SUBSEQ_FRAG 0xE0 #define DISPATCH_FRAG_MASK 0xF8 #define DISPATCH_BC0 0x50 #define DISPATCH_MESH 0x80 #define DISPATCH_MESH_MASK 0xC0 #define DISPATCH_MESH_O_FLAG 0x20 #define DISPATCH_MESH_F_FLAG 0x10 #define DISPATCH_MESH_HOPSLEFT_MASK 0x0F enum { HC1_SRC_PREFIX_MASK = 0x80, HC1_SRC_PREFIX_LINKLOCAL = 0x80, HC1_SRC_PREFIX_INLINE = 0, HC1_SRC_IFACEID_MASK = 0x40, HC1_SRC_IFACEID_COMRP = 0x40, HC1_SRC_IFACEID_INLINE = 0, HC1_DST_PREFIX_MASK = 0x20, HC1_DST_PREFIX_LINKLOCAL = 0x20, HC1_DST_PREFIX_INLINE = 0, HC1_DST_IFACEID_MASK = 0x10, HC1_DST_IFACEID_COMRP = 0x10, HC1_DST_IFACEID_INLINE = 0, HC1_TCFL_MASK = 0x08, HC1_TCFL_ZERO = 0x08, HC1_TCFL_INLINE = 0, HC1_NEXTHDR_MASK = 0x06, HC1_NEXTHDR_INLINE = 0, HC1_NEXTHDR_UDP = 0x02, HC1_NEXTHDR_ICMP = 0x04, HC1_NEXTHDR_TCP = 0x06, HC1_HC2_MASK = 0x01, HC1_HC2_PRESENT = 0x01, HC1_HC2_NONE = 0, HC2_UDP_P_VALUE = 0x61616, HC2_UDP_SRC_PORT_MASK = 0x80, HC2_UDP_SRC_PORT_COMPR = 0x80, HC2_UDP_SRC_PORT_INLINE = 0, HC2_UDP_DST_PORT_MASK = 0x40, HC2_UDP_DST_PORT_COMPR = 0x40, HC2_UDP_DST_PORT_INLINE = 0, HC2_UDP_LEN_MASK = 0x20, HC2_UDP_LEN_COMPR = 0x20, HC2_UDP_LEN_INLINE = 0 }; typedef struct _frag_info_t { uint8_t offset; uint8_t len; struct _frag_info_t *next; } frag_info_t; /* * sending - application provides app_data and clears app_data_dealloc * - a pointer to app_data is returned in sendDone to do deallocation * receiving and fragment reassembly * - IP_M provides app_data and sets app_data_dealloc * - header_begin/end is set to point into app_data * and the received packet is put into app_data * - header_len should probably be set to a sane value (0) * and header to NULL or leave as is? * receiving without fragment reassembly * - the complete 802.15.4 frame is put into header * (802.15.4 header is left out) */ typedef struct _lowpan_pkt_t { /* buffers */ uint8_t buf[LOWPAN_MTU + LOWPAN_OVERHEAD]; uint8_t *buf_begin; // start of data in the buffer uint16_t len; // length of data in the buffer /* fragmentation */ uint8_t frag_state; uint16_t dgram_tag; // network byte order uint16_t dgram_size; // host byte order time_t frag_timeout; // fragment reassembly times out at tv_sec */ union { uint8_t frag_offset; // sending - offset where next fragment starts frag_info_t *frag_list; // sorted by offset in decreasing order }; /* IP addresses */ ip6_addr_t ip_src_addr; /* needed for ND and usefull elsewhere */ ip6_addr_t ip_dst_addr; /* both IP addresses filled in by ipv6*_input */ /* 802.15.4 addresses */ hw_addr_t hw_src_addr; hw_addr_t hw_dst_addr; /* 802.15.4 MAC addresses * needed for fragment identification * possibly needed for 6lowpan IPv6 header * decompression * contains mesh header entries if available */ uint8_t nd_state; struct _lowpan_pkt_t *next; } lowpan_pkt_t; /* /\* fragment reassembly buffer *\/ */ /* struct frag_buf { */ /* hw_addr_t hw_src_addr; */ /* hw_addr_t hw_dst_addr; */ /* time_t frag_timeout; */ /* uint8_t buf[FRAG_BUF_SIZE]; */ /* lowpan_pkt_t pkt; */ /* }; */ enum { FRAG_NONE = 0, FRAG_6LOWPAN = 1, FRAG_IPV6 = 2, ND_DONE = 0, ND_TODO = 1, ND_SENT = 2, APP_DATA_DEALLOC_FALSE = 0, APP_DATA_DEALLOC_TRUE = 1 }; struct __attribute__ ((__packed__)) lowpan_mesh_hdr { uint8_t dispatch; // dispatch, flags and hops left // address length depends on flags in dispatch }; struct __attribute__ ((__packed__)) lowpan_broadcast_hdr { uint8_t dispatch; uint8_t seq_no; // sequence number }; struct __attribute__ ((__packed__)) lowpan_frag_hdr { union __attribute__ ((__packed__)) { uint8_t dispatch; uint16_t dgram_size; uint8_t dgram_size8[2]; }; uint16_t dgram_tag; }; /* * Definition for internet protocol version 6. * RFC 2460 */ struct __attribute__ ((__packed__)) ip6_hdr { union { uint8_t vtc; /* 4 bits version, top 4 bits class label*/ uint32_t flow; /* 20 bits flow label at the end */ }; uint16_t plen; /* payload length */ uint8_t nxt_hdr; /* next header */ uint8_t hlim; /* hop limit */ ip6_addr_t src_addr; /* source address */ ip6_addr_t dst_addr; /* destination address */ }; #define IPV6_VERSION 0x60 #define IPV6_VERSION_MASK 0xf0 /* * Extension Headers */ struct ip6_ext { uint8_t ip6e_nxt; uint8_t ip6e_len; }; struct icmp6_hdr { uint8_t type; /* type field */ uint8_t code; /* code field */ uint16_t cksum; /* checksum field */ union { uint32_t icmp6_un_data32[1]; /* type-specific field */ uint16_t icmp6_un_data16[2]; /* type-specific field */ uint8_t icmp6_un_data8[4]; /* type-specific field */ } icmp6_dataun; }; enum { ICMP_TYPE_ECHO_DEST_UNREACH = 1, ICMP_TYPE_ECHO_PKT_TOO_BIG = 129, ICMP_TYPE_ECHO_TIME_EXCEEDED = 129, ICMP_TYPE_ECHO_PARAM_PROBLEM = 129, ICMP_TYPE_ECHO_REQUEST = 128, ICMP_TYPE_ECHO_REPLY = 129 }; /* * UDP protocol header. * Per RFC 768, September, 1981. */ struct __attribute__ ((__packed__)) udp_hdr { uint16_t src_port; /* source port */ uint16_t dst_port; /* destination port */ uint16_t len; /* udp length */ uint16_t chksum; /* udp checksum */ }; enum { //NEXT_HEADER_ICMP = 1, NEXT_HEADER_TCP = 6, NEXT_HEADER_UDP = 17, NEXT_HEADER_ICMP6 = 58 }; // from uip-1.0/uip/uip-neighbor.c #define NEIGHBOR_MAX_TIME 128 #ifndef NEIGHBOR_ENTRIES #define NEIGHBOR_ENTRIES 8 #endif struct neighbor_entry { ip6_addr_t ip_addr; struct hw_addr hw_addr; uint8_t time; }; struct neighbor_entry neighbor_entries[NEIGHBOR_ENTRIES]; #endif /* __6LOWPAN_H__ */ tinyos-2.1.2+dfsg/support/sdk/c/6lowpan/serial_tun/Makefile000066400000000000000000000004641207233610700236770ustar00rootroot00000000000000#CPPFLAGS = #LDFLAGS = FLAGS= FLAGS+=-Wall FLAGS+=-g FLAGS+=-I${TOSROOT}/support/sdk/c/sf all: serial_tun serial_tun: serial_tun.c tun_dev.c 6lowpan.h gcc $(FLAGS) -o serial_tun serial_tun.c tun_dev.c ${TOSROOT}/support/sdk/c/sf/libmote.a clean: rm -f serial_tun TAGS TAGS: rm -f TAGS etags *.c *.h tinyos-2.1.2+dfsg/support/sdk/c/6lowpan/serial_tun/README000066400000000000000000000011021207233610700231050ustar00rootroot00000000000000A daemon reading 6lowpan packets from the mote running the BaseStation application via a USB interface, translating them to Ipv6 packets, writing them to a tun interface and the other way round, i.e., reading IPv6 packets from a tun interface, encapsulating them as 6lowpan packets and sedning them to the mote. To build the daemon you also need to build the libmote.a library in $TOSROOT/support/sdk/c/. Usage with a TelosB mote: sudo ./serial_tun /dev/ttyUSB0 115200 The Active Message address 12 and the corresponding IPv6 addresses are are hardcoded in the source code. tinyos-2.1.2+dfsg/support/sdk/c/6lowpan/serial_tun/build.xml000066400000000000000000000004101207233610700240470ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/support/sdk/c/6lowpan/serial_tun/serial_tun.c000066400000000000000000001025551207233610700245540ustar00rootroot00000000000000/* * Copyright (c) 2007 Matus Harvan * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tun_dev.h" #include "serialsource.h" #include "serialpacket.h" #include "6lowpan.h" #define min(a,b) ( (a>b) ? b : a ) #define max(a,b) ( (a>b) ? a : b ) static char *msgs[] = { "unknown_packet_type", "ack_timeout" , "sync" , "too_long" , "too_short" , "bad_sync" , "bad_crc" , "closed" , "no_memory" , "unix_error" }; /* global variables */ lowpan_pkt_t *fragments = NULL; /* fragment reassembly of received frames */ //lowpan_pkt_t *send_queue = NULL; int g_send_pending = 0; hw_addr_t hw_addr; serial_source ser_src; int tun_fd = 0; /* tunnel device */ //int ser_fd = 0; /* serial device */ uint16_t g_dgram_tag = 0; /* datagram_tag for sending fragmented packets */ /* ------------------------------------------------------------------------- */ /* function pre-declarations */ int serial_output_am_payload(uint8_t *buf, int len, const hw_addr_t *hw_src_addr, const hw_addr_t *hw_dst_addr); int serial_input_layer3(uint8_t *buf, int len, const hw_addr_t *hw_src_addr, const hw_addr_t *hw_dst_addr); int serial_input_ipv6_uncompressed(uint8_t *buf, int len, const hw_addr_t *hw_src_addr, const hw_addr_t *hw_dst_addr); int serial_input_ipv6_compressed(uint8_t *buf, int len, const hw_addr_t *hw_src_addr, const hw_addr_t *hw_dst_addr); /* ------------------------------------------------------------------------- */ /* utility functions */ int get_ser_fd() { return serial_source_fd(ser_src); } void increment_g_dgram_tag() { uint16_t tmp = ntohs(g_dgram_tag); if (tmp == 0xFFFF) { tmp = 0; } else { tmp++; } g_dgram_tag = htons(tmp); } void stderr_msg(serial_source_msg problem) { fprintf(stderr, "Note: %s\n", msgs[problem]); } int debug(const char *fmt, ...) { int result; va_list ap; va_start(ap, fmt); result = vfprintf(stderr, fmt, ap); va_end(ap); return result; } /* from contiki-2.x/tools/tunslip.c */ int ssystem(const char *fmt, ...) { char cmd[128]; va_list ap; va_start(ap, fmt); vsnprintf(cmd, sizeof(cmd), fmt, ap); va_end(ap); printf("%s\n", cmd); fflush(stdout); return system(cmd); } /* print char* in hex format */ void dump_serial_packet(const unsigned char *packet, const int len) { int i; printf("len: %d\n", len); if (!packet) return; for (i = 0; i < len; i++) { printf("%02x ", packet[i]); //printf("%02x(%c) ", packet[i], packet[i]); //printf("%c", packet[i]); } putchar('\n'); /* printf("---\n"); */ /* for (i = 0; i < len; i++) { */ /* printf("%c", packet[i]); */ /* } */ /* putchar('\n'); */ /* printf("---\n"); */ } /* ------------------------------------------------------------------------- */ /* ip6_addr_t and hw_addr_t utility functions */ int ipv6_addr_is_zero(const ip6_addr_t *addr) { int i; for (i=0;i<16;i++) { if (addr->addr[i]) { return 0; } } return 1; } int ipv6_addr_is_linklocal_unicast(const ip6_addr_t *addr) { if ( addr->addr[0] == 0xFE && addr->addr[1] == 0x80 && addr->addr[2] == 0 && addr->addr[3] == 0 && addr->addr[4] == 0 && addr->addr[5] == 0 && addr->addr[6] == 0 && addr->addr[7] == 0 ) return 1; else return 0; } int cmp_ipv6_addr(const ip6_addr_t *addr1, const ip6_addr_t *addr2) { return memcmp(addr1, addr2, sizeof(ip6_addr_t)); } int cmp_hw_addr(const hw_addr_t *addr1, const hw_addr_t *addr2) { // for short addresses compare only the first two bytes if (addr1->type == HW_ADDR_SHORT && addr2->type == HW_ADDR_SHORT) { return memcmp(addr1->addr_short, addr2->addr_short, sizeof(addr1->addr_short)); } else { return memcmp(addr1, addr2, sizeof(hw_addr_t)); } } int hw_addr_is_broadcat(const hw_addr_t *hw_addr) { if (hw_addr->type == HW_ADDR_SHORT && hw_addr->addr_short[0] == 0xFF && hw_addr->addr_short[1] == 0xFF) return 1; // TODO: long address else return 0; } /* ------------------------------------------------------------------------- */ /* more utility functions */ void clear_pkt(lowpan_pkt_t *pkt) { memset(pkt, 0, sizeof(*pkt)); pkt->buf_begin = pkt->buf + LOWPAN_OVERHEAD; } void free_frag_list(frag_info_t *p) { frag_info_t *q; while (p) { q = p->next; free(p); p = q; } } void free_lowpan_pkt(lowpan_pkt_t *pkt) { lowpan_pkt_t *p; lowpan_pkt_t **q; if (!fragments) return; for(q=&fragments; *q; q=&(*q)->next) { if (*q == pkt) { p = *q; *q = p->next; free_frag_list(p->frag_list); free(p); return; } } } lowpan_pkt_t * find_fragment(hw_addr_t *hw_src_addr, hw_addr_t *hw_dst_addr, uint16_t dgram_size, uint16_t dgram_tag) { lowpan_pkt_t *p; for(p=fragments; p; p=p->next) { if ((p->dgram_tag == dgram_tag) && (p->dgram_size == dgram_size) && cmp_hw_addr(&p->hw_src_addr, hw_src_addr) == 0 && cmp_hw_addr(&p->hw_dst_addr, hw_dst_addr) == 0 ) { return p; } } return NULL; } /* ------------------------------------------------------------------------- */ /* HC1 and HC2 compression and decompresstion functions */ /* the caller has to free() new_buf */ int lowpan_decompress(uint8_t *buf, int len, const hw_addr_t *hw_src_addr, const hw_addr_t *hw_dst_addr, uint8_t **new_buf, int *new_len) { uint8_t hc1_enc; uint8_t hc2_enc; struct ip6_hdr *ip_hdr = NULL; struct udp_hdr *udp_hdr = NULL; *new_buf = malloc(len + sizeof(*ip_hdr) + sizeof(*udp_hdr)); if (!*new_buf) { fprintf(stderr, "%s: out of memory\n", __func__); *new_len = 0; return 1; } hc1_enc = *buf; buf += sizeof(hc1_enc); len -= sizeof(hc1_enc); /* HC2 encoding follows HC1 encoding */ if ((hc1_enc & HC1_HC2_MASK) == HC1_HC2_PRESENT) { hc2_enc = *buf; buf += sizeof(hc2_enc); len -= sizeof(hc2_enc); } /* IP header fields */ ip_hdr = (struct ip6_hdr *) *new_buf; memset(ip_hdr, 0, sizeof(struct ip6_hdr)); ip_hdr->vtc |= IPV6_VERSION; ip_hdr->hlim = *buf; buf += sizeof(ip_hdr->hlim); len -= sizeof(ip_hdr->hlim); /* source IP address */ if ((hc1_enc & HC1_SRC_PREFIX_MASK) == HC1_SRC_PREFIX_INLINE) { memcpy(&ip_hdr->src_addr, buf, sizeof(ip_hdr->src_addr)/2); buf += sizeof(ip_hdr->src_addr)/2; len -= sizeof(ip_hdr->src_addr)/2; } else { ip_hdr->src_addr.addr[0] = 0xFE; ip_hdr->src_addr.addr[1] = 0x80; } if ((hc1_enc & HC1_SRC_IFACEID_MASK) == HC1_SRC_IFACEID_INLINE) { memcpy(((void*)&ip_hdr->src_addr) + sizeof(ip_hdr->src_addr)/2, buf, sizeof(ip_hdr->src_addr)/2); buf += sizeof(ip_hdr->src_addr)/2; len -= sizeof(ip_hdr->src_addr)/2; } /* destination IP address */ if ((hc1_enc & HC1_DST_PREFIX_MASK) == HC1_DST_PREFIX_INLINE) { memcpy(&ip_hdr->dst_addr, buf, sizeof(ip_hdr->dst_addr)/2); buf += sizeof(ip_hdr->dst_addr)/2; len -= sizeof(ip_hdr->dst_addr)/2; } else { ip_hdr->dst_addr.addr[0] = 0xFE; ip_hdr->dst_addr.addr[1] = 0x80; } if ((hc1_enc & HC1_DST_IFACEID_MASK) == HC1_DST_IFACEID_INLINE) { memcpy(((void*)&ip_hdr->dst_addr) + sizeof(ip_hdr->dst_addr)/2, buf, sizeof(ip_hdr->dst_addr)/2); buf += sizeof(ip_hdr->dst_addr)/2; len -= sizeof(ip_hdr->dst_addr)/2; } /* Traffic Class and Flow Label */ if ((hc1_enc & HC1_TCFL_MASK) == HC1_TCFL_INLINE) { //TODO } /* Next Header */ switch (hc1_enc & HC1_NEXTHDR_MASK) { case HC1_NEXTHDR_INLINE: ip_hdr->nxt_hdr = *buf; buf += sizeof(ip_hdr->nxt_hdr); len -= sizeof(ip_hdr->nxt_hdr); break; case HC1_NEXTHDR_UDP: ip_hdr->nxt_hdr = NEXT_HEADER_UDP; break; case HC1_NEXTHDR_ICMP: ip_hdr->nxt_hdr = NEXT_HEADER_ICMP6; break; case HC1_NEXTHDR_TCP: ip_hdr->nxt_hdr = NEXT_HEADER_TCP; break; default: fprintf(stderr, "unknown next header HC1 encoding\n"); break; } /* HC_UDP compression */ if ((hc1_enc & HC1_HC2_MASK) == HC1_HC2_PRESENT && (hc1_enc & HC1_NEXTHDR_MASK) == HC1_NEXTHDR_UDP) { udp_hdr = (struct udp_hdr *) ((*new_buf) + sizeof(struct ip6_hdr)); //udp_hdr = (struct udp_hdr *) (ip_hdr + 1); memset(udp_hdr, 0, sizeof(struct udp_hdr)); /* UDP Source Port */ if ((hc2_enc & HC2_UDP_SRC_PORT_MASK) == HC2_UDP_SRC_PORT_INLINE) { memcpy(&udp_hdr->src_port, buf, sizeof(udp_hdr->src_port)); buf += sizeof(udp_hdr->src_port); len -= sizeof(udp_hdr->src_port); } else { //TODO } /* UDP Destination Port */ if ((hc2_enc & HC2_UDP_DST_PORT_MASK) == HC2_UDP_DST_PORT_INLINE) { memcpy(&udp_hdr->dst_port, buf, sizeof(udp_hdr->dst_port)); buf += sizeof(udp_hdr->dst_port); len -= sizeof(udp_hdr->dst_port); } else { //TODO } /* UDP Length */ if ((hc2_enc & HC2_UDP_LEN_MASK) == HC2_UDP_LEN_INLINE) { memcpy(&udp_hdr->len, buf, sizeof(udp_hdr->len)); buf += sizeof(udp_hdr->len); len -= sizeof(udp_hdr->len); } else { udp_hdr->len = len - sizeof(udp_hdr->chksum) + sizeof(struct udp_hdr); } /* Checksum */ memcpy(&udp_hdr->chksum, buf, sizeof(udp_hdr->chksum)); buf += sizeof(udp_hdr->chksum); len -= sizeof(udp_hdr->chksum); /* IPv6 Payload Length */ ip_hdr->plen = htons(len + sizeof(struct udp_hdr)); memcpy((*new_buf) + sizeof(struct ip6_hdr) + sizeof(struct udp_hdr), buf, len); *new_len = len + sizeof(struct ip6_hdr) + sizeof(struct udp_hdr); } else { /* IPv6 Payload Length */ ip_hdr->plen = htons(len); memcpy((*new_buf) + sizeof(struct ip6_hdr), buf, len); *new_len = len + sizeof(struct ip6_hdr); } return 0; } /* assuming there is space available in from of buf_begin */ int lowpan_compress(uint8_t **buf_begin, int *len, const hw_addr_t *hw_src_addr, const hw_addr_t *hw_dst_addr) { uint8_t *hc1_enc; uint8_t *hc2_enc; struct ip6_hdr *ip_hdr = NULL; struct udp_hdr *udp_hdr = NULL; uint8_t new_buf[sizeof(struct ip6_hdr) + sizeof(struct udp_hdr) + 5]; uint8_t *new_buf_p = new_buf; int new_len = 0; debug("%s\n", __func__); ip_hdr = (struct ip6_hdr *) *buf_begin; udp_hdr = (struct udp_hdr *) ((*buf_begin) + sizeof(struct ip6_hdr)); /* check if this is an IPv6 packet */ if ((ip_hdr->vtc & IPV6_VERSION_MASK) != IPV6_VERSION) { debug("IP version check failed - not an IPv6 packet\n"); return 0; } /* set 6lowpan dispatch value */ *new_buf_p = DISPATCH_COMPRESSED_IPV6; new_buf_p += sizeof(uint8_t); new_len += sizeof(uint8_t); /* HC1 encoding field */ hc1_enc = new_buf_p; new_buf_p += sizeof(uint8_t); new_len += sizeof(uint8_t); *hc1_enc = 0; /* does HC2 follow after HC1? */ if (ip_hdr->nxt_hdr == NEXT_HEADER_UDP) { *hc1_enc |= HC1_HC2_PRESENT; /* HC2 encoding field */ hc2_enc = new_buf_p; new_buf_p += sizeof(uint8_t); new_len += sizeof(uint8_t); *hc2_enc = 0; } else { *hc1_enc |= HC1_HC2_NONE; } /* Hop Limit */ *new_buf_p = ip_hdr->hlim; new_buf_p += sizeof(uint8_t); new_len += sizeof(uint8_t); /* source address prefix */ //TODO: fails checksum on the mote !!! if (ipv6_addr_is_linklocal_unicast(&ip_hdr->src_addr)) { *hc1_enc |= HC1_SRC_PREFIX_LINKLOCAL; } else { *hc1_enc |= HC1_SRC_PREFIX_INLINE; memcpy(new_buf_p, &(ip_hdr->src_addr), 8); new_buf_p += 8; new_len += 8; } /* source address interface identifier */ *hc1_enc |= HC1_SRC_IFACEID_INLINE; memcpy(new_buf_p, ((void*)&(ip_hdr->src_addr)) + 8, 8); new_buf_p += 8; new_len += 8; /* destination address prefix */ if (ipv6_addr_is_linklocal_unicast(&ip_hdr->dst_addr)) { *hc1_enc |= HC1_DST_PREFIX_LINKLOCAL; } else { *hc1_enc |= HC1_DST_PREFIX_INLINE; memcpy(new_buf_p, &(ip_hdr->dst_addr), 8); new_buf_p += 8; new_len += 8; } /* destination address interface identifier */ *hc1_enc |= HC1_DST_IFACEID_INLINE; memcpy(new_buf_p, ((void*)&(ip_hdr->dst_addr)) + 8, 8); new_buf_p += 8; new_len += 8; /* we're always sending packets with TC anf FL zero */ *hc1_enc |= HC1_TCFL_ZERO; /* next header */ switch (ip_hdr->nxt_hdr) { case NEXT_HEADER_UDP: *hc1_enc |= HC1_NEXTHDR_UDP; break; case NEXT_HEADER_ICMP6: *hc1_enc |= HC1_NEXTHDR_ICMP; break; case NEXT_HEADER_TCP: *hc1_enc |= HC1_NEXTHDR_TCP; break; default: *hc1_enc |= HC1_NEXTHDR_INLINE; *new_buf_p = ip_hdr->nxt_hdr; new_buf_p += sizeof(ip_hdr->nxt_hdr); new_len += sizeof(ip_hdr->nxt_hdr); break; } /* HC_UDP encoding */ if ((*hc1_enc & HC1_HC2_MASK) == HC1_HC2_PRESENT && (*hc1_enc & HC1_NEXTHDR_MASK) == HC1_NEXTHDR_UDP) { /* Source Port */ *hc2_enc |= HC2_UDP_SRC_PORT_INLINE; memcpy(new_buf_p, &udp_hdr->src_port, sizeof(udp_hdr->src_port)); new_buf_p += sizeof(udp_hdr->src_port); new_len += sizeof(udp_hdr->src_port); /* Destination Port */ *hc2_enc |= HC2_UDP_DST_PORT_INLINE; memcpy(new_buf_p, &udp_hdr->dst_port, sizeof(udp_hdr->dst_port)); new_buf_p += sizeof(udp_hdr->dst_port); new_len += sizeof(udp_hdr->dst_port); /* Length */ //*hc2_enc |= HC2_UDP_LEN_COMPR; *hc2_enc |= HC2_UDP_LEN_INLINE; memcpy(new_buf_p, &udp_hdr->len, sizeof(udp_hdr->len)); new_buf_p += sizeof(udp_hdr->len); new_len += sizeof(udp_hdr->len); /* Checksum */ memcpy(new_buf_p, &udp_hdr->chksum, sizeof(udp_hdr->chksum)); new_buf_p += sizeof(udp_hdr->chksum); new_len += sizeof(udp_hdr->chksum); /* replace the IP and UDP headers with the compressed ones */ *len += new_len; *len -= sizeof(struct ip6_hdr); *len -= sizeof(struct udp_hdr); *buf_begin += sizeof(struct ip6_hdr); *buf_begin += sizeof(struct udp_hdr); *buf_begin -= new_len; memcpy(*buf_begin, new_buf, new_len); } else { /* replace the IP header with the compressed one */ *len += new_len; *len -= sizeof(struct ip6_hdr); *buf_begin += sizeof(struct ip6_hdr); *buf_begin -= new_len; memcpy(*buf_begin, new_buf, new_len); } return 0; } /* ------------------------------------------------------------------------- */ /* handling of data arriving on the tun interface */ /* * encapsulate buf as an Active Message payload * fragments packets if needed */ int serial_output_am_payload(uint8_t *buf, int len, const hw_addr_t *hw_src_addr, const hw_addr_t *hw_dst_addr) { am_packet_t AMpacket; int result; //debug("%s: dumping buf (len: %d)...\n", __func__, len); //dump_serial_packet(buf, len); if (len > LINK_DATA_MTU) { fprintf(stderr, "%s: requested to send more than LINK_DATA_MTU"\ "(%d bytes)\n", __func__, len); // TODO: maybe we should send the fisr LINK_DATA_MTU bytes // and only print a warning return -1; } memset(&AMpacket, 0, sizeof(AMpacket)); AMpacket.pkt_type = 0; // TODO: make the dst addr handling more general //AMpacket.dst = htons(0x14); AMpacket.dst = htons(0xFFFF); //AMpacket.src = htons(0x12); // TODO: make the src addr handling more general memcpy(&AMpacket.src, hw_addr.addr_short, 2); AMpacket.group = 0; AMpacket.type = 0x41; AMpacket.length = min(len,LINK_DATA_MTU); //AMpacket.data = buf; memcpy(AMpacket.data, buf, AMpacket.length); len = AMpacket.length + 8; // data + header debug("sending to serial port...\n"); dump_serial_packet((unsigned char *)&AMpacket, len); result = write_serial_packet(ser_src, &AMpacket, len); /* * Returns: 0 if packet successfully written, 1 if successfully * written but not acknowledged, -1 otherwise */ debug("write_serial_packet returned %d\n", result); if (result < 0) { perror ("sendto"); return -1; } return len; } /* * read data from the tun device and send it to the serial port * does also fragmentation */ int tun_input() { uint8_t buf[LOWPAN_MTU + LOWPAN_OVERHEAD]; uint8_t *buf_begin = buf + LOWPAN_OVERHEAD; int len; int result; struct lowpan_frag_hdr *frag_hdr; uint8_t dgram_offset = 0; uint16_t dgram_size; hw_addr_t hw_dst_addr; uint8_t frag_len; /* length of the fragment just being sent */ uint8_t *frame_begin; /* begin of the frame payload */ uint8_t frame_len; /* length of the frame payload */ len = tun_read (tun_fd, (char*) buf_begin, LOWPAN_MTU); if (len <= 0) { perror ("read"); return 0; } printf("data on tun interface\n"); /* set 802.15.4 destination address */ hw_dst_addr.type = HW_ADDR_SHORT; hw_dst_addr.addr_short[0] =0xFF; hw_dst_addr.addr_short[1] =0xFF; /* HC compression */ lowpan_compress(&buf_begin, &len, &hw_addr, &hw_dst_addr); /* prepend dispatch */ /* buf_begin--; */ /* *buf_begin = DISPATCH_UNCOMPRESSED_IPV6; */ /* len++; */ /* determine if fragmentation is needed */ if (len > LINK_DATA_MTU) { /* fragmentation needed */ increment_g_dgram_tag(); dgram_size = htons(len); /* first fragment */ debug("first fragment... (len: %d, offset: %d)\n", len, dgram_offset); /* fragment heder */ frame_begin = buf_begin - sizeof(struct lowpan_frag_hdr); frag_hdr = (struct lowpan_frag_hdr *) frame_begin; frag_hdr->dgram_size = dgram_size; frag_hdr->dispatch |= DISPATCH_FIRST_FRAG; frag_hdr->dgram_tag = g_dgram_tag; /* align fragment length at an 8-byte multiple */ frag_len = LINK_DATA_MTU - sizeof(struct lowpan_frag_hdr); frag_len -= frag_len%8; frame_len = frag_len + sizeof(struct lowpan_frag_hdr); result = serial_output_am_payload(frame_begin, frame_len, &hw_addr, &hw_dst_addr); if (result < 0) { perror("serial_output_am_payload() failed\n"); return -1; } buf_begin += frag_len; len -= frag_len; dgram_offset += frag_len/8; /* in 8-byte multiples */ /* subseq fragment */ while (len > 0) { usleep(10000); /* workaround to prevent loosing fragments */ debug("subsequent fragment... (len: %d, offset: %d)\n", len, dgram_offset); /* dgram_offset */ frame_begin = buf_begin - sizeof(uint8_t); *(frame_begin) = dgram_offset; /* fragment heder */ frame_begin -= sizeof(struct lowpan_frag_hdr); frag_hdr = (struct lowpan_frag_hdr *) frame_begin; frag_hdr->dgram_size = dgram_size; frag_hdr->dispatch |= DISPATCH_SUBSEQ_FRAG; frag_hdr->dgram_tag = g_dgram_tag; if (len <= LINK_DATA_MTU - sizeof(struct lowpan_frag_hdr) - sizeof(uint8_t)) { /* * last fragment does not have to be aligned * at an 8-byte multiple */ frag_len = len; } else { /* align fragment length at an 8-byte multiple */ frag_len = LINK_DATA_MTU - sizeof(struct lowpan_frag_hdr) - sizeof(uint8_t); frag_len -= frag_len%8; } frame_len = frag_len + sizeof(struct lowpan_frag_hdr) + sizeof(uint8_t); result = serial_output_am_payload(frame_begin, frame_len, &hw_addr, &hw_dst_addr); if (result < 0) { perror("serial_output_am_payload() failed\n"); //return -1; } buf_begin += frag_len; len -= frag_len; dgram_offset += frag_len/8; /* in 8-byte multiples */ } return 1; } else { /* no need for fragmentation */ serial_output_am_payload(buf_begin, len, &hw_addr, &hw_dst_addr); return 1; } } /* ------------------------------------------------------------------------- */ /* handling of data arriving on the serial port */ /* * read data on serial port and send it to the tun interface * does fragment reassembly */ int serial_input() { int result = 0; void *ser_data; /* data read from serial port */ int ser_len; /* length of data read from serial port */ uint8_t *buf; int len; am_packet_t *AMpacket; struct hw_addr hw_src_addr; struct hw_addr hw_dst_addr; uint8_t *dispatch; struct lowpan_broadcast_hdr *bc_hdr; struct lowpan_frag_hdr *frag_hdr; uint16_t dgram_tag; uint16_t dgram_size; uint8_t dgram_offset; struct timeval tv; frag_info_t *p; frag_info_t **q; int last_frag; lowpan_pkt_t *pkt; printf("serial_input()\n"); /* read data from serial port */ ser_data = read_serial_packet(ser_src, &ser_len); /* process the packet we have received */ if (ser_len && ser_data) { printf("dumping data on serial port...\n"); dump_serial_packet(ser_data, ser_len); AMpacket = ser_data; /* copy 802.15.4 addresses */ // TODO: check if I got the byte ordering right hw_src_addr.type = HW_ADDR_SHORT; memcpy(hw_src_addr.addr_short, &AMpacket->src, sizeof(hw_src_addr.addr_short)); hw_dst_addr.type = HW_ADDR_SHORT; memcpy(hw_dst_addr.addr_short, &AMpacket->dst, sizeof(hw_dst_addr.addr_short)); /* --- 6lowpan optional headers --- */ buf = AMpacket->data; len = AMpacket->length; if (len != ser_len - 8) { fprintf(stderr, "warning: mismatch between AMpacket->length(%d)"\ " and ser_len - 8(%d)", AMpacket->length, ser_len - 8); } // TODO: check if length has a sensible value dispatch = AMpacket->data; /* Mesh Addressing header */ if ( (*dispatch & DISPATCH_MESH_MASK) == DISPATCH_MESH) { /* move over the dispatch field */ buf += sizeof(*dispatch); len -= sizeof(*dispatch); /* Hops Left */ if ((*dispatch & 0x0F) == 0) { goto discard_packet; } /* Final Destination Address */ if (*dispatch & DISPATCH_MESH_F_FLAG) { hw_dst_addr.type = HW_ADDR_LONG; memcpy(&hw_dst_addr.addr_long, buf, sizeof(hw_dst_addr.addr_long)); buf += sizeof(hw_dst_addr.addr_long); len -= sizeof(hw_dst_addr.addr_long); } else { hw_dst_addr.type = HW_ADDR_SHORT; memcpy(&hw_dst_addr.addr_short, buf, sizeof(hw_dst_addr.addr_short)); buf += sizeof(hw_dst_addr.addr_short); len -= sizeof(hw_dst_addr.addr_short); } /* check if we're the recipient */ if (cmp_hw_addr(&hw_dst_addr, &hw_addr) != 0 && !hw_addr_is_broadcat(&hw_dst_addr)) { // TODO: if mesh forwarding enabled, then forward goto discard_packet; } /* Originator Address */ if (*dispatch & DISPATCH_MESH_O_FLAG) { hw_src_addr.type = HW_ADDR_LONG; memcpy(&hw_src_addr.addr_long, buf, sizeof(hw_src_addr.addr_long)); buf += sizeof(hw_src_addr.addr_long); len -= sizeof(hw_src_addr.addr_long); } else { hw_src_addr.type = HW_ADDR_SHORT; memcpy(&hw_src_addr.addr_short, buf, sizeof(hw_src_addr.addr_short)); buf += sizeof(hw_src_addr.addr_short); len -= sizeof(hw_src_addr.addr_short); } dispatch = buf; } /* Broadcast header */ if (*dispatch == DISPATCH_BC0) { bc_hdr = (struct lowpan_broadcast_hdr *) buf; // do something usefull with bc_hdr->seq_no... buf += (sizeof(struct lowpan_broadcast_hdr)); len -= (sizeof(struct lowpan_broadcast_hdr)); dispatch = buf; } /* fragment header */ if ((*dispatch & DISPATCH_FRAG_MASK) == DISPATCH_FIRST_FRAG || (*dispatch & DISPATCH_FRAG_MASK) == DISPATCH_SUBSEQ_FRAG ) { frag_hdr = (struct lowpan_frag_hdr *) buf; buf += sizeof(struct lowpan_frag_hdr); len -= sizeof(struct lowpan_frag_hdr); /* collect information about the fragment */ dgram_tag = frag_hdr->dgram_tag; dgram_size = frag_hdr->dgram_size & htons(0x07FF); //dgram_size = frag_hdr->dgram_size8[1]; //dgram_size += ((uint16_t) (frag_hdr->dgram_size8[0] & 0x07)) << 8; if ((*dispatch & DISPATCH_FRAG_MASK) == DISPATCH_SUBSEQ_FRAG) { dgram_offset = *buf; buf += 1; len -= 1; } else { dgram_offset = 0; } debug("fragment reassembly: tag: 0x%04X, size: %d, offset: %d"\ "(*8=%d)\n", ntohs(dgram_tag), ntohs(dgram_size), dgram_offset, dgram_offset*8); pkt = find_fragment(&hw_src_addr, &hw_dst_addr, dgram_size, dgram_tag); if (pkt) { debug("found an existing reassembly buffer\n"); /* fragment reassembly buffer found */ /* check for overlap */ for (p = pkt->frag_list; p; p=p->next) { if (dgram_offset == p->offset && len == p->len) { /* duplicate - discard it */ result = 0; goto discard_packet; } else if ((dgram_offset == p->offset && len < p->len) || (dgram_offset > p->offset && dgram_offset < p->offset + p->len/8) ) { goto frag_overlap; } } /* no overlap found */ goto frag_reassemble; } else { debug("starting a new reassembly buffer\n"); /* fragment reassembly buffer not found - set up a new one */ pkt = malloc(sizeof(lowpan_pkt_t)); if (!pkt) { // no free slot for reassembling fragments fprintf(stderr, "out of memory - dropping a fragment\n"); result = -1; goto discard_packet; } pkt->next = fragments; fragments = pkt; clear_pkt(pkt); memcpy(&pkt->hw_src_addr, &hw_src_addr, sizeof(hw_src_addr)); memcpy(&pkt->hw_dst_addr, &hw_dst_addr, sizeof(hw_dst_addr)); pkt->dgram_tag = dgram_tag; pkt->dgram_size = dgram_size; gettimeofday(&tv, NULL); pkt->frag_timeout = tv.tv_sec + FRAG_TIMEOUT; goto frag_reassemble; } frag_overlap: /* overlap - discard previous frags * and restart freagment reassembly */ free_frag_list(pkt->frag_list); pkt->frag_list = NULL; /* not sure if we want to clear the whole buf */ //memset(&pkt->buf, 0, sizeof(pkt->buf)); gettimeofday(&tv, NULL); pkt->frag_timeout = tv.tv_sec + FRAG_TIMEOUT; goto frag_reassemble; frag_reassemble: /* copy buf data */ debug("dgram_offset: %d\n", dgram_offset); memcpy(pkt->buf_begin + dgram_offset*8, buf, len); //TODO: make sure a large len does not cause a buffer overflow /* update frag_info */ p = malloc(sizeof(frag_info_t)); if (!p) { fprintf(stderr, "out of memory - fragment "\ "reassembly failing\n"); } else { p->offset = dgram_offset; p->len = len; /* insert frag_info into the orderer list */ if (pkt->frag_list) { for(q = &(pkt->frag_list); (*q)->next; q=&((*q)->next)) { if (p->offset > (*q)->offset) { break; } } if ((*q)) { debug("inserting frag_info before offset %d\n", (*q)->offset); } else { debug("inserting frag_info at the beginning/end\n"); } p->next = *q; *q = p; } else { debug("inserting frag_info to the beginning " "of the list\n"); p->next = pkt->frag_list; pkt->frag_list = p; } } /* check if this is not the last fragment */ if (!dgram_offset) { /* the first fragment cannot be the last one */ last_frag = 0; } else { debug("checking last_frag...\n"); last_frag=1; dgram_offset = ntohs(dgram_size)/8; for(p=pkt->frag_list; p && dgram_offset; p=p->next) { debug("dgram_offset: %d, p->offset: %d, p->len: %d\n", dgram_offset, p->offset, p->len); if (p->offset + p->len/8 != dgram_offset) { debug("offset mismatch - not the last fragment\n"); last_frag = 0; break; } dgram_offset = p->offset; } } if (last_frag) { debug("last fragment, reassembly done\n"); pkt->len = ntohs(dgram_size); debug("dumping reassembled datagram...\n"); dump_serial_packet(pkt->buf_begin, pkt->len); /* pass up the complete packet */ result = serial_input_layer3(pkt->buf_begin, pkt->len, &hw_src_addr, &hw_dst_addr); /* deallocate pkt and all fragment info */ free_lowpan_pkt(pkt); } else { result = 0; } } else { /* no fragment header present */ result = serial_input_layer3(buf, len, &hw_src_addr, &hw_dst_addr); } } else { //printf("no data on serial port, but FD trigerred select\n"); } discard_packet: if (ser_data) { free(ser_data); } if (ser_data && ser_len > 0) { return 1; } else { return 0; } //return result; } int serial_input_layer3(uint8_t *buf, int len, const hw_addr_t *hw_src_addr, const hw_addr_t *hw_dst_addr) { uint8_t *dispatch = buf; //debug("%s()\n", __func__); //dump_serial_packet(buf, len); if (len <= 0) return 1; /* uncompressed IPv6 */ if (*dispatch == 0x41) { return serial_input_ipv6_uncompressed(buf+1, len-1, hw_src_addr, hw_dst_addr); } /* LOWPAN_HC1 compressed IPv6 */ else if (*dispatch == 0x42) { return serial_input_ipv6_compressed(buf+1, len-1, hw_src_addr, hw_dst_addr); } /* unknown dispatch value if we got here */ else { debug("unknown dispatch value: %X\n", *dispatch); return tun_write(tun_fd, (char*) buf+1, len-1); } } int serial_input_ipv6_uncompressed(uint8_t *buf, int len, const hw_addr_t *hw_src_addr, const hw_addr_t *hw_dst_addr) { debug("%s()\n", __func__); //dump_serial_packet(buf, len); // TODO: update neighbor table return tun_write(tun_fd, (char*) buf, len); } int serial_input_ipv6_compressed(uint8_t *buf, int len, const hw_addr_t *hw_src_addr, const hw_addr_t *hw_dst_addr) { int ret=0; int new_len; uint8_t *new_buf; debug("%s()\n", __func__); if (0 == lowpan_decompress(buf, len, hw_src_addr, hw_dst_addr, &new_buf, &new_len) ) { // TODO: update neighbor table buf = new_buf; len = new_len; ret = tun_write(tun_fd, (char*) buf, len); if (new_buf && new_len) { free(new_buf); } } return ret; } /* ------------------------------------------------------------------------- */ void timer_fired() { struct timeval tv; lowpan_pkt_t *p; lowpan_pkt_t **q; /* time out old fragments */ (void) gettimeofday(&tv, NULL); for(q = &fragments; *q; ) { if ((*q)->frag_timeout > tv.tv_sec) { p = (*q)->next; free(*q); *q = p; } else { q = &((*q)->next); } } // TODO: ND retransmission // TODO: neighbor table timeouts } /* shifts data between the serial port and the tun interface */ int serial_tunnel(serial_source ser_src, int tun_fd) { //int result; fd_set fs; while (1) { FD_ZERO (&fs); FD_SET (tun_fd, &fs); FD_SET (serial_source_fd(ser_src), &fs); select (tun_fd>serial_source_fd(ser_src)? tun_fd+1 : serial_source_fd(ser_src)+1, &fs, NULL, NULL, NULL); debug("--- select() fired ---\n"); /* data available on tunnel device */ if (FD_ISSET (tun_fd, &fs)) { //result = tun_input(); while( tun_input() ); } /* data available on serial port */ if (FD_ISSET (serial_source_fd(ser_src), &fs)) { /* more packets may be queued so process them all */ while (serial_input()); /* using serial_source_empty() seems to make select() * fire way too often, so the above solution is better */ //while(! serial_source_empty(ser_src)) { //result = serial_input(); //} } /* end of data available */ } /* end of while(1) */ return 0; } int main(int argc, char **argv) { char dev[16]; if (argc != 3) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(2); } hw_addr.type = HW_ADDR_SHORT; hw_addr.addr_short[0] = 0x00; // network byte order hw_addr.addr_short[1] = 0x12; /* create the tunnel device */ dev[0] = 0; tun_fd = tun_open(dev); if (tun_fd < 1) { printf("Could not create tunnel device. Fatal.\n"); return 1; } else { printf("Created tunnel device: %s\n", dev); } /* open the serial port */ ser_src = open_serial_source(argv[1], platform_baud_rate(argv[2]), 1, stderr_msg); /* 0 - blocking reads * 1 - non-blocking reads */ if (!ser_src) { debug("Couldn't open serial port at %s:%s\n", argv[1], argv[2]); exit(1); } /* set up the tun interface */ printf("\n"); ssystem("ifconfig tun0 up"); ssystem("ifconfig tun0 mtu 1280"); ssystem("ifconfig tun0 inet6 add 2001:0638:0709:1234::fffe:12/64"); ssystem("ifconfig tun0 inet6 add fe80::fffe:12/64"); printf("\n"); printf("try:\n\tsudo ping6 -s 0 2001:0638:0709:1234::fffe:14\n" "\tnc6 -u 2001:0638:0709:1234::fffe:14 1234\n\n"); /* start tunneling */ serial_tunnel(ser_src, tun_fd); /* clean up */ close_serial_source(ser_src); //close(ser_fd); tun_close(tun_fd, dev); return 0; } tinyos-2.1.2+dfsg/support/sdk/c/6lowpan/serial_tun/tun_dev.c000066400000000000000000000067731207233610700240600ustar00rootroot00000000000000/* * Copyright (c) 2007 Matus Harvan * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tun_dev.h" int tun_open(char *dev) { struct ifreq ifr; int fd; if ((fd = open("/dev/net/tun", O_RDWR | O_NONBLOCK)) < 0) return -1; memset(&ifr, 0, sizeof(ifr)); /* By default packets are tagged as IPv4. To tag them as IPv6, * thy need to be prefixed by struct tun_pi. */ //ifr.ifr_flags = IFF_TUN | IFF_NO_PI; ifr.ifr_flags = IFF_TUN; if (*dev) strncpy(ifr.ifr_name, dev, IFNAMSIZ); if (ioctl(fd, TUNSETIFF, (void *) &ifr) < 0) goto failed; strcpy(dev, ifr.ifr_name); return fd; failed: close(fd); return -1; } int tun_close(int fd, char *dev) { return close(fd); } /* Read/write frames from TUN device */ /* int tun_write(int fd, char *buf, int len) { return write(fd, buf, len); } int tun_read(int fd, char *buf, int len) { return read(fd, buf, len); } */ int tun_write(int fd, char *buf, int len) { int out; struct tun_pi pi = {0, htons(ETH_P_IPV6)}; char *nbuf = malloc(len+sizeof(struct tun_pi)); if (!nbuf) { fprintf(stderr, "tun_write: out of memory!"); return -1; } memcpy(nbuf, &pi, sizeof(struct tun_pi)); memcpy(nbuf+sizeof(struct tun_pi), buf, len); out = write(fd, nbuf, len+sizeof(struct tun_pi)); free(nbuf); return out; } int tun_read(int fd, char *buf, int len) { int out; char *nbuf = malloc(len+sizeof(struct tun_pi)); if (!nbuf) { fprintf(stderr, "tun_read: out of memory!"); return -1; } out=read(fd, nbuf, len+sizeof(struct tun_pi)); if (out > 0 && out >= sizeof(struct tun_pi)) { out-=sizeof(struct tun_pi); memcpy(buf, nbuf+sizeof(struct tun_pi), out); free(nbuf); return out; } else { free(nbuf); return -1; } } tinyos-2.1.2+dfsg/support/sdk/c/6lowpan/serial_tun/tun_dev.h000066400000000000000000000033331207233610700240520ustar00rootroot00000000000000/* * Copyright (c) 2007 Matus Harvan * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _TUN_DEV_H #define _TUN_DEV_H int tun_open(char *dev); int tun_close(int fd, char *dev); int tun_write(int fd, char *buf, int len); int tun_read(int fd, char *buf, int len); #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/000077500000000000000000000000001207233610700174265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/blip/Makefile.am000066400000000000000000000000301207233610700214530ustar00rootroot00000000000000 SUBDIRS = lib6lowpan tinyos-2.1.2+dfsg/support/sdk/c/blip/bootstrap.sh000077500000000000000000000000401207233610700217740ustar00rootroot00000000000000#!/bin/sh autoreconf --install tinyos-2.1.2+dfsg/support/sdk/c/blip/configure.ac000066400000000000000000000067451207233610700217300ustar00rootroot00000000000000AC_INIT([blip], [2.1], [stevedh@eecs.berkeley.edu]) AC_CANONICAL_SYSTEM echo $ac_n "building for architecture""... $ac_c" 1>&6 case "$target" in *linux*) AC_MSG_RESULT(linux) arch=linux ;; *darwin*) AC_MSG_RESULT(darwin) arch=darwin dnl exit if tun isn't installed AC_MSG_CHECKING(for tun device) if test -c /dev/tun0; then AC_MSG_RESULT(yes) else AC_MSG_ERROR([ERROR: /dev/tun0 not found. You probably need to install the tuntap kernel extension from http://tuntaposx.sourceforge.net/]) fi ;; *) AC_MSG_RESULT(unknown) AC_MSG_ERROR([currently only Linux and OSX are supported]) ;; esac dnl AC_DEFINE([PLATFORM], [${arch}]) dnl check programs AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AC_PROG_RANLIB AC_PROG_CC AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([ Makefile lib6lowpan/Makefile lib6lowpan/trace/Makefile ]) dnl driver/Makefile dnl check various platform include files AC_CHECK_HEADERS([stdint.h inttypes.h]) AC_CHECK_HEADERS([netinet/in.h ]) AC_CHECK_HEADERS([linux/if_tun.h]) AC_CHECK_HEADERS([arpa/inet.h]) AC_CHECK_HEADERS([sys/socket.h net/route.h net/if.h], [], [], [[#if HAVE_SYS_SOCKET_H #include #endif #if HAVE_NET_ROUTE_H #include #endif]]) AC_MSG_CHECKING(whether struct in6_addr has u6_addrXX and defines s6_addrXX) AC_TRY_COMPILE([#include ], [static struct in6_addr in6_u; int u = in6_u.s6_addr16;], [AC_MSG_RESULT(yes); AC_DEFINE([HAVE_IN6_ADDR_S6_ADDR], 1, [whether struct in6_addr has u6_addrXX and defines s6_addrXX])], AC_MSG_RESULT(no)) AC_MSG_CHECKING(for SIOCADDRT) AC_TRY_COMPILE([#include ], [int x = SIOCADDRT;], [AC_MSG_RESULT(yes); AC_DEFINE([HAVE_SIOCADDRT], 1, [weather the SIOCADDRT ioctl is defined])], AC_MSG_RESULT(no)) dnl sockoption for joining an ipv6 group AC_MSG_CHECKING(if IPV6_JOIN_GROUP is defined) AC_TRY_COMPILE([#include ], [int x = IPV6_JOIN_GROUP;], [AC_MSG_RESULT(yes); AC_DEFINE([HAVE_IPV6_JOIN_GROUP], 1, [weather IPV6_JOIN_GROUP is defined])], AC_MSG_RESULT(no)) AC_MSG_CHECKING(if IPV6_ADD_MEMBERSHIP is defined) AC_TRY_COMPILE([#include ], [int x = IPV6_ADD_MEMBERSHIP;], [AC_MSG_RESULT(yes); AC_DEFINE([HAVE_IPV6_ADD_MEMBERSHIP], 1, [weather IPV6_ADD_MEMBERSHIP is defined])], AC_MSG_RESULT(no)) dnl if htons requires -lc dnl AC_MSG_CHECKING(if htons requires -lc) dnl AC_TRY_COMPILE([#include ], [int x = htons(10);], dnl [AC_MSG_RESULT(no)], dnl [AC_MSG_RESULT(yes); LDFLAGS+=-lc]) dnl Check where to put the pidfile AC_MSG_CHECKING(where to put seqno file) AC_ARG_WITH(seqfile, [AC_HELP_STRING([--with-seqfile], [Path to the radvd pidfile (/var/run/ip-driver.seq)])], PATH_BLIP_SEQFILE=$withval, PATH_BLIP_SEQFILE=/var/run/ip-driver.seq) AC_MSG_RESULT($PATH_BLIP_SEQFILE) AC_SUBST(PATH_BLIP_SEQFILE) AC_ARG_ENABLE([lpl], [AS_HELP_STRING([--enable-lpl], [assume LPL is in use])], AC_DEFINE([BLIP_L2_RETRIES], [1], [Number of link-layer retransmissions]) []) AC_LINK_FILES(linux/tun_dev_${arch}.c, linux/tun_dev.c) dnl AC_LINK_FILES(driver/routing-${arch}.c, driver/routing-platform.c) dnl AC_LINK_FILES(driver/netlink-${arch}.c, driver/netlink.c) dnl AC_CONFIG_SUBDIRS([driver/radvd-1.0]) AC_OUTPUT tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/000077500000000000000000000000001207233610700215035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/6lowpan.h000066400000000000000000000074451207233610700232540ustar00rootroot00000000000000/* * "Copyright (c) 2008,2010 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ /* * Header file for the 6lowpan/IPv6 stack. * * @author Stephen Dawson-Haggerty * */ #ifndef __6LOWPAN_H__ #define __6LOWPAN_H__ /* * lengths of different lowpan headers */ enum { LOWMSG_MESH_LEN = 5, LOWMSG_BCAST_LEN = 2, LOWMSG_FRAG1_LEN = 4, LOWMSG_FRAGN_LEN = 5, }; enum { INET_MTU = 1280, LIB6LOWPAN_MAX_LEN = 100, LOWPAN_LINK_MTU = 109, /* * The time, in binary milliseconds, after which we stop waiting for * fragments and report a failed receive. We */ FRAG_EXPIRE_TIME = 4096, }; /* * magic numbers from rfc4944; some of them shifted: mostly dispatch values. */ enum { LOWPAN_NALP_PATTERN = 0x0, LOWPAN_MESH_PATTERN = 0x2, LOWPAN_FRAG1_PATTERN = 0x18, LOWPAN_FRAGN_PATTERN = 0x1c, LOWPAN_BCAST_PATTERN = 0x50, LOWPAN_IPV6_PATTERN = 0x41, }; enum { LOWPAN_MESH_V_MASK = 0x20, LOWPAN_MESH_F_MASK = 0x10, LOWPAN_MESH_HOPS_MASK = 0x0f, }; /* * values for LOWPAN_IPHC from draft-ietf-6lowpan-hc-06 */ enum { LOWPAN_DISPATCH_BYTE_MASK = 0xe0, LOWPAN_DISPATCH_BYTE_VAL = 0x60, LOWPAN_IPHC_TF_MASK = 0x18, LOWPAN_IPHC_TF_NONE = 0x18, LOWPAN_IPHC_TF_ECN_DSCP = 0x10, LOWPAN_IPHC_TF_ECN_FL = 0x08, LOWPAN_IPHC_TF_ECN_DSCP_FL = 0x00, LOWPAN_IPHC_NH_MASK = 0x04, LOWPAN_IPHC_NH_INLINE = 0, LOWPAN_IPHC_HLIM_MASK = 0x03, LOWPAN_IPHC_HLIM_NONE = 0x00, LOWPAN_IPHC_HLIM_1 = 0x01, LOWPAN_IPHC_HLIM_64 = 0x02, LOWPAN_IPHC_HLIM_255 = 0x03, LOWPAN_IPHC_CID_MASK = 0x80, LOWPAN_IPHC_CID_PRESENT = 0x80, LOWPAN_IPHC_SAM_SHIFT = 4, LOWPAN_IPHC_M = 0x08, LOWPAN_IPHC_DAM_SHIFT = 0, LOWPAN_IPHC_AC_CONTEXT = 0x04, LOWPAN_IPHC_AM_MASK = 0x3, LOWPAN_IPHC_AM_128 = 0x0, LOWPAN_IPHC_AM_64 = 0x1, LOWPAN_IPHC_AM_16 = 0x2, LOWPAN_IPHC_AM_0 = 0x3, LOWPAN_IPHC_AM_M = 0x08, LOWPAN_IPHC_AM_M_128 = 0x0, LOWPAN_IPHC_AM_M_48 = 0x1, LOWPAN_IPHC_AM_M_32 = 0x2, LOWPAN_IPHC_AM_M_8 = 0x3, }; /* * values for LOWPAN_IPNH from draft-ietf-6lowpan-hc-06 */ enum { LOWPAN_NHC_IPV6_MASK = 0xf0, LOWPAN_NHC_IPV6_PATTERN = 0xe0, LOWPAN_NHC_EID_SHIFT = 0x1, LOWPAN_NHC_EID_MASK = 0xe, LOWPAN_NHC_EID_HOP = 0x0 << LOWPAN_NHC_EID_SHIFT, LOWPAN_NHC_EID_ROUTING = 0x1 << LOWPAN_NHC_EID_SHIFT, LOWPAN_NHC_EID_FRAG = 0x2 << LOWPAN_NHC_EID_SHIFT, LOWPAN_NHC_EID_DEST = 0x3 << LOWPAN_NHC_EID_SHIFT, LOWPAN_NHC_EID_MOBILE = 0x4 << LOWPAN_NHC_EID_SHIFT, LOWPAN_NHC_EID_IPV6 = 0x7 << LOWPAN_NHC_EID_SHIFT, LOWPAN_NHC_NH = 0x1, LOWPAN_NHC_UDP_MASK = 0xf8, LOWPAN_NHC_UDP_PATTERN = 0xf0, LOWPAN_NHC_UDP_CKSUM = 0x4, LOWPAN_NHC_UDP_PORT_MASK = 0x3, LOWPAN_NHC_UDP_PORT_FULL = 0x0, LOWPAN_NHC_UDP_PORT_SRC_FULL = 0x1, LOWPAN_NHC_UDP_PORT_DST_FULL = 0x2, LOWPAN_NHC_UDP_PORT_SHORT = 0x3, }; #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/Makefile.am000066400000000000000000000006711207233610700235430ustar00rootroot00000000000000 SUBDIRS = . trace tests AM_CFLAGS = -DPC -I../../../../../tos/types -DHAVE_LOWPAN_EXTERN_MATCH_CONTEXT noinst_LIBRARIES = lib6lowpan.a noinst_lib6lowpandir = $(includedir)/lib6lowpan-2.2.0 noinst_lib6lowpan_HEADERS = 6lowpan.h in_cksum.h \ ip.h ip_malloc.h lib6lowpan.h nwbyte.h lib6lowpan_a_SOURCES = lib6lowpan.c lib6lowpan_4944.c lib6lowpan_frag.c \ iovec.c utility.c in_cksum.c ieee154_header.c ip_malloc.c $(lib6lowpan_HEADERS) tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/blip-pc-includes.h000066400000000000000000000017541207233610700250150ustar00rootroot00000000000000#ifndef _BLIP_PC_INCLUDES_H_ #define _BLIP_PC_INCLUDES_H_ #include #include #include #if HAVE_CONFIG_H #include "config.h" #endif #if HAVE_STDINT_H # include #else # if HAVE_INTTYPES_H # include # else # error "no int types found!" #endif #endif // int types #if HAVE_LINUX_IF_TUN_H # include #else // # error "TUN device not supported on this platform" struct tun_pi { uint32_t af; }; #endif #if HAVE_NET_IF_H // OSX prerequisites #if HAVE_SYS_SOCKET_H #include #endif #if HAVE_NET_ROUTE_H #include #endif # include // for IFNAMSIZ #else # error "no IFNAMSIZE defined" #endif #if HAVE_NETINET_IN_H # include #if ! HAVE_IN6_ADDR_S6_ADDR # define s6_addr16 __u6_addr.__u6_addr16 # endif #else # error "no netinet/in.h" #endif #if HAVE_ARPA_INET_H # include # include "nwbyte.h" #else # error "no htons routines!" #endif #include #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/blip-tinyos-includes.h000066400000000000000000000002061207233610700257270ustar00rootroot00000000000000#ifndef _BLIP_TINYOS_INCLUDES_H #define _BLIP_TINYOS_INCLUDES_H #include #include #include "nwbyte.h" #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/ieee154_header.c000066400000000000000000000045661207233610700243330ustar00rootroot00000000000000 #include "lib6lowpan-includes.h" #include "internal.h" #define COPY_IEEE154_ADDR(FIELD) \ if (frame-> FIELD .ieee_mode == IEEE154_ADDR_SHORT) { \ uint16_t tmpval = (frame-> FIELD . i_saddr); \ memcpy(buf, &tmpval, 2); \ buf += 2; \ } else { \ memcpy(buf, &(frame-> FIELD .i_laddr), 8); \ buf += 8; \ } uint8_t *pack_ieee154_header(uint8_t *buf, size_t cnt, struct ieee154_frame_addr *frame) { uint8_t *ieee_hdr = buf; uint16_t fcf; // struct ieee154_header_base *ieee_hdr = (struct ieee154_header_base *)buf; /* fill in the following 802.15.4 fields: */ /* length: will be set once we know how long the data is */ /* fcf: (set frame time, addressing modes) */ /* destpan: set to address in frame */ /* source and destination addresses */ buf = buf + IEEE154_MIN_HDR_SZ; COPY_IEEE154_ADDR(ieee_dst); COPY_IEEE154_ADDR(ieee_src); fcf = (IEEE154_TYPE_DATA << IEEE154_FCF_FRAME_TYPE); fcf |= (frame->ieee_src.ieee_mode << IEEE154_FCF_SRC_ADDR_MODE); fcf |= (frame->ieee_dst.ieee_mode << IEEE154_FCF_DEST_ADDR_MODE); fcf |= (1 << IEEE154_FCF_INTRAPAN); ieee_hdr[1] = (fcf & 0xff); ieee_hdr[2] = (fcf >> 8); ieee_hdr[4] = frame->ieee_dstpan & 0xff; ieee_hdr[5] = frame->ieee_dstpan >> 8; return buf; } uint8_t *unpack_ieee154_hdr(uint8_t *buf, struct ieee154_frame_addr *frame) { uint16_t fcf = ((uint16_t)buf[2] << 8) | buf[1]; frame->ieee_dstpan = htole16(((uint16_t)buf[5] << 8) | buf[4]); frame->ieee_src.ieee_mode = (fcf >> IEEE154_FCF_SRC_ADDR_MODE) & 0x3; frame->ieee_dst.ieee_mode = (fcf >> IEEE154_FCF_DEST_ADDR_MODE) & 0x3; buf += IEEE154_MIN_HDR_SZ; if (frame->ieee_dst.ieee_mode == IEEE154_ADDR_SHORT) { memcpy(&frame->ieee_dst.i_saddr, buf, 2); buf += 2; } else if (frame->ieee_dst.ieee_mode == IEEE154_ADDR_EXT) { memcpy(&frame->ieee_dst.i_laddr, buf, 8); buf += 8; } if (frame->ieee_src.ieee_mode == IEEE154_ADDR_SHORT) { memcpy(&frame->ieee_src.i_saddr, buf, 2); buf += 2; } else if (frame->ieee_src.ieee_mode == IEEE154_ADDR_EXT) { memcpy(&frame->ieee_src.i_laddr, buf, 8); buf += 8; } return buf; } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/ieee154_header.h000066400000000000000000000003451207233610700243270ustar00rootroot00000000000000#ifndef _IEEE154_HEADER_H #define _IEEE154_HEADER_H uint8_t *pack_ieee154_header(uint8_t *buf, size_t cnt, struct ieee154_frame_addr *frame) ; uint8_t *unpack_ieee154_hdr(uint8_t *buf, struct ieee154_frame_addr *frame); #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/in_cksum.c000066400000000000000000000147651207233610700234740ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ /* in_cksum.c * 4.4-Lite-2 Internet checksum routine, modified to take a vector of * pointers/lengths giving the pieces to be checksummed. * * $Id: in_cksum.c,v 1.3 2009/08/20 17:03:05 sdhsdh Exp $ */ /* * Copyright (c) 1988, 1992, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)in_cksum.c 8.1 (Berkeley) 6/10/93 */ #include #include "in_cksum.h" #include "lib6lowpan.h" #include "nwbyte.h" #define ADDCARRY(x) (x > 65535 ? x -= 65535 : x) #define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);} int in_cksum(const struct ip_iovec *vec) { #if 1 /* This will break horribly if the length of any but the last ip_iovec is odd! */ uint32_t sum = 0; uint16_t cur = 0; int i; uint8_t *w; for (; vec != NULL; vec = vec->iov_next) { if (vec->iov_len == 0) continue; w = vec->iov_base; for (i = 0; i < vec->iov_len; i++) { if (i % 2 == 0) { cur |= ((uint16_t)w[i]) << 8; if (i + 1 == vec->iov_len) { goto finish; } } else { cur |= w[i]; finish: sum += cur; cur = 0; } } } while (sum > 0xffff) { sum = (sum & 0xffff) + (sum >> 16); } return ~((uint16_t)sum); #else register const uint16_t *w; register uint32_t sum = 0; register uint32_t mlen = 0; int byte_swapped = 0; union { uint8_t c[2]; uint16_t s; } s_util; union { uint16_t s[2]; uint32_t l; } l_util; for (; vec != NULL; vec = vec->iov_next) { if (vec->iov_len == 0) continue; w = (const uint16_t *)vec->iov_base; if (mlen == -1) { /* * The first byte of this chunk is the continuation * of a word spanning between this chunk and the * last chunk. * * s_util.c[0] is already saved when scanning previous * chunk. */ s_util.c[1] = *(const uint8_t *)w; sum += s_util.s; w = (const uint16_t *)((const uint8_t *)w + 1); mlen = vec->iov_len - 1; } else mlen = vec->iov_len; /* * Force to even boundary. */ if ((1 & (int) w) && (mlen > 0)) { REDUCE; sum <<= 8; s_util.c[0] = *(const uint8_t *)w; w = (const uint16_t *)((const uint8_t *)w + 1); mlen--; byte_swapped = 1; } /* * Unroll the loop to make overhead from * branches &c small. */ while ((mlen -= 32) >= 0) { sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11]; sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15]; w += 16; } mlen += 32; while ((mlen -= 8) >= 0) { sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; w += 4; } mlen += 8; if (mlen == 0 && byte_swapped == 0) continue; REDUCE; while ((mlen -= 2) >= 0) { sum += *w++; } if (byte_swapped) { REDUCE; sum <<= 8; byte_swapped = 0; if (mlen == -1) { s_util.c[1] = *(const uint8_t *)w; sum += s_util.s; mlen = 0; } else mlen = -1; } else if (mlen == -1) s_util.c[0] = *(const uint8_t *)w; } if (mlen == -1) { /* The last mbuf has odd # of bytes. Follow the standard (the odd byte may be shifted left by 8 bits or not as determined by endian-ness of the machine) */ s_util.c[1] = 0; sum += s_util.s; } REDUCE; return (~sum & 0xffff); #endif } /* SDH : Added to allow for friendly message checksumming */ uint16_t msg_cksum(const struct ip6_hdr *iph, struct ip_iovec *data, uint8_t nxt_hdr) { struct ip_iovec cksum_vec[3]; uint32_t hdr[2]; cksum_vec[0].iov_base = (uint8_t *)(iph->ip6_src.s6_addr); cksum_vec[0].iov_len = 16; cksum_vec[0].iov_next = &cksum_vec[1]; cksum_vec[1].iov_base = (uint8_t *)(iph->ip6_dst.s6_addr); cksum_vec[1].iov_len = 16; cksum_vec[1].iov_next = &cksum_vec[2]; cksum_vec[2].iov_base = (uint8_t *)hdr; cksum_vec[2].iov_len = 8; cksum_vec[2].iov_next = data; hdr[0] = htonl(iov_len(data)); hdr[1] = htonl(nxt_hdr); return in_cksum(cksum_vec); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/in_cksum.h000066400000000000000000000027251207233610700234720ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #ifndef _IN_CKSUM_H_ #define _IN_CKSUM_H_ /* in_cksum.h * Declaration of Internet checksum routine. * * $Id: in_cksum.h,v 1.1 2009/08/20 17:03:05 sdhsdh Exp $ */ #include #include "iovec.h" #include "ip.h" int in_cksum(const struct ip_iovec *vec); uint16_t msg_cksum(const struct ip6_hdr *iph, struct ip_iovec *data, uint8_t nxt_hdr); #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/internal.h000066400000000000000000000044231207233610700234730ustar00rootroot00000000000000#ifndef _INTERNAL_H #define _INTERNAL_H #include #include "lib6lowpan-includes.h" #include "lib6lowpan.h" #include "ip.h" #include "Ieee154.h" /* Internal function prototypes for unit testing * this way gcc can check against the right prototype. */ /* packing */ int bit_range_zero_p(uint8_t *buf, int start, int end); inline uint8_t *pack_tcfl(uint8_t *buf, struct ip6_hdr *hdr, uint8_t *dispatch); inline uint8_t *pack_nh(uint8_t *buf, struct ip6_hdr *hdr, uint8_t *dispatch); inline uint8_t *pack_hlim(uint8_t *buf, struct ip6_hdr *hdr, uint8_t *dispatch); uint8_t *pack_address(uint8_t *buf, struct in6_addr *addr, int context_match_len, ieee154_addr_t *l2addr, ieee154_panid_t pan, uint8_t *flags); uint8_t *pack_multicast(uint8_t *buf, struct in6_addr *addr, uint8_t *flags); int pack_udp(uint8_t *buf, size_t cnt, struct ip6_packet *packet, int offset); int pack_ipnh(uint8_t *dest, size_t cnt, uint8_t *type, struct ip6_packet *packet, int offset); int pack_nhc_chain(uint8_t **dest, size_t cnt, struct ip6_packet *packet); uint8_t *pack_ieee154_header(uint8_t *buf, size_t cnt, struct ieee154_frame_addr *frame); uint8_t * lowpan_pack_headers(struct ip6_packet *packet, struct ieee154_frame_addr *frame, uint8_t *buf, size_t cnt); /* unpacking */ uint8_t *unpack_ieee154_hdr(uint8_t *buf, struct ieee154_frame_addr *frame); uint8_t *unpack_tcfl(struct ip6_hdr *hdr, uint8_t dispatch, uint8_t *buf); uint8_t *unpack_nh(struct ip6_hdr *hdr, uint8_t dispatch, uint8_t *buf); uint8_t *unpack_hlim(struct ip6_hdr *hdr, uint8_t dispatch, uint8_t *buf); uint8_t *unpack_address(struct in6_addr *addr, uint8_t dispatch, int context, uint8_t *buf, ieee154_addr_t *frame, ieee154_panid_t pan); uint8_t *unpack_multicast(struct in6_addr *addr, uint8_t dispatch, int context, uint8_t *buf); uint8_t *unpack_udp(uint8_t *dest, uint8_t *nxt_hdr, uint8_t *buf); uint8_t *unpack_ipnh(uint8_t *dest, size_t cnt, uint8_t *nxt_hdr, uint8_t *buf); uint8_t *unpack_nhc_chain(struct lowpan_reconstruct *recon, uint8_t **dest, size_t cnt, uint8_t *nxt_hdr, uint8_t *buf); #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/iovec.c000066400000000000000000000034611207233610700227600ustar00rootroot00000000000000#include #include #include "lib6lowpan.h" #include "iovec.h" #define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) /** * read len bytes starting at offset into the buffer pointed to by buf * * */ int iov_read(struct ip_iovec *iov, int offset, int len, uint8_t *buf) { int cur_offset = 0, written = 0; // printf("iov_read iov: %p offset: %i len: %i buf: %p\n", iov, offset, len, buf); while (iov != NULL && cur_offset + iov->iov_len <= offset) { cur_offset += iov->iov_len; iov = iov->iov_next; } if (!iov) goto done; while (len > 0) { int start, len_here; start = offset - cur_offset; len_here = MIN(iov->iov_len - start, len); // copy memcpy(buf, iov->iov_base + start, len_here); // printf("iov_read: %i/%i\n", len_here, len); cur_offset += start + len_here; offset += len_here; written += len_here; len -= len_here; buf += len_here; iov = iov->iov_next; if (!iov) { goto done; } } done: return written; } int iov_len(struct ip_iovec *iov) { int rv = 0; while (iov) { rv += iov->iov_len; iov = iov->iov_next; } return rv; } void iov_prefix(struct ip_iovec *iov, struct ip_iovec *new, uint8_t *buf, size_t len) { new->iov_base = buf; new->iov_len = len; new->iov_next = iov; } int iov_update(struct ip_iovec *iov, int offset, int len, uint8_t *buf) { int written = 0; /* advance to the first block where we could write */ while (offset >= iov->iov_len) { offset -= iov->iov_len; iov = iov->iov_next; } while (iov != NULL && written < len) { int writelen = MIN(iov->iov_len - offset, len); memcpy(iov->iov_base + offset, buf, writelen); buf += writelen; len -= writelen; offset = 0; iov = iov->iov_next; } return written; } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/iovec.h000066400000000000000000000007641207233610700227700ustar00rootroot00000000000000#ifndef IOVEC_H_ #define IOVEC_H_ #include #include struct ip_iovec { uint8_t *iov_base; size_t iov_len; struct ip_iovec *iov_next; }; int iov_read(struct ip_iovec *iov, int offset, int len, uint8_t *buf); int iov_len(struct ip_iovec *iov); void iov_prefix(struct ip_iovec *iov, struct ip_iovec *new_iov, uint8_t *buf, size_t len); int iov_update(struct ip_iovec *iov, int offset, int len, uint8_t *buf); void iov_print(struct ip_iovec *iov); #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/ip.h000066400000000000000000000160121207233610700222640ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #ifndef _IP_H_ #define _IP_H_ #include #include "lib6lowpan-includes.h" /* * define message structures for internet communication * */ // HAVE_NETINET_IN_H ifdef removed since it is getting defined in libcoap // and breaks CoAPBlip // only needed for blip1.0 and ip-driver, because those were run on the // host computer #if ! PC // update to use netinet/in definition of an IPv6 address; this is a // lot more elegent. struct in6_addr { union { uint8_t u6_addr8[16]; uint16_t u6_addr16[8]; uint32_t u6_addr32[4]; } in6_u; #define s6_addr in6_u.u6_addr8 #define s6_addr16 in6_u.u6_addr16 #define s6_addr32 in6_u.u6_addr32 }; struct sockaddr_in6 { uint16_t sin6_port; struct in6_addr sin6_addr; }; #else #include #endif /* * Definition for internet protocol version 6. * RFC 2460 * @(#)ip.h 8.1 (Berkeley) 6/10/93 */ struct ip6_hdr { union { struct ip6_hdrctl { uint32_t ip6_un1_flow; /* 20 bits of flow-ID */ uint16_t ip6_un1_plen; /* payload length */ uint8_t ip6_un1_nxt; /* next header */ uint8_t ip6_un1_hlim; /* hop limit */ } ip6_un1; uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits class */ } ip6_ctlun; struct in6_addr ip6_src; /* source address */ struct in6_addr ip6_dst; /* destination address */ } __attribute__((packed)); #define ip6_vfc ip6_ctlun.ip6_un2_vfc #define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow #define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen #define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt #define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim #define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim #define IPV6_VERSION 0x60 #define IPV6_VERSION_MASK 0xf0 #if BYTE_ORDER == BIG_ENDIAN #define IPV6_FLOWINFO_MASK 0x0fffffff /* flow info (28 bits) */ #define IPV6_FLOWLABEL_MASK 0x000fffff /* flow label (20 bits) */ #else #if BYTE_ORDER == LITTLE_ENDIAN #define IPV6_FLOWINFO_MASK 0xffffff0f /* flow info (28 bits) */ #define IPV6_FLOWLABEL_MASK 0xffff0f00 /* flow label (20 bits) */ #endif /* LITTLE_ENDIAN */ #endif #if 1 /* ECN bits proposed by Sally Floyd */ #define IP6TOS_CE 0x01 /* congestion experienced */ #define IP6TOS_ECT 0x02 /* ECN-capable transport */ #endif /* * Extension Headers */ struct ip6_ext { uint8_t ip6e_nxt; uint8_t ip6e_len; }; struct tlv_hdr { uint8_t type; uint8_t len; }; /* * IP protocol numbers */ enum { IANA_ICMP = 58, IANA_UDP = 17, IANA_TCP = 6, // IPV6 defined extention header types. All other next header // values are supposed to be transport protocols, with TLVs used IPV6_HOP = 0, IPV6_IPV6 = 41, IPV6_ROUTING = 43, IPV6_FRAG = 44, IPV6_AUTH = 51, IPV6_SEC = 50, IPV6_NONEXT = 59, IPV6_DEST = 60, IPV6_MOBILITY = 135, IPV6_TLV_PAD1 = 0, IPV6_TLV_PADN = 1, }; #define EXTENSION_HEADER(X) ((X) == IPV6_HOP || (X) == IPV6_ROUTING || (X) == IPV6_DEST) #define COMPRESSIBLE_TRANSPORT(X) ((X) == IANA_UDP) /* interface id */ struct in6_iid { uint8_t data[8]; }; /* * icmp */ struct icmp6_hdr { uint8_t type; /* type field */ uint8_t code; /* code field */ uint16_t cksum; /* checksum field */ }; enum { ICMP_TYPE_ECHO_DEST_UNREACH = 1, ICMP_TYPE_ECHO_PKT_TOO_BIG = 2, ICMP_TYPE_ECHO_TIME_EXCEEDED = 3, ICMP_TYPE_ECHO_PARAM_PROBLEM = 4, ICMP_TYPE_ECHO_REQUEST = 128, ICMP_TYPE_ECHO_REPLY = 129, ICMP_TYPE_ROUTER_SOL = 133, ICMP_TYPE_ROUTER_ADV = 134, ICMP_TYPE_NEIGHBOR_SOL = 135, ICMP_TYPE_NEIGHBOR_ADV = 136, ICMP_TYPE_RPL_CONTROL = 155, ICMP_NEIGHBOR_HOPLIMIT = 255, ICMP_CODE_HOPLIMIT_EXCEEDED = 0, ICMP_CODE_ASSEMBLY_EXCEEDED = 1, }; /* * UDP protocol header. */ struct udp_hdr { uint16_t srcport; /* source port */ uint16_t dstport; /* destination port */ uint16_t len; /* udp length */ uint16_t chksum; /* udp checksum */ }; /* * TCP transport headers and flags */ enum { TCP_FLAG_FIN = 0x1, TCP_FLAG_SYN = 0x2, TCP_FLAG_RST = 0x4, TCP_FLAG_PSH = 0x8, TCP_FLAG_ACK = 0x10, TCP_FLAG_URG = 0x20, TCP_FLAG_ECE = 0x40, TCP_FLAG_CWR = 0x80, }; struct tcp_hdr { uint16_t srcport; uint16_t dstport; uint32_t seqno; uint32_t ackno; uint8_t offset; uint8_t flags; uint16_t window; uint16_t chksum; uint16_t urgent; }; /* * IP metadata and routing structures * * The metadata contains L2 information that upper layers may be * interested in for one reason or another. */ struct ip6_metadata { ieee154_addr_t sender; // platforms commonly provide one or both of these indicators uint8_t lqi; uint8_t rssi; }; /* * These are data structures to hold IP messages. We used a linked * list of headers so that we can easily add extra headers with no * copy; similar to the linux iovec's or BSD mbuf structs. * Every split_ip_msg contains a full IPv6 header (40 bytes), but it * is placed at the end of the struct so that we can read() a message * straight into one of these structs, and then just set up the header * chain. * * Due to the way fragmentation is currently implemented, the total * length of the data referenced from this chain must not be longer * then what can fit into a single fragment. This is a limitation of * the current fragmentation code, but is perfectly usable in most * cases. */ struct ip6_packet { int ip6_inputif; struct ip_iovec *ip6_data; struct ip6_hdr ip6_hdr; }; #define IP6PKT_TRANSPORT 0xff #ifndef NO_LIB6LOWPAN_ASCII /* * parse a string representation of an IPv6 address */ void inet_pton6(char *addr, struct in6_addr *dest); int inet_ntop6(struct in6_addr *addr, char *buf, int cnt); #endif #define POINTER_DIFF(AP, BP) (((char *)AP) - ((char *)BP)) #define POINTER_SUM(AP, B) (((char *)AP) + (B)) #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/ip_malloc.c000066400000000000000000000071751207233610700236200ustar00rootroot00000000000000/* * "Copyright (c) 2008, 2009 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #ifndef NO_IP_MALLOC #include #include #include "ip_malloc.h" uint8_t heap[IP_MALLOC_HEAP_SIZE]; void ip_malloc_init() { bndrt_t *b = (bndrt_t *)heap; *b = IP_MALLOC_HEAP_SIZE & IP_MALLOC_LEN; } void *ip_malloc(uint16_t sz) { bndrt_t *cur = (bndrt_t *)heap; sz += sizeof(bndrt_t) * 2; sz += (sz % IP_MALLOC_ALIGN); while (((*cur & IP_MALLOC_LEN) < sz || (*cur & IP_MALLOC_INUSE) != 0) && (uint8_t *)cur - heap < IP_MALLOC_HEAP_SIZE) { cur = (bndrt_t *)(((uint8_t *)cur) + ((*cur) & IP_MALLOC_LEN)); } if ((uint8_t *)cur < heap + IP_MALLOC_HEAP_SIZE) { uint16_t oldsize = *cur & IP_MALLOC_LEN; bndrt_t *next; sz -= sizeof(bndrt_t); next = ((bndrt_t *)(((uint8_t *)cur) + sz)); *cur = (sz & IP_MALLOC_LEN) | IP_MALLOC_INUSE; *next = (oldsize - sz) & IP_MALLOC_LEN; return cur + 1; } else return NULL; } void ip_free(void *ptr) { bndrt_t *prev = NULL, *cur, *next = NULL; cur = (bndrt_t *)heap; while (cur + 1 != ptr && (uint8_t *)cur - heap < IP_MALLOC_HEAP_SIZE) { prev = cur; cur = (bndrt_t *)(((uint8_t *)cur) + ((*cur) & IP_MALLOC_LEN)); } if (cur + 1 == ptr) { next = (bndrt_t *)((*cur & IP_MALLOC_LEN) + ((uint8_t *)cur)); *cur &= ~IP_MALLOC_INUSE; if ((((uint8_t *)next) - heap) < IP_MALLOC_HEAP_SIZE && (*next & IP_MALLOC_INUSE) == 0) { *cur = (*cur & IP_MALLOC_LEN) + (*next & IP_MALLOC_LEN); } if (prev != NULL && (*prev & IP_MALLOC_INUSE) == 0) { *prev = (*prev & IP_MALLOC_LEN) + (*cur & IP_MALLOC_LEN); } } } uint16_t ip_malloc_freespace() { uint16_t ret = 0; bndrt_t *cur = (bndrt_t *)heap; while ((uint8_t *)cur - heap < IP_MALLOC_HEAP_SIZE) { if ((*cur & IP_MALLOC_INUSE) == 0) ret += *cur & IP_MALLOC_LEN; cur = (bndrt_t *)(((uint8_t *)cur) + ((*cur) & IP_MALLOC_LEN)); } return ret; } #ifdef PC #include void dump_heap() { int i; for (i = 0; i < IP_MALLOC_HEAP_SIZE; i++) { printf("0x%hx ", heap[i]); if (i % 8 == 7) printf(" "); if (i % 16 == 15) printf ("\n"); if (i > 64) break; } printf("\n"); } void ip_print_heap() { bndrt_t *cur = (bndrt_t *)heap; while (((uint8_t *)cur) - heap < IP_MALLOC_HEAP_SIZE) { printf ("heap region start: 0x%x length: %i used: %i\n", cur, (*cur & IP_MALLOC_LEN), (*cur & IP_MALLOC_INUSE) >> 15); if ((*cur & IP_MALLOC_LEN) == 0) { printf("ERROR: zero length cell detected!\n"); dump_heap(); exit(1); } cur = (bndrt_t *)(((uint8_t *)cur) + ((*cur) & IP_MALLOC_LEN)); } } #endif #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/ip_malloc.h000066400000000000000000000031261207233610700236150ustar00rootroot00000000000000/* * "Copyright (c) 2008, 2009 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #ifndef NO_IP_MALLOC #ifndef IP_MALLOC_H_ #define IP_MALLOC_H_ #include // align on this number of byte boundarie#s #define IP_MALLOC_ALIGN 2 #define IP_MALLOC_LEN 0x0fff #define IP_MALLOC_FLAGS 0x7000 #define IP_MALLOC_INUSE 0x8000 #define IP_MALLOC_HEAP_SIZE 1500 extern uint8_t heap[IP_MALLOC_HEAP_SIZE]; typedef uint16_t bndrt_t; void ip_malloc_init(); void *ip_malloc(uint16_t sz); void ip_free(void *ptr); uint16_t ip_malloc_freespace(); #ifdef PC void ip_print_heap(); #endif #endif #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/lib6lowpan-includes.h000066400000000000000000000006121207233610700255340ustar00rootroot00000000000000#ifndef _LIB6LOWPAN_INCLUDES_H #define _LIB6LOWPAN_INCLUDES_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef PC #include "blip-pc-includes.h" // typedef uint16_t ieee154_saddr_t; typedef uint16_t hw_pan_t; enum { HW_BROADCAST_ADDR = 0xffff, }; #else #include "blip-tinyos-includes.h" #endif #include #include "nwbyte.h" #include "iovec.h" #include "6lowpan.h" #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/lib6lowpan.c000066400000000000000000000643711207233610700237370ustar00rootroot00000000000000/* Implementation of draft-ietf-6lowpan-hc-06 */ /* @author Stephen Dawson-Haggerty */ /* Each function in this file should have an associated set of test * cases in tests/ * * The library is built up from small functions which take care of one * element of compressor or decompression. This way, we can unit-test * all the little pieces separately and then have one big function * which merely applies them in the right order. In general, HC * allows you to do this pretty well -- the only real state you need * to hang onto is the dispatch block at the beginning of the * encoding. */ #include #include #include #ifdef UNIT_TESTING #include #else // #define printf(fmt, args ...) ; #endif #include "lib6lowpan-includes.h" #include "lib6lowpan.h" #include "ip.h" #include "Ieee154.h" #include "ieee154_header.h" #include "internal.h" /* UTILITY MACROS AND FUNCTIONS */ /* test if the first 64-bits are fe80::/64 */ #define IS_LINKLOCAL(ADDR) \ ((ADDR)->s6_addr16[0] == htons(0xfe80) && \ (ADDR)->s6_addr16[1] == 0 && \ (ADDR)->s6_addr16[2] == 0 && \ (ADDR)->s6_addr16[3] == 0) /* test if the address is all zeroes */ #define IS_UNSPECIFIED(ADDR) \ ((ADDR)->s6_addr16[0] == 0 && \ (ADDR)->s6_addr16[1] == 0 && \ (ADDR)->s6_addr16[2] == 0 && \ (ADDR)->s6_addr16[3] == 0 && \ (ADDR)->s6_addr16[4] == 0 && \ (ADDR)->s6_addr16[5] == 0 && \ (ADDR)->s6_addr16[6] == 0 && \ (ADDR)->s6_addr16[7] == 0) #if ! defined(HAVE_LOWPAN_EXTERN_MATCH_CONTEXT) int lowpan_extern_read_context(struct in6_addr *addr, int context) { return -1; } int lowpan_extern_match_context(struct in6_addr *addr, UNUSED uint8_t *ctx_id) { return 0; } #endif int iid_eui_cmp(uint8_t *iid, uint8_t *eui) { return (iid[0] == (eui[7] ^ 0x2) && iid[1] == eui[6] && iid[2] == eui[5] && iid[3] == eui[4] && iid[4] == eui[3] && iid[5] == eui[2] && iid[6] == eui[1] && iid[7] == eui[0]); } /* @return 0 if all bits in the range [start,end) are zero */ /* -1 otherwise */ int bit_range_zero_p(uint8_t *buf, int start, int end) { int start_byte = start / 8; int end_byte = end / 8; int i; uint8_t start_mask = 0xff << (8 - (start % 8)); uint8_t end_mask = 0xff << (8 - (end % 8)); // printf("start: %i end: %i, (%i, %i)\n", start, end, start_byte, end_byte); // printf("start mask: 0x%x end mask: 0x%x\n", start_mask, end_mask); if ((buf[start_byte] & start_mask) != 0) { return -1; } if ((buf[end_byte] & end_mask) != 0) { return -1; } for (i = start_byte; i < end_byte; i++) { if (buf[i] != 0) return -1; } return 0; } /* HEADER PACKING */ /* functions for creating a compressed representation of an IPv6 header */ /* packs the Traffic Class and Flow Label fields as described in the internet draft */ /* @buf the buffer to write any anyline fields to */ /* @hdr the IPv6 header being compressed; this function only examines the first four octets */ /* @dispatch the octet corresponding to the first octet of the IPHC dispatch value */ /* modified to reflect the packing of the fields */ inline uint8_t *pack_tcfl(uint8_t *buf, struct ip6_hdr *hdr, uint8_t *dispatch) { uint32_t flow = (ntohl(hdr->ip6_flow) & 0x000fffff); uint8_t tc = (ntohl(hdr->ip6_flow) >> 20) & 0xff; if (flow == 0 && tc == 0) { // lucky us *dispatch |= LOWPAN_IPHC_TF_NONE; } else if (flow == 0) { *dispatch |= LOWPAN_IPHC_TF_ECN_DSCP; *buf = (tc >> 2) & 0xff; *buf |= (tc << 6) & 0xff; buf++; } else if ((tc & 0x3) == tc) { *dispatch |= LOWPAN_IPHC_TF_ECN_FL; *buf = (tc << 6) & 0xff; *buf |= (flow >> 16) & 0x0f; *(buf + 1) = (flow >> 8) & 0xff; *(buf + 2) = (flow) & 0xff; buf += 3; } else { *dispatch |= LOWPAN_IPHC_TF_ECN_DSCP_FL; *buf = (tc >> 2) & 0xff; *buf |= (tc << 6) & 0xff; *(buf + 1) = (flow >> 16) & 0x0f; *(buf + 2) = (flow >> 8) & 0xff; *(buf + 3) = (flow) & 0xff; buf += 4; } return buf; } inline uint8_t *pack_nh(uint8_t *buf, struct ip6_hdr *hdr, uint8_t *dispatch) { uint8_t nxt = hdr->ip6_nxt; if (nxt == IPV6_HOP || nxt == IPV6_ROUTING || nxt == IPV6_FRAG || nxt == IPV6_DEST || nxt == IPV6_MOBILITY || nxt == IPV6_IPV6 || nxt == IANA_UDP) { *dispatch |= LOWPAN_IPHC_NH_MASK; } else { *buf++ = hdr->ip6_nxt; } return buf; } inline uint8_t *pack_hlim(uint8_t *buf, struct ip6_hdr *hdr, uint8_t *dispatch) { if (hdr->ip6_hlim == 1) { *dispatch |= LOWPAN_IPHC_HLIM_1; } else if (hdr->ip6_hlim == 64) { *dispatch |= LOWPAN_IPHC_HLIM_64; } else if (hdr->ip6_hlim == 255) { *dispatch |= LOWPAN_IPHC_HLIM_255; } else { *dispatch |= LOWPAN_IPHC_HLIM_NONE; *buf++ = hdr->ip6_hlim; } return buf; } /* packs all non-multicast addresses */ /* @buf output buffer */ /* @addr the ipv6 address to be compressed */ /* @context_match_len if a context matches, how long the match is. must be multiple of 8 */ /* @l2addr the link-layer address correspoinding to the address (source or destination) */ /* @pan the destination pan ID */ /* @flags return argument; which address mode was selected */ uint8_t *pack_address(uint8_t *buf, struct in6_addr *addr, int context_match_len, ieee154_addr_t *l2addr, ieee154_panid_t pan, uint8_t *flags) { *flags = 0; if (IS_LINKLOCAL(addr)) { /* then we use stateless compression */ /* no bits to set, just pack the IID */ if (addr->s6_addr16[4] == 0 && addr->s6_addr16[5] == 0 && addr->s6_addr16[6] == 0) { // then we use 16-bit mode. This isn't going to be popular... *flags |= LOWPAN_IPHC_AM_16; memcpy(buf, &addr->s6_addr[14], 2); return buf += 2; } else if (/* maybe it's a 16-bit address with the IID derived from the PANID + address */ (addr->s6_addr16[4] == htons(letohs(pan) & ~0x0200) && addr->s6_addr16[5] == htons(0x00ff) && addr->s6_addr16[6] == htons(0xfe00) && (((l2addr->ieee_mode == IEEE154_ADDR_SHORT) && addr->s6_addr16[7] == htons(letohs(l2addr->i_saddr))))) || /* no? Maybe it's just a straight-up 64-bit EUI64 */ ((l2addr->ieee_mode == IEEE154_ADDR_EXT) && (iid_eui_cmp(&addr->s6_addr[8], l2addr->i_laddr.data)))) { /* in either case we can elide the addressing from the packet. */ *flags |= LOWPAN_IPHC_AM_0; return buf; } else { *flags |= LOWPAN_IPHC_AM_64; memcpy(buf, &addr->s6_addr[8], 8); return buf + 8; } } else if (context_match_len > 0) { int extra = 0; // then we're using the context *flags |= LOWPAN_IPHC_AC_CONTEXT; if (context_match_len == 128) { *flags |= LOWPAN_IPHC_AM_0; } else if (bit_range_zero_p(&addr->s6_addr[0], context_match_len, 112) == 0) { *flags |= LOWPAN_IPHC_AM_16; memcpy(buf, &addr->s6_addr[14], 2); extra = 2; } else if (bit_range_zero_p(&addr->s6_addr[0], context_match_len, 64) == 0) { *flags |= LOWPAN_IPHC_AM_64; memcpy(buf, &addr->s6_addr[8], 8); extra = 8; } else { *flags |= LOWPAN_IPHC_AM_128; *flags &= ~LOWPAN_IPHC_AC_CONTEXT; memcpy(buf, &addr->s6_addr[0], 16); extra = 16; } return buf + extra; } else if (IS_UNSPECIFIED(addr)) { /* this case doesn't involve any compression */ *flags |= LOWPAN_IPHC_AC_CONTEXT | LOWPAN_IPHC_AM_128; return buf; } else { /* otherwise we have to send the whole thing. */ *flags |= LOWPAN_IPHC_AM_128; memcpy(buf, addr->s6_addr, 16); return buf + 16; } } /* Packs a multicast address into the smallest address possible. */ /* does not currently implement stateful multicast address compression */ /* also does not check to make sure it is a multicast address */ uint8_t *pack_multicast(uint8_t *buf, struct in6_addr *addr, uint8_t *flags) { /* no need to set AC since it's zero */ *flags = 0; if ((addr->s6_addr16[0] == htons(0xff02)) && (bit_range_zero_p(addr->s6_addr, 16, 120) == 0)) { *flags |= LOWPAN_IPHC_AM_M_8; *buf = addr->s6_addr[15]; return buf + 1; } else if (bit_range_zero_p(addr->s6_addr, 16, 104) == 0) { *flags |= LOWPAN_IPHC_AM_M_32; *buf = addr->s6_addr[1]; memcpy(buf + 1, &addr->s6_addr[13], 3); return buf + 4; } else if (bit_range_zero_p(addr->s6_addr, 16, 88) == 0) { *flags |= LOWPAN_IPHC_AM_M_48; *buf = addr->s6_addr[1]; memcpy(buf + 1, &addr->s6_addr[11], 5); return buf + 6; } else { *flags += LOWPAN_IPHC_AM_M_128; memcpy(buf, addr->s6_addr, 16); return buf + 16; } } /* never pack the ports */ int pack_udp(uint8_t *buf, size_t cnt, struct ip6_packet *packet, int offset) { struct udp_hdr udp; if (cnt < 7) { return -1; } if (iov_read(packet->ip6_data, offset, sizeof(struct udp_hdr), (void *)&udp) != sizeof(struct udp_hdr)) { return -1; } *buf = LOWPAN_NHC_UDP_PATTERN | LOWPAN_NHC_UDP_PORT_FULL; memcpy(buf + 1, &udp.srcport, 4); memcpy(buf + 5, &udp.chksum, 2); return 7; } /* @type the next header value of the header we are inspecting * @pkt an iovec storing the packet being compressed * @offset the offset to the start of the extension header we are interested in * * @return the length of the header, in octets, eliding any trailing * padding options. on error, 0, since the shortest possible extension * header is of length 2 and that would be in the case where it * contains only padding. */ uint8_t __ipnh_real_length(uint8_t type, struct ip_iovec *pkt, int offset) { int start_offset = offset, end_offset = offset + 2; struct ip6_ext ext; struct tlv_hdr tlv; if (iov_read(pkt, offset, 2, (void *)&ext) != 2) return -1; /* if it's neither of these two types, the header length is contained in the header. */ if (type != IPV6_HOP && type != IPV6_DEST) return (ext.ip6e_len + 1) * 8; offset += 2; for (;;) { if (offset >= (ext.ip6e_len + 1) * 8) break; if (iov_read(pkt, offset, 2, (void *)&tlv) != 2) return -1; if (tlv.type == IPV6_TLV_PAD1) { offset += 1; } else { offset += 2 + tlv.len; if (tlv.type != IPV6_TLV_PADN) { end_offset = offset; } } } /* the length of the TLVs didn't match the length in the enclosing header */ if (offset - start_offset != (ext.ip6e_len + 1) * 8) return 0; /* length up to the first padding option encountered which was not followed by a non-padding option. */ return end_offset - start_offset; } int pack_ipnh(uint8_t *dest, size_t cnt, uint8_t *type, struct ip6_packet *packet, int offset) { struct ip6_ext ext; uint8_t real_len; /* read the ipv6 extension header out for processing */ if (iov_read(packet->ip6_data, offset, 2, (void *)&ext) != 2) return -1; if (ext.ip6e_len > cnt) return -1; *dest = LOWPAN_NHC_IPV6_PATTERN; switch (*type) { case IPV6_HOP: *dest |= LOWPAN_NHC_EID_HOP; break; case IPV6_ROUTING: *dest |= LOWPAN_NHC_EID_ROUTING; break; case IPV6_FRAG: *dest |= LOWPAN_NHC_EID_FRAG; break; case IPV6_DEST: *dest |= LOWPAN_NHC_EID_DEST; break; case IPV6_MOBILITY: *dest |= LOWPAN_NHC_EID_MOBILE; break; default: return -1; } real_len = __ipnh_real_length(*type, packet->ip6_data, offset); if (real_len == 0) return -1; /* store the next header type */ /* if it's compressable, we will compress it */ *type = ext.ip6e_nxt; if (ext.ip6e_nxt == IPV6_HOP || ext.ip6e_nxt == IPV6_ROUTING || ext.ip6e_nxt == IPV6_FRAG || ext.ip6e_nxt == IPV6_DEST || ext.ip6e_nxt == IPV6_MOBILITY || ext.ip6e_nxt == IPV6_IPV6 || ext.ip6e_nxt == IANA_UDP) { *dest |= LOWPAN_NHC_NH; } else { /* include the next header value if it's not compressible */ dest++; *dest = ext.ip6e_nxt; } dest ++; *dest++ = real_len; /* copy the payload */ if (iov_read(packet->ip6_data, offset + 2, real_len - 2, dest) != real_len - 2) return -1; /* continue processing at the next header; which will ignore any padding options */ return (ext.ip6e_len + 1) * 8; } int pack_nhc_chain(uint8_t **dest, size_t cnt, struct ip6_packet *packet) { uint8_t nxt = packet->ip6_hdr.ip6_nxt; int offset = 0, rv; /* @return offset is the offset into the unpacked ipv6 datagram */ /* dest is updated to show how far we have gotten in the packed data */ while (nxt == IPV6_HOP || nxt == IPV6_ROUTING || nxt == IPV6_FRAG || nxt == IPV6_DEST || nxt == IPV6_MOBILITY || nxt == IPV6_IPV6) { int extra; rv = pack_ipnh(*dest, cnt, &nxt, packet, offset); if (rv < 0) return -1; /* it just so happens that LOWPAN_IPNH doesn't change the length of the headers */ /* SDH : right... it actually can change the length depending on whether the next header value is elided or not.*/ extra = (**dest & LOWPAN_NHC_NH) ? 0 : 1; *dest += rv + extra; offset += rv; cnt -= rv; } if (nxt == IANA_UDP) { rv = pack_udp(*dest, cnt, packet, offset); if (rv < 0) return -1; offset += sizeof(struct udp_hdr); *dest += rv; } return offset; } uint8_t * lowpan_pack_headers(struct ip6_packet *packet, struct ieee154_frame_addr *frame, uint8_t *buf, size_t cnt) { uint8_t *dispatch, temp_dispatch, ctx_match_length; if ((packet->ip6_hdr.ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) { return NULL; } /* Packing strategy: */ /* 1. we never create 6lowpan broadcast or mesh frames */ /* 2. first, pack the IP headers and any other compressible header into the frame */ /* 3. if the data will fit into the frame, copy it in too */ /* 4. otherwise, do a memmove(3) and insert a fragmentation header */ /* We'll then test the whole thing as a unit. */ /* There is no support for using more then a single context, and no support for stateful packing of multicast addresses. These things are only supported in decompression, for compatibility. */ dispatch = buf; *dispatch = LOWPAN_DISPATCH_BYTE_VAL; *(dispatch+1) = 0; buf += 2; buf = pack_tcfl(buf, &packet->ip6_hdr, dispatch); buf = pack_nh(buf, &packet->ip6_hdr, dispatch); buf = pack_hlim(buf, &packet->ip6_hdr, dispatch); /* back the source and destination addresses */ ctx_match_length = lowpan_extern_match_context(&packet->ip6_hdr.ip6_src, &temp_dispatch); temp_dispatch = 0; buf = pack_address(buf, &packet->ip6_hdr.ip6_src, ctx_match_length, &frame->ieee_src, frame->ieee_dstpan, &temp_dispatch); *(dispatch+1) |= temp_dispatch << LOWPAN_IPHC_SAM_SHIFT; if (packet->ip6_hdr.ip6_dst.s6_addr[0] != 0xff) { /* not multicast */ ctx_match_length = lowpan_extern_match_context(&packet->ip6_hdr.ip6_dst, &temp_dispatch); temp_dispatch = 0; buf = pack_address(buf, &packet->ip6_hdr.ip6_dst, ctx_match_length, &frame->ieee_dst, frame->ieee_dstpan, &temp_dispatch); *(dispatch+1) |= temp_dispatch << LOWPAN_IPHC_DAM_SHIFT; } else { /* multicast */ buf = pack_multicast(buf, &packet->ip6_hdr.ip6_dst, &temp_dispatch); *(dispatch + 1) |= (temp_dispatch << LOWPAN_IPHC_DAM_SHIFT) | LOWPAN_IPHC_AM_M; } return buf; } uint8_t *unpack_tcfl(struct ip6_hdr *hdr, uint8_t dispatch, uint8_t *buf) { uint8_t fl[3] = {0,0,0}; uint8_t tc = 0; switch (dispatch & LOWPAN_IPHC_TF_MASK) { case LOWPAN_IPHC_TF_ECN_DSCP: tc = ((*buf) >> 6) & 0xff; tc |= ((*buf) << 2) & 0xff; buf += 1; break; case LOWPAN_IPHC_TF_ECN_FL: tc = ((*buf) >> 6) & 0xff; fl[2] = buf[0] & 0x0f; fl[1] = buf[1]; fl[0] = buf[2]; buf += 3; break; case LOWPAN_IPHC_TF_ECN_DSCP_FL: tc = ((*buf) >> 6) & 0xff; tc |= ((*buf) << 2) & 0xff; fl[2] = buf[1] & 0x0f; fl[1] = buf[2]; fl[0] = buf[3]; buf += 4; break; } hdr->ip6_flow = htonl(((uint32_t)0x6 << 28) | ((uint32_t)tc << 20) | ((uint32_t)fl[2] << 16) | ((uint32_t)fl[1] << 8) | fl[0]); return buf; } uint8_t *unpack_nh(struct ip6_hdr *hdr, uint8_t dispatch, uint8_t *buf) { if ((dispatch & LOWPAN_IPHC_NH_MASK) == LOWPAN_IPHC_NH_INLINE) { hdr->ip6_nxt = *buf; return buf + 1; } else { return buf; } } uint8_t *unpack_hlim(struct ip6_hdr *hdr, uint8_t dispatch, uint8_t *buf) { switch (dispatch & LOWPAN_IPHC_HLIM_MASK) { case LOWPAN_IPHC_HLIM_1: hdr->ip6_hlim = 1; break; case LOWPAN_IPHC_HLIM_64: hdr->ip6_hlim = 64; break; case LOWPAN_IPHC_HLIM_255: hdr->ip6_hlim = 255; break; default: hdr->ip6_hlim = *buf; return buf + 1; } return buf; } uint8_t *unpack_address(struct in6_addr *addr, uint8_t dispatch, int context, uint8_t *buf, ieee154_addr_t *frame, ieee154_panid_t pan) { memset(addr, 0, 16); if(!((dispatch & LOWPAN_IPHC_AC_CONTEXT))) { /* stateless compression */ switch (dispatch & LOWPAN_IPHC_AM_MASK) { case LOWPAN_IPHC_AM_128: memcpy(addr, buf, 16); return buf + 16; case LOWPAN_IPHC_AM_64: addr->s6_addr16[0] = htons(0xfe80); memcpy(&addr->s6_addr[8], buf, 8); return buf + 8; case LOWPAN_IPHC_AM_16: addr->s6_addr16[0] = htons(0xfe80); memcpy(&addr->s6_addr[14], buf, 2); return buf + 2; default: addr->s6_addr16[0] = htons(0xfe80); if (frame->ieee_mode == IEEE154_ADDR_EXT) { int i; for (i = 0; i < 8; i++) addr->s6_addr[i+8] = frame->i_laddr.data[7-i]; addr->s6_addr[8] ^= 0x2; } else { addr->s6_addr16[4] = htons(letohs(pan) & ~0x0200); addr->s6_addr[11] = 0xff; addr->s6_addr[12] = 0xfe; addr->s6_addr16[7] = leton16(frame->i_saddr); } return buf; } } else { /* context-based compression */ if ((dispatch & LOWPAN_IPHC_AM_MASK) == LOWPAN_IPHC_AM_128) { // unspecified address :: return buf; } else { int ctxlen = lowpan_extern_read_context(addr, context); switch (dispatch & LOWPAN_IPHC_AM_MASK) { case LOWPAN_IPHC_AM_64: memcpy(&addr->s6_addr[8], buf, 8); return buf + 8; case LOWPAN_IPHC_AM_16: memcpy(&addr->s6_addr[14], buf, 2); return buf + 2; case LOWPAN_IPHC_AM_0: // not clear how to use this: // "and 'possibly' link-layer addresses" if (ctxlen <= 64 && frame->ieee_mode == IEEE154_ADDR_EXT) { int i; for (i = 0; i < 8; i++) addr->s6_addr[i+8] = frame->i_laddr.data[7-i]; addr->s6_addr[8] ^= 0x2; } else if (ctxlen <= 112) { memset(&addr->s6_addr[8], 0, 8); addr->s6_addr16[7] = leton16(frame->i_saddr); } return buf; } } } return NULL; } uint8_t *unpack_multicast(struct in6_addr *addr, uint8_t dispatch, int context, uint8_t *buf) { memset(addr->s6_addr, 0, 16); if (!(dispatch & LOWPAN_IPHC_AC_CONTEXT)) { int amount; switch (dispatch & LOWPAN_IPHC_AM_MASK) { case LOWPAN_IPHC_AM_M_128: memcpy(addr->s6_addr, buf, 16); return buf+ 16; case LOWPAN_IPHC_AM_M_48: amount = 5; goto copy; case LOWPAN_IPHC_AM_M_32: amount = 3; copy: addr->s6_addr[0] = 0xff; addr->s6_addr[1] = buf[0]; memcpy(&addr->s6_addr[16-amount], buf + 1, amount); return buf + 1 + amount; case LOWPAN_IPHC_AM_M_8: addr->s6_addr16[0] = htons(0xff02); addr->s6_addr[15] = buf[0]; return buf + 1; } } else { // stateful multicast compression // all you need to do is read in the context here... } return NULL; } uint8_t *unpack_udp(uint8_t *dest, uint8_t *nxt_hdr, uint8_t *buf) { struct udp_hdr *udp = (struct udp_hdr *)dest; uint8_t dispatch = *buf++; *nxt_hdr = IANA_UDP; // MUST be elided udp->len = 0; // MAY be elided if sufficient conditions are met udp->chksum = 0; /* decompress the ports */ switch (dispatch & LOWPAN_NHC_UDP_PORT_MASK) { case LOWPAN_NHC_UDP_PORT_FULL: udp->srcport = htons((buf[0] << 8) | buf[1]); udp->dstport = htons((buf[2] << 8) | buf[3]); buf += 4; break; case LOWPAN_NHC_UDP_PORT_SRC_FULL: udp->srcport = htons((buf[0] << 8) | buf[1]); udp->dstport = htons((0xF0 << 8) | buf[2]); buf += 3; break; case LOWPAN_NHC_UDP_PORT_DST_FULL: udp->srcport = htons((0xF0 << 8) | buf[0]); udp->dstport = htons((buf[1] << 8) | buf[2]); buf += 3; break; case LOWPAN_NHC_UDP_PORT_SHORT: udp->srcport = htons((0xF0B0) | (buf[0] >> 4)); udp->dstport = 0xF0B0 | (buf[0] & 0xf); udp->dstport = htons(udp->dstport); buf += 1; break; } if (!(dispatch & LOWPAN_NHC_UDP_CKSUM)) { udp->chksum = htons((buf[0] << 8) | buf[1]); buf += 2; } return buf; } /** * Unpack a single header that has been encoded using LOWPAN_NHC * compression * */ uint8_t *unpack_ipnh(uint8_t *dest, size_t cnt, uint8_t *nxt_hdr, uint8_t *buf) { if (((*buf) & LOWPAN_NHC_IPV6_MASK) == LOWPAN_NHC_IPV6_PATTERN) { struct ip6_ext *ext = (struct ip6_ext *)dest; uint8_t length, extra; // decompress an ipv6 extension header // fill in the next header field of the previous header switch ((*buf) & LOWPAN_NHC_EID_MASK) { case LOWPAN_NHC_EID_HOP: *nxt_hdr = IPV6_HOP; break; case LOWPAN_NHC_EID_ROUTING: *nxt_hdr = IPV6_ROUTING; break; case LOWPAN_NHC_EID_FRAG: *nxt_hdr = IPV6_FRAG; break; case LOWPAN_NHC_EID_DEST: *nxt_hdr = IPV6_DEST; break; case LOWPAN_NHC_EID_MOBILE: *nxt_hdr = IPV6_MOBILITY; break; case LOWPAN_NHC_EID_IPV6: /* ja if this happens we need to restart compression at the next byte... */ *nxt_hdr = IPV6_IPV6; break; default: return NULL; } // if the next header value is inline, copy that in. if (!((*buf) & LOWPAN_NHC_NH)) { buf ++; ext->ip6e_nxt = *buf; } buf += 1; length = *buf++; extra = (8 - (length % 8)) % 8; if (cnt < length + extra - 2) return NULL; // buf now points at the start of the extension header data memcpy(dest + 2, buf, length - 2); /* pad out to units of 8 octets if necessary */ if (*nxt_hdr == IPV6_HOP || *nxt_hdr == IPV6_DEST) { if (extra == 1) { /* insert a Pad1 */ dest[length] = IPV6_TLV_PAD1; } else if (extra > 1) { dest[length] = IPV6_TLV_PADN; dest[length+1] = extra - 2; } } ext->ip6e_len = ((length + extra) / 8) - 1; return buf + length + extra - 2; } else if (((*buf) & LOWPAN_NHC_UDP_MASK) == LOWPAN_NHC_UDP_PATTERN) { // packed UDP header return unpack_udp(dest, nxt_hdr, buf); } return NULL; } uint8_t *unpack_nhc_chain(struct lowpan_reconstruct *recon, uint8_t **dest, size_t cnt, uint8_t *nxt_hdr, uint8_t *buf) { uint8_t *dispatch; int has_nhc = 1; do { recon->r_transport_header = *dest; dispatch = buf; buf = unpack_ipnh(*dest, cnt, nxt_hdr, buf); if (!buf) return NULL; if (((*dispatch & LOWPAN_NHC_IPV6_MASK) == LOWPAN_NHC_IPV6_PATTERN)) { struct ip6_ext *ext = (struct ip6_ext *)*dest; /* need to update dest */ *dest += (ext->ip6e_len+1)*8; cnt -= (ext->ip6e_len+1)*8; if ((*dispatch & LOWPAN_NHC_NH)) { nxt_hdr = &ext->ip6e_nxt; } else { has_nhc = 0; } } else if (((*dispatch) & LOWPAN_NHC_UDP_MASK) == LOWPAN_NHC_UDP_PATTERN) { struct udp_hdr *udp = (struct udp_hdr *)*dest; recon->r_app_len = &udp->len; has_nhc = 0; *dest += sizeof(struct udp_hdr); } else { has_nhc = 0; } } while (has_nhc); return buf; } uint8_t *lowpan_unpack_headers(struct lowpan_reconstruct *recon, struct ieee154_frame_addr *frame, uint8_t *buf, size_t cnt) { uint8_t *dispatch, *unpack_start = buf, *unpack_end; int contexts[2] = {0, 0}; uint8_t *dest = recon->r_buf; size_t dst_cnt = recon->r_size; struct ip6_hdr *hdr = (struct ip6_hdr *)dest; dispatch = buf; buf += 2; if (((*dispatch) & LOWPAN_DISPATCH_BYTE_MASK) != LOWPAN_DISPATCH_BYTE_VAL) { return NULL; } /* extend the dispatch block if the context extension is present */ if ((*(dispatch + 1) & LOWPAN_IPHC_CID_MASK) == LOWPAN_IPHC_CID_PRESENT) { contexts[0] = (*buf >> 4) & 0xf; contexts[1] = (*buf) & 0xf; buf += 1; } /* pull out the IP header fields */ buf = unpack_tcfl(hdr, *dispatch, buf); buf = unpack_nh(hdr, *dispatch, buf); buf = unpack_hlim(hdr, *dispatch, buf); /* source address is always unicast compressed */ // printf("unpack source: %p (%x)\n", buf, *buf); buf = unpack_address(&hdr->ip6_src, ((*(dispatch + 1) >> LOWPAN_IPHC_SAM_SHIFT)), contexts[0], buf, &frame->ieee_src, frame->ieee_dstpan); if (!buf) { return NULL; } /* destination address may use multicast address compression */ if (*(dispatch + 1) & LOWPAN_IPHC_M) { // printf("unpack multicast: %p\n", buf); buf = unpack_multicast(&hdr->ip6_dst, ((*(dispatch + 1) >> LOWPAN_IPHC_DAM_SHIFT)), contexts[1], buf); // printf("unpack multicast: %p (%x)\n", buf, *buf); } else { buf = unpack_address(&hdr->ip6_dst, ((*(dispatch + 1) >> LOWPAN_IPHC_DAM_SHIFT)), contexts[1], buf, &frame->ieee_dst, frame->ieee_dstpan); } if (!buf) { return NULL; } /* IPv6 header is complete */ /* at this point, (might) need to decompress a chain of headers compressed with LOWPAN_NHC */ unpack_end = (uint8_t *)(hdr + 1); if ((*dispatch) & LOWPAN_IPHC_NH_MASK) { buf = unpack_nhc_chain(recon, &unpack_end, dst_cnt - sizeof(struct ip6_hdr), &hdr->ip6_nxt, buf); if (!buf) { return NULL; } } /* copy any remaining payload into the unpack region */ memcpy(unpack_end, buf, cnt - (buf - unpack_start)); /* return a pointer to the end of the unpacked data */ return unpack_end + (cnt - (buf - unpack_start)); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/lib6lowpan.h000066400000000000000000000144571207233610700237440ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #ifndef _LIB6LOWPAN_H_ #define _LIB6LOWPAN_H_ #define UNUSED #include #include "lib6lowpan-includes.h" #include "ip.h" /* utility macros */ #ifndef PC #define memclr(ptr, len) memset((ptr), 0, (len)) // #define memcpy(dst, src, len) ip_memcpy((uint8_t *)dst, (uint8_t *)src, len) // #define memmove(dst, src, len) ip_memcpy(dst, src, len) uint8_t *ip_memcpy(uint8_t *dst0, const uint8_t *src0, uint16_t len) ; #endif uint16_t ieee154_hashaddr(ieee154_addr_t *addr); /* * Fragmentation routines. */ struct packed_lowmsg { uint8_t headers; uint8_t len; uint8_t *data; }; struct lowpan_reconstruct { uint16_t r_tag; /* datagram label */ uint16_t r_source_key; /* */ uint16_t r_size; /* the size of the packet we are reconstructing */ uint8_t *r_buf; /* the reconstruction location */ uint16_t r_bytes_rcvd; /* how many bytes from the packet we have received so far */ uint8_t r_timeout; uint16_t *r_app_len; uint8_t *r_transport_header; struct ip6_metadata r_meta; }; struct lowpan_ctx { uint16_t tag; /* the label of the datagram */ uint16_t offset; /* how far into the packet we have sent, in bytes */ }; enum { LOWMSG_MESH_HDR = (1 << 0), LOWMSG_BCAST_HDR = (1 << 1), LOWMSG_FRAG1_HDR = (1 << 2), LOWMSG_FRAGN_HDR = (1 << 3), LOWMSG_NALP = (1 << 4), LOWMSG_IPNH_HDR = (1 << 5), LOWMSG_IPV6 = (1 << 6), }; uint16_t getHeaderBitmap(struct packed_lowmsg *lowmsg); /* * Return the length of the buffer required to pack lowmsg * into a buffer. */ uint8_t *getLowpanPayload(struct packed_lowmsg *lowmsg); uint8_t setupHeaders(struct packed_lowmsg *packed, uint16_t headers); /* * Test if various protocol features are enabled */ inline uint8_t hasMeshHeader(struct packed_lowmsg *msg); inline uint8_t hasBcastHeader(struct packed_lowmsg *msg); inline uint8_t hasFrag1Header(struct packed_lowmsg *msg); inline uint8_t hasFragNHeader(struct packed_lowmsg *msg); /* * Mesh header fields * * return FAIL if the message doesn't have a mesh header */ uint8_t getMeshHopsLeft(struct packed_lowmsg *msg, uint8_t *hops); uint8_t getMeshOriginAddr(struct packed_lowmsg *msg, ieee154_saddr_t *origin); uint8_t getMeshFinalAddr(struct packed_lowmsg *msg, ieee154_saddr_t *final); uint8_t setMeshHopsLeft(struct packed_lowmsg *msg, uint8_t hops); uint8_t setMeshOriginAddr(struct packed_lowmsg *msg, ieee154_saddr_t origin); uint8_t setMeshFinalAddr(struct packed_lowmsg *msg, ieee154_saddr_t final); /* * Broadcast header fields */ uint8_t getBcastSeqno(struct packed_lowmsg *msg, uint8_t *seqno); uint8_t setBcastSeqno(struct packed_lowmsg *msg, uint8_t seqno); /* * Fragmentation header fields */ inline uint8_t getFragDgramSize(struct packed_lowmsg *msg, uint16_t *size); inline uint8_t getFragDgramTag(struct packed_lowmsg *msg, uint16_t *tag); inline uint8_t getFragDgramOffset(struct packed_lowmsg *msg, uint8_t *size); inline uint8_t setFragDgramSize(struct packed_lowmsg *msg, uint16_t size); inline uint8_t setFragDgramTag(struct packed_lowmsg *msg, uint16_t tag); inline uint8_t setFragDgramOffset(struct packed_lowmsg *msg, uint8_t size); /* * extern functions -- must be declared by app somewhere else */ int lowpan_extern_match_context(struct in6_addr *addr, UNUSED uint8_t *ctx_id); int lowpan_extern_read_context(struct in6_addr *addr, int context); int pack_nhc_chain(uint8_t **dest, size_t cnt, struct ip6_packet *packet); /* * Pack the header fields of msg into buffer 'buf'. * it returns the number of bytes written to 'buf', or zero if it encountered a problem. * * it will pack the IP header and all headers in the header chain of * msg into the buffer; the only thing it will not pack is the * payload. * * @packet the message to be packet * @frame link-layer address information about the packet * @buf a buffer to write the headers into * @cnt length of the buffer * @return the number of */ uint8_t *lowpan_pack_headers(struct ip6_packet *packet, struct ieee154_frame_addr *frame, uint8_t *buf, size_t cnt); uint8_t *lowpan_unpack_headers(struct lowpan_reconstruct *recon, struct ieee154_frame_addr *frame, uint8_t *buf, size_t cnt); /* * this function writes the next fragment which needs to be sent into * the buffer passed in. It updates the structures in process to * reflect how much of the packet has been sent so far. * * if the packet does not require fragmentation, this function will * not insert a fragmentation header and will merely compress the * headers into the packet. * */ int lowpan_frag_get(uint8_t *frag, size_t len, struct ip6_packet *packet, struct ieee154_frame_addr *frame, struct lowpan_ctx *ctx); int lowpan_recon_start(struct ieee154_frame_addr *frame_addr, struct lowpan_reconstruct *recon, uint8_t *pkt, size_t len); int lowpan_recon_add(struct lowpan_reconstruct *recon, uint8_t *pkt, size_t len); enum { T_FAILED1 = 0, T_FAILED2 = 1, T_UNUSED = 2, T_ACTIVE = 3, T_ZOMBIE = 4, }; /* uint8_t* getLinkLocalPrefix(); */ #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/lib6lowpan_4944.c000066400000000000000000000243731207233610700244210ustar00rootroot00000000000000/* * "Copyright (c) 2008,2010 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #include "lib6lowpan.h" #include "6lowpan.h" #include "nwbyte.h" /* * Library implementation of packing of 6lowpan packets. * * This should allow uniform code treatment between pc and mote code; * the goal is to write ANSI C here... This means no nx_ types, * unfortunately. * * Accessing fields programtically is probably a little less * efficient, but that can be improved. By precomputing the packet * headers present, we can make the overhead not too bad. The #1 * goal of this library is portability and readability. * * The broadcast and mesh headers may or may not be useful, and are * off by default to reduce code size. Removing them reduces the * library size by about 600 bytes. */ /* * Return the length (in bytes) of the buffer required to pack lowmsg * into a buffer. */ inline uint8_t *getLowpanPayload(struct packed_lowmsg *lowmsg) { uint8_t len = 0; #if LIB6LOWPAN_FULL if (lowmsg->headers & LOWMSG_MESH_HDR) len += LOWMSG_MESH_LEN; if (lowmsg->headers & LOWMSG_BCAST_HDR) len += LOWMSG_BCAST_LEN; #endif if (lowmsg->headers & LOWMSG_FRAG1_HDR) len += LOWMSG_FRAG1_LEN; if (lowmsg->headers & LOWMSG_FRAGN_HDR) len += LOWMSG_FRAGN_LEN; return lowmsg->data + len; } /* * Return a bitmap indicating which lowpan headers are * present in the message pointed to by lowmsg. * */ inline uint16_t getHeaderBitmap(struct packed_lowmsg *lowmsg) { uint16_t headers = 0; uint8_t *buf = lowmsg->data; int16_t len = lowmsg->len; if (buf == NULL) return headers; if (len > 0 && ((*buf) >> 6) == LOWPAN_NALP_PATTERN) { return LOWMSG_NALP; } #if LIB6LOWPAN_FULL if (len > 0 && ((*buf) >> 6) == LOWPAN_MESH_PATTERN) { if (!(*buf & LOWPAN_MESH_V_MASK) || !(*buf & LOWPAN_MESH_F_MASK)) { // we will not parse a packet with 64-bit addressing. return LOWMSG_NALP; } headers |= LOWMSG_MESH_HDR; buf += LOWMSG_MESH_LEN; len -= LOWMSG_MESH_LEN; } if (len > 0 && (*buf) == LOWPAN_BCAST_PATTERN) { headers |= LOWMSG_BCAST_HDR; buf += LOWMSG_BCAST_LEN; len -= LOWMSG_BCAST_LEN; } #endif // printf("dispatch: 0x%02x\n", *buf); if (len > 0 && ((*buf) >> 3) == LOWPAN_FRAG1_PATTERN) { headers |= LOWMSG_FRAG1_HDR; buf += LOWMSG_FRAG1_LEN; len -= LOWMSG_FRAG1_LEN; } if (len > 0 && ((*buf) >> 3) == LOWPAN_FRAGN_PATTERN) { headers |= LOWMSG_FRAGN_HDR; buf += LOWMSG_FRAGN_LEN; len -= LOWMSG_FRAGN_LEN; } return headers; } /* * Fill in dispatch values */ inline uint8_t setupHeaders(struct packed_lowmsg *packed, uint16_t headers) { uint8_t *buf = packed->data; uint16_t len = packed->len; if (packed == NULL) return 1; if (buf == NULL) return 1; packed->headers = 0; #if LIB6LOWPAN_FULL if (headers & LOWMSG_MESH_HDR) { if (len < LOWMSG_MESH_LEN) return 1; packed->headers |= LOWMSG_MESH_HDR; *buf = LOWPAN_MESH_PATTERN << 6 | LOWPAN_MESH_V_MASK | LOWPAN_MESH_F_MASK; buf += LOWMSG_MESH_LEN; len -= LOWMSG_MESH_LEN; } if (headers & LOWMSG_BCAST_HDR) { if (len < LOWMSG_BCAST_LEN) return 1; packed->headers |= LOWMSG_BCAST_HDR; *buf = LOWPAN_BCAST_PATTERN; buf += LOWMSG_BCAST_LEN; len -= LOWMSG_BCAST_LEN; } #endif if (headers & LOWMSG_FRAG1_HDR) { if (len < LOWMSG_FRAG1_LEN) return 1; packed->headers |= LOWMSG_FRAG1_HDR; *buf = LOWPAN_FRAG1_PATTERN << 3; buf += LOWMSG_FRAG1_LEN; len -= LOWMSG_FRAG1_LEN; } if (headers & LOWMSG_FRAGN_HDR) { if (len < LOWMSG_FRAGN_LEN) return 1; packed->headers |= LOWMSG_FRAGN_HDR; *buf = LOWPAN_FRAGN_PATTERN << 3; } return 0; } /* * Test if various headers are present are enabled */ #ifdef LIB6LOWPAN_FULL inline uint8_t hasMeshHeader(struct packed_lowmsg *msg) { return (msg->headers & LOWMSG_MESH_HDR); } inline uint8_t hasBcastHeader(struct packed_lowmsg *msg) { return (msg->headers & LOWMSG_BCAST_HDR); } #endif inline uint8_t hasFrag1Header(struct packed_lowmsg *msg) { return (msg->headers & LOWMSG_FRAG1_HDR); } inline uint8_t hasFragNHeader(struct packed_lowmsg *msg) { return (msg->headers & LOWMSG_FRAGN_HDR); } #ifdef LIB6LOWPAN_FULL /* * Mesh header fields * * return FAIL if the message doesn't have a mesh header */ inline uint8_t getMeshHopsLeft(struct packed_lowmsg *msg, uint8_t *hops) { uint8_t *buf = msg->data; if (!hasMeshHeader(msg) || msg->data == NULL || hops == NULL) return 1; *hops = (*buf) & LOWPAN_MESH_HOPS_MASK; return 0; } inline uint8_t getMeshOriginAddr(struct packed_lowmsg *msg, ieee154_saddr_t *origin) { uint8_t *buf = msg->data; if (!hasMeshHeader(msg) || msg->data == NULL || origin == NULL) return 1; // skip 64-bit addresses if (!(*buf & LOWPAN_MESH_V_MASK)) return 1; buf += 1; *origin = ntohs(*((uint16_t *)buf)); return 0; } inline uint8_t getMeshFinalAddr(struct packed_lowmsg *msg, ieee154_saddr_t *final) { uint8_t *buf = msg->data; if (!hasMeshHeader(msg) || msg->data == NULL || final == NULL) return 1; // skip 64-bit addresses if (!(*buf & LOWPAN_MESH_F_MASK)) return 1; buf += 3; *final = ntohs(*((uint16_t *)buf)); return 0; } inline uint8_t setMeshHopsLeft(struct packed_lowmsg *msg, uint8_t hops) { uint8_t *buf = msg->data; if (!hasMeshHeader(msg) || msg->data == NULL) return 1; *buf = 0xb0; *buf |= hops & LOWPAN_MESH_HOPS_MASK; return 0; } inline uint8_t setMeshOriginAddr(struct packed_lowmsg *msg, ieee154_saddr_t origin) { uint8_t *buf = msg->data; if (!hasMeshHeader(msg) || msg->data == NULL) return 1; // skip 64-bit addresses if (!(*buf & LOWPAN_MESH_V_MASK)) return 1; buf += 1; *((uint16_t *)buf) = htons(origin); return 0; } inline uint8_t setMeshFinalAddr(struct packed_lowmsg *msg, ieee154_saddr_t final) { uint8_t *buf = msg->data; if (!hasMeshHeader(msg) || msg->data == NULL) return 1; // skip 64-bit addresses if (!(*buf & LOWPAN_MESH_F_MASK)) return 1; buf += 3; *((uint16_t *)buf) = htons(final); return 0; } /* * Broadcast header fields */ inline uint8_t getBcastSeqno(struct packed_lowmsg *msg, uint8_t *seqno) { uint8_t *buf = msg->data; if (buf == NULL || seqno == NULL || !hasBcastHeader(msg)) return 1; if (hasMeshHeader(msg)) buf += LOWMSG_MESH_LEN; if (*buf != LOWPAN_BCAST_PATTERN) return 2; buf += 1; *seqno = *buf; return 0; } inline uint8_t setBcastSeqno(struct packed_lowmsg *msg, uint8_t seqno) { uint8_t *buf = msg->data; if (buf == NULL || !hasBcastHeader(msg)) return 1; if (hasMeshHeader(msg)) buf += LOWMSG_MESH_LEN; if (*buf != LOWPAN_BCAST_PATTERN) return 2; buf += 1; *buf = seqno; return 0; } #endif /* * Fragmentation header fields */ inline uint8_t getFragDgramSize(struct packed_lowmsg *msg, uint16_t *size) { uint8_t *buf = msg->data; uint8_t s[2]; if (buf == NULL || size == NULL) return 1; #ifdef LIB6LOWPAN_FULL if (hasMeshHeader(msg)) buf += LOWMSG_MESH_LEN; if (hasBcastHeader(msg)) buf += LOWMSG_BCAST_LEN; #endif if ((*buf >> 3) != LOWPAN_FRAG1_PATTERN && (*buf >> 3) != LOWPAN_FRAGN_PATTERN) return 1; s[0] = *buf & 0x7; buf++; s[1] = *buf; *size = ((uint16_t)s[0]) << 8 | s[1]; return 0; } inline uint8_t getFragDgramTag(struct packed_lowmsg *msg, uint16_t *tag) { uint8_t *buf = msg->data; if (buf == NULL || tag == NULL) return 1; #ifdef LIB6LOWPAN_FULL if (hasMeshHeader(msg)) buf += LOWMSG_MESH_LEN; if (hasBcastHeader(msg)) buf += LOWMSG_BCAST_LEN; #endif if ((*buf >> 3) != LOWPAN_FRAG1_PATTERN && (*buf >> 3) != LOWPAN_FRAGN_PATTERN) return 1; buf += 2; //*tag = (*buf << 8) | *(buf + 1); ; *tag = ntohs( *(uint16_t *)buf); return 0; } inline uint8_t getFragDgramOffset(struct packed_lowmsg *msg, uint8_t *size) { uint8_t *buf = msg->data; if (buf == NULL || size == NULL) return 1; #ifdef LIB6LOWPAN_FULL if (hasMeshHeader(msg)) buf += LOWMSG_MESH_LEN; if (hasBcastHeader(msg)) buf += LOWMSG_BCAST_LEN; #endif if ((*buf >> 3) != LOWPAN_FRAGN_PATTERN) return 1; buf += 4; *size = *buf; return 0; } inline uint8_t setFragDgramSize(struct packed_lowmsg *msg, uint16_t size) { uint8_t *buf = msg->data; if (buf == NULL) return 1; #ifdef LIB6LOWPAN_FULL if (hasMeshHeader(msg)) buf += LOWMSG_MESH_LEN; if (hasBcastHeader(msg)) buf += LOWMSG_BCAST_LEN; #endif if ((*buf >> 3) != LOWPAN_FRAG1_PATTERN && (*buf >> 3) != LOWPAN_FRAGN_PATTERN) return 1; size = size & 0x7ff; // zero out the dgram size first. *buf &= 0xf8; *buf |= (size >> 8); buf[1] = size & 0xff; // *((uint16_t *)buf) |= htons(size & 0x7ff); return 0; } inline uint8_t setFragDgramTag(struct packed_lowmsg *msg, uint16_t tag) { uint8_t *buf = msg->data; if (buf == NULL) return 1; #ifdef LIB6LOWPAN_FULL if (hasMeshHeader(msg)) buf += LOWMSG_MESH_LEN; if (hasBcastHeader(msg)) buf += LOWMSG_BCAST_LEN; #endif if ((*buf >> 3) != LOWPAN_FRAG1_PATTERN && (*buf >> 3) != LOWPAN_FRAGN_PATTERN) return 1; buf += 2; buf[0] = tag >> 8; buf[1] = tag & 0xff; return 0; } inline uint8_t setFragDgramOffset(struct packed_lowmsg *msg, uint8_t size) { uint8_t *buf = msg->data; if (buf == NULL) return 1; #ifdef LIB6LOWPAN_FULL if (hasMeshHeader(msg)) buf += LOWMSG_MESH_LEN; if (hasBcastHeader(msg)) buf += LOWMSG_BCAST_LEN; #endif if ((*buf >> 3) != LOWPAN_FRAGN_PATTERN) return 1; buf += 4; *buf = size; return 0; } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/lib6lowpan_frag.c000066400000000000000000000132321207233610700247240ustar00rootroot00000000000000 #include #include #include #include "6lowpan.h" #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" #include "ip_malloc.h" #include "iovec.h" #include "ieee154_header.h" int lowpan_recon_start(struct ieee154_frame_addr *frame_addr, struct lowpan_reconstruct *recon, uint8_t *pkt, size_t len) { uint8_t *unpack_point, *unpack_end; struct packed_lowmsg msg; msg.data = pkt; msg.len = len; msg.headers = getHeaderBitmap(&msg); if (msg.headers == LOWMSG_NALP) return -1; /* remove the 6lowpan headers from the payload */ unpack_point = getLowpanPayload(&msg); len -= (unpack_point - pkt); /* set up the reconstruction, or just fill in the packet length */ if (hasFrag1Header(&msg)) { getFragDgramTag(&msg, &recon->r_tag); getFragDgramSize(&msg, &recon->r_size); } else { recon->r_size = LIB6LOWPAN_MAX_LEN + LOWPAN_LINK_MTU; } recon->r_buf = ip_malloc(recon->r_size); if (!recon->r_buf) return -2; memset(recon->r_buf, 0, recon->r_size); recon->r_app_len = NULL; if (*unpack_point == LOWPAN_IPV6_PATTERN) { /* uncompressed header... no need to un-hc */ unpack_point++; len --; memcpy(recon->r_buf, unpack_point, len); unpack_end = recon->r_buf + len; } else { /* unpack the first fragment */ unpack_end = lowpan_unpack_headers(recon, frame_addr, unpack_point, len); } if (!unpack_end) { ip_free(recon->r_buf); return -3; } if (!hasFrag1Header(&msg)) { recon->r_size = (unpack_end - recon->r_buf); } recon->r_bytes_rcvd = unpack_end - recon->r_buf; ((struct ip6_hdr *)(recon->r_buf))->ip6_plen = htons(recon->r_size - sizeof(struct ip6_hdr)); /* fill in any elided app data length fields */ if (recon->r_app_len) { *recon->r_app_len = htons(recon->r_size - (recon->r_transport_header - recon->r_buf)); } /* done, updated all the fields */ /* reconstruction is complete if r_bytes_rcvd == r_size */ return 0; } int lowpan_recon_add(struct lowpan_reconstruct *recon, uint8_t *pkt, size_t len) { struct packed_lowmsg msg; uint8_t *buf; msg.data = pkt; msg.len = len; msg.headers = getHeaderBitmap(&msg); if (msg.headers == LOWMSG_NALP) return -1; if (!hasFragNHeader(&msg)) { return -2; } buf = getLowpanPayload(&msg); len -= (buf - pkt); if (recon->r_size < recon->r_bytes_rcvd + len) return -3; /* just need to copy the new payload in and return */ memcpy(recon->r_buf + recon->r_bytes_rcvd, buf, len); recon->r_bytes_rcvd += len; return 0; } int lowpan_frag_get(uint8_t *frag, size_t len, struct ip6_packet *packet, struct ieee154_frame_addr *frame, struct lowpan_ctx *ctx) { uint8_t *buf, *lowpan_buf, *ieee_buf = frag; uint16_t extra_payload; /* pack 802.15.4 */ buf = lowpan_buf = pack_ieee154_header(frag, len, frame); if (ctx->offset == 0) { int offset = 0; #if LIB6LOWPAN_HC_VERSION == -1 /* just copy the ipv6 header around... */ *buf++ = LOWPAN_IPV6_PATTERN; memcpy(buf, &packet->ip6_hdr, sizeof(struct ip6_hdr)); buf += sizeof(struct ip6_hdr); #elif !defined(LIB6LOWPAN_HC_VERSION) || LIB6LOWPAN_HC_VERSION == 6 /* pack the IPv6 header */ buf = lowpan_pack_headers(packet, frame, buf, len - (buf - frag)); if (!buf) return -1; /* pack the next headers */ offset = pack_nhc_chain(&buf, len - (buf - ieee_buf), packet); if (offset < 0) return -2; #endif /* copy the rest of the payload into this fragment */ extra_payload = ntohs(packet->ip6_hdr.ip6_plen) - offset; /* may need to fragment -- insert a FRAG1 header if so */ if (extra_payload > len - (buf - ieee_buf)) { struct packed_lowmsg lowmsg; memmove(lowpan_buf + LOWMSG_FRAG1_LEN, lowpan_buf, buf - lowpan_buf); lowmsg.data = lowpan_buf; lowmsg.len = LOWMSG_FRAG1_LEN; lowmsg.headers = 0; setupHeaders(&lowmsg, LOWMSG_FRAG1_HDR); setFragDgramSize(&lowmsg, ntohs(packet->ip6_hdr.ip6_plen) + sizeof(struct ip6_hdr)); setFragDgramTag(&lowmsg, ctx->tag); lowpan_buf += LOWMSG_FRAG1_LEN; buf += LOWMSG_FRAG1_LEN; extra_payload = len - (buf - ieee_buf); extra_payload -= (extra_payload % 8); } if (iov_read(packet->ip6_data, offset, extra_payload, buf) != extra_payload) { return -3; } ctx->offset = offset + extra_payload + sizeof(struct ip6_hdr); return (buf - frag) + extra_payload; } else { struct packed_lowmsg lowmsg; buf = lowpan_buf = pack_ieee154_header(frag, len, frame); /* setup the FRAGN header */ lowmsg.data = lowpan_buf; lowmsg.len = LOWMSG_FRAGN_LEN; lowmsg.headers = 0; setupHeaders(&lowmsg, LOWMSG_FRAGN_HDR); if (setFragDgramSize(&lowmsg, ntohs(packet->ip6_hdr.ip6_plen) + sizeof(struct ip6_hdr))) return -5; if (setFragDgramTag(&lowmsg, ctx->tag)) return -6; if (setFragDgramOffset(&lowmsg, ctx->offset / 8)) return -7; buf += LOWMSG_FRAGN_LEN; extra_payload = ntohs(packet->ip6_hdr.ip6_plen) + sizeof(struct ip6_hdr) - ctx->offset; if (extra_payload > len - (buf - ieee_buf)) { extra_payload = len - (buf - ieee_buf); extra_payload -= (extra_payload % 8); } if (iov_read(packet->ip6_data, ctx->offset - sizeof(struct ip6_hdr), extra_payload, buf) != extra_payload) { return -4; } ctx->offset += extra_payload; if (extra_payload == 0) return 0; else return (lowpan_buf - ieee_buf) + LOWMSG_FRAGN_LEN + extra_payload; } } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/nwbyte.h000066400000000000000000000022601207233610700231640ustar00rootroot00000000000000#ifndef _NWBYTE_H #define _NWBYTE_H_ #if !defined(PC) // if we're not on a pc, assume little endian for now #define __LITTLE_ENDIAN 1234 #define __BYTE_ORDER __LITTLE_ENDIAN #endif /* define normal network byte-orders routines */ #if defined(PC) // use library versions if on linux #include #else #if __BYTE_ORDER == __LITTLE_ENDIAN // otherwise have to provide our own #ifndef WITH_OSHAN #define ntohs(X) (((((uint16_t)(X)) >> 8) | ((uint16_t)(X) << 8)) & 0xffff) #define htons(X) (((((uint16_t)(X)) << 8) | ((uint16_t)(X) >> 8)) & 0xffff) /* this is much more efficient since gcc can insert swpb now. */ /* moved to utility.c */ uint32_t ntohl(uint32_t i); #define htonl(X) ntohl(X) #else #include #endif #else #error "No byte-order conversions defined!" #endif #endif /* little-endian conversion routines */ #if __BYTE_ORDER == __LITTLE_ENDIAN #define leton16(X) htons(X) #ifndef htole16 #define htole16(X) (X) #endif #define letohs(X) (X) #else // assume big-endian byte-order #define leton16(X) (((((uint16_t)(X)) << 8) | ((uint16_t)(X) >> 8)) & 0xffff) #define htole16(X) (((((uint16_t)(X)) << 8) | ((uint16_t)(X) >> 8)) & 0xffff) #endif #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/000077500000000000000000000000001207233610700226455ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/Makefile000066400000000000000000000047341207233610700243150ustar00rootroot00000000000000 CFLAGS=-U__BLOCKS__ -DPC -DUNIT_TESTING -g -I../../../../../../tos/types -I.. -I../../ -DHAVE_CONFIG_H LIBSOURCE=../lib6lowpan.c ../lib6lowpan_4944.c ../lib6lowpan_frag.c \ ../iovec.c ../utility.c ../in_cksum.c LIB=../lib6lowpan.a LIB_CONTEXT=../lib6lowpan.a context.o TARGETS=test_bit_range_zero_p test_pack_tcfl test_pack_multicast test_pack_address \ test_unpack_tcfl test_unpack_address \ test_unpack_multicast test_unpack_ipnh test_unpack_udp test_pack_nhc_chain \ test_lowpan_frag_get test_inet_ntop6 test_ipnh_real_length test_iovec # test_lowpan_pack_headers all: $(TARGETS) check: ./run.sh clean: rm -f $(TARGETS) *.o distclean: clean test_bit_range_zero_p: test_bit_range_zero_p.c $(LIB_CONTEXT) $(CC) -o $@ $(CFLAGS) $< $(LIB_CONTEXT) test_pack_tcfl: test_pack_tcfl.c $(LIB_CONTEXT) $(CC) -o $@ $(CFLAGS) $< $(LIB_CONTEXT) test_pack_multicast: test_pack_multicast.c $(LIB_CONTEXT) test_pack_address: test_pack_address.c $(LIB_CONTEXT) $(CC) -o $@ $(CFLAGS) $< $(LIB_CONTEXT) test_lowpan_pack_headers: test_lowpan_pack_headers.c $(LIB) $(CC) -o $@ $(CFLAGS) $< $(LIB) -DHAVE_LOWPAN_EXTERN_MATCH_CONTEXT test_unpack_tcfl: test_unpack_tcfl.c $(LIB_CONTEXT) $(CC) -o $@ $(CFLAGS) $< $(LIB_CONTEXT) test_unpack_address: test_unpack_address.c $(LIB) $(CC) -o $@ $(CFLAGS) $< $(LIB) -DHAVE_LOWPAN_EXTERN_MATCH_CONTEXT test_unpack_multicast: test_unpack_multicast.c $(LIB) $(CC) -o $@ $(CFLAGS) $< $(LIB) -DHAVE_LOWPAN_EXTERN_MATCH_CONTEXT test_unpack_ipnh: test_unpack_ipnh.c $(LIB_CONTEXT) $(CC) -o $@ $(CFLAGS) $< $(LIB_CONTEXT) test_unpack_udp: test_unpack_udp.c $(LIB_CONTEXT) $(CC) -o $@ $(CFLAGS) $< $(LIB_CONTEXT) test_pack_nhc_chain: test_pack_nhc_chain.c $(LIB_CONTEXT) $(CC) -o $@ $(CFLAGS) $< $(LIB_CONTEXT) test_lowpan_frag_get: test_lowpan_frag_get.o $(LIB) $(CC) -o $@ $(CFLAGS) $< $(LIB) -DHAVE_LOWPAN_EXTERN_MATCH_CONTEXT test_in_cksum: test_in_cksum.o $(LIB_CONTEXT) $(CC) -o $@ $(CFLAGS) $< $(LIB_CONTEXT) test_lowpan_recon_start: test_lowpan_recon_start.o $(LIB_CONTEXT) $(CC) -o $@ $(CFLAGS) $< $(LIB_CONTEXT) test_lowpan_unpack_headers: test_lowpan_unpack_headers.o $(LIB_CONTEXT) $(CC) -o $@ $(CFLAGS) $< $(LIB_CONTEXT) test_inet_ntop6: test_inet_ntop6.o $(LIB_CONTEXT) $(CC) -o $@ $(CFLAGS) $< $(LIB_CONTEXT) test_ipnh_real_length: test_ipnh_real_length.o $(LIB_CONTEXT) $(CC) -o $@ $(CFLAGS) $< $(LIB_CONTEXT) test_iovec: test_iovec.o $(LIB_CONTEXT) $(CC) -o $@ $(CFLAGS) $< $(LIB_CONTEXT) .c.o: $(CC) -c -o $@ $< $(CFLAGS) tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/context.c000066400000000000000000000002761207233610700245020ustar00rootroot00000000000000 #include "ip.h" int lowpan_extern_read_context(struct in6_addr *addr, int context) { return 0; } int lowpan_extern_match_context(struct in6_addr *addr, uint8_t *ctx_id) { return 0; } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/run.sh000077500000000000000000000006251207233610700240130ustar00rootroot00000000000000#!/bin/sh TESTS="test_bit_range_zero_p test_pack_tcfl test_pack_multicast test_pack_address \ test_unpack_tcfl test_unpack_address \ test_unpack_multicast test_unpack_ipnh test_unpack_udp test_pack_nhc_chain \ test_inet_ntop6 test_ipnh_real_length test_iovec " # test_lowpan_frag_get" test_lowpan_pack_headers for T in $(echo $TESTS); do ./$T | grep -a tests done exit 0tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_bit_range_zero_p.c000066400000000000000000000024341207233610700273630ustar00rootroot00000000000000 #include #include #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" int bit_range_zero_p(uint8_t *buf, int start, int end); struct { int start; int end; int len; uint8_t data[32]; int result; } test_cases[] = { {0, 1, 1, {0x0}, 0}, {0, 8, 1, {0x0}, 0}, {0, 8, 1, {0x1}, -1}, {0, 1, 1, {0x1}, 0}, {0, 1, 1, {0xff}, -1}, {7, 8, 2, {0x1, 0x0}, -1}, {7, 15, 2, {0x1, 0x0}, -1}, {7, 15, 2, {0x0, 0x1}, 0}, {7, 15, 2, {0x1, 0x1}, -1}, {8, 24, 4, {0x1, 0x0, 0, 0x8}, 0}, {8, 25, 4, {0x1, 0x0, 1, 0x8}, -1}, {7, 25, 4, {0x1, 0x0, 0, 0x8}, -1}, {8, 24, 4, {0xff, 0, 0, 0xff}, 0}, {16, 120, 16, {0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, 0} }; int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(test_cases) / sizeof(test_cases[0])); i++) { int rc; rc = bit_range_zero_p(test_cases[i].data, test_cases[i].start, test_cases[i].end); printf("result: %i(%i)\n", rc, test_cases[i].result); if (rc == test_cases[i].result) success++; total++; } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; } int main() { return run_tests(); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_inet_ntop6.c000066400000000000000000000023451207233610700261410ustar00rootroot00000000000000 #include "ip.h" uint8_t buf[128]; struct { char * astr; struct in6_addr addr; } cases[] = { {"fe80::1", {{0xfe, 0x80, 0,0,0,0,0,0,0,0,0,0,0,0,0,1}}}, {"fe80:102:304:506:708:90a:b0c:d0e", {{0xfe, 0x80, 1,2,3,4,5,6,7,8,9,10,11,12,13,14}}}, }; struct in6_addr unpack_addr; int main() { int tests = 0, failures = 0; int i; int write_len; struct in6_addr backwards; for (i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) { write_len = inet_ntop6(&cases[i].addr, buf, sizeof(buf)); printf("%i %s\n", write_len, buf); tests++; if (strcmp(buf, cases[i].astr) != 0) { failures++; } /* round-trip test */ tests++; inet_pton6(buf, &unpack_addr); if (memcmp(unpack_addr.s6_addr, cases[i].addr.s6_addr, 16)) { print_buffer(unpack_addr.s6_addr, 16); print_buffer(cases[i].addr.s6_addr, 16); failures++; } buf[5] = 0xde; buf[6] = 0xad; tests++; write_len = inet_ntop6(&cases[i].addr, buf, 5); if (write_len >= 5 || buf[5] != 0xde || buf[6] != 0xad) { printf("write len: %i %i\n", write_len, (write_len >= 5)); print_buffer(buf, 10); failures ++; } } printf("%s: %i/%i tests succeeded\n", __FILE__, (tests - failures), tests); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_iovec.c000066400000000000000000000033041207233610700251550ustar00rootroot00000000000000#include #include #ifdef UNIT_TESTING #include #endif #include "lib6lowpan.h" #include "iovec.h" /* test some different write patters testing overlap and boundary conditions */ struct test_case { int offset, len; } test_cases[] = { {5, 5}, {5, 10}, {9, 1}, {10, 1}, {25, 10}, {25, 25}, }; int main() { int total = 0, successes = 0; /* test 1: */ struct ip_iovec v[10]; uint8_t buf[1500], orig[1500], zeroes[1500]; int i; printf("starting spread write test\n"); scribble(buf, sizeof(buf)); memcpy(orig, buf, sizeof(buf)); memset(zeroes, 0, sizeof(zeroes)); for(i = 0; i < 10; i++) { v[i].iov_len = 10; v[i].iov_base = &buf[i*10]; if (i < 9) v[i].iov_next = &v[i+1]; else v[i].iov_next = NULL; } iov_print(v); for (i = 0; i < sizeof(test_cases) / sizeof(test_cases[0]); i++) { int rv; printf("iov_write: test %i offset: %i length: %i\n", i + 1, test_cases[i].offset, test_cases[i].len); total++; rv = iov_update(v, test_cases[i].offset, test_cases[i].len, zeroes); if (rv = test_cases[i].len && memcmp(buf, orig, test_cases[i].offset) == 0 && memcmp(buf+test_cases[i].offset, zeroes+test_cases[i].offset, test_cases[i].len) == 0 && memcmp(buf+test_cases[i].offset+test_cases[i].len, orig+test_cases[i].offset+test_cases[i].len, 100 - test_cases[i].offset -test_cases[i].len) == 0) { printf("test: success\n"); successes ++; } iov_print(v); memcpy(buf, orig, sizeof(buf)); printf("\n\n"); } printf("%s: %i/%i tests succeeded\n", __FILE__, successes, total); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_ipnh_real_length.c000066400000000000000000000052051207233610700273540ustar00rootroot00000000000000#include #include #ifdef UNIT_TESTING #include #endif #include "6lowpan.h" #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" struct { uint8_t hdr[128]; } ip_hdrs[] = { {IPV6_DEST, 8, 0,1,2,3,4,5}, {IANA_UDP, 10, 0,1,2,3,4,5,6,7}, }; struct udp_hdr udp = {0xabcd, 0x1234, 512, 0xdead}; uint8_t buf[512]; struct ip_iovec vec[1]; struct ip6_ext *ext; struct tlv_hdr *tlv; int main() { int success = 0, total = 0; uint8_t rv; ext = (struct ip6_ext *)buf; vec->iov_base = buf; vec->iov_len = 512; /* test 1 */ { total ++; printf("starting test 1\n"); ext->ip6e_len = 0; ext->ip6e_nxt = 0; rv = __ipnh_real_length(IPV6_ROUTING, vec, 0); if (rv == 8) success ++; else fprintf(stderr,"FAIL: test 1: %i\n", rv); } /* test 2 */ { /* HBH header with all pad 1 options */ total ++; printf("starting test 2\n"); memset(buf, 0, 8); /* len = 0 nxt = 0 6x pad1 options */ rv = __ipnh_real_length(IPV6_HOP, vec, 0); if (rv == 2) { success ++; } else { printf("FAIL: test 2: %i\n", rv); } } /* test 3 */ { total++; printf("starting test 3\n"); memset(buf, 0, 8); tlv = ext + 1; tlv->type = IPV6_TLV_PADN; tlv->len = 4; rv = __ipnh_real_length(IPV6_HOP, vec, 0); if (rv == 2) success ++; else fprintf(stderr, "FAIL: test 3: %i\n", rv); } /* test 4 */ { /* one TLV encoded payload with length 4 */ total++; printf("starting test 4\n"); memset(buf, 0, 8); tlv = ext + 1; tlv->type = 47; tlv->len = 4; rv = __ipnh_real_length(IPV6_HOP, vec, 0); if (rv == 8) success ++; else { fprintf(stderr, "FAIL: test 4: %i\n", rv); } } { /* one TLV encoded payload with length 11 + Pad1 */ total++; printf("starting test 5\n"); memset(buf, 0, 16); ext->ip6e_len = 1; tlv = ext + 1; tlv->type = 47; tlv->len = 11; rv = __ipnh_real_length(IPV6_HOP, vec, 0); if (rv == 15) success ++; else { fprintf(stderr, "FAIL: test 5: %i\n", rv); } } { /* one TLV encoded payload with length 11 + Pad1 + tlv length 8*/ total++; printf("starting test 6\n"); memset(buf, 0, 24); ext->ip6e_len = 2; tlv = ext + 1; tlv->type = 47; tlv->len = 11; tlv = &buf[16]; tlv->type = 48; tlv->len = 6; rv = __ipnh_real_length(IPV6_HOP, vec, 0); if (rv == 24) success ++; else { fprintf(stderr, "FAIL: test 5: %i\n", rv); } } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_lowpan_frag_get.c000066400000000000000000000111601207233610700272050ustar00rootroot00000000000000 #include #include #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" #include "6lowpan.h" #include "iovec.h" uint8_t ctx[8] = {0x20, 0x02,1,2,3,4,5,6}; int lowpan_extern_read_context(struct in6_addr *addr, int context) { memcpy(addr, ctx, 8); return 64; } int lowpan_extern_match_context(struct in6_addr *addr, UNUSED uint8_t *ctx_id) { if (memcmp(addr, ctx, 8) == 0) { printf("CONTEXT MATCH!\n"); return 64; } else { return 0; } } struct test_case { uint8_t tc; uint32_t fl; uint8_t nxt; uint8_t hlim; char *ip6_src; char *ip6_dst; char *l2src, *l2dst; ieee154_panid_t panid; /* the result of executing the test case */ int result_len; uint8_t result[64]; }; struct test_case cases[] = { {0, 0, IANA_UDP, 66, "fe80::1", "ff02::1", "1", "aa:00:11:22:33:44:55:66:", 0xabcd, 0, {}}, {1, 0, IANA_UDP, 100, "fe80::1", "fe80::2", "1", "65535", 10, 0, {}}, {0, 0, IANA_UDP, 100, "fe80::aa00:1122:3344:5566", "ff02::ab", "aa:00:11:22:33:44:55:66:", "0xab", 10, 0, {}}, {0, 0, IANA_UDP, 100, "2002:102:304:506:aa00:1122:3344:5566", "ff02::12:4567:abcd", "aa:00:11:22:33:44:55:66:", "0xab", 10, 0, {}}, }; uint8_t data[12] = {1,2,3,4,5,6,7,8,9,10,11,12}; int check_test(struct ip6_packet *pkt, struct lowpan_reconstruct *recon) { char buf[2048]; memset(buf, 0, 2048); memcpy(buf, &pkt->ip6_hdr, sizeof(struct ip6_hdr)); iov_read(pkt->ip6_data, 0, iov_len(pkt->ip6_data), &buf[sizeof(struct ip6_hdr)]); // printf("CMP: %i", memcmp(buf, recon->r_buf, recon->r_bytes_rcvd)); print_buffer(buf, 50); print_buffer(recon->r_buf, 50); printf("CMP: %i\n", memcmp(buf, recon->r_buf, 50)); } void setup_test(struct test_case *cse, struct ip6_hdr *hdr, struct ieee154_frame_addr *frame, struct ip_iovec *v) { uint32_t val; printf("packet length: %i, %p\n", iov_len(v), v); val = htonl(0x6 << 28 | ((cse->tc & 0xff) << 20) | (cse->fl & 0x000fffff)); hdr->ip6_flow = val; hdr->ip6_nxt = cse->nxt; hdr->ip6_plen = htons(iov_len(v)); hdr->ip6_hlim = cse->hlim; inet_pton6(cse->ip6_src, &hdr->ip6_src); inet_pton6(cse->ip6_dst, &hdr->ip6_dst); memset(frame, 0, sizeof(frame)); ieee154_parse(cse->l2src, &frame->ieee_src); ieee154_parse(cse->l2dst, &frame->ieee_dst); frame->ieee_dstpan = htole16(cse->panid); } int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(cases) / sizeof(cases[0])); i++) { uint8_t buf[128], *rp, unpack[512], more_data[1500]; struct ip6_packet packet; struct ieee154_frame_addr fr, result_fr; struct lowpan_reconstruct recon; struct lowpan_ctx ctx; struct ip_iovec v[2]; int rv; memset(buf, 0, sizeof(buf)); total++; printf("\n\n----- Test case %i ----\n", i+1); packet.ip6_data = &v[0]; v[0].iov_next = &v[1]; v[0].iov_base= data; v[0].iov_len = 12; for (rv = 0; rv < sizeof(more_data); rv++) more_data[rv] = rv; v[1].iov_next = NULL; v[1].iov_base= more_data; v[1].iov_len = 1500; // print_buffer(more_data, 1500); setup_test(&cases[i], &packet.ip6_hdr, &fr, &v[0]); printf("IEEE 802.15.4 frame: "); print_buffer(&fr, sizeof(struct ieee154_frame_addr)); printf("\n"); printf("IPv6 Header:\n"); print_buffer(&packet.ip6_hdr, sizeof(struct ip6_hdr)); printf("\n"); printf("Data:\n"); print_buffer(data, 12); printf("\n"); printf("plen: %i\n", ntohs(packet.ip6_hdr.ip6_plen)); ctx.offset = 0; ctx.tag = 25; recon.r_buf = NULL; /* how you fragment a packet */ while ((rv = lowpan_frag_get(buf, sizeof(buf), &packet, &fr, &ctx)) > 0) { // print_buffer(buf, rv); /* how you unfragment a packet */ rp = unpack_ieee154_hdr(buf, &result_fr); printf("unpacked ieee154_header: %p-%p\n", buf, rp); // print_buffer(&result_fr, sizeof(result_fr)); if (recon.r_buf == NULL) { lowpan_recon_start(&result_fr, &recon, rp, rv - (rp - buf)); } else { lowpan_recon_add(&recon, rp, rv - (rp - buf)); } memset(buf, 0, sizeof(buf)); } printf("recon progress: %i %i\n", recon.r_bytes_rcvd, recon.r_size); print_buffer(recon.r_buf, recon.r_bytes_rcvd); if (recon.r_bytes_rcvd == recon.r_size) { if (check_test(&packet, &recon) == 0) { success++; } } free(recon.r_buf); recon.r_buf = NULL; } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; } int main() { return run_tests(); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_lowpan_pack_headers.c000066400000000000000000000054131207233610700300440ustar00rootroot00000000000000 #include #include #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" #include "6lowpan.h" uint8_t ctx[8] = {0x20, 0x02,1,2,3,4,5,6}; int lowpan_extern_read_context(struct in6_addr *addr, int context) { memcpy(addr, ctx, 8); return 64; } int lowpan_extern_match_context(struct in6_addr *addr, UNUSED uint8_t *ctx_id) { if (memcmp(addr, ctx, 8) == 0) { printf("CONTEXT MATCH!\n"); return 64; } else { return 0; } } struct test_case { uint8_t tc; uint32_t fl; uint8_t nxt; uint8_t hlim; char *ip6_src; char *ip6_dst; char *l2src, *l2dst; ieee154_panid_t panid; /* the result of executing the test case */ int result_len; uint8_t result[64]; }; struct test_case cases[] = { {0, 0, 12, 100, "fe80::1", "ff02::1", "1", "65535", 10, 0, {}}, {1, 0, 12, 100, "fe80::1", "fe80::2", "1", "65535", 10, 0, {}}, {0, 0, 12, 100, "fe80::aa00:1122:3344:5566", "ff02::ab", "aa:00:11:22:33:44:55:66:", "0xab", 10, 0, {}}, {0, 0, 12, 100, "2002:102:304:506:aa00:1122:3344:5566", "ff02::12:4567:abcd", "aa:00:11:22:33:44:55:66:", "0xab", 10, 0, {}}, }; void setup_test(struct test_case *cse, struct ip6_hdr *hdr, struct ieee154_frame_addr *frame) { uint32_t val; val = htonl(0x6 << 28 | ((cse->tc & 0xff) << 20) | (cse->fl & 0x000fffff)); hdr->ip6_flow = val; hdr->ip6_nxt = cse->nxt; hdr->ip6_plen = 0; hdr->ip6_hlim = cse->hlim; inet_pton6(cse->ip6_src, &hdr->ip6_src); inet_pton6(cse->ip6_dst, &hdr->ip6_dst); memset(frame, 0, sizeof(frame)); ieee154_parse(cse->l2src, &frame->ieee_src); ieee154_parse(cse->l2dst, &frame->ieee_dst); frame->ieee_dstpan = htole16(cse->panid); } int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(cases) / sizeof(cases[0])); i++) { uint8_t buf[512], *rp, unpack[512]; struct ip6_packet packet; struct ieee154_frame_addr fr; memset(buf, 0, 512); total++; printf("\n\n----- Test case %i ----\n", i+1); setup_test(&cases[i], &packet.ip6_hdr, &fr); printf("IEEE 802.15.4 frame: "); print_buffer(&fr, sizeof(struct ieee154_frame_addr)); printf("\n"); printf("IPv6 Header:\n"); print_buffer(&packet.ip6_hdr, sizeof(struct ip6_hdr)); printf("\n"); rp = lowpan_pack_headers(&packet, &fr, buf, 512); printf("Packed result:\n"); print_buffer(buf, rp - buf); rp = lowpan_unpack_headers(unpack, sizeof(unpack), &fr, buf, rp - buf); printf("Unpacked result:\n"); print_buffer(unpack, 40); if (memcmp(unpack, &packet.ip6_hdr, 40) == 0) success++; else printf("FAIL\n"); } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; } int main() { return run_tests(); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_lowpan_unpack_headers.c000066400000000000000000000036011207233610700304040ustar00rootroot00000000000000 #include #include #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" #include "6lowpan.h" #include "iovec.h" int packet_len; uint8_t packet[1280]; struct { char *file; } cases[] = { {"packet4.test"}, }; int parse_packet(char *file) { char buf[127], *pos = buf; uint8_t *packet_cur = packet; FILE *fp = fopen(file, "r"); if (!fp) return -1; while (!feof(fp)) { while (!feof(fp) && isspace(*pos = fgetc(fp))); pos++; while (!feof(fp) && !isspace((*pos++ = fgetc(fp)))); *(pos-1) = '\0'; if (pos > buf + 1) *packet_cur++ = (uint8_t) strtol(buf, NULL, 16); pos = buf; } packet_len = (packet_cur - packet); return 0; } int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(cases) / sizeof(cases[0])); i++) { struct packed_lowmsg lowmsg; struct lowpan_reconstruct recon; struct ieee154_frame_addr frame_address; uint8_t *buf = packet, *frame = packet; int length; int rv; parse_packet(cases[i].file); length = packet_len; print_buffer(packet, packet_len); buf = unpack_ieee154_hdr(buf, &frame_address); length -= buf - frame; lowmsg.data = buf; lowmsg.len = length; lowmsg.headers = getHeaderBitmap(&lowmsg); if (lowmsg.headers == LOWMSG_NALP) { warn("lowmsg NALP!\n"); continue; } buf = getLowpanPayload(&lowmsg); if ((rv = lowpan_recon_start(&frame_address, &recon, buf, length)) < 0) { warn("reconstruction failed!\n"); continue; } if (recon.r_size == recon.r_bytes_rcvd) { printf("recon successful\n"); print_buffer(recon.r_buf, recon.r_size); } else { free(recon.r_buf); } } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 0; } int main() { return run_tests(); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_pack_address.c000066400000000000000000000103741207233610700265000ustar00rootroot00000000000000 #include #include #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" #include "6lowpan.h" char *pack_address(uint8_t *buf, struct in6_addr *addr, int context_match_len, ieee154_addr_t *l2addr, ieee154_panid_t pan, uint8_t *flags); struct { char *in6_addr; int context_match_len; char *l2addr; ieee154_panid_t panid; /* the result of executing the test case */ int result_len; uint8_t result[32]; uint8_t result_rv; } test_cases[] = { // test the link-local address packing // non-RFC4944 address, never packed to less then 16 bits {"fe80::1", 0, "25", 0, 2, {0, 1}, LOWPAN_IPHC_AM_16}, // LL address padded with zeroes, matching L2 address. Not // compressed to zero because not RFC4944 style address {"fe80::1", 0, "1", 0, 2, {0, 1}, LOWPAN_IPHC_AM_16}, // RFC4944 address, matching 16-bit id {"fe80::1:00ff:fe00:1", 0, "1", 1, 0, {0, 0}, LOWPAN_IPHC_AM_0}, // RFC4944 address, matching 16-bit id {"fe80::fdff:00ff:fe00:1", 0, "1", 0xffff, 0, {0, 0}, LOWPAN_IPHC_AM_0}, // RFC4944 address, different 16-bit ID {"fe80::1:00ff:fe00:2", 0, "1", 8, 8, {0, 1, 0, 0xff, 0xfe, 0x0, 0, 02}, LOWPAN_IPHC_AM_64}, // matching with the L2 addr {"fe80::aabb:ccdd:eeff:0011", 0, "a8:bb:cc:dd:ee:ff:00:11", 8, 0, {}, LOWPAN_IPHC_AM_0}, // matching 64-bit L2 addr, but prefix isn't all zero {"fe80::1:aabb:ccdd:eeff:0011", 0, "aa:bb:cc:dd:ee:ff:00:11", 8, 16, {0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11} , LOWPAN_IPHC_AM_128}, {"fe80::226:bbff:fe11:478b", 0, "00:26:bb:ff:fe:11:47:8c", 0, 8, {0x2, 0x26, 0xbb, 0xff, 0xfe, 0x11, 0x47, 0x8b}, LOWPAN_IPHC_AM_64}, // unspecified address {"::", 0, "12", 0, 0, {}, LOWPAN_IPHC_AM_128 | LOWPAN_IPHC_AC_CONTEXT}, // context-based address compression // 64-bit prefix, short id {"2002::1", 64, "12", 1, 2, {0, 1}, LOWPAN_IPHC_AM_16 | LOWPAN_IPHC_AC_CONTEXT}, {"2002::1:1", 64, "12", 1, 8, {0, 0,0,0,0,1,0,1}, LOWPAN_IPHC_AM_64 | LOWPAN_IPHC_AC_CONTEXT}, {"2002::1:1", 112, "12", 1, 2, {0,1}, LOWPAN_IPHC_AM_16 | LOWPAN_IPHC_AC_CONTEXT}, {"2002:1::1:1", 8, "12", 1, 16, {0x20, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01}, LOWPAN_IPHC_AM_128}, {"2002::1:1", 128, "12", 1, 0, {0}, LOWPAN_IPHC_AM_0 | LOWPAN_IPHC_AC_CONTEXT}, // global addresses, derived from L2. // contiki packs this to zero bytes using the L2 info; however hc-06 // is a little vague on this point so I don't do this. We will win fact // decompress that right now. {"2002::226:bbff:fe11:478b", 64, "00:26:bb:ff:fe:11:47:8b", 1, 8, {0x2, 0x26, 0xbb, 0xff, 0xfe, 0x11, 0x47, 0x8b}, LOWPAN_IPHC_AM_64 | LOWPAN_IPHC_AC_CONTEXT}, }; int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(test_cases) / sizeof(test_cases[0])); i++) { uint8_t flags; struct in6_addr addr; uint8_t buf[512], *rv; ieee154_addr_t l2addr; total++; inet_pton6(test_cases[i].in6_addr, &addr); ieee154_parse(test_cases[i].l2addr, &l2addr); ieee154_print(&l2addr, buf, 512); printf("%s\n", buf); printf("in6_addr: %s\n", test_cases[i].in6_addr); rv = pack_address(buf, &addr, test_cases[i].context_match_len, &l2addr, test_cases[i].panid, &flags); printf("flags: 0x%x(0x%x) len: %li\n", flags, test_cases[i].result_rv, rv - buf ); print_buffer(buf, rv - buf); if (test_cases[i].result_len != (rv - buf)) { printf("case %u: result len failed expected: %i got: %li\n", i, test_cases[i].result_len, (rv - buf)); continue; } if (test_cases[i].result_rv != flags) { printf("case %u: desired rv: 0x%x flags: %x\n", i, test_cases[i].result_rv, flags); continue; } if (memcmp(test_cases[i].result, buf, test_cases[i].result_len) != 0) { printf("case %u: buffers did not match\n", i); print_buffer(test_cases[i].result, test_cases[i].result_len); print_buffer(buf, test_cases[i].result_len); continue; } success++; } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; } int main() { return run_tests(); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_pack_multicast.c000066400000000000000000000032441207233610700270560ustar00rootroot00000000000000 #include #include #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" #include "6lowpan.h" char *pack_multicast(char *buf, struct in6_addr *addr, uint8_t *flags); struct { char *addr; /* the result of executing the test case */ int result_len; uint8_t result[16]; int result_dispatch; } test_cases[] = { {"ff02::1", 1, {1}, LOWPAN_IPHC_AM_M_8}, {"ff02::1:1111", 4, {0x02, 0x1, 0x11, 0x11}, LOWPAN_IPHC_AM_M_32}, {"fff2::1:1111", 4, {0xf2, 0x1, 0x11, 0x11}, LOWPAN_IPHC_AM_M_32}, {"fff2::1:fff1:1111", 6, {0xf2, 0x1, 0xff, 0xf1, 0x11, 0x11}, LOWPAN_IPHC_AM_M_48}, {"fff2::1:fff1:1111", 6, {0xf2, 0x1, 0xff, 0xf1, 0x11, 0x11}, LOWPAN_IPHC_AM_M_48}, {"fff2::f001:fff1:1111", 16, {0xff, 0xf2, 0,0,0,0,0,0,0,0, 0xf0, 0x1, 0xff, 0xf1, 0x11, 0x11}, LOWPAN_IPHC_AM_M_128}, }; int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(test_cases) / sizeof(test_cases[0])); i++) { uint8_t buf[512], *rb; struct in6_addr addr; uint8_t dispatch = 0; total ++; scribble(buf, 512); inet_pton6(test_cases[i].addr, &addr); printf("addr: %s\n", test_cases[i].addr); rb = pack_multicast(buf, &addr, &dispatch); print_buffer(buf, rb - buf); if (test_cases[i].result_len != (rb - buf)) continue; if (memcmp(test_cases[i].result, buf, rb - buf) != 0) continue; if (test_cases[i].result_dispatch != dispatch) continue; printf("SUCCESS!\n"); success++; } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; } int main() { return run_tests(); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_pack_nhc_chain.c000066400000000000000000000020011207233610700267510ustar00rootroot00000000000000#include #include #ifdef UNIT_TESTING #include #endif #include "6lowpan.h" #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" struct { uint8_t hdr[128]; } ip_hdrs[] = { {IPV6_DEST, 8, 0,1,2,3,4,5}, {IANA_UDP, 10, 0,1,2,3,4,5,6,7}, }; struct udp_hdr udp = {0xabcd, 0x1234, 512, 0xdead}; struct ip6_packet packet; struct ip_iovec vec[3]; int main() { uint8_t nxt; uint8_t buf[512], result[512], *bufp; int i, len; bufp = buf; packet.ip6_hdr.ip6_nxt = IPV6_HOP; iov_prefix(NULL, &vec[2], (uint8_t *)&udp, 8); iov_prefix(&vec[2], &vec[1], ip_hdrs[1].hdr, 10); iov_prefix(&vec[1], &vec[0], ip_hdrs[0].hdr, 8); packet.ip6_data = vec; len = pack_nhc_chain(&bufp, 512, &packet); printf("[%i] ", len); for (i = 0; i < len; i++) { printf("0x%hhx ", buf[i]); } printf("\n\n"); unpack_nhc_chain(result, 512, &nxt, buf); for (i = 0; i < 26; i++) printf("0x%hhx ", result[i]); printf("\n"); printf("Done!\n"); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_pack_tcfl.c000066400000000000000000000041461207233610700260030ustar00rootroot00000000000000 #include #include #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" #include "6lowpan.h" char *pack_tcfl(uint8_t *buf, struct ip6_hdr *hdr, uint8_t *dispatch) ; struct { uint8_t tc; uint32_t fl; /* the result of executing the test case */ int result_len; uint8_t result[4]; int result_dispatch; } test_cases[] = { // no nothing {0, 0, 0, {}, LOWPAN_IPHC_TF_NONE}, // one ecn bit {0x1, 0, 1, {0x40}, LOWPAN_IPHC_TF_ECN_DSCP}, // both ecn bits {0x3, 0, 1, {0xc0}, LOWPAN_IPHC_TF_ECN_DSCP}, // just DSCP {0xfc, 0, 1, {0x3f}, LOWPAN_IPHC_TF_ECN_DSCP}, // flow label of one {0, 1, 3, {0, 0, 1}, LOWPAN_IPHC_TF_ECN_FL}, // flow label + ECN tests {0, 0xfffff, 3, {0xf, 0xff, 0xff}, LOWPAN_IPHC_TF_ECN_FL}, {3, 0xfffff, 3, {0xcf, 0xff, 0xff}, LOWPAN_IPHC_TF_ECN_FL}, {1, 0xabcde, 3, {0x4a, 0xbc, 0xde}, LOWPAN_IPHC_TF_ECN_FL}, // full thingie {0x4, 0x1, 4, {0x01, 0, 0, 1}, LOWPAN_IPHC_TF_ECN_DSCP_FL}, {0x5, 0x1, 4, {0x41, 0, 0, 1}, LOWPAN_IPHC_TF_ECN_DSCP_FL}, {0xab, 0xcdef6, 4, {0xea, 0xc, 0xde, 0xf6}, LOWPAN_IPHC_TF_ECN_DSCP_FL}, }; int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(test_cases) / sizeof(test_cases[0])); i++) { uint8_t buf[512], *rb; struct ip6_hdr hdr; uint8_t dispatch = 0; uint32_t val; total ++; scribble(buf, 512); val = htonl(0x6 << 28 | ((test_cases[i].tc & 0xff) << 20) | (test_cases[i].fl & 0x000fffff)); hdr.ip6_flow = val; printf("input: 0x%x\n", ntohl(val)); rb = pack_tcfl(buf, &hdr, &dispatch); printf("output length: %li dispatch: 0x%x\n", (rb -buf), dispatch); print_buffer(buf, rb - buf); if (test_cases[i].result_len != (rb - buf)) continue; if (memcmp(test_cases[i].result, buf, rb - buf) != 0) continue; if (test_cases[i].result_dispatch != dispatch) continue; printf("SUCCESS!\n"); success++; } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; } int main() { return run_tests(); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_unpack_address.c000066400000000000000000000070721207233610700270440ustar00rootroot00000000000000 #include #include #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" #include "6lowpan.h" uint8_t *unpack_address(struct in6_addr *addr, uint8_t dispatch, int context, uint8_t *buf, ieee154_addr_t *frame, ieee154_panid_t pan); struct { char *prefix; uint8_t pfx_len; } prefix_options[] = { {"2002::", 64}, {"2002:1:2:3:4:5:6:7", 128}, }; int lowpan_extern_read_context(struct in6_addr *addr, int context) { struct in6_addr ctx; printf("read context: %i (%i)\n", context, prefix_options[context].pfx_len); inet_pton6(prefix_options[context].prefix, &ctx); print_buffer(ctx.s6_addr, 16); memcpy(addr->s6_addr, ctx.s6_addr, prefix_options[context].pfx_len / 8); return prefix_options[context].pfx_len; } int lowpan_extern_match_context(struct in6_addr *addr, UNUSED uint8_t *ctx_id) { } struct { char *address; int dispatch; int context; int len; char buf[32]; char *l2addr; ieee154_panid_t panid; } test_cases[] = { // context-free tests {"fe80::1", LOWPAN_IPHC_AM_16, 0, 2, {0, 1}, "1", 1}, {"fe80::ffff", LOWPAN_IPHC_AM_16, 0, 2, {0xff, 0xff}, "1", 1}, {"fe80::abde:f012", LOWPAN_IPHC_AM_64, 0, 8, {0, 0, 0, 0, 0xab, 0xde, 0xf0, 0x12}, "1", 1}, {"fe80::1234:8765:abde:f012", LOWPAN_IPHC_AM_64, 0, 8, {0x12, 0x34, 0x87, 0x65, 0xab, 0xde, 0xf0, 0x12}, "1", 1}, {"fe80:1234:8765:abde:1234:8765:abde:f012", LOWPAN_IPHC_AM_128, 0, 16, {0xfe, 0x80, 0x12, 0x34, 0x87, 0x65, 0xab, 0xde, 0x12, 0x34, 0x87, 0x65, 0xab, 0xde, 0xf0, 0x12}, "1", 1}, // derived from the MAC address {"fe80::1234:8765:abde:f012", LOWPAN_IPHC_AM_0, 0, 0, {}, "10:34:87:65:ab:de:f0:12", 1}, // RFC4944-style addresses {"fe80::1:00ff:fe00:25", LOWPAN_IPHC_AM_0, 0, 0, {}, "25", 1}, {"fe80::fdff:00ff:fe00:25", LOWPAN_IPHC_AM_0, 0, 0, {}, "25", 0xffff}, {"fe80::fdff:00ff:fe00:abcd", LOWPAN_IPHC_AM_0, 0, 0, {}, "abcd", 0xffff}, // tests using context {"2002::12", LOWPAN_IPHC_AC_CONTEXT | LOWPAN_IPHC_AM_16, 0, 2, {0, 0x12}, "1", 1}, {"2002:1:2:3:4:5:6:7", LOWPAN_IPHC_AC_CONTEXT | LOWPAN_IPHC_AM_0, 1, 0, {}, "1", 1}, {"2002::4:5:6:7", LOWPAN_IPHC_AC_CONTEXT | LOWPAN_IPHC_AM_64, 0, 8, {0,4,0,5,0,6,0,7}, "1", 1}, {"::", LOWPAN_IPHC_AC_CONTEXT | LOWPAN_IPHC_AM_128, 0, 0, {}, "1", 1}, }; int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(test_cases) / sizeof(test_cases[0])); i++) { struct in6_addr addr, correct; uint8_t buf[512]; char *rv; ieee154_addr_t l2addr; total++; inet_pton6(test_cases[i].address, &correct); ieee154_parse(test_cases[i].l2addr, &l2addr); ieee154_print(&l2addr, buf, 512); printf("%s\n", buf); printf("in6_addr: %s\n", test_cases[i].address); rv = unpack_address(&addr, test_cases[i].dispatch, test_cases[i].context, test_cases[i].buf, &l2addr, test_cases[i].panid); inet_ntop6(&addr, buf, 512); printf("result: %s length: %li\n", buf, rv - test_cases[i].buf); if (test_cases[i].len != rv - test_cases[i].buf) { printf("case %u: result len: %li expected: %i\n", i, rv - test_cases[i].buf, test_cases[i].len); continue; } if (memcmp(&addr, &correct, 16) != 0) { printf("case %u: unexpected result\n", i); print_buffer(correct.s6_addr, 16); print_buffer(addr.s6_addr, 16); continue; } success++; } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; } int main() { return run_tests(); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_unpack_ipnh.c000066400000000000000000000045721207233610700263570ustar00rootroot00000000000000 #include #include #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" #include "6lowpan.h" #include "internal.h" struct { uint8_t nxt_hdr; uint16_t unpacked_length; int pack_len; uint8_t pack[2]; int data_length; } test_cases[] = { {IPV6_HOP, 0, 1, {LOWPAN_NHC_IPV6_PATTERN | LOWPAN_NHC_EID_HOP | LOWPAN_NHC_NH}, 8}, {IPV6_MOBILITY, 1, 1, {LOWPAN_NHC_IPV6_PATTERN | LOWPAN_NHC_EID_MOBILE | LOWPAN_NHC_NH}, 13}, {IPV6_IPV6, 14, 1, {LOWPAN_NHC_IPV6_PATTERN | LOWPAN_NHC_EID_IPV6 | LOWPAN_NHC_NH}, 120}, {IPV6_IPV6, 1, 2, {LOWPAN_NHC_IPV6_PATTERN | LOWPAN_NHC_EID_IPV6, IANA_UDP}, 12}, }; int run_tests() { int i, j; int success = 0, total = 0; for (i = 0; i < (sizeof(test_cases) / sizeof(test_cases[0])); i++) { uint8_t nxt_hdr; uint8_t buf[512], result[512]; uint8_t *rv, *pack; total++; memset(buf, 0, 512); /* this fills in pad1 options for any weird sized options */ memcpy(buf, test_cases[i].pack, test_cases[i].pack_len); pack = buf + test_cases[i].pack_len; *pack++ = test_cases[i].data_length; for (j = 12; j < 12 + test_cases[i].data_length - 2; j++) *pack++ = j; printf("INPUT: "); for (j = 0; j < test_cases[i].data_length; j++) printf("0x%x ", buf[j]); printf("\n"); rv = unpack_ipnh(result, sizeof(result), &nxt_hdr, buf); printf("ip6_ext nxt: %i length: %i\n", nxt_hdr, result[1]); for (j = 0; j < (result[1] +1)*8; j++) { printf("0x%x ", result[j]); } printf("\n"); // printf("%i:\n", test_cases[i].unpacked_length); if (test_cases[i].unpacked_length != result[1]) { printf("ERROR: wrong length: %i %i\n", test_cases[i].unpacked_length, result[1]); continue; } if (test_cases[i].nxt_hdr != nxt_hdr) { printf("ERROR: wrong next header: %i %i\n", test_cases[i].nxt_hdr, nxt_hdr); continue; } if (test_cases[i].pack_len == 2 && result[0] != test_cases[i].pack[1]) { printf("ERROR: wrong inline NH\n"); continue; } for (j = 2; j < test_cases[i].data_length; j++) { if (result[j] != j + 10) { printf("ERROR: wrong payload\n"); break; } } success++; printf("\n\n\n"); } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; } int main() { return run_tests(); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_unpack_multicast.c000066400000000000000000000037451207233610700274270ustar00rootroot00000000000000 #include #include #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" #include "6lowpan.h" uint8_t *unpack_multicast(struct in6_addr *addr, uint8_t dispatch, int context, uint8_t *buf); struct { char *prefix; uint8_t pfx_len; } prefix_options[] = { {"2002::", 64}, {"2002:1:2:3:4:5:6:7", 128}, }; int lowpan_extern_read_context(struct in6_addr *addr, int context) { struct in6_addr ctx; inet_pton6(prefix_options[context].prefix, &ctx); memcpy(addr->s6_addr, ctx.s6_addr, prefix_options[context].pfx_len / 8); } int lowpan_extern_match_context(struct in6_addr *addr, UNUSED uint8_t *ctx_id) { } struct { char *address; int dispatch; int context; int len; uint8_t buf[32]; } test_cases[] = { {"ff02::1", LOWPAN_IPHC_AM_M | LOWPAN_IPHC_AM_M_8, 0, 1, {1}}, {"ff18::ab:cdef:1234", LOWPAN_IPHC_AM_M | LOWPAN_IPHC_AM_M_48, 0, 6, {0x18, 0xab, 0xcd, 0xef, 0x12, 0x34}}, {"ffff::ef:1234", LOWPAN_IPHC_AM_M | LOWPAN_IPHC_AM_M_32, 0, 4, {0xff, 0xef, 0x12, 0x34}}, {"2002:1:2:3:4:5:6:7", LOWPAN_IPHC_AM_M | LOWPAN_IPHC_AM_M_128, 0, 16, {0x20, 0x02, 0,1,0,2,0,3,0,4,0,5,0,6,0,7}}, }; int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(test_cases) / sizeof(test_cases[0])); i++) { struct in6_addr addr, correct; uint8_t buf[512]; uint8_t *rv; total++; inet_pton6(test_cases[i].address, &correct); printf("in6_addr: %s\n", test_cases[i].address); rv = unpack_multicast(&addr, test_cases[i].dispatch, test_cases[i].context, test_cases[i].buf); inet_ntop6(&addr, buf, 512); printf("result: %s length: %li\n", buf, rv - test_cases[i].buf); if (test_cases[i].len != rv - test_cases[i].buf) continue; if (memcmp(&addr, &correct, 16) != 0) continue; success++; } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; } int main() { return run_tests(); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_unpack_tcfl.c000066400000000000000000000027561207233610700263530ustar00rootroot00000000000000 #include #include #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" #include "6lowpan.h" uint8_t *unpack_tcfl(struct ip6_hdr *hdr, uint8_t dispatch, uint8_t *buf); struct { uint32_t result; /* the result of executing the test case */ uint8_t test_dispatch; int test_len; uint8_t test[4]; } test_cases[] = { {0x60000000, LOWPAN_IPHC_TF_NONE, 0, {}}, {0x60000000, LOWPAN_IPHC_TF_NONE | ~LOWPAN_IPHC_TF_MASK, 0, {}}, // ECN bit {0x60100000, LOWPAN_IPHC_TF_ECN_DSCP, 1, {0x40}}, // ecn and DSCP {0x6ab00000, LOWPAN_IPHC_TF_ECN_DSCP, 1, {0xea}}, // ECN + FL {0x60301234, LOWPAN_IPHC_TF_ECN_FL, 3, {0xc0, 0x12, 0x34}}, // full {0x6f012345, LOWPAN_IPHC_TF_ECN_DSCP_FL, 4, {0x3c, 0x01, 0x23, 0x45}}, }; int run_tests() { int i; int success = 0, total = 0; for (i = 0; i < (sizeof(test_cases) / sizeof(test_cases[0])); i++) { struct ip6_hdr hdr; uint8_t *rb; total ++; rb = unpack_tcfl(&hdr, test_cases[i].test_dispatch, test_cases[i].test); printf("result: 0x%x correct: 0x%x\n", ntohl(hdr.ip6_flow), test_cases[i].result); printf("length: %li\n", rb - test_cases[i].test); if (test_cases[i].test_len != rb - test_cases[i].test) continue; if (test_cases[i].result != ntohl(hdr.ip6_flow)) continue; success ++; } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; } int main() { return run_tests(); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/tests/test_unpack_udp.c000066400000000000000000000047731207233610700262140ustar00rootroot00000000000000 #include #include #include "Ieee154.h" #include "ip.h" #include "lib6lowpan.h" #include "nwbyte.h" #include "6lowpan.h" uint8_t *unpack_udp(uint8_t *dest, uint8_t *nxt_hdr, uint8_t *buf); struct { struct udp_hdr result; uint8_t pack_len; uint8_t pack[10]; } test_cases[] = { { {0xcdab, 0x3412, 0, 0}, 5, {LOWPAN_NHC_UDP_PATTERN | LOWPAN_NHC_UDP_CKSUM | LOWPAN_NHC_UDP_PORT_FULL, 0xab, 0xcd, 0x12, 0x34}}, { {0xcdab, 0x3412, 0, 0xdead}, 7, {LOWPAN_NHC_UDP_PATTERN | LOWPAN_NHC_UDP_PORT_FULL, 0xab, 0xcd, 0x12, 0x34, 0xad, 0xde}}, { {0xabcd, 0x12f0, 0, 0}, 4, {LOWPAN_NHC_UDP_PATTERN | LOWPAN_NHC_UDP_CKSUM | LOWPAN_NHC_UDP_PORT_SRC_FULL, 0xcd, 0xab, 0x12}}, { {0xabf0, 0x3412, 0, 0}, 4, {LOWPAN_NHC_UDP_PATTERN | LOWPAN_NHC_UDP_CKSUM | LOWPAN_NHC_UDP_PORT_DST_FULL, 0xab, 0x12, 0x34}}, { {0xbff0, 0xbaf0, 0, 0}, 2, {LOWPAN_NHC_UDP_PATTERN | LOWPAN_NHC_UDP_CKSUM | LOWPAN_NHC_UDP_PORT_SHORT, 0xfa}}, { {0xbff0, 0xbaf0, 0, 0xdead}, 4, {LOWPAN_NHC_UDP_PATTERN | LOWPAN_NHC_UDP_PORT_SHORT, 0xfa, 0xad, 0xde}}, { {0xabcd, 0x12f0, 0, 0xdead}, 6, {LOWPAN_NHC_UDP_PATTERN | LOWPAN_NHC_UDP_PORT_SRC_FULL, 0xcd, 0xab, 0x12, 0xad, 0xde}}, }; int run_tests() { int i, j; int success = 0, total = 0; for (i = 0; i < (sizeof(test_cases) / sizeof(test_cases[0])); i++) { uint8_t nxt_hdr = 0; uint8_t result[512]; uint8_t *rv; struct udp_hdr *udp = (struct udp_hdr *)result; total++; rv = unpack_udp(result, &nxt_hdr, test_cases[i].pack); if (test_cases[i].pack_len != rv - test_cases[i].pack) { printf("ERROR: wrong unpack length: %li %p %p\n", (rv - test_cases[i].pack), test_cases[i].pack, rv); continue; } if (test_cases[i].result.srcport != udp->srcport) { printf("ERROR: wrong srcport\n"); continue; } if (test_cases[i].result.dstport != udp->dstport) { printf("ERROR: wrong dstport\n"); continue; } if (test_cases[i].result.len != udp->len) { printf("ERROR: wrong length\n"); continue; } if (test_cases[i].result.chksum != udp->chksum) { printf("ERROR: wrong chksum: 0x%x 0x%x\n", test_cases[i].result.chksum, udp->chksum); continue; } if (nxt_hdr != IANA_UDP) { printf("ERROR: nxt_hdr should be UDP! was 0x%02x\n", nxt_hdr); continue; } success++; } printf("%s: %i/%i tests succeeded\n", __FILE__, success, total); if (success == total) return 0; return 1; } int main() { return run_tests(); } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/trace/000077500000000000000000000000001207233610700226015ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/trace/Makefile.am000066400000000000000000000003161207233610700246350ustar00rootroot00000000000000 noinst_PROGRAMS=compress decompress CFLAGS += -I.. -I../.. -I../../../../../../tos/types -DPC compress_SOURCES=compress.c ../utility.c decompress_SOURCES=decompress.c ../utility.c LDADD=../lib6lowpan.a tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/trace/compress.c000066400000000000000000000065211207233610700246040ustar00rootroot00000000000000 #include #include #include #include "../lib6lowpan-includes.h" #include "../ieee154_header.h" #include "../lib6lowpan.h" #include "../ip_malloc.h" uint8_t *cur; uint8_t fragment[100]; int lowpan_extern_read_context(struct in6_addr *addr, int context) { memset(addr->s6_addr, 0, 0); addr->s6_addr16[0] = 0xaaaa; return 64; } int lowpan_extern_match_context(struct in6_addr *addr, UNUSED uint8_t *ctx_id) { return 0; } struct ip_iovec *iov_shorten(struct ip_iovec *v, int off) { int cur_off = 0; struct ip_iovec *rv = malloc(sizeof(struct ip_iovec)); while (v != NULL && cur_off + v->iov_len <= off) { cur_off += v->iov_len; v = v->iov_next; } if (v == NULL) return NULL; if (off == cur_off) return v; rv->iov_base = &((uint8_t *)v->iov_base)[off - cur_off]; rv->iov_len = v->iov_len - (off - cur_off); rv->iov_next = v->iov_next; return rv; } int main(int argc, char **argv) { struct ieee154_frame_addr frame_address; struct lowpan_reconstruct recon; struct lowpan_ctx ctx; struct ip6_packet pkt; char print_buf[256]; int idx = 0, rv; char c, val; struct ip_iovec *v, *tail; //memset(frame, 0, sizeof(frame)); ip_malloc_init(); /* read destination */ cur = print_buf; while ((c = getc(stdin)) != '\n') *cur++ = c; *cur++ = '\0'; ieee154_parse(print_buf, &frame_address.ieee_src); /* read source */ cur = print_buf; while ((c = getc(stdin)) != '\n') *cur++ = c; *cur++ = '\0'; ieee154_parse(print_buf, &frame_address.ieee_dst); frame_address.ieee_dstpan = 0x22; v = malloc(sizeof(struct ip_iovec)); v->iov_base = malloc(1500); v->iov_len = 0; v->iov_next = NULL; tail = v; cur = v->iov_base; while ((c = getc(stdin)) != EOF) { c = tolower(c); if (c >= 'a' && c <= 'f'){ c = c - 'a' + 10; } else if (c >= '0' && c <= '9') { c = c - '0'; } else if (c == '\n' || c == '\r') { if (v->iov_len > 0) { fprintf(stderr, "Making new (%i)\n", v->iov_len); struct ip_iovec *v2 = malloc(sizeof(struct ip_iovec)); v2->iov_next = NULL; v2->iov_len = 0; v2->iov_base = malloc(1500); tail->iov_next = v2; tail = tail->iov_next; cur = tail->iov_base; } continue; } else continue; if (idx++ % 2 == 0) { *cur |= c << 4; } else { *cur++ |= c; tail->iov_len ++; } } ieee154_print(&frame_address.ieee_src, print_buf, sizeof(print_buf)); fprintf(stderr, "src: %s", print_buf); ieee154_print(&frame_address.ieee_dst, print_buf, sizeof(print_buf)); fprintf(stderr, " dest: %s\n", print_buf); //fprintf(stderr, "packet [%li]\n", cur - frame); //fprint_buffer(stderr, frame, cur - frame); fprintf(stderr, "\n"); if (iov_len(v) < sizeof(struct ip6_hdr)) return 1; memset(&ctx, 0, sizeof(ctx)); iov_read(v, 0, sizeof(struct ip6_hdr), &pkt.ip6_hdr); pkt.ip6_data = iov_shorten(v, sizeof(struct ip6_hdr)); pkt.ip6_hdr.ip6_plen = htons(iov_len(pkt.ip6_data)); // iov_print(v); while ((rv = lowpan_frag_get(fragment, sizeof(fragment), &pkt, &frame_address, &ctx)) > 0) { fragment[0] = rv - 1; /* set the 802.15.4 length */ print_buffer_bare(fragment, rv); fprintf(stderr, "fragment [%i]\n", rv); fprint_buffer(stderr, fragment, rv); printf("\n"); } } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/trace/decompress.c000066400000000000000000000042651207233610700251200ustar00rootroot00000000000000 #include #include #include #include "../lib6lowpan-includes.h" #include "../ieee154_header.h" #include "../lib6lowpan.h" #include "../ip_malloc.h" uint8_t frame[1500]; int lowpan_extern_read_context(struct in6_addr *addr, int context) { memset(addr->s6_addr, 0, 0); addr->s6_addr16[0] = 0xaaaa; return 64; } int lowpan_extern_match_context(struct in6_addr *addr, UNUSED uint8_t *ctx_id) { return 0; } int read_packet(char *buf, int len) { char c; char *start = buf; int idx = 0; memset(buf, 0, len); while (len > 0 && (c = getc(stdin)) != EOF) { c = tolower(c); if (c >= 'a' && c <= 'f') c = c - 'a' + 10; else if (c >= '0' && c <= '9') c = c - '0'; else if (c == '\n' || c == '\r') break; else continue; if (idx++ % 2 == 0) { *buf |= c << 4; } else { *buf++ |= c; len --; } } if (c == EOF) return -1; else return buf - start ; } int main(int argc, char **argv) { struct ieee154_frame_addr frame_address; struct lowpan_reconstruct recon; char print_buf[256]; uint8_t *cur; int idx = 0, rv; ip_malloc_init(); memset(&recon, 0, sizeof(recon)); while ((rv = read_packet(frame, sizeof(frame))) > 0) { printf("packet [%i]\n", rv); print_buffer(frame, rv); printf("\n"); cur = unpack_ieee154_hdr(frame, &frame_address); ieee154_print(&frame_address.ieee_src, print_buf, sizeof(print_buf)); printf("802.15.4 source: %s\n", print_buf); ieee154_print(&frame_address.ieee_dst, print_buf, sizeof(print_buf)); printf("802.15.4 dest: %s\n", print_buf); printf("802.15.4 destpan: 0x%x\n", letohs(frame_address.ieee_dstpan)); printf("\n"); if (recon.r_bytes_rcvd == 0) { rv = lowpan_recon_start(&frame_address, &recon, cur, rv - (cur - frame) ); } else { rv = lowpan_recon_add(&recon, cur, rv - (cur - frame)); } printf("[%i] %i %i\n", rv, recon.r_size, recon.r_bytes_rcvd); if (recon.r_size == recon.r_bytes_rcvd) { printf("reconstruction complete [%i]\n", recon.r_bytes_rcvd); print_buffer(recon.r_buf, recon.r_size); ip_free(recon.r_buf); } } return 0; } tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/trace/packet.trace000066400000000000000000000003411207233610700250660ustar00rootroot0000000000000061 41C8 83 CDAB FFFF 01 01010001 7412007A 3B3A029B 012C0600 00010010 020000AA AA000000 00000000 00000000 00000104 0E00080C 0A030001 00000100 FFFFFF08 1E404000 00000000 00000000 000000AA AA000000 00000000 00000000 00000037 02 tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/trace/uncompressed.trace000066400000000000000000000005731207233610700263350ustar00rootroot0000000000000001:01:01:00:01:74:12:00 0xffff 60 00 00 00 00 4c 3a 40 fe 80 00 00 00 00 00 00 03 01 01 00 01 74 12 00 ff 02 00 00 00 00 00 00 00 00 00 00 00 00 00 02 9b 01 2c 05 00 00 01 00 10 03 00 00 aa aa 00 00 00 00 00 00 00 00 00 00 00 00 00 01 04 0e 00 08 0c 0a 03 00 01 00 00 01 00 ff ff ff 08 1e 40 40 00 00 00 00 00 00 00 00 00 00 00 00 aa aa 00 00 00 00 00 00 00 00 00 00 00 00 00 00 tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/trace/uncompressed2.trace000066400000000000000000000006231207233610700264130ustar00rootroot0000000000000001:01:01:00:01:74:12:00 0xffff 60 00 00 00 00 54 00 40 fe 80 00 00 00 00 00 00 01 01 01 00 01 74 12 00 ff 02 00 00 00 00 00 00 00 00 00 00 00 00 00 02 3a 08 f3 06 00 01 ff ff 9b 01 2c 05 00 00 01 00 10 03 00 00 aa aa 00 00 00 00 00 00 00 00 00 00 00 00 00 01 04 0e 00 08 0c 0a 03 00 01 00 00 01 00 ff ff ff 08 1e 40 40 00 00 00 00 00 00 00 00 00 00 00 00 aa aa 00 00 00 00 00 00 00 00 00 00 00 00 00 00 tinyos-2.1.2+dfsg/support/sdk/c/blip/lib6lowpan/utility.c000066400000000000000000000115511207233610700233550ustar00rootroot00000000000000 #include #include #include #include #include "lib6lowpan-includes.h" #include "ip.h" #define TO_CHAR(X) (((X) < 10) ? ('0' + (X)) : ('a' + ((X) - 10))) #define CHAR_VAL(X) (((X) >= '0' && (X) <= '9') ? ((X) - '0') : \ (((X) >= 'A' && (X) <= 'F') ? ((X) - 'A' + 10) : ((X) - 'a' + 10))) void inet_pton6(char *addr, struct in6_addr *dest) { uint16_t cur = 0; char *p = addr; uint8_t block = 0, shift = 0; if (addr == NULL || dest == NULL) return; memset(dest->s6_addr, 0, 16); // first fill in from the front while (*p != '\0') { if (*p != ':') { cur <<= 4; cur |= CHAR_VAL(*p); } else { dest->s6_addr16[block++] = htons(cur); cur = 0; } p++; if (*p == '\0') { dest->s6_addr16[block++] = htons(cur); return; } if (*(p - 1) == ':' && *p == ':') { break; } } // we must have hit a "::" which means we need to start filling in from the end. block = 7; cur = 0; while (*p != '\0') p++; p--; // now pointing at the end of the address string while (p > addr) { if (*p != ':') { cur |= (CHAR_VAL(*p) << shift); shift += 4; } else { dest->s6_addr16[block--] = htons(cur); cur = 0; shift = 0; } p --; if (*(p + 1) == ':' && *p == ':') break; } } int inet_ntop6(struct in6_addr *addr, char *buf, int cnt) { uint16_t block; char *end = buf + cnt; int i, j, compressed = 0; for (j = 0; j < 8; j++) { if (buf > end - 8) goto done; block = ntohs(addr->s6_addr16[j]); for (i = 4; i <= 16; i+=4) { if (block > (0xffff >> i) || (compressed == 2 && i == 16)) { *buf++ = TO_CHAR((block >> (16 - i)) & 0xf); } } if (addr->s6_addr16[j] == 0 && compressed == 0) { *buf++ = ':'; compressed++; } if (addr->s6_addr16[j] != 0 && compressed == 1) compressed++; if (j < 7 && compressed != 1) *buf++ = ':'; } if (compressed == 1) *buf++ = ':'; done: *buf++ = '\0'; return buf - (end - cnt); } uint16_t ieee154_hashaddr(ieee154_addr_t *addr) { if (addr->ieee_mode == IEEE154_ADDR_SHORT) { return addr->i_saddr; } else if (addr->ieee_mode == IEEE154_ADDR_EXT) { uint16_t i, hash = 0, *current = (uint16_t *)addr->i_laddr.data; for (i = 0; i < 4; i++) hash += *current ++; return hash; } else { return 0; } } #ifndef PC uint32_t ntohl(uint32_t i) { uint16_t lo = (uint16_t)i; uint16_t hi = (uint16_t)(i >> 16); lo = (lo << 8) | (lo >> 8); hi = (hi << 8) | (hi >> 8); return (((uint32_t)lo) << 16) | ((uint32_t)hi); } uint8_t *ip_memcpy(uint8_t *dst0, const uint8_t *src0, uint16_t len) { uint8_t *dst = (uint8_t *) dst0; uint8_t *src = (uint8_t *) src0; uint8_t *ret = dst0; for (; len > 0; len--) *dst++ = *src++; return ret; } #endif #ifdef PC char *strip(char *buf) { char *rv; while (isspace(*buf)) buf++; rv = buf; buf += strlen(buf) - 1; while (isspace(*buf)) { *buf = '\0'; buf--; } return rv; } int ieee154_parse(char *in, ieee154_addr_t *out) { int i; long val; char *endp = in; long saddr = strtol(in, &endp, 16); // fprintf(stderr, "ieee154_parse: %s, %c\n", in, *endp); if (*endp == ':') { endp = in; // must be a long address for (i = 0; i < 8; i++) { val = strtol(endp, &endp, 16); out->i_laddr.data[7-i] = val; endp++; } out->ieee_mode = IEEE154_ADDR_EXT; } else { out->i_saddr = htole16(saddr); out->ieee_mode = IEEE154_ADDR_SHORT; } return 0; } int ieee154_print(ieee154_addr_t *in, char *out, size_t cnt) { int i; char *cur = out; switch (in->ieee_mode) { case IEEE154_ADDR_SHORT: snprintf(out, cnt, "IEEE154_ADDR_SHORT: 0x%x", in->i_saddr); break; case IEEE154_ADDR_EXT: cur += snprintf(out, cnt, "IEEE154_ADDR_EXT: "); for (i = 0; i < 8; i++) { cur += snprintf(cur, cnt - (cur - out), "%02x", in->i_laddr.data[i]); if (i < 7) *cur++ = ':'; } break; } return 0; } void fprint_buffer(FILE *fp, uint8_t *buf, int len) { int i; for (i = 0; i < len; i++) { if ((i % 16) == 0 && i > 0) fprintf(fp, "\n"); if (i % 16 == 0) { fprintf(fp, "%i:\t", i); } fprintf(fp, "%02x ", buf[i]); } fprintf(fp, "\n"); } void print_buffer(uint8_t *buf, int len) { fprint_buffer(stdout, buf, len); } void print_buffer_bare(uint8_t *buf, int len) { while (len--) { printf("%02x ", *buf++); } } void scribble(uint8_t *buf, int len) { int i; for (i = 0; i < len; i++) { buf[i] = rand(); } } void iov_print(struct ip_iovec *iov) { struct ip_iovec *cur = iov; while (cur != NULL) { int i; printf("iovec (%p, %i) ", cur, (int)cur->iov_len); for (i = 0; i < cur->iov_len; i++) { printf("%02hhx ", cur->iov_base[i]); } printf("\n"); cur = cur->iov_next; } } #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/libtcp/000077500000000000000000000000001207233610700207035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/blip/libtcp/Makefile000066400000000000000000000010561207233610700223450ustar00rootroot00000000000000 GCC=gcc CFLAGS=-I../include -I../driver/ -DPC -g -Wall all: test_client test_server test_circ: test_circ.c circ.c circ.h $(GCC) -o $@ $^ $(CFLAGS) test_client: test_client.c # tcplib.h tcplib.c circ.c $(GCC) -o $@ $< $(CFLAGS) # $(GCC) -o $@ $< tcplib.c circ.c ../driver/tun_dev.c ../lib6lowpan/ip_malloc.c ../lib6lowpan/in_cksum.c $(CFLAGS) test_server: test_server.c tcplib.h tcplib.c circ.c $(GCC) -o $@ $< tcplib.c circ.c ../driver/tun_dev.c ../lib6lowpan/ip_malloc.c ../lib6lowpan/in_cksum.c $(CFLAGS) clean: rm -rf test_server test_circ tinyos-2.1.2+dfsg/support/sdk/c/blip/libtcp/circ.c000066400000000000000000000103551207233610700217730ustar00rootroot00000000000000/* * "Copyright (c) 2008, 2009 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #include #include #include #include "tcplib.h" struct circ_buf { uint8_t *data_start; uint8_t *data_head; uint16_t data_len; uint32_t head_seqno; }; int circ_buf_init(void *data, int len, uint32_t seqno) { struct circ_buf *b = (struct circ_buf *)data; if (len < sizeof(struct circ_buf)) return -1; b->data_head = b->data_start = (uint8_t *)(b + 1); b->data_len = len - sizeof(struct circ_buf); b->head_seqno = seqno; return 0; } uint32_t circ_get_seqno(void *buf) { struct circ_buf *b = (struct circ_buf *)buf; return b->head_seqno; } void circ_set_seqno(void *buf, uint32_t seqno) { struct circ_buf *b = (struct circ_buf *)buf; b->head_seqno = seqno; } static void get_ptr_off_1(struct circ_buf *b, uint32_t sseqno, int len, uint8_t **writeptr, int *w_len) { uint8_t *endptr = b->data_start + b->data_len; int offset; *writeptr = NULL; *w_len = len; /* write up to either the end of the buffer */ offset = sseqno - b->head_seqno; if (b->data_head + offset < endptr) { *writeptr = b->data_head + offset; } else { offset -= (endptr - b->data_head); *writeptr = b->data_start + offset; } if (*writeptr + *w_len > endptr) { *w_len = endptr - *writeptr; } } int circ_shorten_head(void *buf, uint32_t seqno) { struct circ_buf *b = (struct circ_buf *)buf; int offset = seqno - b->head_seqno; b->head_seqno = seqno; b->data_head += offset; while (b->data_head > b->data_start + b->data_len) b->data_head -= b->data_len; return 0; } int circ_buf_read(void *buf, uint32_t sseqno, uint8_t *data, int len) { struct circ_buf *b = (struct circ_buf *)buf; uint8_t *readptr; int r_len, rc = 0; get_ptr_off_1(b, sseqno, len, &readptr, &r_len); memcpy(data, readptr, r_len); data += r_len; rc += r_len; if (r_len != len) { readptr = b->data_start; r_len = min(len - r_len, b->data_head - b->data_start); memcpy(data, readptr, r_len); rc += r_len; } return rc; } int circ_buf_write(char *buf, uint32_t sseqno, uint8_t *data, int len) { struct circ_buf *b = (struct circ_buf *)buf; uint8_t *writeptr; int w_len; /* we can't write any bytes since we're trying to write too far ahead */ if (sseqno > b->head_seqno + b->data_len) return -1; if (len == 0) return 0; get_ptr_off_1(b, sseqno, len, &writeptr, &w_len); memcpy(writeptr, data, w_len); data += w_len; if (w_len != len) { writeptr = b->data_start; w_len = min(len - w_len, b->data_head - b->data_start); memcpy(writeptr, data, w_len); } return 0; } #ifdef PC void circ_buf_dump(void *buf) { struct circ_buf *b = (struct circ_buf *)buf; uint8_t *d; int i; /* printf("circ buf: %p\n\tmap: %p\n\tmap_len: %i\n\tdata_start: %p\n\t" */ /* "data_head: %p\n\tdata_len: %i\n\thead_seqno: %i\n", */ /* b, b->map, */ /* b->map_len, b->data_start, b->data_head, b->data_len, b->head_seqno); */ for (d = b->data_start; d < b->data_start + b->data_len; d++) { if (d == b->data_head) putc('|', stdout); printf("%2.x ", *d); } putc('\n', stdout); } #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/libtcp/circ.h000066400000000000000000000032411207233610700217740ustar00rootroot00000000000000/* * "Copyright (c) 2008, 2009 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #ifndef __CIRC_H_ #define __CIRC_H_ #include int circ_buf_init(void *data, int len, uint32_t seqno); int circ_buf_write(char *buf, uint32_t sseqno, uint8_t *data, int len); int circ_buf_read(void *buf, uint32_t sseqno, uint8_t *data, int len); int circ_shorten_head(void *buf, uint32_t seqno); /* read from the head of the buffer, moving the data pointer forward */ // int circ_buf_read_head(char *buf, char **data); void circ_buf_dump(void *buf); uint32_t circ_get_seqno(void *buf); void circ_set_seqno(void *buf, uint32_t seqno); #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/libtcp/tcplib.c000066400000000000000000000565501207233610700223370ustar00rootroot00000000000000/* * "Copyright (c) 2008, 2009 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ /* A nonblocking library-based implementation of TCP * * There are some things like timers which need to be handled * externally with callbacks. * * @author Stephen Dawson-Haggerty */ #include #include #include "lib6lowpan/ip_malloc.h" #include "lib6lowpan/in_cksum.h" #include "lib6lowpan/6lowpan.h" #include "lib6lowpan/ip.h" #include "libtcp/tcplib.h" #include "libtcp/circ.h" static struct tcplib_sock *conns = NULL; #define ONE_SEGMENT(X) ((X)->mss) #ifdef PC uint16_t alloc_local_port() { return (time(NULL) & 0xffff) | 0x8000; } #else uint16_t alloc_local_port() { return 21310; } #endif static inline void conn_add_once(struct tcplib_sock *sock) { struct tcplib_sock *iter; for (iter = conns; iter != NULL; iter = iter->next) { if (iter == sock) break; } if (iter == NULL) { sock->next = conns; conns = sock; } } static int isInaddrAny(struct in6_addr *addr) { int i; for (i = 0; i < 8; i++) if (addr->s6_addr16[i] != 0) break; if (i != 8) return 0; return 1; } #ifdef PC #include void print_conn(struct tcplib_sock *sock) { char addr_buf[32]; printf("tcplib socket state: %i:\n", sock->state); inet_ntop(AF_INET6, sock->l_ep.sin6_addr.s6_addr, addr_buf, 32); printf(" local ep: %s port: %u\n", addr_buf, ntohs(sock->l_ep.sin6_port)); inet_ntop(AF_INET6, sock->r_ep.sin6_addr.s6_addr, addr_buf, 32); printf(" remote ep: %s port: %u\n", addr_buf, ntohs(sock->r_ep.sin6_port)); printf(" tx buf length: %i\n", sock->tx_buf_len); } void print_headers(struct ip6_hdr *iph, struct tcp_hdr *tcph) { char addr_buf[32]; printf("headers ip length: %i:\n", ntohs(iph->ip6_plen)); inet_ntop(AF_INET6, iph->ip6_src.s6_addr, addr_buf, 32); printf(" source: %s port: %u\n", addr_buf, ntohs(tcph->srcport)); inet_ntop(AF_INET6, iph->ip6_dst.s6_addr, addr_buf, 32); printf(" remote ep: %s port: %u\n", addr_buf, ntohs(tcph->dstport)); printf(" tcp seqno: %u ackno: %u\n", ntohl(tcph->seqno), ntohl(tcph->ackno)); } #else #undef printf #define printf(FMT, args ...) ; #endif static struct tcplib_sock *conn_lookup(struct ip6_hdr *iph, struct tcp_hdr *tcph) { struct tcplib_sock *iter; //printf("looking up conns: %p %p\n", iph, tcph); // print_headers(iph, tcph); for (iter = conns; iter != NULL; iter = iter->next) { // print_conn(iter); printf("conn lport: %i\n", ntohs(iter->l_ep.sin6_port)); if (((memcmp(iph->ip6_dst.s6_addr, iter->l_ep.sin6_addr.s6_addr, 16) == 0) || isInaddrAny(&iter->l_ep.sin6_addr)) && tcph->dstport == iter->l_ep.sin6_port && (iter->r_ep.sin6_port == 0 || (memcmp(&iph->ip6_src, &iter->r_ep.sin6_addr, 16) == 0 && tcph->srcport == iter->r_ep.sin6_port))) return iter; } return NULL; } static int conn_checkport(uint16_t port) { struct tcplib_sock *iter; for (iter = conns; iter != NULL; iter = iter->next) { if (iter->l_ep.sin6_port == port) return -1; } return 0; } struct tcp_hdr *find_tcp_hdr(struct ip6_packet *msg) { if (msg->ip6_hdr.ip6_nxt == IANA_TCP) { return (struct tcp_hdr *)msg->ip6_data->iov_base; } return NULL; } static struct ip6_packet *get_ipmsg(int plen) { int alen = sizeof(struct ip6_packet) + sizeof(struct tcp_hdr) + sizeof(struct ip_iovec) + plen; char *buf = ip_malloc(alen); struct ip6_packet *msg = (struct ip6_packet *)buf; struct ip_iovec *iov = (struct ip_iovec *)(buf + alen - sizeof(struct ip_iovec)); if (buf == NULL) return NULL; memset(msg, 0, sizeof(struct ip6_packet) + sizeof(struct tcp_hdr)); msg->ip6_hdr.ip6_nxt = IANA_TCP; msg->ip6_hdr.ip6_plen = htons(sizeof(struct tcp_hdr) + plen); msg->ip6_data = iov; iov->iov_next = NULL; iov->iov_len = plen + sizeof(struct tcp_hdr); iov->iov_base = (void *)(msg + 1); return msg; } static void __tcplib_send(struct tcplib_sock *sock, struct ip6_packet *msg) { struct tcp_hdr *tcph = find_tcp_hdr(msg); if (tcph == NULL) return; memcpy(&msg->ip6_hdr.ip6_dst, &sock->r_ep.sin6_addr, 16); sock->flags &= ~TCP_ACKPENDING; // sock->ackno = ntohl(tcph->ackno); printf("srcprt: %hu dstprt: %hu\n", ntohs(sock->l_ep.sin6_port), ntohs(sock->r_ep.sin6_port)); tcph->srcport = sock->l_ep.sin6_port; tcph->dstport = sock->r_ep.sin6_port; tcph->offset = sizeof(struct tcp_hdr) * 4; tcph->window = htons(sock->my_wind); tcph->chksum = 0; tcph->urgent = 0; tcplib_send_out(msg, tcph); } static void tcplib_send_ack(struct tcplib_sock *sock, int fin_seqno, uint8_t flags) { struct ip6_packet *msg = get_ipmsg(0); printf("sending ACK\n"); if (msg != NULL) { struct tcp_hdr *tcp_rep = (struct tcp_hdr *)(msg + 1); tcp_rep->flags = flags; tcp_rep->seqno = htonl(sock->seqno); tcp_rep->ackno = htonl(sock->ackno + (fin_seqno ? 1 : 0)); printf("sending ACK seqno: %u ackno: %u\n", ntohl(tcp_rep->seqno), ntohl(tcp_rep->ackno)); __tcplib_send(sock, msg); ip_free(msg); } else { printf("Could not send ack-- no memory!\n"); } } static void tcplib_send_rst(struct ip6_hdr *iph, struct tcp_hdr *tcph) { struct ip6_packet *msg = get_ipmsg(0); if (msg != NULL) { struct tcp_hdr *tcp_rep = (struct tcp_hdr *)(msg + 1); memcpy(&msg->ip6_hdr.ip6_dst, &iph->ip6_src, 16); tcp_rep->flags = TCP_FLAG_RST | TCP_FLAG_ACK; tcp_rep->ackno = htonl(ntohl(tcph->seqno) + 1); tcp_rep->seqno = tcph->ackno;; tcp_rep->srcport = tcph->dstport; tcp_rep->dstport = tcph->srcport; tcp_rep->offset = sizeof(struct tcp_hdr) * 4; tcp_rep->window = 0; tcp_rep->chksum = 0; tcp_rep->urgent = 0; tcplib_send_out(msg, tcp_rep); ip_free(msg); } } /* send all the data in the tx buffer, starting at sseqno */ static int tcplib_output(struct tcplib_sock *sock, uint32_t sseqno) { // the output size is the minimum of the advertised window and the // conjestion window. of course, if we have less data we send even // less. int seg_size = min(sock->seqno - sseqno, sock->r_wind); printf("r_wind: %i\n", sock->r_wind); seg_size = min(seg_size, sock->cwnd); while (seg_size > 0 && sock->seqno > sseqno) { // printf("sending seg_size: %i\n", seg_size); struct ip6_packet *msg = get_ipmsg(seg_size); struct tcp_hdr *tcph; uint8_t *data; if (msg == NULL) return -1; tcph = (struct tcp_hdr *)(msg + 1); data = (uint8_t *)(tcph + 1); tcph->flags = TCP_FLAG_ACK; tcph->seqno = htonl(sseqno); tcph->ackno = htonl(sock->ackno); printf("tcplib_output: seqno: %u ackno: %u len: %i headno: %u\n", ntohl(tcph->seqno), ntohl(tcph->ackno), seg_size, circ_get_seqno(sock->tx_buf)); if (seg_size != circ_buf_read(sock->tx_buf, sseqno, data, seg_size)) { printf("WARN: circ could not read!\n"); } __tcplib_send(sock, msg); ip_free(msg); sseqno += seg_size; seg_size = min(sock->seqno - sseqno, sock->mss); } return 0; } int tcplib_init_sock(struct tcplib_sock *sock) { memset(sock, 0, sizeof(struct tcplib_sock) - sizeof(struct tcplib_sock *)); sock->mss = 200; sock->my_wind = 200; sock->cwnd = ONE_SEGMENT(sock); sock->ssthresh = 0xffff; conn_add_once(sock); return 0; } /* called when a new segment arrives. */ /* deliver as much data to the app as possible, and update the ack * number of the socket to reflect how much was delivered */ static int receive_data(struct tcplib_sock *sock, struct tcp_hdr *tcph, int len) { uint8_t *ptr; int payload_len; ptr = ((uint8_t *)tcph) + (tcph->offset / 4); payload_len = len - (tcph->offset / 4); sock->ackno = ntohl(tcph->seqno) + payload_len; if (payload_len > 0) { tcplib_extern_recv(sock, ptr, payload_len); } return payload_len; } static void reset_ssthresh(struct tcplib_sock *conn) { uint16_t new_ssthresh = min(conn->cwnd, conn->r_wind) / 2; if (new_ssthresh < 2 * ONE_SEGMENT(conn)) new_ssthresh = 2 * ONE_SEGMENT(conn); conn->ssthresh = new_ssthresh; } int tcplib_process(struct ip6_hdr *iph, void *payload) { int rc = 0; struct tcp_hdr *tcph; struct tcplib_sock *this_conn; // uint8_t *ptr; int len = ntohs(iph->ip6_plen) + sizeof(struct ip6_hdr); int payload_len; uint32_t hdr_seqno, hdr_ackno; int connect_done = 0; tcph = (struct tcp_hdr *)payload; payload_len = len - sizeof(struct ip6_hdr) - (tcph->offset / 4); /* if there's no local */ this_conn = conn_lookup(iph, tcph); // printf("conn: %p\n", this_conn); if (this_conn != NULL) { hdr_seqno = ntohl(tcph->seqno); hdr_ackno = ntohl(tcph->ackno); if (tcph->flags & TCP_FLAG_RST) { /* Really hose this connection if we get a RST packet. * still TODO: RST generation for unbound ports */ printf("connection reset by peer\n"); tcplib_extern_closedone(this_conn); // tcplib_init_sock(this_conn); return 0; } // always get window updates from new segments // TODO : this should be after we detect out-of-sequence ACK // numbers! this_conn->r_wind = ntohs(tcph->window); printf("State: %i\n", this_conn->state); switch (this_conn->state) { case TCP_LAST_ACK: if (tcph->flags & TCP_FLAG_ACK && hdr_ackno == this_conn->seqno + 1) { this_conn->state = TCP_CLOSED; tcplib_extern_closedone(this_conn); break; } case TCP_FIN_WAIT_1: printf("IN FIN_WAIT_1, %i\n", (tcph->flags & TCP_FLAG_FIN)); if (tcph->flags & TCP_FLAG_ACK && hdr_ackno == this_conn->seqno + 1) { if (tcph->flags & TCP_FLAG_FIN) { this_conn->seqno++; this_conn->state = TCP_TIME_WAIT; // the TIME_WAIT state is problematic, since it holds up the // resources while we're in it... this_conn->timer.retx = TCPLIB_TIMEWAIT_LEN; } else { this_conn->timer.retx = TCPLIB_2MSL; this_conn->state = TCP_FIN_WAIT_2; } } // this generate the ACK we need here goto ESTABLISHED; case TCP_FIN_WAIT_2: if (tcph->flags & TCP_FLAG_FIN) { this_conn->seqno++; this_conn->state = TCP_TIME_WAIT; this_conn->timer.retx = TCPLIB_TIMEWAIT_LEN; tcplib_send_ack(this_conn, 0, TCP_FLAG_ACK); } break; case TCP_SYN_SENT: if (tcph->flags & (TCP_FLAG_SYN | TCP_FLAG_ACK)) { // got a syn-ack // send the ACK this_conn this_conn->state = TCP_ESTABLISHED; this_conn->ackno = hdr_seqno + 1; connect_done = 1; // skip the LISTEN processing // this will also generate an ACK goto ESTABLISHED; } else if (tcph->flags & TCP_FLAG_SYN) { // otherwise the state machine says we're in a simultaneous open, so continue doen this_conn->state = TCP_SYN_RCVD; connect_done = 1; } else { printf("sending RST on bad data in state SYN_SENT\n"); // we'll just let the timeout eventually close the socket, though tcplib_send_rst(iph, tcph); break; } case TCP_SYN_RCVD: case TCP_LISTEN: /* not connected. */ if (tcph->flags & TCP_FLAG_SYN) { struct tcplib_sock *new_sock; if (this_conn->state == TCP_LISTEN) { memcpy(&this_conn->r_ep.sin6_addr, &iph->ip6_src, 16); this_conn->r_ep.sin6_port = tcph->srcport; new_sock = tcplib_accept(this_conn, &this_conn->r_ep); if (new_sock != this_conn) { memset(this_conn->r_ep.sin6_addr.s6_addr, 0, 16); this_conn->r_ep.sin6_port = 0; if (new_sock != NULL) { memcpy(&new_sock->r_ep.sin6_addr, &iph->ip6_src, 16); new_sock->r_ep.sin6_port = tcph->srcport; conn_add_once(new_sock); } } if (new_sock == NULL) { tcplib_send_rst(iph, tcph); break; } memcpy(&new_sock->l_ep.sin6_addr, &iph->ip6_dst, 16); new_sock->l_ep.sin6_port = tcph->dstport; new_sock->ackno = hdr_seqno + 1; circ_buf_init(new_sock->tx_buf, new_sock->tx_buf_len, 0xcafebabe + 1); } else { /* recieved a SYN retransmission. */ new_sock = this_conn; } if (new_sock != NULL) { new_sock->seqno = 0xcafebabe + 1; new_sock->state = TCP_SYN_RCVD; tcplib_send_ack(new_sock, 0, TCP_FLAG_ACK | TCP_FLAG_SYN); new_sock->seqno++; } else { memset(&this_conn->r_ep, 0, sizeof(struct sockaddr_in6)); } } else if (this_conn->state == TCP_LISTEN) { tcplib_send_rst(iph, tcph); break; } /* this is SYN_RECVd */ if (tcph->flags & TCP_FLAG_ACK) { this_conn->state = TCP_ESTABLISHED; } /* fall through to handle any data. */ case TCP_CLOSE_WAIT: case TCP_ESTABLISHED: ESTABLISHED: /* ack any data in this packet */ if (this_conn->state == TCP_ESTABLISHED || this_conn->state == TCP_FIN_WAIT_1) { if (payload_len > 0) { if ((this_conn->flags & TCP_ACKPENDING) == TCP_ACKPENDING) { // printf("Incr would overflow\n"); } this_conn->flags ++; } // receive side sequence check and add data printf("seqno: %u ackno: %u\n", hdr_seqno, hdr_ackno); printf("conn seqno: %u ackno: %u\n", this_conn->seqno, this_conn->ackno); // send side recieve sequence check and congestion window updates. if (hdr_ackno > circ_get_seqno(this_conn->tx_buf)) { // new data is being ACKed // or we haven't sent anything new if (this_conn->cwnd <= this_conn->ssthresh) { // in slow start; increase the cwnd by one segment this_conn->cwnd += ONE_SEGMENT(this_conn); // printf("in slow start\n"); } else { // in congestion avoidance this_conn->cwnd += (ONE_SEGMENT(this_conn) * ONE_SEGMENT(this_conn)) / this_conn->cwnd; // printf("in congestion avoidence\n"); } // printf("ACK new data: cwnd: %i ssthresh: %i\n", this_conn->cwnd, this_conn->ssthresh); // reset the duplicate ack counter UNSET_ACK_COUNT(this_conn->flags); // truncates the ack buffer circ_shorten_head(this_conn->tx_buf, hdr_ackno); // printf("ack_count: %i\n", GET_ACK_COUNT(this_conn->flags)); if (this_conn->seqno == hdr_ackno) { tcplib_extern_acked(this_conn); } } else if (this_conn->seqno > circ_get_seqno(this_conn->tx_buf)) { // this is a duplicate ACK // - increase the counter of the number of duplicate ACKs // - if we get to three duplicate ACK's, start resending at // the ACK number because this probably means we lost a segment INCR_ACK_COUNT(this_conn->flags); // printf("ack_count: %i\n", GET_ACK_COUNT(this_conn->flags)); // printf("dup ack count: %i\n", GET_ACK_COUNT(this_conn->flags)); // a "dup ack count" of 2 is really 3 total acks because we start with zero if (GET_ACK_COUNT(this_conn->flags) == 2) { UNSET_ACK_COUNT(this_conn->flags); printf("detected multiple duplicate ACKs-- doing fast retransmit [%u, %u]\n", circ_get_seqno(this_conn->tx_buf), this_conn->seqno); // this is our detection of a "duplicate ack" event. // we are going to reset ssthresh and retransmit the data. reset_ssthresh(this_conn); tcplib_output(this_conn, circ_get_seqno(this_conn->tx_buf)); this_conn->timer.retx = 6; } } if (hdr_seqno != this_conn->ackno) { printf("==> received forward segment\n"); if ((hdr_seqno > this_conn->ackno + this_conn->my_wind) || (hdr_seqno < this_conn->ackno - this_conn->my_wind)) { // send a RST on really wild data tcplib_send_rst(iph, tcph); } else { tcplib_send_ack(this_conn, 0, TCP_FLAG_ACK); this_conn->flags |= TCP_ACKSENT; } } else { // (hdr_seqno == this_conn->ackno) { printf("receive data [%li]\n", len - sizeof(struct ip6_hdr)); if (receive_data(this_conn, tcph, len - sizeof(struct ip6_hdr)) > 0 && this_conn->flags & TCP_ACKSENT) { this_conn->flags &= ~TCP_ACKSENT; tcplib_send_ack(this_conn, 0, TCP_FLAG_ACK); } } // reset the retransmission timer if (this_conn->timer.retx == 0) this_conn->timer.retx = 6; } if (connect_done && !(this_conn->flags & TCP_CONNECTDONE)) { this_conn->flags |= TCP_CONNECTDONE; tcplib_extern_connectdone(this_conn, 0); } case TCP_TIME_WAIT: if ((payload_len > 0 && (this_conn->flags & TCP_ACKPENDING) >= 1) || tcph->flags & TCP_FLAG_FIN) { tcplib_send_ack(this_conn, (payload_len == 0 && (tcph->flags & TCP_FLAG_FIN)), TCP_FLAG_ACK); /* only close the connection if we've gotten all the data */ if (this_conn->state == TCP_ESTABLISHED && (tcph->flags & TCP_FLAG_FIN) && hdr_seqno == this_conn->ackno) { this_conn->state = TCP_CLOSE_WAIT; tcplib_extern_closed(this_conn); } } break; case TCP_CLOSED: default: rc = -1; // printf("sending RST\n"); // tcplib_send_ack(this_conn, 0, TCP_FLAG_ACK | TCP_FLAG_RST); } } else { /* this_conn was NULL */ /* interestingly, TCP sends a RST on this condition, not an ICMP error. go figure. */ printf("sending rst on missing connection\n"); tcplib_send_rst(iph, tcph); } return rc; } /* bind the socket to a local address */ int tcplib_bind(struct tcplib_sock *sock, struct sockaddr_in6 *addr) { /* not using an already-bound port */ /* TODO : SDH : check local address */ if (conn_checkport(addr->sin6_port)) return -1; memcpy(&sock->l_ep, addr, sizeof(struct sockaddr_in6)); /* passive open */ sock->state = TCP_LISTEN; return 0; } /* connect the socket to a remote endpoint */ int tcplib_connect(struct tcplib_sock *sock, struct sockaddr_in6 *serv_addr) { if (sock->tx_buf == NULL) return -1; switch (sock->state) { case TCP_CLOSED: // passive open; need to set up the local endpoint. memset(&sock->l_ep, 0, sizeof(struct sockaddr_in6)); sock->l_ep.sin6_port = htons(alloc_local_port()); break; case TCP_LISTEN: // we got here by calling bind, so we're cool. break; default: return -1; } circ_buf_init(sock->tx_buf, sock->tx_buf_len, 0xcafebabe + 1); sock->ackno = 0; sock->seqno = 0xcafebabe; memcpy(&sock->r_ep, serv_addr, sizeof(struct sockaddr_in6)); tcplib_send_ack(sock, 0, TCP_FLAG_SYN); sock->state = TCP_SYN_SENT; sock->seqno++; sock->timer.retx = 6; return 0; } int tcplib_send(struct tcplib_sock *sock, void *data, int len) { /* have enough tx buffer left? */ if (sock->state != TCP_ESTABLISHED) return -1; if (sock->seqno - circ_get_seqno(sock->tx_buf) + len > sock->tx_buf_len) // circ_get_window(sock->tx_buf)) return -1; if (circ_buf_write(sock->tx_buf, sock->seqno, data, len) < 0) return -1; sock->seqno += len; // printf("tcplib_output from send\n"); // tcplib_output(sock, sock->seqno - len); // this will let multiple calls to send() get combined into a single packet // the data will be sent out next time the timer fires sock->timer.retx = 1; // 3 seconds //if (sock->timer.retx == 0) //sock->timer.retx = 6; return 0; } void tcplib_retx_expire(struct tcplib_sock *sock) { // printf("retransmission timer expired!\n"); sock->retxcnt++; switch (sock->state) { case TCP_ESTABLISHED: if (circ_get_seqno(sock->tx_buf) != sock->seqno) { printf("retransmitting [%u, %u]\n", circ_get_seqno(sock->tx_buf), sock->seqno); reset_ssthresh(sock); // restart slow start sock->cwnd = ONE_SEGMENT(sock); // printf("tcplib_output from timer\n"); tcplib_output(sock, circ_get_seqno(sock->tx_buf)); sock->timer.retx = 6; } else { sock->retxcnt--; } break; case TCP_SYN_SENT: tcplib_send_ack(sock, 0, TCP_FLAG_SYN); sock->timer.retx = 6; break; case TCP_LAST_ACK: case TCP_FIN_WAIT_1: tcplib_send_ack(sock, 1, TCP_FLAG_ACK | TCP_FLAG_FIN); sock->timer.retx = TCPLIB_2MSL; break; case TCP_FIN_WAIT_2: case TCP_TIME_WAIT: sock->state = TCP_CLOSED; // exit TIME_WAIT tcplib_extern_closedone(sock); break; default: break; } /* if we've hit this timer a lot, give up * * do this by going into * TIME_WAIT, which will generate a FIN if anyone sends to us but * otherwise just do nothing. * * we don't do something like try to close it here, since we might * have gotten here from doing that. */ if (sock->retxcnt > TCPLIB_GIVEUP) { sock->state = TCP_TIME_WAIT; sock->timer.retx = TCPLIB_TIMEWAIT_LEN; } } int tcplib_abort(struct tcplib_sock *sock) { switch (sock->state) { // nothing to abort case TCP_CLOSED: case TCP_LISTEN: break; default: tcplib_send_ack(sock, 0, TCP_FLAG_RST); memset(&sock->l_ep, 0, sizeof(struct sockaddr_in6)); memset(&sock->r_ep, 0, sizeof(struct sockaddr_in6)); sock->state = TCP_CLOSED; } return 0; } int tcplib_close(struct tcplib_sock *sock) { int rc = 0; switch (sock->state) { /* passive close */ case TCP_CLOSE_WAIT: tcplib_send_ack(sock, 1, TCP_FLAG_ACK | TCP_FLAG_FIN); sock->timer.retx = 6; sock->state = TCP_LAST_ACK; break; /* active close */ case TCP_ESTABLISHED: // kick off the close tcplib_send_ack(sock, 0, TCP_FLAG_ACK | TCP_FLAG_FIN); sock->timer.retx = TCPLIB_2MSL; sock->state = TCP_FIN_WAIT_1; break; case TCP_SYN_SENT: sock->state = TCP_CLOSED; break; default: /* this is meaningless in other states */ rc = -1; } return rc; } int tcplib_timer_process() { struct tcplib_sock *iter; for (iter = conns; iter != NULL; iter = iter->next) { if (iter->timer.retx > 0 && (--iter->timer.retx) == 0) tcplib_retx_expire(iter); if ((iter->flags & TCP_ACKPENDING) >= 2) { tcplib_send_ack(iter, 0, TCP_FLAG_ACK); } } return 0; } tinyos-2.1.2+dfsg/support/sdk/c/blip/libtcp/tcplib.h000066400000000000000000000120061207233610700223300ustar00rootroot00000000000000/* * "Copyright (c) 2008, 2009 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #ifndef TCPLIB_H_ #define TCPLIB_H_ /* * tcplib: a simple tcp implemented in a library * @author Stephen Dawson-Haggerty * * */ // #include #include #define min(X,Y) (((X) > (Y)) ? (Y) : (X)) #ifndef PC #define printf(X, args ...) dbg("stdout", X, ## args) #define fprintf(X, Y, args ...) dbg("fprintf", Y, ## args) #endif typedef enum { TCP_CLOSED = 0, TCP_LISTEN, TCP_SYN_RCVD, TCP_SYN_SENT, TCP_ESTABLISHED, TCP_CLOSE_WAIT, TCP_LAST_ACK, TCP_FIN_WAIT_1, TCP_FIN_WAIT_2, TCP_CLOSING, TCP_TIME_WAIT, } tcplib_sock_state_t; enum { TCP_ACKPENDING = 0x3, TCP_DUPACKS = 0x3c, TCP_DUPACKS_OFF = 2, TCP_CONNECTDONE = 0x40, TCP_ACKSENT = 0x80, }; enum { /* how many timer tics to stay in TIME_WAIT */ TCPLIB_TIMEWAIT_LEN = 1, TCPLIB_2MSL = 4, /* how many un-acked retransmissions before we give up the connection */ TCPLIB_GIVEUP = 6, }; #define GET_ACK_COUNT(X) (((X) & TCP_DUPACKS) >> TCP_DUPACKS_OFF) #define UNSET_ACK_COUNT(X) ((X) &= ~TCP_DUPACKS) #define INCR_ACK_COUNT(X) ((X) += 1 << TCP_DUPACKS_OFF) struct tcplib_sock { uint8_t flags; /* local and remote endpoints */ struct sockaddr_in6 l_ep; struct sockaddr_in6 r_ep; /* current connection state */ tcplib_sock_state_t state; void *tx_buf; int tx_buf_len; /* max segment size, or default if we didn't bother to pull it out of the options field */ uint16_t mss; uint16_t my_wind; /* the window the other end is reporting */ uint16_t r_wind; uint16_t cwnd; uint16_t ssthresh; // the current next sequence number for ourgoing data. uint32_t seqno; // and the index of the last byte we've ACKed uint32_t ackno; struct { int8_t retx; } timer; /* retransmission counter */ uint16_t retxcnt; /* this needs to be at the end so we can call init() on a socket without blowing away the linked list */ struct tcplib_sock *next; }; /* EVENTS * ------------------------------------------------------------ * * calls generated by tcplib that must be dealt with elsewhere in the * program. */ /* called when a new connection request is recieved on a socket which * is LISTENing. * * * return 0 if it wants to accept the connection and allocated a * buffer for it; -1 otherwise. */ struct tcplib_sock *tcplib_accept(struct tcplib_sock *conn, struct sockaddr_in6 *from); /* a call-out point for tcplib to send a message */ void tcplib_send_out(struct ip6_packet *pkt, struct tcp_hdr *tcph); /* upcall for new data; may be dispatched all the way out to a * handler. * * Returns: 0 on success, * -1 otherwise. The error may be safely ignored. */ int tcplib_process(struct ip6_hdr *ip_packet, void *payload); /* * should be called every 500ms to increment all the tcp timers */ int tcplib_timer_process(); /* Just fill in the fields of the socket. * * If you perform a send on a socket in this state, an ephemeral port * will be allocated to it. * * This must be called once on any socket that might be sent on, or * might have bind() called. */ int tcplib_init_sock(struct tcplib_sock *sock); /* bind the socket to a local address */ int tcplib_bind(struct tcplib_sock *sock, struct sockaddr_in6 *addr); /* connect the socket to a remote endpoint */ int tcplib_connect(struct tcplib_sock *sock, struct sockaddr_in6 *serv_addr); /* send data on an open socket. * * returns: 0 on success * other errors * - no local buffer is available, * */ int tcplib_send(struct tcplib_sock *sock, void *data, int len); int tcplib_close(struct tcplib_sock *sock); /* abort a connection * * This will send a RST segment if the connection has been opened and * immediately return the socket to the CLOSED, uninitialized state, * although buffer pointers are maintained. * */ int tcplib_abort(struct tcplib_sock *sock); #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/libtcp/test_circ.c000066400000000000000000000066341207233610700230370ustar00rootroot00000000000000/* * "Copyright (c) 2008, 2009 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #include #include #include "circ.h" /* void do_head_read(void *buf) { */ /* char *read_data; */ /* int i, data_len; */ /* data_len = circ_buf_read_head(buf, (void **)&read_data); */ /* printf("buf_read_head: %i\n", data_len); */ /* for (i = 0; i < data_len; i++) */ /* putc(((char *)read_data)[i], stdout); */ /* putc('\n', stdout); */ /* } */ void do_read(void *buf, uint32_t sseqno) { char data[20]; int data_len, i; data_len = circ_buf_read(buf, sseqno, data, 20); printf("buf_read: %i\n", data_len); for (i = 0; i < data_len; i++) putc(((char *)data)[i], stdout); putc('\n', stdout); } int main(int argc, char **argv) { char buf[200]; char data[20], readbuf[30]; int i = 20, data_len; char *read_data; memset(buf, 0, sizeof(buf)); if (circ_buf_init(buf, 200, 0) < 0) printf("cir_buf_init: error\n"); for (i=0;i<20;i++) data[i] = 'a' + i; if (circ_buf_write(buf, 0, data, 20) < 0) printf("circ_buf_write: error\n"); circ_buf_dump(buf); if (circ_buf_write(buf, 10, data, 20) < 0) printf("circ_buf_write: error\n"); circ_buf_dump(buf); if (circ_buf_write(buf, 50, data, 20) < 0) printf("circ_buf_write: error\n"); // circ_buf_dump(buf); // do_head_read(buf); // circ_buf_dump(buf); if (circ_buf_write(buf, 30, data, 20) < 0) printf("circ_buf_write: error\n"); // circ_buf_dump(buf); if (circ_buf_write(buf, 70, data, 20) < 0) printf("circ_buf_write: error\n"); circ_buf_dump(buf); circ_shorten_head(buf, 10); circ_buf_dump(buf); memset(buf, 0, sizeof(buf)); if (circ_buf_init(buf, 200, 0) < 0) printf("cir_buf_init: error\n"); printf("\n\nRESTART\n\n"); for (i = 0; i < 25; i++) { circ_buf_write(buf, i * 20, data, 20); do_read(buf, i * 20); circ_shorten_head(buf, (i > 0) ? (i - 1) * 20 : 0 * 10); circ_buf_dump(buf); } // do_read(buf, 50); /* do_head_read(buf); */ /* circ_buf_dump(buf); */ /* if (circ_buf_write(buf, 90, data, 20) < 0) */ /* printf("circ_buf_write: error\n"); */ /* if (circ_buf_write(buf, 110, data, 20) < 0) */ /* printf("circ_buf_write: error\n"); */ /* if (circ_buf_write(buf, 130, data, 20) < 0) */ /* printf("circ_buf_write: error\n"); */ /* circ_buf_dump(buf); */ /* do_head_read(buf); */ /* do_head_read(buf); */ /* circ_buf_dump(buf); */ } tinyos-2.1.2+dfsg/support/sdk/c/blip/libtcp/test_server.c000066400000000000000000000140501207233610700234140ustar00rootroot00000000000000/* * "Copyright (c) 2008, 2009 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #include #include #include #include #include #include #include #include #include #include #include #include "ip.h" #include "tcplib.h" #include "tun_dev.h" #include "ip_malloc.h" #define BUFSZ 1000 #define LOSS_RATE_RECPR 200 #define LOSS_RATE_TRANS 200 int sock = 0; struct in6_addr iface_addr[16] = {{{0x20, 0x05, 0x00, 0x00, 0x00, 0x0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}}; struct sockaddr_in6 laddr; void printBuf(uint8_t *buf, uint16_t len) { int i; // print("len: %i: ", len); for (i = 1; i <= len; i++) { printf(" 0x%02x", buf[i-1]); // if (i % 16 == 0) printf("\n"); } printf("\n"); } void print_split_msg(struct split_ip_msg *msg) { int i; printf("src_addr: "); for (i = 0; i < 16; i++) printf("0x%x ", msg->hdr.ip6_src.s6_addr[i]); printf("\ndst_addr: "); for (i = 0; i < 16; i++) printf("0x%x ", msg->hdr.ip6_dst.s6_addr[i]); printf("\nplen: %i hlim: %i\n", ntohs(msg->hdr.plen), msg->hdr.hlim); printBuf(msg->data, msg->data_len); } void tcplib_extern_recv(struct tcplib_sock *sock, void *data, int len) { // printBuf(data, len); if (tcplib_send(sock, data, len) < 0) printf("tcplib_send: fail\n"); if (strncmp((char *)data, "close", 5) == 0) { printf("Server closing sock\n"); tcplib_close(sock); } } void tcplib_extern_closed(struct tcplib_sock *sock) { printf("remote conn closed\n"); tcplib_close(sock); } void tcplib_extern_closedone(struct tcplib_sock *sock) { printf("close done\n"); free(sock->tx_buf); tcplib_init_sock(sock); /* printf("rebinding...\n"); */ } /* called when a new connection request is received: not * * return: a tcplib_struc, with the ops table filled in and send and * receive buffers allocated. */ struct tcplib_sock *tcplib_accept(struct tcplib_sock *conn, struct sockaddr_in6 *from) { printf("tcplib_accept\n"); conn->tx_buf = malloc(BUFSZ); conn->tx_buf_len = BUFSZ; return conn; } void tcplib_send_out(struct split_ip_msg *msg, struct tcp_hdr *tcph) { uint8_t buf[8192]; struct timespec tv; if (sock <= 0) return; // printf("sending message\n"); memcpy(msg->hdr.ip6_src.s6_addr, iface_addr, 16); msg->hdr.ip6_src.s6_addr[15] = 2; msg->hdr.hlim = 64; memset(msg->hdr.vlfc, 0, 4); msg->hdr.vlfc[0] = 6 << 4; tcph->chksum = htons(msg_cksum(msg, IANA_TCP)); tv.tv_sec = 0; // sleep for a ms to give up the cpu... tv.tv_nsec = 1000000; nanosleep(&tv); // print_split_msg(msg); if (rand() % LOSS_RATE_TRANS == 0) { printf("dropping packet on write\n"); } else { printf("tun_write\n"); tun_write(sock, msg); } } /* practice accepting connections and transfering data */ int main(int argg, char **argv) { char buf[8192], dev[IFNAMSIZ]; uint8_t *payload; int len, i, flags; ip_malloc_init(); payload = buf + sizeof(struct tun_pi); dev[0] = 0; if ((sock = tun_open(dev)) < 0) exit(1); if (tun_setup(dev, iface_addr) < 0) exit(1); /* tun_setup turns on non-blocking IO. Turn it off. */ flags = fcntl(sock, F_GETFL); flags &= ~O_NONBLOCK; fcntl(sock,F_SETFL, flags); struct tcplib_sock srv_sock; tcplib_init_sock(&srv_sock); memcpy(laddr.sin6_addr.s6_addr, iface_addr, 16); laddr.sin6_addr.s6_addr[15] = 2; laddr.sin6_port = htons(atoi(argv[1])); tcplib_bind(&srv_sock, &laddr); fd_set fds; struct timeval timeout; FD_ZERO(&fds); FD_SET(sock, &fds); FD_SET(fileno(stdin), &fds); timeout.tv_sec = 0; timeout.tv_usec = 500000; while (select(sock + 1, &fds, NULL, NULL, &timeout) >= 0) { if (FD_ISSET(sock, &fds)) { if ((len = read(sock, buf, 8192)) <= 0) break; // printf("read %i bytes\n", len); struct ip6_hdr *iph = (struct ip6_hdr *)payload; if (iph->nxt_hdr == IANA_TCP) { if (rand() % LOSS_RATE_RECPR == 0) { printf("dropping packet on rx\n"); } else { void *p = buf + sizeof(struct tun_pi) + sizeof(struct ip6_hdr); // printBuf(p, len - sizeof(struct tun_pi) - sizeof(struct tcp_hdr)); if (tcplib_process(iph, p)) // len - sizeof(struct tun_pi))) printf("TCPLIB_PROCESS: ERROR!\n"); } } } else if (FD_ISSET(fileno(stdin), &fds)) { char c = getchar(); switch (c) { case 'a': printf("ABORTING CONNETION\n"); tcplib_abort(&srv_sock); break; case 'c': printf("CLOSING CONNETION\n"); tcplib_close(&srv_sock); break; case 's': printf("connection state: %i\n", srv_sock.state); break; } } else { timeout.tv_sec = 0; timeout.tv_usec = 500000; tcplib_timer_process(); } if (srv_sock.state == TCP_CLOSED) { tcplib_bind(&srv_sock, &laddr); } FD_ZERO(&fds); FD_SET(sock, &fds); FD_SET(fileno(stdin), &fds); } tun_close(sock, dev); } tinyos-2.1.2+dfsg/support/sdk/c/blip/linux/000077500000000000000000000000001207233610700205655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/blip/linux/dbg.c000066400000000000000000000044441207233610700214730ustar00rootroot00000000000000 #include #include #include #include #include #include #include #include #include extern struct timeval boot_time; struct dbg_endpoint { char channel[128]; FILE *fp; struct dbg_endpoint *next; }; struct dbg_endpoint *endpoints = NULL; #define LOGBASE "logs" char logdir[32]; /* find the channel endpoint in the list of logging destinations */ struct dbg_endpoint *get_endpoint(struct dbg_endpoint *cur, char *channel) { char filename_buf[1024]; struct dbg_endpoint *ep; for (ep = cur ? cur->next : endpoints; ep != NULL; ep = ep->next) { if (strcmp(ep->channel, channel) == 0) return ep; } if (cur == NULL && logdir[0] != '\0') { ep = malloc(sizeof(struct dbg_endpoint)); strcpy(ep->channel, channel); snprintf(filename_buf, sizeof(filename_buf), "%s/%s", logdir, channel); ep->fp = fopen(filename_buf, "a"); if (!ep->fp) return NULL; ep->next = endpoints; endpoints = ep; } return ep; } static int timestamp(FILE *fp){ struct timeval now, diff; uint32_t tics_now; gettimeofday(&now, NULL); timersub(&now, &boot_time, &diff); tics_now = (diff.tv_usec * 1024) / 1e6; tics_now += diff.tv_sec * 1024; fprintf(fp, "%u [%lu.%.06lu]: ", tics_now, diff.tv_sec, diff.tv_usec); return 0; } void linux_dbg(char *channel, const char *fmt, ...) { struct dbg_endpoint *ep = NULL; va_list ap; va_start(ap, fmt); while ((ep = get_endpoint(ep, channel))) { timestamp(ep->fp); vfprintf(ep->fp, fmt, ap); fflush(ep->fp); } va_end(ap); } void linux_dbg_init() { int rv = -1, idx = 0; do { snprintf(logdir, 32, LOGBASE ".%i", idx); rv = mkdir(logdir, 0755); idx++; } while (rv < 0 && errno == EEXIST); if (rv < 0) { fprintf(stderr, "WARN: could not open log dir\n"); logdir[0] = '\0'; } else { fprintf(stderr, "INFO: Sending logs to %s\n", logdir); } } char *sim_time_string() { return ""; } void printfUART_buf(char *buf, int len) { int i; for (i = 0; i < len; i++) { printf("%02hhx ", buf[i]); } printf("\n"); } #include #include void printfUART_in6addr(struct in6_addr *a) { static char print_buf[64]; inet_ntop6(a, print_buf, 64); printf(print_buf); } tinyos-2.1.2+dfsg/support/sdk/c/blip/linux/tun_dev.h000066400000000000000000000055741207233610700224150ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ /* * Copyright (c) 2007 Matus Harvan * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _TUN_DEV_H #define _TUN_DEV_H #include int tun_open(char *dev); int tun_close(int fd, char *dev); int tun_setup(char *dev, struct in6_addr *addr, int pfxlen); int tun_write(int fd, struct ip6_packet *msg); int tun_read(int fd, char *buf, int len); #endif tinyos-2.1.2+dfsg/support/sdk/c/blip/linux/tun_dev_darwin.c000066400000000000000000000117061207233610700237460ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * * * @author Stephen Dawson-Haggerty */ /* We're in macland here so we can do all the OSX-specific includes here */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tun_ioctls_darwin.h" #include "tun_dev.h" #include "logging.h" #if 0 int main(int argc, char **argv) { char devname[IFNAMSIZ]; struct in6_addr addr; inet_pton(AF_INET6, "fec0::1", &addr); if (tun_open(devname) < 0) { exit(1); } if (tun_setup(devname, &addr, 128) < 0) { exit(1); } sleep(10); } #endif int tun_open(char *dev) { int fd; int yes = 1; if ((fd = open("/dev/tun0", O_RDWR | O_NONBLOCK)) < 0) return -1; strncpy(dev, "tun0", IFNAMSIZ); /* this makes it so we have to prepend the address family to packets we write. */ if (ioctl(fd, TUNSIFHEAD, &yes) < 0) goto failed; if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) goto failed; return fd; failed: log_fatal_perror("tun_open"); close(fd); return -1; } int tun_setup(char *dev, struct in6_addr *addr, int pfxlen) { char addr_buf[256], cmd_buf[1024]; struct in6_addr my_addr; struct ifreq ifr; int fd; pfxlen = 64; if ((fd = socket(PF_INET6, SOCK_DGRAM, 0)) < 0) return -1; memset(&ifr, 0, sizeof(struct ifreq)); strncpy(ifr.ifr_name, dev, IFNAMSIZ); /* set the interface up */ if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) { log_fatal_perror("SIOCGIFFLAGS"); return -1; } ifr.ifr_flags |= IFF_UP; if (ioctl(fd, SIOCSIFFLAGS, &ifr) < 0) { log_fatal_perror("SIOCSIFFLAGS"); return -1; } /* MTU */ ifr.ifr_mtu = 1280; if (ioctl(fd, SIOCSIFMTU, &ifr) < 0) { log_fatal_perror("SIOCSIFMTU"); return -1; } /* Global address */ memcpy(&my_addr, addr, sizeof(struct in6_addr)); inet_ntop(AF_INET6, &my_addr, addr_buf, 256); snprintf(cmd_buf, 1024, "ifconfig %s inet6 %s/%i", dev, addr_buf, pfxlen); if (system(cmd_buf) != 0) { fatal("could not set global address!\n"); return -1; } snprintf(cmd_buf, 1024, "route -q add -inet6 %s -prefixlen %i -interface %s > /dev/null", addr_buf, pfxlen, dev); if (system(cmd_buf) != 0) { fatal("could not add route!\n"); return -1; } snprintf(cmd_buf, 1024, "route -q add -inet6 fe80::%%%s -prefixlen %i -interface %s > /dev/null", dev, 64, dev); if (system(cmd_buf) != 0) { fatal("could not LL add route!\n"); return -1; } my_addr.__u6_addr.__u6_addr16[0] = htons(0xfe80); inet_ntop(AF_INET6, &my_addr, addr_buf, 256); snprintf(cmd_buf, 1024, "ifconfig %s inet6 %s/64", dev, addr_buf); if (system(cmd_buf) != 0) { fatal("could not set local address!\n"); return -1; } return 0; } int tun_close(int fd, char *dev) { return close(fd); } /* Read/write frames from TUN device */ int tun_write(int fd, struct split_ip_msg *msg) { uint8_t buf[INET_MTU + sizeof(struct tun_pi)], *packet; struct tun_pi *pi = (struct tun_pi *)buf; struct generic_header *cur; packet = (uint8_t *)(pi + 1); if (ntohs(msg->hdr.plen) + sizeof(struct ip6_hdr) >= INET_MTU) return 1; pi->af = htonl(AF_INET6); memcpy(packet, &msg->hdr, sizeof(struct ip6_hdr)); packet += sizeof(struct ip6_hdr); cur = msg->headers; while (cur != NULL) { memcpy(packet, cur->hdr.data, cur->len); packet += cur->len; cur = cur->next; } memcpy(packet, msg->data, msg->data_len); return write(fd, buf, sizeof(struct tun_pi) + sizeof(struct ip6_hdr) + ntohs(msg->hdr.plen)); } int tun_read(int fd, char *buf, int len) { int out; out = read(fd, buf, sizeof(struct tun_pi) + len); return out - sizeof(struct tun_pi); } tinyos-2.1.2+dfsg/support/sdk/c/blip/linux/tun_dev_linux.c000066400000000000000000000134001207233610700236120ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ /* * Copyright (c) 2007 Matus Harvan * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tun_dev.h" /* * This is in linux/include/net/ipv6.h. * Thanks, net-tools! */ struct in6_ifreq { struct in6_addr ifr6_addr; __u32 ifr6_prefixlen; unsigned int ifr6_ifindex; }; int tun_open(char *dev) { struct ifreq ifr; int fd; if ((fd = open("/dev/net/tun", O_RDWR | O_NONBLOCK)) < 0) return -1; memset(&ifr, 0, sizeof(ifr)); /* By default packets are tagged as IPv4. To tag them as IPv6, * they need to be prefixed by struct tun_pi. */ //ifr.ifr_flags = IFF_TUN | IFF_NO_PI; ifr.ifr_flags = IFF_TUN; if (*dev) strncpy(ifr.ifr_name, dev, IFNAMSIZ); if (ioctl(fd, TUNSETIFF, (void *) &ifr) < 0) goto failed; strcpy(dev, ifr.ifr_name); return fd; failed: perror("tun_open"); close(fd); return -1; } int tun_setup(char *dev, struct in6_addr *addr, int pfxlen) { struct in6_ifreq ifr6; struct ifreq ifr; int fd; if ((fd = socket(PF_INET6, SOCK_DGRAM, 0)) < 0) return -1; memset(&ifr, 0, sizeof(struct ifreq)); strncpy(ifr.ifr_name, dev, IFNAMSIZ); /* set the interface up */ if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) { perror("SIOCGIFFLAGS"); return -1; } ifr.ifr_flags |= IFF_UP; if (ioctl(fd, SIOCSIFFLAGS, &ifr) < 0) { perror("SIOCSIFFLAGS"); return -1; } /* MTU */ ifr.ifr_mtu = 1280; if (ioctl(fd, SIOCSIFMTU, &ifr) < 0) { perror("SIOCSIFMTU"); return -1; } /* Global address */ memset(&ifr6, 0, sizeof(struct in6_ifreq)); memcpy(&ifr6.ifr6_addr, addr, 16); if (ioctl(fd, SIOGIFINDEX, &ifr) < 0) { perror("SIOGIFINDEX"); return -1; } ifr6.ifr6_ifindex = ifr.ifr_ifindex; ifr6.ifr6_prefixlen = pfxlen; if (ioctl(fd, SIOCSIFADDR, &ifr6) < 0) { perror("SIOCSIFADDR (global)"); return -1; } #if 0 memset(&ifr6.ifr6_addr.s6_addr[0], 0, 16); ifr6.ifr6_addr.s6_addr16[0] = htons(0xfe80); ifr6.ifr6_addr.s6_addr16[7] = addr->s6_addr16[7]; if (ioctl(fd, SIOCSIFADDR, &ifr6) < 0) { perror("SIOCSIFADDR (local)"); return -1; } #endif close(fd); return 0; } int tun_close(int fd, char *dev) { return close(fd); } /* Read/write frames from TUN device */ int tun_write(int fd, struct ip6_packet *msg) { uint8_t buf[INET_MTU + sizeof(struct tun_pi)], *packet; struct tun_pi *pi = (struct tun_pi *)buf; packet = (uint8_t *)(pi + 1); if (ntohs(msg->ip6_hdr.ip6_plen) + sizeof(struct ip6_hdr) >= INET_MTU) return 1; pi->flags = 0; pi->proto = htons(ETH_P_IPV6); memcpy(packet, &msg->ip6_hdr, sizeof(struct ip6_hdr)); packet += sizeof(struct ip6_hdr); iov_read(msg->ip6_data, 0, iov_len(msg->ip6_data), packet); return write(fd, buf, sizeof(struct tun_pi) + sizeof(struct ip6_hdr) + ntohs(msg->ip6_hdr.ip6_plen)); } int tun_read(int fd, char *buf, int len) { int out; out = read(fd, buf, sizeof(struct tun_pi) + len); return out - sizeof(struct tun_pi); } tinyos-2.1.2+dfsg/support/sdk/c/blip/linux/tun_ioctls_darwin.h000066400000000000000000000035431207233610700244720ustar00rootroot00000000000000/* * ip tunnel device for MacOSX. */ /* * Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009 Mattias Nissler * * Redistribution and use in source and binary forms, with or without modification, are permitted * provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other materials provided * with the distribution. * 3. The name of the author may not be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __TUN_IOCTLS_H__ #define __TUN_IOCTLS_H__ /* Tun supports prepending a four byte address family field to each packet. These ioctls allow you * to switch it on/off. Pass 1 as parameter to switch it on, pass 0 for off. */ #define TUNSIFHEAD _IOW('t', 96, int) #define TUNGIFHEAD _IOR('t', 97, int) #endif /* __TUN_IOCTLS_H__ */ tinyos-2.1.2+dfsg/support/sdk/c/coap/000077500000000000000000000000001207233610700174225ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/coap/AUTHORS000066400000000000000000000001061207233610700204670ustar00rootroot00000000000000libcoap authors Olaf Bergmann, Universitt Bremen tinyos-2.1.2+dfsg/support/sdk/c/coap/LICENSE000066400000000000000000000355641207233610700204440ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS tinyos-2.1.2+dfsg/support/sdk/c/coap/Makefile.in000066400000000000000000000044111207233610700214670ustar00rootroot00000000000000# Makefile for libcoap # # Copyright (C) 2010 Olaf Bergmann # # 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. # the library's version VERSION:=@PACKAGE_VERSION@ # tools @SET_MAKE@ SHELL = /bin/sh MKDIR = mkdir abs_builddir = @abs_builddir@ top_builddir = @top_builddir@ package = @PACKAGE_TARNAME@-@PACKAGE_VERSION@ # files and flags SOURCES:= pdu.c net.c debug.c encode.c uri.c list.c subscribe.c str.c OBJECTS:= $(patsubst %.c, %.o, $(SOURCES)) HEADERS:=coap.h config.h debug.h pdu.h net.h encode.h uri.h list.h mem.h subscribe.h str.h #CFLAGS:=-g -Wall -ansi -pedantic CFLAGS:=-Wall -ansi -pedantic @CFLAGS@ DISTDIR=$(top_builddir)/$(package) SUBDIRS:=examples doc FILES:=Makefile.in configure configure.in config.h.in $(SOURCES) $(HEADERS) LIB:=libcoap.a LDFLAGS:=@LIBS@ ARFLAGS:=cru examples:=examples doc:=doc .PHONY: all dirs clean distclean .gitignore doc .SUFFIXES: .SUFFIXES: .c .o all: $(LIB) dirs check: echo DISTDIR: $(DISTDIR) echo top_builddir: $(top_builddir) $(MAKE) -C examples check dirs: $(SUBDIRS) for dir in $^; do \ $(MAKE) -C $$dir ; \ done $(LIB): $(OBJECTS) $(AR) $(ARFLAGS) $@ $^ ranlib $@ clean: @rm -f $(PROGRAM) main.o $(LIB) $(OBJECTS) for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir clean ; \ done doc: $(MAKE) -C doc distclean: clean @rm -rf $(DISTDIR) @rm -f *~ $(DISTDIR).tar.gz dist: $(FILES) $(SUBDIRS) test -d $(DISTDIR) || mkdir $(DISTDIR) cp $(FILES) $(DISTDIR) for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir dist; \ done tar czf $(package).tar.gz $(DISTDIR) .gitignore: echo "core\n*~\n*.[oa]\n*.gz\n*.cap\n$(PROGRAM)\n$(DISTDIR)\n.gitignore" >$@ tinyos-2.1.2+dfsg/support/sdk/c/coap/README000066400000000000000000000014451207233610700203060ustar00rootroot00000000000000libcoap: A C implementation of IETF Core Application protocol Copyright (C) 2010 by Olaf Bergmann libcoap is a C implementation of a lightweight application-protocol for devices that are constrained their resources such as computing power, RF range, memory, bandwith, or network packet sizes. This protocol, CoAP, is developed in the IETF working group "Constrained RESTful Environments (core)", see . This directory contains a protocol parser and basic networking functions for platform with support for malloc() and BSD-style sockets. The examples directory contains a client and a server to demonstrate the use of this library. Ports to other IP stacks such as Contiki/uIP/RIME or TinyOS/BLIP exist as well but are (currently) not part of this distribution. tinyos-2.1.2+dfsg/support/sdk/c/coap/README.COAPBLIP000066400000000000000000000027441207233610700215010ustar00rootroot00000000000000========================== README.COAPBLIP ========================== Please read the entire documentation how to set up CoAP on TinyOS first: http://docs.tinyos.net/tinywiki/index.php/CoAP ========================== Example Client Usage ========================== Starting the example client: GET: Request for temperature (/st) with token (3a) and binary representation ./coap-client -m get coap://[fec0::3]:61616/st -T 3a -t binary PUT: Set the LED's to state 2: echo -e -n \\x02 | ./coap-client -m put coap://[fec0::3]:61616/l -T 3a -t binary -f - Set AES Key: echo -e -n \\xFF\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x10\\x11\\x12\\x13\\x14\\x15\\x16 | ./coap-client -m put coap://[fec0::3]:61616/ck -T 3a -t binary -f - OR by creating HEX file: echo -e -n \\xFF\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x10\\x11\\x12\\x13\\x14\\x15\\x16 >> file PUT key into storage: ./coap-client -m put coap://[fec0::3]:61616/ck -T 3a -t binary -f file GET key for testing purpose: ./coap-client -m get coap://[fec0::3]:61616/ck -T 3a -t binary ========================== Troubleshooting ========================== In case of having this problem: ./coap-client: error while loading shared libraries: libcoap.so: cannot open shared object file: No such file or directory export LD_LIBRARY_PATH=..:$LD_LIBRARY_PATH OR add this line export LD_LIBRARY_PATH=$TOSROOT/support/sdk/c/coap/:$LD_LIBRARY_PATH to ~/.bashrc tinyos-2.1.2+dfsg/support/sdk/c/coap/coap.h000066400000000000000000000020141207233610700205120ustar00rootroot00000000000000/* coap.h -- main header file for CoAP stack * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #ifndef _COAP_H_ #define _COAP_H_ #include "config.h" #include "debug.h" #include "mem.h" #include "list.h" #include "pdu.h" #include "net.h" #include "encode.h" #include "uri.h" #endif /* _COAP_H_ */ tinyos-2.1.2+dfsg/support/sdk/c/coap/config.h.in000066400000000000000000000062421207233610700214510ustar00rootroot00000000000000/* config.h.in. Generated from configure.in by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the header file. */ #undef HAVE_ASSERT_H /* Define to 1 if you have the `getaddrinfo' function. */ #undef HAVE_GETADDRINFO /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `coap' library (-lcoap). */ #undef HAVE_LIBCOAP /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strnlen' function. */ #undef HAVE_STRNLEN /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if does not define. */ #undef ssize_t tinyos-2.1.2+dfsg/support/sdk/c/coap/configure.in000066400000000000000000000033431207233610700217360ustar00rootroot00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. # # Copyright (C) 2010 Olaf Bergmann # # 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. AC_PREREQ([2.65]) AC_INIT([libcoap], [0.07]) AC_CONFIG_SRCDIR([coap.h]) # Checks for programs. AC_PROG_MAKE_SET AC_PROG_CC AC_PROG_RANLIB AC_PATH_PROG(DOXYGEN, doxygen, [:]) AC_C_BIGENDIAN # Checks for libraries. AC_CHECK_LIB([coap], [coap_new_pdu]) AC_SEARCH_LIBS([gethostbyname], [nsl]) AC_SEARCH_LIBS([socket], [socket]) # Checks for header files. AC_CHECK_HEADERS([assert.h arpa/inet.h limits.h netdb.h netinet/in.h stdlib.h string.h strings.h sys/socket.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_SIZE_T AC_TYPE_SSIZE_T # Checks for library functions. AC_FUNC_MALLOC AC_CHECK_FUNCS([memset select socket strcasecmp strrchr getaddrinfo strnlen]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile doc/Makefile doc/Doxyfile examples/Makefile]) AC_OUTPUT tinyos-2.1.2+dfsg/support/sdk/c/coap/debug.c000066400000000000000000000024261207233610700206600ustar00rootroot00000000000000/* debug.c -- debug utilities * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #include #include #include #include "debug.h" #ifndef IDENT_APPNAME void debug(char *format, ...) { static char timebuf[32]; struct tm *tmp; time_t now; va_list ap; time(&now); tmp = localtime(&now); if ( strftime(timebuf,sizeof(timebuf), "%b %d %H:%M:%S", tmp) ) printf("%s ", timebuf); va_start(ap, format); vprintf(format, ap); va_end(ap); fflush(stdout); } #else #define debug(fmt, args ...) dbg(fmt, ## args) #endif tinyos-2.1.2+dfsg/support/sdk/c/coap/debug.h000066400000000000000000000017511207233610700206650ustar00rootroot00000000000000/* debug.h -- debug utilities * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #ifndef _COAP_DEBUG_H_ #define _COAP_DEBUG_H_ #ifndef NDEBUG void debug(char *,...); #include "pdu.h" extern void coap_show_pdu(coap_pdu_t *); #endif #endif /* _COAP_DEBUG_H_ */ tinyos-2.1.2+dfsg/support/sdk/c/coap/doc/000077500000000000000000000000001207233610700201675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/coap/doc/Doxyfile.in000066400000000000000000001776371207233610700223270ustar00rootroot00000000000000# Doxyfile 1.6.3 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = @PACKAGE_NAME@ # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = @PACKAGE_VERSION@ # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = .. ../examples # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see #
    Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enabled doxygen will generate a search box for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be implemented using a PHP enabled web server instead of at the web client using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server based approach is that it scales better to large projects and allows full text search. The disadvances is that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = NO # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES tinyos-2.1.2+dfsg/support/sdk/c/coap/doc/Makefile.in000066400000000000000000000023421207233610700222350ustar00rootroot00000000000000# Makefile for libcoap # # Copyright (C) 2010 Olaf Bergmann # # 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. # the library's version VERSION:=@PACKAGE_VERSION@ # tools @SET_MAKE@ SHELL = /bin/sh MKDIR = mkdir DOXYGEN= @DOXYGEN@ top_builddir = @top_builddir@ DISTDIR?=$(top_builddir)/@PACKAGE_TARNAME@-@PACKAGE_VERSION@ FILES:=Makefile.in Doxyfile.in html doc: Doxyfile $(DOXYGEN) >./doxygen.out 2>&1 clean: @rm -rf html distclean: clean @rm -rf $(DISTDIR) @rm -f *~ dist: doc test -d $(DISTDIR)/doc || mkdir $(DISTDIR)/doc cp -r $(FILES) $(DISTDIR)/doc tinyos-2.1.2+dfsg/support/sdk/c/coap/encode.c000066400000000000000000000027431207233610700210310ustar00rootroot00000000000000/* encode.c -- encoding and decoding of CoAP data types * * Copyright (C) 2010 Olaf Bergmann , Carsten Bormann * * 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. */ #ifndef NDEBUG # include #endif #include "encode.h" /* Carsten suggested this when fls() is not available: */ int coap_fls(unsigned int i) { int n; for (n = 0; i; n++) i >>= 1; return n; } unsigned int coap_decode_var_bytes(unsigned char *buf,unsigned int len) { unsigned int i, n = 0; for (i = 0; i < len; ++i) n = (n << 8) + buf[i]; return n; } unsigned int coap_encode_var_bytes(unsigned char *buf, unsigned int val) { int n, i = val >> 1; for (n = 0; i; n++) /* FIXME: coap_fls() */ i >>= 1; for (i = n / 8 + 1; i; --i) { buf[i-1] = val & 0xff; val >>= 8; } return n / 8 + 1; } tinyos-2.1.2+dfsg/support/sdk/c/coap/encode.h000066400000000000000000000043601207233610700210330ustar00rootroot00000000000000/* encode.h -- encoding and decoding of CoAP data types * * Copyright (C) 2010 Olaf Bergmann , Carsten Bormann * * 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. */ #ifndef _COAP_ENCODE_H_ #define _COAP_ENCODE_H_ #ifndef IDENT_APPNAME #if (BSD >= 199103) # include #else # include #endif #endif #define N 8 #define E 4 #define HIBIT (1 << (N - 1)) #define EMASK ((1 << E) - 1) #define MMASK ((1 << N) - 1 - EMASK) #define MAX_VALUE ( (1 << N) - (1 << E) ) * (1 << ((1 << E) - 1)) #define COAP_PSEUDOFP_DECODE_8_4(r) (r < HIBIT ? r : (r & MMASK) << (r & EMASK)) #ifndef HAVE_FLS /* include this only if fls() is not available */ extern int coap_fls(unsigned int i); #else #define coap_fls(i) fls(i) #endif /* ls and s must be integer variables */ #define COAP_PSEUDOFP_ENCODE_8_4_DOWN(v,ls) (v < HIBIT ? v : (ls = coap_fls(v) - N, (v >> ls) & MMASK) + ls) #define COAP_PSEUDOFP_ENCODE_8_4_UP(v,ls,s) (v < HIBIT ? v : (ls = coap_fls(v) - N, (s = (((v + ((1<> ls) & MMASK)), s == 0 ? HIBIT + ls + 1 : s + ls)) /** * Decodes multiple-length byte sequences. buf points to an input byte * sequence of length len. Returns the decoded value. */ unsigned int coap_decode_var_bytes(unsigned char *buf,unsigned int len); /** * Encodes multiple-length byte sequences. buf points to an output * buffer of sufficient length to store the encoded bytes. val is * the value to encode. Returns the number of bytes used to encode * val or 0 on error. */ unsigned int coap_encode_var_bytes(unsigned char *buf, unsigned int val); #endif /* _COAP_ENCODE_H_ */ tinyos-2.1.2+dfsg/support/sdk/c/coap/examples/000077500000000000000000000000001207233610700212405ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/coap/examples/Makefile.in000066400000000000000000000035631207233610700233140ustar00rootroot00000000000000# Makefile for libcoap # # Copyright (C) 2010 Olaf Bergmann # # 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. # the library's version VERSION:=@PACKAGE_VERSION@ # tools @SET_MAKE@ SHELL = /bin/sh MKDIR = mkdir abs_builddir = @abs_builddir@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # files and flags PROGRAMS:=tiny coap-server coap-client SOURCES:= tiny.c client.c server.c OBJECTS:= $(patsubst %.c, %.o, $(SOURCES)) #CFLAGS:=-g -Wall -ansi -pedantic -I.. CFLAGS:=-g -Wall -I$(top_srcdir) @CFLAGS@ DISTDIR?=$(top_builddir)/@PACKAGE_TARNAME@-@PACKAGE_VERSION@ FILES:=Makefile.in $(SOURCES) LDFLAGS:=-L$(top_builddir) -lcoap @LIBS@ libcoap =$(top_builddir)/libcoap.a CFLAGS += -DSHOWREALVALUES .PHONY: clean distclean .SUFFIXES: .SUFFIXES: .c .o all: $(PROGRAMS) check: echo DISTDIR: $(DISTDIR) echo top_builddir: $(top_builddir) tiny: tiny.o $(libcoap) $(CC) -o $@ $< $(LDFLAGS) coap-client: client.o $(libcoap) $(CC) -o $@ $< $(LDFLAGS) coap-server: server.o $(libcoap) $(CC) -o $@ $< $(LDFLAGS) clean: @rm -f $(PROGRAMS) $(OBJECTS) distclean: clean @rm -rf $(DISTDIR) @rm -f *~ dist: $(FILES) test -d $(DISTDIR)/examples || mkdir $(DISTDIR)/examples cp $(FILES) $(DISTDIR)/examples tinyos-2.1.2+dfsg/support/sdk/c/coap/examples/client.c000066400000000000000000000536351207233610700226760ustar00rootroot00000000000000/* coap-client -- simple CoAP client * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "coap.h" static coap_list_t *optlist = NULL; /* Request URI. * TODO: associate the resources with transaction id and make it expireable */ static coap_uri_t uri; /* reading is done when this flag is set */ static int ready = 0; static FILE *file = NULL; /* output file name */ static str payload = { 0, NULL }; /* optional payload to send */ typedef unsigned char method_t; method_t method = 1; /* the method we are using in our requests */ extern unsigned int print_readable( const unsigned char *data, unsigned int len, unsigned char *result, unsigned int buflen ); int append_to_file(const char *filename, const unsigned char *data, size_t len) { size_t written; if ( !file && !(file = fopen(filename, "w")) ) { perror("append_to_file: fopen"); return -1; } do { written = fwrite(data, 1, len, file); len -= written; data += written; } while ( written && len ); return 0; } coap_pdu_t * new_ack( coap_context_t *ctx, coap_queue_t *node ) { coap_pdu_t *pdu = coap_new_pdu(); if (pdu) { pdu->hdr->type = COAP_MESSAGE_ACK; pdu->hdr->code = 0; pdu->hdr->id = node->pdu->hdr->id; } return pdu; } coap_pdu_t * new_response( coap_context_t *ctx, coap_queue_t *node, unsigned int code ) { coap_pdu_t *pdu = new_ack(ctx, node); if (pdu) pdu->hdr->code = code; return pdu; } coap_pdu_t * coap_new_request( method_t m, coap_list_t *options ) { coap_pdu_t *pdu; coap_list_t *opt; if ( ! ( pdu = coap_new_pdu() ) ) return NULL; pdu->hdr->type = COAP_MESSAGE_CON; pdu->hdr->id = rand(); /* use a random transaction id */ pdu->hdr->code = m; for (opt = options; opt; opt = opt->next) { coap_add_option( pdu, COAP_OPTION_KEY(*(coap_option *)opt->data), COAP_OPTION_LENGTH(*(coap_option *)opt->data), COAP_OPTION_DATA(*(coap_option *)opt->data) ); } if (payload.length) { /* TODO: must handle block */ coap_add_data(pdu, payload.length, payload.s); } return pdu; } void send_request( coap_context_t *ctx, coap_pdu_t *pdu, const char *server, unsigned short port ) { struct addrinfo *res, *ainfo; struct addrinfo hints; int error; struct sockaddr_in6 dst; static unsigned char buf[COAP_MAX_PDU_SIZE]; memset ((char *)&hints, 0, sizeof(hints)); hints.ai_socktype = SOCK_DGRAM; hints.ai_family = AF_INET6; error = getaddrinfo(server, "", &hints, &res); if (error != 0) { perror("getaddrinfo"); exit(1); } for (ainfo = res; ainfo != NULL; ainfo = ainfo->ai_next) { if ( ainfo->ai_family == AF_INET6 ) { memset(&dst, 0, sizeof dst ); dst.sin6_family = AF_INET6; dst.sin6_port = htons( port ); memcpy( &dst.sin6_addr, &((struct sockaddr_in6 *)ainfo->ai_addr)->sin6_addr, sizeof(dst.sin6_addr) ); print_readable( (unsigned char *)pdu->hdr, pdu->length, buf, COAP_MAX_PDU_SIZE); printf("%s\n",buf); coap_send_confirmed( ctx, &dst, pdu ); goto leave; } } leave: freeaddrinfo(res); } #define COAP_OPT_BLOCK_LAST(opt) ( COAP_OPT_VALUE(*block) + (COAP_OPT_LENGTH(*block) - 1) ) #define COAP_OPT_BLOCK_MORE(opt) ( *COAP_OPT_LAST(*block) & 0x08 ) #define COAP_OPT_BLOCK_SIZE(opt) ( *COAP_OPT_LAST(*block) & 0x07 ) unsigned int _read_blk_nr(coap_opt_t *opt) { unsigned int i, nr=0; for ( i = COAP_OPT_LENGTH(*opt); i; --i) { nr = (nr << 8) + COAP_OPT_VALUE(*opt)[i-1]; } return nr >> 4; } #define COAP_OPT_BLOCK_NR(opt) _read_blk_nr(&opt) #ifdef SHOWREALVALUES typedef struct val { uint8_t id_t:4; uint8_t length_t:4; uint16_t temp; uint8_t id_h:4; uint8_t length_h:4; uint16_t hum; uint8_t id_v:4; uint8_t length_v:4; uint16_t volt; }__attribute__((__packed__)) val_all ; val_all char_to_val_all(unsigned char *data) { val_all result; memcpy(&result, data, sizeof(val_all)); return result; } uint16_t char_to_uint16(unsigned char *data) { uint16_t result; memcpy(&result, data, sizeof(uint16_t)); return result; } #endif void message_handler( coap_context_t *ctx, coap_queue_t *node, void *data) { coap_pdu_t *pdu = NULL; coap_opt_t *block, *ct, *sub; unsigned int blocknr; unsigned char buf[4]; coap_list_t *option; unsigned int len; unsigned char *databuf; #ifndef NDEBUG printf("** process pdu: "); coap_show_pdu( node->pdu ); #endif if ( node->pdu->hdr->version != COAP_DEFAULT_VERSION ) { debug("dropped packet with unknown version %u\n", node->pdu->hdr->version); return; } if ( node->pdu->hdr->code < COAP_RESPONSE_100 && node->pdu->hdr->type == COAP_MESSAGE_CON ) { /* send 500 response */ pdu = new_response( ctx, node, COAP_RESPONSE_500 ); goto finish; } switch (node->pdu->hdr->code) { case COAP_RESPONSE_200: /* got some data, check if block option is set */ block = coap_check_option( node->pdu, COAP_OPTION_BLOCK ); if ( !block ) { /* There is no block option set, just read the data and we are done. */ if ( coap_get_data( node->pdu, &len, &databuf ) ) { /*path = coap_check_option( node->pdu, COAP_OPTION_URI_PATH );*/ append_to_file( "coap.out", databuf, len ); } } else { blocknr = coap_decode_var_bytes( COAP_OPT_VALUE(*block), COAP_OPT_LENGTH(*block) ); /* TODO: check if we are looking at the correct block number */ if ( coap_get_data( node->pdu, &len, &databuf ) ) { /*path = coap_check_option( node->pdu, COAP_OPTION_URI_PATH );*/ append_to_file( "coap.out", databuf, len ); } if ( (blocknr & 0x08) ) { /* more bit is set */ printf("found the M bit, block size is %u, block nr. %u\n", blocknr & 0x07, (blocknr & 0xf0) << blocknr & 0x07); /* need to acknowledge if message was asyncronous */ if ( node->pdu->hdr->type == COAP_MESSAGE_CON ) { pdu = new_ack( ctx, node ); if ( pdu && coap_send( ctx, &node->remote, pdu ) == COAP_INVALID_TID ) { debug("message_handler: error sending reponse"); coap_delete_pdu(pdu); return; } } /* create pdu with request for next block */ pdu = coap_new_request( method, NULL ); /* first, create bare PDU w/o any option */ if ( pdu ) { pdu->hdr->id = node->pdu->hdr->id; /* copy transaction id from response */ /* get content type from response */ ct = coap_check_option( node->pdu, COAP_OPTION_CONTENT_TYPE ); if ( ct ) { coap_add_option( pdu, COAP_OPTION_CONTENT_TYPE, COAP_OPT_LENGTH(*ct),COAP_OPT_VALUE(*ct) ); } /* add URI components from optlist */ for (option = optlist; option; option = option->next ) { switch (COAP_OPTION_KEY(*(coap_option *)option->data)) { case COAP_OPTION_URI_AUTHORITY : case COAP_OPTION_URI_PATH : case COAP_OPTION_URI_QUERY : coap_add_option ( pdu, COAP_OPTION_KEY(*(coap_option *)option->data), COAP_OPTION_LENGTH(*(coap_option *)option->data), COAP_OPTION_DATA(*(coap_option *)option->data) ); break; default: ; /* skip other options */ } } /* finally add updated block option from response */ coap_add_option ( pdu, COAP_OPTION_BLOCK, coap_encode_var_bytes(buf, blocknr + ( 1 << 4) ), buf); if ( coap_send_confirmed( ctx, &node->remote, pdu ) == COAP_INVALID_TID ) { debug("message_handler: error sending reponse"); coap_delete_pdu(pdu); } return; } } } #ifdef SHOWREALVALUES if (strcmp((const char *)uri.path.s, "st") == 0 ) { printf("\n** Temperatur: %4.2f K\n\n", ((float)char_to_uint16(node->pdu->data))/100); } else if (strcmp((const char *)uri.path.s, "sh") == 0) { printf("\n** Humidity: %4.2f %% \n\n", ((float)char_to_uint16(node->pdu->data))/100); } else if (strcmp((const char *)uri.path.s, "sv") == 0) { printf("** Voltage: %4.2f V\n\n", ((float)char_to_uint16(node->pdu->data))/100); } else if (strcmp((const char *)uri.path.s, "ck") == 0) { if (len != 0) { printf("** AES Key received \n"); } else { printf("** AES Key set\n"); } } else if (strcmp((const char *)uri.path.s, "tsr") == 0) { printf("** tsr\n"); } else if (strcmp((const char *)uri.path.s, "par") == 0) { printf("** par\n"); } else if (strcmp((const char *)uri.path.s, "l") == 0) { if (len != 0) { printf("\n** led 0 (red) %s\n** led 1 (green) %s\n** led 2 (blue) %s\n\n", ( (char_to_uint16(node->pdu->data) %2) == 0) ? "OFF": "ON", (((char_to_uint16(node->pdu->data)>>1)%2) == 0) ? "OFF": "ON", (((char_to_uint16(node->pdu->data)>>2)%2) == 0) ? "OFF": "ON"); } else { printf("** LEDs set\n"); } } else if (strcmp((const char *)uri.path.s, "rt") == 0) { printf("** Route:\ndestination\t\tgateway\t\tiface\n %s\n", node->pdu->data); } else if (strcmp((const char *)uri.path.s, "r") == 0) { val_all val = char_to_val_all(node->pdu->data); printf("\n** All values: \n"); if (val.temp != (0xFFFF | 0xFFFE)) printf("** Temperature: %4.2f K\n", ((float) val.temp)/100); else printf("** Temperature: NaN\n\n"); if (val.hum != (0xFFFF | 0xFFFE)) printf("** Humidity: %4.2f %%\n", ((float) val.hum)/100); else printf("** Humidity: NaN\n\n"); if (val.volt != (0xFFFF | 0xFFFE)) printf("** Voltage: %4.2f V\n\n", ((float) val.volt)/100); else printf("** Voltage: NaN\n\n"); } else if (strcmp((const char *)uri.path.s, "lipsum") == 0) { } else if (strcmp((const char *)uri.path.s, "time") == 0) { } else if (strcmp((const char *)uri.path.s, COAP_DEFAULT_URI_WELLKNOWN) == 0) { printf("** .well-known/core:\n"); } else { printf("** unknown URI\n"); } #endif break; case COAP_RESPONSE_X_240: printf("\n** Token required\n\n"); break; case 0: printf("** PreAck received\n"); break; default: ; } /* acknowledge if requested */ if ( !pdu && node->pdu->hdr->type == COAP_MESSAGE_CON ) { pdu = new_ack( ctx, node ); } finish: if ( pdu && coap_send( ctx, &node->remote, pdu ) == COAP_INVALID_TID ) { debug("message_handler: error sending reponse"); coap_delete_pdu(pdu); } /* our job is done, we can exit at any time */ sub = coap_check_option( node->pdu, COAP_OPTION_SUBSCRIPTION ); if ( sub ) { debug("message_handler: Subscription-Lifetime is %d\n", COAP_PSEUDOFP_DECODE_8_4(*COAP_OPT_VALUE(*sub))); } ready = !sub || COAP_PSEUDOFP_DECODE_8_4(*COAP_OPT_VALUE(*sub)) == 0; } void usage( const char *program, const char *version) { const char *p; p = strrchr( program, '/' ); if ( p ) program = ++p; fprintf( stderr, "%s v%s -- a small CoAP implementation\n" "(c) 2010 Olaf Bergmann \n\n" "usage: %s [-b num] [-g group] [-m method] [-p port] [-s num] [-t type...] [-T string] URI\n\n" "\tURI can be an absolute or relative coap URI,\n" "\t-b size\t\tblock size to be used in GET/PUT/POST requests\n" "\t \t\t(value must be a multiple of 16 not larger than 2048)\n" "\t-f file\t\tfile to send with PUT/POST (use '-' for STDIN)\n" "\t-g group\tjoin the given multicast group\n" "\t-m method\trequest method (get|put|post|delete)\n" "\t-p port\t\tlisten on specified port\n" "\t-s duration\tsubscribe for given duration [s]\n" "\t-A types\taccepted content for GET (comma-separated list)\n" "\t-t type\t\tcontent type for given resource for PUT/POST\n" "\t-T token\tinclude specified token\n", program, version, program ); } int join( coap_context_t *ctx, char *group_name ){ struct ipv6_mreq mreq; struct addrinfo *reslocal = NULL, *resmulti = NULL, hints, *ainfo; int result = -1; /* we have to resolve the link-local interface to get the interface id */ memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; hints.ai_socktype = SOCK_DGRAM; result = getaddrinfo("::", NULL, &hints, &reslocal); if ( result < 0 ) { perror("join: cannot resolve link-local interface"); goto finish; } /* get the first suitable interface identifier */ for (ainfo = reslocal; ainfo != NULL; ainfo = ainfo->ai_next) { if ( ainfo->ai_family == AF_INET6 ) { mreq.ipv6mr_interface = ((struct sockaddr_in6 *)ainfo->ai_addr)->sin6_scope_id; break; } } memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; hints.ai_socktype = SOCK_DGRAM; /* resolve the multicast group address */ result = getaddrinfo(group_name, NULL, &hints, &resmulti); if ( result < 0 ) { perror("join: cannot resolve multicast address"); goto finish; } for (ainfo = resmulti; ainfo != NULL; ainfo = ainfo->ai_next) { if ( ainfo->ai_family == AF_INET6 ) { mreq.ipv6mr_multiaddr = ((struct sockaddr_in6 *)ainfo->ai_addr)->sin6_addr; break; } } result = setsockopt( ctx->sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&mreq, sizeof(mreq) ); if ( result < 0 ) perror("join: setsockopt"); finish: freeaddrinfo(resmulti); freeaddrinfo(reslocal); return result; } int order_opts(void *a, void *b) { if (!a || !b) return a < b ? -1 : 1; if (COAP_OPTION_KEY(*(coap_option *)a) < COAP_OPTION_KEY(*(coap_option *)b)) return -1; return COAP_OPTION_KEY(*(coap_option *)a) == COAP_OPTION_KEY(*(coap_option *)b); } coap_list_t * new_option_node(unsigned short key, unsigned int length, unsigned char *data) { coap_option *option; coap_list_t *node; option = coap_malloc(sizeof(coap_option) + length); if ( !option ) goto error; COAP_OPTION_KEY(*option) = key; COAP_OPTION_LENGTH(*option) = length; memcpy(COAP_OPTION_DATA(*option), data, length); /* we can pass NULL here as delete function since option is released automatically */ node = coap_new_listnode(option, NULL); if ( node ) return node; error: perror("new_option_node: malloc"); coap_free( option ); return NULL; } void cmdline_content_type(char *arg, unsigned short key) { static char *content_types[] = { "plain", "xml", "csv", "html", "","","","","","","","","","","","","","","","","", "gif", "jpeg", "png", "tiff", "audio", "video", "","","","","","","","","","","","","", "link", "axml", "binary", "rdf", "soap", "atom", "xmpp", "exi", "bxml", "infoset", "json", 0}; coap_list_t *node; unsigned char i, value[10]; int valcnt = 0; char *p, *q = arg; while (q && *q) { p = strchr(q, ','); for (i=0; content_types[i] && strncmp(q,content_types[i], p ? p-q : strlen(q)) != 0 ; ++i) ; if (content_types[i]) { value[valcnt] = i; valcnt++; } else { fprintf(stderr, "W: unknown content-type '%s'\n",arg); } if (!p || key == COAP_OPTION_CONTENT_TYPE) break; q = p+1; } if (valcnt) { node = new_option_node(key, valcnt, value); if (node) coap_insert( &optlist, node, order_opts ); } } void cmdline_uri(char *arg) { coap_split_uri((unsigned char *)arg, &uri ); #if 0 /* need authority only for proxy requests */ if (uri.na.length) coap_insert( &optlist, new_option_node(COAP_OPTION_URI_AUTHORITY, uri.na.length, uri.na.s), order_opts); #endif if (uri.path.length) coap_insert( &optlist, new_option_node(COAP_OPTION_URI_PATH, uri.path.length, uri.path.s), order_opts); if (uri.query.length) coap_insert( &optlist, new_option_node(COAP_OPTION_URI_QUERY, uri.query.length, uri.query.s), order_opts); } void cmdline_blocksize(char *arg) { static unsigned char buf[4]; /* hack: temporarily take encoded bytes */ unsigned int blocksize = atoi(arg); if ( COAP_MAX_PDU_SIZE < blocksize + sizeof(coap_hdr_t) ) { fprintf(stderr, "W: skipped invalid blocksize\n"); return; } /* use only last three bits and clear M-bit */ blocksize = (coap_fls(blocksize >> 4) - 1) & 0x07; coap_insert( &optlist, new_option_node(COAP_OPTION_BLOCK, coap_encode_var_bytes(buf, blocksize), buf), order_opts); } void cmdline_subscribe(char *arg) { unsigned int ls, s; unsigned char duration = COAP_PSEUDOFP_ENCODE_8_4_UP(atoi(arg), ls, s); coap_insert( &optlist, new_option_node(COAP_OPTION_SUBSCRIPTION, 1, &duration), order_opts ); } void cmdline_token(char *arg) { coap_insert( &optlist, new_option_node(COAP_OPTION_TOKEN, strlen(arg), (unsigned char *)arg), order_opts); } int cmdline_input_from_file(char *filename, str *buf) { FILE *inputfile = NULL; ssize_t len; int result = 1; struct stat statbuf; if (!filename || !buf) return 0; if (filename[0] == '-' && !filename[1]) { /* read from stdin */ buf->length = 20000; buf->s = (unsigned char *)coap_malloc(buf->length); if (!buf->s) return 0; inputfile = stdin; } else { /* read from specified input file */ if (stat(filename, &statbuf) < 0) { perror("cmdline_input_from_file: stat"); return 0; } buf->length = statbuf.st_size; buf->s = (unsigned char *)coap_malloc(buf->length); if (!buf->s) return 0; inputfile = fopen(filename, "r"); if ( !inputfile ) { perror("cmdline_input_from_file: fopen"); coap_free(buf->s); return 0; } } len = fread(buf->s, 1, buf->length, inputfile); if (len < buf->length) { if (ferror(inputfile) != 0) { perror("cmdline_input_from_file: fread"); coap_free(buf->s); buf->length = 0; buf->s = NULL; result = 0; } else { buf->length = len; } } if (inputfile != stdin) fclose(inputfile); return result; } method_t cmdline_method(char *arg) { static char *methods[] = { 0, "get", "post", "put", "delete", 0}; unsigned char i; for (i=1; methods[i] && strcasecmp(arg,methods[i]) != 0 ; ++i) ; return i; /* note that we do not prevent illegal methods */ } int main(int argc, char **argv) { coap_context_t *ctx; fd_set readfds; struct timeval tv, *timeout; int result; time_t now; coap_queue_t *nextpdu; coap_pdu_t *pdu; static unsigned char *p; static str server; unsigned short localport = COAP_DEFAULT_PORT, port = COAP_DEFAULT_PORT; int opt; char *group = NULL; while ((opt = getopt(argc, argv, "b:f:g:m:p:s:t:A:T:")) != -1) { switch (opt) { case 'b' : cmdline_blocksize(optarg); break; case 'f' : cmdline_input_from_file(optarg,&payload); break; case 'g' : group = optarg; break; case 'p' : localport = atoi(optarg); break; case 'm' : method = cmdline_method(optarg); break; case 's' : cmdline_subscribe(optarg); break; case 'A' : cmdline_content_type(optarg,COAP_OPTION_ACCEPT); break; case 't' : cmdline_content_type(optarg,COAP_OPTION_CONTENT_TYPE); break; case 'T' : cmdline_token(optarg); break; default: usage( argv[0], PACKAGE_VERSION ); exit( 1 ); } } ctx = coap_new_context( localport ); if ( !ctx ) return -1; coap_register_message_handler( ctx, message_handler ); if ( optind < argc ) cmdline_uri( argv[optind] ); else { usage( argv[0], PACKAGE_VERSION ); exit( 1 ); } if ( group ) join( ctx, group ); if (! (pdu = coap_new_request( method, optlist ) ) ) return -1; /* split server address and port */ /* FIXME: get rid of the global URI object somehow */ server = uri.na; if (server.length) { if (*server.s == '[') { /* IPv6 address reference */ p = ++server.s; --server.length; while ( p - server.s < server.length && *p != ']' ) ++p; if (*p == ']') *p++ = '\0'; /* port starts here */ } else { /* IPv4 address or hostname */ p = server.s; while ( p - server.s < server.length && *p != ':' ) ++p; } if (*p == ':') { /* port starts here */ *p++ = '\0'; port = 0; /* set port */ while( p - server.s < server.length && isdigit(*p) ) { port = port * 10 + ( *p - '0' ); ++p; } } } /* send request */ send_request( ctx, pdu, server.length ? (char *)server.s : "::1", port ); while ( !(ready && coap_can_exit(ctx)) ) { FD_ZERO(&readfds); FD_SET( ctx->sockfd, &readfds ); nextpdu = coap_peek_next( ctx ); time(&now); while ( nextpdu && nextpdu->t <= now ) { coap_retransmit( ctx, coap_pop_next( ctx ) ); nextpdu = coap_peek_next( ctx ); } if ( nextpdu ) { /* set timeout if there is a pdu to send */ tv.tv_usec = 0; tv.tv_sec = nextpdu->t - now; timeout = &tv; } else timeout = NULL; /* no timeout otherwise */ result = select( ctx->sockfd + 1, &readfds, 0, 0, timeout ); if ( result < 0 ) { /* error */ perror("select"); } else if ( result > 0 ) { /* read from socket */ if ( FD_ISSET( ctx->sockfd, &readfds ) ) { coap_read( ctx ); /* read received data */ coap_dispatch( ctx ); /* and dispatch PDUs from receivequeue */ // koo second read is done to process the asyn response. TODO this has to be done properly by checking the type of message //coap_read( ctx ); /* read received data */ //coap_dispatch( ctx ); /* and dispatch PDUs from receivequeue */ // koo } } } if ( file ) { fflush( file ); fclose( file ); } coap_free_context( ctx ); return 0; } tinyos-2.1.2+dfsg/support/sdk/c/coap/examples/server.c000066400000000000000000001032731207233610700227200ustar00rootroot00000000000000/* coap -- simple implementation of the Constrained Application Protocol (CoAP) * as defined in draft-ietf-core-coap-01 * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_ASSERT_H # include #else # define assert(x) #endif /* HAVE_ASSERT_H */ #include "subscribe.h" #include "coap.h" #define COAP_RESOURCE_CHECK_TIME 2 /* where accessible files are stored */ #define FILE_PREFIX "filestorage" #define DATASINK_PREFIX "data-sink/" #define GENERATE_PDU(var,t,c,i) { \ var = coap_new_pdu(); \ if (var) { \ var->hdr->type = (t); \ var->hdr->code = (c); \ var->hdr->id = (i); \ } \ } /* temporary storage for dynamic resource representations */ static char resource_buf[20000]; static int quit = 0; /* SIGINT handler: set quit to 1 for graceful termination */ void handle_sigint(int signum) { quit = 1; } coap_pdu_t * new_ack( coap_context_t *ctx, coap_queue_t *node ) { coap_pdu_t *pdu; GENERATE_PDU(pdu,COAP_MESSAGE_ACK,0,node->pdu->hdr->id); return pdu; } coap_pdu_t * new_rst( coap_context_t *ctx, coap_queue_t *node, unsigned int code ) { coap_pdu_t *pdu; GENERATE_PDU(pdu,COAP_MESSAGE_RST,code,node->pdu->hdr->id); return pdu; } coap_pdu_t * new_response( coap_context_t *ctx, coap_queue_t *node, unsigned int code ) { coap_pdu_t *pdu; GENERATE_PDU(pdu,COAP_MESSAGE_ACK,code,node->pdu->hdr->id); return pdu; } void add_contents( coap_pdu_t *pdu, unsigned int mediatype, unsigned int len, unsigned char *data ) { unsigned char ct = COAP_MEDIATYPE_APPLICATION_LINK_FORMAT; if (!pdu) return; /* add content-encoding */ coap_add_option(pdu, COAP_OPTION_CONTENT_TYPE, 1, &ct); /* TODO: handle fragmentation (check result code) */ coap_add_data(pdu, len, data); } #define INDEX "This is a test server made with libcoap (see http://libcoap.sf.net)\n" \ "Copyright (C) 2010 Olaf Bergmann \n\n" \ "Try to get .well-known/core or POST/PUT data if you like." coap_opt_t * coap_next_option(coap_pdu_t *pdu, coap_opt_t *opt) { coap_opt_t *next; if ( !pdu || !opt ) return NULL; next = (coap_opt_t *)( (unsigned char *)opt + COAP_OPT_SIZE(*opt) ); return (unsigned char *)next < pdu->data && COAP_OPT_DELTA(*next) == 0 ? next : NULL; } int mediatype_matches(coap_pdu_t *pdu, unsigned char mediatype) { coap_opt_t *accept; int t; if ( mediatype == COAP_MEDIATYPE_ANY || (accept = coap_check_option(pdu, COAP_OPTION_ACCEPT)) == NULL) return 1; /* Check the byte sequence in the option value for any occurence of * mediatype. */ for (t = 0; t < COAP_OPT_LENGTH(*accept); ++t) { if ( COAP_OPT_VALUE(*accept)[t] == mediatype ) return 1; } return 0; } /* Check if provided path name is a valid CoAP URI path. */ int is_valid(char *prefix, unsigned char *path, unsigned int length) { enum { START, PATH, DOT, DOTDOT } state; if (!path || length < strlen(prefix) || strncmp((char *)path, prefix, strlen(prefix)) != 0) return 0; path += strlen(prefix); length -= strlen(prefix); if ( length && *path == '/' ) { state = START; ++path; --length; } else state = PATH; while (length) { switch (state) { case START: switch (path[0]) { case '.': state = DOT; break; case '/': return 0; default: state = PATH; } break; case PATH: if (path[0] == '/') state = START; break; case DOT: switch (path[0]) { case '.': state = DOTDOT; break; case '/': return 0; default: state = PATH; } break; case DOTDOT: if (path[0] == '/') return 0; state = PATH; break; } ++path; --length; } return state != DOT && state != DOTDOT; } #ifndef HAVE_STRNLEN size_t strnlen(const char *p, size_t maxlen) { size_t n; for (n = 0; n < maxlen && p[n]; n++) ; return n; } #endif int resource_wellknown(coap_context_t *ctx, coap_resource_t *resource, unsigned char *mediatype, unsigned int offset, unsigned char *buf, unsigned int *buflen, int *finished); #define MIN(x,y) (x) < (y) ? (x) : (y) coap_pdu_t * handle_get(coap_context_t *ctx, coap_queue_t *node, void *data) { coap_pdu_t *pdu; coap_uri_t uri; coap_resource_t *resource; coap_opt_t *block, *tok, *sub; str token; unsigned int blklen, blk; int code, finished = 1; unsigned int ls; unsigned int duration; unsigned char enc; unsigned char mediatype = COAP_MEDIATYPE_ANY; coap_subscription_t *subscription; static unsigned char buf[COAP_MAX_PDU_SIZE]; static unsigned char optbuf[4]; if ( !coap_get_request_uri( node->pdu, &uri ) ) return NULL; if ( !uri.path.length ) { pdu = new_response(ctx, node, COAP_RESPONSE_200); if ( !pdu ) return NULL; add_contents( pdu, COAP_MEDIATYPE_TEXT_PLAIN, sizeof(INDEX) - 1, (unsigned char *)INDEX ); goto ok; } /* any other resource */ resource = coap_get_resource(ctx, &uri); if ( !resource ) return new_response(ctx, node, COAP_RESPONSE_404); /* check if requested mediatypes match */ if ( coap_check_option(node->pdu, COAP_OPTION_ACCEPT) && !mediatype_matches(node->pdu, resource->mediatype) ) { debug("media type mismatch\n"); return new_response(ctx, node, COAP_RESPONSE_415); } block = coap_check_option(node->pdu, COAP_OPTION_BLOCK); if ( block ) { blk = coap_decode_var_bytes(COAP_OPT_VALUE(*block), COAP_OPT_LENGTH(*block)); blklen = 16 << (blk & 0x07); } else { blklen = 512; /* default block size is set to 512 Bytes locally */ blk = coap_fls(blklen >> 4) - 1; } /* invoke callback function to get data representation of requested resource */ if ( resource->data ) { mediatype = resource->mediatype; code = resource->data(&uri, &(node->pdu->hdr->id), &mediatype, (blk & ~0x0f) << (blk & 0x07), buf, &blklen, &finished, COAP_REQUEST_GET); } else { /* check if the well-known URI was requested */ if (memcmp(uri.path.s, COAP_DEFAULT_URI_WELLKNOWN, MIN(uri.path.length, sizeof(COAP_DEFAULT_URI_WELLKNOWN) - 1)) == 0) { mediatype = resource->mediatype; code = resource_wellknown(ctx, resource, &mediatype, (blk & ~0x0f) << (blk & 0x07), buf, &blklen, &finished); } else { /* no callback available, set code, blklen and finished manually (-> empty payload) */ code = COAP_RESPONSE_200; blklen = 0; finished = 1; } } if ( !(pdu = new_response(ctx, node, code)) ) return NULL; if ( blklen > 0 ) { /* add content-type */ if ( mediatype != COAP_MEDIATYPE_ANY ) coap_add_option(pdu, COAP_OPTION_CONTENT_TYPE, 1, &mediatype); /* set Max-age option unless resource->maxage is zero */ if (resource->maxage) { coap_add_option(pdu, COAP_OPTION_MAXAGE, coap_encode_var_bytes(optbuf, resource->maxage), optbuf); } /* set Etag option unless resource->etag is zero */ if (*resource->etag) { coap_add_option(pdu, COAP_OPTION_ETAG, strnlen((char *)resource->etag,4), resource->etag); } /* handle subscription if requested */ sub = coap_check_option( node->pdu, COAP_OPTION_SUBSCRIPTION ); if ( sub ) { duration = COAP_PSEUDOFP_DECODE_8_4(*COAP_OPT_VALUE(*sub)); debug("*** add subscription for %d seconds\n", duration); enc = COAP_PSEUDOFP_ENCODE_8_4_DOWN(duration, ls); coap_add_option(pdu, COAP_OPTION_SUBSCRIPTION, 1, &enc); /* refresh only if already subscribed */ token.length = 0; tok = coap_check_option(node->pdu, COAP_OPTION_TOKEN); if (tok) { COAP_SET_STR(&token, COAP_OPT_LENGTH(*tok), COAP_OPT_VALUE(*tok)); coap_add_option(pdu, COAP_OPTION_TOKEN, COAP_OPT_LENGTH(*tok), COAP_OPT_VALUE(*tok)); } subscription = coap_find_subscription(ctx, coap_uri_hash(&uri), &(node->remote), tok ? &token : NULL); if (subscription) { /* refresh existing subscription */ subscription->expires = time(NULL)+duration; } else { /* add new subscription */ subscription = coap_new_subscription(ctx, &uri, &(node->remote), time(NULL)+duration); if (subscription) { if (token.length) { /* TODO: copy token into subscription->token */ subscription->token.s = (unsigned char *)coap_malloc(token.length); if (subscription->token.s) { subscription->token.length = token.length; memcpy(subscription->token.s, token.s, token.length); } /* FIXME: else error? */ } coap_add_subscription(ctx, subscription); } } } /* add a block option when it has been requested explicitly or * there is more data available */ if ( block || !finished ) { blk = (blk & ~0x08) | (!finished << 3); /* add block option to PDU */ coap_add_option(pdu, COAP_OPTION_BLOCK, coap_encode_var_bytes(optbuf, blk), optbuf); } /* We will add contents only when it is not empty. This might lead * to problems when this is the last block of a sequence of more * than one block. For now, we ignore this problem as it can * happen only when the block sizes have changed. */ if (!coap_add_data(pdu, blklen, buf)) { /* FIXME: handle this case -- must send 500 or something */ } } ok: return pdu; } int write_file(char *filename, unsigned char *text, int length) { FILE *file; ssize_t written; file = fopen(filename, "w"); if ( !file ) { perror("write_file: fopen"); return 0; } written = fwrite(text, 1, length, file); fclose(file); return written; } coap_pdu_t * handle_put(coap_context_t *ctx, coap_queue_t *node, void *data) { coap_uri_t uri; coap_opt_t *tok; coap_pdu_t *pdu; coap_resource_t *resource; ssize_t written, length; struct stat statbuf; static char filename[FILENAME_MAX+1]; if ( !coap_get_request_uri( node->pdu, &uri ) ) return NULL; /* we do not want to create the resource if not available */ if ( !(resource = coap_get_resource(ctx, &uri)) ) return new_response(ctx, node, COAP_RESPONSE_404); if (!resource->writable) return new_response(ctx, node, COAP_RESPONSE_400); if ( !(pdu = new_response(ctx, node, COAP_RESPONSE_200)) ) return NULL; /* create a zero-terminated string */ memcpy(filename, uri.path.s, uri.path.length); filename[uri.path.length] = '\0'; length = (unsigned char *)node->pdu->hdr + node->pdu->length - node->pdu->data; written = write_file(filename, node->pdu->data, length); /* set etag from file's modification time (byte-order does not care) */ if ( (stat(filename, &statbuf) == 0) && S_ISREG(statbuf.st_mode) ) { memcpy(resource->etag, &statbuf.st_mtime, sizeof(resource->etag)); } else { /* clear etag */ *resource->etag = 0; } if (written < length) return new_response(ctx, node, COAP_RESPONSE_500); tok = coap_check_option(node->pdu, COAP_OPTION_CONTENT_TYPE); resource->mediatype = tok ? *COAP_OPT_VALUE(*tok) : COAP_MEDIATYPE_ANY; resource->dirty = 1; /* mark for notification of observers */ return pdu; } int resource_from_file(coap_uri_t *uri, coap_tid_t *id, unsigned char *mediatype, unsigned int offset, unsigned char *buf, unsigned int *buflen, int *finished, unsigned int method); coap_pdu_t * handle_post(coap_context_t *ctx, coap_queue_t *node, void *data) { coap_uri_t uri; coap_pdu_t *pdu; coap_resource_t *r; coap_opt_t *tok; ssize_t written, length; int namelen; char name[60]; struct stat statbuf; if ( !coap_get_request_uri( node->pdu, &uri ) ) return NULL; /* existing stuff can be handled using put for now */ if (coap_get_resource(ctx, &uri)) return handle_put(ctx, node, data); /* create new resource */ if ( !(r = coap_malloc( sizeof(coap_resource_t) ))) return new_response(ctx, node, COAP_RESPONSE_500); tok = coap_check_option(node->pdu, COAP_OPTION_CONTENT_TYPE); /* Create a new resource to store the given contents in the local * file system. We restrict the storage area to DATASINK_PREFIX. */ memset(name, 0, sizeof(name)); namelen = snprintf(name, sizeof(name)-1, DATASINK_PREFIX "%lX", coap_uri_hash(&uri)); r->uri = coap_new_uri((unsigned char *)name, namelen); r->name = coap_new_string(uri.path.length); if (r->name) { r->name->length = uri.path.length; memcpy(r->name->s, uri.path.s, r->name->length); } r->mediatype = tok ? *COAP_OPT_VALUE(*tok) : COAP_MEDIATYPE_ANY; r->dirty = 1; r->writable = 1; r->data = resource_from_file; /* we know that r->uri.s is zero-terminated */ length = (unsigned char *)node->pdu->hdr + node->pdu->length - node->pdu->data; written = write_file((char *)r->uri->path.s, node->pdu->data, length); /* set etag from file's modification time (byte-order does not care) */ if ( (stat((char *)r->uri->path.s, &statbuf) == 0) && S_ISREG(statbuf.st_mode) ) { memcpy(r->etag, &statbuf.st_mtime, sizeof(r->etag)); } else { /* clear etag */ *r->etag = 0; } if (written < length) { coap_free(r); return new_response(ctx, node, COAP_RESPONSE_500); } else coap_add_resource(ctx, r); /* create the response */ pdu = new_response(ctx, node, COAP_RESPONSE_201); /* add location header */ coap_add_option(pdu, COAP_OPTION_LOCATION, namelen, (unsigned char *)name); /* we do not need the request URI, only a token, if specified */ tok = coap_check_option(node->pdu, COAP_OPTION_TOKEN); if (tok) coap_add_option(pdu, COAP_OPTION_TOKEN, COAP_OPT_LENGTH(*tok), COAP_OPT_VALUE(*tok)); return pdu; } coap_pdu_t * handle_delete(coap_context_t *ctx, coap_queue_t *node, void *data) { coap_uri_t uri; coap_pdu_t *pdu; coap_resource_t *r; coap_opt_t *tok; static char filename[FILENAME_MAX+1]; if ( !coap_get_request_uri( node->pdu, &uri ) ) return NULL; r = coap_get_resource(ctx, &uri); if (!r) return new_response(ctx, node, COAP_RESPONSE_404); if (!r->writable) { debug("tried to remove resource that is read-only\n"); pdu = new_response(ctx, node, COAP_RESPONSE_400); coap_add_data(pdu, 9, (unsigned char *)"forbidden"); return pdu; } if (FILENAME_MAX < uri.path.length) return new_response(ctx, node, COAP_RESPONSE_500); memcpy(filename, uri.path.s, uri.path.length); filename[uri.path.length] = '\0'; debug("unlink %s\n", filename); unlink(filename); /* create the response */ pdu = new_response(ctx, node, COAP_RESPONSE_200); if (uri.na.length) coap_add_option(pdu, COAP_OPTION_URI_AUTHORITY, uri.na.length, uri.na.s); if (uri.path.length) coap_add_option(pdu, COAP_OPTION_URI_PATH, uri.path.length, uri.path.s); tok = coap_check_option(node->pdu, COAP_OPTION_TOKEN); if (tok) coap_add_option(pdu, COAP_OPTION_TOKEN, COAP_OPT_LENGTH(*tok), COAP_OPT_VALUE(*tok)); if (uri.query.length) coap_add_option(pdu, COAP_OPTION_URI_QUERY, uri.query.length, uri.query.s); coap_delete_resource(ctx, coap_uri_hash(&uri)); return pdu; } void message_handler(coap_context_t *ctx, coap_queue_t *node, void *data) { coap_pdu_t *pdu = NULL; #ifndef NDEBUG debug("** process pdu: "); coap_show_pdu( node->pdu ); #endif if ( node->pdu->hdr->version != COAP_DEFAULT_VERSION ) { debug("dropped packet with unknown version %u\n", node->pdu->hdr->version); return; } switch (node->pdu->hdr->code) { case COAP_REQUEST_GET : pdu = handle_get(ctx, node, data); if ( !pdu && node->pdu->hdr->type == COAP_MESSAGE_CON ) pdu = new_rst( ctx, node, COAP_RESPONSE_500 ); break; case COAP_REQUEST_PUT: pdu = handle_put(ctx, node, data); if ( !pdu && node->pdu->hdr->type == COAP_MESSAGE_CON ) pdu = new_response( ctx, node, COAP_RESPONSE_400 ); break; case COAP_REQUEST_POST: pdu = handle_post(ctx, node, data); if ( !pdu && node->pdu->hdr->type == COAP_MESSAGE_CON ) pdu = new_response( ctx, node, COAP_RESPONSE_400 ); break; case COAP_REQUEST_DELETE: pdu = handle_delete(ctx, node, data); if ( !pdu && node->pdu->hdr->type == COAP_MESSAGE_CON ) pdu = new_response( ctx, node, COAP_RESPONSE_400 ); break; default: if ( node->pdu->hdr->type == COAP_MESSAGE_CON ) { if ( node->pdu->hdr->code >= COAP_RESPONSE_100 ) pdu = new_rst( ctx, node, COAP_RESPONSE_500 ); else { debug("request method not implemented: %u\n", node->pdu->hdr->code); pdu = new_rst( ctx, node, COAP_RESPONSE_405 ); } } } if ( pdu && coap_send( ctx, &node->remote, pdu ) == COAP_INVALID_TID ) { debug("message_handler: error sending reponse"); coap_delete_pdu(pdu); } } void usage( const char *program, const char *version) { const char *p; p = strrchr( program, '/' ); if ( p ) program = ++p; fprintf( stderr, "%s v%s -- a small CoAP implementation\n" "(c) 2010 Olaf Bergmann \n\n" "usage: %s [-g group] [-p port] URI\n\n" "\tURI can be an absolute or relative coap URI,\n" "\t-g group\tjoin the given multicast group\n" "\t-p port\t\tlisten on specified port\n", program, version, program ); } int join( coap_context_t *ctx, char *group_name ){ struct ipv6_mreq mreq; struct addrinfo *reslocal = NULL, *resmulti = NULL, hints, *ainfo; int result = -1; /* we have to resolve the link-local interface to get the interface id */ memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; hints.ai_socktype = SOCK_DGRAM; result = getaddrinfo("::", NULL, &hints, &reslocal); if ( result < 0 ) { perror("join: cannot resolve link-local interface"); goto finish; } /* get the first suitable interface identifier */ for (ainfo = reslocal; ainfo != NULL; ainfo = ainfo->ai_next) { if ( ainfo->ai_family == AF_INET6 ) { mreq.ipv6mr_interface = ((struct sockaddr_in6 *)ainfo->ai_addr)->sin6_scope_id; break; } } memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; hints.ai_socktype = SOCK_DGRAM; /* resolve the multicast group address */ result = getaddrinfo(group_name, NULL, &hints, &resmulti); if ( result < 0 ) { perror("join: cannot resolve multicast address"); goto finish; } for (ainfo = resmulti; ainfo != NULL; ainfo = ainfo->ai_next) { if ( ainfo->ai_family == AF_INET6 ) { mreq.ipv6mr_multiaddr = ((struct sockaddr_in6 *)ainfo->ai_addr)->sin6_addr; break; } } result = setsockopt( ctx->sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&mreq, sizeof(mreq) ); if ( result < 0 ) perror("join: setsockopt"); finish: freeaddrinfo(resmulti); freeaddrinfo(reslocal); return result; } int print_link(coap_resource_t *resource, unsigned char *buf, size_t buflen) { size_t n = 0; assert(resource); assert(buf); if (buflen < resource->uri->path.length + 3) return -1; /* FIXME: calculate maximum length and return if longer than buflen */ buf[n++] = '<'; buf[n++] = '/'; memcpy(buf + n, resource->uri->path.s, resource->uri->path.length); n += resource->uri->path.length; buf[n++] = '>'; if (resource->mediatype != COAP_MEDIATYPE_ANY) { if (buflen - n < 7) /* mediatype is at most 3 digits */ return -1; n += snprintf((char *)(buf + n), buflen - n, ";ct=%d", resource->mediatype); } if (resource->name) { if (buflen - n < resource->name->length + 5) /* include trailing quote */ return -1; memcpy(buf + n, ";n=\"", 4); n += 4; memcpy(buf + n, resource->name->s, resource->name->length); n += resource->name->length; if (!resource->writable) { if (buflen - n < 12) return -1; n += snprintf((char *)(buf + n), buflen - n, " (read-only)"); } buf[n++] = '"'; } return n; } int resource_wellknown(coap_context_t *ctx, coap_resource_t *resource, unsigned char *mediatype, unsigned int offset, unsigned char *buf, unsigned int *buflen, int *finished) { #define RESOURCE_BUFLEN 4000 static unsigned char resources[RESOURCE_BUFLEN]; size_t maxlen = 0; int n; coap_list_t *node; assert(ctx); assert(resource); /* first, update the link-set */ for (node = ctx->resources; node; node = node->next) { n = print_link(COAP_RESOURCE(node), resources + maxlen, RESOURCE_BUFLEN - maxlen); if (n <= 0) { /* error */ debug("resource description too long, truncating\n"); resources[maxlen] = '\0'; break; } maxlen += n; if (node->next) /* check if another entry follows */ resources[maxlen++] = ','; else /* no next, terminate string */ resources[maxlen] = '\0'; } *finished = 1; switch (*mediatype) { case COAP_MEDIATYPE_ANY : case COAP_MEDIATYPE_APPLICATION_LINK_FORMAT : *mediatype = COAP_MEDIATYPE_APPLICATION_LINK_FORMAT; break; default : *buflen = 0; return COAP_RESPONSE_415; } if ( offset > maxlen ) { *buflen = 0; return COAP_RESPONSE_400; } else if ( offset + *buflen > maxlen ) *buflen = maxlen - offset; memcpy(buf, resources + offset, *buflen); *finished = offset + *buflen == maxlen; return COAP_RESPONSE_200; } int resource_time(coap_uri_t *uri, coap_tid_t *id, unsigned char *mediatype, unsigned int offset, unsigned char *buf, unsigned int *buflen, int *finished, unsigned int method) { static unsigned char b[400]; size_t maxlen; time_t now; struct tm *tlocal; time(&now); tlocal = localtime(&now); *finished = 1; if ( !tlocal ) { *buflen = 0; return COAP_RESPONSE_500; } switch (*mediatype) { case COAP_MEDIATYPE_ANY : case COAP_MEDIATYPE_TEXT_PLAIN : *mediatype = COAP_MEDIATYPE_TEXT_PLAIN; maxlen = strftime(resource_buf, sizeof(b), "%b %d %H:%M:%S", tlocal); break; case COAP_MEDIATYPE_TEXT_XML : case COAP_MEDIATYPE_APPLICATION_XML : maxlen = strftime(resource_buf, sizeof(b), "\n %Y-%m-%d\n \n %S\n", tlocal); break; default : *buflen = 0; return COAP_RESPONSE_415; } if ( offset > maxlen ) { *buflen = 0; return COAP_RESPONSE_400; } else if ( offset + *buflen > maxlen ) *buflen = maxlen - offset; memcpy(buf, resource_buf + offset, *buflen); *finished =offset + *buflen == maxlen; return COAP_RESPONSE_200; } int resource_lipsum(coap_uri_t *uri, coap_tid_t *id, unsigned char *mediatype, unsigned int offset, unsigned char *buf, unsigned int *buflen, int *finished, unsigned int method) { static unsigned char verylargebuf[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris fermentum, lacus elementum venenatis aliquet, tortor risus laoreet sapien, a vulputate libero dolor ut odio. Vivamus congue elementum fringilla. Suspendisse porttitor, lectus sed gravida volutpat, dolor magna gravida massa, id fermentum lectus mi quis erat. Suspendisse lacinia, libero in euismod bibendum, magna nisi tempus lacus, eu suscipit augue nisi vel nulla. Praesent gravida lacus nec elit vestibulum sit amet rhoncus dui fringilla. Quisque diam lacus, ullamcorper non consectetur vitae, pellentesque eget lectus. Vestibulum velit nulla, venenatis vel mattis at, scelerisque nec mauris. Nulla facilisi. Mauris vel erat mi. Morbi et nulla nibh, vitae cursus eros. In convallis, magna egestas dictum porttitor, diam magna sagittis nisi, rhoncus tincidunt ligula felis sed mauris. Pellentesque pulvinar ante id velit convallis in porttitor justo imperdiet. Curabitur viverra placerat tincidunt. Vestibulum justo lacus, sollicitudin in facilisis vel, tempus nec erat. Duis varius viverra aliquet. In tempor varius elit vel pharetra. Sed mattis, quam in pulvinar ullamcorper, est ipsum tempor dui, at fringilla magna sem in sapien. Phasellus sollicitudin ornare sem, nec porta libero tempus vitae. Maecenas posuere pulvinar dictum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras eros mauris, pulvinar tempor facilisis ut, condimentum in magna. Nullam eget ipsum sit amet lacus massa nunc."; unsigned int maxlen = sizeof(verylargebuf) - 1; switch (*mediatype) { case COAP_MEDIATYPE_ANY : case COAP_MEDIATYPE_TEXT_PLAIN : *mediatype = COAP_MEDIATYPE_TEXT_PLAIN; break; default : *buflen = 0; *finished = 1; return COAP_RESPONSE_415; } if ( offset > maxlen ) { *buflen = 0; return COAP_RESPONSE_400; } else if ( offset + *buflen > maxlen ) *buflen = maxlen - offset; memcpy(buf, verylargebuf + offset, *buflen); *finished = offset + *buflen == maxlen; return COAP_RESPONSE_200; } int _resource_from_dir(char *filename, unsigned char *mediatype, unsigned int offset, unsigned char *buf, unsigned int *buflen, int *finished) { DIR *dir; struct dirent *dirent; size_t namelen, overhead; int pos = 0; *finished = 1; switch (*mediatype) { case COAP_MEDIATYPE_ANY : case COAP_MEDIATYPE_APPLICATION_LINK_FORMAT: *mediatype = COAP_MEDIATYPE_APPLICATION_LINK_FORMAT; break; /* case COAP_MEDIATYPE_TEXT_PLAIN: */ /* break; */ default: *buflen = 0; return COAP_RESPONSE_415; } if ( (dir = opendir(filename)) == NULL ) { perror("_resource_from_dir: opendir"); *buflen = 0; return COAP_RESPONSE_404; } overhead = strlen(filename) + 10; errno = 0; while ( (dirent = readdir(dir)) ) { namelen = strlen(dirent->d_name); /* skip '.' and '..' as they are not allowed in CoAP URIs */ if ( dirent->d_name[0] == '.' ) { if ( namelen == 1 || (namelen == 2 && dirent->d_name[1] == '.') ) continue; } if (pos + overhead + namelen * 2 > sizeof(resource_buf) - 1) break; /* broken */ if ( pos + overhead + namelen * 2 < offset) { offset -= overhead + namelen * 2; } else { pos += sprintf(resource_buf + pos, ";n=\"%s\",", filename, dirent->d_name, dirent->d_name); } if ( pos > offset + *buflen ) break; } if (errno != 0) goto error; closedir(dir); if ( pos <= offset ) { *buflen = 0; return COAP_RESPONSE_400; } if ( (offset < pos) && (pos <= offset + *buflen) ) { *buflen = pos - offset - 1; *finished = 1; } else *finished = 0; memcpy(buf, resource_buf + offset, *buflen); return COAP_RESPONSE_200; error: perror("_resource_from_dir: readdir"); closedir(dir); return COAP_RESPONSE_500; } int resource_from_file(coap_uri_t *uri, coap_tid_t *id, unsigned char *mediatype, unsigned int offset, unsigned char *buf, unsigned int *buflen, int *finished, unsigned int method) { static char filename[FILENAME_MAX+1]; struct stat statbuf; FILE *file; int code = COAP_RESPONSE_500; /* result code */ if (uri) { memcpy(filename, uri->path.s, uri->path.length); filename[uri->path.length] = '\0'; if (!is_valid("", (unsigned char *)filename, uri->path.length) ) { fprintf(stderr, "dropped invalid URI '%s'\n", filename); code = COAP_RESPONSE_404; goto error; } } else { fprintf(stderr, "dropped NULL URI\n"); code = COAP_RESPONSE_404; goto error; } if (stat(filename, &statbuf) < 0) { perror("resource_from_file: stat"); code = COAP_RESPONSE_404; goto error; } if ( S_ISDIR(statbuf.st_mode) ) { /* handle directory if mediatype allows */ return _resource_from_dir(filename, mediatype, offset, buf, buflen, finished); } if ( !S_ISREG(statbuf.st_mode) ) { fprintf(stderr,"%s not a regular file, skipped\n", filename); code = COAP_RESPONSE_404; goto error; } if ( offset > statbuf.st_size ) { code = COAP_RESPONSE_400; goto error; } else if ( offset + *buflen > statbuf.st_size ) *buflen = statbuf.st_size - offset; file = fopen(filename, "r"); if ( !file ) { perror("resource_from_file: fopen"); code = COAP_RESPONSE_500; goto error; } if ( fseek(file, offset, SEEK_SET) < 0 ) { perror("resource_from_file: fseek"); code = COAP_RESPONSE_500; goto error; } *buflen = fread(buf, 1, *buflen, file); fclose(file); *finished = offset + *buflen >= statbuf.st_size; return COAP_RESPONSE_200; error: *buflen = 0; *finished = 1; return code; } int resource_ni(coap_uri_t *uri, coap_tid_t *id, unsigned char *mediatype, unsigned int offset, unsigned char *buf, unsigned int *buflen, int *finished, unsigned int method) { *finished = 1; return COAP_RESPONSE_200; } #define RESOURCE_SET_URI(r,st) \ (r)->uri = coap_new_uri((const unsigned char *)(st), strlen(st)); #define RESOURCE_SET_DESC(r,st) \ (r)->name = coap_new_string(strlen(st)); \ if ((r)->name) { \ (r)->name->length = strlen(st); \ memcpy((r)->name->s, (st), (r)->name->length); \ } void init_resources(coap_context_t *ctx) { static const char *u_lipsum = "/lipsum"; static const char *d_lipsum = "some large text to test buffer sizes ( marks its end)"; static const char *u_time = "/time"; static const char *d_time = "server's local time and date"; static const char *u_file = "/filestorage"; static const char *d_file = "a single file, you can PUT things here"; static const char *u_data = "/data-sink"; static const char *d_data = "POSTed data is stored here"; static const char *u_ni = "/ni"; static const char *d_ni = "node integrate"; coap_resource_t *r; if ( !(r = coap_malloc( sizeof(coap_resource_t) ))) return; memset(r, 0, sizeof(coap_resource_t)); r->uri = coap_new_uri((const unsigned char *)"/" COAP_DEFAULT_URI_WELLKNOWN, sizeof(COAP_DEFAULT_URI_WELLKNOWN)); r->mediatype = COAP_MEDIATYPE_APPLICATION_LINK_FORMAT; r->dirty = 0; r->writable = 0; coap_add_resource( ctx, r ); if ( !(r = coap_malloc( sizeof(coap_resource_t) ))) return; memset(r, 0, sizeof(coap_resource_t)); RESOURCE_SET_URI(r,u_lipsum); RESOURCE_SET_DESC(r,d_lipsum); r->mediatype = COAP_MEDIATYPE_TEXT_PLAIN; r->dirty = 1; r->writable = 0; r->data = resource_lipsum; r->maxage = 1209600; /* two weeks */ coap_add_resource( ctx, r ); if ( !(r = coap_malloc( sizeof(coap_resource_t) ))) return; memset(r, 0, sizeof(coap_resource_t)); RESOURCE_SET_URI(r,u_time); RESOURCE_SET_DESC(r,d_time); r->mediatype = COAP_MEDIATYPE_ANY; r->dirty = 0; r->writable = 0; r->data = resource_time; r->maxage = 1; coap_add_resource( ctx, r ); if ( !(r = coap_malloc( sizeof(coap_resource_t) ))) return; memset(r, 0, sizeof(coap_resource_t)); RESOURCE_SET_URI(r,u_file); RESOURCE_SET_DESC(r,d_file); r->mediatype = COAP_MEDIATYPE_ANY; r->dirty = 0; r->writable = 1; r->data = resource_from_file; write_file("filestorage",(unsigned char *)"initial text", 12); coap_add_resource( ctx, r ); if ( !(r = coap_malloc( sizeof(coap_resource_t) ))) return; memset(r, 0, sizeof(coap_resource_t)); RESOURCE_SET_URI(r,u_data); RESOURCE_SET_DESC(r,d_data); r->mediatype = COAP_MEDIATYPE_APPLICATION_LINK_FORMAT; r->dirty = 0; r->writable = 0; r->data = resource_from_file; r->maxage = 10; coap_add_resource(ctx, r); if ( !(r = coap_malloc( sizeof(coap_resource_t) ))) return; memset(r, 0, sizeof(coap_resource_t)); RESOURCE_SET_URI(r,u_ni); RESOURCE_SET_DESC(r,d_ni); r->mediatype = COAP_MEDIATYPE_ANY; r->dirty = 0; r->writable = 1; r->data = resource_ni; r->maxage = 10; coap_add_resource(ctx, r); } int main(int argc, char **argv) { coap_context_t *ctx; fd_set readfds; struct timeval tv, *timeout; int result; time_t now; coap_queue_t *nextpdu; unsigned short port = COAP_DEFAULT_PORT; int opt; char *group = NULL; while ((opt = getopt(argc, argv, "g:p:")) != -1) { switch (opt) { case 'g' : group = optarg; break; case 'p' : port = atoi(optarg); break; default: usage( argv[0], PACKAGE_VERSION ); exit( 1 ); } } ctx = coap_new_context( port ); if ( !ctx ) return -1; if ( group ) join( ctx, group ); coap_register_message_handler( ctx, message_handler ); init_resources(ctx); signal(SIGINT, handle_sigint); while ( !quit ) { FD_ZERO(&readfds); FD_SET( ctx->sockfd, &readfds ); nextpdu = coap_peek_next( ctx ); time(&now); while ( nextpdu && nextpdu->t <= now ) { coap_retransmit( ctx, coap_pop_next( ctx ) ); nextpdu = coap_peek_next( ctx ); } if ( nextpdu && nextpdu->t <= now + COAP_RESOURCE_CHECK_TIME ) { /* set timeout if there is a pdu to send before our automatic timeout occurs */ tv.tv_usec = 0; tv.tv_sec = nextpdu->t - now; timeout = &tv; } else { tv.tv_usec = 0; tv.tv_sec = COAP_RESOURCE_CHECK_TIME; timeout = &tv; } result = select( FD_SETSIZE, &readfds, 0, 0, timeout ); if ( result < 0 ) { /* error */ if (errno != EINTR) perror("select"); } else if ( result > 0 ) { /* read from socket */ if ( FD_ISSET( ctx->sockfd, &readfds ) ) { coap_read( ctx ); /* read received data */ coap_dispatch( ctx ); /* and dispatch PDUs from receivequeue */ } } else { /* timeout */ coap_check_resource_list( ctx ); coap_check_subscriptions( ctx ); } } coap_free_context( ctx ); return 0; } tinyos-2.1.2+dfsg/support/sdk/c/coap/examples/tiny.c000066400000000000000000000056461207233610700224020ustar00rootroot00000000000000/* tiny -- tiny sender * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #include #include #include #include #include #include #include #include #include #include #include #include "../coap.h" static coap_tid_t id; coap_pdu_t * make_pdu( unsigned int value ) { coap_pdu_t *pdu; unsigned char enc; static unsigned char buf[20]; int len, ls; if ( ! ( pdu = coap_new_pdu() ) ) return NULL; pdu->hdr->type = COAP_MESSAGE_NON; pdu->hdr->code = COAP_REQUEST_POST; pdu->hdr->id = htons(id++); enc = COAP_PSEUDOFP_ENCODE_8_4_DOWN(value,ls); coap_add_data( pdu, 1, &enc); len = sprintf((char *)buf, "%u", COAP_PSEUDOFP_DECODE_8_4(enc)); if ( len > 0 ) { coap_add_data( pdu, len, buf ); } return pdu; } void usage( const char *program ) { const char *p; p = strrchr( program, '/' ); if ( p ) program = ++p; fprintf( stderr, "%s -- tiny fake sensor\n" "(c) 2010 Olaf Bergmann \n\n" "usage: %s [group address]\n" "\n\nSends some fake sensor values to specified multicast group\n", program, program ); } int main(int argc, char **argv) { coap_context_t *ctx; struct timeval tv; coap_pdu_t *pdu; struct sockaddr_in6 dst; int hops = 16; if ( argc > 1 && strncmp(argv[1], "-h", 2) == 0 ) { usage( argv[0] ); exit( 1 ); } ctx = coap_new_context(0); if ( !ctx ) return -1; id = rand() & INT_MAX; memset(&dst, 0, sizeof(struct sockaddr_in6 )); dst.sin6_family = AF_INET6; inet_pton( AF_INET6, argc > 1 ? argv[1] : "::1", &dst.sin6_addr ); dst.sin6_port = htons( COAP_DEFAULT_PORT ); if ( IN6_IS_ADDR_MULTICAST(&dst.sin6_addr) ) { /* set socket options for multicast */ if ( setsockopt( ctx->sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&hops, sizeof(hops) ) < 0 ) perror("setsockopt: IPV6_MULTICAST_HOPS"); } while ( 1 ) { if (! (pdu = make_pdu( rand() & 0xfff ) ) ) return -1; coap_send( ctx, &dst, pdu ); tv.tv_sec = 5; tv.tv_usec = 0; select( 0, 0, 0, 0, &tv ); } coap_free_context( ctx ); return 0; } tinyos-2.1.2+dfsg/support/sdk/c/coap/list.c000066400000000000000000000042651207233610700205500ustar00rootroot00000000000000/* list.c -- CoAP list structures * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #include #include #include "mem.h" #include "list.h" int coap_insert(coap_list_t **queue, coap_list_t *node, int (*order)(void *, void *node) ) { coap_list_t *p, *q; if ( !queue || !node ) return 0; /* set queue head if empty */ if ( !*queue ) { *queue = node; return 1; } /* replace queue head if new node has to be added before the existing queue head */ q = *queue; if ( order( node->data, q->data ) < 0) { node->next = q; *queue = node; return 1; } /* search for right place to insert */ do { p = q; q = q->next; } while ( q && order( node->data, q->data ) >= 0); /* insert new item */ node->next = q; p->next = node; return 1; } int coap_delete(coap_list_t *node) { if ( !node ) return 0; if ( node->delete ) node->delete( node->data ); coap_free( node->data ); coap_free( node ); return 1; } void coap_delete_list(coap_list_t *queue) { if ( !queue ) return; coap_delete_list( queue->next ); coap_delete( queue ); } coap_list_t * coap_new_listnode(void *data, void (*delete)(void *) ) { coap_list_t *node = coap_malloc( sizeof(coap_list_t) ); if ( ! node ) { #ifndef IDENT_APPNAME perror ("coap_new_listnode: malloc"); #endif return NULL; } memset(node, 0, sizeof(coap_list_t)); node->data = data; node->delete = delete; return node; } tinyos-2.1.2+dfsg/support/sdk/c/coap/list.h000066400000000000000000000035631207233610700205550ustar00rootroot00000000000000/* list.h -- CoAP list structures * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #ifndef _COAP_LIST_H_ #define _COAP_LIST_H_ struct coap_linkedlistnode { struct coap_linkedlistnode *next; void *data; /** * Callback function that is called from coap_delete to release * additional memory allocated by data Set to NULL if you do not * need this. Note that data is free'd automatically. */ void (*delete)(void *); }; typedef struct coap_linkedlistnode coap_list_t; /** * Adds node to given queue, ordered by specified order function. Returns 1 * when insert was successful, 0 otherwise. */ int coap_insert(coap_list_t **queue, coap_list_t *node, int (*order)(void *, void *) ); /* destroys specified node */ int coap_delete(coap_list_t *node); /* removes all items from given queue and frees the allocated storage */ void coap_delete_list(coap_list_t *queue); /** * Creates a new list node and adds the given data object. The memory allocated * by data will be released by coap_delete() with the new node. Returns the * new list node. */ coap_list_t *coap_new_listnode(void *data, void (*delete)(void *) ); #endif /* _COAP_LIST_H_ */ tinyos-2.1.2+dfsg/support/sdk/c/coap/mem.h000066400000000000000000000020261207233610700203510ustar00rootroot00000000000000/* mem.h -- CoAP memory handling * Currently, this is just a dummy for malloc/free * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #ifndef _COAP_MEM_H_ #define _COAP_MEM_H_ #include #define coap_malloc(size) malloc(size) #define coap_free(size) free(size) #endif /* _COAP_MEM_H_ */ tinyos-2.1.2+dfsg/support/sdk/c/coap/net.c000066400000000000000000000375261207233610700203710ustar00rootroot00000000000000/* net.c -- CoAP network interface * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #include #include #ifndef IDENT_APPNAME #include #include #endif #ifndef PLATFORM_MICAZ #include #endif #ifndef IDENT_APPNAME #include #include #include #endif #include "debug.h" #include "mem.h" #include "str.h" #ifndef IDENT_APPNAME #include "subscribe.h" #endif #include "net.h" #define options_start(p) ((coap_opt_t *) ( (unsigned char *)p->hdr + sizeof ( coap_hdr_t ) )) #define options_end(p, opt) { \ unsigned char opt_code = 0, cnt; \ *opt = options_start( node->pdu ); \ for ( cnt = (p)->hdr->optcnt; cnt; --cnt ) { \ opt_code += COAP_OPT_DELTA(**opt); \ *opt = (coap_opt_t *)( (unsigned char *)(*opt) + COAP_OPT_SIZE(**opt)); \ } \ } /************************************************************************ ** some functions for debugging ************************************************************************/ #ifndef IDENT_APPNAME void for_each_option(coap_pdu_t *pdu, void (*f)(coap_opt_t *, unsigned char, unsigned int, const unsigned char *) ) { unsigned char cnt; coap_opt_t *opt; unsigned char opt_code = 0; if (! pdu ) return; opt = options_start( pdu ); for ( cnt = pdu->hdr->optcnt; cnt; --cnt ) { opt_code += COAP_OPT_DELTA(*opt); f ( opt, opt_code, COAP_OPT_LENGTH(*opt), COAP_OPT_VALUE(*opt) ); opt = (coap_opt_t *)( (unsigned char *)opt + COAP_OPT_SIZE(*opt) ); } } unsigned int print_readable( const unsigned char *data, unsigned int len, unsigned char *result, unsigned int buflen, int encode_always ) { static unsigned char hex[] = "0123456789ABCDEF"; unsigned int cnt = 0; while ( len && (cnt < buflen-1) ) { if ( !encode_always && isprint( *data ) ) { *result++ = *data; ++cnt; } else { if ( cnt+4 < buflen-1 ) { *result++ = '\\'; *result++ = 'x'; *result++ = hex[(*data & 0xf0) >> 4]; *result++ = hex[*data & 0x0f ]; cnt += 4; } else break; } ++data; --len; } *result = '\0'; return cnt; } void show( coap_opt_t *opt, unsigned char type, unsigned int len, const unsigned char *data ) { static unsigned char buf[COAP_MAX_PDU_SIZE]; print_readable( data, len, buf, COAP_MAX_PDU_SIZE, 0 ); printf(" %d:'%s'", type, buf ); } void show_data( coap_pdu_t *pdu ) { static unsigned char buf[COAP_MAX_PDU_SIZE]; unsigned int len = (int)( (unsigned char *)pdu->hdr + pdu->length - pdu->data ); print_readable( pdu->data, len, buf, COAP_MAX_PDU_SIZE, 0 ); printf("'%s'", buf); } void coap_show_pdu( coap_pdu_t *pdu ) { printf("pdu (%d bytes)", pdu->length); printf(" v:%d t:%d oc:%d c:%d id:%u", pdu->hdr->version, pdu->hdr->type, pdu->hdr->optcnt, pdu->hdr->code, ntohs(pdu->hdr->id)); if ( pdu->hdr->optcnt ) { printf(" o:"); for_each_option ( pdu, show ); } if ( pdu->data < (unsigned char *)pdu->hdr + pdu->length ) { printf("\n data:"); show_data ( pdu ); } printf("\n"); fflush(stdout); } #endif /************************************************************************/ int coap_insert_node(coap_queue_t **queue, coap_queue_t *node, int (*order)(coap_queue_t *, coap_queue_t *node) ) { coap_queue_t *p, *q; if ( !queue || !node ) return 0; /* set queue head if empty */ if ( !*queue ) { *queue = node; return 1; } /* replace queue head if PDU's time is less than head's time */ q = *queue; if ( order( node, q ) < 0) { node->next = q; *queue = node; return 1; } /* search for right place to insert */ do { p = q; q = q->next; } while ( q && order( node, q ) >= 0 ); /* insert new item */ node->next = q; p->next = node; return 1; } int coap_delete_node(coap_queue_t *node) { if ( !node ) return 0; coap_free( node->pdu ); coap_free( node ); return 1; } void coap_delete_all(coap_queue_t *queue) { if ( !queue ) return; coap_delete_all( queue->next ); coap_delete_node( queue ); } coap_queue_t * coap_new_node() { coap_queue_t *node = coap_malloc ( sizeof *node ); if ( ! node ) { #ifndef IDENT_APPNAME perror ("coap_new_node: malloc"); #endif return NULL; } memset(node, 0, sizeof *node ); return node; } coap_queue_t * coap_peek_next( coap_context_t *context ) { if ( !context || !context->sendqueue ) return NULL; return context->sendqueue; } coap_queue_t * coap_pop_next( coap_context_t *context ) { coap_queue_t *next; if ( !context || !context->sendqueue ) return NULL; next = context->sendqueue; context->sendqueue = context->sendqueue->next; next->next = NULL; return next; } #ifndef IDENT_APPNAME coap_context_t * coap_new_context(in_port_t port) { coap_context_t *c = coap_malloc( sizeof( coap_context_t ) ); struct sockaddr_in6 addr; time_t now; int reuse = 1, need_port = 1; srand( getpid() ^ time(&now) ); if ( !c ) { perror("coap_init: malloc:"); return NULL; } memset(c, 0, sizeof( coap_context_t ) ); c->sockfd = socket(AF_INET6, SOCK_DGRAM, 0); if ( c->sockfd < 0 ) { perror("coap_new_context: socket"); goto onerror; } if ( setsockopt( c->sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse) ) < 0 ) perror("setsockopt SO_REUSEADDR"); if ( port == 0 ) { port = COAP_DEFAULT_PORT; need_port = 0; } memset(&addr, 0, sizeof addr ); addr.sin6_family = AF_INET6; addr.sin6_port = htons( port ); memcpy( &addr.sin6_addr, &in6addr_any, sizeof addr.sin6_addr ); if ( bind (c->sockfd, (struct sockaddr *)&addr, sizeof addr) < 0 ) { if (need_port) { perror("coap_new_context: bind"); goto onerror; } do { addr.sin6_port = htons( ++port ); } while (bind (c->sockfd, (struct sockaddr *)&addr, sizeof addr) < 0); } return c; onerror: if ( c->sockfd >= 0 ) close ( c->sockfd ); coap_free( c ); return NULL; } void coap_free_context( coap_context_t *context ) { if ( !context ) return; coap_delete_all(context->recvqueue); coap_delete_all(context->sendqueue); coap_delete_list(context->resources); coap_delete_list(context->subscriptions); close( context->sockfd ); coap_free( context ); } #endif #ifndef IDENT_APPNAME /* releases space allocated by PDU if free_pdu is set */ coap_tid_t coap_send_impl( coap_context_t *context, const struct sockaddr_in6 *dst, coap_pdu_t *pdu, int free_pdu ) { ssize_t bytes_written; #ifndef NDEBUG char addr[INET6_ADDRSTRLEN];/* buffer space for textual represenation of destination address */ #endif if ( !context || !dst || !pdu ) return COAP_INVALID_TID; #ifndef NDEBUG if ( inet_ntop(dst->sin6_family, &dst->sin6_addr, addr, INET6_ADDRSTRLEN) == 0 ) { perror("coap_send_impl: inet_ntop"); } else { fprintf(stderr,"send to [%s]:%d:\n ",addr,ntohs(dst->sin6_port)); } coap_show_pdu( pdu ); #endif bytes_written = sendto( context->sockfd, pdu->hdr, pdu->length, 0, (const struct sockaddr *)dst, sizeof( *dst )); if ( free_pdu ) coap_delete_pdu( pdu ); if ( bytes_written < 0 ) { perror("coap_send: sendto"); return COAP_INVALID_TID; } return ntohs(pdu->hdr->id); } #else // this is defined in LibCoapAdapterP.nc for TinyOS coap_tid_t coap_send_impl( coap_context_t *context, const struct sockaddr_in6 *dst, coap_pdu_t *pdu, int free_pdu ); #endif coap_tid_t coap_send( coap_context_t *context, const struct sockaddr_in6 *dst, coap_pdu_t *pdu ) { return coap_send_impl( context, dst, pdu, 1 ); } #ifndef IDENT_APPNAME int _order_timestamp( coap_queue_t *lhs, coap_queue_t *rhs ) { return lhs && rhs && ( lhs->t < rhs->t ) ? -1 : 1; } coap_tid_t coap_send_confirmed( coap_context_t *context, const struct sockaddr_in6 *dst, coap_pdu_t *pdu ) { coap_queue_t *node; /* send once, and enter into message queue for retransmission unless * retransmission counter is reached */ node = coap_new_node(); time(&node->t); node->t += 1; /* 1 == 1 << 0 == 1 << retransmit_cnt */ memcpy( &node->remote, dst, sizeof( struct sockaddr_in6 ) ); node->pdu = pdu; if ( !coap_insert_node( &context->sendqueue, node, _order_timestamp ) ) { #ifndef NDEBUG fprintf(stderr, "coap_send_confirmed: cannot insert node:into sendqueue\n"); #endif coap_delete_node ( node ); return COAP_INVALID_TID; } return coap_send_impl( context, dst, pdu, 0 ); } coap_tid_t coap_retransmit( coap_context_t *context, coap_queue_t *node ) { if ( !context || !node ) return COAP_INVALID_TID; /* re-initialize timeout when maximum number of retransmissions are not reached yet */ if ( node->retransmit_cnt < COAP_DEFAULT_MAX_RETRANSMIT ) { node->retransmit_cnt++; node->t += ( 1 << node->retransmit_cnt ); coap_insert_node( &context->sendqueue, node, _order_timestamp ); debug("** retransmission #%d of transaction %d\n", node->retransmit_cnt, ntohs(node->pdu->hdr->id)); return coap_send_impl( context, &node->remote, node->pdu, 0 ); } /* no more retransmissions, remove node from system */ debug("** removed transaction %d\n", ntohs(node->pdu->hdr->id)); coap_delete_node( node ); return COAP_INVALID_TID; } #endif int order_transaction_id( coap_queue_t *lhs, coap_queue_t *rhs ) { return ( lhs && rhs && lhs->pdu && rhs->pdu && ( lhs->pdu->hdr->id < lhs->pdu->hdr->id ) ) ? -1 : 1; } #ifndef IDENT_APPNAME int coap_read( coap_context_t *ctx ) { static char buf[COAP_MAX_PDU_SIZE]; ssize_t bytes_read; static struct sockaddr_in6 src; socklen_t addrsize = sizeof src; coap_queue_t *node; coap_opt_t *opt; #ifndef NDEBUG static char addr[INET6_ADDRSTRLEN]; #endif bytes_read = recvfrom( ctx->sockfd, buf, COAP_MAX_PDU_SIZE, 0, (struct sockaddr *)&src, &addrsize ); if ( bytes_read < 0 ) { perror("coap_read: recvfrom"); return -1; } if ( bytes_read < sizeof(coap_hdr_t)) { #ifndef NDEBUG fprintf(stderr, "coap_read: discarded invalid frame (too small)\n" ); #endif return -1; } if (((coap_hdr_t *)buf)->version != COAP_DEFAULT_VERSION ) { #ifndef NDEBUG fprintf(stderr, "coap_read: discarded invalid frame (wrong version 0x%x)\n", ((coap_hdr_t *)buf)->version ); #endif return -1; } node = coap_new_node(); if ( !node ) return -1; node->pdu = coap_new_pdu(); if ( !node->pdu ) { coap_delete_node( node ); return -1; } time( &node->t ); memcpy( &node->remote, &src, sizeof( src ) ); /* "parse" received PDU by filling pdu structure */ memcpy( node->pdu->hdr, buf, bytes_read ); node->pdu->length = bytes_read; /* finally calculate beginning of data block */ options_end( node->pdu, &opt ); if ( (unsigned char *)node->pdu->hdr + node->pdu->length < (unsigned char *)opt ) node->pdu->data = (unsigned char *)node->pdu->hdr + node->pdu->length; else node->pdu->data = (unsigned char *)opt; /* and add new node to receive queue */ coap_insert_node( &ctx->recvqueue, node, order_transaction_id ); #ifndef NDEBUG if ( inet_ntop(src.sin6_family, &src.sin6_addr, addr, INET6_ADDRSTRLEN) == 0 ) { perror("coap_read: inet_ntop"); } else { debug("** received from [%s]:%d:\n ",addr,ntohs(src.sin6_port)); } coap_show_pdu( node->pdu ); #endif return 0; } #endif int coap_remove_transaction( coap_queue_t **queue, coap_tid_t id ) { coap_queue_t *p, *q; if ( !queue || !*queue) return 0; /* replace queue head if PDU's time is less than head's time */ q = *queue; if ( id == q->pdu->hdr->id ) { /* found transaction */ *queue = q->next; coap_delete_node( q ); #ifndef NDEBUG debug("*** removed transaction %u\n", ntohs(id)); #endif return 1; } /* search transaction to remove (only first occurence will be removed) */ do { p = q; q = q->next; } while ( q && id != q->pdu->hdr->id ); if ( q ) { /* found transaction */ p->next = q->next; coap_delete_node( q ); #ifndef NDEBUG debug("*** removed transaction %u\n", ntohs(id)); #endif return 1; } return 0; } coap_queue_t * coap_find_transaction(coap_queue_t *queue, coap_tid_t id) { if ( !queue ) return 0; for (; queue; queue = queue->next) { if (queue->pdu && queue->pdu->hdr && queue->pdu->hdr->id == id) return queue; } return NULL; } #ifdef IDENT_APPNAME // since there are no sockets in tinyos coap_tid_t coap_send_tinyos(coap_context_t *context, struct sockaddr_in6 *dst, coap_pdu_t *pdu, int free_pdu); #endif void coap_dispatch( coap_context_t *context ) { coap_queue_t *node, *sent; coap_uri_t uri; coap_opt_t *opt; int type; coap_pdu_t *response; if ( !context ) return; while ( context->recvqueue ) { node = context->recvqueue; /* remove node from recvqueue */ context->recvqueue = context->recvqueue->next; node->next = NULL; switch ( node->pdu->hdr->type ) { case COAP_MESSAGE_ACK : /* find transaction in sendqueue to stop retransmission */ coap_remove_transaction( &context->sendqueue, node->pdu->hdr->id ); break; case COAP_MESSAGE_RST : /* We have sent something the receiver disliked, so we remove * not only the transaction but also the subscriptions we might * have. */ #ifndef NDEBUG fprintf(stderr, "* got RST for transaction %u\n", ntohs(node->pdu->hdr->id) ); #endif sent = coap_find_transaction(context->sendqueue, node->pdu->hdr->id); if (sent && coap_get_request_uri(sent->pdu, &uri)) { /* The easy way: we still have the transaction that has caused * the trouble.*/ #ifndef IDENT_APPNAME coap_delete_subscription(context, coap_uri_hash(&uri), &node->remote); #endif } else { /* ?? */ } /* find transaction in sendqueue to stop retransmission */ coap_remove_transaction( &context->sendqueue, node->pdu->hdr->id ); break; case COAP_MESSAGE_NON : /* check for unknown critical options */ if ( coap_check_critical(node->pdu, &opt) != 0 ) goto cleanup; break; case COAP_MESSAGE_CON : /* check for unknown critical options */ /* get type and option */ type = coap_check_critical(node->pdu, &opt); if ( type != 0 ) { /* send error response if unknown */ response = coap_new_pdu(); if (response) { response->hdr->type = COAP_MESSAGE_RST; response->hdr->code = COAP_RESPONSE_X_242; response->hdr->id = node->pdu->hdr->id; /* add rejected option */ coap_add_option(response, type, COAP_OPT_LENGTH(*opt), COAP_OPT_VALUE(*opt)); if ( coap_send( context, &node->remote, response ) == COAP_INVALID_TID ) { #ifndef NDEBUG debug("coap_dispatch: error sending reponse"); #endif coap_delete_pdu(response); } } goto cleanup; } break; } /* pass message to upper layer if a specific handler was registered */ if ( context->msg_handler ) context->msg_handler( context, node, NULL ); cleanup: coap_delete_node( node ); } } void coap_register_message_handler( coap_context_t *context, coap_message_handler_t handler) { context->msg_handler = (void (*)( void *, coap_queue_t *, void *)) handler; } int coap_can_exit( coap_context_t *context ) { return !context || (context->recvqueue == NULL && context->sendqueue == NULL); } tinyos-2.1.2+dfsg/support/sdk/c/coap/net.h000066400000000000000000000126301207233610700203630ustar00rootroot00000000000000/* net.h -- CoAP network interface * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #ifndef _COAP_NET_H_ #define _COAP_NET_H_ #include #ifdef IDENT_APPNAME #include typedef uint16_t ssize_t; #ifdef PLATFORM_MICAZ typedef uint16_t in_port_t; #endif #else #include #include #include #endif #include "pdu.h" struct coap_listnode { struct coap_listnode *next; #ifndef IDENT_APPNAME time_t t; /* when to send PDU for the next time */ #endif unsigned char retransmit_cnt; /* retransmission counter, will be removed when zero */ struct sockaddr_in6 remote; /* remote address */ coap_pdu_t *pdu; /* the CoAP PDU to send */ }; typedef struct coap_listnode coap_queue_t; /* adds node to given queue, ordered by specified order function */ int coap_insert_node(coap_queue_t **queue, coap_queue_t *node, int (*order)(coap_queue_t *, coap_queue_t *node) ); /* destroys specified node */ int coap_delete_node(coap_queue_t *node); /* removes all items from given queue and frees the allocated storage */ void coap_delete_all(coap_queue_t *queue); /* creates a new node suitable for adding to the CoAP sendqueue */ coap_queue_t *coap_new_node(); /* The CoAP stack's global state is stored in a coap_context_t object */ typedef struct { coap_list_t *resources, *subscriptions; /* FIXME: make these hash tables */ coap_queue_t *sendqueue, *recvqueue; /* FIXME make these coap_list_t */ #ifndef IDENT_APPNAME int sockfd; /* send/receive socket */ #else int tinyos_port; #endif int reqtoken; void ( *msg_handler )( void *, coap_queue_t *, void *); coap_queue_t *splitphasequeue; /* FIXME to keep the details of TinyOS splitphase responses */ } coap_context_t; typedef void (*coap_message_handler_t)( coap_context_t *, coap_queue_t *, void *); /** * Registers a new message handler that is called whenever a new PDU * was received. Note that the transactions are handled on the lower * layer previously to stop retransmissions, e.g. */ void coap_register_message_handler( coap_context_t *context, coap_message_handler_t handler); /** * Registers a new handler function that is called when a RST message * has been received. */ void coap_register_error_handler( coap_context_t *context, coap_message_handler_t handler); /* Returns the next pdu to send without removing from sendqeue. */ coap_queue_t *coap_peek_next( coap_context_t *context ); /* Returns the next pdu to send and removes it from the sendqeue. */ coap_queue_t *coap_pop_next( coap_context_t *context ); /* Creates a new coap_context_t object that will hold the CoAP stack status. If port is * set to zero, the next free port will be used as server port, starting with COAP_DEFAULT_PORT. */ coap_context_t *coap_new_context(in_port_t port); /* CoAP stack context must be released with coap_free_context() */ void coap_free_context( coap_context_t *context ); /** * Sends a confirmed CoAP message to given destination. The memory that is allocated by pdu will * be released by coap_send_confirmed(). The caller must not make any assumption on the lifetime * of pdu. */ coap_tid_t coap_send_confirmed( coap_context_t *context, const struct sockaddr_in6 *dst, coap_pdu_t *pdu ); /** * Sends a non-confirmed CoAP message to given destination. The memory that is allocated by pdu will * be released by coap_send(). The caller must not make any assumption on the lifetime of pdu. */ #ifndef IDENT_APPNAME coap_tid_t coap_send( coap_context_t *context, const struct sockaddr_in6 *dst, coap_pdu_t *pdu ); #endif /** Handles retransmissions of confirmable messages */ coap_tid_t coap_retransmit( coap_context_t *context, coap_queue_t *node ); #ifndef IDENT_APPNAME /** * Reads data from the network and tries to parse as CoAP PDU. On success, 0 is returned * and a new node with the parsed PDU is added to the receive queue in the specified context * object. */ int coap_read( coap_context_t *context ); #endif /** Removes transaction with specified id from given queue. Returns 0 if not found, 1 otherwise. */ int coap_remove_transaction( coap_queue_t **queue, coap_tid_t id ); /** * Retrieves transaction from queue. * @queue The transaction queue to be searched * @id Unique key of the transaction to find. * @return A pointer to the transaction object or NULL if not found */ coap_queue_t *coap_find_transaction(coap_queue_t *queue, coap_tid_t id); /** Dispatches the PDUs from the receive queue in given context. */ void coap_dispatch( coap_context_t *context ); /** Returns 1 if there are no messages to send or to dispatch in the context's queues. */ int coap_can_exit( coap_context_t *context ); int order_transaction_id( coap_queue_t *lhs, coap_queue_t *rhs ); #endif /* _COAP_NET_H_ */ tinyos-2.1.2+dfsg/support/sdk/c/coap/pdu.c000066400000000000000000000143651207233610700203670ustar00rootroot00000000000000/* pdu.c -- CoAP message structure * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #include #include #include #ifdef IDENT_APPNAME #include #else #include #endif #include "debug.h" #include "mem.h" #include "pdu.h" coap_pdu_t * coap_new_pdu() { coap_pdu_t *pdu = coap_malloc( sizeof(coap_pdu_t) + COAP_MAX_PDU_SIZE ); if (!pdu) { #ifndef IDENT_APPNAME perror("new_pdu: malloc"); #endif return NULL; } /* initialize PDU */ memset(pdu, 0, sizeof(coap_pdu_t) + COAP_MAX_PDU_SIZE ); pdu->hdr = (coap_hdr_t *) ( (unsigned char *)pdu + sizeof(coap_pdu_t) ); pdu->hdr->version = COAP_DEFAULT_VERSION; pdu->hdr->id = ntohs( COAP_INVALID_TID ); /* data points after the header; when options are added, the data pointer is moved to the back */ pdu->length = sizeof(coap_hdr_t); pdu->data = (unsigned char *)pdu->hdr + pdu->length; return pdu; } void coap_delete_pdu(coap_pdu_t *pdu) { coap_free( pdu ); } #define options_start(p) ((coap_opt_t *) ( (unsigned char *)p->hdr + sizeof ( coap_hdr_t ) )) int coap_add_option(coap_pdu_t *pdu, unsigned char type, unsigned int len, const unsigned char *data) { unsigned char cnt; coap_opt_t *opt; unsigned char opt_code = 0; if (!pdu) return -1; /* get last option from pdu to calculate the delta */ opt = options_start( pdu ); for ( cnt = pdu->hdr->optcnt; cnt; --cnt ) { opt_code += COAP_OPT_DELTA(*opt); opt = (coap_opt_t *)( (unsigned char *)opt + COAP_OPT_SIZE(*opt) ); } if ( type < opt_code ) { #ifndef NDEBUG fprintf(stderr, "options not added in correct order\n"); #endif return -1; } /* Create new option after last existing option: First check if we * need fence posts between type and last opt_code (i.e. delta > * 15), and then add actual option. */ while (type - opt_code > 15) { cnt = opt_code / COAP_OPTION_NOOP; /* add fence post */ pdu->hdr->optcnt += 1; COAP_OPT_SETLENGTH( *opt, 0 ); COAP_OPT_SETDELTA( *opt, (COAP_OPTION_NOOP * (cnt+1)) - opt_code ); opt_code += COAP_OPT_DELTA(*opt); opt = (coap_opt_t *)( (unsigned char *)opt + COAP_OPT_SIZE(*opt) ); } /* here, the actual option is added (delta <= 15) */ pdu->hdr->optcnt += 1; COAP_OPT_SETDELTA( *opt, type - opt_code ); COAP_OPT_SETLENGTH( *opt, len ); memcpy(COAP_OPT_VALUE(*opt), data, len); pdu->data = (unsigned char *)COAP_OPT_VALUE(*opt) + len ; pdu->length = pdu->data - (unsigned char *)pdu->hdr; return len; } coap_opt_t * coap_check_option(coap_pdu_t *pdu, unsigned char type) { unsigned char cnt; coap_opt_t *opt; unsigned char opt_code = 0; if (!pdu) return NULL; /* get last option from pdu to calculate the delta */ opt = options_start( pdu ); for ( cnt = pdu->hdr->optcnt; cnt && opt_code < type; --cnt ) { opt_code += COAP_OPT_DELTA(*opt); /* check if current option is the one we are looking for */ if (type == opt_code) return opt; /* yes, return */ /* goto next option */ opt = (coap_opt_t *)( (unsigned char *)opt + COAP_OPT_SIZE(*opt) ); } return NULL; } int coap_check_critical(coap_pdu_t *pdu, coap_opt_t **option) { unsigned char cnt; unsigned char opt_code = 0; if (!pdu) goto success; /* get last option from pdu to calculate the delta */ *option = options_start( pdu ); for ( cnt = pdu->hdr->optcnt; cnt; --cnt ) { opt_code += COAP_OPT_DELTA(**option); /* check if current option is critical */ if (opt_code & 0x01) { switch (opt_code) { /* skip known options */ case COAP_OPTION_CONTENT_TYPE : case COAP_OPTION_URI_AUTHORITY : case COAP_OPTION_URI_PATH : case COAP_OPTION_TOKEN : case COAP_OPTION_BLOCK : case COAP_OPTION_URI_QUERY : break; default: /* return first unknown critical option */ #ifndef NDEBUG fprintf(stderr, "coap_check_critical: unknown critical option %d\n", opt_code); #endif return opt_code; } } /* goto next option */ *option = (coap_opt_t *)( (unsigned char *)*option + COAP_OPT_SIZE(**option) ); } success: *option = NULL; return 0; } int coap_add_data(coap_pdu_t *pdu, unsigned int len, const unsigned char *data) { if ( !pdu ) return 0; if ( pdu->length + len > COAP_MAX_PDU_SIZE ) { #ifndef NDEBUG fprintf(stderr, "coap_add_data: cannot add: data too large for PDU\n"); #endif return 0; } memcpy( (unsigned char *)pdu->hdr + pdu->length, data, len ); pdu->length += len; return 1; } int coap_get_data(coap_pdu_t *pdu, unsigned int *len, unsigned char **data) { if ( !pdu ) return 0; if ( pdu->data < (unsigned char *)pdu->hdr + pdu->length ) { /* pdu contains data */ *len = (unsigned char *)pdu->hdr + pdu->length - pdu->data; *data = pdu->data; } else { /* no data, clear everything */ *len = 0; *data = NULL; } return 1; } int coap_get_request_uri(coap_pdu_t *pdu, coap_uri_t *result) { coap_opt_t *opt; if (!pdu || !result) return 0; memset(result, 0, sizeof(*result)); if ((opt = coap_check_option(pdu, COAP_OPTION_URI_AUTHORITY))) COAP_SET_STR(&result->na, COAP_OPT_LENGTH(*opt), COAP_OPT_VALUE(*opt)); if ((opt = coap_check_option(pdu, COAP_OPTION_URI_PATH))) COAP_SET_STR(&result->path, COAP_OPT_LENGTH(*opt), COAP_OPT_VALUE(*opt)); if ((opt = coap_check_option(pdu, COAP_OPTION_URI_QUERY))) COAP_SET_STR(&result->query, COAP_OPT_LENGTH(*opt), COAP_OPT_VALUE(*opt)); return 1; } #if 0 int coap_encode_pdu(coap_pdu_t *pdu) { } #endif tinyos-2.1.2+dfsg/support/sdk/c/coap/pdu.h000066400000000000000000000302131207233610700203620ustar00rootroot00000000000000/* pdu.h -- CoAP message structure * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #ifndef _PDU_H_ #define _PDU_H_ #include "config.h" #include "list.h" #include "uri.h" /* pre-defined constants that reflect defaults for CoAP */ #define COAP_DEFAULT_RESPONSE_TIMEOUT 1 /* response timeout in seconds */ #define COAP_DEFAULT_MAX_RETRANSMIT 5 /* max number of retransmissions */ #define COAP_DEFAULT_PORT 61616 /* CoAP default UDP port */ #define COAP_DEFAULT_MAX_AGE 60 /* default maximum object lifetime in seconds */ #define COAP_MAX_PDU_SIZE 700 /* maximum size of a CoAP PDU */ #define COAP_DEFAULT_VERSION 1 /* version of CoAP supported */ #define COAP_DEFAULT_SCHEME "coap" /* the default scheme for CoAP URIs */ #define COAP_DEFAULT_URI_WELLKNOWN ".well-known/core" /* well-known resources URI */ /* CoAP message types */ #define COAP_MESSAGE_CON 0 /* confirmable message (requires ACK/RST) */ #define COAP_MESSAGE_NON 1 /* non-confirmable message (one-shot message) */ #define COAP_MESSAGE_ACK 2 /* used to acknowledge confirmable messages */ #define COAP_MESSAGE_RST 3 /* indicates error in received messages */ /* CoAP request methods */ #define COAP_REQUEST_GET 1 #define COAP_REQUEST_POST 2 #define COAP_REQUEST_PUT 3 #define COAP_REQUEST_DELETE 4 /* CoAP option types (be sure to update check_critical when adding options */ #define COAP_OPTION_CONTENT_TYPE 1 /* C, 8-bit uint, 1 B, 0 (text/plain) */ #define COAP_OPTION_MAXAGE 2 /* E, variable length, 1--4 B, 60 Seconds */ #define COAP_OPTION_URI_SCHEME 3 /* C, String, 1-270 B, "coap" */ #define COAP_OPTION_ETAG 4 /* E, sequence of bytes, 1-4 B, - */ #define COAP_OPTION_URI_AUTHORITY 5 /* C, String, 1-270 B, "" */ #define COAP_OPTION_LOCATION 6 /* E, String, 1-270 B, - */ #define COAP_OPTION_URI_PATH 9 /* C, String, 1-270 B, "" */ #define COAP_OPTION_TOKEN 11 /* C, Sequence of Bytes, 1-2 B, - */ #define COAP_OPTION_URI_QUERY 15 /* C, String, 1-270 B, "" */ /* option types from draft-hartke-coap-observe-01 */ #define COAP_OPTION_SUBSCRIPTION 10 /* E, Duration, 1 B, 0 */ /* selected option types from draft-bormann-coap-misc-04 */ #define COAP_OPTION_ACCEPT 8 /* E Sequence of Bytes, 1-n B, - */ #define COAP_OPTION_BLOCK 13 /* C, unsigned integer, 1--3 B, 0 */ #define COAP_OPTION_NOOP 14 /* no-op for fenceposting */ /* CoAP result codes (HTTP-Code / 100 * 40 + HTTP-Code % 100) */ #define COAP_RESPONSE_CODE(N) (((N)/100 << 5) | (N)%100) #define COAP_RESPONSE_100 40 /* 100 Continue */ #define COAP_RESPONSE_200 80 /* 200 OK */ #define COAP_RESPONSE_201 81 /* 201 Created */ #define COAP_RESPONSE_304 124 /* 304 Not Modified */ #define COAP_RESPONSE_400 160 /* 400 Bad Request */ #define COAP_RESPONSE_404 164 /* 404 Not Found */ #define COAP_RESPONSE_405 165 /* 405 Method Not Allowed */ #define COAP_RESPONSE_415 175 /* 415 Unsupported Media Type */ #define COAP_RESPONSE_500 200 /* 500 Internal Server Error */ #define COAP_RESPONSE_503 203 /* 503 Service Unavailable */ #define COAP_RESPONSE_504 204 /* 504 Gateway Timeout */ #define COAP_RESPONSE_X_240 240 /* Token Option required by server */ #define COAP_RESPONSE_X_241 241 /* Uri-Authority Option required by server */ #define COAP_RESPONSE_X_242 242 /* Critical Option not supported */ #define COAP_SPLITPHASE 300 /* Code for telling TinyOS that the splitphase resource has successfully started */ /* CoAP media type encoding */ #define COAP_MEDIATYPE_TEXT_PLAIN 0 /* text/plain (UTF-8) */ #define COAP_MEDIATYPE_TEXT_XML 1 /* text/xml (UTF-8) */ #define COAP_MEDIATYPE_TEXT_CSV 2 /* text/csv (UTF-8) */ #define COAP_MEDIATYPE_TEXT_HTML 3 /* text/html (UTF-8) */ #define COAP_MEDIATYPE_IMAGE_GIF 21 /* image/gif */ #define COAP_MEDIATYPE_IMAGE_JPEG 22 /* image/jpeg */ #define COAP_MEDIATYPE_IMAGE_PNG 23 /* image/png */ #define COAP_MEDIATYPE_IMAGE_TIFF 24 /* image/tiff */ #define COAP_MEDIATYPE_AUDIO_RAW 25 /* audio/raw */ #define COAP_MEDIATYPE_VIDEO_RAW 26 /* video/raw */ #define COAP_MEDIATYPE_APPLICATION_LINK_FORMAT 40 /* application/link-format */ #define COAP_MEDIATYPE_APPLICATION_XML 41 /* application/xml */ #define COAP_MEDIATYPE_APPLICATION_OCTET_STREAM 42 /* application/octet-stream */ #define COAP_MEDIATYPE_APPLICATION_RDF_XML 43 /* application/rdf+xml */ #define COAP_MEDIATYPE_APPLICATION_SOAP_XML 44 /* application/soap+xml */ #define COAP_MEDIATYPE_APPLICATION_ATOM_XML 45 /* application/atom+xml */ #define COAP_MEDIATYPE_APPLICATION_XMPP_XML 46 /* application/xmpp+xml */ #define COAP_MEDIATYPE_APPLICATION_EXI 47 /* application/exi */ #define COAP_MEDIATYPE_APPLICATION_X_BXML 48 /* application/x-bxml */ #define COAP_MEDIATYPE_APPLICATION_FASTINFOSET 49 /* application/fastinfoset */ #define COAP_MEDIATYPE_APPLICATION_SOAP_FASTINFOSET 50 /* application/soap+fastinfoset */ #define COAP_MEDIATYPE_APPLICATION_JSON 51 /* application/json */ #define COAP_MEDIATYPE_ANY 0xff /* any media type */ /* CoAP transaction id */ typedef unsigned short coap_tid_t; /* typedef int coap_tid_t;*/ #define COAP_INVALID_TID -1 #ifdef WORDS_BIGENDIAN typedef struct { unsigned int version:2; /* protocol version */ unsigned int type:2; /* type flag */ unsigned int optcnt:4; /* number of options following the header */ unsigned int code:8; /* request method (value 1--10) or response code (value 40-255) */ unsigned short id; /* transaction id */ } coap_hdr_t; #else typedef struct { unsigned int optcnt:4; /* number of options following the header */ unsigned int type:2; /* type flag */ unsigned int version:2; /* protocol version */ unsigned int code:8; /* request method (value 1--10) or response code (value 40-255) */ unsigned short id; /* transaction id (network byte order!) */ } coap_hdr_t; #endif #ifdef WORDS_BIGENDIAN typedef union { struct { /* short form, to be used when length < 15 */ unsigned int delta:4; /* option type (expressed as delta) */ unsigned int length:4; /* number of option bytes (15 indicates extended form) */ /* 0--14 bytes options */ } sval; struct { /* extended form, to be used when lengt==15 */ unsigned int delta:4; /* option type (expressed as delta) */ unsigned int flag:4; /* must be 15! */ unsigned int length:8; /* length - 15 */ /* 15--270 bytes options */ } lval; } coap_opt_t; #else typedef union { struct { /* short form, to be used when length < 15 */ unsigned int length:4; /* number of option bytes (15 indicates extended form) */ unsigned int delta:4; /* option type (expressed as delta) */ /* 0--14 bytes options */ } sval; struct { /* extended form, to be used when lengt==15 */ unsigned int flag:4; /* must be 15! */ unsigned int delta:4; /* option type (expressed as delta) */ unsigned int length:8; /* length - 15 */ /* 15--270 bytes options */ } lval; } coap_opt_t; #endif #define COAP_OPT_SVAL(opt) (opt).sval #define COAP_OPT_LVAL(opt) (opt).lval #define COAP_OPT_ISEXTENDED(opt) (COAP_OPT_LVAL(opt).flag == 15) /* these macros should be used to access fields from coap_opt_t */ #define COAP_OPT_DELTA(opt) COAP_OPT_SVAL(opt).delta #define COAP_OPT_SETDELTA(opt,val) COAP_OPT_SVAL(opt).delta = (val) #define COAP_OPT_LENGTH(opt) \ ( COAP_OPT_ISEXTENDED(opt) ? COAP_OPT_LVAL(opt).length + 15 : COAP_OPT_SVAL(opt).length ) #define COAP_OPT_SETLENGTH(opt,val) \ if ( (val) < 15 ) \ COAP_OPT_SVAL(opt).length = (val) & 0x0f; \ else { \ COAP_OPT_LVAL(opt).length = ((val) - 15) & 0xff; \ COAP_OPT_LVAL(opt).flag = 15; \ } #define COAP_OPT_VALUE(opt) \ ( (unsigned char *)&(opt) + ( COAP_OPT_ISEXTENDED(opt) ? 2 : 1 ) ) /* do not forget to adjust this when coap_opt_t is changed! */ #define COAP_OPT_SIZE(opt) ( COAP_OPT_LENGTH(opt) + ( COAP_OPT_ISEXTENDED(opt) ? 2: 1 ) ) /** * Structures for more convenient handling of options. (To be used with ordered * coap_list_t.) The option's data will be added to the end of the coap_option * structure (see macro COAP_OPTION_DATA). */ typedef struct { unsigned short key; /* the option key (no delta coding) */ unsigned int length; #if 0 union { unsigned int n; /* unsigned integer (1--4 bytes) */ unsigned char fp; /* pseudo-fp (currently, only (8,4) supported */ unsigned char *d; /* date (4--6 bytes) */ unsigned char *s; /* string (or sequence of bytes) */ } value; #endif } coap_option; #define COAP_OPTION_KEY(option) (option).key #define COAP_OPTION_LENGTH(option) (option).length #if 0 #define COAP_OPTION_UINT(option) (option).value.n #define COAP_OPTION_PSEUDO_FP(option) (option).value.fp #define COAP_OPTION_DATE(option) (option).value.d #define COAP_OPTION_STRING(option) (option).value.s #endif #define COAP_OPTION_DATA(option) ((unsigned char *)&(option) + sizeof(coap_option)) /** Header structure for CoAP PDUs */ typedef struct { coap_hdr_t *hdr; unsigned short length; /* PDU length (including header, options, data) */ coap_list_t *options; /* parsed options */ unsigned char *data; /* payload */ } coap_pdu_t; /** Options in coap_pdu_t are accessed with the macro COAP_OPTION. */ #define COAP_OPTION(node) ((coap_option *)(node)->options) /** * Creates a new CoAP PDU. The object is created on the heap and must be released * using delete_pdu(); */ coap_pdu_t *coap_new_pdu(); void coap_delete_pdu(coap_pdu_t *); #if 0 int coap_encode_pdu(coap_pdu_t *); #endif /** * Adds option of given type to pdu that is passed as first parameter. coap_add_option() * destroys the PDU's data, so coap_add_data must be called after all options have been * added. */ int coap_add_option(coap_pdu_t *pdu, unsigned char type, unsigned int len, const unsigned char *data); coap_opt_t *coap_check_option(coap_pdu_t *pdu, unsigned char type); /** * Checks for critical options that we do not know, as requests * containing unknown critical options must be discarded. The function * returns a pointer to the first unknown critical option in the given * pdu (hence with delta-encoded type) or NULL when no unknown critical * option was found. The return value contains the type code of the * rejected option, or zero if none was found. */ int coap_check_critical(coap_pdu_t *pdu, coap_opt_t **option); /** * Adds given data to the pdu that is passed as first parameter. Note that the PDU's * data is destroyed by coap_add_option(). */ int coap_add_data(coap_pdu_t *pdu, unsigned int len, const unsigned char *data); /** * Retrieves the length and data pointer of specified PDU. Returns 0 on error * or 1 if *len and *data have correct values. Note that these values are * destroyed with the pdu. */ int coap_get_data(coap_pdu_t *pdu, unsigned int *len, unsigned char **data); /** * Fills the given coap_uri_t object with the request URI components from * the PDU. * @param pdu the PDU * @param result the URI object to update * @return 1 if result has been updated, 0 otherwise, i.e. in case of error */ int coap_get_request_uri(coap_pdu_t *pdu, coap_uri_t *result); #endif /* _PDU_H_ */ tinyos-2.1.2+dfsg/support/sdk/c/coap/str.c000066400000000000000000000023051207233610700203760ustar00rootroot00000000000000/* str.c -- strings to be used in the CoAP library * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #include #include "mem.h" #include "str.h" str *coap_new_string(size_t size) { str *s = coap_malloc(sizeof(str) + size + 1); if ( !s ) { #ifndef NDEBUG perror("coap_new_string: malloc"); #endif return NULL; } memset(s, 0, sizeof(str)); s->s = ((unsigned char *)s) + sizeof(str); return s; } void coap_delete_string(str *s) { coap_free(s); } tinyos-2.1.2+dfsg/support/sdk/c/coap/str.h000066400000000000000000000025471207233610700204130ustar00rootroot00000000000000/* str.h -- strings to be used in the CoAP library * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #ifndef _COAP_STR_H_ #define _COAP_STR_H_ #include typedef struct { size_t length; /* length of string */ unsigned char *s; /* string data */ } str; #define COAP_SET_STR(st,l,v) { (st)->length = (l), (st)->s = (v); } /** * Returns a new string object with at least size bytes storage * allocated. The string must be released using coap_delete_string(); */ str *coap_new_string(size_t size); /** Deletes the given string and releases any memory allocated. */ void coap_delete_string(str *); #endif /* _COAP_STR_H_ */ tinyos-2.1.2+dfsg/support/sdk/c/coap/subscribe.c000066400000000000000000000251101207233610700215460ustar00rootroot00000000000000/* subscribe.c -- subscription handling for CoAP * see draft-hartke-coap-observe-01 * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #include #include #ifndef IDENT_APPNAME #include #endif #include "pdu.h" #include "mem.h" #include "encode.h" #include "debug.h" #include "subscribe.h" #define HMASK (ULONG_MAX >> 1) #ifndef IDENT_APPNAME void notify(coap_context_t *context, coap_resource_t *res, coap_subscription_t *sub, unsigned int duration, int code) { coap_pdu_t *pdu; int ls, finished=0; unsigned char ct, d; unsigned int length; #ifndef NDEBUG char addr[INET6_ADDRSTRLEN]; #endif if ( !context || !res || !sub || !(pdu = coap_new_pdu()) ) return; pdu->hdr->type = COAP_MESSAGE_CON; pdu->hdr->id = rand(); /* use a random transaction id */ pdu->hdr->code = code; /* FIXME: content-type and data (how about block?) */ if (res->uri->na.length) coap_add_option (pdu, COAP_OPTION_URI_AUTHORITY, res->uri->na.length, res->uri->na.s ); if (res->uri->path.length) coap_add_option (pdu, COAP_OPTION_URI_PATH, res->uri->path.length, res->uri->path.s); d = COAP_PSEUDOFP_ENCODE_8_4_DOWN(duration, ls); coap_add_option ( pdu, COAP_OPTION_SUBSCRIPTION, 1, &d ); if (sub->token.length) { coap_add_option (pdu, COAP_OPTION_TOKEN, sub->token.length, sub->token.s); } if (res->uri->query.length) coap_add_option (pdu, COAP_OPTION_URI_QUERY, res->uri->query.length, res->uri->query.s ); if (res->data) { length = (unsigned char *)pdu->hdr + COAP_MAX_PDU_SIZE - pdu->data; ct = res->mediatype; res->data(res->uri, &pdu->hdr->id, &ct, 0, pdu->data, &length, &finished, COAP_REQUEST_GET); /* TODO: check whether method is really always a GET */ pdu->length += length; /* TODO: add block option if not finished */ /* TODO: add mediatype */ } #ifndef NDEBUG if ( inet_ntop(AF_INET6, &(sub->subscriber.sin6_addr), addr, INET6_ADDRSTRLEN) ) { debug("*** notify for %s to [%s]:%d\n", res->uri->path.s, addr, ntohs(sub->subscriber.sin6_port)); } #endif if ( pdu && coap_send_confirmed(context, &sub->subscriber, pdu ) == COAP_INVALID_TID ) { #ifndef NDEBUG debug("coap_check_resource_list: error sending notification\n"); #endif coap_delete_pdu(pdu); } } #endif #ifndef IDENT_APPNAME void coap_check_resource_list(coap_context_t *context) { coap_list_t *res, *sub; coap_key_t key; time_t now; if ( !context || !context->resources /* || !context->subscribers */) return; time(&now); for (res = context->resources; res; res = res->next) { if ( COAP_RESOURCE(res)->dirty && COAP_RESOURCE(res)->uri ) { key = coap_uri_hash( COAP_RESOURCE(res)->uri ) ; /* is subscribed? */ for (sub = context->subscriptions; sub; sub = sub->next) { if ( COAP_SUBSCRIPTION(sub)->resource == key ) { /* notify subscriber */ notify(context, COAP_RESOURCE(res), COAP_SUBSCRIPTION(sub), COAP_SUBSCRIPTION(sub)->expires - now, COAP_RESPONSE_200); } } COAP_RESOURCE(res)->dirty = 0; } } } #endif coap_resource_t * coap_get_resource_from_key(coap_context_t *ctx, coap_key_t key) { coap_list_t *node; if (ctx) { /* TODO: use hash table for resources with key to access */ for (node = ctx->resources; node; node = node->next) { if ( key == coap_uri_hash(COAP_RESOURCE(node)->uri) ) return COAP_RESOURCE(node); } } return NULL; } coap_resource_t * coap_get_resource(coap_context_t *ctx, coap_uri_t *uri) { return uri ? coap_get_resource_from_key(ctx, coap_uri_hash(uri)) : NULL; } #ifndef IDENT_APPNAME void coap_check_subscriptions(coap_context_t *context) { time_t now; coap_list_t *node; #ifndef NDEBUG char addr[INET6_ADDRSTRLEN]; #endif if ( !context ) return; time(&now); node = context->subscriptions; while ( node && COAP_SUBSCRIPTION(node)->expires < now ) { #ifndef NDEBUG if ( inet_ntop(AF_INET6, &(COAP_SUBSCRIPTION(node)->subscriber.sin6_addr), addr, INET6_ADDRSTRLEN) ) { debug("** removed expired subscription from [%s]:%d\n", addr, ntohs(COAP_SUBSCRIPTION(node)->subscriber.sin6_port)); } #endif #if 0 notify(context, coap_get_resource_from_key(context, COAP_SUBSCRIPTION(node)->resource), COAP_SUBSCRIPTION(node), 0, COAP_RESPONSE_400); #endif context->subscriptions = node->next; coap_delete(node); node = context->subscriptions; } } #endif void coap_free_resource(void *res) { if ( res ) { coap_free(((coap_resource_t *)res)->uri); coap_delete_string(((coap_resource_t *)res)->name); } } coap_key_t _hash(coap_key_t init, const char *s) { int c; if ( s ) while ( (c = *s++) ) { init = ((init << 7) + init) + c; } return init & HMASK; } coap_key_t _hash2(coap_key_t init, const unsigned char *s, unsigned int len) { if ( len && !s ) return COAP_INVALID_HASHKEY; while ( len-- ) { init = ((init << 7) + init) + *s++; } return init & HMASK; } coap_key_t coap_uri_hash(const coap_uri_t *uri) { return uri ? _hash2(0, uri->path.s, uri->path.length) : COAP_INVALID_HASHKEY; } coap_key_t coap_add_resource(coap_context_t *context, coap_resource_t *resource) { coap_list_t *node; if ( !context || !resource ) return COAP_INVALID_HASHKEY; node = coap_new_listnode(resource, coap_free_resource); if ( !node ) return COAP_INVALID_HASHKEY; if ( !context->resources ) { context->resources = node; } else { node->next = context->resources; context->resources = node; } return coap_uri_hash( resource->uri ); } /** * Deletes the resource that is identified by key. Returns 1 if the resource was * removed, 0 on error (e.g. if no such resource exists). */ int coap_delete_resource(coap_context_t *context, coap_key_t key) { coap_list_t *prev, *node; if (!context || key == COAP_INVALID_HASHKEY) return 0; for (prev = NULL, node = context->resources; node; prev = node, node = node->next) { if (coap_uri_hash(COAP_RESOURCE(node)->uri) == key) { #ifndef NDEBUG debug("removed key %lu (%s)\n",key,COAP_RESOURCE(node)->uri->path.s); #endif if (!prev) context->resources = node->next; else prev->next = node->next; coap_delete(node); return 1; } } return 0; } #ifndef IDENT_APPNAME coap_subscription_t * coap_new_subscription(coap_context_t *context, const coap_uri_t *resource, const struct sockaddr_in6 *subscriber, time_t expiry) { coap_subscription_t *result; if ( !context || !resource || !subscriber || !(result = coap_malloc(sizeof(coap_subscription_t)))) return NULL; result->resource = coap_uri_hash(resource); result->expires = expiry; memcpy( &result->subscriber, subscriber, sizeof(struct sockaddr_in6) ); memset(&result->token, 0, sizeof(str)); return result; } coap_list_t * coap_list_push_first(coap_list_t **list, void *data, void (*delete)(void *) ) { coap_list_t *node; node = coap_new_listnode(data, delete); if ( !node || !list ) return NULL; if ( !*list ) { *list = node; } else { node->next = *list; *list = node; } return node; } int _order_subscription(void *a, void *b) { if ( !a || !b ) return a < b ? -1 : 1; return ((coap_subscription_t *)a)->expires < ((coap_subscription_t *)b)->expires ? -1 : 1; } coap_key_t coap_subscription_hash(coap_subscription_t *subscription) { if ( !subscription ) return COAP_INVALID_HASHKEY; return _hash2( subscription->resource, (unsigned char *)&subscription->subscriber, sizeof(subscription->subscriber) ); } coap_key_t coap_add_subscription(coap_context_t *context, coap_subscription_t *subscription) { coap_list_t *node; if ( !context || !subscription ) return COAP_INVALID_HASHKEY; if ( !(node = coap_new_listnode(subscription, NULL)) ) return COAP_INVALID_HASHKEY; if ( !coap_insert(&context->subscriptions, node, _order_subscription ) ) { coap_free( node ); /* do not call coap_delete(), so subscription object will survive */ return COAP_INVALID_HASHKEY; } return coap_subscription_hash(subscription); } coap_subscription_t * coap_find_subscription(coap_context_t *context, coap_key_t hashkey, struct sockaddr_in6 *subscriber, str *token) { coap_list_t *node; if (!context || !subscriber || hashkey == COAP_INVALID_HASHKEY) return NULL; for (node = context->subscriptions; node; node = node->next) { if (COAP_SUBSCRIPTION(node)->resource == hashkey) { if (token) { /* do not proceed if tokens do not match */ if (token->length != COAP_SUBSCRIPTION(node)->token.length || memcmp(token->s, COAP_SUBSCRIPTION(node)->token.s, token->length) != 0) continue; } if (subscriber->sin6_port == COAP_SUBSCRIPTION(node)->subscriber.sin6_port && memcmp(&subscriber->sin6_addr, &COAP_SUBSCRIPTION(node)->subscriber.sin6_addr, sizeof(struct in6_addr)) == 0) return COAP_SUBSCRIPTION(node); } } return NULL; } int coap_delete_subscription(coap_context_t *context, coap_key_t key, struct sockaddr_in6 *subscriber) { coap_list_t *prev, *node; if (!context || !subscriber || key == COAP_INVALID_HASHKEY) return 0; for (prev = NULL, node = context->subscriptions; node; prev = node, node = node->next) { if (COAP_SUBSCRIPTION(node)->resource == key) { if (subscriber->sin6_port == COAP_SUBSCRIPTION(node)->subscriber.sin6_port && memcmp(&subscriber->sin6_addr, &COAP_SUBSCRIPTION(node)->subscriber.sin6_addr, sizeof(struct in6_addr)) == 0) { if (!prev) { context->subscriptions = node->next; coap_free(COAP_SUBSCRIPTION(node)->token.s); coap_delete(node); } else { prev->next = node->next; coap_free(COAP_SUBSCRIPTION(node)->token.s); coap_delete(node); } return 1; } } } return 0; } #endif tinyos-2.1.2+dfsg/support/sdk/c/coap/subscribe.h000066400000000000000000000154031207233610700215570ustar00rootroot00000000000000/* subscribe.h -- subscription handling for CoAP * see draft-hartke-coap-observe-01 * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #ifndef _COAP_SUBSCRIBE_H_ #define _COAP_SUBSCRIBE_H_ #include "uri.h" #include "list.h" #include "pdu.h" #include "net.h" typedef unsigned long coap_key_t; /** Used to indicate that a hashkey is invalid. */ #define COAP_INVALID_HASHKEY ((coap_key_t)-1) typedef struct { coap_uri_t *uri; /* unique identifier; memory is released by coap_delete_resource() */ str *name; /* display name of the resource */ unsigned char mediatype; /* media type for resource representation */ unsigned int dirty:1; /* set to 1 if resource has changed */ unsigned int writable:1; /* set to 1 if resource can be changed using PUT */ unsigned int splitphase:1; /* set to 1 if resource is split-phase async */ unsigned int immediately; /* set to 1 if data is send immediately */ /* cache-control */ unsigned char etag[4]; /* version identifier for this resource * (zero terminated, first byte is zero if not set). */ unsigned int maxage; /* maximum cache time (zero means no Max-age option) */ /** * Callback function that copies the resource representation into the provided data * buffer (PDU payload). finished is set to 1 to indicate that this was the last block * of buflen data for this resource representation, 0 means that data is not finished * and a subsequent call with offset updated by buflen would yield more data (i.e. * the M-bit of CoAP's block option must be set if offset and buflen are selected * accordingly. * When called, buflen must be set to the maximum length of buf that is to be filled * with the mediatype representation of the resource identified by uri. * The mediatype must be set to the requested mediatype of COAP_MEDIATYPE_ANY if * none was given. On return, the mediatype will be set to the type that is * actually used. * The return value indicates the result code that should be used in a response to * this function. */ int (*data)(coap_uri_t *uri, unsigned short *tid, unsigned char *mediatype, unsigned int offset, unsigned char *buf, unsigned int *buflen, int *finished, unsigned int method); } coap_resource_t; typedef struct { coap_key_t resource; /* hash key for subscribed resource */ #ifndef IDENT_APPNAME time_t expires; /* expiry time of subscription */ #endif struct sockaddr_in6 subscriber; /* subscriber's address */ str token; /* subscription token */ } coap_subscription_t; #define COAP_RESOURCE(node) ((coap_resource_t *)(node)->data) #define COAP_SUBSCRIPTION(node) ((coap_subscription_t *)(node)->data) /** Checks subscribed resources for updates and notifies subscribers of changes. */ void coap_check_resource_list(coap_context_t *context); /** Removes expired subscriptions. */ void coap_check_subscriptions(coap_context_t *context); /** * Adds specified resource to the resource observation list. Returns a * unique key for the resource. The alloceted memory is released when * the resource is destroyed with coap_delete_resource(). */ coap_key_t coap_add_resource(coap_context_t *context, coap_resource_t *); /** * Deletes the resource that is identified by key. Returns 1 if the resource was * removed, 0 on error (e.g. if no such resource exists). */ int coap_delete_resource(coap_context_t *context, coap_key_t key); /** * Creates a new subscription object filled with the given data. The storage * allocated for this object must be released using coap_free(). */ #ifndef IDENT_APPNAME coap_subscription_t *coap_new_subscription(coap_context_t *context, const coap_uri_t *resource, const struct sockaddr_in6 *subscriber, time_t expiry); #endif /** * Adds the given subsription object to the observer list. * @param context The CoAP context * @param subscription A new subscription oobject created with coap_new_subscription() * @return A unique hash key for this resource or COAP_INVALID_HASHKEY on error. * The storage allocated for the subscription object is released when it is * removed from the subscription list, unless the function has returned * COAP_INVALID_HASHKEY. In this case, the storage must be released by the * caller of this function. */ coap_key_t coap_add_subscription(coap_context_t *context, coap_subscription_t *subscription); /** * Returns the subscription from subscriber for the resource identified * by hashkey. When token is not NULL the subscription must have the * same token. * @param context The CoAP context * @param hashkey The unique key that identifies the subscription * @param subscriber The subscriber's transport address * @param token If not NULL, this specifies a token given by the * subscriber to identify its subscription. * @return The requested subscription object or NULL when not found. */ coap_subscription_t * coap_find_subscription(coap_context_t *context, coap_key_t hashkey, struct sockaddr_in6 *subscriber, str *token); /** * Removes a subscription from the subscription list stored in context and * releases the storage that was allocated for this subscription. * @param context The CoAP context. * @param haskey The unique key that identifies the subscription to remove. * @return 1 if a subscription was removed, 0 otherwise. */ int coap_delete_subscription(coap_context_t *context, coap_key_t hashkey, struct sockaddr_in6 *subscriber); /** Returns a unique hash for the specified URI or COAP_INVALID_HASHKEY on error. */ coap_key_t coap_uri_hash(const coap_uri_t *uri); /** Returns a unique hash for the specified subscription or COAP_INVALID_HASHKEY on error. */ coap_key_t coap_subscription_hash(coap_subscription_t *subscription); /** Returns the resource identified by key or NULL if not found. */ coap_resource_t *coap_get_resource_from_key(coap_context_t *ctx, coap_key_t key); /** Returns the resource identified by uri or NULL if not found. */ coap_resource_t *coap_get_resource(coap_context_t *ctx, coap_uri_t *uri); #endif /* _COAP_SUBSCRIBE_H_ */ tinyos-2.1.2+dfsg/support/sdk/c/coap/uri.c000066400000000000000000000103261207233610700203670ustar00rootroot00000000000000/* uri.c -- helper functions for URI treatment * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #include #include #include #include "mem.h" #include "debug.h" #include "pdu.h" #include "uri.h" #ifndef MIN # define MIN(x,y) (x) < (y) ? (x) : (y) #endif int coap_split_uri(unsigned char *str_var, coap_uri_t *uri) { unsigned char *p; if ( !str_var || !uri ) return -1; memset( uri, 0, sizeof(coap_uri_t) ); /* find scheme */ p = str_var; while ( isalnum(*p) ) ++p; if ( *p != ':' ) { /* no scheme, reset p */ p = str_var; } else { /* scheme found, check if it is "coap" */ if (memcmp(str_var, COAP_DEFAULT_SCHEME, MIN(p - str_var, sizeof(COAP_DEFAULT_SCHEME) - 1)) != 0) { #ifndef NDEBUG debug("unknown URI scheme '%s'\n", str_var); #endif return -1; } *p++ = '\0'; /* look for network authority */ if ( strncmp( (char *)p, "//", 2 ) == 0 ) { /* have network authority */ p += 2; uri->na.s = p; /* skip NA and port so that p and str_var finally point to path */ while ( *p && *p != '/' && *p != '?') ++p; uri->na.length = p - uri->na.s; str_var = p; #if 0 /* split server address and port */ if ( *uri->na == '[' ) { /* IPv6 address reference */ p = ++uri->na; while ( *p && *p != ']' ) ++p; *p++ = '\0'; } else { /* IPv4 address or hostname */ p = uri->na; while ( *p && *p != ':' ) ++p; } if ( *p == ':' ) { /* handle port */ *p++ = '\0'; uri->port = p; } #endif } else str_var = p; /* str_var now points to the path or query if path is empty*/ } /* split path and query */ if ( *str_var == '\0' ) return 0; if (*str_var != '?') { if (*str_var == '/') /* skip leading '/' */ *str_var++ = '\0'; uri->path.s = str_var; } while (*str_var && *str_var != '?') str_var++; if (*str_var == '?') { *str_var++ = '\0'; if (*str_var) { uri->query.s = str_var; uri->query.length = strlen((char *)uri->query.s); } } if (uri->path.s) uri->path.length = strlen((char *)uri->path.s); return 0; } #define URI_DATA(uriobj) ((unsigned char *)(uriobj) + sizeof(coap_uri_t)) coap_uri_t * coap_new_uri(const unsigned char *uri, unsigned int length) { unsigned char *result = coap_malloc(length + 1 + sizeof(coap_uri_t)); if ( !result ) return NULL; memcpy(URI_DATA(result), uri, length); URI_DATA(result)[length] = '\0'; /* make it zero-terminated */ coap_split_uri( URI_DATA(result), (coap_uri_t *)result ); return (coap_uri_t *)result; } coap_uri_t * coap_clone_uri(const coap_uri_t *uri) { coap_uri_t *result; if ( !uri ) return NULL; result = (coap_uri_t *)coap_malloc( uri->query.length + uri->na.length + uri->path.length + sizeof(coap_uri_t) + 1); if ( !result ) return NULL; memset( result, 0, sizeof(coap_uri_t) ); if ( uri->na.length ) { result->na.s = URI_DATA(result); result->na.length = uri->na.length; memcpy(result->na.s, uri->na.s, uri->na.length); } if ( uri->path.length ) { result->path.s = URI_DATA(result) + uri->na.length; result->path.length = uri->path.length; memcpy(result->path.s, uri->path.s, uri->path.length); } if ( uri->query.length ) { result->query.s = URI_DATA(result) + uri->na.length + uri->path.length; result->query.length = uri->query.length; memcpy(result->query.s, uri->query.s, uri->query.length); } return result; } tinyos-2.1.2+dfsg/support/sdk/c/coap/uri.h000066400000000000000000000036771207233610700204070ustar00rootroot00000000000000/* uri.h -- helper functions for URI treatment * * Copyright (C) 2010 Olaf Bergmann * * 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. */ #ifndef _COAP_URI_H_ #define _COAP_URI_H_ #include "str.h" typedef struct { str na; /* network authority */ str path; /* path */ str query; /* query part */ } coap_uri_t; /** * Splits given URI into pieces and fills the specified uri object accordingly. * URI parts that are not available will be set to NULL in uri. The function * returns -1 on error, 0 on success. Note that the passed str will be altered. */ int coap_split_uri(unsigned char *str_var, coap_uri_t *uri); /** * Creates a new coap_uri_t object from the specified URI. Returns the new * object or NULL on error. The memory allocated by the new coap_uri_t * must be released using coap_free(). * @param uri The URI path to copy. * @para length The length of uri. * @return New URI object or NULL on error. */ coap_uri_t *coap_new_uri(const unsigned char *uri, unsigned int length); /** * Clones the specified coap_uri_t object. Thie function allocates sufficient * memory to hold the coap_uri_t structure and its contents. The object must * be released with coap_free(). */ coap_uri_t *coap_clone_uri(const coap_uri_t *uri); #endif /* _COAP_URI_H_ */ tinyos-2.1.2+dfsg/support/sdk/c/sf/000077500000000000000000000000001207233610700171105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/c/sf/Makefile.am000066400000000000000000000016621207233610700211510ustar00rootroot00000000000000AUTOMAKE_OPTIONS = foreign MIGFLAGS = -D_POSIX_C_SOURCE TOS=$(shell ncc -print-tosdir) SERIAL_H = $(TOS)/lib/serial/Serial.h BUILT_SOURCES = serialpacket.h serialprotocol.h bin_PROGRAMS=sf noinst_PROGRAMS=prettylisten sflisten sfsend seriallisten serialsend noinst_LIBRARIES=libmote.a sf_SOURCES = sf.c sf_LDADD = libmote.a prettylisten_SOURCES = prettylisten.c prettylisten_LDADD = libmote.a sflisten_SOURCES = sflisten.c sflisten_LDADD = libmote.a sfsend_SOURCES = sfsend.c sfsend_LDADD = libmote.a seriallisten_SOURCES = seriallisten.c seriallisten_LDADD = libmote.a serialsend_SOURCES = serialsend.c serialsend_LDADD = libmote.a libmote_a_SOURCES = \ message.c \ serialpacket.c \ serialsource.c \ sfsource.c serialpacket.c serialpacket.h: $(SERIAL_H) mig -o serialpacket.h -c-prefix=spacket c $(SERIAL_H) serial_packet $(MIGFLAGS) serialprotocol.h: $(SERIAL_H) ncg -o $@ -c-prefix=SERIAL c $(SERIAL_H) Serial.h $(MIGFLAGS) tinyos-2.1.2+dfsg/support/sdk/c/sf/README000066400000000000000000000041331207233610700177710ustar00rootroot00000000000000Mini C-SDK for TinyOS ===================== This directory contains a mini-SDK for C, for communicating with motes running TinyOS 2.0. To build this SDK, run ./bootstrap ./configure --prefix= make in the current directory and, if you wish, "make install" to install the C-based serial forwarder in /bin. This directory contains one utility: - sf: a C-based serial forwarder: sf Starts a serial forwarder listening for TCP connections on port , and sending and receiving packets on serial port at the specified . This serial forwarder implements the standard TinyOS 2.0 serial forwarder protocol (see comments in support/sdk/java/net/tinyos/packet/SFProtocol.java for a brief overview). a library (libmote.a) supporting mote communication: - serialsource.h: send and receive packets over a serial port (supports non-blocking I/O) - sfsource.h: send and receive packets using the serial forwarder protocol - message.h: support functions for mig, to encode and decode bitfields of arbitrary size and endianness - serialpacket.h: mig-generated code to encode and decode the header of TinyOS serial active-message packets (the packets sent and received by the BaseStation application) - serialprotocol.h: ncg-generated code containing the constants describing TinyOS serial packets (from tos/lib/serial/Serial.h) and four example programs that use that library: - seriallisten: print packets received from a serial port - sflisten: print packets received from a serial forwarder - prettylisten: print packets received from a serial forwarder, using mig-generated code to decode the standard serial-active-message header - sfsend: send a packet (specified on the command line) to a serial forwarder Note that sflisten prints, and sfsend sends, raw packets. In particular, the first byte indicates the packet type (e.g., 00 for the AM-over-serial packets). For more information on serial communication to and from motes, see TEP113. For more information on using ncg and mig with C, see the nescc-mig and nescc-ncg man pages. tinyos-2.1.2+dfsg/support/sdk/c/sf/bootstrap000077500000000000000000000000751207233610700210550ustar00rootroot00000000000000mkdir config-aux aclocal autoheader autoconf automake -a -c tinyos-2.1.2+dfsg/support/sdk/c/sf/build.xml000066400000000000000000000013541207233610700207340ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/support/sdk/c/sf/configure.ac000066400000000000000000000002601207233610700213740ustar00rootroot00000000000000AC_INIT(cmotesdk, 1.0) AC_CONFIG_SRCDIR(sfsource.c) AM_CONFIG_HEADER(autoconf.h) AC_CONFIG_AUX_DIR(config-aux) AM_INIT_AUTOMAKE AC_PROG_CC AC_PROG_RANLIB AC_OUTPUT(Makefile) tinyos-2.1.2+dfsg/support/sdk/c/sf/message.c000066400000000000000000000152051207233610700207030ustar00rootroot00000000000000/* Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* Authors: David Gay * Intel Research Berkeley Lab */ #include #include "message.h" struct tmsg { uint8_t *data; size_t len; }; tmsg_t *new_tmsg(void *packet, size_t len) { tmsg_t *x = malloc(sizeof(tmsg_t)); if (x) { x->data = packet; x->len = len; } return x; } void free_tmsg(tmsg_t *msg) { if (msg) free(msg); } void reset_tmsg(tmsg_t *msg, void *packet, size_t len) { if (!msg) return; msg->data = packet; msg->len = len; } void *tmsg_data(tmsg_t *msg) { return msg->data; } size_t tmsg_length(tmsg_t *msg) { return msg->len; } static void (*failfn)(void); void tmsg_fail(void) { if (failfn) failfn(); } void (*tmsg_set_fail(void (*fn)(void)))(void) { void (*oldfn)(void) = failfn; failfn = fn; return oldfn; } /* Check if a specified bit field is in range for a buffer, and invoke tmsg_fail if not. Return TRUE if in range, FALSE otherwise */ static int boundsp(tmsg_t *msg, size_t offset, size_t length) { if (offset + length <= msg->len * 8) return 1; tmsg_fail(); return 0; } /* Convert 2's complement 'length' bit integer 'x' from unsigned to signed */ static int64_t u2s(uint64_t x, size_t length) { if (x & 1ULL << (length - 1)) return (int64_t)x - (1LL << length); else return x; } uint64_t tmsg_read_ule(tmsg_t *msg, size_t offset, size_t length) { uint64_t x = 0; if (boundsp(msg, offset, length)) { size_t byte_offset = offset >> 3; size_t bit_offset = offset & 7; size_t shift = 0; /* all in one byte case */ if (length + bit_offset <= 8) return (msg->data[byte_offset] >> bit_offset) & ((1 << length) - 1); /* get some high order bits */ if (offset > 0) { x = msg->data[byte_offset] >> bit_offset; byte_offset++; shift += 8 - bit_offset; length -= 8 - bit_offset; } while (length >= 8) { x |= (uint64_t)msg->data[byte_offset++] << shift; shift += 8; length -= 8; } /* data from last byte */ if (length > 0) x |= (uint64_t)(msg->data[byte_offset] & ((1 << length) - 1)) << shift; } return x; } int64_t tmsg_read_le(tmsg_t *msg, size_t offset, size_t length) { return u2s(tmsg_read_ule(msg, offset, length), length); } void tmsg_write_ule(tmsg_t *msg, size_t offset, size_t length, uint64_t x) { if (boundsp(msg, offset, length)) { size_t byte_offset = offset >> 3; size_t bit_offset = offset & 7; size_t shift = 0; /* all in one byte case */ if (length + bit_offset <= 8) { msg->data[byte_offset] = ((msg->data[byte_offset] & ~(((1 << length) - 1) << bit_offset)) | x << bit_offset); return; } /* set some high order bits */ if (bit_offset > 0) { msg->data[byte_offset] = ((msg->data[byte_offset] & ((1 << bit_offset) - 1)) | x << bit_offset); byte_offset++; shift += 8 - bit_offset; length -= 8 - bit_offset; } while (length >= 8) { msg->data[byte_offset++] = x >> shift; shift += 8; length -= 8; } /* data for last byte */ if (length > 0) msg->data[byte_offset] = (msg->data[byte_offset] & ~((1 << length) - 1)) | x >> shift; } } void tmsg_write_le(tmsg_t *msg, size_t offset, size_t length, int64_t value) { tmsg_write_ule(msg, offset, length, value); } uint64_t tmsg_read_ube(tmsg_t *msg, size_t offset, size_t length) { uint64_t x = 0; if (boundsp(msg, offset, length)) { size_t byte_offset = offset >> 3; size_t bit_offset = offset & 7; /* All in one byte case */ if (length + bit_offset <= 8) return (msg->data[byte_offset] >> (8 - bit_offset - length)) & ((1 << length) - 1); /* get some high order bits */ if (bit_offset > 0) { length -= 8 - bit_offset; x = (uint64_t)(msg->data[byte_offset] & ((1 << (8 - bit_offset)) - 1)) << length; byte_offset++; } while (length >= 8) { length -= 8; x |= (uint64_t)msg->data[byte_offset++] << length; } /* data from last byte */ if (length > 0) x |= msg->data[byte_offset] >> (8 - length); return x; } return x; } int64_t tmsg_read_be(tmsg_t *msg, size_t offset, size_t length) { return u2s(tmsg_read_ube(msg, offset, length), length); } void tmsg_write_ube(tmsg_t *msg, size_t offset, size_t length, uint64_t x) { if (boundsp(msg, offset, length)) { size_t byte_offset = offset >> 3; size_t bit_offset = offset & 7; /* all in one byte case */ if (length + bit_offset <= 8) { size_t mask = ((1 << length) - 1) << (8 - bit_offset - length); msg->data[byte_offset] = ((msg->data[byte_offset] & ~mask) | x << (8 - bit_offset - length)); return; } /* set some high order bits */ if (bit_offset > 0) { size_t mask = (1 << (8 - bit_offset)) - 1; length -= 8 - bit_offset; msg->data[byte_offset] = ((msg->data[byte_offset] & ~mask) | x >> length); byte_offset++; } while (length >= 8) { length -= 8; msg->data[byte_offset++] = x >> length; } /* data for last byte */ if (length > 0) { size_t mask = (1 << (8 - length)) - 1; msg->data[byte_offset] = ((msg->data[byte_offset] & mask) | x << (8 - length)); } } } void tmsg_write_be(tmsg_t *msg, size_t offset, size_t length, int64_t value) { tmsg_write_ube(msg, offset, length, value); } /* u2f and f2u convert raw 32-bit values to/from float. This code assumes that the floating point rep in the uint32_t values: bit 31: sign, bits 30-23: exponent, bits 22-0: mantissa matches that of a floating point value when such a value is stored in memory. */ /* Note that C99 wants us to use the union approach rather than the cast-a-pointer approach... */ union f_and_u { uint32_t u; float f; }; static float u2f(uint32_t x) { union f_and_u y = { .u = x}; return y.f; } static uint32_t f2u(float x) { union f_and_u y = { .f = x}; return y.u; } float tmsg_read_float_le(tmsg_t *msg, size_t offset) { return u2f(tmsg_read_ule(msg, offset, 32)); } void tmsg_write_float_le(tmsg_t *msg, size_t offset, float x) { tmsg_write_ule(msg, offset, 32, f2u(x)); } float tmsg_read_float_be(tmsg_t *msg, size_t offset) { return u2f(tmsg_read_ube(msg, offset, 32)); } void tmsg_write_float_be(tmsg_t *msg, size_t offset, float x) { tmsg_write_ube(msg, offset, 32, f2u(x)); } tinyos-2.1.2+dfsg/support/sdk/c/sf/message.h000066400000000000000000000116371207233610700207150ustar00rootroot00000000000000/* Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* Authors: David Gay * Intel Research Berkeley Lab */ #ifndef MESSAGE_H #define MESSAGE_H #include #include #ifdef __cplusplus extern "C" { #endif /** The type of message buffers */ typedef struct tmsg tmsg_t; /** Invoke the function set by tmsg_set_fail. * tmsg_fail is called by the tmsg_read and tmsg_write functions when an * out-of-buffer access is attempted. */ void tmsg_fail(void); /** Set the function that tmsg_fail should call, and return the previous * function. If the function is NULL, tmsg_fail does nothing. */ void (*tmsg_set_fail(void (*fn)(void)))(void); /** * Create a message buffer from array 'packet' of 'len' bytes */ tmsg_t *new_tmsg(void *packet, size_t len); /** * Free a message buffer. This does NOT free the underlying array. */ void free_tmsg(tmsg_t *msg); /** * Reuse an existing tmsg */ void reset_tmsg(tmsg_t *msg, void *packet, size_t len) ; /** * Return underlying array of a message buffer */ void *tmsg_data(tmsg_t *msg); /** * Return length of a message buffer */ size_t tmsg_length(tmsg_t *msg); /** * Read an unsigned little-endian integer of 'bit_length' bits from bit offset * 'bit_offset' * If the specified field is out of range for the buffer, tmsg_fail is called * and 0 is returned. */ uint64_t tmsg_read_ule(tmsg_t *msg, size_t bit_offset, size_t bit_length); /** * Read a signed little-endian integer of 'bit_length' bits from bit offset * 'bit_offset' * If the specified field is out of range for the buffer, tmsg_fail is called * and 0 is returned. */ int64_t tmsg_read_le(tmsg_t *msg, size_t bit_offset, size_t bit_length); /** * Write an unsigned little-endian integer of 'bit_length' bits to bit offset * 'bit_offset'. * If the specified field is out of range for the buffer, tmsg_fail is called * and no write occurs. */ void tmsg_write_ule(tmsg_t *msg, size_t bit_offset, size_t bit_length, uint64_t value); /** * Write a signed little-endian integer of 'bit_length' bits to bit offset * 'bit_offset'. * If the specified field is out of range for the buffer, tmsg_fail is called * and no write occurs. */ void tmsg_write_le(tmsg_t *msg, size_t bit_offset, size_t bit_length, int64_t value); /** * Read an unsigned big-endian integer of 'bit_length' bits from bit offset * 'bit_offset' * If the specified field is out of range for the buffer, tmsg_fail is called * and 0 is returned. */ uint64_t tmsg_read_ube(tmsg_t *msg, size_t bit_offset, size_t bit_length); /** * Read a signed big-endian integer of 'bit_length' bits from bit offset * 'bit_offset' * If the specified field is out of range for the buffer, tmsg_fail is called * and 0 is returned. */ int64_t tmsg_read_be(tmsg_t *msg, size_t bit_offset, size_t bit_length); /** * Write an unsigned big-endian integer of 'bit_length' bits to bit offset * 'bit_offset'. * If the specified field is out of range for the buffer, tmsg_fail is called * and no write occurs. */ void tmsg_write_ube(tmsg_t *msg, size_t bit_offset, size_t bit_length, uint64_t value); /** * Write a signed big-endian integer of 'bit_length' bits to bit offset * 'bit_offset'. * If the specified field is out of range for the buffer, tmsg_fail is called * and no write occurs. */ void tmsg_write_be(tmsg_t *msg, size_t bit_offset, size_t bit_length, int64_t value); /** * Read a 32-bit IEEE float stored in little-endian format (bit 31: sign, * bits 30-23: exponent, bits 22-0: mantissa) from bit offset 'bit_offset' * If the specified field is out of range for the buffer, tmsg_fail is called * and 0 is returned. */ float tmsg_read_float_le(tmsg_t *msg, size_t offset); /** * Write a 32-bit IEEE float in little-endian format (bit 31: sign, * bits 30-23: exponent, bits 22-0: mantissa) to bit offset 'bit_offset' * If the specified field is out of range for the buffer, tmsg_fail is called * and no write occurs. */ void tmsg_write_float_le(tmsg_t *msg, size_t offset, float x); /** * Read a 32-bit IEEE float stored in big-endian format (bit 31: sign, * bits 30-23: exponent, bits 22-0: mantissa) from bit offset 'bit_offset' * If the specified field is out of range for the buffer, tmsg_fail is called * and 0 is returned. */ float tmsg_read_float_be(tmsg_t *msg, size_t offset); /** * Write a 32-bit IEEE float in big-endian format (bit 31: sign, * bits 30-23: exponent, bits 22-0: mantissa) to bit offset 'bit_offset' * If the specified field is out of range for the buffer, tmsg_fail is called * and no write occurs. */ void tmsg_write_float_be(tmsg_t *msg, size_t offset, float x); #ifdef __cplusplus } #endif #endif tinyos-2.1.2+dfsg/support/sdk/c/sf/prettylisten.c000066400000000000000000000025721207233610700220300ustar00rootroot00000000000000#include #include #include "sfsource.h" #include "serialpacket.h" #include "serialprotocol.h" void hexprint(uint8_t *packet, int len) { int i; for (i = 0; i < len; i++) printf("%02x ", packet[i]); } int main(int argc, char **argv) { int fd; if (argc != 3) { fprintf(stderr, "Usage: %s - dump packets from a serial forwarder\n", argv[0]); exit(2); } fd = open_sf_source(argv[1], atoi(argv[2])); if (fd < 0) { fprintf(stderr, "Couldn't open serial forwarder at %s:%s\n", argv[1], argv[2]); exit(1); } for (;;) { int len, i; uint8_t *packet = read_sf_packet(fd, &len); if (!packet) exit(0); if (len >= 1 + SPACKET_SIZE && packet[0] == SERIAL_TOS_SERIAL_ACTIVE_MESSAGE_ID) { tmsg_t *msg = new_tmsg(packet + 1, len - 1); if (!msg) exit(0); printf("dest %u, src %u, length %u, group %u, type %u\n ", spacket_header_dest_get(msg), spacket_header_src_get(msg), spacket_header_length_get(msg), spacket_header_group_get(msg), spacket_header_type_get(msg)); hexprint((uint8_t *)tmsg_data(msg) + spacket_data_offset(0), tmsg_length(msg) - spacket_data_offset(0)); free(msg); } else { printf("non-AM packet: "); hexprint(packet, len); } putchar('\n'); fflush(stdout); free((void *)packet); } } tinyos-2.1.2+dfsg/support/sdk/c/sf/seriallisten.c000066400000000000000000000017541207233610700217610ustar00rootroot00000000000000#include #include #include "serialsource.h" static char *msgs[] = { "unknown_packet_type", "ack_timeout" , "sync" , "too_long" , "too_short" , "bad_sync" , "bad_crc" , "closed" , "no_memory" , "unix_error" }; void stderr_msg(serial_source_msg problem) { fprintf(stderr, "Note: %s\n", msgs[problem]); } int main(int argc, char **argv) { serial_source src; if (argc != 3) { fprintf(stderr, "Usage: %s - dump packets from a serial port\n", argv[0]); exit(2); } src = open_serial_source(argv[1], platform_baud_rate(argv[2]), 0, stderr_msg); if (!src) { fprintf(stderr, "Couldn't open serial port at %s:%s\n", argv[1], argv[2]); exit(1); } for (;;) { int len, i; const unsigned char *packet = read_serial_packet(src, &len); if (!packet) exit(0); for (i = 0; i < len; i++) printf("%02x ", packet[i]); putchar('\n'); free((void *)packet); } } tinyos-2.1.2+dfsg/support/sdk/c/sf/serialsend.c000066400000000000000000000023711207233610700214100ustar00rootroot00000000000000#include #include #include "serialsource.h" static char *msgs[] = { "unknown_packet_type", "ack_timeout" , "sync" , "too_long" , "too_short" , "bad_sync" , "bad_crc" , "closed" , "no_memory" , "unix_error" }; void stderr_msg(serial_source_msg problem) { fprintf(stderr, "Note: %s\n", msgs[problem]); } void send_packet(serial_source src, char **bytes, int count) { int i; unsigned char *packet; packet = malloc(count); if (!packet) exit(2); for (i = 0; i < count; i++) packet[i] = strtol(bytes[i], NULL, 0); fprintf(stderr,"Sending "); for (i = 0; i < count; i++) fprintf(stderr, " %02x", packet[i]); fprintf(stderr, "\n"); if (write_serial_packet(src, packet, count) == 0) printf("ack\n"); else printf("noack\n"); } int main(int argc, char **argv) { serial_source src; if (argc < 3) { fprintf(stderr, "Usage: %s - send a raw packet to a serial port\n", argv[0]); exit(2); } src = open_serial_source(argv[1], platform_baud_rate(argv[2]), 0, stderr_msg); if (!src) { fprintf(stderr, "Couldn't open serial port at %s:%s\n", argv[1], argv[2]); exit(1); } send_packet(src, argv + 3, argc - 3); } tinyos-2.1.2+dfsg/support/sdk/c/sf/serialsource.c000066400000000000000000000507511207233610700217640ustar00rootroot00000000000000#if defined(_WIN32) && !defined(__CYGWIN__) /* Avoid confusing windows w/o cygwin w/ cygwin */ #define LOSE32 #endif #ifndef LOSE32 #include #include #include #include #include #include #include #include #include #include #include #ifdef __CYGWIN__ #include #include #else #include #endif #endif #ifdef LOSE32 #include #include #endif /* C implementation of the mote serial protocol. See net.tinyos.packet.Packetizer for more details */ #undef DEBUG #include "serialsource.h" #include "serialprotocol.h" typedef int bool; enum { #ifndef __CYGWIN__ #ifndef LOSE32 FALSE = 0, TRUE = 1, #endif #endif BUFSIZE = 256, MTU = 256, ACK_TIMEOUT = 100000, /* in us */ SYNC_BYTE = SERIAL_HDLC_FLAG_BYTE, ESCAPE_BYTE = SERIAL_HDLC_CTLESC_BYTE, P_ACK = SERIAL_SERIAL_PROTO_ACK, P_PACKET_ACK = SERIAL_SERIAL_PROTO_PACKET_ACK, P_PACKET_NO_ACK = SERIAL_SERIAL_PROTO_PACKET_NOACK, P_UNKNOWN = SERIAL_SERIAL_PROTO_PACKET_UNKNOWN }; struct packet_list { uint8_t *packet; int len; struct packet_list *next; }; struct serial_source_t { #ifndef LOSE32 int fd; #else HANDLE hComm; #endif bool non_blocking; void (*message)(serial_source_msg problem); /* Receive state */ struct { uint8_t buffer[BUFSIZE]; int bufpos, bufused; uint8_t packet[MTU]; bool in_sync, escaped; int count; struct packet_list *queue[256]; // indexed by protocol } recv; struct { uint8_t seqno; uint8_t *escaped; int escapeptr; uint16_t crc; } send; }; #ifndef LOSE32 static tcflag_t parse_baudrate(int requested) { int baudrate; switch (requested) { #ifdef B50 case 50: baudrate = B50; break; #endif #ifdef B75 case 75: baudrate = B75; break; #endif #ifdef B110 case 110: baudrate = B110; break; #endif #ifdef B134 case 134: baudrate = B134; break; #endif #ifdef B150 case 150: baudrate = B150; break; #endif #ifdef B200 case 200: baudrate = B200; break; #endif #ifdef B300 case 300: baudrate = B300; break; #endif #ifdef B600 case 600: baudrate = B600; break; #endif #ifdef B1200 case 1200: baudrate = B1200; break; #endif #ifdef B1800 case 1800: baudrate = B1800; break; #endif #ifdef B2400 case 2400: baudrate = B2400; break; #endif #ifdef B4800 case 4800: baudrate = B4800; break; #endif #ifdef B9600 case 9600: baudrate = B9600; break; #endif #ifdef B19200 case 19200: baudrate = B19200; break; #endif #ifdef B38400 case 38400: baudrate = B38400; break; #endif #ifdef B57600 case 57600: baudrate = B57600; break; #endif #ifdef B115200 case 115200: baudrate = B115200; break; #endif #ifdef B230400 case 230400: baudrate = B230400; break; #endif #ifdef B460800 case 460800: baudrate = B460800; break; #endif #ifdef B500000 case 500000: baudrate = B500000; break; #endif #ifdef B576000 case 576000: baudrate = B576000; break; #endif #ifdef B921600 case 921600: baudrate = B921600; break; #endif #ifdef B1000000 case 1000000: baudrate = B1000000; break; #endif #ifdef B1152000 case 1152000: baudrate = B1152000; break; #endif #ifdef B1500000 case 1500000: baudrate = B1500000; break; #endif #ifdef B2000000 case 2000000: baudrate = B2000000; break; #endif #ifdef B2500000 case 2500000: baudrate = B2500000; break; #endif #ifdef B3000000 case 3000000: baudrate = B3000000; break; #endif #ifdef B3500000 case 3500000: baudrate = B3500000; break; #endif #ifdef B4000000 case 4000000: baudrate = B4000000; break; #endif default: baudrate = 0; } return baudrate; } #endif #ifdef DEBUG static void dump(const char *msg, unsigned char *packet, int len) { int i; printf("%s", msg); for (i = 0; i < len; i++) printf(" %02x", packet[i]); putchar('\n'); } #endif static void message(serial_source src, serial_source_msg msg) { if (src->message) src->message(msg); } static int serial_read(serial_source src, int non_blocking, void *buffer, int n) { #ifndef LOSE32 fd_set fds; int cnt; if (non_blocking) { cnt = read(src->fd, buffer, n); /* Work around buggy usb serial driver (returns 0 when no data is available). Mac OS X seems to like to do this too (at least with a Keyspan 49WG). */ if (cnt == 0) { cnt = -1; errno = EAGAIN; } return cnt; } else for (;;) { FD_ZERO(&fds); FD_SET(src->fd, &fds); cnt = select(src->fd + 1, &fds, NULL, NULL, NULL); if (cnt < 0) return -1; cnt = read(src->fd, buffer, n); if (cnt != 0) return cnt; } #else // LOSE32 int cnt; if (non_blocking) { ReadFile(src->hComm, buffer, n, &cnt, NULL); return cnt; } else { for (;;) { DWORD eventMask; SetCommMask(src->hComm, EV_RXCHAR); if (!WaitCommEvent(src->hComm, &eventMask, NULL)) { return -1; } ReadFile(src->hComm, buffer, n, &cnt, NULL); if (cnt != 0) { return cnt; } } } #endif } serial_source open_serial_source(const char *device, int baud_rate, int non_blocking, void (*message)(serial_source_msg problem)) /* Effects: opens serial port device at specified baud_rate. If non_blocking is true, read_serial_packet calls will be non-blocking (writes are always blocking, for now at least) Returns: descriptor for serial forwarder at host:port, or NULL for failure (bad device or bad baud rate) */ { #ifndef LOSE32 struct termios newtio; int fd; tcflag_t baudflag = parse_baudrate(baud_rate); if (!baudflag) return NULL; fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd < 0) return NULL; #ifdef __CYGWIN__ /* For some very mysterious reason, this incantation is necessary to make the serial port work under some windows machines */ HANDLE handle = (HANDLE)get_osfhandle(fd); DCB dcb; if (!(GetCommState(handle, &dcb) && SetCommState(handle, &dcb))) { close(fd); return NULL; } #endif /* Serial port setting */ memset(&newtio, 0, sizeof(newtio)); newtio.c_cflag = CS8 | CLOCAL | CREAD; newtio.c_iflag = IGNPAR | IGNBRK; cfsetispeed(&newtio, baudflag); cfsetospeed(&newtio, baudflag); /* Raw output_file */ newtio.c_oflag = 0; if (tcflush(fd, TCIFLUSH) >= 0 && tcsetattr(fd, TCSANOW, &newtio) >= 0) { serial_source src = malloc(sizeof *src); if (src) { memset(src, 0, sizeof *src); src->fd = fd; src->non_blocking = non_blocking; src->message = message; src->send.seqno = 37; return src; } } close(fd); return NULL; #else // LOSE32 LPCTSTR ComName = (LPCTSTR)device; HANDLE hComm; DCB dcb; serial_source src; int buflen = MultiByteToWideChar(CP_ACP,0,(PCSTR)device,-1,(LPWSTR)ComName,0); MultiByteToWideChar(CP_ACP,0,(PCSTR)device,-1,(LPWSTR)ComName,buflen); //syncronize hComm = CreateFile(ComName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hComm == INVALID_HANDLE_VALUE) { return NULL; } PurgeComm(hComm, PURGE_RXCLEAR); GetCommState(hComm, &dcb); dcb.BaudRate = baud_rate; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.fParity = FALSE; dcb.StopBits = ONESTOPBIT; if (SetCommState(hComm, &dcb) == 0) { return NULL; } src = malloc(sizeof *src); if (src) { memset(src, 0, sizeof *src); src->hComm = hComm; src->non_blocking = non_blocking; src->message = message; src->send.seqno = 37; } return src; #endif // LOSE32 } #ifndef LOSE32 int serial_source_fd(serial_source src) /* Returns: the file descriptor used by serial source src (useful when non-blocking reads were requested) */ { return src->fd; } #endif #ifdef LOSE32 HANDLE serial_source_handle(serial_source src) /* Returns: the file descriptor used by serial source src (useful when non-blocking reads were requested) */ { return src->hComm; } #endif int close_serial_source(serial_source src) /* Effects: closes serial source src Returns: 0 if successful, -1 if some problem occured (but source is considered closed anyway) */ { #ifndef LOSE32 int ok = close(src->fd); #else int ok = CloseHandle(src->hComm); #endif free(src); return ok; } static int source_wait(serial_source src, struct timeval *deadline) /* Effects: waits until deadline for some data on source. deadline can be NULL for indefinite waiting. Returns: 0 if data is available, -1 if the deadline expires */ { #ifndef LOSE32 struct timeval tv; fd_set fds; int cnt; if (src->recv.bufpos < src->recv.bufused) return 0; for (;;) { if (deadline) { gettimeofday(&tv, NULL); tv.tv_sec = deadline->tv_sec - tv.tv_sec; tv.tv_usec = deadline->tv_usec - tv.tv_usec; if (tv.tv_usec < 0) { tv.tv_usec += 1000000; tv.tv_sec--; } if (tv.tv_sec < 0) return -1; } FD_ZERO(&fds); FD_SET(src->fd, &fds); cnt = select(src->fd + 1, &fds, NULL, NULL, deadline ? &tv : NULL); if (cnt < 0) { if (errno == EINTR) continue; message(src, msg_unix_error); return -1; } if (cnt == 0) return -1; return 0; } #else // LOSE32 // FIXME: the deadline is ignored here DWORD eventMask; SetCommMask(src->hComm, EV_RXCHAR); if (!WaitCommEvent(src->hComm, &eventMask, NULL)) { return -1; } return 0; #endif } static int source_write(serial_source src, const void *buffer, int count) { #ifndef LOSE32 int actual = 0; if (fcntl(src->fd, F_SETFL, 0) < 0) { message(src, msg_unix_error); return -1; } while (count > 0) { int n = write(src->fd, buffer, count); if (n < 0 && errno == EINTR) continue; if (n < 0) { message(src, msg_unix_error); actual = -1; break; } count -= n; actual += n; buffer += n; } if (fcntl(src->fd, F_SETFL, O_NONBLOCK) < 0) { message(src, msg_unix_error); /* We're in trouble, but there's no obvious fix. */ } return actual; #else // LOSE32 int actual = 0; int n; const unsigned char * b = buffer; while (count > 0) { if (!WriteFile(src->hComm, b, count, &n, NULL)) { message(src, msg_unix_error); actual = -1; break; } count -= n; actual += n; b += n; } return actual; #endif } static void push_protocol_packet(serial_source src, uint8_t type, uint8_t *packet, uint8_t len) { /* I'm assuming short queues */ struct packet_list *entry = malloc(sizeof *entry), **last; if (!entry) { message(src, msg_no_memory); free(packet); return; } entry->packet = packet; entry->len = len; entry->next = NULL; last = &src->recv.queue[type]; while (*last) last = &(*last)->next; *last = entry; } static struct packet_list *pop_protocol_packet(serial_source src, uint8_t type) { struct packet_list *entry = src->recv.queue[type]; if (entry) src->recv.queue[type] = entry->next; return entry; } static bool packet_available(serial_source src, uint8_t type) { return src->recv.queue[type] != NULL; } int serial_source_empty(serial_source src) /* Returns: true if serial source does not contain any pending data, i.e., if the result is true and there is no data available on the source's file descriptor, then read_serial_packet will: - return NULL if the source is non-blocking - block if it is blocking (Note: the presence of this calls allows the serial_source to do some internal buffering) */ { return src->recv.bufpos >= src->recv.bufused && !packet_available(src, P_PACKET_NO_ACK); } /* Slow implementation of crc function */ static uint16_t crc_byte(uint16_t crc, uint8_t b) { uint8_t i; crc = crc ^ b << 8; i = 8; do if (crc & 0x8000) crc = crc << 1 ^ 0x1021; else crc = crc << 1; while (--i); return crc; } static uint16_t crc_packet(uint8_t *data, int len) { uint16_t crc = 0; while (len-- > 0) crc = crc_byte(crc, *data++); return crc; } static int read_byte(serial_source src, int non_blocking) /* Returns: next byte (>= 0), or -1 if no data available and non-blocking is true. */ { if (src->recv.bufpos >= src->recv.bufused) { for (;;) { int n = serial_read(src, non_blocking, src->recv.buffer, sizeof src->recv.buffer); if (n == 0) /* Can't occur because of serial_read bug workaround */ { message(src, msg_closed); return -1; } if (n > 0) { #ifdef DEBUG dump("raw", src->recv.buffer, n); #endif src->recv.bufpos = 0; src->recv.bufused = n; break; } #ifndef LOSE32 if (errno == EAGAIN) return -1; if (errno != EINTR) message(src, msg_unix_error); #endif } } //printf("in %02x\n", src->recv.buffer[src->recv.bufpos]); return src->recv.buffer[src->recv.bufpos++]; } static void process_packet(serial_source src, uint8_t *packet, int len); static int write_framed_packet(serial_source src, uint8_t packet_type, uint8_t first_byte, const uint8_t *packet, int count); static void read_and_process(serial_source src, int non_blocking) /* Effects: reads and processes up to one packet. */ { uint8_t *packet = src->recv.packet; for (;;) { int byte = read_byte(src, non_blocking); if (byte < 0) return; if (!src->recv.in_sync) { if (byte == SYNC_BYTE) { src->recv.in_sync = TRUE; message(src, msg_sync); src->recv.count = 0; src->recv.escaped = FALSE; } continue; } if (src->recv.count >= MTU) { message(src, msg_too_long); src->recv.in_sync = FALSE; continue; } if (src->recv.escaped) { if (byte == SYNC_BYTE) { /* sync byte following escape is an error, resync */ message(src, msg_bad_sync); src->recv.in_sync = FALSE; continue; } byte ^= 0x20; src->recv.escaped = FALSE; } else if (byte == ESCAPE_BYTE) { src->recv.escaped = TRUE; continue; } else if (byte == SYNC_BYTE) { int count = src->recv.count; uint8_t *received; uint16_t read_crc, computed_crc; src->recv.count = 0; /* ready for next packet */ if (count < 4) /* frames that are too small are ignored */ continue; received = malloc(count - 2); if (!received) { message(src, msg_no_memory); continue; } memcpy(received, packet, count - 2); read_crc = packet[count - 2] | packet[count - 1] << 8; computed_crc = crc_packet(received, count - 2); #ifdef DEBUG dump("received", packet, count); printf(" crc %x comp %x\n", read_crc, computed_crc); #endif if (read_crc == computed_crc) { process_packet(src, received, count - 2); return; /* give rest of world chance to do something */ } else { message(src, msg_bad_crc); free(received); /* We don't lose sync here. If we did, garbage on the line at startup will cause loss of the first packet. */ continue; } } packet[src->recv.count++] = byte; } } static void process_packet(serial_source src, uint8_t *packet, int len) { int packet_type = packet[0], offset = 1; if (packet_type == P_PACKET_ACK) { /* send ack */ write_framed_packet(src, P_ACK, packet[1], NULL, 0); /* And merge with un-acked packets */ packet_type = P_PACKET_NO_ACK; offset = 2; } /* packet must remain a valid pointer to pass to free. So we move the data rather than pass an internal pointer */ memmove(packet, packet + offset, len - offset); push_protocol_packet(src, packet_type, packet, len - offset); } void *read_serial_packet(serial_source src, int *len) /* Effects: Read the serial source src. If a packet is available, return it. If in blocking mode and no packet is available, wait for one. Returns: the packet read (in newly allocated memory), with *len is set to the packet length, or NULL if no packet is yet available and the serial source is in non-blocking mode */ { read_and_process(src, TRUE); for (;;) { struct packet_list *entry; entry = pop_protocol_packet(src, P_PACKET_NO_ACK); if (entry) { uint8_t *packet = entry->packet; *len = entry->len; free(entry); return packet; } if (src->non_blocking && serial_source_empty(src)) return NULL; source_wait(src, NULL); read_and_process(src, src->non_blocking); } } /* The escaper does the sync bytes+escape-like encoding+crc of packets */ static void escape_add(serial_source src, uint8_t b) { src->send.escaped[src->send.escapeptr++] = b; } static int init_escaper(serial_source src, int count) { src->send.escaped = malloc(count * 2 + 2); if (!src->send.escaped) { message(src, msg_no_memory); return -1; } src->send.escapeptr = 0; src->send.crc = 0; escape_add(src, SYNC_BYTE); return 0; } static void terminate_escaper(serial_source src) { escape_add(src, SYNC_BYTE); } static void escape_byte(serial_source src, uint8_t b) { src->send.crc = crc_byte(src->send.crc, b); if (b == SYNC_BYTE || b == ESCAPE_BYTE) { escape_add(src, ESCAPE_BYTE); escape_add(src, b ^ 0x20); } else escape_add(src, b); } static void free_escaper(serial_source src) { free(src->send.escaped); } // Write a packet of type 'packetType', first byte 'firstByte' // and bytes 2..'count'+1 in 'packet' static int write_framed_packet(serial_source src, uint8_t packet_type, uint8_t first_byte, const uint8_t *packet, int count) { int i, crc; #ifdef DEBUG printf("writing %02x %02x", packet_type, first_byte); dump("", packet, count); #endif if (init_escaper(src, count + 4) < 0) return -1; escape_byte(src, packet_type); escape_byte(src, first_byte); for (i = 0; i < count; i++) escape_byte(src, packet[i]); crc = src->send.crc; escape_byte(src, crc & 0xff); escape_byte(src, crc >> 8); terminate_escaper(src); #ifdef DEBUG dump("encoded", src->send.escaped, src->send.escapeptr); #endif if (source_write(src, src->send.escaped, src->send.escapeptr) < 0) { free_escaper(src); return -1; } free_escaper(src); return 0; } static void add_timeval(struct timeval *tv, long us) /* Specialised for this app */ { tv->tv_sec += us / 1000000; tv->tv_usec += us % 1000000; if (tv->tv_usec > 1000000) { tv->tv_usec -= 1000000; tv->tv_sec++; } } int write_serial_packet(serial_source src, const void *packet, int len) /* Effects: writes len byte packet to serial source src Returns: 0 if packet successfully written, 1 if successfully written but not acknowledged, -1 otherwise */ { struct timeval deadline; src->send.seqno++; if (write_framed_packet(src, P_PACKET_ACK, src->send.seqno, packet, len) < 0) return -1; // FIXME: the WIN32 implementation of source_wait() // disregards the deadline parameter anyway #ifndef LOSE32 gettimeofday(&deadline, NULL); add_timeval(&deadline, ACK_TIMEOUT); #endif for (;;) { struct packet_list *entry; read_and_process(src, TRUE); entry = pop_protocol_packet(src, P_ACK); if (entry) { uint8_t acked = entry->packet[0]; free(entry->packet); free(entry); if (acked == src->send.seqno) return 0; } else if (source_wait(src, &deadline) < 0) return 1; } } /* This somewhat convoluted code allows us to use a common baudrate table with the Java code. This could be improved if we generated the Java code from a common table. */ struct pargs { char *name; int rate; }; static void padd(struct pargs *args, const char *name, int baudrate) { if (!strcmp(args->name, name)) args->rate = baudrate; } static void init(void) { } int platform_baud_rate(char *platform_name) /* Returns: The baud rate of the specified platform, or -1 for unknown platforms */ { /* The Java code looks like Platform.add(Platform.x, "name", baudrate); Fake up some C stuff which will make that work right. */ struct pargs args; struct { void (*add)(struct pargs *args, const char *name, int baudrate); struct pargs *x; } Platform = { padd, &args }; static struct { struct { int packet; } tinyos; } net; if (isdigit(platform_name[0])) return atoi(platform_name); args.name = platform_name; args.rate = -1; #define class #define BaudRate #define static #define void #define throws ; #define Exception #define package #include "../../java/net/tinyos/packet/BaudRate.java" return args.rate; } tinyos-2.1.2+dfsg/support/sdk/c/sf/serialsource.h000066400000000000000000000060151207233610700217630ustar00rootroot00000000000000#ifndef SERIALSOURCE_H #define SERIALSOURCE_H #ifdef _WIN32 #include #endif #ifdef __cplusplus extern "C" { #endif typedef struct serial_source_t *serial_source; typedef enum { msg_unknown_packet_type, /* packet of unknown type received */ msg_ack_timeout, /* ack not received within timeout */ msg_sync, /* sync achieved */ msg_too_long, /* greater than MTU (256 bytes) */ msg_too_short, /* less than 4 bytes */ msg_bad_sync, /* unexpected sync byte received */ msg_bad_crc, /* received packet has bad crc */ msg_closed, /* serial port closed itself */ msg_no_memory, /* malloc failed */ msg_unix_error /* check errno for details */ } serial_source_msg; serial_source open_serial_source(const char *device, int baud_rate, int non_blocking, void (*message)(serial_source_msg problem)); /* Effects: opens serial port device at specified baud_rate. If non_blocking is true, read_serial_packet calls will be non-blocking (writes are always blocking, for now at least) If non-null, message will be called to signal various problems during execution. Returns: descriptor for serial forwarder at host:port, or NULL for failure */ #ifndef _WIN32 int serial_source_fd(serial_source src); /* Returns: the file descriptor used by serial source src (useful when non-blocking reads were requested) */ #endif #ifdef _WIN32 HANDLE serial_source_handle(serial_source src); /* Returns: the file descriptor used by serial source src (useful when non-blocking reads were requested) */ #endif int serial_source_empty(serial_source src); /* Returns: true if serial source does not contain any pending data, i.e., if the result is true and there is no data available on the source's file descriptor, then read_serial_packet will: - return NULL if the source is non-blocking - block if it is blocking (Note: the presence of this calls allows the serial_source to do some internal buffering) */ int close_serial_source(serial_source src); /* Effects: closes serial source src Returns: 0 if successful, -1 if some problem occured (but source is considered closed anyway) */ void *read_serial_packet(serial_source src, int *len); /* Effects: Read the serial source src. If a packet is available, return it. If in blocking mode and no packet is available, wait for one. Returns: the packet read (in newly allocated memory), with *len is set to the packet length, or NULL if no packet is yet available and the serial source is in non-blocking mode */ int write_serial_packet(serial_source src, const void *packet, int len); /* Effects: writes len byte packet to serial source src Returns: 0 if packet successfully written, 1 if successfully written but not acknowledged, -1 otherwise */ int platform_baud_rate(char *platform_name); /* Returns: The baud rate of the specified platform, or -1 for unknown platforms. If platform_name starts with a digit, just return atoi(platform_name). */ #ifdef __cplusplus } #endif #endif tinyos-2.1.2+dfsg/support/sdk/c/sf/sf.c000066400000000000000000000126351207233610700176730ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include "sfsource.h" #include "serialsource.h" serial_source src; int server_socket; int packets_read, packets_written, num_clients; struct client_list { struct client_list *next; int fd; } *clients; int unix_check(const char *msg, int result) { if (result < 0) { perror(msg); exit(2); } return result; } void *xmalloc(size_t s) { void *p = malloc(s); if (!p) { fprintf(stderr, "out of memory\n"); exit(2); } return p; } void fd_wait(fd_set *fds, int *maxfd, int fd) { if (fd > *maxfd) *maxfd = fd; FD_SET(fd, fds); } void pstatus(void) { printf("clients %d, read %d, wrote %d\n", num_clients, packets_read, packets_written); } void forward_packet(const void *packet, int len); void add_client(int fd) { struct client_list *c = xmalloc(sizeof *c); c->next = clients; clients = c; num_clients++; pstatus(); c->fd = fd; } void rem_client(struct client_list **c) { struct client_list *dead = *c; *c = dead->next; num_clients--; pstatus(); close(dead->fd); free(dead); } void new_client(int fd) { fcntl(fd, F_SETFL, 0); if (init_sf_source(fd) < 0) close(fd); else add_client(fd); } void check_clients(fd_set *fds) { struct client_list **c; for (c = &clients; *c; ) { int next = 1; if (FD_ISSET((*c)->fd, fds)) { int len; const void *packet = read_sf_packet((*c)->fd, &len); if (packet) { forward_packet(packet, len); free((void *)packet); } else { rem_client(c); next = 0; } } if (next) c = &(*c)->next; } } void wait_clients(fd_set *fds, int *maxfd) { struct client_list *c; for (c = clients; c; c = c->next) fd_wait(fds, maxfd, c->fd); } void dispatch_packet(const void *packet, int len) { struct client_list **c; for (c = &clients; *c; ) if (write_sf_packet((*c)->fd, packet, len) >= 0) c = &(*c)->next; else rem_client(c); } void open_server_socket(int port) { struct sockaddr_in me; int opt; server_socket = unix_check("socket", socket(AF_INET, SOCK_STREAM, 0)); unix_check("socket", fcntl(server_socket, F_SETFL, O_NONBLOCK)); memset(&me, 0, sizeof me); me.sin_family = AF_INET; me.sin_port = htons(port); opt = 1; unix_check("setsockopt", setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt))); unix_check("bind", bind(server_socket, (struct sockaddr *)&me, sizeof me)); unix_check("listen", listen(server_socket, 5)); } void check_new_client(void) { int clientfd = accept(server_socket, NULL, NULL); if (clientfd >= 0) new_client(clientfd); } void stderr_msg(serial_source_msg problem) { static char *msgs[] = { "unknown_packet_type", "ack_timeout" , "sync" , "too_long" , "too_short" , "bad_sync" , "bad_crc" , "closed" , "no_memory" , "unix_error" }; fprintf(stderr, "Note: %s\n", msgs[problem]); } void open_serial(const char *dev, int baud) { char ldev[80]; #ifdef __CYGWIN__ int portnum; if (strncasecmp(dev, "COM", 3) == 0) { fprintf(stderr, "Warning: you're attempting to open a Windows rather that a Cygwin device. Retrying with "); portnum=atoi(dev+3); sprintf(ldev, "/dev/ttyS%d",portnum-1); fprintf(stderr,ldev); fprintf(stderr, "\n"); } else #endif strcpy(ldev, dev); src = open_serial_source(ldev, baud, 1, stderr_msg); if (!src) { fprintf(stderr, "Couldn't open serial port at %s:%d\n", dev, baud); exit(1); } } void check_serial(void) { int len; const unsigned char *packet = read_serial_packet(src, &len); if (packet) { packets_read++; dispatch_packet(packet, len); free((void *)packet); } } void forward_packet(const void *packet, int len) { int ok = write_serial_packet(src, packet, len); packets_written++; if (ok < 0) exit(2); if (ok > 0) fprintf(stderr, "Note: write failed\n"); } int main(int argc, char **argv) { int serfd; if (argc != 4) { fprintf(stderr, "Usage: %s - act as a serial forwarder on \n" "(listens to serial port at baud rate )\n" , argv[0]); exit(2); } if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) fprintf(stderr, "Warning: failed to ignore SIGPIPE.\n"); open_serial(argv[2], platform_baud_rate(argv[3])); serfd = serial_source_fd(src); open_server_socket(atoi(argv[1])); for (;;) { fd_set rfds; int maxfd = -1; struct timeval zero; int serial_empty; int ret; zero.tv_sec = zero.tv_usec = 0; FD_ZERO(&rfds); fd_wait(&rfds, &maxfd, serfd); fd_wait(&rfds, &maxfd, server_socket); wait_clients(&rfds, &maxfd); serial_empty = serial_source_empty(src); if (serial_empty) ret = select(maxfd + 1, &rfds, NULL, NULL, NULL); else { ret = select(maxfd + 1, &rfds, NULL, NULL, &zero); check_serial(); } if (ret >= 0) { if (FD_ISSET(serfd, &rfds)) check_serial(); if (FD_ISSET(server_socket, &rfds)) check_new_client(); check_clients(&rfds); } } } tinyos-2.1.2+dfsg/support/sdk/c/sf/sflisten.c000066400000000000000000000012741207233610700211070ustar00rootroot00000000000000#include #include #include "sfsource.h" int main(int argc, char **argv) { int fd; if (argc != 3) { fprintf(stderr, "Usage: %s - dump packets from a serial forwarder\n", argv[0]); exit(2); } fd = open_sf_source(argv[1], atoi(argv[2])); if (fd < 0) { fprintf(stderr, "Couldn't open serial forwarder at %s:%s\n", argv[1], argv[2]); exit(1); } for (;;) { int len, i; const unsigned char *packet = read_sf_packet(fd, &len); if (!packet) exit(0); for (i = 0; i < len; i++) printf("%02x ", packet[i]); putchar('\n'); fflush(stdout); free((void *)packet); } } tinyos-2.1.2+dfsg/support/sdk/c/sf/sfsend.c000066400000000000000000000016151207233610700205410ustar00rootroot00000000000000#include #include #include #include "sfsource.h" void send_packet(int fd, char **bytes, int count) { int i; unsigned char *packet; packet = malloc(count); if (!packet) exit(2); for (i = 0; i < count; i++) packet[i] = strtol(bytes[i], NULL, 0); fprintf(stderr,"Sending "); for (i = 0; i < count; i++) fprintf(stderr, " %02x", packet[i]); fprintf(stderr, "\n"); write_sf_packet(fd, packet, count); } int main(int argc, char **argv) { int fd; if (argc < 4) { fprintf(stderr, "Usage: %s - send a raw packet to a serial forwarder\n", argv[0]); exit(2); } fd = open_sf_source(argv[1], atoi(argv[2])); if (fd < 0) { fprintf(stderr, "Couldn't open serial forwarder at %s:%s\n", argv[1], argv[2]); exit(1); } send_packet(fd, argv + 3, argc - 3); close(fd); } tinyos-2.1.2+dfsg/support/sdk/c/sf/sfsource.c000066400000000000000000000061111207233610700211040ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include "sfsource.h" int saferead(int fd, void *buffer, int count) { int actual = 0; while (count > 0) { int n = read(fd, buffer, count); if (n == -1 && errno == EINTR) continue; if (n == -1) return -1; if (n == 0) return actual; count -= n; actual += n; buffer = (char*)buffer + n; } return actual; } int safewrite(int fd, const void *buffer, int count) { int actual = 0; while (count > 0) { int n = write(fd, buffer, count); if (n == -1 && errno == EINTR) continue; if (n == -1) return -1; count -= n; actual += n; buffer = (char*)buffer + n; } return actual; } int open_sf_source(const char *host, int port) /* Returns: file descriptor for serial forwarder at host:port */ { int fd = socket(AF_INET, SOCK_STREAM, 0); struct hostent *entry; struct sockaddr_in addr; if (fd < 0) return fd; entry = gethostbyname(host); if (!entry) { close(fd); return -1; } addr.sin_family = entry->h_addrtype; memcpy(&addr.sin_addr, entry->h_addr_list[0], entry->h_length); addr.sin_port = htons(port); if (connect(fd, (struct sockaddr *)&addr, sizeof addr) < 0) { close(fd); return -1; } if (init_sf_source(fd) < 0) { close(fd); return -1; } return fd; } int init_sf_source(int fd) /* Effects: Checks that fd is following the TinyOS 2.0 serial forwarder protocol. Use this if you obtain your file descriptor from some other source than open_sf_source (e.g., you're a server) Returns: 0 if it is, -1 otherwise */ { char check[2], us[2]; int version; /* Indicate version and check if a TinyOS 2.0 serial forwarder on the other end */ us[0] = 'U'; us[1] = ' '; if (safewrite(fd, us, 2) != 2 || saferead(fd, check, 2) != 2 || check[0] != 'U') return -1; version = check[1]; if (us[1] < version) version = us[1]; /* Add other cases here for later protocol versions */ switch (version) { case ' ': break; default: return -1; /* not a valid version */ } return 0; } void *read_sf_packet(int fd, int *len) /* Effects: reads packet from serial forwarder on file descriptor fd Returns: the packet read (in newly allocated memory), and *len is set to the packet length, or NULL for failure */ { unsigned char l; void *packet; if (saferead(fd, &l, 1) != 1) return NULL; packet = malloc(l); if (!packet) return NULL; if (saferead(fd, packet, l) != l) { free(packet); return NULL; } *len = l; return packet; } int write_sf_packet(int fd, const void *packet, int len) /* Effects: writes len byte packet to serial forwarder on file descriptor fd Returns: 0 if packet successfully written, -1 otherwise */ { unsigned char l = len; if (safewrite(fd, &l, 1) != 1 || safewrite(fd, packet, l) != l) return -1; return 0; } tinyos-2.1.2+dfsg/support/sdk/c/sf/sfsource.h000066400000000000000000000016721207233610700211200ustar00rootroot00000000000000#ifndef SFSOURCE_H #define SFSOURCE_H #ifdef __cplusplus extern "C" { #endif int open_sf_source(const char *host, int port); /* Returns: file descriptor for TinyOS 2.0 serial forwarder at host:port, or -1 for failure */ int init_sf_source(int fd); /* Effects: Checks that fd is following the TinyOS 2.0 serial forwarder protocol. Use this if you obtain your file descriptor from some other source than open_sf_source (e.g., you're a server) Returns: 0 if it is, -1 otherwise */ void *read_sf_packet(int fd, int *len); /* Effects: reads packet from serial forwarder on file descriptor fd Returns: the packet read (in newly allocated memory), and *len is set to the packet length */ int write_sf_packet(int fd, const void *packet, int len); /* Effects: writes len byte packet to serial forwarder on file descriptor fd Returns: 0 if packet successfully written, -1 otherwise */ #ifdef __cplusplus } #endif #endif tinyos-2.1.2+dfsg/support/sdk/cpp/000077500000000000000000000000001207233610700170405ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/cpp/sf/000077500000000000000000000000001207233610700174505ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/cpp/sf/Makefile000066400000000000000000000045451207233610700211200ustar00rootroot00000000000000# # Copyright (c) 2007, Technische Universitaet Berlin # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # - Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # - Neither the name of the Technische Universitaet Berlin nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # @author Philipp Huppertz # @author Andreas Koepke # CC=g++ CFLAGS= -Wall -O3 -pthread all: sf sf: sf.o sfcontrol.o serialcomm.o tcpcomm.o basecomm.o packetbuffer.o sfpacket.o $(CC) $(CFLAGS) sf.o sfcontrol.o serialcomm.o tcpcomm.o basecomm.o packetbuffer.o sfpacket.o -o sf %.o: %.cpp $(CC) -c $(CFLAGS) $< serialcomm.o: serialcomm.cpp serialcomm.h basecomm.h sfpacket.h packetbuffer.h sharedinfo.h tcpcomm.o: tcpcomm.cpp sharedinfo.h tcpcomm.h sfpacket.h packetbuffer.h basecomm.h sfpacket.o: sfpacket.cpp sfpacket.h serialprotocol.h basecomm.o: basecomm.cpp basecomm.h sfcontrol.o: sfcontrol.cpp sfcontrol.h sharedinfo.h packetbuffer.h tcpcomm.h serialcomm.h packetbuffer.o: packetbuffer.cpp packetbuffer.h sfpacket.h clean: rm -rf *.o sf tinyos-2.1.2+dfsg/support/sdk/cpp/sf/README.txt000066400000000000000000000136611207233610700211550ustar00rootroot000000000000001. PREFACE: This is a re-implementation of the C serial forwarder, covering the same functionality with some improvements. It maintains the features of the C version (low CPU usage, small memory footprint), but with increased reliability: it does not loose packets while it waits for an ACK from the mote. In addition it has a control interface listening on a port, so if you run it as a daemon you can still ask it for various statistics, start and stop additional SFs for individual motes... C++ makes this implementation a bit more readable. 2. INSTALLATION: Make sure that your environment has a C++ compiler, supports POSIX threads and can make a select on files and on sockets. cd to src Open the Makefile and adjust the CC variable and the CFLAGS to match your environment. Please pay attention to the -c (compile only) flag in the stem rule. If you use a Linux and g++ you should be fine out of the box. run make and wait Your compiler might issue a warning: "sfpacket.cpp: warning: comparison is always true due to limited range of data type" you can safely ignore it. You should end up with an exectuable called sf in this directory, copy it whereever you need it. TODO: some of the things can be caught if we use a automake/autoconf environment. This is an overkill until we iron out the different platforms. 3. USAGE Start it with: sf or : sf control-port PORT_NUMBER daemon Arguments: control-port PORT_NUMBER : TCP port on which commands are accepted, to play with it: use telnet. Commands are executed once a new line '\n' is entered. If you write your own client, make sure that it sends a terminating '\n' after the command. daemon : this switch (if present) makes sf aware that it may be running as a daemon. Currently this only means that it will not read from stdin. No arguments: If sf is started without arguments it listen on standard input for commands (for a list type "help" when sf is running). If it is started with a given control-port (e.g.: sf control-port 9009) sf listen on the given TCP control port _and_ the standard input. Once you have it running and accepting commands either via the TCP port or via stdin, you can issue several commands (executed once a new line '\n' is entered): start - starts a sf-server on a given port and device stop - stops a running sf-server list - lists all running sf-servers info - prints out some information about a given sf-server close - closes the TCP connection to the control-client exit - immediatly exits and kills all running sf-servers By typing "help" followd by a command (e.g.: "help start" detailed information about that command is printed. The parameters of start are modelled after the command line of the C serial forwarder. The info command prints out some stats: The TCP SIDE (this is where your PC side application hooks up to the SF) prints: clients: the number of clients (or PC side apps/MoteIFs) connected to this port. packets read: correct packets received via TCP packets written: packets send vi TCP to your application The SERIAL LINE interface prints: packets read: the number of packets read from the mote. dropped: the number of packets that could not be send via TCP (usually because no client was connected) bad: number of packets with CRC or length errors, often 1: it needs a packet to synchronize to the stream. packets written: packets written to the mote dropped: number of packets where no ACK was received from the mote after 25 retries (with linear increasing backoff). Go check your mote application ;-) total retries: total number of packets where ACKs from the motes where not received in time. These packets are usually ACKed on a retry, these are not in failures in general. 4. AUTHOR Philipp Huppertz 5. MAINTAINERS Andreas Koepke Jan Hauer 6. KNOWN BUGS - Only one control client is allowed at one point in time. - The daemon switch is less powerful than it promises. - serialprotocol.h should be generated, as is done for the C version. - automake/autoconf build is missing 7. LICENSE Copyright (c) 2007, Technische Universitaet Berlin All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Technische Universitaet Berlin nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.tinyos-2.1.2+dfsg/support/sdk/cpp/sf/basecomm.cpp000066400000000000000000000054501207233610700217460ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #include #include #include "basecomm.h" BaseComm::BaseComm() { } BaseComm::~BaseComm() { } /* all count bytes must be read before returning - blocking in that way... */ int BaseComm::readFD(int fd, char *buffer, int count, int *err) { int actual = 0; while (count > 0) { int n = read(fd, buffer, count); if (n == -1) { *err = errno; return -1; } if (n == 0) { return actual; } count -= n; actual += n; buffer += n; } return actual; } /* all count bytes must be written before returning - blocking in that way... */ int BaseComm::writeFD(int fd, const char *buffer, int count, int *err) { int actual = 0; while (count > 0) { int n = write(fd, buffer, count); if(n == -1) { if(errno != 0) { *err = errno; return -1; } else { // looks like a temporary glitch n = 0; } } count -= n; actual += n; buffer += n; } return actual; } tinyos-2.1.2+dfsg/support/sdk/cpp/sf/basecomm.h000066400000000000000000000037551207233610700214210ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #ifndef BASECOMM_H #define BASECOMM_H class BaseComm { public: BaseComm(); virtual ~BaseComm(); protected: /* performs blocking read on fd */ virtual int readFD(int fd, char *buffer, int count, int *err); /* performs blocking write on fd */ virtual int writeFD(int fd, const char *buffer, int count, int *err); }; #endif tinyos-2.1.2+dfsg/support/sdk/cpp/sf/build.xml000066400000000000000000000003541207233610700212730ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/support/sdk/cpp/sf/packetbuffer.cpp000066400000000000000000000131371207233610700226220ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #include "packetbuffer.h" #include "pthread.h" #include PacketBuffer::PacketBuffer() { pthread_mutex_init(&buffer.lock, NULL); pthread_cond_init(&buffer.notempty, NULL); pthread_cond_init(&buffer.notfull, NULL); } PacketBuffer::~PacketBuffer() { pthread_cond_destroy(&buffer.notempty); pthread_cond_destroy(&buffer.notfull); pthread_mutex_destroy(&buffer.lock); } // clears the buffer void PacketBuffer::clear() { pthread_testcancel(); pthread_mutex_lock(&buffer.lock); // clear buffer.container.clear(); DEBUG("PacketBuffer::clear : cleared buffer and signal ") pthread_cond_signal(&buffer.notfull); pthread_mutex_unlock(&buffer.lock); } // gets a packet from the buffer (NULL = buffer empty) SFPacket PacketBuffer::dequeue() { SFPacket packet; pthread_testcancel(); pthread_cleanup_push((void(*)(void*)) pthread_mutex_unlock, (void *) &buffer.lock); pthread_mutex_lock(&buffer.lock); // wait until buffer is _not_ empty while(buffer.container.size() == 0) { DEBUG("PacketBuffer::dequeue : waiting until buffer is ") pthread_cond_wait(&buffer.notempty, &buffer.lock); } // dequeue packet = buffer.container.front(); buffer.container.pop_front(); DEBUG("PacketBuffer::dequeue : get from buffer and signal ") pthread_cond_signal(&buffer.notfull); pthread_cleanup_pop(1); return packet; } // puts a packet into buffer... (SUCCESS = true) bool PacketBuffer::enqueueFront(SFPacket &pPacket) { pthread_testcancel(); pthread_cleanup_push((void(*)(void*)) pthread_mutex_unlock, (void *) &buffer.lock); pthread_mutex_lock(&buffer.lock); // wait until buffer is _not_ full while(buffer.container.size() >= cMaxBufferSize) { DEBUG("PacketBuffer::enqueueFront : waiting until buffer is ") pthread_cond_wait(&buffer.notfull, &buffer.lock); } // enqueue buffer.container.push_front(pPacket); DEBUG("PacketBuffer::enqueueFront : put in buffer and signal ") // signal that buffer is now not empty pthread_cond_signal(&buffer.notempty); pthread_cleanup_pop(1); return true; } // puts a packet into buffer... (SUCCESS = true) bool PacketBuffer::enqueueBack(SFPacket &pPacket) { pthread_testcancel(); pthread_cleanup_push((void(*)(void*)) pthread_mutex_unlock, (void *) &buffer.lock); pthread_mutex_lock(&buffer.lock); // wait until buffer is _not_ full while(buffer.container.size() >= cMaxBufferSize) { DEBUG("PacketBuffer::enqueueBack : waiting until buffer is ") pthread_cond_wait(&buffer.notfull, &buffer.lock); } // enqueue buffer.container.push_back(pPacket); DEBUG("PacketBuffer::enqueueBack : put in buffer and signal ") // signal that buffer is now not empty pthread_cond_signal(&buffer.notempty); pthread_cleanup_pop(1); return true; } /* checks if packet buffer is full */ bool PacketBuffer::isFull() { bool isFull = true; pthread_testcancel(); pthread_mutex_lock(&buffer.lock); if (buffer.container.size() < cMaxBufferSize) { isFull = false; } pthread_mutex_unlock(&buffer.lock); return isFull; } /* checks if packet buffer is empty */ bool PacketBuffer::isEmpty() { bool isEmpty = true; pthread_testcancel(); pthread_mutex_lock(&buffer.lock); if (buffer.container.size() > 0) { isEmpty = false; } pthread_mutex_unlock(&buffer.lock); return isEmpty; } /* checks if pPacket is in queue */ bool PacketBuffer::isInQueue(SFPacket &pPacket) { bool result = false; DEBUG("PacketBuffer::isInQueue : lock") pthread_testcancel(); pthread_mutex_lock(&buffer.lock); container_t::const_iterator it = find(buffer.container.begin(), buffer.container.end(), pPacket); if( it != buffer.container.end() ) { result = true; } pthread_mutex_unlock(&buffer.lock); DEBUG("PacketBuffer::isInQueue : unlock") return result; } tinyos-2.1.2+dfsg/support/sdk/cpp/sf/packetbuffer.h000066400000000000000000000051411207233610700222630ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #ifndef PACKETBUFFER_H #define PACKETBUFFER_H #include #include #include "sfpacket.h" // #define DEBUG_PACKETBUFFER #undef DEBUG #ifdef DEBUG_PACKETBUFFER #include #define DEBUG(message) std::cout << message << std::endl; #else #define DEBUG(message) #endif class PacketBuffer { protected: static const unsigned cMaxBufferSize = 25; typedef std::list container_t; // thread safe buffer typedef struct { // mutex lock for any of this vars pthread_mutex_t lock; // notempty cond pthread_cond_t notempty; // not full cond pthread_cond_t notfull; // actual buffer container_t container; } sharedBuffer_t; sharedBuffer_t buffer; public: PacketBuffer(); ~PacketBuffer(); void clear(); SFPacket dequeue(); bool enqueueFront(SFPacket &pPacket); bool enqueueBack(SFPacket &pPacket); bool isFull(); bool isEmpty(); bool isInQueue(SFPacket &pPacket); }; #endif tinyos-2.1.2+dfsg/support/sdk/cpp/sf/serialcomm.cpp000066400000000000000000000527231207233610700223200ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #include "serialcomm.h" #include "sharedinfo.h" #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* forward declarations of pthrad helper functions*/ void* readSerialThread(void*); void* writeSerialThread(void*); tcflag_t SerialComm::parseBaudrate(int requested) { int baudrate; switch (requested) { #ifdef B50 case 50: baudrate = B50; break; #endif #ifdef B75 case 75: baudrate = B75; break; #endif #ifdef B110 case 110: baudrate = B110; break; #endif #ifdef B134 case 134: baudrate = B134; break; #endif #ifdef B150 case 150: baudrate = B150; break; #endif #ifdef B200 case 200: baudrate = B200; break; #endif #ifdef B300 case 300: baudrate = B300; break; #endif #ifdef B600 case 600: baudrate = B600; break; #endif #ifdef B1200 case 1200: baudrate = B1200; break; #endif #ifdef B1800 case 1800: baudrate = B1800; break; #endif #ifdef B2400 case 2400: baudrate = B2400; break; #endif #ifdef B4800 case 4800: baudrate = B4800; break; #endif #ifdef B9600 case 9600: baudrate = B9600; break; #endif #ifdef B19200 case 19200: baudrate = B19200; break; #endif #ifdef B38400 case 38400: baudrate = B38400; break; #endif #ifdef B57600 case 57600: baudrate = B57600; break; #endif #ifdef B115200 case 115200: baudrate = B115200; break; #endif #ifdef B230400 case 230400: baudrate = B230400; break; #endif #ifdef B460800 case 460800: baudrate = B460800; break; #endif #ifdef B500000 case 500000: baudrate = B500000; break; #endif #ifdef B576000 case 576000: baudrate = B576000; break; #endif #ifdef B921600 case 921600: baudrate = B921600; break; #endif #ifdef B1000000 case 1000000: baudrate = B1000000; break; #endif #ifdef B1152000 case 1152000: baudrate = B1152000; break; #endif #ifdef B1500000 case 1500000: baudrate = B1500000; break; #endif #ifdef B2000000 case 2000000: baudrate = B2000000; break; #endif #ifdef B2500000 case 2500000: baudrate = B2500000; break; #endif #ifdef B3000000 case 3000000: baudrate = B3000000; break; #endif #ifdef B3500000 case 3500000: baudrate = B3500000; break; #endif #ifdef B4000000 case 4000000: baudrate = B4000000; break; #endif default: baudrate = 0; } return baudrate; } SerialComm::SerialComm(const char* pDevice, int pBaudrate, PacketBuffer &pReadBuffer, PacketBuffer &pWriteBuffer, sharedControlInfo_t& pControl) : readBuffer(pReadBuffer), writeBuffer(pWriteBuffer), droppedReadPacketCount(0), droppedWritePacketCount(0), readPacketCount(0), writtenPacketCount(0), badPacketCount(0), sumRetries(0), device(pDevice), baudrate(pBaudrate), serialReadFD(-1), serialWriteFD(-1), errorReported(false), errorMsg(""), control(pControl) { writerThreadRunning = false; readerThreadRunning = false; rawFifo.head = rawFifo.tail = 0; tcflag_t baudflag = parseBaudrate(pBaudrate); srand ( time(NULL) ); seqno = rand(); FD_ZERO(&rfds); FD_ZERO(&wfds); serialReadFD = open(device.c_str(), O_RDONLY | O_NOCTTY | O_NONBLOCK); serialWriteFD = open(device.c_str(), O_WRONLY | O_NOCTTY); if (((serialReadFD < 0) || (serialWriteFD < 0) || (!baudflag)) && !(errorReported == true)) { ostringstream msg; msg << "could not open device = " << pDevice << " with baudrate = " << pBaudrate; reportError(msg.str().c_str() ,-1); } /* Serial port setting */ struct termios newtio; memset(&newtio, 0, sizeof(newtio)); newtio.c_cflag = CS8 | CLOCAL | CREAD; newtio.c_iflag = IGNPAR | IGNBRK; cfsetispeed(&newtio, baudflag); cfsetospeed(&newtio, baudflag); /* Raw output_file */ newtio.c_oflag = 0; if ((tcflush(serialReadFD, TCIFLUSH) >= 0 && tcsetattr(serialReadFD, TCSANOW, &newtio) >= 0) && (tcflush(serialWriteFD, TCIFLUSH) >= 0 && tcsetattr(serialWriteFD, TCSANOW, &newtio) >= 0) && !errorReported) { DEBUG("SerialComm::SerialComm : opened device "<< pDevice << " with baudrate = " << pBaudrate) } else { close(serialReadFD); close(serialWriteFD); if (!errorReported) { ostringstream msg; msg << "could not set ioflags for opened device = " << pDevice; reportError(msg.str().c_str(),-1); } } pthread_mutex_init(&ack.lock, NULL); pthread_cond_init(&ack.received, NULL); if (!errorReported) { // start thread for reading from serial line if (reportError("SerialComm::SerialComm : pthread_create( &readerThread, NULL, readSerialThread, this)", pthread_create( &readerThread, NULL, readSerialThread, this)) == 0) readerThreadRunning = true; // start thread for writing to serial line if (reportError("SerialComm::SerialComm : pthread_create( &writerThread, NULL, writeSerialThread, this)", pthread_create( &writerThread, NULL, writeSerialThread, this)) == 0) writerThreadRunning = true; } } SerialComm::~SerialComm() { cancel(); pthread_mutex_destroy(&ack.lock); pthread_cond_destroy(&ack.received); if(serialReadFD > 2) close(serialReadFD); if(serialWriteFD > 2) close(serialWriteFD); } int SerialComm::hdlcEncode(int count, const char* from, char *to) { int offset = 0; for(int i = 0; i < count; i++) { if (from[i] == SYNC_BYTE || from[i] == ESCAPE_BYTE) { to[offset++] = ESCAPE_BYTE; to[offset++] = from[i] ^ 0x20; } else { to[offset++] = from[i]; } } return offset; } int SerialComm::writeFD(int fd, const char *buffer, int count, int *err) { int cnt = 0; /* FD_SET(serialWriteFD, &wfds); if(select(serialWriteFD + 1, NULL, &wfds, NULL, NULL) < 0) { return -1; } FD_CLR(serialWriteFD, &wfds); */ int tmpCnt = BaseComm::writeFD(fd, buffer, count, err); if (tmpCnt < 0) { *err = errno; return tmpCnt; } else { cnt += tmpCnt; } return cnt; } /* Work around buggy usb serial driver (returns 0 when no data is available, independent of the blocking/non-blocking mode) */ int SerialComm::readFD(int fd, char *buffer, int count, int maxCount, int *err) { int cnt = 0; timeval tvold; timeval tv; unsigned to = (10000000 / baudrate) * count; // time out in usec tvold.tv_sec = to / 1000000; tvold.tv_usec = to % 1000000; while (cnt == 0) { // no FD_ZERO here because of performance issues. It is done in constructor... FD_SET(serialReadFD, &rfds); if (select(serialReadFD + 1, &rfds, NULL, NULL, NULL) < 0) { return -1; } FD_CLR(serialReadFD, &rfds); tv = tvold; select(0, NULL, NULL, NULL, &tv); int tmpCnt = read(fd, buffer, maxCount); if (tmpCnt < 0) { *err = errno; return tmpCnt; } else { cnt += tmpCnt; } } return cnt; } char SerialComm::nextRaw() { char nextByte = 0; int err = 0; if(rawFifo.tail < rawFifo.head) { nextByte = rawFifo.queue[rawFifo.tail++]; } else { // fifo empty -- need to get some bytes rawFifo.tail = 0; rawFifo.head = readFD(serialReadFD, rawFifo.queue, rawReadBytes, maxMTU-1, &err); if(rawFifo.head < 0) { close(serialReadFD); close(serialWriteFD); serialReadFD = -1; serialWriteFD = -1; errno = err; } reportError("SerialComm::nextRaw: readFD(serialReadFD, rawFifo.queue, rawReadBytes, maxMTU-1)", rawFifo.head); nextByte = rawFifo.queue[rawFifo.tail++]; } return nextByte; } /* reads packet */ bool SerialComm::readPacket(SFPacket &pPacket) { uint8_t buffer[maxMTU + 10]; int count = 0; rx_states_t state = WAIT_FOR_SYNC; for(;;) { uint8_t nextByte = nextRaw(); if(state == WAIT_FOR_SYNC) { if(nextByte == SYNC_BYTE) { count = 0; state = IN_SYNC; } } else if(state == IN_SYNC) { if(nextByte == SYNC_BYTE) { if(count < minMTU) { DEBUG("SerialComm::readPacket : frame too short - size = " << count << " : resynchronising "); badPacketCount++; count = 0; } else { bool dobreak = true; DEBUG("SerialComm::readPacket : frame size = " << count); if(checkCrc(buffer, count)) { pPacket.setType(buffer[typeOffset]); pPacket.setSeqno(buffer[seqnoOffset]); switch (buffer[typeOffset]) { case SF_ACK: break; case SF_PACKET_NO_ACK: pPacket.setPayload((char *)(&buffer[payloadOffset]-1), count+1+1 - serialHeaderBytes); break; case SF_PACKET_ACK: pPacket.setPayload((char *)(&buffer[payloadOffset]), count+1 - serialHeaderBytes); break; default: dobreak = false; DEBUG("SerialComm::readPacket : unknown packet type = " \ << static_cast(buffer[typeOffset] & 0xff)); break; } if(dobreak) break; // leave loop } else { DEBUG("SerialComm::readPacket : bad crc"); count = 0; badPacketCount++; } } } else if(nextByte == ESCAPE_BYTE) { state = ESCAPED; } else { buffer[count++] = nextByte; if(count >= maxMTU) { DEBUG("SerialComm::readPacket : packet too long, resynchronizing"); count = 0; badPacketCount++; state = WAIT_FOR_SYNC; } } } else if(state == ESCAPED) { if(nextByte == SYNC_BYTE) { DEBUG("SerialComm::readPacket : state ESCAPED, packet got sync byte, resynchronizing"); count = 0; badPacketCount++; state = IN_SYNC; } else { buffer[count++] = nextByte ^ 0x20; if(count >= maxMTU) { DEBUG("SerialComm::readPacket : state ESCAPED, packet too long, resynchronizing"); count = 0; badPacketCount++; state = WAIT_FOR_SYNC; } else { state = IN_SYNC; } } } } return true; } /* writes packet */ bool SerialComm::writePacket(SFPacket &pPacket) { char type, byte = 0; uint16_t crc = 0; char buffer[2*pPacket.getLength() + 20]; int offset = 0; int err = 0; int written = 0; // put SFD into buffer buffer[offset++] = SYNC_BYTE; // packet type byte = type = pPacket.getType(); crc = byteCRC(byte, crc); offset += hdlcEncode(1, &byte, buffer + offset); // seqno byte = pPacket.getSeqno(); crc = byteCRC(byte, crc); offset += hdlcEncode(1, &byte, buffer + offset); switch (type) { case SF_ACK: break; case SF_PACKET_NO_ACK: case SF_PACKET_ACK: // compute crc for(int i = 0; i < pPacket.getLength(); i++) { crc = byteCRC(pPacket.getPayload()[i], crc); } offset += hdlcEncode(pPacket.getLength(), pPacket.getPayload(), buffer + offset); break; default: return false; } // crc two bytes byte = crc & 0xff; offset += hdlcEncode(1, &byte, buffer + offset); byte = (crc >> 8) & 0xff; offset += hdlcEncode(1, &byte, buffer + offset); // put SFD into buffer buffer[offset++] = SYNC_BYTE; written = writeFD(serialWriteFD, buffer, offset, &err); if(written < 0) { if(err != EINTR) { close(serialReadFD); serialReadFD = -1; close(serialWriteFD); serialWriteFD = -1; errno = err; reportError("SerialComm::writePacket failed",-1); return false; } } else if(written < offset) { DEBUG("SerialComm::writePacket failed"); return false; } return true; } string SerialComm::getDevice() const { return device; } int SerialComm::getBaudRate() const { return baudrate; } /* helper function to start serial reader pthread */ void* readSerialThread(void* ob) { static_cast(ob)->readSerial(); return NULL; } /* reads from connected clients */ void SerialComm::readSerial() { while (true) { SFPacket packet; readPacket(packet); switch (packet.getType()) { case SF_ACK: // successful delivery // FIXME: seqnos are not implemented on the node ! pthread_cond_signal(&ack.received); break; case SF_PACKET_ACK: { // put ack in front of queue SFPacket ack(SF_ACK, packet.getSeqno()); writeBuffer.enqueueFront(ack); } case SF_PACKET_NO_ACK: // do nothing - fall through default: if (!readBuffer.isFull()) { ++readPacketCount; // put silently into buffer... readBuffer.enqueueBack(packet); } else { while(readBuffer.isFull()) { readBuffer.dequeue(); ++droppedReadPacketCount; } readBuffer.enqueueBack(packet); // DEBUG("SerialComm::readSerial : dropped packet") } } } } /* helper function to start serial writer pthread */ void* writeSerialThread(void* ob) { static_cast(ob)->writeSerial(); return NULL; } /* writes to serial/node */ void SerialComm::writeSerial() { SFPacket packet; bool retry = false; int retryCount = 0; long long timeout; while (true) { if (!retry) { cerr << " serial deqeue packet, empty: " << writeBuffer.isEmpty() << endl; packet = writeBuffer.dequeue(); } switch (packet.getType()) { case SF_ACK: // successful delivery if (!writePacket(packet)) { DEBUG("SerialComm::writeSerial : writePacket failed (SF_ACK)") reportError("SerialComm::writeSerial : writePacket(SF_ACK)", -1); } break; case SF_PACKET_ACK: // do nothing - fall through case SF_PACKET_NO_ACK: // do nothing - fall through default: if (!retry) ++writtenPacketCount; // FIXME: this is the only currently supported type by the mote packet.setType(SF_PACKET_ACK); if (!writePacket(packet)) { DEBUG("SerialComm::writeSerial : writePacket failed (SF_PACKET)") reportError("SerialComm::writeSerial : writeFD(SF_PACKET)", -1); } // wait for ack... struct timeval currentTime; struct timespec ackTime; timeout = (long long)ackTimeout * (retryCount + 1); pthread_testcancel(); pthread_mutex_lock(&ack.lock); gettimeofday(¤tTime, NULL); ackTime.tv_sec = currentTime.tv_sec; ackTime.tv_nsec = currentTime.tv_usec * 1000; ackTime.tv_sec += timeout / (1000*1000*1000); ackTime.tv_nsec += timeout % (1000*1000*1000); pthread_cleanup_push((void(*)(void*)) pthread_mutex_unlock, (void *) &ack.lock); int retval = pthread_cond_timedwait(&ack.received, &ack.lock, &ackTime); if (!((retryCount < maxRetries) && (retval == ETIMEDOUT))) { if (retryCount >= maxRetries) ++droppedWritePacketCount; retry = false; retryCount = 0; } else { ++retryCount; retry = true; DEBUG("SerialComm::writeSerial : packet retryCount = " << retryCount); ++sumRetries; } // removes the cleanup handler and executes it (unlock mutex) pthread_cleanup_pop(1); } } } /* cancels all running threads */ void SerialComm::cancel() { pthread_t callingThread = pthread_self(); if(readerThreadRunning && pthread_equal(callingThread, readerThread)) { DEBUG("SerialComm::cancel : by readerThread") pthread_detach(readerThread); if (writerThreadRunning) { pthread_cancel(writerThread); DEBUG("SerialComm::cancel : writerThread canceled, joining") pthread_join(writerThread, NULL); writerThreadRunning = false; } readerThreadRunning = false; pthread_cond_signal(&control.cancel); pthread_exit(NULL); } else if(writerThreadRunning && pthread_equal(callingThread, writerThread)) { DEBUG("SerialComm::cancel : by writerThread") pthread_detach(writerThread); if (readerThreadRunning) { pthread_cancel(readerThread); DEBUG("SerialComm::cancel : readerThread canceled, joining") pthread_join(readerThread, NULL); readerThreadRunning = false; } writerThreadRunning = false; pthread_cond_signal(&control.cancel); pthread_exit(NULL); } else { DEBUG("SerialComm::cancel : by other thread") if (readerThreadRunning) { pthread_cancel(readerThread); DEBUG("SerialComm::cancel : readerThread canceled, joining") pthread_join(readerThread, NULL); readerThreadRunning = false; } if (writerThreadRunning) { pthread_cancel(writerThread); DEBUG("SerialComm::cancel : writerThread canceled, joining") pthread_join(writerThread, NULL); writerThreadRunning = false; } pthread_cond_signal(&control.cancel); } } /* reports error */ int SerialComm::reportError(const char *msg, int result) { if ((result < 0) && (!errorReported)) { errorMsg << "error : SF-Server ( SerialComm on device = " << device << " ) : " << msg << " ( result = " << result << " )" << endl << "error-description : " << strerror(errno) << endl; cerr << errorMsg.str(); errorReported = true; cancel(); } return result; } /* prints out status */ void SerialComm::reportStatus(ostream& os) { os << "SF-Server ( SerialComm on device " << device << " ) : " << "baudrate = " << baudrate << " , packets read = " << readPacketCount << " ( dropped = " << droppedReadPacketCount << ", bad = " << badPacketCount << " )" << " , packets written = " << writtenPacketCount << " ( dropped = " << droppedWritePacketCount << ", total retries: " << sumRetries << " )" << endl; } tinyos-2.1.2+dfsg/support/sdk/cpp/sf/serialcomm.h000066400000000000000000000165241207233610700217640ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #ifndef SERIALCOMM_H #define SERIALCOMM_H #include "basecomm.h" #include "sfpacket.h" #include "packetbuffer.h" #include "sharedinfo.h" #include #include #include #include #include #include // #define DEBUG_SERIALCOMM // #define DEBUG_RAW_SERIALCOMM #undef DEBUG #ifdef DEBUG_SERIALCOMM #include #define DEBUG(message) std::cout << message << std::endl; #else #define DEBUG(message) #endif class SerialComm : public BaseComm { /** Constants **/ protected: // max serial MTU static const int maxMTU = (SFPacket::cMaxPacketLength+1)*2; // min serial MTU static const int minMTU = 4; // byte count of serial header static const int serialHeaderBytes = 5; // byte offset of type field static const int typeOffset = 0; // byte offset of sequence number field static const int seqnoOffset = 1; // byte offset of payload field static const int payloadOffset = 2; // timeout for acks in s static const int ackTimeout = 1000 * 1000 * 200; // max. reties for packets from pc to node static const int maxRetries = 25; // how many bytes do we attempt to read from the serial line in one go? static const int rawReadBytes = 20; enum rx_states_t { WAIT_FOR_SYNC, IN_SYNC, ESCAPED }; /** Member vars */ protected: /* pthread for serial reading */ pthread_t readerThread; bool readerThreadRunning; /* pthread for serial writing */ pthread_t writerThread; bool writerThreadRunning; // thread safe ack typedef struct { // mutex lock for any of this vars pthread_mutex_t lock; // notempty cond pthread_cond_t received; } ackCondition_t; ackCondition_t ack; /* raw read buffer */ struct rawFifo_t { char queue[maxMTU]; int head; int tail; }; rawFifo_t rawFifo; /* reference to read packet buffer */ PacketBuffer &readBuffer; /* reference to write packet buffer */ PacketBuffer &writeBuffer; /* number of dropped (read) packets */ int droppedReadPacketCount; /* number of dropped (write) packets */ int droppedWritePacketCount; /* number of read packets */ int readPacketCount; /* number of written packets */ int writtenPacketCount; /* number of bad packets read from serial line, counts resynchronizations! */ int badPacketCount; /* sum retry attempts for all packets */ int sumRetries; /* device port of this sf */ std::string device; /* baudrate of connected device */ int baudrate; /* read fd set */ fd_set rfds; /* write fd set */ fd_set wfds; /* fd for reading from serial device */ int serialReadFD; /* fd for writing to serial device */ int serialWriteFD; /* seqno for serial data packets */ int seqno; /* indicates that an error occured */ bool errorReported; /* error message of reportError call */ std::ostringstream errorMsg; /* for noticing the parent thread of cancelation */ sharedControlInfo_t &control; /** Member functions */ /* needed to start pthreads */ friend void* readSerialThread(void* ob); friend void* writeSerialThread(void* ob); private: /* do not allow standard constructor */ SerialComm(); protected: char nextRaw(); /* claculates crc byte-wise */ inline static uint16_t byteCRC(uint8_t byte, uint16_t crc) { crc = (uint8_t)(crc >> 8) | (crc << 8); crc ^= byte; crc ^= (uint8_t)(crc & 0xff) >> 4; crc ^= crc << 12; crc ^= (crc & 0xff) << 5; return crc; } inline static uint16_t calcCRC(uint8_t *bytes, uint16_t len) { uint16_t crc = 0; for(unsigned i = 0; i < len; i++) { crc = SerialComm::byteCRC(bytes[i], crc); } return crc; } inline static uint16_t checkCrc(uint8_t *bytes, uint16_t count) { bool crcOk = false; if(count > 2) { uint16_t crc = calcCRC(bytes, count - 2); uint16_t packetCrc = (bytes[count-1] << 8) | bytes[count-2]; if(crc == packetCrc) crcOk = true; } return crcOk; } /* HDLC encode (byte stuff) count bytes from buffer from into buffer to. * to must be at least count * 2 bytes large. Returns the number of bytes * written into to. */ int hdlcEncode(int count, const char* from, char *to); /** * try to read at least count bytes in one go, but may read up to maxCount bytes. */ virtual int readFD(int fd, char *buffer, int count, int maxCount, int *err); /* enables byte escaping. overwrites method from base class.*/ virtual int writeFD(int fd, const char *buffer, int count, int *err); /* reads a packet (blocking) */ bool readPacket(SFPacket &pPacket); /* writes a packet to serial source */ bool writePacket(SFPacket &pPacket); /* returns tcflag of requested baudrate */ static tcflag_t parseBaudrate(int requested); int reportError(const char *msg, int result); /* checks for messages from node - producer thread */ void readSerial(); /* write messages to serial / node - consumer thread */ void writeSerial(); public: SerialComm(const char* pDevice, int pBaudrate, PacketBuffer &pReadBuffer, PacketBuffer &pWriteBuffer, sharedControlInfo_t& pControl); ~SerialComm(); /* cancels all running threads */ void cancel(); std::string getDevice() const; int getBaudRate() const; void reportStatus(std::ostream& os); /* returns if error occurred */ bool isErrorReported() { return errorReported; } }; #endif tinyos-2.1.2+dfsg/support/sdk/cpp/sf/serialprotocol.h000066400000000000000000000011141207233610700226570ustar00rootroot00000000000000/** * This file is automatically generated by ncg. DO NOT EDIT THIS FILE. * It includes values of some nesC constants from * /home/phihup/cvs/tinyos-2.x/tos/lib/serial/Serial.h. */ enum { SERIAL_HDLC_CTLESC_BYTE = 125, SERIAL_TOS_SERIAL_802_15_4_ID = 2, SERIAL_SERIAL_PROTO_ACK = 67, SERIAL_TOS_SERIAL_CC1000_ID = 1, SERIAL_SERIAL_PROTO_PACKET_NOACK = 69, SERIAL_SERIAL_PROTO_PACKET_UNKNOWN = 255, SERIAL_HDLC_FLAG_BYTE = 126, SERIAL_TOS_SERIAL_ACTIVE_MESSAGE_ID = 0, SERIAL_TOS_SERIAL_UNKNOWN_ID = 255, SERIAL_SERIAL_PROTO_PACKET_ACK = 68 }; tinyos-2.1.2+dfsg/support/sdk/cpp/sf/sf.cpp000066400000000000000000000043351207233610700205710ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include "sfcontrol.h" #include "tcpcomm.h" #include "serialcomm.h" #include "packetbuffer.h" #ifdef __APPLE__ #include #include #endif using namespace std; int main(int argc, char *argv[]) { #ifdef __APPLE__ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) cerr << "Warning: failed to ignore SIGPIPE " << endl; #endif SFControl control; control.parseArgs(argc, argv); control.waitOnInput(); return EXIT_SUCCESS; } tinyos-2.1.2+dfsg/support/sdk/cpp/sf/sfcontrol.cpp000066400000000000000000000534471207233610700222020ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #include "sfcontrol.h" #include "sharedinfo.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* forward declarations of pthrad helper functions*/ void* checkCancelThread(void*); SFControl::SFControl() { servers.clear(); pthread_mutex_init(&sfControlInfo.lock, NULL); pthread_cond_init(&sfControlInfo.cancel, NULL); FD_ZERO(&rfds); FD_ZERO(&wfds); uniqueId = 0; servers.clear(); serverFD = -1; clientFD = -1; controlPort = -1; controlServerStarted = false; daemon = false; reportError("SFControl::SFControl : pthread_create( &cancelThread, NULL, checkCancelThread, this)", pthread_create( &cancelThread, NULL, checkCancelThread, this)); } SFControl::~SFControl() { close(serverFD); pthread_mutex_destroy(&sfControlInfo.lock); pthread_cond_destroy(&sfControlInfo.cancel); } string SFControl::getHelpMessage(string msg) { stringstream helpMessage; if (msg == "help arguments") { // genral help message for command line arguments helpMessage << "sf - Controls (starting/stopping) several SFs on one machine" << endl << endl << "Usage : sf" << endl << "or : sf control-port PORT_NUMBER daemon" << endl << endl << "Arguments:" << endl << " control-port PORT_NUMBER : TCP port on which commands are accepted" << endl << " daemon : this switch (if present) makes sf aware that it may be running as a daemon " << endl << endl << "Info:" << endl << " If sf is started without arguments it listen on " << endl << " standard input for commands (for a list type \"help\" when sf is running)." << endl << " If it is started with a given control-port (e.g.: sf control-port 9009)" << endl << " sf listen on the given TCP control port _and_ the standard" << endl << " input." << endl; } else if (msg == "start") { helpMessage << ">> start PORT DEVICE_NAME BAUDRATE:" << endl << ">> Starts a sf-server on a given TCP port connecting to a given device with the given baudrate." << endl << ">> The TCP port device name must be specified and must not" << endl << ">> overlap with any other TCP port or device name pair of an already running sf-server." << endl << ">> (e.g: \"start 9002 /dev/ttyUSB2 115200\" starts server on port 9002 and device /dev/ttyUSB2 with baudrate 115200)" << endl; } else if (msg == "stop") { helpMessage << ">> stop ID | PORT | DEVICE_NAME:" << endl << ">> Stops the specified sf-server." << endl << ">> The unique id or the device or the TCP port of the" << endl << ">> sf-server must be specified." << endl << ">> (e.g: \"stop 1\" stops server with id 1 " << endl << ">> \"stop /dev/ttyUSB0\" stops server connected to /dev/ttyUSB0" << endl << ">> \"stop 9002\" prints stops server listening on TCPport 90002)" << endl; } else if (msg == "info") { helpMessage << ">> info ID | PORT | DEVICE_NAME:" << endl << ">> Prints some information about a given sf-server." << endl << ">> The unique id or the device or the TCP port of the" << endl << ">> sf-server must be specified." << endl << ">> (e.g: \"info 1\" prints out information about server with id 1 " << endl << ">> \"info /dev/ttyUSB0\" prints out information about server connected to /dev/ttyUSB0" << endl << ">> \"info 9002\" prints out information about server listening on TCPport 90002)" << endl; } else if (msg == "list") { helpMessage << ">> list:" << endl << ">> Displays a list of currently running sf-servers." << endl << ">> A List Entry contains the unique id, the TCP port and the device" << endl << ">> of a sf-server." << endl; } else if (msg == "close") { helpMessage << ">> close:" << endl << ">> Closes the TCP connection to the control client." << endl << ">> It can be issued only if the control-server is started."<< endl; } else if (msg == "exit") { helpMessage << ">> exit:" << endl << ">> Immediatly exits and kills all running sf-servers." << endl << ">> This ends everything gracefully..." << endl; } else { // genral help message for interactive commands helpMessage << ">> Supported commands are:" << endl << ">> " << endl << ">> start - starts a sf-server on a given port and device" << endl << ">> stop - stops a running sf-server" << endl << ">> list - lists all running sf-servers" << endl << ">> info - prints out some information about a given sf-server" << endl; if (controlServerStarted) { helpMessage << ">> close - closes the TCP connection to the control-client" << endl; } helpMessage << ">> exit - immediatly exits and kills all running sf-servers" << endl << ">>" << endl << ">> By typing \"help\" followd by a command (e.g.: \"help start\")" << endl << ">> detailed information about that command is printed." << endl; } return helpMessage.str(); } void SFControl::parseArgs(int argc, char *argv[]) { if (argc == 1) { os << ">> Starting sf-control." << endl; os << ">> Accepting commands on standard input..." << endl; deliverOutput(); // test standard port before } else if (argc >= 3) { int port = -1; string argPort(argv[2]); stringstream helpStream(argPort); helpStream >> port; if ((strncmp(argv[1], "control-port", 13) >= 0) && (port > 0)) { controlPort = port; startControlServer(); os << ">> Accepting commands on TCP port " << controlPort ; if(argc == 3) { os << " and on standard input..." << endl; daemon = false; } else { os << " but not on standard input..." << endl; daemon = true; } deliverOutput(); } else { os << getHelpMessage("help arguments"); deliverOutput(); exit(1); } } else { os << getHelpMessage("help arguments"); deliverOutput(); exit(1); } } /* starts a sf-server */ void SFControl::startServer(int port, string device, int baudrate) { pthread_testcancel(); pthread_mutex_lock(&sfControlInfo.lock); sfServer_t newSFServer; newSFServer.serial2tcp = new PacketBuffer(); newSFServer.tcp2serial = new PacketBuffer(); newSFServer.TcpServer = new TCPComm(port, *(newSFServer.tcp2serial), *(newSFServer.serial2tcp), sfControlInfo); newSFServer.SerialDevice = new SerialComm(device.c_str(), baudrate, *(newSFServer.serial2tcp), *(newSFServer.tcp2serial), sfControlInfo); newSFServer.id = ++uniqueId; servers.push_back(newSFServer); pthread_mutex_unlock(&sfControlInfo.lock); } /* stops a given sf-server. returns false if specified server not running */ bool SFControl::stopServer(int& id, int& port, string& device) { pthread_testcancel(); pthread_mutex_lock(&sfControlInfo.lock); bool found = false; list::iterator it = servers.begin(); list::iterator next = it; while( (it != servers.end()) && (!found)) { ++next; if (((*it).SerialDevice->getDevice() == device) || ((*it).TcpServer->getPort() == port) || ((*it).id == id) ) { // cancel (*it).TcpServer->cancel(); (*it).SerialDevice->cancel(); // set id, port and device accordingly id = (*it).id; port = (*it).TcpServer->getPort(); device = (*it).SerialDevice->getDevice(); // clean up delete (*it).TcpServer; delete (*it).SerialDevice; delete (*it).tcp2serial; delete (*it).serial2tcp; servers.erase(it); found = true; } it = next; } pthread_mutex_unlock(&sfControlInfo.lock); return found; } /* prints out server info for specified server */ bool SFControl::showServerInfo(ostream& pOs, int id, int port, string device) { pthread_testcancel(); pthread_mutex_lock(&sfControlInfo.lock); bool found = false; list::iterator it = servers.begin(); list::iterator next = it; while( it != servers.end() && (!found)) { ++next; if (((*it).SerialDevice->getDevice() == device) || ((*it).TcpServer->getPort() == port) || ((*it).id == id) ) { pOs << ">> info for sf-server with id = " << (*it).id << " ( port = " << (*it).TcpServer->getPort() << " , device = " << (*it).SerialDevice->getDevice() << " , baudrate = " << (*it).SerialDevice->getBaudRate() << " )" << endl; pOs << ">> "; (*it).TcpServer->reportStatus(os); pOs << ">> "; (*it).SerialDevice->reportStatus(os); found = true; } it = next; } pthread_mutex_unlock(&sfControlInfo.lock); return found; } /* lists all running servers */ void SFControl::listServers(ostream& pOs) { pthread_testcancel(); pthread_mutex_lock(&sfControlInfo.lock); list::iterator it = servers.begin(); for ( it = servers.begin(); it != servers.end(); it++ ) { pOs << ">> sf-server id = " << (*it).id << " , port = " << (*it).TcpServer->getPort() << " , device = " << (*it).SerialDevice->getDevice() << " , baudrate = " << (*it).SerialDevice->getBaudRate() << endl; } if (servers.size() == 0) { pOs << ">> none" << endl; } pthread_mutex_unlock(&sfControlInfo.lock); } void SFControl::parseInput(std::string arg) { /* silly, but works ... */ string strBuf; stringstream parseStream(arg); vector tokens; while (parseStream >> strBuf) tokens.push_back(strBuf); if (tokens[0] == "start") { if (tokens.size() == 4) { if (servers.size() < maxSFServers) { os << ">> Trying to start sf-server with id = " << (uniqueId+1) << " ( port = " << tokens[1] << " , device = " << tokens[2] << " , baudrate = " << tokens[3] << " )" << endl; deliverOutput(); stringstream helpInt; int baudrate = 0; int port = 0; helpInt << tokens[3] << " " << tokens[1]; helpInt >> baudrate >> port; startServer(port, tokens[2], baudrate); } else { os << ">> FAIL: Too many running servers (currently " << servers.size() << " servers running)" << endl; deliverOutput(); } } else { os << getHelpMessage("start"); deliverOutput(); } } else if (tokens[0] == "stop") { if (tokens.size() == 2) { stringstream helpInt; int port = 0; int id = -1; helpInt << tokens[1] << " " << tokens[1]; helpInt >> id >> port; if (!stopServer(id, port, tokens[1])) { os << ">> no sf-server with id / device / baudrate = " << tokens[1] << " found!" << endl; deliverOutput(); } else { os << ">> stopped sf-server with id = " << id << " ( port = " << port << " , device = " << tokens[1] << " )" << endl; deliverOutput(); } } else { os << getHelpMessage("stop"); deliverOutput(); } } else if (tokens[0] == "info") { if (tokens.size() == 2) { stringstream helpInt; int port = 0; int id = -1; helpInt << tokens[1] << " " << tokens[1]; helpInt >> id >> port; if (!showServerInfo(os, id, port, tokens[1])) { os << ">> no sf-server with id / device / baudrate = " << tokens[1] << " found!" << endl; deliverOutput(); } else { deliverOutput(); } } else { os << getHelpMessage("info"); deliverOutput(); } } else if ((tokens[0] == "close") && (controlServerStarted)) { if (clientFD > 0) { os << ">> closing connection to control-client " << endl; deliverOutput(); close(clientFD); clientFD = -1; } } else if (tokens[0] == "list") { os << ">> currently running sf-servers:" << endl; listServers(os); deliverOutput(); } else if (tokens[0] == "exit") { os << ">> exiting..." << endl; deliverOutput(); exit(0); } else { if ((tokens[0] == "help") && (tokens.size() == 2)) { os << getHelpMessage(tokens[1]); deliverOutput(); } else { os << getHelpMessage(tokens[0]); deliverOutput(); } } } /* send string to connected client.. */ bool SFControl::sendToClient(string message) { if (clientFD < 0) return false; int length = message.size(); const char* buffer = message.c_str(); while (length > 0) { #ifdef __APPLE__ int n = send(clientFD, buffer, length, 0); #else int n = send(clientFD, buffer, length, MSG_NOSIGNAL); #endif if (!(n > 0)) { return false; } length -= n; buffer += n; } return true; } /* receive string from connected client... */ bool SFControl::readFromClient(string& message) { if (clientFD < 0) return false; int length = 0; char buffer[256]; char* bufPtr = buffer; *bufPtr = '\0'; do { int n = read(clientFD, (void *) bufPtr, 1); if (!(n > 0)) { return false; } } while ((*bufPtr++ != '\n') && (length++ < 255)); buffer[length] = '\0'; message = (length == 1) ? "" : buffer; return true; } void SFControl::waitOnInput() { bool clientConnected = false; struct sockaddr_in client; socklen_t clientAddrLen = sizeof(client); FD_ZERO(&rfds); while (true) { int maxfd = 0; if(daemon) { FD_CLR(0, &rfds); } else { FD_SET(0, &rfds); } if (controlServerStarted) { FD_SET(serverFD, &rfds); maxfd = (serverFD > maxfd) ? serverFD : maxfd; } if (clientConnected) { FD_SET(clientFD, &rfds); maxfd = (clientFD > maxfd) ? clientFD : maxfd; } reportError("SFControl::waitOnInput : select(maxfd+1, &rfds, NULL, NULL, NULL)", select(maxfd+1, &rfds, NULL, NULL, NULL)); if (FD_ISSET(0, &rfds)) { /* parse standard input */ FD_CLR(0, &rfds); string input = ""; getline (cin, input); if (input != "") { os << "standard input : " << input << endl; if (!(clientFD < 0)) sendToClient(os.str()); os.str(""); os.clear(); parseInput(input); } } if (clientFD == -1) clientConnected = false; if (controlServerStarted) { if (FD_ISSET(serverFD, &rfds)) { /* we got a new connection request */ FD_CLR(serverFD, &rfds); int newClientFD = reportError("SFControl::waitOnInput : accept(serverFD, (struct sockaddr*) &client, &clientAddrLen)", accept(serverFD, (struct sockaddr*) &client, &clientAddrLen)); if ((newClientFD >= 0) && (!clientConnected)) { clientFD = newClientFD; clientConnected = true; os << ">> accepted connection from control-client " << inet_ntoa(client.sin_addr) << endl; deliverOutput(); } else { close(newClientFD); } } } if (clientConnected) { if (FD_ISSET(clientFD, &rfds)) { /* we got data from the connected control client */ FD_CLR(clientFD, &rfds); string input = ""; if (readFromClient(input)) { if (input != "") { os << "control-client : " << input << endl; cout << os.str(); os.str(""); os.clear(); parseInput(input); } } else { os << ">> closing connection to control-client " << inet_ntoa(client.sin_addr) << endl; deliverOutput(); close(clientFD); clientFD = -1; } } } if (clientFD == -1) clientConnected = false; } } void* checkCancelThread(void* ob) { static_cast(ob)->checkThreadCancel(); return NULL; } /* keeps track of self-canceled sf-servers */ void SFControl::checkThreadCancel() { while(true) { pthread_testcancel(); pthread_mutex_lock(&sfControlInfo.lock); pthread_cond_wait(&sfControlInfo.cancel, &sfControlInfo.lock); list::iterator it = servers.begin(); list::iterator next = it; while( it != servers.end() ) { ++next; if ((*it).TcpServer->isErrorReported() || (*it).SerialDevice->isErrorReported()) { // cancel (*it).TcpServer->cancel(); (*it).SerialDevice->cancel(); // inform user os << ">> FAIL: sf-server with id = " << (*it).id << " ( port = " << (*it).TcpServer->getPort() << " , device = " << (*it).SerialDevice->getDevice() << " ) canceled" << endl; deliverOutput(); // clean up delete (*it).TcpServer; delete (*it).SerialDevice; delete (*it).tcp2serial; delete (*it).serial2tcp; servers.erase(it); } it = next; } pthread_mutex_unlock(&sfControlInfo.lock); } } void SFControl::startControlServer() { struct sockaddr_in me; int opt = 1; serverFD = reportError("SFControl::startControlServer : socket(AF_INET, SOCK_STREAM, 0)", socket(AF_INET, SOCK_STREAM, 0)); reportError("SFControl::startControlServer : fcntl(serverFD, F_SETFL, O_NONBLOCK)", fcntl(serverFD, F_SETFL, O_NONBLOCK)); memset(&me, 0, sizeof me); me.sin_family = AF_INET; me.sin_port = htons(controlPort); reportError("SFControl::startControlServer : setsockopt(serverFD, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt))", setsockopt(serverFD, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt))); reportError("SFControl::startControlServer : bind(serverFD, (struct sockaddr *)&me, sizeof me)", bind(serverFD, (struct sockaddr *)&me, sizeof me)); reportError("SFControl::startControlServer : listen(serverFD, 1)", listen(serverFD, 1)); controlServerStarted = true; } void SFControl::deliverOutput() { if (!(clientFD < 0)) sendToClient(os.str()); cout << os.str(); os.str(""); os.clear(); } /* reports error */ int SFControl::reportError(const char *msg, int result) { if (result < 0) { cerr << "FATAL : SF-Control-Server : " << msg << " ( result = " << result << " )" << endl << "error-description : " << strerror(errno) << endl; exit(1); } return result; } tinyos-2.1.2+dfsg/support/sdk/cpp/sf/sfcontrol.h000066400000000000000000000104621207233610700216350ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #ifndef SFCONTROL_H #define SFCONTROL_H #include "stdio.h" #include "packetbuffer.h" #include "tcpcomm.h" #include "serialcomm.h" #include "pthread.h" #include #include class SFControl { protected: typedef struct { PacketBuffer* serial2tcp; PacketBuffer* tcp2serial; TCPComm* TcpServer; SerialComm* SerialDevice; int id; } sfServer_t; /* needed to get informed about canceled threads */ sharedControlInfo_t sfControlInfo; /* list of running / started sf-servers */ std::list servers; /* max. allowed sf-servers */ static const unsigned int maxSFServers = 512; /* pthread for thread cancel notification */ pthread_t cancelThread; /* read fd set */ fd_set rfds; /* write fd set */ fd_set wfds; /* indicated that the control server is started */ bool controlServerStarted; /* in daemon mode: do not read from stdin */ bool daemon; /* tcp port the control server listens on */ int controlPort; /* control server FD */ int serverFD; /* control-client fd */ int clientFD; /* string stream for multiplexing output (cout and control-client) */ std::ostringstream os; friend void* checkCancelThread(void* ob); /* needed for id generation */ int uniqueId; public: SFControl(); ~SFControl(); /* gets corresponding help message to command */ std::string getHelpMessage(std::string msg = ""); /* parses command line arguments */ void parseArgs(int argc, char *argv[]); /* parses input */ void parseInput(std::string arg); /* main loop, waits for input */ void waitOnInput(); protected: /* checks if child threads canceled themselves */ void checkThreadCancel(); /* starts the controling server */ void startControlServer(); /* send string to connected client.. */ bool sendToClient(std::string message); /* receive string from connected client... */ bool readFromClient(std::string& message); /* starts a sf-server */ void startServer(int port, std::string device, int baudrate); /* stops a given sf-server. returns false if specified server not running */ bool stopServer(int& id, int& port, std::string& device); /* prints out server info for specified server */ bool showServerInfo(std::ostream& pOs, int id, int port, std::string device); /* lists all running servers */ void listServers(std::ostream& pOs); /* send output to console and/or to connected control client */ void deliverOutput(); /* reports error to stderr */ int reportError(const char *msg, int result); }; #endif tinyos-2.1.2+dfsg/support/sdk/cpp/sf/sfpacket.cpp000066400000000000000000000071771207233610700217700ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #include "sfpacket.h" #include SFPacket::SFPacket(int pType, int pSeqno) { length = 0; seqno = pSeqno; type = pType; } // copy constructor SFPacket::SFPacket(const SFPacket &pPacket) { length = pPacket.getLength(); type = pPacket.getType(); seqno = pPacket.getSeqno(); setPayload(pPacket.getPayload(), length); } SFPacket::~SFPacket() { // if (buffer) delete[] buffer; } const char* SFPacket::getPayload() const { if(((type == SF_PACKET_ACK) || (type == SF_PACKET_NO_ACK))) { return buffer + 1; } else { return NULL; } } int SFPacket::getLength() const { return length; } int SFPacket::getType() const { return type; } int SFPacket::getSeqno() const { return seqno; } bool SFPacket::setPayload(const char* pBuffer, uint8_t pLength) { if ((pLength > 0) && (pLength < cMaxPacketLength) && ((type == SF_PACKET_ACK) || (type == SF_PACKET_NO_ACK))) { length = pLength; memcpy(buffer + 1, pBuffer, pLength); return true; } DEBUG("SFPACKET::setPayload : wrong packet length = " << static_cast(pLength) << " or type = " << type) return false; } void SFPacket::setSeqno(int pSeqno) { seqno = pSeqno; } void SFPacket::setType(int pType) { type = pType; } int const SFPacket::getMaxPayloadLength() { return cMaxPacketLength; } /* == operator */ bool SFPacket::operator==(SFPacket const& pPacket) { bool retval=false; if((pPacket.getType() == type) && (pPacket.getLength() == length) && (pPacket.getSeqno() == seqno)) { if((type == SF_PACKET_ACK) || (type == SF_PACKET_NO_ACK)) { retval = (memcmp(pPacket.getPayload(), getPayload(), length) == 0); } } return retval; } /* return the length that shall be transmitted via TCP */ int SFPacket::getTcpLength() const { return length + 1; } /* return the payload of the TCP packet */ const char* SFPacket::getTcpPayload() { char l = length; buffer[0] = l; return buffer; } tinyos-2.1.2+dfsg/support/sdk/cpp/sf/sfpacket.h000066400000000000000000000067561207233610700214370ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #ifndef SFPACKET_H #define SFPACKET_H // #define DEBUG_SFPACKET #undef DEBUG #ifdef DEBUG_SFPACKET #include #define DEBUG(message) std::cout << message << std::endl; #else #define DEBUG(message) #endif #include #include #include "serialprotocol.h" enum { SYNC_BYTE = SERIAL_HDLC_FLAG_BYTE, ESCAPE_BYTE = SERIAL_HDLC_CTLESC_BYTE, SF_ACK = SERIAL_SERIAL_PROTO_ACK, SF_PACKET_ACK = SERIAL_SERIAL_PROTO_PACKET_ACK, SF_PACKET_NO_ACK = SERIAL_SERIAL_PROTO_PACKET_NOACK, SF_UNKNOWN = SERIAL_SERIAL_PROTO_PACKET_UNKNOWN }; class SFPacket{ public: /* max packet length in bytes */ static const int cMaxPacketLength = 256; /** member vars **/ protected: /* internal buffer */ char buffer[cMaxPacketLength + 1]; /* length of byte buffer */ int length; /* type */ int type; /* sequence number */ int seqno; /** member functions **/ protected: public: SFPacket(int type = SF_PACKET_ACK, int pSeqno = 0); ~SFPacket(); SFPacket(const SFPacket &pPacket); /* returns buffer */ const char* getPayload() const; /* returns length of buffer */ int getLength() const; /* return the length that shall be transmitted via TCP */ int getTcpLength() const; /* return the payload of the TCP packet */ const char* getTcpPayload(); /* returns the seqno of this packet */ int getSeqno() const; /* returns type of packet */ int getType() const; /* sets buffer and length and constructs frame (incl crc) */ bool setPayload(const char* pBuffer, uint8_t pLength); /* sets the seqno */ void setSeqno(int pSeqno); /* sets the type */ void setType(int pType); /* returns max payload length */ static const int getMaxPayloadLength(); /* == operator */ bool operator==(SFPacket const& pPacket); }; #endif tinyos-2.1.2+dfsg/support/sdk/cpp/sf/sharedinfo.h000066400000000000000000000036501207233610700217470ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #ifndef SHAREDINFO_H #define SHAREDINFO_H #include "pthread.h" typedef struct { /* mutex to protect *Comm objects */ pthread_mutex_t lock; /* condition that object is canceled*/ pthread_cond_t cancel; } sharedControlInfo_t; #endif tinyos-2.1.2+dfsg/support/sdk/cpp/sf/tcpcomm.cpp000066400000000000000000000425401207233610700216230ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #include "sharedinfo.h" #include "tcpcomm.h" #include "sfpacket.h" #include "stdio.h" #include #include #include #include #include #include #include #include #include #include using namespace std; /* forward declarations of pthrad helper functions*/ void* checkClientsThread(void*); void* readClientsThread(void*); void* writeClientsThread(void*); /* opens tcp server port for listening and start threads*/ TCPComm::TCPComm(int pPort, PacketBuffer &pReadBuffer, PacketBuffer &pWriteBuffer, sharedControlInfo_t& pControl) : readBuffer(pReadBuffer), writeBuffer(pWriteBuffer), errorReported(false), errorMsg(""), control(pControl) { // init values writerThreadRunning = false; readerThreadRunning = false; serverThreadRunning = false; clientInfo.count = 0; clientInfo.FDs.clear(); readPacketCount = 0; writtenPacketCount = 0; port = pPort; pthread_mutex_init(&clientInfo.sleeplock, NULL); pthread_mutex_init(&clientInfo.countlock, NULL); pthread_cond_init(&clientInfo.wakeup, NULL); struct sockaddr_in me; int opt; int rxBuf = 1024; /* create pipe to inform client reader of new clients */ if (!errorReported) { int pipeFDPair[2]; reportError("TCPComm::TCPComm : pipe(pipeFDPair)", pipe(pipeFDPair)); pipeWriteFD = pipeFDPair[1]; pipeReadFD = pipeFDPair[0]; } if (!errorReported) { reportError("TCPComm::TCPComm : fcntl(pipeReadFD, F_SETFL, O_NONBLOCK);", fcntl(pipeReadFD, F_SETFL, O_NONBLOCK)); } /* create server socket where clients connect */ if (!errorReported) { serverFD = reportError("TCPComm::TCPComm : socket(AF_INET, SOCK_STREAM, 0)", socket(AF_INET, SOCK_STREAM, 0)); } memset(&me, 0, sizeof me); me.sin_family = AF_INET; me.sin_port = htons(port); opt = 1; if (!errorReported) { reportError("TCPComm::TCPComm : setsockopt(serverFD, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt))", setsockopt(serverFD, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt))); } if (!errorReported) { reportError("TCPComm::TCPComm : setsockopt(serverFD, SOL_SOCKET, SO_RCVBUF, (char *)&rxBuf, sizeof(rxBuf))", setsockopt(serverFD, SOL_SOCKET, SO_RCVBUF, (char *)&rxBuf, sizeof(rxBuf))); } if (!errorReported) { reportError("TCPComm::TCPComm : bind(serverFD, (struct sockaddr *)&me, sizeof me)", bind(serverFD, (struct sockaddr *)&me, sizeof me)); } if (!errorReported) { reportError("TCPComm::TCPComm : listen(serverFD, 5)", listen(serverFD, 5)); } // start thread for server socket (adding and removing clients) if (!errorReported) { if (reportError("TCPComm::TCPComm : pthread_create( &serverThread, NULL, checkClientsThread, this)", pthread_create( &serverThread, NULL, checkClientsThread, this)) == 0) { serverThreadRunning = true; } // start thread for reading from client connections if (reportError("TCPComm::TCPComm : pthread_create( &readerThread, NULL, readClientsThread, this)", pthread_create( &readerThread, NULL, readClientsThread, this)) == 0) { readerThreadRunning = true; } // start thread for writing to client connections if (reportError("TCPComm::TCPComm : pthread_create( &writerThread, NULL, writeClientsThread, this)", pthread_create( &writerThread, NULL, writeClientsThread, this)) == 0) { writerThreadRunning = true; } } } TCPComm::~TCPComm() { cancel(); close(serverFD); set::iterator it; for( it = clientInfo.FDs.begin(); it != clientInfo.FDs.end(); it++ ) { close(*it); } close(pipeWriteFD); close(pipeReadFD); pthread_mutex_destroy(&clientInfo.sleeplock); pthread_mutex_destroy(&clientInfo.countlock); pthread_cond_destroy(&clientInfo.wakeup); } int TCPComm::getPort() { return port; } /* reads packet */ bool TCPComm::readPacket(int pFD, SFPacket &pPacket) { char l; char* buffer[SFPacket::getMaxPayloadLength()]; int err; if (readFD(pFD, &l, 1, &err) != 1) { return false; } if (l > SFPacket::getMaxPayloadLength()) { return false; } if (readFD(pFD, (char*) buffer, static_cast(l), &err) != l) { return false; } if (pPacket.setPayload((char*)buffer ,l)) { return true; } else { return false; } } int TCPComm::writeFD(int fd, const char *buffer, int count, int *err) { int actual = 0; while (count > 0) { #ifdef __APPLE__ int n = send(fd, buffer, count, 0); #else int n = send(fd, buffer, count, MSG_NOSIGNAL); #endif if (n == -1) { *err = errno; return -1; } count -= n; actual += n; buffer += n; } return actual; } /* writes packet */ bool TCPComm::writePacket(int pFD, SFPacket &pPacket) { int len = pPacket.getTcpLength(); int err; return (writeFD(pFD, pPacket.getTcpPayload(), len, &err) == len); } /* checks for correct version of SF protocol */ bool TCPComm::versionCheck(int clientFD) { char check[2], us[2]; int version; int err = 0; /* Indicate version and check if a TinyOS 2.0 serial forwarder on the other end */ us[0] = 'U'; us[1] = ' '; if (writeFD(clientFD, us, 2, &err) != 2) { return false; } if (readFD(clientFD, check, 2, &err) != 2) { return false; } if (check[0] != 'U') { return false; } version = check[1]; if (us[1] < version) { version = us[1]; } /* Add other cases here for later protocol versions */ switch (version) { case ' ': break; default: return false; } return true; } /* adds a client to the client list and wakes up all threads */ void TCPComm::addClient(int clientFD) { DEBUG("TCPComm::addClient : lock") pthread_testcancel(); pthread_mutex_lock( &clientInfo.countlock ); bool wakeupClientThreads = false; if (clientInfo.count == 0) { wakeupClientThreads = true; } ++clientInfo.count; clientInfo.FDs.insert(clientFD); if (wakeupClientThreads) { pthread_cond_broadcast( &clientInfo.wakeup ); } pthread_mutex_unlock( &clientInfo.countlock ); stuffPipe(); DEBUG("TCPComm::addClient : unlock") } void TCPComm::removeClient(int clientFD) { DEBUG("TCPComm::removeClient : lock") pthread_testcancel(); pthread_mutex_lock( &clientInfo.countlock ); if (clientInfo.count > 0) { clientInfo.FDs.erase(clientFD); if (close(clientFD) != 0) { DEBUG("TCPComm::removeClient : error closing fd " << clientFD) } else { --clientInfo.count; } } if (clientInfo.count == 0) { // clear write buffer writeBuffer.clear(); } pthread_mutex_unlock( &clientInfo.countlock ); stuffPipe(); DEBUG("TCPComm::removeClient : unlock") } /* helper function to start server pthread */ void* checkClientsThread(void* ob) { static_cast(ob)->connectClients(); return NULL; } /* checks for new connected clients */ void TCPComm::connectClients() { while (true) { int clientFD = accept(serverFD, NULL, NULL); pthread_testcancel(); if (clientFD >= 0) { if (versionCheck(clientFD)) { addClient(clientFD); } else { close(clientFD); } } else { pthread_testcancel(); cancel(); } } } /* helper function to start client reader pthread */ void* readClientsThread(void* ob) { static_cast(ob)->readClients(); return NULL; } /* reads from connected clients */ void TCPComm::readClients() { FD_t clientFDs; while (true) { pthread_cleanup_push((void(*)(void*)) pthread_mutex_unlock, (void *) &clientInfo.countlock); pthread_mutex_lock( &clientInfo.countlock ); while( clientInfo.count == 0 ) { // do nothing when no client is connected... DEBUG("TCPComm::readClients : sleeping reader thread") pthread_cond_wait( &clientInfo.wakeup, &clientInfo.countlock ); } // copy set in to temp set clientFDs = clientInfo.FDs; // removes the cleanup handler and executes it (unlock mutex) pthread_cleanup_pop(1); // check all fds (work with temp set)... fd_set rfds; FD_ZERO(&rfds); int maxFD = pipeReadFD; FD_SET(pipeReadFD, &rfds); set::iterator it; for( it = clientFDs.begin(); it != clientFDs.end(); it++ ) { if (*it > maxFD) { maxFD = *it; } FD_SET(*it, &rfds); } if (select(maxFD + 1, &rfds, NULL, NULL, NULL) < 0 ) { // run = false; reportError("TCPComm::readClients : select(maxFD+1, &rfds, NULL, NULL, NULL)", -1); } else { if(FD_ISSET(pipeReadFD, &rfds)) { clearPipe(); } for (it = clientFDs.begin(); it != clientFDs.end(); it++) { if (FD_ISSET(*it, &rfds)) { SFPacket packet; if(readPacket(*it, packet)) { // this call blocks until buffer is not full readBuffer.enqueueBack(packet); ++readPacketCount; } else { DEBUG("TCPComm::readClients : removeClient") removeClient(*it); } } } } } } /* helper function to start client writer pthread */ void* writeClientsThread(void* ob) { static_cast(ob)->writeClients(); return NULL; } /* writes to connected clients */ void TCPComm::writeClients() { FD_t clientFDs; while (true) { pthread_cleanup_push((void(*)(void*)) pthread_mutex_unlock, (void *) &clientInfo.countlock); pthread_mutex_lock( &clientInfo.countlock ); while( clientInfo.count == 0 ) { // do nothing when no client is connected... DEBUG("TCPComm::writeClients : sleeping writer thread") pthread_cond_wait( &clientInfo.wakeup, &clientInfo.countlock ); } // removes the cleanup handler and executes it (unlock mutex) pthread_cleanup_pop(1); // blocks until buffer is not empty SFPacket packet = writeBuffer.dequeue(); pthread_testcancel(); pthread_mutex_lock( &clientInfo.countlock ); // copy client fd set into temp set clientFDs = clientInfo.FDs; pthread_mutex_unlock( &clientInfo.countlock ); // check all fds (work with temp set)... set::iterator it; // duplicate and send out packet to all connected clients for( it = clientFDs.begin(); it != clientFDs.end(); it++ ) { if (writePacket(*it, packet)) { ++writtenPacketCount; } else { DEBUG("TCPComm::writeClients : removeClient") removeClient(*it); } } } } /* cancels all running threads */ void TCPComm::cancel() { pthread_t callingThread = pthread_self(); if (pthread_equal(callingThread, readerThread)) { DEBUG("TCPComm::cancel : by readerThread") pthread_detach(readerThread); if (writerThreadRunning) { pthread_cancel(writerThread); DEBUG("TCPComm::cancel : writerThread canceled, joining") pthread_join(writerThread, NULL); writerThreadRunning = false; } if (serverThreadRunning) { pthread_cancel(serverThread); DEBUG("TCPComm::cancel : serverThread canceled, joining") pthread_join(serverThread, NULL); serverThreadRunning = false; } readerThreadRunning = false; pthread_cond_signal(&control.cancel); pthread_exit(NULL); } else if (pthread_equal(callingThread, writerThread)) { DEBUG("TCPComm::cancel : by writerThread") pthread_detach(writerThread); if (readerThreadRunning) { pthread_cancel(readerThread); DEBUG("TCPComm::cancel : readerThread canceled, joining") pthread_join(readerThread, NULL); readerThreadRunning = false; } if (serverThreadRunning) { pthread_cancel(serverThread); DEBUG("TCPComm::cancel : serverThread canceled, joining") pthread_join(serverThread, NULL); serverThreadRunning = false; } writerThreadRunning = false; pthread_cond_signal(&control.cancel); pthread_exit(NULL); } else if (pthread_equal(callingThread, serverThread)) { DEBUG("TCPComm::cancel : by serverThread") pthread_detach(serverThread); if (readerThreadRunning) { pthread_cancel(readerThread); DEBUG("TCPComm::cancel : readerThread canceled, joining") pthread_join(readerThread, NULL); readerThreadRunning = false; } if (writerThreadRunning) { pthread_cancel(writerThread); DEBUG("TCPComm::cancel : writerThread canceled, joining") pthread_join(writerThread, NULL); writerThreadRunning = false; } serverThreadRunning = false; pthread_cond_signal(&control.cancel); pthread_exit(NULL); } else { DEBUG("TCPComm::cancel : by other thread") if (serverThreadRunning) { pthread_cancel(serverThread); DEBUG("TCPComm::cancel : serverThread canceled, joining") pthread_join(serverThread, NULL); serverThreadRunning = false; } if (writerThreadRunning) { pthread_cancel(writerThread); DEBUG("TCPComm::cancel : writerThread canceled, joining") pthread_join(writerThread, NULL); writerThreadRunning = false; } if (readerThreadRunning) { pthread_cancel(readerThread); DEBUG("TCPComm::cancel : readerThread canceled, joining") pthread_join(readerThread, NULL); readerThreadRunning = false; } pthread_cond_signal(&control.cancel); } } /* reports error */ int TCPComm::reportError(const char *msg, int result) { if ((result < 0) && (!errorReported)) { errorMsg << "error : SF-Server (TCPComm on port = " << port << ") : " << msg << " ( result = " << result << " )" << endl << "error-description : " << strerror(errno) << endl; cerr << errorMsg.str(); errorReported = true; cancel(); } return result; } /* prints out status */ void TCPComm::reportStatus(ostream& os) { os << "SF-Server ( TCPComm on port " << port << " )" << " : clients = " << clientInfo.count << " , packets read = " << readPacketCount << " , packets written = " << writtenPacketCount << endl; } void TCPComm::stuffPipe() { char info = 'n'; if(write(pipeWriteFD, &info, 1) != 1) DEBUG("TCPComm::stuffPipe : lokal pipe is broken"); } void TCPComm::clearPipe() { char buf; while(read(pipeReadFD, &buf, 1) > 0) { ; } } tinyos-2.1.2+dfsg/support/sdk/cpp/sf/tcpcomm.h000066400000000000000000000130271207233610700212660ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philipp Huppertz */ #ifndef TCPCOMM_H #define TCPCOMM_H #include "sfpacket.h" #include "packetbuffer.h" #include "basecomm.h" #include "sharedinfo.h" #include #include #include #include // #define DEBUG_TCPCOMM #undef DEBUG #ifdef DEBUG_TCPCOMM #include #define DEBUG(message) std::cout << message << std::endl; #else #define DEBUG(message) #endif class TCPComm : public BaseComm { /** Member vars */ protected: /* pthread for tcp client connection handling */ pthread_t serverThread; bool serverThreadRunning; /* pthread for tcp client reading */ pthread_t readerThread; bool readerThreadRunning; /* pthread for tcp client writing */ pthread_t writerThread; bool writerThreadRunning; typedef std::set FD_t; // thread safe shared info about connected clients typedef struct { /* mutex to protect clientCount and clientFDs */ pthread_mutex_t countlock; /* mutex to protect wakeup condiation */ pthread_mutex_t sleeplock; /* wakeup condition which is siganled if clients are connected */ pthread_cond_t wakeup; /* number of connected clients */ int count; /* container for client stuff */ FD_t FDs; } sharedClientInfo_t; /* information about clients */ sharedClientInfo_t clientInfo; /* number of read packets */ int readPacketCount; /* number of written packets */ int writtenPacketCount; /* port of this sf */ int port; /* file descriptor for server port on local machine */ int serverFD; /* pipe fd pair to inform client reader thread of new clients */ int pipeWriteFD; int pipeReadFD; /* reference to read packet buffer */ PacketBuffer &readBuffer; /* reference to write packet buffer */ PacketBuffer &writeBuffer; /* indicates that an error occured */ bool errorReported; /* error message of reportError call */ std::ostringstream errorMsg; /* for noticing the parent thread of cancelation */ sharedControlInfo_t &control; /** Member functions */ /* needed to start pthreads */ friend void* checkClientsThread(void* ob); friend void* readClientsThread(void* ob); friend void* writeClientsThread(void* ob); private: /* disable standard constructor */ TCPComm(); protected: /* performs blocking write on fd */ virtual int writeFD(int fd, const char *buffer, int count, int *err); /* checks SF client protocol version */ bool versionCheck(int clientFD); /* reads packet */ bool readPacket(int pFD, SFPacket &pPacket); /* writes packet */ bool writePacket(int pFD, SFPacket &pPacket); /* adds client to the list */ void addClient(int clientFD); /* removes client from the list */ void removeClient(int clientFD); /* checks for connecting clients - main thread for connection handling */ void connectClients(); /* checks for messages from the clients - producer thread */ void readClients(); /* write messages to clients (duplicate) - consumer thread */ void writeClients(); /* reports error to stderr */ int reportError(const char *msg, int result); /* write something into pipe to wake up client readerThread */ void stuffPipe(); /* remove data written into pipe */ void clearPipe(); public: /* create SF TCP server - init and start threads */ TCPComm(int pPort, PacketBuffer &pReadBuffer, PacketBuffer &pWriteBuffer, sharedControlInfo_t& pControl); /* wait for threads, close fds and cleanup */ ~TCPComm(); /* cancels all running threads */ void cancel(); /* returns the TCP/IP port of this sf server */ int getPort(); /* reports status info to stdout */ void reportStatus(std::ostream& os); /* returns if error occurred */ bool isErrorReported() { return errorReported; } }; #endif tinyos-2.1.2+dfsg/support/sdk/java/000077500000000000000000000000001207233610700171775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/java/Makefile000066400000000000000000000006601207233610700206410ustar00rootroot00000000000000# Top-level Makefile for tools/java SUBDIRS = net JAVADOCDIR = ../../../doc/javadoc ROOT = . include $(ROOT)/Makefile.include tinyos.jar: all rm -f tinyos.jar @# create the jar, as update requires it to exist. we use a @# .class file we assume always exists find . | grep -E "class|jpg|gif" | xargs jar cf tinyos.jar javadoc: all rm -rf $(JAVADOCDIR) mkdir -p $(JAVADOCDIR) javadoc -d $(JAVADOCDIR) `find -name *.java` tinyos-2.1.2+dfsg/support/sdk/java/Makefile.include000066400000000000000000000052761207233610700222730ustar00rootroot00000000000000#-*-makefile-*- ###################################################################### # # Contains the shared make rules for the tools/java tree. # # In each directory, create a Makefile that includes the lines # ROOT = # include $(ROOT)/Makefile.include # # By default the Makefile will compile all .java source code in the # current directory. You may also specify the following flags in # your Makefile, *before* including Makefile.include: # # SUBDIRS = dir1 dir2 ... # Specify a list of subdirectories that 'make' should descend into # # INITIAL_TARGETS = target1 target2 ... # Specify build targets to be compiled before compiling Java classes # # FINAL_TARGETS = target1 target2 ... # Specify build targets to be compiled after compiling Java classes # # OTHER_CLEAN = target1 target2 ... # Specify other targets to be executed when 'make clean' is run # # NOTE: this Makefile requires GNU make, as well as a number of # standard UNIX shell tools. # ###################################################################### SRC = $(wildcard *.java) JAVA = $(SRC) CLASSES = $(JAVA:.java=.class) all: here subdirs $(FINAL_TARGETS) # figure out useful variables PWD = $(shell pwd) # set compiler command ifeq ($(JAVAC)_x, _x) JAVAC = javac endif # general rule for java files %.class: %.java $(JAVAC) $< ifeq ($(SUBDIRS)_x, _x) subdirs: here subdirs-clean: here-clean else subdirs: here @for i in $(SUBDIRS); do \ if [ -d $$i ]; then \ if [ -f $$i/Makefile ]; then \ $(MAKE) -C $$i; \ else \ echo "***" no Makefile in directory: $(PWD)/$$i; \ fi \ else \ echo "***" skipping missing directory: $(PWD)/$$i; \ fi; \ done subdirs-clean: here-clean @for i in $(SUBDIRS); do \ if [ -d $$i ]; then \ if [ -f $$i/Makefile ]; then \ $(MAKE) -C $$i clean; \ else \ echo "***" no Makefile in directory: $(PWD)/$$i; \ fi \ else \ echo "***" skipping missing directory: $$i; \ fi; \ done subdirs-install: @for i in $(INSTALLDIRS); do \ if [ -d $$i ]; then \ if [ -f $$i/Makefile ]; then \ $(MAKE) -C $$i install; \ else \ echo "***" no Makefile in directory: $(PWD)/$$i; \ fi \ else \ echo "***" skipping missing directory: $$i; \ fi; \ done endif here: printdir $(INITIAL_TARGETS) $(JAVA) $(CLASSES) FORCE printdir: @echo "... $(PWD)"; here-clean: FORCE @rm -f *.class *~ javacore*.txt @echo "cleaning $(PWD)" clean: here-clean subdirs-clean $(OTHER_CLEAN) install: subdirs-install # some phony targets - FORCE forces a command to be run on all dependencies, # and .PHONY prevents badness if a phony target coincides with a filename FORCE: .PHONY: all $(SUBDIRS) $(SUBDIRSCLEAN) clean tinyos-2.1.2+dfsg/support/sdk/java/build.xml000066400000000000000000000042701207233610700210230ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/support/sdk/java/net/000077500000000000000000000000001207233610700177655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/java/net/Makefile000066400000000000000000000001431207233610700214230ustar00rootroot00000000000000# Top-level Makefile for tools/java SUBDIRS = tinyos ROOT = .. include $(ROOT)/Makefile.include tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/000077500000000000000000000000001207233610700213125ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/Makefile000066400000000000000000000004511207233610700227520ustar00rootroot00000000000000# Top-level Makefile for tools/java # We do all subdirectories (to allow for optional package installation) SUBDIRS = packet message sf $(shell find . -maxdepth 1 -type d | tail -n +2 | grep -v /CVS | grep -v packet | grep -v message | grep -v sf) ROOT = ../.. include $(ROOT)/Makefile.include tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/comm/000077500000000000000000000000001207233610700222455ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/comm/ByteQueue.java000066400000000000000000000065411207233610700250260ustar00rootroot00000000000000//$Id: ByteQueue.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ //@author Cory Sharp package net.tinyos.comm; public class ByteQueue { byte buffer[]; int nbegin; int nend; int num_free_back() { return buffer.length - nend; } void left_justify_into( byte dest[] ) { for( int i=nbegin,j=0; i 0 ) return ((int)buffer[nbegin++]) & 255; return -1; } public int pop_front( byte b[] ) { return pop_front( b, 0, b.length ); } public int pop_front( byte b[], int off, int len ) { int n = available(); if( n > len ) n = len; int bend = off + len; while( off < bend ) b[off++] = buffer[nbegin++]; return n; } public ByteQueue() { this(64); } public ByteQueue( int initial_buffer_length ) { buffer = new byte[ initial_buffer_length ]; nbegin = 0; nend = 0; } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/comm/Makefile000066400000000000000000000001271207233610700237050ustar00rootroot00000000000000# Top-level Makefile for tools/java ROOT = ../../.. include $(ROOT)/Makefile.include tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/comm/NativeSerial.java000066400000000000000000000115531207233610700255030ustar00rootroot00000000000000package net.tinyos.comm; /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version: 1.3.21 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ /** * Updated to include the open() method, which allows us to keep this object * while being temporarily disconnected from the serial port */ public class NativeSerial { /** The handle to the serial port we're connected to */ protected long swigCPtr; /** True if we have an open serial port connection */ protected boolean swigCMemOwn; /** Name of the port */ private String myPortname = ""; /** * Constructor * * @param portname */ public NativeSerial(String portname) { this(TOSCommJNI.new_NativeSerial(portname), true); } /** * Constructor * * @param cPtr * @param cMemoryOwn */ private NativeSerial(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } /** * Reconnect to this serial port * * @return true if the connection is made */ public boolean open() { if (!swigCMemOwn && !myPortname.matches("")) { swigCPtr = TOSCommJNI.new_NativeSerial(myPortname); swigCMemOwn = true; return true; } return false; } public void close() { // We can come here with swigCptr == 0 from finalize if the C++ // constructor throws an exception. Ideally, we should guard all // methods in the C++ code, but this is simpler. if (swigCPtr != 0) { TOSCommJNI.NativeSerial_close(swigCPtr); } } protected NativeSerial() { this(0, false); } protected void finalize() { delete(); } public void delete() { if (swigCPtr != 0 && swigCMemOwn) { swigCMemOwn = false; TOSCommJNI.delete_NativeSerial(swigCPtr); } swigCPtr = 0; } protected static long getCPtr(NativeSerial obj) { return (obj == null) ? 0 : obj.swigCPtr; } public void setSerialPortParams(int baudrate, int databits, int stopbits, boolean parity) { TOSCommJNI.NativeSerial_setSerialPortParams(swigCPtr, baudrate, databits, stopbits, parity); } public int getBaudRate() { return TOSCommJNI.NativeSerial_getBaudRate(swigCPtr); } public int getDataBits() { return TOSCommJNI.NativeSerial_getDataBits(swigCPtr); } public int getStopBits() { return TOSCommJNI.NativeSerial_getStopBits(swigCPtr); } public boolean getParity() { return TOSCommJNI.NativeSerial_getParity(swigCPtr); } public void notifyOn(int event, boolean enable) { if (swigCPtr != 0) { TOSCommJNI.NativeSerial_notifyOn(swigCPtr, event, enable); } } public boolean isNotifyOn(int event) { return TOSCommJNI.NativeSerial_isNotifyOn(swigCPtr, event); } public boolean waitForEvent() { if (swigCPtr != 0) { try { return TOSCommJNI.NativeSerial_waitForEvent(swigCPtr); } catch (Exception e) { return false; } } return false; } public boolean cancelWait() { if (swigCPtr != 0) { return TOSCommJNI.NativeSerial_cancelWait(swigCPtr); } return false; } public boolean didEventOccur(int event) { return TOSCommJNI.NativeSerial_didEventOccur(swigCPtr, event); } public void setDTR(boolean high) { TOSCommJNI.NativeSerial_setDTR(swigCPtr, high); } public void setRTS(boolean high) { TOSCommJNI.NativeSerial_setRTS(swigCPtr, high); } public boolean isDTR() { return TOSCommJNI.NativeSerial_isDTR(swigCPtr); } public boolean isRTS() { return TOSCommJNI.NativeSerial_isRTS(swigCPtr); } public boolean isCTS() { return TOSCommJNI.NativeSerial_isCTS(swigCPtr); } public boolean isDSR() { return TOSCommJNI.NativeSerial_isDSR(swigCPtr); } public boolean isRI() { return TOSCommJNI.NativeSerial_isRI(swigCPtr); } public boolean isCD() { return TOSCommJNI.NativeSerial_isCD(swigCPtr); } public void sendBreak(int millis) { TOSCommJNI.NativeSerial_sendBreak(swigCPtr, millis); } public int available() { try { return TOSCommJNI.NativeSerial_available(swigCPtr); } catch (Exception e) { return 0; } } public int read() { return TOSCommJNI.NativeSerial_read__SWIG_0(swigCPtr); } public int read(byte[] buffer_out, int off, int len) { return TOSCommJNI.NativeSerial_read__SWIG_1(swigCPtr, buffer_out, off, len); } public int write(int b) { return TOSCommJNI.NativeSerial_write__SWIG_0(swigCPtr, b); } public int write(byte[] buffer_in, int off, int len) { return TOSCommJNI.NativeSerial_write__SWIG_1(swigCPtr, buffer_in, off, len); } public static String getTOSCommMap() { return TOSCommJNI.NativeSerial_getTOSCommMap(); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/comm/SerialPort.java000066400000000000000000000062571207233610700252060ustar00rootroot00000000000000//$Id: SerialPort.java,v 1.6 2010-06-29 22:07:41 scipio Exp $ package net.tinyos.comm; /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ //@author Cory Sharp import java.io.*; public interface SerialPort { public static final int STOPBITS_1 = 1; public static final int STOPBITS_2 = 2; public static final int STOPBITS_1_5 = 3; /* public static final int FLOWCONTROL_NONE = 0; public static final int FLOWCONTROL_RTSCTS_IN = 1; public static final int FLOWCONTROL_RTSCTS_OUT = 2; public static final int FLOWCONTROL_XONXOFF_IN = 4; public static final int FLOWCONTROL_XONXOFF_OUT = 8; */ public InputStream getInputStream() throws IOException; public OutputStream getOutputStream() throws IOException; public boolean open(); public void close(); public void finalize(); public void setSerialPortParams( int baudrate, int dataBits, int stopBits, boolean parity ) throws UnsupportedCommOperationException; public int getBaudRate(); public int getDataBits(); public int getStopBits(); public boolean getParity(); public void sendBreak( int millis ); /* public void setFlowControlMode( int flowcontrol ) throws UnsupportedCommOperationException; public int getFlowControlMode(); */ public void setDTR( boolean dtr ); public void setRTS( boolean rts ); public boolean isDTR(); public boolean isRTS(); public boolean isCTS(); public boolean isDSR(); public boolean isRI(); public boolean isCD(); public void addListener( SerialPortListener l ); public void removeListener( SerialPortListener l ); public void notifyOn( int serialEvent, boolean enable ); } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/comm/SerialPortEvent.java000066400000000000000000000047621207233610700262070ustar00rootroot00000000000000//$Id: SerialPortEvent.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ //@author Cory Sharp package net.tinyos.comm; public class SerialPortEvent extends java.util.EventObject { public final static int DATA_AVAILABLE = (1<<0); public final static int OUTPUT_EMPTY = (1<<1); public final static int CTS = (1<<2); public final static int DSR = (1<<3); public final static int RING_INDICATOR = (1<<4); public final static int CARRIER_DETECT = (1<<5); public final static int OVERRUN_ERROR = (1<<6); public final static int PARITY_ERROR = (1<<7); public final static int FRAMING_ERROR = (1<<8); public final static int BREAK_INTERRUPT = (1<<9); public SerialPort port; int eventType; public SerialPortEvent( SerialPort _port, int _eventType ) { super(_port); port = _port; eventType = _eventType; } public int getEventType() { return eventType; } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/comm/SerialPortListener.java000066400000000000000000000034771207233610700267150ustar00rootroot00000000000000//$Id: SerialPortListener.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ //@author Cory Sharp package net.tinyos.comm; public interface SerialPortListener { public void serialEvent( SerialPortEvent ev ); } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/comm/TOSCommJNI.java000066400000000000000000000051731207233610700247400ustar00rootroot00000000000000package net.tinyos.comm; /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version: 1.3.21 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ class TOSCommJNI { static { net.tinyos.util.TOSLibraryLoader.load("toscomm"); } public final static native void NativeSerial_setSerialPortParams(long jarg1, int jarg2, int jarg3, int jarg4, boolean jarg5); public final static native int NativeSerial_getBaudRate(long jarg1); public final static native int NativeSerial_getDataBits(long jarg1); public final static native int NativeSerial_getStopBits(long jarg1); public final static native boolean NativeSerial_getParity(long jarg1); public final static native void NativeSerial_notifyOn(long jarg1, int jarg2, boolean jarg3); public final static native boolean NativeSerial_isNotifyOn(long jarg1, int jarg2); public final static native boolean NativeSerial_waitForEvent(long jarg1); public final static native boolean NativeSerial_cancelWait(long jarg1); public final static native boolean NativeSerial_didEventOccur(long jarg1, int jarg2); public final static native void NativeSerial_setDTR(long jarg1, boolean jarg2); public final static native void NativeSerial_setRTS(long jarg1, boolean jarg2); public final static native boolean NativeSerial_isDTR(long jarg1); public final static native boolean NativeSerial_isRTS(long jarg1); public final static native boolean NativeSerial_isCTS(long jarg1); public final static native boolean NativeSerial_isDSR(long jarg1); public final static native boolean NativeSerial_isRI(long jarg1); public final static native boolean NativeSerial_isCD(long jarg1); public final static native void NativeSerial_sendBreak(long jarg1, int jarg2); public final static native long new_NativeSerial(String jarg1); public final static native void delete_NativeSerial(long jarg1); public final static native void NativeSerial_close(long jarg1); public final static native int NativeSerial_available(long jarg1); public final static native int NativeSerial_read__SWIG_0(long jarg1); public final static native int NativeSerial_read__SWIG_1(long jarg1, byte[] jarg2, int jarg3, int jarg4); public final static native int NativeSerial_write__SWIG_0(long jarg1, int jarg2); public final static native int NativeSerial_write__SWIG_1(long jarg1, byte[] jarg2, int jarg3, int jarg4); public final static native String NativeSerial_getTOSCommMap(); } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/comm/TOSSerial.java000066400000000000000000000244441207233610700247250ustar00rootroot00000000000000//$Id: TOSSerial.java,v 1.7 2010-06-29 22:07:41 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ //@author Cory Sharp package net.tinyos.comm; import java.io.*; import java.util.*; import java.util.regex.*; public class TOSSerial extends NativeSerial implements SerialPort { /** * Inner Class to handle serial event dispatching * */ class EventDispatcher extends Thread { private boolean m_run; /** * Constructor * */ public EventDispatcher() { m_run = false; } /** * Start waiting for events * */ public void open() { m_run = true; if( ! this.isAlive() ) this.start(); } /** * Stop waiting for events * Here's the deal: we're running a thread here that is calling * a function waitForEvent() in the toscomm driver. We're now waiting for * two events: DATA_AVAILABLE and OUTPUT_EMPTY. If you call cancelWait(), * nothing happens until the waitForEvent() returns by getting an event * anyway, so if our node isn't generating bytes on its own, we need to * force it to make an event so we can get out of that function to avoid * a driver crash. * * Previously, it never returned because there were no events. Now we * make an event by adding notifyOn(OUTPUT_EMPTY) and then writing a * standard 0x7E sync byte to the serial port and let it tell us that * an event occured. * * When the waitForEvent() function finally exits, we are then able to * tell it, "Oh yea, while you're at it, cancelWait()". Finally, the * EventDispatcher is in a state where the driver is not sitting around * waiting for an event to occur. At that point, we can shut down the * NativeSerial by calling super.close() elsewhere. * * As far as I can tell, this is the only way to make this work without * modifying the actual toscomm driver. * * The only other trick I can see to this is sometimes you can't connect * immediately after you disconnect.. I added a wait(500) after a disconnect * more toward my application layer to prevent my app from trying to * reconnect immediately. My JUnit tests, for example, disconnect and * reconnect very rapidly as you would expect. */ public void close() { m_run = false; while (this.isAlive()) { write(0x7E); cancelWait(); try { synchronized(this) { // Wait for the waitForEvent() done event, if it doesn't work after // 100 ms, then we try generating that OUTPUT_EMPTY event again. wait(100); } } catch (InterruptedException e) { e.printStackTrace(); } } } /** * Dispatch the event if it really occured * * @param event */ private void dispatch_event(int event) { if (didEventOccur(event)) { SerialPortEvent ev = new SerialPortEvent(TOSSerial.this, event); synchronized (m_listeners) { Iterator i = m_listeners.iterator(); while (i.hasNext()) ((SerialPortListener) i.next()).serialEvent(ev); } } } public void run() { while (m_run) { if (waitForEvent()) { dispatch_event(SerialPortEvent.DATA_AVAILABLE); dispatch_event(SerialPortEvent.OUTPUT_EMPTY); } } // wake up the closing thread synchronized(this) { this.notify(); } } } /** * Inner Serial Input Stream Class * */ class SerialInputStream extends InputStream { ByteQueue bq = new ByteQueue(128); protected void gather() { int navail = TOSSerial.this.available(); if (navail > 0) { byte buffer[] = new byte[navail]; bq.push_back(buffer, 0, TOSSerial.this.read(buffer, 0, navail)); } } public int read() { gather(); return bq.pop_front(); } public int read(byte[] b) { gather(); return bq.pop_front(b); } public int read(byte[] b, int off, int len) { gather(); return bq.pop_front(b, off, len); } public int available() { gather(); return bq.available(); } } /** * Inner Serial Output Stream Class * */ class SerialOutputStream extends OutputStream { public void write(int b) { TOSSerial.this.write(b); } public void write(byte[] b) { TOSSerial.this.write(b, 0, b.length); } public void write(byte[] b, int off, int len) { int nwritten = 0; while (nwritten < len) nwritten += TOSSerial.this.write(b, nwritten, len - nwritten); } } private SerialInputStream m_in; private SerialOutputStream m_out; private Vector m_listeners = new Vector(); private EventDispatcher m_dispatch; static String map_portname(String mapstr, String portname) { // mapstr is of the form "from1=to1:from2=to2" // If "from", "to", and "portname" all end port numbers, then the ports in // "from" and "to" are used as a bias for the port in "portname", appended // to the "to" string (without its original terminating digits). If more // than one port mapping matches, the one with the smallest non-negative // port number wins. // For instance, if // mapstr="com1=COM1:com10=\\.\COM10" // then // com1 => COM1 // com3 => COM3 // com10 => \\.\COM10 // com12 => \\.\COM12 // or if // mapstr="com1=/dev/ttyS0:usb1=/dev/ttyS100" // then // com1 => /dev/ttyS0 // com3 => /dev/ttyS2 // usb1 => /dev/ttyS100 // usb3 => /dev/ttyS102 String maps[] = mapstr.split(":"); Pattern pkv = Pattern.compile("(.*?)=(.*?)"); Pattern pnum = Pattern.compile("(.*\\D)(\\d+)"); Matcher mport = pnum.matcher(portname); int match_distance = -1; String str_port_to = null; for (int i = 0; i < maps.length; i++) { Matcher mkv = pkv.matcher(maps[i]); if (mkv.matches()) { Matcher mfrom = pnum.matcher(mkv.group(1)); Matcher mto = pnum.matcher(mkv.group(2)); if (mfrom.matches() && mto.matches() && mport.matches() && mfrom.group(1).equalsIgnoreCase(mport.group(1))) { int nfrom = Integer.parseInt(mfrom.group(2)); int nto = Integer.parseInt(mto.group(2)); int nport_from = Integer.parseInt(mport.group(2)); int nport_to = nport_from - nfrom + nto; int ndist = nport_from - nfrom; if ((ndist >= 0) && ((ndist < match_distance) || (match_distance == -1))) { match_distance = ndist; str_port_to = mto.group(1) + nport_to; } } else if (mkv.group(1).equalsIgnoreCase(portname)) { match_distance = 0; str_port_to = mkv.group(2); } } } return (str_port_to == null) ? portname : str_port_to; } /** * Real Constructor of TOSSerial * * @param portname */ public TOSSerial(String portname) { super(map_portname(NativeSerial.getTOSCommMap(), portname)); m_in = new SerialInputStream(); m_out = new SerialOutputStream(); m_dispatch = new EventDispatcher(); m_dispatch.open(); } /** * Open the serial port connection */ public boolean open() { if (m_dispatch != null) { m_dispatch.open(); } return super.open(); } /** * Close the serial port connection */ public void close() { if (m_dispatch != null) { m_dispatch.close(); } super.close(); } public void addListener(SerialPortListener l) { synchronized (m_listeners) { if (!m_listeners.contains(l)) m_listeners.add(l); } } public void removeListener(SerialPortListener l) { synchronized (m_listeners) { m_listeners.remove(l); } } public InputStream getInputStream() { return m_in; } public OutputStream getOutputStream() { return m_out; } /** * Finalize the serial port connection, do not expect to open it again */ public void finalize() { // Be careful what you call here. The object may never have been // created, so the underlying C++ object may not exist, and there's // insufficient guarding to avoid a core dump. If you call other // methods than super.close() or super.finalize(), be sure to // add an if (swigCptr != 0) guard in NativeSerial.java. if (m_dispatch != null) { m_dispatch.close(); } /* * try { if (m_dispatch != null) { m_dispatch.join(); } } catch * (InterruptedException e) { } */ super.close(); try { if (m_in != null) { m_in.close(); } if (m_out != null) { m_out.close(); } } catch (IOException e) { } m_dispatch = null; m_in = null; m_out = null; super.finalize(); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/comm/UnsupportedCommOperationException.java000066400000000000000000000037161207233610700320230ustar00rootroot00000000000000//$Id: UnsupportedCommOperationException.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ //@author Cory Sharp package net.tinyos.comm; public class UnsupportedCommOperationException extends Exception { public UnsupportedCommOperationException(String str) { super(str); } public UnsupportedCommOperationException() { super(); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/comm/package.html000066400000000000000000000017111207233610700245260ustar00rootroot00000000000000 Provides the Java half of JNI interfaces to serial ports.

    Package Specification

    Related Documentation

    For how to this package is used to communicate with motes, please see: tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/message/000077500000000000000000000000001207233610700227365ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/message/Makefile000066400000000000000000000005511207233610700243770ustar00rootroot00000000000000# Top-level Makefile for tools/java INITIAL_TARGETS = SerialPacket.class SerialPacket.java ROOT = ../../.. include $(ROOT)/Makefile.include TOS=$(shell ncc -print-tosdir) SERIAL_H = $(TOSDIR)/lib/serial/Serial.h SerialPacket.java: $(SERIAL_H) FORCE mig -o $@ -java-classname=net.tinyos.message.SerialPacket java $(SERIAL_H) serial_packet -I$(TOSDIR)/types tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/message/Message.java000066400000000000000000000510271207233610700251720ustar00rootroot00000000000000// $Id: Message.java,v 1.7 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* Authors: David Gay * Intel Research Berkeley Lab * */ /** * Message class (encode/decode tinyos messages).

    * * The base class for encoding and decoding tinyos messages. Provides * methods to read and write bit fields at an offset for a particular bit * length. Intended for use by the Java code generated by mig. * * @version 1, 15 Jul 2002 * @author David Gay * @author David Gay * @author Intel Research Berkeley Lab */ package net.tinyos.message; public class Message implements Cloneable { /** * The maximum number of characters read from an 8-bit array field being * converted into a Java String. */ public static final int MAX_CONVERTED_STRING_LENGTH = 512; /** * The underlying byte array storing the data for this message. This is * private to enforce access to the data through the accessor methods in this * class, which do bounds checking and manage the base_offset for embedded * messages. */ private byte[] data; /** * The base offset into the data. This allows the message data to exist at * some non-zero offset into the actual data. */ protected int base_offset; /** * The actual length of the message data. Must be less than or equal to * (data.length - base_offset). */ protected int data_length; /** * The AM type corresponding to this object. Set to -1 if no AM type is known. */ protected int am_type; /** The serial packet this message originated from */ private SerialPacket serialPacket; /** Limit no-arg instantiation. */ protected Message() { } /** * Construct a new message of the given size. * * @param data_length * The size of the message to create. */ public Message(int data_length) { init(data_length); } public void init(int data_length) { init(new byte[data_length]); } /** * Construct a new message of the given size and base offset. Allocates a new * byte array of size data_length+base_offset. * * @param data_length * The size of the message to create. * @param base_offset * The base offset into the newly created message. */ public Message(int data_length, int base_offset) { init(data_length, base_offset); } protected void init(int data_length, int base_offset) { init(new byte[data_length + base_offset], base_offset); } /** * Construct a message using data as the storage. The length of data * determines the length of this message. * * @param data * the storage for this message */ public Message(byte[] data) { init(data); } protected void init(byte[] data) { init(data, 0); } /** * Construct a message using data as the storage. Use the given base_offset as * the base offset into the data array. The data length will be (data.length - * base_offset). * * @param data * the storage for this message * @param base_offset * the base offset into the data array */ public Message(byte[] data, int base_offset) { init(data, base_offset); } protected void init(byte[] data, int base_offset) { init(data, base_offset, data.length - base_offset); } /** * Construct a message using data as the storage. Use the given base_offset as * the base offset into the data array, and the specified data length. * * @param data * the storage for this message * @param base_offset * the base offset into the data array * @param data_length * the length of the message data */ public Message(byte[] data, int base_offset, int data_length) { init(data, base_offset, data_length); } protected void init(byte[] data, int base_offset, int data_length) { this.data = data; this.base_offset = base_offset; this.data_length = data_length; if (base_offset + data_length > data.length) throw new ArrayIndexOutOfBoundsException( "Cannot create Message with base_offset " + base_offset + ", data_length " + data_length + " and data array size " + data.length); } /** * Construct an embedded message within the given 'msg'. Use the given * base_offset as the base offset into the data array, and the specified data * length. * * @param msg * the message to embed this message into * @param base_offset * the base offset into the data array * @param data_length * the length of the message data */ public Message(Message msg, int base_offset, int data_length) { init(msg, base_offset, data_length); } protected void init(Message msg, int base_offset, int data_length) { init(msg.dataGet(), msg.base_offset + base_offset, data_length); } private Message cloneself() { Message copy; try { copy = (Message) super.clone(); } catch (CloneNotSupportedException e) { System.err .println("Message: WARNING: CloneNotSupportedException in cloneself(): " + e); System.err .println("Message: This is a bug - please contact dgay@intel-research.net"); copy = null; System.exit(2); } return copy; } /** * Clone this Message, including making a copy of its data */ public Object clone() { Message copy = cloneself(); copy.init((byte[]) data.clone(), base_offset, data_length); copy.am_type = this.am_type; return copy; } /** * Clone this Message, but give it a new unitialised data array of size size * * @param size * size of the new data array */ public Message clone(int size) { Message copy = cloneself(); copy.init(new byte[size], 0, size); copy.am_type = this.am_type; return copy; } /** * Copy new data for this message from 'data'. Copies min(data.length, * this.data_length) bytes. * * @param data * the array containing the data to be copied * @exception ArrayIndexOutOfBoundsException * if any of data[0..getData().length - 1] are invalid */ public void dataSet(byte[] data) { dataSet(data, 0, this.base_offset, Math.min(this.data_length, data.length)); } /** * Copy new data for this message from offsetFrom in data to offsetTo in this * message. Copies a total of length bytes * * @param data * the array containing the data to be copied * @param offsetFrom * the offset in data to start copying from * @param offsetTo * the offset at which to start copying data into this message. * @param length * bytes are copied. * @exception ArrayIndexOutOfBoundsException * if any of the source or target indices are invalid */ public void dataSet(byte[] data, int offsetFrom, int offsetTo, int length) { System.arraycopy(data, offsetFrom, this.data, offsetTo + base_offset, length); } /** * Copy new data for this message from the raw data in msg to offsetTo in this * message. Copies a total of msg.dataLength() bytes * * @param msg * the message containing the data to be copied * @param offsetTo * the offset at which to start copying data into this message. * @exception ArrayIndexOutOfBoundsException * if any of the target indices are invalid */ public void dataSet(Message msg, int offsetTo) { System.arraycopy(msg.dataGet(), msg.baseOffset(), this.data, offsetTo + base_offset, msg.dataLength()); } /** * Return the raw byte array representing the data of this message. Note that * only indices in the range (this.baseOffset(), * this.baseOffset()+this.dataLength()) are valid. */ public byte[] dataGet() { return data; } /** * Return the base offset into the data array for this message. */ public int baseOffset() { return base_offset; } /** * Return the length of the data (in bytes) contained in this message. */ public int dataLength() { return data_length; } /** * Return the active message type of this message (-1 if unknown) */ public int amType() { return am_type; } /** * Set the active message type of this message */ public void amTypeSet(int type) { this.am_type = type; } // Check that length bits from offset are in bounds private void checkBounds(int offset, int length) { if (offset < 0 || length <= 0 || offset + length > (data_length * 8)) throw new ArrayIndexOutOfBoundsException( "Message.checkBounds: bad offset (" + offset + ") or length (" + length + "), for data_length " + data_length + " in class " + this.getClass()); } // Check that value is valid for a bitfield of length length private void checkValue(int length, long value) { if (length != 64 && (value < 0 || value >= 1L << length)) throw new IllegalArgumentException("Message.checkValue: bad length (" + length + " or value (" + value + ")"); } // Unsigned byte read private int ubyte(int offset) { int val = data[base_offset + offset]; if (val < 0) return val + 256; else return val; } // ASSUMES: little endian bits & bytes for the methods without BE, and // big endian bits & bytes for the methods with BE /** * Read the length bit unsigned little-endian int at offset * * @param offset * bit offset where the unsigned int starts * @param length * bit length of the unsigned int * @exception ArrayIndexOutOfBoundsException * for invalid offset, length */ protected long getUIntElement(int offset, int length) { checkBounds(offset, length); int byteOffset = offset >> 3; int bitOffset = offset & 7; int shift = 0; long val = 0; // all in one byte case if (length + bitOffset <= 8) return (ubyte(byteOffset) >> bitOffset) & ((1 << length) - 1); // get some high order bits if (bitOffset > 0) { val = ubyte(byteOffset) >> bitOffset; byteOffset++; shift += 8 - bitOffset; length -= 8 - bitOffset; } while (length >= 8) { val |= (long) ubyte(byteOffset++) << shift; shift += 8; length -= 8; } // data from last byte if (length > 0) val |= (long) (ubyte(byteOffset) & ((1 << length) - 1)) << shift; return val; } /** * Set the length bit unsigned little-endian int at offset to val * * @param offset * bit offset where the unsigned int starts * @param length * bit length of the unsigned int * @param val * value to set the bit field to * @exception ArrayIndexOutOfBoundsException * for invalid offset, length * @exception IllegalArgumentException * if val is an out-of-range value for this bitfield */ protected void setUIntElement(int offset, int length, long val) { checkBounds(offset, length); // checkValue(length, val); int byteOffset = offset >> 3; int bitOffset = offset & 7; int shift = 0; // all in one byte case if (length + bitOffset <= 8) { data[base_offset + byteOffset] = (byte) ((ubyte(byteOffset) & ~(((1 << length) - 1) << bitOffset)) | val << bitOffset); return; } // set some high order bits if (bitOffset > 0) { data[base_offset + byteOffset] = (byte) ((ubyte(byteOffset) & ((1 << bitOffset) - 1)) | val << bitOffset); byteOffset++; shift += 8 - bitOffset; length -= 8 - bitOffset; } while (length >= 8) { data[base_offset + (byteOffset++)] = (byte) (val >> shift); shift += 8; length -= 8; } // data for last byte if (length > 0) data[base_offset + byteOffset] = (byte) ((ubyte(byteOffset) & ~((1 << length) - 1)) | val >> shift); } /** * Read the length bit signed little-endian int at offset * * @param offset * bit offset where the signed int starts * @param length * bit length of the signed int * @exception ArrayIndexOutOfBoundsException * for invalid offset, length */ protected long getSIntElement(int offset, int length) throws ArrayIndexOutOfBoundsException { long val = getUIntElement(offset, length); if (length == 64) return val; if ((val & 1L << (length - 1)) != 0) return val - (1L << length); return val; } /** * Set the length bit signed little-endian int at offset to val * * @param offset * bit offset where the signed int starts * @param length * bit length of the signed int * @param value * value to set the bit field to * @exception ArrayIndexOutOfBoundsException * for invalid offset, length * @exception IllegalArgumentException * if val is an out-of-range value for this bitfield */ protected void setSIntElement(int offset, int length, long value) throws ArrayIndexOutOfBoundsException { if (length != 64 && value >= 1L << (length - 1)) throw new IllegalArgumentException(); if (length != 64 && value < 0) value += 1L << length; setUIntElement(offset, length, value); } /** * Read the length bit unsigned big-endian int at offset * * @param offset * bit offset where the unsigned int starts. Note that these are * big-endian bit offsets: bit 0 is the MSB, bit 7 the LSB. * @param length * bit length of the unsigned int * @exception ArrayIndexOutOfBoundsException * for invalid offset, length */ protected long getUIntBEElement(int offset, int length) { checkBounds(offset, length); int byteOffset = offset >> 3; int bitOffset = offset & 7; long val = 0; // All in one byte case if (length + bitOffset <= 8) return (ubyte(byteOffset) >> (8 - bitOffset - length)) & ((1 << length) - 1); // get some high order bits if (bitOffset > 0) { length -= 8 - bitOffset; val = (long) (ubyte(byteOffset) & ((1 << (8 - bitOffset)) - 1)) << length; byteOffset++; } while (length >= 8) { length -= 8; val |= (long) ubyte(byteOffset++) << length; } // data from last byte if (length > 0) val |= ubyte(byteOffset) >> (8 - length); return val; } /** * Set the length bit unsigned big-endian int at offset to val * * @param offset * bit offset where the unsigned int starts. Note that these are * big-endian bit offsets: bit 0 is the MSB, bit 7 the LSB. * @param length * bit length of the unsigned int * @param val * value to set the bit field to * @exception ArrayIndexOutOfBoundsException * for invalid offset, length * @exception IllegalArgumentException * if val is an out-of-range value for this bitfield */ protected void setUIntBEElement(int offset, int length, long val) { checkBounds(offset, length); // checkValue(length, val); int byteOffset = offset >> 3; int bitOffset = offset & 7; // all in one byte case if (length + bitOffset <= 8) { int mask = ((1 << length) - 1) << (8 - bitOffset - length); data[base_offset + byteOffset] = (byte) ((ubyte(byteOffset) & ~mask) | val << (8 - bitOffset - length)); return; } // set some high order bits if (bitOffset > 0) { int mask = (1 << (8 - bitOffset)) - 1; length -= 8 - bitOffset; data[base_offset + byteOffset] = (byte) (ubyte(byteOffset) & ~mask | val >> length); byteOffset++; } while (length >= 8) { length -= 8; data[base_offset + (byteOffset++)] = (byte) (val >> length); } // data for last byte if (length > 0) { int mask = (1 << (8 - length)) - 1; data[base_offset + byteOffset] = (byte) ((ubyte(byteOffset) & mask) | val << (8 - length)); } } /** * Read the length bit signed big-endian int at offset * * @param offset * bit offset where the signed int starts * @param length * bit length of the signed int * @exception ArrayIndexOutOfBoundsException * for invalid offset, length */ protected long getSIntBEElement(int offset, int length) throws ArrayIndexOutOfBoundsException { long val = getUIntBEElement(offset, length); if (length == 64) return val; if ((val & 1L << (length - 1)) != 0) return val - (1L << length); return val; } /** * Set the length bit signed big-endian int at offset to val * * @param offset * bit offset where the signed int starts * @param length * bit length of the signed int * @param value * value to set the bit field to * @exception ArrayIndexOutOfBoundsException * for invalid offset, length * @exception IllegalArgumentException * if val is an out-of-range value for this bitfield */ protected void setSIntBEElement(int offset, int length, long value) throws ArrayIndexOutOfBoundsException { if (length != 64 && value >= 1L << (length - 1)) throw new IllegalArgumentException(); if (length != 64 && value < 0) value += 1L << length; setUIntBEElement(offset, length, value); } /** * Read the 32 bit IEEE float at offset * * @param offset * bit offset where the float starts * @param length * is ignored * @exception ArrayIndexOutOfBoundsException * for invalid offset */ protected float getFloatElement(int offset, int length) throws ArrayIndexOutOfBoundsException { return Float.intBitsToFloat((int) getUIntElement(offset, 32)); } /** * Set the 32 bit IEEE float at offset to value * * @param offset * bit offset where the float starts * @param length * is ignored * @param value * value to store in bitfield * @exception ArrayIndexOutOfBoundsException * for invalid offset */ protected void setFloatElement(int offset, int length, float value) throws ArrayIndexOutOfBoundsException { // using SInt because floatToRawIntBits might return a negative value setSIntElement(offset, 32, Float.floatToRawIntBits(value)); } /** * * @return the SerialPacket this message originated from, if it was set * externally */ public SerialPacket getSerialPacket() { return serialPacket; } /** * * @param mySerialPacket the SerialPacket this message originated from */ protected void setSerialPacket(SerialPacket mySerialPacket) { serialPacket = mySerialPacket; } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/message/MessageListener.java000066400000000000000000000054431207233610700267010ustar00rootroot00000000000000// $Id: MessageListener.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* Authors: David Gay * Intel Research Berkeley Lab * */ /** * @author David Gay * @author Intel Research Berkeley Lab */ package net.tinyos.message; /** * MessageListener interface (listen to tinyos messages).

    * * An interface for listening to messages built from * net.tinyos.message.Message * * @version 1, 15 Jul 2002 * @author David Gay */ public interface MessageListener { /** * This method is called to signal message reception. The destination of * message m is to. * @param to the destination of the message (Note: to is only valid * when using TOSBase base stations) * @param m the received message */ public void messageReceived(int to, Message m); } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/message/MoteIF.java000066400000000000000000000150651207233610700247330ustar00rootroot00000000000000// $Id: MoteIF.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* Authors: David Gay * Intel Research Berkeley Lab * */ /** * @author David Gay * @author Intel Research Berkeley Lab */ package net.tinyos.message; import net.tinyos.util.*; import net.tinyos.packet.*; import java.io.*; /** * MoteIF provides an application-level Java interface for receiving * messages from, and sending messages to, a mote through a serial port, * TCP connection, or some other means of connectivity. Generally this * is used to write Java programs that connect over a TCP or serial port * to communicate with a TOSBase or GenericBase mote. * * The default way to use MoteIF is to create an instance of this class * and then register one or more MessageListener objects that will * be invoked when messages arrive. For example: *

     *   MoteIF mif = new MoteIF();
     *   mif.registerListener(new FooMsg(), this);
     *   
     *   // Invoked when a message arrives
     *   public void messageReceived(int toaddr, Message msg) { ... }
     * 
    * The default MoteIF constructor uses the MOTECOM environment * variable to determine how the Java application connects to the mote. * For example, a MOTECOM setting of "serial@COM1" connects to a base * station using the serial port on COM1. * * You can also send messages through the base station mote using * MoteIF.send(). * * @see net.tinyos.packet.BuildSource * @author David Gay */ public class MoteIF { /** The destination address for a broadcast. */ public static final int TOS_BCAST_ADDR = 0xffff; protected PhoenixSource source; protected Sender sender; protected Receiver receiver; /** * Create a new mote interface to packet source specified using the * MOTECOM environment variable. Status and error messages will * be printed to System.err. */ public MoteIF() { init(BuildSource.makePhoenix(net.tinyos.util.PrintStreamMessenger.err)); } /** * Create a new mote interface to packet source specified using the * MOTECOM environment variable. Status and error messages will * be printed to 'messages'. * * @param messages where to send status messages (null means no messages) */ public MoteIF(Messenger messages) { init(BuildSource.makePhoenix(messages)); } /** * Create a new mote interface to an arbitrary packet source. The * packet source is started if necessary. * * @param source packet source to use */ public MoteIF(PhoenixSource source) { init(source); } /**********************************************************************/ private void init(PhoenixSource source) { this.source = source; // Start source if it isn't started yet try { source.start(); } catch (IllegalThreadStateException e) { } try { source.awaitStartup(); } catch (IOException e) { e.printStackTrace(); } receiver = new Receiver(source); sender = new Sender(source); } /** * @return this MoteIF's source */ public PhoenixSource getSource() { return source; } /** * Send m to moteId via this mote interface * @param moteId message destination * @param m message * @exception IOException thrown if message could not be sent */ synchronized public void send(int moteId, Message m) throws IOException { sender.send(moteId, m); } /** * Register a listener for given messages type. The message m should be * an instance of a subclass of Message (generated by mig). When a * message of the corresponding type is received, a new instance of m's * class is created with the received message as data. This message is * then passed to the given MessageListener. * * Note that multiple MessageListeners can be registered for the same * message type, and in fact each listener can use a different template * type if it wishes (the only requirement is that m.getType() matches * the received message). * * @param m message template specifying which message to receive * @param l listener to which received messages are dispatched */ synchronized public void registerListener(Message m, MessageListener l) { receiver.registerListener(m, l); } /** * Deregister a listener for a given message type. * @param m message template specifying which message to receive * @param l listener to which received messages are dispatched */ synchronized public void deregisterListener(Message m, MessageListener l) { receiver.deregisterListener(m, l); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/message/Receiver.java000066400000000000000000000163731207233610700253570ustar00rootroot00000000000000// $Id: Receiver.java,v 1.6 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* Authors: David Gay * Intel Research Berkeley Lab * */ /** * @author David Gay * @author Intel Research Berkeley Lab */ package net.tinyos.message; import net.tinyos.util.*; import net.tinyos.packet.*; import java.util.*; /** * Receiver class (receive tinyos messages). * * A receiver class provides a simple interface built on Message for receiving * tinyos messages from a SerialForwarder * * @version 1, 15 Jul 2002 * @author David Gay */ public class Receiver implements PacketListenerIF { public static final boolean DEBUG = false; public static final boolean DISPLAY_ERROR_MSGS = true; Hashtable templateTbl; // Mapping from AM type to msgTemplate PhoenixSource source; /** * Inner class representing a single MessageListener and its associated * Message template. */ class msgTemplate { Message template; MessageListener listener; msgTemplate(Message template, MessageListener listener) { this.template = template; this.listener = listener; } public boolean equals(Object o) { try { msgTemplate mt = (msgTemplate) o; if (mt.template.getClass().equals(this.template.getClass()) && mt.listener.equals(this.listener)) { return true; } } catch (Exception e) { return false; } return false; } public int hashCode() { return listener.hashCode(); } } /** * Create a receiver messages from forwarder of any group id and of active * message type m.getType() When such a message is received, a new instance of * m's class is created with the received data and send to * listener.messageReceived * * @param forwarder * packet source to listen to */ public Receiver(PhoenixSource forwarder) { this.templateTbl = new Hashtable(); this.source = forwarder; forwarder.registerPacketListener(this); } /** * Register a particular listener for a particular message type. More than one * listener can be registered for each message type. * * @param template * specify message type and template we're listening for * @param listener * destination for received messages */ public void registerListener(Message template, MessageListener listener) { Integer amType = new Integer(template.amType()); Vector vec = (Vector) templateTbl.get(amType); if (vec == null) { vec = new Vector(); } vec.addElement(new msgTemplate(template, listener)); templateTbl.put(amType, vec); } /** * Stop listening for messages of the given type with the given listener. * * @param template * specify message type and template we're listening for * @param listener * destination for received messages */ public void deregisterListener(Message template, MessageListener listener) { Integer amType = new Integer(template.amType()); Vector vec = (Vector) templateTbl.get(amType); if (vec == null) { throw new IllegalArgumentException( "No listeners registered for message type " + template.getClass().getName() + " (AM type " + template.amType() + ")"); } msgTemplate mt = new msgTemplate(template, listener); // Remove all occurrences while (vec.removeElement(mt)) ; if (vec.size() == 0) templateTbl.remove(amType); } private void error(msgTemplate temp, String msg) { System.err.println("receive error for " + temp.template.getClass().getName() + " (AM type " + temp.template.amType() + "): " + msg); } public void packetReceived(byte[] packet) { if (DEBUG) Dump.dump("Received message", packet); if (packet[0] != Serial.TOS_SERIAL_ACTIVE_MESSAGE_ID) return; // not for us. SerialPacket msg = new SerialPacket(packet, 1); Integer type = new Integer(msg.get_header_type()); Vector vec = (Vector) templateTbl.get(type); if (vec == null) { if (DEBUG) Dump.dump("Received packet with type " + type + ", but no listeners registered", packet); return; } int length = msg.get_header_length(); Enumeration en = vec.elements(); while (en.hasMoreElements()) { msgTemplate temp = (msgTemplate) en.nextElement(); Message received; // Erk - end up cloning the message multiple times in case // different templates used for different listeners try { received = temp.template.clone(length); received.dataSet(msg.dataGet(), SerialPacket.offset_data(0) + msg.baseOffset(), 0, length); received.setSerialPacket(msg); } catch (ArrayIndexOutOfBoundsException e) { error(temp, "invalid length message received (too long)"); continue; } catch (Exception e) { error(temp, "couldn't clone message!"); continue; } /* * Messages that are longer than the template might have a variable-sized * array at their end */ if (temp.template.dataGet().length > length) { error(temp, "invalid length message received (too short)"); continue; } temp.listener.messageReceived(msg.get_header_dest(), received); } } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/message/Sender.java000066400000000000000000000076661207233610700250400ustar00rootroot00000000000000// $Id: Sender.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* Authors: David Gay * Intel Research Berkeley Lab * */ /** * @author David Gay * @author Intel Research Berkeley Lab */ package net.tinyos.message; import net.tinyos.util.*; import net.tinyos.packet.*; import java.io.*; /** * Sender class (send tinyos messages).

    * * A sender class provides a simple interface built on Message for * sending tinyos messages to a SerialForwarder * * @version 2, 24 Jul 2003 * @author David Gay */ public class Sender { // If true, dump packet contents that are sent private static final boolean VERBOSE = false; PhoenixSource sender; /** * Create a sender talking to PhoenixSource forwarder. The group id of * sent packets is not set. * @param forwarder PhoenixSource with which we wish to send packets */ public Sender(PhoenixSource forwarder) { sender = forwarder; } /** * Send m to moteId via this Sender's SerialForwarder * @param moteId message destination * @param m message * @exception IOException thrown if message could not be sent */ synchronized public void send(int moteId, Message m) throws IOException { int amType = m.amType(); byte[] data = m.dataGet(); if (amType < 0) { throw new IOException("unknown AM type for message " + m.getClass().getName()); } SerialPacket packet = new SerialPacket(SerialPacket.offset_data(0) + data.length); packet.set_header_dest(moteId); packet.set_header_type((short)amType); packet.set_header_length((short)data.length); packet.dataSet(data, 0, SerialPacket.offset_data(0), data.length); byte[] packetData = packet.dataGet(); byte[] fullPacket = new byte[packetData.length + 1]; fullPacket[0] = Serial.TOS_SERIAL_ACTIVE_MESSAGE_ID; System.arraycopy(packetData, 0, fullPacket, 1, packetData.length); sender.writePacket(fullPacket); if (VERBOSE) Dump.dump("sent", fullPacket); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/message/package.html000066400000000000000000000014471207233610700252250ustar00rootroot00000000000000 Provides abstractions for reading and writing data messages to different communication sources.

    Package Specification

    Related Documentation

    tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/000077500000000000000000000000001207233610700222775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/DDocument.java000066400000000000000000000340621207233610700250310ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.tinyos.mviz; // DDocument.java import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.io.*; import java.lang.reflect.*; import java.net.*; import java.util.*; import javax.imageio.ImageIO; import javax.swing.*; import javax.swing.border.*; import javax.swing.table.*; import net.tinyos.message.*; public class DDocument extends JPanel implements ActionListener{ protected String directory; protected JPanel canvas; protected Vector layers; private Color currentColor; public float[] maxValues; public int selectedFieldIndex; public int selectedLinkIndex; public ImageIcon icon; public Image image; public DNavigate navigator; public Color getColor(){ return currentColor; } public Vector sensed_motes; public Vector sensed_links; public ArrayList moteModels; public ArrayList linkModels; private JTextField jText; private DrawTableModel tableModel; private JTable jTable; private String[] toStringArray(Vector v) { String[] array = new String[v.size()]; for (int i = 0; i < v.size(); i++) { array[i] = (String)v.elementAt(i); } return array; } public DDocument(int width, int height, Vector fieldVector, Vector linkVector, String dir) { super(); layers = new Vector(); directory = dir; setOpaque(false); setLayout(new BorderLayout(6,6)); try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ignore){} selectedFieldIndex = 0; selectedLinkIndex = 0; canvas = new DPanel(this); canvas.setLayout(null); canvas.setDoubleBuffered(true); canvas.setPreferredSize(new Dimension(width, height)); canvas.setMinimumSize(new Dimension(width, height)); canvas.setSize(new Dimension(width, height)); canvas.setOpaque(false); canvas.setBorder(new SoftBevelBorder(SoftBevelBorder.LOWERED)); add(canvas, BorderLayout.CENTER); sensed_motes = fieldVector; sensed_links = linkVector; moteIndex = new HashMap(); linkIndex = new HashMap(); String imgName = directory + "/mote.gif"; try { image = Toolkit.getDefaultToolkit().getImage(imgName); } catch (Exception e) { System.out.println(e); } System.out.println(imgName); canvas.addComponentListener(new ComponentListener(){ public void componentResized(ComponentEvent e) { navigator.redrawAllLayers(); } public void componentHidden(ComponentEvent arg0) { } public void componentMoved(ComponentEvent arg0) { } public void componentShown(ComponentEvent arg0) { } }); // Make control area JPanel west = new JPanel(); west.setDoubleBuffered(true); west.setLayout(new BoxLayout(west, BoxLayout.Y_AXIS)); add(west, BorderLayout.WEST); currentColor = Color.GRAY; navigator = new DNavigate(sensed_motes, sensed_links, this); west.add(navigator); west.add(Box.createVerticalStrut(10)); tableModel = new DrawTableModel(sensed_motes); jTable = new JTable(tableModel); jTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); JScrollPane scroller = new JScrollPane(jTable); scroller.setPreferredSize(new Dimension(350, 200)); scroller.setMinimumSize(new Dimension(350, 200)); scroller.setSize(new Dimension(350, 200)); west.add(scroller); enableEvents(LinkSetEvent.EVENT_ID); enableEvents(ValueSetEvent.EVENT_ID); } public void actionPerformed(ActionEvent e) { } private void zMove(int direction){ tableModel.updateTable(); } public int width_canvas = 600; public int height_canvas = 600; protected ArrayList motes = new ArrayList(); protected ArrayList links = new ArrayList(); protected DMoteModel selected = null; protected HashMap moteIndex; protected HashMap linkIndex; // Provided default ctor that calls the regular ctor public DDocument(Vector fieldVector, Vector linkVector) { this(300, 300, fieldVector, linkVector, "."); // this syntax calls one ctor from another } public DShape getSelected() { return null; } public void setSelected(DShape selected) { } Random rand = new Random(); private DMoteModel createNewMote(int moteID){ DMoteModel m = new DMoteModel(moteID, rand, this); //System.out.println("Adding mote " + moteID); motes.add(m); moteIndex.put(new Integer(moteID), m); tableModel.add(m); navigator.addMote(m); return m; } public void setMoteValue(int moteID, String name, int value) { ValueSetEvent vsv = new ValueSetEvent(this, moteID, name, value); EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); eq.postEvent(vsv); } private DLinkModel createNewLink(DMoteModel start, DMoteModel end) { DLinkModel dl = new DLinkModel(start, end, rand, this); links.add(dl); linkIndex.put(start.getId() + " " + end.getId(), dl); //System.out.println("Put with key <" + start.getId() + " " + end.getId() + ">"); return dl; } public void setLinkValue(int startMote, int endMote, String name, int value) { LinkSetEvent lsv = new LinkSetEvent(this, name, value, startMote, endMote); EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); eq.postEvent(lsv); } protected void processEvent(AWTEvent event) { if (event instanceof ValueSetEvent) { ValueSetEvent vsv = (ValueSetEvent)event; String name = vsv.name(); int moteID = vsv.moteId(); int value = vsv.value(); DMoteModel m = (DMoteModel)moteIndex.get(new Integer(moteID)); if (m == null) { m = createNewMote(moteID); } //System.out.println("Set " + moteID + ":" + name + " to " + value); m.setMoteValue(name, value); navigator.redrawAllLayers(); } else if (event instanceof LinkSetEvent) { LinkSetEvent lsv = (LinkSetEvent)event; String name = lsv.name(); int startMote = lsv.start(); int endMote = lsv.end(); int value = lsv.value(); DMoteModel m = (DMoteModel)moteIndex.get(new Integer(startMote)); if (m == null) { m = createNewMote(startMote); } DMoteModel m2 = (DMoteModel)moteIndex.get(new Integer(endMote)); if (m2 == null) { m2 = createNewMote(endMote); } DLinkModel dl = (DLinkModel)linkIndex.get(startMote + " " + endMote); if (dl == null) { //System.out.println("Does not contain key <" + startMote + " " + endMote + ">"); dl = createNewLink(m, m2); } //System.out.println("Setting " + name + " " + startMote + " -> " + endMote + " to " + value); dl.setLinkValue(name, value); navigator.redrawAllLayers(); } else { super.processEvent(event); } } public static void usage() { System.err.println("usage: tos-mviz [-comm source] [-dir image_dir] message_type [message_type ...]"); } // Just a test main -- put a little DDocument on screen public static void main(String[] args) { JFrame frame = new JFrame("MViz"); Vector packetVector = new Vector(); String source = null; String dir = "."; if (args.length > 0) { for (int i = 0; i < args.length; i++) { if (args[i].equals("-comm")) { source = args[++i]; } else if (args[i].equals("-dir")) { dir = args[++i]; } else { String className = args[i]; packetVector.add(className); } } } else if (args.length != 0) { usage(); System.exit(1); } if (packetVector.size() == 0) { usage(); System.exit(1); } DataModel model = new DataModel(packetVector); DDocument doc = new DDocument(600, 600, model.fields(), model.links(), dir); frame.setContentPane(doc); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); MessageInput input = new MessageInput(packetVector, source, doc); input.start(); } private void repaintAllMotes(){ Iterator it = motes.iterator(); while(it.hasNext()){ ((DMoteModel)it.next()).requestRepaint(); } } private void repaintAllLinks(){ Iterator it = links.iterator(); while(it.hasNext()){ ((DLink)it.next()).repaint(); } } //#########################################################################// private class DrawTableModel extends AbstractTableModel implements DMoteModelListener { private Vector fields; public DrawTableModel(Vector fields) { this.fields = fields; } //-----------------------------o public String getColumnName(int col){ switch(col) { case 0: return "X"; case 1: return "Y"; default: return (String)fields.elementAt(col - 2); } } //-----------------------------o public int getColumnCount() { return fields.size() + 2; } //-----------------------------o public int getRowCount() { return DDocument.this.motes.size(); } //-----------------------------o public Object getValueAt(int row, int col) { DMoteModel model = (DMoteModel) DDocument.this.motes.get(row); switch(col) { case 0: return "" + (int)model.getLocX(); case 1: return "" + (int)model.getLocY(); default: return("" + (int)model.getValue(col - 2)); } } //-----------------------------o public void shapeChanged(DMoteModel changed, int type){ int row = findModel(changed); if (row != -1) fireTableRowsUpdated(row, row); } //-----------------------------o public void add(DMoteModel model){ model.addListener(this); int last = DDocument.this.motes.size()-1; fireTableRowsInserted(last, last); } //-----------------------------o public void remove(DMoteModel model){ int row = findModel(model); if (row != -1) fireTableRowsDeleted(row, row); } //-----------------------------o public void updateTable(){ fireTableDataChanged(); } //-----------------------------o private int findModel(DMoteModel changed){ for (int i=0; i= low && val <= high); } public void mousePressed(MouseEvent e) { lastX = e.getX(); lastY = e.getY(); Iterator it = doc.motes.iterator(); while (it.hasNext()) { DMoteModel model = (DMoteModel)it.next(); if (withinRange(e.getX(), model.getLocX() - 20, model.getLocX() + 20) && withinRange(e.getY(), model.getLocY() - 20, model.getLocY() + 20)) { selected = model; return; } } } public void mouseReleased(MouseEvent e) { if (doc.selected != null) { doc.selected = null; lastX = -1; lastY = -1; } } }); addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { if (doc.selected != null) { if (lastY == -1) { lastY = e.getY(); } if (lastX == -1) { lastX = e.getX(); } int x = e.getX(); int y = e.getY(); int dx = x-lastX; int dy = y-lastY; lastX = x; lastY = y; selected.move(selected.getLocX() + dx, selected.getLocY() + dy); } doc.navigator.redrawAllLayers(); } }); } public void paintComponent(Graphics g) { super.paintComponent(g); setOpaque(false); //System.out.println("Painting panel!"); doc.navigator.redrawAllLayers(); } } private class CanvasMouse extends MouseAdapter { } protected class ValueSetEvent extends AWTEvent { public static final int EVENT_ID = AWTEvent.RESERVED_ID_MAX + 1; private String name; private int value; private int mote; public ValueSetEvent(Object target, int mote, String name, int value) { super(target, EVENT_ID); this.value = value; this.name = name; this.mote = mote; } public String name() { return name; } public int value() { return value; } public int moteId() { return mote; } } protected class LinkSetEvent extends AWTEvent { public static final int EVENT_ID = AWTEvent.RESERVED_ID_MAX + 2; private String name; private int value; private int start; private int end; public LinkSetEvent(Object target, String name, int value, int start, int end) { super(target, EVENT_ID); this.value = value; this.name = name; this.start = start; this.end = end; } public String name() { return name; } public int value() { return value; } public int start() { return start; } public int end() { return end; } } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/DLayer.java000066400000000000000000000264031207233610700243270ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.tinyos.mviz; // DDocument.java import java.awt.*; import javax.imageio.ImageIO; import javax.swing.*; import java.util.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import javax.swing.border.Border; import javax.swing.border.LineBorder; import javax.swing.table.*; import java.awt.image.*; // Standard imports for XML import javax.xml.parsers.*; import org.xml.sax.*; import org.w3c.dom.*; public class DLayer extends JPanel implements ActionListener{ public static final int MOTE = 0; public static final int LINK = 1; public static final int FIELD = 2; private static final Color[] COLORS = { new Color(231, 220, 206), new Color(250, 210, 99), new Color(209, 230, 179) }; private int type; protected int index; protected int zIndex; protected int z_index = 0; private ArrayList layer = new ArrayList(); private JLabel label; private JCheckBox check; private String[][] DISPLAYS = { {"circle", "img", "txt"}, {"line", "line+label", "label"}, {"color 256", "color 1024", "color 4096", "color 16384"}}; private JComboBox displays; private ArrayList models; private ArrayList linkModels; private JButton up; private JButton down; protected int paintMode = 0; // Values chosen for COLOR so that readings can be right shifted // that many bits to be in range 0-255 static public final int COLOR_256 = 0; static public final int OVAL = 1; static public final int COLOR_1024 = 2; static public final int IMG = 3; static public final int COLOR_4096 = 4; static public final int TXT_MOTE = 5; static public final int COLOR_16384 = 6; static public final int LINE = 7; static public final int LABEL = 8; static public final int LINE_LABEL = 9; protected DNavigate navigator; private String name; private DDocument parent; public DLayer(int zIndex, int index, String label, int type, DDocument parent, ArrayList models, DNavigate navigator){ this.parent = parent; this.type = type; this.models = models; this.zIndex = zIndex; this.index = index; this.navigator = navigator; this.name = label; if (type == MOTE) { this.paintMode = OVAL; } else if (type == LINK) { this.paintMode = LINE; } SpringLayout layout = new SpringLayout(); setLayout(layout); setMaximumSize(new Dimension(350, 25)); setPreferredSize(new Dimension(350, 25)); setSize(new Dimension(350, 25)); setDoubleBuffered(true); setBackground(COLORS[type]); setBorder(new LineBorder(new Color(155, 155, 155))); check = new JCheckBox(); check.setSize(35, 25); check.setMaximumSize(new Dimension(35, 25)); check.setMinimumSize(new Dimension(35, 25)); check.setPreferredSize(new Dimension(35, 25)); up = new JButton("^"); up.setFont(new Font("Times", Font.PLAIN, 9)); up.setSize(25, 25); up.setMaximumSize(new Dimension(25, 25)); up.setMinimumSize(new Dimension(25, 25)); up.setPreferredSize(new Dimension(25, 25)); up.setMargin(new Insets(2, 2, 2, 2)); down = new JButton("v"); down.setFont(new Font("Times", Font.PLAIN, 8)); down.setSize(25, 25); down.setMaximumSize(new Dimension(25, 25)); down.setMinimumSize(new Dimension(25, 25)); down.setPreferredSize(new Dimension(25, 25)); down.setMargin(new Insets(2, 2, 2, 2)); this.label = new JLabel(" " + label, JLabel.LEFT); this.label.setSize(125, 25); this.label.setMaximumSize(new Dimension(125, 25)); this.label.setMinimumSize(new Dimension(125, 25)); this.label.setPreferredSize(new Dimension(125, 25)); switch (type) { case MOTE: this.label.setBackground(new Color(255, 200, 200)); break; case FIELD: this.label.setBackground(new Color(200, 255, 200)); break; case LINK: this.label.setBackground(new Color(200, 200, 255)); break; default: // do nothing } displays = new JComboBox(DISPLAYS[type]); displays.setSize(100, 25); //displays.setMaximumSize(new Dimension(125, 25)); displays.setMinimumSize(new Dimension(125, 25)); displays.setPreferredSize(new Dimension(125, 25)); check.addActionListener(this); up.addActionListener(this); down.addActionListener(this); displays.addActionListener(this); layout.putConstraint(SpringLayout.WEST, this, 0, SpringLayout.WEST, down); layout.putConstraint(SpringLayout.EAST, check, 0, SpringLayout.WEST, down); layout.putConstraint(SpringLayout.EAST, down, 0, SpringLayout.WEST, up); layout.putConstraint(SpringLayout.EAST, up, 0, SpringLayout.WEST, this.label); layout.putConstraint(SpringLayout.EAST, this.label, 0, SpringLayout.WEST, displays); layout.putConstraint(SpringLayout.EAST, displays, 0, SpringLayout.EAST, this); add(check); add(down); add(up); add(this.label); add(displays); } public boolean isFieldSelected(){ return (type==FIELD && check.isSelected()); } public void actionPerformed(ActionEvent e) { if (e.getSource() == check) { if (check.isSelected()){ parent.selectedFieldIndex = index; //repaintLayer(g); //System.out.println("redraw index " +zIndex +" on layer"); } else if(type==FIELD){ //System.out.println("clear"); //parent.canvas.repaint(); //repaintLayer(g); } else { //repaintLayer(g); } } else if (e.getSource() == up){ parent.navigator.moveLayerUp(this.zIndex); } else if (e.getSource() == down){ parent.navigator.moveLayerDown(this.zIndex); } else if (e.getSource() == displays){ String selected = (String)displays.getSelectedItem(); if (selected.equals("circle")){ paintMode = OVAL; } else if (selected.equals("img")){ paintMode = IMG; } else if (selected.equals("txt")){ paintMode = TXT_MOTE; } else if (selected.equals("color 256")) { paintMode = COLOR_256; } else if (selected.equals("color 1024")) { paintMode = COLOR_1024; } else if (selected.equals("color 4096")) { paintMode = COLOR_4096; } else if (selected.equals("color 16384")) { paintMode = COLOR_16384; } else if (selected.equals("line")) { paintMode = LINE; } else if (selected.equals("label")) { paintMode = LABEL; } else if (selected.equals("line+label")) { paintMode = LINE_LABEL; } } //System.out.println("Repainting parent?"); //parent.repaint(); } public void init(){ if (type==LINK){ //addLinks(true); } else { addMotes(true); } } public String toString() { return "Layer " + name + " " + type; } // private void addLinks(boolean paint){ // Iterator it = models.iterator(); // while(it.hasNext()){ // DLink mm = (DLink) it.next(); // //canvas.add(mm); // if (paint) mm.repaint(); // } // } protected void addMote(DMoteModel model, boolean paint){ DShape mote = new DMote(model, this.parent, this); layer.add(mote); } private void addMotes(boolean paint){ Iterator it = models.iterator(); while(it.hasNext()){ addMote((DMoteModel) it.next(), paint); } } public void updateIndex(int index, boolean repaint){ zIndex = index; z_index = (navigator.totalLayers - zIndex)*100; //if (repaint) redrawLayer(); //parent.canvas.setLayer(d.canvas, length - i); } public void paintScreenBefore(Graphics g) { Dimension d = parent.canvas.getSize(); int x = 0; int y = 0; int xstep = (int)(d.width / 40); int ystep = (int)(d.height / 40); for(;x < d.width; x += xstep){ for(y = 0;y < d.height; y += ystep){ double val = 0; double sum = 0; double total = 0; double min = 10000000; Iterator it = models.iterator(); while(it.hasNext()){ DMoteModel m = (DMoteModel) it.next(); double dist = distance(x, y, m.x, m.y); if(true){ //121 if(dist < min) min = dist; val += ((double)(((int)m.getValue(index)) >> paintMode )) / dist /dist; sum += (1/dist/dist); } } int reading = (int)(val / sum); //System.out.println("Reading: " + reading); if (reading > 255) reading = 255; g.setColor(new Color(reading, reading, reading)); //System.out.println("Filling " + x + "+" + step + " " + y + "+" + step + " with " + g.getColor()); g.fillRect(x, y, xstep, ystep); } } } public double distance(int x, int y, int x1, int y1){ return Math.sqrt( (x-x1)*(x-x1)+(y-y1)*(y-y1)); } protected void repaintLayer(Graphics g){ if (check.isSelected()){ //System.out.println("Repaint layer " + name); if (type==FIELD){ paintScreenBefore(g); } else if (type == LINK) { Iterator it = models.iterator(); //System.out.print("Draw links: "); while (it.hasNext()) { DLinkModel model = (DLinkModel)it.next(); DLink lnk = new DLink(model, parent, this); lnk.paintShape(g); //System.out.print("+"); } //System.out.println(); } else if (type == MOTE) { Iterator it = models.iterator(); //System.out.print("Draw motes: "); while (it.hasNext()){ DMoteModel model = (DMoteModel)it.next(); DShape m = new DMote(model, parent, this); m.paintShape(g); //System.out.print("+"); } //System.out.println(); } } } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/DLink.java000066400000000000000000000143561207233610700241540ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.tinyos.mviz; // DShape.java import java.awt.*; import java.util.*; import javax.swing.*; import java.awt.event.*; import java.awt.geom.Line2D; public class DLink extends JComponent implements DLinkModelListener { protected DLinkModel model; protected DDocument document; private DLayer layer; // remember the last point for mouse tracking private int lastX, lastY; // Move or Resize ? private int action; private static final int MOVE = 0; //=========================================================================// public DLink(DLinkModel model, DDocument document, DLayer layer) { super(); this.model = model; this.layer = layer; this.document = document; model.addListener(this); // Mouse listeners. addMouseListener( new MouseAdapter() { public void mousePressed(MouseEvent e) { selected(); lastX = e.getX()+getX(); lastY = e.getY()+getY(); if (e.isControlDown()){ }else if(e.isAltDown()){ }else if(e.isShiftDown()){ }else{ DetermineAction(lastX, lastY); } } } ); addMouseMotionListener( new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { int x = e.getX()+getX(); int y = e.getY()+getY(); // compute delta from last point int dx = x-lastX; int dy = y-lastY; lastX = x; lastY = y; switch(action){ case MOVE: DoAction(dx, dy); break; } } } ); synchToModel(); } //=========================================================================// public DLinkModel getModel() { return(model); } //=========================================================================// public void shapeChanged(DLinkModel changed, int type) { synchToModel(); repaint(); } //=========================================================================// public void paintShape(Graphics g){ Graphics2D g2 = (Graphics2D) g; g.setColor(Color.BLACK); int diffX = (model.m1.getLocX() - model.m2.getLocX()); int diffY = (model.m1.getLocY() - model.m2.getLocY()); if (diffX == 0 && diffY == 0) { return; } if (diffX == 0) {diffX = 1;} if (diffY == 0) {diffY = 1;} int midX = (model.m1.getLocX() + model.m2.getLocX()) / 2; int midY = (model.m1.getLocY() + model.m2.getLocY()) / 2; midY += 8; midX += 10; //midX += Math.abs(((double)diffX / ((double)Math.abs(diffY) + (double)Math.abs(diffX))) * 60); if (diffX * diffY < 0) { midY += Math.abs(((double)diffX / ((double)Math.abs(diffY) + (double)Math.abs(diffX))) * 10); midX += Math.abs(((double)diffX / ((double)Math.abs(diffY) + (double)Math.abs(diffX))) * 10); } else { midY -= Math.abs(((double)diffX / ((double)Math.abs(diffY) + (double)Math.abs(diffX))) * 10); midX += Math.abs((double)diffX / ((double)Math.abs(diffY) + (double)Math.abs(diffX)) * 10); } switch(layer.paintMode) { case DLayer.LINE_LABEL: g.setColor(Color.BLACK); g2.drawString(document.sensed_links.elementAt(layer.index) + ": " + (int)model.getValue(layer.index), midX, midY); case DLayer.LINE: g2.setStroke(new BasicStroke(3)); g2.setColor(Color.RED); g2.draw(new Line2D.Double(model.m1.getLocX(), model.m1.getLocY(), model.m2.getLocX(), model.m2.getLocY())); break; case DLayer.LABEL: g.setColor(Color.BLACK); g2.drawString(document.sensed_links.elementAt(layer.index) + ": " + (int)model.getValue(layer.index), midX, midY); break; } } //=========================================================================// public void paintComponent(Graphics g) { } //=========================================================================// private void DetermineAction(int x, int y){ action = MOVE; } //=========================================================================// private void DoAction(int dx, int dy){ } //=========================================================================// private void synchToModel(){ setBounds(model.getTop(), model.getLeft(), model.getWidth(), model.getHeight()); } //=========================================================================// private void selected(){ } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/DLinkModel.java000066400000000000000000000117011207233610700251240ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.tinyos.mviz; // DShapeModel.java /* Store the data state for a single shape: type, two points, color Supports DShapeModelListeners. */ import java.awt.*; import javax.swing.*; import java.util.*; import java.awt.event.*; import java.io.*; class DLinkModel extends Object implements Serializable { public static final int VALUE = 0; public static final int MOTION = 1; public static final int ANY = 1; public DDocument root; transient private ArrayList listeners; protected int x12, y12; protected int[] values; DMoteModel m1; DMoteModel m2; protected int COLOR_MAX = 230; public DLinkModel(DMoteModel m1, DMoteModel m2, Random rand, DDocument root){ this.root = root; this.m1 = m1; this.m2 = m2; x12 = getMiddle(m1.x, m2.x); y12 = getMiddle(m1.y, m2.y); values = new int[root.sensed_links.size()]; for (int i=0; i=0; i--){ DLayer a = (DLayer)layers.get(i); a.repaintLayer(g); } parent.canvas.getGraphics().drawImage(offscreen, 0, 0, this); } public void update(Graphics g) { paint(g); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/DShape.java000066400000000000000000000112531207233610700243100ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.tinyos.mviz; // DShape.java import java.awt.*; import java.util.*; import javax.swing.*; import java.awt.event.*; abstract class DShape extends JComponent implements DMoteModelListener { protected DMoteModel model; protected DDocument document; public Image img; // remember the last point for mouse tracking private int lastX, lastY; protected DLayer layer; // Move or Resize ? private int action; private static final int MOVE = 0; //=========================================================================// public DShape(DMoteModel model, DDocument document, DLayer layer) { super(); this.model = model; this.img = document.image; this.document = document; this.layer = layer; model.addListener(this); addMouseMotionListener( new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { int x = e.getX()+getX(); int y = e.getY()+getY(); // compute delta from last point int dx = x-lastX; int dy = y-lastY; lastX = x; lastY = y; switch(action){ case MOVE: DoAction(dx, dy); break; } } } ); synchToModel(); } //=========================================================================// public DMoteModel getModel() { return(model); } //=========================================================================// public void shapeChanged(DMoteModel changed, int type) { synchToModel(); repaint(); } //=========================================================================// public abstract void paintShape(Graphics g); //=========================================================================// public void paintComponent(Graphics g) { } //=========================================================================// private void DetermineAction(int x, int y){ action = MOVE; } //=========================================================================// private void DoAction(int dx, int dy){ model.applyDeltas(dx, dy); } //=========================================================================// private void synchToModel(){ int x=0, y=0, w=0, h=0; switch(layer.paintMode){ case DLayer.IMG: x = model.getLocX(); y = model.getLocY(); //w = model.getWidth(layer.index); //h = model.getHeight(layer.index); w = 250; h = 250; break; case DLayer.OVAL: x = model.getLocX(); y= model.getLocY(); w = 10; h = 10; break; case DLayer.TXT_MOTE: x = model.getLocX(); y= model.getLocY(); w = 250; h = 250; break; } //setLocation(x, y); setBounds(0, 0, 0, 0); } //=========================================================================// private void selected(){ document.setSelected(this); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/DShapeModel.java000066400000000000000000000141061207233610700252710ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.tinyos.mviz; // DShapeModel.java /* Store the data state for a single shape: type, two points, color Supports DShapeModelListeners. */ import java.awt.*; import javax.swing.*; import java.util.*; import java.awt.event.*; import java.io.*; class DShapeModel extends Object implements Serializable { // The 5 standard things for a DShapeModel to store protected char type; protected int x1, y1, x; protected int x2, y2, y; protected Color fill; protected float value; protected int HALF_WIDTH = 20; protected int HALF_HEIGHT = 20; // NOTE: "transient" -- not serialized transient private ArrayList listeners; public DShapeModel(char type, int x, int y, float value) { this.type = type; this.x = x; this.y = y; this.value = value; int color = (int)(value)%230; this.fill = new Color(color+15, color, color+25); listeners = null; this.x1 = x - this.HALF_WIDTH; this.x2 = x + this.HALF_WIDTH; this.y1 = y - this.HALF_HEIGHT; this.y2 = y + this.HALF_HEIGHT; } // Construct a DShapeModel with default size. public DShapeModel(char type, Color color) { this(type, 50, 50, 89, 89, color); } public DShapeModel(){ this('m', new Color(12,24,48)); } public DShapeModel(char type, int x1, int y1, int x2, int y2, Color fill) { this.type = type; this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.fill = fill; listeners = null; } public DShapeModel(DShapeModel other) { this.type = other.type; this.x1 = other.x1; this.y1 = other.y1; this.x2 = other.x2; this.y2 = other.y2; this.fill = other.fill; listeners = null; } public char getType() { return(type); } public int getX1() { return(x1); } public int getY1() { return(y1); } public int getX2() { return(x2); } public int getY2() { return(y2); } // Below here, code not done public void applyDeltas(int dx1, int dy1, int dx2, int dy2) { x1 += dx1; x2 += dx2; y1 += dy1; y2 += dy2; x += dx1; y += dy1; fireChanges(); } public int getWidth() { return Math.abs(x2-x1)+1; } public int getHeight() { return Math.abs(y2-y1)+1; } public int getLocX() { return Math.min(x1, x2); } public int getLocY() { return Math.min(y1, y2); } public Color getColor() { return(fill); } public void setColor(Color color) { if (fill.equals(color)) return; fill = color; fireChanges(); } public void addListener(DShapeModelListener listener) { if (listeners == null) listeners = new ArrayList(); Iterator it = listeners.iterator(); while (it.hasNext()) { if (it.next() == listener) return; } listeners.add(listener); } public void removeListener(DShapeModelListener listener) { if (listeners == null) return; Iterator it = listeners.iterator(); while (it.hasNext()) { if (it.next() == listener){ it.remove(); return; } } } //=========================================================================/ protected void fireChanges(){ if (listeners==null) return; Iterator it = listeners.iterator(); while (it.hasNext()) ((DShapeModelListener)(it.next())).shapeChanged(this); } //=========================================================================/ public void rotate(){ // Get old height/width and locations. int x = getLocX(); int y = getLocY(); int w = getWidth(); int h = getHeight(); int dL = (h/2-w/2); // Get the locations right. x-=dL; y+= dL; x1=x; x2=x+h-1; y1=y; y2=y+w-1; fireChanges(); } //=========================================================================/ // Rotation with respect to center. public void scale(int magnitude){ if (x1"); links.add(name); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/Makefile000066400000000000000000000001431207233610700237350ustar00rootroot00000000000000# Top-level Makefile for tools/java SUBDIRS = ROOT = ../../.. include $(ROOT)/Makefile.include tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/MessageInput.java000066400000000000000000000130161207233610700255470ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.tinyos.mviz; import java.lang.reflect.*; import java.io.*; import java.util.*; import net.tinyos.message.*; import net.tinyos.packet.*; import net.tinyos.util.*; public class MessageInput implements net.tinyos.message.MessageListener { private Vector msgVector = new Vector(); private MoteIF moteIF; private DDocument document; public MessageInput(Vector packetVector, String commSource, DDocument doc) { document = doc; loadMessages(packetVector); createSource(commSource); installListeners(); } private void loadMessages(Vector packetVector) { for (int i = 0; i < packetVector.size(); i++) { String className = (String)packetVector.elementAt(i); try { Class c = Class.forName(className); Object packet = c.newInstance(); Message msg = (Message)packet; msgVector.addElement(msg); } catch (Exception e) { System.err.println(e); } } } private void createSource(String source) { if (source != null) { moteIF = new MoteIF(BuildSource.makePhoenix(source, PrintStreamMessenger.err)); } else { moteIF = new MoteIF(BuildSource.makePhoenix(PrintStreamMessenger.err)); } } private void addMsgType(Message msg) { moteIF.registerListener(msg, this); } private void installListeners() { Enumeration msgs = msgVector.elements(); while (msgs.hasMoreElements()) { Message m = (Message)msgs.nextElement(); this.addMsgType(m); } } public void start() {} public void messageReceived(int to, Message message) { Hashtable table = new Hashtable(); Hashtable linkTable = new Hashtable(); //System.out.println("Received message:"); //System.out.println(message); Class pktClass = message.getClass(); Method[] methods = pktClass.getMethods(); for (int i = 0; i < methods.length; i++) { Method method = methods[i]; String name = method.getName(); Class[] params = method.getParameterTypes(); Class returnType = method.getReturnType(); if (params.length != 0 || returnType.isArray()) { continue; } if (name.startsWith("get_") && !name.startsWith("get_link")) { name = name.substring(4); // Chop off "get_" try { //System.out.println(name + " returns " + res); Integer result = (Integer)method.invoke(message, null); table.put(name, result); } catch (java.lang.IllegalAccessException exc) { System.err.println("Unable to access field " + name); } catch (java.lang.reflect.InvocationTargetException exc) { System.err.println("Unable to access target " + name); } } else if (name.startsWith("get_link_")) { name = name.substring(9); // chop off "get_link_" try { Integer result = (Integer)method.invoke(message, null); linkTable.put(name, result); } catch (java.lang.IllegalAccessException exc) { System.err.println("Unable to access field " + name); } catch (java.lang.reflect.InvocationTargetException exc) { System.err.println("Unable to access target " + name); } } } if (table.containsKey("origin")) { Integer origin = (Integer)table.get("origin"); //table.remove("origin"); Enumeration elements = table.keys(); while (elements.hasMoreElements()) { String key = (String)elements.nextElement(); Integer value = (Integer)table.get(key); document.setMoteValue(origin.intValue(), key, value.intValue()); } elements = linkTable.keys(); while (elements.hasMoreElements()) { String key = (String)elements.nextElement(); if (!key.endsWith("_value")) { continue; } Integer value = (Integer)linkTable.get(key); key = key.substring(0, key.length() - 6); // chop off "_value" String addrkey = key + "_addr"; if (!linkTable.containsKey(addrkey)) { continue; } Integer addr = (Integer)linkTable.get(addrkey); document.setLinkValue(origin.intValue(), addr.intValue(), key, value.intValue()); } } else { System.err.println("Could not find origin field, discarding message."); } } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/images/000077500000000000000000000000001207233610700235445ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/images/tmote_sky.gif000066400000000000000000000102461207233610700262540ustar00rootroot00000000000000GIF89ad@(;(@(F)4+N,J%*-,F*Q/10T6Y#1Q5^7Q:a5S%5G,4@"6Z#5_:]269*:<695?hBq<9-Dl"b(27?KI=-*D]/CU@>C1A\OAC?8CXFA>=DGN|;C_$Mp!NwDHK-Oh;K[CIP5Kl.Om7LfAJVWSFB7PY8NbY UBLaLLINLDZ)WyJNQPNA\K1+U!\|,V"]`?YLATi@ToMTNFUePSUITkMU\9\uVTQLTqEZd@[n%cYVJ<[&g|7_~FZvJ[oQZg7apT8S[bPZpV[]2ia]PHcx>fBgz3ka_W__]VamDgYahPcyOeuNdGfccN]aoUdu^ceZbvdbfNi~pcOZhtdem^hn>s]maFpoi\MqjjgOtijsVqemtiloQsdmzZqbsa`oemZx{`unCqn}vqdks{osukswqmrtors|xr}Uwt\qye}xfi}vy|c}n~xys{m}sm{o{}wzw{cw}atYl~|ywvjv~c˸ȼþÿ¾´Ǿ! ,d@@ H*\XP1q #JH!:UZ9Rc 5f@92D74L$IP٢s8)~"h%(\RAC+3-h6h$I o(Sv$2d8E 4/A|DN3Oa1CvxٔG *I"j&+xUDI\fh]9x_\9wG~\.~PTQ i8 'L!P@Q >'Q8O~< ȣN:3x" ."M I,BIp54 d*f \3 o\X"CP& K n  bPA 8LDYP'@BY@puMhB!~( | `d Qn0 `*Ts@@ >`+Ar`apE+0&v8.\ T|G8AH`8061B @RЙhSA [`D 4 N 'D$h SDsG5:!mhF)8Gb =ȐQ" }E-5:`ڇp%@Q`ؐ fB F'yIdC3 V dp0 ?htQȢ@mЕm(fX 9!`8(A J 06ra#yҀ1c:%tA )TЊ4T@9(C>i C$X XB*!#g4G=xceK/XьVTa |Ȅ^P=a c7@؁  \h S]>y;~;t3@CEp,0gƸF9u8",pRnøH=ilcs9LdCxk)XdikhHQj(Cx-CicN;@HR7AZdFzD#ЅKTYq<@h>L!eA:@ YZ 8aE.\Q58:/E3:h0\1D0jAZ4 x9t")8Ȁp1i\^^3 T( Z `*awpB 8&G+EB aDA@IhӉF=dz  Y pAT XSA $UQ2؇: `D P i F|oit h ` $ A(I͘p F ke@d ?17@u4z(AP%۩cՠ~c`<)N%t0BVbn@aJAx@G.X&A3; ODъD[ TP!q (<W&Z rrq`c ð P#&' 0 9@.`u xu0 L` UE!!XD@Gp _pp wD 1wqB/0 EP e0 s SP 1` j ĂU|>y[0 Y p W@ }V / @`0B#$աs#V0 p) S@ pw@ pdP }rR{p 0 [Z"FP p4%j6@9 [$`Qj P } m[H s;  / c@P p<|@

    @_/\PpE p W3@D0DuvIPUUPM= `;4Y"" :03P ,@ A @`mVB6cS/R ~} P{ F%-8P~1Ԁ(Y)o\ s| P#QGQ*p y<99kP E0`0XPRi@A @ Ӑp` @"cV67i 8 r$'P Ơ 0 @P %@ؠ9#" 3  3P00 hP u@8 P%!9M0/""PA :`jb" |/@$`DXAp)dheZ`:` ?fa>p 8T IEvp E_JH :*%hcR&Qr ( p$hQװ Ur;tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/images/tmote_sky.jpg000066400000000000000000004254771207233610700263070ustar00rootroot00000000000000JFIFHHExifMM*bj(1r2i ' 'Adobe Photoshop CS2 Windows2005:12:12 13:25:41&(.rHHJFIFHH Adobe_CMAdobed            f" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?DI%)$IJI$RI$I%)%,elu81wsz׬ Gv=r"oٷɩv$ uTV{j_ck@sjǧv?FcrKK07{j;-=SuWzQtv~}hT~=m..{gn.wfīu>?R=i'[ueQ,ɨ nڭhn}:g'U =gk=;." Z6fk?7Zzk*uW5߲[c63m̪9rbTvY!?/G_VO}96,m?V9橯) lr\ښK78wz^Z^I׻F݅ G_Ⳍ>?3$][m{HsH?7)(DI%)$IJI$RLH` I+?_fu8~Hk2Ao'H]Gtnc*̫skqmٱ>>}|:zMœ+Ic ێ]U_p#?%_,ougե>[#kuf,Ӑsc}Ϙ[Cjm[?] *$=>oZ9v3^MWr6JNϮ7oL6=6@sA6{3"nÏH{m q>nTܗ2!1>vg{~b ?& ]Se2=Fc! c<7}ޝoMFn&k]UuH>=dMsʧ0ټEd^lۺU~Y,iF~cSv_КQeM-/oz/vHNm]Ǣ̦k6&־YGJ;};k-w.l?,z]g헹S% -k,k鹮K}(}K#{Ƶg{ݵ\]ch=?~YnQG]cZѿ]S]r}z, Aw[e?=YXg:U5h6-e2U؟FY!!+H Stz1쟪y̬Kx X+]~WCtF{vN&v,#u{rv`^qb_:K=~=Y=%}٭C\Ԡ}CCk37 }R cQWDI%)$?UkI2=Td}j,~M,MӵCkozzN{ghlf}Xw>kꮽTny&ڃ]A{vri:^VH"T>O\ws~h]hX=ƌgl{=OZ11Zۋ1Ņ,o?ٷݟ]4 01nKlòWʽױ-c/U^fmYS kɪ[rCV+,=ziu =)궋,ic@ic}c^v}uL*x~[ v}N5E[7~krm=:Ee"d\ګʚ^ƆOr3?G.(݁`wQM6ZI$CxfK:3ku` \ݶjg1)wy aXhY鵤i\Pv,up! @#٦VN nd^\XƍO[Zg Az1?C~=C崲UDγY+Yg27չunsQA ;Lxl`kAɤPU8ලv/ _Djuas et7t}!P.?Y?ѩc^l8 /A60zNx2}>=_?,:Ǫ:2Dooٱ~G?ULq8F6z׈?{_sc-u@ug۱n+MѺ'R}{^lV\F3= cSjhmE$kx7Ǯk4G0"\ JFUS.@˜GXQ ]I$DI%(޵rz>kH옗=,]gS,me tYd}EΚGIqRX_W\}:=ӯ?fmbWNN9 8Y[5IOޢ $`3:W`77ʷm{CS';"(DI-'%ykU͗?sm\3󿝧mY5Ym'uYY$Y~ _bsX]5\ o̯3iػQߵQl-'Qe03ҫQ[^Gz= "Crz?I=fic~Tq.從g_._uMּ~cs- hVѴk[kQ \ I$JI$ )tO5buλӲr{fms9VY~TK/VD @q|nFn?cl-nC[U?G]co?p,]pCj^㱅GS6(^7V n7Cۧ۝K,m4608G;IgunO$n3>ЯߤY6uޱԱlw~Ŀ{̯s?=>чMXʵo_Cf9SsXjs mc߳אv;Y_{sp7z@|} 7V/]UH~f]B̚=+CƊ7Kls7W_qrJC5̮,͌A걔̻Yb>_dZ(85B l[6V'~?7"~^%~zmv9xsǨ~Խ-/=KC*uJb繆K*v [elOZRz~u.s1;1 nlc>=JNDk$*6e9}d;[s\Y^lOU]xm׊/'y>\_h}YQ6zKo^S*c+ƴCG[Jyz |Uwvq}Qu{w}W- $&e I$$I)I$JLm ZGа,X4{G[YUny,>v^#=ۦc6 Cl:߿_P)oTtXE3#ӫ]2_5c}?k1[VOXlJ[ALO݌+}7S1z}-hh0Os,]7Nu8W%J# dXnȖ!?okxQ赀 xc1Z4Wۓ[YҺ,481tʟ_yH37Ȱ}];4ыkZ-==Ze4\i~/d)sʴ;w~_Lm-iыSH/Լ.]v r[m-;1g[]3vcTګf}m^H:ְmh$W)$IJI$RI$I%?C, |3?$,aOs?(dSJKdSJKdSJKdSJKdSJKdSJKdSJKdSJKdSFPhotoshop 3.08BIM%8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMI Untitled-2nullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM f@rJFIFHH Adobe_CMAdobed            f" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?DI%)$IJI$RI$I%)%,elu81wsz׬ Gv=r"oٷɩv$ uTV{j_ck@sjǧv?FcrKK07{j;-=SuWzQtv~}hT~=m..{gn.wfīu>?R=i'[ueQ,ɨ nڭhn}:g'U =gk=;." Z6fk?7Zzk*uW5߲[c63m̪9rbTvY!?/G_VO}96,m?V9橯) lr\ښK78wz^Z^I׻F݅ G_Ⳍ>?3$][m{HsH?7)(DI%)$IJI$RLH` I+?_fu8~Hk2Ao'H]Gtnc*̫skqmٱ>>}|:zMœ+Ic ێ]U_p#?%_,ougե>[#kuf,Ӑsc}Ϙ[Cjm[?] *$=>oZ9v3^MWr6JNϮ7oL6=6@sA6{3"nÏH{m q>nTܗ2!1>vg{~b ?& ]Se2=Fc! c<7}ޝoMFn&k]UuH>=dMsʧ0ټEd^lۺU~Y,iF~cSv_КQeM-/oz/vHNm]Ǣ̦k6&־YGJ;};k-w.l?,z]g헹S% -k,k鹮K}(}K#{Ƶg{ݵ\]ch=?~YnQG]cZѿ]S]r}z, Aw[e?=YXg:U5h6-e2U؟FY!!+H Stz1쟪y̬Kx X+]~WCtF{vN&v,#u{rv`^qb_:K=~=Y=%}٭C\Ԡ}CCk37 }R cQWDI%)$?UkI2=Td}j,~M,MӵCkozzN{ghlf}Xw>kꮽTny&ڃ]A{vri:^VH"T>O\ws~h]hX=ƌgl{=OZ11Zۋ1Ņ,o?ٷݟ]4 01nKlòWʽױ-c/U^fmYS kɪ[rCV+,=ziu =)궋,ic@ic}c^v}uL*x~[ v}N5E[7~krm=:Ee"d\ګʚ^ƆOr3?G.(݁`wQM6ZI$CxfK:3ku` \ݶjg1)wy aXhY鵤i\Pv,up! @#٦VN nd^\XƍO[Zg Az1?C~=C崲UDγY+Yg27չunsQA ;Lxl`kAɤPU8ලv/ _Djuas et7t}!P.?Y?ѩc^l8 /A60zNx2}>=_?,:Ǫ:2Dooٱ~G?ULq8F6z׈?{_sc-u@ug۱n+MѺ'R}{^lV\F3= cSjhmE$kx7Ǯk4G0"\ JFUS.@˜GXQ ]I$DI%(޵rz>kH옗=,]gS,me tYd}EΚGIqRX_W\}:=ӯ?fmbWNN9 8Y[5IOޢ $`3:W`77ʷm{CS';"(DI-'%ykU͗?sm\3󿝧mY5Ym'uYY$Y~ _bsX]5\ o̯3iػQߵQl-'Qe03ҫQ[^Gz= "Crz?I=fic~Tq.從g_._uMּ~cs- hVѴk[kQ \ I$JI$ )tO5buλӲr{fms9VY~TK/VD @q|nFn?cl-nC[U?G]co?p,]pCj^㱅GS6(^7V n7Cۧ۝K,m4608G;IgunO$n3>ЯߤY6uޱԱlw~Ŀ{̯s?=>чMXʵo_Cf9SsXjs mc߳אv;Y_{sp7z@|} 7V/]UH~f]B̚=+CƊ7Kls7W_qrJC5̮,͌A걔̻Yb>_dZ(85B l[6V'~?7"~^%~zmv9xsǨ~Խ-/=KC*uJb繆K*v [elOZRz~u.s1;1 nlc>=JNDk$*6e9}d;[s\Y^lOU]xm׊/'y>\_h}YQ6zKo^S*c+ƴCG[Jyz |Uwvq}Qu{w}W- $&e I$$I)I$JLm ZGа,X4{G[YUny,>v^#=ۦc6 Cl:߿_P)oTtXE3#ӫ]2_5c}?k1[VOXlJ[ALO݌+}7S1z}-hh0Os,]7Nu8W%J# dXnȖ!?okxQ赀 xc1Z4Wۓ[YҺ,481tʟ_yH37Ȱ}];4ыkZ-==Ze4\i~/d)sʴ;w~_Lm-iыSH/Լ.]v r[m-;1g[]3vcTګf}m^H:ְmh$W)$IJI$RI$I%?C, |3?$,aOs?(dSJKdSJKdSJKdSJKdSJKdSJKdSJKdSJKdS8BIM!UAdobe PhotoshopAdobe Photoshop CS28BIM9dhttp://ns.adobe.com/xap/1.0/ image/jpeg Adobe Photoshop CS2 Windows 2005-12-12T13:25+01:00 2005-12-12T13:25:41+01:00 2005-12-12T13:25:41+01:00 uuid:C0B9513C0A6BDA11A8229CB21E2D1074 uuid:C1B9513C0A6BDA11A8229CB21E2D1074 1 720000/10000 720000/10000 2 256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;A7ECCC5F9E2DED6A487EBAF32C67B0A0 1003 642 1 36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;556A5DF996E87A7E44B9DA99BF71F5AD 3 sRGB IEC61966-2.1 XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         ~  s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?GlU⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*s-49% m3NJ*݀s^g&IoncOLxRk2%e,sߞڌ7\uű;PO+夡m8H^7h\ ;4gJI@g"2 a-\R⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*⮮*WOlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbVҍZ`,Bյ-5ӤQ,oĕJy<4]5^ 'ʧH3 &35HA_9 RXLecȯA Jx)i+/)kZͷYUDw1 ..suoq ?e]T %]cs*}/U+@O\Bڈ!~;U'QZ[Zqw#v$}'j,&0+ 5Gm"ilJӟȔy{TOe%Ć[K2[G]<npLa5x5;DK'/KsSe,!e %:2Ą)b1M4je˥\&6 ZS(˧<=_qg8} +Cx>o,Ә<:ڦ''1\FVcMKxثWb]v*UثWb]v*UثWb]v**OlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]j>ڹ(Abjt y^YYcĦt1<{s~g{=!>7MO._"|_~yv滀ݻe'PaӒ0 jT 3Q2l[6e㑓"(k'A}ZwNǨT4?͖ gd)=9ՔQ(}eї7&>IgOBwRF+ sWc*LO BGlĞ1{G|1nBZD?X;#*xW0" EKI&HOE0@-'..<[RеfvJ J aӭK ,]z#i?Kr2,"4u]2݌\׷I[l[ꪍr/\*I-/GQf>fXeN`(Td3L3^[YfeN?!]{upE)S2gL8AeZvOik&F؆<}Z[ѳa6-_a;mZɎ-OҬ/o!Ȳ@!Kh v*UثWb]v*UثWb]v*UثWbOlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UإUآi@-Mv\UϞ_a2^]"P24kN8ޚ ?my/aM|&G<裏\ c0.Eރ~)]G |h,{̾{hQ9>':= Nۏ_GFS.)5+]F%`j}k01u(^+ugG$P ϤNVW4^ӮxuxKkӠbGM KT ka3Ƙp>\RjnWe$W68KbӐIr S]r9c6a vU&+ksiuJ齤H=~<QrZz|<ŤزTd2+ߔmHF#5ݷ.&xX*GJ/Ff@LXM|Vow<%]I*qFxd |w&+k)$P`/A [f9t$^ɦ[Ьd#X,Sy:Jl"K4NtLk _:yɷ_otz6đs j@TSÙ[< y\)\ub>d_DúwNI*{pk2D3!&6O&25#lJUj{+kIcזQ.N<2.y[gu. wJ{to0g͆w_WDJ޷ !m1g %n"0 >yl%ثWb]v*UثWb]v*UثVWOlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*U;yn$aA!XM>ylam2su*К " On6lMCZ/cR8yLXqZkY48~_ꌜRN=3QJȊeė zҾhwaߊsӮn`vt#P$ Q:ź_$cG!IPAfDFÛwdWZt4_ ,eIe;f7iC+FkR4oEZg PMGQttnFmGQL󃳉 <9-g] 5kS#v4>璾81ͨK25בH^7)#r}6jB+&^=MyP۝d2}e oΑP$Hג9f Qz yneyŻoOS2AlØu Y!%/MzA;ľl}s&qByk3s޴`Q8\qrЩGa#!9L򡼿7h+J~u㐞c۽_Ox٫JğEC,+mNc90oOk+{)啍ƞBV5pk@"v\]{~wys?~fFsCۄ|烈<{ξC|~#$؏|ˆ^' .6vˈqJ2;_Wp8!0Z~g'I展4i=F)'rFzs5==QLߘzPEpV} \SYrY29b5$.0玜h9[]v*UثWb]v*UثWb]OlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]ҴJ6)"YVF^$jZ>#Ldޭ@¿%6f&կe&Uj;r޽)h.$QnK2YG-0r6sڹōmy!O~L8CM7-RӹphB6īOuט@mIts4$';jlfE|dGsc3 ڬ:(a{Com/ᦽ4zmKkS$zf! q~QH%_$f#NQSk^EηCF6q>rn` XYˡ61̾_v[ʔ_L]q4O—n@~]pxj9B2ʚb-͹~^2l4Qښl)Q"p½URam!fUFH͐ӐwXQ<\Y޻O/뱁ՂZ,o0gdؓ],^: 7Mm*UثWb]v*UثWbOlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbZ&iƭm-Լçi!J W݌bXK xߛ> šFIq%ӷ9rs28vkuijNF;3^jT1J^Gr͍]sI,i2,`E@f`ՂPHpRh8/L`nHڠcF$í%*Kێr1iX I헐12Nk_H3q0J4-!<2I._Y-3ёO2#*ѓ^ eFBяS(LZ41đO"N:mV[fX.hϲu:=\X?5P\P 8LkɈ5WɉP|Z \^5:]"*VHF'f~ ̤%ޒlw0=Bc(p`*9RNۭ61% ~ d[8Dh* ,L)SkW{(*d*EAą:UVD倦bbTRw9^L-e8sd lmOM&rct@hhwCBrD6.i.-d0;W(2Cɚ5 ?K.ڪ^?~aûCԼ_/0EpRl]n6Wmߗ.R\}RTGI139C$,EVS^Õr%WU>`eHp z.ec2`uĜBr!ЍY)t3]@O ^#eѐk1uH_ Ya#K&YmxOhvb:a8bZiկinԆG7nbBi9' *<Z\,Z m; S/ǚDQA%z}D2c&E{W0. &t{;"G*a<9ey?U[jE43}E[Jz;{_0[,}rh9 b~/0#!>6[uqWb]v*UثWbOlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*U-@ZHhpIKn9i>(㶙Ny_;-Orԍןh[Y 6TcaD2`$k)2ݖU'd8YKL[w>*jc/#n4rQdFWeBBiLg\Fv|1ݧ\ަV6E?!+?94t8͵Ì&Gnpċ!)2Ph^]dzvV m #xP*3&#gGwqܙ.)xW 31w?g1f994=ѴkHYK]9X׋So9ɞY== !(Pqy*G: }aŤJZk'Źsg:m1҄ C2+ݎIZ7?¥yNbtdSMgo$J-{6a\zTЎ7 @zLis*O$M 9*OF,vC,%MTl 3T Z^JJ:84?B[Gi2]\OdCScOs',<UQHK)㖧zR2R[hx_淎pV;_cx\ ɃXiZιf+`W@k ̪$%h5|[o?)`L-!j8d\X\ʏjo\-0[KwvGݙpzVw>7nY%d4'g A|wK_1n#& "f.k]'tjnt۔P>G0fv1LwDI<+2i%cJ(v*UثWb[_OlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbZޔ늷1VA_k6qUN?i**˼ik)Ҹ\n+z'ڏu%R(*:TTlayl̮ B@:6xsC SԚB F~ΙNl"E7 olٚ+!V_ǦW ,άἹ/ 쪊fn8$e:EspSj{erD1d ֣k!H֛h+Z$CG0dq^Gl0ʜ,hw_YO&@+& oެ^P&ݔ PInszlɀ TJ` N)kbE(cҔۑu#DV>M%čd$[X_zH*(@xLĒH@h$Eo-:Q6Ző'MQ8aՙ Mį^Kar-;"x*Fa+q֡eh8R;SBG RW6VQ ̷ZQAmuPo9 5 ?XDr( O6>Ю'Q_M[z 厡u%*$R2c ё,obE]Br$lUQ-]KGb4:ը]f4Y9T[^5ǔ(`Yc撡S2Zq̬Z˧5oִ=[G1j6ڽhTd6sa!,~Dƾ/&zH+vo&"LIC׵-*\/m0%AЌˣQ/ewPrʟ^BxoH WHG'o\^jq]Esj&Wω)(h@u=MF+hkV/R@Z}8DJ8եX3ؖAڍSrqmI~hn&h @T 2 8o f :3{8,ɋ'7Q#[)Y(jOolÔ$Kxi^aor' hH6)8g.A"G\و7pd5I4KLc#L;{a΍EaTDN^,zyI"YEũjQ  LxkKcU3&XZFlGl!$򎛯v y\g^,voK$Z13˥ gܩzMճ/bEl%QofD@CeRuwhՖa%$S\H%tGfq8VL̖\CPfFu:oc' V=PTP֞9/qOn?LȳŔTY}J7B`Jo#l$)G[u}z~9mk&(Nz Ȃ(Sqg&e5ޗuf]X;1܄Q-Dx=_OTo\~T1 ǎ#&%cF͞- .HĚ68Dqn[cNlH6lVDld|tZ#"V4+&L{ 7LHwO%k4' dW'. 1pd:&p.ŽDFC~`!ҭA5e\ K+?>|=dKt[ (aչTҪfQa-// D4;~ĜR%.'=mEnno6+@7%D$|p%i^~|;楖iWE"|OG'Vj揬FڬQV~?SS_~ke@sq0bߵվ WYWf2,4>Y^1Uг˦lb}OjgޟtY?\/U&?j+KV{YhXT29Ό"]Qbvv*UUOlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*iZ=0Am4HB6~ssFGɅʖ_Yvsmֵdw~ʹ,V? ac7ڥi nX?jm=Ֆ㋱ k.5yuSdž4Ӣѵ]A,~eqs@9(U}c <RI#h&<.Q `x}N._?cWF҉^^MXݣpwy6svnf-T j+d3@^k/G$LW$Lnk ng!tT{R瓖9W{^j7BF,_V`%̛!NDX`Z:IΥle”2P NfDC)uZ鑔"JRєPvQ9q9!oda[1 Ƿe&IڲBZ1h:+ Jų6Lm*U;9c.\ܞJ( Z!}q>fnNK;t`"sorȴH۲2,ӿ*qʓ,O_j n)i䧪&*O\!!KC$dZ1cğSPf +7Mңvj:8-&Z٨~id64y@ e dϱIT*s;aaeB(vFDxʤ[r8gGvi5}+xKhׁ"T+/Q>9 sHCŤ/'Y%ȏhyz]B|ʭY!Ց)xyIa02wCIDw)8ADrl<c\F9\)4]s[{'B㷵u}`(ɇlYLOy_˦V&@ZWѰq͜i4o3z:j#&2;z#\!qQ`8N&ʪSжes9>Yߙҭ1FZSUn/ofictXOs"@iKqZ퓔 OkQ[-K#t 'O5Fŀ ӽ?ZoѣXaSZ`G~ߓo(=sɿZ&4Q!aN3.AŪ. e5n\H;)xRe.CxH.-OlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*jaUMH^VTEܱ4<̟;zo)?WMtʾGP)rl ExR$TYn-58TK$R)ˊSk{ݡ&Yw#j}'aW 3X6ͣ .Qqe `o^.+RI,RGȉ^2I ˣ2)Lf֧O/%@ޚҍ˄XiQE[Y!A*2S֍ҝO)Fa %]Ge_Mj2aD$d&-"R>9f<-:^*6a @J2;)jUOR)bepZ^.i4KᗈykE)mCdž8k2]/NPG`xF<|9$$027޽gtu3UZ mu?FY8YulmҊP3nJ *  ùıCrIDPeG XJgNTk^'~e1tBt!mS5MaUZzȖdq,gPd=csQ]"7aŽO׊`xmWz;9>ObSڡRy~,Z@HLas/sw#"&`C]Ur!lHo[,U$X`}T5oI]D 4Rۭ~A9  86 )'vTy\z;'xnNvc~d×/̙ъysckkilef(PjR6W#fz_GcW]<_<ͻx:W@޲;+|9LqH?+-GOgKS.vJyUc|іX򿓈XnUZ,OUf̘7M1$WGeR}QgVnXKkv;Mq#htVԎo%[,@x+B́!q00 #{oO/ b%iu;zTXH@ RQ-oor(N<Wݧ')zRd%mSm,vigFb;5Qt2տ&|z D|Uo]LzX37Gt/8O(n(]*7B{gcq2hy$侞@ V)?kݪ~-Bf;*1yk7B+e-yG])ݓȂYM7Z{-ܧ`-rq1,zU_.\gpe sӡ|Qu3hߜ]֣X/Xߊ+#ISXqJ;;lzwך2S_eRQZ r Oc$.œxOlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb;{Wn\75X|iܣv>8!(fy~[V...=>D(N,hMG!ZR)o_dJ-C_̐9 X )xy[KvuW~:B).>SҼXOu5;G`e H1-{VOo^X3G[Mًcec*:'#l m8|]K`ef;s#ł*=6U4Ɀy&/} Y֭ŅF(Eq5 ǟoSqeu)u;fX㳂㺷.|>f!F6-溂]yTXS]01+\"PqQ憯(_>4 ؞~)̲' ޛc:Gknvi";uOVLQܱ㌒Nʺ[Y~g}m}6gbmR)K;{dJProퟋ2#q $XdC{Dr[ `lovJaqi R%ArAZ~%R@I<7n~8AHiA-5m$G>݋k8^yvPXU<n^+2X@9.\˪2D9dLj|-4幪aU-<2X$|$׋Q6Xы˩RqNqP+]d>e~YץK{{^(I.Ydi/,ˆ |[hڭ' Q2㘟6GH)yˉ`܉*DexN]e&m!8@Pסa.12 W~< wl#hfxi]ܼ;V]W3ּϿ>d,d :pS?'鿠||3 GhL,bLsDdb 3Sɼc:Y0N䣋 7 H9FFQS6z P*V!?k32c;:NF^I掷;T[D A{jy[EeEf4Hwz| o'ٵ՚n } x֕?~CCYRCik76.!7]>YtBV9G򖉧s}η7WŸr!CV"Av9}kKe +@"7u)m#Fmynt2Ȋk_F3T:hi,ڋ0@<!NOdɄt~ lA=[z T~mY\aPSB].F*j$b~[ӺYt Iݮy6%rڌS_]e%ݛ~Lƥ5̈́`@qA%KMF+I>QX!aHe5pIWgˁ4H[XJ76 {5s6>7HЭ=3GkY];R;P#|)2}Ü[rrD66ˬU$I,5+SWt6[u9li7ҭ=3n֭=@”o5qYḊȿ:ϒ=?.yQc2+Xˏ#:9b^٦O}"y-ج(ʎDh#krRh7PMx+lC1aCG7ebA6o}y`򽰹EˏcV )4ĝnh>Gړ4 $$"@gY&n?SLt}\`k-JIQ^!11 WfT.,pKnLךVAbhTJj)**tu'~I͐L1*ԯ>;fV\qp3<=X_ZTsw'o-ϏњK9<_-fCiwMᔁg}Y3@ʭ!BڻS0OlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb6 Cr Ս=N*,m^UZ"1U$"IO\*t_/"kuH5$SZrQT^{;̀aEb9Yb(S,Dq)zQuȋ+"u=O[8ȭ`Tv̘f+THWۑʲfe&JjrL4 %F>BK>rFZE1FaB6 9@)ў0{2ACojj)ZoɉL#Ϩ2NF5H;ւ&@UGFv`%aD~RΧ IG*8TDnr:;g%ѵKY٨aj*ddb(I[)[zej7HqR%P/G>hZ]Νz׶I5e̳qTU~.9%n9$s"O@X2`PJ;rexiz\H5H(2r Til2J Љ`G_%4 jXu{i1Fc2c1x=*w6 V sVN2|_ѓ_̵>DwW rxVF9;"חdXle.Hg>y:eLi^U Uq$ G7+INi^o%a)7bfy(CtEǓj>XMfT%&#Ҕ\s&N])i+MN)A#$uVGPp GBKmssݛ&x 5?g#=f=c,ɉE+;rGA9t ǩ ^KgV{K,T b$!=0Lyrein-Ha @))Zr&V$/ >^"Yz 7cҞM_jC_Hݛ2F9Vn}g@xKV'YfU?~eGQ9IsZ,#c\gPO#naOVW|=B]P$O5&G'>2qqRG?,RvS*p|vִa bSR'b+<OYjeܧ7d k07N|N'(ʧū@ :1ɳJzOcmvJ+N]xOF;E'yfJdY uo$ !6rV xux)*d R-iM叡Zq}0vA:-%Χ\QYLӦ3.Yc2ZzZ 4V-%vj*)S8JgtjsŋTp߱-)=e1s2} SX5Rs*hZ)nUXĖn28TR *FLĆ\׋q`(FܖO`qu&@\r?w̉"vezgH۷:"UֿZ.eMS;--J F$ F3ۧ81mg̷ڋqߵ<:xae]XWjמfTR''KY+\w6 dE 'qusFrfѵ}*RmnXV~-zo(M5CYkuﮰEt^EsrHVRP],ad+q MjxcLdySDs/:k0꺬ú@"z֪op^n31y/NCd.恗M-ۚY1#E6ɾ&lKt'w$~iF/JQxR]KkNDVWh@#[]BY&8$ ڟiX_c]CYi=@RȈH?Yd וb>ְB\7j/´~xr(4M";;CV.S;U@V qd(4;[]d8ޮy:~ʿ1H-:KrލԛF~ɆL]ǚaFI|&`{SŸas/=H1빮cA_  %_gF8F>BIenGz呓ln ޱ=Janu[ XJK9qg`'StMjQ'ohbwlgHkB=qwcፘ^^L좀Nf8çS懍iP],q@[,-@ʚi˫R-~@qeJYTE0f:([r VW1nf""[u@~o 91,PԘC#+ E-UiɾhǛI$vϮ\?%yB'oĮS|FgtmJy^+R%_A 외xZ>yr$t=qJuQU{8i 8~YK\V(^r?4<9*2"TFa鲡ߦت@R6iJRUEKֳ@Y}I$lc2a~y2 Gtof-YɣOT}T>$qc{}r5asmt;qc{,,"@1H?_+ŀur3g&N?@"bbR+4:XonYla=^y/2~F)(EOBIO[xp2 Qi#l %)m噜-(5JS[0CӮgX!hfhJ9IM Lsdq~ 8&8y)io7P$q,-iuhŢ5JxŞ3*3kWXE -ֻ A۲j)Oa%}nAц>C\Xd21QDr k$.w'ܜXIymIO(Zr1%yozw#⛢!.~< =EX:Aiq߆P57d/_OlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]>Tw'[#k͈ ;p2,~YEސ Qغ%lj_P%m]aaŐ+y#R?C ƠSq!6ʞ[ԭQⴙZSoqe eFy{mmFفC9)Œ' 2nZC4z#ePkPdԟl{eh1o{y';'qLl XsefX^kĒ ɱOnA3<2lVU'r$-2^[꺴W&yY$aBk![ՌBuz((^kڹNah'#0C)^DxA& sr[Kgnn. -U _jd!m=WNVPvAyU;? rU_^?;YFܪPO¾2B- T>bl zAjѥ ~#-q'ͻ hMPJCfj0i"*`NDD3v=6|ÕQᑉ^Gb2"}L-gTҏ45mp4/u URr&k#)C*\[$rR*KV陸5D\a{3Ƈj\Bz%aJzƬ̯%f_,bmڭϜZZ߁(VYk|\r t?~okIQGR8wlˆjqlF{k` K+"85 v3 16վ{iZ(^H#w_tc0⌂G42Y]*GĬ{ȃnI)6Ն:L2w+(ƒՏ>lًT{;SԖվҦsDnG0+N ܣlp^N)MUVFF?*Tw8dec HU邳*JhI |T%% (͋:7sSڽci6e5=)!zۤN`d@FmWOӉ4?i&'Iv\Ḽ#C$ ~5tU̜2qrߖ|kդdM,OsRg1$ً7H.DfYGV; q Ӓ\&O$LdEϪ-Y=.X+pCQm(gZ\NC}a͆-'t܋ۙZZ\?ԷKj$dHvӊJPPf ˡ!g1]gE4&YfedU$VB>ieR ɤCy*NUqV=iᔸC8"]p%ċgEOfmm;l:0C"cM&i5U%kb~|ɴGF 8c<:KȺA=DX 4,!兙d%]N=9#{bڡ;pH\Lt2¢|Ǟfx3km;IrEzVً-7 ݟKw kk ܊Ҍ{Zfs1h֖mZYƱۨ=2e>; )ooOlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثZ۷…Ĥ8PK;T<7J.TӑE@ZO|2f ommqQA/9re\;PB}[y 8+Sׯ! .ז|yfm&-%C JQ %a#2☳k[̺]k[u rh# ;g-nnu[O0iaBzqPIn˕n߳ _;{! Ƹh+4:Z,]1F7jE3-{WTy" qS$bg;a' $T_gm3D:̐j)4/HU8?*YoQowh:~:G$QB1~D(_.1٦RwhHk%ZmT(*U<D+14vȌj_<"\ҽ_G ˆR-A?f<6ykʶ[뤍$B@^|~Ӂ_v:>{yZ2Ȣz}+`<Ǡ2HVoJ6 R?5\9D]P6zsFt?rM/`2SH&Km_R%i'&rmN,3g;:!+ @w;7SjVWJ5' (iOce(o`k[GΛ3ȿ!#sWn$$S_VKهOd>e3wUo֬z ^a$鑴Di,ᘏ7G1 ;CQe٢gl^=턖zEY҄wswH8hataoUO7/n.mg ;/W XSD_.-k(~e~MwԞN>vNK =2̙ŎhEå9:Uz/}sqbWRQ~Ȯq9 F  ᑶ|([BɅ+h0R[­OlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uةk@OliO3bwCGI.ML U+!S:~uk:I2KRX`֛WȎ qi5BƧ?QZiYW2SjǒA E-CL :Y?unARcMU)<_ٲuH1*PZdİ;{CQ\5IjȦHdXt)Hap&*w].;)UcǸ0BCT897ǒgFrD_hq3sVeӴ=h;H׎FWV nF>?!YE0II$AvtYX*Q#lFe<״//k2nHs䡨6#%lyO-}~^zԡm&m!T3]3u D%>I4aM"QBjp*T:BqFU^[mjHX}}8T ޱmano LO jmrh{YA_^žcVY2amaifivm;*q€j%)fN,}$\>]Km?B=*qu#F/y.$SA$|^Y[~x$ -s%iΓlKd[i"%@ #}/ikj&]~8^$CpI]YN,wv!ܯ~b[VUuFjڪzN@oJ했5ۙy⮎=~(54eQFř{\o1k·a6vEZ 2'eIڜoS \ZIK~><ㅤ`>E+&|ܩhm1MgP=4q5Y~Uͮ#q&=q5O`wmUlʒ(1?*3laEJ{s-c'Q&H#vf$rjmSF}-,lȭ"tGTb?k"QKaZ5R6>ƞ?7twEizSO{E׈&?\QՃݖy[0隔^JvD`IE O!Du[eSK515=QWtSB4.6QuѵCIi1XJíxFd ɮruEQ3^Q[V3i̎'OGD{Aug5<`91JٵMR뚜aƾ@d^W6ȲQAe +3,0 @tku? 4G&9YG1 o]4&6v~'J4Z[_OlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*zb14^cbߗ(p8Vo'5o&#[@klXa2:E2!uiG^20V7O׹3 Fe"%Yem,UKQڲ Ħ@;{mF7%1M O0$:zԗWo#ψf,90ČBYIy'z˗VX#;e(nI*n{" ~{[H,v[iQGFUNAbE?X Iiғu=Q,VȳnT01A6sۉޓy:F$JDk%{y]o - Aԑh->e5>(|M*@:MjV7S wA`w&F.|}Nptf_ *m"N, Gu9nEIp:D1H@'2 TCs=98r,LʌMQwN|' o.mX4OT1y3O*-nQLAcAɷA2r]Ii.$mH;Oو~Q |cUF`SBYlt;.0ƔZS?c7cP;-ˑ@Nȿ.H6EgC,;~i䋳-l` 7 raf7mgԵv㟘մ"5eJ n[54ǜ]+o,Zmz?^ S4 r|t˩ e ,>$ HS5{i"lvqCOqT{_XEn̺ᴖ׍Y#W2zJrd8v@jd0.m3RDJ?u<9L%g*5H4I|2Hת|JfC3}k *yrrͿ.5Hcjͦ00ٶxcYˆ,LEj+Yb'FޡVe ֜O̘mc8ƥgVֲp5ҽ4܀}.J t]WO {jmQ;m];T'`Tt|DJt0F%Fq\èE.N)fHxE(.Gkeʴr)Y7GO,en(Ɛ[0$iRK'[}:ZmPeY51#vQלx"bHiÞa~z˘;< o.ݦ!ߜeHvXws' -SDAAMalښ@m"$Y=e)N~cN'D1)%Ff}ܱ.湳5'+Nno"?ݦ+e"6nÎEmd zj$R]J@B[nLk.ӣt>IR8c{bK).|q*Z_TT")+#m#PƩzq(pZ!`TAh7 Pl0%UثVWOlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbZ=*o|UNI$/1Tv( -閯4!ij5H4dg7mcyjKjN:|-Aoڃs8!lN _/RZe!':O0YL! f*Ϩ3|?r|D9mVˆ{ NrDG\(hP`@!p$bŚbOH?n)Tmcj%[HīR 0ytdu9$6nl-~ b9X@&`6lBZh#?:bm׊bM= idҿ:!PYr9 >g^VҞʉYkVwP`v;8qyb_[qZbTU S \\S9ei35/0.SRIQOH*D_s*bӺY=2G1Kxz'>؋f` (&^2ivSFTO-|CJ-gjx1Ж{rv,N9 RJPS%ͻ #_vp2Y^ ;Iⱆ8lT^;Wݻ&c(yJG19ڵJt9"6y;ʑy^]-`v7ŔNRY7Ye!^V`h9ǿrrL2B4#n=X=+]W3]\9MA922^ZW% 숫B 2?^BQLs$z#d\ ˓Us#e5N%F~̒ |Di*l5;qV*>G%lKg&m$PB 8N_H53:HEgRb}iقScJ^YCd C(;mc)%B4R]Kr# @Z$N̓[qW}_+um dZލquۍSQݭmn.v⬜ĜxɆ <ӝK˚uǗt_-vxuN Zo|s\“CӬ|wYݗiPdIMqd})&J@|]Kay#V6%5b?<,t)ixX \ǖ;`ggwesF #ɻzO@ⴉctӴk*U7(V9nwNp@yYvzvo:ᷔ'zz[Z{h )YQV>qz 0!OEj*^ׯ&ʠ;kj|7osq5%~ dCo*ּȶ[mON!oc@21| v2zNN&?46P%+$„J6u K;ޜ r( Uj qB3O=,x8S,y?V SS3EFbnPdt"t@2\0wBxV>'s#ml0f8b鑦V i®]oOlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbTV+=1TXVA,ݑjV*5oY֛+}Ǧ bp/ O@&xy,qk m, E#ĮeBn<#Wuccn2A<ͯ XO&+m)uM3ʗz\隙@ pqƍs!#It/(k+r^ImL4"䰶[{*Rq<~  kS,AAni~?'Tyup)Ġ@߲8'[TB btK}JJDye|Ĕ7&S.(adGRHGjm9 o9hwBK ?MVZ,,A"s*uOF6W_ޟlrAy= 7Z Z޴M(^hT574eRɻ`-NhRS3ƳFUѾ+ĚvZ2T)8K2(e r4s+q(udVSr i>Ae i K@~d l@*e'S6Zq*~\T?E~` 1zG3C[sn"Umۧ|y[2Ywe4q%@EG,~2DM1r%r~%{tcsQ nmFyHH7qIJ/.yڭ&1CRY5'(ׄe>Xwa5ݨ[\Ċ!LŔr#/>YԮRŧ?)!SfK;U{3]JL<ݏ'f#j= bwh&&y]YnTmiT*}gw\BM+Wv$)m 4A^꺿t4SEK?%P)?tUTspg<[1mn 2Ek!v܂++G+0 YO˙:}Giχ1hݤR홨Y:D5jP0_Lkڹ[9X$n<|^jWe-M=mh#iUH9 x`ѯy%c4.siz6Eh$u'c RǏ_3- mG]sdFDܸ8/ƃkSͥ[Թ!vGUX~HAow Q r"&|~^g(+gZBb" GOcO 7q=n$GӘӃ8u݌-m|A=Zv$z`  "Q{]Zye{9 j~Zƃbj0$tI$FuDž`(/B3[5D :L.-1ɿIwQԆM>g2VDޅWoYHCd lKČG 12TU[4#y,q8>e (ox-̗O/)+;g=S:_뼣ŚޭF-OK qDz=JsNc D **UثWb[_OlUUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb.[>WwHh# 3Vfx>U QL91-ԳqTDo(X*|rII|FPQnN}8xxmkZ2ZI&9uoҋ]嶹bkzU+DT3Nrٌ`,U;˻*jƔ\'w&!hryMa9hmdbȕ;,yڏ|j0 oH@E*Ȃm wO2^zxj\xT{}H2M<׬ hEOHccͭ5bn Z#S[.Xq%?^yj'WOi_T$@Oߙ2'/sK1I( C'ا_Eb^oUnpuXꖪaI)/$¸Q]7Ø9'Fq=oM% RV9ҥdAӍ@+IR0ȤIq([I)~q^_o ?n :z2+0s[[:R}KvzE!گ1_/2!SIKѝ%~&QP (0I^;c![1YPr21u.).†2\At mI#4M2[}W"J4ۗ戭iamqꤿɞ_ui, F2CT1 Lt>%kersMnD ?k02;9x7epIM!tO8iCK,vܞRFC>IRMƿ\1-E,u{9g:@RQTz:moނi3TLi7ռǣ~U$OXs3,Fry;aěsT]WT˦^K ^)ʴ'2arf ukqnup &ՙq LOּ!o"H\tXBdU?ɑA @|,ws@W3CVZxz7yhIGTǔy/c-G˷QğXӡ#bI Q'.3VCUkA-o)2Uȡaք֙8ʘvqssGT [KY#Pr[{+-JPrg#LA"UJ7i-fQ*M =~Y `/eH9# ;\!ț`DrVdҞLx  $B' L0\YI1?O2-Gfb US 0i r!ML9J%PdO.⣢꺿ux;O*j-_̣qħ/^{NaIE1EIۦF:Nhɫ' qG3*Ē٭vr=mEd$(_2ͣͦ;T5R 7 Fh5Ӎ PЭwiUN\vP(nWmK%K1ߗHH^6+7|1#"m{{a)##_oj[3pM906?"Vns+U?5l3uKtSƛy%񰸕1*RV`q^1?s |cX:mh. Z؟MfE5S l"hdj1[P1)? fÀ::!n- vPAAe lu({*KY ? G>  c3ރ>3xz7R^A 2g_TZĔp7(}̀92 .-iF&FӏFO "y+[&:Fp!t~ "hͰ//`qVvt#v|1{?KI kOM 7ŖLkjQc[kp{{ _ڏMZɅRkZaX6Q1$R$ ׾">&kHP(<1VWb]v*UثVWOlUUثWb]v*UثWb]v*UثWb]v*UثWb]M1WWK-{MӇDa`RhIREPW⩥呃UyUETBh9 d|5ɁL X޽duUY PN]X$Á45R0f¢e$7ȿ zx sڕ=A,Q"XIОS*,:ϗlnX\uTl$mj|Uۅ(O"FBkrg=+REK HE*iLlʓ+\@=)bjBE7Ye:gu[ZZUr] N*LM= >|I| XUV+˺I, V/×c~.980!꺞\G;-NAD_#2 JJmC۾L_Vkt\ODFi0+Ȏw$m;K$ت0 P2LyF!};=H".N{1 w1T%%n.= p!M,5 qXY9&$caUX@ !gݾަ] GP˟wSMBVg8cWQE<з.8y ЖM;BVN4+4ܽVR\DGʿ[#S2X^9wIbK@ڧ jrQSry#.iz%ȆPO*Z krd+UaB{q\"MsJ FK`! a [Dh.^//jt9*$W7ɣj'o-1B+5>-۽:ed]8'9R)mne*C% [<X^٥; RCkcaSmv*UثWb]v**OlUUثWb]v*UثWb]v*UثWb]v*UثWb]ZykiX7^?NOPbu3-c^JI d\Z)TXAS+0(ҶѪQҕ_ͬ͡vvt|p*TSZX ~[׿7evȩV6 7CT_q΋)*@Cl@jwwDI4܅91h]\Jb8 ܘ4Ӛ4im٘J~ 7WdΦἎy. I .\ǔB4YvIjZ!mA*?*2$-:a[E,7e27Rrj@˚Z)+F(DPjQ*!Sn8&׵ fHɾm PVOVq&&}.Ԃ 7',1ѼԻRcZkIqZFuWFE1`tx!YYLmBZi(NŊԂaO"FJD@2PiAj0!qFI$`²[6Odki%3U`:,T|9$NjW,1Ho `gK|RjXl (vxa1?huZI攟UQ@#M=Fb#4`0`WG 1[,qR2;{ker} W-F6ܷ2ʼ[OLg j z x -+SJ| 5K! qA1 xY~#bGL h"/ d]hK9Q-NQb`bieqw02dY,FmMYWPW|EptW r%lY ˩ r[, {fn쇶)yƵ">&?QX"!GF 8}f6c21 &'(le!9eBXaĝjΛ6YDҳBkiy,WʸXٔJjӗOqXUk n=-;.|M> ?\S&m=P2ʛيOJ:Fe:u.Gn,vaO MZt%#Y {RipZ ZYT%esdeԵ//tХփӟcWqW>b괢cg-o,1^'Ʀ[OK!%ϣD. [6$qpOWoKvA%hЫGƵ_t[Xtcmav XV84fOmZťm5d{OMVjP5rf? G' C^F'mB+g9^@*r^?XpqԸh䆎#6!qa^a?S]q$֚h5gu*OWك7 n#B4+E(K@$$ `hmS[G[9?|UVWb]v*UثWb[_OlUUثWb]v*UثWb]v*UثWb]v*C1+[G\; W0$0HR94(96Tĵ<4 +CM+O ԮԹ;ۯ´y8E) yI9%_-R:St_K2D15|k+u_)s {w)]Y u_.ZI娦KPMrU15^!爐2ɢ7+Hlh_pcwEϤJPδ*w?a>FeH)5 )ї^m5[%HI㺎Xd>8):@m.0%Zs==ӓ${cv.<oqF#s ԗ,A̎RA3!ŞJE>i 5ds`(2 8DK?%\ϪI*hq?%*oiN5ZiSxFxxT`k[ \ȉMMwvtۍʲo@G52^}23nUHXh&;Lq}gj-b bm3&`[ˍ{z:}zGqҀsq'taLWN =[v76@Y4 ĻJX4=jWVf,[N@+,vޣnDᲿZHcAJ sWT21VpHƕGZދ)uDCRF/_i_B, gS,YRޔi |I v8E/ -i/>%1-ր><|*+HQhDfP8*X mbCr\גͬZ6.+d)E=_YUh6yz^>$ڙsƔ'hC'e^ SKx:B" %pk.5WDzܟ w;][lM<, k$ON1brw2WIT0^OM_%(5ղR ?JvvfL@f;Ց@Jo#Ic_n,/٥8 ,#t֑/PxX4-i.{ YDqD ,_aq7ʗR..Ɇߕ9mR H AǶ4/INY~4⊫Wg0L%&8+deŽXcaIHt.NQ zY$%5w6gquu 9;Lv_gaӐPݍk6~SKx$zDtۺmNBҿ t =,˔A#23%o mLrJôÀc}ȱԐLϲ(bvv1e%]^bxϨ87#rD@}HX@eܖ<99\F|iojVX$ )CN9o@N1hGAbbF8iod*z⨕Z b]v*UثWb]v*UUOlUUثWb]v*UثWb]v*UثWb]v*V?\yA㒦,;^=HDux_"rQlLa/{+i (}=/Nxqc i|k :s/j|mۮbn$ˑxJu뷎D,NM}kr?p#%U(ZSޘOӶYUɮDW|kU~Io[eoWjaBMU0r`6Z+ ְ"a-i&)Msrڿ5U3QѸkCynD^iƄ3[H@$ߡ?d Yqb^(qjQIN?bzrL}0I/Y.k "][$Ir(H-蠷*'Odm+T{Zfr֜E@>5v#\,KX}DE$[DG@5fDy uϘ" :6f90EYqb^rCw(Mzz_!`qwhOXu &iP!V ʵ=a'`ޫkZ#Ƒ$6d'>q̘)Fе+yL~-d8'c un\p !y+\[@Z@B~^Id`quΣZZ=۬Qv%ylw beZ|=^Q$X]V,RHڣ(bt7iH_]s:9?ؓUpyr#Ϛ͖\Hyfy )yv,d<=lUm,no&ZC$d@O*m|cigS\[B5*n\O҄knӸ%ym󯗆pvOQb*jӽ<2aX?4./P٠1 sZ}-ZhΫ֒M-cAtB5RJmpOnt)ZjYťыSK<k_1f kI5fCQݱƌ_MB^w4yk&0Xp?hD~F[{gv@׭Iv%ia$̛_/Xk)EEZ֒|Hj?̜sBM2Op֑{P n\!G]cKm I%`}IkN)s=Mϗ<{1 Hѭ7o1.&pyRֵUs#Z_TxMVuac"HGA h7zٗ'ʺ~to(,C!i"r"myYaִxQ>ei%EM&wЯt?`Kv_V(9rVRRңf3$YEk(SdZzmi˗U^Ww%@Ain QTUeWbQ1+y4FDD%h%-iVI$rAUɅBiwEږS10JÖ֫^ĥWeɴ/F^)k rԼ}>YML0r b̜Xi˛[|a>~#nMc_b?mIbfmQ-%98:*mLHK6)·WSb>j "w4\DAJꪣ'+g\˯jw6Z>QYi;\/j|Q%D, ?gÌ3\]Y^RwOFYK8ELWQhZ;PEzʕyDgm^(#>.!IEEIE C @M-2 R[1Wb]v*UثWb]v*UثxOlUUثWb]v*UثWb]v*UثWaCZF~&;ПK!Co[M3W] V]$|*Z!~%'l( +J^Ky ht X*nMC*J,[5fk诫i|{o [Jy? "Rcw` +8U;_iq"Ο~.*_QPoeU~ W7ƲJF)V ?TY ~SKH3YD`?""SuJ/XB:aeԕH7\$g=EO^i޴Mrcp%ie$V8kqǮ*\UثWb]v*UثWb]v*UثxOlUUثWb]v*UثWb]v*UثV£hv4k>dѴ{vPHdԷТp,':&OnO )z ]oe5q Tbϧ]Kwq+<3rJ8[+i^yѭKUG}O.ʸ li#-(Sћ};i!T5*YkiK"jNaL ӚtP4w]~*W,|ˠ5WO15`9 sj1vWGImm #55oQLfLc׭BuơRz7e`ZA.5G!"E־8u|\,]I"ڜhW#L*/j夽uEee_ei՜-U1{v2BLJ siO~{dzι}sZypח$~cֿg$ZX1ǧ.%eGѹPY5LUo$Ce`w8!fڞ,ìƣN F8Rj˘17&m%jՂha Lٔ,L!3yO]}f U$Ӎ{"M.A'F,^ufHn_YVOPQ/ɍ4-X>r,elYb4X~ǢNsIwqIgu';,˱ۨymT$sOnjz8fixV >I J(t(ↇ琎BSǮ,ZNKlQޅ0ZW\ d:毘gj4 "%58&nRv0~R<Ĕ浶Q*5I5%v5pA6ijꕫK˚]osfZ)~^3յ H!_ӓUY0GX߽¬fTG@P1a_yR7[ˣ}`[`tb~/S=ZEtCch+i)XNNfOTPS[_^š*ejcWr(ud]B6"d4To\Z\­jH%aRz 9S^5!羃#Ib$^Cfbk nbǾ"VK(J*cژz w^QK.NtU2Ȅ0O+ˢZwWm~&d1 BUKʹgYM/֒mU 2hHN1n3N$0/UTNgĊu9 nՔGȩ*nWO0 ,؍45?N!K{|rfy7$2ği#;A44H3Bze4ae'Nx:V)̐zw#plolL%KHhN\y~܀F]ʸ%AakZK2(y5'?4"pAѼͫL[[u÷&*2CX AR&xw6čI&$%1)lQwITh*36HEFZmZ1mj>(XWzLS`,~Oc|'e'44i3YHbl9xY\ImONsn}Wu߼a˯ǫ0ZA=؞oi.uf첝ԣpFlpv [|,Hߩ̩70WoD$HЀ";5P`%~lo:tKmwnKZjaY^HjC6If?4<:{M(\2 u`yٍ 쥑Om;Hm4UX7'>m} wtLҷđ'޵͎GjucquȏA~"Wt1] rS]3*aҙϩNDYMloLvY[A!l>o#ȳ/3ɩXtH!22@[>W1I-}'ta'u.UV(t=~ٙ`H[o1.$9kv ^+b !z0(0e7.4Y4NǸZȫ(.mX[~hVp*oW#N:btI)YB^dp{w 2B뛓!NiˢhRCYjɘkdi&%ؚt"\Kxl!imDRĠ )M-Fbn>צ=lFR, U}X @ XI+MxOp)`ү$T,y7ᆚ't ?1Gu"$֞8)47f/-hMkHfQLkQQJbK -=[;(cnNG-c(co*';oO4zT4tҴ$-5mQ.n53xT|qTUQؼv?!hwr*k_)vqZk:iy˕ū*`c5SV. ڿѣE$|Gl >Y/C\;][=gY,[FUG#I|={QT^;IYB@ZTJ"U.@C=}"[+aBRnC8mJ Ԯ)vԅ {m@jkӵgWee-%8JVjmL7:엺ÆƠ|QBEr*YG?n@|plG)G#HbƙL )mG7 x,z a!dB6OmrX E)|0S9qlg\JՀهm^%ZF ٖ浽!h>ik nB~G9KɴjDSWvQu-"BPSw &6,zJtC5$ :{_͌5b|{nMWOWOuBv2((dIA1=jcyie#%)y rcZ_!l5KƤ@^W2q"YZ 4-s"܁ds)NLbgv9e2 5f[)ywP$ƝlT0r*?FLC/4k(8%9S&A[w5nWp\yH(їq  ;Vr8fw9E//XJ$ SFRb躅冡;I^n-)#f]exr2t:Ec \6k&hoBh=Cɲ [{C G1EɮE /.F1;R[w2AI>g.|>zvHB$#1vV -'1~ueT&JSTm^zt+}+DCt ž)Yo0̂kk4+}_5tgl4z"4G1Ѫ.PAfH%Hߩ$\Cա kLH)d^cV[`N1c„T!$&ƹ!ZKG#?V-GÁG^.|k |#4Sũki/w;IڤՍʥ/lM|M&֫2E | ɒ᎒$yWߓ,c 1|9/]bn@)yL>g"Y/xД_J'Ꮵy#mIq\ {79WxdQw&Ǩ`k\*/Qu-JR}YBhw8qVeMӯ/,l` >U {i)m4 A 4Z}U7eZ*|%Lm|egO֧lxU,QQ #ZQ鴋SA$602)Qƴ>.T <ϔt <T% H@o%I5oiQG~2}U1hגL 2srue}sX!~FŠS>Lj8RO6? WSo-13HWi27 .-$SܐL58g119Q<\I-c0}+qeScZ+>ƟfOl-k qU^?`fBRȋQE%%zîceċR7)Uk7) IM*rD ju"V^7nIث<}o|bh-۫~03jxD2 7d4-2([+#R0qC*eJEzu2 з÷_a68sӋxr`'ϦVۀGxC:)fZ^͙S1q#)@/<_E;Nf0C wo۳?k1%nH0}>9z/8VMA$H#X&x`X̳+h_(,<Ƥ* H^D0A] 0}7Z|H h)VU_NGd"ԣb9m#`y.3>]JG4 5 ۢ 򜳱MءFٯ/u=]5VvS{e-Y4{-.[YF#WՊ ъ6zk0'mT$S_*UثWb]v*UثWb]v*UثWb[_OlUUثWb]v*UثWb]v*R1y\qrO}dX>gf=2)V D|d,=ƿv P?dCfgw[ƷT\ЖQʣ2ٲݝgJ4u YnktzWjǩYG uyIs [JbG& a-ئMeқ5d(<6^Kݢ?',a-gMP6svܷHZ ;o˭)BD%MIOJ;[COe "K_ LAK,5m:ѯm;۷z2q֣阳ٺ&ҿwֺ"}f6qa{5* u\˅N|p]/z|JIFXim瘯ü!Vب.q!aJ(ƒczg״u^;ڵxWP7V$Kl༲"=oYOpJ€-86huk0C?kav0L.Mu ~ |..|}ߗ]fb[<֐ ;⹳r6t eSmФ/fc)tYx!#K{L4dMq]Iaƭ͓ǕP jRΒ}QyO #q tV.M_ 䶃VhBP !ۮW]Ցwjѕeo{Ryʅlulj(iZqu-5qG჉ ξD<&[ żJ>NU+&Lf[K_F4nIʃAxo0y4߅_X oMC^O#-O(aT{.~gy9%Iocp$wdL,>0F.'B̈́eH1)Eż77L5-WO Z~uYmXuw]`1Qx5n,=ǁ̂M!Zҵ#ʽ>h8m{< :>\͸"# :l+&VB .P{m AR"]Fbzlh)"M\/a$NjbFQJԷ\U24g\^VJA \Hc{~VX,+I+u#d e q>&cQ&i}{m%6בԆe<1 z|?i"KttZB\-΄"׵ҮPQR:=YXj֥KjxIۑ 9|Ms;XӇ Cj\z(lo@Y9,R%P|o-.@5#,n#nTEOrvJ6c8t\}V,(da]HcB#1 .VI0bO R}Myk_^ I[gQM տkpcSGg-t9+I59IKpmo`RquO ba,8(EX i_a⩽qqT^*UثWb]v*UثWb]v*UثWb]oOlUUثWb]v*UثWb]v*BhEr4Y0?F-COnARӶL>ot$&U"|&rUS2bH+U~q>XbO< XO\N12m'^wїjܨWС׼{$7 UBxҽ,lDmk-'eiJAsVCmj%n&B^(#iN0FuH |ywcKS@ⓙ9|M2%>b)Žִ{h@ג,6crvۯ/GTYfe1Z֟FH`E[9k˜)NjTHŖwuiy hdjTpaXvz*euܓh=wm-3X'gi @JlbZn^ HS/Z&ޣmM40ͤ[WiQxCpFQB2D':\R}KdlO#l̴w4_,+D뉅U1\d(}di>FH@˘L?Z:X[{yxj~ViY^mq@$UxzBч&̈S\_k>k=E"ђ^6,p G/ |$2y H\"'wHH]>21Z d2?w3K,i E u?&t a*B50,V^du-j++g:8D~Bkng^iUԭc-bWf%XX =+s+ 3!I5umU-g[j*_MBl/GMN51k&FE oJ,K/JY76 $F\47$PҾr㢒^yg{;VmCMEE`l~!>._ȕ03YyPdԽ c^h!#m/NIӀX5}u,%Ey6(+R&Iori'^xf4cӼ_%ouKCnN[az$1 +j#DUQ È늦j|1Trl)J Uv*UثWb]v*UثWb]v*UثWb]v*UUOlUUثWb]v*UثWb]v*,Uq}ơ:U;Զ*Lã }E<ȎKe[ 6PNHI켿Ե{@iY ϕS9zm,G뻋6_YZu15Tw xR,aj$zqXwqo EpyUx􋷒[^bO Ink|)9k\#Zݏ^ ESV[iI|boe~\ݪ\yXzaQ!`g2e{h6D-y NyZ{efLկl--uVQ@; Ie_, 4vZTP҂Ĺ(M_R;is=Weh膹@>ieK+:2Cec;H?#FϓIX^Y<¢]:BV)-Va2} Iё+[?waK[ eY#d 8Ꮹ, /D'xm5LB1̳dg0'aLI"TOUb~[zf4YZAMuسy[In[SRѷQG$E=Ru]Z9%I7EԢ*C.V6aU2ׅUC;1I< /Sx5=j-:yq M?rCf%YyI Ko>sƉS*Ѽlִ)RI> #n_QSF3y6m5pz"8nU~.BtĄ$^{vcp(YC//@6EoHȞj'RVG}e>hE)y]V;Om!_jhTQO 3~`4^ڤ7CDaBJ+ 2񇌸+׮'yI"@RIveb)S)5\\uE #I%Zօh鿶 8Jl6B"p̒Jm`Q-^Ð8Zѻy6mn&w W8YZzi$ .B#Q[Q?OI6l̞sʴ/ڍD^lŀnGsœ&gy5hjj핔՞~`kF=oU{mO/bbEryRʡ4yD̯k 8ԖEXPG#) a9"w!x7tcLdRkyWv 9@g~S6 VWm2[+3QET].[{9tf7#|D 'Lti+KOq;~$)FcO(ivp  =əIڄr~)a9$*y1Tfl1UE}A>. 5ub48SCӢjTK4jE>LbOCV58R/i[f>M-;>8~ƙZ[,Ol@xiCMx6O1yMZ۠X9 Q*Z$WZmE,bӡpz=@V|r]SKeyDG2Z91ݘ;"=^s̠!p8Jv%y@oxR$JҪ£K)a[jq, +eN`i"WÀXAd4dvʧi3>|h J 649T7D/hZ:eґs% ,4O.x q^T4`tnXIB0%j_uiіa|_G %E#E)-4JjЍfvSN\J}&SF>ٗcwe0utއqOs|ߪZ.!a8tgNcJqG"2f~U/iڈD?D]ʥTY~NYGƳ#|M+ES؞VIDu 0hlH`Ԓ^uuv]V`y lAS2tq*RҵЗ_in㜃Eu5Uru@g^Լ-`^)c҆\szFuki%BK!`%ZS^ 9=H,ʗ~o[gi䕺0?U|;Xl|eóŲ:Cܼ2FV.׽z iBCy?CV=?]A+ƨUkd=>Zle9}] >6g&+5uZe dwIHе C#GvuH3wMwESfc!҅#v޴cB]tTO)3FrQKNL BX@.eC sq[kV& \DDl-٬ YٌSc0uFhdN40,S aosg>z.! q/#VRED7Õ7;2ŰܚumViR.?cOҙ0er`_XQhi7VVet\OMy=1D-VaJj(;W~s7g[IAM5je ƽ:c!\p A\s'&= (;AWYZzIh;Z^ޜRә98IDy N2 Hơ0.^9q)iWc4H5@IUbAY9u%RB*r5ދCsU56Cf{E.B8TM)*9F.vFӖd턅2; NNQd;Z4= )jzMݕWf%{ V4?S,Kb dVg&$+*^x\YDmi.dq Cte\M.)-y3JjPֿ18wjXz94f#sJ ޛO.gy;xRg2፮YP6Lj8$Peb-FJ1?-Gt:9drn>L[# ^մR M3Ct1|&HDp鐞6OQڬ_g56\l8E^C kHGnPh Фa>OL#B򽔲6fHu5LuaNJ_vaE~aOmtٞ ޔfJ26S͚Ix(Ubc:ԵX}VFt(D&{/Su4ա ~&LVC*s+GLD-B= VH61O+_I$'8Cp<@5GLˆ0iLUw'(Q VP@}Ȉ2,rh~fC#Y#nSZ)ˍ2='^Rмo&G.y4f!FG5mN{lIqC)m&:q^aALzxĄM#="ڤ'kr sSվoZdm}HcơyMLQ*xvMr]Γg,r>yUhĨiV GPf4m׼];F3 ծQLd}~!ٚ0!76⨚]v*UثWb]v*UثWb]v*UثWb]v*UثxOlUUثWb]v*UثWb]v*UC][s[*R=yX=AI["oE!}5߂M[ۋ[5@ZL.JП R0!ʄ!]‹O |U׾4|*݆D@dZ5TL O*DmvfbÑ |9lew~Z_*KhՒT\;'d/LFIe/M+(f0`|}OqG9i+Ui­(Zd'7=ʣќw*@CE~%!H݄U=hs&2q"yĉ %;Ȓ1i5ƌ|7/ĀT\Ǚodyz0ޚZO;r(O~bm/=R-.hd-Nԯ.O,%GV޶!+,-EU(I[[#Ġ&m#gN{lkP}D~-h׎]t[(VRNN@;1aI1 sA GXĒO|19h}k,h 'MUVN`,Blc'5V')>b45*˿%N'h.S,*h88!^%ҿ1mqWÑO>W)g=a֦̚>Ee*{21ˉ Ce- s{q3梔xe\vS&B*6_c͆CqE'֦8AጔPwpUZ@N@br#;j+i };.jɑ,1Vm%CJ͸eLj$yxuċVR,6cfB@RQ[K}j-" MY8 jx@OEVJaSӦB$2N|w (lV6ٌH(;faaBMJ S/H4'|Ɏ8*iol~(Ir9N6υ jѺy:jd\:$2,$ m%aKnXTTF[o% Pb^r! f۰ n{9Ò Oհ6he"FV ImFg66\NXcJʃ|"9&0'4Nb]aVxK5mˎ0:+:ϪMyڲA])ǢerɸeTܷommɎr|e ޛ̰H 3/.t3P#b:JhhOjmc2;y@ڵLrĊ DJ$2&O%'<}Y&=9 D'TT̮Ђw&;Cʝ%Q%(~ӷ2b A5*[bxU~sŏS=[2O4/ if"iV9)&|*z,ñYT^SEWzvPP,' i:ƮŢ'#_M$Zv5;1ksNitX;],@+!Nlk˭[;]:gt%HB(֧e[U/5Nm:+RKJ d%PRwq"6XjܨÍ0%^̈́3|?䁴R{%խ) `JY*=+)S"$ˣ)}|p4 j^C]7P`Z5OmVI q7mWo.9Hn5z|\^jMF?7yGJEEI&V%lq:6FFj@;NJIq-3۷o UثWb]v*UثWb]v*UثWb]v*UثWb]v*UUOlUUثWb]v*UثWb]v*hkI><-B7H Úҁ0ҖZͽ;`UZU5;dW0N*\M%V)֛xb U6pia%~xIKtra_^5_QZP 2}[ѧ'ZYlT@3#VK7ӴxYAIxԷ>@q?r6cߗ%HyK_OMՉExV9sb  cKK,6׳TwףU[4ʩ%` kҀ-d&[ݶZYzDTH+SeR_/k_ӠGRc}4"Ŕmy]XJѽH;W pXdk9odoJC_jfwgz~yNMS ]r a- d|4[LH<!Zm> S^PJuHeGɨ[qUƘ 9.#L>Ҡc+C(_HjmEGZ=˽"R ҬPS,hkB/5쑣ξqU7mĄMBഀ9>Tԝ{ف'#b@u9:c"{} d!xQJ^iL솼GB=(hw%8h 6Q2n)-Ҙ"eLݴAo*ҽs.NJOUTx{"7<+C~!FLrZK!Namf&-݈=JFeԵ{߽M, OQ+>ÕlMw~mR V=^\HPm۶VYjiܲiިk]`2|*2J*#]Rv[þ* ܜUPv\ZjKO``to5?#_J:f"?Yt_X_Xՙg&2 ]ڠSeAa SKMҙ&F@RO*]x9N˘Bip%ѵ+msO]\bHLo Fnɲue Ey_LvĴwgc/Jq:YH{/s.$;t0?(x~ cW) vhޢCFe!_owqm8cGs/U? lF2N)r7ʮo1mS6r#()dFbAZ՝4]:;v뙖fPޘPong0sJtaLoHauhԬq6x@^ѼuigDI$r&־l4LS ³SHyhB#fx/Iϕ|/G5 FZ#YoV-|9Cm7Sk{5DZaو {<'\OOL)GX3>%̅[ي~Z+Kn.7oVCKg+t&Tn()[y-MW''#!.u&"BkK} e|whRA.d,Ws'W2qsdu\JtlŖx%7Y&\NmX2`DKJZ2pFm ZZ?9!5%i)gUߒ}&rQyq{qg%ƣ%gTIPjIy8VS otm'_ )j"b}9C~:?>kj3YFVQ2r.71!˛VLrajzƩ4M+Ƌ,I=X]Y,yKN$oP~r1/_u."EՅgF?s:VFvfjq.DԞÏ!TOƭZkP([!/N02h#:E>@0ޞDS-#1ޠܜlUkBC^CXՙ6dF rA`Ih\4 >Y 2}:3*JiCOYd.<7ǔKK60bbONtHy #;f #w(˨v|g\B5fe#'S<]/C1D9wб?1m “M"m, X߽qMSv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbOlUUثWb]v*Uث1Wb*kVgl(cfrT^ʤ[y02E٧k6p[4Ksڼ>$|1[?9(~RqW qþVXQwU!]NI*=)[G1$´i lviS8G\Ujr%]Ȋ`Vb$Z5#lU`^5lU|H~"H'çlHTXa3-\>/pS /6}kJ4SPúB}͆)zC;P.ˮXEAьٍ*zi8r®MjM<+?f2Ď[c;dOdVH%=2`@uy'dy 'Y6rEZM[Uhy#aND,W&zM .LEݩ\™m! ǾeC:`|+Z[SWH YvVKOQbb}F)HL$r L*^BJ72zEM5rV-Yn&TXtv9{гw^/\6'zf<c=\+PLHJ[@e`S;uYp~OP{$a'LƔ0zT6"G 6Z b"XZ*郈g2TUZ(*v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb[_OlUUثWb]v*Uث_sA/5KKd3cup )WU+kik@ɘTn5UBZt"5ND W6ǩ \]E:zi6.N3lL^h;[_X CC+ AQ'062%'m69u,4hi%ܮ±$dB6 D@v &$ѳ} YA#f^/ m:Fփcd'e'lɎA*Ǭ”*| '*!R]%J$ڂ@? LH{yn B@a8ęWf8Ow"Lycq)[{[smK1e"\{|pTYe |cA>%z+3t7 bĢ>]1VWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثxOlUUثWb]hrGo 3raT_J9x!HƬ|q)%K"]ZPpm1F\-):dځE0+uƒli >ҮU8W6A"I Cj=[/̇~;o) mZ8|GUb0Z5quсZ-)SweEb1V;7lUIVZ'"[^R ]>٥FڛH v|J:yEcVIanR'=\6E%&}&yU#H"@lFߵ}kY>ljD(ZU=ETb#Yy[zEDGwVʼnE폙mǗڃXBݗ>X,!^4k,o1N*v RGN6'Duy8$bOot`E!2,PHC){t@< Qz-gt0JeEףP$2.#l.m}_I[̇s @6^\_!a[J8$Kgd/i?^\'r B,*/3[^#6ܞԠ f41YF-TvUbWԶeזna",wf$F*K;Nb.<.{?-5 ]ݖwf ~ay{͖p [k^ fn7|GFBEO稈4G eM/_+@KjAJWo5[e|ܳ5Ioq[}ywa =_ëLZ_i'R5ՁބT'(`dn̵Ɍ ʉ'E$`Iw64=\wW(ɸJL`|ru4'VU%5M5A\ ҮVaБ=X$֦둔"^Q=iR4%܌|ڤzFF6#_^w(4pJwuwV8+,uNTMziemDO@RN¬NRS ]5o Pi@)Wb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb[_OlUUثWb]X 1⣩=0% Q{JE,ؓA%**CǖE)>mCpمH-_pH^m~zn-V;T$s$#^?3i퀼G"hn_[JȍH{`*ҷ LUU*]LUp*]S=VHRDVQ+1Uʨ: nT/QZj#|UEH銭c!4"_ AMA*z<1W(.iч"ط04!?>X- +"8 [iEBwn Q:`WWv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UUOlUUثWbZ&)㊥wV3|: U77,LD=t9-ل0ZU&vPJTxpҼ]i(I]R 2%յY[ԑ`nV{kK.hYe)"J헫M.;w`G`B኷lb]p|RE=VVZdJvqV*ZU{bU>ey4T5;:"Ĩ*ɾXڤiaQDqj y +?eT[ߴb-ґ"l  YBHX_8Il ^_DfLKOU#/eߦ#dcY>HMh|Y+(V_QJ6[P=d`UrrWiz!2^ZiNRccdPKϢjZ>5j}:ІSTXS.Q)Y4,q#4u @*o V@x>8+] ʭJiXt#&T=L" e-4]A.~cgh.]OE(|jޫ8<#?XJ΂Oe:\]Z<޼E8vl4۽J󍎿]톃;H2jіzTW&#nLebootNMtK!> HH T-E[rx8s0XyWv3&P)S~L[gMBc)U*˲~bz[2?&yvm+wB}X@Vu'+/gUCkxs]?ۜV#`I)uxH~@ו9a8%MJ;uM^5h#`T*yQ|:zo-S\O<=$r:?A4aM 6~,~25~ qFnlۢƕ6ڕ,Cl9"݂vU܁zOPCkiV⫊RirNJ!ehݰঝ'd3mC+!Anjv3$#-֣;%`Ԯk.T"+HmHk" 7R)/|LikѤ`ZMa81B)v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثVWOlUUUPw<ۓe=}11Ccl/-S^*d:+JtKڴzj5r'h7߈ W˚亜0bUh~`MUJ֏Hb >X"ؖR 4Sտ&thW,ΎI w[ T׉;ƛov*\z[qT<ʬzOkJ E>$׊wV;nDhJLUǛ UbZQaɀO3bzM6}.*.Iq<}Uuug3;9 oȔoM7ƕCSѣ{W@V` O,1g8z^Ƥer.KibTXj}0U,/SŔbymAE'}^Z]!ՔFfb& ?](>]BLFXhk[t4dn!&q,X䥔r0g喝Ʋ[KF`T.>}f&Py*&?_e_]x̶<[J9X q U} m!'QIsaaŜQQF {ӶJ1fb趇cf9*<ШWk$t!\`+)g*(PmKn/gQacM sE#$[=Xj@y2(ynoڋ9b1 vJ0ۚ_ڧ⪪13QܣiV+4ޡ̘sP]fy_uݩ] K(d izMXI}TT V+^Z, 4l w"g+_96Ԫm`}U&[M[>%Md!s߉ٍ$|Y#R1g:v>=r=|ia˨5ȡޤ |-fꨊe@('AQr( qTm1VWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v**OlUV{d3 V=yik+ZL)ɍ\8ӯrz b*$MS@IR7|Qxw%58ZkWd2yjB!a܁rbK‡ = X.cҭ^BNjJL{ubWdͪH=iAg1XĻ"r]ڸAUUu z⫘+-╨G|1VbW=I|UkO]S|%thAxKh=g_[WPH 3A[x5u=k׵Z*yɆ,/hzC՘ x¨FyoBA )jb@q0 ߩcߦ@UmlmsHC- G r u7in2G5$)L*՚{h׊\u0YAtƖޅ6V֣g ǂH)淝5I[9d`Hh-|#VWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v**OlUNI"K;P U#cv.@|0@$3I)/,=dK*P,Ԩȫj(:ָB…W/մ}JաUAA`,rd[T|%Η6B-T;`?Y~2']t[E lci(iCAҽqacm`J銸[특Fتm|UǮ*-/\Uiߑ*\qU`#FɆ%sLdm?Jey\:@'|)pzaԽ[^iHo(G%̗߄De/ɅWH#NiaU-FDu÷qT612P֟?"C$u ֵMaS{ɂ=0hz #=T 6LdeR%!];[Iuˑ24)|2JgO`[2\,IVc+" ,..;MV <][db҉n.xbzPW DyO/cҵ(/{he2Żo/Z\ʆիw¢$ex=( "hmjm/PӛL5h %k@gl5(l#Mc20a=%#3%.sckq[]PY1nGJS6=bku)խ\eQuƄP\Ɏ_"XY=Y>Ph/F*uFH$4Q/zCPI{rKƍ9Rcw E-Η6\`:0jZtlrZג4/&e VsM$nbk1c#yM=tS3[hVKr U+oe^1 >_j>XRNWu` ̼Ym&atM8ui:qO^ɰ쬪ueL5L唭K֕jH60LRr۠B}yfdc')D C&kBVۑuIɈzϔ,ℋfϷjh+{tʣ͸=(5EdJ#d S;M6UTQE) ]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb g!$XL׎Dh"Y6bN w/V7\UثkثWbxCWbWb]1Wb]v*jM9 _JƬB7ER̚Fy2I7Ha &+ƩpvK%=ƭSMχJHp_l G\I%VZ0n֟[kh}q@&9*O5ԂjIabe3%XM>7DQgi~xmגA JH%y\AeZ0QL#lmڧ&F`xj|;e`t}~_YDѮ7jv@ÒbAjq.c"]>pRJc5d6?Y,@ǻ,uSUC5Ɉ2Bmf$o4=MB$͒_d?" ?3}0 "i쏭<\7m,6Ko̳SV8c%e B*7혂T4+Wg'JNb#dL58Eءu |+ǰV'z%X#S1R'НlfU%Ђ(Mmn'v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UU;nK N)c,qQWw‡ZU W#\*v*Uov(v*UGSb ^idB9+^|Up銻v*kDPw?iYH$Nu|:xwVMr(S43= D4l$$lUכKijי?6t}O[0jy O\;,E45ޠ~ӵJvl!Rf*r$i$NRTuLtK i.'&1bMhWant#kl RE P&rabJ]yCS|&Tƣ$16+k4ڶ,ꛖ;\3lߖ;0k2[]j}* eQZ^\HrPjn [K(1 z #SPԦ@*^=ï!@|r3Y}"8,2+0MȌ)KhOa+LƶAm tʕUJ1ӫF}2DTQLUu*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثVW@*Q=5Kb jt d 4Wlvڴ?,Mիqrw8h1WW\ث1VWbxC'uDi^Ga M08~mܭK4b6@W̚ZR> L]3=wM 9!GR=B һmŔĀSՃy6-=>52uv;EgnxFRb$ ~YϬ\iz!+'S5^쀕lXK1@^AIo clWWum&PQ,qQ6l7raL6_^Kv! H#WKRYm˺֣{Ԧwc Pv9t"{%7\K4v{n73&vJ٭uٴMc  .c~!W>9uɻf^N%' ̢9,n!ӵ!$[#JlC)N,gVӿ:i&Vʰt>ǖÎAO67c#X&x r=AJ| R dk.pHv4!!V' ;ecpCW2;Gua2,w j\e=]CQg"%5+ r2R,c*v[q} CnLN\b)2Y(@ـ~xq݌mqf<R7j-§[ˠ y?WWHv4u ~4Mt?<6Jlz^Hi2#LKS5JWf$9QO+yJ" dJ7>ro dRiZmLS{k@:t.]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v**OlUi~X?0t۸EL[Q~5^(J Fb v*UثUˊZ劷*Ci$Xy=2@xw/uGtɃX([ۑZ{v bLh@\Nz+3ej pW%HY`HVU5 FK!ݿ*0iay qU闂xYv8K<=A%楨ֱiqG+\ JnF\fI?:4fHA^TlĐa'_0-$pUVؖo7#Gu֟?闈5}zPҴO|<\+I|] H"gĠS 3C'0%1 M8R! E1TS!$,R͉@JZ]1Uӭٕ"S$g7~p*Q闉6K?7hAE҃M Gj2iԖwwҳ'鰨@ߐP4\hΖN 1+@+&cikPIK pӬW7*O7M_kIEVEe_ CmV}*M:ZIYr{⪀]\UUثV*qVZWiI|mq>K)Wu9AWM4"7w\řnHooLHϦ(c&;*s&Vp Zӽ2ȝQ]ikwJ'z2"ZǓoЭfRv=vb?ZĄI V<׊Q?WM6"BS_:yOVu3 >ZW)n࿿Ӏ; 2OW)S0heոT딓l~ok`}zx%Hۅ`zu1A\ xH#uxb=’(OH!,"FIRkwfX ^%yK~]ckfÒێA?l +3M-%eX-֥9dQFo"K[ҧnT0HZ-bbTIGIa^vX2Hd[Q+wݵƕ .Nd:g_R=6tR?˔q@yn^ie[хzr'Z#YByKuq}4Q@wK5#R=2AB#HlVoc2->Ɏ [8\f؂cȒqdr$~NDfVNIJ" fHo{MizR3Sd2`KϮ̎cmSeh!J1#^t.AxEuunjT z@X#| >խc2cl[#ɧzĻ4.<_;Q ~XTUm"j]"xR#"1}[vQeM7@;q.lrY2Z]ʿXrJʰ%[Ѻ$iwuYnk/#WbdO2yY\7-# O֊̈RV,idH g4Zod%Y|?[բiO#)5n%Ψ>`$;N5)9i]#:i1af!1sz~sƗn×aʹ[cdP ;dq4 ki!|U0ثxWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UUOlUU !˿Z!lu|Rmڇ81v7L$]`nvk|U_ٝP5AHxsyЙm#sbOl5gso =Y ^hsYA  hC ᅮӼf2Gy#CdYX (VĐ#^ÈҘX09,tW( cIx&GYIvf Cl4N|u J ~&jO+;=˞SKh(3oL@=Y[B5:RV]%Q]ˀ b5wҾxK%N%EmWIΣIZʕKoC4 Wnizo)VВYh . *<1fHHH2Kj D(;*GK/Xa>k =MVZtWG7Vڵy]KjԚeɈ;~sM]Jut J=^,*9(3Hs{A=SGKd HLH, <'ڵ5C^wԪ)&Yނ5=SS֮MIԯEQ27_I`H#?W\<%迖uS^D:Ur䱲cKipkmHot$ SiN*yGZc}VaLAL(<ΞDٷY )2emr^hlnm)͵q-),1VWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثVWOlUU˶*oH% Fy7zėv1!GaZU^$/|!: K{dJKov*Uت*Q\U)!IxdP%!~GH ͼjJe /Qb0ƌ-{z>AqsJEh~c@@72Ro3yB[فW)Ԍ >tj㵼֡TZ 2Ju[#w$Rd&VƗz==+7CxDJ*?VKlQqT8`*y8{ َ2Ju20jX'&I h5B _½0[[B &V*i[~-'ZoKl Tz⭪xmH6jldVyOSo7ykٚ+,%44;-vV4[*4#M[&B~&P ~S"K}5/wBlrH;ܜZ".#aHg?^^Py[0jCď fÉ1E85,Je';ymGZR0a\ Le̞nֵۃ-D #U@c %#5',[kIg,kۦ%S˴-XķBjOo 0&9Zt$؟?Db`tۅӢ-)!yc[=vhU~!VTK|`R8"ҋ@03O U3(QLUv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uثx@'h1T#*'r1TF XJnx0'!=$} p­[txU`KclimkxmNk{8׳ `UOR^U hd{|6"X[m{Tn[iej(]j-m .E%J˴Ns?j!0Z5Ez=*wRƘ$Ӵ(-97튦iJbWVqn6 x1Sh#@v\w JL3CRvMqbC|[*O}ىi(4YTxnlE(-wz'03@£D\Mse76c)Ɉڑdpm^Hf Ulz^ZӮS0sl)/.u[I<Ȟ1cORnF4r5)#$U's퀔~Voj0@v/O}1y#.sa`+ [!YRi *cOӑ͒ۛ=;:lX;I+nE?^*k;m ׏T3?)Wם&^z$ <1]t;A O:|hll&Y^bO-Vv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbЄP\U.Y:UOnqWmHu3OBGWHI,'fdbxȔJ®1V늶6[1V m\Hlh{)WzH AI!WnK+(ku#&|k.+,P@LH17Iu` j=k?V!n5EBԚ|`d [ĩ بE6_oa)3mT-ƣ%va| CPUHf!wPxX?< tLY""P:*P! OJ U< Y&qqVC BcPU+qVP::6) +҃}N/q }^,c1p*=UB:r4鉋/,f+v()Ac2"iF5@&xdXuHk1'\ћ+*i^3 $wmySA~vџNb pw?WL7.,Nkܱ e<|yNDuH>֩>fm+w Vّ,e7bK֬ƭ㙼4w[$K?du&b)kfkV#Zd3F? GM0iz|Kk(wbO&F<$ ޹{{QIfj:@ _fma$XAh(IaASce3M´ FA+[]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UU֧ e: U,\1VV**A;6`) K\䷘/ƪi]],bIKx U\qVWLP4%S c:>i$h"2~W[6[o[ %s_j<4>Tʟ& =w^NWį]Ѵ;HbEn$ʴZXU> U'"Uvi SIVS 7Dr5-vZ$;LN1%_o$ģfiVO(L4"Tik=* n:U튷v*UOKa_cWVf1lU bTZ튼Q_F{oc`^'uJYvRU(rT#-ڈ7$CPQK Q+ e223*M2WT[>4T~^nPzdQB=R9D0iHɦGZTF梟-Zz+`څB7H4NKt hR1!:)K dh Fk)ܩSIotWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UU3$RI1W*Nxb\qU3֘ Bw1E똤SX劦X p%Tq;[[]ZbU PLDH<:Fi%[ʔfF_?yZp}iبUOM5hV3v=$wߗfD%&@ZxK[Ɛm@*`%QcSU{ 7RR[=TiXޟZJ}aBxSk)~(~JČaIơP1UثWb]v*銡lV*PrXݛۿbbv*M:WRt>JؼMVfHlHx n+t=ÄKve4-|2Zib[O1߲ɂ)=ktPj 7IK_`1erS{&ʓ84-1LJQqxQ=Ez~9d DS[}?oeW*K&LDӪ_k#G՘ґ.Lqf$w! VITY&zd/ZNh(V]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb[_AF* Q5܊n:\wV҆)6z4yI79iiƖ,2^bH]iPҸuޙK` ƍ!X"y/-LW<;{fǫkֶPCװ$ -4ӼuBҥڙ MK`}?N@M7!:dp|k0ڲX-`@EM0*|Uv*UثWb]k~Ƙ.c Ӑbnr)NCp銭1/K5ZxmL@Zy?gS+4H7tFǮ {@I!4 fL'm&2 }]L-qsn2;dI^P1z8{7Ҿ+DI;t'"\,$i9oQ3B7>dCx^ ^P|\V*)A^YTnD!Lȶ(gFA9҂5EQEbnثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثxOlUiSv*V4TX4 ~;mjl`JfQ\5=-= tbM | !yӴ@if {%hxKu+K$HQs*wOR1&\ zP zcO4)AG_Yλ#C ~ThbzV3 ;A9Y(z-,fA$Y0CAL*@lUa늺UF*sኩ3E%ݶ g%+5b;ֻbhF#lT W*"{ab\ZI?^8$ *v*UثWb]v*UثWb\OnݤW G|U^Yo!qT)Qۦ*Wa 2JqRwxZr=a IDy# ʆW$Qz$vQVY^^&(IҴH..F k2-4(E@ 0Egn*7ƙJ&6‚qv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbOlUUتUqoPt8nWUiQ`:`Z] }E.Hfo-Mͨc2)#cNdrm ʟwWȇH !zXv(6-HE 9hZ&y|Uk$PU6GQ6ZuAL4M,߼,RiUwƖMGݏ4A ɦ4ƒƕ醕ثWb]v*UثWb]v*bTn`K*~bvխc*@ڸڂq]PU\T>/qnR0+ѨWGNAk0PQPiaPk@ֽljϢznh1h[8xIkDdv3M =J{gTFUثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]oOlUUSKR1TxS4튻kXr=P_זayJiOrlĘkv Cl4JVTx=>}1U5WqU0l5!P)bpj#q_1 U-fribȴ-q"[* Q'׊ Uv⭎Wb]v*UثWb]v*UثWbۮ*qmUAun>qT=ͼ7)Fz8~8B5DeE=E.Yka3-ԯ|Rq (_C㊸W**UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb[_OlUUثTR* UUUi낒MکL$eXT7\xlzd)0Ia4=r$+YZ*X|$d}>*lU} B?*NC8GY ф@w*Q|U5v[]v*UثWb]v*UثWb]v*UثWb]ETwtbҘWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb[_OlUUثWb0H=T!=튡p銸V U|$WF*ݽ2Ob펍ony'*oy%v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثxOlUUثWb*{n%*2khV\Uh8>I)>sQƼQBaLUv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb[_OlUUثWbbN@5ZjGJb|6U쥙e=T(EiVqTU(1Wb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثxOlUUثWb\EqU9Yc*FIqj1=U8SE8ei5'G"]Wb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثVWOlUثWb]v*q6`T^*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWtinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/images/tmote_sky.png000066400000000000000000000224421207233610700262740ustar00rootroot00000000000000PNG  IHDRd@tgAMA abKGD pHYs  tIME  IDATxi\uo͗=k/jAaA %RrӖ%u+½by"LDGDwDttǸc<3!^VEQ-$E"A H @̷P EmIHy>VEd{?sϹ0 4~2DpayU0ē{w#!R~$/>r "Aյo.l}d9 HBzu>rcnQlcL;gj$?a2Ժ[/>se$yM)F[^msr ?>q7o.Vź:Z>ϼ< ]iԡ fG[} "|7g(9!z7ذP)q}-y;|!n);وBɁ-iZ-9[ge SISow#>K=Mv #3\ERr}T:=b:Nvn{5zoutCK3 })A(EHno~Cꠄt\R Ƭh8xR .PS "]J+%f/+-x&oPTtAb}:q'drCmsM_'ީP m.WjEt%$ ~۩jL[Zk46{xmBPP:_J RB'\bddM۶q9aى/VI$9 ›SiⶑЌ$#f q( A:> (,Dw&xmYb.&3\4R$DH\wzbt\!jv~F )Udsf;Nh]~O# RJmqUߤd)$`27‰ )SpeK~zt\^;ibkE} 8-Zzd Wlp(ܵ1\KcnD m&Zi*}_BW29`qYF\~G6$wrS/jA!i>~ |D AJ \+:n7$PM Kyj,k(I: FPc*=Eu}Y$ǯpC*$LAz5lFt6MIsZٍtK<9c gq.Dhq-HGWB2^=ǸA2SDK|6)aX9/8lɓe$FCI,;zD4^Mglz0:ƅ+E~پ{NO|Ig8uBhNiʐ@Ha_:[ *I%I7|9pjRv `zD];ظٍ5qRΩ ڶ|lٲD".b Bԥ i}ҥRxeZwL)dt.eO飅mB***T=HV,"IR"pe|#;}lRe?zӌe4ku..z+ RG7v ]h5l'X&M֊+ LLL ׉&Z-T/Ye}Du¸`=mCt4Slp‘tn~DP!?F%mwnPzqvD%XXkoNS^]?CV&_9|#o^1>b~&Cc߷Fw)NIN '5>mqs9gf&/_!٬,R.63]*}Uob8."wQC)" F|h-c6%?Ʌ~ M h)kWĽ[QyϝqlӡDՀK$ -jhuPޞc S'X]SHhn )IfjjvC4jh4j+,Mcfri39P,>!.ިh05c(^dYcH-8 m33II: [3O*e}hs+D!L_:vjˣR볰B]gQKuf Z +es=A2']*=Ykit"SST+LmTNYsChH^`*!f"Nsm(J,aui8SiBg4)It6d5c!T:uyArܿf)CGЄ7ٵm )Wbi&"lRaq'Uꑠӫ[W=zaӭ]-KWk& 7n21>(g ?@.S/s0B(4l 5T[MBUerzFR>+ˌ da cqfO<0#$ICW@ݦjˡBDurسc[7v9S$Q:6܀MvD+ ,ךL4GGa8Zz-3UBzrWJۦJMhJS4eTED2&"}5՛+^kS? Z.Z.F㘔(|&4w޾,Ðjm7_W5jEpsCϰ0.ͲT\PMu ZK5.5xl dyal0['8u bJq;D7M"Q %M;b]FUC+l!5)P$B'M9d\$GCIYAR]ɃcۖM$WSוXBBB鳼$ ab)>ض6}e m_!bH\JĴ>JeGp>C hVN#[er6 Ss%0^"\]J c):FZw G!NJD$S/D j$52P40@(8"4U()%**!Nh/\Ǖ:X"5ʒkkeڳ EXhňFb?{ղqUUY>+ڮH؅GFRl^' ?p]L:WUF9|^fl]b# CXA?0$C6//tCAɵ-O%n)tkvq/+aqVUHbg~pMD4N %s|#%u4E:}f t!TG!e$X/uG9wF it vw*(t= EA}}F,f"|;C$;+X]ZjP2[E nN,򖉋(CQĭR%uB}|M_ X\Yehrnf$9mຒ ǮV65J^˟h5B~/^('QTტLٻc/?($jEJS_RnX f OK4龗?(i!kLseuS*TMTEsQvΌs5 CC896 D#y o^gy*;wP~ɃwM'` %6;KYxx2IFӴaX[Y'_!W.3*.P$v~)O<S[^Cq _b||#m3::*lۦR|saaa|Vˈ~tK=|G8s&.ȏ Q%x`>8\ZX$4 :jH\Ķfuyu~M?crz>aDUH*P(088(RR,eX\?y|q%\_!SٳcwϝB41^<|#01`_{[fIĢ9Ovj[mn\*{2Q|泏0<2 U{ 34D2ؘfRJ*7K ]N^)X1nGAKɥ4߽<9R)L6+_B)Z8_[wqu|"\mDanŊ0I"fl|t?fI)j],ѷ8yi.3R==´ sB7 ~BayT*^g6Zŵ ) ~Py衇R0 a RYF{YRj/ @!?N! fw47ɐJNj4m zt%|ɍ[a~ݲ,lj&⌎ҩ\Fl4J%)*/@<#D܇PaHXA OH<-4P~h,#/022 kѠR[048H:"˿_jh6* d'ߚmt:0D "h?P.eB& ;ߗyz9yޭˋ]EuFFFH$ )  EWmۥ~3J}W'^j*B鱺mD(C#"bF4> ykNJl۞5 }@`h\~-zcyݮL&"|z>ԁ>IENDB`tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/mviz/package.html000066400000000000000000000015301207233610700245570ustar00rootroot00000000000000 Provides a GUI interface to a TinyOS network.

    Package Specification

    Related Documentation

    For how to use the classes in this package, please see the man page of the tos-mviz tool. tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/000077500000000000000000000000001207233610700225615ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/AbstractSource.java000066400000000000000000000077671207233610700263710ustar00rootroot00000000000000// $Id: AbstractSource.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.packet; import java.io.*; import net.tinyos.util.*; /** * Provide a standard, generic implementation of PacketSource. Subclasses * need only implement low-level open and close operations, and packet * reading and writing. This class provides the automatic close-on-error * functionality, general error checking, and standard messages. */ abstract public class AbstractSource implements PacketSource { protected String name; protected boolean opened = false; protected Messenger messages; protected void message(String s) { if (messages != null) messages.message(s); } protected AbstractSource(String name) { this.name = name; } public String getName() { return name; } synchronized public void open(Messenger messages) throws IOException { if (opened) throw new IOException("already open"); this.messages = messages; openSource(); opened = true; } synchronized public void close() throws IOException { if (opened) { opened = false; closeSource(); } } protected void failIfClosed() throws IOException { if (!opened) throw new IOException("closed"); } public byte[] readPacket() throws IOException { failIfClosed(); try { return check(readSourcePacket()); } catch (IOException e) { close(); throw e; } } synchronized public boolean writePacket(byte[] packet) throws IOException { failIfClosed(); try { return writeSourcePacket(check(packet)); } catch (IOException e) { close(); throw e; } } protected byte[] check(byte[] packet) throws IOException { return packet; } // Implementation interfaces abstract protected void openSource() throws IOException; abstract protected void closeSource() throws IOException; abstract protected byte[] readSourcePacket() throws IOException; protected boolean writeSourcePacket(byte[] packet) throws IOException { // Default writer swallows packets return true; } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/BaudRate.java000066400000000000000000000020361207233610700251140ustar00rootroot00000000000000/** * This file contains the default baud rate for current TinyOS * platforms. Don't add anything but platform entries, as this file is also * #included in C code to get the table, with appropriate #define's to * avoid problems... */ package net.tinyos.packet; class BaudRate { static void init() throws Exception { /* The Platform.x argument is there for when this code is #include'd into C */ Platform.add(Platform.x, "mica", 19200); Platform.add(Platform.x, "mica2", 57600); Platform.add(Platform.x, "mica2dot", 19200); Platform.add(Platform.x, "telos", 115200); Platform.add(Platform.x, "telosb", 115200); Platform.add(Platform.x, "tinynode", 115200); Platform.add(Platform.x, "tmote", 115200); Platform.add(Platform.x, "micaz", 57600); Platform.add(Platform.x, "eyesIFX", 57600); Platform.add(Platform.x, "intelmote2", 115200); Platform.add(Platform.x, "iris", 57600); Platform.add(Platform.x, "shimmer", 115200); Platform.add(Platform.x, "ucmini", 115200); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/BuildSource.java000066400000000000000000000322531207233610700256510ustar00rootroot00000000000000// $Id: BuildSource.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.packet; import net.tinyos.util.*; /** * This class is where packet-sources are created. It also provides * convenient shortcuts for building PhoenixSources on packet-sources. * * See PacketSource and PhoenixSource for details on the source behaviours. * * Most applications will probably use net.tinyos.message.MoteIF with * the default source, but those that don't must use BuildSource to obtain * a PacketSource. * * The default source is specified by the MOTECOM environment variable * (note that the JNI code for net.tinyos.util.Env must be installed for * this to work - see net/tinyos/util/Env.INSTALL for details). When * MOTECOM is undefined (or the JNI code for Env.java cannot be found), the * packet source is "sf@localhost:9002" (new serial-forwarder, on localhost * port 9002). * * Packet sources can either be specified by strings (when calling * makePacketSource, or by calling a specific makeXXX method * (e.g., makeSF, makeSerial). There are also * makeArgsXXX methods which make a source from its source-args (see below). * * Packet source strings have the format: [@], * where source-args have reasonable defaults for most sources. * The sourceHelp method prints an up-to-date description * of known sources and their arguments. */ public class BuildSource { /** * Make a new PhoenixSource over a specified PacketSource * Note that a PhoenixSource must be started (start method) * before use, and that resurrection is off by default (the default error * calls System.exit). * @param source The packet-source to use (not null) * @param messages Where to send status messages (null for no messages) * @return The new PhoenixSource */ public static PhoenixSource makePhoenix(PacketSource source, Messenger messages) { return new PhoenixSource(source, messages); } /** * Make a new PhoenixSource over a specified PacketSource * Note that a PhoenixSource must be started (start method) * before use, and that resurrection is off by default (the default error * calls System.exit). * @param name The packet-source to use, specified with a packet-source * string * @param messages Where to send status messages (null for no messages) * @return The new PhoenixSource, or null if name is an invalid source */ public static PhoenixSource makePhoenix(String name, Messenger messages) { PacketSource source = makePacketSource(name); if (source == null) { return null; } return new PhoenixSource(source, messages); } /** * Make a new PhoenixSource over the default PacketSource * Note that a PhoenixSource must be started (start method) * before use, and that resurrection is off by default (the default error * calls System.exit). * @param messages Where to send status messages (null for no messages) * @return The new PhoenixSource * @return The new PhoenixSource, or null if the default packet source is * invalid (ie, the MOTECOM environment variable specifies an invalid packet * source) */ public static PhoenixSource makePhoenix(Messenger messages) { PacketSource source = makePacketSource(); if (source == null) { return null; } return new PhoenixSource(source, messages); } /** * Make the default packet source * @return The packet source, or null if it could not be made */ public static PacketSource makePacketSource() { return makePacketSource(Env.getenv("MOTECOM")); } /** * Make the specified packet source * @param name Name of the packet source, or null for "sf@localhost:9002" * @return The packet source, or null if it could not be made */ public static PacketSource makePacketSource(String name) { if (name == null) name = "sf@localhost:9002"; // default source ParseArgs parser = new ParseArgs(name, "@"); String source = parser.next(); String args = parser.next(); PacketSource retVal = null; if (source.equals("sf")) retVal = makeArgsSF(args); if (source.equals("serial")) retVal = makeArgsSerial(args); if (source.equals("network")) retVal = makeArgsNetwork(args); if (source.equals("tossim-serial")) retVal = makeArgsTossimSerial(args); if (source.equals("tossim-radio")) retVal = makeArgsTossimRadio(args); return retVal; } /** * Return summary of source string specifications */ public static String sourceHelp() { return " - sf@HOSTNAME:PORTNUMBER\n" + " A serial forwarder.\n" + " - serial@SERIALPORT:BAUDRATE\n" + " A mote connected to a serial port using the TinyOS 2.0 serial protocol.\n" + " BAUDRATE is either a number or a platform name (selects platform's\n" + " default baud rate).\n" + " - network@HOSTNAME:PORTNUMBER\n" + " A mote whose serial port is accessed over the network.\n" + " - tossim-serial[@HOSTNAME]\n" + " The serial port of tossim node 0.\n" + " - tossim-radio[@HOSTNAME]\n" + " The radios of tossim nodes.\n" + "\n" + "Examples: serial@COM1:mica2, serial@/dev/ttyUSB2:19200, sf@localhost:9000"; } /** * Make a serial-forwarder source (tcp/ip client) from an argument string * @param args "hostname:port-number", or null for "localhost:9002" * @return The new PacketSource or null for invalid arguments */ public static PacketSource makeArgsSF(String args) { if (args == null) args = "localhost:9002"; ParseArgs parser = new ParseArgs(args, ":"); String host = parser.next(); String portS = parser.next(); if (portS == null) return null; int port = Integer.parseInt(portS); return makeSF(host, port); } /** * Make a serial-forwarder source (tcp/ip client) * @param host hostname * @param port port number * @return The new PacketSource */ public static PacketSource makeSF(String host, int port) { return new SFSource(host, port); } private static int decodeBaudrate(String rateS) { try { int rate = Platform.get(rateS); if (rate == -1) rate = Integer.parseInt(rateS); if (rate > 0) return rate; } catch (NumberFormatException e) { } return -1; } /** * Make a serial-port packet source. Serial packet sources report * missing acknowledgements via a false result to writePacket. * @param args "COMn[:baudrate]" ("COM1" if args is null) * baudrate is an integer or mote name * The default baudrate is 19200. * @return The new packet source, or null if the arguments are invalid */ public static PacketSource makeArgsSerial(String args) { if (args == null) args = "COM1"; ParseArgs parser = new ParseArgs(args, ":"); String port = parser.next(); String platformOrBaud = parser.next(); int baudrate = decodeBaudrate(platformOrBaud); if (baudrate < 0) return null; return makeSerial(port, baudrate); } /** * Make a serial-port packet source. Serial packet sources report * missing acknowledgements via a false result to writePacket. * @param port javax.comm serial port name ("COMn:") * @param baudrate requested baudrate * @return The new packet source */ public static PacketSource makeSerial(String port, int baudrate) { return new Packetizer("serial@" + port + ":" + baudrate, new SerialByteSource(port, baudrate)); } /** * Make a serial-port packet source for a network-accessible serial * port. Serial packet sources report missing acknowledgements via a * false result to writePacket. * @param args "hostname:portnumber" (no default) * @return The new packet source, or null if the arguments are invalid */ public static PacketSource makeArgsNetwork(String args) { if (args == null) return null; ParseArgs parser = new ParseArgs(args, ":,"); String host = parser.next(); String portS = parser.next(); if (portS == null) return null; int port = Integer.parseInt(portS); return makeNetwork(host, port); } /** * Make a serial-port packet source for a network-accessible serial * port. Serial packet sources report missing acknowledgements via a * false result to writePacket. * @param host hostname of network-accessible serial port * @param port tcp/ip port number * @return The new packet source */ public static PacketSource makeNetwork(String host, int port) { return new Packetizer("network@" + host + ":" + port, new NetworkByteSource(host, port)); } // We create tossim sources using reflection to avoid depending on // tossim at compile-time /** * Make a tossim serial port (node 0) packet source * @param args "hostname" ("localhost" for null) (on which tossim runs) * @return The new packet source */ public static PacketSource makeArgsTossimSerial(String args) { if (args == null) args = "localhost"; return makeTossimSerial(args); } /** * Make a tossim serial port (node 0) packet source * @param host hostname on which tossim runs * @return The new packet source */ public static PacketSource makeTossimSerial(String host) { return makeTossimSource("TossimSerialSource", host); } /** * Make a tossim radio packet source * @param args "hostname" ("localhost" for null) (on which tossim runs) * @return The new packet source */ public static PacketSource makeArgsTossimRadio(String args) { if (args == null) args = "localhost"; return makeTossimRadio(args); } /** * Make a tossim radio packet source * @param host hostname on which tossim runs * @return The new packet source */ public static PacketSource makeTossimRadio(String host) { return makeTossimSource("TossimRadioSource", host); } private static PacketSource makeTossimSource(String name, String host) { try { Class[] oneStringArg = new Class[1]; oneStringArg[0] = Class.forName("java.lang.String"); Object[] args = new Object[1]; args[0] = host; Class tossimSource = Class.forName("net.tinyos.sim.packet." + name); return (PacketSource)tossimSource.getConstructor(oneStringArg).newInstance(args); } catch (Exception e) { System.err.println("Couldn't instantiate tossim packet source"); System.err.println("Did you compile tossim?"); return null; } } // static class ParseArgs { // String tokens[]; // int tokenIndex; // ParseArgs(String s, String delimiterSequence) { // int count = delimiterSequence.length(); // tokens = new String[count + 1]; // tokenIndex = 0; // // Fill in the tokens // int i = 0, lastMatch = 0; // while (i < count) { // int pos = s.indexOf(delimiterSequence.charAt(i++)); // if (pos >= 0) { // // When we finally find a delimiter, we know where // // the last token ended // tokens[lastMatch] = s.substring(0, pos); // lastMatch = i; // s = s.substring(pos + 1); // } // } // tokens[lastMatch] = s; // } // String next() { // return tokens[tokenIndex++]; // } // } public static void main(String[] args) { System.err.println(sourceHelp()); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/ByteSource.java000066400000000000000000000045301207233610700255120ustar00rootroot00000000000000// $Id: ByteSource.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Simple byte I/O interface for use with PacketSource packetizers */ package net.tinyos.packet; import java.io.*; public interface ByteSource { public void open() throws IOException; public void close(); public byte readByte() throws IOException; public void writeBytes(byte[] bytes) throws IOException; } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/Makefile000066400000000000000000000004761207233610700242300ustar00rootroot00000000000000# Makefile for tools/java/net/tinyos/packet INITIAL_TARGETS = Serial.class Serial.java ROOT = ../../.. include $(ROOT)/Makefile.include TOS=$(shell ncc -print-tosdir) SERIAL_H = $(TOS)/lib/serial/Serial.h Serial.java: $(SERIAL_H) FORCE ncg -o $@ -java-classname=net.tinyos.packet.Serial java $(SERIAL_H) Serial.h tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/NetworkByteSource.java000066400000000000000000000051251207233610700270650ustar00rootroot00000000000000// $Id: NetworkByteSource.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.packet; import java.io.*; import java.net.*; /** * A tcp/ip (client) byte-source */ public class NetworkByteSource extends StreamByteSource { private Socket socket; private String host; private int port; public NetworkByteSource(String host, int port) { this.host = host; this.port = port; } protected void openStreams() throws IOException { socket = new Socket(host, port); is = socket.getInputStream(); os = socket.getOutputStream(); } protected void closeStreams() throws IOException { socket.close(); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/PacketListenerIF.java000066400000000000000000000045041207233610700265630ustar00rootroot00000000000000// $Id: PacketListenerIF.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.packet; /** * * The listener interface receives incoming packets. * * @author
    Mike Chen * @since 1.1.6 */ public interface PacketListenerIF extends java.util.EventListener { public void packetReceived(byte[] packet); } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/PacketSource.java000066400000000000000000000106751207233610700260250ustar00rootroot00000000000000// $Id: PacketSource.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** This interface specifies the generic behaviour of a packet mediator. The read and write operations are blocking. Reads and writes may fail (e.g., for communications failure), which implicitly closes the mediator. It is not possible to reopen a mediator after it is closed (instead, a new mediator should be created). The packet byte array must be at least 1 byte long - the first byte indicates the type of packet and is used to dispatch to upper layers. PacketSources are point-to-point and have "at most once" semantics. writePacket should return true only if the packet has been received Note that checking this is not possible with some of our broken, legacy protocols, and that we will optimistically assume that packets sent over reliable links (e.g., tcp/ip socket to a serial forwarder) will be reliably delivered by tcp/ip. */ package net.tinyos.packet; import java.io.*; import net.tinyos.util.*; public interface PacketSource { /** * Get PacketSource name * @return the name of this packet source, valid for use with * BuildSource.makeSource. */ public String getName(); /** * Open a packet source * @param messages A destination for informative messages from the * packet source, or null to discard these. * @exception IOException If the source could not be opened */ public void open(Messenger messages) throws IOException; /** * Close a packet source. Closing a source must force any * running readPacket and writePacket * operations to terminate with an IOException * @exception IOException Thrown if a problem occured during closing. * The source is considered closed even if thos occurs. * Closing a closed source does not cause this exception */ public void close() throws IOException; /** * Read a packet * @return The packet read (newly allocated). The format is described * above * @exception IOException If the source detected a problem. The source * is automatically closed. */ public byte[] readPacket() throws IOException; /** * Write a packet * @param packet The packet to write. The format is decribed above. * @return Some packet sources will return false if the packet * could not be written. */ public boolean writePacket(byte[] packet) throws IOException; } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/Packetizer.java000066400000000000000000000277311207233610700255370ustar00rootroot00000000000000// $Id: Packetizer.java,v 1.8 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.packet; import net.tinyos.util.*; import java.io.*; import java.util.*; /** * The Packetizer class implements the new mote-PC protocol, using a ByteSource * for low-level I/O */ public class Packetizer extends AbstractSource implements Runnable { /* * Protocol inspired by, but not identical to, RFC 1663. There is * currently no protocol establishment phase, and a single byte * ("packet type") to identify the kind/target/etc of each packet. * * The protocol is really, really not aiming for high performance. * * There is however a hook for future extensions: implementations * are required to answer all unknown packet types with a P_UNKNOWN * packet. * * To summarise the protocol: * - the two sides (A & B) are connected by a (potentially * unreliable) byte stream * * - the two sides exchange packets framed by 0x7e (SYNC_BYTE) bytes * * - each packet has the form * <16-bit crc> * where the crc (see net.tinyos.util.Crc) covers the packet type * and bytes 1..n * * - bytes can be escaped by preceding them with 0x7d and their * value xored with 0x20; 0x7d and 0x7e bytes must be escaped, * 0x00 - 0x1f and 0x80-0x9f may be optionally escaped * * - There are currently 5 packet types: * P_PACKET_NO_ACK: A user-packet, with no ack required * P_PACKET_ACK: A user-packet with a prefix byte, ack * required. The receiver must send a P_ACK packet with the * prefix byte as its contents. * P_ACK: ack for a previous P_PACKET_ACK packet * P_UNKNOWN: unknown packet type received. On reception of an * unknown packet type, the receicer must send a P_UNKNOWN packet, * the first byte must be the unknown packet type. * * - Packets that are greater than a (private) MTU are silently * dropped. */ final static boolean DEBUG = false; final static int SYNC_BYTE = Serial.HDLC_FLAG_BYTE; final static int ESCAPE_BYTE = Serial.HDLC_CTLESC_BYTE; final static int MTU = 256; final static int ACK_TIMEOUT = 1000; // in milliseconds final static int P_ACK = Serial.SERIAL_PROTO_ACK; final static int P_PACKET_ACK = Serial.SERIAL_PROTO_PACKET_ACK; final static int P_PACKET_NO_ACK = Serial.SERIAL_PROTO_PACKET_NOACK; final static int P_UNKNOWN = Serial.SERIAL_PROTO_PACKET_UNKNOWN; private ByteSource io; private boolean inSync; private byte[] receiveBuffer = new byte[MTU]; private int seqNo; // Packets are received by a separate thread and placed in a // per-packet-type queue. If received[x] is null, then x is an // unknown protocol (but P_UNKNOWN and P_PACKET_ACK are handled // specially) private Thread reader; private LinkedList[] received; /** * Packetizers are built using the makeXXX methods in BuildSource */ Packetizer(String name, ByteSource io) { super(name); this.io = io; inSync = false; seqNo = 13; reader = new Thread(this); received = new LinkedList[256]; received[P_ACK] = new LinkedList(); received[P_PACKET_NO_ACK] = new LinkedList(); } synchronized public void open(Messenger messages) throws IOException { super.open(messages); if (!reader.isAlive()) { reader.start(); } } protected void openSource() throws IOException { io.open(); } protected void closeSource() { io.close(); } protected byte[] readProtocolPacket(int packetType, long deadline) throws IOException { LinkedList inPackets = received[packetType]; // Wait for a packet on inPackets synchronized (inPackets) { while (inPackets.isEmpty()) { long now = System.currentTimeMillis(); if (deadline != 0 && now >= deadline) { return null; } try { inPackets.wait(deadline != 0 ? deadline - now : 0); } catch (InterruptedException e) { throw new IOException("interrupted"); } } return (byte[]) inPackets.removeFirst(); } } // Place a packet in its packet queue, or reject unknown packet // types (which don't have a queue) protected void pushProtocolPacket(int packetType, byte[] packet) { LinkedList inPackets = received[packetType]; if (inPackets != null) { synchronized (inPackets) { inPackets.add(packet); inPackets.notify(); } } else if (packetType != P_UNKNOWN) { try { writeFramedPacket(P_UNKNOWN, packetType, ackPacket, 0); } catch (IOException e) { } message(name + ": ignoring unknown packet type 0x" + Integer.toHexString(packetType)); } } protected byte[] readSourcePacket() throws IOException { // Packetizer packet format is identical to PacketSource's for (;;) { byte[] packet = readProtocolPacket(P_PACKET_NO_ACK, 0); if (packet.length >= 1) { return packet; } } } // Write an ack-ed packet protected boolean writeSourcePacket(byte[] packet) throws IOException { for (int retries = 0; retries < 25; retries++) { writeFramedPacket(P_PACKET_ACK, ++seqNo, packet, packet.length); long deadline = System.currentTimeMillis() + ACK_TIMEOUT; byte[] ack = readProtocolPacket(P_ACK, deadline); if (ack == null) { if (DEBUG) { message(name + ": ACK timed out"); } continue; } if (ack[0] == (byte) seqNo) { if (DEBUG) { message(name + ": Rcvd ACK"); } return true; } } return false; } static private byte ackPacket[] = new byte[0]; public void run() { try { for (;;) { byte[] packet = readFramedPacket(); int packetType = packet[0] & 0xff; int pdataOffset = 1; if (packetType == P_PACKET_ACK) { // send ack writeFramedPacket(P_ACK, packet[1], ackPacket, 0); // And merge with un-acked packets packetType = P_PACKET_NO_ACK; pdataOffset = 2; } int dataLength = packet.length - pdataOffset; byte[] dataPacket = new byte[dataLength]; System.arraycopy(packet, pdataOffset, dataPacket, 0, dataLength); pushProtocolPacket(packetType, dataPacket); } } catch (IOException e) { } } // Read system-level packet. If inSync is false, we currently don't // have sync private byte[] readFramedPacket() throws IOException { int count = 0; boolean escaped = false; for (;;) { if (!inSync) { message(name + ": resynchronising"); // re-synchronise while (io.readByte() != SYNC_BYTE) ; inSync = true; count = 0; escaped = false; } if (count >= MTU) { // Packet too long, give up and try to resync message(name + ": packet too long"); inSync = false; continue; } byte b = io.readByte(); if (escaped) { if (b == SYNC_BYTE) { // sync byte following escape is an error, resync message(name + ": unexpected sync byte"); inSync = false; continue; } b ^= 0x20; escaped = false; } else if (b == ESCAPE_BYTE) { escaped = true; continue; } else if (b == SYNC_BYTE) { if (count < 4) { // too-small frames are ignored count = 0; continue; } byte[] packet = new byte[count - 2]; System.arraycopy(receiveBuffer, 0, packet, 0, count - 2); int readCrc = (receiveBuffer[count - 2] & 0xff) | (receiveBuffer[count - 1] & 0xff) << 8; int computedCrc = Crc.calc(packet, packet.length); if (DEBUG) { System.err.println("received: "); Dump.printPacket(System.err, packet); System.err.println(" rcrc: " + Integer.toHexString(readCrc) + " ccrc: " + Integer.toHexString(computedCrc)); } if (readCrc == computedCrc) { return packet; } else { message(name + ": bad packet"); /* * We don't lose sync here. If we did, garbage on the line at startup * will cause loss of the first packet. */ count = 0; continue; } } receiveBuffer[count++] = b; } } // Class to build a framed, escaped and crced packet byte stream static class Escaper { byte[] escaped; int escapePtr; int crc; // We're building a length-byte packet Escaper(int length) { escaped = new byte[2 * length]; escapePtr = 0; crc = 0; escaped[escapePtr++] = SYNC_BYTE; } static private boolean needsEscape(int b) { return b == SYNC_BYTE || b == ESCAPE_BYTE; } void nextByte(int b) { b = b & 0xff; crc = Crc.calcByte(crc, b); if (needsEscape(b)) { escaped[escapePtr++] = ESCAPE_BYTE; escaped[escapePtr++] = (byte) (b ^ 0x20); } else { escaped[escapePtr++] = (byte) b; } } void terminate() { escaped[escapePtr++] = SYNC_BYTE; } } // Write a packet of type 'packetType', first byte 'firstByte' // and bytes 2..'count'+1 in 'packet' private synchronized void writeFramedPacket(int packetType, int firstByte, byte[] packet, int count) throws IOException { if (DEBUG) { System.err.println("sending: "); Dump.printByte(System.err, packetType); Dump.printByte(System.err, firstByte); Dump.printPacket(System.err, packet); System.err.println(); } Escaper buffer = new Escaper(count + 6); buffer.nextByte(packetType); buffer.nextByte(firstByte); for (int i = 0; i < count; i++) { buffer.nextByte(packet[i]); } int crc = buffer.crc; buffer.nextByte(crc & 0xff); buffer.nextByte(crc >> 8); buffer.terminate(); byte[] realPacket = new byte[buffer.escapePtr]; System.arraycopy(buffer.escaped, 0, realPacket, 0, buffer.escapePtr); if (DEBUG) { Dump.dump("encoded", realPacket); } io.writeBytes(realPacket); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/ParseArgs.java000066400000000000000000000022421207233610700253130ustar00rootroot00000000000000 /** * Parse a string into tokens based on a sequence of delimiters * Given delimiters (single characters) d1, d2, ..., dn, this * class recognises strings of the form s0[d1s1][d2s2]...[dnsn], * where s does not contain character di * This is unambiguous if all di are distinct. If not, strings * are attributed to the earliest possible si (so if the delimiters * are : and :, and the input string is foo:bar, then s0 is foo, * s1 is bar and s2 is null */ package net.tinyos.packet; class ParseArgs { String tokens[]; int tokenIndex; ParseArgs(String s, String delimiterSequence) { int count = delimiterSequence.length(); tokens = new String[count + 1]; tokenIndex = 0; // Fill in the tokens int i = 0, lastMatch = 0; while (i < count) { int pos = s.indexOf(delimiterSequence.charAt(i++)); if (pos >= 0) { // When we finally find a delimiter, we know where // the last token ended tokens[lastMatch] = s.substring(0, pos); lastMatch = i; s = s.substring(pos + 1); } } tokens[lastMatch] = s; } String next() { return tokens[tokenIndex++]; } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/PhoenixError.java000066400000000000000000000050541207233610700260540ustar00rootroot00000000000000// $Id: PhoenixError.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* Authors: David Gay * Intel Research Berkeley Lab * */ /** * @author David Gay * @author Intel Research Berkeley Lab */ package net.tinyos.packet; /** * An interface for reporting packet source errors. * * @version 1, 1 Aug 2003 * @author David Gay */ public interface PhoenixError { /** * This method is called to signal a problem with a packet source * @param e The IOExcpetion that occured */ public void error(java.io.IOException e); } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/PhoenixSource.java000066400000000000000000000165461207233610700262330ustar00rootroot00000000000000// $Id: PhoenixSource.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.packet; import net.tinyos.util.*; import java.io.*; import java.util.*; /** * A PhoenixSource builds upon a PacketSource to provide the following * features: * - automatic reading and dispatching of packets (registerPacketListener * and deregisterPacketListener) * - automatic source restarting (via setResurrection), off by default * * PhoenixSources are threads and hence need to be started. PhoenixSources * are not PacketSources (direct reads are no longer allowed, open and * close is less meaningful with automatic restart). * * net.tinyos.message.MoteIF builds upon a PhoenixSource, not a PacketSource. * * PhoenixSources are built using the makePhoenix methods in BuildSource */ public class PhoenixSource extends Thread implements PhoenixError { private PacketSource source; private Messenger messages; private Vector listeners; private boolean phoenixLike = true; // does it rise from the ashes? private boolean started; private PhoenixError errorHandler = this; protected void message(String s) { if (messages != null) messages.message(s); } // Wait for thread to start public synchronized void awaitStartup() throws IOException { while (!started) { try { wait(); } catch (InterruptedException e) { throw new IOException("interrupted"); } } } private synchronized void started() { started = true; notify(); } synchronized private void stopped() { started = false; } /** * Build PhoenixSources using makePhoenix in BuildSource */ PhoenixSource(PacketSource source, Messenger messages) { this.source = source; this.messages = messages; listeners = new Vector(); } /** * Shutdown a PhoenixSource (closes underlying packet source) * close errors are NOT reported to the error handler, instead * a simple message is sent */ synchronized public void shutdown() { phoenixLike = false; try { source.close(); interrupt(); } catch (IOException e) { message("close error " + e); } } /** * @return This PhoenixSource's PacketSource */ public PacketSource getPacketSource() { return source; } /** * Write a packet. Waits for PhoenixSource thread to start * @param packet Packet to write (same format as PacketSource) * @return false if packet wasn't received (only the serial * and network packet sources currently provide this indication) * Note that a true result does not guarantee reception */ public boolean writePacket(byte[] packet) throws IOException { awaitStartup(); return source.writePacket(packet); } /** * Register a new packet listener * @param listener listener.packetReceived will be invoked for * all packets received on this packet source (see PacketSource * for a description of the packet format). The listener will * be invoked in the context of the PhoenixSource thread. */ public void registerPacketListener(PacketListenerIF listener) { listeners.addElement(listener); } /** * Remove a packet listener * @param listener Listener to remove (if it was registered twice, * only one entry will be removed) */ public void deregisterPacketListener(PacketListenerIF listener) { listeners.remove(listener); } private void packetDipatchLoop() throws IOException { for (;;) { dispatch(source.readPacket()); } } private void dispatch(byte[] packet) { Enumeration e = listeners.elements(); while (e.hasMoreElements()) { PacketListenerIF listener = (PacketListenerIF)e.nextElement(); listener.packetReceived(packet); } } public void run() { while (phoenixLike) { try { source.open(messages); started(); packetDipatchLoop(); } catch (IOException e) { stopped(); if (phoenixLike) errorHandler.error(e); } } } /** * Set the error handler for this PhoenixSource. When an IOException e * is thrown by this PhoenixSource's PacketSource (note that this * implicitly closes the PacketSource), errorHandler.error is invoked * with e as an argument. When the error handler returns, the * PhoenixSource will restart (i.e., reopen the packet source and try * to read messages), except if the shutdown method has * been called. * @param errorHandler The packet source error handler for this * PhoenixSource */ synchronized public void setPacketErrorHandler(PhoenixError errorHandler) { this.errorHandler = errorHandler; } /** * Turn resurrection on. This changes the current packet error handler * (see setPacketErrorHandler) to one that automatically * restarts the packet source after a 2s delay */ public void setResurrection() { setPacketErrorHandler(new PhoenixError() { public void error(IOException e) { message(source.getName() + " died - restarting"); try { sleep(2000); } catch (InterruptedException ie) { } } }); } // Default error handler public void error(IOException e) { String msg = source.getName() + " died - exiting (" + e + ")"; if (messages != null) { message(msg); } else { // We always try and print this message as we're about to exit. System.err.println(msg); } System.exit(2); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/Platform.java000066400000000000000000000012511207233610700252070ustar00rootroot00000000000000package net.tinyos.packet; import java.util.*; class Platform { static int x; static Hashtable platforms; static void add(int dummy, String name, int baudrate) { platforms.put(name, new Integer(baudrate)); } static int get(String name) { if (platforms == null) { platforms = new Hashtable(); try { BaudRate.init(); } catch (Exception e) { System.err.println("Failed to initialize baud rates for platforms. Serial communication may not work properly."); } } Object val = platforms.get(name); if (val != null) return ((Integer)val).intValue(); else return -1; } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/SFProtocol.java000066400000000000000000000112561207233610700254630ustar00rootroot00000000000000// $Id: SFProtocol.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.packet; import java.io.*; /** * This is the TinyOS 2.x serial forwarder protocol. It is incompatible * with the TinyOS 1.x serial forwarder protocol to avoid accidentally * mixing TinyOS 1.x and 2.x serial forwarders, applications, etc. */ abstract public class SFProtocol extends AbstractSource { // Protocol version, written at connection-open time // 2 bytes: first byte is always 'U', second byte is // protocol version // The actual protocol used will be min(my-version, other-version) // current protocols: // ' ': initial protocol, no further connection data, packets are // 1-byte length followed by n-bytes data. Length must be at least 1. final static byte VERSION[] = {'U', ' '}; int version; // The protocol version we're running (negotiated) protected InputStream is; protected OutputStream os; protected SFProtocol(String name) { super(name); } protected void openSource() throws IOException { // Assumes streams are open os.write(VERSION); byte[] partner = readN(2); // Check that it's a valid header (min version is ' ') if (partner[0] != VERSION[0]) throw new IOException("protocol error"); // Actual version is min received vs our version version = partner[1] & 0xff; int ourversion = VERSION[1] & 0xff; if (ourversion < version) version = ourversion; // Handle the different protocol versions (currently only one) // Any connection-time data-exchange goes here switch (version) { case ' ': break; default: throw new IOException("bad protocol version"); } } protected byte[] readSourcePacket() throws IOException { // Protocol is straightforward: 1 size byte, data bytes byte[] size = readN(1); if (size[0] == 0) throw new IOException("0-byte packet"); byte[] read = readN(size[0] & 0xff); //Dump.dump("reading", read); return read; } protected byte[] readN(int n) throws IOException { byte[] data = new byte[n]; int offset = 0; // A timeout would be nice, but there's no obvious way to // write it before java 1.4 (probably some trickery with // a thread and closing the stream would do the trick, but...) while (offset < n) { int count = is.read(data, offset, n - offset); if (count == -1) throw new IOException("end-of-stream"); offset += count; } return data; } protected boolean writeSourcePacket(byte[] packet) throws IOException { if (packet.length > 255) throw new IOException("packet too long"); if (packet.length == 0) throw new IOException("packet too short"); //Dump.dump("writing", packet); os.write((byte)packet.length); os.write(packet); os.flush(); return true; } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/SFSource.java000066400000000000000000000053301207233610700251160ustar00rootroot00000000000000// $Id: SFSource.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.packet; import java.io.*; import java.net.*; /** * Packet source (tcp/ip client) for the new serial forwarder protocol */ class SFSource extends SFProtocol { private Socket socket; private String host; private int port; /** * Packetizers are built using the makeXXX methods in BuildSource */ SFSource(String host, int port) { super("sf@" + host + ":" + port); this.host = host; this.port = port; } protected void openSource() throws IOException { socket = new Socket(host, port); is = socket.getInputStream(); os = socket.getOutputStream(); super.openSource(); } protected void closeSource() throws IOException { socket.close(); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/SerialByteSource.java000066400000000000000000000117041207233610700266530ustar00rootroot00000000000000// $Id: SerialByteSource.java,v 1.7 2010-06-29 22:07:41 scipio Exp $ package net.tinyos.packet; /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ import java.io.*; import net.tinyos.comm.*; /** * A serial port byte source using net.tinyos.comm */ public class SerialByteSource extends StreamByteSource implements SerialPortListener { private SerialPort serialPort; private String portName; private int baudRate; public SerialByteSource(String portName, int baudRate) { this.portName = portName; this.baudRate = baudRate; } public void openStreams() throws IOException { // if (serialPort == null) { try { serialPort = new TOSSerial(portName); } catch (Exception e) { throw new IOException("Could not open " + portName + ": " + e.getMessage()); } /* * } else { if (!serialPort.open()) { throw new IOException("Could not * re-open " + portName); } } */ try { // serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); serialPort.setSerialPortParams(baudRate, 8, SerialPort.STOPBITS_1, false); serialPort.addListener(this); serialPort.notifyOn(SerialPortEvent.DATA_AVAILABLE, true); serialPort.notifyOn(SerialPortEvent.OUTPUT_EMPTY, true); } catch (Exception e) { serialPort.close(); throw new IOException("Could not configure " + portName + ": " + e.getMessage()); } is = serialPort.getInputStream(); os = serialPort.getOutputStream(); } public void closeStreams() throws IOException { serialPort.close(); synchronized (sync) { sync.notify(); } } public String allPorts() { /* * Enumeration ports = CommPortIdentifier.getPortIdentifiers(); if (ports == * null) return "No comm ports found!"; * * boolean noPorts = true; String portList = "Known serial ports:\n"; while * (ports.hasMoreElements()) { CommPortIdentifier port = * (CommPortIdentifier)ports.nextElement(); * * if (port.getPortType() == CommPortIdentifier.PORT_SERIAL) { portList += "- " + * port.getName() + "\n"; noPorts = false; } } if (noPorts) return "No comm * ports found!"; else return portList; */ return "Listing available comm ports is no longer supported."; } Object sync = new Object(); public byte readByte() throws IOException { // On Linux at least, javax.comm input streams are not interruptible. // Make them so, relying on the DATA_AVAILABLE serial event. synchronized (sync) { while (opened && is.available() == 0) { try { sync.wait(); } catch (InterruptedException e) { close(); throw new IOException("interrupted"); } } } if( opened ) return super.readByte(); else throw new IOException("closed"); } public void serialEvent(SerialPortEvent ev) { if (ev.getEventType() == SerialPortEvent.DATA_AVAILABLE) { synchronized (sync) { sync.notify(); } } } protected void finalize() { serialPort.finalize(); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/StreamByteSource.java000066400000000000000000000063131207233610700266670ustar00rootroot00000000000000// $Id: StreamByteSource.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.packet; import java.io.*; abstract public class StreamByteSource implements ByteSource { protected InputStream is; protected OutputStream os; protected boolean opened; protected StreamByteSource() { } abstract protected void openStreams() throws IOException; abstract protected void closeStreams() throws IOException; public void open() throws IOException { openStreams(); opened = true; } public void close() { if (opened) { opened = false; try { os.close(); is.close(); closeStreams(); } catch (Exception e) { } } } public byte readByte() throws IOException { int serialByte; if (!opened) throw new IOException("not open"); try { serialByte = is.read(); } catch (IOException e) { serialByte = -1; } if (serialByte == -1) { close(); throw new IOException("read error"); } return (byte)serialByte; } public void writeBytes(byte[] bytes) throws IOException { if (!opened) throw new IOException("not open"); try { os.write(bytes); os.flush(); } catch (IOException e) { close(); throw new IOException("write error"); } } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/packet/package.html000066400000000000000000000015411207233610700250430ustar00rootroot00000000000000 Provides for transforming byte arrays into TinyOS packet abstractions.

    Package Specification

    Related Documentation

    The mig tool generates packets from arbitrary packet format delcarations. tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sf/000077500000000000000000000000001207233610700217225ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sf/Makefile000066400000000000000000000001271207233610700233620ustar00rootroot00000000000000# Top-level Makefile for tools/java ROOT = ../../.. include $(ROOT)/Makefile.include tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sf/README000066400000000000000000000006261207233610700226060ustar00rootroot00000000000000Package: net.tinyos.sf Description: provides serial port multiplexing Author: Bret Hull David Gay This application instantiates a server which provides a bi-directional packet stream between a mote connected to the host PC and clients anywhere on the network. For more information, see "serialforwarder.pdf" in the "doc" directory. tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sf/SFClient.java000066400000000000000000000104641207233610700242410ustar00rootroot00000000000000// $Id: SFClient.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * File: ServerReceivingThread.java * * Description: * The ServerReceivingThread listens for requests * from a connected Aggregator Server. If a data * packet is received, it is sent on to the serial * port. * * @author Bret Hull * @author David Gay * */ package net.tinyos.sf; import java.net.*; import java.io.*; import java.util.*; import net.tinyos.packet.*; public class SFClient extends SFProtocol implements Runnable, PacketListenerIF { private Thread thread; private Socket socket = null; private SerialForwarder sf; private SFListen listenServer; public SFClient(Socket socket, SerialForwarder serialForward, SFListen listenSvr) { super(""); thread = new Thread(this); sf = serialForward; listenServer = listenSvr; this.socket = socket; InetAddress addr = socket.getInetAddress(); name = "client at " + addr.getHostName() + " (" + addr.getHostAddress() + ")"; sf.debug.message("new " + name); } protected void openSource() throws IOException { is = socket.getInputStream(); os = socket.getOutputStream(); super.openSource(); } protected void closeSource() throws IOException { socket.close(); } private void init() throws IOException { sf.incrementClients(); open(sf); listenServer.source.registerPacketListener(this); } public void shutdown() { try { close(); } catch (IOException e) { } } public void start() { thread.start(); } public final void join(long millis) throws InterruptedException { thread.join(millis); } public void run() { try { init(); readPackets(); } catch (IOException e) { } finally { listenServer.source.deregisterPacketListener(this); listenServer.removeSFClient(this); sf.decrementClients(); shutdown(); } } private void readPackets() throws IOException { for (;;) { byte[] packet = readPacket(); sf.incrementPacketsWritten(); if (!listenServer.source.writePacket(packet)) sf.verbose.message("write failed"); } } public void packetReceived(byte[] packet) { try { writePacket(packet); } catch (IOException e) { shutdown(); } } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sf/SFConsoleRenderer.java000066400000000000000000000057061207233610700261170ustar00rootroot00000000000000//$Id: SFConsoleRenderer.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ //@author Cory Sharp package net.tinyos.sf; public class SFConsoleRenderer implements SFRenderer { boolean statusLine = false; boolean listening = false; int nclients = 0; int nread = 0; int nwritten = 0; public void SFConsoleRenderer() { } void clearStatus() { if( statusLine ) { System.out.print("\r \r"); statusLine = false; } } void updateStatus() { clearStatus(); System.out.print( (listening?"SF enabled":"SF disabled") + ", " + nclients + " " + (nclients==1?"client":"clients") + ", " + nread + " " + (nread==1?"packet":"packets") + " read, " + nwritten + " " + (nwritten==1?"packet":"packets") + " written" + " " ); statusLine = true; } public void message( String msg ) { clearStatus(); System.out.println(msg); updateStatus(); } public void updatePacketsRead( int n ) { nread = n; updateStatus(); } public void updatePacketsWritten( int n ) { nwritten = n; updateStatus(); } public void updateNumClients( int n ) { nclients = n; updateStatus(); } public void updateListenServerStatus( boolean b ) { listening = b; updateStatus(); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sf/SFListen.java000066400000000000000000000130601207233610700242540ustar00rootroot00000000000000// $Id: SFListen.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * File: ListenServer.java * * Description: * The Listen Server is the heart of the serial forwarder. Upon * instantiation, this class spawns the SerialPortReader and the * Multicast threads. As clients connect, this class spawns * ServerReceivingThreads as wells as registers the new connection * SerialPortReader. This class also provides the central * point of contact for the GUI, allowing the server to easily * be shut down * * @author Bret Hull * @author David Gay */ package net.tinyos.sf; import java.net.*; import java.io.*; import java.util.*; import net.tinyos.packet.*; public class SFListen extends Thread implements PacketListenerIF, PhoenixError { PhoenixSource source; private ServerSocket serverSocket; private Vector clients = new Vector(); private SerialForwarder sf; public SFListen(SerialForwarder sf) { this.sf = sf; } // IO error on packet source, restart it // This is essentially the same as the standard resurrection error // handler, but sends the error message to a different location // (sf.message vs sf.verbose.message) public void error(IOException e) { if (e.getMessage() != null) { sf.message(e.getMessage()); } sf.message(source.getPacketSource().getName() + " died - restarting"); try { sleep(5000); } catch (InterruptedException ie) { } } public void run() { try { sf.verbose.message("Listening to " + sf.motecom); source = BuildSource.makePhoenix(sf.motecom, sf.verbose); if (source == null) { sf.message("Invalid source " + sf.motecom + ", pick one of:"); sf.message(BuildSource.sourceHelp()); return; } source.setPacketErrorHandler(this); source.registerPacketListener(this); source.start(); // open up our server socket try { serverSocket = new ServerSocket(sf.serverPort); } catch (Exception e) { sf.message("Could not listen on port: " + sf.serverPort); source.shutdown(); return; } sf.verbose.message("Listening for client connections on port " + sf.serverPort); try { for (;;) { Socket currentSocket = serverSocket.accept(); SFClient newServicer = new SFClient(currentSocket, sf, this); clients.add(newServicer); newServicer.start(); } } catch (IOException e) { } } finally { cleanup(); sf.verbose.message("--------------------------"); } } private void cleanup() { shutdownAllSFClients(); sf.verbose.message("Closing source"); if (source != null) { source.shutdown(); } sf.verbose.message("Closing socket"); if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { } } sf.listenServerStopped(); } private void shutdownAllSFClients() { sf.verbose.message("Shutting down all client connections"); SFClient crrntServicer; while (clients.size() != 0) { crrntServicer = (SFClient)clients.firstElement(); crrntServicer.shutdown(); try { crrntServicer.join(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public void removeSFClient(SFClient clientS) { clients.remove(clientS); } public void packetReceived(byte[] packet) { sf.incrementPacketsRead(); } public void shutdown() { try { if (serverSocket != null) { serverSocket.close(); } } catch (IOException e) { sf.debug.message("shutdown error " + e); } } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sf/SFNullRenderer.java000066400000000000000000000005051207233610700254170ustar00rootroot00000000000000package net.tinyos.sf; public class SFNullRenderer implements SFRenderer { public void message(String msg) { } public void updatePacketsRead(int n) { } public void updatePacketsWritten(int n) { } public void updateNumClients(int n) { } public void updateListenServerStatus(boolean listening) { } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sf/SFRenderer.java000066400000000000000000000037361207233610700245750ustar00rootroot00000000000000//$Id: SFRenderer.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ //@author Cory Sharp package net.tinyos.sf; public interface SFRenderer { public void message( String msg ); public void updatePacketsRead( int n ); public void updatePacketsWritten( int n ); public void updateNumClients( int n ); public void updateListenServerStatus( boolean listening ); } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sf/SFWindow.java000066400000000000000000000225231207233610700242710ustar00rootroot00000000000000// $Id: SFWindow.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * File: ControlWindow.java * * Description: * This class displays the GUI that allows the serial forwarder * to be more easily configured * * @author Bret Hull * @author David Gay */ package net.tinyos.sf; import javax.swing.*; import java.awt.*; import java.awt.event.*; import net.tinyos.packet.*; public class SFWindow extends JPanel implements WindowListener, SFRenderer { JScrollPane mssgPanel = new JScrollPane(); JTextArea mssgArea = new JTextArea(); BorderLayout toplayout = new BorderLayout(); JTabbedPane pnlTabs = new JTabbedPane(); JLabel labelPacketsSent = new JLabel(); JLabel labelServerPort = new JLabel(); JTextField fieldServerPort = new JTextField(); JLabel labelMoteCom = new JLabel(); JLabel labelPacketsReceived = new JLabel(); JTextField fieldMoteCom = new JTextField(); ButtonGroup bttnGroup = new ButtonGroup(); JPanel pnlMain = new JPanel(); GridLayout gridLayout1 = new GridLayout(); JLabel labelNumClients = new JLabel(); JCheckBox cbVerboseMode = new JCheckBox(); JButton bStopServer = new JButton(); GridLayout gridLayout2 = new GridLayout(); JButton bHelp = new JButton(); JButton bClear = new JButton(); JButton bQuit = new JButton(); private SerialForwarder sf; public SFWindow(SerialForwarder SF) { sf = SF; try { jbInit(); } catch(Exception e) { e.printStackTrace(); System.exit(2); } } static public SFWindow createGui( SerialForwarder sf, String title ) { JFrame mainFrame = new JFrame(title); SFWindow cntrlWndw = new SFWindow(sf); mainFrame.setSize(cntrlWndw.getPreferredSize()); mainFrame.getContentPane().add("Center", cntrlWndw); mainFrame.show(); mainFrame.addWindowListener(cntrlWndw); return cntrlWndw; } private void jbInit() throws Exception { this.setLayout(toplayout); mssgPanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); mssgPanel.setAutoscrolls(true); this.setMinimumSize(new Dimension(500, 250)); this.setPreferredSize(new Dimension(500, 300)); labelPacketsSent.setFont(new java.awt.Font("Dialog", 1, 10)); labelPacketsSent.setHorizontalTextPosition(SwingConstants.LEFT); labelPacketsSent.setText("Pckts Read: 0"); labelServerPort.setFont(new java.awt.Font("Dialog", 1, 10)); labelServerPort.setText("Server Port:"); fieldServerPort.setFont(new java.awt.Font("Dialog", 0, 10)); fieldServerPort.setText(Integer.toString (sf.serverPort)); labelMoteCom.setFont(new java.awt.Font("Dialog", 1, 10)); labelMoteCom.setText("Mote Communications:"); labelPacketsReceived.setFont(new java.awt.Font("Dialog", 1, 10)); labelPacketsReceived.setHorizontalTextPosition(SwingConstants.LEFT); labelPacketsReceived.setText("Pckts Wrttn: 0"); fieldMoteCom.setFont(new java.awt.Font("Dialog", 0, 10)); fieldMoteCom.setText(sf.motecom); // Input CheckBoxes ActionListener cbal = new ActionListener() { public void actionPerformed(ActionEvent e) { updateGlobals(); } }; bQuit.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { shutdown(); } }); bQuit.setText("Quit"); bQuit.setFont(new java.awt.Font("Dialog", 1, 10)); bClear.addActionListener(new java.awt.event.ActionListener() { public synchronized void actionPerformed(ActionEvent e) { mssgArea.setText(""); sf.clearCounts(); } }); bClear.setText("Clear"); bClear.setFont(new java.awt.Font("Dialog", 1, 10)); bHelp.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { sf.message("The Mote communications field must"); sf.message("specify a known packet source, one of:"); sf.message(BuildSource.sourceHelp()); } }); bHelp.setText("Help"); bHelp.setFont(new java.awt.Font("Dialog", 1, 10)); pnlMain.setLayout(gridLayout1); pnlMain.setMinimumSize(new Dimension(150, 75)); pnlMain.setPreferredSize(new Dimension(150, 75)); gridLayout1.setRows(13); labelNumClients.setFont(new java.awt.Font("Dialog", 1, 10)); labelNumClients.setText("Num Clients: 0"); cbVerboseMode.setSelected(sf.verbose.on); cbVerboseMode.setText("Verbose Mode"); cbVerboseMode.setFont(new java.awt.Font("Dialog", 1, 10)); cbVerboseMode.addActionListener(cbal); bStopServer.setFont(new java.awt.Font("Dialog", 1, 10)); bStopServer.setText("Stop Server"); bStopServer.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { if (sf.listenServer != null) { sf.stopListenServer(); } else { updateGlobals(); sf.startListenServer(); } } }); gridLayout2.setRows(15); gridLayout2.setColumns(1); toplayout.setHgap(1); toplayout.setVgap(1); this.add(mssgPanel, BorderLayout.CENTER); this.add(pnlTabs, BorderLayout.EAST); pnlTabs.add(pnlMain, "Main"); // Main Panel Setup pnlMain.add(labelServerPort, null); pnlMain.add(fieldServerPort, null); pnlMain.add(labelMoteCom, null); pnlMain.add(fieldMoteCom, null); pnlMain.add(bStopServer, null); pnlMain.add(cbVerboseMode, null); pnlMain.add(labelPacketsSent, null); pnlMain.add(labelPacketsReceived, null); pnlMain.add(labelNumClients, null); pnlMain.add(bHelp, null); pnlMain.add(bClear, null); pnlMain.add(bQuit, null); mssgPanel.getViewport().add(mssgArea, null); mssgArea.setFont(new java.awt.Font("Monospaced", Font.PLAIN, 12)); } public synchronized void windowClosing (WindowEvent e) { shutdown(); } public void windowClosed (WindowEvent e) { } public void windowActivated (WindowEvent e) { } public void windowIconified (WindowEvent e) { } public void windowDeactivated (WindowEvent e) { } public void windowDeiconified (WindowEvent e) { } public void windowOpened (WindowEvent e) { } public synchronized void message(String mssg) { mssgArea.append(mssg + "\n"); mssgArea.setCaretPosition(mssgArea.getDocument().getLength()); } public void updatePacketsRead(int numPackets) { labelPacketsSent.setText("Pckts Read: " + numPackets); } public void updatePacketsWritten(int numPackets) { labelPacketsReceived.setText("Pckts Wrttn: " + numPackets); } public void updateNumClients(int numClients) { labelNumClients.setText("Num Clients: " + numClients); } private void updateGlobals() { // set application/communications defaults sf.verbose.on = cbVerboseMode.isSelected(); sf.motecom = fieldMoteCom.getText(); sf.serverPort = Integer.parseInt(fieldServerPort.getText()); } public void updateListenServerStatus(boolean running) { if (!running) { bStopServer.setText("Start Server"); } else { bStopServer.setText("Stop Server"); } } synchronized private void shutdown() { //sf.cntrlWndw = null; sf.stopListenServer(); System.out.println("Serial Forwarder Exited Normally\n"); System.exit(0); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sf/SerialForwarder.java000066400000000000000000000156261207233610700256720ustar00rootroot00000000000000// $Id: SerialForwarder.java,v 1.6 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * File: SerialForwarder.java * * Description: * The SerialForwarder class provides many static functions * that handle the initialization of the serialforwarder * and/or the associated gui. * * @author Bret Hull * @author David Gay */ package net.tinyos.sf; import java.io.*; import net.tinyos.packet.*; import net.tinyos.util.*; public class SerialForwarder implements Messenger { public static final int DEFAULT_PORT = 9002; // appication defaults public SFRenderer renderer; public SFListen listenServer; public String motecom = "serial@com1:57600"; public boolean logDB; public int serverPort = DEFAULT_PORT; private boolean displayHelp = false; private int nClients = 0; private int nPacketsRead = 0; private int nPacketsWritten = 0; private SFListen listener = null; SFMessenger verbose = new SFMessenger(true); SFMessenger debug = new SFMessenger(false); class SFMessenger implements Messenger { boolean on; SFMessenger(boolean on) { this.on = on; } public void message(String message) { if (on) { SerialForwarder.this.message(message); } } } public static void main(String[] args) throws IOException { new SerialForwarder(args); } public SerialForwarder(String[] args) throws IOException { ProcessCommandLineArgs(args); if (displayHelp) { printHelp(); System.exit(2); } if(renderer == null) { // Default is GUI renderer = SFWindow.createGui(this, "TinyOS 2.x Serial Forwarder"); } startListenServer(); } private void ProcessCommandLineArgs(String[] args) { for (int i = 0; i < args.length; i++) { debug.message(args[i]); } for (int i = 0; i < args.length; i++) { if (args[i].equals("-no-gui") && renderer == null) { renderer = new SFConsoleRenderer(); } else if(args[i].equals("-no-output") && renderer == null) { renderer = new SFNullRenderer(); } else if (args[i].equals("-comm")) { i++; if (i < args.length) { motecom = args[i]; } else { displayHelp = true; } } else if (args[i].equals("-port")) { i++; if (i < args.length) { serverPort = Integer.parseInt(args[i]); } else { displayHelp = true; } } else if (args[i].equals("-log")) { logDB = true; } else if (args[i].equals("-quiet")) { verbose.on = false; } else if (args[i].equals("-debug")) { debug.on = true; } else { displayHelp = true; } } } private static void printHelp() { System.err.println("optional arguments:"); System.err.println("-port [server port] (default " + DEFAULT_PORT + ")"); System.err.println("-comm [motecom spec] (default serial@com1:57600)"); System.err.println("-packetsize [size] (default 36)"); System.err.println("-no-gui = do not display graphic interface"); System.err.println("-no-output"); System.err.println("-quiet = non-verbose mode"); System.err.println("-debug = display debug messages"); System.err.println("-log = log to database"); } private void createGui() { renderer = SFWindow.createGui(this, "SerialForwarder"); } public void message(String msg) { renderer.message(msg); } synchronized public void incrementPacketsRead() { nPacketsRead++; renderer.updatePacketsRead(nPacketsRead); } synchronized public void incrementPacketsWritten() { nPacketsWritten++; renderer.updatePacketsWritten(nPacketsWritten); } synchronized public void incrementClients() { nClients++; renderer.updateNumClients(nClients); } synchronized public void decrementClients() { nClients--; renderer.updateNumClients(nClients); } public synchronized void clearCounts() { nPacketsRead = nPacketsWritten = 0; renderer.updatePacketsWritten(nPacketsWritten); renderer.updatePacketsRead(nPacketsRead); } public synchronized void startListenServer() { if (listenServer == null) { nClients = 0; listenServer = new SFListen(this); listenServer.start(); } renderer.updateListenServerStatus(true); renderer.updateNumClients(nClients); clearCounts(); } public void stopListenServer() { SFListen lserver; // We can't just make stopSFListen synchronized because // listenServerStopped must be synchronized too synchronized (this) { lserver = listenServer; if (lserver != null) listenServer.shutdown(); } if (lserver != null) { try { lserver.join(2000); } catch (InterruptedException ex) { } } } public synchronized void listenServerStopped() { listenServer = null; renderer.updateListenServerStatus(false); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sf/package.html000066400000000000000000000016101207233610700242010ustar00rootroot00000000000000 Provides a communication source mux/demux (SerialForwarder) that allows multiple clients to share a single packet source.

    Package Specification

    Related Documentation

    Lesson 4 of the TinyOS tutorials describes how to use SerialForwarder. tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sim/000077500000000000000000000000001207233610700221025ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sim/LinkLayerModel.java000066400000000000000000000641071207233610700256300ustar00rootroot00000000000000/**************************************************************************** * * Copyright (c) 2006 The University of Southern California" * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Marco Zuniga, Avinash Sridharan * Director: Prof. Bhaskar Krishnamachari * Autonomous Networks Reseach Group, University of Southern California * http://ceng.usc.edu/~anrg * Contact: marcozun@usc.edu * * Date last modified: 2004/07/02 marcozun * Date last modified: 2006/02/05 asridhar * * * Description: This file contains the code that generates the * gains for all links in the network and noise floor values for * all nodes. * ****************************************************************************/ package net.tinyos.sim; import java.io.*; import java.util.*; import java.text.DecimalFormat; /** * Stores channel, radio and topology parameters provided by user * through the configuration file. */ class InputVariables { // Channel parameters double n; // path loss exponent double sigma; // standard deviation shadowing variance double d0; // reference distance double pld0; // power decay for reference distance d0 // Radio parameters double pn; // radio noise floor double wgn; // white gaussian noise // Covariance Matrix for hardware variance double s11; double s12; double s21; double s22; // Topology parameters int numNodes; // number of nodes int top; // topology option double grid; // grid unit double Xterr; // X dimension of Terrain double Yterr; // Y dimension of Terrain String topFile; // file name with nodes' coordinates (user-defined) // data directly derived from configuration file double area; // area of the terrain InputVariables() { // Constructor, loading default values n = 3; sigma = 3; pld0 = 55; d0 = 1; pn = -105; wgn = 4; s11 = 3.7; s12 = -3.3; s21 = -3.3; s22 = 6.0; numNodes= 0; top = 0; Xterr = 0; Yterr = 0; topFile = ""; area = 0; } } /** * Stores nodes' coordinates, link gains and noise floor values for a given topology */ class OutputVariables { double[] nodePosX; // X coordinate double[] nodePosY; // Y coordinate double[] outputpowervar; // output power double[] noisefloor; // noise floor double[][] linkGain; // link gain OutputVariables(int numNodes) { // Constructor nodePosX = new double[numNodes]; nodePosY = new double[numNodes]; outputpowervar = new double[numNodes]; noisefloor = new double[numNodes]; linkGain = new double[numNodes][numNodes]; } } /** * Simulates gains for all links of a specific topology, and noise * floor values for all nodes.

    The link gain between nodes A and B * is defined as the output power of A minus the pathloss between A * and B. The user specifies the desired channel, radio and topology * parameters through a configuration file. The configuration file is * provided as a command line argument: $ java LinkLayerModel * configurationFileName, and the link gains and noise floor * values are provided on a file called linkgain.out. */ public class LinkLayerModel { public static void main (String args[]) { if (args.length != 1) { usage(); return; } // variable that contains input parameters InputVariables inVar = new InputVariables(); // parse configuration file and store parameters in inVar readFile ( args[0], inVar ); // if user defined topology (TOPOLOGY = 4), obtain number of nodes if (inVar.top == 4) { obtainNumNodes (inVar.topFile, inVar); } // variable that contains output data OutputVariables outVar = new OutputVariables( inVar.numNodes ); // create topology System.out.print("Topology ...\t\t\t"); obtainTopology ( inVar, outVar ); System.out.println("done"); // obtain ouput power and noise floor for all nodes System.out.print("Radio Pt and Pn ...\t\t"); obtainRadioPtPn ( inVar, outVar ); System.out.println("done"); // obtain link gains System.out.print("Links Gain .....\t\t"); obtainLinkGain ( inVar, outVar); System.out.println("done"); // print linkgain.out (link gains and noise floor) and topology.out (x/y coordinates) System.out.print("Printing Output File ...\t"); printFile ( inVar, outVar); System.out.println("done"); } /** * Parses configuration file provided by user and stores specified * parameters * * @param inputFile configuration file containing channel, radio and * deployment parameters * @param var class that stores input parameters from configuration file * @return true if file parsing was performed without errors */ protected static boolean readFile (String inputFile, InputVariables var ) { String thisLine; StringTokenizer st; // open configuration file try { FileInputStream fin = new FileInputStream(inputFile); try { BufferedReader myInput = new BufferedReader(new InputStreamReader(fin)); try { // parse the file while ((thisLine = myInput.readLine()) != null) { if ( !thisLine.equals("") && !thisLine.startsWith("%") ) { st = new StringTokenizer(thisLine, " =;\t"); String key = st.nextToken(); String value = st.nextToken(); if ( key.equals("PATH_LOSS_EXPONENT")) { var.n = Double.valueOf(value).doubleValue(); if (var.n < 0) { System.out.println("Error: value of PATH_LOSS_EXPONENT must be positive"); System.exit(1); } } else if ( key.equals("SHADOWING_STANDARD_DEVIATION")) { var.sigma = Double.valueOf(value).doubleValue(); if (var.sigma < 0) { System.out.println("Error: value of SHADOWING_STANDARD_DEVIATION must be positive"); System.exit(1); } } else if ( key.equals("PL_D0")) { var.pld0 = Double.valueOf(value).doubleValue(); if (var.pld0 < 0) { System.out.println("Error: value of PL_D0 must be positive"); System.exit(1); } } else if ( key.equals("D0")) { var.d0 = Double.valueOf(value).doubleValue(); if (var.d0 <= 0) { System.out.println("Error: value of D0 must be greater than zero"); System.exit(1); } } else if ( key.equals("NOISE_FLOOR")) { var.pn = Double.valueOf(value).doubleValue(); } else if ( key.equals("WHITE_GAUSSIAN_NOISE")) { var.wgn = Double.valueOf(value).doubleValue(); if (var.wgn < 0) { System.out.println("Error: value of WHITE_GAUSSIAN_NOISE must be greater equal than 0"); System.exit(1); } } else if ( key.equals("S11")) { var.s11 = Double.valueOf(value).doubleValue(); if (var.s11 < 0) { System.out.println("Error: value of S11 must be greater equal than 0"); System.exit(1); } } else if ( key.equals("S12")) { var.s12 = Double.valueOf(value).doubleValue(); } else if ( key.equals("S21")) { var.s21 = Double.valueOf(value).doubleValue(); } else if ( key.equals("S22")) { var.s22 = Double.valueOf(value).doubleValue(); if (var.s22 < 0) { System.out.println("Error: value of S22 must be greater equal than 0"); System.exit(1); } } else if ( key.equals("NUMBER_OF_NODES")) { var.numNodes = Integer.parseInt(value); if (var.numNodes <= 0) { System.out.println("Error: value of NUMBER_OF_NODES must be positive"); System.exit(1); } } else if ( key.equals("TOPOLOGY")) { var.top = Integer.parseInt(value); if ( (var.top < 1) | (var.top > 4) ) { System.out.println("Error: value of TOPOLOGY must be between 1 and 4"); System.exit(1); } } else if ( key.equals("GRID_UNIT")) { var.grid = Double.valueOf(value).doubleValue(); } else if ( key.equals("TOPOLOGY_FILE")) { var.topFile = value; } else if ( key.equals("TERRAIN_DIMENSIONS_X")) { var.Xterr = Double.valueOf(value).doubleValue(); if (var.Xterr < 0) { System.out.println("Error: value of TERRAIN_DIMENSIONS_X must be positive"); System.exit(1); } } else if ( key.equals("TERRAIN_DIMENSIONS_Y")) { var.Yterr = Double.valueOf(value).doubleValue(); if (var.Yterr < 0) { System.out.println("Error: value of TERRAIN_DIMENSIONS_Y must be positive"); System.exit(1); } var.area = var.Xterr * var.Yterr; } else { System.out.println("Error: undefined parameter " + key + ", please review your configuration file"); System.exit(1); } } } // end while loop } catch (Exception e) { System.out.println("Error1: " + e); System.exit(1); } } // end try catch (Exception e) { System.out.println("Error2: " + e); System.exit(1); } } // end try catch (Exception e) { System.out.println("Error Failed to Open file " + inputFile + e); System.exit(1); } return true; } /** * Obtain X and Y coordinates for all nodes. Different type of topologies are available * (grid, uniform, random, user-defined) * * @param inVar class that contains input parameters from configuration file * @param outVar class that stores x/y coordinates * @return true if X/Y coordinates are obtained without errors */ protected static boolean obtainTopology( InputVariables inVar, OutputVariables outVar ) { Random rand = new Random(); int i, j; int sqrtNumNodes, nodesX; double cellArea, cellLength; double Xdist, Ydist, dist; boolean wrongPlacement; if (inVar.numNodes <= 0) { System.out.println("\nError: value of NUMBER_OF_NODES must be positive"); System.exit(1); } switch (inVar.top) { case 1: // GRID if (inVar.grid < inVar.d0) { System.out.println("\nError: value of GRID_UNIT must be equal or greater than D0"); System.exit(1); } sqrtNumNodes = (int) Math.sqrt(inVar.numNodes); if ( sqrtNumNodes != Math.sqrt(inVar.numNodes) ) { System.out.println ("\nError: on GRID topology, NUMBER_OF_NODES should be the square of a natural number"); System.exit(1); } for (i = 0; i < inVar.numNodes; i = i+1) { outVar.nodePosX[i] = (i%sqrtNumNodes) * inVar.grid; outVar.nodePosY[i] = (i/sqrtNumNodes) * inVar.grid; } break; case 2: // UNIFORM sqrtNumNodes = (int) Math.sqrt(inVar.numNodes); if ( sqrtNumNodes != Math.sqrt(inVar.numNodes) ) { System.out.println ("\nError: on UNIFORM topology, NUMBER_OF_NODES should be the square of a natural number"); System.exit(1); } if ( (inVar.Xterr <= 0) | (inVar.Yterr <= 0) ) { System.out.println("\nError: values of TERRAIN_DIMENSIONS must be positive"); System.exit(1); } if ( inVar.Xterr != inVar.Yterr ) { System.out.println("\nError: values of TERRAIN_DIMENSIONS_X and TERRAIN_DIMENSIONS_Y must be equal"); System.exit(1); } cellLength = Math.sqrt ( inVar.area / inVar.numNodes ); nodesX = sqrtNumNodes; if ( cellLength < (inVar.d0*1.4) ) { System.out.println ("\nError: on UNIFORM topology, density is too high, increase physical terrain"); System.exit(1); } for (i = 0; i < inVar.numNodes; i = i+1) { outVar.nodePosX[i] = (i%nodesX) * cellLength + rand.nextDouble()*cellLength; outVar.nodePosY[i] = (i/nodesX) * cellLength + rand.nextDouble()*cellLength; wrongPlacement = true; while ( wrongPlacement ) { for (j = 0; j < i; j = j+1) { Xdist = outVar.nodePosX[i] - outVar.nodePosX[j]; Ydist = outVar.nodePosY[i] - outVar.nodePosY[j]; // distance between a given pair of nodes dist = Math.pow((Xdist*Xdist + Ydist*Ydist), 0.5); if (dist < inVar.d0) { outVar.nodePosX[i] = (i%nodesX) * cellLength + rand.nextDouble()*cellLength; outVar.nodePosY[i] = (i/nodesX) * cellLength + rand.nextDouble()*cellLength; wrongPlacement = true; break; } } if ( j == i ) { wrongPlacement = false; } } } break; case 3: // RANDOM if ( (inVar.Xterr <= 0) | (inVar.Yterr <= 0) ) { System.out.println("\nError: values of TERRAIN_DIMENSIONS must be positive"); System.exit(1); } cellLength = Math.sqrt ( inVar.area / inVar.numNodes ); if ( cellLength < (inVar.d0*1.4) ) { System.out.println ("\nError: on RANDOM topology, density is too high, increase physical terrain"); System.exit(1); } for (i = 0; i < inVar.numNodes; i = i+1) { outVar.nodePosX[i] = rand.nextDouble() * inVar.Xterr; outVar.nodePosY[i] = rand.nextDouble() * inVar.Yterr; wrongPlacement = true; while ( wrongPlacement ) { for (j = 0; j < i; j = j+1) { Xdist = outVar.nodePosX[i] - outVar.nodePosX[j]; Ydist = outVar.nodePosY[i] - outVar.nodePosY[j]; // distance between a given pair of nodes dist = Math.pow((Xdist*Xdist + Ydist*Ydist), 0.5); if (dist < inVar.d0) { outVar.nodePosX[i] = rand.nextDouble() * inVar.Xterr; outVar.nodePosY[i] = rand.nextDouble() * inVar.Yterr; wrongPlacement = true; break; } } if ( j == i ) { wrongPlacement = false; } } } break; case 4: // FILE (user-defined topology) readTopologyFile(inVar.topFile, outVar); correctTopology (inVar, outVar); break; default: System.out.println("\nError: topology is not correct, please check TOPOLOGY in the configuration file"); System.exit(1); } return true; } /** * Checks that user-defined topology does not have inter-node distances less than D0 meter, * where D0 is the reference distance in the channel model (specified in configuration file) * * @param inVar class that stores input parameters from configuration file * @param outVar class that stores link gains, noise floors and x/y coordinates * @return true if x/y coordinates provided by user satisfy the condition that no internode distance is lesss than D0 */ protected static boolean correctTopology ( InputVariables inVar, OutputVariables outVar ) { Random rand = new Random(); int i, j; double Xdist, Ydist, dist, avgDecay; for (i = 0; i < inVar.numNodes; i = i+1) { for (j = i+1; j < inVar.numNodes; j = j+1 ) { Xdist = outVar.nodePosX[i] - outVar.nodePosX[j]; Ydist = outVar.nodePosY[i] - outVar.nodePosY[j]; // distance between a given pair of nodes dist = Math.pow((Xdist*Xdist + Ydist*Ydist), 0.5); if (dist < inVar.d0) { System.out.println("\nError: file " + inVar.topFile + " contains inter-node distances less than one."); System.exit(1); } } } return true; } /** * Obtains output power and noise floor for all nodes in the network * * @param inVar class that contains radio parameters * @param outVar class that stores output powers and noise floors * @return true if all output powers and noise floors were obtained correctly */ protected static boolean obtainRadioPtPn ( InputVariables inVar, OutputVariables outVar ) { Random rand = new Random(); int i, j; double t11, t12, t21, t22; double rn1, rn2; t11 = 0; t12 = 0; t21 = 0; t22 = 0; if ( (inVar.s11 == 0) && (inVar.s22 == 0) ) { // symmetric links do nothing } else if ( (inVar.s11 == 0) && (inVar.s22 != 0) ) { // both S11 and S22 must be 0 for symmetric links System.out.println("\nError: symmetric links require both, S11 and S22 to be 0, not only S11."); System.exit(1); } else { if ( (inVar.s12 != inVar.s21) ) { // check that S is symmetric System.out.println("\nError: S12 and S21 must have the same value."); System.exit(1); } if ( Math.abs(inVar.s12) > Math.sqrt(inVar.s11*inVar.s22) ) { // check that correlation is within [-1,1] System.out.println("\nError: S12 (and S21) must be less than sqrt(S11xS22)."); System.exit(1); } t11 = Math.sqrt(inVar.s11); t12 = inVar.s12/Math.sqrt(inVar.s11); t21 = 0; t22 = Math.sqrt( (inVar.s11*inVar.s22 - Math.pow( inVar.s12, 2)) / inVar.s11 ); } for (i = 0; i < inVar.numNodes; i = i+1) { rn1 = rand.nextGaussian(); rn2 = rand.nextGaussian(); outVar.noisefloor[i] = inVar.pn + t11 * rn1; outVar.outputpowervar[i] = t12 * rn1 + t22 * rn2; } return true; } /** * Obtains gain for all links in the network. The link gain between nodes A and B * is defined as the output power of A minus the pathloss between A and B. * * @param inVar class that contains channel parameters from configuration file * @param outVar class that stores link gains * @return true if all link gains were obtained correctly */ protected static boolean obtainLinkGain ( InputVariables inVar, OutputVariables outVar ) { Random rand = new Random(); int i, j; double Xdist, Ydist, dist, pathloss; for (i = 0; i < inVar.numNodes; i = i+1) { for (j = i+1; j < inVar.numNodes; j = j+1 ) { Xdist = outVar.nodePosX[i] - outVar.nodePosX[j]; Ydist = outVar.nodePosY[i] - outVar.nodePosY[j]; // distance between a given pair of nodes dist = Math.pow((Xdist*Xdist + Ydist*Ydist), 0.5); // mean decay dependent on distance pathloss = - inVar.pld0 - 10*inVar.n*(Math.log(dist/inVar.d0)/Math.log(10.0)) + ( rand.nextGaussian()*inVar.sigma ); // assymetric links are given by running two different // R.V.s for each unidirectional link (output power variance). outVar.linkGain[i][j] = outVar.outputpowervar[i] + pathloss; outVar.linkGain[j][i] = outVar.outputpowervar[j] + pathloss; } } return true; } /** * Provides link gain and noise floor in file linkgain.out, and the * X/Y coordinates in file topology.out. * * @param inVar class that contains input parameters from configuration file * @param outVar class that stores link gains, noise floors and x/y coordinates * @return true if files linkgain.out and topology.out were printed correctly */ protected static boolean printFile( InputVariables inVar, OutputVariables outVar ) { int i, j; DecimalFormat posFormat = new DecimalFormat("##0.00"); /* * Output file for xy coordinates. */ try{ FileOutputStream fout = new FileOutputStream("topology.out"); try { PrintStream myOutput = new PrintStream(fout); for (i = 0; i < inVar.numNodes; i = i+1) { myOutput.print( i + "\t" + posFormat.format(outVar.nodePosX[i]) + "\t"+ posFormat.format(outVar.nodePosY[i]) + "\n"); } } catch (Exception e) { System.out.println("\nError : Failed to open a print stream to the linkgain file" + e); } } catch (Exception e) { System.out.println("\nError : Failed to open the link gain file linkgains.out:" + e); } /* * Output file for link gains. */ try{ FileOutputStream fout = new FileOutputStream("linkgain.out"); try { PrintStream myOutput = new PrintStream(fout); for (i = 0; i < inVar.numNodes; i = i+1) { for (j = (i+1); j < inVar.numNodes; j = j+1 ) { if ( i != j) { myOutput.print( "gain\t" + i + "\t" + j + "\t" + posFormat.format(outVar.linkGain[i][j]) + "\n"); myOutput.print( "gain\t" + j + "\t" + i + "\t" + posFormat.format(outVar.linkGain[j][i]) + "\n"); } } } for (i = 0; i < inVar.numNodes; i = i+1) { myOutput.print( "noise\t" + i + "\t" + posFormat.format(outVar.noisefloor[i]) + "\t" + posFormat.format(inVar.wgn) + "\n"); } } catch (Exception e) { System.out.println("\nError : Failed to open a print stream to the linkgain file" + e); } } catch (Exception e) { System.out.println("\nError : Failed to open the link gain file linkgains.out:" + e); } return true; } /** * Obtains nodes coordinates for user-defined topology. * * @param inputTopoFile topology file provided by user * @param outVar class that contains variables to store x/y coordinates of nodes * @return true if x/y coordinates of user-defined topology file were read correctly. */ protected static boolean readTopologyFile ( String inputTopoFile, OutputVariables outVar ) { String thisLine; StringTokenizer st; int counter = 0; try { FileInputStream fin = new FileInputStream(inputTopoFile); try { BufferedReader myInput = new BufferedReader(new InputStreamReader(fin)); try { while ((thisLine = myInput.readLine()) != null) { if ( !thisLine.equals("") && !thisLine.startsWith("%") && !thisLine.startsWith(" ") ) { st = new StringTokenizer(thisLine, " \t"); int node = Integer.parseInt(st.nextToken()); double x = Double.valueOf(st.nextToken()).doubleValue(); double y = Double.valueOf(st.nextToken()).doubleValue(); outVar.nodePosX[node] = x; outVar.nodePosY[node] = y; counter++; } } } // end try catch (Exception e) { System.out.println("Error4: " + e); System.exit(1); } } // end try catch (Exception e) { System.out.println("Error5: " + e); System.exit(1); } } // end try catch (Exception e) { System.out.println("Error: Failed to Open TOPOLOGY_FILE " + inputTopoFile + e); System.exit(1); } return true; } /** * Obtains number of nodes in network when user defines the topology. * * @param inputTopoFile topology file provided by user * @param inVar class that contains variable for number of nodes * @return true if number of nodes from user-defined topology file were obtained correctly */ protected static boolean obtainNumNodes ( String inputTopoFile, InputVariables inVar ) { String thisLine; StringTokenizer st; int counter = 0; try { FileInputStream fin = new FileInputStream(inputTopoFile); try { BufferedReader myInput = new BufferedReader(new InputStreamReader(fin)); try { while ((thisLine = myInput.readLine()) != null) { if ( !thisLine.equals("") && !thisLine.startsWith("%") && !thisLine.startsWith(" ") ) { counter++; } } inVar.numNodes = counter; } // end try catch (Exception e) { System.out.println("Error4: " + e); System.exit(1); } } // end try catch (Exception e) { System.out.println("Error5: " + e); System.exit(1); } } // end try catch (Exception e) { System.out.println("Error: Failed to Open TOPOLOGY_FILE " + inputTopoFile + e); System.exit(1); } return true; } private static void usage() { System.err.println("usage: net.tinyos.sim.LinkLayerModel "); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sim/Makefile000066400000000000000000000001271207233610700235420ustar00rootroot00000000000000# Top-level Makefile for tools/java ROOT = ../../.. include $(ROOT)/Makefile.include tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/sim/package.html000066400000000000000000000015111207233610700243610ustar00rootroot00000000000000 Provides tools to generate communication topologies for TOSSIM.

    Package Specification

    Related Documentation

    Lesson 11 of the TinyOS tutorials describe how to use these tools. tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/tools/000077500000000000000000000000001207233610700224525ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/tools/Listen.java000066400000000000000000000062571207233610700245650ustar00rootroot00000000000000// $Id: Listen.java,v 1.5 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.tools; import java.io.*; import net.tinyos.packet.*; import net.tinyos.util.*; public class Listen { public static void main(String args[]) throws IOException { String source = null; PacketSource reader; if (args.length == 2 && args[0].equals("-comm")) { source = args[1]; } else if (args.length > 0) { System.err.println("usage: java net.tinyos.tools.Listen [-comm PACKETSOURCE]"); System.err.println(" (default packet source from MOTECOM environment variable)"); System.exit(2); } if (source == null) { reader = BuildSource.makePacketSource(); } else { reader = BuildSource.makePacketSource(source); } if (reader == null) { System.err.println("Invalid packet source (check your MOTECOM environment variable)"); System.exit(2); } try { reader.open(PrintStreamMessenger.err); for (;;) { byte[] packet = reader.readPacket(); Dump.printPacket(System.out, packet); System.out.println(); System.out.flush(); } } catch (IOException e) { System.err.println("Error on " + reader.getName() + ": " + e); } } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/tools/ListenRaw.java000066400000000000000000000136751207233610700252410ustar00rootroot00000000000000// $Id: ListenRaw.java,v 1.7 2010-06-29 22:07:41 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* Authors: Mike Chen, Philip Levis * Last Modified: 7/1/02 (transition to nesC) * */ /** * @author Mike Chen * @author Philip Levis */ package net.tinyos.tools; import java.io.*; import net.tinyos.comm.*; import net.tinyos.util.*; public class ListenRaw { private static final int PORT_SPEED_TELOS = 115200; private static final int PORT_SPEED_MICAZ = 57600; private static final int PORT_SPEED_MICA2 = 57600; private static final int PORT_SPEED_MICA2DOT = 19200; private static final int PORT_SPEED_MICA = 19200; private static final int PORT_SPEED_RENE = 19200; private static final int PORT_SPEED_IRIS = 57600; private static final int PORT_SPEED_SHIMMER = 115200; private int portSpeed; private SerialPort port; private String portName; private InputStream in; private OutputStream out; public ListenRaw(String portName, int portSpeed) { this.portName = portName; this.portSpeed = portSpeed; } public void open() throws IOException, UnsupportedCommOperationException { System.out.println("Opening port " + portName); port = new TOSSerial(portName); in = port.getInputStream(); out = port.getOutputStream(); //port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); // These are the mote UART parameters port.setSerialPortParams(portSpeed, 8, SerialPort.STOPBITS_1, false); printPortStatus(); System.out.println(); } private void printPortStatus() { System.out.println(" baud rate: " + port.getBaudRate()); System.out.println(" data bits: " + port.getDataBits()); System.out.println(" stop bits: " + port.getStopBits()); System.out.println(" parity: " + port.getParity()); } public void read() throws IOException { int i; while ((i = in.read()) != -1) { if (i == 0x7e) { System.out.println(); } Dump.printByte(System.out, i); } } private static void printUsage() { System.err.println("usage: java net.tinyos.tools.ListenRaw [options] "); System.err.println("options are:"); System.err.println(" -h, --help: usage help"); System.err.println(" -p: print available ports"); System.err.println(" -telos: Telos ("+PORT_SPEED_TELOS+" bps)"); System.err.println(" -micaz: Mica2 ("+PORT_SPEED_MICAZ+" bps) [default]"); System.err.println(" -mica2: Mica2 ("+PORT_SPEED_MICA2+" bps) [default]"); System.err.println(" -mica2dot: Mica2Dot ("+PORT_SPEED_MICA2DOT+" bps)"); System.err.println(" -mica: Mica ("+PORT_SPEED_MICA+" bps)"); System.err.println(" -rene: Rene ("+PORT_SPEED_RENE+" bps)"); System.err.println(" -iris: Iris ("+PORT_SPEED_IRIS+" bps) [default]"); System.err.println(" -shimmer: Shimmer ("+PORT_SPEED_SHIMMER+" bps)"); System.exit(-1); } public static void main(String args[]) { int speed = PORT_SPEED_MICA2; if ((args.length < 1) || (args.length > 3)) { printUsage(); } for (int i = 0; i < args.length; i++) { if (args[i].equals("-h") || args[i].equals("--help")) { printUsage(); } if (args[i].equals("-telos")) { speed = PORT_SPEED_TELOS; } if (args[i].equals("-micaz")) { speed = PORT_SPEED_MICAZ; } if (args[i].equals("-mica2")) { speed = PORT_SPEED_MICA2; } if (args[i].equals("-mica2dot")) { speed = PORT_SPEED_MICA2DOT; } if (args[i].equals("-mica")) { speed = PORT_SPEED_MICA; } if (args[i].equals("-rene")) { speed = PORT_SPEED_RENE; } if (args[i].equals("-iris")) { speed = PORT_SPEED_IRIS; } if (args[i].equals("-shimmer")) { speed = PORT_SPEED_SHIMMER; } } if (args[args.length - 1].charAt(0) == '-') { return; // No port specified } ListenRaw reader = new ListenRaw(args[args.length - 1], speed); try { reader.open(); } catch (Exception e) { e.printStackTrace(); } try { reader.read(); } catch (Exception e) { e.printStackTrace(); } } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/tools/Makefile000066400000000000000000000005721207233610700241160ustar00rootroot00000000000000# $Id: Makefile,v 1.6 2008-06-18 19:04:45 sallai Exp $ # # TinyOS Tools Makefile # # @author TinyOS Team # INITIAL_TARGETS = PrintfMsg.class PrintfMsg.java ROOT = ../../.. include $(ROOT)/Makefile.include PRINTF_H = $(TOSDIR)/lib/printf/printf.h PrintfMsg.java: $(PRINTF_H) FORCE mig java $(CFLAGS) -java-classname=net.tinyos.tools.PrintfMsg $(PRINTF_H) printf_msg -o $@ tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/tools/MsgReader.java000066400000000000000000000077531207233610700252020ustar00rootroot00000000000000/* tab:4 * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* Authors: Phil Levis * Date: December 1 2005 * Desc: Generic Message reader * */ /** * @author Phil Levis */ package net.tinyos.tools; import java.util.*; import net.tinyos.message.*; import net.tinyos.packet.*; import net.tinyos.util.*; public class MsgReader implements net.tinyos.message.MessageListener { private MoteIF moteIF; public MsgReader(String source) throws Exception { if (source != null) { moteIF = new MoteIF(BuildSource.makePhoenix(source, PrintStreamMessenger.err)); } else { moteIF = new MoteIF(BuildSource.makePhoenix(PrintStreamMessenger.err)); } } public void start() { } public void messageReceived(int to, Message message) { long t = System.currentTimeMillis(); // Date d = new Date(t); System.out.print("" + t + ": "); System.out.println(message); } private static void usage() { System.err.println("usage: MsgReader [-comm ] message-class [message-class ...]"); } private void addMsgType(Message msg) { moteIF.registerListener(msg, this); } public static void main(String[] args) throws Exception { String source = null; Vector v = new Vector(); if (args.length > 0) { for (int i = 0; i < args.length; i++) { if (args[i].equals("-comm")) { source = args[++i]; } else { String className = args[i]; try { Class c = Class.forName(className); Object packet = c.newInstance(); Message msg = (Message)packet; if (msg.amType() < 0) { System.err.println(className + " does not have an AM type - ignored"); } else { v.addElement(msg); } } catch (Exception e) { System.err.println(e); } } } } else if (args.length != 0) { usage(); System.exit(1); } MsgReader mr = new MsgReader(source); Enumeration msgs = v.elements(); while (msgs.hasMoreElements()) { Message m = (Message)msgs.nextElement(); mr.addMsgType(m); } mr.start(); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/tools/PrintfClient.java000066400000000000000000000057051207233610700257250ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.3 $ * @date $Date: 2010-06-29 22:07:42 $ */ package net.tinyos.tools; import net.tinyos.message.*; import net.tinyos.packet.*; import net.tinyos.util.*; public class PrintfClient implements MessageListener { private MoteIF moteIF; public PrintfClient(MoteIF moteIF) { this.moteIF = moteIF; this.moteIF.registerListener(new PrintfMsg(), this); } public void messageReceived(int to, Message message) { PrintfMsg msg = (PrintfMsg)message; for(int i=0; i]"); } public static void main(String[] args) throws Exception { String source = null; if (args.length == 2) { if (!args[0].equals("-comm")) { usage(); System.exit(1); } source = args[1]; } PhoenixSource phoenix; if (source == null) { phoenix = BuildSource.makePhoenix(PrintStreamMessenger.err); } else { phoenix = BuildSource.makePhoenix(source, PrintStreamMessenger.err); } System.out.print(phoenix); MoteIF mif = new MoteIF(phoenix); PrintfClient client = new PrintfClient(mif); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/tools/Send.java000066400000000000000000000052471207233610700242160ustar00rootroot00000000000000// $Id: Send.java,v 1.5 2010-06-29 22:07:42 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.tools; import net.tinyos.util.*; import net.tinyos.packet.*; import java.io.*; public class Send { public static void main(String[] argv) throws IOException { PacketSource sfw = BuildSource.makePacketSource(); sfw.open(PrintStreamMessenger.err); byte[] packet = new byte[argv.length]; for (int i = 0; i < argv.length; i++) packet[i] = (byte)Integer.parseInt(argv[i], 16); try { sfw.writePacket(packet); } catch (IOException e) { System.exit(2); } Dump.printPacket(System.out, packet); System.out.println(); // A close would be nice, but javax.comm's close is deathly slow //sfw.close(); System.exit(0); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/tools/package.html000066400000000000000000000014041207233610700247320ustar00rootroot00000000000000 Provides low-level tools for interacting with TinyOS nodes.

    Package Specification

    Related Documentation

    tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/util/000077500000000000000000000000001207233610700222675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/util/Crc.java000066400000000000000000000061031207233610700236410ustar00rootroot00000000000000// $Id: Crc.java,v 1.5 2010-06-29 22:07:42 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.util; public class Crc { public static int calcByte(int crc, int b) { crc = crc ^ (int)b << 8; for (int i = 0; i < 8; i++) { if ((crc & 0x8000) == 0x8000) crc = crc << 1 ^ 0x1021; else crc = crc << 1; } return crc & 0xffff; } public static int calc(byte[] packet, int index, int count) { int crc = 0; while (count > 0) { crc = calcByte(crc, packet[index++]); count--; } return crc; } public static int calc(byte[] packet, int count) { return calc(packet, 0, count); } public static void set(byte[] packet) { int crc = Crc.calc(packet, packet.length - 2); packet[packet.length - 2] = (byte) (crc & 0xFF); packet[packet.length - 1] = (byte) ((crc >> 8) & 0xFF); } public static void main(String[] args) { byte[] ia = new byte[args.length]; for (int i = 0; i < args.length; i++) try { ia[i] = Integer.decode(args[i]).byteValue(); } catch (NumberFormatException e) { } System.out.println(Integer.toHexString(calc(ia, ia.length))); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/util/DiagMsg.java000066400000000000000000000240231207233610700244460ustar00rootroot00000000000000/* * Copyright (c) 2003-2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ package net.tinyos.util; import net.tinyos.packet.*; import net.tinyos.util.PrintStreamMessenger; public class DiagMsg implements PacketListenerIF { protected String delimiter = " "; protected java.text.SimpleDateFormat timestamp = new java.text.SimpleDateFormat("HH:mm:ss"); static final int PACKET_TYPE_FIELD = 7; static final int PACKET_LENGTH_FIELD = 5; static final int PACKET_DATA_FIELD = 8; static final int PACKET_CRC_SIZE = 0; static final byte AM_DIAG_MSG = (byte)0xB1; protected PhoenixSource forwarder; public DiagMsg(PhoenixSource forwarder) { this.forwarder = forwarder; forwarder.registerPacketListener(this); } public void run() { forwarder.run(); } public static void main(String[] args) throws Exception { PhoenixSource phoenix = null; if( args.length == 0 ) phoenix = BuildSource.makePhoenix(PrintStreamMessenger.err); else if( args.length == 2 && args[0].equals("-comm") ) phoenix = BuildSource.makePhoenix(args[1], PrintStreamMessenger.err); else { System.err.println("usage: DiagMsg [-comm ]"); System.exit(1); } DiagMsg listener = new DiagMsg(phoenix); listener.run(); } public void packetReceived(byte[] packet) { if( packet[PACKET_TYPE_FIELD] == AM_DIAG_MSG ) { try { System.out.println(timestamp.format(new java.util.Date()) + " " + decode(packet)); } catch(Exception e) { System.out.println(e.getMessage()); } } } protected byte[] packet; protected int end; protected int head; protected StringBuffer line; protected synchronized String decode(byte[] packet) throws Exception { this.packet = packet; head = PACKET_DATA_FIELD; end = PACKET_DATA_FIELD + packet[PACKET_LENGTH_FIELD]; if( end < head || end > packet.length - PACKET_CRC_SIZE ) throw new Exception("illegal message length"); line = new StringBuffer(); while(head < end) { byte code = getByte(); addSimple(code & 0xF); addSimple((code >> 4) & 0xF); } // delete the leading space if( line.length() > 0 && line.substring(0, delimiter.length()).equals(delimiter) ) line.delete(0, delimiter.length()); return new String(line); } static final int TYPE_END = 0; static final int TYPE_INT8 = 1; static final int TYPE_UINT8 = 2; static final int TYPE_HEX8 = 3; static final int TYPE_INT16 = 4; static final int TYPE_UINT16 = 5; static final int TYPE_HEX16 = 6; static final int TYPE_INT32 = 7; static final int TYPE_UINT32 = 8; static final int TYPE_HEX32 = 9; static final int TYPE_FLOAT = 10; static final int TYPE_CHAR = 11; static final int TYPE_INT64 = 12; static final int TYPE_UINT64 = 13; static final int TYPE_ARRAY = 15; protected void addSimple(int type) throws Exception { switch(type) { case TYPE_END: break; case TYPE_INT8: addInt8(); break; case TYPE_UINT8: addUint8(); break; case TYPE_HEX8: addHex8(); break; case TYPE_INT16: addInt16(); break; case TYPE_UINT16: addUint16(); break; case TYPE_HEX16: addHex16(); break; case TYPE_INT32: addInt32(); break; case TYPE_UINT32: addUint32(); break; case TYPE_HEX32: addHex32(); break; case TYPE_FLOAT: addReal(); break; case TYPE_CHAR: addChar(); break; case TYPE_INT64: addInt64(); break; case TYPE_UINT64: addUint64(); break; case TYPE_ARRAY: addArray(); break; default: line.append(delimiter + "unknown"); } } protected void addArray() throws Exception { int len = getByte(); int type = (len >> 4) & 0xF; len &= 0xF; if( type == TYPE_CHAR ) addStr(len); else { line.append(delimiter + "["); while( --len >= 0 ) addSimple(type); line.append(" ]"); } } protected void check(int len) throws Exception { if( head + len > end ) throw new Exception("illegal message format"); } protected byte getByte() throws Exception { check(1); byte ret = packet[head]; head += 1; return ret; } protected short getShort() throws Exception { short a,b; check(2); a = packet[head]; a &= 0x00FF; b = packet[head+1]; b <<= 8; b &= 0xFF00; a |= b; head += 2; return a; } protected int getInt() throws Exception { int a,b; check(4); a = packet[head]; a &= 0x000000FF; b = packet[head+1]; b <<= 8; b &= 0x0000FF00; a |= b; b = packet[head+2]; b <<= 16; b &= 0x00FF0000; a |= b; b = packet[head+3]; b <<= 24; b &= 0xFF000000; a |= b; head += 4; return a; } protected long getLong() throws Exception { long a,b; check(8); a = packet[head]; a &= 0xFF; b = packet[head+1]; b &= 0xFF; b <<= 8; a |= b; b = packet[head+2]; b &= 0xFF; b <<= 16; a |= b; b = packet[head+3]; b &= 0xFF; b <<= 24; a |= b; b = packet[head+4]; b &= 0xFF; b <<= 32; a |= b; b = packet[head+5]; b &= 0xFF; b <<= 40; a |= b; b = packet[head+6]; b &= 0xFF; b <<= 48; a |= b; b = packet[head+7]; b &= 0xFF; b <<= 56; a |= b; head += 8; return a; } protected void addUint8() throws Exception { String value = Integer.toString(getByte() & 0xFF); line.append(delimiter + value); } protected void addInt8() throws Exception { String value = Byte.toString(getByte()); line.append(delimiter + value); } protected void addHex8() throws Exception { String value = Integer.toHexString(getByte() & 0xFF); line.append(delimiter + "0x"); for(int i = value.length(); i < 2; ++i) line.append('0'); line.append(value); } protected void addUint16() throws Exception { String value = Integer.toString(getShort() & 0xFFFF); line.append(delimiter + value); } protected void addInt16() throws Exception { String value = Short.toString(getShort()); line.append(delimiter + value); } protected void addHex16() throws Exception { String value = Integer.toHexString(getShort() & 0xFFFF); line.append(delimiter + "0x"); for(int i = value.length(); i < 4; ++i) line.append('0'); line.append(value); } protected void addUint32() throws Exception { String value = Long.toString(getInt() & 0xFFFFFFFFL); line.append(delimiter + value); } protected void addInt32() throws Exception { String value = Integer.toString(getInt()); line.append(delimiter + value); } protected void addHex32() throws Exception { String value = Integer.toHexString(getInt()); line.append(delimiter + "0x"); for(int i = value.length(); i < 8; ++i) line.append('0'); line.append(value); } protected void addInt64() throws Exception { String value = Long.toString(getLong()); line.append(delimiter + value); } protected void addUint64() throws Exception { // TODO: make this an unsigned conversion String value = Long.toString(getLong()); line.append(delimiter + value); } protected void addReal() throws Exception { float value = Float.intBitsToFloat(getInt()); line.append(delimiter + Float.toString(value)); } protected void addChar() throws Exception { char value = (char)getByte(); line.append(delimiter + "'" + value + "'"); } protected void addStr(int len) throws Exception { line.append(delimiter + "\""); while( --len >= 0 ) line.append((char)getByte()); line.append('"'); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/util/Dump.java000066400000000000000000000061271207233610700240450ustar00rootroot00000000000000// $Id: Dump.java,v 1.5 2010-06-29 22:07:42 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* Authors: David Gay * Intel Research Berkeley Lab * */ /** * @author David Gay * @author Intel Research Berkeley Lab */ package net.tinyos.util; import java.io.*; /** * Dump class (print tinyos messages).

    * * Print packets in hex * * @version 1, 15 Jul 2002 * @author David Gay */ public class Dump { public static void printByte(PrintStream p, int b) { String bs = Integer.toHexString(b & 0xff).toUpperCase(); if (b >=0 && b < 16) p.print("0"); p.print(bs + " "); } public static void printPacket(PrintStream p, byte[] packet, int from, int count) { for (int i = from; i < count; i++) printByte(p, packet[i]); } public static void printPacket(PrintStream p, byte[] packet) { printPacket(p, packet, 0, packet.length); } public static void dump(PrintStream to, String prefix, byte[] data) { to.print(prefix); to.print(":"); printPacket(to, data); to.println(); } public static void dump(String prefix, byte[] packet) { dump(System.err, prefix, packet); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/util/Env.java000066400000000000000000000024651207233610700236710ustar00rootroot00000000000000// $Id: Env.java,v 1.4 2006-12-12 18:23:00 vlahan Exp $ package net.tinyos.util; /** * The Env class provides an implementation of * getenv that actually works, unlike the one in * java.lang.System. The class cannot be instantiated. * * V1.1: provide wrapper so that getenv doesn't fail horribly when the * native code is not found. * * @author R M Yorston, David Gay * @version 1.1 */ public class Env { static private boolean loaded; static { try { net.tinyos.util.TOSLibraryLoader.load("getenv"); loaded = true; } catch (Throwable t) { System.err.println("getenv JNI library not found. Env.getenv will not work"); System.err.println("(run the tos-install-jni tool, see man tos-install-jni for more details)\n"); } } private Env() { } /** * Gets an environment variable. An environment variable is a * system-dependent external variable that has a string value. * * @param name name of the environment variable * @return the value of the variable, or null if the * variable is not defined. */ public static String getenv(String name) { if (loaded) { return igetenv(name); } else { return null; } } private static native String igetenv(String name); } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/util/Makefile000066400000000000000000000001441207233610700237260ustar00rootroot00000000000000# Top-level Makefile for tools/java SUBDIRS = ROOT = ../../.. include $(ROOT)/Makefile.include tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/util/Messenger.java000066400000000000000000000041441207233610700250650ustar00rootroot00000000000000// $Id: Messenger.java,v 1.5 2010-06-29 22:07:42 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.util; public interface Messenger { public void message(String s); } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/util/PrintStreamMessenger.java000066400000000000000000000046731207233610700272650ustar00rootroot00000000000000// $Id: PrintStreamMessenger.java,v 1.5 2010-06-29 22:07:42 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ package net.tinyos.util; import java.io.*; public class PrintStreamMessenger implements Messenger { private PrintStream ps; public PrintStreamMessenger(PrintStream ps) { this.ps = ps; } public void message(String s) { ps.println(s); } public static PrintStreamMessenger err = new PrintStreamMessenger(System.err); public static PrintStreamMessenger out = new PrintStreamMessenger(System.out); } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/util/TOSLibraryLoader.java000066400000000000000000000200271207233610700262540ustar00rootroot00000000000000/* Copyright (c) 2010 Urs Hunkeler (urs.hunkeler@epfl.ch) * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR THE AUTHOR BE LIABLE TO ANY PARTY * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE COPYRIGHT * HOLDER AND/OR THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE COPYRIGHT HOLDER AND THE AUTHOR SPECIFICALLY DISCLAIM ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN * "AS IS" BASIS, AND NEITHER THE COPYRIGHT OWNER NOR THE AUTHOR HAS ANY * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR * MODIFICATIONS. */ package net.tinyos.util; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; /** * This is a loader for native libraries that tries * to load the libraries from an alternative path if * the tradition loading fails. * * The traditional approach is to find and load the native * libraries from an operating system and Java implementation * specific path. This requires the user to install the * libraries in a specific location and has proven to be * error prone and a frequent source of problems. The * traditional approach is supported by default to give * developers a means to easily test new versions of the * libraries. * * The alternative approach is strictly considered a * fall-back method if the libraries have not been installed * properly and to ease the deployment of back-end software * on non-developer machines. * * The alternative method determines the file (or resource) * name of the native library based on the current operating * system and architecture. It then attempts to copy the * library from a resource on the classpath (which might be * inside a .jar file, such as the tinyos.jar file) to a * temporary file and load the library from this temporary * file. The advantage of this method is that no native * library files need to be installed on the computer (and * thus no administrator rights are necessary). The temporary * files are deleted when the virtual machine terminates. * * Currently, the library loader class recognizes the * following operating systems: Mac OS X, Linux, and Windows. * The library loader class further recognizes the following * architectures: ppc (PowerPC), x86 (the common Intel x86 * 32-bit compatible processors), and amd64 (the x86 64-bit * processors). Precompiled libraries are only available * for the toscomm and getenv libraries for the following * platforms: macosx_ppc, macosx_x86, and windows_x86. * * @author Urs Hunkeler (urs.hunkeler@epfl.ch) */ public class TOSLibraryLoader { public static void load(String libName) { boolean loaded = false; boolean ok = true; InputStream is = null; FileOutputStream fos = null; String text = ""; // attempt to load the library the conventional way // (using Java's default library locations and loading // mechanism) try { text += "Attempting to load library '" + libName + "'\n"; System.loadLibrary(libName); loaded = true; text += "Library loaded successfully\n"; } catch(Throwable t) { text += "Could not load library '" + libName + "': " + t.getMessage() + "\n"; ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); t.printStackTrace(ps); text += "----------\n"; text += baos.toString(); text += "----------\n"; } if(!loaded) { // failed to load the library the conventional way System.err.println("Error loading the TinyOS JNI libraries the conventional way!"); System.err.println(text); // try to extract the library from the classpath // (might be in tinyos.jar) // First some debugging information System.out.println("In order to load the library '" + libName + "' Java tries to locate the file '" + System.mapLibraryName(libName) + "' in one of the " + "following paths:"); System.out.println(System.getProperty("java.library.path")); System.out.println(); String os = System.getProperty("os.name"); String arch = System.getProperty("os.arch"); System.out.println("The operating system is '" + os + "' (" + arch + ")"); System.out.println(); String libFile = null; File tmpFile = null; if(os.toLowerCase().startsWith("linux")) { // Linux if(arch.toLowerCase().equals("x86") || arch.toLowerCase().equals("i386")) { libFile = "linux_x86_" + libName; } else if(arch.toLowerCase().equals("ppc")) { // not currently supported //libFile = "linux_ppc_" + libName; } else if(arch.toLowerCase().equals("amd64")) { libFile = "linux_amd64_" + libName; } } else if(os.toLowerCase().startsWith("windows")) { // Windows if(arch.toLowerCase().equals("x86") || arch.toLowerCase().equals("i386")) { libFile = "windows_x86_" + libName; } else if(arch.toLowerCase().equals("ppc")) { // not currently supported //libFile = "windows_ppc_" + libName; } else if(arch.toLowerCase().equals("amd64")) { // not currently supported //libFile = "windows_amd64_" + libName; } } else if(os.toLowerCase().startsWith("mac os x")) { libFile = "macosx_universal_" + libName; } if(libFile != null) libFile += ".lib"; if(libFile == null) { ok = false; System.out.println("The operating system and architecture " + "is currently not supported"); } if(ok) { System.out.println("Trying to locate the file '" + libFile + "' in the classpath"); // we found a mapping, now let's try to copy // the library from the classpath (might be // inside a .jar file) to a temporary file // and load it from there // open the library file in the classpath (potentially inside the .jar file) is = TOSLibraryLoader.class.getResourceAsStream(libFile); if(is == null) { System.out.println("The library file was not found in the classpath"); ok = false; } } if(ok) { try { tmpFile = File.createTempFile(libName, ".lib"); } catch(IOException ioe) { ok = false; tmpFile = null; System.out.println("Could not create temporary file to extract library, aborting..."); ioe.printStackTrace(); } } if(tmpFile == null) { ok = false; } if(ok) { System.out.println("Temporary file created: '" + tmpFile.getAbsolutePath() + "'"); tmpFile.deleteOnExit(); try { // open the temporary file for writing fos = new FileOutputStream(tmpFile); // copy the file byte[] buffer = new byte[1024]; int len = 0; while((len = is.read(buffer, 0, buffer.length)) > 0) { fos.write(buffer, 0, len); } } catch(IOException ioe) { ok = false; System.out.println("An error occurred while copying the library file, aborting..."); tmpFile.delete(); tmpFile = null; } finally { if(fos != null) try { fos.close(); } catch(IOException ioe) { ioe.printStackTrace(); } if( is != null) try { is.close(); } catch(IOException ioe) { ioe.printStackTrace(); } } } if(ok) { try { System.out.println("Library copied successfully. Let's load it."); System.load(tmpFile.getAbsolutePath()); loaded = true; System.out.println("Library loaded successfully"); } catch(Throwable t) { ok = false; System.out.println("Error loading the library: " + t.getMessage()); t.printStackTrace(); tmpFile.delete(); tmpFile = null; } } } } public static void main(String[] args) { load("toscomm"); } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/util/ZigbitProgrammer.java000066400000000000000000000210461207233610700264210ustar00rootroot00000000000000/** Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ package net.tinyos.util; import net.tinyos.comm.*; import java.io.*; import java.util.*; /** * This class implements the ZigBit bootloader protocol and can reset * the mote through a serial message. */ public class ZigbitProgrammer implements SerialPortListener { TOSSerial serial; protected InputStream is; protected OutputStream os; public byte[] readBytes(int count, long timeout) throws IOException { long deadline = System.currentTimeMillis() + timeout; byte[] bytes = new byte[count]; for(int i = 0; i < count; ) { synchronized(is) { if( is.available() > 0 ) bytes[i++] = (byte)is.read(); else { timeout = deadline - System.currentTimeMillis(); if( timeout <= 0 ) return null; try { is.wait(timeout); } catch(InterruptedException e) { return null; } } } } return bytes; } public void serialEvent(SerialPortEvent ev) { synchronized(is) { is.notify(); } } public void writeBytes(byte[] bytes) throws IOException { os.write(bytes); os.flush(); } public void closePort() throws IOException { if( serial != null ) { is.close(); os.close(); serial.close(); serial = null; is = null; os = null; } } public void openPort(String port) throws IOException { closePort(); try { serial = new TOSSerial(port); } catch(Exception e) { System.out.println("Cound not open port: " + port); System.exit(5); } serial.addListener(this); serial.notifyOn(SerialPortEvent.DATA_AVAILABLE, true); is = serial.getInputStream(); os = serial.getOutputStream(); } public void setBaudrate(int baudrate) { serial.setSerialPortParams(baudrate, 8, SerialPort.STOPBITS_1, false); } public boolean resetTinyOS(int baudrate) throws IOException { byte[] req = new byte[] { (byte)0x7e, (byte)0x44, (byte)0x19, (byte)0x72, 'R', 'S', 'T', (byte)0xb9, (byte)0x1e, (byte)0x7e }; byte[] ack = new byte[] { (byte)0x7e, (byte)0x45, (byte)0x72, 'Z', 'B', 'P', (byte)0x76, (byte)0x35, (byte)0x7e }; byte[] response = new byte[ack.length]; int[] baudrates; if( baudrate == 0 ) baudrates = new int[] { 57600, 230400, 115200, 38400 }; else baudrates = new int[] { baudrate }; System.out.print("Resetting TinyOS .."); for(int i = 0; i < 3; ++i) { for(int j = 0; j < baudrates.length; ++j) { setBaudrate(baudrates[j]); for(int k = 0; k < 2; ++k) { System.out.print('.'); writeBytes(req); long deadline = System.currentTimeMillis() + 200; for(;;) { long timeout = deadline - System.currentTimeMillis(); if( timeout <= 0 ) break; byte[] b = readBytes(1, timeout); if( b != null ) { System.arraycopy(response, 1, response, 0, response.length-1); response[response.length-1] = b[0]; if( Arrays.equals(response, ack) ) { System.out.println(" done"); return true; } } } } } } System.out.println(" failed"); return false; } public void accessBootloder() throws IOException { byte[] req = new byte[] { (byte)0xB2, (byte)0xA5, (byte)0x65, (byte)0x4B }; byte[] ack = new byte[] { (byte)0x69, (byte)0xD3, (byte)0xD2, (byte)0x26 }; System.out.print("Connecting to bootloader .."); for(int i = 0; i < 20; ++i) { System.out.print('.'); writeBytes(req); byte[] response = readBytes(4, 500); if( response != null && Arrays.equals(response, ack) ) { System.out.println(" done"); return; } } System.out.println(" failed"); System.exit(1); } public void uploadFile(String filename) throws FileNotFoundException, IOException { Scanner scanner = new Scanner(new File(filename)); ArrayList lines = new ArrayList(); while( scanner.hasNextLine() ) lines.add(scanner.nextLine()); byte[] ack = new byte[] { (byte)0x4D, (byte)0x5A, (byte)0x9A, (byte)0xB4 }; byte[] nak = new byte[] { (byte)0x2D, (byte)0x59, (byte)0x5A, (byte)0xB2 }; System.out.print("Writing " + lines.size() + " pages to flash ..."); for(int i = 0; i < lines.size(); ++i) { String line = lines.get(i); byte[] bytes = new byte[1 + line.length()/2]; bytes[0] = (byte)line.charAt(0); bytes[1] = (byte)line.charAt(1); for(int j = 2; j < bytes.length; ++j) bytes[j] = (byte)Integer.parseInt(line.substring(-2 + j*2, j*2), 16); writeBytes(bytes); byte[] response = readBytes(4, 50); if( response == null ) { System.out.println(" no response"); System.exit(2); } else if( Arrays.equals(response, ack) ) { if( i % 16 == 0 ) System.out.print("."); } else if( Arrays.equals(response, nak) ) { System.out.println(" not accepted"); System.exit(3); } else { System.out.println(" incorrect response"); System.exit(4); } } System.out.println(" done"); } public static void main(String[] args) throws IOException, InterruptedException { String port = null; int baudrate = 0; boolean reset = false; boolean askForReset=false; String srec = null; int sleep = 0; if( args.length == 0 ) { System.out.println("Usage: java net.tinyos.util.ZigbitProgrammer "); System.out.println(" where flags are the following"); System.out.println("\t-port \t\tsets the communication port (mandatory)"); System.out.println("\t-baudrate \tsets the baudrate of TinyOS serial (0=auto)"); System.out.println("\t-reset\t\t\tsoftware reset through TinyOS serial"); System.out.println("\t-askforreset\t\tasks the user to reset the mote if needed"); System.out.println("\t-sleep \twaits (omitted if a reset fails)"); System.out.println("\t-upload \tuploads file through ZigBit bootloader"); System.exit(0); } for(int i = 0; i < args.length; ++i) { if( args[i].equals("-port") ) port = args[++i]; else if( args[i].equals("-baudrate") ) baudrate = Integer.parseInt(args[++i]); else if( args[i].equals("-reset") ) reset = true; else if( args[i].equals("-askforreset") ) askForReset = true; else if( args[i].equals("-sleep") ) sleep = Integer.parseInt(args[++i]); else if( args[i].equals("-upload") ) srec = args[++i]; else { System.out.println("Incorrect option: " + args[i]); System.exit(6); } } if( port == null ) { System.out.println("The communication port is not specified"); System.exit(6); } ZigbitProgrammer programmer = new ZigbitProgrammer(); if( reset ) { programmer.openPort(port); if ( programmer.resetTinyOS(baudrate) == false ){ sleep=0; } else askForReset=false; programmer.closePort(); } if( askForReset ) { System.out.println("Please reset the mote, than press enter"); System.in.read(); } else if( sleep > 0 ) Thread.sleep(1000 * sleep); if( srec != null ) { programmer.openPort(port); programmer.setBaudrate(38400); programmer.accessBootloder(); programmer.uploadFile(srec); programmer.closePort(); } } } tinyos-2.1.2+dfsg/support/sdk/java/net/tinyos/util/package.html000066400000000000000000000013721207233610700245530ustar00rootroot00000000000000 Provides low-level utilities used by many packages.

    Package Specification

    Related Documentation

    tinyos-2.1.2+dfsg/support/sdk/java/tinyos.jar000066400000000000000000011615001207233610700212260ustar00rootroot00000000000000PK j? META-INF/PK }j?Ӭ^jMETA-INF/MANIFEST.MFMLK-. K-*ϳR03rCq,HLHU%-xRKRSt*AM ⍌t 4K|3+KRs<4yxPK j?net/PK j? net/tinyos/PK |j?net/tinyos/comm/PK |j?&net/tinyos/comm/ByteQueue.classuRKKQ=738>:>}ěiB"+)к83SpӕP&F(覿7D:Ü:3߽? /0q S *d2qB҆G*o\74&ᾉILg1cbs&pLc,0)?YogzQ\+Gj'I4hCCۅdؚ7Q VP:kZ6My-XYUyLk-? jd"4\䟌,i_bB/[Ȅ! 0ҥMi!eӸ#.mL1ȣ47\|:D4숳XTw`0GD;CeARfM#'AyNi]-}֦{8<+fR-jk}:C%o)%uKw!PF jؖAAdw䠖>KMEeNWH] C^&gWt\ KAPK |j?h8~ "net/tinyos/comm/NativeSerial.class}wUƟ!SZKA)Dm XTP e dh) s?s<I's];p9#8-x,~<qLoDFT6zҘ3 =3uʖ=KAde[R-͚< \T1Eb-(Xgi 7 CqKڦ3XB2+cc͙Yl]]z( Hi FMc#c [NeҬۋSXeg¸kq%XmPMyIڼa9Js3Y8D V^riIJwdjm?ONe)U~JghR#eŴe8fAtV8Ve4]8:N"eLϦhG :O25W5lp+nӠc$xMxCÛxKN6w55|!G8<> >=3gdkE>_|c_| ˷,߱|4Q~b5_5_8zwIAK=c'ކF o2c-9?wb=d|Q:N#UmK}O{U&3|n4X.bɌ,u>W%%QeSj^i]zE(5ZAGo7f경qD1.֐@W$S+sy6qw5dT{l Mbz:{(zuĕœR!.48{G~ÆB_*3ԮG>( n^ͯ6oBQa> ԯ!W{ ^A܎pzЯEQnS"vp&ІK89W:$ _L;/53.mHe<ijԮt^yϘ o|?F}W4&<S"uUS5c|jE:j7Kz x$:E.r=2ܷ|x#tF:>r|:< Ǘ.SG߱o-9PK |j?n%net/tinyos/comm/SerialPortEvent.class}n@I(P$7q"1hDX,SUjWRw<$*$<:{=w~KxKhi u<3&^4cXps1Ð ,tZ8g0wCvvVv6FԢײԼF ̼b\`|@~Q Xf#nE>%yE Ye9yIY%@@PK |j?MT0 net/tinyos/comm/TOSCommJNI.class}[oAX(@Tm ŻPa MvG2umv'~?0KB~Ü9?3gO(n $ OS 'E^Xo ,h.XյB >f8{>վ}ѡO u]? C:T`V/s5*h N, ᳹ΪX WӖ=5il-$~$D>P.޻޻1sD4ۤTE,nɌi<KѳuҙhcEʔ\eunh~vZ1EZ8l;-“GtLK6u%Cx؝l&XD\W7Ҵ]E5M6 :z=@9'VsԅiNjAN˨GzL`Y+=4gJ"$$뛘Wix oDIpg RRUM9)1ǭpJ? 7mb8t1. ~/, ߀| $!%y Ғ(^drK,W:%7u[śpK6ܑ $+jWQqH>G`I'~N6dPK |j? 0s/net/tinyos/comm/TOSSerial$EventDispatcher.class}TmWG~dY-h  P`})F%ta7gw@|=z43 Bˁܙ;>>w̛~$DBF̶hHaՐ1,L`g:qFm}n⬅.S/,|´.=.)M21/`Bf? fyzNy.x'/2 Y`%A" K)ᖃ]%/8]Y—dʪq'0яcpLd9nGM9PD9N?eaV4w[!7 'q3A(gU*S10ou䫭z{g}B);Q$"J(EW޺Ѕ4"TqqIѬ}rEǓ Qp=;MuRݕtܟ̡Wҙ\w-lR&'NѦ[늈o/s`_t^k+g( uv;e[zr;WKu\q9DvU rtB>7 ^ –WHǧ8Iv}@"i P>)Zk N?7fǞ!M #y؎Ӿ]GW$m.b42X:լs^ʽ{Qު#}YkKk724 j4%pR"JNP?еΫs$^fu'/p^5zF_hjc5em%myQKE{yP' ?VE_coΎo#۠[SMфnA_"GvPK |j?]@1net/tinyos/comm/TOSSerial$SerialInputStream.class}Sn@};ucMC $qR pО, 8TNCbA/ QWQ4 Bovx'{xP2Mq טnl23ae ( XO"yYƩaX=XajwNx$ ,{FaX`9G+Y_%3aL@yѠ<+pJ"V%Pi *:M%jhH}+Jl1!:ӵ}h4κ TNE*iRշ c\Qqe6N(kAUHM5\e':pQpC{YcG(~:cсA׃2ݯ9 uSZmaX<ɦRPf_E(qF\eMU5ĮfV e"c:\h3a]f;&ezmPK |j?aI 2net/tinyos/comm/TOSSerial$SerialOutputStream.class}N@)Z1,XT nh\Ȫ .Hk5uܸ6QL\oLfΝ=yzyD99i,cQn e8 Ci/#*Jw۝^o Ú~[QgP/@rەY>ڕ1a@Jr[ehL:@DGľg40VK?a(yDOJ!kjwӳ cr>EV:f)*"Ek{R!+ ~1sƢ{%L]߰ 3*iEira&Rq߼>T.ɶ*xPK |j?޴V net/tinyos/comm/TOSSerial.classVsU6n76 ,tiy JmSAiB,ɒ.fwfS߈/|~C_2cӎ8:ߢJ&sιqI{W-H`XĈQ8)y bS^iN$L଀sdLr2'p2%!i\ +a#&$lί( /A ^.\2ʼnIØp+8J\eZa g,Kw Z:|LnnjRQsӺ0 wݔkXWR*kfظ CМ.C- T(:yJ>F/i3Zi=HT!Cr VCZ3ʧ߉oQ^!fP@O])ͱYJ`toEGa-ʰ'VIrA9iKmy]QͱφZYvR]*:鮪xѰqi^ey.ccG+c?8C:>-_p%n1lX,+Y%# 71t>\cFoY=,Kłz/5jKUp~%uRs]ݡ~¢Qmx CڷrhZse GGDO#5*2`ޱE!BiR&oَ>o8h$t,f,.ĢtZaiMO}kkݍ\^:]V΍74DbDl[wиjUZ؅Ky^iRL\NL 4_&7Qqj Dդ}`[ьhS#сHV !DiQ{}z{q/?iQ[*o75*h_*y7հǯA_S%}+6U- pMlU5MiSz>I}JD }%-v*t.yaMia]Iƶtt@!vg*“ &Б\@tw.SH49tryH9lKmlSŦTN5~TU$?Ti!b?BZlbW(]_Cܟ8s;-`+v8;׵:(RSqr' dYxqW8Y8Q?w:+^]= '%b6!(kb@DijxF-4*\/ɛwPK |j?-7net/tinyos/comm/UnsupportedCommOperationException.classEN @W(Ԋ b#DBr~`Q❊n130x"4k(A'RI3%t-?r*e+K1<A(qBBaF.X{V!tnff297R)[J7X j[Y+N8?-d2xPK |j?net/tinyos/message/PK |j?,dp  net/tinyos/message/Message.classVw֖+yc/5 K$ jlb;Nm쵵Hk %!-}i#H! I~S{G#ɖe3s{;m[pχx87'y9en>iS*>C^)pi Y~>Ͼ_E_Y _aW}5M~|86^>\<ѷyKE  8wU|O5^pŇMYosCn5nG>\ n28ΨwTo~p={(aZcŝ>+6aePXPA+e'SCOlgTj;q[Q+v:°ڎ48x:jS)knٮx4uv*(њrm ܁xtp^L<@gYw();6@h-VVC̊4t DTQA,4ŞouzKfDcLLfb͊Q{HKb"I^<'91vd)y*wbe}REDvmMNĔc+Rd"TBVv-̷S+-"rȹ~K>A.tr$7Ghюf{Ь PYs2i=5t g1[+ 'LDc;`c's(i[mJeǢΨ9 :n7?7ggSߴ1gZLErwxOw9Ok5@TgO$;ߓ~`tf>Ij[& +U+w422'FMx̦tCc 9fdJ;)Ifڔ_=>k/UF{x_dz8~ 0@eHyF2uf"idzsf极/5+=Pp,fXK|29čϮ_X?3#tDX#aG1ΣS'_tӑ`[T*K#m踭Ej|܎Gl tw{ݼ)g{څ͚NWj\j9{)j' hrE~ԖC}btT.{_n [\ǢqY\% %KLFŮCLdFL%(ĔDToBN*a~Mt[Y¨% n4ӸuJTh(=+2Vi(y+ԻP2wJ r+`ue9LW\b`--B Td yjcF w!ғ%qfa ]NG)2BHB ZE..u&P9TDC7qRUs^f t"܄MT^(DhIU% jx4ʠjX.byEeHT%(-,ao]츄w:q 1πPA*c(<**Ag2죴 ^yG{Z᠌"0Ua=ɭHxG}ټL(rBn`$Fd3q]6ˮY,VI7g,i^3oi9`5*w{N涻PIF/blYu9i=%U!g Qll ˵QX;+wm9zĦRsK5CU[h >Kؼ>ʥ>(Gv-U0pٸ,/9bQ iCvvVv6FԠ̲F O̼b}/ cdP-Y\Z X\YX@LPK |j?0-net/tinyos/message/MoteIF.classkSQ 5-#/$ ږ,E-Jƙ^9U\e1D&ə>@*{β<{=s~i=xG2m'e“ -Oe;? Dɬغi*'' -RqȒm6oVs[[(q8ȔC<+$,`7v\u"a W[c%Jye@=VXn(HpQnt"9C;:vA}bP!5٨T:%/-C F֒XMq Y&N.:  !"aA"K FUpa ,!0ZQ7 ZXݰغ+H ہLs- WMf{WbLA &0ޘOl\==e2biHHOܢut51W5Sٴn[U LS}@_ ~Z4 j62C{?d-=WЋ`C;|BNݱt=dĐthO0l{,_ !rE,b.&װ:teꅞLѲ_l`!3+TmO/ !tA(;ɊywJG(֞)-#L:kŜhf}3:'k8q5]cPK |j?S-net/tinyos/message/Receiver$msgTemplate.classRMo@8MHhmih s^"%BB't8r.^rg~mJf3>E^FOts ;w-4JJf/Sam"OM(J3C#XTQTP6^3lV Dx8T \fg0;2[dX{#"?7#1Pmrr r%Zu-JRbj챔NU pz"4fUX1_7+Jם4kљ [1-fmz,3-f4P; LSt_U@K#|h3 yM.eƂ֫ܨ[FLqe4"Th/(2FF7xQK+`(vHX"x9+2^huYü&u!M0?ǢVdiV]_KX1]0s|5ɘtaee_n2x o;"ޕ |QwA񱌣8F'i#هgG'⸌8,`nR̈)j}XIDƧ9" ge|d|od|d|}? ? RmJH]'Ca0*j,SzFɄ-Ե(1p Z9cET#bEYg Y0{t"Wae?.BٜiBYGV]zVӉ?@l[=ٱ FJ|P?UQF,7*pDJ4*%)H:1v"Iy ĭ$L*ԟ!ӟ^ S- IIC:B&-=4[b Fӌm幐>&tqj+ZȈE}y{: @\$L{N)DOGS(+az r7̳tĪ7˥ iT ]W@zQ7<)Xc}ycOi$e\vO`bDz~׻M@S1Y-Ȩy !QnWt#cDC0s\qe$*DN wV /QCZM*WSK_uj]$[ji AcR <{_3:Mp P3 <G\tŕNk(&0φQ,_2)Lwz)LݐnEnľvڇQJNOvHa&J/NO=)xKg8CszԅJup^=t䌑&4T=UGZqe4]‚laˀMJԟ-w\a,l/waQ#4 9H"2w;PO (`/vQ3("QF1.x=qS_%EAXz8JOٓwm;U:\I9*m$؊wZ;ڛ/|PK |j?9!net/tinyos/message/Sender.classTR@=K( D"mA"j/),%ZN(} hp>ݔ*8N&{v޳A,0[8BBBRC~Q0 IK8A9=Cy tE $\pEU i ICq #k͍drc lvŜ] Q+=r[Tο]g3m|Î2p2 ]}.DՆ pU^vTJ#n%ԋuhzX8$?SӼK}B?H{kȾ!PJ;lC]Fta ڡXzho8FSyjMmCJ~AdTftGy5L-5SSQgjWs=EBOPK |j?0(f;K%net/tinyos/message/SerialPacket.classVk{W~+KYeD%),@KKcq*P%N(ZJ䕑֭r+4Жrk-i4̥@EuH/11%`M/xI!|+]xŷ%|'|7^e~ ᇬMg\5Td*$g hzE4չ9y5 WOR kkZpȫ\*:-v5M rLٰig7+ԬMe`60t>A''u!Vfi0͍ 3J6!}}x~SiN1 hcC&j7hHAGDDj*4r!WԄڋB{؄ κ$C#Zat 0cWLmc™::b::/@w#D`Ύ; \pnp{ ^/&5{sx<ރ6.h=qL\^AT]{ YۣvlG7rDڑx4Zxd6t:es/nkغMZ9^,xbZI?IzA:I?ҧ|}ֽ`Ȳ=`Cv&ls Iw+{!YEf|l{ϧ<LY|=vݯKE/_F\MnDq>R6Ԯ˴J+PPC32_U2$"@&sY'RgS ͔=Uzt*؄ctco=|aJh@Z˸ ke1YݑУť:BH@Y'9Ux ݸv* Lw"g.fIstj`ړݧ*A6/a,h ndl䆩H>Yb 6P#Jߐr6r;w;ݣ3ϔD9(VVy-ssUV'ePK |j?3YJN+net/tinyos/mviz/DDocument$CanvasMouse.class}PMk@FcBJ8l{V /z_BWF5RU|AO1{_/hV#"!܇g('6̊Ewb4 e\em{%[];ZUK[ /Q%-KhMs&4Oټajr[+FNF2. mœpO2q_ # e1Y OdᩌgxyniiQ^Ƽt=2Z-.[fAP7dN}c"CO( #V_b8Թen-ڎIRBCd,byPP=~HSEq&C}Eo-jdn4Sp[YfhШeP‘:1}GW]3ҁS 5Hį̼^YqDICT. &I!~!c,A!>ArnYdފ۞;`=8PPH6>@{a24e5s^ZiPK |j?1].@(net/tinyos/mviz/DDocument$DPanel$2.classT[OQNiY`E(`R^T rE776ݓ5e J|qDJd|3gf̜ Ln@D &-FQӈ1a2mFwD*H2I1fTǜ TO/E=Ӊ$FrtiN㙌]/K]讫%<$-Yв%+8h!0aGeg4%Oۆ0#3XhqKty_fVd;UKw64`AU k`E*4 0~Zy5mk?"0ɗTٮ(SU/DR ꏕs=4vSǑ%Yp;FA%9vuQQ)g[]L{*1VY9>9>7,sva/eۣDY{fQwʩؕVIPFE?X+r8f^__@+KAr|袵76s=/ ]_n(VG7_bUcħLԠg!c\uu'Ɯć1`fEMGUht?TŐ G#r# 1D$l^?PK |j?6wt&net/tinyos/mviz/DDocument$DPanel.classTmOA~oGZ*B@{-a[%5Edovg]EM~ЄD?8kv?<7 vˆ`I))tQ,+XQCV iaHwVVx*ੂg 0Skuj;Qj vHXn!X;={h:4MMt7֒}HRy"Fkܴܼ}T-r1ĒO ~;u^;4N;@ptJ(疨2hE<aOE /&WL/2kdӴ!(R}+^^Z8&40yq%2 u&"afpWԐGA+ eֹA ҾΉio:!N`@Dxk;d: g_ quvm״Wam#w5z5ܗKSJp7/^,]'X]TdZ-SQw0G/9JA>4hԑl0)dm"?U}~k/O_iӗϡ0BFm-9YHOJ[a6<2{T3[n);ы=^v2gINS){{PK |j?rC.net/tinyos/mviz/DDocument$DrawTableModel.classU[sD֗Ȗur)%)ZRB/Z$ !̴ 0}/_: o~{;_'؊C[*2!z7cx;wT`VhxX0UF އT0*̢.]a>T𕆯0 w4:wH;ahXENjpLlj8fȞ(k"9 t;msdIEo}+.zkë.|ΪJv .[\޾^"nqC1D<5)ĹnɕDclmq5=. *Hz9|b8Y]2 &)!:7EMKLd*4aK6*ʋd8Hӄ݁jeH؊qve.w YZ K$vS ^QԞ^O@7U\YJښDOFSTt7t%])4DZg S+0 °P;&$;Dx mIo3ĝCuIqa u&@r2v{uq䔤3$Qʐ04 x> 0fS{"#|Wu=Hg%rI; /:1-ge=ݞo)/}"<2rYQ!˿: %ӟ}PK |j?נܤ,net/tinyos/mviz/DDocument$LinkSetEvent.class}R]OA=*uآiWĴ}ؤH}$+Lp&ݡ1xg$*M{;s'Wh-AtaC :!Q#PDXNdb\sM0e<Y&i%a} U"/'i8%^or|>Rq&zKkg/(:Cvڝj3ϫD.VE ],aم#eMBN+A"?՟qBpK#)Ŵ;T?w_âd}{x=񌏫GjEAx\~|$9{=Oʹ=UWa@3x]߹ff0̠fe~^Q3^4k!Wxl|)dol\پgPK |j?ڊ-net/tinyos/mviz/DDocument$ValueSetEvent.class}Q]KA=~miff [\>,D=-F ~@ODY {Ι̼}C)IՊ,9YV (2kم[e`.t%hx;ʽϐ9n{xE/}m 醂.ː;pDo;Z Cۼ˶o nA+Mʓ<*Vҡ{e" 6L aĴY$ l2l4/jBtS?r*/!=l,Y&$NEˠԐE 0$ 0E?9)ƨʞJɀUf0Gu6: (C0{'m?#f/hC(vVBChxc:'czh~L/M/zj< P?PK |j?Efnet/tinyos/mviz/DDocument.class x[e6Mnk[AY. tBv]!tc.m%!kP/1PTD+b$|!*O|s{&m|cYw24%? 2O ,_dX2K,?%G&І@DkKB7`IB X&F$Td8E{A#ls6fxp oe6K%\&C@x%n_ݸb'@gs0CE­2ËXto{؃%X0(W3N~ k| .aAY^ZUv\ԃcj2 ^J `}2%Lp5&%\2iAF) y3ټ7HFn7Ife07IP27U 5ъa&59a=chu[դGhO{ZXcBX,EM==2WRq596ӱ Ebv:`짉B!-m3f,*iVfiiM  q'ia>9@z -N@Lc4 E$² B uB wxP敓TlB5ٰfXrF7؁@5˜% mlwB70NvPfp' ʼЛN31$23{k.e4eAW[ׯG3 r쩕ê *ofl̜] kä4KcI;O+."I;.KpjLs"VcY(z<Z1cZ|ksƵ$MJSh})fcRK̍|PBr%kFQ3'jq=`Ya q0@X"]lvq." bq*ÓjC(gm-ji|Hϱ4Ǚ8t|j*UEq0dN,,'"-/$%֣autiYzGE)cQ+ƒL"Z8xE]eG+V )p ܪ' BUx҃ꌞ÷+J«*N|Wa騖VlaJ\ §|R2?F|+ ^}x-)l30}t|?~&ZHA,t'[^(FQ)Da}c ~ Q5]xSO$V{\ޣ_Q>s~2ᴅ* ~O҃!_ï+X' ~>>x U𴂏[DE vuDgQm %)^;kWgֹ̙bv]9V|-Gbf`XAo]__8Wj%w}lj S#+>?d?Ұbdز>LY' s' SsJ Foj ǵM2bަt2K/]*m|={n-)Ҍwkn* J|A`jnFBN(Ek.8&0.S"+j1S(CIM#j6V:w^ݕ6\?oC8-q9ꠞp?O+4׼: uDPys0 4nbl,,,栕m<,(xgf iݕYXE[9dɌ pJ}E^SWcZt&~?[,,dYX7yf΢e= > g{rpNs֒#WU%=x#^}&ޟWjgs, ?!=o-)8/ {%ШWjIFx7=yBC,Ö,ldEԭyzP3^ /m\\EJ^XFs!aJ]q8 }pȤowDlIv~Z k{6G;a-f즿]-pI> 5X_{jB#dbrk!w@uiCcLӇơ <^::OOl~jдwwa2tA,E[IO,eʾHWmL|>27dNm}SR=EۚC6t Ex\t6yM.n-IlLu7L0O0ֻE/Q2Gs9YT4Ń6Zaӳ%Cp iLx@h|z7ׯsKgNTpqP~ 7sxʜ*ma }zo xF'%c=net/tinyos/mviz/DLayer.classk`S7-M( ϐ VKmZ@ E %ҤK񭠨{T|LnMUԱmmns{Kޜ;7i~;|;K}X:zxw%,} ~ 2Pcޔ'2)Oe osV_2_3x; ~]wN ;pT#1x_%w\?/ >pB{ } +I'4 cd8 ̴`i`A 6tJX!vx]Jq,*'5܄6vƮx!m9zЉXkx'Ttg 'H8g8C#\'1T`-1/ᙬ[ s!m968`*`5yҕFMlps،8q ˂'N [؆A %\&rkǚ0PٖL3j"Ng5 Bph*<,{ۚnvuZԷ%T Yekd'b2ife{0fx}k* Lo|O}z_f.Ztđ6{HCnuw[#Mfq3)e0ҥn}[{_2I;:LbL?z(d ^|,;Aݯ [.kֵɟZa%Աj)-hnb\af&meY,b%!(502ycA$]zIR'Z>'&}} H}\jJKdʺhOF}$d%zB,ECR?;oE&]Z<֭ŵhFQ~6_fdSKmK??\.U,cp 3I#r)ryX# Ke(Le NE?F1O\hJAb'"_R{hZUM8J:%=׎4#l:yI4.6FEn$\O$*{~\yQ=HKfJsijcr.`\S•=pAc |nc r0 BuhlFxUu!{:[6!W* :|T5؉PSwk2RaZXPcGBy!NzlR0kqZ uKE | ~]jym-$\ DZYD|R!v)mGm0q% |(;ᮒ56+p|R-R1רp+F _2CMmp\{Qp;ࠄq0`A? DJ7%*5Q":?޲gg. w++uI> |N(j /܏W(x%W15\q߁Wzom> I|#ޤrwIYȑRfxY[贗*'yu vYSylZ0>b:ԄڣD3q,Yt{l_"&.RLi۴TJ MX{25H{p%jtGO*M=?=nm?\8ҖB q{'qahX35գ'v:z"~8\%,̵ w ּfvTn[FSvy aXٟ͈`/ 2SoP_2e뽜OarLm>w6mC[2 p%mfwWmrڜF ̋ ;/K~ŶT-XACJAۙU)9"H)4uU[v3ZxNȧN<B&%q)Uӫ5q'PIfԸgإK^_' ӎl,ԉvL/^i_LH>}ҸKFEgP4Bx9YvݚޙET.Dži>c=#`0kmlω7c @Zn|L/g2.K8 J8 WCs,F7l1䠙Y.Oؐ4n),)kpFl3|cV1era)%SK LFl-, Hdҵg\Ũ.tpV{ҀLkP<K5p!KjFHXXh){LA"E\㍡q=gh=ssMlR aNY9Yip9] \>`x5<2t1E8n4E)FIk{܆Kdi%aB6S0bW=P2M#B>(labx˔G˶ۓ Q睌btM 40mߙTeZw.FH{ $8 ,mvmJ3U*3 Q/vjV(f'{ʻ\Y-\\9wqTmUy1pjb$omry]N`Dڼ\N}Kudk۲tdS>mfb픍 kb;k_O̽}Io+CaБ ެ{9;W>WE曅qbJ |c@~tJjn_KdxPa|zP̍X~t˔-zH+*86vSz fPK }j?3>net/tinyos/mviz/DLink$1.class}SnA vk?k@PU^@b4i+70Q5씦O൉VCYH0dΙsf'<&Ī9\5 ,+,n0 *ik Yw!Ð#Mi \ii8TjJ/Ɏ ,g&de)g])zG6Nn{Ҵflñq6e`cm]gmvac'(QRcM@VrۣPq#' ihE23Aly Hf/šHh}#)̛>bC]|;K'>ct6![d3\˧D-I;PK }j?y]net/tinyos/mviz/DLink$2.class}Sn@=15nRBi6 * KɆEKwQbHlO/B(Ľ6R@Čs|ϝsglK0My 3QdAaaaaណ5rC`Ke)Ͽ Bk4>X=$sԑf%S=ЎW 2KWTq&WH_Y]0VN0=ߕj:*&VQ5,xd1I'h≉}-<]-f0μʺSr,;Vt cw9=Is8E¸0jr_בюŹz2 {Ȟ9윥QsIiy͙sI).ӽ,-=EFib_ j_QH#CAgkh/H,"sqT`6bLo(\bIq ,Q։GrZna 3 E5wq+$RlPK }j?տnet/tinyos/mviz/DLink.classWZ8QNBj,;-m1>D$51؛Ȼv0Ж\(ڴ\%N=)GμJr,ԟf潙̼y9>S%Fd ,&yy@Jdb3qtLc:꠆C:VL0Uc>S-Fu|awE;!x5ݸGý:6qsy 6|9U&X4<<;sc,ݦQi<΋1 &O2:85|C75WtfImz)ϲ8njuk*y(h+:I_l(0R2e7ǚ*PyLA(xc+P;G)X>خgިQ6[pdte[VKeD~͒#^>Ʌ" c0q`Ӓie9>eXa &rF8䥮.SV'F)ǖ5_1=$=,mci `r aX-oSDֶkFg\STZy p=W/z錆Nआ bNǼSi3>NkK!5"*2Zz,Qۥv{eJEG?O~ Y\AXzCMwo _RZ0 ~+; UqәLёt3L+QGG#$g>_ߘPoX?p=DJ5\9LNGs#ˌbfzR54a%δkyK-0!, ]xtM9 h&T#N!'ȵ\nҪE'WAN P-} _խj)W9W,;LW7ȦY(/5!爚tQgm<drD_t4m,TIۃN{V)5JsP'bE0U\iɎU2Ւ޹o? jjʴinI,V#́s*?%-='آXlHzl m5H$jb;5K0a[=.eF8Пtq|IQ:g%-^p"GkLk| vγY[fFРpG;;@m]\M\5r/U$Ds3D~T'%Ж2XgzwDz1R.q+X^c>W⎝,^wu8MW>]IK P2O"c-{:$Vw;~u11'H[Yj#'7GJF~X=m;7ՉG1l~f#…Hse8j _`J)6wBgVJs汙Y\q #ģ> 3־e9^}lVZjb<.qql?$-\v/iMMΡ%ԏV mKEٮO@'`:V. ^Wܸ#?LO,Pl(Zr s.Zֵ;_Pt-s}~ N|! 9 NLf/"/lC89)LA96Qd"zS! 6/ף2ip `.^M8"@H hӵ!kư\VD:3١Tv=A;0"[uC@{ZSjsz9YQtQьZ6M)3rrP RIKaٝαpV{P-N{dtC9 eSDq@T㐀|~[.tPrz=d0E ʊV X 6W7Ő- ኀ #4-~v2N/j.zRR:/q%O?Ks"*ԷVVrg \'ÔTEk:OSfwI*ڒ,)RE%Lq8fHFfEUc+Ӧ((S5JI6YH,1e&|*՜ʬa 4E3V\E.(o)1/OR&0>[3at{XE~|/pk"˔F/9G?{q9zhl%}Oq ZӘ/A7 <1'nMKTPgA" /B5TAsV~@s|bOv"/@]A'DEJ,ƫ.ph p!aM;']Jz8CvvVv6FĂTļF ̼bܲ*}̼lkO0F% |2KRRs'e&bd`bFFfPK }j? __net/tinyos/mviz/DMote.class}UsU&&ih )6IkD bBP%-ݘlT|3_3~K:#3~964};{o_؃PBOE^b#<e޾`4x`#đ("1U!S ^e490fIFb f؎lx87Xfx~C46@W`uP-+=gn5N%S2M@%ߎr\cS Nv t0m=$0ndAvUNjGq4vO^JUsZMhu7s.(XdjrVYH!-1!$pYaWXEd$l8=+^ N^Jo"ᲣD u WqM+ޗ$>~ϛs,W\-~x`\ӱ%>B]d6tKU3\qOQغ[6i~%>MϑQ-|)ɫo$w-=~7mչMl3+a37 7xʮA{/m=V<,oX21&LEmq5JOFNh)He0ˈĺ\&aCfOr)6>{ܦu%ӲkS΂f42L2:$sf{nD/kU2_3}bkNS(th~-3R>-X"4?. +]1E" U״2TOL!֍Z 8=j6ْyyV*65fHmW'oY#kmgjVj\&F}06ELv !7]P!D|7o8| =~4>GSe=t<>VB?%!;N~fs9SˈDdc /}؜; 6h:u[1շ5u:j _;qׯD"Mw'zҭ"Υ7Yq=~ <vsx') ;BzO-r5n~ف.^TPK }j?gdO net/tinyos/mviz/DMoteModel.classVNvvld 躉EL6H bn@0h I2t3wOڇ}hkiJ]C>hs;]‡p~{9wO.]уR#aq,Y,4b_ ko,&4gxmF=sx>໬}E L~~~;~ڋaSūl9S,~ ^ c+J,~Մko7Vf[ o)8c}'Ht v1lgȟ0 H gI}#bHHmI9P(f@!{bƴ^ y䘶Y,IsFcS}Ţ5HABXB7Y/ GI'6,Ynۻ~xCtr&]m9%lI~dp;ƈY!gJؑ\{ {*5-{ݺ#װoعL- NN"d:.C +i6fQOآw zc ʈnU`[B<>*$pJ1L^~I}Y43%תr7JhM֐qmA+L{aF Դ6'I v0+L졪69L_%eMF.(a*ʉ[0fLa\4iiJ!]z*oMʼB&纯|f⸙{?bAT8!#ة*; Ϊ#Fzj*CQ^_E/v8?)xWK* Yx}*@YETUUpPpY8+()x=]e$&ٍXbJox|o*>E%-᎛#U s^"7&XB5YԨYhLV7Ec쒙;:CZk:y|F]r159h]<װIŷ@×okkď]m-xl|8P7L9V=I Nm)ܾ5gxKǸvpUvAЪ!%b9*ys/@N.{i$ _&Cŵq #Vi6 jkK& r^ 3>-}`8g']Z3Wma=5ɵS?va"h9qO8""#4ku"gKۆ.")I/UvOy:=vzD)as"d{npN❮k?M\Ni9A52[_ ?uM`):a0=)@P>ҏOPK }j?]$t(net/tinyos/mviz/DMoteModelListener.class;o>CvvVv6FĂTļF ̼bܲ*}TkO0F% |2KRRs'e&bd`bFFfPK }j?! q net/tinyos/mviz/DNavigate.class}VYxWi$ylg ;mJ:#"Mqn8I$'$mX'Fb4%kX%LmKS>#;3+{=?={yz0!G b؋<d )&i(ı 88J(Q8|b Lj8G7> >|gO1)3 29cdkBIL1"}__Xq q| 4|;&e8ÌG5|_Dʦ#lWAwnʵ쳥JXΥFGK"]X<+j\vlƪHIX(in5 _-/͹;9oYyVX3d-7Ed 0=p,}d6[U0`ȹ%g Q<@_ gK.ݨ7Y+H(P$nV4WΛi;/|)pD1̪5cP/['Wl3GK69 eu9*G3]r"/C.nJT)԰9P .k|UAcg\ttd1`kXuǨ8;Ƈtd czRy˞Ixiex ?pQǏ'tAḎE݉t?s:/ œ8_5 I6f4aU3xV%d vM >ѷ(%KsY2*詧*3"527=-(i>x{<L?3d1PK:e^*^qL =EҘGM[lo\Fas_P%ۥ4pѰhxYӦ|$Դ뜐mnuF!˾֨ {#zw6#};Y 4z<3 qd 9H;6& }&.z`rt~qtzl*x[-w3&;]JMP#ࡣ6H$YnORڌpﴊ^iLǪD!2sydEDr]5KqD `h{Peݕ$5qv6o+9Fސό%V1uGy6o!  y/ d"*S>ҷ&&QyUɵ\JVꄓ#tZ"='U(Z&VZj 3[N@щ ZiWnc &*6FBaNְuiPP2:Weƻd8Vq Ҿv0?BI MKJþ3n_9n 4tӳOO?bК ]*{}=Apabt˸F"\Îq6Ȼϫ1A*^\ofd3{;Ff}{Rn${x m|Bk$}F2@]+:v/˨QjxO`$%ų2@^h5Hsif^S{ +WFSu}>n?t5XSWvVqCTcPT=u6bX,^ (.֐Wҗ~'VA£y,#nEp3WGzzB]{,"v>Du~ez<5X-5n }e6IDBf5WкGp[|ע(ym}quJ85>$4L?a[^p{{PK }j?Ynet/tinyos/mviz/DShape$1.class}Sn@=15nB[" $T>XJ^[x%vo/%36R@MXgA&2] w{s/_21^O|Ȧ4ڍDube'~аhJ!|>T̽(YdƭoH]9|Pv Ҏ~VԨrUᗂb]MGjVSjS#*"zӲ̦ײ5T.HVm4]GnT^հq;S4U۝2S\{٫){.>[嵵5ʴӅ>u jq7*7xpe 4p Xb& cA,b*$x 1P`u(8h5=ᱪ0-XƦehpظhqW v6pixcmC`~ R˽14o#YR-r=@ @ZKȖi^}TbpU%$OF'dKzcXN4:ٽ#tѶ_F nI"4F"? &'9&x{/ @~`7&7ar fx]@ R`a 2gZ0P bWJ,DU%ek~|LJ~\ ;)-a 9,~^H˔zɲm e}QOWThKE^` ѡʼn=91:.am`bUDzSCQO3tohy4x3GmKLd rr[nt9MBdTW_y{yشrD pfcrGMkf֩^-NOּ\5խT–DӃm*[ ꆑSxf^{0T2犋%dgŒIJEGwh JyZ 7n[Uч~Х xEE =)|"}*^Egv3h {0pDYqCDM|3ܢa_ _oT|[*Mrs FT 'F1$!p˱iv3SizeS̒5}K֎,F}\3Iq*)g^Ym r̒LZ<Ɉ}wIzR'".D`iUeAU2:e7$2+e~]j&v{%]bkodȶ=}8DxV7lY[E4ب+ *WoooM c mUl Iv ԪY BU+.(&N4 k~WYK(j9$F"Ul^i4P>=cH\jLm>5AAxȎ>M=x$}eBynpLgfWD=}}l>Q:NC'Bxr+bn"LDlQ/dݬS:l~1H5Sh݁%5{oa$k{%V}u?6 w"gOY'<7k}t?3&FyV$2O!HE $٤ iK$~xwUsF4A)jAG v1Y;U1h)A4ZT#,vQ{ 8\K+Ua0YywѺAq T(nxİ8XyZa r;zPK }j?Qr)net/tinyos/mviz/DShapeModelListener.class;o>CvvVv6FĂTļF ̼bܲ*}` k0Fe< |2KRRs'e&bd`bFFfPK }j?M; net/tinyos/mviz/DataModel.class}UmwU~y$l0M[(iy)J-B+mr.nRW|WVAEzE?MAlJۓw}晹s;6S*6'Cx50HS,L Dϳi,ΰ^ ଌdPQcnUꮓښI;mHkBOէkV]j %x)!aY^e-zҬAzRWֲ`ḄjZaft'dAaM7=K#u\2y/MMJ &ݓJ:lFR-Nf/?LSiRm8q@(=ɧlմO5}YnKnK W5 7a!A.aagMf:4% P0Fx9F.ф?3m4F,&Ϣol38Hm!>a_U0**UQH~7nCA|s>[-"3Α&+BPK }j?_U"net/tinyos/mviz/MessageInput.classV{xUMv;{kC4hR nI7BٖjYلؔ5Lwo7Lflh*﷩OcJ&jxlI6soϝ{Ϲ{{saX4`8=x oPr $/ EbQq$1 aʰbp%1ĖqL o ,- .ư0voCwQSAN1[pq>[1A>(G(>DŽ T´T䳂|. =Q_% q]˖М;Mj钫v q%\3vusrq"OL|iRIXzϞ)v;\]ebzȵu}½VK`+69Z@ i!dX>!hBS75ABuxn:f9qm2 FZ) k]{y듼 !̮Џ Wckba?0|e{q_uWW2U|_…+f)ehOEp4%!2+&Z+$3\2k۫x\3RaKMfQ܋#}k&l^qmZԏJe;r >%B";&EV ջm [ 2Mfo_IOW4oˠ|՜~}Q(os{>sK^*$Q@"ù7LO+(R,>8l8I`PIb)^EcݒmV^OYwvٶ6Es@wGWxy)1t˪5n1¾Nשzomu^$@D&E.Eυh\k(0LWF>}B1 QHqSt>Q*_L/j#r(Dۨ/YMf!8A%(>'H PI.,.~Gijmom?RCL~ fi xi,γh88 3hL"5 SC}R4inCC$v6xP> ak2j^t>LӸ@7HOf zp|-ԈZA#́TQ-S Zg~meZT~DlhKuzP22=4 ѸE\A\$aA/<\eD!^_e-Vy@gq1w@0f]"<.DBW˭9wRZFZ+3Q5as&&K3drU.FX^:1J hjL!vI:ʰn52]ʸ7(gH7xBpʸkKGHվ[XSl"5i6,ww5MiZA G|'ĺ/&Q@l'{<(?.vɵ<Q3zi I8.Y|b( y t-#W1''&zLIe_ېc<Z T7H Ayj,a凰qwa.8p_##MԹ`UU?XZ}i(8s% $ǔFtccccQXXt`m]JaʕCFKDdmxR(яn?J=DUb^e)Z֣H<0uicp䭌k[Gt ?q E N|@6( h3Pj7ɋbRxW\"I9­=>-ے'}W$j 솪F"|a\ie O*(Dd@ ^x{L8ΤTBhلŶ&sZ"/7Yΰu.úcъ)ZUv>PK }j?g_i#net/tinyos/packet/BuildSource.classW [~wlb[1vBH$n1`S#NkK#=+$Ӧizے54izM_ԧ߬vWOafgykfxo#cLĜx %\q9 ySF3 yJ%ÆqE _ O>Jg$|XGQ>1q>)S>?Ûϊ8 & 7_%Ǘ$|K|EWE|M&[u>oyI·D,2H."~(f??5 ?? ;tCwNhqc.Iś[]4\V$_]u:vVli6 L*#͗PЩF4ce1R+S)3"⺂os9w9lsYpt,?]' SNYu,/9)[! r失H'r;ҙ 4D:Z͸Ew]N> wa8Ö`ʇ{݉= :<;=}tw9q_˱uv<m pWDWր2Fעc( 5^FS۵Wkm> `&`:1q^]G|}]fGg@}  罹m kl5%n_l@(E\|b7\tz9魢s1+σgȳKjmQbaOl]>:j]Q#PqLD_*NПxwcW7=dDy'WSc(Pu fvfj^ cTJ3!^ߥlntb4!8Uxs\Sr4L[s%} qijCewQn&6 = ,y`djVomGzpB2n?)}鈬:7#?yC_7S> >Ts:TՕ+Zl Th|D6rp#uI,*1E, 5D e [ؑxWv%>*sѣFx4Oih)yNoҷ@iL'&= jw'Ac+ϘeTPu*h$MI\2F47!4; 4qϐ jT^v!ú_YJ#EsI%kb+1flB"X6I[ ͤcPK |j?^E!΃(net/tinyos/packet/PacketListenerIF.class;o>CNv6vvvFԒ̲FVh'0F̼b}0Y\Z X\ *-w-K̓+gcd`d`bfYXX,PK |j?9p;I$net/tinyos/packet/PacketSource.class];O1pC#A,߇wDjQ~P hWvrj+dwXٴ\.>MMA TQ! o`AiP  70wݯw1X"F4ϰ+v3=:*`#M*w':|qٽB}9 X j2he-1ǘ~xF>*i'y>s8N ~}ޏOS~O*A2b~"k3A%#^L[YLzl˱VzuL.{p})EE7ޕ:fOzfYjk#zPKSd,֔dͣ\VO.~nr1*b動JŇT "\Q1!y"㚊Wq] ajq\tte=5\jJtϢVwU*~[*nsX6v+J{HS[~ )`u4l sa:f]v2zQPKWpPq#*~ߩ8Ôhֳ4m4PPhYe X%khFORa R?O4* Xɋ6 *Y_+:TwOK@i^e0Zҙi}2g`E&nlz}4mwp4YLl36g{Dz>B)Ol[7>cDiFֵ}s!J?1p'o;ݶ>bշvuΗ$jԼKo״c ajLn8\ScliGjoe+1o\ cug ·w9 Ix,Y?9 _ڹ֮ i6 iٺ+A?o4*iDaBJ e#H`Ac9o顡PK |j?Evq}$net/tinyos/packet/PhoenixError.class;o>CvvVv6FԢ"F IJD|}O׊ԂD2:! }h4-}L1ys< %,c㸗iMD^%E$mf0PK |j?t %net/tinyos/packet/PhoenixSource.classViwE5'3 Y I0T &  F\hfIä{{q$!ģ~ W{=CsR]u֫^ݞ3Mn >'-cH(H*BA'9 Rw?f2 b,x(7C < >xG<Z<΀'$7Oqt[gyyQ/R/kx=HOo(xS[ (ɚ9+!qC-n ٖ8IoA e6dV`tt-]4'Xֳ4E m@s1=2a eLiCq$m-Pf2)J2LKk1%PqwKkF۶t##04jnwN@Q炱غid0L(ٮS`gd1eЂ7drv4RҞT>ҸAK;(P9HU[2:[D\`A{V&|$zF}q$I=zACsUeH9#=(e6gYTbwj- yrDdnhmmX`OEeVqWq)xGhW;bK Ŭ\ 9b*2iء&(}MT܈6xp+fWw{NO'Yi562V!>cЅ}*>g*>*FnRVoU,=,nzAYHB6 4#эɲ(?ap0e2C:qrF*0ࢊ &,c^cGC}.\5^|ӰÐ{;#, ȃ y.?b+Yx7tG5K&ci/ {.XyC?x.-nM~oG뗖tsLOvXi!B3OE$MA$)[E }Z̒OqR\g;@RG$of"ӆ0oi WElA}-ڊؿW-?Lwz= zq %m@n8ձQ`"4c('> 20_z)!;#lގA`? ?qݝDL뎂]^\hz [xg. \k3N}p-!FíX\_iUs$k&%~) ./Ϯ6͂>-ՕW%˽hJO/b\ܽP!PK }j?r0 net/tinyos/packet/Platform.classuRoA\O֢"WrVVi|x $5m +^{]E/}&`lb|?8Gik>lfgog曙}iS8y hl Jd⚎)B7 PR-븥6ۡc3W~0ն{auZ/D2$VQOBq!7%9d8W~kYu:^jG4%,E&fq!s۞-Fhń; Jұh.ﳝ {:%7υ&W>8u>J)M %;t#^!qxoQ4=m~ CWC,ᑉǠ6<,x=cM(8Cҗ[AtYOKqibާI$뽎T&holMHv' \?s%5 tL:IօەõiӴ1$ ݒ~кnTiCf>>^Rs8ڔ+FvGbc b_cfRj埘..ISYPK }j?'"net/tinyos/packet/SFProtocol.classmR]S@=K6-ՠc(֤(/_}aA,3wFN{={rv0^oG3E<0ۆHHKk^ຄnJ[F' )ZnFk ,KR!x3OTV̜ig6ي3%d]Rk)KhlA֋*WZNZQxg^ԊI*hm|!_xq.nW4kύ[ꊮL3HB##32B׃ 1).24tb^ˊj!$Du %WMUX didLVLkɪC]um~%S ˛1~)mՔ].8*m/;-ɲαkJl6ծr!u Eǭ)+C.X3N":0U7hP6dPOYoAlƿ3:ĸ~p/w{ 'Ĵ/@; Skx<~O|\+W׿px9ᜥYjcQ3N {{ڒGx9<pҡ}iNv#e`$)1"Ŷu''C{q33xwDPRJn&[w:Ka؇}iY=Z\}g PK }j? net/tinyos/packet/SFSource.class}}oPƟp ؜ŭη)mnnd&$&Umh1L$Psʘd0}9??~X[)N e+:"ܬjXӑɃ{YgC64< T ,hM zz&Cm{-v\Ş: [dUyG{wv46?thx*nUrvnt$("x#QmGXlJ<˸(K3G,I.$^b_$$WXI}S<׬vWfP5T[`1ZUuxzH,ۧKh NDtb 0$+O&RF~ڂTZ )؟Gy B܀8v1ha"R<7}(7 TTג+6h̑hX6GJo6IM>RFY؃$eH IkIǔx }ÜAr2'B !ZNSb"LL ,_PK }j?ebnet/tinyos/packet/Serial.classmN@ƿEAPP7R0x0&uJ@JhxTl HjAɓR1K67'26b5 J]Ha K+ 1!%w<( _2ZU.-6.jA\lӒa+rOV+A6BXS5YfQk 6B񿲆X9ErT =mqROG;WŠЅ]mܰ, ,gVyE83k îѭ6aB n,aP\_`;;&}:}~h}ǻ$@SIg40gcW8ǜWxyQsq?U+Ɏ0:PK }j?(net/tinyos/packet/SerialByteSource.classU[WU&&c)PnBJC*Zjm4Z ^dCLЦ^7^|kIXZ7?_=HdϷg3o.;1$EL لA4/xYkAZ ⲀI*x O+AB(0BfEf0,l UL2 g,녜V2˅\0/` s4 q[A e븣.Rߜ5=_.i{ > > hZ(|uE8w-BL#"VȫZnDg\ W fz>)Jr\e 8?'2 P뢚E3r)IN .w1MMPT,^Ͳjc._:]w$.E34l^-x݄/߄?ֽgKLX/I~'q1 [6Ѵ;P*Bl%n!^ţ$o.Y 4K>6Zpq4om^G.ys㴟!`t']<~dB>~0p$,=>7Hϕ:0 ŷE6 v&n:aqLԪ"){~y 2^=HtVn辍U8$|Svw='~rl'vbOzñ#L5DQq/~DCjf?!'ECE]q$ҽXj%- p[ PK }j?#f:U(net/tinyos/packet/StreamByteSource.classmRoa}߲tj@+@ŵZJ5C& a[q'o\Thw(R=7y'5<EF<3tXq y~D74iĺ`<moq'i(h( (vG`rP{W3m,;뵭%]JjכܖX .E۱-_&'n K Ĕa)O>ԭg]zXLD7J%KTm{#Dg^{X4p8 H39 [RX#4kξ9婫hq$ag?IvJX1ͺ!j ,;gzsvVnmi+՗VH_7Y=m t!S9i@2˴?ifZM?G۔VKQ7Z7((s}0OA`RIM#,HEs(9|Rg7$B1;r>*wu@@#`jO%0CqeԲL(ng,:k(1[!I$eBW JlU<5X?:rθA })PK }j?net/tinyos/sf/PK }j?@wE net/tinyos/sf/SFClient.classVUnvBh"(xm%RRm.$qi |@ dT|- U`iV +gKN ?'i^d3~a,'&&ӕ=c".?o VʓpcvPoW `YhNF֑`\J)\NAg$Q*^-$uM͒ 1R)G{"1rTMn`; ;sHmKwywtD]ldUȵ}!gn%/-]-0VbТd PK_52Y;\ԥ+*gRN ނ[㨫Q=iBfoь0#~M'f2ĪNk.~g{cݟrk\q[Z R"ݗQ8Lg`Cd>uKg'h^iF1PK }j?n%net/tinyos/sf/SFConsoleRenderer.class[OQݶvR BRDEQ didlGfFKeݖ OnsΙ윙_0Dݸ , L&#PqG ogU9Uumշ`) ?m%^Mx/5F8^Si0 VznaK2K<ԐQ7vh eisotq/Ij"VzH1WN M#j\MY88e &K7=?M#~YuYđL)퀞D >~ g_`uMjB·ja'z០8Tb ~PMdHkCH;#:X ,V)[-01/n֘HiU%#IuqA `=3ޘQꙋԈ2PK }j?ͺ net/tinyos/sf/SFListen.classW=E8Ա٘2cLNL $d!lD, K C҅ԴaB__߯}_+ietzwsj>koX-n5Ѐ[V`qsaƸ=+X ~5H04=>ewb@PG)<#ܣ^N|Mާ~ă:ʛix@atcu^?ď(Jҵ@> 4Xq\0c?O5dgx4^[EG~+adDd 4Q*HkQ2KFF^Ɋ|o1w^1q F)uVCy*;CI˟DMf_gbML`yeu{6>E:+nrbc eb?9܄XqZ4(LHm#Qԙл&)gbkrmB1f$v)U,v:L|?#>4'5MG\&n _"MJѱ):2|ZvloQѨ CDe{rsEgtU'SR}ckR( #t\z-@w=If\%K]&zKT3BWJ*I FC_(J1G(!צT}g.tDO,0zoDGg}H&!N\3W%4Ӻ]2KM0=b{l2K#)IB,qb \಺nhRY ;C4.TMk aޘ]xqsBX\tvf઴[ҤG>e8ieBnQ͜p0IH. $*3r(zc)x@ı w*TҢK2]64H ؂=6zzqUO.:Y'ih=}shEoM3kK&Jx#}U4DK14 ' U|jXEBm88Z!+q58XlC<&vCfchK@[ %^H& q7 yZ?@!^< x4 ֋zaz8^Y}`.E46TXWr>,U]C*zs'з7 d( 2Kӧ[ =ߚA38K&E?_{|: Nr3t*\U|`=6`b\hR8*>ѕos@鷡 _bR86M#_u^#w$hޛ>ܜȴQ2zTbߖ\f|ŌM::R29>Lc_3?/PK }j?B"net/tinyos/sf/SFNullRenderer.classuAK@߶j{>}c +DacHHs:A8饎2m(, D3]N9,Q 3YAfȲS8\YC"|Iy̚ Wf&-xh(Y∍}ZGŨȲ1لr%Ww3XW58+U 3ʥoܖ]+5jb Q`OPK }j? h{net/tinyos/sf/SFRenderer.classUj@EZAAOHWC. V n4a2uQŌos~O^эщLΙ0Lf[]j6W8c_3-Лod-Tէ3"l [n=ܹsg?>,¶vTkjcFP43[]B}TOĿz*JVg9J B`H*Ahdnb,ED8j2R(_fAg DK5fD6]FE9[=P)ǁBlj3k6; |net/tinyos/sf/SFWindow$2.classuQJA=WWW-L^ @0 z^wGYp >n=ܹsg?>tP/¶vklcF7mBuTOȿ~*W猹JKB`uHJAhdb/""5`b)RH/ROXK5fG6]FE1gܾRbѝZ Mҩ@TP_+d Ig>@6NBF1y% "npTwqZ2H+w)^@"2O)VPK }j?cUnet/tinyos/sf/SFWindow$3.class}Rn1=NC7nIZhR(p'BV* ]7u%4峐JA<|b X59c93~ QR:Zu@p;&g%t"܍aa֟(0,+8Gs3~AJ+a{hCorWFS3v#q&{.Ϥ|Lm0NOLa#&sH3 ƒ]l%a;g Ɂ t ͒J!=3t(%e2?NŒHnvpJ.+>nL5sij!rJ)Y&KP_݊*Q;6(t ` )l|a Оum"?Ľ`o|AXhbaٜ`ڽ ,V/q-1{oBtViLob5s?~(`EWp5pu7Pupm /Mma TtKSǙYL."}?x3kK?V&^+V0|Lax9{{XaKfJJuMl۟Ju qJ%;] M *Oj_:,RFû<=P6~_P\\ln$F]auig"0xe4]fVu0;J|3b2⽃H,C}4VNdM`aj{: gyC(@x }0;0Icu 4RPK }j?E9 net/tinyos/sf/SFWindow.classtqF{Z}YY[H62B$˖-rA Z^nS1 BHL|kc%BB*=$!!@=Iw̟?="ho*̃W ˾T rC~L9?Q\~g \ْ d*_)kj7 Nd AŒGR930+77W[TaK? K< f*w 0(RPU ,f`PЁe],g ,M;"*Va5]Zf\0v`6 qrC<^%*ar) 5%& `=l(Fl0A92ݬ` &/tx Itv[y'x KVѩ;U^!k,9xc-,vx9 ]ܤ-`[p P^#am1̡M}l Bu rv}a)9V,Y 'լ8mV|Pw{Rbfd6`g-H}_, z}I&+&wiz}z|XZqR,kLNUϝCӅ7rv+JdMư>HZ 17ĭDl.cI0BN CqcPf9t6L'%m ]Ix`lԳ}>f }t,2& Z8Qf Gt-Ό31ދ0ԝf0,L -iG4>h6cai E~'BA0eoHm TDM9q˚3:w52:^O]?caO=bd6W>},ͬgsWgpfẰc iNW2 JKN&xFZ75xԥr"AY9jC`/f> 'O)> $[xb,G{V:5'nmpL>ᅩvƵG<$4)p ؏gEn x+p9 p@`^8/ zA0iKpu{Ey?i2Rb} /;_>!]C-#췐#jM `VS"03]qz><[6;EZ4x{Dm渼<8LTNWTZ?G83`9>PExK8BE*g'zw[fK.cp9s Zzfv Rj=i1-űrjAlKkP哸Fox,ސ=m2H"#qHIjGJ׌lO5i#1;4PDk93uײ\-b/d.IGV8~r͝CY՜vB^db.Z\Hr%TIհӑ'#tP*1-n]V[FxeXͽR]e&g"&,Vyp;Paj=LݠC>FÏG}ϧy6?Qaj K\Jd]Ӻ inclJi˴BKQX~*C3ŠQXKQ) 2+=OWniZI.LFN ]DaeO{^ Y_3 ąS )es\8N'//7#΅ 6yvҜ5eta ]8&"*u*R}Y7苇(lqa+ W{lY~uLSF\c-0}^6;xӅ]< Bgr6a7#UJզlqêIR1[u>}1E){ f2:A"ebQPX"w0 AÅLLuY.Dg{WJIf,RDM>s)U.L . @F|2ʠk2 zI=+ΠeЍtŞF 4c`~bq!:ӷ.f3O'+ZN.R|"s/%OO/N/tyxâ/Ju1%K p .\,\ӮJ-xԷS+˄g'x5٨uΦԤ/TtmI_9iQju9&_I҈~rrpp} I*itnLBOj/K%dׯ}J{rwFY+ؾ 7?ou|ӧ,_3 OS%S8 z@~vxؔqPK }j?LD5/net/tinyos/sf/SerialForwarder$SFMessenger.classQN@=2J}"MdeQ]cܐ`\`Wec4Vg&.?xh bιw};C4K(`Ak[wM5;\ 4!+C-S?U!NIhLHih'1!ߏ`$ Bf: (С?Ja3pP ,d!PK, N9ԡ4Kh-M? ؓߪg"%rߦ*碭v}sauR}s߀fyuYmug 91P6귰,a=@|;- PK }j?N^T?#net/tinyos/sf/SerialForwarder.classWi{~gw̎F7 W"؆X ,{A$Dn؝YfgArqܧr9;i$/Cju`G3UUoWWWU^˷U:x:Nj&>"I5&יLaiL>>#:>gX1Vuc?3:>i<Ad% _N 㫸k[;[,1>0U811.?S_3XnV ~~o&I'O88804@WPvQ;Wq`@>#lK" w+v/u Ek=spu[:iy/i/15i_r|rU˞|<@/JA8Xӏ\r{sp>;h8$쌂y hK }cTBAZع>Ͽnt}c2bU!6}{ 맦Ң8P7lzqd8{iyͤWtd0l6J}atᘑ%6x~"*[֊A/YkE霰^$g ~Zu+5U0- m"ƙL6rJC/8wcmcBů b@?W},㩘7Ƃ+0]zْb^Vkmpy91T*mRP(QU?[Vt:)$y*  뤢10AJΫ%Gn3^b}]At,DBk͑ɮB{ӂЉV4︙L ̨ͬo.;i D`LyJsΨͼ,`4';,,̌675⎁?pkLk޸q5'Β?u< oJ=R!r [Qiʓ['U蛤uTm{~sHV)%j)go)KRIy}att~KØǤ%m̭wD@;#x7p[lnPxSrY)&=v,p n\*#틐ZY$OqkL.:[葅V,.olYhKxp¹E^eC29@.#jC]){H]l+rMmGX>&ceݞ ȕA 32@5,BzʣtBڎ8>w q榴jZ%߃v#|BgҵeONĤPK }j?net/tinyos/sim/PK }j?2u#net/tinyos/sim/InputVariables.classE[OA¶4zȵ]m R@|0!buHmvo~ >LL|0bbl3^3vhw{Ƃܲ0ZȵzmVGo13k44}cbr9趢NiRQv{=NE|/4%@ۢY_C&N"WiWFԀ&!j퐪tx`3f9FQc"c:t3!9Xd"'Eyxͤw"TGmTyۣ$=8MjH?qոf///SuㆩԿJ>Iu {9IBSFHe վ+t K wn='PK }j?~Nc!"#net/tinyos/sim/LinkLayerModel.classZ X\u> B,-YB!@h3 a a%A<`0o4 Vc;9;v[eIlj:M&tutI6mӽii(ܷ 3Bvq{{yH @> i<K>p4,7%d^,A"oWx%/ .7M|~Unw|/C?x?>|?c)\_H-[_ x-o|+=+G$y/U| ~?~,W~+A :wz@7(z',0 \C?^'pXJ p#UݯDx#7ox52ܷIA}57ܷp᥍UX'p򰞼 ,-[n$V,Ev;KnM`xp/{G8NBpTo8ܫiMQG ̈́6GBщx8:a":n·tEd8:'6'ӛ;TP(D w"#I:c@}baO5oS #OQM K+I5S{\3Kl2^7v>;l?2jȢ$3zi7dF-4bұ+=q-816h=<8A[y*nЧhnfTwn2!dց]ýQ.ߍ –x\3HJSq5LN%ꈦD8!`'Beֶ`gϾ֞־CG엢;Bk^1f.OV,@U$.&OZ\MN*QG( vwt} 3;ڇl'xu1BؼcP8TC̮>X צnT0ԎFbt9թ<``)-l+@77TڲFqM nLm`O')h;:;}}=m=DÇ1v[yD.ēnձ7s3T8"*m*:ژ C;G&תJhj\ kY=WGxx"%zTt`uOj1'osZ$kآ" jGxI] 4#m.d>r>{=6b$ɹm< B3= ky"$&Td&'55Aؐ %j5wIO"bOuNQ>Q8x Q Y2e,ߘgpuu2<1YqzDxsé{%E=o` H[k1TȾT&Ыɿ D,ftob6 "6EQ‰d(:J*$a!u-4xxTZ"N&G$ٛyVJG#K6Y(`3Of̘<`N4eUTl?gM'$~/;~SܜY̔N$7iPCO(׬W!]uQ (kTJ=eT2:Ig^{?>HԖ̣s Ul O6_ª6&M-$`H⡗F(RVInZfDi!WeܢR[gTuTqouR]t.2G@>9C#G.՝ŭ6ȭi$./5 =r?BN@+Ae:81F[\dzK,Ȱ|u'U&BFF c> ?!~ lnSE8tȠ}Μw^eN~oϓ@.FPhx-uC' cAsн5 }`tLF;S? ho 75uӰŝ=bBߙ"+ .Aַ8 &H Ü90 *)G8N98QG' f^t=^aby=gh2ђyNf%'T4VT#B0&W5{✁3Q]UudUc쁩>i̢r-Rp\SOceԪ)$%cI[ڏ[ҢrZ{ÒU)m6y`c; OXElvjݩ@}fI>m@@vpL<ѥ46ffd ^AWlVr{Kd[Fo%K*2hEL-fmON 8ď8џÉDp|G}͔Q~ZV`injTr!P,8Ul:,7O }RǮ*t3U-qd ^ƪ|sIm\t5>ki}:LMEqa>-Ѯm*sacJ"2Vȫ: |%3UˮժNkm1 PK }j?net/tinyos/tools/PK }j?~Z6net/tinyos/tools/Listen.classTYwVnb#[Q AYd%)K8చ}h1ZrOӗ<s9~\qB@:̝7Wz50/ &pLqHBC&I '=*#8XqfgqN"ႌ_0.R B\K2eث L(5 % 1lh:fp_a'eð[OE#oN3_ Wfz? gބB9Kl)73MPr.tfZ²S?7Ƙ6)]}uF#lcOG #ZFߘC՝lon};M1; nK qXۀ& Iej47$c7ZhAg6bmB`П3bCnSrKɃ)ævqC`"p;.gL}Hd$Hdz^EI >Bab~HZ/ eR}}9ӗq R6 -"q-U$ <(oCFGlϭb6vF2{rJn#M{ՕN%kc_ Qݻޟ艑PK }j?U net/tinyos/tools/ListenRaw.classWwU&I;0@MV\@ "Z J4ҒEi2I&$."+hS+99=ǿCwfcw7>Ђ_}&/V`^,b5$!2ɏ"0fgDkXmHK-7 %f Um,wNn>܉8%#^ I_𐄇%<"Q IxG'_`OJxʇg%<)$MSL8jf.K3f^%rszkZ'cdD1 D#r+jrGNOĵ t"5Rd~}20]^v7!28 >!|Ȏ&eTʰ+8?ၸjʰnfySf[4Eg-ftsM/𥈯d 㰈e|#2rKs\6W(EvLHdYSK* {/6(\Mٱ(jFkР(ͣ Q-|[++ EL!zBNhVqiGO'%lC2XKǬxe¯0ו#ÛY]'R"̭Mesi~x'a:tZ6l,i}BSOy44 aJ\VOGu f󸮲U\, ΧD-oN*V5f5I/5렆Ojt56ǪOV֡g&f#/>}Y bCZ~eʙz"ԕK^wqsu }Mz:zG951]ƱFJgFWl@FiO_]5ЍUp1! ex5*[T͏TsmhtWYHKueIH:\O p |$} $BjbR}H<lJ7OoPK }j?o net/tinyos/tools/MsgReader.classUsU6ۭ@ 4*Ԣ*T% ݐݔVDFoq|%0V;;svS13{=|{?؃TtWS* 8،NjYϩP χyx> YGp!ƾ1츂**^K*FpQ/^aī ^SɲF(ȱق(0:s +( 4Y' lKy=)KQC^6>x1n]H {e.:)wR@ɒg:+v= 4NzL9.z|pYӆ+$^#Ϻ%w,d-.>R'[1` (WC,z *qQ&m`,eY^%hH[ ..L1iY}4s,KuJ9'Nub4{"Tby |#  ƕ3|.];mnjq~ {T=)˼/pY`|> akr1qnN؜h+| ; 㪆GjmGϜ}t=is-: Q<*4,KFYqg濠]t,yehrh̑9!0Ybi~Wf){+':O; >aDd'_bs\]+, } hpHS^]5pK&ZS yI= H% naCb #]78¿)m LJ/ <ӜFM4@BKTuk DWѢV 4ĚH:d}M]f) `=y! :?հ:ZWEL'HBؔ5lN7Ś@GZ)5<#trT,DD^Wњ D]}UPȷϠsk ;PvulU\-vUo!qÏn PK }j?8s@N#net/tinyos/tools/PrintfClient.classTs o~dm*:&mhQ-TXPٍ)w?WƍkҎwfnhKgFfy}zT@CuO*H+8ӌCbpGBc 8!>uR)!wZ8+cv};ǰ%p?K2O M%F;ԗ7I=א7V](ن0lF2rWLMdS UlVKkybS<.ᢊK(°qEE A"}!-k;S%׶;=Z)*%LUq7TiᦌqvK!A =eL0l[0кh^vp| úEO IRYfov}C"اV h>w'SSB68ǰATI%J+>!-8n ³`!tag~Դ|fZjVd !OV믳taypB3Ϙ~?)t.ҴG)jY~Cd18 -wc0 .%kՙi`?J6M8/91fn6#ӛ)Q}wh=jۓs`ɮw$"d 7?zH,'BE{%MG+HiR ޘ-hb5ğI/"y]F Y(m-5!$NJ*@),{IIF{VհyI' fvmh  ƺahRs'ֽ|PK }j?zHd4 net/tinyos/tools/PrintfMsg.class}UWWM&!D A"j5hD M6@h&a4Lhf`C[׺qnx쾋 =?oe8w?^NG1|v2ebY&$|^t`+*Ap̓^f#12gĒ~SBы Dɋ|A L*z&L2M\H.fSnn)Ŋ*҅BNiMt *2n1q CLd8Cx=D50 VN˸UJy8`jDƻxOkhU=Xq_S?I{FZuO9uubNJ=g$W+&eDF2&1vw{/``GXT J1Q.TX6r2f~K/)FKAUaw$;\=~\4_!T*q'iƦaС,ϬYդiTVVTfvlQ(um%6rEu6{"N kٔn%y{bn&S;&Y?hNvs6חr´k!ʌⲦO'h8DQz\86E u=:'HstQ_hBԗ`.Zh6!ǙrKfguQZY[34`}hoƽqb ǮiaRzƪITљG;pE"ۏ7nǔ~NxpgbwE\J?qGeU+|jsl0m'螬pgt}_k=AtpO*ָ#7ƹ;s_:"K[/%IgBVb,C!9qqb Bgk1˺rݸ}>с՚ւVq%y\nHecqۏj֔cm6nI;ՙՙpb*MEł'&m*B>qj>'5i8Gm/Dd%eʙ$Y jKZS?G7Yob`>&[PK }j?-F ,net/tinyos/tools/Send.classRn@='14MB-80-))*)HAEOn&eo}^>@P>_qD!wvfΞ/>,≊3Rtq!Qq S# &hU1k*qc؊e[̠mS!HMfw{khvӨIϲ>? WZk8q]Cy"nr`6Ǣ%p&dcT6pװGI s5b!m iH>t|C:N7jn0ymdȄY'mc5Q/iNUGo1%#EuT aׅ )<*h_XK=p\A=#CJTl)]AG[XUo0 1]{{~>dzH)bQ,'qw=Ud&ێ-J a [zP+l^Wˣ iIC9BUCe; zuczgM5Dvv ӐYI1А} ai j[x٭}a S#5ⱆ'x0pa 9t̎Zʍx *໼M4x}~EEgjvpvrmޢCFk%BAjŔp_( E`}5jD!:8yqҌtv6 ?hhPHbqQyOI&GgDn<9.Y< +P\>21I/('.VN^8H#tp7<1ʀe}ߡ;MvA- _\j ~79cp\HP!9lWDrcQLUPK }j?s|{ net/tinyos/util/DiagMsg.classX xTof2y$Ð@dY0Cd% `@䑌g&ԢVbW[HcULi]ڽUYޛK@sY={ן< `hv d61.2>'ɧ >l|w /9 _fl|_5o8o9h귙)y γ~,{yGbk aowL^d{&/1y+LLLU&e򚌿1ߙ305ب!߄F"C6Bv#2y鲄Ĭ͙`Qp(!1I,(5)ْpIb@v q5*jʿ_@ !5t: j?F!Lgonh{Gwf '0)&pRpH! 1[6nnY90 ESgӎ.߶C cGaÎ F?JDGxia5^FbUmpWd(ګRY\ c{M T?w@X(ơ](MEl%gkCph-)IFʤ2M`KiQIkRzL3WKW`씤}SC7K:Yc«Y f:;zXGI 7LqťɦHe h?@\zGp:P ȝjأdz7UVګAee%%OINڻ[@W{ՁL|@$]tH_/!դ/=jSWA7U!0e;iXda֬41;TA}4৺5ǣ 4J_`cok jc1%\^W#*E|wHPp+HK \ q(fI$J٢Lx(WkKXvͲ.%@JLu4y*b!CΛ!ڗiy(E,ET^ETtLNO" b+U!ȫ( )`XpPK"2E,w8  arLcr1&G<$dq&#L »Ñk¼ 8b;h%[,e $.HbqZX6P >%uu xH̬U <,uX/XBXēhP6eJ+8(=a5k(Xop:j?E ,O9?`_ew4!ÈA¥UçG=FO7w4kMu_oJ>7۴o6:>m]0$]&VmC{Mg HA}w;{+sY##+Id)|CƝ0b O{OލYǐ3=%ޓVf%{^ MGڼcpf'᲏a8{*GQб8sS|gcgNy üqP|(J\WoeQD19K fRj6V1u|87e^<D+#('O܏\V=Y(q?OQvQTH{yIsdP{G6"$$TQLUTmDzbiX gkVǍy6QCm'~jajCԮv3[FNjQ{8ʹ \O]uCԭL L SWNV%C:0M5 SW@ u TQ6u(Nnt}j+N;uE^r]&RW9/Hc&="&qMtˍֻw槊c\zss^{4A=٩1c Lu٘w.%>P_䔇6;P.$Nj8pJSb|]h4dj'kڦj4M!k|CN=^#y"}/E77ENyocqMMaMSuYf]Td֕Lfg9t4Ն9ŇgdtEMC{B<ݗhmqHHی8F 4צI8B^R_yH?˒ؼ xJk=^`^A/quDvg1瞺}N %VCDb<},xccOfIR2OlJ-jm֤ma3T*i3%O^j"f=< + GzL}J$rm,?0=-_ RQk`^8j nM&un:ZRn*υD_wM&x*l"U^ iU-ll*^/.~Gޟ+?R<ak1PK |j?~kwnet/tinyos/util/Messenger.class;o>CvvVv6FTFQ IJDļt̼tk0Fɼ̼bҒ}_Լ"F L bPK }j?e&XYF*net/tinyos/util/PrintStreamMessenger.classN@iZUo(r]4%nb4!!qYqҔ)i+&>e[X89~s/oQ7`#-4l!Neh8P!PF1e3u'*"jQpMs?I8̣1'H}SB}mG: o(6ծ'2;ay}L$vj3M&LTaTӝdr&,)-//(u"/K 3*`캓! ,C"K]̢5.{^ )")HrN;a#39ś Rr^hs }^OPK }j?夯&net/tinyos/util/TOSLibraryLoader.classWtgkMӭ1cf( uڍv(dpwi&G[{*(;n굣XTtSu_ zw]EW>9zq-qx@{U8Ώ08"`J`Z`FE, Tт l)2p9HRy @og|Pa <"aG>Q3|LqO|RSgS KWT< }gzV<x<'=sS c{$IHss&5r6u4NL <˙r#ڎck51AԡeLO# [DWgmMzW%kW5?LhLeV3lmU ggkX„XѶGw=JX&~rO"}̔53dlSo3,Khi-嘺;R 5ڶ;`HhX{b=2%=1kF'HH.7ozFXPSquˏwP;\/8Ir ~W jH>AD$avJ"Rx#Bn9)FVw}}ϟ(8) Nkzm893<~XNUm[ءָij"z8-M;Ι>'^x|{j _*dP㱢Q"75}eA>Q9rH4/r>h\T=+>G3݅ѴuW{Q3-"g/ZUE.˯ȗ|Ef= F ]u❖wZCEPK }j?^ 2&net/tinyos/util/ZigbitProgrammer.class}W xT/f{ LHE6@Z (PG%y:7̼aVͶjV[:]l+CV[\kWv.vs$hoy{9?]+pX DNKxw{ S~`(>qs3woQr:n.LJUƝ}*4GT|4h|,Ny'{)#njcVh${~}>_=ɽ򴟋OA 4_ ^RX}Q,EY(/07qa GX\wQh"7qx_—G/p\𔆧5|EW5|M5|C75|K3ow4|W4|_4<*~ī͏2?`/_@];#НuV }Pkg&i\!0-$ۭڕM~ޱ葱~Sn;B.PxiG@'kskkݢ-ѵ;zق ɭd}R }9fȻS:ܸz_+88*C%|L@T ? xQ`gWwbwңh+S7/jg͕?-&`j9kũw݌\pbW̦[#h-/Wpx! !!6DDЄN/b|)+ji1DeǨ1Vo$ji"Fu^JZ6&>YON{VY Yjig@Z1B`."FVn@b!f࿆Hz"fb1L.byZ9{)p]S"!Os 1WS4_J).G;V'(Z 4)qlRF.@-dQ[JZz݁1 !Bd%e8P-:ϲv :yǒ ˦/z^&Df2k9N+1̧b3V㐝M۾ߵH`޼v;j l>ր+&Q@lg[h[:AσjRAIe2@c xˤ*j4^QЀ#_7' ByfO ~YC`[ bR3AŸO.(iyL;*,6̧ \~ZIRғd Emzu$paӝ "[ 0Xr .mzT2;PoFnUd uV[ͷC}lʈmץ~%ԴGIGJ'2#!n$*B)n\*eLB2\v*Lt}%Om16,~4@E itKélSHW?(2jNKƊϹ$48As*+˘$M}|tsT"3T<.uaɽa$RQY,JqVfhhX41)>dpba$-YҤz0 !)$k0t-`*ɞX ŮMyT8f&SX>Rc%SZlS2ĒԪbsa}Ls]ˮyveNv(]KecDMa?GP|~OJړ OIE z%m MO/P[$mfi2 6-1R46-.cyz^^S_&:nRkX^kYJT)a42kC$My-PiR{K'߭҉}J'vP;w=MS%l6a0]?gXF?1qGWI$ZԤ^ } SY,36F2>;D>5!ma!^DI`)1c#8 l>Lk&K'^^yr9J`hfC l8U h#4QoAY}O5'"e~be g i2Uby{FE~njďF_j아2b8orNp:.QtE:g,S`2tI>$طOb os DօODocc<tsIgMrKn$PK j?H |&net/tinyos/util/linux_amd64_getenv.libYolW{w>Ĺib QS!7I#;7Q"mwkqv]jalNI-bUEU!0J0,JRC+"Ǽݙw8@Ĝngf޾דĈyƥŐ%w#lv3ƞ4u?, 8q;BV8⑀Gnڭ*â4/vX|v( 7oXM̪0ڄ>OeLۿ޷_[Dr+/ x 1OCs>x+?㐟zGȧe*K/MKؙ~˨(GM?a⛘,6 yE]Qgt Ԅ_lU)'ƕsHkDV-;J^=,Cdd~\ɌhgP*^*1EK NJ%+;ihBwA'9~|^q2veQ^z-_q2xU" tj9?Fe-"q@(*{Cܲ޸X[d^,'~E=PY6]#$Ay}9y%E.wokսbD H.xƟUw$-{.}snt}޾Sy3٩5yXgWf4ʿN..kr$C=ecE.O,uR~U=NSa}LM.ߋ@fYtZ]fXa('ˌ7 Xoٮo(yCm >R`!l/_W1i"*lz߀ s쇸esa[Ahe|r6S? _@ÏV ϣle*7|yn36ƞX?ȟ@rKrZg(?N3_A>W1(;-?ENc/|l_ߩc`=78duÒtM3j i_F1؏E:bjFEgnYoU7CF&uƟ6ij.}@OiOTQŰ  :;tɊfwy?&ID#me`8ikǰF=ďe֚LnI{ZOз>ݜ}"I∟]>! ZIuxUXm:Ɖi!`Oⴏe9 u`?#Ae3BEݢytC\xpjE5~.oPA!>l髶]xm$L]`Bæ~>ix\Op`_⹆/ &Sc~~(ys0~Gxlq%$EI?}N?>p_z(.D! H0fЩXVӵtϰ136rI yꟄcz^Hόޫy#$@ĨQA1$SDM! &&O0/BDDTTP " OeBP쿪z33}ߤj{fvHNbeI| Xf_,)HuC x|Ap%ܷ"uӏ|&[6.;R)wڏlupǍ0äۀ/?>;s^^: G_8z>`3hG1pLkpL G4hl G?8BLq;G:w @8 GO8D8 {#]2 Yp y#vDۦM;Ind8 {'q8n+‘t8nuЛ,2  Gg: 4eF`At>t+|5a^9 p &C]éC|68npXFO1D; ?~x}3`/%hp]ѹn~{N?y4`g*~xԃ+|k.~7߰1k6lZ޹_?~+:mOO|vk[I|D->!6ow_\nM U6^Y/)N鵳H>SrW6J.Nhrω>Vw{:ɒs]ܲ_^2k?vLM}W۞hgC"<<Юχ]||63{n m N0+ҼazY1+tb_Ys %e`;oۗ!ގT߆v"?H$?!ӧz8n!EOS{wܥlU*lnywlIKZ ąp!LUFT۾6/_ >}m8> ɿ;qz<-x ]!t^ϏHNz;*xӷw`  dZy鳉ޕ蟑^Z_/b<.%=r8ߖE`E&Q oMn h"-I˙M㫰IbPu%i]O^O}jodDK F=ۑIUpkSy pu+EF>흼.R~ |m`"fw9*U>khIq ?/%}r L$N渘$CM4Ŵc3vꗩ?K6۔m/rlr%[5ӎ<6lmc(g/.v#̙BGQqrϲMlzߑ26>ݞPTdP4ĝXPv)ɮ鶴̴ܴ^@u]YG8]ZN,ӯTRAIf\6,(eڋRicSnLl$VhY0()]ȸ ۳v;x+V8^O\_cҳrEm;W`ט&bcr\P?J ~]kKi._)yp6}@R\FM@@15&65uo|q2XH12Vq8`Ӽ|cz]z+RC_mpc4MZaz%c nY'Sq//mj#zAσ- 3Pmz17+Xxxcq П&F.X5_\ CHra<4F HÔ!E,6j(ate_\itwa^Jvlsٝ┬t;KNLɰe2bmɣٱ^ sPzA q1t#2"G!%E)dM lG`rcrmnkLl> 6vNw;<[l1TXOk"_3;yURD,+ˑw24F,?#%&glYvwV\OeMY<̙5DFWcٲyen ,w^U`Qd/LI8%L,pId/]lf #oCϐo>dnKS$՝[T01XY3,r5B-ƃClxa̴%wvIY9pY\pd~*6\dMeN@[X=T|D`MLǙh/ >Ƙ3FSG&Ni:KFzy2F7' t+K/ B*@_Hjo$:iQ@#j/vygD?j 5\ } 2Ǯ \R#gVFPSV }SC 5 }N}i~\Cki;tPyѤеRеϿkUC>yNCoKkk4 ]|]}ΫRCC5z+ =FCjzoе4X =BCk'WCLC/;h35tw5\ ^wjWhK5t5H }}r}>JC>+GCkj5t34\ ]лjj4s, ]ZWKQCo5tz =RCлjziғ!j{$oP.vlH{?x8CY>!az?ç"ᙈc^qc^шc詮d01Tfx"nu!#z2PTPSSchdx1T39J%Rzp~A5k?O ކ#ޖG`g۱3/cgggF;3-/ggkwdgwbg";3qį`g+"%kyφGg9eck  JN֊A]= jBU!Ve=P@j8V[s®LBA 2@#}:зp!ų}o{I1V ~9cn8;N7)p7Z=Bm.*9cHzNy+bK(ABZճ k Gj{cF/?1aʄ1^MY#kE0VQU^ugtFqm}_R*Qs"K縷򜅇%aJgB1'/JMdG g֮Pk3r)yv“PF.<.%ᅚ_߅Y*RˡD]HIrg DUkń(pԊp :wmk2"s(aB4-^W.>{I8X8_^]Hi :ku/s lС͢pc2*Rg~`+ju\s\Q~d4R6kBESǼ]wt7m̮9 x[il,O i.i޴_vf}ڮmE8- ih16 YGV<Hè1VEmAeFS<[=ZtoIڂ ^/SQֹߩi7&if5uqE7œ̈,65> Èb2Qe͕)"T\fhnD;l KOgs69Mv轚\BhD$/¾jDn_zou۷'mƾQʚ+Ⱦ`^u`]i݋ j߫ | {.p~;Ac o+,o [x_n!RSܺr,ֈ,g+y>ͩ4YG64?6Otmd];Flsޟ?VcآZ:CKT{.߾whrϾY̾e_u+z=ak֍D ^#MI"xDk? vaxc*pۄulB^g]_^P]^w[ƺ'yw֙axR+{1FYX׽,.Rf| a-m>Zm a" ܨ{]k?oaTa5ݾ0g4qTqKjTa١Ǜ`٪@[ϲk#7ݲA4̈:W>,<쩪U<|,3zQXOoMVU~z-RۭYjnٕ!aAX<GRc-~2v_os*H&9AܱaNV{bgKHuiގwCU?>ΏPodDŰZ+P|:8#%w;­{ÿm3yޯiVqGDghx[绣z#NlFᾙ䅮G- C ]},BXpc[ӠNJ>nYǀ'U͆[^=9 x<@Xn<Ţ4V?,hWjŵNRw}2Z5( *Ҡ6XSpwwdFk/󧰲% IX7cɨĄ?Z-SWewR{O:E60-uٷ^P߿x&cm}UB!c&c'graQ7On dei,oQSjKH B|&t.S7d2lr7`lRX llh8ƋrS-BX8j!kʨ8T,Zʨ5Hf3 .16'C=~=/Y)wi?~YS1xK«[sAw5M-0ՇJIՕݘek0d%(ך3^5Ts>䪫MLU݃)LdD壮#r+ēzaew3k1կbأ#YYw5T9^T̆ԯ}l OQHׄ#e z辚غɅNJ QPˁӭ֧+PP :*F?_q$e JH9't5!! DYDU`1`5Dzy&H><C:R /" Fn~ǷĦ΄oeb$Oug?%͟)[痱`Sco c&Zw*H<υԤ6sXDY Qd:|ǫZ~[E5ai]Ge+NFr-A Qr{"$wDBQ!^wKr'Yv%EEhk;huԗk Ji | aX,Ωkx;o_|Za"P, ,S@b16"fOrX #,[I`O'e,ZDڟnX۠(uF8-aRMRiYj1CF2[/~ƹ Pl:a%U/FtG(1T;!oI ;c ;pUWT~KwkDOlI4LM\I_RXXNQv׮o`t\7i;/nD׈.;~DnaQW&o l{ #Oݾ@/҃l](doBնʔN> [uK.>έsm=r.֬|G?VZxMf#r>&p Ucͩ:U\ Pc+pu<wC`#0Oa |QgglkڮJYJ|( RN<ħ˿`?xv`?y:'V_Qwmfa.+T[\t4f]Nb'XVws~Wd/Ix˷ʰ2,0/=Vkq9݄-9 Ϯ +kN\a8W_Τin#a 9fvLAaeaV^.0͠8w~@ʜ!oVh7<~Ū6Xv>ZVV{] ǙUw;')TCA&rA"kj~{6 o5ML6ɐ*ή?[1TWGIk%7/o0L\,\ g_LkYՄqA@kPx?ZUeǘHL'!6BP!(I DZU37o\eF~b,Ϧ˙>LwfB w+n -%5 K5{"Ip^k* \tf|4;jV4{/^x M%մy$B| ĥ+vFT![EuDv[7s?1N1},n# 0»> 4"'O%{իCC@TH& =Z2Jl6lIM".I$7b:sIFQjn|crP`SbCájTѰz~k~xp>}q4_yfz)=W>|mtP~ ο>JǗYsD!JxMNs}8++$?I~ڣG*2Ubۨ[bXpNu^5y=1pOCQ4Jfg`z;̣k8)};}klfm|rb $rm7mƅV `->f=(5ES 4{Ziܣ ui,uKv6?q#41aٻ ?v?ߧjgGjg.?ws#;ܥ:˟jiX$Gﲋ׾k'_>DkS}џDs*ipw'z mɅVVM?wfaewJN(=g+-+q=rN+Aʫʮd+Y + ~5Â`}PqGa3Oe ae?1ZHX9&3UXYOĜEzgaepވk ̊ +1zzaC-=V~P 4W#AWࠊnx6v} EըF\U[96r:G<õ \qUےqTpq?w#.W3d;vv#<%_IvV"LνJbXI ݮ[I #;^/E–weĭ; Xyɧw`wJC n=IxMТy'G`ţx5oG~(NjVM<*6@'5{G( y캗i0m] jPm!i!$>\7qo0 *`D?^w[0hǓxMLG;|;Ut <0}&0 v:bU:65\=8|>3k][7~g*lm04/j*ՙ ?C1 Wn?UlcXݕȒ{VM̬'n1zLW ޕOu|ERc-nVu>@O\($MOLjۀ:꠭uuInMjTo}Ot[nڪzuq9֧l6zxqTGqrX7ajLj [}>*>O ,hnjLt|vb95بߵIt<ړOkxwG^Ys߾I+3ƞ=fC:Qg6{kOՀ} 5fmg\]WI~745oׯuԑ^ߨ^߿AnԔ^j#7p9g7yhD#gx 8ދM7j;飯~^}ºz[4=ᆬ:[4=uKzuў,nhJ זu;g]#{>-VcaZh~өU}V@k/~;m۟6q:q]]>|oبn]2un5}A8vZ~}"S=?y+@_S[CkHz kGrӫS~> ks# zJ˻WMRɷC# "U.j4S}]ѝŬ;}Y7bQw~ƹ  ]%w1x/GE+9'qyloXY2{($Q]ڙLok6,Ly=f_Dⷌ`Hg>D7$_K2ow-M}pf+ec1n2*7!xuV dZ->X{V2kn?$tWbFX0OGs'Ǻ+> qv~SS8.]*#HR75>71v#W3*#OtMn"2r[p]l2j5`sT%wX7B Wj u"|d{d`vGUYAo}J|n_ʍ=ܫyX}%њ~vt#l]u6U=l>Bq 2>r|5wֵ+|iN/ A!ZN_]8lzIi9b-I]r/0qZ =Ջ_yKd 5c#X SzVի}Ɇye-)j+bq*7s5{2:v.:v!zTcX^6gzpOɃGMGOQt'˼/kfyfzh٩Ia}8~DXo /UvZ˺Q}_xX7c?nƎem^+xoohoW[&|#$@EUoTKx)oߗBN-ӄA<_s%w^zMxI픬@^o)Eջ̰8N/8zje"`=hvC~촌<-Qo^󉨾&;|k𳻻jlB׆,Um ڨ_1:_҅P- $#陌`u \٥^xPbĀ-~Iѕͮ"'Ш#Y\kf13&Rn_-OSG ŗV &wVYZD-i)u P6/ \D$sPwk.e2-"3ߪ_?i⋖ (R BCCAȣiG,XrHY(vTӖ/te?da_ת tw"ϱ!2!*?;tR?CÙ G{F PF 3<8۸kxp"p JdH{oIDym jQXFqjcxrq%D=KE*ڭǓڗ"k7S{[K (`yeGlUjMY <-we/~fPkh[VhYn _vTڿ_~Ϋ{6RW_\S24I9aԌ%p| [c6!G _~kOKV78d>w?DSNFU- h15CIC5\ABv.fB^j?gC{%owa] aGiNOuWYq!ظB/xNF>k,Jyv#7kbެ_Gzq|V?ͷ6j3f"cmymeT^vlvY^l=xmalh1<1}Y?^?^'svKgkI|.v+mGEâ!ߪȍzAze^;ڽTEE{d/ž1y =o.{1k\|T0q|\}}[ 8<6 +l&bXx,FHKU E?9,lC9]fYQVg؎FR`C(锞w: 34h00WʾQl/hՋ(|WI^^.v/:Gk'ڧ{]Sz$~BnuIHΑUS M+& O_bp,vݎDci/ɶ lWI~L{v$R"8b@J,( /vp%Zdr(8eKyYl..iGVqq`=drF=_A5bĈ4ٯrFGpJfd.9 zsngVc\\3\!*H-gG$OF,C1Hx>zd;pg/)άǤ'&ŕɚXP.P./1ŞP4$FHiNQd($2vy˧^7?ppQp!@7U!A`~{ ~P&3n0?/x7Bal ~ T>> ;,]6\( s<`!/\g!: 8U7 l;r% `e3Wz2߀ -g`}7$8ष2.|k P nz>=/v1\h k^ǎ@;9 @?8) \Uſ>M?.͠fέj Q;-u$ ~]HS!2mN'~KӌIgp|YEjՁRC<@8AO17isՌ%ZŔZ2S曰'o;2M̥g;&)eO_ۇ#7_cuI\P(z\O:^Κ^j׳;vЎ w%}AB# ?Pn v@9T(y>-Xذ>]iQ("W V|e!Ki hk/ ԓrxǟm=1_l=@S~Ȇ<װgIށ?-i8oy*"jIr`̹zʀ @=+܋/\^hO#.|U/6\r{A ~A.i{lsR*Y3Vs7C2m#ywRȇ7fkcNr-|Ѕ1q&?mWJ go~Dy:97ޮX.j3 |z[#)ޅxz/ü]w98z? ׽ե7| ox_ї^qQBZcqS\GM(,kڋn`>FB=Kr/?^s- g{B{h 5Fv˖eɂ IR|H#lyCV^;rhIy2VEJ E٣X7+[,|Ԣ,nH$} Bȃ,(O˖srZ5))S L"P$HZol5K["ȧb&Nd:-lyS<&KIzd!TXRGS2;PUoO2lyԬh0+ﱠ!=pAr\o>YYjzA(_J/Hk7K,]ŧ| <.+d"CJ8\!.P>tF@[mj"=z״*Dߊ_׊,1R"RDo?HZ% Qo:.Kl?{{,'Iseˏ _01IMHz$̡ңn h~f^ BA烤H*8DdHK!ҡz>DzD3,4,X%fp.EF,U.$}yҁmK7t2OZIx+_٤\~$$.|n!1oBV=8B0-GDE~\Bp-?& _^ ؊n4v!M# N""x?G.!//lK&(o[}?БcEuLf]±bK֫J>|DƓ]FOc1~2y$~\Ǎ#B#ęg̺).fN]pgu^U\#No c-$0_dBzd\tl_pPy6צ 'Fn- RB:\-Oyi<  2ɊKّD3 )a2cGD (ҍh(OҗPdmRt|=\q6Uk/Εg"~e"6VȳcA:+sKN3 p Kю\[N=a.@hVװMM1,("t;y5Oz8\HsdLً)b:]9KEsx.sccD$`%%"{;_YV--4 E0סף]~4Fg_=lc`0"=0o ՗7_5W覹}7ֿ^Fu5ĿfWj(iy X,vv0ԟKw9nCźr W_8YGd⟼.pyH1U@7O94Ѝ/O e?(X:7rءÆڏӛ!IJO@ءR?c?48@X Rofp ٗ<o==7/!VOoG7-}ꛧVGO+zzo[=/m}[Oe=]} EGwH♞яw~E.uЯ{~˜C:_dWoF_iTdC9|=Ű,a$5.РSq_EFvMLK]?P}:DcX|Dw$9~Fv64ϣtAJ">G1iqc qe8zu+W .0zO 4] 9r+(j'M%xA}~f>G/ѯ")EOA|TKF;33DA}9g}q&ǣ]%N_sp3ǝDoc%p &}ѷОYۻ};:r^'>[vhó{g,IL2E"9'Q*$? S\/?``^>\9yDDžB- 5ћ.D_=Bx}8s ɽ t?Iۨ4_Ly3^+\M:jn7!3IOQ bXJN!9\/GOC8.Dsۊ䇫 rD|Cr*7?.จK-8=i[}Z]|i8_7k^cy(K_P/$[WEӒҊDgY+>bݶO7=7|7o!5(,@sO6$Dk(ANr>9lw!?Up|/\/b*?q 9.생hG}{Jb%~C.$? ydR| 0"هae⼶,_]#nt*V23:P MjlbHjfnOS\yi7nKKMKLe tJIǘ[T0WSwqpA8m8q%JHo-KP 2{8l؛n-zݕm x }m6gYjrl1REhm̙BGQq ĸg٦L7jȐ [FBbj1.#v[.ԟlIwL27wjkJ^nUP̿まAЕlڎ#Ӌ d0T~|ԔczFYU DETPU:_9gh|kLiyiiiH>.KJwfڋl"]n)%1X[}l}mh >IIο*DogA;OO *VQIlmjq.To^SXo)B4rJ.G_*hJA;zhvz--mj6kD@14wZlm*Tc +zհ19;'}qzi9amSnG<{qÇn,=qzjPUcߨKοqpKYΙg3=L dڋR *fc[Yl,K 3g(:HF 蓽>v:7صa8 )1C]i˚iݎNw8cB}벀!Am~NtN!)^=EɜIv=87*QN|'Lj[bw@ ''UzWiyn>ފ{A)<(QC̀h NG<0Ye<^P\p\Ґ9,S.)@^6 4)X[uQ I$&|0qIY${r,Tp0.]6Y]lŴp A >w&G0g3ci”U`1k$$b{iq|#P;ݠYlYl_ k#6p44h |_g]5bL8P;) Ezj0ͽ$=]PHZ ٩oѴ7íqt2NBݘsYc7]܎Y,dƭ}w5y>Zc 54t8x]:\[eId FmB,[}A}?iWRy~먀 2YAEگlk#u C5uf;fJw?+{`=~\S+;4=5Ƹf8F;K@ SUnFN;##W۸%#|F5-ІrQ6#X< kw K(&gFwI14VPK j?f 8u$net/tinyos/util/linux_x86_getenv.libXol[W?{I[uB,ꀇ< /im#iTkj]Qb:jC%P|` ФTH|@JtU-"͜s} :>{})59!IX$zB͟hSvV)Hm݇,.N~BjGנ)쪳˷N>D]wSKR\#ᠫ߯n]}ԟ~gbZ~=q/z3]H1!c"?Gn^"q# az;%7[0MEE7tidؔYPojWNh9djűZ*i%8ΫR62=1y=Ky-**MJVY84y_'b|l9?O|?zmQmkG OmNx8GiSKoMUH kF+Fqq >_kN۸qa`urfrd"٫*h M (W+[dwV`R Q{kwTVK9*UT8I /3W|8]+Ա\:4X罫e>ڻvaN~.Λl|/T ?Ʃ9`PMEla R&9>HEАG\̽#7koqcjnF&OO՞`G+1,/ߪlU6接?7nW'*P,ϭy| E_5{NSo{Fa7 uq厈u%WǫxUxE݁nô|"F }̧|#}(Z:viߩ8J9 }/>ilvhO?0<ԟ)3ES>JG9>::1U:Ͻż.$vBT?z$ތTǨMzo61v@#[ ..>lo. ~l'E +?i7 :듸}DSXCc{gV;)}q\Z54rUeyF-̀]4ƹY-Z&A'/MY Bf:1 *LQg *.kaYIv*jirNQJ).j *> N"hD=H.GvQ'h'._kf;QˮOAg\ إiy2\!JzA˳.CD{!.#\^$V6gyn@Hw蛃; .D1>zG㈈w$wJϋ{م!.!e.ć}Up'ȿ}.KA{x GyV{msaqXo­d nq]<X*BOhܥp>謹n(;v/}ăGqL>~B_gEp@m[,[c||˶j#x͖CVA0g`Ζ;vwunY?.-`p⺉_*8DMRKٷQ+.G1]FPK j?jbL%net/tinyos/util/linux_x86_toscomm.libݽ \E>ϳ BJofiMMK a^H. .Ԃ,/YyAE%᭴ȴvÊ̌׬33rq3sf̙93egGH G hG,=D$v*VB"|ix>\5X&,`BsڜH!NdA|O*Pa4Oχ0ÇG8 B`C!!<! Y=0B^cz<M:e}x:$YQG@xTqWCi#oq8e2N$&AxB4H/Op, + 3v!M ]?.3x,9&sz$a¿-FUvyTF!B'|ILYZΒ]4S@ha6!$KBtNu Y]~oq '7AA\|0jKH zu3* 7[[+Bay@H3I닕!{ψ8A~=˄Cq0+SC=Kc 8gp&l~Q8^m SOvYYh 5ifbÏ=Mo۷G}~4dgjsy~þ"YnΥGf6lٶEs)mxxg ~٦ йki?fێ^O$m;~ݔ-ſǶe3[os.Je~{O 5U#Vn%9]nD}ػ^8KUo۰Jw/w~cy텇-ӗbr\g?}__ǎWX{OI3׮jӃ|y3?~螃WMV%ϝ}y߾,F;6~ӧy&N=?xcy9C}g9;-O738D0?t;"r'ňRۑvd+y|5ȳ:w^`/qZ qHfxxc o Ib&!frpyzM62 xNkol (1D1h'Wٴ31| >Š\r5G hdLvm~A(㧤ߞtZBvQMzwؽagjvBﯪxCjЯ B ax2~ mMK܌Q.=SּGa-d@Ƽ@ze_CO0+Xo BE/Ͼf.S + y\̇fS -翓>Kd(RuѧEd%dŒ S4XMlp&%sSasVo6ŧ:1%>II֨?_8@CWG`bDmNΐ&Krb4]vxpK Z#>F3sӱ46JGά1 a) mҸC4cf}.QfiM\vJ ˥y:y\j%eST]֣Zq2NIq$,&UkNVy-Dok4ӧ3tY:N-/NLjnֲ&bQ?u TR@1c^lZ.r؆p@27W] <l:qiQsfqj ;;1˜K!¢҂#CTsV KTHDkq"HxJeLm6D̩:l%鐯7tiȮͩ&Ѳ֠^h-/h6 {qZu%i-i2 w[:iǵIJlq-/2AzQHL 3F$=e15m' >F vS'|*\Pj01ΐ jZh`^< ja{]uE]];ﱰME15x1Oit#.II,>zS3fXsl&Y9-{"MHf2RS5&JeqaȾda@Br,Ȯp7H)][w+ʂ_IH ϒE4UEVVJ?o >m&9>i0 ЃH|{ BWdz}Enӷ;r:d;/ogy|x,cq0yܙy܋ǃ,x,JH,B`/B0~\Q;82!`1P@=B=|> ۛ4B21 XAH.3# 1 &cAs1nKH 0 0&d1Ơ%'d)ơ,d0k0@H) ـq8!12o"NT`|3&Ʒr΄Ta܅SFpwvBwqǸ;!`1:`{0 c= {0|` z13рy%$v!zQ?홻3.Y;0)L||G8]ˤK\N}Y \ݙ4>4ƪ2C0JA聓P !OIeSʜCOiYBOil:s1?I̥FQ2WSz,4Lf9?Q}Ƨ2SE&.@mx̐ \5fފ(!1l+vS7Z. 8zTIq0ڦ$:%I|$$Qrλ$ KG@Ÿ'usW].@jdSH[T`bbl /`ȷV?Fz1h+ְqtLm7K\7tShUcG9rnʕiksy- "\GѪ/Q$οD}% u$+_f/3~lTp@% JO(ÿD_QMQ'!I&.4UGdCIUhB[䋦&Xg;Vvmsڂ%- zgxu,0R27 =n!9l+.1aJl3(A:qf>uvCZ1!b=v:jmN:J0vDR3]ԵzbDZzeWV`+`ilB;iͯ%^l}##J{q8} < ;^~K园XvZѹū0ã]Ȧ|-M1Tn{+{ٿ~Eo-+2n֯]fS6_p7pό"է;^B|Vn~VYb%5X? 4K3Cc {9 NkW_:kI[v]ٞџU޶Q}Ou::ܦfWw*SC"/Ëi^`T  Tq+V9d33JC@TbWr5RQlo7݇v7^y[5oP@[%Z U~:[wR=p hIm]Ӡ_qµyAB] 3&f>)cRǘPbD5WCfL#%bDnG]FnDʙ)6"i?f$YY`\15PT_4([X(x ;n[Rl8f{֊'Hp~s{?IYpc߆}x~*TbtY](bEtLavWnl~cNP|?Lxffz~ű_ 'W;ga1;qىCͱr #8GoY<Z8 CIU5g`&Qp6Rbf?=?YGK;+uج=՛uZ1뾓_dֹ*(; Kgn?pl=w'qԞ)a.r pF㨕~Y/_st+K\q&KEmﮟT`c @s3r#(^8Yq_rZ~s8.JϫnDJ)6,-Bʷ[)gJ؋#:#4\ PS6 u D%n`VZ ˆ9 s[`Z u۴u5\ B 7Q^lzc*K_40Q1[ :,3*Bz che,M.,;RI/|Sp) O3=A\+mNQFgesxOI:V7N")'P`-I0$vHiyN|wTljX# xZjg|SiVoھ:qer>f zbjq'Ys!vzcZ1qYhSYw|9eN<܃5xTVZb\sqeZV%C/OD|w-I5e,/8a?Qy ';jMsb<Yj|ΑB3k_gߍ؊yk 7\ÊqYcxߎyY5'ZK|阗uaND&["j5k/z^qWsJ! -<,x~L(1";8nZ jV8DB_C `WТnS:|JGwExY %N%%HmXDQ㿘hM̊`Uƃm?UTZ;X^yd<ˈ;h~,|{ZY'JHy^|^G;dN;۱|PNt_~~^g5~̹ 00픂9jscSgLwC7 ؽG7J0,V|vDN2Ayg1i-'VZ?SƎq*eسC?OrLA%b/_goV@pu;,je95"0%:fUy'TQpH`rcMP? D?5Kk~E:ujZģh5>`C{Ȗ{Yqs=ifbxK}hW#lS4tt}WE 8TxBۃ .U8-*[7ګrG:W*s]kp1n=!x1q::z~Lc B܇hr7ý5{݋/ة bxAy544(ym▷^-U8wdJ ຑkB,kϮm5|֜BvahZe[Rs#5COrG׸,UZ# G$8*(jQ>8j2 zhZJJty,Fto~k?{f빨YUhZoŕ]:ї>}6w1m_~'v]2%>X郷7U"޶<36OXw|BW{yN]EEdoà«p+oZ;6uJY -'bVDhaoܮHD)B軛NJ W[12$t@`hw4-(h$8G4=?sV_k]/p!5we - -];I㮃B ?hֺТ*iJ+,ǃhލv7fև=-|v+~=ڊ\g8^c!?l o`[6&c?~O$kݏ>ܲdvfɇ qIyH;p _S3FM͗65}xc'K }9gec*g&H YRVfY)UWN\R/ɲ{K6tݏV y+!vQTm?!T u,mTm?D᜾jԭc-]'v@Wʑ0&=ӿfkTaaT}VFy?ν+()܏ Rw[87-([jf{[zsW_ak[8ʄsMı6Jq?c?`OuPS3/kj؏kxcG4@T5vچ5 ;_bӼ_#|&j9g@SF탆'z(o /W2ՍZx;'z:r%uj>?f;}y{`w_-\[i%d^75mjGuqzP@iK3P26P]<_܏}yvtvlboKREp*|lO>Zg~kmf,`/Yw PηkET?ԄJ!J$mI~=18L63Wt KQfY-QQ=GX7Zş%-`#HIQܾm*Tg(ˎEy[ʙwzmwQ;ؾъo8l[ w7`]] 32wowkӗf^~h@`c"Y9+F|cg+[j2 X2VB*ܛiF  {k%+2^OBjZu2@hRL.Z3p OcϴXvV0=В~Jr9 q}va2˸cɞU/AM7Fnb,#3G.A=Χ?2-gEnEซ7e_^yRWm܍s<ͨ$10įy|ح$%?߳Ko@ʂ||Qp(/$z 8W tZrغE7P+ CHl"~U5wNwX?dYh䒃j(Nv`%lgÅA_"6uW  nȠϐ g S Kzz|zSSH}$ zs J-EQ׆hdZ~c1$.K8?)%U C{2nwd|XF -rkoDH_p`as&L$N%F*GD/&طck;5J`r-]:K[~(Q+6СaH}U|K ](ʝX6btQ+^cc^}_ R3m#u;<ݵ,^K Җ=~h T|ӌ}|;&R]V$(^A(JU|GMPb' /5c}[s_zUֻL𸐾E3AYL {^m ^=>ʟKϛy8|9fYQXbV`1G<l↏@[_k>/߯̚YM U]Yz fFU^n;}: em `] P7VPW׋Qw}=7;6FǷ&X6 K+h@ȎH93KS^)`cck+"&6K]y1WE|p?=h=ɟC(1}5д9vu>'4u_J5ovA߿`ʊapy`ydmO֐GZ;ɖT1W*?uEelHAEI|ذhy!zrĬ2tfې&֬˃h-iQ3X{Eh"0%"^'օu`]Xη.l:ۘcuXR˓aũFϠП*M2N T NL_57>Hp3fҰӟd)0g1K6NWӟҤYzcqzdz5j֙r S ƩM? %"6ui56>"K6=}ty}QYL):9qGxCn0Őf'e|V.C547Ò " 97uTJp!N \4^ Ņ.W Ɵ6;)'@" .x9TA\1A`b! 4K`!Zq/E2w3ܙ.x%A<BgcnN-!>njx!caq,x9Oί oT,2hC/?rڇ*ĸ;] C<]ha}B|ASC| b3O!mKC8$' ߁ 7;Bo ^v ė|V|f ^8GA>_ !NX }84/]΂^rkh⯾v!>= ]LG4vI塟By7Ox6ax" |}]rKR9 Eܚ]Y_jT$Rw5D/ f+_P ?5 ?s5__.bjU`?G =庩!^WߝMԉAr~ӁfW@>L~<vba3C͗? R/FsR{z-lX.Y5TX*ܲ]P\B. Eb QQ-R*^RPlS)TPJ:ԨTT佀ngȩ@H)P/<0PX# PUܼX)Q(વ_) JL턊 obi] VWӽ") mQJ$ R~UWDBuLA*TAZT9ŻJZ\T*PvE'\waRAR? WGJۜr Up-߂N|߁OAU* Ղj*7NIU M͡ (TXAw'pFP}$*`+hSy ի UURpZ^+LІ(!CPh+!E @@kJ"domrb[hvv Wy0ٍK71DŽ< g"Q\$E\(2g9sAX%|,(NcQ\$KD2|'v; JO(ywAX'ϡV"8H^RtSA~=kpQ,=bJJq\:RN7`8/!U{ "' 6z50!]PwM8OI%"9#v; ;Q%&˿ *a^P ]I^UEr\V BON>+a:A|IIErJVŞn `aAPWq.@OT*bOd _)FIKb} R_듿ӍΘz-q/B$\oC>I< _(CJNU!_5 d^9)?/, YH~[P #( 2 n 9Fn[R@O"rA*QӂPuM [nk 9e7&X!cxxUBSPB~kEL9 WBqP)+B(!*_+1eHJ:Z*X J"K:6dۜ/R+(VR)! "75e{J7JLS_-lsJ<HΩTNy'6wNjܑWqE&(% JITO\wz&i@4갠E EB<"0"5iƢSL鱋$A?ȆL~@Woi!!(^PW+ITo? I+j|h$!ElHD߫M8|VA?l3H'CP9l۶& ޶/i%=oVB9Bna} oML&x9~vB@5 5/p7w:2bHGr_ %y _ Cȃ0"+!l A!/wBa !A a6A  \pp'F@!BAX aN@•X?:7r"96GDldLdl)¨J!'E8㸣%7jn^'Hi}R,4Z,}Jj{YBosNG?}RM>f}dbs zG ME&M* Dk17E-AwuDP?J%yCY"45B'둎JıU:xR׌>}%U"n!@[ G еkWQ`#( /xp&ceKd$4=۬M؜L*`Ԛ2Idt؜rt&+'4B>ve&z7@@1Mk֒H]&=Wdz(25U75fPE$޽7, Xm$H%fSLcMfRLP= KdhZC$zCѝ˓,A']2-u zsl-#J`vDp-P"eȇk$\ u4ƵZgRO2:Fh&bL]a+ %=ضGb uĻ&OڍVƗen"1D+c=L͇A/7A!3=|a<6pNaL? ~uEQ/_7g qb}>"^/B_r6{HWf~/ZQ;6NߩtUW |gE0#NIkWVbv18JƇ~N|rÓw߾anMBl$J7Xcc7[U>UGtҗx!>gn&:!w"Y?-mćd =Kt(Y#>;SowЧ!38P`)7O lhd=+?zx=gu@  =x_(Y>o4>GQ؎LI@?/zفN@hCnl<7Cބ8.{y}G9]>|߉3utGwY~r>Ӂ~9~VލPO@ !pz<)2 ia]ܧ0|At>q o9˗1PvI#O󇂉3tGlk{1 lI x]@5E(?ܯ9aσ}>#_ t|O)ịl: z]k:Y}='.=H6~] :2߮t|sHuy hW>GKh; `H{<:!Ҏ`~N½;wRv@yrN lΞt4@GO$Czc.!YSܓ_"緓t-/|. K|Pd*̖th'E.#Ҍ,c6KC4Z4|!'Kg֥Eۗ`MQS%;{Ԁzl~1~ƤkO[j<{,"SsrfqÆh5I1QƏԌiKaFcV½ƫ ȳXHi @IƩ)ee4)aPAqa:c5}G4;VHGhP1kHܣH&c4M.d4@5隼(ƍN$ 6Zq_EQ g.u&5sߕ3Y?$1gZ S"SMccڎqh!3NYl`Ho 2rtᚘ(5߬7L7W-TD!d!/|E{3kY9ixR"}K.0՟8hIT= +}Wy1՜=猯뵟Z\d|˻ }&(nҙ.[QIC`bȵL.:恰rd 0Fid*[,xpfGcr}INoC30uwC?6=R-yFg]=L?db˿o,گ7ZaH0q6E&&yzHAW0wAb9tqiXKXɗ%=gDZ S: ހn OO9Hn;Jγa MnV}z\fb&9|ӀkW>)iYԑ[3w#X_ٟߢi}=s&]lnvyY+9)ͺ-ܾ^ocX1i7D-$' ,>x3SόSM~K*36fzɝjR#yM`5tM.,1W8glbkGRݚ=7F]Kw>J6.5Ւˇ~ IcgRitQ/I^մ҆ B4Ɇz@xɒЮؚ!lǶ3/%ޫm OR}X}y5[s)cfj~vYQPlj6GBOiuYhPK j?8P+net/tinyos/util/macosx_universal_getenv.libOhWnA*mi=!D20 &R_6jn6!ٕM٭S`o% `-ZPV"S3'|I>əx, c` jSH>f,Ϧ+j~&G^^!~zf|x"ɦә]jvd/rf;bcd|F.K'_>رxv O>F4'~%OwW@X8kmelt&9mgm'mƒ1LOJGaO;n}Cib?WEw8$JR'( j[sCT+vڗڗL t|dMo#~eb]t:>vP/|/v7͛w0 هF!d2e0pǘߡVcA!2Q$h|a3wb~GQh-}g>YYhˮWͯRu₾ +'4\K<卛׬|=e,|z-^ ޲u"$%M@HLy^r罤^e)>Oo 55wd~ExXGl?iH&cÙh2%hg}8M4;Iĉ$wc'c,Ot"5312D驓,qdׇ{՜_ ;@S&g86!)k={ΆcmD#BճXw@AThB!z6jn[6?fBi,^ r!60 H9)cBp> fH[se'|"8ZR(|au1ζl3ʖ(WBB>sTqnZz Qʚ'иы}~{Wn,Kzlzޮ9jkR?Zm4!eO.̚=xT56b\D"JeU}`,$<p)R_\.Q(ZoPK j?&X,net/tinyos/util/macosx_universal_toscomm.lib \T?~EEʅ rcT Q0T1FA1`ƥB3PN}Ɋvi33q p)̨\f+*3*s~sιsWF>s_/9Y,r 9.Қ su ǫYZ~_W~_W~_W~_Zo#U+ЁEƼҬB:4)b~8n.bwI3DE1#wy 2p-K~E镘K"Z[_A?~qz@aGKJyi*܎e)":HI[Ոh1?e4.1JFsVBh h.+R~ii<8IKz!9,ҽae78]㶀S|YoVqVl~DƱiC4,e ̜3hБCahgS~zDzjl^\MQ/HSl*:^Rjگjگjگ?}%e9LxI7q~8T+3v"61frΥ l{HlۧeA/rvXzHF SlG^)QwUڵQ)ciS|:󇆪W\߭?뗌rT|uýVk{x'Rl?C}nF& ͐vIwZyA@3KMƽ |z*@Yn)޺ﶤ_th{ٴYܴP~:A{kELW+?nibQ^zj}\>e:=SP%'*gW~d?/?.YWCܟ$v產;eh[S{Qi;:8mXn7[f @۟j;bۗj筞W9mu+z :ݖjKC=0]l+쏠軓ƃ oJq@Ҿ=hPT'u=nOpT9a):o2Wb/ ńh6Uw;4lmiY%(iwOy ?Q-gEg2]6)v̟ml<7@M^ };ݞb 8?Qчy-| 5}ͩG pú'!)3LL8&t= T3l:5kt҃T[  Pu|嵛4l75׀ρbH/tk՝1oSO4xOq0中^/9kfhEQ@~W1py^5mWkoKr:x=tjТzTOkgЩ"3N:AzZ5QU?w]~R`z:gx }t Ii&m?A?Ի1LZȋ:9Q}&DtME B?FИ/&4Gap4~.hcBJT? T^?~LN~z>?ynߢ-駫R?;&s8I:|wD1냁Ӥ:~ǚ.I\*u09 'O\Snτ:Qzޟb; ڵzʗh[pM|4 M!5@ $T tDp]2\NQO" A1=KA|HIbhġ@l@1K'"q _ Vvw]W[oqkǩLjRSTd'b~2w*^˵wڄlWhu2і`X6y};`8;F)' F fDEË(`0J9&e=6R:̈́^8KCJ-I@Iq;qtmI3>Uf}Hy(~gT֕yDu 1 ZK=XrV//dfR585KKᐿHgD }H&N ؤeA{l-&#BƞLT{dh}GӡHG-䩢oh&Z b+2Cx#1RCQʇָ !|#5bd^ke̅f1t!m;^h~AtMA4m:`wÃ-Q8LG7C?*U) : RX}5 %~'1H߻ڊA_3 3~{47i_nZ|dqrމ 4SVD&KtK/]BkjǪ|RO> t#oW=[dNwn,yyPCVx9›"`U*!WS?:@q^CBTڊ>j~vU{Ƚz v\H鑻+z`nH'aPdE;@!~&?~ڂ ZuHP!Rkѭw 6ˬr5q4<Dh h:B F.Qd, am\ۺ-@N#QOGcK_OV )#,R  'YO Sx}% d]_'g_M\2mV= ݈S3wS*o#z)KPF%:j:lp]SuǿCtfÛa>RQ0iLGzKuo<*5`ʪ?x&&'6Ru6]j>i#~౅WReMv_e^Ş_Tbe[xJDwT>RJWȞ_BNM`fluIOf$(-.2EE%,KaԂWU5B+fOp?uUҒe`zs]MU! vaչZ,cڷW5֨֩ثB)R*T/J-T1 U=HV{U^VI_cҋ$8&m@ی ,3t] + .;D"IyE~:>].'|Y".rJ.UU@DFNc1 Oi\9c[>9#͸\xX8X+鑢"DE&b;QYsILʃd{>DWĂ+|]NO*[i|CQiYf<4^$]wACߐ:z'z ,]JUOdJ&/Rwd[q+jR:hО>&IBTLJj;zè{yQIsu]AuiHW by{a>g!GE`Q*,U?FCL긮uwuBCXè&sa X`85 cۀ1Z1Ac q_1Ʌ1c8sb_V+O+sNS\KR>_| (݂lS?`EbMz^Iu}2MewG{&+^cUgjw2wePEAmY ށFY*] ˊ tޚK¯@g3$V dQo"3+dNCbI0UƄ :S}!ߖs݈Kۮ#|݄ F4u2GBx5^QwMdMo$w 73zhɫ6;Ck3xOIa?,7mz- !Q nD!@HN_X8=-$PYA1N`/H1Fc=ƈ#&ƈ{@ƈ'\+yp껦\:Hs'7; E)ț{Nzpq}ѻձ7;~sՇgK%PuecÕ c.p %d^~Dp`AVהp:4 _^@{^a͠䴥C%[d;qLu.(x. e3a(A+_y`6pIv 32RlXOBY:;q3w{Pղf $C$Le|#ebG6}yz6Wޟ·]I=ΣH~K}B2ӆXEGa܀w,&Ws(MsAG¾0Wn 7Wtksl*rAql2q~_{A9{AR(r-ob@{ 3\\ LZãP P Rן9G1N0NtZ1,~OU `Qz2ByWa}k^ꂥ`Ķ`+#x==؇Q`c|OSmg|r'L D` Q2t?f6>8Ld\ Nl} qǏ"]~|v|ߋ;UB "uF'z簏灮 ⳮCzl]lƟ\ |gX͝$^GcDtxa'pcp]G p4?^OCbc)ic-?Z#*[Tp7]#z3F.6`y;&\ eKYI8sX|+'h'7W4Gm(9O5n>h ̑2zHrko_Vʖ?VF*qO=<{xyxo}o&$侓}H{}7r?Dr܏1ro$o8$wGro" %frϑyr,@Zr&PrHaޅɽG{OrEW{orKeYOhz}0~ƿG 4/LI`F/x9kh|9_Ms'+ Ϣ1Fk1H?x !4.O0NYXWK&7א6,soq|'f4gh<?BL_Cbzwt3h܂t & lXGxG8>w291B'y^L?Bc|q'Oߢ񵘾1 4._1 ؜BcIqh*--f[uvޏuA xtn >pyBңw7} [d}~۽Md +*Z8l<-otB򋇥N3_\$*>Rd/4 Y 嚖-EejLJ͋ M?| L JZ MEfYATKAAzq~TTfѭEKh׊ldViioGBȬ,d_`fL˘0mʔ)IH嚖 3gDe tfhQb(O]<EOS> QS\q D Y̥S|jty ~Yy >g/]_ɐsn?xܥs?n?gKeӴ9|vpřKy|_t{.]y'K, `|vnȣ gX}>_R>wǷ1a˴Ϗ~~aYwį)<>gM0Y!r~R~>nP"5gO.k O./#ZYį>G^|y>FP# i|˻|: | d|$vY |f1s)|Ak(<܃0>|OT3?3Rߦ|\ϽZ?' gPo(y|ǡ#d|N|#g #@*yڟ<8 US>YF+-ђ~UN񍋮pd"p?U |DHzqQW5P%z|Av>I絶>ޓ9v>/͔h_n;3't s/wçOwLkJ}ʧ;Пm X8>OT1I| >/`ɩȚ`Gl~rYk[,a';mqY! nr}x>+g9-A^C X'{th ({_-O`ԇ5Dp7,lջGYafdt KX gp# , ga" &6mYX1:XifK_\N wr/3+7XGca Dz0GX5d\,+Žψ(RULjHANcD0%qbn3|`Y"n^q@JtG# _уrةXO4H_XN*y#B8Έ@$΋l9KQBFo4V%9-ΰb 8 0^DF?IsI'ԗHf9xvrn@b k*IoxwpSψ'0:1b+o5^I؇ #,jSqT|Nwg̹=XȈHfDw$jFF\FWT^RhS$AwmY DovEvX1Bt`v)U1q6S0wEO`98(QUkoL{@=o7VB<ß}[Ƶ:] k!n md9G^Ś(Db&#ǴmjxF.k/ٙOۦ.hD*{YNï,$%#u(g9kXΏ8!tT;^˼!RZ,K$b# c-b|~d~01q;ކ|yF8[.^4.^c{8sy7xo]=暟텳E/ 1'YOa]ZM:kd>K?Ӽj9M@g,HN" eq?kD= r5Ő5o4[Lj/p ]f8ba+jZ<7`("AFbᇶd=)\;ϗXHr udZW~_W~_W~F!8),Lg,.`"p +X,|5,\ZndX#,ldM,lf!0 ea8 {0Y8&0,,\.ca WYX,tp Xxt(/cj>,],2562igt"0o4XEKF7d0:z*3f$W+CNGeIKf/|52e\OtFG_GɞZ$ïtQѵWS%) ̞dteّt=/ߟҵe?=h':=)95W3/FW\N7 IqnD%Ngx єЙp /ut#3%?pfo3:BWpw.ɡto|FWP/_H]һ)-o!3 w d3ұa4F71 c Vpq#Y5kQy䀮U(ϑ/6NF&w2]Fw&hMڟB0W'd2U)Ϳ})oњR2]oHwd2z^,odt[F'Gez$w}23@w.TeW h !4a!~M4`b8+aa\gga.4\f. SY> ue,LNFB?`@^u!.bS2pf/F9.gn?|heqt}t;+]vk *@ߔ|V*/V+U߇#z$-|b?ElKQnɸȔk*r̖lcv~Qn~B(( dYrŷZJ h3FCd7N2NZ5cQiR߇gGMj(ZbeN(5ߘbFc~Q9? v!cVQ PaRڴIiFc*㝄_I-_\\k:=}Qzzv>Ƹ8MYEz(C81z"h/Z^\F?¾-B'Rz9m(|G53;mK>3-'R MYїWM2g7]D|򋨘a..6YޔV/|ufdRr4"*M-6-VS/N(HLFQO>ҪZT;x#ԺhU> VV.~T$  LXEµLKUs).,3EfvfZqBq{h/3_"zqqpk4Y923XP%G0n\{EŌEYY"lWoPo 3T̔5XзbvP@@UbRTLŴpX%0.%9e2hJLfyA9ʳZ,'r2.jT2)TXnz`k9$]WjRc $x -3Jˊ AK`dEn#"3,桊:_drF`_H?F+B `,d(E`#js~_W~_W~_W~_yN省 ⸪ yi o40̚!X!X?~l4M(-_ҙ1Pˉ.+!Yj9|f¢GiEs]wE<ۧ6hڧY:>hh$H V\fA0l:Ͽ΋wW+e F.Ww 9":$^f/?g^?% ]N:T"CZ"\~ƒ  L*g9%z11 jښ\~K='?*!Xn &cfjOmiZ/d |! ]c_A"_],gf#?H]gCl3XH+}vUV W| tϺpϺZ -aF;yadv(Ϗ ǪN+!t G!vC=ۀv.`2{ۊ ?h7C8 FC(n`Oma6(ug-ޯEy2suXA9xh 'Bded@&nO<4Jdݼi'V-5Q՟Kc_UXХ5PU~w7X/UMFtU 8 }uK6~ktUm=CoGhoV`hVW23`x厈(Z@ Ƿ5 ,Va-ArA,(Oiu6rܼ >5aVA ii2Ђ!Z)ZQgsd}XPmQo2>٦$8o6߯b2Ft1" "V8hU=I>:^::zTSxPS4v&B_E6=a\OOS5kflp;?"V{G4U6 ߆0_|':ׅf Ho'{ǃc> ǣUsǃxxJ}Ix` /~w߮? ӄMZ6'M2LKms>&}/ǕDಗp|Eټj<_Z}N #Ʀ 6 D;-6>δ8>V.{U$U}I^&6Y_y}TPwpCɑ2`={/ z\/^κ=y,3 [9Ga9JKdڽ=*.yGKМkȠL̝zh8hO1YXci5xX]x:2 Ymv?H<*.D˽0frOJ GmgluUE@(Dz3ctKOƂ㞓{w2yv@vc_,>+rXS68oQaCxLa`{b(N PV :h 3[{zpH`+j5x}oƾvf 9/ ڿI9 'y@g-B}H4B6g2>)x>B2i `pr  mf)Ψ0}qT9-}x Ǚ`avCof#XKey_%AQ0gA¶>?S;ɶ:35CeR/7= 0#H-S2yt-*ySPҋ07Qk P)^_*%j/YAlj[ehE#ńӣ/QT+&lflXm8։G|kd]>|on,~Obˠ7:5nS^\*}mbUAo$ﺍLNw^w:#oS>6F:S~DzS : þ9!ll.,-4ZciH압uͯ쎇44X{( .cƳa7tOg\x>+Opݬ6ttKO2vոSԭҥt[7p pW$;y[X̹_L)Vo8h:~E3!xi|[էӑYp܊x#xܯ+V)/,nܺL7q Ƨ)5,V;j1.M1.;/VKoo\R<ɎBʟ8 ;%th%P>(nF% eS1W"jh-`ɗN֛IoFY#+w-*#\,܏\FFq에29Bea'uUdgnx CA̷zKjDʘefuaMEJ/5fuTuIj'Lݵ icI)VI'q\(b; E=_׿"&gc?ӔMeB'o6-UN0z"0YT<@qHMvzglF቉+#@HrW`^`F`̣"˥=\AclU%I-&ΓZ-Vn=NXzs*Oj=y*N鐚S+S Q_@*eQ"8$yl:&|K[ [m`kFm؝KglM2 ? "W s[= 26>{sg ٰ\ )U娮.9oH o~9\QYֿ9[7[͖l7"olsR|~4Zl%~Z|g|olu|˳gIE~ | Y |Ge]$_,@|Z߉YR| a-P;3KuAk}| @> HE~ |O6^$w߀M5R|OoϡsJ|^cl-_d*;Ũ[v_KoH|]-| ݷH xW-Rxwo-xeRx/=yW8Aao8.-/K$%XO?}iU󤊙0ȯbf3O4Y5>j>*vΕ>B-Ue\L.-?ܖqn/sm-sx:}s(+ǣsZ} S^s1jB͑)᝭Oe ICfsݺNVM tl@egKA06NTNսs;1Kgzg I<ilCSLvD)D~4~3sm骦i`c<)Lap+;!f]*7`ª x;kAMӒU1PJ#ܥl_o: Wːw:ѧL L)O/LՊKQ,pI4U$uO缾7S6Q5*ץgΊ(mU3B{$ȺΩ};OoQ/h^2V>Ld]5 JlݟT Bc!+I*b*FEb pw:)]rOb1${ PBw_sGEO~wG<~t|Z@k#;[ hdtgxZO' h=M[J\ ccOb2'qH?Om-i28R\_3d ߲JPP-Hvgד @ɞj-߂nɫn;I47 +zJsk}&,=[$5xFHJs6P2E}C8C%l"3z2Cq tzA T uZtrzICF׺IC/gS˘I4Q4oC}/'&槽LTo" Buu@yw9}F=yf/ Vfn6/DK݄BSS j|ty`ky67K>U> ԷcۆCNuo`"q}Pܺc#n΋c͑Fc&ۋ1vWr=wH=ح^xF #?I@ѫl0;nXl2yg|)6q=Sq-3Y2H׎dz%q\ TWs2yeP\d.av2(ܷ$tUE*| @ I{@ sψ[;L2.&.{E/C5@g{V'*:`l{69~!: F^b˹r!~gW9ҟq:H[ޮl`;ϡ񊳷_Ɠ~-' `3KX"gޖw}aEt躜D>v.rr7A֎'3@mWRnT a9p<OJ| 6bHCxαfW޷&>JːE90K(d&b~ !LϜQV#AOD >ƊkƪSjyCCȱp$MK(B50>L1ˇ]IG vldet-MdHSL&W&Zٍ$gC|C".͐{%^4LZ,F^2 86ċ(ߐ񤃕",BD8Z =E#ObqjwJgx<'£VN\ɠ4'FFӻQ"\Ɖy-TͿ،Q'Sć >xƱY~q SǛJè [<"(O(>y0B}U`'D̪Qb`FJ(M!]D(֑<"jxS y$3HOb"u5l4xF~2G?,v$u‘gFs\°\B2Zo?h+ַ{pX]c#}?B5P-{ZzLZ5R˝s>FXz,0£s6crzz}z36C-=v70olZz~ =s{?|}' #3|5]"GI mi-TdC}'3ۇbpS Zs-#wާ#lwUW}&k܅wpYwdٚ%PxC eVCujXWW+UD z}=Pwe@eiEm6w2 F$giw dߓ29xW0> 7.(`GضiYeK,o: uȆƢ]JHR3n^Zg [n*fV_`#~6{_K~`z X6jz|[G h=~^0z}]p' *|)4pᮈ;λP#u>V%z<$2&5DN_r.A2$^jvݑHX֮U ׬/(| vw"H vw̴"gPb V@ZFa/tڶ@aٰ&$//;úľi?{d#{}Cf+}2Y.NLj<>?$Ӂ;BkԂRσi$pP}%ZfaP];Q{40Nf M5@9$HH}YIڜ7C' /)J{$9IݾY^I:">8'Rw4'[+ICJ`_RoN#bTdH?H:1Ȃ퀏w~ |JILc󷒴1/Bߦ޾ ;'I)z1Ȟ8:iIJQg(Um3_Ӿ~: ROI@5Si~ |[`7%ͦD|&m9I³&#rctw23<wt?Kd: g~ IH,\__2o.#|5oa[~bVBuHm/IοO\Ym>cLnǻT|u&S8УIR호L*@ {'P$Fr$?kZ/ [G8yqv 1~$e"ÃO&GQI-?;й3t?[[Ftiڟp_{q9۠91|IѧeIo[kSH{hON;67eZj̜F#Z\+/NJ/g`D VsOR=F W%}PkyZpKO#Ù`qO;w6`}E3/̛x. 3-*!/xa|&6,Ь晟c_7 M,6"3(X~ \eelE.KY;5?|2R}\v&lX.vlf8offpgىy  ?ŒIgwon[w9FX7vl+e?f]B7_|*܎"n!~^C3p}-GJ_aS1oE#88q ¦XN |3bfyf,fJP|,43z;Bшg~ Xy1!2r#K y, ~urf>֜Ř Lf }pd\xT?kh>?574Cq[LX ?jxf1 Mlrcc&5r-7Y)F{xQ s>xz|XP<ÐܷKZ-ґ0ǣ$.G,Ela^C?$;3f|ESXgDrB36q4y݉J| qկLg3-ygZ1QL@x ͼqbfoj |֏7XfZ$Oy <pEgƸ~,;MEd\oj2]5k+˖ 8T׌;[#~P<-mL9ŋ9&y\'wl54suMpN3xN~i^C3W~L7ogyg^#s%F 9:c:c:c:ыwZ[xU<4O;D;:7S.Q7tTA9 8r7 ö2Z kq||*\Ϋ%554(LB8G9/zök|ZBZ9|Fc1CY m~ qw>c9+->6 h9J%_*!.;%99F6(?Do`9GEJ [(" 3|\-o 1 tY 4c.Hv{j6|*_uߩIUN+i!v|0B c&@i2|x{'&^|,#n4 >+{FD#`6zm^i|vgmhwvĻ!uuE[]l@'T\jMw BwuwB+Y*9ٽH9u5u.#^8u9=BEA/r^'@pSò{/]oƪ VBxNg괗ֶBXLXW.m}NQjsuZ.\х6F.?J "?!^߶=|uH.f4 7eM/JҗC-x"Un |S R;l H2uKܝW_MScDՍ+.2"5ӧ\Qw4+#x \v {#K z'\2Tkڷt_L6-sHCIv kI\K^]0"y6]LiH 5Rٯ\]kZBep~b!SkP6zaM _2vt\K +6k:BէDPa@NjCjV $BSq-C+2[ꆕgk(H4XǙxJh{B<;3ū 4>0stkU5l(8KQN{aHqFA0$TXa(1 J"e5\>CCZCQZ]1&ܭ&j85cI %yF g ^0 D~RJbqj)up8r;kZUS~}qC/ N}%p׋5Nߨr.6?.bjƔk"j_]]$HgI]0(S膿ֺ&WSYQ8p!US Xh\|Qqsp?uuuw(.W[f`]p{Asp9E׬nJNp%DhEF3uBawOF9jCSmuŋmA5+A2ZFVV+d?,J[]?؞Bzi1Zg[ zD[3W ȆN\2yNڐ7Ҡj$h/A)'^5_a9j`z"P`MgNOaFBAw^ԡNϋ~18yi⢢9ĵ<4 _[!/d٫łH2. @6fp嗄hPPȆcP_ze83/1TsTIK9 Z BP`Q0#b=R ^p!ȔOY}Qmw51GOm9~cb{0|Aci" :Բ|-19<kI[J Ksz 8D~fέb3W<yVs^!7MB>EِwƷ&G$]]ѣ3z67?y;TB6;6o^v=}qaSĺ$0oN7l9!ʅ]T6z=ds"< GɄc{%S!mg/|_j?]ULtb:dz3'sƗ5E|=aϚ@>,!4}jFOsK{:lXg3VJo@/#%(wdZOؿfU:wVq{=y (v_XԒwh=4z>LG{qJ+ ;` uy #)Jȩ&2hmAg4~wIG!^_<.jayԓ;}|~=Z+;)Mcw؝M霻=q΍%.@m\ϧ>I݃Ԓ;?ݤ?ۻEcЧy3`gp.ps^L˾_ gSJ맴ٺ^H6~=WOM<~[dw\Ylzhr:AwMUﹴ`3iۗ_\Sml}Geh~7DoozǾl{bfy-cnb{>Fjo_yU;Xcx3W8{V_xy2xvtdlQ"ėSԖo; ͏$ww']O_!i2̰F"ӟo6W5_%ۿEoLbڟ3ks_?uf?^Q/nSf/~IqZLDmfy w]#v%߽{We}.O'}&lΪhgdFo3_d75Uߗ|R;.o)Mn_Nl+sn_}>eky㤚|#q< /SO ZY-_TDW82)vؽuwMY/T17@ow$҇w%?&ObN] 8Um81GtZR\6.UcU{ ~N'7 ?6zm"`_ztJp1U6բ=kH[wkUUZ:*;? LUo,amM-iY7}rq~%5OnR+l&^kV=9zFYu::,~]Ó x/QC(XMm"7Ehn_~xc/{8g/5"rwa+bH~ jOXoԁ7yiѯjP}KV (W)%}ں<_@ ~?_UMWu^bˣG7ֿiA)SWy̯]ޯܯ(P~5M&>ۏC;`|~OD/-HZƟZύGlO=A,}ۇەۧ>>l}j^wPD>x0<}ލ':Oϩ},5n67Tކv1ōsǓG;%սXw"Xw:xqޕO?;j{/~x<xD?+3xUo7n6A_xT"ڿE*v[8j[U7Nmltdy6جަU)yWTm|lc %6Mj]/~Lm|QVV9ll'+ոC}E 7l2MPj7lG.UX跡}Ċ1ݶ>IY 6)ʾ# 8'YߗW瑧 O Ѭ/`MM0N@V?c%}iC1^,dqriVxQ^.z}$^T>9a~ƋWz,߫xŋR\%ZI`e/ qrab#cCE:6r0 <}C[qp B\}\(ۤ,d7lɱiJ_*at(>qAŸ@1y"2 ŷ}ł:M40*=C7ߋoVcBYCB,+}]_:p|<'U)>y$ؕ ^ԧ A+EжCmRni+[~ʞǨLXq[ &@&Q 4: 41`,T:qЀ##:_i\g~a׌G cuu@ bzWǓ͏GgSx ߉_emm+'6ܗoA)}?1iƊSiL{ }l~݂~д|}WmM~QtZ~1~Q\=w;/փBSY_XI/5ey~2v*r'[VA;f_G{'V7&<7?̓ŻRҲOM_j3o>egh2s>Hn32}yPmiAc]oy}޸ptrlwM7.el3Ϭ>63kb>3'~9Y4)ܦOɖS;}y<}OxzxGo(tS5Bk\_'Ӯc-^b`3/75y#^۲|j,Onj[^Q;n٪>1ˮ?8vFoxD+;f7퇢\{N{i== #5f| 5{g֒NnY?TstTmn=ОӺIoiKvbgt9W:?p+Gc$@OGpI/r3u~ަ)ڴl:͔ܦ3Rӏ+vnޮ=ux{&%N:5' 66!QR9%1?^r--0fO#3.NkM}Nsn,& _43X_RwOY}Um5W\,U]nANkƝknwOks\gxkT9vS\86m"zctL2X ifx[ 4OiZz i9q˓"=e{I xMx٤>?{L/Q:4.'f~?&rgбh1m׳Jr>OOq<ז&׍WӤӏK4/ $% Ͷ_-?ٞ9%O^55eo}5w~S}_ϵmύ~(؝܆S6mX97z۰_mF56] H 'nM_&nVnnaM$BT6 AP6pڶ^h*셮~,mݠwӷmVmmSg]D NvxŶW3?>.uWD?+z\;ٚWAۣCt^ko׀OhϘʖ?k1LRvta vnxd/m=~v&\*؁]ns8ߘHe5[m^|zNC->^C /G6̈́3+ rףg3>Z,TމcAScPe'[^3mڎzcevU*i9S/yK qp-tP4iP̈́QH@)'3X63ú̔[QKedžXXseǦQqlkx}^~;Ν{ZktNWf-Ox_K}@^+Ǫn:@lM=Sq,O&xc}gvHN9ힲ';=ג%q>M[LTmî~ax|}0·Ϡ-a,/yxnm9y9ڇJ<>M<yx<>! O}<%}t>Pxn> d<|dxn>)sH!-[!xn9hxn8Z0 >s*G s/1-Վrym]p5W>k?1Ze%^G\3[F8wڌmIwyHx#k %T&|^M,)d͚6+ ƍg:=ZMr7<  c?+}˪,I(?k=|>yѯS[S^9qwmF}UG٤X~Xnk??c?(u05n>UC,u8Ђ8g@Wcp}C~Kjil=m8l}~FO>h{uw>bs"eMy/rew!r6@9~\Oc|{s(]chaK-BOToOj`ZEը{k@+ )|^8sY{ymSnq[? #|$cB& MtxsK?WPcrq]d+sLήzK(AGyc˭ ~IB>*vX%ceq$g4:6g`qoLKtt,=6{<9~Yv _y!'Gyd>F{xzΞ߽kpn]S,S||_QB<ٛ9r1Yzk䛊5k'z}HQӍ56+)¾gdsjѡ׈ rRYt4fu LG灲QV|OOdׯ E.ڗ4E,\?03ǩ04֍/ӯgc?L|D?@̸u=/>{&C0n.{/^,vlgjl-RkX@l^ka'w>q8ЇگF!S/9'q(YW>>;'<:+Q|*ӧS!Wt:!O砃պ+س6NYQ؟2zX+OFAW03 :S.3I-~[osJ,I9~ގ뇞3UtdcqeTb\G{le=0etLc!.ɖy}Gd/*3Ob;d|n ~g6{aьGrq|@B8:}]8GZTw=7X߅}ƀ0/Mrt=9|F |YDi! ?mWA5sý#t;D_SroJIS3KkA/g@νt%vehzcĮn*^MzeEP{zU 1cyr7܃߷ZP?H}  R~ǃԟ 2H}`z %$/4HA_ [iz 'rn~` +/6H5y?9HAR3HA+2H}fq?5HAw ReA R>\o ut:CD9oo5T̑&K4'7eꗤzIuseݑek:B 5LZ-7D_;|JPWzhUˈ2쏴w"~ЄF ks*m`İ݁3F|a] '6w8@MlT\;yHl[|^B5.^dɒJ'!`]Bo]a$hAwWon*R0mcn^Zg [n*̴f~F} 2e ~;s{y5\ƪ t[r񼪎!{A/p[TQ$O %`FuEݞH( e͇qDž"r^#.Z[.JІA 4r ]Qe5vև; DCur'b._牨}a?quEB._cy[=li@طg bV6*eτ&IoŧX8C7ki9wLͻ,Y4]yǡ.IhwZ4-*4iNhLVIFK4 V4h@s"~HC4h6$ 4;piYa*I U?ʮs%{!=`?N?/= ȿ͙-- 7Ӵ;F4Ʃlq*kH6H򘦥ޏ5SiHh'S})=y$[isZv)OF6Ф)OF$=<IvEz8 I)9<$i'é3Zvia=;M ;4igYIK3<_m^+I{q>ܗF?Q9<I$-Y I@K&Te&ύ [/k1+% ?g:7}<6\ ;,Ig[:-NgyAp9:=dhP/e59#nM߈;&I߃ nOi>`D}J1M!Ttq"JI##H3GG~+%=8*ILg/7 *J_ HܦA C|Fr|i$Ao~:M rrI;u8%yQ7q=uJ=E~xLYj4 ϔi+5#;8M6$UFSI׀& м4Z_3Y%I?ih$X5mԜy$ID 1rcf>9{}#Q hp AO7 h@0g z#[YSı{BNҊcaUcZLJ#b~C=H&~fHljRPcɀ }pH#m9e&3hxffN9DݚJ,kY܏ ..66gs4 qĚJW0#QƈNNś"7/6uY.R ulBl"^@x92a9"3_"-D49l9u\/͋y!<<!ey7B;<WuЎ&S yyTۨo282zwC2.kԧ _^N|<'gZ#~?uQQֺc%11HM2<?#o 6ZM"c& +j`T:UkW \Wi&uph}l׹x` %v} qCw^3~ aYUeUۮħUP ޵t:%Ps)zR{Rf=w;>i]fL]}>iksYuOF#B s}Wb١Ȳˮ$*[%qn/΋u0-N^ZFSOzʆPM쯱ؕB~=NZZ-뎨S ۵P]k`Ҽ nJlnѵ*t]r]XYa>%€Zu TPj ڌkZP7\nT?s\kFWGܥQ-sD_:4>Ɛ5ӘܝOGW"~jB1n5Vw]qĘTH20Dh(3DT8`HҀQp$; ETj6"eTCawgM+jqJ/2nh [ д/ѪzU;_*qS..}_uܢj#:OcnG'uE Ԯ:OMj[\ME&fE}zvȱJַe_h*F; ;#]W v m>eM/XHZlG5 P&b˼kO[Y9(muwJb{ __ kYn)-n\]~'B":}.pMu;iCKnzLcЧxD|=xK\i@5aA;<W[O ?Xzl /f`Lu+O0Ј/C;|NV< e "aʬ("<_AA!#PK j?!߷o"&net/tinyos/util/windows_x86_getenv.libY}l[W~6#m E|x[(ak#iQʹ6mi|޼ɣy9tcʬH2 ABС *P` *ts?އ}xD+\s=9}9ȏ @VADQr|:f|=?087L0z A#5=fIsF_}轷_܏d~+辇nJ(~d[b}?-9eDd6ST宗NK=jx?'@'X hgRB}iL<%B1t 5ٙLgI명-M*k⼥q\S7lngMB=y/@=Ɛ2Y]=Yg!T*7'zLJANC(izD٠fɄal\))ǠY zB :fhC8 "H!2v ?Dgumz_׃]wE>E%jȽcΔEC'q,%XQD}5d}m ?RWbDbGBX~  f[Dԑ7ev|*4m^[2)i)!; }EʼnOA aqL`_ù`F|ؑsf:UԹ˜DvP`$dg7y,)gJnaR}_kn{Zwpm K_@ùÉI=g5j>_&7#m> ,w +K,AY.yJvKvl<:J8eX@w zޱ, }zH@CB?/ Q޽,I {J9֮ ])k";E?Ndڐhwtѱח=}G_;uv5)o{~ysI6~& <f=N_Hʎe/5(ID=/|_zEV\#&J|%veuGj$1}r rWqk>_In2kdE}sM( o 2)$s.~{~IC}oͩ+*)_[sҳ0ƕ [I~'Hkt9׎}%s% $YL2^#2=aoOkE0z|8zqw/900)a; 6Fl?i' J޴6>La!IMpgSD+q'Ɣk; TId/f ļLKI0i/%*H"$ݏ?6*9/e098g4zFHQʸo hCUgƗ5:O6ޚI"=aBxP;19qZ|CYTno"0v=)2߬yf^.޵ɱ{JR5p*kO4=wܓ~i .AHf//[8^XyN/q.pݶ_ـV1Lw]7Va3 c /M~|]./[ϟ1V d.G8\ o;qp)?mU` s_r;ءPa:%Cހ'3-kh 5#>gEKkraIR> xQ> móu6/ պN.Hً1pmfxSۋy6}rneZrw l.^ E =@.x#;оdNm?jFڜ'$9*!<vBg Tbr>IIm6̆ CH8 SRSbjί3\L]vۥ$m8PmxRxrfPe))V.>uEUu_<866B-ɱv6r`}cs7a#ҤȁaXȰ NI˜,DH%ctz$"Ȭ@TN%dk4%/FJoC(I5R|¾ QH$IM42|8WwǨ._?zzGcD?%&v>{C @ۑKL(h`Љ~7ĢAK~8aXS?wEAKg B>u4TDIt2ċn6R)%H%eKh@t*1.k~]⣡qJν$g3==(Tr=9{e-=:sc#==cSTɹr['r~T)v_Ǥ_N֯@OI|[jNvCAό"}idMO%SF8~큜Y:'=eN_{I΢ug9{ҷ9gzzG|sOɉh<=={i/9x_t$6z:=C)OK/R)_ih} TG )#klBl@܅^ H넭ZFfɡKxud!ՊiAvhQ#tHFSz/4W_v(2z3w7t&Z#1YɅڊB ?AU>7`?|qfj(c@I/qAn$M$HEao-Hvi$Ei-rZ?ŏ4cq\?uGWaQO'Ɗ'7 6" B <g6/g ա) 4vS yMhjbGqI9J<14"~,$# a|VٽDAh9wwꎧ<^m:%)OJ8Vx#:*51/!jei|%6})ѳl`ӏ1]?* ]7uzP(U_5_%բSS'ZUP`HKڶ"k^Gce ^XݲFa]m`PhY[#b@`I حͻ Џi"EwAس_lLtB8;Q%VCҊpk6sK!CY\CCp[eg10Z@(lˎZٜ(; eROIZ[sr<f4OGBE<`Ԑm[ y `Bَ(ę!FF _76kej'ڳLia7 t#.h|TmXm(c_>VgweX! >F煼sT9']Xy1& mBք751/aD%C)Fe \LY98BqB/6e@SRkgDvD \*;WNA4ԓuLJ64p"@ D^oXt˂Ŕ&hqUȄڥ uI<jWJ&-\Ma6H0Z\s s ʗ2N6덒Uh'*/APc/&[*KQHXeS )*/~jCūPL*u\2FsQ~?ʼnhbYE/EQZjЃ`AݹH]GeIZ3>R __ f##{(?G[\/>Av^l2H>L͛F_癸%I_m X&n5.2qkĭ&f}`qUx>L`F:1NK2f*Ƭ`4cXј͏a&*770c61kP ̸>|숪Qv|sɰ7P9 D-0_gIsN/2C6w1gjAF %uetT}L*#Ru^Q bL̍|܇=y={kLf*gςVDC?>M{.?rXS'fkgLTCZAjG] d5S'}b^Y>] ܎Ʀo?Ϊ/DVcuʢ` D:/#PYٲ h _O۰.7i77wyݽ3f4_վ{ү <_׍~;["R$}KI(Pmg_#pe `=k'%F($tHҸ{jXAdh2I63#'B8OeAV U5^Q/ku|G8L39WۼT_ O=+\Prw*)YK8O MӣP12XiQSh]8 qtw6#J4X3Kl">`ɨWEn7Lr= 0檓Ls@r'GqS p6611TX6d_ȈXf{pDWPC#>LѥpQMeX7hS;ozD9\\w)OXiʳyG1+ʿYu1b1s`w, \x52>/O8̆P@ru-$g,3`pH>pX:$o suп] ⌄GxǺ}fZy_^O\VEeاd1XWENr{U=R XR Ixb0o}!k ZU̧<85#&]D%;h/y MC}Ek 57*1;Xz`I, ewt}2vڗlleBH烐tHTyӪUgzLFpTE,k o E#_q^Օ-YϻwYoa׃V\jҌǰm[miN;mQ|mYiK^5tcsw5tc9 ; +wm˘d0;reL,_14Gs5]&PbG`ЌfFSl$vnOEk|Y 磔İW =u!JfGs%1Yn({\qG=,f#N|Giփez>uNXklߪ]7wcO9{{ {zV$x,Ďa@BC?b$2I ]L#&?.ƪ|Γٝ(=*2=/$`f:a$?6t1U$\mt&'SXx3G>GWy%(9銿B*f+O 0sTAS&ɱoM@NkȘUuU3.S]PĶmy|-`8rr2Ȍ 3^0G 3MEwJ~$(Uj(%Fvevt/mJ1e<ήx9Mq~])J†ٕ`t 0&YB: `SuvY-9NP.ӏ`>a)+v3]wULJ}H mO 0יִ k[Gĸ` [k 766KE9V0lyGnŔ9UHBDz u J[j8yS w=BS.t"T9nɴ3Yϴll P GZeO%=?`qh)ؠ-@Ly[yn1ٿZ+. zE>flq -N68dq%f]`?SOrOϣ"_by y/6w-}ۼwQA6oe{~9З7D_ؼRl6%=bҗ?ؼQSmχ7N)gU"%w!U 8Ubaqy'j-Je??Re041%an[߂LmV-$ /Y5|bkh#rm2H<ķVh"̖Vyu?pcńX%Qxb|IR4L=7BZ7C%ok'kUKUUd$]$ji41Gu1!XzE: 08&r==}p6?~۟ocCi3C` _Y4dM \;^MlvKA@``m X7|PB&"%OѶe +}y8V۳n6:!?΋||#<&Dخ ZE=њ@(7@h&q|} lYSSw[͐VaQ& w1d,#v-c&K :jbA*iqj*^,ۈ^q8lp%2.̹}ںF##q=p]FRp pX83xlHDx28>aڏf&>s:+a8[2q!s х,b))0?%~wiK=,N<-+B 5U;#j-`Rɳ%cVD>v:ؒRm-f-SmiZYܐʑMT l'ʵ& O kYDjkӄ&xu76|gzYWli.Yv)q.3:Θ?`+iȻg8󡃇~VST̎dO&"ZJK-#s6gg] n=@yr |o=Ire P9e<x5`Pk1!'!8꿿_?8FcGPpD}?(tN0ʯ୑O0ԝ,^ϰʗc媃T#Fۑh&|=2taǒ2ٯK ~mE;s,ŝ9Ojz6]'z`FiE7H;ʣ寫!&_BC*o|vȘ|Vps,>5m[-.ݞYN1D[m!r|O6[lo{қ{7s~oyvלV8O86$kN:IQ,]|vs68,{. mg+13s2+̗]qe"~X,a/,;\2A/PיJ_]? JټO-f@_{IKF*kiKJ1\[3f-+?^YJˇFȴȑL,|ABN!"9I5 0͢W*x|ɐ^c⟢#`VQ-e<lϵ5nSs+82 8P!jD(WPbXF8gL|f/=ĮM6oIۃJu;~&_ )TfA+w)|R]tR QE3Jtblt} CUW3x7$hk}U#x6MEv|۷o4d U l5ښ:@OA!5IO#yd/| `a~H)/TD0=)[g8TʨUZi&Q`-1 ?,lRm+bq~D,ƚgᱛ,W=/0Cr˩W2u9Br8"S{,SyW|A,E3ӔWU>pbӎ)5&uK5yU9/)J8@dIaIt,8!rgtHT8#j: 0xC7ُ!} !}TWi?QĈheX$ⅼ%$##; + k虐ysRd`GY'y Dѓ"+r*y5,Xw$9u6$Uzx>||e!u~9lg~H˗]ͭ/UkMGcjߜ9 %s}:ѹDZzuIt~}ǒ_ǑX2+N$PsNN]A8uς~]wgp}sD~Z'^yR|ӅGaf#gT!Kg#N3/T᎕NKWȎ/iɁ2>~7US"rlgy훂fhk%VQ.9d:ɱOqȎcHV&E|}%mDFuT!CFMfȜ9Ȝk?+PMa ш\ ^,جlj 9W3L/_=%M+.GO G,yKHg.LGB;A5*D91O@F[Fnm%DN3 fx't6%*Sљz]G-:\ nL+E0P߄ ?x1ِVQ3gP5krWlN-+;*ovT[|km>0heNmfmy#ݰ~26xIl?ʛOqκnko?i'7B^'0mHpŁcדAd$ PͯZǓL{+B^A߯cCzoM]W(ģ;qo:ԙo/>~1+oi<>s 793-3y^l>n{M˺`~_{86O-芿#L k%n[j1T‹T%lף`rLݨ( k5r1u]w E:Ɖ7 g4٨R@6oIa5]2,gŘVyZZ,)/Њ1Kp6: cԶ|>,Ŷ<>ξ-vn:^LI;Cz,TL"5 +\*~H x|s=wNУ_BMi^^){0cl/Q~\K}HJQ@ Q=lO}u~|GnOH݉|5u!׉*3[IE{YI 16Do>^. 4.T ~:\r_=*+합p8w_﯄7 ]U oX%xxIP\+H"GPPy`k< q t~NWd@%hbh[$5u>dbew(Lε; ܈w}t}Mdu }PX$S"5uO9칠7g& w*-c.OYmr!.e%Y%(sh쫒7$NOQ9tmb%p/BCY,|ϑkqPkR6n__(ȯl71s '28ikOiP5Էukϴl{'Lt g=wxaqf Ww::MzWzn!e$*? sr&`GSp#ԀZXjH 6CZYvWv&ȋ!H@OK`<*e-{o23f9 [ւ[Xn)_ rZgᕜ6W,T(V"<\23)SkZmZ"@),XrJERW L h`eГ/x'mܢa6o.kg0 A©H,"eoGrd&3&r eo#Ď2`3 Kx:`(|T53PC(IڪKUN2=8@8K @ xj 长&֏ce A14 D\,+E@^qx#VQ,A6A}DEI׺0[Y_2!GaLz|%^K`;О1؅5`D,!@bL)̄LE5 7pKšEݓ#Gs`#T~boKs:)r~1:|;m(U2m2(d|rlxЉ&*.ؼcq{$o@e=)gT[s"9 k 5:?T>v] ?A;ezp,la]Q\F߃31)]fXFإ?i5\w_ٹs hr|xI-{϶RQ^ĮS7EuM^}/sKhaq=9`qݧl-04DV"פ/`?s(fIMŵCi$u{{L)EZ&DEyh;9Hl-W:ȭjo;'sɭiI~pERw2gۂnǶIf9kWj`:`鏎wԝk}ȰqA:(".xe۠ۛ&7Epm]aa]S5 ڮh8A;S)J.t$p]\OHWz+ awSM/_Prpg[ >_үn>}>R~/fc(wOv.ҳm=c&Omx|/]oo`vx`jFe_ۤ_<[x{OvH-zhϑLjߔ:e~F1ЈB޾Ms=Dl>8' J/v> O G.;t]L{;,DeGy߸8O+IEX%=Kme&V ?̡e:g7(,r :1k:* x!mI `kh o~T{5Fd?ybk;EyL"nj]-<}ze[wbaf‘kCq饩|2, 3ߑiL;M\3룷~Bz?J0fKl3ӥ*gu⁾F:uf<=*kg{sjlOi"FRձSguc} ŷ+KКJvx 5rxI11 g:CtiQ4~ I,˹ E9c-colNZEmC8[)146,\Gﰂ5Bl^:Iˉem4Bٯ}zNg'ˎ~dE0~pf Gl[`ZRD2^A3cdF7G<5q}JaۼdKZ-5LgʷJ4Hf="=5*tXF]K=|z2@Xi Y>\,VگRȹT/tL=s.;eLv%X80-I(OBFj#Ƨo6o#Z-[|[|3$Sl"a% BPLMj'Y\lWj8 BmR-x-ii7s\eK<d*s I(Ɔv~3d%l#kf ʶL|Px>M;K%3%O3Y= 4&g5y调,Rn2 ;6I({Joz19Ͻ'H-]q]^3nAPY葃Θ'GfZ =W:{{v}^y/]S hwbx28x9i/g[)r/a8 M@q]uq(d" M]@fO=ah-r haصu+ 1E7˰ۙ8#fx[A]/F.ɸbE3oW=[eBmtP;q?%uHt1[24&cuv ߡU7b_*Nr ĂO=6ÉBA%Pc%[AT4Iw'(-B@![SmGjcnRYrHԀ6W3ih+|ߤ! -?!P*Snhg]b5llܖRaRq*9ץ6HCYKݔc7~Ff:u37:f>4pK~#(QuT::pQ_ X7 ȎZ~Qiֺ_~J pGPs}[Be`KX{+Uhd0i(v5?tI>68iP!vIV'` 0^@SwzRiJ:wƖSwK)id} Fd 1}LB"Zħ(@Xl.<|:MamONK1L7&/ex(~-auiJuʻ Ѿ2TF#fjM8s{fFY*Nv6vyo.gVKAN,үn{FlD3;ĭcudv]9?KĔP^ZYUZG~`e,d?B8939jt8RΡR\+r>62h"]zk4SA~Px-<{Yr]%DINv1ߪi)1 ?jH+q/"U[VVbOFt)Kb6PlJ޶NE$$3XFzM3y 104\JfCi^ P@U*:y$/o?S6kn͚8UCe[GK.DDxøgX/@_j OY~b2f^_~eb__ˇدZ4oNd__K4`Q @ېǁfVk=& NlH֟Msw.Ky>A87SJ z29VcrlBi Do(ٝF鎂 #O6+8qұЊ79hqvCiQjzp!`{eԣ%4?VNha2HXGE# 6Jv>VW [_.D,pţֱVh1>t"#/wOIGAH͆Do7,v8GO~tY^Eb U^X8*'o}ZbquOWsnzOEOqag!(->yOsأObK;|}7">ĭ ^q 3,xKtiOxa/SZŲa#ӌ|'>^vނSN7Ih➙}m8$1$3s>1=?+]!1G'Ho~~ }^{.s@a>}܅gsNɗhze\ ctSH1[>owA>}r1|X9 >Q~zq[Ψѧu>/_iui]u@ F}F3>FhR{ߚ9M濰wɐ1SO{뷗vAcF}VxtqaO;-Yo -1wY-sE[] }|{f>cOϘ Z"/* YOKDn\4WjGviBN<ʂwgIil`BR6[g 5|њ'o5kMRU^s5rΘZ6ܥ 3fL{L{2})MA&Rg҄c_q"B%d( g {#FA:u1xz=$)G,M^DM$oVfC <槟j0X^G?Kg59f>C(uzU#j|=DS:ge priprҗه>n}XwGHdI#}iVF7g4t8Mv9;y^/.`3xaě#7G!'LRg*"Ɇf/aEܿ6a paB+p~>m[ҏ?ufV/xr;2Vm2n"exi,9ʥQ*%pJrhnVwT}ke#CIÏM #{0j!Y1_Gdxߟ ґ ґ 3]#9}囅P="9pAJy(ego;$L&YOJkka/{{IتpqQcF@[1a:=Dңp-?Jp}{FZqG:cv=7nGuA=.A?mE㏺ocG Ď?nUpwA@%7wO4UyMFAǪQ°!cFic$Ǩ xΝ <1SA 6k+0 PrcWe1`g?ro2 j|]ex1(M'/*BJ0U?\\׫0s6`" `"<!E:-OGVY)&%,}ިegB=`h)EjExlpJgPuj`[Q0-?CJ D`&V޹&9:n6Fc# b-Z|2ZkGZ9# ?I1L$!0`#((#i41U]" R$X3*oxbtL`UPN$Wl:'cR7ʢUcR*0d,I;F!C5¥[ԵMYh>vEooa"‹[yx=/Y񑼸sG <IHFFcxt^<@c:aGX>=X4h7R4 ȄNGf=fWxQMAvBY{bQ5#"y meq}Dr ~ B0AvC ca`17nP ;_?"x."=?vټ~y_tQQc=}`N}'-q,ecoh'(mBey⽺Hޖ5!ȶ+BE৫)}8I%i+l2; }nOX9ـ΋Ą:mT?ꦝ9kr78:>0a=9UbcNڟ(h9y9"_$EBlu`|~ug>ߋC_i<=SGq/JeF9ǀ<MKa?=@Vϥ vQ|:jP8i5mC|s/clEN+D2-z(@je׏0ـ6LYq:+F_#9m' HGTQ-9l#V7 |0N( :ihils$/OG m YaXNJ0u € ;H`#}$Gq=S\I=9Dley6pV9"?Jv]NY!SixHЗ5HiKDB?<+kՊ) OQ{Oyv4}&ؕk͜\=Bt2)@Z@_6 @3P$mtm+6*qT6$?ߥ-%y =i_0x9|^> GzS5xS}x=]@|xqޭ,K> ppV /n= ;SE;k59y[[]3Gy&_pzֹ2|F-ȰP1՟80-Q(e<\CJxh4;\-8B$E#,t~*/5ݝ;48;9@.OXk[ ] R`󵑿$E =\?o,Sj/5!_@dT[ðRC4rZyz( ?O4gq=\k"?y~9\ʞ+?Hթus;ma˾mUwKuḭiMn4N90i2ܓˮK+o yj$a6pN'ѝd[P=$\)78qS ةԘp<Nn y:z)Hv衷F=k#zbF}|tp :ߙM:3ύ n h5B\eOۦ;hEͳwAc>NՐ@~Ӭfuan ҏuOwC/ƛܫn='zoE5q5ힺNA}m׎T>@oOJ&+.7@5{z&)%[ϊ?ֵ8+(>uc(6}p w-ҀSNlb~K?Sb*7uif ;пL?T]W5}vCgF]~kyz/W|=wJ=ޮoKWߣ,o_;LvL<'S^߇w}VbzMZ SX>콸\ Nu?jƨyO,nz,:('/"xuG3Gα#┢ʥxpH<4JgIKË1y,H~*3"LPocwr;$!t&'J[|;]FGJ6ٙ}5f%x6o5|6|V2P3<u|fjHx{o[D_!ې aĕyxL Td:A]Y͙'_iϩK-xKy0Oh+3FT?}l 嬍F5Ps#sgv̈QS=:8=\K6!'j~@3l6A7 l7( nB6J6kExh#YЊ.rF3/q%YxELs=sFٱ58u!W 7ÓoS(Ym[yodioR>G5E[;_vZi |Nov28<I.?xz87EN?oZf"&Z螞Tb 4MBhThk%ffCi&3T1> 5&<ZDu^ M_^UM :au\vrGlNtٙ{ww f0"dž_5~Y,ٱu6&\7Zt4?O9Sk5 r=k9|o 3d`eϡ vYF6cvr?Oj\(b,xiYHuO ; rP0pnmUӶԵ5 `$v6fo9DhW\s(z6]g;Ბl4\62g^ ' t]J+Wf4Vr봴UUQ]9׼.{s|28~)Ztpfa#G/>X_24V:x?53'ԟ'wv9!?V+sJpePaA zav='h7qw_,#O/ѵTu Xi -6WFYyqu|a=vGx'9h!ɔ XoqI9G+}CߵSoGfŢQI{Yr:p1.Q%v @n* .w]1(GM03-KCP-K[|K={!\?g(宓ZPPD?"kiM x3˓Ĩ'eZI|&3mۃ{ȅj9ݷٜI4JeJ[:ImJ`<)7WZҚ B+b5ٽXܵ$mrDy_F(?6l2Kx+qu{V׸2i*Vj|~ۼ[KS2q -ЏT<,ý,Bͻ!tz8KḾ1'[IdISB!Ub?+ xr9 GKhWM9.L:^IRJ{ޞ "*@COJ|pp~?V!tvC!В6'w|('kvaz'boeQűc0Gm?&窝Aqr>ڐSbAVw;TP,GXJiէByIi;.Dg~uMWYԛzvqS(;eqDJZK< %xC5f&+tC8;MyΉR쵤ATC44uڔCk ~poRV\.K =f6ru0 FZgM|8Kp=9i)Z,9؈Q(; e&',oØH&gKw{ԢoeL?U(`PYKnw3i,r~bcQ>/!gӠ; ||LprLcKRď> 1v,/=OJaMLg!3\IMkP!,E-O/hÆ\DBEZ4INɟ,󴖴emky L'lpEC,[/ PPzN彁,r!YdֶE%yUﶰg!+dꇈ[$;=Y9OB:1<=e\A\J~ ɶ>%ڍSᙃ B]>ս7XlPLRCׯPob{hwHYPQ~C]9g۝iM_+*8$/HkaZЫNUXo 㛓p+_0+/ZSl ^qi鷚`\*`ٰ&k u TI:>&',lF.`aџ|QE<"-c<1gg]|ai(p9xT%| . _#fJGia4&r3cԓI'$Ն.Nn;S4kúf#O우p2 ^`EFHK}B5x9}DcbMaKlT7n2úVcf_2ۄT0s||7P:ti={)꽺 ˇ̊yn'o!\32|ƟcRaE9o_:UM]R w/`3͔3;C-lY:_{1ֳn g}Bv9o{ԐMr[ma$DOD)ƙ!qw xtd@7n=% gOߍoJǓ4)o T[4hUEmBU*Z\-{@]K)D{躰_eVUP0mPŖR(n.)Zؿ|g望iQ}O?{̙3gfΜs6 40[>xnDpT{ xfwsא~=o ßIދh8SsT`hEOiHOQf]$T2EhY4F%HzQ|YZ|hpjҍ&a\X3zK=]39"N5nۭ\#aP o]-? JwH_}:ZOi%E(l)0ׂ<5,6wt,詗j>,ڇ|ZJܦAyu-jⶃ8Vg30ݘAnSf\zh ۢF\OTkW߾vhx͸ 7c;N>xox`*li%?(lO JHA|?#zƖK vrGy,ŧFC}P{Z^=Pc{BGc0<{/ k%o鯌uD3z^ T$]#_ZLus2j(~L[wHt몿;IanݘW_Ma#!^ ~#b ]}i?4~?֮s!TRdyK46D{,cWRfOؓ=fOT`mukH:bBt7~!:hw[ѺWnO<0BZCɴ>'[@aG;aEvݑSGv>b"uWz.GPQ@;@IΑPrdh}gK?ퟳ`O~?ϩ'iCv OR}DpD|c\Z.okI=z?G/(1֒7Go-)D&ku?n/uQi}i\C#=(㟈_9;o?;%N:!򽱀F_bέCsNL9|r׈Ag] =tP|`|-2lCo7FӾ|AH*CE$9TÉ%>z>l*HO=Ua6Lzr.x ._(꫇I@q;K7]?zS: >|_ Ld0>'9ϲ |cmA2-QKY"qV/jWAR0֛BǴٓz>{JaOʞ0ͼty5?u*?>N |Cge6F, YœXN9ϒq 9%84RqQM\|Qpǧ?jPPvifoxEص#eֵ7J +0\Gۤ2 W /C?-CXQA8|2g5'F?%fk|c!4_oFß5_ 77O hїOkqX>6A{1 oR"Ii·K o{V?.Q' YXނZ0kb6Owx:Gqn&8^Upe1di ˭h /ރp=N_}E'o߸_?3ndb=jŘM_:l_卯8$j|1z X9[7,i t5~j+-l<|*p3 O t*Þ-d3wތ?,?_h|G"~wu_N3޽>6B=hWBAY_[97aښ&F xs9 ߴf(s._fCĩ p$r>Ɉ>595 -9uk9ĞH"s$th i\=&ڐe Ib#ܟ]#dx45 SH}-h#T/Ftk6h'N585[0F{yJ>3li^K;oW+8S>X%E?LWհS\7jjD>ʟ?`mOhqe'|S +[@r8$TGE*{S"K89fiA*0J99/$P6>puRiA2ji^ƅ!A;Lc Fe6?LGzj>_^ex[g9lti2(1$q %I,IJ%T2-)%OQdzdQJ$J %(*%Hɂ(Y7JmĹ]WA;ζ#\" 7#|2 R 2Pܦ2^')Op{޶vʀW0Kf%sY2% X%XdIK2S*[şZ ^ϟ77y~?o^d)% Uk b۽ vO\:6h,:7ͩȃ8bcUϩ(YK Y2%?e|hI`&\!Ym nt?IQ]'H-1C<*N y_4#~+ lA~\FG[zJ:pIy|iz-HO9J*95FgхdH:21_K ,?lRA3Bſ Hu׸R1 Dx*X$D5Z틪;cHO| c+gs|(K ?S:?=h#~zՉ1`W~ƫ$ 49Ƀ?A::oC?z~v 22`#zY+V+.>5'rצ?k &VةRVmYizp΢G[ +(/!| Ҝn:]yK@~"u @%gM\Gɳ={2(@m`NI<vUy"LʚD 7I EjN :-t^J\SS8WQx|??Y4FRk u!a4L# ߳k}5jp%T 37ps=E<9rJCuT}^/cK;B\i* wjTp?fGgu&amu:膻Oa~3qt'$ kFns86\68TBhߴz~4>[F6X52vP&PO ܨ/;Rq.Fvlڣ{c8ظ%֌J:~pa_"~[5X3;`':^7zGP(U!"ۂ0*<8x _y)@e25H ŸhR0R)ɐ"'V?PōQ;/ltL'sy[ʏ"7w=hzpW\r41>].#P'lR4dw`-5>,rTtJ+?:. TƐu+CT弖E\ظ6 +404{%^d̀y~ "k_ΩYVK` ?mVDb(VK`v$z-.5f" YzЈY}Ky W_Qb<:X"ܤ r1y6&GOl\[K ;<wƤ,6P05bP[j۰}xPa\}8ۧ=8W~Ɗ3$^"xlDʩؘ xdofowlMo7ﱷv3{ܽq.•Sq6.aBJ?._& NDCɓs=&k Wug=G.j^jeʴM6Kh\e0]kڸ,,'8wե,F`('YIKi0+kϬ49a|XG3IR4Oå/m~Jf k|CRR9˚srx6,v=%OPU4 X̍~)礲΄}0Oߙœb?1L3ÕfoZT'*ksکuCśz᥇U)~L{#MWmG2@Mv*+ mHk% :'ϥ@Z('~ꄓ 4uuIOwH]_K5KG3pHr=:~edp R_l Ӌ|ڜD^(+Gvg. Od$h8C.~jjGk<#JϓGҳ]=ߺ$=aFRYlt(YPs2D6,p[DOpQ$QSJAnG @7WĚ0}xRd[2aK -HC%EvZ2ǀti%iRFRw2' s9@*($5XB1ī;e;8ZhT؆UlZ`:|riG y!ZJ@ͶXHj@ϸӒJAٖ|o!봰l ]r # Ķ8{cjIBRL&,++ y+RK%>%Gqy_X -h^΀.ۻ`Hǃˁf[[&U*i|J: @A(] I<TE%<@:R3:ÿy2sqgY ^ |,g-"9bbV%>N /xO<}kg)pȝ,gvluRA(.cuP;}@GW`?E?vlbES@h4`fHgyWYH 7=k-m_fۂPibw+m)".N[ZYq[p~^ ̒OO3G(_%u)?s5eeI#Nig@%jDߵ 4?L +ܖ#Hj,NgZHUŎjVF2rlЭPvkLgXrm-12:-l:[ts|,?E잽 uw3cVpi^Y،G'(#CoQ񈛎=-nT@^d_x[@Q? iQM-sy]GǂO~rW|[brII!Γq>() /4D (;{i@Dp:tF@Exe+/33ё8b_6kYtuD7gJ\2-: rg.&q(%c*/~y FeSeP#Q=;pp%ۄ-3@Z2h<z(LDˉ#/B߇[ɼSp̻ \)?G8 0hu}Zӕ=+b7[Ѳؒ \PxjhɴTvg+g"\~jբBjMuTCZ6bA%Op?8Ja݂7}X9{P#~+ne:s޼>gLQw:D0 \MmN Y@l5%mUT٫Q u&fhH -H\qGŠ"%H>ƪeL(UXI_࣏ maylNS|-B$+y\H碆ql e2S.Pn=qv c0Rpl Cv= A'8p>R.Qфّ[F<'%  2N0#^(8\%(&;fw KrǢQ ?3ţ~LTG0/sdlX|:r*;hZ'⣚fv?OAZϺ̇p]0Yr8̑8By"gp+Bd4PXWj]9;UnKY}12 k,VtPW0r=?ə9ѳ%L{n_%#5Qg EU)=KcfgPN{3ÖH HKn{CJy?k؟E>yЪQ|p. (i)'Z!SyvJ^CI0I+Z'J͐'beCϥ|EΞHej|ky tszy{_oOQ(ҟ SFrM -!Q+E_>@_1#"Bifti:Fj8T2yHƵҜ a&cK, L%Q,أ>#:$9^-띦W@`W_8Ϟsy3 W.Z{4mԲqFG^.U4"x8 +quaAN{Ϡ/׃f.?cAgw+O`;X?//j^Zb=u?j%J{qC>vdNIiX+'{Pem G0UqOzęA8e_8/*WsX})F xj=ɛMn@Zhbj[_\X^ibk=l*}s rfo wf^1y_0z ^N1qKŝdNA1z_LR;EC[REja,?iR~ 3~%@]8 tRWJ:c`cITre_}8C:'~b[@i)Y9톳u3\xɧp;:J= ] lOl5VNKJY7p`CWLʰLV٤€^`T1W]{V˜}:g io<;utN3#v[i&@4*ԒC$i0VK'~y-x }Td bVh'=c²nm`9$ 3΀xC w$8ϒ\+hFwA"ȍ_N,~%rzNb3QsbXvvZ HVFk0F0ЋUHPn$x+Y$VldzKOfyF$9j[&2`B-l|WP^&|G^<_z'%ԟ?t (3?@+Ո'c ^#O3 ;_4bv 3'IPz>F)**h4|*Rjʛ~C V"Y~\G[?(urER 6Ԣ,7_3W鯇jl *S\M6)9>C_S1W% hZ0m&J)G̉m*/JP|w xiVC˓VRBȀ_FۂT0cALiKvX4#v*r5hЇ.'5334gNT7(J& i L!@q0` q+v#nX:9]p3PL(0 R)TD3тa3W5B칽xPǾ|x gտ͞@ZsSVPؕ?*= ?SĞA{rzֳ.܇m8Vh\hfM= M"{q~mi bwR_F`KwN@6pQTTҥY١!*%6=:3 -ٸ87zEZ 捅%[ω}+-AM8j `tي+^ J>)G<ӂ(9v LKG! kp5L_+.כ *8)C\)T<΀#~Hln-EKCjTm}$gH}rZRffL5F4aR _!Q꒦bI=`ː%ÑTo3vz[ ?P@)7p<]d~;HPf"wuU#(kn˛PjJmlO˅{C]DayqhY)|F:o%lJuZLfneWsY[?rػtƮ_S_2̺c 08P @42+?62dƋc ,6 ɠx973:KNu\dę ǎpooOP684ݪoA_4/8 0=E&GX`4C%%C;sqV'h,s%VnmAgb-J#im8V(==bTDN6ٖj{C0Ta"c=#;#־XL!Miϛ7&\Iؕg G(v A6,^VšLw~ʒ[ @v=z5AL ָDS ن7lkl|5!yӘy" *A>G!ENO(PI6:({ckc%g堼-?SFe3P 5EŐ6AFjn)?>;gcoI]7 P9mxar{~.s~a|!;YUSf} 4Gcn34#Uγ{ty̠#R`KȽͱ t6"+oWE* !akly?&D znJ#5P kDI TZm{D -{S ßIZN<1pA3us=UpIvNڤ:/Kw{X\y$q0M,lM.$Cq@(xCS}z댜kFY퉬lqdqSPCħ&HEҭU\>"A=e Μ $L&a7h4 4Q&L~|eІ{Af NtMiQUwgb3$xGތDyhnh.Ȱ$BQRl|}' ܔr]bUUϊ ց4s&E39-q3J.Tj=Of:ق\IKN^ń xVjZ)WY%Q\gfbe}7'L$MO_&Bf qYJRitiU4Ke :pj -."17Hk3ͧRvvњ0Ak.,؝WxJ.EHγ6(}=zCKL&OSWkm> !6 )D|4p$C {!(܇J4 "yR>L&7LN2P! {Fs/gϝK]YLf-[pY%d1뿠KBD$ר̢7e6Q8E@2"DSMQneȱLGI dǓWөm:Q.t&&F@Մ>@h #ڧ YJV!B x֓6S2~֪36hu4K-Df>*#d]u5\DmoiqNOЄր{gvY<vTŞKDN5t"xS?I瑰pA Ws6GTe@Stn[tҘ''/^<ۤT:R) 4m9Wv?5?bVb2f(-5HlӉ5fZwZ25f[Tnz$0&AsU}ױǣlNK NYHۂelk]3Ò2b-H Zc?G[hI_ ݥnt•V$HWCy >.Yk\U{Y\hq`B"Bv'|>w~dDJ/:i"@,8Kw׍*Jbv6f!n+a/hLZ4.>(!B3KGedsT 1PaD+=dR2맧iz6Ap\WOA'KOb[$v녗𢕠œ3w!PFR.]8ڬUbUt qZ%koϔ2dr LmCPձ!!:O TZ |?DV@;<'lL叡š/lM3UPy=1zd.DhD!I(`d#wށ>Zח\R9v.*|?km HB1CRm o)[95G &@^4ސ_B{*uM#1Wsژ pBpfÏmC #UC9EߤNBK*N}#>"axY"n?h󠴚Phxe7_MC%~),C)]al9Vt]J4]g[ s7_JEa,qח\חDC,PXd='x>7'1Э9 ZB9i4M@쨏I+nE@d 65H56h7@_OFDw5nF[=SߡA U#!qܳ-@7h/YH\薲El@Zl) I *xx 23abSȧ8jt IPM0tjFyh~aA4簝LX,Q6W G'#UL6;xʦs@ȷ5~"0%R/tل4h! ,g΀C) @ htrLT&UE &ZuɎ|ɉZ򺃜_Az \6[G/ISJ:\A'iyV|2Y:i?B;} ӌ6:ḯDX'eG9~:I|AAŠAgg!h+f&N=PAoe3F:b7&-a Sxg.7p7\H51寽֖ l˘^ڡ:#ڀ.uC9 N9.F!n2M4c٘=2#4ȏI* rMsU Ǚ;%.$(TY;Pi_s=?jn:]`揆L" f?aHA,QhI%k>ӆ2 cHEu: ]ሺ2`-BI>g <|p4hŇT)z$B[VI"tQw-uZIZ_LfKjSqVoSaưmG{U66Py9y0Fp@Eea~Dwkc#X1yT6UGpZq҇1)(\<uLp?p栽4hN Mq M4}CM>j҉l~"0}~(~b&r"ka.zkþw`],aSRw>9AuEgY8+:gjY E ZkCLa\VPX!Ʌ3a[WW[ - 2A!*J x8&4D禒e?=6Hkky Dܧ#3r/Ga+#tgOoqL 嗌?WQ]{Ѕ,DMgأ"k@?ܽ2.\0'@&G=fT"N+s^LJXcR[r- L[S1ZMիSW\Sr ԼWw/;m|E!=}(B$ld{n ҶG{0 /·PYZCFfds\lPjV"cT"x''BKJEfǃg?wI!y0~r;0GX/%T 0f+"{b{q/$v"wٕ?k&~1miDݝTk|e >,bMk<DfW n*q ]Xp^Z0{g"oUv!4AU@;Pa^r~}7n~~,ÕhjI'IkAhNPL(-77"L@*BPPo4S/6V{_d5oP'Q9 (iqo`+MY축(ZHghJm<2Row⥪b[Mmý)g=^70@yϸ&;ޛw :3>YZy8u $OqI~D_nϡZ?I܃{q?Y}M*qGz61fihq=㇄w?7v [댣[KJ"e6!d*$.h78#Ч3c!M;yݧױxMSe&RNēP!{ E@p>;:r޿Hs/6JyfzY13OIm.WW|Z \;V#?OGǿCXjiiu63"Y\V{C`d0F?g%,cnM{ -dx^-G&G"'AW*;u`=8i;y)t%{?߂m[F0Q3$RmpG{DkZ:c)NA;-|Ob7dr|5,<}͡Y.sHy&u,|_eClqͫ9 {Mx>k cW v놨;LatIXg;bKS)>@Z ~קf#n, oY뷱)fCk~8Λػ]y(H+Dt:qR50YGXVvD+_ _%"neAC}!A/$.±AXbjD lW.@,$V&{V:"L>-4aI+ UƯ%i)lse hCӴES/}$xtث 0H|:i1gZ^qI'<2_*Z%1C-[;T_Vq06tA5s鐵L|0C?E|AC <+ӺQ7pF$L=h]X I6}j.yT $5 # 'څ&4K`,FK|tFUoSdb\<ެn|jrN5sK2B\ͤ .C}gG`[h~Dqh0}J{sifGAY:ގ{(iC?Y|"O5- 7(`S4(m(9OB?{g \5OA^kMChDyb""q0酭FmCbfΗ+xoҞ_|i&PCߕ|="iu^J<~(Cfy֪PXT+U *ଦ< ٍBKhm21Wo՛/UsRo_ vg@]-0+LܵJ!@=ǙA:%zU0I! j}SU{uG< &M/N+d.:^Lwen׋~rMx_KUŭYDԣ*X=޿oPfM+w">UP5\ eJeepovD7쭠u_g^o`I`½OMmЭ_IT~;R# po,Ov>&:ڿq%-:JŪ}3YZiɧ>TzQOIZ^|~qϐf?T݌\L;*-o'^SrnoV^$uk<^x,b,h-;(~X6o-kfCل% /Qy\]M&)֚ʯtst_+(RU G⯨USzP|5Zn8c򤕝+r>[PZ K4?c&jtaK^ǧ$;ExZrpA52 `Vװ<·-ʇ@5 %Y 1'j9Lg;Z,hs.o@|#=Pùos-?qfx)F:\Ǎ`D˕HƒA$Q&)-ӵzR}R*i[^!"Xn6xx|W4o~VG'ח0mk!¤~/ l! ;pR,+Ai}T>mެ`[үUl7IUZ>d7$KumŜ8ԙ̺x Y0hjuygي(ۛxlN[6*XیA?n"^xdT=/D ہ1Zi؂ÅIk&U*FpOֲHm * woq0(s4BpybL;!GKB*{i p|>cWfa#FpVPז 3Fwiݪ/} |}F)ZӠEQ2mþ@[m"D!j8c7MTRج hU۟ZKyK{Ihny=ssϽ؊ô_I^ 3]%PYSY%JYj47QèY =҂ԻSg({U{.H1K,z8jx7(beg1oJV 'MkȍhD& !/|ZAGO|]2! jݬO~ĉAY@o-.ۓe &U3C>**JC+3-)>ne=.ڶDecMEY;ՑP +qwzbMTU?gA= u9@\] }4轒$6D*,c@DOGx?EKfMOG۳Pop:Ȣ!/_\2hBڐ&Ck.(:G4l\^߾Me, ϼŏ㯃N ̅RDw _\[wo؈PhB<+P> :R2AkNܕBʺr!kCC_!P`^4Le%%C̟o?3cbS}e)&iF.7fYi4 q*z.=|ߛ6U'yѽQrs$z]/h{## Rig2!z c#hW9 Y/x98(ƿˣcv&{cqJcysg<8<.n=JyG+w3clQ2y~n X$˃GՇT赼H^uL^e+[\^+ɷI^=Jy|̳cNq2yl5;Yv&L{./+_I]-G)hXyyc^yxyl<.AyQ6 S,&Audq!.Aj&y$+=AKN_⋕:NES'ܽuQT--=$cx(6ƖP( ޵Y֞Է=ߞҴgA{64b %g6=X{aО[ sͭ =l8#=khIMs " n>_N{y'M :MQËI6|w,svVuK6OHEbTL܀z>ɪi?m:äqŋ\P&ŀ%/Q*:ze}LmfO :o *t8 4L<] UC :XhCm`Ad,Șۿ ˟|aV Bi,dH_E=>U2] )%gۂ_J9Gn6O6*/v>!ك.h).dm&Ϩsh /a9V {Z˱}⭳Q` 3x4aK1CYg-ޮMtي5M&=?&~~X'~#gFK\y߹PO/GwiA0hqO{[-^{HmG.0}uyλ7g$OCk$Vbpw&J aLġmrN!(l[Jq̶Y@Ts[X[_ Zĥ @}P-zAAT`$Nl럝n/>>?E]sms&Ac%cf+"9}xȞ($M47׹֭4~k C:)gAaZ\Ϳ8]S4)PtRnf Z. :1ԤOeyhm%y;$jrNw@汮Ei`Pۥ6?rv~GϩQ]~oUUǴ](OӚ 8M\4ΜlȾ'XrE*jG~,vX䧛DѮCv1l35(.\?ju_1OVq9]XsdSmρ\ '+/vK<9bND8L,j/]u]9h$&ϗ{{vߩb31O.'ƾ䡑4VP9^(t?H 2)OE;0m Y@}迧eD_>(Nx@H\+:EbmAWآAW! o(˒&GYzMӃ$HА 0brdWfr!- %$Hi˅wNgl?ұ@%0/Ji9Wv atw79o-J{"iRQ:Αo|Կ;,HQzНĺcF#;174PbwDNezqzV>F' lPaA춁}w[yɘ qx7ĸ+EELR; v2sgs/\Ky(:-߮0 yk-,Ja-,,VS2[byG:[<\PopSrU7XWfcD˪6SZOtedD~vZ;`KM=z[b'ig={Uqv{~O>8אX(zFXF3F;~g\V瓳z˯>\=?xFOC Ϟs~LF0rzOCJ/g?2}#}Mx ÍWks~uu_ۇxRxeUʷf)&Ybs;>w$~>OR41nE-w7WsH7yi4>=a$N{ZnP5&-%CZ~I7Џti9텖!-3r>/SZ^C?F%h(o4o /7ڗK훐}31nQT_L/MM MY)74)}YL󝶠St~˹7._=t|`VfѪ HJ,$Gڈޟ sFWu8qH>isGrt)tJe*4Rk7)iiO:l}i2NtAK3jܶF:Bki}ퟑsl9.4 tz-%Q%2r 2f22h 2PYB/e\bX<1}Rm[T6OMᛣq?r~ë?S{v5Z4X ZdQ4\?2!ğ+͙bC攫jX@_޽et<_2/_c)aY ϳ9J^v4)V 80Gy ΟQٷ*?^g1O巌?'qXzϟ'VwaZGzğ 92Q-EVasA8A_M񌬚}/3FsZJ <= oJ%Eht&, 9="R*~aX%XeuHNڠlہYwo6`+wK)v,Y.!pWOpolkpf ˸0N |ւjp\:хfL@_@4e f ՔN܃Y#~T[b(07~ۂh.璟E#rl,3nM琱7K\be=V"֗ÞSBYm=j|M="J߿;z772t'<+~k%yz= Ɠ:vy>Cpm 7/B,IU??T%L %P,+eӱ@w^ӿ\r2i _en2AVP5Icz\tPNȽ[BȓUF쾤x>f:H 4~lqwB[3{UA+g9ヽ"P}w(rXWɂ4f8E_M'ŀm,yv1[T,5|E؞ճ 4q.Y!H_(“ui9IņHN| c[s =UcTh%?E_%W=œjd#ViWјp$_k%̋8W׼)yRTA=Y x*[3 3I8)of?);?UMǮ8UȱW֌`@0 GR e%MmЦz]Y;Fq}; 7И5"N ĩWa?%v*V@&ׅ +l}$k+R_T *TJL$F"~f*c6) œT,AAQΰԽMXo`7[u35{rw3w"y(ϓ'c`#\h.aSΔs_qmJL$Nj1 2l\@ @ZyĿ(1@ udlrXY h{<" *vG(/K|<g* ޡ]Y¸޹_>=|.Υ /l57+ /<* 2a2"ݑc~Bct˟7ގ֝f%9C)#piфgF'3Ͻň\<,=Fr&즇 * +f]hJIȤR2( zJv AVUJDdNIQyXR;1xhɾߦ.f`_u^* xSF' zE ^_׻'hR/DdemJx|5Ч'Xtx &Gx|+d}KlIfWtH1Zq)HńW3ѿAb]`K ҃"ە/࿒ 3r!a Yצ_'L09DŽwq~Hgu^#u6 NROGXT4IgRqICs K N0?q4jsSXteZ8%Ew.E%ѽ <5/)R%Jp~wT60;uh?cTS'?D&s3FY Xa&Gts ''|BrJvM wk~q,"1 CxP b1xjwz5x6&YG72 SÀ~f_Q-?;h,?;z xr}W ~}!ޟn"YxCd! 1۷x/<4?9;1ޟ#t?{T ^?fQ7qM/gzD~Hw{BFڝCƗr/h#(9xi0^bxyg2^Ol4bU j^7zJk]Q}ߧ1^C׿{Y OOhxzc)~'}{3=}Q4wc3{%%7?}ox~,FpQA&B) f71o2a^xc_~s~=42)/V0qAzRoaWLT¢%%Fi7:$?H`3o7&ϼ)!ES=Fߘ{ A#VyS{q͍çj1|۵A;>@|!w{g Adž 1CX[C!\O5WCloAߟc"߯'nm^=NE{o+6_ۜ1 Г|eO ~l6]M'GoM:<~A?l˼B"glb|. ̴IyA#93ev!$vMkbxyTAXFJOƢ˙biaQ'NMMaזOUN(ƥtАS:G:,s :Fm.~яPS "7sh ]r";*LgQ>Ó' hPfxxEAҎ𜥇bwf4w~*b?2gsm<%a% ]VFÓzW:1|F츾^#v*v;}"%?tKv`"oDHROf.My'Dw*BD_yg ފ7 dlPMLF.HGaV49Q/#RU'@DaDGC9O7ea4zx a;1l~=*VT^?dB7x9/$$* I Ms¨GvkP$eI\JsZFun=:gl:rM8$qD#9%#SP3wj$:IIu*71Tuť߃ 'r@=FtvGI;$!I6|rr'mAchk4xI4> 3 |^DUu5J#TM~ڿ 1W;cR|_O4{Uãz?͆wOt'z'h=h=m0d]eX|"?d#A5W2H芨P!Lwֻ1{9iǫ WP F8G8͇jߘؤoGq?g(E-AQ1aΐY[0f[`)ϘY)H<\tLryНͪ3?<翑{M7^W{ 0f ɜؕ,FimJ[-"d&/i̤mBțiMh,p]7̖'gE8@mjnX <^d4ţǭ6k)n͵J'ϪMl6;REY]ietynrl;B lGUb.Qwۥ4P0FiJd>P;qG+n/e8L?+ew*T+VuR3մGާ(|nDgp4!ʟp\ s7 ]˜7ɩ 9yxdmЋYUiETdDdEȈWh dϺ6f YJyh mI֜+|TWT\ˆ sƢì@I%m'Q4# }У4nHdEEEдCմjDNӃHAr@g**+Va}4;DI  gjѪ'.oT}\K}\^z[}2GNfੴ mbe*kڎu:K˃zHYK~OcE [Ņu0v X1ݪ9Vq?GX>vVJή|Yt\Q2 !XpD"O|IonM;ǎΟ,6Իq8x^JPMI_L)#.oibr'?q~&ԜEÍ&]tlNpe 4i{U cIW 5B㔜&iҽ&ϔEi=)m$/'ri7)y~Wڡ-o/RXܟJD퇏-:? D  w@Nydn;Wv󣊻&KBY$k2́YñU/3Ou8TINZSVg!(l6\#ct3uXsI{xDs-ј㑱?-knSyܫ%wZ̃Ş6 C~ĊE4QgA?ղE2:r_o c?]'] ͦH B 5$,)% lZ 1)߽}%KC^|W)Y$F\z%d*2u;c{s8S/4c3RW{ GQq|bo|~][{Ϟ?++ IJҜP?s ?_(="?=T={zϯSԈL#8vht{G]3ƿܷoVߖw ά] 3;׷0hI6ֻwJW]?x7{X39 6r-4H,NUv}K2814[S^,LŷsSH5CtDws9Otig 輻 =#q^ My?Ȫ ^gx-&q*>:&4HH1!^&vlηT{xKz?=4A/fWdd풻R9g$UI㓖eTi(k96q83q$˕E*SPGq+J]B12}4A˅L2jU!7OT!@#;hxwF;m,$W4} %X4-?s;+y+4to`GyҼP2I|Uʵu Rp!8`R_*ToσK_tȏ5ƛhԇA&*KyO;0BPXBP 2W\9ڴO( =W&' KAl1vr ;؏P _f"Z5c-4ݚk_M yWD \DBQjt*E:_fsDw@N67]AΪ=U=5MC<5 x k`lwJTI,M#;ح@BJ=WPc/ S . ,}ԉXoSz0(ƯgxchzwPMC=Y4_E2M*kb1{I܄%;an <>OMҮ#Kkݿ]ʀ6!ޗ"V^ ZBj8i[(__5?OևIMOI%tbItϨ/^JC5K1G:)']TF P 7t+W0AS)'b+RxNP]Qi(AytnkWg耂z!z=}b* `%/R Ѷ,[eWZuCo&syi1Q\\)(K,fTh ]|`c6KA6b txhx&Dx-6Ja:0OtwPpY[1: f>c+vZDǞ+ۘpicL]iΊF bUhWXkBݮԍMNHQ.O4!]er7ȩ=T0 n{]t7;4sawXƝ&t -dKө ^7 ߋw.8 ZyÉJE-6#Evק*Nyi4w'v|.^V j?YNcFcfݐy]s>:t@wq/߬C^(L۴͂oM׊sseKK;+Kە'֟i ]pmؕtә\? y 4_g83c&a@.O4h8vJśj{ L=φc! x-w(}Qs~ ~/bG_z<}{OR nnŏdԬmK)Ssz6thG1:}G/OKrr.-M]?II-9ôɊLZiUtpFa30\ס钫Pl 1^9$ n`Ġ#LjnfFNNDHC7 o9)(vqJ5nJ>th)3!ojO rz[2~uT]){_;q,S/3fE4u A}Vɩ/Yܒ2̶9ofm>N9)8_o4UX񔞌8#jM&N9&G*l ;n|g)Ψ./'%BiMݎx)|SRs+jy~s4$ZZ+n_>U4`oSnM x &'k{֞_uӯ~~𼈺hgۀWqtJ9lEgdj{ Gbm8a Mqz73'.q>MyTSh/^~H\c㡾Χj\ƺh겣xFޥ)`KGEuTMbŠ(F5x#dZ-P?掱 a+XZk[})vl@>۴ad}3$/M%\gaMn b (q>~ PEJiK z1h-XzM@]GUWt^j52  fwhƣ%)N~Z'^aדKJ ߛqmwc}?P>-&Uq.x;O?nfPaWn.(xX睊x#3oRei%V-l 7@"e*K',Z򓯴߼HL{1p 3 oL>t\V Zʇ!j=!h %! H*xJL=~||c__}H kW֮ENէ<̤,+|fR"c?Ȑ,OE?s*~Sr+ rE0 ]ޥ-f% JbY [#_bⶶs[^"_CsA(n,'ziwKcw\[M?I~w8_.Lzy/@^zw\MLriUͺc^4qhan%˓w @_kP_}#R* r;.jUi+.]Lc;7 Y;4"{mG!af+/dNm\K%jrRuN{9݂wI"}4Y'&Gp~Pq-؝S`'{f:I{!iK_\I{[0M[,퓚~MO_I:^`t̝@5l4B/C&XX`byꬫRZN߮-FZ~IҏFi:CZ~4I7ЏG~얖o-zZhAMqc\i {?W@WX~*G/7=ܳqx# Ub+fxn ṛ!OKy -!n^)s~o 8e@'B?g_3)2ߚi z HϞ=_׫*; Y2[eu 5p?Ke8+˸n f YkNdFaF)Y;6x%&!X`9S/ ,! 3$E(`SDT"p|gCwPPAi&٦ ;}|ӕ8d{3!GdqJG2)P$?)](rux\.4яHV4цX`nf[Ne0¡OsR…ѝIV[cci&^jacUR21DUYt0#ymAiD9KjK(o,"" ~hS mQH' up!K!VDVT4LkkaZ ܧr~1ln$c{kGáw6m > <ڇ==shCJgorؾcۊ3ǏN_ x@W9U4g МZ3XGsi`Cз/H;P$A&0!t0D P Ԟu3ϝ>(oMuf ߬;ōɚ :nL K?A.t~ŮdQBLG9`'#$fav;efcUR?xD9~\0ySy}@SY [K&:u~0 \0D 5TR_HYQH9~QQ3腡C:M[sLCY@D[Y JЁ-PH?ľ%oĸTŠcWH<ZbۼڹYښuүLW/vnӔNņ.ߴO\wHsq@{1B?z6+fcH!Z0=DrODqڧsv>E|kD.Q+)WOSϓ m cic4{+&cDPǹŶz,ǿpy}4D+ȏӺe(x{OMk7-lvik|[('TpEpQ HL<h=2Y'"e_?%:jwt3JWI)WYrƪq+s]"m ,l+R_~F |{ 5ycuD+;GfM~Ǘz-Š'1mObDfd+-6iosT۱Vaz虬GO45Fѐ;ӚmѐKNE}~:؝4'`O&3}Tc^n>BR=HGB>ju<)w\+OsHKg;kfC )YT!}O *p.\ܡMn . &TD$/p̢gζLR>ꗯٔHݟzN1漗5ES &=a{+6G^ح!OW/oQب#wᐣpwP?` C'XΡWGD!"7PMG肟EF%8@1 6tI6mGo[&SLR:4ZZ)Cr<ޠGe:?n< #t%:E7h hkgmǿİ+_,'m '<ȣ(߰S4ݜ27|~f!fSߑ 9;Cr@,1g0? "Cc.\09dѳtuYZC~\|a;qxsZeŗ0u7 ?g\R5T%IOc3\$'_"Q w'WS ~xL1/*KhP=x63zܥ;K]FRiCv ҘtvOI׳F#4 D# |hGWs!e(}%ߙ|OӲO5Fua:943rd;I=/}+[vG,c`tߡdX(2( Z$QRw$]!KPC08ӂ ?_txI92ΟJT|P'{s?6=[ >#jux~E@Yl`Wj-c-2[9 =1;pIf0&ahi.ZTxwdcNӢyhg9V>XJnAF}(2M?N PYWѭ+YD,U=$[ U8 g*hĪw?!DFx#w=>HZ܀$t'N&S_qh &c#Uж}ʈ5o.DD: -6'~ctݽ_ݽאûCʾ4,.atw俍ax,ݑ_amRȽbզ7X|K1:{1:ի.:)a|ն㫣z_~+cny76]jƲ?W} ՍU{_}c|5Q*v+m|=~[?ꃾk3=Ϋ/W_ 83&_J|u=ާ՗_=O?q|uk_f'諆4>^z_ /M_]?W4ɔ׋dnAIs:˷&*3+sB;_ӌ28VPsN8wqx}#D8FG-$}ܫ7U*mwt6^ D.kgp_#S`6\27nbFyP)i,}%{=שUyb 㜡{GZ)/zd8޹Ylq%N[MQDj4Ed d ͂!WWRAXK  jS2J;s>Zx9E{LY<|}^;Υlr>N }z]C%;Z`e>n&5U xV,^[`w ]$q;NW]*Y.җmlZ<&R;z4k q4iP0Vy`dsT7uT+6!,OPδ鴭,)@ҫPxadv! s2Y*͘ɖ[?.) ʡ-PZn])D3N'"I>Eǥ0%5t-jϐ4[#Xu!P?~P%bdM4|Wp2&9,ʈ:t72C]|8ӊ{ʑ&#DacteWXb[ldQ<3.b;׼,E\ZB 8i~^b}Ԇʽ /p8*Ww$޽dJ,;N8x WTJ}lѺ/ܗb{/gg*xԐ i/9h.,4Z44VΗA!vɉ'5l9 n?4DTI)eV)Ĥ> ڟ'ȶ뱉pF1X"/rwtm& r^2S/RTW¡s>Ӽݩ"U3X(WISlʝbsUـ5[iV\G*R`4̌B}ԛYt%ѐ#;OX vFmAJ3}&jr_"U@FsODF2 R8.a)OY=43)ݶ(ۚ>Efl3" *9> ̌@ZkȧCup><}u9r?}Sgős}?&3gVBws1ݬ?FG鬝O?T΍)~DO ?`L|!1)?}yO?,dTOw"gkpDCӈz?[{<.M^?S {٤?1mk}Qh\3X[UT?lje!? ?$'-SIRW3[%誡bFvt &SGBVXXB =ErWmRٳj=&>K{u~n?bSCb0K:"Z5ms`+{PR5Dl-HJ,-{&֔_ro\6YG_oڨpdRѽ1UG FhksXk#џKu]]} < Yy^MȹƬ`VcVcV &j5QӌS SE a:;4f?Xa*gӫiCL+t3X+*0-REL*E\Hܕ S0.;8HC L.B3Y(B =EA~rX~>/_*"N8ɊoS[Nm( gcgrDkgJnM)ANjgMȣ*.ze4$)/ 8(b6 M, ְ}%݈b/)y֛ &_._.ɏ9hՕ]ei- k}ZU'=Y{=3rQ&F_I4u.l"VLchVRBR<a6R|tԎOQߙ2*_YWP/o}!*_DxT(-h9 yؘmCi?v\EE!;ڻM_5}rv`]@Uʄ 9LZ6ZI `R|;yY6y'c Dq+ѽ:pb\eyך)/]EvYrǺKo)z^elp+7!^EZ2cϕ ׁ8ƺxN Ykp,Y_<[!?̬Oootɵ_Sc1x5,u IXn2;ޡX!b,6^N!wH SpƽVMք6:3F W{.Gb5zu`l¥P9kwܕk7A[з_Y?'~*9@UL<`QRvnPfQKe0bVRelkk_Nr+ʗI+uT<'m P*]Q)E탴"-(J]t񵋐*B6XZjUtqŵjEP-nyQQ Vh̜sonnm(I=g̜y93\ Ӹ 1)Є,gwJ:q9mzѽ~)gP2;sa`NkYBQft,+WR2_wJZ*ZKD۶>^4qjzoP4b8^tGNԱeN;|Xh[/Ʈa|- 4sr)uYSr'h\ /ImAaeK 'ӣs;?Ppr#]A;Rə0%LLIHDwX_2#V*qY#cbHR4Q_ vFfsI'y_:pI?$LPRGO:?UNkk*um2#̋=^R"Y:0VAfp93%2bz2j>FߞM: j]2CWMOFAFMbB,gcT2˾Zo)G%kE23#ȕ(TQTMdz=^CG"A#AH# 0Bػ®Ǡ8#`- _@Rn5 $|]~^#5~cżzg0Zk-bdoվR޹Iԭk3SZ8 U6O[o{#PA"@ʄ*"vhuN)^.((f γublq +[_8':(̞~ I<dE5uuDJw pzg7l`z nb%GbU|S>a4vU}$Q'`MoCmuJi[_kJb1R7` J#:hDVvxK.\Tn&;3L&R4X8ocI:G?tg|yPc8 j*njhG.B0uИcTZAO|utz@ĶTo뗱(:3tduETve pݪӰ(2zC|c>ZD/mS$ˍJ=#<#ҝFC. QVԻ9Y[tF7Ҿ̠7n ;0 d\ i5bs[Gj,d-Q[hVb67;tQCեʦZ㫭/ioښyDĤ<HAaˌ3R_hrkVJq2P6D*`涵xJv/I'x9 #(>6Z4 3Th'aj=pG~GH|ƍ?\"iZKl}Z68_H61E?v`c3O=;\W7~1{;jXL.6i<;n+PG\}DWm:mm&cRWZ{p龝J_~'bo췕;R/1YFR84:@Ie;yF<~wcx|x|x|GOb/^ )Lp]7TW r~ ͒&Y;0.aMEtxah2Z̤oK8*3D Re(n/EusE[iJ pQ=Dh+|6T`{ydH3cl Vrb%ƮAf2j1)G ,^0]D:U0\_M+~XGyD/b y<2Ԍdh#L[صF$oeLj@yラx-S 7{d88Ϝ [Z7@` 1+v*HRI܀$ F֘_/*J8K適ZjTW`ߨz,3Gjb*m7XIt(VrjjzjXޕh] u SQ!Kna8|P`Mt c7To=ox<..p .fjXOZZrOP=[Hٶb% ?K"9 ح`0iz ENp,uEuY1>5U3 Jowc|;2\?0 @tll-8æJ alqe6DWj]ҳ?WwCsӏǠoCCcߨ z&?-z\94=}w}Qɦ 4/s)sd z =ZMݧ+9IDϣJzd|cp4z?e_[Lz1 zZ֓{x2E@ٜsX='=w,=GŠlsw9Rq%=_Mh=w}gZum3ۡ )2=GN wN=݇LMRг[kdzzj4zO/TX\ĪTeZt!QI"i#)-^".%I$-5zFP$-I8é*yVp#g|jIj]3z0N Z%1"DI+#X,\Bܰ9KAt9E'Bc"qqgЃюf@L$$V#x;c5;%J{Q;qm:Qn^wJ\}{c?o:;|Y,떾&SqϣS@ߎP/)!}N}kAπ;AMGOU| yg9AE7Xߎ`;thѷߩobsXsgjzVoW|_4z}şy mѴp ӶL-yw[ߞ#}}}@oIdb}~v%T{zGϻvϛ=WN> {ŵ,;1yosn5=Eݲ>J+=M*zF'r~}Lw1rbw¿뫠{?;.9&1=G}X2fϲU|$RjmQz@4.4ЅR%1)gNK2ㆪ`9S1Ӷ[Zɺ&`kM0•[X\ؕ%{d᥊C*`}}-61ީ%Xi,ceL'w£pJW;gbM)g@ڏ:HbsaVr<~ `@ytktytǁ_Öj* a!!B44~7!)"XuA?_e6G/3r=ݒas"/ B 뀬yt@v.!Rq@brjs_F +%ǽ수9(ۉSmوv&鸭ϫG=|_0a/ .v%1K]_v׳//=7A?tedK{b K'}v%YDф|/ isl'3/!w3Cn\us3cJV.`n2suJe-!%ƝѲNk%LuZAr ieJ+=&T114f7\kR洄Y!g"%t!ˇ)[!C*\r`[TCcdh|}@Kz+UF底KKh|1~zhuF'u?iw8 Se&^T[J*c.:|+O$klظY-{2ϵFY: D,6ϡIO)ol=_$/:2n>s΀#9מ-[xs8u:UU=qcEoRao2{ dLQ9Ỏu׌x- [}0WRtl2AwǜA, k|r"{t]ʿ1K/x|KPbeiDЬE\Nb'?+kBj\)b_)svBʾd5SN $J siX'Ty#f_?G21nuVyȎeu,e-XUK/IB \y^X୯"V [<血g S&gTŊ><?} (7b+;joS ׆]eíL< []QJV nzPbb4C`=P"ѺFmÑwL%oW?yAU?W#]B7lRٟ,wY?'Ðǐv?C伲TOEBŊ8q^Ty4ĦX"=Il !6 1Kc'fI\KeY(bOZD皥1f,71䦇M0E!β#iCOk?@~U~pf<9i_b ur)z57xCTAz`6dLv~8;4vDf)Xy {1i?İf/$oܒrMx M:1Keg~ai~tpS=P#{[=`Tք]ot;^$ų1-ĿjEgqmf|8-)3df&={2SS40{D\nvy`bf;Fܼr_˜Dio*9D8׼r+e~">?:;Ps(#W}a- ~>92 V?>WD,ӝ&֥t ~ ? x;QF6Gޱo!3;͝ͶoB[Ȼ,ܢnv(Hj9ku9YqCȻ$ȏ a]|VXPJ]F ѷh~H#<vK&0)7l.0V{}9X3RAmЗ51HVȊ-kx(hr*߆_S2-Q[,XXaݩ@mqɨ5(PAx(.5^i]/We6Y sTx{@+ebI6x0 SE_uOE Œu6ɟߩ0HGN69l>Cߕ{;4ߘpu >2~a7tOJO[9~3[W${M|o3[6X__)0(,ՂjTxYa߂r}\`Y @s{0L@\%mكcU/Ys%Rc͟fׅ暓`wN`ZUg݌E9ґK̉½&]pCam5KI2;eɒ" MukV_&?{/^_#Ni6H,gMVb1TG#Ȏ Ò"TLX晃iJT`e2;CuR Kf ?u}heL2\z| ۬c诃_kck-irMw]{&ǟ_b3?@=}jmOوCf}!>|% `Y3fq=)g7؛"s a(6c$+ >T[Q9{V3c/mn(BҌdMB7z 1, [3۫g]xO7& >A r֏$z;7UY8mgT);A iЗ*~_MHtX=+zV']BkPy/=O.I/ A1ֳl~;ΚCٯM62ݏyN"nQG/NvkwǷAN=^7zdrx[pW Xq\ch߼ ?kz>b0T?B+ZcqFՐlqsy+~5Z鋷^GA_l>U%Ehad;ej{~WI?EtƕSĀV0+b)xyB~ 0 1aV{|Y=9ҵuzќ"Ũ2=[ dI480o=IԊ> 7<݄3<Ǥ.GcAq̾-4BݝiS6?LmYr < Q Xn*;um>MǑR>@61QѦmV)(/Ѳe`_Mhb4[$[qHN0[2@ԼW)AGű5aE H`*%m,qA rN6:;`kkP^ƄΗ#l* #:Mz* /Dx14q8EGҒٶf`*&P/՜]AAK/eVbNbZuhkFnL:i0 7r؄Gx>𬭹H704ph%},-ƕkE LÜӲXi/ Im o^ f  ak>Dv_Ɇ`dj'E.  oOE>r-H>TDZ5wm/$g h4Q[oو:!Ҷp6sd̓8uzI8omds9wbĂ$`$sN`.2'F]z~:lbtE'y,%N`L,-} |1G [@=슶[zKz\fmD#) GTސ_r}]4'Rş ?W*  JgLF Wɿv O}PijZ,;׈0Z mGw5 FrDE{'~)AKpS[iAkճ߸ߧ)rw9WfT =ې Lg/atQ @ ~B L$_*?q|bD k`%Z鑬V<"(a얔6KmZ&L)hXf48OL:dzK$7F`%ϨEy wv<v?3X#xT#\5l6I&7p !,lǔ)u BI$p@`")|eLvi*f]HnXCg^VC12!:'q XNCw11r UZƫjYK}y rޗz^g&OcgԄx0)5ҚjT|(!̖AF0|!b7-"FA{! cl\YM M||436tifi "jxxٌ\l>ռ%, iKW_I_ @~a(iARm 9}1vɫYͨS>+T`D>hC7k@L7lY I<mn3m0i;39fY^!Pj'a$&ITh#no [\OR:GPˡE?!`Ȕc1_aK ,eۋHqrU?5ůyywh- v_F|!D/ 년y^LP ~q} O̅&_B&pHJ 섟.1)(+s+LLZUOBDGSw$hbK+ِSOΔj Yx+c`J+!x@0x0 Z. ]g{/?K )|d;; )[fDfɏ`y/`ܐh7L/)EFl;}1>lF*yJo0K1Ci\FŇf!%02axw0 i&>- +sˌ—_Uz<<FruF²KO <Ft B2@a6<%c @q-ITy9eFa6Կ_.0 Htq$zѷOuڶ@C! ThsI,nj,[PܕڒЗJJ ?\е",[DI$\|uj(Ƒ$}ipYzw)K}K#2bcU ?9J _ʪ͠3Y&^6[B3mP|KQVqC8]NW,$I<]`]|^ &c!GW2y$.VGԠ*$'2OH/KИ ٦|y>ދNa%{ ɗ4?V%'P[Fn>KV0Za2]vpZ7XO b9&!SΉP~0%Y~j߆wxCJw98aƨ~PYt1G{" w 6*{et^SWThyCj7f9.;kjU] Ӭ%3SxQu,2D\;2)U oY1E'eT_';8ȧ_E`cTY6v97X0l|x1 ,yj! B4m2Z|y-m)͂ .QfL]laʍ2Zᗮme>; RJ~[ +FRޕ 1EHqDԫ2  dK.AQ{b0twl8L5Uzg5V JRKyxd9g"=mBě{+vۚ"mwXW[9kž?fNP|R-cMC&[Ơ&g}#g"AQs4H.ΆC@&veK +D}4٣J>MHFR{8H &IS$AȌ/E qLOSz(nm5K83uv|$b mJ!r|CֵX_NJx 嫣߉/-gk@N#  R"H4'K&-xT{9JiY_GTMgbrEMA)cPصTŮk;RaY|ty`(<8x2  ,nʃL MtJvC /,˚aHJ%*ϒ%ANkYs÷dE[֜W-x0xfI1"d] ރz n]!`P`.2ĨZ$_; X8C$2 $^eVa=sym3S?[% f u"#=/;WScTi/+Ù8,j̿X{@#Z.0amp\6aoifKBsjGvRg(e<߬ R &ty1 /Gf=~n) ~C`jkFdS=ި[gfI0s'?Cx㵫?doI%lyGTX$y$H9^Aר?"ᥓ?lt$7!?]%&xEtO'gb?.zA^= c/yhd Hm">7{d^I3e'?%\t7ǚϟm\?T$TEBuS#d_?gq?'BI^?D^槢X 9r~)bW#?~R_t<9T*:5M?<$Y Xގ\^r-\;!`QIk1[` ෰Jd$cuW#{u_x[&N3 ')j>s~+b~?xav`ߪ'vd5%>s(7I;?^&Xj~(Jxvo^ g>F7k53"ֶY3Y:Y̅O΁?]:Ń1=~HcRǛuXWl'Fo`,PԴaNc"=|<NjcM|1QH+R 2YG?B 2Xuh/WG[߽"֟Z?'bOiz(9'0i#C|C=7q+Uͧ0T#J>ǘo!?&!6bW+n*>X5qkU'3Ea޸f:q6xob^O7F yz!:qm1?IC>9vmۅ[`}S{<~챩A6N.L|ӛ|T+|Ge,mU #hruqVo,-;|v=XrE>|gtX`Ykiw[] _Ui_;CMt;^x 0n? /SOϦ`N%/ CsH(~wH=:2~13_DN 5׎tnF[| f afwX*f=])X|&nhm\<7,gm1;Q`k"m3>DWSJ' ֑h4`FYbO=˞ b&u9=c6ez^t4|)'CaT%ݖXK(WK/C bVusmV: 7f! 5?("lEح&\9='OԸ&WwTI›PYv@}ߑh|Sy0k_8ԿZs9&>Huʧw+PbܛaG ڔ7Y?u_Z޿`ԊD l&,zCxCs9),ADt^ gם|hoHmѢ^&FsfɰM:u6yЇ-_+H_(N̙Ae3+d  ZJGȗԓQRx?Z~<1]/`Uۥ6(,& ؞ҡe$.5 %|Z̟#Ԋtv܅:2_"vxXEs)[yV̭Q 9E# ‹PVpQ$x ,dcVJxKeGYP(%Iڐ\?H2a0sF ~8 b>-[ggߍ%['Μb֋בrw]3Ӆl0SWҚ=ZO)bx/?# Z>{`(LQh^D8Tۘ1:^foXtl€i1/ݒ*Hjʘ"Nŀ0V?0^`iog_;DL¿Z-˱դZ-6i-vc7C7[_fGUND+޿l  gQ,=Q,)唲:2h+0ysvnYjIt?> h 8BRb>yBtRi\Y+I͗j`Wu D)uU.]cSE-@`g0ɐ.A.q(&1&l `pmh7CK='N䤄Z 2P׹+լ }+h\]MY =ஸLi/r8$f-[Pqp`~ ?1cPHDTt8D{vY5zVPd+-]*ޏ&ߤ2CPENOrCg+ f.\5aEr?WlQC¥Hs1Ѯ Y3E,qSKnѭ Aa2`ak1`ii\W!fhE)d raYB5È3"-ޓlUc.C1A+"B {!cw&0cï\co)ܓ2UG `N=d}bNj/(rp! Q|slF{=.XD6:;vnStQi"gR}ު+eH͋Q_VYrlk_Oha(P⭿,+zq;W\_՚3|#s`rpOWOG€(\>C:Mы EW{MH8kJRm*j9SYB^vZnsƓ-./ޔ_cpgGϔvPy@R9##SB8uZzuT9S*?>0aN pVGz19`SMBNRMDqC_v$ 98o|FAUy){-#dD 4,9 +%s5|Y89¬yN ’bX೜q\+NސRO˙k|0纅t{5ԊKkkpY zؑx-WbQsΑamYXYxZj[t%=WQ)fXO6wMph\WWh -%F*A9!^$j3. rY=8X˷2&!@rNhE`CbT-hnA5%`DOspܜ9H4X%sE>a%@z mZ5ʋ g؍9 ́ڕ,8viMX0a8^ގBY]kֆC_ʲ/, (ۇ?mj2@ґ|X9 [#ZR'KsW ՖÏ:5j3 ?'R?O`;s:]TsW55OVq|y^N=bprZl뤣LBԑtԔ, $ k:Apyx/M=ˢgS /iV3ٶO?=S1]}k]S:R?Kd1?*{/v?Ց1RNpN]oR&tH?Oɹ?/Pp l3 ՃoUo]g:[OŇ7z=e=\y_-2{/:{Wÿcg3WUoH'/FOX5PM_e Ze7Wsfw~ =(N|M#w~|ߜ8@DJ -o1ˑwwwW]Fu u(VaV8k)]Gy$N o딢_`ܥH^*;YG]3Rwh5NKz=$6{T0Ṕe$,s[qm\)~/erskStzv[uOhR%gA˦ݪgl VT P_Dz tk8qAh8`'wEhh[4VJgbU'$廴x~ ,k] (%bi^ zU VZ ꜩ:!ԖȨ CciO0΄;NahQ͜qRUJd.YVK\"qEA |I\n+*P7)sGe۵@ZVAwI e%D+)oQ%(GtDs2:gpl([uX^)f`d%À[Z3 lƟGGȶU*̤ 0f]6yJ13% SPh^¶CP1[qi)|^#Szws"W)(}HwϠ ߠ&5" z>G_w 7N1?捈 |YLjeiH,Yz|6IDOd2$'m2|fF™?|L %*G-3'LC vC"vҪm-TmRox*cE9d-)!5Mr^%dA7o"ҵלDz`&P%4߂풡[9Z6icu@{1ʞ'1خRr(~^)&~%~.!eXSb}pn\|ߡ;+G~ ]6bSX22]m%f L?ȟZXs[;B!} 7)8v'd`fsGT9~gݱ]|s?gp|4‘x>ϼ/Sָ6Vݯg0nc95v t'rsTQGZZ2d5SPE Ra2-Ul&d9G UjH>gs[  bIm&&SM9UzqŮ-ե=<* ؛j*_LbBM1{8>zL@ z[Q>ǓE3mj}3a Y2;jdG,Zn^##&09{ݬ'Ѭb때.ɾozXXN,O0*%Z+8 ?wO~12o{ 9 -?ztDgva|"; rT\zƓ9<"/m!}G^<+d2"Toc-7BOap}y|ɗ807}ͰhdzekR{~K_I \M Ȝ8> b9seId[|M?SGFW^}iEPG fS=Q쿷#1-T&{+0nQ,ř?EX IAƷCa)dv662$tbb3E5fyg@L$AՆ> `-] ݴ?,l,a]Q >:x ;STî&awP2 7Lp[ّ||w/Q0(YuQp~G}'Ii?dD:W= $_i K^\%)$qąje6zd|rLJ{~ ܨ~'A3Cr2GLܗ7VLgyxjm64m0V٣Ƴy< ȷEi5+BF,@Y6LyvriGOEV3]g:s |xkbSoK3NU#W$L$jga4}Jf ?o1=^u^z[%.Oz*!&폼D/swR28H{{ E)toZBe ^&^~l7}ƠDSpOuB᱋RqQir~uci{+TO ^\sJDLLGSHtβg'BROߧ2|/h:Ϝ|2NT{Cnj4 Ѽh%a6ǩ#Χ]3M_ ޻s:P5ˆ®ʹ8©{]?( LS?]VC Y@w]4mg_q ă*5?!?kB[$<.,{Ը }#-'lXޡS v-<&kG4a`x Qd%So8T?,û7v)zj 晱~;#}PO50 ESK/䚱$&)WazVXǻa(7hHTLEiX˸Ac&LGO8"UXs9mzҢS7T<5>vYc@>h>'[; av7nЧZvu*Fᓂ E?KeXtqg:o5JH8# ؍Ŏ6üi.v$ n/\8AӻG7;/.9R𚷥~a,m[sTJg`,V_h)2˞qo.4fiq/cyIDs|x0O,s1ckg }pdtgpp$z&qRHtvW56|A!(de݌f0rGI-f.Scgd GH8^hS)/GƆ$K^&)| Lnu1D8dAxoMez6Wx6Y:oʌ{_@eNF¿7~BX r~5}"؁פ-ErBraq6%F1m> \K!\=D3Iig%yI<6#pѰЭtvX6ʐ^[ \n ݟ@U>Y☾,.v幯D|H/URMZrZ3F4%<5-ϰx[-!5[ļduzqaqU,,8quTKVz8G"3۴]%d]*& /yɍϖ1P%T.KߗHxt w#pN'8cha,3HU&}D;=px< ΃\PɻլFςπ&oz㚭خr%:J.P`poKJPIN*rYBEpKX"LbN2L!xkֳ9p$If~f͞BNˈ^1}d* Z~T+:GTI5r%$U#mY@Y%8 5h WSVy7cxO2֣DAlmϜ|g(,8q^ 6m`DIc]ӥLz^u?Bt%!q>!jsx&o5]4vm XaVdZmrj{4EݭznMas&ަ.Ѻ[[Yrl>k׺ 0K*hZPzN-`|diǢv ٻc ѱ{w45՝gY>^\FU?FvzXCGD.luo'#,y8$v+B@vjwbհڀmUmrdpgzAhH`WI`W`o'Q:*- Rm'8؞U XD0]t۰7h`.ڷc$Ͼ90:2T"0@]Dg!`a8u+$tNZMziw2AFrݺMYf\R?F/ְ6jr=t$R꟰_vqR׏" 89/} xl)GOH xv3o%~1Q YX~0@ A[yY `bXѴ.$m~CQtXAI/cqyo^~!ɺ֬&t$E% ~wNNdgdIiNdt{9𔵐 cQۮUr0,cU>]߫/j-{181gXZuAC\P @&&y)u"h%O[Ʊf cō!l[^s;"x1h‹A޿ Ï`="nϜwүc8d$δuU! a \PʵJJaЯp#4lq(Y㒱T=0w/e~\{_ZBi.78(9pY.oA^7{&Vt9f[tqo^oZPhS.-"Թ mEYA.\>Guŷ {A79CS[Ge(|w? \rE:0{k5ccP6N.]3Y4`i#t,a`~vޭDΔnKax\JT<㬎``v(|C|e0>^%>a SL:)|$y05> R|P| 5>H|a,(ZcM_">;=6b8j5KA9~G@< 98%685aGgcnvPՖ9<;FWe|cwt,t=W]1ZƌQnRNj7u&2Ru/ fVi k2ikuɻq3ڦcjǛ 5}5_z YKD] ֽz%TL@6X-/IRL$ixBHb&]-tY,CrM:=;(/t>C2 3-Gmr^\c}Hnt{U=yhL5,-@q|Z" J fPqPȴ[|䣬H, KjEϙ93;\{^{K؞t?yyI%EKH eQElY"P:,N˜x \\yJ (љ^]҅$^4څ,zuAo^0"YCj{"G3b&l.<]7a|ġۆ,Y TU(1ށ]2T 2̯'chM .{V2#w+?)L@Nw_S }4 Ǻc#1؅?vݗ.U2?Ohg$)fr-flJo:IpL/k70o~+8^~+_qрiBnv<ƎG?h:A~D~#m 䉠 lRx(f} z&a =0IC$1>Q11>i14˜AO#ƤG6}8r})n(2KR.g+J{-~od7[Gt'A N>?9{?i>KBNR.c ^~g7M71ńAkOHs"k?'Ip'9imGYHa}̴uʹš̷Dvt7R9Cas^XS>9>"DK.[X/N MSoQ)}(=FHOKQbg]VN¤LB}*x`*M]@qE5I>,z2X)ʚ}^B~ xxl؄ry ~As@Tc Qq*j1K{1ޏ Mʋ ʆʋ.7 *5q @Z3ɜVcYk5#3Շ.'WvOC8e?>0d6~\ cnW'4cb*yXvD$c;(^MGWj~NoyU^ oHӱ|OﺗZG +j cQ)}ߧ^?{Q;?>ϼw(> fPt͒Mvݧmo۩_4? vOo iVm0}<;}w͟q;ۯq$ͦ*^7~qw_oXC R7O号7?Zo8~eoxMu-Y5޾t]oS4no'[5Mi0>zA7|^3Y7k'56j|@yǷ _= g_]~?O.Z3kk~xS=%T [q[fnK[nRr?սg^}JBέ-$RI5*hyb-U!pՓq89E9.Aj˷^ ǟ9>^e9r =$TTZ;:ːU.:\++[ Q7d-ɵ`냌5oh$ ZW84ZRۡatg]Fa 6<=,Ƽbd*n}ƺ(B.uYz۶DTk HR^?c$7ʀJ'!j~gL~/+a"68BܦCmOw l'׺\;|nl[@mDC_ͩ" +І#a%!a r[Iُ -uǕ<}hewBs}vZ/}6A+s:$}m>D)>@ڼR,m>66:06P?OC;XI0e0Vi {G6ᱏȓfC)Wp@SG|GO("ɼdMc@'Q|׬hg]v?4"U l H,qgSw3[8U#?tUT׆bq(ą\)!(h KLr7gpV\Cy>N49Wp9*^sKydz-qi5>זoO@xL@40χfBg({+WB/mX^ozN8?ȺZ^捣#ǁ^Ѭo'j~ 9"ō mNxS y3P{v(kh~vĺ<&6?< *M)[y?Eh -cb?y “g䱖F+t]N\2YxI!LK(-ayN0 bM%9AdOA,w<~u1۹Z)AZ +`o] /ߢ(j<& bur_J`&Xk.M!܇btn%yQ?KL!zˡ4Ĭ{|rWꥁ[ 挦-b/-[~_vl^r2vV0_j kl|bc(oA8Pdy~C VyzD+1+ZR򗩦A^p?x#,o lݖދcTv?"Ce @ &_r_N/=ǡbxK -v:t)J'(R^:@8ʠE}U?.xr3݋9c uv=$"m]#Y6֝l!QO\I!F'+CObӫyѻ|3Um{1dH|whI!٠)]u<iq$0<=[\\Hpa%Jf~—"0Єd:9FSX4,Jb(O+: ɖQQ*Hwg1V'"BxQ9JQHڽ 1A%25c@yWbN0lFg`\+B݅\&4982JAj` _qtvz؈Cihy$[Gl)ٽOO cs$*:@ y)t@{pj˼(]'BH#'a4yU(1U.i˽R ·'8i%nT,l)(lE`UD&Uu$YE(K+Z{E X!,c+;b2pn~FɨC7 Bޟ> c;*cSwnaM/47"W;O K0]L??![L _Z~C|{<캶ҷ}/s044}7AvOMya<}NrۯJ05Yd_=w C?d Wy~ÇQ珖e(OOw!]Y j:|M| ϓ'-qo'+iCI[|?4?zebζe)eV_&/>E%l_dhG? {7ښv.ŗ~u }iEߴߕ+UW_-_ov b3ѿ?;T؟ٗ{Ǐޯy[ r߷LH;5]j]S)nI >w@|g~TBS³>~f/O}"uFIރH!?ES(Z7maxL\2~GI yK`;ݺ- ,A_|?) /'OC_C/[@@8nBDo"(\au4oLB?V[,MJO(#?o?G^ÈSC; _OylNr%^ydMY,]KZ_kZ&y|~RY^w5RD $}9>(^_ӡ0#Jd̜ļ5Hb2,>"p#1H8d"4'?GqF`Ӓ5WYhs춥YQDiDcUl( l+B\"ȿt+Rw7wi! ߍ,\-w  ] \ h$,,&J1? >BҡsdOM@DqH|rІ瘔kabDefJ"N;"rKbF/4?U2 P9h;y=vJ#ɱyx̽BH#ܔFf9Pݓ?!%oC/M- SoКD%Tc{)s\#q}td.yc]#%NH s/}JRYpN8-an:<57`xOНyOA:oZ6U%uGF5;->0^Yiص=6 =J渂}a {?l%#lGkݍH]vH04zt H5 7;ڎ, ;;v7Ham02i4]n||'mdnNC {vHRjUq\?<< Ǧh"ϳ v/@|\ψ%b)ұDw_O~ڏ|k4tS6 Nhm$+Io{Qw15~QǛ߲vo|-8'wf[v5"+6Fؼ|7w"/ o Ϣrߩ, }f⓶08M-0Ǹp[A%7[Vl츱3{?ۉwm0flAc w RTx`GG?~DBP5pdpihl19bۋ8|` AJ}s\wsĺm<K5Acp.8+)wlK!br3z(/Nΐi $yCJ Hq-ޓƧ/O{' u󗒢w\$ ߎPpuJIa6(vgC:sxJElG/aɖqq'7]#ƣUs__wBZCt01$aGqD̀ HoHa〚H{<"$.^vrO| ( IkRB^SH E{/SEBaډpBDމBAWe)q]Bow/-;-!"Z,_wZp`HN f\?i5`@*@Vs'T#%!MbGC5)dvLkc { BAMѸ}9kuе+_@̋&٤_M'? ]<U9 Ai(ZzΆ`1T/sqVO"Ml;bJd\pM4 :"-aT=m-pۆ"l)-qf Lw/ڤ'FzK;05Xi N5ΑlQ!]ߵCi}ƖofP)q~ }oNpOA܇-U1![2ҨI-׈aY!1Sm( 6<2DLSOL0"L`ן92'_-9.'dޛ虨[p{ _B@qZǃ oq0KK,~/<0']t.7Dw+"%8s/>LR (فf 3J Hb@bpJ(vp-u 3 m+qB+@ZWa!=`t R?dkaf85z[lo~%] F~f_''uNzpW}MEh gqMFGmxݎ[\r'ΉVES1h%-ًza"ؒA$Dm\EWFy}%EJ^x+UQ߅Owwd'$TTT ٺI[`P1{%_TGEt&+#XLb1"l˂e&t{Wwu &Gղhz$bWwb* #,d۽ptMj60p{DeefLSI'/wWy"mUƒJv&^\^'`#qK"f.zӓ%o"_Bw˾ˡ'I ]\$E6},9MLX$uصXy 0]b"h5W7)!E ڤ)'$;7!nN.a a*Nْ9P>'mv5+@F|f*!#HޅYuLD+?\(jUAW/fk\=Fo#?}6FRdHa [V?G?y!7-/4ͭ¿Bo!WnOu?3S,3CXSFRV῕S|k[ݼ#G ,?M3|wQFs}DҘk5&I`~j;[v/+ʶ7&_Î /~q!4:w:}Ců?7tC?+!::ѡWʟ!?tO::Ϸ6?-ujtApFTG#)ԡgFxiIl5-\{LkW^OV-붕T)8[_*J&{wNH+&WA.@E~O+eq-=ng#ޥ+.kPZ8~-ibjEK}EpS yg<^0{(C3n+kWcnvf*&*AwB7@${?LȬ-{s{M=-88)ѫfU')"9WyE$9)H(>Tc7], |}{gǑ3:x&}8wGO] !1@RaSA(_O̧H.3Ym(W͘GI6(K X+ Cj.Y/5 = Y5 |3@}nLZL~* 0_56OŶCm VTkEOlZQi:n![)9egԕ.R\I}xi A@RIh1+%} g?,0>>DsDžA:k;dact!*C cH%e~'r/nL͝]#Q\ݨoDI C+ʎ˘qb]^6zv!Mõq|Dz~}5gɠ 'J`\Vo c CW? ~I&ŷHAKt}g<(ni3n_ hyНYAw?5mm~U}?l \$YwvxUJ7<5$=AWqg; ]7x w=ySgү[e=7fGo"+PiHQڠ@.$ q\Z3׶@nkt[k'o}Xʇ+ZǓ`LJo&Cڛ<]ki֚@\ { 8w 'Lk8"ELYMIç|]Wa ;TЯCӝ+c== }gz ω"H,}1\]Qg1#_]zҗ:x ѡ*̭_0QONR`UZo`.Vڦq=O5xق JIS7 ⒊C>{@` MktFv;¿@. )2DjE3SaO4z*$ϸ3?+<-+|P7w7BIΖW Mpn_) J{`2TQP7 ]7x>_nCdL!wv-3I-ʗbm OMG L^&M:qyM4tmo.~9D^H3@ksϛ8h23B#75i23t,#xMfF+%$af礥|f3IE?tEG,K =,g0/DL*EGd "1!%DGV}LD2-{[;|jsRӳB{rZFҼt{lǜq2QI<DdwِB|D7k>kiA7w3ə$19L9 \iJt }/ W!>]T)'=ldlbm`Icƍs'cl!0`5ϓg,ږVv/u4ieԍ 3h&} ~yIGMe^zP'z=`ve]n 7@}nM'*wTLZfc>3g"Xxz?hiA@m PZZhKZ39G;3ɐ5 Ǭ8<=`A_>Uc<̤od~T<!M%ωebVQT \/[_ }NϘx?}>x< gud,|5y?щa皲9_![>v_ ejT*ʋeXƼ|湩,h$w, fh_K3#dr3Oub|$`|wH(9' t}_^3J &Y^_xus3шON-+}K2+ݪxMp=; !lH epo&^*/RM\PGZ~^{ӗ^?)}*#Obnxa=MKe{ WO{vzvޗ,6 6e>}7.}W6}2x/dxa6O\'^hn[ya读J)Wu,ASef\j0!tKHJq,#1+5dú)v:4uCR=4:rI툟aMm n:@bXڕ/~V{뇭4랞S_-YyT^54`VjO˜"`|}Ȣ{30k;\Q?1aIrd崮7ŇO?_WkgDoipJêXS 6 --"~-={ul%!4_g $5ۦڕ/~V;C{$\GMJ %. 6~j8_-nlګ9},Nn ð]srM0|,&ur\m\">ɡGɲ] oP,7~;  }|c+k Kw4 [5*_F\KL0 `p?Bׂ_ k 0!.5x?iz5 .ft)HW@$ zhwjTvҀg1WFp(HDK!/W _捿3?z= WW JVAE}QQ۫4d'ERg"be<)/^0f~}э]07>%B[]kOwnwc3!"iuo1x[c޿n~W^z]1@EoPMPi}HY(.]|$~Um_bRHQq#@ï ӗBl+V,O(6KSU"yBgP=O(^,V.tm> Xyv+J73>={UOpIW#!>}A[h[=6=Sx4P|;F4[,Mx^:̈́6ӭt-yN {uaeAp?nFNJ}mp+ǟ Í\g!u7 /7> 9x^qa˦ JҙdY P >h Cn80炟3@>>; (gp,Q)= svPg]9@=v@pKЮuɐFr ԗWn) P<5LIu0fS=  34peC\SPGSw\ٸV-ɡ1e ϏgȚV ;0a }d7B'ηr><K@ؘ w1 3_`0JY4ލS&1A OfY 9/|=3q-?qt`, +فy5u`J>:;-Bt#ӕtc3Lf'bz30\\ΌIKJ̴;irvΘD-mGwFLmkf)i)dƄdgNζ;%9S&⦈6Hm{isI%e1nZnG`7acg~@Xc:@$m4 0ЇӃP M\:0&(X OBcWCLcHX ` F*Ot?: ؓILMʶg21L"= . 8L& ӏIL .+>Ī,&1),a2Ô3P0o2$i@f"?4peӲf,HLϵB¤Y92TcdtgQSAetTEJ#, g#`ך990"o Ƿ<;Az u 2!|Rs)|ϛLe3@e|y^T\b0#+ay9V3*`ބHx0tS6 pƷI{(3dHʞNCp7Ҡ,tBƆ:31odFeH~ʌ8y|巻퉃lf̌MrlIg 6O/Fgd_e e:zȞ2ܞcm+|љ7ٓ$LN#[၏&Er}dfB6rn۵ ۽#Σ?lܡo}D7)igku/]`׍"y92ec"x 6k86N{W,.Ȏ˺ɣw*Grԝ5 YPaqi9҇8>deTUߩK5ik״x]nEfzjf6|j:eƴ||2Ī{>˟'XZP 4&MF}Dv=ns# _zL;C͖-I[ dZEwycyRQ\|[Y|VuH%T/P41֠~-ѕӭ_w1H N^GM07{XnLhbiy"nEqC4YO,|x;X#@Lui ,r5 cSIbmhfia~2ϲȲq{X<}+S6sI~9=ʩDR-*ays5jjwg1?ӽ Sii7SWsw敖 +cV\Dyʎɾ]w)(V)"*+)R?~QWO;޺'ta5=KԦdySyYs/;tٝXy9Vay G o(?T^U1p)U<WԟN1|kȘ:72Al227̣̯a-TK%ՒeɳN~||` [[-׾]}]QC1N?i^:$[t}uw:nnn/^>;f0XDL}ޥ_??zΆцrË+rh7ӭE&Yg_216jre5:{1rPa<"hYd֋֫FyÌb[*Y7YhqrͲaѲe)d eOȖɞ {Yl#~f-0oyZ*1C]7(XxIc(~V}Q9CY|NNyPyTFQaZW=]=[=OLzfu;5W45ӯjkO?_v҅turFgMХ t/^};; z^zޢ'?8i}F{_|N_C/n6DngH0&opV5Fw>G_ NQFQoi4fW517 sYcnnm -nd1^L0^09M L2Si ?L;LMW~a:k_7E.;̃ hp·RoGV?3i||ejƀ-[ *,7XwWXgXS?/>k}02,AQn> B!P.V UUQƦIਮڴR]O]JAQ`>8XjӴĴTnzŴٴļ\n~żٌF/[XlIӲ`dCP]7)#w(.T;TjU'uWuԻC_| }jX7_kk/hO]й  K_6p0ޘ`nL71A-h|qVVV/M( w)i\%3`ٖɇ*G*'B|HW>\|zO@oi` S?1E ņMu27ʌ8ĸx` Xm̲̅r"21(,Fu0"KIwA7C QWTKMqD.+R!I` 6TGAKStuIU z9@N]TEupSu&>}IZujb,/U_J~/xA?`7]%~/`"HYFcUeXbo;W>]d vn}|Kn=DާSRAڭy|ͬ`9ްpb)iyLGIZ Ijg~ѼT  |P&>TS㕓?R~gTkU0rVbQ36^okѾ; ('L )3aKL+LϚ֘^7 2>Dfw{o3c"c͏ļfB_oUWx]QrJ)ȤSs>&(%)c8э*Z172ii4X425\aqZHEFe5Xװtd\9~j?%ry>{'#S)ɜ`N77Q#1a꣆1ZɬL8t+IuuŴD ~PnHgsg3tFmz!7sbqxI%Dra7CUn6BW/#~}T/Gz ?_g6G=ehG+U]A[ax}ʥbACG*?%IX /ۺZO[NlNϧq«\ ,4*F&;AuC fاasMiLQi'*iP-nofϱifY<BRt/Yiw,: 2lt,ؙ,"Y"?7Eb;9 FsHekrvng:{.Ky)_52Iܡu:9h} YCcA/ }|"-vӽQlJ|\k|1y2tH7Ory5'Q>Y+_5~'Sv::?}_Wס#tBYYpf$)zOCCVӭw_ubX@ǟ47"8%Zu퇝-2Vw) {Ϳ1oWq> ^M>yb-C/g;yy9NfLc}=l-{6&6OA WM?S.g^_{ ` `g\P^!`{&jJ7S]f 2#|rI6GA>#4vv:bV–n{y@E~W%f[M%3ȋ>'=2qЛOߧ*޵I+t|E`zsZVakx9Jun9! MvY3SShn$CJl΀>C@Hw_rtf9Wjly>Kd_֘gW EϑV +=Nw!쥂YM>Mfsc9.F=>IuBߠ;.f1rҠ,@D=j09q*}dqku ;Q_Nce9o9{1nɅmI"M{Y޹ovz,9G @%p[e|SX9JUB}\./Cevsy^ &8fFpF0'eA665=W)J֓n2̳JHuJy j \uv+@^e6NyU P/+09&5Pbfx#482O[9ޒV.dՖӵth'dAQ%T줒~7T=uģY( d=Hg J6'MxϜ"Zqis{1~/9"O\*J2qX+6#bW-݅~s Z^#z90J7VV?#>J'fA:s&339_S<֍j(ZeDyJ'ѳ hm]9βϵ؋Akvl w厹c;ز`R~=o-|3'qX%vGIt N@?Q+]j-yXQ9Ku.8zPd*J*7XAp+UZw;a{baq.X(~1&R=-F6x)|(Ry2"3'2u _謯ZBb:0s;}ǦN!-d;y,VXPK/ &YNST;AIOOsrV"LPm:3JKMy1 bP?rd?DdBJŬ=Oîg`߳{/\(Rd[KR**mUVUcZu xCA3iO :fKi-E. ZI5zxu#mBZ56t.ڍ}۱l;ε.[VD;c.%c,eLճ1'RVլfB a669b4Y|>Hl$@/Uoq omw.>YYb` WjQNn-hmvdGݢ[ İCh)p"Y)C7B@L#ި7ƽT9M_ -BVU+ׂeIn@on 3.;d'[^'nP zڰߚT5UMSi*]eL+Jl A`KTDQQmPͪE6UթT7W~׍C*:EçLpюZlsu.ЅD"uUZF5"V̖LbB'_{[ܭyB7=w"o 3 Kh(Sxj# -|8s!/PUPV-V>n3Q>68$3" \Q-]+'W+Dh JL Kh/]l‹>P\s??XB[ǔuLU߭c::c9M.tSTU@9UVA; I&TɰNU΀BoZZ]tn魺Swnݣ{u?n>C1?4?O3L?w|k?s|jƯ@ ~w~wC0ӘGMEfMDogbĔ2SnWJT"HD&%( +U53uA}4MhAK[; z>`  O>&iT fn}_f}w^KDB}3>Z`mV:.-aFq+F4Ni4:ΫoUPK j? AMETA-INF/PK }j?Ӭ^j+META-INF/MANIFEST.MFPK j?Anet/PK j? Anet/tinyos/PK |j?Anet/tinyos/comm/PK |j?&4net/tinyos/comm/ByteQueue.classPK |j?h8~ "net/tinyos/comm/NativeSerial.classPK |j?ue s net/tinyos/comm/SerialPort.classPK |j?n% net/tinyos/comm/SerialPortEvent.classPK |j?~?Lr( net/tinyos/comm/SerialPortListener.classPK |j?MT0 Snet/tinyos/comm/TOSCommJNI.classPK |j? 0s/net/tinyos/comm/TOSSerial$EventDispatcher.classPK |j?]@1net/tinyos/comm/TOSSerial$SerialInputStream.classPK |j?aI 2net/tinyos/comm/TOSSerial$SerialOutputStream.classPK |j?޴V inet/tinyos/comm/TOSSerial.classPK |j?-7net/tinyos/comm/UnsupportedCommOperationException.classPK |j?Anet/tinyos/message/PK |j?,dp  9net/tinyos/message/Message.classPK |j?n((net/tinyos/message/MessageListener.classPK |j?0-)net/tinyos/message/MoteIF.classPK |j?S-,net/tinyos/message/Receiver$msgTemplate.classPK |j?} !.net/tinyos/message/Receiver.classPK |j?9!w5net/tinyos/message/Sender.classPK |j?0(f;K%8net/tinyos/message/SerialPacket.classPK }j?A.@net/tinyos/mviz/PK |j?"+!\@net/tinyos/mviz/DDocument$1.classPK |j?3YJN+?Bnet/tinyos/mviz/DDocument$CanvasMouse.classPK |j?(iCnet/tinyos/mviz/DDocument$DPanel$1.classPK |j?1].@(Fnet/tinyos/mviz/DDocument$DPanel$2.classPK |j?6wt&Inet/tinyos/mviz/DDocument$DPanel.classPK |j?rC.VLnet/tinyos/mviz/DDocument$DrawTableModel.classPK |j?נܤ,Pnet/tinyos/mviz/DDocument$LinkSetEvent.classPK |j?ڊ-xRnet/tinyos/mviz/DDocument$ValueSetEvent.classPK |j?EfMTnet/tinyos/mviz/DDocument.classPK }j?S >_cnet/tinyos/mviz/DLayer.classPK }j?3>pnet/tinyos/mviz/DLink$1.classPK }j?y]rnet/tinyos/mviz/DLink$2.classPK }j?տunet/tinyos/mviz/DLink.classPK }j?~T |net/tinyos/mviz/DLinkModel.classPK }j?@Zt(net/tinyos/mviz/DLinkModelListener.classPK }j? __Wnet/tinyos/mviz/DMote.classPK }j?gdO net/tinyos/mviz/DMoteModel.classPK }j?]$t(lnet/tinyos/mviz/DMoteModelListener.classPK }j?! q &net/tinyos/mviz/DNavigate.classPK }j?Ymnet/tinyos/mviz/DShape$1.classPK }j?UO^net/tinyos/mviz/DShape.classPK }j?sL'u !net/tinyos/mviz/DShapeModel.classPK }j?Qr)gnet/tinyos/mviz/DShapeModelListener.classPK }j?M;  net/tinyos/mviz/DataModel.classPK }j?_U"ݨnet/tinyos/mviz/MessageInput.classPK }j?Aưnet/tinyos/packet/PK }j?0̈́&net/tinyos/packet/AbstractSource.classPK }j?5t[Rg net/tinyos/packet/BaudRate.classPK }j?g_i#net/tinyos/packet/BuildSource.classPK }j?QA"net/tinyos/packet/ByteSource.classPK }j?$Ѳ)tnet/tinyos/packet/NetworkByteSource.classPK |j?^E!΃(mnet/tinyos/packet/PacketListenerIF.classPK |j?9p;I$6net/tinyos/packet/PacketSource.classPK }j?Iv*Znet/tinyos/packet/Packetizer$Escaper.classPK }j?-"Unet/tinyos/packet/Packetizer.classPK }j?&ыd!net/tinyos/packet/ParseArgs.classPK |j?Evq}$net/tinyos/packet/PhoenixError.classPK |j?Fg&'net/tinyos/packet/PhoenixSource$1.classPK |j?t %net/tinyos/packet/PhoenixSource.classPK }j?r0 cnet/tinyos/packet/Platform.classPK }j?'"net/tinyos/packet/SFProtocol.classPK }j? net/tinyos/packet/SFSource.classPK }j?ebInet/tinyos/packet/Serial.classPK }j?(net/tinyos/packet/SerialByteSource.classPK }j?#f:U(net/tinyos/packet/StreamByteSource.classPK }j?Aenet/tinyos/sf/PK }j?@wE net/tinyos/sf/SFClient.classPK }j?n%Bnet/tinyos/sf/SFConsoleRenderer.classPK }j?ͺ ~net/tinyos/sf/SFListen.classPK }j?B"net/tinyos/sf/SFNullRenderer.classPK }j? h{net/tinyos/sf/SFRenderer.classPK }j?&=net/tinyos/sf/SFWindow$1.classPK }j?>Knet/tinyos/sf/SFWindow$2.classPK }j?cUnet/tinyos/sf/SFWindow$3.classPK }j?hR,net/tinyos/sf/SFWindow$4.classPK }j?æEnet/tinyos/sf/SFWindow$5.classPK }j?E9 net/tinyos/sf/SFWindow.classPK }j?LD5/$net/tinyos/sf/SerialForwarder$SFMessenger.classPK }j?N^T?#net/tinyos/sf/SerialForwarder.classPK }j?A;net/tinyos/sim/PK }j?2u#hnet/tinyos/sim/InputVariables.classPK }j?~Nc!"#rnet/tinyos/sim/LinkLayerModel.classPK }j? e$,net/tinyos/sim/OutputVariables.classPK }j?A^-net/tinyos/tools/PK }j?~Z6-net/tinyos/tools/Listen.classPK }j?U "1net/tinyos/tools/ListenRaw.classPK }j?o 8net/tinyos/tools/MsgReader.classPK }j?8s@N#A=net/tinyos/tools/PrintfClient.classPK }j?zHd4 @net/tinyos/tools/PrintfMsg.classPK }j?-F ,4Fnet/tinyos/tools/Send.classPK }j?AHnet/tinyos/util/PK }j?mRHnet/tinyos/util/Crc.classPK }j?s|{ PKnet/tinyos/util/DiagMsg.classPK }j?QoU;OVnet/tinyos/util/Dump.classPK }j?JXnet/tinyos/util/Env.classPK |j?~kwZnet/tinyos/util/Messenger.classPK }j?e&XYF*s[net/tinyos/util/PrintStreamMessenger.classPK }j?夯&]net/tinyos/util/TOSLibraryLoader.classPK }j?^ 2&enet/tinyos/util/ZigbitProgrammer.classPK j?H |&pnet/tinyos/util/linux_amd64_getenv.libPK j?+`*Ow'+znet/tinyos/util/linux_amd64_toscomm.libPK j?f 8u$net/tinyos/util/linux_x86_getenv.libPK j?jbL%Qnet/tinyos/util/linux_x86_toscomm.libPK j?8P+net/tinyos/util/macosx_universal_getenv.libPK j?&X,%net/tinyos/util/macosx_universal_toscomm.libPK j?!߷o"&hnet/tinyos/util/windows_x86_getenv.libPK j?'net/tinyos/util/windows_x86_toscomm.libPKpp"tinyos-2.1.2+dfsg/support/sdk/python/000077500000000000000000000000001207233610700175775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/python/tinyos/000077500000000000000000000000001207233610700211245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/python/tinyos/__init__.py000066400000000000000000000031731207233610700232410ustar00rootroot00000000000000# # Copyright (c) 2005 # The President and Fellows of Harvard College. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # Author: Geoffrey Mainland # __all__ = ["message", "packet", "utils", "tossim"] tinyos-2.1.2+dfsg/support/sdk/python/tinyos/message/000077500000000000000000000000001207233610700225505ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/python/tinyos/message/Makefile000066400000000000000000000002321207233610700242050ustar00rootroot00000000000000SERIAL_H = $(TOSDIR)/lib/serial/Serial.h SerialPacket.py: mig -o $@ -python-classname=SerialPacket python $(SERIAL_H) serial_packet -I$(TOSDIR)/types tinyos-2.1.2+dfsg/support/sdk/python/tinyos/message/Message.py000066400000000000000000000144321207233610700245120ustar00rootroot00000000000000# # Copyright (c) 2005 # The President and Fellows of Harvard College. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # Authors: Geoffrey Mainland # Philip Levis import struct class MessageException(Exception): def __init__(self, *args): self.args = args class Message: def __init__(self, data, addr=None, gid=None, base_offset=0, data_length=None): self.addr = addr self.gid = gid self.data = data self.base_offset = base_offset if data_length != None: self.data_length = data_length if data == None or len(data) != data_length: self.data = chr(0) * data_length else: self.data_length = len(data) self.am_type = 0 def dataGet(self): return self.data def baseOffset(self): return self.base_offset def dataLength(self): return self.data_length def getAddr(self): return self.addr def getGid(self): return self.gid def amType(self): return self.am_type def amTypeSet(self, type): self.am_type = type def checkBounds(self, offset, length): if offset < 0 or length <= 0 or offset + length > (self.data_length * 8): raise MessageException("Message.checkBounds: bad offset (%d) or length (%d), for data_length %d" \ % (offset, length, self.data_length)) if offset & 7 != 0: raise MessageException("Cannot deal with bit fields") if length & 7 != 0: raise MessageException("Cannot deal with bit fields") def getUIntElement(self, offset, length, endian): self.checkBounds(offset, length) byteOffset = offset >> 3 bitOffset = offset & 7 if (endian): endian = ">" else: endian = "<" temp = self.data[byteOffset:byteOffset + (length >> 3)] if length == 8: return struct.unpack("B", temp)[0] elif length == 16: return struct.unpack(endian + "H", temp)[0] elif length == 32: return struct.unpack(endian + "L", temp)[0] else: raise MessageException("Bad length") def setUIntElement(self, offset, length, val, endian): self.checkBounds(offset, length) byteOffset = offset >> 3 bitOffset = offset & 7 if (endian): endian = ">" else: endian = "<" if length == 8: temp = struct.pack(endian + "B", val) elif length == 16: temp = struct.pack(endian + "H", val) elif length == 32: temp = struct.pack(endian + "L", val) else: raise MessageException("Bad length") self.data = self.data[:byteOffset] + temp + self.data[byteOffset + (length >> 3):] def getSIntElement(self, offset, length, endian): self.checkBounds(offset, length) byteOffset = offset >> 3 bitOffset = offset & 7 if (endian): endian = ">" else: endian = "<" temp = self.data[byteOffset:byteOffset + (length >> 3)] if length == 8: return struct.unpack(endian + "b", temp)[0] elif length == 16: return struct.unpack(endian + "h", temp)[0] elif length == 32: return struct.unpack(endian + "l", temp)[0] else: raise MessageException("Bad length") def setSIntElement(self, offset, length, val, endian): self.checkBounds(offset, length) byteOffset = offset >> 3 bitOffset = offset & 7 if (endian): endian = ">" else: endian = "<" if length == 8: temp = struct.pack(endian + "b", val) elif length == 16: temp = struct.pack(endian + "h", val) elif length == 32: temp = struct.pack(endian + "l", val) else: raise MessageException("Bad length") self.data = self.data[:byteOffset] + temp + self.data[byteOffset + (length >> 3):] def getFloatElement(self, offset, length, endian): self.checkBounds(offset, length) byteOffset = offset >> 3 bitOffset = offset & 7 if (endian): endian = ">" else: endian = "<" temp = self.data[byteOffset:byteOffset + (length >> 3)] return struct.unpack(endian + "f", temp)[0] def setFloatElement(self, offset, length, value, endian): self.checkBounds(offset, length) byteOffset = offset >> 3 bitOffset = offset & 7 if (endian): endian = ">" else: endian = "<" temp = struct.pack(endian + "f", value) self.data = self.data[:byteOffset] + temp + self.data[byteOffset + (length >> 3):] tinyos-2.1.2+dfsg/support/sdk/python/tinyos/message/MoteIF.py000066400000000000000000000126601207233610700242520ustar00rootroot00000000000000# # Copyright (c) 2005-2006 # The President and Fellows of Harvard College. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # Author: Geoffrey Mainland # Tinyos-2: Stephen Dawson-Haggerty import os import re import struct import sys import traceback from tinyos.utils.Watcher import Watcher from tinyos.packet.Serial import Serial from tinyos.message.SerialPacket import SerialPacket import tinyos.packet.PacketDispatcher import tinyos.packet.PacketSource import tinyos.packet.SFSource try: import tinyos.packet.SerialSource except: tinyos.packet.SerialSource = None DEBUG = False class MoteIFException(Exception): def __init__(self, *args): self.args = args class MoteIF: def __init__(self): self.listeners = {} self.watcher = Watcher.getInstance() def addListener(self, listener, msgClass): if listener not in self.listeners: self.listeners[listener] = {} amTypes = self.listeners[listener] amTypes[msgClass.get_amType()] = msgClass def removeListener(self, listener): del self.listeners[listener] def dispatchPacket(self, source, packet): #try: #print "Packet length: ", len(packet) # print "Dispatching from MoteIF" # for i in packet: # print ord(i)," ", # print try: # Message.py ignores base_offset, so we'll just chop off # the first byte (the SERIAL_AMTYPE) here. serial_pkt = SerialPacket(packet[1:], data_length=len(packet)-1) except: traceback.print_exc() try: data_start = serial_pkt.offset_data(0) + 1 data_end = data_start + serial_pkt.get_header_length() data = packet[data_start:data_end] amType = serial_pkt.get_header_type() except Exception, x: print >>sys.stderr, x print >>sys.stderr, traceback.print_tb(sys.exc_info()[2]) for l in self.listeners: amTypes = self.listeners[l] if amType in amTypes: try: msgClass = amTypes[amType] msg = msgClass(data=data, data_length = len(data), addr=serial_pkt.get_header_src(), gid=serial_pkt.get_header_group()) l.receive(source, msg) except Exception, x: print >>sys.stderr, x print >>sys.stderr, traceback.print_tb(sys.exc_info()[2]) def sendMsg(self, dest, addr, amType, group, msg): try: payload = msg.dataGet() msg = SerialPacket(None) msg.set_header_dest(int(addr)) msg.set_header_group(int(group)) msg.set_header_type(int(amType)) msg.set_header_length(len(payload)) # from tinyos.packet.Serial data = chr(Serial.TOS_SERIAL_ACTIVE_MESSAGE_ID) data += msg.dataGet()[0:msg.offset_data(0)] data += payload dest.writePacket(data) except Exception, x: print >>sys.stderr, x print >>sys.stderr, traceback.print_tb(sys.exc_info()[2]) def addSource(self, name=None): if name == None: name = os.environ.get("MOTECOM", "sf@localhost:9002") m = re.match(r'([^@]*)@(.*)', name) if m == None: raise MoteIFException("base source '%s'" % (name)) (sourceType, args) = m.groups() if sourceType == "sf": source = tinyos.packet.SFSource.SFSource(self, args) elif sourceType == "serial" and tinyos.packet.SerialSource != None: source = tinyos.packet.SerialSource.SerialSource(self, args) else: raise MoteIFException("bad source") source.start() return source def finishAll(self): tinyos.packet.PacketSource.finishAll() tinyos-2.1.2+dfsg/support/sdk/python/tinyos/message/SerialPacket.py000066400000000000000000000254621207233610700255020ustar00rootroot00000000000000# # This class is automatically generated by mig. DO NOT EDIT THIS FILE. # This class implements a Python interface to the 'SerialPacket' # message type. # import tinyos.message.Message # The default size of this message type in bytes. DEFAULT_MESSAGE_SIZE = 7 # The Active Message type associated with this message. AM_TYPE = -1 class SerialPacket(tinyos.message.Message.Message): # Create a new SerialPacket of size 7. def __init__(self, data="", addr=None, gid=None, base_offset=0, data_length=7): tinyos.message.Message.Message.__init__(self, data, addr, gid, base_offset, data_length) self.amTypeSet(AM_TYPE) # Get AM_TYPE def get_amType(cls): return AM_TYPE get_amType = classmethod(get_amType) # # Return a String representation of this message. Includes the # message type name and the non-indexed field values. # def __str__(self): s = "Message \n" try: s += " [header.dest=0x%x]\n" % (self.get_header_dest()) except: pass try: s += " [header.src=0x%x]\n" % (self.get_header_src()) except: pass try: s += " [header.length=0x%x]\n" % (self.get_header_length()) except: pass try: s += " [header.group=0x%x]\n" % (self.get_header_group()) except: pass try: s += " [header.type=0x%x]\n" % (self.get_header_type()) except: pass try: pass except: pass return s # Message-type-specific access methods appear below. # # Accessor methods for field: header.dest # Field type: int # Offset (bits): 0 # Size (bits): 16 # # # Return whether the field 'header.dest' is signed (False). # def isSigned_header_dest(self): return False # # Return whether the field 'header.dest' is an array (False). # def isArray_header_dest(self): return False # # Return the offset (in bytes) of the field 'header.dest' # def offset_header_dest(self): return (0 / 8) # # Return the offset (in bits) of the field 'header.dest' # def offsetBits_header_dest(self): return 0 # # Return the value (as a int) of the field 'header.dest' # def get_header_dest(self): return self.getUIntElement(self.offsetBits_header_dest(), 16, 1) # # Set the value of the field 'header.dest' # def set_header_dest(self, value): self.setUIntElement(self.offsetBits_header_dest(), 16, value, 1) # # Return the size, in bytes, of the field 'header.dest' # def size_header_dest(self): return (16 / 8) # # Return the size, in bits, of the field 'header.dest' # def sizeBits_header_dest(self): return 16 # # Accessor methods for field: header.src # Field type: int # Offset (bits): 16 # Size (bits): 16 # # # Return whether the field 'header.src' is signed (False). # def isSigned_header_src(self): return False # # Return whether the field 'header.src' is an array (False). # def isArray_header_src(self): return False # # Return the offset (in bytes) of the field 'header.src' # def offset_header_src(self): return (16 / 8) # # Return the offset (in bits) of the field 'header.src' # def offsetBits_header_src(self): return 16 # # Return the value (as a int) of the field 'header.src' # def get_header_src(self): return self.getUIntElement(self.offsetBits_header_src(), 16, 1) # # Set the value of the field 'header.src' # def set_header_src(self, value): self.setUIntElement(self.offsetBits_header_src(), 16, value, 1) # # Return the size, in bytes, of the field 'header.src' # def size_header_src(self): return (16 / 8) # # Return the size, in bits, of the field 'header.src' # def sizeBits_header_src(self): return 16 # # Accessor methods for field: header.length # Field type: short # Offset (bits): 32 # Size (bits): 8 # # # Return whether the field 'header.length' is signed (False). # def isSigned_header_length(self): return False # # Return whether the field 'header.length' is an array (False). # def isArray_header_length(self): return False # # Return the offset (in bytes) of the field 'header.length' # def offset_header_length(self): return (32 / 8) # # Return the offset (in bits) of the field 'header.length' # def offsetBits_header_length(self): return 32 # # Return the value (as a short) of the field 'header.length' # def get_header_length(self): return self.getUIntElement(self.offsetBits_header_length(), 8, 1) # # Set the value of the field 'header.length' # def set_header_length(self, value): self.setUIntElement(self.offsetBits_header_length(), 8, value, 1) # # Return the size, in bytes, of the field 'header.length' # def size_header_length(self): return (8 / 8) # # Return the size, in bits, of the field 'header.length' # def sizeBits_header_length(self): return 8 # # Accessor methods for field: header.group # Field type: short # Offset (bits): 40 # Size (bits): 8 # # # Return whether the field 'header.group' is signed (False). # def isSigned_header_group(self): return False # # Return whether the field 'header.group' is an array (False). # def isArray_header_group(self): return False # # Return the offset (in bytes) of the field 'header.group' # def offset_header_group(self): return (40 / 8) # # Return the offset (in bits) of the field 'header.group' # def offsetBits_header_group(self): return 40 # # Return the value (as a short) of the field 'header.group' # def get_header_group(self): return self.getUIntElement(self.offsetBits_header_group(), 8, 1) # # Set the value of the field 'header.group' # def set_header_group(self, value): self.setUIntElement(self.offsetBits_header_group(), 8, value, 1) # # Return the size, in bytes, of the field 'header.group' # def size_header_group(self): return (8 / 8) # # Return the size, in bits, of the field 'header.group' # def sizeBits_header_group(self): return 8 # # Accessor methods for field: header.type # Field type: short # Offset (bits): 48 # Size (bits): 8 # # # Return whether the field 'header.type' is signed (False). # def isSigned_header_type(self): return False # # Return whether the field 'header.type' is an array (False). # def isArray_header_type(self): return False # # Return the offset (in bytes) of the field 'header.type' # def offset_header_type(self): return (48 / 8) # # Return the offset (in bits) of the field 'header.type' # def offsetBits_header_type(self): return 48 # # Return the value (as a short) of the field 'header.type' # def get_header_type(self): return self.getUIntElement(self.offsetBits_header_type(), 8, 1) # # Set the value of the field 'header.type' # def set_header_type(self, value): self.setUIntElement(self.offsetBits_header_type(), 8, value, 1) # # Return the size, in bytes, of the field 'header.type' # def size_header_type(self): return (8 / 8) # # Return the size, in bits, of the field 'header.type' # def sizeBits_header_type(self): return 8 # # Accessor methods for field: data # Field type: short[] # Offset (bits): 56 # Size of each element (bits): 8 # # # Return whether the field 'data' is signed (False). # def isSigned_data(self): return False # # Return whether the field 'data' is an array (True). # def isArray_data(self): return True # # Return the offset (in bytes) of the field 'data' # def offset_data(self, index1): offset = 56 if index1 < 0: raise IndexError offset += 0 + index1 * 8 return (offset / 8) # # Return the offset (in bits) of the field 'data' # def offsetBits_data(self, index1): offset = 56 if index1 < 0: raise IndexError offset += 0 + index1 * 8 return offset # # Return the entire array 'data' as a short[] # def get_data(self): raise IndexError # # Set the contents of the array 'data' from the given short[] # def set_data(self, value): for index0 in range(0, len(value)): self.setElement_data(index0, value[index0]) # # Return an element (as a short) of the array 'data' # def getElement_data(self, index1): return self.getUIntElement(self.offsetBits_data(index1), 8, 1) # # Set an element of the array 'data' # def setElement_data(self, index1, value): self.setUIntElement(self.offsetBits_data(index1), 8, value, 1) # # Return the size, in bytes, of each element of the array 'data' # def elementSize_data(self): return (8 / 8) # # Return the size, in bits, of each element of the array 'data' # def elementSizeBits_data(self): return 8 # # Return the number of dimensions in the array 'data' # def numDimensions_data(self): return 1 # # Return the number of elements in the array 'data' # for the given dimension. # def numElements_data(self, dimension): array_dims = [ 0, ] if dimension < 0 or dimension >= 1: raise IndexException if array_dims[dimension] == 0: raise IndexError return array_dims[dimension] # # Fill in the array 'data' with a String # def setString_data(self, s): l = len(s) for i in range(0, l): self.setElement_data(i, ord(s[i])); self.setElement_data(l, 0) #null terminate # # Read the array 'data' as a String # def getString_data(self): carr = ""; for i in range(0, 4000): if self.getElement_data(i) == chr(0): break carr += self.getElement_data(i) return carr tinyos-2.1.2+dfsg/support/sdk/python/tinyos/message/__init__.py000066400000000000000000000031671207233610700246700ustar00rootroot00000000000000# # Copyright (c) 2005 # The President and Fellows of Harvard College. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # Author: Geoffrey Mainland # __all__ = ["Message", "MoteIF", "SerialPacket"] tinyos-2.1.2+dfsg/support/sdk/python/tinyos/packet/000077500000000000000000000000001207233610700223735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/python/tinyos/packet/IO.py000066400000000000000000000037001207233610700232540ustar00rootroot00000000000000# # Copyright (c) 2005 # The President and Fellows of Harvard College. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # Author: Geoffrey Mainland # class IODone(Exception): pass class IO: def __init__(self): self.done = False def isDone(self): return self.done def cancel(self): self.done = True def open(self): pass def close(self): pass def read(self, count): pass def write(self, data): pass def flush(self): pass tinyos-2.1.2+dfsg/support/sdk/python/tinyos/packet/Makefile000066400000000000000000000002441207233610700240330ustar00rootroot00000000000000# Makefile for tools/java/net/tinyos/packet SERIAL_H = $(TOSDIR)/lib/serial/Serial.h Serial.py: ncg -o $@ -python-classname=Serial python $(SERIAL_H) Serial.h tinyos-2.1.2+dfsg/support/sdk/python/tinyos/packet/PacketDispatcher.py000066400000000000000000000046001207233610700261630ustar00rootroot00000000000000# # Copyright (c) 2005 # The President and Fellows of Harvard College. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # Author: Geoffrey Mainland # import struct class PacketDispatcher: def __init__(self): self.listeners = {} def addListener(self, listener, msgClass): if listener not in self.listeners: self.listeners[listener] = {} amTypes = self.listeners[listener] amTypes[msgClass.get_amType()] = msgClass def removeListener(self, listener): del self.listeners[listener] def dispatchPacket(self, source, packet): (addr, amType, group, length) = struct.unpack(" # import signal import sys import traceback from IO import * from ThreadTask import * DEBUG = False runner = ThreadTaskRunner() def finishAll(): global runner runner.cancelAll() runner.finish() class PacketSourceException(Exception): def __init__(self, *args): self.args = args class PacketSource(ThreadTask): def __init__(self, dispatcher): global runner ThreadTask.__init__(self, runner) self.dispatcher = dispatcher def __call__(self): try: self.open() except Exception, x: if DEBUG: print "Exception while opening packet source:" print x print traceback.print_tb(sys.exc_info()[2]) self.done = True except: if DEBUG: print "Unknown exception while opening packet source" self.done = True while not self.isDone(): try: packet = self.readPacket() except IODone: if DEBUG: print "IO finished" break except Exception, x: if DEBUG: print "IO exception:" print x print traceback.print_tb(sys.exc_info()[2]) break except: if DEBUG: print "Unknown IO exception" break if packet: try: # print "About to run packet dispatcher!" # for i in packet: # print ord(i)," ", # print self.dispatcher.dispatchPacket(self, packet) except Exception, x: if DEBUG: print "Exception when dispatching packet:" print x print traceback.print_tb(sys.exc_info()[2]) # break except: if DEBUG: print "Unknown exception when dispatching packet" # break try: self.close() except: pass self.finish() def start(self): global runner runner.start(self) def open(self): pass def close(self): pass def readPacket(self): return None def writePacket(self, packet): pass tinyos-2.1.2+dfsg/support/sdk/python/tinyos/packet/Platform.py000066400000000000000000000057421207233610700245410ustar00rootroot00000000000000# # Copyright (c) 2006 # The President and Fellows of Harvard College. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # Author: Geoffrey Mainland # import re import socket import sys import traceback DEBUG = False PLATFORMS = {"mica": ("avrmote", 1, 19200), "mica2dot": ("avrmote", 1, 19200), "mica2": ("avrmote", 1, 57600), "telos": ("telos", 2, 57600), "tmote": ("telos", 2, 57600), "micaz": ("avrmote", 3, 57600), "eyes": ("eyes", 4, 19200)} ID_AVRMOTE = 1 ID_TELOS = 2 ID_MICAZ = 3 ID_EYES = 4 DEFAULT_BAUD = 19200 class UnknownPlatform(Exception): pass def baud_from_name(name): try: return PLATFORMS[name][2] except: raise UnknownPlatform() def default_factory(): return factory_from_platform("avrmote") def factory_from_name(name): try: return factory_from_platform(PLATFORMS[name][0]) except: raise UnknownPlatform() def factory_from_id(i): if i == ID_AVRMOTE: return factory_from_platform("avrmote") elif i == ID_TELOS: return factory_from_platform("telos") elif i == ID_MICAZ: return factory_from_platform("avrmote") else: raise UnknownPlatform() def factory_from_platform(platform): try: mod = __import__("tinyos.packet.%s" % platform) return mod.packet.__dict__[platform].TOS_Msg except Exception, x: if DEBUG: print >>sys.stderr, x print >>sys.stderr, traceback.print_tb(sys.exc_info()[2]) raise UnknownPlatform() tinyos-2.1.2+dfsg/support/sdk/python/tinyos/packet/SFProtocol.py000066400000000000000000000054501207233610700250030ustar00rootroot00000000000000# # Copyright (c) 2005-2006 # The President and Fellows of Harvard College. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # Author: Geoffrey Mainland # VERSION = "U" SUBVERSION = " " PLATFORM_UNKNOWN = 0 class SFProtocolException(Exception): def __init__(self, *args): self.args = args class SFProtocol: def __init__(self, ins, outs): self.ins = ins self.outs = outs self.platform = None def open(self): self.outs.write(VERSION + SUBVERSION) partner = self.ins.read(2) if partner[0] != VERSION: print "SFProtocol : version error" raise SFProtocolException("protocol version error") # Actual version is min received vs our version # ourversion = partner[1] & 0xff if self.platform == None: self.platform = PLATFORM_UNKNOWN # In tinyox-1.x, we then exchanged platform information # the tinyos-2.x serial forwarder doesn't do that, so the # connection is all set up at this point. def readPacket(self): size = self.ins.read(1) packet = self.ins.read(ord(size)) return packet def writePacket(self, packet): if len(packet) > 255: raise SFProtocolException("packet too long") self.outs.write(chr(len(packet))) self.outs.write(packet) self.outs.flush() tinyos-2.1.2+dfsg/support/sdk/python/tinyos/packet/SFSource.py000066400000000000000000000046651207233610700244510ustar00rootroot00000000000000# # Copyright (c) 2005-2006 # The President and Fellows of Harvard College. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # Author: Geoffrey Mainland # import re import socket from PacketSource import * from Platform import * from SFProtocol import * from SocketIO import * class SFSource(PacketSource): def __init__(self, dispatcher, args): PacketSource.__init__(self, dispatcher) m = re.match(r'(.*):(.*)', args) if m == None: raise PacketSourceException("bad arguments") (host, port) = m.groups() port = int(port) self.io = SocketIO(host, port) self.prot = SFProtocol(self.io, self.io) def cancel(self): self.done = True self.io.cancel() def open(self): self.io.open() self.prot.open() PacketSource.open(self) def close(self): self.io.close() def readPacket(self): return self.prot.readPacket() def writePacket(self, packet): self.prot.writePacket(packet) tinyos-2.1.2+dfsg/support/sdk/python/tinyos/packet/Serial.py000066400000000000000000000007761207233610700241760ustar00rootroot00000000000000 # # This class is automatically generated by ncg. DO NOT EDIT THIS FILE. # This class includes values of some nesC constants from # /opt/tinyos-2.x/tos/lib/serial/Serial.h. #/ class Serial: HDLC_CTLESC_BYTE = 125 SERIAL_PROTO_ACK = 67 TOS_SERIAL_802_15_4_ID = 2 SERIAL_PROTO_PACKET_UNKNOWN = 255 SERIAL_PROTO_PACKET_NOACK = 69 TOS_SERIAL_CC1000_ID = 1 HDLC_FLAG_BYTE = 126 TOS_SERIAL_ACTIVE_MESSAGE_ID = 0 SERIAL_PROTO_PACKET_ACK = 68 TOS_SERIAL_UNKNOWN_ID = 255 tinyos-2.1.2+dfsg/support/sdk/python/tinyos/packet/SocketIO.py000066400000000000000000000053301207233610700244260ustar00rootroot00000000000000# # Copyright (c) 2005 # The President and Fellows of Harvard College. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # Author: Geoffrey Mainland # import socket from IO import * class SocketIO(IO): def __init__(self, host, port): IO.__init__(self) self.done = False self.host = host self.port = port self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) self.socket.settimeout(1) self.socket.bind(("", 0)) def cancel(self): self.done = True def open(self): print "SocketIO: Connecting socket to "+str(self.host)+":"+str(self.port) self.socket.connect((self.host, self.port)) self.socket.settimeout(1) def close(self): self.socket.close() self.socket = None def read(self, count): data = "" while count - len(data) > 0: if self.isDone(): raise IODone() try: data += self.socket.recv(count - len(data)) except: pass return data def write(self, data): return self.socket.send(data) def flush(self): pass tinyos-2.1.2+dfsg/support/sdk/python/tinyos/packet/ThreadTask.py000066400000000000000000000056061207233610700250060ustar00rootroot00000000000000# # Copyright (c) 2005 # The President and Fellows of Harvard College. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # Author: Geoffrey Mainland # import threading import time class ThreadTask: def __init__(self, runner): self.done = False self.runner = runner runner.add(self) def isDone(self): return self.done def cancel(self): self.done = True def finish(self): self.runner.remove(self) class ThreadTaskRunner: def __init__(self): self.taskList = [] self.taskListLock = threading.Lock() def add(self, task): self.taskListLock.acquire() self.taskList = [task] + self.taskList self.taskListLock.release() def remove(self, task): self.taskListLock.acquire() self.taskList.remove(task) self.taskListLock.release() def start(self, task): thread = threading.Thread(None, task) thread.start() def cancelAll(self): self.taskListLock.acquire() for t in self.taskList: try: t.cancel() except: pass self.taskListLock.release() def finish(self): try: self.taskListLock.acquire() while len(self.taskList) != 0: self.taskListLock.release() time.sleep(0.2) self.taskListLock.acquire() self.taskListLock.release() except: pass tinyos-2.1.2+dfsg/support/sdk/python/tinyos/packet/__init__.py000066400000000000000000000033371207233610700245120ustar00rootroot00000000000000# # Copyright (c) 2005 # The President and Fellows of Harvard College. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # Author: Geoffrey Mainland # __all__ = ["PacketDispatcher", "PacketSource", "Packetizer", "SFProtocol", "SFSource", "ThreadTask", "avrmote", "micaz", "telos"] tinyos-2.1.2+dfsg/support/sdk/python/tinyos/tossim/000077500000000000000000000000001207233610700224425ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/python/tinyos/tossim/TossimApp.py000066400000000000000000000443611207233610700247430ustar00rootroot00000000000000# Copyright (c) 2000-2003 The Regents of the University of California. # Copyright (c) 2005 Stanford University. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of the copyright holders nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL # THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # # @author Kamin Whitehouse # @author Philip Levis from tinyos.tossim.TossimNescDecls import * class NescVariables(object) : def __init__( self, applicationName="Unknown App", xmlFilename=None ) : self.applicationName = applicationName self._varNames = [] self._vars = [] dom = minidom.parse(xmlFilename) variableList = [node for node in dom.getElementsByTagName("variables")] while len(variableList) > 0: variables = variableList.pop(0).getElementsByTagName("variable") while len(variables) > 0: cVariable = 0 isArray = 0 variable = variables.pop(0) name = variable.getAttribute("name") component = variable.getElementsByTagName("component-ref") if (len(component) > 0): name = component[0].getAttribute("qname") + "." + name else: # It's in a C file cVariable = 1 fileName = variable.getAttribute("loc") index = fileName.rfind("/") # First check for a UNIX path if (index == -1): index = fileName.rfind("\\") # Then a windows path if (index == -1): index = fileName.rfind(":") # Then if it's in the local dir if (index != -1): fileName = fileName[index+1:] index = fileName.rfind(".") if (index != -1): fileName = fileName[0:index] name = fileName + "." + name varType = "unknown" varTypes = variable.getElementsByTagName("type-float") if (len(varTypes) == 0): varTypes = variable.getElementsByTagName("type-int") if (len(variable.getElementsByTagName("type-array")) > 0): isArray = 1 if (len(varTypes) > 0): varTypeEntry = varTypes[0] varType = varTypeEntry.getAttribute("cname") if (cVariable == 0): self._varNames.append(str(name)) self._vars.append(str(name)) if (isArray): self._vars.append("array") else: self._vars.append("simple") self._vars.append(str(varType)) def __str__(self) : """ Print all available variables.""" string = "\n" name = 1 for val in self._varNames : if (name): string += "\t" + val name = 0 else: string += ": " + val + "\n" name = 1 return string def variables(self): return self._vars class NescTypes( object ) : """A class that holds all types defined in a specific nesc application. usage: myTypes = NescTypes('/path/to/nescDecls.xml') print myTypes var = myTypes.typeName """ def __init__( self, applicationName="Unknown App", xmlFilename = None) : self.applicationName = applicationName self._typeNames = [] self._types = {} #figure out the sizes of all the basic types for this platform (by scanning the xml file) platformTypes = {} typeRE = re.compile('cname=\"([\w\s]+?)\" size=\"I:(\d+?)\"') infile = open(xmlFilename, 'r') for line in infile : match = typeRE.search(line) if match != None: platformTypes[match.groups()[0]] = int(match.groups()[1]) #define all the basic types self.addType( nescType("uint8_t", "unsigned char", "int", "type-int", "B",1,0)) self.addType( nescType("int8_t", "signed char", "int", "type-int", "b", 1, 0)) if (platformTypes.has_key("int") and platformTypes["int"] == 4) or \ (platformTypes.has_key("unsigned int") and platformTypes["unsigned int"] == 4) : self.addType( nescType("uint16_t", "unsigned short", "int", "type-int", "H", 2, 0)) self.addType( nescType("int16_t", "short", "int", "type-int", "h", 2, 0)) self.addType( nescType("uint32_t", "unsigned int", "int", "type-int", "L",4,0)) self.addType( nescType("int32_t", "int", "int", "type-int", "L", 4, 0)) self.addType( nescType("unsigned long", "unsigned long", "int", "type-int", "L",4,0)) self.addType( nescType("long", "long", "int", "type-int", "l", 4, 0)) else : #int is 2 bytes long (the default) self.addType( nescType("unsigned short", "unsigned short", "int", "type-int", "H", 2, 0)) self.addType( nescType("short", "short", "int", "type-int", "h", 2, 0)) self.addType( nescType("uint16_t", "unsigned int", "int", "type-int", "H", 2, 0)) self.addType( nescType("int16_t", "int", "int", "type-int", "h", 2, 0)) self.addType( nescType("uint32_t", "unsigned long", "int", "type-int", "L",4,0)) self.addType( nescType("int32_t", "long", "int", "type-int", "l", 4, 0)) self.addType( nescType("int64_t", "long long", "long", "type-int", "q", 8, 0)) self.addType( nescType("uint64_t", "unsigned long long", "long", "type-int", "Q", 8, 0)) self.addType( nescType("float", "float", "float", "type-float", "f", 4, 0)) if platformTypes.has_key("double") and platformTypes["double"] == 8 : self.addType( nescType("double", "double", "float", "type-float", "d", 8, 0)) else : #double is 4 bytes (the default) self.addType( nescType("double", "double", "float", "type-float", "f", 4, 0)) self.addType( nescType("char", "char", "str", "type-int", "c", 1, '\x00')) self.addType( nescType("void", "void", "", "type-void", "", 0, '')) #some arrays for error reporting: self.unknownStructs = [] self.anonymousStructs = [] self.anonymousRefStructs = [] self.undefinedTypes = [] self.createTypesFromXml(xmlFilename) self._typeNames.sort() #self.printSkippedTypes() def addType(self, value) : if not value.nescType in self._typeNames : self._typeNames.append(value.nescType) self._types[value.nescType] = value #XXX: why does this have to be unconditional?? if not self._types.has_key(value.cType): self._types[value.cType] = value self._typeNames.append(value.cType) def __getattr__(self, name) : if name in self._typeNames : return deepcopy(self._types[name]) else: raise AttributeError("No type \"%s\" defined" % name) def __getitem__(self, key) : if key in self._typeNames : return deepcopy(self._types[key]) else: raise AttributeError("No type \"%s\" defined" % key) def __repr__(self) : return "%s object at %s:\n\n\t%s" % (self.__class__, hex(id(self)), str(self)) def __str__(self) : """ Print all available types.""" string = "\n" for t in self._typeNames : string += "\t%s\n" % t return string def createTypesFromXml(self, xmlFilename) : """Go through the struct and typedef elements in the nescDecls.xml file""" dom = minidom.parse(xmlFilename) typeDefs = [node for node in dom.getElementsByTagName("struct")] for node in dom.getElementsByTagName("typedef") : typeDefs.append(node) numSkipped = 0 #keep going through the queue until it is empty while len(typeDefs) > 0: typeDef = typeDefs.pop(0) #if this is a typedef, see if the value is there if typeDef.tagName == "typedef" : value = typeDef.getAttribute("value") name = typeDef.getAttribute("name") #if the real value exists and typedef doesn't already exist, copy and rename original if self._types.has_key(value) : newType = deepcopy(self._types[value]) newType.nescType = name self.addType(newType) numSkipped=0 else : #try again later typeDefs.append(typeDef) numSkipped += 1 else : #if all types within the struct are already defined, it can be defined try : self.addType(nescStruct(self, typeDef ) ) numSkipped=0 except Exception, e: if len(e.args) > 0 and e.args[0] == "Undefined struct": #otherwise, put it back in the queue and move on to the next one typeDefs.append(typeDef) numSkipped += 1 elif len(e.args) > 0 and e.args[0] == "Anonymous struct" : self.anonymousStructs.append(typeDef) elif len(e.args) > 0 and e.args[0] == "Anonymous struct reference" : self.anonymousRefStructs.append( (typeDef, e.args[1]) ) elif len(e.args) > 0 and e.args[0] == "Unknown type" : self.unknownStructs.append( (typeDef, e.args[1]) ) else : #if it's an unknown exception, reraise it raise #make sure we are not cycling endlessly if numSkipped >= len(typeDefs) > 0: self.undefinedTypes = typeDefs break def printSkippedTypes(self): err = "" if len(self.anonymousStructs) >0 : err += "\nWarning: %d structs were anonymous." % len(self.anonymousStructs) # for struc in anonymousStructs : # err += "\t%s\n" % struc.getAttribute("ref") if len(self.anonymousRefStructs) >0 : err += "\nWarning: The following structs referenced anonymous structs:\n" for pair in self.anonymousRefStructs : err += "\t%s\n" % pair[0].getAttribute("name") if len(self.undefinedTypes) >0 : err += "\nWarning: The following types are ill-defined or had circular dependencies:\n" for struc in self.undefinedTypes : err += "\t%s\n" % struc.getAttribute("name") if len(self.unknownStructs) >0 : err += "\nWarning: The following structs had unknown xml types:\n" for pair in self.unknownStructs : err += "\t%s (%s)\n" % (pair[0].getAttribute("name"), pair[1].tagName ) if len(err) > 0 : print err def getTypeFromXML(self, xmlDefinition) : """Find the type name value given an xml definition. If it is an array or pointer, define the new type here.""" #first, see if the tag is type or if child is type if xmlDefinition.tagName.find("type-") < 0 or \ xmlDefinition.tagName.find("type-qualified") >= 0 : foundType = 0 childNodes = [node for node in xmlDefinition.childNodes if node.nodeType == 1] for tag in childNodes : if tag.tagName.find("type-") >= 0 : foundType += 1 typeTag = tag if foundType < 1 : raise Exception("No type tag found") if foundType > 1 : raise Exception("Too many type tags found") else : return self.getTypeFromXML(typeTag) #now check all the existing types to see if it is one of them for val in self._typeNames : typeObj = self._types[val] if typeObj.isType(xmlDefinition) : return deepcopy(typeObj) #if the type doesn't already exist, try creating a new one try : return nescArray(self, xmlDefinition) except Exception, e: if len(e.args) <= 0 or e.args[0] != "Not array definition": raise try : return nescPointer(self, xmlDefinition) except Exception, e: if len(e.args) <= 0 or e.args[0] != "Not pointer definition": raise #it is not a simple type, array, or pointer, #so it must be a yet undefined struct child = getUniqueChild(xmlDefinition) if ( xmlDefinition.tagName == "type-tag" and child != None and child.tagName == "struct-ref" ): if child.hasAttribute("name"): raise Exception("Undefined struct") else : raise Exception("Anonymous struct reference", child) else: #otherwise, raise an exception #(but first make sure the right kind of unknown type is displayed) if xmlDefinition.tagName == "type-tag": xmlDefinition = child raise Exception("Unknown type", xmlDefinition) class NescEnums( object ) : """A class that holds all enums defined in a specific nesc application. usage: myEnums = NescEnums('/path/to/nescDecls.xml') print myEnums var = myEnums.enumName """ def __init__( self, applicationName="Unknown App", xmlFilename = None ) : self.applicationName = applicationName self._enums = [] if type(xmlFilename) == str: xmlFilename = minidom.parse(xmlFilename) self.createEnumsFromXml(xmlFilename) def __getitem__(self, key) : if key in self._enums : return self.__dict__[key] else: raise AttributeError("No such enum defined") def createEnumsFromXml(self, dom) : #now define all the struct types enumDefs = [node for node in dom.getElementsByTagName("enum")] integer = re.compile('^I:(\d+)$') hexidecimal = re.compile('^(0x[\dabcdefABCDEF]+)$') for enumDef in enumDefs : name = enumDef.getAttribute("name") if name in self._enums : continue value = enumDef.getAttribute("value") match = integer.match(value) if match != None : self.__dict__[name] = int(match.groups()[0]) else : match = hexidecimal.match(value) if match != None : self.__dict__[name] = int(match.groups()[0], 16) else : self.__dict__[name] = value self._enums.append(name) namedEnums = [node for node in dom.getElementsByTagName("namedEnum")] for namedEnum in namedEnums : name = namedEnum.getAttribute("name") self.__dict__[name] = NescEnums(namedEnum,name) self._enums.append(name) def __repr__(self) : return "%s object at %s:\n\n\t%s" % (self.__class__, hex(id(self)), str(self)) def __str__(self) : """ Print all available enums.""" string = "\n" for key in self._enums : string += "\t%s = %s\n" % (key, str(self[key])) return string class NescMsgs( object ) : """A class that holds all msgs defined in a specific nesc application. It assumes a struct is a message if AM_STRUCTNAME is defined. usage: myMsgs = NescMsgs(myTypes, myEnums[, applicationName]) print myMsgs var = myMsgs.msgName """ def __init__( self, types, enums, applicationName="Unknown App" ) : self.applicationName = applicationName msgTypes = [enum for enum in enums._enums if enum.find("AM_") ==0] name = re.compile("^AM_(\w+)$") self._msgNames = [] self._msgs = {} for msgType in msgTypes : if type(enums[msgType]) == int: msgName = name.match(msgType) if msgName != None : msgName = msgName.groups()[0] for key in types._typeNames : if key.lower() == msgName.lower() : msg = TosMsg(enums[msgType], types[key]) self._msgs[key] = msg self._msgNames.append(key) break def __getattr__(self, name) : if name in self._msgNames : return deepcopy(self._msgs[name]) else: raise AttributeError("No such message defined") def __getitem__(self, key) : if key in self._msgNames : return deepcopy(self._msgs[key]) else: raise AttributeError("No such message defined") def __repr__(self) : return "%s object at %s:\n\n\t%s" % (self.__class__, hex(id(self)), str(self)) def __str__(self) : """ Print all available msgs.""" string = "\n" for key in self._msgNames : string += "\t%5d : %s\n" % (self._msgs[key].amType, key) return string class NescApp( object ) : """A class that holds all types, enums, msgs, rpc commands and ram symbol definitions as defined for a specific nesc application. usage: myApp = nescApp('/path/to/nescDecls.xml') print myApp var = myApp.enums.enumName var = myApp.types.typeName """ def __init__( self, applicationName="Unknown App", xmlFile="app.xml" ) : """This function creates the NescEnums, NescTypes, and NescMsgs objects for a particular application.""" #first, import all enums, types, msgs, rpc functions, and ram symbols self.applicationName = applicationName self.xmlFile = xmlFile # Check for the nescDecls.xml file if not os.path.isfile(xmlFile): raise Exception("""\nERROR: cannot find file \"%s\". Your nesC app cannot be imported. Be sure that you compiled with the \"nescDecls\" option.\n\n""" % xmlFile) # Import enums, types, and msgs self.enums = NescEnums(applicationName, xmlFile) self.types = NescTypes(applicationName, xmlFile) self.variables = NescVariables(applicationName, xmlFile) self.messages = NescMsgs(self.types, self.enums, applicationName) def __repr__(self) : return "%s object at %s:\n\n%s" % (self.__class__, hex(id(self)), str(self)) def __str__(self) : """ Print all application declarations.""" string = "%20s : %d\n" % ("Enums", len(self.enums._enums)) string += "%20s : %d\n" % ("Types", len(self.types._types)) string += "%20s : %d\n" % ("Messages", len(self.messages._msgNames)) string += "%20s : %d\n" % ("Variables", len(self.variables._varNames)) return string def configureTossim(self): for var in variables: Mote.var tinyos-2.1.2+dfsg/support/sdk/python/tinyos/tossim/TossimNescDecls.py000066400000000000000000000663271207233610700260740ustar00rootroot00000000000000# Copyright (c) 2000-2003 The Regents of the University of California. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of the copyright holders nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL # THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # # @author Kamin Whitehouse # import sys, string, math, re, os from struct import * from xml.dom import minidom from copy import deepcopy ########### # This class can be used to hold a basic nesc type, eg uint8_t It can # be set and get through nescType.value, and does type checking # ########### def findBuildFile(givenString, desiredFilename) : """This function will find a desiredFilename (eg. nescDecls.xml) the build directory from a givenString (e.g 'build/pc'). Legal givenStrings are: 1. Full path, eg: /home/kamin/tinyos-1.x/... 2. relative path, eg: apps/TestRpc/build/pc 3. platform name, eg: pc or telosb """ #check to see if the given string contains the desiredFilename if givenString.find(desiredFilename) >= 0 : filename = givenString #then check to see if it is an absolute or relative path elif givenString.find('/') >= 0 : filename = givenString + desiredFilename #then check to see if it is just the platform name elif len(givenString) > 0: filename = 'build/' + givenString + '/' + desiredFilename #check if a default platform environment variable is defined elif os.environ.has_key("TINYOS_DEFAULT_PLATFORM") : filename = 'build/' + os.environ["TINYOS_DEFAULT_PLATFORM"] + '/' + desiredFilename #otherwise, assume the file is in './' else : filename = desiredFilename #check to see if the file was successfully found if not os.path.isfile(filename) : raise IOError("File %s not found" % filename) return filename class nescType( object ) : """A python representation of a nesc type. usage: X = nescType.value nescType.value = X bytes = nescType.getBytes() nescType.setBytes(bytes) nescType print nescType """ def __init__( self , nescType, cType, pythonType, xmlTag, conversionString, size, defaultValue) : """create a new nescType""" self.nescType = nescType self.cType = cType self.pythonType = pythonType self._xmlTag = xmlTag self.size = size self._conversionString = conversionString self.value = defaultValue def __repr__(self) : return "%s object at %s:\n\n%20s : %s" % (self.__class__, hex(id(self)), "value", str(self)) def __str__(self) : if self._conversionString == "c" : return "'" + str(self.value) + "'" else : return str(self.value) # this func could be used for type checking def __setattr__(self, name, value) : if self.__dict__.has_key("value") and name == "value": #use the type conversions built into pack pack(self._conversionString, value) self.__dict__[name] = value def oneLineStr(self) : return str(self) def __deepcopy__(self, memo={}) : result = nescType(self.nescType, self.cType, self.pythonType, self._xmlTag, self._conversionString, self.size, deepcopy(self.value, memo)) memo[id(self)] = result return result def isType(self, xmlDefinition) : """returns 1 if the xml definition describes this type. Returns 0 otherwise.""" if xmlDefinition != None and xmlDefinition.tagName == self._xmlTag and \ xmlDefinition.hasAttribute("cname") and \ xmlDefinition.getAttribute("cname") == self.cType : return 1 elif self.nescType == "void" and xmlDefinition.tagName == self._xmlTag : #void is a special xml case that doesn't have cname defined (grr) return 1 else : return 0 def getBytes(self) : """Hexidecimal representation of a value of this type""" if self.nescType == "void" : return '' try: bytes = pack(self._conversionString, self.value) except Exception, inst: print inst raise Exception("Bytes conversion error: %s %d bytes to %d" % (self.nescType, len(bytes), self.size) ) if len(bytes) != self.size: raise Exception("Wrong number of bytes for conversion: %s %d bytes to %d" % (self.nescType, len(bytes), self.size)) return bytes def setBytes(self, bytes): """A value of this type from a hexidecimal representation""" if self.nescType == "void" : return bytes if len(bytes) < self.size: raise Exception("Wrong number of bytes for conversion: %s %d bytes to %d" % (self.nescType, len(bytes), self.size)) try: self.value, = unpack( self._conversionString, bytes[:self.size]) except Exception, inst: print inst raise Exception("Bytes conversion error: %s %d bytes to %d" % ( self.nescType, len(bytes), self.size) ) return bytes[self.size:] ########### # Array of basic nesc types, ########### class nescArray( object ) : """A python representation of a nesc array. usage: array = nescArray(size, nescType) array = nescArray(myTypes, xmlDecl) X = array[3] X = array[3:6] (returns a list or, if char[] array, a python string) array[3] = X array[3:6] [X,Y,Z] (or, if char[], \"foo\") bytes = array.getBytes() array.setBytes(bytes) array print array """ def __init__( self , *varargs) : """initialize all elements to 0""" if len(varargs) == 0 : return elif len(varargs) == 2 and type(varargs[0]) == int : (self.len,self.elementType) = varargs[:] bracketStr = "[" + str(self.len) + "]" elif len(varargs) == 2 : (nescTypes, xmlDefinition) = varargs[:] if xmlDefinition.tagName != "type-array" : raise Exception("Not array definition") child = getUniqueChild(xmlDefinition) self.elementType = nescTypes.getTypeFromXML(child) sizeStr = xmlDefinition.getAttribute("elements")[2:] self.len = int(sizeStr) bracketStr = "[" + sizeStr + "]" else : raise Exception("Illegal array params") self.nescType = self.elementType.nescType + bracketStr self.cType = self.elementType.cType + bracketStr self.pythonType = self.elementType.pythonType + bracketStr self.size = self.len * self.elementType.size self.value = [] for i in range(self.len): self.value.append(deepcopy(self.elementType)) def __repr__(self) : """A printable representation of the value""" return "%s object at %s:\n\n\t%s" % (self.__class__, hex(id(self)), str(self)) def __str__(self) : """A printable representation of the value""" string = "nescArray of type %s:\n" % self.nescType # if self.elementType._conversionString == "c": # string += self.oneLineStr() # else: for i in range(self.len) : string += "%2d: %s\n" % (i, self.value[i].oneLineStr()) return string def __getitem__(self, key) : if self.elementType.__class__ == nescType : if key.__class__ == slice: if self.elementType._conversionString == "c": string = "" for item in self.value.__getitem__(key) : string += item.value return string else: return [item.value for item in self.value.__getitem__(key)] else: return self.value.__getitem__(key).value else: return self.value.__getitem__(key) def __setitem__(self, key, value) : if self.elementType.__class__ == nescType : if key.__class__ == slice: i=0; for item in self.value.__getitem__(key) : item.value = value[i] i += 1 else: self.value.__getitem__(key).value = value else : self.value.__setitem__(key, value) def __delitem__(self, key) : return self.value.__delitem__(key) def oneLineStr(self) : """A one-line representation of the value""" #maybe the string should just print like a string #but the \x00 chars look like nothing # if self.elementType._conversionString == "c": # string = '\'' # for c in self.value : # string += c.value # string += '\'' # else: tmpStr = str(self.elementType) if tmpStr.find("\n") >= 0 or len(tmpStr) > 5 : return self.nescType else : i = 0; string = "[" while len(string) < 40 and i < self.len : string += str(self.value[i]) + ", " i += 1 if i < self.len : string += "...]" else: string += "\b\b]" return string def __deepcopy__(self, memo={}) : result = nescArray() memo[id(self)] = result result.elementType = deepcopy(self.elementType, memo) result.nescType = self.nescType result.cType = self.cType result.pythonType = self.pythonType result.len = self.len result.size = self.size result.value = deepcopy(self.value, memo) return result def isType(self, xmlDefinition) : """returns 1 if the xml definition describes this type. Returns 0 otherwise.""" if ( xmlDefinition != None and xmlDefinition.tagName == "type-array" and int(xmlDefinition.getAttribute("elements")[2:]) == self.len ) : child = getUniqueChild(xmlDefinition) return self.elementType.isType(child) else : return 0 def getBytes(self) : """Hexidecimal representation of a value of this type""" bytes = "" for i in range(self.len): bytes += self.value[i].getBytes() if len(bytes) != self.size: raise Exception("Byte conversion error: %s %d bytes to %d" % ( self.nescType, len(bytes), self.size)) return bytes def setBytes(self, bytes) : """A value of this type from a hexidecimal representation""" if len(bytes) < self.size: raise Exception("Byte conversion error: %s %d bytes to %d" % (self.nescType, len(bytes), self.size) ) for i in range(self.len) : bytes = self.value[i].setBytes(bytes) return bytes ########### # Pointer to basic nesc types, ########### class nescPointer( object ) : """A python representation of a nesc pointer. usage: pointer = nescPointer(ptrSize, nescType) pointer = nescPointer(myTypes, xmlDecl) nescType = pointer.value pointer.value = nescType bytes = pointer.getBytes() pointer.setBytes(bytes) pointer print pointer """ def __init__( self , *varargs) : """initialize all elements to 0""" if len(varargs) == 0: return elif len(varargs) == 2 and varargs[1].__dict__.has_key("tagName"): (nescTypes, xmlDefinition) = varargs[:] if xmlDefinition.tagName != "type-pointer" : raise Exception("Not pointer definition") child = getUniqueChild(xmlDefinition) self.value = nescTypes.getTypeFromXML(child) self.size = int(xmlDefinition.getAttribute("size")[2:]) elif len(varargs) == 2 : self.size = varargs[0].types["unsigned int"].size self.value = varargs[1] else : raise Exception("Illegal nescPointer constructor arguments") self.nescType = self.value.nescType + "*" self.cType = self.value.cType + "*" self.pythonType = self.value.pythonType + "*" def __repr__(self) : return "%s object at %s:\n\n\t%s" % (self.__class__, hex(id(self)), str(self)) def __str__(self) : """A text representation of the value""" return "ptr-> %s" % str(self.value) def oneLineStr(self) : """A one-line representation of the value""" return "ptr-> %s" % self.value.oneLineStr() def __deepcopy__(self, memo={}) : result = nescPointer() memo[id(self)] = result result.value = deepcopy(self.value, memo) result.size = self.size result.nescType = self.nescType result.cType = self.cType result.pythonType = self.pythonType return result def isType(self, xmlDefinition) : """returns 1 if the xml definition describes this type. Returns 0 otherwise.""" if xmlDefinition != None and xmlDefinition.tagName == "type-pointer" : child = getUniqueChild(xmlDefinition) return self.value.isType(child) else : return 0 def getBytes(self) : bytes = pack (str(self.size)+"s",'\x00') if len(bytes) != self.size: raise Exception("Byte conversion error: %s %d bytes to %d" % (self.nescType, len(bytes), self.size) ) return bytes def setBytes(self, bytes) : if len(bytes) < self.size: raise Exception("Byte conversion error: %s %d bytes to %d" % ( self.nescType, len(bytes), self.size) ) return bytes[self.size:] ########### # Struct of basic nesc types, ########### class nescStruct( object ) : """A python representation of a nesc structure. usage: struct = nescStruct(myTypes, xmlDecl) struct = nescStruct(structName, (fieldName, type) (fieldName, type), ...) X = struct.field struct.field = X bytes = struct.getBytes() struct.setBytes(bytes) struct print struct """ def __init__( self, *varargs) : """initialize all fields to 0""" self.__dict__["value"] = {} self.fields = [] self.size = 0 if len(varargs) == 0 : self.nescType = "" #create the struct from nescType args elif len(varargs) >= 1 and ( type(varargs[0]) == str or type(varargs[0]) == unicode ) : self.nescType = varargs[0] self._parseNescTypeFields(varargs[1:]) ## parse the struct def from xml elif len(varargs) == 2 and type(varargs[1]) != tuple : (nescTypes, xmlDefinition) = varargs[:] if xmlDefinition.tagName != "struct" : raise Exception("Not struct definition") if xmlDefinition.hasAttribute("name") == False: raise Exception("Anonymous struct") self.nescType = xmlDefinition.getAttribute("name") if xmlDefinition.getAttribute("size")[2:]: self.size = int(xmlDefinition.getAttribute("size")[2:]) else: self.size = 0 self._parseXMLFields(nescTypes, xmlDefinition) else : raise Exception("Illegal nescStruct constructor args") self.cType = self.nescType self.pythonType = self.nescType self.__initialized = True def __getattr__(self, name) : if self.__dict__.has_key("value") : if self.value.has_key(name) : if self.value[name].__class__ == nescType : return self.value[name].value else : return self.value[name] else : raise AttributeError("No such field \"%s\" in the nescStruct \"%s\"" % (name, self.nescType)) def __setattr__(self, name, value) : if not self.__dict__.has_key("_nescStruct__initialized") : self.__dict__[name] = value return if self.value.has_key(name) : if self.value[name].__class__ == nescType : self.value[name].value = value; else : self.value[name] = value; elif self.__dict__.has_key(name) : self.__dict__[name] = value else : raise AttributeError("No such field \"%s\" in the nescStruct \"%s\"" % (name, self.nescType)) def __repr__(self) : return "%s object at %s:\n\n\t%s" % (self.__class__, hex(id(self)), str(self)) def __str__(self) : """All fields and values as a readable string""" string = self.nescType + ": \n" for field in self.fields : string += "%30s : %s\n" % ( "%s %s" % (self.value[field["name"]].nescType, field["name"]), self.value[field["name"]].oneLineStr() ) return string def oneLineStr(self) : """A one-line representation of the struct""" return self.nescType def __deepcopy__(self, memo={}) : result = self.__class__() memo[id(self)] = result self._copyFields(result, memo) return result def _copyFields(self, other, memo=None) : other.size = self.size other.nescType = self.nescType other.cType = self.cType other.pythonType = self.pythonType if memo == None : other.value = deepcopy(self.value) other.fields = deepcopy(self.fields) else : other.value = deepcopy(self.value, memo) other.fields = deepcopy(self.fields, memo) other.__initialized = True def _parseXMLFields(self, nescTypes, xmlDefinition) : """Create a list of fields & values given a struct xml declaration.""" fields = [node for node in xmlDefinition.getElementsByTagName("field")] fields.sort( lambda A, B : int(A.getAttribute("bit-offset")[2:]) - int(B.getAttribute("bit-offset")[2:])) for fieldDef in fields: field = {} field["name"] = fieldDef.getAttribute("name") field["bitOffset"] = int(fieldDef.getAttribute("bit-offset")[2:]) if fieldDef.hasAttribute("bit-size"): field["bitSize"] = int(fieldDef.getAttribute("bit-size")[2:]) elif fieldDef.hasAttribute("size"): field["bitSize"] = int(fieldDef.getAttribute("size")[2:])*8 self.fields.append(field) self.value[fieldDef.getAttribute("name")] = nescTypes.getTypeFromXML(fieldDef) #here's a weird bug in the nesc.xml generation where the "size" attribute #for packed structs is actually the size of the unpacked struct. if xmlDefinition.hasAttribute("packed") : self.size = self.packedSize() elif xmlDefinition.getAttribute("size")[2:]: self.size = int(xmlDefinition.getAttribute("size")[2:]) else: self.size = 0 def _parseNescTypeFields(self, fields) : """Create a list of fields & values given a tuple of fieldname,value sequences.""" self.size = 0 for fieldDef in fields: field = {} (field["name"],fType) = fieldDef field["bitOffset"] = self.size*8 field["bitSize"] = fType.size*8 self.fields.append(field) self.value[field["name"]] = fType self.size += fType.size def isType(self, xmlDefinition) : """returns 1 if the xml definition describes this type. Returns 0 otherwise.""" if xmlDefinition == None : return 0 child = getUniqueChild(xmlDefinition) if ( ( xmlDefinition.tagName == "struct" and xmlDefinition.getAttribute("name") == self.nescType) or ( xmlDefinition.tagName == "type-tag" and child != None and child.tagName == "struct-ref" and child.getAttribute("name") == self.nescType ) ) : return 1 else : return 0 def getBytes(self) : """Hexidecimal representation of struct""" # We have to be careful in here about: # 1. bit fields (ie. bitSize shorter than nominal type size) # 2. packing (ie. bits that are not part of any particular field) bits = "" for field in self.fields : for i in range(len(bits), field["bitOffset"]) : bits += "0" newBits = hex2bin(self.value[field["name"]].getBytes()) bits += newBits[-field["bitSize"]:] #the following loop is just type checking for bit fields. Can we do this on setattr? for i in range(len(newBits)-field["bitSize"]): if newBits[i] == "1": print "Bit-field type error: value of %s.%s being truncated" % (self.nescType, field["name"]) for i in range(len(bits), self.size*8) : bits += "0" bytes = bin2hex(bits) if len(bytes) != self.size: raise Exception("Byte conversion error: %s %d bytes to %d" % ( self.nescType, len(bytes), self.size)) return bytes def setBytes(self, bytes) : """Set all values using hexidecimal representation""" # We have to be careful in here about: # 1. bit fields (ie. bitSize shorter than nominal type size) # 2. packing (ie. bits that are not part of any particular field) if len(bytes) < self.size: raise Exception("Byte conversion error: %s %d bytes to %d" % (self.nescType, len(bytes), self.size) ) bits = hex2bin(bytes) for field in self.fields : newBits = "" for i in range(self.value[field["name"]].size*8) : newBits += "0" selectedBits=bits[field["bitOffset"]:field["bitOffset"]+field["bitSize"]] newBits = newBits[:-field["bitSize"]] + selectedBits newBytes = "" for i in range(self.value[field["name"]].size) : newBytes += '\x00' tmpBytes = bin2hex(newBits) newBytes = newBytes[:-len(tmpBytes)] + tmpBytes self.value[field["name"]].setBytes(newBytes); return bytes[self.size:] def packedSize(self) : if len(self.fields) == 0 : trueSize = 0 else : a,b,lastField = self._findLastNestedField() trueSize = (lastField["bitOffset"] + lastField["bitSize"]) /8 return trueSize def _findLastNestedField(self) : lastField = self parents = [] #find the last (possibly nested) field while issubclass(type(lastField), nescStruct) and len(lastField.fields) > 0 : parent = lastField lastFieldDef = parent.fields[-1] lastField = parent.value[lastFieldDef["name"]] parents.append( parent ) return (lastField, parents, lastFieldDef) class TosMsg ( nescStruct ) : """A python representation of a TosMsg. Is a nescStruct object. Can be used with pytos.comm.send, pytos.comm.register, pytos.comm.unregister. usage: msg = TosMsg(amType) msg = TosMsg(amType, nescStruct) msg = TosMsg(amType, ) print msg msg.field = X comm.send(msg) comm.register(msg, f) comm.unregister(msg, f) migMsg = msg.createMigMsg() msg.parseMigMsg(migMsg) """ def __init__(self, amType, *varargs): self.amType = amType self.parentMsg = None #if this is a nescStruct argument, make myself a clone of it if len(varargs) == 1 and issubclass(type(varargs[0]), nescStruct) : nescStruct._copyFields(varargs[0],self) #otherwise, make myself into a struct with the struct args elif len(varargs) >= 1: nescStruct.__init__(self, *varargs) def __deepcopy__(self, memo={}) : result = self.__class__(self.amType) memo[id(self)] = result self._copyFields(result, memo) result.parentMsg = deepcopy(self.parentMsg, memo) return result def getParentMsg(self, amOrName) : """This function will get the parent message with the amType or name specified""" if self.parentMsg == None : return None elif self.parentMsg.nescType == amOrName or self.parentMsg.amType == amOrName : return self.parentMsg else : return self.parentMsg.getParentMsg(amOrName) def createMigMsg(self) : """Returns a java BaseTOSMsg with same amType and length and with data payload of same bytes""" Message = tinyos.message.Message() msg = Message(self.size) msg.dataSet(unpack( str(self.size) + 'b', self.getBytes() ) ) msg.amTypeSet(self.amType) # msg.set_type( self.amType ) # msg.set_length(self.size) return msg def parseMigMsg(self, msg) : """Takes a java BaseTOSMsg and creates TosMsg with same amType and length and with data payload of same bytes""" self.amType = msg.amType() data = list(msg.dataGet()) self.setBytes(pack(str(len(data)) + 'b', *data)) def __repr__(self) : return "%s object at %s:\n\n\t%s" % (self.__class__, hex(id(self)), str(self)) def __str__(self) : """All fields and values as a readable string""" return "TosMsg(am=%d) " % self.amType + nescStruct.__str__(self) def setBytes(self, bytes) : """Extend this msg to be longer, if necessary to accomodate extra data. This only happens if the last field is a nescArray of length 0. Unlike nescStructs, TosMsg objects are not nested recursively, so it is Ok to do this.""" if len(bytes) > self.size : #trueSize() : #print "there are more bytes than fit in this msg... trying to grow msg" lastField, parents,b = self._findLastNestedField() #see if it is an array of size 0 if type(lastField) == nescArray and lastField.len == 0 : #make it bigger #print "last field is nescArray[0]... growing" lastFieldSize = lastField.elementType.size numExtraBytes = len(bytes) - self.size #trueSize() if numExtraBytes % lastFieldSize == 0: requiredArraySize = int( numExtraBytes/lastFieldSize ) lastField = nescArray(requiredArraySize, lastField.elementType) #print "new size is %d" % numExtraBytes #and set it, changing the size of all parent structs parents.reverse() for parent in parents : # trueSize = parent.trueSize() parent.value[parent.fields[-1]["name"]] = lastField parent.fields[-1]["bitSize"] = lastField.size*8 parent.size = self.packedSize()# + lastField.size lastField = parent else: #print "last field is not nescArray[0]. Cannot grow. Ignoring extra data." pass #make sure everything worked out correctly and call parent's function if len(bytes) != self.size :#trueSize() : raise Exception("Incorrect number of bytes for TosMsg. Byte conversion error: %s %d bytes to %d" % ( self.nescType, len(bytes), self.size) ) #print "passing to child to set bytes." nescStruct.setBytes(self,bytes) def getUniqueChild(xmlDefinition) : child = None for childNode in xmlDefinition.childNodes : if childNode.nodeType == 1 : child = childNode break return child def bin2hex(bits) : bytes = "" for i in range(0, len(bits), 8 ): bytes += pack('B',int(bits[i:i+8],2)) return bytes def hex2bin(bytes) : bits = "" for i in range(len(bytes)) : val, = unpack('B',bytes[i]) for j in range(7,-1,-1): if val>= pow(2,j): bits += "1" val -= pow(2,j) else : bits += "0" return bits def TestAppTypes() : testRpc = appTypes('/home/kamin/tinyos-1.x/contrib/hood/apps/TestRpc/build/telosb/nesc.xml') print testRpc if __name__ == "__main__": TestAppTypes() tinyos-2.1.2+dfsg/support/sdk/python/tinyos/tossim/__init__.py000066400000000000000000000031241207233610700245530ustar00rootroot00000000000000# Copyright (c) 2005 Stanford University. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of the copyright holders nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL # THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # # Author Philip Levis __all__ = ["TossimApp", "TossimNescDecls"] tinyos-2.1.2+dfsg/support/sdk/python/tinyos/utils/000077500000000000000000000000001207233610700222645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/support/sdk/python/tinyos/utils/Singleton.py000066400000000000000000000235051207233610700246050ustar00rootroot00000000000000# Copyright (c) 2006-2007 Chad Metcalf # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # # Author: Chad Metcalf # """ A Python Singleton mixin class that makes use of some of the ideas found at http://c2.com/cgi/wiki?PythonSingleton. Just inherit from it and you have a singleton. No code is required in subclasses to create singleton behavior -- inheritance from Singleton is all that is needed. Assume S is a class that inherits from Singleton. Useful behaviors are: 1) Getting the singleton: S.getInstance() returns the instance of S. If none exists, it is created. 2) The usual idiom to construct an instance by calling the class, i.e. S() is disabled for the sake of clarity. If it were allowed, a programmer who didn't happen notice the inheritance from Singleton might think he was creating a new instance. So it is felt that it is better to make that clearer by requiring the call of a class method that is defined in Singleton. An attempt to instantiate via S() will restult in an SingletonException being raised. 3) If S.__init__(.) requires parameters, include them in the first call to S.getInstance(.). If subsequent calls have parameters, a SingletonException is raised. 4) As an implementation detail, classes that inherit from Singleton may not have their own __new__ methods. To make sure this requirement is followed, an exception is raised if a Singleton subclass includ es __new__. This happens at subclass instantiation time (by means of the MetaSingleton metaclass. By Gary Robinson, grobinson@transpose.com. No rights reserved -- placed in the public domain -- which is only reasonable considering how much it owes to other people's version which are in the public domain. The idea of using a metaclass came from a comment on Gary's blog (see http://www.garyrobinson.net/2004/03/python_singleto.html#comments). Other improvements came from comments and email from other people who saw it online. (See the blog post and comments for further credits.) Not guaranteed to be fit for any particular purpose. Use at your own risk. """ class SingletonException(Exception): def __init__(self, *args): Exception.__init__(self) self.args = args class MetaSingleton(type): def __new__(metaclass, strName, tupBases, dict): if dict.has_key('__new__'): raise SingletonException, 'Can not override __new__ in a Singleton' return super(MetaSingleton,metaclass).__new__(metaclass, strName, tupBases, dict) def __call__(cls, *lstArgs, **dictArgs): raise SingletonException, 'Singletons may only be instantiated through getInstance()' class Singleton(object): __metaclass__ = MetaSingleton def getInstance(cls, *lstArgs): """ Call this to instantiate an instance or retrieve the existing instance. If the singleton requires args to be instantiated, include them the first time you call getInstance. """ if cls._isInstantiated(): if len(lstArgs) != 0: raise SingletonException, 'If no supplied args, singleton must already be instantiated, or __init__ must require no args' else: if cls._getConstructionArgCountNotCountingSelf() > 0 and len(lstArgs) <= 0: raise SingletonException, 'If the singleton requires __init__ args, supply them on first instantiation' instance = cls.__new__(cls) instance.__init__(*lstArgs) cls.cInstance = instance return cls.cInstance getInstance = classmethod(getInstance) def _isInstantiated(cls): return hasattr(cls, 'cInstance') _isInstantiated = classmethod(_isInstantiated) def _getConstructionArgCountNotCountingSelf(cls): return cls.__init__.im_func.func_code.co_argcount - 1 _getConstructionArgCountNotCountingSelf = classmethod(_getConstructionArgCountNotCountingSelf) def _forgetClassInstanceReferenceForTesting(cls): """ This is designed for convenience in testing -- sometimes you want to get rid of a singleton during test code to see what happens when you call getInstance() under a new situation. To really delete the object, all external references to it also need to be deleted. """ try: delattr(cls,'cInstance') except AttributeError: # run up the chain of base classes until we find the one that has the instance # and then delete it there for baseClass in cls.__bases__: if issubclass(baseClass, Singleton): baseClass._forgetClassInstanceReferenceForTesting() _forgetClassInstanceReferenceForTesting = classmethod(_forgetClassInstanceReferenceForTesting) if __name__ == '__main__': import unittest class PublicInterfaceTest(unittest.TestCase): def testReturnsSameObject(self): """ Demonstrates normal use -- just call getInstance and it returns a singleton instance """ class A(Singleton): def __init__(self): super(A, self).__init__() a1 = A.getInstance() a2 = A.getInstance() self.assertEquals(id(a1), id(a2)) def testInstantiateWithMultiArgConstructor(self): """ If the singleton needs args to construct, include them in the first call to get instances. """ class B(Singleton): def __init__(self, arg1, arg2): super(B, self).__init__() self.arg1 = arg1 self.arg2 = arg2 b1 = B.getInstance('arg1 value', 'arg2 value') b2 = B.getInstance() self.assertEquals(b1.arg1, 'arg1 value') self.assertEquals(b1.arg2, 'arg2 value') self.assertEquals(id(b1), id(b2)) def testTryToInstantiateWithoutNeededArgs(self): class B(Singleton): def __init__(self, arg1, arg2): super(B, self).__init__() self.arg1 = arg1 self.arg2 = arg2 self.assertRaises(SingletonException, B.getInstance) def testTryToInstantiateWithoutGetInstance(self): """ Demonstrates that singletons can ONLY be instantiated through getInstance, as long as they call Singleton.__init__ during construction. If this check is not required, you don't need to call Singleton.__init__(). """ class A(Singleton): def __init__(self): super(A, self).__init__() self.assertRaises(SingletonException, A) def testDontAllowNew(self): def instantiatedAnIllegalClass(): class A(Singleton): def __init__(self): super(A, self).__init__() def __new__(metaclass, strName, tupBases, dict): return super(MetaSingleton,metaclass).__new__(metaclass, strName, tupBases, dict) self.assertRaises(SingletonException, instantiatedAnIllegalClass) def testDontAllowArgsAfterConstruction(self): class B(Singleton): def __init__(self, arg1, arg2): super(B, self).__init__() self.arg1 = arg1 self.arg2 = arg2 b1 = B.getInstance('arg1 value', 'arg2 value') self.assertRaises(SingletonException, B, 'arg1 value', 'arg2 value') def test_forgetClassInstanceReferenceForTesting(self): class A(Singleton): def __init__(self): super(A, self).__init__() class B(A): def __init__(self): super(B, self).__init__() # check that changing the class after forgetting the instance produces # an instance of the new class a = A.getInstance() assert a.__class__.__name__ == 'A' A._forgetClassInstanceReferenceForTesting() b = B.getInstance() assert b.__class__.__name__ == 'B' # check that invoking the 'forget' on a subclass still deletes the instance B._forgetClassInstanceReferenceForTesting() a = A.getInstance() B._forgetClassInstanceReferenceForTesting() b = B.getInstance() assert b.__class__.__name__ == 'B' unittest.main() tinyos-2.1.2+dfsg/support/sdk/python/tinyos/utils/Watcher.py000066400000000000000000000051161207233610700242360ustar00rootroot00000000000000# Copyright (c) 2006-2007 Chad Metcalf # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # # Author: Chad Metcalf # import os import sys import signal from tinyos.utils.Singleton import Singleton class Watcher(Singleton): """ As seen in: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496735 This class solves two problems with multithreaded programs in Python, (1) a signal might be delivered to any thread (which is just a malfeature) and (2) if the thread that gets the signal is waiting, the signal is ignored (which is a bug). The watcher is a concurrent process (not thread) that waits for a signal and the process that contains the threads. See Appendix A of The Little Book of Semaphores. http://greenteapress.com/semaphores/ """ def __init__(self): """ Creates a child thread, which returns. The parent thread waits for a KeyboardInterrupt and then kills the child thread. """ Singleton.__init__(self) self.child = os.fork() if self.child != 0: self.watch() def watch(self): try: os.wait() except KeyboardInterrupt: # I put the capital B in KeyBoardInterrupt so I can # tell when the Watcher gets the SIGINT print 'KeyBoardInterrupt' self.kill() sys.exit() def kill(self): try: os.kill(self.child, signal.SIGKILL) except OSError, x: print "os.kill failed" print xtinyos-2.1.2+dfsg/support/sdk/python/tinyos/utils/__init__.py000066400000000000000000000022671207233610700244040ustar00rootroot00000000000000# Copyright (c) 2006-2007 Chad Metcalf # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # # Author: Chad Metcalf # __all__ = ["Singleton", "Watcher"] tinyos-2.1.2+dfsg/support/sdk/python/tos.py000066400000000000000000000577401207233610700207730ustar00rootroot00000000000000# Copyright (c) 2008 Johns Hopkins University. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of the copyright holders nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL # THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # @author Razvan Musaloiu-E. # @author David Purdy """ A library that implements the T2 serial communication. This library has two parts: one that deals with sending and receiving packets using the serial format from T2 (TEP113) and a second one that tries to simplifies the work with arbitrary packets. """ import sys, struct, time, socket, operator, os import traceback try: import serial except ImportError, e: print "Please install PySerial first." sys.exit(1) __version__ = "$Id: tos.py,v 1.12 2010-06-29 22:07:42 scipio Exp $" __all__ = ['Serial', 'AM', 'Packet', 'RawPacket', 'AckFrame', 'DataFrame', 'NoAckDataFrame', 'ActiveMessage'] HDLC_FLAG_BYTE = 0x7e HDLC_CTLESC_BYTE = 0x7d TOS_SERIAL_ACTIVE_MESSAGE_ID = 0 TOS_SERIAL_CC1000_ID = 1 TOS_SERIAL_802_15_4_ID = 2 TOS_SERIAL_UNKNOWN_ID = 255 SERIAL_PROTO_ACK = 67 SERIAL_PROTO_PACKET_ACK = 68 SERIAL_PROTO_PACKET_NOACK = 69 SERIAL_PROTO_PACKET_UNKNOWN = 255 def list2hex(v): return " ".join(["%02x" % p for p in v]) class Timeout(Exception): pass def getSource(comm): source = comm.split('@') params = source[1].split(':') debug = '--debug' in sys.argv if source[0] == 'serial': try: return Serial(params[0], int(params[1]), flush=True, debug=debug) except: print "ERROR: Unable to initialize a serial connection to", comm raise Exception elif source[0] == 'network': try: return SerialMIB600(params[0], int(params[1]), debug=debug) except: print "ERROR: Unable to initialize a network connection to", comm print "ERROR:", traceback.format_exc() raise Exception raise Exception class Serial: def __init__(self, port, baudrate, flush=False, debug=False, readTimeout=None, ackTimeout=0.02): self.debug = debug self.readTimeout = readTimeout self.ackTimeout = ackTimeout self._ts = None if port.startswith('COM') or port.startswith('com'): port = int(port[3:]) - 1 elif port.isdigit(): port = int(port) - 1 self._s = serial.Serial(port, int(baudrate), rtscts=0, timeout=0.5) self._s.flushInput() if flush: print >>sys.stdout, "Flushing the serial port", endtime = time.time() + 1 while time.time() < endtime: self._s.read() sys.stdout.write(".") if not self.debug: sys.stdout.write("\n") self._s.close() self._s = serial.Serial(port, baudrate, rtscts=0, timeout=readTimeout) def getByte(self): c = self._s.read() if c == '': raise Timeout #print 'Serial:getByte: 0x%02x' % ord(c) return ord(c) def putBytes(self, data): #print "DEBUG: putBytes:", data for b in data: self._s.write(struct.pack('B', b)) time.sleep(0.000001) def getTimeout(self): return self._s.timeout def setTimeout(self, timeout): self._s.timeout = timeout class SerialMIB600: def __init__(self, host, port=10002, debug=False, readTimeout=None, ackTimeout=0.5): self.debug = debug self.readTimeout = readTimeout self.ackTimeout = ackTimeout self._ts = None self._s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._s.connect((host, port)) print "Connected" def getByte(self): try: c = self._s.recv(1) except socket.timeout: c = '' if c == '': raise Timeout #print 'Serial:getByte: 0x%02x' % ord(c) return ord(c) def putBytes(self, data): #print "DEBUG: putBytes:", data for b in data: self._s.send(struct.pack('B', b)) def getTimeout(self): return self._s.gettimeout() def setTimeout(self, timeout): self._s.settimeout(timeout) class HDLC: """ An HDLC object offers a way to send and receive data on a byte source using a HDLC-like formating. """ def __init__(self, source): self._s = source # Returns the next incoming serial packet def read(self, timeout=None): """Wait for a packet and return it as a RawPacket.""" # Developer notes: # # Packet data read is in this format: # [HDLC_FLAG_BYTE][Escaped data][HDLC_FLAG_BYTE] # # [Escaped data] is encoded so that [HDLC_FLAG_BYTE] byte # values cannot occur within it. When [Escaped data] has been # unescaped, the last 2 bytes are a 16-bit CRC of the earlier # part of the packet (excluding the initial HDLC_FLAG_BYTE # byte) # # It's also possible that the serial device was half-way # through transmitting a packet when this function was called # (app was just started). So we also neeed to handle this # case: # # [Incomplete escaped data][HDLC_FLAG_BYTE][HDLC_FLAG_BYTE][Escaped data][HDLC_FLAG_BYTE] # # In this case we skip over the first (incomplete) packet. # if self._s.getTimeout() != timeout and timeout != None: self.log("Set the timeout to %s, previous one was %s" % (timeout, self._s.getTimeout())) self._s.setTimeout(timeout) # +--- FLAG -----+ # | | ___________ # v | / | # >(1)-- !FLAG -->(2)<-- !FLAG --+ # | # FLAG # | ___________ # v / | # (3)<-- FLAG ---+ # | # !FLAG # | ___________ # v / | # (4)<-- !FLAG --+ # | # FLAG # | # v # (5) try: # Read bytes until we get to a HDLC_FLAG_BYTE value # (either the end of a packet, or the start of a new one) d = self._s.getByte() ts = time.time() if d != HDLC_FLAG_BYTE: self.log("Skipping byte %d" % d) while d != HDLC_FLAG_BYTE: d = self._s.getByte() self.log("Skipping byte %d" % d) ts = time.time() # Store HDLC_FLAG_BYTE at the start of the retrieved packet # data: packet = [d] # Is the next byte also HDLC_FLAG_BYTE? d = self._s.getByte() while d == HDLC_FLAG_BYTE: d = self._s.getByte() ts = time.time() # We are now on the 2nd byte of the packet. Add it to # our retrieved packet data: packet.append(d) # Read bytes from serial until we read another HDLC_FLAG_BYTE # value (end of the current packet): while d != HDLC_FLAG_BYTE: d = self._s.getByte() packet.append(d) # Done reading a whole packet from serial self.log("SimpleSerial:_read: unescaped %s" % packet) # Decode the packet, and check CRC: packet = self._unescape(packet) crc = self._crc16(0, packet[1:-3]) packet_crc = self._decode(packet[-3:-1]) if crc != packet_crc: print "Warning: wrong CRC! %x != %x %s" % (crc, packet_crc, ["%2x" % i for i in packet]) if not self._s._ts: self._s._ts = ts self.log("Serial:_read: %.4f (%.4f) Recv: %s" % (ts, ts - self._s._ts, self._format(packet[1:-3]))) self._ts = ts # Packet was successfully retrieved, so return it in a # RawPacket wrapper object (but leave out the HDLC_FLAG_BYTE # and CRC bytes) return RawPacket(ts, packet[1:-3]) except Timeout: return None def write(self, payload, seqno): """ Write a packet. If the payload argument is a list, it is assumed to be exactly the payload. Otherwise the payload is assume to be a Packet and the real payload is obtain by calling the .payload(). """ if isinstance(payload, Packet): payload = payload.payload() packet = DataFrame(); # We need to always request for acks packet.protocol = SERIAL_PROTO_PACKET_ACK packet.seqno = seqno packet.dispatch = 0 packet.data = payload packet = packet.payload() crc = self._crc16(0, packet) packet.append(crc & 0xff) packet.append((crc >> 8) & 0xff) packet = [HDLC_FLAG_BYTE] + self._escape(packet) + [HDLC_FLAG_BYTE] self.log("Serial: write %s" % packet) self._s.putBytes(packet) def _format(self, payload): f = NoAckDataFrame(payload) if f.protocol == SERIAL_PROTO_ACK: rpacket = AckFrame(payload) return "Ack seqno: %d" % (rpacket.seqno) else: rpacket = ActiveMessage(f.data) return "D: %04x S: %04x L: %02x G: %02x T: %02x | %s" % \ (rpacket.destination, rpacket.source, rpacket.length, rpacket.group, rpacket.type, list2hex(rpacket.data)) def _crc16(self, base_crc, frame_data): crc = base_crc for b in frame_data: crc = crc ^ (b << 8) for i in range(0, 8): if crc & 0x8000 == 0x8000: crc = (crc << 1) ^ 0x1021 else: crc = crc << 1 crc = crc & 0xffff return crc def _encode(self, val, dim): output = [] for i in range(dim): output.append(val & 0xFF) val = val >> 8 return output def _decode(self, v): r = long(0) for i in v[::-1]: r = (r << 8) + i return r def _unescape(self, packet): r = [] esc = False for b in packet: if esc: r.append(b ^ 0x20) esc = False elif b == HDLC_CTLESC_BYTE: esc = True else: r.append(b) return r def _escape(self, packet): r = [] for b in packet: if b == HDLC_FLAG_BYTE or b == HDLC_CTLESC_BYTE: r.append(HDLC_CTLESC_BYTE) r.append(b ^ 0x20) else: r.append(b) return r def log(self, s): if self._s.debug: print s class SimpleAM(object): def __init__(self, source, oobHook=None): self._source = source self._hdlc = HDLC(source) self.seqno = 0 self.oobHook = oobHook def read(self, timeout=None): f = self._hdlc.read(timeout) if f: return ActiveMessage(NoAckDataFrame(f)) return None def write(self, packet, amId, timeout=5, blocking=True, inc=1): self.seqno = (self.seqno + inc) % 256 prevTimeout = self._source.getTimeout() ack = None end = None if timeout: end = time.time() + timeout while not end or time.time() < end: self._hdlc.write(ActiveMessage(packet, amId=amId), seqno=self.seqno) if not blocking: return True start = time.time() f = self._hdlc.read(self._source.ackTimeout) if f == None: #print "Ack Timeout!" continue ack = AckFrame(f) while ack.protocol != SERIAL_PROTO_ACK and (not end or time.time() < end): if self.oobHook: self.oobHook(ActiveMessage(NoAckDataFrame(f))) else: print 'SimpleAM:write: skip', ack, f f = self._hdlc.read(self._source.ackTimeout) if f == None: #print "Ack Timeout!" break ack = AckFrame(f) if f != None: break self._source.setTimeout(prevTimeout) #print 'SimpleAM:write: got an ack:', ack, ack.seqno == self.seqno return (ack != None and ack.seqno == self.seqno) def setOobHook(self, oobHook): self.oobHook = oobHook def printfHook(packet): if packet == None: return if packet.type == 100: s = "".join([chr(i) for i in packet.data]).strip('\0') lines = s.split('\n') for line in lines: if line: print "PRINTF:", line packet = None # No further processing for the printf packet return packet class AM(SimpleAM): def __init__(self, s=None, oobHook=None): if s == None: try: s = getSource(sys.argv[1]) except: try: for (i, j) in zip(sys.argv[1::2], sys.argv[2::2]): if i == '-comm': s = getSource(j) if s == None: raise Exception except: try: s = getSource(os.environ['MOTECOM']) except: print "ERROR: Please indicate a way to connect to the mote" sys.exit(-1) if oobHook == None: oobHook = printfHook super(AM, self).__init__(s, oobHook) def read(self, timeout=None): return self.oobHook(super(AM, self).read(timeout)) def write(self, packet, amId, timeout=None, blocking=True): r = super(AM, self).write(packet, amId, timeout, blocking) while not r: r = super(AM, self).write(packet, amId, timeout, blocking, inc=0) if timeout and not r: raise Timeout return True # class SFClient: # def __init__(self, host, port, qsize=10): # self._in_queue = Queue(qsize) # self._s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # self._s.connect((host, port)) # data = self._s.recv(2) # if data != 'U ': # print "Wrong handshake" # self._s.send("U ") # print "Connected" # thread.start_new_thread(self.run, ()) # def run(self): # while True: # length = ord(self._s.recv(1)) # data = self._s.recv(length) # data = [ord(c) for c in data][1:] # #print "Recv %d bytes" % (length), ActiveMessage(data) # if self._in_queue.full(): # print "Warning: Buffer overflow" # self._in_queue.get() # p = RawPacket() # p.data = data # self._in_queue.put(p, block=False) # def read(self, timeout=0): # return self._in_queue.get() # def write(self, payload): # print "SFClient: write:", payload # if type(payload) != type([]): # # Assume this will be derived from Packet # payload = payload.payload() # payload = [0] + payload # self._s.send(chr(len(payload))) # self._s.send(''.join([chr(c) for c in payload])) # return True ################################################################################ class Packet: """ The Packet class offers a handy way to build pack and unpack binary data based on a given pattern. """ def _decode(self, v): r = long(0) for i in v: r = (r << 8) + i return r def _encode(self, val, dim): output = [] for i in range(dim): output.append(int(val & 0xFF)) val = val >> 8 output.reverse() return output def _sign(self, val, dim): if val > (1 << (dim * 8 - 1)): return val - (1 << (dim * 8)) return val def __init__(self, desc, packet = None): offset = 0 boffset = 0 sum = 0 for i in range(len(desc)-1, -1, -1): (n, t, s) = desc[i] if s == None: if sum > 0: desc[i] = (n, t, -sum) break sum += s self.__dict__['_schema'] = [(t, s) for (n, t, s) in desc] self.__dict__['_names'] = [n for (n, t, s) in desc] self.__dict__['_values'] = [] if type(packet) == type([]): for (t, s) in self._schema: if t == 'int': self._values.append(self._decode(packet[offset:offset + s])) offset += s elif t == 'sint': self._values.append(self._sign(self._decode(packet[offset:offset + s]), s)) offset += s elif t == 'bint': doffset = 8 - (boffset + s) self._values.append((packet[offset] >> doffset) & ((1< 0: self._values.append(packet[offset:offset + s]) offset += s else: self._values.append(packet[offset:s]) offset = len(packet) + s else: self._values.append(packet[offset:]) elif type(packet) == type(()): for i in packet: self._values.append(i) else: for v in self._schema: self._values.append(None) def __repr__(self): return self._values.__repr__() def __str__(self): r = "" for i in range(len(self._names)): r += "%s: %s " % (self._names[i], self._values[i]) for i in range(len(self._names), len(self._values)): r += "%s" % self._values[i] return r # Implement the struct behavior def __getattr__(self, name): if type(name) == type(0): return self._names[name] else: return self._values[self._names.index(name)] def __setattr__(self, name, value): if type(name) == type(0): self._values[name] = value else: self._values[self._names.index(name)] = value def __ne__(self, other): if other.__class__ == self.__class__: return self._values != other._values else: return True def __eq__(self, other): if other.__class__ == self.__class__: return self._values == other._values else: return False def __nonzero__(self): return True; # Implement the map behavior def __getitem__(self, key): return self.__getattr__(key) def __setitem__(self, key, value): self.__setattr__(key, value) def __len__(self): return len(self._values) def keys(self): return self._names def values(self): return self._values # Custom functions def names(self): return self._names def sizes(self): return self._schema def payload(self): r = [] boffset = 0 for i in range(len(self._schema)): (t, s) = self._schema[i] if t == 'int': r += self._encode(self._values[i], s) boffset = 0 elif t == 'bint': doffset = 8 - (boffset + s) if boffset == 0: r += [self._values[i] << doffset] else: r[-1] |= self._values[i] << doffset boffset += s if boffset == 8: boffset = 0 elif self._values[i] != []: r += self._values[i] for i in self._values[len(self._schema):]: r += i return r class RawPacket(Packet): def __init__(self, ts = None, data = None): Packet.__init__(self, [('ts' , 'int', 4), ('data', 'blob', None)], None) self.ts = ts; self.data = data class AckFrame(Packet): def __init__(self, payload = None): if isinstance(payload, Packet): if isinstance(payload, RawPacket): payload = payload.data else: payload = payload.payload() Packet.__init__(self, [('protocol', 'int', 1), ('seqno', 'int', 1)], payload) class DataFrame(Packet): def __init__(self, payload = None): if isinstance(payload, Packet): if isinstance(payload, RawPacket): payload = payload.data else: payload = payload.payload() Packet.__init__(self, [('protocol', 'int', 1), ('seqno', 'int', 1), ('dispatch', 'int', 1), ('data', 'blob', None)], payload) class NoAckDataFrame(Packet): def __init__(self, payload = None): if isinstance(payload, Packet): if isinstance(payload, RawPacket): payload = payload.data else: payload = payload.payload() Packet.__init__(self, [('protocol', 'int', 1), ('dispatch', 'int', 1), ('data', 'blob', None)], payload) class ActiveMessage(Packet): def __init__(self, packet = None, amId = 0x00, dest = 0xFFFF): payload = None if type(packet) == type([]): payload = packet elif isinstance(packet, NoAckDataFrame): payload = packet.data packet = None Packet.__init__(self, [('destination', 'int', 2), ('source', 'int', 2), ('length', 'int', 1), ('group', 'int', 1), ('type', 'int', 1), ('data', 'blob', None)], payload) if payload == None: self.destination = dest self.source = 0x0000 self.group = 0x00 self.type = amId self.data = [] if isinstance(packet, Packet): self.data = packet.payload() self.length = len(self.data) tinyos-2.1.2+dfsg/tos/000077500000000000000000000000001207233610700145665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/.default-platform000066400000000000000000000000051207233610700200300ustar00rootroot00000000000000null tinyos-2.1.2+dfsg/tos/chips/000077500000000000000000000000001207233610700156745ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/README000066400000000000000000000063651207233610700165660ustar00rootroot00000000000000============================================== Directory Description: tos/chips ============================================== :$Id: README,v 1.4 2006-12-12 18:23:02 vlahan Exp $ :TinyOS-Version: 2.0 :Author: Martin Turon :Created: 14-Feb-2005 :Version: $Revision: 1.4 $ :Modified: $Date: 2006-12-12 18:23:02 $ 1. Introduction ==================================================================== Platform dependant code independent of a specific platform ---------------------------------------------------------- The tos/chips directory is designed to house code to drive a particular chip in a way that can be shared across disparate platforms that share that particular chip. One of the main issues in tinyos-1.x that limited portability was that similar platforms would often copy code files hard-code customizations, rather than rigorously share common code. By placing chip-specific code here in a designated chips directory, and enforcing a policy of making this code specific to the chip but not the platform, code reuse will be promoted. 2. Microcontrollers ==================================================================== ATmega128 --------- Part of the AVR 8-bit series by Atmel corporation. Atmel's AVR microcontrollers have a RISC core running single cycle instructions and a well-defined I/O structure that limits the need for external components. Internal oscillators, timers, UART, SPI, pull-up resistors, pulse width modulation, ADC, analog comparator and watch-dog timers are some of the features you will find in AVR devices. 128-Kbyte self-programming Flash Program Memory, 4-Kbyte SRAM, 4-Kbyte EEPROM, 8 Channel 10-bit A/D-converter. JTAG interface for on-chip-debug. Up to 16 MIPS throughput at 16 MHz. 2.7 - 5.5 Volt operation. http://atmel.com/dyn/products/product_card.asp?part_id=2018 msp430 ------ The MSP430 family of ultra-low-power 16-bit RISC mixed-signal processors from Texas Instruments provides the ultimate solution for battery-powered measurement applications. http://focus.ti.com/mcu/docs/overview.tsp?familyId=342&templateId=5246&navigationId=11466&path=templatedata/cm/mcuovw/data/msp430_ovw 3. Radio Chips ==================================================================== cc2420 ------ The CC2420 is a low-cost transceiver designed specifically for low-power, low-voltage RF applications in the 2.4 GHz unlicensed ISM band. It is the first commercially available RF Transceiver compliant with the IEEE 802.15.4 standard and the first RF-IC that can be qualified for use in 2.4 GHz ZigBeetm products. http://www.chipcon.com/index.cfm?kat_id=2&subkat_id=12&dok_id=115 cc1000 ------ The CC1000 is a true ultra-low-power single-chip RF transceiver for e.g. the 315, 433, 868, 915 MHz bands. It has been specifically designed to comply with the most stringent demands of the low power radio market. Based on a pure CMOS technology this is the first product in the market that offers a unique combination of low cost and high integration, performance and flexibility, thus setting a new standard for short-range wireless communication. http://www.chipcon.com/index.cfm?kat_id=2&subkat_id=12&dok_id=14 4. Volatile Flash Chips ==================================================================== tinyos-2.1.2+dfsg/tos/chips/ad5200/000077500000000000000000000000001207233610700165675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/ad5200/AD5200C.nc000066400000000000000000000052101207233610700200050ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:02 $ * ======================================================================== */ /** * There is currently no TEP for describing devices of this type.

    * * This component provides the implementation of the ad5200 potentiometer * chip. It is currently the only chip of its type, and does not conform to * any existing TEP standard. This component will be updated as a TEP for * potentiometers is developed in the near future. * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ configuration AD5200C { provides { interface Pot; interface Resource; interface StdControl; } } implementation { components AD5200P , AD5200SpiC , AD5200PotIO , MainC ; StdControl = AD5200P; Pot = AD5200P; Resource = AD5200SpiC; MainC.SoftwareInit-> AD5200P.Init; AD5200P.ENPOT -> AD5200PotIO.AD5200PotENPOT; AD5200P.SDPOT -> AD5200PotIO.AD5200PotSDPOT; AD5200P.SpiByte -> AD5200SpiC; } tinyos-2.1.2+dfsg/tos/chips/ad5200/AD5200P.nc000066400000000000000000000070061207233610700200270ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:02 $ * ======================================================================== */ /** * There is currently no TEP for describing devices of this type.

    * * This component provides the internal implementation of the ad5200 potentiometer * chip. It is currently the only chip of its type, and does not conform to * any existing TEP standard. This component will be updated as a TEP for * potentiometers is developed in the near future. * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ module AD5200P { provides { interface Init; interface Pot; interface StdControl; } uses { interface GeneralIO as ENPOT; interface GeneralIO as SDPOT; interface SpiByte; } } implementation { uint8_t Pot_value = -1; /************** interface commands **************/ command error_t Init.init() { call ENPOT.makeOutput(); call SDPOT.makeOutput(); call ENPOT.set(); call SDPOT.set(); return SUCCESS; } command error_t StdControl.start() { call SDPOT.set(); call ENPOT.set(); return SUCCESS; } command error_t StdControl.stop() { call ENPOT.set(); call SDPOT.clr(); return SUCCESS; } async command error_t Pot.set(uint8_t setting) { call ENPOT.clr(); call SpiByte.write(setting); call ENPOT.set(); atomic Pot_value = setting; return SUCCESS; } async command uint8_t Pot.get() { return Pot_value; } async command error_t Pot.increase() { if (Pot_value < 255 && Pot_value >= 0) { Pot_value++; return call Pot.set(Pot_value); } else return FAIL; } async command error_t Pot.decrease() { if (Pot_value > 0) { Pot_value--; return call Pot.set(Pot_value); } else return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/ad5200/AD5200SpiC.nc000066400000000000000000000045161207233610700204710ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:02 $ * ======================================================================== */ /** * There is currently no TEP for describing components of this type.

    * * Configuration file for using the default Spi implementation for writing * a value to the Ad5200 Potentiometer. This file can be shadowed in the * application or platform directory in order to use a different Spi * implementation. * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ configuration AD5200SpiC { provides { interface Resource; interface SpiByte; } } implementation { components new Spi0C() as Spi; Resource = Spi; SpiByte = Spi; } tinyos-2.1.2+dfsg/tos/chips/ad5200/Pot.nc000066400000000000000000000071311207233610700176550ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:02 $ * ======================================================================== */ /** * There is currently no TEP for describing this interface.

    * * This interface is an attempt at describing the HIL abstraction for * potentiomter devices. Since there is currently no TEP describing the * abstractions for potentiometers, this interface will need to be updated * once one is created. * * @author Jason Hill * @author David Gay * @author Philip Levis * @author Kevin Klues (klues@tkn.tu-berlin.de) -- modified for TinyOS-2.x */ interface Pot { /** * Set the potentiometer value. * * @param setting -- The new value of the potentiometer. * @return SUCCESS if the setting was successful
    * FAIL if the component has not been initialized or the desired * setting is outside of the valid range. */ async command error_t set(uint8_t setting); /** * Increment the potentiometer value by 1. This function proves to be * quite useful in active potentiometer control scenarios. * * @return SUCCESS if the increment was successful.
    * FAIL if the component has not been initialized or if the * potentiometer cannot be incremented further. */ async command error_t increase(); /** * Decrement the potentiometer value by 1. This function proves to be * quite useful in active potentiometer control scenarios. * * @return SUCCESS if the decrement was successful. * FAIL if the component has not been initialized or if the * potentiometer cannot be decremented further. */ async command error_t decrease(); /** * Return the current setting of the potentiometer. * @return An unsigned 8-bit value denoting the current setting of the * potentiometer. */ async command uint8_t get(); } tinyos-2.1.2+dfsg/tos/chips/ad5200/PotC.nc000066400000000000000000000045421207233610700177630ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:02 $ * ======================================================================== */ /** * There is currently no TEP for describing devices of this type.

    * * This component provides the HIL abstraction for the Ad5200 potentiomter. * Since there is currently no TEP describing the abstractions for * potentiometers, this component will need to be updated once one is created. * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ configuration PotC { provides { interface Resource; interface Pot; interface StdControl; } } implementation { components Ad5200C; Pot = Ad5200C; StdControl = Ad5200C; Resource = Ad5200C; } tinyos-2.1.2+dfsg/tos/chips/ade7753/000077500000000000000000000000001207233610700167535ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/ade7753/ACMeter.h000066400000000000000000000034121207233610700204040ustar00rootroot00000000000000/* * Copyright (c) 2011 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef ACMETER_H #define ACMETER_H typedef enum { ACMETER_OFF, ACMETER_ON, } acmeter_state_t; struct acmeter_buffer { uint16_t sz; struct acmeter_buffer *next; }; #endif tinyos-2.1.2+dfsg/tos/chips/ade7753/ACMeter.nc000066400000000000000000000032571207233610700205640ustar00rootroot00000000000000/* * Copyright (c) 2011 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ interface ACMeter { command uint8_t getGain(); command void setGain(uint8_t gain); } tinyos-2.1.2+dfsg/tos/chips/ade7753/ACMeterC.nc000066400000000000000000000054011207233610700206600ustar00rootroot00000000000000/* * Copyright (c) 2011 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * AC Mote and Energy Meter using ADE7753 * * @author Fred Jiang * @author Thomas Schmid (generalized module) */ configuration ACMeterC { provides { interface SplitControl; interface ReadStream as ReadEnergy; interface GetSet as RelayConfig; interface GetSet as GainConfig; interface Get as GetPeriod; } uses { interface SpiPacket; interface Resource as SpiResource; interface GeneralIO as CSN; interface GeneralIO as RelayIO; } } implementation { #ifdef DEBUG_ADE7753 components DiagMsgC; #endif components MainC; components ACMeterP, ADE7753P, LedsC; components new AlarmMilliC() as SampleAlarmC; SplitControl = ACMeterP; ReadEnergy = ACMeterP; RelayConfig = ACMeterP; GainConfig = ACMeterP; GetPeriod = ACMeterP; MainC.SoftwareInit -> ADE7753P.Init; ACMeterP.Leds -> LedsC; ACMeterP.ADE7753 -> ADE7753P; ACMeterP.MeterControl -> ADE7753P; ACMeterP.SampleAlarm -> SampleAlarmC; RelayIO = ACMeterP.onoff; SpiPacket = ADE7753P.SpiPacket; CSN = ADE7753P.SPIFRM; ADE7753P.Leds -> LedsC; SpiResource = ADE7753P.Resource; } tinyos-2.1.2+dfsg/tos/chips/ade7753/ACMeterP.nc000066400000000000000000000202641207233610700207010ustar00rootroot00000000000000/* * Copyright (c) 2011 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * AC Mote and Energy Meter using ADE7753 * * @author Fred Jiang * @author Thomas Schmid (generalized module) */ #include #include #include #include "ACMeter.h" module ACMeterP { provides { interface SplitControl; interface ReadStream as ReadEnergy; interface GetSet as RelayConfig; interface GetSet as GainConfig; interface Get as GetPeriod; } uses { interface Alarm as SampleAlarm; interface Leds; interface ADE7753; interface SplitControl as MeterControl; interface GeneralIO as onoff; } } implementation { acmeter_state_t onoff_state; norace uint32_t m_gain; uint32_t m_period, m_last; norace uint16_t m_mode; bool dirty; uint32_t *current_buffer, *deliver_buffer; uint16_t current_buffer_size, deliver_buffer_size; uint16_t current_buffer_idx; struct acmeter_buffer *extra_buffers = NULL; norace enum { OFF, INIT, ON, } state = OFF; norace enum { SET_MODE, SET_GAIN, DONE, } initState = SET_MODE; task void signalStartDone() { signal SplitControl.startDone(SUCCESS); } // this state machine drives the initialization task void init_task() { ASSERT(state == INIT); switch(initState) { case SET_MODE: call Leds.led2On(); m_mode = (1<sz; extra_buffers = extra_buffers->next; } else { current_buffer = NULL; } } } } } } async event void ADE7753.getRegDone( error_t error, uint8_t regAddr, uint32_t val, uint16_t len) { if (state == INIT) { post init_task(); return; } ASSERT(state == ON); switch(regAddr) { case ADE7753_RAENERGY: readRAEnergy(val); break; default: ASSERT(1); } } /* adding buffers */ command error_t ReadEnergy.postBuffer(uint32_t *buf, uint16_t count) { atomic { if (current_buffer == NULL) { current_buffer = buf; current_buffer_size = count; current_buffer_idx = 0; } else { struct acmeter_buffer *newbuf = (struct acmeter_buffer *)buf; if (count * sizeof(uint32_t) < sizeof(struct acmeter_buffer)) { return ESIZE; } newbuf->sz = count; newbuf->next = extra_buffers; extra_buffers = newbuf; } } return SUCCESS; } async event void ADE7753.setRegDone( error_t error, uint8_t regAddr, uint32_t val, uint16_t len) { if (state == INIT) { post init_task(); return; } ASSERT(state == ON); switch (regAddr) { default: ASSERT(1); } } } tinyos-2.1.2+dfsg/tos/chips/ade7753/ADE7753.h000066400000000000000000000103671207233610700200520ustar00rootroot00000000000000/* * Copyright (c) 2011 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * types and register defs for ADE7753 energy meter * @author Fred Jiang */ #ifndef __ADE7753_H__ #define __ADE7753_H__ // Register addresses #define ADE7753_WAVEFORM 0x01 #define ADE7753_AENERGY 0x02 #define ADE7753_RAENERGY 0x03 #define ADE7753_LAENERGY 0x04 #define ADE7753_VAENERGY 0x05 #define ADE7753_RVAENERGY 0x06 #define ADE7753_LVAENERGY 0x07 #define ADE7753_LVARENERGY 0x08 #define ADE7753_MODE 0x09 #define ADE7753_IRQEN 0x0A #define ADE7753_STATUS 0x0B #define ADE7753_RSTATUS 0x0C #define ADE7753_CH1OS 0x0D #define ADE7753_CH2OS 0x0E #define ADE7753_GAIN 0x0F #define ADE7753_PHCAL 0x10 #define ADE7753_APOS 0x11 #define ADE7753_WGAIN 0x12 #define ADE7753_WDIV 0x13 #define ADE7753_CFNUM 0x14 #define ADE7753_CFDEN 0x15 #define ADE7753_IRMS 0x16 #define ADE7753_VRMS 0x17 #define ADE7753_IRMSOS 0x18 #define ADE7753_VRMSOS 0x19 #define ADE7753_VGAIN 0x1A #define ADE7753_VADIV 0x1B #define ADE7753_LINECYC 0x1C #define ADE7753_ZXTOUT 0x1D #define ADE7753_SAGCYC 0x1E #define ADE7753_SAGLVL 0x1F #define ADE7753_IPKLVL 0x20 #define ADE7753_VPKLVL 0x21 #define ADE7753_IPEAK 0x22 #define ADE7753_RSTIPEAK 0x23 #define ADE7753_VPEAK 0x24 #define ADE7753_RSTVPEAK 0x25 #define ADE7753_TEMP 0x26 // gain settings #define ADE7753_GAIN_PGA_CH1 0 #define ADE7753_GAIN_SCALE_CH1 3 #define ADE7753_GAIN_PGA_CH2 5 #define ADE7753_GAIN_1 0 #define ADE7753_GAIN_2 1 #define ADE7753_GAIN_4 2 #define ADE7753_GAIN_8 3 #define ADE7753_GAIN_16 4 #define ADE7753_GAIN_SCALE_05 0 #define ADE7753_GAIN_SCALE_025 1 #define ADE7753_GAIN_SCALE_0125 2 // mode settings #define ADE7753_MODE_DISHPF 0 #define ADE7753_MODE_DISHLPF2 1 #define ADE7753_MODE_DISCF 2 #define ADE7753_MODE_DISSAG 3 #define ADE7753_MODE_ASUSPEND 4 #define ADE7753_MODE_TEMPSEL 5 #define ADE7753_MODE_SWRST 6 #define ADE7753_MODE_CYCMODE 7 #define ADE7753_MODE_DISH1 8 #define ADE7753_MODE_DISH2 9 #define ADE7753_MODE_SWAP 10 #define ADE7753_MODE_DTRT 11 #define ADE7753_MODE_WAVSEL 13 #define ADE7753_MODE_POAM 15 #define ADE7753_IRQ_AEHF 0 #define ADE7753_IRQ_SAG 1 #define ADE7753_IRQ_CYCEND 2 #define ADE7753_IRQ_WSMP 3 #define ADE7753_IRQ_ZX 4 #define ADE7753_IRQ_TEMP 5 #define ADE7753_IRQ_RESET 6 #define ADE7753_IRQ_AEOF 7 #define ADE7753_IRQ_PKV 8 #define ADE7753_IRQ_PKI 9 #define ADE7753_IRQ_VAEHF 10 #define ADE7753_IRQ_VAEOF 11 #define ADE7753_IRQ_ZXTO 12 #define ADE7753_IRQ_PPOS 13 #define ADE7753_IRQ_PNEG 14 #endif // __ADE7753_H__ tinyos-2.1.2+dfsg/tos/chips/ade7753/ADE7753.nc000066400000000000000000000037331207233610700202220ustar00rootroot00000000000000/* * Copyright (c) 2011 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ interface ADE7753 { async command error_t getReg(uint8_t regAddr, uint8_t len); async event void getRegDone( error_t error, uint8_t regAddr, uint32_t val, uint16_t len); async command error_t setReg( uint8_t regAddr, uint8_t len, uint32_t val); async event void setRegDone( error_t error , uint8_t regAddr, uint32_t val, uint16_t len); // async event void alertThreshold(); } tinyos-2.1.2+dfsg/tos/chips/ade7753/ADE7753P.nc000066400000000000000000000156701207233610700203450ustar00rootroot00000000000000/* * Copyright (c) 2011 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include module ADE7753P { provides { interface Init; interface SplitControl; interface ADE7753; } uses { interface Resource; interface SpiPacket; interface GeneralIO as SPIFRM; interface Leds; } } implementation { enum { STATE_IDLE, STATE_STARTING, STATE_STOPPING, STATE_STOPPED, STATE_GETREG, STATE_SETREG, STATE_ERROR }; uint8_t mSPIRxBuf[4],mSPITxBuf[4]; uint8_t mSPITxLen; uint8_t mSPIRxLen; // bool lock; uint8_t mState; bool misInited = FALSE; norace error_t mSSError; task void StartDone() { atomic mState = STATE_IDLE; signal SplitControl.startDone(SUCCESS); return; } task void StopDone() { signal SplitControl.stopDone(mSSError); return; } command error_t Init.init() { atomic { if (!misInited) { misInited = TRUE; mState = STATE_STOPPED; } // Control CS pin manually call SPIFRM.makeOutput(); call SPIFRM.set(); } return SUCCESS; } command error_t SplitControl.start() { error_t error = SUCCESS; atomic { if (mState == STATE_STOPPED) { mState = STATE_IDLE; } else { error = EBUSY; } } if (error) return error; atomic mState = STATE_IDLE; call SPIFRM.set(); post StartDone(); return error; } command error_t SplitControl.stop() { error_t error = SUCCESS; // atomic lock = FALSE; atomic { if (mState == STATE_IDLE) { // mState = STATE_STOPPING; mState = STATE_STOPPED; } else { error = EBUSY; } } if (error) return error; atomic mState = STATE_STOPPED; call SPIFRM.set(); post StopDone(); return error; } event void Resource.granted() { atomic switch(mState) { case STATE_GETREG: // call Leds.led0Toggle(); call SPIFRM.clr(); // CS LOW if (call SpiPacket.send(mSPITxBuf,mSPIRxBuf,mSPIRxLen) == FAIL) call Resource.request(); break; case STATE_SETREG: // call Leds.led0On(); call SPIFRM.clr(); // CS LOW if (call SpiPacket.send(mSPITxBuf,mSPIRxBuf,mSPITxLen) == FAIL) call Resource.request(); break; default: call Resource.release(); } } // Here I'm forcing 24 bit receive data async command error_t ADE7753.getReg(uint8_t regAddr, uint8_t len) { error_t error = SUCCESS; atomic { if (mState != STATE_IDLE) { return FAIL; } else { mState = STATE_GETREG; } } mSPITxBuf[0] = regAddr; mSPITxBuf[1] = 0; mSPITxBuf[2] = 0; mSPITxBuf[3] = 0; mSPIRxBuf[0] = 0; mSPIRxBuf[1] = 0; mSPIRxBuf[2] = 0; mSPIRxBuf[3] = 0; mSPIRxLen = len; call Resource.request(); return error; } // here I'm forcing 24bit of val during a write async command error_t ADE7753.setReg(uint8_t regAddr, uint8_t len, uint32_t val) { error_t error = SUCCESS; atomic { if (mState != STATE_IDLE) { return FAIL; } else { mState = STATE_SETREG; } } // call Leds.led0On(); atomic { mSPITxBuf[0] = regAddr | (1 << 7); // set the WRITE bit switch (len) { case 2: mSPITxBuf[1] = (uint8_t) val; break; case 3: mSPITxBuf[1] = (uint8_t) (val>>8); mSPITxBuf[2] = (uint8_t) val; break; case 4: mSPITxBuf[1] = (uint8_t) (val>>16); mSPITxBuf[2] = (uint8_t) (val>>8); mSPITxBuf[3] = (uint8_t) val; break; } mSPITxLen = len; } // call Leds.led0On(); call Resource.request(); return error; } async event void SpiPacket.sendDone(uint8_t* txBuf, uint8_t* rxBuf, uint16_t len, error_t spi_error ) { uint32_t val; error_t error = spi_error; call SPIFRM.set(); // CS HIGH atomic { switch (mState) { case STATE_GETREG: mState = STATE_IDLE; // repack switch (len) { case 2: val = rxBuf[1]; break; case 3: val = ((uint32_t)rxBuf[1])<<8 | rxBuf[2]; break; case 4: val = ((uint32_t)rxBuf[1])<<16 | ((uint32_t)rxBuf[2])<<8 | rxBuf[3]; break; default: val = 0xF0F0F0F0; break; } signal ADE7753.getRegDone(error, (txBuf[0] & 0x7F), val, len); break; case STATE_SETREG: // call Leds.led1Toggle(); mState = STATE_IDLE; // repack switch (len) { case 2: val = txBuf[1]; break; case 3: val = ((uint32_t)txBuf[1])<<8 | txBuf[2]; break; case 4: val = ((uint32_t)txBuf[1])<<16 | ((uint32_t)txBuf[2])<<8 | txBuf[3]; break; default: val = 0xF0F0F0F0; break; } signal ADE7753.setRegDone(error, (txBuf[0] & 0x7F), val, len); break; default: mState = STATE_IDLE; break; } } call Resource.release(); return; } default event void SplitControl.startDone( error_t error ) { return; } default event void SplitControl.stopDone( error_t error ) { return; } } tinyos-2.1.2+dfsg/tos/chips/ade7753/Assert.h000066400000000000000000000035111207233610700203650ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __ASSERT_H__ #define __ASSERT_H__ #ifdef ASSERT void assert(bool condition, const char* file, uint16_t line); #define ASSERT(COND) assert(COND, __FILE__, __LINE__) #else #define ASSERT(COND) for(;0;) #endif #endif//__ASSERT_H__ tinyos-2.1.2+dfsg/tos/chips/adxl345/000077500000000000000000000000001207233610700170605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/adxl345/ADXL345.h000066400000000000000000000124041207233610700202160ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Implementation of ADXL345 accelerometer, as a part of Zolertia Z1 mote * * Credits goes to DEXMA SENSORS SL * @author: Xavier Orduna * @author: Jordi Soucheiron * @author: Antonio Linan * */ #ifndef ADXL345_H #define ADXL345_H #define ADXL345_ADDRESS 0x53 //ADXL345 Registers Start #define ADXL345_DEVID 0x00 // R // Device ID. #define ADXL345_THRESH_TAP 0x1D // RW // Tap Threshold 62.5mg/LSB (0xFF = +16g) #define ADXL345_OFSX 0x1E // RW // X-axis Offset 15.6mg/LSB #define ADXL345_OFSY 0x1F // RW // Y-axis Offset 15.6mg/LSB #define ADXL345_OFSZ 0x20 // RW // Z-axis Offset 15.6mg/LSB #define ADXL345_DUR 0x21 // RW // Tap Duration 625us/LSB #define ADXL345_LATENT 0x22 // RW // Tap Latency 1.25ms/LSB #define ADXL345_WINDOW 0x23 // RW // Tap Window 1.25ms/LSB #define ADXL345_THRESH_ACT 0x24 // RW // Activity threshold 62.5mg/LSB #define ADXL345_THRESH_INACT 0x25 // RW // Inactivity Threshold 62.5mg/LSB #define ADXL345_TIME_INACT 0x26 // RW // Inactivity Time. 1s/LSB #define ADXL345_ACT_INACT_CTL 0x27 // RW // xis enable control for activity and inactivity detection. #define ADXL345_THRESH_FF 0x28 // RW // Free-fall threshold. 62.5mg/LSB #define ADXL345_TIME_FF 0x29 // RW // Free-fall Time 5ms/LSB (values 0x14 to 0x46 are recommended) #define ADXL345_TAP_AXES 0x2A // RW // Axis control for tap/double tap #define ADXL345_ACT_TAP_STATUS 0x2B // R // Source of tap/double tap #define ADXL345_BW_RATE 0x2C // RW // Data rate and power control mode (default 0xA) #define ADXL345_POWER_CTL 0x2D // RW // Power saving features control #define ADXL345_INT_ENABLE 0x2E // RW // Interrupt enable control #define ADXL345_INT_MAP 0x2F // RW // Interrupt mapping control #define ADXL345_INT_SOURCE 0x30 // R // Source of interrupts #define ADXL345_DATAFORMAT 0x31 // RW // Data format control #define ADXL345_DATAX0 0x32 // R // X-Axis #define ADXL345_DATAY0 0x34 // R // Y-Axis #define ADXL345_DATAZ0 0x36 // R // Z-Axis #define ADXL345_FIFO_CTL 0x38 // RW // FIFO control #define ADXL345_FIFO_STATE 0x39 // R // FIFO status //ADXL Registers End #define ADXL345_MEASURE_MODE 0x08 #define ADXL345_STANDBY_MODE 0xF7 #define ADXL345_SLEEP_MODE 0x04 #define ADXL345_RANGE_2G 0 #define ADXL345_RANGE_4G 1 #define ADXL345_RANGE_8G 2 #define ADXL345_RANGE_16G 3 #define ADXL345_LOWRES 0 #define ADXL345_FULLRES 1 #define ADXL345_START_TIMEOUT 2000 //ADXL345 Driver States States typedef enum { ADXLCMD_START, ADXLCMD_READ_REGISTER, ADXLCMD_READ_DURATION, ADXLCMD_READ_LATENT, ADXLCMD_READ_WINDOW, ADXLCMD_READ_THRESH_ACT, //TODO ADXLCMD_READ_THRESH_INACT, //TODO ADXLCMD_READ_TIME_INACT, //TODO ADXLCMD_READ_ACT_INACT_CTL, //TODO ADXLCMD_READ_THRESH_FF, //TODO ADXLCMD_READ_TIME_FF, //TODO ADXLCMD_READ_TAP_AXES, //TODO ADXLCMD_READ_ACT_TAP_STATUS, //TODO ADXLCMD_READ_BW_RATE, //TODO ADXLCMD_READ_POWER_CTL, //TODO ADXLCMD_READ_INT_ENABLE, ADXLCMD_READ_INT_MAP, ADXLCMD_READ_INT_SOURCE, ADXLCMD_READ_X, ADXLCMD_READ_Y, ADXLCMD_READ_Z, ADXLCMD_READ_XYZ, ADXLCMD_SET_RANGE, ADXLCMD_STOP, ADXLCMD_SLEEP, ADXLCMD_INT, ADXLCMD_SET_REGISTER, ADXLCMD_SET_DURATION, ADXLCMD_SET_LATENT, ADXLCMD_SET_WINDOW, ADXLCMD_SET_INT_MAP, } adxl345_commands; //ADXL345 Interruptions typedef enum { ADXLINT_NONE = 0x00, ADXLINT_OVERRUN = 0x01, ADXLINT_WATERMARK = 0x02, ADXLINT_FREE_FALL = 0x04, ADXLINT_INACTIVITY = 0x08, ADXLINT_ACTIVITY = 0x10, ADXLINT_DOUBLE_TAP = 0x20, ADXLINT_SINGLE_TAP = 0x40, ADXLINT_DATA_READY = 0x80, } adxlint_state_t; typedef struct { uint16_t x_axis; uint16_t y_axis; uint16_t z_axis; } adxl345_readxyt_t; #endif tinyos-2.1.2+dfsg/tos/chips/adxl345/ADXL345C.nc000066400000000000000000000062111207233610700204710ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Implementation of ADXL345 accelerometer, as a part of Zolertia Z1 mote * * Credits goes to DEXMA SENSORS SL * @author: Xavier Orduna * @author: Jordi Soucheiron * @author: Antonio Linan * @author: Andre Rodrigues */ #include "ADXL345.h" generic configuration ADXL345C() { provides interface SplitControl; provides interface Read as X; provides interface Read as Y; provides interface Read as Z; provides interface Read as XYZ; provides interface Read as IntSource; provides interface Read as Register; provides interface ADXL345Control; provides interface Notify as Int1; provides interface Notify as Int2; } implementation { components ADXL345P; X = ADXL345P.X; Y = ADXL345P.Y; Z = ADXL345P.Z; XYZ = ADXL345P.XYZ; IntSource = ADXL345P.IntSource; SplitControl = ADXL345P; ADXL345Control = ADXL345P; Register = ADXL345P.Register; components new Msp430I2C1C() as I2C; ADXL345P.Resource -> I2C; ADXL345P.ResourceRequested -> I2C; ADXL345P.I2CBasicAddr -> I2C; components HplADXL345C; Int1 = ADXL345P.Int1; Int2 = ADXL345P.Int2; ADXL345P.GpioInterrupt1 -> HplADXL345C.GpioInterrupt1; ADXL345P.GpioInterrupt2 -> HplADXL345C.GpioInterrupt2; ADXL345P.GeneralIO1 -> HplADXL345C.GeneralIO1; ADXL345P.GeneralIO2 -> HplADXL345C.GeneralIO2; components new TimerMilliC() as TimeoutAlarm; ADXL345P.TimeoutAlarm -> TimeoutAlarm; } tinyos-2.1.2+dfsg/tos/chips/adxl345/ADXL345Control.nc000066400000000000000000000053011207233610700217260ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Implementation of ADXL345 accelerometer, as a part of Zolertia Z1 mote * * Credits goes to DEXMA SENSORS SL * @author: Xavier Orduna * @author: Jordi Soucheiron * @author: Antonio Linan */ interface ADXL345Control { command error_t setRange(uint8_t range, uint8_t resolution); event void setRangeDone(error_t error); command error_t setInterrups(uint8_t interrupt_vector); event void setInterruptsDone(error_t error); command error_t setIntMap(uint8_t int_map_vector); event void setIntMapDone(error_t error); command error_t setRegister(uint8_t reg, uint8_t value); event void setRegisterDone(error_t error); command error_t setDuration(uint8_t duration); event void setDurationDone(error_t error); command error_t setLatent(uint8_t latent); event void setLatentDone(error_t error); command error_t setWindow(uint8_t window); event void setWindowDone(error_t error); command error_t setReadAddress(uint8_t address); event void setReadAddressDone(error_t error); } tinyos-2.1.2+dfsg/tos/chips/adxl345/ADXL345P.nc000066400000000000000000000644531207233610700205220ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Implementation of ADXL345 accelerometer, as a part of Zolertia Z1 mote * * Credits goes to DEXMA SENSORS SL * @author: Xavier Orduna * @author: Jordi Soucheiron * @author: Antonio Linan */ #include "ADXL345.h" module ADXL345P { provides { interface SplitControl; interface Read as Register; interface Read as Duration; interface Read as Latent; interface Read as Window; interface Read as BwRate; interface Read as PowerCtl; interface Read as IntEnable; interface Read as IntMap; interface Read as IntSource; interface Read as X; interface Read as Y; interface Read as Z; interface Read as XYZ; interface ADXL345Control; interface Notify as Int1; interface Notify as Int2; } uses { interface Resource; interface ResourceRequested; interface I2CPacket as I2CBasicAddr; interface GeneralIO as GeneralIO1; interface GeneralIO as GeneralIO2; interface GpioInterrupt as GpioInterrupt1; interface GpioInterrupt as GpioInterrupt2; interface Timer as TimeoutAlarm; } } implementation { norace bool lock=FALSE; norace uint8_t state; norace uint8_t adxlcmd; norace uint8_t databuf[20]; norace uint8_t set_reg[2]; norace uint8_t pointer; norace uint8_t readAddress=0; norace uint8_t regData; norace uint8_t duration; norace uint8_t latent; norace uint8_t window; norace uint8_t bw_rate; norace uint8_t power_ctl=0x0; norace uint8_t int_enable; norace uint8_t int_map; norace uint8_t int_source; norace uint8_t dataformat; norace error_t error_return= SUCCESS; norace uint16_t x_axis; norace uint16_t y_axis; norace uint16_t z_axis; norace adxl345_readxyt_t xyz_axis; task void sendEvent1(); task void sendEvent2(); task void started(){ if(call TimeoutAlarm.isRunning()) call TimeoutAlarm.stop(); lock = FALSE; signal SplitControl.startDone(error_return); } task void stopped(){ lock = FALSE; signal SplitControl.stopDone(error_return); } task void calculatePowerCtl() { lock = FALSE; signal PowerCtl.readDone(error_return, power_ctl); } task void calculateBwRate() { lock = FALSE; signal BwRate.readDone(error_return, bw_rate); } task void calculateIntMap() { lock = FALSE; signal IntMap.readDone(error_return, int_map); } task void calculateIntEnable() { lock = FALSE; signal IntEnable.readDone(error_return, int_enable); } task void calculateIntSource() { lock = FALSE; signal IntSource.readDone(error_return, int_source); } task void calculateX(){ lock = FALSE; signal X.readDone(error_return, x_axis); } task void calculateY(){ lock = FALSE; signal Y.readDone(error_return, y_axis); } task void calculateZ(){ lock = FALSE; signal Z.readDone(error_return, z_axis); } task void calculateXYZ(){ lock = FALSE; signal XYZ.readDone(error_return, xyz_axis); } task void calculateRegister() { lock = FALSE; signal Register.readDone(error_return, regData); } task void rangeDone(){ lock = FALSE; signal ADXL345Control.setRangeDone(error_return); } task void setRegisterDone(){ lock = FALSE; signal ADXL345Control.setRegisterDone(error_return); } task void setIntMapDone(){ lock = FALSE; signal ADXL345Control.setIntMapDone(error_return); } task void interruptsDone(){ lock = FALSE; signal ADXL345Control.setInterruptsDone(error_return); } task void durationDone(){ lock = FALSE; signal ADXL345Control.setDurationDone(error_return); } task void latentDone(){ lock = FALSE; signal ADXL345Control.setLatentDone(error_return); } task void windowDone(){ lock = FALSE; signal ADXL345Control.setWindowDone(error_return); } task void readDurationDone(){ lock = FALSE; signal Duration.readDone(error_return, duration); } task void readLatentDone(){ lock = FALSE; signal Latent.readDone(error_return, latent); } task void readWindowDone(){ lock = FALSE; signal Window.readDone(error_return, window); } task void setReadAddressDone() { lock = FALSE; signal ADXL345Control.setReadAddressDone(SUCCESS); } command error_t SplitControl.start(){ error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_START; e = call Resource.request(); if (e==SUCCESS) { call TimeoutAlarm.startOneShot(ADXL345_START_TIMEOUT); return SUCCESS; } lock = FALSE; return e; } command error_t SplitControl.stop(){ error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_STOP; e = call Resource.request(); if (e==SUCCESS) { return SUCCESS; } lock = FALSE; return e; } command error_t ADXL345Control.setReadAddress(uint8_t address){ if(lock) return EBUSY; lock = TRUE; if( address >= 0x01 && address <= 0x1C) return EINVAL; //reserved, do not access if( address >= 0x3A) return EINVAL; //too big readAddress = address; post setReadAddressDone(); return SUCCESS; } command error_t ADXL345Control.setRange(uint8_t range, uint8_t resolution){ error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_SET_RANGE; e=call Resource.request(); if(e==SUCCESS) { dataformat = resolution << 3; dataformat = dataformat + range; return SUCCESS; } lock = FALSE; return e; } command error_t ADXL345Control.setRegister(uint8_t reg, uint8_t value){ error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_SET_REGISTER; e=call Resource.request(); if(e==SUCCESS) { set_reg[0] = reg; set_reg[1] = value; return SUCCESS; } lock = FALSE; return e; } command error_t ADXL345Control.setInterrups(uint8_t int_enable_par) { error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_INT; e = call Resource.request(); if (e==SUCCESS) { int_enable = int_enable_par; return SUCCESS; } lock = FALSE; return e; } command error_t ADXL345Control.setDuration(uint8_t duration_par) { error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_SET_DURATION; e = call Resource.request(); if (e==SUCCESS) { duration = duration_par; return SUCCESS; } lock = FALSE; return e; } command error_t ADXL345Control.setLatent(uint8_t latent_par) { error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_SET_LATENT; e = call Resource.request(); if (e==SUCCESS) { latent = latent_par; return SUCCESS; } lock = FALSE; return e; } command error_t ADXL345Control.setWindow(uint8_t window_par) { error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_SET_WINDOW; e = call Resource.request(); if (e==SUCCESS) { window = window_par; return SUCCESS; } lock = FALSE; return e; } command error_t ADXL345Control.setIntMap(uint8_t int_map_par) { error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_SET_INT_MAP; e = call Resource.request(); if (e==SUCCESS) { int_map = int_map_par; return SUCCESS; } lock = FALSE; return e; } command error_t PowerCtl.read() { error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_READ_POWER_CTL; e = call Resource.request(); if (e==SUCCESS) { return SUCCESS; } lock = FALSE; return e; } command error_t BwRate.read() { error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_READ_BW_RATE; e = call Resource.request(); if (e==SUCCESS) { return SUCCESS; } lock = FALSE; return e; } command error_t IntEnable.read() { error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_READ_INT_ENABLE; e = call Resource.request(); if (e==SUCCESS) { return SUCCESS; } lock = FALSE; return e; } command error_t IntMap.read() { error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_READ_INT_MAP; e = call Resource.request(); if (e==SUCCESS) { return SUCCESS; } lock = FALSE; return e; } command error_t IntSource.read() { error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_READ_INT_SOURCE; e = call Resource.request(); if (e==SUCCESS) { return SUCCESS; } lock = FALSE; return e; } command error_t Register.read() { error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_READ_REGISTER; e = call Resource.request(); if (e==SUCCESS) { return SUCCESS; } lock = FALSE; return e; } command error_t X.read(){ error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_READ_X; if ((power_ctl & ADXL345_MEASURE_MODE) == 0) { lock=FALSE; return FAIL; } e = call Resource.request(); if (e==SUCCESS) { return SUCCESS; } lock = FALSE; return e; } command error_t Y.read(){ error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_READ_Y; if ((power_ctl & ADXL345_MEASURE_MODE) == 0) { lock=FALSE; return FAIL; } e = call Resource.request(); if (e==SUCCESS) { return SUCCESS; } lock = FALSE; return e; } command error_t Z.read(){ error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_READ_Z; if ((power_ctl & ADXL345_MEASURE_MODE) == 0) { lock=FALSE; return FAIL; } e = call Resource.request(); if (e==SUCCESS) return SUCCESS; lock = FALSE; return e; } command error_t XYZ.read(){ error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_READ_XYZ; if ((power_ctl & ADXL345_MEASURE_MODE) == 0) { lock=FALSE; return FAIL; } e = call Resource.request(); if (e==SUCCESS) return SUCCESS; lock = FALSE; return e; } command error_t Duration.read(){ error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_READ_DURATION; e = call Resource.request(); if (e==SUCCESS) { return SUCCESS; } lock = FALSE; return e; } command error_t Latent.read(){ error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_READ_LATENT; e = call Resource.request(); if (e==SUCCESS) { return SUCCESS; } lock = FALSE; return e; } command error_t Window.read(){ error_t e; if(lock) return EBUSY; lock = TRUE; adxlcmd = ADXLCMD_READ_WINDOW; e = call Resource.request(); if (e==SUCCESS) { return SUCCESS; } lock = FALSE; return e; } event void Resource.granted(){ error_t e; switch(adxlcmd){ case ADXLCMD_READ_XYZ: //NOTE moved to speedup pointer = ADXL345_DATAX0; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, &pointer); if (e!= SUCCESS) { error_return = e; post calculateXYZ(); } break; case ADXLCMD_START: power_ctl = power_ctl | ADXL345_MEASURE_MODE; databuf[0] = ADXL345_THRESH_TAP; databuf[1] = 0x40; //ADXL345_THRESH_TAP databuf[2] = 0x0; //ADXL345_OFSX databuf[3] = 0x0; //ADXL345_OFSY databuf[4] = 0x0; //ADXL345_OFSZ databuf[5] = 0x7F; //ADXL345_DUR databuf[6] = 0x30; //ADXL345_LATENT databuf[7] = 0x7F; //ADXL345_WINDOW databuf[8] = 0x2; //ADXL345_THRESH_ACT databuf[9] = 0x1; //ADXL345_THRESH_INACT databuf[10] = 0xFF; //ADXL345_TIME_INACT databuf[11] = 0xFF; //ADXL345_ACT_INACT_CTL databuf[12] = 0x05; //ADXL345_THRESH_FF databuf[13] = 0x14; //ADXL345_TIME_FF databuf[14] = 0x7; //ADXL345_TAP_AXES databuf[15] = 0x0; //ADXL345_ACT_TAP_STATUS(read only) databuf[16] = 0x0A; //ADXL345_BW_RATE databuf[17] = power_ctl; //ADXL345_POWER_CTL databuf[18] = 0x0; //ADXL345_INT_ENABLE (all disabled by default) e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 19, databuf); if (e!= SUCCESS) { error_return = e; post started(); } break; case ADXLCMD_READ_DURATION: pointer = ADXL345_DUR; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, &pointer); if (e!= SUCCESS) { error_return = e; post readDurationDone(); } break; case ADXLCMD_READ_LATENT: pointer = ADXL345_LATENT; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, &pointer); if (e!= SUCCESS) { error_return = e; post readLatentDone(); } break; case ADXLCMD_READ_WINDOW: pointer = ADXL345_WINDOW; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, &pointer); if (e!= SUCCESS) { error_return = e; post readWindowDone(); } break; case ADXLCMD_READ_POWER_CTL: pointer = ADXL345_POWER_CTL; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, &pointer); if (e!= SUCCESS) { error_return = e; post calculatePowerCtl(); } break; case ADXLCMD_READ_BW_RATE: pointer = ADXL345_BW_RATE; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, &pointer); if (e!= SUCCESS) { error_return = e; post calculateBwRate(); } break; case ADXLCMD_READ_INT_ENABLE: pointer = ADXL345_INT_ENABLE; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, &pointer); if (e!= SUCCESS) { error_return = e; post calculateIntEnable(); } break; case ADXLCMD_READ_INT_MAP: pointer = ADXL345_INT_MAP; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, &pointer); if (e!= SUCCESS) { error_return = e; post calculateIntMap(); } break; case ADXLCMD_READ_INT_SOURCE: pointer = ADXL345_INT_SOURCE; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, &pointer); if (e!= SUCCESS) { error_return = e; post calculateIntSource(); } break; case ADXLCMD_READ_X: pointer = ADXL345_DATAX0; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, &pointer); if (e!= SUCCESS) { error_return = e; post calculateX(); } break; case ADXLCMD_READ_Y: pointer = ADXL345_DATAY0; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, &pointer); if (e!= SUCCESS) { error_return = e; post calculateY(); } break; case ADXLCMD_READ_Z: pointer = ADXL345_DATAZ0; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, &pointer); if (e!= SUCCESS) { error_return = e; post calculateZ(); } break; case ADXLCMD_READ_REGISTER: pointer = readAddress; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, &pointer); if (e!= SUCCESS) { error_return = e; post calculateRegister(); } break; case ADXLCMD_SET_REGISTER: databuf[0] = set_reg[0]; databuf[1] = set_reg[1]; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 2, databuf); if (e!= SUCCESS) { error_return = e; post setRegisterDone(); } break; case ADXLCMD_SET_INT_MAP: databuf[0] = ADXL345_INT_MAP; databuf[1] = int_map; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 2, databuf); if (e!= SUCCESS) { error_return = e; post setIntMapDone(); } break; case ADXLCMD_SET_RANGE: databuf[0] = ADXL345_DATAFORMAT; databuf[1] = dataformat; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 2, databuf); if (e!= SUCCESS) { error_return = e; post rangeDone(); } break; case ADXLCMD_STOP: power_ctl = power_ctl & ADXL345_STANDBY_MODE; databuf[0] = ADXL345_POWER_CTL; databuf[1] = power_ctl; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 2, databuf); if (e!= SUCCESS) { error_return = e; post stopped(); } break; case ADXLCMD_INT: databuf[0] = ADXL345_INT_ENABLE; databuf[1] = int_enable; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 2, databuf); if (e!= SUCCESS) { error_return = e; post interruptsDone(); } break; case ADXLCMD_SET_DURATION: databuf[0] = ADXL345_DUR; databuf[1] = duration; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 2, databuf); if (e!= SUCCESS) { error_return = e; post durationDone(); } break; case ADXLCMD_SET_LATENT: databuf[0] = ADXL345_LATENT; databuf[1] = latent; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 2, databuf); if (e!= SUCCESS) { error_return = e; post latentDone(); } break; case ADXLCMD_SET_WINDOW: databuf[0] = ADXL345_WINDOW; databuf[1] = window; e = call I2CBasicAddr.write((I2C_START | I2C_STOP), ADXL345_ADDRESS, 2, databuf); if (e!= SUCCESS) { error_return = e; post windowDone(); } break; } } async event void ResourceRequested.requested(){ } async event void ResourceRequested.immediateRequested(){ } async event void I2CBasicAddr.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t *data){ uint16_t tmp=0; if(call Resource.isOwner()) { error_return=error; for(tmp=0;tmp<0x8fff;tmp++); //delay tmp= call Resource.release(); if(adxlcmd == ADXLCMD_READ_X || adxlcmd == ADXLCMD_READ_Y || adxlcmd == ADXLCMD_READ_Z) { tmp = data[1]; tmp = tmp << 8; tmp = tmp + data[0]; } switch(adxlcmd){ case ADXLCMD_READ_XYZ: //NOTE moved to speedup xyz_axis.x_axis = (data[1] << 8) + data[0]; xyz_axis.y_axis = (data[3] << 8) + data[2]; xyz_axis.z_axis = (data[5] << 8) + data[4]; post calculateXYZ(); break; case ADXLCMD_READ_REGISTER: regData=data[0]; post calculateRegister(); break; case ADXLCMD_READ_DURATION: duration=data[0]; post readDurationDone(); break; case ADXLCMD_READ_LATENT: latent=data[0]; post readLatentDone(); break; case ADXLCMD_READ_WINDOW: window=data[0]; post readWindowDone(); break; case ADXLCMD_READ_POWER_CTL: power_ctl=data[0]; post calculatePowerCtl(); break; case ADXLCMD_READ_BW_RATE: bw_rate=data[0]; post calculateBwRate(); break; case ADXLCMD_READ_INT_ENABLE: int_enable=data[0]; post calculateIntEnable(); break; case ADXLCMD_READ_INT_MAP: int_map=data[0]; post calculateIntMap(); break; case ADXLCMD_READ_INT_SOURCE: int_source=data[0]; post calculateIntSource(); break; case ADXLCMD_READ_X: x_axis = tmp; post calculateX(); break; case ADXLCMD_READ_Y: y_axis = tmp; post calculateY(); break; case ADXLCMD_READ_Z: z_axis = tmp; post calculateZ(); break; } } } async event void I2CBasicAddr.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t *data){ if(call Resource.isOwner()) { error_return=error; if( adxlcmd != ADXLCMD_READ_XYZ //NOTE moved to speedup && adxlcmd != ADXLCMD_READ_REGISTER && adxlcmd != ADXLCMD_READ_DURATION && adxlcmd != ADXLCMD_READ_LATENT && adxlcmd != ADXLCMD_READ_WINDOW && adxlcmd != ADXLCMD_READ_INT_ENABLE && adxlcmd != ADXLCMD_READ_INT_MAP && adxlcmd != ADXLCMD_READ_INT_SOURCE && adxlcmd != ADXLCMD_READ_X && adxlcmd != ADXLCMD_READ_Y && adxlcmd != ADXLCMD_READ_Z ) { call Resource.release(); } switch(adxlcmd){ case ADXLCMD_READ_XYZ: //NOTE moved to speedup if (error==SUCCESS) call I2CBasicAddr.read ((I2C_START | I2C_STOP), ADXL345_ADDRESS, 6, databuf); else post calculateXYZ(); break; case ADXLCMD_START: post started(); break; case ADXLCMD_READ_REGISTER: if (error==SUCCESS) call I2CBasicAddr.read ((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, databuf); else post calculateRegister(); break; case ADXLCMD_READ_DURATION: if (error==SUCCESS) call I2CBasicAddr.read ((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, databuf); else post readDurationDone(); break; case ADXLCMD_READ_LATENT: if (error==SUCCESS) call I2CBasicAddr.read ((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, databuf); else post readLatentDone(); break; case ADXLCMD_READ_WINDOW: if (error==SUCCESS) call I2CBasicAddr.read ((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, databuf); else post readWindowDone(); break; case ADXLCMD_READ_POWER_CTL: if (error==SUCCESS) call I2CBasicAddr.read ((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, databuf); else post calculatePowerCtl(); break; case ADXLCMD_READ_BW_RATE: if (error==SUCCESS) call I2CBasicAddr.read ((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, databuf); else post calculateBwRate(); break; case ADXLCMD_READ_INT_ENABLE: if (error==SUCCESS) call I2CBasicAddr.read ((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, databuf); else post calculateIntEnable(); break; case ADXLCMD_READ_INT_MAP: if (error==SUCCESS) call I2CBasicAddr.read ((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, databuf); else post calculateIntMap(); break; case ADXLCMD_READ_INT_SOURCE: if (error==SUCCESS) call I2CBasicAddr.read ((I2C_START | I2C_STOP), ADXL345_ADDRESS, 1, databuf); else post calculateIntSource(); break; case ADXLCMD_READ_X: if (error==SUCCESS) call I2CBasicAddr.read((I2C_START | I2C_STOP), ADXL345_ADDRESS, 2, databuf); else post calculateX(); break; case ADXLCMD_READ_Y: if (error==SUCCESS) call I2CBasicAddr.read((I2C_START | I2C_STOP), ADXL345_ADDRESS, 2, databuf); else post calculateY(); break; case ADXLCMD_READ_Z: if (error==SUCCESS) call I2CBasicAddr.read ((I2C_START | I2C_STOP), ADXL345_ADDRESS, 2, databuf); else post calculateZ(); break; case ADXLCMD_SET_REGISTER: post setRegisterDone(); break; case ADXLCMD_SET_INT_MAP: post setIntMapDone(); break; case ADXLCMD_SET_RANGE: post rangeDone(); break; case ADXLCMD_STOP: post stopped(); break; case ADXLCMD_INT: post interruptsDone(); break; case ADXLCMD_SET_DURATION: post durationDone(); break; case ADXLCMD_SET_LATENT: post latentDone(); break; case ADXLCMD_SET_WINDOW: post windowDone(); break; } } } /* default handlers */ default event void Register.readDone(error_t error, uint8_t data) { return; } default event void Duration.readDone(error_t error, uint8_t data){ return; } default event void Latent.readDone(error_t error, uint8_t data) { return; } default event void Window.readDone(error_t error, uint8_t data) { return; } default event void PowerCtl.readDone(error_t error, uint8_t data) { return; } default event void BwRate.readDone(error_t error, uint8_t data) { return; } default event void IntEnable.readDone(error_t error, uint8_t data) { return; } default event void IntMap.readDone(error_t error, uint8_t data) { return; } default event void IntSource.readDone(error_t error, uint8_t data){ return; } default event void X.readDone(error_t error, uint16_t data){ return; } default event void Y.readDone(error_t error, uint16_t data){ return; } default event void Z.readDone(error_t error, uint16_t data){ return; } default event void XYZ.readDone(error_t error, adxl345_readxyt_t data){ return; } default event void ADXL345Control.setRangeDone(error_t error){ return; } default event void ADXL345Control.setInterruptsDone(error_t error){ return; } default event void ADXL345Control.setRegisterDone(error_t error){ return; } default event void ADXL345Control.setDurationDone(error_t error){ return; } default event void ADXL345Control.setLatentDone(error_t error){ return; } default event void ADXL345Control.setWindowDone(error_t error){ return; } default event void ADXL345Control.setIntMapDone(error_t error){ return; } default event void ADXL345Control.setReadAddressDone(error_t error){ return; } default event void Int1.notify(adxlint_state_t val) { } default event void Int2.notify(adxlint_state_t val) { } /*defaut handlers end*/ event void TimeoutAlarm.fired() { if(lock && (adxlcmd == ADXLCMD_START)) { lock = FALSE; signal SplitControl.startDone(EOFF); } } command error_t Int1.enable() { call GeneralIO1.makeInput(); return call GpioInterrupt1.enableRisingEdge(); } command error_t Int2.enable() { call GeneralIO2.makeInput(); return call GpioInterrupt2.enableRisingEdge(); } command error_t Int1.disable() { return call GpioInterrupt1.disable(); } command error_t Int2.disable() { return call GpioInterrupt2.disable(); } task void sendEvent1() { signal Int1.notify( 1 ); call GpioInterrupt1.enableRisingEdge(); } task void sendEvent2() { signal Int2.notify( 1 ); call GpioInterrupt2.enableRisingEdge(); } async event void GpioInterrupt1.fired() { call GpioInterrupt1.disable(); post sendEvent1(); } async event void GpioInterrupt2.fired() { call GpioInterrupt2.disable(); post sendEvent2(); } } tinyos-2.1.2+dfsg/tos/chips/at45db/000077500000000000000000000000001207233610700167575ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/at45db/At45db.h000066400000000000000000000042421207233610700201550ustar00rootroot00000000000000// $Id: At45db.h,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef AT45DB_H #define AT45DB_H #define UQ_AT45DB "at45db.resource" #include enum { AT45_ERASE, AT45_DONT_ERASE, AT45_PREVIOUSLY_ERASED }; #endif tinyos-2.1.2+dfsg/tos/chips/at45db/At45db.nc000066400000000000000000000205151207233610700203270ustar00rootroot00000000000000// $Id: At45db.nc,v 1.7 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "At45db.h" /** * HAL for Atmel's AT45DB family of serial dataflash chips. This provides * reasonably high-level operations on AT45DB pages, including automatic * buffer management. Writes are only guaranteed to happen after a flush, * flushAll, sync or syncAll. *

    * When buffers are flushed to the flash (either explicitly or implicitly), * their contents are checked to ensure the write was succesful. If this * check fails, the flush is retried some number of times. If this fails * more than some number of times, all access to the flash is disabled * (all requests will report FAIL in their completion event). *

    * This interface only supports one operation at a time - components offering * At45db should use the Resource interface for resource sharing. * * @author David Gay */ interface At45db { /** * Write some data to an AT45DB page. writeDone will be signaled. * @param page Flash page to write to. Must be less than AT45_MAX_PAGES. * @param offset Offset in page at which to start writing - must be between * 0 and AT45_PAGE_SIZE - 1 * @param data Data to write. The buffer is "returned" at writeDone time. * @param n Number of bytes to write (> 0). offset + n must be <= * AT45_PAGE_SIZE */ command void write(at45page_t page, at45pageoffset_t offset, void *PASS COUNT(n) data, at45pageoffset_t n); /** * Signal completion of a write operation. The buffer passed to write * is implictly returned. * @param error SUCCESS for a successful write, FAIL otherwise */ event void writeDone(error_t error); /** * Copy one flash page to another. copyDone will be signaled. If page * from had been modified, it is first flushed to flash. Page * to will only actually be written when the buffer holding * it is flushed (see flush, flushAll, sync, syncAll). * * @param from Flash page to copy. Must be less than AT45_MAX_PAGES. * @param to Flash page to overwrite. Must be less than AT45_MAX_PAGES. */ command void copyPage(at45page_t from, at45page_t to); /** * Signal completion of a copyPage operation. * @param error SUCCESS if the copy was successful, FAIL otherwise */ event void copyPageDone(error_t error); /** * Erase an AT45DB page. eraseDone will be signaled. * @param page Flash page to erase. Must be less than AT45_MAX_PAGES. * @param eraseKind How to handle the erase: *
    AT45_ERASE: actually erase the page in the flash chip *
    AT45_DONT_ERASE: don't erase the page in the flash * chip, but reserve a buffer for this page - subsequent writes to this * page will be faster because the old contents need not be read *
    AT45_PREVIOUSLY_ERASED: assume the page was previously * erased in the flash and reserve a buffer for this page - subsequent * writes to page will be faster because the old contents need not be * read and the write itself will be faster */ command void erase(at45page_t page, uint8_t eraseKind); /** * Signal completion of an erase operation. * @param error SUCCESS if the erase was successful, FAIL otherwise */ event void eraseDone(error_t error); /** * Flush an AT45DB page from the buffers to the actual flash. syncDone * will be signaled once the flush has been completed and the buffer * contents successfully compared with the flash. If the page is not * in the buffers, syncDone will succeed "immediately". * @param page Flash page to sync. Must be less than AT45_MAX_PAGES. */ command void sync(at45page_t page); /** * Flush all AT45DB buffers to the actual flash. syncDone * will be signaled once the flush has been completed and the buffer * contents successfully compared with the flash. */ command void syncAll(); /** * Signal completion of a sync or syncAll operation. * @param error SUCCESS if the sync was successful, FAIL otherwise */ event void syncDone(error_t error); /** * Flush an AT45DB page from the buffers to the actual flash. flushDone * will be signaled once the flush has been initiated. If the page is not * in the buffers, flushDone will succeed "immediately". * @param page Flash page to sync. Must be less than AT45_MAX_PAGES. */ command void flush(at45page_t page); /** * Flush all AT45DB buffers to the actual flash. flushDone * will be signaled once the flushes have been initiated. */ command void flushAll(); /** * Signal completion of an flush or flushAll operation. * @param error SUCCESS if the flush was successful, FAIL otherwise */ event void flushDone(error_t error); /** * Read some data from an AT45DB page. readDone will be signaled. * @param page Flash page to read from. Must be less than AT45_MAX_PAGES. * @param offset Offset in page at which to start reading - must be between * 0 and AT45_PAGE_SIZE - 1 * @param data Buffer in which to place read data. The buffer is "returned" * at readDone time. * @param n Number of bytes to read (> 0). offset + n must be <= * AT45_PAGE_SIZE */ command void read(at45page_t page, at45pageoffset_t offset, void *PASS COUNT(n) data, at45pageoffset_t n); /** * Signal completion of a read operation. The buffer passed to read * is implictly returned. * @param error SUCCESS for a successful read, FAIL otherwise */ event void readDone(error_t error); /** * Compute the CRC of some data from an AT45DB page (using the CRC * function from crc.h). computeCrcDone will be signaled. * @param page Flash page to read from. Must be less than AT45_MAX_PAGES. * @param offset Offset in page at which to start reading - must be between * 0 and AT45_PAGE_SIZE - 1 * @param n Number of bytes to read (> 0). offset + n must be <= * AT45_PAGE_SIZE * @param baseCrc initial CRC value - use 0 if computing a "standalone" * CRC, or a previous computeCrc result if computing a CRC over several * flash pages */ command void computeCrc(at45page_t page, at45pageoffset_t offset, at45pageoffset_t n, uint16_t baseCrc); /** * Signal completion of a CRC computation. * @param error SUCCESS if the CRC was successfully computed, FAIL otherwise * @param crc CRC value (valid only if error == SUCCESS) */ event void computeCrcDone(error_t error, uint16_t crc); } tinyos-2.1.2+dfsg/tos/chips/at45db/At45dbBlockConfig.nc000066400000000000000000000033651207233610700224340ustar00rootroot00000000000000// $Id: At45dbBlockConfig.nc,v 1.5 2008-06-11 00:46:23 razvanm Exp $ /* * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Private interface between the AT45DB implementations of config and block storage * * @author: David Gay */ interface At45dbBlockConfig { /** * Check if this block is a config volumes * @return TRUE for config volumes, FALSE for block volumes */ command int isConfig(); /** * Query which half of the block is used by the current config state * @return TRUE for 2nd half, FALSE for 1st half */ command int flipped(); /** * Hook called by block storage just before the start of each write * @return TRUE to delay the write until writeContinue * is called, FALSE to proceed immediately. */ command int writeHook(); /** * Continue or abort write suspended as a result of a writeHook * event * @param error SUCCESS to continue write, anything else to abort write * returning that error code */ event void writeContinue(error_t error); /** * Return size of a config volume in pages (half of the actual block) * @return Config volume size */ event at45page_t npages(); /** * Map a volume-relative page to an absolute flash page, taking account * of the current flipped status * @param page Volume-relative page * @return Actual flash page for page */ event at45page_t remap(at45page_t page); } tinyos-2.1.2+dfsg/tos/chips/at45db/At45dbC.nc000066400000000000000000000022061207233610700204270ustar00rootroot00000000000000// $Id: HALAT45DBC.nc,v 1.1 2005/01/22 00:26:31 idgay Exp /* * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * HAL for Atmel's AT45DB family of serial dataflash chips. Access to the HAL * is controlled by a parameterised Resource interface - client ids are * obtained with unique(UQ_AT45DB). * * @author David Gay */ #include "At45db.h" configuration At45dbC { provides { interface At45db; interface Resource[uint8_t client]; interface ResourceDefaultOwner; interface ArbiterInfo; } } implementation { components At45dbP, HplAt45dbC, MainC, BusyWaitMicroC; components new FcfsArbiterC(UQ_AT45DB) as Arbiter; At45db = At45dbP; Resource = Arbiter; ResourceDefaultOwner = Arbiter; ArbiterInfo = Arbiter; MainC.SoftwareInit -> At45dbP; At45dbP.HplAt45db -> HplAt45dbC; At45dbP.BusyWait -> BusyWaitMicroC; } tinyos-2.1.2+dfsg/tos/chips/at45db/At45dbP.nc000066400000000000000000000303161207233610700204470ustar00rootroot00000000000000// $Id: At45dbP.nc,v 1.11 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "crc.h" #include "At45db.h" #include "Timer.h" /** * Private componenent for the Atmel's AT45DB HAL. * * @author David Gay */ module At45dbP @safe() { provides { interface Init; interface At45db; } uses { interface HplAt45db; interface BusyWait; } } implementation { #define CHECKARGS #if 0 uint8_t work[20]; uint8_t woffset; void wdbg(uint8_t x) { work[woffset++] = x; if (woffset == sizeof work) woffset = 0; } #else #define wdbg(n) #endif enum { // requests IDLE, R_READ, R_READCRC, R_WRITE, R_ERASE, R_COPY, R_SYNC, R_SYNCALL, R_FLUSH, R_FLUSHALL, BROKEN // Write failed. Fail all subsequent requests. }; uint8_t request; at45pageoffset_t reqOffset, reqBytes; uint8_t * COUNT_NOK(reqBytes) reqBuf; at45page_t reqPage; enum { P_READ, P_READCRC, P_WRITE, P_FLUSH, P_FILL, P_ERASE, P_COMPARE, P_COMPARE_CHECK }; struct { at45page_t page; bool busy : 1; bool clean : 1; bool erased : 1; uint8_t unchecked : 2; } buffer[2]; uint8_t selected; // buffer used by the current op uint8_t checking; bool flashBusy; // Select a command for the current buffer #define OPN(n, name) ((n) ? name ## 1 : name ## 2) #define OP(name) OPN(selected, name) command error_t Init.init() { request = IDLE; flashBusy = TRUE; // pretend we're on an invalid non-existent page buffer[0].page = buffer[1].page = AT45_MAX_PAGES; buffer[0].busy = buffer[1].busy = FALSE; buffer[0].clean = buffer[1].clean = TRUE; buffer[0].unchecked = buffer[1].unchecked = 0; buffer[0].erased = buffer[1].erased = FALSE; return SUCCESS; } void flashIdle() { flashBusy = buffer[0].busy = buffer[1].busy = FALSE; } void requestDone(error_t result, uint16_t computedCrc, uint8_t newState); void handleRWRequest(); task void taskSuccess() { requestDone(SUCCESS, 0, IDLE); } task void taskFail() { requestDone(FAIL, 0, IDLE); } void checkBuffer(uint8_t buf) { if (flashBusy) { call HplAt45db.waitIdle(); return; } call HplAt45db.compare(OPN(buf, AT45_C_COMPARE_BUFFER), buffer[buf].page); checking = buf; } void flushBuffer() { if (flashBusy) { call HplAt45db.waitIdle(); return; } call HplAt45db.flush(buffer[selected].erased ? OP(AT45_C_QFLUSH_BUFFER) : OP(AT45_C_FLUSH_BUFFER), buffer[selected].page); } event void HplAt45db.waitIdleDone() { flashIdle(); // Eager compare - this steals the current command #if 0 if ((buffer[0].unchecked || buffer[1].unchecked) && cmdPhase != P_COMPARE) checkBuffer(buffer[0].unchecked ? 0 : 1); else #endif handleRWRequest(); } event void HplAt45db.waitCompareDone(bool ok) { flashIdle(); if (ok) buffer[checking].unchecked = 0; else if (buffer[checking].unchecked < 2) buffer[checking].clean = FALSE; else { requestDone(FAIL, 0, BROKEN); return; } handleRWRequest(); } event void HplAt45db.readDone() { requestDone(SUCCESS, 0, IDLE); } event void HplAt45db.writeDone() { buffer[selected].clean = FALSE; buffer[selected].unchecked = 0; requestDone(SUCCESS, 0, IDLE); } event void HplAt45db.crcDone(uint16_t crc) { requestDone(SUCCESS, crc, IDLE); } event void HplAt45db.flushDone() { flashBusy = TRUE; buffer[selected].clean = buffer[selected].busy = TRUE; buffer[selected].unchecked++; buffer[selected].erased = FALSE; handleRWRequest(); } event void HplAt45db.compareDone() { flashBusy = TRUE; buffer[checking].busy = TRUE; // The 10us wait makes old mica motes (Atmega 103) happy, for // some mysterious reason (w/o this wait, the first compare // always fails, even though the compare after the rewrite // succeeds...) call BusyWait.wait(10); call HplAt45db.waitCompare(); } event void HplAt45db.fillDone() { flashBusy = TRUE; buffer[selected].page = reqPage; buffer[selected].clean = buffer[selected].busy = TRUE; buffer[selected].erased = FALSE; handleRWRequest(); } event void HplAt45db.eraseDone() { flashBusy = TRUE; // The buffer contains garbage, but we don't care about the state // of bits on this page anyway (if we do, we'll perform a // subsequent write) buffer[selected].page = reqPage; buffer[selected].clean = TRUE; buffer[selected].erased = TRUE; requestDone(SUCCESS, 0, IDLE); } void syncOrFlushAll(uint8_t newReq); void handleRWRequest() { if (reqPage == buffer[selected].page) switch (request) { case R_ERASE: switch (reqOffset) { case AT45_ERASE: if (flashBusy) call HplAt45db.waitIdle(); else call HplAt45db.erase(AT45_C_ERASE_PAGE, reqPage); break; case AT45_PREVIOUSLY_ERASED: // We believe the user... buffer[selected].erased = TRUE; /* Fallthrough */ case AT45_DONT_ERASE: // The buffer contains garbage, but we don't care about the state // of bits on this page anyway (if we do, we'll perform a // subsequent write) buffer[selected].clean = TRUE; requestDone(SUCCESS, 0, IDLE); break; } break; case R_COPY: if (!buffer[selected].clean) // flush any modifications flushBuffer(); else { // Just redesignate as destination page, and mark it dirty. // It will eventually be flushed, completing the copy. buffer[selected].page = reqOffset; buffer[selected].clean = FALSE; post taskSuccess(); } break; case R_SYNC: case R_SYNCALL: if (buffer[selected].clean && buffer[selected].unchecked) { checkBuffer(selected); return; } /* fall through */ case R_FLUSH: case R_FLUSHALL: if (!buffer[selected].clean) flushBuffer(); else if (request == R_FLUSH || request == R_SYNC) post taskSuccess(); else { // Check for more dirty pages uint8_t oreq = request; request = IDLE; syncOrFlushAll(oreq); } break; case R_READ: if (buffer[selected].busy) call HplAt45db.waitIdle(); else call HplAt45db.readBuffer(OP(AT45_C_READ_BUFFER), reqOffset, reqBuf, reqBytes); break; case R_READCRC: if (buffer[selected].busy) call HplAt45db.waitIdle(); else /* Hack: baseCrc was stored in reqBuf */ call HplAt45db.crc(OP(AT45_C_READ_BUFFER), 0, reqOffset, reqBytes, (uint16_t)reqBuf); break; case R_WRITE: if (buffer[selected].busy) call HplAt45db.waitIdle(); else call HplAt45db.write(OP(AT45_C_WRITE_BUFFER), 0, reqOffset, reqBuf, reqBytes); break; } else if (!buffer[selected].clean) flushBuffer(); else if (buffer[selected].unchecked) checkBuffer(selected); else { // just get the new page (except for erase) if (request == R_ERASE) { buffer[selected].page = reqPage; handleRWRequest(); } else if (flashBusy) call HplAt45db.waitIdle(); else call HplAt45db.fill(OP(AT45_C_FILL_BUFFER), reqPage); } } void requestDone(error_t result, uint16_t computedCrc, uint8_t newState) { uint8_t orequest = request; request = newState; switch (orequest) { case R_READ: signal At45db.readDone(result); break; case R_READCRC: signal At45db.computeCrcDone(result, computedCrc); break; case R_WRITE: signal At45db.writeDone(result); break; case R_SYNC: case R_SYNCALL: signal At45db.syncDone(result); break; case R_FLUSH: case R_FLUSHALL: signal At45db.flushDone(result); break; case R_ERASE: signal At45db.eraseDone(result); break; case R_COPY: signal At45db.copyPageDone(result); break; } } void newRequest(uint8_t req, at45page_t page, at45pageoffset_t offset, void * COUNT_NOK(n) reqdata, at45pageoffset_t n) { request = req; reqBuf = NULL; reqBytes = n; reqBuf = reqdata; reqPage = page; reqOffset = offset; if (page == buffer[0].page) selected = 0; else if (page == buffer[1].page) selected = 1; else selected = !selected; // LRU with 2 buffers... #ifdef CHECKARGS if (page >= AT45_MAX_PAGES || n > AT45_PAGE_SIZE || (req != R_COPY && offset >= AT45_PAGE_SIZE) || (req != R_COPY && offset + n > AT45_PAGE_SIZE) || (req == R_COPY && offset >= AT45_MAX_PAGES)) { post taskFail(); } else #endif handleRWRequest(); } command void At45db.read(at45page_t page, at45pageoffset_t offset, void *reqdata, at45pageoffset_t n) { newRequest(R_READ, page, offset, reqdata, n); } command void At45db.computeCrc(at45page_t page, at45pageoffset_t offset, at45pageoffset_t n, uint16_t baseCrc) { /* This is a hack (store crc in reqBuf), but it saves 2 bytes of RAM */ newRequest(R_READCRC, page, offset, TCAST(uint8_t * COUNT(n), baseCrc), n); } command void At45db.write(at45page_t page, at45pageoffset_t offset, void *reqdata, at45pageoffset_t n) { newRequest(R_WRITE, page, offset, reqdata, n); } command void At45db.erase(at45page_t page, uint8_t eraseKind) { newRequest(R_ERASE, page, eraseKind, NULL, 0); } command void At45db.copyPage(at45page_t from, at45page_t to) { /* Assumes at45pageoffset_t can hold an at45page_t. A little icky */ newRequest(R_COPY, from, to, NULL, 0); } void syncOrFlush(at45page_t page, uint8_t newReq) { request = newReq; if (buffer[0].page == page) selected = 0; else if (buffer[1].page == page) selected = 1; else { post taskSuccess(); return; } buffer[selected].unchecked = 0; handleRWRequest(); } command void At45db.sync(at45page_t page) { syncOrFlush(page, R_SYNC); } command void At45db.flush(at45page_t page) { syncOrFlush(page, R_FLUSH); } void syncOrFlushAll(uint8_t newReq) { request = newReq; if (!buffer[0].clean) selected = 0; else if (!buffer[1].clean) selected = 1; else { post taskSuccess(); return; } buffer[selected].unchecked = 0; handleRWRequest(); } command void At45db.syncAll() { syncOrFlushAll(R_SYNCALL); } command void At45db.flushAll() { syncOrFlushAll(R_FLUSHALL); } } tinyos-2.1.2+dfsg/tos/chips/at45db/At45dbStorageManagerC.nc000066400000000000000000000020011207233610700232400ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * HAL component providing information on the flash volumes. * * @author: David Gay */ module At45dbStorageManagerC @safe() { provides interface At45dbVolume[volume_id_t volid]; } implementation { command at45page_t At45dbVolume.remap[volume_id_t volid](at45page_t volumePage) { switch (volid) { #define VB(id, base) case id: return volumePage + base; #include "StorageVolumes.h" default: return AT45_MAX_PAGES; } } command at45page_t At45dbVolume.volumeSize[volume_id_t volid]() { switch (volid) { #define VS(id, size) case id: return size; #include "StorageVolumes.h" default: return 0; } } } tinyos-2.1.2+dfsg/tos/chips/at45db/At45dbVolume.nc000066400000000000000000000015051207233610700215150ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "At45db.h" /** * AT45DB interface for managing flash volumes. * * @author David Gay */ interface At45dbVolume { /** * Map a volume page to the corresponding page in the whole flash * @return What flash page this volume page maps to, or * AT45_MAX_PAGES for invalid volumes */ command at45page_t remap(at45page_t volumePage); /** * Find the flash volume size * @return Flash volume size in pages */ command at45page_t volumeSize(); } tinyos-2.1.2+dfsg/tos/chips/at45db/BlockStorageC.nc000066400000000000000000000023331207233610700217640ustar00rootroot00000000000000// $Id: BlockStorageC.nc,v 1.4 2006-12-12 18:23:02 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implementation of the block storage abstraction from TEP103 for the * Atmel AT45DB serial data flash. * * @param volid Volume to use for block storage * * @author David Gay */ #include "Storage.h" generic configuration BlockStorageC(volume_id_t volid) { provides { interface BlockWrite; interface BlockRead; } } implementation { enum { BLOCK_ID = unique(UQ_BLOCK_STORAGE) + uniqueCount(UQ_CONFIG_STORAGE), RESOURCE_ID = unique(UQ_AT45DB) }; components BlockStorageP, WireBlockStorageP, At45dbStorageManagerC, At45dbC; BlockWrite = BlockStorageP.BlockWrite[BLOCK_ID]; BlockRead = BlockStorageP.BlockRead[BLOCK_ID]; BlockStorageP.At45dbVolume[BLOCK_ID] -> At45dbStorageManagerC.At45dbVolume[volid]; BlockStorageP.Resource[BLOCK_ID] -> At45dbC.Resource[RESOURCE_ID]; } tinyos-2.1.2+dfsg/tos/chips/at45db/BlockStorageP.nc000066400000000000000000000310011207233610700217730ustar00rootroot00000000000000// $Id: BlockStorageP.nc,v 1.10 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Private component of the AT45DB implementation of the block storage * abstraction. * * @author: Jonathan Hui * @author: David Gay */ #include "Storage.h" module BlockStorageP @safe() { provides { interface BlockWrite[uint8_t blockId]; interface BlockRead[uint8_t blockId]; } uses { interface At45db; interface At45dbVolume[uint8_t blockId]; interface Resource[uint8_t blockId]; interface At45dbBlockConfig as BConfig[uint8_t blockId]; } } implementation { /* The AT45DB block storage implementation simply provides direct read/write access to the underlying pages of the volume. Random writes to the block storage will thus lead to pages being erased/programmed many times (there is a 2 page cache, but random writes are unlikely to hit in it). The cache is only flushed on sync. The first page of a block storage volume stores the maximum address written in the block and a CRC of the block's contents (up to that maximum address). This CRC is written at sync time and verified at validate time. This BlockStorage code is reused in the implementation of ConfigStorage. See the ConfigStorageP component and the At45dbBlockConfig interface for more discussion. If there are m ConfigStorage volumes and n BlockStorage volumes, the ids 0..m-1 are for ConfigStorage and m..m+n-1 are for BlockStorage. */ enum { R_IDLE, R_WRITE, R_ERASE, R_SYNC, R_READ, R_CRC, }; enum { N = uniqueCount(UQ_BLOCK_STORAGE) + uniqueCount(UQ_CONFIG_STORAGE), NO_CLIENT = 0xff }; uint8_t client = NO_CLIENT; storage_addr_t currentOffset; struct { /* The latest request made for this client, and it's arguments */ uint8_t request; /* automatically initialised to R_IDLE */ uint8_t * COUNT_NOK(len) buf; storage_addr_t addr; storage_len_t len; } s[N]; /* ------------------------------------------------------------------ */ /* Interface with ConfigStorageP (see also writeHook call below) */ /* ------------------------------------------------------------------ */ at45page_t pageRemap(at45page_t p) { return signal BConfig.remap[client](p); } event at45page_t BConfig.npages[uint8_t id]() { return call At45dbVolume.volumeSize[id]() >> 1; } event at45page_t BConfig.remap[uint8_t id](at45page_t page) { if (call BConfig.isConfig[id]() && call BConfig.flipped[id]()) page += signal BConfig.npages[id](); return call At45dbVolume.remap[id](page); } default command int BConfig.isConfig[uint8_t blockId]() { return FALSE; } default command int BConfig.flipped[uint8_t blockId]() { return FALSE; } /* ------------------------------------------------------------------ */ /* Queue and initiate user requests */ /* ------------------------------------------------------------------ */ void eraseStart(); void syncStart(); void multipageStart(uint16_t crc); void startRequest() { switch (s[client].request) { case R_ERASE: eraseStart(); break; case R_SYNC: syncStart(); break; default: multipageStart((uint16_t)s[client].buf); } } void endRequest(error_t result, uint16_t crc) { uint8_t c = client; uint8_t tmpState = s[c].request; client = NO_CLIENT; s[c].request = R_IDLE; call Resource.release[c](); switch(tmpState) { case R_READ: signal BlockRead.readDone[c](s[c].addr, s[c].buf, currentOffset, result); break; case R_WRITE: signal BlockWrite.writeDone[c](s[c].addr, s[c].buf, currentOffset, result); break; case R_ERASE: signal BlockWrite.eraseDone[c](result); break; case R_CRC: signal BlockRead.computeCrcDone[c](s[c].addr, currentOffset, crc, result); break; case R_SYNC: signal BlockWrite.syncDone[c](result); break; } } error_t newRequest(uint8_t newState, uint8_t id, storage_addr_t addr, uint8_t* COUNT_NOK(len) buf, storage_len_t len) { storage_len_t vsize; if (s[id].request != R_IDLE) return EBUSY; vsize = call BlockRead.getSize[id](); if (addr > vsize || len > vsize - addr) return EINVAL; s[id].request = newState; s[id].addr = addr; /* With deputy, updating a buffer/length pair requires nulling-out the buffer first (setting the buffer first would fail if the new buffer is shorter than the old, setting the length first would fail if the new buffer is longer than the old) */ s[id].buf = NULL; s[id].len = len; s[id].buf = buf; call Resource.request[id](); return SUCCESS; } event void Resource.granted[uint8_t blockId]() { client = blockId; if (s[blockId].request == R_WRITE && call BConfig.writeHook[blockId]()) { /* Config write intercept. We'll get a writeContinue when it's time to resume. */ client = NO_CLIENT; return; } startRequest(); } default command int BConfig.writeHook[uint8_t blockId]() { return FALSE; } event void BConfig.writeContinue[uint8_t blockId](error_t error) { /* Config intercept complete. Resume operation. */ client = blockId; if (error == SUCCESS) startRequest(); else endRequest(error, 0); } /* ------------------------------------------------------------------ */ /* Multipage operations */ /* ------------------------------------------------------------------ */ void multipageContinue(uint16_t crc) { storage_addr_t remaining = s[client].len - currentOffset, addr; at45page_t page; at45pageoffset_t pageOffset, count; uint8_t *buf = s[client].buf; if (remaining == 0) { endRequest(SUCCESS, crc); return; } addr = s[client].addr + currentOffset; page = pageRemap(addr >> AT45_PAGE_SIZE_LOG2); pageOffset = addr & ((1 << AT45_PAGE_SIZE_LOG2) - 1); count = (1 << AT45_PAGE_SIZE_LOG2) - pageOffset; if (remaining < count) count = remaining; switch (s[client].request) { case R_WRITE: call At45db.write(page, pageOffset, buf + currentOffset, count); break; case R_READ: call At45db.read(page, pageOffset, buf + currentOffset, count); break; case R_CRC: call At45db.computeCrc(page, pageOffset, count, crc); break; } currentOffset += count; } void multipageStart(uint16_t crc) { currentOffset = 0; multipageContinue(crc); } void multipageOpDone(error_t result, uint16_t crc) { if (result != SUCCESS) endRequest(result, 0); else multipageContinue(crc); } /* ------------------------------------------------------------------ */ /* Erase */ /* ------------------------------------------------------------------ */ command error_t BlockWrite.erase[uint8_t id]() { return newRequest(R_ERASE, id, 0, NULL, 0); } void eraseStart() { call At45db.erase(pageRemap(0), AT45_ERASE); } void eraseEraseDone(error_t error) { endRequest(error, 0); } /* ------------------------------------------------------------------ */ /* Write */ /* ------------------------------------------------------------------ */ command error_t BlockWrite.write[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len) { return newRequest(R_WRITE, id, addr, buf, len); } /* ------------------------------------------------------------------ */ /* Sync */ /* ------------------------------------------------------------------ */ command error_t BlockWrite.sync[uint8_t id]() { return newRequest(R_SYNC, id, 0, NULL, 0); } void syncStart() { call At45db.syncAll(); } void syncSyncDone(error_t error) { endRequest(error, 0); } /* ------------------------------------------------------------------ */ /* Read */ /* ------------------------------------------------------------------ */ command error_t BlockRead.read[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len) { return newRequest(R_READ, id, addr, buf, len); } /* ------------------------------------------------------------------ */ /* Compute CRC */ /* ------------------------------------------------------------------ */ command error_t BlockRead.computeCrc[uint8_t id](storage_addr_t addr, storage_len_t len, uint16_t basecrc) { return newRequest(R_CRC, id, addr, TCAST(void * COUNT(len),basecrc), len); } /* ------------------------------------------------------------------ */ /* Get Size */ /* ------------------------------------------------------------------ */ command storage_len_t BlockRead.getSize[uint8_t blockId]() { storage_len_t vsize; if (call BConfig.isConfig[blockId]()) vsize = signal BConfig.npages[blockId](); else vsize = call At45dbVolume.volumeSize[blockId](); return vsize << AT45_PAGE_SIZE_LOG2; } /* ------------------------------------------------------------------ */ /* Dispatch HAL operations to current user op */ /* ------------------------------------------------------------------ */ event void At45db.writeDone(error_t result) { if (client != NO_CLIENT) multipageOpDone(result, 0); } event void At45db.readDone(error_t result) { if (client != NO_CLIENT) multipageOpDone(result, 0); } event void At45db.computeCrcDone(error_t result, uint16_t newCrc) { if (client != NO_CLIENT) multipageOpDone(result, newCrc); } event void At45db.eraseDone(error_t result) { if (client != NO_CLIENT) eraseEraseDone(result); } event void At45db.syncDone(error_t result) { if (client != NO_CLIENT) syncSyncDone(result); } event void At45db.flushDone(error_t result) { } event void At45db.copyPageDone(error_t error) { } default event void BlockWrite.writeDone[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len, error_t result) { } default event void BlockWrite.eraseDone[uint8_t id](error_t result) { } default event void BlockWrite.syncDone[uint8_t id](error_t result) { } default event void BlockRead.readDone[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len, error_t result) { } default event void BlockRead.computeCrcDone[uint8_t id](storage_addr_t addr, storage_len_t len, uint16_t x, error_t result) { } default command at45page_t At45dbVolume.remap[uint8_t id](at45page_t volumePage) { return 0; } default command at45page_t At45dbVolume.volumeSize[uint8_t id]() { return 0; } default async command error_t Resource.request[uint8_t id]() { return FAIL; } default async command error_t Resource.release[uint8_t id]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/at45db/ConfigStorageC.nc000066400000000000000000000023641207233610700221430ustar00rootroot00000000000000// $Id: ConfigStorageC.nc,v 1.4 2006-12-12 18:23:02 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implementation of the config storage abstraction from TEP103 for the * Atmel AT45DB serial data flash. * * @param volid Volume to use for config storage * * @author David Gay */ #include "Storage.h" generic configuration ConfigStorageC(volume_id_t volid) { provides { interface Mount; interface ConfigStorage; } } implementation { enum { CONFIG_ID = unique(UQ_CONFIG_STORAGE), RESOURCE_ID = unique(UQ_AT45DB) }; components ConfigStorageP, WireConfigStorageP, At45dbStorageManagerC, At45dbC; components BlockStorageP, WireBlockStorageP; Mount = ConfigStorageP.Mount[CONFIG_ID]; ConfigStorage = ConfigStorageP.ConfigStorage[CONFIG_ID]; BlockStorageP.At45dbVolume[CONFIG_ID] -> At45dbStorageManagerC.At45dbVolume[volid]; BlockStorageP.Resource[CONFIG_ID] -> At45dbC.Resource[RESOURCE_ID]; } tinyos-2.1.2+dfsg/tos/chips/at45db/ConfigStorageP.nc000066400000000000000000000277041207233610700221650ustar00rootroot00000000000000// $Id: ConfigStorageP.nc,v 1.7 2008-06-23 20:25:15 regehr Exp $ /* * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Private component of the AT45DB implementation of the config storage * abstraction. * * @author: David Gay */ #include "Storage.h" #include "crc.h" module ConfigStorageP @safe() { provides { interface Mount[uint8_t id]; interface ConfigStorage[uint8_t id]; interface At45dbBlockConfig as BConfig[uint8_t id]; } uses { interface At45db; interface BlockRead[uint8_t id]; interface BlockWrite[uint8_t id]; } } implementation { /* A config storage is built on top of a block storage volume, with the block storage volume divided into two and the first 4 bytes of each half holding a (>0) version number. The valid half with the highest version number is the current version. Transactional behaviour is achieved by copying the current half into the other, then increment its version number. Writes then proceed in that new half until a commit, which just uses the underlying BlockStorage commit's operation. Note: all of this depends on the at45db's implementation of BlockStorageP. It will not work over an arbitrary BlockStorageP implementation (additionally, it uses hooks in BlockStorageP to support the half-volume operation). Additionally, the code assumes that the config volumes all have lower ids than the block volumes. */ enum { S_STOPPED, S_MOUNT, S_COMMIT, S_CLEAN, S_DIRTY, S_INVALID }; enum { N = uniqueCount(UQ_CONFIG_STORAGE), NO_CLIENT = 0xff, }; /* Per-client state. We could keep just the state and current version in an array, but this requires more complex arbitration (don't release block storage during mount or commit). As I don't expect many config volumes, this doesn't seem worth the trouble. */ struct { uint8_t state : 3; uint8_t committing : 1; } s[N]; nx_struct { nx_uint16_t crc; nx_uint32_t version; } low[N], high[N]; /* Bit n is true if client n is using upper block */ uint8_t flipState[(N + 7) / 8]; uint8_t client = NO_CLIENT; at45page_t nextPage; void setFlip(uint8_t id, bool flip) { if (flip) flipState[id >> 3] |= 1 << (id & 7); else flipState[id >> 3] &= ~(1 << (id & 7)); } bool flipped(uint8_t id) { return call BConfig.flipped[id](); } void flip(uint8_t id) { setFlip(id, !flipped(id)); } storage_len_t volumeSize(uint8_t id) { return call BlockRead.getSize[id](); } /* ------------------------------------------------------------------ */ /* Mounting */ /* ------------------------------------------------------------------ */ command error_t Mount.mount[uint8_t id]() { /* Read version on both halves. Validate higher. Validate lower if higher invalid. Use lower if both invalid. */ if (s[id].state != S_STOPPED) return FAIL; s[id].state = S_MOUNT; setFlip(id, FALSE); call BlockRead.read[id](0, &low[id], sizeof low[id]); return SUCCESS; } void computeCrc(uint8_t id) { call BlockRead.computeCrc[id](sizeof(nx_uint16_t), volumeSize(id) - sizeof(nx_uint16_t), 0); } void mountReadDone(uint8_t id, error_t error) { if (error != SUCCESS) { s[id].state = S_STOPPED; signal Mount.mountDone[id](FAIL); } else if (!call BConfig.flipped[id]()) { /* Just read low-half version. Read high-half version */ setFlip(id, TRUE); call BlockRead.read[id](0, &high[id], sizeof high[id]); } else { /* Verify the half with the largest version */ setFlip(id, high[id].version > low[id].version); computeCrc(id); } } void mountCrcDone(uint8_t id, uint16_t crc, error_t error) { bool isflipped = call BConfig.flipped[id](); if (error == SUCCESS && crc == (isflipped ? high[id].crc : low[id].crc)) { /* We just use the low data once mounted */ if (isflipped) low[id].version = high[id].version; s[id].state = S_CLEAN; } else { // try the other half? if ((high[id].version > low[id].version) == isflipped) { /* Verification of the half with the highest version failed. Try the other half. */ setFlip(id, !isflipped); computeCrc(id); return; } /* Both halves bad, terminate. Reads will fail. */ s[id].state = S_INVALID; low[id].version = 0; } signal Mount.mountDone[id](SUCCESS); } /* ------------------------------------------------------------------ */ /* Read */ /* ------------------------------------------------------------------ */ command error_t ConfigStorage.read[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len) { /* Read from current half using BlockRead */ if (s[id].state < S_CLEAN) return EOFF; if (s[id].state == S_INVALID) // nothing to read return FAIL; return call BlockRead.read[id](addr + sizeof low[0], buf, len); } void readReadDone(uint8_t id, storage_addr_t addr, void* COUNT(len) buf, storage_len_t len, error_t error) { signal ConfigStorage.readDone[id](addr - sizeof low[0], buf, len, error); } /* ------------------------------------------------------------------ */ /* Write */ /* ------------------------------------------------------------------ */ command error_t ConfigStorage.write[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len) { /* 1: If first write: copy to other half with incremented version number 2: Write to other half using BlockWrite */ if (s[id].state < S_CLEAN) return EOFF; return call BlockWrite.write[id](addr + sizeof low[0], buf, len); } void copyCopyPageDone(error_t error); void writeContinue(error_t error); command int BConfig.writeHook[uint8_t id]() { if (s[id].committing) return FALSE; flip(id); /* We write to the non-current half... */ if (s[id].state != S_CLEAN) // no copy if dirty or invalid return FALSE; /* Time to do the copy dance */ client = id; nextPage = signal BConfig.npages[id](); copyCopyPageDone(SUCCESS); return TRUE; } void copyCopyPageDone(error_t error) { if (error != SUCCESS) writeContinue(error); else if (nextPage == 0) // copy done { s[client].state = S_DIRTY; writeContinue(SUCCESS); } else { // copy next page at45page_t from, to, npages = signal BConfig.npages[client](); to = from = signal BConfig.remap[client](--nextPage); if (flipped(client)) from -= npages; else from += npages; call At45db.copyPage(from, to); } } void writeContinue(error_t error) { uint8_t id = client; client = NO_CLIENT; signal BConfig.writeContinue[id](error); } void writeWriteDone(uint8_t id, storage_addr_t addr, void* COUNT(len) buf, storage_len_t len, error_t error) { flip(id); // flip back to current half signal ConfigStorage.writeDone[id](addr - sizeof low[0], buf, len, error); } /* ------------------------------------------------------------------ */ /* Commit */ /* ------------------------------------------------------------------ */ void commitSyncDone(uint8_t id, error_t error); command error_t ConfigStorage.commit[uint8_t id]() { error_t ok; uint16_t crc; uint8_t i; if (s[id].state < S_CLEAN) return EOFF; if (s[id].state == S_CLEAN) /* A dummy CRC call to avoid signaling a completion event from here */ return call BlockRead.computeCrc[id](0, 1, 0); /* Compute CRC for new version and current contents */ flip(id); low[id].version++; for (crc = 0, i = 0; i < sizeof low[id].version; i++) crc = crcByte(crc, ((uint8_t *)&low[id] + sizeof(nx_uint16_t))[i]); ok = call BlockRead.computeCrc[id](sizeof low[id], volumeSize(id) - sizeof low[id], crc); if (ok == SUCCESS) s[id].committing = TRUE; return ok; } void commitCrcDone(uint8_t id, uint16_t crc, error_t error) { /* Weird commit of clean volume hack: we just complete now, w/o really doing anything. Ideally we should short-circuit out in the commit call, but that would break the "no-signal-from-command" rule. So we just waste the CRC computation effort instead - the assumption is people don't regularly commit clean volumes. */ if (s[id].state == S_CLEAN) signal ConfigStorage.commitDone[id](error); else if (error != SUCCESS) commitSyncDone(id, error); else { low[id].crc = crc; call BlockWrite.write[id](0, &low[id], sizeof low[id]); } } void commitWriteDone(uint8_t id, error_t error) { if (error != SUCCESS) commitSyncDone(id, error); else call BlockWrite.sync[id](); } void commitSyncDone(uint8_t id, error_t error) { s[id].committing = FALSE; if (error == SUCCESS) s[id].state = S_CLEAN; else flip(id); // revert to old block signal ConfigStorage.commitDone[id](error); } /* ------------------------------------------------------------------ */ /* Get Size */ /* ------------------------------------------------------------------ */ command storage_len_t ConfigStorage.getSize[uint8_t id]() { return volumeSize(id) - sizeof low[0]; } /* ------------------------------------------------------------------ */ /* Valid */ /* ------------------------------------------------------------------ */ command bool ConfigStorage.valid[uint8_t id]() { return s[id].state != S_INVALID; } /* ------------------------------------------------------------------ */ /* Interface with BlockStorageP */ /* ------------------------------------------------------------------ */ /* The config volumes use the low block volume numbers. So a volume is a config volume iff its its id is less than N */ command int BConfig.isConfig[uint8_t id]() { return id < N; } inline command int BConfig.flipped[uint8_t id]() { return (flipState[id >> 3] & (1 << (id & 7))) != 0; } event void BlockRead.readDone[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { if (id < N) if (s[id].state == S_MOUNT) mountReadDone(id, error); else readReadDone(id, addr, buf, len, error); } event void BlockWrite.writeDone[uint8_t id]( storage_addr_t addr, void* buf, storage_len_t len, error_t error ) { if (id < N) if (s[id].committing) commitWriteDone(id, error); else writeWriteDone(id, addr, buf, len, error); } event void BlockWrite.syncDone[uint8_t id]( error_t error ) { if (id < N) commitSyncDone(id, error); } event void BlockRead.computeCrcDone[uint8_t id]( storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error ) { if (id < N) if (s[id].state == S_MOUNT) mountCrcDone(id, crc, error); else commitCrcDone(id, crc, error); } event void At45db.copyPageDone(error_t error) { if (client != NO_CLIENT) copyCopyPageDone(error); } event void BlockWrite.eraseDone[uint8_t id](error_t error) {} event void At45db.eraseDone(error_t error) {} event void At45db.syncDone(error_t error) {} event void At45db.flushDone(error_t error) {} event void At45db.readDone(error_t error) {} event void At45db.computeCrcDone(error_t error, uint16_t crc) {} event void At45db.writeDone(error_t error) {} default event void Mount.mountDone[uint8_t id](error_t error) { } default event void ConfigStorage.readDone[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} default event void ConfigStorage.writeDone[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} default event void ConfigStorage.commitDone[uint8_t id](error_t error) {} } tinyos-2.1.2+dfsg/tos/chips/at45db/HplAt45db.h000066400000000000000000000020421207233610700206150ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef HPLAT45DB_H #define HPLAT45DB_H #include "HplAt45db_chip.h" enum { // commands we're executing (all SPI Mode 0 or 3) AT45_C_READ_BUFFER1 = 0xd4, AT45_C_READ_BUFFER2 = 0xd6, AT45_C_READ_CONTINUOUS = 0xe8, AT45_C_READ_PAGE = 0xd2, AT45_C_WRITE_BUFFER1 = 0x84, AT45_C_WRITE_BUFFER2 = 0x87, AT45_C_WRITE_MEM_BUFFER1 = 0x82, AT45_C_WRITE_MEM_BUFFER2 = 0x85, AT45_C_FILL_BUFFER1 = 0x53, AT45_C_FILL_BUFFER2 = 0x55, AT45_C_FLUSH_BUFFER1 = 0x83, AT45_C_FLUSH_BUFFER2 = 0x86, AT45_C_QFLUSH_BUFFER1 = 0x88, AT45_C_QFLUSH_BUFFER2 = 0x89, AT45_C_COMPARE_BUFFER1 = 0x60, AT45_C_COMPARE_BUFFER2 = 0x61, AT45_C_REQ_STATUS = 0xd7, AT45_C_ERASE_PAGE = 0x81, }; #endif tinyos-2.1.2+dfsg/tos/chips/at45db/HplAt45db.nc000066400000000000000000000151301207233610700207700ustar00rootroot00000000000000/* * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * HPL for Atmel's AT45DB family of serial dataflash chips. * Provides access to all basic AT45DB operations plus operations to * wait for the flash to go idle or finish a comparison. See the AT45DB * family datasheets for full details on these operations. *

    * This interface only supports one operation at a time. * * @author David Gay */ #include "HplAt45db.h" interface HplAt45db { /** * Wait for a "Group A" operation to complete (essentially all non-buffer * operations). You should use waitComapre if you are waiting for a * comparison to complete. waitIdleDone will be signaled when the operation * is complete. */ command void waitIdle(); /** * Signaled when the flash is idle. */ event void waitIdleDone(); /** * Wait for a buffer-flash comparison to complete. waitCompareDone will * be signaled when that occurs. */ command void waitCompare(); /** * Signaled when the buffer-flash comparison is complete. * @param compareOk TRUE if the comparison succeeded, FALSE otherwise. */ event void waitCompareDone(bool compareOk); /** * Read a page from flash into a buffer. fillDone will be signaled. * @param cmd AT45_C_FILL_BUFFER1 to read into buffer 1, * AT45_C_FILL_BUFFER2 to read into buffer 2 * @param page Page to read (must be less than AT45_MAX_PAGES) */ command void fill(uint8_t cmd, at45page_t page); /** * Signaled when fill command sent (use waitIdle to detect when * fill command completes) */ event void fillDone(); /** * Write a buffer to a flash page. flushDone will be signaled. * @param cmd AT45_C_FLUSH_BUFFER1 to write buffer 1 to flash, * AT45_C_FLUSH_BUFFER2 to write buffer 2 to flash, * AT45_C_QFLUSH_BUFFER1 to write buffer 1 to flash w/o erase * (page must have been previously erased), * AT45_C_QFLUSH_BUFFER2 to write buffer 2 to flash w/o erase * (page must have been previously erased), * @param page Page to write (must be less than AT45_MAX_PAGES) */ command void flush(uint8_t cmd, at45page_t page); /** * Signaled when flush command sent (use waitIdle to detect when * flush command completes) */ event void flushDone(); /** * Compare a page from flash with a buffer. compareDone will be signaled. * @param cmd AT45_C_COMPARE_BUFFER1 to compare buffer 1, * AT45_C_COMPARE_BUFFER2 to compare buffer 2 * @param page Page to compare with (must be less than AT45_MAX_PAGES) */ command void compare(uint8_t cmd, at45page_t page); /** * Signaled when compare command sent (use waitCompare to detect when * compare command completes and find out comparison result) */ event void compareDone(); /** * Erase a flash page. eraseDone will be signaled. * @param cmd must be AT45_C_ERASE_PAGE * @param page Page to compare with (must be less than AT45_MAX_PAGES) */ command void erase(uint8_t cmd, at45page_t page); /** * Signaled when erase command sent (use waitIdle to detect when * erase command completes) */ event void eraseDone(); /** * Read from a flash buffer. readDone will be signaled. * @param cmd AT45_C_READ_BUFFER1 to read from buffer 1, * AT45_C_READ_BUFFER2 to read from buffer 2 * @param offset Offset in page at which to start reading - must be between * 0 and AT45_PAGE_SIZE - 1 * @param data Buffer in which to place read data. The buffer is "returned" * at readDone time. * @param n Number of bytes to read (> 0). offset + n must be <= * AT45_PAGE_SIZE */ command void readBuffer(uint8_t cmd, at45pageoffset_t offset, uint8_t *PASS COUNT_NOK(n) data, uint16_t n); /** * Read directly from flash. readDone will be signaled. * @param cmd AT45_C_READ_CONTINUOUS or AT45_C_READ_PAGE. When the end of * a page is read, AT45_C_READ_CONTINUOUS continues on the next page, * while AT45_C_READ_PAGE continues at the start of the same page. * @param page Page to read from * @param offset Offset in page at which to start reading - must be between * 0 and AT45_PAGE_SIZE - 1 * @param data Buffer in which to place read data. The buffer is "returned" * at readDone time. * @param n Number of bytes to read (> 0). */ command void read(uint8_t cmd, at45page_t page, at45pageoffset_t offset, uint8_t *PASS COUNT_NOK(n) data, at45pageoffset_t n); /** * Signaled when data has been read from the buffer. The data buffer * is "returned". */ event void readDone(); /** * Compute CRC of data in a flash buffer (using the CRC function from crc.h). * crcDone will be signaled. * @param cmd AT45_C_READ_BUFFER1 to compute CRC from buffer 1, * AT45_C_READ_BUFFER2 to compute CRC from buffer 2 * @param page ignored (reserved for future use) * @param offset Offset in page at which to start reading - must be between * 0 and AT45_PAGE_SIZE - 1 * @param n Number of bytes to read (> 0). offset + n must be <= * AT45_PAGE_SIZE * @param baseCrc initial CRC value - use 0 if computing a "standalone" * CRC, or a previous crc result if computing a CRC over several * flash pages */ command void crc(uint8_t cmd, at45page_t page, at45pageoffset_t offset, at45pageoffset_t n, uint16_t baseCrc); /** * Signaled when CRC has been computed. * @param computedCrc CRC value */ event void crcDone(uint16_t computedCrc); /** * Write some data to a flash buffer, and optionally the flash itself. * writeDone will be signaled. * @param cmd One of AT45_C_WRITE_BUFFER1/2 or AT45_C_WRITE_MEM_BUFFER1/2 * to write respectively to buffer 1/2, or to buffer 1/2 and the * specified main memory page. * @param page Page to write when cmd is AT45_C_WRITE_MEM_BUFFER1/2 * @param offset Offset in page at which to start writing - must be between * 0 and AT45_PAGE_SIZE - 1 * @param data Data to write. The buffer is "returned" at writeDone time. * @param n Number of bytes to write (> 0). offset + n must be <= * AT45_PAGE_SIZE */ command void write(uint8_t cmd, at45page_t page, at45pageoffset_t offset, uint8_t *PASS COUNT_NOK(n) data, at45pageoffset_t n); /** * Signaled when data has been written to the buffer. The data buffer * is "returned". */ event void writeDone(); } tinyos-2.1.2+dfsg/tos/chips/at45db/HplAt45dbByte.nc000066400000000000000000000031151207233610700216140ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Interface between generic byte-at-a-time AT45DB HPL implementation and * its platform specific aspects. *

    * Each platform must provide its own HPL implementation for its AT45DB * flash chip. To simplify this task, this directory provides a generic HPL * implementation (HplAt45dbByteC) which can easily be used to build an * AT45DB HPL by connecting it to a byte-at-a-time SPI interface, and an * implementation of the operations of this interface. * * @author David Gay */ interface HplAt45dbByte { /** * Wait for the flash chip to report that it is idle. This command is * called immediately after sending a status request command to the * flash, so it is sufficient to wait for the flash's data pin to go * high. */ command void waitIdle(); /** * Signaled when the flash chip is idle. */ event void idle(); /** * This command may be called immediately after idle is signaled. It * must report the flash's current compare status. * @return TRUE if the last compare succeeded, FALSE if it failed. */ command bool getCompareStatus(); /** * Assert the flash's select pin. */ command void select(); /** * Deassert the flash's select pin. */ command void deselect(); } tinyos-2.1.2+dfsg/tos/chips/at45db/HplAt45dbByteC.nc000066400000000000000000000134731207233610700217270ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Generic byte-at-a-time implementation of the AT45DB HPL. * * Each platform must provide its own HPL implementation for its AT45DB * flash chip. To simplify this task, this component can easily be used to * build an AT45DB HPL by connecting it to a byte-at-a-time SPI interface, * and an HplAt45dbByte interface. * * @param The number of bits needed to represent a sector size, e.g., 9 * for the AT45DB041B. * * @author David Gay */ generic module HplAt45dbByteC(int sectorSizeLog2) @safe() { provides interface HplAt45db; uses { interface Resource; interface SpiByte as FlashSpi; interface HplAt45dbByte; } } implementation { enum { P_IDLE, P_SEND_CMD, P_READ, P_READ_CRC, P_WRITE, P_WAIT_IDLE, P_WAIT_COMPARE, P_WAIT_COMPARE_OK, P_FILL, P_FLUSH, P_COMPARE, P_ERASE }; uint8_t status = P_IDLE; uint8_t flashCmd[9]; at45pageoffset_t dataCount; uint8_t * COUNT_NOK(dataCount) data; uint8_t dontCare; void complete(uint16_t crc) { uint8_t s = status; status = P_IDLE; switch (s) { default: break; case P_READ_CRC: signal HplAt45db.crcDone(crc); break; case P_FILL: signal HplAt45db.fillDone(); break; case P_FLUSH: signal HplAt45db.flushDone(); break; case P_COMPARE: signal HplAt45db.compareDone(); break; case P_ERASE: signal HplAt45db.eraseDone(); break; case P_READ: signal HplAt45db.readDone(); break; case P_WRITE: signal HplAt45db.writeDone(); break; } } void requestFlashStatus() { call HplAt45dbByte.select(); call FlashSpi.write(AT45_C_REQ_STATUS); call HplAt45dbByte.waitIdle(); } void doCommand() { uint8_t in = 0, out = 0; uint8_t *ptr; at45pageoffset_t count; uint8_t lphase; uint16_t crc = (uint16_t)data; if (dataCount) // skip 0-byte ops { /* For a 3% speedup, we could use labels and goto *. But: very gcc-specific. Also, need to do asm ("ijmp" : : "z" (state)) instead of goto *state */ ptr = flashCmd; lphase = P_SEND_CMD; count = 4 + dontCare; call HplAt45dbByte.select(); for (;;) { if (lphase == P_READ_CRC) { crc = crcByte(crc, in); --count; if (!count) break; } else if (lphase == P_SEND_CMD) { // Note: the dontCare bytes are read after the end of cmd... out = *ptr++; count--; if (!count) { lphase = status; ptr = data; count = dataCount; } } else if (lphase == P_READ) { *ptr++ = in; --count; if (!count) break; } else if (lphase == P_WRITE) { if (!count) break; out = *ptr++; --count; } else /* P_COMMAND */ break; in = call FlashSpi.write(out); } call HplAt45dbByte.deselect(); } call Resource.release(); complete(crc); } event void Resource.granted() { switch (status) { case P_WAIT_COMPARE: case P_WAIT_IDLE: requestFlashStatus(); break; default: doCommand(); break; } } void execCommand(uint8_t op, uint8_t reqCmd, uint8_t reqDontCare, at45page_t reqPage, at45pageoffset_t reqOffset, uint8_t * COUNT_NOK(reqCount) reqData, at45pageoffset_t reqCount) { status = op; // page (2 bytes) and highest bit of offset flashCmd[0] = reqCmd; flashCmd[1] = reqPage >> (16 - sectorSizeLog2); flashCmd[2] = reqPage << (sectorSizeLog2 - 8) | reqOffset >> 8; flashCmd[3] = reqOffset; // low-order 8 bits data = NULL; dataCount = reqCount; data = reqData; dontCare = reqDontCare; call Resource.request(); } command void HplAt45db.waitIdle() { status = P_WAIT_IDLE; call Resource.request(); } command void HplAt45db.waitCompare() { status = P_WAIT_COMPARE; call Resource.request(); } event void HplAt45dbByte.idle() { if (status == P_WAIT_COMPARE) { bool cstatus = call HplAt45dbByte.getCompareStatus(); call HplAt45dbByte.deselect(); call Resource.release(); signal HplAt45db.waitCompareDone(cstatus); } else { call HplAt45dbByte.deselect(); call Resource.release(); signal HplAt45db.waitIdleDone(); } } command void HplAt45db.fill(uint8_t cmd, at45page_t page) { execCommand(P_FILL, cmd, 0, page, 0, NULL, 1); } command void HplAt45db.flush(uint8_t cmd, at45page_t page) { execCommand(P_FLUSH, cmd, 0, page, 0, NULL, 1); } command void HplAt45db.compare(uint8_t cmd, at45page_t page) { execCommand(P_COMPARE, cmd, 0, page, 0, NULL, 1); } command void HplAt45db.erase(uint8_t cmd, at45page_t page) { execCommand(P_ERASE, cmd, 0, page, 0, NULL, 1); } command void HplAt45db.read(uint8_t cmd, at45page_t page, at45pageoffset_t offset, uint8_t *pdata, at45pageoffset_t count) { execCommand(P_READ, cmd, 5, page, offset, pdata, count); } command void HplAt45db.readBuffer(uint8_t cmd, at45pageoffset_t offset, uint8_t *pdata, at45pageoffset_t count) { execCommand(P_READ, cmd, 2, 0, offset, pdata, count); } command void HplAt45db.crc(uint8_t cmd, at45page_t page, at45pageoffset_t offset, at45pageoffset_t count, uint16_t baseCrc) { execCommand(P_READ_CRC, cmd, 2, page, offset, TCAST(uint8_t * COUNT(count), baseCrc), count); } command void HplAt45db.write(uint8_t cmd, at45page_t page, at45pageoffset_t offset, uint8_t *pdata, at45pageoffset_t count) { execCommand(P_WRITE, cmd, 0, page, offset, pdata, count); } } tinyos-2.1.2+dfsg/tos/chips/at45db/LogStorageC.nc000066400000000000000000000024201207233610700214500ustar00rootroot00000000000000// $Id: LogStorageC.nc,v 1.4 2006-12-12 18:23:02 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implementation of the log storage abstraction from TEP103 for the * Atmel AT45DB serial data flash. * * @param volid Volume to use for log storage * @param circular TRUE if you want a circular log, FALSE for a linear log * * @author David Gay */ #include "Storage.h" generic configuration LogStorageC(volume_id_t volid, bool circular) { provides { interface LogWrite; interface LogRead; } } implementation { enum { LOG_ID = unique(UQ_LOG_STORAGE), INTF_ID = LOG_ID << 1 | circular, RESOURCE_ID = unique(UQ_AT45DB) }; components LogStorageP, WireLogStorageP, At45dbStorageManagerC, At45dbC; LogWrite = LogStorageP.LogWrite[INTF_ID]; LogRead = LogStorageP.LogRead[INTF_ID]; LogStorageP.At45dbVolume[LOG_ID] -> At45dbStorageManagerC.At45dbVolume[volid]; LogStorageP.Resource[LOG_ID] -> At45dbC.Resource[RESOURCE_ID]; } tinyos-2.1.2+dfsg/tos/chips/at45db/LogStorageP.nc000066400000000000000000000727651207233610700215100ustar00rootroot00000000000000/* * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include #include /** * Private component of the AT45DB implementation of the log storage * abstraction. * * @author: David Gay * @author: Jonathan Hui */ module LogStorageP @safe() { provides { interface LogRead[uint8_t logId]; interface LogWrite[uint8_t logId]; } uses { interface At45db; interface At45dbVolume[uint8_t logId]; interface Resource[uint8_t logId]; } } implementation { /* Some design notes. - The logId's in the LogRead and LogWrites are shifted left by 1 bit. The low-order bit is 1 for circular logs, 0 for linear ones (see newRequest and endRequest, and the LogStorageC configuration) - Data is written sequentially to the pages of a log volume. Each page ends with a footer (nx_struct pageinfo) recording metadata on the current page: o a cookie o the "position" of the current page in the log (see below) o the offset of the last record on this page (i.e., the offset at which the last append ended) - only valid if flags & F_LASTVALID o flags: x F_SYNC page was synchronised - data after lastRecordOffset is not log data; implies F_LASTVALID x F_CIRCLED this page is not from the first run through the log's pages (never set in linear logs) x F_LASTVALID not set if no record ended on this page o a CRC - "Positions" are stored in the metadata, used as cookies by currentOffset and seek, and stored in the wpos and rpos fields of the volume state structure. They represent the number of bytes that writing has advanced in the log since the log was erased, with PAGE_SIZE added. Note that this is basically the number of bytes written, except that when a page is synchronised unused bytes in the page count towards increasing the position. As a result, on page p, the following equation holds: (metadata(p).pos - PAGE_SIZE) % volume-size == p * PAGE_SIZE (this also means that the "position" metadata field could be replaced by a count of the number of times writing has cycled through the log, reducing the metadata size) The PAGE_SIZE offset on positions is caused by Invariant 2 below: to ensure that Invariant 2 is respected, at flash erase time, we write a valid page with position 0 to the last block of the flash. As a result, the first writes to the flash, in page 0, are at "position" PAGE_SIZE. - This code is designed to deal with "one-at-a-time" failures (i.e., the system will not modify any blocks after a previous failed write). This should allow recovery from: o arbitrary reboots o write failure (the underlying PageEEPROM shuts down after any write fails; all pages are flushed before moving on to the next page) It will not recover from arbitrary data corruption - When sync is called, the current write page is written to flash with an F_SYNC flag and writing continues on the next page (wasting on average half a flasg page) - We maintain the following invariants on log volumes, even in the face of the "one-at-a-time" failures described above: 1) at least one of the first and last blocks are valid 2) the last block, if valid, has the F_SYNC flag - Locating the log boundary page (the page with the greatest position): Invariant 1, the one-at-a-time failure model and the metadata position definition guarantees that the physical flash pages have the following properties: an initial set of V1 valid pages, followed by a set of I invalid pages, followed by a set of V2 valid pages with V1+i+V2=total-number-of-pages, and V1, V2, I >= 0 Additionally, the position of all pages in V1 is greater than in V2, and consecutive pages in V1 (respectively V2) have greater positions than their predecessors. From this, it's possible to locate the log boundary page (the page with the greatest position) using the following algorithm: o let basepos=metadata(lastpage).pos, or 0 if the last page is invalid o locate (using a binary search) the page p with the largest position greater than basepos invalid pages can be assumed to have positions less than basepos if there is no such page p, let p = lastpage Once the log boundary page is known, we resume writing at the last page before p with a record boundary (Invariant 2, combined with limiting individual records to volumesize - PAGE_SIZE ensures there will be such a page). - The read pointer has a special "invalid" state which represents the current beginning of the log. In that state, LogRead.currentOffset() returns SEEK_BEGINNING rather than a regular position. The read pointer is invalidated: o at boot time o after the volume is erased o after the write position "catches up" with the read position o after a failed seek Reads from an invalid pointer: o start reading from the beginning of the flash if we are on the first run through the log volume o start reading at the first valid page after the write page with an F_LASTVALID flag; the read offset is set to the lastRecordOffset value if this page has the SYNC flag, we start at the beginning of the next page */ enum { F_SYNC = 1, F_CIRCLED = 2, F_LASTVALID = 4 }; nx_struct pageinfo { nx_uint16_t magic; nx_uint32_t pos; nx_uint8_t lastRecordOffset; nx_uint8_t flags; nx_uint16_t crc; }; enum { N = uniqueCount(UQ_LOG_STORAGE), NO_CLIENT = 0xff, PAGE_SIZE = AT45_PAGE_SIZE - sizeof(nx_struct pageinfo), PERSISTENT_MAGIC = 0x4256, }; enum { R_IDLE, R_ERASE, R_APPEND, R_SYNC, R_READ, R_SEEK }; enum { META_IDLE, META_LOCATEFIRST, META_LOCATE, META_LOCATELAST, META_SEEK, META_READ, META_WRITE }; uint8_t client = NO_CLIENT; uint8_t metaState; bool recordsLost; at45page_t firstPage, lastPage; storage_len_t pos; nx_struct pageinfo metadata; struct { /* The latest request made for this client, and it's arguments */ uint8_t request; uint8_t *COUNT_NOK(len) buf; storage_len_t len; /* Log r/w positions */ bool positionKnown : 1; bool circular : 1; bool circled : 1; bool rvalid : 1; uint32_t wpos; /* Bytes since start of logging */ at45page_t wpage; /* Current write page */ at45pageoffset_t woffset; /* Offset on current write page */ uint32_t rpos; /* Bytes since start of logging */ at45page_t rpage; /* Current read page */ at45pageoffset_t roffset; /* Offset on current read page */ at45pageoffset_t rend; /* Last valid offset on current read page */ } s[N]; at45page_t firstVolumePage() { return call At45dbVolume.remap[client](0); } at45page_t npages() { return call At45dbVolume.volumeSize[client](); } at45page_t lastVolumePage() { return call At45dbVolume.remap[client](npages()); } void setWritePage(at45page_t page) { if (s[client].circular && page == lastVolumePage()) { s[client].circled = TRUE; page = firstVolumePage(); } s[client].wpage = page; s[client].woffset = 0; } void invalidateReadPointer() { s[client].rvalid = FALSE; } void crcPage(at45page_t page) { call At45db.computeCrc(page, 0, PAGE_SIZE + offsetof(nx_struct pageinfo, crc), 0); } void readMetadata(at45page_t page) { call At45db.read(page, PAGE_SIZE, &metadata, sizeof metadata); } void writeMetadata(at45page_t page) { call At45db.write(page, PAGE_SIZE, &metadata, sizeof metadata); } void wmetadataStart(); void sync() { metadata.flags = F_SYNC | F_LASTVALID; metadata.lastRecordOffset = s[client].woffset; /* rend is now no longer the end of the page */ if (s[client].rpage == s[client].wpage) s[client].rend = s[client].woffset; wmetadataStart(); } /* ------------------------------------------------------------------ */ /* Queue and initiate user requests */ /* ------------------------------------------------------------------ */ void eraseStart(); void appendStart(); void syncStart(); void readStart(); void locateStart(); void rmetadataStart(); void seekStart(); void startRequest() { if (!s[client].positionKnown && s[client].request != R_ERASE) { locateStart(); return; } metaState = META_IDLE; switch (s[client].request) { case R_ERASE: eraseStart(); break; case R_APPEND: appendStart(); break; case R_SYNC: syncStart(); break; case R_READ: readStart(); break; case R_SEEK: seekStart(); break; } } void endRequest(error_t ok) { uint8_t c = client; uint8_t request = s[c].request; storage_len_t actualLen = pos; void *ptr = s[c].buf; client = NO_CLIENT; s[c].request = R_IDLE; call Resource.release[c](); c = c << 1 | s[c].circular; switch (request) { case R_ERASE: signal LogWrite.eraseDone[c](ok); break; case R_APPEND: signal LogWrite.appendDone[c](ptr, actualLen, recordsLost, ok); break; case R_SYNC: signal LogWrite.syncDone[c](ok); break; case R_READ: signal LogRead.readDone[c](ptr, actualLen, ok); break; case R_SEEK: signal LogRead.seekDone[c](ok); break; } } /* Enqueue request and request the underlying flash */ error_t newRequest(uint8_t newRequest, uint8_t id, uint8_t *COUNT_NOK(length) buf, storage_len_t length) { s[id >> 1].circular = id & 1; id >>= 1; if (s[id].request != R_IDLE) return EBUSY; s[id].request = newRequest; s[id].buf = NULL; s[id].len = length; s[id].buf = buf; call Resource.request[id](); return SUCCESS; } event void Resource.granted[uint8_t id]() { client = id; pos = 0; startRequest(); } command error_t LogWrite.append[uint8_t id](void* buf, storage_len_t length) { if (length > call LogRead.getSize[id]() - PAGE_SIZE) /* Writes greater than the volume size are invalid. Writes equal to the volume size could break the log volume invariant (see next comment). Writes that span the whole volume could lead to problems at boot time (no valid block with a record boundary). Refuse them all. */ return EINVAL; else return newRequest(R_APPEND, id, buf, length); } command storage_cookie_t LogWrite.currentOffset[uint8_t id]() { return s[id >> 1].wpos; } command error_t LogWrite.erase[uint8_t id]() { return newRequest(R_ERASE, id, NULL, 0); } command error_t LogWrite.sync[uint8_t id]() { return newRequest(R_SYNC, id, NULL, 0); } command error_t LogRead.read[uint8_t id](void* buf, storage_len_t length) { return newRequest(R_READ, id, buf, length); } command storage_cookie_t LogRead.currentOffset[uint8_t id]() { id >>= 1; return s[id].rvalid ? s[id].rpos : SEEK_BEGINNING; } command error_t LogRead.seek[uint8_t id](storage_cookie_t offset) { return newRequest(R_SEEK, id, TCAST(void *COUNT(offset), ((uint16_t)(offset >> 16))), offset); } command storage_len_t LogRead.getSize[uint8_t id]() { return call At45dbVolume.volumeSize[id >> 1]() * (storage_len_t)PAGE_SIZE; } /* ------------------------------------------------------------------ */ /* Erase */ /* ------------------------------------------------------------------ */ void eraseMetadataDone() { /* Set write pointer to the beginning of the flash */ s[client].wpos = PAGE_SIZE; // last page has offset 0 and is before us s[client].circled = FALSE; setWritePage(firstVolumePage()); invalidateReadPointer(); s[client].positionKnown = TRUE; endRequest(SUCCESS); } void eraseEraseDone() { if (firstPage == lastPage - 1) { /* We create a valid, synced last page (see invariants) */ metadata.flags = F_SYNC | F_LASTVALID; metadata.lastRecordOffset = 0; setWritePage(firstPage); s[client].circled = FALSE; s[client].wpos = 0; wmetadataStart(); } else call At45db.erase(firstPage++, AT45_ERASE); } void eraseStart() { s[client].positionKnown = FALSE; // in case erase fails firstPage = firstVolumePage(); lastPage = lastVolumePage(); eraseEraseDone(); } /* ------------------------------------------------------------------ */ /* Locate log boundaries */ /* ------------------------------------------------------------------ */ void locateLastRecord(); void locateLastCrcDone(uint16_t crc) { if (crc != metadata.crc) { locateLastRecord(); return; } /* We've found the last valid page with a record-end. Set up the read and write positions. */ invalidateReadPointer(); if (metadata.flags & F_SYNC) /* must start on next page */ { /* We need to special case the empty log, as we don't want to wrap around in the case of a full, non-circular log with a sync on its last page. */ if (firstPage == lastPage && !metadata.pos) setWritePage(firstVolumePage()); else setWritePage(firstPage + 1); s[client].wpos = metadata.pos + PAGE_SIZE; } else { s[client].wpage = firstPage; s[client].woffset = metadata.lastRecordOffset; s[client].wpos = metadata.pos + metadata.lastRecordOffset; } s[client].circled = (metadata.flags & F_CIRCLED) != 0; if (s[client].circled && !s[client].circular) // oops { endRequest(FAIL); return; } /* And we can now proceed to the real request */ s[client].positionKnown = TRUE; startRequest(); } void locateLastReadDone() { if (metadata.magic == PERSISTENT_MAGIC && metadata.flags & F_LASTVALID) crcPage(firstPage); else locateLastRecord(); } void locateLastRecord() { if (firstPage == lastPage) { /* We walked all the way back to the last page, and it's not valid. The log-volume invariant is not holding. Fail out. */ endRequest(FAIL); return; } if (firstPage == firstVolumePage()) firstPage = lastPage; else firstPage--; readMetadata(firstPage); } void located() { metaState = META_LOCATELAST; /* firstPage is one after last valid page, but the last page with a record end may be some pages earlier. Search for it. */ lastPage = lastVolumePage() - 1; locateLastRecord(); } at45page_t locateCurrentPage() { return firstPage + ((lastPage - firstPage) >> 1); } void locateBinarySearch() { if (lastPage <= firstPage) located(); else readMetadata(locateCurrentPage()); } void locateGreaterThan() { firstPage = locateCurrentPage() + 1; locateBinarySearch(); } void locateLessThan() { lastPage = locateCurrentPage(); locateBinarySearch(); } void locateCrcDone(uint16_t crc) { if (crc == metadata.crc) { s[client].wpos = metadata.pos; locateGreaterThan(); } else locateLessThan(); } void locateReadDone() { if (metadata.magic == PERSISTENT_MAGIC && s[client].wpos < metadata.pos) crcPage(locateCurrentPage()); else locateLessThan(); } void locateFirstCrcDone(uint16_t crc) { if (metadata.magic == PERSISTENT_MAGIC && crc == metadata.crc) s[client].wpos = metadata.pos; else s[client].wpos = 0; metaState = META_LOCATE; locateBinarySearch(); } void locateFirstReadDone() { crcPage(lastPage); } /* Locate log beginning and ending. See description at top of file. */ void locateStart() { metaState = META_LOCATEFIRST; firstPage = firstVolumePage(); lastPage = lastVolumePage() - 1; readMetadata(lastPage); } /* ------------------------------------------------------------------ */ /* Append */ /* ------------------------------------------------------------------ */ void appendContinue() { uint8_t *buf = s[client].buf + pos; at45pageoffset_t offset = s[client].woffset, count; storage_len_t len = s[client].len - pos; if (len == 0) { endRequest(SUCCESS); return; } if (s[client].wpage == lastVolumePage()) { /* We reached the end of a linear log */ endRequest(ESIZE); return; } if (offset + len <= PAGE_SIZE) count = len; else count = PAGE_SIZE - offset; s[client].wpos += count; s[client].woffset += count; pos += count; /* We normally lose data at the point we make the first write to a page in a log that has circled. */ if (offset == 0 && s[client].circled) recordsLost = TRUE; call At45db.write(s[client].wpage, offset, buf, count); } void appendWriteDone() { if (s[client].woffset == PAGE_SIZE) /* Time to write metadata */ wmetadataStart(); else endRequest(SUCCESS); } void appendMetadataDone() { // metadata of previous page flushed /* Setup metadata in case we overflow this page too */ metadata.flags = 0; appendContinue(); } void appendSyncDone() { s[client].wpos = metadata.pos + PAGE_SIZE; appendStart(); } void appendStart() { storage_len_t len = s[client].len - pos; storage_len_t vlen = (storage_len_t)npages() * PAGE_SIZE; recordsLost = FALSE; /* If request would span the end of the flash, sync, to maintain the invariant that the last flash page is synced and that either the first or last pages are valid. Note that >= in the if below means we won't write a record that would end on the last byte of the last page, as this would mean that we would not sync the last page, breaking the log volume invariant */ if ((s[client].wpos - PAGE_SIZE) % vlen >= vlen - len) sync(); else { /* Set lastRecordOffset in case we need to write metadata (see wmetadataStart) */ metadata.lastRecordOffset = s[client].woffset; metadata.flags = F_LASTVALID; appendContinue(); } } /* ------------------------------------------------------------------ */ /* Sync */ /* ------------------------------------------------------------------ */ void syncStart() { if (s[client].woffset == 0) /* we can't lose any writes */ endRequest(SUCCESS); else sync(); } void syncMetadataDone() { /* Write position reflect the absolute position in the flash, not user-bytes written. So update wpos to reflect sync effects. */ s[client].wpos = metadata.pos + PAGE_SIZE; endRequest(SUCCESS); } /* ------------------------------------------------------------------ */ /* Write block metadata */ /* ------------------------------------------------------------------ */ void wmetadataStart() { /* The caller ensures that metadata.flags (except F_CIRCLED) and metadata.lastRecordOffset are set correctly. */ metaState = META_WRITE; firstPage = s[client].wpage; // remember page to commit metadata.pos = s[client].wpos - s[client].woffset; metadata.magic = PERSISTENT_MAGIC; if (s[client].circled) metadata.flags |= F_CIRCLED; call At45db.computeCrc(firstPage, 0, PAGE_SIZE, 0); /* We move to the next page now. If writing the metadata fails, we'll simply leave the invalid page in place. Trying to recover seems complicated, and of little benefit (note that in practice, At45dbC shuts down after a failed write, so nothing is really going to happen after that anyway). */ setWritePage(s[client].wpage + 1); /* Invalidate read pointer if we reach it's page */ if (s[client].wpage == s[client].rpage) invalidateReadPointer(); } void wmetadataCrcDone(uint16_t crc) { uint8_t i, *md; // Include metadata in crc md = (uint8_t *)&metadata; for (i = 0; i < offsetof(nx_struct pageinfo, crc); i++) crc = crcByte(crc, md[i]); metadata.crc = crc; // And save it writeMetadata(firstPage); } void wmetadataWriteDone() { metaState = META_IDLE; if (metadata.flags & F_SYNC) call At45db.sync(firstPage); else call At45db.flush(firstPage); } /* ------------------------------------------------------------------ */ /* Read */ /* ------------------------------------------------------------------ */ void readContinue() { uint8_t *buf = s[client].buf + pos; at45pageoffset_t offset = s[client].roffset, count; at45pageoffset_t end = s[client].rend; storage_len_t len = s[client].len - pos; if (len == 0) { endRequest(SUCCESS); return; } if (!s[client].rvalid) { if (s[client].circled) /* Find a valid page after wpage, skipping invalid pages */ s[client].rpage = s[client].wpage; else { /* resume reading at the beginning of the first page */ s[client].rvalid = TRUE; s[client].rpage = lastVolumePage() - 1; } rmetadataStart(); return; } if (s[client].rpage == s[client].wpage) end = s[client].woffset; if (offset == end) { if ((s[client].rpage + 1 == lastVolumePage() && !s[client].circular) || s[client].rpage == s[client].wpage) endRequest(SUCCESS); // end of log else rmetadataStart(); return; } if (offset + len <= end) count = len; else count = end - offset; pos += count; s[client].rpos += count; s[client].roffset = offset + count; call At45db.read(s[client].rpage, offset, buf, count); } void readStart() { readContinue(); } /* ------------------------------------------------------------------ */ /* Read block metadata */ /* ------------------------------------------------------------------ */ void continueReadAt(at45pageoffset_t roffset) { /* Resume reading at firstPage whose metadata is currently available in the metadata variable */ metaState = META_IDLE; s[client].rpos = metadata.pos + roffset; s[client].rpage = firstPage; s[client].roffset = roffset; s[client].rend = metadata.flags & F_SYNC ? metadata.lastRecordOffset : PAGE_SIZE; s[client].rvalid = TRUE; readContinue(); } void rmetadataContinue() { if (++firstPage == lastVolumePage()) firstPage = firstVolumePage(); if (firstPage == s[client].wpage) if (!s[client].rvalid) /* We cannot find a record boundary to start at (we've just walked through the whole log...). Give up. */ endRequest(SUCCESS); else { /* The current write page has no metadata yet, so we fake it */ metadata.flags = 0; metadata.pos = s[client].wpos - s[client].woffset; continueReadAt(0); } else readMetadata(firstPage); } void rmetadataReadDone() { if (metadata.magic == PERSISTENT_MAGIC) crcPage(firstPage); else endRequest(SUCCESS); } void rmetadataCrcDone(uint16_t crc) { if (!s[client].rvalid) if (crc == metadata.crc && metadata.flags & F_LASTVALID) continueReadAt(metadata.lastRecordOffset); else rmetadataContinue(); else if (crc == metadata.crc) continueReadAt(0); else endRequest(SUCCESS); } void rmetadataStart() { metaState = META_READ; firstPage = s[client].rpage; rmetadataContinue(); } /* ------------------------------------------------------------------ */ /* Seek. */ /* ------------------------------------------------------------------ */ void seekCrcDone(uint16_t crc) { if (metadata.magic == PERSISTENT_MAGIC && crc == metadata.crc && metadata.pos == s[client].rpos - s[client].roffset) { s[client].rvalid = TRUE; if (metadata.flags & F_SYNC) s[client].rend = metadata.lastRecordOffset; } endRequest(SUCCESS); } void seekReadDone() { crcPage(s[client].rpage); } /* Move to position specified by cookie. */ void seekStart() { uint32_t offset = (uint32_t)(uint16_t)s[client].buf << 16 | s[client].len; invalidateReadPointer(); // default to beginning of log /* The write positions are offset by PAGE_SIZE (see emptyLog) */ if (offset == SEEK_BEGINNING) offset = PAGE_SIZE; if (offset > s[client].wpos || offset < PAGE_SIZE) { endRequest(EINVAL); return; } /* Cookies are just flash positions which continue incrementing as you circle around and around. So we can just check the requested page's metadata.pos field matches the cookie's value */ s[client].rpos = offset; s[client].roffset = (offset - PAGE_SIZE) % PAGE_SIZE; s[client].rpage = firstVolumePage() + ((offset - PAGE_SIZE) / PAGE_SIZE) % npages(); s[client].rend = PAGE_SIZE; // default to no sync flag // The last page's metadata isn't written to flash yet. Special case it. if (s[client].rpage == s[client].wpage) { /* If we're seeking within the current write page, just go there. Otherwise, we're asking for an old version of the current page so just keep the invalidated read pointer, i.e., read from the beginning. */ if (offset >= s[client].wpos - s[client].woffset) s[client].rvalid = TRUE; endRequest(SUCCESS); } else { metaState = META_SEEK; readMetadata(s[client].rpage); } } /* ------------------------------------------------------------------ */ /* Dispatch HAL operations to current user op */ /* ------------------------------------------------------------------ */ event void At45db.eraseDone(error_t error) { if (client != NO_CLIENT) if (error != SUCCESS) endRequest(FAIL); else eraseEraseDone(); } event void At45db.writeDone(error_t error) { if (client != NO_CLIENT) if (error != SUCCESS) endRequest(FAIL); else switch (metaState) { case META_WRITE: wmetadataWriteDone(); break; case META_IDLE: appendWriteDone(); break; } } event void At45db.syncDone(error_t error) { if (client != NO_CLIENT) if (error != SUCCESS) endRequest(FAIL); else switch (s[client].request) { case R_ERASE: eraseMetadataDone(); break; case R_APPEND: appendSyncDone(); break; case R_SYNC: syncMetadataDone(); break; } } event void At45db.flushDone(error_t error) { if (client != NO_CLIENT) if (error != SUCCESS) endRequest(FAIL); else appendMetadataDone(); } event void At45db.readDone(error_t error) { if (client != NO_CLIENT) if (error != SUCCESS) endRequest(FAIL); else switch (metaState) { case META_LOCATEFIRST: locateFirstReadDone(); break; case META_LOCATE: locateReadDone(); break; case META_LOCATELAST: locateLastReadDone(); break; case META_SEEK: seekReadDone(); break; case META_READ: rmetadataReadDone(); break; case META_IDLE: readContinue(); break; } } event void At45db.computeCrcDone(error_t error, uint16_t crc) { if (client != NO_CLIENT) if (error != SUCCESS) endRequest(FAIL); else switch (metaState) { case META_LOCATEFIRST: locateFirstCrcDone(crc); break; case META_LOCATE: locateCrcDone(crc); break; case META_LOCATELAST: locateLastCrcDone(crc); break; case META_SEEK: seekCrcDone(crc); break; case META_WRITE: wmetadataCrcDone(crc); break; case META_READ: rmetadataCrcDone(crc); break; } } event void At45db.copyPageDone(error_t error) { } default event void LogWrite.appendDone[uint8_t logId](void* buf, storage_len_t l, bool rLost, error_t error) { } default event void LogWrite.eraseDone[uint8_t logId](error_t error) { } default event void LogWrite.syncDone[uint8_t logId](error_t error) { } default event void LogRead.readDone[uint8_t logId](void* buf, storage_len_t l, error_t error) { } default event void LogRead.seekDone[uint8_t logId](error_t error) {} default command at45page_t At45dbVolume.remap[uint8_t logId](at45page_t volumePage) {return 0;} default command at45page_t At45dbVolume.volumeSize[uint8_t logId]() {return 0;} default async command error_t Resource.request[uint8_t logId]() {return SUCCESS;} default async command error_t Resource.release[uint8_t logId]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/at45db/Storage_chip.h000066400000000000000000000004411207233610700215360ustar00rootroot00000000000000// $Id: Storage_chip.h,v 1.4 2006-12-12 18:23:02 vlahan Exp $ #ifndef STORAGE_CHIP_H #define STORAGE_CHIP_H #include "At45db.h" #define UQ_BLOCK_STORAGE "BlockStorageP.BlockRead" #define UQ_LOG_STORAGE "LogStorageP.LogRead" #define UQ_CONFIG_STORAGE "ConfigStorageP.ConfigRead" #endif tinyos-2.1.2+dfsg/tos/chips/at45db/WireBlockStorageP.nc000066400000000000000000000011551207233610700226310ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Private component of the AT45DB implementation of the block storage * abstraction. * * @author: David Gay */ configuration WireBlockStorageP { } implementation { components BlockStorageP, At45dbC; BlockStorageP.At45db -> At45dbC; } tinyos-2.1.2+dfsg/tos/chips/at45db/WireConfigStorageP.nc000066400000000000000000000014061207233610700230030ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Private component of the AT45DB implementation of the config storage * abstraction. * * @author: David Gay */ configuration WireConfigStorageP { } implementation { components ConfigStorageP, BlockStorageP, At45dbC; ConfigStorageP.At45db -> At45dbC; ConfigStorageP.BlockRead -> BlockStorageP; ConfigStorageP.BlockWrite -> BlockStorageP; ConfigStorageP.BConfig <- BlockStorageP; } tinyos-2.1.2+dfsg/tos/chips/at45db/WireLogStorageP.nc000066400000000000000000000011451207233610700223170ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Private component of the AT45DB implementation of the log storage * abstraction. * * @author: David Gay */ configuration WireLogStorageP { } implementation { components LogStorageP, At45dbC; LogStorageP.At45db -> At45dbC; } tinyos-2.1.2+dfsg/tos/chips/atm128/000077500000000000000000000000001207233610700167105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128/Atm128Clock.h000066400000000000000000000057051207233610700210200ustar00rootroot00000000000000// $Id: Atm128Clock.h,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // @author Martin Turon #ifndef _H_ATM128CLOCK_H #define _H_ATM128CLOCK_H //====================== Oscillators ================================== /* Timer Clock Select -- set via Fuses only through ISP */ enum { ATM128_CKSEL_EXT_CLK = 0, //!< External clock source ATM128_CKSEL_INT_1MHZ = 1, //!< Internal RC oscillator ATM128_CKSEL_INT_2MHZ, ATM128_CKSEL_INT_4MHZ, ATM128_CKSEL_INT_8MHZ, ATM128_CKSEL_EXT_RC_1MHZ = 5, //!< External RC oscillator ATM128_CKSEL_EXT_RC_3MHZ, ATM128_CKSEL_EXT_RC_8MHZ, ATM128_CKSEL_EXT_RC_12MHZ, ATM128_CKSEL_EXT_CRYSTAL = 9, //!< External low freq crystal ATM128_CKSEL_EXT_RES_1MHZ = 10, //!< External resonator ATM128_CKSEL_EXT_RES_3MHZ, ATM128_CKSEL_EXT_RES_8MHZ }; /* * Calibration Register for Internal Oscillator * * OSCCAL Min Freq Max Freq * 0x00 50% 100% * 0x7F 75% 150% * 0xFF 100% 200% */ typedef uint8_t Atm128_OSCCAL_t; //!< Internal Oscillator Calibration Register /* 8-bit Clock Divider Register */ typedef struct { uint8_t xdiven : 1; //!< Enable clock divider uint8_t xdiv : 7; //!< fCLK = Source Clock / 129 - xdiv } Atm128ClockDivider_t; typedef Atm128ClockDivider_t Atm128_XTAL_t; //!< Asynchronous Clock Divider #endif //_H_ATM128CLOCK_H tinyos-2.1.2+dfsg/tos/chips/atm128/Atm128I2C.h000066400000000000000000000062731207233610700203430ustar00rootroot00000000000000// $Id: Atm128I2C.h,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // @author Martin Turon #ifndef _H_Atm128I2C_h #define _H_Atm128I2C_h //====================== I2C Bus ================================== /* SCL freq = CPU freq / (16 + 2(TWBR) * pow(4, TWPR)) */ enum { ATM128_I2C_RATE_DIVIDE_16 = 0, ATM128_I2C_RATE_DIVIDE_24 = 1, ATM128_I2C_RATE_DIVIDE_80 = 2, } typedef uint8_t Atm128_TWBR_t; //!< Two Wire Bit Rate Register /* I2C Control Register */ typedef struct { uint8_t twie : 1; //!< Two Wire Interrupt Enable uint8_t rsvd : 1; //!< Reserved uint8_t twen : 1; //!< Two Wire Enable Bit uint8_t twwc : 1; //!< Two Wire Write Collision Flag uint8_t twsto : 1; //!< Two Wire Stop Condition Bit uint8_t twsta : 1; //!< Two Wire Start Condition Bit uint8_t twea : 1; //!< Two Wire Enable Acknowledge Bit uint8_t twint : 1; //!< Two Wire Interrupt Flag } Atm128I2CControl_t; typedef Atm128I2CControl_t Atm128_TWCR_t; //!< Two Wire Control Register /* SCL freq = CPU freq / (16 + 2(TWBR) * pow(4, TWPR)) */ enum { ATM128_I2C_PRESCALE_1 = 0, ATM128_I2C_PRESCALE_4 = 1, ATM128_I2C_PRESCALE_16 = 2, ATM128_I2C_PRESCALE_64 = 3, }; enum { ATM128_I2C_STATUS_START = 1, }; /* I2C Status Register */ typedef struct { uint8_t twps : 2; //!< Two Wire Prescaler Bits uint8_t rsvd : 1; //!< Reserved uint8_t tws : 5; //!< Two Wire Status } Atm128I2CStatus_t; typedef Atm128I2CStatus_t Atm128_TWCR_t; //!< Two Wire Status Register typedef uint8_t Atm128_TWDR_t; //!< Two Wire Data Register typedef uint8_t Atm128_TWAR_t; //!< Two Wire Slave Address Register #endif //_H_Atm128I2C_h tinyos-2.1.2+dfsg/tos/chips/atm128/Atm128Power.h000066400000000000000000000043151207233610700210550ustar00rootroot00000000000000// $Id: Atm128Power.h,v 1.7 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // @author Martin Turon #ifndef _H_Atm128Power_h #define _H_Atm128Power_h //================== ATmega128 Power Management ========================== /* MCU Control Register */ typedef struct { uint8_t ivce : 1; //!< Interrupt Vector Change Enable uint8_t ivsel : 1; //!< Interrupt Vector Select uint8_t stdby : 1; //!< Standby Enable (sm2) uint8_t sm : 2; //!< Sleep Mode uint8_t se : 1; //!< Sleep Enable uint8_t srw10 : 1; //!< SRAM wait state enable uint8_t srw : 1; //!< External SRAM enable } Atm128_MCUCR_t; #endif //_H_Atm128Power_h tinyos-2.1.2+dfsg/tos/chips/atm128/Atm128Uart.h000066400000000000000000000124641207233610700207000ustar00rootroot00000000000000// $Id: Atm128Uart.h,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // @author Martin Turon #ifndef _H_Atm128Uart_h #define _H_Atm128Uart_h //====================== UART Bus ================================== typedef uint8_t Atm128_UDR0_t; //!< USART0 I/O Data Register typedef uint8_t Atm128_UDR1_t; //!< USART1 I/O Data Register /* UART Status Register */ typedef union { struct Atm128_UCSRA_t { uint8_t mpcm : 1; //!< UART Multiprocessor Communication Mode uint8_t u2x : 1; //!< UART Double Transmission Speed uint8_t upe : 1; //!< UART Parity Error uint8_t dor : 1; //!< UART Data Overrun uint8_t fe : 1; //!< UART Frame Error uint8_t udre : 1; //!< USART Data Register Empty uint8_t txc : 1; //!< USART Transfer Complete uint8_t rxc : 1; //!< USART Receive Complete } bits; uint8_t flat; } Atm128UartStatus_t; typedef Atm128UartStatus_t Atm128_UCSR0A_t; //!< UART 0 Status Register typedef Atm128UartStatus_t Atm128_UCSR1A_t; //!< UART 1 Status Register /* UART Control Register */ typedef union { struct Atm128_UCSRB_t { uint8_t txb8 : 1; //!< UART Transmit Data Bit 8 uint8_t rxb8 : 1; //!< UART Receive Data Bit 8 uint8_t ucsz2 : 1; //!< UART Character Size (Bit 2) uint8_t txen : 1; //!< UART Transmitter Enable uint8_t rxen : 1; //!< UART Receiver Enable uint8_t udrie : 1; //!< USART Data Register Enable uint8_t txcie : 1; //!< UART TX Complete Interrupt Enable uint8_t rxcie : 1; //!< UART RX Complete Interrupt Enable } bits; uint8_t flat; } Atm128UartControl_t; typedef Atm128UartControl_t Atm128_UCSR0B_t; //!< UART 0 Control Register typedef Atm128UartControl_t Atm128_UCSR1B_t; //!< UART 1 Control Register enum { ATM128_UART_DATA_SIZE_5_BITS = 0, ATM128_UART_DATA_SIZE_6_BITS = 1, ATM128_UART_DATA_SIZE_7_BITS = 2, ATM128_UART_DATA_SIZE_8_BITS = 3, }; /* UART Control Register */ typedef union { uint8_t flat; struct Atm128_UCSRC_t { uint8_t ucpol : 1; //!< UART Clock Polarity uint8_t ucsz : 2; //!< UART Character Size (Bits 0 and 1) uint8_t usbs : 1; //!< UART Stop Bit Select uint8_t upm : 2; //!< UART Parity Mode uint8_t umsel : 1; //!< USART Mode Select uint8_t rsvd : 1; //!< Reserved } bits; } Atm128UartMode_t; typedef Atm128UartMode_t Atm128_UCSR0C_t; //!< UART 0 Mode Register typedef Atm128UartMode_t Atm128_UCSR1C_t; //!< UART 1 Mode Register /* * ATmega1128 UART baud register settings: * ATM128__BAUD_ */ enum { ATM128_19200_BAUD_4MHZ = 12, ATM128_38400_BAUD_4MHZ = 6, ATM128_57600_BAUD_4MHZ = 3, ATM128_19200_BAUD_4MHZ_2X = 25, ATM128_38400_BAUD_4MHZ_2X = 12, ATM128_57600_BAUD_4MHZ_2X = 8, ATM128_19200_BAUD_7MHZ = 23, ATM128_38400_BAUD_7MHZ = 11, ATM128_57600_BAUD_7MHZ = 7, ATM128_19200_BAUD_7MHZ_2X = 47, ATM128_38400_BAUD_7MHZ_2X = 23, ATM128_57600_BAUD_7MHZ_2X = 15, ATM128_19200_BAUD_8MHZ = 25, ATM128_38400_BAUD_8MHZ = 12, ATM128_57600_BAUD_8MHZ = 8, ATM128_19200_BAUD_8MHZ_2X = 51, ATM128_38400_BAUD_8MHZ_2X = 34, ATM128_57600_BAUD_8MHZ_2X = 11, }; typedef uint8_t Atm128_UBRR0L_t; //!< UART 0 Baud Register (Low) typedef uint8_t Atm128_UBRR0H_t; //!< UART 0 Baud Register (High) typedef uint8_t Atm128_UBRR1L_t; //!< UART 1 Baud Register (Low) typedef uint8_t Atm128_UBRR1H_t; //!< UART 1 Baud Register (High) typedef uint8_t uart_parity_t; typedef uint8_t uart_speed_t; typedef uint8_t uart_duplex_t; enum { TOS_UART_PARITY_NONE = 0, TOS_UART_PARITY_EVEN = 1, TOS_UART_PARITY_ODD = 2, }; enum { TOS_UART_19200 = 0, TOS_UART_38400 = 1, TOS_UART_57600 = 2, }; enum { TOS_UART_OFF = 0, TOS_UART_RONLY = 1, TOS_UART_TONLY = 2, TOS_UART_DUPLEX = 3, }; #endif //_H_Atm128UART_h tinyos-2.1.2+dfsg/tos/chips/atm128/Atm128Uart0C.nc000066400000000000000000000044171207233610700212330ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Alec Woo * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:02 $ */ configuration Atm128Uart0C { provides interface StdControl; provides interface UartByte; provides interface UartStream; uses interface Counter; } implementation{ components new Atm128UartP() as UartP; StdControl = UartP; UartByte = UartP; UartStream = UartP; UartP.Counter = Counter; components HplAtm128UartC as HplUartC; UartP.HplUartTxControl -> HplUartC.Uart0TxControl; UartP.HplUartRxControl -> HplUartC.Uart0RxControl; UartP.HplUart -> HplUartC.HplUart0; components MainC; MainC.SoftwareInit -> UartP; } tinyos-2.1.2+dfsg/tos/chips/atm128/Atm128Uart1C.nc000066400000000000000000000044171207233610700212340ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Alec Woo * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2010-06-16 21:45:58 $ */ configuration Atm128Uart1C { provides interface StdControl; provides interface UartByte; provides interface UartStream; uses interface Counter; } implementation{ components new Atm128UartP() as UartP; StdControl = UartP; UartByte = UartP; UartStream = UartP; UartP.Counter = Counter; components HplAtm128UartC as HplUartC; UartP.HplUartTxControl -> HplUartC.Uart1TxControl; UartP.HplUartRxControl -> HplUartC.Uart1RxControl; UartP.HplUart -> HplUartC.HplUart1; components MainC; MainC.SoftwareInit -> UartP; } tinyos-2.1.2+dfsg/tos/chips/atm128/Atm128UartP.nc000066400000000000000000000141061207233610700211640ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Alec Woo * @author Jonathan Hui * @author Philip Levis (maintainer) * @version $Revision: 1.7 $ $Date: 2008-06-23 20:25:15 $ * * Modification @ 11/27 (pal): Folded in Alec's reimplementation * from the -devel branch. Fixed bug in RX interrupts, where * they were not enabled on start. Possibly due to alternative * ARC TEP113 implementation that uses UartStream? */ #include generic module Atm128UartP() @safe() { provides interface Init; provides interface StdControl; provides interface UartByte; provides interface UartStream; uses interface StdControl as HplUartTxControl; uses interface StdControl as HplUartRxControl; uses interface HplAtm128Uart as HplUart; uses interface Counter; } implementation{ norace uint16_t m_tx_len, m_rx_len; norace uint8_t *COUNT_NOK(m_tx_len) m_tx_buf, * COUNT_NOK(m_rx_len) m_rx_buf; norace uint16_t m_tx_pos, m_rx_pos; norace uint16_t m_byte_time; norace uint8_t m_rx_intr; norace uint8_t m_tx_intr; command error_t Init.init() { if (PLATFORM_BAUDRATE == 19200UL) m_byte_time = 200; // 1 TMicor ~= 2.12 us, one byte = 417us ~= 200 else if (PLATFORM_BAUDRATE == 57600UL) m_byte_time = 68; // 1 TMicor ~= 2.12 us, one byte = 138us ~= 65 return SUCCESS; } command error_t StdControl.start(){ /* make sure interupts are off and set flags */ call HplUart.disableTxIntr(); call HplUart.disableRxIntr(); m_rx_intr = 0; m_tx_intr = 0; /* enable tx/rx */ call HplUartTxControl.start(); call HplUartRxControl.start(); // Bug fix: pal 11/26/07: RX interrupts should be enabled on start call HplUart.enableRxIntr(); return SUCCESS; } command error_t StdControl.stop(){ call HplUartTxControl.stop(); call HplUartRxControl.stop(); return SUCCESS; } async command error_t UartStream.enableReceiveInterrupt(){ atomic{ m_rx_intr = 3; call HplUart.enableRxIntr(); } return SUCCESS; } async command error_t UartStream.disableReceiveInterrupt(){ atomic{ call HplUart.disableRxIntr(); m_rx_intr = 0; } return SUCCESS; } async command error_t UartStream.receive( uint8_t* buf, uint16_t len ){ if ( len == 0 ) return FAIL; atomic { if ( m_rx_buf ) return EBUSY; m_rx_buf = buf; m_rx_len = len; m_rx_pos = 0; m_rx_intr |= 1; call HplUart.enableRxIntr(); } return SUCCESS; } async event void HplUart.rxDone( uint8_t data ) { if ( m_rx_buf ) { m_rx_buf[ m_rx_pos++ ] = data; if ( m_rx_pos >= m_rx_len ) { uint8_t* buf = m_rx_buf; atomic{ m_rx_buf = NULL; if(m_rx_intr != 3){ call HplUart.disableRxIntr(); m_rx_intr = 0; } } signal UartStream.receiveDone( buf, m_rx_len, SUCCESS ); } } else { signal UartStream.receivedByte( data ); } } async command error_t UartStream.send( uint8_t *buf, uint16_t len){ if ( len == 0 ) return FAIL; else if ( m_tx_buf ) return EBUSY; m_tx_len = len; m_tx_buf = buf; m_tx_pos = 0; m_tx_intr = 1; call HplUart.enableTxIntr(); call HplUart.tx( buf[ m_tx_pos++ ] ); return SUCCESS; } async event void HplUart.txDone() { if ( m_tx_pos < m_tx_len ) { call HplUart.tx( m_tx_buf[ m_tx_pos++ ] ); } else { uint8_t* buf = m_tx_buf; m_tx_buf = NULL; m_tx_intr = 0; call HplUart.disableTxIntr(); signal UartStream.sendDone( buf, m_tx_len, SUCCESS ); } } async command error_t UartByte.send( uint8_t byte ){ if(m_tx_intr) return FAIL; call HplUart.tx( byte ); while ( !call HplUart.isTxEmpty() ); return SUCCESS; } async command error_t UartByte.receive( uint8_t * byte, uint8_t timeout){ uint16_t timeout_micro = m_byte_time * timeout + 1; uint16_t start; if(m_rx_intr) return FAIL; start = call Counter.get(); while ( call HplUart.isRxEmpty() ) { if ( ( (uint16_t)call Counter.get() - start ) >= timeout_micro ) return FAIL; } *byte = call HplUart.rx(); return SUCCESS; } async event void Counter.overflow() {} default async event void UartStream.sendDone( uint8_t* buf, uint16_t len, error_t error ){} default async event void UartStream.receivedByte( uint8_t byte ){} default async event void UartStream.receiveDone( uint8_t* buf, uint16_t len, error_t error ){} } tinyos-2.1.2+dfsg/tos/chips/atm128/HplAtm128Uart.nc000066400000000000000000000041431207233610700215100ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Alec Woo * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:03 $ */ interface HplAtm128Uart { async command error_t enableTxIntr(); async command error_t disableTxIntr(); async command error_t enableRxIntr(); async command error_t disableRxIntr(); async command bool isTxEmpty(); async command bool isRxEmpty(); async command void tx( uint8_t data ); async event void txDone(); async command uint8_t rx(); async event void rxDone( uint8_t data ); } tinyos-2.1.2+dfsg/tos/chips/atm128/HplAtm128UartC.nc000066400000000000000000000052071207233610700216150ustar00rootroot00000000000000/// $Id: HplAtm128UartC.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /// #include /** * HPL for the Atmega 128 serial ports. * * @author Martin Turon * @author David Gay */ configuration HplAtm128UartC { provides { interface StdControl as Uart0TxControl; interface StdControl as Uart0RxControl; interface HplAtm128Uart as HplUart0; interface StdControl as Uart1TxControl; interface StdControl as Uart1RxControl; interface HplAtm128Uart as HplUart1; } } implementation { components HplAtm128UartP, PlatformC, McuSleepC; Uart0TxControl = HplAtm128UartP.Uart0TxControl; Uart0RxControl = HplAtm128UartP.Uart0RxControl; HplUart0 = HplAtm128UartP.HplUart0; Uart1TxControl = HplAtm128UartP.Uart1TxControl; Uart1RxControl = HplAtm128UartP.Uart1RxControl; HplUart1 = HplAtm128UartP.HplUart1; HplAtm128UartP.Atm128Calibrate -> PlatformC; HplAtm128UartP.McuPowerState -> McuSleepC; components MainC; MainC.SoftwareInit -> HplAtm128UartP.Uart0Init; MainC.SoftwareInit -> HplAtm128UartP.Uart1Init; } tinyos-2.1.2+dfsg/tos/chips/atm128/HplAtm128UartP.nc000066400000000000000000000203471207233610700216340ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Alec Woo * @author Jonathan Hui * @version $Revision: 1.7 $ $Date: 2010-06-29 22:07:43 $ */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Private component of the Atmega128 serial port HPL. * * @author Martin Turon * @author David Gay */ #include module HplAtm128UartP { provides interface Init as Uart0Init; provides interface StdControl as Uart0TxControl; provides interface StdControl as Uart0RxControl; provides interface HplAtm128Uart as HplUart0; provides interface Init as Uart1Init; provides interface StdControl as Uart1TxControl; provides interface StdControl as Uart1RxControl; provides interface HplAtm128Uart as HplUart1; uses interface Atm128Calibrate; uses interface McuPowerState; } implementation { //=== Uart Init Commands. ==================================== command error_t Uart0Init.init() { Atm128UartMode_t mode; Atm128UartStatus_t stts; Atm128UartControl_t ctrl; uint16_t ubrr0; ctrl.bits = (struct Atm128_UCSRB_t) {rxcie:0, txcie:0, rxen:0, txen:0}; stts.bits = (struct Atm128_UCSRA_t) {u2x:1}; mode.bits = (struct Atm128_UCSRC_t) {ucsz:ATM128_UART_DATA_SIZE_8_BITS}; ubrr0 = call Atm128Calibrate.baudrateRegister(PLATFORM_BAUDRATE); UBRR0L = ubrr0; UBRR0H = ubrr0 >> 8; UCSR0A = stts.flat; UCSR0C = mode.flat; UCSR0B = ctrl.flat; return SUCCESS; } command error_t Uart0TxControl.start() { SET_BIT(UCSR0B, TXEN); call McuPowerState.update(); return SUCCESS; } command error_t Uart0TxControl.stop() { CLR_BIT(UCSR0B, TXEN); call McuPowerState.update(); return SUCCESS; } command error_t Uart0RxControl.start() { SET_BIT(UCSR0B, RXEN); call McuPowerState.update(); return SUCCESS; } command error_t Uart0RxControl.stop() { CLR_BIT(UCSR0B, RXEN); call McuPowerState.update(); return SUCCESS; } async command error_t HplUart0.enableTxIntr() { SET_BIT(UCSR0A, TXC); SET_BIT(UCSR0B, TXCIE); return SUCCESS; } async command error_t HplUart0.disableTxIntr(){ CLR_BIT(UCSR0B, TXCIE); return SUCCESS; } async command error_t HplUart0.enableRxIntr(){ SET_BIT(UCSR0B, RXCIE); return SUCCESS; } async command error_t HplUart0.disableRxIntr(){ CLR_BIT(UCSR0B, RXCIE); return SUCCESS; } async command bool HplUart0.isTxEmpty(){ return READ_BIT(UCSR0A, TXC); } async command bool HplUart0.isRxEmpty(){ return !READ_BIT(UCSR0A, RXC); } async command uint8_t HplUart0.rx(){ return UDR0; } async command void HplUart0.tx(uint8_t data) { atomic{ UDR0 = data; SET_BIT(UCSR0A, TXC); } } AVR_ATOMIC_HANDLER(SIG_UART0_RECV) { if (READ_BIT(UCSR0A, RXC)) { signal HplUart0.rxDone(UDR0); } } AVR_NONATOMIC_HANDLER(SIG_UART0_TRANS) { signal HplUart0.txDone(); } command error_t Uart1Init.init() { Atm128UartMode_t mode; Atm128UartStatus_t stts; Atm128UartControl_t ctrl; uint16_t ubrr1; ctrl.bits = (struct Atm128_UCSRB_t) {rxcie:0, txcie:0, rxen:0, txen:0}; stts.bits = (struct Atm128_UCSRA_t) {u2x:1}; mode.bits = (struct Atm128_UCSRC_t) {ucsz:ATM128_UART_DATA_SIZE_8_BITS}; ubrr1 = call Atm128Calibrate.baudrateRegister(PLATFORM_BAUDRATE); UBRR1L = ubrr1; UBRR1H = ubrr1 >> 8; UCSR1A = stts.flat; UCSR1C = mode.flat; UCSR1B = ctrl.flat; return SUCCESS; } command error_t Uart1TxControl.start() { SET_BIT(UCSR1B, TXEN); call McuPowerState.update(); return SUCCESS; } command error_t Uart1TxControl.stop() { CLR_BIT(UCSR1B, TXEN); call McuPowerState.update(); return SUCCESS; } command error_t Uart1RxControl.start() { SET_BIT(UCSR1B, RXEN); call McuPowerState.update(); return SUCCESS; } command error_t Uart1RxControl.stop() { CLR_BIT(UCSR1B, RXEN); call McuPowerState.update(); return SUCCESS; } async command error_t HplUart1.enableTxIntr() { SET_BIT(UCSR1A, TXC); SET_BIT(UCSR1B, TXCIE); return SUCCESS; } async command error_t HplUart1.disableTxIntr(){ CLR_BIT(UCSR1B, TXCIE); return SUCCESS; } async command error_t HplUart1.enableRxIntr(){ SET_BIT(UCSR1B, RXCIE); return SUCCESS; } async command error_t HplUart1.disableRxIntr(){ CLR_BIT(UCSR1B, RXCIE); return SUCCESS; } async command bool HplUart1.isTxEmpty() { return READ_BIT(UCSR1A, TXC); } async command bool HplUart1.isRxEmpty() { return !READ_BIT(UCSR1A, RXC); } async command uint8_t HplUart1.rx(){ return UDR1; } async command void HplUart1.tx(uint8_t data) { atomic{ UDR1 = data; SET_BIT(UCSR1A, TXC); } } AVR_ATOMIC_HANDLER(SIG_UART1_RECV) { if (READ_BIT(UCSR1A, RXC)) signal HplUart1.rxDone(UDR1); } AVR_NONATOMIC_HANDLER(SIG_UART1_TRANS) { signal HplUart1.txDone(); } default async event void HplUart0.txDone() {} default async event void HplUart0.rxDone(uint8_t data) {} default async event void HplUart1.txDone() {} default async event void HplUart1.rxDone(uint8_t data) {} } tinyos-2.1.2+dfsg/tos/chips/atm128/McuSleepC.nc000066400000000000000000000103371207233610700210560ustar00rootroot00000000000000/// $Id: McuSleepC.nc,v 1.11 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of TEP 112 (Microcontroller Power Management) for * the Atmega128. Power state calculation code copied from Rob * Szewczyk's 1.x code in HPLPowerManagementM.nc. * *

     *  $Id: McuSleepC.nc,v 1.11 2010-06-29 22:07:43 scipio Exp $
     * 
    * * @author Philip Levis * @author Robert Szewczyk * @date October 26, 2005 */ module McuSleepC @safe() { provides { interface McuSleep; interface McuPowerState; } uses { interface McuPowerOverride; } } implementation { /* There is no dirty bit management because the sleep mode depends on the amount of time remaining in timer0. Note also that the sleep cost depends typically depends on waiting for ASSR to clear. */ /* Note that the power values are maintained in an order * based on their active components, NOT on their values. * Look at atm128hardware.h and page 42 of the ATmeg128 * manual (table 17).*/ const_uint8_t atm128PowerBits[ATM128_POWER_DOWN + 1] = { 0, /* idle */ (1 << SM0), /* adc */ (1 << SM2) | (1 << SM1) | (1 << SM0), /* ext standby */ (1 << SM1) | (1 << SM0), /* power save */ (1 << SM2) | (1 << SM1), /* standby */ (1 << SM1)}; /* power down */ mcu_power_t getPowerState() { // Note: we go to sleep even if timer 1, 2, or 3's overflow interrupt // is enabled - this allows using these timers as TinyOS "Alarm"s // while still having power management. // Are external timers running? if (TIMSK & ~(1 << OCIE0 | 1 << TOIE0 | 1 << TOIE1 | 1 << TOIE2) || ETIMSK & ~(1 << TOIE3)) { return ATM128_POWER_IDLE; } // SPI (Radio stack on mica/micaZ else if (bit_is_set(SPCR, SPE)) { return ATM128_POWER_IDLE; } // A UART is active else if ((UCSR0B | UCSR1B) & (1 << TXEN | 1 << RXEN)) { // UART return ATM128_POWER_IDLE; } // I2C (Two-wire) is active else if (bit_is_set(TWCR, TWEN)){ return ATM128_POWER_IDLE; } // ADC is enabled else if (bit_is_set(ADCSR, ADEN)) { return ATM128_POWER_ADC_NR; } else { return ATM128_POWER_DOWN; } } async command void McuSleep.sleep() { uint8_t powerState; powerState = mcombine(getPowerState(), call McuPowerOverride.lowestState()); MCUCR = (MCUCR & 0xe3) | 1 << SE | read_uint8_t(&atm128PowerBits[powerState]); sei(); // All of memory may change at this point... asm volatile ("sleep" : : : "memory"); cli(); CLR_BIT(MCUCR, SE); } async command void McuPowerState.update() { } default async command mcu_power_t McuPowerOverride.lowestState() { return ATM128_POWER_DOWN; } } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/000077500000000000000000000000001207233610700174375ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128/adc/Adc.h000066400000000000000000000011771207233610700203050ustar00rootroot00000000000000/* $Id: Adc.h,v 1.4 2006-12-12 18:23:03 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * @author David Gay */ #ifndef ADC_H #define ADC_H #include "Atm128Adc.h" /* Read and ReadNow share client ids */ #define UQ_ADC_READ "adc.read" #define UQ_ADC_READNOW UQ_ADC_READ #define UQ_ADC_READSTREAM "adc.readstream" #endif tinyos-2.1.2+dfsg/tos/chips/atm128/adc/AdcP.nc000066400000000000000000000106571207233610700206010ustar00rootroot00000000000000/* $Id: AdcP.nc,v 1.6 2008-06-26 04:39:03 regehr Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Convert ATmega128 HAL A/D interface to the HIL interfaces. * @author David Gay * @author Jan Hauer */ #include "Timer.h" module AdcP @safe() { provides { interface Read[uint8_t client]; interface ReadNow[uint8_t client]; } uses { interface Atm128AdcSingle; interface Atm128AdcConfig[uint8_t client]; } } implementation { enum { IDLE, ACQUIRE_DATA, ACQUIRE_DATA_NOW, }; /* Resource reservation is required, and it's incorrect to call getData again before dataReady is signaled, so there are no races in correct programs */ norace uint8_t state; norace uint8_t client; norace uint16_t val; uint8_t channel() { return call Atm128AdcConfig.getChannel[client](); } uint8_t refVoltage() { return call Atm128AdcConfig.getRefVoltage[client](); } uint8_t prescaler() { return call Atm128AdcConfig.getPrescaler[client](); } void sample() { call Atm128AdcSingle.getData(channel(), refVoltage(), FALSE, prescaler()); } error_t startGet(uint8_t newState, uint8_t newClient) { /* Note: we retry imprecise results in dataReady */ state = newState; client = newClient; sample(); return SUCCESS; } command error_t Read.read[uint8_t c]() { return startGet(ACQUIRE_DATA, c); } async command error_t ReadNow.read[uint8_t c]() { return startGet(ACQUIRE_DATA_NOW, c); } task void acquiredData() { state = IDLE; signal Read.readDone[client](SUCCESS, val); } async event void Atm128AdcSingle.dataReady(uint16_t data, bool precise) { switch (state) { case ACQUIRE_DATA: if (!precise) sample(); else { val = data; post acquiredData(); } break; case ACQUIRE_DATA_NOW: if (!precise) sample(); else { state = IDLE; signal ReadNow.readDone[client](SUCCESS, data); } break; default: break; } } /* Configuration defaults. Read ground fast! ;-) */ default async command uint8_t Atm128AdcConfig.getChannel[uint8_t c]() { return ATM128_ADC_SNGL_GND; } default async command uint8_t Atm128AdcConfig.getRefVoltage[uint8_t c]() { return ATM128_ADC_VREF_OFF; } default async command uint8_t Atm128AdcConfig.getPrescaler[uint8_t c]() { return ATM128_ADC_PRESCALE_2; } default event void Read.readDone[uint8_t c](error_t e, uint16_t d) { } default async event void ReadNow.readDone[uint8_t c](error_t e, uint16_t d) { } } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/AdcReadClientC.nc000066400000000000000000000022401207233610700225040ustar00rootroot00000000000000/* $Id: AdcReadClientC.nc,v 1.4 2006-12-12 18:23:03 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Provide, as per TEP101, arbitrated access via a Read interface to the * Atmega128 ADC. Users of this component must link it to an * implementation of Atm128AdcConfig which provides the ADC parameters * (channel, etc). * * @author David Gay */ #include "Adc.h" generic configuration AdcReadClientC() { provides interface Read; uses { interface Atm128AdcConfig; interface ResourceConfigure; } } implementation { components WireAdcP, Atm128AdcC; enum { ID = unique(UQ_ADC_READ), HAL_ID = unique(UQ_ATM128ADC_RESOURCE) }; Read = WireAdcP.Read[ID]; Atm128AdcConfig = WireAdcP.Atm128AdcConfig[ID]; WireAdcP.Resource[ID] -> Atm128AdcC.Resource[HAL_ID]; ResourceConfigure = Atm128AdcC.ResourceConfigure[HAL_ID]; } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/AdcReadNowClientC.nc000066400000000000000000000023151207233610700231730ustar00rootroot00000000000000/* $Id: AdcReadNowClientC.nc,v 1.4 2006-12-12 18:23:03 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Provide, as per TEP101, Resource-based access to the Atmega128 ADC via a * ReadNow interface. Users of this component must link it to an * implementation of Atm128AdcConfig which provides the ADC parameters * (channel, etc). * * @author David Gay */ #include "Adc.h" generic configuration AdcReadNowClientC() { provides { interface Resource; interface ReadNow; } uses { interface Atm128AdcConfig; interface ResourceConfigure; } } implementation { components WireAdcP, Atm128AdcC; enum { ID = unique(UQ_ADC_READNOW), HAL_ID = unique(UQ_ATM128ADC_RESOURCE) }; ReadNow = WireAdcP.ReadNow[ID]; Atm128AdcConfig = WireAdcP.Atm128AdcConfig[ID]; Resource = Atm128AdcC.Resource[HAL_ID]; ResourceConfigure = Atm128AdcC.ResourceConfigure[HAL_ID]; } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/AdcReadStreamClientC.nc000066400000000000000000000023421207233610700236630ustar00rootroot00000000000000/* $Id: AdcReadStreamClientC.nc,v 1.4 2006-12-12 18:23:03 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Provide, as per TEP101, arbitrated access via a ReadStream interface to * the Atmega128 ADC. Users of this component must link it to an * implementation of Atm128AdcConfig which provides the ADC parameters * (channel, etc). * * @author David Gay */ #include "Adc.h" generic configuration AdcReadStreamClientC() { provides interface ReadStream; uses { interface Atm128AdcConfig; interface ResourceConfigure; } } implementation { components WireAdcStreamP, Atm128AdcC; enum { ID = unique(UQ_ADC_READSTREAM), HAL_ID = unique(UQ_ATM128ADC_RESOURCE) }; ReadStream = WireAdcStreamP.ReadStream[ID]; Atm128AdcConfig = WireAdcStreamP.Atm128AdcConfig[ID]; WireAdcStreamP.Resource[ID] -> Atm128AdcC.Resource[HAL_ID]; ResourceConfigure = Atm128AdcC.ResourceConfigure[HAL_ID]; } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/AdcStreamP.nc000066400000000000000000000162251207233610700217520ustar00rootroot00000000000000/* $Id: AdcStreamP.nc,v 1.12 2008-06-23 23:38:28 idgay Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Convert ATmega128 HAL A/D interface to the HIL interfaces. * @author David Gay * @author Jan Hauer */ #include "Timer.h" module AdcStreamP @safe() { provides { interface Init @atleastonce(); interface ReadStream[uint8_t client]; } uses { interface Atm128AdcSingle; interface Atm128AdcConfig[uint8_t client]; interface Atm128Calibrate; interface Alarm; } } implementation { enum { NSTREAM = uniqueCount(UQ_ADC_READSTREAM) }; /* Resource reservation is required, and it's incorrect to call getData again before dataReady is signaled, so there are no races in correct programs */ norace uint8_t client = NSTREAM; /* Stream data */ struct list_entry_t { uint16_t count; struct list_entry_t * ONE_NOK next; }; struct list_entry_t *bufferQueue[NSTREAM]; struct list_entry_t * ONE_NOK * bufferQueueEnd[NSTREAM]; uint16_t * COUNT_NOK(lastCount) lastBuffer, lastCount; norace uint16_t count; norace uint16_t * COUNT_NOK(count) buffer; norace uint16_t * BND_NOK(buffer, buffer+count) pos; norace uint32_t now, period; command error_t Init.init() { uint8_t i; for (i = 0; i != NSTREAM; i++) bufferQueueEnd[i] = &bufferQueue[i]; return SUCCESS; } uint8_t channel() { return call Atm128AdcConfig.getChannel[client](); } uint8_t refVoltage() { return call Atm128AdcConfig.getRefVoltage[client](); } uint8_t prescaler() { return call Atm128AdcConfig.getPrescaler[client](); } void sample() { call Atm128AdcSingle.getData(channel(), refVoltage(), FALSE, prescaler()); } command error_t ReadStream.postBuffer[uint8_t c](uint16_t *buf, uint16_t n) { if (n < sizeof(struct list_entry_t)) return ESIZE; atomic { struct list_entry_t * ONE newEntry = TCAST(struct list_entry_t * ONE, buf); if (!bufferQueueEnd[c]) // Can't post right now. return FAIL; newEntry->count = n; newEntry->next = NULL; *bufferQueueEnd[c] = newEntry; bufferQueueEnd[c] = &newEntry->next; } return SUCCESS; } task void readStreamDone() { uint8_t c = client; uint32_t actualPeriod = call Atm128Calibrate.actualMicro(period); atomic { bufferQueue[c] = NULL; bufferQueueEnd[c] = &bufferQueue[c]; } client = NSTREAM; signal ReadStream.readDone[c](SUCCESS, actualPeriod); } task void readStreamFail() { /* By now, the pending bufferDone has been signaled (see readStream). */ struct list_entry_t *entry; uint8_t c = client; atomic entry = bufferQueue[c]; for (; entry; entry = entry->next){ uint16_t tmp_count __DEPUTY_UNUSED__ = entry->count; signal ReadStream.bufferDone[c](FAIL, TCAST(uint16_t * COUNT_NOK(tmp_count),entry), entry->count); } atomic { bufferQueue[c] = NULL; bufferQueueEnd[c] = &bufferQueue[c]; } client = NSTREAM; signal ReadStream.readDone[c](FAIL, 0); } task void bufferDone() { uint16_t *b, c; atomic { b = lastBuffer; c = lastCount; lastBuffer = NULL; } signal ReadStream.bufferDone[client](SUCCESS, b, c); } void nextAlarm() { call Alarm.startAt(now, period); now += period; } async event void Alarm.fired() { sample(); } command error_t ReadStream.read[uint8_t c](uint32_t usPeriod) { /* The first reading may be imprecise. So we just do a dummy read to get things rolling - this is indicated by setting count to 0 */ buffer = pos = NULL; count = 0; period = call Atm128Calibrate.calibrateMicro(usPeriod); client = c; sample(); return SUCCESS; } void nextBuffer() { atomic { struct list_entry_t *entry = bufferQueue[client]; if (!entry) { // all done bufferQueueEnd[client] = NULL; // prevent post post readStreamDone(); } else { uint16_t tmp_count; bufferQueue[client] = entry->next; if (!bufferQueue[client]) bufferQueueEnd[client] = &bufferQueue[client]; pos = buffer = NULL; count = entry->count; tmp_count = count; pos = buffer = TCAST(uint16_t * COUNT_NOK(tmp_count), entry); nextAlarm(); } } } async event void Atm128AdcSingle.dataReady(uint16_t data, bool precise) { if (client == NSTREAM) return; if (count == 0) { now = call Alarm.getNow(); nextBuffer(); } else { *pos++ = data; if (pos == buffer + count) { atomic { if (lastBuffer) { /* We failed to signal bufferDone in time. Fail. */ bufferQueueEnd[client] = NULL; // prevent post post readStreamFail(); return; } else { lastCount = count; lastBuffer = buffer; } } post bufferDone(); nextBuffer(); } else nextAlarm(); } } /* Configuration defaults. Read ground fast! ;-) */ default async command uint8_t Atm128AdcConfig.getChannel[uint8_t c]() { return ATM128_ADC_SNGL_GND; } default async command uint8_t Atm128AdcConfig.getRefVoltage[uint8_t c]() { return ATM128_ADC_VREF_OFF; } default async command uint8_t Atm128AdcConfig.getPrescaler[uint8_t c]() { return ATM128_ADC_PRESCALE_2; } } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/Atm128Adc.h000066400000000000000000000120561207233610700212000ustar00rootroot00000000000000// $Id: Atm128Adc.h,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // @author Martin Turon // @author Hu Siquan #ifndef _H_Atm128ADC_h #define _H_Atm128ADC_h //================== 8 channel 10-bit ADC ============================== /* Voltage Reference Settings */ enum { ATM128_ADC_VREF_OFF = 0, //!< VR+ = AREF and VR- = GND ATM128_ADC_VREF_AVCC = 1,//!< VR+ = AVcc and VR- = GND ATM128_ADC_VREF_RSVD, ATM128_ADC_VREF_2_56 = 3,//!< VR+ = 2.56V and VR- = GND }; /* Voltage Reference Settings */ enum { ATM128_ADC_RIGHT_ADJUST = 0, ATM128_ADC_LEFT_ADJUST = 1, }; /* ADC Multiplexer Settings */ enum { ATM128_ADC_SNGL_ADC0 = 0, ATM128_ADC_SNGL_ADC1, ATM128_ADC_SNGL_ADC2, ATM128_ADC_SNGL_ADC3, ATM128_ADC_SNGL_ADC4, ATM128_ADC_SNGL_ADC5, ATM128_ADC_SNGL_ADC6, ATM128_ADC_SNGL_ADC7, ATM128_ADC_DIFF_ADC00_10x, ATM128_ADC_DIFF_ADC10_10x, ATM128_ADC_DIFF_ADC00_200x, ATM128_ADC_DIFF_ADC10_200x, ATM128_ADC_DIFF_ADC22_10x, ATM128_ADC_DIFF_ADC32_10x, ATM128_ADC_DIFF_ADC22_200x, ATM128_ADC_DIFF_ADC32_200x, ATM128_ADC_DIFF_ADC01_1x, ATM128_ADC_DIFF_ADC11_1x, ATM128_ADC_DIFF_ADC21_1x, ATM128_ADC_DIFF_ADC31_1x, ATM128_ADC_DIFF_ADC41_1x, ATM128_ADC_DIFF_ADC51_1x, ATM128_ADC_DIFF_ADC61_1x, ATM128_ADC_DIFF_ADC71_1x, ATM128_ADC_DIFF_ADC02_1x, ATM128_ADC_DIFF_ADC12_1x, ATM128_ADC_DIFF_ADC22_1x, ATM128_ADC_DIFF_ADC32_1x, ATM128_ADC_DIFF_ADC42_1x, ATM128_ADC_DIFF_ADC52_1x, ATM128_ADC_SNGL_1_23, ATM128_ADC_SNGL_GND, }; /* ADC Multiplexer Selection Register */ typedef struct { uint8_t mux : 5; //!< Analog Channel and Gain Selection Bits uint8_t adlar : 1; //!< ADC Left Adjust Result uint8_t refs : 2; //!< Reference Selection Bits } Atm128Admux_t; /* ADC Prescaler Settings */ /* Note: each platform must define ATM128_ADC_PRESCALE to the smallest prescaler which guarantees full A/D precision. */ enum { ATM128_ADC_PRESCALE_2 = 0, ATM128_ADC_PRESCALE_2b, ATM128_ADC_PRESCALE_4, ATM128_ADC_PRESCALE_8, ATM128_ADC_PRESCALE_16, ATM128_ADC_PRESCALE_32, ATM128_ADC_PRESCALE_64, ATM128_ADC_PRESCALE_128, // This special value is used to ask the platform for the prescaler // which gives full precision. ATM128_ADC_PRESCALE }; /* ADC Enable Settings */ enum { ATM128_ADC_ENABLE_OFF = 0, ATM128_ADC_ENABLE_ON, }; /* ADC Start Conversion Settings */ enum { ATM128_ADC_START_CONVERSION_OFF = 0, ATM128_ADC_START_CONVERSION_ON, }; /* ADC Free Running Select Settings */ enum { ATM128_ADC_FREE_RUNNING_OFF = 0, ATM128_ADC_FREE_RUNNING_ON, }; /* ADC Interrupt Flag Settings */ enum { ATM128_ADC_INT_FLAG_OFF = 0, ATM128_ADC_INT_FLAG_ON, }; /* ADC Interrupt Enable Settings */ enum { ATM128_ADC_INT_ENABLE_OFF = 0, ATM128_ADC_INT_ENABLE_ON, }; /* ADC Multiplexer Selection Register */ typedef struct { uint8_t adps : 3; //!< ADC Prescaler Select Bits uint8_t adie : 1; //!< ADC Interrupt Enable uint8_t adif : 1; //!< ADC Interrupt Flag uint8_t adfr : 1; //!< ADC Free Running Select uint8_t adsc : 1; //!< ADC Start Conversion uint8_t aden : 1; //!< ADC Enable } Atm128Adcsra_t; typedef uint8_t Atm128_ADCH_t; //!< ADC data register high typedef uint8_t Atm128_ADCL_t; //!< ADC data register low // The resource identifier string for the ADC subsystem #define UQ_ATM128ADC_RESOURCE "atm128adc.resource" #endif //_H_Atm128ADC_h tinyos-2.1.2+dfsg/tos/chips/atm128/adc/Atm128AdcC.nc000066400000000000000000000054671207233610700214640ustar00rootroot00000000000000/// $Id: Atm128AdcC.nc,v 1.7 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "Atm128Adc.h" /** * HAL for the Atmega128 A/D conversion susbsystem. * * @author Hu Siquan * @author David Gay */ configuration Atm128AdcC { provides { interface Resource[uint8_t client]; interface Atm128AdcSingle; interface Atm128AdcMultiple; } uses interface ResourceConfigure[uint8_t client]; } implementation { components Atm128AdcP, HplAtm128AdcC, PlatformC, MainC, new RoundRobinArbiterC(UQ_ATM128ADC_RESOURCE) as AdcArbiter, new AsyncStdControlPowerManagerC() as PM; Resource = AdcArbiter; ResourceConfigure = AdcArbiter; Atm128AdcSingle = Atm128AdcP; Atm128AdcMultiple = Atm128AdcP; PlatformC.SubInit -> Atm128AdcP; Atm128AdcP.HplAtm128Adc -> HplAtm128AdcC; Atm128AdcP.Atm128Calibrate -> PlatformC; PM.AsyncStdControl -> Atm128AdcP; PM.ResourceDefaultOwner -> AdcArbiter; } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/Atm128AdcConfig.nc000066400000000000000000000023261207233610700224760ustar00rootroot00000000000000/* $Id: Atm128AdcConfig.nc,v 1.4 2006-12-12 18:23:03 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "Atm128Adc.h" /** * Clients of the higher-level A/D system must implement this interface to * specify which channel to sample, and with what parameters. * * @author David Gay */ interface Atm128AdcConfig { /** * Obtain channel. * @return The A/D channel to use. Must be one of the ATM128_ADC_SNGL_xxx * or ATM128_ADC_DIFF_xxx values from Atm128Adc.h. */ async command uint8_t getChannel(); /** * Obtain reference voltage * @return The reference voltage to use. Must be one of the * ATM128_ADC_VREF_xxx values from Atm128Adc.h. */ async command uint8_t getRefVoltage(); /** * Obtain prescaler value. * @return The prescaler value to use. Must be one of the * ATM128_ADC_PRESCALE_xxx values from Atm128Adc.h. */ async command uint8_t getPrescaler(); } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/Atm128AdcMultiple.nc000066400000000000000000000136071207233610700230700ustar00rootroot00000000000000/// $Id: Atm128AdcMultiple.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Hardware Abstraction Layer interface of Atmega128 for acquiring data * from multiple channels using the ATmega128's free-running mode. *

    * Because of the possibility that samples may be imprecise after * switching channels and/or reference voltages, and because there * is a one sample delay on swithcing channels and reference voltages, * Atm128ADCMultiple is complex. Two straightforward uses are: *

      *
    1. Acquire N samples from channel C: *
        *
      1. call getData to start sampling on channel C at the desired rate * (note that the choice of prescalers is very limited, so you * don't have many choices for sampling rate) *
      2. ignore the first dataReady event *
      3. use the results of the next N dataReady() events, return FALSE * on the last one *
      *
    2. Acquire one sample each from channels C1, ..., Cn (this pseudocode * assumes that none of these channels are differential) *
        *
      1. call getData to start sampling on channel C1 *
      2. on the ith dataReady event switch to channel Ci+1 by changing * *newChannel *
      3. the data passed to the ith dataReady event is for channel Ci-1 * (the data from the first dataReady event is ignored) *
      *
    * * @author Hu Siquan * @author David Gay */ #include "Atm128Adc.h" interface Atm128AdcMultiple { /** * Initiates free-running ADC conversions, with the ability to switch * channels and reference-voltage with a one sample delay. * * @param channel Initial A/D conversion channel. The channel can * be changed in the dataReady event, though these changes happen * with a one-sample delay (this is a hardware restriction). * @param refVoltage Initial A/D reference voltage. See the * ATM128_ADC_VREF_xxx constants in Atm128ADC.h. Like the channel, * the reference voltage can be changed in the dataReady event with * a one-sample delay. * @param leftJustify TRUE to place A/D result in high-order bits * (i.e., shifted left by 6 bits), low to place it in the low-order bits * @param prescaler Prescaler value for the A/D conversion clock. If you * specify ATM128_ADC_PRESCALE, a prescaler will be chosen that guarantees * full precision. Other prescalers can be used to get faster conversions. * See the ATmega128 manual for details. * @return TRUE if the conversion will be precise, FALSE if it will be * imprecise (due to a change in reference voltage, or switching to a * differential input channel) */ async command bool getData(uint8_t channel, uint8_t refVoltage, bool leftJustify, uint8_t prescaler); /** * Returns the next sample in a free-running conversion. Allow the user * to switch channels and/or reference voltages with a one sample delay. * * @param data a 2 byte unsigned data value sampled by the ADC. * @param precise if this conversion was precise, FALSE if it wasn't * (we assume that the second conversion after a change of reference * voltage or after switching to a differential channel is precise) * @param channel Channel this sample was from. * @param newChannel Change this parameter to switch to a new channel * for the second next sample. * @param newRefVoltage Change this parameter to change the reference * voltage for the second next sample. * * @return TRUE to continue sampling, FALSE to stop. */ async event bool dataReady(uint16_t data, bool precise, uint8_t channel, uint8_t *newChannel, uint8_t *newRefVoltage); /* Note: there is no cancel in free-running mode because you cannot tell from a successful (or unsuccessful) cancellation whether there will be another dataReady event. Thus you cannot tell when you can safely reuse the ADC (short of waiting one ADC conversion period, in which case you might as well use the result of dataReady to cancel). */ } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/Atm128AdcP.nc000066400000000000000000000220261207233610700214670ustar00rootroot00000000000000/* $Id: Atm128AdcP.nc,v 1.8 2010-06-29 22:07:43 scipio Exp $ * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128Adc.h" /** * Internal component of the Atmega128 A/D HAL. * * @author Jason Hill * @author David Gay * @author Philip Levis * @author Phil Buonadonna * @author Hu Siquan */ module Atm128AdcP @safe() { provides { interface Init; interface AsyncStdControl; interface Atm128AdcSingle; interface Atm128AdcMultiple; } uses { interface HplAtm128Adc; interface Atm128Calibrate; } } implementation { /* State for the current and next (multiple-sampling only) conversion */ struct { bool multiple : 1; /* single and multiple-sampling mode */ bool precise : 1; /* is this result going to be precise? */ uint8_t channel : 5; /* what channel did this sample come from? */ } f, nextF; command error_t Init.init() { atomic { Atm128Adcsra_t adcsr; adcsr.aden = ATM128_ADC_ENABLE_OFF; adcsr.adsc = ATM128_ADC_START_CONVERSION_OFF; adcsr.adfr = ATM128_ADC_FREE_RUNNING_OFF; adcsr.adif = ATM128_ADC_INT_FLAG_OFF; adcsr.adie = ATM128_ADC_INT_ENABLE_OFF; adcsr.adps = ATM128_ADC_PRESCALE_2; call HplAtm128Adc.setAdcsra(adcsr); } return SUCCESS; } /* We enable the A/D when start is called, and disable it when stop is called. This drops A/D conversion latency by a factor of two (but increases idle mode power consumption a little). */ async command error_t AsyncStdControl.start() { atomic call HplAtm128Adc.enableAdc(); return SUCCESS; } async command error_t AsyncStdControl.stop() { atomic call HplAtm128Adc.disableAdc(); return SUCCESS; } /* Return TRUE if switching to 'channel' with reference voltage 'refVoltage' will give a precise result (the first sample after changing reference voltage or switching to/between a differential channel is imprecise) */ inline bool isPrecise(Atm128Admux_t admux, uint8_t channel, uint8_t refVoltage) { return refVoltage == admux.refs && (channel <= ATM128_ADC_SNGL_ADC7 || channel >= ATM128_ADC_SNGL_1_23 || channel == admux.mux); } async event void HplAtm128Adc.dataReady(uint16_t data) { bool precise, multiple; uint8_t channel; atomic { channel = f.channel; precise = f.precise; multiple = f.multiple; } if (!multiple) { /* A single sample. Disable the ADC interrupt to avoid starting a new sample at the next "sleep" instruction. */ call HplAtm128Adc.disableInterruption(); signal Atm128AdcSingle.dataReady(data, precise); } else { /* Multiple sampling. The user can: - tell us to stop sampling - or, to continue sampling on a new channel, possibly with a new reference voltage; however this change applies not to the next sample (the hardware has already started working on that), but on the one after. */ bool cont; uint8_t nextChannel, nextVoltage; Atm128Admux_t admux; atomic { admux = call HplAtm128Adc.getAdmux(); nextVoltage = admux.refs; nextChannel = admux.mux; } cont = signal Atm128AdcMultiple.dataReady(data, precise, channel, &nextChannel, &nextVoltage); atomic if (cont) { /* Switch channels and update our internal channel+precision tracking state (f and nextF). Note that this tracking will be incorrect if we take too long to get to this point. */ admux.refs = nextVoltage; admux.mux = nextChannel; call HplAtm128Adc.setAdmux(admux); f = nextF; nextF.channel = nextChannel; nextF.precise = isPrecise(admux, nextChannel, nextVoltage); } else call HplAtm128Adc.cancel(); } } /* Start sampling based on request parameters */ void getData(uint8_t channel, uint8_t refVoltage, bool leftJustify, uint8_t prescaler) { Atm128Admux_t admux; Atm128Adcsra_t adcsr; admux = call HplAtm128Adc.getAdmux(); f.precise = isPrecise(admux, channel, refVoltage); f.channel = channel; admux.refs = refVoltage; admux.adlar = leftJustify; admux.mux = channel; call HplAtm128Adc.setAdmux(admux); adcsr.aden = ATM128_ADC_ENABLE_ON; adcsr.adsc = ATM128_ADC_START_CONVERSION_ON; adcsr.adfr = f.multiple; adcsr.adif = ATM128_ADC_INT_FLAG_ON; // clear any stale flag adcsr.adie = ATM128_ADC_INT_ENABLE_ON; if (prescaler == ATM128_ADC_PRESCALE) prescaler = call Atm128Calibrate.adcPrescaler(); adcsr.adps = prescaler; call HplAtm128Adc.setAdcsra(adcsr); } async command bool Atm128AdcSingle.getData(uint8_t channel, uint8_t refVoltage, bool leftJustify, uint8_t prescaler) { atomic { f.multiple = FALSE; getData(channel, refVoltage, leftJustify, prescaler); return f.precise; } } async command bool Atm128AdcSingle.cancel() { /* There is no Atm128AdcMultiple.cancel, for reasons discussed in that interface */ return call HplAtm128Adc.cancel(); } async command bool Atm128AdcMultiple.getData(uint8_t channel, uint8_t refVoltage, bool leftJustify, uint8_t prescaler) { atomic { f.multiple = TRUE; getData(channel, refVoltage, leftJustify, prescaler); nextF = f; /* We assume the 2nd sample is precise */ nextF.precise = TRUE; return f.precise; } } default async event void Atm128AdcSingle.dataReady(uint16_t data, bool precise) { } default async event bool Atm128AdcMultiple.dataReady(uint16_t data, bool precise, uint8_t channel, uint8_t *newChannel, uint8_t *newRefVoltage) { return FALSE; // stop conversion if we somehow end up here. } } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/Atm128AdcSingle.nc000066400000000000000000000076451207233610700225230ustar00rootroot00000000000000/// $Id: Atm128AdcSingle.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Hardware Abstraction Layer interface of Atmega128 for acquiring * a single sample from a channel. * * @author Hu Siquan * @author David Gay */ #include "Atm128Adc.h" interface Atm128AdcSingle { /** * Initiates an ADC conversion on a given channel. * * @param channel A/D conversion channel. * @param refVoltage Select reference voltage for A/D conversion. See * the ATM128_ADC_VREF_xxx constants in Atm128ADC.h * @param leftJustify TRUE to place A/D result in high-order bits * (i.e., shifted left by 6 bits), low to place it in the low-order bits * @param prescaler Prescaler value for the A/D conversion clock. If you * specify ATM128_ADC_PRESCALE, a prescaler will be chosen that guarantees * full precision. Other prescalers can be used to get faster conversions. * See the ATmega128 manual for details. * @return TRUE if the conversion will be precise, FALSE if it will be * imprecise (due to a change in refernce voltage, or switching to a * differential input channel) */ async command bool getData(uint8_t channel, uint8_t refVoltage, bool leftJustify, uint8_t prescaler); /** * Indicates a sample has been recorded by the ADC as the result * of a getData() command. * * @param data a 2 byte unsigned data value sampled by the ADC. * @param precise if the conversion precise, FALSE if it wasn't. This * values matches the result from the getData call. */ async event void dataReady(uint16_t data, bool precise); /** * Cancel an outstanding getData operation. Use with care, to * avoid problems with races between the dataReady event and cancel. * @return TRUE if a conversion was in-progress or an interrupt * was pending. dataReady will not be signaled. FALSE if the * conversion was already complete. dataReady will be (or has * already been) signaled. */ async command bool cancel(); } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/HplAtm128Adc.nc000066400000000000000000000116221207233610700220130ustar00rootroot00000000000000/// $Id: HplAtm128Adc.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128Adc.h" /** * HPL interface to the Atmega128 A/D conversion subsystem. Please see the * Atmega128 manual for full details on the functioning of this subsystem. *

    * A word of warning: the Atmega128 SLEEP instruction initiates an A/D * conversion when the ADC and ADC interrupt are enabled. * * @author Martin Turon * @author Hu Siquan * @author David Gay */ interface HplAtm128Adc { /** * Read the ADMUX (ADC selection) register * @return Current ADMUX value */ async command Atm128Admux_t getAdmux(); /** * Set the ADMUX (ADC selection) register * @param admux New ADMUX value */ async command void setAdmux(Atm128Admux_t admux); /** * Read the ADCSRA (ADC control) register * @return Current ADCSRA value */ async command Atm128Adcsra_t getAdcsra(); /** * Set the ADCSRA (ADC control) register * @param adcsra New ADCSRA value */ async command void setAdcsra(Atm128Adcsra_t adcsra); /** * Read the latest A/D conversion result * @return A/D value */ async command uint16_t getValue(); /// A/D control utilities. All of these clear any pending A/D interrupt. /** * Enable ADC sampling */ async command void enableAdc(); /** * Disable ADC sampling */ async command void disableAdc(); /** * Enable ADC interrupt */ async command void enableInterruption(); /** * Disable ADC interrupt */ async command void disableInterruption(); /** * Clear the ADC interrupt flag */ async command void resetInterrupt(); /** * Start ADC conversion. If ADC interrupts are enabled, the dataReady event * will be signaled once (in non-continuous mode) or repeatedly (in * continuous mode). */ async command void startConversion(); /** * Enable continuous sampling */ async command void setContinuous(); /** * Disable continuous sampling */ async command void setSingle(); /* A/D status checks */ /** * Is ADC enabled? * @return TRUE if the ADC is enabled, FALSE otherwise */ async command bool isEnabled(); /** * Is A/D conversion in progress? * @return TRUE if the A/D conversion is in progress, FALSE otherwise */ async command bool isStarted(); /** * Is A/D conversion complete? Note that this flag is automatically * cleared when an A/D interrupt occurs. * @return TRUE if the A/D conversion is complete, FALSE otherwise */ async command bool isComplete(); /** * Set ADC prescaler selection bits * @param scale New ADC prescaler. Must be one of the ATM128_ADC_PRESCALE_xxx * values from Atm128Adc.h */ async command void setPrescaler(uint8_t scale); /** * Cancel A/D conversion and any pending A/D interrupt. Also disables the * ADC interruption (otherwise a sample might start at the next sleep * instruction). This command can assume that the A/D converter is enabled. * @return TRUE if an A/D conversion was in progress or an A/D interrupt * was pending, FALSE otherwise. In single conversion mode, a return * of TRUE implies that the dataReady event will not be signaled. */ async command bool cancel(); /** * A/D interrupt occured * @param data Latest A/D conversion result */ async event void dataReady(uint16_t data); } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/HplAtm128AdcC.nc000066400000000000000000000040051207233610700221130ustar00rootroot00000000000000/// $Id: HplAtm128AdcC.nc,v 1.7 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128Adc.h" /** * HPL for the Atmega128 A/D conversion susbsystem. * * @author Martin Turon * @author Hu Siquan * @author David Gay */ configuration HplAtm128AdcC { provides interface HplAtm128Adc; } implementation { components HplAtm128AdcP, McuSleepC; HplAtm128Adc = HplAtm128AdcP; HplAtm128AdcP.McuPowerState -> McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/HplAtm128AdcP.nc000066400000000000000000000117241207233610700221360ustar00rootroot00000000000000/// $Id: HplAtm128AdcP.nc,v 1.9 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128Adc.h" /** * HPL for the Atmega128 A/D conversion susbsystem. * * @author Martin Turon * @author Hu Siquan * @author David Gay */ module HplAtm128AdcP @safe() { provides interface HplAtm128Adc; uses interface McuPowerState; } implementation { //=== Direct read of HW registers. ================================= async command Atm128Admux_t HplAtm128Adc.getAdmux() { return *(Atm128Admux_t*)&ADMUX; } async command Atm128Adcsra_t HplAtm128Adc.getAdcsra() { return *(Atm128Adcsra_t*)&ADCSRA; } async command uint16_t HplAtm128Adc.getValue() { return ADC; } DEFINE_UNION_CAST(Admux2int, Atm128Admux_t, uint8_t); DEFINE_UNION_CAST(Adcsra2int, Atm128Adcsra_t, uint8_t); //=== Direct write of HW registers. ================================ async command void HplAtm128Adc.setAdmux( Atm128Admux_t x ) { ADMUX = Admux2int(x); } async command void HplAtm128Adc.setAdcsra( Atm128Adcsra_t x ) { ADCSRA = Adcsra2int(x); } async command void HplAtm128Adc.setPrescaler(uint8_t scale){ Atm128Adcsra_t current_val = call HplAtm128Adc.getAdcsra(); current_val.adif = FALSE; current_val.adps = scale; call HplAtm128Adc.setAdcsra(current_val); } // Individual bit manipulation. These all clear any pending A/D interrupt. async command void HplAtm128Adc.enableAdc() { SET_BIT(ADCSRA, ADEN); call McuPowerState.update(); } async command void HplAtm128Adc.disableAdc() { CLR_BIT(ADCSRA, ADEN); call McuPowerState.update(); } async command void HplAtm128Adc.enableInterruption() { SET_BIT(ADCSRA, ADIE); } async command void HplAtm128Adc.disableInterruption() { CLR_BIT(ADCSRA, ADIE); } async command void HplAtm128Adc.setContinuous() { SET_BIT(ADCSRA, ADFR); } async command void HplAtm128Adc.setSingle() { CLR_BIT(ADCSRA, ADFR); } async command void HplAtm128Adc.resetInterrupt() { SET_BIT(ADCSRA, ADIF); } async command void HplAtm128Adc.startConversion() { SET_BIT(ADCSRA, ADSC); } /* A/D status checks */ async command bool HplAtm128Adc.isEnabled() { return (call HplAtm128Adc.getAdcsra()).aden; } async command bool HplAtm128Adc.isStarted() { return (call HplAtm128Adc.getAdcsra()).adsc; } async command bool HplAtm128Adc.isComplete() { return (call HplAtm128Adc.getAdcsra()).adif; } /* A/D interrupt handlers. Signals dataReady event with interrupts enabled */ AVR_ATOMIC_HANDLER(SIG_ADC) { uint16_t data = call HplAtm128Adc.getValue(); __nesc_enable_interrupt(); signal HplAtm128Adc.dataReady(data); } default async event void HplAtm128Adc.dataReady(uint16_t done) { } async command bool HplAtm128Adc.cancel() { /* This is tricky */ atomic { Atm128Adcsra_t oldSr = call HplAtm128Adc.getAdcsra(), newSr; /* To cancel a conversion, first turn off ADEN, then turn off ADSC. We also cancel any pending interrupt. Finally we reenable the ADC. */ newSr = oldSr; newSr.aden = FALSE; newSr.adif = TRUE; /* This clears a pending interrupt... */ newSr.adie = FALSE; /* We don't want to start sampling again at the next sleep */ call HplAtm128Adc.setAdcsra(newSr); newSr.adsc = FALSE; call HplAtm128Adc.setAdcsra(newSr); newSr.aden = TRUE; call HplAtm128Adc.setAdcsra(newSr); return oldSr.adif || oldSr.adsc; } } } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/WireAdcP.nc000066400000000000000000000020041207233610700214130ustar00rootroot00000000000000/* $Id: WireAdcP.nc,v 1.4 2006-12-12 18:23:03 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Support component for AdcReadClientC and AdcReadNowClientC. * * @author David Gay */ configuration WireAdcP { provides { interface Read[uint8_t client]; interface ReadNow[uint8_t client]; } uses { interface Atm128AdcConfig[uint8_t client]; interface Resource[uint8_t client]; } } implementation { components Atm128AdcC, AdcP, new ArbitratedReadC(uint16_t) as ArbitrateRead; Read = ArbitrateRead; ReadNow = AdcP; Resource = ArbitrateRead.Resource; Atm128AdcConfig = AdcP; ArbitrateRead.Service -> AdcP.Read; AdcP.Atm128AdcSingle -> Atm128AdcC; } tinyos-2.1.2+dfsg/tos/chips/atm128/adc/WireAdcStreamP.nc000066400000000000000000000022611207233610700225740ustar00rootroot00000000000000/* $Id: WireAdcStreamP.nc,v 1.4 2006-12-12 18:23:03 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Support component for AdcReadStreamClientC. * * @author David Gay */ #include "Adc.h" configuration WireAdcStreamP { provides interface ReadStream[uint8_t client]; uses { interface Atm128AdcConfig[uint8_t client]; interface Resource[uint8_t client]; } } implementation { components Atm128AdcC, AdcStreamP, PlatformC, MainC, new AlarmMicro32C(), new ArbitratedReadStreamC(uniqueCount(UQ_ADC_READSTREAM), uint16_t) as ArbitrateReadStream; Resource = ArbitrateReadStream; ReadStream = ArbitrateReadStream; Atm128AdcConfig = AdcStreamP; ArbitrateReadStream.Service -> AdcStreamP; AdcStreamP.Init <- MainC; AdcStreamP.Atm128AdcSingle -> Atm128AdcC; AdcStreamP.Atm128Calibrate -> PlatformC; AdcStreamP.Alarm -> AlarmMicro32C; } tinyos-2.1.2+dfsg/tos/chips/atm128/atm128const.h000066400000000000000000000024261207233610700211500ustar00rootroot00000000000000// $Id: atm128const.h,v 1.4 2006-12-12 18:23:03 vlahan Exp $ /* * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * const_[u]int[8/16/32]_t types are used to declare single and array * constants that should live in ROM/FLASH. These constants must be read * via the corresponding read_[u]int[8/16/32]_t functions. * * This file defines the ATmega128 version of these types and functions. * @author David Gay */ #ifndef ATMEGA128CONST_H #define ATMEGA128CONST_H typedef uint8_t const_uint8_t PROGMEM; typedef uint16_t const_uint16_t PROGMEM; typedef uint32_t const_uint32_t PROGMEM; typedef int8_t const_int8_t PROGMEM; typedef int16_t const_int16_t PROGMEM; typedef int32_t const_int32_t PROGMEM; #define read_uint8_t(x) pgm_read_byte(x) #define read_uint16_t(x) pgm_read_word(x) #define read_uint32_t(x) pgm_read_dword(x) #define read_int8_t(x) ((int8_t)pgm_read_byte(x)) #define read_int16_t(x) ((int16_t)pgm_read_word(x)) #define read_int32_t(x) ((int32_t)pgm_read_dword(x)) #endif tinyos-2.1.2+dfsg/tos/chips/atm128/atm128hardware.h000066400000000000000000000132771207233610700216250ustar00rootroot00000000000000// $Id: atm128hardware.h,v 1.12 2010-06-29 22:07:43 scipio Exp $ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. * Copyright (c) 2002-2003 Intel Corporation. * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Jason Hill, Philip Levis, Nelson Lee, David Gay * @author Martin Turon */ #ifndef _H_atmega128hardware_H #define _H_atmega128hardware_H #include #if __AVR_LIBC_VERSION__ >= 10400UL #include #else #include #include #endif #include #include #include "atm128const.h" /* We need slightly different defs than SIGNAL, INTERRUPT */ #define AVR_ATOMIC_HANDLER(signame) \ void signame() __attribute__ ((signal)) @atomic_hwevent() @C() #define AVR_NONATOMIC_HANDLER(signame) \ void signame() __attribute__ ((interrupt)) @hwevent() @C() /* Macro to create union casting functions. */ #define DEFINE_UNION_CAST(func_name, from_type, to_type) \ to_type func_name(from_type x) { \ union {from_type f; to_type t;} c = {f:x}; return c.t; } // Bit operators using bit number #define SET_BIT(port, bit) ((port) |= _BV(bit)) #define CLR_BIT(port, bit) ((port) &= ~_BV(bit)) #define READ_BIT(port, bit) (((port) & _BV(bit)) != 0) #define FLIP_BIT(port, bit) ((port) ^= _BV(bit)) #define WRITE_BIT(port, bit, value) \ if (value) SET_BIT((port), (bit)); \ else CLR_BIT((port), (bit)) // Bit operators using bit flag mask #define SET_FLAG(port, flag) ((port) |= (flag)) #define CLR_FLAG(port, flag) ((port) &= ~(flag)) #define READ_FLAG(port, flag) ((port) & (flag)) /* Enables interrupts. */ inline void __nesc_enable_interrupt() @safe() { sei(); } /* Disables all interrupts. */ inline void __nesc_disable_interrupt() @safe() { cli(); } /* Defines data type for storing interrupt mask state during atomic. */ typedef uint8_t __nesc_atomic_t; __nesc_atomic_t __nesc_atomic_start(void); void __nesc_atomic_end(__nesc_atomic_t original_SREG); #ifndef NESC_BUILD_BINARY /* @spontaneous() functions should not be included when NESC_BUILD_BINARY is #defined, to avoid duplicate functions definitions wheb binary components are used. Such functions do need a prototype in all cases, though. */ /* Saves current interrupt mask state and disables interrupts. */ inline __nesc_atomic_t __nesc_atomic_start(void) @spontaneous() @safe() { __nesc_atomic_t result = SREG; __nesc_disable_interrupt(); asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ return result; } /* Restores interrupt mask to original state. */ inline void __nesc_atomic_end(__nesc_atomic_t original_SREG) @spontaneous() @safe() { asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ SREG = original_SREG; } #endif /* Defines the mcu_power_t type for atm128 power management. */ typedef uint8_t mcu_power_t @combine("mcombine"); enum { ATM128_POWER_IDLE = 0, ATM128_POWER_ADC_NR = 1, ATM128_POWER_EXT_STANDBY = 2, ATM128_POWER_SAVE = 3, ATM128_POWER_STANDBY = 4, ATM128_POWER_DOWN = 5, }; /* Combine function. */ mcu_power_t mcombine(mcu_power_t m1, mcu_power_t m2) @safe() { return (m1 < m2)? m1: m2; } /* Floating-point network-type support. These functions must convert to/from a 32-bit big-endian integer that follows the layout of Java's java.lang.float.floatToRawIntBits method. Conveniently, for the AVR family, this is a straight byte copy... */ typedef float nx_float __attribute__((nx_base_be(afloat))); inline float __nesc_ntoh_afloat(const void *COUNT(sizeof(float)) source) @safe() { float f; memcpy(&f, source, sizeof(float)); return f; } inline float __nesc_hton_afloat(void *COUNT(sizeof(float)) target, float value) @safe() { memcpy(target, &value, sizeof(float)); return value; } #endif //_H_atmega128hardware_H tinyos-2.1.2+dfsg/tos/chips/atm128/crc.h000066400000000000000000000121021207233610700176240ustar00rootroot00000000000000// $Id: crc.h,v 1.7 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef CRC_H #define CRC_H /* We don't want to duplicate this fairly large function inside binary components. */ #ifdef NESC_BUILD_BINARY uint16_t crcByte(uint16_t oldCrc, uint8_t byte); #else uint16_t crcTable[256] PROGMEM = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 }; /* * Optimised Atmega128 ITU-T CRC function. * * @param crc Running CRC value * @param b Byte to "add" to the CRC * @return New CRC value */ uint16_t crcByte(uint16_t oldCrc, uint8_t byte) __attribute__((noinline)) @safe() { #if 1 uint16_t *table = crcTable; uint16_t newCrc; asm ("eor %1,%B3\n" "\tlsl %1\n" "\tadc %B2, __zero_reg__\n" "\tadd %A2, %1\n" "\tadc %B2, __zero_reg__\n" "\tlpm\n" "\tmov %B0, %A3\n" "\tmov %A0, r0\n" "\tadiw r30,1\n" "\tlpm\n" "\teor %B0, r0" : "=r" (newCrc), "+r" (byte), "+z" (table) : "r" (oldCrc)); return newCrc; #else uint8_t *magic = (uint8_t *)&crcTable[oldCrc >> 8 ^ byte]; return PRG_RDB(magic) | ((uint8_t)oldCrc ^ PRG_RDB(magic + 1)) << 8; #endif } #endif #endif tinyos-2.1.2+dfsg/tos/chips/atm128/i2c/000077500000000000000000000000001207233610700173655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128/i2c/Atm128I2C.h000066400000000000000000000046541207233610700210210ustar00rootroot00000000000000// $Id: Atm128I2C.h,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // @author Martin Turon #ifndef _H_Atm128I2C_h #define _H_Atm128I2C_h #define ATM128_I2C_SLA_WRITE 0x00 #define ATM128_I2C_SLA_READ 0x01 #define UQ_ATM128_I2CMASTER "Atm128I2CMasterC.I2CPacket" enum { ATM128_I2C_BUSERROR = 0x00, ATM128_I2C_START = 0x08, ATM128_I2C_RSTART = 0x10, ATM128_I2C_MW_SLA_ACK = 0x18, ATM128_I2C_MW_SLA_NACK = 0x20, ATM128_I2C_MW_DATA_ACK = 0x28, ATM128_I2C_MW_DATA_NACK = 0x30, ATM128_I2C_M_ARB_LOST = 0x38, ATM128_I2C_MR_SLA_ACK = 0x40, ATM128_I2C_MR_SLA_NACK = 0x48, ATM128_I2C_MR_DATA_ACK = 0x50, ATM128_I2C_MR_DATA_NACK = 0x58 }; #ifndef ATM128_I2C_EXTERNAL_PULLDOWN #define ATM128_I2C_EXTERNAL_PULLDOWN FALSE #endif #endif // _H_Atm128I2C_h tinyos-2.1.2+dfsg/tos/chips/atm128/i2c/Atm128I2C.nc000066400000000000000000000037101207233610700211620ustar00rootroot00000000000000/// $Id: Atm128I2C.nc,v 1.4 2006-12-12 18:23:03 vlahan Exp $ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128I2C.h" /** * An interface for stopping the I2C bus. Needed by the resource * reservation system, so that when a client releases you're sure * there's a stop. * * @author Philip Levis * * @version $Id: Atm128I2C.nc,v 1.4 2006-12-12 18:23:03 vlahan Exp $ */ interface Atm128I2C { async command void stop(); } tinyos-2.1.2+dfsg/tos/chips/atm128/i2c/Atm128I2CMaster.nc000066400000000000000000000045201207233610700223360ustar00rootroot00000000000000/// $Id: Atm128I2CMaster.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128I2C.h" /** * Interface for non-blocking I2C master engine. * * @author Martin Turon */ interface Atm128I2CMaster { /** Ping the I2C device. */ command error_t ping (); /** Write the given data buffer the I2C device. */ command error_t write (uint8_t *data, uint8_t length); /** Read from the I2C device. */ command error_t read (uint8_t *data, uint8_t length); /** Signal that the ping to the I2C device is done. */ event void pingDone (error_t result); /** Signal that the read from the I2C device is done. */ event void readDone (); /** Signal that the write to the I2C device is done. */ event void writeDone (); } tinyos-2.1.2+dfsg/tos/chips/atm128/i2c/Atm128I2CMasterC.nc000066400000000000000000000041631207233610700224440ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The basic client abstraction of the I2C on the Atmega128. I2C * device drivers should instantiate one of these to ensure * exclusive access to the I2C bus. * * @author Philip Levis * @date May 28, 2006 */ #include "Atm128I2C.h" generic configuration Atm128I2CMasterC() { provides interface Resource; provides interface I2CPacket; } implementation { enum { CLIENT_ID = unique(UQ_ATM128_I2CMASTER), }; components Atm128I2CMasterP as I2C; Resource = I2C.Resource[CLIENT_ID]; I2CPacket = I2C.I2CPacket[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/chips/atm128/i2c/Atm128I2CMasterImplP.nc000066400000000000000000000077061207233610700233110ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The configuration that takes the underlying I2C driver on the * Atmega128 and turns it into a shared abstraction. * * @date May 28 2006 * @author Philip Levis */ generic module Atm128I2CMasterImplP() { provides interface Resource[uint8_t client]; provides interface I2CPacket[uint8_t client]; uses interface Resource as SubResource[uint8_t]; uses interface I2CPacket as SubPacket; uses interface Atm128I2C; uses interface Leds; } implementation { enum { NO_CLIENT = 0xff }; uint8_t currentClient = NO_CLIENT; async command error_t Resource.request[uint8_t id]() { return call SubResource.request[id](); } async command error_t Resource.immediateRequest[uint8_t id]() { error_t rval = call SubResource.immediateRequest[id](); if (rval == SUCCESS) { atomic currentClient = id; } return rval; } event void SubResource.granted[uint8_t id]() { atomic currentClient = id; signal Resource.granted[id](); } async command error_t Resource.release[uint8_t id]() { call Atm128I2C.stop(); // Always stop if someone has released. return call SubResource.release[id](); } async command bool Resource.isOwner[uint8_t id]() { return call SubResource.isOwner[id](); } async command error_t I2CPacket.write[uint8_t id](i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* data) { atomic { if (currentClient != id) { return FAIL; } } return call SubPacket.write(flags, addr, len, data); } async command error_t I2CPacket.read[uint8_t id](i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* data) { atomic { if (currentClient != id) { return FAIL; } } return call SubPacket.read(flags, addr, len, data); } async event void SubPacket.readDone(error_t error, uint16_t addr, uint8_t len, uint8_t* data) { signal I2CPacket.readDone[currentClient](error, addr, len, data); } async event void SubPacket.writeDone(error_t error, uint16_t addr, uint8_t len, uint8_t* data) { signal I2CPacket.writeDone[currentClient](error, addr, len, data); } default event void Resource.granted[uint8_t id]() {} default async event void I2CPacket.writeDone[uint8_t id](error_t error, uint16_t addr, uint8_t len, uint8_t* data) {} default async event void I2CPacket.readDone[uint8_t id](error_t error, uint16_t addr, uint8_t len, uint8_t* data) {} } tinyos-2.1.2+dfsg/tos/chips/atm128/i2c/Atm128I2CMasterP.nc000066400000000000000000000051131207233610700224550ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The configuration that takes the underlying I2C driver on the * Atmega128 and turns it into a shared abstraction. * * @date May 28 2006 * @author Philip Levis */ #include "Atm128I2C.h" configuration Atm128I2CMasterP { provides interface Resource[uint8_t client]; provides interface I2CPacket[uint8_t client]; } implementation { enum { ATM128_I2C_CLIENT_COUNT = uniqueCount(UQ_ATM128_I2CMASTER), }; components new FcfsArbiterC(UQ_ATM128_I2CMASTER) as Arbiter; components new AsyncPowerManagerP() as Power; components new Atm128I2CMasterImplP() as I2C; components new Atm128I2CMasterPacketP() as Master; components HplAtm128I2CBusC; components LedsC, NoLedsC; Resource = I2C; I2CPacket = I2C; I2C.SubResource -> Arbiter; I2C.SubPacket -> Master; I2C.Atm128I2C -> Master; Power.AsyncStdControl -> Master; Power.ResourceDefaultOwner -> Arbiter; Master.I2C -> HplAtm128I2CBusC; Master.ReadDebugLeds -> NoLedsC; Master.WriteDebugLeds -> NoLedsC; } tinyos-2.1.2+dfsg/tos/chips/atm128/i2c/Atm128I2CMasterPacketP.nc000066400000000000000000000307061207233610700236130ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * Copyright (c) 2009, Distributed Computing Group (DCG), ETH Zurich. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor the names of * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, * OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * * * */ #include "Atm128I2C.h" /** * This driver implements an interupt driven I2C Master controller * Hardware Abstraction Layer (HAL) to the ATmega128 * two-wire-interface (TWI) hardware subsystem. * * @author Philip Levis * @author Philipp Sommer, ETH Zurich, sommer@tik.ee.ethz.ch * @author Roland Flury, ETH Zurich, rflury@tik.ee.ethz.ch * @author Thomas Fahrni, ETH Zurich, tfahrni@ee.ethz.ch * @author Richard Huber, ETH Zurich, rihuber@ee.ethz.ch * @author Lars Schor, ETH Zurich, lschor@ee.ethz.ch * @author Andras Biro, University of Szeged * */ generic module Atm128I2CMasterPacketP() { provides interface AsyncStdControl; provides interface I2CPacket; provides interface Atm128I2C; uses interface HplAtm128I2CBus as I2C; uses interface Leds as ReadDebugLeds; uses interface Leds as WriteDebugLeds; } implementation { enum { I2C_OFF = 0, I2C_IDLE = 1, I2C_BUSY = 2, I2C_DATA = 3, I2C_STARTING = 4, I2C_STOPPING = 5, I2C_SLAVE_ACK = 6 } atm128_i2c_state_t; uint8_t state = I2C_OFF; i2c_flags_t packetFlags; uint8_t* packetPtr; uint8_t packetLen; uint8_t index; uint16_t packetAddr; bool reading = FALSE; void i2c_abort(error_t err) { atomic { // Cycle the I2C call I2C.readCurrent(); call I2C.enableInterrupt(FALSE); call I2C.enable(FALSE); call I2C.sendCommand(); call I2C.readCurrent(); call I2C.enable(TRUE); call I2C.sendCommand(); state = I2C_IDLE; if (reading) { signal I2CPacket.readDone(err, packetAddr, packetLen, packetPtr); } else { signal I2CPacket.writeDone(err, packetAddr, packetLen, packetPtr); } } } async command error_t AsyncStdControl.start() { atomic { if (state == I2C_OFF) { call I2C.init(ATM128_I2C_EXTERNAL_PULLDOWN); call I2C.readCurrent(); call I2C.enable(TRUE); call I2C.enableInterrupt(FALSE); call I2C.sendCommand(); state = I2C_IDLE; return SUCCESS; } else { return FAIL; } } } async command error_t AsyncStdControl.stop() { atomic { if (state == I2C_IDLE) { call I2C.readCurrent(); call I2C.enable(FALSE); call I2C.enableInterrupt(FALSE); call I2C.setInterruptPending(FALSE); call I2C.setStop(FALSE); call I2C.sendCommand(); call I2C.off(); state = I2C_OFF; return SUCCESS; } else { return FAIL; } } } inline void readNextByte(bool startRead){ if(!startRead){ packetPtr[index] = call I2C.read(); index++; } if (index < packetLen) { if (index == packetLen - 1 && !(packetFlags & I2C_ACK_END)) { call I2C.enableAck(FALSE); } call I2C.sendCommand(); } else { call I2C.enableInterrupt(FALSE); if (packetFlags & I2C_STOP) { packetFlags &= ~I2C_STOP; call I2C.setStop(TRUE); call I2C.status(); } else { call I2C.setInterruptPending(FALSE); } call I2C.sendCommand(); state = I2C_IDLE; signal I2CPacket.readDone(SUCCESS, packetAddr, packetLen, packetPtr); return; } } inline void writeNextByte(){ if (index < packetLen) { call I2C.write(packetPtr[index]); index++; call I2C.sendCommand(); } else { call I2C.enableInterrupt(FALSE); if (packetFlags & I2C_STOP) { packetFlags &= ~I2C_STOP; call I2C.setStop(TRUE); call WriteDebugLeds.led1On(); } else { call I2C.setInterruptPending(FALSE); } call I2C.sendCommand(); state = I2C_IDLE; call WriteDebugLeds.led2On(); signal I2CPacket.writeDone(SUCCESS, packetAddr, packetLen, packetPtr); } } async command error_t I2CPacket.read(i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* data) { atomic { if (state == I2C_IDLE) { state = I2C_BUSY; } else if (state == I2C_OFF) { return EOFF; } else { return EBUSY; } } /* This follows the procedure described on page 209 of the atmega128L * data sheet. It is synchronous (does not handle interrupts).*/ atomic { packetAddr = addr; packetPtr = data; packetLen = len; packetFlags = flags; index = 0; reading = TRUE; } /* Clear interrupt pending, send the I2C start command and abort if we're not in the start state.*/ call I2C.readCurrent(); atomic { call I2C.enableInterrupt(TRUE); call I2C.setInterruptPending(TRUE); call I2C.enableAck(FALSE); call I2C.setStop(FALSE); if (flags & I2C_START) { call I2C.setStart(TRUE); state = I2C_STARTING; } else if (len > 1 || (len > 0 && flags & I2C_ACK_END)) { call I2C.enableAck(TRUE); state = I2C_DATA; } else if (len == 1) { // length is 1 state = I2C_DATA; } else if (flags & I2C_STOP) { state = I2C_STOPPING; call I2C.enableAck(FALSE); call I2C.setStop(TRUE); } call I2C.sendCommand(); } return SUCCESS; } async command error_t I2CPacket.write(i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* data) { atomic { if (state == I2C_IDLE) { state = I2C_BUSY; } else if (state == I2C_OFF) { return EOFF; } else { return EBUSY; } } /* This follows the procedure described on page 209 of the atmega128L * data sheet. It is synchronous (does not handle interrupts).*/ atomic { packetAddr = addr; packetPtr = data; packetLen = len; packetFlags = flags; index = 0; reading = FALSE; } call I2C.readCurrent(); atomic { call I2C.setInterruptPending(TRUE); call I2C.enableAck(TRUE); call I2C.enableInterrupt(TRUE); call I2C.setStop(FALSE); if (flags & I2C_START) { call I2C.setStart(TRUE); // call WriteDebugLeds.led0On(); state = I2C_STARTING; } else if (len > 0) { state = I2C_DATA; writeNextByte(); return SUCCESS; } else if (flags & I2C_STOP) { state = I2C_STOPPING; call I2C.enableAck(FALSE); call I2C.setStop(TRUE); } else { // A 0-length packet with no start and no stop.... state = I2C_IDLE; return FAIL; } call I2C.sendCommand(); } return SUCCESS; } /** * A command has been sent over the I2C. * The diversity of I2C options and modes means that there are a * plethora of cases to consider. To simplify reading the code, * they're described here and the corresponding statements * are only labelled with identifying comments. * * When reading: * R1) A start condition has been requested. This requires * sending the start signal. When the interrupt comes in, * send the first byte of the packet. This driver * detects this condition by the START flag being set. * A successful send of the start clears the local copy of * the flag. The driver does not distinguish between start * and repeated start. * R2) Sending the address byte with the read bit set. * R3) Sending the first byte of a two-byte address with the * read bit set. * R4) Sending the second byte of a two-byte address. * R5) Reading any byte except the last byte of a packet. * R6) Reading the last byte of the packet, with ACK_END requested. * R7) Reading the last byte of the packet, with ACK_END cleared. * R8) Sending a stop condition. */ async event void I2C.commandComplete() { call I2C.readCurrent(); atomic { switch(state){ case I2C_SLAVE_ACK: { //check for slave addr ack uint8_t i2c_status=call I2C.status(); if (reading == TRUE) { if(i2c_status==0x40){ state = I2C_DATA; readNextByte(TRUE); } else { i2c_abort(EOFF); return; } } else{ if(i2c_status==0x18){ state = I2C_DATA; writeNextByte(); } else { i2c_abort(EOFF); return; } } } break; case I2C_DATA: if (reading == TRUE) readNextByte(FALSE); else // Writing writeNextByte(); break; case I2C_STARTING: packetFlags &= ~I2C_START; call I2C.setStart(FALSE); if (call I2C.status() != ATM128_I2C_START && call I2C.status() != ATM128_I2C_RSTART) { i2c_abort(FAIL); return; } //after the START condition, we write the address call I2C.enableAck(TRUE); call I2C.write(((packetAddr & 0x7f) << 1) | ((reading == TRUE) ? ATM128_I2C_SLA_READ : ATM128_I2C_SLA_WRITE)); state = I2C_SLAVE_ACK; call I2C.sendCommand(); break; } } } async command void Atm128I2C.stop() { atomic { call I2C.readCurrent(); call I2C.enableInterrupt(FALSE); call I2C.setStop(TRUE); call I2C.setInterruptPending(TRUE); call I2C.sendCommand(); } } } tinyos-2.1.2+dfsg/tos/chips/atm128/i2c/HplAtm128I2CBus.nc000066400000000000000000000066221207233610700223050ustar00rootroot00000000000000/// $Id: HplAtm128I2CBus.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128I2C.h" /** * This driver implements direct I2C register access and a blocking master * controller for the ATmega128 via a Hardware Platform Layer (HPL) to its * two-wire-interface (TWI) hardware subsystem. * * @author Martin Turon * @author Philip Levis * * @version $Id: HplAtm128I2CBus.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ */ interface HplAtm128I2CBus { async command void init(bool hasExternalPulldown); async command void off(); async command uint8_t status(); async command void readCurrent(); async command void sendCommand(); async event void commandComplete(); // Transaction interface async command void setStart(bool on); async command bool hasStart(); async command void setStop(bool on); async command bool hasStop(); async command void enableAck(bool enable); async command bool hasAcks(); async command void enableInterrupt(bool enable); async command bool isInterruptEnabled(); // Examines actual register. Included so that code which needs // to spin in TWINT does not have to read out cached copies. async command bool isRealInterruptPending(); // Operates on cached copy (from readCurrent) async command bool isInterruptPending(); // NOTE: writing a 1 in the interrupt pending bit (TWINT) of the // atm128 I2C control register (TWCR) will *clear* the bit if it // is set. This is how you tell the I2C to take the next action, // as when the bit is cleared it starts the next operation. async command void setInterruptPending(bool on); async command void enable(bool on); async command bool isEnabled(); async command bool hasWriteCollided(); // Data interface to TWDR async command void write(uint8_t data); async command uint8_t read(); } tinyos-2.1.2+dfsg/tos/chips/atm128/i2c/HplAtm128I2CBusC.nc000066400000000000000000000043501207233610700224040ustar00rootroot00000000000000/// $Id: HplAtm128I2CBusC.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2006 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This driver implements direct I2C register access and a blocking master * controller for the ATmega128 via a Hardware Platform Layer (HPL) to its * two-wire-interface (TWI) hardware subsystem. * * @author Martin Turon * @author Philip Levis * * @version $Id: HplAtm128I2CBusC.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ */ configuration HplAtm128I2CBusC { provides interface HplAtm128I2CBus as I2C; } implementation { components HplAtm128GeneralIOC as IO, HplAtm128I2CBusP as Bus; I2C = Bus.I2C; Bus.I2CClk -> IO.PortD0; Bus.I2CData -> IO.PortD1; } tinyos-2.1.2+dfsg/tos/chips/atm128/i2c/HplAtm128I2CBusP.nc000066400000000000000000000120131207233610700224140ustar00rootroot00000000000000/// $Id: HplAtm128I2CBusP.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #define F_CPU 7372800 #include "Atm128I2C.h" /** * This driver implements direct I2C register access and a blocking master * controller for the ATmega128 via a Hardware Platform Layer (HPL) to its * two-wire-interface (TWI) hardware subsystem. * * @author Martin Turon * @author Philip Levis * * @version $Id: HplAtm128I2CBusP.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ */ module HplAtm128I2CBusP { provides interface HplAtm128I2CBus as I2C; uses { interface GeneralIO as I2CClk; interface GeneralIO as I2CData; } } implementation { uint8_t current; async command void I2C.init(bool hasExternalPulldown) { // Set the internal pullup resisters if (hasExternalPulldown) { //call I2CClk.makeOutput(); //call I2CData.makeOutput(); call I2CClk.set(); call I2CData.set(); } call I2CClk.makeInput(); call I2CData.makeInput(); TWSR = 0; // set prescaler == 0 TWBR = (F_CPU / 50000UL - 16) / 2; // set I2C baud rate //TWBR = 50; TWAR = 0; TWCR = 0; } async command void I2C.off() { call I2CClk.clr(); call I2CData.clr(); } async command uint8_t I2C.status() { return TWSR & 0xf8; } async command void I2C.sendCommand() { atomic TWCR = current; } async command void I2C.readCurrent() { atomic current = TWCR; } /** Send START symbol and begin I2C bus transaction. */ async command void I2C.setStart(bool on) { if (on) { atomic SET_BIT(current, TWSTA); } else { atomic CLR_BIT(current, TWSTA); } } async command bool I2C.hasStart() { return READ_BIT(current, TWSTA); } async command void I2C.setStop(bool on) { if (on) { atomic SET_BIT(current, TWSTO); } else { atomic CLR_BIT(current, TWSTO); } } async command bool I2C.hasStop() { return READ_BIT(current, TWSTO); } /** Write a byte to an I2C slave device. */ async command void I2C.write(uint8_t data) { TWDR = data; } async command uint8_t I2C.read() { return TWDR; } async command void I2C.enableAck(bool enable) { if (enable) { atomic SET_BIT(current, TWEA); } else { atomic CLR_BIT(current, TWEA); } } async command bool I2C.hasAcks() { return READ_BIT(current, TWEA); } async command void I2C.enableInterrupt(bool enable) { if (enable) { atomic SET_BIT(current, TWIE); } else { atomic CLR_BIT(current, TWIE); } } async command bool I2C.isInterruptEnabled() { return READ_BIT(current, TWIE); } async command bool I2C.isRealInterruptPending() { return READ_BIT(TWCR, TWINT); } async command bool I2C.isInterruptPending() { return READ_BIT(current, TWINT); } async command void I2C.setInterruptPending(bool on) { if (on) { atomic SET_BIT(current, TWINT); } else { atomic CLR_BIT(current, TWINT); } } async command void I2C.enable(bool enable) { if (enable) { atomic SET_BIT(current, TWEN); } else { atomic CLR_BIT(current, TWEN); } } async command bool I2C.isEnabled() { return READ_BIT(current, TWEN); } async command bool I2C.hasWriteCollided() { return READ_BIT(current, TWWC); } default async event void I2C.commandComplete() { } AVR_ATOMIC_HANDLER(SIG_2WIRE_SERIAL) { signal I2C.commandComplete(); } } tinyos-2.1.2+dfsg/tos/chips/atm128/pins/000077500000000000000000000000001207233610700176615ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128/pins/Atm128GpioInterruptC.nc000066400000000000000000000016361207233610700240240ustar00rootroot00000000000000/// $Id: Atm128GpioInterruptC.nc,v 1.6 2010-05-14 13:16:55 mmaroti Exp $ /** * @author Phil Levis */ generic module Atm128GpioInterruptC() @safe() { provides interface GpioInterrupt as Interrupt; uses interface HplAtm128Interrupt as Atm128Interrupt; } implementation { error_t enable( bool rising ) { atomic { call Atm128Interrupt.disable(); call Atm128Interrupt.clear(); call Atm128Interrupt.edge( rising ); call Atm128Interrupt.enable(); } return SUCCESS; } async command error_t Interrupt.enableRisingEdge() { return enable( TRUE ); } async command error_t Interrupt.enableFallingEdge() { return enable( FALSE ); } async command error_t Interrupt.disable() { call Atm128Interrupt.disable(); return SUCCESS; } async event void Atm128Interrupt.fired() { signal Interrupt.fired(); } default async event void Interrupt.fired() { } } tinyos-2.1.2+dfsg/tos/chips/atm128/pins/Atm128Interrupt.h000066400000000000000000000050661207233610700227320ustar00rootroot00000000000000// $Id: Atm128Interrupt.h,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // @author Martin Turon #ifndef _H_Atm128Interrupt_h #define _H_Atm128Interrupt_h //====================== External Interrupts =============================== /* Sleep modes */ enum { ATM128_IRQ_ON_LOW = 0, ATM128_IRQ_ON_CHANGE = 1, ATM128_IRQ_ON_FALL = 2, ATM128_IRQ_ON_RISE = 3, }; /* Interrupt Control Register */ typedef struct { uint8_t isc0 : 2; //!< Interrupt Sense Control uint8_t isc1 : 2; //!< Interrupt Sense Control uint8_t isc2 : 2; //!< Interrupt Sense Control uint8_t isc3 : 2; //!< Interrupt Sense Control } Atm128_InterruptCtrl_t; typedef Atm128_InterruptCtrl_t Atm128_EICRA_t; //!< Ext Interrupt Control A typedef Atm128_InterruptCtrl_t Atm128_EICRB_t; //!< Ext Interrupt Control B typedef uint8_t Atm128_EIMSK_t; //!< External Interrupt Mask Register typedef uint8_t Atm128_EIFR_t; //!< External Interrupt Flag Register #endif //_H_Atm128Interrupt_h tinyos-2.1.2+dfsg/tos/chips/atm128/pins/Atm128InterruptC.nc000066400000000000000000000052201207233610700231760ustar00rootroot00000000000000/// $Id: Atm128InterruptC.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre * @author Martin Turon */ generic module Atm128InterruptC() { provides interface Interrupt; uses interface HplAtm128Interrupt; } implementation { /** * enable an edge interrupt on the Interrupt pin */ async command error_t Interrupt.startWait(bool low_to_high) { atomic { call HplAtm128Interrupt.disable(); call HplAtm128Interrupt.clear(); call HplAtm128Interrupt.edge(low_to_high); call HplAtm128Interrupt.enable(); } return SUCCESS; } /** * disables Interrupt interrupts */ async command error_t Interrupt.disable() { call HplAtm128Interrupt.disable(); return SUCCESS; } /** * Event fired by lower level interrupt dispatch for Interrupt */ async event void HplAtm128Interrupt.fired() { // The flag is automatically cleared, clearing it again can cause missed interrupts // call HplAtm128Interrupt.clear(); signal Interrupt.fired(); } default async event void Interrupt.fired() { } } tinyos-2.1.2+dfsg/tos/chips/atm128/pins/HplAtm128GeneralIOC.nc000066400000000000000000000153061207233610700234610ustar00rootroot00000000000000/// $Id: HplAtm128GeneralIOC.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include /** * Provide GeneralIO interfaces for all of the ATmega128's pins. * * @author Martin Turon */ configuration HplAtm128GeneralIOC { // provides all the ports as raw ports provides { interface GeneralIO as PortA0; interface GeneralIO as PortA1; interface GeneralIO as PortA2; interface GeneralIO as PortA3; interface GeneralIO as PortA4; interface GeneralIO as PortA5; interface GeneralIO as PortA6; interface GeneralIO as PortA7; interface GeneralIO as PortB0; interface GeneralIO as PortB1; interface GeneralIO as PortB2; interface GeneralIO as PortB3; interface GeneralIO as PortB4; interface GeneralIO as PortB5; interface GeneralIO as PortB6; interface GeneralIO as PortB7; interface GeneralIO as PortC0; interface GeneralIO as PortC1; interface GeneralIO as PortC2; interface GeneralIO as PortC3; interface GeneralIO as PortC4; interface GeneralIO as PortC5; interface GeneralIO as PortC6; interface GeneralIO as PortC7; interface GeneralIO as PortD0; interface GeneralIO as PortD1; interface GeneralIO as PortD2; interface GeneralIO as PortD3; interface GeneralIO as PortD4; interface GeneralIO as PortD5; interface GeneralIO as PortD6; interface GeneralIO as PortD7; interface GeneralIO as PortE0; interface GeneralIO as PortE1; interface GeneralIO as PortE2; interface GeneralIO as PortE3; interface GeneralIO as PortE4; interface GeneralIO as PortE5; interface GeneralIO as PortE6; interface GeneralIO as PortE7; interface GeneralIO as PortF0; interface GeneralIO as PortF1; interface GeneralIO as PortF2; interface GeneralIO as PortF3; interface GeneralIO as PortF4; interface GeneralIO as PortF5; interface GeneralIO as PortF6; interface GeneralIO as PortF7; interface GeneralIO as PortG0; interface GeneralIO as PortG1; interface GeneralIO as PortG2; interface GeneralIO as PortG3; interface GeneralIO as PortG4; } } implementation { components new HplAtm128GeneralIOPortP((uint8_t)&PORTA, (uint8_t)&DDRA, (uint8_t)&PINA) as PortA, new HplAtm128GeneralIOPortP((uint8_t)&PORTB, (uint8_t)&DDRB, (uint8_t)&PINB) as PortB, new HplAtm128GeneralIOPortP((uint8_t)&PORTC, (uint8_t)&DDRC, (uint8_t)&PINC) as PortC, new HplAtm128GeneralIOPortP((uint8_t)&PORTD, (uint8_t)&DDRD, (uint8_t)&PIND) as PortD, new HplAtm128GeneralIOPortP((uint8_t)&PORTE, (uint8_t)&DDRE, (uint8_t)&PINE) as PortE, new HplAtm128GeneralIOPortP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF) as PortF, // PortF cannot use sbi, cbi new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 0) as F0, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 1) as F1, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 2) as F2, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 3) as F3, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 4) as F4, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 5) as F5, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 6) as F6, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 7) as F7, // PortG only exposes 5 bits and cannot use sbi, cbi new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTG, (uint8_t)&DDRG, (uint8_t)&PING, 0) as G0, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTG, (uint8_t)&DDRG, (uint8_t)&PING, 1) as G1, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTG, (uint8_t)&DDRG, (uint8_t)&PING, 2) as G2, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTG, (uint8_t)&DDRG, (uint8_t)&PING, 3) as G3, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTG, (uint8_t)&DDRG, (uint8_t)&PING, 4) as G4 ; PortA0 = PortA.Pin0; PortA1 = PortA.Pin1; PortA2 = PortA.Pin2; PortA3 = PortA.Pin3; PortA4 = PortA.Pin4; PortA5 = PortA.Pin5; PortA6 = PortA.Pin6; PortA7 = PortA.Pin7; PortB0 = PortB.Pin0; PortB1 = PortB.Pin1; PortB2 = PortB.Pin2; PortB3 = PortB.Pin3; PortB4 = PortB.Pin4; PortB5 = PortB.Pin5; PortB6 = PortB.Pin6; PortB7 = PortB.Pin7; PortC0 = PortC.Pin0; PortC1 = PortC.Pin1; PortC2 = PortC.Pin2; PortC3 = PortC.Pin3; PortC4 = PortC.Pin4; PortC5 = PortC.Pin5; PortC6 = PortC.Pin6; PortC7 = PortC.Pin7; PortD0 = PortD.Pin0; PortD1 = PortD.Pin1; PortD2 = PortD.Pin2; PortD3 = PortD.Pin3; PortD4 = PortD.Pin4; PortD5 = PortD.Pin5; PortD6 = PortD.Pin6; PortD7 = PortD.Pin7; PortE0 = PortE.Pin0; PortE1 = PortE.Pin1; PortE2 = PortE.Pin2; PortE3 = PortE.Pin3; PortE4 = PortE.Pin4; PortE5 = PortE.Pin5; PortE6 = PortE.Pin6; PortE7 = PortE.Pin7; PortF0 = PortF.Pin0; PortF1 = PortF.Pin1; PortF2 = PortF.Pin2; PortF3 = PortF.Pin3; PortF4 = PortF.Pin4; PortF5 = PortF.Pin5; PortF6 = PortF.Pin6; PortF7 = PortF.Pin7; PortG0 = G0; PortG1 = G1; PortG2 = G2; PortG3 = G3; PortG4 = G4; } tinyos-2.1.2+dfsg/tos/chips/atm128/pins/HplAtm128GeneralIOPinP.nc000066400000000000000000000054521207233610700241460ustar00rootroot00000000000000/// $Id: HplAtm128GeneralIOPinP.nc,v 1.8 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Generic pin access for pins mapped into I/O space (for which the sbi, cbi * instructions give atomic updates). This can be used for ports A-E. * * @author Martin Turon * @author David Gay */ generic module HplAtm128GeneralIOPinP (uint8_t port_addr, uint8_t ddr_addr, uint8_t pin_addr, uint8_t bit) @safe() { provides interface GeneralIO as IO; } implementation { #define pin (*TCAST(volatile uint8_t * ONE, pin_addr)) #define port (*TCAST(volatile uint8_t * ONE, port_addr)) #define ddr (*TCAST(volatile uint8_t * ONE, ddr_addr)) inline async command bool IO.get() { return READ_BIT (pin, bit); } inline async command void IO.set() { SET_BIT (port, bit); } inline async command void IO.clr() { CLR_BIT (port, bit); } async command void IO.toggle() { atomic FLIP_BIT (port, bit); } inline async command void IO.makeInput() { CLR_BIT (ddr, bit); } inline async command bool IO.isInput() { return !READ_BIT(ddr, bit); } inline async command void IO.makeOutput() { SET_BIT (ddr, bit); } inline async command bool IO.isOutput() { return READ_BIT(ddr, bit); } } tinyos-2.1.2+dfsg/tos/chips/atm128/pins/HplAtm128GeneralIOPortP.nc000066400000000000000000000056321207233610700243440ustar00rootroot00000000000000/// $Id: HplAtm128GeneralIOPortP.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Generic component to expose a full 8-bit port of GPIO pins. * * @author Martin Turon */ generic configuration HplAtm128GeneralIOPortP (uint8_t port_addr, uint8_t ddr_addr, uint8_t pin_addr) { // provides all the ports as raw ports provides { interface GeneralIO as Pin0; interface GeneralIO as Pin1; interface GeneralIO as Pin2; interface GeneralIO as Pin3; interface GeneralIO as Pin4; interface GeneralIO as Pin5; interface GeneralIO as Pin6; interface GeneralIO as Pin7; } } implementation { components new HplAtm128GeneralIOPinP (port_addr, ddr_addr, pin_addr, 0) as Bit0, new HplAtm128GeneralIOPinP (port_addr, ddr_addr, pin_addr, 1) as Bit1, new HplAtm128GeneralIOPinP (port_addr, ddr_addr, pin_addr, 2) as Bit2, new HplAtm128GeneralIOPinP (port_addr, ddr_addr, pin_addr, 3) as Bit3, new HplAtm128GeneralIOPinP (port_addr, ddr_addr, pin_addr, 4) as Bit4, new HplAtm128GeneralIOPinP (port_addr, ddr_addr, pin_addr, 5) as Bit5, new HplAtm128GeneralIOPinP (port_addr, ddr_addr, pin_addr, 6) as Bit6, new HplAtm128GeneralIOPinP (port_addr, ddr_addr, pin_addr, 7) as Bit7; Pin0 = Bit0; Pin1 = Bit1; Pin2 = Bit2; Pin3 = Bit3; Pin4 = Bit4; Pin5 = Bit5; Pin6 = Bit6; Pin7 = Bit7; } tinyos-2.1.2+dfsg/tos/chips/atm128/pins/HplAtm128GeneralIOSlowPinP.nc000066400000000000000000000055401207233610700250110ustar00rootroot00000000000000/// $Id: HplAtm128GeneralIOSlowPinP.nc,v 1.8 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Generic pin access for pins not mapped into I/O space (for which the * sbi, cbi instructions cannot be used). This can be used for ports F-G. * * @author Martin Turon * @author David Gay */ generic module HplAtm128GeneralIOSlowPinP (uint8_t port_addr, uint8_t ddr_addr, uint8_t pin_addr, uint8_t bit) @safe() { provides interface GeneralIO as IO; } implementation { #define pin (*TCAST(volatile uint8_t * ONE, pin_addr)) #define port (*TCAST(volatile uint8_t * ONE, port_addr)) #define ddr (*TCAST(volatile uint8_t * ONE, ddr_addr)) inline async command bool IO.get() { return READ_BIT (pin, bit); } inline async command void IO.set() { atomic SET_BIT (port, bit); } inline async command void IO.clr() { atomic CLR_BIT (port, bit); } inline async command void IO.toggle() { atomic FLIP_BIT (port, bit); } inline async command void IO.makeInput() { atomic CLR_BIT (ddr, bit); } inline async command bool IO.isInput() { return !READ_BIT(ddr, bit); } inline async command void IO.makeOutput() { atomic SET_BIT (ddr, bit); } inline async command bool IO.isOutput() { return READ_BIT(ddr, bit); } } tinyos-2.1.2+dfsg/tos/chips/atm128/pins/HplAtm128Interrupt.nc000066400000000000000000000052221207233610700235410ustar00rootroot00000000000000/// $Id: HplAtm128Interrupt.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to an Atmega128 external interrupt pin * * @author Joe Polastre * @author Martin Turon */ interface HplAtm128Interrupt { /** * Enables ATmega128 hardware interrupt on a particular port */ async command void enable(); /** * Disables ATmega128 hardware interrupt on a particular port */ async command void disable(); /** * Clears the ATmega128 Interrupt Pending Flag for a particular port */ async command void clear(); /** * Gets the current value of the input voltage of a port * * @return TRUE if the pin is set high, FALSE if it is set low */ async command bool getValue(); /** * Sets whether the edge should be high to low or low to high. * @param TRUE if the interrupt should be triggered on a low to high * edge transition, false for interrupts on a high to low transition */ async command void edge(bool low_to_high); /** * Signalled when an interrupt occurs on a port */ async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/atm128/pins/HplAtm128InterruptC.nc000066400000000000000000000066071207233610700236540ustar00rootroot00000000000000/// $Id: HplAtm128InterruptC.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include /** * Component providing access to all external interrupt pins on ATmega128. * @author Martin Turon */ configuration HplAtm128InterruptC { // provides all the ports as raw ports provides { interface HplAtm128Interrupt as Int0; interface HplAtm128Interrupt as Int1; interface HplAtm128Interrupt as Int2; interface HplAtm128Interrupt as Int3; interface HplAtm128Interrupt as Int4; interface HplAtm128Interrupt as Int5; interface HplAtm128Interrupt as Int6; interface HplAtm128Interrupt as Int7; } } implementation { #define IRQ_PORT_D_PIN(bit) (uint8_t)&EICRA, ISC##bit##0, ISC##bit##1, bit #define IRQ_PORT_E_PIN(bit) (uint8_t)&EICRB, ISC##bit##0, ISC##bit##1, bit components HplAtm128InterruptSigP as IrqVector, new HplAtm128InterruptPinP(IRQ_PORT_D_PIN(0)) as IntPin0, new HplAtm128InterruptPinP(IRQ_PORT_D_PIN(1)) as IntPin1, new HplAtm128InterruptPinP(IRQ_PORT_D_PIN(2)) as IntPin2, new HplAtm128InterruptPinP(IRQ_PORT_D_PIN(3)) as IntPin3, new HplAtm128InterruptPinP(IRQ_PORT_E_PIN(4)) as IntPin4, new HplAtm128InterruptPinP(IRQ_PORT_E_PIN(5)) as IntPin5, new HplAtm128InterruptPinP(IRQ_PORT_E_PIN(6)) as IntPin6, new HplAtm128InterruptPinP(IRQ_PORT_E_PIN(7)) as IntPin7; Int0 = IntPin0; Int1 = IntPin1; Int2 = IntPin2; Int3 = IntPin3; Int4 = IntPin4; Int5 = IntPin5; Int6 = IntPin6; Int7 = IntPin7; IntPin0.IrqSignal -> IrqVector.IntSig0; IntPin1.IrqSignal -> IrqVector.IntSig1; IntPin2.IrqSignal -> IrqVector.IntSig2; IntPin3.IrqSignal -> IrqVector.IntSig3; IntPin4.IrqSignal -> IrqVector.IntSig4; IntPin5.IrqSignal -> IrqVector.IntSig5; IntPin6.IrqSignal -> IrqVector.IntSig6; IntPin7.IrqSignal -> IrqVector.IntSig7; } tinyos-2.1.2+dfsg/tos/chips/atm128/pins/HplAtm128InterruptPinP.nc000066400000000000000000000055631207233610700243400ustar00rootroot00000000000000/// $Id: HplAtm128InterruptPinP.nc,v 1.7 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interrupt interface access for interrupt capable GPIO pins. * * @author Martin Turon */ generic module HplAtm128InterruptPinP (uint8_t ctrl_addr, uint8_t edge0bit, uint8_t edge1bit, uint8_t bit) @safe() { provides interface HplAtm128Interrupt as Irq; uses interface HplAtm128InterruptSig as IrqSignal; } implementation { inline async command bool Irq.getValue() { return (EIFR & (1 << bit)) != 0; } inline async command void Irq.clear() { EIFR = 1 << bit; } inline async command void Irq.enable() { EIMSK |= 1 << bit; } inline async command void Irq.disable() { EIMSK &= ~(1 << bit); } #define ctrl (*TCAST(volatile uint8_t * ONE, ctrl_addr)) inline async command void Irq.edge(bool low_to_high) { ctrl |= 1 << edge1bit; // use edge mode // and select rising vs falling if (low_to_high) ctrl |= 1 << edge0bit; else ctrl &= ~(1 << edge0bit); } /** * Forward the external interrupt event. This ties the statically * allocated interrupt vector SIG_INTERRUPT##bit to a particular * pin passed in via the generic component instantiation. */ async event void IrqSignal.fired() { signal Irq.fired(); } default async event void Irq.fired() { } } tinyos-2.1.2+dfsg/tos/chips/atm128/pins/HplAtm128InterruptSig.nc000066400000000000000000000040331207233610700242030ustar00rootroot00000000000000/// $Id: HplAtm128InterruptSig.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to an Atmega128 external interrupt pin that exposes just the * interrupt vector routine for easy linking to generic components (see * HplAtm128Interrupt for the full interface). * * @author Martin Turon * @see HplAtm128Interrupt */ interface HplAtm128InterruptSig { /** * Signalled when an interrupt occurs on a pin */ async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/atm128/pins/HplAtm128InterruptSigP.nc000066400000000000000000000064211207233610700243260ustar00rootroot00000000000000/// $Id: HplAtm128InterruptSigP.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interrupt interface access for interrupt capable GPIO pins. * Exposes just the interrupt vector routine for * easy linking to generic components. * * @author Martin Turon */ module HplAtm128InterruptSigP @safe() { provides interface HplAtm128InterruptSig as IntSig0; provides interface HplAtm128InterruptSig as IntSig1; provides interface HplAtm128InterruptSig as IntSig2; provides interface HplAtm128InterruptSig as IntSig3; provides interface HplAtm128InterruptSig as IntSig4; provides interface HplAtm128InterruptSig as IntSig5; provides interface HplAtm128InterruptSig as IntSig6; provides interface HplAtm128InterruptSig as IntSig7; } implementation { default async event void IntSig0.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT0 ) { signal IntSig0.fired(); } default async event void IntSig1.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT1 ) { signal IntSig1.fired(); } default async event void IntSig2.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT2 ) { signal IntSig2.fired(); } default async event void IntSig3.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT3 ) { signal IntSig3.fired(); } default async event void IntSig4.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT4 ) { signal IntSig4.fired(); } default async event void IntSig5.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT5 ) { signal IntSig5.fired(); } default async event void IntSig6.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT6 ) { signal IntSig6.fired(); } default async event void IntSig7.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT7 ) { signal IntSig7.fired(); } } tinyos-2.1.2+dfsg/tos/chips/atm128/pins/sim/000077500000000000000000000000001207233610700204515ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128/pins/sim/HplAtm128GeneralIOC.nc000066400000000000000000000160321207233610700242460ustar00rootroot00000000000000// $Id: HplAtm128GeneralIOC.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /// @author Martin Turon /** * Provide GeneralIO interfaces for all of the ATmega128's pins. */ #include configuration HplAtm128GeneralIOC { // provides all the ports as raw ports provides { interface GeneralIO as PortA0; interface GeneralIO as PortA1; interface GeneralIO as PortA2; interface GeneralIO as PortA3; interface GeneralIO as PortA4; interface GeneralIO as PortA5; interface GeneralIO as PortA6; interface GeneralIO as PortA7; interface GeneralIO as PortB0; interface GeneralIO as PortB1; interface GeneralIO as PortB2; interface GeneralIO as PortB3; interface GeneralIO as PortB4; interface GeneralIO as PortB5; interface GeneralIO as PortB6; interface GeneralIO as PortB7; interface GeneralIO as PortC0; interface GeneralIO as PortC1; interface GeneralIO as PortC2; interface GeneralIO as PortC3; interface GeneralIO as PortC4; interface GeneralIO as PortC5; interface GeneralIO as PortC6; interface GeneralIO as PortC7; interface GeneralIO as PortD0; interface GeneralIO as PortD1; interface GeneralIO as PortD2; interface GeneralIO as PortD3; interface GeneralIO as PortD4; interface GeneralIO as PortD5; interface GeneralIO as PortD6; interface GeneralIO as PortD7; interface GeneralIO as PortE0; interface GeneralIO as PortE1; interface GeneralIO as PortE2; interface GeneralIO as PortE3; interface GeneralIO as PortE4; interface GeneralIO as PortE5; interface GeneralIO as PortE6; interface GeneralIO as PortE7; interface GeneralIO as PortF0; interface GeneralIO as PortF1; interface GeneralIO as PortF2; interface GeneralIO as PortF3; interface GeneralIO as PortF4; interface GeneralIO as PortF5; interface GeneralIO as PortF6; interface GeneralIO as PortF7; interface GeneralIO as PortG0; interface GeneralIO as PortG1; interface GeneralIO as PortG2; interface GeneralIO as PortG3; interface GeneralIO as PortG4; } } implementation { components new HplAtm128GeneralIOPortP((uint8_t)ATM128_PORTA, (uint8_t)ATM128_DDRA, (uint8_t)ATM128_PINA) as PortA, new HplAtm128GeneralIOPortP((uint8_t)ATM128_PORTB, (uint8_t)ATM128_DDRB, (uint8_t)ATM128_PINB) as PortB, new HplAtm128GeneralIOPortP((uint8_t)ATM128_PORTC, (uint8_t)ATM128_DDRC, (uint8_t)ATM128_PINC) as PortC, new HplAtm128GeneralIOPortP((uint8_t)ATM128_PORTD, (uint8_t)ATM128_DDRD, (uint8_t)ATM128_PIND) as PortD, new HplAtm128GeneralIOPortP((uint8_t)ATM128_PORTE, (uint8_t)ATM128_DDRE, (uint8_t)ATM128_PINE) as PortE, new HplAtm128GeneralIOPortP((uint8_t)ATM128_PORTF, (uint8_t)ATM128_DDRF, (uint8_t)ATM128_PINF) as PortF, // PortF cannot use sbi, cbi new HplAtm128GeneralIOSlowPinP((uint8_t)ATM128_PORTF, (uint8_t)ATM128_DDRF, (uint8_t)ATM128_PINF, 0) as F0, new HplAtm128GeneralIOSlowPinP((uint8_t)ATM128_PORTF, (uint8_t)ATM128_DDRF, (uint8_t)ATM128_PINF, 1) as F1, new HplAtm128GeneralIOSlowPinP((uint8_t)ATM128_PORTF, (uint8_t)ATM128_DDRF, (uint8_t)ATM128_PINF, 2) as F2, new HplAtm128GeneralIOSlowPinP((uint8_t)ATM128_PORTF, (uint8_t)ATM128_DDRF, (uint8_t)ATM128_PINF, 3) as F3, new HplAtm128GeneralIOSlowPinP((uint8_t)ATM128_PORTF, (uint8_t)ATM128_DDRF, (uint8_t)ATM128_PINF, 4) as F4, new HplAtm128GeneralIOSlowPinP((uint8_t)ATM128_PORTF, (uint8_t)ATM128_DDRF, (uint8_t)ATM128_PINF, 5) as F5, new HplAtm128GeneralIOSlowPinP((uint8_t)ATM128_PORTF, (uint8_t)ATM128_DDRF, (uint8_t)ATM128_PINF, 6) as F6, new HplAtm128GeneralIOSlowPinP((uint8_t)ATM128_PORTF, (uint8_t)ATM128_DDRF, (uint8_t)ATM128_PINF, 7) as F7, // PortG only exposes 5 bits and cannot use sbi, cbi new HplAtm128GeneralIOSlowPinP((uint8_t)ATM128_PORTG, (uint8_t)ATM128_DDRG, (uint8_t)ATM128_PING, 0) as G0, new HplAtm128GeneralIOSlowPinP((uint8_t)ATM128_PORTG, (uint8_t)ATM128_DDRG, (uint8_t)ATM128_PING, 1) as G1, new HplAtm128GeneralIOSlowPinP((uint8_t)ATM128_PORTG, (uint8_t)ATM128_DDRG, (uint8_t)ATM128_PING, 2) as G2, new HplAtm128GeneralIOSlowPinP((uint8_t)ATM128_PORTG, (uint8_t)ATM128_DDRG, (uint8_t)ATM128_PING, 3) as G3, new HplAtm128GeneralIOSlowPinP((uint8_t)ATM128_PORTG, (uint8_t)ATM128_DDRG, (uint8_t)ATM128_PING, 4) as G4 ; PortA0 = PortA.Pin0; PortA1 = PortA.Pin1; PortA2 = PortA.Pin2; PortA3 = PortA.Pin3; PortA4 = PortA.Pin4; PortA5 = PortA.Pin5; PortA6 = PortA.Pin6; PortA7 = PortA.Pin7; PortB0 = PortB.Pin0; PortB1 = PortB.Pin1; PortB2 = PortB.Pin2; PortB3 = PortB.Pin3; PortB4 = PortB.Pin4; PortB5 = PortB.Pin5; PortB6 = PortB.Pin6; PortB7 = PortB.Pin7; PortC0 = PortC.Pin0; PortC1 = PortC.Pin1; PortC2 = PortC.Pin2; PortC3 = PortC.Pin3; PortC4 = PortC.Pin4; PortC5 = PortC.Pin5; PortC6 = PortC.Pin6; PortC7 = PortC.Pin7; PortD0 = PortD.Pin0; PortD1 = PortD.Pin1; PortD2 = PortD.Pin2; PortD3 = PortD.Pin3; PortD4 = PortD.Pin4; PortD5 = PortD.Pin5; PortD6 = PortD.Pin6; PortD7 = PortD.Pin7; PortE0 = PortE.Pin0; PortE1 = PortE.Pin1; PortE2 = PortE.Pin2; PortE3 = PortE.Pin3; PortE4 = PortE.Pin4; PortE5 = PortE.Pin5; PortE6 = PortE.Pin6; PortE7 = PortE.Pin7; PortF0 = PortF.Pin0; PortF1 = PortF.Pin1; PortF2 = PortF.Pin2; PortF3 = PortF.Pin3; PortF4 = PortF.Pin4; PortF5 = PortF.Pin5; PortF6 = PortF.Pin6; PortF7 = PortF.Pin7; PortG0 = G0; PortG1 = G1; PortG2 = G2; PortG3 = G3; PortG4 = G4; } tinyos-2.1.2+dfsg/tos/chips/atm128/pins/sim/HplAtm128GeneralIOPinP.nc000066400000000000000000000054271207233610700247400ustar00rootroot00000000000000// $Id: HplAtm128GeneralIOPinP.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /// @author Martin Turon /// @author David Gay /** * Generic pin access for pins mapped into I/O space (for which the sbi, cbi * instructions give atomic updates). This can be used for ports A-E. */ generic module HplAtm128GeneralIOPinP (uint8_t port_addr, uint8_t ddr_addr, uint8_t pin_addr, uint8_t bit) { provides interface GeneralIO as IO; } implementation { #define pin pin_addr #define port port_addr #define ddr ddr_addr inline async command bool IO.get() { return READ_BIT (port, bit); } inline async command void IO.set() { dbg("Pins", "Setting bit %i of port %i.\n", (int)bit, (int)port); SET_BIT (port, bit); } inline async command void IO.clr() { CLR_BIT (port, bit); } inline async command void IO.toggle() { atomic FLIP_BIT (port, bit); } inline async command void IO.makeInput() { CLR_BIT (ddr, bit); } inline async command void IO.makeOutput() { SET_BIT (ddr, bit); } inline async command bool IO.isInput() { return !READ_BIT (ddr, bit); } inline async command bool IO.isOutput() { return READ_BIT (ddr, bit); } } tinyos-2.1.2+dfsg/tos/chips/atm128/sim/000077500000000000000000000000001207233610700175005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128/sim/McuSleepC.nc000066400000000000000000000077511207233610700216540ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * TOSSIM Implementation of TEP 112 (Microcontroller Power Management) * for the Atmega128. It currently does nothing. * *

     *  $Id: McuSleepC.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $
     * 
    * * @author Philip Levis * @date October 26, 2005 * */ module McuSleepC { provides { interface McuSleep; interface McuPowerState; } uses { interface McuPowerOverride; } } implementation { bool dirty = TRUE; mcu_power_t powerState = ATM128_POWER_IDLE; /* Note that the power values are maintained in an order * based on their active components, NOT on their values. * Look at atm128hardware.h and page 42 of the ATmeg128 * manual (figure 17).*/ // NOTE: This table should be in progmem. const uint8_t atm128PowerBits[ATM128_POWER_DOWN + 1] = { 0, (1 << SM0), (1 << SM2) | (1 << SM1) | (1 << SM0), (1 << SM1) | (1 << SM0), (1 << SM2) | (1 << SM1), (1 << SM1)}; mcu_power_t getPowerState() { uint8_t diff; // Are external timers running? if (TIMSK & ~((1 << OCIE0) | ( 1 << TOIE0))) { return ATM128_POWER_IDLE; } // SPI (Radio stack on mica/micaZ else if (READ_BIT(SPCR, SPIE)) { return ATM128_POWER_IDLE; } // UARTs are active else if (UCSR0B & ((1 << TXCIE) | (1 << RXCIE))) { // UART return ATM128_POWER_IDLE; } else if (UCSR1B & ((1 << TXCIE) | (1 << RXCIE))) { // UART return ATM128_POWER_IDLE; } // ADC is enbaled else if (READ_BIT(ADCSR, ADEN)) { return ATM128_POWER_ADC_NR; } // How soon for the timer to go off? else if (TIMSK & ((1< * * $Id: atm128hardware.h,v 1.8 2010-06-29 22:07:43 scipio Exp $ */ #ifndef _H_atmega128hardware_H #define _H_atmega128hardware_H #include #include uint8_t atm128RegFile[TOSSIM_MAX_NODES][0xa0]; #define REG_ACCESS(x) atm128RegFile[sim_node()][x] /* We need slightly different defs than SIGNAL, INTERRUPT */ #define AVR_ATOMIC_HANDLER(signame) \ void signame() @spontaneous() @C() #define AVR_NONATOMIC_HANDLER(signame) \ void signame() @spontaneous() @C() /* Macro to create union casting functions. */ #define DEFINE_UNION_CAST(func_name, from_type, to_type) \ to_type func_name(from_type x_type) { \ union {from_type f_type; to_type t_type;} c_type = {f_type:x_type}; return c_type.t_type; } // Bit operators using bit number #define SET_BIT(port, bit) ((REG_ACCESS(port)) |= _BV(bit)) #define CLR_BIT(port, bit) ((REG_ACCESS(port)) &= ~_BV(bit)) #define READ_BIT(port, bit) (((REG_ACCESS(port)) & _BV(bit)) != 0) #define FLIP_BIT(port, bit) ((REG_ACCESS(port)) ^= _BV(bit)) #define WRITE_BIT(port, bit, value) \ if (value) SET_BIT((port), (bit)); \ else CLR_BIT((port), (bit)) // Bit operators using bit flag mask #define SET_FLAG(port, flag) ((REG_ACCESS(port)) |= (flag)) #define CLR_FLAG(port, flag) ((REG_ACCESS(port)) &= ~(flag)) #define READ_FLAG(port, flag) ((REG_ACCESS(port)) & (flag)) #define sei() (SET_BIT(SREG, 7)) #define cli() (CLR_BIT(SREG, 7)) /* Enables interrupts. */ inline void __nesc_enable_interrupt() { sei(); } /* Disables all interrupts. */ inline void __nesc_disable_interrupt() { cli(); } /* Defines data type for storing interrupt mask state during atomic. */ typedef uint8_t __nesc_atomic_t; /* Saves current interrupt mask state and disables interrupts. */ inline __nesc_atomic_t __nesc_atomic_start(void) @spontaneous() { __nesc_atomic_t result = SREG; __nesc_disable_interrupt(); return result; } /* Restores interrupt mask to original state. */ inline void __nesc_atomic_end(__nesc_atomic_t original_SREG) @spontaneous() { SREG = original_SREG; } inline void __nesc_atomic_sleep() { //sbi(MCUCR, SE); power manager will enable/disable sleep sei(); // Make sure interrupts are on, so we can wake up! asm volatile ("sleep"); } typedef uint8_t mcu_power_t @combine("mcombine"); /* Combine function. */ mcu_power_t mcombine(mcu_power_t m1, mcu_power_t m2) { return (m1 < m2)? m1: m2; } enum { ATM128_POWER_IDLE = 0, ATM128_POWER_ADC_NR = 1, ATM128_POWER_EXT_STANDBY = 2, ATM128_POWER_SAVE = 3, ATM128_POWER_STANDBY = 4, ATM128_POWER_DOWN = 5, }; #endif //_H_atmega128hardware_H tinyos-2.1.2+dfsg/tos/chips/atm128/sim/crc.h000066400000000000000000000113071207233610700204220ustar00rootroot00000000000000// $Id: crc.h,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef CRC_H #define CRC_H uint16_t crcTable[256] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 }; uint16_t crcByte(uint16_t oldCrc, uint8_t byte) { #if 0 uint16_t *table = crcTable; uint16_t newCrc; asm ("eor %1,%B3\n" "\tlsl %1\n" "\tadc %B2, __zero_reg__\n" "\tadd %A2, %1\n" "\tadc %B2, __zero_reg__\n" "\tlpm\n" "\tmov %B0, %A3\n" "\tmov %A0, r0\n" "\tadiw r30,1\n" "\tlpm\n" "\teor %B0, r0" : "=r" (newCrc), "+r" (byte), "+z" (table) : "r" (oldCrc)); return newCrc; #else uint8_t *magic = (uint8_t *)&crcTable[oldCrc >> 8 ^ byte]; return *magic | ((uint8_t)oldCrc ^ *(magic + 1)) << 8; #endif } #endif tinyos-2.1.2+dfsg/tos/chips/atm128/spi/000077500000000000000000000000001207233610700175035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128/spi/Atm128Spi.h000066400000000000000000000056301207233610700213100ustar00rootroot00000000000000// $Id: Atm128Spi.h,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // @author Martin Turon #ifndef _H_Atm128SPI_h #define _H_Atm128SPI_h //====================== SPI Bus ================================== enum { ATM128_SPI_CLK_DIVIDE_4 = 0, ATM128_SPI_CLK_DIVIDE_16 = 1, ATM128_SPI_CLK_DIVIDE_64 = 2, ATM128_SPI_CLK_DIVIDE_128 = 3, }; /* SPI Control Register */ typedef struct { uint8_t spie : 1; //!< SPI Interrupt Enable uint8_t spe : 1; //!< SPI Enable uint8_t dord : 1; //!< SPI Data Order uint8_t mstr : 1; //!< SPI Master/Slave Select uint8_t cpol : 1; //!< SPI Clock Polarity uint8_t cpha : 1; //!< SPI Clock Phase uint8_t spr : 2; //!< SPI Clock Rate } Atm128SPIControl_s; typedef union { uint8_t flat; Atm128SPIControl_s bits; } Atm128SPIControl_t; typedef Atm128SPIControl_t Atm128_SPCR_t; //!< SPI Control Register /* SPI Status Register */ typedef struct { uint8_t spif : 1; //!< SPI Interrupt Flag uint8_t wcol : 1; //!< SPI Write COLision flag uint8_t rsvd : 5; //!< Reserved uint8_t spi2x : 1; //!< Whether we are in double speed } Atm128SPIStatus_s; typedef union { uint8_t flat; Atm128SPIStatus_s bits; } Atm128SPIStatus_t; typedef Atm128SPIStatus_t Atm128_SPSR_t; //!< SPI Status Register typedef uint8_t Atm128_SPDR_t; //!< SPI Data Register #endif //_H_Atm128SPI_h tinyos-2.1.2+dfsg/tos/chips/atm128/spi/Atm128Spi.nc000066400000000000000000000124351207233610700214620ustar00rootroot00000000000000/// $Id: Atm128Spi.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL-level access to the Atmega128 SPI bus. Refer to pages 162-9 * of the Atmega128 datasheet (rev. 2467M-AVR-11/04) for details. * *
     *  $Id: Atm128Spi.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $
     * 
    * * @author Philip Levis * @author Martin Turon * @date September 8 2005 */ #include "Atm128Spi.h" interface Atm128Spi { /* Modal functions */ /** Initialize the ATmega128 SPI bus into master mode. */ async command void initMaster(); /** Initialize the ATmega128 SPI bus into slave mode. */ async command void initSlave(); /** Disable and sleep the ATmega128 SPI bus. */ async command void sleep(); /* SPDR: SPI Data Register */ /** * Read the SPI data register * @return last data byte */ async command uint8_t read(); /** * Write the SPI data register * @param data next data byte */ async command void write(uint8_t data); /** * Interrupt signalling SPI data cycle is complete. * @param data data byte from data register */ async event void dataReady(uint8_t data); /* SPCR: SPI Control Register */ /* SPIE bit */ async command void enableInterrupt(bool enabled); async command bool isInterruptEnabled(); /* SPI bit */ async command void enableSpi(bool busOn); async command bool isSpiEnabled(); /* DORD bit */ async command void setDataOrder(bool lsbFirst); async command bool isOrderLsbFirst(); /* MSTR bit */ async command void setMasterBit(bool isMaster); async command bool isMasterBitSet(); /* CPOL bit */ async command void setClockPolarity(bool highWhenIdle); async command bool getClockPolarity(); /* CPHA bit */ async command void setClockPhase(bool sampleOnTrailing); async command bool getClockPhase(); /* SPR1 and SPR0 bits */ async command void setClock(uint8_t speed); async command uint8_t getClock(); /* SPSR: SPI Status Register */ /* SPIF bit */ async command bool isInterruptPending(); /* WCOL bit */ async command bool hasWriteCollided(); /* SPI2X bit */ async command bool isMasterDoubleSpeed(); async command void setMasterDoubleSpeed(bool on); } tinyos-2.1.2+dfsg/tos/chips/atm128/spi/Atm128SpiC.nc000066400000000000000000000102241207233610700215570ustar00rootroot00000000000000/// $Id: Atm128SpiC.nc,v 1.7 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * The HAL of the SPI bus on the atm128. * *
     *  $Id: Atm128SpiC.nc,v 1.7 2010-06-29 22:07:43 scipio Exp $
     * 
    * * * @author Philip Levis * @author Martin Turon * @author Joe Polastre * @date September 7 2005 */ configuration Atm128SpiC { provides interface Init; provides interface SpiByte; provides interface FastSpiByte; provides interface SpiPacket; provides interface Resource[uint8_t id]; } implementation { components Atm128SpiP as SpiMaster, HplAtm128SpiC as HplSpi; components new SimpleFcfsArbiterC("Atm128SpiC.Resource") as Arbiter; components McuSleepC; Init = SpiMaster; SpiByte = SpiMaster; FastSpiByte = SpiMaster; SpiPacket = SpiMaster; Resource = SpiMaster; SpiMaster.ResourceArbiter -> Arbiter; SpiMaster.ArbiterInfo -> Arbiter; SpiMaster.Spi -> HplSpi; SpiMaster.McuPowerState -> McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128/spi/Atm128SpiP.nc000066400000000000000000000311671207233610700216050ustar00rootroot00000000000000/// $Id: Atm128SpiP.nc,v 1.12 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /** * Primitives for accessing the SPI module on ATmega128 * microcontroller. This module assumes the bus has been reserved and * checks that the bus owner is in fact the person using the bus. * SpiPacket provides an asynchronous send interface where the * transmit data length is equal to the receive data length, while * SpiByte provides an interface for sending a single byte * synchronously. SpiByte allows a component to send a few bytes * in a simple fashion: if more than a handful need to be sent, * SpiPacket should be used. * * *
     *  $Id: Atm128SpiP.nc,v 1.12 2010-06-29 22:07:43 scipio Exp $
     * 
    * * @author Philip Levis * @author Joe Polastre * @author Martin Turon * */ module Atm128SpiP @safe() { provides { interface Init; interface SpiByte; interface FastSpiByte; interface SpiPacket; interface Resource[uint8_t id]; } uses { interface Atm128Spi as Spi; interface Resource as ResourceArbiter[uint8_t id]; interface ArbiterInfo; interface McuPowerState; } } implementation { uint16_t len; uint8_t* COUNT_NOK(len) txBuffer; uint8_t* COUNT_NOK(len) rxBuffer; uint16_t pos; enum { SPI_IDLE, SPI_BUSY, SPI_ATOMIC_SIZE = 10, }; command error_t Init.init() { return SUCCESS; } //default clockrate: 4000 kHz #ifndef SPI_CLOCKRATE #define SPI_CLOCKRATE 4000 #endif #if !defined(PLATFORM_MHZ) && defined(MHZ) enum { PLATFORM_MHZ = MHZ }; #endif void startSpi() { call Spi.enableSpi(FALSE); atomic { call Spi.initMaster(); call Spi.enableInterrupt(FALSE); call Spi.setClockPolarity(FALSE); call Spi.setClockPhase(FALSE); call Spi.enableSpi(TRUE); //calculating prescaler for desired spi clockrate with floor function to the nearest available clockrate #if (PLATFORM_MHZ*1000)/SPI_CLOCKRATE>=64 call Spi.setMasterDoubleSpeed(FALSE); call Spi.setClock(3); #elif (PLATFORM_MHZ*1000)/SPI_CLOCKRATE>=32 call Spi.setMasterDoubleSpeed(FALSE); call Spi.setClock(2); #elif (PLATFORM_MHZ*1000)/SPI_CLOCKRATE>=16 call Spi.setMasterDoubleSpeed(TRUE); call Spi.setClock(2); #elif (PLATFORM_MHZ*1000)/SPI_CLOCKRATE>=8 call Spi.setMasterDoubleSpeed(FALSE); call Spi.setClock(1); #elif (PLATFORM_MHZ*1000)/SPI_CLOCKRATE>=4 call Spi.setMasterDoubleSpeed(TRUE); call Spi.setClock(1); #elif (PLATFORM_MHZ*1000)/SPI_CLOCKRATE>=2 call Spi.setMasterDoubleSpeed(FALSE); call Spi.setClock(0); #else call Spi.setMasterDoubleSpeed(TRUE); call Spi.setClock(0); #endif } call McuPowerState.update(); } void stopSpi() { call Spi.enableSpi(FALSE); atomic { call Spi.sleep(); } call McuPowerState.update(); } async command uint8_t SpiByte.write( uint8_t tx ) { /* There is no need to enable the SPI bus and update the power state here since that must have been done when the resource was granted. However there seems to be a bug somewhere in the radio driver for the MicaZ platform so we cannot remove the following two lines before that problem is resolved. (Miklos Maroti) */ #ifdef PLATFORM_MICAZ call Spi.enableSpi(TRUE); call McuPowerState.update(); #endif call Spi.write( tx ); while( ! call Spi.isInterruptPending() ) ; return call Spi.read(); } inline async command void FastSpiByte.splitWrite(uint8_t data) { call Spi.write(data); } inline async command uint8_t FastSpiByte.splitRead() { while( ! call Spi.isInterruptPending() ) ; return call Spi.read(); } inline async command uint8_t FastSpiByte.splitReadWrite(uint8_t data) { uint8_t b; while( ! call Spi.isInterruptPending() ) ; b = call Spi.read(); call Spi.write(data); return b; } inline async command uint8_t FastSpiByte.write(uint8_t data) { call Spi.write(data); while( ! call Spi.isInterruptPending() ) ; return call Spi.read(); } /** * This component sends SPI packets in chunks of size SPI_ATOMIC_SIZE * (which is normally 5). The tradeoff is between SPI performance * (throughput) and how much the component limits concurrency in the * rest of the system. Handling an interrupt on each byte is * very expensive: the context saving/register spilling constrains * the rate at which one can write out bytes. A more efficient * approach is to write out a byte and wait for a few cycles until * the byte is written (a tiny spin loop). This leads to greater * throughput, but blocks the system and prevents it from doing * useful work. * * This component takes a middle ground. When asked to transmit X * bytes in a packet, it transmits those X bytes in 10-byte parts. * sendNextPart() is responsible for sending one such * part. It transmits bytes with the SpiByte interface, which * disables interrupts and spins on the SPI control register for * completion. On the last byte, however, sendNextPart * re-enables SPI interrupts and sends the byte through the * underlying split-phase SPI interface. When this component handles * the SPI transmit completion event (handles the SPI interrupt), * it calls sendNextPart() again. As the SPI interrupt does * not disable interrupts, this allows processing in the rest of the * system to continue. */ error_t sendNextPart() { uint16_t end; uint16_t tmpPos; uint16_t myLen; uint8_t* COUNT_NOK(myLen) tx; uint8_t* COUNT_NOK(myLen) rx; atomic { myLen = len; tx = txBuffer; rx = rxBuffer; tmpPos = pos; end = pos + SPI_ATOMIC_SIZE; end = (end > len)? len:end; } for (;tmpPos < (end - 1) ; tmpPos++) { uint8_t val; if (tx != NULL) val = call SpiByte.write( tx[tmpPos] ); else val = call SpiByte.write( 0 ); if (rx != NULL) { rx[tmpPos] = val; } } // For the last byte, we re-enable interrupts. call Spi.enableInterrupt(TRUE); atomic { if (tx != NULL) call Spi.write(tx[tmpPos]); else call Spi.write(0); pos = tmpPos; // The final increment will be in the interrupt // handler. } return SUCCESS; } task void zeroTask() { uint16_t myLen; uint8_t* COUNT_NOK(myLen) rx; uint8_t* COUNT_NOK(myLen) tx; atomic { myLen = len; rx = rxBuffer; tx = txBuffer; rxBuffer = NULL; txBuffer = NULL; len = 0; pos = 0; signal SpiPacket.sendDone(tx, rx, myLen, SUCCESS); } } /** * Send bufLen bytes in writeBuf and receive bufLen bytes * into readBuf. If readBuf is NULL, bytes will be * read out of the SPI, but they will be discarded. A byte is read * from the SPI before writing and discarded (to clear any buffered * bytes that might have been left around). * * This command only sets up the state variables and clears the SPI: * sendNextPart() does the real work. * * If there's a send of zero bytes, short-circuit and just post * a task to signal the sendDone. This generally occurs due to an * error in the caler, but signaling an event will hopefully let * it recover better than returning FAIL. */ async command error_t SpiPacket.send(uint8_t* writeBuf, uint8_t* readBuf, uint16_t bufLen) { uint8_t discard; atomic { len = bufLen; txBuffer = writeBuf; rxBuffer = readBuf; pos = 0; } if (bufLen > 0) { discard = call Spi.read(); return sendNextPart(); } else { post zeroTask(); return SUCCESS; } } default async event void SpiPacket.sendDone (uint8_t* _txbuffer, uint8_t* _rxbuffer, uint16_t _length, error_t _success) { } async event void Spi.dataReady(uint8_t data) { bool again; atomic { if (rxBuffer != NULL) { rxBuffer[pos] = data; // Increment position } pos++; } call Spi.enableInterrupt(FALSE); atomic { again = (pos < len); } if (again) { sendNextPart(); } else { uint8_t discard; uint16_t myLen; uint8_t* COUNT_NOK(myLen) rx; uint8_t* COUNT_NOK(myLen) tx; atomic { myLen = len; rx = rxBuffer; tx = txBuffer; rxBuffer = NULL; txBuffer = NULL; len = 0; pos = 0; } discard = call Spi.read(); signal SpiPacket.sendDone(tx, rx, myLen, SUCCESS); } } async command error_t Resource.immediateRequest[ uint8_t id ]() { error_t result = call ResourceArbiter.immediateRequest[ id ](); if ( result == SUCCESS ) { startSpi(); } return result; } async command error_t Resource.request[ uint8_t id ]() { atomic { if (!call ArbiterInfo.inUse()) { startSpi(); } } return call ResourceArbiter.request[ id ](); } async command error_t Resource.release[ uint8_t id ]() { error_t error = call ResourceArbiter.release[ id ](); atomic { if (!call ArbiterInfo.inUse()) { stopSpi(); } } return error; } async command bool Resource.isOwner[uint8_t id]() { return call ResourceArbiter.isOwner[id](); } event void ResourceArbiter.granted[ uint8_t id ]() { signal Resource.granted[ id ](); } default event void Resource.granted[ uint8_t id ]() {} } tinyos-2.1.2+dfsg/tos/chips/atm128/spi/HplAtm128SpiC.nc000066400000000000000000000075051207233610700222330ustar00rootroot00000000000000/// $Id: HplAtm128SpiC.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Configuration encapsulating the basic SPI HPL for the atm128. * *
     * $Id: HplAtm128SpiC.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $
     * 
    * * @author Philip Levis * @author Martin Turon */ configuration HplAtm128SpiC { provides interface Atm128Spi as SpiBus; } implementation { components HplAtm128GeneralIOC as IO, HplAtm128SpiP as HplSpi; components McuSleepC; SpiBus = HplSpi; HplSpi.Mcu -> McuSleepC; HplSpi.SS -> IO.PortB0; // Slave set line HplSpi.SCK -> IO.PortB1; // SPI clock line HplSpi.MOSI -> IO.PortB2; // Master out, slave in HplSpi.MISO -> IO.PortB3; // Master in, slave out } tinyos-2.1.2+dfsg/tos/chips/atm128/spi/HplAtm128SpiP.nc000066400000000000000000000157331207233610700222520ustar00rootroot00000000000000/// $Id: HplAtm128SpiP.nc,v 1.7 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the SPI bus abstraction for the atm128 * microcontroller. * * @author Philip Levis * @author Martin Turon */ #include "Atm128Spi.h" module HplAtm128SpiP @safe() { provides interface Atm128Spi as SPI; provides interface AsyncStdControl; uses { interface GeneralIO as SS; // Slave set line interface GeneralIO as SCK; // SPI clock line interface GeneralIO as MOSI; // Master out, slave in interface GeneralIO as MISO; // Master in, slave out interface McuPowerState as Mcu; } } implementation { async command error_t AsyncStdControl.start() { call SPI.enableSpi(TRUE); } async command error_t AsyncStdControl.stop() { call SPI.enableInterrupt(FALSE); call SPI.enableSpi(FALSE); } async command void SPI.initMaster() { call MOSI.makeOutput(); call MISO.makeInput(); call SCK.makeOutput(); call SS.makeOutput(); // otherwise the SPI can go slave mode call SPI.setMasterBit(TRUE); } async command void SPI.initSlave() { call MISO.makeOutput(); call MOSI.makeInput(); call SCK.makeInput(); call SS.makeInput(); call SPI.setMasterBit(FALSE); } async command void SPI.sleep() { } async command uint8_t SPI.read() { return SPDR; } async command void SPI.write(uint8_t d) { SPDR = d; } default async event void SPI.dataReady(uint8_t d) {} AVR_ATOMIC_HANDLER(SIG_SPI) { signal SPI.dataReady(call SPI.read()); } //=== SPI Bus utility routines. ==================================== async command bool SPI.isInterruptPending() { return READ_BIT(SPSR, SPIF); } async command bool SPI.isInterruptEnabled () { return READ_BIT(SPCR, SPIE); } async command void SPI.enableInterrupt(bool enabled) { if (enabled) { SET_BIT(SPCR, SPIE); call Mcu.update(); } else { CLR_BIT(SPCR, SPIE); call Mcu.update(); } } async command bool SPI.isSpiEnabled() { return READ_BIT(SPCR, SPE); } async command void SPI.enableSpi(bool enabled) { if (enabled) { SET_BIT(SPCR, SPE); call Mcu.update(); } else { CLR_BIT(SPCR, SPE); call Mcu.update(); } } /* DORD bit */ async command void SPI.setDataOrder(bool lsbFirst) { if (lsbFirst) { SET_BIT(SPCR, DORD); } else { CLR_BIT(SPCR, DORD); } } async command bool SPI.isOrderLsbFirst() { return READ_BIT(SPCR, DORD); } /* MSTR bit */ async command void SPI.setMasterBit(bool isMaster) { if (isMaster) { SET_BIT(SPCR, MSTR); } else { CLR_BIT(SPCR, MSTR); } } async command bool SPI.isMasterBitSet() { return READ_BIT(SPCR, MSTR); } /* CPOL bit */ async command void SPI.setClockPolarity(bool highWhenIdle) { if (highWhenIdle) { SET_BIT(SPCR, CPOL); } else { CLR_BIT(SPCR, CPOL); } } async command bool SPI.getClockPolarity() { return READ_BIT(SPCR, CPOL); } /* CPHA bit */ async command void SPI.setClockPhase(bool sampleOnTrailing) { if (sampleOnTrailing) { SET_BIT(SPCR, CPHA); } else { CLR_BIT(SPCR, CPHA); } } async command bool SPI.getClockPhase() { return READ_BIT(SPCR, CPHA); } async command uint8_t SPI.getClock () { return READ_FLAG(SPCR, ((1 << SPR1) | (1 << SPR0))); } async command void SPI.setClock (uint8_t v) { v &= (1 << SPR1) | (1 << SPR0); SPCR = (SPCR & ~((1 << SPR1) | (1 << SPR0))) | v; } async command bool SPI.hasWriteCollided() { return READ_BIT(SPSR, WCOL); } async command bool SPI.isMasterDoubleSpeed() { return READ_BIT(SPSR, SPI2X); } async command void SPI.setMasterDoubleSpeed(bool on) { if (on) { SET_BIT(SPSR, SPI2X); } else { CLR_BIT(SPSR, SPI2X); } } } tinyos-2.1.2+dfsg/tos/chips/atm128/spi/sim/000077500000000000000000000000001207233610700202735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128/spi/sim/Atm128SpiC.nc000066400000000000000000000044431207233610700223550ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The simulated HAL of the SPI bus on the atm128, which just maps to * the platform-specific implementation of the device end point. * *
     *  $Id: Atm128SpiC.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $
     * 
    * * * @author Philip Levis * @date November 22 2005 */ configuration Atm128SpiC { provides interface Init; provides interface SPIByte; provides interface SPIPacket; provides interface Resource[uint8_t id]; } implementation { components SimAtm128SpiDeviceC as Device; components new SimpleFcfsArbiterC("Atm128SpiC.Resource") as Arbiter; components McuSleepC; Init = Device; SPIByte = Device; SPIPacket = Device; Resource = Arbiter; Device.McuPowerState -> McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/000077500000000000000000000000001207233610700200305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128/timer/Atm128AlarmAsyncC.nc000066400000000000000000000027611207233610700234120ustar00rootroot00000000000000// $Id: Atm128AlarmAsyncC.nc,v 1.3 2007-05-23 22:49:08 idgay Exp $ /* * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Build a 32-bit alarm and counter from the atmega128's 8-bit timer 0 * in asynchronous mode. Attempting to use the generic Atm128AlarmC * component and the generic timer components runs into problems * apparently related to letting timer 0 overflow. * * So, instead, this version (inspired by the 1.x code and a remark from * Martin Turon) directly builds a 32-bit alarm and counter on top of timer 0 * and never lets timer 0 overflow. * * @author David Gay */ generic configuration Atm128AlarmAsyncC(typedef precision, int divider) { provides { interface Init @atleastonce(); interface Alarm; interface Counter; } } implementation { components new Atm128AlarmAsyncP(precision, divider), HplAtm128Timer0AsyncC; Init = Atm128AlarmAsyncP; Alarm = Atm128AlarmAsyncP; Counter = Atm128AlarmAsyncP; Atm128AlarmAsyncP.Timer -> HplAtm128Timer0AsyncC; Atm128AlarmAsyncP.TimerCtrl -> HplAtm128Timer0AsyncC; Atm128AlarmAsyncP.Compare -> HplAtm128Timer0AsyncC; Atm128AlarmAsyncP.TimerAsync -> HplAtm128Timer0AsyncC; } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/Atm128AlarmAsyncP.nc000066400000000000000000000145071207233610700234300ustar00rootroot00000000000000// $Id: Atm128AlarmAsyncP.nc,v 1.8 2008-06-26 03:38:27 regehr Exp $ /* * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Build a 32-bit alarm and counter from the atmega128's 8-bit timer 0 * in asynchronous mode. Attempting to use the generic Atm128AlarmC * component and the generic timer components runs into problems * apparently related to letting timer 0 overflow. * * So, instead, this version (inspired by the 1.x code and a remark from * Martin Turon) directly builds a 32-bit alarm and counter on top of timer 0 * and never lets timer 0 overflow. * * @author David Gay */ generic module Atm128AlarmAsyncP(typedef precision, int divider) @safe() { provides { interface Init; interface Alarm; interface Counter; } uses { interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; interface HplAtm128TimerAsync as TimerAsync; } } implementation { uint8_t set; /* Is the alarm set? */ uint32_t t0, dt; /* Time of the next alarm */ norace uint32_t base; /* base+TCNT0 is the current time if no interrupt is pending. See Counter.get() for the full details. */ enum { MINDT = 2, /* Minimum interval between interrupts */ MAXT = 230 /* Maximum value to let timer 0 reach (from Joe Polastre and Robert Szewczyk's painful experiences with the 1.x timer ;-)) */ }; void setInterrupt(); /* Configure timer 0 */ command error_t Init.init() { atomic { Atm128TimerControl_t x; call TimerAsync.setTimer0Asynchronous(); x.flat = 0; x.bits.cs = divider; x.bits.wgm1 = 1; /* We use the clear-on-compare mode */ call TimerCtrl.setControl(x); call Compare.set(MAXT); /* setInterrupt needs a valid value here */ call Compare.start(); } setInterrupt(); return SUCCESS; } /* Set compare register for timer 0 to n. But increment n by 1 if TCNT0 reaches this value before we can set the compare register. */ void setOcr0(uint8_t n) { while (call TimerAsync.compareBusy()) ; if (n == call Timer.get()) n++; /* Support for overflow. Force interrupt at wrap around value. This does not cause a backwards-in-time value as we do this every time we set OCR0. */ if (base + n + 1 < base) n = -base - 1; call Compare.set(n); } /* Update the compare register to trigger an interrupt at the appropriate time based on the current alarm settings */ void setInterrupt() { bool fired = FALSE; atomic { /* interrupt_in is the time to the next interrupt. Note that compare register values are off by 1 (i.e., if you set OCR0 to 3, the interrupt will happen whjen TCNT0 is 4) */ uint8_t interrupt_in = 1 + call Compare.get() - call Timer.get(); uint8_t newOcr0; uint8_t tifr = (uint8_t)((call TimerCtrl.getInterruptFlag()).flat); dbg("Atm128AlarmAsyncP", "Atm128AlarmAsyncP: TIFR is %hhx\n", tifr); if ((interrupt_in != 0 && interrupt_in < MINDT) || (tifr & (1 << OCF0))) { if (interrupt_in < MINDT) { dbg("Atm128AlarmAsyncP", "Atm128AlarmAsyncP: under min: %hhu.\n", interrupt_in); } else { dbg("Atm128AlarmAsyncP", "Atm128AlarmAsyncP: OCF set.\n"); } return; // wait for next interrupt } /* When no alarm is set, we just ask for an interrupt every MAXT */ if (!set) { newOcr0 = MAXT; dbg("Atm128AlarmAsyncP", "Atm128AlarmAsyncP: no alarm set, set at max.\n"); } else { uint32_t now = call Counter.get(); dbg("Atm128AlarmAsyncP", "Atm128AlarmAsyncP: now-t0 = %llu, dt = %llu\n", (now-t0), dt); /* Check if alarm expired */ if ((uint32_t)(now - t0) >= dt) { set = FALSE; fired = TRUE; newOcr0 = MAXT; } else { /* No. Set compare register to time of next alarm if it's within the next MAXT units */ uint32_t alarm_in = (t0 + dt) - base; if (alarm_in > MAXT) newOcr0 = MAXT; else if ((uint8_t)alarm_in < MINDT) // alarm_in < MAXT ... newOcr0 = MINDT; else newOcr0 = alarm_in; } } newOcr0--; // interrupt is 1ms late setOcr0(newOcr0); } if (fired) signal Alarm.fired(); } async event void Compare.fired() { int overflowed; /* Compare register fired. Update time knowledge */ base += call Compare.get() + 1U; // interrupt is 1ms late overflowed = !base; __nesc_enable_interrupt(); setInterrupt(); if (overflowed) signal Counter.overflow(); } async command uint32_t Counter.get() { uint32_t now; atomic { /* Current time is base+TCNT0 if no interrupt is pending. But if an interrupt is pending, then it's base + compare value + 1 + TCNT0 */ uint8_t now8 = call Timer.get(); if ((call TimerCtrl.getInterruptFlag()).bits.ocf0) /* We need to reread TCNT0 as it might've overflowed after we read TCNT0 the first time */ now = base + call Compare.get() + 1 + call Timer.get(); else /* We need to use the value of TCNT0 from before we check the interrupt flag, as it might wrap around after the check */ now = base + now8; } return now; } async command bool Counter.isOverflowPending() { atomic return (call TimerCtrl.getInterruptFlag()).bits.ocf0 && !(base + call Compare.get() + 1); } async command void Counter.clearOverflow() { atomic if (call Counter.isOverflowPending()) { base = 0; call Compare.reset(); } else return; setInterrupt(); } async command void Alarm.start(uint32_t ndt) { call Alarm.startAt(call Counter.get(), ndt); } async command void Alarm.stop() { atomic set = FALSE; } async command bool Alarm.isRunning() { atomic return set; } async command void Alarm.startAt(uint32_t nt0, uint32_t ndt) { atomic { set = TRUE; t0 = nt0; dt = ndt; } setInterrupt(); } async command uint32_t Alarm.getNow() { return call Counter.get(); } async command uint32_t Alarm.getAlarm() { atomic return t0 + dt; } async event void Timer.overflow() { } } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/Atm128AlarmC.nc000066400000000000000000000110711207233610700224060ustar00rootroot00000000000000/// $Id: Atm128AlarmC.nc,v 1.9 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Build a TEP102 Alarm from an Atmega128 hardware timer and one of its * compare registers. * @param frequency_tag The frequency tag for this Alarm * @param timer_size The width of this Alarm * @param mindt The shortest time in the future this Alarm can be set * (in its own time units). Has to be at least 2, as setting a compare * register one above the current counter value is unreliable. Has to be * large enough that the Alarm time does not pass between the computation * of expires and actually setting the compare register. * Check this (for high-frequency timers) by inspecting the generated * assembly code... * * @author Martin Turon * @author David Gay */ generic module Atm128AlarmC(typedef frequency_tag, typedef timer_size @integer(), int mindt) @safe() { provides interface Alarm as Alarm @atmostonce(); uses interface HplAtm128Timer; uses interface HplAtm128Compare; } implementation { async command timer_size Alarm.getNow() { return call HplAtm128Timer.get(); } async command timer_size Alarm.getAlarm() { return call HplAtm128Compare.get(); } async command bool Alarm.isRunning() { return call HplAtm128Compare.isOn(); } async command void Alarm.stop() { call HplAtm128Compare.stop(); } async command void Alarm.start( timer_size dt ) { call Alarm.startAt( call HplAtm128Timer.get(), dt); } async command void Alarm.startAt( timer_size t0, timer_size dt ) { /* We don't set an interrupt before "now" + mindt to avoid setting an interrupt which is in the past by the time we actually set it. mindt should always be at least 2, because you cannot reliably set an interrupt one cycle in the future. mindt should also be large enough to cover the execution time of this function. */ atomic { timer_size now, elapsed, expires; dbg("Atm128AlarmC", " starting timer at %llu with dt %llu\n", (uint64_t)t0, (uint64_t) dt); now = call HplAtm128Timer.get(); elapsed = now + mindt - t0; if (elapsed >= dt) expires = now + mindt; else expires = t0 + dt; /* Setting the compare register to "-1" is a bad idea (interrupt fires before counter overflow is detected, and all the "current time" stuff goes bad) */ if (expires == 0) expires = 1; /* Note: all HplAtm128Compare.set values have one subtracted, because the comparisons are continuous, but the actual interrupt is signalled at the next timer clock cycle. */ call HplAtm128Compare.set(expires - 1); call HplAtm128Compare.reset(); call HplAtm128Compare.start(); } } async event void HplAtm128Compare.fired() { call HplAtm128Compare.stop(); dbg("Atm128AlarmC", " Compare fired, signal alarm above.\n"); __nesc_enable_interrupt(); signal Alarm.fired(); } async event void HplAtm128Timer.overflow() { } } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/Atm128Calibrate.nc000066400000000000000000000041021207233610700231320ustar00rootroot00000000000000// $Id: Atm128Calibrate.nc,v 1.4 2006-12-12 18:23:04 vlahan Exp $ /* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * This interface provides functions to compute ATmega128 configuration * values that are clock-rate dependent. These include:
      *
    • the ADC prescaler value necessary for full precision *
    • values for the UBRR registers to achieve a specific baud rate *
    • any adjustment necessary to values passed to some platform-provided * AlarmMicroXXC components to get more accurate timing *
    • the number of cycles per 1/32768s (a typical implementation of this * interface will measure this value at boot time and use it to compute * the values above) *
    * * @author David Gay */ interface Atm128Calibrate { /** * Return CPU cycles per 1/32768s. * @return CPU cycles. */ async command uint16_t cyclesPerJiffy(); /** * Convert n microseconds into a value suitable for use with * AlarmMicro32C Alarms. * @param n Time in microseconds. * @return AlarmMicro argument that best approximates n microseconds. */ async command uint32_t calibrateMicro(uint32_t n); /** * Convert values used by AlarmMicro32C Alarms into actual microseconds. * @param n A time expressed in AlarmMicro time units. * @return Time in microseconds that corresponds to AlarmMicro argument n. */ async command uint32_t actualMicro(uint32_t n); /** * Return the smallest ADC prescaler value which guaranteers full * ADC precision. * @return ADC prescaler value. */ async command uint8_t adcPrescaler(); /** * Return the value to use for the baudrate register to achieve a * particular baud rate. Assumes U2X=1 (the USART is being run at * double speed). */ async command uint16_t baudrateRegister(uint32_t baudrate); } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/Atm128CaptureC.nc000066400000000000000000000075401207233610700227630ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: Atm128CaptureC.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ */ /** * Exposes Capture capability of hardware as general interface, * with some ATmega128 specific dependencies including: * Only available with the two 16-bit timers. * Each Timer has only one dedicated capture pin. * Timer1 == PortD.Pin4 [D4] * Timer3 == PortE.Pin7 [E7] * So selection of 16-bit timer gives implicit wiring of actual Pin to capture. * * @author Alan Broad, Crossbow * @author Matt Miller, Crossbow * @author Martin Turon, Crossbow */ generic module Atm128CaptureC () { provides { interface Capture as CapturePin; } uses { interface HplAtm128Capture; // interface HplAtm128Timer as Timer; // interface GeneralIO as PinToCapture; // implicit to timer used } } implementation { // ************* CapturePin Interrupt handlers and dispatch ************* /** * CapturePin.enableCapture * * Configure Atmega128 TIMER to capture edge input of CapturePin signal. * This will cause an interrupt and save TIMER count. * TIMER Timebase is set by stdControl.start * -- see HplAtm128Capture interface and HplAtm128TimerM implementation */ async command error_t CapturePin.enableCapture(bool low_to_high) { atomic { call HplAtm128Capture.stop(); // clear any capture interrupt call HplAtm128Capture.setEdge(low_to_high); call HplAtm128Capture.reset(); call HplAtm128Capture.start(); } return SUCCESS; } async command error_t CapturePin.disable() { call HplAtm128Capture.stop(); return SUCCESS; } /** * Handle signal from HplAtm128Capture interface indicating an external * event has been timestamped. * Signal client with time and disable capture timer if nolonger needed. */ async event void HplAtm128Capture.captured(uint16_t time) { // first, signal client error_t val = signal CapturePin.captured(time); if (val == FAIL) { // if client returns failure, stop time capture call HplAtm128Capture.stop(); } else { // otherwise, time capture keeps running, reset if needed if (call HplAtm128Capture.test()) call HplAtm128Capture.reset(); } } } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/Atm128CounterC.nc000066400000000000000000000046201207233610700227730ustar00rootroot00000000000000//$Id: Atm128CounterC.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Build a TEP102 Counter from an Atmega128 hardware timer. * @param frequency_tag The frequency tag for this Counter * @param timer_size The width of this Counter * * @author Martin Turon */ generic module Atm128CounterC(typedef frequency_tag, typedef timer_size @integer()) @safe() { provides interface Counter as Counter; uses interface HplAtm128Timer as Timer; } implementation { async command timer_size Counter.get() { return call Timer.get(); } async command bool Counter.isOverflowPending() { return call Timer.test(); } async command void Counter.clearOverflow() { call Timer.reset(); } async event void Timer.overflow() { signal Counter.overflow(); } } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/Atm128GpioCaptureC.nc000066400000000000000000000052211207233610700235740ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: Atm128GpioCaptureC.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $ */ /** * Expose capture capability as a GpioCapture interface from TEP117. * * @author Martin Turon, Crossbow */ generic module Atm128GpioCaptureC() @safe() { provides interface GpioCapture as Capture; uses interface HplAtm128Capture as Atm128Capture; } implementation { error_t enableCapture( uint8_t mode ) { atomic { call Atm128Capture.stop(); call Atm128Capture.reset(); call Atm128Capture.setEdge( mode ); call Atm128Capture.start(); } return SUCCESS; } async command error_t Capture.captureRisingEdge() { return enableCapture( TRUE ); } async command error_t Capture.captureFallingEdge() { return enableCapture( FALSE ); } async command void Capture.disable() { call Atm128Capture.stop(); } async event void Atm128Capture.captured( uint16_t time ) { // The flag is automatically cleared, clearing it again can cause missed interrupts // call Atm128Capture.reset(); signal Capture.captured( time ); } } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/Atm128Timer.h000066400000000000000000000264261207233610700221700ustar00rootroot00000000000000// $Id: Atm128Timer.h,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * This file contains the configuration constants for the Atmega128 * clocks and timers. * * @author Philip Levis * @author Martin Turon * @date September 21 2005 */ #ifndef _H_Atm128Timer_h #define _H_Atm128Timer_h //====================== 8 bit Timers ================================== // Timer0 and Timer2 are 8-bit timers. /* 8-bit Timer0 clock source select bits CS02, CS01, CS0 (page 103, ATmega128L data sheet Rev. 2467M-AVR-11/04 */ enum { ATM128_CLK8_OFF = 0x0, ATM128_CLK8_NORMAL = 0x1, ATM128_CLK8_DIVIDE_8 = 0x2, ATM128_CLK8_DIVIDE_32 = 0x3, ATM128_CLK8_DIVIDE_64 = 0x4, ATM128_CLK8_DIVIDE_128 = 0x5, ATM128_CLK8_DIVIDE_256 = 0x6, ATM128_CLK8_DIVIDE_1024 = 0x7, }; enum { ATM128_CLK16_OFF = 0x0, ATM128_CLK16_NORMAL = 0x1, ATM128_CLK16_DIVIDE_8 = 0x2, ATM128_CLK16_DIVIDE_64 = 0x3, ATM128_CLK16_DIVIDE_256 = 0x4, ATM128_CLK16_DIVIDE_1024 = 0x5, ATM128_CLK16_EXTERNAL_FALL = 0x6, ATM128_CLK16_EXTERNAL_RISE = 0x7, }; /* Common scales across both 8-bit and 16-bit clocks. */ enum { AVR_CLOCK_OFF = 0, AVR_CLOCK_ON = 1, AVR_CLOCK_DIVIDE_8 = 2, }; /* 8-bit Waveform Generation Modes */ enum { ATM128_WAVE8_NORMAL = 0, ATM128_WAVE8_PWM, ATM128_WAVE8_CTC, ATM128_WAVE8_PWM_FAST, }; /* 8-bit Timer compare settings */ enum { ATM128_COMPARE_OFF = 0, //!< compare disconnected ATM128_COMPARE_TOGGLE, //!< toggle on match (PWM reserved ATM128_COMPARE_CLEAR, //!< clear on match (PWM downcount) ATM128_COMPARE_SET, //!< set on match (PWN upcount) }; /* 8-bit Timer Control Register */ typedef union { uint8_t flat; struct { uint8_t cs : 3; //!< Clock Source Select uint8_t wgm1 : 1; //!< Waveform generation mode (high bit) uint8_t com : 2; //!< Compare Match Output uint8_t wgm0 : 1; //!< Waveform generation mode (low bit) uint8_t foc : 1; //!< Force Output Compare } bits; } Atm128TimerControl_t; typedef Atm128TimerControl_t Atm128_TCCR0_t; //!< Timer0 Control Register typedef uint8_t Atm128_TCNT0_t; //!< Timer0 Control Register typedef uint8_t Atm128_OCR0_t; //!< Timer0 Output Compare Register typedef Atm128TimerControl_t Atm128_TCCR2_t; //!< Timer2 Control Register typedef uint8_t Atm128_TCNT2_t; //!< Timer2 Control Register typedef uint8_t Atm128_OCR2_t; //!< Timer2 Output Compare Register // Timer2 shares compare lines with Timer1C /* Asynchronous Status Register -- Timer0 */ typedef union { uint8_t flat; struct { uint8_t tcr0ub : 1; //!< Timer0 Control Resgister Update Busy uint8_t ocr0ub : 1; //!< Timer0 Output Compare Register Update Busy uint8_t tcn0ub : 1; //!< Timer0 Update Busy uint8_t as0 : 1; //!< Asynchronous Timer/Counter (off=CPU,on=32KHz osc) uint8_t rsvd : 4; //!< Reserved } bits; } Atm128Assr_t; /* Timer/Counter Interrupt Mask Register */ typedef union { uint8_t flat; struct { uint8_t toie0 : 1; //!< Timer0 Overflow Interrupt Enable uint8_t ocie0 : 1; //!< Timer0 Output Compare Interrupt Enable uint8_t toie1 : 1; //!< Timer1 Overflow Interrupt Enable uint8_t ocie1b: 1; //!< Timer1 Output Compare B Interrupt Enable uint8_t ocie1a: 1; //!< Timer1 Output Compare A Interrupt Enable uint8_t ticie1: 1; //!< Timer1 Input Capture Enable uint8_t toie2 : 1; //!< Timer2 Overflow Interrupt Enable uint8_t ocie2 : 1; //!< Timer2 Output Compare Interrupt Enable } bits; } Atm128_TIMSK_t; // + Note: Contains some 16-bit Timer flags /* Timer/Counter Interrupt Flag Register */ typedef union { uint8_t flat; struct { uint8_t tov0 : 1; //!< Timer0 Overflow Flag uint8_t ocf0 : 1; //!< Timer0 Output Compare Flag uint8_t tov1 : 1; //!< Timer1 Overflow Flag uint8_t ocf1b : 1; //!< Timer1 Output Compare B Flag uint8_t ocf1a : 1; //!< Timer1 Output Compare A Flag uint8_t icf1 : 1; //!< Timer1 Input Capture Flag uint8_t tov2 : 1; //!< Timer2 Overflow Flag uint8_t ocf2 : 1; //!< Timer2 Output Compare Flag } bits; } Atm128_TIFR_t; // + Note: Contains some 16-bit Timer flags /* Timer/Counter Interrupt Flag Register */ typedef union { uint8_t flat; struct { uint8_t psr321 : 1; //!< Prescaler Reset Timer1,2,3 uint8_t psr0 : 1; //!< Prescaler Reset Timer0 uint8_t pud : 1; //!< uint8_t acme : 1; //!< uint8_t rsvd : 3; //!< Reserved uint8_t tsm : 1; //!< Timer/Counter Synchronization Mode } bits; } Atm128_SFIOR_t; //====================== 16 bit Timers ================================== // Timer1 and Timer3 are both 16-bit, and have three compare channels: (A,B,C) enum { ATM128_TIMER_COMPARE_NORMAL = 0, ATM128_TIMER_COMPARE_TOGGLE, ATM128_TIMER_COMPARE_CLEAR, ATM128_TIMER_COMPARE_SET }; /* Timer/Counter Control Register A Type */ typedef union { uint8_t flat; struct { uint8_t wgm10 : 2; //!< Waveform generation mode uint8_t comC : 2; //!< Compare Match Output C uint8_t comB : 2; //!< Compare Match Output B uint8_t comA : 2; //!< Compare Match Output A } bits; } Atm128TimerCtrlCompare_t; /* Timer1 Compare Control Register A */ typedef Atm128TimerCtrlCompare_t Atm128_TCCR1A_t; /* Timer3 Compare Control Register A */ typedef Atm128TimerCtrlCompare_t Atm128_TCCR3A_t; /* 16-bit Waveform Generation Modes */ enum { ATM128_WAVE16_NORMAL = 0, ATM128_WAVE16_PWM_8BIT, ATM128_WAVE16_PWM_9BIT, ATM128_WAVE16_PWM_10BIT, ATM128_WAVE16_CTC_COMPARE, ATM128_WAVE16_PWM_FAST_8BIT, ATM128_WAVE16_PWM_FAST_9BIT, ATM128_WAVE16_PWM_FAST_10BIT, ATM128_WAVE16_PWM_CAPTURE_LOW, ATM128_WAVE16_PWM_COMPARE_LOW, ATM128_WAVE16_PWM_CAPTURE_HIGH, ATM128_WAVE16_PWM_COMPARE_HIGH, ATM128_WAVE16_CTC_CAPTURE, ATM128_WAVE16_RESERVED, ATM128_WAVE16_PWM_FAST_CAPTURE, ATM128_WAVE16_PWM_FAST_COMPARE, }; /* Timer/Counter Control Register B Type */ typedef union { uint8_t flat; struct { uint8_t cs : 3; //!< Clock Source Select uint8_t wgm32 : 2; //!< Waveform generation mode uint8_t rsvd : 1; //!< Reserved uint8_t ices1 : 1; //!< Input Capture Edge Select (1=rising, 0=falling) uint8_t icnc1 : 1; //!< Input Capture Noise Canceler } bits; } Atm128TimerCtrlCapture_t; /* Timer1 Control Register B */ typedef Atm128TimerCtrlCapture_t Atm128_TCCR1B_t; /* Timer3 Control Register B */ typedef Atm128TimerCtrlCapture_t Atm128_TCCR3B_t; /* Timer/Counter Control Register C Type */ typedef union { uint8_t flat; struct { uint8_t rsvd : 5; //!< Reserved uint8_t focC : 1; //!< Force Output Compare Channel C uint8_t focB : 1; //!< Force Output Compare Channel B uint8_t focA : 1; //!< Force Output Compare Channel A } bits; } Atm128TimerCtrlClock_t; /* Timer1 Control Register B */ typedef Atm128TimerCtrlClock_t Atm128_TCCR1C_t; /* Timer3 Control Register B */ typedef Atm128TimerCtrlClock_t Atm128_TCCR3C_t; // Read/Write these 16-bit Timer registers according to p.112: // Access as bytes. Read low before high. Write high before low. typedef uint8_t Atm128_TCNT1H_t; //!< Timer1 Register typedef uint8_t Atm128_TCNT1L_t; //!< Timer1 Register typedef uint8_t Atm128_TCNT3H_t; //!< Timer3 Register typedef uint8_t Atm128_TCNT3L_t; //!< Timer3 Register /* Contains value to continuously compare with Timer1 */ typedef uint8_t Atm128_OCR1AH_t; //!< Output Compare Register 1A typedef uint8_t Atm128_OCR1AL_t; //!< Output Compare Register 1A typedef uint8_t Atm128_OCR1BH_t; //!< Output Compare Register 1B typedef uint8_t Atm128_OCR1BL_t; //!< Output Compare Register 1B typedef uint8_t Atm128_OCR1CH_t; //!< Output Compare Register 1C typedef uint8_t Atm128_OCR1CL_t; //!< Output Compare Register 1C /* Contains value to continuously compare with Timer3 */ typedef uint8_t Atm128_OCR3AH_t; //!< Output Compare Register 3A typedef uint8_t Atm128_OCR3AL_t; //!< Output Compare Register 3A typedef uint8_t Atm128_OCR3BH_t; //!< Output Compare Register 3B typedef uint8_t Atm128_OCR3BL_t; //!< Output Compare Register 3B typedef uint8_t Atm128_OCR3CH_t; //!< Output Compare Register 3C typedef uint8_t Atm128_OCR3CL_t; //!< Output Compare Register 3C /* Contains counter value when event occurs on ICPn pin. */ typedef uint8_t Atm128_ICR1H_t; //!< Input Capture Register 1 typedef uint8_t Atm128_ICR1L_t; //!< Input Capture Register 1 typedef uint8_t Atm128_ICR3H_t; //!< Input Capture Register 3 typedef uint8_t Atm128_ICR3L_t; //!< Input Capture Register 3 /* Extended Timer/Counter Interrupt Mask Register */ typedef union { uint8_t flat; struct { uint8_t ocie1c: 1; //!< Timer1 Output Compare C Interrupt Enable uint8_t ocie3c: 1; //!< Timer3 Output Compare C Interrupt Enable uint8_t toie3 : 1; //!< Timer3 Overflow Interrupt Enable uint8_t ocie3b: 1; //!< Timer3 Output Compare B Interrupt Enable uint8_t ocie3a: 1; //!< Timer3 Output Compare A Interrupt Enable uint8_t ticie3: 1; //!< Timer3 Input Capture Interrupt Enable uint8_t rsvd : 2; //!< Timer2 Output Compare Interrupt Enable } bits; } Atm128_ETIMSK_t; /* Extended Timer/Counter Interrupt Flag Register */ typedef union { uint8_t flat; struct { uint8_t ocf1c : 1; //!< Timer1 Output Compare C Flag uint8_t ocf3c : 1; //!< Timer3 Output Compare C Flag uint8_t tov3 : 1; //!< Timer/Counter Overflow Flag uint8_t ocf3b : 1; //!< Timer3 Output Compare B Flag uint8_t ocf3a : 1; //!< Timer3 Output Compare A Flag uint8_t icf3 : 1; //!< Timer3 Input Capture Flag uint8_t rsvd : 2; //!< Reserved } bits; } Atm128_ETIFR_t; /* Resource strings for timer 1 and 3 compare registers */ #define UQ_TIMER1_COMPARE "atm128.timer1" #define UQ_TIMER3_COMPARE "atm128.timer3" #endif //_H_Atm128Timer_h tinyos-2.1.2+dfsg/tos/chips/atm128/timer/Atm128TimerInitC.nc000066400000000000000000000045011207233610700232560ustar00rootroot00000000000000/// $Id: Atm128TimerInitC.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Initialise an Atmega128 timer to a particular prescaler. Expected to be * used at boot time. * @param timer_size Integer type of the timer * @param prescaler Desired prescaler value * * @author Martin Turon * @author David Gay */ generic module Atm128TimerInitC(typedef timer_size @integer(), uint8_t prescaler) @safe() { provides interface Init @atleastonce(); uses interface HplAtm128Timer as Timer; } implementation { command error_t Init.init() { atomic { call Timer.set(0); call Timer.start(); call Timer.setScale(prescaler); } return SUCCESS; } async event void Timer.overflow() { } } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/HplAtm128Capture.nc000066400000000000000000000061001207233610700233130ustar00rootroot00000000000000/// $Id: HplAtm128Capture.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL Interface to Atmega128 capture capabilities. * @param size_type Integer type of capture register * * @author Martin Turon */ interface HplAtm128Capture { // ==== Capture value register: Direct access ====================== /** * Get the time to be captured. * @return the capture time */ async command size_type get(); /** * Set the time to be captured. * @param t the time of the next capture event */ async command void set(size_type t); // ==== Interrupt signals ========================================== /** * Signalled on capture interrupt. * @param t the time of the capture event */ async event void captured(size_type t); // ==== Interrupt flag utilites: Bit level set/clr ================= /** Clear the capture interrupt flag. */ async command void reset(); /** Enable the capture interrupt. */ async command void start(); /** Turn off capture interrupts. */ async command void stop(); /** * Did a capture interrupt occur? * @return TRUE if capture triggered, FALSE otherwise */ async command bool test(); /** * Is capture interrupt on? * @return TRUE if capture enabled, FALSE otherwise */ async command bool isOn(); /** * Sets the capture edge. * @param up TRUE = detect rising edge, FALSE = detect falling edge */ async command void setEdge(bool up); } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/HplAtm128Compare.nc000066400000000000000000000056111207233610700233040ustar00rootroot00000000000000/// $Id: HplAtm128Compare.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL Interface to Atmega128 compare registers. * @param size_type Integer type of compare register * * @author Martin Turon */ interface HplAtm128Compare { // ==== Compare value register: Direct access ====================== /** * Get the compare time to fire on. * @return the compare time value */ async command size_type get(); /** * Set the compare time to fire on. * @param t the compare time to set */ async command void set(size_type t); // ==== Interrupt signals ========================================== /** Signalled on interrupt. */ async event void fired(); // * This interface is designed to be independent of whether the underlying * hardware is an 8-bit or 16-bit wide counter. As such, timer_size is * specified via a generics parameter. Because this is exposing a common * subset of functionality that all ATmega128 hardware timers share, all * that is exposed is access to the overflow capability. Compare and capture * functionality are exposed on separate interfaces to allow easy * configurability via wiring. *

    * This interface provides four major groups of functionality:

      *
    1. Timer Value: get/set current time *
    2. Overflow Interrupt event *
    3. Control of Overflow Interrupt: start/stop/clear... *
    4. Timer Initialization: turn on/off clock source *
    * * @author Martin Turon */ interface HplAtm128Timer { /** * Get the current time. * @return the current time */ async command timer_size get(); /** * Set the current time. * @param t the time to set */ async command void set( timer_size t ); /** Signalled on timer overflow interrupt. */ async event void overflow(); // ==== Interrupt flag utilites: Bit level set/clr ================= /** Clear the overflow interrupt flag. */ async command void reset(); /** Enable the overflow interrupt. */ async command void start(); /** Turn off overflow interrupts. */ async command void stop(); /** * Did an overflow interrupt occur? * @return TRUE if overflow triggered, FALSE otherwise */ async command bool test(); /** * Is overflow interrupt on? * @return TRUE if overflow enabled, FALSE otherwise */ async command bool isOn(); // ==== Clock initialization interface ============================= /** Turn off the clock. */ async command void off(); /** * Turn on the clock. * @param scale Prescaler setting of clock -- see Atm128Timer.h */ async command void setScale( uint8_t scale); /** * Get prescaler setting. * @return Prescaler setting of clock -- see Atm128Timer.h */ async command uint8_t getScale(); } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/HplAtm128Timer0AsyncC.nc000066400000000000000000000046171207233610700241640ustar00rootroot00000000000000/// $Id: HplAtm128Timer0AsyncC.nc,v 1.7 2007-03-29 21:07:25 idgay Exp $ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Simple wrapper around the actual timer implementation that automatically * wires it to McuSleepC for low-power calculations.. * * @author Philip Levis * @author David Gay */ #include configuration HplAtm128Timer0AsyncC { provides { // 8-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; interface HplAtm128TimerAsync as TimerAsync; } } implementation { components HplAtm128Timer0AsyncP; components McuSleepC; McuSleepC.McuPowerOverride -> HplAtm128Timer0AsyncP; Timer = HplAtm128Timer0AsyncP; TimerCtrl = HplAtm128Timer0AsyncP; Compare = HplAtm128Timer0AsyncP; TimerAsync = HplAtm128Timer0AsyncP; } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/HplAtm128Timer0AsyncP.nc000066400000000000000000000174241207233610700242010ustar00rootroot00000000000000/// $Id: HplAtm128Timer0AsyncP.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL interface to Atmega128 timer 0 in ASYNC mode. This is a specialised * HPL component that assumes that timer 0 is used in ASYNC mode and * includes some workarounds for some of the weirdnesses (delayed overflow * interrupt) of that mode. * * @author Martin Turon * @author David Gay */ #include module HplAtm128Timer0AsyncP @safe() { provides { // 8-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; interface McuPowerOverride; interface HplAtm128TimerAsync as TimerAsync; } } implementation { //=== Read the current timer value. =================================== async command uint8_t Timer.get() { return TCNT0; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint8_t t) { TCNT0 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR0 & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128TimerControl_t x = call TimerCtrl.getControl(); x.bits.cs = s; call TimerCtrl.setControl(x); } //=== Read the control registers. ===================================== async command Atm128TimerControl_t TimerCtrl.getControl() { return *(Atm128TimerControl_t*)&TCCR0; } //=== Write the control registers. ==================================== async command void TimerCtrl.setControl( Atm128TimerControl_t x ) { TCCR0 = x.flat; } //=== Read the interrupt mask. ===================================== async command Atm128_TIMSK_t TimerCtrl.getInterruptMask() { return *(Atm128_TIMSK_t*)&TIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask8_2int, Atm128_TIMSK_t, uint8_t); DEFINE_UNION_CAST(TimerMask16_2int, Atm128_ETIMSK_t, uint8_t); async command void TimerCtrl.setInterruptMask( Atm128_TIMSK_t x ) { TIMSK = TimerMask8_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_TIFR_t TimerCtrl.getInterruptFlag() { return *(Atm128_TIFR_t*)&TIFR; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags8_2int, Atm128_TIFR_t, uint8_t); DEFINE_UNION_CAST(TimerFlags16_2int, Atm128_ETIFR_t, uint8_t); async command void TimerCtrl.setInterruptFlag( Atm128_TIFR_t x ) { TIFR = TimerFlags8_2int(x); } //=== Timer 8-bit implementation. ==================================== async command void Timer.reset() { TIFR = 1 << TOV0; } async command void Timer.start() { SET_BIT(TIMSK, TOIE0); } async command void Timer.stop() { CLR_BIT(TIMSK, TOIE0); } bool overflowed() { return (call TimerCtrl.getInterruptFlag()).bits.tov0; } async command bool Timer.test() { return overflowed(); } async command bool Timer.isOn() { return (call TimerCtrl.getInterruptMask()).bits.toie0; } async command void Compare.reset() { TIFR = 1 << OCF0; } async command void Compare.start() { SET_BIT(TIMSK,OCIE0); } async command void Compare.stop() { CLR_BIT(TIMSK,OCIE0); } async command bool Compare.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf0; } async command bool Compare.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie0; } //=== Read the compare registers. ===================================== async command uint8_t Compare.get() { return OCR0; } //=== Write the compare registers. ==================================== async command void Compare.set(uint8_t t) { OCR0 = t; } //=== Timer interrupts signals ======================================== inline void stabiliseTimer0() { TCCR0 = TCCR0; while (ASSR & 1 << TCR0UB) ; } /** * On the atm128, there is a small latency when waking up from * POWER_SAVE mode. So if a timer is going to go off very soon, it's * better to drop down until EXT_STANDBY, which has a 6 cycle wakeup * latency. This function calculates whether staying in EXT_STANDBY * is needed. If the timer is not running it returns POWER_DOWN. * Please refer to TEP 112 and the atm128 datasheet for details. */ async command mcu_power_t McuPowerOverride.lowestState() { uint8_t diff; // We need to make sure that the sleep wakeup latency will not // cause us to miss a timer. POWER_SAVE if (TIMSK & (1 << OCIE0 | 1 << TOIE0)) { // need to wait for timer 0 updates propagate before sleeping // (we don't need to worry about reentering sleep mode too early, // as the wake ups from timer0 wait at least one TOSC1 cycle // anyway - see the stabiliseTimer0 function) while (ASSR & (1 << TCN0UB | 1 << OCR0UB | 1 << TCR0UB)) ; diff = OCR0 - TCNT0; if (diff < EXT_STANDBY_T0_THRESHOLD || TCNT0 > 256 - EXT_STANDBY_T0_THRESHOLD) return ATM128_POWER_EXT_STANDBY; return ATM128_POWER_SAVE; } else { return ATM128_POWER_DOWN; } } default async event void Compare.fired() { } AVR_ATOMIC_HANDLER(SIG_OUTPUT_COMPARE0) { stabiliseTimer0(); signal Compare.fired(); } default async event void Timer.overflow() { } AVR_ATOMIC_HANDLER(SIG_OVERFLOW0) { stabiliseTimer0(); signal Timer.overflow(); } // Asynchronous status register support async command Atm128Assr_t TimerAsync.getAssr() { return *(Atm128Assr_t *)&ASSR; } async command void TimerAsync.setAssr(Atm128Assr_t x) { ASSR = x.flat; } async command void TimerAsync.setTimer0Asynchronous() { ASSR |= 1 << AS0; } async command int TimerAsync.controlBusy() { return (ASSR & (1 << TCR0UB)) != 0; } async command int TimerAsync.compareBusy() { return (ASSR & (1 << OCR0UB)) != 0; } async command int TimerAsync.countBusy() { return (ASSR & (1 << TCN0UB)) != 0; } } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/HplAtm128Timer1C.nc000066400000000000000000000046241207233610700231650ustar00rootroot00000000000000/// $Id: HplAtm128Timer1C.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL interface to Atmega128 timer 1. * * @author Martin Turon * @author David Gay */ configuration HplAtm128Timer1C { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as Compare[uint8_t id]; } } implementation { components HplAtm128Timer0AsyncC, HplAtm128Timer1P; Timer = HplAtm128Timer1P; TimerCtrl = HplAtm128Timer1P; Capture = HplAtm128Timer1P; Compare[0] = HplAtm128Timer1P.CompareA; Compare[1] = HplAtm128Timer1P.CompareB; Compare[2] = HplAtm128Timer1P.CompareC; HplAtm128Timer1P.Timer0Ctrl -> HplAtm128Timer0AsyncC; } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/HplAtm128Timer1P.nc000066400000000000000000000216141207233610700232000ustar00rootroot00000000000000/// $Id: HplAtm128Timer1P.nc,v 1.8 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Internal component of the HPL interface to Atmega128 timer 1. * * @author Martin Turon */ #include module HplAtm128Timer1P @safe() { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as CompareA; interface HplAtm128Compare as CompareB; interface HplAtm128Compare as CompareC; } uses interface HplAtm128TimerCtrl8 as Timer0Ctrl; } implementation { //=== Read the current timer value. =================================== async command uint16_t Timer.get() { return TCNT1; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint16_t t) { TCNT1 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR1B & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128TimerCtrlCapture_t x = call TimerCtrl.getCtrlCapture(); x.bits.cs = s; call TimerCtrl.setCtrlCapture(x); } //=== Read the control registers. ===================================== async command Atm128TimerCtrlCompare_t TimerCtrl.getCtrlCompare() { return *(Atm128TimerCtrlCompare_t*ONE)&TCCR1A; } async command Atm128TimerCtrlCapture_t TimerCtrl.getCtrlCapture() { return *(Atm128TimerCtrlCapture_t*ONE)&TCCR1B; } async command Atm128TimerCtrlClock_t TimerCtrl.getCtrlClock() { return *(Atm128TimerCtrlClock_t*ONE)&TCCR1C; } //=== Control registers utilities. ================================== DEFINE_UNION_CAST(TimerCtrlCompare2int, Atm128TimerCtrlCompare_t, uint16_t); DEFINE_UNION_CAST(TimerCtrlCapture2int, Atm128TimerCtrlCapture_t, uint16_t); DEFINE_UNION_CAST(TimerCtrlClock2int, Atm128TimerCtrlClock_t, uint16_t); //=== Write the control registers. ==================================== async command void TimerCtrl.setCtrlCompare( Atm128_TCCR1A_t x ) { TCCR1A = TimerCtrlCompare2int(x); } async command void TimerCtrl.setCtrlCapture( Atm128_TCCR1B_t x ) { TCCR1B = TimerCtrlCapture2int(x); } async command void TimerCtrl.setCtrlClock( Atm128_TCCR1C_t x ) { TCCR1C = TimerCtrlClock2int(x); } //=== Read the interrupt mask. ===================================== async command Atm128_ETIMSK_t TimerCtrl.getInterruptMask() { return *(Atm128_ETIMSK_t*)&ETIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask8_2int, Atm128_TIMSK_t, uint8_t); DEFINE_UNION_CAST(TimerMask16_2int, Atm128_ETIMSK_t, uint8_t); async command void TimerCtrl.setInterruptMask( Atm128_ETIMSK_t x ) { ETIMSK = TimerMask16_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_ETIFR_t TimerCtrl.getInterruptFlag() { return *(Atm128_ETIFR_t*ONE)&ETIFR; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags8_2int, Atm128_TIFR_t, uint8_t); DEFINE_UNION_CAST(TimerFlags16_2int, Atm128_ETIFR_t, uint8_t); async command void TimerCtrl.setInterruptFlag( Atm128_ETIFR_t x ) { ETIFR = TimerFlags16_2int(x); } //=== Capture 16-bit implementation. =================================== async command void Capture.setEdge(bool up) { WRITE_BIT(TCCR1B,ICES1, up); } //=== Timer 16-bit implementation. =================================== async command void Timer.reset() { TIFR = 1 << TOV1; } async command void Capture.reset() { TIFR = 1 << ICF1; } async command void CompareA.reset() { TIFR = 1 << OCF1A; } async command void CompareB.reset() { TIFR = 1 << OCF1B; } async command void CompareC.reset() { ETIFR = 1 << OCF1C; } async command void Timer.start() { SET_BIT(TIMSK,TOIE1); } async command void Capture.start() { SET_BIT(TIMSK,TICIE1); } async command void CompareA.start() { SET_BIT(TIMSK,OCIE1A); } async command void CompareB.start() { SET_BIT(TIMSK,OCIE1B); } async command void CompareC.start() { SET_BIT(ETIMSK,OCIE1C); } async command void Timer.stop() { CLR_BIT(TIMSK,TOIE1); } async command void Capture.stop() { CLR_BIT(TIMSK,TICIE1); } async command void CompareA.stop() { CLR_BIT(TIMSK,OCIE1A); } async command void CompareB.stop() { CLR_BIT(TIMSK,OCIE1B); } async command void CompareC.stop() { CLR_BIT(ETIMSK,OCIE1C); } // Note: Many Timer interrupt flags are on Timer0 register async command bool Timer.test() { return (call Timer0Ctrl.getInterruptFlag()).bits.tov1; } async command bool Capture.test() { return (call Timer0Ctrl.getInterruptFlag()).bits.icf1; } async command bool CompareA.test() { return (call Timer0Ctrl.getInterruptFlag()).bits.ocf1a; } async command bool CompareB.test() { return (call Timer0Ctrl.getInterruptFlag()).bits.ocf1b; } async command bool CompareC.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf1c; } // Note: Many Timer interrupt mask bits are on Timer0 register async command bool Timer.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.toie1; } async command bool Capture.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.ticie1; } async command bool CompareA.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.ocie1a; } async command bool CompareB.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.ocie1b; } async command bool CompareC.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie1c; } //=== Read the compare registers. ===================================== async command uint16_t CompareA.get() { return OCR1A; } async command uint16_t CompareB.get() { return OCR1B; } async command uint16_t CompareC.get() { return OCR1C; } //=== Write the compare registers. ==================================== async command void CompareA.set(uint16_t t) { OCR1A = t; } async command void CompareB.set(uint16_t t) { OCR1B = t; } async command void CompareC.set(uint16_t t) { OCR1C = t; } //=== Read the capture registers. ===================================== async command uint16_t Capture.get() { return ICR1; } //=== Write the capture registers. ==================================== async command void Capture.set(uint16_t t) { ICR1 = t; } //=== Timer interrupts signals ======================================== default async event void CompareA.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE1A) { signal CompareA.fired(); } default async event void CompareB.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE1B) { signal CompareB.fired(); } default async event void CompareC.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE1C) { signal CompareC.fired(); } default async event void Capture.captured(uint16_t time) { } AVR_NONATOMIC_HANDLER(SIG_INPUT_CAPTURE1) { signal Capture.captured(call Capture.get()); } default async event void Timer.overflow() { } AVR_NONATOMIC_HANDLER(SIG_OVERFLOW1) { signal Timer.overflow(); } } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/HplAtm128Timer2C.nc000066400000000000000000000131521207233610700231620ustar00rootroot00000000000000/// $Id: HplAtm128Timer2C.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL interface to Atmega128 timer 2. * * @author Martin Turon */ #include module HplAtm128Timer2C { provides { interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; } } implementation { //=== Read the current timer value. =================================== async command uint8_t Timer.get() { return TCNT2; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint8_t t) { TCNT2 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR2 & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128TimerControl_t x = call TimerCtrl.getControl(); x.bits.cs = s; call TimerCtrl.setControl(x); } //=== Read the control registers. ===================================== async command Atm128TimerControl_t TimerCtrl.getControl() { return *(Atm128TimerControl_t*)&TCCR2; } //=== Control registers utilities. ================================== DEFINE_UNION_CAST(TimerCtrlCompareint, Atm128TimerCtrlCompare_t, uint16_t); DEFINE_UNION_CAST(TimerCtrlCapture2int, Atm128TimerCtrlCapture_t, uint16_t); DEFINE_UNION_CAST(TimerCtrlClock2int, Atm128TimerCtrlClock_t, uint16_t); //=== Write the control registers. ==================================== async command void TimerCtrl.setControl( Atm128TimerControl_t x ) { TCCR2 = x.flat; } //=== Read the interrupt mask. ===================================== async command Atm128_TIMSK_t TimerCtrl.getInterruptMask() { return *(Atm128_TIMSK_t*)&TIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask8_2int, Atm128_TIMSK_t, uint8_t); async command void TimerCtrl.setInterruptMask( Atm128_TIMSK_t x ) { TIMSK = TimerMask8_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_TIFR_t TimerCtrl.getInterruptFlag() { return *(Atm128_TIFR_t*)&TIFR; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags8_2int, Atm128_TIFR_t, uint8_t); async command void TimerCtrl.setInterruptFlag( Atm128_TIFR_t x ) { TIFR = TimerFlags8_2int(x); } //=== Timer 8-bit implementation. ==================================== async command void Timer.reset() { TIFR = 1 << TOV2; } async command void Timer.start() { SET_BIT(TIMSK,TOIE2); } async command void Timer.stop() { CLR_BIT(TIMSK,TOIE2); } async command bool Timer.test() { return (call TimerCtrl.getInterruptFlag()).bits.tov2; } async command bool Timer.isOn() { return (call TimerCtrl.getInterruptMask()).bits.toie2; } async command void Compare.reset() { TIFR = 1 << OCF2; } async command void Compare.start() { SET_BIT(TIMSK,OCIE2); } async command void Compare.stop() { CLR_BIT(TIMSK,OCIE2); } async command bool Compare.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf2; } async command bool Compare.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie2; } //=== Read the compare registers. ===================================== async command uint8_t Compare.get() { return OCR2; } //=== Write the compare registers. ==================================== async command void Compare.set(uint8_t t) { OCR2 = t; } //=== Timer interrupts signals ======================================== default async event void Compare.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE2) { signal Compare.fired(); } default async event void Timer.overflow() { } AVR_NONATOMIC_HANDLER(SIG_OVERFLOW2) { signal Timer.overflow(); } } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/HplAtm128Timer3C.nc000066400000000000000000000045021207233610700231620ustar00rootroot00000000000000/// $Id: HplAtm128Timer3C.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL interface to Atmega128 timer 2. * * @author Martin Turon * @author David Gay */ configuration HplAtm128Timer3C { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as Compare[uint8_t id]; } } implementation { components HplAtm128Timer3P; Timer = HplAtm128Timer3P; TimerCtrl = HplAtm128Timer3P; Capture = HplAtm128Timer3P; Compare[0] = HplAtm128Timer3P.CompareA; Compare[1] = HplAtm128Timer3P.CompareB; Compare[2] = HplAtm128Timer3P.CompareC; } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/HplAtm128Timer3P.nc000066400000000000000000000210641207233610700232010ustar00rootroot00000000000000/// $Id: HplAtm128Timer3P.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Internal componentr of the HPL interface to Atmega128 timer 3. * * @author Martin Turon */ #include module HplAtm128Timer3P { provides { interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as CompareA; interface HplAtm128Compare as CompareB; interface HplAtm128Compare as CompareC; } } implementation { //=== Read the current timer value. =================================== async command uint16_t Timer.get() { return TCNT3; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint16_t t) { TCNT3 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR3B & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128TimerCtrlCapture_t x = call TimerCtrl.getCtrlCapture(); x.bits.cs = s; call TimerCtrl.setCtrlCapture(x); } //=== Read the control registers. ===================================== async command Atm128TimerCtrlCompare_t TimerCtrl.getCtrlCompare() { return *(Atm128TimerCtrlCompare_t*)&TCCR3A; } async command Atm128TimerCtrlCapture_t TimerCtrl.getCtrlCapture() { return *(Atm128TimerCtrlCapture_t*)&TCCR3B; } async command Atm128TimerCtrlClock_t TimerCtrl.getCtrlClock() { return *(Atm128TimerCtrlClock_t*)&TCCR3C; } //=== Control registers utilities. ================================== DEFINE_UNION_CAST(TimerCtrlCompare2int, Atm128TimerCtrlCompare_t, uint16_t); DEFINE_UNION_CAST(TimerCtrlCapture2int, Atm128TimerCtrlCapture_t, uint16_t); DEFINE_UNION_CAST(TimerCtrlClock2int, Atm128TimerCtrlClock_t, uint16_t); //=== Write the control registers. ==================================== async command void TimerCtrl.setCtrlCompare( Atm128_TCCR3A_t x ) { TCCR3A = TimerCtrlCompare2int(x); } async command void TimerCtrl.setCtrlCapture( Atm128_TCCR3B_t x ) { TCCR3B = TimerCtrlCapture2int(x); } async command void TimerCtrl.setCtrlClock( Atm128_TCCR3C_t x ) { TCCR3C = TimerCtrlClock2int(x); } //=== Read the interrupt mask. ===================================== async command Atm128_ETIMSK_t TimerCtrl.getInterruptMask() { return *(Atm128_ETIMSK_t*)&ETIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask16_2int, Atm128_ETIMSK_t, uint8_t); async command void TimerCtrl.setInterruptMask( Atm128_ETIMSK_t x ) { ETIMSK = TimerMask16_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_ETIFR_t TimerCtrl.getInterruptFlag() { return *(Atm128_ETIFR_t*)&ETIFR; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags16_2int, Atm128_ETIFR_t, uint8_t); async command void TimerCtrl.setInterruptFlag( Atm128_ETIFR_t x ) { ETIFR = TimerFlags16_2int(x); } //=== Capture 16-bit implementation. =================================== async command void Capture.setEdge(bool up) { WRITE_BIT(TCCR3B,ICES3, up); } //=== Timer 16-bit implementation. =================================== async command void Timer.reset() { ETIFR = 1 << TOV3; } async command void Capture.reset() { ETIFR = 1 << ICF3; } async command void CompareA.reset() { ETIFR = 1 << OCF3A; } async command void CompareB.reset() { ETIFR = 1 << OCF3B; } async command void CompareC.reset() { ETIFR = 1 << OCF3C; } async command void Timer.start() { SET_BIT(ETIMSK,TOIE3); } async command void Capture.start() { SET_BIT(ETIMSK,TICIE3); } async command void CompareA.start() { SET_BIT(ETIMSK,OCIE3A); } async command void CompareB.start() { SET_BIT(ETIMSK,OCIE3B); } async command void CompareC.start() { SET_BIT(ETIMSK,OCIE3C); } async command void Timer.stop() { CLR_BIT(ETIMSK,TOIE3); } async command void Capture.stop() { CLR_BIT(ETIMSK,TICIE3); } async command void CompareA.stop() { CLR_BIT(ETIMSK,OCIE3A); } async command void CompareB.stop() { CLR_BIT(ETIMSK,OCIE3B); } async command void CompareC.stop() { CLR_BIT(ETIMSK,OCIE3C); } async command bool Timer.test() { return (call TimerCtrl.getInterruptFlag()).bits.tov3; } async command bool Capture.test() { return (call TimerCtrl.getInterruptFlag()).bits.icf3; } async command bool CompareA.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf3a; } async command bool CompareB.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf3b; } async command bool CompareC.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf3c; } async command bool Timer.isOn() { return (call TimerCtrl.getInterruptMask()).bits.toie3; } async command bool Capture.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ticie3; } async command bool CompareA.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie3a; } async command bool CompareB.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie3b; } async command bool CompareC.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie3c; } //=== Read the compare registers. ===================================== async command uint16_t CompareA.get() { return OCR3A; } async command uint16_t CompareB.get() { return OCR3B; } async command uint16_t CompareC.get() { return OCR3C; } //=== Write the compare registers. ==================================== async command void CompareA.set(uint16_t t) { OCR3A = t; } async command void CompareB.set(uint16_t t) { OCR3B = t; } async command void CompareC.set(uint16_t t) { OCR3C = t; } //=== Read the capture registers. ===================================== async command uint16_t Capture.get() { return ICR3; } //=== Write the capture registers. ==================================== async command void Capture.set(uint16_t t) { ICR3 = t; } //=== Timer interrupts signals ======================================== default async event void CompareA.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE3A) { signal CompareA.fired(); } default async event void CompareB.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE3B) { signal CompareB.fired(); } default async event void CompareC.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE3C) { signal CompareC.fired(); } default async event void Capture.captured(uint16_t time) { } AVR_NONATOMIC_HANDLER(SIG_INPUT_CAPTURE3) { signal Capture.captured(call Capture.get()); } default async event void Timer.overflow() { } AVR_NONATOMIC_HANDLER(SIG_OVERFLOW3) { signal Timer.overflow(); } } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/HplAtm128TimerAsync.nc000066400000000000000000000026541207233610700240000ustar00rootroot00000000000000// $Id: HplAtm128TimerAsync.nc,v 1.2 2007-03-29 21:29:33 idgay Exp $ /* * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * @author David Gay */ interface HplAtm128TimerAsync { /** * Read timer0 asynchronous status register (ASSR) * @return Current value of ASSR */ async command Atm128Assr_t getAssr(); /** * Set timer0 asynchronous status register (ASSR) * @param x New value for ASSR */ async command void setAssr(Atm128Assr_t x); /** * Turn on timer 0 asynchronous mode */ async command void setTimer0Asynchronous(); /** * Check if control register TCCR0 is busy (should not be updated if true) * @return TRUE if TCCR0 is busy, FALSE otherwise (can be updated) */ async command int controlBusy(); /** * Check if compare register OCR0 is busy (should not be updated if true) * @return TRUE if OCR0 is busy, FALSE otherwise (can be updated) */ async command int compareBusy(); /** * Check if current timer value (TCNT0) is busy (should not be updated if true) * @return TRUE if TCNT0 is busy, FALSE otherwise (can be updated) */ async command int countBusy(); } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/HplAtm128TimerCtrl16.nc000066400000000000000000000050571207233610700237760ustar00rootroot00000000000000/// $Id: HplAtm128TimerCtrl16.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL Interface to Atmega128 16-bit timer control registers * * @author Martin Turon */ #include interface HplAtm128TimerCtrl16 { /// Timer control registers: Direct access async command Atm128TimerCtrlCompare_t getCtrlCompare(); async command Atm128TimerCtrlCapture_t getCtrlCapture(); async command Atm128TimerCtrlClock_t getCtrlClock(); async command void setCtrlCompare( Atm128TimerCtrlCompare_t control ); async command void setCtrlCapture( Atm128TimerCtrlCapture_t control ); async command void setCtrlClock ( Atm128TimerCtrlClock_t control ); /// Interrupt mask register: Direct access async command Atm128_ETIMSK_t getInterruptMask(); async command void setInterruptMask( Atm128_ETIMSK_t mask); /// Interrupt flag register: Direct access async command Atm128_ETIFR_t getInterruptFlag(); async command void setInterruptFlag( Atm128_ETIFR_t flags ); } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/HplAtm128TimerCtrl8.nc000066400000000000000000000044171207233610700237160ustar00rootroot00000000000000/// $Id: HplAtm128TimerCtrl8.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL Interface to Atmega128 8-bit timer control registers * * @author Martin Turon */ #include interface HplAtm128TimerCtrl8 { /// Timer control register: Direct access async command Atm128TimerControl_t getControl(); async command void setControl( Atm128TimerControl_t control ); /// Interrupt mask register: Direct access async command Atm128_TIMSK_t getInterruptMask(); async command void setInterruptMask( Atm128_TIMSK_t mask); /// Interrupt flag register: Direct access async command Atm128_TIFR_t getInterruptFlag(); async command void setInterruptFlag( Atm128_TIFR_t flags ); } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/sim/000077500000000000000000000000001207233610700206205ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128/timer/sim/HplAtm128CompareC.nc000066400000000000000000000213071207233610700241770ustar00rootroot00000000000000/// $Id: HplAtm128CompareC.nc,v 1.7 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic compare abstraction that builds on top of a counter. * * @author Philip Levis * @date Nov 22 2005 */ // $Id: HplAtm128CompareC.nc,v 1.7 2010-06-29 22:07:43 scipio Exp $ #include generic module HplAtm128CompareC(typedef width_t @integer(), uint8_t valueRegister, uint8_t interruptRegister, uint8_t interruptBit, uint8_t flagRegister, uint8_t flagBit) { provides { // 8-bit Timers interface HplAtm128Compare as Compare; } uses { interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128TimerNotify as Notify; } } implementation { /* lastZero keeps track of the phase of the clock. It denotes the sim * time at which the underlying clock started, which is needed to * calculate when compares will occur. */ sim_time_t lastZero = 0; /** This variable is needed to keep track of when the underlying * timer starts, in order to reset lastZero. When oldScale is * AVR_CLOCK_OFF and the scale is set to something else, the * clock starts ticking. */ uint8_t oldScale = AVR_CLOCK_OFF; void adjust_zero(width_t currentCounter); void cancel_compare(); sim_event_t* allocate_compare(); void configure_compare(sim_event_t* e); void schedule_new_compare(); sim_time_t clock_to_sim(sim_time_t t); sim_time_t sim_to_clock(sim_time_t t); uint16_t shiftFromScale(); sim_time_t last_zero() { if (lastZero == 0) { lastZero = sim_mote_start_time(sim_node()); } return lastZero; } async event void Notify.changed() { uint8_t newScale = call Timer.getScale(); if (newScale != AVR_CLOCK_OFF && oldScale == AVR_CLOCK_OFF) { lastZero = sim_time(); } oldScale = newScale; schedule_new_compare(); } async command void Compare.reset() { REG_ACCESS(flagRegister) &= ~(1 << flagBit); } async command void Compare.start() { SET_BIT(interruptRegister,interruptBit); } async command void Compare.stop() { CLR_BIT(interruptRegister,interruptBit); } async command bool Compare.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf0; } async command bool Compare.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie0; } //=== Read the compare registers. ===================================== async command width_t Compare.get() { return (width_t)REG_ACCESS(valueRegister); } //=== Write the compare registers. ==================================== async command void Compare.set(width_t t) { atomic { /* Re the comment above: it's a bad idea to wake up at time 0, as we'll just spin when setting the next deadline. Try and reduce the likelihood by delaying the interrupt... */ if (t == 0 || t >= 0xfe) t = 1; if (t != REG_ACCESS(valueRegister)) { REG_ACCESS(valueRegister) = t; schedule_new_compare(); } } } //=== Timer interrupts signals ======================================== default async event void Compare.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE0) { signal Compare.fired(); } /** * If the clock was stopped and has restarted, then * we need to move the time when the clock was last * zero to a time that reflects the current settings. * For example, if the clock was stopped when the counter * was 52 and then later restarted, then lastZero * needs to be moved forward in time so that the 52 * reflects the current time. */ void adjust_zero(width_t currentCounter) { sim_time_t now = sim_time(); sim_time_t adjust = currentCounter; adjust = adjust << shiftFromScale(); adjust = clock_to_sim(adjust); lastZero = now - adjust; } sim_time_t clock_to_sim(sim_time_t t) { t *= sim_ticks_per_sec(); t /= call Notify.clockTicksPerSec(); return t; } sim_time_t sim_to_clock(sim_time_t t) { t *= call Notify.clockTicksPerSec(); t /= sim_ticks_per_sec(); return t; } uint16_t shiftFromScale() { uint8_t scale = call Timer.getScale(); switch (scale) { case 0: return 0; case 1: return 0; case 2: return 3; case 3: return 5; case 4: return 6; case 5: return 7; case 6: return 8; case 7: return 10; default: return 255; } } sim_event_t* compare; void timer0_compare_handle(sim_event_t* evt) { dbg("HplAtm128CompareC", "%s Beginning compare at 0x%p\n", __FUNCTION__, evt); if (evt->cancelled) { return; } else { dbg("HplAtm128CompareC", "%s Handling compare at 0x%p @ %s\n",__FUNCTION__, evt, sim_time_string()); if (READ_BIT(interruptRegister, interruptBit)) { CLR_BIT(flagRegister, flagBit); dbg("HplAtm128CompareC", "%s Compare interrupt @ %s\n", __FUNCTION__, sim_time_string()); SIG_OUTPUT_COMPARE0(); } else { SET_BIT(flagRegister, flagBit); } // If we haven't been cancelled if (!evt->cancelled) { configure_compare(evt); sim_queue_insert(evt); } } } sim_event_t* allocate_compare() { sim_event_t* newEvent = sim_queue_allocate_event(); dbg("HplAtm128CompareC", "Allocated compare at 0x%p\n", newEvent); newEvent->handle = timer0_compare_handle; newEvent->cleanup = sim_queue_cleanup_none; return newEvent; } void configure_compare(sim_event_t* evt) { sim_time_t compareTime = 0; sim_time_t phaseOffset = 0; uint8_t timerVal = call Timer.get(); uint8_t compareVal = call Compare.get(); // Calculate how many counter increments until timer // hits compare, considering wraparound, and special // case of complete wraparound. compareTime = ((compareVal - timerVal) & 0xff); if (compareTime == 0) { compareTime = 256; } // Now convert the compare time from counter increments // to simulation ticks, considering the fact that the // increment actually has a phase offset. compareTime = compareTime << shiftFromScale(); compareTime = clock_to_sim(compareTime); compareTime += sim_time(); // How long into a timer tick was the clock actually reset? // This covers the case when the compare is set midway between // a tick, so it will go off a little early phaseOffset = sim_time(); phaseOffset -= last_zero(); phaseOffset %= clock_to_sim(1 << shiftFromScale()); compareTime -= phaseOffset; dbg("HplAtm128CompareC", "Configuring new compare of %i for %i at time %llu (@ %llu)\n", (int)compareVal, sim_node(), compareTime, sim_time()); evt->time = compareTime; } void schedule_new_compare() { if (compare != NULL) { cancel_compare(); } if (call Timer.getScale() != AVR_CLOCK_OFF) { sim_event_t* newEvent = allocate_compare(); configure_compare(newEvent); compare = newEvent; sim_queue_insert(newEvent); } } void cancel_compare() { dbg("HplAtm128CompareC", "Cancelling compare at 0x%p\n", compare); if (compare != NULL) { compare->cancelled = 1; compare->cleanup = sim_queue_cleanup_total; } } async event void Timer.overflow() {} } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/sim/HplAtm128Counter0C.nc000066400000000000000000000267111207233610700243140ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM implementation of the Atm128 Timer0 counter. It handles * overflow, scaling, and phase considerations. * * @date November 22 2005 * * @author Philip Levis * @author Martin Turon * @author David Gay */ // $Id: HplAtm128Counter0C.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $/// $Id: HplAtm128Timer2C.nc, #include #include module HplAtm128Counter0C { provides { interface Init @atleastonce(); // 8-bit Timers interface HplAtm128Timer as Timer0; interface HplAtm128TimerNotify as Notify; interface HplAtm128TimerCtrl8 as Timer0Ctrl; } } implementation { bool inOverflow = 0; uint8_t savedCounter = 0; sim_time_t lastZero = 0; void adjust_zero(uint8_t currentCounter); void cancel_overflow(); sim_event_t* allocate_overflow(); void configure_overflow(sim_event_t* e); void schedule_new_overflow(); sim_time_t clock_to_sim(sim_time_t t); sim_time_t sim_to_clock(sim_time_t t); uint16_t shiftFromScale(); command error_t Init.init() { /* Do nothing. On a standard mote this configures Timer0 to * operating in asynchronous mode off an external crystal. Here in * TOSSIM it's assumed that's the case. */ return SUCCESS; } async command sim_time_t Notify.clockTicksPerSec() { return ATM128_TIMER0_TICKSPPS; } sim_time_t last_zero() { if (lastZero == 0) { lastZero = sim_mote_start_time(sim_node()); } return lastZero; } //=== Read the current timer value. =================================== async command uint8_t Timer0.get() { uint8_t rval; sim_time_t elapsed = sim_time() - last_zero(); elapsed = sim_to_clock(elapsed); elapsed = elapsed >> shiftFromScale(); rval = (uint8_t)(elapsed & 0xff); dbg("HplAtm128Counter0C", "HplAtm128Counter0C: Getting timer: %hhu\n", rval); return rval; } //=== Set/clear the current timer value. ============================== /** * Set/clear the current timer value. * * This code is pretty tricky. */ async command void Timer0.set(uint8_t newVal) { uint8_t curVal = call Timer0.get(); if (newVal == curVal) { return; } else { sim_time_t adjustment = curVal - newVal; adjustment = adjustment << shiftFromScale(); adjustment = clock_to_sim(adjustment); if (newVal < curVal) { lastZero += adjustment; } else { // newVal > curVal lastZero -= adjustment; } schedule_new_overflow(); signal Notify.changed(); } } //=== Read the current timer scale. =================================== async command uint8_t Timer0.getScale() { return TCCR0 & 0x7; } //=== Turn off the timers. ============================================ async command void Timer0.off() { call Timer0.setScale(AVR_CLOCK_OFF); savedCounter = call Timer0.get(); cancel_overflow(); signal Notify.changed(); } //=== Write a new timer scale. ======================================== async command void Timer0.setScale(uint8_t s) { Atm128TimerControl_t ctrl; uint8_t currentScale = call Timer0.getScale(); uint8_t currentCounter; dbg("HplAtm128Counter0C", "Timer0 scale set to %i\n", (int)s); if (currentScale == 0) { currentCounter = savedCounter; } else { currentCounter = call Timer0.get(); } ctrl = call Timer0Ctrl.getControl(); ctrl.flat &= ~(0x7); ctrl.flat |= (s & 0x7); call Timer0Ctrl.setControl(ctrl); if (currentScale != s) { adjust_zero(currentCounter); schedule_new_overflow(); } signal Notify.changed(); } //=== Read the control registers. ===================================== async command Atm128TimerControl_t Timer0Ctrl.getControl() { return *(Atm128TimerControl_t*)&TCCR0; } //=== Write the control registers. ==================================== async command void Timer0Ctrl.setControl( Atm128TimerControl_t x ) { TCCR0 = x.flat; } //=== Read the interrupt mask. ===================================== async command Atm128_TIMSK_t Timer0Ctrl.getInterruptMask() { return *(Atm128_TIMSK_t*)&TIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask8_2int, Atm128_TIMSK_t, uint8_t); DEFINE_UNION_CAST(TimerMask16_2int, Atm128_ETIMSK_t, uint8_t); async command void Timer0Ctrl.setInterruptMask( Atm128_TIMSK_t x ) { TIMSK = TimerMask8_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_TIFR_t Timer0Ctrl.getInterruptFlag() { return *(Atm128_TIFR_t*)&TIFR; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags8_2int, Atm128_TIFR_t, uint8_t); DEFINE_UNION_CAST(TimerFlags16_2int, Atm128_ETIFR_t, uint8_t); async command void Timer0Ctrl.setInterruptFlag( Atm128_TIFR_t x ) { TIFR = TimerFlags8_2int(x); } //=== Timer 8-bit implementation. ==================================== async command void Timer0.reset() { // Clear TOV0. On real hardware, this is a write. TIFR &= ~(1 << TOV0); } async command void Timer0.start() { SET_BIT(ATM128_TIMSK, TOIE0); dbg("HplAtm128Counter0C", "Enabling TOIE0 at %llu\n", sim_time()); schedule_new_overflow(); } async command void Timer0.stop() { dbg("HplAtm128Counter0C", "Timer stopped @ %llu\n", sim_time()); CLR_BIT(ATM128_TIMSK, TOIE0); cancel_overflow(); } bool overflowed() { return READ_BIT(ATM128_TIFR, TOV0); } inline void stabiliseOverflow() { /* From the atmel manual: During asynchronous operation, the synchronization of the interrupt flags for the asynchronous timer takes three processor cycles plus one timer cycle. The timer is therefore advanced by at least one before the processor can read the timer value causing the setting of the interrupt flag. The output compare pin is changed on the timer clock and is not synchronized to the processor clock. So: if the timer is = 0, wait till it's = 1, except if - we're currently in the overflow interrupt handler - or, the overflow flag is already set */ //if (!inOverflow) // while (!TCNT0 && !overflowed()) //; } async command bool Timer0.test() { stabiliseOverflow(); return overflowed(); } async command bool Timer0.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.toie0; } default async event void Timer0.overflow() { } AVR_ATOMIC_HANDLER(SIG_OVERFLOW0) { inOverflow = TRUE; signal Timer0.overflow(); inOverflow = FALSE; } /** * If the clock was stopped and has restarted, then * we need to move the time when the clock was last * zero to a time that reflects the current settings. * For example, if the clock was stopped when the counter * was 52 and then later restarted, then lastZero * needs to be moved forward in time so that the 52 * reflects the current time. */ void adjust_zero(uint8_t currentCounter) { sim_time_t now = sim_time(); sim_time_t adjust = currentCounter; adjust = adjust << shiftFromScale(); adjust = clock_to_sim(adjust); lastZero = now - adjust; } sim_time_t clock_to_sim(sim_time_t t) { t *= sim_ticks_per_sec(); t /= call Notify.clockTicksPerSec(); return t; } sim_time_t sim_to_clock(sim_time_t t) { t *= call Notify.clockTicksPerSec(); t /= sim_ticks_per_sec(); return t; } uint16_t shiftFromScale() { uint8_t scale = call Timer0.getScale(); switch (scale) { case 0: return 0; case 1: return 0; case 2: return 3; case 3: return 5; case 4: return 6; case 5: return 7; case 6: return 8; case 7: return 10; default: return 255; } } sim_event_t* overflow; void timer0_overflow_handle(sim_event_t* evt) { if (evt->cancelled) { return; } else { if (READ_BIT(ATM128_TIMSK, TOIE0)) { CLR_BIT(ATM128_TIFR, TOV0); dbg("HplAtm128Counter0C", "Overflow interrupt at %s\n", sim_time_string()); SIG_OVERFLOW0(); } else { dbg("HplAtm128Counter0C", "Setting overflow bit at %s\n", sim_time_string()); SET_BIT(ATM128_TIFR, TOV0); } configure_overflow(evt); sim_queue_insert(evt); } } sim_event_t* allocate_overflow() { sim_event_t* newEvent = sim_queue_allocate_event(); newEvent->handle = timer0_overflow_handle; newEvent->cleanup = sim_queue_cleanup_none; return newEvent; } void configure_overflow(sim_event_t* evt) { sim_time_t overflowTime = 0; uint8_t timerVal = call Timer0.get(); uint8_t overflowVal = 0; // Calculate how many counter increments until timer // hits compare, considering wraparound, and special // case of complete wraparound. overflowTime = ((overflowVal - timerVal) & 0xff); if (overflowTime == 0) { overflowTime = 256; } // Now convert the compare time from counter increments // to simulation ticks, considering the fact that the // increment actually has a phase offset. overflowTime = overflowTime << shiftFromScale(); overflowTime = clock_to_sim(overflowTime); overflowTime += sim_time(); overflowTime -= (sim_time() - last_zero()) % (1 << shiftFromScale()); dbg("HplAtm128Counter0C", "Scheduling new overflow for %i at time %llu\n", sim_node(), overflowTime); evt->time = overflowTime; } void schedule_new_overflow() { sim_event_t* newEvent = allocate_overflow(); configure_overflow(newEvent); if (overflow != NULL) { cancel_overflow(); } overflow = newEvent; sim_queue_insert(newEvent); } void cancel_overflow() { if (overflow != NULL) { overflow->cancelled = 1; dbg("HplAtm128Counter0C", "Cancelling overflow %p.\n", overflow); overflow->cleanup = sim_queue_cleanup_total; } } } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/sim/HplAtm128Counter2C.nc000066400000000000000000000263411207233610700243150ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM implementation of the Atm128 Timer2 counter. It handles * overflow, scaling, and phase considerations. * * @date November 22 2005 * * @author Philip Levis * @author Martin Turon * @author David Gay */ // $Id: HplAtm128Counter2C.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $/// $Id: HplAtm128Timer2C.nc, #include #include enum { ATM128_TIMER2_TICKSPPS = (1 << 13) }; module HplAtm128Counter2C { provides { // 8-bit Timers interface HplAtm128Timer as Timer2; interface HplAtm128TimerNotify as Notify; interface HplAtm128TimerCtrl8 as Timer2Ctrl; } } implementation { bool inOverflow = 0; uint8_t savedCounter = 0; sim_time_t lastZero = 0; void adjust_zero(uint8_t currentCounter); void cancel_overflow(); sim_event_t* allocate_overflow(); void configure_overflow(sim_event_t* e); void schedule_new_overflow(); sim_time_t clock_to_sim(sim_time_t t); sim_time_t sim_to_clock(sim_time_t t); uint16_t shiftFromScale(); async command sim_time_t Notify.clockTicksPerSec() { return ATM128_TIMER2_TICKSPPS; } sim_time_t last_zero() { if (lastZero == 0) { lastZero = sim_mote_start_time(sim_node()); } return lastZero; } //=== Read the current timer value. =================================== async command uint8_t Timer2.get() { uint8_t rval; sim_time_t elapsed = sim_time() - last_zero(); elapsed = sim_to_clock(elapsed); elapsed = elapsed >> shiftFromScale(); rval = (uint8_t)(elapsed & 0xff); dbg("HplAtm128Counter2C", "HplAtm128Counter2C: Getting timer: %hhu\n", rval); return rval; } //=== Set/clear the current timer value. ============================== /** * Set/clear the current timer value. * * This code is pretty tricky. */ async command void Timer2.set(uint8_t newVal) { uint8_t curVal = call Timer2.get(); if (newVal == curVal) { return; } else { sim_time_t adjustment = curVal - newVal; adjustment = adjustment << shiftFromScale(); adjustment = clock_to_sim(adjustment); if (newVal < curVal) { lastZero += adjustment; } else { // newVal > curVal lastZero -= adjustment; } schedule_new_overflow(); signal Notify.changed(); } } //=== Read the current timer scale. =================================== async command uint8_t Timer2.getScale() { return TCCR2 & 0x7; } //=== Turn off the timers. ============================================ async command void Timer2.off() { call Timer2.setScale(AVR_CLOCK_OFF); savedCounter = call Timer2.get(); cancel_overflow(); signal Notify.changed(); } //=== Write a new timer scale. ======================================== async command void Timer2.setScale(uint8_t s) { Atm128TimerControl_t ctrl; uint8_t currentScale = call Timer2.getScale(); uint8_t currentCounter; dbg("HplAtm128Counter2C", "Timer2 scale set to %i\n", (int)s); if (currentScale == 0) { currentCounter = savedCounter; } else { currentCounter = call Timer2.get(); } ctrl = call Timer2Ctrl.getControl(); ctrl.bits.cs = s; call Timer2Ctrl.setControl(ctrl); if (currentScale != s) { adjust_zero(currentCounter); schedule_new_overflow(); } signal Notify.changed(); } //=== Read the control registers. ===================================== async command Atm128TimerControl_t Timer2Ctrl.getControl() { return *(Atm128TimerControl_t*)&TCCR2; } //=== Write the control registers. ==================================== async command void Timer2Ctrl.setControl( Atm128TimerControl_t x ) { TCCR2 = x.flat; } //=== Read the interrupt mask. ===================================== async command Atm128_TIMSK_t Timer2Ctrl.getInterruptMask() { return *(Atm128_TIMSK_t*)&TIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask8_2int, Atm128_TIMSK_t, uint8_t); DEFINE_UNION_CAST(TimerMask16_2int, Atm128_ETIMSK_t, uint8_t); async command void Timer2Ctrl.setInterruptMask( Atm128_TIMSK_t x ) { TIMSK = TimerMask8_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_TIFR_t Timer2Ctrl.getInterruptFlag() { return *(Atm128_TIFR_t*)&TIFR; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags8_2int, Atm128_TIFR_t, uint8_t); DEFINE_UNION_CAST(TimerFlags16_2int, Atm128_ETIFR_t, uint8_t); async command void Timer2Ctrl.setInterruptFlag( Atm128_TIFR_t x ) { TIFR = TimerFlags8_2int(x); } //=== Timer 8-bit implementation. ==================================== async command void Timer2.reset() { // Clear TOV0. On real hardware, this is a write. TIFR &= ~(1 << TOV2); } async command void Timer2.start() { SET_BIT(ATM128_TIMSK, TOIE2); dbg("HplAtm128Counter2C", "Enabling TOIE0 at %llu\n", sim_time()); schedule_new_overflow(); } async command void Timer2.stop() { dbg("HplAtm128Counter2C", "Timer stopped @ %llu\n", sim_time()); CLR_BIT(ATM128_TIMSK, TOIE2); cancel_overflow(); } bool overflowed() { return READ_BIT(ATM128_TIFR, TOV2); } inline void stabiliseOverflow() { /* From the atmel manual: During asynchronous operation, the synchronization of the interrupt flags for the asynchronous timer takes three processor cycles plus one timer cycle. The timer is therefore advanced by at least one before the processor can read the timer value causing the setting of the interrupt flag. The output compare pin is changed on the timer clock and is not synchronized to the processor clock. So: if the timer is = 0, wait till it's = 1, except if - we're currently in the overflow interrupt handler - or, the overflow flag is already set */ //if (!inOverflow) // while (!TCNT0 && !overflowed()) //; } async command bool Timer2.test() { stabiliseOverflow(); return overflowed(); } async command bool Timer2.isOn() { return (call Timer2Ctrl.getInterruptMask()).bits.toie2; } default async event void Timer2.overflow() { } AVR_ATOMIC_HANDLER(SIG_OVERFLOW2) { inOverflow = TRUE; signal Timer2.overflow(); inOverflow = FALSE; } /** * If the clock was stopped and has restarted, then * we need to move the time when the clock was last * zero to a time that reflects the current settings. * For example, if the clock was stopped when the counter * was 52 and then later restarted, then lastZero * needs to be moved forward in time so that the 52 * reflects the current time. */ void adjust_zero(uint8_t currentCounter) { sim_time_t now = sim_time(); sim_time_t adjust = currentCounter; adjust = adjust << shiftFromScale(); adjust = clock_to_sim(adjust); lastZero = now - adjust; } sim_time_t clock_to_sim(sim_time_t t) { t *= sim_ticks_per_sec(); t /= call Notify.clockTicksPerSec(); return t; } sim_time_t sim_to_clock(sim_time_t t) { t *= call Notify.clockTicksPerSec(); t /= sim_ticks_per_sec(); return t; } uint16_t shiftFromScale() { uint8_t scale = call Timer2.getScale(); switch (scale) { case 0: return 0; case 1: return 0; case 2: return 3; case 3: return 5; case 4: return 6; case 5: return 7; case 6: return 8; case 7: return 10; default: return 255; } } sim_event_t* overflow; void timer2_overflow_handle(sim_event_t* evt) { if (evt->cancelled) { return; } else { char time[128]; sim_print_now(time, 128); if (READ_BIT(ATM128_TIMSK, TOIE2)) { CLR_BIT(ATM128_TIFR, TOV2); dbg("HplAtm128Counter2C", "Overflow interrupt at %s\n", time); SIG_OVERFLOW2(); } else { dbg("HplAtm128Counter2C", "Setting overflow bit at %s\n", time); SET_BIT(ATM128_TIFR, TOV2); } configure_overflow(evt); sim_queue_insert(evt); } } sim_event_t* allocate_overflow() { sim_event_t* newEvent = sim_queue_allocate_event(); newEvent->handle = timer2_overflow_handle; newEvent->cleanup = sim_queue_cleanup_none; return newEvent; } void configure_overflow(sim_event_t* evt) { sim_time_t overflowTime = 0; uint8_t timerVal = call Timer2.get(); uint8_t overflowVal = 0; // Calculate how many counter increments until timer // hits compare, considering wraparound, and special // case of complete wraparound. overflowTime = ((overflowVal - timerVal) & 0xff); if (overflowTime == 0) { overflowTime = 256; } // Now convert the compare time from counter increments // to simulation ticks, considering the fact that the // increment actually has a phase offset. overflowTime = overflowTime << shiftFromScale(); overflowTime = clock_to_sim(overflowTime); overflowTime += sim_time(); overflowTime -= (sim_time() - last_zero()) % (1 << shiftFromScale()); dbg("HplAtm128Counter2C", "Scheduling new overflow for %i at time %llu\n", sim_node(), overflowTime); evt->time = overflowTime; } void schedule_new_overflow() { sim_event_t* newEvent = allocate_overflow(); configure_overflow(newEvent); if (overflow != NULL) { cancel_overflow(); } overflow = newEvent; sim_queue_insert(newEvent); } void cancel_overflow() { if (overflow != NULL) { overflow->cancelled = 1; dbg("HplAtm128Counter2C", "Cancelling overflow %p.\n", overflow); overflow->cleanup = sim_queue_cleanup_total; } } } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/sim/HplAtm128Timer0AsyncC.nc000066400000000000000000000051631207233610700247510ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM implementation of the Atm128 Timer0. It is built from a * timer-specific counter component and a generic compare * component. The counter component has an additional simulation-only * interface to let the compare component know when its state has * changed (e.g., TCNTX was set). * * @date November 22 2005 * * @author Philip Levis * @author Martin Turon * @author David Gay */ // $Id: HplAtm128Timer0AsyncC.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $/// $Id: HplAtm128Timer2C.nc, #include configuration HplAtm128Timer0AsyncC { provides { // 8-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; interface HplAtm128TimerAsync as TimerAsync; } } implementation { components HplAtm128Timer0AsyncP; Timer = HplAtm128Timer0AsyncP; TimerCtrl = HplAtm128Timer0AsyncP; Compare = HplAtm128Timer0AsyncP; TimerAsync = HplAtm128Timer0AsyncP; } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/sim/HplAtm128Timer0AsyncP.nc000066400000000000000000000430041207233610700247620ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM implementation of the Atm128 Timer0 counter. It handles * overflow, scaling, and phase considerations. * * @date November 22 2005 * * @author Philip Levis * @author Martin Turon * @author David Gay */ // $Id: HplAtm128Timer0AsyncP.nc,v 1.2 2010-06-29 22:07:43 scipio Exp $/// $Id: HplAtm128Timer2C.nc, #include #include module HplAtm128Timer0AsyncP { provides { interface HplAtm128Timer as Timer0; interface HplAtm128TimerCtrl8 as Timer0Ctrl; interface HplAtm128Compare as Compare; interface HplAtm128TimerAsync as TimerAsync; } } implementation { bool inOverflow = 0; uint8_t savedCounter = 0; void adjust_zero(uint8_t currentCounter); void cancel_overflow(); sim_event_t* allocate_overflow(); void configure_overflow(sim_event_t* e); void schedule_new_overflow(); sim_time_t clock_to_sim(sim_time_t t); sim_time_t sim_to_clock(sim_time_t t); uint16_t shiftFromScale(); /* lastZero keeps track of the phase of the clock. It denotes the sim * time at which the underlying clock started, which is needed to * calculate when compares will occur. */ sim_time_t lastZero = 0; /** This variable is needed to keep track of when the underlying * timer starts, in order to reset lastZero. When oldScale is * AVR_CLOCK_OFF and the scale is set to something else, the * clock starts ticking. */ uint8_t oldScale = AVR_CLOCK_OFF; void adjust_zero(uint8_t currentCounter); void cancel_compare(); sim_event_t* allocate_compare(); void configure_compare(sim_event_t* e); void schedule_new_compare(); sim_time_t clock_to_sim(sim_time_t t); sim_time_t sim_to_clock(sim_time_t t); uint16_t shiftFromScale(); default async event void Compare.fired() { } AVR_ATOMIC_HANDLER(SIG_OUTPUT_COMPARE0) { //stabiliseTimer0(); signal Compare.fired(); } default async event void Timer0.overflow() { } AVR_ATOMIC_HANDLER(SIG_OVERFLOW0) { inOverflow = TRUE; signal Timer0.overflow(); inOverflow = FALSE; } sim_time_t last_zero() { if (lastZero == 0) { lastZero = sim_mote_start_time(sim_node()); } return lastZero; } void notify_changed() { uint8_t newScale = call Timer0.getScale(); if (newScale != AVR_CLOCK_OFF && oldScale == AVR_CLOCK_OFF) { lastZero = sim_time(); } oldScale = newScale; schedule_new_compare(); } sim_time_t notify_clockTicksPerSec() { return ATM128_TIMER0_TICKSPPS; } /** * If the clock was stopped and has restarted, then * we need to move the time when the clock was last * zero to a time that reflects the current settings. * For example, if the clock was stopped when the counter * was 52 and then later restarted, then lastZero * needs to be moved forward in time so that the 52 * reflects the current time. */ void adjust_zero(uint8_t currentCounter) { sim_time_t now = sim_time(); sim_time_t adjust = currentCounter; adjust = adjust << shiftFromScale(); adjust = clock_to_sim(adjust); lastZero = now - adjust; } sim_time_t clock_to_sim(sim_time_t t) { t *= sim_ticks_per_sec(); t /= notify_clockTicksPerSec(); return t; } sim_time_t sim_to_clock(sim_time_t t) { t *= notify_clockTicksPerSec(); t /= sim_ticks_per_sec(); return t; } uint16_t shiftFromScale() { uint8_t scale = call Timer0.getScale(); switch (scale) { case 0: return 0; case 1: return 0; case 2: return 3; case 3: return 5; case 4: return 6; case 5: return 7; case 6: return 8; case 7: return 10; default: return 255; } } sim_event_t* compare; void timer0_compare_handle(sim_event_t* evt) { dbg("HplAtm128Timer0AsyncP", "Beginning compare 0x%p at %s\n", evt, sim_time_string()); if (evt->cancelled) { return; } else { char timeStr[128]; sim_print_now(timeStr, 128); dbg("HplAtm128Timer0AsyncP", "Handling compare at 0x%p @ %s\n", evt, sim_time_string()); if (READ_BIT(ATM128_TCCR0, WGM01) && !READ_BIT(ATM128_TCCR0, WGM00)) { dbg("HplAtm128Timer0AsyncP", "%s: CTC is set, clear timer.\n", __FUNCTION__); call Timer0.set(0); } else { dbg("HplAtm128Timer0AsyncP", "%s: TCCR is 0x%hhx, %i, %i\n", __FUNCTION__, TCCR0, (int)READ_BIT(ATM128_TCCR0, WGM01), (int)READ_BIT(ATM128_TCCR0, WGM00)); } if (READ_BIT(ATM128_TIMSK, OCIE0)) { dbg("HplAtm128Timer0AsyncP", "TIFR is %hhx\n", TIFR); CLR_BIT(ATM128_TIFR, OCF0); dbg("HplAtm128Timer0AsyncP", "TIFR is %hhx\n", TIFR); dbg("HplAtm128Timer0AsyncP", "Compare interrupt @ %s\n", timeStr); SIG_OUTPUT_COMPARE0(); } else { SET_BIT(ATM128_TIFR, OCF0); } // If we haven't been cancelled if (!evt->cancelled) { configure_compare(evt); sim_queue_insert(evt); } } } sim_event_t* allocate_compare() { sim_event_t* newEvent = sim_queue_allocate_event(); dbg("HplAtm128Timer0AsyncP", "Allocated compare at 0x%p\n", newEvent); newEvent->handle = timer0_compare_handle; newEvent->cleanup = sim_queue_cleanup_none; return newEvent; } void configure_compare(sim_event_t* evt) { sim_time_t compareTime = 0; sim_time_t phaseOffset = 0; uint8_t timerVal = call Timer0.get(); uint8_t compareVal = call Compare.get(); // Calculate how many counter increments until timer // hits compare, considering wraparound, and special // case of complete wraparound. compareTime = ((compareVal - timerVal) & 0xff); if (compareTime == 0) { compareTime = 256; } // Now convert the compare time from counter increments // to simulation ticks, considering the fact that the // increment actually has a phase offset. // The +1 is from the timer behavior: if you set OCR0 to be X, // it will actually fire when TCNT is X+1 compareTime = (compareTime + 1) << shiftFromScale(); compareTime = clock_to_sim(compareTime); compareTime += sim_time(); // How long into a timer tick was the clock actually reset? // This covers the case when the compare is set midway between // a tick, so it will go off a little early phaseOffset = sim_time(); phaseOffset -= last_zero(); phaseOffset %= clock_to_sim(1 << shiftFromScale()); compareTime -= phaseOffset; dbg("HplAtm128Timer0AsyncP", "Configuring new compare of %i for %i at time %llu (@ %llu)\n", (int)compareVal, sim_node(), compareTime, sim_time()); evt->time = compareTime; } void schedule_new_compare() { if (compare != NULL) { cancel_compare(); } if (call Timer0.getScale() != AVR_CLOCK_OFF) { sim_event_t* newEvent = allocate_compare(); configure_compare(newEvent); compare = newEvent; sim_queue_insert(newEvent); } } //=== Read the current timer value. =================================== async command uint8_t Timer0.get() { uint8_t rval; sim_time_t elapsed = sim_time() - last_zero(); elapsed = sim_to_clock(elapsed); elapsed = elapsed >> shiftFromScale(); rval = (uint8_t)(elapsed & 0xff); dbg("HplAtm128Timer0AsyncP", "HplAtm128Timer0AsyncP: Getting timer: %hhu\n", rval); return rval; } //=== Set/clear the current timer value. ============================== /** * Set/clear the current timer value. * * This code is pretty tricky. */ async command void Timer0.set(uint8_t newVal) { uint8_t curVal = call Timer0.get(); dbg("HplAtm128Timer0AsyncP", "HplAtm128Timer0AsyncP: Setting timer: %hhu\n", newVal); if (newVal == curVal) { return; } else { sim_time_t adjustment = curVal - newVal; adjustment = adjustment << shiftFromScale(); adjustment = clock_to_sim(adjustment); if (newVal < curVal) { lastZero += adjustment; } else { // newVal > curVal lastZero -= adjustment; } schedule_new_overflow(); notify_changed(); } } //=== Read the current timer scale. =================================== async command uint8_t Timer0.getScale() { return TCCR0 & 0x7; } //=== Turn off the timers. ============================================ async command void Timer0.off() { call Timer0.setScale(AVR_CLOCK_OFF); savedCounter = call Timer0.get(); cancel_overflow(); notify_changed(); } //=== Write a new timer scale. ======================================== async command void Timer0.setScale(uint8_t s) { Atm128TimerControl_t ctrl; uint8_t currentScale = call Timer0.getScale(); uint8_t currentCounter; dbg("HplAtm128Timer0AsyncP", "Timer0 scale set to %i\n", (int)s); if (currentScale == 0) { currentCounter = savedCounter; } else { currentCounter = call Timer0.get(); } ctrl = call Timer0Ctrl.getControl(); ctrl.flat &= ~(0x7); ctrl.flat |= (s & 0x7); call Timer0Ctrl.setControl(ctrl); if (currentScale != s) { adjust_zero(currentCounter); schedule_new_overflow(); } notify_changed(); } //=== Read the control registers. ===================================== async command Atm128TimerControl_t Timer0Ctrl.getControl() { return *(Atm128TimerControl_t*)&TCCR0; } //=== Write the control registers. ==================================== async command void Timer0Ctrl.setControl( Atm128TimerControl_t x ) { dbg("HplAtm128Timer0AsyncP", "Setting control to be 0x%hhx\n", x.flat); TCCR0 = x.flat; } //=== Read the interrupt mask. ===================================== async command Atm128_TIMSK_t Timer0Ctrl.getInterruptMask() { return *(Atm128_TIMSK_t*)&TIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask8_2int, Atm128_TIMSK_t, uint8_t); DEFINE_UNION_CAST(TimerMask16_2int, Atm128_ETIMSK_t, uint8_t); async command void Timer0Ctrl.setInterruptMask( Atm128_TIMSK_t x ) { TIMSK = TimerMask8_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_TIFR_t Timer0Ctrl.getInterruptFlag() { Atm128_TIFR_t at; at.flat = TIFR; return at; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags8_2int, Atm128_TIFR_t, uint8_t); DEFINE_UNION_CAST(TimerFlags16_2int, Atm128_ETIFR_t, uint8_t); async command void Timer0Ctrl.setInterruptFlag( Atm128_TIFR_t x ) { TIFR = TimerFlags8_2int(x); } //=== Timer 8-bit implementation. ==================================== async command void Timer0.reset() { // Clear TOV0. On real hardware, this is a write. TIFR &= ~(1 << TOV0); } async command void Timer0.start() { SET_BIT(ATM128_TIMSK, TOIE0); dbg("HplAtm128Timer0AsyncP", "Enabling TOIE0 at %llu\n", sim_time()); schedule_new_overflow(); } async command void Timer0.stop() { dbg("HplAtm128Timer0AsyncP", "Timer stopped @ %llu\n", sim_time()); CLR_BIT(ATM128_TIMSK, TOIE0); cancel_overflow(); } bool overflowed() { return READ_BIT(ATM128_TIFR, TOV0); } inline void stabiliseOverflow() { /* From the atmel manual: During asynchronous operation, the synchronization of the interrupt flags for the asynchronous timer takes three processor cycles plus one timer cycle. The timer is therefore advanced by at least one before the processor can read the timer value causing the setting of the interrupt flag. The output compare pin is changed on the timer clock and is not synchronized to the processor clock. So: if the timer is = 0, wait till it's = 1, except if - we're currently in the overflow interrupt handler - or, the overflow flag is already set */ //if (!inOverflow) // while (!TCNT0 && !overflowed()) //; } async command bool Timer0.test() { stabiliseOverflow(); return overflowed(); } async command bool Timer0.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.toie0; } async command void Compare.reset() { TIFR = 1 << OCF0; } async command void Compare.start() { SET_BIT(ATM128_TIMSK,OCIE0); } async command void Compare.stop() { CLR_BIT(ATM128_TIMSK,OCIE0); } async command bool Compare.test() { return (call Timer0Ctrl.getInterruptFlag()).bits.ocf0; } async command bool Compare.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.ocie0; } //=== Read the compare registers. ===================================== async command uint8_t Compare.get() { dbg("HplAtm128Timer0AsyncP", "HplAtm128Timer0AsyncP: Getting compare: %hhu\n", OCR0); return OCR0; } //=== Write the compare registers. ==================================== async command void Compare.set(uint8_t t) { dbg("HplAtm128Timer0AsyncP", "HplAtm128Timer0AsyncP: Setting compare: %hhu\n", t); atomic { /* Re the comment above: it's a bad idea to wake up at time 0, as we'll just spin when setting the next deadline. Try and reduce the likelihood by delaying the interrupt... */ if (t == 0 || t >= 0xfe) t = 1; if (t != OCR0) { OCR0 = t; schedule_new_compare(); } } } sim_event_t* overflow; void timer0_overflow_handle(sim_event_t* evt) { if (evt->cancelled) { return; } else { if (READ_BIT(ATM128_TIMSK, TOIE0)) { CLR_BIT(ATM128_TIFR, TOV0); dbg("HplAtm128Timer0AsyncP", "Overflow interrupt at %s\n", sim_time_string()); SIG_OVERFLOW0(); } else { dbg("HplAtm128Timer0AsyncP", "Setting overflow bit at %s\n", sim_time_string()); SET_BIT(ATM128_TIFR, TOV0); } configure_overflow(evt); sim_queue_insert(evt); } } sim_event_t* allocate_overflow() { sim_event_t* newEvent = sim_queue_allocate_event(); newEvent->handle = timer0_overflow_handle; newEvent->cleanup = sim_queue_cleanup_none; return newEvent; } void configure_overflow(sim_event_t* evt) { sim_time_t overflowTime = 0; uint8_t timerVal = call Timer0.get(); uint8_t overflowVal = 0; // Calculate how many counter increments until timer // hits compare, considering wraparound, and special // case of complete wraparound. overflowTime = ((overflowVal - timerVal) & 0xff); if (overflowTime == 0) { overflowTime = 256; } // Now convert the compare time from counter increments // to simulation ticks, considering the fact that the // increment actually has a phase offset. overflowTime = overflowTime << shiftFromScale(); overflowTime = clock_to_sim(overflowTime); overflowTime += sim_time(); overflowTime -= (sim_time() - last_zero()) % (1 << shiftFromScale()); dbg("HplAtm128Timer0AsyncP", "Scheduling new overflow for %i at time %llu\n", sim_node(), overflowTime); evt->time = overflowTime; } void schedule_new_overflow() { sim_event_t* newEvent = allocate_overflow(); configure_overflow(newEvent); if (overflow != NULL) { cancel_overflow(); } overflow = newEvent; sim_queue_insert(newEvent); } void cancel_overflow() { if (overflow != NULL) { overflow->cancelled = 1; dbg("HplAtm128Timer0AsyncP", "Cancelling overflow %p.\n", overflow); overflow->cleanup = sim_queue_cleanup_total; } } async command Atm128Assr_t TimerAsync.getAssr() { return *(Atm128Assr_t *)&ASSR; } async command void TimerAsync.setAssr(Atm128Assr_t x) { ASSR = x.flat; } async command void TimerAsync.setTimer0Asynchronous() { ASSR |= 1 << AS0; } async command int TimerAsync.controlBusy() { return (ASSR & (1 << TCR0UB)) != 0; } async command int TimerAsync.compareBusy() { return (ASSR & (1 << OCR0UB)) != 0; } async command int TimerAsync.countBusy() { return (ASSR & (1 << TCN0UB)) != 0; } void cancel_compare() { dbg("HplAtm128CompareC", "Cancelling compare at 0x%p\n", compare); if (compare != NULL) { compare->cancelled = 1; compare->cleanup = sim_queue_cleanup_total; } } } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/sim/HplAtm128Timer2C.nc000066400000000000000000000054331207233610700237550ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM implementation of the Atm128 Timer2. It is built from a * timer-specific counter component and a generic compare * component. The counter component has an additional simulation-only * interface to let the compare component know when its state has * changed (e.g., TCNTX was set). * * @date November 22 2005 * * @author Philip Levis * @author Martin Turon * @author David Gay */ // $Id: HplAtm128Timer2C.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $/// $Id: HplAtm128Timer2C.nc, #include configuration HplAtm128Timer2C { provides { // 8-bit Timers interface HplAtm128Timer as Timer2; interface HplAtm128TimerCtrl8 as Timer2Ctrl; interface HplAtm128Compare as Compare2; } } implementation { components HplAtm128Counter0C, new HplAtm128CompareC(uint8_t, ATM128_OCR2, ATM128_TIMSK, OCIE2, ATM128_TIFR, OCF2); Timer2 = HplAtm128Counter2C; Timer2Ctrl = HplAtm128Counter2C; Compare2 = HplAtm128CompareC; HplAtm128CompareC.Timer -> HplAtm128Counter2C; HplAtm128CompareC.TimerCtrl -> HplAtm128Counter2C; HplAtm128CompareC.Notify -> HplAtm128Counter2C; } tinyos-2.1.2+dfsg/tos/chips/atm128/timer/sim/HplAtm128TimerNotify.nc000066400000000000000000000044731207233610700247640ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM-specific timer interface needed to notify when the state * of the underlying timer has changed. E.g., if a compare is built on top * of the timer, but someone sets the counter register, the compare will need * adjust its event timing. * * @date November 22 2005 * * @author Philip Levis */ // $Id: HplAtm128TimerNotify.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $/// $Id: HplAtm128Timer2C.nc, interface HplAtm128TimerNotify { /** * Signaled whenever the state of the counter has changed. Dependent * abstractions should recalculate. */ async event void changed(); /** * Basic utility function so the counter itself can specify the * ticks pps. */ async command sim_time_t clockTicksPerSec(); } tinyos-2.1.2+dfsg/tos/chips/atm1281/000077500000000000000000000000001207233610700167715ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm1281/HplAtm128GeneralIOC.nc000066400000000000000000000154161207233610700225730ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include /** * Provide GeneralIO interfaces for all of the ATmega128's pins. * * @author Martin Turon */ configuration HplAtm128GeneralIOC { // provides all the ports as raw ports provides { interface GeneralIO as PortA0; interface GeneralIO as PortA1; interface GeneralIO as PortA2; interface GeneralIO as PortA3; interface GeneralIO as PortA4; interface GeneralIO as PortA5; interface GeneralIO as PortA6; interface GeneralIO as PortA7; interface GeneralIO as PortB0; interface GeneralIO as PortB1; interface GeneralIO as PortB2; interface GeneralIO as PortB3; interface GeneralIO as PortB4; interface GeneralIO as PortB5; interface GeneralIO as PortB6; interface GeneralIO as PortB7; interface GeneralIO as PortC0; interface GeneralIO as PortC1; interface GeneralIO as PortC2; interface GeneralIO as PortC3; interface GeneralIO as PortC4; interface GeneralIO as PortC5; interface GeneralIO as PortC6; interface GeneralIO as PortC7; interface GeneralIO as PortD0; interface GeneralIO as PortD1; interface GeneralIO as PortD2; interface GeneralIO as PortD3; interface GeneralIO as PortD4; interface GeneralIO as PortD5; interface GeneralIO as PortD6; interface GeneralIO as PortD7; interface GeneralIO as PortE0; interface GeneralIO as PortE1; interface GeneralIO as PortE2; interface GeneralIO as PortE3; interface GeneralIO as PortE4; interface GeneralIO as PortE5; interface GeneralIO as PortE6; interface GeneralIO as PortE7; interface GeneralIO as PortF0; interface GeneralIO as PortF1; interface GeneralIO as PortF2; interface GeneralIO as PortF3; interface GeneralIO as PortF4; interface GeneralIO as PortF5; interface GeneralIO as PortF6; interface GeneralIO as PortF7; interface GeneralIO as PortG0; interface GeneralIO as PortG1; interface GeneralIO as PortG2; interface GeneralIO as PortG3; interface GeneralIO as PortG4; interface GeneralIO as PortG5; } } implementation { components new HplAtm128GeneralIOPortP((uint8_t)&PORTA, (uint8_t)&DDRA, (uint8_t)&PINA) as PortA, new HplAtm128GeneralIOPortP((uint8_t)&PORTB, (uint8_t)&DDRB, (uint8_t)&PINB) as PortB, new HplAtm128GeneralIOPortP((uint8_t)&PORTC, (uint8_t)&DDRC, (uint8_t)&PINC) as PortC, new HplAtm128GeneralIOPortP((uint8_t)&PORTD, (uint8_t)&DDRD, (uint8_t)&PIND) as PortD, new HplAtm128GeneralIOPortP((uint8_t)&PORTE, (uint8_t)&DDRE, (uint8_t)&PINE) as PortE, new HplAtm128GeneralIOPortP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF) as PortF, // PortF cannot use sbi, cbi new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 0) as F0, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 1) as F1, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 2) as F2, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 3) as F3, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 4) as F4, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 5) as F5, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 6) as F6, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF, 7) as F7, // PortG only exposes 5 bits and cannot use sbi, cbi new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTG, (uint8_t)&DDRG, (uint8_t)&PING, 0) as G0, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTG, (uint8_t)&DDRG, (uint8_t)&PING, 1) as G1, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTG, (uint8_t)&DDRG, (uint8_t)&PING, 2) as G2, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTG, (uint8_t)&DDRG, (uint8_t)&PING, 3) as G3, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTG, (uint8_t)&DDRG, (uint8_t)&PING, 4) as G4, new HplAtm128GeneralIOSlowPinP((uint8_t)&PORTG, (uint8_t)&DDRG, (uint8_t)&PING, 5) as G5 ; PortA0 = PortA.Pin0; PortA1 = PortA.Pin1; PortA2 = PortA.Pin2; PortA3 = PortA.Pin3; PortA4 = PortA.Pin4; PortA5 = PortA.Pin5; PortA6 = PortA.Pin6; PortA7 = PortA.Pin7; PortB0 = PortB.Pin0; PortB1 = PortB.Pin1; PortB2 = PortB.Pin2; PortB3 = PortB.Pin3; PortB4 = PortB.Pin4; PortB5 = PortB.Pin5; PortB6 = PortB.Pin6; PortB7 = PortB.Pin7; PortC0 = PortC.Pin0; PortC1 = PortC.Pin1; PortC2 = PortC.Pin2; PortC3 = PortC.Pin3; PortC4 = PortC.Pin4; PortC5 = PortC.Pin5; PortC6 = PortC.Pin6; PortC7 = PortC.Pin7; PortD0 = PortD.Pin0; PortD1 = PortD.Pin1; PortD2 = PortD.Pin2; PortD3 = PortD.Pin3; PortD4 = PortD.Pin4; PortD5 = PortD.Pin5; PortD6 = PortD.Pin6; PortD7 = PortD.Pin7; PortE0 = PortE.Pin0; PortE1 = PortE.Pin1; PortE2 = PortE.Pin2; PortE3 = PortE.Pin3; PortE4 = PortE.Pin4; PortE5 = PortE.Pin5; PortE6 = PortE.Pin6; PortE7 = PortE.Pin7; PortF0 = PortF.Pin0; PortF1 = PortF.Pin1; PortF2 = PortF.Pin2; PortF3 = PortF.Pin3; PortF4 = PortF.Pin4; PortF5 = PortF.Pin5; PortF6 = PortF.Pin6; PortF7 = PortF.Pin7; PortG0 = G0; PortG1 = G1; PortG2 = G2; PortG3 = G3; PortG4 = G4; PortG5 = G5; } tinyos-2.1.2+dfsg/tos/chips/atm1281/HplAtm128UartP.nc000066400000000000000000000235671207233610700217240ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Alec Woo * @author Jonathan Hui * @version $Revision: 1.3 $ $Date: 2010-06-29 22:07:43 $ */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Private component of the Atmega1281 serial port HPL. * * @author Martin Turon * @author David Gay * @author Janos Sallai */ #include module HplAtm128UartP { provides interface Init as Uart0Init; provides interface StdControl as Uart0TxControl; provides interface StdControl as Uart0RxControl; provides interface HplAtm128Uart as HplUart0; provides interface Init as Uart1Init; provides interface StdControl as Uart1TxControl; provides interface StdControl as Uart1RxControl; provides interface HplAtm128Uart as HplUart1; uses interface Atm128Calibrate; uses interface McuPowerState; } implementation { //=== Uart Init Commands. ==================================== command error_t Uart0Init.init() { Atm128UartMode_t mode; Atm128UartStatus_t stts; Atm128UartControl_t ctrl; uint16_t ubrr0; ctrl.bits = (struct Atm128_UCSRB_t) {rxcie:0, txcie:0, rxen:0, txen:0}; stts.bits = (struct Atm128_UCSRA_t) {u2x:1}; mode.bits = (struct Atm128_UCSRC_t) {ucsz:ATM128_UART_DATA_SIZE_8_BITS}; ubrr0 = call Atm128Calibrate.baudrateRegister(PLATFORM_BAUDRATE); UBRR0L = ubrr0; UBRR0H = ubrr0 >> 8; UCSR0A = stts.flat; UCSR0C = mode.flat; UCSR0B = ctrl.flat; return SUCCESS; } command error_t Uart0TxControl.start() { SET_BIT(UCSR0B, TXEN0); call McuPowerState.update(); return SUCCESS; } command error_t Uart0TxControl.stop() { CLR_BIT(UCSR0B, TXEN0); call McuPowerState.update(); return SUCCESS; } command error_t Uart0RxControl.start() { SET_BIT(UCSR0B, RXEN0); call McuPowerState.update(); return SUCCESS; } command error_t Uart0RxControl.stop() { CLR_BIT(UCSR0B, RXEN0); call McuPowerState.update(); return SUCCESS; } async command error_t HplUart0.enableTxIntr() { SET_BIT(UCSR0A, TXC0); SET_BIT(UCSR0B, TXCIE0); return SUCCESS; } async command error_t HplUart0.disableTxIntr(){ CLR_BIT(UCSR0B, TXCIE0); return SUCCESS; } async command error_t HplUart0.enableRxIntr(){ SET_BIT(UCSR0B, RXCIE0); return SUCCESS; } async command error_t HplUart0.disableRxIntr(){ CLR_BIT(UCSR0B, RXCIE0); return SUCCESS; } async command bool HplUart0.isTxEmpty(){ return READ_BIT(UCSR0A, TXC0); } async command bool HplUart0.isRxEmpty(){ return !READ_BIT(UCSR0A, RXC0); } async command uint8_t HplUart0.rx(){ return UDR0; } async command void HplUart0.tx(uint8_t data) { atomic{ UDR0 = data; SET_BIT(UCSR0A, TXC0); } } AVR_ATOMIC_HANDLER(SIG_USART0_RECV) { if (READ_BIT(UCSR0A, RXC0)) { signal HplUart0.rxDone(UDR0); } } AVR_NONATOMIC_HANDLER(SIG_USART0_TRANS) { signal HplUart0.txDone(); } command error_t Uart1Init.init() { Atm128UartMode_t mode; Atm128UartStatus_t stts; Atm128UartControl_t ctrl; uint16_t ubrr1; ctrl.bits = (struct Atm128_UCSRB_t) {rxcie:0, txcie:0, rxen:0, txen:0}; stts.bits = (struct Atm128_UCSRA_t) {u2x:1}; mode.bits = (struct Atm128_UCSRC_t) {ucsz:ATM128_UART_DATA_SIZE_8_BITS}; ubrr1 = call Atm128Calibrate.baudrateRegister(PLATFORM_BAUDRATE); UBRR1L = ubrr1; UBRR1H = ubrr1 >> 8; UCSR1A = stts.flat; UCSR1C = mode.flat; UCSR1B = ctrl.flat; return SUCCESS; } command error_t Uart1TxControl.start() { SET_BIT(UCSR1B, TXEN1); call McuPowerState.update(); return SUCCESS; } command error_t Uart1TxControl.stop() { CLR_BIT(UCSR1B, TXEN1); call McuPowerState.update(); return SUCCESS; } command error_t Uart1RxControl.start() { SET_BIT(UCSR1B, RXEN1); call McuPowerState.update(); return SUCCESS; } command error_t Uart1RxControl.stop() { CLR_BIT(UCSR1B, RXEN1); call McuPowerState.update(); return SUCCESS; } async command error_t HplUart1.enableTxIntr() { SET_BIT(UCSR1A, TXC1); SET_BIT(UCSR1B, TXCIE1); return SUCCESS; } async command error_t HplUart1.disableTxIntr(){ CLR_BIT(UCSR1B, TXCIE1); return SUCCESS; } async command error_t HplUart1.enableRxIntr(){ SET_BIT(UCSR1B, RXCIE1); return SUCCESS; } async command error_t HplUart1.disableRxIntr(){ CLR_BIT(UCSR1B, RXCIE1); return SUCCESS; } async command bool HplUart1.isTxEmpty() { return READ_BIT(UCSR1A, TXC1); } async command bool HplUart1.isRxEmpty() { return !READ_BIT(UCSR1A, RXC1); } async command uint8_t HplUart1.rx(){ return UDR1; } async command void HplUart1.tx(uint8_t data) { atomic{ UDR1 = data; SET_BIT(UCSR1A, TXC1); } } AVR_ATOMIC_HANDLER(SIG_USART1_RECV) { if (READ_BIT(UCSR1A, RXC1)) signal HplUart1.rxDone(UDR1); } AVR_NONATOMIC_HANDLER(SIG_USART1_TRANS) { signal HplUart1.txDone(); } default async event void HplUart0.txDone() {} default async event void HplUart0.rxDone(uint8_t data) {} default async event void HplUart1.txDone() {} default async event void HplUart1.rxDone(uint8_t data) {} } tinyos-2.1.2+dfsg/tos/chips/atm1281/McuSleepC.nc000066400000000000000000000140321207233610700211330ustar00rootroot00000000000000/// $Id: McuSleepC.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Implementation of TEP 112 (Microcontroller Power Management) for * the Atmega128. Power state calculation code copied from Rob * Szewczyk's 1.x code in HPLPowerManagementM.nc. * *
     *  $Id: McuSleepC.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $
     * 
    * * @author Philip Levis * @author Robert Szewczyk * @author Janos Sallai * @date October 30, 2007 */ module McuSleepC @safe() { provides { interface McuSleep; interface McuPowerState; } uses { interface McuPowerOverride; } } implementation { /* There is no dirty bit management because the sleep mode depends on the amount of time remaining in timer2. */ /* Note that the power values are maintained in an order * based on their active components, NOT on their values. * Look at atm1281hardware.h and page 54 of the ATmeg1281 * manual (Table 25).*/ const_uint8_t atm128PowerBits[ATM128_POWER_DOWN + 1] = { 0, (1 << SM0), (1 << SM2) | (1 << SM1) | (1 << SM0), (1 << SM1) | (1 << SM0), (1 << SM2) | (1 << SM1), (1 << SM1)}; mcu_power_t getPowerState() { // Note: we go to sleep even if timer 0, 1, 3, 4, or 5's overflow // interrupt is enabled - this allows using timers 0, 1 and 3 as TinyOS // "Alarm"s while still having power management. (see TEP102 Appendix C) // Input capture and output compare for timer 4 and 5 are not functional // on the atm1281. // Are there any input capture or output compare interrupts enabled // for timers 0, 1 or 3? if ( TIMSK0 & (1 << OCIE0A | 1 << OCIE0B ) || TIMSK1 & (1 << ICIE1 | 1 << OCIE1A | 1 << OCIE1B | 1 << OCIE1C) || TIMSK3 & (1 << ICIE3 | 1 << OCIE3A | 1 << OCIE3B | 1 << OCIE3C) ) { return ATM128_POWER_IDLE; } // SPI (Radio stack) else if (bit_is_set(SPCR, SPIE)) { return ATM128_POWER_IDLE; } // UARTs are active else if (UCSR0B & (1 << TXEN0 | 1 << RXEN0)) { // UART return ATM128_POWER_IDLE; } else if (UCSR1B & (1 << TXEN1 | 1 << RXEN1)) { // UART return ATM128_POWER_IDLE; } // I2C (Two-wire) is active else if (bit_is_set(TWCR, TWEN)){ return ATM128_POWER_IDLE; } // ADC is enabled else if (bit_is_set(ADCSRA, ADEN)) { return ATM128_POWER_ADC_NR; } else { return ATM128_POWER_DOWN; } } async command void McuSleep.sleep() { uint8_t powerState; powerState = mcombine(getPowerState(), call McuPowerOverride.lowestState()); SMCR = (SMCR & 0xf0) | 1 << SE | read_uint8_t(&atm128PowerBits[powerState]); sei(); // All of memory may change at this point... asm volatile ("sleep" : : : "memory"); cli(); CLR_BIT(SMCR, SE); } async command void McuPowerState.update() { } default async command mcu_power_t McuPowerOverride.lowestState() { return ATM128_POWER_DOWN; } } tinyos-2.1.2+dfsg/tos/chips/atm1281/adc/000077500000000000000000000000001207233610700175205ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm1281/adc/AdcP.nc000066400000000000000000000112731207233610700206550ustar00rootroot00000000000000/* $Id: AdcP.nc,v 1.6 2008-06-26 04:39:03 regehr Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Convert ATmega128 HAL A/D interface to the HIL interfaces. * @author David Gay * @author Jan Hauer */ #include "Timer.h" module AdcP @safe() { provides { interface Read[uint8_t client]; interface ReadNow[uint8_t client]; } uses { interface Atm128AdcSingle; interface Atm128AdcConfig[uint8_t client]; interface BusyWait; } } implementation { enum { IDLE, ACQUIRE_DATA, ACQUIRE_DATA_NOW, }; /* Resource reservation is required, and it's incorrect to call getData again before dataReady is signaled, so there are no races in correct programs */ norace uint8_t state; norace uint8_t client; norace uint16_t val; uint8_t channel() { return call Atm128AdcConfig.getChannel[client](); } uint8_t refVoltage() { return call Atm128AdcConfig.getRefVoltage[client](); } uint8_t prescaler() { return call Atm128AdcConfig.getPrescaler[client](); } void sample() { call Atm128AdcSingle.getData(channel(), refVoltage(), FALSE, prescaler()); } error_t startGet(uint8_t newState, uint8_t newClient) { /* Note: we retry imprecise results in dataReady */ state = newState; client = newClient; sample(); return SUCCESS; } command error_t Read.read[uint8_t c]() { return startGet(ACQUIRE_DATA, c); } async command error_t ReadNow.read[uint8_t c]() { return startGet(ACQUIRE_DATA_NOW, c); } task void acquiredData() { state = IDLE; signal Read.readDone[client](SUCCESS, val); } async event void Atm128AdcSingle.dataReady(uint16_t data, bool precise) { switch (state) { case ACQUIRE_DATA: if (!precise) { // the stage may take up to 125us to stabilize after channel change call BusyWait.wait(125); sample(); } else { val = data; post acquiredData(); } break; case ACQUIRE_DATA_NOW: if (!precise) { // the stage may take up to 125us to stabilize after channel change call BusyWait.wait(125); sample(); } else { state = IDLE; signal ReadNow.readDone[client](SUCCESS, data); } break; default: break; } } /* Configuration defaults. Read ground fast! ;-) */ default async command uint8_t Atm128AdcConfig.getChannel[uint8_t c]() { return ATM128_ADC_SNGL_GND; } default async command uint8_t Atm128AdcConfig.getRefVoltage[uint8_t c]() { return ATM128_ADC_VREF_OFF; } default async command uint8_t Atm128AdcConfig.getPrescaler[uint8_t c]() { return ATM128_ADC_PRESCALE_2; } default event void Read.readDone[uint8_t c](error_t e, uint16_t d) { } default async event void ReadNow.readDone[uint8_t c](error_t e, uint16_t d) { } } tinyos-2.1.2+dfsg/tos/chips/atm1281/adc/Atm128Adc.h000066400000000000000000000161321207233610700212600ustar00rootroot00000000000000// $Id: Atm128Adc.h,v 1.3 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // @author Martin Turon // @author Hu Siquan /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ // @author Janos Sallai /* Updated chips/atm128 to include atm1281's ADCSRB register. */ #ifndef _H_Atm128ADC_h #define _H_Atm128ADC_h //================== 8 channel 10-bit ADC ============================== /* Voltage Reference Settings */ enum { ATM128_ADC_VREF_OFF = 0, //!< VR+ = AREF and VR- = GND ATM128_ADC_VREF_AVCC = 1,//!< VR+ = AVcc and VR- = GND ATM128_ADC_VREF_1_1 = 2, //!< VR+ = 1.1V and VR- = GND ATM128_ADC_VREF_2_56 = 3,//!< VR+ = 2.56V and VR- = GND }; /* Voltage Reference Settings */ enum { ATM128_ADC_RIGHT_ADJUST = 0, ATM128_ADC_LEFT_ADJUST = 1, }; /* ADC Multiplexer Settings */ enum { ATM128_ADC_SNGL_ADC0 = 0, ATM128_ADC_SNGL_ADC1, ATM128_ADC_SNGL_ADC2, ATM128_ADC_SNGL_ADC3, ATM128_ADC_SNGL_ADC4, ATM128_ADC_SNGL_ADC5, ATM128_ADC_SNGL_ADC6, ATM128_ADC_SNGL_ADC7, ATM128_ADC_DIFF_ADC00_10x, ATM128_ADC_DIFF_ADC10_10x, ATM128_ADC_DIFF_ADC00_200x, ATM128_ADC_DIFF_ADC10_200x, ATM128_ADC_DIFF_ADC22_10x, ATM128_ADC_DIFF_ADC32_10x, ATM128_ADC_DIFF_ADC22_200x, ATM128_ADC_DIFF_ADC32_200x, ATM128_ADC_DIFF_ADC01_1x, ATM128_ADC_DIFF_ADC11_1x, ATM128_ADC_DIFF_ADC21_1x, ATM128_ADC_DIFF_ADC31_1x, ATM128_ADC_DIFF_ADC41_1x, ATM128_ADC_DIFF_ADC51_1x, ATM128_ADC_DIFF_ADC61_1x, ATM128_ADC_DIFF_ADC71_1x, ATM128_ADC_DIFF_ADC02_1x, ATM128_ADC_DIFF_ADC12_1x, ATM128_ADC_DIFF_ADC22_1x, ATM128_ADC_DIFF_ADC32_1x, ATM128_ADC_DIFF_ADC42_1x, ATM128_ADC_DIFF_ADC52_1x, ATM128_ADC_SNGL_1_23, ATM128_ADC_SNGL_GND, }; /* ADC Multiplexer Selection Register */ typedef struct { uint8_t mux : 5; //!< Analog Channel and Gain Selection Bits uint8_t adlar : 1; //!< ADC Left Adjust Result uint8_t refs : 2; //!< Reference Selection Bits } Atm128Admux_t; /* ADC Prescaler Settings */ /* Note: each platform must define ATM128_ADC_PRESCALE to the smallest prescaler which guarantees full A/D precision. */ enum { ATM128_ADC_PRESCALE_2 = 0, ATM128_ADC_PRESCALE_2b, ATM128_ADC_PRESCALE_4, ATM128_ADC_PRESCALE_8, ATM128_ADC_PRESCALE_16, ATM128_ADC_PRESCALE_32, ATM128_ADC_PRESCALE_64, ATM128_ADC_PRESCALE_128, // This special value is used to ask the platform for the prescaler // which gives full precision. ATM128_ADC_PRESCALE }; /* ADC Enable Settings */ enum { ATM128_ADC_ENABLE_OFF = 0, ATM128_ADC_ENABLE_ON, }; /* ADC Start Conversion Settings */ enum { ATM128_ADC_START_CONVERSION_OFF = 0, ATM128_ADC_START_CONVERSION_ON, }; /* ADC Free Running Select Settings */ enum { ATM128_ADC_FREE_RUNNING_OFF = 0, ATM128_ADC_FREE_RUNNING_ON, }; /* ADC Interrupt Flag Settings */ enum { ATM128_ADC_INT_FLAG_OFF = 0, ATM128_ADC_INT_FLAG_ON, }; /* ADC Interrupt Enable Settings */ enum { ATM128_ADC_INT_ENABLE_OFF = 0, ATM128_ADC_INT_ENABLE_ON, }; /* ADC Multiplexer Selection Register */ typedef struct { uint8_t adps : 3; //!< ADC Prescaler Select Bits uint8_t adie : 1; //!< ADC Interrupt Enable uint8_t adif : 1; //!< ADC Interrupt Flag uint8_t adate : 1; //!< ADC Auto Trigger Enable uint8_t adsc : 1; //!< ADC Start Conversion uint8_t aden : 1; //!< ADC Enable } Atm128Adcsra_t; /* ADC Multiplexer Selection Register */ typedef struct { uint8_t adts : 3; //!< ADC Trigger Select uint8_t mux5 : 1; //!< Analog Channel and Gain Selection Bit uint8_t resv1 : 2; //!< Reserved uint8_t acme : 1; //!< Analog Comparator Multiplexer Enable uint8_t resv2 : 1; //!< Reserved } Atm128Adcsrb_t; typedef uint8_t Atm128_ADCH_t; //!< ADC data register high typedef uint8_t Atm128_ADCL_t; //!< ADC data register low // The resource identifier string for the ADC subsystem #define UQ_ATM128ADC_RESOURCE "atm128adc.resource" #endif //_H_Atm128ADC_h tinyos-2.1.2+dfsg/tos/chips/atm1281/adc/Atm128AdcP.nc000066400000000000000000000163301207233610700215510ustar00rootroot00000000000000/* $Id: Atm128AdcP.nc,v 1.3 2010-06-29 22:07:43 scipio Exp $ * * Copyright (c) 2000-2003 The Regents of the University of California. * Copyright (c) 2002-2005 Intel Corporation. * Copyright (c) 2004-2005 Crossbow Technology, Inc. * Copyright (c) 2007, Vanderbilt University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128Adc.h" /** * Internal component of the Atmega1281 A/D HAL. * * @author Jason Hill * @author David Gay * @author Philip Levis * @author Phil Buonadonna * @author Hu Siquan * @author Janos Sallai */ module Atm128AdcP @safe() { provides { interface Init; interface AsyncStdControl; interface Atm128AdcSingle; interface Atm128AdcMultiple; } uses { interface HplAtm128Adc; interface Atm128Calibrate; } } implementation { /* State for the current and next (multiple-sampling only) conversion */ struct { bool multiple : 1; /* single and multiple-sampling mode */ bool precise : 1; /* is this result going to be precise? */ uint8_t channel : 5; /* what channel did this sample come from? */ } f, nextF; command error_t Init.init() { atomic { Atm128Adcsra_t adcsr; adcsr.aden = ATM128_ADC_ENABLE_OFF; adcsr.adsc = ATM128_ADC_START_CONVERSION_OFF; adcsr.adate= ATM128_ADC_FREE_RUNNING_OFF; adcsr.adif = ATM128_ADC_INT_FLAG_OFF; adcsr.adie = ATM128_ADC_INT_ENABLE_OFF; adcsr.adps = ATM128_ADC_PRESCALE_2; call HplAtm128Adc.setAdcsra(adcsr); } return SUCCESS; } /* We enable the A/D when start is called, and disable it when stop is called. This drops A/D conversion latency by a factor of two (but increases idle mode power consumption a little). */ async command error_t AsyncStdControl.start() { atomic call HplAtm128Adc.enableAdc(); return SUCCESS; } async command error_t AsyncStdControl.stop() { atomic call HplAtm128Adc.disableAdc(); return SUCCESS; } /* Return TRUE if switching to 'channel' with reference voltage 'refVoltage' will give a precise result (the first sample after changing reference voltage or switching to/between a differential channel is imprecise) */ inline bool isPrecise(Atm128Admux_t admux, uint8_t channel, uint8_t refVoltage) { return ((refVoltage == admux.refs) && (channel == admux.mux)); } async event void HplAtm128Adc.dataReady(uint16_t data) { bool precise, multiple; uint8_t channel; atomic { channel = f.channel; precise = f.precise; multiple = f.multiple; } if (!multiple) { /* A single sample. Disable the ADC interrupt to avoid starting a new sample at the next "sleep" instruction. */ call HplAtm128Adc.disableInterruption(); signal Atm128AdcSingle.dataReady(data, precise); } else { /* Multiple sampling. The user can: - tell us to stop sampling - or, to continue sampling on a new channel, possibly with a new reference voltage; however this change applies not to the next sample (the hardware has already started working on that), but on the one after. */ bool cont; uint8_t nextChannel, nextVoltage; Atm128Admux_t admux; atomic { admux = call HplAtm128Adc.getAdmux(); nextVoltage = admux.refs; nextChannel = admux.mux; } cont = signal Atm128AdcMultiple.dataReady(data, precise, channel, &nextChannel, &nextVoltage); atomic if (cont) { /* Switch channels and update our internal channel+precision tracking state (f and nextF). Note that this tracking will be incorrect if we take too long to get to this point. */ admux.refs = nextVoltage; admux.mux = nextChannel; call HplAtm128Adc.setAdmux(admux); f = nextF; nextF.channel = nextChannel; nextF.precise = isPrecise(admux, nextChannel, nextVoltage); } else call HplAtm128Adc.cancel(); } } /* Start sampling based on request parameters */ void getData(uint8_t channel, uint8_t refVoltage, bool leftJustify, uint8_t prescaler) { Atm128Admux_t admux; Atm128Adcsra_t adcsr; admux = call HplAtm128Adc.getAdmux(); f.precise = isPrecise(admux, channel, refVoltage); f.channel = channel; admux.refs = refVoltage; admux.adlar = leftJustify; admux.mux = channel; call HplAtm128Adc.setAdmux(admux); adcsr.aden = ATM128_ADC_ENABLE_ON; adcsr.adsc = ATM128_ADC_START_CONVERSION_ON; adcsr.adate= f.multiple; adcsr.adif = ATM128_ADC_INT_FLAG_ON; // clear any stale flag adcsr.adie = ATM128_ADC_INT_ENABLE_ON; if (prescaler == ATM128_ADC_PRESCALE) prescaler = call Atm128Calibrate.adcPrescaler(); adcsr.adps = prescaler; call HplAtm128Adc.setAdcsra(adcsr); } async command bool Atm128AdcSingle.getData(uint8_t channel, uint8_t refVoltage, bool leftJustify, uint8_t prescaler) { atomic { f.multiple = FALSE; getData(channel, refVoltage, leftJustify, prescaler); return f.precise; } } async command bool Atm128AdcSingle.cancel() { /* There is no Atm128AdcMultiple.cancel, for reasons discussed in that interface */ return call HplAtm128Adc.cancel(); } async command bool Atm128AdcMultiple.getData(uint8_t channel, uint8_t refVoltage, bool leftJustify, uint8_t prescaler) { atomic { f.multiple = TRUE; getData(channel, refVoltage, leftJustify, prescaler); nextF = f; /* We assume the 2nd sample is precise */ nextF.precise = TRUE; return f.precise; } } default async event void Atm128AdcSingle.dataReady(uint16_t data, bool precise) { } default async event bool Atm128AdcMultiple.dataReady(uint16_t data, bool precise, uint8_t channel, uint8_t *newChannel, uint8_t *newRefVoltage) { return FALSE; // stop conversion if we somehow end up here. } } tinyos-2.1.2+dfsg/tos/chips/atm1281/adc/HplAtm128AdcP.nc000066400000000000000000000121761207233610700222210ustar00rootroot00000000000000/// $Id: HplAtm128AdcP.nc,v 1.3 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * Copyright (c) 2004-2005 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128Adc.h" /** * HPL for the Atmega1281 A/D conversion susbsystem. * * @author Martin Turon * @author Hu Siquan * @author David Gay * @author Janos Sallai */ module HplAtm128AdcP @safe() { provides interface HplAtm128Adc; uses interface McuPowerState; } implementation { //=== Direct read of HW registers. ================================= async command Atm128Admux_t HplAtm128Adc.getAdmux() { return *(Atm128Admux_t*)&ADMUX; } async command Atm128Adcsra_t HplAtm128Adc.getAdcsra() { return *(Atm128Adcsra_t*)&ADCSRA; } async command uint16_t HplAtm128Adc.getValue() { return ADC; } DEFINE_UNION_CAST(Admux2int, Atm128Admux_t, uint8_t); DEFINE_UNION_CAST(Adcsra2int, Atm128Adcsra_t, uint8_t); //=== Direct write of HW registers. ================================ async command void HplAtm128Adc.setAdmux( Atm128Admux_t x ) { ADMUX = Admux2int(x); } async command void HplAtm128Adc.setAdcsra( Atm128Adcsra_t x ) { ADCSRA = Adcsra2int(x); } async command void HplAtm128Adc.setPrescaler(uint8_t scale){ Atm128Adcsra_t current_val = call HplAtm128Adc.getAdcsra(); current_val.adif = FALSE; current_val.adps = scale; call HplAtm128Adc.setAdcsra(current_val); } // Individual bit manipulation. These all clear any pending A/D interrupt. // It's not clear these are that useful... async command void HplAtm128Adc.enableAdc() { SET_BIT(ADCSRA, ADEN); call McuPowerState.update(); } async command void HplAtm128Adc.disableAdc() { CLR_BIT(ADCSRA, ADEN); call McuPowerState.update(); } async command void HplAtm128Adc.enableInterruption() { SET_BIT(ADCSRA, ADIE); } async command void HplAtm128Adc.disableInterruption() { CLR_BIT(ADCSRA, ADIE); } async command void HplAtm128Adc.setContinuous() { ((Atm128Adcsrb_t*)&ADCSRB)->adts = 0; SET_BIT(ADCSRA, ADATE); } async command void HplAtm128Adc.setSingle() { CLR_BIT(ADCSRA, ADATE); } async command void HplAtm128Adc.resetInterrupt() { SET_BIT(ADCSRA, ADIF); } async command void HplAtm128Adc.startConversion() { SET_BIT(ADCSRA, ADSC); } /* A/D status checks */ async command bool HplAtm128Adc.isEnabled() { return (call HplAtm128Adc.getAdcsra()).aden; } async command bool HplAtm128Adc.isStarted() { return (call HplAtm128Adc.getAdcsra()).adsc; } async command bool HplAtm128Adc.isComplete() { return (call HplAtm128Adc.getAdcsra()).adif; } /* A/D interrupt handlers. Signals dataReady event with interrupts enabled */ AVR_ATOMIC_HANDLER(SIG_ADC) { uint16_t data = call HplAtm128Adc.getValue(); __nesc_enable_interrupt(); signal HplAtm128Adc.dataReady(data); } default async event void HplAtm128Adc.dataReady(uint16_t done) { } async command bool HplAtm128Adc.cancel() { /* This is tricky */ atomic { Atm128Adcsra_t oldSr = call HplAtm128Adc.getAdcsra(), newSr; /* To cancel a conversion, first turn off ADEN, then turn off ADSC. We also cancel any pending interrupt. Finally we reenable the ADC. */ newSr = oldSr; newSr.aden = FALSE; newSr.adif = TRUE; /* This clears a pending interrupt... */ newSr.adie = FALSE; /* We don't want to start sampling again at the next sleep */ call HplAtm128Adc.setAdcsra(newSr); newSr.adsc = FALSE; call HplAtm128Adc.setAdcsra(newSr); newSr.aden = TRUE; call HplAtm128Adc.setAdcsra(newSr); return oldSr.adif || oldSr.adsc; } } } tinyos-2.1.2+dfsg/tos/chips/atm1281/adc/WireAdcP.nc000066400000000000000000000021551207233610700215030ustar00rootroot00000000000000/* $Id: WireAdcP.nc,v 1.4 2006-12-12 18:23:03 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Support component for AdcReadClientC and AdcReadNowClientC. * * @author David Gay * @author Janos Sallai */ configuration WireAdcP { provides { interface Read[uint8_t client]; interface ReadNow[uint8_t client]; } uses { interface Atm128AdcConfig[uint8_t client]; interface Resource[uint8_t client]; } } implementation { components Atm128AdcC, AdcP, BusyWaitMicroC, new ArbitratedReadC(uint16_t) as ArbitrateRead; Read = ArbitrateRead; ReadNow = AdcP; Resource = ArbitrateRead.Resource; Atm128AdcConfig = AdcP; ArbitrateRead.Service -> AdcP.Read; AdcP.Atm128AdcSingle -> Atm128AdcC; AdcP.BusyWait -> BusyWaitMicroC; } tinyos-2.1.2+dfsg/tos/chips/atm1281/atm128hardware.h000066400000000000000000000153051207233610700217000ustar00rootroot00000000000000/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. * Copyright (c) 2002-2003 Intel Corporation. * Copyright (c) 2000-2003 The Regents of the University of California. * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Updated chips/atm128/atm128hardware.h with atm1281's MCU status and * memory control registers. * * @author Janos Sallai, Martin Turon, Jason Hill, Philip Levis, Nelson Lee, David Gay */ #ifndef _H_atmega128hardware_H #define _H_atmega128hardware_H #include #if __AVR_LIBC_VERSION__ >= 10400UL #include #else #include #include #endif #include #include #include "atm128const.h" /* We need slightly different defs than SIGNAL, INTERRUPT */ #define AVR_ATOMIC_HANDLER(signame) \ void signame() __attribute__ ((signal)) @atomic_hwevent() @C() #define AVR_NONATOMIC_HANDLER(signame) \ void signame() __attribute__ ((interrupt)) @hwevent() @C() /* Macro to create union casting functions. */ #define DEFINE_UNION_CAST(func_name, from_type, to_type) \ to_type func_name(from_type x) { \ union {from_type f; to_type t;} c = {f:x}; return c.t; } // Bit operators using bit number #define SET_BIT(port, bit) ((port) |= _BV(bit)) #define CLR_BIT(port, bit) ((port) &= ~_BV(bit)) #define READ_BIT(port, bit) (((port) & _BV(bit)) != 0) #define FLIP_BIT(port, bit) ((port) ^= _BV(bit)) #define WRITE_BIT(port, bit, value) \ if (value) SET_BIT((port), (bit)); \ else CLR_BIT((port), (bit)) // Bit operators using bit flag mask #define SET_FLAG(port, flag) ((port) |= (flag)) #define CLR_FLAG(port, flag) ((port) &= ~(flag)) #define READ_FLAG(port, flag) ((port) & (flag)) /* Enables interrupts. */ inline void __nesc_enable_interrupt() @safe() { sei(); } /* Disables all interrupts. */ inline void __nesc_disable_interrupt() @safe() { cli(); } /* Defines data type for storing interrupt mask state during atomic. */ typedef uint8_t __nesc_atomic_t; __nesc_atomic_t __nesc_atomic_start(void); void __nesc_atomic_end(__nesc_atomic_t original_SREG); #ifndef NESC_BUILD_BINARY /* @spontaneous() functions should not be included when NESC_BUILD_BINARY is #defined, to avoid duplicate functions definitions wheb binary components are used. Such functions do need a prototype in all cases, though. */ /* Saves current interrupt mask state and disables interrupts. */ inline __nesc_atomic_t __nesc_atomic_start(void) @spontaneous() @safe() { __nesc_atomic_t result = SREG; __nesc_disable_interrupt(); asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ return result; } /* Restores interrupt mask to original state. */ inline void __nesc_atomic_end(__nesc_atomic_t original_SREG) @spontaneous() @safe() { asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ SREG = original_SREG; } #endif /* Defines the mcu_power_t type for atm128 power management. */ typedef uint8_t mcu_power_t @combine("mcombine"); enum { ATM128_POWER_IDLE = 0, ATM128_POWER_ADC_NR = 1, ATM128_POWER_EXT_STANDBY = 2, ATM128_POWER_SAVE = 3, ATM128_POWER_STANDBY = 4, ATM128_POWER_DOWN = 5, }; /* Combine function. */ mcu_power_t mcombine(mcu_power_t m1, mcu_power_t m2) @safe() { return (m1 < m2)? m1: m2; } /* MCU Status Register*/ typedef struct { uint8_t porf : 1; //!< Power-on Reset Flag uint8_t extrf : 1; //!< External Reset Flag uint8_t borf : 1; //!< Brown-out Reset Flag uint8_t wdrf : 1; //!< Watchdog Reset Flag uint8_t jtrf : 1; //!< JTAG Reset Flag uint8_t resv1 : 3; //!< Reserved } Atm128_MCUSR_t; /* External Memory Control Register A*/ typedef struct { uint8_t srw00 : 1; //!< Wait-state Select Bits for Lower Sector uint8_t srw01 : 1; //!< Wait-state Select Bits for Lower Sector uint8_t srw10 : 1; //!< Wait-state Select Bits for Upper Sector uint8_t srw11 : 1; //!< Wait-state Select Bits for Upper Sector uint8_t srl : 3; //!< Wait-state Sector Limit uint8_t sre : 1; //!< External SRAM/XMEM Enable } Atm128_XMCRA_t; /* External Memory Control Register B*/ typedef struct { uint8_t xmm : 3; //!< External Memory High Mask uint8_t resv1 : 4; //!< Reserved uint8_t xmbk : 1; //!< External Memory Bus-keeper Enable } Atm128_XMCRB_t; /* Floating-point network-type support. These functions must convert to/from a 32-bit big-endian integer that follows the layout of Java's java.lang.float.floatToRawIntBits method. Conveniently, for the AVR family, this is a straight byte copy... */ typedef float nx_float __attribute__((nx_base_be(afloat))); inline float __nesc_ntoh_afloat(const void *COUNT(sizeof(float)) source) @safe() { float f; memcpy(&f, source, sizeof(float)); return f; } inline float __nesc_hton_afloat(void *COUNT(sizeof(float)) target, float value) @safe() { memcpy(target, &value, sizeof(float)); return value; } #endif //_H_atmega128hardware_H tinyos-2.1.2+dfsg/tos/chips/atm1281/timer/000077500000000000000000000000001207233610700201115ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm1281/timer/Atm1281AlarmAsyncP.nc000066400000000000000000000200471207233610700235660ustar00rootroot00000000000000// $Id: Atm1281AlarmAsyncP.nc,v 1.3 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Build a 32-bit alarm and counter from the atmega1281's 8-bit timer 2 * in asynchronous mode. Attempting to use the generic Atm128AlarmC * component and the generic timer components runs into problems * apparently related to letting timer 2 overflow. * * So, instead, this version (inspired by the 1.x code and a remark from * Martin Turon) directly builds a 32-bit alarm and counter on top of timer 2 * and never lets timer 2 overflow. * * @author David Gay * @author Janos Sallai */ generic module Atm1281AlarmAsyncP(typedef precision, int divider) @safe() { provides { interface Init; interface Alarm; interface Counter; } uses { interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; interface HplAtm128TimerAsync as TimerAsync; } } implementation { uint8_t set; /* Is the alarm set? */ uint32_t t0, dt; /* Time of the next alarm */ norace uint32_t base; /* base+TCNT2 is the current time if no interrupt is pending. See Counter.get() for the full details. */ enum { MINDT = 2, /* Minimum interval between interrupts */ MAXT = 230 /* Maximum value to let timer 2 reach (from Joe Polastre and Robert Szewczyk's painful experiences with the 1.x timer ;-)) */ }; void setInterrupt(); /* Configure timer 2 */ command error_t Init.init() { atomic { Atm128_TCCR2A_t x; Atm128_TCCR2B_t y; call TimerAsync.setTimer2Asynchronous(); x.flat = 0; x.bits.wgm21 = 1; /* We use the clear-on-compare mode */ call TimerCtrl.setControlA(x.flat); y.flat = 0; y.bits.cs = divider; call TimerCtrl.setControlB(y.flat); call Compare.set(MAXT); /* setInterrupt needs a valid value here */ call Compare.start(); } setInterrupt(); return SUCCESS; } /* Set compare register for timer 2 to n. But increment n by 1 if TCNT2 reaches this value before we can set the compare register. */ void setOcr2A(uint8_t n) { while (call TimerAsync.compareABusy()) ; if (n == call Timer.get()) n++; /* Support for overflow. Force interrupt at wrap around value. This does not cause a backwards-in-time value as we do this every time we set OCR2A. */ if (base + n + 1 < base) n = -base - 1; call Compare.set(n); } /* Update the compare register to trigger an interrupt at the appropriate time based on the current alarm settings */ void setInterrupt() { bool fired = FALSE; atomic { /* interrupt_in is the time to the next interrupt. Note that compare register values are off by 1 (i.e., if you set OCR2A to 3, the interrupt will happen when TCNT2 is 4) */ uint8_t interrupt_in = 1 + call Compare.get() - call Timer.get(); uint8_t newOcr2A; uint8_t tifr2 = call TimerCtrl.getInterruptFlag(); dbg("Atm1281AlarmAsyncP", "Atm1281AlarmAsyncP: TIFR is %hhx\n", tifr2); if ((interrupt_in != 0 && interrupt_in < MINDT) || (tifr2 & (1 << OCF2A))) { if (interrupt_in < MINDT) { dbg("Atm1281AlarmAsyncP", "Atm1281AlarmAsyncP: under min: %hhu.\n", interrupt_in); } else { dbg("Atm1281AlarmAsyncP", "Atm1281AlarmAsyncP: OCF2A set.\n"); } return; // wait for next interrupt } /* When no alarm is set, we just ask for an interrupt every MAXT */ if (!set) { newOcr2A = MAXT; dbg("Atm1281AlarmAsyncP", "Atm1281AlarmAsyncP: no alarm set, set at max.\n"); } else { uint32_t now = call Counter.get(); dbg("Atm1281AlarmAsyncP", "Atm1281AlarmAsyncP: now-t0 = %llu, dt = %llu\n", (now-t0), dt); /* Check if alarm expired */ if ((uint32_t)(now - t0) >= dt) { set = FALSE; fired = TRUE; newOcr2A = MAXT; } else { /* No. Set compare register to time of next alarm if it's within the next MAXT units */ uint32_t alarm_in = (t0 + dt) - base; if (alarm_in > MAXT) newOcr2A = MAXT; else if ((uint8_t)alarm_in < MINDT) // alarm_in < MAXT ... newOcr2A = MINDT; else newOcr2A = alarm_in; } } newOcr2A--; // interrupt is 1ms late setOcr2A(newOcr2A); } if (fired) signal Alarm.fired(); } async event void Compare.fired() { int overflowed; /* Compare register fired. Update time knowledge */ base += call Compare.get() + 1U; // interrupt is 1ms late overflowed = !base; __nesc_enable_interrupt(); setInterrupt(); if (overflowed) signal Counter.overflow(); } async command uint32_t Counter.get() { uint32_t now; atomic { /* Current time is base+TCNT2 if no interrupt is pending. But if an interrupt is pending, then it's base + compare value + 1 + TCNT2 */ uint8_t now8 = call Timer.get(); if ((((Atm128_TIFR2_t)call TimerCtrl.getInterruptFlag())).bits.ocfa) /* We need to reread TCNT2 as it might've overflowed after we read TCNT2 the first time */ now = base + call Compare.get() + 1 + call Timer.get(); else /* We need to use the value of TCNT2 from before we check the interrupt flag, as it might wrap around after the check */ now = base + now8; } return now; } async command bool Counter.isOverflowPending() { atomic return (((Atm128_TIFR2_t)call TimerCtrl.getInterruptFlag())).bits.ocfa && !(base + call Compare.get() + 1); } async command void Counter.clearOverflow() { atomic if (call Counter.isOverflowPending()) { base = 0; call Compare.reset(); } else return; setInterrupt(); } async command void Alarm.start(uint32_t ndt) { call Alarm.startAt(call Counter.get(), ndt); } async command void Alarm.stop() { atomic set = FALSE; } async command bool Alarm.isRunning() { atomic return set; } async command void Alarm.startAt(uint32_t nt0, uint32_t ndt) { atomic { set = TRUE; t0 = nt0; dt = ndt; } setInterrupt(); } async command uint32_t Alarm.getNow() { return call Counter.get(); } async command uint32_t Alarm.getAlarm() { atomic return t0 + dt; } async event void Timer.overflow() { } } tinyos-2.1.2+dfsg/tos/chips/atm1281/timer/Atm128AlarmAsyncC.nc000066400000000000000000000061631207233610700234730ustar00rootroot00000000000000// $Id: Atm128AlarmAsyncC.nc,v 1.2 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Build a 32-bit alarm and counter from the atmega1281's 8-bit timer 2 * in asynchronous mode. Attempting to use the generic Atm128AlarmC * component and the generic timer components runs into problems * apparently related to letting timer 2 overflow. * * So, instead, this version (inspired by the 1.x code and a remark from * Martin Turon) directly builds a 32-bit alarm and counter on top of timer 2 * and never lets timer 2 overflow. * * @author David Gay * @author Janos Sallai */ generic configuration Atm128AlarmAsyncC(typedef precision, int divider) { provides { interface Init @atleastonce(); interface Alarm; interface Counter; } } implementation { components new Atm1281AlarmAsyncP(precision, divider), HplAtm1281Timer2AsyncC; Init = Atm1281AlarmAsyncP; Alarm = Atm1281AlarmAsyncP; Counter = Atm1281AlarmAsyncP; Atm1281AlarmAsyncP.Timer -> HplAtm1281Timer2AsyncC; Atm1281AlarmAsyncP.TimerCtrl -> HplAtm1281Timer2AsyncC; Atm1281AlarmAsyncP.Compare -> HplAtm1281Timer2AsyncC; Atm1281AlarmAsyncP.TimerAsync -> HplAtm1281Timer2AsyncC; } tinyos-2.1.2+dfsg/tos/chips/atm1281/timer/Atm128Timer.h000066400000000000000000000350031207233610700222400ustar00rootroot00000000000000// $Id: Atm128Timer.h,v 1.2 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * This file contains the configuration constants for the Atmega1281 * clocks and timers. * * @author Philip Levis * @author Martin Turon * @author Janos Sallai */ #ifndef _H_Atm128Timer_h #define _H_Atm128Timer_h /* Prescaler values for Timer/Counter 2 (8-bit asynchronous ) */ enum { ATM128_CLK8_OFF = 0x0, ATM128_CLK8_NORMAL = 0x1, ATM128_CLK8_DIVIDE_8 = 0x2, ATM128_CLK8_DIVIDE_32 = 0x3, ATM128_CLK8_DIVIDE_64 = 0x4, ATM128_CLK8_DIVIDE_128 = 0x5, ATM128_CLK8_DIVIDE_256 = 0x6, ATM128_CLK8_DIVIDE_1024 = 0x7, }; /* Prescaler values for Timer/Counter 0 (8-bit) and 1, 3, 4, 5 (16-bit) */ enum { ATM128_CLK16_OFF = 0x0, ATM128_CLK16_NORMAL = 0x1, ATM128_CLK16_DIVIDE_8 = 0x2, ATM128_CLK16_DIVIDE_64 = 0x3, ATM128_CLK16_DIVIDE_256 = 0x4, ATM128_CLK16_DIVIDE_1024 = 0x5, ATM128_CLK16_EXTERNAL_FALL = 0x6, ATM128_CLK16_EXTERNAL_RISE = 0x7, }; /* Common scales across both 8-bit and 16-bit clocks. */ enum { AVR_CLOCK_OFF = 0, AVR_CLOCK_ON = 1, AVR_CLOCK_DIVIDE_8 = 2, }; enum { ATM128_TIMER_COMPARE_NORMAL = 0, ATM128_TIMER_COMPARE_TOGGLE, ATM128_TIMER_COMPARE_CLEAR, ATM128_TIMER_COMPARE_SET }; /* 8-bit Waveform Generation Modes */ enum { ATM128_WAVE8_NORMAL = 0, ATM128_WAVE8_PWM, ATM128_WAVE8_CTC, ATM128_WAVE8_PWM_FAST, }; /* 16-bit Waveform Generation Modes */ enum { ATM128_WAVE16_NORMAL = 0, ATM128_WAVE16_PWM_8BIT, ATM128_WAVE16_PWM_9BIT, ATM128_WAVE16_PWM_10BIT, ATM128_WAVE16_CTC_COMPARE, ATM128_WAVE16_PWM_FAST_8BIT, ATM128_WAVE16_PWM_FAST_9BIT, ATM128_WAVE16_PWM_FAST_10BIT, ATM128_WAVE16_PWM_CAPTURE_LOW, ATM128_WAVE16_PWM_COMPARE_LOW, ATM128_WAVE16_PWM_CAPTURE_HIGH, ATM128_WAVE16_PWM_COMPARE_HIGH, ATM128_WAVE16_CTC_CAPTURE, ATM128_WAVE16_RESERVED, ATM128_WAVE16_PWM_FAST_CAPTURE, ATM128_WAVE16_PWM_FAST_COMPARE, }; /* 8-bit Timer compare settings */ enum { ATM128_COMPARE_OFF = 0, //!< compare disconnected ATM128_COMPARE_TOGGLE, //!< toggle on match (PWM reserved ATM128_COMPARE_CLEAR, //!< clear on match (PWM downcount) ATM128_COMPARE_SET, //!< set on match (PWN upcount) }; /* 8-bit Timer/Counter 0 Control Register A*/ typedef union { uint8_t flat; struct { uint8_t wgm00 : 1; //!< Waveform generation mode (low bit) uint8_t wgm01 : 1; //!< Waveform generation mode (high bit) uint8_t resv1 : 2; //!< Compare Match Output uint8_t com0b0: 1; //!< Compare Match Output uint8_t com0b1: 1; //!< Compare Match Output uint8_t com0a0: 1; //!< Compare Match Output uint8_t com0a1: 1; //!< Compare Match Output } bits; } Atm128_TCCR0A_t; /* 8-bit Timer/Counter 0 Control Register B*/ typedef union { uint8_t flat; struct { uint8_t cs00 : 1; //!< Clock Select 0 uint8_t cs01 : 1; //!< Clock Select 1 uint8_t cs02 : 2; //!< Clock Select 2 uint8_t wgm02 : 1; //!< Waveform Generation Mode uint8_t resv1 : 2; //!< Reserved uint8_t foc0b : 1; //!< Force Output Compare B uint8_t foc0a : 1; //!< Force Output Compare A } bits; } Atm128_TCCR0B_t; /* Timer/Counter 0 Interrupt Mask Register */ typedef union { uint8_t flat; struct { uint8_t toie0 : 1; //!< Timer/Counter0 Overflow Interrupt Enable uint8_t ocie0a: 1; //!< Timer/Counter0 Output Compare Match A Interrupt Enable uint8_t ocie0e: 1; //!< Timer/Counter Output Compare Match B Interrupt Enable uint8_t resv1 : 5; //!< Reserved } bits; } Atm128_TIMSK0_t; /* Timer/Counter 0 Interrupt Flag Register*/ typedef union { uint8_t flat; struct { uint8_t tov0 : 1; //!< Timer/Counter0 Overflow Flag uint8_t ocf0a : 1; //!< Timer/Counter 0 Output Compare A Match Flag uint8_t ocf0b : 1; //!< Timer/Counter 0 Output Compare B Match Flag uint8_t resv1 : 5; //!< Reserved } bits; } Atm128_TIFR0_t; /* Asynchronous Status Register -- Timer2 */ typedef union { uint8_t flat; struct { uint8_t tcr2bub: 1; //!< Timer/Counter Control Register2 Update Busy uint8_t tcr2aub: 1; //!< Timer/Counter Control Register2 Update Busy uint8_t ocr2bub: 1; //!< Output Compare Register2 Update Busy uint8_t ocr2aub: 1; //!< Output Compare Register2 Update Busy uint8_t tcn2ub : 1; //!< Timer/Counter2 Update Busy uint8_t as2 : 1; //!< Asynchronous Timer/Counter2 (off=CLK_IO,on=TOSC1) uint8_t exclk : 1; //!< Enable External Clock Input uint8_t resv1 : 1; //!< Reserved } bits; } Atm128_ASSR_t; /* Timer/Counter 2 Control Register A*/ typedef union { uint8_t flat; struct { uint8_t wgm20 : 1; //!< Waveform Generation Mode uint8_t wgm21 : 1; //!< Waveform Generation Mode uint8_t resv1 : 2; //!< Reserved uint8_t comb: 2; //!< Compare Output Mode for Channel B uint8_t coma: 2; //!< Compare Output Mode for Channel A } bits; } Atm128_TCCR2A_t; /* Timer/Counter 2 Control Register B*/ typedef union { uint8_t flat; struct { uint8_t cs : 3; //!< Clock Select uint8_t wgm22 : 1; //!< Waveform Generation Mode uint8_t resv1 : 2; //!< Reserved uint8_t foc2b : 1; //!< Force Output Compare B uint8_t foc2a : 1; //!< Force Output Compare A } bits; } Atm128_TCCR2B_t; /* Timer/Counter 2 Interrupt Mask Register */ typedef union { uint8_t flat; struct { uint8_t toie : 1; //!< Timer/Counter2 Overflow Interrupt Enable uint8_t ociea: 1; //!< Timer/Counter2 Output Compare Match A Interrupt Enable uint8_t ocieb: 1; //!< Timer/Counter Output Compare Match B Interrupt Enable uint8_t resv1 : 5; //!< Reserved } bits; } Atm128_TIMSK2_t; /* Timer/Counter 2 Interrupt Flag Register */ typedef union { uint8_t flat; struct { uint8_t tov : 1; //!< Timer1 Overflow Flag uint8_t ocfa : 1; //!< Timer1 Output Compare Flag A uint8_t ocfb : 1; //!< Timer1 Output Compare Flag B uint8_t resv1 : 5; //!< Reserved } bits; } Atm128_TIFR2_t; /* Timer/Counter 1,3,4,5 Control Register A*/ typedef union { uint8_t flat; struct { uint8_t wgm01 : 2; //!< Waveform Generation Mode uint8_t comc : 2; //!< Compare Output Mode for Channel C uint8_t comb : 2; //!< Compare Output Mode for Channel B uint8_t coma : 2; //!< Compare Output Mode for Channel A } bits; } Atm128_TCCRA_t; /* Timer/Counter 1,3,4,5 Control Register B*/ typedef union { uint8_t flat; struct { uint8_t cs : 3; //!< Clock Select uint8_t wgm23 : 2; //!< Waveform Generation Mode uint8_t resv1 : 1; //!< Reserved uint8_t ices : 1; //!< Input Capture Edge Select uint8_t icnc : 1; //!< Input Capture Noise Canceler } bits; } Atm128_TCCRB_t; /* Timer/Counter 1,3,4,5 Control Register C*/ typedef union { uint8_t flat; struct { uint8_t resv1 : 5; //!< Reserved uint8_t focc : 1; //!< Force Output Compare for Channel A uint8_t focb : 1; //!< Force Output Compare for Channel A uint8_t foca : 1; //!< Force Output Compare for Channel A } bits; } Atm128_TCCRC_t; /* Timer/Counter 1,3,4,5 Interrupt Mask Register */ typedef union { uint8_t flat; struct { uint8_t toie : 1; //!< Timer/Counter1 Overflow Interrupt Enable uint8_t ociea: 1; //!< Timer/Counter1 Output Compare Match A Interrupt Enable uint8_t ocieb: 1; //!< Timer/Counter1 Output Compare Match B Interrupt Enable uint8_t ociec: 1; //!< Timer/Counter1 Output Compare Match C Interrupt Enable uint8_t resv1: 1; //!< Reserved uint8_t icie : 1; //!< Timer/Counter1, Input Capture Interrupt Enable uint8_t resv2 : 2; //!< Reserved } bits; } Atm128_TIMSK_t; /* Timer/Counter 1,3,4,5 Interrupt Flag Register */ typedef union { uint8_t flat; struct { uint8_t tov : 1; //!< Timer1 Overflow Flag uint8_t ocfa : 1; //!< Timer1 Output Compare Flag A uint8_t ocfb : 1; //!< Timer1 Output Compare Flag B uint8_t ocfc : 1; //!< Timer1 Output Compare Flag C uint8_t resv1: 1; //!< Reserved uint8_t icf : 1; //!< Timer1 Input Capture Flag uint8_t resv2: 2; //!< Reserved } bits; } Atm128_TIFR_t; /* General Timer/Counter Control Register */ typedef union { uint8_t flat; struct { uint8_t psrsync: 1; //!< Prescaler Reset for Synchronous Timer/Counters 0,1,3,4,5 uint8_t psrasy : 1; //!< Prescaler Reset Timer/Counter2 uint8_t resv1 : 5; //!< Reserved uint8_t tsm : 1; //!< Timer/Counter Synchronization Mode } bits; } Atm128_GTCCR_t; // Read/Write these 16-bit Timer registers // Access as bytes. Read low before high. Write high before low. typedef uint8_t Atm128_TCNT1H_t; //!< Timer1 Register typedef uint8_t Atm128_TCNT1L_t; //!< Timer1 Register typedef uint8_t Atm128_TCNT3H_t; //!< Timer3 Register typedef uint8_t Atm128_TCNT3L_t; //!< Timer3 Register typedef uint8_t Atm128_TCNT4H_t; //!< Timer4 Register typedef uint8_t Atm128_TCNT4L_t; //!< Timer4 Register typedef uint8_t Atm128_TCNT5H_t; //!< Timer5 Register typedef uint8_t Atm128_TCNT5L_t; //!< Timer5 Register /* Contains value to continuously compare with Timer1 */ typedef uint8_t Atm128_OCR1AH_t; //!< Output Compare Register 1A typedef uint8_t Atm128_OCR1AL_t; //!< Output Compare Register 1A typedef uint8_t Atm128_OCR1BH_t; //!< Output Compare Register 1B typedef uint8_t Atm128_OCR1BL_t; //!< Output Compare Register 1B typedef uint8_t Atm128_OCR1CH_t; //!< Output Compare Register 1C typedef uint8_t Atm128_OCR1CL_t; //!< Output Compare Register 1C /* Contains value to continuously compare with Timer3 */ typedef uint8_t Atm128_OCR3AH_t; //!< Output Compare Register 3A typedef uint8_t Atm128_OCR3AL_t; //!< Output Compare Register 3A typedef uint8_t Atm128_OCR3BH_t; //!< Output Compare Register 3B typedef uint8_t Atm128_OCR3BL_t; //!< Output Compare Register 3B typedef uint8_t Atm128_OCR3CH_t; //!< Output Compare Register 3C typedef uint8_t Atm128_OCR3CL_t; //!< Output Compare Register 3C /* Contains value to continuously compare with Timer4 */ typedef uint8_t Atm128_OCR4AH_t; //!< Output Compare Register 4A typedef uint8_t Atm128_OCR4AL_t; //!< Output Compare Register 4A typedef uint8_t Atm128_OCR4BH_t; //!< Output Compare Register 4B typedef uint8_t Atm128_OCR4BL_t; //!< Output Compare Register 4B typedef uint8_t Atm128_OCR4CH_t; //!< Output Compare Register 4C typedef uint8_t Atm128_OCR4CL_t; //!< Output Compare Register 4C /* Contains value to continuously compare with Timer5 */ typedef uint8_t Atm128_OCR5AH_t; //!< Output Compare Register 5A typedef uint8_t Atm128_OCR5AL_t; //!< Output Compare Register 5A typedef uint8_t Atm128_OCR5BH_t; //!< Output Compare Register 5B typedef uint8_t Atm128_OCR5BL_t; //!< Output Compare Register 5B typedef uint8_t Atm128_OCR5CH_t; //!< Output Compare Register 5C typedef uint8_t Atm128_OCR5CL_t; //!< Output Compare Register 5C /* Contains counter value when event occurs on ICPn pin. */ typedef uint8_t Atm128_ICR1H_t; //!< Input Capture Register 1 typedef uint8_t Atm128_ICR1L_t; //!< Input Capture Register 1 typedef uint8_t Atm128_ICR3H_t; //!< Input Capture Register 3 typedef uint8_t Atm128_ICR3L_t; //!< Input Capture Register 3 typedef uint8_t Atm128_ICR4H_t; //!< Input Capture Register 4 typedef uint8_t Atm128_ICR4L_t; //!< Input Capture Register 4 typedef uint8_t Atm128_ICR5H_t; //!< Input Capture Register 5 typedef uint8_t Atm128_ICR5L_t; //!< Input Capture Register 5 /* Resource strings for timer 1 and 3 compare registers */ #define UQ_TIMER1_COMPARE "atm128.timer1" #define UQ_TIMER3_COMPARE "atm128.timer3" #endif //_H_Atm128Timer_h tinyos-2.1.2+dfsg/tos/chips/atm1281/timer/HplAtm1281Timer1P.nc000066400000000000000000000227541207233610700233500ustar00rootroot00000000000000 /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Internal component of the HPL interface to Atmega1281 timer 1. * * @author Martin Turon * @author Janos Sallai */ #include module HplAtm1281Timer1P @safe() { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as CompareA; interface HplAtm128Compare as CompareB; interface HplAtm128Compare as CompareC; } } implementation { //=== Read the current timer value. =================================== async command uint16_t Timer.get() { return TCNT1; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint16_t t) { TCNT1 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR1B & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128_TCCRB_t x = (Atm128_TCCRB_t) call TimerCtrl.getControlB(); x.bits.cs = s; call TimerCtrl.setControlB(x.flat); } //=== Read the control registers. ===================================== async command uint8_t TimerCtrl.getControlA() { return TCCR1A; } async command uint8_t TimerCtrl.getControlB() { return TCCR1B; } async command uint8_t TimerCtrl.getControlC() { return TCCR1C; } //=== Write the control registers. ==================================== async command void TimerCtrl.setControlA( uint8_t x ) { TCCR1A = x; } async command void TimerCtrl.setControlB( uint8_t x ) { TCCR1B = x; } async command void TimerCtrl.setControlC( uint8_t x ) { TCCR1C = x; } //=== Read the interrupt mask. ===================================== async command uint8_t TimerCtrl.getInterruptMask() { return TIMSK1; } //=== Write the interrupt mask. ==================================== async command void TimerCtrl.setInterruptMask( uint8_t x ) { TIMSK1 = x; } //=== Read the interrupt flags. ===================================== async command uint8_t TimerCtrl.getInterruptFlag() { return TIFR1; } //=== Write the interrupt flags. ==================================== async command void TimerCtrl.setInterruptFlag( uint8_t x ) { TIFR1 = x; } //=== Capture 16-bit implementation. =================================== async command void Capture.setEdge(bool up) { WRITE_BIT(TCCR1B,ICES1, up); } //=== Timer 16-bit implementation. =================================== async command void Timer.reset() { TIFR1 = 1 << TOV1; } async command void Capture.reset() { TIFR1 = 1 << ICF1; } async command void CompareA.reset() { TIFR1 = 1 << OCF1A; } async command void CompareB.reset() { TIFR1 = 1 << OCF1B; } async command void CompareC.reset() { TIFR1 = 1 << OCF1C; } async command void Timer.start() { SET_BIT(TIMSK1,TOIE1); } async command void Capture.start() { SET_BIT(TIMSK1,ICIE1); } async command void CompareA.start() { SET_BIT(TIMSK1,OCIE1A); } async command void CompareB.start() { SET_BIT(TIMSK1,OCIE1B); } async command void CompareC.start() { SET_BIT(TIMSK1,OCIE1C); } async command void Timer.stop() { CLR_BIT(TIMSK1,TOIE1); } async command void Capture.stop() { CLR_BIT(TIMSK1,ICIE1); } async command void CompareA.stop() { CLR_BIT(TIMSK1,OCIE1A); } async command void CompareB.stop() { CLR_BIT(TIMSK1,OCIE1B); } async command void CompareC.stop() { CLR_BIT(TIMSK1,OCIE1C); } async command bool Timer.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.tov; } async command bool Capture.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.icf; } async command bool CompareA.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.ocfa; } async command bool CompareB.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.ocfb; } async command bool CompareC.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.ocfc; } async command bool Timer.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.toie; } async command bool Capture.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.icie; } async command bool CompareA.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.ociea; } async command bool CompareB.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.ocieb; } async command bool CompareC.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.ociec; } //=== Read the compare registers. ===================================== async command uint16_t CompareA.get() { return OCR1A; } async command uint16_t CompareB.get() { return OCR1B; } async command uint16_t CompareC.get() { return OCR1C; } //=== Write the compare registers. ==================================== async command void CompareA.set(uint16_t t) { OCR1A = t; } async command void CompareB.set(uint16_t t) { OCR1B = t; } async command void CompareC.set(uint16_t t) { OCR1C = t; } //=== Read the capture registers. ===================================== async command uint16_t Capture.get() { return ICR1; } //=== Write the capture registers. ==================================== async command void Capture.set(uint16_t t) { ICR1 = t; } //=== Timer interrupts signals ======================================== default async event void CompareA.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE1A) { signal CompareA.fired(); } default async event void CompareB.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE1B) { signal CompareB.fired(); } default async event void CompareC.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE1C) { signal CompareC.fired(); } default async event void Capture.captured(uint16_t time) { } AVR_NONATOMIC_HANDLER(SIG_INPUT_CAPTURE1) { signal Capture.captured(call Capture.get()); } default async event void Timer.overflow() { } AVR_NONATOMIC_HANDLER(SIG_OVERFLOW1) { signal Timer.overflow(); } } tinyos-2.1.2+dfsg/tos/chips/atm1281/timer/HplAtm1281Timer2AsyncC.nc000066400000000000000000000100111207233610700243110ustar00rootroot00000000000000/// $Id: HplAtm1281Timer2AsyncC.nc,v 1.2 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Simple wrapper around the actual timer implementation that automatically * wires it to McuSleepC for low-power calculations.. * * @author Philip Levis * @author David Gay * @author Janos Sallai */ #include configuration HplAtm1281Timer2AsyncC { provides { // 8-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; interface HplAtm128TimerAsync as TimerAsync; } } implementation { components HplAtm1281Timer2AsyncP; components McuSleepC; McuSleepC.McuPowerOverride -> HplAtm1281Timer2AsyncP; Timer = HplAtm1281Timer2AsyncP; TimerCtrl = HplAtm1281Timer2AsyncP; Compare = HplAtm1281Timer2AsyncP; TimerAsync = HplAtm1281Timer2AsyncP; } tinyos-2.1.2+dfsg/tos/chips/atm1281/timer/HplAtm1281Timer2AsyncP.nc000066400000000000000000000234431207233610700243430ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * HPL interface to Atmega1281 timer 2 in ASYNC mode. This is a specialised * HPL component that assumes that timer 2 is used in ASYNC mode and * includes some workarounds for some of the weirdnesses (delayed overflow * interrupt) of that mode. * * @author Martin Turon * @author David Gay * @author Janos Sallai */ #include module HplAtm1281Timer2AsyncP @safe() { provides { // 8-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; interface McuPowerOverride; interface HplAtm128TimerAsync as TimerAsync; } } implementation { // bool inOverflow; // command error_t Init.init() { // SET_BIT(ASSR, AS2); // set Timer/Counter2 to asynchronous mode // return SUCCESS; // } //=== Read the current timer value. =================================== async command uint8_t Timer.get() { return TCNT2; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint8_t t) { while (ASSR & 1 << TCN2UB) ; TCNT2 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR2B & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128_TCCR2B_t x = (Atm128_TCCR2B_t) call TimerCtrl.getControlB(); x.bits.cs = s; call TimerCtrl.setControlB(x.flat); } //=== Read the control registers. ===================================== async command uint8_t TimerCtrl.getControlA() { return TCCR2A; } async command uint8_t TimerCtrl.getControlB() { return TCCR2B; } //=== Write the control registers. ==================================== async command void TimerCtrl.setControlA( uint8_t x ) { while (ASSR & 1 << TCR2AUB) ; TCCR2A = ((Atm128_TCCR2A_t)x).flat; } async command void TimerCtrl.setControlB( uint8_t x ) { while (ASSR & 1 << TCR2BUB) ; TCCR2B = ((Atm128_TCCR2B_t)x).flat; } //=== Read the interrupt mask. ===================================== async command uint8_t TimerCtrl.getInterruptMask() { return TIMSK2; } //=== Write the interrupt mask. ==================================== async command void TimerCtrl.setInterruptMask( uint8_t x ) { TIMSK2 = x; } //=== Read the interrupt flags. ===================================== async command uint8_t TimerCtrl.getInterruptFlag() { return TIFR2; } //=== Write the interrupt flags. ==================================== async command void TimerCtrl.setInterruptFlag( uint8_t x ) { TIFR2 = x; } //=== Timer 8-bit implementation. ==================================== async command void Timer.reset() { TIFR2 = 1 << TOV2; } async command void Timer.start() { SET_BIT(TIMSK2, TOIE2); } async command void Timer.stop() { CLR_BIT(TIMSK2, TOIE2); } bool overflowed() { return ((Atm128_TIFR2_t)call TimerCtrl.getInterruptFlag()).bits.tov; } async command bool Timer.test() { return overflowed(); } async command bool Timer.isOn() { return ((Atm128_TIMSK2_t)call TimerCtrl.getInterruptMask()).bits.toie; } async command void Compare.reset() { TIFR2 = 1 << OCF2A; } async command void Compare.start() { SET_BIT(TIMSK2,OCIE2A); } async command void Compare.stop() { CLR_BIT(TIMSK2,OCIE2A); } async command bool Compare.test() { return ((Atm128_TIFR2_t)call TimerCtrl.getInterruptFlag()).bits.ocfa; } async command bool Compare.isOn() { return ((Atm128_TIMSK2_t)call TimerCtrl.getInterruptMask()).bits.ociea; } //=== Read the compare registers. ===================================== async command uint8_t Compare.get(){ return OCR2A; } //=== Write the compare registers. ==================================== async command void Compare.set(uint8_t t) { atomic { while (ASSR & 1 << OCR2AUB) ; OCR2A = t; } } //=== Timer interrupts signals ======================================== inline void stabiliseTimer2() { TCCR2A = TCCR2A; while (ASSR & 1 << TCR2AUB) ; } /** * On the atm128, there is a small latency when waking up from * POWER_SAVE mode. So if a timer is going to go off very soon, it's * better to drop down until EXT_STANDBY, which has a 6 cycle wakeup * latency. This function calculates whether staying in EXT_STANDBY * is needed. If the timer is not running it returns POWER_DOWN. * Please refer to TEP 112 and the atm128 datasheet for details. */ async command mcu_power_t McuPowerOverride.lowestState() { uint8_t diff; // We need to make sure that the sleep wakeup latency will not // cause us to miss a timer. POWER_SAVE if (TIMSK2 & (1 << OCIE2A | 1 << TOIE2)) { // need to wait for timer 2 updates propagate before sleeping // (we don't need to worry about reentering sleep mode too early, // as the wake ups from timer2 wait at least one TOSC1 cycle // anyway - see the stabiliseTimer2 function) while (ASSR & (1 << TCN2UB | 1 << OCR2AUB | 1 << TCR2AUB)) ; diff = OCR2A - TCNT2; if (diff < EXT_STANDBY_T0_THRESHOLD || TCNT2 > 256 - EXT_STANDBY_T0_THRESHOLD) return ATM128_POWER_EXT_STANDBY; return ATM128_POWER_SAVE; } else { return ATM128_POWER_DOWN; } } default async event void Compare.fired() { } AVR_ATOMIC_HANDLER(SIG_OUTPUT_COMPARE2A) { stabiliseTimer2(); // __nesc_enable_interrupt(); signal Compare.fired(); } default async event void Timer.overflow() { } AVR_ATOMIC_HANDLER(SIG_OVERFLOW2) { stabiliseTimer2(); // inOverflow = TRUE; signal Timer.overflow(); // inOverflow = FALSE; } // Asynchronous status register support async command Atm128_ASSR_t TimerAsync.getAssr() { return *(Atm128_ASSR_t *)&ASSR; } async command void TimerAsync.setAssr(Atm128_ASSR_t x) { ASSR = x.flat; } async command void TimerAsync.setTimer2Asynchronous() { ASSR |= 1 << AS2; } async command int TimerAsync.controlABusy() { return (ASSR & (1 << TCR2AUB)) != 0; } async command int TimerAsync.controlBBusy() { return (ASSR & (1 << TCR2BUB)) != 0; } async command int TimerAsync.compareABusy() { return (ASSR & (1 << OCR2AUB)) != 0; } async command int TimerAsync.compareBBusy() { return (ASSR & (1 << OCR2BUB)) != 0; } async command int TimerAsync.countBusy() { return (ASSR & (1 << TCN2UB)) != 0; } } tinyos-2.1.2+dfsg/tos/chips/atm1281/timer/HplAtm1281Timer3P.nc000066400000000000000000000227551207233610700233530ustar00rootroot00000000000000 /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Internal component of the HPL interface to Atmega1281 timer 3. * * @author Martin Turon * @author Janos Sallai */ #include module HplAtm1281Timer3P @safe() { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as CompareA; interface HplAtm128Compare as CompareB; interface HplAtm128Compare as CompareC; } } implementation { //=== Read the current timer value. =================================== async command uint16_t Timer.get() { return TCNT3; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint16_t t) { TCNT3 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR3B & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128_TCCRB_t x = (Atm128_TCCRB_t) call TimerCtrl.getControlB(); x.bits.cs = s; call TimerCtrl.setControlB(x.flat); } //=== Read the control registers. ===================================== async command uint8_t TimerCtrl.getControlA() { return TCCR3A; } async command uint8_t TimerCtrl.getControlB() { return TCCR3B; } async command uint8_t TimerCtrl.getControlC() { return TCCR3C; } //=== Write the control registers. ==================================== async command void TimerCtrl.setControlA( uint8_t x ) { TCCR3A = x; } async command void TimerCtrl.setControlB( uint8_t x ) { TCCR3B = x; } async command void TimerCtrl.setControlC( uint8_t x ) { TCCR3C = x; } //=== Read the interrupt mask. ===================================== async command uint8_t TimerCtrl.getInterruptMask() { return TIMSK3; } //=== Write the interrupt mask. ==================================== async command void TimerCtrl.setInterruptMask( uint8_t x ) { TIMSK3 = x; } //=== Read the interrupt flags. ===================================== async command uint8_t TimerCtrl.getInterruptFlag() { return TIFR3; } //=== Write the interrupt flags. ==================================== async command void TimerCtrl.setInterruptFlag( uint8_t x ) { TIFR3 = x; } //=== Capture 16-bit implementation. =================================== async command void Capture.setEdge(bool up) { WRITE_BIT(TCCR3B, ICES3, up); } //=== Timer 16-bit implementation. =================================== async command void Timer.reset() { TIFR3 = 1 << TOV3; } async command void Capture.reset() { TIFR3 = 1 << ICF3; } async command void CompareA.reset() { TIFR3 = 1 << OCF3A; } async command void CompareB.reset() { TIFR3 = 1 << OCF3B; } async command void CompareC.reset() { TIFR3 = 1 << OCF3C; } async command void Timer.start() { SET_BIT(TIMSK3,TOIE3); } async command void Capture.start() { SET_BIT(TIMSK3,ICIE3); } async command void CompareA.start() { SET_BIT(TIMSK3,OCIE3A); } async command void CompareB.start() { SET_BIT(TIMSK3,OCIE3B); } async command void CompareC.start() { SET_BIT(TIMSK3,OCIE3C); } async command void Timer.stop() { CLR_BIT(TIMSK3,TOIE3); } async command void Capture.stop() { CLR_BIT(TIMSK3,ICIE3); } async command void CompareA.stop() { CLR_BIT(TIMSK3,OCIE3A); } async command void CompareB.stop() { CLR_BIT(TIMSK3,OCIE3B); } async command void CompareC.stop() { CLR_BIT(TIMSK3,OCIE3C); } async command bool Timer.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.tov; } async command bool Capture.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.icf; } async command bool CompareA.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.ocfa; } async command bool CompareB.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.ocfb; } async command bool CompareC.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.ocfc; } async command bool Timer.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.toie; } async command bool Capture.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.icie; } async command bool CompareA.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.ociea; } async command bool CompareB.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.ocieb; } async command bool CompareC.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.ociec; } //=== Read the compare registers. ===================================== async command uint16_t CompareA.get() { return OCR3A; } async command uint16_t CompareB.get() { return OCR3B; } async command uint16_t CompareC.get() { return OCR3C; } //=== Write the compare registers. ==================================== async command void CompareA.set(uint16_t t) { OCR3A = t; } async command void CompareB.set(uint16_t t) { OCR3B = t; } async command void CompareC.set(uint16_t t) { OCR3C = t; } //=== Read the capture registers. ===================================== async command uint16_t Capture.get() { return ICR3; } //=== Write the capture registers. ==================================== async command void Capture.set(uint16_t t) { ICR3 = t; } //=== Timer interrupts signals ======================================== default async event void CompareA.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE3A) { signal CompareA.fired(); } default async event void CompareB.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE3B) { signal CompareB.fired(); } default async event void CompareC.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE3C) { signal CompareC.fired(); } default async event void Capture.captured(uint16_t time) { } AVR_NONATOMIC_HANDLER(SIG_INPUT_CAPTURE3) { signal Capture.captured(call Capture.get()); } default async event void Timer.overflow() { } AVR_NONATOMIC_HANDLER(SIG_OVERFLOW3) { signal Timer.overflow(); } } tinyos-2.1.2+dfsg/tos/chips/atm1281/timer/HplAtm128Timer1C.nc000066400000000000000000000076751207233610700232570ustar00rootroot00000000000000/// $Id: HplAtm128Timer1C.nc,v 1.2 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * HPL interface to Atmega1281 timer 1. * * @author Martin Turon * @author David Gay * @author Janos Sallai */ configuration HplAtm128Timer1C { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as Compare[uint8_t id]; } } implementation { components HplAtm1281Timer1P; Timer = HplAtm1281Timer1P; TimerCtrl = HplAtm1281Timer1P; Capture = HplAtm1281Timer1P; Compare[0] = HplAtm1281Timer1P.CompareA; Compare[1] = HplAtm1281Timer1P.CompareB; Compare[2] = HplAtm1281Timer1P.CompareC; } tinyos-2.1.2+dfsg/tos/chips/atm1281/timer/HplAtm128Timer3C.nc000066400000000000000000000076751207233610700232610ustar00rootroot00000000000000/// $Id: HplAtm128Timer3C.nc,v 1.2 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * HPL interface to Atmega1281 timer 3. * * @author Martin Turon * @author David Gay * @author Janos Sallai */ configuration HplAtm128Timer3C { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as Compare[uint8_t id]; } } implementation { components HplAtm1281Timer3P; Timer = HplAtm1281Timer3P; TimerCtrl = HplAtm1281Timer3P; Capture = HplAtm1281Timer3P; Compare[0] = HplAtm1281Timer3P.CompareA; Compare[1] = HplAtm1281Timer3P.CompareB; Compare[2] = HplAtm1281Timer3P.CompareC; } tinyos-2.1.2+dfsg/tos/chips/atm1281/timer/HplAtm128TimerAsync.nc000066400000000000000000000067711207233610700240650ustar00rootroot00000000000000// $Id: HplAtm128TimerAsync.nc,v 1.2 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * HPL Interface to Atmega1281 8-bit asynchronous timer control registers * * @author David Gay * @author Janos Sallai */ interface HplAtm128TimerAsync { /** * Read timer2 asynchronous status register (ASSR) * @return Current value of ASSR */ async command Atm128_ASSR_t getAssr(); /** * Set timer2 asynchronous status register (ASSR) * @param x New value for ASSR */ async command void setAssr(Atm128_ASSR_t x); /** * Turn on timer 2 asynchronous mode */ async command void setTimer2Asynchronous(); /** * Check if control register TCCR2A is busy (should not be updated if true) * @return TRUE if TCCR2A is busy, FALSE otherwise (can be updated) */ async command int controlABusy(); /** * Check if control register TCCR2B is busy (should not be updated if true) * @return TRUE if TCCR2B is busy, FALSE otherwise (can be updated) */ async command int controlBBusy(); /** * Check if compare register OCR2A is busy (should not be updated if true) * @return TRUE if OCR2A is busy, FALSE otherwise (can be updated) */ async command int compareABusy(); /** * Check if compare register OCR2B is busy (should not be updated if true) * @return TRUE if OCR2B is busy, FALSE otherwise (can be updated) */ async command int compareBBusy(); /** * Check if current timer value (TCNT2) is busy (should not be updated if true) * @return TRUE if TCNT2 is busy, FALSE otherwise (can be updated) */ async command int countBusy(); } tinyos-2.1.2+dfsg/tos/chips/atm1281/timer/HplAtm128TimerCtrl16.nc000066400000000000000000000100171207233610700240470ustar00rootroot00000000000000/// $Id: HplAtm128TimerCtrl16.nc,v 1.2 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * HPL Interface to Atmega1281 16-bit timer control registers * * @author Martin Turon * @author Janos Sallai */ #include interface HplAtm128TimerCtrl16 { /// Timer control register: Direct access async command uint8_t getControlA(); async command uint8_t getControlB(); async command uint8_t getControlC(); async command void setControlA( uint8_t control ); async command void setControlB( uint8_t control ); async command void setControlC( uint8_t control ); /// Interrupt mask register: Direct access async command uint8_t getInterruptMask(); async command void setInterruptMask( uint8_t mask); /// Interrupt flag register: Direct access async command uint8_t getInterruptFlag(); async command void setInterruptFlag( uint8_t flags ); } tinyos-2.1.2+dfsg/tos/chips/atm1281/timer/HplAtm128TimerCtrl8.nc000066400000000000000000000076531207233610700240040ustar00rootroot00000000000000/// $Id: HplAtm128TimerCtrl8.nc,v 1.2 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * HPL Interface to Atmega1281 8-bit timer control registers * * @author Martin Turon * @author Janos Sallai */ #include interface HplAtm128TimerCtrl8 { /// Timer control register: Direct access async command uint8_t getControlA(); async command uint8_t getControlB(); async command void setControlA( uint8_t control ); async command void setControlB( uint8_t control ); /// Interrupt mask register: Direct access async command uint8_t getInterruptMask(); async command void setInterruptMask( uint8_t mask); /// Interrupt flag register: Direct access async command uint8_t getInterruptFlag(); async command void setInterruptFlag( uint8_t flags ); } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/000077500000000000000000000000001207233610700174625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/BusPowerManager.nc000066400000000000000000000053451207233610700230540ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti, Andras Biro */ interface BusPowerManager { /** * Sets the startup and keepalive timeout values in milliseconds. * Only the largest numbers are remembered, as the bus might not * be operational if one of the chips on it is not operational. */ command void configure(uint16_t startup, uint16_t keepalive); /** * Requests to power up this bus. The bus might be already powered * up, in which case the powerOn event will not come. */ command void requestPower(); /** * Releases the power up request. You must call this command exactly * the same number of times as you have called requestPower. If other * chips still want to keep the power (e.g. a measurement is in * progress), then powerOff will not be called. */ command void releasePower(); /** * This event is called when the bus is powered on and the maximum * specified startup time has elapsed. Implementations should * initialize the chip or go into power down mode. */ event void powerOn(); /** * This event is called when there are no outstanding power requests * and the keepalive timeout value has expired. */ event void powerOff(); } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/BusPowerManagerC.nc000066400000000000000000000037421207233610700231560ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration BusPowerManagerC(bool highIsOn, bool initPin) { provides interface BusPowerManager; uses interface GeneralIO; } implementation { components new BusPowerManagerP(highIsOn, initPin), new TimerMilliC(), RealMainP; BusPowerManager = BusPowerManagerP; GeneralIO = BusPowerManagerP; BusPowerManagerP.Timer -> TimerMilliC; BusPowerManagerP.Init <- RealMainP.PlatformInit; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/BusPowerManagerP.nc000066400000000000000000000064121207233610700231700ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic module BusPowerManagerP(bool highIsOn, bool initPin) { provides interface BusPowerManager; uses interface Timer; uses interface GeneralIO; provides interface Init; } implementation { uint16_t maxStartup; uint16_t maxKeepAlive; uint8_t counter; enum { COUNTER_MASK = 0x7F, COUNTER_TIMER = 0x80, // timer is running }; command error_t Init.init(){ call GeneralIO.makeOutput(); if(initPin){ if( highIsOn ) call GeneralIO.clr(); else call GeneralIO.set(); } return SUCCESS; } command void BusPowerManager.configure(uint16_t startup, uint16_t keepalive) { if( maxStartup < startup ) maxStartup = startup; if( maxKeepAlive < keepalive ) maxKeepAlive = keepalive; } command void BusPowerManager.requestPower() { ++counter; if( counter == 1 ) // bus is off { if( highIsOn ) call GeneralIO.set(); else call GeneralIO.clr(); call Timer.startOneShot(maxStartup); counter = 1 | COUNTER_TIMER; } else if( counter == (1 | COUNTER_TIMER) ) // during keepalive { call Timer.stop(); counter = 1; } } command void BusPowerManager.releasePower() { --counter; if( counter == 0 ) // bus is on { call Timer.startOneShot(maxKeepAlive); counter = COUNTER_TIMER; } else if( counter == 0 + COUNTER_TIMER) // during startup { if( highIsOn ) call GeneralIO.clr(); else call GeneralIO.set(); call Timer.stop(); counter = 0; } } event void Timer.fired() { counter &= COUNTER_MASK; if( counter == 0 ) { if( highIsOn ) call GeneralIO.clr(); else call GeneralIO.set(); signal BusPowerManager.powerOff(); } else { signal BusPowerManager.powerOn(); } } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/DummyBusPowerManagerC.nc000066400000000000000000000035311207233610700241660ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ generic module DummyBusPowerManagerC(){ provides interface BusPowerManager; } implementation { command void BusPowerManager.configure(uint16_t startup, uint16_t keepalive) {} command void BusPowerManager.requestPower() { signal BusPowerManager.powerOn(); } command void BusPowerManager.releasePower() {} } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/HplAtm128UartC.nc000066400000000000000000000053421207233610700223670ustar00rootroot00000000000000/// $Id: HplAtm128UartC.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /// #include /** * HPL for the Atmega 128 serial ports. * * @author Martin Turon * @author David Gay */ configuration HplAtm128UartC { provides { interface StdControl as Uart0TxControl; interface StdControl as Uart0RxControl; interface HplAtm128Uart as HplUart0; interface StdControl as Uart1TxControl; interface StdControl as Uart1RxControl; interface HplAtm128Uart as HplUart1; } } implementation { components HplAtm128UartP, PlatformC, McuSleepC; Uart0TxControl = HplAtm128UartP.Uart0TxControl; Uart0RxControl = HplAtm128UartP.Uart0RxControl; HplUart0 = HplAtm128UartP.HplUart0; Uart1TxControl = HplAtm128UartP.Uart1TxControl; Uart1RxControl = HplAtm128UartP.Uart1RxControl; HplUart1 = HplAtm128UartP.HplUart1; HplAtm128UartP.Atm128Calibrate -> PlatformC; HplAtm128UartP.McuPowerState -> McuSleepC; components MainC; MainC.SoftwareInit -> HplAtm128UartP.Uart0Init; MainC.SoftwareInit -> HplAtm128UartP.Uart1Init; HplAtm128UartP.McuPowerState -> McuSleepC; HplAtm128UartP.McuPowerOverride <- McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/HplAtm128UartP.nc000066400000000000000000000242571207233610700224120ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Alec Woo * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2010-10-25 03:23:39 $ */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Private component of the Atmega1281 serial port HPL. * * @author Martin Turon * @author David Gay * @author Janos Sallai */ #include module HplAtm128UartP { provides interface Init as Uart0Init; provides interface StdControl as Uart0TxControl; provides interface StdControl as Uart0RxControl; provides interface HplAtm128Uart as HplUart0; provides interface Init as Uart1Init; provides interface StdControl as Uart1TxControl; provides interface StdControl as Uart1RxControl; provides interface HplAtm128Uart as HplUart1; provides interface McuPowerOverride; uses interface Atm128Calibrate; uses interface McuPowerState; } implementation { //=== Uart Init Commands. ==================================== command error_t Uart0Init.init() { Atm128UartMode_t mode; Atm128UartStatus_t stts; Atm128UartControl_t ctrl; uint16_t ubrr0; ctrl.bits = (struct Atm128_UCSRB_t) {rxcie:0, txcie:0, rxen:0, txen:0}; stts.bits = (struct Atm128_UCSRA_t) {u2x:1}; mode.bits = (struct Atm128_UCSRC_t) {ucsz:ATM128_UART_DATA_SIZE_8_BITS}; ubrr0 = call Atm128Calibrate.baudrateRegister(PLATFORM_BAUDRATE); UBRR0L = ubrr0; UBRR0H = ubrr0 >> 8; UCSR0A = stts.flat; UCSR0C = mode.flat; UCSR0B = ctrl.flat; return SUCCESS; } command error_t Uart0TxControl.start() { SET_BIT(UCSR0B, TXEN0); call McuPowerState.update(); return SUCCESS; } command error_t Uart0TxControl.stop() { CLR_BIT(UCSR0B, TXEN0); call McuPowerState.update(); return SUCCESS; } command error_t Uart0RxControl.start() { SET_BIT(UCSR0B, RXEN0); call McuPowerState.update(); return SUCCESS; } command error_t Uart0RxControl.stop() { CLR_BIT(UCSR0B, RXEN0); call McuPowerState.update(); return SUCCESS; } async command error_t HplUart0.enableTxIntr() { SET_BIT(UCSR0A, TXC0); SET_BIT(UCSR0B, TXCIE0); return SUCCESS; } async command error_t HplUart0.disableTxIntr(){ CLR_BIT(UCSR0B, TXCIE0); return SUCCESS; } async command error_t HplUart0.enableRxIntr(){ SET_BIT(UCSR0B, RXCIE0); return SUCCESS; } async command error_t HplUart0.disableRxIntr(){ CLR_BIT(UCSR0B, RXCIE0); return SUCCESS; } async command bool HplUart0.isTxEmpty(){ return READ_BIT(UCSR0A, TXC0); } async command bool HplUart0.isRxEmpty(){ return !READ_BIT(UCSR0A, RXC0); } async command uint8_t HplUart0.rx(){ return UDR0; } async command void HplUart0.tx(uint8_t data) { atomic{ UDR0 = data; SET_BIT(UCSR0A, TXC0); } } AVR_ATOMIC_HANDLER(USART0_RX_vect) { if (READ_BIT(UCSR0A, RXC0)) { signal HplUart0.rxDone(UDR0); } } AVR_NONATOMIC_HANDLER(USART0_TX_vect) { signal HplUart0.txDone(); } command error_t Uart1Init.init() { Atm128UartMode_t mode; Atm128UartStatus_t stts; Atm128UartControl_t ctrl; uint16_t ubrr1; ctrl.bits = (struct Atm128_UCSRB_t) {rxcie:0, txcie:0, rxen:0, txen:0}; stts.bits = (struct Atm128_UCSRA_t) {u2x:1}; mode.bits = (struct Atm128_UCSRC_t) {ucsz:ATM128_UART_DATA_SIZE_8_BITS}; ubrr1 = call Atm128Calibrate.baudrateRegister(PLATFORM_BAUDRATE); UBRR1L = ubrr1; UBRR1H = ubrr1 >> 8; UCSR1A = stts.flat; UCSR1C = mode.flat; UCSR1B = ctrl.flat; return SUCCESS; } command error_t Uart1TxControl.start() { SET_BIT(UCSR1B, TXEN1); CLR_BIT(UCSR1B, TXCIE1); call McuPowerState.update(); return SUCCESS; } command error_t Uart1TxControl.stop() { CLR_BIT(UCSR1B, TXEN1); call McuPowerState.update(); return SUCCESS; } command error_t Uart1RxControl.start() { SET_BIT(UCSR1B, RXEN1); call McuPowerState.update(); return SUCCESS; } command error_t Uart1RxControl.stop() { CLR_BIT(UCSR1B, RXEN1); call McuPowerState.update(); return SUCCESS; } async command error_t HplUart1.enableTxIntr() { SET_BIT(UCSR1A, TXC1); SET_BIT(UCSR1B, TXCIE1); return SUCCESS; } async command error_t HplUart1.disableTxIntr(){ CLR_BIT(UCSR1B, TXCIE1); return SUCCESS; } async command error_t HplUart1.enableRxIntr(){ SET_BIT(UCSR1B, RXCIE1); return SUCCESS; } async command error_t HplUart1.disableRxIntr(){ CLR_BIT(UCSR1B, RXCIE1); return SUCCESS; } async command bool HplUart1.isTxEmpty() { return READ_BIT(UCSR1A, TXC1); } async command bool HplUart1.isRxEmpty() { return !READ_BIT(UCSR1A, RXC1); } async command uint8_t HplUart1.rx(){ return UDR1; } async command void HplUart1.tx(uint8_t data) { atomic{ UDR1 = data; SET_BIT(UCSR1A, TXC1); } } AVR_ATOMIC_HANDLER(USART1_RX_vect) { if (READ_BIT(UCSR1A, RXC1)) signal HplUart1.rxDone(UDR1); } AVR_NONATOMIC_HANDLER(USART1_TX_vect) { signal HplUart1.txDone(); } async command mcu_power_t McuPowerOverride.lowestState() { if ( (UCSR0B & (1< RFA1RadioOffP; McuInitP.MeasureClock -> MeasureClockC; #ifdef TOGGLE_ON_SLEEP // this is a HACK, but becasue of some compiling issues we // cannot make McuSleepC into a configuration, so we wire here components McuSleepC, LedsC; McuSleepC.Leds -> LedsC; #endif } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/McuInitP.nc000066400000000000000000000054621207233610700215030ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" module McuInitP @safe() { provides interface Init; uses { interface Init as MeasureClock; interface Init as TimerInit; interface Init as AdcInit; interface Init as RadioInit; } } implementation { error_t systemClockInit() { // set the clock prescaler atomic { // enable changing the prescaler CLKPR = 0x80; #if PLATFORM_MHZ == 16 CLKPR = 0x0F; #elif PLATFORM_MHZ == 8 CLKPR = 0x00; #elif PLATFORM_MHZ == 4 CLKPR = 0x01; #elif PLATFORM_MHZ == 2 CLKPR = 0x02; #elif PLATFORM_MHZ == 1 CLKPR = 0x03; #else #error "Unsupported MHZ" #endif } return SUCCESS; } command error_t Init.init() { error_t ok; DRTRAM0 |= 1< */ module McuSleepC @safe() { provides { interface McuSleep; interface McuPowerState; } uses { interface McuPowerOverride; interface Leds @atmostonce(); } } implementation { /* Note that the power values are maintained in an order * based on their active components, NOT on their values. * Look at atm1281hardware.h and page 54 of the ATmeg1281 * manual (Table 25).*/ const_uint8_t atm128PowerBits[ATM128_POWER_DOWN + 1] = { 0, //IDLE (1 << SM0), //ADC_NR (1 << SM2) | (1 << SM1) | (1 << SM0), //EXT_STDBY (1 << SM1) | (1 << SM0), //POWER_SAVE (1 << SM2) | (1 << SM1), //STDBY (1 << SM1) //POWER_DOWN }; norace int8_t powerState = -1; async command void McuSleep.sleep() { if( powerState < 0 ) { powerState = call McuPowerOverride.lowestState(); SMCR = (SMCR & 0xf0) | read_uint8_t(&atm128PowerBits[powerState]); } #ifdef TOGGLE_ON_SLEEP if( powerState >= ATM128_POWER_SAVE ) call Leds.led0Off(); #endif SET_BIT(SMCR, SE); sei(); // All of memory may change at this point... asm volatile ("sleep" : : : "memory"); cli(); CLR_BIT(SMCR, SE); #ifdef TOGGLE_ON_SLEEP call Leds.led0On(); #endif } async command void McuPowerState.update() { powerState = -1; } default async command mcu_power_t McuPowerOverride.lowestState() { return ATM128_POWER_DOWN; } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/adc/000077500000000000000000000000001207233610700202115ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/adc/Atm128Adc.h000066400000000000000000000145541207233610700217570ustar00rootroot00000000000000// $Id: Atm128Adc.h,v 1.2 2010-09-20 08:12:04 szabomeister Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL CROSSBOW TECHNOLOGY OR ANY OF ITS LICENSORS BE LIABLE TO * ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL * DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN * IF CROSSBOW OR ITS LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * CROSSBOW TECHNOLOGY AND ITS LICENSORS SPECIFICALLY DISCLAIM ALL WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND NEITHER CROSSBOW NOR ANY LICENSOR HAS ANY * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR * MODIFICATIONS. */ // @author Martin Turon // @author Hu Siquan /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * */ // @author Janos Sallai /* Updated chips/atm128 to include atm1281's ADCSRB register. */ #ifndef _H_Atm128ADC_h #define _H_Atm128ADC_h //================== 8 channel 10-bit ADC ============================== /* Voltage Reference Settings */ enum { ATM128_ADC_VREF_OFF = 0, //!< VR+ = AREF and VR- = GND ATM128_ADC_VREF_AVDD = 1,//!< VR+ = AVDD(1.8V) and VR- = GND ATM128_ADC_VREF_1_5 = 2, //!< VR+ = 1.5V and VR- = GND ATM128_ADC_VREF_1_6 = 3, //!< VR+ = 1.6V and VR- = GND ATM128_ADC_VREF_AVCC = ATM128_ADC_VREF_AVDD, //backward compatibility }; /* Voltage Reference Settings */ enum { ATM128_ADC_RIGHT_ADJUST = 0, ATM128_ADC_LEFT_ADJUST = 1, }; /* ADC Multiplexer Settings */ enum { ATM128_ADC_SNGL_ADC0 = 0, ATM128_ADC_SNGL_ADC1, ATM128_ADC_SNGL_ADC2, ATM128_ADC_SNGL_ADC3, ATM128_ADC_SNGL_ADC4, ATM128_ADC_SNGL_ADC5, ATM128_ADC_SNGL_ADC6, ATM128_ADC_SNGL_ADC7, ATM128_ADC_DIFF_ADC00_10x, ATM128_ADC_DIFF_ADC10_10x, ATM128_ADC_DIFF_ADC00_200x, ATM128_ADC_DIFF_ADC10_200x, ATM128_ADC_DIFF_ADC22_10x, ATM128_ADC_DIFF_ADC32_10x, ATM128_ADC_DIFF_ADC22_200x, ATM128_ADC_DIFF_ADC32_200x, ATM128_ADC_DIFF_ADC01_1x, ATM128_ADC_DIFF_ADC11_1x, ATM128_ADC_DIFF_ADC21_1x, ATM128_ADC_DIFF_ADC31_1x, ATM128_ADC_DIFF_ADC41_1x, ATM128_ADC_DIFF_ADC51_1x, ATM128_ADC_DIFF_ADC61_1x, ATM128_ADC_DIFF_ADC71_1x, ATM128_ADC_DIFF_ADC02_1x, ATM128_ADC_DIFF_ADC12_1x, ATM128_ADC_DIFF_ADC22_1x, ATM128_ADC_DIFF_ADC32_1x, ATM128_ADC_DIFF_ADC42_1x, ATM128_ADC_DIFF_ADC52_1x, ATM128_ADC_SNGL_1_23, ATM128_ADC_SNGL_GND, ATM128_ADC_INT_TEMP = 41, ATM128_ADC_INT_VDRTBBP = 52, ATM128_ADC_INT_VDRTBBN = 61, }; /* ADC Multiplexer Selection Register */ typedef struct { uint8_t mux : 5; //!< Analog Channel and Gain Selection Bits uint8_t adlar : 1; //!< ADC Left Adjust Result uint8_t refs : 2; //!< Reference Selection Bits } Atm128Admux_t; /* ADC Prescaler Settings */ /* Note: each platform must define ATM128_ADC_PRESCALE to the smallest prescaler which guarantees full A/D precision. */ enum { ATM128_ADC_PRESCALE_2 = 0, ATM128_ADC_PRESCALE_2b, ATM128_ADC_PRESCALE_4, ATM128_ADC_PRESCALE_8, ATM128_ADC_PRESCALE_16, ATM128_ADC_PRESCALE_32, ATM128_ADC_PRESCALE_64, ATM128_ADC_PRESCALE_128, // This special value is used to ask the platform for the prescaler // which gives full precision. ATM128_ADC_PRESCALE }; /* ADC Enable Settings */ enum { ATM128_ADC_ENABLE_OFF = 0, ATM128_ADC_ENABLE_ON, }; /* ADC Start Conversion Settings */ enum { ATM128_ADC_START_CONVERSION_OFF = 0, ATM128_ADC_START_CONVERSION_ON, }; /* ADC Free Running Select Settings */ enum { ATM128_ADC_FREE_RUNNING_OFF = 0, ATM128_ADC_FREE_RUNNING_ON, }; /* ADC Interrupt Flag Settings */ enum { ATM128_ADC_INT_FLAG_OFF = 0, ATM128_ADC_INT_FLAG_ON, }; /* ADC Interrupt Enable Settings */ enum { ATM128_ADC_INT_ENABLE_OFF = 0, ATM128_ADC_INT_ENABLE_ON, }; /* ADC Multiplexer Selection Register */ typedef struct { uint8_t adps : 3; //!< ADC Prescaler Select Bits uint8_t adie : 1; //!< ADC Interrupt Enable uint8_t adif : 1; //!< ADC Interrupt Flag uint8_t adate : 1; //!< ADC Auto Trigger Enable uint8_t adsc : 1; //!< ADC Start Conversion uint8_t aden : 1; //!< ADC Enable } Atm128Adcsra_t; /* ADC Multiplexer Selection Register */ typedef struct { uint8_t adts : 3; //!< ADC Trigger Select uint8_t mux5 : 1; //!< Analog Channel and Gain Selection Bit uint8_t acch : 1; //!< Analog Channel Change uint8_t refok : 1; //!< Reference Voltage OK uint8_t acme : 1; //!< Analog Comparator Multiplexer Enable uint8_t avddok: 1; //!< AVDD Supply Voltage OK } Atm128Adcsrb_t; typedef uint8_t Atm128_ADCH_t; //!< ADC data register high typedef uint8_t Atm128_ADCL_t; //!< ADC data register low // The resource identifier string for the ADC subsystem #define UQ_ATM128ADC_RESOURCE "atm128adc.resource" #endif //_H_Atm128ADC_h tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/adc/Atm128AdcC.nc000066400000000000000000000055001207233610700222220ustar00rootroot00000000000000/// $Id: Atm128AdcC.nc,v 1.7 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "Atm128Adc.h" /** * HAL for the Atmega128 A/D conversion susbsystem. * * @author Hu Siquan * @author David Gay */ configuration Atm128AdcC { provides { interface Resource[uint8_t client]; interface Atm128AdcSingle; interface Atm128AdcMultiple; } uses interface ResourceConfigure[uint8_t client]; } implementation { components Atm128AdcP, HplAtm128AdcC, McuInitC, MainC, PlatformC, new RoundRobinArbiterC(UQ_ATM128ADC_RESOURCE) as AdcArbiter, new AsyncStdControlPowerManagerC() as PM; Resource = AdcArbiter; ResourceConfigure = AdcArbiter; Atm128AdcSingle = Atm128AdcP; Atm128AdcMultiple = Atm128AdcP; McuInitC.AdcInit -> Atm128AdcP; Atm128AdcP.HplAtm128Adc -> HplAtm128AdcC; Atm128AdcP.Atm128Calibrate -> PlatformC; PM.AsyncStdControl -> Atm128AdcP; PM.ResourceDefaultOwner -> AdcArbiter; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/adc/Atm128AdcP.nc000066400000000000000000000226711207233610700222470ustar00rootroot00000000000000/* $Id: Atm128AdcP.nc,v 1.8 2010-06-29 22:07:43 scipio Exp $ * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128Adc.h" /** * Internal component of the Atmega128 A/D HAL. * * @author Jason Hill * @author David Gay * @author Philip Levis * @author Phil Buonadonna * @author Hu Siquan * @author Janos Sallai * @author Andras Biro */ module Atm128AdcP @safe() { provides { interface Init; interface AsyncStdControl; interface Atm128AdcSingle; interface Atm128AdcMultiple; } uses { interface HplAtm128Adc; interface Atm128Calibrate; } } implementation { /* State for the current and next (multiple-sampling only) conversion */ struct { bool multiple : 1; /* single and multiple-sampling mode */ bool precise : 1; /* is this result going to be precise? */ uint8_t channel : 6; /* what channel did this sample come from? */ } f, nextF; command error_t Init.init() { atomic { Atm128Adcsra_t adcsr; adcsr.aden = ATM128_ADC_ENABLE_OFF; adcsr.adsc = ATM128_ADC_START_CONVERSION_OFF; adcsr.adate = ATM128_ADC_FREE_RUNNING_OFF; adcsr.adif = ATM128_ADC_INT_FLAG_OFF; adcsr.adie = ATM128_ADC_INT_ENABLE_OFF; adcsr.adps = ATM128_ADC_PRESCALE_2; call HplAtm128Adc.setAdcsra(adcsr); } return SUCCESS; } /* We enable the A/D when start is called, and disable it when stop is * called. This drops A/D conversion latency by a factor of two (but * increases idle mode power consumption a little). */ async command error_t AsyncStdControl.start() { atomic call HplAtm128Adc.enableAdc(); return SUCCESS; } async command error_t AsyncStdControl.stop() { atomic call HplAtm128Adc.disableAdc(); return SUCCESS; } /* Return TRUE if switching to 'channel' with reference voltage 'refVoltage' * will give a precise result (the first sample after changing reference * voltage or switching to/between a differential channel is imprecise) */ inline bool isPrecise(uint8_t currentChannel, uint8_t currentRefVoltage, uint8_t channel, uint8_t refVoltage) { return refVoltage == currentRefVoltage && (channel <= ATM128_ADC_SNGL_ADC7 || channel >= ATM128_ADC_SNGL_1_23 || channel == currentChannel); } async event void HplAtm128Adc.dataReady(uint16_t data) { bool precise, multiple; uint8_t channel; atomic { channel = f.channel; precise = f.precise; multiple = f.multiple; } if (!multiple) { /* A single sample. Disable the ADC interrupt to avoid starting * a new sample at the next "sleep" instruction. */ call HplAtm128Adc.disableInterruption(); signal Atm128AdcSingle.dataReady(data, precise); } else { /* Multiple sampling. The user can: * - tell us to stop sampling * - or, to continue sampling on a new channel, possibly with a * new reference voltage; however this change applies not to * the next sample (the hardware has already started working on * that), but on the one after. */ bool cont; uint8_t nextChannel, nextVoltage; atomic { nextVoltage = call HplAtm128Adc.getRef(); nextChannel = call HplAtm128Adc.getChannel(); } cont = signal Atm128AdcMultiple.dataReady(data, precise, channel, &nextChannel, &nextVoltage); atomic if (cont) { /* Switch channels and update our internal channel+precision * tracking state (f and nextF). Note that this tracking will * be incorrect if we take too long to get to this point. */ call HplAtm128Adc.setChannel(nextChannel); call HplAtm128Adc.setRef(nextVoltage); f = nextF; nextF.channel = nextChannel; nextF.precise = isPrecise(call HplAtm128Adc.getChannel(), call HplAtm128Adc.getRef(), nextChannel, nextVoltage); } else call HplAtm128Adc.cancel(); } } /* Start sampling based on request parameters */ void getData(uint8_t channel, uint8_t refVoltage, bool leftJustify, uint8_t prescaler) { Atm128Adcsra_t adcsr; f.precise = isPrecise(call HplAtm128Adc.getChannel(), call HplAtm128Adc.getRef(), channel, refVoltage); f.channel = channel; call HplAtm128Adc.setChannel(channel); call HplAtm128Adc.setAdlar(leftJustify); call HplAtm128Adc.setRef(refVoltage); adcsr.aden = ATM128_ADC_ENABLE_ON; adcsr.adsc = ATM128_ADC_START_CONVERSION_ON; adcsr.adate = f.multiple; adcsr.adif = ATM128_ADC_INT_FLAG_ON; // clear any stale flag adcsr.adie = ATM128_ADC_INT_ENABLE_ON; if (prescaler == ATM128_ADC_PRESCALE) prescaler = call Atm128Calibrate.adcPrescaler(); adcsr.adps = prescaler; call HplAtm128Adc.setAdcsra(adcsr); } async command bool Atm128AdcSingle.getData(uint8_t channel, uint8_t refVoltage, bool leftJustify, uint8_t prescaler) { atomic { f.multiple = FALSE; getData(channel, refVoltage, leftJustify, prescaler); return f.precise; } } async command bool Atm128AdcSingle.cancel() { /* There is no Atm128AdcMultiple.cancel, for reasons discussed in that * interface */ return call HplAtm128Adc.cancel(); } async command bool Atm128AdcMultiple.getData(uint8_t channel, uint8_t refVoltage, bool leftJustify, uint8_t prescaler) { atomic { f.multiple = TRUE; getData(channel, refVoltage, leftJustify, prescaler); nextF = f; /* We assume the 2nd sample is precise */ nextF.precise = TRUE; return f.precise; } } default async event void Atm128AdcSingle.dataReady(uint16_t data, bool precise) { } default async event bool Atm128AdcMultiple.dataReady(uint16_t data, bool precise, uint8_t channel, uint8_t *newChannel, uint8_t *newRefVoltage) { return FALSE; // stop conversion if we somehow end up here. } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/adc/HplAtm128Adc.nc000066400000000000000000000126411207233610700225670ustar00rootroot00000000000000/// $Id: HplAtm128Adc.nc,v 1.6 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128Adc.h" /** * HPL interface to the Atmega128 A/D conversion subsystem. Please see the * Atmega128 manual for full details on the functioning of this subsystem. *

    * A word of warning: the Atmega128 SLEEP instruction initiates an A/D * conversion when the ADC and ADC interrupt are enabled. * * @author Martin Turon * @author Hu Siquan * @author David Gay */ interface HplAtm128Adc { /** * Sets the ADC channel * @param mux New channel */ async command void setChannel(uint8_t mux); /** * Returns the current ADC channel * @return Current channel */ async command uint8_t getChannel(); /** * Turns ADLAR (ADC left adjust result) on/off * @param adlarOn TRUE turns on ADLAR, FALSE turns it off */ async command void setAdlar(bool adlarOn); /** * Returns ADLAR (ADC left adjust result) status * @returns TRUE if ADLAR is on. */ async command bool isAdlarOn(); /** * Sets the reference voltage * @param ref New reference voltage */ async command void setRef(uint8_t ref); /** * Returns the current reference voltage * @returns the current reference voltage */ async command uint8_t getRef(); /** * Read the ADCSRA (ADC control) register * @return Current ADCSRA value */ async command Atm128Adcsra_t getAdcsra(); /** * Set the ADCSRA (ADC control) register * @param adcsra New ADCSRA value */ async command void setAdcsra(Atm128Adcsra_t adcsra); /** * Read the latest A/D conversion result * @return A/D value */ async command uint16_t getValue(); /// A/D control utilities. All of these clear any pending A/D interrupt. /** * Enable ADC sampling */ async command void enableAdc(); /** * Disable ADC sampling */ async command void disableAdc(); /** * Enable ADC interrupt */ async command void enableInterruption(); /** * Disable ADC interrupt */ async command void disableInterruption(); /** * Clear the ADC interrupt flag */ async command void resetInterrupt(); /** * Start ADC conversion. If ADC interrupts are enabled, the dataReady event * will be signaled once (in non-continuous mode) or repeatedly (in * continuous mode). */ async command void startConversion(); /** * Enable continuous sampling */ async command void setContinuous(); /** * Disable continuous sampling */ async command void setSingle(); /* A/D status checks */ /** * Is ADC enabled? * @return TRUE if the ADC is enabled, FALSE otherwise */ async command bool isEnabled(); /** * Is A/D conversion in progress? * @return TRUE if the A/D conversion is in progress, FALSE otherwise */ async command bool isStarted(); /** * Is A/D conversion complete? Note that this flag is automatically * cleared when an A/D interrupt occurs. * @return TRUE if the A/D conversion is complete, FALSE otherwise */ async command bool isComplete(); /** * Set ADC prescaler selection bits * @param scale New ADC prescaler. Must be one of the ATM128_ADC_PRESCALE_xxx * values from Atm128Adc.h */ async command void setPrescaler(uint8_t scale); /** * Cancel A/D conversion and any pending A/D interrupt. Also disables the * ADC interruption (otherwise a sample might start at the next sleep * instruction). This command can assume that the A/D converter is enabled. * @return TRUE if an A/D conversion was in progress or an A/D interrupt * was pending, FALSE otherwise. In single conversion mode, a return * of TRUE implies that the dataReady event will not be signaled. */ async command bool cancel(); /** * A/D interrupt occured * @param data Latest A/D conversion result */ async event void dataReady(uint16_t data); } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/adc/HplAtm128AdcC.nc000066400000000000000000000040631207233610700226710ustar00rootroot00000000000000/// $Id: HplAtm128AdcC.nc,v 1.7 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128Adc.h" /** * HPL for the Atmega128 A/D conversion susbsystem. * * @author Martin Turon * @author Hu Siquan * @author David Gay */ configuration HplAtm128AdcC { provides interface HplAtm128Adc; } implementation { components HplAtm128AdcP, McuSleepC; HplAtm128Adc = HplAtm128AdcP; HplAtm128AdcP.McuPowerState -> McuSleepC; HplAtm128AdcP.McuPowerOverride <- McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/adc/HplAtm128AdcP.nc000066400000000000000000000140621207233610700227060ustar00rootroot00000000000000/// $Id: HplAtm128AdcP.nc,v 1.1 2010-11-10 11:05:37 andrasbiro Exp $ /* * Copyright (c) 2007, Vanderbilt University * Copyright (c) 2004-2005 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128Adc.h" /** * HPL for the Atmega1281 A/D conversion susbsystem. * * @author Martin Turon * @author Hu Siquan * @author David Gay * @author Janos Sallai */ module HplAtm128AdcP @safe() { provides interface HplAtm128Adc; provides interface McuPowerOverride; uses interface McuPowerState; } implementation { async command void HplAtm128Adc.setChannel(uint8_t mux){ ADMUX = (ADMUX & 0xE0) | (mux & 0x1F); //upper 3 bits: unchanged; lower 5 bits: mux if(mux & 0x20) ADCSRB |= (1 << MUX5); else ADCSRB &= ~(1 << MUX5); } async command uint8_t HplAtm128Adc.getChannel(){ return (ADMUX & 0x1F) | (((ADCSRB & MUX5) >> MUX5) << 5); } async command void HplAtm128Adc.setAdlar(bool adlarOn){ if(adlarOn) ADMUX |= 1<> REFS0 ); } //TODO: this should be eliminated //=== Direct read of HW registers. ================================= async command Atm128Adcsra_t HplAtm128Adc.getAdcsra() { return *(Atm128Adcsra_t*)&ADCSRA; } async command uint16_t HplAtm128Adc.getValue() { return ADC; } DEFINE_UNION_CAST(Admux2int, Atm128Admux_t, uint8_t); DEFINE_UNION_CAST(Adcsra2int, Atm128Adcsra_t, uint8_t); //TODO: this should be eliminated //=== Direct write of HW registers. ================================ async command void HplAtm128Adc.setAdcsra( Atm128Adcsra_t x ) { ADCSRA = Adcsra2int(x); } async command void HplAtm128Adc.setPrescaler(uint8_t scale){ Atm128Adcsra_t current_val = call HplAtm128Adc.getAdcsra(); current_val.adif = FALSE; current_val.adps = scale; call HplAtm128Adc.setAdcsra(current_val); } // Individual bit manipulation. These all clear any pending A/D interrupt. // It's not clear these are that useful... async command void HplAtm128Adc.enableAdc() { SET_BIT(ADCSRA, ADEN); call McuPowerState.update(); } async command void HplAtm128Adc.disableAdc() { CLR_BIT(ADCSRA, ADEN); call McuPowerState.update(); } async command void HplAtm128Adc.enableInterruption() { SET_BIT(ADCSRA, ADIE); } async command void HplAtm128Adc.disableInterruption() { CLR_BIT(ADCSRA, ADIE); } async command void HplAtm128Adc.setContinuous() { ((Atm128Adcsrb_t*)&ADCSRB)->adts = 0; SET_BIT(ADCSRA, ADATE); } async command void HplAtm128Adc.setSingle() { CLR_BIT(ADCSRA, ADATE); } async command void HplAtm128Adc.resetInterrupt() { SET_BIT(ADCSRA, ADIF); } async command void HplAtm128Adc.startConversion() { SET_BIT(ADCSRA, ADSC); } /* A/D status checks */ async command bool HplAtm128Adc.isEnabled() { return (call HplAtm128Adc.getAdcsra()).aden; } async command bool HplAtm128Adc.isStarted() { return (call HplAtm128Adc.getAdcsra()).adsc; } async command bool HplAtm128Adc.isComplete() { return (call HplAtm128Adc.getAdcsra()).adif; } /* A/D interrupt handlers. Signals dataReady event with interrupts enabled */ AVR_ATOMIC_HANDLER(ADC_vect) { uint16_t data = call HplAtm128Adc.getValue(); __nesc_enable_interrupt(); signal HplAtm128Adc.dataReady(data); } default async event void HplAtm128Adc.dataReady(uint16_t done) { } async command mcu_power_t McuPowerOverride.lowestState() { if(bit_is_set(ADCSRA,ADEN)) { return ATM128_POWER_ADC_NR; } else return ATM128_POWER_DOWN; } async command bool HplAtm128Adc.cancel() { /* This is tricky */ atomic { Atm128Adcsra_t oldSr = call HplAtm128Adc.getAdcsra(), newSr; /* To cancel a conversion, first turn off ADEN, then turn off ADSC. We also cancel any pending interrupt. Finally we reenable the ADC. */ newSr = oldSr; newSr.aden = FALSE; newSr.adif = TRUE; /* This clears a pending interrupt... */ newSr.adie = FALSE; /* We don't want to start sampling again at the next sleep */ call HplAtm128Adc.setAdcsra(newSr); newSr.adsc = FALSE; call HplAtm128Adc.setAdcsra(newSr); newSr.aden = TRUE; call HplAtm128Adc.setAdcsra(newSr); return oldSr.adif || oldSr.adsc; } } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/atm128hardware.h000066400000000000000000000153771207233610700224020ustar00rootroot00000000000000/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. * Copyright (c) 2002-2003 Intel Corporation. * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written * agreement is hereby granted, provided that the above copyright * notice, the (updated) modification history and the author appear in * all copies of this source code. * * Permission is also granted to distribute this software under the * standard BSD license as contained in the TinyOS distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * */ /* * Updated chips/atm128/atm128hardware.h with atm1281's MCU status and * memory control registers. * * @author Janos Sallai, Martin Turon, Jason Hill, Philip Levis, Nelson Lee, David Gay */ #ifndef _H_atmega128hardware_H #define _H_atmega128hardware_H #include #if __AVR_LIBC_VERSION__ >= 10400UL #include #else #include #include #endif #include #include #include "atm128const.h" /* We need slightly different defs than SIGNAL, INTERRUPT */ #define AVR_ATOMIC_HANDLER(signame) \ void signame() __attribute__ ((signal)) @atomic_hwevent() @C() #define AVR_NONATOMIC_HANDLER(signame) \ void signame() __attribute__ ((interrupt)) @hwevent() @C() /* Macro to create union casting functions. */ #define DEFINE_UNION_CAST(func_name, from_type, to_type) \ to_type func_name(from_type x) { \ union {from_type f; to_type t;} c = {f:x}; return c.t; } // Bit operators using bit number #define SET_BIT(port, bit) ((port) |= _BV(bit)) #define CLR_BIT(port, bit) ((port) &= ~_BV(bit)) #define READ_BIT(port, bit) (((port) & _BV(bit)) != 0) #define FLIP_BIT(port, bit) ((port) ^= _BV(bit)) #define WRITE_BIT(port, bit, value) \ if (value) SET_BIT((port), (bit)); \ else CLR_BIT((port), (bit)) // Bit operators using bit flag mask #define SET_FLAG(port, flag) ((port) |= (flag)) #define CLR_FLAG(port, flag) ((port) &= ~(flag)) #define READ_FLAG(port, flag) ((port) & (flag)) /* Enables interrupts. */ inline void __nesc_enable_interrupt() @safe() { sei(); } /* Disables all interrupts. */ inline void __nesc_disable_interrupt() @safe() { cli(); } /* Defines data type for storing interrupt mask state during atomic. */ typedef uint8_t __nesc_atomic_t; __nesc_atomic_t __nesc_atomic_start(void); void __nesc_atomic_end(__nesc_atomic_t original_SREG); #ifndef NESC_BUILD_BINARY /* @spontaneous() functions should not be included when NESC_BUILD_BINARY is #defined, to avoid duplicate functions definitions wheb binary components are used. Such functions do need a prototype in all cases, though. */ /* Saves current interrupt mask state and disables interrupts. */ inline __nesc_atomic_t __nesc_atomic_start(void) @spontaneous() @safe() { __nesc_atomic_t result = SREG; __nesc_disable_interrupt(); asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ return result; } /* Restores interrupt mask to original state. */ inline void __nesc_atomic_end(__nesc_atomic_t original_SREG) @spontaneous() @safe() { asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ SREG = original_SREG; } #endif /* Defines the mcu_power_t type for atm128 power management. */ typedef uint8_t mcu_power_t @combine("mcombine"); enum { ATM128_POWER_IDLE = 0, ATM128_POWER_ADC_NR = 1, ATM128_POWER_EXT_STANDBY = 2, ATM128_POWER_SAVE = 3, ATM128_POWER_STANDBY = 4, ATM128_POWER_DOWN = 5, }; /* Combine function. */ mcu_power_t mcombine(mcu_power_t m1, mcu_power_t m2) @safe() { return (m1 < m2)? m1: m2; } /* MCU Status Register*/ typedef struct { uint8_t porf : 1; //!< Power-on Reset Flag uint8_t extrf : 1; //!< External Reset Flag uint8_t borf : 1; //!< Brown-out Reset Flag uint8_t wdrf : 1; //!< Watchdog Reset Flag uint8_t jtrf : 1; //!< JTAG Reset Flag uint8_t resv1 : 3; //!< Reserved } Atm128_MCUSR_t; /* Floating-point network-type support. These functions must convert to/from a 32-bit big-endian integer that follows the layout of Java's java.lang.float.floatToRawIntBits method. Conveniently, for the AVR family, this is a straight byte copy... */ typedef float nx_float __attribute__((nx_base_be(afloat))); inline float __nesc_ntoh_afloat(const void *COUNT(sizeof(float)) source) @safe() { float f; memcpy(&f, source, sizeof(float)); return f; } inline float __nesc_hton_afloat(void *COUNT(sizeof(float)) target, float value) @safe() { memcpy(target, &value, sizeof(float)); return value; } #endif //_H_atmega128hardware_H tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/i2c/000077500000000000000000000000001207233610700201375ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/i2c/HplAtm128I2CBusC.nc000066400000000000000000000042411207233610700231550ustar00rootroot00000000000000/* * Copyright (c) 2004-2006 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This driver implements direct I2C register access and a blocking master * controller for the ATmega128 via a Hardware Platform Layer (HPL) to its * two-wire-interface (TWI) hardware subsystem. * * @author Martin Turon * @author Philip Levis */ configuration HplAtm128I2CBusC { provides interface HplAtm128I2CBus as I2C; } implementation { components AtmegaGeneralIOC as IO, HplAtm128I2CBusP as Bus, McuSleepC; I2C = Bus.I2C; Bus.I2CClk -> IO.PortD0; Bus.I2CData -> IO.PortD1; Bus.McuPowerState -> McuSleepC; Bus.McuPowerOverride <- McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/i2c/HplAtm128I2CBusP.nc000066400000000000000000000122051207233610700231710ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef I2C_PRESCALER #define I2C_PRESCALER 0 #endif #ifndef I2C_BITRATE #ifndef I2C_FREQ #define I2C_FREQ 50000U #endif #define TWBR_VALUE(cpu_mhz) ( ((cpu_mhz*500000)/I2C_FREQ)-8 ) #define I2C_BITRATE TWBR_VALUE(PLATFORM_MHZ) #endif #include "Atm128I2C.h" /** * This driver implements direct I2C register access and a blocking master * controller for the ATmega128 via a Hardware Platform Layer (HPL) to its * two-wire-interface (TWI) hardware subsystem. * * @author Martin Turon * @author Philip Levis */ module HplAtm128I2CBusP { provides interface HplAtm128I2CBus as I2C; provides interface McuPowerOverride; uses { interface GeneralIO as I2CClk; interface GeneralIO as I2CData; interface McuPowerState; } } implementation { uint8_t current; async command void I2C.init(bool hasExternalPulldown) { // Set the internal pullup resisters if (hasExternalPulldown) { call I2CClk.set(); call I2CData.set(); } TWSR=I2C_PRESCALER; TWBR=I2C_BITRATE; TWAR = 0; TWCR = 0; } async command void I2C.off() { call I2CClk.clr(); call I2CData.clr(); } async command uint8_t I2C.status() { return TWSR & 0xf8; } async command void I2C.sendCommand() { atomic TWCR = current; } async command void I2C.readCurrent() { atomic current = TWCR; } /** Send START symbol and begin I2C bus transaction. */ async command void I2C.setStart(bool on) { if (on) { atomic SET_BIT(current, TWSTA); } else { atomic CLR_BIT(current, TWSTA); } } async command bool I2C.hasStart() { return READ_BIT(current, TWSTA); } async command void I2C.setStop(bool on) { if (on) { atomic SET_BIT(current, TWSTO); } else { atomic CLR_BIT(current, TWSTO); } } async command bool I2C.hasStop() { return READ_BIT(current, TWSTO); } /** Write a byte to an I2C slave device. */ async command void I2C.write(uint8_t data) { TWDR = data; } async command uint8_t I2C.read() { return TWDR; } async command void I2C.enableAck(bool enable) { if (enable) { atomic SET_BIT(current, TWEA); } else { atomic CLR_BIT(current, TWEA); } } async command bool I2C.hasAcks() { return READ_BIT(current, TWEA); } async command void I2C.enableInterrupt(bool enable) { if (enable) { atomic SET_BIT(current, TWIE); } else { atomic CLR_BIT(current, TWIE); } } async command bool I2C.isInterruptEnabled() { return READ_BIT(current, TWIE); } async command bool I2C.isRealInterruptPending() { return READ_BIT(TWCR, TWINT); } async command bool I2C.isInterruptPending() { return READ_BIT(current, TWINT); } async command void I2C.setInterruptPending(bool on) { if (on) { atomic SET_BIT(current, TWINT); } else { atomic CLR_BIT(current, TWINT); } } async command void I2C.enable(bool enable) { if (enable) { atomic SET_BIT(current, TWEN); } else { atomic CLR_BIT(current, TWEN); } call McuPowerState.update(); } async command bool I2C.isEnabled() { return READ_BIT(current, TWEN); } async command bool I2C.hasWriteCollided() { return READ_BIT(current, TWWC); } async command mcu_power_t McuPowerOverride.lowestState() { if(bit_is_set(TWCR,TWEN)) { return ATM128_POWER_IDLE; } else return ATM128_POWER_DOWN; } default async event void I2C.commandComplete() { } AVR_ATOMIC_HANDLER(TWI_vect) { signal I2C.commandComplete(); } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/pins/000077500000000000000000000000001207233610700204335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/pins/AtmegaExtInterruptC.nc000066400000000000000000000054731207233610700246650ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ configuration AtmegaExtInterruptC { provides interface GpioInterrupt[uint8_t vector]; } implementation { components HplAtmegaExtInterruptC; components new AtmegaExtInterruptP(FALSE) as Int0P; components new AtmegaExtInterruptP(FALSE) as Int1P; components new AtmegaExtInterruptP(FALSE) as Int2P; components new AtmegaExtInterruptP(FALSE) as Int3P; components new AtmegaExtInterruptP(TRUE) as Int4P; components new AtmegaExtInterruptP(TRUE) as Int5P; components new AtmegaExtInterruptP(TRUE) as Int6P; components new AtmegaExtInterruptP(TRUE) as Int7P; GpioInterrupt[0] = Int0P; GpioInterrupt[1] = Int1P; GpioInterrupt[2] = Int2P; GpioInterrupt[3] = Int3P; GpioInterrupt[4] = Int4P; GpioInterrupt[5] = Int5P; GpioInterrupt[6] = Int6P; GpioInterrupt[7] = Int7P; HplAtmegaExtInterruptC.HplAtmegaExtInterrupt[0] <- Int0P; HplAtmegaExtInterruptC.HplAtmegaExtInterrupt[1] <- Int1P; HplAtmegaExtInterruptC.HplAtmegaExtInterrupt[2] <- Int2P; HplAtmegaExtInterruptC.HplAtmegaExtInterrupt[3] <- Int3P; HplAtmegaExtInterruptC.HplAtmegaExtInterrupt[4] <- Int4P; HplAtmegaExtInterruptC.HplAtmegaExtInterrupt[5] <- Int5P; HplAtmegaExtInterruptC.HplAtmegaExtInterrupt[6] <- Int6P; HplAtmegaExtInterruptC.HplAtmegaExtInterrupt[7] <- Int7P; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/pins/AtmegaExtInterruptP.nc000066400000000000000000000050701207233610700246730ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "HplAtmegaExtInterrupt.h" generic module AtmegaExtInterruptP(bool lowLevel){ uses interface HplAtmegaExtInterrupt; provides interface GpioInterrupt; } implementation{ async command error_t GpioInterrupt.enableRisingEdge(){ atomic{ call HplAtmegaExtInterrupt.setMode(ATMEGA_EXTINT_RISING_EDGE); call HplAtmegaExtInterrupt.enable(); call HplAtmegaExtInterrupt.reset(); } return SUCCESS; } async command error_t GpioInterrupt.enableFallingEdge(){ atomic{ call HplAtmegaExtInterrupt.setMode(lowLevel ? ATMEGA_EXTINT_LOW_LEVEL : ATMEGA_EXTINT_FALLING_EDGE); call HplAtmegaExtInterrupt.enable(); call HplAtmegaExtInterrupt.reset(); } return SUCCESS; } async command error_t GpioInterrupt.disable(){ call HplAtmegaExtInterrupt.disable(); return SUCCESS; } async event void HplAtmegaExtInterrupt.fired(){ signal GpioInterrupt.fired(); } default async event void GpioInterrupt.fired(){} } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/pins/AtmegaGeneralIOC.nc000066400000000000000000000125471207233610700240150ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Martin Turon * @author Miklos Maroti */ configuration AtmegaGeneralIOC { provides { interface GeneralIO as PortA0; interface GeneralIO as PortA1; interface GeneralIO as PortA2; interface GeneralIO as PortA3; interface GeneralIO as PortA4; interface GeneralIO as PortA5; interface GeneralIO as PortA6; interface GeneralIO as PortA7; interface GeneralIO as PortB0; interface GeneralIO as PortB1; interface GeneralIO as PortB2; interface GeneralIO as PortB3; interface GeneralIO as PortB4; interface GeneralIO as PortB5; interface GeneralIO as PortB6; interface GeneralIO as PortB7; interface GeneralIO as PortC0; interface GeneralIO as PortC1; interface GeneralIO as PortC2; interface GeneralIO as PortC3; interface GeneralIO as PortC4; interface GeneralIO as PortC5; interface GeneralIO as PortC6; interface GeneralIO as PortC7; interface GeneralIO as PortD0; interface GeneralIO as PortD1; interface GeneralIO as PortD2; interface GeneralIO as PortD3; interface GeneralIO as PortD4; interface GeneralIO as PortD5; interface GeneralIO as PortD6; interface GeneralIO as PortD7; interface GeneralIO as PortE0; interface GeneralIO as PortE1; interface GeneralIO as PortE2; interface GeneralIO as PortE3; interface GeneralIO as PortE4; interface GeneralIO as PortE5; interface GeneralIO as PortE6; interface GeneralIO as PortE7; interface GeneralIO as PortF0; interface GeneralIO as PortF1; interface GeneralIO as PortF2; interface GeneralIO as PortF3; interface GeneralIO as PortF4; interface GeneralIO as PortF5; interface GeneralIO as PortF6; interface GeneralIO as PortF7; interface GeneralIO as PortG0; interface GeneralIO as PortG1; interface GeneralIO as PortG2; interface GeneralIO as PortG3; interface GeneralIO as PortG4; interface GeneralIO as PortG5; } } implementation { components new AtmegaGeneralIOP((uint8_t)&PORTA, (uint8_t)&DDRA, (uint8_t)&PINA) as PortA; PortA0 = PortA.Pin[0]; PortA1 = PortA.Pin[1]; PortA2 = PortA.Pin[2]; PortA3 = PortA.Pin[3]; PortA4 = PortA.Pin[4]; PortA5 = PortA.Pin[5]; PortA6 = PortA.Pin[6]; PortA7 = PortA.Pin[7]; components new AtmegaGeneralIOP((uint8_t)&PORTB, (uint8_t)&DDRB, (uint8_t)&PINB) as PortB; PortB0 = PortB.Pin[0]; PortB1 = PortB.Pin[1]; PortB2 = PortB.Pin[2]; PortB3 = PortB.Pin[3]; PortB4 = PortB.Pin[4]; PortB5 = PortB.Pin[5]; PortB6 = PortB.Pin[6]; PortB7 = PortB.Pin[7]; components new AtmegaGeneralIOP((uint8_t)&PORTC, (uint8_t)&DDRC, (uint8_t)&PINC) as PortC; PortC0 = PortC.Pin[0]; PortC1 = PortC.Pin[1]; PortC2 = PortC.Pin[2]; PortC3 = PortC.Pin[3]; PortC4 = PortC.Pin[4]; PortC5 = PortC.Pin[5]; PortC6 = PortC.Pin[6]; PortC7 = PortC.Pin[7]; components new AtmegaGeneralIOP((uint8_t)&PORTD, (uint8_t)&DDRD, (uint8_t)&PIND) as PortD; PortD0 = PortD.Pin[0]; PortD1 = PortD.Pin[1]; PortD2 = PortD.Pin[2]; PortD3 = PortD.Pin[3]; PortD4 = PortD.Pin[4]; PortD5 = PortD.Pin[5]; PortD6 = PortD.Pin[6]; PortD7 = PortD.Pin[7]; components new AtmegaGeneralIOP((uint8_t)&PORTE, (uint8_t)&DDRE, (uint8_t)&PINE) as PortE; PortE0 = PortE.Pin[0]; PortE1 = PortE.Pin[1]; PortE2 = PortE.Pin[2]; PortE3 = PortE.Pin[3]; PortE4 = PortE.Pin[4]; PortE5 = PortE.Pin[5]; PortE6 = PortE.Pin[6]; PortE7 = PortE.Pin[7]; components new AtmegaGeneralIOP((uint8_t)&PORTF, (uint8_t)&DDRF, (uint8_t)&PINF) as PortF; PortF0 = PortF.Pin[0]; PortF1 = PortF.Pin[1]; PortF2 = PortF.Pin[2]; PortF3 = PortF.Pin[3]; PortF4 = PortF.Pin[4]; PortF5 = PortF.Pin[5]; PortF6 = PortF.Pin[6]; PortF7 = PortF.Pin[7]; components new AtmegaGeneralIOP((uint8_t)&PORTG, (uint8_t)&DDRG, (uint8_t)&PING) as PortG; PortG0 = PortG.Pin[0]; PortG1 = PortG.Pin[1]; PortG2 = PortG.Pin[2]; PortG3 = PortG.Pin[3]; PortG4 = PortG.Pin[4]; PortG5 = PortG.Pin[5]; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/pins/AtmegaGeneralIOP.nc000066400000000000000000000052151207233610700240240ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Martin Turon * @author David Gay * @author Miklos Maroti */ generic module AtmegaGeneralIOP(uint8_t port_addr, uint8_t ddr_addr, uint8_t pin_addr) @safe() { provides interface GeneralIO as Pin[uint8_t bit]; } implementation { #define pin (*TCAST(volatile uint8_t * ONE, pin_addr)) #define port (*TCAST(volatile uint8_t * ONE, port_addr)) #define ddr (*TCAST(volatile uint8_t * ONE, ddr_addr)) inline async command bool Pin.get[uint8_t bit]() { return (pin & (1< HplAtmegaPinChange0C; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/pins/AtmegaPinChange1C.nc000066400000000000000000000035271207233610700241230ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ configuration AtmegaPinChange1C { provides interface GpioInterrupt[uint8_t pin]; } implementation { components HplAtmegaPinChange1C, new AtmegaPinChangeP(); GpioInterrupt = AtmegaPinChangeP; AtmegaPinChangeP.HplAtmegaPinChange -> HplAtmegaPinChange1C; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/pins/AtmegaPinChangeP.nc000066400000000000000000000104551207233610700240550ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro, Miklos Maroti */ /* * This module provides emulated edge triggered GpioInterrupt using a * shared pin change interrupt. Note, that this emulation cannot be * perfect, as if one is wating for a rising edge and gets an ON quickly * followed by a OFF signal, then the fired event will miss this and * will not report anything. This emulation works only for external * components that hold their interrupt line long enough (e.g. they * need to be manually cleared via SPI or I2C). * * Also note, that the actual filtering logic is done in the fired * event and we cannot rule out spontaneous interrupts (e.g. by a * pin change interrupt in an uninteresting direction), therefore we * do no clear the interrupt flag when enabling the pin change * interrupt and save on code size. */ generic module AtmegaPinChangeP(){ uses interface HplAtmegaPinChange; provides interface GpioInterrupt[uint8_t pin]; } implementation{ uint8_t isFalling; /* Enables the interrupt */ async command error_t GpioInterrupt.enableRisingEdge[uint8_t pin](){ atomic{ isFalling &= ~(1< McuSleepC; components new HplAtmegaExtInterruptP((uint8_t)&EIFR, INTF0, (uint8_t)&EIMSK, INT0, (uint8_t)&EICRA, ISC00) as Int0P; components new HplAtmegaExtInterruptP((uint8_t)&EIFR, INTF1, (uint8_t)&EIMSK, INT1, (uint8_t)&EICRA, ISC10) as Int1P; components new HplAtmegaExtInterruptP((uint8_t)&EIFR, INTF2, (uint8_t)&EIMSK, INT2, (uint8_t)&EICRA, ISC20) as Int2P; components new HplAtmegaExtInterruptP((uint8_t)&EIFR, INTF3, (uint8_t)&EIMSK, INT3, (uint8_t)&EICRA, ISC30) as Int3P; components new HplAtmegaExtInterruptP((uint8_t)&EIFR, INTF4, (uint8_t)&EIMSK, INT4, (uint8_t)&EICRB, ISC40) as Int4P; components new HplAtmegaExtInterruptP((uint8_t)&EIFR, INTF5, (uint8_t)&EIMSK, INT5, (uint8_t)&EICRB, ISC50) as Int5P; components new HplAtmegaExtInterruptP((uint8_t)&EIFR, INTF6, (uint8_t)&EIMSK, INT6, (uint8_t)&EICRB, ISC60) as Int6P; components new HplAtmegaExtInterruptP((uint8_t)&EIFR, INTF7, (uint8_t)&EIMSK, INT7, (uint8_t)&EICRB, ISC70) as Int7P; HplAtmegaExtInterrupt[0] = Int0P; HplAtmegaExtInterrupt[1] = Int1P; HplAtmegaExtInterrupt[2] = Int2P; HplAtmegaExtInterrupt[3] = Int3P; HplAtmegaExtInterrupt[4] = Int4P; HplAtmegaExtInterrupt[5] = Int5P; HplAtmegaExtInterrupt[6] = Int6P; HplAtmegaExtInterrupt[7] = Int7P; HplAtmegaExtInterruptSigP.HplAtmegaExtInterruptSig[0] <- Int0P; HplAtmegaExtInterruptSigP.HplAtmegaExtInterruptSig[1] <- Int1P; HplAtmegaExtInterruptSigP.HplAtmegaExtInterruptSig[2] <- Int2P; HplAtmegaExtInterruptSigP.HplAtmegaExtInterruptSig[3] <- Int3P; HplAtmegaExtInterruptSigP.HplAtmegaExtInterruptSig[4] <- Int4P; HplAtmegaExtInterruptSigP.HplAtmegaExtInterruptSig[5] <- Int5P; HplAtmegaExtInterruptSigP.HplAtmegaExtInterruptSig[6] <- Int6P; HplAtmegaExtInterruptSigP.HplAtmegaExtInterruptSig[7] <- Int7P; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/pins/HplAtmegaExtInterruptP.nc000066400000000000000000000061221207233610700253360ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic module HplAtmegaExtInterruptP( uint8_t EIFR_ADDR, uint8_t EIFR_PIN, uint8_t EIMSK_ADDR, uint8_t EIMSK_PIN, uint8_t EICR_ADDR, uint8_t EICR_PIN) { provides interface HplAtmegaExtInterrupt; uses interface HplAtmegaExtInterruptSig; } implementation { #define EIFR_REG (*(volatile uint8_t*)(EIFR_ADDR)) #define EIMSK_REG (*(volatile uint8_t*)(EIMSK_ADDR)) #define EICR_REG (*(volatile uint8_t*)(EICR_ADDR)) // ----- external interrupt flag register (EIFR) async event void HplAtmegaExtInterruptSig.fired() { signal HplAtmegaExtInterrupt.fired(); } default async event void HplAtmegaExtInterrupt.fired() { } async command bool HplAtmegaExtInterrupt.test() { return (EIFR_REG & (1<> EICR_PIN) & 3; } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/pins/HplAtmegaExtInterruptSig.nc000066400000000000000000000034311207233610700256610ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface HplAtmegaExtInterruptSig { /* Signalled when the interrupt is executed */ async event void fired(); /* Called when the interrupt is enabled/disabled */ async command void update(); } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/pins/HplAtmegaExtInterruptSigP.nc000066400000000000000000000060421207233610700260020ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ module HplAtmegaExtInterruptSigP { provides { interface HplAtmegaExtInterruptSig[uint8_t vector]; interface McuPowerOverride; } uses interface McuPowerState; } implementation { AVR_ATOMIC_HANDLER( INT0_vect ) { signal HplAtmegaExtInterruptSig.fired[0](); } AVR_ATOMIC_HANDLER( INT1_vect ) { signal HplAtmegaExtInterruptSig.fired[1](); } AVR_ATOMIC_HANDLER( INT2_vect ) { signal HplAtmegaExtInterruptSig.fired[2](); } AVR_ATOMIC_HANDLER( INT3_vect ) { signal HplAtmegaExtInterruptSig.fired[3](); } AVR_ATOMIC_HANDLER( INT4_vect ) { signal HplAtmegaExtInterruptSig.fired[4](); } AVR_ATOMIC_HANDLER( INT5_vect ) { signal HplAtmegaExtInterruptSig.fired[5](); } AVR_ATOMIC_HANDLER( INT6_vect ) { signal HplAtmegaExtInterruptSig.fired[6](); } AVR_ATOMIC_HANDLER( INT7_vect ) { signal HplAtmegaExtInterruptSig.fired[7](); } default async event void HplAtmegaExtInterruptSig.fired[uint8_t vector]() { } async command void HplAtmegaExtInterruptSig.update[uint8_t vector]() { if( vector >= 4 ) call McuPowerState.update(); } async command mcu_power_t McuPowerOverride.lowestState() { uint8_t eimsk = EIMSK; uint8_t eicrb = EICRB; if( (eimsk & (1< #ifdef IEEE154FRAMES_ENABLED #error "You cannot use ActiveMessageC with IEEE154FRAMES_ENABLED defined" #endif configuration RFA1ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface SendNotifier[am_id_t id]; // for TOSThreads interface Receive as ReceiveDefault[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketField as PacketLinkQuality; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface LinkPacketMetadata; interface LocalTime as LocalTimeRadio; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components RFA1RadioC as RadioC; SplitControl = RadioC; AMSend = RadioC; Receive = RadioC.Receive; Snoop = RadioC.Snoop; SendNotifier = RadioC; ReceiveDefault = RadioC.ReceiveDefault; SnoopDefault = RadioC.SnoopDefault; Packet = RadioC.PacketForActiveMessage; AMPacket = RadioC; PacketAcknowledgements = RadioC; LowPowerListening = RadioC; PacketLink = RadioC; RadioChannel = RadioC; PacketLinkQuality = RadioC.PacketLinkQuality; PacketTransmitPower = RadioC.PacketTransmitPower; PacketRSSI = RadioC.PacketRSSI; LinkPacketMetadata = RadioC; LocalTimeRadio = RadioC; PacketTimeStampMilli = RadioC; PacketTimeStampRadio = RadioC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/radio/RFA1DriverConfig.nc000066400000000000000000000044451207233610700241040ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti * Author: Andras Biro */ interface RFA1DriverConfig { /** * Returns the length of a dummy header to align the payload properly. */ async command uint8_t headerLength(message_t* msg); /** * Returns the maximum length of the PHY payload including the * length field but not counting the FCF field. */ async command uint8_t maxPayloadLength(); /** * Returns the length of a dummy metadata section to align the * metadata section properly. */ async command uint8_t metadataLength(message_t* msg); /** * Returns TRUE if before sending this message we should make sure that * the channel is clear via a very basic (and quick) RSSI check. */ async command bool requiresRssiCca(message_t* msg); } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/radio/RFA1DriverLayer.h000066400000000000000000000036041207233610700235760ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti * Author: Andras Biro */ #ifndef __RFA1DRIVERLAYER_H__ #define __RFA1DRIVERLAYER_H__ typedef nx_struct rfa1_header_t { nxle_uint8_t length; } rfa1_header_t; typedef struct rfa1_metadata_t { uint8_t lqi; union { uint8_t power; uint8_t rssi; }; } rfa1_metadata_t; #endif//__RFA1DRIVERLAYER_H__ tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/radio/RFA1DriverLayerC.nc000066400000000000000000000073731207233610700240610ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti * Author: Andras Biro */ #include #include configuration RFA1DriverLayerC { provides { interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; interface LinkPacketMetadata; interface LocalTime as LocalTimeRadio; interface Alarm; } uses { interface RFA1DriverConfig as Config; interface PacketTimeStamp; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; } } implementation { components RFA1DriverLayerP, BusyWaitMicroC, TaskletC, LocalTime62khzC, new Alarm62khz32C(), HplAtmRfa1TimerMacC; RadioState = RFA1DriverLayerP; RadioSend = RFA1DriverLayerP; RadioReceive = RFA1DriverLayerP; RadioCCA = RFA1DriverLayerP; RadioPacket = RFA1DriverLayerP; LocalTimeRadio = LocalTime62khzC; Config = RFA1DriverLayerP; PacketTransmitPower = RFA1DriverLayerP.PacketTransmitPower; TransmitPowerFlag = RFA1DriverLayerP.TransmitPowerFlag; PacketRSSI = RFA1DriverLayerP.PacketRSSI; RSSIFlag = RFA1DriverLayerP.RSSIFlag; PacketTimeSyncOffset = RFA1DriverLayerP.PacketTimeSyncOffset; TimeSyncFlag = RFA1DriverLayerP.TimeSyncFlag; PacketLinkQuality = RFA1DriverLayerP.PacketLinkQuality; PacketTimeStamp = RFA1DriverLayerP.PacketTimeStamp; LinkPacketMetadata = RFA1DriverLayerP; RFA1DriverLayerP.LocalTime -> LocalTime62khzC; RFA1DriverLayerP.SfdCapture -> HplAtmRfa1TimerMacC.SfdCapture; Alarm = Alarm62khz32C; RFA1DriverLayerP.Tasklet -> TaskletC; RFA1DriverLayerP.BusyWait -> BusyWaitMicroC; #ifdef RADIO_DEBUG components DiagMsgC; RFA1DriverLayerP.DiagMsg -> DiagMsgC; #endif components MainC, RealMainP; RealMainP.PlatformInit -> RFA1DriverLayerP.PlatformInit; MainC.SoftwareInit -> RFA1DriverLayerP.SoftwareInit; components McuSleepC; RFA1DriverLayerP.McuPowerState -> McuSleepC; RFA1DriverLayerP.McuPowerOverride <- McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/radio/RFA1DriverLayerP.nc000066400000000000000000000543301207233610700240710ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti * Author:Andras Biro */ #include #include #include #include #include module RFA1DriverLayerP { provides { interface Init as PlatformInit @exactlyonce(); interface Init as SoftwareInit @exactlyonce(); interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; interface LinkPacketMetadata; interface McuPowerOverride; } uses { interface BusyWait; interface LocalTime; interface AtmegaCapture as SfdCapture; interface RFA1DriverConfig as Config; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; interface PacketTimeStamp; interface Tasklet; interface McuPowerState; #ifdef RADIO_DEBUG interface DiagMsg; #endif } } implementation { rfa1_header_t* getHeader(message_t* msg) { return ((void*)msg) + call Config.headerLength(msg); } void* getPayload(message_t* msg) { return ((void*)msg) + call RadioPacket.headerLength(msg); } rfa1_metadata_t* getMeta(message_t* msg) { return ((void*)msg) + sizeof(message_t) - call RadioPacket.metadataLength(msg); } /*----------------- STATE -----------------*/ tasklet_norace uint8_t state; enum { STATE_P_ON = 0, STATE_SLEEP = 1, STATE_SLEEP_2_TRX_OFF = 2, STATE_TRX_OFF = 3, STATE_TRX_OFF_2_RX_ON = 4, STATE_RX_ON = 5, STATE_BUSY_TX_2_RX_ON = 6, }; tasklet_norace uint8_t cmd; enum { CMD_NONE = 0, // the state machine has stopped CMD_TURNOFF = 1, // goto SLEEP state CMD_STANDBY = 2, // goto TRX_OFF state CMD_TURNON = 3, // goto RX_ON state CMD_TRANSMIT = 4, // currently transmitting a message CMD_RECEIVE = 5, // currently receiving a message CMD_CCA = 6, // performing clear channel assessment CMD_CHANNEL = 7, // changing the channel CMD_SIGNAL_DONE = 8, // signal the end of the state transition CMD_DOWNLOAD = 9, // download the received message }; enum { IRQ_NONE=0, IRQ_AWAKE=1, IRQ_TX_END=2, IRQ_XAH_AMI=4, IRQ_CCA_ED_DONE=8, IRQ_RX_END=16, IRQ_RX_START=32, IRQ_PLL_UNLOCK=64, IRQ_PLL_LOCK=128, }; enum { // this disables the RFA1RadioOffP component RFA1RADIOON = unique("RFA1RadioOn"), }; norace uint8_t radioIrq; tasklet_norace uint8_t txPower; tasklet_norace uint8_t channel; tasklet_norace message_t* rxMsg; message_t rxMsgBuffer; tasklet_norace uint8_t rssiClear; tasklet_norace uint8_t rssiBusy; /*----------------- INIT -----------------*/ command error_t PlatformInit.init() { rxMsg = &rxMsgBuffer; // these are just good approximates rssiClear = 0; rssiBusy = 90; return SUCCESS; } command error_t SoftwareInit.init() { CCA_THRES=RFA1_CCA_THRES_VALUE; #ifdef RFA1_ENABLE_PA SET_BIT(DDRG,0); // DIG3 CLR_BIT(PORTG,0); SET_BIT(DDRF, 3); // DIG0 CLR_BIT(PORTF, 3); #endif #ifdef RFA1_DATA_RATE #if RFA1_DATA_RATE == 250 TRX_CTRL_2 = (TRX_CTRL_2 & 0xfc) | 0; #elif RFA1_DATA_RATE == 500 TRX_CTRL_2 = (TRX_CTRL_2 & 0xfc) | 1; #elif RFA1_DATA_RATE == 1000 TRX_CTRL_2 = (TRX_CTRL_2 & 0xfc) | 2; #elif RFA1_DATA_RATE == 2000 TRX_CTRL_2 = (TRX_CTRL_2 & 0xfc) | 3; #else #error Unsupported RFA1_DATA_RATE (supported: 250, 500, 1000, 2000. default is 250) #endif #endif PHY_TX_PWR = RFA1_PA_BUF_LT | RFA1_PA_LT | (RFA1_DEF_RFPOWER&RFA1_TX_PWR_MASK)< ((rssiClear + rssiBusy) >> 3) ) return EBUSY; TRX_STATE = CMD_PLL_ON; // do something useful, just to wait a little timesync = call PacketTimeSyncOffset.isSet(msg) ? ((void*)msg) + call PacketTimeSyncOffset.get(msg) : 0; data = getPayload(msg); length = getHeader(msg)->length; // length | data[0] ... data[length-3] | automatically generated FCS TRXFBST = length; // the FCS is atomatically generated (2 bytes) (TX_AUTO_CRC_ON==1 by default) length -= 2; // we have missed an incoming message in this short amount of time if( (TRX_STATUS & RFA1_TRX_STATUS_MASK) != PLL_ON ) { RADIO_ASSERT( (TRX_STATUS & RFA1_TRX_STATUS_MASK) == BUSY_RX ); TRX_STATE = CMD_RX_ON; return EBUSY; } atomic { time = call LocalTime.get(); TRX_STATE = CMD_TX_START; } time += TX_SFD_DELAY; RADIO_ASSERT( ! radioIrq ); // fix the time stamp if( timesync != 0 ) *(timesync_relative_t*)timesync = (*(timesync_absolute_t*)timesync) - time; // then upload the whole payload memcpy((void*)(&TRXFBST+1), data, length); // go back to RX_ON state when finished TRX_STATE=CMD_RX_ON; if( timesync != 0 ) *(timesync_absolute_t*)timesync = (*(timesync_relative_t*)timesync) + time; call PacketTimeStamp.set(msg, time); #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ) { length = getHeader(msg)->length; call DiagMsg.chr('t'); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.uint16(call LocalTime.get()); call DiagMsg.int8(length); call DiagMsg.hex8s(getPayload(msg), length - 2); call DiagMsg.send(); } #endif // wait for the TRX_END interrupt state = STATE_BUSY_TX_2_RX_ON; cmd = CMD_TRANSMIT; return SUCCESS; } default tasklet_async event void RadioSend.sendDone(error_t error) { } default tasklet_async event void RadioSend.ready() { } /*----------------- CCA -----------------*/ tasklet_async command error_t RadioCCA.request() { if( cmd != CMD_NONE || state != STATE_RX_ON ) return EBUSY; // see Errata 38.5.5 datasheet TRX_STATE=CMD_PLL_ON; //TODO: test&optimize this call BusyWait.wait(1); if( (TRX_STATUS & RFA1_TRX_STATUS_MASK) != PLL_ON ) return EBUSY; SET_BIT(RX_SYN,RX_PDT_DIS); TRX_STATE=CMD_RX_ON; //end of workaround cmd = CMD_CCA; PHY_CC_CCA = 1 << CCA_REQUEST | RFA1_CCA_MODE_VALUE | channel; return SUCCESS; } default tasklet_async event void RadioCCA.done(error_t error) { } /*----------------- RECEIVE -----------------*/ //TODO: RX_SAFE_MODE with define inline void downloadMessage() { uint8_t length; bool sendSignal = FALSE; length = TST_RX_LENGTH; if( (PHY_RSSI & (1<= 3 && length <= call RadioPacket.maxPayloadLength() + 2 ) { uint8_t* data; data = getPayload(rxMsg); getHeader(rxMsg)->length = length; // we do not store the CRC field length -= 2; // memory is fast, no point optimizing header check memcpy(data,(void*)&TRXFBST,length); if( signal RadioReceive.header(rxMsg) ) { call PacketLinkQuality.set(rxMsg, (uint8_t)*(&TRXFBST+TST_RX_LENGTH)); sendSignal = TRUE; } } state = STATE_RX_ON; #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ) { length = getHeader(rxMsg)->length; call DiagMsg.chr('r'); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.uint16(call LocalTime.get()); call DiagMsg.int8(sendSignal ? length : -length); call DiagMsg.hex8s(getPayload(rxMsg), length - 2); call DiagMsg.int8(call PacketRSSI.isSet(rxMsg) ? call PacketRSSI.get(rxMsg) : -1); call DiagMsg.uint8(call PacketLinkQuality.isSet(rxMsg) ? call PacketLinkQuality.get(rxMsg) : 0); call DiagMsg.send(); } #endif cmd = CMD_NONE; // signal only if it has passed the CRC check if( sendSignal ) rxMsg = signal RadioReceive.receive(rxMsg); } default tasklet_async event bool RadioReceive.header(message_t* msg) { return TRUE; } default tasklet_async event message_t* RadioReceive.receive(message_t* msg) { return msg; } /*----------------- IRQ -----------------*/ void serviceRadio() { uint32_t time; uint8_t irq; uint8_t temp; atomic { time = call SfdCapture.get(); irq = radioIrq; radioIrq = IRQ_NONE; } #ifdef RFA1_RSSI_ENERGY // check this early before the PHY_ED_LEVEL register is overwritten if( irq == IRQ_RX_END ) call PacketRSSI.set(rxMsg, PHY_ED_LEVEL); else call PacketRSSI.clear(rxMsg); #endif if( (irq & IRQ_PLL_LOCK) != 0 ) { if( cmd == CMD_TURNON || cmd == CMD_CHANNEL ) { RADIO_ASSERT( state == STATE_TRX_OFF_2_RX_ON ); state = STATE_RX_ON; cmd = CMD_SIGNAL_DONE; } else if( cmd == CMD_TRANSMIT ) RADIO_ASSERT( state == STATE_BUSY_TX_2_RX_ON ); else RADIO_ASSERT(FALSE); } if( cmd == CMD_TRANSMIT && (irq & IRQ_TX_END) != 0 ) { RADIO_ASSERT( state == STATE_BUSY_TX_2_RX_ON ); state = STATE_RX_ON; cmd = CMD_NONE; signal RadioSend.sendDone(SUCCESS); // TODO: we could have missed a received message RADIO_ASSERT( ! (irq & IRQ_RX_START) ); } if( (irq & IRQ_RX_START) != 0 ) { if( cmd == CMD_CCA ) { signal RadioCCA.done(FAIL); cmd = CMD_NONE; } if( cmd == CMD_NONE ) { RADIO_ASSERT( state == STATE_RX_ON ); // the most likely place for busy channel and good SFD, with no other interrupts if( irq == IRQ_RX_START ) { temp = PHY_RSSI & RFA1_RSSI_MASK; rssiBusy += temp - (rssiBusy >> 2); call PacketTimeStamp.set(rxMsg, time); #ifndef RFA1_RSSI_ENERGY call PacketRSSI.set(rxMsg, temp); #endif } else { call PacketTimeStamp.clear(rxMsg); #ifndef RFA1_RSSI_ENERGY call PacketRSSI.clear(rxMsg); #endif } cmd = CMD_RECEIVE; } else RADIO_ASSERT( cmd == CMD_TURNOFF ); } if( cmd == CMD_RECEIVE && (irq & IRQ_RX_END) != 0 ) { RADIO_ASSERT( state == STATE_RX_ON ); // the most likely place for clear channel (hope to avoid acks) rssiClear += (PHY_RSSI & RFA1_RSSI_MASK) - (rssiClear >> 2); cmd = CMD_DOWNLOAD; } if( (irq & IRQ_AWAKE) != 0 ){ if( state == STATE_SLEEP_2_TRX_OFF && (cmd==CMD_STANDBY || cmd==CMD_TURNON) ) state = STATE_TRX_OFF; else RADIO_ASSERT(FALSE); } if( (irq & IRQ_CCA_ED_DONE) != 0 ){ if( cmd == CMD_CCA ) { // workaround, see Errata 38.5.5 datasheet CLR_BIT(RX_SYN,RX_PDT_DIS); cmd = CMD_NONE; RADIO_ASSERT( state == STATE_RX_ON ); RADIO_ASSERT( (TRX_STATUS & RFA1_TRX_STATUS_MASK) == RX_ON ); signal RadioCCA.done( (TRX_STATUS & CCA_DONE) ? ((TRX_STATUS & CCA_STATUS) ? SUCCESS : EBUSY) : FAIL ); } else RADIO_ASSERT(FALSE); } } /** * Indicates the completion of a frame transmission */ AVR_NONATOMIC_HANDLER(TRX24_TX_END_vect){ RADIO_ASSERT( ! radioIrq ); atomic radioIrq |= IRQ_TX_END; call Tasklet.schedule(); } /** * Indicates the completion of a frame reception */ AVR_NONATOMIC_HANDLER(TRX24_RX_END_vect){ RADIO_ASSERT( ! radioIrq ); atomic radioIrq |= IRQ_RX_END; call Tasklet.schedule(); } /** * Indicates the start of a PSDU reception. The TRX_STATE changes * to BUSY_RX, the PHR is ready to be read from Frame Buffer */ AVR_NONATOMIC_HANDLER(TRX24_RX_START_vect){ RADIO_ASSERT( ! radioIrq ); atomic radioIrq |= IRQ_RX_START; call Tasklet.schedule(); } /** * Indicates PLL lock */ AVR_NONATOMIC_HANDLER(TRX24_PLL_LOCK_vect){ RADIO_ASSERT( ! radioIrq ); atomic radioIrq |= IRQ_PLL_LOCK; call Tasklet.schedule(); } /** * indicates sleep/reset->trx_off mode change */ AVR_NONATOMIC_HANDLER(TRX24_AWAKE_vect){ RADIO_ASSERT( ! radioIrq ); atomic radioIrq |= IRQ_AWAKE; call Tasklet.schedule(); } /** * indicates CCA ED done */ AVR_NONATOMIC_HANDLER(TRX24_CCA_ED_DONE_vect){ RADIO_ASSERT( ! radioIrq ); atomic radioIrq |= IRQ_CCA_ED_DONE; call Tasklet.schedule(); } // never called, we have the RX_START interrupt instead async event void SfdCapture.fired() { } /*----------------- TASKLET -----------------*/ tasklet_async event void Tasklet.run() { if( radioIrq != IRQ_NONE ) serviceRadio(); if( cmd != CMD_NONE ) { if( cmd == CMD_DOWNLOAD ) downloadMessage(); else if( CMD_TURNOFF <= cmd && cmd <= CMD_TURNON ) changeState(); else if( cmd == CMD_CHANNEL ) changeChannel(); if( cmd == CMD_SIGNAL_DONE ) { cmd = CMD_NONE; signal RadioState.done(); } } if( cmd == CMD_NONE && state == STATE_RX_ON && ! radioIrq ) signal RadioSend.ready(); } /*----------------- McuPower -----------------*/ async command mcu_power_t McuPowerOverride.lowestState() { if( (IRQ_MASK & 1<length - 2; } async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length) { RADIO_ASSERT( 1 <= length && length <= 125 ); RADIO_ASSERT( call RadioPacket.headerLength(msg) + length + call RadioPacket.metadataLength(msg) <= sizeof(message_t) ); // we add the length of the CRC, which is automatically generated getHeader(msg)->length = length + 2; } async command uint8_t RadioPacket.maxPayloadLength() { RADIO_ASSERT( call Config.maxPayloadLength() - sizeof(rfa1_header_t) <= 125 ); return call Config.maxPayloadLength() - sizeof(rfa1_header_t); } async command uint8_t RadioPacket.metadataLength(message_t* msg) { return call Config.metadataLength(msg) + sizeof(rfa1_metadata_t); } async command void RadioPacket.clear(message_t* msg) { // all flags are automatically cleared } /*----------------- PacketTransmitPower -----------------*/ async command bool PacketTransmitPower.isSet(message_t* msg) { return call TransmitPowerFlag.get(msg); } async command uint8_t PacketTransmitPower.get(message_t* msg) { return getMeta(msg)->power; } async command void PacketTransmitPower.clear(message_t* msg) { call TransmitPowerFlag.clear(msg); } async command void PacketTransmitPower.set(message_t* msg, uint8_t value) { call TransmitPowerFlag.set(msg); getMeta(msg)->power = value; } /*----------------- PacketRSSI -----------------*/ async command bool PacketRSSI.isSet(message_t* msg) { return call RSSIFlag.get(msg); } async command uint8_t PacketRSSI.get(message_t* msg) { return getMeta(msg)->rssi; } async command void PacketRSSI.clear(message_t* msg) { call RSSIFlag.clear(msg); } async command void PacketRSSI.set(message_t* msg, uint8_t value) { // just to be safe if the user fails to clear the packet call TransmitPowerFlag.clear(msg); call RSSIFlag.set(msg); getMeta(msg)->rssi = value; } /*----------------- PacketTimeSyncOffset -----------------*/ async command bool PacketTimeSyncOffset.isSet(message_t* msg) { return call TimeSyncFlag.get(msg); } async command uint8_t PacketTimeSyncOffset.get(message_t* msg) { return call RadioPacket.headerLength(msg) + call RadioPacket.payloadLength(msg) - sizeof(timesync_absolute_t); } async command void PacketTimeSyncOffset.clear(message_t* msg) { call TimeSyncFlag.clear(msg); } async command void PacketTimeSyncOffset.set(message_t* msg, uint8_t value) { // we do not store the value, the time sync field is always the last 4 bytes RADIO_ASSERT( call PacketTimeSyncOffset.get(msg) == value ); call TimeSyncFlag.set(msg); } /*----------------- PacketLinkQuality -----------------*/ async command bool PacketLinkQuality.isSet(message_t* msg) { return TRUE; } async command uint8_t PacketLinkQuality.get(message_t* msg) { return getMeta(msg)->lqi; } async command void PacketLinkQuality.clear(message_t* msg) { } async command void PacketLinkQuality.set(message_t* msg, uint8_t value) { getMeta(msg)->lqi = value; } /*----------------- LinkPacketMetadata -----------------*/ async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) { return call PacketLinkQuality.get(msg) > 200; } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/radio/RFA1Radio.h000066400000000000000000000053261207233610700224070ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti * Author: Andras Biro */ #ifndef __RFA1RADIO_H__ #define __RFA1RADIO_H__ #include #include #include #include #include #include #include #include #include typedef nx_struct rfa1packet_header_t { rfa1_header_t rfa1; ieee154_simple_header_t ieee154; #ifndef TFRAMES_ENABLED network_header_t network; #endif #ifndef IEEE154FRAMES_ENABLED activemessage_header_t am; #endif } rfa1packet_header_t; typedef nx_struct rfa1packet_footer_t { // the time stamp is not recorded here, time stamped messaged cannot have max length } rfa1packet_footer_t; typedef struct rfa1packet_metadata_t { #ifdef LOW_POWER_LISTENING lpl_metadata_t lpl; #endif #ifdef PACKET_LINK link_metadata_t link; #endif timestamp_metadata_t timestamp; flags_metadata_t flags; rfa1_metadata_t rfa1; } rfa1packet_metadata_t; enum//masks for easyer handling { RFA1_TX_PWR_MASK=0x0F, RFA1_CHANNEL_MASK=0x1F, RFA1_TRX_STATUS_MASK=0x1F, RFA1_RSSI_MASK=0x1F, }; #endif//__RFA1RADIO_H__ tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/radio/RFA1RadioC.nc000066400000000000000000000235741207233610700226700ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti * Author: Andras Biro */ #include configuration RFA1RadioC { provides { interface SplitControl; #ifndef IEEE154FRAMES_ENABLED interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface SendNotifier[am_id_t id]; // for TOSThreads interface Receive as ReceiveDefault[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface AMPacket; interface Packet as PacketForActiveMessage; #endif #ifndef TFRAMES_ENABLED interface Ieee154Send; interface Receive as Ieee154Receive; interface SendNotifier as Ieee154Notifier; interface Resource as SendResource[uint8_t clint]; interface Ieee154Packet; interface Packet as PacketForIeee154Message; #endif interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; #ifdef TRAFFIC_MONITOR interface TrafficMonitor; #endif interface RadioChannel; interface PacketField as PacketLinkQuality; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface LinkPacketMetadata; interface LocalTime as LocalTimeRadio; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { #define UQ_METADATA_FLAGS "UQ_RFA1_METADATA_FLAGS" #define UQ_RADIO_ALARM "UQ_RFA1_RADIO_ALARM" // -------- RadioP components RFA1RadioP as RadioP; #ifdef RADIO_DEBUG components AssertC; #endif RadioP.Ieee154PacketLayer -> Ieee154PacketLayerC; RadioP.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; RadioP.PacketTimeStamp -> TimeStampingLayerC; RadioP.RFA1Packet -> RadioDriverLayerC; // -------- RadioAlarm components new RadioAlarmC(); RadioAlarmC.Alarm -> RadioDriverLayerC; // -------- Active Message #ifndef IEEE154FRAMES_ENABLED components new ActiveMessageLayerC(); ActiveMessageLayerC.Config -> RadioP; ActiveMessageLayerC.SubSend -> AutoResourceAcquireLayerC; ActiveMessageLayerC.SubReceive -> TinyosNetworkLayerC.TinyosReceive; ActiveMessageLayerC.SubPacket -> TinyosNetworkLayerC.TinyosPacket; AMSend = ActiveMessageLayerC; Receive = ActiveMessageLayerC.Receive; Snoop = ActiveMessageLayerC.Snoop; SendNotifier = ActiveMessageLayerC; AMPacket = ActiveMessageLayerC; PacketForActiveMessage = ActiveMessageLayerC; ReceiveDefault = ActiveMessageLayerC.ReceiveDefault; SnoopDefault = ActiveMessageLayerC.SnoopDefault; #endif // -------- Automatic RadioSend Resource #ifndef IEEE154FRAMES_ENABLED #ifndef TFRAMES_ENABLED components new AutoResourceAcquireLayerC(); AutoResourceAcquireLayerC.Resource -> SendResourceC.Resource[unique(RADIO_SEND_RESOURCE)]; #else components new DummyLayerC() as AutoResourceAcquireLayerC; #endif AutoResourceAcquireLayerC -> TinyosNetworkLayerC.TinyosSend; #endif // -------- RadioSend Resource #ifndef TFRAMES_ENABLED components new SimpleFcfsArbiterC(RADIO_SEND_RESOURCE) as SendResourceC; SendResource = SendResourceC; // -------- Ieee154 Message components new Ieee154MessageLayerC(); Ieee154MessageLayerC.Ieee154PacketLayer -> Ieee154PacketLayerC; Ieee154MessageLayerC.SubSend -> TinyosNetworkLayerC.Ieee154Send; Ieee154MessageLayerC.SubReceive -> TinyosNetworkLayerC.Ieee154Receive; Ieee154MessageLayerC.RadioPacket -> TinyosNetworkLayerC.Ieee154Packet; Ieee154Send = Ieee154MessageLayerC; Ieee154Receive = Ieee154MessageLayerC; Ieee154Notifier = Ieee154MessageLayerC; Ieee154Packet = Ieee154PacketLayerC; PacketForIeee154Message = Ieee154MessageLayerC; #endif // -------- Tinyos Network components new TinyosNetworkLayerC(); TinyosNetworkLayerC.SubSend -> UniqueLayerC; TinyosNetworkLayerC.SubReceive -> PacketLinkLayerC; TinyosNetworkLayerC.SubPacket -> Ieee154PacketLayerC; // -------- IEEE 802.15.4 Packet components new Ieee154PacketLayerC(); Ieee154PacketLayerC.SubPacket -> PacketLinkLayerC; // -------- UniqueLayer Send part (wired twice) components new UniqueLayerC(); UniqueLayerC.Config -> RadioP; UniqueLayerC.SubSend -> PacketLinkLayerC; // -------- Packet Link components new PacketLinkLayerC(); PacketLink = PacketLinkLayerC; PacketLinkLayerC.PacketAcknowledgements -> SoftwareAckLayerC; PacketLinkLayerC -> LowPowerListeningLayerC.Send; PacketLinkLayerC -> LowPowerListeningLayerC.Receive; PacketLinkLayerC -> LowPowerListeningLayerC.RadioPacket; // -------- Low Power Listening #ifdef LOW_POWER_LISTENING #warning "*** USING LOW POWER LISTENING LAYER" components new LowPowerListeningLayerC(); LowPowerListeningLayerC.Config -> RadioP; LowPowerListeningLayerC.PacketAcknowledgements -> SoftwareAckLayerC; #else components new LowPowerListeningDummyC() as LowPowerListeningLayerC; #endif LowPowerListeningLayerC.SubControl -> MessageBufferLayerC; LowPowerListeningLayerC.SubSend -> MessageBufferLayerC; LowPowerListeningLayerC.SubReceive -> MessageBufferLayerC; LowPowerListeningLayerC.SubPacket -> TimeStampingLayerC; SplitControl = LowPowerListeningLayerC; LowPowerListening = LowPowerListeningLayerC; // -------- MessageBuffer components new MessageBufferLayerC(); MessageBufferLayerC.RadioSend -> CollisionAvoidanceLayerC; MessageBufferLayerC.RadioReceive -> UniqueLayerC; MessageBufferLayerC.RadioState -> TrafficMonitorLayerC; RadioChannel = MessageBufferLayerC; // -------- UniqueLayer receive part (wired twice) UniqueLayerC.SubReceive -> CollisionAvoidanceLayerC; // -------- CollisionAvoidance #ifdef SLOTTED_MAC components new SlottedCollisionLayerC() as CollisionAvoidanceLayerC; #else components new RandomCollisionLayerC() as CollisionAvoidanceLayerC; #endif CollisionAvoidanceLayerC.Config -> RadioP; CollisionAvoidanceLayerC.SubSend -> SoftwareAckLayerC; CollisionAvoidanceLayerC.SubReceive -> SoftwareAckLayerC; CollisionAvoidanceLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; // -------- SoftwareAcknowledgement components new SoftwareAckLayerC(); SoftwareAckLayerC.AckReceivedFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; SoftwareAckLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; PacketAcknowledgements = SoftwareAckLayerC; SoftwareAckLayerC.Config -> RadioP; SoftwareAckLayerC.SubSend -> CsmaLayerC; SoftwareAckLayerC.SubReceive -> CsmaLayerC; // -------- Carrier Sense components new DummyLayerC() as CsmaLayerC; CsmaLayerC.Config -> RadioP; CsmaLayerC -> TrafficMonitorLayerC.RadioSend; CsmaLayerC -> TrafficMonitorLayerC.RadioReceive; CsmaLayerC -> RadioDriverLayerC.RadioCCA; // -------- TimeStamping components new TimeStampingLayerC(); TimeStampingLayerC.LocalTimeRadio -> RadioDriverLayerC; TimeStampingLayerC.SubPacket -> MetadataFlagsLayerC; PacketTimeStampRadio = TimeStampingLayerC; PacketTimeStampMilli = TimeStampingLayerC; TimeStampingLayerC.TimeStampFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; // -------- MetadataFlags components new MetadataFlagsLayerC(); MetadataFlagsLayerC.SubPacket -> RadioDriverLayerC; // -------- Traffic Monitor #ifdef TRAFFIC_MONITOR components new TrafficMonitorLayerC(); TrafficMonitor = TrafficMonitorLayerC; #else components new DummyLayerC() as TrafficMonitorLayerC; #endif TrafficMonitorLayerC.Config -> RadioP; TrafficMonitorLayerC -> RadioDriverDebugLayerC.RadioSend; TrafficMonitorLayerC -> RadioDriverLayerC.RadioReceive; TrafficMonitorLayerC -> RadioDriverDebugLayerC.RadioState; // -------- Debug #ifdef RADIO_DEBUG components new DebugLayerC("driver") as RadioDriverDebugLayerC; #else components new DummyLayerC() as RadioDriverDebugLayerC; #endif RadioDriverDebugLayerC.SubState -> RadioDriverLayerC; RadioDriverDebugLayerC.SubSend -> RadioDriverLayerC; // -------- Driver components RFA1DriverLayerC as RadioDriverLayerC; RadioDriverLayerC.Config -> RadioP; RadioDriverLayerC.PacketTimeStamp -> TimeStampingLayerC; PacketTransmitPower = RadioDriverLayerC.PacketTransmitPower; PacketLinkQuality = RadioDriverLayerC.PacketLinkQuality; PacketRSSI = RadioDriverLayerC.PacketRSSI; LinkPacketMetadata = RadioDriverLayerC; LocalTimeRadio = RadioDriverLayerC; RadioDriverLayerC.TransmitPowerFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.RSSIFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.TimeSyncFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/radio/RFA1RadioOffP.nc000066400000000000000000000034551207233610700233340ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ module RFA1RadioOffP { provides interface Init as RFA1RadioOff; } implementation { command error_t RFA1RadioOff.init() { if(!uniqueCount("RFA1RadioOn")) { TRXPR |= (1< #include #include module RFA1RadioP { provides { interface RFA1DriverConfig; interface SoftwareAckConfig; interface UniqueConfig; interface CsmaConfig; interface TrafficMonitorConfig; interface RandomCollisionConfig; interface SlottedCollisionConfig; interface ActiveMessageConfig; interface DummyConfig; #ifdef LOW_POWER_LISTENING interface LowPowerListeningConfig; #endif } uses { interface Ieee154PacketLayer; interface RadioAlarm; interface RadioPacket as RFA1Packet; interface PacketTimeStamp; } } implementation { /*----------------- RFA1DriverConfig -----------------*/ async command uint8_t RFA1DriverConfig.headerLength(message_t* msg) { return offsetof(message_t, data) - sizeof(rfa1packet_header_t); } async command uint8_t RFA1DriverConfig.maxPayloadLength() { return sizeof(rfa1packet_header_t) + TOSH_DATA_LENGTH; } async command uint8_t RFA1DriverConfig.metadataLength(message_t* msg) { return 0; } async command bool RFA1DriverConfig.requiresRssiCca(message_t* msg) { return call Ieee154PacketLayer.isDataFrame(msg); } /*----------------- SoftwareAckConfig -----------------*/ async command bool SoftwareAckConfig.requiresAckWait(message_t* msg) { return call Ieee154PacketLayer.requiresAckWait(msg); } async command bool SoftwareAckConfig.isAckPacket(message_t* msg) { return call Ieee154PacketLayer.isAckFrame(msg); } async command bool SoftwareAckConfig.verifyAckPacket(message_t* data, message_t* ack) { return call Ieee154PacketLayer.verifyAckReply(data, ack); } async command void SoftwareAckConfig.setAckRequired(message_t* msg, bool ack) { call Ieee154PacketLayer.setAckRequired(msg, ack); } async command bool SoftwareAckConfig.requiresAckReply(message_t* msg) { return call Ieee154PacketLayer.requiresAckReply(msg); } async command void SoftwareAckConfig.createAckPacket(message_t* data, message_t* ack) { call Ieee154PacketLayer.createAckReply(data, ack); } #ifndef SOFTWAREACK_TIMEOUT #define SOFTWAREACK_TIMEOUT 1000 #endif async command uint16_t SoftwareAckConfig.getAckTimeout() { return (uint16_t)(SOFTWAREACK_TIMEOUT * RADIO_ALARM_MICROSEC); } tasklet_async command void SoftwareAckConfig.reportChannelError() { #ifdef TRAFFIC_MONITOR // signal TrafficMonitorConfig.channelError(); #endif } /*----------------- UniqueConfig -----------------*/ async command uint8_t UniqueConfig.getSequenceNumber(message_t* msg) { return call Ieee154PacketLayer.getDSN(msg); } async command void UniqueConfig.setSequenceNumber(message_t* msg, uint8_t dsn) { call Ieee154PacketLayer.setDSN(msg, dsn); } async command am_addr_t UniqueConfig.getSender(message_t* msg) { return call Ieee154PacketLayer.getSrcAddr(msg); } tasklet_async command void UniqueConfig.reportChannelError() { #ifdef TRAFFIC_MONITOR // signal TrafficMonitorConfig.channelError(); #endif } /*----------------- ActiveMessageConfig -----------------*/ command am_addr_t ActiveMessageConfig.destination(message_t* msg) { return call Ieee154PacketLayer.getDestAddr(msg); } command void ActiveMessageConfig.setDestination(message_t* msg, am_addr_t addr) { call Ieee154PacketLayer.setDestAddr(msg, addr); } command am_addr_t ActiveMessageConfig.source(message_t* msg) { return call Ieee154PacketLayer.getSrcAddr(msg); } command void ActiveMessageConfig.setSource(message_t* msg, am_addr_t addr) { call Ieee154PacketLayer.setSrcAddr(msg, addr); } command am_group_t ActiveMessageConfig.group(message_t* msg) { return call Ieee154PacketLayer.getDestPan(msg); } command void ActiveMessageConfig.setGroup(message_t* msg, am_group_t grp) { call Ieee154PacketLayer.setDestPan(msg, grp); } command error_t ActiveMessageConfig.checkFrame(message_t* msg) { if( ! call Ieee154PacketLayer.isDataFrame(msg) ) call Ieee154PacketLayer.createDataFrame(msg); return SUCCESS; } /*----------------- CsmaConfig -----------------*/ async command bool CsmaConfig.requiresSoftwareCCA(message_t* msg) { return call Ieee154PacketLayer.isDataFrame(msg); } /*----------------- TrafficMonitorConfig -----------------*/ async command uint16_t TrafficMonitorConfig.getBytes(message_t* msg) { // pure airtime: preable (4 bytes), SFD (1 byte), length (1 byte), payload + CRC (len bytes) return call RFA1Packet.payloadLength(msg) + 6; } /*----------------- RandomCollisionConfig -----------------*/ /* * We try to use the same values as in CC2420 * * CC2420_MIN_BACKOFF = 10 jiffies = 320 microsec * CC2420_BACKOFF_PERIOD = 10 jiffies * initial backoff = 0x1F * CC2420_BACKOFF_PERIOD = 310 jiffies = 9920 microsec * congestion backoff = 0x7 * CC2420_BACKOFF_PERIOD = 70 jiffies = 2240 microsec */ #ifndef LOW_POWER_LISTENING #ifndef RFA1_BACKOFF_MIN #define RFA1_BACKOFF_MIN 320 #endif async command uint16_t RandomCollisionConfig.getMinimumBackoff() { return (uint16_t)(RFA1_BACKOFF_MIN * RADIO_ALARM_MICROSEC); } #ifndef RFA1_BACKOFF_INIT #define RFA1_BACKOFF_INIT 4960 // instead of 9920 #endif async command uint16_t RandomCollisionConfig.getInitialBackoff(message_t* msg) { return (uint16_t)(RFA1_BACKOFF_INIT * RADIO_ALARM_MICROSEC); } #ifndef RFA1_BACKOFF_CONG #define RFA1_BACKOFF_CONG 2240 #endif async command uint16_t RandomCollisionConfig.getCongestionBackoff(message_t* msg) { return (uint16_t)(RFA1_BACKOFF_CONG * RADIO_ALARM_MICROSEC); } #endif async command uint16_t RandomCollisionConfig.getTransmitBarrier(message_t* msg) { uint16_t time; // TODO: maybe we should use the embedded timestamp of the message time = call RadioAlarm.getNow(); // estimated response time (download the message, etc) is 5-8 bytes if( call Ieee154PacketLayer.requiresAckReply(msg) ) time += (uint16_t)(32 * (-5 + 16 + 11 + 5) * RADIO_ALARM_MICROSEC); else time += (uint16_t)(32 * (-5 + 5) * RADIO_ALARM_MICROSEC); return time; } tasklet_async event void RadioAlarm.fired() { } /*----------------- SlottedCollisionConfig -----------------*/ async command uint16_t SlottedCollisionConfig.getInitialDelay() { return 300; } async command uint8_t SlottedCollisionConfig.getScheduleExponent() { return 1 + RADIO_ALARM_MILLI_EXP; } async command uint16_t SlottedCollisionConfig.getTransmitTime(message_t* msg) { // TODO: check if the timestamp is correct return call PacketTimeStamp.timestamp(msg); } async command uint16_t SlottedCollisionConfig.getCollisionWindowStart(message_t* msg) { // the preamble (4 bytes), SFD (1 byte), plus two extra for safety return (call PacketTimeStamp.timestamp(msg)) - (uint16_t)(7 * 32 * RADIO_ALARM_MICROSEC); } async command uint16_t SlottedCollisionConfig.getCollisionWindowLength(message_t* msg) { return (uint16_t)(2 * 7 * 32 * RADIO_ALARM_MICROSEC); } /*----------------- Dummy -----------------*/ async command void DummyConfig.nothing() { } /*----------------- LowPowerListening -----------------*/ #ifdef LOW_POWER_LISTENING command bool LowPowerListeningConfig.needsAutoAckRequest(message_t* msg) { return call Ieee154PacketLayer.getDestAddr(msg) != TOS_BCAST_ADDR; } command bool LowPowerListeningConfig.ackRequested(message_t* msg) { return call Ieee154PacketLayer.getAckRequired(msg); } command uint16_t LowPowerListeningConfig.getListenLength() { return 5; } async command uint16_t RandomCollisionConfig.getMinimumBackoff() { return (uint16_t)(320 * RADIO_ALARM_MICROSEC); } async command uint16_t RandomCollisionConfig.getInitialBackoff(message_t* msg) { return (uint16_t)(1600 * RADIO_ALARM_MICROSEC); } async command uint16_t RandomCollisionConfig.getCongestionBackoff(message_t* msg) { return (uint16_t)(3200 * RADIO_ALARM_MICROSEC); } #endif } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/radio/RFA1TimeSyncMessageC.nc000066400000000000000000000100041207233610700246520ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include configuration RFA1TimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStampRadio; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; interface PacketTimeStamp as PacketTimeStampMilli2; interface TimeSyncAMSend as TimeSyncAMSendMilli2[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli2; } } implementation { components RFA1ActiveMessageC as ActiveMessageC, new TimeSyncMessageLayerC(); SplitControl = ActiveMessageC; AMPacket = TimeSyncMessageLayerC; Receive = TimeSyncMessageLayerC.Receive; Snoop = TimeSyncMessageLayerC.Snoop; Packet = TimeSyncMessageLayerC; PacketAcknowledgements = ActiveMessageC; LowPowerListening = ActiveMessageC; PacketTimeStampRadio = ActiveMessageC; TimeSyncAMSendRadio = TimeSyncMessageLayerC; TimeSyncPacketRadio = TimeSyncMessageLayerC; PacketTimeStampMilli = ActiveMessageC; TimeSyncAMSendMilli = TimeSyncMessageLayerC; TimeSyncPacketMilli = TimeSyncMessageLayerC; TimeSyncMessageLayerC.PacketTimeStampRadio -> ActiveMessageC; TimeSyncMessageLayerC.PacketTimeStampMilli -> ActiveMessageC; components RFA1DriverLayerC as DriverLayerC; TimeSyncMessageLayerC.LocalTimeRadio -> DriverLayerC; TimeSyncMessageLayerC.PacketTimeSyncOffset -> DriverLayerC.PacketTimeSyncOffset; components new TimeConverterLayerC(TMilli, RADIO_ALARM_MILLI_EXP) as TimeConverterMilliC, LocalTimeMilliC; PacketTimeStampMilli2 = TimeConverterMilliC; TimeSyncAMSendMilli2 = TimeConverterMilliC; TimeSyncPacketMilli2 = TimeConverterMilliC; TimeConverterMilliC.PacketTimeStampRadio -> ActiveMessageC; TimeConverterMilliC.TimeSyncAMSendRadio -> TimeSyncMessageLayerC; TimeConverterMilliC.TimeSyncPacketRadio -> TimeSyncMessageLayerC; TimeConverterMilliC.LocalTimeRadio -> ActiveMessageC; TimeConverterMilliC.LocalTimeOther -> LocalTimeMilliC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/sensors/000077500000000000000000000000001207233610700211565ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/sensors/AtmegaTemperatureC.nc000066400000000000000000000035121207233610700252200ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Razvan Musaloiu-E. */ generic configuration AtmegaTemperatureC() { provides interface Read; } implementation { components new AdcReadClientC(), AtmegaTemperatureP; Read = AdcReadClientC; AdcReadClientC.Atm128AdcConfig -> AtmegaTemperatureP; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/sensors/AtmegaTemperatureNowC.nc000066400000000000000000000041261207233610700257060ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Razvan Musaloiu-E. */ /** * Battery Temperature. The returned value represents the difference * between the battery voltage and V_BG (1.23V). The formula to convert * it to mV is: 1223 * 1024 / value. */ generic configuration AtmegaTemperatureNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new AdcReadNowClientC(), AtmegaTemperatureP; ReadNow = AdcReadNowClientC; Resource = AdcReadNowClientC; AdcReadNowClientC.Atm128AdcConfig -> AtmegaTemperatureP; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/sensors/AtmegaTemperatureP.nc000066400000000000000000000037301207233610700252370ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ #include "Atm128Adc.h" module AtmegaTemperatureP { provides interface Atm128AdcConfig; } implementation { async command uint8_t Atm128AdcConfig.getChannel() { return ATM128_ADC_INT_TEMP; } async command uint8_t Atm128AdcConfig.getRefVoltage() { return ATM128_ADC_VREF_1_6; } async command uint8_t Atm128AdcConfig.getPrescaler() { return ATM128_ADC_PRESCALE; } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/sensors/AtmegaTemperatureStreamC.nc000066400000000000000000000040511207233610700263730ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Razvan Musaloiu-E. */ /** * Battery Temperature. The returned value represents the difference * between the battery voltage and V_BG (1.23V). The formula to convert * it to mV is: 1223 * 1024 / value. */ generic configuration AtmegaTemperatureStreamC() { provides interface ReadStream; } implementation { components new AdcReadStreamClientC(), AtmegaTemperatureP; ReadStream = AdcReadStreamClientC; AdcReadStreamClientC.Atm128AdcConfig -> AtmegaTemperatureP; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/sensors/AtmegaVoltageC.nc000066400000000000000000000037651207233610700243360ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Razvan Musaloiu-E. */ /** * Battery Voltage. The returned value represents the difference * between the battery voltage and V_BG (1.23V). The formula to convert * it to mV is: 1223 * 1024 / value. */ generic configuration AtmegaVoltageC() { provides interface Read; } implementation { components new AdcReadClientC(), AtmegaVoltageP; Read = AdcReadClientC; AdcReadClientC.Atm128AdcConfig -> AtmegaVoltageP; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/sensors/AtmegaVoltageNowC.nc000066400000000000000000000041061207233610700250100ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Razvan Musaloiu-E. */ /** * Battery Voltage. The returned value represents the difference * between the battery voltage and V_BG (1.23V). The formula to convert * it to mV is: 1223 * 1024 / value. */ generic configuration AtmegaVoltageNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new AdcReadNowClientC(), AtmegaVoltageP; ReadNow = AdcReadNowClientC; Resource = AdcReadNowClientC; AdcReadNowClientC.Atm128AdcConfig -> AtmegaVoltageP; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/sensors/AtmegaVoltageP.nc000066400000000000000000000043541207233610700243460ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Razvan Musaloiu-E. */ /** * Battery Voltage. The returned value represents the difference * between the battery voltage and V_BG (1.23V). The formula to convert * it to mV is: 1223 * 1024 / value. */ #include "Atm128Adc.h" module AtmegaVoltageP { provides interface Atm128AdcConfig; } implementation { async command uint8_t Atm128AdcConfig.getChannel() { // select the 1.23V (V_BG). Reference: Table 97, page 244 from the Atmega128 return ATM128_ADC_SNGL_1_23; } async command uint8_t Atm128AdcConfig.getRefVoltage() { return ATM128_ADC_VREF_OFF; } async command uint8_t Atm128AdcConfig.getPrescaler() { return ATM128_ADC_PRESCALE; } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/sensors/AtmegaVoltageStreamC.nc000066400000000000000000000040311207233610700254750ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Razvan Musaloiu-E. */ /** * Battery Voltage. The returned value represents the difference * between the battery voltage and V_BG (1.23V). The formula to convert * it to mV is: 1223 * 1024 / value. */ generic configuration AtmegaVoltageStreamC() { provides interface ReadStream; } implementation { components new AdcReadStreamClientC(), AtmegaVoltageP; ReadStream = AdcReadStreamClientC; AdcReadStreamClientC.Atm128AdcConfig -> AtmegaVoltageP; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/spi/000077500000000000000000000000001207233610700202555ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/spi/Atm128SpiC.nc000066400000000000000000000102321207233610700223300ustar00rootroot00000000000000/// $Id: Atm128SpiC.nc,v 1.7 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * The HAL of the SPI bus on the atm128. * *

     *  $Id: Atm128SpiC.nc,v 1.7 2010-06-29 22:07:43 scipio Exp $
     * 
    * * * @author Philip Levis * @author Martin Turon * @author Joe Polastre * @date September 7 2005 */ configuration Atm128SpiC { provides interface Init; provides interface SpiByte; provides interface FastSpiByte; provides interface SpiPacket; provides interface Resource[uint8_t id]; } implementation { components new Atm128SpiP() as SpiMaster, HplAtm128SpiC as HplSpi; components new SimpleFcfsArbiterC("Atm128SpiC.Resource") as Arbiter; components McuSleepC; Init = SpiMaster; SpiByte = SpiMaster; FastSpiByte = SpiMaster; SpiPacket = SpiMaster; Resource = SpiMaster; SpiMaster.ResourceArbiter -> Arbiter; SpiMaster.ArbiterInfo -> Arbiter; SpiMaster.Spi -> HplSpi; SpiMaster.McuPowerState -> McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/spi/Atm128SpiP.nc000066400000000000000000000310611207233610700223500ustar00rootroot00000000000000/// $Id: Atm128SpiP.nc,v 1.12 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /** * Primitives for accessing the SPI module on ATmega128 * microcontroller. This module assumes the bus has been reserved and * checks that the bus owner is in fact the person using the bus. * SpiPacket provides an asynchronous send interface where the * transmit data length is equal to the receive data length, while * SpiByte provides an interface for sending a single byte * synchronously. SpiByte allows a component to send a few bytes * in a simple fashion: if more than a handful need to be sent, * SpiPacket should be used. * * *
     *  $Id: Atm128SpiP.nc,v 1.12 2010-06-29 22:07:43 scipio Exp $
     * 
    * * @author Philip Levis * @author Joe Polastre * @author Martin Turon * */ generic module Atm128SpiP() @safe() { provides { interface Init; interface SpiByte; interface FastSpiByte; interface SpiPacket; interface Resource[uint8_t id]; } uses { interface Atm128Spi as Spi; interface Resource as ResourceArbiter[uint8_t id]; interface ArbiterInfo; interface McuPowerState; } } implementation { uint16_t len; uint8_t* COUNT_NOK(len) txBuffer; uint8_t* COUNT_NOK(len) rxBuffer; uint16_t pos; enum { SPI_IDLE, SPI_BUSY, SPI_ATOMIC_SIZE = 10, }; command error_t Init.init() { return SUCCESS; } //default clockrate: 4000 kHz #ifndef SPI_CLOCKRATE #define SPI_CLOCKRATE 4000 #endif void startSpi() { call Spi.enableSpi(FALSE); atomic { call Spi.initMaster(); call Spi.enableInterrupt(FALSE); call Spi.setClockPolarity(FALSE); call Spi.setClockPhase(FALSE); call Spi.enableSpi(TRUE); //calculating prescaler for desired spi clockrate with floor function to the nearest available clockrate #if (PLATFORM_MHZ*1000)/SPI_CLOCKRATE>=64 call Spi.setMasterDoubleSpeed(FALSE); call Spi.setClock(3); #elif (PLATFORM_MHZ*1000)/SPI_CLOCKRATE>=32 call Spi.setMasterDoubleSpeed(FALSE); call Spi.setClock(2); #elif (PLATFORM_MHZ*1000)/SPI_CLOCKRATE>=16 call Spi.setMasterDoubleSpeed(TRUE); call Spi.setClock(2); #elif (PLATFORM_MHZ*1000)/SPI_CLOCKRATE>=8 call Spi.setMasterDoubleSpeed(FALSE); call Spi.setClock(1); #elif (PLATFORM_MHZ*1000)/SPI_CLOCKRATE>=4 call Spi.setMasterDoubleSpeed(TRUE); call Spi.setClock(1); #elif (PLATFORM_MHZ*1000)/SPI_CLOCKRATE>=2 call Spi.setMasterDoubleSpeed(FALSE); call Spi.setClock(0); #else call Spi.setMasterDoubleSpeed(TRUE); call Spi.setClock(0); #endif } call McuPowerState.update(); } void stopSpi() { call Spi.enableSpi(FALSE); atomic { call Spi.sleep(); } call McuPowerState.update(); } async command uint8_t SpiByte.write( uint8_t tx ) { /* There is no need to enable the SPI bus and update the power state here since that must have been done when the resource was granted. However there seems to be a bug somewhere in the radio driver for the MicaZ platform so we cannot remove the following two lines before that problem is resolved. (Miklos Maroti) */ #ifdef PLATFORM_MICAZ call Spi.enableSpi(TRUE); call McuPowerState.update(); #endif call Spi.write( tx ); while( ! call Spi.isInterruptPending() ) ; return call Spi.read(); } inline async command void FastSpiByte.splitWrite(uint8_t data) { call Spi.write(data); } inline async command uint8_t FastSpiByte.splitRead() { while( ! call Spi.isInterruptPending() ) ; return call Spi.read(); } inline async command uint8_t FastSpiByte.splitReadWrite(uint8_t data) { uint8_t b; while( ! call Spi.isInterruptPending() ) ; b = call Spi.read(); call Spi.write(data); return b; } inline async command uint8_t FastSpiByte.write(uint8_t data) { call Spi.write(data); while( ! call Spi.isInterruptPending() ) ; return call Spi.read(); } /** * This component sends SPI packets in chunks of size SPI_ATOMIC_SIZE * (which is normally 5). The tradeoff is between SPI performance * (throughput) and how much the component limits concurrency in the * rest of the system. Handling an interrupt on each byte is * very expensive: the context saving/register spilling constrains * the rate at which one can write out bytes. A more efficient * approach is to write out a byte and wait for a few cycles until * the byte is written (a tiny spin loop). This leads to greater * throughput, but blocks the system and prevents it from doing * useful work. * * This component takes a middle ground. When asked to transmit X * bytes in a packet, it transmits those X bytes in 10-byte parts. * sendNextPart() is responsible for sending one such * part. It transmits bytes with the SpiByte interface, which * disables interrupts and spins on the SPI control register for * completion. On the last byte, however, sendNextPart * re-enables SPI interrupts and sends the byte through the * underlying split-phase SPI interface. When this component handles * the SPI transmit completion event (handles the SPI interrupt), * it calls sendNextPart() again. As the SPI interrupt does * not disable interrupts, this allows processing in the rest of the * system to continue. */ error_t sendNextPart() { uint16_t end; uint16_t tmpPos; uint16_t myLen; uint8_t* COUNT_NOK(myLen) tx; uint8_t* COUNT_NOK(myLen) rx; atomic { myLen = len; tx = txBuffer; rx = rxBuffer; tmpPos = pos; end = pos + SPI_ATOMIC_SIZE; end = (end > len)? len:end; } for (;tmpPos < (end - 1) ; tmpPos++) { uint8_t val; if (tx != NULL) val = call SpiByte.write( tx[tmpPos] ); else val = call SpiByte.write( 0 ); if (rx != NULL) { rx[tmpPos] = val; } } // For the last byte, we re-enable interrupts. call Spi.enableInterrupt(TRUE); atomic { if (tx != NULL) call Spi.write(tx[tmpPos]); else call Spi.write(0); pos = tmpPos; // The final increment will be in the interrupt // handler. } return SUCCESS; } task void zeroTask() { uint16_t myLen; uint8_t* COUNT_NOK(myLen) rx; uint8_t* COUNT_NOK(myLen) tx; atomic { myLen = len; rx = rxBuffer; tx = txBuffer; rxBuffer = NULL; txBuffer = NULL; len = 0; pos = 0; signal SpiPacket.sendDone(tx, rx, myLen, SUCCESS); } } /** * Send bufLen bytes in writeBuf and receive bufLen bytes * into readBuf. If readBuf is NULL, bytes will be * read out of the SPI, but they will be discarded. A byte is read * from the SPI before writing and discarded (to clear any buffered * bytes that might have been left around). * * This command only sets up the state variables and clears the SPI: * sendNextPart() does the real work. * * If there's a send of zero bytes, short-circuit and just post * a task to signal the sendDone. This generally occurs due to an * error in the caler, but signaling an event will hopefully let * it recover better than returning FAIL. */ async command error_t SpiPacket.send(uint8_t* writeBuf, uint8_t* readBuf, uint16_t bufLen) { uint8_t discard; atomic { len = bufLen; txBuffer = writeBuf; rxBuffer = readBuf; pos = 0; } if (bufLen > 0) { discard = call Spi.read(); return sendNextPart(); } else { post zeroTask(); return SUCCESS; } } default async event void SpiPacket.sendDone (uint8_t* _txbuffer, uint8_t* _rxbuffer, uint16_t _length, error_t _success) { } async event void Spi.dataReady(uint8_t data) { bool again; atomic { if (rxBuffer != NULL) { rxBuffer[pos] = data; // Increment position } pos++; } call Spi.enableInterrupt(FALSE); atomic { again = (pos < len); } if (again) { sendNextPart(); } else { uint8_t discard; uint16_t myLen; uint8_t* COUNT_NOK(myLen) rx; uint8_t* COUNT_NOK(myLen) tx; atomic { myLen = len; rx = rxBuffer; tx = txBuffer; rxBuffer = NULL; txBuffer = NULL; len = 0; pos = 0; } discard = call Spi.read(); signal SpiPacket.sendDone(tx, rx, myLen, SUCCESS); } } async command error_t Resource.immediateRequest[ uint8_t id ]() { error_t result = call ResourceArbiter.immediateRequest[ id ](); if ( result == SUCCESS ) { startSpi(); } return result; } async command error_t Resource.request[ uint8_t id ]() { atomic { if (!call ArbiterInfo.inUse()) { startSpi(); } } return call ResourceArbiter.request[ id ](); } async command error_t Resource.release[ uint8_t id ]() { error_t error = call ResourceArbiter.release[ id ](); atomic { if (!call ArbiterInfo.inUse()) { stopSpi(); } } return error; } async command bool Resource.isOwner[uint8_t id]() { return call ResourceArbiter.isOwner[id](); } event void ResourceArbiter.granted[ uint8_t id ]() { signal Resource.granted[ id ](); } default event void Resource.granted[ uint8_t id ]() {} } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/spi/Atm128rfa1Usart0SpiC.nc000066400000000000000000000043161207233610700242070ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ configuration Atm128rfa1Usart0SpiC { provides interface Init; provides interface SpiByte; provides interface FastSpiByte; provides interface SpiPacket; provides interface Resource[uint8_t id]; } implementation { components new Atm128SpiP(), HplAtm128rfa1Usart0SpiC; components new SimpleFcfsArbiterC("Atm128SpiC.Resource") as Arbiter; components McuSleepC; Init = Atm128SpiP; SpiByte = Atm128SpiP; FastSpiByte = Atm128SpiP; SpiPacket = Atm128SpiP; Resource = Atm128SpiP; Atm128SpiP.ArbiterInfo -> Arbiter; Atm128SpiP.ResourceArbiter -> Arbiter; Atm128SpiP.Spi -> HplAtm128rfa1Usart0SpiC; Atm128SpiP.McuPowerState -> McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/spi/HplAtm128SpiC.nc000066400000000000000000000075551207233610700230120ustar00rootroot00000000000000/// $Id: HplAtm128SpiC.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Configuration encapsulating the basic SPI HPL for the atm128. * *
     * $Id: HplAtm128SpiC.nc,v 1.5 2010-06-29 22:07:43 scipio Exp $
     * 
    * * @author Philip Levis * @author Martin Turon */ configuration HplAtm128SpiC { provides interface Atm128Spi as SpiBus; } implementation { components AtmegaGeneralIOC as IO, HplAtm128SpiP as HplSpi; components McuSleepC; SpiBus = HplSpi; HplSpi.Mcu -> McuSleepC; HplSpi.SS -> IO.PortB0; // Slave set line HplSpi.SCK -> IO.PortB1; // SPI clock line HplSpi.MOSI -> IO.PortB2; // Master out, slave in HplSpi.MISO -> IO.PortB3; // Master in, slave out HplSpi.McuPowerOverride <- McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/spi/HplAtm128SpiP.nc000066400000000000000000000162231207233610700230170ustar00rootroot00000000000000/// $Id: HplAtm128SpiP.nc,v 1.1 2010-11-18 23:15:08 andrasbiro Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the SPI bus abstraction for the atm128 * microcontroller. * * @author Philip Levis * @author Martin Turon */ #include "Atm128Spi.h" module HplAtm128SpiP @safe() { provides interface Atm128Spi as SPI; provides interface AsyncStdControl; provides interface McuPowerOverride; uses { interface GeneralIO as SS; // Slave set line interface GeneralIO as SCK; // SPI clock line interface GeneralIO as MOSI; // Master out, slave in interface GeneralIO as MISO; // Master in, slave out interface McuPowerState as Mcu; } } implementation { async command error_t AsyncStdControl.start() { call SPI.enableSpi(TRUE); } async command error_t AsyncStdControl.stop() { call SPI.enableInterrupt(FALSE); call SPI.enableSpi(FALSE); } async command void SPI.initMaster() { call MOSI.makeOutput(); call MISO.makeInput(); call SCK.makeOutput(); call SS.makeOutput(); call SPI.setMasterBit(TRUE); } async command void SPI.initSlave() { call MISO.makeOutput(); call MOSI.makeInput(); call SCK.makeInput(); call SS.makeInput(); call SPI.setMasterBit(FALSE); } async command void SPI.sleep() { } async command uint8_t SPI.read() { return SPDR; } async command void SPI.write(uint8_t d) { SPDR = d; } default async event void SPI.dataReady(uint8_t d) {} AVR_ATOMIC_HANDLER(SPI_STC_vect) { signal SPI.dataReady(call SPI.read()); } //=== SPI Bus utility routines. ==================================== async command bool SPI.isInterruptPending() { return READ_BIT(SPSR, SPIF); } async command bool SPI.isInterruptEnabled () { return READ_BIT(SPCR, SPIE); } async command void SPI.enableInterrupt(bool enabled) { if (enabled) { SET_BIT(SPCR, SPIE); call Mcu.update(); } else { CLR_BIT(SPCR, SPIE); call Mcu.update(); } } async command bool SPI.isSpiEnabled() { return READ_BIT(SPCR, SPE); } async command void SPI.enableSpi(bool enabled) { if (enabled) { SET_BIT(SPCR, SPE); call Mcu.update(); } else { CLR_BIT(SPCR, SPE); call Mcu.update(); } } /* DORD bit */ async command void SPI.setDataOrder(bool lsbFirst) { if (lsbFirst) { SET_BIT(SPCR, DORD); } else { CLR_BIT(SPCR, DORD); } } async command bool SPI.isOrderLsbFirst() { return READ_BIT(SPCR, DORD); } /* MSTR bit */ async command void SPI.setMasterBit(bool isMaster) { if (isMaster) { SET_BIT(SPCR, MSTR); } else { CLR_BIT(SPCR, MSTR); } } async command bool SPI.isMasterBitSet() { return READ_BIT(SPCR, MSTR); } /* CPOL bit */ async command void SPI.setClockPolarity(bool highWhenIdle) { if (highWhenIdle) { SET_BIT(SPCR, CPOL); } else { CLR_BIT(SPCR, CPOL); } } async command bool SPI.getClockPolarity() { return READ_BIT(SPCR, CPOL); } /* CPHA bit */ async command void SPI.setClockPhase(bool sampleOnTrailing) { if (sampleOnTrailing) { SET_BIT(SPCR, CPHA); } else { CLR_BIT(SPCR, CPHA); } } async command bool SPI.getClockPhase() { return READ_BIT(SPCR, CPHA); } async command uint8_t SPI.getClock () { return READ_FLAG(SPCR, ((1 << SPR1) | (1 << SPR0))); } async command void SPI.setClock (uint8_t v) { v &= (1 << SPR1) | (1 << SPR0); SPCR = (SPCR & ~((1 << SPR1) | (1 << SPR0))) | v; } async command bool SPI.hasWriteCollided() { return READ_BIT(SPSR, WCOL); } async command bool SPI.isMasterDoubleSpeed() { return READ_BIT(SPSR, SPI2X); } async command void SPI.setMasterDoubleSpeed(bool on) { if (on) { SET_BIT(SPSR, SPI2X); } else { CLR_BIT(SPSR, SPI2X); } } async command mcu_power_t McuPowerOverride.lowestState() { if(bit_is_set(SPCR,SPE)) { return ATM128_POWER_IDLE; } else return ATM128_POWER_DOWN; } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/spi/HplAtm128rfa1Usart0SpiC.nc000066400000000000000000000040701207233610700246500ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ configuration HplAtm128rfa1Usart0SpiC { provides interface Atm128Spi as SpiBus; } implementation { components AtmegaGeneralIOC as IO, HplAtm128rfa1Usart0SpiP, HplBma180C, new NoPinC(); components McuSleepC; SpiBus = HplAtm128rfa1Usart0SpiP; HplAtm128rfa1Usart0SpiP.Mcu -> McuSleepC; HplAtm128rfa1Usart0SpiP.McuPowerOverride <- McuSleepC; HplAtm128rfa1Usart0SpiP.SS -> NoPinC; HplAtm128rfa1Usart0SpiP.SCK -> IO.PortE2; HplAtm128rfa1Usart0SpiP.MOSI -> IO.PortE1; HplAtm128rfa1Usart0SpiP.MISO -> IO.PortE0; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/spi/HplAtm128rfa1Usart0SpiP.nc000066400000000000000000000131361207233610700246700ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ module HplAtm128rfa1Usart0SpiP { provides interface Atm128Spi as SPI; provides interface McuPowerOverride; uses { interface GeneralIO as SS; interface GeneralIO as SCK; interface GeneralIO as MOSI; interface GeneralIO as MISO; interface McuPowerState as Mcu; } } implementation { async command void SPI.initMaster() { call SPI.setClock(0); call SCK.makeOutput(); call SS.makeOutput(); call SS.set(); call MOSI.makeOutput(); call MISO.makeInput(); call SPI.setMasterBit(TRUE); } async command void SPI.initSlave() { //dummy call SPI.initMaster(); } async command void SPI.sleep() { // call SS.set(); // why was this needed? } async command uint8_t SPI.read() { return UDR0; } async command void SPI.write(uint8_t d) { UDR0 = d; } default async event void SPI.dataReady(uint8_t d) {} AVR_ATOMIC_HANDLER(USART0_UDRE_vect) { signal SPI.dataReady(call SPI.read()); } async command bool SPI.isInterruptPending() { return READ_BIT(UCSR0A, RXC0); } async command bool SPI.isInterruptEnabled () { return READ_BIT(UCSR0B, UDRIE0); } async command void SPI.enableInterrupt(bool enabled) { if (enabled) { SET_BIT(UCSR0B, UDRIE0); call Mcu.update(); } else { CLR_BIT(UCSR0B, UDRIE0); call Mcu.update(); } } async command bool SPI.isSpiEnabled() { return (UCSR0B & (1 << RXEN0 | 1 << TXEN0))?TRUE:FALSE; } async command void SPI.enableSpi(bool enabled) { if (enabled) { UCSR0B |= (1 << RXEN0) | (1 << TXEN0) /*| (1<; } implementation { components new AtmegaCompareP(T62khz, uint32_t, 0, SYM_ALARM_MINDT); Alarm = AtmegaCompareP; components McuInitC; McuInitC.TimerInit -> AtmegaCompareP; components HplAtmRfa1TimerMacC; AtmegaCompareP.AtmegaCounter -> HplAtmRfa1TimerMacC; AtmegaCompareP.AtmegaCompare -> HplAtmRfa1TimerMacC.Compare[unique(UQ_T62KHZ_ALARM)]; // just to start the timer components Counter62khz32C; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AlarmMcu16C.nc000066400000000000000000000043101207233610700230750ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" generic configuration AlarmMcu16C() { provides interface Alarm; } implementation { components new AtmegaCompareP(TMcu, uint16_t, 0, MCU_ALARM_MINDT); Alarm = AtmegaCompareP; components McuInitC; McuInitC.TimerInit -> AtmegaCompareP; #if MCU_TIMER_NO == 1 components HplAtmRfa1Timer1C as HplAtmRfa1TimerC; #elif MCU_TIMER_NO == 3 components HplAtmRfa1Timer3C as HplAtmRfa1TimerC; #endif AtmegaCompareP.AtmegaCounter -> HplAtmRfa1TimerC; AtmegaCompareP.AtmegaCompare -> HplAtmRfa1TimerC.Compare[unique(UQ_MCU_ALARM)]; // just to start the timer components CounterMcu16C; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AlarmMcu32C.nc000066400000000000000000000036701207233610700231030ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" generic configuration AlarmMcu32C() { provides interface Alarm; } implementation { components new TransformAlarmC(TMcu, uint32_t, TMcu, uint16_t, 0); Alarm = TransformAlarmC; TransformAlarmC.Counter -> CounterMcu32C; TransformAlarmC.AlarmFrom -> AlarmMcu16C; components CounterMcu32C, new AlarmMcu16C(); } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AlarmMicro32C.nc000066400000000000000000000040751207233610700234300ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" generic configuration AlarmMicro32C() { provides interface Alarm; } implementation { #if MCU_TIMER_MHZ_LOG2 == 0 components new AlarmMcu32C(); Alarm = AlarmMcu32C; #else components new AlarmMcu32C(); components CounterMicro32C; components new TransformAlarmC(TMicro, uint32_t, TMcu, uint32_t, MCU_TIMER_MHZ_LOG2); Alarm = TransformAlarmC; TransformAlarmC.AlarmFrom -> AlarmMcu32C; TransformAlarmC.Counter -> CounterMicro32C; #endif } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AlarmMilli32C.nc000066400000000000000000000037241207233610700234250ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" generic configuration AlarmMilli32C() { provides interface Alarm; } implementation { components new Alarm62khz32C(); components CounterMilli32C; components new TransformAlarmC(TMilli, uint32_t, T62khz, uint32_t, 6); Alarm = TransformAlarmC; TransformAlarmC.AlarmFrom -> Alarm62khz32C; TransformAlarmC.Counter -> CounterMilli32C; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AlarmRtc16C.nc000066400000000000000000000042131207233610700231030ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" generic configuration AlarmRtc16C() { provides interface Alarm; } implementation { components new AtmegaRtcCompareP(TRtc, 0, RTC_ALARM_MINDT); Alarm = AtmegaRtcCompareP; components McuInitC; McuInitC.TimerInit -> AtmegaRtcCompareP; components HplAtmRfa1Timer2C, CounterRtc16C; AtmegaRtcCompareP.AtmegaCounter -> HplAtmRfa1Timer2C; AtmegaRtcCompareP.AtmegaCompare -> HplAtmRfa1Timer2C.Compare[unique(UQ_RTC_ALARM)]; AtmegaRtcCompareP.Counter -> CounterRtc16C; AtmegaRtcCompareP.getCounterHigh -> CounterRtc16C; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AtmegaCapture.nc000066400000000000000000000052021207233610700236450ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface AtmegaCapture { // ----- input capture register (ICR) /* Returns the current captured value */ async command size_type get(); /* Sets the current captured value */ async command void set(size_type value); // ----- timer interrupt flag register (TIFR), input capture flag (ICF) /* Signalled when the captured event has occured */ async event void fired(); /* Tests if there is a pending captured event */ async command bool test(); /* Resets a pending interrupt */ async command void reset(); // ----- timer interrupt mask register (TIMSK), input capture interrupt enable (ICIE) /* Enables the capture interrupt */ async command void start(); /* Disables the capture interrupt */ async command void stop(); /* Checks is the overflow interrupt is enabled */ async command bool isOn(); // ----- timer control register (TCCR), input capture mode (ICNC and ICES) /* Sets the input capture mode bits */ async command void setMode(uint8_t mode); /* Returns the input capture mode bits */ async command uint8_t getMode(); } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AtmegaCompare.nc000066400000000000000000000054401207233610700236340ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface AtmegaCompare { // ----- output compare register (OCR) /* Returns the current compare value */ async command size_type get(); /* Sets the current compare value */ async command void set(size_type value); // ----- timer interrupt flag register (TIFR), output comare match flag (OCF) /* Signalled when the counter equals the compare value */ async event void fired(); /* Tests if there is a pending overflow interrupt */ async command bool test(); /* Resets a pending interrupt */ async command void reset(); // ----- timer interrupt mask register (TIMSK), output compare interrupt enable (OCIE) /* Enables the overflow interrupt */ async command void start(); /* Disables the overflow interrupt */ async command void stop(); /* Checks is the overflow interrupt is enabled */ async command bool isOn(); // ----- timer control register (TCCR), compare output mode (COM) /* Sets the waveform generation mode bits */ async command void setMode(uint8_t mode); /* Returns the waveform generation mode bits */ async command uint8_t getMode(); // ----- timer control register (TCCR), force output compare (FOC) /* Forces the output compare match */ async command void force(); } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AtmegaCompareP.nc000066400000000000000000000063661207233610700237640ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic module AtmegaCompareP(typedef precision_tag, typedef size_type @integer(), uint8_t mode, uint16_t mindt) { provides { interface Init @exactlyonce(); interface Alarm; } uses { interface AtmegaCounter; interface AtmegaCompare; } } implementation { command error_t Init.init() { call AtmegaCompare.stop(); call AtmegaCompare.setMode(mode); return SUCCESS; } default async event void Alarm.fired() { } // called in atomic context async event void AtmegaCompare.fired() { call AtmegaCompare.stop(); signal Alarm.fired(); } async command void Alarm.stop() { call AtmegaCompare.stop(); } async command bool Alarm.isRunning() { return call AtmegaCompare.isOn(); } // callers make sure that time is always in the future void setAlarm(size_type time) { call AtmegaCompare.set(time); call AtmegaCompare.reset(); call AtmegaCompare.start(); } async command void Alarm.startAt(size_type nt0, size_type ndt) { atomic { // current time + time needed to set alarm size_type n = call AtmegaCounter.get() + mindt; // if alarm is set in the future, where n-nt0 is the time passed since nt0 if( (size_type)(n - nt0) < ndt ) n = nt0 + ndt; setAlarm(n); } } async command void Alarm.start(size_type ndt) { atomic { size_type n = call AtmegaCounter.get(); // calculate the next alarm n += (mindt > ndt) ? mindt : ndt; setAlarm(n); } } async command size_type Alarm.getNow() { return call AtmegaCounter.get(); } async command size_type Alarm.getAlarm() { return call AtmegaCompare.get(); } async event void AtmegaCounter.overflow() { } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AtmegaCounter.nc000066400000000000000000000055221207233610700236660ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface AtmegaCounter { // ----- timer counter register (TCNT) /* Returns the current counter value */ async command size_type get(); /* Sets the current counter value */ async command void set(size_type value); // ----- timer interrupt flag register (TIFR), timer overflow flag (TOV) /* Signalled when the counter is going from 0xFF to 0x00. WARNING: This event MUST be executed in atomic context */ async event void overflow(); /* Tests if there is a pending overflow interrupt WARNING: This command MUST be executed in atomic context */ async command bool test(); /* Resets a pending interrupt */ async command void reset(); // ----- timer interrupt mask register (TIMSK), timer overflow interrupt enable (TOIE) /* Enables the overflow interrupt */ async command void start(); /* Disables the overflow interrupt */ async command void stop(); /* Checks is the overflow interrupt is enabled */ async command bool isOn(); // ----- timer control registers (TCCR), clock select bits (CS) and waveform generation mode (WGM) /* Sets the clock select and waveform generation mode bits */ async command void setMode(uint8_t mode); /* Returns the clock select andwaveform generation mode bits */ async command uint8_t getMode(); } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AtmegaCounterP.nc000066400000000000000000000045341207233610700240100ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic module AtmegaCounterP(typedef precision_tag, typedef size_type @integer(), uint8_t mode) { provides { interface Init @exactlyonce(); interface Counter; } uses { interface AtmegaCounter; } } implementation { command error_t Init.init() { call AtmegaCounter.setMode(mode); call AtmegaCounter.start(); return SUCCESS; } async command size_type Counter.get() { return call AtmegaCounter.get(); } default async event void Counter.overflow() { } async event void AtmegaCounter.overflow() { signal Counter.overflow(); } async command bool Counter.isOverflowPending() { atomic return call AtmegaCounter.test(); } async command void Counter.clearOverflow() { call AtmegaCounter.reset(); } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AtmegaRtcCompareP.nc000066400000000000000000000070711207233610700244270ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic module AtmegaRtcCompareP(typedef precision, uint8_t mode, uint16_t mindt) { provides { interface Init @exactlyonce(); interface Alarm as Alarm; } uses { interface AtmegaCounter; interface AtmegaCompare; interface Counter as Counter; async command uint8_t getCounterHigh(); } } implementation { command error_t Init.init() { call AtmegaCompare.stop(); call AtmegaCompare.setMode(mode); return SUCCESS; } uint16_t alarm; default async event void Alarm.fired() { } // called in atomic context async event void AtmegaCompare.fired() { uint8_t h = call getCounterHigh(); if( h == (alarm >> 8) ) { call AtmegaCompare.stop(); signal Alarm.fired(); } } async command void Alarm.stop() { call AtmegaCompare.stop(); } async command bool Alarm.isRunning() { return call AtmegaCompare.isOn(); } // callers make sure that time is always in the future void setAlarm(uint16_t time) { call AtmegaCompare.set((uint8_t)time); alarm = time; // if( high == (time >> 8) ) // { call AtmegaCompare.reset(); call AtmegaCompare.start(); // } // else // call AtmegaCompare.stop(); } async command void Alarm.startAt(uint16_t nt0, uint16_t ndt) { atomic { // current time + time needed to set alarm uint16_t n = call Counter.get() + mindt; // if alarm is set in the future, where n-nt0 is the time passed since nt0 if( (uint16_t)(n - nt0) < ndt ) n = nt0 + ndt; setAlarm(n); } } async command void Alarm.start(uint16_t ndt) { atomic { uint16_t n = call Counter.get(); // calculate the next alarm n += (mindt > ndt) ? mindt : ndt; setAlarm(n); } } async command uint16_t Alarm.getNow() { return call Counter.get(); } async command uint16_t Alarm.getAlarm() { return alarm; } async event void Counter.overflow() { } // TODO: enable the alarm just when high = (alarm>>8)-1; async event void AtmegaCounter.overflow() { } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AtmegaRtcCounterP.nc000066400000000000000000000064511207233610700244610ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic module AtmegaRtcCounterP(typedef precision, uint8_t mode) { provides { interface Init @exactlyonce(); interface Counter; // for the alarm async command uint8_t getCounterHigh(); } uses { interface AtmegaCounter; } } implementation { command error_t Init.init() { call AtmegaCounter.setMode(mode); call AtmegaCounter.start(); return SUCCESS; } volatile uint8_t high; /* * Without prescaler the interrupt occurs when the Timer goes from 0 to 1, * so we can have two posible sequences of events * * TST=0, CNT=0, TST=1, CNT=1, TST=1 ... TST=1, CNT=1, TST=0 * TST=0, CNT=0, TST=0, CNT=1, TST=1 ... TST=1, CNT=1, TST=0 * * With the prescaler enabled the interrupt occurs while the Timer is 0 * (one 32768 HZ tick after the Timer became 0), so we have one possibility: * * TST=0, CNT=0, TST=1, CNT=0, TST=1 ... TST=1, CNT=0, TST=0 */ async command uint16_t Counter.get() { uint8_t a, b; bool c; atomic { b = call AtmegaCounter.get(); c = call AtmegaCounter.test(); a = high; } if( c && b != 0 ) a += 1; // overflow occurs when switching from 0 to 1. b -= 1; return (((uint16_t)a) << 8) + b; } async command bool Counter.isOverflowPending() { atomic return high == 0xFF && call AtmegaCounter.test(); } async command void Counter.clearOverflow() { call AtmegaCounter.reset(); } default async event void Counter.overflow() { } // called in atomic context async event void AtmegaCounter.overflow() { ++high; if( high == 0 ) signal Counter.overflow(); } // used by the alarm async command uint8_t getCounterHigh() { uint8_t h = high; if( call AtmegaCounter.test() ) h += 1; return h; } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AtmegaTransformCounterC.nc000066400000000000000000000041521207233610700256630ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration AtmegaTransformCounterC(typedef to_size_t @integer(), typedef from_size_t @integer(), int8_t bitshift) { provides interface AtmegaCounter; uses interface AtmegaCounter as SubCounter; } implementation { components new AtmegaTransformCounterP(to_size_t, from_size_t); AtmegaCounter = AtmegaTransformCounterP.AtmegaCounter; SubCounter = AtmegaTransformCounterP.SubCounter; components new HighBitsC(to_size_t, from_size_t, bitshift); AtmegaTransformCounterP.HighBits -> HighBitsC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/AtmegaTransformCounterP.nc000066400000000000000000000071671207233610700257110ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic module AtmegaTransformCounterP(typedef to_size_t @integer(), typedef from_size_t @integer()) { provides interface AtmegaCounter; uses { interface AtmegaCounter as SubCounter; interface HighBits; } } implementation { async command to_size_t AtmegaCounter.get() { to_size_t value; from_size_t counter; /* atomic { counter = call SubCounter.get(); value = call HighBits.get(); if( call SubCounter.test() ) { counter = call SubCounter.get(); value += call HighBits.convertHigh(1); } } value |= call HighBits.convertLow(counter); */ uint8_t increment = 0; atomic { counter = call SubCounter.get(); if( call SubCounter.test() ) { increment = 1; counter = call SubCounter.get(); } value = call HighBits.getXXX(counter, increment); } return value; } async command void AtmegaCounter.set(to_size_t value) { from_size_t counter; atomic { counter = call HighBits.set(value); call SubCounter.set(counter); } } default async event void AtmegaCounter.overflow() { } // WARNING: This event MUST be executed in atomic context, it // does not help if we put the body inside an atomic block async event void SubCounter.overflow() { if( call HighBits.add(1) ) signal AtmegaCounter.overflow(); } // WARNING: This event MUST be executed in atomic context, it // does not help if we put the body inside an atomic block async command bool AtmegaCounter.test() { return call SubCounter.test() && call HighBits.equals(-1); } async command void AtmegaCounter.reset() { call SubCounter.reset(); } async command void AtmegaCounter.start() { call SubCounter.start(); } async command void AtmegaCounter.stop() { call SubCounter.stop(); } async command bool AtmegaCounter.isOn() { return call SubCounter.isOn(); } async command void AtmegaCounter.setMode(uint8_t mode) { call SubCounter.setMode(mode); } async command uint8_t AtmegaCounter.getMode() { return call SubCounter.getMode(); } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/BusyWaitMicroC.nc000066400000000000000000000041521207233610700237720ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" configuration BusyWaitMicroC { provides interface BusyWait; } implementation { components new BusyWaitCounterC(TMicro, uint16_t); BusyWait = BusyWaitCounterC; BusyWaitCounterC.Counter -> CounterMicro16C; #if MCU_TIMER_MHZ_LOG2 == 0 components CounterMcu16C as CounterMicro16C; #else components new TransformCounterC(TMicro, uint16_t, TMcu, uint16_t, MCU_TIMER_MHZ_LOG2, uint8_t) as CounterMicro16C; components CounterMcu16C; CounterMicro16C.CounterFrom -> CounterMcu16C; #endif } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/Counter62khz32C.nc000066400000000000000000000037121207233610700237030ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" configuration Counter62khz32C { provides interface Counter; } implementation { components new AtmegaCounterP(T62khz, uint32_t, SYM_TIMER_MODE); Counter = AtmegaCounterP; components McuInitC; McuInitC.TimerInit -> AtmegaCounterP.Init; components HplAtmRfa1TimerMacC; AtmegaCounterP.AtmegaCounter -> HplAtmRfa1TimerMacC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/CounterMcu16C.nc000066400000000000000000000040741207233610700234670ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" configuration CounterMcu16C { provides interface Counter; } implementation { components new AtmegaCounterP(TMcu, uint16_t, MCU_TIMER_MODE); Counter = AtmegaCounterP; components McuInitC; McuInitC.TimerInit -> AtmegaCounterP.Init; #if MCU_TIMER_NO == 1 components HplAtmRfa1Timer1C as HplAtmRfa1TimerC; #elif MCU_TIMER_NO == 3 components HplAtmRfa1Timer3C as HplAtmRfa1TimerC; #endif AtmegaCounterP.AtmegaCounter -> HplAtmRfa1TimerC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/CounterMcu32C.nc000066400000000000000000000036111207233610700234610ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" configuration CounterMcu32C { provides interface Counter; } implementation { components new TransformCounterC(TMcu, uint32_t, TMcu, uint16_t, 0, uint16_t); Counter = TransformCounterC; TransformCounterC.CounterFrom -> CounterMcu16C; components CounterMcu16C; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/CounterMicro32C.nc000066400000000000000000000040051207233610700240040ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" configuration CounterMicro32C { provides { interface Counter; } } implementation { #if MCU_TIMER_MHZ_LOG2 == 0 components CounterMcu32C; Counter = CounterMcu32C; #else components new TransformCounterC(TMicro, uint32_t, TMcu, uint32_t, MCU_TIMER_MHZ_LOG2, uint8_t); Counter = TransformCounterC; components CounterMcu32C; TransformCounterC.CounterFrom -> CounterMcu32C; #endif } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/CounterMilli32C.nc000066400000000000000000000036241207233610700240070ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" configuration CounterMilli32C { provides interface Counter; } implementation { components new TransformCounterC(TMilli, uint32_t, T62khz, uint32_t, 6, uint8_t); Counter = TransformCounterC; components Counter62khz32C; TransformCounterC.CounterFrom -> Counter62khz32C; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/CounterRtc16C.nc000066400000000000000000000040461207233610700234720ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" configuration CounterRtc16C { provides interface Counter; // for the alarm provides command uint8_t getCounterHigh(); } implementation { components new AtmegaRtcCounterP(TRtc, RTC_TIMER_MODE); Counter = AtmegaRtcCounterP; getCounterHigh = AtmegaRtcCounterP; components McuInitC; McuInitC.TimerInit -> AtmegaRtcCounterP.Init; components HplAtmRfa1Timer2C; AtmegaRtcCounterP.AtmegaCounter -> HplAtmRfa1Timer2C; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/CounterRtc32C.nc000066400000000000000000000036111207233610700234650ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" configuration CounterRtc32C { provides interface Counter; } implementation { components new TransformCounterC(TRtc, uint32_t, TRtc, uint16_t, 0, uint16_t); Counter = TransformCounterC; TransformCounterC.CounterFrom -> CounterRtc16C; components CounterRtc16C; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/HighBits.nc000066400000000000000000000050421207233610700226260ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface HighBits { async command to_size_t getXXX(from_size_t low, int8_t increment); /** * Returns the stored high bits. */ async command to_size_t get(); /** * Increments the stored high bits, and returns TRUE * if the high bits become 0. */ async command bool add(int8_t high); /** * Returns TRUE if the high bits plus the increment is zero */ async command bool equals(int8_t high); /** * Takes the low bits from the parameter and returns it */ async command to_size_t convertLow(from_size_t low); /** * Takes the parameter and interprets it as high bits. */ async command to_size_t convertHigh(int8_t high); /** * Takes the high bits from the parameter and stores it in * memory, then it returns the low bits. You should not * use this method to increment the high bits. */ async command from_size_t set(to_size_t value); } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/HighBitsC.nc000066400000000000000000000134721207233610700227370ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ /** * This component allows you to store and manipulate high and low * bits of an integer. You can freely use positive or negative * bitshifts. * * The layout of to_size_t: * +------------------------------------+-----------------------------+ * | high bits stored by this component | low bits given in arguments | * +------------------------------------+-----------------------------+ * * The layout of from_size_t: * +-----------------------------+-----------------------------+ * | low bits given in arguments | bitshift many discaded bits | * +-----------------------------+-----------------------------+ * * The layout of high_bytes_t: * +------------------------------------+-------------+ * | high bits stored by this component | always zero | * +------------------------------------+-------------+ */ generic module HighBitsC(typedef to_size_t @integer(), typedef from_size_t @integer(), int8_t bitshift) { provides interface HighBits; } implementation { enum { FROM_SIZE = sizeof(from_size_t), TO_SIZE = sizeof(to_size_t), BITSHIFT = bitshift, // the number of bits stored in memory HIGH_BITS = 8 * (TO_SIZE - FROM_SIZE) + BITSHIFT, // the number of bits obtained from user LOW_BITS = 8 * FROM_SIZE - BITSHIFT, // compile time checks TOO_SMALL_HIGHBITS_SHIFT = 1 / (HIGH_BITS > 0), TOO_LARGE_HIGHBITS_SHIFT = 1 / (LOW_BITS > 0), // number of bytes required to store high bits HIGH_SIZE = HIGH_BITS < 0 ? -1 : HIGH_BITS == 0 ? 0 : HIGH_BITS <= 8 ? 1 : HIGH_BITS <= 16 ? 2 : HIGH_BITS <= 32 ? 4 : -1, // number of zero bits in high_bytes HIGH_ZEROS = 8 * HIGH_SIZE - HIGH_BITS, // shifts to align high_bytes into to_size HIGH_SHIFTS = 8 * (TO_SIZE - HIGH_SIZE), }; uint8_t high_bytes[HIGH_SIZE]; typedef union reg32_t { uint32_t full; struct { uint16_t low; uint16_t high; }; } reg32_t; async command to_size_t HighBits.getXXX(from_size_t low, int8_t increment) { to_size_t value; if( HIGH_SIZE == 2 ) { reg32_t reg; reg.high = *(uint16_t*)high_bytes; reg.high += (int16_t)increment; reg.low = low; value = reg.full; } else value = 0; return value; } async command to_size_t HighBits.get() { to_size_t value; if( HIGH_SIZE == 1 ) { uint8_t high = *(uint8_t*)high_bytes; value = ((to_size_t)high) << (HIGH_SIZE == 1 ? HIGH_SHIFTS : 0); } else if( HIGH_SIZE == 2 ) { uint16_t high = *(uint16_t*)high_bytes; value = ((to_size_t)high) << (HIGH_SIZE == 2 ? HIGH_SHIFTS : 0); } else if( HIGH_SIZE == 4 ) { uint32_t high = *(uint32_t*)high_bytes; value = ((to_size_t)high) << (HIGH_SIZE == 4 ? HIGH_SHIFTS : 0); } else value = 0; return value; } async command bool HighBits.add(int8_t high) { if( HIGH_SIZE == 1 ) { return (*(uint8_t*)high_bytes += high << HIGH_ZEROS) == 0; } else if( HIGH_SIZE == 2 ) { return (*(uint16_t*)high_bytes += ((int16_t)high) << HIGH_ZEROS) == 0; } else if( HIGH_SIZE == 4 ) { return (*(uint32_t*)high_bytes += ((int32_t)high) << HIGH_ZEROS) == 0; } else return TRUE; } async command bool HighBits.equals(int8_t high) { if( HIGH_SIZE == 1 ) { return (*(uint8_t*)high_bytes) + (high << HIGH_ZEROS) == 0; } else if( HIGH_SIZE == 2 ) { return (*(uint16_t*)high_bytes) + (((int16_t)high) << HIGH_ZEROS) == 0; } else if( HIGH_SIZE == 4 ) { return (*(uint32_t*)high_bytes) + (((int32_t)high) << HIGH_ZEROS) == 0; } else return TRUE; } async command to_size_t HighBits.convertLow(from_size_t low) { to_size_t value; if( BITSHIFT > 0 ) value = ((to_size_t)low) >> (BITSHIFT > 0 ? BITSHIFT : 0); else if( BITSHIFT < 0 ) value = ((to_size_t)low) << (BITSHIFT < 0 ? -BITSHIFT : 0); else value = (to_size_t)low; return value; } inline async command to_size_t HighBits.convertHigh(int8_t high) { if( TO_SIZE == 1 ) { return ((int8_t)high) << (TO_SIZE == 1 ? LOW_BITS : 0); } else if( TO_SIZE == 2 ) { return ((int16_t)high) << (TO_SIZE == 2 ? LOW_BITS : 0); } else if( TO_SIZE == 4 ) { return ((int32_t)high) << (TO_SIZE == 4 ? LOW_BITS : 0); } else return 0; } async command from_size_t HighBits.set(to_size_t value) { // TODO: implement it return 0; } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/HplAtmRfa1Timer.h000066400000000000000000000110511207233610700236510ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __HPLATMRFA1TIMER_H__ #define __HPLATMRFA1TIMER_H__ // ------- 8-bit timers ------- // constants for AtmegaTimer.setMode enum { // timer control register (TCCR), clock select bits (CS) ATMRFA1_CLK8_OFF = 0, ATMRFA1_CLK8_NORMAL = 1, ATMRFA1_CLK8_DIVIDE_8 = 2, ATMRFA1_CLK8_DIVIDE_32 = 3, ATMRFA1_CLK8_DIVIDE_64 = 4, ATMRFA1_CLK8_DIVIDE_128 = 5, ATMRFA1_CLK8_DIVIDE_256 = 6, ATMRFA1_CLK8_DIVIDE_1024 = 7, // timer control register (TCCR), wave generation mode (WGM) ATMRFA1_WGM8_NORMAL = 0 << 3, ATMRFA1_WGM8_PWM = 1 << 3, ATMRFA1_WGM8_CTC = 2 << 3, ATMRFA1_WGM8_PWM_FAST = 3 << 3, ATMRFA1_WGM8_COMPARE_HIGH = 5 << 3, ATMRFA1_WGM8_COMPARE_LOW = 7 << 3, // asynchronous status register (ASSR) clock bits (EXCLK and AS2) ATMRFA1_ASYNC_OFF = 0 << 6, ATMRFA1_ASYNC_ON = 1 << 6, ATMRFA1_ASYNC_EXT = 3 << 6, }; // constants for AtmegaCompare.setMode enum { // timer control register (TCCR), compare output mode (COM) ATMRFA1_COM8_OFF = 0, ATMRFA1_COM8_TOGGLE, ATMRFA1_COM8_CLEAR, ATMRFA1_COM8_SET, }; // ------- 16-bit timers ------- // constants for AtmegaTimer.setMode enum { // timer control register (TCCR), clock select bits (CS) ATMRFA1_CLK16_OFF = 0, ATMRFA1_CLK16_NORMAL = 1, ATMRFA1_CLK16_DIVIDE_8 = 2, ATMRFA1_CLK16_DIVIDE_64 = 3, ATMRFA1_CLK16_DIVIDE_256 = 4, ATMRFA1_CLK16_DIVIDE_1024 = 5, ATMRFA1_CLK16_EXTERNAL_FALL = 6, ATMRFA1_CLK16_EXTERNAL_RISE = 7, // timer control register (TCCR), wave generation mode (WGM) ATMRFA1_WGM16_NORMAL = 0 << 3, ATMRFA1_WGM16_PWM_8BIT = 1 << 3, ATMRFA1_WGM16_PWM_9BIT = 2 << 3, ATMRFA1_WGM16_PWM_10BIT = 3 << 3, ATMRFA1_WGM16_CTC_COMPARE = 4 << 3, ATMRFA1_WGM16_PWM_FAST_8BIT = 5 << 3, ATMRFA1_WGM16_PWM_FAST_9BIT = 6 << 3, ATMRFA1_WGM16_PWM_FAST_10BIT = 7 << 3, ATMRFA1_WGM16_PWM_CAPTURE_LOW = 8 << 3, ATMRFA1_WGM16_PWM_COMPARE_LOW = 9 << 3, ATMRFA1_WGM16_PWM_CAPTURE_HIGH = 10 << 3, ATMRFA1_WGM16_PWM_COMPARE_HIGH = 11 << 3, ATMRFA1_WGM16_CTC_CAPTURE = 12 << 3, ATMRFA1_WGM16_RESERVED = 13 << 3, ATMRFA1_WGM16_PWM_FAST_CAPTURE = 14 << 3, ATMRFA1_WGM16_PWM_FAST_COMPARE = 15 << 3, }; // constants for AtmegaCompare.setMode enum { // timer control register (TCCR), compare output mode (COM) ATMRFA1_COM16_NORMAL = 0, ATMRFA1_COM16_TOGGLE, ATMRFA1_COM16_CLEAR, ATMRFA1_COM16_SET }; // constants for AtmegaCapture.setMode enum { ATMRFA1_CAP16_RISING_EDGE = 0x01, ATMRFA1_CAP16_NOISE_CANCEL = 0x02, }; // ------- MAC symbol counter ------- // constants for AtmegaTimer.setMode enum { ATMRFA1_CLKSC_DISABLE = 0, ATMRFA1_CLKSC_XTAL = 1 << SCEN, // 16 MHz XTAL1 ATMRFA1_CLKSC_RTC = (1 << SCEN) | (1 << SCCKSEL), // 32 KHz RTC }; // constants for AtmegaCompare.setMode enum { ATMRFA1_COMSC_ABSOLUTE = 0, ATMRFA1_COMSC_RELATIVE = 1, }; // constants for AtmegaCapture.setMode enum { ATMRFA1_CAPSC_OFF = 0, ATMRFA1_CAPSC_ON = 1, }; #endif//__HPLATMRFA1TIMER_H__ tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/HplAtmRfa1Timer1C.nc000066400000000000000000000042121207233610700242070ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ configuration HplAtmRfa1Timer1C { provides { interface AtmegaCounter as Counter; interface AtmegaCompare as Compare[uint8_t id]; interface AtmegaCapture as Capture; } } implementation { components HplAtmRfa1Timer1P; Counter = HplAtmRfa1Timer1P; Compare[0] = HplAtmRfa1Timer1P.CompareA; Compare[1] = HplAtmRfa1Timer1P.CompareB; Compare[2] = HplAtmRfa1Timer1P.CompareC; Capture = HplAtmRfa1Timer1P; components McuSleepC; HplAtmRfa1Timer1P.McuPowerState -> McuSleepC; HplAtmRfa1Timer1P.McuPowerOverride <- McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/HplAtmRfa1Timer1P.nc000066400000000000000000000214311207233610700242260ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "HplAtmRfa1Timer.h" module HplAtmRfa1Timer1P @safe() { provides { interface AtmegaCounter as Timer; interface AtmegaCompare as CompareA; interface AtmegaCompare as CompareB; interface AtmegaCompare as CompareC; interface AtmegaCapture as Capture; interface McuPowerOverride; } uses { interface McuPowerState; } } implementation { // ----- TIMER: timer counter register (TCNT) async command uint16_t Timer.get() { atomic return TCNT1; } async command void Timer.set(uint16_t value) { atomic TCNT1 = value; } // ----- TIMER: timer interrupt flag register (TIFR), timer overflow flag (TOV) default async event void Timer.overflow() { } AVR_ATOMIC_HANDLER(TIMER1_OVF_vect) { signal Timer.overflow(); } async command bool Timer.test() { return TIFR1 & (1 << TOV1); } async command void Timer.reset() { TIFR1 = 1 << TOV1; } // ----- TIMER: timer interrupt mask register (TIMSK), timer overflow interrupt enable (TOIE) async command void Timer.start() { SET_BIT(TIMSK1, TOIE1); } async command void Timer.stop() { CLR_BIT(TIMSK1, TOIE1); } async command bool Timer.isOn() { return TIMSK1 & (1 << TOIE1); } // ----- TIMER: timer control register (TCCR), clock select (CS) and waveform generation mode (WGM) bits async command void Timer.setMode(uint8_t mode) { atomic { TCCR1A = (TCCR1A & ~(0x3 << WGM10)) | ((mode >> 3) & 0x3) << WGM10; TCCR1B = (TCCR1B & ~(0x3 << WGM12 | 0x7 << CS10)) | ((mode >> 5) & 0x3) << WGM12 | ((mode >> 0) & 0x7) << CS10; } } async command uint8_t Timer.getMode() { uint8_t a, b; atomic { a = TCCR1A; b = TCCR1B; } return ((a >> WGM10) & 0x3) << 3 | ((b >> WGM12) & 0x3) << 5 | ((b >> CS10) & 0x7) << 0; } // ----- COMPARE A: output compare register (OCR) async command uint16_t CompareA.get() { atomic return OCR1A; } async command void CompareA.set(uint16_t value) { atomic OCR1A = value; } // ----- COMPARE B: output compare register (OCR) async command uint16_t CompareB.get() { atomic return OCR1B; } async command void CompareB.set(uint16_t value) { atomic OCR1B = value; } // ----- COMPARE C: output compare register (OCR) async command uint16_t CompareC.get() { atomic return OCR1C; } async command void CompareC.set(uint16_t value) { atomic OCR1C = value; } // ----- COMPARE A: timer interrupt flag register (TIFR), output comare match flag (OCF) default async event void CompareA.fired() { } AVR_ATOMIC_HANDLER(TIMER1_COMPA_vect) { signal CompareA.fired(); } async command bool CompareA.test() { return TIFR1 & (1 << OCF1A); } async command void CompareA.reset() { TIFR1 = 1 << OCF1A; } // ----- COMPARE B: timer interrupt flag register (TIFR), output comare match flag (OCF) default async event void CompareB.fired() { } AVR_ATOMIC_HANDLER(TIMER1_COMPB_vect) { signal CompareB.fired(); } async command bool CompareB.test() { return TIFR1 & (1 << OCF1B); } async command void CompareB.reset() { TIFR1 = 1 << OCF1B; } // ----- COMPARE C: timer interrupt flag register (TIFR), output comare match flag (OCF) default async event void CompareC.fired() { } AVR_ATOMIC_HANDLER(TIMER1_COMPC_vect) { signal CompareC.fired(); } async command bool CompareC.test() { return TIFR1 & (1 << OCF1C); } async command void CompareC.reset() { TIFR1 = 1 << OCF1C; } // ----- COMPARE A: timer interrupt mask register (TIMSK), output compare interrupt enable (OCIE) async command void CompareA.start() { SET_BIT(TIMSK1, OCIE1A); call McuPowerState.update(); } async command void CompareA.stop() { CLR_BIT(TIMSK1, OCIE1A); call McuPowerState.update(); } async command bool CompareA.isOn() { return TIMSK1 & (1 << OCIE1A); } // ----- COMPARE B: timer interrupt mask register (TIMSK), output compare interrupt enable (OCIE) async command void CompareB.start() { SET_BIT(TIMSK1, OCIE1B); call McuPowerState.update(); } async command void CompareB.stop() { CLR_BIT(TIMSK1, OCIE1B); call McuPowerState.update(); } async command bool CompareB.isOn() { return TIMSK1 & (1 << OCIE1B); } // ----- COMPARE C: timer interrupt mask register (TIMSK), output compare interrupt enable (OCIE) async command void CompareC.start() { SET_BIT(TIMSK1, OCIE1C); call McuPowerState.update(); } async command void CompareC.stop() { CLR_BIT(TIMSK1, OCIE1C); call McuPowerState.update(); } async command bool CompareC.isOn() { return TIMSK1 & (1 << OCIE1C); } // ----- COMPARE A: timer control register (TCCR), compare output mode (COM) async command void CompareA.setMode(uint8_t mode) { atomic { TCCR1A = (TCCR1A & ~(0x3 << COM1A0)) | (mode & 0x3) << COM1A0; } } async command uint8_t CompareA.getMode() { return (TCCR1A >> COM1A0) & 0x3; } // ----- COMPARE B: timer control register (TCCR), compare output mode (COM) async command void CompareB.setMode(uint8_t mode) { atomic { TCCR1B = (TCCR1B & ~(0x3 << COM1B0)) | (mode & 0x3) << COM1B0; } } async command uint8_t CompareB.getMode() { return (TCCR1B >> COM1B0) & 0x3; } // ----- COMPARE C: timer control register (TCCR), compare output mode (COM) async command void CompareC.setMode(uint8_t mode) { atomic { TCCR1C = (TCCR1C & ~(0x3 << COM1C0)) | (mode & 0x3) << COM1C0; } } async command uint8_t CompareC.getMode() { return (TCCR1C >> COM1C0) & 0x3; } // ----- COMPARE A: timer control register (TCCR), force output compare (FOC) async command void CompareA.force() { SET_BIT(TCCR1C, FOC1A); } // ----- COMPARE B: timer control register (TCCR), force output compare (FOC) async command void CompareB.force() { SET_BIT(TCCR1C, FOC1B); } // ----- COMPARE C: timer control register (TCCR), force output compare (FOC) async command void CompareC.force() { SET_BIT(TCCR1C, FOC1C); } // ----- CAPTURE: input capture register (ICR) async command uint16_t Capture.get() { atomic return ICR1; } async command void Capture.set(uint16_t value) { atomic ICR1 = value; } // ----- CAPTURE: timer interrupt flag register (TIFR), input capture flag (ICF) default async event void Capture.fired() { } AVR_ATOMIC_HANDLER(TIMER1_CAPT_vect) { signal Capture.fired(); } async command bool Capture.test() { return TIFR1 & (1 << ICF1); } async command void Capture.reset() { TIFR1 = 1 << ICF1; } // ----- CAPTURE: timer interrupt mask register (TIMSK), input capture interrupt enable (ICIE) async command void Capture.start() { SET_BIT(TIMSK1, ICIE1); call McuPowerState.update(); } async command void Capture.stop() { CLR_BIT(TIMSK1, ICIE1); call McuPowerState.update(); } async command bool Capture.isOn() { return TIMSK1 & (1 << ICIE1); } // ----- CAPTURE: timer control register (TCCR), input capture mode (COM) async command void Capture.setMode(uint8_t mode) { atomic { TCCR1B = (TCCR1B & ~(0x3 << ICES1)) | (mode & 0x3) << ICES1; } } async command uint8_t Capture.getMode() { return (TCCR1B >> ICES1) & 0x3; } // ----- MCUPOWER async command mcu_power_t McuPowerOverride.lowestState() { // if we need to wake up by this clock if( TIMSK1 & (1 << OCIE1A | 1 << OCIE1B | 1 << OCIE1C | 1 << ICIE1) ) return ATM128_POWER_IDLE; else return ATM128_POWER_DOWN; } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/HplAtmRfa1Timer2AsyncC.nc000066400000000000000000000040651207233610700252140ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ configuration HplAtmRfa1Timer2AsyncC { provides { interface AtmegaCounter as Counter; interface AtmegaCompare as Compare[uint8_t id]; } } implementation { components HplAtmRfa1Timer2AsyncP; Counter = HplAtmRfa1Timer2AsyncP; Compare[0] = HplAtmRfa1Timer2AsyncP.CompareA; // Compare[1] = HplAtmRfa1Timer2AsyncP.CompareB; components McuSleepC; HplAtmRfa1Timer2AsyncP.McuPowerState -> McuSleepC; HplAtmRfa1Timer2AsyncP.McuPowerOverride <- McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/HplAtmRfa1Timer2AsyncP.nc000066400000000000000000000144731207233610700252350ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "HplAtmRfa1Timer.h" module HplAtmRfa1Timer2AsyncP @safe() { provides { interface AtmegaCounter as Counter; interface AtmegaCompare as CompareA; // interface AtmegaCompare as CompareB; interface McuPowerOverride; } uses { interface McuPowerState; } } implementation { /* Updating certain registers takes 1-2 clock ticks at 32768 KHz (regardless of the prescaler) if the timer is running asynchronously, so we have to monitor when these updates are propagated. We always check ASSR before updating these registers, and we do not wait for completion after the change to make good use of the processor time. However, we force the mcu power state calculation and before entering power down mode we wait for the completion of these register updates. */ // ----- TIMER: timer counter register (TCNT) async command uint8_t Counter.get() { // TODO: make sure we wait at least one 1/32768 clock tick after wakeup return TCNT2; } async command void Counter.set(uint8_t value) { atomic { while( ASSR & (1 << TCN2UB) ) ; TCNT2 = value; } call McuPowerState.update(); } // ----- TIMER: timer interrupt flag register (TIFR), timer overflow flag (TOV) default async event void Counter.overflow() { } AVR_ATOMIC_HANDLER(TIMER2_OVF_vect) { // to keep the MCU from going to sleep too early TCCR2A = TCCR2A; call McuPowerState.update(); signal Counter.overflow(); } async command bool Counter.test() { return TIFR2 & (1 << TOV2); } async command void Counter.reset() { TIFR2 = 1 << TOV2; } // ----- TIMER: timer interrupt mask register (TIMSK), timer overflow interrupt enable (TOIE) async command void Counter.start() { SET_BIT(TIMSK2, TOIE2); call McuPowerState.update(); } async command void Counter.stop() { CLR_BIT(TIMSK2, TOIE2); call McuPowerState.update(); } async command bool Counter.isOn() { return TIMSK2 & (1 << TOIE2); } // ----- TIMER: timer control register (TCCR), clock select (CS) and waveform generation mode (WGM) bits async command void Counter.setMode(uint8_t mode) { atomic { ASSR = (ASSR & ~(0x3 << AS2)) | ((mode >> 6) & 0x3) << AS2; while( ASSR & (1 << TCR2AUB | 1 << TCR2BUB) ) ; TCCR2A = (TCCR2A & ~(0x3 << WGM20)) | ((mode >> 3) & 0x3) << WGM20; TCCR2B = (TCCR2B & ~(0x1 << WGM22 | 0x7 << CS20)) | ((mode >> 5) & 0x1) << WGM22 | ((mode >> 0) & 0x7) << CS20; } call McuPowerState.update(); } async command uint8_t Counter.getMode() { uint8_t a, b, c; atomic { a = ASSR; b = TCCR2A; c = TCCR2B; } return ((a >> AS2) & 0x3) << 6 | ((b >> WGM20) & 0x3) << 3 | ((c >> WGM22) & 0x1) << 5 | ((c >> CS20) & 0x7) << 0; } // ----- COMPARE A: output compare register (OCR) async command uint8_t CompareA.get() { return OCR2A; } async command void CompareA.set(uint8_t value) { atomic { while( ASSR & (1 << OCR2AUB) ) ; OCR2A = value; } call McuPowerState.update(); } // ----- COMPARE A: timer interrupt flag register (TIFR), output comare match flag (OCF) default async event void CompareA.fired() { } AVR_ATOMIC_HANDLER(TIMER2_COMPA_vect) { // to keep the MCU from going to sleep too early TCCR2A = TCCR2A; call McuPowerState.update(); signal CompareA.fired(); } async command bool CompareA.test() { return TIFR2 & (1 << OCF2A); } async command void CompareA.reset() { TIFR2 = 1 << OCF2A; } // ----- COMPARE A: timer interrupt mask register (TIMSK), output compare interrupt enable (OCIE) async command void CompareA.start() { SET_BIT(TIMSK2, OCIE2A); call McuPowerState.update(); } async command void CompareA.stop() { CLR_BIT(TIMSK2, OCIE2A); call McuPowerState.update(); } async command bool CompareA.isOn() { return TIMSK2 & (1 << OCIE2A); } // ----- COMPARE A: timer control register (TCCR), compare output mode (COM) async command void CompareA.setMode(uint8_t mode) { atomic { while( ASSR & (1 << TCR2AUB) ) ; TCCR2A = (TCCR2A & ~(0x3 << COM2A0)) | (mode & 0x3) << COM2A0; } call McuPowerState.update(); } async command uint8_t CompareA.getMode() { return (TCCR2A >> COM2A0) & 0x3; } // ----- COMPARE A: timer control register (TCCR), force output compare (FOC) async command void CompareA.force() { atomic { while( ASSR & (1 << TCR2BUB) ) ; SET_BIT(TCCR2B, FOC2A); } call McuPowerState.update(); } // ----- MCUPOWER async command mcu_power_t McuPowerOverride.lowestState() { // wait for all changes to propagate while( ASSR & (1 << TCN2UB | 1 << OCR2AUB | 1 << OCR2BUB | 1 << TCR2AUB | 1 << TCR2BUB) ) ; // if we need to wake up by this clock if( TIMSK2 & (1 << TOIE2 | 1 << OCIE2A | 1 << OCIE2B) ) return ATM128_POWER_SAVE; else return ATM128_POWER_DOWN; } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/HplAtmRfa1Timer3C.nc000066400000000000000000000042121207233610700242110ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ configuration HplAtmRfa1Timer3C { provides { interface AtmegaCounter as Counter; interface AtmegaCompare as Compare[uint8_t id]; interface AtmegaCapture as Capture; } } implementation { components HplAtmRfa1Timer3P; Counter = HplAtmRfa1Timer3P; Compare[0] = HplAtmRfa1Timer3P.CompareA; Compare[1] = HplAtmRfa1Timer3P.CompareB; Compare[2] = HplAtmRfa1Timer3P.CompareC; Capture = HplAtmRfa1Timer3P; components McuSleepC; HplAtmRfa1Timer3P.McuPowerState -> McuSleepC; HplAtmRfa1Timer3P.McuPowerOverride <- McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/HplAtmRfa1Timer3P.nc000066400000000000000000000214311207233610700242300ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "HplAtmRfa1Timer.h" module HplAtmRfa1Timer3P @safe() { provides { interface AtmegaCounter as Timer; interface AtmegaCompare as CompareA; interface AtmegaCompare as CompareB; interface AtmegaCompare as CompareC; interface AtmegaCapture as Capture; interface McuPowerOverride; } uses { interface McuPowerState; } } implementation { // ----- TIMER: timer counter register (TCNT) async command uint16_t Timer.get() { atomic return TCNT3; } async command void Timer.set(uint16_t value) { atomic TCNT3 = value; } // ----- TIMER: timer interrupt flag register (TIFR), timer overflow flag (TOV) default async event void Timer.overflow() { } AVR_ATOMIC_HANDLER(TIMER3_OVF_vect) { signal Timer.overflow(); } async command bool Timer.test() { return TIFR3 & (1 << TOV3); } async command void Timer.reset() { TIFR3 = 1 << TOV3; } // ----- TIMER: timer interrupt mask register (TIMSK), timer overflow interrupt enable (TOIE) async command void Timer.start() { SET_BIT(TIMSK3, TOIE3); } async command void Timer.stop() { CLR_BIT(TIMSK3, TOIE3); } async command bool Timer.isOn() { return TIMSK3 & (1 << TOIE3); } // ----- TIMER: timer control register (TCCR), clock select (CS) and waveform generation mode (WGM) bits async command void Timer.setMode(uint8_t mode) { atomic { TCCR3A = (TCCR3A & ~(0x3 << WGM30)) | ((mode >> 3) & 0x3) << WGM30; TCCR3B = (TCCR3B & ~(0x3 << WGM32 | 0x7 << CS30)) | ((mode >> 5) & 0x3) << WGM32 | ((mode >> 0) & 0x7) << CS30; } } async command uint8_t Timer.getMode() { uint8_t a, b; atomic { a = TCCR3A; b = TCCR3B; } return ((a >> WGM30) & 0x3) << 3 | ((b >> WGM32) & 0x3) << 5 | ((b >> CS30) & 0x7) << 0; } // ----- COMPARE A: output compare register (OCR) async command uint16_t CompareA.get() { atomic return OCR3A; } async command void CompareA.set(uint16_t value) { atomic OCR3A = value; } // ----- COMPARE B: output compare register (OCR) async command uint16_t CompareB.get() { atomic return OCR3B; } async command void CompareB.set(uint16_t value) { atomic OCR3B = value; } // ----- COMPARE C: output compare register (OCR) async command uint16_t CompareC.get() { atomic return OCR3C; } async command void CompareC.set(uint16_t value) { atomic OCR3C = value; } // ----- COMPARE A: timer interrupt flag register (TIFR), output comare match flag (OCF) default async event void CompareA.fired() { } AVR_ATOMIC_HANDLER(TIMER3_COMPA_vect) { signal CompareA.fired(); } async command bool CompareA.test() { return TIFR3 & (1 << OCF3A); } async command void CompareA.reset() { TIFR3 = 1 << OCF3A; } // ----- COMPARE B: timer interrupt flag register (TIFR), output comare match flag (OCF) default async event void CompareB.fired() { } AVR_ATOMIC_HANDLER(TIMER3_COMPB_vect) { signal CompareB.fired(); } async command bool CompareB.test() { return TIFR3 & (1 << OCF3B); } async command void CompareB.reset() { TIFR3 = 1 << OCF3B; } // ----- COMPARE C: timer interrupt flag register (TIFR), output comare match flag (OCF) default async event void CompareC.fired() { } AVR_ATOMIC_HANDLER(TIMER3_COMPC_vect) { signal CompareC.fired(); } async command bool CompareC.test() { return TIFR3 & (1 << OCF3C); } async command void CompareC.reset() { TIFR3 = 1 << OCF3C; } // ----- COMPARE A: timer interrupt mask register (TIMSK), output compare interrupt enable (OCIE) async command void CompareA.start() { SET_BIT(TIMSK3, OCIE3A); call McuPowerState.update(); } async command void CompareA.stop() { CLR_BIT(TIMSK3, OCIE3A); call McuPowerState.update(); } async command bool CompareA.isOn() { return TIMSK3 & (1 << OCIE3A); } // ----- COMPARE B: timer interrupt mask register (TIMSK), output compare interrupt enable (OCIE) async command void CompareB.start() { SET_BIT(TIMSK3, OCIE3B); call McuPowerState.update(); } async command void CompareB.stop() { CLR_BIT(TIMSK3, OCIE3B); call McuPowerState.update(); } async command bool CompareB.isOn() { return TIMSK3 & (1 << OCIE3B); } // ----- COMPARE C: timer interrupt mask register (TIMSK), output compare interrupt enable (OCIE) async command void CompareC.start() { SET_BIT(TIMSK3, OCIE3C); call McuPowerState.update(); } async command void CompareC.stop() { CLR_BIT(TIMSK3, OCIE3C); call McuPowerState.update(); } async command bool CompareC.isOn() { return TIMSK3 & (1 << OCIE3C); } // ----- COMPARE A: timer control register (TCCR), compare output mode (COM) async command void CompareA.setMode(uint8_t mode) { atomic { TCCR3A = (TCCR3A & ~(0x3 << COM3A0)) | (mode & 0x3) << COM3A0; } } async command uint8_t CompareA.getMode() { return (TCCR3A >> COM3A0) & 0x3; } // ----- COMPARE B: timer control register (TCCR), compare output mode (COM) async command void CompareB.setMode(uint8_t mode) { atomic { TCCR3B = (TCCR3B & ~(0x3 << COM3B0)) | (mode & 0x3) << COM3B0; } } async command uint8_t CompareB.getMode() { return (TCCR3B >> COM3B0) & 0x3; } // ----- COMPARE C: timer control register (TCCR), compare output mode (COM) async command void CompareC.setMode(uint8_t mode) { atomic { TCCR3C = (TCCR3C & ~(0x3 << COM3C0)) | (mode & 0x3) << COM3C0; } } async command uint8_t CompareC.getMode() { return (TCCR3C >> COM3C0) & 0x3; } // ----- COMPARE A: timer control register (TCCR), force output compare (FOC) async command void CompareA.force() { SET_BIT(TCCR3C, FOC3A); } // ----- COMPARE B: timer control register (TCCR), force output compare (FOC) async command void CompareB.force() { SET_BIT(TCCR3C, FOC3B); } // ----- COMPARE C: timer control register (TCCR), force output compare (FOC) async command void CompareC.force() { SET_BIT(TCCR3C, FOC3C); } // ----- CAPTURE: input capture register (ICR) async command uint16_t Capture.get() { atomic return ICR3; } async command void Capture.set(uint16_t value) { atomic ICR3 = value; } // ----- CAPTURE: timer interrupt flag register (TIFR), input capture flag (ICF) default async event void Capture.fired() { } AVR_ATOMIC_HANDLER(TIMER3_CAPT_vect) { signal Capture.fired(); } async command bool Capture.test() { return TIFR3 & (1 << ICF3); } async command void Capture.reset() { TIFR3 = 1 << ICF3; } // ----- CAPTURE: timer interrupt mask register (TIMSK), input capture interrupt enable (ICIE) async command void Capture.start() { SET_BIT(TIMSK3, ICIE3); call McuPowerState.update(); } async command void Capture.stop() { CLR_BIT(TIMSK3, ICIE3); call McuPowerState.update(); } async command bool Capture.isOn() { return TIMSK3 & (1 << ICIE3); } // ----- CAPTURE: timer control register (TCCR), input capture mode (COM) async command void Capture.setMode(uint8_t mode) { atomic { TCCR3B = (TCCR3B & ~(0x3 << ICES3)) | (mode & 0x3) << ICES3; } } async command uint8_t Capture.getMode() { return (TCCR3B >> ICES3) & 0x3; } // ----- MCUPOWER async command mcu_power_t McuPowerOverride.lowestState() { // if we need to wake up by this clock if( TIMSK3 & (1 << OCIE3A | 1 << OCIE3B | 1 << OCIE3C | 1 << ICIE3) ) return ATM128_POWER_IDLE; else return ATM128_POWER_DOWN; } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/HplAtmRfa1TimerMacC.nc000066400000000000000000000043131207233610700245510ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "HplAtmRfa1Timer.h" configuration HplAtmRfa1TimerMacC { provides { interface AtmegaCounter as Counter; interface AtmegaCompare as Compare[uint8_t id]; interface AtmegaCapture as SfdCapture; } } implementation { components HplAtmRfa1TimerMacP; Counter = HplAtmRfa1TimerMacP; Compare[0] = HplAtmRfa1TimerMacP.CompareA; Compare[1] = HplAtmRfa1TimerMacP.CompareB; Compare[2] = HplAtmRfa1TimerMacP.CompareC; SfdCapture = HplAtmRfa1TimerMacP.SfdCapture; components McuSleepC; HplAtmRfa1TimerMacP.McuPowerState -> McuSleepC; HplAtmRfa1TimerMacP.McuPowerOverride <- McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/HplAtmRfa1TimerMacP.nc000066400000000000000000000231671207233610700245760ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "HplAtmRfa1Timer.h" module HplAtmRfa1TimerMacP @safe() { provides { interface AtmegaCounter as Counter; interface AtmegaCompare as CompareA; interface AtmegaCompare as CompareB; interface AtmegaCompare as CompareC; interface AtmegaCapture as SfdCapture; interface McuPowerOverride; } uses { interface McuPowerState; } } implementation { typedef union reg32_t { uint32_t full; struct { uint8_t ll; uint8_t lh; uint8_t hl; uint8_t hh; }; } reg32_t; // ----- COUNTER: symbol counter register (SCCNT) async command uint32_t Counter.get() { reg32_t time; atomic { time.ll = SCCNTLL; time.lh = SCCNTLH; time.hl = SCCNTHL; time.hh = SCCNTHH; } return time.full; } async command void Counter.set(uint32_t value) { reg32_t time; time.full = value; atomic { SCCNTHH = time.hh; SCCNTHL = time.hl; SCCNTLH = time.lh; SCCNTLL = time.ll; } while( SCSR & (1 << SCBSY) ) ; } // ----- COUNTER: symbol counter interrupt status register (SCIRQS), overflow flag (IRQSOF) default async event void Counter.overflow() { } AVR_ATOMIC_HANDLER(SCNT_OVFL_vect) { signal Counter.overflow(); } async command bool Counter.test() { return SCIRQS & (1 << IRQSOF); } async command void Counter.reset() { SCIRQS = 1 << IRQSOF; } // ----- COUNTER: symbol counter interrupt mask register (SCIRQM), overflow interrupt enable (IRQMOF) async command void Counter.start() { SET_BIT(SCIRQM, IRQMOF); } async command void Counter.stop() { CLR_BIT(SCIRQM, IRQMOF); } async command bool Counter.isOn() { return SCIRQM & (1 << IRQMOF); } // ----- COUNTER: symbol counter control register (SCCR), counter enable (SCEN) and clock select (SCCKSEL) async command void Counter.setMode(uint8_t mode) { mode &= (1 << SCEN) | (1 << SCCKSEL); // RTC needs to be enabled, otherwise it does not work if( (mode & (1 << SCCKSEL)) != 0 ) ASSR = 1 << AS2; atomic SCCR0 = (SCCR0 & ~((1 << SCEN) | (1 << SCCKSEL))) | mode; call McuPowerState.update(); } async command uint8_t Counter.getMode() { return SCCR0 & ((1 << SCEN) | (1 << SCCKSEL)); } // ----- COMPARE A: symbol counter output compare register (SCOCR) async command uint32_t CompareA.get() { reg32_t time; atomic { time.ll = SCOCR1LL; time.lh = SCOCR1LH; time.hl = SCOCR1HL; time.hh = SCOCR1HH; } return time.full; } async command void CompareA.set(uint32_t value) { reg32_t time; time.full = value; atomic { SCOCR1HH = time.hh; SCOCR1HL = time.hl; SCOCR1LH = time.lh; SCOCR1LL = time.ll; } } // ----- COMPARE A: symbol counter interrupt status register (SCIRQS), comare match flag (IRQSCP) default async event void CompareA.fired() { } AVR_ATOMIC_HANDLER(SCNT_CMP1_vect) { signal CompareA.fired(); } async command bool CompareA.test() { return SCIRQS & (1 << IRQSCP1); } async command void CompareA.reset() { SCIRQS = 1 << IRQSCP1; } // ----- COMPARE A: symbol counter interrupt mask register (SCIRQM), compare interrupt enable (IRQMCP) async command void CompareA.start() { SET_BIT(SCIRQM, IRQMCP1); call McuPowerState.update(); } async command void CompareA.stop() { CLR_BIT(SCIRQM, IRQMCP1); call McuPowerState.update(); } async command bool CompareA.isOn() { return SCIRQM & (1 << IRQMCP1); } // ----- COMPARE A: symbol counter control register (SCCR), compare mode (SCCMP) async command void CompareA.setMode(uint8_t mode) { atomic { SCCR0 = (SCCR0 & ~(1 << SCCMP1)) | (mode & 0x1) << SCCMP1; } } async command uint8_t CompareA.getMode() { return (SCCR0 >> SCCMP1) & 0x1; } // ----- COMPARE A: ignore force for the symbol counter async command void CompareA.force() { } // ----- COMPARE B: symbol counter output compare register (SCOCR) async command uint32_t CompareB.get() { reg32_t time; atomic { time.ll = SCOCR2LL; time.lh = SCOCR2LH; time.hl = SCOCR2HL; time.hh = SCOCR2HH; } return time.full; } async command void CompareB.set(uint32_t value) { reg32_t time; time.full = value; atomic { SCOCR2HH = time.hh; SCOCR2HL = time.hl; SCOCR2LH = time.lh; SCOCR2LL = time.ll; } } // ----- COMPARE B: symbol counter interrupt status register (SCIRQS), comare match flag (IRQSCP) default async event void CompareB.fired() { } AVR_ATOMIC_HANDLER(SCNT_CMP2_vect) { signal CompareB.fired(); } async command bool CompareB.test() { return SCIRQS & (1 << IRQSCP2); } async command void CompareB.reset() { SCIRQS = 1 << IRQSCP2; } // ----- COMPARE B: symbol counter interrupt mask register (SCIRQM), compare interrupt enable (IRQMCP) async command void CompareB.start() { SET_BIT(SCIRQM, IRQMCP2); call McuPowerState.update(); } async command void CompareB.stop() { CLR_BIT(SCIRQM, IRQMCP2); call McuPowerState.update(); } async command bool CompareB.isOn() { return SCIRQM & (1 << IRQMCP2); } // ----- COMPARE B: symbol counter control register (SCCR), compare mode (SCCMP) async command void CompareB.setMode(uint8_t mode) { atomic { SCCR0 = (SCCR0 & ~(1 << SCCMP2)) | (mode & 0x1) << SCCMP2; } } async command uint8_t CompareB.getMode() { return (SCCR0 >> SCCMP2) & 0x1; } // ----- COMPARE B: ignore force for the symbol counter async command void CompareB.force() { } // ----- COMPARE C: symbol counter output compare register (SCOCR) async command uint32_t CompareC.get() { reg32_t time; atomic { time.ll = SCOCR3LL; time.lh = SCOCR3LH; time.hl = SCOCR3HL; time.hh = SCOCR3HH; } return time.full; } async command void CompareC.set(uint32_t value) { reg32_t time; time.full = value; atomic { SCOCR3HH = time.hh; SCOCR3HL = time.hl; SCOCR3LH = time.lh; SCOCR3LL = time.ll; } } // ----- COMPARE C: symbol counter interrupt status register (SCIRQS), comare match flag (IRQSCP) default async event void CompareC.fired() { } AVR_ATOMIC_HANDLER(SCNT_CMP3_vect) { signal CompareC.fired(); } async command bool CompareC.test() { return SCIRQS & (1 << IRQSCP3); } async command void CompareC.reset() { SCIRQS = 1 << IRQSCP3; } // ----- COMPARE C: symbol counter interrupt mask register (SCIRQM), compare interrupt enable (IRQMCP) async command void CompareC.start() { SET_BIT(SCIRQM, IRQMCP3); call McuPowerState.update(); } async command void CompareC.stop() { CLR_BIT(SCIRQM, IRQMCP3); call McuPowerState.update(); } async command bool CompareC.isOn() { return SCIRQM & (1 << IRQMCP3); } // ----- COMPARE C: symbol counter control register (SCCR), compare mode (SCCMP) async command void CompareC.setMode(uint8_t mode) { atomic { SCCR0 = (SCCR0 & ~(1 << SCCMP3)) | (mode & 0x1) << SCCMP3; } } async command uint8_t CompareC.getMode() { return (SCCR0 >> SCCMP3) & 0x1; } // ----- COMPARE C: ignore force for the symbol counter async command void CompareC.force() { } // ----- SFD CAPTURE: symbol counter time stamp register (SCTSR) async command uint32_t SfdCapture.get() { reg32_t time; atomic { time.ll = SCTSRLL; time.lh = SCTSRLH; time.hl = SCTSRHL; time.hh = SCTSRHH; } return time.full; } async command void SfdCapture.set(uint32_t value) { // SCTSR is read only } // ----- SFD CAPTURE: has no interrupt (use RX_START instead) async command bool SfdCapture.test() { return FALSE; } async command void SfdCapture.reset() { } async command void SfdCapture.start() { } async command void SfdCapture.stop() { } async command bool SfdCapture.isOn() { return FALSE; } // ----- SFD CAPTURE: symbol counter control register (SCCR), timestamping enable (SCTES) async command void SfdCapture.setMode(uint8_t mode) { atomic { SCCR0 = (SCCR0 & ~(1 << SCTSE)) | (mode & 0x1) << SCTSE; } } async command uint8_t SfdCapture.getMode() { return (SCCR0 >> SCTSE) & 0x1; } // ----- MCUPOWER async command mcu_power_t McuPowerOverride.lowestState() { // TODO: check out why ATM128_POWER_DOWN does not work if( SCCR0 & (1 << SCEN) ) return ATM128_POWER_SAVE; else return ATM128_POWER_DOWN; } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/LocalTime62khzC.nc000066400000000000000000000035431207233610700237720ustar00rootroot00000000000000/* * Copyright (c) 2010, ETH Zurich * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Philipp Sommer */ #include "TimerConfig.h" configuration LocalTime62khzC { provides interface LocalTime; } implementation { components Counter62khz32C; components new CounterToLocalTimeC(T62khz); CounterToLocalTimeC.Counter -> Counter62khz32C; LocalTime = CounterToLocalTimeC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/LocalTimeMcuC.nc000066400000000000000000000035371207233610700235550ustar00rootroot00000000000000/* * Copyright (c) 2008, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" configuration LocalTimeMcuC { provides interface LocalTime; } implementation { components CounterMcu32C; components new CounterToLocalTimeC(TMcu); CounterToLocalTimeC.Counter -> CounterMcu32C; LocalTime = CounterToLocalTimeC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/LocalTimeMicroC.nc000066400000000000000000000035431207233610700240770ustar00rootroot00000000000000/* * Copyright (c) 2008, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "Timer.h" configuration LocalTimeMicroC { provides interface LocalTime; } implementation { components CounterMicro32C; components new CounterToLocalTimeC(TMicro); CounterToLocalTimeC.Counter -> CounterMicro32C; LocalTime = CounterToLocalTimeC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/LocalTimeMilliC.nc000066400000000000000000000035351207233610700240750ustar00rootroot00000000000000/* * Copyright (c) 2010, ETH Zurich * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Philipp Sommer */ #include "Timer.h" configuration LocalTimeMilliC { provides interface LocalTime; } implementation { components CounterMilli32C; components new CounterToLocalTimeC(TMilli); CounterToLocalTimeC.Counter -> CounterMilli32C; LocalTime = CounterToLocalTimeC; } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/MeasureClockC.nc000066400000000000000000000121241207233610700236040ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include /** * Measure cpu clock frequency at boot time. Provides an Atm128Calibrate * interface so that other components can adjust their calibration as * needed. * * @author David Gay * @author Janos Sallai */ module MeasureClockC { provides { /** * This code MUST be called from PlatformP only, hence the exactlyonce. */ interface Init @exactlyonce(); interface Atm128Calibrate; } } implementation { /** * The number of MCU cycles per 64/32768 = 1/512 seconds. This value * fits into 16-bits up to 32 MHz. */ uint16_t cycles; command error_t Init.init() { /* This code doesn't use the HPL to avoid timing issues when compiling with debugging on */ atomic { uint8_t wraps_ok=0; uint8_t wraps=255; // max 255 wrap = 2 sec uint16_t now; uint16_t prev_cycles_min=0xffff; uint16_t prev_cycles_max=0; /* Setup timer2 to at 32768 Hz, and timer1 cpu cycles */ TCCR1B = 1 << CS10; ASSR = 1 << AS2; TCCR2B = 1 << CS20; // one wrap is 256/32768 = 1/128 sec while( wraps_ok < 50 && --wraps != 0 ) { while( TCNT2 != 0 ) ; now = TCNT1; while( TCNT2 != 64 ) // wait 64/32768 = 1/512 sec ; cycles = TCNT1 - now; if(prev_cycles_mincycles) prev_cycles_max=cycles; if(prev_cycles_max-prev_cycles_min<=1){ wraps_ok++; } else{ wraps_ok=0; prev_cycles_min=0xffff; prev_cycles_max=0; } } /* Reset to boot state */ ASSR = TCCR1B = TCCR2B = 0; while (ASSR & (1 << TCR2AUB | 1 << TCR2BUB)) ; } return SUCCESS; } /** * Returns the number of MCU cycles per 1/32768 seconds. */ async command uint16_t Atm128Calibrate.cyclesPerJiffy() { return cycles >> 6; } /** * This is expected number of cycles per 64 jiffy at the platform's * specified MHz. Assumes PLATFORM_MHZ == 1, 2, 4, 8 or 16. */ enum { MAGIC = 31250 / (16 / PLATFORM_MHZ) }; async command uint32_t Atm128Calibrate.calibrateMicro(uint32_t n) { return scale32(n , cycles, MAGIC); } async command uint32_t Atm128Calibrate.actualMicro(uint32_t n) { return scale32(n, MAGIC, cycles); } /** * This is also log2(cycles/64*3.05). But that's a pain to compute */ async command uint8_t Atm128Calibrate.adcPrescaler() { if (cycles >= 24960) return ATM128_ADC_PRESCALE_128; if (cycles >= 12480) return ATM128_ADC_PRESCALE_64; if (cycles >= 6208) return ATM128_ADC_PRESCALE_32; if (cycles >= 3072) return ATM128_ADC_PRESCALE_16; if (cycles >= 1536) return ATM128_ADC_PRESCALE_8; if (cycles >= 768) return ATM128_ADC_PRESCALE_4; return ATM128_ADC_PRESCALE_2; } /** * The baudrate must be a multiple of 64 (this holds for all commonly * used baud rates starting from 4800). The actual formula is * * reg = (cycles * 512) / (8 * baudrate) - 1 */ async command uint16_t Atm128Calibrate.baudrateRegister(uint32_t baudrate) { return cycles / (baudrate >> 6) - 1; } } tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/README000066400000000000000000000026321207233610700214650ustar00rootroot00000000000000This directory contains two types of files: the RFA1 microcontroller specific HplAtmRfa1* and TimerConfig.h files, and everything else which is built on top of these and could support other microcontrollers in the ATmega family. The HplAtmRfa1* files provides very basic access to the various timers and handle power management. The TimerConfig.h file configures the rest of the system. We build two separate timers on top of the HPL layer: the TMcu timer from which we derive all TMicro timers and alarms. The TMcu timer is built on top of one of the 16-bit hardware timer. This timer stops counting if the microcontroller is in one of the power save modes. However, if one of the alarms is set (or a capture is enabled), then this prevents the mcu to stop. Note, that depending on the clock frequency of the MCU the TMcu timer can run with any frequency between 1 and 16 MHz. The other timer is the real time clock, which is derived from the 8-bit 32 KHz async timer/counter. You can set various prescale settings here, so the TRtc can run at 1 KHz, 4 KHz or 32 KHz. All TMilli timers and alarms are derived from this. The RFA1 has a symbol counter also driven by the external 32 KHz crystal, but it runs at 62.5 KHz. This is independent of the RTC clock, and in fact it is much more efficient than the 8-bit 32 KHz timer. You can select in TimerConfig.h to use this for the TRtc (and TMilli). tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/TimerConfig.h000066400000000000000000000076631207233610700231750ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __TIMERCONFIG_H__ #define __TIMERCONFIG_H__ #include "HplAtmRfa1Timer.h" #include "hardware.h" #include "Timer.h" // ------ MCU platform clock ------ #ifndef PLATFORM_MHZ #define PLATFORM_MHZ 16 #endif #if PLATFORM_MHZ == 16 #define PLATFORM_MHZ_LOG2 4 #elif PLATFORM_MHZ == 8 #define PLATFORM_MHZ_LOG2 3 #elif PLATFORM_MHZ == 4 #define PLATFORM_MHZ_LOG2 2 #elif PLATFORM_MHZ == 2 #define PLATFORM_MHZ_LOG2 1 #elif PLATFORM_MHZ == 1 #define PLATFORM_MHZ_LOG2 0 #else #error "PLATFORM_MHZ must be 1, 2, 4, 8 or 16" #endif // ------ MCU timer parameters ------ #define MCU_TIMER_MODE (ATMRFA1_CLK16_DIVIDE_8 | ATMRFA1_WGM16_NORMAL) #define MCU_TIMER_MHZ_LOG2 (PLATFORM_MHZ_LOG2-3) #define MCU_TIMER_MHZ (1 << MCU_TIMER_MHZ_LOG2) #define MCU_TIMER_HZ (16000000ul / 16 * (1 << MCU_TIMER_MHZ_LOG2)) typedef struct T16mhz { } T16mhz; typedef struct T8mhz { } T8mhz; typedef struct T4mhz { } T4mhz; typedef struct T2mhz { } T2mhz; #if MCU_TIMER_MHZ_LOG2 == 4 typedef T16mhz TMcu; #elif MCU_TIMER_MHZ_LOG2 == 3 typedef T8mhz TMcu; #elif MCU_TIMER_MHZ_LOG2 == 2 typedef T4mhz TMcu; #elif MCU_TIMER_MHZ_LOG2 == 1 typedef T2mhz TMcu; #elif MCU_TIMER_MHZ_LOG2 == 0 typedef TMicro TMcu; #else #error "MCU clock must run at at least 1 MHz" #endif // selects which 16-bit TimerCounter should be used (1 or 3) #define MCU_TIMER_NO 1 #define MCU_ALARM_MINDT 100 #define UQ_MCU_ALARM "UQ_MCU_ALARM" // ------ RTC timer parameters ------ #define RTC_TIMER_KHZ_LOG2 5 #if RTC_TIMER_KHZ_LOG2 == 5 typedef T32khz TRtc; #define RTC_TIMER_MODE (ATMRFA1_CLK8_NORMAL | ATMRFA1_WGM8_NORMAL | ATMRFA1_ASYNC_ON) #elif RTC_TIMER_KHZ_LOG2 == 2 typedef struct T4khz { } T4khz; typedef T4khz TRtc; #define RTC_TIMER_MODE (ATMRFA1_CLK8_DIVIDE_8 | ATMRFA1_WGM8_NORMAL | ATMRFA1_ASYNC_ON) #elif RTC_TIMER_KHZ_LOG2 == 0 typedef TMilli TRtc; #define RTC_TIMER_MODE (ATMRFA1_CLK8_DIVIDE_32 | ATMRFA1_WGM8_NORMAL | ATMRFA1_ASYNC_ON) #else #error "The RTC must be run at 32 KHz, 4 KHz or 1 KHz." #endif #define RTC_TIMER_KHZ (1 << RTC_TIMER_KHZ_LOG2) #define RTC_TIMER_HZ (32768ul / 32 * (1 << RTC_TIMER_KHZ_LOG2)) #define RTC_ALARM_MINDT 4 #define UQ_RTC_ALARM "UQ_RTC_ALARM" // ------ Symbol counter patarmeters ------ typedef struct T62khz { } T62khz; #define UQ_T62KHZ_ALARM "T62KHZ_ALARM" #define SYM_TIMER_MODE ATMRFA1_CLKSC_RTC #define SYM_ALARM_MINDT 2 #endif//__TIMERCONFIG_H__ tinyos-2.1.2+dfsg/tos/chips/atm128rfa1/timer/TimerMilliP.nc000066400000000000000000000037521207233610700233220ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "TimerConfig.h" configuration TimerMilliP { provides { interface Timer as TimerMilli[uint8_t id]; } } implementation { components new AlarmMilli32C(); components new AlarmToTimerC(TMilli); AlarmToTimerC.Alarm -> AlarmMilli32C; components new VirtualizeTimerC(TMilli, uniqueCount(UQ_TIMER_MILLI)); TimerMilli = VirtualizeTimerC; VirtualizeTimerC.TimerFrom -> AlarmToTimerC; } tinyos-2.1.2+dfsg/tos/chips/bh1750fvi/000077500000000000000000000000001207233610700173075ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/bh1750fvi/Bh1750fvi.h000066400000000000000000000033011207233610700210300ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #ifndef BH1750FVI_H #define BH1750FVI_H #define UQ_BH1750FVI_RESOURCE "Bh1750fviPressure.ReadResource" #endif tinyos-2.1.2+dfsg/tos/chips/bh1750fvi/Bh1750fviArbitratedC.nc000066400000000000000000000037631207233610700233220ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "Bh1750fvi.h" configuration Bh1750fviArbitratedC { provides interface Read[uint8_t client]; } implementation { components Bh1750fviC; components new ArbitratedReadC(uint16_t), new FcfsArbiterC(UQ_BH1750FVI_RESOURCE) as Arbiter, new ReadClientP(uint16_t); Read=ArbitratedReadC.Read; ArbitratedReadC.Resource->Arbiter; ArbitratedReadC.Service->ReadClientP; ReadClientP.ActualRead->Bh1750fviC; }tinyos-2.1.2+dfsg/tos/chips/bh1750fvi/Bh1750fviC.nc000066400000000000000000000037161207233610700213160ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo, Andras Biro */ configuration Bh1750fviC { provides interface Read as Light; } implementation { components Bh1750fviP; components new TimerMilliC(); Light = Bh1750fviP.Light; Bh1750fviP.Timer -> TimerMilliC; components HplBh1750C, MainC; Bh1750fviP.Init <- MainC.SoftwareInit; Bh1750fviP.I2CPacket -> HplBh1750C; Bh1750fviP.I2CResource -> HplBh1750C; Bh1750fviP.BusPowerManager -> HplBh1750C; } tinyos-2.1.2+dfsg/tos/chips/bh1750fvi/Bh1750fviP.nc000066400000000000000000000111331207233610700213230ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo, Andras Biro */ module Bh1750fviP { provides interface Read as Light; uses interface I2CPacket; uses interface Timer; uses interface Resource as I2CResource; uses interface BusPowerManager; provides interface Init; } implementation { enum { BH1750FVI_POWER_DOWN = 0x00, BH1750FVI_POWER_ON = 0x01, BH1750FVI_RESET = 0x07, BH1750FVI_CONT_H_RES = 0x10, BH1750FVI_CONT_H2_RES = 0x11, BH1750FVI_CONT_L_RES = 0x13, BH1750FVI_ONE_SHOT_H_RES = 0x20, BH1750FVI_ONE_SHOT_H2_RES = 0x21, BH1750FVI_ONE_SHOT_L_RES = 0x23, } bh1750fviCommand; enum { BH1750FVI_TIMEOUT_H_RES = 180, // max 180 BH1750FVI_TIMEOUT_H2_RES= 180, // max 180 BH1750FVI_TIMEOUT_L_RES = 24, // max 24 BH1750FVI_TIMEOUT_BOOT = 11, } bh1750fviTimeout; enum { BH1750FVI_ADDRESS = 0x23,//0x46/0x47, //if addr== H then it would be 0xb8/0xb9 } bh1750fviHeader; uint8_t i2cBuffer[2]; norace error_t lastError; enum { S_OFF = 0, S_IDLE, S_BUSY_CMD, S_BUSY_MEAS, }; uint8_t state = S_OFF; command error_t Init.init(){ call BusPowerManager.configure(BH1750FVI_TIMEOUT_BOOT,BH1750FVI_TIMEOUT_BOOT); return SUCCESS; } command error_t Light.read() { uint8_t prevState=state; if(state == S_BUSY_MEAS || state == S_BUSY_CMD) return EBUSY; state = S_BUSY_CMD; call BusPowerManager.requestPower(); if(prevState == S_IDLE) call I2CResource.request(); return SUCCESS; } event void BusPowerManager.powerOn(){ if(state == S_BUSY_CMD) call I2CResource.request(); else state = S_IDLE; } task void signalReadDone() { state= S_IDLE; call BusPowerManager.releasePower(); signal Light.readDone(lastError, ((i2cBuffer[0]<<8) | i2cBuffer[1]) ); } event void I2CResource.granted() { if(state == S_BUSY_CMD){ i2cBuffer[0]=BH1750FVI_ONE_SHOT_H_RES; lastError = call I2CPacket.write(I2C_START | I2C_STOP, BH1750FVI_ADDRESS, 1, i2cBuffer); } else { lastError=call I2CPacket.read(I2C_START | I2C_STOP, BH1750FVI_ADDRESS, 2, i2cBuffer); } if(lastError!=SUCCESS){ call I2CResource.release(); post signalReadDone(); } } task void startTimeout() { state=S_BUSY_MEAS; call Timer.startOneShot(BH1750FVI_TIMEOUT_H_RES); } async event void I2CPacket.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { call I2CResource.release(); if(error != SUCCESS) { lastError = error; post signalReadDone(); } else { post startTimeout(); } } event void Timer.fired() { call I2CResource.request(); } async event void I2CPacket.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { lastError = error; call I2CResource.release(); post signalReadDone(); } event void BusPowerManager.powerOff(){ state=S_OFF; } default event void Light.readDone(error_t error, uint16_t val) { } } tinyos-2.1.2+dfsg/tos/chips/bh1750fvi/Bh1750fviRawLightC.nc000066400000000000000000000034071207233610700227550ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "Bh1750fvi.h" generic configuration Bh1750fviRawLightC() { provides interface Read; } implementation { components Bh1750fviArbitratedC; Read=Bh1750fviArbitratedC.Read[unique(UQ_BH1750FVI_RESOURCE)]; }tinyos-2.1.2+dfsg/tos/chips/bma180/000077500000000000000000000000001207233610700166645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/bma180/Bma180.h000066400000000000000000000054401207233610700177700ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ #ifndef BMA180_H #define BMA180_H typedef struct bma180_data { int16_t bma180_accel_x; int16_t bma180_accel_y; int16_t bma180_accel_z; int8_t bma180_temperature; uint8_t bma180_short_timestamp; } bma180_data_t; enum { BMA_SAMPLING_TIME_MS = 64, }; /* 0: low noise, higest current, full bandwidth(1200Hz) 1: super low noise, highest current, reduced bandwidth (300Hz) 2: ultra low noise, smaller current, reduced bandwidth (150Hz) 3: Low power mode, lowest current, higher noise than other modes */ enum { BMA_MODE = 3, }; /* 0: 1g 1: 1.5g 2: 2g 3: 3g 4: 4g 5: 8g 6: 16g 7: NA */ enum { BMA_RANGE = 2, }; //helper array for retrieving data in milli g according to actual range selection const double convRatio[7] = { .13f, .19f, .25f, .38f, .5f, .99f, 1.98f}; /* 0: 10Hz 1: 20Hz 2: 40Hz 3: 75Hz 4:150Hz 5:300Hz 7:600Hz 7:1200Hz 8: High pass 1Hz 9: band pass 0.2 .. 300Hz 10 .. 15: NA */ enum { BMA_BW = 4, }; enum { BMA_LAT_INT = 0, BMA_NEW_DATA_INT, BMA_ADV_INT, BMA_TAPSENS_INT, BMA_LOW_INT, BMA_HIGH_INT, BMA_SLOPE_INT, BMA_SLOPE_ALART, }; enum { BMA_CTRL_REG3 = (1<; interface ReadStream; interface StdControl as BmaControl; interface Init; } } implementation { components BmaReadC, BmaStreamC, PlatformC, DiagMsgC; Read = BmaReadC; ReadStream = BmaStreamC; BmaControl = BmaReadC; Init = BmaReadC; //BmaStreamP.Read -> TestSbSC; //BmaStreamP.Atm128Calibrate -> PlatformC; //BmaStreamP.DiagMsg -> DiagMsgC; } tinyos-2.1.2+dfsg/tos/chips/bma180/BmaReadC.nc000066400000000000000000000042641207233610700206120ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ #include "Bma180.h" configuration BmaReadC { provides { interface StdControl; interface Read; interface Init; } } implementation { components BmaReadP, LedsC, new TimerMilliC(), HplBma180C, DiagMsgC, SerialActiveMessageC, Atm128rfa1Usart0SpiC, LocalTimeMilliC; StdControl = BmaReadP.BmaControl; Read = BmaReadP; Init = BmaReadP; BmaReadP.Leds -> LedsC; BmaReadP.Timer -> TimerMilliC; BmaReadP.LocalTime -> LocalTimeMilliC; BmaReadP.DiagMsg -> DiagMsgC; BmaReadP.FastSpiByte -> HplBma180C; BmaReadP.Resource -> HplBma180C; BmaReadP.CSN -> HplBma180C.CSN; BmaReadP.PWR -> HplBma180C.PWR; } tinyos-2.1.2+dfsg/tos/chips/bma180/BmaReadP.nc000066400000000000000000000134531207233610700206270ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ #include "Bma180.h" module BmaReadP { provides { interface Read; interface StdControl as BmaControl; interface Init; } uses { interface Leds; interface Timer; interface LocalTime; interface DiagMsg; interface FastSpiByte; interface Resource; interface GeneralIO as CSN; interface GeneralIO as PWR; } } implementation { enum{ S_OFF = 0, S_STARTING, S_CONFIG, S_RESTART, S_IDLE, }; bma180_data_t s_res; uint16_t x,y,z; norace uint8_t temp, state=S_OFF; void writeRegister(uint8_t, uint8_t); uint8_t readRegister(uint8_t); command error_t Init.init() { call CSN.set(); call CSN.makeOutput(); return SUCCESS; } command error_t BmaControl.start() { if(state == S_STARTING) return EBUSY; if(state != S_OFF) return EALREADY; state = S_STARTING; call PWR.makeOutput(); call PWR.set(); state = S_CONFIG; return SUCCESS; } command error_t BmaControl.stop() { call PWR.makeOutput(); call PWR.clr(); return SUCCESS; } void setLeds(uint8_t data) { if( (data & 0x01) != 0 ) call Leds.led0On(); else call Leds.led0Off(); if( (data & 0x02) != 0 ) call Leds.led1On(); else call Leds.led1Off(); if( (data & 0x04) != 0 ) call Leds.led2On(); else call Leds.led2Off(); } command error_t Read.read() { call Resource.request(); return SUCCESS; } uint8_t readRegister(uint8_t address) { uint8_t ret; call CSN.clr(); call FastSpiByte.write(0x80 | address); ret = call FastSpiByte.write(0); call CSN.set(); return ret; } void writeRegister(uint8_t address, uint8_t newValue) { call CSN.clr(); call FastSpiByte.write(0x7F & address); call FastSpiByte.write(newValue); call CSN.set(); } void setup_params(){ temp = readRegister(0xD); //ctrl_reg0 temp |= 0x10; // enable ee_w; needed for writing to addresses 0x20 .. 0x3B writeRegister(0xD, temp); temp = readRegister(0x35); //offset_lsb1 temp &= 0xF1; // clear range bits temp |= (BMA_RANGE<<1); writeRegister(0x35, temp); temp = readRegister(0x30); //tco_z temp &= 0xFC; // clear mode bits temp |= BMA_MODE; writeRegister(0x30, temp); temp = readRegister(0x20); // bw_tcs temp &= 0x0F; temp |= (BMA_BW<<4); writeRegister(0x20, temp); temp = readRegister(0x21); //ctrl_reg3 temp = BMA_CTRL_REG3; writeRegister(0x21, temp); } event void Timer.fired() { if(state==S_CONFIG){ setup_params(); temp = readRegister(0xD); //ctrl_reg0 temp &= 0x02; temp |= (1<<1); //sleep control; 1:enable sleep writeRegister(0xD, temp); state = S_IDLE; call Timer.startOneShot(1); } else if(state == S_RESTART) { setup_params(); state = S_IDLE; call Timer.startOneShot(10); } else if(state == S_IDLE) { call Leds.led3Toggle(); //check if the sensor is in sleep mode temp = readRegister(0xD); temp &= 0x02; //if so, then wake it up if(temp){ temp &=~ (1<<1); //sleep control; 1:enable sleep writeRegister(0xD, temp); state = S_RESTART; return call Timer.startOneShot(10); } //chipSelect call CSN.clr(); // read registers call FastSpiByte.write(0x80 | 0x02); x = call FastSpiByte.write(0x00);//x x |= (call FastSpiByte.write(0) << 8); y = call FastSpiByte.write(0);//y y |= (call FastSpiByte.write(0) << 8); z = call FastSpiByte.write(0);//z z |= (call FastSpiByte.write(0) << 8); s_res.bma180_temperature = (int8_t)(call FastSpiByte.write(0)); s_res.bma180_short_timestamp = (uint8_t)(call LocalTime.get()); //chipDeselect call CSN.set(); s_res.bma180_accel_x = ( ((int16_t)x)>>2)*convRatio[BMA_RANGE]; s_res.bma180_accel_y = ( ((int16_t)y)>>2)*convRatio[BMA_RANGE]; s_res.bma180_accel_z = ( ((int16_t)z)>>2)*convRatio[BMA_RANGE]; call Resource.release(); signal Read.readDone(SUCCESS, s_res); //setLeds(x); } } event void Resource.granted() { call Timer.startOneShot(BMA_SAMPLING_TIME_MS); } } tinyos-2.1.2+dfsg/tos/chips/bma180/BmaStreamC.nc000066400000000000000000000041151207233610700211650ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ configuration BmaStreamC { provides { interface ReadStream; interface Init; } } implementation { components BmaStreamP, HplBma180C, LocalTimeMilliC, LedsC; Init = BmaStreamP; ReadStream = BmaStreamP; BmaStreamP.Resource -> HplBma180C; BmaStreamP.FastSpiByte -> HplBma180C; BmaStreamP.Leds -> LedsC; BmaStreamP.LocalTime -> LocalTimeMilliC; BmaStreamP.CSN -> HplBma180C.CSN; BmaStreamP.PWR -> HplBma180C.PWR; BmaStreamP.Interrupt -> HplBma180C.ACCINT; } tinyos-2.1.2+dfsg/tos/chips/bma180/BmaStreamP.nc000066400000000000000000000200211207233610700211740ustar00rootroot00000000000000/* * Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ #include "Bma180.h" module BmaStreamP { provides { interface ReadStream; interface Init; } uses { interface FastSpiByte; interface GpioInterrupt as Interrupt; interface Resource; interface Leds; interface LocalTime; interface GeneralIO as CSN; interface GeneralIO as PWR; } } implementation { enum { STATE_READY = 0, STATE_20 = 1, // 2 buffers to be filled, 0 to be reported STATE_11 = 2, // 1 buffer to be filled, 1 to be reported STATE_02 = 3, // 0 buffer to be filled, 2 to be reported STATE_10 = 4, // 1 buffer to be filled, 0 to be reported STATE_01 = 5, // 0 buffer to be filled, 1 to be reported STATE_00 = 7, // error reporting SAMPLING_STEP = 1, // state increment after sampling REPORTING_STEP = 2, // state increment after reporting }; norace uint8_t state, temp; bma180_data_t * firstStart; uint16_t firstLength; norace bma180_data_t * secondStart; norace uint16_t secondLength; // ------- Fast path norace bma180_data_t * currentPtr; norace bma180_data_t * currentEnd; task void bufferDone(); uint8_t readRegister(uint8_t address) { uint8_t ret; call CSN.clr(); call FastSpiByte.write(0x80 | address); ret = call FastSpiByte.write(0); call CSN.set(); return ret; } void writeRegister(uint8_t address, uint8_t newValue) { call CSN.clr(); call FastSpiByte.write(0x7F & address); call FastSpiByte.write(newValue); call CSN.set(); } command error_t Init.init() { call PWR.makeOutput(); call PWR.set(); call CSN.set(); call CSN.makeOutput(); return SUCCESS; } void readAccel() { if(call Resource.immediateRequest()==SUCCESS) { call CSN.clr(); call FastSpiByte.write(0x88); currentPtr->bma180_temperature = (int8_t)call FastSpiByte.write(0); call CSN.set(); call CSN.clr(); call FastSpiByte.write(0x82); currentPtr->bma180_accel_x = call FastSpiByte.write(0); currentPtr->bma180_accel_x |= (call FastSpiByte.write(0) << 8); currentPtr->bma180_accel_x >>= 2; currentPtr->bma180_accel_y = call FastSpiByte.write(0); currentPtr->bma180_accel_y |= (call FastSpiByte.write(0) << 8); currentPtr->bma180_accel_y >>=2; currentPtr->bma180_accel_z = call FastSpiByte.write(0); currentPtr->bma180_accel_z |= (call FastSpiByte.write(0) << 8); currentPtr->bma180_accel_z >>=2; currentPtr->bma180_short_timestamp = (uint8_t)(call LocalTime.get()); call CSN.set(); call Resource.release(); } } async event void Interrupt.fired() { readAccel(); currentPtr++; if( currentPtr != currentEnd ) { return; } currentPtr = secondStart; currentEnd = currentPtr + secondLength; if( (state += SAMPLING_STEP) != STATE_11 ) { call Interrupt.disable(); } post bufferDone(); } // ------- Slow path uint16_t actualPeriod; typedef struct free_buffer_t { uint16_t count; struct free_buffer_t * next; } free_buffer_t; free_buffer_t * freeBuffers; task void bufferDone() { uint8_t s; bma180_data_t * reportStart = firstStart; uint16_t reportLength = firstLength; firstStart = secondStart; firstLength = secondLength; atomic { s = state; if( s == STATE_11 && freeBuffers != NULL ) { secondStart = (bma180_data_t *)freeBuffers; secondLength = freeBuffers->count; freeBuffers = freeBuffers->next; state = STATE_20; } else if( s != STATE_00 ) { state = s + REPORTING_STEP; } } if( s != STATE_00 || freeBuffers != NULL ) { if( s == STATE_00 ) { reportStart = (bma180_data_t *)freeBuffers; reportLength = freeBuffers->count; freeBuffers = freeBuffers->next; } signal ReadStream.bufferDone(s != STATE_00 ? SUCCESS : FAIL, reportStart, reportLength); } if( freeBuffers == NULL && (s == STATE_00 || s == STATE_01) ) { signal ReadStream.readDone(s == STATE_01 ? SUCCESS : FAIL, actualPeriod); state = STATE_READY; } else if( s != STATE_11 ) post bufferDone(); } command error_t ReadStream.postBuffer(bma180_data_t *buffer, uint16_t count) { free_buffer_t * * last; if( count < (sizeof(free_buffer_t) + 1) >> 1 ) return ESIZE; atomic { if( state == STATE_10 ) { secondStart = buffer; secondLength = count; state = STATE_20; return SUCCESS; } } last = & freeBuffers; while( *last != NULL ) last = &((*last)->next); *last = (free_buffer_t *)buffer; (*last)->count = count; (*last)->next = NULL; return SUCCESS; } command error_t ReadStream.read(uint32_t period) { if( state != STATE_READY ) return EBUSY; if( freeBuffers == NULL ) return FAIL; // do it early //call Interrupt.enable(); if(call Resource.immediateRequest() == SUCCESS) { temp = readRegister(0xD); //ctrl_reg0 temp |= 0x10; // enable ee_w; needed for writing to addresses 0x20 .. 0x3B temp &=~(1<<1); //turn off sleep temp |= 1; //dis_wake_up writeRegister(0xD, temp); temp = readRegister(0x35); //offset_lsb1 temp &= 0xF1; // clear range bits temp |= (BMA_RANGE<<1); temp |= 1; // smp_skip writeRegister(0x35, temp); temp = readRegister(0x30); //tco_z temp &= 0xFC; // clear mode bits temp |= BMA_MODE; writeRegister(0x30, temp); temp = readRegister(0x20); // bw_tcs temp &= 0x0F; temp |= (BMA_BW<<4); writeRegister(0x20, temp); writeRegister(0x21, 2);//BMA_CTRL_REG3); call Resource.release(); } firstStart = (bma180_data_t *)freeBuffers; firstLength = freeBuffers->count; freeBuffers = freeBuffers->next; currentPtr = firstStart; currentEnd = firstStart + firstLength; if( freeBuffers == NULL ) state = STATE_10; else { secondStart = (bma180_data_t *)freeBuffers; secondLength = freeBuffers->count; freeBuffers = freeBuffers->next; state = STATE_20; } call Interrupt.enableRisingEdge(); return SUCCESS; } event void Resource.granted() {} default event void ReadStream.bufferDone(error_t result, bma180_data_t* buf, uint16_t count) {} default event void ReadStream.readDone(error_t err, uint32_t usPeriod) {} } tinyos-2.1.2+dfsg/tos/chips/cc1000/000077500000000000000000000000001207233610700165625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc1000/ByteRadio.nc000066400000000000000000000051471207233610700207750ustar00rootroot00000000000000/* $Id: ByteRadio.nc,v 1.5 2008-06-03 04:08:34 regehr Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Radio logic is split between Csma (media-access control, low-power * listening and general control) and SendReceive (packet reception and * transmission). This interface specifies the interaction between these * two components. * * @author David Gay */ interface ByteRadio { /** * SendReceive wants to send a packet. * @param msg Message to be sent. */ event void rts(message_t * ONE msg); /** * Access to the media granted. Start sending. SendReceive must signal * sendDone when transmission is complete. Note: the media-access-contro * layer must have enabled listening before calling cts(). */ async command void cts(); /** * Between the rts() and sendDone() events, this must return the * message under transmission. * @return Message being transmitted. */ async command message_t *getTxMessage(); /** * Transmission complete. */ async event void sendDone(); /** * Set message preamble length. * @param bytes Preamble length in bytes */ async command void setPreambleLength(uint16_t bytes); /** * Get message preamble length. * @return Preamble length in bytes */ async command uint16_t getPreambleLength(); /** * Enable listening for incoming packets. */ async command void listen(); /** * Disable listening for incoming packets. */ async command void off(); /** * SendReceive signals this event for every radio-byte-time while * listening is enabled and a message isn't being received or * transmitted. * @param preamble TRUE if a message preamble byte has been received */ async event void idleByte(bool preamble); /** * Detect if SendReceive is attempting to sync with an incoming packet. * During sync, idleByte events are not signaled. If sync is successful, * an rx() event will be signaled, if it fails, idleByte events will * resume. If syncing() returns TRUE, the last idleByte() event must * have had preamble = TRUE. * * @return TRUE if a sync attempt is in progress, FALSE if not. */ async command bool syncing(); /** * A message is being received */ async event void rx(); /** * Message reception is complete. */ async event void rxDone(); } tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000ActiveMessageC.nc000066400000000000000000000066261207233610700224500ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * The Active Message layer for the CC1000 radio. This configuration * just layers the AM dispatch (CC1000ActiveMessageM) on top of the * underlying CC1000 radio packet (CC1000CsmaRadioC), which is * inherently an AM packet (acknowledgements based on AM destination * addr and group). * * @author Philip Levis * @author Marco Langerwisch (Packet timestamping) */ configuration CC1000ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface AMPacket; interface Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface PacketTimeSyncOffset; interface LowPowerListening; } } implementation { components CC1000ActiveMessageP as AM, CC1000CsmaRadioC as Radio; components ActiveMessageAddressC as Address; SplitControl = Radio; Packet = Radio; PacketAcknowledgements = Radio; LinkPacketMetadata = Radio; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; AMPacket = AM; AM.SubSend -> Radio.Send; AM.SubReceive -> Radio.Receive; AM.amAddress -> Address; AM.Packet -> Radio; PacketTimeStamp32khz = Radio; PacketTimeStampMilli = Radio; PacketTimeSyncOffset = Radio; LowPowerListening = Radio; } tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000ActiveMessageP.nc000066400000000000000000000133361207233610700224610ustar00rootroot00000000000000// $Id: CC1000ActiveMessageP.nc,v 1.13 2010-06-29 22:07:44 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implementation component for CC1000ActiveMessageC. * * @author Philip Levis * @date June 19 2006 */ module CC1000ActiveMessageP @safe() { provides { interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface AMPacket; } uses { interface Send as SubSend; interface Receive as SubReceive; interface Packet as Packet; command am_addr_t amAddress(); } } implementation { cc1000_header_t* ONE getHeader(message_t* ONE amsg) { return TCAST(cc1000_header_t* ONE, (uint8_t*)amsg + offsetof(message_t, data) - sizeof(cc1000_header_t)); } cc1000_footer_t *getFooter(message_t *amsg) { return (cc1000_footer_t *)(amsg->footer); } command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* amsg, uint8_t len) { cc1000_header_t* header = getHeader(amsg); header->type = id; header->dest = addr; header->source = call AMPacket.address(); header->group = TOS_AM_GROUP; return call SubSend.send(amsg, len); } command error_t AMSend.cancel[am_id_t id](message_t* msg) { return call SubSend.cancel(msg); } event void SubSend.sendDone(message_t* msg, error_t result) { signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } /* Receiving a packet */ event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { cc1000_footer_t* msg_footer = getFooter(msg); if(msg_footer->crc == 1) { if (call AMPacket.isForMe(msg)) { return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len); } else { return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len); } } return msg; } command am_addr_t AMPacket.address() { return call amAddress(); } command am_addr_t AMPacket.destination(message_t* amsg) { cc1000_header_t* header = getHeader(amsg); return header->dest; } command am_addr_t AMPacket.source(message_t* amsg) { cc1000_header_t* header = getHeader(amsg); return header->source; } command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { cc1000_header_t* header = getHeader(amsg); header->dest = addr; } command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { cc1000_header_t* header = getHeader(amsg); header->source = addr; } command bool AMPacket.isForMe(message_t* amsg) { return (call AMPacket.destination(amsg) == call AMPacket.address() || call AMPacket.destination(amsg) == AM_BROADCAST_ADDR); } command am_id_t AMPacket.type(message_t* amsg) { cc1000_header_t* header = getHeader(amsg); return header->type; } command void AMPacket.setType(message_t* amsg, am_id_t type) { cc1000_header_t* header = getHeader(amsg); header->type = type; } command void AMPacket.setGroup(message_t* msg, am_group_t group) { cc1000_header_t* header = getHeader(msg); header->group = group; } command am_group_t AMPacket.group(message_t* msg) { cc1000_header_t* header = getHeader(msg); return header->group; } command am_group_t AMPacket.localGroup() { return TOS_AM_GROUP; } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { return; } } tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000Const.h000066400000000000000000000340371207233610700205370ustar00rootroot00000000000000// $Id: CC1000Const.h,v 1.5 2008-06-11 00:46:23 razvanm Exp $ /* -*- Mode: C; c-basic-indent: 2; indent-tabs-mode: nil -*- */ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * Constants for CC1000 radio * * @author Phil Buonadonna */ #ifndef CC1000CONST_H #define CC1000CONST_H /* Constants defined for CC1K */ /* Register addresses */ enum { CC1K_MAIN = 0x00, CC1K_FREQ_2A = 0x01, CC1K_FREQ_1A = 0x02, CC1K_FREQ_0A = 0x03, CC1K_FREQ_2B = 0x04, CC1K_FREQ_1B = 0x05, CC1K_FREQ_0B = 0x06, CC1K_FSEP1 = 0x07, CC1K_FSEP0 = 0x08, CC1K_CURRENT = 0x09, CC1K_FRONT_END = 0x0A, //10 CC1K_PA_POW = 0x0B, //11 CC1K_PLL = 0x0C, //12 CC1K_LOCK = 0x0D, //13 CC1K_CAL = 0x0E, //14 CC1K_MODEM2 = 0x0F, //15 CC1K_MODEM1 = 0x10, //16 CC1K_MODEM0 = 0x11, //17 CC1K_MATCH = 0x12, //18 CC1K_FSCTRL = 0x13, //19 CC1K_FSHAPE7 = 0x14, //20 CC1K_FSHAPE6 = 0x15, //21 CC1K_FSHAPE5 = 0x16, //22 CC1K_FSHAPE4 = 0x17, //23 CC1K_FSHAPE3 = 0x18, //24 CC1K_FSHAPE2 = 0x19, //25 CC1K_FSHAPE1 = 0x1A, //26 CC1K_FSDELAY = 0x1B, //27 CC1K_PRESCALER = 0x1C, //28 CC1K_TEST6 = 0x40, //64 CC1K_TEST5 = 0x41, //66 CC1K_TEST4 = 0x42, //67 CC1K_TEST3 = 0x43, //68 CC1K_TEST2 = 0x44, //69 CC1K_TEST1 = 0x45, //70 CC1K_TEST0 = 0x46, //71 // MAIN Register Bit Posititions CC1K_RXTX = 7, CC1K_F_REG = 6, CC1K_RX_PD = 5, CC1K_TX_PD = 4, CC1K_FS_PD = 3, CC1K_CORE_PD = 2, CC1K_BIAS_PD = 1, CC1K_RESET_N = 0, // CURRENT Register Bit Positions CC1K_VCO_CURRENT = 4, CC1K_LO_DRIVE = 2, CC1K_PA_DRIVE = 0, // FRONT_END Register Bit Positions CC1K_BUF_CURRENT = 5, CC1K_LNA_CURRENT = 3, CC1K_IF_RSSI = 1, CC1K_XOSC_BYPASS = 0, // PA_POW Register Bit Positions CC1K_PA_HIGHPOWER = 4, CC1K_PA_LOWPOWER = 0, // PLL Register Bit Positions CC1K_EXT_FILTER = 7, CC1K_REFDIV = 3, CC1K_ALARM_DISABLE = 2, CC1K_ALARM_H = 1, CC1K_ALARM_L = 0, // LOCK Register Bit Positions CC1K_LOCK_SELECT = 4, CC1K_PLL_LOCK_ACCURACY = 3, CC1K_PLL_LOCK_LENGTH = 2, CC1K_LOCK_INSTANT = 1, CC1K_LOCK_CONTINUOUS = 0, // CAL Register Bit Positions CC1K_CAL_START = 7, CC1K_CAL_DUAL = 6, CC1K_CAL_WAIT = 5, CC1K_CAL_CURRENT = 4, CC1K_CAL_COMPLETE = 3, CC1K_CAL_ITERATE = 0, // MODEM2 Register Bit Positions CC1K_PEAKDETECT = 7, CC1K_PEAK_LEVEL_OFFSET = 0, // MODEM1 Register Bit Positions CC1K_MLIMIT = 5, CC1K_LOCK_AVG_IN = 4, CC1K_LOCK_AVG_MODE = 3, CC1K_SETTLING = 1, CC1K_MODEM_RESET_N = 0, // MODEM0 Register Bit Positions CC1K_BAUDRATE = 4, CC1K_DATA_FORMAT = 2, CC1K_XOSC_FREQ = 0, // MATCH Register Bit Positions CC1K_RX_MATCH = 4, CC1K_TX_MATCH = 0, // FSCTLR Register Bit Positions CC1K_DITHER1 = 3, CC1K_DITHER0 = 2, CC1K_SHAPE = 1, CC1K_FS_RESET_N = 0, // PRESCALER Register Bit Positions CC1K_PRE_SWING = 6, CC1K_PRE_CURRENT = 4, CC1K_IF_INPUT = 3, CC1K_IF_FRONT = 2, // TEST6 Register Bit Positions CC1K_LOOPFILTER_TP1 = 7, CC1K_LOOPFILTER_TP2 = 6, CC1K_CHP_OVERRIDE = 5, CC1K_CHP_CO = 0, // TEST5 Register Bit Positions CC1K_CHP_DISABLE = 5, CC1K_VCO_OVERRIDE = 4, CC1K_VCO_AO = 0, // TEST3 Register Bit Positions CC1K_BREAK_LOOP = 4, CC1K_CAL_DAC_OPEN = 0, /* * CC1K Register Parameters Table * * This table follows the same format order as the CC1K register * set EXCEPT for the last entry in the table which is the * CURRENT register value for TX mode. * * NOTE: To save RAM space, this table resides in program memory (flash). * This has two important implications: * 1) You can't write to it (duh!) * 2) You must read it using the PRG_RDB(addr) macro. IT CANNOT BE ACCESSED AS AN ORDINARY C ARRAY. * * Add/remove individual entries below to suit your RF tastes. * */ CC1K_433_002_MHZ = 0x00, CC1K_915_998_MHZ = 0x01, CC1K_434_845_MHZ = 0x02, CC1K_914_077_MHZ = 0x03, CC1K_315_178_MHZ = 0x04, //#define CC1K_SquelchInit 0x02F8 // 0.90V using the bandgap reference CC1K_SquelchInit = 0x120, CC1K_SquelchTableSize = 9, CC1K_MaxRSSISamples = 5, CC1K_Settling = 1, CC1K_ValidPrecursor = 2, CC1K_SquelchIntervalFast = 128, CC1K_SquelchIntervalSlow = 2560, CC1K_SquelchCount = 30, CC1K_SquelchBuffer = 12, CC1K_LPL_STATES = 9, CC1K_LPL_PACKET_TIME = 16, CC1K_LPL_CHECK_TIME = 16, /* In tenth's of milliseconds, this should be an approximation of the on-time for a LPL check rather than the total check time. */ CC1K_LPL_MIN_INTERVAL = 5, /* In milliseconds, the minimum interval between low-power-listening checks */ CC1K_LPL_MAX_INTERVAL = 10000 /* In milliseconds, the maximum interval between low-power-listening checks. Arbitrary value, but must be at most 32767 because of the way sleep interval is stored in outgoing messages */ }; #ifdef CC1K_DEFAULT_FREQ #define CC1K_DEF_PRESET (CC1K_DEFAULT_FREQ) #endif #ifdef CC1K_MANUAL_FREQ #define CC1K_DEF_FREQ (CC1K_MANUAL_FREQ) #endif #ifndef CC1K_DEF_PRESET #define CC1K_DEF_PRESET (CC1K_434_845_MHZ) #endif static const_uint8_t CC1K_Params[6][20] = { // (0) 433.002 MHz channel, 19.2 Kbps data, Manchester Encoding, High Side LO { // MAIN 0x00 0x31, // FREQ2A,FREQ1A,FREQ0A 0x01-0x03 0x58,0x00,0x00, // FREQ2B,FREQ1B,FREQ0B 0x04-0x06 0x57,0xf6,0x85, //XBOW // FSEP1, FSEP0 0x07-0x08 0X03,0x55, // CURRENT RX MODE VALUE 0x09 also see below 4 << CC1K_VCO_CURRENT | 1 << CC1K_LO_DRIVE, // FRONT_END 0x0a 1 << CC1K_IF_RSSI, // PA_POW 0x0b 0x0 << CC1K_PA_HIGHPOWER | 0xf << CC1K_PA_LOWPOWER, // PLL 0x0c 12 << CC1K_REFDIV, // LOCK 0x0d 0xe << CC1K_LOCK_SELECT, // CAL 0x0e 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE, // MODEM2 0x0f 0 << CC1K_PEAKDETECT | 28 << CC1K_PEAK_LEVEL_OFFSET, // MODEM1 0x10 3 << CC1K_MLIMIT | 1 << CC1K_LOCK_AVG_MODE | CC1K_Settling << CC1K_SETTLING | 1 << CC1K_MODEM_RESET_N, // MODEM0 0x11 5 << CC1K_BAUDRATE | 1 << CC1K_DATA_FORMAT | 1 << CC1K_XOSC_FREQ, // MATCH 0x12 0x7 << CC1K_RX_MATCH | 0x0 << CC1K_TX_MATCH, // tx current (extra) 8 << CC1K_VCO_CURRENT | 1 << CC1K_PA_DRIVE, }, // 1 915.9988 MHz channel, 19.2 Kbps data, Manchester Encoding, High Side LO { // MAIN 0x00 0x31, // FREQ2A,FREQ1A,FREQ0A 0x01-0x03 0x7c,0x00,0x00, // FREQ2B,FREQ1B,FREQ0B 0x04-0x06 0x7b,0xf9,0xae, // FSEP1, FSEP0 0x07-0x8 0x02,0x38, // CURRENT RX MODE VALUE 0x09 also see below 8 << CC1K_VCO_CURRENT | 3 << CC1K_LO_DRIVE, //0x8C, // FRONT_END 0x0a 1 << CC1K_BUF_CURRENT | 2 << CC1K_LNA_CURRENT | 1 << CC1K_IF_RSSI, //0x32, // PA_POW 0x0b 0x8 << CC1K_PA_HIGHPOWER | 0x0 << CC1K_PA_LOWPOWER, //0xff, // PLL 0xc 8 << CC1K_REFDIV, //0x40, // LOCK 0xd 0x1 << CC1K_LOCK_SELECT, //0x10, // CAL 0xe 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE, //0x26, // MODEM2 0xf 1 << CC1K_PEAKDETECT | 33 << CC1K_PEAK_LEVEL_OFFSET, //0xA1, // MODEM1 0x10 3 << CC1K_MLIMIT | 1 << CC1K_LOCK_AVG_MODE | CC1K_Settling << CC1K_SETTLING | 1 << CC1K_MODEM_RESET_N, //0x6f, // MODEM0 0x11 5 << CC1K_BAUDRATE | 1 << CC1K_DATA_FORMAT | 1 << CC1K_XOSC_FREQ, //0x55, // MATCH 0x12 0x1 << CC1K_RX_MATCH | 0x0 << CC1K_TX_MATCH, // tx current (extra) 15 << CC1K_VCO_CURRENT | 3 << CC1K_PA_DRIVE, }, // 2 434.845200 MHz channel, 19.2 Kbps data, Manchester Encoding, High Side LO { // MAIN 0x00 0x31, // FREQ2A,FREQ1A,FREQ0A 0x01-0x03 0x51,0x00,0x00, // FREQ2B,FREQ1B,FREQ0B 0x04-0x06 0x50,0xf7,0x4F, //XBOW // FSEP1, FSEP0 0x07-0x08 0X03,0x0E, // CURRENT RX MODE VALUE 0x09 also see below 4 << CC1K_VCO_CURRENT | 1 << CC1K_LO_DRIVE, // FRONT_END 0x0a 1 << CC1K_IF_RSSI, // PA_POW 0x0b 0x0 << CC1K_PA_HIGHPOWER | 0xf << CC1K_PA_LOWPOWER, // PLL 0x0c 11 << CC1K_REFDIV, // LOCK 0x0d 0xe << CC1K_LOCK_SELECT, // CAL 0x0e 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE, // MODEM2 0x0f 1 << CC1K_PEAKDETECT | 33 << CC1K_PEAK_LEVEL_OFFSET, // MODEM1 0x10 3 << CC1K_MLIMIT | 1 << CC1K_LOCK_AVG_MODE | CC1K_Settling << CC1K_SETTLING | 1 << CC1K_MODEM_RESET_N, // MODEM0 0x11 5 << CC1K_BAUDRATE | 1 << CC1K_DATA_FORMAT | 1 << CC1K_XOSC_FREQ, // MATCH 0x12 0x7 << CC1K_RX_MATCH | 0x0 << CC1K_TX_MATCH, // tx current (extra) 8 << CC1K_VCO_CURRENT | 1 << CC1K_PA_DRIVE, }, // 3 914.077 MHz channel, 19.2 Kbps data, Manchester Encoding, High Side LO { // MAIN 0x00 0x31, // FREQ2A,FREQ1A,FREQ0A 0x01-0x03 0x5c,0xe0,0x00, // FREQ2B,FREQ1B,FREQ0B 0x04-0x06 0x5c,0xdb,0x42, // FSEP1, FSEP0 0x07-0x8 0x01,0xAA, // CURRENT RX MODE VALUE 0x09 also see below 8 << CC1K_VCO_CURRENT | 3 << CC1K_LO_DRIVE, //0x8C, // FRONT_END 0x0a 1 << CC1K_BUF_CURRENT | 2 << CC1K_LNA_CURRENT | 1 << CC1K_IF_RSSI, //0x32, // PA_POW 0x0b 0x8 << CC1K_PA_HIGHPOWER | 0x0 << CC1K_PA_LOWPOWER, //0xff, // PLL 0xc 6 << CC1K_REFDIV, //0x40, // LOCK 0xd 0x1 << CC1K_LOCK_SELECT, //0x10, // CAL 0xe 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE, //0x26, // MODEM2 0xf 1 << CC1K_PEAKDETECT | 33 << CC1K_PEAK_LEVEL_OFFSET, //0xA1, // MODEM1 0x10 3 << CC1K_MLIMIT | 1 << CC1K_LOCK_AVG_MODE | CC1K_Settling << CC1K_SETTLING | 1 << CC1K_MODEM_RESET_N, //0x6f, // MODEM0 0x11 5 << CC1K_BAUDRATE | 1 << CC1K_DATA_FORMAT | 1 << CC1K_XOSC_FREQ, //0x55, // MATCH 0x12 0x1 << CC1K_RX_MATCH | 0x0 << CC1K_TX_MATCH, // tx current (extra) 15 << CC1K_VCO_CURRENT | 3 << CC1K_PA_DRIVE, }, // 4 315.178985 MHz channel, 38.4 Kbps data, Manchester Encoding, High Side LO { // MAIN 0x00 0x31, // FREQ2A,FREQ1A,FREQ0A 0x01-0x03 0x45,0x60,0x00, // FREQ2B,FREQ1B,FREQ0B 0x04-0x06 0x45,0x55,0xBB, // FSEP1, FSEP0 0x07-0x08 0X03,0x9C, // CURRENT RX MODE VALUE 0x09 also see below 8 << CC1K_VCO_CURRENT | 0 << CC1K_LO_DRIVE, // FRONT_END 0x0a 1 << CC1K_IF_RSSI, // PA_POW 0x0b 0x0 << CC1K_PA_HIGHPOWER | 0xf << CC1K_PA_LOWPOWER, // PLL 0x0c 13 << CC1K_REFDIV, // LOCK 0x0d 0xe << CC1K_LOCK_SELECT, // CAL 0x0e 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE, // MODEM2 0x0f 1 << CC1K_PEAKDETECT | 33 << CC1K_PEAK_LEVEL_OFFSET, // MODEM1 0x10 3 << CC1K_MLIMIT | 1 << CC1K_LOCK_AVG_MODE | CC1K_Settling << CC1K_SETTLING | 1 << CC1K_MODEM_RESET_N, // MODEM0 0x11 5 << CC1K_BAUDRATE | 1 << CC1K_DATA_FORMAT | 0 << CC1K_XOSC_FREQ, // MATCH 0x12 0x7 << CC1K_RX_MATCH | 0x0 << CC1K_TX_MATCH, // tx current (extra) 8 << CC1K_VCO_CURRENT | 1 << CC1K_PA_DRIVE, }, // 5 Spare { // MAIN 0x00 0x31, // FREQ2A,FREQ1A,FREQ0A 0x01-0x03 0x58,0x00,0x00, // FREQ2B,FREQ1B,FREQ0B 0x04-0x06 0x57,0xf6,0x85, //XBOW // FSEP1, FSEP0 0x07-0x08 0X03,0x55, // CURRENT RX MODE VALUE 0x09 also see below 8 << CC1K_VCO_CURRENT | 4 << CC1K_LO_DRIVE, // FRONT_END 0x0a 1 << CC1K_IF_RSSI, // PA_POW 0x0b 0x0 << CC1K_PA_HIGHPOWER | 0xf << CC1K_PA_LOWPOWER, // PLL 0x0c 12 << CC1K_REFDIV, // LOCK 0x0d 0xe << CC1K_LOCK_SELECT, // CAL 0x0e 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE, // MODEM2 0x0f 1 << CC1K_PEAKDETECT | 33 << CC1K_PEAK_LEVEL_OFFSET, // MODEM1 0x10 3 << CC1K_MLIMIT | 1 << CC1K_LOCK_AVG_MODE | CC1K_Settling << CC1K_SETTLING | 1 << CC1K_MODEM_RESET_N, // MODEM0 0x11 5 << CC1K_BAUDRATE | 1 << CC1K_DATA_FORMAT | 1 << CC1K_XOSC_FREQ, // MATCH 0x12 0x7 << CC1K_RX_MATCH | 0x0 << CC1K_TX_MATCH, // tx current (extra) 8 << CC1K_VCO_CURRENT | 1 << CC1K_PA_DRIVE, }, }; #define UQ_CC1000_RSSI "CC1000RssiP.Rssi" #endif /* CC1000CONST_H */ tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000Control.nc000066400000000000000000000121331207233610700212330ustar00rootroot00000000000000/* $Id: CC1000Control.nc,v 1.5 2010-06-29 22:07:44 scipio Exp $ * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * CC1000 internal radio control interface. * @author Philip Buonadonna * @aythor Jaein Jeong */ interface CC1000Control { /** * Initialise the radio to its default state. */ command void init(); /** * Tune the radio to one of the frequencies available in the CC1K_Params * table. Calling Tune will allso reset the rfpower and LockVal * selections to the table values. * * @param freq The index into the CC1K_Params table that holds the * desired preset frequency parameters. */ command void tunePreset(uint8_t freq); /** * Tune the radio to a given frequency. Since the CC1000 uses a digital * frequency synthesizer, it cannot tune to just an arbitrary frequency. * This routine will determine the closest achievable channel, compute * the necessary parameters and tune the radio. * * @param The desired channel frequency, in Hz. * * @return The actual computed channel frequency, in Hz. A return value * of '0' indicates that no frequency was computed and the radio was not * tuned. */ command uint32_t tuneManual(uint32_t DesiredFreq); /** * Turn the CC1000 off */ async command void off(); /** * Shift the CC1000 Radio into transmit mode. */ async command void txMode(); /** * Shift the CC1000 Radio in receive mode. */ async command void rxMode(); /** * Turn off the bias power on the CC1000 radio, but leave the core and * crystal oscillator powered. This will result in approximately a 750 * uA power savings. */ async command void coreOn(); /** * Turn the bias power on. This function must be followed by a call to * either rxMode() or txMode() to place the radio in a recieve/transmit * state respectively. There is approximately a 200us delay when * restoring bias power. */ async command void biasOn(); /** * Set the transmit RF power value. The input value is simply an * arbitrary index that is programmed into the CC1000 registers. Consult * the CC1000 datasheet for the resulting power output/current * consumption values. * * @param power A power index between 1 and 255. */ command void setRFPower(uint8_t power); /** * Get the present RF power index. * * @return The power index value. */ command uint8_t getRFPower(); /** * Select the signal to monitor at the CHP_OUT pin of the CC1000. See * the CC1000 data sheet for the available signals. * * @param LockVal The index of the signal to monitor at the CHP_OUT pin */ command void selectLock(uint8_t LockVal); /** * Get the binary value from the CHP_OUT pin. Analog signals cannot be * read using function. * * @return 1 - Pin is high or 0 - Pin is low */ command uint8_t getLock(); /** * Returns whether the present frequency set is using high-side LO * injection or not. This information is used to determine if the data * from the CC1000 needs to be inverted or not. * * @return TRUE if high-side LO injection is being used (i.e. data does NOT need to be inverted * at the receiver. */ command bool getLOStatus(); } tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000ControlP.nc000066400000000000000000000252401207233610700213560ustar00rootroot00000000000000/* $Id: CC1000ControlP.nc,v 1.6 2010-06-29 22:07:44 scipio Exp $ * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "CC1000Const.h" #include "Timer.h" /** * This module provides the CONTROL functionality for the Chipcon1000 * series radio. It exports a custom interface to control CC1000 * operation. * * @author Philip Buonadonna * @author Jaein Jeong * @author David Gay */ module CC1000ControlP @safe() { provides { interface CC1000Control; } uses { interface HplCC1000 as CC; interface BusyWait; } } implementation { uint8_t txCurrent, rxCurrent, power; enum { IF = 150000, FREQ_MIN = 4194304, FREQ_MAX = 16751615 }; const_uint32_t fRefTbl[9] = {2457600, 2106514, 1843200, 1638400, 1474560, 1340509, 1228800, 1134277, 1053257}; const_uint16_t corTbl[9] = {1213, 1416, 1618, 1820, 2022, 2224, 2427, 2629, 2831}; const_uint16_t fSepTbl[9] = {0x1AA, 0x1F1, 0x238, 0x280, 0x2C7, 0x30E, 0x355, 0x39C, 0x3E3}; void calibrateNow() { // start cal call CC.write(CC1K_CAL, 1 << CC1K_CAL_START | 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE); while ((call CC.read(CC1K_CAL) & 1 << CC1K_CAL_COMPLETE) == 0) ; //exit cal mode call CC.write(CC1K_CAL, 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE); } void calibrate() { call CC.write(CC1K_PA_POW, 0x00); // turn off rf amp call CC.write(CC1K_TEST4, 0x3f); // chip rate >= 38.4kb // RX - configure main freq A call CC.write(CC1K_MAIN, 1 << CC1K_TX_PD | 1 << CC1K_RESET_N); calibrateNow(); // TX - configure main freq B call CC.write(CC1K_MAIN, 1 << CC1K_RXTX | 1 << CC1K_F_REG | 1 << CC1K_RX_PD | 1 << CC1K_RESET_N); // Set TX current call CC.write(CC1K_CURRENT, txCurrent); call CC.write(CC1K_PA_POW, 0); calibrateNow(); call CC1000Control.rxMode(); } /* * cc1000ComputeFreq(uint32_t desiredFreq); * * Compute an achievable frequency and the necessary CC1K parameters from * a given desired frequency (Hz). The function returns the actual achieved * channel frequency in Hz. * * This routine assumes the following: * - Crystal Freq: 14.7456 MHz * - LO Injection: High * - Separation: 64 KHz * - IF: 150 KHz * * Approximate costs for this function: * - ~870 bytes FLASH * - ~32 bytes RAM * - 9400 cycles */ uint32_t cc1000SetFrequency(uint32_t desiredFreq) { uint32_t ActualChannel = 0; uint32_t RXFreq = 0, TXFreq = 0; int32_t Offset = 0x7fffffff; uint16_t FSep = 0; uint8_t RefDiv = 0; uint8_t i, match, frontend; for (i = 0; i < 9; i++) { uint32_t NRef = desiredFreq + IF; uint32_t FRef = read_uint32_t(&fRefTbl[i]); uint32_t Channel = 0; uint32_t RXCalc = 0, TXCalc = 0; int32_t diff; NRef = ((desiredFreq + IF) << 2) / FRef; if (NRef & 0x1) NRef++; if (NRef & 0x2) { RXCalc = 16384 >> 1; Channel = FRef >> 1; } NRef >>= 2; RXCalc += (NRef * 16384) - 8192; if ((RXCalc < FREQ_MIN) || (RXCalc > FREQ_MAX)) continue; TXCalc = RXCalc - read_uint16_t(&corTbl[i]); if (TXCalc < FREQ_MIN || TXCalc > FREQ_MAX) continue; Channel += NRef * FRef; Channel -= IF; diff = Channel - desiredFreq; if (diff < 0) diff = -diff; if (diff < Offset) { RXFreq = RXCalc; TXFreq = TXCalc; ActualChannel = Channel; FSep = read_uint16_t(&fSepTbl[i]); RefDiv = i + 6; Offset = diff; } } if (RefDiv != 0) { call CC.write(CC1K_FREQ_0A, RXFreq); call CC.write(CC1K_FREQ_1A, RXFreq >> 8); call CC.write(CC1K_FREQ_2A, RXFreq >> 16); call CC.write(CC1K_FREQ_0B, TXFreq); call CC.write(CC1K_FREQ_1B, TXFreq >> 8); call CC.write(CC1K_FREQ_2B, TXFreq >> 16); call CC.write(CC1K_FSEP0, FSep); call CC.write(CC1K_FSEP1, FSep >> 8); if (ActualChannel < 500000000) { if (ActualChannel < 400000000) { rxCurrent = 8 << CC1K_VCO_CURRENT | 1 << CC1K_LO_DRIVE; txCurrent = 9 << CC1K_VCO_CURRENT | 1 << CC1K_PA_DRIVE; } else { rxCurrent = 4 << CC1K_VCO_CURRENT | 1 << CC1K_LO_DRIVE; txCurrent = 8 << CC1K_VCO_CURRENT | 1 << CC1K_PA_DRIVE; } frontend = 1 << CC1K_IF_RSSI; match = 7 << CC1K_RX_MATCH; } else { rxCurrent = 8 << CC1K_VCO_CURRENT | 3 << CC1K_LO_DRIVE; txCurrent = 15 << CC1K_VCO_CURRENT | 3 << CC1K_PA_DRIVE; frontend = 1 << CC1K_BUF_CURRENT | 2 << CC1K_LNA_CURRENT | 1 << CC1K_IF_RSSI; match = 2 << CC1K_RX_MATCH; // datasheet says to use 1... } call CC.write(CC1K_CURRENT, rxCurrent); call CC.write(CC1K_MATCH, match); call CC.write(CC1K_FRONT_END, frontend); call CC.write(CC1K_PLL, RefDiv << CC1K_REFDIV); } return ActualChannel; } command void CC1000Control.init() { call CC.init(); // wake up xtal and reset unit call CC.write(CC1K_MAIN, 1 << CC1K_RX_PD | 1 << CC1K_TX_PD | 1 << CC1K_FS_PD | 1 << CC1K_BIAS_PD); // clear reset. call CC1000Control.coreOn(); call BusyWait.wait(2000); // Set default parameter values // POWER: 0dbm (~900MHz), 6dbm (~430MHz) power = 8 << CC1K_PA_HIGHPOWER | 0 << CC1K_PA_LOWPOWER; call CC.write(CC1K_PA_POW, power); // select Manchester Violation for CHP_OUT call CC.write(CC1K_LOCK_SELECT, 9 << CC1K_LOCK_SELECT); // Default modem values = 19.2 Kbps (38.4 kBaud), Manchester encoded call CC.write(CC1K_MODEM2, 0); call CC.write(CC1K_MODEM1, 3 << CC1K_MLIMIT | 1 << CC1K_LOCK_AVG_MODE | 3 << CC1K_SETTLING | 1 << CC1K_MODEM_RESET_N); call CC.write(CC1K_MODEM0, 5 << CC1K_BAUDRATE | 1 << CC1K_DATA_FORMAT | 1 << CC1K_XOSC_FREQ); call CC.write(CC1K_FSCTRL, 1 << CC1K_FS_RESET_N); #ifdef CC1K_DEF_FREQ call CC1000Control.tuneManual(CC1K_DEF_FREQ); #else call CC1000Control.tunePreset(CC1K_DEF_PRESET); #endif call CC1000Control.off(); } command void CC1000Control.tunePreset(uint8_t freq) { int i; // FREQA, FREQB, FSEP, CURRENT(RX), FRONT_END, POWER, PLL for (i = CC1K_FREQ_2A; i <= CC1K_PLL; i++) call CC.write(i, read_uint8_t(&CC1K_Params[freq][i])); call CC.write(CC1K_MATCH, read_uint8_t(&CC1K_Params[freq][CC1K_MATCH])); rxCurrent = read_uint8_t(&CC1K_Params[freq][CC1K_CURRENT]); txCurrent = read_uint8_t(&CC1K_Params[freq][CC1K_MATCH + 1]); power = read_uint8_t(&CC1K_Params[freq][CC1K_PA_POW]); calibrate(); } command uint32_t CC1000Control.tuneManual(uint32_t DesiredFreq) { uint32_t actualFreq; actualFreq = cc1000SetFrequency(DesiredFreq); calibrate(); return actualFreq; } async command void CC1000Control.txMode() { // MAIN register to TX mode call CC.write(CC1K_MAIN, 1 << CC1K_RXTX | 1 << CC1K_F_REG | 1 << CC1K_RX_PD | 1 << CC1K_RESET_N); // Set the TX mode VCO Current call CC.write(CC1K_CURRENT, txCurrent); call BusyWait.wait(250); call CC.write(CC1K_PA_POW, power); call BusyWait.wait(20); } async command void CC1000Control.rxMode() { // MAIN register to RX mode // Powerup Freqency Synthesizer and Receiver call CC.write(CC1K_CURRENT, rxCurrent); call CC.write(CC1K_PA_POW, 0); // turn off power amp call CC.write(CC1K_MAIN, 1 << CC1K_TX_PD | 1 << CC1K_RESET_N); call BusyWait.wait(125); } async command void CC1000Control.coreOn() { // MAIN register to SLEEP mode call CC.write(CC1K_MAIN, 1 << CC1K_RX_PD | 1 << CC1K_TX_PD | 1 << CC1K_FS_PD | 1 << CC1K_BIAS_PD | 1 << CC1K_RESET_N); } async command void CC1000Control.biasOn() { call CC.write(CC1K_MAIN, 1 << CC1K_RX_PD | 1 << CC1K_TX_PD | 1 << CC1K_FS_PD | 1 << CC1K_RESET_N); } async command void CC1000Control.off() { // MAIN register to power down mode. Shut everything off call CC.write(CC1K_MAIN, 1 << CC1K_RX_PD | 1 << CC1K_TX_PD | 1 << CC1K_FS_PD | 1 << CC1K_CORE_PD | 1 << CC1K_BIAS_PD | 1 << CC1K_RESET_N); call CC.write(CC1K_PA_POW, 0); // turn off rf amp } command void CC1000Control.setRFPower(uint8_t newPower) { power = newPower; } command uint8_t CC1000Control.getRFPower() { return power; } command void CC1000Control.selectLock(uint8_t fn) { // Select function of CHP_OUT pin (readable via getLock) call CC.write(CC1K_LOCK, fn << CC1K_LOCK_SELECT); } command uint8_t CC1000Control.getLock() { return call CC.getLOCK(); } command bool CC1000Control.getLOStatus() { // We use a high-side LO (local oscillator) frequency -> data will be // inverted. See cc1000ComputeFreq and CC1000 datasheet p.23. return TRUE; } } tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000CsmaP.nc000066400000000000000000000334661207233610700206320ustar00rootroot00000000000000// $Id: CC1000CsmaP.nc,v 1.11 2010-06-29 22:07:44 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "message.h" #include "crc.h" #include "CC1000Const.h" #include "Timer.h" /** * A rewrite of the low-power-listening CC1000 radio stack. * This file contains the CSMA and low-power listening logic. Actual * packet transmission and reception is in SendReceive. *

    * This code has some degree of platform-independence, via the * CC1000Control, RSSIADC and SpiByteFifo interfaces which must be provided * by the platform. However, these interfaces may still reflect some * particularities of the mica2 hardware implementation. * * @author Philip Buonadonna * @author Jaein Jeong * @author Joe Polastre * @author David Gay */ module CC1000CsmaP @safe() { provides { interface Init; interface SplitControl; interface CsmaControl; interface CsmaBackoff; interface LowPowerListening; } uses { interface Init as ByteRadioInit; interface StdControl as ByteRadioControl; interface ByteRadio; //interface PowerManagement; interface CC1000Control; interface CC1000Squelch; interface Random; interface Timer as WakeupTimer; interface BusyWait; interface ReadNow as RssiNoiseFloor; interface ReadNow as RssiCheckChannel; interface ReadNow as RssiPulseCheck; async command void cancelRssi(); } } implementation { enum { DISABLED_STATE, IDLE_STATE, RX_STATE, TX_STATE, POWERDOWN_STATE, PULSECHECK_STATE }; enum { TIME_AFTER_CHECK = 30, }; uint8_t radioState = DISABLED_STATE; struct { uint8_t ccaOff : 1; uint8_t txPending : 1; } f; // f for flags uint8_t count; uint8_t clearCount; int16_t macDelay; uint16_t sleepTime; uint16_t rssiForSquelch; task void setWakeupTask(); cc1000_metadata_t * ONE getMetadata(message_t * ONE amsg) { return TCAST(cc1000_metadata_t * ONE, (uint8_t*)amsg + offsetof(message_t, footer) + sizeof(cc1000_footer_t)); } void enterIdleState() { call cancelRssi(); radioState = IDLE_STATE; } void enterIdleStateSetWakeup() { enterIdleState(); post setWakeupTask(); } void enterDisabledState() { call cancelRssi(); radioState = DISABLED_STATE; } void enterPowerDownState() { call cancelRssi(); radioState = POWERDOWN_STATE; } void enterPulseCheckState() { radioState = PULSECHECK_STATE; count = 0; } void enterRxState() { call cancelRssi(); radioState = RX_STATE; } void enterTxState() { radioState = TX_STATE; } /* Basic radio power control */ void radioOn() { call CC1000Control.coreOn(); call BusyWait.wait(2000); call CC1000Control.biasOn(); call BusyWait.wait(200); atomic call ByteRadio.listen(); } void radioOff() { call CC1000Control.off(); call ByteRadio.off(); } void setPreambleLength(message_t * ONE msg); /* Initialisation, startup and stopping */ /*--------------------------------------*/ command error_t Init.init() { call ByteRadioInit.init(); call CC1000Control.init(); return SUCCESS; } task void startStopDone() { uint8_t s; // Save a byte of RAM by sharing start/stopDone task atomic s = radioState; if (s == DISABLED_STATE) signal SplitControl.stopDone(SUCCESS); else signal SplitControl.startDone(SUCCESS); } command error_t SplitControl.start() { atomic if (radioState == DISABLED_STATE) { call ByteRadioControl.start(); enterIdleStateSetWakeup(); f.txPending = FALSE; } else return SUCCESS; radioOn(); post startStopDone(); return SUCCESS; } command error_t SplitControl.stop() { atomic { call ByteRadioControl.stop(); enterDisabledState(); radioOff(); } call WakeupTimer.stop(); post startStopDone(); return SUCCESS; } /* Wakeup timer */ /*-------------*/ /* All timer setting code is placed in setWakeup, for consistency. */ void setWakeup() { switch (radioState) { case IDLE_STATE: /* Timer already running means that we have a noise floor measurement scheduled. If we just set a new alarm here, we might indefinitely delay noise floor measurements if we're, e,g, transmitting frequently. */ if (!call WakeupTimer.isRunning()) if (call CC1000Squelch.settled()) { if (sleepTime == 0) call WakeupTimer.startOneShot(CC1K_SquelchIntervalSlow); else // timeout for receiving a message after an lpl check // indicates channel activity. call WakeupTimer.startOneShot(TIME_AFTER_CHECK); } else call WakeupTimer.startOneShot(CC1K_SquelchIntervalFast); break; case PULSECHECK_STATE: // Radio warm-up time. call WakeupTimer.startOneShot(1); break; case POWERDOWN_STATE: // low-power listening check interval call WakeupTimer.startOneShot(sleepTime); break; } } task void setWakeupTask() { atomic setWakeup(); } event void WakeupTimer.fired() { atomic { switch (radioState) { case IDLE_STATE: /* If we appear to be receiving a packet we don't check the noise floor. For LPL, this means that going to sleep will be delayed by another TIME_AFTER_CHECK ms. */ if (!call ByteRadio.syncing()) { call cancelRssi(); call RssiNoiseFloor.read(); } break; case POWERDOWN_STATE: // Turn radio on, wait for 1ms enterPulseCheckState(); call CC1000Control.biasOn(); break; case PULSECHECK_STATE: // Switch to RX mode and get RSSI output call CC1000Control.rxMode(); call RssiPulseCheck.read(); call BusyWait.wait(80); return; // don't set wakeup timer } setWakeup(); } } /* Low-power listening stuff */ /*---------------------------*/ /* Should we go to sleep, or turn the radio fully on? */ task void sleepCheck() { bool turnOn = FALSE; atomic if (f.txPending || !sleepTime) { if (radioState == PULSECHECK_STATE || radioState == POWERDOWN_STATE) { enterIdleStateSetWakeup(); turnOn = TRUE; } } else if (call CC1000Squelch.settled() && !call ByteRadio.syncing()) { radioOff(); enterPowerDownState(); setWakeup(); } if (turnOn) radioOn(); } task void adjustSquelch(); async event void RssiPulseCheck.readDone(error_t result, uint16_t data) { if (result != SUCCESS) { /* Just give up on this interval. */ post sleepCheck(); return; } /* We got some RSSI data for our LPL check. Decide whether to: - go back to sleep (quiet) - wake up (channel active) - get more RSSI data */ if (data > call CC1000Squelch.get() - (call CC1000Squelch.get() >> 2)) { post sleepCheck(); // don't be too agressive (ignore really quiet thresholds). if (data < call CC1000Squelch.get() + (call CC1000Squelch.get() >> 3)) { // adjust the noise floor level, go back to sleep. rssiForSquelch = data; post adjustSquelch(); } } else if (count++ > 5) { //go to the idle state since no outliers were found enterIdleStateSetWakeup(); call ByteRadio.listen(); } else { call RssiPulseCheck.read(); call BusyWait.wait(80); } } /* CSMA */ /*------*/ event void ByteRadio.rts(message_t * ONE msg) { atomic { f.txPending = TRUE; if (radioState == POWERDOWN_STATE) post sleepCheck(); if (!f.ccaOff) macDelay = signal CsmaBackoff.initial(call ByteRadio.getTxMessage()); else macDelay = 1; setPreambleLength(msg); } } async event void ByteRadio.sendDone() { f.txPending = FALSE; enterIdleStateSetWakeup(); } void congestion() { macDelay = signal CsmaBackoff.congestion(call ByteRadio.getTxMessage()); } async event void ByteRadio.idleByte(bool preamble) { if (f.txPending) { if (!f.ccaOff && preamble) congestion(); else if (macDelay && !--macDelay) { call cancelRssi(); count = 0; call RssiCheckChannel.read(); } } } async event void RssiCheckChannel.readDone(error_t result, uint16_t data) { if (result != SUCCESS) { /* We'll retry the transmission at the next SPI event. */ atomic macDelay = 1; return; } count++; if (data > call CC1000Squelch.get() + CC1K_SquelchBuffer) clearCount++; else clearCount = 0; // if the channel is clear or CCA is disabled, GO GO GO! if (clearCount >= 1 || f.ccaOff) { enterTxState(); call ByteRadio.cts(); } else if (count == CC1K_MaxRSSISamples) congestion(); else call RssiCheckChannel.read(); } /* Message being received. We basically just go inactive. */ /*--------------------------------------------------------*/ async event void ByteRadio.rx() { enterRxState(); } async event void ByteRadio.rxDone() { if (radioState == RX_STATE) enterIdleStateSetWakeup(); } /* Noise floor */ /*-------------*/ task void adjustSquelch() { uint16_t squelchData; atomic squelchData = rssiForSquelch; call CC1000Squelch.adjust(squelchData); } async event void RssiNoiseFloor.readDone(error_t result, uint16_t data) { if (result != SUCCESS) { /* We just ignore failed noise floor measurements */ post sleepCheck(); return; } rssiForSquelch = data; post adjustSquelch(); post sleepCheck(); } /* Options */ /*---------*/ async command error_t CsmaControl.enableCca() { atomic f.ccaOff = FALSE; return SUCCESS; } async command error_t CsmaControl.disableCca() { atomic f.ccaOff = TRUE; return SUCCESS; } /* Default MAC backoff parameters */ /*--------------------------------*/ default async event uint16_t CsmaBackoff.initial(message_t *m) { // initially back off [1,32] bytes (approx 2/3 packet) return (call Random.rand16() & 0x1F) + 1; } default async event uint16_t CsmaBackoff.congestion(message_t *m) { return (call Random.rand16() & 0xF) + 1; } /* LowPowerListening setup */ /* ----------------------- */ uint16_t validateSleepInterval(uint16_t sleepIntervalMs) { if (sleepIntervalMs < CC1K_LPL_MIN_INTERVAL) return 0; else if (sleepIntervalMs > CC1K_LPL_MAX_INTERVAL) return CC1K_LPL_MAX_INTERVAL; else return sleepIntervalMs; } uint16_t dutyToSleep(uint16_t dutyCycle) { /* Scaling factors on CC1K_LPL_CHECK_TIME and dutyCycle are identical */ uint16_t interval = (1000 * CC1K_LPL_CHECK_TIME) / dutyCycle; return interval < CC1K_LPL_MIN_INTERVAL ? 0 : interval; } uint16_t sleepToDuty(uint16_t sleepInterval) { if (sleepInterval < CC1K_LPL_MIN_INTERVAL) return 10000; /* Scaling factors on CC1K_LPL_CHECK_TIME and dutyCycle are identical */ return (1000 * CC1K_LPL_CHECK_TIME) / sleepInterval; } command void LowPowerListening.setLocalWakeupInterval(uint16_t s) { sleepTime = validateSleepInterval(s); } command uint16_t LowPowerListening.getLocalWakeupInterval() { return sleepTime; } command void LowPowerListening.setRemoteWakeupInterval(message_t *msg, uint16_t sleepIntervalMs) { cc1000_metadata_t *meta = getMetadata(msg); meta->strength_or_preamble = -(int16_t)validateSleepInterval(sleepIntervalMs) - 1; } command uint16_t LowPowerListening.getRemoteWakeupInterval(message_t *msg) { cc1000_metadata_t *meta = getMetadata(msg); if (meta->strength_or_preamble >= 0) return sleepTime; else return -(meta->strength_or_preamble + 1); } void setPreambleLength(message_t * ONE msg) { cc1000_metadata_t *meta = getMetadata(msg); uint16_t s; uint32_t plen; if (meta->strength_or_preamble >= 0) s = sleepTime; else s = -(meta->strength_or_preamble + 1); meta->strength_or_preamble = 0; /* Destroy setting */ if (s == 0) plen = 6; else plen = ((s * 614UL) >> 8) + 22; /* ~ s * 2.4 + 22 */ call ByteRadio.setPreambleLength(plen); } } tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000CsmaRadioC.nc000066400000000000000000000120521207233610700215600ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * A low-power-listening CC1000 radio stack. * * Radio logic is split between Csma (media-access control, low-power * listening and general control) and SendReceive (packet reception and * transmission). * * CC1000RssiP (RSSI sharing), CC1000SquelchP (noise-floor estimation) * and CC1000ControlP (radio configuration) provide supporting roles. * * This code has some degree of platform-independence, via the HplCC1000, * RssiAdc and HplCC1000Spi interfaces which must be provided by the * platform. However, these interfaces may still reflect some * particularities of the mica2 hardware implementation. * * @author Joe Polastre * @author David Gay * @author Marco Langerwisch (Packet timestamping) */ #include "CC1000Const.h" #include "message.h" configuration CC1000CsmaRadioC { provides { interface SplitControl; interface Send; interface Receive; interface Packet; interface CsmaControl; interface CsmaBackoff; interface PacketAcknowledgements; interface LinkPacketMetadata; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface PacketTimeSyncOffset; } } implementation { components CC1000CsmaP as Csma; components CC1000SendReceiveP as SendReceive; components CC1000RssiP as Rssi; components CC1000SquelchP as Squelch; components CC1000ControlP as Control; components HplCC1000C as Hpl; components MainC, RandomC, new TimerMilliC(), ActiveMessageAddressC, BusyWaitMicroC; MainC.SoftwareInit -> Csma; MainC.SoftwareInit -> Squelch; SplitControl = Csma; Send = SendReceive; Receive = SendReceive; Packet = SendReceive; CsmaControl = Csma; CsmaBackoff = Csma; LowPowerListening = Csma; PacketAcknowledgements = SendReceive; LinkPacketMetadata = SendReceive; Csma.CC1000Control -> Control; Csma.Random -> RandomC; Csma.CC1000Squelch -> Squelch; Csma.WakeupTimer -> TimerMilliC; Csma.ByteRadio -> SendReceive; Csma.ByteRadioInit -> SendReceive; Csma.ByteRadioControl -> SendReceive; SendReceive.CC1000Control -> Control; SendReceive.HplCC1000Spi -> Hpl; SendReceive.amAddress -> ActiveMessageAddressC; SendReceive.RssiRx -> Rssi.Rssi[unique(UQ_CC1000_RSSI)]; SendReceive.CC1000Squelch -> Squelch; Csma.RssiNoiseFloor -> Rssi.Rssi[unique(UQ_CC1000_RSSI)]; Csma.RssiCheckChannel -> Rssi.Rssi[unique(UQ_CC1000_RSSI)]; Csma.RssiPulseCheck -> Rssi.Rssi[unique(UQ_CC1000_RSSI)]; Csma.cancelRssi -> Rssi; Csma.BusyWait -> BusyWaitMicroC; Rssi.ActualRssi -> Hpl; Rssi.Resource -> Hpl; Control.CC -> Hpl; Control.BusyWait -> BusyWaitMicroC; PacketTimeStamp32khz = SendReceive; PacketTimeStampMilli = SendReceive; PacketTimeSyncOffset = SendReceive; components Counter32khz32C, new CounterToLocalTimeC(T32khz); CounterToLocalTimeC.Counter -> Counter32khz32C; SendReceive.LocalTime32khz -> CounterToLocalTimeC; //DummyTimer is introduced to compile apps that use no timers components HilTimerMilliC, new TimerMilliC() as DummyTimer; SendReceive.LocalTimeMilli -> HilTimerMilliC; } tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000Msg.h000066400000000000000000000022531207233610700201720ustar00rootroot00000000000000#ifndef CC1K_RADIO_MSG_H #define CC1K_RADIO_MSG_H #include "AM.h" typedef nx_struct CC1KHeader { nx_am_addr_t dest; nx_am_addr_t source; nx_uint8_t length; nx_am_group_t group; nx_am_id_t type; } cc1000_header_t; typedef nx_struct CC1KFooter { nxle_uint16_t crc; } cc1000_footer_t; typedef enum { CC1000_ACK_BIT = 0x1, CC1000_WHITE_BIT = 0x2, /* 60 comes from the mica2 data sheet (MPR/MIB guide) and Dongjin Son's work in SenSys 2006. Son's work showed that a SINR of 6dB is sufficient for > 90% PRR. Figure 7-2 of the data sheet shows that a 6dB difference is approximately equal to a VRSSI voltage difference of 0.15V. Since the battery voltage is 2.8V (approximately), 60/1024 * 2.8 is roughly equal to 0.15. This deserves some experimental testing. -pal */ CC1000_WHITE_BIT_THRESH = 60 } CC1KMetadataBits; typedef nx_struct CC1KMetadata { nx_int16_t strength_or_preamble; /* negative when used for preamble length */ nx_uint8_t metadataBits; nx_bool timesync; nx_uint32_t timestamp; nx_uint8_t sendSecurityMode; nx_uint8_t receiveSecurityMode; } cc1000_metadata_t; enum { CC1000_INVALID_TIMESTAMP = 0x80000000L, }; #endif tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000RssiP.nc000066400000000000000000000076441207233610700206660ustar00rootroot00000000000000/* $Id: CC1000RssiP.nc,v 1.8 2010-06-29 22:07:44 scipio Exp $ * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * RSSI fun. It's used for lots of things, and a request to read it * for one purpose may have to be discarded if conditions change. For * example, if we've initiated a noise-floor measure, but start * receiving a packet, we have to:

      *
    • cancel the noise-floor measure (we don't know if the value will * reflect the received packet or the previous idle state) *
    • start an RSSI measurement so that we can report signal strength * to the application *

    * This module hides the complexities of cancellation from the rest of * the stack. */ module CC1000RssiP @safe() { provides { interface ReadNow as Rssi[uint8_t reason]; async command void cancel(); } uses { interface Resource; interface ReadNow as ActualRssi; } } implementation { enum { IDLE = unique(UQ_CC1000_RSSI), CANCELLED = unique(UQ_CC1000_RSSI) }; /* All commands are called within atomic sections */ uint8_t currentOp = IDLE; uint8_t nextOp; async command void cancel() { if (currentOp != IDLE) currentOp = CANCELLED; } event void Resource.granted() { call ActualRssi.read(); } async command error_t Rssi.read[uint8_t reason]() { if (currentOp == IDLE) { currentOp = reason; if (call Resource.immediateRequest() == SUCCESS) call ActualRssi.read(); else call Resource.request(); } else nextOp = reason; return SUCCESS; } void startNextOp() { currentOp = nextOp; if (nextOp != IDLE) { nextOp = IDLE; call ActualRssi.read(); } else call Resource.release(); } async event void ActualRssi.readDone(error_t result, uint16_t data) { atomic { /* The RSSI measurements are assumed to be 10-bits */ signal Rssi.readDone[currentOp](result, data); startNextOp(); } } default async event void Rssi.readDone[uint8_t reason](error_t result, uint16_t data) { } } tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000SendReceiveP.nc000066400000000000000000000516111207233610700221330ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "message.h" #include "crc.h" #include "CC1000Const.h" #include "Timer.h" #include "CC1000TimeSyncMessage.h" /** * A rewrite of the low-power-listening CC1000 radio stack. * This file contains the send and receive logic for the CC1000 radio. * It does not do any media-access control. It requests the channel * via the ready-to-send event (rts) and starts transmission on reception * of the clear-to-send command (cts). It listens for packets if the * listen() command is called, and stops listening when off() is called. *

    * This code has some degree of platform-independence, via the * CC1000Control, RSSIADC and SpiByteFifo interfaces which must be provided * by the platform. However, these interfaces may still reflect some * particularities of the mica2 hardware implementation. * * @author Philip Buonadonna * @author Jaein Jeong * @author Joe Polastre * @author David Gay * @author Marco Langerwisch (Packet timestamping) */ module CC1000SendReceiveP @safe() { provides { interface Init; interface StdControl; interface Send; interface Receive; interface Packet; interface ByteRadio; interface PacketAcknowledgements; interface LinkPacketMetadata; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface PacketTimeSyncOffset; } uses { //interface PowerManagement; interface CC1000Control; interface HplCC1000Spi; interface CC1000Squelch; interface ReadNow as RssiRx; async command am_addr_t amAddress(); interface LocalTime as LocalTime32khz; interface LocalTime as LocalTimeMilli; } } implementation { #ifdef PLATFORM_MICA2 // estimated calibration, 19.2 Kbps data, Manchester Encoding, time in jiffies (32768 Hz) static const int8_t BIT_CORRECTION[8] = { 27, 28, 30, 32, 34, 36, 38, 40 }; #else // other platforms not calibrated yet static const uint8_t BIT_CORRECTION[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; #endif enum { OFF_STATE, INACTIVE_STATE, /* Not listening, but will accept sends */ LISTEN_STATE, /* Listening for packets */ /* Reception states */ SYNC_STATE, RX_STATE, RECEIVED_STATE, SENDING_ACK, /* Transmission states */ TXPREAMBLE_STATE, TXSYNC_STATE, TXDATA_STATE, TXCRC_STATE, TXFLUSH_STATE, TXWAITFORACK_STATE, TXREADACK_STATE, TXDONE_STATE, }; enum { SYNC_BYTE1 = 0x33, SYNC_BYTE2 = 0xcc, SYNC_WORD = SYNC_BYTE1 << 8 | SYNC_BYTE2, ACK_BYTE1 = 0xba, ACK_BYTE2 = 0x83, ACK_WORD = ACK_BYTE1 << 8 | ACK_BYTE2, ACK_LENGTH = 16, MAX_ACK_WAIT = 18 }; uint8_t radioState; struct { uint8_t ack : 1; /* acks enabled? */ uint8_t txBusy : 1; /* send pending? */ uint8_t invert : 1; /* data inverted? (see cc1000 datasheet) */ uint8_t rxBitOffset : 3; /* bit-offset of received bytes */ } f; // f for flags uint16_t count; uint16_t runningCrc; uint16_t rxShiftBuf; message_t rxBuf; message_t * ONE rxBufPtr = &rxBuf; uint16_t preambleLength; message_t * ONE_NOK txBufPtr; uint8_t nextTxByte; const_uint8_t ackCode[5] = { 0xab, ACK_BYTE1, ACK_BYTE2, 0xaa, 0xaa }; /* Packet structure accessor functions. Note that everything is * relative to the data field. */ cc1000_header_t * ONE getHeader(message_t * ONE amsg) { return TCAST(cc1000_header_t * ONE, (uint8_t *)amsg + offsetof(message_t, data) - sizeof(cc1000_header_t)); } cc1000_footer_t *getFooter(message_t * ONE amsg) { return (cc1000_footer_t *)(amsg->footer); } cc1000_metadata_t * ONE getMetadata(message_t * ONE amsg) { return TCAST(cc1000_metadata_t * ONE, (uint8_t *)amsg + offsetof(message_t, footer) + sizeof(cc1000_footer_t)); } /* State transition functions */ /*----------------------------*/ void enterOffState() { radioState = OFF_STATE; } void enterInactiveState() { radioState = INACTIVE_STATE; } void enterListenState() { radioState = LISTEN_STATE; count = 0; } void enterSyncState() { radioState = SYNC_STATE; count = 0; rxShiftBuf = 0; } void enterRxState() { cc1000_header_t *header = getHeader(rxBufPtr); radioState = RX_STATE; header->length = sizeof rxBufPtr->data; count = sizeof(message_header_t) - sizeof(cc1000_header_t); runningCrc = 0; } void enterReceivedState() { radioState = RECEIVED_STATE; } void enterAckState() { radioState = SENDING_ACK; count = 0; } void enterTxPreambleState() { radioState = TXPREAMBLE_STATE; count = 0; runningCrc = 0; nextTxByte = 0xaa; } void enterTxSyncState() { radioState = TXSYNC_STATE; } void enterTxDataState() { radioState = TXDATA_STATE; // The count increment happens before the first byte is read from the // packet, so we subtract one from the real packet start point to // compensate. count = (sizeof(message_header_t) - sizeof(cc1000_header_t)) -1; } void enterTxCrcState() { radioState = TXCRC_STATE; } void enterTxFlushState() { radioState = TXFLUSH_STATE; count = 0; } void enterTxWaitForAckState() { radioState = TXWAITFORACK_STATE; count = 0; } void enterTxReadAckState() { radioState = TXREADACK_STATE; rxShiftBuf = 0; count = 0; } void enterTxDoneState() { radioState = TXDONE_STATE; } command error_t Init.init() { f.ack = TRUE; /* We always ack, for now at least */ call HplCC1000Spi.initSlave(); return SUCCESS; } command error_t StdControl.start() { atomic { enterInactiveState(); f.txBusy = FALSE; f.invert = call CC1000Control.getLOStatus(); } return SUCCESS; } command error_t StdControl.stop() { atomic enterOffState(); return SUCCESS; } /* Send side. Outside requests, SPI handlers for each state */ /*----------------------------------------------------------*/ command error_t Send.send(message_t *msg, uint8_t len) { atomic { if (f.txBusy || radioState == OFF_STATE) return FAIL; else { cc1000_header_t *header = getHeader(msg); cc1000_metadata_t *metadata = getMetadata(msg); f.txBusy = TRUE; header->length = len; txBufPtr = msg; metadata->timesync = FALSE; metadata->timestamp = CC1000_INVALID_TIMESTAMP; } } signal ByteRadio.rts(msg); return SUCCESS; } async command void ByteRadio.cts() { /* We're set to go! Start with our exciting preamble... */ enterTxPreambleState(); call HplCC1000Spi.writeByte(0xaa); call CC1000Control.txMode(); call HplCC1000Spi.txMode(); } command error_t Send.cancel(message_t *msg) { /* We simply ignore cancellations. */ return FAIL; } void sendNextByte() { call HplCC1000Spi.writeByte(nextTxByte); count++; } void txPreamble() { sendNextByte(); if (count >= preambleLength) { nextTxByte = SYNC_BYTE1; enterTxSyncState(); } } void txSync() { sendNextByte(); nextTxByte = SYNC_BYTE2; enterTxDataState(); } void txData() { cc1000_header_t *txHeader = getHeader(txBufPtr); sendNextByte(); if (nextTxByte == SYNC_BYTE2) { // SYNC_WORD has just been sent uint32_t time32khz = call LocalTime32khz.get(); call PacketTimeStamp32khz.set(txBufPtr, time32khz); if (call PacketTimeSyncOffset.isSet(txBufPtr)) { timesync_radio_t *timesync = (timesync_radio_t*)((void*)txBufPtr + call PacketTimeSyncOffset.get(txBufPtr)); // set timesync event time as the offset between the event time and the SFD interrupt time (TEP 133) *timesync -= time32khz; } } if (count < txHeader->length + sizeof(message_header_t)) { nextTxByte = ((uint8_t *)txBufPtr)[count]; runningCrc = crcByte(runningCrc, nextTxByte); } else { nextTxByte = runningCrc; enterTxCrcState(); } } void txCrc() { sendNextByte(); nextTxByte = runningCrc >> 8; enterTxFlushState(); } void txFlush() { sendNextByte(); if (count > 3) if (f.ack) enterTxWaitForAckState(); else { call HplCC1000Spi.rxMode(); call CC1000Control.rxMode(); enterTxDoneState(); } } void txWaitForAck() { sendNextByte(); if (count == 1) { call HplCC1000Spi.rxMode(); call CC1000Control.rxMode(); } else if (count > 3) enterTxReadAckState(); } void txReadAck(uint8_t in) { uint8_t i; sendNextByte(); for (i = 0; i < 8; i ++) { rxShiftBuf <<= 1; if (in & 0x80) rxShiftBuf |= 0x1; in <<= 1; if (rxShiftBuf == ACK_WORD) { getMetadata(txBufPtr)->metadataBits |= CC1000_ACK_BIT; enterTxDoneState(); return; } } if (count >= MAX_ACK_WAIT) { getMetadata(txBufPtr)->metadataBits &= ~CC1000_ACK_BIT; enterTxDoneState(); } } task void signalPacketSent() { message_t *pBuf; atomic { pBuf = txBufPtr; f.txBusy = FALSE; enterListenState(); } signal Send.sendDone(pBuf, SUCCESS); } void txDone() { post signalPacketSent(); signal ByteRadio.sendDone(); } /* Receive */ /*---------*/ void packetReceived(); void packetReceiveDone(); async command void ByteRadio.listen() { enterListenState(); call CC1000Control.rxMode(); call HplCC1000Spi.rxMode(); call HplCC1000Spi.enableIntr(); } async command void ByteRadio.off() { enterInactiveState(); call HplCC1000Spi.disableIntr(); } void listenData(uint8_t in) { bool preamble = in == 0xaa || in == 0x55; // Look for enough preamble bytes if (preamble) { count++; if (count > CC1K_ValidPrecursor) enterSyncState(); } else count = 0; signal ByteRadio.idleByte(preamble); } void syncData(uint8_t in) { // draw in the preamble bytes and look for a sync byte // save the data in a short with last byte received as msbyte // and current byte received as the lsbyte. // use a bit shift compare to find the byte boundary for the sync byte // retain the shift value and use it to collect all of the packet data // check for data inversion, and restore proper polarity // XXX-PB: Don't do this. if (in == 0xaa || in == 0x55) // It is actually possible to have the LAST BIT of the incoming // data be part of the Sync Byte. SO, we need to store that // However, the next byte should definitely not have this pattern. // XXX-PB: Do we need to check for excessive preamble? rxShiftBuf = in << 8; else if (count++ == 0) rxShiftBuf |= in; else if (count <= 6) { // TODO: Modify to be tolerant of bad bits in the preamble... uint32_t time; uint16_t tmp; uint8_t i; time = call LocalTime32khz.get(); // bit shift the data in with previous sample to find sync tmp = rxShiftBuf; rxShiftBuf = rxShiftBuf << 8 | in; for(i = 0; i < 8; i++) { tmp <<= 1; if (in & 0x80) tmp |= 0x1; in <<= 1; // check for sync bytes if (tmp == SYNC_WORD) { enterRxState(); signal ByteRadio.rx(); f.rxBitOffset = 7 - i; // correct receive time according to bit offset and set timestamp time -= BIT_CORRECTION[f.rxBitOffset]; call PacketTimeStamp32khz.set(rxBufPtr, time); call RssiRx.read(); } } } else // We didn't find it after a reasonable number of tries, so.... enterListenState(); } async event void RssiRx.readDone(error_t result, uint16_t data) { cc1000_metadata_t *rxMetadata = getMetadata(rxBufPtr); if (result != SUCCESS) rxMetadata->strength_or_preamble = 0; else rxMetadata->strength_or_preamble = data; } void rxData(uint8_t in) { uint8_t nextByte; cc1000_header_t *rxHeader = getHeader(rxBufPtr); uint8_t rxLength = rxHeader->length; // Reject invalid length packets if (rxLength > TOSH_DATA_LENGTH) { // The packet's screwed up, so just dump it enterListenState(); signal ByteRadio.rxDone(); return; } rxShiftBuf = rxShiftBuf << 8 | in; nextByte = rxShiftBuf >> f.rxBitOffset; ((uint8_t *COUNT(sizeof(message_t)))rxBufPtr)[count++] = nextByte; // Adjust rxLength to correspond to the corresponding offset in message_t rxLength += offsetof(message_t, data); if (count <= rxLength) runningCrc = crcByte(runningCrc, nextByte); // Jump to CRC when we reach the end of data if (count == rxLength) { count = offsetof(message_t, footer) + offsetof(cc1000_footer_t, crc); } if (count == (offsetof(message_t, footer) + sizeof(cc1000_footer_t))) packetReceived(); } void packetReceived() { cc1000_footer_t *rxFooter = getFooter(rxBufPtr); cc1000_header_t *rxHeader = getHeader(rxBufPtr); // Packet filtering based on bad CRC's is done at higher layers. // So sayeth the TOS weenies. rxFooter->crc = (rxFooter->crc == runningCrc); if (f.ack && rxFooter->crc && rxHeader->dest == call amAddress()) { enterAckState(); call CC1000Control.txMode(); call HplCC1000Spi.txMode(); call HplCC1000Spi.writeByte(0xaa); } else packetReceiveDone(); } void ackData(uint8_t in) { if (++count >= ACK_LENGTH) { call CC1000Control.rxMode(); call HplCC1000Spi.rxMode(); packetReceiveDone(); } else if (count >= ACK_LENGTH - sizeof ackCode) call HplCC1000Spi.writeByte(read_uint8_t(&ackCode[count + sizeof ackCode - ACK_LENGTH])); } task void signalPacketReceived() { message_t *pBuf; cc1000_header_t *pHeader; atomic { if (radioState != RECEIVED_STATE) return; pBuf = rxBufPtr; } pHeader = getHeader(pBuf); pBuf = signal Receive.receive(pBuf, pBuf->data, pHeader->length); atomic { if (pBuf) rxBufPtr = pBuf; if (radioState == RECEIVED_STATE) // receiver might've done something enterListenState(); signal ByteRadio.rxDone(); } } void packetReceiveDone() { uint16_t snr; snr = (uint16_t) getMetadata(rxBufPtr)->strength_or_preamble; /* Higher signal strengths have lower voltages. So see if we're CC1000_WHITE_BIT_THRESH *below* the noise floor. */ if ((snr + CC1000_WHITE_BIT_THRESH) < ((call CC1000Squelch.get()))) { getMetadata(rxBufPtr)->metadataBits |= CC1000_WHITE_BIT; } else { getMetadata(rxBufPtr)->metadataBits &= ~CC1000_WHITE_BIT; } post signalPacketReceived(); enterReceivedState(); } async event void HplCC1000Spi.dataReady(uint8_t data) { if (f.invert) data = ~data; switch (radioState) { default: break; case TXPREAMBLE_STATE: txPreamble(); break; case TXSYNC_STATE: txSync(); break; case TXDATA_STATE: txData(); break; case TXCRC_STATE: txCrc(); break; case TXFLUSH_STATE: txFlush(); break; case TXWAITFORACK_STATE: txWaitForAck(); break; case TXREADACK_STATE: txReadAck(data); break; case TXDONE_STATE: txDone(); break; case LISTEN_STATE: listenData(data); break; case SYNC_STATE: syncData(data); break; case RX_STATE: rxData(data); break; case SENDING_ACK: ackData(data); break; } } /* Interaction with rest of stack */ /*--------------------------------*/ async command void ByteRadio.setPreambleLength(uint16_t bytes) { atomic preambleLength = bytes; } async command uint16_t ByteRadio.getPreambleLength() { atomic return preambleLength; } async command message_t *ByteRadio.getTxMessage() { return txBufPtr; } async command bool ByteRadio.syncing() { return radioState == SYNC_STATE; } /* Abstract packet layout */ command void Packet.clear(message_t *msg) { memset(getHeader(msg), 0x0, sizeof(cc1000_header_t)); memset(getFooter(msg), 0x0, sizeof(cc1000_footer_t)); memset(getMetadata(msg), 0x0, sizeof(cc1000_metadata_t)); } command uint8_t Packet.payloadLength(message_t *msg) { cc1000_header_t *header = getHeader(msg); return header->length; } command void Packet.setPayloadLength(message_t *msg, uint8_t len) { getHeader(msg)->length = len; } command uint8_t Packet.maxPayloadLength() { return TOSH_DATA_LENGTH; } command void* Packet.getPayload(message_t *msg, uint8_t len) { if (len <= TOSH_DATA_LENGTH) { return (void* COUNT_NOK(len))msg->data; } else { return NULL; } } async command error_t PacketAcknowledgements.requestAck(message_t *msg) { return SUCCESS; /* We always ack. */ } async command error_t PacketAcknowledgements.noAck(message_t *msg) { return FAIL; /* We always ack */ } command uint8_t Send.maxPayloadLength() { return call Packet.maxPayloadLength(); } command void* Send.getPayload(message_t *m, uint8_t len) { return call Packet.getPayload(m, len); } async command bool PacketAcknowledgements.wasAcked(message_t *msg) { return getMetadata(msg)->metadataBits & CC1000_ACK_BIT; } async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) { return getMetadata(msg)->metadataBits & CC1000_WHITE_BIT; } /***************** PacketTimeStamp32khz Commands ****************/ async command bool PacketTimeStamp32khz.isValid(message_t* msg) { return (getMetadata(msg)->timestamp != CC1000_INVALID_TIMESTAMP); } async command uint32_t PacketTimeStamp32khz.timestamp(message_t* msg) { return getMetadata(msg)->timestamp; } async command void PacketTimeStamp32khz.clear(message_t* msg) { getMetadata(msg)->timesync = FALSE; getMetadata(msg)->timestamp = CC1000_INVALID_TIMESTAMP; } async command void PacketTimeStamp32khz.set(message_t* msg, uint32_t value) { getMetadata(msg)->timestamp = value; } /***************** PacketTimeStampMilli Commands ****************/ // over the air value is always T32khz async command bool PacketTimeStampMilli.isValid(message_t* msg) { return call PacketTimeStamp32khz.isValid(msg); } async command uint32_t PacketTimeStampMilli.timestamp(message_t* msg) { int32_t offset = call PacketTimeStamp32khz.timestamp(msg) - call LocalTime32khz.get(); return (offset >> 5) + call LocalTimeMilli.get(); } async command void PacketTimeStampMilli.clear(message_t* msg) { call PacketTimeStamp32khz.clear(msg); } async command void PacketTimeStampMilli.set(message_t* msg, uint32_t value) { int32_t offset = (value - call LocalTimeMilli.get()) << 5; call PacketTimeStamp32khz.set(msg, offset + call LocalTime32khz.get()); } /*----------------- PacketTimeSyncOffset -----------------*/ async command bool PacketTimeSyncOffset.isSet(message_t* msg) { return getMetadata(msg)->timesync; } async command uint8_t PacketTimeSyncOffset.get(message_t* msg) { return sizeof(cc1000_header_t) + getHeader(msg)->length - sizeof(timesync_radio_t); } async command void PacketTimeSyncOffset.set(message_t* msg) { getMetadata(msg)->timesync = TRUE; } async command void PacketTimeSyncOffset.cancel(message_t* msg) { getMetadata(msg)->timesync = FALSE; } } tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000Squelch.nc000066400000000000000000000051221207233610700212170ustar00rootroot00000000000000/* $Id: CC1000Squelch.nc,v 1.5 2010-06-29 22:07:44 scipio Exp $ * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * CC1000 internal noise floor (aka squelch value) interface * @author David Gay */ interface CC1000Squelch { /** * Adjust noise floor based on new noise measurement * @param data noise measurement */ command void adjust(uint16_t data); /** * Return current estimated noise floor * @return Noise floor value */ async command uint16_t get(); /** * Check if noise floor estimate is considered stable (typically after * some number of measurements) * @return TRUE if noise floor estimate considered stable, FALSE otherwise */ command bool settled(); } tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000SquelchP.nc000066400000000000000000000070351207233610700213440ustar00rootroot00000000000000/* $Id: CC1000SquelchP.nc,v 1.6 2010-06-29 22:07:44 scipio Exp $ * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "CC1000Const.h" /** * Clear threshold estimation based on RSSI measurements. * * @author Philip Buonadonna * @author Jaein Jeong * @author Joe Polastre * @author David Gay */ module CC1000SquelchP @safe() { provides { interface Init; interface CC1000Squelch; } } implementation { uint16_t clearThreshold = CC1K_SquelchInit; uint16_t squelchTable[CC1K_SquelchTableSize]; uint8_t squelchIndex, squelchCount; command error_t Init.init() { uint8_t i; for (i = 0; i < CC1K_SquelchTableSize; i++) squelchTable[i] = CC1K_SquelchInit; return SUCCESS; } command void CC1000Squelch.adjust(uint16_t data) { uint16_t squelchTab[CC1K_SquelchTableSize]; uint8_t i, j, min; uint32_t newThreshold; squelchTable[squelchIndex++] = data; if (squelchIndex >= CC1K_SquelchTableSize) squelchIndex = 0; if (squelchCount <= CC1K_SquelchCount) squelchCount++; // Find 3rd highest (aka lowest signal strength) value memcpy(squelchTab, squelchTable, sizeof squelchTable); for (j = 0; ; j++) { min = 0; for (i = 1; i < CC1K_SquelchTableSize; i++) if (squelchTab[i] > squelchTab[min]) min = i; if (j == 3) break; squelchTab[min] = 0; } newThreshold = ((uint32_t)clearThreshold << 5) + ((uint32_t)squelchTab[min] << 1); atomic clearThreshold = newThreshold / 34; } async command uint16_t CC1000Squelch.get() { return clearThreshold; } command bool CC1000Squelch.settled() { return squelchCount > CC1K_SquelchCount; } } tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000TimeSyncMessage.h000066400000000000000000000033671207233610700225130ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __TIMESYNCMESSAGE_H__ #define __TIMESYNCMESSAGE_H__ // this value is sent in the air typedef nx_uint32_t timesync_radio_t; #endif//__TIMESYNCMESSAGE_H__ tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000TimeSyncMessageC.nc000066400000000000000000000077041207233610700227660ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The Active Message layer for the CC1000 radio with timesync support. This * configuration is just layer above CC1000ActiveMessageC that supports * TimeSyncPacket and TimeSyncAMSend interfaces (TEP 133) * * @author: Miklos Maroti * @author: Brano Kusy (CC2420 port) * @author: Marco Langerwisch (CC1000 port) */ #include #include configuration CC1000TimeSyncMessageC { provides { interface SplitControl; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSend32khz[am_id_t id]; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC1000TimeSyncMessageP, CC1000ActiveMessageC, LedsC; PacketTimeStamp32khz = CC1000ActiveMessageC; PacketTimeStampMilli = CC1000ActiveMessageC; TimeSyncAMSend32khz = CC1000TimeSyncMessageP; TimeSyncPacket32khz = CC1000TimeSyncMessageP; TimeSyncAMSendMilli = CC1000TimeSyncMessageP; TimeSyncPacketMilli = CC1000TimeSyncMessageP; Packet = CC1000TimeSyncMessageP; CC1000TimeSyncMessageP.SubSend -> CC1000ActiveMessageC.AMSend; CC1000TimeSyncMessageP.SubPacket -> CC1000ActiveMessageC.Packet; CC1000TimeSyncMessageP.PacketTimeStamp32khz -> CC1000ActiveMessageC; CC1000TimeSyncMessageP.PacketTimeStampMilli -> CC1000ActiveMessageC; CC1000TimeSyncMessageP.PacketTimeSyncOffset -> CC1000ActiveMessageC; components Counter32khz32C, new CounterToLocalTimeC(T32khz) as LocalTime32khzC, LocalTimeMilliC; LocalTime32khzC.Counter -> Counter32khz32C; CC1000TimeSyncMessageP.LocalTime32khz -> LocalTime32khzC; CC1000TimeSyncMessageP.LocalTimeMilli -> LocalTimeMilliC; CC1000TimeSyncMessageP.Leds -> LedsC; SplitControl = CC1000ActiveMessageC; Receive = CC1000ActiveMessageC.Receive; Snoop = CC1000ActiveMessageC.Snoop; AMPacket = CC1000ActiveMessageC; } tinyos-2.1.2+dfsg/tos/chips/cc1000/CC1000TimeSyncMessageP.nc000066400000000000000000000155461207233610700230060ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti * @author: Brano Kusy (CC2420 port) * @author: Marco Langerwisch (CC1000 port) */ #include "CC1000TimeSyncMessage.h" module CC1000TimeSyncMessageP { provides { interface TimeSyncAMSend as TimeSyncAMSend32khz[uint8_t id]; interface TimeSyncAMSend as TimeSyncAMSendMilli[uint8_t id]; interface Packet; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncPacket as TimeSyncPacketMilli; } uses { interface AMSend as SubSend[uint8_t id]; interface Packet as SubPacket; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface PacketTimeSyncOffset; interface LocalTime as LocalTime32khz; interface LocalTime as LocalTimeMilli; interface Leds; } } implementation { // TODO: change the Packet.payloadLength and Packet.maxPayloadLength commands to async inline void* getFooter(message_t* msg) { // we use the payload length that we export (the smaller one) return msg->data + call Packet.payloadLength(msg); } /*----------------- Packet -----------------*/ command void Packet.clear(message_t* msg) { call PacketTimeSyncOffset.cancel(msg); call SubPacket.clear(msg); } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call SubPacket.setPayloadLength(msg, len + sizeof(timesync_radio_t)); } command uint8_t Packet.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg) - sizeof(timesync_radio_t); } command uint8_t Packet.maxPayloadLength() { return call SubPacket.maxPayloadLength() - sizeof(timesync_radio_t); } command void* Packet.getPayload(message_t* msg, uint8_t len) { return call SubPacket.getPayload(msg, len + sizeof(timesync_radio_t)); } /*----------------- TimeSyncAMSend32khz -----------------*/ command error_t TimeSyncAMSend32khz.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len, uint32_t event_time) { error_t err; timesync_radio_t* timesync = (timesync_radio_t*)(msg->data + len); *timesync = event_time; err = call SubSend.send[id](addr, msg, len + sizeof(timesync_radio_t)); call PacketTimeSyncOffset.set(msg); return err; } command error_t TimeSyncAMSend32khz.cancel[am_id_t id](message_t* msg) { call PacketTimeSyncOffset.cancel(msg); return call SubSend.cancel[id](msg); } default event void TimeSyncAMSend32khz.sendDone[am_id_t id](message_t* msg, error_t error) {} command uint8_t TimeSyncAMSend32khz.maxPayloadLength[am_id_t id]() { return call SubSend.maxPayloadLength[id]() - sizeof(timesync_radio_t); } command void* TimeSyncAMSend32khz.getPayload[am_id_t id](message_t* msg, uint8_t len) { return call SubSend.getPayload[id](msg, len + sizeof(timesync_radio_t)); } /*----------------- TimeSyncAMSendMilli -----------------*/ command error_t TimeSyncAMSendMilli.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len, uint32_t event_time) { // compute elapsed time in millisecond event_time = ((event_time - call LocalTimeMilli.get()) << 5) + call LocalTime32khz.get(); return call TimeSyncAMSend32khz.send[id](addr, msg, len, event_time); } command error_t TimeSyncAMSendMilli.cancel[am_id_t id](message_t* msg) { return call TimeSyncAMSend32khz.cancel[id](msg); } default event void TimeSyncAMSendMilli.sendDone[am_id_t id](message_t* msg, error_t error){} command uint8_t TimeSyncAMSendMilli.maxPayloadLength[am_id_t id]() { return call TimeSyncAMSend32khz.maxPayloadLength[id](); } command void* TimeSyncAMSendMilli.getPayload[am_id_t id](message_t* msg, uint8_t len) { return call TimeSyncAMSend32khz.getPayload[id](msg, len); } /*----------------- SubSend.sendDone -------------------*/ event void SubSend.sendDone[am_id_t id](message_t* msg, error_t error) { signal TimeSyncAMSend32khz.sendDone[id](msg, error); signal TimeSyncAMSendMilli.sendDone[id](msg, error); } /*----------------- TimeSyncPacket32khz -----------------*/ command bool TimeSyncPacket32khz.isValid(message_t* msg) { timesync_radio_t* timesync = getFooter(msg); return call PacketTimeStamp32khz.isValid(msg) && *timesync != CC1000_INVALID_TIMESTAMP; } command uint32_t TimeSyncPacket32khz.eventTime(message_t* msg) { timesync_radio_t* timesync = getFooter(msg); return (uint32_t)(*timesync) + call PacketTimeStamp32khz.timestamp(msg); } /*----------------- TimeSyncPacketMilli -----------------*/ command bool TimeSyncPacketMilli.isValid(message_t* msg) { timesync_radio_t* timesync = getFooter(msg); return call PacketTimeStampMilli.isValid(msg) && *timesync != CC1000_INVALID_TIMESTAMP; } command uint32_t TimeSyncPacketMilli.eventTime(message_t* msg) { timesync_radio_t* timesync = getFooter(msg); return ((int32_t)(*timesync) >> 5) + call PacketTimeStampMilli.timestamp(msg); } } tinyos-2.1.2+dfsg/tos/chips/cc1000/CsmaControl.nc000066400000000000000000000040721207233610700213330ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface for activating/deactivating congestion control. * * @author Philip Levis * @author Joe Polastre * @date August 31 2005 */ interface CsmaControl { /** * Enable congestion control. * @return SUCCESS if congestion control enabled, FAIL otherwise. */ async command error_t enableCca(); /** * Disable congestion control. * @return SUCCESS if congestion control disabled, FAIL otherwise. */ async command error_t disableCca(); } tinyos-2.1.2+dfsg/tos/chips/cc1000/HplCC1000.nc000066400000000000000000000055511207233610700203440ustar00rootroot00000000000000// $Id: HplCC1000.nc,v 1.6 2010-06-29 22:07:44 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Authors: Jason Hill, David Gay, Philip Levis * Date last modified: 6/25/02 * * */ /** * Low-level CC1000 radio-access operations that must be provided by a * platform wishing to use this CC1000 implementation. * * @author Jason Hill * @author David Gay * @author Philip Levis */ interface HplCC1000 { /** * Initialize CC1K pins */ command void init(); /** * Write a value to a CC1000 register. * @param addr Which CC1000 register * @param data Value to write */ async command void write(uint8_t addr, uint8_t data); /** * Read a value from a CC1000 register. * @param addr Which CC1000 register * @return Value of register */ async command uint8_t read(uint8_t addr); /** * Read the state of the CHP_OUT pin * @return State of CHP_OUT as a boolean (TRUE for high) */ async command bool getLOCK(); } tinyos-2.1.2+dfsg/tos/chips/cc1000/HplCC1000Spi.nc000066400000000000000000000067651207233610700210300ustar00rootroot00000000000000// $Id: HplCC1000Spi.nc,v 1.6 2010-06-29 22:07:44 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Interface to the CC1000 chip's serial bus. This isn't really an SPI, * but the mica2 interface was done using the Atmega128 SPI hardware. Hence * the name. * * @author Jaein Jeong * @author Philip buonadonna */ interface HplCC1000Spi { /** * Write a byte to the CC1000 bus. * @param data Byte to write. */ async command void writeByte(uint8_t data); /** * Is write buffer busy with the last transmission? * @return TRUE if the buffer is busy, FALSE otherwise. */ async command bool isBufBusy(); /** * Get the last byte received from the CC1000 bus. * @return Last byte received. */ async command uint8_t readByte(); /** * Enable dataReady events on every byte sent or received from the CC1000 * bus. After this is called, dataReady events will be signaled every * 8 CC1000 data clocks. */ async command void enableIntr(); /** * Disable CC1000 bus interrupts. */ async command void disableIntr(); /** * Initialise the interface to the CC1000 bus. */ async command void initSlave(); /** * Switch the interface to the CC1000 bus "transmit" mode. */ async command void txMode(); /** * Switch the interface to the CC1000 bus to "receive" mode. */ async command void rxMode(); /** * If enableIntr() is called, this event will be signaled every 8 CC1000 * data clocks. * @param data In "receive" mode, the last value received from the CC1000 * bus. */ async event void dataReady(uint8_t data); } tinyos-2.1.2+dfsg/tos/chips/cc1000/PacketTimeSyncOffset.nc000066400000000000000000000056201207233610700231410ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti, Brano Kusy * * Interface for one hop time synchronization. Allows to modify timesync * messages in the MAC layer with elapsed time of an event (ETA timesync * primitive). Interface also provides a command to determine offset within * a CC1000 packet, where the timesync ETA value is stored. word 'timestamping' * used in describing commands does not refer to metadata.timestamp value, * rather it refers to the timesync ETA timestamp which is part of data * payload and is transmitted over the air. */ interface PacketTimeSyncOffset { /** * @param 'message_t *ONE msg' message to examine. * * Returns TRUE if the current message should be timestamped. */ async command bool isSet(message_t* msg); /** * @param 'message_t *ONE msg' message to examine. * * Returns the offset of where the timesync timestamp is sotred in a * CC2420 packet */ async command uint8_t get(message_t* msg); /** * @param 'message_t *ONE msg' message to modify. * * Sets the current message to be timestamped in the MAC layer. */ async command void set(message_t* msg); /** * @param 'message_t *ONE msg' message to modify. * * Cancels any pending requests to timestamp the message in MAC. */ async command void cancel(message_t* msg); } tinyos-2.1.2+dfsg/tos/chips/cc2420/000077500000000000000000000000001207233610700165715ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/CC2420.h000066400000000000000000000267141207233610700175510ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * * @author Jonathan Hui * @author David Moss * @version $Revision: 1.19 $ $Date: 2009-09-17 23:36:36 $ */ #ifndef __CC2420_H__ #define __CC2420_H__ typedef uint8_t cc2420_status_t; #if defined(TFRAMES_ENABLED) && defined(IEEE154FRAMES_ENABLED) #error "Both TFRAMES and IEEE154FRAMES enabled!" #endif /** * CC2420 header definition. * * An I-frame (interoperability frame) header has an extra network * byte specified by 6LowPAN * * Length = length of the header + payload of the packet, minus the size * of the length byte itself (1). This is what allows for variable * length packets. * * FCF = Frame Control Field, defined in the 802.15.4 specs and the * CC2420 datasheet. * * DSN = Data Sequence Number, a number incremented for each packet sent * by a particular node. This is used in acknowledging that packet, * and also filtering out duplicate packets. * * DestPan = The destination PAN (personal area network) ID, so your * network can sit side by side with another TinyOS network and not * interfere. * * Dest = The destination address of this packet. 0xFFFF is the broadcast * address. * * Src = The local node ID that generated the message. * * Network = The TinyOS network ID, for interoperability with other types * of 802.15.4 networks. * * Type = TinyOS AM type. When you create a new AMSenderC(AM_MYMSG), * the AM_MYMSG definition is the type of packet. * * TOSH_DATA_LENGTH defaults to 28, it represents the maximum size of * the payload portion of the packet, and is specified in the * tos/types/message.h file. * * All of these fields will be filled in automatically by the radio stack * when you attempt to send a message. */ /** * CC2420 Security Header */ typedef nx_struct security_header_t { nx_uint8_t secLevel:3; nx_uint8_t keyMode:2; nx_uint8_t reserved:3; nx_uint32_t frameCounter; nx_uint8_t keyID[1]; // One byte for now } security_header_t; typedef nx_struct cc2420_header_t { nxle_uint8_t length; nxle_uint16_t fcf; nxle_uint8_t dsn; nxle_uint16_t destpan; nxle_uint16_t dest; nxle_uint16_t src; /** CC2420 802.15.4 header ends here */ #ifdef CC2420_HW_SECURITY security_header_t secHdr; #endif #ifndef TFRAMES_ENABLED /** I-Frame 6LowPAN interoperability byte */ nxle_uint8_t network; #endif nxle_uint8_t type; } cc2420_header_t; /** * CC2420 Packet Footer */ typedef nx_struct cc2420_footer_t { } cc2420_footer_t; /** * CC2420 Packet metadata. Contains extra information about the message * that will not be transmitted. * * Note that the first two bytes automatically take in the values of the * FCS when the payload is full. Do not modify the first two bytes of metadata. */ typedef nx_struct cc2420_metadata_t { nx_uint8_t rssi; nx_uint8_t lqi; nx_uint8_t tx_power; nx_bool crc; nx_bool ack; nx_bool timesync; nx_uint32_t timestamp; nx_uint16_t rxInterval; /** Packet Link Metadata */ #ifdef PACKET_LINK nx_uint16_t maxRetries; nx_uint16_t retryDelay; #endif } cc2420_metadata_t; typedef nx_struct cc2420_packet_t { cc2420_header_t packet; nx_uint8_t data[]; } cc2420_packet_t; #ifndef TOSH_DATA_LENGTH #define TOSH_DATA_LENGTH 28 #endif #ifndef CC2420_DEF_CHANNEL #define CC2420_DEF_CHANNEL 26 #endif #ifndef CC2420_DEF_RFPOWER #define CC2420_DEF_RFPOWER 31 #endif /** * Ideally, your receive history size should be equal to the number of * RF neighbors your node will have */ #ifndef RECEIVE_HISTORY_SIZE #define RECEIVE_HISTORY_SIZE 4 #endif /** * The 6LowPAN NALP ID for a TinyOS network is 63 (TEP 125). */ #ifndef TINYOS_6LOWPAN_NETWORK_ID #define TINYOS_6LOWPAN_NETWORK_ID 0x3f #endif enum { // size of the header not including the length byte MAC_HEADER_SIZE = sizeof( cc2420_header_t ) - 1, // size of the footer (FCS field) MAC_FOOTER_SIZE = sizeof( uint16_t ), // MDU MAC_PACKET_SIZE = MAC_HEADER_SIZE + TOSH_DATA_LENGTH + MAC_FOOTER_SIZE, CC2420_SIZE = MAC_HEADER_SIZE + MAC_FOOTER_SIZE, }; enum cc2420_enums { CC2420_TIME_ACK_TURNAROUND = 7, // jiffies CC2420_TIME_VREN = 20, // jiffies CC2420_TIME_SYMBOL = 2, // 2 symbols / jiffy CC2420_BACKOFF_PERIOD = ( 20 / CC2420_TIME_SYMBOL ), // symbols CC2420_MIN_BACKOFF = ( 20 / CC2420_TIME_SYMBOL ), // platform specific? CC2420_ACK_WAIT_DELAY = 256, // jiffies }; enum cc2420_status_enums { CC2420_STATUS_RSSI_VALID = 1 << 1, CC2420_STATUS_LOCK = 1 << 2, CC2420_STATUS_TX_ACTIVE = 1 << 3, CC2420_STATUS_ENC_BUSY = 1 << 4, CC2420_STATUS_TX_UNDERFLOW = 1 << 5, CC2420_STATUS_XOSC16M_STABLE = 1 << 6, }; enum cc2420_config_reg_enums { CC2420_SNOP = 0x00, CC2420_SXOSCON = 0x01, CC2420_STXCAL = 0x02, CC2420_SRXON = 0x03, CC2420_STXON = 0x04, CC2420_STXONCCA = 0x05, CC2420_SRFOFF = 0x06, CC2420_SXOSCOFF = 0x07, CC2420_SFLUSHRX = 0x08, CC2420_SFLUSHTX = 0x09, CC2420_SACK = 0x0a, CC2420_SACKPEND = 0x0b, CC2420_SRXDEC = 0x0c, CC2420_STXENC = 0x0d, CC2420_SAES = 0x0e, CC2420_MAIN = 0x10, CC2420_MDMCTRL0 = 0x11, CC2420_MDMCTRL1 = 0x12, CC2420_RSSI = 0x13, CC2420_SYNCWORD = 0x14, CC2420_TXCTRL = 0x15, CC2420_RXCTRL0 = 0x16, CC2420_RXCTRL1 = 0x17, CC2420_FSCTRL = 0x18, CC2420_SECCTRL0 = 0x19, CC2420_SECCTRL1 = 0x1a, CC2420_BATTMON = 0x1b, CC2420_IOCFG0 = 0x1c, CC2420_IOCFG1 = 0x1d, CC2420_MANFIDL = 0x1e, CC2420_MANFIDH = 0x1f, CC2420_FSMTC = 0x20, CC2420_MANAND = 0x21, CC2420_MANOR = 0x22, CC2420_AGCCTRL = 0x23, CC2420_AGCTST0 = 0x24, CC2420_AGCTST1 = 0x25, CC2420_AGCTST2 = 0x26, CC2420_FSTST0 = 0x27, CC2420_FSTST1 = 0x28, CC2420_FSTST2 = 0x29, CC2420_FSTST3 = 0x2a, CC2420_RXBPFTST = 0x2b, CC2420_FMSTATE = 0x2c, CC2420_ADCTST = 0x2d, CC2420_DACTST = 0x2e, CC2420_TOPTST = 0x2f, CC2420_TXFIFO = 0x3e, CC2420_RXFIFO = 0x3f, }; enum cc2420_ram_addr_enums { CC2420_RAM_TXFIFO = 0x000, CC2420_RAM_RXFIFO = 0x080, CC2420_RAM_KEY0 = 0x100, CC2420_RAM_RXNONCE = 0x110, CC2420_RAM_SABUF = 0x120, CC2420_RAM_KEY1 = 0x130, CC2420_RAM_TXNONCE = 0x140, CC2420_RAM_CBCSTATE = 0x150, CC2420_RAM_IEEEADR = 0x160, CC2420_RAM_PANID = 0x168, CC2420_RAM_SHORTADR = 0x16a, }; enum cc2420_nonce_enums { CC2420_NONCE_BLOCK_COUNTER = 0, CC2420_NONCE_KEY_SEQ_COUNTER = 2, CC2420_NONCE_FRAME_COUNTER = 3, CC2420_NONCE_SOURCE_ADDRESS = 7, CC2420_NONCE_FLAGS = 15, }; enum cc2420_main_enums { CC2420_MAIN_RESETn = 15, CC2420_MAIN_ENC_RESETn = 14, CC2420_MAIN_DEMOD_RESETn = 13, CC2420_MAIN_MOD_RESETn = 12, CC2420_MAIN_FS_RESETn = 11, CC2420_MAIN_XOSC16M_BYPASS = 0, }; enum cc2420_mdmctrl0_enums { CC2420_MDMCTRL0_RESERVED_FRAME_MODE = 13, CC2420_MDMCTRL0_PAN_COORDINATOR = 12, CC2420_MDMCTRL0_ADR_DECODE = 11, CC2420_MDMCTRL0_CCA_HYST = 8, CC2420_MDMCTRL0_CCA_MOD = 6, CC2420_MDMCTRL0_AUTOCRC = 5, CC2420_MDMCTRL0_AUTOACK = 4, CC2420_MDMCTRL0_PREAMBLE_LENGTH = 0, }; enum cc2420_mdmctrl1_enums { CC2420_MDMCTRL1_CORR_THR = 6, CC2420_MDMCTRL1_DEMOD_AVG_MODE = 5, CC2420_MDMCTRL1_MODULATION_MODE = 4, CC2420_MDMCTRL1_TX_MODE = 2, CC2420_MDMCTRL1_RX_MODE = 0, }; enum cc2420_rssi_enums { CC2420_RSSI_CCA_THR = 8, CC2420_RSSI_RSSI_VAL = 0, }; enum cc2420_syncword_enums { CC2420_SYNCWORD_SYNCWORD = 0, }; enum cc2420_txctrl_enums { CC2420_TXCTRL_TXMIXBUF_CUR = 14, CC2420_TXCTRL_TX_TURNAROUND = 13, CC2420_TXCTRL_TXMIX_CAP_ARRAY = 11, CC2420_TXCTRL_TXMIX_CURRENT = 9, CC2420_TXCTRL_PA_CURRENT = 6, CC2420_TXCTRL_RESERVED = 5, CC2420_TXCTRL_PA_LEVEL = 0, }; enum cc2420_rxctrl0_enums { CC2420_RXCTRL0_RXMIXBUF_CUR = 12, CC2420_RXCTRL0_HIGH_LNA_GAIN = 10, CC2420_RXCTRL0_MED_LNA_GAIN = 8, CC2420_RXCTRL0_LOW_LNA_GAIN = 6, CC2420_RXCTRL0_HIGH_LNA_CURRENT = 4, CC2420_RXCTRL0_MED_LNA_CURRENT = 2, CC2420_RXCTRL0_LOW_LNA_CURRENT = 0, }; enum cc2420_rxctrl1_enums { CC2420_RXCTRL1_RXBPF_LOCUR = 13, CC2420_RXCTRL1_RXBPF_MIDCUR = 12, CC2420_RXCTRL1_LOW_LOWGAIN = 11, CC2420_RXCTRL1_MED_LOWGAIN = 10, CC2420_RXCTRL1_HIGH_HGM = 9, CC2420_RXCTRL1_MED_HGM = 8, CC2420_RXCTRL1_LNA_CAP_ARRAY = 6, CC2420_RXCTRL1_RXMIX_TAIL = 4, CC2420_RXCTRL1_RXMIX_VCM = 2, CC2420_RXCTRL1_RXMIX_CURRENT = 0, }; enum cc2420_rsctrl_enums { CC2420_FSCTRL_LOCK_THR = 14, CC2420_FSCTRL_CAL_DONE = 13, CC2420_FSCTRL_CAL_RUNNING = 12, CC2420_FSCTRL_LOCK_LENGTH = 11, CC2420_FSCTRL_LOCK_STATUS = 10, CC2420_FSCTRL_FREQ = 0, }; enum cc2420_secctrl0_enums { CC2420_SECCTRL0_RXFIFO_PROTECTION = 9, CC2420_SECCTRL0_SEC_CBC_HEAD = 8, CC2420_SECCTRL0_SEC_SAKEYSEL = 7, CC2420_SECCTRL0_SEC_TXKEYSEL = 6, CC2420_SECCTRL0_SEC_RXKEYSEL = 5, CC2420_SECCTRL0_SEC_M = 2, CC2420_SECCTRL0_SEC_MODE = 0, }; enum cc2420_secctrl1_enums { CC2420_SECCTRL1_SEC_TXL = 8, CC2420_SECCTRL1_SEC_RXL = 0, }; enum cc2420_battmon_enums { CC2420_BATTMON_BATT_OK = 6, CC2420_BATTMON_BATTMON_EN = 5, CC2420_BATTMON_BATTMON_VOLTAGE = 0, }; enum cc2420_iocfg0_enums { CC2420_IOCFG0_BCN_ACCEPT = 11, CC2420_IOCFG0_FIFO_POLARITY = 10, CC2420_IOCFG0_FIFOP_POLARITY = 9, CC2420_IOCFG0_SFD_POLARITY = 8, CC2420_IOCFG0_CCA_POLARITY = 7, CC2420_IOCFG0_FIFOP_THR = 0, }; enum cc2420_iocfg1_enums { CC2420_IOCFG1_HSSD_SRC = 10, CC2420_IOCFG1_SFDMUX = 5, CC2420_IOCFG1_CCAMUX = 0, }; enum cc2420_manfidl_enums { CC2420_MANFIDL_PARTNUM = 12, CC2420_MANFIDL_MANFID = 0, }; enum cc2420_manfidh_enums { CC2420_MANFIDH_VERSION = 12, CC2420_MANFIDH_PARTNUM = 0, }; enum cc2420_fsmtc_enums { CC2420_FSMTC_TC_RXCHAIN2RX = 13, CC2420_FSMTC_TC_SWITCH2TX = 10, CC2420_FSMTC_TC_PAON2TX = 6, CC2420_FSMTC_TC_TXEND2SWITCH = 3, CC2420_FSMTC_TC_TXEND2PAOFF = 0, }; enum cc2420_sfdmux_enums { CC2420_SFDMUX_SFD = 0, CC2420_SFDMUX_XOSC16M_STABLE = 24, }; enum cc2420_security_enums{ CC2420_NO_SEC = 0, CC2420_CBC_MAC = 1, CC2420_CTR = 2, CC2420_CCM = 3, NO_SEC = 0, CBC_MAC_4 = 1, CBC_MAC_8 = 2, CBC_MAC_16 = 3, CTR = 4, CCM_4 = 5, CCM_8 = 6, CCM_16 = 7 }; norace uint8_t SECURITYLOCK = 0; enum { CC2420_INVALID_TIMESTAMP = 0x80000000L, }; #endif tinyos-2.1.2+dfsg/tos/chips/cc2420/CC2420ActiveMessageC.nc000066400000000000000000000072571207233610700224670ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The Active Message layer for the CC2420 radio. This configuration * just layers the AM dispatch (CC2420ActiveMessageM) on top of the * underlying CC2420 radio packet (CC2420CsmaCsmaCC), which is * inherently an AM packet (acknowledgements based on AM destination * addr and group). Note that snooping may not work, due to CC2420 * early packet rejection if acknowledgements are enabled. * * @author Philip Levis * @author David Moss * @version $Revision: 1.16 $ $Date: 2010-06-29 22:07:44 $ */ #include "CC2420.h" #include "AM.h" #include "Ieee154.h" #ifdef IEEE154FRAMES_ENABLED #error "CC2420 AM layer cannot work when IEEE 802.15.4 frames only are used" #endif configuration CC2420ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface AMPacket; interface Packet; interface CC2420Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; interface RadioBackoff[am_id_t amId]; interface LowPowerListening; interface PacketLink; interface SendNotifier[am_id_t amId]; } } implementation { enum { CC2420_AM_SEND_ID = unique(RADIO_SEND_RESOURCE), }; components CC2420RadioC as Radio; components CC2420ActiveMessageP as AM; components ActiveMessageAddressC; components CC2420CsmaC as CsmaC; components CC2420ControlC; components CC2420PacketC; SplitControl = Radio; RadioBackoff = AM; Packet = AM; AMSend = AM; SendNotifier = AM; Receive = AM.Receive; Snoop = AM.Snoop; AMPacket = AM; PacketLink = Radio; LowPowerListening = Radio; CC2420Packet = Radio; PacketAcknowledgements = Radio; LinkPacketMetadata = Radio; // Radio resource for the AM layer AM.RadioResource -> Radio.Resource[CC2420_AM_SEND_ID]; AM.SubSend -> Radio.ActiveSend; AM.SubReceive -> Radio.ActiveReceive; AM.ActiveMessageAddress -> ActiveMessageAddressC; AM.CC2420Packet -> CC2420PacketC; AM.CC2420PacketBody -> CC2420PacketC; AM.CC2420Config -> CC2420ControlC; AM.SubBackoff -> CsmaC; components LedsC; AM.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/CC2420ActiveMessageP.nc000066400000000000000000000240111207233610700224670ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Active message implementation on top of the CC2420 radio. This * implementation uses the 16-bit addressing mode of 802.15.4: the * only additional byte it adds is the AM id byte, as the first byte * of the data payload. * * @author Philip Levis * @version $Revision: 1.22 $ $Date: 2010-06-29 22:07:44 $ */ #include #include "CC2420.h" module CC2420ActiveMessageP @safe() { provides { interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface AMPacket; interface Packet; interface SendNotifier[am_id_t id]; interface RadioBackoff[am_id_t id]; } uses { interface Send as SubSend; interface Receive as SubReceive; interface CC2420Packet; interface CC2420PacketBody; interface CC2420Config; interface ActiveMessageAddress; interface RadioBackoff as SubBackoff; interface Resource as RadioResource; interface Leds; } } implementation { uint16_t pending_length; message_t * ONE_NOK pending_message = NULL; /***************** Resource event ****************/ event void RadioResource.granted() { uint8_t rc; cc2420_header_t* header = call CC2420PacketBody.getHeader( pending_message ); signal SendNotifier.aboutToSend[header->type](header->dest, pending_message); rc = call SubSend.send( pending_message, pending_length ); if (rc != SUCCESS) { call RadioResource.release(); signal AMSend.sendDone[header->type]( pending_message, rc ); } } /***************** AMSend Commands ****************/ command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len) { cc2420_header_t* header = call CC2420PacketBody.getHeader( msg ); if (len > call Packet.maxPayloadLength()) { return ESIZE; } header->type = id; header->dest = addr; header->destpan = call CC2420Config.getPanAddr(); header->src = call AMPacket.address(); header->fcf |= ( 1 << IEEE154_FCF_INTRAPAN ) | ( IEEE154_ADDR_SHORT << IEEE154_FCF_DEST_ADDR_MODE ) | ( IEEE154_ADDR_SHORT << IEEE154_FCF_SRC_ADDR_MODE ) ; header->length = len + CC2420_SIZE; if (call RadioResource.immediateRequest() == SUCCESS) { error_t rc; signal SendNotifier.aboutToSend[id](addr, msg); rc = call SubSend.send( msg, len ); if (rc != SUCCESS) { call RadioResource.release(); } return rc; } else { pending_length = len; pending_message = msg; return call RadioResource.request(); } } command error_t AMSend.cancel[am_id_t id](message_t* msg) { return call SubSend.cancel(msg); } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } /***************** AMPacket Commands ****************/ command am_addr_t AMPacket.address() { return call ActiveMessageAddress.amAddress(); } command am_addr_t AMPacket.destination(message_t* amsg) { cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); return header->dest; } command am_addr_t AMPacket.source(message_t* amsg) { cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); return header->src; } command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); header->dest = addr; } command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); header->src = addr; } command bool AMPacket.isForMe(message_t* amsg) { return (call AMPacket.destination(amsg) == call AMPacket.address() || call AMPacket.destination(amsg) == AM_BROADCAST_ADDR); } command am_id_t AMPacket.type(message_t* amsg) { cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); return header->type; } command void AMPacket.setType(message_t* amsg, am_id_t type) { cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); header->type = type; } command am_group_t AMPacket.group(message_t* amsg) { return (call CC2420PacketBody.getHeader(amsg))->destpan; } command void AMPacket.setGroup(message_t* amsg, am_group_t grp) { // Overridden intentionally when we send() (call CC2420PacketBody.getHeader(amsg))->destpan = grp; } command am_group_t AMPacket.localGroup() { return call CC2420Config.getPanAddr(); } /***************** Packet Commands ****************/ command void Packet.clear(message_t* msg) { memset(call CC2420PacketBody.getHeader(msg), 0x0, sizeof(cc2420_header_t)); memset(call CC2420PacketBody.getMetadata(msg), 0x0, sizeof(cc2420_metadata_t)); } command uint8_t Packet.payloadLength(message_t* msg) { return (call CC2420PacketBody.getHeader(msg))->length - CC2420_SIZE; } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { (call CC2420PacketBody.getHeader(msg))->length = len + CC2420_SIZE; } command uint8_t Packet.maxPayloadLength() { return call SubSend.maxPayloadLength(); } command void* Packet.getPayload(message_t* msg, uint8_t len) { return call SubSend.getPayload(msg, len); } /***************** SubSend Events ****************/ event void SubSend.sendDone(message_t* msg, error_t result) { call RadioResource.release(); signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); } /***************** SubReceive Events ****************/ event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { if (call AMPacket.isForMe(msg)) { return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len); } else { return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len); } } /***************** ActiveMessageAddress Events ****************/ async event void ActiveMessageAddress.changed() { } /***************** CC2420Config Events ****************/ event void CC2420Config.syncDone( error_t error ) { } /***************** RadioBackoff ***********************/ async event void SubBackoff.requestInitialBackoff(message_t *msg) { signal RadioBackoff.requestInitialBackoff[(TCAST(cc2420_header_t* ONE, (uint8_t*)msg + offsetof(message_t, data) - sizeof(cc2420_header_t)))->type](msg); } async event void SubBackoff.requestCongestionBackoff(message_t *msg) { signal RadioBackoff.requestCongestionBackoff[(TCAST(cc2420_header_t* ONE, (uint8_t*)msg + offsetof(message_t, data) - sizeof(cc2420_header_t)))->type](msg); } async event void SubBackoff.requestCca(message_t *msg) { // Lower layers than this do not configure the CCA settings signal RadioBackoff.requestCca[(TCAST(cc2420_header_t* ONE, (uint8_t*)msg + offsetof(message_t, data) - sizeof(cc2420_header_t)))->type](msg); } async command void RadioBackoff.setInitialBackoff[am_id_t amId](uint16_t backoffTime) { call SubBackoff.setInitialBackoff(backoffTime); } /** * Must be called within a requestCongestionBackoff event * @param backoffTime the amount of time in some unspecified units to backoff */ async command void RadioBackoff.setCongestionBackoff[am_id_t amId](uint16_t backoffTime) { call SubBackoff.setCongestionBackoff(backoffTime); } /** * Enable CCA for the outbound packet. Must be called within a requestCca * event * @param ccaOn TRUE to enable CCA, which is the default. */ async command void RadioBackoff.setCca[am_id_t amId](bool useCca) { call SubBackoff.setCca(useCca); } /***************** Defaults ****************/ default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { call RadioResource.release(); } default event void SendNotifier.aboutToSend[am_id_t amId](am_addr_t addr, message_t *msg) { } default async event void RadioBackoff.requestInitialBackoff[am_id_t id]( message_t *msg) { } default async event void RadioBackoff.requestCongestionBackoff[am_id_t id]( message_t *msg) { } default async event void RadioBackoff.requestCca[am_id_t id]( message_t *msg) { } } tinyos-2.1.2+dfsg/tos/chips/cc2420/CC2420Ieee154MessageC.nc000066400000000000000000000114101207233610700223370ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* tab:4 * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * IEEE 802.15.4 layer for the cc2420. Provides a simplistic * link layer with dispatching on the 6lowpan "network" field * * @author Philip Levis * @author David Moss * @author Stephen Dawson-Haggerty * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:44 $ */ #include "CC2420.h" #ifdef TFRAMES_ENABLED #error "The CC2420 Ieee 802.15.4 layer does not work with TFRAMES" #endif configuration CC2420Ieee154MessageC { provides { interface SplitControl; interface Resource as SendResource[uint8_t clientId]; interface Ieee154Send; interface Receive as Ieee154Receive; interface Ieee154Packet; interface Packet; interface CC2420Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; interface LowPowerListening; interface CC2420Config; interface PacketLink; } } implementation { components CC2420RadioC as Radio; components CC2420Ieee154MessageP as Msg; components CC2420PacketC; components CC2420ControlC; SendResource = Radio.Resource; Ieee154Receive = Msg; Ieee154Send = Msg; Ieee154Packet = Msg; Packet = Msg; CC2420Packet = CC2420PacketC; SplitControl = Radio; CC2420Packet = Radio; PacketAcknowledgements = Radio; LinkPacketMetadata = Radio; LowPowerListening = Radio; CC2420Config = CC2420ControlC; PacketLink = Radio; Msg.SubSend -> Radio.BareSend; Msg.SubReceive -> Radio.BareReceive; #ifdef CC2420_IEEE154_RESOURCE_SEND Msg.Resource -> Radio.Resource[unique(RADIO_SEND_RESOURCE)]; #endif Msg.CC2420Packet -> CC2420PacketC; Msg.CC2420PacketBody -> CC2420PacketC; Msg.CC2420Config -> CC2420ControlC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/CC2420Ieee154MessageP.nc000066400000000000000000000210231207233610700223550ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* tab:4 * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * @author Stephen Dawson-Haggerty * @version $Revision: 1.3 $ $Date: 2010-06-29 22:07:44 $ */ #include "CC2420.h" #include "IEEE802154.h" module CC2420Ieee154MessageP { provides { interface Ieee154Send; interface Receive as Ieee154Receive; interface Ieee154Packet; interface Packet; } uses { interface Send as SubSend; interface Receive as SubReceive; interface CC2420Packet; interface CC2420PacketBody; interface CC2420Config; #ifdef CC2420_IEEE154_RESOURCE_SEND interface Resource; #endif } } implementation { message_t *m_pending_msg; enum { EXTRA_OVERHEAD = sizeof(cc2420_header_t) - offsetof(cc2420_header_t, network), }; /***************** Ieee154Send Commands ****************/ command error_t Ieee154Send.send(ieee154_saddr_t addr, message_t* msg, uint8_t len) { cc2420_header_t* header = call CC2420PacketBody.getHeader( msg ); header->length = len + CC2420_SIZE - EXTRA_OVERHEAD; header->dest = addr; header->destpan = call CC2420Config.getPanAddr(); header->src = call CC2420Config.getShortAddr(); header->fcf = ( 1 << IEEE154_FCF_INTRAPAN ) | ( IEEE154_ADDR_SHORT << IEEE154_FCF_DEST_ADDR_MODE ) | ( IEEE154_ADDR_SHORT << IEEE154_FCF_SRC_ADDR_MODE ) ; #ifdef CC2420_IEEE154_RESOURCE_SEND if (call Resource.isOwner()) return EBUSY; if (call Resource.immediateRequest() == SUCCESS) { error_t rc; rc = call SubSend.send( msg, header->length - 1 ); if (rc != SUCCESS) { call Resource.release(); } return rc; } else { m_pending_msg = msg; return call Resource.request(); } #else return call SubSend.send( msg, header->length - 1 ); #endif } #ifdef CC2420_IEEE154_RESOURCE_SEND event void Resource.granted() { error_t rc; cc2420_header_t* header = call CC2420PacketBody.getHeader( m_pending_msg ); rc = call SubSend.send(m_pending_msg, header->length - 1); if (rc != SUCCESS) { call Resource.release(); signal Ieee154Send.sendDone(m_pending_msg, rc); } } #endif command error_t Ieee154Send.cancel(message_t* msg) { return call SubSend.cancel(msg); } command uint8_t Ieee154Send.maxPayloadLength() { return call Packet.maxPayloadLength(); } command void* Ieee154Send.getPayload(message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } event message_t *SubReceive.receive(message_t *msg, void *payload, uint8_t len) { return signal Ieee154Receive.receive(msg, call Packet.getPayload(msg, 0), call Packet.payloadLength(msg)); } /***************** Ieee154Packet Commands ****************/ command ieee154_saddr_t Ieee154Packet.address() { return call CC2420Config.getShortAddr(); } command ieee154_saddr_t Ieee154Packet.destination(message_t* msg) { cc2420_header_t* header = call CC2420PacketBody.getHeader(msg); return header->dest; } command ieee154_saddr_t Ieee154Packet.source(message_t* msg) { cc2420_header_t* header = call CC2420PacketBody.getHeader(msg); return header->src; } command void Ieee154Packet.setDestination(message_t* msg, ieee154_saddr_t addr) { cc2420_header_t* header = call CC2420PacketBody.getHeader(msg); header->dest = addr; } command void Ieee154Packet.setSource(message_t* msg, ieee154_saddr_t addr) { cc2420_header_t* header = call CC2420PacketBody.getHeader(msg); header->src = addr; } command bool Ieee154Packet.isForMe(message_t* msg) { return (call Ieee154Packet.destination(msg) == call Ieee154Packet.address() || call Ieee154Packet.destination(msg) == IEEE154_BROADCAST_ADDR); } command ieee154_panid_t Ieee154Packet.pan(message_t* msg) { return (call CC2420PacketBody.getHeader(msg))->destpan; } command void Ieee154Packet.setPan(message_t* msg, ieee154_panid_t grp) { // Overridden intentionally when we send() (call CC2420PacketBody.getHeader(msg))->destpan = grp; } command ieee154_panid_t Ieee154Packet.localPan() { return call CC2420Config.getPanAddr(); } /***************** Packet Commands ****************/ command void Packet.clear(message_t* msg) { memset(call CC2420PacketBody.getHeader(msg), sizeof(cc2420_header_t) - EXTRA_OVERHEAD, 0); memset(call CC2420PacketBody.getMetadata(msg), sizeof(cc2420_metadata_t), 0); } command uint8_t Packet.payloadLength(message_t* msg) { return (call CC2420PacketBody.getHeader(msg))->length - CC2420_SIZE + EXTRA_OVERHEAD; } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { (call CC2420PacketBody.getHeader(msg))->length = len + CC2420_SIZE - EXTRA_OVERHEAD; } command uint8_t Packet.maxPayloadLength() { return TOSH_DATA_LENGTH + EXTRA_OVERHEAD; } command void* Packet.getPayload(message_t* msg, uint8_t len) { return msg->data - EXTRA_OVERHEAD; } /***************** SubSend Events ****************/ event void SubSend.sendDone(message_t* msg, error_t result) { #ifdef CC2420_IEEE154_RESOURCE_SEND call Resource.release(); #endif signal Ieee154Send.sendDone(msg, result); } /***************** CC2420Config Events ****************/ event void CC2420Config.syncDone( error_t error ) { } default event void Ieee154Send.sendDone(message_t *msg, error_t e) { } } tinyos-2.1.2+dfsg/tos/chips/cc2420/CC2420RadioC.nc000066400000000000000000000063311207233610700207750ustar00rootroot00000000000000/* * "Copyright (c) 2005 Stanford University. All rights reserved. * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose, without fee, and without written * agreement is hereby granted, provided that the above copyright * notice, the following two paragraphs and the author appear in all * copies of this software. * * IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN * IF STANFORD UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * STANFORD UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND STANFORD UNIVERSITY * HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, * ENHANCEMENTS, OR MODIFICATIONS." */ /** * Radio wiring for the CC2420. This layer seperates the common * wiring of the lower-layer components of the CC2420 stack and makes * them available to clients like the AM stack and the IEEE802.15.4 * stack. * * This component provides the highest-level internal interface to * other components of the CC2420 stack. * * @author Philip Levis * @author David Moss * @author Stephen Dawson-Haggerty * @version $Revision: 1.2 $ $Date: 2009/08/20 01:37:44 $ */ #include "CC2420.h" configuration CC2420RadioC { provides { interface SplitControl; interface Resource[uint8_t clientId]; interface Send as BareSend; interface Receive as BareReceive; interface Packet as BarePacket; interface Send as ActiveSend; interface Receive as ActiveReceive; interface CC2420Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; interface LowPowerListening; interface PacketLink; } } implementation { components CC2420CsmaC as CsmaC; components UniqueSendC; components UniqueReceiveC; components CC2420TinyosNetworkC; components CC2420PacketC; components CC2420ControlC; #if defined(LOW_POWER_LISTENING) || defined(ACK_LOW_POWER_LISTENING) components DefaultLplC as LplC; #else components DummyLplC as LplC; #endif #if defined(PACKET_LINK) components PacketLinkC as LinkC; #else components PacketLinkDummyC as LinkC; #endif PacketLink = LinkC; LowPowerListening = LplC; CC2420Packet = CC2420PacketC; PacketAcknowledgements = CC2420PacketC; LinkPacketMetadata = CC2420PacketC; Resource = CC2420TinyosNetworkC; BareSend = CC2420TinyosNetworkC.Send; BareReceive = CC2420TinyosNetworkC.Receive; BarePacket = CC2420TinyosNetworkC.BarePacket; ActiveSend = CC2420TinyosNetworkC.ActiveSend; ActiveReceive = CC2420TinyosNetworkC.ActiveReceive; // SplitControl Layers SplitControl = LplC; LplC.SubControl -> CsmaC; // Send Layers CC2420TinyosNetworkC.SubSend -> UniqueSendC; UniqueSendC.SubSend -> LinkC; LinkC.SubSend -> LplC.Send; LplC.SubSend -> CsmaC; // Receive Layers CC2420TinyosNetworkC.SubReceive -> LplC; LplC.SubReceive -> UniqueReceiveC.Receive; UniqueReceiveC.SubReceive -> CsmaC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/CC2420TimeSyncMessage.h000066400000000000000000000036371207233610700225310ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __TIMESYNCMESSAGE_H__ #define __TIMESYNCMESSAGE_H__ #ifndef AM_TIMESYNCMSG #define AM_TIMESYNCMSG 0x3D #endif // this value is sent in the air typedef nx_uint32_t timesync_radio_t; typedef nx_struct timesync_footer_t { nx_am_id_t type; timesync_radio_t timestamp; } timesync_footer_t; #endif//__TIMESYNCMESSAGE_H__ tinyos-2.1.2+dfsg/tos/chips/cc2420/CC2420TimeSyncMessageC.nc000066400000000000000000000103121207233610700227710ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The Active Message layer for the CC2420 radio with timesync support. This * configuration is just layer above CC2420ActiveMessageC that supports * TimeSyncPacket and TimeSyncAMSend interfaces (TEP 133) * * @author: Miklos Maroti * @author: Brano Kusy (CC2420 port) */ #include #include #include "CC2420TimeSyncMessage.h" configuration CC2420TimeSyncMessageC { provides { interface SplitControl; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface TimeSyncAMSend as TimeSyncAMSend32khz[am_id_t id]; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC2420TimeSyncMessageP, CC2420ActiveMessageC, CC2420PacketC, LedsC; TimeSyncAMSend32khz = CC2420TimeSyncMessageP; TimeSyncPacket32khz = CC2420TimeSyncMessageP; TimeSyncAMSendMilli = CC2420TimeSyncMessageP; TimeSyncPacketMilli = CC2420TimeSyncMessageP; Packet = CC2420TimeSyncMessageP; // use the AMSenderC infrastructure to avoid concurrent send clashes components new AMSenderC(AM_TIMESYNCMSG); CC2420TimeSyncMessageP.SubSend -> AMSenderC; CC2420TimeSyncMessageP.SubAMPacket -> AMSenderC; CC2420TimeSyncMessageP.SubPacket -> AMSenderC; CC2420TimeSyncMessageP.PacketTimeStamp32khz -> CC2420PacketC; CC2420TimeSyncMessageP.PacketTimeStampMilli -> CC2420PacketC; CC2420TimeSyncMessageP.PacketTimeSyncOffset -> CC2420PacketC; components Counter32khz32C, new CounterToLocalTimeC(T32khz) as LocalTime32khzC, LocalTimeMilliC; LocalTime32khzC.Counter -> Counter32khz32C; CC2420TimeSyncMessageP.LocalTime32khz -> LocalTime32khzC; CC2420TimeSyncMessageP.LocalTimeMilli -> LocalTimeMilliC; CC2420TimeSyncMessageP.Leds -> LedsC; components ActiveMessageC; SplitControl = CC2420ActiveMessageC; PacketAcknowledgements = CC2420ActiveMessageC; LowPowerListening = CC2420ActiveMessageC; Receive = CC2420TimeSyncMessageP.Receive; Snoop = CC2420TimeSyncMessageP.Snoop; AMPacket = CC2420TimeSyncMessageP; CC2420TimeSyncMessageP.SubReceive -> ActiveMessageC.Receive[AM_TIMESYNCMSG]; CC2420TimeSyncMessageP.SubSnoop -> ActiveMessageC.Snoop[AM_TIMESYNCMSG]; } tinyos-2.1.2+dfsg/tos/chips/cc2420/CC2420TimeSyncMessageP.nc000066400000000000000000000220121207233610700230060ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti * @author: Brano Kusy (CC2420 port) */ #include "CC2420TimeSyncMessage.h" module CC2420TimeSyncMessageP { provides { interface TimeSyncAMSend as TimeSyncAMSend32khz[uint8_t id]; interface TimeSyncAMSend as TimeSyncAMSendMilli[uint8_t id]; interface Packet; interface AMPacket; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncPacket as TimeSyncPacketMilli; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; } uses { interface AMSend as SubSend; interface Packet as SubPacket; interface AMPacket as SubAMPacket; interface Receive as SubReceive; interface Receive as SubSnoop; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface PacketTimeSyncOffset; interface LocalTime as LocalTime32khz; interface LocalTime as LocalTimeMilli; interface Leds; } } implementation { // TODO: change the Packet.payloadLength and Packet.maxPayloadLength commands to async inline timesync_footer_t* getFooter(message_t* msg) { // we use the payload length that we export (the smaller one) return (timesync_footer_t*)(msg->data + call Packet.payloadLength(msg)); } /*----------------- Packet -----------------*/ command void Packet.clear(message_t* msg) { call PacketTimeSyncOffset.cancel(msg); call SubPacket.clear(msg); } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call SubPacket.setPayloadLength(msg, len + sizeof(timesync_footer_t)); } command uint8_t Packet.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg) - sizeof(timesync_footer_t); } command uint8_t Packet.maxPayloadLength() { return call SubPacket.maxPayloadLength() - sizeof(timesync_footer_t); } command void* Packet.getPayload(message_t* msg, uint8_t len) { return call SubPacket.getPayload(msg, len + sizeof(timesync_footer_t)); } /*----------------- AMPacket -----------------*/ inline command am_addr_t AMPacket.address() { return call SubAMPacket.address(); } inline command am_group_t AMPacket.localGroup() { return call SubAMPacket.localGroup(); } inline command bool AMPacket.isForMe(message_t* msg) { return call SubAMPacket.isForMe(msg) && call SubAMPacket.type(msg) == AM_TIMESYNCMSG; } inline command am_addr_t AMPacket.destination(message_t* msg) { return call SubAMPacket.destination(msg); } inline command void AMPacket.setDestination(message_t* msg, am_addr_t addr) { call SubAMPacket.setDestination(msg, addr); } inline command am_addr_t AMPacket.source(message_t* msg) { return call SubAMPacket.source(msg); } inline command void AMPacket.setSource(message_t* msg, am_addr_t addr) { call SubAMPacket.setSource(msg, addr); } inline command am_id_t AMPacket.type(message_t* msg) { return getFooter(msg)->type; } inline command void AMPacket.setType(message_t* msg, am_id_t type) { getFooter(msg)->type = type; } inline command am_group_t AMPacket.group(message_t* msg) { return call SubAMPacket.group(msg); } inline command void AMPacket.setGroup(message_t* msg, am_group_t grp) { call SubAMPacket.setGroup(msg, grp); } /*----------------- TimeSyncAMSend32khz -----------------*/ command error_t TimeSyncAMSend32khz.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len, uint32_t event_time) { error_t err; timesync_footer_t* footer = (timesync_footer_t*)(msg->data + len); footer->type = id; footer->timestamp = event_time; err = call SubSend.send(addr, msg, len + sizeof(timesync_footer_t)); call PacketTimeSyncOffset.set(msg); return err; } command error_t TimeSyncAMSend32khz.cancel[am_id_t id](message_t* msg) { call PacketTimeSyncOffset.cancel(msg); return call SubSend.cancel(msg); } default event void TimeSyncAMSend32khz.sendDone[am_id_t id](message_t* msg, error_t error) {} command uint8_t TimeSyncAMSend32khz.maxPayloadLength[am_id_t id]() { return call SubSend.maxPayloadLength() - sizeof(timesync_footer_t); } command void* TimeSyncAMSend32khz.getPayload[am_id_t id](message_t* msg, uint8_t len) { return call SubSend.getPayload(msg, len + sizeof(timesync_footer_t)); } /*----------------- TimeSyncAMSendMilli -----------------*/ command error_t TimeSyncAMSendMilli.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len, uint32_t event_time) { // compute elapsed time in millisecond event_time = ((event_time - call LocalTimeMilli.get()) << 5) + call LocalTime32khz.get(); return call TimeSyncAMSend32khz.send[id](addr, msg, len, event_time); } command error_t TimeSyncAMSendMilli.cancel[am_id_t id](message_t* msg) { return call TimeSyncAMSend32khz.cancel[id](msg); } default event void TimeSyncAMSendMilli.sendDone[am_id_t id](message_t* msg, error_t error){} command uint8_t TimeSyncAMSendMilli.maxPayloadLength[am_id_t id]() { return call TimeSyncAMSend32khz.maxPayloadLength[id](); } command void* TimeSyncAMSendMilli.getPayload[am_id_t id](message_t* msg, uint8_t len) { return call TimeSyncAMSend32khz.getPayload[id](msg, len); } /*----------------- SubReceive -------------------*/ event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { am_id_t id = call AMPacket.type(msg); return signal Receive.receive[id](msg, payload, len - sizeof(timesync_footer_t)); } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } /*----------------- SubSnoop -------------------*/ event message_t* SubSnoop.receive(message_t* msg, void* payload, uint8_t len) { am_id_t id = call AMPacket.type(msg); return signal Snoop.receive[id](msg, payload, len - sizeof(timesync_footer_t)); } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } /*----------------- SubSend.sendDone -------------------*/ event void SubSend.sendDone(message_t* msg, error_t error) { am_id_t id = call AMPacket.type(msg); signal TimeSyncAMSend32khz.sendDone[id](msg, error); signal TimeSyncAMSendMilli.sendDone[id](msg, error); } /*----------------- TimeSyncPacket32khz -----------------*/ command bool TimeSyncPacket32khz.isValid(message_t* msg) { return call PacketTimeStamp32khz.isValid(msg) && getFooter(msg)->timestamp != CC2420_INVALID_TIMESTAMP; } command uint32_t TimeSyncPacket32khz.eventTime(message_t* msg) { return (uint32_t)(getFooter(msg)->timestamp) + call PacketTimeStamp32khz.timestamp(msg); } /*----------------- TimeSyncPacketMilli -----------------*/ command bool TimeSyncPacketMilli.isValid(message_t* msg) { return call PacketTimeStampMilli.isValid(msg) && getFooter(msg)->timestamp != CC2420_INVALID_TIMESTAMP; } command uint32_t TimeSyncPacketMilli.eventTime(message_t* msg) { return ((int32_t)(getFooter(msg)->timestamp) >> 5) + call PacketTimeStampMilli.timestamp(msg); } } tinyos-2.1.2+dfsg/tos/chips/cc2420/IEEE802154.h000066400000000000000000000033671207233610700201460ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * * @author Jonathan Hui * @version $Revision: 1.7 $ $Date: 2007-07-04 00:37:14 $ */ #ifndef __IEEE802154_H__ #define __IEEE802154_H__ #include #endif tinyos-2.1.2+dfsg/tos/chips/cc2420/README.txt000066400000000000000000000110071207233610700202660ustar00rootroot00000000000000 To compile in the default Ack LPL version, #define the preprocessor variable: LOW_POWER_LISTENING To compile in the PacketLink (auto-retransmission) layer, #define: PACKET_LINK To remove all acknowledgements, #define (or use CC2420Config in 2.0.2) CC2420_NO_ACKNOWLEDGEMENTS To use hardware auto-acks instead of software acks, #define: CC2420_HW_ACKNOWLEDGEMENTS To stop using address recognition on the radio hardware, #define: CC2420_NO_ADDRESS_RECOGNITION ============================================================ CC2420 2.0.2 Release Notes 7/2/07 Updates (Moss) __________________________________________ * New chip SPI bus arbitration working with Receive and Transmit. * Applied TUnit automated unit testing to CC2420 development > Caught lots of bugs, especially through regression testing > Source code in tinyos-2.x-contribs/tunit/ * Applied TEP115 behavior to CC2420 SplitControl in Csma and Lpl * Updated ActiveMessageAddressC to provide the ActiveMessageAddress interface > Updated CC2420ConfigP to handle ActiveMessageAddress.addressChanged() and sync automatically upon address change events. * Updated CC2420Config interface to enable/disable sw/hw acknowledgements * Updated CC2420ConfigP to share register editing through single functions * Acknowledge after packet length and FCF check out valid. > The destination address is confirmed in hardware, so we don't need to download the entire header before acking. * Moved the getHeader() and getMetadata() commands to an internal interface called CC2420PacketBody, provided by CC2420PacketC * Separated core functionality into different sub-packages/directories > Updated micaz, telosb, intelmote2 .platform files > Logically organizes code * Updated some LPL architecture > Removed continuous modulation because it didn't work 100% and I don't have time to make it work. > Decreased backoffs and decreased on-time for detects, saving energy. * Updated to the new AMPacket interface; made the radio set the outbound packet's destpan after send(). 7/5/07: * Added two methods to enable/disable automatic address recognition: - Preprocessor CC2420_NO_ADDRESS_RECOGNITION to disable address recognition at compile time - CC2420Config.setAddressRecognition(bool on) through CC2420ControlC * Allowed the CC2420ReceiveP to perform software address checks to support the case where a base station type application must sniff packets from other address, but also SACK packets destined for its address * Updated CC2420Config interface to provide an async getShortAddr() and getPanAddr() Known issues __________________________________________ ============================================================ CC2420 Release Notes 4/11/07 This CC2420 stack contains two low power listening strategies, a packet retransmission layer, unique send and receive layers, ability to specify backoff and use of clear channel assessments on outbound messages, direct RSSI readings, ability to change channels on the fly, an experimental 6LowPAN layer (not implemented by default), general bug fixes, and more. Known Issues __________________________________________ > LPL Lockups when the node is also accessing the USART. This is a SPI bus issue, where shutting off the SPI bus in the middle of an operation may cause the node to hang. Look to future versions on CVS for the fix. > NoAck LPL doesn't ack at the end properly, and also isn't finished being implemented. The CRC of the packet needs to manually be loaded into TXFIFO before continuous modulation. > LPL stack is optimized for reliability at this point, since SFD sampling is not implemented in this version. Low Power Listening Schemes and Preprocessor Variables __________________________________________ There are two low power listening schemes. The default is called "AckLpl", because it inserts acknowledgement gaps andshort backoffs during the packet retransmission process. This allows the transmitter to stop transmitting early, but increases the power consumption per receive check. This is better for slow receive check, high transmission rate networks. The second is called "NoAckLpl", because it does not insert acknowledgement gaps or backoffs in the retransmission process, so the receive checks are shorter but the transmissions are longer. This is more experimental than the Ack LPL version. The radio continuously modulates the channel when delivering its packetized preamble. This is better for fast receive check, low transmission rate networks. tinyos-2.1.2+dfsg/tos/chips/cc2420/alarm/000077500000000000000000000000001207233610700176655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/alarm/AlarmMultiplexC.nc000066400000000000000000000041151207233610700232530ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * A component that multiplexes the use of an alarm. The assumption is * that its use is mutually exclusive and users check whether the * events are for them. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2007-07-04 00:37:14 $ */ #include configuration AlarmMultiplexC { provides interface Init; provides interface Alarm as Alarm32khz32; } implementation { components new HplCC2420AlarmC() as Alarm; Init = Alarm; Alarm32khz32 = Alarm; } tinyos-2.1.2+dfsg/tos/chips/cc2420/control/000077500000000000000000000000001207233610700202515ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/control/CC2420ControlC.nc000066400000000000000000000067671207233610700230540ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation for configuring a ChipCon CC2420 radio. * * @author Jonathan Hui * @version $Revision: 1.3 $ $Date: 2008/05/14 21:33:07 $ */ #include "CC2420.h" #include "IEEE802154.h" configuration CC2420ControlC { provides interface Resource; provides interface CC2420Config; provides interface CC2420Power; provides interface Read as ReadRssi; } implementation { components CC2420ControlP; Resource = CC2420ControlP; CC2420Config = CC2420ControlP; CC2420Power = CC2420ControlP; ReadRssi = CC2420ControlP; components MainC; MainC.SoftwareInit -> CC2420ControlP; components AlarmMultiplexC as Alarm; CC2420ControlP.StartupTimer -> Alarm; components HplCC2420PinsC as Pins; CC2420ControlP.CSN -> Pins.CSN; CC2420ControlP.RSTN -> Pins.RSTN; CC2420ControlP.VREN -> Pins.VREN; components HplCC2420InterruptsC as Interrupts; CC2420ControlP.InterruptCCA -> Interrupts.InterruptCCA; components new CC2420SpiC() as Spi; CC2420ControlP.SpiResource -> Spi; CC2420ControlP.SRXON -> Spi.SRXON; CC2420ControlP.SRFOFF -> Spi.SRFOFF; CC2420ControlP.SXOSCON -> Spi.SXOSCON; CC2420ControlP.SXOSCOFF -> Spi.SXOSCOFF; CC2420ControlP.FSCTRL -> Spi.FSCTRL; CC2420ControlP.IOCFG0 -> Spi.IOCFG0; CC2420ControlP.IOCFG1 -> Spi.IOCFG1; CC2420ControlP.MDMCTRL0 -> Spi.MDMCTRL0; CC2420ControlP.MDMCTRL1 -> Spi.MDMCTRL1; CC2420ControlP.PANID -> Spi.PANID; CC2420ControlP.IEEEADR -> Spi.IEEEADR; CC2420ControlP.RXCTRL1 -> Spi.RXCTRL1; CC2420ControlP.RSSI -> Spi.RSSI; CC2420ControlP.TXCTRL -> Spi.TXCTRL; components new CC2420SpiC() as SyncSpiC; CC2420ControlP.SyncResource -> SyncSpiC; components new CC2420SpiC() as RssiResource; CC2420ControlP.RssiResource -> RssiResource; components ActiveMessageAddressC; CC2420ControlP.ActiveMessageAddress -> ActiveMessageAddressC; components LocalIeeeEui64C; CC2420ControlP.LocalIeeeEui64 -> LocalIeeeEui64C; } tinyos-2.1.2+dfsg/tos/chips/cc2420/control/CC2420ControlP.nc000066400000000000000000000351121207233610700230530ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author David Moss * @author Urs Hunkeler (ReadRssi implementation) * @version $Revision: 1.7 $ $Date: 2008/06/24 04:07:28 $ */ #include #include "Timer.h" module CC2420ControlP @safe() { provides interface Init; provides interface Resource; provides interface CC2420Config; provides interface CC2420Power; provides interface Read as ReadRssi; uses interface LocalIeeeEui64; uses interface Alarm as StartupTimer; uses interface GeneralIO as CSN; uses interface GeneralIO as RSTN; uses interface GeneralIO as VREN; uses interface GpioInterrupt as InterruptCCA; uses interface ActiveMessageAddress; uses interface CC2420Ram as IEEEADR; uses interface CC2420Ram as PANID; uses interface CC2420Register as FSCTRL; uses interface CC2420Register as IOCFG0; uses interface CC2420Register as IOCFG1; uses interface CC2420Register as MDMCTRL0; uses interface CC2420Register as MDMCTRL1; uses interface CC2420Register as RXCTRL1; uses interface CC2420Register as RSSI; uses interface CC2420Register as TXCTRL; uses interface CC2420Strobe as SRXON; uses interface CC2420Strobe as SRFOFF; uses interface CC2420Strobe as SXOSCOFF; uses interface CC2420Strobe as SXOSCON; uses interface Resource as SpiResource; uses interface Resource as RssiResource; uses interface Resource as SyncResource; uses interface Leds; } implementation { typedef enum { S_VREG_STOPPED, S_VREG_STARTING, S_VREG_STARTED, S_XOSC_STARTING, S_XOSC_STARTED, } cc2420_control_state_t; uint8_t m_channel; uint8_t m_tx_power; uint16_t m_pan; uint16_t m_short_addr; ieee_eui64_t m_ext_addr; bool m_sync_busy; /** TRUE if acknowledgments are enabled */ bool autoAckEnabled; /** TRUE if acknowledgments are generated in hardware only */ bool hwAutoAckDefault; /** TRUE if software or hardware address recognition is enabled */ bool addressRecognition; /** TRUE if address recognition should also be performed in hardware */ bool hwAddressRecognition; norace cc2420_control_state_t m_state = S_VREG_STOPPED; /***************** Prototypes ****************/ void writeFsctrl(); void writeMdmctrl0(); void writeId(); void writeTxctrl(); task void sync(); task void syncDone(); /***************** Init Commands ****************/ command error_t Init.init() { int i, t; call CSN.makeOutput(); call RSTN.makeOutput(); call VREN.makeOutput(); m_short_addr = call ActiveMessageAddress.amAddress(); m_ext_addr = call LocalIeeeEui64.getId(); m_pan = call ActiveMessageAddress.amGroup(); m_tx_power = CC2420_DEF_RFPOWER; m_channel = CC2420_DEF_CHANNEL; m_ext_addr = call LocalIeeeEui64.getId(); for (i = 0; i < 4; i++) { t = m_ext_addr.data[i]; m_ext_addr.data[i] = m_ext_addr.data[7-i]; m_ext_addr.data[7-i] = t; } #if defined(CC2420_NO_ADDRESS_RECOGNITION) addressRecognition = FALSE; #else addressRecognition = TRUE; #endif #if defined(CC2420_HW_ADDRESS_RECOGNITION) hwAddressRecognition = TRUE; #else hwAddressRecognition = FALSE; #endif #if defined(CC2420_NO_ACKNOWLEDGEMENTS) autoAckEnabled = FALSE; #else autoAckEnabled = TRUE; #endif #if defined(CC2420_HW_ACKNOWLEDGEMENTS) hwAutoAckDefault = TRUE; hwAddressRecognition = TRUE; #else hwAutoAckDefault = FALSE; #endif return SUCCESS; } /***************** Resource Commands ****************/ async command error_t Resource.immediateRequest() { error_t error = call SpiResource.immediateRequest(); if ( error == SUCCESS ) { call CSN.clr(); } return error; } async command error_t Resource.request() { return call SpiResource.request(); } async command bool Resource.isOwner() { return call SpiResource.isOwner(); } async command error_t Resource.release() { atomic { call CSN.set(); return call SpiResource.release(); } } /***************** CC2420Power Commands ****************/ async command error_t CC2420Power.startVReg() { atomic { if ( m_state != S_VREG_STOPPED ) { return FAIL; } m_state = S_VREG_STARTING; } call VREN.set(); call StartupTimer.start( CC2420_TIME_VREN ); return SUCCESS; } async command error_t CC2420Power.stopVReg() { m_state = S_VREG_STOPPED; call RSTN.clr(); call VREN.clr(); call RSTN.set(); return SUCCESS; } async command error_t CC2420Power.startOscillator() { atomic { if ( m_state != S_VREG_STARTED ) { return FAIL; } m_state = S_XOSC_STARTING; call IOCFG1.write( CC2420_SFDMUX_XOSC16M_STABLE << CC2420_IOCFG1_CCAMUX ); call InterruptCCA.enableRisingEdge(); call SXOSCON.strobe(); call IOCFG0.write( ( 1 << CC2420_IOCFG0_FIFOP_POLARITY ) | ( 127 << CC2420_IOCFG0_FIFOP_THR ) ); writeFsctrl(); writeMdmctrl0(); call RXCTRL1.write( ( 1 << CC2420_RXCTRL1_RXBPF_LOCUR ) | ( 1 << CC2420_RXCTRL1_LOW_LOWGAIN ) | ( 1 << CC2420_RXCTRL1_HIGH_HGM ) | ( 1 << CC2420_RXCTRL1_LNA_CAP_ARRAY ) | ( 1 << CC2420_RXCTRL1_RXMIX_TAIL ) | ( 1 << CC2420_RXCTRL1_RXMIX_VCM ) | ( 2 << CC2420_RXCTRL1_RXMIX_CURRENT ) ); writeTxctrl(); } return SUCCESS; } async command error_t CC2420Power.stopOscillator() { atomic { if ( m_state != S_XOSC_STARTED ) { return FAIL; } m_state = S_VREG_STARTED; call SXOSCOFF.strobe(); } return SUCCESS; } async command error_t CC2420Power.rxOn() { atomic { if ( m_state != S_XOSC_STARTED ) { return FAIL; } call SRXON.strobe(); } return SUCCESS; } async command error_t CC2420Power.rfOff() { atomic { if ( m_state != S_XOSC_STARTED ) { return FAIL; } call SRFOFF.strobe(); } return SUCCESS; } /***************** CC2420Config Commands ****************/ command uint8_t CC2420Config.getChannel() { atomic return m_channel; } command void CC2420Config.setChannel( uint8_t channel ) { atomic m_channel = channel; } command ieee_eui64_t CC2420Config.getExtAddr() { return m_ext_addr; } async command uint16_t CC2420Config.getShortAddr() { atomic return m_short_addr; } command void CC2420Config.setShortAddr( uint16_t addr ) { atomic m_short_addr = addr; } async command uint16_t CC2420Config.getPanAddr() { atomic return m_pan; } command void CC2420Config.setPanAddr( uint16_t pan ) { atomic m_pan = pan; } /** * Sync must be called to commit software parameters configured on * the microcontroller (through the CC2420Config interface) to the * CC2420 radio chip. */ command error_t CC2420Config.sync() { atomic { if ( m_sync_busy ) { return FAIL; } m_sync_busy = TRUE; if ( m_state == S_XOSC_STARTED ) { call SyncResource.request(); } else { post syncDone(); } } return SUCCESS; } /** * @param enableAddressRecognition TRUE to turn address recognition on * @param useHwAddressRecognition TRUE to perform address recognition first * in hardware. This doesn't affect software address recognition. The * driver must sync with the chip after changing this value. */ command void CC2420Config.setAddressRecognition(bool enableAddressRecognition, bool useHwAddressRecognition) { atomic { addressRecognition = enableAddressRecognition; hwAddressRecognition = useHwAddressRecognition; } } /** * @return TRUE if address recognition is enabled */ async command bool CC2420Config.isAddressRecognitionEnabled() { atomic return addressRecognition; } /** * @return TRUE if address recognition is performed first in hardware. */ async command bool CC2420Config.isHwAddressRecognitionDefault() { atomic return hwAddressRecognition; } /** * Sync must be called for acknowledgement changes to take effect * @param enableAutoAck TRUE to enable auto acknowledgements * @param hwAutoAck TRUE to default to hardware auto acks, FALSE to * default to software auto acknowledgements */ command void CC2420Config.setAutoAck(bool enableAutoAck, bool hwAutoAck) { atomic autoAckEnabled = enableAutoAck; atomic hwAutoAckDefault = hwAutoAck; } /** * @return TRUE if hardware auto acks are the default, FALSE if software * acks are the default */ async command bool CC2420Config.isHwAutoAckDefault() { atomic return hwAutoAckDefault; } /** * @return TRUE if auto acks are enabled */ async command bool CC2420Config.isAutoAckEnabled() { atomic return autoAckEnabled; } /***************** ReadRssi Commands ****************/ command error_t ReadRssi.read() { return call RssiResource.request(); } /***************** Spi Resources Events ****************/ event void SyncResource.granted() { call CSN.clr(); call SRFOFF.strobe(); writeFsctrl(); writeMdmctrl0(); writeId(); call CSN.set(); call CSN.clr(); call SRXON.strobe(); call CSN.set(); call SyncResource.release(); post syncDone(); } event void SpiResource.granted() { call CSN.clr(); signal Resource.granted(); } event void RssiResource.granted() { uint16_t data = 0; call CSN.clr(); call RSSI.read(&data); call CSN.set(); call RssiResource.release(); data += 0x7f; data &= 0x00ff; signal ReadRssi.readDone(SUCCESS, data); } /***************** StartupTimer Events ****************/ async event void StartupTimer.fired() { if ( m_state == S_VREG_STARTING ) { m_state = S_VREG_STARTED; call RSTN.clr(); call RSTN.set(); signal CC2420Power.startVRegDone(); } } /***************** InterruptCCA Events ****************/ async event void InterruptCCA.fired() { m_state = S_XOSC_STARTED; call InterruptCCA.disable(); call IOCFG1.write( 0 ); writeId(); call CSN.set(); call CSN.clr(); signal CC2420Power.startOscillatorDone(); } /***************** ActiveMessageAddress Events ****************/ async event void ActiveMessageAddress.changed() { atomic { m_short_addr = call ActiveMessageAddress.amAddress(); m_pan = call ActiveMessageAddress.amGroup(); } post sync(); } /***************** Tasks ****************/ /** * Attempt to synchronize our current settings with the CC2420 */ task void sync() { call CC2420Config.sync(); } task void syncDone() { atomic m_sync_busy = FALSE; signal CC2420Config.syncDone( SUCCESS ); } /***************** Functions ****************/ /** * Write teh FSCTRL register */ void writeFsctrl() { uint8_t channel; atomic { channel = m_channel; } call FSCTRL.write( ( 1 << CC2420_FSCTRL_LOCK_THR ) | ( ( (channel - 11)*5+357 ) << CC2420_FSCTRL_FREQ ) ); } /** * Write the MDMCTRL0 register * Disabling hardware address recognition improves acknowledgment success * rate and low power communications reliability by causing the local node * to do work while the real destination node of the packet is acknowledging. */ void writeMdmctrl0() { atomic { call MDMCTRL0.write( ( 1 << CC2420_MDMCTRL0_RESERVED_FRAME_MODE ) | ( ((addressRecognition && hwAddressRecognition) ? 1 : 0) << CC2420_MDMCTRL0_ADR_DECODE ) | ( 2 << CC2420_MDMCTRL0_CCA_HYST ) | ( 3 << CC2420_MDMCTRL0_CCA_MOD ) | ( 1 << CC2420_MDMCTRL0_AUTOCRC ) | ( (autoAckEnabled && hwAutoAckDefault) << CC2420_MDMCTRL0_AUTOACK ) | ( 0 << CC2420_MDMCTRL0_AUTOACK ) | ( 2 << CC2420_MDMCTRL0_PREAMBLE_LENGTH ) ); } // Jon Green: // MDMCTRL1.CORR_THR is defaulted to 20 instead of 0 like the datasheet says // If we add in changes to MDMCTRL1, be sure to include this fix. } /** * Write the PANID register */ void writeId() { nxle_uint16_t id[ 6 ]; atomic { /* Eui-64 is stored in big endian */ memcpy((uint8_t *)id, m_ext_addr.data, 8); id[ 4 ] = m_pan; id[ 5 ] = m_short_addr; } call IEEEADR.write(0, (uint8_t *)&id, 12); } /* Write the Transmit control register. This is needed so acknowledgments are sent at the correct transmit power even if a node has not sent a packet (Google Code Issue #27) -pal */ void writeTxctrl() { atomic { call TXCTRL.write( ( 2 << CC2420_TXCTRL_TXMIXBUF_CUR ) | ( 3 << CC2420_TXCTRL_PA_CURRENT ) | ( 1 << CC2420_TXCTRL_RESERVED ) | ( (CC2420_DEF_RFPOWER & 0x1F) << CC2420_TXCTRL_PA_LEVEL ) ); } } /***************** Defaults ****************/ default event void CC2420Config.syncDone( error_t error ) { } default event void ReadRssi.readDone(error_t error, uint16_t data) { } } tinyos-2.1.2+dfsg/tos/chips/cc2420/csma/000077500000000000000000000000001207233610700175145ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/csma/CC2420CsmaC.nc000066400000000000000000000052671207233610700215540ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Basic implementation of a CSMA MAC for the ChipCon CC2420 radio. * * @author Jonathan Hui * @version $Revision: 1.2 $ $Date: 2008-05-14 21:33:07 $ */ #include "CC2420.h" #include "IEEE802154.h" configuration CC2420CsmaC { provides interface SplitControl; provides interface Send; provides interface Receive; provides interface RadioBackoff; } implementation { components CC2420CsmaP as CsmaP; RadioBackoff = CsmaP; SplitControl = CsmaP; Send = CsmaP; components CC2420ControlC; CsmaP.Resource -> CC2420ControlC; CsmaP.CC2420Power -> CC2420ControlC; components CC2420TransmitC; CsmaP.SubControl -> CC2420TransmitC; CsmaP.CC2420Transmit -> CC2420TransmitC; CsmaP.SubBackoff -> CC2420TransmitC; components CC2420ReceiveC; Receive = CC2420ReceiveC; CsmaP.SubControl -> CC2420ReceiveC; components CC2420PacketC; CsmaP.CC2420Packet -> CC2420PacketC; CsmaP.CC2420PacketBody -> CC2420PacketC; components RandomC; CsmaP.Random -> RandomC; components new StateC(); CsmaP.SplitControlState -> StateC; components LedsC as Leds; CsmaP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/cc2420/csma/CC2420CsmaP.nc000066400000000000000000000211211207233610700215540ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.12 $ $Date: 2009/09/17 23:36:36 $ */ module CC2420CsmaP @safe() { provides interface SplitControl; provides interface Send; provides interface RadioBackoff; uses interface Resource; uses interface CC2420Power; uses interface StdControl as SubControl; uses interface CC2420Transmit; uses interface RadioBackoff as SubBackoff; uses interface Random; uses interface Leds; uses interface CC2420Packet; uses interface CC2420PacketBody; uses interface State as SplitControlState; } implementation { enum { S_STOPPED, S_STARTING, S_STARTED, S_STOPPING, S_TRANSMITTING, }; message_t* ONE_NOK m_msg; error_t sendErr = SUCCESS; /** TRUE if we are to use CCA when sending the current packet */ norace bool ccaOn; /****************** Prototypes ****************/ task void startDone_task(); task void stopDone_task(); task void sendDone_task(); void shutdown(); /***************** SplitControl Commands ****************/ command error_t SplitControl.start() { if(call SplitControlState.requestState(S_STARTING) == SUCCESS) { call CC2420Power.startVReg(); return SUCCESS; } else if(call SplitControlState.isState(S_STARTED)) { return EALREADY; } else if(call SplitControlState.isState(S_STARTING)) { return SUCCESS; } return EBUSY; } command error_t SplitControl.stop() { if (call SplitControlState.isState(S_STARTED)) { call SplitControlState.forceState(S_STOPPING); shutdown(); return SUCCESS; } else if(call SplitControlState.isState(S_STOPPED)) { return EALREADY; } else if(call SplitControlState.isState(S_TRANSMITTING)) { call SplitControlState.forceState(S_STOPPING); // At sendDone, the radio will shut down return SUCCESS; } else if(call SplitControlState.isState(S_STOPPING)) { return SUCCESS; } return EBUSY; } /***************** Send Commands ****************/ command error_t Send.cancel( message_t* p_msg ) { return call CC2420Transmit.cancel(); } command error_t Send.send( message_t* p_msg, uint8_t len ) { cc2420_header_t* header = call CC2420PacketBody.getHeader( p_msg ); cc2420_metadata_t* metadata = call CC2420PacketBody.getMetadata( p_msg ); atomic { if (!call SplitControlState.isState(S_STARTED)) { return FAIL; } call SplitControlState.forceState(S_TRANSMITTING); m_msg = p_msg; } // header->length = len + CC2420_SIZE; #ifdef CC2420_HW_SECURITY header->fcf &= ((1 << IEEE154_FCF_ACK_REQ)| (1 << IEEE154_FCF_SECURITY_ENABLED)| (0x3 << IEEE154_FCF_SRC_ADDR_MODE) | (0x3 << IEEE154_FCF_DEST_ADDR_MODE)); #else header->fcf &= ((1 << IEEE154_FCF_ACK_REQ) | (0x3 << IEEE154_FCF_SRC_ADDR_MODE) | (0x3 << IEEE154_FCF_DEST_ADDR_MODE)); #endif header->fcf |= ( ( IEEE154_TYPE_DATA << IEEE154_FCF_FRAME_TYPE ) | ( 1 << IEEE154_FCF_INTRAPAN ) ); metadata->ack = FALSE; metadata->rssi = 0; metadata->lqi = 0; //metadata->timesync = FALSE; metadata->timestamp = CC2420_INVALID_TIMESTAMP; ccaOn = TRUE; signal RadioBackoff.requestCca(m_msg); call CC2420Transmit.send( m_msg, ccaOn ); return SUCCESS; } command void* Send.getPayload(message_t* m, uint8_t len) { if (len <= call Send.maxPayloadLength()) { return (void* COUNT_NOK(len ))(m->data); } else { return NULL; } } command uint8_t Send.maxPayloadLength() { return TOSH_DATA_LENGTH; } /**************** RadioBackoff Commands ****************/ /** * Must be called within a requestInitialBackoff event * @param backoffTime the amount of time in some unspecified units to backoff */ async command void RadioBackoff.setInitialBackoff(uint16_t backoffTime) { call SubBackoff.setInitialBackoff(backoffTime); } /** * Must be called within a requestCongestionBackoff event * @param backoffTime the amount of time in some unspecified units to backoff */ async command void RadioBackoff.setCongestionBackoff(uint16_t backoffTime) { call SubBackoff.setCongestionBackoff(backoffTime); } /** * Enable CCA for the outbound packet. Must be called within a requestCca * event * @param ccaOn TRUE to enable CCA, which is the default. */ async command void RadioBackoff.setCca(bool useCca) { ccaOn = useCca; } /**************** Events ****************/ async event void CC2420Transmit.sendDone( message_t* p_msg, error_t err ) { atomic sendErr = err; post sendDone_task(); } async event void CC2420Power.startVRegDone() { call Resource.request(); } event void Resource.granted() { call CC2420Power.startOscillator(); } async event void CC2420Power.startOscillatorDone() { post startDone_task(); } /***************** SubBackoff Events ****************/ async event void SubBackoff.requestInitialBackoff(message_t *msg) { call SubBackoff.setInitialBackoff ( call Random.rand16() % (0x1F * CC2420_BACKOFF_PERIOD) + CC2420_MIN_BACKOFF); signal RadioBackoff.requestInitialBackoff(msg); } async event void SubBackoff.requestCongestionBackoff(message_t *msg) { call SubBackoff.setCongestionBackoff( call Random.rand16() % (0x7 * CC2420_BACKOFF_PERIOD) + CC2420_MIN_BACKOFF); signal RadioBackoff.requestCongestionBackoff(msg); } async event void SubBackoff.requestCca(message_t *msg) { // Lower layers than this do not configure the CCA settings signal RadioBackoff.requestCca(msg); } /***************** Tasks ****************/ task void sendDone_task() { error_t packetErr; atomic packetErr = sendErr; if(call SplitControlState.isState(S_STOPPING)) { shutdown(); } else { call SplitControlState.forceState(S_STARTED); } signal Send.sendDone( m_msg, packetErr ); } task void startDone_task() { call SubControl.start(); call CC2420Power.rxOn(); call Resource.release(); call SplitControlState.forceState(S_STARTED); signal SplitControl.startDone( SUCCESS ); } task void stopDone_task() { call SplitControlState.forceState(S_STOPPED); signal SplitControl.stopDone( SUCCESS ); } /***************** Functions ****************/ /** * Shut down all sub-components and turn off the radio */ void shutdown() { call SubControl.stop(); call CC2420Power.stopVReg(); post stopDone_task(); } /***************** Defaults ***************/ default event void SplitControl.startDone(error_t error) { } default event void SplitControl.stopDone(error_t error) { } default async event void RadioBackoff.requestInitialBackoff(message_t *msg) { } default async event void RadioBackoff.requestCongestionBackoff(message_t *msg) { } default async event void RadioBackoff.requestCca(message_t *msg) { } } tinyos-2.1.2+dfsg/tos/chips/cc2420/htmlreport.tar.gz000066400000000000000000036305261207233610700221370ustar00rootroot00000000000000 |Q<@,( l KQ9dۆIMRR/@- "*"˭ܷ`9T(ZC gw4Φm3Ifw~;f;ɶj7)(V5l¼u|15ER*&d *rq)fY%EIf3&-#L N|PҿSvfIn$/GEZBEHr@g'/G f z?THr$ND$~Y#aG?5ҿɟwG?4%nBYRpWYx0 ZW1&TɒxC$H&U;H^@ 0@#տX$N`&OPNķ #Q/Kп$X@MqIeIp N1͖3g1,V*pPF%뿣io/J-қD)$icOQҿI{`Ui5eIgjdMh1mq0c-ZMpdI3-y&=b[-b?NWP/K{gM1ќ`?'K>w1sREE8M%ѿ6Ev:*'FO$ZϛkV( d?A(Ka)`biT?5dI"/~_C\W,cׁHO3X3vnx8Hr7%?84G˒X,^@˒`z^:b WQ?IAo7U|W?ImPBq_M ˒ |n]p/PտZ$HM֐zq _JoL D_YH?a`./G ED8hOP"ɕB1S?(LIHOo7f26.qa?l?Rɒ`Θiy!g8(4, F Og%PbSq_j?H~_1YR@W|@4% _)1@ɓ_I<Oɴ3V0;f HD_T5X,"bO,%T(C$V!#FԈɒ?D&0dIbϿ>qɓD_Դ$_ YYśPI\ŭI"o1g<( 'UM(JF?;sB"biD=%Sh`4؀wti_u |EP(&oXsu&Zb0c5̺:Ֆٌi0c7u-&51ƥŰ[vCKElE-Q&-K&ʼ(VdX a٘x _LL=f1 \X%׏vKoy:xxU^(aa븕d2dz%Jˑa-~~s|.dF.d&IMru,ycT1 P(W4 7O}[v70ڃ&6>sk ADVx ҃ndKeL%'Ɓ)oGzfKjZ. <܇u|ǧ8ř{op.އ~^oAlqW-}u>l~\ J  3eZl2xr)Yfw'Nq| X |blsI)f.6WǵϪ`0 a8ZXcױ,;IP16)VDB*G}5ูoY4l{X5w VZqj R`%&42l̓<=;XlvfuVD?b@-*L 3dusY mq}SWk5V{ZTUAT~NcE*С\K;%q~"2"Hf)enˀ|.iՏ`LDPGH_vr;*Vcɽ8VT jrLhl6`Mh6:*OADYkh!- BZB AoĂV$Z8@`AZPI= 5|#0" %$!f};,&vΟ!V7mQ|)LPOY=ofYEb Sy?P#!k҈" "" "I},Jg;G8 Da$Wj 5. H{~+5jɷoJ~ @M,KtiwɈF@+U?GOt{?t#B B!Bɏ~8j_ ^j%aa>5A`> G<]6h~cضE4#iԣj9<1,''B_SFU" [ _5/HH74iE_EȂcD~%"g7ّHhX]6z \u+<ŭ O #E&'sIbSd9ݽJ4L&@ZstYLL+h8eSq_IG@D1!SgCK1a\qp88b.dp+1R7nLw6G[~nZd0,P3\юmɂnB1|75)\c hecz:g/ W*\2Εz]D@ zgM@C A"[$ac  D1 m @x !!F@ <a)*ChF < -̋&IRW؉IIxRR\eKQ*RW-/K]!,Yإa9"}Sh/Ku$ Xt"z ^E/@K%Pl/<`AoJ&?­#?9>!!gȂTOh|  LBHGC?J d#y(^ +?>?~ωl̘Do+p/* ?9"~!⇈"~!Y5HAO*;ᩞEr<ގO+qLȝ єy wRcd1iAf}Dz^\ub*4:nШ弜x߽LPϱ~[pGh_9yF^{E^{, +Y" R:sFgt-AZPN(1Mgg[<T#^AT6^T9p$,9la4>(OpvYR:QPhZ ?E# " F"t T ׸@Gd '$җ j q\=?hT r '|/NfJXYü*pYGs/V6^Zs H(t My8%ۢDA@DA@# V 8зE2%AZit̳tjLa1! lGXTrP`л1DZDSdowVFx!M<>PB_*S!#GO@F(  B(  4dTTnDAT"K b#5)a# HlJH9"*iLci$zw Zk_x٢℄p?zX` S{Qj&KB/E# "" "F2 (>jE Aq " T( RMK%ޭOk@'z PM<ПN =\Cɒ hш!!|.I`>ZD?aNG?pO%?BoQ^y=[jĸ=C]LmLhη2&P3֢`/ ?$Io(H7 f!!\A|x\)"tɔiD #H5Y!i(Jjk=)|"ARKV1%IE 59`@|و+M_ѬF2vFogO6 ^ch10W07I, _/"/"w܂دTjM~}"B A}UP_ # QK*)L-54' U+)6jŔa62HQyŗ^ ׯ HxV<F1-/ōIY3aO}LBc?Fʑno[4b"֋X/b"֋Xod^q]lgΊkM4gZ%i"Tә e|` d 0G,pJ|M *!/Pj'8B( Ѹ? NcG~(RKdUjS / ^O # Tu`AGxCzWE#!E:,IE:O,?t4Ql?өB? y?j~4).γJ`$yTɑo" " QD"P 8СLT80; ` rW"K^NX)Փ6pyQɑoш!!QP ϡTR`iV;ZqJByo?:_zJH,p^?}%!ߢC?C??Iܬ'K%Ta8*#{K@b%9D/KKG՝OJ_H ?Yb!b!/+1g~! S#)H՗e}*ҿTKӫj>7 \? 1H7C>C>}Dy{R= Bw~n.);0g g~`0 Gi:;yǴJ\EW"R'7 {[{oe8Fx?p ?E# " F"DgJLkq`H0TJ-쐄  {~(.Շ(_7y2](BgןtC; qt,>( " ( " Yp@X`9OTH. #}q J5Zޮz"{O?H}ATA@ ES:,BOFQ@DDQ@Dp !,1  B{ ߐ +KBעC?C?"%³/waJIP߭uGe[JW=/\m !)`?I1XCJ֙L8M=8N^"'G_PFa@Da@, (0tA4P";ᙠVġAUPEj g~>H*IV>3-n+(TI r k:Ɣ`&AhTO c.ԌnD'( 8V'*IoK1 _9~M_~E_~E7ٯc؂Df:! zq%| bYnHJ>hk[?"(5Y};Qy9髋#{ &( z[eZ/~; _M{_hH"`n"#`'ϋ #qNkcn_1=t6G[~nZ @r]k;& V=Yu wԨ3p ak*BX&I(y<~bd17aٙfQ[Pbx\ϛkV8 MM8! MU1 ZA_Ŝi Q64Ti M5'K:CT1[1ɕPeq9C+w=Z}>ȕ! D`~^Py׆:C^6&m(HobZ}ޱK-7 L- <_ХDzԃ-~E }ah}̀E{)G9'`/ M _1EAC؏&4!48I CGXC0$qH,8NzȵC~I~HޟB[bHb`ZEzG$峯L>C+\p(Q=*4Ah@]BD9(9mAl{ -FRRG1E_w$@|@Wt+_b6YtX>wYi˦b9OѴ9āBajdF3nM1\DS9<4UVD)1!)1ޑhAV!uݪa`Rד҅2T吂ƕZ%W@HWDx#jGpbYGlGKrՎ5(MUޢX%f0K_җ })U Y%5:ȵ9i˄)R>컘o wج$*-%X YBxBζ *uP}2N2*_ˎq2%iˎZ |\]V\>}u|K7J+26@R!jKY[ p7_- "J&"Cs%qjH8&XDj 5$"]Y$.6FRj S`$.TJB$qµ,*) K R.'_\W~(Lr 1}|ÿQpoҔJ b,`0qP1R9h* "*~Q ʓ-"&R`kHap((Lا54ˆn)Ef-_`8L Aqh_Yҭp o̪ 2:4*=͊n rY"̱|q3V\ǒ5^6g5ӞL!q̹ d)k,P`qqthk;q.IP+BUJ#}ܹ4ˉg2rV{ŷ vJt;3h[.>/K[^RXCj4B*,M 2XRG2RLV0\*n \cJ:5)Ss 1B̷(U.w/N(RRRRax'ii$#w䚻4=)J y(9O ?eT2YN)ŪT)&ZjvJ* M$RUtMa#BY!QYR_uyL4c@F k]T7E}+z`iKlS|^8uHVĶ)G8\ӮsP[PͣG5bdO ջ U>|TQʿ*-c来倭hRzv3lt6[M;rqbs*>/B<]4x[lRNrd[EU_].JE!7!BvS 8*ϢB:*\QGΤj1* g%)zc  V(V#U0*>/k2)*T3E d O:ey.\:9PLKee)ƣ+X0urY5AcH dqCQ!wYL3X3vnwA|8M!kE%-hDwy!t7oML|U!^`fGH :"BךּFٴUT6 uƘI1:XLkç<ȌH#H#H#H#H#3i̫suDH/H/H/H/H/Ѣgǚae:/TLn[EA,#ǖXqeV!P )zq0b0X4:sigvB [L/$ $,ђs+;n*uYKpe䂌+*)5R[HkHkHk\ hր"1.O(#JFbQgy_qY)/ M Jm0h *MS$.p*M C >*>/䨂P$ȫ,/k a@Uu?AgU(l&_$87{(;68G *mgy.ɉFL"*Z#2#cn2~ǢE{,!Q=-c"C'* >/45Vk$*<23^qfšԾ`  yFHs1KxE,h =ZMKMFWe#- E'GzCzCzQoUབ0O(c }#ijxvڮ>A):$Ҽ"UPϱ)BHBEN|@cG>6xr؀ɶ{O4ǃ>oPB;d_J .OnO͒3m(&%B7yb ؽgy^'ΦJJP̀*i|JE^6&m;­ֽ a2IW(t,e ٧J Ͱp*ˢ/4'\P~L-^HI* S2;BV\B rinG(^e^kwNԼ TrE3||eZal%?+;/h uA|;b'Ft;6h.>/Fym兢ی78-hp%P}Po?Cmw[B6x*>/tQaКtmGXKam;gA~UuDh88|PQ2隍3~NI%tu7"B#KH}85(]sX-Fw4e Mi0ZMiEGtlA&aԠtm NcanSZy4~t/b?E`)8)BS<Ԡdm RclS*ЦY|#q.|ҫ [ݤN^8&]Rێ<ґ|O60}kA?5/jiJt{Bo2̯_go)E@r4P,B_֯yWo[Fuy"}P bFkqҩIQP{rNG?qraqpyfaQtmBQanA2=E?rLUhA -3/|#"Qt-BQƢ IRarAVwEqҵ E5<@Bi?tڏ͇|P%d0Zk)7y%~4(JU#(1xB4f֤k;Z k!"AUYR#,mCk- l}seX E$(ɕәL\`l28 `xUR I(W$5t"N6*}.JR"jEal7Ll=/>.|ٌb͊cud٭FsVhnPgҙA~ənlJٮd(ӹ[ft#|[Z+|Xvloճ(n4Sh\CB{RV);nh$dRb{ E)Ry{^29 +cJًL-aAQ6fOMg:ke~%Tgpl"U$uo Ӽ|dP-V]^R,o,ˁ!fgb;!Bw~Z$|U|._Cfm@G6YqM@[۪5Jqz؅ {&m vaZʓo.,ܡ#aCaHꍪ-pXv 2 U  g`zAjH-"KNu;I3ʳZLr,D@ {gM@]\i^1 Uz1Śa[uvU;IaC+"a*aN@ *Ui*/J@v1U T)scZ6`{ 0+Gu+~[nWKs&-:b6YtXKcnoTEӖM/mvΑ4m 8|WL&&늹q~k5fe261(2-VE=[r@94܉A կ&ʀ+۪jg&5l20vk5 Xb1`ɔ3I%Ū6 u֓V&`/l~H~n]9oakKDOc.֜=lZ3ږC+#0|L@dN7 Lnߕ?Ix⸊B_t wyi;-5wj)?''ͪ}0cld ۀ^lFdߴ2JELE%_ac3hUӒVge5J ``qy\?GES?6-eB"17O9ҭ={X.GN`BѸ[U8ECG!NJN@6%w'%'H)@-_$eJ߽+CS8N{ G_$w۲;Os5W]nՓpݚK'o1/ [ _V܇Ya+a u 8@ɕʽF[IWtcRpӦ_=_sLś&c7Wz}n}`J`$"Zz^no\_+JG6f%lΙ_7W$2ə.DQo 3p& lSz٦he#l6vл.f(]0k,!=`{YE~Wuy{vDЃO0'/&4l L! b Dh5P2a=Z+3?Y72627fx|7Y,<0g{epJE S(Sˑ\zL}ZIK`_Sww]S8hNc4n37  }kD0%(Ch/£l'ӣ[ڏ1ci5jq ZwoľSotlҳ_52Z;?۟^9?ƫtң/QM]nn>c~>x^QtXV*^,>__j}wv_d>m`֨ZI5O??b78tݵg|Fjj0+v*3δ`?lP:awl(}}̮wNk]rsrs}d`۱Чes7KDZ܁5%V0cɹF#]O x '.g]ϝ[7o^/_<>^xzj>=pϛeu ,st˙hإI~3?V5M3=ZxeqrхM[JUkݕ<~ZZQQ|t{y̓ ԗzڬ/zC ۬MN bSsGblRP2 [{}\ɡ]?T|ʇQczղu\z( /P_t~:k=/>;e7JjjZ̊i/wys z?)òvWweK9TuWhsFq#K ٰ5mUKܩ>hgLjYz/M:msI '=P?8e-Q&^[̀xjplěi62.ݻܽx#lCK.4ΊG76d}8~d>}w̷|5]ezEM v]{PQvjòn /4kp+;tNw]LOXy1EU۷m,9͢CkSxA?vt҇OXЖ XAolF* ߯XkvMС|z[~oZڱٶ%}rz|ϔ:S/o[I[Kϴ0'wH):O<~+i~@|鉷KvNxZ GV1_`Yr99+P񅥿Y]^fxJ +UX~j4y{^.3@qf֭=;juա _GK6i޿p׭ɓ'g챓5|پ9|v`!C|Nz P~ T<ǩ+S/`|@Iط-l&p75'l՗й)?g[WE˺1_oۇv}o&.JG9ϩ9s윱k킴=͛3pT7|]`.\'WgT1 T)Yrt;󛇺zA`u{L>+4#N(* `RaKml9u_ie޲8l|#wLlހSmCպzWEOFV[ YF5Qv2L#5\W6u= {~3x+Kb:ludV{3|w_'=as\:,x}tl tgs3׮ϩHй$澦esvg6뛁=?je<wƏu}alhѢ_~3?޽gOCkv'=>n޽J[CiV[;խdE[JsP%C׭.8?~ܸI/ 0Հ 3}8$f]~sY.=iQ寧8Cu /~q+T]+N05_u*Ep(Y؟{G\6G%̌M}o" =Uzw Ϟs+[]֭M ^~ȷld7Gw`걇F(>jرyю<[)ru?;cܸqK(]9q%~ȊW{NYb{Co'L;eޤI ČW.s=~ҭ+YovJtd{5tŮ?_~aÇ'rˎ.-^:tR*w]rlBo'{`Mh)Kcaϴn{cyЩ2l*=m{s0M+Գ%/];M_dߥ h;_в&tm?qo=bN7oxw+٩|nEYX=;Xag>I<ӂM>4Ҳ##0[{=oRW_}7%{RtJ[d!YU47˥q\ q+\pVQ׻IhX)uzlʎ g10N]wxF]VCu1Fw^u󱓬% YʔMׇs)`/^p Չ[_׏U1ײַoW=?Փ]p<6>2t;6^u*)0zt"Uc`%#` sk֤܆\N^90v5Zi:u>8GVw71y隯ֲ0|` ,応ٜ=>{ftɴZ?N9mrJnMvk*ZbŁ;%jIEat<ֶ~峥}~7ig9O ]?GDǎVnݺ5+++`;w3AP链AOevO}lAWAAl\g;ЀqP\$Ɏ=]OZ玊R^#.SNu m~zW>[O/NZXInO0Tͮ v;tyЊgkv}')+pײOMX wVcuqWs]ͣv.fgt 3J=e\=$qz OL\X:OO` ˗/ٳgYoX1f̘aÆSo_+ګ̶SuB͚5/NL?%O_,`mʜR>dɼ!ֿ;ǘqLtffffg³%*6\=&ojVԿaӋ64 -ƎtX-InmV7u:S'>[y#xdf]G[uXv`ЁW/?{xE_Ղ{.X,,]o*%'/ ~I8H^8'e|gL,8V6=A+S>n> o/^}|9v]+Rޯң|iޒo.zސǭJ޴ _~ὙL}VVayh쾝>[sy+Wcފ]9酶-ŌZOwxf}rj7ۅͿXy#Jm6~ߦ'z'3_l?٦Szꭉc*}Mk sfo-&WOOж ,LLWwL6>1_|T Z<4]ԇگW~G4h0Jg'dYYٲ>L駟>+^{AV`> +:}3ū_1ڵkO,}^ˋ5M?s`߯U°Kׯ<7ľ4zԨ%]ڢwx*izŲ~U6Nx)~!vN:p0>sڧIE>+1~i X1]̴Z s!߬Pw4xWc_65PJo[[[`jܕtcE-)`J2O^g*ܨ˸i#,m8ܸ],#.YwCwG3L^`Ԏko_̲fGPv8bn^jQN͔K(!WL4G'tjʹsU:'?:t ZHؚrt 6W=U˸WG&~wCv/.ngq;yKW.SN>^RcwAqSڼŶ'[f0{NB; vf5Գ|C>\Q{_Ou;/D:s*oѢŤ=}ٯL}XV'I@JG)ۭnSgffp噅#Ľˌۯ~vOYxE4ź #mm4caӋs74}O?;6 ..UzdNZ\ٸqcegΙgmoSlKg|Z?iExkNZ|yt@< >ewwQb9i;~]-|q\kY␢ӂ;~N`^6av> z͑U5[Yp)sx҂3g氈ܳLVL1}lϜ6qJ~y#?}|(|J©y6/Q}hk#klCu6@d}svjϠuyp'N:t]Ʋf]=r옹dP _kW_m:U|Ҙ'c{qaZ&պ]feokJ;sGyM>쩋W x$ӎ9M" W=tKؗW5s7[lxߚpm}s_?6Nz%;]_v|;Ԩ\]ޓ'On:_[-[~x]+TC9x@uΌa.Z؃~~?QūkZI:žuƮ;rU-;~v9d뫇/HJZ?{o*dP={^l-;cdK$$ ٓ,c,IIl#1gfHs>ﹾu\]]3~r߯ugy?S|WyC KD]?GU0w4DYunj)9{;yϙm/orA#LMH9=Vp_*{N?PEkjJ$7 5>!C~r^[5L &KD{E=ơɾd׀ gv-keqp 35XՌ5@uN'w^qEW mU)rD=?Bqk<ݰ\N Nͦu/ڎHx^sa 48-`ņRM ތ~\ `ٳ{oj6xbahDynSy333(߾>yJCeb@HVٿuVz5U!lq!/q y"|{+B<%$tCOЁBoL :$VR(;its QWl)ͷI[,@+s; Az\˴țV>~ 8zKS=Ack" /J˴2fswm!#p%J=H/%3ˀ)N>4OJw /BG*ZK>=eV[[[P XÂ{ŠMX#W(ȟ,)ɰ THn,0C'8?7&YWiM0󩏍}ޥӣ-KLR1A*_?kMQhub!&XDe![$I89IȬu^\%MKZRy"K[T©w/VM5.TMaDu$Z^}S6v`zz:f OynBR ,l$Ñ.Xeb.(Fzu}rӑGv$#.ͧݽ,55ysk+(% ʜ(8C.?)戦`I. ٤,m˼* Jt[{+վHX& KbƗ%(pOt#X?0ϗ8 X)}*#^ Xl(Idn{yyʾ `_wbLWIc[Cuf]sƺ<ϹԜ$~es$1^t9 oqo#27(L'a2*b^-¹{TQÃ>^maǫb3 ^Ok_m}]ԯa(Lǎ5^w~k?L},PH˺yy3MǦE鮬ޑx͹ijE<>(0pD4]* &&&s-,?)ף+++GGM=;-3!sk|<+L ߸srŭ'=8G'7 ٨๖x`FW{g6;Qg-Ť?x9]8;&v@W/&Q"-/UX)$x;;,6pӶ|,9wG_MP&:zxW1z=1gКqѾ"jua֍]ۮ^) V5uzWW~.HY[YEie I/o=sNeǙ/"m-{޳Ͳj'ׁ~HgbC :qxg'ô$[6  1BwT+Z[mO _DPX _&!$ ),NCTBo?tr8/ſ KܺMӀ2lddž#aOrND];n*pq_j[.+OWʛƚCevC.bVƪ]" cM~nۀm4›AEw79ӟ>f?+#bg> F?BzjMV9 /fÇ#q^xoB8~;>(*bmn^aSe7 ąUU֙9Wׯe]|GPBkJ>QS`?'hZs9eeݑ1o ٺv QuL($$Ē9b(f,fx3z~a|!p]TAP,1b'#bbfr#Y"]?FwI֯g::w=f̽='sΠCȈ*;TOϗ)ң]5;BwPc`^Ј%BJuY%1T e_$Kk[8GFחƒwFHMXH~?ܬ,"۠4fP XK ^_1t'GJf]ۑh@gϹ{<8Biy/Rݵza x 84Q\AJʗ rFaɭ7pQxz/ ;wޕ:I".a(sL;bo6`IpLÁyáYדg]S_E|v6^a(Ռ9({Zf.w 0 \n!OXg~8'iXSaجKsIF\T_gqQ81odg9Sָ+0hU@OpHib=25($_`?4ZTH,Y*?|PMT!ШS˿O>T >Um?>2#x!Ϧ R 1!yBc4 Lvs-@W'>aAiitpنDF%&&ڵ˲` NnnΚbU]v)~|Cu-Nx:Mms̈́8 Ifa. Zqh9RۃHBAPC.uau_ppó )0$TY^S]_]Sbu.L_vXuKot KYPI 7^UFu>|>r-&h=$# 'R3.ke?e+1(~ӮY\[eI%.Ҷ\IneySC<J"3 l*Q~ŇM²fKnc tiB|3p=tz!`suC (X89'q/BL L "I #~{.2۷nmWSSӧo꾸c&zz؍nz?XU6{ļ.vf48p@c-:oڽ.B~7g9 8z gg-m*^Hsc]Yzv6 -I۟(r3qI^UgCv: <D;RY\,&$rJ;'4?8h1v#:@!et Fmm4sm;ZoOKN[b m`D2`qeը! 0gkkk//9$uA4Ǚ=].\K*ߔ x^!e|2`2’{BhL9A3MpE8҉Ƶ‰6j01X8^Α₳.(16V+,XS-z>,Q u9fXFLEDO{zL4)riK) 1-N! HmCo `+TccUif0 RԑO :|\(K!&7]_@P6􎐓]M{v,!A\:ȯ+ʊ $0˽jsHP+oY ]@d +m:FճSr73knMm4uF\MQ@}`"9׻Ⱥ(r͇ T5h:č1Axl?FHu=h'#xul &r2& ڢ&%N~9BLDʇDswQAh SՈ \aByUͯy'^c8 MVksK*qѧPSM7+|}9ZN`W\|ewELb [ܻZ(E9zB؃:Fٛ^۠{IUkSqf󺶭f[*nf PN@<x.@P:S7<nuYq֛ `d[(ދDgޅ-㻀ʃIJeO@3), ) @bS'$R$!w'e?؞+ l;#d3IHH[ki \$ʕPZ 'JO:s{$>HT`FFFTA5 wTB/|,ަ+Qg+txenUFr7~mڐSW2Hn}Zפ =䭈[E\@D{ d=5be%A^X5l:"20I]v$}sZ*V`,̶WB%G^t3{!Ve;z^o rH~*9ˀE4Ͽmi "A98ܦoD#A!-!4+T#QyaL<@cLDUʜR}_;$BPɍ0.\HbG9Õo9g^x#u9G`>FrĜʚ j (oWKHvT}Bxҥuǧ^/hy~ V b^TTdW>wٯ%EE gS"=.2ѠѤ}Fc&tL>(I{{qq!c*2%#ܤۧ5#dJ' x6255EIE5DFyGuqR5]}h;νhŁqJ#QxfGPE ]1t x NkM5ګTM<$@7rG_=RT7(7wa@uhILg3kX&">[)R{ʐH|ϣ5oDDTDo6闲JTӹtxDOL)a''''TP2nWW˗5o\S!g[$|QaY"mZ)j6I/--e%7#TTUFBaj$LeEW-Of1䑞rXcVtS=;|:w:|/oĔ4:JJ"UnQs,nm8LMGd IkA:sY2T-8ꀋ_MwQ x뇚dJF?@pihg%HZ"71cBf9,z]FUk,cX]|py9w_.̚.,O N|pQsj?.SΈ>/ho8\ `B>u)sgiΠ+޿ZtSv+{q ~>N!hki0 "POoZcQ)31Bv) o08y'&)+CRU_LT4榬?miO)8N(7۝~su@8VADY^6]FArD{GFe긎̋_2rI.߹OĿ?q!b?f<Z"~?~zc[?Dʟ1N~4Y S\i#BمLO9Sorm?Zq&孋sRMn*[cce8Fas WR=v_d3t{qt1>ao4R# '~rICTRJ| !l^2C6|wCknQ()AN3@2ձ?3@Zɠb(7ɅeJ[&F8qzұFOqoW=FF&c}(hCӴy׍F#,ƱvAl-X>mn ұrMG+5uJWEEZy~8e[^,1a[f9jcWZX+#0|6Jl3qNᒢQ~&&&|{{D6Y9ڜwNMdwbSSVoNVzt5wkHVeEɾ丣D fk?}h{iV!wC_30nngKU4 "ױErssхV`x炮l3>Q0m_mD<`1i׏]]c &?~TZ`=#8BX_pLIzw׾k{yZ1;@S~}6Q{=tpd_3N_S@='< 8 _M[LSKAAH+7& t^(=#6zλ(OSHT8ǒgZ*& kyL^zJ'ʪ%oX_62xjcd.b䉠DOya10Qp C7vZaXK|J2J]dEU2 t]ݚ Wfз E-AՅv̇%*sh!9$D"k$0j̔J=H)? j}V 1N$ix)*5/z?:!êbUȠE"sr(sDt㓯UT^FK=}63emE|9&#E)Fz\Qqr 3XahwPO*KUYn}qnoDĊKKN唭%;M[t  rv,&$$[:P+%DetQ6)CakHъC ϖfrrm?{ wQvZFHh˞mP<=Y=NU>y1<1PG5vRQ B `:ƔB7pZyNۼv)~ $m&j!ߐD"Ibm혦!,)Ah[Q[.cZv|l7hGLIAA8 k֬ЉOb _M Y4|*~h%+_-*YzrJWE~~RtE==iKm;sxũcM߿JzJ>"}Gs-1eSV*sʑŎlmP"< SSU]5Oڐ*Ɯ6\p֖/2Mc l+R*dT+# *fHm. (Gn|8ŭԈZu7)|r A4c۷4c|a[)?;ܗa2 [X\QeErGOlj+gf )n_˼:kLbtehfA RJc wJ = :ji _zpLYl~7>=0ZY!5Im7>I ifbξ)*GWHmq3QR䄑Ko 1Z ^FF& ˋ0 thΛ:7 [0ËY|ߌ0DԤ $+KZ3;շa )黴J@[1r0G4ŝ3`+&TNm.3qڜ晘2KHF8cGG(uZ{XG\CG_f?f/KJ|bqzA(ǭJ34^Rme7 W 3ID쑔z/{HH?(弇xvJu{;Ђ-VL.yh3N| Ԛ>x-FDLeg QZ1ꆣd}ic%uq{Zż!D]ϺK]Í/>4tbг`mLeV&p$7'|".7r Jdv]Iz|N.K'fy".gLoMhyJP+rDT.}w{[ᵣJ̢"""BBf|bҿHm7qGT4~gWe\ Gt%ьy}Z1S9я(:n"g`mafWS"dOO OȵM6d?|5&B6L*~10zEH%sNת>>5AT?-E0)١8ݬ%.a RM0יLS2 3Ϭ^E^ bBX1f8~ȀIJUΜiϊ!]8ن~G(a';ƒݾ-64 8WETpWNp+Ro̙-6.q EKD6`K~5Q.h44o$ Y˧OTb8ll">CHicce:$%>ӭɖX+~35/;j'XPrjMY֗a욉܃{I0fm\7Yk_Mcr8 oQQ~ؾ6AIQ qIm 6!!IQ6b<I0_ J EٿiP&'*) m--&7m[sM_@h1)BxDHm¿wڄ%A_6MT&5O!O1MBOm"&*)(m"6AA  t1m#,& _O+T#^G1:X!0u r@4#5 v.M?5H>~rW3=?<ܪz=PR\awj"I))+OO{~*虬>.V uGDDP!ׅ- 6xoP,oBLOҖ$@%Y}hN4դl% LL17Ott7m ߨ{L%<,2{JC4;bcbkDiN84Sa^UH)X`=KzwkIraC+He#egg)%.%/AߡWF'/tuvYYYͳlD\mj*Z>u|r\au|lG^?@#1ϥ AY[ҮIܹVd-69*Y!T|{l ֙``zHoF~{ @RP38~)Š%cא1$l岫UE0FJ~CD=~ 5gvtN-עx[>" +wáL[9kUB;ϊLz>T. W 2e%]`m@\.q99#<v'IeUCWR+Hj['9|_~=9r! Hw!#bk L>ci! |mfF{CE͛B725X;g}ϝ]՘K.yR/Dm.hFQ &BBhS6 5@dqT,5,..Mv`trRڣoe|%1e}ta'0AO>l}E Q&]جY7U^cHicxX +kQ,}AKIQڵXg`ܩ1ϲ~g 5! {T}OaG.-X uŎtm сVmЂ7:<{@z{7'^ dRvTZx ~cGJLY yxR!] `=dݻ9 |Du3XA^ ^8!azW{ohcE>啕hwifB٢| ŇR^.a7(64eob؂{N蕄BipYsNAx!)JË`~O3pㆋ]MEz?l =1)\v:Q.XyR0-TzlLGlZXHNߧv~#g*o1h:N\2|'j1!bFƍ@vZ:%c |n˛`"lgޤO77]!Բư+8g^hq1WMoݺGju2a˕InD]MVH3(sNpG:77ooaq9KQ, R+3 y`.111c΋S .s"*0G]g}(B=f@ w՗V~-X Õܰ(Dl7y%8f p)yY˙F2ޞ{|2???{9Xq^ݦ:^3SS"4!^Zo{Y$iZl[/MkD #@YԨUMϛ|#Q C'tv<'w|iҿ݌?Xo䇓g@k-r#>o$LbJqNمM0GRPG!K2pbm@qqN qw Wu>w:}3`qgC -Ɣ㒒vw׷fdz#7$V*-v#У|7vIUchi bdM?Ήop"m`HmvO_; K.O"8R"Gy6E /Xa s|Wrދ(KPң8p}]g 6uBAx(1 } =(iܘp;^/a`b"ena13,1/O\xӃUkZ]-Xـj]ҫj1ت#$1Q!`<5a`V@`۴u3kܪ?D`/1"=o!6qǣs?Bc _$ s 2d&]-9j0׳c6vD ~+Yg6776v4^ZmncVˊ}|ѶV;;i13$TJRry1E0"x Vl[e+:ݻ8cemWԲE2eM^Q (Ns͍C|\et%|8cX Ұbo1(D7oL#`|@lλ";NwS/"+**Udۖ|/ M 2^WfD 33s&[RlR5.I*+!_1bFLD#cڀ׭سT44jBm9ꌡeh٭E,mSKDB6m+A"?KqQdMIsm[>$= ++Q#9iusTp1G%bX'lw?v 3ev*Һx[c!w(o>/"uE5澰ιLQ8;7&;IF ^'2wm(C쫚@FHh}22`|c/ՉB:nx*S- \<~xaae]xZ0DIe{FtIY90R#r$,aR/V4Cl崢,qoTeD݄3F_ )q:v.K ;\ jlzhbZ:a $&pYls&TޕB^`Sf,]ˌwBWCkc/ʼW-˯>>w^L$ӹy8ynl69>_MI -)6y b4)ng|`x- I~%vZoױUTV.Oj+6|jl|ɴmz9_ <9۞{~ktK>e2*hG\QVFh/genGb{ˡ1b~?v75~1 &H.~:]^۞?o|/Wg?88~~?;>?9 G/@xh~@Vvm8h}_[rU1ֿ͆n&?[q7om_NοrM+nc=t#G+ci\p?ysӿ/6<T3"Ć)| v7&nQٗ`ybU/iB6:Ϝ0c`WOmO]4d)kvZN0Ln᭠h 5 6@{ Ⱦ!q0#Wz(+.Zh`^_kk2ӕ:^ؿ5Tú(ʳYyJVꛖ^46;ۛf@~KeDKU5XsiiWyk}nܺre>((豉$3+_|31'mkRYkO4GR;k5b}f!ȆQIIo6IոsozzzH} 9?09DE]k&yzYϊZTU>VKTu-ÇWO[ 3Y$>ZPqJlEDZ8Ce/)SQ1f7V{KҴ1!x: [8}(Cs{ۙV r.漼0xhCd \}o|bݝjI!Q p˸ 4֗ZtOm^ |&` v޳x7b)ӕ]y&mI(Ck 711rOʬ췜/Jv(9᳍(EӬgc!KބHNbs^%2xwpH}g dAޅ"JԋO?۷ěfKZ.ltg<2`'u `b/oBx4kpVo{W"Xk#挠GYÎ}]oڙkQ>CyaʯU $틪_.~}ZrKX _A0V^|Coz0m)II}WC|*P ޡLOJB*&+Bɩ1UwL@d4]nff2[g(*eĄj`;o JJhRQQ11ËG,LN|g߅tno-?F]j^=$ lE@;6NfA .-95tX ffhѐZdg,ɤ)<112Ju 3gg^"L|}3GC\,&VV<3 {%Dڂ: f C$B"j><ؕ1u :sExGMm.υ`p *_~T;>NA Rďs5"Y(M AbuSiTy3N 'OHН&8b93)Qnh!Pl1 3}_Ù$9DE ʳ߳=]Z*qMx{4"),hbհTȋ"5֥ӯf;6koGmlnrqDzg7XlS;inn 0Cĸ͕O>--}thι&3"A4R=*bHL,7M +BZ}m&rw6L1A\87h9w8) jF ZSCsQFWğ ` EP0]B6 D]%BXle_+ c g(::uVeW0`0dF&&c^V}D8|rcM]8/!x j-li]'_ n\Ipº'ywVÖX[.6p~ ו8>]А=KGX}Ke'5݃yxn11>*g1150;w]nCa 0X,Tp(N-7Pfʞ} -H} q]\W[s:|F?;ο o1e\M?eE a柆׽ook#N*wmFFMnp&#߫4/HnV\LiS 7 N8h~%6/ ;FT;\* @X?s"> @'U;\qsjz821[&xtV+  3@676R΅JA.MN阡H?jPxy&<>ꌿOem%p]A1b%],#0j,\ 7 ënֺCJf=_ze}==#  ܐ$a1DY:R|@ɔ(#t͍~;)pGG6Jj%ʇ666cw.|I]?F `Q ;9zb87Xefqݍ.Î%R' E2t&s8Xv'M>_6f "I*7gh£G n׸XZg!i eq`HBˆT7ZR0$_eIpJb]><֚hmmC_H|,`2XlڋةdKK/7 ܍t rp5`hYcQ rԔ$n=;F]Ι+,}ƃG c|V:Vz&}sw,{hc }$8{8u:=*uY=ڇt9[q[S2V\- =z6:"|#m*/U XE}C҈rvUTl^[","7mS ֱ% tޔgUUqݕ=sR^ъѽR\ye*1L-#n0.pX#,GAԩSt9]]=}r{raa*ANs' r@zݣ]siygi͸Q(xo4RbrY|ʀ>4FTY /HNJlslxVO ڂjճ|[JVm!U@>}QCiўn3fyzATˀM_@C @i;.XTXrp;/g@ 8| FX  a6# US[O2e~uA|aUOBFFVWWXt(*Q] "EOJ ^QMZù4nq`iӇ,][lL}]`2z\~KbB=hNVkZ6xMҸ vĈ6_LH2t'){lžs͊K8(cmX~!N @зq8 ᐩ(KyH]X-Nj2ܾ<9"up9+)- nEGb[AZ%T %*eHW̬TC=,+l_ NO+R0Ȉ9nUNv `0*ϟCյBZrdR.tu/J9ǜLq.,;!Ԧ؄X.3]t/=0E#ѐj[het;[$6/E=+ӌWf ޚ<݅T&_}Ŋq|K'C3U8v|=PTAtU),~Ô;is:C-v;#]g0cg-ݾZ_Uq ;WfFȍ8Հ]2`KqYoR[xe- ڋL ;}cg챚EG]Ց=E aZ=, 8&dO%nro ;,dK-Xj*Ǣo|KIĶfoPn,h4١شRPYPIAI-#t϶~|.|c{=ܝ*6X]'$9ޚ-Q$ JAPY>ü @`9.J=20xZo JeFL`A*cI k˔DSܶ)$4ӈuhSi9?LW޴<,Grzh){=T57ڧ}r;'IiID좻(11?Γ=KXUeRn.3RT+=d|(P $hRffgמpb ZPg1Qв k빣;L{t!<;l;̀zTҹp蝫T]QI_W*R o! I[=KSӫQN9Lu)iCRgfQ^jln`꣦>^^^qԂT;p+6KmwL eo!d;t&[)rdxx͛Br܍c}4PTTT&8;zΕ@6SssP9aׯJpC뙻3'wK-lS]H$4F\1 jyл[Rfߝ|ܪq8s͏0`X6OEό}Uu/aCC6ڀ} @S;B,xeX#pXPЇ+ T=HO 5-ᡝĸA'{{q>)7*S/"F۪po"?xA|h^k} O xYTRR2&6>vddlo'|#^sYzՔ"%'V8aTUTĦSdMjb4/D>7*&>|hPyzY75HxKg=pݝ&9c Z6vԶKmXA"fvJWG^A߽r5:7Gs[@/n,f|Ys}[4b-!ٱ;eCpxs d.s%ee0Qm6+$$w{?Sz|%D{DgNYo=qJuuEҌ Z?/Z +;i<Ú+@Fk;R"~L2/_R5u߹LVVVCCd?s}a? ZPv*ݒq02zD SP@75DGGSTl})^_w6`Js"t=K#ݾdb3y+s=Q_ lE2%%%9™v"uIVru6YY+FZ=ҝc1w6W8N&x LgwBYϚsVl_|AgXs E:lo ho/]mooOh 8T?*E@LY+.H0kE)aNz( z$dx8cXu^^~]_/#ߚ[XX8q  Uf J?N.'/͇~n9 V猆,4w\uӿ3Dir ;$I_}P#*:::s33>2tƒhՆtRnT 4 $.LL ngݺ :sOa~9=%tqwPKR7.~QuV onn212~s-05cǏ{{yy5`m*Yd2klPPP}:u}F*Ī4Ûݝ9;5Bo%XD^=Q++"6ny/_(vT[z 5@ r#".U:9m)B[*Z RCgIǵ谗W}[n)***P-4o&[0 OfDg'65$ ݜ,W@yg㫚 338㪬hL#FNCFv^5 5授 yt^8)LҾZ׽ N そ)pnP 5LzlccCs/.ܛ\4/yΈySY^^u illl,ztguΨAms (_u6"""%"b~\93pccdc8C [~ YjLЎoߤY\9Qlc)<|Iiě:lwvVL1J%v  a[X^keeu</kڅwXhp 7 h%>_@>l6 YQ|.ɊnW*{PPMu/ݘ0۲vo-/^&?I t&Ĩb DEPPiH7t婩'uFs'Mc.Kɍ]o8:?)Jf0"}^ o+ U|&B{Y3OMҌ`KFZl WrH : [s u=v6 w#w?G'~Qat N^ëܛ˲,`v-*4j 7Yֲ`V·B~ dsRGT8N NK>8% TBޠ%L(2T;Cxgm0x'dߌg1|"4DZBI-CҲ$}P17娳P 6DYaNb^iZ5 )쮬lT:!#u9lBVA偀B1?lF պ{؆irB@/JH|BYdV,3 mMM'p3tteD L(EP\ B?xM Zd8s7)Z{LWbki\W#XKp:8 7)1 ===]$EUrO_J B_F'r` O.SRRy I8Xc Mq̃n,l;Lt"lik;i n/3S'_^[5r5`93riI1Hu歖 I63Rr.  a ik\Z:DИA)p[ 잵5˅)3}fhnnhfnfv"!!]hzyv8`AR\1AtކWiܤkcco'T 0@|7FF;Txjs6!Jgg-=_~ ?+opy8up0l%NFd뾰AU6ip5X恵{F)>0m?oX}}TCgww`AMp*k/~#P@ZDNVNGlL n+#b?!+#'riό'[:;&$ԋ$뻏և zʗ֗x iAޒ%R"@ۉI)JW*oBCSVE 3 a@rDmP/{L;|wo8udjJ `KLLƷ wz 4F: 1hD/` Y}?nzu~FC\\%Ӫ`L[{T:LtNq!m2[ϽCSLB{Gek@,8u8֮%7~Rño* a #AֈCxl)"|'ۿ3VWG:^SS~P7^/0r.Ǽ(@6Q GLȣغTCy"վi'';η9҅s {0:Va.::KdeeĤFcLυZUX?={R#Qyo/pႦ=C`X>yKJj :+##c_5E(tnt|G"ܬ\\\j Q}ceGU$;ZZX/"t<t Fc6dwe"n'_5RcN"pbҞ~u4>2Eh& C^[?5T|BC371a R@ a1q P}k, [pl9T?ME~ "<ȃk*^Aj)سM47o@W4L8cuuuW&dϹC%ܬL$55ɹeCh.CǸ 9e3]QXAJJjFckkeZZZHHa b/''5pY`rxAX$R}<3 TFD$$ ]TŋգvHX_g / ]_~SROLE99mml^Ob22vxx2߿Gx9SSņdBXҌX&휙oLloJtwvWg8n)ܶÔR6c@PuRH#.W ܿj#CoP>\` ͻݞcH[$K]"/ T'GDDݣSPx۰mL_w-y[cee2JF|ԕdꄤU~O&, 0dW)7hDK`i 5@xtz/)v\RuΉ-`zꮋ9C 7O Zˑmu`y6?  Xm~MBGru癅;Ϋ ˝4^ă4C٪]:+y qzz=BQqV"u=ч/Vm;J]" ~X5aj',ὍEwd<[Y){6KYYAUO|PSp$`JJJ;&4A/-#[/W=ⲡle1E30 ȃrԣ&a/@Ϋ3 5Hӵ^ '|8 avwVw^ky- ϑWVn]o6& KΠ~cwּT10 <']Z'^|$y q),]x;ߋЈ w}7k8>mcBe[P蝍cʮ`jt'"&\7K0;fz\mՑ2ͯy@<pt<5dw }@S,#gA= vk2']u^(峖YHoٱ{$NjܾvC/4>~`EB$վR.1C &'&讅wwv^bg'OO4TK[IxGNA=rsm7&(E @gg 5TADH(a(R m7 &rLcҩ"JB"iiWMhE0y[EMp.E"֊fO%e❞96WkW/y65n̿cc {F'a-&6H/f5^DD\ 1rTi/M r\ޫ ]Q/q=閭ϰcy"R9Θ˜&{E`{4֏<^ #4THv(UvI#z"[ BgMk+{;k ALLL_PNp/??-_?K(gnqps p~+qsq]:s8<5k_s\P޿^:'x5(=k|k5s\!?rq׸8(ʅ7?JFqk`i1e??9\yIA ǜޤ3[OJJ9gu2\S ^^y-<AW.S_ExgAbb6V!1eB$VOz:޵Juvs\2Ir0BHW'''[ZZ2K\ǚbۣs=7Ӡxnwl`5_'ʉl`WnTDERsDM<,@7@,0Q`~@G'31qUr76NNM d?t}ƨ@bs&yXNӁ.W$%%~ yL'P=rr QDFPyiy朗fRk>p) ~}h# fRoQP(&&cjV&OA@R?!ldu7]\.oXA;x4\YЕ7&t|{uzoP$!HsL*;qz3N! _Ey0&T =)U&= @=[ap,= 71>c1|~@%7(8#߿_ZZz7?4dIC-CqlF{p0!QAA3[ܸQzUܞ1<=9F|ELy'3N w\ 7pp~O8>\ tb2ե1asɲ`Ɲ9p^62RÁc$ƇrdisQUm7oE_ z}j XAC8lp7TʺGdž蠫箞9+>@C< |lMJ{R3hL "@P:OqZ Ac~xSMn0X @T/:|d TiJw}}};H'fgm[_@r#M>ko٘ˡuWl@FM <8ͻ{  EՁTÀW&-~a +6//Ϡ-ebj*֮_zu畂1®+v hKcуE:_` >amuPrR d^>>nm|`12$b{akdR,_p>kf0f`Z4 rN`h*t1d]Ѵ{jpZ EAt[t= e|8@RB˶4w=,8==,2\wJ>\ރbOdKI@@y}ResiiI|`}}7)R#(-1A5vQVSC"5jCO:VC9I݋:_ENa>Yj4 K Xn'3qr*׈Ԛ:0ۃ2-qYW`8NQ~T.xO@Cj/EK{LY-Eb G?ƤF nxTk~Lgb3-Z\m<-l;GVg$5N.U7s@[Bqrqn9 xobgv{OUJw4TPJ*2U2O#C1-dN*2e82ϊ$Aqy~/wZkuk]kk_kuRGx˓Ki؇XY k(Pjцuwش u`6f%ZPHүԱ- Ju'΢KxI=Eh^o= nJYJŊl7S D57IIA}<&20TMxxM$,܄4JȰSMG/ !{niM[>AA M+>H/Nã P<7d1 m!<;cz0nVmLuNt5a泆LYOa9?eXkm``@5Zp hw--=}Hp3k׼R~, l< p.pvtLqxƣ7$z8ه{}oЕ緺ؖL]Y׬u(5EϥL6`V/vge7)&jՅ_}{_殷ϝ4Q[MkUMkEJ,R2hcbb YC{Z;fHTQTlll|kղ= 7_.9/޶+WeJJeђEyn G쓚t#9 0kQ"IC]r1G93"Ō.389000-14:VQ'tO]Nɦ>8W֊cH ?4K5p_H8?*b{fwGiAyVO-ilew40 @gE:9TyxncNO$5|o :H}\ ?.<6;r[|E@;|awB2 E D΅Rٞ[^I*Pp@L1W9RSjC奖i-K6@yay=}[)'6Jc˙& ;y"ԣ_ҷo񋝉=?RoA]WRCE&YJ9ku|6= ۖw0VU'T̉v ЈK|[Ix\jtz7媆3a-I $&4hudH3HXHz՝:Ac;Xɇ[2}||AqÈ* c!Z>bq 2izevC~ }n$ه/N״!-.F2K<#Z1e*$<Ɠ3h[I' ' _xR/YZbCN_3k;"?VtK0M*6l Խy'9t222kq/^^G>Sii]3]^^^s~fIyOABPQQ/{%-i>JKBCv_\ir9JVn"Wiyqvn'NغC ڞR*)+#WTm'"""*EDnz܂kK$^TǘRd$;p'֗$җ[U%,` "FWH&VeF8|ӏ jŨ^_z.(s~cK PS\TT4z:YhS*m+,fff&&&M*"Ɗɤ{|jlUS'%f'Φgf $dյspe̖v9< A4dV{ 70#Fj*t-~-lCLNܻNE-Ln9o-_3Qa|NgИֺiPiW:3q u-8 v~KxvTu IAmO܆Ɲ--I%Q^kQ`a?r/qT:DGIt.B'd{dB鬲nIe+jj"--uE-N|pq^TTy"Ʌ*ח+::j fu՗߆;N؊9@VnNpz)M90<xDߩA =&\"@&#C{JJC&ZWiU㋝g@x7:L11v^SɅ !򪟖.O&(6& HY[ZjB1Z9՚njf&^%$ns.-47+\MN>uczn?2/RДU8Ru S|SN*rrWQYYK^a;44T:[9,0MS2JZoJ>1#}5,9t^5AU<}QM+%:;; 83WpeтH+6%.qE5,¨ao^%[bko&$Tw<%_̭{P1N>yGSv3$?S8طs8.p&ٿ8!*YX 27y]46SYv LX˸08X :1 1c?qq}J'&lUUyy4H`hI'E9hITN}2ԩr#2jݸqrx|7©}trP{r`` #B'K\?9]1|]#4u-V OR2m1m M5d8_mIYp'q.44-K9/xn6׻J.ND#‡磇f8rĺyѶ56a)U]ZYY>K{j9}̓{ZVW~N7<8x(Ǥ9Yܭ}O<)W]-a< Ggcٌ E$@;p)LL))~WئXG%èJmz@^a5:w_<tDD=^ H.k/A'7QJ#"tAomxUE[ĭ%8UUԧog^յ. {ylg>zuƁȓH!OC2:Go{!=iΚYNn\qUB/N02f%QM-NRVů. p:A"S`Ktm; vh~u*0*~<2?U(YL< ݣhxPO; H:(khg81H*E]jݱI"p ceÐZMk9,@Mx}608و\!HZfFQ,xx`edY[0Y1o5D9tfmyn!͕ ȗ9:fQb2?4XA+os?bro'掘8~%aHlDak*p~f% [meㅞ6ػʲ oxઓ-AH H'@fa :,KOx抆pO!--iI]Q˳# e/H~{pIkWe@H56Bty$w' [__-SbƐW<M XΨ#1?>at#+Vbu IsUz8h&H@Mupbϟ'3zc0"hS~Tبw} 56{" lR]1Qx7w] u ΢\\c~h+BƸ`;%=j D8 gi{7HbYS`JEƞASo; vKdÖIt{t!nMez@OO.|I['קOiD[6QnTj,kk({DE>CM>h8KXĺkC@'Dᵝˣ]G, p=r}I3a5DD*Vw㱩b0"_/Oϻo10 QeapJ댊FN |2&Y\3qN,KzDຳpMzބ~w^BmkGekC\78It 5<:ٳW<==}ѭ3&"[BK)}= ΍NL0?tOُ_EgcO`J*s+tg7efZYou%t4%,B%>i븎+Pz МʇZu厔{'ѐ].,:IX ]љe\3Җ9IA[%ݭRr2(++3r|AdpS Tͭ@v$ i{)XlV,8|ގ brLVjDg {8HcZbkȮu4;Iny"Aa5`BU{CF##x O Z:PIr2zlqo+VoqU3{U#cdaDM{΄@gG7yE^yfJd:uǑd=^N<&!ho3vBd\Auj .2BƧkea42KGWݯ`OܸE@p0{{ɚ)F<;c_ Q5ue1i+?ƹ45)鰄FLWG2Q#­1՝P}ן-A ^]Z}).&a4@FefNYܱ88l{Pgk-D YXX36Pkڡ=1xdB|}6MAjL7QN|⨾X;T£WeHkLUr\3P"pM_$%.e&Vׯ9z \Y# q>$8-@#5^&#UD?^jw=Q yc๭!oH}%sl?>A}8 G 5AGS?D^Bȭn,‚T]ւb1g˖'4y؎rn[RwxSR/ {qoegXLޱL`!CBCDfpap°˜#ȍ(>Fxܯ$}'2 ^:JImY IYIA8"4n52<تЧN=(ꏖ{~ܝemUsbdn'Ӻ"U%FahRA܀/OY^'[r$&>AQ7QlBEi!Z}ft#N`T?Ѥq+=L1?8$4R[VW2x5,:ú:#qn} 0زea,W+%?Ҵ 1Ko0$̯k"I#&{+LrqŖz_dek{%!suz,3 W~Ye+#?˒n/T{ʼnss>Ķx؅29azi*l<9 tPZSjGEx}qT2on Stݸ<=ܦ+,Qf-!*TyEguu(Y,4zwS<ܪ.M1#l`H 3ڟ{>:@sFF4NIJ:qX.2tC h( ue4<{evsωREͷO;cqקgmDQ ްA6UҞY,2 T.Cm<hyNp`m95Fl0/; FS*z#OcܘG% Ce7?&*;FMpCAjl o1m0wD ~?h⳺|;ғZ)!#aEny+NiT7ʼny@͗H[#'-1 $i efo )Ff KWl8 :I#-|#\ĈInI< rj8 W [IgP06G/d_ Df Z|Y!ZKݭT>7X? g#WAht8'v3>8_QU#%_: D" FdY]|W̥8(Z6[_^3VXP2 .X>3~{ 5 Sj ͒W,i57T5/Q#/ò70815w`( ?21*g?)sfr! X],#Zbj@~¥f  mtU .\C]O":Ҵ}LRǑe3c-qcfF**舅ET7Sg,Jt GGSeySu!˄xKbyBNgggh/+Auu5f5I /H=F_tI{ELD=*N$$޻Q>|2N1ft9^^^پy:JwPPuAc>TU?~+k{șfhom ˕333px3VS]b+q]` J$ xxEE W!oj>^TP{|Vm}[KiiAT=6..!S^^^|XGjALϒ}Tj7LTs\/_8=z]A!n:{ڪTO+MMu BeNOio߸q}a K[# ٚwh:ҲӰ?BC?LutQ-IXIr>/ {ϬUT]c{m0E*59ǐ+O0[LxЉ;?F kqɯ__N NŴ_qtiCt!$df> -i1;;d~;vvnv1 }'088Jy@K8$Rg|..~iEל*>r&;:kUE{6F ee~F >zpƙf={#07~.e4ʶ,oVSjYhNG)~(sd A͏}ۗ7XljlU--FZp^۔tLx8ISoQ$NĕGdE٠4P.]<}#X䰜՗;,i|eZ>vؿ0LCCۘ| pȼ'WVW g8z1+~oVΤHEsC#Y1{߁UnMB?Y;# `")7qﳐ!bXoomC;+ODѡ^B)e)ow=(FPx$[5wAP4igJ5EBgY?+K)e(*g!0K]#\QJh$>b a6ЭQ"qzzp,R׻c}rxkf9F胿TTyخ*K|6|R!O)c Y\\pv\jHȜavNMkq<*ru Y`&ΙށQ6&&&A[UjDSCCwt:P^teEx';Ė٩o=lMt7z߮U A8>cޒÙ^0ݷ ND[LLLdW3zB?Iʹ777!ġCNُGOE=-B? ]S/&*M%&8:1Ud8 ;9U=ãd06m>F"к% 9LYWZ|١KD`` 5A᨝Y澒 sfrgJϜn48nfi|uf5{aMvSe~^ޖEIc1Sn؞qXq6%_ %Y*Q!ƬzjC))) lzoUZZ",W=7 ZT: ?}֨W nՉ=Y?,A@OH p(ŋ1 f~޼qORBl>ogk"ܟ::]]%D)`31Җdt`=YM?uD:J0U#}8S+D>R/1[D=_)]:U$n=PUMM;ߚ4y JQU#+%dds{]Cġ&g~7ٓ؞Rx1)E'c4 wѡ]'EyV)_6}{icE='}}?&&m B?q_  ogO(Yt3??˄~ܦL`#_?DŅ|km-Z/1q> l'LtLxKٯ['1?6·l3*lܧ2a-eb~ls [/6ĠoؿEOOx-eeMlhϲ?]^ϙ*>?`2~q؟e}L僞/哆d^ؿ ez/ Y&Ʒ_ܒWp367yϲ;||GwKdw{:Y3OSs^zgQL09+2OyǷ (Q׽ß#&bjDً9Ai%Wj'"j_H*iؕI܊1d_"> c.dOʆ,`Xgbd(o[u4̱._#X3 4((y{ s [Y+x#NoȁzJR?-mҰ4 4WBgrrBA*>.'UٷdFA<}CcWkhwa0=TDe>5.w<,vU\mdP/%7s-gFN^lY;#r^YZI>Uę>VW''c39'H{I/,}D|QYA-uW7wL0(8e_;J[ii2cP:;vOE8J)g bAE2M̆q*BrS\[y^^кĐVz*W)Cɷϵƍ5gϒёtȰ%55k~ƻ2ZM)/[^TEH)3z,x|OS> CQ?\J{֦~>+ǫJdg=%UW{_ (W m͔ͺaO^&[CJ߹/G͎ `Hc`@m gF&@GpNcXUr` O A8ՍʡPeK cXVHѩkRq0>#i u)2B{!U @,CrA6n]ċx{Ʃ2gOqfJmosn|=^QI)ijoo3&W| "$^`5,Y FcEϼ*XCLFU?-Ҟ2sL2ZQe։1p8:3(٭z_^V*U?V%]tHo  ߶_! J뮡xHx9\&=T#vP(+-OX^(nCZH,B0R(0K+l@,ؙnˏA6_Mt}̗)d166&e ZHBEc2,%5 dNpP T>{mQ^tB)+&(u޽wo8[\lŬyR):گEOl(o>UUUB㤰-De>,/U7P3*Gܓumش c9VAAu&,\|58c$`DMd7'= GXXu*QN+S G )6Z|m^z.5إU IP0nW%n"ٙ89b}lRn8N`T}Щjˍ:m S G7 q(xᨿohv{^B ACd<5nfۆ]21ߔ.l_Y![>xAL&4&Y'lC9nQ1I}Z4xD J`,~ |=h$y˯S|ĻEi+^}mli2wz uuU 6IS%J/73^#$x>6PPP8z0?Gk耦TD`vp=)F {Wǻcvx|^2LK [^o7z;e8!#1.I2w&/5IbFEb73g;pX/6io8ӕk :v$N8gUk-X U)qܒqFUO#[ Z"BtȐmY صlH)w$Aeܿe:ZF8,jxhmz?I6/j^ '&K^ 9,G3'ʻYoU]M1\K|m]OyژRlj^SՙXX87jY>X5~܇XCV nXb$O KSĽO'Aki6fSh'P]BDAɓvއ/m؆Q7\S5%;_Bﯨi5zCVb4fB5J^SԽiz3;J #e^K t?(8ݝ]- ك1eĒ_SعuG/J^r϶~$W߽Rn. ylxCkn  CW9^[h?J˓4V4~`}g:'YRX$;%ZSe\8}~P @97^O҆ܐM~ 8᪂?5ϹmiO<ޚuy'a◃꣕p.@`?{l{hǡ=>u&G\KrJ׳<$oeSw{g kh}:0YtE-P.@ a\RD5ʅ@fW2LLLT=Gk㫌nNaӵ&yC'Zdi*.|:ս&\/ *68D@⢁vRள_2|3zuQ"dê!_.臐XU`@$WtٸJm_}vHW=yxœ'=+@;OZ_DhBt>g:K+i2uY_ҵ5{d xÀ',fzU_BScIdbE4;9>0 ؋WHxjxlll̺aj  ,*ɠ{n#O%ى_Uٗ0RăaQܽ^4eovXStfCW_ߍvdY.0=p ž~_wXW z^>>eb* yo0D%Z˻ƭsLz(C+:]J|*Zv8c #9CXڨ1+w@t| k\{lxDD괾^D$iw]uK/i m$-%5AA_FGG ֪wr>XcZh 7S-}pP²~=᩠I&Irc %KgCfWHx/3Qҗ/GTc"M܆#;rMk ׵ N }777wߑş~CsĬ OZi"}m39}mWT{[KNi&uѾR<Z8"-ź.3])rr`p8M{\LvR6 u&j<ǿdi' XyDX_1!cG>~c7{|xoRBy9Yl|.-/|y-xhݙq#}Xs .nW7H?tPh:KYނX#Ի2KR\%<-YD! ޛCNj%R&$&L&Rܗ9 Upx-M\Ǭ?+TEfg_~} -\K ^fex,em1NX--FFƛevK' kCw4H[.zV˕eˎq߮^5X.Fw'%%UCQ5=v9e`dg]wOFٝVmOvB]~IY]ChL9(@3 dT\6sxM|?RΟqJC+3(g| FQȼ?8LJ7kB3 \{6vZ/fKWWH&n$쮴 2z V;y>7a/^prr^)>S i;4 n&53Kt6otʅs}+c?9eLTUUED02y> wZ |D2)X,{ ñO+V"&'E |Nױ>ƫ0$+u!pҝV? "4 4_gF-{Ɖ,6{jBFw5.w wW.me12 xwQ@0)J@3O^NёkJ$K(Kaٱ7ϭΚw`k->{7߃&Ï!WxK_.2N1 y]~BZR սb>uEqd&U\Bv^LBjn3M}+7TЦ '60cزGJwin.ǁ)ޱ#OXb`z;nh$)Vp&;F$b9\;՘ҁa~Qf BU*U:X>ٛpO$?5XgL}\DxNF&r]5A̡=fJom6R̎VOJ{}D0WqMlq0X\ܷfF7WfއOMMx4ކp%RtyRUcUD166%_1xaM]*~|pt+]Z"ߧЦSo%( v[Gf/ q$yyO:\Kb$+ĥtß׮Lt-%u` zwR<79BA hڈ}o46#{ou k%RJdYf2`0Pd s![nK%ΐmߏ꺯~>><߹w8OFV{/{>jE)+)O-.O,tg!}F[KҬӍ7Majh7Z{zb^MMMaʤdduc ubccҬEJ J+hiiȶ0H22JLL4ebvB xc6899,kN6u{zU6urx/˂$#qs=6b7IAХ0cGϒ_!-\`ƾm04~DsdHnH(1 MR2"ҞQ'״u0b!ׄ:;-/ muu։LqWW-i㎇tttvk_]>ޛk8P{0yD\ˆ'!aCWLc[t.2&vҵpblw"bjjG[w<+c_]6<3bt)XHWSA \8="-M 'I ~{-2kᎎU::<9Fd"r~-ë[!OnE'; wKCWWFyhz즄.8Ҏ=^Ɗ"Eb5 =}k+uz V vwq $%MjN~הusC텝4vK{1rMFX @|ùr=߁^OII˛jK&'V9ƄPYx8(28)v/xserl㪻%m2u8r:FoCˇCxW4Q"ɱZл`K(_/ۚroMӫr{[+4$UavD@‚Cȇui5L.z;v03)Ὀ[uɲ|1)r;3 `Wꨑ0ؕ U76fZ<-!9Ma0U,ɕTk Z?.گh=*K{"(6yzjf9 -c*i Q _PZF{PI~a ̃nö>p8:/ 8xIZ#`;$ ٯij~:MGjjj:;;"U#.V]$ `q ʜ6u#mNNi\4f CDjCQy߿cZb;8Ru8 'c%EOJհN1Nf5z뙕g}xJ a!1XDiYMEBn #?3U`ӡ*(.겎u5g%ʡ2+h8Iы `/ N﫞^:eñcՍT46 B`A3v:CUm$ SD:ec?>{&ǥ޷zku,};xz}xG %j+Sg\5^ >>G㸾ZYOnKcD)@N(8.+a}a0Ϩš %㶬ngJq=Z)!I_BxP>XCDtHmq_c9ߓd~eme8| q:Z5$k|hE221C~ůG-X+cP ^IurJ PFa_2IQ\ѕ*E`֞ß]Fc w@uvE\gb6ʱg NUx &QUN8".qw=qD|eg$2.8ԁy &BUFw`yy!{Ƒ|iAToaPepG56JJNћ12:[)#|v·o* .l)`fg!d4*~X~c#*):n6Du;u.Pm*bSJ!.م D Órcq{oz󙋯X݌A=9X߮ژmjN1E~=$Dc)v`Zwv20C-3-użFvrS7ᣦH4|EږBdW@" g);3DD%Z "> M|_ X,8Ĭpg<>%w6s䄝$f|j8VfPG'%rZ[K=O5NNlI)z%,OPq;/qJDs.Cqm\ê,4yۄl$2PFأ_{2v;̋J!B 2TA^ŪW樀. ]vLMt_`C _l`Ĉ!u6"`W{s󙏠e EK64@{.ˋ<}S] }0m/.6 9'MD16vC1 35yIT4Ǡ޶\nq4QڈX㹹 zA_ Xj_'؉ :*fZZZӊ{$˥#SMsу Sy4ޗ̄Iq=?^K ~vqsl_]Y^dvm;GR˄w٘g!0_B/r:LMYdd-8`T{q={ЎNv20P%?VevC O<%J~~Zk4.wA[}#yG^Gʼn'CB*Th3݅B5Ƒy%oH"Iˑ}\s1l{y`'EaZL⋬pG;d#aߐ(79u?ꇭx[wEq̴0IJ(6+RWr6adXa Ox-vB?fȿZ#kkB^]1b ֪h0B|4llOeK!՟ El-`42`[C1t\1JzfJvm-[M*}3TZ҅#q{ 赶0oǁ(TSL>'yh&N :]j^xR]"EG% 4)[X3BzӌyL,\H_[CQZi7\|)rVgzfx{gwh2sdZ sXGǵ=7BQ>Q;}Tg=k2좧*.1)i_h!wG&O}(QqNB ]φ+!%-78TQlMh/"cL1L4H J!f` RwisJSGۣ3`kQI@P&OHF-&@$`^H > FOܳP^CG heg.pO٬K!>pDҞP}cz(EQ Ӝ߶A Q}dˊA; y,(Fŕ6D;;FidÁDhUQ7o*|&6vݔF{B+}dGq%ߵplڹG.8 p،MpOOIA~4mU,鵆jS}p 0R`vT:=K7 QW^Wx{߻ayNOg\o~VgO%y?9_շ=g?l+PYu/xF/o"Ҧuce֘`]7?dM795eF9p.{nXnXwKr>&xCrbϗiSm+nVjCkʩ|d#4voy0:)lL`.(`'-0Ly# Z\Noj|..:%Ia+jꕗ:Žj?,n0P[֚t01[]7/VTɉdA=Q:y u)ܩ|-\6]B󋧹`U%sQ^Y8vĈ B HR-}9o5jkd>NfIBcioӞU^?h=?=Ô~E ЍXkS$w |{·6G/rYaK,,(dh:Ae^3'k-k>9߾N} tGgn , k;"Bꛚ^ޥ4Aq CӔVӻ0kBbq{̄"aLJlH^ꨵ+BkEFy@@Vs븵l&]u|ddWWn._R{COBzko>$zrWDD/^r]Ruߴ~tU&_\=[WW7v6kڛ7n{e!;׿nCc!Bi;fz|[_m&gqqPj{mzX`7rbtuu OYS531apj\|D\dcw)ݸ +o[s|AAċS; :7:RO\wf i? dA'INf^[BbvsHzNr+^wF .ENi<Ϳ -{ ,;;Ǜ!4,|Zyu <777$ r-ރ.[z3*+L~CT{kyzZtc{{Z9J޻]*\~~~ W\)2d]ϊU* uOMޖ:Lv?)8d >Df' "?L(3=a P^Sddd5ߗT}ZIJ:;?18 5m41n|!]vtLU2`ܮpd_ó4l!i䞘x t#A[Kky߬B/݁-= #h(YP1!ZXp>!G IBK%As_g)B{֒{0u}]|+c uZ[㥴=L/(C*#*wGE5G^־o2=WozIc!Jx$P]ݝ{k}0$1ݑ>lql]%_NpJ;^%ѰAx۷nQ(KtcJ/-4?95%j?ZP3G().,-G KK cfE J7椦VUܵfSb7XcAsLB q_K/S[~r}݅ױԻ?{ 1!R%m]m6w>*փUwȣ8EfFF2Uj~Ĺl|*ne9U9Z }-{l>ٯ-ep @]6xYF.#KK]|/*($ҥapaNddH.~jj|F[Z)q) X!s0N 7ݥK[7ohV[=8K>v~Yhto)SO`9#'m-YHTwc4Cxxs|Eqt&ӧt?cr)te>VQ_ y*yFbLd]z#eZgr{UތwXZavAȲM5 bih7i!~g|C)ir^uux|gAR>feFu:N泋Zm6 ʖu$Riۋ[0QG(ڞja/5"""Mgy3StϿw䡍M+;??EU!?E)"po"g E`_PnqvG]!ᘠ0!MM 繨IMN^ Zz;4I Rvԏ;:^<}U,_tsss"z,x]^=;5gwґ\P@UE˲VT^J@3+-n@ʾ/7vrrr9mzzz=zԸUl,qq_T6..^\2wQqqxEED{"8{Q"GWWyU$'_/w"߻eκwޥ!lzȎtq޿>ZIpG"lJF|O{[''[DBń8Mufu䉥,1k{Y:1)iJ } ):b$'^fw=[.w2?aNA? M]\\YC A^(ZWp|L@T+G|e YZZkr`1U*Hi3_cF?Ġwy֋V+7%z1wRUF|G֦ȡÆ;Q4nVZ=f"Y]]g8"T;=VX:6ȩ 2nr$#c8:ϊMiLr"f7߳,<C"H3/@c3u`ihK>0X<\ K brgSd@egZ:ݿ~e\.f}.tL*]W-"x>W68a \Rl 5v'E DNenF}gL*qěo\1,<%5 8;<Mk!S?UŒH r8@q&h^ק&`5:Qƛ9;x#-Ulݛ?:6rgl-g')"FL(e\ 戗75i6=Nk_y5ˈ>\Zu-6g,nR]{%$Ubm&J,J!gm 0\5OXY,¢_o:9< ͡ ' Xչ`ߑ;ozފxT[9yˢccX VaAA3 "⡵W9ʋU#T8 t̿@ O▉L &ocS^Sm ۄyǤXľeK @E3`SSk|gz/Y|QZ_o~v8WXZrsS$1h?׻4FU ZҊ3~@E`Rb嘿صjdhsûS^ƔVt@\C{|~7l}ϒ )mI \T~jL1dž Tg-Uh7'|d`@YةFo[R!%W(DjkG4߹rY%,4T a9' 0Oh ?-ݘh΋:{s"%@:t7/> =bl36W$ON ?ҿj2ޫj靰a溯_,-AzmDz[>|8^C!CZ./x,#={m GbupDY{[[訨Z_͛7 %<IljnD\,ns }H~mm-A^o.P/uJylpm|III[kC Ed,ifT1SFtJI6fŔ/;it~x BQ : [2zhm n,<flHtٸUp94fVs&H=v<Lژ >e@}sș񚚚ϟVۥ#^ȅ℄۟>/1X: WRfĮPP!.KB{{zċ]0yr3|Oۡ'b%ed붶>Na+'g?Ka;c=̦bgmв ~Q.Y~:MV@g QQFJrq9sR]sC7K..x6Ļgȁ /om{M274JN?dm߯Kz ԓۏL=a,!P13l5 1o.xp9~/'2<%M_j?",@~Y q5yڄT-./x.tH9ld~FzN!CdΙ×\e|@y!fojw4^09S znjp4sk]Q晋*B1A::?ێzS녳lxۏ@¿o{a^oS=*wM 8B/9?Jܖs,G}4GQiͽ&,,F64UK?R>/,&s"? ^J<% H|/O=)t7\5зnz ݏ`Q"_&z+FT{kbظw~8߯lrlpB0.{!wn+ % Эعgy(B_4i+ox+`M8\*vjGGGkkHRnijtw] ` 󸹷8tq+PERgxgurshЫqJz~(dmBOA'Q YP TP)R{I94 s-7Kl, nrdVĠº-p|$Cl&ם*|~| wI.$Lmz:mj" <;u@`\9Q$ )r(C4bO1nM(2xpO8KvbRO7:| ';SVU;裋Jb@_r}߈] gBӫ*J:(!~[:S:߷{ThoLE0}dGoM>Kvք'0R`$!Nħ!GAt94ԞH?\ ndPBOOǓ#oRLEEP=›W ,,Z0z}~ @ta1B0ZQrw|:%(ݻ͕)F[OON`ݠ!J&6OB>a/Y$IA   py QWWj*JiRWlJiOô W<)@p2Tu;xtKssE㻥o`gkN[?;k=p[ijo_7on$*`.a;K2GR{Վio711-52 S蔈ße8& 119\Y 0ZeeKsEDJ8o'UAAw. )/lQ+Ggn8m ̫>); YD*Nr('΅ J'H 4:x՘p##йZqqqQ~_>$޿~VC%2ڔ՘E ϻcc䔈O$ 4zVƿny<5(B98‰3g|N/񺊁~qfi>ytz$q) D999cZZ\cm/")aGLfSC-=*wOl~2̜(ߵ CfeE=||MJs+.Y@?pA{yU=aUMux.{ks3IG`T^۫0J ie;R Γ-nF!2|I7W;*v>ɉ,P`1?e:ZÊP &V^Owwڬw``i&}zu;lkt*pVmN^&x-@5Uڭަ77mQ7.` };dc,pcs9BEz0++ךG(:P(TЋ$"%&>ՠGI][D t'e<6gfl2rsK IgjS.͛t i}HoG$D2޼ydc38<\AD%]ҭޮvA׷Mb.\03 ʹ!-RBmZQtWw^>bz;8&% 5ޛG$J)po3f p;@ͭ@!ugWy__\ªbs"YǏ^+o_,ks[I^Ovg4%9('ǿ[mv;IbS0Q ^\uoIa̳ڀ,_iRׯ_YJI5ї^Zʹ 鶬d'fi8:f\KzpgǍw-/:JJ""ޏX FsB) 7 C2޹C+A $ז mMIQamZd `/^+yfM5[6V+SzP}diq\JS[uLfjt5zžhB @O}D!Ҍwk_Ht:#( 5Ok9zA2U_[3~%[LJB5MoŇB/>H~lȯ#~;QWo4 TײZzퟖ?& *K?+gG/>H6[aai ϳQQk?9J?EXi@00˫_ouY9/b/v1L̅h1lNW8rGJٓs: x KgqjW%sIczF_e󟟓]|yyr{H~<0җr{b/~ٽvq|ގFـs.s}#cO)G5\{ٱjq&I;q6U4jpMil]lsLSg鰻9f*fz{N ,D]+#ʧ \.**qO=8^pKZk\ٵ|,t0q2l#״es2m@,ab|1)ީˋvy_ŋN{Y evb?0Z1R.Gtv>רӑ,?&J "r>N/.<9je]p"/IRZ> a5^brG";2 TOR) T2ړdY,HAW j=ii^3۝;U`r'ݻ 44),$5^yyy#zo3׮WIhƋ1kΠvJ9Kݧ鮇T~Ϋ(=kcK}O+pae͋iNT"S%uNrIqtVdA re]Kվ'j_beeYCOѼN_pCFn3 Q +BJv>\h6fiI ,^EwάJS01"8ںoE73|v&ɀrbJUIM\d- yQz #dqXdOzV367Rpe#AT`-39,I xnRU"z<4Rcx[.) |@V"p0)HMS89}Aa;FF,$lsOOBeY/c5Qʽޜe7Gŝѭ k 2sՆx>J2#dgcS&7NP_ad/@SJNBY/0o"GDDxUwS0bsn èTβΖS9߂W2,#dX aw6HȱBLa;@[4m2K8OɥA"w{xﯭ7ۻup~_vyËܵ(V$Јoh@+鑒2wz!+I"/ EMhG8l>m8|xY1YE7#Z2'I|=3*-* R W$cǪHHD~H4 Zwvv|`YjNt#qBkkkOO>eci<ȓ Ϗ|*M2`l~N:įS( }u܀1&{?I%T+pQ^Sdt lPހwA/IP9^W(xS^㤎O)\jVql( T@ 2K]˪UwLbf U mFs0vs}I;ò'LDZѨë1gÒ @oYr U5zC4 b69Ylb$S :O-Iqʟ @㹔PRI{3Xy#W&提VfsHNhOhJ:JCLz]8|qVm3/3FL>9x \w[~ lT&v㋁:B:_i&<$>?fg3@7>5HY[29LAfV SDةIݲQ@kC.m@A^4#e['4'ɱKHG1z9?tC@tI.{[G$"| 1oN<+lmoNH߹J# tJ0ޮ O{?F'`4{M󰪪*86G{P=ȵM@`=VTBJ ~ree0'B@mGv ;$Zop5&+wZwwt|((x ׫A6< h &$*J BC MHՙEYf B%+6lg=.Sv0`;r1KMjX12;I@P`Smv7b7S@6=>/$hLs[o6חBTP5{ s h j?`)DHy mpr*7A7'$_&9d8>sCTT,1l;U~Zsg;zbWwcaRV @I@| 1avƣ##yՔBz(5P' %B\B*[3{ݖacޏa觅۶-|VVγ(MbphG| NMM͝'gpU7c@A}ܹ\wL gh7ocs\:TyjU;tK-DDJ""" ]: RB(*K - 5@(w&=|][['"3  5qƕLn^?X-* }egzQPkY#X.o'^+.N5s_+b' ,ġA!U{ %X. ءoG+**7/6|nfLzAHcKd\!o,lp QpAtu_=r-AX +D4`K\$,zs"M:+9,Nk_xV>ډGxXs}, a8 ؾ<#YVۆzh,ܩ qо+~smx0;כѵHY0܋@HEmhjh$[>twOUz7R)`2hnE 4GS: j Ƈ}c̮t s (?|44 UC E#-%QPg1["6)4YVmHǽvyN"[aMF D ĭlxDf``50&EeJvB_A၈wCLV59%OIž:@W RϾ/>_(חɺ#Ț;.csg& DM^A ??.^CMK$;j}y ~3GF*G T%;ΡKf7_BN%gP=hO&p.9B=u>DBμapL'{ ?} "?16'}KՓ> Pep 2ɓx OPM ܯ-><DKfEZZZ*;:4a>BuG\ŋhhW@_:x :R=5U.3!c;;cLUUbx1ʹer?|R*&Miu!3_ʽzM7bt„F*My X>^r<zgn6~隻tp% xlB\2#rג`8!qA]5>ٳDܱYh8ŗQ;0inRC?Ma48H >V_q_&xNzdM<buKQyfUx޾hLUH6=j`aXooohBK)7HR`%$^_R>DùT=xS;zϚ5 m)'OA!bb}[<8-πVo̴ Epx-'@`ToQP3u|_ܓ.o;%!!-sKJs3qN5n5h=xGOŝ_ї:[VDΐ\8CQ8#$gu"]RCPW:Q>x1#0!s|Ү`vS_8s`?88c-$ ˉ|5珪q1,@dQ7~/p C󮠠`rt!utԺe np_v$d[^ypOgyE O/588n_&1I-fcc[C}ّK@30I[ Mg7CL.Su&oxb_VXhyKc|5fwĿ]}isKbǎ;zrѵ[wHв?I6o,j#9<[lFx>} 0o ssk{6/>tu ھ_7z M Ϣҿ 4IkXr]8Q;ʠۛ^BؘՒgmmM1חtrⲽ1@:ґ)FY[w)_?KF(  _WAդCD+]!8cQ{{;cSDJKf p8ky99"q-`> c}cؽ#؆gՍnAJ.pY47p+]1!\ c:39V깳n)DڴcDEΊjVV\M&φX0ۡ,yrh}Ya~o,p!8x~wcgB<<0$,0;k$! )k8 )A1t}} - zJS鮏rsG,̕tY δ(p/6*|ZjXZޯ%cD]@d ˗/ٕtui޽9Ն?knbr%kCmHM:٘ kts{qgܓZ]xDH'SUiaYz.-$$trq?U=p?6Դz2o{ƒ߿ z$ T\}˗Pb2$|E<6n{J^5Df p6_T(0cuBKU@0̨~Rb-7<  *3ji=:#ʼni|h:UtW5T܈&( +'j_a77.JYCcwcz衁S&\\IUȒ R{>^$<U,x}(l\p2add~ wa1-oҘs7 U |5C(@8OpN\W;`ΫC>1F3'/3K!;xejl mkbiIDdb>_%-A!n1+'sow΁sྷmE'Is˛9A~M[ bQAM9GӶNTm?$*$Og?Uɂvjdb*uߨ8nQ@ZB翕QP${tYWAyo.R`XKEQ̽+X0'zuw6]iahښf7'0U`;/R3ft_Hsu,#cjZsI~ *eK@Ãl*Xƻ .a]Q? û$~+ő*3-fǖJ'/}L70Z;X1b=ZnOWJА||5KA[ ?n;sUm /lG&$܇?x a <*[>af[= omed /1B\+{v|ʟW!j/(**VP9}|bd3''];SMgK|ܓ^пp YuRMGDD\w @Uw>5ss{萇&j1LRw#=XUji% k)C?_ >E:8Θkzmp;?C_SzɰjG7^dP8)E;pPsL_'3[]Iw<n,-^);>͑ bkMU5՜_UU/œeh5o@ÑZl==%cKIy2Dr#mc$]lXe˻٥?@"z0'9}7c?j@{qHʽvM(&C=R !RpULQ@7]ۂmHA R8k^҂"apUtt%8 nׂt~jT]U -6yqF{rHcT$5ff/k$mt㊊D&գ\XRdfvYEF2ȭbi,y׋ JC}N @ 0 BZ/R1mbf|Mf8l cj2/4AP¨i\ \{L%,55Td6 aJ+[!|xq!t1`9aj 8@%#ǏІmKJ -Wkl+>cUdF] 4ٔԹ"K,F;0k@2a555wvv otVGLx [)S߫br`q'%%R-p +>+l2^ER˓`6NPP0Ѥdp4§|^N>gATd^ke6;mU~:(Nt`XV89F- 2kk7Wć*JGm{FUr w8L,3Q 5-"( \8_>?1wwn- Ng6IxCU&X?" O8Zݸ|PB8@Q;͟A񻟤6;WRMls{$d: o7Г< \;@7"H3vm{T}n-T #3#c xU=j"\!V6 B }oiQ 2W&֗{ȶĥIK۵%ƍlj3R5OgVqfG h>^nFgtd%Mӏw5zU! v(/%VwލUa ,.U7or5No@N꽲2k¦);ZbUz\@ˋ?^'~2"xqlʭ,~DYYmiD KVPի?<Rȑ;= ۛ+&I>$H$:"枲a uv6AɂݏDÊVq-^U?̙@WB*[ Ѳ;]A"=1Xnj`:L S+se[HtˆY-uǢP+#;2I|dOx +gl]VmVu7rG^y[(!k=ۂ2;NxuoRR|ÒLE_^{cJ}Zh y8]-Iq]38^r*tM9"Y>p=:_נ4oHw[~syЛ\\tvx##oNAPG>2!xx  &_Htf"':m"Fρ`D&:NtQQQGwҥB2,=.q?Aȯt|~v<Ǽ *KUKxӲsYo6^;42(ayԱ >0rLr[vez~O=En\|&;{CRfsc,CAd0`y 9q Ͳ_ hx,1m_g "PĨW#ҷ?bI"=ǬYgJh[cUb?O:vr\8i/NWPWP4Tq ^Gdc\ '_ sv2) 3ISNʖL?@TOGG'nں ,f3 8=́bj}葸 yL,<+Y`ߨE|5ygzh(V!>Gwϴ{Q3c d~icKυ/$\dw)34}p>d~9O&< U3puv_r8۹n&Q:ͦR_6R9]k8yhoѩ>t萰w^~}a)dQi0,r ~fi%{)9ndv#?}z$844yUR,t鎑QR啕JR?]PcvC4>W%7.C3{BEELtӜvumEdst$ɩ?hx+3IY]xB-eJT0xÀM&ugEEƁq6G tϴHuK3)bȺO7\04}2[>.? =je?[\^qQꈩ쯋^}^j-Ί\adoR^XC+tfwtqR30>L@xv***S=_6޸ 22p~k{zz4D4xMkU9]ĵ+n{chN2ezdDBOŊPwګa[NXT}15?wrdׇT?vj k.73nS{r.KNN~.+lՁD' H;W6ot"UkSlC]iΑ5KYe{nN4/Eh)k=:!fօ ϲE%S%YKƨ^eʼnC-КUbV nmzͱ49tP?FG029!EYo>$@ø @&즙Ç c<өI+G?޸rR( ,6a˗/ܗZeeDE3v\q11X}Y-,ؤp{m{p$mؔe= VzS;4 aqTeg*ts*Hªs33{TMsW3uzDxg/Q5K4 _|Ni0Ud&Q*ZbL-toq/72}u-o\Q2NO 5כWW=33SYY9[SGΨ=Iqim.-hsnX9l]ڙZC 7YO=9:. 37 ml_°oUc\ؒc% dLjctՈߢ8%NOEhGF^e .$40y-hQz ϼ{E u4Y/P0S J][WE(>or>5tULuE[IZ֏qЯcnte^2UnPRM:!tnH)g䩩]?<<#X_雉OX&;IآyYYgW;7XWُޔf20#i헗o֍?U?!w'!a&&AQZ j?7plK-/{s_G?P0ҟ?ϣ 7k>_ۿ_|?]GG5Tt҉ׯmmv}ֵ5+o]m4җ sx? `2g-k97T;zYh-*X%-ŴHɜ1jhsiZtGf~^E!ߠ 0 U< yclիv[[w6esss,n>~.N\cZx-J],{0@8աZMD )0`'Kk}F:w*ei)d5r/-}`ěˬ%dL߯Atθ>#PђPBo0Fr$gcxwi'a+++6W<#v[ <U7:SRRj ri YG g;𼄦rPȃ>4]B?_~ݫR/ګ7m*N}4ʕ[ue_k]WNOѝ|Rܚ^%U`lGؔ=hkwWWpS#=6Rf^ \ܘ+dFe*їKuɳJl`Oˇ$]vQF-%) 9.9+odb2sVkѾ}jD4B޹9 Z)C5]?֝(ihpG Y]n1} ZdjYut] &?h*өw:﫪mS4amitfU 6.̩qoPIjJ2 w{qujVI,Xtnzݎ1~G֠Sm=n߾}KII0h'-~ ?VPp{_{rGN";<֮ġvO] b@=Z&4[a0R–X`K'##r + Ǐ$)wmmm\ 1d@#3P*sG'P9^{;RC9: ;VUjRK4҃tcrT.Lv=1X oXՒI%V8Nbaų~Հi!+] pUd[xG;wjF CGه0+W%q(FH6Fa•-CYpVD/3Vd$(x)+H|LYcPZع?01NQ`5hM!X+VW:أ[RX![˽ Gh?Fsf=hKz uz#CA,)v @%@w{끶gQG,w-괔o8+[Zyd3TSj5aipʨ}iJʷO>|mZVSWWܹGz~C:2!ϗ]EmZJU'qG#D7Fb[[e#';F# ̲ R]VʺMzx``͛>o(cQZmZ.gΜi`p@zaJ,tdb.;&ϳ\Я1^aْ-K' ǎ3JE2f;gU:6 /G2/C !GlKx(8e|fj%6:rTӧOw/!8;0 SOڇ:02ZZUU[V u/h]@>QJm(IUy]sfA;; bi:ofF &xn?GzOޮa1z-+T345Id tcv; VL C`Rkă~M|p#;iSL $K4g@D֡*q v{N<B복EOa y $S['-t&*.ƨ9ZV\fo!:ݩoq 7򲲇`ݨ尰sYTg"R۫mh ،1QMO'X=g.[vr*4wWh`A@$iAfJ MDL\vٞJ}I-^`*Vi+@H@?6WzESoAŗ`!fS6 #999 9YyjW:%Hh|jjJ1fD=T=֯ X1kk[}(+ٷ9K0"ZN+D03pyIFJ\< oKm[ܭ Ab9^v/WTdtJ`j牤D`yG*"(xF@@+QbM|_6eZ1[%33JXЕVk?[ZX@7fz3.קkK.d-(ʼnzK^s% kh'w^NrWfggQy?G[N"ձzoP 4:9|Ck7A&.U7gzv,`O'%ϨBR *gm2I|h/s/|c:oWfHM4iY2UȪ6)@L1/7W8ĤphMʨ *ƲM|Aknq=♚~ Neˋ3w!X@z(n3`A#C,aʮo6m+e$<39H웽Ja]< ]/`h bfHRQĤ&mf"ظ?ҸoJXƋ[ƾz3@EY1S-^nEe2?SZ},{ ,Q\ "#yΓPg= ~ m{HQ\wu:E-IwP0]؁\0z[Ї$ǓImP#qiR(G˛QCG luIrhߠ uQy) =N,%Exg >bܡPEk a; Tfe}zN0hDIV)"{vxxXhk1R .uliQwL[~Ogg{@D]6$3o!l:y|&m# ï)&cdj: d;-0fDcm)4ޕull,vgѵq *B;8 ⪀ѫ}dR$V),2Hr "a f~ށoVT %BTq苑J"@ثۺ+`;L4}yAӜ,Avŧr4Et/?=tRB:N[B'fh'+Q/lXb1;ӊKܽvu_\!?|=kj$*Fv)rxtTQ|Sj3FEa=0aR75ަ  Ar%% Q!2ν'|A|U(D.'NX 7yKKo_~%y2Q!D$u0/|!3=#M2֤eXT~R0t0%J84׊ѻ8|"|ԩS֨۬0fcOH]{q]ef9pwRd7DzYF+#9{8݉H{}Dzw ܝc|h`BT޽+ZI.iP轱1UPl{_P #=-Ӕ3Q6l㳣3fh++٩D^Rj'u |-tF%UMN.u/=vI-@Ld d\[lhK$R5;`A.|KpP4~FE$~/!Pewt9W}_f#:L&ήVq @{0{df$'fe5F BJ;Fko7No}Xi]1K@L$~b7^qQIcFsH֭Majnr4J:$8ix&lE.(TdݲEn;3ʲHc&OeBw[!UgF6_0"M4qFXR,"OWe[R?nhwwi_4#D@]wpmSk׵LہpJ_2hK wwB4paכ&D#&ؽܻ@}<ojI%%Cz7{4= l=/Y@$t VVNϞtBՇ#@IuLaJ7H73uZfffG>>MK[xcnI2{דSu{ed<GM*.d=3v'>`dy\E¨%wqѲt fyR`c|".kB{Wx5֠K$R_-:[hJfko6GSt6@%w1))IbՓV\,fyWx į. uH{%Drod>2 ob6#_j)gիez#~MA>vgYL`46p,S6Tߕ!{Ft+lw=O RJTPu f"XW#]B_1sN1&Õ4Ɔ{jVI4ssXQ늬'Ǯ#$N)Xポz b;JEݠ>=ddZf L^gD]'c!=͑Sup-($$Vԯ3P]* }[(5&W R gwPHή$  #S@Wղӫ5fd  l:e{QQQ_7C$r @g'eR'h]?F#%w$q|^IIΧrj5픒8]{/`Vu)d! AuHCwrYCoG'%s[Y\.f 1OVW96s5Օn&8kacSTdaC /⎉,ZϿqׁi Mn8 3lGi':[Z8Bd'!=gB[,Qorss+h2=~)Ř8ZBw g|Ҭ'6xbvqK^!]CC^!6~Ԭ8Au*'ɤ7i7,{v["QOXcǭՙ t'b'X+$Yx1,ڷuB#""N}0jU7)3'&?ſ}J*&;׼a;'v WJvvܹCJJj.w;;p}mjjtǛ~+ |onn\QQT{Rȍ+uגK>MaCZܝmsۧUs0hIs l(-Wd(+.]kUO #>^by\ۿX)?c&_([j4OBPS3<8V5@^|&5֕sИN,zWttDDfIcȋ2:`eTPS)>I-91&|/#lfws6S͆NzcURmBՇ^[ց-/p@=2K,u0TMY6k4(?~rF4 a d..1WL%$8xT!9Juۣ/ڨT&y=\OW.iXs@ HHHl?*QO?R_x)I8t[j2=悦yn(e&8YªeW(*.6D:dF߲uYҬpTTTvV0te6[FcTY 666_kj^=p+2_Rooo5 |͕ɾڎnRPG&&7*rY򅠚tu 0pY9!rF/֝㲯3=e÷[`66<ȵZ] YtG2J4}]?˲>k_m0RU|Qdo W=*jLǮh1mS)6C(>/ЎtSt3 `bv^eQ뛑(gFc=w<4w19w pQOtO1Rn_єQ9+Ƨ6Qt4BpK^ r'Fu&]w}xE >}+0[*WÚ ng;}{ֵb٢HһTQ^#k@ H'һ@)AZPZ|kpӾO}*s5=1/sKH_G\++/_D>SNj9tOOVSE߯߯ R9~?;-2~,Q<84ܹ# _ BTp`99CDG|BSQ„HP]uNaxJp^%]=}@[¬.*xRNRWor5Hc`=̭G d.a-1"{᪉h>{8_7[Yb鞃]]jO ^囊ͬ,;+ 汣ƫ͠ejMlxE*xvCm,KfY]K敟SO]=U.dX"y{cŠϵ/;+˟7*)Q [yR5C3l!!tɴ)%J6}|gN0:**^XuD{ymϋ6[cDEDPH˩։5bipeOTTޞGsrau|9f5|rc{QL ;-\eKٌѯؚy+"tb_bJB:}4?T%G9I$^b6ɝ֮n+kF;oJbw, F -ToKINċ>'Cw'@a}춀S&#\q5)1AU_`U Pyihu!( alJt(V'8e[4 YRHO0 L B0@L!|eb>#gdr)Ƿi>=Ƙ#3""p5--h1U2A9PBQw׵}9qDAsܛey>L tSrAl'IHЊ`P.qdi0#:#%B*yotaIn7MTy`=bjUpT_,A3LI`k%[fyw!F ss ss6zz o=:F#0]vA!!*Z֛ib/^ּ0WW Y^JD~uF(`JFל+$0,&:Z(@[A׏"HN<r80ҋbjA} {lp(l'0LSt@vYm!8jbg o\acNouw( 9kw`(unۍPKLD 1KȾ2ƒ(W 9YlK@nq)X$$t`Ho5T&h#VP^H3tF.B:JcdІc0: G j'g&?!m.s6bhRgJC{A[ 999i? ̤vY)d|v+u&7຦JfN^P )Jium555Ф"?&#cxbxBTbUII_# ^kWÇ7@9N)0i YS&;D?&Tv @H#^'Kbok%L!Ns zf#6 ~w^ܶc~~uڷvNΕ"_s:6¶_)l>zoHۏȲY/ 9Ht(>VFxH.O \u!1pЁ+fN NeA L 6)0u6Ԍo'S=#d|6R0)Uf e4 )kE^)"p;S,)7-9()/Ѹxg ,ĉsya ,J,KϵN,&LH~˼sm◉s:OHJO`a$S40 |4`Px5\e: ۫hxe h\Iv"T2tbla&ݝR׷]Dg@)u}8Xnci +8d"鐝6R\/<}Cܩt!~uڠ¥aN\c9;x3@i=je&WvTccc"3˾.pcOl{{;PXwttl>Wv;Ϳ|8&nƊZܳ$}\v BTҟy\z.b$ zgWK5r"LB?o@}=L^~. LHIH,-,'`U27G H:_/@q,4q|'gup6KדaQhBxVlJJԬt&ǤoK$;p!7$i3}sIkL@mm]ڽՈ a%5}{kI*iBO<¿y:aݤ gّ:Dz9@)k(iUyW4]ٳhbPN+7~0d.Lx@2G#%v|}/:6ɽ Sk}reɖml sf^^\kIűCQ2_cq&::{0qgڑ-vIIɓ'ǬIP pZ1a;G+@IZ2:b JP= ~Pm-fR7NH bJ ‚zZVhMld)]kvf}E'MO門L1S%eבΡP(19Mea$ HX"^G泥[2,q7v5Nݳ߿-sʗ"Zvvv..w4JKJr\i{jшFԭpXWg>Ϡi {'xSLU%we.DPڲ424q` &<ƕ\^/&sj^>x]ZI:274Qgt?!É::T ؍YXLG5%? d?}MRBzKUPnVGEPējݣN/`3au!;8&xyr#^`+?}oқq;"PExА82a;\񿍍ZϿ `j_yKjV_tZb(q 0Qܢ[]17uoV /^!??/o`]Z=WRn;EQXMߞ,#Vi(Er=+O0ɽP u%V A4^_B?)HV x̘AVlUwg vYɮ NjC QP?dQ9=UO-J' 49 I0 "Zcx4׀r!fWdvҺUN}6Ż:?*>)dL}1ą2śI--3e#eHVtiNox~ȋz%;b^{3}16'Kl){F& jfF}} 5\eA+,A_ənnj (ZtU>k?&0[7uчOyuYKx7uUso{M#4j{O5XU鮷CBXRWu[9,U_T~.-Y3,z7>n%]+taB4 l<ԺΫDp "U6 m6@_2~$08U}ŅX)zDx}q_hk_IXqD"} PEs|bzF}7iȐ>a v1$g:C^ެ'{GJޏ IIp3m?ef[R+++'ET{3z]D]Ubt2}`ye.Lݩ]!ޑoaQ\Prfty RsK' _'Ln S_fU{ܜ@?l՗N505A:xMѡQt9_oCc2)8+m222_oTm..Skޜjg:]',(HgMg ɧ>3ۏF:J_dtt>yDҊdW;(P~[T33PP_͟y.j2BhR_>2> wV,l[p3:DS?DZZZȴUU!AKOxODeg_嶱3h37O{az-{ԗP87-:=D^=M`<>K'L93h޼rQuJ (5O`UkVÑ(}F1+Yq34-/ .'dxeM aUyRQ!cDÀ\·oTc>` ;ưH8_/PľbNiFA8[C'wIYa|wl\׋sr4SLxHx:J> Gt0.}T>B]Kr{_N{UQ+[EEEq&!VxAs徠 \" 믜iEw_Jg;@OWSAS;>N@خnim}Fi fXnI9-~po 7 ZUUUp8܉0eyFO݋sUcG=cf.af/$DⳏOPߛs,ҙs?F$4; =h_t]t3lQSS};l435snIf>G62` E+=t~N|]yguSHnC$2Ąb!W#)ts| ,eř?ShV]/Ur *]dSRPHkR|??,R;X/^{[GC!MI#2Kn2IR9DѲ3}1EGK+ # 5M͞!R7]*2Q"?\=: MtvtpcmEljn^H)kJu&ɏQr[52S䙟AX!`b)1nrk[GX\$ 7z1חթoN >*,m^/f_dSyyy0 ˛%aE`bjzn=568&8dwBZBL#3M"~ ё M9#AQ䵽=tG\t<<>n Q; 9dZ7ⱏxiwiAwȽA(EмQ}xRu& %A bQlu7l-%:'?ƳKYd*`cS<u2SfO~)jGzh/ \_Ym$gF0 +zPKj @hYF2홴US]NhHT*.]Kߩױdܣcb"ݽzz@z %PbD 5u EEo%/gFM9(3ЬuxE^K˰T~V}|sRDJ{uh [j +CHy]iaPQ]f8FawEaE{ ^+4>m{9ά-^O= kh=N` ڻt@X^R$C&U@,pO.ihفI4Ij2qm.d)*/G6 G~vfnau~Hn1tGܖTwFPZ8thwP%s5_FA7}g5$O+oD&fVVgML{0EEƔ)旖bdhY! `5}'^ȂdSqc=>TA1IDj$JPk%}D={Ui$.IJڸ1 D؅{0f2fDMѾi f(73[YjH}wsݛQ~uv*GYg"g*/O+XDXb@=PH–q:r/ΧLG]9yUh1LF{r^w}߲]f,ɡj %5W86fX`ݶbx:`澐OHWߋiսk\`Ib֤W6,yk&vտ}kNl򒄍x]?n990x J7p2ًrZ!`Ξkۏ-Q<ybҙ$ƈI!YaX\RJ䮛R|N8 7D)Zݮ*+̧#-ѣ}T#+-&$M2!f{H;=r-ۑ9e=4psgc!ρfHUAՑʵ $vCf~"aO Y)>x@tRh{NB춃X &r/pd@﹦|٘[4>UM1זәbyhavkjT2Hf "ɚlSA D9UȫJ06zq%iHE{"@[.cȣv\$vV+˭'Au΢'fёp~GsS*:7"l\ZӝY_I iH%ɾ2 eld\`>LW%9iDhz&hՙfی DP:g>@}l2D1NB%\$gl;}-:,wrr;)܏vf`b}F.>6Y)qM.>}L&ug$kڳ]:@ ,6&ķ ,@YPHn_\_hqN*r lީX̄R9HǏu٣fU^O?,Nr{HGdEB rmHY9yNA禦θѢmll3w ,;̜00!+s/gNp`8 S2,oaؐEgZ .xЁ<K\(;Fj1<$/Y Fcv/pJ*Z8 ;tf cFocJ'P+M mWF{Xr]rIx8Bsߖ+&ҚOoIQz`X([0 FİHYѬ3HK憂r4\($DBvbG޴m'o (OR0Vd,.WIFڍA)/ P"!/ UL:|5_1S-n_1M-nBߨ󲚛8ICBQ牸2H^ A ֙ogG!I5ÚmMҝͅyGM+_d{[BK/o2ifq\QZ[It@pQ. ;`UCr&WDӽ wUNUl{mj8˴Fef:LW0A#<=V{l3I,Q>5b&n NCtR6+HemǪ9yd|m8TaJYyX`fʛs;.|]qBh&7Ŷ}'6l|%5ĉ/5"p}-QT%O{ZjqJ0Þ ڀs!yʇ_~Γy3gSFpaH ü\As૜8Aqof1MsҀuHv%pkj| Zœ{y?MYnZ'4~Ȉ* 'Y'z}w;},1wB ^z}I1VuYÚE777Y߼ٔ#}ҊbrVSQl#z7m6x  5j]kZ6OP wV2Օ)鵂n ׯ Jcr}fidK{er+mK-c&]k"ykɼ3f;5I[FvG|zKFY6oOIr9=Eq9r1LA\F>߱33q2U I{<L0\lR4=F?ω̉Xӽ@J$ִxxYIyez 4XMLg8XZ8+^кܹ/X9@`0 xOUnwz˗i6XLTA8냦/L D]|}"NnG93PL WAѺ$PNEw)-n/Ͻ~RO A _|\Mmм`+E/ W[7rE'W)>;5F"z6w.(3# 7a@_.WWxmA6|a3F`0'5sex8<Ç)Rm%G@+L`UmI( xEƀ mhj7 |{TK^+GJ }]V3߲7DaRި4]QmF{ͺU]OJ@rY>R߯8.)s Љ8_N~E-~@Řx)@j9I5 VJy_kډmٍҳw◁̟)LC{n*MLV:Tj?*K-ZJ2\ɿCi72-mq|Ԃv=Ǘ/sжQu8Nvu2eF3Y\|jL“H|+Lyܶ$_3(S6L]ڔx˱a\rGH_̓'Νܡ ~.0mלl7TX?iItZR?ut/r& cF RcL1 a+[/%~)<(p~4Iz!)?6{mzO#E~;<||BB|<_\n.(,#{Ps o/(_W>KO~53kf c;vA+ZˋLsh H@^;\ֽwr+Qe,i͈?2<>'}څ9SBؾʊ^PPPe2φ%tɴGF]*1NqpX@bnes0;h~l?ʨUiu :JQZ7顟VN#gM hR]n=} 3j:^62|TW> V $͂(l4E9FocKcZguڱJX{777ig!!:ע,-N=fc҉'7w}6v7 iѭTwҿ*z 㳼 z` &Z{ gLwpQga~~f,-mҜv9;_N@88t /OwRgKv;^f)^n#xq\歓j~a0$:#)xmLsR(k!")L3Ҥ P~4@rbjRX]OwIo=G͢*F7-tEi=Y[,$1m{ț;dE)N@bZ̓nHKڅ(3:kYT- GX@Pp~.+*^e7oZum0QO[xAwruՄ7if,F J Oۂɟ w u} <+}h$_(\9 W&4pnhEj4 ۔1A l&*F.ENF`8|ia#n&`C!ID3˰8tJy W0tQپW@@%o>7vSxD&NY٬$[xCK=wuص;gf:Nq+b6`.F/-FF~"7usevs3Ψ1#|Hz@oJWW<b,%[ &9ӆK\G"/)s[rCNWldKT ı "55um!lޅZG d 0R2 wҬ3iÎJC Rgpo0r:7&J>?r&x!v@'H~ : Bp SiSsj=Ă``m0$|p+{55tY}ϼYޞxS5ʶ@!pZv[/@|z術II$PP#]]֪|ϩɢH"Y'3>SyQ鳿WK˗i9,bzQJD-޸zWA!>=ڻ-ﻺIqqpOVf a%' jP味m4zX,~Ao]{{vsIl?r6EӇ ԽX@"sNKWpDvA %pyR#]Zى=h!5^7Cl{r%3+1i ǀJpb 1/n3XSK-Fdz Vb G)V/!|X5U@HA7zd $1oRKf&pK@z|6|c77020M9S7/8 Xlp PQءrCsYg|!Yya !rq|wB9k عѺ-#4'O')Ș3P?$G],n.}n*@~Τ2[%7`Lޛ2dby\<~]L{p & )շ覗(j5g|(?oPDȃd`i}_OYҎ/\eӴf S3 ]ʊ π3, 0̩KƓ#=GS3^". s_&8zQf2mp120 ', &VIpre{8!SDs}ܝ_ `@&F.tM\v`M1bճwBX\̉ߺBL=;I4c.L4%Lh{>u'\I ^?q=biŋWlQeF}GɍI$ bvp1"| je EXd\N }k&/7+o >3 |^AQ}IQ9Px9`;]3[\CG%?S$ic ,65ֿv0QX=Yy 1@[ Pax;$Pd| .:IH{Y-/1lY')XM/{J } 9 ۅ:Y*(A$_l y ?;7O3X2W6[tP77TW7$QueeAiu?? (R݌T8=dttsds~aʽ߲M*`{WJ#E zOt$ѓ FQCDD"AQ#D6-M=s~g^kU绞3F~}Y軽nf5Ef/odִ͎H2L~FuBFz{ckMf{^/+53w,@ے^˸%_: X:JKW<̝ybp#Ie+LFWq8vCϜLsLW񛽪mQ]3WK{XTOTmoooFhg6f؃D"-xDzk"ԏ(d]wlڪ^ܓnz44jϕ|}SF"vm\]~[51U q8w ODT4OsJ\r6T*̅J\Sۦͪ߼ᗖĹ,?jq\p,*]j5Zn0ovQ).ZaM b=Q D7bjgon "!8h箊v" o/boC0 '"Jۚև^ۚFW4 "555[}CmnͳfddbJÇ+5^kJ~e5F?e=eO,q[AI ܊5ABDII<|}k >!kU }hvws~ާ;o5uelYI>:* S0Кmww ֏~ LvtSNj_i\g є}|l2 j8Mb4ډR_ҳc<+=l8]t G\7bv\a_<𳳳31rùjĆ_\\\PдVʖbZXVQyDo|hIqKIy+ufYcgm^faM-MDC ^6.3GKj]^[v 4olv~>|*{.閕M !+7[d ӏA;|jKiBjjJٛl.#^(Mȫ(?cJΎB;z]-MUtgƩ`bg:W`͑đw9} )i/F_V|| 9{C Ip29I?z6x> G5BS>F@r I9hbĵ}`_ㅿ Wmߕ { y{}?'DE׿y+Z,ə6F2=Oq|+^@Ql9O nE>RYpьGӯ=s-'15nX5dG_˽X+8.Dpw0$gWtx .ttW]#=zCcD syVmԙ/3TD91MdU Т+iĮV7G$t F_OOMgSNێ[d'4΅+sV^6 dBz\sflv'V JJiotk+g{vCo[TNe?s:-\w´' 7 *qw ׼|iPLh**x--]ݵR Sj%6뗯 +]NT y2 mא hHGR8cgc 0{[5dv] Rh>-Y-pEB,C"C)lC-O[k9+v_6; $f{:n$YnNeolv`gEP`61\TX_s륅z,!3La_ӣ5jV| xA1Hց\ܒP.Q|`7f^Q3my_r 3<C?@Xt6_=6uksm&܃BbVvvBzbÐ]mBrA;T ;w.\&QOԗP&9C( i$bͥť{%T`)pp1۷-"}STq5(MDO6F}}J#{B>L2IHK;<$=gF6g :9#+{zB>II]VBTC)o$ӿ4\y ߡs' s >ev`rMg5m׈bH A q4v{dE0ilBt:b?7؝9Hv^C!>qdTeYU݅/F;Íd &Es#CT_%W55/5!~/]ە ۫t?jd5)4 t tb8aMEj+ [%aI\  6"8L]]ߦcWz{zIHODl;Cƀ]z);)>}ΰ*Ej-9E, WQu1SPN#Oۻ055iϑ Tt9r˽\ɧ',i^@ &)C }Dc!1suS^ic(2Th÷]@-T=~y\9c FpSGZ%o;޲/>#2xxӑU6"D+L|VemʟnhIDra1RiPqJ`;2p+oA<^(v1WU bDX&AH fz@,I,VYbR)L8A`Jt唓Ig`sk"3GۊL8pd\%初es> mlJ m{v=b`"ƨ%)ZQ<Ex^MB3 i0*~ߊƤfR[nMB+ 5+W{4 x A*I#;Y gk/} y5٤ 3}\3 @>~`ȁN :,P> ^.HT4kPA[02&IJͭEU$- %gA H{pQ]loH1cQ dmm;u5`C!kF$R;-љQM/'jZMӨK x|( Grdx촴e6Y X?86UsY|Ǿ@C/~)?z,-˲ێrkϚ@sppB(4GJ-%cvTl.T앧aPnsQM,#]==[[v2q\`,螽;Vm4q0v!\rD5d>2%$J6v\L l(~`d#!_r\ǿwН"ތ̙I yYuLm5kRRR02\s#:UM0}ڒhF @ 1J՛|dC OFFfVʶ_QTP8(gnMIf@jrUEE 0%ک-P> ULٌAmN~ɤ<ͳ܁]B`}dwt7 q N:8_g<=;Gw%.Bwe_Xvbsiiqk ;o}nEPXUVXPssϻҟ Hit3YGdybbQO3{BtK.JMG{WOFAP/.U/Fcȳ٢ / qAVS%x ƠР14lTg:)UW(5ի!D9d0U9rlo1xo`8 1l@ 1aR`X3 Qlٛj9ɑO!){LM<@H.Zy*hj/L~0b$rB $??h!BHKHɡ䧚_XJnmm]w6HKT7w1Fo%SE/_woGJMZʴ=3= ZN#=GI쳒Q3ո̖~*.ƺTin mz8b~E )A6=O) O UwEآL5W- f ߕZmk@6( yһ^V+8R݃ $Ǡ,W^^٠l6dEz}a()w{K#w3Iۿ?i,gHR{G wfQ GO| se3 Ix#PcE/OIy^5>5śZyC$oHNӚoHPHF9F?qbMx1lWFCcB@Q ,/,144|H?0H)ENHD߫KWWWP`gG5Zz5Q}@$?[xN~&I¢;11]e\ uV0=׽?Yf?mzPuPm}6jEBۺ`̆ ޚ6E1d[Zѧ>2ϗ*}WVܕM``ʂЉOƪ\\_O5mH9]L}`([gJ:PJ^rC—F%mF@>h&`U׊WHHR}eXU"5:TȐ5^]e>X4qXk\ב͢8R_僦uQrH:Lr@9#p,._?bPp]k0grL=go ӓ ǑgqzI1Y4*~=Om-{y{^e=HG;9=ٵeߨDTDmYT3$)[M)l,k< r%<*69qVE4q5uf@5p_lY"T-MPcM.}"HN iG hGVh0[@~ɗ:}1e~t.qFEXjL-n$Qc&_RLغ}uf2@H"? KlrHWmABChk*>K $'%g(Ż&r&&XhMzYꑐ] F ž+~W7Q|_7]A^iDSfZ lx4Q"bsJf"y$n'/9 .H]W ۨ-Ȅ;}u\S/fPS(n{}ɒs@^{Kny,& Jiɭ.ݔ+14<=oX&ay]"1Ġ9.Y )\~߻~K5Zg΀ Wx"V\<_+|AM%1R&^tzyKMTg+hĕXH(55Ha KK$>ϫUdVoaqXXC#%O!u 9XsdUgYf.7l&(xm< . \vBBS}}k:1Ԕ쥏K_D & :dbs&q$LNNe^;=_ dphԖ(F>"M#j9Z_K<弻ޤ}>&V` Klֺ蘏 SLL=rf~f&:#mO30Www^>>ٵYd镎9U5+нh[ijy& ɭO Ǻ1fq), E.{}e;jnmm[Im\^ Wu6k,V@ F|aN il.p24fv&d0鬱;guF!?\tbؘcA"bދ⻷b----/W_astVDaH%)}<=Mn"]n*buUxc`n+=Fr>(hU/tfq vTio֩]>½o滳T2{/ x,!TImz*~H6[itc2:?1<"_ ?ގzԢE4;P%akEEGH5݊{aIIpc\cA]r>I)EK z122rz蛅1yc㱮tp iQQH׫5 n3t" GMmnMʈ#PCk pnzN^|FW6E쇞ed/_m%c( ng7u`ڕ(H~6=!</202Щex+Yr gMv2mC7LOO/:]* 6ZSb|,^~>bd]vuέ(RgeIH;6mge4Xnow{J)R gSQש՞yV< "f'ARmUT fPOxvsewz%aVVV(F{wNZ]qXffH=ԧᠠಕ2w[q9(DZi[vZp)CՙA5r|qT_.tlLPr덷r~my}zumNʫIREst9?gg >$ޱsD*MPøCX[U NdԩSOf܀S$g#Px8QT@C9SW5%A-q= |uo\Y?sIgōSQ1>y]=eDcglM338.ؕGvu\\Pk(NׯhhwyҪk}Rw=AF m:J)=גxڭU|~—/! ű[hM/ Ü9Ա D|娀{CUoȶ{$ȓ^1{!|7wUH"1OBqTƨ|x UpGfAw//,srz{o=,h 4 :=ufͩSEX{`(_u,VYT׌ʒ7?6)_W򘙛("0.Wั."yAhnbL$аOmvf>cZO[^|A8m2gEt|Ωgm~^ wZ4L_3!pbPyw(]Y0f+^dzDFX'`3KU_O? |Q_o? ps  )&!-"&- "/:ȏ:!ouЧP'9|焅:Ao?:q ??V+?YuhEQПi?""GjuwEE:1|Vy$jEA;F3_\B?i#MG&&3Hh {3n>:Bs+!LBi?N}[oL3~ }%7!tO˴9ΉCgdO4z,n{OCse˒UƬ7 qdر))-0Y}TxzG;{ao[>'IE,2-=t hMГ V"}⶧CR}  ::z(m^P0WJZ0?\a׍jw_^ ~7Vh؈WuLX=QYbpk^2:FC݅-t^'YvV\]`j3dggQֲr}ltv\FNukMDDx]Aⶨ7w.Ql5mv5NKuGzԺa%< mhϋZr?IG}&#gG$=nKJD8Wj} ݷHwsx'$Ut `m|uB2_t3n%$' JۿDK2&waWYXX3H:8m|gjKe7z,T\ 7 Yzt XbT"i]ᄅX';govԬ 8dxۿD~!~ <Б;=܌>gl G? UG'~*yxQ:@CH'G=WES\`bۗ˽r*:U3Ҿ[/͞Dv Q{xZ0+(tPЌ%5U ۅ~W~<z|QL&+{*L &P6c,S¹dC102'O))oFF3n?4iKc60A}<`ah*Nw-AU]MwBKu5+y#u,,i2V.A:dϞ3;?R6a=Nlvr|"ƞ$XOc"ZC{tKӕ˓#4[wS<[7uQ~^ãgbƱO:.77ފHk5-f=\`> Y |_t*ÉALK!Bܰ|~ͫo1 gwj`mW3%[EytNR P gbEĨAlq?A3=y$\р$4= @ :V%}p?&0Ǚ0.xό3<#2򰴴s622"! L :bq0}<~?0 Y*JOD\Xy\۹GO=hRɋ qP Z_i:ϕ-NC*FT/mrQ2]Uc$~HӢC}bmLj!!I\0SɛgZFcx81X,ݢKY`3h}G€0/ǁM 6@LYu8юCRٮl0}9{2N.+[ KꇏKx5׻3 `=@O9)yXx2%w=G?7910w H Ĩ1cD̷2~A [[ۑdZ7b:lt~zII\cZlט+6lbeAu՟qlT}~o-S<{k=a=V$c #,.W@DȰ*AN# #rI͠y|w4 MJ'/v]XjJ o\+51Ó'@{DgfJjnm ʔq &ή\ Xnýfgfջϡ:%]dr)ETbZXpu E׳Щ9 QM,SDw%Tvl{*OLt,?s< 5|;pT}[`ڍicd+ r.d /H}%D| u:}j} s|_JЪuϢVLp˧nбA,iڐK9[Uu :ӫC3!OZk1P^n XvbϴNq}ƕ꠫q?TCc7z@=S("YO*󋞠,jib[&jv?V5(,aW:+ѕW%!]HO IQe̜-8/>{aPpųZ'n@!X8`+_I=i@eZl$m)<f,yG6%EL4.l<ń\z-syiHђ$L|37g`dw.%M 0ϸ͝ IW[y\x- l*~gk7+D?󅉍#O%~UD@=?`7r39]Ȟ`@ˁ->}bx|iuH%>huiw0tbaN81h0vMe `gׄ.K~M0wuGfA2'p%-i~7(uHb5Rvf>=0ZH& . Ȍݥ꾤-^dXp..Uyò諬7- ̌|Q|mmmI_ ݄n7>#JAV؁)PV;:˲0]@~33 ?@W}N727COV_>wަ,ZZ0$LUځ$XA_C`p7${7B偈Jl-3UQ!'GƝLպsP=O"_W5dC筈0$;~>\vay(g}{TynN?IkfHxI9B@6ηroVv v^{S]MKL(XNz{5ӧOoo%L9Q">cJٞtZ}!2%3\f6:j4ee'2=6ltt:Y8% Gى8 ӽ$&,~&7y&'cx;[5 1765 $݌lh/Qw:>٬L5~;_ys~~O;>7`1CHM5ZjmE;8Is2Etxsl"p]x P%:!*`=?Uev1/E _g/a!VIxɥS@%LP4ye!\16{ӕn9T9~*tCxՒiЬe`}UeB*N_P*6aTΰRXlmgE] ܋ 0Mϊm#\"AAW9\t$av:xDx.\FXbb/7W"Q :>W"TZ330{$P s[@@`Sv'~Hk̐ $r>2U,)~~/i,xx7-glY#4qDkg 8}춃|zt\_%@t^A 2L;G,E]C#WYԓ{u.?^Xpv}ًYBLOXM Vn5AnCLcQ2|12~;)8 IV_fg!ᑑ|k΢Q#-xFoo#$\ <5Ugkc.&ªnnC{r}n+iDLq nZ_K7t#!li C[ktN݈tqY>0oa#;~=6Bu>Yxa\ gQkPZ|E:5--w\0C.p#')MU2“e _ewgRI)AGHOoh{A jXcIJB%}s6 46bHj/_oB} ]N70D[o S S鷀[RzRq -m(=ϥ~Rz-7>J𞿔,VG.JZz\-i II?P/_V?VgaP9|4胇dǯ_ܻK:I]FF\5ʣp56Rlb[8e7QԃK(8T~nX8  wWMsνb;z[$+toe|5_w/u࠸xoo#G`@P~QRՙ 0SЌFnUvl]1DBAi:(,fy6/XH$Y?;NT;O6>ə ;Iutwsuu υn 8.g qVض9&n8u`ݓ얧$17n]{B>6 0D.ҹVv[3 8{糨Lݖ7KΞ./-M6ޢan= -;Q6$*a3ẞ|gп,Rվq]E@WW.¤1gOHyУGtBggm%xxx&&''od}5Zdn1XY7ÚgyK ɏJ>4.7Xl2|l25jRH!= Ov.ii|9XRC"腋||M]=}iSDgwWKJJRRyrҗ,QQdDnA-Taz] %>";G FцZܸwǠ|.g\XLW*S]SX(-csyX"Znpdwz 3ח#>tQ&0wp $F{h\,L> ΩvS= 3Sa!kV\[-AZrzzz{)Ҫn:M#"<뜜OzEbClN<9U6J!v|'"A4xwګNu~'[s(ujw/Ф뉉7e(1 ഓX2SYw ϲc+9I۩Q26=(TVO],0+5451qy:-AWGF `0 [T\4A$[E_0TuI"\͊:9@$Ҳ Ei>Mu"ha^ O766r km3W. ҞH`AHn}h{]nkmmll<80J+(*M].0mcƬ:?\4zd_dlȬ9ֶ-22JQM㙦U1RX_6 .C `9 " E&3:8(ݗ5tμ:\O a%p3-Pؕχ.5r$C` qr&HWzNI \-3i3íGr^+$w1=fgWn TyZB,-xsʌdT83.0Ez!0 LWh+լU-v2: v"AppEw38F\!!m78ͷUppܗ +Q.M0뿬/6ȬnXEXKOf ~.R53w/(4I Qy*ɔLc$<B%1&e2ct2B}C}׻\:HZ8Z8k(p? OPu7kt*t ?R^V:i>c&,l-Qv:hpRF,{dEsGF5$ڛC%=\M14Y2L]֑bP^767ciRݵbE(G =_w'Y :z;y4Vs~fZ/3A(RnI+Beu yV4+M*%1$)?-.vvw#ptl$V^o1|ܑ3)oȴёs(W7bv;* V)Ҡ).fzTQ0˧Q=2R)Q %;kEuo`K+ܤaCdEČaZԱeјAҮEx7Md k}#lɧXEe= , RW{*(VB  1OH4b uFYV'h^{oh| jWT\UBnaXbi@AnjZsQ9wo{x$BtF ΋ZFi% wϮwʙ qJ\2]3@ *iXJuvf}\U^ %k{z-w;>^`B޼yr7Lx>'AY뱆PSS|"a3ff:;9:<']Xl-Cv^+NnPy3 4LDK}hxi1{C&+t]/kk]H3_Sĥ3hj2{jߠxۀe552Mn L>,wa #@.m_̡d_ !*ecf-m3SS=1irrr=BrwGt5̺nԽrS#fu~\,zBm廵791}%M,۝a"G3"iyr| ŭU:0L@Lvҡ4"{ VD:5tԈ( @*;KWǀf5d,,Wie1ظb}4Ȅ>g0yI.ncӾJ/B= t`6ffӼV+ɥ`\?9`ȭe9(s⹑rLu;T(!Mi\OOo͛־>{(b\ ܶ~gxw+)l(ƷTRiSOvޓgfii)` R^c_gqA500ǗuRE]>F6 CU\ށI._ TĒY_nWI, <71./^lWhSi}u˛oӺ9D&Frk;::~}Lu)e1rƓ~reŝ3{gzU==嬎߀)M5l YiN/ xdiKG-Ld"@Nt% B[˺bIai\B2 6. 4h9Χs~]FI:#pT^UUWD-r;? pklZ;g}25GAZI-ttfUݝTU$ë `ԄMLH撲xWgV@>OK7lw~sTJv§`mҎ"]{%25;}rrr`xpʜ0:}9Kכ@$}3F̢8k}{z7B-3/¸d9@[L8P^r|$UUU,9'6|g_`3A$a@z\_{Fz:wq,Q&00C |S_AQ'<xOMM!k2P }#W-˔pE`W@`H-@f '[Ԯ0v$EK,3$'L!'|qnXvçRza1g` 7R߈zLqK?=1WsObGK^&Nzg&ܘ@&zN%pXtt͗ԎHWrRe0?=N`}@ VPm\I0vz:~.o Jo9 Fp⼼px00pjZ_2}}}AV_'Pz|H,l_ؤ'Y6?D Jo} %%%sCzA<-+~DG'E{*]x`nra$mF4v_euiF4.DŚ6{D(<lD\xRig؍ %#>Ow馁t`߯}ghƯYS$(RfL..O'k#揮$Ld_f}6~}3L5B"=;[ؼ$x<\Q<9ACćE *EJ$:;e%ф%d ,، %{rZĽ0Gv]W^^ >^IzIy 3*85lf, JYFtcsj 5>l3+Z[קɥT2O^>]Cýb.unNGf0׳n߾;Mބ1 i(ǺKK״Prs?:jSvwT <6_܌@Lz]SN~] jIہłVQ$YR>{% &("F\TmgV n7p}miejZ F<{3 8B@1W?J7+б #(B:u&S͟+ʺv7(-;њ78!B.=#;19{ 2rt3UBz>,5WTtI幓(b4:]fJN/>[7վTUHN}fJz[MȜ4X* כs+g[."b#U!q/5Am+JNV{B͹TOn=pu+#v~ZhO[>EDbY؛E^^$wpok5Gcz=<}r$7L s`ݚO0ǯ Պ-♿-ŻTM, 3UDN%2lK3qY@ٛoi"ߢkޭy>{%zr3Fw6Ah\OWs@ihN -8pkf9˱uS4vt 4^&ՂJQQg0V_V|`GWWĝlIgoIdUc 9[\&eiiWBz̽ɲoG` ]HD;v 0en染%o,L E4D緾8׵Gy ԔvސÅ>څ!whCl0.>~~uMMsc<37=5& y*|cD^zkۻJ9r$ #Gz:tb-̑3eˉ;}PCg̋f릲#sTsc.3O׎4xť%,ڣ$U_r+ j[|NE%6# N4P?ڷ\ߑbRBcr &`r0TB9r Mƾ:%MLL<_]]Zˤ]vaֿh\x8$.w 1%=/*zNa՗յWR_ao\O=)p#\[DwƠe%I/hg|~3P8nzXl^{K5i`NQ"aoC[̖) ` m{{z2Q`*@HX-ĎJ Jx=ezihXv.k٦SQl7.N?)Z|ۤE(zapUM{#dppsc.Yh&ЁqxxRVVVF Jk&3 t=7&|F-w'hj~35ۨ@z߅qpppii)^cFEwS_76rAa|e&Ve_?W :b`Q@wP@|'{/mP[ubN۾/w6Rhi]h<+|p'$jId/YZr; 3R4??/w\}jA׾f߾D|q]r|WvUtr.m2S61 Ɇao1^6y޾.XB[<&!j-T*ς^}16ЙtvB"=_<|QsLtr~BqqTS8gGѱl'm𷯖]/BF[^xk"yLd^%~r:i|cJ|U:/iI:UW_m>wFNh G1QQjj޹FG9攎NN3%[}@J+κ}(%}%-C%XUc/&ƈ-@Wz-I=6k Օ :0~FW>+؇i5.9*2ӝ7*7㽢P=+GKu5=8nڟ'}OZ.'-dTR±hJ Y*a0S67E%f~좗f6$^sym;Ũf}(YF>[$iN_?C9sՃꚚ|m*/QdID^^xް9`tۅ+%ZDG3Ùg rqM\le0&'-(RL>0kMTSȏW+&&?"NR'ff+xh[Aykʓ+&@<;k^W{DGѼk.ĘC_*|̨~}}}%2>̻Ê04<:M:04VD;:sHyu7QrCI}xIn) sL~rO s HH{[+q lk.#||OE2'~Ѐ_d E/&-_>82 gB.Wo2mm&o;?9y9y'n)sʼ^g%>r䈔rk{rʢS^p[a=#w'ܫƽDWE4> ?,dm++v:728>c|l+֛BT>~׉hIށ!?U&ԙz_f&3_/ OVnth܁8IH]V_}5J6 C{[N}Uʝա'ž/-҄RuA)D(wM,Xcˋ7˲ /1s:pl.uI{}{,9E=RpMpȋR^lD+P, QenθWKvAffx2c1t5-HgyB(I4y]YRZD Vlne77H!f,2b@2.]]BGc8Mp!c"3هў֭lܾn4,XP̴~}5.)I]Đ I#7bY;2czv_l>Ȍ{JYrHlzkC15&ʣ!2Zq+kC{|L88D(R'N^R3{TQ;L_~=w:<<<>鴸ZB\ ns.:=E*Nag#>CYN;s+;yb.`>2ҩÍhRTxsS>sخKcf@ r[3n#*鉳us3߿MPa cCIII:ՀenÇtFuy^v6BǿCAÅX Y)3Xou^P.\H܈«X)jǔiuïǓ'|^zz+t-DdvSyJ%^\MW8][jN(hM|ȸ=#)y -`TӀuwd`|DcEbP=E.^ S;Ί![8َ̨喁Y>k> @CB+J~azMO8s}Ӗ+=Nׯx j?fpV$s 5~]K86Qv HBLԞ3bnM wZbzE<93 \ChN3(fՆ,2:}TޟRg}J U) T|I~ՙԝ:#![L=5?E  nD ~ $3?!sAԺ6* HJ(;]%0f(~>Ecv.A5hŎz&%2G1a uufG'xYɂ\D@%R8 t)ٓ޷ˁ?,H_ZS2^^y^Ts2iRBoOOOp0)ᵪxxs_MRALlj"9qۯW?+?hr`UiJf܁XsX?Eo1Sp2 l#gg "1aUh۔ݺ[|) 3~\!tf`4,:Y:% Gmb`0H% [JD)ht}Da ߀h'-[;:x!7>2('#Q1_RUW/V %) :<#}g!Xw].z OyyyN 5 o7 SR:8ҋi4o $)eɗ^Oo̰fb寢:+dnFFgPAA*n/DEnG/;7@8ă`ᢅĐ_26?y;;w!fKT9}C^^ޠ`_3=z_1gs33hHZvvu/Vs 5'PRR7nux QѢe/Df~X3vm{cV =?= 7g,yLn(mG͡ockӼ g}N&.&ϝУOL2V"Gssm쌌/pIYf#vx䡽S~A3mmaGoT q珃`smXBy,]*lNyZZ2Ai#Oƽ/Lf+'Ŵ*%-frn?wi$j" E賘WBѪgR^~&v{)II^]{gƗVĩ;Fbs $t>E2w۲ܝݿyjG_o5::"F'A.*&ss&ߞ+]O&B ".Rq;ǚ!+W0zȈo&cRƛQ¤R'qs$O6n?wT kͯڽY=]:܁QSV\?FjG_ڞ&''5; 6phij e}% Tp'>Uk6IQ^6<- i _B˯)J=P!t}ŻuMJd).ۖU~qԵ=ںm1s7Zb?ndWFTHrj n8v6 %M Gץ3b(xG8P93Y(Jй&`?lm=ܳGPKeH^巸urɞM2!;iqߒ3֛UCce專 ֵ̥ # E-444$s=o#ŝ LJ_RfiF^}YRUUTyHSS(9~]Ir'Q쀟nE_O<%ƶ.BR%l0{pN̬~Fy&h Alyko޼xQ \ *͈|.^TyⴸͷdFiV#KDeV3UEmH1-CV=~y u8dRLYiIwRpnK|_&&&fg %5.2vrrumI-ՊũdI8\T_R{q`s+W,S[vR ?z]?6Ձ>[z\obfd@ 1]=r%f!V[ug^m>Njm]^>|ewgg]֞I]f;?̍Xxyz2Z/5ÒׯoiF`E G 3 ֖fƯm-PTSS3Tɼ-z3%݀mWx籘!;[D0Tw7~%6GPK;i&<^MEx>e,/:f$QJw_w8?/|''o79eߊZ_}_?k|,oY>=R%{/Ʒ(|<)/m{,[_+Eożܿ1=y(ogx?88w?xL߭xT?ނ`1Z>뎻P0\:4"iH .i sm}㷻*iJǢ"8uO-vx~ځf+2ԇfWibW0;ȉ|۔yFaaaNN3g1&EVx嵞<3VҕtuK>p67599:~^>IpZ/s:S<,qw|}}P{(goL*D/^PYg4L#Fy:PioqC$d=>[` wz`nm)רqqa̮O4P:yAz{W/SN6󊈗XiPmqVxVn9w񦜜Ec -Di$l@.0. ?k&iccߖ.iFjjL|\\Jbb?/^WLzؐ%B% U;DĕL ;ި~,t=ëYF-ךWE𕩕ږrd.MNVLuަ_zN%Q%Af{lp#C:3˷Ι)CZcwBMewZxlg/ <^ɍ@S8қvG ?hah v闺E%خ$Q掳۰m-X4OssllɲYCV-%rףJa QD Ј{|q:Ɲ=:/1vO /rt8OfMucܓMjaĄJ_[ wX1o}IF#`L2^6(=SA&??6ŧk͍pFɃͧ%grCݳgR!Sr܀d .|.0oH\fb:8SSSfg? CĻfff܍r[>Wj&YKzHfMm^3tii=b6R݉9_x͋葉jmI15 z @frh0hN2Q#;wn'x4LdAn;5AS/7.dzF7sD]PpVfQRKPC+d>8ו]IL17:H||m\hhh\f{GєqB3K쉉&g9|o VVV·,-Rip}WDRK(okL_;3РYu!ֆNiWA_:@Ie;%Tnᡳ&F}&Fu#\m3jF&Z}}V0g}4zI@36 wz؈z 5M[y6.9l HoU>Vg& _X _J0Gxa. $BY`pנQ{ CM)g^Bkw,K=Gwعu"Z- _e`9ҳ@ta.BBmڎ0;--Eg6_$?\88l{5a$(RG|k+5pP\0GIJo6牛鏂:::N5Ǖod҅zDJF``g2%hn\1wRKC):$Ӥ-7Vֽb/iٵvܑ TkuƏf#DiB|"8qk?:m1rdm57I? rх}>=\/MeX1mIi}zBe0%88p_XyӤ j߿"pn2%] D[1_~^sLQ}9VfEg+Fe Hە8oKo= :뭄U| ܶ5QꚌF5`xoG/R?\nFJ]p]e^r\ Q1['?RQ[GcsI}{+?,}= 52-*w`:pTsZ)ϧ~}lb-U dC[υ~@XT$ gldd$) 1ig+^> ve}&ʼnP=G%j* "P͖fng 'd/c!Gqk:XpbB)669. 8+F g2G5]y97;xx`s.p 8og]b _5oGM:rYGgbba؄!`{m2"pI󌖙6^:Vq/֛g0E5^=)OOOBfH R vNg>t˷/5#^ |$R4 '6;9!zHrbWC [o9Byѥ'mW"Vow?A'~ym(<4l<Ъ{2,G4LہHi|$ 0#NBW/1)%~,B琊~0x)DAcfcB õArT]=yn8#ݼNGƂEޮyxzQ DRE%<(݊݀ $x}۸ח"/x͘.bf65c ʀG)IiT6B[\>h<ľU%My3̂6Wo ƾVo%'% Ug`%>8X|VZj(3\7pɚVJMMjJyqwӔrСu/6 MC\5 ӫMD34"{FX>`HHF@a\w@Μ0YMAW_u~+*EO X.p6x[ϫ/-J%\Ei 6srC3\t9˽֋#e2\p BCCRVXַ4p+jhk=988(^]}$18l0suH!^L5`8\t8cn q /-qKKKuuuËaPmU"G6DI-zvƱ$384Ţ g߸DGze~Zo7Q@zF,'`& I|IvxC+ J?_@ `rZ3Ok ' 1+|Cf T~BPTh\'%(" ҆2##`JFƵj Ƚq̑2 6TUUq<}z˗U=Ɣ~R.!Bj&00/aiq{!4+7SYbK_\Hb\R1H(ub;&@[ޔB#n&/UBaT6?ܚthmmÏ('X;6Ҿ>ME5ΝM]13#t!Daێ9+13}Ep̼x㭼  &M߆2Gė(83m!m6 뫿%,MF ?xw̪~9~@a~kH#J/4{|Q߳$-|8~/;"wL@S>H!El0;م!q' P ӲX|(I G=-Yd0I [P1[xec1D0F88Q)]A*]z3/Ls >:QO[9Y=@xPb ۄOIMjBqceOr<*~!Xy6*,M/B6'0z K5O(%e X7n!ee[yd xZDbݼ9յ9:o?CpD߉>M SY<"pj1%] JLnW 1]we\|j0n%, !O|0YA$FS wf7#}F^63c{op$+=.ʃyԪt>עė/ydžtkZ8 HȏرSJ9%$y /&-'>r$|U((C{{}Nq!I M6-qGM{ŶHdTrA%H($@KN"$@D$ H܀ 94[Bë{}ιqƽ5jf5kIC'#D!fbn~#>%<)Ne=Kܗ/) :q$ @*+1y#5UMBvutK=W *W^|S,nS PoƗ%jjj7bZ״r#Εݪ*yb?, IIII*lg ۶v `+o;TfJ^]\|S$^ L;s)K\/L50#S^ YikL?>>><|k̮l }|W/}nѩж=`O뢫sb #do]~%εj{3fff6a2LԣS{ߟ'.\eRaaik+s????V@XbRh-\]5|Qh|rM06y1%?X|6 d}ݻ?=&ry888BjB/p5^ikP(bvcgMnfğrTP$֠ !`eQ){ͧw TWRP'+LLc@'N|eHe/~Vl+7N8sAǓnPcv :<,%fIwUs[?I'T/?JhO> MMVB `?'DAv^aM' /OoߎXyyKR7HbI"9Iby&Kc >sF%agyi>^]0/3[9"`yqVIɏ@gხXvB䮛֊@VOqƂB3$ZWG|.^)mwq|v03_ߋ|` $+ )>l.IeAdJxu`nwRMک"ڽ.dᦄYR^SAHSE u8#eY]0#YGk/v9 m_H5ENmAa>]N-.:!I*<^p-<7% M F=0( ٛiOMirikqN-FliI ˮXrޞn F~ɒ*ʝ~M̎v^C3\\ .9CZTOMȅMc+s('1D,vFgG\&] ޞy ޅ6$\\Xk0u?"1ݷ̱D:6q 'Qc:=w]'n.ο3U*>`Es^NX$FMM d4-'e8XLKT1IRqܨo }1󤁍+/爚Ң*T.<5yDbfR+qs:+=R筮3;djLY,y[9zGAQ.Obv1T :zDq )yt՜N{[!7/G>^]f<@nw rITޖt/Q BQƿNJ٬yEFSc>I9xr:B ^ 9=o1^ސpSj!nˤ00b~sa铞1c1e> PPz$ ܇ |I[SnV9mtcŭb++˒<'+)-oڻzZ뜖,Zgpȋ3n6{2-Sf2qI0uR1qhDsg]{ʓ#mAUqya[yE+X1mtT.T:U)5C՘ܔIH_O^`uW(\E$XI؊u][C Uoy0#ULBSU#dt2<+_u;{dÔޗ4uҼMkܠ&ej3!"E0 N4]"o3 7^WwkxVV#sSDg!B3sZPs%Ɖeu^RҐ,q͌+]= QDL3c&J33qpz,%3*IPk,&w#hgcx uaRX,Rx.d2DLyH,Zi)קA+/=4'BRآ<'~dT{oO.Z7ME/p#qS݇9g_:Ie lzQy1:K2A?;f\0!g<>=lm:,P:ʕexBXk9S̻t`)sAIk-TT_3> _#6ĘdXqWtR3,)MM~0bB @dsk$*jZORm? |N%1C2j٫v)ܪ.@d/<%"Ssݫ+xo8BCh}\Z@ |/F7!uՙqp #}2m1i3LZp#tYL2~Sa7|`HEM3^%bfP ܇Q$jSPݏn}F,m.Y}]J' =5Y_fx M*ҋMDjރIҠ!/ZzB5Y7o[~@ehپ#$f7P #q/t99К̿Z+ǏكMJEDWr#h'JJ1[^ K.~zbs|j=~p^íEv~lpKQz+w>6OIտ1׶4 00UNz$N/WVvxW|*>纻>WX{N6 5ƫ۔z,@L4& x7lkp*j_ YBɭʉnjH2ښb B$5ʯ'IHd\g5rbfGlȸ(eW0ϢwRD"N%| 4 * 4drt O"ltn"iuXUzRVPgҳ^'l̉зC5/QQS{{rV78#sB>58(*zFas|sSw=|!i/DD+n!(wmN *m/@}0,DIˢ)oIƅE@PPr\lK3/ &o] ]I.\w6\7B1ۣ\35ق#b`j| M59: ;#51W`)I6Ncخ8oQw~Ǩr̆wp~e&q \\KCR/(@ϱRE׮CIxOx/(cD#=w,h56g#8Í>[iyak8nqI?hZ]>\Xڛ8< Y]C @^^LN ][s Ua,Mt = l=wc'ߒ7G}Uk(mq*t` JƒO6=i,AmǁQ{ǻ. ИFF6LF Tnt;300s[o)WD0mW`PGHu%҅ AŧR?n= h)RF쪱*;]<60flmkEy1>Y\6o2&p̩O_#so@YCWh<^|2+fK`pf}ZߘFtpkYK0'&"욳Ehr1fP$4O`꟝iɇFqoZ?0~uh)OĪ7U )0W y 'O^&Mɡeۚ$JW&L@C:鳿TW*SҚQiM\zS~EiC%ů|fs0S2ec8NR%렘EU)ͻ>VVvs)g@u2ƆLݖ{ͦtTzSX }qk>iͰ;AWٹg(ML=ewSHE4|u`gkhUֿ:3EpX".uD=wLJQ(Tyxbzg@olP8"!4)U'$FK$47*)p@M'^^5p@M(dKK`ˏWS3eKeMzie棖G>ȏQGQxatRB)WvLzED=,^CJyC S絮NX g |aZ*i=vRɑ$3=#>yeǤ/R&0fN[L vS==z _ #/( 4FҊ8]rz_<[0iTTz*6呇=qR4+H)\2Ofgq@Jv{/T^A nw׍#|LT*r R* VkWghk/ b믿O@FX6RbSJfI怎::L> F˅[Djn@svddE9!`kG4#o@rכH z+X؀$qUf -| 9Of3K))IZ.)M9IhĢE+L}%eW(6*,?>`HyWGȾg]9*pZT6 ڲ:)'lirIOm WbɄIndrZ>%n# .GWAЧ*X ~+>s9وǙ!,.lHR%.wFjbo|vVq^5pZ  \Oч6z`ߪ˧aI_\*>ܥP^fx݅e%/p.gk~^∘$|V#:HԆ/YnR= f>\j,>c)3 dxz#+.7.z9V @UL$ D7R[;G:a᪩%W.]t?h9}W9"DOƇ._*/]J{cN}\dK ~֨.fL nKV 詸篯1!'-,*-J|1smK.BybS*=MHDd hAK aޮkܘ> \%6]qokEl3E~v^g- 洷%>S?i7*Oki )zvߪ: #e/[4Ov<-7<yKNRw;u/ kf®,;swb҆uM=6wҀ60_Iʄ/rhHftmuT#H-I;b/ZbkK||Jc醧xMϧ<EZ&s2E`۹xWƪgj6DׯbLiwnED$p  _cd(_Enەbd{1U4X?ծ7i4y2MS@H']ב[Y wT(ͻnvrɛttQ`v]XAdT…lJly/( E]*"2aJSiY&b0cM9IdšĨ#05{ P9"Hui v b3Mޥg`er5))c&ۋLӂ=ܺ*U\Pﲭ[ȫ%Z)8o/yR988tQtLS88%HNes&E\B]b"Mm[ zvl@v¦eX2Os*?FDX)ڵ8 5 ϓ@H2Qȏ\ 4~AP署h_|1FAg%$&|mgts`0($/\gUnB&K9[Y*T0:覚tjPRR~VOK EVY1є&z,˴fP*gŤ}ZI 85*'Y&oFq<{[V'9/D`"E[79].,XȆA~將_-Hǘ^)+x\+gیʾ<: [d=d)%dz* +^ x°j,$?X_&jm,zQK+d豤~8E5rl||<? uj/*4{rn< ݤ&QKȩL6*4YgY0ADU[otu{ML&J5tsr)8wPpTevS-wd"e&Sm,uU"Ze yɨ LfV8HW/̻,sa H f٭,0(9ivK(>K7*^6} /_>ʛoJ}=n3^a2_8}ܷqJ NLhɣM~UM0ħo9Zkc][#-De? WP`NeڝT{`emf@4Ȕg#qcw;YR_DU=$y.\_h`ИmB911#.ZS"ڮ 蕅Q2 tpU` ;i>սW/QG <zO0 uݪ8цSSt`8(+jƐ)'MEO\ܚIH9hAHM\ 0*bAOQdM<<рť1\(On^ *zvnTz{#+ jA2#חwswܒEWoEsY##82 kN !S:oC.¬Wm6+ dpCqGz6au)pWzw & ܔxO=r/K'nvmW0sMLl kufX-6Ruw-$J<8/^WR* {3.SuoOII ~@O~pN؈ұ}2Or54`K굦GRALgBat]9ghzKRSj4ϝ{t |ЖgÔRhwwWaׯ/粐 a~ #nad._tXγbeQIx1?M(5nnyL=?u_PjKltIG U$܌~!"(DHef2G BjS<tbq3+IV. H^m:txp W\vMkpog +0@|)Ha/VU~WVȭ1<<$P^fO?~OKcܼJ%0%{Ʊ*-GG0{+phis^H͘aR;Å[xxDSJ/m^Y*#%=80@ٍe#i/S |l–z$aJ<<_FLAj§m.R.'PF>(i 3U㑽 `~\FAg=^S]Tֽa84+L}ؑ|,`"`mm=}dlIHSG1z d Z/BHqeu8mgϟ#MqvZ Th L,|:L4n ߇ݾ[Y"`l&V+쬦km[xVquXMU)xߡ㚁/ڷ $FE*a.ȖSS?,22bwo{9&:FDUt?B: є6WXU-P؍`O9F!` 'שcՆw ?T;sjQiHպ} xEZ=n%)yiD46_:u='/\*5M9JηzY꒱uم$o@ʡ zyib3I@ڒg:=vR M7FY1; uibzgMz-p[ESax 7\޺{TݱUc( M#v< ''OJG oE}bJQqcκq5IPQ} v^<M?\B7_0 >7"B>(o*&:LM w'-'Fо4'/nfdNMՖUֻd}?-q5MA<\䀅Ȅ p&/9F;~ߗk'7 fioL­uCٍjm3y-Y_<[JfkM ,w!kVn.˨+J6+`ۡRgl`:.:?qtRAD`p=SY1vկ\5ׁh {}T9 pZ +nςExxboDnXVVjVm˓Lk5.ϴoZb1NCOj#Y>?J:c^0X ;d;y#2xxp)Or-ݢYfԧZVg'ud8_K#viCu<2{I_>HabkzIˎR jYcbT_=[KwM^_tsQ[8 W-ӿ; ڏ1vڝOZ@)0e&?7걞*K]Aw ߐ`>^]t*_0)`޻l&^ :nL|kXscVͿiƣaroUHyMEO+3rB=W< [f|j6na{--- z U6쳫x!޷ϲ+& iii tX/'줔"xIQ_pTu[Yp1o겪z`Uw5Ο+EzW~@M= )d3K){@\.޷:p/i~sgL <Su9?6F\pS'KC4 9rI;;8Y9/<=zG ?~>vAn/o~O!ϟo|?}Ltw[څh ILBafUjErCAyD\֧G2-0;ס#9G7Нԝ-wڍ4lZ7i|˼KA) JwHQ 3;,@Hs%( -!s_J+l*m$u2 b_=Y2Ѳ[CاU,1Q;18>zSI߱COM6[{l45KwLꏹ9p)*Jί"FY_8LV^a|3iimqܦlgKJ>dtGPxdh먡v1(wH@nb\Rv*5utt7051)##*?S_Ma$7bxv^䴋9&hׯ*(zUz(y!ݷK==PR:: q:~o,kZN*&<+++?ݞhnӧB T)ArR+{t(){b||}Z5¡ȸ?N?n } 10lq|ncwPf-r_KSo*Hkؙ~i_ՇdM֫3 JJ쾅xvU5hT^m8V2y S^msnbΐ{i-*="ihNHY{{ I:=^6Ծʩ9Lï& c{nJmLņ;"U7muv&;k[=cMw>Kx+`'1|g[R*C5K;m:ۼf} |?](d^_y&#*8#{NɉU[\8RE471F9xR^@C!ã/y2cEgBX[䝼F/yQߩvxٙ0ur;}ag5԰;&l0`-;gsgs ڊ> .R>%,՝N)>Btqq s5x|j,1 sY=ݣb%W\bfZ]Y"2L`E. S"Lb +mi ò&xb&=̨1*"a ~tbN.RfrtR# 1|O!&K@T50 @)*v~-.6Jd1]sާOdd5t?&lLJN~5wlX5NQ0_4c͚eo7:kݍ9lόYU &r^|c##1)@ 67ndn#Uco0(]NʻV/Q̟ εp-J52^f_,BKxrF@1&j<[KߪfAHÚ<\ s0"O/He})U$f:]]+P\O2x4MjBī&PuT}f5劊Mb20a]M+[#U~æϑ9BP>8+WWm0V/Xo^%[s[7rG@xD0Kgl] ʴOlZ|Cg3n/8,''ĕx 37c|B8rȿ-G/7wƐB_a>x Io"?Pv P+swuuPsz "_M%d7 %lNIIICh'?1y!dT;M s/r^>s$F-uQwG]nhgY7t+4,FiZg9Nڥ `VV//ۆw]?t6hl` NVI}5_Nh)Rݻfw}T##?~E˟7 p{ Y"_MFViv ><^(Kwư  '¦F{$:DAo8uuF:C:朄+B-_BNߡ;ƎdV5&KC?'2:*/jl?1St֢X_*pwj$*A#ނ>gYR<1poV$oeEz|HfrHѹ^Ҭ_ qGp$;H+kyn8=&-k2h=`rйa.'.~Q3.cJ<>T /#e":MSTD:xxTsx=)))pA,jA~w_8uev7X6߂ _'KZD ͟)fRM>n]<||̋-)ٚ8X"oD2?`mms<nX"nDSDBݧE"sD!09焪2^V:Ahc;޻=r+*OuyJTou[ML%~?lյ<#IUC^{Hi4Mfha%IqCH9«XK'lH;~k&i, D1KPVPRzS;{%Uce0b25bm2 #y~$hSbvOkkkӞ'BrЭ^VSu;f`͟T7DXxZݧφF@F+w lGzQ$ N!ܻ>q ,rJ Leo"%gXFfwG(?y`ql6&+t=x>L{0bQC]C0[l3,ĸLo MYSPՂӒ2si֔;49WSȪD{&93l@O$/s2Hg Rx, @d$.{"@}K5ךmuɮrP p^YhDC Bqq}DExhaOf؞^dV_B.ӈ(}j}x7ymA۽ YъelSH(R U>o}7f_mSEr_v߿}?Q?~R+[U 0{ǀmvKA6?ob)q?O7J@eci-D?P;O,ZqomT;?bP֑Uy`U$^+CAO۟i,_+U_Ż->{'[;TX4(M-vRʖ &&v"Cߨԟ^"[xy}:.ߘ9"דǮVs`]KD z KDr$eAҜ#{}abڔ1=lfI @Q X턧$$Tt>WRP: /\oF44;!j˺{TR: 5G0{E&ےen 2UCղ'uCTS_(L^b'Lx\LO$z҂JP+!Xf$wy2 RbM\W+~ 7"-/ƕ'}ڭ/]2 ,@K` _"-ƶf!V!kN>HZZu>h=&!*?A5vx*r a.SYݏ6.aX"(_(Ԇ&\^_Ha; ݸ,VW:G\)q-$ݐw&')~.?3Do۽ZD\[nݾ]?Ր J|ă^ty hinn8A13c5ʫ92=Ldl2 MĹj <ӌ:F2{\uXC0<;F#!(!?*E&=?:}XUEm8/]}ktمSM8A9!\$jQao}|+3,F? $Vw :/Eu՞'@:갣4J5觨3+A 9 VVVFt(/k6՞ IwlC؀d@D1 Q@5f@&P8+NLٔm;O_lX?YTmiU!bDv/ S. GOɂxۻ4*w]YMD'G"`*K|0~uTPN%$䤓L{q1(Ļa0c՘ ۤ, e.|}-KS]^JpaKB撜(!8ۄxqphxzD~yuIQHﹰ _ZGpG |ci-WE8IsWCRWkUukPVGv63};]/..>i;o0K8el!ԩsɽ'O6666u\.›^Rj}*ӑn׆assi, $5@! FZ^ CڡOC 6re@u Ԕ}p% "7YnΥgjw.NlAh7Ƕ8<`P3~:V!56+}EQ1:  ӲBoP_&or'dJۓtC%Dp)f;v/(Y#IU8{n `5_x/k+8ƫ/HyD]VGRٷIlmta ac$rQ ~'j_RkZ^M2I7X;Lق~4 d ر$Tc$syZlZ5Z_I04e%&TMo;Y2;HMMO?"BCv&܉b 8 W/ik3V ck\, Vcksk[ txH+XQ;~lt"jjW90Z2z.`)q1}I@@Pe!Ke%SG;^+]// ycj?oPɏs ` 7$ d}ݡ|ltn^Vc~!GV? w " N1 ,\{Ͼ|mRWSaʲ׵ӇG\~vCg6hI PfFkbBVV#*7$M%s>~*3HQq|Y`rVfBWd n\]`;M >D CU[xu&)dek-Q/"&ED]:CypUDd, &Ui)LDd[+Wwg%tz3 _Px$XLz2Y4Q M۔޼<67wAI`0,iA=NrM^'#N񩩩117f3XLbI׌7:Ba>yËz JjL1*(X ҝ܄RgьN{7 B-,go.䪜UsݜDP( Lplr7Q\DD %!Jڮ6S0X`JH'ʎ!Y@YA2 ϵnV6PMk{ETd̮/#p48.#o !2neK&`JV! y$caa'4t*q /RӯX+$Z|gf M@89Xuc! e7@&Վ6$#O#cf l}~ĵ @dvnKԽ˩tb>Lsq hbn8ýi#pkU{@/koopYG"mbQm `eűWN7RLM ^,6LSPBO-=菆f 3Ƕ?hf@W`t=/a U,OiS=cγD9NȮ=q҇6\"hf_V#6C"V(Gy|Hmrl p@!8Dlu'R}9*m?L}x˖BxRHP/grs+_<h6uwJvp 9FDBؙi*V{@wUC41=]]q 2CY<%ǝ/:W Z/v߷x)P_Q\i~~{@w5܊;y[n׏fhaDEҾ@@(!}~[qXDQڴ Z7zok|:YʆP5ڟ6k_QZd_FDҺay#4N!16~;OAeEƇqho۶~;edGɂ}}4Ga;{̮_߹s=lШ6/O$ˆ%QWD,+Nɇl|bo[5kޢg\=g^إ_ H?l9jj{$ADcoM奅 EOCOD~| `ޱWApNW,b iPTŸ^cۖ{jygM i%g>sXm|p|wDʚX]搴\?U`rp}C$%Ių46xW<쟹iUgNwry|L!@B< ca`/S#]I;u ƺB 7_D+K GBDDEo?**V*%!Fl7++BKXh\\XAثɘ[X _9&h3-NNb\ŚS c6so T|׮]_$ qpEak/K.38$RIݫyaQ^^^>>f>nACs{n 6J3[eZ.$Cܴ ]ز &6n;9F걹y3̰4-Q-pDg;Iyf6CjzDN쇶Ep>X} E˙c;^M߮nR$_U_^e]mw߈T%-%oYi)F@ Eٿ??o[2RҊ UmϾ;dVdOnܪ'0¥Kpo^qXJgיL NB'fHtmc5Sk9NkH_Kq|x o? '_9ZWɷƯ 1@DfC)gYpvwu̅AãhlHXW#~~C4X̍4AAJӖ1 ]vyVVs_֌b=T]E..A@Gx^GRnmhkk0/;QgfhD"ᘓ9쟦x{E(x˼9FmpKQiedfWj4g/oY{*u'X>'/">> z;WG@ |&ۜH? -??;429ўɕ*B1HQoVu֭JS:y9l>`՞~|HOˢFNFn~F]\Z*EOE\$MoI q927OR<PqSGMiHXkВ<.8 N'3u.k#8DV3*.%x 7BY>xPJBBoPɑ*f۝Lo1J]qɤS9{|c# C8r ҍ'<*"kU-A% II:K"PS.Ʊ.֟):Zo`>N Xs< &B=)gÇI09ϓڊWW5"ARQ@r"T%C/#qAjH[btkgc)iκM !@ɸF15'bpEBrʋz{" ǍL&VB  o`0wM+mVg7X&#SQ }XKxEorpXV&4D@FC.Õ} OWk̽>xk .xK'FDLYJbfCpv!lIGN"!G "wl ʻ ^7C 5UvBؠFC"@FC6Z n~7RVɉ؄@3gJH)b^pbe#9UU=Q!DpO!uѣG# x~t,sq$(ɏ8ԯdNHp*z;`ڒIVG͒Jrz}Rޒ!=Qrո/g8,ړ]Q^oj ;i4 7:%X^8>_ck=U=""n)*q^[Iֲ+爨0eF셿'R -;_A9d'(-jsϚNdzU-OILLYSJU2={8.Aioo]V f\ MSޯLwvvnR }6Eb|QCzY< 9<9K̘?9heկ|.B*'+En=VVO^G(ǒqI))-26Ƒ \А@IjD:IQ;@k>fUQ(8uW,n;'\ [Ճp Cc2$I! ӊĨx }ȍ]:::Eh@|W}\5,ꊟyp (ɏh*zZhiisLDVH܏ %}lX't2Kׯ_wR Pala]Y\;8\8l'q#Haxݲ. 6)YlLot.ݭ^4m]%8ij9ΰt2K-g,3'2Tj &"^XT2:5$U"ԂIC2| *|SlLWB2C f-cz>211OJs_00fQr]@t9iWRTl%OɭA!!HbՄh$&tlaO:W |VCPܸU,TX{4*@L zz{+i hii ihhx%z0_&*£:fPk0nʓz7Tuf=hymF_^かStJ;]= hzsw"UOM/]:魭|U}7Q]XP@W 1P`GSUȢ}LjN`@ )g. J RL(ԝm)>sn#> 2nCª_/}tZՅ@1t/\\mlR'~q))11U^AJSofhԸ+Յxe儏H@am œs=Z@?Yq}a_aCj|ѹg-c#ϵm_ѧ^w&S %R1xvuF3={ e|6dBp}£4yc DG AEKDL۝Wq"WW()|}il̇m GuX0,*<޽{r 9t@X<#aYw*מQ UՄ$L+{R_o<$ݵsQZ]I9x|4,|96" go-޹;ɧ@qؠ鹡:oimmqHsBxeua FXd|PeAxc͌NKK}[8x>>}DuQBt[k 1o!!v(JT^zzT  U[4su<~ EUlֲrPi&0bfj0*I!u"P%K$Z*1'2Stuu}6K9%;H(HMCH@PʊD#s%^٢*SiĢg{u ԲByHhMKHB-[h.IܹBAVLgެ MjU[\q&Wg_rMs**(8ؕ:]7P2@BjLg4dFŭE-^KNb:CBO26EJN8Gf}d/jI``UXn*zTz=cN%͛6r~fzuӍ>FDDH<~?f&,vp_׿_i6O\LKK+ygQWF_A#?v#'Ot<6v23p-:S2 ;TԜmYL3HU8M Vy˰9t9)lF-ϡ(UfLD/.}^P5;o%M)6;p0/}+>k>wVe*VѴƸ/7Y+7= &G*5:r"Q ')!5 |pPzӡ(z0ׅotN $PqPi@j#2=-ٕYɓ')-ЊSlm5tt d㩜O@ '$Tx3JH􏻄UK9MU勼^.Z+x c劥ɪO,mb|8ׯW`{VLN'X69*))>CPn$q/YEB \k21{ $nd0ᙕ9nэV+ϔl8IzRYyG 3eFpPk-ګؘq8lf)7 zHx dxu(H09!d8t8q/? n:y8Fdү"H]1NRRB%fm%cnɍ#(NU@ <Zc;y[GƄϪ?YUDIJ[/VKܻ\ۘ(jg$Rcy8x)\_7RF^D̪٘OBpdr|sl<= )0c5zJ~lL+mQ]@@ҍ:ll[HwysurrWOO|9oVʎիhF2uVx91$<NKNr~[gf.54 Aֿd]\0OB(fF[6=4\<8Fps)uquM&~EEDggڣ˖:}uν>U@ wwY˪Xs#𖩆VV7ʾ-Z]]]L8ʿ&eEXQQQ̮͆D`5YDbejqfITLf .@?EtZIu5 gcy6HSp\dٟ+U7OsL ?E"4[7N';42MyD;X􉉉wR22 E໼OlzN}&z L9N(kkiiȄZTSmẏ̜ul~(YVGnZ\|b;@Б#!tm Һ188x Js"PI555RuEoSD^n NeKP}~.!J ]HGr> }$&x=ٸÀH8|ۑZ 0fF瞠~xo kgnP#mZ+;Lut**bvњTvy?1?4U5 %$sWUYR95 >aڤoIZn`jEX_+Aڦ%BЁ ,955nW|2x\@FU"lvfff:ު*bp4$,`7,҆umIY1RW188BSXX(^LaN9ڹI*X/ OOl9uBGGsBI"ᮓSD"0- UJ<<ޛ/,ʮ;*1%;9ģ xR_i.M8+-mR=G&vyꀷ(Y?hٸC(Qڻ(\ 915-dfx$%3eceǼmn!uYv l)trpq66k6O{N\y%kok{*eAPI@1a!s T1=];` .f 1}|X'v9⎟|t>{bjj6A_kppC2*>MuW_hpnf1 k)Q)~~e7w(.)YbCYrKP.xZE+'M= HewC4|  *W,6lypK<EB'B5|7%ʷ?8m,K@^7Z4xP2q$OOL''[[Zn+GIMSMR(Ao9// *e7%*&+߼`0 iΠa% -QӮRusٵ)@, G"loqEBѣGE ޣWhF_K.UލۓIJG$ᢈ 塜HIk(79u!ؕ>NEBjCُlQOk%cm߾l>&n_Ɨ Ͼ2YihH:%?:ČBg]sOJ>ZvbFTQ Gx!R"7KJJG WPV~9]3Dg *Õa^B.d1U7؆pRך8:n6IH\sÇN 1J)CÃ)yjRWeU^|m+VGc/u-%kQbt??0ZP~k=1ّ%b2n:‚W@tyJ@9b[ɸ@I(nlnna :P:NoK)F46:Zya_U˻#cׂ_rw7쀋VYtRGPPZ#4,ozlJHbkBBRvM׉Kf gPb%ZhTUoQ. OP5I K~d l)fc\8ݑf*^t+)Uk-C bOQT 7/T`ܤ,A&4Wz?pM7c/UIu*)Ȋ+(ֆ׿)ߍU[K#?g 0:+kykT2ZdN>D8 8L=/۵~.qc rץWYt:-4} ڇѕ՛ۦ8бYf ]k<pKc+Fr=dfQ2>>$ZYmA+(Ğj f懯ryCZ9*f)!) Cchh/#|<]\\X7Rl|ZƔ.+IʝX/!~_z|k|Xǘ)EΏ,~zEEE40L3pb=lmk2+"jYvoG<@B"sĹb"#$G2m%z!A7E&|-#*ɹ,BVXsMxK=/{TɞZ5c}V1/e\P Z7q惮j@j)Yww7ҟ G\S8Vb V pvD 1%ЗiN_<kPRV)>@lKJ3HQ',؆{嶹q')q:Z&.X8;>~'|Qyi[k3tf"j^esCuvb8)u֟ԩ fzoK?cQ?`6҃L\.lO/]1󷾑`7uu]i JIȒe,JINulK!ː$C{}lc6v1{Cr_]yaEGF|PH_8k,#?+YʟVgO߫RTh@v3?Se]v+R5r Yw|'%:vv6zKr\05<|#umˎ5ME}ʠWcVGr] z{fB)1*C, <ΝKy1KotjѨմP)))|*$7:Tc|Ef1&ȹ/dTykBQS(.x V:@ZmAA2FLW]QϊzX_y4v\9:i7 "66 )P"T)~A?8b:`%.VcÂc=Na'vP.k=ZĎTzĔՇ|ΞZj@~pwM)Wz|(?>hyX@k^J/}1/\P2l$xd]"5a_$bBĮsǤ͂4&+Ȁ*2 DS-OQ:+!s7󡮬LLL6"z"psx^2U lF$M9NPXDŽmq jTjz:7EZhh;o]@[!2cW叏6˶X-)1xrqeSBAa&u MC)DRG*҆sӧX[e(Kfw45xG (*%gk7hܖPߠh@u gm Dw#Wd[Βn,twFibJ tכluމkmy=)-OˍbݠBBBGk!}\)CwT\?oJ&DgL@Ϙ4a C&WžoDh`nmgU2sq-nZ7B$u %;ă !y*=yrHr|e uj)klbф ֗ %,k3Jeڅl@M$4*䖱/_k--iQes f3,|a"˓T cMϪbiNB=5y+An0;ݺ7R]^XbsO qGhsss >N?D4*lڵ`^@˼ Nu0Bzr¨̻ƨcTŮ?6YL$NC7ū#Ł'u{Wָ˭y޵Is\]uZ QT ]0 -g]ǮE^LDDRɌ]ñlvD\S,dFՍwk>0fFܹՐ:eWЪX ̜4=KgCk!"M9h]0*,<fO2 WY W842"5,W67O|16eX2Y! !1D@Mv-3r ¢rgS\OCa>Jq˫a݀]R—S?2¢wA>ҦJ#°2"msgruuAfr?Ǖ^Ƀ^Uh5QTޒ gջz}@1OmǮݭ/Nd8/8!trRsjDy KP&v5AaĶ{ՆCXZ]TN4~iS벺4+0vvvF# Ѵo:::=xz{ݻIJ]x;>(oyM|< P8%]j$)^5Fƒ^Vye!BSzI} KJX[YWs~:^#vn*<`FQĪgTeTS[nVFkg4 C0:i2k rj$jNw.(^,%s& uprؔ%yets#ͽ˵FoDUtq#ZaoceQ)F$nF.hzWʈHHWwp,yɐoưfJ{<=O~vkj5-3K7":3LjxXNС5K&rrI9 V-+48rc㈊XS\FO5љz%ޥ}X-@ 11 C3f2c[(£nG4^*25yQ*@s㱧,"D|Ǫ',E;+Nd\n3 f $7*Mj[I>}U< -Ug/ixkXiԇ#Z:&gkRs־Ԁ_VϫYw~,r?zCS&-W\SfCgGh8&&fL7!nzh̴ tj|bÐ Wϝ.OKKyr+~W99 C"N;i::"Ժ#"Lz ~nvVwZ$2q硽p~rkN/ ^^sJlcS5>3) Mܦ%'+?磬HY\$kȩd L*mڊq/Y=5gxps˳;]vl"Nê %e_h~-z˳Y OеWJl8wfX~*dvW*2ѯYwP* ~x yF*\-ܤo䤉]4)~F`-uQvW9;Tcr&g5GE5&f_X6j>CmXS`rX.ns?XbcsꬽXC}Il>IO ,m]xŠ1r7ll3G+}?-ɹ9guxS>ǜn+ .lY-ŰŊi>PǑaX{ˡ`g>y88|q׼MXUufmQL%O幝sX~0z2f֕׊%bN_[ut|q >ViYXX^h,}HXScA`9451BGyQUsg.ȑLWL;lm =h+l{ GW?~lيg>X_kmmJ8't}}3S$?q~%CoHce, *͏ &nC2Ao~ N{/ "?3YpuoMA;>phVRbbEc;&Xх-=oe*B5wmmUr$v?[-5C܈Ҝ rRdV詑ިL_oѩ4:.X-r˳&7$%$$+Njm䇾-}<@X Ԫ?Ry'u!Ɲi%6}Otd gW:1ic':a`?$Vcx?RE$|+&C8fg%C"W'C"<|edd\+&,<콍@"ۤ6?|/ثH7OL %AwM~[Zyl^QQEkK:4Om͔ q>$s\nau_J\.:ʏ<[CҲoy/i|lƵ>fV_H1F~.FY[v q ɖ |Jt7Ý'~g [8kBuV#DQ=l2߲"Tn4(?(&nVyfS$4 $ܲ^-e;{crtAw e%%$s6g\<%G9[)&zpNz7{gFm]#d3ocXZ%+ e9QIё< 97^댺}vJ O{-//WW_cNJHDDĩP,i @n|~&Ѐ{C]q29dxyс+\r+ƙ'3+ ?=nP>@S?<GqPնN+UϿd /'%H>ݛhs`pY!"!)}c*>n PHG 4.zjQ;U $%mR `.#R22&vAT9Nld:HC͓%~_o\fN7HkmTio Oz7i=.%{;h/8kC,Pt^ 9 9EC78x3D>E7VQ ^b)6:,WGNt8k'2*7 &4% toaGg0 箄}R8ᔯLk`nM3 #\]5@!Q*OsʪnU!reWJWbO £<.58px/csTg#'5bY.} ّGg/ sa eh\s!R0Gx4`[LQO<$A&z])a!u/?yblȠa%<='b;#fRR׆#Ŝq<]zfffNNfϔ.<05{C\)bJ qL{8ǝ!>*􁵹STk _> p?erF-҄uJ2.5:p;u~Ofw}'%[C+8o@ ,D jFԔS,GGC@`9(r#D|̑ &2- f5  Re 67y[t^罱P%^1A#_ɟQVH U;W>0kwHYzX\Zve LJB`zeZ1pr::'ζ 4l^^nY>%Y32'c 3} w @,; 1321 z:3=;ρq #vr "F8vh1gӍU!C7'+}00`,@M...҅e++n"b,AUu:vvuU1j܂5,ޕcȆ['W V~ 7hxw66xE{t|<(e]a| 0:oblbb"~htqזISԎx| 1(02<,kpI@>zj5z3E ˔7GR:vS-Н~"+Ԫ ShǷ y,x?&f>hXNʨP . YLK {0@PP0==ٙ;^RR׋& Ƕ"SMArs Ik[eey_\7Sٞ"B7:= :}nȦ1m$CqqW=t)m}?~†c,t}Z~V0$P${cxL?Ted뎳+]R'fkc Zܹ#8 /z0:ŶQ}F/vjp|fƏ.Wȣk ju bXr֝~GlQ@!t7<+yUUoor;PЯ9VFoGi4cնRo<%Fxۻ'..cENm'L65FDX] ,%%E__?qv6`cVF r&=%<[8$nmgBSN[е9W, K8*"ETrGkKBYΞ=XQwyi eUlETTT.:K}bf Yu}VkόeQ!ϫXa@5:%BkZa|ec5`/"#+TsuW[5qRa/,,8ۜ"nps'ܣ8b/kgi,؋Q)+xOJif垍Y. ccsKkknff?#[tRބύ|"-ȳ\-5m k I*揱ZS)Ӈk WB \JfwJ<=^>6]o4DlHbP}3m Iԯ_O wmliklL0_.^G7=g9_3"_+O]@RY ռiL-eW}P}/{'u2Oܻ`)󶢞<^i KhA]BY[Z>?2i}r mm}+LˮK[2>Zw g=2"Tu&bF|t~>-pXRGP}wb9 21-d/+`,D'?wW?ω 8'ߒbb>/To1a?_3?wݯ]kgv˗C#Eyx7Jv#P-5P灗5G:䈩yFr1 :cB]e@:Ҝ`5b@̎33Y(a2+X\'rx|38eW|D-!%ѽ @I<rPq;:L3_ u 0jS% jjӟKN7&^ZFz.'[(@b-I^K'1=pGFVj5B &t$q^F|>ptdW^Kbq=v7v_=Ekbx&AzSsgaarKovm|39mf"Qo1d2ԧ2j>0wssϹ#䱗JbqB݊75'{|}kyuqrmSaH xs8?O5fC̛2}oF1ySX"|~ErB,d݅$ہÇpɑ;YυY& O6bJ𧸃ju1P=Ҵe=ɿ]!o-a~=D=ڋ< \k?;<7Υ- z-<aԳo9F"C |Ig+ Q?mQOV KD;*=`kc,299b2{`ěRjg4؁Z|/sr{Ų 0yl跠" /^$awX\vd.C3uX5bԏ?l.z{wPY~cUr7ji:α2+UOODJ8`T\@ 7MTa:(vWQQM>X*,e]2v'##ٶxi7"0 3}9;i E:' ~!QʚLH t-|PiC"(ݗgo^7Gfr@QAj&477Xq k^ nnjJU5hDm>Z@$BY n}=MM' {L#%=}4ȏT""8Wgk6oެ!a79+ۛՑVgrdhu90hrґզEEr22Bg\,n_ 9K{q]"M|ݽ췖5{|2PyO7AVW!U3'Ͽ:ph(q-ˆ)6*@h[9::H`0(((V-weȍl qφ7,2`!P0w FG [LcCqSK~B@M]:$>r,rZ[Og}/7C4n jLYw٬l~(t^$ql 7ax^&'+y<VR"7 :3b  S B;wW1:/+01SEu/ip'}CJ&@AA!cv9Ҁ?Էoh+9Y))~jl<&A FVXw+W e 6xY^3kf/?t|~As5XU̇ʐe+\c&:BQ'-9A/KɺjIڭo {ƄY!GǶJloO3lbMƒen+'&/ ktp'׃ t9Ѷ 1;Ib!~De d:3[Zxh\upSPȠc }MWlkXknnv?&:!q9hsMۣ A DIr 3BLE2^ )@[@x6:$z!ߧa~5] s wRZ܅Vkx-F?4cdRؔXk+S K^""X4dGrӅ#ɒh.cў cx"#;GCS{/'zb[+ٱqכ-ZK+q$AĀZH=OeX=tPj4\9M_NL{Pwj{S*Of=(&8CsN/Z/MgVmirEѵ5aREr$;뢎_?ߝ02?:IvTBny(6DE &9=1PzO:ȝ Uv ~o)r%<$sTH;:<3U5_qz:8[yˣϷCVR6}*'BƘ[&yd}XZ<]SiH^Sűo-yGce]2,0 e%5|:~&şlךߪbY k?r[Ϟ8W*?,"ϬjfoKǙWwz}KxEߣ1"18 f" IUIõߍJ+NV_s{?P^GjAG9cn~.T bݩS[^gʤ.,|3Ϸ k:SkOaPQ 4yyP$"c="@k#)WuA^ne5zZӠ֛0DbtK10Oڸ:ۙG$0X9JhDZd\gMMO~:HIJJնD:C ԕ&=Em #~ݎa|m>&ƺ^|XPڪLޙ)WK;8mmcIH(( q̐T(7'Dϝc6rz}2܈p!pKٲ= (]7\]q9cs#=*zھMIq));ggj-KeZ4^6,:YƤz}NE"?ʸIPvS.'Io%űRoK]~*xK^||m.(K/@e;[9ٕ&OFȤyU~y")x43!dOBYscNNf$/d7=}uY\K0o^Q@/{~в[g16W¸%bdQ.<ϝhYc]biDwwOA2$=O Y=>A]C}QJv ')'6- n;ñѣGrzΜ9Ã^E݁ӣw/nJ_SB?o f $` Fժ5هrb>pg[GǹqQ̤ѯI1!m<36nԾAY$zF͆4:5Il/vW % Wڟh{xqM?M@jVVVGFawոB׹L[lw5"$@Y 3o1)0Ք8[>P__|bokV^}4'AH9I~^^^6s HXPPКWLl dE$rT$0󋋉kETKQG!1܃6,-bl)}MGfow|wUc7eY@@ZH::7Sg  \ A߻ir mw-JEvRyDD)@ p,mnqv |ȨW斈'&]l%uT:˾~6bQ)>;+=Tdie1Zh%H*cшﻉ)Ac1djx!e5[~_~BCp"p;ksh,5` ^~da kH*g:n} z፭O!Y>ԞGH,<^*Tia~q&)Q{S<[@ʟˎ#Ɲ0  k5b~p+d-;wP׈vNo;a WbUvy[A~Xo}4v3BxD@.?G^K DaGx1HKJJi>E|x;91cť`dS=Tb@_ 5([*3qd~WA B؈Smch׺V2\cc#ea!A-i?Ë18Yr?]ryy&%8˧JaIrm_c6gnM6AKAVQ666BEafz^aپo-"jxЭfĽ-Ӣ oZ$ϯ<.+{  ...VV)IIp_!n|j-{Lο<\Lg J[ђ522TIVbqJUUx[Fi"Fje  q}yD=`e˖J RUkX:đ=i"sC'|y%R{ _.`r;g!~*oR{']GZaI]VnI*-Y*JY̾mVETTSm<b< V()8f֒k@"퀢5۽ _OmN!f"P `}37GFF(έ|oGo.V0 YRs,}ľVRt%L3Uk#׊P;Ec/_nfc:g ')4!?%?k~d:ٹP$N)@NDScZBY\s+hbQ>5x!< RI.+zb<ݑ}ŷjI@0Ey1`N/{I@ Cd&+tw }y$.^fp#w(F(f&ĉE>kYlf!c T mD@/8 Ѝ#pbb/6UDzrdr: qwtvFFFjQСCm=?3@ y#w)8wwH+(ʲåֱO}}FPnWT6~>pPR8;zxxȯyo6DlT/os*IS]]]Ή~Wj\D$RJgQ'zc2lp2yqʍf->66H… .=+FWܿggKWWfoEPL\&\ۅ\"i? TiU_LX"_5K3w uifsT56x^v[];b3sc)0yv}$:IaG2{^CլŬVRpI&iʁ$%k??s]9fyOTZ yPn _~Rt5P"W+@ T|  u=|1 ]w1|u.v6V2ld\b1=)}q[p#o5MNr&|/r-L>{&5n*VT !.Td((KDY!!V0 !0B*%$$ a$仟眞;?j也}='<-O޾}[; tgDX2Te]25.0ؑ^IQx%d*SY=LL{^^,C~w,zY"od @]g%п Jmggjq;R˗C[*F6L לK_}ݸTe ͻ E=x)B"S*Nj`瘏Wシ=oS8 H_?Z**{(jh?}:4?#ϳAʾxp)RuK|Ö"Nah j:jJc?;dxP,QT4ݗoXZ:a޴CIPq3b Gc 7ZHTEl8hLkWF˻- fNMu9ѝ|ؼ5~ﮘ4d+#+1|̍.KkbAF6ntOi8KZ>.ɱRj([oe˄1E@QJAbnso0!l%_>VW 9 +RZ\5\,BWsz0,{,(8Î-P]F CݪʜpmмQ^ysVB8Uf4tЇί?.9eMh۝9O(q4e"x%JKΛEˆd 0kH&=XB|I{ ssaZeLHJ";x;3C7/8S@@,?9Yq]t E9`hT={2cx犊{jZbs/ymL7˟i*ºLp2Vۏd m7x]=C3([iaWOF%ѰI1˒iB&x32|D(m<}hyWׇz"{9᝱{u55ւeeK?5zK>Ÿ*HJ0AٽJY5 ;,3ܸȽrBNa.ND9`ՓtJֽwם8j8.fV#pZ:$`4?S]r\XƂXf;`"3+#L${ol8/dڵk7DlO pܗˀ nm3O.6{ YI4<$J'yN.54x(̓Z:ؑE+8>17Wxux(ֈJ$Oq P C)MMM9DFT t%}Xbb[VAΠ2Q|0>ߖ_d¢ҚK X잛7C锿-6`3_{Y-Q^KлV](|' my2Y(/'aSVVa]xq_2bb,mtql9bh8u%f&z-UB>SĽk1$wruSZ9Hح[5H),_ '\=]k2.?s=&FD| L0!YZ[HDiMt9>hY 02@Q¢E@q?ÈTNq|4uk] 7 N]%=deub2YϿÅ 7.u9QN\ȣ7 >j Y{`M4x9qY['^xє.X^5寜V UԾ"j MIp8p ^kYN$+L<BqPSTQ6)R];-3H;cĴĤ#듴}Aw85$$]!qKòqU2R2쭈k5Eĵ!ZU֦G hA?Ϯ7gD!߶u#sL4AStもH7__Bz򐞜<7mtm+_$tꌶSVIlf/{ {IknkI?RHa[K۠"wb@ZZzG:$tg(}7,zA) L(l5h^>ॄިեp3/_ RYIU)Wv gJ]9ohOt$Yz _񖥴m$_J>Lf9\B$l] m[z=:流#ODShl"%)r3Qmc#6}Ҳ>JA87ـ\>J{Wb}qY\*Hr-HZyB[@-zyUlWLH%Nl6h$f'Ɲ:A) 5iHN,t m)]༭E[%O/ܩf'X *v;&p!uv/0gk}2F=lM ZAH֞)!7vz;bj׫(uAG6jgW{שhFR{;Hb#lz[=j rSwEt+yϫ.S<1{ T[&/o{j+A,47:Hjyk.b^fSݻK;Hw$f:!} d7)l/e y=0a$`([K41aqJ [2ċN)6ݫ0܀$[ 8/4%{-UѡK ]i=u Gŝ#pb>Phy]2"Ff_Քu%"'weMOٕ 2.*{^ R"mOSNDӨW}ù槚[CeHY+Qn*~cʽJi 353 <;K?]φB?.^dX VLRn(J}O59P4N)H{ /np\Q-o±ې1F\C4 8Pڵ+@J~PKF 9|A: #iB=֓OF0#yfrsYLHH`m޽{or{J$/LΉ*]̟nO瞭.@'z`StF.6'q~$&jN_K->-gUC|zr &5R0 2ϲ>x~%ff#5LT]8Npnx9ԬI@t8f/Typ,'qG]\U,IÁwpnnlllǶAU cѢE8^Bdʇ@J**uuul/t3sXpDC]]bbuuCȺCsrtvAwp=}hZsFFAߵ"|lASVPdޢ%_f)8LuA.??p*&Lb0~$\<}zGn\EOƒW*-d5(G;/R):I{h"AVF'Ӓu~r|tCԔkoGFw 35 {18Erʡ7;o{@*y޾{tibrPF،Vs*.xXR^!nQxڡN&KX R/1>HZͤ" vZ+J?l╅IS&~I*lCED@W566FH)Se~wPJK7j"sfL,d:bpp阘,Cg-άѝ*:~rٶ/=jȩ GeSNSQ(^e-%h<,g&z]w@\ |ɖx;R^95$DsB{:)oxVKZ}{ϟ=˘ jaGT(2Iqq^gc`i99А>#if٩=7N[X:y?M=;8G֜xva EcmN6 ʐ=E+΂7M2 yXd:]ы֛[L ;n?"C&f.8j@&ǎY6ylٳ}w-2 6)Yy}u&GF=SQU أ {CsKJJ8HÒo27G:f(*+11))ZHnEhƗ}6}ݪm8)hO "ġs xu˾$\RO>ú\Lҳ0oHo\n[,s b;|55@Oo%%V=,fޝ߉"|H!kdT0/e3h3;R+"Yl:+Z9KYO(jUE}\!Z?~weI-H`8 \+I pK9|pdd $=˫e`AZm/x躁1䠹Wsr Z*1&pj>߃$.w;}c?Ɠ*qE{{{?oh P]5HBħ0o@6dff^v "]nxahcmQ4 Є\Sӽ*Nj|0>Cx%FA`bv[bB &B.[i}4_f PyLUlAݽ?gT+v&#H˪_n,{PKH-J6;PY0ăn2HXdd${ x͍+Q~M7snA7zfz/S?;m7d,}O5b_}6t}#%7UpIg1q8\oA,P?u( u#%/wYHJ'gUTECK3#FF(|J= S#xPO6G&.Bٳy?#(fTqKLBh-cx᳡JN-hTH f(xhm Ѣfhj5; %VhgN 6v`T` =_!3恷w MWǏolٲ(k6iT@pXg\&7 _tIA5yE.`Mo˲ޢݫ:'Bجb4aG$ &~ ʄzYZNSS@ cDcKPWSqxk@@@?`Bk]~!#iK!{3p̎՘@Kz0me+gW-'cX|(3w.mofZT[ W76$.! ?('<aq4hQыDU^s0dl:O)?zb}Px ?Q?Ns-%B s&ɟ5M3ܶ:[BlWu7i^i8JR oa%֌Bc,]!]N o) cornk[8.K #N zeQ <Bn" tϰ{N}EnrMN^>5,vǟnc0Jb15shƍջ|^^0}أ D[IIe[c\|.A@xDH9QA"a|֏WV|b~o?B M,mBmMs|NRYKtZ848Hqc.H~2YR1sJ`[˗/ӣwR^wQ_F%%\F\$вdgrZjĴx˗/{;+F/mZAo ^ 'Φ5.`fGV|vD,PE ?uUI[4UEMϟq_uEMս}= \dҿ +e v8g?06ΰoIyudCA=AXIj79"͟J0`g>cxQ-٧9knnxYwh|5+98?Q^ mJ5^Rk2W)=_^wRkfZ/ãT{쾚˞7-,hX1J&2Ѳ/אַ:O 5Ѽׯx|SGce!&WI[3N;7a]sjpwuGeyn_b)|M- 0P]!{$of.T́Ҷu ㏮X7L=҆3CMzIrL$%>;)Ъpqqu[Ulb&vӊY'2u0; m"'޽ tUEmb6zc.B o݊z<?@Tꬋ/t&W^Y)f#5˫_?qJG]eS^tU18w璊G?&xȾGnNlf n3,aV,[/_h i$覶rl[\mc M&tJQ"0vM*\ȋ%Q5|8EFq,|06+%*L';GU07E?Ņd œ-9v{Z+Źm8/S,כ+_tsIu0wh%ln["V Rd3Fym](| xˮ*!aYdPx/[Oɣ/#;׭S= q`'.oB諩) 5/L,Uo^Z)A%51 ;wDܱ㰼C[f[ʦz΃zp[k$.32j ºCj' 2ʾѽ4䉀P[/MTn }g;$d }CC^0 \ +kk70F} ayLTv+._DS>iTOWοh{5E8D9*4fEDGG%1 A$&pz:dv/n;I|q722괤!D$y<߮lE)((j\{>h4KKn]F[-47K1EYu_2=x6]^^>37Pzs&*3ܶ7DTV?w[OwHH(%n"ӽ,Fs_{ɴEmW_w%ט.; ӧgoыz)2(=BaHp#K8󗚎"hതv"@pAVG8!6773 4ٹ+[=0;9"O$`ʲ AlqP -|y)w`%>3 MPK/GcR܈_ ޖf8uԬ?$L#^ &ãݙS̲*Z=v!Xs hy24aSnh-SA]4gVv~P^bÀmY`G.{cFDx}wIh,w–.~3lSbccMaK`S z5n?]ǚ^ ޚE [}l(hQ{FLAj&Zג.{LG'GQebOAy[QmJS3B>h'}vJKꜷ}-0'cMtYa9y甸isFHzv?/xy@⳯xZ0IAt:vBbWR.u|U}IرPI"W<ǕSдG_I€P JiP)} e!##^%[d\1\G<4.Qx+oaOO*K$*}=`F ^L-ORڤ`0***j^OC@$'Mиn:} aFLX'jѻah 4&|z^cMM JS$mT˖u5DZ0[0؇W툺JtO/r$ u1D\}(3$b.ġM0_pk{9Wc"uϸ'*ܗ<{z?t*m3Mԇ Şnޛzs/vlzh މa< V=0QU=6H7p}G6=-{!<;ǂ$5)Q葞FkKCYGނה'݃5SGe_GÐ?$048865:IHlkk.ݍ8O/~ʏ\|֝zͼYBn1MlVb^Ir O& b.O˺>9T}}=Ĕ$| u=e |,[ *s7Kv &;?1aW߃rUF՗†bЇϟuBLL!Tɭ)10:h:ՅͰ~۶s[ǜnx;,~{Ṿ"HΏ<ؑ@ z}PW{}{F~J (jαNꪇy4~D|[._7J·"Ҿ_ϯD|v_!8:EQR/LN#sx"TMPV`):q }{+roLفfmmmf!A h8bOWgʊ71{סk!T$Ty+<&[@Kzx#9@(-.EAc<nk=-صw߿Գ~ m^qҵLIIأ۴Yqȯ#^%ÁRSS ORY[y*K~^”QiMwxA^Nb,i`rvj9F@݋Ϣ;=KO))c2+YS%PAꬺciZ=1IWkCk9(VW/lLo_wB4VAAe,HҢ!L!M %a~w0K]uHءk׮%',ZK.{fYӻs޽ڥV5[w rR,aҫ9mL|㣞D d/K?ۿ.$~ 0' SߊX%A+gcimmm?{KTʜi✝KYEŦhx<):22K@~d(D90iaDLN *R:Ҩ6&$gL zK*C&k`Pdser SU;42" QD8p{;4QktuupAnIs4 nnJ *=--,O-7iidi Md2y ]"HM9:D8;; YW|[,؂[~Ҁތ6Đ8/IփBeETMp9Ndmikm)Bqֲr_ϵrl`:gJ9'e9YYY mF+B ޏkEn}<ݬ\t:.I9{yE8)}Z u*?1.FD:@AS'ρh&?d2B 18#^,h޽# TEOrׯ-I%C-SRw)lt?c%-,hi!khh`s1޳8Q#©Զ]d]y!g D4:W42F>Jj"P%l Wk]8ɥ-.wad.e$Rɓױ 7fvyt,^bm5}d@׋mMEt3GGWW3@$1`:gzD hd_1m6r1Fna4R FxLY_0M>*y$c5,kg.JYY֋xfDLW-X نurJJ\A9 ^Zy]]H BT7JVŜ63\@2L K]0])yyxILd˘*]FUG9Qǀ_uF`AߵX؝=wtX̫);ͳ1#$]cwnKK+m9K_&@54<+bH?7 !сiEyOnc͸oPy1)7LC"h]CipfGIn5W3sr[iZ}B h ޱ27:93\j=:'<$v QTODq0Rpm sܳQRG@Rc]˝o-ј1$%Ҙs:>Wipe@x+<_ߗ&`z1-h{>Bڂ6H&.g]~w7 *k+qsϞ=Z ×V{R"D9 ͢W!}wz2KJHX&=2S k4خ7lsxƳsJsۖipױ˃,F/z&j&coAi] OcA. ~q/^b@oj_^N܂}Ʋ~=;odCx )ObK,II`obCk+(Ih3.eoCts W9~+*(~׿Qo,5׿Ww?ݭS?+ op|ު4@vm<& y2ERj?a5%ߤK~/vg<3WW*W+qk8wY72:P4N__v090Yx\\wM~Åedܖ|@oZeSm)Z}"/P6.fYn.RW) O77hȯe~{]\k_qWuW3vS|w”wc~&HLKoj Ux-gTLjLZ.;G>k$羇a#d]kuA$F]x)Q+*;3wg2>z<1<".zyE d8wI2e|p,ekg9«__9H:De :x-4u|,\RȮU#&lVILtnCkh0*`Onve!&B Lb#"GJq8н:tcj layy;md_>L~hѝQI?=bc|PK*JC VaJ1\vC=WPD|r`e'$kճa̧3l6CzJJ?pnŮ߃zyr)=sh߽Ȕ_Bt*"7JzG#|) i^dԍݲɒI$<^/~A*\wu:~<k60o`Bz\FjI.--5xnc%jh E6N-kg ԸÁB=E\ee%4U L --uk٭;U2m=D,Lhaϰx$!G 6s''| Q 'FmLdyw*YU:H-m]NX 7ԠBXCN͙/-V ̟>R=Z6*9o zĞ!7CXkcin#j4X`G$o@*x vr ,wv5 $z⢌Rέmk $+T -Ѩ2Wp%rG{j{`;% =X˽XSקEvQQ}Y{A3r,|+Iccf 9#Z)&6W7,To"U;m'WdQps~2 [;e '_8,9k߉Q%fKʟĺ khGwʟ+uC[ڵÔi;̎´nh+` n V}r57B]zz?6<[*ڄވ6dX7dI5%GlOv D;hv|fm1g i{Ԥkg5ԚbGЙ˧>kcx ^]m}ZDx2]+]وX y >5Ӆ:w?B$ 0"~~~3XPhŮ!-ZSQ.0XlfvWcT?C/ M'A{n@/ !_l@Kf`І%D du[^  |o%w$3n(͆vf]j0n9%pWJQSR2>~&dzn%m T;X89_opnsJr/lb&O$ջ|WrCGGu6f/ ѽWnt_T%^Y;DήZ,ټy db -aI,gÂ?NW&.3H+pu]&W`Gč$u~jF\Z>_Ӣ R=rd*R.Zx:,_n3jooY )8YO_WR%s$g\p!J%j^ *%{,#x$LSu4rCu(deKt%\H+)jm%50PMK MmWKkytHPcn+G;hD##n, HtdL tthi>."WBy=@ x/;&CVs3x]lބfA:={贜@p嬛r=٥ח^]Bx‹V[agE5uvXN_Җ̣_Ȳq FffN1XC|I&vGvq\':Av&"- }BI :=kDG"Oaq"SښX_ ^=l|Mk/%uŨ֎Ve3WWDkV?w e}}ff+8eMhaՕLtTlxQY%oKA~_Q:@m@M+0.X7"~dٰ+8r@/cD]|Mf'Y;[;~^9嫻l30q6AAĢW==?w74? r4KUyY7/_^oN<5e5lN|}AvDO 'TdފUg@+e7iGzj#]f =&;^pOn,cesljWuϹya(v^H >J}]ݲ%垃2ؾXr3. c6dǺ?ayk>.Kb_s+< O%2aydwvESEu2rb[}̻;Gpo|}unWWap H);k0(O"H;;;0 'l$kETʾG%@ 8ޚ6N=t'/,aVu ~;X^R|Kessm|PC ''' )%%%Ru|jȓP5eegٙWMw"5Àb uօ#waq'Hx q؋29&DX9ۦ%p/O9aj](f233Yߴ100tM-$\[Z6vjl>W@ 7<X>XkiSa '_c|J=Ce' N66T=Y|m;@ lzK*o|C^eLgφ~PtvS k F>͇rn—muu)e2-UGxd@PH몠j44 b7*%'wG ݏYV lDB eTA> bicLmoI񜔔}*tstP!ȎollMꑡ:A)iit5VDOǓS{888 ),.Q kɕ&!'og:?O=ȓ8/eky.& sK4!$3mPKsWq@@OX .eW]^^- nOjft`zkK-Vr<o5| @3tGbK7{o΋2Y_o@o`xͥ}0muu50>~ @gYEV RQV>ғzqldd$oO046ZlO'4OUYKCQ/,&PDB@#?~bz3W`]`vv:Qa%\9!Ӱے[$.Z:ALYyR౑N e2y_-p 9l{Byp7gq4j W}Y~Mo`w]!t߳"؅2KaK-WJP :Mv<VbO-9J; i/dMZ:D[ROSO?5zPWW=64n \J<2B #;\nn.`~êDIX>m_76;k)ĺF`bbR-}KsQ3KZ_P_ec_صl! MO-`[%UM󦾶KMQ1l@Hvm藦k-'א{RW}|lntt ~ Tƃp~֭@7l-,V8;Ge-'rqqmH}vf:k}?O:iˏҸ>IqU_Y9 %^g>%*ǦZh;OO^_;6a-hҝ^4UMUM\G7\R-I71B*.nT zA{Հ JZZj6/%&ڍhuƖdsE S9&nDsζ6QDZkӃlYZYI?611EFESE<JXPY <ՠs޽UK*w|F169yq*oLe#k)P/pi()G~$@3Eĩo4Rkw#)EZ$Ǿ؎o*_&|vцx9'<:diw(.n C:tl7FA,pO@ ???<=FR6=J+Kv"--f=sK>b$#Oـ%;q0\cs$ABeubX%ʊMCBk?5u*kU]L=-Cu/OPciM:[څb^Iod*ZsO۷J,"Ki%畕8l0OV}gvuyKӚ?<Żʛztt _3I$m* Vo"K3-8}*LgP/ CfL?"Թ kE2@.0 OX֧.^s[RSf'B=7'?v%y#3[ʷ Loal Kj@ CwS~bœ0Oz~|^=3]D΋@4uC|"=c㎌%=PI4b.S3?Cw|2M^ۇ_s7$GxwnD2?EEDrf kz_Ijjp*jjЪ\QeR0 \/Z빸@YuF ~ >o)5[wBu{o8&<@q{bA~>[zZ[FZ)ͤb=0F^Hr^7D~~moa]m۶ \6Txd 4o'#sxuRQ01ziؗЃ+=kb 4"//I^N 1&^9y(5č|:)rkGp8N"1tk:4V)|o$_pӨ|%֊Sy8.I4+t~w`$ P!=>WO>N#R8/SWľP&IP^b!*)쿁a$0*2ćܡ[p1B]g:qC5F܌^%ǥ_/YtV%YT7gQIK*9&+-&Pp}5SIrxo  fRĝFwx%=Ap+#ubOn<|ir>Ub(:I+5H8)CNy}; fC4dZ҅8Mȶp"8 v/"ď?]\q  ݷ))jZߞl;,N lړζ!I>/](8WPn$sz\sU챂)oR斦%~A=0GPzI - MFMpSd3V +VRTUܷyp_~;<SeN{f+Or<ݱQƸEOVmYo@ zvh&҂@ɥkgl@tЅ,e)UޖOXY.}D–AHϬpA= E6HʲW-7dfǙ#ʙ_k/Zyʋ}Lh &ylu'Pwm8F`ཀ1EZQF Ó -]Q2yfA]<#PPyv5!uʤ>q[fzBY`"1Sx P 1 ٲNLx +ĩoA,:`U?\rUyMMBb-:'meeZOvn2jF<x?{xVg׊V^~toP1i3+:S_6*ft1FGisI=zkM7\Y[h"[ԇI&lz,9Ƞ60}VH$Ftci\8.lt>Lԛ'uJ"_Zc 1l-ѿ]4{ʋmTHe~C+lFdӑ:s$l+~I#bA}nliAC0{`7o(BЀ;E6&=9gz!|ѤVbK EX SثwRtEkPifk1&mI+ w%od1<[Z-E”A 1J}쳉}rC@ tճUd&e 5kRyͨ`x>g?xQhN5q>xLL]`i2vOP@S|C $~]@9nEx.l^nؐ'@ 0ښo&̒yuyVg`?Yr0e{D& 9!]ǴjL6/2$}́@Bt 7K $$m҅^?Aj_8f6'^2l蘂zk_/;wix/j7 ggZ>dֻ3L_kD jsAgw=똈W!|F#U!,yQP3: O5FL%5ŝ>?vun9I{T5LχP QOiO1|޹caGuqZєv3n}69yd5ʉDl{{{!h֏SRzM}y_zs,h{ RZ)uT0@/vi_J wF7>S[_H+)ti(Z; \ UTX0Fx%3rs j2w#[S͎Mc0BQ#&111A 0D)4VKc{{p:p_lQC>{}un֙=3[.m.BwMwr5wrj Z?#ፋ*8< "ZȉRyн2WJB H31%h3bV:ef"q̾I|3b͉\k~憴ڦ'+U=)~Z֞ij4ϢWJ( ~*SGĚ@#bEN H8oeGD2D+Ma,vH] bsP]_W,js _>YoT- J0C,_)6;h( Ʒ~]062Ohس\ѢX&]R=#*2(CA46, ,0wB[hTrii@`(2@@GaDm RzB3qQOg$#q0->rqիyN6gfkYr"GT}_X^)` ϋ9N\kvdFn Zf\'t "W=s֓? R[iw$\fzHx- çIJ`54fSA#++K?$4TvTO X!xi2ϵq ;G xG%PWHRrmr3GkY]]ƵD:ր }90 Pu3T =@ɮtMȲsƦ ĝm}d3^ccZ\]l(N`2($scK քӪr+xASsرQ;}\ t>4+[kߟk?AW?[b!N>NYaN^N_Yrn:E9K^))_DO3n .k >>UuƳ50Ы )mVwvAӰPCΆȓ OJ7eNNNuUe~>8JJYt_iJف.~$D!M]Ehyqq\S+K?~liy]=XQQOws&xII'}\ :!r~~22&EQŨo&OLK<ָfOAlB¡1'Z[Zt- kL2-1g_R޶h|V<#)^>\{(aUCZNG3Rpr?#\x>B[HuYY~IP`5O[>@L\i[2"$XƊ$q]O+/X:Z4OGM|&wb=WoUHR2*)zYvOaiH/3H|VۜU|"sHί.z )eDsD]O#{钖EbZ0[Ekv:=N?HONL4;2HD Z)EqWF_88wаx9^1omiiy.wx^^MX+&1qt6UFQyJpz{[s]# "[CSVHg[ZWg 8N7)Ɨ& e>'Ν;g\CaRwE5's mc˵ّ7]yG\X|Aɿ[[be1/X_HE[&*^YmRׇT-ɇ۾޷}ѭoU}5ƏP6ʆpO5]5$dWΤ&s\=T U{x =[_Pҥ~;ͻ_圜,r;SHϖm7DSH[r{~Ϫ͛"O,,T/r}%7ŲG >Υ/J f}lV. (A|;ꠥ_㷺+l (L`Cz5l!6/%S+-V )ƇX^j r|i,~}Y>}#bUJ`Sp=|tb0fR ϲvR6o^rhK\\+􇨎}6{ Q-/k|{$S6r={m4/.J:+ ^`fGplٳC 5 Z}v pJ EAΝ;C `w#0ZY&i豈y ӿ͊?i\}IBڟZ#8~II+= Ac PvaoS߽E] uch];SۇnkzSW==J9TSU{c]rnUԀR)ݰ8ӣrBOAPaJрw$+` Yy 3_gi7;12&O/&D$v'LR3;|{hu8!X9$5KM8>heeH'KǬl۵)A먳[@-Qgϔ]=3 /0ʵ&Pkn?cnC)N|3kX'8[|r]qyU"" kl_|+A@_WWLh|9p_U.g3F'wz. XČm-ww\fRFmv|b!~֬c45]D؋A,PQ[PlwwK(2Ŀi4SWP _oG#hIcՙ_O_K8ű^C<㤂xwz2r=(J>ĘCM@D|NH~Ô!=8t77o`ݰRзT *Z; U!Ys{h8ȧoNy)65Ecb_ub8_n80=y߼y_Ne%;rKő8[Xs'# h>ilX,H+@ Q )ҷ('%LKI1ҭlsGңM^R//88|.6\ah2:DrLUkLR1ܵ]Ƶx @/ann_4o0T)_etj=Oio{{3IM$T5 P0l7.N.w+u`5U-kڳYF6KhCT>6/8:܌TtzaI6\ȹi{ +qt1 dxI~_>F\=CzI)[b:,FhYrhm4!E Z?}}qJG-'BJP7 ]g~+[AqaA j2LԴr֔x^{1c/zvGrFj~KAȩ<01+sd\Ei8䒻FxwݑZ.ޖ:yx{%hUk~W() d+^ 0 TB)-D lii,*vH ?Md▲ZkZ̠TY>iDd =TVV>5_BBHO {i0Ɇ#[[gWۘ!3~!Jh߭&pjHO! h=?[h9z qCk[Y(P"= ٣@OA-Rx:~^~5{ٴ {Iy{V6>2IuʧV@ ~j/moPҀt-ąNNDn;k֎jOOX[,|ī-~uwK2 +@ȆRgM| D6q㎋ҿ Fw{@': ,훟f`& L TO ^E"^N\gn=6'PBӅ]~‚h2,M~o4seG6Q,HAU j %thWCT_H-rCL`_}4 kX 8R{&>/?kˉ6[۶TBEEjbb&\.cώ8?9(e҂_"㚮` 7mm\_%$Z7΢zĀ1JILrRT8Y12[Jffz`i(X~7ww/'•u~ p7/mfOJy ~>@&!~ɴyG.|N#0.`dr"(azh+g}rͤ% pS;bޒ%Pr34Pu8O$ߛ Ia^Dx٘hN%^P:*z ۧc2Y eC?{X$>Uqk}Ϋ`)bK T4Ŏ{_&=8wMNVdr(jTtB c^ЪI q}3mIA@*u A($04;Xͣ_(m9IpzZ}>~Һ+Ⱥwv^Bc,пEۆ Jc|OyxH;n6h֯F^ˉ9ZpaWaD  A.<:汜Di@pN"^se9@ qGYL2W(cNBOAmX#i}^ TO|i4#`& 5ꭑ=m_ZZʣW𸢩險*@a+--i^6&p_Ɛ$^BR-:mn?4w|{).vM7yvDm " q8cjSЎ.7'cԫB3ȕx;7}8{ĝ( %{G]쑄;C$pO9B,gڏ!k(~ĜtzgKLޠD//ښ5x[ttp*zsJ S—/ODsm q?^M)r#Z/ ح;7 H khj[zR5eo<#%{X& g~^?5;?z&7OósgF'V0[>864G" -]P7Bhum=8hq97rugҲ|{Gdg.gΙF:윟?'fF g"\dzp6Nowyﺞ$]zaĒD3BgSFO^%VjHb@U<* ptxLj虶OOZ3{XX$Wj=F>Qx(fs_ pq2VE즠(GzRX-ǗoE5MJј")(3Mh[X!x!&&w}}\}ot^B_^!\=n/GCXrOeLe|o Xv˄EQ(/AvP!.×f,2aQDD!E|<{[`{)ޝ*)sȟ(2lp7{~Ge0? 쿭 ^6?JON@݁U9O)bfk? yӑK .yMY'2w(Bh/cΙuًNe*9-eXNZa9+ٶW+M`H8-UܷyhŨHp__w9@'aҌv,Dkʼekc͏󖖖%/DBL }Q2q[7tuKAk2* a>^[KKe[[($f"~K >p:RXc*&&X~}S 2vVu7͛TKKnb誁Q{u]rElY@,pUZjgԫEtzv4)hV'‚c.]NC sԹitfoq &>qv % =59`GC>01qh|[}szgbvM#WiN36 +2 ysӟ>!|*D.=|j,?zx"ifj)ue/t9L9[rX:6 st-ͯK3(ňN~*/W6 |̹gR>7iH+7 芛(>@ҡ{&J^ȤTi;zeA$'RJA~/|<*puKj:7{8:R|V^]CW*l}=zM`^CQQ li򲮱P|S>\w@x/}2*{o(N3Tʛ*7Fc>)j;9$+XRPa;R(fD@p8B,>2O+|OLlلUD:м)~< 'i>l٘(îݭX\!eV g趍!m)Qe 4'gj%ZZHAN?؏T* w* _=H#>dxf@e9U7C*rV>:9U/d|HCসd'>]:3Gh RSxCuU+gs/ 72uCø-9[ПŐCý^uLO~u] r]_=W~w219ذ)FJ}^`@_S^:muT1Ca?#N/'J *'g[Ɯr}@bW"aaw>8Z? oo?g״` XݹGntZ@z_fV) t+\L}/yHcc02HP5hr@?6!}c x׸ڄwC" YwD& vS4o}y*^E5b1 ĄW9/^iIZ^zjf~'+utJbVuXIϓ$Y编|3owZQEqiÕ~4馬ބ('w]. ZP;Q$V 0B_R]_f9]1͇${5s1x,'R.k>WܹTPNvjW)xvʭ&&;ggg744@ƢZZZTli/"pȆf>> 7b=2??z BV5 kC9 $>2n;.-prr& ܦ2 G9n_d}*LCѷo_6n-(5w`y&Mɨmmjcz{*{FNy-r1:O|^HW,/h5 _[|*Ctؠ J۲qi ZWQYX557JF[j`4Nܺu>nuՌ y0a?N& ;*TAGCܩwa=b43AvzcFlסxx f#0q^%%;l:1\b4^u8r?xdhz[8rpm]V+:ME>qyWLQ)p֗ lBohiuOOk*MĂǂYށ@nx@ Z,`Ƣbfz<v ˜w iБuA) KnAF@Dޜc04ejcϼ|D@k"@_j/eEl}}iX<=Gn/vHT١s)F;|(H x*?p(ّ]M\ #"ݽKahO=1~)'?C6tW#w^Oc{/4.q}WҲɼBS׫ͯ޸qH@sXW ?vXCWX挼ffLˮ`mMndgQ^>7ctq!QNCp&aB.?&WCX/Y`#8>C'3Bu ^AphKwk[<<=32Zx%%%I⭙Zۗv䶖Ljj# j_>g vՖ] h.̢"υ }tS8R.?1sDCL` ўxϭ:992~kAް莁6?O7R/ 0v0I*Re[CU(1< :ȭ;S]JSp.ޤpa[me}Ʀa(S );qK[ۥZZRn+7:;]d)Kk^ kY;w;Wγ^<ã.EF-R{|!\sӕPOh#кSM͡wټe2x6'|:Kb40֔XعcUN+Z觰?y8VsPXѱՑx I`=d }yL)+(jVqsNxœI8$w&=i?*ye6$> ]B__BFA/ғI)r\BB"UXf&Wvv3M8۲V+^i? 3C|ȍo3¨H3i9\O%Gu (\Ãޑ֔Wy:{zn |^lt۠fDEJT׌؞>nY28¡9k㘘 ؽ{܌G{0J0cٌԛm9ReOc'Z|JSu}5m_-_LDmPO9oTA| 2S8xm!ޫ@ =-’ٛ")jJٍ0~~隑%toUsݐ(G77?n6|1,ݢӏ^Z+w^${TƧA)qq[ aZעur,M˗6Y~Z6#C߶2E}1}Vlz|;p@wv)C.N.hf>O͛WE>|py>]SlX/s~PV^J;(E%35Yj"ؙSٖǹ71{Mhc3 <ܼBOKCcZWܷP,(`]YhC`ttD }}X(r]2['/^&D!~gY;~j2\!QuC%i_^))ǑA:l<'x%s:/l>Y~qXڦ>ť"]POJ)~BSS]z7L /v ʇ' WWMlz&sZLQ=icRùRUvX owj(,,\\+uAoffv"ED`\]]]h߱ vhfEdhq.,-[k6 be :kl`]t 6,9\YBQ9YxExKf38ەp=DYjS=c<+`DdhfnDr/3CB0w_7pD 3o4'&$>]8Kkm`[ yl"o /Yƨ?6ӓK;8d=?駬[|Y{``+trŶ8OkUCtݟ^q]D*.oNJϽsNgxneNKG^^VVQ,VA@F2 rV-m$_XD>lfљǽY[kT0Gw-<0@û;Ǎ "B(I"@QGiw9DZ)^rKy7lmPhB*6!^Ge.T8jyU"9&V98wo\>+$Z`oXvL B#G_kϻ|=jgsv5OO~&i!5͎ %zWŽ*vv0N/`"\8tp99u~(/;UCq& hEa|r QADOe7!h{)y{]T|t![p^nn.)Jy;oKy}}4OGFFT?*%D\)4 ?ZuKGn9l1.G-9,ɏE3H=|Gt%d9 ~uiq%cb:tĜ؛f?5 +~t%~X1R*11x;"ܾ0CpwX@K7g'q"+)D슊?| l/.z@z?1R "4 fssT/OkҲ۾+F <SvlNp:|F5rUМwvIWۋ3Y_6ȹ/u s8W_*>%ML>/l-_gدBh葏-=|Ӿ:Q#7)HMetVu34D 6Rcԇ$`l?Xm@<4MU6jV a AKNWp$H#P ,9CPc|显$GH9I˫Db\]n,`e7ŏU/c)xڄW@__=vE%ݻ1cX :9q-^~%/Gs7bq=CEEd^TgQ>JM2=@FdP_Kd~dϾes9;ɪ@dHwXcG%p#>YAcdn\7깈Γ uYBOoC:؂?qsWvKTzeTRbsҫ/XŐzn,>q6E;`g[zv2-l(fa!' aN@dTTʡ;qq11{7,/u߂ %q68'O&W.҇ Q>)42Q 255nclNHH"=P\2EލPe#fzhc:aok^?CVM*:KIq-sSUUB0".HT$s|'A/y7 _TҸG*s'b8%;zZ]Mp^(&]͑V>ЙdS_{tO+dy}(csEؘX?^&V,u3[(?q%%%_3nH]J AQ/`]EٰD]wXe'd8~K뉶& 쇎2aПkX`hTPE-bvF\pS"0,T!Q5*j>UIÛO?ɭ3JMc)x4# \ \v/AEE X )_%v[=MYrE @ >Vj/P~vR~Zuc=edySޤgۿL歊aMrcvX/g{ z`ܸ~Wv&?a3s;jcחsMHJo`,[W+O;Ď_9g?m5+Va<3;=c7'"}gդoQ3\ LGO 3֕UxNVGt" Ezr];59񼽄Q3;!mmim 7 &*Vr'555|Fs(:'u:#ͼBBe|z=ps&Kh+UcQLKЦ9J0:zqى9*?F W.NOg6@F`^~_ Л,e^#&P(C0Xd'wvs\Ou9uyB'QVv݅ڕs Cn5$zjv)萉sڧ\&}Dk :Z>e>׮,uÜH.*y8SzgE3/zuɲ׾- \{E+*Au>V_RDqqqZrɌ<>;Jw8'94|㩝A:̭1yyRuBֺYw_@-LLd@svff[ 3Rri{!5Y5 ʨ)!܋#acݓU1L_ 'C1(\% y;FO֙ώB/3IvXgmތWy{;Ws+y\k]B>/Jz"DEzaĎTƨ'Mṱ@[\׫ǖ\M:+ݼv$a3Gfք;r#WqeY>Fn}_Ɇl|[t>C|[qۥӹ,[7La_̻?!Zg KJJ$QY ռ/0~1PH8MP8mbۉ #`"koR`|E6tʷa*52nKغU˲ജ=%2Twe I!fWn{f9Q\Hy>N`d$Eo]ۢ*6W|{5ܕk<*22>zFc25J}dr"?ޝʵ~jFOajRӟpD<]Q`{d0lC/ɔ&D"ZY1K7_"}ĝ߬XZo>X7Yd0Pnc R*mF:QJ%LN#^Yx #F9uaS\z hSy3i'&&F¯QpXX\9uŽ ?A9b~B~Cn=Ž{mڇ_abhEzz 'xکe(`:*rz5^TV5P EfBO,~  cljcpjn*~A?Oqw_HI///'C΄lp9P7Oq e99[gMBòJy3*,C#;Ω>>,;1$r9DUՇ71{8*'ZG5SgIAcvB]u]Y*ue1*A ?v)1܌7!w_}ՏT4p)*)+De ;Nf}T>p^I2:P3~ g;åp|L)-ICnX_@rRuN-rekt¡گXo3Bɐܟc`ڞۘBhq Qΰ஢8V>@`?1וoӝh˲$UbM& :*YXJJyZbNYG_@z"#0b&y G0P5"ndhN-8.^#sfZ*uWrSCwx#bVD x"_GGёJ1P/4*T' vZҽZYYYZWP }Xl{[nEDDP30lJf!и@r$r=28C`x嶢R]kE@cNJ23= o f)U[z__uYIn ^VV%W:ӵWW]\A)/,>|pn 6눛F󺷈T\\[b TGF-lU V;2y M--@c>(6,/-/g*_Ntazf&P` wDT=d\V573mACOQ11zE쀄(;se%%.NNδY%ع3^I '*!r|TMu`:enGw=${3բʚrpgRsV_J=뿻otFC89-x&gi0n[RB#(!*>& gba+ ؆_YYY||l_@xPڦ^ R;n1ITfxxAd 4U-G@:=& Nh_->#|(:OߥkWOz~w5B P=o>!^07/#׿{Dw?"XE{n}a"E?m S?m }(KDD!>G> _$;>_O RQ9!|٭+ v-ڳsE-w_ [ChS־o蟝 ?qߧ@k5Pw8197!(h7'5(lJ_ S5p8kcas^ Vg\fTJ\S=G09q)խ6LUy Xqf6ע>2)~刺z"a# %蓺{)u`4cԝ4H(x%_sY 5/Zyt>صf7|C!ܲvQ=# ?k)=m_DZE1zmd !fp84V+}}dXbESfESX34]̎ Uo9Ẏ`0sȖ(Zʊg |e|m+Vцd折`oq#CsŁf`I5ӳ^jfgUm$L__DW<>^׆l̬&Y?_c#QҜ?'cOmٟ)za+Ԃy T>B LGbljjZ!Ofm S܍/ϟo9:],rGV*ttyR2bmgOݕ=.>{n&097 nq<--ϙ >44,||b =+1M,-ӯJj>>ŧ#u)!m_iN^f mFzi?x`ܽۛh Ԁ5--'4FxZ7FLoR T"ĴU9ހ9:u(^z=˥`AF\0+@If~(\~$܉LF(Oq;k |ہ77¡>YOgf(Զa %#6ԖnlnmŰ5(sTpSLPj_뇳G}2JbFl }g-aoH--Ԫ>XSs86[׭ϖ0:XYir$GYīrƇXL`r&䤤|$ͭ3f"U"ڀ[  $k譆/;<}* L+4OCzzTO[i|tIK3BYWr*ᥖMO$5B[5XbDW c *J-_!y#T"l@ JׁO^\1Q@ʹN0,CF=d-J݋iw783%%gGFr;$T*!] oD<ހ(Jzr%KQ0][G Rj?dӏI"9hU$Z)B9ob݉lbR8&n4NJϸ라T Y-P%%%vvvљ<- (r=lmmoN)&-q-9 XZ\%9I)?0_ޛ_`%||޾c&f@aƾ!<H5"{'¿甄lJ \H`kqxGi$)N"DJRBPyfWᾃ$> Jg,y{C>QQQHEwena[+4H2 ӵը,t|a}+ο6:Ljo{67L@<01+yѪOӎ֣Ո1G/I+Zsm1/vOq% Tk4ׯ_+V CG?<;|WLT4,<|f܂3c(k{Jq"r`j)IqpYL\$ܖfi. (o`OSq g@㰭\ўW.~':`JBA?WUxS _?V<7]44+8^KF<=]]EE{Xv6R5yFuP2q2Vqwve C!ȁ>Q)){q0,Swx&ۊV | |uw 4tjIAaw(wnrk/6aӻ}}Uy%dWY(vMIOsp#jtuuMY0DD@#ؽ¸* FsZqQ0#*: ҡYt5;ݛ8fM[膆W;OW#I`F*|i.Fay2Uq@B)^/lG 4 W ;2Bs7y*<1iGXnޛagSء=805 q67)4Y謊-WgggKK"(+35 ]ps/ŃX :ͰazSObz$ e:F>r ƎWV$I[jAWRQ77НaF--ѣGDݲbGJOj0$_1ڬdFet]`I-<zNNha҂羹x<@Cn"ˣx&﹦4UfxvX"`,({|]]aB~6lz'i;w~oUmy&UE r Ϋg:q|ANp${ǻ&'(/t8-j@z|`wb3gx3uh6 &*&v؞ib;t疦\M+jK(]?)` oN]NRaui(, Z~4.xa.%caVsBrp4jmHr;$s: _%vԾ`o7yyjj#Ӈ=|kKtuuk.tpyM*>҄Hd y 'zB%>˫/`> czP~o{J&j(v5(fAGYXc(qL}o ,\3Amn} Ŋ!/zabbb8qD^'wQd\!yƎ{7c-edq<;Ndx!YNoâ6^/S 16?'wNˠ0S_2⹦Ԕ~ gwVJ(@ P߿kG޸B;kWRYA l dV[u9酠]_zIzpGā7k )2gJL)ʔ)$J{c䍆[\ q_^'a0 H6ꇰ MCzoح2ԭuFR/jNo?vpe:.x }>w¹K-:sĿ|ƒrCLkaYOZ ۨ/ g)[ClAO "]۴|Bo% фI9hQ{X[q%1K\Kpb2hYO =ﲲt0ݾѻ֎ܱ'~\Π`YB?ˏr;ߝ89.WI a3qЈfE*bZ皋NFʤ= tB#Y3._ڼhpΌ&Ś}}qrgggDy2`=e4<ϕ!Vzu8Y^ϱ\wNwHsHiIi"6C}Gf}E|s[q)H`ߘn8֪`"JV,rDJ`! `wM!f:q*oS* 9}j;{_E Ơ╈X֒[:K+SaJQ6wjm]~bD4Rl+8gKh4|= vh՞$$%[$M\Y`@c36EQAQU58IǭقR2z -*#Ŧxl}E&}h68I:p͹{.wKAO M?J@(Ė&&XX4Ď7t5lK̳;bss/łKQ/ f/JWw3'W篡DltqPOh"/̳=@$V~SUJWWZTżܞY0[(kkXQ :1qhTFkqU펧 Gbra¥H2Ez„RRR$>P;y͍^δNc›oEEEPG˱MVϒ)0MM~Ák|D& keL8mtSa8YTWwwƣD P0SAqt-HFiaQ YVZk-{of'' *Rt_~{~1zUa:\Ƣm!EIGoPc&][ov%=o AM #6NN@gdu29X-e3Ϯeb/5ᛦ/Iq>]#,aQWq3}1^s8Cc.w20%`_I¥7/a˨GnYX.7Up-3gF}$wsO2FZvŶu)mKƞ->ls4n{(DſlKn"b?qLox{Ϗ?'s1n(;_ O? UCDgY;< ʼnj8(a{rCcr"![䧃zMu)ȶ&()k_ě*>^2gMI=];03íLB_ *) SLH6F؃D[k^PWvڣGT3{.NMD6y'i2r-r\C]\X %fjjb8/:^SPx>rUzIZGҔ$29iI1pf>ۺ,B8 FPBMK<mcdTB5Ҷ//_@VsRq *-NvseW ŋNIK,L:/05-o7ϪND' x.Nh$!"""%;O`0˧WےRmoOD/efd`T_~k;G6ȼnP~h:kMW99{=gh !E0j]ڝ\ƒ%b;ޙ[|CsDߤSoBHSGDž3+FY)))@@/Ϝ/X7 +gDߨt`E2gȂΗ:u^n1"F3UJf{C);R!CL{G騹8*" o짨G#AA"MSg {JG򺤠5r{t9 CϳEaXU?hfi4[^T]SX$SJeFFYY[O=ykFO- #x1=SDË6V앹"G[zuσ*Gy#Ors[z3l'w VP==\Xø 0_ݝe#d|1]& വ[Lǵ.yOBCFjjRYe+ }ewY#cK_cbߏ"H=@w[[LK rS" J`sg'ogls=(T_a%kDZ2}אlh$hjX!["UdrО M5V%+y_W"x1@m+!M" %TVt vg^)#@_(p?%8\_4z$,V>Eng-PE{`A#CHXJ޻0N <-N=oFoOh#w>* HBV-;`g.00*~)+)nlsw:Q[S/ǴS;ɳ `ΓIݓ4`JI{dEjiԔ'm@nBG/Мn.@3e O*V=kCRw]]}UUzީ-%B[jm` "Cm$W;Q5<\Z<տҘə IQ_^HM tAdFUF5f/01rQXQ$t$;#`"X6modM;1հ~CHU%LSô!aoxQm9{-P'̯a@tQJS3zA jff?~n=:;fQCc|sRչ{t@ J̉4Hͩ3S&&Zl=[bbs?&Ƥ!4xIP]u/5A=zI2zUX"߱륗q$;0ß|_YjD xa 1Tv9۷u9%E@?ڒ!,O$, Q _A@rϳf|gjoNHFS` &d?|_qGbxvx4Vy?E;/A-$"=2tOCj{OXzJvv dwybLLJK5yMPer#@|,--)k>~z]n\mhj(wבo_+|H}٣ cyt3P zTxtWG Ɂٙ>~];cTkQYQ^}}=p3 gn`'t3 ~4Y|y)8!; 2aEVG'Xb1:JW/w}0\ 7d+yރǡy4wT|,'y5Vt.[Aި'պz!=M;-% 53,G]FPrJ'd=Q'%PRJbgd2Ôjԛri6Lj=>c@E hp<^ jDp2{Uk!K[uU>H" ƄFWyuM(z%xk6 558"ZXS9/OC8M( ݈)ɢwڿcRh$D*pD ԇЯ/ (pL~,ѣLbL#- @%~u(Uj&8i2H"O C9lb;D)FkgWk ^~+ [3MMXBJSeDHC>FY8L]jĽKեSNiq1_AKܛ,jǰ/ 4V$ h@Fd:FXH#C>sVFxb-–mU }]Wbl|y܏SJ `oElcSanxyG"&Za~g Uh*l&m rşvucv X8[i쭵9, ut^ڊR=& 2*+)>o;SSAn==Q.kV-:\Ȕ=ᔈuĹmONcYTVWppx l;љďUU#11OO룣O2΢C%BQ'})c o0QmFHϘ9:岪U'h7nF O7XA/,,$^Q`'ʽ/eA;@ ohOw_lPvEMܮW(gݲ-AsJGa;"N>CGN1iu{w%@qOy)8q8r|esD~;vkqN?]zo; :V^1hqV4}DZDIJgǟC7%$arW`5Fǫ&37q9ydNLfe E֯R QP)qeVQQV|ZBBBEp ]g:5Q:p4,7Kt$|ޙwy'e@'iז T86n,@%+yƂG?+hSHaPѮ1u_ `#V Lgϝ;'(˛MS::Nj!c>~8",:YFcu^o~=JNEccWg?%p1|s=A.()sYpWrF\0`˅hayy;O ,wx1FiftKs#6zxz y+a S\@V(EBh#`-Q:խ Gڰx#FY%~xěL#<LL4wCx#w[`^3_B?姜:&5Yx񢸄5zcaB́J`=25Q,}>!c˙3g@x.C63dѩ<፯xw]%''O\HYZ'TE#Jh2Fw3;[cUEU5ѹ >kkn; 2>ޫzW7܊DEMwljGtsPyHJJ(7r獄ۏ^ 6rҚvi>=z] )w~iiZO[Iȗ֋4*⣹EIYNM3eÞO ebBW l.4- FQnsKвvVG[?L/FP}blOvb35VJtp-TLIm }T$'0^ypf}^Y#=3qF'^jb9j؊ -)/vhej>o1JRSQt[|#k'їL+> ]L?#1INηB?ʲ$ `0DN LnǏnz$I{HՓk~ +'qkNm;w&U ^G2AĪH팿t 4$' X] L(\{0}SXV844X7:y;Bxx*v FlZZk7$1*13Y?8e Mkxk+"L+O ?p?=L͔vk |Xcl[TO8+;ÿ?*-w'w׿?;??Ӟw׿?;/ogz58[1up%cf}'wm[N&Nfro0E9!AAasBLLK>ޯyqr?˷?/.${|ٝDEB FY_=aSk,'t|Ox7"]pO|OU=!-7B!~UT?T#spqSCʟfa"w*\8h;eC)ĵB(I^x'ZT3w߹H\ɤr]c)Ǎ&v+ƻ7_zT?VXu2Bp1=$T=v_B~ (;CHM#:𩠝g}~Tُ=xH㼿f;Zqb$Ts휿cW'hՎ eZ$g9Ϛr)^loǫ|!5LxSFKF>UM F BJFv}0:JnK{Zxk=F*s͵d`:3txll>=xY౓*ꑗ|n{n +=e ؘHu쌏:BeI7ji |tn =yELZ9 0r!dC'ol˅O|~/M+::Z@Zښ H<rlqJ{ƨVq::&ZNӥ;ICFȭ'H^é0ndg'F#]]]Hĝ5sG -,)=iD 0xS 04 ;l&@'\ ~LK5nNϥNChH*_$K f0:olugc܂T\/Ht=!2A84Խb"n/>$wӘE(_f͵5L6W,b<ˈ;]jZI)uDײKRAyȹ׼7E}eD v\ x{kͻIx]|0{!,)iƦ$$.mY ]~͝$'nj'^qQ\O펄h}3alEB4F}a"3anh@Ue=Sv+>z&eȔ Q/>: ܵ~xI L! vut"E APϑ3lፓ *tCJw>lK羻$_84>f╆1x>Lř͞"m rlvzKf lui kSQ/_^.Pz@-pRWhEHGvX=M; q!fvVUMsSSAFRrX& EyHmղ=x%Y46pK0ilu{dxjicݱÒ@D)"bݼ|?X _TpW`څ +l$4*BH "П-]I8=$?17D P@+vz#\?RۆR/" nSO І'YDb"]sb޶2b"ܣ@m<#hE @itX6n"."'x8Om-솮K\6!pSD/j%M'ф%wA'WTcn:fm (+VcRRCCgDi1ieM$RE\wCwiZ|7;&*<@d]3=ruMG'2ł#0p[>٪ C(/om>ћS`~ccgj"4)wP1@ ]<4T5RvGk##䗔XsJKyt{>7Ne)Os쿿Ө4-;fgzrwCֻgִ*$ ͕݃ uQH`~$ Zc= vnPۛŤ`3ydH(UTTTTinKlj~9F4zHgyscwfGljj C#C̺EOo Rp6RM=mR14}n|-]*{xR>||mBJܝ]<\kcyo5e|9a'q_yf Ҷes(hvg}{mLjdAg]AXO3+0Mv38HakkӲQ!U,#S7,J{;Ay-5BU?`1\ p~wmijѺ[F|-5sA2F8-xKؔ&Vb)\ԝ8ͯx0":N1n\[{\-6 Ú II.؉ƪzg.tQv{j+NQSX:!R&[,ANC(XvtdpǴu^L9갵v8#=SE},E66_H[EiLܝ=4!!Ub?*X o,qDYe}|X4$4`OBO\> $v{y#\{2҃@KF{9ـ{x3q yZ)fxrѪ#Dx^8.%%5MMb&rN*"i4g>׋;L`Q0pKWc^N0֓*.zWP]EUi>ߛٜ>gm:ލ& iPŹ?un=6} LoUs{fdvBV,eG-2?Yaxk8cײecpMsDˬm?Cgogs~6(҄-yv0τ?۶sҶO<viOΖ*J2pBBۉ>N8Vp[%KmuF w}mP͡T}nԌ ՃS@H+⒖9y_Nv2APC̟ O=$C~<{P+j'❧vu[ݵeC,lYkss Rs `=699Nv38!io2pVCIa"@[Lx:..uov_F|vԨxkWUio_m0ͱ3.ҮzݫO͸\u ߇=x+ٌNX1Nj####uؗ?OM4.⥝, epvXmX"F5¹76}6?)yk4Jw_ ^7O|‚i-qQ;Ugڷ?=J̌q``ׯUU7;<̈́,gf_?Sw"TZZj``sjEqduGDՉ7 ;])%iu])YJO#,;stR wQ>jh}]:OG{{tK ӻM2FF=& vﶱJq-\ˏ3uhk4.5ZznHQHcmJ y__POpzC\jekXA9992}\E=V$?݇V /u& WT'%u- c2$0J'\]p ymmm`Ʒ)^FȃCQllxV.5K+św `eL~&76+7ŠŮ|_V떓RYߊ riߵϟTrFy  ȳD!!Z= =38 ?f!=7DCsM7 >a5!>Q)ҡiZ= 1;chﭵhuLFL{uҴ'{UYY#b{BB?zdYNQH5ې*YolFȥ4x5ZݱA q/~<¯aicWx CIpDKz.6߂`Kӭ/nd@̏50֒{vp83 %iG84{u  OߍێJ{3p+{p3go[敄Qea&60 '!=^:/@̤gb wl\ml_af &|0|.B:3CG[]=',#TTP0ftE"8kiK6iom5[8瑎X zd_d=| ړ'OMhC?~MםeHHiȃ9EE65ON?6>1Eګf;=V$poP5HHIh8Ko ǽ7+" fM/́Klf* ߹q삓(4MkTSGA?e\EF_st(@9ć9 m v !BέFdzuu DaZQQz223SS<2q"M',!zeF5:$l*ڧf}IIIrϧm6LWDBOΒJMI}ڜt):c;1yU() .sWZP*vf'wwwn@sJ kRC@P %g^].Y7ԫv %,&{e}K+>'Ȟ/ff[IYY ~rw< q(FigX~GUYSsO QFwvj9PMcX[eTwW`OXzo%WI@DP<fzlKYqhSşK-Sv{6zTP\H unvvT_K&?zekǟ9j_׳]wȿ-gȿ0$Y?C*$ofyXqG UNea]&J$3hֱFgTAS$p E"R1u ؠw!OL#qn#==a\ ĵ/rkVqHΖ;(xROhrg !y5 ~ =@4By 鬂W]p`aPkȈ0vѰ p_3ɮ?aH,["}e:>Pb7/ n"0{k}.""KE6xSRSC#OEN{򤠾龚=ۚ2rxgPރ=a*i]ȍ:΂?x ߺӧge|層2evw=}˄,JC`Cval fv%lÙpiVu"j@cVY)ާ'^+{37̺c>=ŤJU7OĒ߆sdttt͕tDzR'x8*Kil唗4Io8ut;mϕncocE'ì9::%;:'!^O}^o_ɰTFpQOR8TҌNC]"^}#w}+=זo}`.dt;7gA,qˊFNd_d4ZK>#'JxH{5PORIR;}6\Qqln5F@@itO@NMï82=p./[o{tP@#J2qU@23ȷ:.5Zv"S+1Q|pD9#h K{ʃ2e2l"u͙WYEv[*TQ[V<"KIS⟼?QYƅ&Qf]]<3)1!Xyq0܇TԴWU{3?yCO p۞e0F64344\9zRuonU67e8wBDsrei+eoXq_[}H$zαe$$dNpVN[UO^R𠏻"2XaW)/9;ѣ@DU&&2Z @T;cbn8s^BTxn:n'*) bpъ`[!u#Y (֌ur5EGg^ّbJN{dE$FzM+KǗ!E<셊YBOb_!Rl=]P~`)﫴H*Nѱ@Eܽ&.ʸx vIpT[|%o=qhj":1{`ͅ2p 빷d!iV:phd9=K I[̼D\ xJq?/|fSJe]XB1v6jFRZSWoƪJ۷vV%Ր׷ 81)*\Q]Qzyw$vׇ⩔꾂8+p$ 7rpXTZxDN_Am`k~4W]H/^<O?=1!@> u> z ]'\[Lۈd8oGJD dDG0}k/ޥp~s^%qmw1f #`wEXOfoW<R(szլM˯/:tg#"ÔBM0Uq;+6EȾ-}.}aymCpd abY^kI'![uP6Uxxd& +`ǃur}M */awbgk¡(H9Ma?@-T\fgK;,2إwxe"4XZPC`$puwya,H7y̾ [D jAKټ_mW >$_Vz'zDcbѤ`l?56'kV΃Yki2X=zt\QށɄ2<!?4Ax,qu񊱱Vç0tkrơОq;BTD>8+*%etj 8li?`^}_ 7gmI1B@A[(3:b^av QQVVBoݼYUb蚰H1E_1iD0oޓsp/8dF\+..^BKU{} 2<=BeE6r(n+^ K]ֻwuWi˭UEy!YYZBO:ϧ0kdˏJ'~4X!햤GA7+12>,8 !((>?+=3E(DFxi[a( $HүPjGx"J鎲 ɡX}_y3Եֳ̚+8$r{jC~ΨAVN'=bpf 3 :@K47WϏ| j>8]v&lrZ A  bvfpz*yewaf&%&$Z,NZP9r'QO+['z |*87``!*cY3D A]ms|/QO8j߈W&8r`'_"01"5B`)6YcV:Ep3ŷ\]'Jp ßbXO1)]$`3Һzl#wli.7+&; 8"'r M6g z8:j*.VU]K+--ݣLJd`?䖔D;F.oBktJԬмd/[K,GdORR,R(Dv2V >{>P x 5^߆Wީt#T•OGcSni;H|zۍ LIؽ*Q T ­b_:۰F+8acfLqv.P7ӶtNmj %ri #vM Xuݙw*FP4ѕ%G5#~Sr\UZڤW ~kUF2:FGO~J޲MgtNvs7>5II6#Cbx!h66Vocge:gTiwuݰC̓FJBB9F$wթry<-O@Z7y}1N2c>(URIP+ۓbA[v)M2oK7()=!Cl0GͦC0`).'@&Nb1~^%ӣIk Q Mpc$ ](^ ;%d3 <)t3111{z9>j ~nOؘej,ͣc0` `l 4RJS0Y`meP:mK1(̻e)yRyz un@,NrgyT7 et%eBnΆh>t2B4e;c=t!<]_ z,-8`WnHw UI +(຺^eCZݚ;:jL&"!RB"qT # \6^D{v7;};cb-ELLFknhO왙MN9O_a d]lŽR;ݖ>ŵ?.23 ,tKFcxx2C/P~fU8kF!и'_A84PzMbOI1A*PէxŸn4 ӗX/O/ >Ky!#&Rz(W$Z+xqv]^Hk['˝;sb`[J:ȝ:G$q9lF,9?4߳h߳acXûs#av7k"vO UrvlKK^M'O hzub;-"d55Oɺ8cb޼r/{lM7ķ=pEBk"PLt. ڲ33g Vធ&u~5_vy>OUX Z1-thw0R?//obrZM< njeJxJw3O^4h.xV=љx_fZGȏjNLΔ32hQTˍNUr+Rhp˿8ĜDe_D|MĒ;˳Z4, 27#u66sIzЄϢ =]JS)q JhBiU??B!쬬陙EEhNȂME El2>[6Pn@)?.$27=XCs泲"0rx1fkOd[ C\®7ߨzOe_d3O/õ'yMUܤ y2 ;R-+%KC-!.nߵө(p{ƅ?&E:?8 eEs2PBy?UQǔ.st^F@< XaYUy? ƵlD7*k$ܦ:c__x<1Ӣ}5'2{D!+z$=I%i5c+!y||̄Nd$S5grDM*:~Gl"ݫPvbYU[=e7_^\vWouu]ua\#_MZDP8EK8 @mC] &7Es=ӦNH*_z=1pշKrPz}"ah@ZՁԩSzΩ̼> rŚ`eNN"W)͟w/Z4333pi?6K/ʛ̅yi=zi*|Jsa iV 8Rn`OwEEEC( ƾ+?dh`兾o޶>0 h="Tc8}iW\'9@}B?2l>0h؎ 9-,86F*cuJdwpń(M%AwuD-%ZRy5q8ɦ|ƅ7Vm/%(BPv-2eY!q\I}GM[c-KW )ٷ$ٰhMB*͚ơ0=1ү?TTEZd'h}To%6jfy+҂ p=y"){(3sHmGyE8Aqqnɮ,;w>\c}tbmG$?BCytN3HKrPh->LchTAooB $ZZ0]wB]+Dy@[ۍ΂|pyF5[%^zO* -O-Hx:LwH+Jj{9'Ios#rГ-bjG'FH\.4#cc*ERt`iᆹSW\NZ6Up 6ku`őLM v8=,$>ڑk # OՍccȷ_ώʘ`wf]zχ2YOMNMoɫ^YcLWMx{$eI1S@Jf@dݰup^#$ W<005J]mGgܗa窆9| pe(y×J$h"du$g\$9=s;vzv@koX$Dxav#f컠2'c|VCatL(car|g*zG%[Dq&A obbJF37 '&%_jBȗ~,VU0k~"lm^# /7VM0nK0$PWwQIu?"AB4m֯AqEG70nH`PV򲾋KqqqObv5mل rku#7q"jl#Uh!Y Q.,&_AJn|UY/JHyyy =KV^R(ByH060HW ^Y^.BdM4 #N022: xLn BǦysl߅1B #ؖYĢ66QsFt~Gm"--0 Ob$Ɔ6rL\lEWڟ6H^tC}1-sgQ45^b`a:-Y8/@wpvo;7|?Mؙ6iImR[ /7MzMcc:Z`s/1gţ=4Xo!!N$Y FoqMeE@̟ I ng‚_2uH+Ԥ'p]K$`ڏGt?F׳h*l~m!n!;3-Qx{MyaL55m^WE|qrl졲5g1q~tHK/LFIf3gс/-222g}kh4~qǸMH)_ڮ^mM]%"ov?%,6Xf91וzH1Iߦׇ**J/Khoy+.+@笵*7T1){M'eJIΘ]G*!,yǏ'-20!<)|7ׄb l6YOvZY;h8^FIĽZ1D/)yz(..=D a@OeS@gdh( kc#BmvEӸFy_uH5ŋRxcѪ}ȐwY^X?Dx4",p (u,t~؞i܇:R= NK!/o4vʉ*4"dR$QV ӝq:KafSrPPPV&n6ݭktt,%rHK?8S2O;a "f%AyC Ԙ 3W>_C~5[;I#9k,%߳z`45#Suy?hp2_|o086;57 sSR+B&&8^S3/. =^hʥ=,|tp䖐hWߍ>eogw`>b9^ȋ>N6 eX];Bl!BX=)腬VԖO1A8υF{M`/}L$bC=/T7ZQ>YV-Y$6E{txPup}?@Op<"6##--Ź]57I.22gE ?ۄ'&t#5 q =]]{\QU7|VDV6V;L&͆$|,hc6xv mDp(00Z‡Co.$K_Szx^PF&ʁh&!Gz#Af?~|OeMhjn ! ?|Ix(QƊ%oyvt()#n,'&&FLg|yso?|~أ] W5ё>>{0Jwpf]o>IVntgG B @MTs5o+6~Iylx D``NB%MCdP(hXmSsoZհw;)ՏR~:gVptUHX[!j3jxƃ/׶B/w #D:B[Qs]w:9cY ~P;Mv 9M-Nm!<*';c3?ދ~oqu90 gymmj/ x:@AQzwڗSΨ?&gfy@dT 2]a."@yjnN*o92@"F/B` vpa/hDA39ȉXB31&j>yBDM'K=_d?%6Pc(a)z,$d,M-X݀X(kCC%'3@I&ck^^^|g@2 Mٝ[nӁzH9 ךee ģ9fImFMXKK㍁K_s\sK$)~c늑*1+;j"8X1&B$Ms)~'0K/R%Z׷]U $†zpBF<0{Z@Ya4Ŗ^_b<<*6'YhjHYJЩTX`(}HJݼMdx~u FP(\dqኴȥ$=/-Ж?@@LP!fsor0Ib]2X$AŚ? 9:b[4&޽G3șD̗Z-z 8y8=]#y_T&DIBN|8jr_LǷߚ2aZMLř[zW|W5KWZeKK0FsP=y'IU"0WUC3UԠn'(#Rѣ_Wք3@m@%lAV#偌X֘jw^p*rBlTTztR$&(O^pOpEҟrk|C'i9BAi J}/v; ~YD@7fwmj4@3V򢥴m'O=R2R (NWn"!En7hs:`И7$(-Yb !He(Z3Ä؏}YU%DoHToqa::R-33SӸ'I F2r=\vA>_6YH17~oXW/3ؗ.K3,t238bz7g$XYFO:]Hc;QCsmm KT6 nxKw1X.sC4PUjA+\w:~+12cǎkmer-өqW94{^" ԃ1.Y(NKGh(_S]'u8 (V9,p|d'U42Wuq3OAdtb]-8e)aw?OmNͼx3hF\w^[[xvM[,ċ JT {Hkkk}qqV8-%3.Dp< * ֝fu! Y7.P] m )?B|&9:h dy7hOR0_1,LR76vʤ &.HhEL" AKB!'+߈ZqMLL*QtͬBډngdp2^T BVYУ 8p~ !>>ޠ^b)Q=j_Q6 E-sA[6=u+b'fj:gYo|WSLpQjFѯc[&hOnQM/F1ΏިLP'$yB$L@ wmz{AleFqd7ɷ]ZĀhH wÏ^@ք^fFC\ݏ4\lr&@^ȕj ׉Ӆ52 H_x]URe}#Nd~|ńQ`ŨO̎>nx3ydfu [wZ<i0#+wc4 s$GNh K eo:9 e&aƟ7qZwwop`!ssl؄b8xc}-y2w~lKPٶ{;KWQ-NI 7:]q-4@h|=hْB<B#@5f so118K *iga#EM1oj&$@NanB!icu׭6c!.h)6a['J*/ d\fU0 alaO?ۗ~9a?<-#D'Z+yl^z 7c )un2h g-1Jr3f3DDFEEo ;/P;'i.<98LʴfqYLoW$'coOSceLss.sra"{"\^^~&q@em?)s2| %!T2X"Gl!u3-:qi sJZ3y{Ù^ke}sNMv70)iimBEP9tXҒpOѿZ\?ƃQZxmTTo:nBKz VtFr#h0A}ȨGl {l@nHB F$\8q;DOc~lm ق٩Vpa"(X Nw\SXyNEM*3J/LP;L{ -=IcV*0N+5^ފn+ 9E*vx# o[{-aq'II14PM"yX58}f@Wd_]9_^:R`iBIݘmD2In8Fcq g@(Phgc=Id*I7@ȴ0K5ouv,Pdy937ͫ"0@qTƩhKy<矀ka k}z1 r~ <hI#Jj{fdAʍhu::A CPw}Mv yel\fJ@|E<ـKތP*\Ċ8y|cO?`O^#`AxC=MÍ3U;nP8u-xj[.=`~xϰq0o H Z/( \7`$? So e8 bnA5@V: H:oְI:pQd6eQGN`ɚk;W{6;$2FH,4^); %WHOn/\n! dO|:I/ {S4Ui ꮓ써!E>AnOzJ݈0֛D6U,+BO?EL@U>Z!-FVuxy! WmW!d l+vzY#fZ!tB`BPuk;;%Hum!7&t\p8T,q $UO'3w|G/9 ?Fv7{arЯ(&us&sA`g^/w/\9Ĝz:%9;O5 &,rN(L[RQ@Lg(R4;FrKc=kFty)oYKk^QU+r޽ {7E\T ffBO*9E;! Sc5k<#1g9NҸ֯Ԩ88t3ISQt}rM ;#So}9$v%aT;)wmGN-pk}s0cEFCF6{Y&W4|<6~z(DruYbKW"B١{ׅI2 '}MtE%[?\cHaf2ArNNL=wS[%ՎqOV:{5F$EZwҳ"]5C'l~0إps-:׈ jtJ)i4*;x6(-9E**$NȼLuY udɽRG%@T\lC^wW=9zP(yƿnp0L p1+fPF@Fq%9$!Qڽ{"]c pwuߏźG _&ħDEF!Lm%VV^9}8R}6?<*-vic;+)s RN񑴺hS8~37,5]NtfDO:ja5GU3=4;<<1xb*\_viwgVGX~YZ[!?!Mgw|>ڒ%nW;iaب"Z74&Bmhf6`! +wׄB X[T/} 0H(B x~=XBeee _vODzڛ=xM^GN[S x vdMjp1~v`7vd\(^H|X I{!n—*B١5K]If ɣ۠š7gOgC'9~uܟ+ F?y*fV;8S#O..'*(~]TXL?(,-$@D(CߕPw L2J/e?TӇEI e{Զ cEEAAE4w.RU@:ґ&DRBiҥBH󮕀>={xry]YƸ=)2<x^^{`k`Yi|g?B?x;?KU[??gJ:o΃E7QKuLJ/:rR%7E^u) cӺ?l$g൵Zzdqa<]m@ˆTJ"RY^v`=!VOŞdNVV[ܗ)yB z7)pC`/y|Q%AWy.vzXXXIk^ލ^nX_1Taif FlhgE̔eT=<*ˆ@ Z_TW/M4j8}a3f \ǬKlJ!UšꝜFWWZ)w` o/ٸ4}wuCcc@8#0e i+0[2H7W׷2oBU$+iӳgޛTvآW\7*)9懰0Ut tJ1(gL/=} az)/k ά9cO'JHEݏ U궻KTOUU~664sq~=N|ǶXנge؃/%!AaI$vjF6_ex$M޹Uzg I`هzgxh.곍ԔioXp?iUU.Zj繃 Cuk79@ 1Ѐ{ _477?ٕ:nԵg?\^v SL#mzJ2,Un1 X4o>LB|Obljig0|*)7m6PUڧi4Mi .d5>uc~F5smQ\}b"z"PhYB6]ߩk{Xrn X>XTU /V] w]ܚqYkfr5AW՝ՙԹqte~h8 dBt&^f&ֳ¢KV^}~~7#c\Eô`Qj&a.Zx89F}She >e%L2~񦂉vP^sn=IrsKN\jhh!oCX7&[ƌ.F_ )6##cosB̿ncùOv)kD-1;O1<?"G>Fx& \+2|i0MwUTEpwCLV΄]`Ꮈi"9k^cCk5I1p c&blof  L!k>$3~ah7d316mFRqaຜ,ocL\e!` *4XFMwX\E:'&&yk48Qf[$;f o] ܛ#--p"i%P^ytP7 [RA6D_(;h%עTs-:&t-Ǜ7 V NM'[[VVYW88NOKT37)į;@' 2ȸ@訝X`lċ눤3ݑbľ2ޝ_r濒#"bv,Dx[u¬oÖhjbbbk!Ɛ&LcfR{@>&A 6*%S%>|6J%N\X23>]]]WEpD CBp^|m+ igmCM9U{z8;oߝڦqY7mccɳho Mtvw<ٹ˽Msb;_w2ٌٞ"򃌘x CRBnJ@ jV;dƴjnqREA0R袡Dʣחšm޿"'Su< .#ۘNz~ {c`L?O" .g=IHX8~84̦wt{,G.Z[[mU҆zdB Q9TȡXS=286ґ~GjU ~@XOI痭VP 4ҳMaX4)H%(Phټ(oD(t' W V_ 9Cw ֠pKI  < V+(xVŁ*X2>cYhpro %;Qt95Hiiι?ze[ 5Jy cG\\=X(1ZTQ!|QUGxtt.7>+yjw ])l'G*1XEfG %|Pʃ{CPg#}xG.I)7K}%[$ yt1(j[<.܅O?!a/PK: G9ik9hPUbaE?8Z]Z%ZZW#P&?2ssC$'׊hƛ!_ ug\WHHl;Yq*}^y[X 5/Q {&::e=4K&V+/!NTnIs{fD<Z _˹5֩/Y&ʯg<_ܴ*E X}BFQLKj܏ҒO֟Rwe b V]< {\r9TD̘ĸy}w^=O_k5<2wD {{T {wupCɗ/{0,2"o n*Xz/q >p;32 ҎעtiG-I@MƆ^I|z99፣## ME)K q<_@S@Ru o;3xVR̿p/bf2(yY)3PJ7IM?Q="7  w &BT\)!1 olK-enJ::"6Z=Pcqu-GdٓإJv^"...ic82;Ss1_Luw-{Knfn\^'` M \L؇[byVW:%ۻk 4Fc9ZZ\}(MGg k<6t>+o-~?и˾Xrwݮ޽kX❆Zʷ=C֜'f~׽  3ٯgs9nJz UG4g'hGUVV^{' -mlj N{eM(%f2*Jbw$~(> {222 2 /zfzwuuX2 @+Ur kteSqoɎm͡Pxd20c+N{bExYHoʇ+G4rELV[%j|Ws݄'Lr4y E c%nceULD "aВf|i" /5iBӭZ[[yUeoh$?@\8ˠ.d]@B2n}L+Cc!..ZGeY٥'|fYd3NӔ,[~)#K~n=w w|/6BB׿6p9yxV:2ץۯxIS^]+ o!>%{Pۯt_(!C)_mXy_eR|-Fn.Tã;3㣥ƭl5p[t_[ I`# #7zn@x`__qNh6KfbbR}fnnUְI둑q,C066Quw߇B# tܻ\:>F$diu|rykzws8 ;?}C %9 ym:[j,92{a'i ƦBdO m_9\&rsog͛3}==%y mO-,V{w&`7hrw'C9077<4ěx'y6!&%( 7"4322BKv*#w,crs5iխ--؂E#5G*?}t/''Bm% 455 \g6T,uċ6#lC{|{z{ =դp˽vONh}nYA!>"}`ajBo/cPҀ sM 3uz.IuZh,--#-&X]] So 9j(E.5ҚSj2?~=,bT#|gM'hsމU< szKA_{e*ʠ(O:X缭<:egm~5Js5)'ZMM3Mע)H/bb9q̦!i]fe5W˗$nCیDz N v nW~z2)V ThbPVHR$ng=00;ePk`祓ָ:92TO~<ϲ-15?A3ûh/7'jl唎/.Q ع(92>) >e~٦NѫyaϒǿλM:%a|~AF~З&~'gɭ5LvKw7|w۟A TIQi1͜`(;KIV>y\+iACIr>]X|mX=k޻,_^$d!8u1 pA-sc;•?Lh;kk >;a)3+F-\7yp͘ȈADJߚ77_hà W HfɥDplD_vhWEJ 1҆MLe{rT+֦{of,L_.{/ԉ ?=bD;)vο:aZyGZT4IfGTׯimR\SԣDݻ;?oz8b6!f[`k6OjaR|T!Q KewKGݚ;EܕupsƧ B|N:+7^0ڕ\CT5/vdQr nz/&Oj!ֿZ1N4Dr7衺zČdMC@@h 6z#67Wȝogɠ}qyJ]j뛯n4sAGYe k }m=/_B:Κ;yṂۢ DL0)7\t`y9SSSo;RS!(ԣ|u[|qR!v}o0x7zw W/\ &pG7< >s@cǞ' /+̹gnc)di }F1K[o<J"be2:a!+Ϭbm _^adZ% ؘ$⡠ .FoJfTz [)( ho'/Ud6R(#Yp`kW3|R*!&ǧy=b@0EڑMUB ]F+iK 6Z(9MZce<\*Y׶G4smmyav'hUSm|N;Σn6zO̽i07dכX"nAUEvh./'cn!jG4`zKMVoYeK]@HLIUgO&o/5xd܎+qf9ѽ  '-W蔡7^LcQPVsToEr"vq"!'S&z ny+ZНcƃP|!#kn +9‡}EXzFc,M ϣEaB}|{ww?ֽ8 o@HLUķ d>7nГ# 9R ]7wtzv!4OW7G Iam%&fhDaKEE0 I} $ϡ:[z&!P6U (͓'{l99qCh`zq c޾}#+Wlfz}Zun='!,xvF_8p17X$õ` ˺ZM '>u7GȻaIdԍxp^p.-ٯ|9,axC޾ Zr )$$:hjjBNRf-Ïj '(8Iv3*t<9)F&Ðq3#|YA`1.F-J\H{IwAb}OL0ʻ2}k borpn(enD(uc$;6wRQ l%fiL  1]qA t~.r(Q-1;kkp G?Xfw_u"\1iކ K\6.(gRSsrKJv bܹvn Yoo3(TZxXC(jQRRԋ&x16 "8 =yk@pXZZzyei{wjDEE4 Jj2Z'^!i9]]lݖeytJ?>m1r}+'3@J]Jy?\n{qq%O a#,pv󎸛㷁O qI& MQL_c# JmP.? >xb5z!00xHj"0 B(~o3;K:D*?V=+)pbL*>6=&=J:YM@n- gc0&?Fhl2KW(WaE_') B7]aTFeR' m:PZ"22 0!vffF: ?hk{ )6]//]EХU ~Vy 羆]`Dંդ^|Cn}Kog2́PCh&d0?""q,. ļ`㓊yrH5J#D~g`G+!@X9!ُ ;Lw$%ѷgY a5 +HaԐQCōzj@^\ +Drɟq ޜNҷB@7ii%1gK8 dw Hg*(8-`7؋r&@?i-R:vI&X rjP$:es )jղaG"!Ɔ.fHEMhUKWbt5Fonb9z!vTX\hn`'W@>K.9ZWN唎 PJU4[+nX [e\}OPZ&R keж/ xV u)_ 'h[@t}r8w/?o'_Nw?z+.Oq?~~/Oqȸ2B? <̔fsG;pOsWr -y7;^/ϿڌR&}ysְo%=?Us.5/wlg ӧPDd!ïr,s?4U8)y|=AXZ0*J!= R 1KZ-FFJy+Rib2tt4X , ;3!Nش#3:?TU,8z7zghCQ@:ݯ#Q;ԏ1 \G;槛q'^Q+YY[,Ow@ GW".3L4nnnGN9!\]굵 ,V4ij]6XU͵eൻB@*{?KFZ @sJCwk 9/*f<`]+k(()۳^co_K:_4|')<t|!UI| 9S1MW QY\Q;%$պS^h{4O'zٚ 5Y5=u666XN:wXydrG(1ǂ;}/!<"4WitTsItϷVS2ƴo-K-/';%w.y4HVRW4j+Yn9IaY>H,eYVyܑ̐DZt[Γl7/TYಙ$hg[بjjj~c0ɦK˭ +6nNZNnrگ&pQ3I Fif.+f_ A}rnZj,<}:<sӶHxg4w?*k30{jp`I]_zHG]^^l'䌔y:ֽeg~kCoc\2О̓^9QoUzj-δNkcaow;G.~OYm.apE?E]ǠؒY|4lll]OI_U_=QMXaffDp}e%* ̼tS9!拠@P񽂊w ^Ν;W\hx6dxijz @f̵}nnV \.ձcǀpFeUUU%%8zn 9=2:?<'Har1DJPz ye@]Ucie ^yqBMiǻ3Bԭ"[B2y:*24GFa&eʴB!F~ p[ش16Tq.Ӑ[*hGNT㺜Q๜y@}< Dt"St%\8R;-'svplIA5O|QaC#"C(b\HNzՓT ʧ僞]h^D PZ9Us D&<ȶTA?Os*&83y! JC|Ar` U6vլ)MAO?8E?)Pڇa-wQS •o5孥EE_`pai#Z*4g|4L3z<1( ht;͆JX7 j 02js8 K.E nwn6{X`)qV,63kdi{A 7BHaϏw+Pr PvVǩWDp jq>Sq1iџ~Gu\pV^1Q\}Cg\xBx'01"(? MUR?LMuA#j$M[NO͋][WcFvȭ< ΉCp ;Z&Y. ;$KXu9[&TAsݫR0C8-ddXhzp La0 2Dߋ bw@N "3N j WX{2=#0-'6i):={vd8OtqATm PDf"™=Z+QqyH0]b4_~]k29`K h7e=99Iv{ skoS3}vu**QEb`h(,BEK+q&XNC@H57 I" _G@^-KׯϞsDŽ4x\˺=cfc\Qdgk"eKuJw"UNy :ą"+Ew711;j<٬1(`Ҭ3%n޼|44.5/8PL@LȽیwg&`+P4uG?lBeA9׮U[b$ %Nj?ț^4Yy\F/uۇDq&H6"gA-r&$4Ft pދW^䈯K'>}zςݡlJÇ$&vkCqxM4~%tmWpnvFs 0a?9<#"bHtF]#^:4KSmaQlDX>=δ~yvHKbޕkCIx@Ӽ Xv{nEO+bm8bS6A QiNےhb k5u&𔷷7!& Ue~r}i@tE4yYY 𨃕% Q[joXHIV͂Yc^nJހ QlI"ԮȮ"x )O#[C~wf~mR)7eځv-}-}g#Aj)v?ûiىXJP=op㾨)8wʪDq|ͥnѼnl♗Uv2T*Sf"#(x 6@5J<Akwc'!] \.E~W?]nT=VVNKlk@A7,7[{uhnIx]WU&YqW&]8|kj@{V#,5o@:Kod|}DiP`6pbҙ ^8{>Ѐ nh0%I8* oYdzy;B(e|J!xO}jAAunc$9,:ΔyũXz~83N,GwGDA!ް-Dk9 պ aۉz*:j9Nq*G77I󏣀|;vRfbO`O8 Eo ܗF}}E762?쫲pq.\z?577D+57?D␙v jzzMMM_d:n`q1/WsߚU"J^珗rXsOM%_ZtLCTgv"UmnOadBN$&=•^L60WL-TgȼxxxRm[m&dC}‹ւ;7w C*W^l~zqLj<=&pRcR}%fZ6 @Phuܝc7B+n4[mc9\0=﾿k&ެG$<39ȁ  Xٝ[[/}2zNlj)woÅڂ/y" ;GÂhˌ[1m7~֋SqT8j\PBB0('hPPgۋ^ 7fCА?_\\ gB"=\mznU?bJQE}R;JcqS*yp%PY5+{y%߽fh&&& .t^O=C3sۂpS|KQoμ,._3p\ aY+rX(L.=kH1uħn}U(xUST\LRH$t|lņ_9;o.ˇQ+"]UJF)XI:f䪘1W>ORdX1A}9 uDE/w? ;=yyd$O4MK+-l@7; C b 8'o>@^ڛׯp1=60Q u5J__Gj2?]FWscoRewLҶhڑb*&“.M1uGM6M9E['Z3Fk thV'[g(,ܯ/i.FRib$Nڙ)^n̢ggۿ{mT_8c5 f>ѯ-Eu-Lؖ^CCQ$ 5>BBBuCUPG`7-xd'<*$ajh#W.n0&\|[LpGn>4 [3d'jiӮ3PšP_=Ğ݌W/&@}&6dBl11!Pܓ*zy>]~rSJ"5啋ljz?zxH#0a[[$0ˁU똒]Kz9a;}ZևW|\TXxUk [U85mmg 7@rOˎ :^R|NK#Мz^<$O~sFv{Y_G=qK!AU!ߦ Z;s?^Ο8׿?uT㏏8}o :~3A r}<˔A>q7L=7jsz 'N8o*_rgS/3 {~2KOqW3DɛË,Z f3<_%h7q9奓e>C֩%cTSf_ ]<Bjkj<rY;@ ? };5rhCMcP'S]huDzc1:8G\vRhiiYU" >U{vVa{ALF?vγgϔ2khju{49==5VKWF+u666&_߮-U76B=inKTaiX]ԓ>k)k)ҿOdMow:Q\ؙ HU%n\E=SXP|#3^543rMP`Cunq!O 3j3Lq@v?] vrrR/x/ 6l9hJ:? r3ub/=L5C j"[)AW\oz#\H0%( mEp;;F 3`Fh!Pcp`X&*:ZzE=n2\6i'B=?c>^2㲓7J%WG }Q }UԺB |#XiSJ-^]W%johVoe5v %(o**5"@ص8w7$Ս_n{B]2 A~63cF!%${m쳦 aFF:KvRCRv%nh "E1O gd- PZ] QXQ8O aぞ Jea3p%@U$4>9 xw6=?R " ۡ(!ϋJ=?h(;U9P_/ QoB%Jf"Ly c111;kI6=T;QqIeݓ d P<߿ۋƳB~t@icߢc"5 ZZ6Jw(ϮEޓ$P!2䢏o!k$4SnzUs1Ia(aIT\4^CcC/햃IA#Fa)y6H5K^ςW KK˻%0'^UuΙ+EwQ  (O/Z{c3T%&ĖlCfTR x)sgg@VN¢QN]59>w^`;b j,l4$eHvȇĈt[Sqd/l:yԐQwvܝOp> ʨW>2@]4'%tL߸B ۇRc; #nusq M/~ r6Ś2cEH&>5͢(Zd)PXlǫ;0م:ۅZ)xﶷP[GDy#v9l`(wuHɓPw5Is xb022Nt@/xXF S|.|KAAѥcijmWvjF@K[TbbC[x\K.x^{ gbSWlfF{)رy+R-9cS+ʶ/-SO=.#xY֖{׃b `c\}UZE;N֥b帾8U(+, KkViS(0`H /l3IJ垫F3#BZ4D/..mWcCs_cgarr^ UiNr84NBѐ!)|xK0}.\p :D>-Mͣ[ zp% 0d!x;})4]4XaGWE(*}D1koRM aN8>G0?B\мX$fC 8`P4 ӓ[ڴ&PV,?:f$i(M?iz][/S+MEV;keŗMj&4kE +Py`Wx{aXҶ.-Iŋk>"p[k904yrzM/ ==o0UPW̥/v2<2wZA^~h=qCQrhK,0w͢67( clfJ)1HZJXc4quo(> z~; ''~H+stC9])bc|~uo0rr- *V\EqOUIQ쵶 ^HeHU-BxW ccgut'kRR\<.iyRKc\c A؄?>~PB/;EZD3 ”l[ J]LWe~{y~J|EV/ ۻ!'H(΃5 \B_O3 ~DަЙt| $couS8״{y'a]pFc,},5Aǟ`c]٭/8 ib9Ŏ6(I ցQ :)63Mҿm.:b[;ڦstfpH>X*Y-Sf;i7zą34ou)x;`99CϏP9Jm5{?4eo']s߸0mbV1ʁhsrr,xex<a+e/XIi~~@u:0ݧV{vi ,?{v L_ ũ }dkBI΅EEeZbE~(Vd^ȍ^5=]̒ CEEEssrxrXc1KcbUr./ld/_~hm~r6]NZ#+;>WXvhF1#,m)1l0+ 1i2t$9n(W9M7P0bfȻ*3Gs2 8% X;;/0MNbM=\O^I[U^ s z@X=BX8c0iNO n,#Tыљt㘉'Teev7!uKd[H㤰R4D5,16u=:#tWu!*j}YrTNjwe0;LYS_[?w9A`B9b'f;/gO"tC%i᎗9fa$"yHHLM⨭QE'CI'y#\&FsWa]J贙O/Wg&CI[`[rpp>yjD_3@Nt@p8,MOOL\WB"]]vs=^^^3Z4%]7nI0e;FjUy͹\Qҹ.gջ85#N6$Y YR?Fi m+3T23._Z~\Wf0$͝ wmw31{{{Jӡj16cci g-၁*56]b0?`ut^% kECo夶0hu5˗/c?깭"FGYjFhr߿*-|Gy fee˗wۻ{vGOTA\ 3IL{0q:<Ҥ-3tZf_՜,>bo EK`..l2O笮ۚ6ԴO@= 'MSkc--YY 7Tu.*6*nY*d_-("vX ^#3uпtZB.s2 ֕}la dͼ6g pNFYhE/yۖNԔ'ZՔzhtAk1(k³ʁnJ$ŒC fI8L`/@{ nۦz^ m96IRUnx6h*E$"g&x*Wd Z:[Of j(ʶyfƾE* {f( +"=b*C/+-ܹ5=Qi;)Swي?6qasx>A4hEBN'7pەWeٜ1ŗX:=ܫOT3\K-]"<<)qƲ[rC?>\]n6kzdhn3ku.71'ttd$Νsڙd쾢2&~|LV{3dt{E!޹n98ܝwSSetEkdmŏPVEr7MT55$ȳ^Ȍ p $%FMR\'8sVPydoUnyݙ7| R4 C#[}[;,adX؝ݘ9'tϹjܐ_`cqn!J q]ΨH%ӉQ.DN{l"]dccy/OK|̾a8l3<t sj&Mne:KՒ O#.~keYeX:2!,?;f@rzTYzK:B!HuWg::_x`:.4JerY;ґ2@뤆BJ&lA%ՐKUd(]5YZޟPp$!fxWn?fS7LLWչ"_\OWuwU=[֧?q)X&#MdǍ{Z/]p[W|2]%-B4x;2QB49\(!)xX`.Y(GW":PHx728P`0^jbaYyOx\ <L_nGZWY{)3]=)Cd27n:ZeفZCEyUkrX]8j84Jh/s{⾷RmD" cA[Ü+B?Nz1%R6/=,͛S[AM_Vv wEY&jmI\Ȉu[5-ߐ-+\Ezd!+gSG|ep'1Vќ) ?ǿFo.}0sYD5ZM .ӄ[4㱿ݱ0yT^͎ć,u+Bc f)sFՇ ,p02ڷl_Mnjݥ؞Uתe u/t񬕌gQQ0lo&~i g}\sA!^}PpTyW97_:xiʷkla.@>h9q~z[$7N S}:X/C~}( PLV`y*>w Z[_-.Gw.{DSp|nFM!p )][M?#pg~ 1I}^BB"Hvfիf<%$f{"ʇe]]fMJ&g[eveX+_1BI&r٨ x)sOAl+_"$$DKK[PPt F@m%w5IHH;IFm-s5A3XU r@Q>_o8Y=SMP ...p ol@e^tF9i.PQA".֧TAojcZ l=mҮS G0/ xY0Z%Vb$r(vWȈ_O`!хtaTHrj'r{<#WW](riE!thLqy9q%5"!M*uOW}H._> Oa`ט $@jbW3?/OnksUv%^@sj|zr$ۀ<@8}͞:aP?FO~m981<>`Ó1; "n h,64 FlrD\7fG_y}M4* J.g_gmlS;B15 XummA7.cGWe~*W^}(2LG<阶= RxQ7gbD`aD?{8NV.PzxȵChhq*2?u𰔤$gd+ǻV7@5 ".jmĪ5|;*ᱟ$pz]qas߼j^Y__7E8^s :RUА7|LXI^hQ^0}Q7P&5ݽWiiWr?V!`D74  AR&my/~155ో&~ w=zC .C=Ƣo DEXF-ÚkX;vRfoI-&k Hd3,x o_Zr@/ yLK8tc Q$sHG 'VWWrj!`݋~u=VG> c##mc6쯥+M파0~I ]:&lE(YJbNʀ 5-Ja[GƱhsf-ʘ3ranh* 2G\Ηq!2rrsKPSǟRl2~3E|h|{`iQ3)ZNZ|LiLW4Pr( ٶ!^BQ8~}wT;LAe7bsd<SDlOL=߸ls b7Uoei ?aZP{IY tuMp^H?Na&j7d+[ĕC8kr!>Wqd)f!>gwjz;׸8:?@ Op߁IKɤ>2SpLxM{{K|q5kOb; ۹b9R[J c-Gnеf"I/v+`ajz]˩?&]W\ˌ u?+3N0 < S=28D< NDx~&J>-FLE`hwn= %3(JI,-,uZ~r3L2V!\U |_vNO©SLpoFǣJ&VXp5˳ۘ2}v|/k0S ){Al S*NR>sNZ^dS;Z[ڡ2WoTdjzHwz={vy=:RYhlƟw̄TAfdѭenk~~Mem1:5j`~Vjb\ OWM!HkB?g.%PìzqA!>Ԡ2M8/mV4$jtGD N~ջR,U\a,U Ph_p H۴`u.n*xe;H`L**,m7IutB_ѿfO>.=ExamBr"12t [[[H*կIfCCs:MsR"~FBw9yJr ̭gf1N}J骬 (be)KK"SSM!@g@#:Y3ӲZ!, 1ǙJeN! Bл\H9H/ ZУ;)^,3Paqz--qF[[[(*Z[iakRgoB=99 hpHYu6`ؙR@Jytp_~맳+U'K{O/*x9 ҉yЏj7{@@|A>Ɔo#+ϻ+0f}tB}>?^?_|zSm@ä!%/-.QXwIP m5 xÎBvy=ĺ'!f_T*k"{9z&Oܙ xd ޿V_=!}-ޖ<@#NDk¡9Ky^خLܫ4ߊil҂a34+-*5#Q Nk6. KK 3/1^t:[a2Zi=&}}9T> ~*&;.+~-V?$3%*Čȼ?GE 0[BCD=~'3o_l\`oo_S__\ww&kσ5v*pQM:}*W-'Nu7U;1wN -Ʒ5O-| 2'lC6#߁ԓH݇#lQU{+HdЙ&Ԍ/׹!#lr;vV2Hx@uֺPE afq-$l%tUt $2MP&ZT<J2mpVAF)f<zR#u:m?ۺC| xtFtM*..mïy\ ]e:3jى>|g͖3z{C`N`ˇ ^ lHM^0ާ334Vkf H (qVs==kxLyakHd̄)DJ!ieY~dwKYst)f~XߍmAL2o2/C-n Ĉ>Ǜ' lģ>$n@E|e!iq }$ -z`u UHKCׁ lŻuFKmB3ፍR'}B %iJtMF98UWsmA3o ir2%=uVFww5 CJsssgJFm#L\Ϲx.7?Zh.\((?٣|֎%ղ3$8IN@u?yGWd] IHIn'a(((g-}wu15-IӠC2_46 beOPY3p-I.ӯt  l'tCfH1: gP_T{Yk`T=@W=\hd LyjcapOe4 OB6.}&!񂣏&p)emo/^ϛ<.\]he*M .c ,Qӻ/.Ph|cqMjL(6}鼆Fuq:7WWי*of~pg}YÜ! Mt ۢT~-Iwf2td6JjRQ A%v1O!óXѬCE###` Ʊ>US۴:k$]^.hߍV(Gis3p~(XK4DTgw\E֐[k}7W<ǒ0K+3gΈ]xXv;XSM@>FmӰ-WK:{ﰦn]np+t;(tޤ!tl4 H%H/.@Z]+`߹w=c\Yk5;x|ݽ<A!`caoKs7`Np=0wd X9L+ٷf-kp}5HOe]Q]m n0Qo=QYSSclw#$9ln60>aj)4h3j-;Vh4^K^iܙUdbTȦd8Csmܑ,\2W,qo"b'ԉӸ+ʹ@Hײ{T1.t3c? +ѫ Z*d\xTޘq(xi/sPx֥u:|Y|vn IIIlPE6@ﳀoeSN Ǯ'?iNYPV.4IF=52Dn} &gv74j šŢd^J; tF@;DJkd+c!t;LCD~>0~} ֨o̱QN rLn$`ߴfm.\`>2Xl 裏cӰ^gR~Fl@ķogkKRӀ@U-Ar y FNif wmd@m,,{Yg j"BCh*e7Kl嵵}}&nu1ogKssoi8dCee>RWvhKXu7ƈPrŔ~Ud^%_mymme&}um {C:B#{Ϯ>-3[f@U+wЧi!tuڗ[+^5edJZYgK0mH쩒5D+FGD~r乕3T"q:wOQg}90m||vOSv"J zt# >_Wa:1lkG'x,mǦ1]zH[P4r+ .ĝtK .(C@rbnAg#mmٺy6ƞ,jNOmP$fy$Fw'-K{:;J4[7$=ks`uRť B)JwoՋQr5aG_ _vgZ=*Z0"I#SPiIvgg9/.!Q Ж}RF.xU\j6[%FsYvV{R4L 4R$>P(, ^?F)t`e<p :D4RĤ$ ge&4Zϰ(h/~ʧ]B뱱\ʸV)5uERD. >Yd2s?rwCx'<D}ӮH,a.dk;mG g+ED-oyJOn4a(a 5:؝#K@\Ȱ<P6UC| Zѽbn\.1-L`#(UcNjH@2jv3fRb&x2Ѿh̏.|va"k}q7!S EzH.5Xd=r#=Nہ%(1|~|N!׬<>'vB{)=S5=TJƉN#O_X=Z\l~ WQ,I4 lw]IS|R;ZPMMn',0UjgW|Ȧj| ꪨ`^+~inheْnlo#cB(*y~^̅Pu1[aj̝xޣ&8k'PydB=` 3b,`2o= yv|ZUH-u\^i;&-66t[U܎'hP111³޹U! 7=*k{PYiV,s~=)XIoZv^?Eo_ #=mg ] tD` 'xsmg*]SwH {WFgQFbbk+ [E3yi{Fss6ﯰ/s} >żn業\E'&@: cB1ŀD=NNO(Ͻz6,,Lmu)O[1q!FYMٙ.EAď*=4wQEI3/LL$qնP(Cr]D|/0DϹk!A^᷸A.m>fU㤃?Kl{^#Bg?qqqemJ JKK/pugU3! o,{Rao1GtQOEvrZgL &[шzpZqdnHjDM/B%v!C֐n#7$r.8|Q{G޴ZsG|WVMϰD5nni,\n I퀰RlԳcӔDDX;W迩L%jKLL*%`$oW\%L\TXY8K3`Й| ͇PBþCNkN66&)Jw(YD.*Y+UUU>>kͤ8%l!/-Ò)!-kkZ+9! !^7^ L`V SQEȱ1f yDB3tdWxs2IVxdc|->+Ʀ \Ń?%#?n:~|_-1x?~_c/7|0ߏ_@n߿qm@s \}z?G]_qs'\\_-zqR^H2ԋkgP|u%Dkq+t(ez(2:JC~Dr2#2遨(>;ɲZ>} R?nʜ-tl?S#7RҾ `zv(FCG]RYi'pg^{A`YyRtS.0\<<,rB`.g/퉬g&UGJ~gY:CMwh1QC6qlzkhrz˳{ XI*C&|Vڒ@ߍ"!́CЭ5w}Mw sۜ_ܧ%oVI , p{Pe3Wg3Ln3DILi5bjmAB>,<FAK6>$3S]V=S&b8 N( 7:A?x-|2BUONMM [V wOuijX~kg4m ufM^[5t5h;aʜ\j KjjEb`xhprcf4pbD \{,uo^(^mZkmCn֧^裍8 hVE*UVc~i=a`U5E,beufA ō!AЛITYQ2.LF0NN },?ڌQf1ΑGL}?=mX{o6oso#FkBf&ǝ躰@Ξߩ%6G[[_=YJfiQ\_3(jC.y`.I]*eQC8,MKEҙ2}R~.Xgd 7G+м aG5!`?tn"xEədb@E^1Ŋ>UJM;U@JUDA-=-cEw}RhOFFR71NvLDQ:[b@z0Ԡ20Uz%mφqKY #zXUaMYeP^QefKiO|Ə4".Av!Rf MA 7@XOɑ+[kbun=<8/"Zb8ZOz]rG1c"e哫΃d7MN:ֿtdy*X7s)JLؿPO,K^(|A))Πh i6˷w}8ҤT LGrbq,oa:W/Lr_|'ekrN}BNz.U^/ kZ;a{RVV5Ȩ'bD_O5ֆɱ]^},lr5G'Ɂg'%mLlcmm^t2sY7G6Iyڷ W}c꣝Q̈ܩzv`xN}5jd݉j$Z~BM\W6⭰Yt׎l4$OS6 оVwH ݣ:O{0N=AOsEEOH^8 ? ynʜA8}c{J0PPĦ{^oN {M G211iij.nyX=TD4_EAun/Mqs4TP-gI10lrN%#FР|" 5lb Fb+ GFwk&cjP*/A0:Վ&W:Owe+?A`z2N.Kt\{ߪ[,2!$==}uq1 v^?^#X D](#Z--,lmwӊ**vpP3`) X~^%BtaWy7*v 1P!O܆KyIɝS'<q1?G{&lfuqUnIu|\<ёr@&Tq[#OS Z k>eOrD\%< j>RK8}x8N/$!r- ";ۗUm&-*)nïE3/3$|#";Ź휜8;NC6o֐j@@ pr[ycSSx,)7WxK$eGoaĀ@7@prrJHKؽz9L5Qef"X:RNP/Ba>-jgI0U&Jz@p{+/%--+Emu.[DS?GH<]{$cYR^OmX~s$iK(ڗC#+̅\~e&X0zq1O=复%+u8ț܍濇Hem]h27ܘ(9=HG̛?`i`%R T[C6\f!c@ԬfnnT^c9::F+ i]xܡ正\]o(13w30Q/1vPX!V^II>Q4DK#}F-:BcG&X?2PϤ,b2K0cu*aCKJ2K YpB;+-],3`xg 0@LGH8mX &ۦ}9Fz7DWBzz5lS_UCq;ƐHQe&hCbTa(QI+˒{p잯 zٙ ) Mz hd?e`2+aݠ6B\uuQhae=;RU]- vlSU̬i/\>FW|J*+{{U˶4fѯ9YXdGmxR rP0x/.+8;:Kid<|j9_=@X x.{i_ui\eR|ZyC|5^9V SI%޷ IH 7wNLֵL2}$Y欷"k{U/Cz7's`OKĄ 4*ם d n?2FWr[L,Y}iyYH˞L@pAg`j SPz$X_Vf5^7d!gAvQ4MH_"m D常ˌŅ+x3P\*AH2x @; j.#foEBCh{Q,3EB_Pʱn j-l~?2Nja{qOnG#$rXhV>:yU/{[E<탒Wwbv!k !KJ97N]5@ %2Й rx,""buy9{WhY.{q'*ij=uHQ pU<(#9p7!wчA)c+ESe?A$@袂̏/~W8KßyݓON&||E1psYYf)Zet§oZVHܼ [bA44qbb"Y0';W^?U㾄y8k"bz]]AbzzBtoe{{{kixm[`RN6 c31`FwB|ᑧ9d5V__1^zzce"n]Av#K׿|I)cNa= v5J5ZOptw pM  brcocǖzy (^r*R&Eg,zժtuI/S'kv8^+TeF2wsLwZ;VYM)zOg)IķI|^x*b~?E}{mDЩ/r"]pk8vcZ sJЈ(@y|MܮV+A /Z#Zs?G((3GL*idGKRRsK>Gɉ8+#MoN---9[e>{QWʣܙoM W ?;ڟZY:#panfМSN1\ddQ7js>rp;G#CCc߄ [d鞏P*I◈E-M;ePWed7IپB[^lP/nuysf nVyXrvacz[E r-oD",$ ɩ} 92rKxz 3ij pw4>EP!&~𺺱)zZrM1 j|Ŗ-Z#?1! 1?hDO!ko*#|po(wVOpcKAʡgA !~HQv犱tdLQ}dЌ9DXA[`P[ڼ} }ŠBuޒ<@рmʉj^<<缚8y]bPiaoo1iSt3SwRP)5L{ͭHgfMVY8HC:6/J{7.: ۷w񁺺|DЮs+r84 .{)qWh_{_Jsdc(xL(Z\9]2CXfjf6UjiKBzwQb٘WZEFθ 9>l_Zͮ{^^̼'HJ[˿c.p)|1sPnuaaK\nu%msxLDsfCx#ݵ:m֡ތ|O=dA~KY۱jG-6â"c]S fܛQH%q&bRN%s3.c!U6п'P,A\ImqvqɒP)խs>I|6w<7!bZ#{~l(ŲPsM'w>_eXկL{$v^g:H-GZ[oQ|OhBԗ.cS&7֡ҦUv ]4B z{w_>G\ SDMyæ<ɫll޺Gc-KMb!뾸Sն4ZAe_D܏R\ˮ1''> dL܍;ՙz SWFnbޡ/$*rOSW\NygkAq+C 09{SPC ㄶ}@j`ԫ"gVFɘDx_"軈6;C'+HM ,񈉉]ƻZae@lHIFˈTR|\fMf|Q3rGө -Ho7}c@a7Ͽ j*kĬC~IT=:)4wԫ(nW_Ɛ{pa iAmԵ p13Qz:q$3, ?(-&LXߜlFjZG q^Hf /ϋRo>pKy,k!vS|*Kv%X4a-(IY놷<#EGRWi^rX7tt] Lb5S>VN]W)i& H28N.FaI>EE$6R>6ɀovAkW=#TTug7U<}ơuCFʇn;5&GxH=c.HG_fw~5GtQ/-I!ǹ4-4R>,+[KaDU86WY"CThd,pÈåBuxP̯bD^~OH.>\xn.VOS!+joʬCGlR[0x㣃c6ۼ|-HbEO288;ڣG jfkq!Қ,gT/N7 SqC4pF*I^W@4ܖƅ.\nFKnTڝCvޗBe~OvlD|MKыf% @*#ԻJBH))U"g Y>s^sb}q,1G+Ǜ>(b M$ (T_Av u5fd~rhhmX;9#VHhK͎ڻd3\v@kez;ݓ*ˊ=)jdk/Dyx(>~jQn\cQUc#ty/bًW7饔$K[ٳqj7ăs5O"7LjW@ɩͺ|aRt}.iwƧ(OٛdO:(:1ln4zzYSL/n0^炂Pc9 z3rhyfm{}MwD /[.LN H6[7׸H/0ٕq^dN,7H[nv#_}Q }y.. sT2)9`~Z{#)ع;׈]`$e%<g?=_9Oش6r :WxZ: o9&޹bKy8_ݠ{ ,r^=gW њv:}Vj[zztG`s\OL4  Hə5^^޶2c:uOhJjE0-8dss?<}z ,$_8𠫺I%)y0@3K-iie$H[|%k}w+QL&SbWKg'm 9"""t@>Ae\VezQ @=u&EQqBM/(e>Gqp<#b x9gRi^/UxA/%F|0ywӺI.ޣ!3>pnv6$-_ϼy4TdG;Yc(PTQQP#cbq8 ifڶ PF0wj6 ; q%[@>Bx^_j<ӕv5-6VA̶kN\3@)g>ݘڲ]>5B[4vE5s~ 3_q4o *u@ <c`r7Zb">kѳn%p0i$9#Ҏ5}*|burZd%Nt=GG݄ۛwɀS,ZM ȬC _A$ܖascJɭg^A&HFIȟz/>KHw\6 |F 4pmĺ,~1t.K`jrDu܊5GyIݿLVQBΎG>gus גbG91hL]AR`Y.DZ%ڮ6} *u?qh;9U/߳kJ:QI p@)vZ))x ,~v2>z_Xnߜ5s\gڢjv0!MVo8*:B- jy!U"[ He[vU\m~*zz7l\iF|T\/ݜ]ғ} bx5|dD㡌tLZlvxrSU@۬3r莽F:%Y3.ܖ4Iʜx9#F[(pned4|CҼgKg.^wN`Al}D,lIF^mA.a=P$o..[o}tqݞYd}){ďbNlI4zeV'y;g E"Ld A$-nuڴ:Z+Sܰ_3nz h1hzlPWX#1 ";.j( jCQ8_5!P$0WV4kʤTB FL|_"Tv:, !i4/Yw]7EkL}~8ً`_%xqAq?*iw>Q=F|eS K3g>%!RNlKGiz.~ Z,2 W_RF6%Ins4~FO vKb$nEBs]T?Vd ڭiԴ+4?hWëvݭ+M}*'nGDž [#l x)&" /t{~}=qtf lrhEB" bho`9ڝOϿió ]m1 ioFƖǶ"ttz6VZ:s uZ"Zʏ8.*B(L1:p(e@iQ7tAY}teeEsn! @V48/̚  qai U>}Rp+PPƇ***>> 6>߿>0Q̬0FKQkO>f@#p"3apI,oRj16+yR,ΓD/Vżҽã,2TJ*P$!TY#`ԢxU.aǔ["HWRRp@|@0.:8ֹrFE%R%1S`f$7[G=І<' 7EZA"~3$/Vgd[YB,qJM(9FFͺ>ߦ=11Ulؾ"x(Y?gY Dn 2_Nd0[Lob1+Wbpqpx0{{{:Vvv)Վ߮T|f8{N $$L̤&*$ 0ߦ_ZZr_G[_~˳ٳnh4qrQY&2/=n^dؠKpQM'E @0fvK | Xp]^iUP DXWBıe5}ސަ5 CKK+< 97Niewٟ'w:˜>%,eAΈ{oON\U]%Un;(ZײTeq/am*!zR t>w65U:@,_50`4 !9rhv Asyr׍]MMMd'ČAR]nn/UB"}؛^OV3g Y_^KHu߾͊ ZZXl=`~tGbjt*,8|r~݅e;ZX 6"CiEIf<,h , 0k>:%`碱6Ώ3)Nȏ5'1{SMIJFddf;. Hvqd'!d3Y!t)2Aʑyl>|~y}_~G1^D1!˕C57w(^3ϟ?2~#_97Erj??pg7/'XvJDGEQ㌰12@VKjw:F'ͨT]](fnn՘ ǏjU#4}oŸlȟ2^q 6@X8pl7Ax&A/2=&(.؃3BP>`L kbȐrySˈE.GEiYl.222pR Ĥ\19~O¶q 99Yp"=k^ݙDJK-LrRى(IQNR x(gtoe<@zW٪ )twX;|9Wb%AxC>S SƩ߼22#1S*=*zYNvIGL"\SDl fU!})K!K7IN|tލL[[;NKSg7܋5q1ў_`0ۖ3ɗ_>;vOo gJܒMv P8rm[Q*?1)%{&àX*4QN@-2W$ sqv~ >SSݴtF7hd~ *͝}6v!PW&N1TyS{gi4E[`Tgz]2t>go}\6@ͤ7t>?;Bv2}Bݯ+0 0  ٷ||޷/dWp|?3__N|c Jx4𑡼&Cxm^&U&%4/tv98;~h}іf!K_R\8IKf\:}+]N*1fo+E<`qjn- ]h{ʼ x`|F "!2=!{Ybtnjjj5vm=iդO>zSQlU!Xw?36qf# Dp85i7y!鲄jiU50V1(hx >:⊫{eer˗jj^ 탃Šn$'ksmMf-MXt{F%n.wmVN7FDf3ąi!Ft-3F-]\50,:? 6j>t19'x7ԴCrsu Fذ/aҍW}I2az'4+Ke}o>ĢEJXsE>rtl$@:N7.gy]xn+VضQx^$[/hDZ}l=&xtl 3!989s# ZMRKJ{@a٬pؘɜzTw0fbn=? v18I'bԵ=M1s z8GS`"M㦛\l-ߡ7ٶ{E@PO P?(Zku}!.?J0%|(Kk Ԑ7LB' qі?o_/_^wF}ۏ8 7TCxWT$jhxT\AEoh?ㅍ % TndZؘ.:o;(UTѠaK%I*#윓A5nr"`oda8Nk˱I%^!4hӉh %=T?"F.XDzݱj)Fmv6ȟ)̏ĺbxb.$PhkjW0&f;Bh*tCOb a*\W[qfxh4ݨу]h.̜ ~0Kt]# Oԭ M*~ST]{ ˱( c,Ħ<ؾSJjPhE^ i _[XXo`uQSkPsyr0F;=SP萖FI`0T|1']c,=>)qWvdV6&2!CJ,^ EhapC̜i6ēkQ2k$"44 oOfG?̪Ge_Ԃmq8'{F,>#NصČ/b]߱wEϒhCyTv&c?#1ƺxcuujjgݙr/S:A&3auGkO5L}9~B.*TDuqx=SJKFpk@2/$ySW0 :YuqڊgF!MaTx&~|IFArb|rbn 7Vɦ3H%ovwGe F*@5-!rgTl>/M_iכԉ63󯗛 \GPt.?BI Ca}uQ#G9ُc`FpV?Nu\z൛I_0QcǠ a´ei{CYPL0 Efa)~ xà- M5=1H5AԫhIvK6GIS'EX&GnmY`7Ҫ--LAIAkuE1Լ%*)v&$?#IzEhw?">nLTPV 8/6l+l *h+35h5qߝ^\:>ϥ VF9V3vy]tsmDh &/-.">M$10!ۣlK U"\n7oM5K^A W;e1軐W_04ݚgH\UM'NEf:%6ԗZ8;n2V\PW"4wtaGڑZߧ,^ض6>P8&~]ԩvi';NkJ Ioם-2t7BD/0z\lR藋- >{*x#k+JpJô8a\yy{|ާqJm/L/ծ~JI`yt$Aҏ =rq[k'e55/Viw *߳ \S6xoQ^$V)Ou䉜~oO;IqI 'Vs 2I*yį??= l{XOQ0/tݖ(ł5-3jEymɔ5mofj0դ.w?`t'M6H.Aaب.-~za'& m iSӮ"SS Oy/]OEh{;L,6XgxJ_Fyqq' zqZ!ޏ~BQHj:96;Ђn \ΚET2~m 9< qԿ\v H#Q}vw92]؁FOTu1p1("?LK@6K4놁#71gTPHst w4t\6chhj8wi-a0I Xs+NpY냧 WxW^kNc}[ CZQ"sbnNqt`NK g^E 5T`OށSL;o")]ILLf7qh 5X~ə,V5apdt7;"l^_cXTTsF4A23{X8sJNE=k:jjgۗqKA.6=IzKz-X6R` t }fb@Gߧd^%A+x5s&S(Itr2QW ͯXApeX)Xt,鳒 ^BIX4%iHfnakt59Tח5OYIYxiq Tݝ~ [}Cz` =2^2UҀmu.O+ޱf!&aA3$*:oee.[S$W0c%EJ V=XZ>4B̑M0AM =rbI>S~m"<$"s4_ Ƣu]6_82~V>Ұ,5j:@bUJ87KZ"v\ ۥhQU }W9Jj8yK/F7} ”"D;I{c熦ΚևQOu]K|4w"Uk޲R)yjhiaY0#r8F7_%|}eЁ%>xBPVRDIv+)ӓ ,)|0 aÿݖ43JYBC#QG*<TnD7OykFONKiqqmKHPfR %%0{Q]?tɑ 4|o4` zb|=ٷ2ĵ 'xTh6?بO(,S LqY?K7Жr i_4MP&^y~+)q; ؍uzlEu JDIA(  ommz}eЈ:, WyYA/u9$ (~xNT8T7;FF)x qQj jQ'?'"˝%eDϋoԬMQ .Mbi{呔<$C40 zRD7Bхf"ו9$lfv@A|Dǂ1b<֩҄hTY1qbm#޻q5o7]Λ:~ ([ #!!sSSzAT3%ĘHiUو>~cccf2OCC@䙓 9rer M#L-/O뭰*SLDh_MT] QtppRP2sTnSf;q F}s7BݻƌKZVp@#HHymgpk "!(w{ꂹk,m-R*n94Tqu|@rLL`EHfG2+HGEAaࠠɕچeO LnDsHE4 Tǎ51U(:6y8q*)iLP0J''wh>;3/rw": ~ N|X\|xH-d*aR-0tfrR5> gf|I*Rdl:wWű8s,۰ LA!拯=O&q= ``+_}@<kx^Œ{ 'z-OYzӵIX?6ŚY_^NePom iϦV{؛.Эk8b ̝ڞp=mpE[#z:##Ӣ$W@ũij|k"K(6dLaaajmw";o$D#o+~gYrbe-LBPhuﳪT%V=>|Ⱥ ta MwFjRx Qtջ˓'acAl[5<Oco"HJJo MhkF+W;EEڃC?c!Au CXSPqSfjxZQғ(̨! >s}}X7Pn"VجLI= (%h`(eJE9D8@ *+ d\?f U@JLybN+0ABṀx榦7k^ތn^p'JfN-]9lNM{ۢ7 Iծ<ۜ5 l@NJz۠OE57ՑR (x3`I[;ďIԾ,Y,\ q 0%ClY&MXs\|I!;ˁccmLrW_PH"W?G>? r q AN&  ف 5E~'&ݳ<& +`:_ ,sM=0䧌 {`?]AK' &s=4ԉ`"@/۰ EPh`5{d~ DD ۅvA1]^O<0&wsǻ&=0߯ ٥"wM]^ "3>]}@ {`»0= '_Htn_gM5҇Yx #<쯾 +:߃翞}?|?#??,9lHjH |^)t5)aևݵB#I}b V}z%oiF1S>;Li$dVRZli揵2-sN%U`G有"#˱~UOFtx 'K,1\wX4v@_ ѹ~2_߯{s?`T7hbVU׊|LMEؠǭC?f' hhhxCCCOS/zý #c#ë10> {},KJ昪fqumu@QཅXȃ!JSu:HgK J_pO獐3' ZGҬ:+**|6vqyf+:RTlfo[.=xNj7Iuyt ZpKgۿ _ypVTUn|Wy[j}n;!]$%KzzzVlOju+Bҁ-aNժu| xǏ|||h@F l5!Yާ˾.v$vMlaPT^M@YP~ cֆ*]2_ʅ~lO_ NRa[yVOPNK-fpd+ h~B0-sĭCV kNSkBf7)Byak@2TwAEjN;7/'k]){NK4!C{&̼?ǻ8XGo:]y{KաR>3ڌpTꠊQ=5K3QؾhHTr~r<9tccTd$SaV֙<]WV]`s(8c&[oy{fcCrdNnn؎jvB@Ez%H٬UԢy,uxqxFP[Q GdlVH8zןl}-풕G$ϓ ޫs|q|Dwr].,*\p.տzBB2;X撪 ~%wy:i9K !;|y^Hr>QmH Uf Gl;%>xXvA "L7 INNnjj>\[vaf#b͆fK%F]nrpCD3~/L܂ v4pk:BtcziD(/'Sb[ :,g}VT#Kd\9*zpVMe (cg-S<1I\񃦀`..VyA4ZA6lFYѿf ?LL5ʹPzm;6/odzmI~# @uR }8HU '1w4׫9~&·L> mo\]50eewݺ= ;l)uLBhĻ c&!ͦ ) 2w91+Co"tf.WoIU#u}ixHj7쁘ꦗ=3_ 4N~jDMlll,;nn>$)F.r?!|0GzQvgߍuJYW;eY9 WLvHͷwk#ZI\'ߏCrY(]p"}f rwQc/#8Ks2E9GEYY0]PTeA]Toooc u 4O:ط2Sa`TDNʲO܀՟lXX}^WobV}vTKgĐh5DIƷ5/t+t, mIlx)V٭qgmЙǜck[M2؏8ij"Gow% C'~c@nUR%]tZcO<)ǥvx_|`RLQ,^Lh>q2DlBJif i~Ӝ,ӠSbsA=j~"*бTfa{܃등yԎߖI12~(,???##I煃hsW׫Q$w6FpL:-IS='"B I  }}};_F+2C1/72W\+n2rGy'l&=ZEwy]]ݗ>`J5Q/}Rࠡ߁t&;*l2Ĺ% !˫Syz<봘kCVWl#2J}cr4˙6ճ86zxX:5\+ >^10<ýmq6q+s3mJb2 /67sss{(:qzy(kggI4%\nW}|h\x2'#nq h *8=I)nOW?TUU awcQ(Jɍ =MH}>7sy_nan:YI{fLK{g9b6U[ۼEƾBZ8 % =?|[IjaqO'I"C OZxqzFV6ò š#b^yh]I/K&ĨnQE5 C@:%%%g_z͟طxX'J4_5/~ i=v!oJ,q ls7(2T_,al*P7+ nL̯L4 _YP2a|6--- blv2Z[Ho })O3옥.a۔`s{7l6/ĪE2T2uomJs9dզj5wR=]'!!!;GGǖIX@=Һ@qlLh4k :]Pkx4\u aa opͮ ζllR,$ר,r@v@]$ 7D,Δ!c_[k\ <XpB?i,ZFOZ/|<|rT\FaU/TT㫫vkKpׅπ=7u:>9 }>vV Bw9t 5v1v_P\ݓmzz_%bm+BZsr }}6o}17;j ; z )vje8LC8bk\ wQ/. ۲>m0QT(&_Zx *3gg8g^uԅIJJ\h쫹ۏ$u!Gftt0G O8!݂7f,lT=9E ,.`.HCL7'@Ht&n&.=r +Cl[Uw9ުyHLJñB7ޕۼJM{꿽> hO`\!̼yY^hfB8r@^ŪÇg 3f Guzolt Ycuh&Ԇ&)+Y=CѣV_5ip9?l%4)*i7D;+U|?p(_)'0Z?&Ot4wn4k|޿?9WB}߯CvDdQF1νoTp99r("+k#{G{Fx?; pB3~";'wT` s w"~+gw(߽ Xot7 wt*pGt_3>Y_` 73Wp/ۇ{wt 쟝- |_\?y3PwB̵kB/^ Jwfˡ\y#&f'  rM )*}uc=1E_[d$z6%!dM`X2."'L*??v],uxF*bxFz Sqg0BxRB{Vˇe(ʊkXF17L̐GgG6UGhxtIf+n4Ԭӄ>jِ'&ڶDh=4=Uޏa?% YQlݧ˭ SCCjkqM-ןkgmmh M׆Oш3? 7c> E>|^(,M}7pt;"ss282 2ygp<=^F]l*t.4phŋo] ײ*'0UR})a^Nުʏɘ$m1\+}7Q$n@}2 V+,>RX722n )UI߅skPUBɅ\=$ʷ.ҧ$؋;U4]4pc{1"8i}=iS%u`iSѫk[1wheXQu&I ny aĆ2EHy 18p֩SЀa#hclfޚnm:pk,G"k{y-m4]Q6+SL8EIҰTYgP B(yTW͜zڲ&cmJbyRwa=y.YΆzI.8xqglϿhqK"Eh~ @wcy~~~I&yxxxQQџ@n666ŵjjj"a-'^|^CI0={EL!`EmlwPj~\9 )=+g'O[x ꅢg~[YYsdCd1|{7^2v{ˣȓx4tXG"`랿W:D24ˏ8kKBhtiHuA6u~]9oLAZgoI NmRVP`n†+(vstNoFMxS:_3Wb[![+(אӹ_ 2%dZH)7b-&ǯ-,@ v }ԌlcSYu[Zv X lGhg M=yl}X;pw&%}Ǘ7#{;ppi245M{>.x]2kе@jauYEXa8B̤OJ`d'D;hALMuΗv "Fɮm#ֵӑhIMWz+RhHqT==ױ[N0Ο &R=g@8Ժ65 A]1~ M خ LyhylkX@ao~=XwvAf(@ST C<oS &R>0)` sɆ-no.҃3CAuˑa'(M<׽g ?3 ͷ  *((HJJ*^S5.%"R1+-"mT ]3\@ZHAFvlk3CwdC2k!5555+iX2Fk{YCZzZG[Un'T&;M U6@pq5\ (J5Iw*A{Eu+" HPPA"IH, 9dÐ%JC"0d^ ~º\.T}BuW *D n(zk3x@Šɱ (r/f7H2 pt/ ,7 ʲ$Q"y¦e ^ c"$~{4n3l@4tY`/^mi(3Uv"#)U4>'e!f) h(O6Ydd|BtA$1I{ꃸu-)|/Z˹SO% fs~X2CvP т|/!|s8v( X ap[&qФ(ǣxl. 6gdZnȭJz4 zy~;ͰX6;Dfr6þ։"DCtfP8ʙ jPQ^H(l)ԭDy`RO)H({1ዷ8%(=<7@ ڏM ƌ#^³̷79 E%vl1"~a5:W`)0`++zG̾~ك'#XJ1柞ȑĄմ$(9E`hj!?ެ0Tи+ iWF 쀲m;9ȭ C[j8ˆ5lm6i|ЙޮuyyYZl`Wa=8if~$dv8kA"+[]~ S w~t4󧕟ˋg;Nh-ƮF2)ee[y.6~lw~1KܶkD;Fn̵GG?~㈬@Ug 4پ$Cl-KZj &_QQ庛 \SXP)M.h}(Ӿ/b܉\gZ,jE 4. @4"Kn{\Jwύ73YYYY֚ 9Rv̿)E@Avi];Ryipd+vm#m2ҋw;mn~۵fG ۿ[ a89 X2)7k2.!>?q߷oe0ho r>en7mey81Ho7e<{e\ wiS1G?xxdϬ_A$M8TZ_-It7|.k_{C|1RQ?$o H 6\;.N%k~jڤt̂^[B-3^% fܒenwseaJaQwp8S8 ]Q%gpܖr–rGPE@*>pSo}65 |=c&+FY :(S#*V,$~ JԤ%Գ^-<'@JL.B$="SrEK2GV:yz5U;b }?Ч5E7DI 5;sTQN:Snzgd4W_k c\k$=Uy¼;B5ne> | ihdJJK$/4N`2be3%LVpm @ʽ[ߺ3b@?C:UʊOͨ -Irh{'7'/.T&_A'g-K~O:AՅnqy)$wO$4 ])7)ܿ'm)_I]X?Bڿ2Ъэ'wDȳwlY.Io`:?u#IE}BR]y-iH ks9[(iִؕv kݨʲ9-D9NBb .[F 1NY-vzJyWm帻 uf!ѐY( 4R C=D M\?dcճ~`0@)! hT`&gRo[l٠Qc|(gpM7`k]S̗ck?5I&+yerCi$C nųO~{ׯis%fpUK-FA DI\w]ι X[ DqA_Ʀ*DCZ46H\-섻:(e e4dƀ7@Jyg%s;.f__g*SͯoS:k.r0 GP.hljwP p]OwrvI( ҎX . ;ˡ:X%߱b?H>@~ݽ]BSfC ~y%`NmA>cnff4BNVl":瘟s=OPK/R ]A_TU=˥Xi'Ć@*٩+$')kurxc u&h8e+6u6w\<+{ӚeQ~~~n/_lܻJiϲÎS͛52?n^L]5S-Uܷw̫KPj/jH B/ޓeggkz,GFPh;!S^EEER3zOV&bW z0^4a} TVZ!!ͺPNL*k$40O& RHh;$%(@:h+ _pX> фB.õߥds=?:A0ŦC_T1#~L(\H6k|;5 {nIl]/ֿK12tW"'?Sg'5j}7⮗e̖mVW?23<'[6~"͝6)741u͂p2ؑ-bTEIIw֢"ءGߠXVi ECu_aн0H@o߾ TDxsIw*[=|00n@1X,lϑ0_K'O4#] N14]$'TS^~sUXIT--_`V-Ilԣ [{'b1&ZWBnbtT<.'9+.)e/pݲRj!; n +! {Wћ|Od!ބ쬬3%9,C)NDiP` EU@$TD;U~]pFV0V*<1דl{(SSS7:y23BLsjM?wNnbCKssΩ9pi=›!ҍ|oy{Tl2?7E.ԨHTF06_$hOOƺ: Wyt[6U͗Fբ3գ72#L*[ 5 4 5se{y~дۣӢX%jߋLJgҡ|@m濌W07Rc=>ths+6>覲0Yy֔$l`LVy9% ?Jg eA R~EPy˅ 赅ǟћu(faѥ5)2T<:ڻsym(֢kv;GāOPQs_'4wZ!{timN4i0zyi;FO'ҙ61YҸCwAb.MY^{}ձ8.q<*2'^w/ `T4ĈۖBԉOLxk7܇Cqu;$׻UdsTn+-,8664+͉f,w-I --N [ ꮰr[ 2HdgGByMA&i.eFnM?oHn.[ffd$8QX )Xd`rdyݴ7jX?.`!pn/$72 FQ 1_| eFwy3,fSlGzk<֐µwuu7@Z"BB H^A+a4"%Oߞrwwd$8|HG%Kq3f7!X_)r`Ԫ[>65Sў$:'*7"T ,Tʊ}Jp q<. ]$䃗:l9r)*LꟋRY4w!Qקc[[$hf1H!-|- awt7GGGN6i_5kibbiU]ܲd۪y@~L_ L[Dᄏ _:{FGG\.͜o7S!]*nysoJܚJKK3̹0G1}r#H35U[iXJVSe() J귋9?qs>?nHmpzg=^<>Fz.#^\y)AL%{}IR Tؗ-/MmH_F9YHLKcrzuj_T+5g'o MK/( -_NZR bq} b*pm+)Kǐgq^544r}&{xԁUr]]]:bMJ7\qЗ?G'-,āֲ~5k8MLM䲠@/;P20YYYSdv0Njkk+*, t;:`z O6(ihexřMMRj׭Z4oVBT=btjdknn6Nr{^toTSAAwIIlc9rL"tB,1IUehifҺX!h`_bnKk{Rm/1zbEB#{+;IH~Q}ٞd]sJ-l%*Pʢu~>OynlÓ''pImsS:i{7u{XjJhx 7xyE@3R?Y G&X(httoEe"s[҉<?4\hS:hi;ݦ_(:hS2ޟo@WܝT]{,Cds&DuIꆌLc]|]Zs q Q2XI%r#"2㳁SOMM˱,[vJߡ.P/_̭ Ciz s/6bA Xv1kT1Nj jGk8r7F BJDn]O3'Uog8иrF4O>(>ݣhyUY/ %44j\M֔8~d|?\5W5ܚTF~b2 ~R^{Il1NlW<7chnlld6uZkk\tXl;vW"Ρ8ǁAu '##@O@ kz`s.O]~*^X&B fnڤ!8Pәczs'0!v â R$F{ ݫgw2٠w|?r۟yԔ`TT ?=/412zZbuӝ'NxGi1,GnCDBR㗬Ӏ *fe`j9YY'GUTh:*.DbmA/J^0A@S;,}é%tJZp#3n̓ʒQg䆾 }ZD򲽽}h҃ 4sG .v gl\%X{93]* V2.\w~8Jk#v N\w,jVI A}p1 X.Jin+ň-N?v$dn<"**:եw1`ѱ}hj; ^~U^TSbI0U~#Ǫi33Fpu`C&)c @:NݏUT+̆7%k|hOM.ALj'5Ы j_ˁ #[RBaY_] .7e Wm|j4slbJtO`NJ9?y.T]14'ƊtsԾgpRurrLN'vՂR`s^! ~@Fa>6y)GR:&B$"iz_qQM@$yNFD/ ?MA*ZZO4 \$ 89LfU/FOqE+k^~~?Z  $W0f21qԎG X^h18ۤ073MVQI f6BɥXѾ [ZoSCJJbYz{+c /_!4@Q&vGq^oOce7o.;QT(bd|CI%AFD"WPacOB?~ŧ՜?i^鿻#~@OOs9J頔˔W @%Yi1뼑tYlƏIn5+VHٕ[}njӃ27]AB?ece>X.Gy[Y9K{ WԱ|QFظ3EwbO7alF!{t/1q1+<n9>V2[[tQT|HLJ1MSC==r4VoC%v(>)P/ϡHCky:5SolSKOGr~ ܉-^r{"C F[勘 gMrssLȨzzFL2JS325PխU k? `sDU :,~[\BYUg~l)# 3-P8F_,ϟB:__VP@c>>?\ Rf(+3:.MU ݇`&0^ e9/ W'm}oU $~v} xuZMhe,w'c&O{ESVq88?3 \؜iԋzZ:Nf[x}wG2$fun/o~_)[3Sx :|J-W;~+W&SO{ /!4ۄgI2hsN$nvvE*A0sV|ubn >_61h3c~LŅ#7V%[&FZ3T]rSKukŰ<2{s)Ơ$8{om;kh"0hӅ9J${: RVcg45;oӹ ^λޫ[5%T[:c[ϙ\LSOphh  2)(|Ж5(ZꇷT,7+\s˗WG=nwWU=^H=s鵕VZRn){yrF9;Ӵȩ)*WF *JJ9s^SxC3oc\dBOytZ([k% (o%'GbQGܾ+q.3D:.v4j7X>h٤Z},ןRi7$:62FH'D5Y2Zgpի &1 ۲ǔ6!"<-9 ʷZl~:$N^tSxPJq̭]FnFe(zYol^AwdWl[k${ԱmFinF}8f7v,eܽ-,Tf(pA[f e*+kTTPpơ}@zwd^ۆrծ..eii/, IPuf=nc } v}yP?ׯL2A$Ҍ/mf@-b:OōȫWsU]'̒=+|:8BSɧDWY?r>j 'pD9"Oah\-ߝ,ьOT ~҆4QRR%3V 8X q~x,d}&, NuQZ,W)] _<ӝ<mZ,A^H\>G&sK3I80SzLᅥW)ߛrg8GFǕwjPMjŁDڟNTnԱφw?5ڪi|x/4meoY(K,1'qU;>"$@+s}4SĎG8gW"~e-*C+C_z ލ~l?H:S='É>iʼt:'!!ћ1$1#3vzN\$дpccc3D$J^ xC1O A\@N ZD p=/I;E{DžȠ$e(Q9S=ζzyk M~v@5xp7cȐ 8\V0I_U9pW@Z [!/FHwI+ﶵ8C<˽MlxP#EӄkIvLx5HҽvRc#AfDh Dtv1s\:(FC8n:h:_.~u՗%U}TZ* Cm N222=MTIãTz j o*H_ KȓuMNNj:4ʸ&nooS}HKpap~(l/x|BE%yh+곾zPkGpk 6)">Ny o*.-))Z|*ܛU?2@} %]ؘ+jr=ꕟ??'%%ͻRژgNn !!2 T%gf>eRuPyuXxγYgG!;էs6ڃ&*OUJke'oKWPT1:eSGZfF!o5 m¹:H7%J,+=AYT 6V9x:EEͤA7N8=Jr%w](?p>).$(2ѹ7M.,KzX]jm`591M+ +ѫgH=)OC0E=b+/b/Y@}8si]ԍ9D ̰3d ZI}U܂L/SX55/x޿V|EpQO /006mv6 v6v%+?X#k7?7;`K/np8AV.~nANv_ױeSߗr]ߕq;}ޏ[P}Yx89_S> ןRXa,_۲J*2xb(x8vR`O+(y@ ?B_q;j'tQj`EvBuJ<&-(-&_|Ts`Lr&BN%tk+J^-[NCnۆn_*$]B 32.֞dzv#rGe#'lw'}hִ?wi!>+V"Qۼ|Y1.֏ͅᡡlX3τMǝ(8(Yk*S6pooiz{{C|Y;CZb2'x%~>*~zJϋ5ǵJNZlA^3dܖBm/SpVCqf[4641'CZAx~pq:Գ# |%6 -%}CC77~!óJ n4:5pYL\_[b ęc;W[n(Vtț~ne E<쭣|ҫNQ$EokhhS< ilUgh+wߺi%Ζ#ESHDڣH*]hy!^} qBb'H C%NS:'MKC\nnt4q(PiXa݊X/$Qs3a_Y+qF<=>W>+,{`7IjGJ3i?Oݧ\o9e k:|MÿN^B_E9Đ%x!6zw2_*Bϝ`iYGo]_?>MPtj@ĸ^-]n:ڱ3ѡڍxTn! {b滔{ڛ9m!VjHi[GɓuV'IʓJڴ&.t**}YVB Sq:J'Ա_la^_ʵ /jW(#l@>޺Dr~@nuӈ;7n Gm:Ze6bj:RQ+iFN(AE'CA9ᖒxD 5>'Q@-na.;p"_z: }NZ ֩y(N^C=| UV-XcDut\hI Am vNE^4[ uUmP1PYIdzc$Kk23['0(&>xH4pHCǏ4<{È/@u&la(}xmI74LMN > Rx}頾 H8Ѵf~l@6Vh.CnJ PJE9)-n8gPEWl/)~|=VQ@(, 鳰W|NjAjTV:ep`j7_;iMg녙q0~jLa@TU6̝6hWQk$T{q"!ƾ,ҡ@ ߺ| 'On[~"gC=9!'JLBC:ʑ( cs` 4lװhQd([:\K3>UX2-f~W-"LuVbSbz1سRL,;H+Z${{9Y틔irLz % !b=?@Xp~ {Ǯ *jjnnƌ28?J24M͛-aƝЧMnQ c{> WY ^Qp=1E-TT3h}]LXZ.45Bc7_9'89.`q+ uQbp7v@w.4`@蟈q~KE{'AtGdcA{~4c|Da@9]4YQu ΀3(tBmcbw1Ʌ4$ k'fG~œfMHK3зC~KV˦ZL Df"aeIB}~~+,ID;X'E{`iΨi`ʀu zIy񢺦(&J$SH kl| .?t8 V(x]C}v>3%; J]z5؀/'[Ͱ΢dS) O7r/g)~P[VtgR?{maw("Qd䌨HIbsMI &@@7M HIM34Հbs}cǦVU朵z s߾Sk3AmhL^iI8Tc e%[D(6$xwAmJ3"?ܦ}^fg&uQִ؂w>c dP@Q?Ʌ~h:hv= * }]Vgy_}5m?`$Bl8k4s߈~kTa_E2MP`&_Mj"""~_^>Mxi[GV7-IS҉>V6XV=o4ИJٽd12SyIһZՐ^WKYMzR^xCYvlI,h lXlTDM/V@mǑ # +HlǾf_xp TK + ' a>͂h'@tpˁk:^} b0#TUٟE:!^c_Er47(GPP($..Cq Whdc@E$@LbR@Sppp4 D u'&x1f󺠡IM^IQM޲F+|z12ߘxφjjjjG*{*S9pn"V-!덜މ~VuuIXfvvu{JruݸpP''JkOqVoݺ֥zy~[A[}2{xwŏ:`#[`@KA VOèCߝNg5cXoحujxŲa/ WƐ Nw;4:h/`,+.S؇cÀY ffU%ǫ o}1femߜ gC‰-__*֏F7I)_Ǽ*)f 뜔op>1." {ERP, Ӊ +N`"//uۼuiNX6ז7־Q䗔xbPb)]]](PIJJMY&=??kK1js\j!+N88 _Ps3Dl;Pz"'EHNNnBmckl}>\GXs[.[.% y嵶h[aS67mN{wUN$4&2DNtl`jkŽ#GT;+536[{&^)*gF2Mx}TuuuUl3޷.@*s96dV_$g,1l4^0}p$\aGʟN~aaJ}BLLNAB$}4l>wՠH;t#ds4z.+>'ҿRG˵Ńi"F&8_&8)ojZ~9y*Y4+ur380d_N[PǨ'(+-z~rLMglr l>~{*iD t- WWQy]GVC m,F__{{4j'vU\HC҃$te|^bǧdd{1tQt@|RL)~%{ pQab$Z(Du}Eɯ]m 8yxH6*7;s9*Y|ɻwrov.n81쇄7n)`0S󫙅hqbFҪ ;lbդ!@fscDHq>VOZ sGI1Pi F~}4ae6#)E fgΣ Tʵ3 N&z؍keiiAGjhOOi'cphZJnnW8ϬQnW<5f?n}xާT׵W Qĩ!jp(ypbʶS}UHˍoCav3BO>tV@MU5UQC$-7/L9ϴ9uAZ,Hq*0 :W٤DD\쬭33>UxwύĈZwn[/LF0=g_%ދ4ve\܌]^>>DQ)ՙ¾:#YYuwllmz{,ޞuepZh=q-Q祖Ʀ^隦z{|5Mx3gו>~:9^VV*>9-IKK {HZrS~n &I-v6LҦÆyQ[YGzʍ'$$'7<@V#//fdC `Rs$FS   YM-ӈ|?Bh)/;N :`II dZIW6j,@fldIGY#mDe逿!iRSS'&& d.;n'.Ӻq`[>=--V6yL-Ygo[ Ydn^ވƪEOͶmHzyHDDi\CWYlllb"_m涶Ѫ[kSݛ}ۛ+3=4<7NmZ؊ۇ};z"dGflbrG0M!jauP m vXL ?nc\mllWGIy vgu44qkwJPн+Mu,ZueJvymyI;wImm|CWV5/hm 1ג0WopLƆfSeglKKˇ _oJu}]?M hinnn7gG' XcҮ:mႬU]ݷz=_k{TVc23]M%D8---K!BսLa6t7 ,6!SR T&ڙ7F (xnZzk'Юy`vֵnhutg0HPjdP!!"hJO~1Ȳ!E4I>fzB\j.rP] Bl˫IX x#a}1FDn qnB#\=Wbg_ZJ*>"B@ZzjIݺwU³3BQQz&1#ҏb +©N'b}/LY{Zk <(e5!s13ʅt4Bw+(Wo~VUNP_utgOPcPwk%({)} vv\8QIon ܧբzJG]|V*;-]mo]Xpw*S#bK;wšN3-v] RPeT &iLAo0QwW6Dv43Sb8F;;c<e}Er0|Y==3> tq Nw̍O05\LW {{5;"u> 4-u^uOITI *yM*d}h&{ IOkw z(z9~8ade0ByB!e, }Cpb)(ֺ+@-ٻC̶\w`،qsj@Xb#cct2>t0@vW[Gb&3iR V0Ws޻O8E [G=aI]"W_~krTRPht :T;Co TGWږZz{[0bxk>/Q\8k43Aqs]``ߏ鉋d't! ҪG|||ޖݻwO/w6H)yQc:*7a8C FFF󝝝l;͌d.Q ifZ"eq{~FYII;CT;o=Kf~lh!Ѭ cD&NNHte3V:X:mI7r暚H @;p/wP Tx :^pΚN~qhhhaRo"'j$+z%*B#}PVfG䀟tط%) ז̕]5z8N!lLL x&y&!1Bͽts1L7'H'!K5D>>40yTl~I3$'rUyf< {hw>V6A`To^nO"醁աpOXg) hMBLBoJ溜Gc/1"$ x޺|nA)`Ch !$<DcGs [isUdg{QPba'rMn4ˤ=`tpCsS^<[l2tqahCMmO m+$@Uw!9b_< nm.w' ׼nu`]aiqq)ꭎ)-樂*L4TTp@pt{z%Up07h(>lžNWc' Ha!SP1&[;7,Լ6l;y9)Nin:==3c\@T ѳuaKƤ85o;S1*/qK҂!#;Y[ 'dg8:s{ձ8c!-pʤ&,N`,t Wͅi62ݜ~NJLLEIͣB)0|q?XsYeTf\BMr굵Q <'(g(`NAǁ ?vώ)yj:U*=ŁaSe0-/[K:Rt/Tg3O8S"0.P>(2[bΝ^PW%7Pu`qh@{}MMH@؅%|r<zfQ:W#2dҤ`{wZ8"hvI+ GMu 7Чj{jKcfx 6q+^LlN$Jb:y2FCv$d9_Ӎ.+vaD>+P##r3E]0/l ־;`סSi}jTt/T\mmY jFzU\^2mq $Jͽ"( c\S863s^8R`]x(|oi(mȓPg| _vU_yUI2NPw>ٻrz6D'QY[{6BftOMঢ়Ewawk0(꽱@8> 3Y#ȇ, 4@`l@4l8AA};=ZA+FcA}R]R (.0̍L'ۍ2 Y)yCCQc'W}Gu %jlz<)㑠j[?j2I>-Ja9Ws0uCYK?p}8*~qt1!166-#czzZp']gx8L'a{4\/a奲ybjIɓBǀ 3ԓܛMXv+c5\m%cnn G .8Jrхė ZBFUL+R`S߼ꯀa#>d89ғƾcQ:hTb1Tfd(v]8|tsqNO۷g(OGk{wHlH bt^+i}n_W j |YH%]nC90R |xoэ HmqRǰɹ+(s/r{ 6)Ep<'*,UF]T/ȶ &{>xC!kOχ"]׀l-ONC ׯ8HYwH,:-mC>  { >g5etSs ȁ{@Mo/(QސU8 sAb[Ek>]apޭQ=cm$/>G߼eNR8T+eW،*|t-%j0cs;bLE+[͉4aacXm-7*5G"^OLs@VcH2uR4ke>~f(`%{@f=N+=rjiX]‡ZII'lؕ }XTm Nl.xe1feij׿:@}{~N|C>PQ"cmm 8I:vG* E̻-ߥɣDhagie`.g8g6׺b &uтI{th,'ېغ-ڌ:~ I /ӜXC" :Tlp- 8޸|JŪ2nR0-։?}5XF~JwGġajSo9F#gîzHQ$c!ĖԇWL9tׅ8b)'i3B3阸œpYl!Q ~fkmr|}WJ9ěA$Yp<1$n-d?$#;7UqOBN Pt櫳)41'JI`fhƇFB3Uߊ轤yyhc4 ;A723wDq& crҟJC6vCL6pr4Qx\ޤ[CO#7oMyvv\\VQj ~zIӡ`K49/N&5ܲϗw*VmTijF@#]l1BjH+Ruُx%9jmF+ifj~)bv(,[HF ]G×dn|q10Cꖒ25W¾6B\T\wٸ8 g[$JWt 9d{0[M#j6W]iH"f)/Q^THռ^@q G1uP߾mc&_7 ]ַ0sI Y,_Q1(Hޯ/^}`7;>L48rH+wS+Ƀ 9l>5op%gfkkX.,Ymj`syK fbb|AK!---2 `TُsdnZڿsbY0Qݲ 9sf-y)Zj#Wbӧ״\c =:fOl;OIJjED&2o>o(/u+lS_ 48YybP ţ4P8fInlw',g-gs6症S33a(qk3/^|ǿ_.p\D,U7Pܺ".HI%& )`AyY.$LЕ☌aWrKUs\Oj5BraH-Kk#L Qȉ}ۯ ӗwP9hzF͵)%X]:FÈeҰCa)ÁLG<\ *7rbJ-g%IcT茚,9\L+F9sFx~K:zYn&I-"a#!O A,c%~/d_3Lg17p)>p9La"V/vֿP-ssԟR5 Bp5_*|EN/g5jb^F/d<ĮԾ}5'Ogآ뛚zہ:vܷCF;tyg^hyHν4mzNfTv>uz[6O=?]>!bE۾̶bW8 ۶Y甔DDD,'<>݆s4^;Xg8B<D3G>>/c ЬS@ ՟={pHBi޼]| hHNI9<[!(ZLK;;S|*rpp,LqlAap\g 'q 3bDF6{%}|4gU]._߻e? .߼{uvai6tKCHo0-Q%''ys{#܏6?({HCH-ؕy"WF2jh1k #ÖN\<\Z^ lmWL٩L9wǸΞcf&Uy1-Ě/Ytʊ Wl_WbsuX5f*EreSn-0y rAԵEEE9\\C;33*pxՉ%2G`nOK_ ` @en+KR&}6e%ĈvG&#%--[[^n?wliΜ@Qpe׈敹]PKoW _?=K*q^hr#MS:mmםơW&zQ|^+֛^ _4%Y6ɛUۙ?o[-˷hO 'ۺJɹ,k$t]\*Mdm:AZ]]]<թLӠt{h<;;!)K`zfGOT*X0KaAJȖ>iE6y(qq yV]Rpr_| 2$bn[sWjVV/u 1@8/l%fo-9>gT~ #,2yeeeEP6 W_?Eq~f1Le/N&J ùd_H>}_Ы}ϟ3D첕DiY99ӯ^؊+[k~O؇a\\.-0Ermo&doQ%I𡖐m%G"HI_R=vO:'DqO~ͫ+R'dܗ8OՕ)}o3Tj#BdM/[*$~Xՙ ̜&C|7zm ݊ NꥪZeη0J Q}tBpȎL}HI r|L:{m@J %ٸK2ue?;Yt '[7:Q/j/]_FzUDHȭ$!~}˂H*|7N wf!% m,|yb|c2QġYtQhi!le;:N2XQ<< $[n||إO%0͘G TmlరmB5[ $c# )L[+aCp~PxƂ2=Kuqqb hq#Cv=X`/xD~؜ꪘ6֞}2h\hH0oJm0Rtdtn0l ̚ڜ]ᴟPqW* lUݑB,F"ujNv c]7 h;6`8. hyHhѶv{w7TccEqN}5b#󮂪 pF V+rN4F)LF(WWUYtһI逸sᖛ[WNg38Hv%AtV87 ܞO6ʺɏy?34DEίzL4TE:By;QlwV-Cs WciiY/*z%ͦj2g#<KjSEw;No ;~zO#'Ŕ\ K3;E$,6'a,J S@,)|mg;B~;:C'ZBqϬڻxGCr6>X^^52yolG)!"pWܯz~'EIIIu^@2a ȥXyF}jӒGv]:3jff@xQ"o4Qn>)C24:~kt$5 JHX&FG.ۉ&GƟAzI`ѯ 4ʢMI}pӾDG8nՃʁ/BΎBONj:Q2KV#x֋/#Tp:d"@s0Nf lxqX;]Na~։]|껺s? 3jGY iWe eD?:s`kZ5M$Xww1 Dd?sϸT ]&?4K't$7Rf Cp.cm/'H~Cʄ%nˡRRRfG@C/WAk9\#$T[7~B>NLMꊢ+%2[Ң"ʠv:?f7䣍 /uj@ ,W*"""~B>K;!/JlAEU*pvpUtG GC}}&)zꪭK^:T? /Qjqxc.@cb:!+%?4n+9].zJZGsLIV{|gv5qqqo.3:y1-?_^?28n{^Genzv ds2ßy_~m 0?*r'^.71ͬ ,+ޣp\oY*ElTjgɂ!}a^x *޹"H|jLh49_^UXg환0tO/!y {; \$ECM;~`b-w$j4 hvvcIF}7!mK?"vtquttSuCq(G4] }e'le +)0IxO#Ǵ8K%6׃990.]\t\c Hf0`w&%:;lx|.՞u4X$:::CY7PC(n6ALqo1;'w4R?J ƝpdB^qV5  pњM!`Xɰ@L&Anlqd6a  2ߞԿڑyWI82 (kl 37RS(FflhivV^9___a Pw2ht 1 M~-> c8ЋX9~Rv'iT_B|z'?Q; +2Β=W=&['lm bd'1zX=ts񏐦7*%  f/jɎIȂ (=-ytFSƪ#aduu qǴI|PK]H 8G3OhSD61Nd8׿| W%q[GSiqI!6YR w2kR0s#Sk̹+]gbz#Vo뽮&?bd* Ch`;UdzN͘V]-wLMM]]]MLrovXx}X:rN9k /,lm#Xv>Һ#=ákmؠ!#;":; 4oRm zMϥSb.xHw`>YU%%| IimksZN6ìL2!ϐ9\83C*,yDeԄ:5"hU399^:՞\\\ƇΧu0W 25nGNN+jfb*n%JIf(Jb~XbbD€0~=eNgg+]٥kJӂL--Bu.^"xU9p5"..n96]}}A8 ws,l躭!cbjA'vg#;HI㩥h?3 1>9}n]>(a뻼g2m_<]\2bM-6^ixOP :3(g$?lY;7ɏUibٌnͼ (oMQSF?M ƿyOn~%+/'&'&y\՚2zEJ}퍬 !vl/ezMύo)ݒprck }Qa{HV0k|88-+2L(qVkW! ѡ d&A cuϷv!mCu1co/_A+؏UX`_@o%#JHNr?'G?(R? [ yNw*$n%P*(GПBbB+S!'=VK'Hu ;i:!Hf9~a?="iQ !'_O*?ΪP,w0Mu%.M^p=;-ޕ(Ʃ w<ʨtcL\BabBgsr}ct>ڴrnGJ!4391pTqzqxҟLY~KG18 Dysi(.!ACCsڅѰ֞k#Q 8fAH|L Pvf5p<5{:pȃ΢:L^7C]3qxԊWhi%[hgRcYMoW4(+ ȑ`O T224:2RN Ӂ;<$A 芎˯7\?O a|&T౹ibMᯑxzssa6{ZhU/(`Y{[֎K! u\'d\3W>N۱{w}s6{l"L+2?E|{7MT@n[ouυ___:`1U  m;̾eqc$޺y4(dj 쨜J@]rlnKIHWf[_  TuēdRص ai=4Ӗon' UvU ˗Ad&/Tkb^~qML9>\g0־yllqW!6tQm۠ :ZaÖ͛7AHP "AVKS$z/SɈ|iZ\AH |FFFSEžM7ji];qTygGR.rr>?{zo|AR*mlWo A(ajMfJ쿂_\YD] @.J^!?EZh{?n˧X 5ҟua5q8"6١&ƍ鉺OS[kC;AT_N i%0 nkk~&/yN3_QطblK |% lcJ= v˴ SHo1pI8_}e;-"dx p|ś퍀oJ`ؗAS? :! pƻIbAXB |>B,8R"Ez77i`g0+h|6!KwC\D !yKp=WʤrSSW_V<JU((X~&y Ck*r!g$#6.DlEMF駱s`Abvp>vjm=q ԘwApbfwߙl{4`_DsA^b cG10 m˟а֮.ߺi xđcq^C~4M?.ynȉSIhHj~WrPoz}B<es+l·vwMm6(?'8ݧ+Z^p $A{).`5!'sT%afZQ,WX䵷 }D:+Y;~TK栁!ʼC::ns"@=3?@+ߺdH2d)쾌&1/K+ڨ8{~VMcx22袾ͷk׮ RlenyJD :qVsbl**n4{kWK[ i[-ҽA=DG}TbEO xݸlIfʲO0 & !.;oXڟhf)5ag7B OOz J:K͐khvoHY~>{y8ԋuɴ#ySEsL\=B6 lMn$Nb"'Y8qe2dž{{?{ y.t|UC}#ag5@>6fХA*zo-+ W((ɸ[\+IqU@QI0h2iZ$ ޜcRoNUG*r=Xφf@3=Ú)⣓םYE0] .-^bpcU YZ\{n <ޔpuqW%,̖fm=7DH>Â(7vElk\Mh~,aO䳟jWզ26~s}ZoQ&)%z4k]|ˀYxJ=6{\"yj# CBgZ6T)²IX5 .V^:?Ip0hfv) iʻx{8~GHYԂ@oHFt.Sp3с/_BA8QaxʂdFt>ETqAx!/a9(K]6mKu_,Y8ۀjsK߀d#'GGmm,-tolil 4J e>_5K`.f[g+/n·DFٞL$,6þ萖i=n}k`crO1iYYL&d J2YZG&Lx00tە 4`vn.14.kZD?~_5su3K;f:uBǤ}7ohii\}37F1{e_-*^t=GybA8@ &@EBDD$j}]340h?C(--}$ێd brn^uiH!c3@z6~u^[}F[\;>ӣ%o7il9RL6v2IO4B?S!F/z lE=9V8U;ZZ"͜'3[+YI*aCsCn3+l-^4ӽN;{˖ǁk- c-ײK{zĕo)vg''#|kq& e^+p,Zu~8ٞ db&|wY-4 Ѫkf69_no+03[JXEe~&wU'thѷI% R_woٮ;C s%!mu4`bJ 7V 8m&?L*LM٣uz8ADD\?4Q @[2U`R7ϼ$qtzu;_ZЛ$EsxmYtaIp<8݃dikAr[s ^_8Ù øXO@:q! ePlgۙX)l Gdyd<ƙ/!l}:%!xm~d3PpH%Dr;Iǁ6bNϗF"55 3H`$6ggvbz5Nc+W%Y^^+5~ A8y򤟟i)ZtlY.!2v!6R2.jjkDiP.;4a7RLEg8W'Ԭ^Y\n!/9yՎ_:Q9n{YqJK;fzrcK+/%EU HpTXrtUM!F0X2h|`Ik]oŪp$]Sgjy b62ƿ8'(]fA-~9[RU@2h|K'j,RO"l*v k-U´PvrBH  Sawp5 +؜t8}o۝zdc>c%Ѳw !Hܘ Յ!!Uz퐟{.9ə'KcI=c+peQݖK? JU JJ1!I?Ns\Ӿ19ә=:Udm]+p/h asGNvڡs}llkܜ﷢+JM҅vU8̓8RS ]]9W]Da5~}*B=]@}1>-Sȓr.t7E!z31U.@׺]:<,8a\8fcݶv`IS*KN"8XR-"DsD~ <7W$UbԼ0034V!9X('u!xY6c`fTKM^@|yZ|bA,f# amEOYScGnzANƉ6CWP팉+4v=$3ow.:2f.<]xM!,T&<2tkX,rpk)+}7 :S0f#o_C>m*,nBbZur$EPr%o5a)bmGNeɸ-i,u}E) %AIbEi[ܝԖM&?LL3R;ܬlo4 "ظ88±3j'lhii)Ive';99ƸZZX(ZTH'ciS0MTڶ֌UMMaAm s` ;GFzze\Q>?qvVV>NLz,vĦ0Jb7̟r:;ȯ ?N+/]6LP\N4]exɕl@*DLPrk?SIphMVes菭>G]B_m>,~܇Za,.R o-(\O\]hx\œ'3|e'B,zvL;o&`Nz.T z$7s `^~-ws~p̂l>5axUZٔ#"Hl[u.1lRvOSqo#udMHXBX߳gN3ȭ!H$¦?'込Z|ʀ Of}>{]OFƒ[uo U$rԟ|b<[X&ŒZmU`ׂ)ByIi\ҕsַo(u 9 iۈp.m2DUJi0&_*x+/ؿb58qz8S¦3'-p%xjMGR#a&O)~g,ҶOM%ܜ`#8?PP^]#)dȀ6R-hq+!!aL WVl5c>p.lin$:곴:oރzq5'!\|uls\h8bE~>`8quAϯ, I7Ib"C*ooghgK&ͤXVF^pf+mN)'gγ{5k_A7Wo%DO gi1> ;:6J薼7Re͏\ l/˿Qθ;=Aċ\#΀JhQ)(g;e;irl&/翿G &gd Uf) (k¢b;(0? ᛋω4V;(%}7?%o?%.7b9qn!|6 JDu?:nc ;sӿS e m3*^es38?pNs?'$mbLט۟__oDi 0KωI_>Ou"[DlskKDX|YqAoQ6mzgիka&Z+މXDGX&G}`ZZgL^L>ιZ RRF\¢vs&̱z&CYnٖ'燕ƪ4]Oj 2/*S{XtИɗ>ɉ[>N,M: SM]+l]Ğz^fCyw)…- יT;l2-|̚Ynj@MM6C8nK zg@/J1 UT5il<&p\RȽE՛bA}D0,t6NJd8YR"RR#5qx)u~[g,0[9B6bx5{}2tRiyceu̖y紗"W-:s5j"*3^f8NN@< 27J#a?:-VՁ`i þ}M{ YԞ;ʼ( /[{=%6:+KfBv7D)LhƄ돗ռܚewa4|6-U=cEBՐ?+^Komb L.v5Zd8w7ٖ'x.!mC9<]oLw$; ,: co}(oLi8 ݫ-N99_77ōLQتRĊ\QPwf7ʹs-gx/_sgVөV֋]cL4LfH?|HWH*yE UD}m!pY8Ƕ8ֹ'Bր؀glЁѲagm;>FV*ݛP4|눅[c718˘sdDMfffN9}s ākb?.MMxts׺bQ@ &z>AUir.0RK+vd*O֝޹PW:hبiې_I/?#Z0H# VyWU-z }#v8Sm7 Ilv5 x^]Qto;P..nAẗC [P0Lf "po(3J8</l^;(O"A8`0cC+#C`%''_eyo5 f{724E'Ibx_Sz4SE#9U&~z[3ΤAŁDG]J#EBk*[ٕOd*j(|>bT"4s |f fl=kח|r >}~322c)Ś(^3PnKk)~l۷D16uuw-D@mH E]>y.0O^~k9q{ 1љJg4;ckG$/܏mD}2xxg[d ,.M |׽hD UK(M |n / U@l4) =9DׁxT٤C-`Wq7C&)nbAm PW 6ߠ`UO#;lp,ܙBLSxaF,o_X)-677 D34 hox2ǻa6mM]%a0.)I\uuZt)`=ǥ 2*!AGZc5RE+9 'wŸ a8)Wu KDK!g%uW<;+:1119RMV #M{!J†ߺDIӓK=/ sY)t8n]@x:6&)a_6 Qv;?lhVYϞ|gXr~OQU2;-!,"_V8 tɅ٢\؇Y 4s@N_sF+ehoOq|d6ގqwR뵱46ӕkVg}N|&%O\n~=wh`z1碑mwa̘W]ӆ2PSjRq62&ӯ&X5Fy \aI&=Uh|,f-2r+9jT[Xvӡӑor0vVO<r$6~=,zKW:f}$8oeeO`|5m-[h:m `UVkˋ)(> )zl0VH CVI!@Тݧ8ȁMOMYY #0CRܧ)]^MYj_?n%Cޏdc/Nk{=?@m)M}{0go% *ER/w…Nѐ_ If<( ib. Z@Sh@ppm{ 8/7MC V)l_}o7辋H`e"k̨8.T{eԷQ20%s%q-bs΁0wH\w;̸„e?+Αy6 4_[dtľ:Qd毸HS;Bpa|x Y$zMl406GLu c,͘>Kp0ώre- bN!hiiZ+E[֎>u*L܉P j*w3UZ_w$]p7 JVO$t?\ FmmFEZ~ Lr f`[ ow 5{ > BSߞwG'9߃#Mgo0k=8':/?JL@s6)2р;MRzEdw5ۚ>DǀHX1U o%^?K$)Y xEc)Uo Jͧ<g%j\wJ[iuۛOc TŊ_dR y4zU‚ ?y2WwmU~\O1Q aLX(Fո_tE\ڒ3۪};Kr JɫlihhM" !dWƵ II9 jgUqԏzDyvB(dV&})Yvw=d@F,ȼb(+fU2 cR_܎~ubia>&Aϟӑ1%Uu{$)V󁻛(B~!Y=ۇT[t9A/r&dDj-=P;u(D"k`!\ ǖ:Sp֍ < aN7eZɉQ˚2ь/PøUi;cLUͧ;!okѱb85똜", ȠO"o=@a'kǩ h`ehnlhvJIܞ;gI;>E$n30-|Mקbb322 n>CkDLQm8#.XG@ƇX AU(Ƞ+9䤫AfoNβp-Z6-##Fme&Cb6jCQc/;2Jw^|[Cd\ K=Pk2|i mdtL@z.wwgdۼk΄ yN]Zr\ny'b 32Vuv~>ۣV(LMvgE#ݓ[{lzFkeeeŰDFn,&%ɪzRjDFuxaEY\}`і&b?;FeM؉sGnGX0=$&߷ҭ% ?]f`?LyJTSs֗ o@F hml#@Wи( N0Yl%)zv >2iaѯ; Q(/9jZL5N(0!6P[qk{z-230X fIz\[n _VYG1CbI4pKaa~+V#gK?.K[o_ߚN6x5NFF&P(oE?~O-y'`y>,PʈyGGlW wאQ1<1_`J2f..B-@5t]Ul63Tl$-Ț'ɰ_gE ~Xxcle^KK8,&6ci4`.\ X jtr,}KѵKhD}w1N\hAyPHkjXn,kIО(@E@qM2#Om3Bʖ!_] ?mdD=Pɗɥ_8pܔ|iy3nw۵p)Nime>k7R <Ovp}'LYjࣧx* Uz*j~+3H$rW$hB?ӕmhhiWt Gˎ}.vFt2]X][x,԰a[ (6ߤfddo0BtPF􈡡Տx&!9E$*2:u啔s`wjXmʓLp }-2ϟ?_XyQuZ+"y1ucc'Z!Ԑ-E}z NN"lF^M0熝tC[ãpȼt;E*8VpysiGN]$g:ї(iF/1s lE BS Q[k􅆦vvw=st%4LRNRbx8a>t|tQqhlWrllljS% qpĠUf9:P74MS'myquaf ۜ.izhn٧yIzgg ,.Yzp Zix.ciܟ4vyJkg?|C,&8gύLaKSd FHWSsƢu{%mFCM9&mWT_*sZ_-o* }(b2dk 1[=jVV}!@ 24{XFF6 YE2KYE'm6Dnlr%)eSIh[u%Ւaͤ3fHP/z2MgDRl]R~+]:{"E%qYY(DK֎$ݑ5F1X &V^nnf'BsByفt$-R/QϟIږ{-iE2G]]s$E"AAgc3,gdLdP-,uK쵝h5TW*dAsD~>>G7OG-Qu8 qulQ8f<kXyX4̱mÏ;z1eDȭftdD٧/ͷ</#Z]'$,6$%IC 8 OG鮽B0(A 9OMEGԄsimO$iv'ˮ}gOQd.4u5K  [Ͱ0,:vDEEŬݍҋ)p%l_U R6ؓWW 0u@ՆdnZZ#젔{( |cˎJ33ch%}Tvx@WubGUyqO]LPQo9sLhc\j>wb臣uJXhH<qZD4oȄ(/T/{R`,طt}5 [O<`0/C6k M#Vf{&F둱0;V3?le~K_!F9$f$c5e| ʂ'fLC@ meۼV4-ξ!c((18wHǽ +>a8MVwKŢ̼d&SeƙRez^ ~,m3PO$-Z{ \+՗R~xHqB_ :?@yJT/(tcL298: v\m[cR.vjۍ++y@ȸVoe/n0 v g.ݐ]>"$˥ eG[o84|JNAWgc0v&I(89K@;q o(xUԔPZU<oi}fgpg!8{E})t/%QޥK|a׏37?zIu=&>gJثnt~c;jTp0ޟ^ cXRfxR۲l / DD3n]mbDW/hAzKq*ZoGlg;^ Dž &\F!CCC3Nr!QII'@@2eLaFFA11=F8U\zDSL%Dh}}:#RamO ?lX12DtX_4|t`ԓf(Exx|ĥt7u~nn6E&FwO>23N5ڎFi6ե>&F`?Ȭe-P&Z49MzFP5W0 GZLC3J8\g}s8$+nո&0$ıqO~ t0?;:9l?HִWH(/X_yk!Ұڝ:3T|wFf)G"#h#4 4D)YD/] \cWA(Y՞,ϒ y49\ĻvU3!DjϗB澁AD:^mcs]qF}K{7u|_z,`mec8-A@k*l̲zO6iǑkCH}HMT8;4} :ISϪEj9 m0ab} N3C|GV>|ʬݤ\u4qae>uhp@R/xe\4 Ȍ4'פS 1Id'Y7|T}7rc?\I:AZ6#+3UMg @Β^vm ʆr>;_h9qqrQk&+?\X|\YJaOҀRP4vag0VdDD@PÏg l-,zM+kxxy˖깖zin<,8 ,w$66MnB3{ᆁTUg^>]x\@(!I ai9gb$G# 6D̦}qHwڜ[o6't~}gVhoEM9cܠ,$|ݥyndк/f}-?4Kwr0ͼ1 )6^#w{XX~!qHfI˥6nnn6%7  נdHHoY}tpF*xF$$$ T Ytm3A1ntuWdg\QsoECs 8|'IfSh$4..NZln3{ut}7Zą|d<q.RcccK#`vl.t|a[;[PЉf;q0ݜݴfNwLgUV⭇GYqIl/ 3HEk6{ot"%C* RR9؀tJ#R CtKR 9Cy_\rXkw?ZN5[}DQڲ2%VX/&\ EOVzoCIHY@}\:*?G`x#5t*r[d@{0!I1^_oUs!Yk}CW֪Qq7-Fi< Yl/ǖlv 3R`RQ5ͥ;eP~yaiq=) }u1>dTxU"Tf~zBlBJ0ЕҏK,E=hhh`1A1LwHCEv ŁH9f%C>l UQ"f{]̒zjm!ȝq8swReGYKG/ȣƏFnH6#QqsV}U}pG;d+` <-)N;@Z23R BOqŊU͖(OGLƈ“q4TR-똍a( z0bT [OhKz W3x\scQBmCu >* Z\qr*|k&AG -nw8ɏZ5js !ּvŚ@Q|aU*ꗝWC5=%/`D:rVNSIRx{ݹ\@reO Dxj10l>fQIW:VMukh.fb<##0 [aGj|}^;]:vTeFAB.=H3F&ݽ1,?u.:{,[fu=v5fLwyY3r w'6Ry1V#PQ[ "grO݉6yh2TEfTpX7 9?̈́iЌTo RL%-P'/d(^}#Ǐ2 MX=8wj?z>٬F{ވ~F휹9"1dH!jt}C[]F LDjBm ?ZU<_I]倏YFD 3▍Ёpti gp0;"DzC>xd1""",r1fƩl{K׸Y]+ G>^>/ m·7 @`FbݠvhX; yсV0qŢΤHLq$!h!'BPiŘ&%y lw_ gR#B)_dKjedk-FRtSr4}<'3׿{.yJ+żB(QY>X-?ĕ& LZZ}~CI(cFdb$[X̶/qUJF=)lz<{=(=#mBT|?>!OUHL{r+gA;=5Ti}y?H_5@BWW5ᛖŊ+ EOjnG60 p:z%)=O{]31óqid;K HV e]#XrUdr8舷x688~kͤ;SZIc¤yxxq+F/NsNܳ"H aq$bT>р|mURוwQ22U}q)7<'!v*PUȴ  wVSk*@~luhĻ?8- ;W!ISȋ'f okY3gW(US:Q&R#{wn{P+>l⡼@Gqbq5g#%۝]r#lzJLO]}H۩tB^i*J4RO05#Fpk(W]vʛ~Ҽ9FLlfk0'jaa/_C$ \6V2yG@*-o ]/b8q_kE[/-w<#%PzWJ>Eh& ; ip?wtnFh' f<\\L>4>u$#?kS##'k,X)? Q׫`]2`ɎT*EQp"}}}mK%7EF\jP:umYٺ,asEb lb' þ-YN_SpHUOjdvHw ׶@ksTTR'RgDpP{m\V4go{uu5Ie)XWxzgG~S ">܎`}ȓǏ'h ؛ ,رczw>T+ގ߄V^d,yx2(^_1>|\?q?oZ~~\^/unO^j>ο.V\)ەsֺ]ulS{^/U{޺]k?c[/7Ͽ@5(Yӕ+DG<]i{ϑd!:w*0i+_ke[:I;Tk Y؜-&uxv6Pt%\q]2[_|4\>,3lFή/ÛWcpcoE'XROuqR.T)f@wb蓒O&(d)V)BHMGy6!ܿ3toڶ$9˦sye=qD[[GƑ 0EʶKT;ao޼ã>rRvvmEBUĠKbv@>~u!Ȭa ?}DN)Ե'cAAAO)V\%>w(##cOXJdf|b`S i**nak!^?*+0!ڣ\-G}㍰Gҕ/VmiS04GFG)ɑ]LrXyjjw wނL_^Zu~i)4<X#;[NI1̇^J:p2NtwOTܹ8:> }4O_OZ*:ΩW>N}j|+ӢuPUFe2(~Tʗzy\ 3è'q===@6 )Nu>Q!~D-c?o>~Ը*!0˛1 yҥxz2.(UMQ)BǛc>~LyvO'4a6F/Iǡ}'0a(W7sּ4FM5,6R/3 ͧ5˕K(u> Mp aN3ٱC1i9!moenxww~]x ϯHHH|§L0' 쫫:Śr_k:^dyw fz*4j;l߽Eپ\u'd4tLeyAB!q̅f5#b444Dc9Zv/vU~{4F[LҢr/ogs+srrJJD "31|E]zD߯St$,ᄧQŚlM.լä7\ #.}.lIG_x&CZQ#+/RrZ׹+ʓ=8uI﫽%;i+UTr;g7 $E/O2'$LElЬ}_M0/溆0(>Di40Zq&ݏY? xhzQyz݃x$ert-K5`C ]î+07QlD7Xu<QD%vŌ+j脌Ef)K ipqɞ`ڿVB^LÄ$lR0"}Sv2;, $K1v}qОTȫ.–2CɌΗ5Gsg-0S/^ +((%4iSC[ɏ˲B',%MY0B.w5uF k4^]`Fy9"JLZܧIt53S\,P9PtFDz4/w JiQ zi 5?U$b}uz,J}kTYYY` TEtmp:yVk*3L=%D44_,|6c;J@;T/J[O΅t2loq5@Ι >e,WQXѰsRěp`HH"f)ds;J&UkK\*5̲Q[bQ,ﲦd'>I(?md&% 5Q_FR$"MWIĿ,$| t0'IK {Ii:3O'$}%Nˎ`/ >/pf 15\$p8eo?|PR-ҷ|:2A 8q;uz_(-!P22&_O!@>!G6_tiɱXL,*uKBJ?5Ct>$ vn+Ay=Y~^M^M+ZD_vմ[iQVzEK@1w%YZ3iŚ rB~ڱ#<z)(쩫9"DE #IhsA砰|9xcJPaml+@?x&Gs:2%bE9 cYa\=qn WIͮ%{~̗rծh WsekXX&wL=<SW1M[O "VVF**6ko}yk[(bsQ?**3Xи@b|,^7+H+y8 p"XoIHٙ3]),P *౩W Z1SS b?B܁&Q__rD]E3FcN[X8QqBB; #ۧ d#)ݶu*}$rFZFg0Rbs EyƢ܇slrQ&:yӐjgrx_?FOk',G<Uv*81þjJ=C7Rt <Rjd':HR`ۻ>y?{tlZ%/5Mpڗ/i';S&0wյy%r=T!=UP lfj.Ft3'iX3 tRmM$&&#]<܊o랱vHYbIZ wA1pV"zGbBq!$m,ʪLb E&r~:cYQ%:1R7כDcU{dŽwux!d))*}r:}+  7) 1jt3 IhL랅^b[a'9fVr;(z>Bv4X?n5yi iPO}c@w(D6mmGAkyvvr-zVve{ĩS3rc|D4!{-vy`K1@C*((888H;YrB9ﮁCu1B.؏e}u,NMŎy?n_1Nc'&&"""do'iN9#1>;8//;S{l}ȩ'X:?'y< է (Or_)BQ n!(iGy~L^g37P ሰ|;P_ =wtA?O7z{ǐp^tJοUTV t<)-3U,cc =i`RX#| HՈ,^>r?0﶑p6ۗihńq4!‡i굣p`IG& V  '*y3◡.7x0azrX_N7;rn[{.7Đ6yAWpl0n0!s!/<;;?MkaR+$kW$mJH\DŽS>u2SBf=l8o̅/>=+# Tsڕ^ֻm}=؛Î}M꼸z&lh{ED|nZiiT֩CQ?gn0rJd^Xb~ O#`НQ/V*1d\!: _Ro&}=$-rm^SpgR|Sv@M _Q+/QrUT)+~h8 bݢɋdwYq-]l> +9M=&kr F@k pj,XdzDe0=NtDXW\Lm9X;={y?cUKcFwڂ nf"1ߪ8,JiJ$uVz/)H8QܯH&ch(fصFO9 +)]pV\2L#k-Z*4JclPJB "{9J[eٕHppyk%?uߣ 3Hquh{L>c* $O$Ţ%KdO΅%R̹Sk]!u޼;F8R ^?:gN ĭ:?b,P7AwX:10F$YЎK(<糼|+W4J"Em808ޯAtKoopTTIW-{gv?#W;;e℄/qW=ΎLy-$$;::Z`;5*WW_hV79iTL k`߬I&?ԗ<>G$jacb&n5dM(=)h5Vr͋4XBlHp0yjTk_gyI=zC0m-%]bR8-}҉eT3*D'OWPO_к]eiKsvqfz + ؊O_R+J9vzlv-M]xZ{Wuo| lA+!*T;x;N ΃| y`W l.(r~彩ز8@8`oö }ț2ݦ$F=:ZgQI쇍qWQsZޜ+u|ődTd׿j)h=DNJZ׆IiֵK5oJJ"Ѓd^ '3`lKe 1ڰ3uuu -}}J*>@A3-C|lm2;[;4[ІlonKQ'T@~lxz ;e',#9ٰvaK}j%/X8 <950yL|_MR&u/rrY6c+]m?%~I?n.>ν>^\ W>_.!.6,P?A;)yy~ ''{/?O qsq}<<{}S1oJ)OP?t]ٝMK]`~?,oxO CTxO}@.CT}?brS}ܜ .蓼_OO>._K@~ah>./ C>H% cP?>Yw3 0.YօA|/(aC23fyLthѽƇEQ[QƛM*5/k5=GẒcbnf9ևf GWZG=ʭ8;Q 'mfqWL\ yI18gdWz}m+ai81Z\oʯ<<_>D~lkrU8"Bw}A.G#k^ɟHV !|C\h# }n3y8R3 #>OI~~s #H.ѽ$W]_GFDÏnK* l dd9?UE ?ZSgbT-̌ S|lcE^oD eLr{L3<%ljm93fN yPyk嫟yU窔A⌍AʨdPш:#gmLMߩRAnus5}gX 85Xc& 躑%&$TͭL_wvab~&LL$煜=TյA,q(A. @MxFʈ x7ԃ]8HRuIu+^B5(JHu_/[!gE Rv .`a /6nj"#tA7; a&5*h ЏVpNkmÃ?5\6tK^]X*5X1t[)?,ݜA[.< $!Y@:̏2-Ue#pXZjOcE 9NMa?W>,tns^Iai%#2woDUiK?-}Ė+,&Ł=Bg`38twY_*Pg0`jV0unB&vYDc𿖴C9XX aցxHkm !G#.ܔ:f8Äxr\!ЉdOM/+;C)K׌LS{aBwmnLUT{{ki:#߿Ͻ|hau~[{WchYƳ E;-{p]~T'Ƈ:xߣ!nLz4绋zHlCOrB!^๞l?U?)7vMo͗5{ZhlALR[ك/E2K9lwS-3v^]?$FM߲ DBrGwtT 2wW5uWwvZw[FIwHqH`677rr~op wKD領XkER/}5Бl6Tyws]q;Swyg(%@pզ\9D]:PwfBgߗZTq;p«D>Īq6_WʽGnտ*5Db.LSMHZZZ(̧_.,,H'}ΫΚm4T n=;*r-@X)))u'i/[#O=]\ˠ\9__w)A Foe))5]bht<v VҘ$XMUW8^@'N`Fmx9O{J$=ygNP//f~7 D2'Orc6w\ RAJp|pM'u yhMA7mq^uIFl&8 xҧ4 }mG83#BT̎#ډ# q?\cwb  O5܆v=y(PrfLV/^?i7-iOpKY,Dc9b#U& 4_Jj38,JN1\S?;)!Nȅp8]ȥ[gzI;cpsL n/׺88c>4`țBS=szW_g&&8vhY eKꦷ#UVØh\Gq:-_x{ ܲʫgOϝVZh\5 *wX3y@iż(~[@ĸ؆;(hJ~p-Mȅhdq:|cI}y8>OW]> W e(<@V}$ KQ1kxhq꒤QAt~LM#Q <i/Z0( 6U VS g~uxbW7b}K3"Gcc3~(a- 檣Żz.u7Ʒ̠҅z(čȠux~FR7ἣk$:HuBe |П̈́~}smm-ב]~ /xvv H_Aו,Bq`0Y[lfD^bt/+n)}VElغDz -MQ}O8@]m(z=xe!\Zq3sUAZN G8yN[Ln#U't+s#*\ŎK$9~xef,K4V64PKy)mX㄄uO_IOuD!4aop5tccffciP/5J~zcda*p^DƷ9{~~~=ɑưXB*Bbe..b_]F 5*;b7jI.'`Hr9N \B6H_t-Z3fQ6W==(I/)XDNtǮyYRj%/Y~g_w NA\55IwS 1臂T炪Iq Cdt rI"T~~-}+ \s!hUY+]R}T2JR>/jmsEtA\~qiiDEMOeŤv;B{^a7#~ߟyΤ\b]1A2-fׂŢDYpYY}m$5~hiiR\Z:q,-v: PMB# ~D vwMI`Tfgkwhmuӯ`l"-Mna'+YlIOINMw5J=|DC8ɶ6R==p=UTp/C^|u $ږоb>cZduz* j9}B}D*qQ_z_W>q'G-e&^=_ `ޮf޿ޮch\ߴ݄Pm߳G_%i 1>Ohn6˜\"q]oF^3wj˗qOiy~^O?]f4sqqQbwAّC{m![/?evN6>z"I'[1<=#mG~!ib'Լʀݛ'>fD5*$7Y%Nm0~9Ioe*)-7g艤ԴR5Aǵ$R6"}xg=`0 fuӱ7h$X׹J2%:fff9,I))F!CCC:[MȻXv /7c>^jpis\V%pYot-(nX[y+Ht_|.: ntmldm]psXBZT?V!Iإ\9GfU>Ok###}fAH/e[׵|"uW2n#9^>H v58檉I+fQ~F38吋jPc9wg|<)(M)p[spt*ߍYn!)2DM I X u/'rpH쀦)=lk)*T1{CmҖy±hr4V}DDDfFgwZװ5hM%%|~ߤ.J,vq1ZɎ_w-Inlbs~VҥKcwI߈+ nq7dkOOx"~1o T%ET*9d7׈XjkkAd3e0ACK S,=:E=!ˤD|qVc)HN%nW yVBU-"R9Tȍ/ObUs>3,ck]a)1%KjE:^OX-YH_Y/bD\N2FպْWluwӯ=2hPG2YbRM2\cF<vFGummBSv˰,ڢ]ϸ9g.`^iՙ뙋[9/}&s.)LݺRiAr-mH/(%y%FMEzXEW o젛2x˛leYNC8s2fV5MXg0a9sJ?;Ԝ (矈Njy#՛waggL MWSȵvtD)-4&#щʢ/Dm/cZ!{бG6UfLL3_5tրz66M f}u ̽'Ϟ={OFzM oE&+3󎝦șxS4N5`&E612^eٗLrM+AMlAT,m' w>ȭ 3NMSh057編iW"0...) '}AǠDW"KW-tM+tڇ(Q|{zz&4Zzp鰤t q ;zp͵I͆1p2RiXhsIoU]]l#n+%8u:u YL`O|"i7,\.dV$d1ӷJN(zcdmE֓Ĵ\\tKX9]DrS wG̾Ռyc_aIF0aQ۷׳Rʍ<❉ FW__I9! Q-#doBV$esplI3=Jq4pUƑys}wݿ{=z纯z~>r1' [*?}t-ul Gp8/W[d^<{N{kT':Y`\Ml =w`_& npΩuY9R喸g>8Ckx4me$1}ej] gv{<7|eo߼hk

    JuwL0UnnJk?|Tjk4 "Y\}YyV7Zxy޸z4smDaݹg1 h2gSxsc/fScOϘt2J(7p-z 3)>8sČ c4G,MRޞ;y8]uϣPBx#<6KPrgxZv?@( }[Hns <`s˭=,^=DĢ/uzIP*+ozH=z7{{iB!hp+7oC?0Qg3k'upU JWݩLS .pƾB/×cP&oDSSCK=Cfnd&$iR_!!&~銌cܾOᬂF B} bh!9$}ZH}'G`L.|j9(B]Q xROܔbmuX nGV؝ _:Y:sӧi-0Iꚬ23wwb]e_LUWwbKPyyS{)FHwJM4^Rl>{>U/}E]7Ѫ UUU)vWi*O$Zo`ۏ2ĄzRVO8U>{ B*}t/TA2%3߃=Rz&D]a3ocYf%tJ3zw~~qᘊ+ŋ떁DhN vZrMślX:&y;::jh!9VjͤB%YhVLIt6t [ïWکڥc$Tu7jF#2A=ngd'y拁p*=S, "F$*O}%0}Fyw;Yz}d&tX$]N"n.`yksz{;*u!h" NnZ̢t^/#!i˔]RޓGZs'WVo%Tp$|il C%$% o_XfpouqDG&LQ`UNxeTKYJJAeH:.fnj"X֝uUUW GjZj;9ᇋ*v_JQ.,Mjw0a+=][5h|-))MmV^nXv`[NXz{{?ލj`),.ŠA=zͦ.TR$#m} -4EgϖB "S͛ NjTμr^O1Ϭ6e% VB ׊;o_AZb[D𯲴X-µbTk2[FBU#;?/qM144?kෛc]Бtk'O0SvvB_ѣ$][_Zy-piI'Q5խFb#Cr1ޤEQD|=i-KCuConllP#%ƞ;[23דn`ddr{ve///+YQ8UAr˜\pÇUW s_0I ete=)O &*m4;dQ KKK[ܣfz_l8W)sg.\WFnn V;[Kf 9\D4 i-bE :mxͷu)X.s\ 7*>hm0n=Z< beAhޓ[T._h~M5HAC?׾_yZ&lrɻht^6*S;z Ũ4 >҃x[@e`#$MchA<<7KΓHql|ѼK:rdm奥$#[.+#5#rq3[ &48U 1  1_LkInCGȡ.FMk߸vU,,{s~Fw~ЂtĖk9> Y"20%WTIΚj[-w(vv1Ϲt03#" ׮ p/vy!/O=\h]n9WK]5!-.kGcgtP6DDD-[ӧ6RS8'bFZK/$O;YYfJmj ƼtzWgaV Ǥ}tzZ R:>[. ׮mn Oy]+Qq+װ7N%\  Voӥ̌ ) ^\֧`i8oi ,i0LYMϊp6v?W[3M8?!o3ՎZ?|Ъ#A'-糯?oF̠A =_K99," jo>>1N.D$Cm# gM 2?x{^n۩Ne2<_?Lٝ9НvjUǤp{]6"FnÛqc˖PoQ$cZ*LЇ}U9.T!ban%N=HvpyM_%N_U'"X6+Wg8 fE2"+C3*XGaK #`Zpn hlWUIVfħgEj |MgqETgQO5v&ȆڢDem2 zEe4 D&#w#["m0Ջǃ\è?x{J`u-yc-N-XH@h)d)/M«ާphk<^ka.tַ'N,VVVV9 K(K 9FF"'\wj- |#Go_VVnO]nP}jK<zu_U.WK>U`XkoT*4HQn(1*ZlV3z!T3u===7ST;"2 pr r3ZwCE  ڣ ЮaZTA`myk9Qds$rxl4?|O[m4Aׯ:kE@VWWQ.JT #щ,}TnA'?>zBs~։1# ws+}{zI|9m̨ stH3 m\pʷwaf~YWX84%erFBBRVTUn( )r|HbgM[!Ɂ>~O;Ʒ&\dp٨:۷QTj!~u`٢b}SSvXvL8 <OFKG,.)p›/pqccY 7 ݨZ7f[2(u08k4_fG!L@@-x<6x%9sxiPO@!ZCyҁp&%%]YO .V8'0/}"5*&y%eqBY`y^r~S1Xv/̤':1@J2Q.f$Y''l0P> `dyd6H/.14^}V;+R{O~LxI&&&0KV d444T3h3 uȁGWd`R@?v)'nKnpPVqESW?cS !bz17?~föB5D-Fro[9 8d'{hBXzBV~6 2Qӥoیpi`㮏˹`eJxb2Yf-u1Fjgi8v\6ͧLw>0e~ }E[_]Aw1W44z{l/e_\,>=";FL "8}{͌4Sh9b O*R!̻wSlA`ȅzI{ӡ()k;b<'!^A P#5pj^,Lv9vZs? F] V:>n>}GЏei~>ƍkmr#Qi)7$T|QaajM?ČC? 0 QO$Ӥrt= \W5D~BJ;myxTcOKRXpA@'ڏ{YPĬ}ON m_݋j?9θF% ڟd9:^kGc,`3 =^_;}#bc@P=<;:z}nHEU #q(Czhc.jO91Tf.3'6B^_,O 1CdLJl%rGpICz1 f``-1LoszȆ'nB͏=5=z]Gy$(cZOx/K=@5ċ$=.ܰ}Ӟ-lO^bd91oR3%[LI ڻB? ^vfi_zIeWA(hZ 85fntM܋=!?Cp6x}]%}7e0R@A4N<c1놷wgo `~TbBx͏JCw0&o;LVTv>>E'¡Z<ٮ ?=Pmhe NT08݅{hb0G.@] Ó9S럜Ym#o`}@  F~k쉏N|0U&&齭9q:D޽LjGMLJwmTֲgADdXj`>BknoV4)R=[ޓVp]{S22o%uϓ':= UOiTPPOW%eՑ8"BM٣U?w1nd\nAvgT!:U߶Фr YQ3^{OoGF~uF(fhRK$RrmLxg-W=ߞ~%Vz۷ou۰G&@`"s7\`|T| :5543K LUPP[{JH{`6ƥ'byPe .CGڣ 3;CCCqUC[ n%cغ spi揻?Rlɮ!| d^1=bʡJzzz]] K3>3|q4IXg]A۷/. UħhK18:8\V3Z@/= =AujغM\||+t{Z/A'kYh=&HJ6|@֕+9䘞9ϳ3 d N-*߿~7^WD~9-$((&㾏(ige=}P51hanߟRaP*[? c?s}6A(R0owڊ^URQ_o'/o_mfAn/;/w~+]u{E$R-*m+N.8s ҿn/w(⟬No+r@J/=+, /_#ןUC-$CTTNGEM2>00$P1 4 )loWucz _d(8x.[ ԂicjШ+i$,#CX# ֳ %G3xxmxxG )ϓC|=,[" utt &3N:\n>N.⡀s)yz^4$jV(MNN..l=dQv%#ruM42%%غPzIwъ omynɱ³g>Voxy{Qh511q 10j7x}o+'o: jkkV;OPio/)?yK3h"ྔRH(v֐9rL2,̙ MWUh%&$ QSSeH >=bTdZvddd%ϣ~ %Uqy$7 hrv4y{^ɓ~Lh_O-p.-iry?镩U}aE(Z%3a}aQR^(4J &1 vNmg_ٟjfbckgCfFOHREbdvc % PSa 5Ci,? G(tɐ*- aYas&3Hfy"9=Ije'P.};/DD nksp`M-QȨbӝ;D 7hF.9Տx(c4^JTK~!{QG٨2,#뾅 HBx1gw7JI1&Ő: q#iHc9L䬇z(5iXԃ&il gti&FݷdWPC̯?룰X,%K] PǏŹ\ 3;X+ej(wR_v?t{=B3=V8 \~@~8X%Cp9 ^ @Jk~(ø#XU;(1Qu15P`j=33w>oÊRL,=wuΔ %vo$JC_hϤH1<9Ϗ6~EȡV8- ,~d맫ΉDx⤠wvW,{$j3 \)C ?PLH1-ᴽØK-V89PVvUZ .zfx>H!疼;04H8A7=paP{2EJ͟:%Q]Y|hae]Qr8g/C9'C$^am0_RӨOy%ć]^,_'3bbVewi|7޽[`Mǰ`b~) ǪA+_8xb{CfEo$?u'+Ԫ8 aD3 /\a'kMjtj-T! XxhCԑT9 3WY^$o2=|͓:'{MYD"}e}M2F2qB_ZLJ PB((/qTNAghhܷU/fFb6xk3}V{3!c^s` d@x`h&z7"#_Pc e☰c GdV$W!D鬵z, $ӇeG3'1E+U2RRx71srNb©!c m\2?~ ΔwEC(5*'~V}< g_B=MHM]X:q( EsB箽!8ӆeL^^^UUfcki+YɌZ*鹚LW]^Yd^pYʌ,CT~2f^uTC5nE٫JJJ&zȆtvQ ,ö]>jpo:eF"LZVW^~-,xs*9&.7Z 7ҷҟV{k|UuUS(g{-eLb\܃C)`aMu5^BC8.I32 a$r׈3{O3aODCRŹ #nEџCáRg,жY+)x"/߼.4!XpjdGPYނ@b2^nqtU·!0bpAW]ѧ!Û顺`C$E!LmRMn)((@y#`1 "ˤ#dU8PPD ȿ80d4"وhNλH5K˟_ )ŕ q'HI!X ʞ݋gFy  l 4kА-%Lx͂;L F<;j>=Zo,)1X;?ujnvksi=u4S@UؠCzdrzջQFbv{Ww`n;*0G5^=?M27@T2}ș=A :lZx5ӳq&T: axP?yVC)7j.է6#dyF&Pne3CYPA z@ɦV좟ӼNaH?@r8Ad VWSbВ:[ΛtswC禧qBNUzgnf09\`(6W.36ѥ;Z#o֝H ᷙ09GԘ(XV'M9 ussDKZXbE^}&<->>g r|ξy K Mj R4T65¿~xgv"ɕ&Gdvcknq8D:0-󞣙_zoOw|ּb !.Sq66Q rlَ\78'#heb(oG)hhq(uƹ#_ d:99!H"BpG_N!%M=9Q?yt7K/P_99<:Z7\?CʯVT*ە@.H7]QX\ƗF &VrZ_sr+)''cB$ɗ],GM{v^6$*tZM2 Q̞cյ"GF8p66 )$%9ϔtLjA*ml*cT炍S eyg*K΁D`,!ey75jI{q$lZ.X⇦abJFv<YFZ:oϥ~4mYaD;HW3GrӌdZG&)|С̎haI&n?^:.m3u-(*;/a_F2b/5IaFj2loKβZ[wŝwx_FM9%z*}= 1F3Ae{#B=s5fco6쬾&˹`47wT>8.Pa0!#Z|')#)?ϜQΟV*+MkU#?M Rm:m4Hu+Ѝ_ hs񻡋-0uf"w;-M3D.Vױ(!Jt&u_@!]Xa7Xm4E$ uT6~W"돦}0ޤy1O3jOQa>4LR}y_?+wB!ǰiX"4fsO -=/F6>U|y*7w۟8Hܴ,3{V[\ PbќxȍBQ;!鶍ys??ߏ#$ ~}\Dz2jn{42}Ժ䘫kg~֯p@/9^z{ŭbD*/iPGsEb%c<ǃGaz"O]V>xXX8ޘ5:5AumO !*{hfS )ns"%wҞ h34p<&t6,I"OmjM(KygR Vw)f3oPR̅Nfkn_S\EݼM 钑in 6O 1Y 8?r|e Zปj Ȇs-;Z=uvO/ ֟r5>q_ρaDK=x#[%(ǽv43Ӹy?0InRr'vdBa--2vtnj=knшj@z .ENx mzHF?*,,2'=Èu!䟷W:bۯ)3A^y8}jyIM\ByӾexx&]9M\\S{OLLPOT[XY& 31qxXحP)T')բ*+:x˔v_ B⎟8@tu$Ttz,w[Uiy?2&8YpsӽaV_-KY5LLamVPU`x4??R6`teLW" Q3K[uNj2_QmzZ˫fƍ͏DܺEŵQŒ.{pnHsM77wo_|Ci!i4Ɔ)5=%''B_+v\8o,(,# ` ޮ8=;+s}呡!ͺ4.M#[̈́"iap;!n?[9nB7"6d9`u2^riJJǣB,ʷʵMMK})(ct*~!Lh<^BPn̋UQUemeeu)D0 zu->>c.;3jOgl ugzUæCH_NkOW7?~h0Cs$ѣ^d`U`U=呑 ioW,il<*EW6VqE]lj뫄!Ulx䓤ܿ3_5VWv{$!e7qB2{6C̱Tj ã`.Ny^Q!^`|N7R1p8mpH)ᤈ&pw!5/oͼN?ZCP"l7R7MTr_q7g]ܨ;Țحb]jjMCZ%{@Uv^Nr6d;:Iir2& YQbX xOuCQ^ftr9ˡݢQ>xy^Tf*SJ<_ _[T( _X &dXnccFT01c]VWAp 9RO~lW5oE6H=Ur&Er=m{cAA}P ;:Gy_HL}DX*RKve5~~Ļ} z-*,T*rCk&Eǵ>i;fch,pOa[# A6͇{+|m|EVfuu՟;~uCO_DŰ1F%5ݽP(U+w"ܗr#'Oci /_Ws{syς0=pN5?Nޤp/ rGMRbR*z_(,( 145ˋ5]njzp?K!x4̙3+.z |QƇzȀ۟܀Eڡ 1jp2*ydr3g06[9}䳼̐:p!C(lDgKN5C'#ϟO?WaVn vVdg@O~?abo"8+t Ͽ!0(ŋ'^'vP'/,[şu^OG:şu;(?TAG:s`B0_rNACku8AdđcBԉ_ Z  B'uwh ny8F O6%?Nɓ򟝖 k `Y>gaMVGEcC<ey#Y5}L}"3]`I᳿/}.nS"d:LҊeeeBO7Oϋ 65 FY[BɭyF"oKtȁk3⯿2Wᣞ0({FPmЦT Yc1wU'^,,7:|ߦ _~ߨ.W3cν܍*(Kǀp*B߀ @nX{hgnAUO2m((k9z2^dpe8+1%]~}3b0?l1*d%|/,iR(|n=[ol9, 7 kΒ6?dT6Mny~|ustvm/&}CŶr7nk+C.T!BDoj.Jqi9 m=2Qrq$ c|iMpD}L|&7x;VdPOf\>t)c\CVϸxW%9:= 99aG0hiya>+T&.=0 /`5t=l/F¡i&,Oו =:VL# &A6i RRb03+\NUE;4~.Vkߞo gz/e%QQհذ綠վ6Wcs,|$AAo%f5|vR:־o ,<$,9@91@?Cxq4frՃlt`j8s% EV]4ʲ"K0&b(i9iM?$^`}}}"׊&N {DiXYRڙ5[SX̊1޴j}6"k:4RNƼFn&q^u?rrCo=Fa!F}HE0י2ߥn'ٻ%ũOy7emÇ%Q%Nȑ"]D:\4⺀}haN^УU{*ftolW?䃙Ⓓ nbw'G ,Ť=ݞhS!tI?qv⪊"\A.аV|(~ɋڄP&Y@'GE&(*31.MPtZ/VQi/iiA'Gf54H TQGDٔVA+>TŸ!t?cn͎Ay7Sr\{ﰦmmE HoҕKhRD@& :""K' " "%"һ@$ 5t=s?d9kM\:+OkǾ66pΉqvS$S>+(O@,f% Kp>\NVU,|Nӫ)awqPE]x1@V1Zj3ܠNIJb& `mvb`o8tL!dGaϹ'XWR\tr<417p!c f=ooy?HBds&a['*)eP pRԴp&4EzqQ5sZ`p@{ZoaocNG|nt4?1%CU }Nc 1? j,ZBىҸ@q% pmm-ϑ+ay+9;@2/Eվ3ZWW$an3Xx\#y5.2sKˌ>|į.$ȓ`N7GԎ A`ZXx\{"60$XN7H{c>J8B!0MRkԌr,o<4)ڵ1pt̡8.CVwWVWV`c}s3tlt\ܱo8ɞ@GM+ʀ)AwGTNY,f"+͛q-*Ƴ@3:C^^-ì]SD[Rv ,@4A˾,v/.[S`9 vI-A}Ln?v[XoD2a!,}@"vSe*N |R_DLbSR~qgSl1igڗgqDŽ{GvSPPCwuu^PL ˤd&2TRgl&Qd@W7?5z%KCXLB*黊UU&w|M]Y#/HrR꜂530O楯bz]UTqw'c G֐'U7]+D3_L0]\Ӂu72,B^]j#6fG"6l3a6KFpimY?#͡7$ 4xkʯ5 4.K?;yȐŝM{FO7h-sՐQ:~yaoYFEaA,`M"/&#^8۹z\ }} ߣ{Y1l7쒋LKqsuB,"H%5qRꮝ$,gF!Y\Ru@X s+TJ}8bHz~_Xt<$5L/g􄒒RwF<"RRX3@K+?I('OOςP[|I:Pn=1 4onzdl)0L/Bߺ$ħU!hnf+ _{~ulhTSI]>vDЙٛ֫0q?1Guᳶ#YK Di޵-zEꈈAީAp60i*z~!{3SU񉷿Ι .r l e\}^3`s _yFɍ_i?籀In˷ {ˏ_S} @ Q;,\mB?28O[xBUL^u}'FY&Prp֣@3J9T 8}| a&qZ0I5@w]l,T=xpiU)>R}K[Y]pLz =m FOr]W{j1d܄DDkm &hn1zagNtRt0[]h 7>lnaA>Z!)ٱkveUFdSFF1o2 c#MN[vo-FK`mo>ne\ۏoQlMlElt鶾ոT du5b4.0 ++ =6@O|.` }4'ˎLwcAiY pGX7.- w鬆4Z+{'{|&{(ܚ߸wUhn:/;G#viRzK@[[:ZoPj=S %x?ɉ< 9)z?|؄1+p!l \@ƚs2Rͭ^"K^ncZ6ަNONV"kjY!JP[ ܅s`Ed $q%JQ$& SUV |b*''Xo[[W@yaDb'<x\oXk\$̿S }8N>$<!:ٞA!&Y4!v^^ !ndʕOJmmmIE5v+Km^vBj뫍/+ zl7a g#yDK;ʠu`a ^xczM0w[F7-n <ӱ'?{ ]f ;;;E`iT/逵%N9ZS: B+!$Xh>T.(iu$áȐC꫘D碯GB-󥥤P;vbuU7O-w_-"#}z &:' l-ׄ4@ĠBdڄib/(@@d3605iv#7 b0@Dx[#vOҵO,m<.>.KS|qYwi j0Fӂ-4sc|w89K^Z+oZ]):pSq399}srk9NbNtke59[.>}L Ox IekOEjࡎG˻Q|I4s;S#[BZEaEϛDt@x7{ۦma7Zɞɬ~/IXkkH:2;\ | V+8{etx{]^hEěg6 L騨R+2kO!(Bו[uYz)g. 7}6\}Kc20rOz+iZr ]:.jP0X; 4&99]E4!%$y mur1rrr>r0Zdw~Y'M7(7>\kaogjZżg/-% m05sĠs W{~}6>I1"׼<dUdyjd"hLƍZd(C=|-ǣ;t?A/'==0[~K._;B~+jVf%jVb<<f%jV"fjVu+Tnnkǟ*T B+TfVo֌o q/_xOHׯD7yhpv+E+ iC nF AR'yD^y'CJ\O$~B[$,0ih L꘿ɳsz{KUP'O/%D2m&:_= KnйԊkL'ix0='dG`}}7]{un288hna_֟u`h3gK`)>+a[ϟM-,Dz-J-?M3$$5 b eʨhQs\^bnLL OA*}[ )))ge&---L©Ø6_ظW 6D39)_L9UZE# eTk>!0>%B`j`iDesOԴh]@Pc`ޞ 0؀%*!qsy@I~s`q`Wh-楗BS6^wo;>x<ܨe궎͕\tdf/bO(55i.îYqsah5fC ǤR4Ep68.1x޽{a0X}) -P%)[Gx ᰔdH1ٮ>t OSѷx8P{Lce6 \kG*.!i 8uo(vjbbϵ%oz<&?tq }xQoou922bu{n7y3Rb)eMgBVٱem 7UT ꕛkրZqU\~æQC?;֠wSIYH=l}SE 0N!(3XggX~99Xb=09r9RJ&縯gS{7'jCCCR:ڳcuv 0b+@r纹Ȉ4 Ͼr+/~e|#3юxyRs*,?fZcˮ sn2@70:qm5s;>'>YyajKKt$}I~mTfسGBsCi&:~K4uzzX)0@/%&ȣGb"c79/%-KI511y穈>&+MUwWӡВw.iۦ6>n3EvDaEބ Gp튏HL0. ci?-waȉ"i9##-LO:¶vvcI>ީ`$>ϝ| :>0i4i~ÿu :b#k0fF)A H-;3("cg 4 NJhB7FP6ay6kJyx_O1AlW΁k|?Wi)7@ma"!$ig%vCTm\s{䄔.s_FY7_(ELpNazv~>O*7!^U-p>Z'"WVH쉥ԅaۖ/^&bmqoTgBxD 7I?tα챯(un߾z#',0y~FYRaJM]+b_r|Y@mE-44ox!kJR[ȅKSy SUUݛ`n7M6>\^18Փ_mB9ғCD&wM2A*Oπ|`Ͷ"Gwnnr`j3XX2;NcWO1T=-(Zae )ρ.v=M14P׌s}HnGb |P.u[tsU(g7O=Hzշ(~/Rk_)Tb 0$:w6V"7ptE-Yyx!$jǺ%"%&f&+A%Hɷa# t[ڗcQCxנ(s]᳷TUk.= 3ÓxY,O;??τyd3` 2!mm Fk|q"GrMR_k{I^}0VXF7KPn** pA8 #ko*/ge$Cژ|-V0n;'&xCq"$ܤȈ~O!)++޾Dм 4]AMitdXGwM` fČ<% V@W$J/:C@|)/t}ir[KQ٢q>H.Ϗ Ϗ#-־ +N:^Bv;f RPk~CJtb2!P:D[_JSg@G֡":_DSZ@SFhށ!6hvo4Q1pIqɺF <ЭI@,zvĄk0-k6Cc)NrX9z o78F)Ca4=֝!h.UmQ4vOշK.B?!jmT8 [}4-l*&6(wWzT⚖oC$9 HH/ q3}tN(TltV]wq7P M X}5 h/lԿNG[9O 2ݵm^9C4__wgR@xn[ g& cCҖ c=*Sҥcc@q 1u=QWW!^իF4,PW,cӲ|W2bDH딘!Q(`+ ^Zd5IY,lh 5W~jIz/U2f QGs-U899nghUV} 24ɓƦ&QiCBS&r5ms[`tqԨBaSp ea*p_Ϝx RĉlI~Q0%.N̈́L7aE #>{G Q:D-R =M]pd^J4Ilk+(նk'0O&np(1ӀVk]ɝ\.,`;Xi) Y]ᬿ㨨N$QxrM" QzeG?% LwL vJsjO Q @Z%.!}UA53/lLX*}1U#HGT쇒 3:r!EX8~ۀ]X,|d̑39󤳳eo`Os 7>B#K>e$W{Sč>g̽9mw|ݩLes?#& hl԰" V\ÑLf ]97g ^UPּ\Qļsr k޼%Q^͆}lBcgi+w#KёVB+TSX]yi8Q FߣH,PF6!A?pzʾ N7F+/WrPoݽN>xڷf,L׹``_M(kk?"&W&UoV\Ue MO(VćSxLXi@BǦ F0! Cd*utæaMe#f`fL7K)ԇhhD#&+MLLF܅@y{ :!+ %,)I 4@T%_vhn -fcZR=`օ~S*)A誫la,ADP_=69 -l`9qvTz`Ff{팢"U;s33 MMBB{^wuRY+`niOqc$9QGGK܈ D"_Ѓ91sssgk-:?ض#E1Ւꁭm%999ӀlӏCCp@#kkkYYo\>~ ohdJu׷fvbQ9 l C8K7W*bsJ;aXEFJ:WФg&-(^Cl;t@W0 ´< ydeS¡ vNm}-{@б3&Ly\ر;7`Dv;1CV.n[#Fvge#/:G3Z=ո Da-9WZ17] t!߿Q ۉ/1)#K3޼L7V_.k'""ٌ1'OF 2{29FK4/ ^GX[_/w#zӵS|[mKawf$$$2< *'i%~(9I~Ix:el˰BDOyA {❝v2v鞜XH۹.]u4|t0K쀏ㆬ-nܽƃlBșp0YWO1D{{98f~hVsYUg?L[ V|pyǺȀ#4.U2W¾ Ͽ0r23qflj 韔g_#cW(O˽_wN {S|使e/o~?OC'}Uv"p{OXo??m'~;aՏ_TZ?4| 7>H~'d!t /l܋b~y Ar9գ]rW),e3b%z\*n%Qd5V<ƚc>^$ϸQ +`0:q{ 0\O)`xUUj{4ziđ1Ͻuzt$_x}UkBz3 ,K鼾׮6kA>A?z=ކ?h8 ɓ\J"`蠳=.;PyEo<81ˈ|_ˎ *뻩lڦRYeUyQ/*{ F];.[u焅~bFB+};xw"qyFtUUeyRVմfف@fE$&!=^ZQYo( =M \i)קgъU䩋UYy΃>i\s&ɖ?'|fgV~>={6K1  ~@m W;s"sM2 S G)cVŦCl!2GNvE`I5dY9mAS<@I ij׈`&ϰl>g iAEӲjXѾ7=ff \N"&41| i:h7QSK"\kqkFr`eXrZ"Y4kOOn[ݭ_5uu$`Dv%%0sk1(2>JIGy a.u@[[[e./':aTyKU2,fKP *~~BWݹXgc` .;@ ϚMa˧40vB3u6hA(g4`ی/<#d&q'0; U|WZZe" Y!Lcl(m@L~L͎)?:P2|u,,]&Ϙ݇Mkܜ@.Pޮtx ָ"!"$S=ip>02zv{ ;.?fU_T`R{L6Fe}tbmeݲ!7GwEHݫ`0I˻z}J/V: ,w |n^tn_F>ֵ]{"n(źY^maaaccZsEqYP5|IUTHʥn &;(9hWY'`fQR;6}I)pJ掏rϣgS . toMǮy պO~szZhpAwHp'&+5 h8b2屰$7_~-2ןv ) Nn6?þDرxHz&TCrnEs}$F$9[=͡yj7M2q?;rԮD6eZ@ e:Z!H8&)paʛl$7Yb?5G+ԋPw@+ІjwM_xIpUvIū> tgc ^{ּ/>:!^p  ]C@UPy\ ܳm7B%lwowl6HlQ?Qc`իw%%VB h?8}%%Owu7HC;::4"(BV2R|PۂηyB@LNNN*^3UhG}Df| Q;QMO Z#Hè䨟F2s0>0`3~Gow/_fIiw  ODmMKxg܎ ssdrH3t,WWWlPjw`OSHfL~jlF#P;v7,%e)aDB-A܄671,(8weUrm.慠>p5R m3Jph}30Hstx<Y)B'3/2r/NO ̙3;c?|:X7,VCRn|axxxR_ ua (Ih/KfyG-*YD7e@*7I\#o͒XvKA@8݀BXHH%h$f@}}*3B펥)0\Ei1U\t=W{fݖg+jF&$?E :C0Z6+g5 Y24NKen*nx͟!y? $>dr̶IXeゖ]V!s͕Ԅwf?[CKjZTMadH5Ya,؍w ZL_\nžt]"6[ҭ !Xax0QXZ3!.`a0؅Y]YDª5xM(#F=f .ݕ!do|'V@@\]gna(}{p' d= i|Dpa&k~BVm"AtocHdan.20qW髺:EM/*; ',A{, `;#n1t_Cd2a`[4VSnQ:+-%-V_m&,H5p,@-vr'W *_>V|Z 1bw_Zoe靣" RF-h`Ӆ kkXe󿈀anu$\+<\~O]"󹶶6goʷnX%zJFټ#V}7gֱ1ay=OlRPQqɪ 7UI!:>f4SSOEw{0~-Ӓv 3  "eu4)l\Q;1KO`odܧ6Yo7 ]m%[l$:y^꽳EEwp}EOyO{\A3ui1랿 ΂X֫VVV 7$g^i4~ L2 3ר{wIF5e:.>)Kmu}ڷޫeh;S;HEͨkWR.ndAO<,p|Lq@+ N1_v 9>}[mAiwEzveE[G__F_xfyɸ˼^G>)K UUnL*Hp+!D{8__5F{z T7w["fqq+B_CHsleӂ :#ʂo3q>ԏOzD&4OtzZu#,<}TB tU~hX$!@{3ַmr%i©0*T;Yr?Uǎ "z%,%'Uybt@ RIo$L~Q啂XX6Wg{4DɺU=5rqb&66s67DWV*WqiwYٕ*@>,iQrٌt1YWGJ)Z㺪λ[{yxlLvŠH41mj񉥫>56%"}{^We3Z%YP"%wdA䑑(ZXȵL`bx`6ګ⓱/ƛ"5Bg;} #g 6`Xg?O:+MN]N7,I<[k;{/JK #2wBR:L"'=~=D(=A "Rmc jWu#_oYܲo '$GH߮W36]lϲl\׿t/B|o6a M a~ aߊfph?Яxas߷uaaCnmK\ox'g߽>~Sr ?FA'nc nh 44%Y:EGPאGhnQ>qn0|Ne0RUZⶻ֢8$ xm&qlLrk!Yt@ : 7qUmy&`&ǠPh^LXNj:i):<اX<#A/-<|JC1X#'hyrr++S@dVfl>J%ÍDf1׌,]E'AO"!_uoZEt'H$&ʩsVddbޟ$<ThN>@u2uJ{)ZAC5uޮ^LRŸo Vi^?f'o#nhگNV>vx P)| #,q~a~,f?o~3 'Wb#[ѣGi<Ì}<.ꩍUa\lKQy^Ti-HS07,,lkWhd8͘(ʂ=Q]O:y7[}ˏllHȟ~!+ԕq?(j\IHTUTbz<h3޲jEecY?iUxQlֹd:9x}t-9iPw,))uy+"% D'Mp= r)?3 "@ Ĥ*[ňl:{"\xN{`TQݎeZBl!Cy:kyqGV=eBk, KJ^$''OUWpH*fOC3Jl@i_z'~6fsss?HRqVNw 52j' f%>J(KMe2S 5^Scw;2;,M&^&1u|t1{yQ:aUovpۖ))1eDI2>!\Es;7y^K%ОF몷nT0^T gkx/CD2ZCӺg^7E7.o~c|U PZ&ΡAHR'6v=wjVdyF1.buZ w 2"*,~M"r?}E;udߢHX-qifw`Ac KhՓ,X&rգ C#wռh9'nc *G,_ _2yj|uEoJb2#iZc_NSRK j܎h/RM7RVxFV`0VlIBX]⁁`--sZ-V_.Jǂr[θm.Ѻ$)U/`sbؕH>t@"+BGCPwchۮN\|hs v]jʈ5aPA႟4nіyY釲օNK< M;s UY% ;nmf()Sp8?a>}ʏX }coJ\O2;}͈µم=<\{_6ƮF,a,2k뾽\Is±" ǗM5/$|'x;DN*% Nժj%eЪ=xyvQ@,n31NkW^l;nHW1p;Qǽbh᱘$N;~ jmY?vc-:1lc 5c+6R|"٘D/~]{O|.}~ZcogRދ )eߩs>|ߠ]=e93.̳H&И0x&_کǕ )_pf <Qnlc qhЬykccn6r^߲ǢYuO>^sdT'hzcH_r:ȭwOaQvNޓ"ͨnKȩMfѤcvEA?s$OO1F@63' qsOWWdNl}*ܺikk'۷M&9)H(?auM M|r(mCEG}q))al>{) hhh@͹{{{$"J+vkc 2]3j:S %H$TU#~#Ez=dE-\HZb懡o+1]#6wl 4J) 46Np?yE]4:%m&9Sr %r$wO$tfi͵{ y=/s*r^gUxuBύJ&N?v+F 嬷 J45e>w..j4 2OEcxzxxpzftldWGaK?V^{U\|{K29}uY )rݔD<2aKZm64e/aR;ЪSnk/(VQQ[IK/6v/!& 38_Uex*'P!k+ӜX4K!4R <b==H!Oym5|+x/ԕ >DC^0_Kcy 3^!ye GbQ$A]Wd;$q[`TYIZueND Zf=!9Yte$MEn.Qem؁a}n[y݅:FM*c04U!a2?$7&"B$c6jܱnozKM@]nsfcܱU,/2rO/Bڢ3H3L1$)uuG =c{Ҝn_s珳QVΟĕlR=eo"_  r`)%=ח>k]FF_59:4KG]<sVjYY?d?.=-QU:XYm'7ё6݉ hYl`/ %~Grmvxs8] e,ef&7>2rz.zBS(88얤yI;уC)uܝIժVc\Ph c9}r=G?|ȸ(?}HT)I:/M~E /rKU-s۟Zٱy:kf\VVV[[}R.Ua/Vv}6kW5z13W}YFNFKK(a3aV00 ;>ɏe^"s09v_C3mq<{iOj?a푄nuϟo޼YYU @zh|jJ115]t| + ϒaAD4`1j9EzFy2\vumWW{t)KE'snj<%aPnEDk@CEXP rW X !GaҺCGC636퇯o2mԜ| @e8e3d YE@JW^V$= Z͇Wuu@! F(/F ʰ477O8&]8ZHxKk𦙙(:[Z-F&56vJv0 6#$RԡtȜrw~sv:KQQjk[W2F0:뻳)nOj!"z4_z$Hch` Ίr%g! PI) yV"%ЭG5Mmv__xZ#2-JIJV=f{zw%ե 8jw>_O9j- gY)^nV~֓z5|m˵&]ZO[и-t j[SXA煤wԔj'%&L?CbhiOMRQo9/6 K![6VVq+UwgY{%z>f9F LGGk-,d ժcS-|#V(v0f0X!#z?15)Ea $:8Eaaa7w̾Ue4'y)6KT/sQQ絢#0¸ ;X_l;j.((Pmmdb&Qh[oY{E`0>CǪ9\^+pCUTt4E2 /lϓftqQx`t{M]7ieg"[.A@r====Gl۲T<(?vlQx`ͬc3h݉cPK:0! ҅bbO9mYyyyE3yBЙ?y-c,+vm ##/g#^r?dz_,+^.}"wuVW xv+?' +~ ~;|^hþg>Pן{xi/tE:ڈ3u8ɉ3"y-?^>ʫ&!{*TLǛcCOJL)/"xyyl0Vլ˳<;ui;W!V\ //Y舩̤ậI7t^|<6 8;>Y6I0F8s7E1^ċh%noWqp(2㴢!2P~YXDضvff8%};JغA[n2OMzdCTra#1OᴛqټUWujRf7hQZz/kOPBtQ-+ڞܠ_":r<TuFT}5Dm8;tKrӪVXЛl'(9}tW/x}:&@ B.+7XJz=x,}k1Q*Q뚱?J2 X۩Ӻ~.$!nyGL|}}-1L"UU61 CZ҂#i^}3_ʏEﺷGr ?&8$cN={q]w{Q7)lSNkkq.0b VNvV9cf#6]g0K ;N8 +Z ekj&"bނ\ti*S5O 9ap{` |;pء9J缅g`*cXm ZtߤTrB--E,vuՠΫFr}^))3`/@>`w.FB68!wd` M1/SWy>t5T #ν=3}L#f^fyt x w|m= 5,SM^9v; iK%HB;A=K WEJJJ9w2/|Ɛ\%@loo/fy ydCGZ_NѓRx#:7Q-:1e|X5LElw$%S`-ν "&*E"E_};A0uw,ԎT͊@M䠒A1{hEE\g>بt3-!!qz+j0 _X[?yd 1xX}_g'mО< M D jgOO8^G1jơ|齌b)@wKuK7 \oB8ѷQ#%JS]tLOMkixMcv{փzŖZ_\ƕ7/]ɲE/AWXH`#CC˸)NɇTԏ6/=mgJOf>M',㫜{;*iub1d[v4nEo& 5Qس"EiSY#DGAW5^b!j( 3E'6v^#w.%t#700s v" [X1 ̲䧦/,4~-Vo+{mhXEs@4"2 WS#kK M^e-9ƉKK/&+ &TJ@d4dGUM|<.Ѓʹ*EVܤVUbgj0 %!&j8&j-RwZ;pOssԟ-^ WYۂ%=~~[ |*˴Z0O ꪻAAA[aCs-8:Wkg±_gۀNG;pE5UU7-֧OIzZY)vjhha%N a9$% 0ά{^sePPg?o_ȝ+'^N@* 2e¼A У@ {7~Ǒi ]zzȴޠVثc{yma+ #p]ɏ&T_9= γ7^wyƂW{.J6FOa=Z]]6UlքiwL,jk(W ''ߓ\`*'l4}iw\kG gKP'~ж] %a v;L>A$-mIIIi{7?|$lz(dRbH< #%Vn3!Y l2]#8!V`IIZYӪ=~Ϯ@Amt:? 8hٴy/ `eeEЀPY,I-bךq>2Tf{hiu3<2WꗞUMuւ։ORZFhl,U0`ka8"'=Aq~&M O=# ':V{.$ tH,7E28Ap7股 Ω+wddVj7% AeBM^9M*=~_hNN 5Nx P١phZX .@ (ZČ/ۼ ҥ}c{ ~4|N{*}X8D!k/rr8p/Tꅀ>qƴ RпI/C-FM,}Ǻg]C>22ORñ\x:4ZnP *36 бyO\3&ȱŬݼ2n>:{ck?K 㯁)0;8MگF=!ʸ1~"UN|~'$(3XP~!weYkoԡ?hU5鄼{&+mN(=j × ZP5]gwUYW^a]B)n3A4?Bė vr/,gRJ\ b}.B5PZ F낡Ľ?G=$o a]ҧaSSS^XKS0WI%>; -AΏ1CC4pY?K鄆;c2tttkkk#j T;5>pȆ{ָǺsLd&*$zZK %N={A kB Bt`<طnPesmhLtJ'  J/h`Gni&nwɻɞOU$o*,oT_wN {FsbxvRʚky% 2J!voZ#;(gd-}R;?)jby}ء^Es =4ȖXIQІ̒LҸrA礞^w3!.ݕ7ٹkx 5$!eQE2ӥr~>ޜ1A|)R/%tH='Cy2cǠSGM`jlͦ r)qq-NctL_S%)bWlQk3I NV&pңMI qFfBiɛci>@EObhr ,?$qx\b;v¸ D$34{;4X9MfZܒ> oLupe=sycz =vhNK>;U'J;^Ġ&OI[ɸ%l)Qx(fC$SNf*]^ xsb4wѩr~э+9nQn ]Ɇ5nm%XlF-->"(~SZX$!!6 ӻgi)yĠ߇\$c%&&"NT>T8j%"!Q]R1i=g?󬘑c;dy|9WKJh4|CU R驐ۆ6{OF{Jom3RiKk ĊF,}rp@͡AHYS/Nۛ + k@V}JCOf6JjFЋK'?g߰7wtvow_~~_O-/?ߧk$ u_1!kL [Po )B{| )0]}po_w7vз3Ȟ6~H{洗@D7FJNq^L4r8; Q,2jW:ŭ=" P_2B[DɅ0H\cj֗.@ "v6,;1HϠTnʉ{$Q[Z&yC&((2f)(O.SG+H8>O=yxT{÷ W,#'G}}}ff[TQ uJP >]YUuENE0(!/B C[X֓yx<&^u|(7É M?uĻJ2n5BBBQY;:3]pV|.fũfibcY5PW%Czw3l\1DDv"ƦT][1LG%aHd +I'YXy2ߚ 5qR"X2"" "kqIEۖt5^I}Jg=ZV<|kseqIܑ1 %vqr;_ GF`%%0Fweѣ@!a]t`yO$2³IBcȐ[C[V1)`JGGg]]\(b _ +Ea{@ 1= Mz ;;{=uuHb2h\،SR\5Ǘ\]Xzrr2uKXb܉ۙQ[w-PR_׏a15)~iI׬B'<%:ITB}0^e?2h+Hy8wjQƙ,wK EErNQ8 fm%&pUNPT'utNP_8^9 h94Q*{@*$M.3Ѳ=F}WP}_Eҥqh,Zx; h@]I3 v[/=zMmi ]¤=6+ʇȡz_ҷA\'֐G7< rǴPLi'l5D, sP֯]ާu΀4 x&kR޴n_mx0@, '_gˋVp2D]ZAʁÀ^>x`jo 8j D.ۀe"hp w ŋm!=}Zw+ &a~{Us绥I*mT4Xk>I0aH6]5V K.*>8TtےHyŝC0>!눌C0~9μaWlU+n:N,}c$sЈ6f?mj Ye;" `)6^bq߾:8kkknMJ6?v AF蓷II'"Se؀h9Ua>yԩpt{B -W{Z\733y6X.\@M|SDDd{zU2dO;R7^vҞsps/KL6*EIx*f 3eO~ABpTg{7\ـf"J9LXK2@94ce/Aˮ+NWRYoNVB |Z Be55Z/8(Vߜ;N]+iii"ӻyfauƌ0B[tov!S-RѣGKqxMeyٷ]tkkkwsā6vl YX|?1 &]yo/j6=JmUtհMmmm 6ujFsyt+FF1A,[6-= n3k#Ϟ(4"hu<"dݦSf㼦ᡫZȴgϐ .&&NFІJ@KB>uV/&%%zyrǜ:gd r\h^+Rh[e*ǯR38n^ЎЄQ)UZݨeOQ>*~G7s#'gLRe͍Ӯ%,#vߙoT%H\7q︐GqI,gv!mxPi-l@6uL+{QҞ瀞Fj[|kMv5|Wo>:T:El-|%LɹKK{\y Ȣ yB#PZw`oџUr eZ~^"X8 T?3L^'tnwnd? y'7`ss &( %4't7=n U5vK t1ğ /Ryg |]mhC+Z)j}sGeQrqfM[[S` WʀByE2s0#K$.K$>O ڿJ. CHyrM;RO.!pPiY.ĺVn^* j><6ݧ֐KҐ|h((? IyH/4Fu^F;h[aBmfb[is GFF+>^+it JŌ^o66'Xผ~}`ѩ  B=S: eICs΂&W"'X滉"}p^|F=1 \q"Xh?Q^k +vV!vЗR)]A@@ל>uw@j"z_ffM3m$ iSd;aZ*\sl粑w"WGƗ0>V)/\7ڼ006\%֏)zMS++s'?<5=);F./RG4-JT ЭfZCCb^[w~*xϢL-3J OU C2AߒL$˶n )0 ^_9ן!UL]9:Lod`mtquR3d[LY &4.h( v5$u*y,"`7bǨ˖ouؿV @z=vA+Y "+FIұw_|q*Q6DGy_]g@ۖ%z D*s (("9K$Ah2&@D䤒Ii 9)94IHl oAs;3zkU3\p MޝO_P[:OI66޿ёXy}^WIA)cGGG׾}&EL6-fLJ0Fy90p~l% =Хo o`F\u \C "x'y Ie2ݙR8q%v-> ׺vnעsAӷ`uld@>loϿ@7=t?\Tsu jσ,]#7eHL_t,sFZZ5S'Va?m2`fvDSYᔓ_0bwB蹃vBPCgb[ZEvܼ*N MA+ȍ+d2a=[# QV_>S8zސ!##~)2emu<S{v @4211QmIo#9ok[r\twt6wŔel@dδhp]-y_% 4rwwߖb9;cMnu-99Pd؀(@iԏ(xY!4pnYx/rruRdRb4p|Il]]F }d\1*vPX2/z?0KRb}im?HR")wB5tarA6%>o1:-.|>C*M.%7iuzGLrc-ʿO߱gnGO꿶| KNG#8/3/9xx~UQxss uPEJS5&ͅ8rI~5fczBbbl-Sc0qCtRJJ7 t3_|&Ye &5ċ1~{۔ Ϗ6r֫>eIIIWN(^??ʌR#p; U{}!9:q4yA2w;0e{&Ǐ4VfY93\W页AnJBE4tuyo?ӈA-qaYO= n燳= ,(=mpm]qś9SVz|k-O(Sŀ&wĊ&Z~B":]j ;Bd3D܎uf{w)%qС+W:2+++555u]x*yo9"C8uuY*ע.A)šK#E]JmZe=&H :S, 9/jj:uj:TS-Ej &'~ˣVZ"]}M;3#nГeg+wl]lcJi- 9-nu\N)o[jM0s>3z£ 2vKs!"&}P;3nFNYˊnb{6ϴ=wyaO>U$sWVH{/︋ RU4Sm67^0xq%,p5pť7o NJXJ+S &!Xmأx7TCСG +k26e}lp5ﰾ2㳥K_O,h[Ϗt>5opJD ;}`k沵a&y(Nh(*HV"N<~4 )&*}Ih+{ 70N|)߉i̦Jvk~:k\PM3i]3}Q J_~? =M`YGɺt*" >&x9<===Y>.emHrꂊ0~a!=_u+T/ZZ]>UiMEl2׸? 0{U 8߂NF]Bt>MkՊ"ݑ !!M䙁gbhg 1"Bh-Έu]Zq?d-1x"Pg~*Fӹ.6%}:cRUCL71Cx3ryBH!y[U\=Պ>yO x٦aa#=qq[z|o㚢iӏrwz:$@C3G-ݷpLqsu [}R4)b(}"M j z+0=OUt\]L3x5LH\6Z_񲪑op]es)s}4Ģ09.Leͭ:Ve)#snjWp4]rV-SFj6,Nqx?^Ô6-0.s=/zFB[R慎Ic1o #tQbk -FWªܪ?Zw٘BAZ,2_auzԺtJ[xM$mЁM[Ϭ[>< |<-^6$v= LKCq|1b fK5Wfʊ^Ss*uv{i/l}ÇXZ]U`pJQt~)W9MX]zMt`sX$@b K͌e;sU3%ǑWȞŤ| ~%ax 3t -d dŒͺ$;ǜ]p d:ZD=8vʞQ5uȠY[4frF=zڡ7.n y[VXmqq'_>d~jjYu3ijR"aR1#n*[ }p[m:힥50~2[%%.Sя:' =܂s)5Uօ=bZԱ 93B"F+#tѱAb.@NQ.aGٲX1q|Ƴ A0vŒc_/zT; {t=H.hlY >kBs͐;UCGIg Dh Xח1 :|SήΦ qGgWqL###p<Ee˭~á "fm\ܷ-R=lEr!޸`ǵpơ@_*ۍ;K` ZX7h:TV 5w2 VuV2%w ÿNMX]tus!Q^t›15#{>Yl뫫o*f"RRJr222C0lS?Z*KW}2ʹc,HW"##Ӣ(=<6W_:g%N~&vD`J2Wjn^ u-Ni& nl]3 +(O߫oc@vHII 8`8It LiCBgHg,{>RQR/Qwp5vPU*ێOfcJQQQqxyO!@bkASݿ<;n|bcmi :N q[Ӱ 0gy鴵Y ^"0\+@%"оDF/YModVLaTr \c -^m"WiɄ(?Rj_%bI {W'^+K܊R$iyq[,Č:`. ^5 !R1MnSnἣ{ptUسX@DkbS@oRaC8܌ʄ1Z -`j @[M{ Zfffg.onn:c|HYG7͆Eo_jjmz%MoR;6fDI4Lhz;nhRZW= O< .QLIax֟80qIUr6dK|rNO+[F&|-- ,<\ZZ* @ lR+Ǭp0F6m] +M|IFS^^ Ledd`S(v%S-|No0MN7|Igne DxOJԪ1=t#GֈܑVdqӧO`>Ox5X|ʼ]ȎgЩ]A]Ň({rj}pOG9#S:8O*8)%+(ej@qj[ fa#yKTLwA<+l|8 OJV Q,LK-;镮fff..PO5(+o I>rk75yfK(tV}3wi3OeȫKDaf6J@N]"M2%T/b7? Ľ[/tp:-#Son8j_= BԲ'ζQqϟ\O1Ӽpa|rr ul6|ۗp?B&ʄ서 9:hbaa!l@g%fyoIq/s+>[%cÖYYY@}rغ{|C Ekazk:Jʛm\/G<<|\DSp]kc}V= roigI 40X rjdT؎b1Q%ĬJgJss"Z "o%G>ٟkBmmGKn=?z("-"6vacNʅl_^Sܲwȝy֏Rd E&-ôޒ'1{ cWin"m)u壻EVp5ǂ)"/ ˂I?T K.An?9zK&P̔iQqh߾=4srr":=#}gƲu!d=\_4Z[[f(gKzܕ;F\i#TRRw%|V WOH ӲlߣUGM3uiw)쁤-Mﴟot÷זxK튤G2&ڲ ^2>sPbg+.0T14:VD]A/nZϝ=9qAE 0Έ̵c~Mu`S.~JcdU]쏣89ߒB sbgUSN_okD NG@W?}e2 @"'S࠯/>I`4<='UR32^? P'Wp)HzC}@#U1B)GifABG11qq}||:axOˁ WJ\ܔs;tH ,VXY..fvp۰K[oWHHA=@6՛9imvnǥvkaOymWMNe98U5ƣ_be<\D tԧW'pqqmPgD]V67E+γ)Іgoګ>ߙ)q\HzP׌]TPKs6~gΎVz&HJm #ñX>=={tcSS^AAU]>5]]c#Yn4â`N5085y?9+!f7jmΐg&Q/]Y< ִ{o{=F> ҃`} ׁ L7ەB%lR‹dl _>Q//yc)78aii?jW# ??k/;Z_ _'ݯ_ݹGik\C8 Fq_shɫf+ SMOW'\0}rEŏ%ʁ.q3֬2s=pAAX嫌C5dHf&<ʶؗPc֥C?/IXw76\-ԀܟثSxYHJJȢř6n5 HHIgXZc76?VTu‹2~Лw_8ݔZtJ c=Vܜ6d,+#bx(VQv altgμ;20{$yjRM&d4:-2qC嘶#L-ꂓK]"HUt)fy2#A&QϘ;6*B$tǹ'EDx̛/.2(OP2R50伂Z3``+Ov8nm`LQ'@f]fcQkcv]DyI"'!\VdN9Vv^JMPFL2?zd*m.ʘspť*|y166UUkJv,At'_mi̖Z)^ iii#eg|ӏcDFx\Ў r6p@I5m#K67X#h뵯/j_wXlfɽqfFG s7-`JybwV`سpSAqH!AA3bec) nI/QcMikZ a DM+Cs_nh3TR'JNKڋ߆+8V/sqA% : -Loג[iEg'h:tw*߯? \YU/,*Jq"_ÁokpsoY3Ȥ%ܳ;QaX]j >rO;Dؠ妍֭RmTi1zTHm?+i[.LI8[A8@P+*ĉS&Mz dLp伿C=ԥTL6(zl×ϺV'z;nkI!3Ť?}KJHff:7i7j!#wYFMT:}z `*]rB{X[j̗6-3-"n= =0UK9ۘ wuUAsP$vb!|6;'8;J!jL?/>(+c.v!Hi@~Ơ! 1r᛭!9qn _ !E(38Mz<5 7t9gG4ngEaV z:WccІm ^<2 {aZ AjJÝ]Qi~G[Fg sA;6C:b鋱^ݺAn>ގGwW? 2F\c gEqCT=zŀ 8+3Ӊ=\%~.2?pN֋%0Bf Pno$۸ ;JT8\wo^0*1[䫥;'[ [r;7w!⇂pN.{)Qi[_PISޏe n LLL@8dHW(B88] ,!a 8Lv3jaUKt~>dkjj&m'xr< rQ[J?G̖"RXX&Cl/M'ǹV#]fi6ڙ7bT#5Mv5sZ..nmօgmv!EuwwwL^l19o}fn$1$& _኏L>e}#>V/Z2yrXU.X޼ݧoКzDii; C/o~oQpj&xkWR"""M`0t Q3/xT M$fjNB:23d:Ԕ`110v?s^Ң"F܇˥mʃJ.F;ˤn6`+65'`ъMMII\4,wEnӉa:wd7G*Sص~>FV ;\鄺guW7DLdssT6ՐqN ;֮%Ofumqj؎o'izNJIG>\` ,n >ڢ*.5"W? %hwN*OTSz_1ϋ AsGEEȮ7nlW_444_h kk{GdfDsVg *?mճwɌ1 "d R/b/&w}NwށpVCnє?cVҚ :~36fS>Uys:OhT DC9X,{>"gŝ\ H^|ՑCFZoDq_1@VWWT3^eT]}7 En^ov6s%?& }P/S'BڢZl@Eo7_J XFvgeF;i)H37x1vN{ح" A:e6p-v n '@{CǿH ^~8}FG0k1'n&𪜚d8Eev;c#gZzk?l8&zA/e"&&&_f.8`GD \ߐB7:YEWWeemkanB%ئ6F+B u7RayVgcaQ,:s7~K0U^yLE8o^]u>WxWc⁺7l W.=~%3"Eg-b[Z1,'}oh'/HCeN nv.k\"6@O@W_޽<xg~*Crp Bʊm…AkW>w <ֱ\7:7ս#}QvK"6pL_AOHjF98WiS^ڌl`@ulc7iYMRG(xKc;6ӮI0lJvO/]OX%ڟ]89y<z4\Dx3yGmWf1gOiЀ|Sp,`\UAAS\ .~Uڶؿ.1+=oѽBYEuÔ[/TJ?Hm:Q܌y"-tS+Ah<3=涜 Lq.oۓcCTj\u'^#0$ GH#D6O&u_9i[W͙3Z{Y5FZԾ{CJnZS?@V6#ڄjW{:E"LrqfJoڮǵn4nQ~j2?3dܧX5.-jWTL;椏aoq k*i}A+斶&`+(yHc]hYƌ0aއMyF&J*StVnYkggM)_{f<`i(jllv˝ɴDhǰiߍ#:RCՖcQȨ#bcc-K1ZC* q^K+y^h$P&̖fe:ε5ȱ!ԗ^ut(g& lp;B-qx#%2i4];9ɭߒ/$C=jv;zFz+'76߲| Tn_o?q}SA}, g濲8hwJxT(Aп>kW]+;Az=_z=_z=_z=l_?s;⟋G/6lcfc/*QJ/?Ux|.N?WtJ._Tpolo|+ORl}_Pt:/H^T~\7Lo%`DRaLv9w%_/kU&N*+{NϻGη;Z1%ƨFҲ8eu.hf#88u?Im)e v@lk"//_{*2*J 2rrU{zzX{aZ+Ȉ+nyA F9nY~auap3e+/ħctiTUꌑgbatNHUo9~jjj"U$9VUl4 AQ$vhcQ9֙fsn5<\$ "_SA䫷wz:`LhgtL/5PJ|Sit6=3S^QԌb!sj 600@Φs*(f (ˤM`y3?Z|q ]`5HBJ3X5?֥mR7o/Hۧ:*^5묵W7 oy Y5#5EQkm.:_f^N{Ɵ8C[W%Gr[d Nr3D$$!"FGAzwAvt,IC0 J&ڨNR k'o4\U3LMSwĠ9»܍L^KB\S7몦2|Zs#ID6zK4ԪQo1/%7m.-P8+fMU33zw~MmsB"""Ҍi.4uXq'ѫV} ^[f=Uiict0uF龋n\RSsr6tñDDPL-t-v {׎8.OOH7go^`C`JJSDC###33Fsb d> 7OOO#܎ޯ9b``PN(5 E=;Pd|A骣E¼kR5rzfk(+BRa΀\CA JPs-]vhX-\uf6@":eO&2%jƞ͏ Bgٱ/*+i;pN#pK$J&xT(,+Z u?=ܒE1qi0V۩p5}Bd|||4-8r(ʪX T֖{гqmu.e.6(^>2@Jfyg[.;rE~YJr^ϧ:&9L]'T(筀yؚ 2UbXJ!TKsHYZKƅL6"[u RE)qh98ѶKr ش ߷im>n:ZZ*`񺪪/¨" V1M|"phZǸU$뙝>sz=u(ݭ2xǨ4OS^O# /.I`zڽJgΏ3[tTNWd8]h%UTye;&"{(ƊBC8rdsD4ce G~{BDny)ږyqg?յpB/kd_U=}ḏ|ddBBFz) s»iw#EݶNL8- XZZy\)])U݉U9- 92?!'TUN!7Wے^W=Ê<2D) E]UeR'(za}hF=ѡ111Ԝȶ [ (mhhz|FjޖP* a`$(*&(11:9fˤGn/@faa-'WUQ1nn DZ{LpƠ ٙU}CxPgIMCcai*#logom8} ^ g%G ._H822?c|2{{ҦW/*KWdnM#\'PSLPه gqq o\465&܂pͽXcNG $`Xn pJGoQhbnv_@0?z X%MxӓM'#fp/^nٛU#V}҅ű"f bbtޒe||㲅\rzs*/*zxusJo<)>R![@. }OLLNra6B@T؛**GYQPH_ ̄u|<*\2ԍ:,ݰ8ڃpkFlflP?tkaglCeixu+Pf%IHtRV4قQITs8tHtxSTNH9qcVό_ %R:T )whs!1hlnCIi:\|I\ .=a ;~E}θ~i!߉]/ !hrqZCb7b/yoXI Uop( 7ynnI6r׃-?fj}-Z*w/CƁ`JmOdCgu bJ8`}b^Ǟ"`"{ݺ"a/lwSK;:xЮL>&&l"ES(A L @+ Ѡ88 YԈ_ ʽzg69"|f4V+Y̶PhfFfK=2i,p Ue=;5弶B!驩>? LhKm⫯oa >5(įB6)izZڞ"ϟCbhE]e;,ey"X]:u@u|xL_}눎z&8B5Gn oM%`>=sM s+yy涶܁Pc E '/=g>}_P`GVa5/Qua٩W[J10o97Ořwe(3f?N\.}7pəmuX1wKQ%Xޥ8w*JWWW)WYZ42!FP:)&aa\u byu7]c~ۦK/oK/oq?A߲oc=}Q{AAA)"Ҥ7);;AHD7C(*қHBR›3˵>wyO̘|e~c|oooooow$-]% .,psQ_ww9݆S+7_n~|)jPZ67/9/xn%{O_&E^~Nn_<j_?=~\cwO?w4BrWF![׾}r 3U:c`W_EW߯CꓲUqEDNBM`+-7g)yIJF>Ι0"'_$;D>BZ`ҪN3w}hɇ?\6ܳ 73n]8 P#OVDbA{[[3!Hԓ fZ<ux~߼R͙UsKew黜 3|_|4URR—⻱pmwgkwyc,DUϡfvGH2&{J**r\}}XWxN_!MjMI 3d$ ?%1[FDD#Q"ZNKNZ=CV<6 쪖F8,) 2ce3?!P[8 s3oCQ"VC2JJ HIϭ*}SuAlLhZ\ޓ@w@Wmo`{vn.j+Wx: :,B"'YP0"~*)]!u'2? =3rqUQ8#nc"v/ifff:`ۓb}'|hȨȭ{1 ,Mj;a/; #;jB ,[/*i-uۄ;L1wUW%4Ќ- d?.|miUb ʋ} }%5[W;L,=֓F*`K"٭Z싴] vߗcڒp?FU|&>*OգO劻s/FW?XA8qGvpɑYH̰$S~ɂ(G++f:k_(~k ,}@@}h+ = Zk$L5#j#&3f3p5=z|v\վlo7(1E!,!汯XMڥ-h@Uș6ItB|鉨v@s@a[zeEIXͥӎ/Š`g:Y{x nHOk-ʰf̧oNXђuhv_US^ZRc.]tN1NY&AwD>,=\cʁ@L6p (I)&J^S\NL zgu`gKqx}F {$nL@`E'J<)Dx ]{f4pa۽aɽu1lpC/?Kq"WڨX#o,x:iZp,X2}'"{S\ o~p0x/ռ/O :,Q-u[ @OFxuA3"piߟDᇍm K^r^e˔Uvb<5z{{d@yPrYrɰ L `W:X znZ$s1=Ӡaqw(dhU)Ї?{>B؀oMh%ww0:tԯJܱ Q0O( ZV?8L%`ro=3&HIRU.9T3k0G n }A΀ǥQ'liEEex]cgS]1Mr]+YQT̮76>e wy/. @r~m{p: 9zGViuG/0Y„,ȁZ[l}N,yB `x $oz]V & Lzͪۓt;] A Ǒ?HlYwxVC~iZǨv|qwj92@f =n~ʐǵA5-x !_Bw pVoVuz+xj(c?WAYR!ەu^G*}ĻLV{n[lM!/ۇOW[I c3γXXX@P%l v_q*[,b ;dh'l%t,dždn6rEr$D)J1qoj(d`5ǹu{U ʩQ)[[UԱfp8:t 3|ZAdJ^5g*ka$m3mGajИۡhQ).ixؐRyleQ/_Z_mҚB/БZӽDڑ2Dߴ(XiDvªl0+/uWwK LKoUa|qixD{p86(:enK͏-f{SO):ƱD5 {[%F,B|mJuDj"s~;|r}LZJxhha5(rCIII1~'{Dwg] j1K#ZhM'BNclj 7OM9oM:fLSUsr!OΥXd2&I|;Ld5>j<JɡOw'׈iʉMtUkSSS ;Qf ݥfu&F::##z`jL5ʰRu{moؗ1I8n̵usykZ?KF vi cܙl"VkQ_bhI@ ^hOפ5I㹡V9a<[/?"b~usK7tz~~m7<]eZm^l9kbj9U; zl<67tk:fسsi%3BБţu]j[hfb*ˢk~n`L{e>Vbۙ@CJU{YsnnRmjna5v)QQ 7r5;Stc|yS'Yz$ r,S}fO% jrv7>\; tS҉xX8Eeo`~~~@PI ^6hOјߝ YRظeM+Dn}Bߧlomy 39?qhj˓ ʘ+?˨պ茯^hl[v|L԰?$*+*7o.׍ߢXˊ .1x ΅&ep˷SvmjjT3LӷR݆TsL:\pKIbjF V#FeNpț>_MtFaA*e+RtmX32oBm/3W ;[+.l&yd#ݵS@w(Pb< mj ޸kN~.O{&E0&NE{`NKbP v|}#,_M2ofY]ɵ5GhWRߑ(bIuxO\0_Ӝg.|%:PJ$9[c s獮 t'UD֞ w?7+s޻!"J#_*k%psXY.7Ix_[Ա}6K1Is-VZ wJ׳#s@=m(;,\$|ܼP5P ')5,/,"[Tg_m*8{N߽~7_o~?-׿M#Xjvh =@")i& {t#)q'ûgw{b@8\"~迸wRlpZ+6n2¢oV1k w`Jp7ɹ3oHN=9pO? ;X,NMMȨ7M})j]֖rh}Zv[[VAw_bVj۷˞k$Gឍll66 fy---))"jۓ3Lgm3fEs׺__?HIWe6Lb#4TLnF,rSݮiw؇p`FcT{/^,Lc7VN? 4 \p|K>~ez#Q -Z\urrrR4l +Mzo]S;z[Y74Vheћ7{n)WkepWm>@<.?8#)bbbʗKtu՜xڗ._hT6?S` SE}.^a#<#MmB8Z&>a6|Su͙a1l_uʄAiivZ[TEÜw6 9DNP p[soawKn ۂ㾩J(͢ۦWD}|{:I^/tz*&z.Eހ>lFNikLC$-#AXע\b$zK7<113KlN s׀c5FUcrY!yZ2)]ba[FY<1~=&fZRf&ż.KUS$&*/avqqiߦ&KriЩb~]݅) N/pzg.b5:0+-r5rO3~BWsP\wittP6966J= JurM :굍o,"A"4ύ^}Q(MƋjOYa+4eOLL،.̻w#_2j+fp Z5U jΫ8Ost[ g`:*#e HRALHdemb2ج-mፁc8^|`aaXe'6rX mRL,Wy<ڬ/bH́ÿ,ގk>]tyJVA7lɺqK]{r [ j*^*̷9VXj>`^DըmL,q%Z~첆V@wU#z@s9d zMz:dzޔ * yPv55 ״9km1|.qa˻REճ]u%Ӣ$C7x[01)8E##sMdc_)"Hxe|Y+39G(b3},Haa!z77&Wu]9H7}]ڠ}WlW.++J>lߍ"h.^Zߞ 3y;DFq7?kxC."uhBByZqZݍ=LDf3*Ux=xuU^Fod LH2(2^[$-0v9ac|9:u|kcZ NMd\`#u%$єi$4 c빟|;<6{Eq\w=ƻtkn{>kYc;|6 Mvw1#1T{Ø۷qCK:#hjfNXϦVNixs vMm#{4"f_K@L71&`~d/.9=V¶W{@IFRRRnÅ fTOB[ٚvGk; Z$&<1Ծ;iߞ:O-71ư&<<>1@tETnݝqZ mXb/X+*+,ō 'mNdQ$D7?% 8 .c+e>ip>Te 6'a}y\"LE'B:n'}*O~3>;n31 *싃b&kڨ4 Yy?IO&R.l4n[ye)u.eO㖒H)iP%\Lc s\QD|& ;KCۮ5)dc<}8o[7~3l5b, *yЁ".֙a ؛H58˾u$c`׏@Orw7gݧ*D7?0c6|LYf 3}B~닟-$R6\V~=B74|-z,"d!teyPAC5*ifBR0_ѭbg:PhS(_d=mhB{Uj |&"kfSvʜt?s$z,xWKlw/^_D5Z~9^dUC"jNjD6"SɊ ҷ uo~v<#K;V' fIw70 m8چt9{N1Sɉrȍw,2Y0|9X? 0SP漺MreNy R"OWFu,bJi~l?B2~:+_W/CXl ɏf%tQmd*%+gp^nk3=]\ֿ~ DV{'+"maUOGW__gx,]!pY$kEE&nw;0jҁ=JSkvu-{Z<YB[<2~?]?@m*44.y H?]tO hssd"N\TU"i|O>I$5^DϿ%og^gNmQ>ۣ:dtQ-:."/rÈ6@!#kKK|i1/(}@p|2j*㎐ݍ9$ӯ_U߼"kdįD,B-???Ues )05Ottv^^bRRU(Y#*!h /Dk& $q))#LoVv*=ZFPU@2EP|fc <rs[@ {[M,a |%ݻ&EܖB_=,PJx9ˍ|7䮘أc Xsoɯ0j)jJ ,G6㓒 tcOZ<&^/\wX.UH ]moOUhx(4t׀~nh`B+>...4hPҾde7sz{j0oOxom.O!B(uK@Ɔ܈-444{b PԼ'7eӭH)~dVvd/*gGTO!Oe?{8enNݓ#U|d(R +XJVA))Vjb?!y H`P UUI }{/f6:FCQ9u x)Xna䔀 Zf{*#Lg?슠E䁫J9 -][`:(OFl|!((Wn05>@Sbo𨫨hi1Y!/c !!!'0,Btn~~#Bo#Rw6%0SVVNУM~{`IxKSj; ċpn6Y_qgᩧ7(k4񋊧 pr>@ƕ{O6Eo-e%˭ȴ`ʹ}qrI~怣8čW0d;R '&$# 2)ln' IK>A-(A3ݨYL!C09,t} K88$r U u`!h@ g/p}T7y`_os|}5\ (Q:cnF^PrOLdZgq1gg쯡b(+)cB* 4;^ 梋ɡ">kGE.::YYoh6&7'GOu%m)v%;;{9SG6K/kT!>C}id``nn.>>8$ނ7D:!>>:&&)iSB~`6^=Zg/Ǿ/Ku0v$?Z:a{tA>ZB%&Ј` b2'7ڧ p;^LakOn)`IGc? uP=31#^3 Rc4e~ a &|8}HA|VC><Q^Rұ~u@^F:`OQh`Mg^@a-#8xu4Tב~֠n %?/eLLV|<-89pETo~̜6f)m p9xsSN+[a{Df\!vJvq7n8߲>\f Bk! olmȶ(0`ddS0 ;'\Yz_ܢe;eDz$Xrd+d#~'x6%%ϙYXhD'nzMO*-7l;(ܖx-,pIdfysٟ)Z`ދ]w/Cg(g```mN:z]C]) HnGƃTbTv6iؐVbMfbEJLt_Qeee:EJ!<& nc^V = cfoև\ gj&qSG5eK+$D-Ըؽ)t v<1˭?ē  3錝-ׯۅR?0}nе:NZC45b5mnn.,,tӨgSV{ocQ( p 将yQ]ᡡ9|FFF,k17p Aī|b.SٲEj[~)&Ǿ&gzO42RV L6v@,(LA雁9n8ڞ}pF{taM?gio~?9\qbPk, /5}O̓q._wOg`7kG<׿}gdIqxFb~xd_Jյ[@S$,+,UF*A`Wx ZXeuMAHՒҡCY: u}PCGBOu l-o54z6O}N/39<8u$1Zk9 t@O#{84SͥW-5|v8xxޙ8bfehYQ _ wyṊjjrj'}:Wa֔qҥ| %-IjWcZbѵ-# [?z hxqnʖMX5/w-l0\W{8uo#2R;Ö^cPywW`F}n+).!QZyˎnOcou89d”57+9gqpu < \do2K>-Qix_&XW|2:H裇c L1+(z#G}W t}sڡ=沟['ڒRw/>؅jz-egp-,|Sk[rGs S.XI҂?#Ȑ# DJNKfyOԇ^Y~ea)RQzz$']4CZ͸-qF:;*ޕ[~ ȗF%q0b|3Kja3\J7oޔ|ם]D, 3jGfDW8,&3BϦOڠmBcCk3qkam.\KO4b=J }?rVQQl>.Д,Uy[FI+ w+ن_읳Tn~p´ɽLChoO΂*@=0Muh2h3)lSZDi,:l2ʩeutυsG5&'jB,Ep!)a'5&`[cli㶰fr)@!*<+Ӥ4I71E!-C*[8}k;n{)cw2YٻwygOOϹ5M.UL>e#@̖=;La@WW#f}؉Qh) Eٮ!ոŋui&zO ѹ.֒o_ZtjH:"AUMFPyDTl_hɉ5 y'#F[WTiQ|"2!>[ǏY Agt8y?'+D+ҏ' @/Ѩ~m@6kWť}*BBw4Ĝ'U+j̐W)*.O_r" =a y"2B BZ~u`82?-ߏr-u.{8I"(ˬ4 -#@oU,Ⱦ4>;N{?~|3$Y8``/KJJYNBԘ]0KM` /!&asK?T?yb8_*LEkH(yĕ;pyڨO㇛Űn}5_z=vdFTsfμ@ov&!xt'.-@>~śnpc[4[V5z^[pF~nRT4FZXT^6YS=y=Q[.QJ70)kY5=P;Ɉv^)s3E{eڊ*$"[HA%?7lmEMP/` *$reF'[' z)sam6}wPo>N|* AtGS| MКiw-;h'` /Lw 儽~xM֩Y|Rh2-=l'^x8˗P?lAO L}7 5DL>)~ABB-2.IV1=Z:izz@fhT'6 Wc߇$^ѝWgnx.!|ý5)k47wE]y|77F~ PQHpKN/pyYǢ',Zk vTtt(233P YlxvOwcGv#CDd gL8>~E"h'n4vtJ90%o>J&[y99Wtʧgf'U19]6潋]755U勫>Z[*^04Rٛ8eӃI"{#_>Uux7MnIn #ނ555]]]5rwdH|6kZbEki=pդyNofZUP@,ꩀ9əTf yyH;bK؇  Wiȴ+S\r}˫ѝ;;IT^\Nmޡ WTF:%& cca{ _|t ඥ Աy zM:{ i# dG{o.^4z ?![;5ҟM#~o2򎕍48ooڀ\.&/T 3:LnC^VfaOwƵlvs<M[7 qOuiA(Yo[bVq? %ѕf.hɋ rt}kpHnok}r@+X px6XoChX> z݊v=LgJm)59sLuӻOp\߈DNde1o`zI0T1͇ ;sp_33sΜsn`ʒP[I{\'!(jS@;혨rĔ))+ZP_`>` \-Q†nu @P.DdTBpE,]l www(C^":!whiqJx6Y{tuk{m?9Q@mUIR7sI ±y81P{g B=[:O(|7씎~P=b0ψ)h<3a8wwSK7h>\t$w AM9l477øĝrhS/1St_\WzIHr670Tk >::Ty\^ꥴ '},?4R$P.i0Q f$XK-Etyso~+L%tg6,rxBQF;~ZJN 0dxwlAa[k@@ڦۓjWMД!o3,;? Զ| kdQ"eA_Y%k͟7,XV0)*;{1ho&-.K!졐;+-6R;#RW2IJ=1p^nlWD׻ٚ8 {ղ"@ "9$E$HR@ I$HID$4YrTdḓՀa7;7{Ukժ}ߜj7(\rbEmh^nr}^qHjXF ;GN 2ص ku:on6=] LKWfz 6I\l*0?HPgM,e4B㜒bu3~"kHI҅A.̂ ! oSP̊Ky/#wwm۷js,#bvYYYܩ^q幏O{rtQ{ӡB+4ߓPwGT/bH{ʟ*luFís<~wdXRdũ{GTi*M;ׄkJ^ս/nB"J!p\)&2޾|k&"YF^Y9UJ8;-LgWȢeh*)9_@9V}9fӏZǁOWb:6.[i"r#jGNCXzcqvvvVR^ aaD%0δEjwGHp#ɞzk777/SK"}x)hnd;04Zpk^ww*>5,^|S@R;Mz&UfoMޙ'˫7$^1F0\c{e^Sb(sf[UWJ"4 OᑛEÝM5qLp8 l&ΏJ4'dg/PBsSg*LsRVntĬqͼvze 1L~Iz ;290ҒAe!RjT y4j^C?sGͼ@5fGKm }~CCyGu F#MUϟ?羝w_r4rmΖg5;>0( 68-`ZL|ۻ VY4qƢn`[FXXCȉf`.tEF^jc Z RMM}%/^a~Ex DQ%Фѕ+Swn*D^(18/^}UQbr~ 8l.W*Q,^=RZdê+NO=y<%8SJ<0qX>)~Y"bXlVpq|.-;orsz@pAkžl;£On&` {UtvodR%s۷.NS٬,;fkJ/ʠ߳k1M6Bh3mUut3}g0 N)a7 U&nM'F9"'`ISȭU2(L|{XMv!deePqOO-tLfm[ r;{XSǕ[sr ]|;ߓ " &1 -Ejɼ{c02RX {H}UDnH ʓp22X3šJ9Wqbl-i:oɣrN.b OčMK⾞o*sTCw 6?.]V*^Ep#:Ug}+}驩V)M\Ш\\Egii)[}foA"p?Ci?F6&U 颍G\(Qqq |Ѵ퓲cyx]I ZrJ~F?SN(V,*Utqf?}wm{$[Kb.t1Z֔uIP25EXIչvfX::1C/Dݽ+TzM/)-;{&ʢr:\ԁ5[73 FtR^!)#R9_OjN^hGt.^EBz%`ٮݭZL)eN)qp6>Xx!tOL1P'G/Fq*}Ψj6g}y4 ebbmZjۻxX#mwGOonߪ#vAzw}"YB:.EiiB'K짏c **?ӊY`Mvĥy~̲b1Fgg*~`m-"c|&}N.̡v/Aۿ |)u캙r-FX[c/ 4# .kL8s[X0hB{p;>瑗?8I-f~30o@>Jl;> QOdPG"6%88.ҴʍՅ,,D]]]7QځD!6ߞ}Ok} cccf`IHH@id~fl枫}T 9?$T4w賂Ɯ:ʀq.#.jmz t gϞ&@P`%hPĮt׷JwַrzW:yÍ})D( [ p hFSHHCE%~5qX/2 .VU(ܟ?\@Ĕ6X}muɍ<~Q, u (Glԩ7kC>9EMIiMZ1K\$ o9WNh<@ŘiMۄMu<;||'~);_G5opܼEf oRѿu 4q Ȗ~d$iϓRK|}##Cw~m6w1˶$liׯ~T\"pԩ yysR~%@ן̥7"'R|}' 2D(yye`ʕ= /Vx&>|J>-s ~w~J ܥ!^44:@괠""zzǚb(5!D\0 p18| ".`3u 7RC ~\5vLېd!ydznN/A[4QfSrQl<2nn G^ԢNd"| ˺XB{ӥCvǬ#ZȌmorݶ*2bxZ^ | 0oBo-2k9@9,!뮑z;ÿ:(k6P{]8&mLl|-?pCxg?jX߂40~dsp:od_uѽtz9r q%wn򟗛7SwH>Ug@$qp gOTncF8 Ϲ8"f)X i#lL%S3Y^vF\ZI2wzy2taFKӬAO*.7U#l}izQfIb)kaN~D~Є?#…=:?E鵪,YsQM^a &Li|׉{⌵tY1n>ֵW¸hc/g!m7)CJGq ==j ɦyyyYEϹO<٠dKA/xa|x0jYxLLL5xoOlÚŭLzy_?T'7ﮫ#T]nLvZ:]qKӕiw*hMҁ$ x|$QBXVG*. ud|k`E3Q),,+@l,H54[!nlO.!Y^_ZSsI{ }sn&?'p8711qJ)&>fe5ĮөN-!AIf]5ik}iٻYqBuG*j C(hu,Pi+:,3 HEd4>|P_ 3v [[ M؍2zk(Kq .JWqqv5a +CЇ [:DBuPӋ?Z[QXF F x;rݳKuuwnNS9,L􎀽0V1Ǻ:j1u[ǧ3 R4i?S}ĝJHHI.`*> 6"Tj iEQ4QPh"(MUtOi@dmN~Ry֞GU}a5Z?$x=VuUmPi!X9He&wt+XBաd˯ {F~z}f@S7~C\{Eu-doIR&)S!>j1Q\'H:fca@םTR:n`@m)| r5V;X.GiQd -viQ.aڇG^v|a)X€Ac,]6{]', ~;9}$1HI t 1~F uay&v 1KAA#x]Nij qO`AK 8k (avP M*o*eѐ]8w6P!-ط 99dS5 c,~F0UcfS*(([=q}m:gY fgnf JuVVV5lc|<4_L0!ҿ|(|׺Tܛ[֤iS1L<h ;ut,ŔVQn^]]sQήu.644ۏix^c`1ޏń{RM5P7$ҴGV7-ΊjuLvz]'!Bn! T ]5jfOP})2οC]TT֩\R9؏B3JIK311FBAQot8\S( Ҋ6s )d/)Ny4'j4@Č0 㽣CaQS o-J+4ym=ܘ⾦SSSq\%!Z.,#Ů1̎d8V!9ނLmZ I:Bzt~BS<]cXK@h:PTWc)򆭵_TX+񺕒 56)jHV>w U{bo8b`Uʊy-Ӕ>8n,c sDZn<pmHhyNGJF]QSғy]mnFJ ȭR͂({3\ѫgP6ַ݅ qn=v ˟J>~ (+xum`E%_r?9=lً2~f3B'Mv?37lB6ˇ^\qN啉9A1n==%$?cW|iWuy>(>R4yCϷ^6c4hi@M[zϖ֨yaܿ.^] 3WOobw~lG\lnRPVǙRmvLZ6c%icdUݺ W$`Kb+~Qc 㝣l4J_IebݬؽǏ֛؎D Tl[4}S'3Rbwbhf%//c1Ùdv 9z)+.zi'PX~5]oۻ\wR1".%5U됚4N]$%,212?6.߹T͜ d@݁%ߑj)Ɣ6?~'_RZQ+x'HxWﳖVަ9 vL(r;Z>u}X<k~F_5 Zҭohc9{݄NJ=brן q9GlwLUpQ?vTTF.OQoY3x3ﺻw2cN80[]mkGψo͕ŚtyK7( zM6PU2͙D~αj͠mDXsh]|g3؊fyn/Oz`zUULjg0X3?vT':#gƠb3C[{bS=^y#ävxSIձiJF;lJ,͂.5x^1 lL9F0ÛF VJ@Z&$;휻XN%LuYuiBT\v:A|" ؁KDBAޗ0Tʤ*j=54蜳+w9<̗/:+ 6Ͼ R#zkJ|:ܨ_7;p|{ZG^r2cF*cfew,xJhs]x;H4@淛[WNώ4؄?)?:D917K re}Lm4֙Bvu3 $,)L |ssgb&B$_O(j-Ojӧ߿344Y^^V N VT*jC\+h#yu~ и'wWӧ>˒P1#:° eL_gkNS^UK}iOY(]$E_Iz>SYݬsc?&@)I׎lkOk%n++Z:Cn]zHq>EJʰ@vv$Z}w^9 R=E@\ܪ&r;{):\uu^l-׆T-***tzWd7ݡ#5" #Pk\^yw~ V1EYvӾ#UyA6==/\\i_̦z14b6l4!E Բ/w^foUq8H"t`^KYh]_Ռph2nfTjjRҥdVD̬rPK33/-wǎ>˂قsx Ǔ3}6rpzi'~s#Zl顒AbI ';xF; toܭ}" JRo?ƅ 0do;)KƛϦឦ~&Op{2kZ* ZϿ*KiA_L{F 9F45)$VҸ4|hDȃvijT4UO2~===iGVq)FGGJ~NNuO yƒ[e+uAܳ.as.h݅\Kh(yI3}t<2CxmsSɱvbvvv]޶NƸ͗<+U}O^Ď)!8}×mR'P&q'̜ ^+j'-;QB6>]s8E3zoi:!rj\Ⱥ[vggg xit499rOnnY);O"Z($i ZwkТ9.F _4?x=SXL zT^U-whh/z5/I+FAQyI7s˝HK9/'t[ fe%udi_|%'QEnNZZ1\q,>Ѡ egN: +lxr`®xBybqSy#HތvxN|yʳzSD1` rtVIdw!=NٝAd^^hu%+`}o-* :o6/h-6z\qYgkD@v]Ttx{[73"UT{帱5myABJ1A&Sc (dpLK(U@@Z;be3FﵗZvቧy[N^Lo/ꏥ<%qh]IdO:Wnv\BS{ EI>i״twk_BkkJh]֯$sInho ${Ʈ(O4 xSqi1ԝ<٤`2Қ&*=9,7T#X i卨uR0MVgƶVF?wHYY=5|/qr !GC??|]F@tqN~m\W9YY#Y(pP(%BW pWWrs^edB_r%7׿?c!Um^ x82?˄KyZoM?ax'Oe\`D*_js!d NAv +rb~_ o??j?Gw!9oh_ȏSS _~w!iI7og*nMyOHIxQRt2A"1S+7#\hfrw-3PrJ0>5=񫓰8888e8lTR @NMMOi~6ިt50p9541ӋD _d 9Ք}RE?NI~F=$z~CR'" hlI $ӢvUku[X4U]h5[*X hmZc}Rc #5.7t{^*Afavyu1][Ӻ:YzqQ>-ivĚK#&/6Iȃe$kk_߀Z}so!?̮WbM*'sMA)W7C~okhq088נK@gpp`pV*//TbƽSaUe$2P_tqePܠ,3#CˁW"ط|I)¯ %ye%1jmC=P䦬>azL<@Y^ܶE emu0j)Ng2~//ov5U֐u5K\ح&e%avq&JQMV4e7z/e|ڍ]?YybnvWM'FSdh'l>j IivSi *4h2rؤSe|P/F/0eN2N^ M,Sja]1<2I0#G)%|QWcΝ 9w֦a(zq}n8avq_קjj;MV%D;UwӀۡ#9w8 yGidD[ZKw u'r[/vE>/ꎋ(]oj5wdz?g{s;,pabЂ0[fƪg hf>S ~6s b+0Om33L"No*~C.ПtR(eӽI bwfLu?5\./ngX}-֚Gذ=&m-е!= MDy %"[I~UN"C'#'#%@$,c#[s3H6 Dvګ9Jw~+WsԳL(p?[K2w\U@aVWDDD8on#Z\=Pk'hf3(0;ܴVӕmtx¸"4v$ CqwDzhV(Խ@ʜ?w78Z)ozj/ ;%@"k蠨Zŏ~%.\z+ ?Y?_8  In,,~'-$B *Bㄛ)C8sټ lelp~pB~oG.+/ŀ{w^Jy9J5yL(ÍfF>Ӱo˚xwV?^&61 9sZZ`0bk+<ڽjBu_m"q$+-_"Uhm8P&GUsnul' ;aF\ᒂaadQG%5 v둅ŅW3"gM Z1Ut SJ6GDI$.|y#!sy 4_`>A b$/m]Dk_f/"Ꭷt,Sb vҦz3ŖdZ/(=;Bs X}x# 1Q9/ !{wx1=m79ZbK TUw"C7~K%R|z6<,{B֐<7zS ֘TSVNi)bqna7ŀi{2 +ܜG ӑ\C8tEW~d< Jo_(d7Luȟ3`|^I1*!$V VȀgC^3Ht;c%bL1c~h&k2@|m$ 5d4Fv1& _&PVt13wsxsGxOll#wo# ڀ煾$#ȟ&l't9_I#LMZE-$y0zλUźY5?uW'ܖܫ|w.t,pu:88|s{GܪAJR7_zÇ 'ܫߜ<)-%ū;V` q2 iiM.?,[vbGy~YOCLKfRl;AcQ_z\1SzX~x9r>{j򱓉4nj!T6fH sqP1=}M,n7DLY̧༳>>h}(*=UYG/އfWs+MZa *kA_FA54hH'jǗ'|@ѓ W%7"MqxxfFkL__| 0&?<-et8tS V\3~@keIG!eoryb0mkX pGHwu erPD͍ig1gz_ P:Miъ)) 0j.%ӣZQR}TLXç n.̆ۗh*As]'c!Xԓi''C McR fvvvrr8Nu!5_>]AڏJ_8ݖ¡≒AX}rЀ+{R؈oއ_#N|f6{aCLFFpINEutw Fq ug؁X 3a1C=M&cܲoOazu:,l_"0Z nO?ļ=J=T ZcUY VOccoQg} / [?~ V?Zn6owdhLjc@O#ꌮ>8 RX3A2w7~ȂT"-N'[~/VkP>mh|&(^Pj#qStz8Nv NJ$YutCf$޲ek!Tnׇ]բ}{򱦫&{gT0;;%>Ɨcv\rY cIfs/ !' f8lh6 Ml3ͦPd+i? 1M~yҨ>iBJ/y/ftN>Rtx&_z޸>-WdҒe2T{_I1 $ǏtSDRܜX9b_։-qnjScJX$#vg2IH>6Xki1G'Lfgn~N5ҜO& `A;vwͭQxB徛3<4M|TUc~% PcO1Xt]䉣#obd`v5oԟz(Jn{GH#sdlZg-q^خIol2Rcas$` P gT24Jޛ-Xa4ITzY| j{ς~tV'qn v]_Ww޾`SW\2D{zU =&a#w`$*G\ )'{DUZA]dmVUl5<5;BaL=/rj&y]wSdA;D;WD>GYG3 ] Ĭ_J0OX;MYֺz{cbcutujutF=~&;[r?ps?!ś6(-Ieq}m L,O%k"w~~~4TbV/&Hlu//?fP9n0|Fbgd[t%qboF4Uk6k[|7TO(S"]smg)<BLW)F@ix.)&2|NSFb}*6QWֱc.ouC;ۛqzhz%)82ZѸq"koeΤpkpC!4 8<$ ap;U/_JR&qZCDž_ ; '¬CŠ?)΄8б[11*g=^JR ~~QBj6~SbT$2+PnPo[B N. ULS$osIn9_0^bMaӦJcK_otFA#X|!G;&R.y'r:gKf2ߑU]O!{:/?hy?.?w?.뿥ӿo vNӊпߡeB뿄x(S럨n" *.zCI-08EX++@+m8yE~_g4 V>`)wQS%xm`_y~g']y[yP+~e"wC+uwqӊ࿯ߡn|B<<< l뿏ɝ 4P5v-;,{O\ ||j6E Dn>Kk٤>V.FQ/?[Saư?`/ϥ_k_V\*()yˆbB-nsPȏ]mwMPQm=98WEKO+ Z7wfSN_},66v ә3 1""<~EӎYj!4g(j0.MDy}4&3xatps߂]YI'OFrdO$ymƌ͡kVfśA KPNA\]]z(ޕ@*tamz++`j_jD1A"X%22R1鵹)dV|Up8l7/ܘ$ݣcu$Hxނeҩas͚57Ҥ(M\,tVUUir5g~=2 ' ս:I T(@69pb*bl #LߞȥgK)篛l n1b^ۃ#p8FeˑnW.MŹNDiqisQ dfbfIlWq^8;# r#=藋'6h[.'j3-p:LkV 5k]>o Ŏo:_ +j96Qz_^ɛ2"* $Iȑs<0r,FWSgp# I= }Ko!&P:%OsaH1'4թ5kM W')ycQ| 틼9!I} ^]\EݷI t=e!YU-}RyņNH|.k[27?4ݛ\* yaH<u&k ?ϿkxYfpMPh'U7dqoSDSdm޼6WEGG琫&l2=],eBTeg8}`[%]ZZۛt^jbɳ%ey\0*{iiɹ߆tTj >׳Z߫𐿡.~`$Hm%"~Ejtuc ]J%}Ip*H1VLpduLyo!bjLdsF1D__KM'*ʤ")BŔCTh~wr6iM~DY kjEլw?O,/QK(jP>$z?EԢ~:K*';[F_`\OQT- ;4 "b`ᥱc1x&;چ/W2)|HhXA=97XX3# pw108>MiSĝa8lzVZ:V=!8i3z<\~lQ$uZoz&|yx3^ƙSHɺ݋m33tr g*P0|HzojN?cH8b&zlg2L)+c)Iړ$qGCsr x[)۔ ޕ<ڇ"hmT!ǀlyy/-5m Tsإ}*6.S+CEsvu]7a)0cTb4\=M֎8b}N4ZPP\'3LL=ZSsV=7f鳠={pnZ @K >xW CziBw%ß$~Rwǐ'0}s~|k ]4no$:6S(ΞiZhI깔b5hjjړt.~*/>asϥ$J_$=CS06`k$Dk蠵aM Ϳ"N$?*Zq]_K̤},KSe7 ;bR'A+v㗫(E"X{hH^ߕ6 Ic#p\XiQn< >xm4$<Ә, 0q~X!l:^Iީ51#\I ee]\;&ljۆtQ֖{9u$UFPFpW@ "~ ptP+%ul۷9e'2M>ʹћlWDys`k_::%Oz@ 9pO<K˿Rm&ϑ^q쇅vD&n轇-Q̛!rc=F 6@:l{ m:2ۓKP[&:#rWVf:huJ۷.|sd;-B̲%Ewax;gDzP`j_M$Myo|.o '63.bBp abbTj4@_8~H+'Ze,rkyW'&LGdܹWr,6ˇ +w9/;Aq0NbCT59ހW ʲОe`x"4vDq^Z-% 8[\\QĸGzP:=@pׯVy5$Q|)x:A::; {gY3U(og@ۓ'=+{^nt'd8AK_m#rm{B HSnKd|=E^unc@a J>v(H&ó.meolWTj laY x%'l81ކgasr۞T[u!0\@ 훋i5i@+^q_pUVXw]EJ* ڲnUnwL2-I+x IS 8kTm-r(Rq^bDTXa *=AN*%'7z8}E+# jdk*qc>HӖzՆJBj,BIqKmzI#JP5 dd|ՄzlBzh&1f*2ukt*dYH>W$~p+m#}s9/B=h } հ;!v7،/ n233kC[oпyVã wuu^m}S h!pN` ~ǒh4pN=2b$o7UfA`1AAөp,V0[#>2p0љ&6(z1ݽ8:Fax'C x[I5ȎTdU.8W[5,+kœg"&qP ӧweg+ii`Ye5 @ J2wޥyi@|ܖ3%>U[{'Ռ=j[z1Ȑ`Ї6Vk;ȈAWG,(MЛM !tHÃD90tLk Ͳ#2Vm0 Uq07銍@p ´:w(\pHaLb3b3_KI^ÕpJ 8v$|ceb(;!xDlW/ɩ$8d+x +pwQAAඖ+HA:bJGp z>w(}ģl_:.ߝSMTx8^Y=SKgO"ɊwUos0Ҁ(H.j9mހ~_:߷z7𡀬st=ydn}8M4饭#.-}^CXPѣ9yyb^#d7* DLLE<`bQP^  = P/J -;+0NXh '2B_K1pT& >ߔb,&&&21cD=cJ$ MܼGYE<sjsɀ+4qᝫ!jO'vy vQ{9{zzB鯿-@ LB|/fyTIZ4`Mz!K_:zB| Y쐊xQO[҂r"CaYg;\;ɝ"*y_kIt9,>3=k`hK񩉖(S0nBgl{Է6&]`\cޫ,>AKFyi]_gF[C /R* Cˏexm)~!sz T>FTR)tFT>_oU+tOPazQm[w Q+ &uH6&98VU;!FúܭN H+`* b6ǖ .Ȅ}.%6YDoe~est]bĻw;1u?WE"ihאt&O7e^ȒW1rʂBSMctؒh6:ReJ_eׯv|PV>*kFz0SΒ͍.(Vk9}7)v갼yLB \pܔ S$IKKWVV*+tDV<7n됷F<_F)'>&~Qs,,Y r--))ɚppO Яp+4K:]3ꭌ r-.MvUR> SJ_>ޡ%\skܗƫ,5\oGz,x2Ԏ?fIox0F UVӵ1jP7w/'I@ y7j's o9VV(hMź('؏Tc;vaU'93)ƾ> ,xE1g"Xv?lo]&݋ C|M Cs>/(cXudDh4Tgsrdd0o#LY`"d6rP- U[`KXEx]zQNAa ! Sl/޲Gw%؁X,V٦3 Vr8ChXC{31+Iϟ?q8`|1#3uhAij Lb7O'R]9bwC!S9ȍ蘘mEnB%Uu"X`C|4V"mt qϛOH=EN:Rk}<_ )+Q˯ӸTj>ⵞ|׊8( qB>MI7&xmdQV2׈.ߺJb5Aakvb'xH0Y6RUQ~[ي_zR^)~@ni9%Eŀcb4R)xdW-Qp WB&[5/ssvRfz"jr` i Tce jLƵkawv淏=++# 1oړv'%:6VU/";j>:I[Lz$gH2بOμafD+F3fA%\okⰶjAJa$cu2⥫Y74duJ|HF Ã献^O螛'ڄ 6$/w}Q"r<73[̈́L'ǹ io]34XE:Z§b! R-˟mL靖(JV?), /U׍8r F(?nĘ/Smc]tZ#7dT )A0r))h ǘ%ݽ յx@K<( q8[;6ų@,əϙ2B) prrq'1 뫎ZwNEaW\n JzVy~Fmn|ʗRHZD1 $8dH[ׇo=GlG+԰+{)"Ё$6m5"ixOY3ֈ7Mak>^ijҤFSG#-&y bdX#a7o_G""N~n(֌/]{?&V7-B1)66 AIYbrrrICqU$tO.3vXŠKW) JE禟]`,>ө[4^8s$s|Va 1+b+aI .KYƾY!dw"yU 7|y#r~۔92?T.j2=]T5L_s2qFȡ_@E%cxQi| fқIn-h >ߥ(.Bg1Iodb$HTVR4$Hw$:9܆~s#Cfʂ 9()o(7k}x§bx1*5 +;,OؿImܶj*~2{Hs"0hmu2:2#;On^xiw2WAf' gg-N[7ޮ;b@n,P%_ Bqg&Gܠ?.h5AH zUe>$ ERCN8$7؞=m(VPPD|ҽ-zvu=]\S.Y +vqCaR -5p%Wo؏.-9 #0rwG?8AfzZOO m@t*9OB卑*$QIh%9}}}G,ЬVoE"T:.XZjjo\\np[rۢtg hדi07DG9szU HYoA߬ 2/a{T3`]&NsHe[51Ua~g: pGˑ9c@`HZ!>~|ˊfg]VROԷ"4>"s#e7UFq&>b'n34viؼ#='7Ou2OhP țyҳ\;֛>`ƹi8}w,> UY 20 dz Kݽk89S1k ωS{P4]Ӌ^ut}}|MDL}}{_u[y%ltqz6Sro[c~V+y !p`(H"򴴴"+eee@>?+K~ H?"z`p棐̫QZ+bTOcOH5#{=hno)QqɓRɸ8_\"xcGϰGi$q=lE^6VVTl 7b炜>~H.]/[峛 F}ʟ$xds:Э:ο+8n-OsdRPXO.3\Z^y:DJx"?8Z#ԵWNRQ9;*w мP#j|KJZelPG\{BS` ւ4%4%T  (}RKOohy+kJ`0dK{{{9⾌wbfbRһ422=Ӓ[;豣l)H$ -M'5Ƹ!U<ЫlSMjUELuJI\׿˯W0jh  X5)PxGnQx90szP&e{hآ99v̟Tٳ7 .Io 2ُ&dMgl\ꥀ˕ \Q|I0.'3/L|懝rS)K-r%NZJ^$}hTW!tt4&gY~ᕄUUթH ca?[tMhdf{ЇpĀ'O5d%o|B_hH9ׂ,'w )]dܡXvTL?wt~dI޼M͒NdSʉ⡬?Y˗o_kT[έ_Sqѝ> L&8ۊמ+?cGNKsJ҂$:xo{K[+C?t'&&#'H(C~;A+'ٔ7=bDjMw0fW]_ Ś>)P[n4B䬻*ri>PLZ>1]@pցtd} ooJ-řBD O񁴴7x&7'4m(]]īz=ʌ.|;Tu$|ι'Qccce6.ԣ5zWW?=E {bbHJ8vz{xR15< cLar,o,=L m}Pkˇ8Un `f}DԽ௉Fk L//vIqq33Gsr `_3Hjpv6sX+sСVLA!bp yqLӇ3Qͦw޼ 1W(p7덲ZDoBJ)/ڊ]v"Gk]?m@CC̨'~VKAddd<+T iPRteݷliڶJjoH^ljϿCL(i-[XP0Þnqo+wb͗י,G:yX.w2kK% ;+ b9)OzTm&3@3v+.;A C e'1Bj#VHm!HRY?X  DvG:L0@HO>~F.dyk L%"lB9+5M|RSGU -qLTQDj]ȝK#]TW3RxW~p嚱Mnaa⌌ |tuG3iS/YyyHBb3rUQV֟3Tlyr14WT]!zۆQ$=6ftwP/5i#}I&,`}}}rR@bgʱG-6u0 .a@:ɭS!$[,ԭ#3 23i&;!sro^_:^+X?foHVЙeWx ~/,Ybz0Sdt'}운<z[E%Q{gan!KVφ|P0Çȷ QS2-W#Ժ )7m!zs֞XlNmPVv?l]ޑHS...S+y ޾vB ;aw#RFZZD? q&&6.`W }GErk\]5XbJB!ƽ"5ӽ}ErFj]ӎ 7e250jBm sXTY9 뿸RZRqr' c-A>b7#ϜuڱnSgm-,ȝNnneHG˲*(pnK: | `6"0L\:Ā|lA ^qbmݫ5acn11'/fQgd7,ۍi4oHK"{ >PdWk]~Nw8?]&du u> LcJ$:/7,d-q sO2 yi&[gKo 9`z:iDWŒa^艟W#mzxN!G|tC55uidqC0bIV8SNsTSSenۜY!!(*lD:MFt/'%N *= E!B9RQQH>-"LKχ Mq?^1\ )uiClU|v;5>"\\IAedZۛ`[E߶M>KNN.##3m2bR\Ͻ fv05MOPC}()5aOyƣ}7G7}utllRQKxǗmrcy#n!vVo\bKiS&4nB`T[/"D1XUta-`J 9tP>F7oNv"iJZPEG!W#RZqY_%Y 3I]*ZJ]N\"Ul2ԨR׺ELCEŊ}Ң Uk-m\3Tgvv˥Qŗ;CsbBD!쫜;KOĺCSQ2w_m߯rWss'6id\!L7vfzʵF[jkk.̝-PHe鎘֎6w;z`>*C6ILl zp`bÊ*vө4zp WcUȌU)*=bAk.@q:VM{H!5UhGAzWoo P,'&vL]JV6K5"jVg#H5:Y[!{OICYНYHd/]8aOo0ʼn_]栽9D.դFg&DKh&=zj_W̋+lxjzz%ȃ+2>mWasccPs-(lm_K&OԛKWVþvп8Y7AU5  ]#)k#D͍Dx;vvs!1[Y:fpYAv'a4 _ ~ï^jh[_wo;E ur+sqz蒲H\wgbEQ|2n\fk bYYYЕy\_\Sb}xgMMbbj'H=R0q O}| C斗avttD -Y]J\\A(2#j2'}y g}vӁ夥ceo&z\'(Ԃ'~ e ".qPib}h{: ڣ8GT<6 # \V:C*l;EgOm) )~TjGnlDF6DǏoyMO(gE4.s9(TTT# 1>89icmiɈ|5E bmT鲌Pn B֠5/{Ei5GdI RX*cWXH:*L o+/pת*sai$ i3_7Zso7Lom,BWvR*4 Q=+x}JO]^C--fѯ56썊IV ET0ǹ3ا V N{Hs+ҹTBZ#`|/r}֠G^mzlǔ O ~gJOJg"2GhhhHJJ~[ICCy6TJ^LQ\Ȉ7+jm \[g'셝^h.z6_[;̈́D"ۿj,N#Ln:eF҃wÈ-tH5FmLLZGAI.=r>s,b /60w: 0bN7P] -)*lA>GL\G("=9AHdAX5C]]zzBFH݈e[4 ~jTr,v8sENQ {~""T~.PH[MȟގtVC/AUWǠN> v1q#&mSe@k/:Uӏ#׿qR#2͉2M"Ʊ11ll |+#CyFepWWRr`& cҾ\@weffC.9vkWvA,ml2 tRx1UW ],][+dPzzz1,|!*d3񻺑\Ɠ϶fs.W zFՓfܖXl^]]RNmɫh hW9Med`A!MW 9 p E)ے;,4c܆ {7ME/y=gn.?*m4ٰ~WUx"w|փ-#=cP9.-DmwڝӾ_VL{%-=J%)ү&<V9vOueɬ>JkW>sTF˅2%e3 $2C$%%ף8`V4$;,'.~ H̓nKz!y=o. v<@MC{ʫH2q=L^Rp:T!ǏH~:`wFȒkFx{aGM%=_y_<~Ox>5+_ͨz]#V˛P;K9 3_b$!z^R|?Zvr&ma;Ű?7IJKPTKc酿^vR]񿖊a70&x+k [GS(K%JISC^(.k PoK˕@?w-/$oPB P*_O-?k֡C98Oo|__ p# Ox|>aJY~l%>"Vf尫1> 1h\8ek}byzRHҁGeLWᾷ4K꼜suR:8mi_)'2(޴,7)%% suBpc >O.o(sJI ?=!짳gayX0_vjJʶN7RyyyeU7󱲰QUp ѹ0>-eq+ecɀx^=kaaQفX o]0Ѡcr+o7*.<2 d51x̅%'tW0>?@@vy#Gc ɽʱ>x GGZ|)!s3.utD@Al.XL׎^Zk#cִ֘HMÌo3 6mܝP\tss̬񚚶6SX`@?vJgrH1\#kS6r6-҅x*>jp x*GR"r.EX-űЭC+%/_4 Zlwu(߿ Ql?cM^lˆ{ uڶ6uӽ̘~cm; ^IՐ3tg>W 0\HF PkN>9gν~x'qFk]Q>;^=oOEl]T#>[߸,5,S`;adh - $fy !庭dž+^ ]z1~JUcKvvvٛ<ϥlk %2,Y'6[Jcc>!T E*iZI-+ Hh\~oJzI ' (TqG빐ak+<WvjN)֧Q_!~~mQG#k۷ >~'K+1?pؓ +v`70MtA` ZYߠs$\-lL|;!&>=u}yr\OK;:t]cZ7¢8C:ih4KfXԚp,=Y1$j3&u-9N^["̪ _v"G릓HqxDV\21\BLzӾ-~RZf ZOAa yW Y)|f|3LB9$ u8h(ra+Мpgw7Yt6PTͫ#$<Ԛ9(FW|45X@(5ol|hq^J*cs~2b}T5sbb l !!!w;֙uiww`rH!jk3z`VH4JcyyycccR.~iFYY:@,ϒ1T\=3,OFy@XEIrfkז?./>(ٕ2XwvfaO_ _=)s&V^ďt~qw7:{[dMʼn>C㳵p,\ݱv YxbZ4a3]KuY ) ?/*,6 #ŌV/ S hjnmU6|wfZ%oJʝ/AM)8gUI:L<e"we``-'[aa⩽A=}XLE^npOQ{W"[~uUs29V|}4 i(@A^{Z:ٵ./yoZcAM<+?_Cw+ѷ>Sy2( pAvvvWjiix+xdUMZ͢|Ja[UR?k>5baYقd@-B?젪מJNp+D_°Wz!גo-۴̅-fh䴋uGnPB:ALotȼ贾tYe8&ʭ25l$7ֶz= wM+Wñ&v~B$jTG;p_/1j4IجQ`3Xy|k,p"NomM$Yca(vg}{LbuK8+Li{;U$PRR2^Nt9/GbÁAz7Wf{:-EI*hR })}i7G>IA֒cqJeBqQu,.>ټͳZ ()8-gDkn.}:ˮtYQo~)̋*a[i64aIK:iϮj; lgoyvTw1$3C}Gć@3 Y:ٺS>I؅/3FAl:؅0+"X˲;ތr 6FM $a" r^>9'TQ a}k2%76v +϶qS?f1"LS|GOw,P7b3{,5)L<-"]vAνLpzoU:‰.B;x®< =:뺶#A!>3uS'v}]IV**u̒/ gc| 4[YY!QV&& 6v߂XZZb%++W[޼N졵 =nfƕ9H!*|jhhcl{ :|ESGf:ׅPG*c]ݴGN=\^,bI$`^̉G*x\F;qs<,ZUZ+H nn5p>|{gks >F5V~L6XF &CdٚbJZ #Gi!Q|III=u|f߿IS`:7uIT`/盛MniBlj":%U`֙ӕD%%-?\>Q IЊϨKn}uqi.UfOa1xhÊ/HJ("mlOx5ېĔ65^&?~v8,7ҳNΎ8ܹ;ezD`"*r2 7< fYqf9Έ:-t( p5DƖDҐyX<țB}G_z觔6L r۵]pz}KCIn/GS3z+^Ȉ&B U <=0pxKO*wwP5W}qWg/BeCn?;dѵ tqNg‡ y_Ok3mǙph(%>HA=挾:؆Pkȷ=AudN}\vyA\n:ho2àvYڹb'{!Ce7׺K<; w[oqxX0+}XPVψ 6%%U/։K?˹t rT@4@A BBDyR4=׶H4JR3},|<'Od57w~j ,=RĿFuTxshBc}9'V)fn~ mG.3Q7,Ws(8`!dXۛeَtO.OQ jL',hSQ Yه;FqavG߮X,}?H0D,MOO8al  6K{gl}<TJ%;7%b<6 fr03ʲͺ訅EG3M Zv%h_'2Paj"OQo[ӎ<*63sXW\*it0ֹzc').~x DQY#p^*kSYyKM&D g9\k](OXOh&\.E#0;13}θxOϽjf+}[DzLԍXЄ +11g F5$?L\_fAgIy&6=#`5Þ,-#>=6T[Kyy)^gvx -:;Lh㽣N-(mt A0!=Q2{8?{-_Sip͵>~Xi CA2A3^O79o*%FϬMɋ1'&kxtx̔T5t-JHAaZӭbBr*BeR6Pbʈ6+\Wyć1BD!!1]2S =3ٙgZKK[co\d RFQ秨@sa8KHB_o灬%`2zٓ7t>|AL!%#QmMC#2rd%JVFjy^KDbB17 $= czӾz9.0C/idn/Vww  LqSB"!$D䟎R%F =#x_4i@ S {()(ƱxIUQz nbϛ9HveZVҶ ioBC&#k{?jo~! 7A3}x~,<êNLG= YʅQmFy+;o%ILā2L!Oy0DOx"yn1*muX1[ 2pت/s ~EI#ϯ4xđxHm8$$rp։^>OES^wd4o:0߀}CM5^}WPwtJCrH3 syrr,MLO~48yvr=)KV=4'yoyק嵕4:!LcDPFƄBфJ*Ynj#ZvؐG:__8!{U ZYĭjpgW1yFHV~ A#GeGqC5wGpnm5axMg3lA$555=w E@dm*އPDqUcUhIsdx ȅt*H6(oȸ ޴&x.xi eFw%[Id[)k7SmalA-gHF&X8C/3Q`T&0a4qe;8 3TI 4PQ1# +jyLbŞ&doFPlJY %Ǔ;\ijϋ;մ̣Rp$QPc5Q./2Yk{yzLFI/?#adNL+8i )4\m!˥@ >BijԶb_CۈŇ)c4T("qRڒyPw p{7FK&W՘OE1WG;H/4a OXq6IF_V2THپ}P= |+!(DI]A^*hW(IH) t#Hy1:__-iam'7?1\X'R 8{ ,gx IvVpq~ .!Oh%ƤjJvx 3ꄣYoЂ|HlJdJtpSQ% R89W 7DH B6ߍm+CIN 1f S qmhE{]-,ohF_v6ZF[;/t%hDmƆ؆g`G{ް}%FG\FP@@Xv;WLj˗~s=U$=& {'?0$9ic@#ō{i0Ry|HQv"2/wc;&\@la}skp{ng!b1CHkZA N1r ٟl ; -+* 7L ;G_׫8t>9q Rf1=Օ+>sA\cI5%\KD!wSzGmq,Z@nʹX ꨮgx?ijr&P.hFrMNǑֈPeeeMM4Y.gB~ ١4Ĉ*2/QDMx0ڒ\S#w-{E>,7ř"ty5g\̚Gԁ;G.DWj3DDOᣡNF _ȃ'&p_ )dǢB2d(cd$!dBmD!s2mm;yFo7su}zz^z{Yy}9c3N"B+~:0`&%E'-Y+R;,ll4Ԍ5ͱ放)pY]S󀙅5ո^f@C1l>$|X&nvM+ߊrrIIh OEsJъph#%UCsz|vhA=̛FSjjX PTPHTWF:,\W'mpY.M 9ي]J G9*#u_ ^>qKjOgo+*,}hvaޥ\cPWfOyc;sEBc"pq|tVi0+>;ґH_(F/~`뜆!ߴ*#R?,Lh_c/S0¤nQ?IRUcr*_A: lwSq2 ^p(pcݟ|;ӏv<8B:۔7+s V*EY28FF?RSA"I kcSc2Mi| 7MS^KNX#f6XƾѰ6}tGĴGB׈#DH#žOt[ęD\ %s9X߷bAU##8Kɿ߮Zs?/7;77?;Ν ۻF&@,&FcO6͜gO_sr&s 3\X5eXfCNMuXfejYZ53F-6:7X&۸k+ Sn6p?=RhxX 8|LY\HaP_ 3oF  qB󦤤-=Ew=eY,2~$~AQQ֒a&sD|&d ,Zep[ |5`:ְ,Ψihc WEbM=13Pl ~lf;ĦWn%;OᲲ"ŝywM&i'3HII'VWWU_o+9t +21K>?҇v?^GffɞxM_s-EsXpl"\Dff怪R0Ưzl9p0qTX sky!Fab#zlӘD>l@0 wg%<ֳ'3u/7(TFrsy/!m7$zj%ޞwc!g扫|q1#BXZ٤\.Jjj..,TE|UjWE]o|D{&c%rhf4O+.Nr [oZX''bUb^$봆G衞r9As&Kҥad=}~ F@܁b-؎3㗖dܻAY8&郚\E\~~6'(bD<5"eÑ4yZo=(߾gQ VK=ĝә^g^Kr"QRAT!66wv[)<ΕOoP*_Éx3YʥP76ܖ^=f\mc>·9Lᨨ+[@ޖTw'eithj*$PљBS)k=.H[|]DLL"c1L"0+Gs'7K]$q㶝GTRI2;+@^[]^]?"f0}Dݡ?ynȻTMq5VzzSb]-qŜ/uľ:::n޼9"dRD|;Gέ ,m߲\wp׸ .*˟=9*ah_U;HMY d[UW3LU8,|biiAyV79҈;ѽ^YQ:ҋ?T2?'w!FYq! Z?G'nڪJRdJ>&FGCsǵ{ujʂOz֦k769*Ȩ/z{{]0i}_n_븨tB٤$3<!R;#z\7+de3 ^?esGϧs&jծw+|bMLwj]I*#kNtD> )6_xc10d<[f4˧KK.%DS1LuE];Ck3}W^,h*6B U!||H ku҄s9 /ik{K %υ@пi@r|9ѐO{* OUM1ŋEV=s|[V2ZBWoѥIl%߾ Z<#ץǽ)%i#a/G_^c\&oݿ(]N=SQQ#U#9˧c)=pg-n~_P,icaQgH 3)ӑL^ӼPW|-KI%;Cë!̊o_9}{!]]qis= E]yt 6rό W4U{֝BD"O)I]X E薡P+K`Vh<6MkB{ OZwYcƾ>ˀ0MMPRR(V}1UҲ#_y||$42kAܜ599SS[ng_ښhXlp񓊗wdAn{d#&n{Nȓ0EmJU *yH={'F qMMHa!zT)cJ5U @Kz7&n~ 팢u'zDŠy3 %ݶn[D2L[k|B;a`{DD;`ˌU6a`{vv~s$3}[ SOS#n'lĨFm8B?7r-F1Ih/a Q}\tDDa9VR 6 [ J`1ǁN>a!D3g}W=z$<]3UUUsuu=+Eч85,3`G Id/z2]u>ձ3ݫX|GesU~D_ދOH'S:7+b@ԩS%ƀNMihjN&%!aeF**B5@555vi?DsOL$V@r1,d/MwFL2m/JOOo8M(S337qz|v{-.PZ >8c``q)<.!!ٳ#{]>|سm^8mQZ[}}rwzz30$ǻO\ "% zU/(^dԨJ~ Qg&.&^BnbLR}OBBq[N*6y=yb5deq>}е*?R!}_!( ’^{LZzLcc#_58j1K1($DD"j5aÖ㸓L*7&&S߼|y#R`5. A+ݭ'%W33KYɐkϡ.*hbə{`֍ xgv} QL]JIJ_;󫮮B-ܸqJLփ;!u:@CFojw#KM̎_{119ueE7xvww𹪪vthA@R)&"L yӏz,$)+s{s#dFGGA:vi$? l{`ޢƍ$}~ڝܷŏm3Oe-kвYB\+XWV>E ]zc#Ċaj5355&'bW9KHp$l![r WJj1r^?O ^;54;[)(߫v{SEOmdb2 kooL,66G9鷾HEbK!j X/t?vDK 2a""ԧOkii)Qb[0$zzz\H=.p\߶*BJ}ج+i{ 5Kg}۞-f1vMc0뢒I\oY zXZ1e}>=#oh"^cǰh& ̴B̶-:}PyU3pA<o°U%1nu֟p|ڴ_Um_pn|Qv&9&=*q`B^s~ӲZʠ=5)͝+rJ U2U[ZEtLnmZxS~vPbP_W:f{ʍ361rWVgScccIccc(1zɱYGEկ[9\^4_^GA%QɌ !9+8HOG%Rqϖb3:ӖQ/=@ }Pe2)닋TUaȶʣҴyohj`0\pbFflEŵzU8~…;TMF{Et$"پ!Fb lCC& Bў)):3B*+,*BnV:YaD: "ʇ_5pzzr?!| \|y~MYc`~v̟[ Q]Gzs/?[9E语\¼i>ЅϵGuro[lȖcZܺ}@ mNg[!l_2瞐K^~]*\{jtvXl2͠sb iWvyL?˲H?`sNY4US_%c>p.2cq3=) ^p>@^8vu囵/7Cx/}n6M!VJy\a'/@h vXz_dpTCgX>;: w7icuc#Ń U5y]~*. jޣRn zWGB|O1_BYO;#%#趼|ن{yn~3g.;(C:~u]"x8wtsH~;ﺇ`D!/ɪ|nk9 @ʦiv('*91JsXh$<\WK_ bQr6ĽM*ڦGÝht ѾN9~ʺĤO9@xq;J֟+}|BCdz"F8%z/RX6vgQ3^T>Q\8(u!m%O>m}S4wSCuO 8۬Mv-SP_P.xG2sp:V%=FB^ w([hOۧ>N[NofN*kB]e%quF >9}fҫSg/SK%k^\0U3݋!vlO8Fkf-7 TG;tCŘf`lQm W\Wi|]O!0ً+%}ewzKg^#8x}`os{x0/Γ^N81t.LsCrRdmF ?GMΜ{bo6 #QXMev 8w qZQJ ҭu^[=+i|wj0G"sh0U?%Є6VݛOsiQDKIa d^e`T1#jx>Gd ⮂N/GϦئؑ/npPzRGG_7E^iqJqWwG66>}كQM}G`'"D`/V0o.nybg80ܓ*C 5ɟõصnzzzcz)_b} C <a}$XGW"95Y-}ax\I{A~:7)2~X~TE/Ou*'tԎM'¨x LQюnZ?9r³!-<pߣ`K5" Ċ@!'J^56fy 77!Amb{`ceeJ^Z^]d;HTS5Tvȸhl#N`&鯳8k832^kc^8`efЊj{=!_IrkLa\aZ#:=h߄Y'no(N 0 83K0sDaw2qwwce==u45;8kίmҐGA MPFN.(h/v1-.@M~[xZ; ;c):/nwwť2 Y#qmtlfE"zZFS 5#/&0{&0ۗNRrwOtnFYȅ fouqu_n?R6r@ʕ/: HA#p(2Jޕ1Z9/?:O:{n%#hnSKK9O>sE ~bͣrrrD%{K&8/e^^ўԽ]uu;ENDV~)5qr<"'ØWRrk׈5CK"2-\-hgFsX"i; 2%VͥA״Db4 ܪ߭EBo"MQb߾]]]uiv72bB I [5ƫpP^dYQɿkawqD8i͑al?Hno ASũ&#/N$sUX(Gc!I qG{;ӯ}>7hGp+o HbCs8L(YO@@,;01I6!`x'Qlٳ\ l!dmN/0cc5rcciWޡP|ΆRz/_zwL`ͣ0_o,G? .Q& Lp,f%<ۄN`av=ۖD##ȋ4:Bfi2N9].:%`[.E1^Ãy]2lioG,Mmn3iLMN^9y9rU9.sQkA}G.k0K®64mpZg&0:b)Od+ 67@Bx ̑C^^: o΃0~`XZo=ټ!+x|:3 z.n( YxL:Q9u MI@%r :Bf?=ݫsW/|iCC۠dx.] Rsl}4r8jjj$\_!3a@"@Y8s4) SUFf1C-6|gڟ=t՞RLǹH Ąw|B B$<=W3v{px~V#3]]td`P^/>2244o)Z@\bRa;ʥ{Y}(MpXLƄڶΖs]UTu\tA;4 {4 qԜBe@.3q _ NJt=qzL q߈E;R6 vKAAtPf6ud3_;p`_~'n4F5Ul'qK---v5.5&{_J-]\[l=;E.<cyA4(Qådb0WcGDQ6r!M2yfxK}68zT &\\Ŗ"J!AyGg0[ RC 4~yo&ȁ*9xFX/%t4I')iNjϰ|^|[CmSEv7ĐuVL>Ӗp#$=@$*7ڕRUM>$[?А0(f9L_4T_e8uaAULDĥ%܎4lW,-.GQWu.n4 FUutt\>!MI3֣8L/BBkZ~c7R>Eq7\'.",|Z:?".EͰ0ئKx}l)l۬⛾sQ@M;i@W-%' cgb^T?"1ƌi;Rnf*Ӈ-xځ %Fauu S?DӐ,ʊ:hTlnnNLLLO?X&?^lbzXJ^vcF woww ba6٠l𭧧g)Ws pWKuu ,-)B#P +ܱYMMMoU4}2BJ!tlTNԃ~n!wWʗQV_pBݖWg3Zlny*ܷ_X 0Y ͍<`˷! z;BVtl&t \@z߬zOM/ =a3QOBl%3X;Ftǣφͪ 2󻙨'UH-1pԼoGJgRX8bڏ5䜈w[9G$j8To~9T^}Ӯϯ]w.і^G:qsAJ]sL=2iTµŽ>j=\vq+lpXO٭F{ `6{d ⥙]!R؜fW"·n7"4oCK G*{@OrjߙyNF¸7e$Ǐ1fbrb-3K487ݠmW|N, A wp_`w7?j; Vg.1Dr%& 'fC_w]_'5s}{sR=V_0?';B)'k)%>yڧ|w>t=# :3TyM&fo?vb 3Z<4zȢ2M>VzoZ"\h )OdGćBTL\܅LJRQǙy 80ϧ+ٯ?nw3V?FL9d5EF %A}zۋt5s/QEoT='>"Z%3B[ iyvX)zցnWיޚR*6ʞ)=K9?JMh?$}-|8j !M=r^"]Gg9]y ģR#ւ^l|Nh!+_OFU*:g ?^Tu+X<|T^5Bbv+I:cB91ݰDí/_DGv.n#ʴ(̨gtSsu纮>p! 6EZcc=.|߅2\Cyf!{'ϚW\G ,pT]R헕E-Yjc)G['̄%"OLVRפP0H&pL[8ߕG6nRv3"#PogphH-(nV0F7N[n;¼T|ӝPFE n[r!m}qPe@th< a/$5e׭~{H  tʼmSFMtA8Z9_(4Fv1"|RIdqsO/ BD{h`e۞2 gDΒW˷Bv_zL? [QRR6dsGswFQxf/LXc%FV('^ݢ!ϜwjΩrж@A9NK87Yn p"cYCfWfY|_:Sm/ zOlkٮTѺ <4D0YގhqdmZ ލ=_f[ZVds6](H}_2ut=tHt*j,2AAL86ǑRnCT\QZxeY3HVBɵm7bCVHL\>vұq<>ޫ[4W-*.m"""}Ϡ^*iƱ V/ԎlQVXX QvsMeK n\,: t;[\a8~x)֍g.hMvQNgpib.v|_]]}b]<$sj;#6.R _YݭB'ʷiIzni?K%0+$ T"Ȣ(גX-@^0 ȿcUE:<gm]Y)4Pl۷O"[>^tŭMOgDuZ}_f=[I%C,v^=||hd$ō*y4}I)Qҭ5n%c .n65WU*#1:4vVx Hͽ>eIà}dkd^B(_wѼzXǡ ;G |ݴ=;)p1/bkaV&J: cL)9fB1B Eu>S c.h5(ڊ5ԓ~4ahܻvck"ֺB 88}N ٮM~ѷn6 rV:t bQ~2 zQ@QsG%&a$ XAZ~AÕd#䒂b\bbCRtko8Xd\;Czn\_ilo ;@L)i >6KVe$4A&\$ͱvB "z_䨩{&l@bA}rm`8K-A,z8Xp[Th]\Er+'?aDŸۑC/QTԾH.ՏIis켇 1ĕd\l<2c(z:f͓*uNթ _NW'ǿJJ a\UċHgϫkmqYX*m¿E?nӸ m5f֋MGrrr^t/}}>*Qxڂ\`ct T'^#wϔ6k=~E&$Y+fllƤYSebº8dJ{ѕtщ*/NusuՕ흣]K > BCme6agRA'0;T0SdoR9 =K3_6D%|ǚIH?U{_\|H?`D%s. \Si[-ONN¶P'˙ט_4^ f1![k"y̿ȁN***1׏k756c._FǠh(ݤڿ>X{" Z ujNG:⹳L̋)??;l|sUĽ+×]q)r=P tWl)Ҕyyߤ=4 x]V@Q1yW5Wm 1!$ !5v@@c#,8{oΨx#S[-#f).uҌT33fp8\/7^`Nݎ R_SUohMvKgI~U>2^I 'piqn; ܙS(_1O'q}Hqh=("G+Xtr+? KZ)AeU_ ZJx] ߑQ߯O@mB5'udǯ9xqg/S=wd-'赥yJϨ[<~u2P).KAǤYj jX=5MqX[8#-2 Amq " Z$?xd/Zg&69`y就<9S1|qlܘ/uDЪn%510 a'W5 ,plI_B^]?4zĚ@-tZ`znܢA ṡVaOC1Z0I¦&k|GzzzY3=#Hy`آ[tϟ;´TT:;Ϝx[M }cQY=c1 C ="AYĘߪIUL?{ v1vh!IK[bFQM {Qp;8\ewߦb%rrV.Vm'Y&RzMLV.#4s袿;;;QZqLUS7uLr(G*R-%>/XōNmLAE>yy6 q.9=1555v4:D0W**R]TmL3X*B55V)DgOZw9wu -9Hf|'e ?lMm͋׃Eº+8o ܌{]"Dr}&ͷ*bt_o"-fR&aogE6 al]J S}`7'gggܵ=*zv]q-qb , +`N)31Mة)9TsbƯ)jOQ}2"B[qƯԥ0|X۬'&{RUSRE18)P藌}#Se9s[hYcN()C̺D ✊m_[,N$eݥs^ :JıVn K/fg%iXZ=^ vӿ,%}!\mm=M*񰖲$IK؝Q?@],ƒ7H&^)7ǁܴRU:UMD>ڳXЂjӵu7Ξ;{MxOG[;;CE(wW$"!Vӛ! 0./ʎw=hp@Sb]6YR}c[9_===Lit%J$I!d.]j /h9ͬwiن Zj~+KR]G̈gҫͳ9{Ie.1#Sk1ᱱe75y' Ė:mTZE3ޥKb&R>|Gp#>ϑ`0Jl"@/{V(fC[1.J䙣c*+"7+߿oáDOKD,u󶠠 Ծ@7''_q g"8vg=݋dĻaawC}/VG4>R}bg6?7JݙQQ}jF*@5FA/~t{ b0RRRjzڢ,?<(c -c0fu≫[ m JjJ3 ^4zic~) rs!=6[+ =4=n4МBRdk3#<]7;sdddꊏ%CxOs*N!|A]6-n |6 I+OPqe%Z6թJ?"g~RӜn>fY^^^ZHrIrsQMOgɵ+XeΠe 5kv _sq}ktZIBqOE0)1X-:fFd8Qd\٥*a4'"aLUd t[ pzSF1:qP'r~Ht3kANZ}Qѩm{f bz6i^qow\0DCcqb)ڮBf)*kT05 9 Q9.[|< _CONMkoMoFPy"dҊ^8ntt }4fIY~j9;X|X111"k5ڙ$]LBuOJS |]W2mzϒ.a?KMaɷW2r:>ɯ=lOd?D׷rϴneH7vZPӦ8 .k0Xc5UA7T3qhX\{631 矞(w.lŜX#222 gznI?}j0jZfc:ok4ˉ!++7?BLa)Ƌ/6^"U2};;޶;3zt&wْʙKmH;6m2وa|>(1Wϋ=B\gBchBX|Ox[<>RkGGVhVF0ӕ Ǜ ::ΐR hoshZp],Vݦ2;LbE^3@t%J7!0za7˙bwW?Rб {<YoIt&Qqds-.>7|FFDb8ثes>KqTrةLR:(4kJG/@3NG;z]<:"N}VA Bb8.Ch /<+r;aqfLs5)+lX՗gQk6-]78قh7EF:,aQy/$)6a\>p+2"1J]U~ PskfG`wswտL\=ʅbry Ih^]T\9azA-:иAap6Hl:Jܙ R2 @/Z0il<;\UN z5"YwxxۂeM 7W1 7|֝lK8S C>`EъfQCxHt.;BGܔ< w!2jL IgY@'0j&$ː>5@ou9$O:Bn^(թs%À>A UjK pAJJ]s]./uvW]MRЀSfD! IC{C cO -{˿?8(> kl}hǿ맟Gcxax:As

    7G`a<_65=t>g ծfBM@VTxXkޓkzN"EQ 3jkAϡZZZV?A29€|%er,{SSC R"5uѬbqcIخ.&ثw pZH)?yU[c 1/{_ґ4xwP %YVhaEeYw~m!fCinMA^l #}^y$%!(Ts tv͵I@\Ak ^ ȫ٬{.#zq-bH$⋀E(#=E@Z>fzgI#AecAz_SΔt2%!:恂ϝ=Js޾kFJJʯ7UGIiW CBBJLb]7,?13Jjk=Cwh%`k{Jrɓ'%p[h`bbrKJJyG逗WEUn;1EL˂. ZU (A(P(T34م~*-.5551QOWRV/o 1oz_ ,<ccc.fvE[gjSZʲ--}Ecz ]T 3%On|`\碈U,;ֿICQ.ctZZZ z!Hd_ρ{Zr鰉\7σҨ-Hh,Mǀȥɤ}x@Y epXi,uXHhih~u<=1x(nF Ac,,_okhDi3Ug J./ᄁdkDQ&e xqKPgnqK,SWX8NŔ!_ 톧ݻ>oL!|ëbTc3+!!gFUVge /cDLIL"$+Jc1xxr4{ BtQRHgcX: ٙspl dpCL7DgY6@ISccmZY|j EE$╺jvhHTd:FCu1yd"d XX7{utb-6` ?_muR [B+*>[lӧw(*r<o=mFz{K54ÀsﭬY xǮgksncccjj߼v9–SC]i>*Nf@"fkQ9qv +n[+/Ѭk11Gĩ+KC92!2tvǹyf0h`?7 ~sxyVB£3}+X̪60\_^p+zsTKHΦp!o.P2]vi: o׆:nXNVb^ʱc=Jal=O(CTsGAh{$/ҙK'X@2ǎ|{<`\L(5L̺jj=! E' ~~cy€X!pW ^=s|<vhι#_|q:.Vopꔣi?B`S R 57kz{ -'@Q1e}BZxnNٯYT#隯{N-noP! /(EavkD<@G?㻸D&/_Zɯ88,b1%>oJDη~^HHNBFh6XeoxG>;\(0&/]Fv֭h_#Eݱ?@5A8wt/1bL$M/TP^ӐҜ( ˥{`+? &ow0Jop0e#Fe?-Do+A(Mb"8 t S έ7JIe)ˑ)i׎Ssdno7qH?w~O ^q nF1,Ae^2m I$8C[4f?iѡ#9>5/RH\q7{7:F /۽vskѷpBgY"p7"YjzJJyCҵ k!]+b߫(%|7g B w ۃ''֖`fp5E/ ҋ)!TRQ -qAz2 {Ú_9ॿ8* t \:S/&Z?̈% 'Z0cN@ڲp gL4Sy!:2_? V-)k>KĹm>q59ֺ)s"7D}_WWae(`L1F9Wv1beЂêIS;s:u6Q%歕^ #{^Dr'%|ϠFkX1e/HHw\o)0G|+m闇( D wxn|[&8`"8Wux2a\έnuYp&'f(4@gbOj4;9hy9O@\jI$nZ=m1lcn/=Rl hH!au xx_߃tģ2///8>1:fk,*E ݒgE]yd ٧*Ɖ-XGGA`Yu7fP/,wFP$f= ]=cj$+I\7'CCCYXXE_=Y ~[#""251INN~EXBԎs91o5E\bbb"R0JF/1ɝqbVrǏQ&$.ĝwq"+J䏌2RxT~at~ls c<[ۓ źt/{:k z4޹#?;*flT$BG'Ԙ՛WUz4IHC0ToK/g@Ag+'rJ.j(}^8ZlB4<}\[/)Ա2 J\'h.,sy֯"}<7- 6VV G((:l9b3Qk!A= Kv)Iq-@mqX?}?A/w翉%"aG+7䯭k"z0/䠆g+07ן<@+/(=h SKDؖBŶr/ؖ6ո Rؖöےؖö/Rؖ<öܥϗ Wtj\_c[_Oo/ҩW?LvWmŧu}{M~Sf={{ͺ҇y_e={C{li\Gl:r"Ji(eM9!7ur6}.V 8},[)ϷxFvÿ 8bgdVRO <|QmKIJn]Y("[b#Reb>ݱ hfLlVzHHHTd2//5N9.J6-Vf+fLT[\F)P}# e|.g,seܭXH_GF ⸙`&9@Fl)u7(]l$b@g)>ur(V9M}ɸ8)SZ A(x"w**y'Љ`H5d }ލ͊VoLeLe-xR7涝1g66ĥSb0,YcG577rzFV#rVOqV7۫;冪8mzokM< U%hp֒&,.-X;:[ة\ST EIViZXpQ$ B-y+S6办E2wsS+t6 [=icYڨI[g34IP9.BÃky /IG"N&ZwG999ڤx"8̋M,3Zoz̃!$`($3Gr}R[C.;OP[hhh/ȸ+n'Bx̣򍈃^cXfI@Z_fmʸEX̐"-7{#9[%4i^^xޠrAOok' Q"T~/=&m:;Ȟ~|em\GRp1e#'S,\6&Sx mc)b=q@'{Ph(]kڗ 6OVRdMIع Lw>NY(9LS)a]=>&a3CTt~v9-1nIc쵡ay85tō-8`G)Y%7W1g-X^PS8}<'Rm0{ڧ3*֊C/`22Є8AltLNjGWZi&H:za`J~d+㊠gWYgFi W#G(oQ`m0Y?U8V5J1]qkb(" ~BvhĤcI-n\n< m +}*hkLYcn62*FaFx&=^'|!w\U ))d㬬,ԪhМZUȾ3A`2uuu]˯Fg:=j /􁏍!3D^ivS65 :ddU}8ήo 9n[y+z6\Ad%.nnGht؛аs41QQ!C۵T{t4k j{nC.Lj{ fm1bĂQSʜ)N4dZ 9`@h1 `^cqnm]AR 1$}u D2(:\~,0¥oiKFWcbQC`e=JCM|UݕYπv( RZ&m:$Ъͬ8x{)Mopé>RB]t 9pݻO?N77Zbq[!&Urqv<֠W^> J}޽g}p]M"S'o_"5# _DW`R 0Ԏz\|̛x6#+ 7aE|UZ+&l=,ؕr40fgT2K( (f# Aai٩C^D4s֘Bu}arNJPS욦X(1W~|.䃐 AWVlV FB[Ę[Zg+hj``vx>AwkWeL&n}\U:+;#tzД8g7%4_E:ڑ`3XL-g<6=rn\֠sc$.Dn9p+M@@D6b޷Z$SpmƠ;I6 >>>&n`&f$G⣎kn\iz7JG1eć୰ kWad j7;,!&!F0Y\8 u2z}'GѯXH ;:=?^[{KDG=Mi51IG3sß 9/U7=8=) fCޞo9(&EsSLqɝL' @277ߓ1=59Q!Tu-5AQL.}vvg|"BuKJz\s\yn0Uu_1p*%]` a)޻:u H pg,ʊuCfG\9 0jt .ӂ"z򥶴8}_w\pFv"g\+M!qjhFʍ o͜^Nd5x}OVg:"x~d0b6[騫<~\~~nٹk/T:SpgX>]@>9SP\Yw uҪԓi4>Wd-4a; _i30kYoq:hcSޛm 5Lؙ%IIJT^KIIOfe<7ye\b1+PDPvւTvg<8a*ݳGI\%RL"cń'~X!&y(v~厙lOY>#ΣNV;"ZIEZpҘϜtcP{}c_~E|OI;2`J*D྆y0!CSjOno[/̣g* /9@(fu{Pi;Hn?@n_:VEW& &4\',f \ Jϟnџ-\k%Yͷ4Ⱥ]dջw}|UTT)GU9L'1_Ci*#??f$0g_`qꠌ&mՏL/(VbRMVtb[}mH>S {>0ٱ4Wt'9A{^6vl?_7K&1!O44|GtPL|=Z&skբŪWwiS$d8x,Ϗhdo3~DrrpLBrgd3]߃j =][WWIOFH8R8Fk^" cO PpPh2vG /9qyYeWB\ʢƳ(W1U۰S|~ j++dX؞ehzSQO{dK0^5H0Mٷ9>jv+Wz @jja;$r(^M!to/xwK)n/!kQ{FRB 0D[wc*wTާ6)c "]?wA]/>YiDn}a*DN40BJ1isaawv(/T̹U-#.˛QD#5WAbÔ'@~\z_Ym| ir4k~1 1(Zx9+WԔPlIaJ$!V;TR8&\No$D;װpBƾE&k{EK*6aZJוOrL+@G>vu"98x ӽͳ 8И>MznaL'n Ç܋&ݨ?O, L/D92O@@NNk->'++[ݮF¾(bi޹M33Vu#No ]CGYd~:??1:eVS&>̎fggetIOK3vtT;f -yqӎ]^1|}.z ۯ057A*%U̩sbIZT;wٙ52*J. \<ט8kH~w)Efff>UNѠ=bç?| |3so:jߍrkl?" 5UU)&k ȥSDWd3}*r)(*#Sf|jp+wieM HL RxAL3~K2fWgUL}D=ԋo3ZS}ҳ}AF8w2';,J*0)­D``>i1))a5N]|Bnn.@7@Ԕ N^@g8?׻!uӍ1"r+оhC.}k# PAJiyZg+nnCkajwaS@|{F_}`ݧYAͅ1~*MN^ă;,D9S-g0FE[u(CV$[WB@Ǐ62@8WKx7̖҉8evϒk~T7L">}|KwMVs"!շghjRt36pB̓?R0dbbnC l4 99pppMMAAAKs3E5{-Rl[̹ǚZN:pG;L;ŷ+y ƊCٝ >$Ln>55%egsB\ڪ 69ZmbC&pzSV,LüL%,M5<lrEKT4KLķ*^B)3׆=hn" @FᬈNsD=$*/>/Q}825bӆ53gs'6XW`]]˹b#9$Ԃ˦8߅BWl.?eqc碜W:* Ǡ%]zBSYJOICubFg@Hmテd syME+li%pK)i)E+r9D[#95OcUlq!9wX[r\=4/sʯ=KGUCۮCK\X6DҔ W{s$u).^^9@+[s=6:;E:.S8̩d}c:hD;[+m\Y(^-:mnX*,=;L7Բޓ'9v;[q.jUd~z{{wW,XE.6 ؔ_s)u~|> oI2}ɊSFSB}i~5]zJr-{̺r;Y<_WПv?zE,}w:@ {WP?EX󣏏<ߢ>L}s_Keo}{>/` YQO}>+wPG*{6A_W9ϼTLRC;d _6 KquQZ -"Ba|<#r r$Z¿M,UYBTu\(NLǓy0c4oBb×̠%::^'mNʹna R!sO [c-Q!w._kq:Z`\~0=MHa iD"_#>- h3GG=ys]vNVi+G,b.xs_ c7-Dh{`npLf֫(Ζ4N2v4S&zS]@J~L; ߿BY4/JMރh13Ƭ2zF+1@8q7^X"^l.6prFh!ղTD 0ކ1F|gQ-ȸ0Nξ臫ɔ8uaqǼrǘ}D_U2e;:l5"Fh9g|\V.0A<bhN5[sa99Zs,i1aR1:`DKKt?NaWD"Txҷ2 ~*/n?= b 10_f2=l G܋i$ Ηw[W#C>7ކ>k;d x޳y NՑj5&MD)RSUVwuKFr.927 i P%sV4`#3hJ۞zBVÄE G ʴu455L{?@TUFΟ|"{FY}l}W F &+vuվb0ǕP=s L{gq^$ #\A8Gnt>;ec58,ᑷ N*@2>>ޜ~Ȁu{^sS2ȚEo^8 c}FM~#,N+,~Y>K@da,nRE2 B+ tUa+/p֛rVY SƧ\ `_ı  )q˪vW.?&ܕbYz$𖧨 @O.=C <JcOQQQ :W)2M z3FA5 G_"圏$suL hsG`r~]XI,Mܧj]`c6jlpw.-?0~2V""uar%i,$+AquАn>,bRx.fǬlꕷONz= AOM;I.ؖ?(s@%~?upb \/s0Lڪw۩M8մ@_˘)Q M]As1mͷ/X OÖ? 8m妻ŒRRٺ}'%5dT**!C&aeAt[g:jsuD:Xc#t͐@0($R)tN|E:BJsg: BNNt0 zQijjjd(*%u%UbFGG?fY IDUz{Γ۳=_X}JD%&peD ҽlh r \aAzq !F(?ιR@2kk=>CӰ0:OBOp4z|=۹\'iS;oUܙkX#[Mm&dNכu,>C8=4 ab^4?\8$S:H):-&_EIyΎߨ5D9߂ !a4CT]1 ᐖ9WqUCDo%7T38~N`BM0^JE^QpM7E]`_A}{][[Ƀ 瑈Bع+5mwnCrm[坓^pǐxuGzdEVlM>|]1SNҏ^ϭƐ]'T4`=mPa6zloz݋X 6e ڄq(^KVmȏa<)C \)YWÛvA?%6 ޤӅ(]jX egg6_m6>*IPg#]7J:}XԫK\̐7+jFtկNf/kaTݴ.ؽzyhVVllzE*(97}}i[h7wRoIy4\e$0 t6psqDŽ:&perBRed yv# !JV&q]}8X|m$qпH7>w:Qc-}XK,U>n?<6&eio\1p${wz*Y\3mK_Z\ K<;i1Ϩzҵ <%OGr^A3 ̵R6Iu8fCwID ]#LL/d`;Owt$N˻ċ0SϘ^r99Lednڋ/I]o 88N.HS1 $?5ՐH*4.pZ- $y8C* { Xm9_X;'rP߾ٛDclRUl*#rAPd-0KZ|1m*Xl۳\giWvIY\ PKYY E\ygqq闪/$SAB(ZtIgggSx?#/A|ˀone]X[rOW]\ |l“絬lakU=Nu];DŽ9T7-kWWl$z}/%L GY&Kwk5+r=K;::b\*"wړݏ+шӴs+hX.)?ͬs~,!Vs_O7BGZTu9G$&5ڭDhgjCӻ]\TCy"MIc7f=h3W^/ WRrm\hmTTh2Kr'_BCyIѻwu:EEz}L0ͩ*P4wCݶ9uYx;d*4PE,xMC1Ys7ŝmlX r2?R|hڀݥ~zkscbS&?v3n96rO4?P6:@hX) \pj\G)%⛛hi{Bg|B[40oƙ갂^q%  7̤5'-IKI[*h`86`]!"Ӿ&E$>W}mRi^Bt0U#9[.Yf{Il?%7\/y 2%~9%zKh唗/Qз^/^d9%~\RJ(J ڒѺ/IߴJґkNgsYRNdɯn8%K+x KrE߯'2_|k6nr ?yJ#:] "6; ̒J~z+Tdfԛ]ClNrcuE%)~7ffv0;?O B &PdT&Ϟa?0~}v𔡳XYPDp|ݵkr]YYYQ ]]]﷏rnRoJubeZeoLڟ$ܼY={eR\GiT(:^I][3X aB mpci>Q8HR_*y:o)Ρ+}t|BP Gݻwllljj kah``QcaEVuˀvÊ#3iI1,&7z{-Ghm@)ơN)Ͷ0raTD=}~wAz7|n"uv ~!՜}Bw_έTV{*W$߼9q:KY.REb[_}~V_H M2qe]JJT(B)j[_ɵr+qppLsF/dEa!ŗˆ4F'220X+7 cpTQ522 C\Ҧ LxDs`/߬}U}UWi7SRlu rL\o0qb^ā ٥i.Mž3?c`ACx\BBBLL L&(?E_q):/ণSK)[KO{qJWh۪-Opx?h%!2c/Tnߚ4t #bE|2K3ՉU̐bvv)ќv<_^bɕ2$).~F{ ,s ,?7(y4@£2™ OJB6_zBܨG] d2ĥ8M cxq,@37B`-THlP4Zʞ HlE4tt4/ֻ{x.D*uњ|^nYCt_8>>^4x.FD۲;]].ݥ(ۉ4t!?,Hp H7>F ?Q].@únHmnNIM*hi5y2: {XmH 7.'Iz7KFxpoRVxG]C\\0/ /vug;f'2~ *Mr0(tx`rް-[4!$lvzQ)b{vI>KpZ\ P]ØP /XlnʫG%41|߾1ZN' vBOĤWg}e o5JJJc,65bJ,f^[;6BXܕov11|dI@Nܕ1lRhĔjp؞T$dN} ,GJ>>⚀w)4@K242jbPR`|;7 NR |K}f.C;k 2CNFĺOgHt8E <WT461Nokm5,RQQ#wg]p2g8U&<8\ݏ X6n;=цITvć-AvK%[Obuc $0Ļ8' 4'{XUeJ^^L3XҥAc/mf8.8_6!C?x AΥyv6f+tF'z{{oHGqv!uhՎS$|rs[nOuMH T^}5rlF~]7$2|J_?*k/e\`3+P}4NZ> Rړ$L6lW-V(~Y͹NiecdrۅMBG IJ fߧ??>Xlo:T 8T\5b!,WPt xtI%BȰ7tj 23``ݭfE]>o.{kB=rrpu&f&,s/VϤx<1j}$%52֮nn-IA8]̇^i0½Ögf'%Pݘ870d|j QyWjԇXFvXΕ_]ΐY$v'BC|fF% ,,+(]A/M~ 55ҖnhsUS{-/TuH6d,{\}&ɇ<,0sN]xչUy[/39@e/,K\Њkzu/!eme2ڼIp* J[!zRoznFbR?B`UiI췗Pe0!O5'ͺv&1٥_N[x=oD[sQ1#,,ۜM7P3T:ʦ6!]5[#qWXdeR u<>Uכ<[kjLvyD;n pDn羲۫fUN'ƵVo^Č&b,҆,}ǎ6 =;%+(jŏ53忺)V+)Or6P͍,a}L;3&9φ - !3u1~7PTZfAJ9jx UrjVYY%UyY08m%/$`we0- {K Z1ԛ4+H"e98v֠w%)Ha_6(aё/:3>έ( s=)>W[HƦ2DH8i@B,S'@e"π9-'GarL|}W?`>9 {pD'GP іM f?}R ߉e xd'1[HvZn\c05Uwc}~by1yJ8V}CC#M%β"7d}-^$rI[X|Nk|[xb4ry-HGx =hU2M`f`u>66F*xȷ ]$N6KB:(ILd;HTots8?7R7#[c؉PFHRTt$퉳 1LNR>)*:316̉wZH(}CQ\K16b̒B"--}{z!ұAqaEwU}`[Ӛ@U/<0AdrЪ#_&&,>c*M߉?VK8$XcQfPF.}"~#jr0`kf?Y, >hR≣?(jmF#aj6Ws.V-|}9٢fnh֥or]\&ruF Ֆ ~b=$aEe`"4][n=?\]9Hz3+0x s"0ݾxi5fXN(! Uεm@XX wXx\%nLv$iT ER%nӡ33887*sW.Վ> _&C}fH ї7]^4Z L_dÌǾ$:O22&ڲoQcc$?0koq~<*\]/S^|m=C-x:4W"/cKJ\Z8nWD#/fn$$ i2rw|8F抠S=^!;EĥýKJJpmmv,?}86ĦRĤKC ωoyvzzMK4>A(8!oXl)V2~mhHV WM1QQqnS5Nu"ر@EqY33|˳R3-i*[h]b{4qWj0]^ueX}ђvsCBD FklllQlAdG]gLK__B_N+,,L%@= 6ڀ %.gSȗ]E--5Qƌn)([w>˜G2wIgS\=RW \M>Ď #Ꞁ;FX>@Un,5 p7̑G끁hik ievhԴXlxL6\_2*(ЕCǏu&ihhB\ n8B$j4xoܼi#*Eyo{ȫ6`&N'MYX8vgT!L _5LY!|CUg;^e 2FDv\Vz?|뾾>lC on)  244LOImRFOuB(/PYyªXxUJD[u"z%`#bMƗql!K-68[NC}i&ݢ-@9ՓRSSBi2_OG_|5ͽc Gh0QM6FX}lbkPԖZ#ccct*S#Yxe&&7=,XiFfa@!K2 --UOP^`АB L4l:3rR42E'?;Α|vU9-{CBȶ@R3ihg` Ug]wp2.[i*>Eٺ+cDzdapm6?icfr6gtLcc-_De`îU(/6P9zCz<H֬uv!f"RHW-Na 仚Vg!AWϰ=5Vl=qQH _{K~\\.= =ghǬg*Ţ֜y rͯwD c8֑=+4o<un^^vb漤HZG_"%%U|AqUF-,}HO_-}m5ϳ{p%5/z3:wicnf{|(}}s,@1ЅףV 08:I+Qi%(M8ڱu bk驯4X>GR׻AۻU؁o\H񠶯֎IR͖Cc.H3}@6?L8zf[n1!VC8U#1$'nJ?G@oJt@Ix$eƧvMOMƂ@PX߮}C6t`H^{{z^Ȩ8hbsA9kqIKYN؞>9i4V7 ]>RҔۀrV7k%@ݡ*$ƌも=~b ,_j> T% xjy'XU5243Rwpt801f= 'օ#F lp{]8 (uC5Y0R2Ƞ6Դ\\W= BuÝAթkA mj}]:ww=~…㤉WL0T#u'~^ȿgU@( "P_|&cMik3Jfk慏8_1B|Oۊ @(ut|]h$|],?sY1㇩߮U'hIZg;kzh-|~NDZ:X<'ȫf؂B߿QQ\y*+{v&>+=nV98YdTrZqs'΃5⤝eBKEK&ƒv=H=]RqdeF."kفNZ\$)lh=&rizK/0~u)yTH~/r\K:JaؐȼJgEH„"g9W,[ 75B{XZ{tbir Ѥ{Ek2VB1-GJD tƏ 3}؂N&)}F:|'~Q\w{+9K2K'}txyxDR۵e%C~ h8E;:I)yfcm+=~pFu'!tru#?44t6'ꟉP~쁝az3greط06"k7  %j5z|bQʇ9x]8B#Dcq)mE6u=pyðp9%PPj 2أMLr?$O*y"͒g1FuH%I&dnf*nxx4[tY&6W˖s g_Y+ӑIJ0O"Έex'5.!{>Q4; ]y6/|aVQ3Rsp(Ε4ߘ՛i~R%?no:p&hZΥ T/Jtݻw?l2_LnN #$_('Fѱ@gf[ݚn@:\[ &m!޶.2<@mINNNMm###tȵ8e~~(5Vcտ]O& _5g{SI;OE?H}_?,?U$ ,+~Dw_+G 3@z~V-Yg~-YW3okDQ-Yg%7ϲr ,)ox&-] 85@~Рjq9;yKʮq}Dث yheݛJ改w_Oct3֊QM {R`1P^"$Fol2{Mf >tg m h{)ͪa]85NxY;vaςtq\m$]2<!=R^ɡ䜜h掎Ȝ ֒@B}v'eWPP0i)GQ8 sqv>r(N (eoN+yfih0,EF2[OXrՋd^]JͰrӃ.>b 6Fg2-v)}/ T08~p =ij+?? JJY!b_Ith2KWͯ܊ rIg%g"Ţ|cWِI}i6!Qϊժ@ - 1dI|o&k(nLڡ>0MW.;bwŷS1,yP?NnٰPnloN!)IpC'|\9]-LLx|Ct{xN01{aUI9uГTrggg(ޅߗL|>x:i '9]၂-;[w^GVB:9?7Q^wW="Ⳬ~tL̷l~Q຾o[RSg" nX-An݊ L Nx 1JC};>LrWUEdGU}悒 .~VgX/B}x.f^!Ͱ{7>}ZGnKMQ#lgƫ.pB&Dȸ q]; ;Zpa$<.8waԳ &s,` C~6n~o!\[f?3> 5- fԙ1ˁ@s"N3G|>h~q`} J_Ba~7&ҙڊ4错x,~ZW~iiig9mD?e֣5ֹ%nnw!8I${J%zwaW<׬oxMkj@#6};%&ku"J%RwՆ:.H@-h#F兄%<<ϗVD#PH ƦlGN q&N<̌Y~?nqcҔX߷6(K13 WQu_M\̀ob £ji݉PRo 6}LeĩoMl ;[G+M`P*z6Kڦ]&*gmL%.0`:Б3Aw`V)]R%BzSERqĶSLn񷁵 V2s SA1 l5H䤛E{<d3A)uY@\3Nwiƌ#kX)QJF&; qRqZGŸsAuo+!r/"\1+26G&|h]Tvf(7V#OIKRNݲibOB< =OP)倬dn vu5rdA|4| u6(ܬ%$NjDvCQ(!t$*hk ;sÆ(r軎[6}n&wPQ5O/(t*jI+z $ˊ2<~vPg0vT.(D~ ҂=<=[ _I# fDvǭhlG9"z?R?XG>rMsFēwN(tr"qt>=kn)@g RdЮv W-[c%hsQYdYm{C8Q~5٪k`W^_0xHdվbTTb^<5.W!z,kz ?zOǮn~TȽ!:;bj}T?}4:zs!rr䩩?&r\.@M qy0m<`~+kQS:2:pj#-}{_-'[uU{,^:0󬊅l@=øX jOqL%&d,@ )k0#I;=]!^R71q;]8 0,,̫ˡxK6[{[0zA8\5n$cccgqIʖ@beG6 OL44ޣ9~e~ވ'<#sӍnnvV|ˇ`| ?|ژvܟAIs. Y)}&#䞟0m9;80HM䉥n-Pq sKs.0Z?|%}@uLwWiS?5U5ARg|An$[X0&.a紃%0g=rj괅 ԸAah+v.OKGl^#96nI֒H;NUHBV4d +fy`SchP4%[*o3f&]`"MzgjjBsKss_F+W~_Z{G`GFT7F4#u#P} Vr[Npm_ۀMޥD8;|y|vV|1s;"Iǥ'ABg{;"AdW#9pWQ@™qgu'.drp,܇w[Τ^9}5Srۃ*!66CCCZ'NR4ˁӨNk.\͝[7Ur˿}_`dqVJ%`ʒ7]\ǿߩM|-m)Vmja?zYr9[əE)~G2xT Efq Ki2ax?sUݖX0@[쬮=r˧‚OWVVVU-g4-xUU<ǟ R?YX..ihvk{+[lΣ_T!2LYLZaje4a$ *&8'Gb&쑠#ncbR'W`K:u[)vd+ȧd Q =P[K^ucAA4)6%^ ],mk/:Ǣ1Hc/Zy0O`>ïΣ?t0lvՈ&-L}>Uܺ0+eݗ\WQ y`C(W |˝-LP_+gGl|XN? }Z"t)##n'~s& ?+zxpKIf%&&޿W^᣷g, nF~> J#g)bQ5eqqG3`5@wWo+T>P!j?|Ck+[O ؁qחdղѧ):U2q=3~Ū}hxYu(-kVeK޲q~wXIjѮ)I:NU At~f@S!~xݕ2׋i3H6\p7&㞅U;4B猸H3K/!w'a ߿}{yOYvg]l`Bm׎R97tL.<^wU% FNS:َ󯢧B2:-QɅLay6tG Ԟs}ƦgϞM TMjuFM%c5㨱KK[sijgҔM^g9GT"`T,U|'vQܻ2yFÃ'8j)Qϰ0=8;:ezz:Z%Fн+B;>N 싼ُhu?}>_,tn,A)j1d+pt BA$"@XŌeo 忥$h;|iڂ^eJWm޾;;{nr+Rs$f JŶbM[ɽOZꞱ>C5qۉ v_7DJ =L~3 Y"BRmV'm2J ,F<2 VNVVvb-%1 Q'Y`F&&ݑyAu\wF –eTQb.! `H?.@<ܢSG:.o^tvb"6~mxIŠH:1@@FbaweP BeUγ:\({EC;) * dmb&^@Z?1p,ٿjеJ9$뺴/U$FL%R \cYM{`n^lNA6u}m10+ (:Rg13pQ8c;}:^S{ÌJ{Pxlv`=^%S}(˂E37vxP4|GVslrѣiIaZ2< m6ޟԮFH{-j)jK:SXÞ׌vRWpD8jY P' ?Ex^WQB6zppj"R4*?̟\mTn<͌l0kSQFQ# >sv[R|w=r'tOcTd|<tO4A̾"W'_k~C2ybc-!g70kRRErCJ]}EƼ |1#TX(c9 I7 0zzcT+[ 3TMQ&d;Flc+@?֌u i$<8kk8xz "`;7i`Vd_ $WkDlImLA\ۍ:UZ\,k8pmB#BjA;1;s.o,j]ʃ߲h Ms }*j{bs &W"[WUfk\͠Vۣbj$)f%^ JK ȶ^udJ GrWAd0Iw/>0̧j0ü}C6U߿KQt_E_4 6I8eExjar 4Qo<%b՝\/ -1ӡ: áP3YYY>L n -U:CJTw/7??‘sdΡQ6&k~re TNxM;;;4#nUXđUW2n{L+L5P8=[Kw~ + j8Fq4(#Eےj\t/2n 5pn@SKk7",bSwo"TݹFUSoOW6=mHHDr\&TƦ&~aT༸YQѤ=U#ۀs&?/315"Cf(n;Y]h4ZUEH'HcJZ,p/˜  %:@ rE0'Up >77GDNq}qd6>,Yylܫ KW}jFGE_X(<х k)׳;Dn(ЛcގZ|[I8#\e%X9A899YY%2;4\"m:LET앝- ͢@9:o&gzdtO*1}}}(5R3)a;z8g >eBd>}8wQϟtʖ# ΂tA,hYiqCbuH!W2}(2x8[`+Vt1U(W'oV fj-5颪ǸN{*)_3U,1DQe閁$-g}6S,_NANcE['zF9Luf #HQ!'f*"޵@TkiYޕ5Yq:U ?qDF Dv~Z8BZw.zҘYBB gڹ#~uM:xm5.^8s𽀪2)ݭ6;m^i:ccc{Ktz͌JǕÐq,QzyA^2ҋP#`YC.-XX!HZ SSP+'`ѱ_Vo6ɣ+B ZEh FӪncm sEvc{2TFevZZZʡ#6r<O}A5 @ s)c~>&b0!`2wmzJ#KTe#Tc:[/Ė!Ko)Ŗfdfj0T̍4Mzfv(3P2b np#BZnQ `parHpJMP a>w8"%6Df:NZ)`*f֕hIQhA|qNkWnO:|Û _>3)Q]y(Gea /s֜ *I?@wfT:` |>y^2;%o֐'9M2I1fݰKN'ԡj]5?~y4su]B%X 1h13 .?QXLFW\\;%CC\](qjAxSm'S [$@0PGu~"?`)v6-WIIN%idK9JH1/%S$Wg5B֖oKj_ƕ. 5 դN kufwA)-z17*$߯s)u=I#7N? #Gxh>lo8wn3 K*+,P.v^ak'p _=~) vPu')[w'o{N{tta/7ة.Np;FsSswo_4wgk&Ͻ{z3s?vo'\<|/2~K!&fғD3g94(nxa*]'<S兢~UoE|WruˤMOΑ7USݣo_l)UT`h6w]D|1: Mi/ x}ތৠM헓"tZY B"6ݣv" LjɱQ>Hb2M<3227VFnJr?m,LS!ϻ8?yqAo` UŽ_mgJ)_' g1S"''ՙÄU 8t$\)F6PC[HlҚ=zs Byxx$%_(KU} ɦA AsUd( KwZHYC>֢kM/WhUjӝ)PڸwѣGLAma^ }iN׉67p-@:Q#k -1RRjoo*),ZXX*pr[8x~"ޱ0,O/Yɯi1U,:C=Yz 'Jd_+67KKKΩțֵ{HxK¢ -v{!mzK28 o}xhz*'RC#tly0.S bUIkޕ9 39-ѹB[/u\q,u=H单pSnHF"QƊرJ˩т&;5 ʕ_K 5DWQ6N_~Og-:*! 5!<]r5BIaM)7 ,?WVV%Dq7#8˖>}L6BeAyĴ\h}< ӧ9Ϋxj6`qyb9 iwg?~1^+LcZ(K|Ig?g$ έ pg\JJO| V@vX}0Mh CհW7R+77,'4 &Lz"e(F }ՠcISI7Ot#!Bd> s$9eV^|*( |iy+ɍ&& K0[]Y_x&K BE2 IU;rʑ>)IA8"V2OW2[a:S55 ?!o6( *4wI@qɼ9 ''|#a0p\Wt^ɕsM' U6ٱieYnK@nm}e} F \TPțBA b!b٠Ʒi&QJ{Op;\3FHMh P#&ksԫqc_m_ blܟRF˨ɲOazӴuO!7VNn  Nb}&7l_<'{iC5Ju^eoRSFWMw^} @Gw7=_85%Tp[h3eI6.*6}=}!gG{f[/(8o]d *m9{naGVUu7(IОYIMQwUi 6W8QRu?h}+qxHuFä| )[pc͗>|`M9dU+/oЪ89L]GxbmfkEm) a\̞g+g=V / uwsEuu< z:jiFU'8ؚ+/P=Ӳ&N1uY[tc:37nKüG-H%Dxyۿ|yٞ\euf˔ɘ^$p%Wɘ+Ž,j̜DDծCy]>_iTҌzdfvGbCpNyKɎ>(-5ZQ׬5_C [A%Wta,Շ>i<4teKILL}QK{um A~2SKTuz}nteN ޛD<Եg q@V8Q"#x}"Rt'uu!S UT6\.\xB(F?1k4ČL˜ UPPh#>@̰GG^5op7&&m?'wy!X?}6S Ö 7zd>t%hPM1/ȳ}='z{T| @Ye4bwvpG\PcO2~%?~n2^%x?0T PݸKRn 1759 4JO&#VK]?,ԒR ,~N'2F tvڣ::eedxW O3*6a,kGqDL} @ U&q$/Շegx(1OP :>@!D3#MMMmihhhiXNMcV{E 1'{AhhXXCO`qgtFYBwL0@ +|Ħ]qE-SS76pIJrnr]! x^=f@q¨O5 |̣[5{|g,ٸ&'7`>X?zTxbU~^0Csuڰ'ac[!@ ؗKK1{iAIB /hV6z߷$,_9nS^$)bWv.JKwEE nf(!*w!APU…LLL -O˺ }}}YZ7tt Ǔf9Ń((Lz)bo "zuMN'.qB(pw):fY;u@=%`=;_$́h֖ce$.qSʜ1fy }vȼ1UFvN?inTT,qz 0g{wx!$y>\Cw f?o𨮖u|S3:1;;Xdta3#ݓYgݔ3d[lfIT]N63}nEM-Of^1ev>8=;nx(#7 S9djjw[fwngȌ_]]----((3-vloxHA)A6,)Ҍ*1e:QXQ@|h;UCs*|ȭzj.씊/_35AĸG%9tejƷTxGf)%%Alj8YlUT:Z(nlP좐ucDb6tBz@<rpaJ]DL7[؄rA)@xbNNݕߵ'@_UQQPF0$bi-c~2J E G4m[?3 ^ m>wZ|b[Q~v}uar'l,Pְzc/' tYe9y-!Hе'E]cʩi1ꖀ`Zfƕ=oB}/' e9JȨ%N^S]}(,混Kﯙȥ|\nl"02 'ׁg$}u`A\졛Na| ۣRDpd^ 0 UI0:7DZ$%]8i``&#CɈ«{Za@ OiK\lf7 Rѵ- D]OW_|:G03Z]X-Y9{˦wu n7n> |\.SgJJJL壚uy=Ǜ&6QHN-!GisWa*/.cBfɑ) 6 񆈛7=)4+aT경w4N{t lXr b1fdcse-exu` S{s<_._WN5#漜N$GJZ'^->\ZCCS\Q7} r|sW)n%Cw~K|-+9S8n:Ygfs^o...8-f ~ 0Z<9;=-8o@҆sr_ r|8w8RT5W_2% gYtMTv*6e(RL8ps9.'po&$ݑt驓ߏ"{ |[~vL'}m&Ki艹ȗK[ ro߿2g5|9['>m>?i O{#xȧ-G>m#'?ow߿eq!'f8|ۋ +oDz(ʫ>}eY:}<Go[.%$M>`,W H3 yCC[Nnq Us2 uD>Q3W^ 4}d-nhK }pA: fߩb*Ou$Bߺ!mhIխd T 1ΓVrNPd>fuJ]3,^l:-GX-jfS7Ƀ,Lbe _ x27 TH)d == =g1A"X/+B[z?\%}pi*cd\Rٹ&jаQTi~Uv8NI֕ҝ"Yj;;n | 62?F\W 9;Y2`aa*^zX(Ci]Y1.!Im翌=i`!GM_Un}0?LLWggl?"EBy d~> Y>%c=>{VFGOb, 9˽=X?Z/-B&sTf]R&8T]tIp I`U=h3cA>kʑٔ~d֦sʓ+\A~⮼'vy"t#E?7>ƚ655鉤2!y>X-FoE4F!UgΜ7{}r̹n޿k: \Aiaqt_T1 w7AJ:: .9@v ).<+H5gW34y,x \ EO@)j04{[nl/QQߐ!c|5ξSks~!Uŏ%"82%$k98/:.B'`D;ݷn.!fW b? <0/)q>P) >AfdOFYR_lniA D>U ""e՜ QUU%0?je}`JSsS*D8)k:JYG Q^VT\m'` _6?cѧiI-h^RhD%$NHYT>UVYUחf("q2cU3A!y5O6|=ގ2cRZ Q `X<5P@Cp*NWzb[ZJy#eI8]E*ܶIg A\^r*vs\3h+>Ѣ7&H*ecJɋtShwrvIwTe m䦥u@֎̠2YB767#f<" Km[uHrrqv GDywP+ 唖n{&lE*?QzBsdh;Ү̑+1iY_3jfc#Lt/=}$Ze .Q)> +drn+[x%ABe|,/A(ٮBdÔ mb~(jGɢgU‰AAˠ[HmwA`CR@ aXz{m{p 雙]: ěQPXɸc"4Pd!?GH,畅|sON<$`-MM͑ك5JW]mrRgH.ɴ jŸMhDUԠh6Q#vTcjqLҩNyIbr!V2OEt;srs.@YyjF2P^Ѣ\9 Ȕ\z$5`ھ;1RqФ477nt}7my_-nADEM5M7܏,aB$;_ZۙTNpp0)ňٙ$7,Z'Te@ uuڎivl:^ T;ZEےnǀH]ygE9.0z?1Fp7*8RMSyH-#p'"PQa. 470M ds4~cm!s 2YDZ8c՝\N_%3@r).a܈yU iʉ'U\HK:ܟ}Wc>FS#W R*}X qW"2)/ `C@EÆEK|C]:T~д5r+A;[EsdF -m!{LPpPLs!lsmʆwi(S̈́Azte{SSSx ḣ;+@`zy0/%Q'%1dYJfCQ0.)*M W]*//i<&Wl oŒ%qV93^r@ <;= 3I\4ѤpkN:(ŝ[@䈙@d`0xQ3K_i|skl8:v5p= dgzѸOQ(Ȝ4sm_A/TR&ВeefyyI'/T .+D{3MiBݞFLNb@ s@^;wbqÕ'd*Մ<|o;7$Dڷ_KLL3'EY4%%С-o~~@Q-h0uq/%;LcVF%`ލ5n ^<5f8=l4l4~7ae'-wIv ?nݦӣɋ-t1g& ٵ.iIT v8sנw^mwRZC/?o\+nSث7hcJ-_,Z6 GθCDҧtىGݪ7wpXہ; Hp—V]PڀZ|x[:4/I><8%\dyFi'~NOkŌqkpcؓS91xJ5fzۚw`9h ̇__6qdv&bA~FPC5U SIJNteI @TJCV-Dp5@:YLjTV6%qd{V`,r(*(9k/nX_?a6Zip?>Zy/z.<2\\ST\\ M7})ꍴ 5jpGUؒ\ZZ3P ~[p)c5>pPi > ȦC䌌̡uUUUK}_z5<]4H'A 3o~,q"PMw"b+yuA\H#jB&׵Ԝ+ԗt.~tCW_b^>b?j;<62Io_ˆa z | 4CիT9$'8Ú6޻ i6۾ΟR^TY!I+GWHݞȒ4n^)Ud86{O㺯sZ *J;.} s$(.F(Hekowt$oŠ"V ˼:<{=\]rSL}~z(ST'<ޭo7 yٓ.'LPiX0 4I]sނ j$ T"]Cqp[H GL8.=}$,Q$Cv]ƑR&-,ƶV~‚Q$D;R] * E. QZX^V~fJ-z_^/3Ư/N#.:fhr/{ChUD*N)$."%K&` Bנ/7o$O΂`f ht"8;V鳻Iggg?~w&hEk\,m`}iP...PhCI(t!Ԛ2gHy>]N}J{s0;Dn0EX*b~m>Q!)*5m؅ٯ8@X)Oܴda-$U\100eI$ Rk>Bu>/Bg/m'0b>>QYl.e,jp~ Œ 6Pl}!\^@yr][s7ZHl?7ѠAX z`AcUkNVo߹{gt$kͮOoVcQsco& qv`03^mZ?84w:cX,3wݷ V=vh(]ZfrY;U=|!D^v6uqeJW-]IB͇'y3_d©R8ןT.7Þ9I0G[uf )ut2XJwrcIyUIJ rEi zzx_0Ī* 桂bSujV[0׫H_O2w; [V]޺*{4?)\  5qeAA HUCC4,#CXH ,[U .mQt'pUٓ6|JIAH6(H'Mu{~LeHgD妷|3\}*bH?+{(Om*秋ҬuA`3s:yV{]D}2w q S@;.qBwWʡv + ٚuQ};BBPNS  @ %yM@z@ғE B" L[6ŇaZ-U]vAmGo"'p3SH}}>vcȆbio6X6e55|4ǻ4GK^H1~1FW-RqD.@yo,~YB]a <7уic最5AOЩGauKqoIiiGt-oÇoXuVCHأ`.lEZ{wn(h5yY..# VƟv:$ILTx *ld ~,tS F kw)mt. Zf"0:*9?CvhHKx;>L}ˤ,0NhJI][06 b3=KƝNq@%EYTi; [Q > vK>X"%-"*z!iOyS?|-?5"22Iq2_gގ3DvMDUgV'f]o* Or4 棌Cc۴-QדJL0RڪE@#%k {KVo[t~oħ, ݅Ⱥ+E|}}冻Ъehի| wϤ'% iEbљN<ŖvaO@lS\S\e{yqQ%V"D ԇEUU2ەu3ɓ'OKӏԄ]  <.. SL1o]톈XC@Z9Q(\gf\>y&AgFW1*lVB-bZ/~yQO~h@  X1)`ffcccjjj*6w= 8/jfu@Wsv1_w9X}9XBA]$Z2)ۏI@A hzo>iŒ0+J@9aa_YY6 7tt<0J-?s#@ 1oȻ/)Ag egs  =U,_ԫ_%OyM'@̖ϲ!F|ɐ_<񀊳}XuHJk uµW'x{Lit^^ k[GS!Bl8ōG"f4+lU4s ' |pȡ8IJN0H5KMMgQXdQ}v36n0w\=GYq`` SHSܷⷝu IzS S#-5"I(7Oxdgg]2"##IQs`SEjz.((l1Q QQ[>Ya97ZPmo'saC @rSz^$Ɋ3gi|bzݰuBDzQ󛃵Z?i L÷_y f`Ҁ%q8F֨,Wm0)^`gc]*s"aV8Mo2K~)F$Pˌ~)cr@E [{*tZu Q-Ey 05љ{p#_I;w-zWqGZ)iH%q=">DW_J45E-$2*bط+?pu-0VQQ-buu{4VU &}PCI(Zd&iwD{ST>PV~kyѢtx@D_n;rOVW:JYM%9 X,96OJ_Ig?g?>W[D P߾k?E~[)a~)VPvX*,.[uouUtߊV˹ 8_vs&021j6E6ݨ+[8 ?Wh̵Y\)z?n;[> wZ+GF0Uی8:~Oy}iv}:'VB9dxY߼O}p RQ/SZl=2V܇4Kvy5+d//FGwuIJ;"{/uX-z,=+_N h~ќ[׳wuvn}}ڽ}HKJv鬎WzʆoQv82ݝ)nnv0PzӒ !#\봰F"6U.1 ?ܐ~WԄ@ʖ'2v%n Y Qp8#T-ؕxXzzzo}ۆl*~iW]J?l X털,΁H咱vBJ`C|}%kmTijhh()) Dz-nbgg팟GY~qR%dq=~V޳Vؗt^jimv_wgGY?.Fg_v;D۞zTJ}~!iVMdfdV 'ہ숎rrM/v=ÓƤ#֋0lok `zw{[Z|RFaka=eM`55bB$b GXh5ʣ~yEw!^cŸW߿l~Ӡص^|p$a^_|jd~Jtf&0%XZQB\\\hhhoz+b|F#mip/-ˈYޔ.zx`QL,gjv~1IasMv\xJ龙BKP+ѡ]fRw=UѢ$PzVbxB{@TF[R5 #=M9jRJϱld}vuPS,ւ4zD԰S^2CQ!xEvZzb*)TD~k#buR}(8W~ӣtXvrPBQ7DJˏm߿.݌~bTu2|h6X#<ؙo;{@  #1glJM5/ f~'0r|*}X Tץ}F> lF<&[Eal@땆׏gsz-Yo&O9td\1WЂ RNcE(J!m5Lh c}W46/o s3#jJx Źى;%QtʎN= ޣwnKzC|g=Ѩ??\RD$}yQg0%.00تk!:VN.S\EEE[)5SypyYI &{FUj!c4[h_`[[n~-S766=ŎģXҿ,͌ktv8N]Y~*Fb3H26ʰFW`~ Q ئDl3 #㑎*4Z`0,WvDc&eCڕU5 ,/!#t-'<SU̫ 'Yf4H 5U`Sy{6rjJzU豱1VWvD6\9aȘQMM-yH^1^4Rc9UP5+daa1p= wUk&ЇVq/5-/7\Y dTwHP sЬBs$354Bu8pY&NhUT EES=GB#|nu=ֻhwuvbS Ǐg,P7cа'lZ <=ef-Z'Ds=GsQP(@eZ~aMja+}kv^]`+*Amqr8&lŇ6`]-ʲŖ6Ɩ FV(r+-vؠe;uKd{q4«߾o^8wjq$VZcvńFĸx*ǐhí+B#߹*y,98-1IOnɴi݋]xԤVx/AJZZY^B볞FM^)O~Cw;+]Y͟J5;8}Z@[+T2Tka-f_%[[rW+.< nyH1g7`={/.$w40zC ʚ︲3Fs+Tߗɬ+w^r`L9n@AqA`)Cd3E瞸'xDʭNI4vOםt%.7O|52rzd6F5o6eH$izy_dek! Bs'g`z҆!ta0(dQl_{apn KDf!gW?\qȻ/8z^Wmٲ ދnZĮlsRFqҥ7߳c5ndxKw{:LhiSּ-,ҮC :'d8j0lP|db܍֟L4a0xv=- 񔕲-uޙzʋ [R-ZD?)Q)[ۚp3kv?&?d&ߒL;xC2xEA_∹~t V T-&kDDhr =vë]$Oэ6wWEY$l\u>'޻&r[_@/?}KAXܰn_7Uq;p3R tBj魺8M^Wo,EC#.ɥvݟ[_}}8Ž3ӆ ,pzԀpݢQ[,9غ-rlbw5W{3y\5ĹSףcםUeHNE2m#8<4ª%YI7qrC~8 :v@C#>S|* 6PݕBQ\/ E =7?R1Cq`cggG^zaxM(7C%p>x H[yxy<>ɘAOA쭭SX G>DZ2:2vs}+YǐۀƋ6(meo) +ꀅDV4IYYX(3; UZ^^lY?puݗNr9B#((s<꫏ߪ=I4> <s-wR=)A^,]5t-&NN:K \c/I,m3a)e>xgcJl=d3 n!:Optہ"YAA@Ki8m{X g'|[M8rCyD+PC{"y} q4;|AO\q _9m{ }n#xQ&Y8VeǎtJT/4_@?DdOP1$鑖 xGOw]]] 3R% o P|o4QQ]i2Z,g~1֞`[Vfp8ULbP`uwl GK2B1E:^<|_X|݀8C:nsyݽE$|8UaXDWQ )A9)Q_SSS_^2TqPqwW!eT(U,pԬ|TݻwbbbM/6iWSǫ0vLO{.(C$+<,=UBXPy0_ f7dC>sv"\'Ub$ݝۉ ~Bjn_N:zODó33yjL'N+5*L6X4GHHHH3gB9CfABћ7/]P~358 gN{T^Խ }ghAl+/q —ϼ:[Kj$o}CCs<(i_? /ŃQ@7!ju .5nBTk0^$@4B3i3RuNq+s$+#R %2kvw؉ 0ޱ檤o.// Wט5K_xg> . VZRlRJɠ++Q&泀ppvScV~cO=e{ e0FYC#-R2c*AjDWLۤc4_LQ]RMԧӿ'I+\[z6.o>KP_t=rZT@n޹p2{SPϽ6`s:G)SV.t$˗gWWu)ZWG!m$$gTWW@)0KzxH8W\)>:Z89pRsEU!ֈ O_TNűsCCǾGbivJHH {=& :A's]HԏQTh ((l>6Ք}}. <@ى8k9~tuvQ~C{-c\9(qt7S@4X҂ фd/%vѾ d ANnW!K,LFs777egyΏlbn s.MhtLc'4[~ʊ9v3q /Z:^bB_r GNui?0$Wc6 +WXd6 %.}bh}[Rr,>DÂDdnŠ9'e$22raC҇vs՚ wtt|SY!iE*  IGshk%tփ#şI gA~~`Iv (>z۶m?N}68 ]'/ߺ>uaG7D U?Ͽ'H`iN&.;?#ߒJ#W_?E#W_?Mko3Ksʩ;Wj /4n_9't!%ݥa2ʳAO"jz f=sEI$vA;|-:"P>GbCJ i @b֟`{]lrMS!qoc 5glQ.J;@H>sLE&>7RMMM :¼<@plmJQntOOUIi=]]f&I7IlBgg7nܿ % aCf-ІWVj12{d_%_nXN!FfAy>jħd`4(o+;lpϽzBԴD{"ƟZß{ :X ~lk~yQqp(S]kMTKgΩx0gQf^b7o &J .R8{ygdfNw.2pR<DC@L <{g$=$Jؗu֚ !g;=u~}fj ,,,$uDEE5p7lOLh xjc͈5bMO=u`WUџ+mHaq,Qwz`ڝ_-/S(|A67w)51;k`` )5'uiMxHⶌ-yF?j{ʹj,0L'ZlQ#ʗ,/ѣF@P=vvkQ$=Bm)OWO<_[!UBcN-#xYD=+ƈB,Z8;/[{-f6,F׭!HJխyYc'qG&oG"D`+IvܹX {d @n;w@|KfM,Pڥ9  n*\˛2/i|_! yy-%\t%jV8?iCE^M1ndU9A}zYMg dd,%&TȰz<)d2,*6v[8x@穃{REDEAz;P<ۦxGՄϬ315eg 14ԬYw0K688XV&lV) +'Ḓa_un yź4}j뤊*z^Y$O^ >o&B4 76CA,x+Eœ 4G qP(ï6SK Y? efg7F{x="X8$3S% bg}[FAJ;ݘZ& N;9%8 ٱ<h2d462fi'.6{=2]1س)5,MmO:Q#>C{slgJGE%y2?=(*ZIAy 2~҄I+5^o1\.{p EXY22pޏ9m* lsCQVBi:FNj;;;%L٢'H=;]\"!5B&yܽnx؊~M2芙ڭ bu |-["^iDQ6Y{eTsžv5,oٜTm]o-G\By#///(4Zh%'ރ{33525MJ.~ѕ/ulۑlC DtEc+B}zA/Es ʁ`TP驃RaaW yj)\ou~O(~Mr-,,zE@U*Qg~v|]D#VjCw]n(XOW?T,//WV^Z4d])@wHV@fݙ> Z,k1L)*L BE(6? Iu^1NapiJPZ.5 d-a2c[ܞjS`R7$Βxv0&   D>j#K+UyXGG.Ru ~i6up8` R a]4??#sGUQ Dʡ0ˈyb.lj }弆nvyPȵW X:tmc :YnY>Q 3r.5~*8ҙ) U 5h\!PɄ@4Ėccb&Jlf0.\/u?&CA3g>1KFuw&=vSO@q|$- "e7h?JV.A0UMfZ^jW Dif5f)0addSy'HmxTi2}YN4'\\\$iyC"w5+kK-) ɦ#^9X9u}ZmerɈܑgd ~&̸F]W~\#\[#Bwugȿt_P~%3{wwȿjf2 Rj}+C^H$Vh^{MXvdۅȶ% Ӳ 6Ma,Q¶muH4s I7#E@TQĮ"]~5S݄]5^g캼~]Zl/$ىSntVff  >,qֿ#(v:L ʉ=wnv ]jYMMMZIAjkkN*]F鳾^ϹFn dԂ*MMJie?qVM"߃1IҚ SnJʠJ{u_]8ߌ=ٟ)FҾɲ __A\z+jGmzR; ~qj6ۖaAnc1%[Fp[XZ]5;=PƗ]ȸ$oU>_&;$Ov7Yq{xz+̵7vvwr"77",e u2փLz2 UUU߾b}}w7 26 hԇP={lCN>؄ZR<1?wrkO[|ttEӂ6xBر2~]vvvq6iv]uUN>3nϟEq1q~z茠3+ɸ  ^6%1+3%jVk5hQ#>aЈK{/@E}w`!"edwT'u6)ۑ}uK:=g#Pg_Pv>Ȫ.L("^jz ?ݿ)禯/21]y [Zpt#J1t596V>ʵu}d/'#wl nOH8Fz2X\ FA VZRT?׹V(nQe 76o_M3T.,<Lz'ct,QD%VK}4T?ZdvLѧ}uaehrQJZM,_YKm_8163DL *nsܭ븏k\N-zoP.f]3>tww콓l]P{^j>>n'#ZЃ=ell,X<5'⊊Ӏh]@@OS=<<"xRGDGPht|z nOQZIKo;C2+gO/ 'ONN 6 + Xnz@!BBfv+Ӎ,z1;tW- F]xͣ<'^EbbQh\e _j9zVr]#ni'WNO\-)"v[C< tq6v>5'.^~Mg؇t󰴪S %NsǶAapAvȼ`%[z1C kMpoS a6]0t4&hG^ ycCOH;'Uij8*3\5nZ#q8jp|,ݏ)&D{ώkL\TTQM>ȊFib MOo۝f4Ql/zBvyָ@rNdf?!u2#3%cyXqs.ڀᆥgj4d"僼_4:Vfm$]LvxbWW0 ay*2Ko>vpsgwA5\evw^j^;z2'$?[5kߧbejbMQ?}&(7/V"?xlA"/دm$~m6qM`)/{zomb}}bu?h[{o E8~YOm6uֲ/m|k2MX׶M:B&vJgT,Z5Hد;|paѴZm`ҟV{~nT#P6_6ԶGxUBkmB 1~77o, ;> k;TZbezTGF[ΟMĽ'FLE}_pG<ޓ'q'rw˟r]ࢋ/SEed]PoQ)~99-W1=Y{1rSyNdK=3cY'BnCR'+Hlc| 'lUZ'3WhYnioiYi#-MxVi3cr5l+1@rbndx\ҴWw/TMMM鲸 fgQxa=*ʱ~óm%S{@e kMr0 ~LZ>dqY22<ϭf@BUn?y@^{$'s%S`ʳUYfWg:Ehq6_,ȷ0v ֙txF/} AY,]:s^Y=dW*Li3wrjכ.tʹ:~G 1jA)F0;Ѭ5܏LQ D7Be|c byAˆ?Y}Z j~/đS3MV-"`9C!ܒ<!(][{^Ve=/jNLLrMrgnaH 58& PSƵ@{eX.xܹ'^ymg󾱙Ӊ3̢:%֕x9)FC(ٗѡ*sXR7Zݦji-!#ail/L';Ұk - '] ۄA<8~JT6!*6sqqQѰRywS>Ͼk2/Ӑ7E+(R;)@6_'[ڰcmezS$H>]!" H14? Z jv>  [{jmm՗Lx$'ٜݢu=srŖگ[}#rnJpfffNNNvŤyeGME";`#@ qQQK­:z]Z 4gۙgYngwD۾UUE,3'd$x6T}E"~+sE 881YBq-~ђOS7% f }^7Ӟ}٢ Axz89;LΉz[-QZq1|ρ7Wz{mu9WN?hw]Y퓋х;l12]0o+!Rb@` `IdCBmHF6?oMr17ܭ/Q h'{m:g4DbIAA  oG IoHvt!u@էGy:v}| -^ɻeIt[e{?xs]19?+ѣ䪵l7gGN*rY(CuGk{A^h!ar3Z@ , X(ilRM%wHώTbm/btOgAW A^ ݹv!5?HlT]x HP,gaAAAi' 5h]x1@XS5S)Qyub-'@xgaө/jMM+Ovg)M,NfNMM-IO*qӐ~Ap:QoI?Xc/@P[i$xgim$I5$X+ ]qĚPYZ-YY}}-+u ;,WVVyz$b~dU'̹mOϗ3~*H!`W^QwD(5K#@㉈zp)sE@ &ƫ_\c)^D_α :m2ѿ7rҩmw [XX@tiy(~>9ġqq3ql}bD66x ѡBxs\;z{BJaTss}br x+MaVy(яB2ˆEXpJ )!0c\Kw =)REg0paByK;E=';U?B 6ǧRf7V[P"AnWh l?yPhSx䢫޽}gxR9ugWj5TА*KKjolR 3U{0CM?/{Retï 49ѬEx3d*~sզm6~b6Zp ?wo n%h3$,}=;zҗ,]w\6|FP頂]NW+nQwiM/ɸe5L YX*u%YՀ3T5Ml^!Ur%?F61)DGwFS`Q _ A+@0 .VμA_,3بly~AE? hHvo h_ hL .@?ТϹz^O>FK:0x+03 0]ۀO `*ȋR \G%cV;XHعkB4ywn`g?dBPYlj24eC@ʻuVm Y2ekc ?IG%o/6yl:5o)P1;1/gWv[x>ZYy`(>1kޏNyoM1vb-?%aӆ5cNܪ119 Ӛv#@a8-%r[RPȉgJ<轏66Kos[as f~*lLMbGf|AvՍ^}zGc&iBbep}YUb`UWMM )dJ"߀j1+yrt"+Gxje[vIiUX jij u*1ycb?9@_@Wnsq3= (SAm#Yͱ&3W]/ӹU1K>& wtɎ,ZJyg,rLSK+7<;qÁ@ll# p}Vд8ffHHH΁\-@W;B6g@7 6_{ `MusugCKx$rkB {~^gvJN$Z~3U\y6Coh%얬sixAͭl&=Zǯm;c.o^z(K1Kv%@0H@آfn~Q? vo Liݻ'_Q:𢼝=;P[{ӺgשniWv/S ?oo>k7=zWrRE^;kW2_cHbڷ]Cfˏ;OO>p9 &nzNz'WJO(l Nza&jvF*^:یG|\?q"ej`HnY7;:af=\5'>.0YؗM׶8n?+as tuA<Rz H(:CB4GJ`Jit/!u7g8_Gd|?Lis Eަ+wh[-ӼW^}p2Acg65Z?N<eւFpYYw$GZut\۴F/ygW]j[7;[񟃟0?̏9Og2{,'roaH͚b<3#Ibv|yavYg%\)NJx ä&ئRLո2!fIak8ZZ*x("$KZt0e+A^l믉[! v}}\Q}=vZ RYaW5HQ*bp[Ra5c$"x 9Z;88/9gg`٘sTmC*/ TK ֙6QEDDsR<]h DVV>Lw Z% v۷mʾvw[XĚ{'ӏ󞔢22b 8vLiOhr>(.ښ"6Q*tWV=;$P' ȱU]o3xE:U5J,rՅ5C}:s>/9FPy^ 6Cb_ "=$tlD<ۺ PCo3&LJBԯM.}^*mFLJϔ< o <^]1/~Er^qf=klf9%2#7J%)f$MDa{ O.G7h+]*Еgv*w+ڦ P=z6|# Fqp k!ƀfSM*n37-IТi|L 픡"&*:V4[-L+rhz/ |+ SӖ"41pt277oXZM)knhxfLkjē4m%oXcϭhY{{{ 6lx'K467?xA(4 ޤl\n:E榳^_v zM,pUvqF~dRꍦ1þڈ6a RBdIGiz^tal]]FJވ,Rz딚o\"&sljR)wˋ϶ G.Tk'Rbg?ɕhUzWOpMy<&6sW ^^GAK R^C-6|9,Ac1.b?0f 9$_ڼ0rROV*FRa>4ɭTn)ԥk,}vqqqcZ{*x8 ]:MͺuoӀ % G Ô{0|J3JIF`/] >+ݠ D=-[:DΈtMQaљώ<047 r뇊!t쬢 vGIIHɈ?ˈZULU(Ru' I͛7]w*P.gvm FC`J{{ubNƆge6g{R,ܦ7)eݗ髫o.8\SGa߯vf\~ST."&vǒ~YāI{!n;\62n`$42FˬMuww_>ު#+'?X@Aj?99k46 mUpnϰ3.g4r}ʢ>s 2/ۈF1;sxʹf祫ovw 2OF$i[E?e7Rd7x=]&vse{%ʭ$̲^ L_҈@TTD`}Ҩ%wGx4}hd9=5mE7?dhϬtaEGae_\gԒܥFy ?58z#٧~n శ!)m+P),F1h Sk4w+Vy?ڹ蒻Β}h4ppZ%N)x%Xv_'*d9Gx,Ky2 5QyKFvǝ3Tcj;4'Hm70o-#>g5,,|.Z#H;`Scbf)2zg(ҍ{fqhs9\* d #1#o!IeF&t[7K}F͒2 S3zJF:~ˋgEQ% 1*%A4M+GǗ$q7߹66:3N֋no_oJmδM]5X]>i`Ց).)q]GCC0vSq#rE[SO:Ugggte wKCA٨~ 4Ɖsgދ]&q.~S?|iZ! &?fj¢;xB2$8~JdNÇb-~@`wҜǛH8Z"L ^?~|1cQiSIEJ\sQ~16,`~jq۷Af衤o#.&5k"C *b/eff]t'n7Z{CC`M )5M[c!a%& áQkCCƺ=[3)tf_hFp _`x ~5箵wV!}CZ/ƒEh \~4<7FBHHFR!_N8}y.f%Pt %^/Ipf+eˏь7H].~$@)Hp=ܢKRFXSR59-}<T9 XB/r^4(qgGKl|\yng"{H qse'  R:xyǨaz@tt$>>4 > ݪzD#cU ֥V VRsny=>s0MÌ7l9mMųl1)ծ-췔6E!(>"؛:aB?V`?+Uiw7rKjJ8$Pmq"?|g:?|Ȟ~BeX kEHZvZc%_If1$uIPH"g!O3VU'˘|^ ;BwڗSJMG6BoaOf&$yxMTYuEG3IsQmq~Qŝd^?=$ۨ}U Ks*BÙIXxnHM%˻twl#'{E2}'`U߷rW3be5ܪݖbBK01hcNT j*?th$PD %|Xk{\YeSZ*}"WDv9&PDň%46N%X<)~nst@U}˷fȗ "KRuo#K?)>湚庵8-=\714g6]Swީ'x51FO 8]cwIT*2(]T pNhiœmLwJpURASb`DGjbӥ:4Ztï%<dWGkKRoHq D&zC= uKˊdPEb_,1bӆ8(( ]ftxV-WqaK5xc'A G:Hn' ,E8dͣ Mt—28e;~E('(X;= _o fK%t}}}yA&{R*+kgȘ%;ϹkD'4ި]=Ҍ7777l* cWܜ,)xM =;TF_}dZm\Ws;2Uai6\Fv Dd{,$-{ Q,>K0yFm9\ZڅƂa; WKZx%VaRK{9|2HnNDH(I ĖU& 0Ide~ן-Z]M_qˆl0Sہ߼!2gf&PT`QV3fX:FDjZ.avMré̴4:= H ʇŠ|9g/*>[? 6SFv1%^m`0)7rp]Buf{"1RR^ss$6.C @!vH}NUff5?4fx^ls4WA=KN 6&uENBp]1uP 82ֲQO>5hMkIQ>_Inr|bjF[$x vivWyE`&՟(A,U<qS] @:gڗ`]􌌙aלW! wqAx賟:m\E Pa~$YPA y}y6pQBzbe#{ 3smb SnL߮g{xhDaToo7*Uж"+FTWԔ&hVv\KqSy9~\zzz *~yQޖ#@@z@ߥ{6ZVn"Xӷs2YYZ][׏+ NFFn0Lʚ7u3oO8YL@lOS޽ Nf--K 4S{cWj%6KD4H:va#ݭ\ W@R?*NH¶ Y+ց+FE /#By>UR ~qBGG'K/\`% J+$$$y{{VZ`\IGl]n}c/??'{%>˔DD*+qM9wD@ܖ߃ħߤyR%: Ʀ+{δZ*@e]ӿ ?C@#=P/BfN:)}ALR#)g& ?╝K_1[%쯻Njт+&VCCn:~2+$oZ OF% âv]+S1}A)1MbG]>z?>̳!EjB3V78cwkE@ކK%&&ꞚUü= Aᮈ +߳$~G{|0A))}`[+.hiђHIlgG1:Q/nұ^55̧~ɸ%hp/vEۊ"T(|B"mzqOhMUƒF6Heee}{nxKVըm"ɭ[52u1GGOW N:ՙcbn.w/WRVRzwqn斓ADׅ1ړlkwV"'@y;885] __{fQeVcjdceVת߹ZB]DFܳ,^rZ6X"E݂T:~S \aG^9E4\2prF(i _ 8u]ycܥgY*}=R">LzMzex ˕k׼W7MlU}wD;=?kcA"EscoQ<eee٨J&Zg Llu%?.$pjlC痖W`>|BXY^*V][d"27W` [x0ffZ\Xy!z#j/yk\ywNuA&Zh9pEifϿ??a!_;>nuFgFck3U^ #U@`q%" *~$ O| +W?+_jO"/U{ `%d g\3 .> =,m#2Wxl6LcƲ^|Hp560j`GiR061'DlHF0Iy,)q}3#6]$\ND4DL(2P2Q(*-u6R"""JWN<@tL.m|jnhj ҁ4&8.qCmTP%sKXI矆oHwR333W֫h%<n o)j`E> Gxl}uucNGv:dxVIIԱ["~ׯ>m6+7K 5p=9Tыu.#{T-5s τ'Ëi`)%dwq]mml}j輮w:,uq]b!A}x?I>e5߫scaHQ@F}L]Hvjmz:sTE &9 fyh4h[(3:4Z!2׺+إYfxuYOoŦD$:Y^m!{שӃ@l n:)EV:G? y}ݭBDdoo L(CMnE!g(Eٵ Kzo4w,Ab I ϳ7"?{SiWQ۸3'Rsif40Gu5FjlvVVy8PQ9uV`9Zn5@OK"`iC|FK?|^Eh ^ZZZuim}0E+F"b3Z'0 "_"h^HISCyvv Vfx|!_&uО?'HCtN (cNYŠ&+c%s',Z%H2fnW;9]UOW:ЭɩM垳$12 @fzWM^?`tޫ &砥v/5644,,vVe(Q&6իm{M4U]2v9KVm`M_%Rڦ\qXYc )twt~B^R.G! m:|HaY!o$y$Byi` o< + Uǂ$1%K>Y]6D$Q8}zߘ2>vJe!b$vʑ-d _е@ˉ&/l_ \)WG&8;1 1 /A9 BL" J'㾎VZ\&&,kV}[P<A3n*@RS \}ۂ87Fs F2? 0{6Eb>W9MFg9ft>n"F=Ns-W5q| i]!nеAj@9ꄾp{݇Bw:f~0Y" H9Mjji!,.: Քeysw-dl 5HԻVbiq2 Qu1k98L ;DUDi 2 yKdJР@e&p%3% *uZl( 8B`gAू70>j(94~4·>?7=/N8d??Cs y3%|<"XY*7Fk kz6~H6@VqI/z*li\>p VDF8$ȢR&KpG+ܤc$|}8ASQ.B5;jѸ?}GM @15[P ru6nYY<]ɅxŷzǏwJqRb&pWdiiiqqmPj}raF[ZZj4ARZ:~;ߪ&YsRcA+cc 1Hee$++9 F34łbJȉ_< j+s!dkml1Iʧ/`D٫`6W'š&&I0WWW!}tIJw]߫MMu_sF)U;}:T'6ų12_a΃==^S٥1WۜbbF)ZȀ4$-&AYRޚxQWqDIjT|"-E}B+v`IK (Tn?  S̱\ y ʲ&o޼ynx(#sɣ ţ_D!KWW?==]JZڔg9Tk}GO;PO 'c2:p>vp8`m6]W"O'Mۮ(ڒun h27>6V Nn u4XKn` `bJRqQ|(N#!SH$Pjg8"ne`J`rrܞy tcffG+Bl@{; ÜL%Q}";=(% n܊I0}@]5Umaao 9$6eYp/! lfTMouN4c R7kMB]dʔ7`eTs M7ӟ@lF}l%e?1{g.@757~6qxV^׷u*/'{ȸjfƯȨk SVE*{߯(q s\wɩ8ߵ6i`\[L5KN݅*bʆ3mn3e]}DqehvFGkn q E9Lk3R R-g4h`]b11RⶎQToL Я֪8&P2a8$8٧9.kb4$fXZVn,Vx\3{LFpb󪭝4+1\1fTw`t[z6\xDd3TL'a7µVੁ6*xD~5DK82[ǚ̂e1嬨Sz剓܁ť 8l:>'4\tӇ9e` huVJ:']%iuջ,hs<%cG4xR=x}e'~SmEE!kp3)nUv,XXvb,ohh C|9jq閄jtu xNkkh,)z|*c|L^49&[X.-tUu%ctƿq.}WRA?9f$~p_+!f.QioMK2?@YƗ`m4 [RLu!뎇^Od=(,WσTPTT$ !dVQMjQģ@[B]UVj9080߁+Wxù>^;8V\M\G%ѷk7s9$~VSR3ޗpll?ݒWA./}mܓNVCϼ*7PB]ha }s 1`kuoJ==17;2^2UOK# PQQ9uvq1g2uą-6fHs%ccc=EeeV|""QQQ @@軱HAK^oȸǃf: בի*% =O{-R9rmE J9OIH}/)@Vx$%ϝƾAj MqCӍ!-onEwҶSoa!h.op=<ʧt1@.6!nSئ\/ ɾ?s_b)$񝣐 iԖ.f0KJknTWڔIcP7jr;~@zԱksA2[>$]zM'(Ar?^T GZo(/I4iJ)I㪳wki;v6//oz9ekSǭyx,z((0PNE( "FЌP;uIPv)ho(b@`6p}koʚ,2 ~ i8qhԃjmp̙̔Q 4Q^Q09zm?23061Q̦ڽ>q27F{4F{<)A) 8 II=Njc}w˕ ,'qo.H˝'S9g:*ѭ*S-W+ ' xRI9EEi6ˮ "â3:?Ѿ0x* aQ5pDF;)`գpQ+5 stnS"Ex: OiO2>.݇{O?%˄"wZ(T [Ѯ}܄1H<=ʡ |1Pf./. $Vޕkxl.Qz,5 .!m6R%Wk Y}Y~~SO %;KҘ%j;U&!r.YSdgAT+yDotм97f䰂.`<guM$+)p9-|n ƶ,p6odg޼3Qw?v=ABp *Ҹ 0vf2PL]PatonR!Et[-[%sdX[ dA|:z(Jـ9tJ:M'ɰR2߹Z[C+ 7q8v-nYk|;Iencwܹ!$ <>ـ4eE["*T$D/&#IP ay`[A:7SSS#MWn q36661v=dg'r F7M.+ (Uj#x )]C$g=grZ !-7'x"R'] Goڂh۸mcTOcE}po&{+uNG^$Z`o|h{p_4 Jod 2 X6䓓  J,PzPnf˟Oىc(>HAf 6R,pd2 .w?|hߖ Nk,| -i`Q#ŲAtdkf$M-2-:O;u,! ^}5 DkX]lO}>*-%uW ʶ 6mqp2MҸ'_w%M{ WWghQo : 0X7M?7zzQYұbۣ"2$ ]Br&N [hcnsH#lM# H & m6#ͭIL_K{)vҠ6?#-~plopCD OKqE]E*1ݴ*}7֦N[q ;::Wu_:%K$b(ӕo-DDPbe0[C+ Ry0uoOMM}OMݴsInɁ)-~;ᙁum0Q<zɀ)ڂ[bޢ/&~g>522+$LyLKn}kW<ĵ; $W'.pSb[! hc /X/[?8{U',E9^6_#S=p"5% p8!͏OrKcpͳYGV\KpBID3݃4/<\7i)Wy$m:M?qӸONg,b>{s[lgnF/]\\_tN؍}q!n,UӀ?>i8%Doh1ߎQ) $"&6}O0CyfOz+fxH]gY+sH2,/ܹ (Gg_(Jǹ;p-tE)}ŎN]u1lz>7 d nY% 1ͣ'L<6J]>z%K4HzMĚGxnįz V`efgg'gEJ]OXS6LI=2[hc,9AAQMq{|ōҨg{-c5ٳ!Ԣ|ttT,:'%/|#|Í",2"M{ؗ7%=9 Z *oF&:KlƦ;y>1* \7 ~'8YmZC߿WxSjvzzmS{6l*6PJ-փ/]˨Lܳy";4Z@!Nw!xkjTbЈvH!H|ޞšSՀУaߖJ`'x= ##7t4JRz_x?\Je}oRUƁeD6dddrG=:ࠚ!.G62""@=jҍ(窪n',@։.qm 5q8mSN:MT9 xܔ>^XsueEjp xy+//oʼn'<#=(U5$c:sM([c 0kf];eG,r'ypݦr+;ˮ5 8iG{RIMNp#9+Ůq?ʯA/ ޔ `hbӧO654TPB-ZZZH| oP{f'ze7iV]q2K9믬685b e -huUC,L-`DrgJ"Ç/r?s^9f]nswݳ[<!H6V>.-.' n}[FezƝLyQ(V>][/SVbhg{Vk:AٙԒRW^Uy+Y( |*NqIj\ jc}8I('*긢tʠd&ld1c_$ƶ(`J@\= hzw.ުUCW}JG?;xxxo ^:`流 z9Ѓ0_2}[;+m"]r^Ǫ팠P G"1g_C,{^?tReQnȯq2S SЙ8?!3_hU{AŞ p{f}rŦ?:Eb49hX+:PHw}a9c A.rCU4ݻWJ,!ٵY,/amٚZ$!fgc/0ӶWƬ#Ϯ1-YNKy)*Vb.6WZ#M\NMU bBP "x=c? T֫.uRWNlyd^9AY o˗+**bccqz~8^U:>pH{LlZUљ%YYf+kjVZܵ?KˉBY J iĞ9}Hy ⽃=5nbǵN8KMƛ]ǀ({7%xIg1ș=m/Y.>שpEEӤΰ JY'.&: wtDh~♎}3w)P>jL>鐌EDR4l>t=+۶t$IZ`J/瞇Q]}TM#_uxϧ trAEXd?C"K]&p* H>&̲~&}=,ĭi;S<ro_RU%b?w)O?xp&1><2_fz>t>0՛nJ]*mGb,'RLVqÔ`kҁK+D@ŲqZv9>'?:l6l#/& AAY[[|i-̈x,~j"墵{ iOj1ҞԾ5֘:k'>akb^ ꧷ʾ9 w;MV:EEcVؗTq{ / f@I],ĥSP>3m'QY";cҨvc{%GR>?\&Vz+lvhECYbF =c!8_٩뒁bӳz`q\XUƚ Ԍ7ӊݰee!d `ĝRۍ'^r57-i3E'~e++sKglkk=5O$6hf>Wɂ-gst)j9Uc{E3{!- B*U;>/8=,3^+jApVf_oViQJ>УQ\ |U.v˱y}}<*\+6ȊZaOp}5:c`l0+qƾh% l?%KCM=ݻxWX4[ÓG|$Wd(*"ji/*.~9Q,3yT>zǯx9 Q/ +k_aYS..e 9cѐU0:-U/tsE^nх wPhs L *R-LDc/!#| @d2|,3_r ]h(麘]R$D/sF7&A,k1)X5YWOII`Z(7vm{ccpľ^3ɉۆڄcr 9U񪸍م)[€ 4}AƞWf(E)vSIte+5=X [XZ13`ZW[ZLh/ZY(,Z(" yLLCn5e"킝TxҲTGEa>D#s8{1&1HлD5.%KA2靍s]7V/,/? :'sJ d:<ZRvyRHtz%BvĿ*3idUmgu+aVn -ZJq'TaYgn\LXzU *߄ʺ]"t 7c<JӗӊkJ[g >S#?RcbƁQA3*;khOZS4JaA  R0AÖ~+'ggkZfSXTBcQG?".z~VĚ;$/" 2z>0 :p!?W$\ܰ:#ƣ9o=)1zǦCۤjk-V>tkݔAjJڕIMr)jLL3RY;5&02nz ]QD{noKܵ}'~{;d "nNUoϺx9z/(1XVQzӔލElmZ?/2" p 6{b\\\VPF:d̎ ÖYTgǽlChNڧB WSn Mu7onLO cgABA"Tcmlm;I-S8W ' r[讽?>BE%$$pǯ_,q,@< =&ƐZ*:7g)e\@^###*x';2X ?s¾DĜ=s&>l[C p--BB&1QQQHe7$BCI˯-=VhTqS|}(k^t)rm)WW8\YRYj~~gـ|5} xa*-r_gt>>nUDѤ qa|:ʋmӰć_D\]㋾OtLDHO5MvbץE0? fP u4- <өQ,{Ky::lԨ\(z!;:r=1/Iǔ41m@4V/ǒGzj(tG(CοO=QnK 4c]˔2Ivp‰c q疣~+K 4>(%5|S ޿O뢦Ʈ('Ɋxb5aUg9cov @KG}Eʓـz?f 9?bc͆-5{Y >K=;])Ue,xV\uVzrExXn'BwİX,====Gnwypy;mӌ.=IG. tvqiB @l]ڷLUHNы:}zHOU@EE}˟WP(ʎ,m]!M)əV?fnL IZ7r~⬁0m|t-csZ\fX r"`Q3Of;TCS&[Ƣ8FåysN1li 3i&iG2mU\DD qw%KcME>tb >KlaK"~ Nچی))RTLnrT-W[8T|\&qKJ>}Jr[fw~"?4:>ij29Ԙc:dԒ=` ~Xغ[.>[];}ڨ~Ʀo.D}^W{Mk`?K*ǔ(7zhzNJ<-Ne麁p44mc 'D:ZR7nma?m<FK$(rwx7ڨܜS4ܺhkW׸ap[5^vI4B;!gOz,]K޻e>+'! ڸEG:P}E '@ۻ knb`?eT/?8on&扟PiD۞ T -k`ߎuuuNl:a@ v,UoD|.jC ['fc(ER S;洬"* Kܩ1oL666vmYuYШy jgammFVk؛? -kQi-5- bWWjӕ)ͲلIBt%v;X~: )IBʰ |/\% 뢣/UXa0mnb a׬n;V͔ܶï6<]z.@0_GŚt{|7{7bƎ*i~C9 vvVBӌXy|0w8Y{ bfgl\5yq: `.(`KTT=~UnݤJ_өY72(hh}/(p_Ilb]!7]rs[b׸k\X3aαtjH9ܓtJgJBJ\\-fO_I"?8 Yߝ_JY~N嬈(𯳿Jg:t& ,Tf_5yrr3o/5y~WPX07=n߶B|¿+Թ\KPȼ]N]N^ u/vG?yb!?I7I?g|lb\N^m9̷GK(&->?;:ԻTlU5 dvMU8o~Z]:ddcwT[5;Tc)9440/'[&$$%NC!.tﱍ_W,Dg _ grrrr""[{zztݗF mcK4Eևs͏` xWdÈZZJ 9/_'& Xk(|hjbRm2L{¯jd81g},9An{Kltdw``x$AtԄ#+eW0M ?xl aaM ݃*W 5BG8phI-xrv1)X{{8jey^ҽx@9ֶ w ECn=U~:rdxl8lEC;s/Nw KguSmHǃZ8W-)]k+w,q.ZoO__2I>VBVKgLljR_X],y~^_&555bq}w"A@^.2cHmTeN..mjw<^PL։9@lfC͈H 1fP~x8i8Ym1SBl 9/?4]a&]w2DHKJ ^ܓDCjqmg~m~N33 lF,_}\Ġxv%+1yX.P1JYպ Ԓ3)i`WO *QU׹-R{aARIųg,XCM|MAҪ Ȣz~;AՇ)t?p],p k>qqz ^-5\D8س[}dnFΗ-q{<ykps-!nji :-o8Xsp [Dyj> غLa7yynjX7;]^G Xcӎͩ]G,ˊ9fڃ<{j)W~j~.,pWcwwԔ=JP١8Q4 g`7dd0 2aJ2V2w;3uVB^?|Ub+zWxSݥ8*E/œdzς7z.P`l#wM>}:'IOp7N9Q~gƋ$/sޛ FﲖO5D 1}SY/)<&`44,85>M"mi郏K14!ż z!`VP'謽T]yP!-LV3jXT+<zX{,ߋ9wa)0}#oQʷPBg SaU(zx+Så(6O`aU0i|nƳ)+_ó 6opyV#nMk4aPl":?bvJx2҃uH >X'^i a+AFqss,b:$%mKK+Lo\ECg1HYQ!&&W*IиR&9][p[0V- DBdXNDig|xES1yQHox7Nt7Gn.mxYA"VV؈H$([=^ {> W*hvvLngAaװ,,4Sai\aȳWeEյkMHNNtgr}%OCun7H6/\fjC6?djYIHS%+ X2!To W/{p!#3";k$y oaÁ=1sm'PΆ >9Jd,`$a8iHU1Eo"K$4Kזh*_}u>7&)*6I p"W$ϧV'>8T!h;YNsO_VvxI^ENISSY5CWo3d">irBW|ż9\X7b|7.ŝY\9q=,aUfϻM_T"## N~_ }4ǒ?~dfii^6PAKNV:sY`K4G\..4nvw{(4٥JؘnxOPQLnD$=oa'[e"ɀ@j(%@nIϳm ֒[ rjK~8N\ޖ$䠊’7nKߘsnn,zSFtGggP6C9ðUccvl g3SSS` ?\!4j1\8 Ci?07?LLMWvp܈sfd1|z^idy'^ւo9ovm˙JKK PvNT׼ZgNppp,YPYi\502+yUE0m?FPSo hNt~" ,\qu1O~Fc7FGFKM*ɊgG חx{OeT*Q=W2GN[R$T8]#H~}y^^qskz}K!\*DhUe%gW^{(6c s@WZ棾w?@YT\\/2̔i{}4u_,SA#M|X;R*U 3e -p.dL)djNtLx>, ]WR|c*~b84䵻Ӷ%z@93s]5]/M_m%S̏͠p.?>2߿b³ݔ܆ SZ?:@3 D~=E4n`H,xftp]sbȂMd9g*"p>>>F9s%$$ #D+ܰY1[%w%"4on j=R؋͉\I JNzkz4 r+6."fF-( :d6Zܠ<_yGM!,=r`7xh!ꮮ.j`沱FŹZb7 zHKpWWWgß-D& =I^4\Xx;.hQpr} hÜy'G0uӜI8cm6p4׿^4Bh-ى+=y{ݰ{a,2!Rr7IfJp b(49Gh'cMFa2FA"4M€ s@rM4 fPfDVLEhm⇠}D|/5^07aꆊprvp@l&_TJeeCCCn6VP\͹! HőoEu|tB(rr?<8d﹩d2vQ^\ArFSW#xiB1`AWXkwA51>T#9lZ3ގaf]豹p;#I^5c`WJĎ^.88HC־Ny ;F|-Yp :jn^J+A *%45o4xs0`R tjzNʻ.d k]kqpx`%1p|Y >%^N|1#u"%+F%s,V qp>;u g}JQqus_OGz;6ڹ VA9L9![2Yv "t29xsƊU3@kڪVX jl.oaaLHfPos(s+r;A΂{cm7ʮX$ev1PWM&}%cXO_07͓Tq,´7GOt {gs7WB ! #]~❁uHը[UjߕaT|h.pW-~9 A-Th'ͬ)I@q&s.NTC ;ڢ,BOO_`ݝo>Cצ14HZ|MG 4x6oFwYo(,*[h1JH3GfW5 rʃ6oIZY*!'9}t *߈۶`Et9!qTom\dkE+'X3~&0,_>n =xKgaĵd|jy9 ʫ+u/K88ܶ%ϙpbJ|TG6-uZAJl5V_o1ZcдZ 6W%fXIlgݚ9G#؁dҲ:}&ڸwڵya2r_iզ Q5/@=[ޒ 8kV{pAi<[Z~v1ko#Fd Zh#QĮ^7i3]YP\`*=GΉ \cIa^^e99 E Uա*藏6=sMF{,&P>\x<  tF#7vuޓjo҆E}VXMfTNtNVtQ1$=NQ9؄6//,/1#8'cQƈzѸ~OcZ¶5#B5fjʅWO][ AOs|_hƺih4Ԅ]+yPדB|26iX\T7ѡT6HƄ%:qo7,RzN؎F«4{` 1+QC;1+c?~4׹f 7sdD%er8w9l,$V{Qaaq@Q[hNY0u(4=O"BB[[223$ЊIvmCC$rllLay)Egbx -F{ϧwEXv(Ev ٷǷؾ?ZN0XB#tZd|3=ꛘ8z -%kd]-SwΗ'BuTM:Q9x=ɫw{h<66ޓKUŴYwwGv fvG X~X+;xiZAT@ЬPDǏaYKFc{2-/֑V`SsԕU[HʫfT6:]OWQwH]_quz-]ZqcCVT,@N \ ȐOWgY%('z5)/yxx@ '?GB_9ڙ܂I{;M@K@>A(548'x$qsn$˵5}O~>emrǻ?Gk}c9B|P=r*ǩ|[v͵]}?yhaUS?q;wniAެ{KP3\Շ1?6xhI١{Kdp-sUhr=#tE3%E<ܽ2u?BF}s'C-tǕJ@f!)%)y~3=VK:|[{@cBLt2 ?9W^-y޸nu?D~ty{x]#eGEC <-l2(n\N?ax,.zOK,ge}o)9ttc&!{:.5@jHivNR? 8D~~~Nו_~~^3~B'"e[]4NR:p3ͧc-̉A|][RbP79!mdoPnTkcKqUY;Y/{\_AēcޗzLey\gi+Rw|G-t^aŋwXͱNdԏNEB&WV(N>wqemz% uТH}><-y(I$G+g:kRBdz;Kb/Sfy% nZoD C"ގ Ca21¦Qdh!:1m_S00Vh.8 R&k@P<`xZPfqBu5TwlJÚlR}q_ubZ$Bڡad6{UxIɽfbWrК"V p@ ^JBj1eYU|~܏-;lD\di%M5_c:ZB/,/}8;$U /|_,2[oRNT]6bnZ2D|{p" _Co ,  Y.5&s0ߚu,*gWyĤw~IO::L,9-/~>.f;f'|1 dw9ߛC > A>MCH)(no=M(A䐣 0HAÒDhNB`!Nb4O`"G;1 hxz7n/A I *~0|y|T{TkNz{Bml;&''STex }cSF)4;Ij ߢcbbol}Ix\gMk.hag"S[2V ׇb깟NHF#I ۫_03==q v;2辶N?8rþޝ%pQ{~ƳxaV0٩TCķK3"!YHd`;Wv.8dtƮ+hhj0o Თ=G6NQT^;ot9iO.U5q~ ISLyh^1=+ް,a#Iz UFx*vm@0А|_} 38Cٔ9h!Y`Dt y}Q7N>4 w)ƸApqB( eY [XtCov'l+e:{C-->~rGmG%<0n2c?^ t,SqQGFWw-(>\ f8 8uE@dSA_<.ۦA>OyP)iceee*AA컒g:I//nƲuߛt(-6y&q~QCo* M;%{ܼflN[At%ۈh/l~ gU|C9dwl9Źj$$'jks׌p횇=͖1fʸ3(88hzQ) mnߊGYq;`lu/\:OaG܅$S0y%)6'2GZa,uw tx5 Gzb($60ݰmETrS &|Χd=ľHp21#}A}PR<C\Ȋ=ԗHF-1@@bnS8cȈ65Ѐ0^/ ;y?ߦ8Ez62TQ?3G' C:Սu[CbT>ILck(`#aEwۼ Jb+:B`ÅKBb4<:eWrn6fD.9vqB֨G7/b;Ec0}<˱M^Gد_2=o/>1gxm*ՕxQ400{=5^*^]]AvulwBTWaNdD / n _1o:Iau _ Y j@Vյe~?"g֫8כDv]J1m(mʗ2ha3'H~oIQ?P$xJ#vJ ⡲-s`]R" :v7]\,rO\De归_+2t ᏨlXbD^dg`W<"!@Ýt,.0{Q r`r`@".B?.O6֜,]B\UJHJ*ܐ_x$N߆"|[;at p"si݁!sIܕtv򎭝}ð2*g3Q49Jr oiJb{aE It__1O9"н-Sxf]mJhS'GlUVzʫUzf' <\aqN| 컞D_fS7B ~+3*=O#ț3Ul|/y,ˤqB@r2K!z7Ŀ|6pHD@Kz%v]f}{|)r:PσË_8m ,b4M7T^W3FG]k2ZUT &)mV?gX)WHij7ӱj\wR{'g3fzP񎂧Am㐟{_iˇX/S3&ja'7$ ~).3orib0P3pxZ?]b|c\9rd]?PO^N|{VO>*KDw2!":F "kB EPf{y^_%FXs1{ ICCsJ4P.T #}}}g.b0H/X\rao.6]%#Ʈ+J҃42χ+3yg-// S|uUhEr&ۅ~%65׀zsFħQ.[4ku( KSS.啕ΠrXS,J rjR f eH°QߢIǟ>}MMͮ_V bKE9Ce+>d#*s:GzE-.>8!ӑ,<ў݋qx[:5Ç/7?Z_r㩴nbfF#zZxI4gTz_Mk{v<`V;gDVsXwZkUs䤕sF䈑p &U9lxn}3WZ8%eUh'vA"{n}{8+G:G}LxBADcmp&{eA[_4X9L2ðx_D6yaAu("g7wOpWQi쬭}v֒wnz'xCQfA5cs#݆+^7c>8^g~v5FȮ\RVžt=st4ܬ!A-A%K<3^>AhD^_V1R*.nd*~G@Cj()uY{Ǿ R ~4oaGMgPQ»_iRHaح+Ov_T0F"=Xp_i@E436~"gΠ/Fՠa靼RxA;.<:Eiͫ0=j3^QwƆ'ߘDOId'=g޷#e,2z Go_+}>%%P$BxG4.G^oM(99ݓ}}w׼8G^F" } m^p!F#o޽ <ϽTcz:8-͵[bҭv!w ͂GRb^a  v*Tdsk$s8T43ķ%>T91-TNNQ%7??qtQ/GXmê>P6S[ݏE*1S#xN8W ^+++KuY폻~h_w@Ue5:)NԳZkkk\ValjWA>lyɬAfSpx`Fb*!|vt-[S_ǰp;܆XK#ӐHwf2cK>Dk* >T\yF1=Cjo~|x\Zϟ KƔPr0!c%OU.ˆCƍUS1` 7{yD.h|G,w!Bt;"dp#\%CGB5!QU*aJ o`iNI>}=ɰ Ґ;yс[]ֳnU=>/&<&~0 !apP.yŤYkNTi>>]hۘ,1ӫ mh $9GEdgdT6I[+첐ѐ8T:W!r*$M=I,>-{.# P,ЂV% Mr;#{z? ;W w~GSvت#Y;trJ 뫥#6=f}XOhoe ψ*s#D6Ik~tX֐=0Qn ӎwrGq2A툌t:{*~mx SóYͽFC{O(B ǣ"!^*L'ZyG) Zj2<ԫT5a(0! wOяIoRʀS*Wwr#4ӫQNiX}HMuwut_f]jjf~s΀H{Q-z;u7zm|( h\@@W F<_T3)i;%[ " s@]awN IkbHB0"uHk/Vx'` x=ӵWّEvH4 SZдq!,آ iC. X<uJueC18!`7xڰ}&RjB㰽R]qdkoGH"HȘ3gTM _ƒUX2ukkk?w{ްlqSa@2@̛uD">-ΏuDgD4+1?$ 耀}ľvo(SHp/t6F1wnmQZ/=؛k{!Nӷ9;Wm 7Lٳ!^NAkE9_ER '`Qh I̮[nu.шK}]Yˈb]Y 3yۧqq9ېN'.f(gF +w)p>%BceiF~&;#シtjO"jLLLh̵*ڵZʿ"Qڶ!QRRT18Q͇7Ა7Z-Z#,cQ΢eTq!W+ocxwk%C$L{\#D ġcCh&n  9޺բn3Uϙ(T0eyQ;'wJ3ĤEY.n #))ߒHiU:hߕxU҅qGPxˈ@WgN8U&R-J-,,aק`D捇PZKM;I?j^3|v}gƳ7쿵e#|x*66;:u uP*K mi6KNU)dh$d*MH|S6{kjzBj;MzHg=sss+c'oY ϛfMU_J{S(ֽq`jX4((ʄ$ B+9ke}-1,eˆ󟹤kUqwჼy&:~-N"Wf۩GP; jE_" IM>qg`33k#,=J½n [-SXDOb|dLsqsېTswm]$"~0BgE!τ:pu_S*j RF guwChS>lCpLU!9D[PBSmmm>NIbtIݱĮ|R[i"%Ra0fl,mpB(d+=:$L8Z n/A % ``4زYkY+6DI?C *&;s}||*Ɉ2k)G%(b*//SN:[PR\,P4??Jׯt9-Mh)o5)´X^z^YG$$dhfMJ\'oeR~sg7-rysMkKUMMM|aшHG7*:H6Bۋ*,dXY͍\bUUUiIvee'x9^帩q Lۂ}o:hV=?_slַY 8ZRb ^Ӄ3?qx6($$s:`hf젔?FЊm8oP U\8'e-!KxfsZdfܙb%!c/2 \J2G%It)p/؎GaXY&`6eC SQQa_5f88^%͢fLq}[Sڦ=xݳl{eJ0C}I7>#p}~e~߿^ōz [vd;Otw}}:\}p;jv9lymરmB>V6=\Tc}[E5)Dg?Mmeǂ/_2 X:x C (0-dXf@1,ml 9&J4jèRyxx  p9)Zoa۾235".Yz~՞Ki-9 ,)m;n]!ݣ SȪ{-ev,Tq>vJ|rp|8$ćH .rӹ/1C."HprKݑJ{mu;^}#lءqQSS֚+ddڻr/1|$VJәp2X> w>m㼹GkS=1_˰J!FlmuKvp$MX55?nowI+^=0mi\SGghP+u"h:2J< ߿]\\ ߖ O._Tzm u,bPxvhJUlt) +UQMa ahj]24Nǣl`ɉpHH! ~5cqc e}OpvvPrfK=ݭ׻fxω3̚,dD& õ{u "p~@rOZaKށJ!NE;ra㙷`*IqqoJ/Iްq`&r{ 1opLsU`7lψ3:0Q¾KK?8a%_r۪~,xS}=]ڌ7L^`^G"\F +Eŭ,MWp5 aXN5іL@}c{d$s>{Y9+dzj' oXN#D2acN~[#bñ&O$Nո6]5% cƽ_ia' Ҏ\ 1½L OqY$@رkVn^PI~SlRz%" 4NjF<9yf$Aڂ!>O@ 44 /**-=\>P;a"z#NMiT|V xowuuI~.H ))Y6((rjeG?g%XY[׼q߰\<Ѩ w/ BM  i&&m*ףH]cUŔZxzZ`ӹqyZ1Ns]C*2Uof6'fdd< Xߏ_hkm0>^H:eL~สCOE;h}r" *=epbh;٣񱱟P,|)RiCsKAw>UD}^+OԤ:0pZ~'̈g79&];?FXNnx /4]R}XFk*?_wKg. }"cWxmLw`9E/o2NxDG &0fTp=~6::2>V^,P@s1Tz_LKm4{T׵ * (MiҤD@iRD@Ҥ 4)BU@@$B'@(gspkg93ܙYf 461Tg%&$$XEQ.í|5_ԙ;Ŋdrll;By@uMҗ g[ Jrrqe!-bҜ H<,!zm3(Q}KaS/+ҷVȳ}Xam}Y5aZ>Is=Y [Z2ݶ:-6uKԢ3Q;,:MG- 4ߛq>r E*z,(q&C|_Z"U胐 [QQർ72du/B}-I*gW:~H=HdH_RKHoV{Jrsdz_PZ@H-p[y|4tk@$&o=z/m8ca^ ?cnr irnkä Ǝ"WIJʈP%@kxjZMQ q$VہWY(5Yfs?=n8Pu럻]L >{+򥭭\(ӧE&{JIFIHfT N >J rr;.q zD'l+")9DZ=pCҀ(*1Q4 )=:U 7ntX./@Bm&ZsM1 F#/\H/$ A1`5fڋjg2C?‘C@P0J#f"H.HLJJvܼ?;;FY*͛gosD;4~:AL*~R-s4!R21ʃL`n EzvR%]FI(x˪Y0Do=MjT ^F/ 6ywDUC>v 9鐀`WD?YPKpѽ  B0G|+|W;9f,1l .ZDo--fċ0LM4 BM4(u=DA!VrL;$EEY?2C^|1mQQGDr pU{نp:mR@]+fiSꬑROw^C1.-iUvd7Frvyo=Q*ڗHY`fAGNvvg% '%fUϠ116 {!VWWUoL2wIݲ)w)HMRTT$9SudоT̖#{,/`ӀT~"9;;91O 5Pn9ޘB˿rǫiTEI˔K^b#N & pAY߭>'+5n_(4Si=',cH6\{ٮXm9(gy* ,Bnj s s[UG4 Ǯa^o%='n*tRѹbc--- 044Tmuf)jĆn˕76@Rr}}Ҋt#=٢`e0tߘN][i ?CC b6C(B$x+olə9ɉC$TpEi:u"x<R6I\r*+s*)\)(.`CBI?\d]ԍ+*z&a6C *|1 ʪ䈾R Y}||^:6˵ ^B55{WVV&'S\b5)߱s HwUl)t10<nX3 M;RVfcg'X B:JO9hdX1 b5%36|Wxge93!^#n.-"!ZFϷQ`C1 Y9.0!R:wo2ݵi}{47;RGaS ʣrʜ*݈]> : P_XX/ :`hO{A*nkɚ-A|I>SQQUNIU cnmUҰ  yY2b}_U/-s;3OXVZ>HJwNr4rd(%,Dfek\)zyvKuUlL6Wmk_/Itq$\y+:۟xg?[~Yv~EO|uϢ ݇Q7%6ǷAe9Aͭfܲ>mGV-Z6bKQKtC@OOlč -ko~f"&'{)qCƖ< ϱH`N\ A1m'hYZG}n CIO_\`;`5HxY !*R|e c ? bePKG3K[3Kǘ%oigF?i2z?1 ݭy6^xHǜ6!7zll̘7H! gwNyU핫J 5zݿO@ƉXC ) R=U/<܍u$k5ZDc(Aez裕Y$gK ñxE\Z Xd:2H85i~gk/׋BnwMDK Q$n Mˀ-> x0M+мbg> 0˗{QWNCĀz9lVQp {I&05X-r;S$Z`f~<:Z ~$*7^&&Xφõħ 'xqikFS++ų!$'ײI/5! $}66Am{$q1&-HyOQj՟,Ce݊X{0{ν݅9BCao%Vqè` bcM)g A>t0R}!InܜiTxO_9RY6$*A &JGcLӻC#Iq$<fBna,GXCf ɗXEaF^nS/c`|ɖ3>rI`]nF]q|Ķ+J7bMd9$ \j63~Pvd6*nY &vwd#y $9EB e&$M:`xTZZepZ9o?݊>5Ogݮ([3PnKF֎|kъZ-7܈BÕIY7%N b,Gͧ A\,Y fk}^='E`d e쵭$yS5-ഈ $ڠns=HM1$^+vD,ђq>pLNV+͑}+`#ȗ ؝m-+͎/UW'%%H4)kӭ^:ѱ[+h=ب)ԩ1Ԯ;fG!4d>?7桔% C<~^90*2ʑDE&L։?!{ ETzI"A+0u&)4_(;mQ}K%oѐ}*Zq!!J|6X4}e/CW2_]Rr0@"r܊rvMF?bXuC4zJJHp{":݃Y0O$'' }Dwn14z&AbsCIYŽ (zTOc"I`c9Txz vHyM+;0%,(~3H\tVZ..ȍhޫWھ 8%]!`$mlXkj-QIAO(!enOG"{v1w 2cB;(Tw57a8yQ6KDRbyyzfͩmӴs^2m&m5r=r` ynE @G'.>rF=OZf뇱 fJUeNAY:6`XAͫo|jfFWz-Rۦ5e;ښ5sܖrsh&o0@\v؇ؠjP}+af}W_:V/(-v)=fJT}Qw>|dY) >:VF\"yW(?SHs4*}X?0CYJEhG,V$-ZOat>[kBt R`p`nY4En+)D:HMuBѽ|.Otڵ6t;3E+Kˬ4s%%%uui 3jXG[ۗ/_([ȥZZZpGQ sO.-'E(f:ܹⷣs٢|vϯ|}ÚSBB^#d1LLLmT {{BMRoÛFQ%>edh耕ZZ}{o1}wP*%%j,}ښF$## c1hW龓_N[FQ+ۢ]Q^Z^(D2a6 x0Ņ;"琗?ӃϮxnу϶'薴aێ`$iKޕGaֲ쌹J̐cBR6Y-//kyjvO-yUXgkq`9q_/GDّ2:s%CQϝ/ӍvQVQ~-~"q):Ѝʽd't: 3ړGNs+~&FN<_j󵴶suaE`{BNckzRҡ3k'Nbh>ﴰx \c0yY& J~ 5dVk`J@QS{SDK\,_if&$&VY+d$G##u~>Ge{=Vb@WZYx}@tÙp),b)~^+"oTTp8 1EE&΄h Hܔcd9%l$o@5 v6*3_X(s̼D ,ӧ@NygϾ+"HNvE8ht+#'y8rvX<^<9#RF/5i4 r:g\ldxi؃V8\30 N4>w;}ͿB=נe.`3* Dns7rq l(1 ר9G{m5=56*wkjvV#ܽK<:::VMscDzuHoPBff&PJ9;@ZEơKq FM4b(fq>"tCxu:,͂'mBX#-Вmʖqp W=WE5@xXP0xJ]E%l=vIGKH}V"!Ki:'quzc:Kp2H3gpCy;fKfS!Ql,+drUZ$QeTO n q|(jH< uK)WlNz,XP̨Ih] 鿙xвK|ƧωvN$}SO_sTl+cC뿪8O6!,Ӳ ?;_y܅&>nk1! m[ȿhEcyVt  Oo??'$2D sX|(K:ߊDO!npWm,;Q_y(M;l?W^/I{|܂?#F'eϋOugqƯyk 'p69mҪXS VƯ<=X\K2wH^<)ixx6]KyeOJ_{M";:_J]Q׀| L)7F#/_60!׏J2rF}8{q ";F50 VCK¦ʖ+ʊL_/S4ln.H&0>;$/vLu鎌''4݀bа̐1wFGO|RB+?ZXo2W)1L(:8 7/D}ϡEq:j-bŶ#9OP䮏&'@ "n79(MU , !!xnXC#Nf)z/$ޣۃ5z66vӂ[W \,hEݳ_j(<쀳0)9u1@K_jqqYGb<.WeXLW,ØUZd'ֻ#1h1>=z5( f8\H+u`!Ơ`;oJECD3=L7V:9N6fc\2"K#u#6I<1rxs_i6NdS7pqki:rFx YdZu' ~* +3B 73x2Z4v(A:Ve@y?Vш48֙K?uH@cxtc;;1hh6r0^u6NqiIa{D ļ~`1^S+VWѢQnd& 2{.F}o/W?i(&\cjbm\\[j5C+I_%͒]v2xASy лn4/2ncT WW~GSYvV-h:m!ny/^7sOZC*|؞bcPCn pcs!dbc[ 9g«uKKKb XmGzHG<LW40 wi;mMI!aE9v}g)Ϩ]+kqWwVV#4}Nj>Dhegk1[~u&?RXedJL2\@ZRE=E֛xgPv”Kf Ǣ$~[9"HBBpEJ>/j"gA$vH0Aw.3V Gt;g ;>~5g! Bw/&^^)G%vS-WũCn_IF(yus)WXHI2ZAnlɝ~GG+fHP Z'wrrrLdu<t|seӂ#h9{u}*ɓT y] so>殠̕`3D{SHMӧxzϫh\ktU=IRA[YY'6H#u#MreldիWN0ؤ)EV%rtcEVe#l85yu?3ѧįc uy# _O;dy}#^G6a?gL >I;/ag? |PF2Qⴟ`Zu'xt4 O޸l!@hu{ vS:G[4^9wwD_5`%h<)QMoDbq[)8nSِqwb^ʛ ?h ‹:}kœ5\-SWl,ȪnKdBԾ ~u4낊IW!b1˛?!uӟуmAGBİ:Ba>yrgu}⧄~N .D;ztsn]4ncSle[wq=9;?})߾Rs`A=p!Usʑ1;gİ _ig@8xHppGGG]E&zo >pS/!<<674d/:&(xUuwՋ\\wVzXM -9;Cg_Zsp}4ޠ|As 4b[?Cޤ&7LhӶg ߖ>2cq<駱O! j-c;9W_>66>}iGhĝR _tz<:y/~D#, a!L]V# %OcCi_%8Y:w Ț%BඏQLC6薖~O[t^&%X|slF8h=뻡Q{߻ED8|HZxZb'ȅp6;f~8͍.,0b41s|΅f:RJK\ RfV4f{dSnS<Ɠ5(77~kCюx1,-X߉CT-w+֋}(c0nhµ6Q\9`%MFO ӱ̟\_Q֎9EDD \{DܷWjDr:LO%TT1\p ʻlWPc^ .\hsl@!+q^ұ7Nٞϒ]5hHyHIVg1$KyqU@^;mԝ6&Zy{"Dc[SD=8TuFG#P*Fv{M szK(wfw${c`0xcxRL#{"P#S ~93ljαTXV(ˢ K%:, Ȭ1{_@)a e|FsF6K줝 nsݩgt4"̞7YMWcBBؖ⢢TmxbcQO~t=%&ϚD=)ߊD>k;rB8-ILh*ɹ?NVj7) T*#;rN6Jn?[^@ *^ $rJ.=3f]Dտ.=Xd rKK]w@3G YBƼ~4?]<띟܌~ QY9bZ\P]wQWvo;N_й\j:]a5 dlR/.,U/) SaL !w4(Kw)nrRTW}7OeuG##ϴϿ^Uo #'^V5A@fZk?[ "?.Vst߮2`+~b]>{oz~]G]DyvQ*x~;\S\+:[G%:Go^^'5Ao|~QhY 49wCt"+ۈcVz&i}G281!YZIkMmiy< @7~n2xܧ䷒4m+.)ѹw קl=~VI ' ~+Kp&(ꎾAhlod%HoߞmvMMX/#Ƈ ,Rd#;fWog%zzJRqR#5Գ:3.^6~;yZ7黭}Ls}N/ܔFo[YoT/) ݊@OSVBو-Xɭ @3/?n-m I=8IE/qF[ RSMBF[Z^nj}39m=ur!,;?ZFʏWcɌ(]{H̒Nʩ_~/6:dfg}fm+Yn:`?օ >ʦȱ߱鑖f w 9?*D/ #E/'8b  T\JZ5"^Ȃ)l'G܊t'԰ksZGol#x1f.$20u dP747L STQJzJXo-"3wUԴ \ BrSugVwMdOG9g&bFdlϒ\`)ȒKPHV٘ٵ#6WR#V? JH_z#{+7FbtH$7KR0ray齰i3x!eQv,YSgRq/|[?{Ɵjjv9ڳf&&j;bHkwlQ1ufTpHd&a~MġnQʜڤ%}`>֢Xc[OpikE.g:rHOP*fAOg8,QLԾU YPY{G[{Zax:*""Ɣ=.޹pqxW8Fd-IٝnvdR궻1w l-,agޥ:Sȇ=lΨ+M:an:R+1, ,YN ;|tyvŅ\a*)|pMZOgf.87?<Crܪ,|͏ZesfT }ޯl#WH%o7Ԣ[M{Sw'ڈeO mxv'0 rd|k8-WX}rm"mJZ_9\a̧OVa %+,9`-*̓doZܯp9'4\U@ آ4N!J iES.Yl`5S hx@wQGq/X0Y 3Du& 찖}7'b _6O@;Hd_Bn'`˽ﰕѓ½ ij[{"Km*^7N (t`twd yqr5Ks.4?5p`% =VIzKOPjѤB jE|n&A.Bw}v28(̚clu7Fݳ\Qbr/XyƏخԳ MPYși|>(kmB7qm-\+ Sm TuTi֯)d}ɣ"Wad(QNAXHU_o5B5e&X:ߒM+9N_iprr7GG$է͢`iՆC: N:F-#AZ.) MM~ _+kDJaڶ* SOx`GȔJ׳+}vXR\]u(/PH]uVYH^nX"rgݜ _363wΰL ji qsBCPЖ7f ЙvDa&Z~@ZH#My5\MA4Q|zdcc#2Pzдk?V-́han]'4EtP gϙaġŚM\ig^''M\/n9Fc2}@I*lx=*f`IPm+cA2T+zhs{`S1B4cVUvu> g{b^Dcl=V޶?PNǹ2]騯5o5yL$FɣV!S K}j8uAyL{e]-E%%/N{:*!i#Ouc".ݾE\kP ce8pM%%[F?W1|p ;b u NKJ6eQc /=2auuKԼAw%U~xݼY>hErx5"fPWmC|qEA W$XE4cmdiLz|6HlچTq-j4@(yʇUZMzZ=ܮ^Fhջt 3PJE tTj Sސ5@ b' ^F29 $WK@wwssی>6>ҭk':ŶȊDDXw&@w'`gJO,uZ)|o턭 #rׯ24ae)=9gf=zna 'zX75$C]ZZkRSVy͖&hLIΘw?gΠb+fs2=w8`'[#ڐ\@hҞdΫAW]c;Gsd (\}&C+7.apHH:#sq~!Shʻ6dYilrayzQWgFXz|FMZakp_ J>W'DWTT1)0ԣ,b%[[wGZ C!ⷄ;gZ]VC|E <{\|cg=% b(a ,6e]^]]V> (ǺIlx+ 9-qd JP4Y6krꄙsOlj LG~VDhw[e&M_p1 SX bj>q:AAXQT x٢Fq81|N nҡsXk1.9܃LԛTgp# 9cD>c5ǢŲlp#(5t 0\q077=scҚ{2-Pd',P'T-B6مVl -9ŀY,VQ\_/ad"W]MA7@nܐ )YHL)FԚR &ǘjo\ {+[z`"C FD1ύRRe9 }I7R`A@BC]iDPdW#;ӱH?*<0u#o)7wܻ Ntˏ5i婷\lu\Js=XQs}r;lh*ObkfSA5+-GWbY :p\?W1CB%Q26Dʾyᯐ9вIj޴c}a}ْAQ66A i PZ (/(RU&xVo.WO{];wQ7v@"@`{6`Z\\r+/RsX\o\ցٓ5ƋAY;&C?յWF7հC F/Qʳ[Eao @x/rC,+xg5?ڋBz5EߠXŁ#pe~ 7POXkz\_b=~qR)4 [FH(eǖT++ll3pul'~]yU׹}?<`NFF~><&U|Ŏ FU f3'd5D|+S[fXZSRHْ>DS-8WjjWyXv2hө&4ss'0hy>./;dccB,bez/V>}5cEe-'kgWF k x6,rlvD^(z>AN, bcF+I\Z ԟ]d̦pbkv565y[˪EyJ˶~bT*,,&rD#߾{-w>c/Q~G:O2Mu/$Sla&-zC`M*ig0hbV!FriV{Uz%MMM#1@^b,8wugYtVVpӋf[w7jڔ0(p&?{6%UBCyU{e8-Qv펻vFhT{oLYHcgnymy+Nлʸ_Y] jctYm2 ~Lɩ>kW _Y^.(^2H]a~Syq'XyjurvVo116G;=$ޮI0  +b-WÔo\$$$$^_YrַZ##K]{zgZ *SklFo^l?aF?.WIITݻ[VgKar ]Ѹ:;v:7;r،1x"AiCyV沶kآ-zWb߆ pk|Cj Y[>jBRrw0춶 1o>4,-oퟐoZEYLsʠi4Y{rfɱZYXjzz^P1Ҍ/eQwL/$j|Z̗I6td7Yĕ6?:Xዯ1%Iu>t'i E`s.8tp0.mՖJK.Z{ m4 Ks(6([<|d)wl;?: {TŒo?C޲nhJWf:1jxJ6t>D66n.Eqf{юz]l\VL6vhX*徭`%rqCa14-m$]7}E9^.-an,욋FL#Z:ppmCw}w\a^Qh hNPɔ]þK_ʬPX8٤h#w1%K"}&~+ڈ7/Okg#9:+)e L%u:(ֵR*<}΋Y.KR޼bN +L̀!R7aitKJXzՔ+ҡ'P4r1+纺RJfnal\kUsޝ$WqG 7ݐ_+k~6fwv0pYu8M#aStIhKLtumفpEQn^UlgThw<whֲ~x/@:'ICe񩨎Z%+cJFݏ4P/-h7Ѕ 2!– ~GMNIͻo; ޹΍ѯeѷ3?e"!' DTƸk1u^jv#$X(9N xѻq9p'yIKڭs#gÚobHuz-Jo4v!(\ @2V~ɋq"[H4)]yRJqTjLQP@rpO<Ƚ~JHhwDCjQ}"=wTŏ<:z toaR[q.&OYK^Υ"vZٹ>qX9ޚ/c+֒mF )WiwQyDC!HZeD0$H ԣ4"5(@EGfm =SqpZS:6/)8ܘn^$z*ߢVYQaYJ\t+^:*p>X[v M6dkY" \̌Wfp8ؔLQM!yN.k])F. B;q!U 3)rOp gaAoodiG''/PQy3,[/<[M7p6ԡoyZ{Lǖh!E8)"]p.l]II |YB+7su~OCP p!s1$Xnrׯ_?{LƺsMM t,}p4d0/DE_?>Ƭ dG<2Kη?);tevf؁Xitϭ32lkW |oޝ e4;cNcB ]}OtiХFХ~a 4ߞ<;4sOti=ѥB]cs =rB?DF[ 7///? b$&X+ǧ33:LN7yʓYӲME0+NXs^a8x*7jμ˹z#M֭y6gqn} gxS锐b€p2|R,-  >FSc}0>o^}K۷ogn$n% Ɛ[w_?fmoj^',2P--Y&]<-FFFюAAN&t?SRRrfG2?$.- `^71xyU' U:G_F75~#۩on~`GoLyuI:@Mpla}Ae:>N?A DSRgg'wO1 ʋ :w rFMy2%J34{@)E S (: K[:mjl eM'޺u]N\aϏ?dܕ|3wpZ3.8?ri<¨:(&Mlڤ٬2p+ f.yɆ0n(A`PiDyf.ċLʚE/y 8D^)Įbb&}<G|[2F_nB%Cݼ^׼0 4O!UAk|ɭܫ-^QkQ2zaxE "=P#y @3]Q'1qƒ / o:<EAS|Rc &SLvvNKKcec3E/qmIZJCo (߻6^lҕ0|xU Xcr^S.njGN5/ʍVz‹wv,P ՎD׾nMe۷_CJ\(]:;nL0* 76+Jop0Ν88a! nn/^ҹ\}#@MAs=zӣĘIVih_Z tEĚ.3%y35t 뾜W:Ts&y ǻ#%o9x,yz19'yn~iJP_E6v9}n)dgH}R$ +Ĉm.u an^Ayls "1"11[^.# wL-o>ҷD#r&;9Ur.uagm *[QxU)MwbAĴ?rʢB(m`3TT7V$qD5DK,,g]9YWUUG MV< ;n!0G뢥jjGbKqpYu-8# Lxh0~ecpU( PH\0 3+(0Dbȭ6PJh-u8~`I ylT 9xʞj_YUJhQyJY`yz=#SY:7׮.aM~*a$I[!U~S899e]1Dt75ZDҥ)ODEσd;M|5=xTT\!`C[[6===LU4P}RRR9pa+O>wknn> ذ+tҞ/_^a^yc'һu_dBAi7ġ<f·@AI:ۨV (o0lS6PF`ycpL֠ 9/O>؍Dz/ڀ֕ȑ9 <܆m_spW',ONNֽT] -zXvXWELxWԴ4SGGT \oFғ8Ξ=;69y"(NpInmO&[ ͳ'##A)P^.Մ\/>{7RWtyQ =<|W o,#JdEY^0Kҥ}k3W+ -|ΚgZƹTS8w{S Qco$D V]:gMOta\#?5yB.6> B,mA5uݑ$:/}|9Z4D!HUc^埚M fpp 䳢?o Pǎyy{߭T8i (,29|MD9o ՆazӕK^vQH0=nJ]ti֪1ZXIIiWW#q.s"(_9]ynuC#N'2*P'\r3aQ̪P`ykC5E7nI+0y"h` A[Ǥ׊a:qTc6h$?t -[z[SwC KR|---6mQ.u }zА˹PYfbj!KCt}Ƨ`JyщzY ̌5*g]SWj1&cs hFuK7|4Y6|1mkSƫΥOlZNZ ,R5}V3Տɼ^9mK Gkޟ ;,h^pp0jj1LZ2q,>pDD>~Ƌ|; €!CC<\<0BpA88>^~nz4x:)K/<"岴oHMBOHUT㥍,,t\ UiQ/|_#2طSqX/Eh99M5Eh[=i &d %H:nZ ć{(hzjqat:` OJs"KR_0EIA{,%Oa<0&luƋ@\h Z&0-3֝;odU`].JYLMMi7 eSSUB!zEπy IPfv lEjp̒ZKv\$_;rcVj};7KD[l0pu|,E0eV'7H'[Uނ#ޘ; GH:gw^"t|~@p&> jcD;ebisX[NO[L.kpyRJ.TzyĦWB+ެ"9}Zd8*cJ. ܡMoxje+^ғ'ƙjX˿}7wKY(\<1;2b CzԷWƓ!B Y']T=j\EQi%LM>z*tc|@( F(zɬ(GKed=~`B8վx]Tq I1kc ~Ma!@{E6<ښegVH DPհE;./s&cUA#\mKw7!~!l6}mQM {FYaxa8r>Ey'<eOunxa- & 䚵qdրVe[B:ZzIa LP3PN!6{xJͮ's4LL$57]Nh _j#HvQOD]C!=&7~jeգRD n,EܿLv)":5o6BQLݸE mws*v}Ekss3(Onf.jq<.+Mheb > *22yZ~ř-̡ir8sg_HUIepb&I 8Zߠ[MN]Z[0 navu=νk&xK TU`Ѱ 4Ҷ ;Ymk׫ cٮƴ̍%Ya_q)N5 =?EBJ*[l'tVڧ;#=OfbU`GuMCn뎰VEy߼y󸮘1c-8R*^h1_ղ1X x;uc`ƖB WRlBU_;^Zd gF|BBB%!TlMp-<8mN\NpUF~/k"L9̥NSw!m: -͚@.[6qh0aj!k=#v+ӣek+j&`_9I`W(G&NyIp:K4 :aK KED]t|-po,vp4>Y˲.=TLY[8|o*R-GxHRxp#N'0TQ0Aw'shy#ZXH0XɲB"H"f} Ma/ ƟGK9oqhO%+<,N‹ TDγ6(0􇚃Fc%mJb' Pg!G&Cʢ5w]02fe;C͘WVAr*h]dx?ꮒpQ.[6 BU֤Z3ft6!;XXSZZ]m+X5Q7Cydldƨ:#@J⸁ͮӈ/gEgֲ<^0w;>);%ɕxuUvzYf$EyywD$1c˳}- ->|՚բ`tO~wв>LX]j{(`&|_BOOw;8 p2$YvM$&h9LhuUT~%60o7Pڟ5揆w{9'W5>SCY_||ߚ]̞T0MK\QLMK,6g>;{]C츨YWZ(bUU\F1h ꨿XDϨuR'ʺ0Y#$)\kYpVp91>ıx99yph~gcf+^(+odq%`fb| o^\$>;{0ArٚK\i`8Q//Ts+Il>|DM c}k Wl&B߼66fa s$0τF]K֜(ёEXw!/󃈀K c)4ǻ}8~zR'2gu;-E v|C4DJdW~2_ǔuaYM͍2ְvznB66631ƊӠf]Ǡ=WG违fday:!{; ؅Y?]`yztx}|zaC$#)AX;fܕ ;NLVVA$Fg.,Iw°%{UVё-F"V<$?EGSYsl_v$;Y~zjɍ^*-9pfID53ҁ`aZ''n{Pݣ|Q;\ub;OOe_c8iemp֚¨@xj  huZ~5=+옎$rN=W bLr~|饎7QIOKWGfW(\1O^n#:PFJLQS`{Nho]ՒmWm\Vp>]jRE6=z,>)DOq׼ҒETuή1E: 9 5I4&#C/vՋ[[%Gʼnwpiv&}4,r-,_3]Q >ȡt .q\ʴDEEEvp=MV6?9HBdi[lHy|ա=o3yb8999ݸ嫹L7Ih*Ki  9=(@e}KCݿ^Y]3KwZKϴt59ߒ/tpR#Oűoغ]H&&·3;srY.̫Rܭ +feg7`dsA|Qio˾FP/EC4{JM='fN"1 "w2&$IbCJe?g׺YctegF&XFiK3] T)4 z<n~dV(EyXe>8[*тOm< P,<3tmʃB|&Zyܳ٘v5]T<{"Mϕ𙓞eE~4ڿ|1'tL8A/߭;^7*BĝOG-[؝ܖ&c%8YD@|lrx¾Pl:@>\{H?Wu<[1qB7pL8KuW=5ONNV7/' CPQ!]s1spqU YCumgc:Qdz]w:Y'u\P'onoYEaQǃE9k::.8aqטsg-Y _{Y _k~\;kk-\.<_t57?»ɻ:E?cՏ~P:~;~8 7oڞ{8 yy_IX5ĮTr~jWB9?TAi:(1w'η;Ϻ]\e4tlau<?4+? uPz:l Ǟ߿Nk?>k+[ma#gN?#y$u %_ukz\I,VwD~':zx&ɱW|O"EDM1j+sGDŽEbc})}jE=En,/|Hv)YwfeH5N?" :}wxZڵT*`p1J \\\+\\?/E$R]0΁2)Y7?¢os k*i=pgxP{1ڡYR-ֵ m!8u&:h77++S<.tЄTB~ʤ+yjxyk`qxT05Ti֏׷pP /\8remo=œ5Lb? رuN)m񥥽;Xfa6u djF:a4r>q .?3ٽq{Ifh33Y M|OMFơe6PK>Y~^gAlNS.mZZ1}Tc,: >H!f%2S_Ӓ( rcVB0mS!bq_h7#QZ& ^=N `g; ڡaKknC~M Da \ttȢC (:@79<>&f6ɾ(',+Q\Adn|ɚ zlcm^̬7Xf+n81Fdw=w)Th)xJb^DR=µ%y-99#a&3#6W[bIZWϩ|zZNH;!!Z<{fЂMw+2s)i}EU˕<Q;e:1Nf7ӿ(n5>GZӂ D2uJэʌ\ S׿86,b,.K%K~ξ˗8|B䔐(f8K^{= ƐƑzV`Ėk.\QzEiD^Fqŝ.ON4kl! 7g/n왚}ocH ,)\hzw C{c &:jJx )XK4ؔQT L5w~`1RUk~aXIo4 IKSuNT\µdQCxgFϼt:C!ZѲ '|:uP@uܱ~()'Ge!I=˛yM'_is㒣[U3p2#=?U/.OHNN;F7cko;{m(5CgBj(.%&wJj^GIFX=[nɀ?/&^-zB ]JeqDǠ(j'sL}Ŝd(clKk8 b"elqJRp(MN[7==苺sQ@c^gJU'OUɠ朊4閐 ni Bǰ5#2h/Ph%pkmx^D"i;\P]pƄaSE++d:@Xt߲ƛ n&YK#e[NA1y1Y2lf f Ƈ,ʴ"1A STX9P=d ;O?5|k[ߢk4+v.S.߻2kr)V Mjݎ9nl6Ao4NK$ Қ|Uj-^'5#iF?a|PDww-I?ރ^`]gmko7\>t,qa,H #jjTRN5@aפ6n =U[V}HD t}{Ezhn609sp̫LcrE)qK(k(^ioWeOYg*HUb1Մ?ú fMsinz]wai$vrX6(LUD"X!ۿ$:D0l)];OI)Nus)]G$J խ19ᾕ.I X#|ߖmmNG\3di>`c]Ж>5ŷa%Da`4+#a"g?׃C=%li?,8ERNJuX (}}%GB( M ܁zNy%!Wzb|AWWĤoZ-XNÙQCs5)%hnLXXׯ_8Z.q!2ςp᮳+MSlw߬񗑌m2'θT*\8zv/Q1&k23oGږsYNMMx3󺱎C!:m5A[|-酉N gD N\oK=]Y(( ]^iF]zku.םKDm&$)>uP9 k4Oڀ0qi(Dڗ[ ez/dn{Ul_UQ!3U?:K5{s`|E﬛Z#ӵT8k曻:%Z$=3d]<䈏jMQPp5ȧm߯Oh~Qcx||w=y"Ңnzݢ">~vUōEȼ9X%{ Ɲ#Õ&Gᥑ Z^>cJ+GMqFFƄ/_N ]EEE'ܖ)1m<2zVu7=cϐcUt'<$&EĦ:Λ>a ,*SķD#idPըUS1|Vrd*#$;*2D13Lߗ]\J(ٝs@yP{.kqh=6w7?3??qOM۫cbl2_śl{1Ŷ]WnW9範Zs`3{E]Ij{C j\<|nu+%P:ݩh`>иh|3_=lg_}ʾ|30:bj ]Ϝs't_?dc7pzѹN{ ;RXǢU*(c6S8s.}55cIt` oUtc5;>;[o׎w\+oM8'yy[pl(o#6G8v[@o{+/:SJBLd.h9/ ښA ~zNen}zۧ!2'zged).ϴetPō;^,ͷž=;dֻ ]YYyˡ҇irW]+sZ=x9{fZ뺝dmP8Yt%0PQe59*wW|-c JGzr.'S{'ihxͬOV/谮 މ^Ơ dⷬ n (nڔ?3~XkEcfL@PpWf(&|ؘ9q}۾at S:~0%͟,ޢ$Udj@ɝrB;RFAޡg`?Ĵ/ĭ{]uMNNE34)p#մ,\58 j/\OG8;,uoMzĜl!w]8LUjVtF!>!|i5|WX_]|-umyaMlÆaJi-Rd'D-R} !٢$ɖ,elYXSva YFXyxw\}_˹}ib1}}&^k3'.:eswȰ"wʙIw9FsN˺^90p(ZG?fZhD!f¸RTcRa^$,f^܍+Ji䲍ʔ} W9a.N:U޾#[yNIw}􍧿)՜pEniiiN/4'v^t+Z@Ɔުmu@l@.׻}yw9ZOJ3W:H A+'HS +w4m= mF -IFRW_oBHfh͏3m_ ) ˖]p l =Hکٜ\}“FTY}96jqUJcTpY"=]*"epШzb5] l *3yxjf! gfj2*}Ni3NYrw帷ލ>9 {tI{H%tAbjoGbM| H קS\\\Vn~PsTќ(>iII7iU)6[4}nZ2.6"hn hJ'bVlP@>vB9+HYZM:jMv:_l<[ žׅ3~;t@jon=Xjw 3 Ĵb,/7bf苸qQEe!Yr**BZcEee[ àGTc 9k.c=UZ{EﮞyLq/~|wiń@uF[oxZ|bU)ZӸMqsݯnqai>½fdNv_%OF!.t!:tR VR3@ڳ=ob`#JBg:2]j*sRX+ZAnyi=wjV>jsx3'N5+-R_3zTbFCCFl)r 8fY&xwC5\IŖīx. esQ*_Ol/_4r:<1M|VvF*E͒Sa{+l![E<{wOKR-)o }h9R뻏5;|R_Y;O?<>u.m{g^?yZ%"8\\AP5WW*.n9o2*/Mt1Vكt/xWijռ嬍hvuPS:*zNם 54W2!Z]bI<1KE1(*LdEb@Ϣpx6 !ªm4|z*(Q~xv6$EKnoma.LxWR.5l80Ŷa(3S ^!Թ;v?m5f3*#ڟ56StR~}yeS{Cr'Ǖ%fQg5ԉci3Y ){i2 #wQT]CȅHfcU3suBj.FI]喤Q-6F=1E!e^ti@& cN@"bkߜcI7g֘tv.珖>R`=ʁUz2.8ԙ!] &RFtJwe\uۋTFk 4%w\}a>Gdžam nEq@ U!;(Gh8PRV,G4SqV }T#X+D{-|[)4DVL jobŏ;E:3Gޥ5{;%BideeeiZ@e^|yY񙠐rDʌ]%t&E'[VHA#rض6:M6o]^Y;3wuD5}8榻I" a\P7$D|}(hCkϱG˞ϒEM?[շD{p[v,X^fbzsUfûK3WC+Tͪl > tbUч,P@ :gdX`S~"}ZzT5" _h{+R]bj1]qL76@]d7~9rT}% bۣSLqpsSz Fj짯<)+(hKu+zŤc{2T88 Yb.N*NpUAJݘס]t0'lyD | JŜ?~@jA7Q.oڬq6vԃ R|=}U*vqq2Mo[r \c%uI4[4^*UGSp9-7~ DveݥYZtR#FD'BsjfeřC+XN Po>61yЊ4pF‘{Q -wWcmcʭZ{v61纭Rv'KSK5;oO3z; W^j9 s] rom F\OnTmQbΙ ]$5EŦr8-: y-7LFe-2'Y~qZ(%z| 6HlprE]s5_:^hT%3#q*)Y4EKYpJ$T-!1w ^u54舺#~"_)W7#Ԏ>C`9 nxpAT"TVrƖp-šw$ʤυf)f R-:@I \8/+ښU `ɗ|x^fC2rfqnB40 `:QL>VP,-'N6k\4t%ã>}S8vp+ <Sx; X7j7&,}JA8"\#PME|diaoq!89:Ь2bM(joZEo͂v ;EDEKJQ5"D`2NUyOO.~Hj \X0 #r`")I5>>sLCks{x"oh2翋g) ()Q7jFI#},aϞ=Sa !E xmx,`શW{he" xepַO#ad{_ֵߠ=İxweR|J]+] '>{p&Y#.#q0(U{ aSMeee SAHeBH>@Z ڐ}ykܔlx;9AL"]'y-#1w{ƞnrSSWwr4ܩ@m6/{ᱱZ5΢4㎣Uٵ)))5X8⹿ 55i4&YFl@S_=xxi}wB寰ar Y_ρˏ,-o]gR%Ϙ&J>iF#s٣ #1pCVsHԭe@֕C]2qי*J=%*mdZ81h E 2kJ2nQ0V~ c VNLe Ozg1|5ե[/_\^+Td +>s5=4 O} ;x0zӦռ~fNoP.K]m1ݱihE@FVܸ ؇UL^S)YyL34w )ղ{Ό fkHRvu"/ (|#i%r˔ ;>`e;?M~8RHm3qh%2 4WRȃzIy1m M9H37A|Ӿ{wag4^@D#bg{uߞӂZA({‚1RYYl'/bmT& D(gV5$˜l$CR !~voʈȆP5m1:@tNl0] M[;Y$ CrLޯrЈOKBvoi~mɘ2]g8Υ IJ`ˣզn}6j?.&.vZ57i$1W+],]07K4e"+$|.k,m!+JS^ 0Lfliii\:;SٗLHd bcb%U1֝۹ޓһ &NC vLpxp?J`Y'<◫ߓ Gw*٧9"NZKrӭlսæ]שF/8 D&}Qڵ1,fYST</AqwpC&ymC "a4ɹ⎤^f? H[ё/_9U|fIs:]pEwvw SR9ӝ ou95kU?>&ij?f9)rbhP?z]a1ԉ@\cUΎXFw0Qr!9 c&~q1Sv8}Q()D`U}VhsoJ]öۥv9 00pl{[0B+Z  v<-UU_DeQyWo\-xue4>IشkN [V,K1@ ).qώۥi% W{ɔa }-+Uee?pl;2l=,T=SLj*$ P#f^̤c(@6U_ < iTO })ɏ7 -tin- 9x1Ç9sݨW:i3x@ 7e 9޽[p{^[2r!ncMrrOmme%BSLg26CǍf$. X8aR-}qg'[YCII:$+o#|G\u|07]ryThwlOr MTr:4 bzC/'e \>p|_1)meB-;:}{z:C~8UZo'Wܝ `s5+;켼>5n¼n3zP ϡaƛoH5+ Mm!JǖGϑcWWW1I?AP57>}N3X&%=UHt[$Q{-l*ڏ 8goh{1Ϥ%l.o1DQ3</?.[qoX(BN$zPzM%bNm>ޞLa|၄Sqeb(uhC5>VuyAos&5ǐH:TPBPTP004'R`5Ф[-ݦ^Xw 3 B9y-#h_\ʹPEzߕrub䲖r~L<ZHolڧ3I{@DMl*Gt5N.`+sI3dG2y3Pܸ'ȵ'puʿ3pW{"X;F|ww/33 kfD*~P9ZCXfNG\0zru5Zq@VSS?8aи.JV 걤cP)ҷAP}+coxF>|`A<*//Ϫ~bN G6_a>` _,Eý8·-s@|y#bt9ٝ4VVVF{XՊݼkuomgșc`=^c%v=;;U۔hfh=}/C>xi">>A _&R. 厠dph'@IsegI>pAlo^V͚.8$M>3}oL/3E[?u.g$o/c#o>"!\9U;YB{$2p v?OMMƲi.nn4 Hmr`y^ `FGS:vwcD2MSjZzV|b1

      ȏֿg V!y ?[oI |lvxp?[?pKi8?K|Lr7\p]p q[x[円93 3w*rI+(o޼V1|m*׫".a@}?!t>Ҙ: PVt[cs1LB9"R5WV15yYw.T_)tOH!gqiShj:1-AMo ٸl.tċT8P Xî)}uZ׷v}-'*->³4EлU*Ll{Cx>ʥ#j=v%X_]Yio"t2߷c<7Z(8!͵J2J ?u|l\iI=QOC6E 9 =HԜëŒV!~miuzy`ü<}HuPOO:;L~؍%Uy1(}}}N kE䌫uHט~Y _ї&t]H5:J}JrgSQ!V0`cl9|Ǻh㷝vߏNWJ1YTr.Nݮ|HN-Ukcdo+MON2>q^A>M %W|xp=)2I`RcPyb[kzN~~pm`Vv^g*k}[7?,7C܌4%:9ڐP5L?#ܕ|-2p]! J7،gS7%3UW}ކs9jc\TcQ=aZo:-Pv.[tVhd;XOxNW"=[|O>\4433j-:tF>@7$0ޮB`9s hQh8X}W!"1B6YSRf< X_1hۢ9E1ID`z]g߯ZՓ MI#`=o|zO}Nj3@:wvNXYrxq<+u2e*Zy6H/~p/}tX,~ZI/&+oOoMw6[VV*}J>Z8Цz%6]א|OEZ:Lo OMM=FwT ]?DE"jٝ$8bV0P\껖(taR}i0a]]NV+ϮC,z١N5p׵i}}d{#ܳ>K X\32Xtbb@7,t\!HP\)7X#YŒ9]#:A . yL6s탓* U.xCxPMQY  'U&OjRoDEF Ξ+&:Dd`3Yk؅Ǐ<8?LM}95 ^Rhq=\$2x`MCĈ_) v۝H]rL ݏF)J}9ЮX牞=}dy4FۿXS}Q.ϳk-.KKJm'R\EXrʜz+>,Uķ.n᪼Q=C%Ž5'厗Zz*z  H`A8BI"0o C `7 u==lVGxb(f;q$ 銣8IIp{3UEHB ]-#͢ H$,6D555;S__<+?5HTdw̙3P'xlL1F&&9v#(~RZZ®[00o`ՙֻYһzE%тeְAW 8Ґro,3gNt3Pv| no{~"zxAрLnY%Ko0-ewAF- VH4W?n؆s ئ>d[H5 `-f_KqGq>`26Uc~je SpEȡ/ ;k8x%!VtOh/9z,@:0ՈZV>PKPEyICۗ7]OIYe}.}p Mm$hSn8ɢBw}*l)dӳԠ۷'vuu雚^YJ 0Jv3lfA˗<on5H;B_NPI#'4eFd,p{6 VLT a)gxr՚ƫ3׶?~[|ŞQx&SQXpyt`~>u999˜4KJPl mlyusPywƗO>G^a((K.wJ  HyyyrJR5oiRids5#,#E0o G)̦[yc?&SsJۙNQ|O)L"ikkO)O0ƃ fjzOsX}N\od_oA'7bʆ(`cn`AoR1gBaJJɰ^g~.dw fyRdȈAvX03H)>ZLJ_|' ƖS0YHǟ#a9 Q[>Nz2Y_i:tYDAB9}c2-;9]w볙s[7T:'1ȐJNb:#w?IX^0'r2Z{LzNUs<(U)D_oȺu1| Xt~X'> N:WUvPq]ӤNIe}L\ߡt=߲u1>/Շj-k¦G֍h&4Gut}M|O+̕U:]`].kT>I2A L9*̘ep6\̶NU.Yg*剛Z^*\cArztMjy[‰16snRZ3Ri&<$fD9yoOZ1P$diKYTU=M`ggJ^Rȹ)Kh'IE)>iSஂoK(Ɛu>{J',:KhjasHt)/h^NjBց;Z{9q>ڔzNyDI9&ίN$bA6>k)RxQt=k2|WȺG=ތ0 Oo侗Hﭥ9K3;ʎ)fd|QZ71{T-V:jQ߭^r(, ?ijT ;欩|̈́d ^@DZ* բ>m)Ej#-!N4|pɠ/tZqUGpp#t3-8-ь|r{*qHwM ΝO,зvweaoE=ʂF^tt^稁WuY, S^t2ݧ۝s[sWtrz6]'A[4!55{BDjJłava*\M< pyyxe1|dJc;Je-pޘ*nmmZPu;_8C!\Sx`M C`/^8>~K^߹g-(*ܡ13[yPMNWVQ?2v̮.Y_UU0|j}܄p,ʼ<˘Ŷ'7jW^ek_[b!k)w(|) lxzg 6>OhM(L5%i5w;28a6bsuU>O=fL0H3/ꇼ` &=~L@@,k/^CWG{7we8*!(o6B2y>O M$\٤4|:ppc,.4Z3ΖB%zs+u4WΖ7I{5طZvn~':ɽa1%e>{!IQ֠YYDz^+H=4{oKd)o'|~O$_ ZΚ3'fS^챜zR2ba1;|Has'⋿Ն#(S8.Kti8s1+oH޳R08FT`z|u3) lunгٴJP'`KvE뫖uXY]*U\1 Tnzd6ŃZy28$ 62'vUJYQR%*v"k%8Xx&'kP46܎h;eƅdB(]gͻHǭ~w?317O{ U)ܼCRESG,N @5 m c5 e~a ڳˉ{RI$zgzZ+=yC T.Tz5&mQuzlKOk마-'$#"&q3:^{r,a_gIQBnTg;rLp@3ϴ+ 33^98\`GVr[|qsq8lX47^wԚqDquIEETǧy̪SZ[ͪ(|myv+I:r*2VYqDD >y@zͲt7ldȏWa/ ~^8leCIqfұÇy&mmm r+:$T"J*?,?u~rtd(237E!XnWxVPͭL5|3Xv}&]Lq`_?iz'9@Hs-:z暚Gaqxw :`#>'oMN،g>.?\)"@YCmR6rw# d2H=HܹRj_82I|J)|WNt,;c\jPX ~==@PA6[pȬ%F޿srp!FINux_Uee5 p MM}---]VR.7;r]-yѫ咤Gz;v}K-^>kk;ib)|q3/$ɃoVԘ5 ڰu))A VP  C2.'`(^-}*oxuzyk#z;c뮐]T VW\~2H{c̿E'J0W+ׯ/E {G'-|9 C$ #Pl/gˀ[ EjGaبPL{ _oќ0*}]\m(A˾{ve$\U;I z %z טrr"X惗[[ѳs/Џ,IN8Uƺ=? Hr 9 f,@.@s=IuOsyD5Hobm>)Iɥϟ#D|Et_qNMiєp2奏(gV8C^lr)Z8$%eDn|ZZB}%IHHƠmIyv@CKeցtto[yv;A= dvwP93C*Q.##X|0)΄U\'cYoQ~+"EAه'I1#|v7u $v?|'W;]h8[Z( ||+  w'#ud<20?DDDDE D¿ O_].%rW>þƂ 1?dK/W/}? Yh_Ci_jՂ `-VG }ϊ*cџBOHPD// ?[W|4GߡT7$$?FҏɎ\"n$#{I!LpO;'-2 z:>xuZZYo>U LYOL]ɐ0l:Qai^j6Ӷ2!6bmh~s`Me޽Lm1ibn祖36#Y$>4dݍaGVYaQ ] ,f+H%"MqrR|, 1iZAטV ljo._`7Y.-@+GWZ[Ub2ݡguB^/D~]]]Ka5{ 󓙪QO ୛!gpu"kfClXepb℥/qoll !_>K{mjq..,|l9zξ?4Wg--´赐ED^>LH.H w*<"xk 9z OYvtupj [R6L>3C⣈ew14I0X uAE:I"c7bbbܱl.!5aImoyQdf!t͕)Nsss-_ o!.H(z_2͹\ȞfAGq$X5:q@XO 4sV3Iq:yv+> -{G$L5?0[kWeCZ,mų+{y-$Zu Sv>=ph|ĩV1Ocz_Ϛ/$E,8>.Fd'h5bz5ʌ]b s;51 1f7?cK5ml 2͊ERpe4!r՚pZҙH ihhXYY[f{_bJfk".).al9ֹ=~g4kQ?Z7˿ LVB(YH@ntŠ;MV\7 cf"1ƶQ XݪBUpDq8BCuFy46[Ժx+7+-E+G͖C`]ECmά[7^ sڒaLr#LPU^Z#y@C2$V~{]8 ih`"B$| o4\(k6sk4-S[[Wf*xFQ3p:⇘K9mEM$)Ju2՚^eny0/ =$ 9 ~}ЇWqu ـ Z*] ^N^0)ԏ nq rio S%4` [~d냡; ( XZN~`Də30sQ1O,2t8.+Q$ije*H}&@;BLE~[ DRUyeB/˅`&׶\ID! 6+]i?Y<R/j+WLQd$,_Y1dglAZ3I#kUVņN8qS-o`nrS T? 7@0X%~Y8#YU5!ˌ+\Pr-fL?dG=ۏBl9W?37!"DOF``\azpCT2wHƳѦqbtMEH^c[[[-βwn]-Z4S2===zF7*U`$;,x 9ArD$Q@M B Mn2 4MP3|3w}3PvU+Z{Wբ㎨kChNM4%uqyCZ2!Rc`G"ck Lz|'a?NChͧqS3mAՍ[soʶOI>R aD, X~I!!MSΰ9 ȎzMZ 3?|x?S@CUgٔHsR;%%u2ہJt&R\[ܳp&N/-=#Й5 JEq#u2*8'xe^vKoovX\#H%3aRm85,<$=[Aql/JBB":m{^/T !ob$ge伣[ppQЮ[,pՋ'O޵p]lA( ...n+֡; Q(~2Vw~fNg&vVq wzξw!Pq{cqzce6(v` ?fquZb|v8m^ ).I}y,Kqbk!FNW\]lWqb H߰{s)jI"xNxkBy* Lҧ_ 5(㌪Pu%&C*,A}%%uxNuCO7oĶ=xHEb'n rMIAŹ/lAx,dhS(Nj+0X[oHڑI.o}JY,7-$7nf%HͻwЍcn &nrHqGގ-jD9v hA7l;TA`vO!=[xV>+h Gn%h6znۖ؎؟Yi3`p.U:i_]=Ê,"Ln*RMIaBҬa|=x]LړMDqPJŬq_y7n]1/ ͑ɟʀi-'ЬVI^>1ECS&Zj's<ށ2vq7Hl - -q&HNj6xߔw=?oxF W<`:ЄY;Ȣ9"PgLU~/)j9ӑY=w@?_Sd [lW/Ȉ3nq Ю\aWe `칉 O̬z{)R;S0uHlWZ:\GF*o3uuivL/;W,aW m|9p,b ?b (bj(4D;G ,#FGDDxN~$`e`PZ/B_/=8hZNRW|-]ͭ__wOiI Әa1 G:D7tHtkHR/A{&{p Sޑv=ɽ iq@ppSCC[W];.ʙFdrL⭜ }-5_Bh$D?n08v@t <<*j,FN1cźDcpU/y_eg;I(f'  y鿉c/OW~Н &FV =w#f=0*ߦ"<# ,_s wGW;(1)ߩԲ %0zf:t-b Uد*(H s3ܘX1ɤ4fɠ C|wg-X_+!tIcscZ$JѦ;I~'A ?_2rVLNѺZ/qrsrˬпwܹZqLFr 6MLL$&&%8/c5rxIa<#<֏$zqGZ+++L[[ ʢUYå|OA;S98h""% i$ ߀SWe_ԍ=t`ͥ78}"2?Y45u 66?fdhkOI%Y: ׎~[I2ck,*çOR 'aL322+(BUY>*>*6*|i\ՁQܽxiGڼVg{9}VSHb4B gg(J{u  YrCm<[!}`>C]`I<] hoJEd P'$N qkX֐8sQMV^dXiclH0C@FYLrzMO[͏-sܞs=J!Zz-X( ]6T]&LC3`},]02D:% _^l=ODUaEK L~鉛WY9<#o֦HH(1F׋rW#Ijفƞ>ٹ< #d"7FQ=c25r@'B1ְkQ%6E`隙(ro Ja3PECDTw`g777k[BtveX"otGY3j+Z҃ /ֵonLgK 49](4*Jn.ldƥw ?Vk}! F]h餢\tfƚqnf[uE%j--->UV޿.gtxrQ|%WN޳fVAl1~43D12蹞N(#(TOG!;vL~rLjh0OہM^j_ژ)fOe{>ݨkvUM56yod]r߿uC묅eDp\$ =c%b j2wr }n^2Wb"#eHN4qhfTy{{rdrrqݛԌp[E +?*ʝfwp_D0b'n`UB1G}H6Q\!qKҨžu}P״=|8Mubdn"a5>%SZ0+  * hP󜟟[ւeΐ(rv]jT"k!?5Jӡ 1AfXRҿ.OMI/p3 /VKqM#<5wRr]_U/uDCRW=ͦ&o}lӨ=MCߕYE?'j԰crG;R7ښwzka$#hk.R|4]ݻHxR Irufz9Qbq(RƃM.zP$['r]of/- {wW;~/ww 6027J31c?'ȟ+@ p sȟ]ye$|<WаX## e;/<B -EKwD8yxX#GUL\/_rwFǂh8{wEȿs? /?輿C8 C:Fx=ԕr*8 OP]WlPR>r6팎~LQ K&>>+σT/7*6%T3o?S.|ִ坵Zj rAtGԊwCEbŋ1Z9D|I~HmK؍+lه #e޳E8=mmQ ڲTЇuȐ EMEK| UR(q4ex}vrLgMSߕU/lPe^UBdPkᵻ9Oi B 9BFEl=`[ 06i FTY15ZB;B&}ٜ?'JQ.טCPZѩ=>b-uX~pĻbvo8'{DY\VAML'#;Z[#k?MѷiV *ޒK k*>uzK+vj^)*#7ʩ#oQg/\H|!8?0p_&܁PSWXCb)QäMs%[KI ! 0ns Bz-%2>(2&:Wˌ KGxn NJ~]%U=WϑpNued^twܺ&)h>;RG72=c@"%y*%YB'NۛDa{OBYHJ-f(|bj\%N#> Kx".Uo*H5ib7.l;6BvPM7&cʩ)5(x׸_P'h(ķY[Kn3TGk^x\)>$1\7(#rO6~ 0YF1fJι^r)GGm.X#xt/U {:bl'"Œ}l5]D#6,Q ]H'>9)!Q+fUhй01CإsU 7eȲ+ *E'T.>t&▯JH!W3iRu5xx&i@4y; a^+)!>jznH|yG \]]]oMOV*))5g F2W ?lӻ wUɦ(V´4 jIFvvvΝ:\EQ11lvp_!rʅss9b,j3i_{wSgTAAwOl-Nrjp fYףP :hWKך—Lfo*sup! Mxʸ+3-ۃW9Է>*Y趖}QC6N]9؍xXͽ>`offV%TޫLH x6 %%ĖES ΪGD9mYͰ~?bj>vk~O|6>^@:XHS dVⶶ`ЫGkB/WnEFa\M"tH"s(ElL_bސkc|"}+DϟNEC%[ZySͰjNw8|y->I?}Q׀|Φas}y (Mtr/Aw8A5[DDL{*ЯDMfjf{YY錈}0^ @Lɱ*d}s1tdIieT6b"(p *Oep7>}gsysFل, W(ao%DQnU,UV*VOLP;䃂$}2H.a U/({eђx"K#{UR8 yBFFq|$m yC5Vto5~Dz~Hy4>Z,=+u7)`6K1"yu1Y=I!ǚ|J PhRϫx@2 &3$ 0l$pS'S@_|T5_]5=P1\ J3$>M(H/"En4!qT\F 6xսvYW돧ɲuῺs-Z :[jh&7W3ui'TON>hl:=D9R74c7\2G pK _ T5Xb2ӷ1Vwv,]ֺX PxI(POq AӺ?o1T&h|sshg^a]#%5O^49%b[()mL$-q8*sn\ Q 4bBM6Oi}Yr:4֞M/xr6mʷ>?ADO}}7Cƃ?"ϯ$'t>lQTED̳19\G5nYyt{wy OOϴgV4V@U:jMo6RB.t)t5&OvG_;[Yb$u.YFz_B[Ywz=e$^bEO\? LGċ(NO+ЧͰg,T!m*skUn+13XFClqw0L0=3f*kULu/Wv4ۚ0_kjkO>|w QGV'>|ªztw*-/54~C'q;9ѩ֌l#pF6DJs! Wˍu0tK`f\d GnFtɊ𪔣:B4ReX]Fkg# tYub h'Hz=Ćsm3Z2l3cd9cWP5j@R4c1n1|1skJasfMebH6 i|W'AַL!;~FG}6#)^*|NJda%ZEyLyia)]lj0$L2iC^>|.!/]3;;6&IGA sxHڮ]3KYY_w~tq ߋեmV[bEоLup^^^Œ6TNSfyያ"T0;/@X[Z?c]eqC%nN&][ w/o+L-hc~mrYy% iY86c^N%D";3Ҳ 4ܐa!NVE%iɧL8OشOEsBB9aFrW*{+rShLum\m4ݸ* ٗ!$4lK&B*:y|2{7vkgjdw#B~)^^C&&~bqA L?n3;XfR88J;B#.عMvßM{BތybɅM:MnIȋY\}7×fԊ^x݋'0ޖK_%|i[O9jH6 4QuEa7&\zT7ק1zg7_? Вr^Cj|bnmm9dӁ!1ݻw8Q1Bi[OQml@i;Єl)#5I6EM xOFdjUVLD׾߽;>5n˗/ykbys,n77*9GH+::u@IEM9<NBEMݔ -Э$\D\U3Ъ|%y,ha1W:T uC?&ӖqQQ-w:sf?t+edyAny/]SQ? @6>>q9D 22^kVzxv-XwB]ݣInɛ Iceݝ669?nogak6VJ f.x3?\}ra/J Hr$ /j;_DY&+Nb¤ 0ݢ@`]m/}>zS D1.z 8 zpXV|KI/=Ab11ܺ/!$̷zhwChM2y6=,sIR(ّnB oeܸN'LPdiM< ^&Ҋa(Xyj",,fWьg'SU_qXfY Cp+q 4S IDžG@@S4Y+OKs1vQ@Na aO2꼆-Z*Lo[EYftZKg0!d+D 1*JS>&H@c _3FA(4Jߎ/xsf߹?֙ zK=w樱XSFL%MeiAi͜-%s?u7:_jW(߭"Pϓߥu~8,oG5T[ncVzH &(/Tm "zX8V/X&"zo{9b 4K"$P ϴir{=|/4!ǜsk?n]|ki)=^ 6ki郘$WZm 83GdeڬRR:>6Wʜ}U?Qwl@A(w/!} ۖOPb *iHm Tyka,=;u%gz Yy%<%R@&%E, sp>I'ޙcڔeTݺ̑9B0}/@9/[_ILGS:^)P|5lKt`\P\kjjmwt6=6l$J۶x{l6yytObpLJ_YMk=yU+_:0:)99Rf ?x-Phx,=S~@b=HAQ-[Mw? &k{*}>B".g{B^S%)tx,Dprc\ [ ǚ^1(8+q7{dxedo3?[IiB-ʼnN|ҮsBdBPMQQ?]JQ`|V_jr~l|~ $o;~}8{+!S(U}iP á|\9{UG3lkFg?388=Uհ;= D~sOY~zsp]d ߟp]=/5VH ,ؕ9w_<)~Gxp. iAGC<Ӭ/E?bP@ b^-!/X )O  Vuï$0(ȐT~o%! eZqHtigDŽ+'3 >z_ qupp<v}WSGEF:qH:?*&)=fq'qbMʽHQ<冾R {z7hz7f棷&נb,ȪaGvvvYU@@.aVd#KC{̨\yx· S+ Wٖ**SϿ'-c0f,`/Jff_u}re.jy:U5vmyVl,SG!' 5v;Xn,^p}]ɫTg-~$`[k[+fgV'd>%5 sz)(A<''ǜJ*IZNH/vݓ&5Vui:q~ssxy]7V677WzuNס!CYYYG&|aAp$k>7/[&.CyFx%S.W.g@2x5FL&1x" "9~a3qZ5v!IڂZ|gJƧd>@e{se)|;yWuvvt*ʢ!Dw|@_Ь9 z(e(7,_ыtb7n2T? "2mĕe|Ҏ ;OoMȨ]*#X/Rv@?7ZB::ا5O@#H1>zT+EEE6JA}򥯽aેIܨ TlS=pP@.**s.q%d=ԍ驄N֍޸tBe8PIi)B )??<`@Bmm G1xA,~Ñl_WE_}* By we 20 -HooͿch: taր55;[E;[躳5#>yxU+{[Y~gkhE~+4lۆ0 h0Ͼvs0oY~w?[w7 VS@?!`ׇ8d!g2xvJM#>7)ӧgM/~8hQ'Gh\ ϔ]V3PR4Qw2ʪ}l0F`S>D$ 7y/T-QXL ^ፅCH~ձj\0`oy(\z6!*&r^2 'N9%- $=ϑ¥uL {^>~B"! ?ˀIJ8q~:jjnc^Qnvϖ+ K'q++4$)-"TzC*˼ʮ w V _^,Z Cయ,ݗ)cUf lavS]L h[|ED>x *MCYwoj3= v:flp8ΓQ6y; IfuRi+I7,vJmN)w>w(//*2/ƎwSSW:OvwhA^{n3˨;ش)pa#dGu+y%5ol%"C_zE Qhoߗ+7nYBÆ^[[{i6>> -D Ö7b{SMiI0W~NtgWTiBêiºAw_)Mow-/*.,_w[&7֫OLME3xb;XtIGBѬX.\.CJC6o.cOe LkY5rlK5)tV`}*G tOcsvw/pou>v{[Z}{$'_6Mo}Vg@]5MIz.H1fzVUlCoU{1g+CIi7l5#)ܜg㤶ŝ9_Z7`CLENs^!/wvG90$[z@W2K9D#al~W,oErmsQ{\>ubAT镖\@Cb; !=~8?<]Pie96f+Lb y抝M^_iQooNܷzAwTvYY}Ñ(_^*^` ñ q%l3r6SSBAcq}~an:3`0(Pw87ZiSJZoD599?q5W|-1];/2EN!zFDRO;< +&j:LsoFV* H/Ð IW a)oc)EcWpO5D_vwV=}כ %izн4SAG"deص^ܚzWVW W4 E*jt5ؗWi33{#Mr{&eh:y2&ж |cӵ"[:)): aiS@+X;+RgZ}bO[ZXݗ@CJeό=vp~o{ӮM<&jB'J!#K~ǡ 3X&M5hH]5}D!eȊSm*(? xNlu)t: B_H2LSr[o84h몁V9mώWk2+K# Y;$΋;Gu{sǏ---SSS{!z3T~̙[>nL %Jgqb4$ My>{X՚rxL5&07l=vZ7(%;]ZҕvdUrVӴ;l87W@\\\@5w [a*,@i0?!A^j)֫Ո M)g)\{M_Xvh@JFЯ ?,9<稷R`7AٟZR;5C? bsa}:L=O$cai?KII >j9L /|7Zceѫ <\F3SofvVzIPVc.1tUi<Oe%%YZCjw(t|8xu>SRY]Q1oWWWԖ~q[6^}IףܬD¹L.=G3Sno/RrlK)( I O1/e뤇Ԫ3@13;(n3Tޮ!I`-*!as6*?m%q5KrLo$'fWWp )7uMLL^fG~|J/M;͡m]t^kcRGqKB/xX^< _@қcRj\+|MSo|2M,UZ9h=@1yn8e'K]NN" %+ OD!Nk[E>qk)s/#f .#ǤZIi?dy*OqX||<,^lH*Z!ϵ6ƪ p 96E4,,l:k,BDYZiVv1q& X ETS%߉VTw!R(Ru)[i2ƒEɇS<:@^4#IŽ&kSw~*(nm}"w;O$vQooBTd/ᝀ&e|!f)畒Yka!&]97X6![\\{_< }-bh{C%$"6Mc6ڦ/Ccp^m@]#^ UEz,ĥfof(!q0Q yihN:(4 8<=np'-=xaڑGɊ^^&(x,AУv:p5pfCd}nj*?=gq~" =5,嗖{Ļ (Y5ƼI[rQ4z8|= ~`̸z&V:]}qN11syX]=RRR`ul]m߃X xatQĉlQȐaw7Lq||Y%mPHV?f)'Ɗ\֟ޡ}8f W ',Oє Ez.+gX-1!ohy79+zA1pDz:) wp.mLA Y*j(#OA]o ,MrE;7hÙ&m?&*zIڧ&G!7WRc%xv0p%C"jg.`ZJ^Ɗv!)aU:w(Ჷ_ O9bqy=^uP6wkG)KBnGc~F{~T{ق˗y8E0ϓ%kh,1Yb!1 MIqHN&GV 鞾n\a<ڃΆTxΉZ 9n N; Vɏ$e%4> kD߷oMx rكd:&Yhvhv`QmG@Qs"A'`Ip;_㎜E9`֝?='DjtN相dwO*h8ryع&B,v[ftףcbiCOt$rB3n:q+-Fa.§KK%6MA W‘? EDZ[;q~\}ńdĦLTUj]gw#aZ'9Jܔ"|DדY70n3?o]?ezy^B½z(ÇaaXƓSչ%#;ZZhgU5Bmr~yH3 W'[m+l8~y=5|9yRW-" -Oa/cj FEEEWt6B~~ҥ'18Vu11Hq7mW@r׉P*(e\f-X3ʊȺ%̽BSdŗo|cT;05o1^HE'Y5y75DRj;=fsՏ>`kOϑ0hW,\?xXT~!fRKe,:Z>{Zhmm[7U?PSa-ZI>/c; "`$''ODZXϒp+]0Ӹ'ą `} uxt Y FiսFFǁusgq ⍟eG~8` srpx]czTEXKRwOJ֜]^V d'rxXؐN(>7{!5k E7X7lڽKڱ-I=eB؃.ci^3Lf+P|l]ZRRJ͒hd.M+霫Yo7}(@4)(5R??}d"l%) >YaS$z *ku[ߜ\{=7[@-~B'?}9vr/ †p;ݷkr rB~kc_n}}x㿃~~߷}ipºyn xX h%fo8|?k+ /V>rH#. yv[=Y3/};R{-*67ouΉ*rj| o̿.H.ivbcb&" e$}L`ESVS4/)?xd A`wC1y2w@cD\y gX|G.`,8M^zG(Tٵ)ENJr^ 21^uD g.k e??l^Uu-nNC_ pm7'.`ԔFe&\chZ=:~o5ͻ|D(vGۃ-,t>91XQxa emܙRq8[JVhAym.C:-,kIÑv=E 5 ZkCPiӆÎ:ȕg,k"ѝ6k(nQ]]UeKu9WQ٭ɫXd=H'FMl"oZtZt(A W{:3w#4B]qQ4znFtܷ3~3qՠu|b̢m-fd, Ϛ &yhF <ܳ]G5{O Exa8R3_PAq+r[blg]%2ms _w6(A0wӓ <⢕NA~;9NnnPii˝ի:K^:Ӗ\TJX?jct !>Vs-3?eෳ,ּ`gˈ s,)\qm.ެZuq.* m 0%nm%/mx*ó.NN;lsfDFKxHuBb6~ӌEXieS{r(YF2b}]ċc6NP?7,IJ"ր%xWWr-٤qBU lđͰ]bE}}=p֋퓝&J*"MTj 2ǵmp!׷.c/Wg&1Ӓ!4u9CtI {EId.+;Rqnn{λ~/ꈸ,'F>:tM$5<;mL˕[dphA CHD@7uiL5еQ555|pLvBM6Q4}$=ѸO]hR<م]RT$m's5My>饀ښawEIAOymLuZ;fMvZy >q (ivm#^.Qw۴ۗ/GUNOsb>&#/= D1J Jdj⏷Sxp1RpWz(^IX)(C#]boȵ}5ժP+E/6+ l}TR?/(dzO ۨA7,/ tJF<2x[ǿYyaOқG$?h44C?= r>8BxMZ :Qaamberou+=C.jjƀZS=)]Sw_ҊsG:Y2O-v5N*֐zBM5,䳺!EʅK2ko@m/m% 5F&?BUR¨MKxdn ,CJZvrŶzսd{䒻cl ou.zmA(%&%#,r'j,%OpXOZ_˜^ى{j_?k5Ni'|SHPP2mqFćeiUռr,Spϛ17c>6DH1έ8 u SW5TTj"\$cK6MZ:XhK~5ut>$)ԭU!uL0g t2CW *'} v"~\cMDDx ׫:uh߃]c'Ⱦ2Lbgp^w''`i:4t)Z4XP06'=۠kx=GoE F~l=]t1, Q*K=pɋMCI &cJ+9RRN.:Z  iOa>Ět` SGm.ې{K6C9a`iθ $ƴ?^ VO|@,/ lo}l}v3q(v9P;q*o`60ޖ!@+ I}@DfWǛlmUWԠU~ %_'Deݕl+oHgkzw$*|Џ0~[zRD 2CqcvR`:9ޒAsm: NyC ӮepVtsDm"6;5ܜqmcS)&'ȳw B[1XԗC˱+WYNAG T6T? /ݵr2m$2EĮx~C6GqԺH09 OxLoK$1i[cqNçGZFig-%2b$ZqkT~A`l)>!$SZ>N{BҬ}}zܹ"T`Lj[bZ{oG?X)ӱ"7m#<[M]OqOD%ɫz>r9<RPh zJ_WR/@{(Gtb[SM 1 xw+W NMVx레f!k$. 97:[Tx5ǻNAGΰmD(xk]2͛1ZS}~14[Sgs)Iqe{Lk]]۪}h;:/`ww$vq/ppX xҔe)-'\-'[UEW-P5^W !(u)w@?xJPP{_@O,4ڷǯL=+/{eڨt_V q$)`*o39qqiGbwO@]'Y#I{4F"zzEQ "(Q 0GZ -0|V} fUw5 g@sl'Vocy ^;|XUo({Ll+vrr2FQWPri`FZ\[V^TmdFřbׯrNlMMX]qf~eBe[ce7h!_,'tK.G%׳>{ۡ{ˀedXhqooXtFa܇AϷX3lFXj;xojͩD"5.-<\^NMMaup&)RgBz5WSds߬ `1 c͉A kg:haa9&h52GH2og)%w9+V200:߼e\'QK ]Skklx9Ony(fx_{ė$9e7+ :SD@Jx5S?QZTc٥ct_7sCy b] a [[˳CeeŒcP)u"(T(6J -Ze?PFr&e2{O5f8u@'V<3!|T´K+ZuTZ?ܸȡ Qfe|o$P g=k$&&:ّv}=ht92i5:,ܭQ쓐Gh~ ,2rZ1KYSTSNrX _-* PXL./휻,x_{D{ZѠ%[ ۓ#8mҔdQ|zw'.L 8R) nn֙n/wV&RK׼Jv)ꉞ h`liX0Kv=N"Qk8lDpv@<`8wiLA3R^c1Isqs_jKIVjq~XoS8hm*6^UhZ};–[3|b!azjB|gZm~[ VD0kU Arx9Xx`R:|@1@CCä9A=(>!ďO[aʳwERd;7u#Wiz @1 ?'ӃmDlC XejzinϷ?~Z2WbR>?⌇_:z;m2-M l's5E^>%}w;N>$)joc]ŸOזg%#}Xn:̉y~DnQQN4Y Z%:'}haTo0MUi=E{떡|RIu[mNHHjk8`rss/"S'Wd25B% >ڧH(I5E@5I N,*Y1ƶ$o&BU3:]3ϻġӨ9~:$qM.;޳?Ź?' -O0߷ qں w*@}ׯQT5#o!Te^}MN- Z.4L7yTc6@^Iupj?Q 8;t*MK04Z=7Ug*3چj&6T(/^ѣP|O" i3vY-.Fe3XD:4,mmlnEQ#yk?ތL\mH$1O@A`v%n3a$q1v+bYF8{n3fD Ν;G/&h V%+橦Y4Ù"22c5%1!8}ՉɑR7+ɞ0nCJҺ^WʉA'dBc.I|k}:ؠgڗCxA-YKˋ*rP4W;Vyf_qlhv9Eژ.} V <&.Ĭo4YlpۼV2H,#dsqK_{ĄiMϢyċafӖn 5[چﻗ{Y擦uu/[~Dr<фfoC"?d+٣GwVf!&$o(NOoqFF+ַ\a%ihi xK\NV@O[{ j ^m&Ο}{LPDZYZΪ͑&.WF6g<=Y+yt1BDž.:Lf Az=PҗA=tpv{{ŢRJyৌ^gwl)ǩxi꬯g(1 2pkO2EU +Io{έCё1 )C\7N.@r UmƬCL>mӳd[ iՇWvWUe D;.pdJ<|p>Qu~kH+?O7 g;fj̸sٍLC]"U~5 wwLٹN-"]o Qc+)bcc]ݯB,z}_W j26S~sH$b b.3b1Uev':6nnn&&0^46謳)Ni7/++$4/ ­u/]ͷ;[XX]rH|'$ޠ^tMM PjHy3#^x8Iqi#βGHπs;7FY&  Ga $x,pvF9yXLm`P'G%soViO C<]YY}/IQ>K4vr`ΑG8׬a'yŪ5^|w뢞/2%X68t^Vl4+}+w.RX-)o$Tg\U&-IX+Qe!Re-PKa[M'mZXlZtjnw'fn0mK(m~+LK1r_?Yi_|UC4P 7w rfm1 a剛,R 0a \kC?u^z*!clX* ވ6M7Ů>D>oQλw)z1::^١{t =8J8ׂJޡrvTuZ[F0;pMbS]-w!h]pnaW%+̻'Gzlԭʣ!CBMܲ>k$ey\i6d֕j]_kv5}j=&d@6*$ \$x52ݵgʧZ=L s)VF5ֿG~dX,Ԇo "!xQI <SD<<)^1"l^gTe-iu q,Z&\1dX[: LN+CэW67hhн&شVyrl5:Rmm-9ToKRu+22(mH]r B⇋1(@֖gݺRdd%rr58:6n.898-{;F$[%[_ut>3\10ZXDύL!.A6%i[,Ȁn)7 }bו)RG3XCu)SdC( sp~~tE%OUzHa<~az;Σ:&ep*,yc#G.jXg^_xW@ 9.LL~5y7WqĻ"eⓧvr"olɀ{~t˶A)F}+/Ӣ'Lr!R{*%A."/xz-lYb= |K<rTFˏxl1UQ۱󭯶Ǯ1F-jH nUW>8OdMw _8?vsjOȯυd۩Ǒٰ{@N00q»l+Բ ہՅwsQ16]N$CpUE¿eHTǏg`llw& X>by,.羾uP^" w]g[UӒ4*w:w/s8E C v0Yf)'M//;;7lʭ'L,< suВ }),*LB]bxB*Ѯ6 t#} "5Ķ j^1OrSZ+,&P1n0zz`v_Q_xG<|CW%Y9o(>~ьC@]9Ϩxv\?0^U PKNGww}A >\C]G K[NĮ1gwIql_:ݿ=c7R*w+L)($w䨥kjjѡt}~O0Q0紴2^-<'^ADEՌ}.̓b[BQ QU}w8|G=FHWUr _0#S@c=Gu7qD<l5@/1pt5d&kq<`{Rσ؋XDZ11ӛ}w%;{(j$(*osOϼ ~ʼ)  #Ld;yVLAq} }3&kvvXr\^>r75FUya+?CTh67D;] d2'/t0?RAH#T?B8@mvk?#ӓOL}3k؟dzr G'OLOn0=*0H y!?\s&,/$x'ο\1;BzAA0~s&5NKSP4c:ʊ]f2VmkO_c쟆*p7͛E9s;DYяX|ϻQ@ree%!17wYQ~RePa]LpZ9 249|O: CHd[iihSdxB{{qRiiN?N1p.Dte<0矿 ,_?OE1YpZJ^5;kU{ B"ޡb;\㧅ȷ,^ -`wC< hqaP"0Nn9iЌdH2=PJȰ@{SYz#(/=wKg$hF5@`G#%WfU U`URZ͍ loc0ƁE=[BNx⑰[q-9kddo8XYk8(]h(t2*,W^V/gG3`T'`Gz9P*G(̓*#'Y0<phx n՟p,RM>@k7盱Hxꍱ2wbl­=cjj=+s 4URg wu'`MY測}#9_XA4ӻ ='$Utd▀նXgn(Lۻ^W=~Ymo>̰C6 )K/rT?d`~PJC666c!=Y3&, r%=ɵut8hÖȴK)ϴչD miWhm,Ƭ3GF,} &goȆk[-7ۊk9u«?EpSm l2PɘJV$胲Hfqo"G̓2g^{]) ֋0aT.{( _6,%x3.;SmhmO0)1 @h( g1XLQ[㑁oe(dm$`[n0;CM`GYQPKFѳɢ&8uքMp^IhZ \^DcdTH]w8pso}|oPw4:k9]y * )0͇>R) ?<.>±:w(ްft.N. U/94oiOl*#<E;ok#-כI0a$µg{]MQLχQ2 昅"12ѝ DX_ЀJb {_$"|}r88 (NFaG9#?J>C!w{&Ů5z|6rX{A_6!zy5p$"*1tL#PCϾɵGD$&&Cߑi|kމ>>u yyfOoBpYv)j4s/|BOyY> 8K Ai1:sQn -z?.n(@}"k0t NMJ4rYBBjE2p֕dFpzXie ֨|3 Ϟ=}ddDr`̈́3| y0¢'--mzgyֵ^i\# 0/1r8J7`[ Dh ָvxCZ vʑ퇕w.Rm T-hfȻU~\N¬!@,}9,o ۞%Zyy%p{R19ͽkX; ȒweX:PR|Zc]81pXHE-}&/g)$p\[4DlpCYY`ךD\llTsssZLm<%/|ߙ2c0YDYZi))Pȣfo]:L^ý~gˏKNX=;\ϡ2Ep8$4D2*4TR䬁dU1ۀxR_m=Gr {zi9˧0o*'I\޵|mpn/&oI# $2\Y|lF}evB[ZTwe,?l4@k/<-.ȕdei81ɅfG6@#~D| A$\Tǒ6?8R0lWymGwLWSd`x-U}7DNV]{ hcI( ?b9)r3\pS@Be wJF]"#y23[ lmm=#H( .-!nv|AvjػoGc3DPt^>.@G8uj{1& 1ڶ@2}B9>RoQޱ0%uDŽR$y30 >:-Z2> .#YeU G榆YsZoᒜOgxtr89GrQ|+uO0jղ˰.+|Hjo)ʎ1ՂT`ۃ:ǯ*)}|쮝a}fGbA-nos>kb@WH9`8gvA$<(ux]p0\^ P\Ј q HA{ -)'xxix*%'~2lb?q SRu26 |S' =Φ 6bFPGEX>\=5ts}8N$:$a)7Rr݆b[S1g'RbwW$$HeyagIF9 [0c@E ,-fܹא4NȚ){62~ u˲7~ ( .SLg+Կ$B&8&ew8SD\ AI.mP%R4񗅱O5e@*ze3żՑ/w,-r3; u4jˮ7mYf֛-bLړ`>Q"|KIדޒT\i.Y~ )ֱ֩^>qu>@]1 V4dp"*`!=RK/Vɓ[n2Wj?ncb%,4+ ^:*1R+%*u0ZP,f;'6tO*6h&GMS\4ASSv@EХ5 w ht󐐦̡0W{X z=(Gos5_'#ktog0Hrzh0z9ZtA 23[ͯG $@[֒8 t҉>yl$GYYHJ7rdh;fP JEu9)ZA3xT H(ᾃ"jb"Y`mB6y@|?%MVV)5b%L/JvDx"R, NVX':̲-܊.r $f mLϗT\ vđhk.0־"`Tgbvjl12uqy_YVG"[m-* yߢqOb ʮ˰e Wӻ1zf`;Kÿl|NSծI|㋨H^VP!,[qVwW e$+}]U\HLx_qW>-6#n9zrC!*.8NPHZWq>X|DDs8*t{i:J!j$δ(ni -nT&߂+_X|cPtҲLV>,в*CkwVv&t tvKx*C# >;5r>*C?T ėL}Gۘҳq=g~v礲F{c,RCUp 2fkkkKl.E3gxyy"/#g1^B/205ޚ132yL.O`DᰮNo ȁR'ˌH(iⷣ/ m].Җ A#G?h~j"'j 3£F6Ӫ`瞦6;z.9l>FxT pY 6*'E#32lݻ(0`r[a>:+d!$ iP{U^veES* k%-QQ僵)aU1V ֫8xG4pp[7PٙT>T%;KbbbW m?s n0͈$|JyG4:XMPԜQdW+dfyeZ*y&+keItEQ%D϶>GcƘEaܳZ)Pd3gKƢm-,==e3pRb$$$bbbu=ttJZ0_F#SR'P;<,}TH}WѺ"֑×b /,4!]ɵ=sglҒ4NWtF*)q \WmA$XS$j0${}J**vG0Ĭ 0SڤRoj\X6y}W"9GKrbz=YUX@8ļ<LP8okej\B22y6/pT3tk.Ӧ%&ڵko!Gk tM:'5ŧ"n۷{W ZOm2.:WŴhv#,x]c"Cq~OZ.6i>Hۗxx$u[! ΄9zc29;[79y0xYDao#$⶷=(kU?K;!)IXN%BGGRe'Ea k]FB_z%%_o`L ߇0*Un}f;hW.sN8*@!_DXct?ZDǖ2Ìڵcwg%wrrFxyy":AwuB0$GW0V#nJBNg7 4͑hAXsC=  F!AR0إ%"Q?فZ*mH-1=07 `+\iۺ3ADǏĈ-l%M}Fόbmu12q#bv%Xh!PU}mC>^,')`x{Gv;X[Ul$Ln1C CAL,h7mpO)"0kulWg8}:2kkk'd 6%UNׄ(sЄ+B(AѪpcgW_Y5_; a+6"LP3 RWw!XxyQiY"M1z鏷;Ŷ,isCՃ`Xweeub tzCw#k)v٘VNt Eg g{+z%[Ew)K%^Ojy1qjUL?qiiq-w҆_bMscc@)]ߠ܎1MEüomN6PAc9#ylZ7|x@W.'#!X\ݵ_j&IB+ 8fg{CKK($~NZ;v%^|=&Ԯ]ߙ*OJ3 6D$w d8J fE<˸duHbכMU7?{ܴ6TO,44(wWpb('&UG-*5YE0vsss yuqx߶A{]M̀9&Ui=?m0_f}aV#yeaK3틜~@ R .i>0/iYdrf8 433!!!EӵC~y75_MTk\eZi 7hlli.3&@ Cqggff}[≯vCy8AU@U]GA ?J?+ @AϴծrGgҹD,b?8a0~f~+z ߴNz:c=#~w⸓cؔ̍㡨 e} $wV~|~`d:JТugz >*&MN )`%KQo9nb5O[EE4 sq0J4v Oa0gd>M__x^'m-*&dBOC˟ CMX_] 6(e3>)DG ` xuE ?|-Wb\3Z/ۻMT=S+&bc=y==N&?r"专|gɍ|BP(<Ű/t.ZoNnol* FQvQA0fV9M"G *Q~Q8k 7HSP>56 x,yFM@'mY#.dP!+^;)Hg+G1r m y {(zz{+**ZkIa©w תh}oݒ`y$XHgMk,=a M%ԭpI r9k(GXd<0kGGYʈ&+ځ(A7ŽmI $K6sX.l{#Q7n >`̧wqb8FBW v[<0F} th40jmz 5N8B5L2$C\O`$^2Ҵ嵵_p&[tzkh6:SS ^jT])*>љ}F3a7l٘ sUK:(]l}CG <'D)_Qre%}7HobSӠt Ni!wV]PwVV ֻJ?P }_OR<?y߿Æʴ/`/njK&$$(H/(1%AZ> =(@HyC!D%p"w0Y37!뗣Bj@g+x>Ճx(Y\7~b$a?H P @>*qxORDGm;6_"jSKHjLo6aCng+{tz˸&VWO55Ҭ{0I{s5[W`*`Dq{8;EMZ1ޠ"?rͩw8wi@f* KE'JǡʾF(I ]=Q\XkOm\Z`QIWݙ_K5b-y @br_lM \oWbYڶFI>d*5oKKx&J`((9r5B'G`}*4j3e9r'Ҫ^"777~g ;><9 k}hYwXuOLMMgoPl2`  "{"U&HtaƱE=E:~C;D"4[mdt|UnVn/.:]DFF6oX&+_]]sL siա ?H)@wWͪL=+-}m-8-331a:}:bHgrN'7iBnܳR<_:,;,|tI܉cse<ʩ\JNgsuzqVg|!ҭWJ5SSx2z;@Ei)gW-?wgq5 tuF Ɵ7ʒ|LP`D3gI{9IIIYY> g="q_BD.EDDK)˦}us7)v@+ȭ1@z&*!T;E) oy#HXS%z(=UNHjwk$fQI@jķK /Kq$\z=Ssr,d}??¢_@=~> Bx b;@~?8SXG^~%"~PGHP跃B迟)^  DɃnD.pO 4#mLA#}*NOG2A1?v@:=2bwLj<!A;b~E Fx_:<Av @W/LK λeHlaH=5MEAn\>t!CER=]"֙j.~M7'W3KvsOq^9|W:!>9y0DFhݓj}ͮbxMhQ :ܐ'8>LLlv{J&;'69iw Ŏ ©*.\tu-jutt)@9mG{B.-ˈ!†Ϗƿwui~D]|4 \JA(&M]nދ/JHFLZg{/ԩ ,j|JiJI͹}#[d° xXl4k@*4n$ 7D lY0^|Imq A*^u%MLɲ}Ǵ&:i7 M,,x>VZwu>gz?|dRgak+6>?kѿ|(!07+4-,qۈpy9L*4 $$$.unѣhEޗn|cMNN6|T [7և(=g~"_NW#E-1]O.,i6b}VCɴy;թň%*߬dE{xyU1`FGG\\WAeB{>)VNIilnuu MC[:etNI(KR̵wde7> 8EU:I r E|{j˺bbb0W#NezC()w֭or=Ϻ xMt<*< 9bVd,LJ'4r$H '<}Q_>zybk2uyҒ/=Dt"9b] /i)Ù3999@\-0bv2k"ó^뉢*MNq-x&쪣R l34|Ӯ݋y=c`l|-]' FGGS۷4K׆LIYȔHjCDtf8,+'7<4$+.ØWKf38^g{qX9.']PB"Kҙ3gforִB}u&Mȓ"Y 9xoP aѼ~=$˗)h3xH/dw`n {͸^SiR9aztW_%.YI)C 'G\$*3Uΰ3^6BP2CDS{C}V}R]k^}<:m0j+6L3PBzebgvt<%{m>L9/Ѱ)`d"qaMR_I"4 S5&U_zS[*,DlH}fW`&[^yeE]yjh~zx||uyaZQ`Ťb&Fd M2nIqϜHo)砇 y wnOb  370F|@n 8v& {0 M\tgk}jQᶉZY݉|R#iRYun 7{-m⽭fA/`t9twr+8*l>P/4iıoDgŹV6q{ 7Hi[OAmsM&C3(@c#R;HDeԚ}K~8]˔ YRg]]*vwA8Ccd]lrvrH|4^.X52Q8QJ٭Eg^\[qٱ_O "cY×LvNR>gex*ĺk)=Y6v?ãt'qN^YGZxКSS*<-z;w7# L_A*jX;QvEu>EL޺q >jA޽# [cA,{_jVh](iqhTc΂(ZXA:nȁ|CA]Qљ)^ؓپ:WƴTznVi5&'J- 67yB_=VA\BT{.%lryDDa3=lw.G%o *]mw?BKol4mʡM 8vna): fQ잏H~W"Q(c~b5[] s1*ͅ$Z9nY&"T0R Yzs(? ps\䍒:A]EvW^Va^Q,v \ ܹ7ŻVZ#RތZ/Қ]YpOFs+CKgtD@:جKV8s0g1)25$,tH_D!

      C F S4zDc{UHHL]`|PKN<((y+uW1sᛛU'l MWa}GLHrDY-3* fEʟE9=k6ڑ4hoDL+G1ueSks a(&4%O f S[r?Inv (8`l"+1;Uc#[z%SR?؉ Waʣtg:(5you=)AL  Aɶn""Ѿc8\@B\0$u{ %2  Қrޠ^5 ^p`a]‚A&Qؘ+ܑaQ+P Hv:4Jh؈jB̋MsA^Z2-]:kMKssQ\ ӥ+)"RCT ,_ئ~z*M-NB Ur[XGDJ1 - Y% uѼ0* *akmTsݺ/(KY Si"+8. 9q-pܞܙ̊6QDgyvYYY*&J5M%TuE,|0=yѹQ?\,*vo5_Hc=(VmT?_']bJ~uk 2 7ժ2];PDAqj۱݂_Тą nyme +\~T-I2ڨ|h܀1F\v%AYe5@RHH,"bj0*[j:֍Y>,,R xvD\[d&Nr8! v5"QURdޯ' &;Hpl,=Z %aFh2!q@IR6-TiBeOmqQVSF(8-Ӗ"p"*)uBgfՅ瑃y'Gx*mpfa/9\ٰSqwwk0J Ku_sl_<ןV@˴D8٬5N!t~N;_,7"iH5o44>ϐ/D5&n &k3m߷߸d8{! sW@^4FCtpRhgyM^c/5 ?}zp7[ 2xr 98ZcIP61BPRzᙘuIbeICxjz)~1%gmyyruE<ܼ[OY~S!x-=}aq.'* 4ݪV*y4B>(NPjps̆c*8OCZyn@ejRJ +d)e͸a Y^d%%K=Q2"td-K{\8?[W3Z8`R?Зq\OSX#Y~S3y{]gc>~q+PvqCv.U xB߼)a H(շP'r;I3ʵ-6KG"t'YX2hEG1B$h wXNpiMLsɝ|WҊ,KPM׶#[ v!.f /r脩99gu/Tܽ}2jE6+x͔]b{UQT@q gggӁ=m 4߅D<+YĀiP`XKAYІQ:~St0 C~qY䶻dO,l.z+o/x;1GH+;On [M-ǻ[} $<7T:{;9aq#hʌ&gǀ=B? <{KR*ıD/pe|KE0?@s֨=):# Kt5-\%zUp{oK@BTCq= GvP[yT ;kB I' \=rC)tw.Cj**!ls> Оs\}C`E{_;ٵؔ&Ǔ}bo!444q gT 2|[:**Z+S}ka-"3S+j;d[) `kH.t.}@ws^2vu= 7Vy\5;42oTΒFpuKڜdu/j[M ZP3Hul*I;7;[S&##JI8wQB!X)d yfx]WO=irGDu2GZ<S/YwhPt;"0ԲC hT1c?bZy?uND4^ޝw΢PeUd#@%/$%Tc:(C%<*`M1̵ipV c飑sv1D2* +ʪ*:cqu@ Ax]BpcVևKi_/f ÈH~@n!x~\BZuǚɊuHtmrfzze-1dt|Q LT 4mCz6pģ}}G lQ RDZ4UKJ-Ʌ,Եp19MO?(,F9_/7EqET틥.X4o^4#@ցZjkkjY{9߻qG *͌ 9i|&ՆFXPh?|HD߽{,%&'ӭB@HnU^DW\"WDH=%j%qأ#gxK1hڠzMh ǃhͼ׬uj3F7BU8e _޴_DU(tՙXz*CE+Ǡaٞvr뤬l=d i),rܰkꆃp73Pj"r 3٩ejq櫽q*xd0Ck%lA<쬿:XV#@fK|^^$IPۚ F>8HH0B~$LD`,ɨe͙OݿtP]eY 72;@ƹwӢEPf"%YvkZAD|Ikeչk@QX0`eG=یYQRt |VR 1S]݌GA \o?պ/P5r223@,NckƦD ۭ+DJ/=3ݷqHXťPpF;#0ʱ9<.M50 Sc 'OU5Gĺtt}V]{93n8x.u޹::n޽-$ߕRVڽ;mW A6{ 45>\Bĉ?6F Ͷ_VH?w4ŤJ!C?ለ;2ZF_=|Cqf}]^^N±~8oc#Xr,8Pt9ڔv/Uyb[ƻ !@+xh^hK.vGJ3;ODHrU!Хө}1}O"$ }1zL2ǘ9$D |(8{P ݽ-Tw1 'u =P+8yWףD@!`x,.ą'/V^_,:;^xHKJeafvױ#,,yt>!!a~Af~P`p%==h:Z 66]]dAv p=dNSS]浏_f>KxZ@[Y}<>[ws(?~`J+@PG6XNM݉ӔP{ggcY_~E DW1Þo 3))͛F3|BF ?4ʅNy<W{xxm[Ɗ6ޅһI&{%@(H'Q4A)!4H&@) 5>?笽2,cc9<@E+#~3G# i|aǠ."LQNWztBT]Q/r+ܣ  6!rWF ٌC ''^/%@f}ŁH/))%`3`qn/1aut^Oj?$ {{L.ӧru$3ninaE@[2Kѣ:;x;7b MIJI=6tt>\g/&&xArآX#9@ D_/dҞ$ƖM4" vl`#* 3U'$?tNRN/o[IhɄi[lqJhY/04ִ'a_=˚`8"]g#!!1ɹf{<9!blG^@Өԣ MU=f bHɏ@yxx A\>}34olܙrEVR@\Xc'n`%xQ?"+_\?PT&_?~ AX}^o@#x^xo\w/d[)ߕ m)R!-{EMoJ~/㗞i;@ZJۭ?J㯥9i;_K-)?MwoҿlK&}c<~iǏ?mk&Bm3?/ "_dWZ,TaY]x5O5f,wd(mB,$4In#gf`q1+;IyXB~@M֥H|SĽ& ĵ!C l5ԛ{V_̵*#@`PF|2Y%Nj>(aYǾ HdW+?\ͧޡ1(8t1j]#oC6 @*|vvv LCy0Heo,7 YqT6 dl umh#FM*$lÄ(L\: a@mY :<sس:&\1r%GBEz@F~_e񓓖rы%/ 0lS-i!madC&u .WW:S$rƳ8cxW)t8~k{VٽĖ1-kuyy[TE^(`#RR+N䤥6' yg:3]>K@.s$(%їvխƸX\kljjz'.<wU%,!d3KnIc`i=5j{}| r6Ȕ͂?Atͭ43ް4Ou}Ha(13^+93{8OobohlǗ 2N@ +Bߙ|(g=w%4̋O=l/sq Sk72{^>Z|Ҥ2B翠Цۦ Zۧ=Mn3'(:)7 )7A@s .^y4C&CUoW-PN\mbVL(7 C&oƑGu5-0/vGfIB)fڪDGG7i]tid2mmCE/0hDd $>6vV6썸>OERV| ܞh0o`Hvh4GHsꑡ!$ eu80600,eL踈^VCC߬9L .؏YyPP#GJ}%Jq-iN:A_]į :QJ0RRȠSPn }JM\K `@ ʙV666ffubLPP-ӨJ5PkиRA}BˤjzzzFks|H!}ǓG6kkkOGH-<_FZ v8)z7ziE_%Æ`cD\>`p_O c# Ay4\qI|a3gFs,8QLN >'Cdz] 4~M0;u$!BNŖy*2Q>~D3ڂڵk7 L[~جCt6,iiۢ' q!؂ϴ}ޯ͔O >,;Sv̕< =B9u"yL\h((EE )(s;Dyf] SpnhCm--RUsoD)a͋E8r]79΅a0R-20ǞA$kIcIK/4^K. rȳr$.C+$9.2 CSRR@#woH;aF>gBm)¯4mfH/~X1R&}bI] SǓ=7\2>Zȣڗ KpҘR,@M0^-ELtirڒE3KE~:cmXjjjeV GLM%i@ ~cBwgde:&)("0bj7} @h3<2)Gne{b_܎4,6icO~m0(<^:.ilmh8wኻ1Q/dAA)/ FGC>2wT]#G2Ő&:j\xO&K)HWWNjUaHP٢ɤQ5\ǥķ"d1_{"=\(<ݪ9;V}URk\w7 E>S>3 >olgٺ+yK5`y2'Qh5ڍ0$tW\xrQ2NXrѸ:j6,3rR֔*b6eO1%l}T="g88LjF ~'ށ5NU{=m'ΗK}EәO@%:5!43sk ׾|07|J?}hoq fC~ na2#i#뉝i^{)Wzҁ'F dhGHm1p'WjT ӓX7 _sߙ֫¶z;RhE mZd`œU`!RQ-8Lr7[(V!-Bjs6p2Ʌ\8'u]}UFfc5#n<]c;A4$vߡd!ן)+O: 9 nR]\דRKga$<w'w:Ei1H? {H_ ƻߓmM*8Rr㵭I- t.w&aV=O7oRL섉T;1)饣AIqqq]0i) ;QCGq}Ri .`.S!~N>cp96 꿸\~sA `=\-htCd7jS|n~'T Ԗ&Kv-=z_x_iݮ.lO3}x)ݻ;'^*'6u[[Rݲ8.3ٲI׆oj ju@㭡kM&oEA\8;Pr?|[(+yFIc_,75EC .[Τr£⊳-ÞyVo+ e;[a+t@ 4r*a2/85 5ƻpt,3.s {g"Y6+l5*2I ΣvGVџ;'qQF u(aߞpaڥiu^!t2#jr*Cƅ}yN-Uz kVܰ|%}2F~"yW!;i/%_ $=LɵSԭъlBY)ku@>LJk!\=:7͔EY{K4`Su-X'^Nb44l]A;Hwq2D@݉V9% )p?*}DH~g+`ǂMĄqY%+}|aLGvxN/͘V&E,,Gt64^+YLڳau ða>.y+G2<11E -ǐ\Cx;DDw͏o~ ",Dwċ\Yrn..b9*\8 2 \-wV" ~G0x0;SڛNo1T$á<}tggG<.Ç/qX.!? |gbfvߜO*/?_HX*HUeSg>$Tɉ;S@E1 s;dVꞒ; Ekfg*3C@.4vEVֽ ySr^&~~Uee0__4J٬}}?|b9%!N͜r\}=I]cؐSc~|vLARȼ=FWQZ,x٥8q  /JJJ 5,&(mHקOlvyz5r=98N Zܮ~I< |OA޹`nL9s MHʀ +{xxmA`8Mk-4P{P1+}R& 0S,4++9oF*_؀x9}0oʍ/E>Ė9K3*l{Ȁ4jr?~[V&@L}}bug ]B7~/uNs 6񾕑(nr\+(pVU?L:r@ݹDŽV 3Kɞ4چNJeY4=}}7w;; >Td*Nk <#KN44*..]}cqݳtY [:JrqzsJ7pݳNܖL92'؍j)"iwNmъo\446bߟ &bGָnHwg`4蓑`E @Cp8qX *@aiB cHo蠥vݧ仪ZgQdαP))n]H 'n[p±ɛzzzPbgH0\F_=iCĎGL^i /(sm * I ^H XFꍙ\ؽ; -wDRNURս0pZ3`CtGt_^36@PFÓKkk傏V K$ty4d#w# Ot#aFG&+ZFQ/B֚xcbRZ0ogqYqแ7㐰pҌdqTud&KYL6 #~(d)U}#ͯL>TFJF d  R8=FzG hFbg-cq0&vёj3 Mj3eŮ?d~}׿X($c/##{:_y Coe!?IO5/+Ks_ ~~XȷD$_'$GQ :\32]*__? h^~_gjC] }ÁuL^<);4lCԾo.*):Mla9L26AL>y/sJ|=ZA21|*n 7ؔ/SS-רmYDd_Ғ=#_>-s p9).>7:ce\vi~:H_axYr ~GmXj%v.)nl胊u6Fּ /}6%ѣ68aZijPT[׹/yw O ,tkkܧtO G@bQ~YGʐ%jD[  .4aS0.=)DkBYx,0ͥ.[QxBBvnwg">P iSid>c=t]]P_zK4 ]vo>*086<)>q>i ZsS5(D755Yg۫O=|/OrwÂpe!2ǀ@>l0 ڭvq^0;Уm+qZtp A0F5} H"CDM%kD'ykqU8w<ѡI"OF8-Lqk=xkL!TX@U75oJԍG}5 v4;wV˰ y+;6Sw4w=nZ+Oe$ $o |}zËx>)yoh .T^~p[]8}O@ĬCђQȽUhTZO@T+P bWCNN'qc+*M󄔫Bn尒X$Zi nuG!.bU|4$&q9){F>m31~N\ǂd3O/Jkѕ'[ |T@D.2]$)D1 4sП# #!DB>.`J`?`A{04xc<w:ݍ)7fxRq9}WRǎO`!Fyzz:8*49$$_^HPvՂ"l yO^xx`]+-ޑIY{R1:(1s;sclO`DZD+&"z(=T*y~,p_DQ= ;SK&f:{r6FK 'D ,܉oYw᪳5<#ЇAylR%/Yf 8NBHKArwEYPS P}jI/:ڇ'_/Q?' ?u"O WUXWu=iSwy:эLn6XO:q -wO9v#G{k^OxhbGT#)zƫOYg=xGTI"ZuZSEpSF1yȍӡwSBG<%IYUYV+l0nG:enn.e轶.Xjv0Cn}]/ť|Q#'1~ GQQ.YBS{E|u݂\NT BDF?ԸW^<%xx_8TNAe<*8 WǨ;1p\(CW2$ߍ۵J^x-ßƵ<e!5=N`+AmD|[]]mK0糙- 'dɚ3+u 4|ߐ}3m#ڰCV+0!GFV%-Ħ.ëRena}2f }W O@\35\oS]/_u2`s'L[;ʚ|Sm+8bO5?g--3?|~ ofp,)ŵMVt"vf^xMۣOb6?wB7Ñ,ީte4yxL!I'fAgE%ϼ1#PlctM$3?(p!p @^= w *416f6kJwAjDn iHtA*arc `l8mrnPB˿ODe'deeF"6K'OD~*ucBW9a#h`ڼx7o-րCv6Q0OM!(0iEǴlf.^;+Uߧ+cO?yer3r/jn9?LJ[θ*7Sщ94 $ڴ= 9TaB Ӗ z`4V<tㅭ"bI.P.=~&8pa6W?ܓ;*O~$  4l'G]i@`ϱEknA䤋h#k#-82VZ[,xA): obI@;08HMKO3*W'-fW{@6]^^HђZV;o8tYY;;;sEǜ3})S:OҰ:L@t#hi l\[JorD1X3D >U+^K/^4/ҠO[Lwl}zqi뀯AkdirJ"wy:iyo97^7wVDK]rr+CRgżR Pxo &K#宲GW<NjT2ԫndC|-|=jo݌Ϸ"bE>X2M:0H"[5tH@|\`ʶc;e>6HR_}]*]uX i t{B4p_4RKVlؼ9"U8.nϮHrtk3WtN#G|a2+՟3vAvCJ5b] xpρ{éo˜ØMD."&')֬cE݊i ~2",|qvA^hn!b4x@)@'Gg/տ $nZ]Yɹw92jC]*JݨW9.(wc>p )(TXowp7fLJC.XXӋa cbbhEyh vhd4?ج 7O~Rz/_= vFw%piW^ 1UR8Xk::e3D %̺ 2_\SSS104=c5_?؞$/A3ᅹOɊ' 0jhӋc5OM7'7wMK!)KyWf)%gNbץaQa84 bѧ귴Ѭ58t-Lehht`/Z yTU]>4 F"ƚ;OssfYHaH̐DMY7rd೑މ9e˷I`F-oϟ84`6'HMκ㶱$<BhCt/av n4Y<2*H@r4%&s4/3]j/?ExE':]"xY@_R)'yS|" ه_Wwy]_Vt,*k_~{eY/G\ߖ?kZW4>0eT$?ӬM˚>y#_9Ǭ\$2Q1v^f6Ϭ/e5M:Z)|J^B\=YPk[Ƣח dTj #bXcDDgCM^A7nYXYaDjUoQ;;[4Ε]3Y&&:>פ?xI;@ p8Ɔwj'; _r{7M&5dɇV>xL׈&Y"grUQ Kv6Օ`r1xb̬=NҒm6vɁ(tiޡ|xZݕ蔔AuCm!dy`na56|Q놬RӄuPȨ!V=YŴ'9T,}!eΣ):썃N 'nnlHK RXwЉYr?tl3|2+x"͛ITEtZm޾}rwfd܀nMp9_? :YuDB (5,%j-bZIOi1' *gEY"$DKLˣIɱQ^Q1̰AK؈A s&XfcmРs|CFelhzJ ]5h_;^`5y~%nt vS?cq .&&ˋ}<^ ޾^w9L[o:lR6lYKiHMݗ-č"$R_V[[sQYOqlIf4 YS(Ψy']bRةy7MMJvx0XFe3Gݏj; [S(0-<Dwɾf7rPŘKD8Rǡصr$'6N-s9C68F"a Jso۶PV~=e* 9CE ݹ}'w5 EK^c_ceKsHYgԌzoI[UQګz:F})>gF Aݳ% |FFFVWWkvV  >AGNKz#| OMiO::T]8SAO3`Lx 8x7Cs: 9[=BPSQa("Yz::;Q6e`V@է[.{G*NMcWM9\\")4f-ƛcc>%aH:B%K䝩Lq~ƚ=+r;7g,y RwNHG=$N㎿=}{Ɋ:d]v"K\]b$ͣ,`MvmQGPyp tOFjQ-e".58O0@ }WdȏBΦ6օt0L466 [+6x('/0պuRj(OȦREz|WB>uD%qZzktTuua>#r`Y.A0ӱW5_;TWNΩ+b;:I>&ja*׿$^TVi-غwflmѨwKK C{fB$:=KFoK&Zϳx*5kpwD5n@{J5+(HUU/]|XG;?;0FRB"ɩc6vьDNpKŋz ebl׻BWX1 fea1Q#x$,"$[ŏ 3 ),2"BBlFyLd^)4WK33=6G~C_ ڪ+Xݹ3!\Z6D2Cw 21G:ÊZe.\PUPm#JD(qRϕmz?dϠ(' NBzvS'[dS 1UjgV *DwV {f4r?@MfIp̽ &SOţqA3y;Yq`)Dp:e؏Vo}\13ƇF;W./.j^[N ' K W$&"o/3CMSϳ鮱c5NRN߾]Ƭ2(SR*c#%):.~QxP:*k֩ 4څ5"5-I9۟ϵk $N fvOzƈx YusŴY ;#>MIMpH{j|гJZLdun讇]&*dX (D}64*RojđL@VW )dž Lsn`*Uhxfc\DQm?i%6z@BꏦSuc;:>vxCGEE(jᮝ;fs5Lww[ۭ3؉/y"R^5owO)D&[= 4{QR Y&z|҇f:i9} r?ptrx8՗W/3\TҏoS^WmjlɫId9n^s5rQ.Dl-ғA?LM}#&nϾ>kc=7\c%%珮;,"G51;5f>5tF2Ĭ9,FC?Сf.6Z 2/di$,s聂[3Z'sYձ4 RΉг=rD#^-F&x.ϲ t=2ظ+OWWۇ'r ;8_H Y[&"zgEGahhx[uK_3ޙ 4_loޭ/VOML%^Қ_i˜amt}&Z۷oW 흧*J{<[z/mrDhDiSV$8C{(s, BϷ_i/*%1:qoonUmE,8Wn<ĨBˈ| i]^_$1B(|W RT`>t!`B~6]V [ ]w<Qs7JyW^yaVG4o]o8@T@D+~D >Wũ܀;}xMؑ-tɼP$I\ZZy/</8h{)aMlq} eJv2Xe7} VoΠ#H=A<ϻ<9uu.绝y_ó)AZ)1&ׯ__nHC4d$-Ijzsڋ#{K/{kKj/ށtyh9 2_X2Љ{2IHD9W@Nʮreo:mp5^S`ԃ IW>;PPE\h꺊puIphDlD+~[̳:'>4_v6үߊrSgD2rK*)X:V;AH"uw=V `x,DhB5uN @"kZ_0#Nj/1&l7*7эo |VO"3};# {G i16ɮ婁nd>~#,={FII(9@~18MFȥYNM 7IE3\AlMk%Z7˩EPQgo/ zH&\dq}ʶ5`*˵9Uy1&[sAҐt%Ó BVjx;.|zqŌW?a,/g4BF6[999SSS{>|B7=)ۍөf3'>wQHJH741Gwgc,.R]Fkh@ʊjwpaROw7 pOKQ da%'c(1Z*-ڠ^ b3I– Ag\w`!Vy3i3В5BY?v-'ʛijTusp_&%&^z-Kw OX-.q F 2Ǐmm/r #~ɒaPͭ\'爸˸4ׂ' LgKQ߿aI@P|ي 3B:e l~UӁZĸ&U%unVg91t QG2Lу+?p;mMS;=u ɿ-iN[dR7u?(L|Ox=ˣ`43Ovc%=mRd2W8]ҁvFu1ѠAW#9 6 𖚺iQ6V!:O< $Rj?DGGTo-2;C)ڤORdY;yQ*LZ/W'/;Ne2>kO+vg.@:<Zkd$cctFV=|3R9d0npOB_b#{`!<Ï~"iX4IsΠ%u?.y}}8\/F۬UUULIRW;ߢ{ʙ&/_4IJGZ:!#&sYk&^}LfSQ[&֖ؗ **wHP_+0+w]S.ɐ''_/Z"S|Qk>0k*+P9xWۭ':gKnYoIH%ly.)oHW!"5d`zF,aY_C.SiL^-7񣀈H)[KKXh`!q_Ҋa11>>1P7r/C>zSf'2 N|z&bocϱD7 ^ldr@ņqpesa2Q` V,^?bEae;[~ѭ<2F;?JW6i)偌=^NNN_Yk,_np}s"˳lYiDNSQXx3ft0L7 ـ ;ɴ uc8Nc$omee,}Uboߥ~! uSVb>B,|QY30ۀk%z̍.^$)]it[_|G/~zVE3} kʓ! E1XT g Ϋ7O-ID"6mLeNew\ RlADx,y'SV/a]% |,lne GlN.100LrLȸtݯBɿ~`AY9`B5JmRd"W*-E(|f^dKTeŮE8Ӷ x+!d9}:"…0u.8A-\'zuX鑆d/|%%?{A/pl#>>7 .999hro>S&;<Ͷ#1?mS׻U{ lq4%t@EK] 7!rܗlrƴsw*on|j_M^6򱻸ONp~K]}h;@KUV P)+N7mհb?_"@Pg[(}Ĕ$k۳ mpqe\ v ?Lp߀SJ 8*\jE9N:i܏M&"F9ȌRMp###ͧJJ1KIH*^%O\FA^*9(rhm%㾽!_+n6IQ FJJeffƌ= ֌J5I@o ^I{|1pr=֔=Q538ܨn]!vYVr3cp h\ 4RV`!16 bAGB+# .};/ ]$BʢF$ԝJO}E$]GlwX,~ 0%L:s;mzࡵgHe5 jFu! %K6,-Aw,TR ^hh(c&cpd$/>H!HXvg']e 2jh 9X|Ԟ 3P_d Q9pj׶gMAekXفo^4_|%:frӰoQOw-GI˂\I.֫2H!l/=tEgb˓ʌހ p5-oEHHZ -҃Cz 284T_VBjbn #&i'Pkckm~l~=[kKJ,EKx$KtKaSn FdHᶗe6$Jz7AlC*8v(7/O i L ݤUeËi-ZTQg$So;ƜTߖ⋞!mY@6\Jr;8͈ q`Y0%[ؽL A2b³j%)K. >?=F5r(@+owO)8)ũw52"ܽaЂdm-diY?珻0O\YYy7=Sɟedߑ1%},>2^m^l4GʀVkطX?9j(:\a*NЖ82]\ ى6:@qxj1;1ݟ/yPo H7GS:Ig}8Z^qr@$l3%ѳE-IuM]MR+A!\y4ӛ_gV}Orp$%!)i &GK9a %_ef imMq\+J04rt,`wZ*d8~#ڪLhFr[!c҇*nLH-玑Q~AhaEQ 6񅻍-/NO$~vUt*dtP0+*On7/s̟lAoxRQc CI~c}|Yi(>މ?#9Ӯ9A sGv&B,{O>wqR\nc?yFu,+qMWWw gd`%;k[ɢ,>m*yV(C!B!QD)y2Ŭݺ~ {H̝a_< B~SSH$>}EEJxҩ U<Ņ3̎^A@;1Pb?Rܙͥ?=%֗Fb> y2J)٫P35­amf O+%?Y% jБQB]UZǸxBڠ=MNkё* ڍ/iex.~Թ엀tn߾}Pu k777OOϖhn]|iv<^81il<:=ag7g.OMRTT\Y]2Wr-}qO Y;9 1TE͹B`LG3EY⥥ouE *uuul@JG)CN=AiUL ͞W#]? /, /$|b?? ڀ?ǻT/({yWlw?K+Ͷ𯻻l#| šetK cFMntSn!/OyO?{F޽Ŀt?)|B">q߯tSq ?Wifׅ_9dy| :#s2:*,Z˒C=Z%6"`F˯sobhg8w{w,E%Δ)vY|QX%Acdd^dd/k#6À gF@X=0eFהkޘF0 lVIt5tu F~[ XZ*r [F^=ssfj9=caU0OQ% ^SRXbZ&\+]]]r󩩩%PR45kk4Yzx-|ƛ5쳱v-:{Rr?쇖)dFC 10 "&bD{de;Yy ͗x=-Am(IǽzR');Zxk }aNZ.vۢ1R+Y^0Z ' Na,QKFgQ;1Ec=X /`IFZNq0.,9k&tA(t3a+C=IӺ햖pۦa,o g/4[g俼Gˌ|WkN$4nr3(wVY k(7jaqYG Nޫ555YWZAeq 1AUV"'9nWY~TRvI;twp;*tgоmCC>>5-0 cvԩp1 PT j\kjϼ2b+.5TVM8Wm$U˳ֽH>TƫOFzD`+@_K5@|x%tW`!v4*>hGx }~ u .j0+'Mu,u2!I Aς>oԌ[$6Udz!Ns41}&M8$?BGbt >I-G8@*Fx2׽a`P*0%iRvi ;=ag Lb޺t_CG ߘ0:fGf՝^hK?~;|T'`s-%%%7<<ZMs&sxsεŵo|ۭ؁JsS#1-V~ŧ[C,8;N^ ; 7DTiL@ȏ=%%]6#chrxY/ KgQAV 22^mll鬢Zt{=X5bXF,dO$q7CLP}5m9%)ixI'@]?bB Ҝ?t.|GDZ}S^voOFd@2aHCQ+lhVD~I//{ )p0]?\ ~R{_ku 6:XX]q+@./2+j+ W6ѣ9Fljqљ(d*xcux:-:&D,.ge$Yb+*$eddde?dt~j>]^]]Tu-b_;ľፚ"޻Fvf~, ϾXS ` +Zݞl~fF.P+[K'/1{f`_gxǼmDPC2%Eŧ \]];*uND{)̀ DR- 4PlEu36I-cuehS';݆fMV JY+H v!T reelŒf%Ft1Tmc*f19ֺ2p@0NnKVӄwaHg8e#3(_G_YY>hoI]4sT^nN&Y}).*@GRT&!M(F~i>+ B7Lg/wZ&!*,DGΊC$w)tmY-W7`UwXPrOGGw =Sch?hORK~[%̷ ]Yi|LCl;3:Ń4o-݈'8C1 :Fsppuv6LڮWxCγXqqq>0ӆ}8m rTHZqLp¯6n(u?`$F_o^ecRFj~S$GgK%2ոlYcV-M0XLMتoܗ`{M9}7^4?wJ:XH( U88eCo%|𾆴͋)RM.`z,aRW!4|A`_bn.̜-ShV`Ά?x ւӈ2eBN<=\DV;:kBhGk`g V>!dHۧO7:э*] fQ>`a :VO^ukI T%cҙ-sH<[=70$2\uƌy66gU87oGlIU4]Ae7DEs0wlCcy}< Qm3sO>6_9<J>QNá7~n"5-P7Wc^&tutghN AiboAuF6++fG,Ve [pr7TGO(r #kj6.I߅1hN-[SWSZ&(T.0n\d|^VWEFaFֵ]q>=V283$ /N>lbaq}+,ղAq;kxD5Z zt*UjM%l\Yюeb )xkoB}3HpAP h!8**ʄ/F U9؁X_%qE&c ߼LO{3h2ibeN{嬍-&)Cc+1B}PH ȟ]nϼ^q$]St6ۭg}YI]>۹PznW&_{˾'ִNfξ;Y⿜Mkwa_{ ?G(5jpHFYm©W3%{T<}lőkU:Z!GٶT翰g*^-uK6UIRyt{э #, ^V\# HSŗrQQȩs [vjV#us kLk;={^آΓƸe` 4}I Z *AңP1t ӂjء,$!}[G!ه* `0_4,zܸ|?3%}|EԤk׮A-c&b @MN]p$k\b"= McfM: 1"O;G) Z]i]#顡!&ih)8k!Qjm:_bN列ُΟno::ߡp(/zv.w.\I}`sDܛӥ gJjK>DJJob2IAAAJcm!Ӻ5On߾zMc:b9 u閜pVRm}EFY|6#X²rqiYYq*'ަ*GVdfOFkk1sOM5~UF(IDed |#S5͇n~bzX)#I%Z [ǡW۞l^GC"c*I-)3`>HdKX4p:B>Lj痑$kևM9MaO81naL6f\*`+z`,牉 صSrPkrx=0 v3Z[PSk.- 啕e"+ٙ_ޝ쾾߫}y,u*\sɩ=Io.saOGAe\]SBig%=b766R\XBT(54#S3"!zw}/!8O.]Ƭ{,hzĘ70񬂿>ޙ}LᙛH C ĉ[ϟ͋ɗ"9ԡ&>E̲pTRjݙvnqr'peAH &u dFYo|x[;;²'0e6;HY mhPC̫:J[ccYFvl}Chuqbz&_FPE*fih7ƙ6PwS 'p5Mbgxhۈ2TsBS&ʳSRRN=hi*m GSxּ̕\ZJ{ bxæ4t1u\)_^KxOHM<qsH[PAklЄ`n&s`> cר}]sW+i,58S[[{\eS27Cp:g> mg-ѡ\Q2p'yzNz"Ά2Ű_rQp^x}ƗT+GdY hW|BWw(WLjo! #'ظC>}XFc2xb켼 ]@ۄ+3*쑸ׯKmȿx]NJN DL}N3@}6g>ZS9@~teꓩH?t Xoe(w {)Աf~N.ڏ8cH]V >|x* m}lhiq(f~ v^?n=L7] =&p'a__3swsڃO)*&߻_cl3g@G~O!v\bn51!mkٟ qLD21~21LXebe"'m#LX_K m uCRZ\@{&AYO"? H2h_vme-.tЖe>/2K:m "K-(S&R:?-,(7/ ofǚ*/G0K{F/n\zRڷh(|m9 e#̓{ocϽ7Hwa:=#&9֐RRB}0yOfHߑ`F}$}=߷&@2 Eo@(`$.!1hl||$pDpM@y3(' 9' 1HRJjgHHHpϿQẝӃx/.Zp˴,#%irӽ'el/* ք(իP p-(8J(Mu@-}ki@L]Qb `YbIE,ߴg42zc*OZҋmOpɮnEJڌI RiW )RS,s=]牙yxJmƬ1ftZ<{  ٰ7X/H_f>WN cbi+Ny0IUđYCs2EfsN۠3oZxM:P+b%k$`e)IW"W]Q5Wy0Ȇ*-C|=\sõ?Dl}BБd%*xhHR՛zƺՙ1_XٍO$o|߷aegQ$Yx^JI-˅k~%պ(F= ?tr5SEpZN|98l[RW?=i{-FL۟(#@Y_@~x&j ڀR,g`C:&kV2W hscuA}er(#(p+£Hz9>֎Nn vF\-\Ģ\+ۿV8Yf?jk_?ImF^ 3g8saoa88' # mC>qlj LA,S>\ɡ%Teu?' 0 (^j:n0(r~~PP4gØL$:(/bMbgUGe_U<boqu꣰ ΰ,5nvS3Tc@d>#1,tC1 8@DHN,3t xF̣Mn=Nl.kJ)>= 7w [qGPhF31#iᦪUPf;M J(=]I<:Z,> z] c- AyfހM:& (j_:w+8cPž9 }KuwN_ԫgbasa@u@ǴLMxO$@\ <L1 Pқt͋}uP^6~Ԅv4M::Esns]g_p37pND?^,|ڵp*ɜtq;ZE2۹pm:X`'i-/|w:z2ɀj'x6WXkI|zIb]|2ȥġ!V//Commm%#S͚ jI?9KX4IrSOt#~.R4!e[FL /A t򂡥fֳޙ' e?kߢE/خGHԀI!#!`Io ٶǃВ}r,pc&Ie[ַEy7~jGIm~3dF]^v_t^pi))$Q\OSS9R6(84ό,t,?d{ u2e-;sT)HWW`PO 0 n?~fFSDlk0|46j_$' aP*m Ȝ֑o3N&&Cwr])G*@O䙈h8+l ( b,9$261.rB]^GhYתm9w Qj4]ď;qx_W~w(h&;3KfQ\S^x(6k>ᓽ}}eV,mU)K%2G:0$?$v A`{nᡢgxee$ni[KjrXyurz޾-kGظg#M>\-GȤa ]g鴄9hm߬=D貵q޵*?ٲ!C ͖%x]{{dD۟ g'!-6t[XY3 7}eCvn^`êM-҇ n_BO /&Ym(ma% EyxPj/omhιt7xoYtmâDOG,m[݆(-*F$a?6__QZMef#2V{iw!d؉mINE᰿#~cVf=^Ѱ6/[qbs[b;$n)$q~z}hhꍚM57;428!/eȕGl_B1 8E0)?ћCEVϔ8X\1#Ioo{L*C.OG ىJU[.C:LR64)F{>ղXm׽d&[ԽDZk=dd+o];ÐE@9{GUmWZLml.qC3 :H'''ggmKf#,9=NKw|?i㓔y*:Ol7`p_YL^I]R!e8r9ZAA!JA=νkZ 8_px}D^=`RiIO8rtYx)ɑ\I$}R;X$鴙ji}tqͲoɛXܽ!͡AJJJ2+].zA) NRLdčpMNH͜]X]-#,,,*g<\rI -nVF&^ZKtYw+4[闓I=}iD2ӧOGrl;oiQ?/[UbbJ+ȡu%$8V7Q@ٚ١t(s)^c~_gYdoXr4L9/+L?ٹ2 Rx| fϗHsҕ(bFGՈD˗|BB/U_:ZGL{ff k6n{yLj?k-|Y{ӞkC/q`/#MMf OSؠpc]]Ƨ W 5ۿW>/};$>6`6egCb_+W r)Heu PTAW\= m~iܶ>Zʡs 2 }).|J\Ӹ8Û Z`}kd%ݖcG9F䆤 xDED؏1~/ CɚM6V}#׻Փx[Vͯ)ZPOスߗ='>| ,[+Ty,fk/݃# ^[&9Pl@%Or\e¢VFyyJɨ?ٽt8pv=59\JJJ$iD$L&-QXXS|XY)b6jw%6]mD1KGSpB3Z9őx rrLM&a))j,[ovCMMzjZT $_;y@O([ ~}Ǝ5% 'Li<iݍ٨=* tKφ0Q:KYk}t m WqSSS Ucaw܊zL柗ؾ2^,QInO}CFHp"Nؘb=.mpcinH@t U~?ZSe^pKC&)*]Be${KHHLo)#>ӗ9+R^ĽQ|f t 7emƊ,(R:R *MDRA6*Ez.@EN-B_+}_=>Yggf;Y̋lgTP?$ _]䓸vpH @ %8O>+RGI ;Ѹ,aJt$nYM;ʎ{_H_W_U_PKA_DQK܏7D෨~ߕB/FJ{-GR¿*@c "[o`o;B?_%hGR⿕:#- -6GW:_qD5GgOD,%|Wt#<5^uLXc2/Yw>ra$6OȈ9eٓgn¸i|x]U[ml-.K7 RBE瞗^1M$KI<[Ks&"#&@""'[ܻqcյ]^?2ظZ "W2 :;V7$H:})))ם*G4x^^^mm}nCZbQK"{"BVVT6i%*?2`~ghDZF~8FʳY* NT 5uh@Aw=m=H>A,VRXdkfssk{VopFKwQnr_Ro/q b055=Q,u~}$~~^n\+ݚݻ{U qh YjٓX~I86}|&M\9#V}EƉï?_3.~3&Vlmcq"[]7Kʚ $Qh1+6Ң+Cpݼ93pŧSw*qVԦ  LV b!qzAGQE碍SĴcf)mo/o}\}yb7W:3r``y2*\OOwfI700Dy~yG5 r#],'"6T|ork&yښkG>eÆ X]-wU[=#wOPrno3h%t7,6Zkk]  p.Վ)rA[\cWWf CݎpRXF&D$E{q.`kKغ_Ԗ2i#Hp8GQhӓ_Τ~dfǞ\ /Wk>X*>irֶ4đvY ;Hq]<9uE+j"%eGUsvC g03rȃ6}a9}?߿_ĺXH8=\?wjz:[Xڰmmpmƙ4'bef$b5xPP>]0>cXnFƭ#'`PX)=Q8, Ywʍj6 JN׏^ef7KuSQ})3Cɵ5 03Ҕ LJfAl<Œv_D"-.„b|ɒO|қ[4!&!ᴂݢ_eͅE? 6!olQTs"w^]pOk^鈿Ã'j2S'ndmRRc/AY}. G7>^Tvvv65_u!&2߰Pbjg3 ?aafn-p{0a|z;S>Kz#srsYGsHjcfhӓ,]EE߬]TC/IP6$W=;/&]#5_96xignu|S[]Pm2q! 5Э`M_"'xǺW,BU S-˷6f)|y$;0p~&1yɽ3"")esYrHl"'+< !'AqcF5X@a@|HV?ZZB(9qzz>EK^ -o);P)V&o╍޿}+eh}{~硻CݼC`:"ƙk70d^5*C7[&%tȽ@~(GFLlWDG \q،:(>S[s8Kw!׿ٖ066kI+]քkI'`p2^oVC븺~L@OzMneA6s`kk䖠TKdT굛ZJZ5p\95Nߣsqq@_0k(UL D8>>V4X^C?W0=\\¡{E&Z݉"`]:6cZO_B4-azr4E|f!hg|k)ocIe]^lrlp[=vaA`PyI׃[ o`s'۫XX]?5s!#$ߣON0>=?zVcѲ͙ZP-f !)7X.) H& .^z4.**8P W\k^޼U!>.g*=!! Gm[utfS}wt cH @l ήE9A_ג1l7 `cW_b_({KP6clN\",U؆p)y(3wW^ MlJ z?eDzO$:}D7M׮-$ unt*[Zl<`e M3+=R#%q]bu^t !V4>#^r67)bP n!RM CNVVUEG*ߺ$+a=߷4WjziS4fw?mªQ(c$RE_ʂGSlgAl L @B 08lĀm:h݋=⑽ [n3\%(8cC:JbԈv_ V"~OseTD<_"$/NsOmaJ[̀Ȗ3GƯ,AnBZ5?!OXЃ4~k(<#l.`E]08 ;}WEA_aZyS^5Z$=ђɸv^<' ''ȗqlf2AkUCXJBt{H}+[aጃ׊1KU toSX:rz DYI4*:cAl?b?# =>vV9mU}5R᫴ 4'ySE~gX-y :֫&^xdHYk 1 j8O_=xzɀC֗8>S< X^@CzTy=9Zd)b" bhT@ȥhz\@ĝqªIeC1ּ`:~N܈t^n&roxNі@#X abA>y+SSIES6~3E[yZǦN\)xEzw g6jQ8*(XTT@dn_<6qP{o.ּ*ڦ{xS6"E{6T[(  8* BPFܒSG.!aXZjgUhn8\>ײŘҋ~xz?5h}٭&S~">љ 4t{oE졓Sd;_` a:R8h7.%gO$X`en+Un۲t4ᚵ) F1R[ޭ19# []+,ۏO~8KY"1;$丶 1wV9C/>/Y#=E%!{mp999qG#gYu%Kzz G5.Rhm©Szr3+/}Mq%c(n$%MZ\tP$=z4cӐ*4Ӿ8W `l(u βInz7H4}Qƞ]rcѢ .,#6UU 3;5(y$f}=Ω9 .)ѝ6-vbv@K ӅUg%|q>Y"'dmɖn9^h)C}+J%&Bs͘1NV4˟?Wb+/D r6nO.0 ڈ  P8ޥ?YSP0Rf1z뒻L&`GdѤ=YYYSS[߼( {ĠlW!VqzvAZ$kž={J>2̻/3VC xxgIXK e[/++[u,r}t? Ed2US4ԥTbkǤb1hW43[']U Ʒ*ǝ;"Kb{GA_*,4'+5]wb6-ϔ45pU*H68<˞U#қkV_eE׈NϫѲEM1U)3 ] 0 "ؤ+ z. ҥn}0b>:!b  H2;0GTXnb*CtR}HݛJvaU~}ln +R1eP TΞ4=it$Pwk@a&x-_|xF#9ϿК+qlsmLi֚,jo^ax]F|<4G֏O/iE_ZL9#S_~bX}AS_K NZ{)3- S6[*(;Cufgz%N/ 9i"Шcit:Xd cM釪\lL ---66^.] J:ϟܸky MYU2upcfFV+W|݌n^_Yͧ܌ f_TTTZ܃ _/]664-9H!.23l^ JQ^FDl0:ۓk5c[FQOǪV3ڔoiRM֫B3WnbczڲKK (]/B+:1OW}cY$؝Bvۜ_kEEEݯ@ [vcZ +*9^MxN? qXpe]778Q˙EÖy,HD#lwksRO<aee[!i7՞+jtP7_b'Z)Fumk,wv 38jz^s`HHG'edX8::NWl%8kYL1/++ 77#*ޞpdh̄>+,, $?*zO]AbR0\\Ff&/owW/Yآ|=v,d9p0)^ĚĖK- 1|ZpKy_a%͵%D xNJJM {FMe׆(aӑG6-*A!4ӝ Ѿ7)ByPdgъ~jjIuuu+ϴI"tw-ԯ}H DDQ] <]_`U09t4H)g:RT$GXri^B Lƭ t?[HySϤǴ5'ݢ]X/'0_m]y Φ ;!7 N~551@Qś؃A/oQﻘ$V "AɅv,:GD f6~65PDxW(K3-fXٮS ed&,qȦÇ/*3 Z;d3_'=Ɯ<HmƲ7.! !iZ{x1_֭M^c.Y DŽ_A`OS[<3%H2Czvv`aWW`s\AF o @Ra7@8]s-kfËn8JQV3 ȑA.;#Y%j}F|4p>{yyy???"0MwtPLٛ72Vzkkk4RWݹ-kF_`DGS`fs_l H?$ nLU`=) HĒ t[ĠH:?[~mр%c ڣi;_'[%`n+JJJܧ3߽:3ΰRUbM<<:ɧS[pYl 7`C܋ wmn<.noD,gB3l=g ڍ_d@+ h1:鏊{-0t z)DOj*BWBjpO?l1E>4">#2/,`jk&J}2~m<"HCwI[Aw=@CƖ!2sFD,4'UL7&]hPPDJb.i@jmq5aG}`eAhm Эd K;TƐ?{Qoc{D!ΩSӾ@Y nՇq>܈ EA;oƸB+t&yHD <;Dν2!˅:͛Q$?@!DN*;3'JQ]{)Ɩ6$COo7uUN^,45{6g͠+s q{:ZޤC]ڡAHe4:TAEuL/ .Kژ\,%30H$y%\Xq'BܹÝ2}゚w!xPbpMo8.eEdkkud.y+1Z_l?@:7`lCEDGG_SYg-mXg0a ?8`dfnqڶ%[ Dz n֬ 9o S؜ \Ғr;O:|P|_~q_tcxIS33GBi525A[u;d)!ˤnn4i{]08p= #%s_xSj%ib"RQۏoߎ>B4c&*mOהso~.`,+;He}#"$.ݕq@5|/?uCVڞ}6Q^eJIIX˂vc8GYY"6X&΃Q0e))&66Ve99J便|< KX;Q;oE`Pܼ,E^sZQDTNQEŃӻ4񃝝o%aNͥ]0jνĘb{#:en+84gb$HL{sҕ桶`YJSDg'* oXo~oa?_z9S 9/[*{d S*,[)oR,,9[^qɅ+srRɅA{^ \@rSf!7G&9D䔣 ]BAOs /(W<ִ_Paub?.7Q4sr9Zn(Sos|6VӇܙH逳wF⏦h; ZƊ|jnjQZiڀD'юva\݄6fF;zm17?1DB w1c *#Tm䊊r8 ̭%>vs9  Kh@7tNSM;>|فޒ@G-:'>ВȞ !tqZLsp"Գ\1i?դ/n|ϔ==spܜA- ;ט#mkuS涋V|\Fw.oLwg"/h9 0o"|0`5Y!s?JůyIco|\\̷gu)VHVxI@ۮBU-SP]ZkygOL{B Ԛj27=skE+"B[0x=̬յ_\SSE>dZ߿ y@#0čEQbj*= ㅐ~cФ($CXIѩ<<Gw]mmr.!%kU-lANI]x*y-09d4lJ _`R9s/=@pe])gFnK[yTt .VK¨?_j)h{ P60tsQtυq]Uة)sZArQr_>~}X%<. o#XgW ZTMhUfO95ѢYÄ xXtuG:Sɧ }cv ORVV6't?Jo'F?{7 te'xqϩj+M_va?(ڥ 7AgdL/Ou]8n[dklG^;C}B["$Pddliafi :\`n%riIUOޛ;_TԙN),*T˲}B.`mrr5^{{N03Rdy`ߋ=.s`1ۇ.H:(lo5\+|*FmETZ|c}"R˴]e ;X g]Q asvOS-LHyiaXLKC~=MM/_XD/àu2.`g8~(89O1W~7C$Le)!PDR'WBk©SWG8ař`ɓ4KK1xěD1b^lz< KOաR`:GƔc`$ v~ Ô~86F,nM^p,͎bWt{Y "$Cmff q2 ]6Ԍa8;KW%OR|%0S9D{rQ> ́_ꌫ(={vxdnO5 DgV/PiMa9{6:̜F&&3gV76a"(1]nKKK ^ _剔"L=`$x}wZ_Uz`3+jϟ?h: 7Iq,w#8Zvd `1VflMnDIM˓̇YQoGoܝL4&``Ls؁ԄT[CZ˰`{2FMp \q(WX> ,4%kG @CQ( v6yRԱ0^.ݡ2La:?\>y=6\^(W-b^{ %(p%~y٥cq+?D}2 Fcw(uԋ^1))kS7pqh)BT/6f9bw飽'# Kde}MB®BI`/s,\y"MWǗPE&9z!e@;|A}h?̫Izz*fBVؠ)3s(=@nbm}rawF#<<ojjBV _9G٪.;a}oő&K'|'KѮ !uCCA8(|"A.ZBbH@= S:sx "l0AlsgCpyNs )"<ͩ^Q uSfgDBTO(vLJc]]]zwd5}6w~՘Ʊ6/]WcuItt6--q戛d5V~(ԖET RRRSnS8Ad:1ũ֯;뇒;Sh@~Q9cI2AK}nLlTTZjN2$}5lC+jQ)`Q.*A_4Ȉ7AF2ETTTz>zX0^/v#fK7...0=:J<+jŒ~}D 80x" _sH9$/,1..Ƨ{B]9C1-eQ)(׌ur]pAkvl-zXĬ`),t|H+3;CD\fƂ a:1(V7!|bڑQW+*w&5< L\U2!xSԎagP`ۘÐE$GkkEζb0B1PaaNHWzFZga8gia ۲ |ꙕ 2A?L~nL|kj % HmHQ[. qKISaܠTZy;vw|F}y?Rvl؎)99,ML&+YkJ%n=UCfb|Zbu: 5SMY99ݩ:3DR(᝗2JlTU`]#/cuOlKg)iS6!W}܊1@v ]/᣶c"#Wc\O$.6 z ڀ5A&~ߌOI cqtr Z(8v9h  VbL@PaPREW iUvCWPF$75 "hCĔvLK@kCy Y8߂y@GnP`+P;Sh E)cqȩ]O1K@>ʭgzÉGE YY{B7}?zq$7@ 0pG<(&.-_0/C淉zt ~)K;TT(^`B$= ]wA8Q#'BnϿ {aq/_T---( [|D^^``n7Z|^\Pė<\f/? ?rD6B:YA:zd:gK-\W ֋ g_=.Ye'1B䆂L拻ƒ)I[Sg?4Ur豗_86:FJ":&=yOK)zH ޜHh qq@O ,J91]愡%jVVzljejc)mGO>/quW==Re0K_ 88ϡA2D@<~d Aգ0{NwILIYtnުHkjW:nH=[Q#rAִ%S5 nAӋ)ӱȎ2Zjl:54T'vH$ V o^nTZZp#XCt4\]ݕҕpf`X83=+zɆ(6̬Ԏ3ԛ=׀g]$=D"Gh[=bAIll굞tՍņ40ĦmtQTX`¨s`"6Y!Q<'b Q;2O!++P0q{0%^j%as th ;QtzC6/_I|>O:)*Nđ_9fZ%2X,8"2fPᮝ5w4*.>1e pA{LUvn"`km&6ϯ˖6f9Se$l>P \OܲM ~Wī<dWG5 UcĻrbb.+K1x 'QH&$zB`aJKL+ZIAv 6N[O GEiAz&Ȳ%ʍWԥkMfkQ{s(!~z+'E p! ?E.^s2~El^ m,}JQ)V0)O١uj{gL̷t89=NgɸlXJjas)*se{fM; N=^ Q l֦9-,R;W:CxɎJ-H)q .@֕ZB]k:) voi ^űmC,$K"A[٩q Ϸ}z*,{A4V$VF3gN"捂:c* Ъu!mi]fPG375P*gܜ0k-$8y҄`a]ilh7qŧ2WJ,lLYb:~1oMogn}(*2C5>Kds+8.?oN VࢻA[M-W*ּ-ءG(D(z76eLĕ6e=& kpc o &4hO) ӊg5,aW|([eO['O8k֨qS+*pPw?oo)f:,ǘhsnrϔ39.!*e"( (Ky|ƞ'k@1&mM\d0.a,Ϧx^mGY###.6T ?*n30 SW@fzzF#wkmpju'ON.}hW䳼5cz Aa9=5Ia.-9XlL?`Vғ1czmYnѠ-9CqbeܞQ$yYI+0srҨHML98S9[lvzDd'i`XK{}O6$ER] WȤF[M V6NNv*kG;+/ƉUh'ڒ}[cEm3 r6%G@́d˽_۽囗;ELVơ^v᠗Gl6eLdd\IlFՂ.g9=+x{MSuai~(hIfQgƉw7/:V Q"}i쑊~?v*(ơ(]qTDJ|]doKB E((?!?$OOZjeF7?~ʢIKAD@bO$F}$<͎&H4 '3י,sm$:d1UDYXTt2S f}Uu1 YbCy&1ʌTLwqlCbzﴱ]=(&Dunz~,ôp'RxId]my'6kF=HZ; OyL`Rs}M;z_ϞHR ojd}B0PK`vylqhgpך9ǫޱhg@?tܻ k8>+KR3rb++v]J=R[[{B}AG'|3b3ϻ]EHT||왚|o(lj%^h/Kū[kL&107'0&(ga[WlX\F.V^Ҫ -?cfssuebc-ڥѶa싹$*&1_Rs~GŞK4]V9rZL~z@xse.J`%V]558r#.!T:*~.Q*DSZ ͉Bsk2^v*p;IxX,}V m2AlUDwp7-1{SGZK W6HWer>@ ~uT&ü(իzG ިtؿsX3S'md3'&3Ӷnkߒ58Y'VH7eM=x-In^= V (kMcju-hb鴾+]P]Wצ1%ߓ,'@h&MůI`h׹UA37'=2TlnT0(q~br ~(|m4Pt0*&]Hfm&Ӌr܌4EE ['Ho,?ڬl XY'шn7~!)ݵJoj10 rp?V܎YwZ\o>453\j8"myxYW۰E; sY[I:ɖ4*Z O'4Zi{\)@ǿ`1en]K0ş" qۉ/Mfl+rmYbR &:hKӯmLzzLLu̝Y%\7˪ j48?Z7k4v/pUے{oe7~+J*{U}$k(%[l R-!RɞdcH={;3c?꺟y}q[cg n$:^ɛǙoSzVJ(:th݈ 3Ubb 4\^ZFSYb'PaVzo[pxӭ^'Ak(X? UVIv];wگ!Muf!h,:?҂[~*yGf7 3cg97:y!\<"rk35:k:fF@;OX @n^CApAE<:oUkiӪֲ7IT:Q^^)|ʿvvoDĬ}{q Y2a~VMi|]cf*GR*@?,p{t3fۋO: (0L(L?O6X%mEPg@jo(SSN@X Qϑ08} x269CCf}(=[~4fM/?dblh||IC_џ:)sBp 5W!]qX"bvDO0tW2OAwOwA)n|]a>= F;?nU}<JA2y\oREw-'l `[+^SwW(՚uAKVD($(v_e6as$HZl=+&z6}ֹ*yy ϥ#A>+Z)l@ƱK op0~V2сOX6d\GgrBĢ6uw̱A>6-L t~K_?,!ߴ74O8)6-~y Ͻ ,ƿ4\3;8h5 m k˾G> ̈́j44x[g=S"++KSSn }P\JК2˯vMvlٽjH+ HCGP[:˫tw?GJ}Ʈ(ީLt' W =&ް9=\Fl3Me>-[0 Z! aO#giP=z Q8;Հ|w/~|/NfĂw p@H7Ѳ7)ӛ2dXi ]ݞ׈B=oB# wlU\PE`]?[6φx8^d$$E3ՉX#`/,3)' ވZɱlʂQ@ D꜀U='i-_M$q2@V/ϋ! ~Vx{o2ʟzyA={rO=H۫E< e{}L J9AI&~ȿlhZ0\#0Qh۱)4A#K% )j@Wn+cEvEV5P< 6>`)'d&?awE/bjDZ;!&~Qi 5x$ebNTI RTt=n+q'H'>rh5[rbym66 !l*]Whp$\c0`'SBqqqq~&', 4x> JgKG# X`[c:>ٕOc AbU\.In)5 %SV!N7LO?v159L!JT$;Q+Nߥ__hD"M+(Z7z{ANn+,c]j<ϫj^xZRy>ZMYVubiPl`jUSF2Z],|Mw=d,AuO/~X@_vI.eߝsRȫ2*p "_ls'rK(efy p[7p'񆟊a ,\ ݤrc=t ,';rm/*8BΗt#;.GWnLPP$4.n0S0muFԻm#QY^^6(ߛEhdhi9~j=Llgz x#A#fd$$}/sMo߾QǾ[^ߐU߫ dT,k|{0}),ʓRh n3FJWd,=8HXy OWc1ߕَ=S,K qXd7H~^d4B;N̹*Sccc@vJb>v7[WaPz/EzT"|3׋&&*PYO+ͨPe_Pa> kߴ匋WTTT$-X1v;-m" @CM>Ӗ[&/`d/bC)X/)QڑH#'Vݗf^LP*S*6\Tc@:?R)C?-\rX;䲉vr~Vgڊ!`I}ӔY^ݼ5܇p|[5؎po;m-E.?( B B4܄b껻^6V2~v֔W*C.%|[ʱwLP--a7EP $$0'8t.(֡2[gB ܴ"rs|+Rt~~>kwsrr/ z4PU0#KkL/K^7Ӑρ{ բ{ =QqRvq㖵/x&Wj 訽Z]`cg1 q|E3ؤfr럆!qZ!S8'D84obn[,48x60GSC ۇK`ci"YQp^fiMN{V٫À],-m8q)))bueT= hOzU+w~ a- jSjO!Ɣ G@gDǭFy*\-켏'u5yrx?LѸtSfާOo4\FkOqЇ]zu-:!7uoѹ&8b*#M-p^k=߾@:bFi>ʭXYYPlJw)y U>\KN4*DW6xxirc*zcQΩ8SDlSFNřx$0]'C9GmRL~ABkkEDneu{ ddAPkڮtumvkPecDVrB^U 鮎۸ fq E.ML.9|/&|Շp "EwmhuQg]>Lfce/W,,hc&J}0uFcKmD"lx}uѧO?f_h}XZ{Rzɩ0⥱V %[st\ɬ57s.d|K?Z:J`Lʶ?d,87ɮ^m5f7kw(cyor Q_D. äPMFq++nNhqqEЅvFHBEBH $KㅙN/Cj[E{0T.?F ȪK \!rT~d^#^s>5d ~u11៟ gvٹkc ?/~G◫|_o$PʅG;{y*H*G;w~ {?۹ko]r~ % Ubdoy?Pf"59z%4zg>9q,;' ΞMd0맳FX"V;r | ErxWզ.9HKN)ae|ol  IHӹLrbee%'׶Si>* $vVM95ɊDhwèvAuDTvfoar?֦-ȓbػ\yѰZcY*}LqMuuuᾩsReaSGKa2gJAqwpvX:*gq47z{{KKKSS/,޸!$, ~iczvvًێeXϐ~덷 \Wp,-嗆 #Uh|66SU!C}rh5(.*KK 򫚚u^K+%[]^]w!typUCg_&̋WF{DV' <2m|ݦDo'|g+ }\ҟ8.5+_yRC ?v3*'JpL - XKJJrhnE7%1\?dǘ9wB[MGGV=A 77&T t+,] ~f(/T ~w\7F=)1{hQ??>m>L8qss3`/羯nO yzz꽀=>=ݔN}qĕi@zhfrI-]qIJo,Zdd*!Py@yk\,~!? ০lJ z#14UOhsA+_˂ؗ 'CXXNǶx0.9WXABE4_zzV'sFN׭&-.jg:̡EUx_᱗OMq4\rXzKE6&#T;GwBUBviaafV.l ^;,Zم>c{v\/R2vX_R>|Qun$AƓ'WsYz@&P0ya3ud &J2 վ"W!QQ Dۼ$R"V#777 3ŒT w0 ܬ;_9`N;Op*.I]_r ޶pv^lHӕ}#6j7xJ,@{DFO__z!ͩ@VݮZώd[kzG1̺ ]7<~󕕧G꙲2 >qNHzt:Wx59 '+Z6'yc9_Rkܗ_#iIiQ`а~QsCCKB>-mWRrrlb5rB!ɮGRPl|zi:jLjghgb|QkoWCז+NCb̮qJUOƌ.@nݺeXٛ>X-q]5cCNOcq1e5&D3cp1dЬIȈඓD X@g+qX˫r}sBomXYzŀOlY@,Thʚ@_3:߽-0~Pex[%*@=۬]q9 J D$#p+'@u,:s{MNkޜĦo޿cOBamێZp[Om/#c~WC+:ݻ,Ŗ;=tyrȑ./ɭ *ynڿid(1WgkzQ6CV{jԬPkOVpvdxnC x%n )QGo6 5 rxEg"~ںr!$_ e&{z%S3I_pW= xWx?3s -E(3Hp5L 佒dRUD4|! G6k^5޸[O ݾ+Y37]LqY phҗ5pZTELخgɂ=qNwqJ7V6y<GHg{ݍCp OA Ԓ(q1Y WZ:ws\'9 *ͱuH"gʹE'\FVF;K6C6,Cb܂+~ɉp};0|ښ{!(\kZH}xpInq&o|l-o}\Џ-LѹK./N'J[8ԌnbU 5,]klaif ^hNV*~Nކf*0۲MQq榴[=҆k~17fZcD IG7GI/s x ˞Wfh35]a|LqY5dsDIkL&Vϵ>!*ϻ@"r<ę +RT`> gC|ղ5븴ָ .wKN~YlB\\~3ai 6YsZS/޼ rʊNjt002?F/!6kβ V#_Pz (Փ=NlRBM}kB4PeFŨet]tT h(dI2`QN@̻E'?َ;%" 鬮90?;ڮe&`?/cd![h|4S)Ln*hjlc137OuzxFSF}}pૠwހA2Mh ݳ?^DE=5773C?twPEEEG14yP{dd9m'hŽM}֯Tޟx%EE++rsE&Ҍ YT `ZzzvM$ Un$~oz-RQȸ6HH`l74ت(}H=1Gs x>S;;8 cp|XEŕ~ (\&IAʜdy +HKM5xǏlF _!`N&/;pvwwjkkƵ+PS)jkO:Ş6њSxEpJ/% $<0ߧśLxD0nhh%jo 4[%ɚr{Q(95L)9#ewMp}ZzmD'CGx \K<*32xhm Vlu1޻VhVZ0˄k«Yܧ^pM>h;,\52MUy-ϽP^*^n|OyETS^O91K1~U5p7!Nl6 YPc5h>8kX@0[|Tm7vmhy#___ ee!nlyE<VϐRcX@7쑹dCc3Ri`)qӓ'O>_OdII֭)'SȒosIQ:˸ jcDJtuA֚)tHHi֯/NRVRR2a\7' K\kd<@X# 85ϡ2{uJJJf|=33\u11o{?arɗ{ XgHWnSzfĀcɀqu!KT\Z/C3ƭNNZ_횟6x #==DaUqh8-+\㇣sNd "'F*܎B 0209`DEt'ޱ@ssZK NE8IxxbMwkZݗ/P**)|X"#KVX A-rcgM+iir+Yח籠#,6\ {(B38ѕLB@XL p, E{8sKH4,UY!@_ewCUڏ>}>M _awBo8>mF8d(OG򵴤}=&*'إMi+a' ;L?{rX:BAQҮ4 n݃6w0<"wJJzgppB:1"ĈzC dwOgK+ WeP{z "QM~[eЩ$ݶ2_I忟v ^':䌷 ۝,ZEM ‚1o&cО F'vq@.\1|g}Dpe-0X >B| 4都0D朥+"%;c__Kݽ D%ⓓ]9nWLMMpu+W|ud $ç̄ "6a.'Ɔ\vRDFZ!~!!!ii8 A'wwM.˦p(K ߼1L0bv; ?RYVe`K`}$LgƖ|;AiY-kKO([>驩k %k6'ԉʕ  vvc-z\MI89 إX#L>ZzX8/l?ôx_W֟ > m0Wyq-n6vU]=oik˺/?|>CIvv?bd9:ut8Otd@J>Bdhi/ƛk]=Xw9#Hd(Hhؕ+A(&cEww5bj_NTi?eeERu. [Q`/VGd]?1I?"ox/?/?]]D%rht8;~-SwDN9wO~GI܈;"o%r)["o!r?_mn/AAoW]`| 2SAW&XM fE]H3riNV0ӄW6СBzYf\XqKRsygӼBȏ-=v\s@ )2 xJ.'aϬI %>M9%K|dؠ3e9H}r/?ڋ;u8Hjùက#i.&/[YFdw*cO3c;KU2s 3\Y' :_+ ߻g>t畕Bר3.Zs<YϾ鋋_cNvhݏI_V\mTVFV[ɋZsQ%ky6``Iq8\[ۋi|ϜURqo'u~(%:-uϱlJ2@8|<8<91LS3@"]GyyyCÕ~jm{ ꒔BFGpcrL0~[\,t4odQ)FSXBhj'RIm&}s#*5q>F}y_6rx-vH>JX孩eamRP0UR5v_XqtpbD+1+p_TH c=(;ƃ8L=v@<^5)4cbߤXz,+0@h:Cs&߾`,tо̀я?] ,DsVV&k?{vx~h}Tg "}^ Ѿz)c?GEqР4ӫ/5>,bl2EqFFE?ze˼Fo=MYuvV\=I1}\c˷m@#´ SƩTm7OQQp1d}@JJR5^|#YC,K]Z,g}r9eHuFĨ,QR6*FQ08.$.@+Av=sgݿ (rc .nj,oaaH3RԖ(NS%Vu_$P,6fNRZڧO}u}z0;.khְ`1;6#=H_mte2/;-lpjPeu&ձB[9X8ȾZ)Ff8IebVE 9>'LquaR^oDÁA *7?rh,qQ=i_(_ދUne]cn$}wwxeN><>/t9(9٠aR{_ JHд@#Tv%fD+ЄuqgTe!, Ғ9.%tĞ!> Wcu};#!Ufa>{899ݹs+*g644rtQ.S ns?~8r9ر?OsFՒS& QZJ#=GE KeBo;ԽrDJ^ @BckU+=!c@z[=)^ % 4br`5DɊI"pDU2Pw81!Po+YMpg*/̤Ӄ,(qt:&۱ɭSSȘL!ԤP^[w 5ۉC4Yr#k ۭӹjof:܇~6lįc>u|HxWxv6qlz>"ʹʁ5?;$Pyvq1%Yl -NFQq߁i= M8މva;w .D(ȷg~P6iC%("Pd OA7"N s4QTp_~8Jb))o}9/&8?bf^u=qEWW'%%%A WFA П Euf'Pv":Öuk:4P+,--*[Adn)8+՗Ȱ{q+&jS!xqSߺRF޾}ZDbdX͛(C |$R!54*<@krif8~ :LŌ^LK\,..n5}r+ǾBDc_ג4f#/bIƅ.߃%яe$/ ["D^H vr}]&(eş=BAQ sD^oдiA_̈w3 9Y J((å?ձK0 k\´b7ý]7u_veYCdPbrW_e$+uMͪ`JJq(x1L[;;rR-avO !Ҏjy^gT?諭j&YWrOSM\#cCR}fNCd5gPCriK)kG JCe!/^*Y=E̜L{jc٦UHo>XKQI=<{|zך) >;$\%AZu6! ([ꁇ0hddGwvtwݔؼy#C.CNY`Zܹޥ^ҦATh+_kc*J\ɊP62wIx7q/}깥 @}h!. 4qj&Kj)=7TEֵdWm8X`Vc6Yijw6NrO}z;`#׃QA:=8f<o}=77{(8ww?U8+cɄft:UY@1{U{ɂ.'@[͞#bǤ !۱ GI}$E,[L7)īW5#}#wNny$; uGU=](5m`2W#tVn7oT[( u >Y|ATIAnkirIFmo|vFͪ1K-zsmi68zǃug=dXr'R5ِmH|ͩE2ž\׹9ͳOҟd IhtggbGG``Cg3/:wi~bdO냲Β /Q>fggA]h$+3elkMttty%S_ZfjhWnv6Kv4='2Kx7 ynWk./.jYF},[C$㲊c5%O6֭L2psv*/@w*Oy0{"qfz=>}}E^Nm)G/eQ6^pרC?? ׹agcJde_Mu Y6*qS=P"5N^M +g@fyE::}}WX9᪫5g6o5]dJFNe\IE Jٛf雛ƴ NYjvtvܩ;EIO>"osixm#ъJJR@v|xYIWVr)P܀F Pj$%#c+3;79]ŽY_7+PٺW7luv_\ӝpy[ЭJM0愮DF>k0}( -kiYnjBG`@ҳv!A+ȟrB2d6K_BzfjNP}.B +O棚jI; :X~#oP3)th%¢>G?IZ$U$ !" H,kv7tA}ƄZ&̿]& KO~o2Ka8??XkV_u Mpeb~-/eBL%`b-l9F8 a(]检$?vma~=m(.&ˮ;_m#En2pߔ $ m_Ol>?y6֑WvGq"Q\BWvo~/)QDXT/?-b.#4c%c#GXh= I4AcIjmzqD - +wg-u,.QLݼ&ygfT\%și]3=PJ'#'lv=G9}y;iވdu":%-ďG}4zg7]gkV.om8_,Iy;a+" x;gS]sn^rh>S!a q#WKIIi"}9IY6G7)D[?rצwbF]qQ߰iolL'\= +%ĥ&aK{uj Q`$3D@E$2AFDA`0A0W뎧 ݽ{m%&%uQtZ2@#}VBʼ´$yiLExx lsqC=y;_LPBKBY9ǜG)r4,MʥXC{iVY C[XuL>)fpu`iCSPPd!nSPT< r- b!We I0qH~HȐ;/$GǴM.wq/{l="/\͚6,W=Xds,-mߍ\TRWB *05@ZXJ:p-'(ڦ: a/P+F+?d3wj?3#u'ptgӬYSҢRGSw kylst/#*ǃ( 8G1<^#CrO # .Pl\P lWeDҷLEio0Qt[ģtKiJT3Z=EлG\NS$: g /A78YRx^c/y793_em0HDqwCMCbqA͞Sm !(ُF+a WV)mQSzu,N˄ z~E:,MOճVU 'w0 W4YA(U6>_Bƴ4p9"t)*nO>{Ἁ@)@-:5cjO ½ >6pđWUذ,H-JEڳSQQj' }e~*D#((' yK' lH"E'):D/*&ɳXוh[{:٩+)?3x6`cđQ^Wa2/2{-+ =aAɠ_'{JjģhixS~AMnA29 $ta * ʢK]u?GԪl7}TttT:XTH'upH3DJNik\D^lʗ f g5,[o=,MZb&/x|"lا,Z7,4P'~6kq6sڳ!5[4[@QhK|" TD=JIvs'DӺ|"oz=& ;:n'HG)(j9O`EAik0;vX#?2)))xIk_YtZ95ZZZP~N"p>:pITNT_ !f,O-݆̬;7Us$e!~aP+TCgcfdDɏo.pXQ:U [u16in4h+2񈲘~tO\KKKA]G.V1?4QCQ fVW؈JYTzlABBңy^/17v8SWL)GYu.M QZ琂0=)Ȭã\$Ja䓖[At,+ܱwwPjOvg>i(N6K4/+#Jc<ѹ$D2a;?K E؃`fxۘc%9~*~Q5Ȇg}6#Z İd1i;3b`od5+;{Q 2ua ;[IcbtIX+\Ǫ>F%j'^rw gfd"Gi5ȒËc-Gewa}-;VϻWΓ@d/.LkR\\[F5Y|v=vSIWrc`^.[uXs봹n‡y S*i}Hx'ή-6( he[)]F"q}7= p}OD֠JqԳE=Z5콏XRc'RO<==`ͷ~u0,u`ZXג>+t[Ǐ2®;=Z h<=}dkA"bꮲEρ aM%t.);~U8u>tP0fhK Rd}Dž߼ST.ިvf~DW!R~vKKS3=%~Grn$'Af*IvQ; þ@MmllO@. >2Lx-Xr@?oߌ耤 (R"!x1:(r69Pkrox Tݷ`@_$76BC˞Q=o;awY%Z'`lAB֢h4;k/*4}| i G8 &a?3@Ќ<59|8.Z<JO&jB_QfsHHNѹR<0фp^<lJ|\GgGd!0G5'!klSˁW ʯiS1zqV27DKcdE`5bjɹrԩn%|R/Dh>2@<eG9$O(_ Sa1fP>ϒ6ՠ'͘"B#CRɞU넪E'S;zOb[iIމT樳%,iWNٕmh$kU=+’-t\䙊fmf0'###Eco y(1>x|Bǯ=|9&g`pgVLP%~3ܬ;pa'jm,.(em./Ȍv4`‘5` kF&VLnq[ 3GwLāSng΅Pũth~ 1ήI80akᰉvDaC ٙ@f"<3ԿC$*"9aQ,YEKgTK)p\LxVӥFICJZO;egƦׁ=nKrΆM.s̈́ $\0mqhm=kp6N-K#%DemN+>ӍD{p<#g}Rj8$iĹ(x3=qѯb;(cՏhߢU9u\Ee~M|ZIa3fOz)l*Q<2=L.ڰ#ի鍍 `kɮGLRD6g=3i4 J 8UN1$?~N/:O#@k®kAm8w-ji6\-l`[DL~^2%GU@tD^o_Y^ sn⣃  {HS>xIF\:4|*I6V9yĩdNׇUG*BQA(JO9[Bٮ[7FcfXе9U< ѹ,-k*t8f̮sjU$Q_@H_,bO>{|3nA}YgىDžAvb! U*sY-= w+n>k7ܝ3֣sidi9?}-D&f̛:^ĬU2Ն6 J[v09{XmP~ 6^$Z#N#0Ow#jy,-K7g׳Qd===ZƸLy#$e۷7Y,>ޔ-PɥiF(vK0TUU}_`F7ЖIf>>XZgZoFhgRmk2ewK2f:tOCBB,Nv{"%%>kS&Ƈ.N'5Q C x1ǵÅw4yeΣoB.7qű.@-SP_lnjZl.q+#glf {4jS ̦`aaυq9MmI lTZB6?g-sԠpb˶?dm/53gDJ?Ȩz%"6XEfZ$M!VM&91 S3zգh3Mȫ5#Kbk:Vι z) 7&O3bd)5bMt~vJP)+Ubkkf]Tλ>וbT$IPawX0mi0 đg-]6РϥT>xʵ9 &:o4V4injDuL3*^DE0Jr䗖pp޽'a 3"ܵkԔxĢ"JHzWweg9b][l[ji0툎yΈ/^Z;-57.v"u_҈m]qgLkE" M$æ<ˁ!^[vշuQ¥0;:|/p_nn^< ?[^ďԿX ]G?nn?+c<_5c`#_9y|uߟ<ipQQznG+_%U|x#7q9.hW?GYr,Fw#Xj V*]cO?* S,<M9o{P ~[/Kq_ʢKQ|{__)'u?QC_zPsNy'O\>{YiWKfI닍޺+JJhKc·MM]SđN߇o> VNm |HZ-tEz5;3VTTԩ(; T*{w$oiG],vT$}1ՑXrff`[bϋݘ3tވ9)cn>ҳRCxd۷ oߥ·\K~{NYs^GiEkÛㄩ SSSٓPv,|H.gUAAԂ؅"$2rв?5y5@{\KPC91J)jI^W(YU10G]dHVv9r©E7V9r}?^aemZȐG`ϛH`m86Tqg]vX'QȖTK5^N1=9בGJ/U qEDF!+ SZ,ƿgzydcHt6W[Q ~|Qxjݪ͔pKfPkaSXy^@"phTqKA[W!caaOW/JoXk5)MvR#BEҶNjO1i=ߗGH5,ȪbeTKSh8AXceeF ]W%7@)o9]>5>^:4eʗHm)>nu<T;+7sp0z.\&{|Az9qx24Itl{qp{ j I&H |T]&)$%#T]E >|ekBDqAe`&.)9.'[daQ3@Ȩ` \ @y?ʬtg^촂p>,!ԉik en!O2{QgUX̷=TϗU+u|13bimtia֞88~aI[߿dUa6إ"q]xrH.OG]Vaox 7RM{ވB8:{طa m6,,G8]x%rdd%o'ߏPt99ĐB'i?Ji9%@6jčIbfTOhAVxZ ^O6.XXk\\emgf'LT\؍sZnZ`::JzfpSAkIjR>Mzk>$-`40$2uKlàa$/̃-T>fmAvu.G wMK_rwU4.oe0'.$ /mkKbPf~C'y[',l)}Ev (o3Zƒ<#ЖiNڲV3i*nr!ai4{{QUq=rG+2s ݋t2Ť\͋Y v4]'ܶEv`3P74{E#m;n&vuæ\u4DwdFLTV~ e6su-B1һYn̊Rl0\ ƕiLu6ui_e ns4n.ˆrOpb`\].!"- .d%+8\(3oKlBdV]/vK7УUF'n08!o')YmXEBNmD Uwq/O*$&/Xl22m)1+z~dP_@[)Zqe*-fd%(ffFOv[V|<Ŗ{U$ghq<{@6? 9T!W~W)<^I{ge{`tZߞhB=I|$L$ވn"%RSh5.,8QrKp; dtjm#u;5Iz|磌5&09cϟ!Sit}RpJ}E8V e67E;rlS"ڽD_G`(2 [how]grPpWB\0>D)y,c~?tFdWhW _uHE_Y[h`h0 t<`'gRb24z@yE^;uv2wVΚ7U0rSۦ)j/n_Y776o bbx-RE&#|G-:Bɦul;Pՙ= F+蛢@5Z=O{ ; ]w;kMv|C3^ mѽ zM |oror Ry kQ±QQ/= .ޙrdH^oUvF(t/#&ᢴ1_:X. 6J ϏЭFs<%)E1NBcYb6"P5ΈZ2*>r$.O0${o[[4 ˀHKXHV(SJwjztѻYOAQ8&GP%@ v4 ƟTzUfy -xg~~aǺD!p eTTufzVQ:=[e߫dJw++ݵ-&qV3B&V J[Tn%E8N,ud5yF6NRtUPQ*+l|+Ql/T)X5H#ɡCȞyń@], _ٚL La{ 2VFHH 36zWjo&4Z_"-hԃGm/i4(S޾ u 3ũ(\*H)@kB-]z:ޡd K-u@P5U TP7IRƤpƷFwwqй/]Y!OZ)f}S-p$yQxOܻ݇ef~󐙸Gjn/;ʖu‹"ĞrD ;ʺCo"kU5@@PΏ_*qV%,Ž<$pT>z!S-8?:Zҩ𞛛cUoll4Q~Q5-d+̢bp9Q7oJJJrעk'C w)MP{*6 g*/@&1lP䖘l? ͐6bp}iAi;t=nccc|{m4ҳv"C%A4e/_\,wwE4pB~_5 3r_ݡyXbzu~c2χr@Nq"o;w.ݰhJ˛٠---e q((/ #^B3`ODƺ7a4ԍý4#};;n1ء[^V9-߈]:92րhdh?Yr0C6|lmjzϾ!poX׃-4>*?&& u( FFF/V\RQ{۝qKܵn'!## Wo=j8X PՃ\)66ϯ]KMmfz%FX]`6TUNߊ߿uEDE=xvO1{[g/QpQ'OO@#_X$v"6)}X6/_T) rsOLLԝBTFF{$XT5LwCc΁(f!>hÊ"cgay[[^CHHhooj1(aht_7ͭez`P'S%9fS=r{oNZ33Ibm_GJ<` Lq^$ .ԓ >(pMԥx)R/w!Bx2[MLmQ #:&&u(᡽-X44… hA ށiS9PrxhR?*---T0mbq199I'pQ*޳jv>}3)%Vby=;CcEphS-MJҺO07|2Xd0+hEDGU mM70?8ެ1/t;vp[p++'mZ%rmeǏӛW F8O. ShcP5jU*q ;vQ|uxFrZph[@.ݿ5(˭4=; M0oh`Ҕ3i8K]AH=(1֓'ݽ 1..\[;Y055}v]a;68`Y;uȬbF '*89/hj% `eAh,-B2|>9pj{5nkj$Eڎ{X23-W`%>}*F tfk.׮]Ckkih| ]PDjxJs{[4ǢOLUD!^^eUU& TN~NY*TB#)ɬwͮ;L%)trq<{>&*BPH{; Gf')@_`яά1Ýr||P/>,q64bwjEʇ{pA1ӟzPUu;ܨWoP?! ʆlQW`&.>#`a@Фd-xBm~olO,`s}-yjO.GW"`B[!u0O.MMݐp0[z*:X5pyPA53i l4a ЂOb<~ba1>;?xg~GB-_LӶ Z4߾+IQ@&г>K~_ѷ@.]@.u4['dM4[orvf4$ ,<H"COV{{sME@˛2b3?U['g~cqKD$.6 iOa&%Q$'K|T?,QbefnOMN.|6eaX#J^7-k!s=C9lSf$e@BDetDXnџ?%-7h[YX&@r,9-m7%Sљ ܀1'y3ʁo%&+>>>3SA8O)UTTDZ^Un"?νJp?vquqQ4;C?Hqax~94x9tP?ۆyuEEEKKKO2\w7|m֝|2hyyY2zyHZ~CDssTUwwIU׋dl&&x3G?ХȣcR2O{k@Ud\_kPT  ! ‚H v{x&R`ӧٞRWkmh w[7x٦ϊ>T1_9nqq⹅?3K+/֟k =wOpc<k T#g+ǟB%wzϾ(Fs6|_Z9!!lߣ b_3_9<0sV7:3_̜~]ːŗ,7:3'tfҙJg:?1\De̟g_~?{"?ɾ'x G9zT.<-hO6j>4$ɀu1$\dȦLjKBO4PTU bBʄbU{YbvnMbgFo 챗69d܃ąPM%˽D1 ;|7K}+R5c6yw1 XV| ͙/([P> fH;wf~J{ýtyF&ܔ&ϴ|;П6667=GIC~<Zo΀hIW6i X>_ley'^,Ks*HQC"yN'~0HFF͡N.9waBv69K_IrWz-s8**`B Kk^+^™zʆQӉlntƹmN+j2׍i.sޗ1鮂K+JZՓ_ԫyNS.|ctbm˾nsBYX,xg,-y9L5c kʬ^]ژjK6> Sc΀πXRMC 9 zʇ#+!nQ .1]Ip{{nJDbmG^W.. k&^#*&Vf]~g!ҭ]a$rS r߻ n3+gn86Pj7|2F_5P´"\4&Zj&-#&K)ɿVSOB8bWt(o$ nKhAPrtK}˨p>+FW0\"@zuPXT+C`^['=#Ĝ@ȔLʏ|a-ykF(/ k'[}̉Mjj_csxiqtsO&5X JZ'+jtAˣ& ɁX0WA h$FuD`Al;m 1Is}G?L6p8 G.uե!"ŝ3K<"AtttPk:?@)orsSBFEJJڞPXPgzNDPf+S00( 5+P-1۠scKՒn I_z/heS`JgrtCEU1Dzsx.2׭g@H4X^^|u愗xMjSCRdJ3i00%⇶_5kVWMa`ޞw: "~N&1t@ONMCa#^Z&^rm/:o8誼6lṵ)))xcnڍA W9uD=\< Ra9{651:~kWj1_W|}OgSK~~&Ϭf*8o^ "Ĺft?QR:w`]dؤ((( lXM\Ou ZUDYhԉ̻>C`ba6 xJ"Lcty#f59UhI= p RW 3BBw6?G[\έ>&41T $)Y]T A/@om<D3"|l/M${Z8?\'Q'BĒdW5==_{[&e.r8`/Ir>JeA~28f .uk ;MMנvPp/8  7E O:( Ӻ(#h%Kd<ĎZuM7 J!y0 cqqq|s_>ҥ֦jlt\O% 7'G |R>?b];{o&))PǏKLL5[u[\3 5|q`vn[H֓f|(С 39NL`~s8;N5U =Fs˙DFB2^Uz=#?t%R|]{ gMX%11׿9A맷5F[J nXz0 Sdcˢ$#EǙZSoMIћe ÷n(LmpD"sw#N!9c.%)Q,e%iӱ [DˣEq,P@(߽r?|gjKoRN]N^tADeWWW{y~YY0` 445Y 7`%7 (#S@$D5"FP'IkI>WnEЅ9j:M;;f ~0f`O͙DL  ]Y3+(hf3zaN0|[0!*]}D g3'(#yM6դ]t6 d[he|Nq%dx}bwN@ٶ008~ŊIt...@s_P:OT/,/ K楮o F)f KP-62ģAPCT 12l.:ݬXUiS׀`gggRe4*}u>E"(Rb7^9b H=ﻫpqr >#И^< z`$+KGq+>溄()!i GsW)8f'ƫI &0ËCQjBlhhhQ@WGLM!5m 2u];{_^&kQWOHH2K 216sJM]n┞\G{[2ׅ2WaYE!*Je ]1+vf 10CGG&12ee=5JmN[fW!9m#*ʏk_ w$1;.""I0.Mzăe3Tz-:$mPU`eNWdJ^zwP@i/q̵sV(J*ss^Gb) `DMHo5Cxl*p%J[ ӛE(Rn2 <ѧC^ 6וdcs i{<H$6֣TY%fRQNh%ywX^A=u zg֢ ½.J-ia a gDSKX1mbN@}KX ZӴnqOf;e#[`]Eq7d|өK5>S'z $^|zNz +%#\,$&qA? 1 (3z  wK@GNe)!>ۢ9ylKg8rko7iK>5Ori!@^*9`:pǦobdWqv0rK^{s^("c𚨎.Z_sgL'&yH ğL?|L۩QjFUTDQ"EzUQQ ҕ& QAMEHBH:~`y9g!239+k5w+y6R-B_lЊ{f8*TGJWj, p]q쐍I&j[% "n0rk8jІri'O3s˛#"G 'K6]i<#؂ajB3o#FNlg Lz۔U*ûζrn+d<=Ѐ$0zw 6G&h6\dmw j@*@i؀^t&0Z jhJw行lN9Rs&Qh"挔"Dz"ۤ]m#:UV>읎:Ի\g"sGh"?O";GYwcnuwvfk ~#mibZ`W/ΞL2aWuIs[[EK]D,2S S 5}rKWDӽDHL:࠼˓ɛ%Z|R`30w0T۷;G{nkk<1ɘYoA-U>Z}!p;)/8kw-F=ŷ45YgW׫{9ӻ,or̭E\\:RRIև\gVe+5'}899KW-,-(޹_ypvUhaicss$nl p4hk ;s {ZCh;Frz6x$Irfvtݗ&hj# q@,W^8 ВfrDyRtoFʡSb8v^p8&`_B_]OOZ\m~a}|F dq3y̧U (uGr_\.+ ~Vdʼny 6Dh5!{g](A+1rrޭhi5d5ddzz?bg``r)96;Z6CǦx{³{p8{T[(O_;Bkp\JhO SbRRi䬱.@s/'"6 ڈ w2:5_pjYbʓG͢(p+W'83znd=K[q"a0 M= /T'%.uIS@_湜mNMq1Wh-]6ը^lnn_[['j-5xxFIY6>$-%EDq6{[5^9݈9UU͛W&|uX|tUV^`$F^%%Oq6R.Dzq楉^]ҕ}Msjyxj__{Bѓh~~Zj|T U^?[\QQwGֱSAcXFڷ:1}^&/3C?%&BʈB;kTE&X2g3h?IN_zL=8!wt5G۝2Sj?>ގEk#ʇ׾ sdzr@M#MXmmJSg:ʗ:n'&spHƎ0 y쩑2q%Zv6]79]lI-˗eOazƒ,ઔ-YUϽ\$r@c{9yХamm'^6OY!c#yz:7Mu}𰑑ۅK_yW+aC/E`&ZrmIm/L{PEDٙlKWy+s ZqkV2?/ w7<=c]dgAQ?ڿ?i7? _ztM &kZ3%R395:;fh;24f%;ܴxq=z##)PuIBXD޸iFh\|-MٵKy| $wv'P *PArTI?`|f=lZͼ;B,.h뒂²:jR򾰐um-J^cc0׃<-zxxErK(PۛJ|9%f 3gΔ٩~>SQh 3#GlcFfƄF(1)aΣIo{*PNYYYϛABI m{y;,I'&&k[)1W?r8J2|]Zzzhknoh ,Ez# nܒuN8Fa|wY@(3 G6agT3$/q`J\1T}27y?ͱw%e{:S/TuO:"B/_ިa"{}\w+$2cf1'|TZZz<2(舛Vύ074դEBCz}SНIGJq骘:[ V:zbO++h 9&CQtJ@c9qo;<:[Ұ!AXx]z`llԨ+C,eTHr_RR2蠲rdaAA'n噥+S\g^N|{Ҟp:52 ]@2u0qr@~}R|;Lv߿l6[Te#`S 靲R/,p+衉})aQN˳0Ģiq#P-`ōt@z$BsHC'ȍPW̹mQ$E<@ T"e,!nʀ,o.0~{_'Kr1V)* 7WWR\!;^O!'d蘆rA ٹ-|aeu̹"sV8fr@ܝ5_9 p^䆖¥K$=|aB֘+i~В70pOY\ujS@0;Y^v+DRDYZ~~^ͧ/tӢt2--)I6!R kd([r-9ó&O#D)Bդq#p! @K{a va}{3Lf AZ@ebi)r?J@^U;KBdܹskX\QjM)=A`h`2rKNTaMwgooP㘓aKVMI+Ir#pM^_߈?  @hU=qhWC/LI6JP4zO>njO[ߚh殮H^QQєi%̾O*W@؀m>-9C\g77\ѩ^WxMUyFG(;O_>mb@GQB ^+ \Ʀۘ< lɥK:&%)cͿewo&Ak_tlN#3EeBp3ļAy6|xA]T$!$Čz|W$s.Nləm/m*F҈;͢]Ij7h,= >ܚNAiwW筨Ŝ9=Mg|42Mϯ & *#b||(w8#{{R16~X~iGhi|RB/.3)VtKlihh8f?>bx"%*H"nEQ s!c͜"h9Jygg!lr6֐ 7g٭*Ź>}%N`ZVoM+u"fff |xG]ggcg}r?\L 2 D$F*hI$1\vǚc_*Js1i2Nz::%jDSLraFM~~25:{$%9i}1ܮJ{C}34$WYF%I#n>]3k0}י8t30 $,j$B {:h۷snFMOrQ5WI>iy>*5|zՇئTG4^38N8*WA!<7T,3ȏ2"EQ9 [gj"*[N3񍳜Gplnkێy~`nnn}Cvvyc/iDmҏ"DXYD߬P(ٵw@bc0|PfxN$7jۑ卍5 -B$GvK P.RemS}_; ML. κ{ N(b$A0ߋZA/@ӆ)tb-6]¯gN۵J_VnIfmͭvn{{Fr{rAA0Mjȣ8[΢ Q:R=_nrFLiPizvо1V]m/]-4.Ĭt(siMvc+fs2wc{rmymno5iCKEZxC.G+bri}+ԈtG|WF;*ըQ78kZ\)^P&K{ı:ﵱW)UBf]D`##*|vx҄m ![t57W盞r"KCW=l&fg?ԚR]9&$5\U9:kqa ̘y :^w2e(cZ ݇c4X}$$/o@$֔'*܇ a>p0CWMirsŀ%Z.o` Τ_nzI.rOCTBJk:gSH#Üx@R< zz@cNy\ 'w!),,lJki)1S׉\vv$DŽmT^h =q -/`~[jfCP›b K8y(# _UhqdZ`G}#. yN]<6##WO@hjڲ]Rb"= SɭZg]?6oTj4QܱzbuNVLjL1bRSs N\Ȍ6ݨIRCOlu҇3,ʸ(^NgdgWSּJU?}o6Q!oƥpMѭ%V#D<K#8LS(/ ؊ǤfȄhRa|i#P* ^Z7Kz.Ug]ARiqś۞$\%[FIp4A49}PNd/NI{0L_2^?Xob=**|W$h;暜a=#÷fqg4FYRPHU[9xO(4m-'`{ <@odx@;^Ą@\Y!iqUZ<\\v-q{uwvxKg yr;mג4Wng3É>CKJN[~ |QLOϱ[X8qq(1ڸprmNm_c,~[wݞu2,@h'=3-f8S$Ҹg.؆uv_.5g8\̃EEDE:;^p@WkB*>]__(yYź"@QX/#Ny'$~B Wl ?"~r!^KL|0xGM<7`EK"0sG\\\BWUpG5oo*9mqn<"䈌?l<6,+u_|X=8ͨO,>VCtxwG#֌N4Wp|~wڰBPPp߼~ns%ZdrBEb$8|Sݠ/2d㶴  %a/޶ubU?lđ?!<sQ _ő?GfAJbUx;-z̎7(l_v~e_VG^/*@!5EL|AmpSI-y⋝۱O|n3NO[^f{kG^zK! kM~TeQ G gl~;hÖ=g x? AmX}^X\@,~[A֊Ndz[Ty@e>?ŠF4!cC"@H{f_A'ʧX 6`7G**:uѥkJ3[Xj(/җsO[UUef&69qqYG ,aEB FLҜn86D".ii17DS*>̫lm <\Z?5]4>D/O ~(sɤ.ʨrHk1_^oKU73K[a}y=+7HOMxu\_~~dKmY U I:neq_DwֵM88R+NVDDsbRŦs[hÁ@~}pTi(b[LȞq'xyu4 )\^SG~{e(|R"u։pid'!HÛ}AtP <3(v]6{׫tsc}Rb2~9y`tlp.46 5hh~V,!r^Gv l@zGN &>)Zӛ p)Y.3؎4rF'y]rpÅ 220oՕ_6&{kh,i(N)fMˆ=buk>%a ݋ à/43c;tʯYRBzcBR&Y=6I&:'(p(<pvBp|=,Z;/[] cuq332rwar5lrrvFK;=rvD܋U =Cqfc%c~/_Ra%ax&lD,q[*Ì=NX1%B)fo=^n---ǫpC<a II0<ͳwdTiPPSлέUds$\GJfyy(/!&fl|؄o;OĦ}mm]X`uVhP6BHM2+ť1AHWꙮfø+\/b&Z?=WorGD^!|@ f|LM50K-5VTT"9:l K𴒼ln!gN㱲xfɘFLL<5%6_]}M.<<ܬ)QhG¢fl<|.}UEJr|3ѐwbϵkܘ܊\?<9daZpY7^;z{iN&xjGZ?>Oq!%d}IG8 l@{IIIQH}-KY/ZRiOY8!y~u{%F!a?;S3с>Cql[ Lǎ3bim08gtGOeo:mI")zo{#+qD:Mϧ}ǟO V>|Z|k'${J$~_O EDk_qgYL.^~s} &:S=&[W}URsNќqL3" 1~1!}{iri"tE@0A{HWJڬd>a63]<0.p!Ujh$#ӈʅ =.5"DdeYNx2 m0_^[Xx' DvX|+1H0HRR~óg2* $t322ĚoTo$"Tآ*kmiyLf ޣ\fۖ+@궲Ғ]B8bUlmmEp8AG M߿b^kM>(R{cLS`:?WXnlҖnw *LW;͚2x̔i%^‚CWĝwX⌌ ' ?~[V#)!H_⹪_GL>1wۥzyZCn]bmS}^R(履Ɏn xo|iDm.۾jllD#f`[X0X`a[InnkoW-@-= r-<HE3, \o8םQYjxYŏnq‚_yupHܪ{fWYzN.QwhǾ,4]D"y#1s@tZ?bdK=ofz}}SpRS4|n&zs-uJw|ҦnZGӛPh:G^ÙXC },YB  tuΔY}T*4!;Ntp.9Bc% _zS?|*˸-''gTwEY \Nv~!5ĝ+`ܻTZC+oŌ:Q]vvAI-I3W+1 MVw~A=[a.]m2kXsũV𐙩bKX:CH]8wŜF?|8}̰Kځjr/+ z}@ͮ..ﳲ8k(\?@&w-| su ~ ~]n۬e9Ž={_~pd8u*4vɻwCPUʱⴗ,Gm/MrX*]13AGT) /OBBtģᮣWH eb o‚u#mXφ=ҊLu*̾f8B}QCyZX@z0A+cm#.qKqreeWv+4yGuJmme:i5鱧D?66zvm ߽;\>b޲pzn{{&'& o5ŋӓJJ()mwS1.=ЏҹةIiw XiPSЯKVƳFb+j;xjw7UFQWS;_ۯ?$ܸsK\RB`߉1Н֯qpv}-}w $|.NKKK󂫣# ': zj1feCglLtQQy NFGcrne喕B7VWW?OlfqR: XRiA@w,?IG!+>-IN6Bܼu~I$ F@%<{uPiM^x=mхಲ@LaY•`ZT@;q\| ,,&Yeg/_mwՈG9{,_mK(S(N椤 nn్ :^^ X =a~tʢE8ŸvԺ+2*S;Pa[b͚䯖+)hu'm,!`0Xᶸ.qԾzLMMl]bcyKWWe[׭u򕊊N4Q͟&,zυ'=-.q[5Q•eXET(Ks?w B,r\%&1 y7Ie :#5! K7wX&W%"&t@ Qཹm۾!Z+;U{JY5n|NHYƫeҋOFk'{Ke]#_t,@ DEo{5B GD,>~v "PIo Ŭn/H~uH͍5|Y"fi_§׉g_EJZ2o@fcd3mQczƞaj!nog0AP:}pj:aqaX ؘOM(\Tnhj qG̪: Jն$l31QūW!/.Ax.C-Zax_TW얟|&vaaS䬸c@Dnu!?J* }\SDΆ&QJζvp*BA\(L'4uLͧ+cޛw<\}}=HcCXx铒L8`lI^C}>~*.Pt*Da`A#h^)/2FbaƱBx(r"ӥZ[O/[4=k+\gu[[t;A;> ĵP;`^ziH|!L!hNYi$[93`̧4 'X_\\69ͩS;H5 ݹ/6ˎ꽢NN{J[׾t<ΡD%p3(@t[8@eՏ/{zz~3uVکQt-ݝ`B/Kz4䷷gNi_"bpͦVdW[۱N=cc|tt4:1QqNVw,uR:@rZgbbbHq6qIe(ᆲxQ5`JD0fURPDyk*OXtBADܻ2LwY9ȼ%x~Z24|9BEE /FyW@tFH(ఢV$uEVSb-aV'O'N``gN[&J>;'NԶc \vwoBﱪбqT~4+CYdeK].-z~H ‚cͷ\rfv&I[ߵMlaeUhy-<{>]v'O Pw r}knEaf@ xtʏ4ḟߟUF-~y>'ZZ]zX/6...66ǠTFX/%J]f޼H|?s='$J U>3>;Avx|[lEW9a|kUu!';(xJivbrcOvrhک׸{xb{|x+[x _ gʺIbڔW| l@f`BR&Ԁ#19;77b.oȱoDy=?)5Pwl~fc Z:û.q)z_,޽摋0xs{WCݡ.k@Z-ȵXV<8*!0FǀQfQoLhPg -Mgp>P~-qG{/"a@rnͺ+]ɏێO%'no]Ϩ^:zW^Lg!p%0Ŀ?Z$$F*2 pE K2hD/ qG(Ȱ@< D0 HַQPX6(\&7C FAuP`0 0V JV J 0V MA d0s!FdPT" CPILErځ1O(B H!)*@XL P`Y ,@0UBB)ł1 b$C 7e2xiAXd !\%B Ŭ3RAʅA PB(%8YQ̰E! I(H@A$ӽ (TRTaF2,c)A %(@JAWr5A !Mq*BJ@@؃"ޥȬrchHa%˷0H1̽eȽdaA%i &Tc)I\3fRV pr@b& Rʤ܁a0H=_/?/n _օ ER"hHp,EE1P@/aHh\'!pf2aLnTXGaQ., EI,=-gcHY12 EPɪ&e5L&e5b&ŰR僁 e5b&e5+4E{oE| ']J%Aţq3#$e##E_(-2 AP!ߕCR0ReH c. E$0PtɛYxY)"Y)C,"+Uh( 0}E;H`AuQ,,mc@@fJ1ID[$,Y k[pg4ww7|"QJo zhcoX<V u,E!)3cpdR$$Uޖ̇BװU(=,%)r KG>?)L;E,`0pD3IK >?;ECߞNPm MѐEP!bdg,I!).(Ug7XZ~Y ,"&EY)g;UdK<Ŭhmz98"= ¡  C T`{!oG~( Kq ~f=[:2UP0VdVQ?IiCcPD{?_b(H]?Пw'R-?h`?7?) * 9^V*-e \}o2~?nK& eF8t)F" ˱ 7]8Y8 |?/ArP'F'&ҙBh{ Ba#-,tI,J![_μrNBD gIO?>^rZV垿(R0Q +E R4yBJC|^c*k#Yg#LFQmQߟ"s8~((Q!<$U` Ea|Y9OO oGEȳWKc/_x_p$LZW?(/m(q1k͗smHٽ=^5y{) _)^lFKܾf,VHҮ=wvIݹPW[ I3v'l9315*H'݄>65U*D j3๝ke.{sy ?sqD0e gF_KS游ge4^Uv]?C|/R6:6(EDxW{k3;#$$K"zded>̍Սcm?"?&랚ꩈr^?OYtjtz~:VmT<5yu?>'g[KQsRf.>m% '&&RopoF3ڡ=oZNc@[sQi~ >gM]'_5/Q.4u E(Am7(wZo6ũ3>|=kUL%M8[[o/\|9A׍^hY6vvN,ek.rq<Ƌ)4jo}|-E3|ͭq el JQuɶ3}u햖 ikI-N]"qR޽{/vvZUx3@DZCyoxj(]͑+ X0 ܤ%6"#+4+퐙!>V,/ʣ%:B44bL μy6Dr;>vP\Y lF mlt}6:iҨ1Huwz 4Cm']~ PS}:VZZ"e ?ZR|շϦ.'zգ%NQ*oyu^u &{{m+--Kw'rl+Yu`#TO2nei|sݳW{_U'%&>##?_O>Rg޽~-;FB\ή-yk@:uMٶe ׷W&ɻ[.{ezڦt5A,A}׃]Ǐ[FEg(98a~)y!ܝc.wpdD'LOFl`y^CJ :]m_~V1#,-+5pi- pe#\RڊtDQ+c(m9 OLz~* wտ #(ʛޮM/q~Ja杈o5LՌEn z`|Ț{r[_:[bJ>w޾}ʅͫvv+..) Hlfm)$6ZpSS5 E |xAx۳I/_nfg*͟b:sC)@i&T!n ]X |g^xfOft{tIUq{'7$֐ VcTc߹b+ /pEgڷEcL1-yV&#_K_IuBrgGf`'|,ԧ6sҘ^^akg]--] @^rXx"Nx|x1O+&?ȥ"/`U 38-gg"s'QQNHgRmeS{ړ7"I9#wǕedIlga}SvJ#>qu> ͫob({mcaVa^yvv~6RE5@+6?…aym)жg>dzF)SKz_Og}ZL?@s.c?rE´j?M=W*;k J K~_~XhHuNŶyjNFa'ùt-m&b4"/@e"xdycl{k$5O_,*5P:y?:>"q5SL{ 6ixxy i;TUh< (5OLW'''8WKI7רX‹ښb[<]+RSrF(ڟIfgE˛oT@j5ѓrNN鉉wߞxѓ{,kMj?jA$ie+ .32BwbdrOXU~ e=Y'6kUƞk"}K|׮h`jVSSp^=dIqC.#8?{67,lWIIf:Z o_ۡlЬ-*όz{+t: L=ǒryUsȒAj[29qb7h,ůa>^'B3g擰XqF; l`B*ʶܿIM?7`bp&_f5!1ËD$O-ODҫhE{ |*];H~|(xR金ǔڄ9+Sn$G?4;AI8Ө!ivg !0Sq#ˠZkk!z&9vcܓA*_9-OSrݦ2Uw|֮]D1zں??駥 KO_e wo% +zLfaLOgo V\-xdqKj-=jd3==ظ&nt3gAoG-cye 4ЮK4?rOOO t"7"P_r%ˑ&JSp%0(?[chUss\S%ۖ 䫨" /?׭W#)*ns5_rhC/8=HB^^#%63VPm v5\>'2Txik,9|lSRS䶒Oc(Sحϑ#k7?YNq!ٞL+&*U)nAgܾVaݠ۰m-frjr*$cy'Me 83hcxN(.!zPŒkЄI3ל㳞S/؊7 i!6XKk+{8uFEb_;/@4 iv>c0.v}k&KJJJK _ _Ja]:*z HHNЖ\NKbI5ʠVYX,6s}}Q\v^',oŏ\e UK^RT_R~VF}÷̠XKF'9{s $&ꙷo4NDKj˰ÏtjPBkLBDxqP7o`u65--91F&&\l]x cl$.0b@]]y nqޜjl !A Sn9N|>L6Sg]Q]/]L^33//tC6A'\%'5FŒ%Mo * P(2*m|^+Hũ޺a%0|V_W4tc6+B:Vp?5_-? _߲9JPD lmuePSݓ)vy$d"w؞< JM}hvOnUV+&'L,2ҴxZeq4!Am P]/^yY{ܷٺW>0sf2Tꤩ(sL]4?hCTmXqǮVRqyPu?a|+Ns'Mk@}G7|n[Nd;\:i|ۦ"VϿDnɣ'eJqv符lMu |!xzs5C36w5vBsnfPAUR7ZoYKjCAQiIŠ3{"/1>)HtmNi]WW3|K12%%^SK@Uh"ˑQ}7~tC4^A!eHuI Rk/<=٤7 l#E6N;uR#g\&(9.pt9PeqH O;)NpZ!c˗)'C_)_+@r0ю`{":+Ov^EZI-uu㲳##Coy B `km3fw@B_g M5τ5&u:ݭcl- -vٚ]-Eb(Xk0jئ˫f)]7:1+P#tyxCCttWqݥxv mJh PXW)q^ WdtQ#4sgm,lhP  ?\Ƅ|U){Rj:LJÂvq]Ѩ8˵fG[.>FZ rJGb$Il%/!aS&`fză:w:XJɷёW.?)iX&j[H=JPH?'O&be($2gZ`) 5a,S -`lDƱӗ>CdlfQ?7>Xl =4̬rHpBO#JWt`Î{ډ8 IdʱЗ;ȣyh-_Ӑ*63v]rt:F#y* ʶ-Z:*9mCHRt ͰhquLaeM9~ibJ&reѳ&^uE, /U1e.&U-7? <)tR'tLjS8A 0g(jd| )xOC;P-7o\fc$`cߘHY=zW>kU[qٷ-U>NZs6"J=,O\Y/B<ϘioJ\'38 !fOy"݀&Muzp;")j$.JԂҡߟ; %3o/8?\ec\Vpo-B={YfLkpA=ފ /0~VB6ƾ bb5_hi'gQ:p -A[kF[p@zd*aЃ?@o ]lOVp}z5#Ԥ:}`;#j @"\M=+pUd} ym}1?:O>TC8}ԧ\^~kVP}Kj+< GOb%2Rqh "< @mxƗF`QqIƱI6)V8ܾpos-h$R6`ZŏC=-LG(0b>qRM}a5+QEc>ai{l `"X$] ;N7G g$@ t655 d&%B8XCCU/<'dܷC07;JN67HtTO:ko6ԻUALT4,C㔜)橉Aw:اZ t/n6#9􊶐83?W䴸~P'jE:^3of#SISdQ"Ō褎ԪqG).^zUgS \f=C6 8Q-w_;s!ʍwXٍJ( O̩xgZזvU]σy?V\0CLߣ)W 3V!VFw#oL舨^og.Unn$o翽M'EUXfg`o'z"\܅XE3f1ڠ؁<'!K6ݏT(qV}˱T'ZhvNSjكckֱf@gI}-yNKKjLbXl-(<62a.ϰ#lLlE5 h$5&W:t8rYir-40p|Ǩt^@̥}@4cۑιQÚ6G":Eg[}r-Am;;DSG2,*ZG|̜5 H5ILM4lGkW#Ŷ#U4-+HQzD8ite+ytRNLP*M{O/5֊` 6J,^͠M i*B7y\Ԭ=vtt)/$yH~*WRqeA*B;U@S?Mk5B;W<1xa:ʴc0MtY+:J*d֞<KuG2d'Y^ R滊M8 ,h`xUvb{l@f m=]< ѩQÅ쥭MN x ƶ82צoxʗ4}JK(>[kHq=| ⿖4zx O˫A'Lx!A}`ܮ~ ܄Bf%:c*UWIUI%S<ͯD fk$|z9JI@YGKzCBC5v3r/;k+8FЙJZ+7in):vrbʺ]3ў#mvP(Oۇ4ORȂ4r*[zq4!*mW'CeN/1k2")/8=@%wL3]Mk Y tiè5g'P9vm{H68Q.&^$DbW=MK /&*zU-p3'OtajqpzN??pI0Ef~c3ş7IzP5ji\%i%>3 *F )vʹl>Jv\xۺ'QBz\7rc5 WA-;aaغB$fi(Fjn*eWQ(lUpԩy0Cx|y4ֹ2(NهEq,p8q] 촀ք<8w+`Iۅ` :oW Xl$tm̡+8hY ˴M^ Y3w5mʆqP!BSJOAy<Oe'9fk2*mfzeiqfsW nx7n~)IRvreӪMeoV(i2XO M '6`PI3_Ca%M,W׃k,\K5L*GC>Z]nd1dE-p[sk#RvӚcosRF96ٟ ECV&uGbl 20ߛꏍꛙ -[H3;dԑ.  V# }|M4kc%,vlKɴkEzI#k.܋n}-u f!`N+.UN]Rc)4A][Pu!PJoL 3*M]I _>N8X-"D0 ʸ؛O6f8?h׎W$/3:i*cI1}kU'p`3v@g_Ӎ瀗WlcW ն GE;ՈUf3')no\.Qqvm^PP̭"N0[.L󽱨4ĸ'[ͼyyqcqoTawąV> Ovc@i؃~{>hӘLuSL?&օ` sqM.N9ɯV{M2w}>p#S\fB{H|hwH=i~Ms޽̫Ԣ-~8ACgz24("?*c3Ѫٻht3Ϩx+.9V#4qKwNSM3f˩&`:4Myѣ$Ɋ̝.þ MAmj=oybxӶ'/޵+{/Q4FZ'ʰVIʞA 'ci_ץHg5RsL6RSpuKcպ!cH ?WV *1R`j/FO\ԥD<'k=s_(T ()ݼC\z:7<49ԯuz29Zh`7)SӨs1S6Zzټ wnUN)ŎL*Q]y(pj\)jvQ*F;O8C<i~AYzlv}S}m(kw< FOOFKV@e<䠭}s(=|NcNZU&cEm0Qc}m>ەNE]UK~0NM=*Iu~UI)`X{N"Ksô媉;;Ɣݾ~PeU-~G섷YNwfk&[>ش<7BIiJ˭j#LKoc92Zs>Y 24jw dLĩ~xd>sb$8Z?oS"$C0()uuϋ>\PS4NDyk;t;3IJP<*yv|/Y1R]*ݙWFԑ 3ķ}':sJQ J7CTsj**TiK$>G*uNh|T~\gQK ΰ燌[z*"W6QDu;<_I׀h0SM#}l]vHN:nB3tk>'r7;͈=q%J"1CJBr~Y7o1>sf~썘'jZQ F'?U*ZU<1+t|0^QIm*!˹z\ƕz[u3˺*JqRQ3vh^~*͹NeRn8~^v;oEuIrz7>VWk_^t%N/¯O[|7+&ݻwVF],3{ћ'۹Vb,޽{wf{.%zj)555$ 5K7:b9j3Y/d*{EW{?nj7YJ|ri  ,zYGE]EYeL1"UJPiYboeu'e[;2CԞlhx3]0 NGj>z!3b JI*5_fK$qԩS^GZzOϟs_H[۷Ⱦc s|$w_w3o)}h5'r`;t}_'3:4݀"R7of`*!ژ's:l|yO\Ttvf_i8_Y> T|bQ,70*#/P>B*mXAR[>Kek X7$+}V$a::J0I_X[=簦)I糌nnOmtlQ爰&ҵ'k;MIJJ>˗`T2}ֶ {$GD-5օlxvp'a**Cܽ`G~c^1'333%u`YyF61`((4g6??tł 9NpDm}<ʸ1Ą49B}@c{.Nqj1))A&4|EK/ϥz, wq]ВT y;; SvNɞhv`F00 #'؜v2sx凞mjtl ')pwߖ#OwKɻ&eqLJ.;v-0VUD̰3LgN?GB@O7qP(rّihCYmw]1 \´Osi'l Luev7kP@tqiXH-=u{AAQY#yz[0%o73(Y/KtDFL[Y*bd#WdD8_8٪'EslFKoZ YWy}nZ3.|k_m93˿w,L3kxWLg@%[fLQ1b>ãp=PE^ {n1RϜA٩3g>O| <]%qU]aF[_߿W_߿W_߿W_߿W_jptinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/000077500000000000000000000000001207233610700207145ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/CC2420Config.nc000066400000000000000000000101411207233610700231560ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * An HAL abstraction of the ChipCon CC2420 radio. This abstraction * deals specifically with radio configurations. All get() and set() * commands are single-phase. After setting some values, a call to * sync() is required for the changes to propagate to the cc2420 * hardware chip. This interface allows setting multiple parameters * before calling sync(). * * @author Jonathan Hui * @version $Revision: 1.3 $ $Date: 2008/06/16 15:33:32 $ */ #include "IEEE802154.h" interface CC2420Config { /** * Sync configuration changes with the radio hardware. This only * applies to set commands below. * * @return SUCCESS if the request was accepted, FAIL otherwise. */ command error_t sync(); event void syncDone( error_t error ); /** * Change the channel of the radio, between 11 and 26 */ command uint8_t getChannel(); command void setChannel( uint8_t channel ); /** * Get the long address of the radio: set in hardware */ command ieee_eui64_t getExtAddr(); /** * Change the short address of the radio. */ async command uint16_t getShortAddr(); command void setShortAddr( uint16_t address ); /** * Change the PAN address of the radio. */ async command uint16_t getPanAddr(); command void setPanAddr( uint16_t address ); /** * @param enableAddressRecognition TRUE to turn address recognition on * @param useHwAddressRecognition TRUE to perform address recognition first * in hardware. This doesn't affect software address recognition. The * driver must sync with the chip after changing this value. */ command void setAddressRecognition(bool enableAddressRecognition, bool useHwAddressRecognition); /** * @return TRUE if address recognition is enabled */ async command bool isAddressRecognitionEnabled(); /** * @return TRUE if address recognition is performed first in hardware. */ async command bool isHwAddressRecognitionDefault(); /** * Sync must be called for acknowledgement changes to take effect * @param enableAutoAck TRUE to enable auto acknowledgements * @param hwAutoAck TRUE to default to hardware auto acks, FALSE to * default to software auto acknowledgements */ command void setAutoAck(bool enableAutoAck, bool hwAutoAck); /** * @return TRUE if hardware auto acks are the default, FALSE if software * acks are the default */ async command bool isHwAutoAckDefault(); /** * @return TRUE if auto acks are enabled */ async command bool isAutoAckEnabled(); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/CC2420Fifo.nc000066400000000000000000000070721207233610700226450ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HAL abstraction for accessing the FIFO registers of a ChipCon * CC2420 radio. * * @author Jonathan Hui * @version $Revision: 1.2 $ $Date: 2008-06-03 04:43:03 $ */ interface CC2420Fifo { /** * Start reading from the FIFO. The readDone event will * be signalled upon completion. * * @param data a pointer to the receive buffer. * @param length number of bytes to read. * @return status byte returned when sending the last address byte * of the SPI transaction. */ async command cc2420_status_t beginRead( uint8_t* COUNT_NOK(length) data, uint8_t length ); /** * Continue reading from the FIFO without having to send the address * byte again. The readDone event will be signalled * upon completion. * * @param data a pointer to the receive buffer. * @param length number of bytes to read. * @return SUCCESS always. */ async command error_t continueRead( uint8_t* COUNT_NOK(length) data, uint8_t length ); /** * Signals the completion of a read operation. * * @param data a pointer to the receive buffer. * @param length number of bytes read. * @param error notification of how the operation went */ async event void readDone( uint8_t* COUNT_NOK(length) data, uint8_t length, error_t error ); /** * Start writing the FIFO. The writeDone event will be * signalled upon completion. * * @param data a pointer to the send buffer. * @param length number of bytes to write. * @return status byte returned when sending the last address byte * of the SPI transaction. */ async command cc2420_status_t write( uint8_t* COUNT_NOK(length) data, uint8_t length ); /** * Signals the completion of a write operation. * * @param data a pointer to the send buffer. * @param length number of bytes written. * @param error notification of how the operation went */ async event void writeDone( uint8_t* COUNT_NOK(length) data, uint8_t length, error_t error ); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/CC2420Keys.nc000066400000000000000000000034251207233610700226730ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko * @author Razvan Musaloiu-E. * @author Jong Hyun Lim */ interface CC2420Keys { command error_t setKey(uint8_t keyNo, uint8_t* key); event void setKeyDone(uint8_t keyNo, uint8_t* key); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/CC2420Packet.nc000066400000000000000000000054761207233610700231770ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author David Moss * @author Chad Metcalf */ #include "message.h" interface CC2420Packet { /** * Get transmission power setting for current packet. * * @param the message */ async command uint8_t getPower( message_t* p_msg ); /** * Set transmission power for a given packet. Valid ranges are * between 0 and 31. * * @param p_msg the message. * @param power transmission power. */ async command void setPower( message_t* p_msg, uint8_t power ); /** * Get rssi value for a given packet. For received packets, it is * the received signal strength when receiving that packet. For sent * packets, it is the received signal strength of the ack if an ack * was received. */ async command int8_t getRssi( message_t* p_msg ); /** * Get lqi value for a given packet. For received packets, it is the * link quality indicator value when receiving that packet. For sent * packets, it is the link quality indicator value of the ack if an * ack was received. */ async command uint8_t getLqi( message_t* p_msg ); async command uint8_t getNetwork( message_t* ONE p_msg ); async command void setNetwork( message_t* ONE p_msg, uint8_t networkId ); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/CC2420PacketBody.nc000066400000000000000000000043001207233610700237760ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Internal interface for the CC2420 to get portions of a packet. * @author David Moss */ interface CC2420PacketBody { /** * @return pointer to the cc2420_header_t of the given message */ async command cc2420_header_t * ONE getHeader(message_t * ONE msg); /** * @return pointer to the payload region of the message, after any headers * works with extended addressing mode */ async command uint8_t * getPayload( message_t* msg); /** * @return pointer to the cc2420_metadata_t of the given message */ async command cc2420_metadata_t * ONE getMetadata(message_t * ONE msg); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/CC2420Power.nc000066400000000000000000000063321207233610700230540ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * An HAL abstraction of the ChipCon CC2420 radio. This abstraction * deals specifically with radio power operations (e.g. voltage * regulator, oscillator, etc). However, it does not include * transmission power, see the CC2420Config interface. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2007-07-04 00:37:14 $ */ interface CC2420Power { /** * Start the voltage regulator on the CC2420. On SUCCESS, * startVReg() will be signalled when the voltage * regulator is fully on. * * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t startVReg(); /** * Signals that the voltage regulator has been started. */ async event void startVRegDone(); /** * Stop the voltage regulator immediately. * * @return SUCCESS always */ async command error_t stopVReg(); /** * Start the oscillator. On SUCCESS, startOscillator * will be signalled when the oscillator has been started. * * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t startOscillator(); /** * Signals that the oscillator has been started. */ async event void startOscillatorDone(); /** * Stop the oscillator. * * @return SUCCESS if the oscillator was stopped, FAIL otherwise. */ async command error_t stopOscillator(); /** * Enable RX. * * @return SUCCESS if receive mode has been enabled, FAIL otherwise. */ async command error_t rxOn(); /** * Disable RX. * * @return SUCCESS if receive mode has been disabled, FAIL otherwise. */ async command error_t rfOff(); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/CC2420Ram.nc000066400000000000000000000051071207233610700224760ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HAL abstraction for accessing theRAM of a ChipCon CC2420 radio. * * @author Jonathan Hui * @version $Revision: 1.2 $ $Date: 2008-06-03 04:43:03 $ */ #include "CC2420.h" interface CC2420Ram { /** * Read data from a RAM. This operation is sychronous. * * @param offset within the field. * @param data a pointer to the receive buffer. * @param length number of bytes to read. * @return status byte returned when sending the last byte * of the SPI transaction. */ async command cc2420_status_t read( uint8_t offset, uint8_t* COUNT_NOK(length) data, uint8_t length ); /** * Write data to RAM. This operation is sychronous. * * @param offset within the field. * @param data a pointer to the send buffer. * @param length number of bytes to write. * @return status byte returned when sending the last address byte * of the SPI transaction. */ async command cc2420_status_t write( uint8_t offset, uint8_t* COUNT_NOK(length) data, uint8_t length ); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/CC2420Receive.nc000066400000000000000000000045341207233610700233440ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Low-level abstraction of the receive path implementation for the * ChipCon CC2420 radio. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2008-06-17 07:28:24 $ */ #include "message.h" interface CC2420Receive { /** * Notification that an SFD capture has occured. * * @param time at which the capture happened. */ async command void sfd( uint32_t time ); /** * Notification that the packet has been dropped by the radio * (e.g. due to address rejection). */ async command void sfd_dropped(); /** * Signals that a message has been received. * * @param type of the message received. * @param message pointer to message received. */ async event void receive( uint8_t type, message_t* ONE_NOK message ); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/CC2420Register.nc000066400000000000000000000047571207233610700235550ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface representing one of the Read/Write registers on the * CC2420 radio. The return values (when appropriate) refer to the * status byte returned on the CC2420 SO pin. A full list of RW * registers can be found on page 61 of the CC2420 datasheet (rev * 1.2). Page 25 of the same document describes the protocol for * interacting with these registers over the CC2420 SPI bus. * * @author Philip Levis * @version $Revision: 1.3 $ $Date: 2010-06-29 22:07:44 $ */ #include "CC2420.h" interface CC2420Register { /** * Read a 16-bit data word from the register. * * @param data pointer to place the register value. * @return status byte from the read. */ async command cc2420_status_t read(uint16_t* data); /** * Write a 16-bit data word to the register. * * @param data value to write to register. * @return status byte from the write. */ async command cc2420_status_t write(uint16_t data); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/CC2420SecurityMode.nc000066400000000000000000000037361207233610700244010ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko * @author Razvan Musaloiu-E. * @author Jong Hyun Lim */ interface CC2420SecurityMode { command error_t setCtr(message_t* msg, uint8_t setKey, uint8_t setSkip); // Valid sizes are: 4, 6, 8, 10, 12, 14, 16 command error_t setCbcMac(message_t* msg, uint8_t setKey, uint8_t setSkip, uint8_t size); command error_t setCcm(message_t* msg, uint8_t setKey, uint8_t setSkip, uint8_t size); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/CC2420Strobe.nc000066400000000000000000000042541207233610700232170ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface representing one of the CC2420 command strobe registers. * Writing to one of these registers enacts a command on the CC2420, * such as power-up, transmission, or clear a FIFO. * * @author Philip Levis * @version $Revision: 1.3 $ $Date: 2010-06-29 22:07:44 $ */ #include "CC2420.h" interface CC2420Strobe { /** * Send a command strobe to the register. The return value is the * CC2420 status register. Table 5 on page 27 of the CC2420 * datasheet (v1.2) describes the contents of this register. * * @return Status byte from the CC2420. */ async command cc2420_status_t strobe(); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/CC2420Transmit.nc000066400000000000000000000061571207233610700235660ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Low-level abstraction for the transmit path implementaiton of the * ChipCon CC2420 radio. * * @author Jonathan Hui * @version $Revision: 1.2 $ $Date: 2008-06-03 04:43:03 $ */ #include "message.h" interface CC2420Transmit { /** * Send a message * * @param p_msg message to send. * @param useCca TRUE if this Tx should use clear channel assessments * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t send( message_t* ONE p_msg, bool useCca ); /** * Send the previous message again * @param useCca TRUE if this re-Tx should use clear channel assessments * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t resend(bool useCca); /** * Cancel sending of the message. * * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t cancel(); /** * Signal that a message has been sent * * @param p_msg message to send. * @param error notifaction of how the operation went. */ async event void sendDone( message_t* ONE_NOK p_msg, error_t error ); /** * Modify the contents of a packet. This command can only be used * when an SFD capture event for the sending packet is signalled. * * @param offset in the message to start modifying. * @param buf to data to write * @param len of bytes to write * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t modify( uint8_t offset, uint8_t* COUNT_NOK(len) buf, uint8_t len ); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/ChipSpiResource.nc000066400000000000000000000025511207233610700243100ustar00rootroot00000000000000 /** * Interface for the SPI resource for an entire chip. The chip accesses * the platform SPI resource one time, but can have multiple clients * using the SPI bus on top. When all of the clients are released, the * chip will normally try to release itself from the platforms SPI bus. * In some cases, this isn't desirable - so even though upper components * aren't actively using the SPI bus, they can tell the chip to hold onto * it so they can have immediate access when they need. * * Any component that aborts a release MUST attempt the release at a later * time if they don't acquire and release the SPI bus naturally after the * abort. * * @author David Moss */ interface ChipSpiResource { /** * The SPI bus is about to be automatically released. Modules that aren't * using the SPI bus but still want the SPI bus to stick around must call * abortRelease() within the event. */ async event void releasing(); /** * Abort the release of the SPI bus. This must be called only with the * releasing() event */ async command void abortRelease(); /** * Release the SPI bus if there are no objections * @return SUCCESS if the SPI bus is released from the chip. * FAIL if the SPI bus is already in use. * EBUSY if some component aborted the release. */ async command error_t attemptRelease(); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/PacketTimeSyncOffset.nc000066400000000000000000000056211207233610700252740ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti, Brano Kusy * * Interface for one hop time synchronization. Allows to modify timesync * messages in the MAC layer with elapsed time of an event (ETA timesync * primitive). Interface also provides a command to determine offset within * a CC2420 packet, where the timesync ETA value is stored. word 'timestamping' * used in describing commands does not refer to metadata.timestamp value, * rather it refers to the timesync ETA timestamp which is part of data * payload and is transmitted over the air. */ interface PacketTimeSyncOffset { /** * @param 'message_t *ONE msg' message to examine. * * Returns TRUE if the current message should be timestamped. */ async command bool isSet(message_t* msg); /** * @param 'message_t *ONE msg' message to examine. * * Returns the offset of where the timesync timestamp is sotred in a * CC2420 packet */ async command uint8_t get(message_t* msg); /** * @param 'message_t *ONE msg' message to modify. * * Sets the current message to be timestamped in the MAC layer. */ async command void set(message_t* msg); /** * @param 'message_t *ONE msg' message to modify. * * Cancels any pending requests to timestamp the message in MAC. */ async command void cancel(message_t* msg); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/PowerCycle.nc000066400000000000000000000042401207233610700233120ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Manage the CC2420's duty cycle and power management * @author David Moss */ interface PowerCycle { /** * Set the sleep interval, in binary milliseconds * @param sleepIntervalMs the sleep interval in [ms] */ command void setSleepInterval(uint16_t sleepIntervalMs); /** * @return the sleep interval in [ms] */ command uint16_t getSleepInterval(); /** * @deprecated Should be removed in the future when the PowerCycle * component does packet-level detects and is in full control of radio * power. */ event void detected(); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/RadioBackoff.nc000066400000000000000000000074031207233610700235540ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Interface to request and specify backoff periods for messages * * We use a call back method for setting the backoff as opposed to * events that return backoff values. * * This is because of fan-out issues with multiple components wanting to * affect backoffs for whatever they're interested in: * If you signal out an *event* to request an initial backoff and * several components happen to be listening, then those components * would be required to return a backoff value. We don't want that * behavior. * With this strategy, components can listen for the requests and then * decide if they want to affect the behavior. If the component wants to * affect the behavior, it calls back using the setXYZBackoff(..) command. * If several components call back, then the last component to get its * word in has the final say. * * @author David Moss */ interface RadioBackoff { /** * Must be called within a requestInitialBackoff event * @param backoffTime the amount of time in some unspecified units to backoff */ async command void setInitialBackoff(uint16_t backoffTime); /** * Must be called within a requestCongestionBackoff event * @param backoffTime the amount of time in some unspecified units to backoff */ async command void setCongestionBackoff(uint16_t backoffTime); /** * Enable CCA for the outbound packet. Must be called within a requestCca * event * @param ccaOn TRUE to enable CCA, which is the default. */ async command void setCca(bool ccaOn); /** * Request for input on the initial backoff * Reply using setInitialBackoff(..) * @param msg pointer to the message being sent */ async event void requestInitialBackoff(message_t * ONE msg); /** * Request for input on the congestion backoff * Reply using setCongestionBackoff(..) * @param msg pointer to the message being sent */ async event void requestCongestionBackoff(message_t * ONE msg); /** * Request for input on whether or not to use CCA on the outbound packet. * Replies should come in the form of setCca(..) * @param msg pointer to the message being sent */ async event void requestCca(message_t * ONE msg); } tinyos-2.1.2+dfsg/tos/chips/cc2420/interfaces/ReceiveIndicator.nc000066400000000000000000000035411207233610700244600ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Interface to obtain energy, byte, and packet receive check readings * @author David Moss */ interface ReceiveIndicator { /** * @return TRUE if the indicator is showing we are actively receiving at this * level */ command bool isReceiving(); } tinyos-2.1.2+dfsg/tos/chips/cc2420/link/000077500000000000000000000000001207233610700175265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/link/PacketLinkC.nc000066400000000000000000000044201207233610700222000ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Reliable Packet Link Functionality * @author David Moss * @author Jon Wyant */ #warning "*** USING PACKET LINK LAYER" configuration PacketLinkC { provides { interface Send; interface PacketLink; } uses { interface Send as SubSend; } } implementation { components PacketLinkP, CC2420PacketC, RandomC, new StateC() as SendStateC, new TimerMilliC() as DelayTimerC; PacketLink = PacketLinkP; Send = PacketLinkP.Send; SubSend = PacketLinkP.SubSend; PacketLinkP.SendState -> SendStateC; PacketLinkP.DelayTimer -> DelayTimerC; PacketLinkP.PacketAcknowledgements -> CC2420PacketC; PacketLinkP.CC2420PacketBody -> CC2420PacketC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/link/PacketLinkDummyC.nc000066400000000000000000000037771207233610700232320ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Dummy configuration for PacketLink Layer * @author David Moss * @author Jon Wyant */ configuration PacketLinkDummyC { provides { interface Send; interface PacketLink; } uses { interface Send as SubSend; } } implementation { components PacketLinkDummyP, CC2420RadioC; PacketLink = PacketLinkDummyP; Send = SubSend; PacketLinkDummyP.PacketAcknowledgements -> CC2420RadioC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/link/PacketLinkDummyP.nc000066400000000000000000000056751207233610700232460ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Dummy module for Packet Link layer * @author David Moss * @author Jon Wyant */ module PacketLinkDummyP { provides { interface PacketLink; } uses { interface PacketAcknowledgements; } } implementation { /***************** PacketLink Commands ***************/ /** * Set the maximum number of times attempt message delivery * Default is 0 * @param msg * @param maxRetries the maximum number of attempts to deliver * the message */ command void PacketLink.setRetries(message_t *msg, uint16_t maxRetries) { } /** * Set a delay between each retry attempt * @param msg * @param retryDelay the delay betweeen retry attempts, in milliseconds */ command void PacketLink.setRetryDelay(message_t *msg, uint16_t retryDelay) { } /** * @return the maximum number of retry attempts for this message */ command uint16_t PacketLink.getRetries(message_t *msg) { return 0; } /** * @return the delay between retry attempts in ms for this message */ command uint16_t PacketLink.getRetryDelay(message_t *msg) { return 0; } /** * @return TRUE if the message was delivered. * This should always be TRUE if the message was sent to the * AM_BROADCAST_ADDR */ command bool PacketLink.wasDelivered(message_t *msg) { return call PacketAcknowledgements.wasAcked(msg); } } tinyos-2.1.2+dfsg/tos/chips/cc2420/link/PacketLinkP.nc000066400000000000000000000151611207233610700222210ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Reliable Packet Link Functionality * @author David Moss * @author Jon Wyant */ #include "CC2420.h" module PacketLinkP { provides { interface Send; interface PacketLink; } uses { interface Send as SubSend; interface State as SendState; interface PacketAcknowledgements; interface Timer as DelayTimer; interface CC2420PacketBody; } } implementation { /** The message currently being sent */ message_t *currentSendMsg; /** Length of the current send message */ uint8_t currentSendLen; /** The length of the current send message */ uint16_t totalRetries; /** * Send States */ enum { S_IDLE, S_SENDING, }; /***************** Prototypes ***************/ task void send(); void signalDone(error_t error); /***************** PacketLink Commands ***************/ /** * Set the maximum number of times attempt message delivery * Default is 0 * @param msg * @param maxRetries the maximum number of attempts to deliver * the message */ command void PacketLink.setRetries(message_t *msg, uint16_t maxRetries) { (call CC2420PacketBody.getMetadata(msg))->maxRetries = maxRetries; } /** * Set a delay between each retry attempt * @param msg * @param retryDelay the delay betweeen retry attempts, in milliseconds */ command void PacketLink.setRetryDelay(message_t *msg, uint16_t retryDelay) { (call CC2420PacketBody.getMetadata(msg))->retryDelay = retryDelay; } /** * @return the maximum number of retry attempts for this message */ command uint16_t PacketLink.getRetries(message_t *msg) { return (call CC2420PacketBody.getMetadata(msg))->maxRetries; } /** * @return the delay between retry attempts in ms for this message */ command uint16_t PacketLink.getRetryDelay(message_t *msg) { return (call CC2420PacketBody.getMetadata(msg))->retryDelay; } /** * @return TRUE if the message was delivered. */ command bool PacketLink.wasDelivered(message_t *msg) { return call PacketAcknowledgements.wasAcked(msg); } /***************** Send Commands ***************/ /** * Each call to this send command gives the message a single * DSN that does not change for every copy of the message * sent out. For messages that are not acknowledged, such as * a broadcast address message, the receiving end does not * signal receive() more than once for that message. */ command error_t Send.send(message_t *msg, uint8_t len) { error_t error; if(call SendState.requestState(S_SENDING) == SUCCESS) { currentSendMsg = msg; currentSendLen = len; totalRetries = 0; if(call PacketLink.getRetries(msg) > 0) { call PacketAcknowledgements.requestAck(msg); } if((error = call SubSend.send(msg, len)) != SUCCESS) { call SendState.toIdle(); } return error; } return EBUSY; } command error_t Send.cancel(message_t *msg) { if(currentSendMsg == msg) { call SendState.toIdle(); return call SubSend.cancel(msg); } return FAIL; } command uint8_t Send.maxPayloadLength() { return call SubSend.maxPayloadLength(); } command void *Send.getPayload(message_t* msg, uint8_t len) { return call SubSend.getPayload(msg, len); } /***************** SubSend Events ***************/ event void SubSend.sendDone(message_t* msg, error_t error) { if(call SendState.getState() == S_SENDING) { totalRetries++; if(call PacketAcknowledgements.wasAcked(msg)) { signalDone(SUCCESS); return; } else if(totalRetries < call PacketLink.getRetries(currentSendMsg)) { if(call PacketLink.getRetryDelay(currentSendMsg) > 0) { // Resend after some delay call DelayTimer.startOneShot(call PacketLink.getRetryDelay(currentSendMsg)); } else { // Resend immediately post send(); } return; } } signalDone(error); } /***************** Timer Events ****************/ /** * When this timer is running, that means we're sending repeating messages * to a node that is receive check duty cycling. */ event void DelayTimer.fired() { if(call SendState.getState() == S_SENDING) { post send(); } } /***************** Tasks ***************/ task void send() { if(call PacketLink.getRetries(currentSendMsg) > 0) { call PacketAcknowledgements.requestAck(currentSendMsg); } if(call SubSend.send(currentSendMsg, currentSendLen) != SUCCESS) { post send(); } } /***************** Functions ***************/ void signalDone(error_t error) { call DelayTimer.stop(); call SendState.toIdle(); // update only if retries were explicitly asked for if((call CC2420PacketBody.getMetadata(currentSendMsg))->maxRetries > 0) (call CC2420PacketBody.getMetadata(currentSendMsg))->maxRetries = totalRetries; signal Send.sendDone(currentSendMsg, error); } } tinyos-2.1.2+dfsg/tos/chips/cc2420/link/readme.txt000066400000000000000000000003361207233610700215260ustar00rootroot00000000000000PacketLink is used for link-layer retransmissions guided by your own application requirements. It will fail if it receives false-acknowledgements, which is completely possible in 802.15.4. See TEP 127 for more details. tinyos-2.1.2+dfsg/tos/chips/cc2420/lowpan/000077500000000000000000000000001207233610700200715ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/lowpan/CC2420TinyosNetworkC.nc000066400000000000000000000075721207233610700241060ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Original TinyOS T-Frames use a packet header that is not compatible with * other 6LowPAN networks. They do not include the network byte * responsible for identifying the packing as being sourced from a TinyOS * network. * * TinyOS I-Frames are interoperability packets that do include a network * byte as defined by 6LowPAN specifications. The I-Frame header type is * the default packet header used in TinyOS networks. * * Since either packet header is acceptable, this layer must do some * preprocessing (sorry) to figure out whether or not it needs to include * the functionality to process I-frames. If I-Frames are used, then * the network byte is added on the way out and checked on the way in. * If the packet came from a network different from a TinyOS network, the * user may access it through the DispatchP's NonTinyosReceive[] Receive * interface and process it in a different radio stack. * * If T-Frames are used instead, this layer is simply pass-through wiring to the * layer beneath. * * Define "CC2420_IFRAME_TYPE" to use the interoperability frame and * this layer * * @author David Moss */ #include "CC2420.h" #include "Ieee154.h" configuration CC2420TinyosNetworkC { provides { interface Resource[uint8_t clientId]; interface Send; interface Receive; interface Send as ActiveSend; interface Receive as ActiveReceive; interface Packet as BarePacket; } uses { interface Receive as SubReceive; interface Send as SubSend; } } implementation { enum { TINYOS_N_NETWORKS = uniqueCount(RADIO_SEND_RESOURCE), }; components MainC; components CC2420TinyosNetworkP; components CC2420PacketC; components new FcfsResourceQueueC(TINYOS_N_NETWORKS); CC2420TinyosNetworkP.BareSend = Send; CC2420TinyosNetworkP.BareReceive = Receive; CC2420TinyosNetworkP.BarePacket = BarePacket; CC2420TinyosNetworkP.SubSend = SubSend; CC2420TinyosNetworkP.SubReceive = SubReceive; CC2420TinyosNetworkP.Resource = Resource; CC2420TinyosNetworkP.ActiveSend = ActiveSend; CC2420TinyosNetworkP.ActiveReceive = ActiveReceive; CC2420TinyosNetworkP.CC2420Packet -> CC2420PacketC; CC2420TinyosNetworkP.CC2420PacketBody -> CC2420PacketC; CC2420TinyosNetworkP.Queue -> FcfsResourceQueueC; MainC.SoftwareInit -> FcfsResourceQueueC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/lowpan/CC2420TinyosNetworkP.nc000066400000000000000000000171241207233610700241150ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Fills in the network ID byte for outgoing packets for compatibility with * other 6LowPAN networks. Filters incoming packets that are not * TinyOS network compatible. Provides the 6LowpanSnoop interface to * sniff for packets that were not originated from TinyOS. * * @author David Moss */ #include "CC2420.h" #include "Ieee154.h" module CC2420TinyosNetworkP @safe() { provides { interface Resource[uint8_t client]; interface Send as BareSend; interface Receive as BareReceive; interface Send as ActiveSend; interface Receive as ActiveReceive; interface Packet as BarePacket; } uses { interface Send as SubSend; interface Receive as SubReceive; interface CC2420Packet; interface CC2420PacketBody; interface ResourceQueue as Queue; } } implementation { enum { OWNER_NONE = 0xff, TINYOS_N_NETWORKS = uniqueCount("RADIO_SEND_RESOURCE"), } state; enum { CLIENT_AM, CLIENT_BARE, } m_busy_client; norace uint8_t resource_owner = OWNER_NONE, next_owner; command error_t ActiveSend.send(message_t* msg, uint8_t len) { call CC2420Packet.setNetwork(msg, TINYOS_6LOWPAN_NETWORK_ID); m_busy_client = CLIENT_AM; return call SubSend.send(msg, len); } command error_t ActiveSend.cancel(message_t* msg) { return call SubSend.cancel(msg); } command uint8_t ActiveSend.maxPayloadLength() { return call SubSend.maxPayloadLength(); } command void* ActiveSend.getPayload(message_t* msg, uint8_t len) { if (len <= call ActiveSend.maxPayloadLength()) { return msg->data; } else { return NULL; } } /***************** BarePacket Commands ****************/ command void BarePacket.clear(message_t *msg) { memset(msg, 0, sizeof(message_t)); } command uint8_t BarePacket.payloadLength(message_t *msg) { cc2420_header_t *hdr = call CC2420PacketBody.getHeader(msg); return hdr->length + 1 - MAC_FOOTER_SIZE; } command void BarePacket.setPayloadLength(message_t* msg, uint8_t len) { cc2420_header_t *hdr = call CC2420PacketBody.getHeader(msg); hdr->length = len - 1 + MAC_FOOTER_SIZE; } command uint8_t BarePacket.maxPayloadLength() { return TOSH_DATA_LENGTH + sizeof(cc2420_header_t); } command void* BarePacket.getPayload(message_t* msg, uint8_t len) { } /***************** Send Commands ****************/ command error_t BareSend.send(message_t* msg, uint8_t len) { call BarePacket.setPayloadLength(msg, len); m_busy_client = CLIENT_BARE; return call SubSend.send(msg, 0); } command error_t BareSend.cancel(message_t* msg) { return call SubSend.cancel(msg); } command uint8_t BareSend.maxPayloadLength() { return call BarePacket.maxPayloadLength(); } command void* BareSend.getPayload(message_t* msg, uint8_t len) { #ifndef TFRAMES_ENABLED cc2420_header_t *hdr = call CC2420PacketBody.getHeader(msg); return hdr; #else // you really can't use BareSend with TFRAMES #endif } /***************** SubSend Events *****************/ event void SubSend.sendDone(message_t* msg, error_t error) { if (m_busy_client == CLIENT_AM) { signal ActiveSend.sendDone(msg, error); } else { signal BareSend.sendDone(msg, error); } } /***************** SubReceive Events ***************/ event message_t *SubReceive.receive(message_t *msg, void *payload, uint8_t len) { uint8_t network = call CC2420Packet.getNetwork(msg); if(!(call CC2420PacketBody.getMetadata(msg))->crc) { return msg; } #ifndef TFRAMES_ENABLED if (network == TINYOS_6LOWPAN_NETWORK_ID) { return signal ActiveReceive.receive(msg, payload, len); } else { return signal BareReceive.receive(msg, call BareSend.getPayload(msg, len), len + sizeof(cc2420_header_t)); } #else return signal ActiveReceive.receive(msg, payload, len); #endif } /***************** Resource ****************/ // SDH : 8-7-2009 : testing if there's more then one client allows // the compiler to eliminate most of the logic when there's only one // client. task void grantTask() { if (TINYOS_N_NETWORKS > 1) { if (resource_owner == OWNER_NONE && !(call Queue.isEmpty())) { resource_owner = call Queue.dequeue(); if (resource_owner != OWNER_NONE) { signal Resource.granted[resource_owner](); } } } else { if (next_owner != resource_owner) { resource_owner = next_owner; signal Resource.granted[resource_owner](); } } } async command error_t Resource.request[uint8_t id]() { post grantTask(); if (TINYOS_N_NETWORKS > 1) { return call Queue.enqueue(id); } else { if (id == resource_owner) { return EALREADY; } else { next_owner = id; return SUCCESS; } } } async command error_t Resource.immediateRequest[uint8_t id]() { if (resource_owner == id) return EALREADY; if (TINYOS_N_NETWORKS > 1) { if (resource_owner == OWNER_NONE && call Queue.isEmpty()) { resource_owner = id; return SUCCESS; } return FAIL; } else { resource_owner = id; return SUCCESS; } } async command error_t Resource.release[uint8_t id]() { if (TINYOS_N_NETWORKS > 1) { post grantTask(); } resource_owner = OWNER_NONE; return SUCCESS; } async command bool Resource.isOwner[uint8_t id]() { return (id == resource_owner); } /***************** Defaults ****************/ default event message_t *BareReceive.receive(message_t *msg, void *payload, uint8_t len) { return msg; } default event void BareSend.sendDone(message_t *msg, error_t error) { } default event message_t *ActiveReceive.receive(message_t *msg, void *payload, uint8_t len) { return msg; } default event void ActiveSend.sendDone(message_t *msg, error_t error) { } default event void Resource.granted[uint8_t client]() { call Resource.release[client](); } } tinyos-2.1.2+dfsg/tos/chips/cc2420/lowpan/readme.txt000066400000000000000000000000421207233610700220630ustar00rootroot00000000000000See TEP 125 for more information. tinyos-2.1.2+dfsg/tos/chips/cc2420/lpl/000077500000000000000000000000001207233610700173605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/lpl/DefaultLpl.h000066400000000000000000000065551207233610700216000ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author David Moss * @author Tony O'Donovan */ #ifndef DEFAULTLPL_H #define DEFAULTLPL_H /** * Low Power Listening Send States */ typedef enum { S_LPL_NOT_SENDING, // DEFAULT S_LPL_FIRST_MESSAGE, // 1. Sending the first message S_LPL_SENDING, // 2. Sending all other messages S_LPL_CLEAN_UP, // 3. Clean up the transmission } lpl_sendstate_t; /** * This is a measured value of the time in ms the radio is actually on * We round this up to err on the side of better performance ratios * This includes the acknowledgement wait period and backoffs, * which can typically be much longer than the transmission. * * Measured by Tony O'Donovan */ #ifndef DUTY_ON_TIME #define DUTY_ON_TIME 11 #endif /** * The maximum number of CCA checks performed on each wakeup. * If there are too few, the receiver may wake up between messages * and not detect the transmitter. * * The on-time had to increase from the original version to allow multiple * transmitters to co-exist. This is due to using ack's, which then requires us * to extend the backoff period. In networks that transmit frequently, possibly * with multiple transmitters, this power scheme makes sense. * * In networks that transmit very infrequently or without multiple transmitters, * it makes more sense to go with no acks and no backoffs and make the * receive check as short as possible. */ #ifndef MAX_LPL_CCA_CHECKS #if defined(PLATFORM_TELOSB) || defined(PLATFORM_TMOTE) #define MAX_LPL_CCA_CHECKS 400 #else #define MAX_LPL_CCA_CHECKS 400 #endif #endif /** * The minimum number of samples that must be taken in CC2420DutyCycleP * that show the channel is not clear before a detection event is issued */ #ifndef MIN_SAMPLES_BEFORE_DETECT #define MIN_SAMPLES_BEFORE_DETECT 3 #endif #endif tinyos-2.1.2+dfsg/tos/chips/cc2420/lpl/DefaultLplC.nc000066400000000000000000000063771207233610700220560ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Low Power Listening for the CC2420 * @author David Moss */ #include "DefaultLpl.h" #warning "*** USING DEFAULT LOW POWER COMMUNICATIONS ***" configuration DefaultLplC { provides { interface LowPowerListening; interface Send; interface Receive; interface SplitControl; interface State as SendState; } uses { interface Send as SubSend; interface Receive as SubReceive; interface SplitControl as SubControl; } } implementation { components MainC, DefaultLplP, PowerCycleC, CC2420RadioC, CC2420CsmaC, CC2420TransmitC, CC2420PacketC, RandomC, new StateC() as SendStateC, new TimerMilliC() as OffTimerC, new TimerMilliC() as SendDoneTimerC, SystemLowPowerListeningC, LedsC; LowPowerListening = DefaultLplP; Send = DefaultLplP; Receive = DefaultLplP; SplitControl = PowerCycleC; SendState = SendStateC; SubControl = DefaultLplP.SubControl; SubReceive = DefaultLplP.SubReceive; SubSend = DefaultLplP.SubSend; MainC.SoftwareInit -> DefaultLplP; DefaultLplP.SplitControlState -> PowerCycleC.SplitControlState; DefaultLplP.RadioPowerState -> PowerCycleC.RadioPowerState; DefaultLplP.SendState -> SendStateC; DefaultLplP.OffTimer -> OffTimerC; DefaultLplP.SendDoneTimer -> SendDoneTimerC; DefaultLplP.PowerCycle -> PowerCycleC; DefaultLplP.Resend -> CC2420TransmitC; DefaultLplP.PacketAcknowledgements -> CC2420RadioC; DefaultLplP.CC2420PacketBody -> CC2420PacketC; DefaultLplP.RadioBackoff -> CC2420CsmaC; DefaultLplP.Random -> RandomC; DefaultLplP.Leds -> LedsC; DefaultLplP.SystemLowPowerListening -> SystemLowPowerListeningC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/lpl/DefaultLplP.nc000066400000000000000000000277541207233610700220750ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Low Power Listening for the CC2420. This component is responsible for * delivery of an LPL packet, and for turning off the radio when the radio * has run out of tasks. * * The PowerCycle component is responsible for duty cycling the radio * and performing receive detections. * * @author David Moss */ #include "Lpl.h" #include "DefaultLpl.h" #include "AM.h" module DefaultLplP { provides { interface Init; interface LowPowerListening; interface Send; interface Receive; } uses { interface Send as SubSend; interface CC2420Transmit as Resend; interface RadioBackoff; interface Receive as SubReceive; interface SplitControl as SubControl; interface PowerCycle; interface CC2420PacketBody; interface PacketAcknowledgements; interface State as SendState; interface State as RadioPowerState; interface State as SplitControlState; interface Timer as OffTimer; interface Timer as SendDoneTimer; interface Random; interface Leds; interface SystemLowPowerListening; } } implementation { /** The message currently being sent */ norace message_t *currentSendMsg; /** The length of the current send message */ uint8_t currentSendLen; /** TRUE if the radio is duty cycling and not always on */ bool dutyCycling; /** * Radio Power State */ enum { S_OFF, // off by default S_TURNING_ON, S_ON, S_TURNING_OFF, }; /** * Send States */ enum { S_IDLE, S_SENDING, }; enum { ONE_MESSAGE = 0, }; /***************** Prototypes ***************/ task void send(); task void resend(); task void startRadio(); task void stopRadio(); void initializeSend(); void startOffTimer(); /***************** Init Commands ***************/ command error_t Init.init() { dutyCycling = FALSE; return SUCCESS; } /***************** LowPowerListening Commands ***************/ /** * Set this this node's radio wakeup interval, in milliseconds. * Once every interval, the node will sleep and perform an Rx check * on the radio. Setting the wakeup interval to 0 will keep the radio * always on. * * @param intervalMs the length of this node's wakeup interval, in [ms] */ command void LowPowerListening.setLocalWakeupInterval(uint16_t intervalMs) { call PowerCycle.setSleepInterval(intervalMs); } /** * @return the local node's wakeup interval, in [ms] */ command uint16_t LowPowerListening.getLocalWakeupInterval() { return call PowerCycle.getSleepInterval(); } /** * Configure this outgoing message so it can be transmitted to a neighbor mote * with the specified wakeup interval. * @param msg Pointer to the message that will be sent * @param intervalMs The receiving node's wakeup interval, in [ms] */ command void LowPowerListening.setRemoteWakeupInterval(message_t *msg, uint16_t intervalMs) { (call CC2420PacketBody.getMetadata(msg))->rxInterval = intervalMs; } /** * @return the destination node's wakeup interval configured in this message */ command uint16_t LowPowerListening.getRemoteWakeupInterval(message_t *msg) { return (call CC2420PacketBody.getMetadata(msg))->rxInterval; } /***************** Send Commands ***************/ /** * Each call to this send command gives the message a single * DSN that does not change for every copy of the message * sent out. For messages that are not acknowledged, such as * a broadcast address message, the receiving end does not * signal receive() more than once for that message. */ command error_t Send.send(message_t *msg, uint8_t len) { if(call SplitControlState.getState() == S_OFF) { // Everything is off right now, start SplitControl and try again return EOFF; } if(call SendState.requestState(S_LPL_SENDING) == SUCCESS) { currentSendMsg = msg; currentSendLen = len; // In case our off timer is running... call OffTimer.stop(); call SendDoneTimer.stop(); if(call RadioPowerState.getState() == S_ON) { initializeSend(); return SUCCESS; } else { post startRadio(); } return SUCCESS; } return EBUSY; } command error_t Send.cancel(message_t *msg) { if(currentSendMsg == msg) { call SendState.toIdle(); call SendDoneTimer.stop(); startOffTimer(); return call SubSend.cancel(msg); } return FAIL; } command uint8_t Send.maxPayloadLength() { return call SubSend.maxPayloadLength(); } command void *Send.getPayload(message_t* msg, uint8_t len) { return call SubSend.getPayload(msg, len); } /***************** RadioBackoff Events ****************/ async event void RadioBackoff.requestInitialBackoff(message_t *msg) { if((call CC2420PacketBody.getMetadata(msg))->rxInterval > ONE_MESSAGE) { call RadioBackoff.setInitialBackoff( call Random.rand16() % (0x4 * CC2420_BACKOFF_PERIOD) + CC2420_MIN_BACKOFF); } } async event void RadioBackoff.requestCongestionBackoff(message_t *msg) { if((call CC2420PacketBody.getMetadata(msg))->rxInterval > ONE_MESSAGE) { call RadioBackoff.setCongestionBackoff( call Random.rand16() % (0x3 * CC2420_BACKOFF_PERIOD) + CC2420_MIN_BACKOFF); } } async event void RadioBackoff.requestCca(message_t *msg) { } /***************** DutyCycle Events ***************/ /** * A transmitter was detected. You must now take action to * turn the radio off when the transaction is complete. */ event void PowerCycle.detected() { // At this point, the duty cycling has been disabled temporary // and it will be this component's job to turn the radio back off // Wait long enough to see if we actually receive a packet, which is // just a little longer in case there is more than one lpl transmitter on // the channel. startOffTimer(); } /***************** SubControl Events ***************/ event void SubControl.startDone(error_t error) { if(!error) { call RadioPowerState.forceState(S_ON); if(call SendState.getState() == S_LPL_FIRST_MESSAGE || call SendState.getState() == S_LPL_SENDING) { initializeSend(); } } } event void SubControl.stopDone(error_t error) { if(!error) { if(call SendState.getState() == S_LPL_FIRST_MESSAGE || call SendState.getState() == S_LPL_SENDING) { // We're in the middle of sending a message; start the radio back up post startRadio(); } else { call OffTimer.stop(); call SendDoneTimer.stop(); } } } /***************** SubSend Events ***************/ event void SubSend.sendDone(message_t* msg, error_t error) { switch(call SendState.getState()) { case S_LPL_SENDING: if(call SendDoneTimer.isRunning()) { if(!call PacketAcknowledgements.wasAcked(msg)) { post resend(); return; } } break; case S_LPL_CLEAN_UP: /** * We include this state so upper layers can't send a different message * before the last message gets done sending */ break; default: break; } call SendState.toIdle(); call SendDoneTimer.stop(); startOffTimer(); signal Send.sendDone(msg, error); } /***************** SubReceive Events ***************/ /** * If the received message is new, we signal the receive event and * start the off timer. If the last message we received had the same * DSN as this message, then the chances are pretty good * that this message should be ignored, especially if the destination address * as the broadcast address */ event message_t *SubReceive.receive(message_t* msg, void* payload, uint8_t len) { startOffTimer(); return signal Receive.receive(msg, payload, len); } /***************** Timer Events ****************/ event void OffTimer.fired() { /* * Only stop the radio if the radio is supposed to be off permanently * or if the duty cycle is on and our sleep interval is not 0 */ if(call SplitControlState.getState() == S_OFF || (call PowerCycle.getSleepInterval() > 0 && call SplitControlState.getState() != S_OFF && call SendState.getState() == S_LPL_NOT_SENDING)) { post stopRadio(); } } /** * When this timer is running, that means we're sending repeating messages * to a node that is receive check duty cycling. */ event void SendDoneTimer.fired() { if(call SendState.getState() == S_LPL_SENDING) { // The next time SubSend.sendDone is signaled, send is complete. call SendState.forceState(S_LPL_CLEAN_UP); } } /***************** Resend Events ****************/ /** * Signal that a message has been sent * * @param p_msg message to send. * @param error notifaction of how the operation went. */ async event void Resend.sendDone( message_t* p_msg, error_t error ) { // This is actually caught by SubSend.sendDone } /***************** Tasks ***************/ task void send() { if(call SubSend.send(currentSendMsg, currentSendLen) != SUCCESS) { post send(); } } task void resend() { if(call Resend.resend(TRUE) != SUCCESS) { post resend(); } } task void startRadio() { if(call SubControl.start() != SUCCESS) { post startRadio(); } } task void stopRadio() { if(call SendState.getState() == S_LPL_NOT_SENDING) { if(call SubControl.stop() != SUCCESS) { post stopRadio(); } } } /***************** Functions ***************/ void initializeSend() { if(call LowPowerListening.getRemoteWakeupInterval(currentSendMsg) > ONE_MESSAGE) { if((call CC2420PacketBody.getHeader(currentSendMsg))->dest == IEEE154_BROADCAST_ADDR) { call PacketAcknowledgements.noAck(currentSendMsg); } else { // Send it repetitively within our transmit window call PacketAcknowledgements.requestAck(currentSendMsg); } call SendDoneTimer.startOneShot( call LowPowerListening.getRemoteWakeupInterval(currentSendMsg) + 20); } post send(); } void startOffTimer() { call OffTimer.startOneShot(call SystemLowPowerListening.getDelayAfterReceive()); } } tinyos-2.1.2+dfsg/tos/chips/cc2420/lpl/DummyLplC.nc000066400000000000000000000045211207233610700215520ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Dummy low power listening interface used when LowPowerListening is not * compiled in with the application. * Sleep interval is always 0, and duty cycle is always 100% * @author David Moss */ #warning "*** LOW POWER COMMUNICATIONS DISABLED ***" configuration DummyLplC { provides { interface Send; interface Receive; interface LowPowerListening; interface SplitControl; interface State as SendState; } uses { interface Send as SubSend; interface Receive as SubReceive; interface SplitControl as SubControl; } } implementation { components DummyLplP; components new StateC(); Send = SubSend; Receive = SubReceive; SplitControl = SubControl; LowPowerListening = DummyLplP; SendState = StateC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/lpl/DummyLplP.nc000066400000000000000000000043341207233610700215710ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Dummy low power listening interface used when LowPowerListening is not * compiled in with the application. * Wakeup interval is always 0 (always on) * @author David Moss */ module DummyLplP { provides { interface LowPowerListening; } } implementation { command void LowPowerListening.setLocalWakeupInterval(uint16_t intervalMs) { } command uint16_t LowPowerListening.getLocalWakeupInterval() { return 0; } command void LowPowerListening.setRemoteWakeupInterval(message_t *msg, uint16_t intervalMs) { } command uint16_t LowPowerListening.getRemoteWakeupInterval(message_t *msg) { return 0; } } tinyos-2.1.2+dfsg/tos/chips/cc2420/lpl/PowerCycleC.nc000066400000000000000000000056141207233610700220670ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Use this component to duty cycle the radio. When a message is heard, * disable DutyCycling. * * @author David Moss dmm@rincon.com */ configuration PowerCycleC { provides { interface PowerCycle; interface SplitControl; interface State as SplitControlState; interface State as RadioPowerState; } } implementation { components PowerCycleP, CC2420TransmitC, CC2420ReceiveC, CC2420CsmaC, LedsC, new StateC() as RadioPowerStateC, new StateC() as SplitControlStateC, new TimerMilliC() as OnTimerC, new TimerMilliC() as CheckTimerC; #if defined(LOW_POWER_LISTENING) || defined(ACK_LOW_POWER_LISTENING) components DefaultLplC as LplC; #else components DummyLplC as LplC; #endif PowerCycle = PowerCycleP; SplitControl = PowerCycleP; SplitControlState = SplitControlStateC; RadioPowerState = RadioPowerStateC; PowerCycleP.EnergyIndicator -> CC2420TransmitC.EnergyIndicator; PowerCycleP.ByteIndicator -> CC2420TransmitC.ByteIndicator; PowerCycleP.PacketIndicator -> CC2420ReceiveC.PacketIndicator; PowerCycleP.SubControl -> CC2420CsmaC; PowerCycleP.SendState -> LplC; PowerCycleP.RadioPowerState -> RadioPowerStateC; PowerCycleP.SplitControlState -> SplitControlStateC; PowerCycleP.OnTimer -> OnTimerC; PowerCycleP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/lpl/PowerCycleP.nc000066400000000000000000000221531207233610700221010ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Module to duty cycle the radio on and off, performing CCA receive checks. * When a carrier is sensed, this will leave the radio on. It is then up * to higher layers to turn the radio off again. Once the radio is turned * off, this module will automatically continue duty cycling and looking for * a modulated signal. * * Suggested TODO's: * > TransmitC and ReceiveC provide Energy, Byte, and Packet indicators. * Tap into those to add more detection levels and granularity. Only let * the radio turn off when we're not actively receiving bytes. Right now * the packet indicator is a little backwards. * > Let one component be in charge of maintaining State information about * the power of the radio, probably lower in the stack. * > Wire SplitControl, Send, and Receive through this component. Make it * responsible for packet-level detections and being completely responsible * for controlling the power of the radio without the use of upper layers * > Remove unnecessary State components and Timers. * * @author David Moss */ #include "DefaultLpl.h" module PowerCycleP { provides { interface PowerCycle; interface SplitControl; } uses { interface Timer as OnTimer; interface SplitControl as SubControl; interface State as RadioPowerState; interface State as SplitControlState; interface State as SendState; interface Leds; interface ReceiveIndicator as EnergyIndicator; interface ReceiveIndicator as ByteIndicator; interface ReceiveIndicator as PacketIndicator; } } implementation { /** The current period of the duty cycle, equivalent of wakeup interval */ uint16_t sleepInterval = LPL_DEF_LOCAL_WAKEUP; /** The number of times the CCA has been sampled in this wakeup period */ uint16_t ccaChecks; /** * Radio Power, Check State, and Duty Cycling State */ enum { S_OFF, // off by default S_TURNING_ON, S_ON, S_TURNING_OFF, }; /***************** Prototypes ****************/ task void stopRadio(); task void startRadio(); task void getCca(); bool finishSplitControlRequests(); bool isDutyCycling(); /***************** PowerCycle Commands ****************/ /** * Set the sleep interval, in binary milliseconds * @param sleepIntervalMs the sleep interval in [ms] */ command void PowerCycle.setSleepInterval(uint16_t sleepIntervalMs) { if (!sleepInterval && sleepIntervalMs) { // We were always on, now lets duty cycle post stopRadio(); // Might want to delay turning off the radio } sleepInterval = sleepIntervalMs; if(sleepInterval == 0 && call SplitControlState.isState(S_ON)) { /* * Leave the radio on permanently if sleepInterval == 0 and the radio is * supposed to be enabled */ if(call RadioPowerState.getState() == S_OFF) { call SubControl.start(); } } } /** * @return the sleep interval in [ms] */ command uint16_t PowerCycle.getSleepInterval() { return sleepInterval; } /***************** SplitControl Commands ****************/ command error_t SplitControl.start() { if(call SplitControlState.isState(S_ON)) { return EALREADY; } else if(call SplitControlState.isState(S_TURNING_ON)) { return SUCCESS; } else if(!call SplitControlState.isState(S_OFF)) { return EBUSY; } // Radio was off, now has been told to turn on or duty cycle. call SplitControlState.forceState(S_TURNING_ON); if(sleepInterval > 0) { // Begin duty cycling post stopRadio(); return SUCCESS; } else { post startRadio(); return SUCCESS; } } command error_t SplitControl.stop() { if(call SplitControlState.isState(S_OFF)) { return EALREADY; } else if(call SplitControlState.isState(S_TURNING_OFF)) { return SUCCESS; } else if(!call SplitControlState.isState(S_ON)) { return EBUSY; } call SplitControlState.forceState(S_TURNING_OFF); post stopRadio(); return SUCCESS; } /***************** Timer Events ****************/ event void OnTimer.fired() { if(isDutyCycling()) { if(call RadioPowerState.getState() == S_OFF) { ccaChecks = 0; /* * Turn on the radio only after the uC is fully awake. ATmega128's * have this issue when running on an external crystal. */ post getCca(); } else { // Someone else turned on the radio, try again in awhile call OnTimer.startOneShot(sleepInterval); } } } /***************** SubControl Events ****************/ event void SubControl.startDone(error_t error) { call RadioPowerState.forceState(S_ON); //call Leds.led2On(); if(finishSplitControlRequests()) { return; } else if(isDutyCycling()) { post getCca(); } } event void SubControl.stopDone(error_t error) { call RadioPowerState.forceState(S_OFF); //call Leds.led2Off(); if(finishSplitControlRequests()) { return; } else if(isDutyCycling()) { call OnTimer.startOneShot(sleepInterval); } } /***************** Tasks ****************/ task void stopRadio() { error_t error = call SubControl.stop(); if(error != SUCCESS) { // Already stopped? finishSplitControlRequests(); call OnTimer.startOneShot(sleepInterval); } } task void startRadio() { error_t startResult = call SubControl.start(); // If the radio wasn't started successfully, or already on, try again if ((startResult != SUCCESS && startResult != EALREADY)) { post startRadio(); } } task void getCca() { uint8_t detects = 0; if(isDutyCycling()) { ccaChecks++; if(ccaChecks == 1) { // Microcontroller is ready, turn on the radio and sample a few times post startRadio(); return; } atomic { for( ; ccaChecks < MAX_LPL_CCA_CHECKS && call SendState.isIdle(); ccaChecks++) { if(call PacketIndicator.isReceiving()) { signal PowerCycle.detected(); return; } if(call EnergyIndicator.isReceiving()) { detects++; if(detects > MIN_SAMPLES_BEFORE_DETECT) { signal PowerCycle.detected(); return; } // Leave the radio on for upper layers to perform some transaction } } } if(call SendState.isIdle()) { post stopRadio(); } } } /** * @return TRUE if the radio should be actively duty cycling */ bool isDutyCycling() { return sleepInterval > 0 && call SplitControlState.isState(S_ON); } /** * @return TRUE if we successfully handled a SplitControl request */ bool finishSplitControlRequests() { if(call SplitControlState.isState(S_TURNING_OFF)) { call SplitControlState.forceState(S_OFF); signal SplitControl.stopDone(SUCCESS); return TRUE; } else if(call SplitControlState.isState(S_TURNING_ON)) { // Starting while we're duty cycling first turns off the radio call SplitControlState.forceState(S_ON); signal SplitControl.startDone(SUCCESS); return TRUE; } return FALSE; } /**************** Defaults ****************/ default event void PowerCycle.detected() { } default event void SplitControl.startDone(error_t error) { } default event void SplitControl.stopDone(error_t error) { } } tinyos-2.1.2+dfsg/tos/chips/cc2420/lpl/readme.txt000066400000000000000000000117011207233610700213560ustar00rootroot00000000000000 ARCHITECTURE ======================================================= The default LPL implementation uses a packet train with acknowledgements enabled, shortened backoffs, and a spinning energy checking loop. The default strategy can be improved by implementing a different architecture. Right now the architecture looks like this: +----------------------------------+ | DefaultLplP | -> To lower level Send | Responsible for retransmissions | -> To lower level SplitControl | and turning the radio off when | <- From lower level Receive | done, or on when starting to | | transmit | +----------------------------------+ | PowerCycleP | | Responsible for performing | -> To lower level SplitControl | receive checks and leaving the | | radio on | +----------------------------------+ I think the architecture should be changed. If you're interested in doing work in this area, there's lots of development and research to be done. First, take a look at tinyos-2.x-contrib/wustl/upma. The architecture of the CC2420 stack there is implemented to define a low-level abstraction layer which separates radio-specific functionality from radio-independent functionality. This is nice. By providing certain interfaces from the radio-dependant functionality, it makes it easier to maintain MAC layer stuff independent of the radio. And that includes LPL. One of the things that radio stack uses is an Alarm instead of a spinning task/while loop. Whereas the implementation here uses a static number of loops to detect if energy is on the channel, we would be better able to achieve the smallest radio asynchronous receive check on-time by using an alarm. After all, the radio only has to be on to span the quiet gaps in a transmitter's transmission, and we know approximately the duration of those quiet gaps based on the backoff period, which the stack defines. I recommend we redo some of the LPL architecture to look more like this: +----------------------------------+ | DefaultLplP | | Responsible for retransmissions | +----------------------------------+ | | | (Send, Receive, SplitControl goes through PowerCycle) +----------------------------------+ | PowerCycleP | | Responsible for managing radio | -> To lower level Send | on/off power, and telling | -> To lower level SplitControl | PacketDetectP when to start/stop | <- From lower level Receive | its job | +----------------------------------+ | PacketDetectP | | Responsible for detecting | <- EnergyIndicator | energy, bytes, and/or packets. | <- ByteIndicator | Notify PowerCycle when packets | <- PacketIndicator | are detected | +----------------------------------+ This is pretty radio independent. OTHER LOW POWER LISTENING STRATEGIES ============================================================= Other low power listening layers can be implemented as well: * Continuous modulation / No Acknowledgements: > Allows the receiver to achieve the lowest possible receive check on time. It's shown to be several times more efficient on the receive check than the default. This is a radio-dependent LPL strategy and the CC2420 can acheive it by putting some transmit register into test mode where it continually retransmits the contents of the TXFIFO. The CRC of the packet must be uploaded into the TXFIFO because it won't be calculated by the CC2420. Not sure if the preamble and sync bytes need to be uploaded as well. The transmitter takes a hit because it cannot receive acks in the middle of its packet train. But since the receiver's energy consumption is so low, it's possible to increase the number of receive checks in order to lower the duration of the transmission. > This strategy would be a good match for networks that must get data through quickly when there is data, but doesn't see too many transmissions in any given geographical area of the network. Also a good strategy where your transmitters have more power. * 802.15.4/ZigBee End Node: > Queue up packets to Send to a particular destination until that node checks in at some random time. Use fields in the ack frame to let the node know that packets are available. Good match for networks where one node has access to line power and other nodes are on batteries. * Low throughput acknowledgement LPL: > Just like the default, only it uses the ByteIndicator to turn off the radio as soon as it stops receiving bytes and no packet was received. Able to get a much shorter receive check at the expense of decreased probability that you'll receive messages in a congested network. tinyos-2.1.2+dfsg/tos/chips/cc2420/packet/000077500000000000000000000000001207233610700200405ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/packet/CC2420PacketC.nc000066400000000000000000000052711207233610700224170ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author David Moss * @author Chad Metcalf */ configuration CC2420PacketC { provides { interface CC2420Packet; interface PacketAcknowledgements as Acks; interface CC2420PacketBody; interface LinkPacketMetadata; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface PacketTimeSyncOffset; } } implementation { components CC2420PacketP; CC2420Packet = CC2420PacketP; Acks = CC2420PacketP; CC2420PacketBody = CC2420PacketP; LinkPacketMetadata = CC2420PacketP; PacketTimeStamp32khz = CC2420PacketP; PacketTimeStampMilli = CC2420PacketP; PacketTimeSyncOffset = CC2420PacketP; components Counter32khz32C, new CounterToLocalTimeC(T32khz); CounterToLocalTimeC.Counter -> Counter32khz32C; CC2420PacketP.LocalTime32khz -> CounterToLocalTimeC; //DummyTimer is introduced to compile apps that use no timers components HilTimerMilliC, new TimerMilliC() as DummyTimer; CC2420PacketP.LocalTimeMilli -> HilTimerMilliC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/packet/CC2420PacketP.nc000066400000000000000000000200071207233610700224260ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author David Moss * @author Chad Metcalf */ #include "IEEE802154.h" #include "message.h" #include "CC2420.h" #include "CC2420TimeSyncMessage.h" module CC2420PacketP @safe() { provides { interface CC2420Packet; interface PacketAcknowledgements as Acks; interface CC2420PacketBody; interface LinkPacketMetadata; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface PacketTimeSyncOffset; } uses interface Packet; uses interface LocalTime as LocalTime32khz; uses interface LocalTime as LocalTimeMilli; } implementation { /***************** PacketAcknowledgement Commands ****************/ async command error_t Acks.requestAck( message_t* p_msg ) { (call CC2420PacketBody.getHeader( p_msg ))->fcf |= 1 << IEEE154_FCF_ACK_REQ; return SUCCESS; } async command error_t Acks.noAck( message_t* p_msg ) { (call CC2420PacketBody.getHeader( p_msg ))->fcf &= ~(1 << IEEE154_FCF_ACK_REQ); return SUCCESS; } async command bool Acks.wasAcked( message_t* p_msg ) { return (call CC2420PacketBody.getMetadata( p_msg ))->ack; } /***************** CC2420Packet Commands ****************/ int getAddressLength(int type) { switch (type) { case IEEE154_ADDR_SHORT: return 2; case IEEE154_ADDR_EXT: return 8; case IEEE154_ADDR_NONE: return 0; default: return -100; } } uint8_t * ONE getNetwork(message_t * ONE msg) { cc2420_header_t *hdr = (call CC2420PacketBody.getHeader( msg )); int offset; offset = getAddressLength((hdr->fcf >> IEEE154_FCF_DEST_ADDR_MODE) & 0x3) + getAddressLength((hdr->fcf >> IEEE154_FCF_SRC_ADDR_MODE) & 0x3) + offsetof(cc2420_header_t, dest); return ((uint8_t *)hdr) + offset; } async command void CC2420Packet.setPower( message_t* p_msg, uint8_t power ) { if ( power > 31 ) power = 31; (call CC2420PacketBody.getMetadata( p_msg ))->tx_power = power; } async command uint8_t CC2420Packet.getPower( message_t* p_msg ) { return (call CC2420PacketBody.getMetadata( p_msg ))->tx_power; } async command int8_t CC2420Packet.getRssi( message_t* p_msg ) { return (call CC2420PacketBody.getMetadata( p_msg ))->rssi; } async command uint8_t CC2420Packet.getLqi( message_t* p_msg ) { return (call CC2420PacketBody.getMetadata( p_msg ))->lqi; } async command uint8_t CC2420Packet.getNetwork( message_t* ONE p_msg ) { #if defined(TFRAMES_ENABLED) return TINYOS_6LOWPAN_NETWORK_ID; #else atomic return *(getNetwork(p_msg)); #endif } async command void CC2420Packet.setNetwork( message_t* ONE p_msg , uint8_t networkId ) { #if ! defined(TFRAMES_ENABLED) atomic *(getNetwork(p_msg)) = networkId; #endif } /***************** CC2420PacketBody Commands ****************/ async command cc2420_header_t * ONE CC2420PacketBody.getHeader( message_t* ONE msg ) { return TCAST(cc2420_header_t* ONE, (uint8_t *)msg + offsetof(message_t, data) - sizeof( cc2420_header_t )); } async command uint8_t * CC2420PacketBody.getPayload( message_t* msg) { cc2420_header_t *hdr = (call CC2420PacketBody.getHeader( msg )); int offset; offset = getAddressLength((hdr->fcf >> IEEE154_FCF_DEST_ADDR_MODE) & 0x3) + getAddressLength((hdr->fcf >> IEEE154_FCF_SRC_ADDR_MODE) & 0x3) + offsetof(cc2420_header_t, dest); return ((uint8_t *)hdr) + offset; } async command cc2420_metadata_t *CC2420PacketBody.getMetadata( message_t* msg ) { return (cc2420_metadata_t*)msg->metadata; } async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) { return call CC2420Packet.getLqi(msg) > 105; } /***************** PacketTimeStamp32khz Commands ****************/ async command bool PacketTimeStamp32khz.isValid(message_t* msg) { return ((call CC2420PacketBody.getMetadata( msg ))->timestamp != CC2420_INVALID_TIMESTAMP); } async command uint32_t PacketTimeStamp32khz.timestamp(message_t* msg) { return (call CC2420PacketBody.getMetadata( msg ))->timestamp; } async command void PacketTimeStamp32khz.clear(message_t* msg) { (call CC2420PacketBody.getMetadata( msg ))->timesync = FALSE; (call CC2420PacketBody.getMetadata( msg ))->timestamp = CC2420_INVALID_TIMESTAMP; } async command void PacketTimeStamp32khz.set(message_t* msg, uint32_t value) { (call CC2420PacketBody.getMetadata( msg ))->timestamp = value; } /***************** PacketTimeStampMilli Commands ****************/ // over the air value is always T32khz, which is used to capture SFD interrupt // (Timer1 on micaZ, B1 on telos) async command bool PacketTimeStampMilli.isValid(message_t* msg) { return call PacketTimeStamp32khz.isValid(msg); } //timestmap is always represented in 32khz //28.1 is coefficient difference between T32khz and TMilli on MicaZ async command uint32_t PacketTimeStampMilli.timestamp(message_t* msg) { int32_t offset = (call LocalTime32khz.get()-call PacketTimeStamp32khz.timestamp(msg)); offset/=28.1; return call LocalTimeMilli.get() - offset; } async command void PacketTimeStampMilli.clear(message_t* msg) { call PacketTimeStamp32khz.clear(msg); } async command void PacketTimeStampMilli.set(message_t* msg, uint32_t value) { int32_t offset = (value - call LocalTimeMilli.get()) << 5; call PacketTimeStamp32khz.set(msg, offset + call LocalTime32khz.get()); } /*----------------- PacketTimeSyncOffset -----------------*/ async command bool PacketTimeSyncOffset.isSet(message_t* msg) { return ((call CC2420PacketBody.getMetadata( msg ))->timesync); } //returns offset of timestamp from the beginning of cc2420 header which is // sizeof(cc2420_header_t)+datalen-sizeof(timesync_radio_t) //uses packet length of the message which is // MAC_HEADER_SIZE+MAC_FOOTER_SIZE+datalen async command uint8_t PacketTimeSyncOffset.get(message_t* msg) { return (call CC2420PacketBody.getHeader(msg))->length + (sizeof(cc2420_header_t) - MAC_HEADER_SIZE) - MAC_FOOTER_SIZE - sizeof(timesync_radio_t); } async command void PacketTimeSyncOffset.set(message_t* msg) { (call CC2420PacketBody.getMetadata( msg ))->timesync = TRUE; } async command void PacketTimeSyncOffset.cancel(message_t* msg) { (call CC2420PacketBody.getMetadata( msg ))->timesync = FALSE; } } tinyos-2.1.2+dfsg/tos/chips/cc2420/receive/000077500000000000000000000000001207233610700202135ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/receive/CC2420ReceiveC.nc000066400000000000000000000063711207233610700227470ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the receive path for the ChipCon CC2420 radio. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2009-08-14 20:33:43 $ */ configuration CC2420ReceiveC { provides interface StdControl; provides interface CC2420Receive; provides interface Receive; provides interface ReceiveIndicator as PacketIndicator; } implementation { components MainC; components CC2420ReceiveP; components CC2420PacketC; components new CC2420SpiC() as Spi; components CC2420ControlC; components HplCC2420PinsC as Pins; components HplCC2420InterruptsC as InterruptsC; components LedsC as Leds; CC2420ReceiveP.Leds -> Leds; StdControl = CC2420ReceiveP; CC2420Receive = CC2420ReceiveP; Receive = CC2420ReceiveP; PacketIndicator = CC2420ReceiveP.PacketIndicator; MainC.SoftwareInit -> CC2420ReceiveP; CC2420ReceiveP.CSN -> Pins.CSN; CC2420ReceiveP.FIFO -> Pins.FIFO; CC2420ReceiveP.FIFOP -> Pins.FIFOP; CC2420ReceiveP.InterruptFIFOP -> InterruptsC.InterruptFIFOP; CC2420ReceiveP.SpiResource -> Spi; CC2420ReceiveP.RXFIFO -> Spi.RXFIFO; CC2420ReceiveP.SFLUSHRX -> Spi.SFLUSHRX; CC2420ReceiveP.SACK -> Spi.SACK; CC2420ReceiveP.CC2420Packet -> CC2420PacketC; CC2420ReceiveP.CC2420PacketBody -> CC2420PacketC; CC2420ReceiveP.PacketTimeStamp -> CC2420PacketC; CC2420ReceiveP.CC2420Config -> CC2420ControlC; CC2420ReceiveP.SECCTRL0 -> Spi.SECCTRL0; CC2420ReceiveP.SECCTRL1 -> Spi.SECCTRL1; CC2420ReceiveP.SRXDEC -> Spi.SRXDEC; CC2420ReceiveP.RXNONCE -> Spi.RXNONCE; CC2420ReceiveP.KEY0 -> Spi.KEY0; CC2420ReceiveP.KEY1 -> Spi.KEY1; CC2420ReceiveP.RXFIFO_RAM -> Spi.RXFIFO_RAM; CC2420ReceiveP.SNOP -> Spi.SNOP; } tinyos-2.1.2+dfsg/tos/chips/cc2420/receive/CC2420ReceiveP.nc000066400000000000000000000575571207233610700230000ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author David Moss * @author Jung Il Choi * @author JeongGil Ko * @author Razvan Musaloiu-E * @version $Revision: 1.21 $ $Date: 2009/09/17 23:36:36 $ */ #include "IEEE802154.h" #include "message.h" #include "AM.h" module CC2420ReceiveP @safe() { provides interface Init; provides interface StdControl; provides interface CC2420Receive; provides interface Receive; provides interface ReceiveIndicator as PacketIndicator; uses interface GeneralIO as CSN; uses interface GeneralIO as FIFO; uses interface GeneralIO as FIFOP; uses interface GpioInterrupt as InterruptFIFOP; uses interface Resource as SpiResource; uses interface CC2420Fifo as RXFIFO; uses interface CC2420Strobe as SACK; uses interface CC2420Strobe as SFLUSHRX; uses interface CC2420Packet; uses interface CC2420PacketBody; uses interface CC2420Config; uses interface PacketTimeStamp; uses interface CC2420Strobe as SRXDEC; uses interface CC2420Register as SECCTRL0; uses interface CC2420Register as SECCTRL1; uses interface CC2420Ram as KEY0; uses interface CC2420Ram as KEY1; uses interface CC2420Ram as RXNONCE; uses interface CC2420Ram as RXFIFO_RAM; uses interface CC2420Strobe as SNOP; uses interface Leds; } implementation { typedef enum { S_STOPPED, S_STARTED, S_RX_LENGTH, S_RX_DEC, S_RX_DEC_WAIT, S_RX_FCF, S_RX_PAYLOAD, } cc2420_receive_state_t; enum { RXFIFO_SIZE = 128, TIMESTAMP_QUEUE_SIZE = 8, SACK_HEADER_LENGTH = 7, }; uint32_t m_timestamp_queue[ TIMESTAMP_QUEUE_SIZE ]; uint8_t m_timestamp_head; uint8_t m_timestamp_size; /** Number of packets we missed because we were doing something else */ #ifdef CC2420_HW_SECURITY norace uint8_t m_missed_packets; #else uint8_t m_missed_packets; #endif /** TRUE if we are receiving a valid packet into the stack */ bool receivingPacket; /** The length of the frame we're currently receiving */ norace uint8_t rxFrameLength; norace uint8_t m_bytes_left; norace message_t* ONE_NOK m_p_rx_buf; message_t m_rx_buf; #ifdef CC2420_HW_SECURITY norace cc2420_receive_state_t m_state; norace uint8_t packetLength = 0; norace uint8_t pos = 0; norace uint8_t secHdrPos = 0; uint8_t nonceValue[16] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; norace uint8_t skip; norace uint8_t securityOn = 0; norace uint8_t authentication = 0; norace uint8_t micLength = 0; uint8_t flush_flag = 0; uint16_t startTime = 0; void beginDec(); void dec(); #else cc2420_receive_state_t m_state; #endif /***************** Prototypes ****************/ void reset_state(); void beginReceive(); void receive(); void waitForNextPacket(); void flush(); bool passesAddressCheck(message_t * ONE msg); task void receiveDone_task(); /***************** Init Commands ****************/ command error_t Init.init() { m_p_rx_buf = &m_rx_buf; return SUCCESS; } /***************** StdControl ****************/ command error_t StdControl.start() { atomic { reset_state(); m_state = S_STARTED; atomic receivingPacket = FALSE; /* Note: We use the falling edge because the FIFOP polarity is reversed. This is done in CC2420Power.startOscillator from CC2420ControlP.nc. */ call InterruptFIFOP.enableFallingEdge(); } return SUCCESS; } command error_t StdControl.stop() { atomic { m_state = S_STOPPED; reset_state(); call CSN.set(); call InterruptFIFOP.disable(); } return SUCCESS; } /***************** CC2420Receive Commands ****************/ /** * Start frame delimiter signifies the beginning/end of a packet * See the CC2420 datasheet for details. */ async command void CC2420Receive.sfd( uint32_t time ) { if ( m_timestamp_size < TIMESTAMP_QUEUE_SIZE ) { uint8_t tail = ( ( m_timestamp_head + m_timestamp_size ) % TIMESTAMP_QUEUE_SIZE ); m_timestamp_queue[ tail ] = time; m_timestamp_size++; } } async command void CC2420Receive.sfd_dropped() { if ( m_timestamp_size ) { m_timestamp_size--; } } /***************** PacketIndicator Commands ****************/ command bool PacketIndicator.isReceiving() { bool receiving; atomic { receiving = receivingPacket; } return receiving; } /***************** InterruptFIFOP Events ****************/ async event void InterruptFIFOP.fired() { if ( m_state == S_STARTED ) { #ifndef CC2420_HW_SECURITY m_state = S_RX_LENGTH; beginReceive(); #else m_state = S_RX_DEC; atomic receivingPacket = TRUE; beginDec(); #endif } else { m_missed_packets++; } } /*****************Decryption Options*********************/ #ifdef CC2420_HW_SECURITY task void waitTask(){ if(SECURITYLOCK == 1){ post waitTask(); }else{ m_state = S_RX_DEC; beginDec(); } } void beginDec(){ if(call SpiResource.isOwner()) { dec(); } else if (call SpiResource.immediateRequest() == SUCCESS) { dec(); } else { call SpiResource.request(); } } norace uint8_t decLoopCount = 0; task void waitDecTask(){ cc2420_status_t status; call CSN.clr(); status = call SNOP.strobe(); call CSN.set(); atomic decLoopCount ++; if(decLoopCount > 10){ call CSN.clr(); atomic call SECCTRL0.write((0 << CC2420_SECCTRL0_SEC_MODE) | (0 << CC2420_SECCTRL0_SEC_M) | (0 << CC2420_SECCTRL0_SEC_RXKEYSEL) | (1 << CC2420_SECCTRL0_SEC_CBC_HEAD) | (1 << CC2420_SECCTRL0_RXFIFO_PROTECTION)) ; call CSN.set(); SECURITYLOCK = 0; call SpiResource.release(); atomic flush_flag = 1; beginReceive(); }else if(status & CC2420_STATUS_ENC_BUSY){ post waitDecTask(); }else{ call CSN.clr(); atomic call SECCTRL0.write((0 << CC2420_SECCTRL0_SEC_MODE) | (0 << CC2420_SECCTRL0_SEC_M) | (0 << CC2420_SECCTRL0_SEC_RXKEYSEL) | (1 << CC2420_SECCTRL0_SEC_CBC_HEAD) | (1 << CC2420_SECCTRL0_RXFIFO_PROTECTION)) ; call CSN.set(); SECURITYLOCK = 0; call SpiResource.release(); beginReceive(); } } void waitDec(){ cc2420_status_t status; call CSN.clr(); status = call SNOP.strobe(); call CSN.set(); if(status & CC2420_STATUS_ENC_BUSY){ atomic decLoopCount = 1; post waitDecTask(); }else{ call CSN.clr(); atomic call SECCTRL0.write((0 << CC2420_SECCTRL0_SEC_MODE) | (0 << CC2420_SECCTRL0_SEC_M) | (0 << CC2420_SECCTRL0_SEC_RXKEYSEL) | (1 << CC2420_SECCTRL0_SEC_CBC_HEAD) | (1 << CC2420_SECCTRL0_RXFIFO_PROTECTION)) ; call CSN.set(); SECURITYLOCK = 0; call SpiResource.release(); beginReceive(); } } void dec(){ cc2420_header_t header; security_header_t secHdr; uint8_t mode, key, temp, crc; atomic pos = (packetLength+pos)%RXFIFO_SIZE; #if ! defined(TFRAMES_ENABLED) atomic secHdrPos = (pos+11)%RXFIFO_SIZE; #else atomic secHdrPos = (pos+10)%RXFIFO_SIZE; #endif if (pos + 3 > RXFIFO_SIZE){ temp = RXFIFO_SIZE - pos; call CSN.clr(); atomic call RXFIFO_RAM.read(pos,(uint8_t*)&header, temp); call CSN.set(); call CSN.clr(); atomic call RXFIFO_RAM.read(0,(uint8_t*)&header+temp, 3-temp); call CSN.set(); }else{ call CSN.clr(); atomic call RXFIFO_RAM.read(pos,(uint8_t*)&header, 3); call CSN.set(); } packetLength = header.length+1; if(packetLength == 6){ // ACK packet m_state = S_RX_LENGTH; call SpiResource.release(); beginReceive(); return; } if (pos + sizeof(cc2420_header_t) > RXFIFO_SIZE){ temp = RXFIFO_SIZE - pos; call CSN.clr(); atomic call RXFIFO_RAM.read(pos,(uint8_t*)&header, temp); call CSN.set(); call CSN.clr(); atomic call RXFIFO_RAM.read(0,(uint8_t*)&header+temp, sizeof(cc2420_header_t)-temp); call CSN.set(); }else{ call CSN.clr(); atomic call RXFIFO_RAM.read(pos,(uint8_t*)&header, sizeof(cc2420_header_t)); call CSN.set(); } if (pos+header.length+1 > RXFIFO_SIZE){ temp = header.length - (RXFIFO_SIZE - pos); call CSN.clr(); atomic call RXFIFO_RAM.read(temp,&crc, 1); call CSN.set(); }else{ call CSN.clr(); atomic call RXFIFO_RAM.read(pos+header.length,&crc, 1); call CSN.set(); } if(header.length+1 > RXFIFO_SIZE || !(crc << 7)){ atomic flush_flag = 1; m_state = S_RX_LENGTH; call SpiResource.release(); beginReceive(); return; } if( (header.fcf & (1 << IEEE154_FCF_SECURITY_ENABLED)) && (crc << 7) ){ if(call CC2420Config.isAddressRecognitionEnabled()){ if(!(header.dest==call CC2420Config.getShortAddr() || header.dest==AM_BROADCAST_ADDR)){ packetLength = header.length + 1; m_state = S_RX_LENGTH; call SpiResource.release(); beginReceive(); return; } } if(SECURITYLOCK == 1){ call SpiResource.release(); post waitTask(); return; }else{ //We are going to decrypt so lock the registers atomic SECURITYLOCK = 1; if (secHdrPos + sizeof(security_header_t) > RXFIFO_SIZE){ temp = RXFIFO_SIZE - secHdrPos; call CSN.clr(); atomic call RXFIFO_RAM.read(secHdrPos,(uint8_t*)&secHdr, temp); call CSN.set(); call CSN.clr(); atomic call RXFIFO_RAM.read(0,(uint8_t*)&secHdr+temp, sizeof(security_header_t) - temp); call CSN.set(); } else { call CSN.clr(); atomic call RXFIFO_RAM.read(secHdrPos,(uint8_t*)&secHdr, sizeof(security_header_t)); call CSN.set(); } key = secHdr.keyID[0]; if (secHdr.secLevel == NO_SEC){ mode = CC2420_NO_SEC; micLength = 0; }else if (secHdr.secLevel == CBC_MAC_4){ mode = CC2420_CBC_MAC; micLength = 4; }else if (secHdr.secLevel == CBC_MAC_8){ mode = CC2420_CBC_MAC; micLength = 8; }else if (secHdr.secLevel == CBC_MAC_16){ mode = CC2420_CBC_MAC; micLength = 16; }else if (secHdr.secLevel == CTR){ mode = CC2420_CTR; micLength = 0; }else if (secHdr.secLevel == CCM_4){ mode = CC2420_CCM; micLength = 4; }else if (secHdr.secLevel == CCM_8){ mode = CC2420_CCM; micLength = 8; }else if (secHdr.secLevel == CCM_16){ mode = CC2420_CCM; micLength = 16; }else{ atomic SECURITYLOCK = 0; packetLength = header.length + 1; m_state = S_RX_LENGTH; call SpiResource.release(); beginReceive(); return; } if(mode < 4 && mode > 0) { // if mode is valid securityOn = 1; memcpy(&nonceValue[3], &(secHdr.frameCounter), 4); skip = secHdr.reserved; if(mode == CC2420_CBC_MAC || mode == CC2420_CCM){ authentication = 1; call CSN.clr(); atomic call SECCTRL0.write((mode << CC2420_SECCTRL0_SEC_MODE) | ((micLength-2)/2 << CC2420_SECCTRL0_SEC_M) | (key << CC2420_SECCTRL0_SEC_RXKEYSEL) | (1 << CC2420_SECCTRL0_SEC_CBC_HEAD) | (1 << CC2420_SECCTRL0_RXFIFO_PROTECTION)) ; call CSN.set(); }else{ call CSN.clr(); atomic call SECCTRL0.write((mode << CC2420_SECCTRL0_SEC_MODE) | (1 << CC2420_SECCTRL0_SEC_M) | (key << CC2420_SECCTRL0_SEC_RXKEYSEL) | (1 << CC2420_SECCTRL0_SEC_CBC_HEAD) | (1 << CC2420_SECCTRL0_RXFIFO_PROTECTION)) ; call CSN.set(); } call CSN.clr(); #ifndef TFRAMES_ENABLED atomic call SECCTRL1.write(skip+11+sizeof(security_header_t)+((skip+11+sizeof(security_header_t))<<8)); #else atomic call SECCTRL1.write(skip+10+sizeof(security_header_t)+((skip+10+sizeof(security_header_t))<<8)); #endif call CSN.set(); call CSN.clr(); atomic call RXNONCE.write(0, nonceValue, 16); call CSN.set(); call CSN.clr(); atomic call SRXDEC.strobe(); call CSN.set(); atomic decLoopCount = 0; post waitDecTask(); return; }else{ atomic SECURITYLOCK = 0; packetLength = header.length + 1; m_state = S_RX_LENGTH; call SpiResource.release(); beginReceive(); return; } } }else{ packetLength = header.length + 1; m_state = S_RX_LENGTH; call SpiResource.release(); beginReceive(); return; } } #endif /***************** SpiResource Events ****************/ event void SpiResource.granted() { #ifdef CC2420_HW_SECURITY if(m_state == S_RX_DEC){ dec(); }else{ receive(); } #else receive(); #endif } /***************** RXFIFO Events ****************/ /** * We received some bytes from the SPI bus. Process them in the context * of the state we're in. Remember the length byte is not part of the length */ async event void RXFIFO.readDone( uint8_t* rx_buf, uint8_t rx_len, error_t error ) { cc2420_header_t* header = call CC2420PacketBody.getHeader( m_p_rx_buf ); uint8_t tmpLen __DEPUTY_UNUSED__ = sizeof(message_t) - (offsetof(message_t, data) - sizeof(cc2420_header_t)); uint8_t* COUNT(tmpLen) buf = TCAST(uint8_t* COUNT(tmpLen), header); rxFrameLength = buf[ 0 ]; switch( m_state ) { case S_RX_LENGTH: m_state = S_RX_FCF; #ifdef CC2420_HW_SECURITY packetLength = rxFrameLength+1; #endif if ( rxFrameLength + 1 > m_bytes_left #ifdef CC2420_HW_SECURITY || flush_flag == 1 #endif ) { // Length of this packet is bigger than the RXFIFO, flush it out. flush(); } else { if ( !call FIFO.get() && !call FIFOP.get() ) { m_bytes_left -= rxFrameLength + 1; } if(rxFrameLength <= MAC_PACKET_SIZE) { if(rxFrameLength > 0) { if(rxFrameLength > SACK_HEADER_LENGTH) { // This packet has an FCF byte plus at least one more byte to read call RXFIFO.continueRead(buf + 1, SACK_HEADER_LENGTH); } else { // This is really a bad packet, skip FCF and get it out of here. m_state = S_RX_PAYLOAD; call RXFIFO.continueRead(buf + 1, rxFrameLength); } } else { // Length == 0; start reading the next packet atomic receivingPacket = FALSE; call CSN.set(); call SpiResource.release(); waitForNextPacket(); } } else { // Length is too large; we have to flush the entire Rx FIFO flush(); } } break; case S_RX_FCF: m_state = S_RX_PAYLOAD; /* * The destination address check here is not completely optimized. If you * are seeing issues with dropped acknowledgements, try removing * the address check and decreasing SACK_HEADER_LENGTH to 2. * The length byte and the FCF byte are the only two bytes required * to know that the packet is valid and requested an ack. The destination * address is useful when we want to sniff packets from other transmitters * while acknowledging packets that were destined for our local address. */ if(call CC2420Config.isAutoAckEnabled() && !call CC2420Config.isHwAutoAckDefault()) { if (((( header->fcf >> IEEE154_FCF_ACK_REQ ) & 0x01) == 1) && ((header->dest == call CC2420Config.getShortAddr()) || (header->dest == AM_BROADCAST_ADDR)) && ((( header->fcf >> IEEE154_FCF_FRAME_TYPE ) & 7) == IEEE154_TYPE_DATA)) { // CSn flippage cuts off our FIFO; SACK and begin reading again call CSN.set(); call CSN.clr(); call SACK.strobe(); call CSN.set(); call CSN.clr(); call RXFIFO.beginRead(buf + 1 + SACK_HEADER_LENGTH, rxFrameLength - SACK_HEADER_LENGTH); return; } } // Didn't flip CSn, we're ok to continue reading. call RXFIFO.continueRead(buf + 1 + SACK_HEADER_LENGTH, rxFrameLength - SACK_HEADER_LENGTH); break; case S_RX_PAYLOAD: call CSN.set(); if(!m_missed_packets) { // Release the SPI only if there are no more frames to download call SpiResource.release(); } //new packet is buffered up, or we don't have timestamp in fifo, or ack if ( ( m_missed_packets && call FIFO.get() ) || !call FIFOP.get() || !m_timestamp_size || rxFrameLength <= 10) { call PacketTimeStamp.clear(m_p_rx_buf); } else { if (m_timestamp_size==1) call PacketTimeStamp.set(m_p_rx_buf, m_timestamp_queue[ m_timestamp_head ]); m_timestamp_head = ( m_timestamp_head + 1 ) % TIMESTAMP_QUEUE_SIZE; m_timestamp_size--; if (m_timestamp_size>0) { call PacketTimeStamp.clear(m_p_rx_buf); m_timestamp_head = 0; m_timestamp_size = 0; } } // We may have received an ack that should be processed by Transmit // buf[rxFrameLength] >> 7 checks the CRC if ( ( buf[ rxFrameLength ] >> 7 ) && rx_buf ) { uint8_t type = ( header->fcf >> IEEE154_FCF_FRAME_TYPE ) & 7; signal CC2420Receive.receive( type, m_p_rx_buf ); if ( type == IEEE154_TYPE_DATA ) { post receiveDone_task(); return; } } waitForNextPacket(); break; default: atomic receivingPacket = FALSE; call CSN.set(); call SpiResource.release(); break; } } async event void RXFIFO.writeDone( uint8_t* tx_buf, uint8_t tx_len, error_t error ) { } /***************** Tasks *****************/ /** * Fill in metadata details, pass the packet up the stack, and * get the next packet. */ task void receiveDone_task() { cc2420_metadata_t* metadata = call CC2420PacketBody.getMetadata( m_p_rx_buf ); cc2420_header_t* header = call CC2420PacketBody.getHeader( m_p_rx_buf); uint8_t length = header->length; uint8_t tmpLen __DEPUTY_UNUSED__ = sizeof(message_t) - (offsetof(message_t, data) - sizeof(cc2420_header_t)); uint8_t* COUNT(tmpLen) buf = TCAST(uint8_t* COUNT(tmpLen), header); metadata->crc = buf[ length ] >> 7; metadata->lqi = buf[ length ] & 0x7f; metadata->rssi = buf[ length - 1 ]; if (passesAddressCheck(m_p_rx_buf) && length >= CC2420_SIZE) { #ifdef CC2420_HW_SECURITY if(securityOn == 1){ if(m_missed_packets > 0){ m_missed_packets --; } if(authentication){ length -= micLength; } } micLength = 0; securityOn = 0; authentication = 0; #endif m_p_rx_buf = signal Receive.receive( m_p_rx_buf, m_p_rx_buf->data, length - CC2420_SIZE); } atomic receivingPacket = FALSE; waitForNextPacket(); } /****************** CC2420Config Events ****************/ event void CC2420Config.syncDone( error_t error ) { } /****************** Functions ****************/ /** * Attempt to acquire the SPI bus to receive a packet. */ void beginReceive() { m_state = S_RX_LENGTH; atomic receivingPacket = TRUE; if(call SpiResource.isOwner()) { receive(); } else if (call SpiResource.immediateRequest() == SUCCESS) { receive(); } else { call SpiResource.request(); } } /** * Flush out the Rx FIFO */ void flush() { #ifdef CC2420_HW_SECURITY flush_flag = 0; pos =0; packetLength =0; micLength = 0; securityOn = 0; authentication = 0; #endif reset_state(); call CSN.set(); call CSN.clr(); call SFLUSHRX.strobe(); call SFLUSHRX.strobe(); call CSN.set(); call SpiResource.release(); waitForNextPacket(); } /** * The first byte of each packet is the length byte. Read in that single * byte, and then read in the rest of the packet. The CC2420 could contain * multiple packets that have been buffered up, so if something goes wrong, * we necessarily want to flush out the FIFO unless we have to. */ void receive() { call CSN.clr(); call RXFIFO.beginRead( (uint8_t*)(call CC2420PacketBody.getHeader( m_p_rx_buf )), 1 ); } /** * Determine if there's a packet ready to go, or if we should do nothing * until the next packet arrives */ void waitForNextPacket() { atomic { if ( m_state == S_STOPPED ) { call SpiResource.release(); return; } atomic receivingPacket = FALSE; /* * The FIFOP pin here is high when there are 0 bytes in the RX FIFO * and goes low as soon as there are bytes in the RX FIFO. The pin * is inverted from what the datasheet says, and its threshold is 127. * Whenever the FIFOP line goes low, as you can see from the interrupt * handler elsewhere in this module, it means we received a new packet. * If the line stays low without generating an interrupt, that means * there's still more data to be received. */ if ( ( m_missed_packets && call FIFO.get() ) || !call FIFOP.get() ) { // A new packet is buffered up and ready to go if ( m_missed_packets ) { m_missed_packets--; } #ifdef CC2420_HW_SECURITY call SpiResource.release(); m_state = S_RX_DEC; beginDec(); #else beginReceive(); #endif } else { // Wait for the next packet to arrive m_state = S_STARTED; m_missed_packets = 0; call SpiResource.release(); } } } /** * Reset this component */ void reset_state() { m_bytes_left = RXFIFO_SIZE; atomic receivingPacket = FALSE; m_timestamp_head = 0; m_timestamp_size = 0; m_missed_packets = 0; } /** * @return TRUE if the given message passes address recognition */ bool passesAddressCheck(message_t *msg) { cc2420_header_t *header = call CC2420PacketBody.getHeader( msg ); int mode = (header->fcf >> IEEE154_FCF_DEST_ADDR_MODE) & 3; ieee_eui64_t *ext_addr; if(!(call CC2420Config.isAddressRecognitionEnabled())) { return TRUE; } if (mode == IEEE154_ADDR_SHORT) { return (header->dest == call CC2420Config.getShortAddr() || header->dest == IEEE154_BROADCAST_ADDR); } else if (mode == IEEE154_ADDR_EXT) { ieee_eui64_t local_addr = (call CC2420Config.getExtAddr()); ext_addr = TCAST(ieee_eui64_t* ONE, &header->dest); return (memcmp(ext_addr->data, local_addr.data, IEEE_EUI64_LENGTH) == 0); } else { /* reject frames with either no address or invalid type */ return FALSE; } } } tinyos-2.1.2+dfsg/tos/chips/cc2420/security/000077500000000000000000000000001207233610700204405ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/security/CC2420KeysC.nc000066400000000000000000000037721207233610700225270ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko * @author Razvan Musaloiu-E. * @author Jong Hyun Lim */ configuration CC2420KeysC { provides interface CC2420Keys; } implementation { components new CC2420SpiC(); components HplCC2420PinsC as Pins; components CC2420KeysP; CC2420Keys = CC2420KeysP; CC2420KeysP.CSN -> Pins.CSN; CC2420KeysP.KEY0 -> CC2420SpiC.KEY0; CC2420KeysP.KEY1 -> CC2420SpiC.KEY1; CC2420KeysP.Resource -> CC2420SpiC.Resource; } tinyos-2.1.2+dfsg/tos/chips/cc2420/security/CC2420KeysP.nc000066400000000000000000000053041207233610700225350ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko * @author Razvan Musaloiu-E. * @author Jong Hyun Lim */ module CC2420KeysP { provides interface CC2420Keys; uses { interface GeneralIO as CSN; interface CC2420Ram as KEY0; interface CC2420Ram as KEY1; interface Resource; } } implementation { uint8_t *currentKey = NULL; bool currentKeyNo; task void resourceReq() { error_t error; error = call Resource.immediateRequest(); if(error != SUCCESS){ post resourceReq(); } } command error_t CC2420Keys.setKey(uint8_t keyNo, uint8_t* key) { if (currentKey != NULL || keyNo > 1) { return FAIL; } currentKey = key; currentKeyNo = keyNo; if(call Resource.request() != SUCCESS){ post resourceReq(); } return SUCCESS; } event void Resource.granted() { if (currentKeyNo) { call CSN.clr(); call KEY1.write(0, currentKey, 16); call CSN.set(); } else { call CSN.clr(); call KEY0.write(0, currentKey, 16); call CSN.set(); } call Resource.release(); currentKey = NULL; signal CC2420Keys.setKeyDone(currentKeyNo, currentKey); } } tinyos-2.1.2+dfsg/tos/chips/cc2420/security/SecAMSenderC.nc000066400000000000000000000045271207233610700231660ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko * @author Razvan Musaloiu-E. * @author Jong Hyun Lim */ generic configuration SecAMSenderC(am_id_t id) { provides { interface AMSend; interface Packet; interface AMPacket; interface PacketAcknowledgements as Acks; interface CC2420SecurityMode; } } implementation { components ActiveMessageC; components NoLedsC; components LedsC; components new CC2420SpiC(); components CC2420ActiveMessageC; components new AMSenderC(id); components new SecAMSenderP(id); AMSend = SecAMSenderP.AMSend; Packet = AMSenderC; Acks = CC2420ActiveMessageC; AMPacket = CC2420ActiveMessageC; CC2420SecurityMode = SecAMSenderP; SecAMSenderP.SubAMSend -> AMSenderC; SecAMSenderP.SecurityPacket -> AMSenderC; SecAMSenderP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/security/SecAMSenderP.nc000066400000000000000000000136611207233610700232020ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko * @author Razvan Musaloiu-E. * @author Jong Hyun Lim */ generic module SecAMSenderP(am_id_t id) { provides { interface AMSend; interface CC2420SecurityMode; } uses { interface AMSend as SubAMSend; interface Packet as SecurityPacket; interface AMPacket; interface Leds; } } implementation { uint32_t nonceCounter = 0; uint8_t secLevel = NO_SEC; uint8_t keyIndex = 0; uint8_t reserved = 0; // skip in cc2420 implementations uint8_t micLength = 0; uint8_t length; command error_t AMSend.send(am_addr_t addr, message_t* msg, uint8_t len) { cc2420_header_t* hdr = (cc2420_header_t*)msg->header; security_header_t* secHdr = (security_header_t*)&hdr->secHdr; #if ! defined(TFRAMES_ENABLED) (uint8_t*)secHdr += 1; #endif if(secHdr->secLevel == CBC_MAC_4 || secHdr->secLevel == CCM_4){ micLength = 4; }else if(secHdr->secLevel == CBC_MAC_8 || secHdr->secLevel == CCM_8){ micLength = 8; }else if(secHdr->secLevel == CBC_MAC_16 || secHdr->secLevel == CCM_16){ micLength = 16; } return call SubAMSend.send(addr, msg, len + (((secHdr->secLevel >= CBC_MAC_4 && secHdr->secLevel <= CBC_MAC_16) || (secHdr->secLevel >= CCM_4 && secHdr->secLevel <= CCM_16)) ? micLength : 0)); } command uint8_t AMSend.maxPayloadLength() { return call SecurityPacket.maxPayloadLength(); } command void* AMSend.getPayload(message_t* msg, uint8_t len) { return call SecurityPacket.getPayload(msg, len); } command error_t AMSend.cancel(message_t* msg) { return call SubAMSend.cancel(msg); } event void SubAMSend.sendDone(message_t *msg, error_t error) { signal AMSend.sendDone(msg, error); } command error_t CC2420SecurityMode.setCtr(message_t* msg, uint8_t setKey, uint8_t setSkip) { cc2420_header_t* hdr = (cc2420_header_t*)msg->header; security_header_t* secHdr = (security_header_t*)&hdr->secHdr; #if ! defined(TFRAMES_ENABLED) (uint8_t*)secHdr += 1; #endif if (setKey > 1 || setSkip > 7){ return FAIL; } secLevel = CTR; keyIndex = setKey; reserved = setSkip; nonceCounter++; secHdr->secLevel = secLevel; secHdr->keyMode = 1; // Fixed to 1 for now secHdr->reserved = reserved; //skip in cc2420 secHdr->frameCounter = nonceCounter; secHdr->keyID[0] = keyIndex; // Always first position for now due to fixed keyMode hdr->fcf |= 1 << IEEE154_FCF_SECURITY_ENABLED; return SUCCESS; } command error_t CC2420SecurityMode.setCbcMac(message_t* msg, uint8_t setKey, uint8_t setSkip, uint8_t size) { cc2420_header_t* hdr = (cc2420_header_t*)msg->header; security_header_t* secHdr = (security_header_t*)&hdr->secHdr; #if ! defined(TFRAMES_ENABLED) (uint8_t*)secHdr += 1; #endif if (setKey > 1 || (size != 4 && size != 8 && size != 16) || (setSkip > 7)){ return FAIL; } if(size == 4) secLevel = CBC_MAC_4; else if (size == 8) secLevel = CBC_MAC_8; else if (size == 16) secLevel = CBC_MAC_16; else return FAIL; keyIndex = setKey; reserved = setSkip; nonceCounter++; secHdr->secLevel = secLevel; secHdr->keyMode = 1; // Fixed to 1 for now secHdr->reserved = reserved; //skip in cc2420 secHdr->frameCounter = nonceCounter; secHdr->keyID[0] = keyIndex; // Always first position for now due to fixed keyMode hdr->fcf |= 1 << IEEE154_FCF_SECURITY_ENABLED; return SUCCESS; } command error_t CC2420SecurityMode.setCcm(message_t* msg, uint8_t setKey, uint8_t setSkip, uint8_t size) { cc2420_header_t* hdr = (cc2420_header_t*)msg->header; security_header_t* secHdr = (security_header_t*)&hdr->secHdr; #if ! defined(TFRAMES_ENABLED) (uint8_t*)secHdr += 1; #endif if (setKey > 1 || (size != 4 && size != 8 && size != 16) || (setSkip > 7)){ return FAIL; } if(size == 4) secLevel = CCM_4; else if (size == 8) secLevel = CCM_8; else if (size == 16) secLevel = CCM_16; else return FAIL; keyIndex = setKey; reserved = setSkip; nonceCounter++; secHdr->secLevel = secLevel; secHdr->keyMode = 1; // Fixed to 1 for now secHdr->reserved = reserved; //skip in cc2420 secHdr->frameCounter = nonceCounter; secHdr->keyID[0] = keyIndex; // Always first position for now due to fixed keyMode hdr->fcf |= 1 << IEEE154_FCF_SECURITY_ENABLED; return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/cc2420/spi/000077500000000000000000000000001207233610700173645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/spi/CC2420SpiC.nc000066400000000000000000000143201207233610700212620ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of basic SPI primitives for the ChipCon CC2420 radio. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2009-08-14 20:33:43 $ */ generic configuration CC2420SpiC() { provides interface Resource; provides interface ChipSpiResource; // commands provides interface CC2420Strobe as SNOP; provides interface CC2420Strobe as SXOSCON; provides interface CC2420Strobe as STXCAL; provides interface CC2420Strobe as SRXON; provides interface CC2420Strobe as STXON; provides interface CC2420Strobe as STXONCCA; provides interface CC2420Strobe as SRFOFF; provides interface CC2420Strobe as SXOSCOFF; provides interface CC2420Strobe as SFLUSHRX; provides interface CC2420Strobe as SFLUSHTX; provides interface CC2420Strobe as SACK; provides interface CC2420Strobe as SACKPEND; provides interface CC2420Strobe as SRXDEC; provides interface CC2420Strobe as STXENC; provides interface CC2420Strobe as SAES; // registers provides interface CC2420Register as MAIN; provides interface CC2420Register as MDMCTRL0; provides interface CC2420Register as MDMCTRL1; provides interface CC2420Register as RSSI; provides interface CC2420Register as SYNCWORD; provides interface CC2420Register as TXCTRL; provides interface CC2420Register as RXCTRL0; provides interface CC2420Register as RXCTRL1; provides interface CC2420Register as FSCTRL; provides interface CC2420Register as SECCTRL0; provides interface CC2420Register as SECCTRL1; provides interface CC2420Register as BATTMON; provides interface CC2420Register as IOCFG0; provides interface CC2420Register as IOCFG1; provides interface CC2420Register as MANFIDL; provides interface CC2420Register as MANFIDH; provides interface CC2420Register as FSMTC; provides interface CC2420Register as MANAND; provides interface CC2420Register as MANOR; provides interface CC2420Register as AGCCTRL; provides interface CC2420Register as RXFIFO_REGISTER; // ram provides interface CC2420Ram as IEEEADR; provides interface CC2420Ram as PANID; provides interface CC2420Ram as SHORTADR; provides interface CC2420Ram as TXFIFO_RAM; provides interface CC2420Ram as RXFIFO_RAM; provides interface CC2420Ram as KEY0; provides interface CC2420Ram as KEY1; provides interface CC2420Ram as SABUF; provides interface CC2420Ram as TXNONCE; provides interface CC2420Ram as RXNONCE; // fifos provides interface CC2420Fifo as RXFIFO; provides interface CC2420Fifo as TXFIFO; } implementation { enum { CLIENT_ID = unique( "CC2420Spi.Resource" ), }; components HplCC2420PinsC as Pins; components CC2420SpiWireC as Spi; ChipSpiResource = Spi.ChipSpiResource; Resource = Spi.Resource[ CLIENT_ID ]; // commands SNOP = Spi.Strobe[ CC2420_SNOP ]; SXOSCON = Spi.Strobe[ CC2420_SXOSCON ]; STXCAL = Spi.Strobe[ CC2420_STXCAL ]; SRXON = Spi.Strobe[ CC2420_SRXON ]; STXON = Spi.Strobe[ CC2420_STXON ]; STXONCCA = Spi.Strobe[ CC2420_STXONCCA ]; SRFOFF = Spi.Strobe[ CC2420_SRFOFF ]; SXOSCOFF = Spi.Strobe[ CC2420_SXOSCOFF ]; SFLUSHRX = Spi.Strobe[ CC2420_SFLUSHRX ]; SFLUSHTX = Spi.Strobe[ CC2420_SFLUSHTX ]; SACK = Spi.Strobe[ CC2420_SACK ]; SACKPEND = Spi.Strobe[ CC2420_SACKPEND ]; SRXDEC = Spi.Strobe[ CC2420_SRXDEC ]; STXENC = Spi.Strobe[ CC2420_STXENC ]; SAES = Spi.Strobe[ CC2420_SAES ]; // registers MAIN = Spi.Reg[ CC2420_MAIN ]; MDMCTRL0 = Spi.Reg[ CC2420_MDMCTRL0 ]; MDMCTRL1 = Spi.Reg[ CC2420_MDMCTRL1 ]; RSSI = Spi.Reg[ CC2420_RSSI ]; SYNCWORD = Spi.Reg[ CC2420_SYNCWORD ]; TXCTRL = Spi.Reg[ CC2420_TXCTRL ]; RXCTRL0 = Spi.Reg[ CC2420_RXCTRL0 ]; RXCTRL1 = Spi.Reg[ CC2420_RXCTRL1 ]; FSCTRL = Spi.Reg[ CC2420_FSCTRL ]; SECCTRL0 = Spi.Reg[ CC2420_SECCTRL0 ]; SECCTRL1 = Spi.Reg[ CC2420_SECCTRL1 ]; BATTMON = Spi.Reg[ CC2420_BATTMON ]; IOCFG0 = Spi.Reg[ CC2420_IOCFG0 ]; IOCFG1 = Spi.Reg[ CC2420_IOCFG1 ]; MANFIDL = Spi.Reg[ CC2420_MANFIDL ]; MANFIDH = Spi.Reg[ CC2420_MANFIDH ]; FSMTC = Spi.Reg[ CC2420_FSMTC ]; MANAND = Spi.Reg[ CC2420_MANAND ]; MANOR = Spi.Reg[ CC2420_MANOR ]; AGCCTRL = Spi.Reg[ CC2420_AGCCTRL ]; RXFIFO_REGISTER = Spi.Reg[ CC2420_RXFIFO ]; // ram IEEEADR = Spi.Ram[ CC2420_RAM_IEEEADR ]; PANID = Spi.Ram[ CC2420_RAM_PANID ]; SHORTADR = Spi.Ram[ CC2420_RAM_SHORTADR ]; TXFIFO_RAM = Spi.Ram[ CC2420_RAM_TXFIFO ]; RXFIFO_RAM = Spi.Ram[ CC2420_RAM_RXFIFO ]; KEY0 = Spi.Ram[ CC2420_RAM_KEY0 ]; KEY1 = Spi.Ram[ CC2420_RAM_KEY1 ]; SABUF = Spi.Ram[ CC2420_RAM_SABUF ]; TXNONCE = Spi.Ram[ CC2420_RAM_TXNONCE ]; RXNONCE = Spi.Ram[ CC2420_RAM_RXNONCE ]; // fifos RXFIFO = Spi.Fifo[ CC2420_RXFIFO ]; TXFIFO = Spi.Fifo[ CC2420_TXFIFO ]; } tinyos-2.1.2+dfsg/tos/chips/cc2420/spi/CC2420SpiP.nc000066400000000000000000000232501207233610700213010ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author David Moss * @author Roman Lim * @author Razvan Musaloie-E. * @author Jeonggil Ko * @version $Revision: 1.4 $ $Date: 2008-06-23 20:25:15 $ */ module CC2420SpiP @safe() { provides { interface ChipSpiResource; interface Resource[ uint8_t id ]; interface CC2420Fifo as Fifo[ uint8_t id ]; interface CC2420Ram as Ram[ uint16_t id ]; interface CC2420Register as Reg[ uint8_t id ]; interface CC2420Strobe as Strobe[ uint8_t id ]; } uses { interface Resource as SpiResource; interface SpiByte; interface SpiPacket; interface State as WorkingState; interface Leds; } } implementation { enum { RESOURCE_COUNT = uniqueCount( "CC2420Spi.Resource" ), NO_HOLDER = 0xFF, }; /** WorkingStates */ enum { S_IDLE, S_BUSY, }; /** Address to read/write on the CC2420, also maintains caller's client id */ norace uint16_t m_addr; /** Each bit represents a client ID that is requesting SPI bus access */ uint8_t m_requests = 0; /** The current client that owns the SPI bus */ uint8_t m_holder = NO_HOLDER; /** TRUE if it is safe to release the SPI bus after all users say ok */ bool release; /***************** Prototypes ****************/ error_t attemptRelease(); task void grant(); /***************** ChipSpiResource Commands ****************/ /** * Abort the release of the SPI bus. This must be called only with the * releasing() event */ async command void ChipSpiResource.abortRelease() { atomic release = FALSE; } /** * Release the SPI bus if there are no objections */ async command error_t ChipSpiResource.attemptRelease() { return attemptRelease(); } /***************** Resource Commands *****************/ async command error_t Resource.request[ uint8_t id ]() { atomic { if ( call WorkingState.requestState(S_BUSY) == SUCCESS ) { m_holder = id; if(call SpiResource.isOwner()) { post grant(); } else { call SpiResource.request(); } } else { m_requests |= 1 << id; } } return SUCCESS; } async command error_t Resource.immediateRequest[ uint8_t id ]() { error_t error; atomic { if ( call WorkingState.requestState(S_BUSY) != SUCCESS ) { return EBUSY; } if(call SpiResource.isOwner()) { m_holder = id; error = SUCCESS; } else if ((error = call SpiResource.immediateRequest()) == SUCCESS ) { m_holder = id; } else { call WorkingState.toIdle(); } } return error; } async command error_t Resource.release[ uint8_t id ]() { uint8_t i; atomic { if ( m_holder != id ) { return FAIL; } m_holder = NO_HOLDER; if ( !m_requests ) { call WorkingState.toIdle(); attemptRelease(); } else { for ( i = m_holder + 1; ; i++ ) { i %= RESOURCE_COUNT; if ( m_requests & ( 1 << i ) ) { m_holder = i; m_requests &= ~( 1 << i ); post grant(); return SUCCESS; } } } } return SUCCESS; } async command bool Resource.isOwner[ uint8_t id ]() { atomic return (m_holder == id); } /***************** SpiResource Events ****************/ event void SpiResource.granted() { post grant(); } /***************** Fifo Commands ****************/ async command cc2420_status_t Fifo.beginRead[ uint8_t addr ]( uint8_t* data, uint8_t len ) { cc2420_status_t status = 0; atomic { if(call WorkingState.isIdle()) { return status; } } m_addr = addr | 0x40; status = call SpiByte.write( m_addr ); call Fifo.continueRead[ addr ]( data, len ); return status; } async command error_t Fifo.continueRead[ uint8_t addr ]( uint8_t* data, uint8_t len ) { return call SpiPacket.send( NULL, data, len ); } async command cc2420_status_t Fifo.write[ uint8_t addr ]( uint8_t* data, uint8_t len ) { uint8_t status = 0; atomic { if(call WorkingState.isIdle()) { return status; } } m_addr = addr; status = call SpiByte.write( m_addr ); call SpiPacket.send( data, NULL, len ); return status; } /***************** RAM Commands ****************/ async command cc2420_status_t Ram.read[ uint16_t addr ]( uint8_t offset, uint8_t* data, uint8_t len ) { cc2420_status_t status = 0; atomic { if(call WorkingState.isIdle()) { return status; } } addr += offset; status = call SpiByte.write( addr | 0x80 ); call SpiByte.write( ( ( addr >> 1 ) & 0xC0 ) | 0x20 ); for ( ; len; len-- ) { *data++ = call SpiByte.write( 0 ); } return status; } async command cc2420_status_t Ram.write[ uint16_t addr ]( uint8_t offset, uint8_t* data, uint8_t len ) { cc2420_status_t status = 0; uint8_t tmpLen = len; uint8_t * COUNT(tmpLen) tmpData = (uint8_t * COUNT(tmpLen))data; atomic { if(call WorkingState.isIdle()) { return status; } } addr += offset; status = call SpiByte.write( addr | 0x80 ); call SpiByte.write( ( addr >> 1 ) & 0xc0 ); for ( ; len; len-- ) { call SpiByte.write( tmpData[tmpLen-len] ); } return status; } /***************** Register Commands ****************/ async command cc2420_status_t Reg.read[ uint8_t addr ]( uint16_t* data ) { cc2420_status_t status = 0; atomic { if(call WorkingState.isIdle()) { return status; } } status = call SpiByte.write( addr | 0x40 ); *data = (uint16_t)call SpiByte.write( 0 ) << 8; *data |= call SpiByte.write( 0 ); return status; } async command cc2420_status_t Reg.write[ uint8_t addr ]( uint16_t data ) { atomic { if(call WorkingState.isIdle()) { return 0; } } call SpiByte.write( addr ); call SpiByte.write( data >> 8 ); return call SpiByte.write( data & 0xff ); } /***************** Strobe Commands ****************/ async command cc2420_status_t Strobe.strobe[ uint8_t addr ]() { atomic { if(call WorkingState.isIdle()) { return 0; } } return call SpiByte.write( addr ); } /***************** SpiPacket Events ****************/ async event void SpiPacket.sendDone( uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len, error_t error ) { if ( m_addr & 0x40 ) { signal Fifo.readDone[ m_addr & ~0x40 ]( rx_buf, len, error ); } else { signal Fifo.writeDone[ m_addr ]( tx_buf, len, error ); } } /***************** Functions ****************/ error_t attemptRelease() { if(m_requests > 0 || m_holder != NO_HOLDER || !call WorkingState.isIdle()) { return FAIL; } atomic release = TRUE; signal ChipSpiResource.releasing(); atomic { if(release) { call SpiResource.release(); return SUCCESS; } } return EBUSY; } task void grant() { uint8_t holder; atomic { holder = m_holder; } signal Resource.granted[ holder ](); } /***************** Defaults ****************/ default event void Resource.granted[ uint8_t id ]() { } default async event void Fifo.readDone[ uint8_t addr ]( uint8_t* rx_buf, uint8_t rx_len, error_t error ) { } default async event void Fifo.writeDone[ uint8_t addr ]( uint8_t* tx_buf, uint8_t tx_len, error_t error ) { } default async event void ChipSpiResource.releasing() { } } tinyos-2.1.2+dfsg/tos/chips/cc2420/spi/CC2420SpiWireC.nc000066400000000000000000000046631207233610700221220ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2007-07-04 00:37:16 $ */ configuration CC2420SpiWireC { provides interface Resource[ uint8_t id ]; provides interface ChipSpiResource; provides interface CC2420Fifo as Fifo[ uint8_t id ]; provides interface CC2420Ram as Ram[ uint16_t id ]; provides interface CC2420Register as Reg[ uint8_t id ]; provides interface CC2420Strobe as Strobe[ uint8_t id ]; } implementation { components CC2420SpiP as SpiP; Resource = SpiP; Fifo = SpiP; Ram = SpiP; Reg = SpiP; Strobe = SpiP; ChipSpiResource = SpiP; components new StateC() as WorkingStateC; SpiP.WorkingState -> WorkingStateC; components new HplCC2420SpiC(); SpiP.SpiResource -> HplCC2420SpiC; SpiP.SpiByte -> HplCC2420SpiC; SpiP.SpiPacket -> HplCC2420SpiC; components LedsC; SpiP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/transmit/000077500000000000000000000000001207233610700204325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/transmit/CC2420TransmitC.nc000066400000000000000000000073651207233610700234110ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the transmit path for the ChipCon CC2420 radio. * * @author Jonathan Hui * @version $Revision: 1.3 $ $Date: 2009-08-14 20:33:43 $ */ #include "IEEE802154.h" configuration CC2420TransmitC { provides { interface StdControl; interface CC2420Transmit; interface RadioBackoff; interface ReceiveIndicator as EnergyIndicator; interface ReceiveIndicator as ByteIndicator; } } implementation { components CC2420TransmitP; StdControl = CC2420TransmitP; CC2420Transmit = CC2420TransmitP; RadioBackoff = CC2420TransmitP; EnergyIndicator = CC2420TransmitP.EnergyIndicator; ByteIndicator = CC2420TransmitP.ByteIndicator; components MainC; MainC.SoftwareInit -> CC2420TransmitP; MainC.SoftwareInit -> Alarm; components AlarmMultiplexC as Alarm; CC2420TransmitP.BackoffTimer -> Alarm; components HplCC2420PinsC as Pins; CC2420TransmitP.CCA -> Pins.CCA; CC2420TransmitP.CSN -> Pins.CSN; CC2420TransmitP.SFD -> Pins.SFD; components HplCC2420InterruptsC as Interrupts; CC2420TransmitP.CaptureSFD -> Interrupts.CaptureSFD; components new CC2420SpiC() as Spi; CC2420TransmitP.SpiResource -> Spi; CC2420TransmitP.ChipSpiResource -> Spi; CC2420TransmitP.SNOP -> Spi.SNOP; CC2420TransmitP.STXON -> Spi.STXON; CC2420TransmitP.STXONCCA -> Spi.STXONCCA; CC2420TransmitP.SFLUSHTX -> Spi.SFLUSHTX; CC2420TransmitP.TXCTRL -> Spi.TXCTRL; CC2420TransmitP.TXFIFO -> Spi.TXFIFO; CC2420TransmitP.TXFIFO_RAM -> Spi.TXFIFO_RAM; CC2420TransmitP.MDMCTRL1 -> Spi.MDMCTRL1; CC2420TransmitP.SECCTRL0 -> Spi.SECCTRL0; CC2420TransmitP.SECCTRL1 -> Spi.SECCTRL1; CC2420TransmitP.STXENC -> Spi.STXENC; CC2420TransmitP.TXNONCE -> Spi.TXNONCE; CC2420TransmitP.KEY0 -> Spi.KEY0; CC2420TransmitP.KEY1 -> Spi.KEY1; components CC2420ReceiveC; CC2420TransmitP.CC2420Receive -> CC2420ReceiveC; components CC2420PacketC; CC2420TransmitP.CC2420Packet -> CC2420PacketC; CC2420TransmitP.CC2420PacketBody -> CC2420PacketC; CC2420TransmitP.PacketTimeStamp -> CC2420PacketC; CC2420TransmitP.PacketTimeSyncOffset -> CC2420PacketC; components LedsC; CC2420TransmitP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/transmit/CC2420TransmitP.nc000066400000000000000000000607301207233610700234210ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author David Moss * @author Jung Il Choi Initial SACK implementation * @author JeongGil Ko * @author Razvan Musaloiu-E * @version $Revision: 1.18 $ $Date: 2010-04-13 20:27:05 $ */ #include "CC2420.h" #include "CC2420TimeSyncMessage.h" #include "crc.h" #include "message.h" module CC2420TransmitP @safe() { provides interface Init; provides interface StdControl; provides interface CC2420Transmit as Send; provides interface RadioBackoff; provides interface ReceiveIndicator as EnergyIndicator; provides interface ReceiveIndicator as ByteIndicator; uses interface Alarm as BackoffTimer; uses interface CC2420Packet; uses interface CC2420PacketBody; uses interface PacketTimeStamp; uses interface PacketTimeSyncOffset; uses interface GpioCapture as CaptureSFD; uses interface GeneralIO as CCA; uses interface GeneralIO as CSN; uses interface GeneralIO as SFD; uses interface Resource as SpiResource; uses interface ChipSpiResource; uses interface CC2420Fifo as TXFIFO; uses interface CC2420Ram as TXFIFO_RAM; uses interface CC2420Register as TXCTRL; uses interface CC2420Strobe as SNOP; uses interface CC2420Strobe as STXON; uses interface CC2420Strobe as STXONCCA; uses interface CC2420Strobe as SFLUSHTX; uses interface CC2420Register as MDMCTRL1; uses interface CC2420Strobe as STXENC; uses interface CC2420Register as SECCTRL0; uses interface CC2420Register as SECCTRL1; uses interface CC2420Ram as KEY0; uses interface CC2420Ram as KEY1; uses interface CC2420Ram as TXNONCE; uses interface CC2420Receive; uses interface Leds; } implementation { typedef enum { S_STOPPED, S_STARTED, S_LOAD, S_SAMPLE_CCA, S_BEGIN_TRANSMIT, S_SFD, S_EFD, S_ACK_WAIT, S_CANCEL, } cc2420_transmit_state_t; // This specifies how many jiffies the stack should wait after a // TXACTIVE to receive an SFD interrupt before assuming something is // wrong and aborting the send. There seems to be a condition // on the micaZ where the SFD interrupt is never handled. enum { CC2420_ABORT_PERIOD = 320 }; #ifdef CC2420_HW_SECURITY uint16_t startTime = 0; norace uint8_t secCtrlMode = 0; norace uint8_t nonceValue[16] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; norace uint8_t skip; norace uint16_t CTR_SECCTRL0, CTR_SECCTRL1; uint8_t securityChecked = 0; void securityCheck(); #endif norace message_t * ONE_NOK m_msg; norace bool m_cca; norace uint8_t m_tx_power; cc2420_transmit_state_t m_state = S_STOPPED; bool m_receiving = FALSE; uint16_t m_prev_time; /** Byte reception/transmission indicator */ bool sfdHigh; /** Let the CC2420 driver keep a lock on the SPI while waiting for an ack */ bool abortSpiRelease; /** Total CCA checks that showed no activity before the NoAck LPL send */ norace int8_t totalCcaChecks; /** The initial backoff period */ norace uint16_t myInitialBackoff; /** The congestion backoff period */ norace uint16_t myCongestionBackoff; /***************** Prototypes ****************/ error_t send( message_t * ONE p_msg, bool cca ); error_t resend( bool cca ); void loadTXFIFO(); void attemptSend(); void congestionBackoff(); error_t acquireSpiResource(); error_t releaseSpiResource(); void signalDone( error_t err ); /***************** Init Commands *****************/ command error_t Init.init() { call CCA.makeInput(); call CSN.makeOutput(); call SFD.makeInput(); return SUCCESS; } /***************** StdControl Commands ****************/ command error_t StdControl.start() { atomic { call CaptureSFD.captureRisingEdge(); m_state = S_STARTED; m_receiving = FALSE; abortSpiRelease = FALSE; m_tx_power = 0; } return SUCCESS; } command error_t StdControl.stop() { atomic { m_state = S_STOPPED; call BackoffTimer.stop(); call CaptureSFD.disable(); call SpiResource.release(); // REMOVE call CSN.set(); } return SUCCESS; } /**************** Send Commands ****************/ async command error_t Send.send( message_t* ONE p_msg, bool useCca ) { return send( p_msg, useCca ); } async command error_t Send.resend(bool useCca) { return resend( useCca ); } async command error_t Send.cancel() { atomic { switch( m_state ) { case S_LOAD: case S_SAMPLE_CCA: case S_BEGIN_TRANSMIT: m_state = S_CANCEL; break; default: // cancel not allowed while radio is busy transmitting return FAIL; } } return SUCCESS; } async command error_t Send.modify( uint8_t offset, uint8_t* buf, uint8_t len ) { call CSN.clr(); call TXFIFO_RAM.write( offset, buf, len ); call CSN.set(); return SUCCESS; } /***************** Indicator Commands ****************/ command bool EnergyIndicator.isReceiving() { return !(call CCA.get()); } command bool ByteIndicator.isReceiving() { bool high; atomic high = sfdHigh; return high; } /***************** RadioBackoff Commands ****************/ /** * Must be called within a requestInitialBackoff event * @param backoffTime the amount of time in some unspecified units to backoff */ async command void RadioBackoff.setInitialBackoff(uint16_t backoffTime) { myInitialBackoff = backoffTime + 1; } /** * Must be called within a requestCongestionBackoff event * @param backoffTime the amount of time in some unspecified units to backoff */ async command void RadioBackoff.setCongestionBackoff(uint16_t backoffTime) { myCongestionBackoff = backoffTime + 1; } async command void RadioBackoff.setCca(bool useCca) { } // this method converts a 16-bit timestamp into a 32-bit one inline uint32_t getTime32(uint16_t captured_time) { uint32_t now = call BackoffTimer.getNow(); // the captured_time is always in the past return now - (uint16_t)(now - captured_time); } /** * The CaptureSFD event is actually an interrupt from the capture pin * which is connected to timing circuitry and timer modules. This * type of interrupt allows us to see what time (being some relative value) * the event occurred, and lets us accurately timestamp our packets. This * allows higher levels in our system to synchronize with other nodes. * * Because the SFD events can occur so quickly, and the interrupts go * in both directions, we set up the interrupt but check the SFD pin to * determine if that interrupt condition has already been met - meaning, * we should fall through and continue executing code where that interrupt * would have picked up and executed had our microcontroller been fast enough. */ async event void CaptureSFD.captured( uint16_t time ) { uint32_t time32; uint8_t sfd_state = 0; atomic { time32 = getTime32(time); switch( m_state ) { case S_SFD: m_state = S_EFD; sfdHigh = TRUE; // in case we got stuck in the receive SFD interrupts, we can reset // the state here since we know that we are not receiving anymore m_receiving = FALSE; call CaptureSFD.captureFallingEdge(); call PacketTimeStamp.set(m_msg, time32); if (call PacketTimeSyncOffset.isSet(m_msg)) { uint8_t absOffset = sizeof(message_header_t)-sizeof(cc2420_header_t)+call PacketTimeSyncOffset.get(m_msg); timesync_radio_t *timesync = (timesync_radio_t *)((nx_uint8_t*)m_msg+absOffset); // set timesync event time as the offset between the event time and the SFD interrupt time (TEP 133) *timesync -= time32; call CSN.clr(); call TXFIFO_RAM.write( absOffset, (uint8_t*)timesync, sizeof(timesync_radio_t) ); call CSN.set(); //restoring the event time to the original value *timesync += time32; } if ( (call CC2420PacketBody.getHeader( m_msg ))->fcf & ( 1 << IEEE154_FCF_ACK_REQ ) ) { // This is an ack packet, don't release the chip's SPI bus lock. abortSpiRelease = TRUE; } releaseSpiResource(); call BackoffTimer.stop(); if ( call SFD.get() ) { break; } /** Fall Through because the next interrupt was already received */ case S_EFD: sfdHigh = FALSE; call CaptureSFD.captureRisingEdge(); if ( (call CC2420PacketBody.getHeader( m_msg ))->fcf & ( 1 << IEEE154_FCF_ACK_REQ ) ) { m_state = S_ACK_WAIT; call BackoffTimer.start( CC2420_ACK_WAIT_DELAY ); } else { signalDone(SUCCESS); } if ( !call SFD.get() ) { break; } /** Fall Through because the next interrupt was already received */ default: /* this is the SFD for received messages */ if ( !m_receiving && sfdHigh == FALSE ) { sfdHigh = TRUE; call CaptureSFD.captureFallingEdge(); // safe the SFD pin status for later use sfd_state = call SFD.get(); call CC2420Receive.sfd( time32 ); m_receiving = TRUE; m_prev_time = time; if ( call SFD.get() ) { // wait for the next interrupt before moving on return; } // if SFD.get() = 0, then an other interrupt happened since we // reconfigured CaptureSFD! Fall through } if ( sfdHigh == TRUE ) { sfdHigh = FALSE; call CaptureSFD.captureRisingEdge(); m_receiving = FALSE; /* if sfd_state is 1, then we fell through, but at the time of * saving the time stamp the SFD was still high. Thus, the timestamp * is valid. * if the sfd_state is 0, then either we fell through and SFD * was low while we safed the time stamp, or we didn't fall through. * Thus, we check for the time between the two interrupts. * FIXME: Why 10 tics? Seams like some magic number... */ if ((sfd_state == 0) && (time - m_prev_time < 10) ) { call CC2420Receive.sfd_dropped(); if (m_msg) call PacketTimeStamp.clear(m_msg); } break; } } } } /***************** ChipSpiResource Events ****************/ async event void ChipSpiResource.releasing() { if(abortSpiRelease) { call ChipSpiResource.abortRelease(); } } /***************** CC2420Receive Events ****************/ /** * If the packet we just received was an ack that we were expecting, * our send is complete. */ async event void CC2420Receive.receive( uint8_t type, message_t* ack_msg ) { cc2420_header_t* ack_header; cc2420_header_t* msg_header; cc2420_metadata_t* msg_metadata; uint8_t* ack_buf; uint8_t length; if ( type == IEEE154_TYPE_ACK && m_msg) { ack_header = call CC2420PacketBody.getHeader( ack_msg ); msg_header = call CC2420PacketBody.getHeader( m_msg ); if ( m_state == S_ACK_WAIT && msg_header->dsn == ack_header->dsn ) { call BackoffTimer.stop(); msg_metadata = call CC2420PacketBody.getMetadata( m_msg ); ack_buf = (uint8_t *) ack_header; length = ack_header->length; msg_metadata->ack = TRUE; msg_metadata->rssi = ack_buf[ length - 1 ]; msg_metadata->lqi = ack_buf[ length ] & 0x7f; signalDone(SUCCESS); } } } /***************** SpiResource Events ****************/ event void SpiResource.granted() { uint8_t cur_state; atomic { cur_state = m_state; } switch( cur_state ) { case S_LOAD: loadTXFIFO(); break; case S_BEGIN_TRANSMIT: attemptSend(); break; case S_CANCEL: call CSN.clr(); call SFLUSHTX.strobe(); call CSN.set(); releaseSpiResource(); atomic { m_state = S_STARTED; } signal Send.sendDone( m_msg, ECANCEL ); break; default: releaseSpiResource(); break; } } /***************** TXFIFO Events ****************/ /** * The TXFIFO is used to load packets into the transmit buffer on the * chip */ async event void TXFIFO.writeDone( uint8_t* tx_buf, uint8_t tx_len, error_t error ) { call CSN.set(); if ( m_state == S_CANCEL ) { atomic { call CSN.clr(); call SFLUSHTX.strobe(); call CSN.set(); } releaseSpiResource(); m_state = S_STARTED; signal Send.sendDone( m_msg, ECANCEL ); } else if ( !m_cca ) { atomic { m_state = S_BEGIN_TRANSMIT; } attemptSend(); } else { releaseSpiResource(); atomic { m_state = S_SAMPLE_CCA; } signal RadioBackoff.requestInitialBackoff(m_msg); call BackoffTimer.start(myInitialBackoff); } } async event void TXFIFO.readDone( uint8_t* tx_buf, uint8_t tx_len, error_t error ) { } /***************** Timer Events ****************/ /** * The backoff timer is mainly used to wait for a moment before trying * to send a packet again. But we also use it to timeout the wait for * an acknowledgement, and timeout the wait for an SFD interrupt when * we should have gotten one. */ async event void BackoffTimer.fired() { atomic { switch( m_state ) { case S_SAMPLE_CCA : // sample CCA and wait a little longer if free, just in case we // sampled during the ack turn-around window if ( call CCA.get() ) { m_state = S_BEGIN_TRANSMIT; call BackoffTimer.start( CC2420_TIME_ACK_TURNAROUND ); } else { congestionBackoff(); } break; case S_BEGIN_TRANSMIT: case S_CANCEL: if ( acquireSpiResource() == SUCCESS ) { attemptSend(); } break; case S_ACK_WAIT: signalDone( SUCCESS ); break; case S_SFD: // We didn't receive an SFD interrupt within CC2420_ABORT_PERIOD // jiffies. Assume something is wrong. call SFLUSHTX.strobe(); call CaptureSFD.captureRisingEdge(); releaseSpiResource(); signalDone( ERETRY ); break; default: break; } } } /***************** Functions ****************/ /** * Set up a message to be sent. First load it into the outbound tx buffer * on the chip, then attempt to send it. * @param *p_msg Pointer to the message that needs to be sent * @param cca TRUE if this transmit should use clear channel assessment */ error_t send( message_t* ONE p_msg, bool cca ) { atomic { if (m_state == S_CANCEL) { return ECANCEL; } if ( m_state != S_STARTED ) { return FAIL; } #ifdef CC2420_HW_SECURITY securityChecked = 0; #endif m_state = S_LOAD; m_cca = cca; m_msg = p_msg; totalCcaChecks = 0; } if ( acquireSpiResource() == SUCCESS ) { loadTXFIFO(); } return SUCCESS; } /** * Resend a packet that already exists in the outbound tx buffer on the * chip * @param cca TRUE if this transmit should use clear channel assessment */ error_t resend( bool cca ) { atomic { if (m_state == S_CANCEL) { return ECANCEL; } if ( m_state != S_STARTED ) { return FAIL; } m_cca = cca; m_state = cca ? S_SAMPLE_CCA : S_BEGIN_TRANSMIT; totalCcaChecks = 0; } if(m_cca) { signal RadioBackoff.requestInitialBackoff(m_msg); call BackoffTimer.start( myInitialBackoff ); } else if ( acquireSpiResource() == SUCCESS ) { attemptSend(); } return SUCCESS; } #ifdef CC2420_HW_SECURITY task void waitTask(){ call Leds.led2Toggle(); if(SECURITYLOCK == 1){ post waitTask(); }else{ securityCheck(); } } void securityCheck(){ cc2420_header_t* msg_header; cc2420_status_t status; security_header_t* secHdr; uint8_t mode; uint8_t key; uint8_t micLength; msg_header = (cc2420_header_t*)m_msg->header; if(!(msg_header->fcf & (1 << IEEE154_FCF_SECURITY_ENABLED))){ // Security is not used for this packet // Make sure to set mode to 0 and the others to the default values CTR_SECCTRL0 = ((0 << CC2420_SECCTRL0_SEC_MODE) | (1 << CC2420_SECCTRL0_SEC_M) | (1 << CC2420_SECCTRL0_SEC_TXKEYSEL) | (1 << CC2420_SECCTRL0_SEC_CBC_HEAD)) ; call CSN.clr(); call SECCTRL0.write(CTR_SECCTRL0); call CSN.set(); return; } if(SECURITYLOCK == 1){ post waitTask(); }else { //Will perform encryption lock registers atomic SECURITYLOCK = 1; secHdr = (security_header_t*) &msg_header->secHdr; #if ! defined(TFRAMES_ENABLED) secHdr=(security_header_t*)((uint8_t*)secHdr+1); #endif memcpy(&nonceValue[3], &(secHdr->frameCounter), 4); skip = secHdr->reserved; key = secHdr->keyID[0]; // For now this is the only key selection mode. if (secHdr->secLevel == NO_SEC){ mode = CC2420_NO_SEC; micLength = 4; }else if (secHdr->secLevel == CBC_MAC_4){ // call Leds.led0Toggle(); mode = CC2420_CBC_MAC; micLength = 4; }else if (secHdr->secLevel == CBC_MAC_8){ mode = CC2420_CBC_MAC; micLength = 8; }else if (secHdr->secLevel == CBC_MAC_16){ mode = CC2420_CBC_MAC; micLength = 16; }else if (secHdr->secLevel == CTR){ // call Leds.led1Toggle(); mode = CC2420_CTR; micLength = 4; }else if (secHdr->secLevel == CCM_4){ mode = CC2420_CCM; micLength = 4; }else if (secHdr->secLevel == CCM_8){ mode = CC2420_CCM; micLength = 8; }else if (secHdr->secLevel == CCM_16){ mode = CC2420_CCM; micLength = 16; }else{ return; } CTR_SECCTRL0 = ((mode << CC2420_SECCTRL0_SEC_MODE) | ((micLength-2)/2 << CC2420_SECCTRL0_SEC_M) | (key << CC2420_SECCTRL0_SEC_TXKEYSEL) | (1 << CC2420_SECCTRL0_SEC_CBC_HEAD)) ; #ifndef TFRAMES_ENABLED CTR_SECCTRL1 = (skip+11+sizeof(security_header_t)+((skip+11+sizeof(security_header_t))<<8)); #else CTR_SECCTRL1 = (skip+10+sizeof(security_header_t)+((skip+10+sizeof(security_header_t))<<8)); #endif call CSN.clr(); call SECCTRL0.write(CTR_SECCTRL0); call CSN.set(); call CSN.clr(); call SECCTRL1.write(CTR_SECCTRL1); call CSN.set(); call CSN.clr(); call TXNONCE.write(0, nonceValue, 16); call CSN.set(); call CSN.clr(); status = call SNOP.strobe(); call CSN.set(); while(status & CC2420_STATUS_ENC_BUSY){ call CSN.clr(); status = call SNOP.strobe(); call CSN.set(); } // Inline security will be activated by STXON or STXONCCA strobes atomic SECURITYLOCK = 0; } } #endif /** * Attempt to send the packet we have loaded into the tx buffer on * the radio chip. The STXONCCA will send the packet immediately if * the channel is clear. If we're not concerned about whether or not * the channel is clear (i.e. m_cca == FALSE), then STXON will send the * packet without checking for a clear channel. * * If the packet didn't get sent, then congestion == TRUE. In that case, * we reset the backoff timer and try again in a moment. * * If the packet got sent, we should expect an SFD interrupt to take * over, signifying the packet is getting sent. * * If security is enabled, STXONCCA or STXON will perform inline security * options before transmitting the packet. */ void attemptSend() { uint8_t status; bool congestion = TRUE; atomic { if (m_state == S_CANCEL) { call SFLUSHTX.strobe(); releaseSpiResource(); call CSN.set(); m_state = S_STARTED; signal Send.sendDone( m_msg, ECANCEL ); return; } #ifdef CC2420_HW_SECURITY if(securityChecked != 1){ securityCheck(); } securityChecked = 1; #endif call CSN.clr(); status = m_cca ? call STXONCCA.strobe() : call STXON.strobe(); if ( !( status & CC2420_STATUS_TX_ACTIVE ) ) { status = call SNOP.strobe(); if ( status & CC2420_STATUS_TX_ACTIVE ) { congestion = FALSE; } } m_state = congestion ? S_SAMPLE_CCA : S_SFD; call CSN.set(); } if ( congestion ) { totalCcaChecks = 0; releaseSpiResource(); congestionBackoff(); } else { call BackoffTimer.start(CC2420_ABORT_PERIOD); } } /** * Congestion Backoff */ void congestionBackoff() { atomic { signal RadioBackoff.requestCongestionBackoff(m_msg); call BackoffTimer.start(myCongestionBackoff); } } error_t acquireSpiResource() { error_t error = call SpiResource.immediateRequest(); if ( error != SUCCESS ) { call SpiResource.request(); } return error; } error_t releaseSpiResource() { call SpiResource.release(); return SUCCESS; } /** * Setup the packet transmission power and load the tx fifo buffer on * the chip with our outbound packet. * * Warning: the tx_power metadata might not be initialized and * could be a value other than 0 on boot. Verification is needed here * to make sure the value won't overstep its bounds in the TXCTRL register * and is transmitting at max power by default. * * It should be possible to manually calculate the packet's CRC here and * tack it onto the end of the header + payload when loading into the TXFIFO, * so the continuous modulation low power listening strategy will continually * deliver valid packets. This would increase receive reliability for * mobile nodes and lossy connections. The crcByte() function should use * the same CRC polynomial as the CC2420's AUTOCRC functionality. */ void loadTXFIFO() { cc2420_header_t* header = call CC2420PacketBody.getHeader( m_msg ); uint8_t tx_power = (call CC2420PacketBody.getMetadata( m_msg ))->tx_power; if ( !tx_power ) { tx_power = CC2420_DEF_RFPOWER; } call CSN.clr(); if ( m_tx_power != tx_power ) { call TXCTRL.write( ( 2 << CC2420_TXCTRL_TXMIXBUF_CUR ) | ( 3 << CC2420_TXCTRL_PA_CURRENT ) | ( 1 << CC2420_TXCTRL_RESERVED ) | ( (tx_power & 0x1F) << CC2420_TXCTRL_PA_LEVEL ) ); } m_tx_power = tx_power; { uint8_t tmpLen __DEPUTY_UNUSED__ = header->length - 1; call TXFIFO.write(TCAST(uint8_t * COUNT(tmpLen), header), header->length - 1); } } void signalDone( error_t err ) { atomic m_state = S_STARTED; abortSpiRelease = FALSE; call ChipSpiResource.attemptRelease(); signal Send.sendDone( m_msg, err ); } } tinyos-2.1.2+dfsg/tos/chips/cc2420/unique/000077500000000000000000000000001207233610700200775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420/unique/UniqueReceiveC.nc000066400000000000000000000045611207233610700233030ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * This layer keeps a history of the past RECEIVE_HISTORY_SIZE received messages * If the source address and dsn number of a newly received message matches * our recent history, we drop the message because we've already seen it. * This should sit at the bottom of the stack * @author David Moss */ configuration UniqueReceiveC { provides { interface Receive; interface Receive as DuplicateReceive; } uses { interface Receive as SubReceive; } } implementation { components UniqueReceiveP, CC2420PacketC, MainC; Receive = UniqueReceiveP.Receive; DuplicateReceive = UniqueReceiveP.DuplicateReceive; SubReceive = UniqueReceiveP.SubReceive; MainC.SoftwareInit -> UniqueReceiveP; UniqueReceiveP.CC2420PacketBody -> CC2420PacketC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/unique/UniqueReceiveP.nc000066400000000000000000000142621207233610700233170ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * This layer keeps a history of the past RECEIVE_HISTORY_SIZE received messages * If the source address and dsn number of a newly received message matches * our recent history, we drop the message because we've already seen it. * @author David Moss */ #include "CC2420.h" module UniqueReceiveP @safe() { provides { interface Receive; interface Receive as DuplicateReceive; interface Init; } uses { interface Receive as SubReceive; interface CC2420PacketBody; } } implementation { struct { uint16_t source; uint8_t dsn; } receivedMessages[RECEIVE_HISTORY_SIZE]; uint8_t writeIndex = 0; /** History element containing info on a source previously received from */ uint8_t recycleSourceElement; enum { INVALID_ELEMENT = 0xFF, }; /***************** Init Commands *****************/ command error_t Init.init() { int i; for(i = 0; i < RECEIVE_HISTORY_SIZE; i++) { receivedMessages[i].source = (am_addr_t) 0xFFFF; receivedMessages[i].dsn = 0; } return SUCCESS; } /***************** Prototypes Commands ***************/ bool hasSeen(uint16_t msgSource, uint8_t msgDsn); void insert(uint16_t msgSource, uint8_t msgDsn); uint16_t getSourceKey(message_t ONE *msg); /***************** SubReceive Events *****************/ event message_t *SubReceive.receive(message_t* msg, void* payload, uint8_t len) { uint16_t msgSource = getSourceKey(msg); uint8_t msgDsn = (call CC2420PacketBody.getHeader(msg))->dsn; if(hasSeen(msgSource, msgDsn)) { return signal DuplicateReceive.receive(msg, payload, len); } else { insert(msgSource, msgDsn); return signal Receive.receive(msg, payload, len); } } /****************** Functions ****************/ /** * This function does two things: * 1. It loops through our entire receive history and detects if we've * seen this DSN before from the given source (duplicate packet) * 2. It detects if we've seen messages from this source before, so we know * where to update our history if it turns out this is a new message. * * The global recycleSourceElement variable stores the location of the next insert * if we've received a packet from that source before. Otherwise, it's up * to the insert() function to decide who to kick out of our history. */ bool hasSeen(uint16_t msgSource, uint8_t msgDsn) { int i; recycleSourceElement = INVALID_ELEMENT; atomic { for(i = 0; i < RECEIVE_HISTORY_SIZE; i++) { if(receivedMessages[i].source == msgSource) { if(receivedMessages[i].dsn == msgDsn) { // Only exit this loop if we found a duplicate packet return TRUE; } recycleSourceElement = i; } } } return FALSE; } /** * Insert the message into the history. If we received a message from this * source before, insert it into the same location as last time and verify * that the "writeIndex" is not pointing to that location. Otherwise, * insert it into the "writeIndex" location. */ void insert(uint16_t msgSource, uint8_t msgDsn) { uint8_t element = recycleSourceElement; bool increment = FALSE; atomic { if(element == INVALID_ELEMENT || writeIndex == element) { // Use the writeIndex element to insert this new message into element = writeIndex; increment = TRUE; } receivedMessages[element].source = msgSource; receivedMessages[element].dsn = msgDsn; if(increment) { writeIndex++; writeIndex %= RECEIVE_HISTORY_SIZE; } } } /** * Derive a key to to store the source address with. * * For long (EUI64) addresses, use the sum of the word in the * address as a key in the table to avoid manipulating the full * address. */ uint16_t getSourceKey(message_t * ONE msg) { cc2420_header_t *hdr = call CC2420PacketBody.getHeader(msg); int s_mode = (hdr->fcf >> IEEE154_FCF_SRC_ADDR_MODE) & 0x3; int d_mode = (hdr->fcf >> IEEE154_FCF_DEST_ADDR_MODE) & 0x3; int s_offset = 2, s_len = 2; uint16_t key = 0; uint8_t *current = (uint8_t *)&hdr->dest; int i; if (s_mode == IEEE154_ADDR_EXT) { s_len = 8; } if (d_mode == IEEE154_ADDR_EXT) { s_offset = 8; } current += s_offset; for (i = 0; i < s_len; i++) { key += current[i]; } return key; } /***************** Defaults ****************/ default event message_t *DuplicateReceive.receive(message_t *msg, void *payload, uint8_t len) { return msg; } } tinyos-2.1.2+dfsg/tos/chips/cc2420/unique/UniqueSendC.nc000066400000000000000000000042311207233610700226040ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Generate a unique dsn byte for this outgoing packet * This should sit at the top of the stack * @author David Moss */ configuration UniqueSendC { provides { interface Send; } uses { interface Send as SubSend; } } implementation { components UniqueSendP, new StateC(), RandomC, CC2420PacketC, MainC; Send = UniqueSendP.Send; SubSend = UniqueSendP.SubSend; MainC.SoftwareInit -> UniqueSendP; UniqueSendP.State -> StateC; UniqueSendP.Random -> RandomC; UniqueSendP.CC2420PacketBody -> CC2420PacketC; } tinyos-2.1.2+dfsg/tos/chips/cc2420/unique/UniqueSendP.nc000066400000000000000000000065511207233610700226300ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * This layer is responsible for supplying a unique data sequence number (dsn) * to each outgoing message. * @author David Moss */ module UniqueSendP @safe() { provides { interface Send; interface Init; } uses { interface Send as SubSend; interface State; interface Random; interface CC2420PacketBody; } } implementation { uint8_t localSendId; enum { S_IDLE, S_SENDING, }; /***************** Init Commands ****************/ command error_t Init.init() { localSendId = call Random.rand16(); return SUCCESS; } /***************** Send Commands ****************/ /** * Each call to this send command gives the message a single * DSN that does not change for every copy of the message * sent out. For messages that are not acknowledged, such as * a broadcast address message, the receiving end does not * signal receive() more than once for that message. */ command error_t Send.send(message_t *msg, uint8_t len) { error_t error; if(call State.requestState(S_SENDING) == SUCCESS) { (call CC2420PacketBody.getHeader(msg))->dsn = localSendId++; if((error = call SubSend.send(msg, len)) != SUCCESS) { call State.toIdle(); } return error; } return EBUSY; } command error_t Send.cancel(message_t *msg) { return call SubSend.cancel(msg); } command uint8_t Send.maxPayloadLength() { return call SubSend.maxPayloadLength(); } command void *Send.getPayload(message_t* msg, uint8_t len) { return call SubSend.getPayload(msg, len); } /***************** SubSend Events ****************/ event void SubSend.sendDone(message_t *msg, error_t error) { call State.toIdle(); signal Send.sendDone(msg, error); } } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/000077500000000000000000000000001207233610700176775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CC2420ActiveMessageC.nc000066400000000000000000000047511207233610700235710ustar00rootroot00000000000000/* * Copyright (c) 2011, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== * Author(s): Jan Hauer * ======================================================================== */ /* We need this component only because some routing protocols, such as CTP, * wire to the radio-specific Active Message component to get the * LinkPacketMetadata, because - for some strange reason - this interface is * not provided by the standard ActiveMessageC in TinyOS. Note: because we only * provide one interface and don't need to wire to other components this * component is actually module. **/ #include "TKN154_MAC.h" module CC2420ActiveMessageC { provides { interface LinkPacketMetadata; } } implementation { async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) { ieee154_metadata_t *metadata = (ieee154_metadata_t*) msg->metadata; return metadata->linkQuality > 105; } } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CC2420AsyncSplitControl.nc000066400000000000000000000137551207233610700244040ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ $Date: 2010-06-29 22:07:45 $ * @author Jan Hauer * ======================================================================== */ /* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This interface is a mixture of a SplitControl/AsyncStdControl interface. * @author Jan Hauer */ interface CC2420AsyncSplitControl { /** * Start this component and all of its subcomponents. * * @return SUCCESS if the component was started successfully.
      * FAIL Otherwise */ async command error_t start(); /** * Stop this component and all of its subcomponents - iff this command * succeeds then stopDone will signal the result of the stop * operation. * * @return SUCCESS Stop operation was started, stopDone will be signalled * FAIL Otherwise (stopDone will not be signalled) */ async command error_t stop(); /** * Notify caller that the component has been stopped. This event * completes the stop() operation. * * @param error -- SUCCESS if the component was successfully * turned off, FAIL otherwise */ async event void stopDone(error_t error); } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CC2420Config.nc000066400000000000000000000067211207233610700221520ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * An HAL abstraction of the ChipCon CC2420 radio. This abstraction * deals specifically with radio configurations. All get() and set() * commands are single-phase. After setting some values, a call to * sync() is required for the changes to propagate to the cc2420 * hardware chip. This interface allows setting multiple parameters * before calling sync(). * * @author Jonathan Hui * @author Jan Hauer (added some commands) * @version $Revision: 1.1 $ $Date: 2008-06-16 18:02:40 $ */ interface CC2420Config { /** * Sync configuration changes with the radio hardware. This only * applies to set commands below. * * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t sync(); /** * Whether changes have been made that should be sync-ed. * * @return TRUE if changes have been made, FALSE otherwise. */ async command bool needsSync(); /** * Change the channel of the radio, between 11 and 26 */ command uint8_t getChannel(); command void setChannel( uint8_t channel ); /** * Change the short address of the radio. */ async command uint16_t getShortAddr(); command void setShortAddr( uint16_t address ); /** * Change the PAN address of the radio. */ async command uint16_t getPanAddr(); command void setPanAddr( uint16_t address ); /** * Change the PAN address of the radio. */ async command bool getPanCoordinator(); command void setPanCoordinator( bool pcoord ); /** * Change to promiscuous mode. */ command void setPromiscuousMode(bool on); async command bool isPromiscuousModeEnabled(); /** * Change the CCA mode. */ async command uint8_t getCCAMode(); command void setCCAMode(uint8_t mode); /** * Change the transmission power. */ async command uint8_t getTxPower(); command void setTxPower(uint8_t txPower); } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CC2420ControlP.nc000066400000000000000000000341231207233610700225020ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author David Moss * @author Urs Hunkeler (ReadRssi implementation) * @author Jan Hauer * @version $Revision: 1.5 $ $Date: 2009-05-05 16:56:49 $ */ #include "Timer.h" #include "AM.h" #include "TKN154_PIB.h" module CC2420ControlP { provides interface Init; provides interface Resource; provides interface CC2420Config; provides interface CC2420Power; uses interface Alarm as StartupAlarm; uses interface GeneralIO as CSN; uses interface GeneralIO as RSTN; uses interface GeneralIO as VREN; uses interface GpioInterrupt as InterruptCCA; uses interface GeneralIO as FIFO; uses interface CC2420Ram as IEEEADR; uses interface CC2420Register as FSCTRL; uses interface CC2420Register as IOCFG0; uses interface CC2420Register as IOCFG1; uses interface CC2420Register as MDMCTRL0; uses interface CC2420Register as MDMCTRL1; uses interface CC2420Register as RXCTRL1; uses interface CC2420Register as RSSI; uses interface CC2420Register as RXFIFO_REGISTER; uses interface CC2420Strobe as SNOP; uses interface CC2420Strobe as SRXON; uses interface CC2420Strobe as SRFOFF; uses interface CC2420Strobe as SXOSCOFF; uses interface CC2420Strobe as SXOSCON; uses interface CC2420Strobe as SACKPEND; uses interface CC2420Strobe as SFLUSHRX; uses interface CC2420Register as TXCTRL; uses interface AMPacket; uses interface Resource as SpiResource; uses interface FrameUtility; } implementation { typedef enum { S_VREG_STOPPED, S_VREG_STARTING, S_VREG_STARTED, S_XOSC_STARTING, S_XOSC_STARTED, } cc2420_control_state_t; uint8_t m_channel; uint16_t m_pan; uint16_t m_short_addr; bool autoAckEnabled; bool hwAutoAckDefault; bool addressRecognition; bool acceptReservedFrames; bool m_isPanCoord; uint8_t m_CCAMode; uint8_t m_txPower; bool m_needsSync; norace cc2420_control_state_t m_state = S_VREG_STOPPED; /***************** Prototypes ****************/ void writeFsctrl(); void writeMdmctrl0(); void writeId(); void writeTxPower(); /***************** Init Commands ****************/ command error_t Init.init() { call CSN.makeOutput(); call RSTN.makeOutput(); call VREN.makeOutput(); #if defined(CC2420_NO_ADDRESS_RECOGNITION) #warning Address recognition disabled! addressRecognition = FALSE; #else addressRecognition = TRUE; #endif #if defined(CC2420_NO_ACKNOWLEDGEMENTS) #warning Acknowledgements disabled! autoAckEnabled = FALSE; #else autoAckEnabled = TRUE; #endif hwAutoAckDefault = TRUE; acceptReservedFrames = FALSE; m_needsSync = FALSE; return SUCCESS; } /***************** Resource Commands ****************/ /* This module never actively requests the SPI resource, * instead the caller MUST request the SPI through this module * before it calls any of the provided commands and it must * release it afterwards (the caller can call multiple * commands in this module before it releases the SPI, though). */ async command error_t Resource.immediateRequest() { error_t error = call SpiResource.immediateRequest(); if ( error == SUCCESS ) { /* call CSN.clr();*/ } return error; } async command error_t Resource.request() { return call SpiResource.request(); } async command bool Resource.isOwner() { return call SpiResource.isOwner(); } async command error_t Resource.release() { atomic { /* call CSN.set();*/ return call SpiResource.release(); } } event void SpiResource.granted() { /* call CSN.clr();*/ signal Resource.granted(); } /***************** CC2420Power Commands ****************/ async command error_t CC2420Power.startVReg() { atomic { if ( m_state != S_VREG_STOPPED ) { return FAIL; } m_state = S_VREG_STARTING; } call VREN.set(); call StartupAlarm.start( CC2420_TIME_VREN * 2 ); // JH: changed from 32khz jiffies return SUCCESS; } async command error_t CC2420Power.stopVReg() { m_state = S_VREG_STOPPED; call RSTN.clr(); call VREN.clr(); call RSTN.set(); return SUCCESS; } async command error_t CC2420Power.startOscillator() { atomic { if ( m_state != S_VREG_STARTED ) { return FAIL; } m_state = S_XOSC_STARTING; call CSN.set(); call CSN.clr(); call IOCFG1.write( CC2420_SFDMUX_XOSC16M_STABLE << CC2420_IOCFG1_CCAMUX ); call InterruptCCA.enableRisingEdge(); call SXOSCON.strobe(); call IOCFG0.write( ( 1 << CC2420_IOCFG0_FIFOP_POLARITY ) | ( 127 << CC2420_IOCFG0_FIFOP_THR ) ); writeFsctrl(); writeMdmctrl0(); call RXCTRL1.write( ( 1 << CC2420_RXCTRL1_RXBPF_LOCUR ) | ( 1 << CC2420_RXCTRL1_LOW_LOWGAIN ) | ( 1 << CC2420_RXCTRL1_HIGH_HGM ) | ( 1 << CC2420_RXCTRL1_LNA_CAP_ARRAY ) | ( 1 << CC2420_RXCTRL1_RXMIX_TAIL ) | ( 1 << CC2420_RXCTRL1_RXMIX_VCM ) | ( 2 << CC2420_RXCTRL1_RXMIX_CURRENT ) ); call CSN.set(); } return SUCCESS; } async command error_t CC2420Power.stopOscillator() { atomic { if ( m_state != S_XOSC_STARTED ) { return FAIL; } m_state = S_VREG_STARTED; call CSN.set(); call CSN.clr(); call SXOSCOFF.strobe(); call CSN.set(); } return SUCCESS; } async command error_t CC2420Power.rxOn() { atomic { if ( !call SpiResource.isOwner() ) return FAIL; call CSN.set(); call CSN.clr(); call SRXON.strobe(); call SACKPEND.strobe(); // JH: ACKs need the pending bit set call CSN.set(); } return SUCCESS; } async command error_t CC2420Power.rfOff() { atomic { if ( !call SpiResource.isOwner() ) return FAIL; call CSN.set(); call CSN.clr(); call SRFOFF.strobe(); call CSN.set(); } return SUCCESS; } async command error_t CC2420Power.flushRxFifo() { uint16_t dummy; atomic { if ( !call SpiResource.isOwner() ) return FAIL; if ( call FIFO.get() ){ // check if there is something in the RXFIFO // SFLUSHRX: "Flush the RX FIFO buffer and reset the demodulator. // Always read at least one byte from the RXFIFO before // issuing the SFLUSHRX command strobe" (CC2420 Datasheet) call CSN.clr(); call RXFIFO_REGISTER.read(&dummy); // reading the byte call CSN.set(); call CSN.clr(); // "SFLUSHRX command strobe should be issued twice to ensure // that the SFD pin goes back to its idle state." (CC2420 Datasheet) call SFLUSHRX.strobe(); call SFLUSHRX.strobe(); call CSN.set(); } } return SUCCESS; } /***************** CC2420Config Commands ****************/ command uint8_t CC2420Config.getChannel() { atomic return m_channel; } command void CC2420Config.setChannel( uint8_t channel ) { atomic { m_needsSync = TRUE; m_channel = channel; } } async command uint16_t CC2420Config.getShortAddr() { atomic return m_short_addr; } command void CC2420Config.setShortAddr( uint16_t addr ) { atomic { m_needsSync = TRUE; m_short_addr = addr; } } async command uint16_t CC2420Config.getPanAddr() { atomic return m_pan; } command void CC2420Config.setPanAddr( uint16_t pan ) { atomic { m_needsSync = TRUE; m_pan = pan; } } async command bool CC2420Config.getPanCoordinator() { atomic return m_isPanCoord; } command void CC2420Config.setPanCoordinator( bool pCoord ) { atomic { m_needsSync = TRUE; m_isPanCoord = pCoord; } } command void CC2420Config.setPromiscuousMode(bool on) { atomic { m_needsSync = TRUE; if (on){ addressRecognition = FALSE; acceptReservedFrames = TRUE; autoAckEnabled = FALSE; } else { addressRecognition = TRUE; acceptReservedFrames = FALSE; autoAckEnabled = TRUE; } } } async command bool CC2420Config.isPromiscuousModeEnabled() { return acceptReservedFrames; } async command uint8_t CC2420Config.getCCAMode() { atomic return m_CCAMode; } command void CC2420Config.setCCAMode(uint8_t mode) { atomic { m_needsSync = TRUE; m_CCAMode = mode; } } async command uint8_t CC2420Config.getTxPower() { atomic return m_txPower; } command void CC2420Config.setTxPower(uint8_t txPower) { atomic { m_needsSync = TRUE; m_txPower = txPower; } } async command bool CC2420Config.needsSync(){ atomic return m_needsSync; } /** * Sync must be called to commit software parameters configured on * the microcontroller (through the CC2420Config interface) to the * CC2420 radio chip. */ async command error_t CC2420Config.sync() { atomic { if ( !call SpiResource.isOwner() ) return FAIL; if (m_needsSync){ call CSN.set(); call CSN.clr(); call SRFOFF.strobe(); call CSN.set(); call CSN.clr(); writeFsctrl(); writeMdmctrl0(); writeTxPower(); call CSN.set(); call CSN.clr(); writeId(); call CSN.set(); m_needsSync = FALSE; } } return SUCCESS; } /***************** ReadRssi Commands ****************/ async command error_t CC2420Power.rssi(int8_t *rssi) { uint16_t data; cc2420_status_t status; atomic { if ( !call SpiResource.isOwner() ) return FAIL; call CSN.set(); call CSN.clr(); status = call RSSI.read(&data); call CSN.set(); if ((status & 0x02)){ *rssi = (data & 0x00FF); return SUCCESS; } else return FAIL; } } /***************** StartupAlarm Events ****************/ async event void StartupAlarm.fired() { if ( m_state == S_VREG_STARTING ) { m_state = S_VREG_STARTED; call RSTN.clr(); call RSTN.set(); signal CC2420Power.startVRegDone(); } } /***************** InterruptCCA Events ****************/ async event void InterruptCCA.fired() { m_state = S_XOSC_STARTED; call InterruptCCA.disable(); call CSN.set(); call CSN.clr(); call IOCFG1.write( 0 ); writeId(); call CSN.set(); signal CC2420Power.startOscillatorDone(); } /***************** Functions ****************/ /** * Write teh FSCTRL register */ void writeFsctrl() { uint8_t channel; atomic { channel = m_channel; } call FSCTRL.write( ( 1 << CC2420_FSCTRL_LOCK_THR ) | ( ( (channel - 11)*5+357 ) << CC2420_FSCTRL_FREQ ) ); } /** * Write the MDMCTRL0 register */ void writeMdmctrl0() { atomic { uint8_t _acceptReservedFrames = (acceptReservedFrames ? 1: 0); uint8_t _panCoord = (m_isPanCoord ? 1: 0); uint8_t _addressRecognition = (addressRecognition ? 1: 0); uint8_t _autoAck = ((autoAckEnabled && hwAutoAckDefault) ? 1 : 0); call MDMCTRL0.write( ( _acceptReservedFrames << CC2420_MDMCTRL0_RESERVED_FRAME_MODE ) | ( _panCoord << CC2420_MDMCTRL0_PAN_COORDINATOR ) | ( _addressRecognition << CC2420_MDMCTRL0_ADR_DECODE ) | ( 2 << CC2420_MDMCTRL0_CCA_HYST ) | ( m_CCAMode << CC2420_MDMCTRL0_CCA_MOD ) | ( 1 << CC2420_MDMCTRL0_AUTOCRC ) | ( _autoAck << CC2420_MDMCTRL0_AUTOACK ) | ( 2 << CC2420_MDMCTRL0_PREAMBLE_LENGTH ) ); } // Jon Green: // MDMCTRL1.CORR_THR is defaulted to 20 instead of 0 like the datasheet says // If we add in changes to MDMCTRL1, be sure to include this fix. } /** * Write the IEEEADR register */ void writeId() { uint16_t bcnAccept = 0; nxle_uint16_t id[ 6 ]; atomic { call FrameUtility.copyLocalExtendedAddressLE((uint8_t*) &id); id[ 4 ] = m_pan; id[ 5 ] = m_short_addr; } if (m_pan == 0xFFFF) bcnAccept = 1; call IOCFG0.write( (bcnAccept << CC2420_IOCFG0_BCN_ACCEPT) | ( 1 << CC2420_IOCFG0_FIFOP_POLARITY ) | ( 127 << CC2420_IOCFG0_FIFOP_THR ) ); // ext.adr, PANID and short adr are located at consecutive addresses in RAM call IEEEADR.write(0, (uint8_t*)&id, sizeof(id)); } void writeTxPower(){ call TXCTRL.write( ( 2 << CC2420_TXCTRL_TXMIXBUF_CUR ) | ( 3 << CC2420_TXCTRL_PA_CURRENT ) | ( 1 << CC2420_TXCTRL_RESERVED ) | ( (m_txPower & 0x1F) << CC2420_TXCTRL_PA_LEVEL ) ); } } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CC2420ControlTransmitC.nc000066400000000000000000000120261207233610700242050ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2009-03-04 18:31:04 $ * @author Jan Hauer * ======================================================================== */ /** * This configuration combines CC2420ControlC and CC2420TransmitC * and uses only one instance of CC2420SpiC. * * @author Jonathan Hui * @author Jan-Hinrich Hauer * @version $Revision: 1.4 $ $Date: 2009-03-04 18:31:04 $ */ #include "CC2420.h" configuration CC2420ControlTransmitC { provides { // CC2420ControlC interface Resource; interface CC2420Config; interface CC2420Power; // CC2420TransmitC interface AsyncStdControl as TxControl; interface CC2420Tx; } uses { // CC2420ControlC interface Alarm as StartupAlarm; interface FrameUtility; // CC2420TransmitC interface Alarm as AckAlarm; interface CaptureTime; } } implementation { // CC2420ControlC components CC2420ControlP; Resource = CC2420ControlP; CC2420Config = CC2420ControlP; CC2420Power = CC2420ControlP; FrameUtility = CC2420ControlP; components MainC; MainC.SoftwareInit -> CC2420ControlP; CC2420ControlP.StartupAlarm = StartupAlarm; components HplCC2420PinsC as Pins; CC2420ControlP.CSN -> Pins.CSN; CC2420ControlP.RSTN -> Pins.RSTN; CC2420ControlP.VREN -> Pins.VREN; CC2420ControlP.FIFO -> Pins.FIFO; components HplCC2420InterruptsC as Interrupts; CC2420ControlP.InterruptCCA -> Interrupts.InterruptCCA; components new CC2420SpiC() as Spi; CC2420ControlP.SpiResource -> Spi; CC2420ControlP.SRXON -> Spi.SRXON; CC2420ControlP.SACKPEND -> Spi.SACKPEND; CC2420ControlP.SRFOFF -> Spi.SRFOFF; CC2420ControlP.SXOSCON -> Spi.SXOSCON; CC2420ControlP.SXOSCOFF -> Spi.SXOSCOFF; CC2420ControlP.FSCTRL -> Spi.FSCTRL; CC2420ControlP.IOCFG0 -> Spi.IOCFG0; CC2420ControlP.IOCFG1 -> Spi.IOCFG1; CC2420ControlP.MDMCTRL0 -> Spi.MDMCTRL0; CC2420ControlP.MDMCTRL1 -> Spi.MDMCTRL1; /* CC2420ControlP.PANID -> Spi.PANID;*/ CC2420ControlP.TXCTRL -> Spi.TXCTRL; CC2420ControlP.IEEEADR -> Spi.IEEEADR; CC2420ControlP.RXCTRL1 -> Spi.RXCTRL1; CC2420ControlP.SFLUSHRX-> Spi.SFLUSHRX; CC2420ControlP.RSSI -> Spi.RSSI; CC2420ControlP.RXFIFO_REGISTER -> Spi.RXFIFO_REGISTER; CC2420ControlP.SNOP -> Spi.SNOP; // CC2420TransmitC components CC2420TransmitP; TxControl = CC2420TransmitP; CC2420Tx = CC2420TransmitP; AckAlarm = CC2420TransmitP; CaptureTime = CC2420TransmitP; MainC.SoftwareInit -> CC2420TransmitP; CC2420TransmitP.CCA -> Pins.CCA; CC2420TransmitP.CSN -> Pins.CSN; CC2420TransmitP.SFD -> Pins.SFD; CC2420TransmitP.CaptureSFD -> Interrupts.CaptureSFD; CC2420TransmitP.FIFOP -> Pins.FIFOP; CC2420TransmitP.FIFO -> Pins.FIFO; CC2420TransmitP.ChipSpiResource -> Spi; CC2420TransmitP.SNOP -> Spi.SNOP; CC2420TransmitP.STXON -> Spi.STXON; CC2420TransmitP.STXONCCA -> Spi.STXONCCA; CC2420TransmitP.SFLUSHTX -> Spi.SFLUSHTX; CC2420TransmitP.TXCTRL -> Spi.TXCTRL; CC2420TransmitP.TXFIFO -> Spi.TXFIFO; CC2420TransmitP.TXFIFO_RAM -> Spi.TXFIFO_RAM; CC2420TransmitP.MDMCTRL1 -> Spi.MDMCTRL1; CC2420TransmitP.SRXON -> Spi.SRXON; CC2420TransmitP.SRFOFF -> Spi.SRFOFF; CC2420TransmitP.SFLUSHRX-> Spi.SFLUSHRX; CC2420TransmitP.SACKPEND -> Spi.SACKPEND; components CC2420ReceiveC; CC2420TransmitP.CC2420Receive -> CC2420ReceiveC; } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CC2420Power.nc000066400000000000000000000072251207233610700220410ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * An HAL abstraction of the ChipCon CC2420 radio. This abstraction * deals specifically with radio power operations (e.g. voltage * regulator, oscillator, etc). However, it does not include * transmission power, see the CC2420Config interface. * * @author Jonathan Hui * @author Jan Hauer * @version $Revision: 1.3 $ $Date: 2009-03-04 18:31:04 $ */ interface CC2420Power { /** * Start the voltage regulator on the CC2420. On SUCCESS, * startVReg() will be signalled when the voltage * regulator is fully on. * * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t startVReg(); /** * Signals that the voltage regulator has been started. */ async event void startVRegDone(); /** * Stop the voltage regulator immediately. * * @return SUCCESS always */ async command error_t stopVReg(); /** * Start the oscillator. On SUCCESS, startOscillator * will be signalled when the oscillator has been started. * * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t startOscillator(); /** * Signals that the oscillator has been started. */ async event void startOscillatorDone(); /** * Stop the oscillator. * * @return SUCCESS if the oscillator was stopped, FAIL otherwise. */ async command error_t stopOscillator(); /** * Enable RX. * * @return SUCCESS if receive mode has been enabled, FAIL otherwise. */ async command error_t rxOn(); /** * Disable RX. * * @return SUCCESS if receive mode has been disabled, FAIL otherwise. */ async command error_t rfOff(); /** * Read RSSI from the radio. * @return SUCCESS if RSSI was read successfully, FAIL otherwise. */ async command error_t rssi(int8_t *rssi); /** * Flush the RXFIFO if it is not empty. * Radio SHOULD be disabled (off) when calling this command. * * @return SUCCESS if fifo was flushed (or it was empty), FAIL otherwise. */ async command error_t flushRxFifo(); } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CC2420ReceiveC.nc000066400000000000000000000056071207233610700224340ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the receive path for the ChipCon CC2420 radio. * * @author Jonathan Hui * @author Jan Hauer * @version $Revision: 1.2 $ $Date: 2009-03-04 18:31:04 $ */ configuration CC2420ReceiveC { provides interface CC2420AsyncSplitControl; provides interface CC2420Receive; // to CC2420TransmitP for ACK provides interface CC2420Rx; // to the driver uses interface FrameUtility; uses interface CC2420Config; } implementation { components MainC; components CC2420ReceiveP; components new CC2420SpiC() as Spi; components HplCC2420PinsC as Pins; components HplCC2420InterruptsC as InterruptsC; CC2420AsyncSplitControl = CC2420ReceiveP; CC2420Receive = CC2420ReceiveP; CC2420Rx = CC2420ReceiveP; FrameUtility = CC2420ReceiveP; CC2420Config = CC2420ReceiveP; MainC.SoftwareInit -> CC2420ReceiveP; CC2420ReceiveP.CSN -> Pins.CSN; CC2420ReceiveP.FIFO -> Pins.FIFO; CC2420ReceiveP.FIFOP -> Pins.FIFOP; CC2420ReceiveP.InterruptFIFOP -> InterruptsC.InterruptFIFOP; CC2420ReceiveP.SpiResource -> Spi; CC2420ReceiveP.RXFIFO -> Spi.RXFIFO; CC2420ReceiveP.SFLUSHRX -> Spi.SFLUSHRX; CC2420ReceiveP.SACK -> Spi.SACK; CC2420ReceiveP.SACKPEND -> Spi.SACKPEND; CC2420ReceiveP.SRXON -> Spi.SRXON; CC2420ReceiveP.MDMCTRL1 -> Spi.MDMCTRL1; } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CC2420ReceiveP.nc000066400000000000000000000364471207233610700224570ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author David Moss * @author Jung Il Choi * @author Jan Hauer * @version $Revision: 1.4 $ $Date: 2009-05-05 16:56:49 $ */ module CC2420ReceiveP { provides interface Init; provides interface CC2420AsyncSplitControl as AsyncSplitControl; provides interface CC2420Receive; provides interface CC2420Rx; uses interface GeneralIO as CSN; uses interface GeneralIO as FIFO; uses interface GeneralIO as FIFOP; uses interface GpioInterrupt as InterruptFIFOP; uses interface Resource as SpiResource; uses interface CC2420Fifo as RXFIFO; uses interface CC2420Strobe as SACK; uses interface CC2420Strobe as SFLUSHRX; uses interface CC2420Strobe as SRXON; uses interface CC2420Strobe as SACKPEND; uses interface CC2420Register as MDMCTRL1; uses interface FrameUtility; uses interface CC2420Config; uses interface CC2420Ram as RXFIFO_RAM; } implementation { typedef enum { S_STOPPED, S_STARTING, S_STARTED, S_RX_LENGTH, S_RX_FCF, S_RX_HEADER, S_RX_PAYLOAD, } cc2420_receive_state_t; enum { RXFIFO_SIZE = 128, TIMESTAMP_QUEUE_SIZE = 8, //SACK_HEADER_LENGTH = 7, SACK_HEADER_LENGTH = 3, }; uint32_t m_timestamp_queue[ TIMESTAMP_QUEUE_SIZE ]; uint8_t m_timestamp_head; uint8_t m_timestamp_size; /** Number of packets we missed because we were doing something else */ uint8_t m_missed_packets; /** TRUE if we are receiving a valid packet into the stack */ norace bool receivingPacket; /** The length of the frame we're currently receiving */ norace uint8_t rxFrameLength; norace uint8_t m_bytes_left; // norace message_t* m_p_rx_buf; // message_t m_rx_buf; cc2420_receive_state_t m_state; // new packet format: message_t m_frame; norace message_t *m_rxFramePtr; norace uint8_t m_mhrLen; uint8_t m_dummy; norace bool m_stop; /***************** Prototypes ****************/ void reset_state(); void beginReceive(); void receive(); void waitForNextPacket(); void flush(); void switchToUnbufferedMode(); void switchToBufferedMode(); void continueStart(); void continueStop(); task void stopContinueTask(); task void receiveDone_task(); /***************** Init Commands ****************/ command error_t Init.init() { m_rxFramePtr = &m_frame; atomic m_state = S_STOPPED; return SUCCESS; } /***************** AsyncSplitControl ****************/ /* NOTE: AsyncSplitControl does not switch the state of the radio * hardware (i.e. it does not put the radio in Rx mode, this has to * be done by the caller through a separate interface/component). */ /** * AsyncSplitControl.start should be called before radio * is switched to Rx mode (or at least early enough before * a packet has been received, i.e. before FIFOP changes) */ async command error_t AsyncSplitControl.start() { atomic { if ( !call FIFO.get() && !call FIFOP.get() ){ // RXFIFO has some data (remember: FIFOP is inverted) // the problem is that this messses up the timestamping // so why don't we flush here ourselves? // because we don't own the SPI... return FAIL; } ASSERT(m_state == S_STOPPED); reset_state(); m_state = S_STARTED; call InterruptFIFOP.enableFallingEdge(); // ready! } return SUCCESS; } /* AsyncSplitControl.stop: * * IMPORTANT: when AsyncSplitControl.stop is called, * then either * 1) the radio MUST still be in RxMode * 2) it was never put in RxMode after * AsyncSplitControl.start() was called * * => The radio may be switched off only *after* the * stopDone() event was signalled. */ async command error_t AsyncSplitControl.stop() { atomic { if (m_state == S_STOPPED) return EALREADY; else { m_stop = TRUE; call InterruptFIFOP.disable(); if (!receivingPacket) continueStop(); // it is safe to stop now // else continueStop will be called after // current Rx operation is finished } } return SUCCESS; } void continueStop() { atomic { if (!m_stop){ return; } m_stop = FALSE; m_state = S_STOPPED; } post stopContinueTask(); } task void stopContinueTask() { ASSERT(receivingPacket != TRUE); call SpiResource.release(); // may fail atomic m_state = S_STOPPED; signal AsyncSplitControl.stopDone(SUCCESS); } /***************** CC2420Receive Commands ****************/ /** * Start frame delimiter signifies the beginning/end of a packet * See the CC2420 datasheet for details. */ async command void CC2420Receive.sfd( uint32_t time ) { if (m_state == S_STOPPED) return; if ( m_timestamp_size < TIMESTAMP_QUEUE_SIZE ) { uint8_t tail = ( ( m_timestamp_head + m_timestamp_size ) % TIMESTAMP_QUEUE_SIZE ); m_timestamp_queue[ tail ] = time; m_timestamp_size++; } } async command void CC2420Receive.sfd_dropped() { if (m_state == S_STOPPED) return; if ( m_timestamp_size ) { m_timestamp_size--; } } /***************** InterruptFIFOP Events ****************/ async event void InterruptFIFOP.fired() { atomic { if ( m_state == S_STARTED ) { beginReceive(); } else { m_missed_packets++; } } } /***************** SpiResource Events ****************/ event void SpiResource.granted() { atomic { switch (m_state) { case S_STOPPED: ASSERT(0); break; // this should never happen! default: receive(); } } } /***************** RXFIFO Events ****************/ /** * We received some bytes from the SPI bus. Process them in the context * of the state we're in. Remember the length byte is not part of the length */ async event void RXFIFO.readDone( uint8_t* rx_buf, uint8_t rx_len, error_t error ) { uint8_t* buf; atomic { buf = (uint8_t*) &((ieee154_header_t*) m_rxFramePtr->header)->length; rxFrameLength = ((ieee154_header_t*) m_rxFramePtr->header)->length; switch( m_state ) { case S_RX_LENGTH: m_state = S_RX_FCF; if ( rxFrameLength + 1 > m_bytes_left ) { // Length of this packet is bigger than the RXFIFO, flush it out. flush(); } else { if ( !call FIFO.get() && !call FIFOP.get() ) { //m_bytes_left -= rxFrameLength + 1; flush(); } //if(rxFrameLength <= MAC_PACKET_SIZE) { if(rxFrameLength <= (sizeof(ieee154_header_t) - 1 + TOSH_DATA_LENGTH + 2)){ if(rxFrameLength > 0) { if(rxFrameLength > SACK_HEADER_LENGTH) { // This packet has an FCF byte plus at least one more byte to read call RXFIFO.continueRead(buf + 1, SACK_HEADER_LENGTH); } else { // This is really a bad packet, skip FCF and get it out of here. flush(); //m_state = S_RX_PAYLOAD; //call RXFIFO.continueRead(buf + 1, rxFrameLength); } } else { // Length == 0; start reading the next packet flush(); /* atomic receivingPacket = FALSE;*/ /* call CSN.set();*/ /* call SpiResource.release();*/ /* waitForNextPacket();*/ } } else { // Length is too large; we have to flush the entire Rx FIFO flush(); } } break; case S_RX_FCF: if (call FrameUtility.getMHRLength(buf[1], buf[2], &m_mhrLen) != SUCCESS || m_mhrLen > rxFrameLength - 2) { // header size incorrect flush(); break; } else if (m_mhrLen > SACK_HEADER_LENGTH) { m_state = S_RX_HEADER; call RXFIFO.continueRead(buf + 1 + SACK_HEADER_LENGTH, m_mhrLen - SACK_HEADER_LENGTH); break; } else { // complete header has been read: fall through } // fall through case S_RX_HEADER: // JH: we are either using HW ACKs (normal receive mode) or don't ACK any // packets (promiscuous mode) // Didn't flip CSn, we're ok to continue reading. if ((rxFrameLength - m_mhrLen - 2) > TOSH_DATA_LENGTH) // 2 for CRC flush(); else { m_state = S_RX_PAYLOAD; call RXFIFO.continueRead((uint8_t*) m_rxFramePtr->data, rxFrameLength - m_mhrLen); } break; case S_RX_PAYLOAD: call CSN.set(); if(!m_missed_packets) { // Release the SPI only if there are no more frames to download call SpiResource.release(); } if ( m_timestamp_size ) { if ( rxFrameLength > 4 ) { ((ieee154_metadata_t*) m_rxFramePtr->metadata)->timestamp = m_timestamp_queue[ m_timestamp_head ]; m_timestamp_head = ( m_timestamp_head + 1 ) % TIMESTAMP_QUEUE_SIZE; m_timestamp_size--; } } else { ((ieee154_metadata_t*) m_rxFramePtr->metadata)->timestamp = IEEE154_INVALID_TIMESTAMP; } // We may have received an ack that should be processed by Transmit // buf[rxFrameLength] >> 7 checks the CRC if ( ( m_rxFramePtr->data[ rxFrameLength - m_mhrLen - 1 ] >> 7 ) && rx_buf ) { uint8_t type = ((ieee154_header_t*) m_rxFramePtr->header)->mhr[0] & 0x07; /* signal CC2420Receive.receive( type, m_p_rx_buf );*/ signal CC2420Receive.receive( type, m_rxFramePtr ); /* if ( type == IEEE154_TYPE_DATA ) {*/ if ( (type != IEEE154_TYPE_ACK || call CC2420Config.isPromiscuousModeEnabled()) && !m_stop) { post receiveDone_task(); return; } } waitForNextPacket(); break; default: atomic receivingPacket = FALSE; call CSN.set(); call SpiResource.release(); if (m_stop){ continueStop(); return; } break; } } } async event void RXFIFO.writeDone( uint8_t* tx_buf, uint8_t tx_len, error_t error ) { } /***************** Tasks *****************/ /** * Fill in metadata details, pass the packet up the stack, and * get the next packet. */ task void receiveDone_task() { uint8_t payloadLen = ((ieee154_header_t*) m_rxFramePtr->header)->length - m_mhrLen - 2; ieee154_metadata_t *metadata = (ieee154_metadata_t*) m_rxFramePtr->metadata; atomic ASSERT(m_state != S_STOPPED); ((ieee154_header_t*) m_rxFramePtr->header)->length = m_rxFramePtr->data[payloadLen+1] & 0x7f; // temp. LQI metadata->rssi = m_rxFramePtr->data[payloadLen]; metadata->linkQuality = ((ieee154_header_t*) m_rxFramePtr->header)->length; // copy back ((ieee154_header_t*) m_rxFramePtr->header)->length = payloadLen; m_rxFramePtr = signal CC2420Rx.received(m_rxFramePtr); /* cc2420_metadata_t* metadata = call CC2420PacketBody.getMetadata( m_p_rx_buf );*/ /* uint8_t* buf = (uint8_t*) call CC2420PacketBody.getHeader( m_p_rx_buf );;*/ /* */ /* metadata->crc = buf[ rxFrameLength ] >> 7;*/ /* metadata->rssi = buf[ rxFrameLength - 1 ];*/ /* metadata->lqi = buf[ rxFrameLength ] & 0x7f;*/ // async event message_t* receiveDone( message_t *data ); /* m_p_rx_buf = signal Receive.receive( m_rxFramePtrm_p_rx_buf, m_p_rx_buf->data, */ /* rxFrameLength );*/ atomic receivingPacket = FALSE; waitForNextPacket(); } /****************** Functions ****************/ /** * Attempt to acquire the SPI bus to receive a packet. */ void beginReceive() { atomic { if (m_state == S_STOPPED || m_stop){ return; } m_state = S_RX_LENGTH; receivingPacket = TRUE; if(call SpiResource.isOwner()) { receive(); } else if (call SpiResource.immediateRequest() == SUCCESS) { receive(); } else { call SpiResource.request(); } } } /** * Flush out the Rx FIFO */ void flush() { reset_state(); call CSN.set(); call CSN.clr(); call SFLUSHRX.strobe(); call SFLUSHRX.strobe(); call CSN.set(); call SpiResource.release(); waitForNextPacket(); } /** * The first byte of each packet is the length byte. Read in that single * byte, and then read in the rest of the packet. The CC2420 could contain * multiple packets that have been buffered up, so if something goes wrong, * we necessarily want to flush out the FIFO unless we have to. */ void receive() { call CSN.set(); call CSN.clr(); //call RXFIFO.beginRead( (uint8_t*)(call CC2420PacketBody.getHeader( m_p_rx_buf )), 1 ); call RXFIFO.beginRead( &((ieee154_header_t*) m_rxFramePtr->header)->length, 1 ); } /** * Determine if there's a packet ready to go, or if we should do nothing * until the next packet arrives */ void waitForNextPacket() { atomic { if ( m_state == S_STOPPED) { call SpiResource.release(); return; } receivingPacket = FALSE; if (m_stop){ continueStop(); return; } if ( ( m_missed_packets && call FIFO.get() ) || !call FIFOP.get() ) { // A new packet is buffered up and ready to go if ( m_missed_packets ) { m_missed_packets--; } beginReceive(); } else { // Wait for the next packet to arrive m_state = S_STARTED; m_missed_packets = 0; call SpiResource.release(); } } } /** * Reset this component */ void reset_state() { m_bytes_left = RXFIFO_SIZE; atomic receivingPacket = FALSE; m_timestamp_head = 0; m_timestamp_size = 0; m_missed_packets = 0; } } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CC2420Rx.nc000066400000000000000000000040741207233610700213350ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:07 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" #include "TKN154_platform.h" interface CC2420Rx { /** * Receive a packet buffer, returning a buffer for the signaling * component to use for the next reception. */ event message_t* received(message_t *data); } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CC2420TKN154C.nc000066400000000000000000000067751207233610700217470ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:07 $ * @author: Jan Hauer * ======================================================================== */ #include "Timer62500hz.h" configuration CC2420TKN154C { provides { interface SplitControl; interface RadioRx; interface RadioTx; interface SlottedCsmaCa; interface UnslottedCsmaCa; interface EnergyDetection; interface RadioOff; interface Set as RadioPromiscuousMode; interface Timestamp; interface GetNow as CCA; } uses { interface Notify as PIBUpdate[uint8_t attributeID]; interface LocalTime; interface Alarm as Alarm1; interface Alarm as Alarm2; interface FrameUtility; interface ReliableWait; interface TimeCalc; interface Random; interface CaptureTime; } } implementation { components MainC, CC2420TKN154P as PHY; SplitControl = PHY; RadioRx = PHY; RadioTx = PHY; SlottedCsmaCa = PHY; UnslottedCsmaCa = PHY; RadioOff = PHY; EnergyDetection = PHY; PIBUpdate = PHY; RadioPromiscuousMode = PHY; Timestamp = PHY; LocalTime = PHY; ReliableWait = PHY; TimeCalc = PHY; CCA = PHY; PHY.Random = Random; components CC2420ControlTransmitC; PHY.SpiResource -> CC2420ControlTransmitC; PHY.CC2420Power -> CC2420ControlTransmitC; PHY.CC2420Config -> CC2420ControlTransmitC; CC2420ControlTransmitC.StartupAlarm = Alarm2; FrameUtility = CC2420ControlTransmitC; CaptureTime = CC2420ControlTransmitC; PHY.TxControl -> CC2420ControlTransmitC; PHY.CC2420Tx -> CC2420ControlTransmitC; CC2420ControlTransmitC.AckAlarm = Alarm1; components CC2420ReceiveC; PHY.RxControl -> CC2420ReceiveC; PHY.CC2420Rx -> CC2420ReceiveC.CC2420Rx; FrameUtility = CC2420ReceiveC; CC2420ReceiveC.CC2420Config -> CC2420ControlTransmitC; } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CC2420TKN154P.nc000066400000000000000000000700651207233610700217550ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2009/10/20 09:21:39 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" #include "TKN154_PHY.h" #include "platform_message.h" #include #include "Timer62500hz.h" module CC2420TKN154P { provides { interface SplitControl; interface RadioOff; interface RadioRx; interface RadioTx; interface SlottedCsmaCa; interface UnslottedCsmaCa; interface EnergyDetection; interface Set as RadioPromiscuousMode; interface Timestamp; interface GetNow as CCA; } uses { interface Notify as PIBUpdate[uint8_t attributeID]; interface LocalTime as LocalTime; interface Resource as SpiResource; interface AsyncStdControl as TxControl; interface CC2420AsyncSplitControl as RxControl; interface CC2420Power; interface CC2420Config; interface CC2420Rx; interface CC2420Tx; interface Random; interface Leds; interface ReliableWait; interface TimeCalc; } } implementation { typedef enum { S_STOPPED, S_STOPPING, S_STARTING, S_ED, S_RADIO_OFF, S_RESERVE_RX_SPI, S_RX_PENDING, S_RECEIVING, S_OFF_PENDING, S_LOAD_TXFIFO_NO_CSMA, S_LOAD_TXFIFO_UNSLOTTED, S_LOAD_TXFIFO_SLOTTED, S_TX_PENDING, S_TX_BACKOFF_UNSLOTTED, S_TX_BACKOFF_SLOTTED, S_TX_ACTIVE_NO_CSMA, S_TX_ACTIVE_UNSLOTTED_CSMA, S_TX_ACTIVE_SLOTTED_CSMA, } m_state_t; norace m_state_t m_state = S_STOPPED; norace ieee154_txframe_t *m_txframe; norace error_t m_txResult; norace bool m_ackFramePending; norace uint16_t m_remainingBackoff; norace bool m_resume; norace ieee154_csma_t *m_csma; bool m_pibUpdated; /* timing */ norace uint32_t m_dt; norace uint32_t m_t0; /* energy detection */ int8_t m_maxEnergy; uint32_t m_edDuration; uint32_t m_edStartTime; /* task prototypes */ task void energyDetectionTask(); task void startDoneTask(); task void rxControlStopDoneTask(); task void configSyncTask(); /* function prototypes */ uint8_t dBmToPA_LEVEL(int dbm); void txDoneRxControlStopped(); void rxSpiReserved(); void txSpiReserved(); void sendDoneSpiReserved(); void offSpiReserved(); void offStopRxDone(); uint16_t getRandomBackoff(uint8_t BE); void loadTxFrame(ieee154_txframe_t *frame); void checkEnableRxForACK(); /* ----------------------- StdControl Operations ----------------------- */ command error_t SplitControl.start() { atomic { if (m_state == S_RADIO_OFF) return EALREADY; else if (m_state != S_STOPPED) return FAIL; m_state = S_STARTING; } call SpiResource.request(); /* continue in startSpiReserved() */ return SUCCESS; } void startSpiReserved() { /* we own the SPI bus */ call CC2420Power.startVReg(); } async event void CC2420Power.startVRegDone() { call CC2420Power.startOscillator(); } async event void CC2420Power.startOscillatorDone() { call CC2420Power.rfOff(); call CC2420Power.flushRxFifo(); call CC2420Tx.unlockChipSpi(); post startDoneTask(); } task void startDoneTask() { // in case this is a restart: we just set the channel to the same value // it had before in order to set m_needsSync to TRUE and then call sync // to populate the registers on the chip with the values already in memory call CC2420Config.setChannel(call CC2420Config.getChannel()); call CC2420Config.sync(); call SpiResource.release(); m_state = S_RADIO_OFF; signal SplitControl.startDone(SUCCESS); } command error_t SplitControl.stop() { atomic { if (m_state == S_STOPPED) return EALREADY; else if (m_state != S_RADIO_OFF) return FAIL; m_state = S_STOPPING; } call SpiResource.request(); return SUCCESS; } void stopSpiReserved() { /* we own the SPI bus */ call CC2420Power.rfOff(); call CC2420Power.flushRxFifo(); call CC2420Power.stopOscillator(); call CC2420Power.stopVReg(); call CC2420Tx.unlockChipSpi(); call SpiResource.release(); m_state = S_STOPPED; signal SplitControl.stopDone(SUCCESS); } /* ----------------------- Helpers / PIB Updates ----------------------- */ /* Returns a random number [0,(2^BE) - 1] (uniform distr.) */ /* multiplied by backoff period time (in symbols) */ uint16_t getRandomBackoff(uint8_t BE) { uint16_t res = call Random.rand16(); uint16_t mask = 0xFFFF; mask <<= BE; mask = ~mask; res &= mask; return (res * IEEE154_aUnitBackoffPeriod); } /* input: power in dBm, output: PA_LEVEL setting for CC2420 TXCTRL register */ uint8_t dBmToPA_LEVEL(int dBm) { uint8_t result; /* the cc2420 has 8 discrete (documented) values */ if (dBm >= 0) result = 31; else if (dBm > -2) result = 27; else if (dBm > -4) result = 23; else if (dBm > -6) result = 19; else if (dBm > -9) result = 15; else if (dBm > -13) result = 11; else if (dBm > -20) result = 7; else result = 3; return result; } event void PIBUpdate.notify[uint8_t PIBAttribute](const void* PIBAttributeValue) { uint8_t txpower; switch (PIBAttribute) { case IEEE154_macShortAddress: call CC2420Config.setShortAddr(*((ieee154_macShortAddress_t*) PIBAttributeValue)); break; case IEEE154_macPANId: call CC2420Config.setPanAddr(*((ieee154_macPANId_t*) PIBAttributeValue)); break; case IEEE154_phyCurrentChannel: call CC2420Config.setChannel(*((ieee154_phyCurrentChannel_t*) PIBAttributeValue)); break; case IEEE154_macPanCoordinator: call CC2420Config.setPanCoordinator(*((ieee154_macPanCoordinator_t*) PIBAttributeValue)); break; case IEEE154_phyTransmitPower: /* lower 6 bits are twos-complement in dBm (range -32 to +31 dBm) */ txpower = (*((ieee154_phyTransmitPower_t*) PIBAttributeValue)) & 0x3F; if (txpower & 0x20) txpower |= 0xC0; /* make it negative, to be interpreted as int8_t */ call CC2420Config.setTxPower(dBmToPA_LEVEL((int8_t) txpower)); break; case IEEE154_phyCCAMode: call CC2420Config.setCCAMode(*((ieee154_phyCCAMode_t*) PIBAttributeValue)); break; } if (m_state == S_RECEIVING || m_state == S_RX_PENDING) post configSyncTask(); } task void configSyncTask() { if (call SpiResource.immediateRequest() == SUCCESS) { call CC2420Config.sync(); if (m_state == S_RECEIVING) { // need to toggle radio state to make changes effective now call CC2420Power.rfOff(); call CC2420Power.rxOn(); } call SpiResource.release(); } else post configSyncTask(); // spin (should be short time, until packet is received) } command void RadioPromiscuousMode.set( bool val ) { call CC2420Config.setPromiscuousMode(val); } /* ----------------------- Energy Detection ----------------------- */ command error_t EnergyDetection.start(uint32_t duration) { atomic { if (m_state == S_ED) return EALREADY; else if (m_state != S_RADIO_OFF) return FAIL; m_state = S_ED; } m_edDuration = duration; m_maxEnergy = -128 + 45; /* initialization (45 will be substracted below) */ call SpiResource.request(); return SUCCESS; } void edReserved() { call CC2420Config.sync(); /* put PIB changes into operation (if any) */ call CC2420Power.rxOn(); m_edStartTime = call LocalTime.get(); post energyDetectionTask(); } task void energyDetectionTask() { int8_t value; if (call CC2420Power.rssi(&value) == SUCCESS) if (value > m_maxEnergy) m_maxEnergy = value; if (call TimeCalc.hasExpired(m_edStartTime, m_edDuration)) { /* P = RSSI_VAL + RSSI_OFFSET [dBm] */ /* RSSI_OFFSET is approximately -45. */ m_maxEnergy -= 45; call CC2420Power.rfOff(); call CC2420Power.flushRxFifo(); call SpiResource.release(); m_state = S_RADIO_OFF; signal EnergyDetection.done(SUCCESS, m_maxEnergy); } else post energyDetectionTask(); } /* ----------------------- RadioOff ----------------------- */ async command error_t RadioOff.off() { error_t result; atomic { if (m_state == S_RADIO_OFF) return EALREADY; else if (m_state != S_RECEIVING) return FAIL; m_state = S_OFF_PENDING; } result = call RxControl.stop(); ASSERT(result == SUCCESS); return result; } void offStopRxDone() { if (call SpiResource.immediateRequest() == SUCCESS) offSpiReserved(); else call SpiResource.request(); /* will continue in offSpiReserved() */ } void offSpiReserved() { call TxControl.stop(); call CC2420Power.rfOff(); call CC2420Power.flushRxFifo(); call CC2420Tx.unlockChipSpi(); call SpiResource.release(); m_state = S_RADIO_OFF; signal RadioOff.offDone(); } async command bool RadioOff.isOff() { return m_state == S_RADIO_OFF; } /* ----------------------- RadioRx ----------------------- */ async command error_t RadioRx.enableRx(uint32_t t0, uint32_t dt) { error_t result; atomic { if (m_state != S_RADIO_OFF) return FAIL; m_state = S_RESERVE_RX_SPI; } m_t0 = t0; m_dt = dt; result = call RxControl.start(); ASSERT(result == SUCCESS); if (result == SUCCESS) if (call SpiResource.immediateRequest() == SUCCESS) rxSpiReserved(); else call SpiResource.request(); /* will continue in rxSpiReserved() */ return result; } void rxSpiReserved() { m_state = S_RX_PENDING; call CC2420Config.sync(); /* put any pending PIB changes into operation */ call TxControl.stop(); /* reset Tx logic for timestamping (SFD interrupt) */ call TxControl.start(); atomic { if (call TimeCalc.hasExpired(m_t0, m_dt)) signal ReliableWait.waitRxDone(); else call ReliableWait.waitRx(m_t0, m_dt); /* will signal waitRxDone() just in time */ } } async event void ReliableWait.waitRxDone() { error_t result; atomic { m_state = S_RECEIVING; result = call CC2420Power.rxOn(); } ASSERT(result == SUCCESS); call CC2420Tx.lockChipSpi(); call SpiResource.release(); signal RadioRx.enableRxDone(); } event message_t* CC2420Rx.received(message_t *frame) { if (m_state == S_RECEIVING) return signal RadioRx.received(frame); else return frame; } async command bool RadioRx.isReceiving() { return m_state == S_RECEIVING; } /* ----------------------- RadioTx ----------------------- */ async command error_t RadioTx.transmit( ieee154_txframe_t *frame, uint32_t t0, uint32_t dt ) { if( frame == NULL || frame->header == NULL || ((frame->payload == NULL) && (frame->payloadLen != 0)) || frame->metadata == NULL || (frame->headerLen + frame->payloadLen + 2) > IEEE154_aMaxPHYPacketSize ) return EINVAL; atomic { if( m_state != S_RADIO_OFF ) return FAIL; m_state = S_LOAD_TXFIFO_NO_CSMA; } m_txframe = frame; m_t0 = t0; m_dt = dt; loadTxFrame(frame); /* will continue in loadDoneRadioTx() */ return SUCCESS; } void loadDoneRadioTx() { /* frame was loaded into TXFIFO */ atomic { m_state = S_TX_PENDING; if (m_dt == 0) signal ReliableWait.waitTxDone(); else call ReliableWait.waitTx(m_t0, m_dt); /* will signal waitTxDone() just in time */ } } async event void ReliableWait.waitTxDone() { error_t result; ASSERT(m_state == S_TX_PENDING); atomic { m_state = S_TX_ACTIVE_NO_CSMA; result = call CC2420Tx.send(FALSE); /* transmit without CCA, this must succeed */ checkEnableRxForACK(); } ASSERT(result == SUCCESS); } inline void txDoneRadioTx(ieee154_txframe_t *frame, error_t result) { /* transmission completed */ signal RadioTx.transmitDone(frame, result); } /* ----------------------- UnslottedCsmaCa ----------------------- */ async command error_t UnslottedCsmaCa.transmit(ieee154_txframe_t *frame, ieee154_csma_t *csma) { if( frame == NULL || frame->header == NULL || ((frame->payload == NULL) && (frame->payloadLen != 0)) || frame->metadata == NULL || (frame->headerLen + frame->payloadLen + 2) > IEEE154_aMaxPHYPacketSize ) return EINVAL; atomic { if( m_state != S_RADIO_OFF ) return FAIL; m_state = S_LOAD_TXFIFO_UNSLOTTED; } m_txframe = frame; m_csma = csma; loadTxFrame(frame); /* will continue in nextIterationUnslottedCsma() */ return SUCCESS; } void nextIterationUnslottedCsma() { /* wait for a random time of [0,(2^BE) - 1] backoff slots */ uint16_t backoff = getRandomBackoff(m_csma->BE); m_state = S_TX_BACKOFF_UNSLOTTED; call ReliableWait.waitBackoff(backoff); /* will continue in waitBackoffDoneUnslottedCsma() */ } void waitBackoffDoneUnslottedCsma() { /* backoff finished, try to transmit now */ int8_t dummy; ieee154_txframe_t *frame = NULL; ieee154_csma_t *csma = NULL; atomic { /* The CC2420 needs to be in an Rx mode for STXONCCA strobe */ /* Note: the receive logic of the CC2420 driver is not yet */ /* started, i.e. we cannot (yet) receive any packets */ call CC2420Power.rxOn(); m_state = S_TX_ACTIVE_UNSLOTTED_CSMA; /* wait for CC2420 Rx to calibrate + CCA valid time */ while (call CC2420Power.rssi(&dummy) != SUCCESS) ; /* transmit with a single CCA done in hardware (STXONCCA strobe) */ if (call CC2420Tx.send(TRUE) == SUCCESS) { /* frame is being sent now, do we need Rx logic ready for an ACK? */ checkEnableRxForACK(); } else { /* channel is busy */ call CC2420Power.rfOff(); /* we might have accidentally caught something during CCA, flush it out */ call CC2420Power.flushRxFifo(); m_csma->NB += 1; if (m_csma->NB > m_csma->macMaxCsmaBackoffs) { /* CSMA-CA failure, we're done. The MAC may decide to retransmit. */ frame = m_txframe; csma = m_csma; /* continue below */ } else { /* Retry -> next iteration of the unslotted CSMA-CA */ m_csma->BE += 1; if (m_csma->BE > m_csma->macMaxBE) m_csma->BE = m_csma->macMaxBE; nextIterationUnslottedCsma(); } } } if (frame != NULL) { call CC2420Tx.unlockChipSpi(); call TxControl.stop(); call SpiResource.release(); m_state = S_RADIO_OFF; signal UnslottedCsmaCa.transmitDone(frame, csma, FALSE, FAIL); } } inline void txDoneUnslottedCsma(ieee154_txframe_t *frame, ieee154_csma_t *csma, bool ackPendingFlag, error_t result) { /* transmission completed */ signal UnslottedCsmaCa.transmitDone(frame, csma, ackPendingFlag, result); } /* ----------------------- SlottedCsmaCa ----------------------- */ /* The slotted CSMA-CA requires very exact timing, because transmissions * must start on 320 us backoff boundaries. Because it is accessed over SPI * the CC2420 is not good at meeting these timing requirements, so consider * the "SlottedCsmaCa"-code below as experimental. */ async command error_t SlottedCsmaCa.transmit(ieee154_txframe_t *frame, ieee154_csma_t *csma, uint32_t slot0Time, uint32_t dtMax, bool resume, uint16_t remainingBackoff) { if( frame == NULL || frame->header == NULL || ((frame->payload == NULL) && (frame->payloadLen != 0)) || frame->metadata == NULL || (frame->headerLen + frame->payloadLen + 2) > IEEE154_aMaxPHYPacketSize) return EINVAL; atomic { if( m_state != S_RADIO_OFF ) return FAIL; m_state = S_LOAD_TXFIFO_SLOTTED; } m_txframe = frame; m_csma = csma; m_t0 = slot0Time; m_dt = dtMax; m_resume = resume; m_remainingBackoff = remainingBackoff; loadTxFrame(frame); /* will continue in nextIterationSlottedCsma() */ return SUCCESS; } void nextIterationSlottedCsma() { uint32_t dtTxTarget; uint16_t backoff; ieee154_txframe_t *frame = NULL; ieee154_csma_t *csma = NULL; atomic { if (m_resume) { backoff = m_remainingBackoff; m_resume = FALSE; } else backoff = getRandomBackoff(m_csma->BE); dtTxTarget = call TimeCalc.timeElapsed(m_t0, call LocalTime.get()); dtTxTarget += backoff; if (dtTxTarget > m_dt) { /* frame doesn't fit into remaining CAP */ uint32_t overlap = dtTxTarget - m_dt; overlap = overlap + (IEEE154_aUnitBackoffPeriod - (overlap % IEEE154_aUnitBackoffPeriod)); backoff = overlap; frame = m_txframe; csma = m_csma; } else { /* backoff now */ m_state = S_TX_BACKOFF_SLOTTED; call ReliableWait.waitBackoff(backoff); /* will continue in waitBackoffDoneSlottedCsma() */ } } if (frame != NULL) { /* frame didn't fit in the remaining CAP */ call CC2420Tx.unlockChipSpi(); call TxControl.stop(); call SpiResource.release(); m_state = S_RADIO_OFF; signal SlottedCsmaCa.transmitDone(frame, csma, FALSE, backoff, ERETRY); } } void waitBackoffDoneSlottedCsma() { int8_t dummy; bool ccaFailure = FALSE; error_t result = FAIL; ieee154_txframe_t *frame = NULL; ieee154_csma_t *csma = NULL; atomic { /* The CC2420 needs to be in an Rx mode for STXONCCA strobe */ /* Note: the receive logic of the CC2420 driver is not yet */ /* started, i.e. we cannot (yet) receive any packets */ call CC2420Power.rxOn(); m_state = S_TX_ACTIVE_SLOTTED_CSMA; /* wait for CC2420 Rx to calibrate + CCA valid time */ while (call CC2420Power.rssi(&dummy) != SUCCESS) ; /* perform CCA on slot boundary (i.e. 8 symbols after backoff bounday); */ /* this platform-specific command is supposed to return just in time, so */ /* that the frame will be transmitted exactly on the next backoff boundary */ if (call ReliableWait.ccaOnBackoffBoundary(m_t0)) { /* first CCA succeeded */ if (call CC2420Tx.send(TRUE) == SUCCESS) { /* frame is being sent now, do we need Rx logic ready for an ACK? */ checkEnableRxForACK(); return; } else ccaFailure = TRUE; /* second CCA failed */ } else ccaFailure = TRUE; /* first CCA failed */ /* did not transmit the frame */ call CC2420Power.rfOff(); call CC2420Power.flushRxFifo(); /* we might have (accidentally) caught something */ m_state = S_LOAD_TXFIFO_SLOTTED; if (ccaFailure) { m_csma->NB += 1; if (m_csma->NB > m_csma->macMaxCsmaBackoffs) { /* CSMA-CA failure, we're done. The MAC may decide to retransmit. */ frame = m_txframe; csma = m_csma; result = FAIL; } else { /* next iteration of slotted CSMA-CA */ m_csma->BE += 1; if (m_csma->BE > m_csma->macMaxBE) m_csma->BE = m_csma->macMaxBE; nextIterationSlottedCsma(); } } else { /* frame didn't fit into remaining CAP, this can only happen */ /* if the runtime overhead was too high. this should actually not happen. */ /* (in principle the frame should have fitted, because we checked before) */ frame = m_txframe; csma = m_csma; result = ERETRY; } } if (frame != NULL) { call CC2420Tx.unlockChipSpi(); call TxControl.stop(); call SpiResource.release(); m_state = S_RADIO_OFF; signal SlottedCsmaCa.transmitDone(frame, csma, FALSE, 0, result); } } inline void txDoneSlottedCsmaCa(ieee154_txframe_t *frame, ieee154_csma_t *csma, bool ackPendingFlag, uint16_t remainingBackoff, error_t result) { /* transmission completed */ signal SlottedCsmaCa.transmitDone(frame, csma, ackPendingFlag, remainingBackoff, result); } /* ----------------------- Common Tx Operations ----------------------- */ void loadTxFrame(ieee154_txframe_t *frame) { if (call SpiResource.isOwner() || call SpiResource.immediateRequest() == SUCCESS) txSpiReserved(); else call SpiResource.request(); /* will continue in txSpiReserved() */ } void txSpiReserved() { error_t result; call CC2420Config.sync(); call TxControl.start(); result = call CC2420Tx.loadTXFIFO(m_txframe); ASSERT(result == SUCCESS); } async event void CC2420Tx.loadTXFIFODone(ieee154_txframe_t *data, error_t error) { atomic { switch (m_state) { case S_LOAD_TXFIFO_NO_CSMA: loadDoneRadioTx(); break; case S_LOAD_TXFIFO_UNSLOTTED: nextIterationUnslottedCsma(); break; case S_LOAD_TXFIFO_SLOTTED: nextIterationSlottedCsma(); break; default: ASSERT(0); break; } } } void checkEnableRxForACK() { /* A frame is currently being transmitted, check if we */ /* need the Rx logic ready for the ACK */ bool ackRequest = (m_txframe->header->mhr[MHR_INDEX_FC1] & FC1_ACK_REQUEST) ? TRUE : FALSE; error_t result = SUCCESS; if (ackRequest) { /* release SpiResource and start Rx logic, so the latter */ /* can take over after Tx is finished to receive the ACK */ call SpiResource.release(); result = call RxControl.start(); } ASSERT(result == SUCCESS); } async event void CC2420Tx.sendDone(ieee154_txframe_t *frame, bool ackPendingFlag, error_t result) { m_ackFramePending = ackPendingFlag; m_txResult = result; if (!call SpiResource.isOwner()) { /* this means an ACK was requested and during the transmission */ /* we released the Spi to allow the Rx part to take over */ ASSERT((frame->header->mhr[MHR_INDEX_FC1] & FC1_ACK_REQUEST)); result = call RxControl.stop(); ASSERT(result == SUCCESS); /* will continue in txDoneRxControlStopped() */ } else sendDoneSpiReserved(); } void txDoneRxControlStopped() { /* get the Spi to switch radio off */ if (call SpiResource.isOwner() || call SpiResource.immediateRequest() == SUCCESS) sendDoneSpiReserved(); else call SpiResource.request(); /* will continue in sendDoneSpiReserved() */ } void sendDoneSpiReserved() { /* transmission completed, we're owning the Spi, Rx logic is disabled */ m_state_t state = m_state; ieee154_txframe_t *frame = m_txframe; ieee154_csma_t *csma = m_csma; call CC2420Power.rfOff(); call CC2420Power.flushRxFifo(); call CC2420Tx.unlockChipSpi(); call TxControl.stop(); call SpiResource.release(); m_state = S_RADIO_OFF; if (state == S_TX_ACTIVE_NO_CSMA) txDoneRadioTx(frame, m_txResult); else if (state == S_TX_ACTIVE_UNSLOTTED_CSMA) txDoneUnslottedCsma(frame, csma, m_ackFramePending, m_txResult); else if (state == S_TX_ACTIVE_SLOTTED_CSMA) txDoneSlottedCsmaCa(frame, csma, m_ackFramePending, m_remainingBackoff, m_txResult); else ASSERT(0); } async event void CC2420Tx.transmissionStarted( ieee154_txframe_t *frame ) { uint8_t frameType = frame->header->mhr[0] & FC1_FRAMETYPE_MASK; uint8_t token = frame->headerLen; signal Timestamp.transmissionStarted(frameType, frame->handle, frame->payload, token); } async event void CC2420Tx.transmittedSFD( uint32_t time, ieee154_txframe_t *frame ) { uint8_t frameType = frame->header->mhr[0] & FC1_FRAMETYPE_MASK; uint8_t token = frame->headerLen; signal Timestamp.transmittedSFD( time, frameType, frame->handle, frame->payload, token ); } async command void Timestamp.modifyMACPayload( uint8_t token, uint8_t offset, uint8_t* buf, uint8_t len ) { if (m_state == S_TX_ACTIVE_NO_CSMA || m_state == S_TX_ACTIVE_SLOTTED_CSMA || m_state == S_LOAD_TXFIFO_UNSLOTTED ) call CC2420Tx.modify( offset+1+token, buf, len ); } async event void ReliableWait.waitBackoffDone() { switch (m_state) { case S_TX_BACKOFF_SLOTTED: waitBackoffDoneSlottedCsma(); break; case S_TX_BACKOFF_UNSLOTTED: waitBackoffDoneUnslottedCsma(); break; default: ASSERT(0); break; } } /* ----------------------- RxControl ----------------------- */ async event void RxControl.stopDone(error_t error) { post rxControlStopDoneTask(); } task void rxControlStopDoneTask() { switch (m_state) { case S_OFF_PENDING: offStopRxDone(); break; case S_TX_ACTIVE_NO_CSMA: /* fall through */ case S_TX_ACTIVE_UNSLOTTED_CSMA: /* fall through */ case S_TX_ACTIVE_SLOTTED_CSMA: txDoneRxControlStopped(); break; default: ASSERT(0); break; } } /* ----------------------- SPI Bus Arbitration ----------------------- */ event void SpiResource.granted() { switch (m_state) { case S_STARTING: startSpiReserved(); break; case S_ED: edReserved(); break; case S_RESERVE_RX_SPI: rxSpiReserved(); break; case S_LOAD_TXFIFO_NO_CSMA: /* fall through */ case S_LOAD_TXFIFO_UNSLOTTED: /* fall through */ case S_LOAD_TXFIFO_SLOTTED: txSpiReserved(); break; case S_TX_ACTIVE_NO_CSMA: /* fall through */ case S_TX_ACTIVE_UNSLOTTED_CSMA: /* fall through */ case S_TX_ACTIVE_SLOTTED_CSMA: sendDoneSpiReserved(); break; case S_STOPPING: stopSpiReserved(); break; case S_OFF_PENDING: offSpiReserved(); break; default: ASSERT(0); break; } } async command bool CCA.getNow() { return call CC2420Tx.cca(); } default event void SplitControl.startDone(error_t error) {} default event void SplitControl.stopDone(error_t error) {} default async event void UnslottedCsmaCa.transmitDone(ieee154_txframe_t *frame, ieee154_csma_t *csma, bool ackPendingFlag, error_t result) {} default async event void SlottedCsmaCa.transmitDone(ieee154_txframe_t *frame, ieee154_csma_t *csma, bool ackPendingFlag, uint16_t remainingBackoff, error_t result) {} default async event void Timestamp.transmissionStarted(uint8_t frameType, uint8_t msduHandle, uint8_t *msdu, uint8_t token) {} default async event void Timestamp.transmittedSFD(uint32_t time, uint8_t frameType, uint8_t msduHandle, uint8_t *msdu, uint8_t token) {} } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CC2420TransmitP.nc000066400000000000000000000321271207233610700226650ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author David Moss * @author Jung Il Choi Initial SACK implementation * @author Jan Hauer * * IMPORTANT: this module does not use the SPI Resource interface, * instead the caller must take care of the resource arbitration * (i.e. the caller must own the resource before calling commands * like CC2420Tx.loadTXFIFO()) * Note: on TelosB there seems to be a problem if BackoffAlarm * is virtualized - i.e. BackoffAlarm should be a dedicated Alarm. * * @version $Revision: 1.4 $ $Date: 2009-03-04 18:31:11 $ */ #include "CC2420.h" #include "crc.h" #include "message.h" module CC2420TransmitP { provides interface Init; provides interface AsyncStdControl; provides interface CC2420Tx; uses interface Alarm as BackoffAlarm; uses interface GpioCapture as CaptureSFD; uses interface GeneralIO as CCA; uses interface GeneralIO as CSN; uses interface GeneralIO as SFD; uses interface GeneralIO as FIFO; uses interface GeneralIO as FIFOP; uses interface ChipSpiResource; uses interface CC2420Fifo as TXFIFO; uses interface CC2420Ram as TXFIFO_RAM; uses interface CC2420Register as TXCTRL; uses interface CC2420Strobe as SNOP; uses interface CC2420Strobe as STXON; uses interface CC2420Strobe as STXONCCA; uses interface CC2420Strobe as SFLUSHTX; uses interface CC2420Strobe as SRXON; uses interface CC2420Strobe as SRFOFF; uses interface CC2420Strobe as SFLUSHRX; uses interface CC2420Strobe as SACKPEND; uses interface CC2420Register as MDMCTRL1; uses interface CaptureTime; uses interface CC2420Receive; uses interface Leds; } implementation { typedef enum { S_STOPPED, S_STARTED, S_LOAD, S_READY_TX, S_SFD, S_EFD, S_ACK_WAIT, } cc2420_transmit_state_t; // This specifies how many symbols the stack should wait after a // TXACTIVE to receive an SFD interrupt before assuming something is // wrong and aborting the send. There seems to be a condition // on the micaZ where the SFD interrupt is never handled. enum { CC2420_ABORT_PERIOD = 320*3, }; norace ieee154_txframe_t *m_frame; cc2420_transmit_state_t m_state = S_STOPPED; bool m_receiving = FALSE; uint16_t m_prev_time; /** Byte reception/transmission indicator */ bool sfdHigh; /** Let the CC2420 driver keep a lock on the SPI while waiting for an ack */ norace bool abortSpiRelease; /***************** Prototypes ****************/ void signalDone( bool ackFramePending, error_t err ); /***************** Init Commands *****************/ command error_t Init.init() { call CCA.makeInput(); call CSN.makeOutput(); call SFD.makeInput(); return SUCCESS; } /***************** AsyncStdControl Commands ****************/ async command error_t AsyncStdControl.start() { atomic { if (m_state == S_STARTED) return EALREADY; call CaptureSFD.captureRisingEdge(); m_state = S_STARTED; m_receiving = FALSE; } return SUCCESS; } async command error_t AsyncStdControl.stop() { atomic { m_state = S_STOPPED; call BackoffAlarm.stop(); call CaptureSFD.disable(); call CSN.set(); } return SUCCESS; } /**************** Load/Send Commands ****************/ async command error_t CC2420Tx.loadTXFIFO(ieee154_txframe_t *data) { atomic { if ( m_state != S_STARTED ) return FAIL; m_state = S_LOAD; m_frame = data; m_frame->header->length = m_frame->headerLen + m_frame->payloadLen + 2; // 2 for CRC call CSN.set(); call CSN.clr(); call SFLUSHTX.strobe(); // flush out anything that was in TXFIFO call CSN.set(); call CSN.clr(); call TXFIFO.write( &(m_frame->header->length), 1 ); } return SUCCESS; } async event void TXFIFO.writeDone( uint8_t* tx_buf, uint8_t tx_len, error_t error) { atomic { call CSN.set(); if (tx_buf == &(m_frame->header->length)){ call CSN.clr(); call TXFIFO.write( m_frame->header->mhr, m_frame->headerLen ); return; } else if (tx_buf == m_frame->header->mhr) { call CSN.clr(); call TXFIFO.write( m_frame->payload, m_frame->payloadLen ); return; } } m_state = S_READY_TX; signal CC2420Tx.loadTXFIFODone(m_frame, error); } async command error_t CC2420Tx.send(bool cca) { cc2420_status_t status; bool congestion = TRUE; atomic { if (m_state != S_READY_TX) return EOFF; call CSN.set(); call CSN.clr(); // DEBUG //P2OUT |= 0x40; // P2.6 high status = cca ? call STXONCCA.strobe() : call STXON.strobe(); //status = call STXON.strobe(); //U0TXBUF = 0x04; // strobe STXON //while (!(IFG1 & URXIFG0)); //status = U0RXBUF; //call CSN.set(); if ( !( status & CC2420_STATUS_TX_ACTIVE ) ) { status = call SNOP.strobe(); if ( status & CC2420_STATUS_TX_ACTIVE ) { congestion = FALSE; } } call CSN.set(); // DEBUG: on telosb SFD is connected to Pin P4.1 //if (!congestion) {while (!(P4IN & 0x02)) ; P6OUT &= ~0x80;} if (congestion){ return FAIL; // channel busy } else { m_state = S_SFD; m_frame->metadata->timestamp = IEEE154_INVALID_TIMESTAMP; // pessimistic call BackoffAlarm.start(CC2420_ABORT_PERIOD); return SUCCESS; } } } /** * The CaptureSFD event is actually an interrupt from the capture pin * which is connected to timing circuitry and timer modules. This * type of interrupt allows us to see what time (being some relative value) * the event occurred, and lets us accurately timestamp our packets. This * allows higher levels in our system to synchronize with other nodes. * * Because the SFD events can occur so quickly, and the interrupts go * in both directions, we set up the interrupt but check the SFD pin to * determine if that interrupt condition has already been met - meaning, * we should fall through and continue executing code where that interrupt * would have picked up and executed had our microcontroller been fast enough. */ async event void CaptureSFD.captured( uint16_t time ) { uint32_t time32; uint8_t sfd_state = 0; atomic { time32 = call CaptureTime.getTimestamp(time); switch( m_state ) { case S_SFD: m_state = S_EFD; sfdHigh = TRUE; // in case we got stuck in the receive SFD interrupts, we can reset // the state here since we know that we are not receiving anymore m_receiving = FALSE; call CaptureSFD.captureFallingEdge(); m_frame->metadata->timestamp = time32; call BackoffAlarm.stop(); if ( call SFD.get() ) { break; } /** Fall Through because the next interrupt was already received */ case S_EFD: sfdHigh = FALSE; call CaptureSFD.captureRisingEdge(); signal CC2420Tx.transmissionStarted(m_frame); if ( (m_frame->header->mhr)[0] & ( 1 << IEEE154_FCF_ACK_REQ ) ) { // wait for the ACK m_state = S_ACK_WAIT; // we need to have *completely* received the ACK, 32+22 symbols // should theroretically be enough, but there can be delays in // servicing the FIFOP interrupt, so we use 150 symbols here call BackoffAlarm.start( 150 ); } else { signalDone(FALSE, SUCCESS); } if ( !call SFD.get() ) { break; } /** Fall Through because the next interrupt was already received */ default: /* this is the SFD for received messages */ if ( !m_receiving && sfdHigh == FALSE ) { sfdHigh = TRUE; call CaptureSFD.captureFallingEdge(); // safe the SFD pin status for later use sfd_state = call SFD.get(); call CC2420Receive.sfd(time32); m_receiving = TRUE; m_prev_time = time; if ( call SFD.get() ) { // wait for the next interrupt before moving on return; } } if ( sfdHigh == TRUE ) { sfdHigh = FALSE; call CaptureSFD.captureRisingEdge(); m_receiving = FALSE; /* if sfd_state is 1, then we fell through, but at the time of * saving the time stamp the SFD was still high. Thus, the timestamp * is valid. * if the sfd_state is 0, then either we fell through and SFD * was low while we safed the time stamp, or we didn't fall through. * There is some time needed by the automatic address recognition, * a value of 10 32khz ticks (20 symbols) has been proven a sufficient * threshold, so we use that (implies that ACKs cannot be timestamped). */ if ((sfd_state == 0) && call CaptureTime.getSFDUptime(m_prev_time, time) < 20) call CC2420Receive.sfd_dropped(); break; } } } } async command bool CC2420Tx.cca() { return call CCA.get(); } async command error_t CC2420Tx.modify( uint8_t offset, uint8_t* buf, uint8_t len ) { call CSN.set(); call CSN.clr(); call TXFIFO_RAM.write( offset, buf, len ); call CSN.set(); return SUCCESS; } async command void CC2420Tx.lockChipSpi() { abortSpiRelease = TRUE; } async command void CC2420Tx.unlockChipSpi() { abortSpiRelease = FALSE; } async event void ChipSpiResource.releasing() { if(abortSpiRelease) { call ChipSpiResource.abortRelease(); } } /***************** CC2420Receive Events ****************/ /** * If the packet we just received was an ack that we were expecting, * our send is complete. */ async event void CC2420Receive.receive( uint8_t type, message_t *ackFrame ){ atomic { if ( type == IEEE154_TYPE_ACK ) { if ( m_state == S_ACK_WAIT && m_frame->header->mhr[2] == ((ieee154_header_t*) ackFrame->header)->mhr[2] ) { // compare seqno call BackoffAlarm.stop(); signalDone(( ((ieee154_header_t*) ackFrame->header)->mhr[0] & 0x10) ? TRUE: FALSE, SUCCESS); } } } } async event void BackoffAlarm.fired() { atomic { switch( m_state ) { case S_SFD: case S_EFD: // fall through // We didn't receive an SFD interrupt within CC2420_ABORT_PERIOD // jiffies. Assume something is wrong. atomic { call CSN.set(); call CSN.clr(); call SFLUSHTX.strobe(); call CSN.set(); } signalDone( FALSE, ERETRY ); break; case S_ACK_WAIT: /* if (call FIFOP.get()) { */ /* // There's a packet in the Rx queue: it might be an ACK for our*/ /* // latest transmission, so we better wait a bit longer and let*/ /* // the Rx part of the driver get the packet first ...*/ /* call BackoffAlarm.start(100); */ /* return;*/ /* }*/ signalDone( FALSE, ENOACK ); break; default: break; } } } void signalDone( bool ackFramePending, error_t err ) { atomic m_state = S_STARTED; signal CC2420Tx.sendDone( m_frame, ackFramePending, err ); call ChipSpiResource.attemptRelease(); } async event void TXFIFO.readDone( uint8_t* tx_buf, uint8_t tx_len, error_t error ) { } } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CC2420Tx.nc000066400000000000000000000055661207233610700213460ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:12 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" #include "TKN154_PHY.h" interface CC2420Tx { async command error_t loadTXFIFO(ieee154_txframe_t *data); async event void loadTXFIFODone(ieee154_txframe_t *data, error_t error ); async command error_t send(bool cca); async event void sendDone(ieee154_txframe_t *frame, bool ackPendingFlag, error_t error); async command bool cca(); async command void lockChipSpi(); async command void unlockChipSpi(); async event void transmissionStarted ( ieee154_txframe_t *data ); // timestamp denotes first bit of preamble (not SFD byte)! async event void transmittedSFD(uint32_t timestamp, ieee154_txframe_t *data); /** * Modify the contents of a packet. This command can only be used * when an SFD capture event for the sending packet is signalled. * * @param offset in the message to start modifying. * @param buf to data to write * @param len of bytes to write * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t modify( uint8_t offset, uint8_t* buf, uint8_t len ); } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/CaptureTime.nc000066400000000000000000000053761207233610700224560ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:00 $ * @author Jan Hauer * ======================================================================== */ interface CaptureTime { /** * Converts a platform-specific SFD capture time value (16-bit) into a IEEE * 802.15.4 timestamp. The timestamp is a 32-bit value that represents the * local time when the *first bit* (chip) of the corresponding frame was * transmitted / received (note that on the CC2420 the SFD capture happens * 5 byte (=10 symbols) after the transmission/reception of the first bit). * * @param time capture time * @return timestamp local time when the frame was transmitted/received **/ async command uint32_t getTimestamp(uint16_t SFDCaptureTime); /** * Returns the time interval that the SFD pin was high during a packet * transmission/reception. The time is expressed in 802.15.4 symbols. * * @param SFDCaptureTime capture time of rising SFD * @param EFDCaptureTime capture time of falling SFD */ async command uint16_t getSFDUptime(uint16_t SFDCaptureTime, uint16_t EFDCaptureTime); } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/ReliableWait.nc000066400000000000000000000042141207233610700225660ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:12 $ * @author Jan Hauer * ======================================================================== */ interface ReliableWait { async command void waitRx(uint32_t t0, uint32_t dt); async event void waitRxDone(); async command void waitTx(uint32_t t0, uint32_t dt); async event void waitTxDone(); async command void waitBackoff(uint32_t dt); async event void waitBackoffDone(); async command bool ccaOnBackoffBoundary(uint32_t slot0); } tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/TKN154_PHY.h000066400000000000000000000052061207233610700214610ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-09-08 09:04:42 $ * @author: Jan Hauer * ======================================================================== */ // PHY constants for the CC2420 #ifndef __TKN154_PHY_H #define __TKN154_PHY_H #include "TKN154_MAC.h" enum { IEEE154_SUPPORTED_CHANNELS = 0x07FFF800, IEEE154_SYMBOLS_PER_OCTET = 2, IEEE154_TXPOWER_TOLERANCE = 0x80, IEEE154_SHR_DURATION = (5 * IEEE154_SYMBOLS_PER_OCTET), IEEE154_MAX_FRAME_DURATION = (IEEE154_SHR_DURATION + ((IEEE154_aMaxPHYPacketSize + 1) * IEEE154_SYMBOLS_PER_OCTET)), IEEE154_PREAMBLE_LENGTH = (4*IEEE154_SYMBOLS_PER_OCTET), IEEE154_SYNC_SYMBOL_OFFSET = (1 * IEEE154_SYMBOLS_PER_OCTET), IEEE154_MIN_LIFS_PERIOD = 40, IEEE154_MIN_SIFS_PERIOD = 12, IEEE154_ACK_WAIT_DURATION = (20 + 12 + IEEE154_SHR_DURATION + 6 * IEEE154_SYMBOLS_PER_OCTET), IEEE154_TIMESTAMP_SUPPORTED = TRUE, }; #include "Timer62500hz.h" #define TSymbolIEEE802154 T62500hz #endif tinyos-2.1.2+dfsg/tos/chips/cc2420_tkn154/Timestamp.nc000066400000000000000000000110421207233610700221620ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ $Date: 2009-03-04 18:31:12 $ * @author Jan Hauer * ======================================================================== */ #include "IEEE802154.h" interface Timestamp { /** * The transmission of a packet has started (the PHY preamble is being * transmitted). * Within the event handler the modifyPayload()<\code> command can * be called to modify the contents of the frame's payload. * * @param frameType the type of frame (BEACON=0, DATA=1, ACK=2, COMMAND=3) * @param msduHandle for DATA frames the handle associated with the MSDU, * otherwise undefined * @param payload the MAC payload (e.g. in a DATA frame this is the msdu, * in a BEACON frame this is the first byte of the SFSpec) * @param token a token to be used as parameter for the * modifyPayload()<\code> command */ async event void transmissionStarted(uint8_t frameType, uint8_t msduHandle, uint8_t *payload, uint8_t token); /** * The Start-of-Frame Delimiter of an outgoing frame has been transmitted. * Within the event handler the modifyPayload()<\code> command may * be called to modify the contents of the frame's payload. * * @param time the time when the SFD was transmitted, expressed * in 15.4 symbols as determined by a call to a T62500hz * Alarm/Timer.getNow() * @param frameType the type of frame (BEACON=0, DATA=1, ACK=2, COMMAND=3) * @param msduHandle for DATA frames the handle associated with the MSDU, * otherwise undefined * @param payload the MAC payload (e.g. in a DATA frame this is the msdu, * in a BEACON frame this is the first byte of the SFSpec) * @param token a token to be used as parameter for the * modifyPayload()<\code> command */ async event void transmittedSFD(uint32_t time, uint8_t frameType, uint8_t msduHandle, uint8_t *payload, uint8_t token); /** * Modify (overwrite) the contents of the MAC payload. This command must only * be called in an transmittedSFD()<\code> eventhandler, which should * return fast. Note: the smaller the offset, the faster the * transmittedSFD()<\code> eventhandler must be finished (offset of * zero might not work), because you are modifying a packet, whose first * bytes have already been transmitted. * * @param token the token signalled by transmittedSFD()<\code> * @param offset the offset in the frame's payload to start modifying; * an offset of zero means the first byte of the MAC payload field * @param buf data to write * @param len number of bytes to write */ async command void modifyMACPayload(uint8_t token, uint8_t offset, uint8_t* buf, uint8_t len); } tinyos-2.1.2+dfsg/tos/chips/cc2420x/000077500000000000000000000000001207233610700167615ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2420x/CC2420XActiveMessageC.nc000066400000000000000000000057461207233610700230100ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai, Miklos Maroti */ #include #ifdef IEEE154FRAMES_ENABLED #error "You cannot use CC2420XActiveMessageC with IEEE154FRAMES_ENABLED defined" #endif configuration CC2420XActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface SendNotifier[am_id_t id]; // for TOSThreads interface Receive as ReceiveDefault[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketField as PacketLinkQuality; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface LinkPacketMetadata; interface LocalTime as LocalTimeRadio; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface PacketTimeStamp as PacketTimeStamp32khz; } uses { interface PacketTimeStamp as UnimplementedPacketTimeStamp32khz; } } implementation { components CC2420XRadioC as RadioC; SplitControl = RadioC; AMSend = RadioC; Receive = RadioC.Receive; Snoop = RadioC.Snoop; SendNotifier = RadioC; ReceiveDefault = RadioC.ReceiveDefault; SnoopDefault = RadioC.SnoopDefault; Packet = RadioC.PacketForActiveMessage; AMPacket = RadioC; PacketAcknowledgements = RadioC; LowPowerListening = RadioC; PacketLink = RadioC; RadioChannel = RadioC; PacketLinkQuality = RadioC.PacketLinkQuality; PacketTransmitPower = RadioC.PacketTransmitPower; PacketRSSI = RadioC.PacketRSSI; LinkPacketMetadata = RadioC; LocalTimeRadio = RadioC; PacketTimeStampMilli = RadioC; PacketTimeStampRadio = RadioC; PacketTimeStamp32khz = UnimplementedPacketTimeStamp32khz; } tinyos-2.1.2+dfsg/tos/chips/cc2420x/CC2420XDriverConfig.nc000066400000000000000000000040421207233610700225320ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai, Miklos Maroti */ interface CC2420XDriverConfig { /** * Returns the length of a dummy header to align the payload properly. */ async command uint8_t headerLength(message_t* msg); /** * Returns the maximum length of the PHY payload including the * length field but not counting the FCF field. */ async command uint8_t maxPayloadLength(); /** * Returns the length of a dummy metadata section to align the * metadata section properly. */ async command uint8_t metadataLength(message_t* msg); /** * Gets the number of bytes we should read before the RadioReceive.header * event is fired. If the length of the packet is less than this amount, * then that event is fired earlier. The header length must be at least one. */ async command uint8_t headerPreloadLength(); /** * Returns TRUE if before sending this message we should make sure that * the channel is clear via a very basic (and quick) RSSI check. */ async command bool requiresRssiCca(message_t* msg); } tinyos-2.1.2+dfsg/tos/chips/cc2420x/CC2420XDriverLayer.h000066400000000000000000000146021207233610700222330ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #ifndef __CC2420XDRIVERLAYER_H__ #define __CC2420XDRIVERLAYER_H__ typedef nx_struct cc2420x_header_t { nxle_uint8_t length; } cc2420x_header_t; typedef struct cc2420x_metadata_t { uint8_t lqi; union { uint8_t power; uint8_t rssi; }; } cc2420x_metadata_t; enum cc2420X_timing_enums { CC2420X_SYMBOL_TIME = 16, // 16us IDLE_2_RX_ON_TIME = 12 * CC2420X_SYMBOL_TIME, PD_2_IDLE_TIME = 860, // .86ms STROBE_TO_TX_ON_TIME = 12 * CC2420X_SYMBOL_TIME, // TX SFD delay is computed as follows: // a.) STROBE_TO_TX_ON_TIME is required for preamble transmission to // start after TX strobe is issued // b.) the SFD byte is the 5th byte transmitted (10 symbol periods) // c.) there's approximately a 25us delay between the strobe and reading // the timer register TX_SFD_DELAY = STROBE_TO_TX_ON_TIME + 10 * CC2420X_SYMBOL_TIME - 25, // TX SFD is captured in hardware RX_SFD_DELAY = 0, }; enum cc2420X_reg_access_enums { CC2420X_CMD_REGISTER_MASK = 0x3f, CC2420X_CMD_REGISTER_READ = 0x40, CC2420X_CMD_REGISTER_WRITE = 0x00, CC2420X_CMD_TXRAM_WRITE = 0x80, }; typedef union cc2420X_status { uint16_t value; struct { unsigned reserved0:1; unsigned rssi_valid:1; unsigned lock:1; unsigned tx_active:1; unsigned enc_busy:1; unsigned tx_underflow:1; unsigned xosc16m_stable:1; unsigned reserved7:1; }; } cc2420X_status_t; typedef union cc2420X_iocfg0 { uint16_t value; struct { unsigned fifop_thr:7; unsigned cca_polarity:1; unsigned sfd_polarity:1; unsigned fifop_polarity:1; unsigned fifo_polarity:1; unsigned bcn_accept:1; unsigned reserved:4; // write as 0 } f; } cc2420X_iocfg0_t; // TODO: make sure that we avoid wasting RAM static const cc2420X_iocfg0_t cc2420X_iocfg0_default = {.f.fifop_thr = 64, .f.cca_polarity = 0, .f.sfd_polarity = 0, .f.fifop_polarity = 0, .f.fifo_polarity = 0, .f.bcn_accept = 0, .f.reserved = 0}; typedef union cc2420X_iocfg1 { uint16_t value; struct { unsigned ccamux:5; unsigned sfdmux:5; unsigned hssd_src:3; unsigned reserved:3; // write as 0 } f; } cc2420X_iocfg1_t; static const cc2420X_iocfg1_t cc2420X_iocfg1_default = {.value = 0}; typedef union cc2420X_fsctrl { uint16_t value; struct { unsigned freq:10; unsigned lock_status:1; unsigned lock_length:1; unsigned cal_running:1; unsigned cal_done:1; unsigned lock_thr:2; } f; } cc2420X_fsctrl_t; static const cc2420X_fsctrl_t cc2420X_fsctrl_default = {.f.lock_thr = 1, .f.freq = 357, .f.lock_status = 0, .f.lock_length = 0, .f.cal_running = 0, .f.cal_done = 0}; typedef union cc2420X_mdmctrl0 { uint16_t value; struct { unsigned preamble_length:4; unsigned autoack:1; unsigned autocrc:1; unsigned cca_mode:2; unsigned cca_hyst:3; unsigned adr_decode:1; unsigned pan_coordinator:1; unsigned reserved_frame_mode:1; unsigned reserved:2; } f; } cc2420X_mdmctrl0_t; static const cc2420X_mdmctrl0_t cc2420X_mdmctrl0_default = {.f.preamble_length = 2, .f.autocrc = 1, .f.cca_mode = 3, .f.cca_hyst = 2, .f.adr_decode = 1}; typedef union cc2420X_txctrl { uint16_t value; struct { unsigned pa_level:5; unsigned reserved:1; unsigned pa_current:3; unsigned txmix_current:2; unsigned txmix_caparray:2; unsigned tx_turnaround:1; unsigned txmixbuf_cur:2; } f; } cc2420X_txctrl_t; static const cc2420X_txctrl_t cc2420X_txctrl_default = {.f.pa_level = 31, .f.reserved = 1, .f.pa_current = 3, .f.tx_turnaround = 1, .f.txmixbuf_cur = 2}; #ifndef CC2420X_DEF_CHANNEL #define CC2420X_DEF_CHANNEL 11 #endif #ifndef CC2420X_DEF_RFPOWER #define CC2420X_DEF_RFPOWER 31 #endif enum { CC2420X_TX_PWR_MASK = 0x1f, CC2420X_CHANNEL_MASK = 0x1f, }; enum cc2420X_config_reg_enums { CC2420X_SNOP = 0x00, CC2420X_SXOSCON = 0x01, CC2420X_STXCAL = 0x02, CC2420X_SRXON = 0x03, CC2420X_STXON = 0x04, CC2420X_STXONCCA = 0x05, CC2420X_SRFOFF = 0x06, CC2420X_SXOSCOFF = 0x07, CC2420X_SFLUSHRX = 0x08, CC2420X_SFLUSHTX = 0x09, CC2420X_SACK = 0x0a, CC2420X_SACKPEND = 0x0b, CC2420X_SRXDEC = 0x0c, CC2420X_STXENC = 0x0d, CC2420X_SAES = 0x0e, CC2420X_MAIN = 0x10, CC2420X_MDMCTRL0 = 0x11, CC2420X_MDMCTRL1 = 0x12, CC2420X_RSSI = 0x13, CC2420X_SYNCWORD = 0x14, CC2420X_TXCTRL = 0x15, CC2420X_RXCTRL0 = 0x16, CC2420X_RXCTRL1 = 0x17, CC2420X_FSCTRL = 0x18, CC2420X_SECCTRL0 = 0x19, CC2420X_SECCTRL1 = 0x1a, CC2420X_BATTMON = 0x1b, CC2420X_IOCFG0 = 0x1c, CC2420X_IOCFG1 = 0x1d, CC2420X_MANFIDL = 0x1e, CC2420X_MANFIDH = 0x1f, CC2420X_FSMTC = 0x20, CC2420X_MANAND = 0x21, CC2420X_MANOR = 0x22, CC2420X_AGCCTRL = 0x23, CC2420X_AGCTST0 = 0x24, CC2420X_AGCTST1 = 0x25, CC2420X_AGCTST2 = 0x26, CC2420X_FSTST0 = 0x27, CC2420X_FSTST1 = 0x28, CC2420X_FSTST2 = 0x29, CC2420X_FSTST3 = 0x2a, CC2420X_RXBPFTST = 0x2b, CC2420X_FSMSTATE = 0x2c, CC2420X_ADCTST = 0x2d, CC2420X_DACTST = 0x2e, CC2420X_TOPTST = 0x2f, CC2420X_TXFIFO = 0x3e, CC2420X_RXFIFO = 0x3f, }; enum cc2420X_ram_addr_enums { CC2420X_RAM_TXFIFO = 0x000, CC2420X_RAM_TXFIFO_END = 0x7f, CC2420X_RAM_RXFIFO = 0x080, CC2420X_RAM_KEY0 = 0x100, CC2420X_RAM_RXNONCE = 0x110, CC2420X_RAM_SABUF = 0x120, CC2420X_RAM_KEY1 = 0x130, CC2420X_RAM_TXNONCE = 0x140, CC2420X_RAM_CBCSTATE = 0x150, CC2420X_RAM_IEEEADR = 0x160, CC2420X_RAM_PANID = 0x168, CC2420X_RAM_SHORTADR = 0x16a, }; #endif // __CC2420XDRIVERLAYER_H__ tinyos-2.1.2+dfsg/tos/chips/cc2420x/CC2420XDriverLayerC.nc000066400000000000000000000066001207233610700225060ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai, Miklos Maroti */ #include #include configuration CC2420XDriverLayerC { provides { interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; interface LinkPacketMetadata; interface LocalTime as LocalTimeRadio; interface Alarm; } uses { interface CC2420XDriverConfig as Config; interface PacketTimeStamp; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; interface RadioAlarm; } } implementation { components CC2420XDriverLayerP as DriverLayerP, BusyWaitMicroC, TaskletC, MainC, HplCC2420XC as HplC; MainC.SoftwareInit -> DriverLayerP.SoftwareInit; MainC.SoftwareInit -> HplC.Init; RadioState = DriverLayerP; RadioSend = DriverLayerP; RadioReceive = DriverLayerP; RadioCCA = DriverLayerP; RadioPacket = DriverLayerP; LocalTimeRadio = HplC; Config = DriverLayerP; DriverLayerP.VREN -> HplC.VREN; DriverLayerP.CSN -> HplC.CSN; DriverLayerP.CCA -> HplC.CCA; DriverLayerP.RSTN -> HplC.RSTN; DriverLayerP.FIFO -> HplC.FIFO; DriverLayerP.FIFOP -> HplC.FIFOP; DriverLayerP.SFD -> HplC.SFD; PacketTransmitPower = DriverLayerP.PacketTransmitPower; TransmitPowerFlag = DriverLayerP.TransmitPowerFlag; PacketRSSI = DriverLayerP.PacketRSSI; RSSIFlag = DriverLayerP.RSSIFlag; PacketTimeSyncOffset = DriverLayerP.PacketTimeSyncOffset; TimeSyncFlag = DriverLayerP.TimeSyncFlag; PacketLinkQuality = DriverLayerP.PacketLinkQuality; PacketTimeStamp = DriverLayerP.PacketTimeStamp; LinkPacketMetadata = DriverLayerP; Alarm = HplC.Alarm; RadioAlarm = DriverLayerP.RadioAlarm; DriverLayerP.SpiResource -> HplC.SpiResource; DriverLayerP.FastSpiByte -> HplC; DriverLayerP.SfdCapture -> HplC; DriverLayerP.FifopInterrupt -> HplC; DriverLayerP.Tasklet -> TaskletC; DriverLayerP.BusyWait -> BusyWaitMicroC; DriverLayerP.LocalTime-> HplC.LocalTimeRadio; #ifdef RADIO_DEBUG components DiagMsgC; DriverLayerP.DiagMsg -> DiagMsgC; #endif components LedsC; DriverLayerP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cc2420x/CC2420XDriverLayerP.nc000066400000000000000000000760111207233610700225260ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include #include #include #include #include #define spi_atomic module CC2420XDriverLayerP { provides { interface Init as SoftwareInit @exactlyonce(); interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; interface LinkPacketMetadata; } uses { interface Resource as SpiResource; interface BusyWait; interface LocalTime; interface CC2420XDriverConfig as Config; interface FastSpiByte; interface GeneralIO as CSN; interface GeneralIO as VREN; interface GeneralIO as CCA; interface GeneralIO as RSTN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as SFD; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; interface PacketTimeStamp; interface Tasklet; interface RadioAlarm; #ifdef RADIO_DEBUG interface DiagMsg; #endif interface Leds; } } implementation { cc2420x_header_t* getHeader(message_t* msg) { return ((void*)msg) + call Config.headerLength(msg); } void* getPayload(message_t* msg) { return ((void*)msg); } cc2420x_metadata_t* getMeta(message_t* msg) { return ((void*)msg) + sizeof(message_t) - call RadioPacket.metadataLength(msg); } /*----------------- STATE -----------------*/ enum { STATE_VR_ON = 0, STATE_PD = 1, STATE_PD_2_IDLE = 2, STATE_IDLE = 3, STATE_IDLE_2_RX_ON = 4, STATE_RX_ON = 5, STATE_BUSY_TX_2_RX_ON = 6, STATE_IDLE_2_TX_ON = 7, STATE_TX_ON = 8, STATE_RX_DOWNLOAD = 9, }; norace uint8_t state = STATE_VR_ON; enum { CMD_NONE = 0, // the state machine has stopped CMD_TURNOFF = 1, // goto SLEEP state CMD_STANDBY = 2, // goto TRX_OFF state CMD_TURNON = 3, // goto RX_ON state CMD_TRANSMIT = 4, // currently transmitting a message CMD_RECEIVE = 5, // currently receiving a message CMD_CCA = 6, // performing clear chanel assesment CMD_CHANNEL = 7, // changing the channel CMD_SIGNAL_DONE = 8, // signal the end of the state transition CMD_DOWNLOAD = 9, // download the received message }; tasklet_norace uint8_t cmd = CMD_NONE; norace bool radioIrq = 0; tasklet_norace uint8_t txPower; tasklet_norace uint8_t channel; tasklet_norace message_t* rxMsg; #ifdef RADIO_DEBUG_MESSAGES tasklet_norace message_t* txMsg; #endif message_t rxMsgBuffer; uint16_t capturedTime; // time when the last SFD interrupt has occured inline cc2420X_status_t getStatus(); /*----------------- ALARM -----------------*/ tasklet_async event void RadioAlarm.fired() { if( state == STATE_PD_2_IDLE ) { state = STATE_IDLE; if( cmd == CMD_STANDBY ) cmd = CMD_SIGNAL_DONE; } else if( state == STATE_IDLE_2_RX_ON ) { state = STATE_RX_ON; cmd = CMD_SIGNAL_DONE; // in receive mode, enable SFD capture call SfdCapture.captureRisingEdge(); } else RADIO_ASSERT(FALSE); // make sure the rest of the command processing is called call Tasklet.schedule(); } /*----------------- REGISTER -----------------*/ inline uint16_t readRegister(uint8_t reg) { uint16_t value = 0; RADIO_ASSERT( call SpiResource.isOwner() ); RADIO_ASSERT( reg == (reg & CC2420X_CMD_REGISTER_MASK) ); call CSN.set(); call CSN.clr(); call FastSpiByte.splitWrite(CC2420X_CMD_REGISTER_READ | reg); call FastSpiByte.splitReadWrite(0); value = ((uint16_t)call FastSpiByte.splitReadWrite(0) << 8); value += call FastSpiByte.splitRead(); call CSN.set(); return value; } inline cc2420X_status_t strobe(uint8_t reg) { cc2420X_status_t status; RADIO_ASSERT( call SpiResource.isOwner() ); RADIO_ASSERT( reg == (reg & CC2420X_CMD_REGISTER_MASK) ); call CSN.set(); call CSN.clr(); call FastSpiByte.splitWrite(CC2420X_CMD_REGISTER_WRITE | reg); status.value = call FastSpiByte.splitRead(); call CSN.set(); return status; } inline cc2420X_status_t getStatus() { return strobe(CC2420X_SNOP); } inline cc2420X_status_t writeRegister(uint8_t reg, uint16_t value) { cc2420X_status_t status; RADIO_ASSERT( call SpiResource.isOwner() ); RADIO_ASSERT( reg == (reg & CC2420X_CMD_REGISTER_MASK) ); call CSN.set(); call CSN.clr(); call FastSpiByte.splitWrite(CC2420X_CMD_REGISTER_WRITE | reg); call FastSpiByte.splitReadWrite(value >> 8); call FastSpiByte.splitReadWrite(value & 0xff); status.value = call FastSpiByte.splitRead(); call CSN.set(); return status; } inline cc2420X_status_t writeTxFifo(uint8_t* data, uint8_t length) { cc2420X_status_t status; uint8_t idx; RADIO_ASSERT( call SpiResource.isOwner() ); call CSN.set(); call CSN.clr(); call FastSpiByte.splitWrite(CC2420X_CMD_REGISTER_WRITE | CC2420X_TXFIFO); for(idx = 0; idxlength; // length | data[0] ... data[length-3] | automatically generated FCS header = call Config.headerPreloadLength(); if( header > length ) header = length; length -= header; // disable SFD interrupt call SfdCapture.disable(); // first upload the header to gain some time spi_atomic writeTxFifo(data, header); // there's a chance that there was a receive SFD interrupt in such a short time // we probably didn't cover all possibilities, but that's OK: downloadMessage() can // clean up the RXFIFO if necessary if( cmd != CMD_NONE || (state != STATE_IDLE && state != STATE_RX_ON) || radioIrq || call SFD.get() == 1 ) { // discard header we wrote to TXFIFO strobe(CC2420X_SFLUSHTX); // re-enable SFD interrupt call SfdCapture.captureRisingEdge(); // and bail out return EBUSY; } // there's _still_ a chance that there was a receive SFD interrupt in such a short // time , but that's OK: downloadMessage() can clean up the RXFIFO if necessary atomic { // zero out capturedTime // the SFD interrupt will set it again _while_ this function is running capturedTime = 0; // start transmission strobe(CC2420X_STXON); // get a timestamp right after strobe returns time = call RadioAlarm.getNow(); cmd = CMD_TRANSMIT; state = STATE_TX_ON; call SfdCapture.captureFallingEdge(); } timesync = call PacketTimeSyncOffset.isSet(msg) ? ((void*)msg) + call PacketTimeSyncOffset.get(msg) : 0; if( timesync == 0 ) { // no timesync: write the entire payload to the fifo if(length>0) spi_atomic writeTxFifo(data+header, length - 1); state = STATE_BUSY_TX_2_RX_ON; } else { // timesync required: write the payload before the timesync bytes to the fifo // TODO: we're assuming here that the timestamp is at the end of the message spi_atomic writeTxFifo(data+header, length - sizeof(timesync_relative) - 1); } // compute timesync sfdTime = time; // read both clocks // TODO: how can atomic be removed??? atomic { time = call RadioAlarm.getNow(); time32 = call LocalTime.get(); } // adjust time32 with the time elapsed since the SFD event time -= sfdTime; time32 -= time; // adjust for delay between the STXON strobe and the transmission of the SFD time32 += TX_SFD_DELAY; call PacketTimeStamp.set(msg, time32); if( timesync != 0 ) { // read and adjust the timestamp field timesync_relative = (*(timesync_absolute_t*)timesync) - time32; // write it to the fifo // TODO: we're assuming here that the timestamp is at the end of the message spi_atomic writeTxFifo((uint8_t*)(×ync_relative), sizeof(timesync_relative)); state = STATE_BUSY_TX_2_RX_ON; } #ifdef RADIO_DEBUG_MESSAGES txMsg = msg; if( call DiagMsg.record() ) { length = getHeader(msg)->length; call DiagMsg.chr('t'); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.uint32(call PacketTimeStamp.isValid(msg) ? call PacketTimeStamp.timestamp(msg) : 0); call DiagMsg.int8(length); call DiagMsg.hex8s(getPayload(msg), length); call DiagMsg.send(); } #endif return SUCCESS; } default tasklet_async event void RadioSend.sendDone(error_t error) { } default tasklet_async event void RadioSend.ready() { } /*----------------- CCA -----------------*/ tasklet_async command error_t RadioCCA.request() { if( cmd != CMD_NONE || state != STATE_RX_ON ) return EBUSY; if(call CCA.get()) { signal RadioCCA.done(SUCCESS); } else { signal RadioCCA.done(EBUSY); } return SUCCESS; } default tasklet_async event void RadioCCA.done(error_t error) { } /*----------------- RECEIVE -----------------*/ // recover from an error // rx fifo flush does not always work inline void recover() { cc2420X_status_t status; call SfdCapture.disable(); // reset the radio, initialize registers to default values resetRadio(); RADIO_ASSERT(state == STATE_PD); // start oscillator strobe(CC2420X_SXOSCON); // going idle in PD_2_IDLE_TIME state = STATE_PD_2_IDLE; call BusyWait.wait(PD_2_IDLE_TIME); // .86ms OSC startup time // get status status = getStatus(); RADIO_ASSERT(status.rssi_valid == 0); RADIO_ASSERT(status.lock == 0); RADIO_ASSERT(status.tx_active == 0); RADIO_ASSERT(status.enc_busy == 0); RADIO_ASSERT(status.tx_underflow == 0); RADIO_ASSERT(status.xosc16m_stable == 1); // we're idle now state = STATE_IDLE; // download current channel to the radio setChannel(); // start receiving strobe(CC2420X_SRXON); state = STATE_IDLE_2_RX_ON; call SfdCapture.captureRisingEdge(); // we will be able to receive packets in 12 symbol periods state = STATE_RX_ON; } inline void downloadMessage() { uint8_t length; uint16_t crc = 1; uint8_t* data; uint8_t rssi; uint8_t crc_ok_lqi; uint16_t sfdTime; state = STATE_RX_DOWNLOAD; atomic sfdTime = capturedTime; // data starts after the length field data = getPayload(rxMsg) + sizeof(cc2420x_header_t); // read the length byte spi_atomic readLengthFromRxFifo(&length); // check for too short lengths if (length == 0) { // stop reading RXFIFO call CSN.set(); RADIO_ASSERT( call FIFOP.get() == 0 ); RADIO_ASSERT( call FIFO.get() == 0 ); state = STATE_RX_ON; cmd = CMD_NONE; call SfdCapture.captureRisingEdge(); return; } if (length == 1) { // skip payload and rssi spi_atomic readCrcOkAndLqiFromRxFifo(&crc_ok_lqi); RADIO_ASSERT( call FIFOP.get() == 0 ); RADIO_ASSERT( call FIFO.get() == 0 ); state = STATE_RX_ON; cmd = CMD_NONE; call SfdCapture.captureRisingEdge(); return; } if (length == 2) { // skip payload spi_atomic { readRssiFromRxFifo(&rssi); readCrcOkAndLqiFromRxFifo(&crc_ok_lqi); } RADIO_ASSERT( call FIFOP.get() == 0 ); RADIO_ASSERT( call FIFO.get() == 0 ); state = STATE_RX_ON; cmd = CMD_NONE; call SfdCapture.captureRisingEdge(); return; } // check for too long lengths if( length > 127 ) { recover(); RADIO_ASSERT( call FIFOP.get() == 0 ); RADIO_ASSERT( call FIFO.get() == 0 ); state = STATE_RX_ON; cmd = CMD_NONE; call SfdCapture.captureRisingEdge(); return; } if( length > call RadioPacket.maxPayloadLength() + 2 ) { while( length-- > 2 ) { readPayloadFromRxFifo(data, 1); } spi_atomic { readRssiFromRxFifo(&rssi); readCrcOkAndLqiFromRxFifo(&crc_ok_lqi); } RADIO_ASSERT( call FIFOP.get() == 0 ); state = STATE_RX_ON; cmd = CMD_NONE; call SfdCapture.captureRisingEdge(); return; } // if we're here, length must be correct RADIO_ASSERT(length >= 3 && length <= call RadioPacket.maxPayloadLength() + 2); getHeader(rxMsg)->length = length; // we'll read the FCS/CRC separately length -= 2; spi_atomic { // download the whole payload readPayloadFromRxFifo(data, length ); // the last two bytes are not the fsc, but RSSI(8), CRC_ON(1)+LQI(7) readRssiFromRxFifo(&rssi); readCrcOkAndLqiFromRxFifo(&crc_ok_lqi); } // there are still bytes in the fifo or if there's an overflow, recover // TODO: actually, we can signal that a message was received, without timestamp set if (call FIFOP.get() == 1 || call FIFO.get() == 1) { recover(); state = STATE_RX_ON; cmd = CMD_NONE; call SfdCapture.captureRisingEdge(); return; } state = STATE_RX_ON; cmd = CMD_NONE; // ready to receive new message: enable SFD interrupts call SfdCapture.captureRisingEdge(); if( signal RadioReceive.header(rxMsg) ) { // set RSSI, CRC and LQI only if we're accepting the message call PacketRSSI.set(rxMsg, rssi); call PacketLinkQuality.set(rxMsg, crc_ok_lqi & 0x7f); crc = (crc_ok_lqi > 0x7f) ? 0 : 1; } // signal only if it has passed the CRC check if( crc == 0 ) { uint32_t time32; uint16_t time; atomic { time = call RadioAlarm.getNow(); time32 = call LocalTime.get(); } time -= sfdTime; time32 -= time; call PacketTimeStamp.set(rxMsg, time32); #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ) { call DiagMsg.str("r"); call DiagMsg.uint16(call RadioAlarm.getNow() - (uint16_t)call PacketTimeStamp.timestamp(rxMsg) ); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.uint16(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.int8(length); call DiagMsg.hex8s(getPayload(rxMsg), length); call DiagMsg.send(); } #endif rxMsg = signal RadioReceive.receive(rxMsg); } } /*----------------- IRQ -----------------*/ // RX SFD (rising edge), disabled for TX async event void SfdCapture.captured( uint16_t time ) { #ifdef RADIO_DEBUG_IRQ if( call DiagMsg.record() ) { call DiagMsg.str("SFD"); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.str("s="); call DiagMsg.uint8(state); if(call FIFO.get()) call DiagMsg.str("FIFO"); if(call FIFOP.get()) call DiagMsg.str("FIFOP"); if(call SFD.get()) call DiagMsg.str("SFD"); call DiagMsg.send(); } #endif RADIO_ASSERT( ! radioIrq ); RADIO_ASSERT(state == STATE_RX_ON || state == STATE_TX_ON || state == STATE_BUSY_TX_2_RX_ON); atomic capturedTime = time; radioIrq = TRUE; call SfdCapture.disable(); // do the rest of the processing call Tasklet.schedule(); } // FIFOP interrupt, last byte received async event void FifopInterrupt.fired() { // not used } inline void serviceRadio() { atomic if( isSpiAcquired() ) { radioIrq = FALSE; if( state == STATE_RX_ON && cmd == CMD_NONE ) { // it's an RX SFD cmd = CMD_DOWNLOAD; } else if( (state == STATE_TX_ON || state == STATE_BUSY_TX_2_RX_ON) && cmd == CMD_TRANSMIT) { cc2420X_status_t status; // it's a TX_END state = STATE_RX_ON; cmd = CMD_NONE; #if defined(RADIO_DEBUG_IRQ) && defined(RADIO_DEBUG_MESSAGES) if( call DiagMsg.record() ) { call DiagMsg.str("txdone"); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.uint16(capturedTime - (uint16_t)call PacketTimeStamp.timestamp(txMsg)); if(call FIFO.get()) call DiagMsg.str("FIFO"); if(call FIFOP.get()) call DiagMsg.str("FIFOP"); if(call SFD.get()) call DiagMsg.str("SFD"); call DiagMsg.send(); } #endif call SfdCapture.captureRisingEdge(); // get status status = getStatus(); if ( status.tx_underflow == 1) { // flush tx fifo strobe(CC2420X_SFLUSHTX); signal RadioSend.sendDone(FAIL); } else { signal RadioSend.sendDone(SUCCESS); } } else RADIO_ASSERT(FALSE); } } default tasklet_async event bool RadioReceive.header(message_t* msg) { return TRUE; } default tasklet_async event message_t* RadioReceive.receive(message_t* msg) { return msg; } /*----------------- TASKLET -----------------*/ task void releaseSpi() { call SpiResource.release(); } tasklet_async event void Tasklet.run() { #ifdef RADIO_DEBUG_TASKLET if( call DiagMsg.record() ) { call DiagMsg.str("tsk_str"); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.str("s="); call DiagMsg.uint8(state); call DiagMsg.str("c="); call DiagMsg.uint8(cmd); if(radioIrq) call DiagMsg.str("IRQ"); if(call FIFO.get()) call DiagMsg.str("FIFO"); if(call FIFOP.get()) call DiagMsg.str("FIFOP"); if(call SFD.get()) call DiagMsg.str("SFD"); call DiagMsg.send(); } #endif if( radioIrq ) serviceRadio(); if( cmd != CMD_NONE ) { if( cmd == CMD_DOWNLOAD && state == STATE_RX_ON) downloadMessage(); else if( CMD_TURNOFF <= cmd && cmd <= CMD_TURNON ) changeState(); else if( cmd == CMD_CHANNEL ) changeChannel(); if( cmd == CMD_SIGNAL_DONE ) { cmd = CMD_NONE; signal RadioState.done(); } } if( cmd == CMD_NONE && state == STATE_RX_ON && ! radioIrq ) signal RadioSend.ready(); if( cmd == CMD_NONE ) post releaseSpi(); #ifdef RADIO_DEBUG_TASKLET if( call DiagMsg.record() ) { call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.str("tsk_end"); call DiagMsg.str("s="); call DiagMsg.uint8(state); call DiagMsg.str("c="); call DiagMsg.uint8(cmd); if(radioIrq) call DiagMsg.str("IRQ"); if(call FIFO.get()) call DiagMsg.str("FIFO"); if(call FIFOP.get()) call DiagMsg.str("FIFOP"); if(call SFD.get()) call DiagMsg.str("SFD"); call DiagMsg.send(); } #endif } /*----------------- RadioPacket -----------------*/ async command uint8_t RadioPacket.headerLength(message_t* msg) { return call Config.headerLength(msg) + sizeof(cc2420x_header_t); } async command uint8_t RadioPacket.payloadLength(message_t* msg) { return getHeader(msg)->length - 2; } async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length) { RADIO_ASSERT( 1 <= length && length <= 125 ); RADIO_ASSERT( call RadioPacket.headerLength(msg) + length + call RadioPacket.metadataLength(msg) <= sizeof(message_t) ); // we add the length of the CRC, which is automatically generated getHeader(msg)->length = length + 2; } async command uint8_t RadioPacket.maxPayloadLength() { RADIO_ASSERT( call Config.maxPayloadLength() - sizeof(cc2420x_header_t) <= 125 ); return call Config.maxPayloadLength() - sizeof(cc2420x_header_t); } async command uint8_t RadioPacket.metadataLength(message_t* msg) { return call Config.metadataLength(msg) + sizeof(cc2420x_metadata_t); } async command void RadioPacket.clear(message_t* msg) { // all flags are automatically cleared } /*----------------- PacketTransmitPower -----------------*/ async command bool PacketTransmitPower.isSet(message_t* msg) { return call TransmitPowerFlag.get(msg); } async command uint8_t PacketTransmitPower.get(message_t* msg) { return getMeta(msg)->power; } async command void PacketTransmitPower.clear(message_t* msg) { call TransmitPowerFlag.clear(msg); } async command void PacketTransmitPower.set(message_t* msg, uint8_t value) { call TransmitPowerFlag.set(msg); getMeta(msg)->power = value; } /*----------------- PacketRSSI -----------------*/ async command bool PacketRSSI.isSet(message_t* msg) { return call RSSIFlag.get(msg); } async command uint8_t PacketRSSI.get(message_t* msg) { return getMeta(msg)->rssi; } async command void PacketRSSI.clear(message_t* msg) { call RSSIFlag.clear(msg); } async command void PacketRSSI.set(message_t* msg, uint8_t value) { // just to be safe if the user fails to clear the packet call TransmitPowerFlag.clear(msg); call RSSIFlag.set(msg); getMeta(msg)->rssi = value; } /*----------------- PacketTimeSyncOffset -----------------*/ async command bool PacketTimeSyncOffset.isSet(message_t* msg) { return call TimeSyncFlag.get(msg); } async command uint8_t PacketTimeSyncOffset.get(message_t* msg) { return call RadioPacket.headerLength(msg) + call RadioPacket.payloadLength(msg) - sizeof(timesync_absolute_t); } async command void PacketTimeSyncOffset.clear(message_t* msg) { call TimeSyncFlag.clear(msg); } async command void PacketTimeSyncOffset.set(message_t* msg, uint8_t value) { // we do not store the value, the time sync field is always the last 4 bytes RADIO_ASSERT( call PacketTimeSyncOffset.get(msg) == value ); call TimeSyncFlag.set(msg); } /*----------------- PacketLinkQuality -----------------*/ async command bool PacketLinkQuality.isSet(message_t* msg) { return TRUE; } async command uint8_t PacketLinkQuality.get(message_t* msg) { return getMeta(msg)->lqi; } async command void PacketLinkQuality.clear(message_t* msg) { } async command void PacketLinkQuality.set(message_t* msg, uint8_t value) { getMeta(msg)->lqi = value; } /*----------------- LinkPacketMetadata -----------------*/ async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) { return call PacketLinkQuality.get(msg) > 105; } } tinyos-2.1.2+dfsg/tos/chips/cc2420x/CC2420XRadio.h000066400000000000000000000041061207233610700210370ustar00rootroot00000000000000 /* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #ifndef __CC2420XRADIO_H__ #define __CC2420XRADIO_H__ #include #include #include #include #include #include #include #include #include typedef nx_struct cc2420xpacket_header_t { cc2420x_header_t cc2420x; ieee154_simple_header_t ieee154; #ifndef TFRAMES_ENABLED network_header_t network; #endif #ifndef IEEE154FRAMES_ENABLED activemessage_header_t am; #endif } cc2420xpacket_header_t; typedef nx_struct cc2420xpacket_footer_t { // the time stamp is not recorded here, time stamped messaged cannot have max length } cc2420xpacket_footer_t; typedef struct cc2420xpacket_metadata_t { #ifdef LOW_POWER_LISTENING lpl_metadata_t lpl; #endif #ifdef PACKET_LINK link_metadata_t link; #endif timestamp_metadata_t timestamp; flags_metadata_t flags; cc2420x_metadata_t cc2420x; } cc2420xpacket_metadata_t; #endif//__CC2420XRADIO_H__ tinyos-2.1.2+dfsg/tos/chips/cc2420x/CC2420XRadioC.nc000066400000000000000000000222271207233610700213170ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai, Miklos Maroti */ #include configuration CC2420XRadioC { provides { interface SplitControl; #ifndef IEEE154FRAMES_ENABLED interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface SendNotifier[am_id_t id]; // for TOSThreads interface Receive as ReceiveDefault[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface AMPacket; interface Packet as PacketForActiveMessage; #endif #ifndef TFRAMES_ENABLED interface Ieee154Send; interface Receive as Ieee154Receive; interface SendNotifier as Ieee154Notifier; interface Resource as SendResource[uint8_t clint]; interface Ieee154Packet; interface Packet as PacketForIeee154Message; #endif interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; #ifdef TRAFFIC_MONITOR interface TrafficMonitor; #endif interface RadioChannel; interface PacketField as PacketLinkQuality; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface LinkPacketMetadata; interface LocalTime as LocalTimeRadio; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { #define UQ_METADATA_FLAGS "UQ_CC2420X_METADATA_FLAGS" #define UQ_RADIO_ALARM "UQ_CC2420X_RADIO_ALARM" // -------- RadioP components CC2420XRadioP as RadioP; #ifdef RADIO_DEBUG components AssertC; #endif RadioP.Ieee154PacketLayer -> Ieee154PacketLayerC; RadioP.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; RadioP.PacketTimeStamp -> TimeStampingLayerC; RadioP.CC2420XPacket -> RadioDriverLayerC; // -------- RadioAlarm components new RadioAlarmC(); RadioAlarmC.Alarm -> RadioDriverLayerC; // -------- Active Message #ifndef IEEE154FRAMES_ENABLED components new ActiveMessageLayerC(); ActiveMessageLayerC.Config -> RadioP; ActiveMessageLayerC.SubSend -> AutoResourceAcquireLayerC; ActiveMessageLayerC.SubReceive -> TinyosNetworkLayerC.TinyosReceive; ActiveMessageLayerC.SubPacket -> TinyosNetworkLayerC.TinyosPacket; AMSend = ActiveMessageLayerC; Receive = ActiveMessageLayerC.Receive; Snoop = ActiveMessageLayerC.Snoop; SendNotifier = ActiveMessageLayerC; AMPacket = ActiveMessageLayerC; PacketForActiveMessage = ActiveMessageLayerC; ReceiveDefault = ActiveMessageLayerC.ReceiveDefault; SnoopDefault = ActiveMessageLayerC.SnoopDefault; #endif // -------- Automatic RadioSend Resource #ifndef IEEE154FRAMES_ENABLED #ifndef TFRAMES_ENABLED components new AutoResourceAcquireLayerC(); AutoResourceAcquireLayerC.Resource -> SendResourceC.Resource[unique(RADIO_SEND_RESOURCE)]; #else components new DummyLayerC() as AutoResourceAcquireLayerC; #endif AutoResourceAcquireLayerC -> TinyosNetworkLayerC.TinyosSend; #endif // -------- RadioSend Resource #ifndef TFRAMES_ENABLED components new SimpleFcfsArbiterC(RADIO_SEND_RESOURCE) as SendResourceC; SendResource = SendResourceC; // -------- Ieee154 Message components new Ieee154MessageLayerC(); Ieee154MessageLayerC.Ieee154PacketLayer -> Ieee154PacketLayerC; Ieee154MessageLayerC.SubSend -> TinyosNetworkLayerC.Ieee154Send; Ieee154MessageLayerC.SubReceive -> TinyosNetworkLayerC.Ieee154Receive; Ieee154MessageLayerC.RadioPacket -> TinyosNetworkLayerC.Ieee154Packet; Ieee154Send = Ieee154MessageLayerC; Ieee154Receive = Ieee154MessageLayerC; Ieee154Notifier = Ieee154MessageLayerC; Ieee154Packet = Ieee154PacketLayerC; PacketForIeee154Message = Ieee154MessageLayerC; #endif // -------- Tinyos Network components new TinyosNetworkLayerC(); TinyosNetworkLayerC.SubSend -> UniqueLayerC; TinyosNetworkLayerC.SubReceive -> PacketLinkLayerC; TinyosNetworkLayerC.SubPacket -> Ieee154PacketLayerC; // -------- IEEE 802.15.4 Packet components new Ieee154PacketLayerC(); Ieee154PacketLayerC.SubPacket -> PacketLinkLayerC; // -------- UniqueLayer Send part (wired twice) components new UniqueLayerC(); UniqueLayerC.Config -> RadioP; UniqueLayerC.SubSend -> PacketLinkLayerC; // -------- Packet Link components new PacketLinkLayerC(); PacketLink = PacketLinkLayerC; PacketLinkLayerC.PacketAcknowledgements -> SoftwareAckLayerC; PacketLinkLayerC -> LowPowerListeningLayerC.Send; PacketLinkLayerC -> LowPowerListeningLayerC.Receive; PacketLinkLayerC -> LowPowerListeningLayerC.RadioPacket; // -------- Low Power Listening #ifdef LOW_POWER_LISTENING #warning "*** USING LOW POWER LISTENING LAYER" components new LowPowerListeningLayerC(); LowPowerListeningLayerC.Config -> RadioP; LowPowerListeningLayerC.PacketAcknowledgements -> SoftwareAckLayerC; #else components new LowPowerListeningDummyC() as LowPowerListeningLayerC; #endif LowPowerListeningLayerC.SubControl -> MessageBufferLayerC; LowPowerListeningLayerC.SubSend -> MessageBufferLayerC; LowPowerListeningLayerC.SubReceive -> MessageBufferLayerC; LowPowerListeningLayerC.SubPacket -> TimeStampingLayerC; SplitControl = LowPowerListeningLayerC; LowPowerListening = LowPowerListeningLayerC; // -------- MessageBuffer components new MessageBufferLayerC(); MessageBufferLayerC.RadioSend -> CollisionAvoidanceLayerC; MessageBufferLayerC.RadioReceive -> UniqueLayerC; MessageBufferLayerC.RadioState -> TrafficMonitorLayerC; RadioChannel = MessageBufferLayerC; // -------- UniqueLayer receive part (wired twice) UniqueLayerC.SubReceive -> CollisionAvoidanceLayerC; // -------- CollisionAvoidance #ifdef SLOTTED_MAC components new SlottedCollisionLayerC() as CollisionAvoidanceLayerC; #else components new RandomCollisionLayerC() as CollisionAvoidanceLayerC; #endif CollisionAvoidanceLayerC.Config -> RadioP; CollisionAvoidanceLayerC.SubSend -> SoftwareAckLayerC; CollisionAvoidanceLayerC.SubReceive -> SoftwareAckLayerC; CollisionAvoidanceLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; // -------- SoftwareAcknowledgement components new SoftwareAckLayerC(); SoftwareAckLayerC.AckReceivedFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; SoftwareAckLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; PacketAcknowledgements = SoftwareAckLayerC; SoftwareAckLayerC.Config -> RadioP; SoftwareAckLayerC.SubSend -> CsmaLayerC; SoftwareAckLayerC.SubReceive -> CsmaLayerC; // -------- Carrier Sense components new DummyLayerC() as CsmaLayerC; CsmaLayerC.Config -> RadioP; CsmaLayerC -> TrafficMonitorLayerC.RadioSend; CsmaLayerC -> TrafficMonitorLayerC.RadioReceive; CsmaLayerC -> RadioDriverLayerC.RadioCCA; // -------- TimeStamping components new TimeStampingLayerC(); TimeStampingLayerC.LocalTimeRadio -> RadioDriverLayerC; TimeStampingLayerC.SubPacket -> MetadataFlagsLayerC; PacketTimeStampRadio = TimeStampingLayerC; PacketTimeStampMilli = TimeStampingLayerC; TimeStampingLayerC.TimeStampFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; // -------- MetadataFlags components new MetadataFlagsLayerC(); MetadataFlagsLayerC.SubPacket -> RadioDriverLayerC; // -------- Traffic Monitor #ifdef TRAFFIC_MONITOR components new TrafficMonitorLayerC(); TrafficMonitor = TrafficMonitorLayerC; #else components new DummyLayerC() as TrafficMonitorLayerC; #endif TrafficMonitorLayerC.Config -> RadioP; TrafficMonitorLayerC -> RadioDriverLayerC.RadioSend; TrafficMonitorLayerC -> RadioDriverLayerC.RadioReceive; TrafficMonitorLayerC -> RadioDriverLayerC.RadioState; // -------- Driver components CC2420XDriverLayerC as RadioDriverLayerC; RadioDriverLayerC.Config -> RadioP; RadioDriverLayerC.PacketTimeStamp -> TimeStampingLayerC; PacketTransmitPower = RadioDriverLayerC.PacketTransmitPower; PacketLinkQuality = RadioDriverLayerC.PacketLinkQuality; PacketRSSI = RadioDriverLayerC.PacketRSSI; LinkPacketMetadata = RadioDriverLayerC; LocalTimeRadio = RadioDriverLayerC; RadioDriverLayerC.TransmitPowerFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.RSSIFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.TimeSyncFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; } tinyos-2.1.2+dfsg/tos/chips/cc2420x/CC2420XRadioP.nc000066400000000000000000000212421207233610700213300ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Miklos Maroti, Janos Sallai */ #include #include #include module CC2420XRadioP { provides { interface CC2420XDriverConfig; interface SoftwareAckConfig; interface UniqueConfig; interface CsmaConfig; interface TrafficMonitorConfig; interface RandomCollisionConfig; interface SlottedCollisionConfig; interface ActiveMessageConfig; interface DummyConfig; #ifdef LOW_POWER_LISTENING interface LowPowerListeningConfig; #endif } uses { interface Ieee154PacketLayer; interface RadioAlarm; interface RadioPacket as CC2420XPacket; interface PacketTimeStamp; } } implementation { /*----------------- CC2420XDriverConfig -----------------*/ async command uint8_t CC2420XDriverConfig.headerLength(message_t* msg) { return offsetof(message_t, data) - sizeof(cc2420xpacket_header_t); } async command uint8_t CC2420XDriverConfig.maxPayloadLength() { return sizeof(cc2420xpacket_header_t) + TOSH_DATA_LENGTH; } async command uint8_t CC2420XDriverConfig.metadataLength(message_t* msg) { return 0; } async command uint8_t CC2420XDriverConfig.headerPreloadLength() { // we need the fcf, dsn, destpan and dest return 7; } async command bool CC2420XDriverConfig.requiresRssiCca(message_t* msg) { return call Ieee154PacketLayer.isDataFrame(msg); } /*----------------- SoftwareAckConfig -----------------*/ async command bool SoftwareAckConfig.requiresAckWait(message_t* msg) { return call Ieee154PacketLayer.requiresAckWait(msg); } async command bool SoftwareAckConfig.isAckPacket(message_t* msg) { return call Ieee154PacketLayer.isAckFrame(msg); } async command bool SoftwareAckConfig.verifyAckPacket(message_t* data, message_t* ack) { return call Ieee154PacketLayer.verifyAckReply(data, ack); } async command void SoftwareAckConfig.setAckRequired(message_t* msg, bool ack) { call Ieee154PacketLayer.setAckRequired(msg, ack); } async command bool SoftwareAckConfig.requiresAckReply(message_t* msg) { return call Ieee154PacketLayer.requiresAckReply(msg); } async command void SoftwareAckConfig.createAckPacket(message_t* data, message_t* ack) { call Ieee154PacketLayer.createAckReply(data, ack); } #ifndef SOFTWAREACK_TIMEOUT #define SOFTWAREACK_TIMEOUT 1000 #endif async command uint16_t SoftwareAckConfig.getAckTimeout() { return (uint16_t)(SOFTWAREACK_TIMEOUT * RADIO_ALARM_MICROSEC); } tasklet_async command void SoftwareAckConfig.reportChannelError() { #ifdef TRAFFIC_MONITOR // signal TrafficMonitorConfig.channelError(); #endif } /*----------------- UniqueConfig -----------------*/ async command uint8_t UniqueConfig.getSequenceNumber(message_t* msg) { return call Ieee154PacketLayer.getDSN(msg); } async command void UniqueConfig.setSequenceNumber(message_t* msg, uint8_t dsn) { call Ieee154PacketLayer.setDSN(msg, dsn); } async command am_addr_t UniqueConfig.getSender(message_t* msg) { return call Ieee154PacketLayer.getSrcAddr(msg); } tasklet_async command void UniqueConfig.reportChannelError() { #ifdef TRAFFIC_MONITOR // signal TrafficMonitorConfig.channelError(); #endif } /*----------------- ActiveMessageConfig -----------------*/ command am_addr_t ActiveMessageConfig.destination(message_t* msg) { return call Ieee154PacketLayer.getDestAddr(msg); } command void ActiveMessageConfig.setDestination(message_t* msg, am_addr_t addr) { call Ieee154PacketLayer.setDestAddr(msg, addr); } command am_addr_t ActiveMessageConfig.source(message_t* msg) { return call Ieee154PacketLayer.getSrcAddr(msg); } command void ActiveMessageConfig.setSource(message_t* msg, am_addr_t addr) { call Ieee154PacketLayer.setSrcAddr(msg, addr); } command am_group_t ActiveMessageConfig.group(message_t* msg) { return call Ieee154PacketLayer.getDestPan(msg); } command void ActiveMessageConfig.setGroup(message_t* msg, am_group_t grp) { call Ieee154PacketLayer.setDestPan(msg, grp); } command error_t ActiveMessageConfig.checkFrame(message_t* msg) { if( ! call Ieee154PacketLayer.isDataFrame(msg) ) call Ieee154PacketLayer.createDataFrame(msg); return SUCCESS; } /*----------------- CsmaConfig -----------------*/ async command bool CsmaConfig.requiresSoftwareCCA(message_t* msg) { return call Ieee154PacketLayer.isDataFrame(msg); } /*----------------- TrafficMonitorConfig -----------------*/ async command uint16_t TrafficMonitorConfig.getBytes(message_t* msg) { // pure airtime: preable (4 bytes), SFD (1 byte), length (1 byte), payload + CRC (len bytes) return call CC2420XPacket.payloadLength(msg) + 6; } /*----------------- RandomCollisionConfig -----------------*/ /* * We try to use the same values as in CC2420 * * CC2420_MIN_BACKOFF = 10 jiffies = 320 microsec * CC2420_BACKOFF_PERIOD = 10 jiffies * initial backoff = 0x1F * CC2420_BACKOFF_PERIOD = 310 jiffies = 9920 microsec * congestion backoff = 0x7 * CC2420_BACKOFF_PERIOD = 70 jiffies = 2240 microsec */ #ifndef LOW_POWER_LISTENING async command uint16_t RandomCollisionConfig.getMinimumBackoff() { return (uint16_t)(320 * RADIO_ALARM_MICROSEC); } async command uint16_t RandomCollisionConfig.getInitialBackoff(message_t* msg) { return (uint16_t)(9920 * RADIO_ALARM_MICROSEC); } async command uint16_t RandomCollisionConfig.getCongestionBackoff(message_t* msg) { return (uint16_t)(2240 * RADIO_ALARM_MICROSEC); } #endif async command uint16_t RandomCollisionConfig.getTransmitBarrier(message_t* msg) { uint16_t time; // TODO: maybe we should use the embedded timestamp of the message time = call RadioAlarm.getNow(); // estimated response time (download the message, etc) is 5-8 bytes if( call Ieee154PacketLayer.requiresAckReply(msg) ) time += (uint16_t)(32 * (-5 + 16 + 11 + 5) * RADIO_ALARM_MICROSEC); else time += (uint16_t)(32 * (-5 + 5) * RADIO_ALARM_MICROSEC); return time; } tasklet_async event void RadioAlarm.fired() { } /*----------------- SlottedCollisionConfig -----------------*/ async command uint16_t SlottedCollisionConfig.getInitialDelay() { return 300; } async command uint8_t SlottedCollisionConfig.getScheduleExponent() { return 1 + RADIO_ALARM_MILLI_EXP; } async command uint16_t SlottedCollisionConfig.getTransmitTime(message_t* msg) { // TODO: check if the timestamp is correct return call PacketTimeStamp.timestamp(msg); } async command uint16_t SlottedCollisionConfig.getCollisionWindowStart(message_t* msg) { // the preamble (4 bytes), SFD (1 byte), plus two extra for safety return (call PacketTimeStamp.timestamp(msg)) - (uint16_t)(7 * 32 * RADIO_ALARM_MICROSEC); } async command uint16_t SlottedCollisionConfig.getCollisionWindowLength(message_t* msg) { return (uint16_t)(2 * 7 * 32 * RADIO_ALARM_MICROSEC); } /*----------------- Dummy -----------------*/ async command void DummyConfig.nothing() { } /*----------------- LowPowerListening -----------------*/ #ifdef LOW_POWER_LISTENING command bool LowPowerListeningConfig.needsAutoAckRequest(message_t* msg) { return call Ieee154PacketLayer.getDestAddr(msg) != TOS_BCAST_ADDR; } command bool LowPowerListeningConfig.ackRequested(message_t* msg) { return call Ieee154PacketLayer.getAckRequired(msg); } command uint16_t LowPowerListeningConfig.getListenLength() { return 5; } async command uint16_t RandomCollisionConfig.getMinimumBackoff() { return (uint16_t)(320 * RADIO_ALARM_MICROSEC); } async command uint16_t RandomCollisionConfig.getInitialBackoff(message_t* msg) { return (uint16_t)(1600 * RADIO_ALARM_MICROSEC); } async command uint16_t RandomCollisionConfig.getCongestionBackoff(message_t* msg) { return (uint16_t)(3200 * RADIO_ALARM_MICROSEC); } #endif } tinyos-2.1.2+dfsg/tos/chips/cc2420x/CC2420XTimeSyncMessageC.nc000066400000000000000000000054641207233610700233250ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Miklos Maroti, Janos Sallai */ #include configuration CC2420XTimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStampRadio; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC2420XActiveMessageC as ActiveMessageC, new TimeSyncMessageLayerC(); SplitControl = ActiveMessageC; AMPacket = TimeSyncMessageLayerC; Receive = TimeSyncMessageLayerC.Receive; Snoop = TimeSyncMessageLayerC.Snoop; Packet = TimeSyncMessageLayerC; PacketAcknowledgements = ActiveMessageC; LowPowerListening = ActiveMessageC; PacketTimeStampRadio = ActiveMessageC.PacketTimeStampRadio; TimeSyncAMSendRadio = TimeSyncMessageLayerC; TimeSyncPacketRadio = TimeSyncMessageLayerC; PacketTimeStampMilli = ActiveMessageC.PacketTimeStampMilli; TimeSyncAMSendMilli = TimeSyncMessageLayerC; TimeSyncPacketMilli = TimeSyncMessageLayerC; TimeSyncMessageLayerC.PacketTimeStampRadio -> ActiveMessageC.PacketTimeStampRadio; TimeSyncMessageLayerC.PacketTimeStampMilli -> ActiveMessageC.PacketTimeStampMilli; components CC2420XDriverLayerC as DriverLayerC; TimeSyncMessageLayerC.LocalTimeRadio -> DriverLayerC; TimeSyncMessageLayerC.PacketTimeSyncOffset -> DriverLayerC.PacketTimeSyncOffset; } tinyos-2.1.2+dfsg/tos/chips/cc2420x/README.txt000066400000000000000000000005701207233610700204610ustar00rootroot00000000000000CC2420X is an alternative radio stack for the TI CC2420 radio, using the rfxlink library (lib/rfxlink). The stack is IEEE802.15.4 compliant. It does not support hardware acknowledgements or security. All the rfxlink features are supported. See lib/rfxlink/README.txt for details. To use this stack, simply wire against CC2420XActiveMessageC instead of ActiveMessageC. tinyos-2.1.2+dfsg/tos/chips/cc2520/000077500000000000000000000000001207233610700165725ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cc2520/CC2520ActiveMessageC.nc000066400000000000000000000061071207233610700224620ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Author: Janos Sallai, Miklos Maroti * Author: Thomas Schmid (adapted to CC2520) */ #include #ifdef IEEE154FRAMES_ENABLED #error "You cannot use ActiveMessageC with IEEE154FRAMES_ENABLED defined" #endif configuration CC2520ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface SendNotifier[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketField as PacketLinkQuality; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface LocalTime as LocalTimeRadio; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2520RadioC as RadioC; SplitControl = RadioC; AMSend = RadioC; Receive = RadioC.Receive; Snoop = RadioC.Snoop; SendNotifier = RadioC; Packet = RadioC.PacketForActiveMessage; AMPacket = RadioC; PacketAcknowledgements = RadioC; LowPowerListening = RadioC; PacketLink = RadioC; RadioChannel = RadioC; PacketLinkQuality = RadioC.PacketLinkQuality; PacketTransmitPower = RadioC.PacketTransmitPower; PacketRSSI = RadioC.PacketRSSI; LocalTimeRadio = RadioC; PacketTimeStampMilli = RadioC; PacketTimeStampRadio = RadioC; } tinyos-2.1.2+dfsg/tos/chips/cc2520/CC2520DriverConfig.nc000066400000000000000000000051461207233610700222220ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Author: Miklos Maroti * Author: Thomas Schmid (port to CC2520) */ interface CC2520DriverConfig { /** * Returns the length of a dummy header to align the payload properly. */ async command uint8_t headerLength(message_t* msg); /** * Returns the maximum length of the PHY payload including the * length field but not counting the FCF field. */ async command uint8_t maxPayloadLength(); /** * Returns the length of a dummy metadata section to align the * metadata section properly. */ async command uint8_t metadataLength(message_t* msg); /** * Gets the number of bytes we should read before the RadioReceive.header * event is fired. If the length of the packet is less than this amount, * then that event is fired earlier. The header length must be at least one. */ async command uint8_t headerPreloadLength(); /** * Returns TRUE if before sending this message we should make sure that * the channel is clear via a very basic (and quick) RSSI check. */ async command bool requiresRssiCca(message_t* msg); } tinyos-2.1.2+dfsg/tos/chips/cc2520/CC2520DriverLayer.h000066400000000000000000000303751207233610700217220ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ #ifndef __CC2520XDRIVERLAYER_H__ #define __CC2520XDRIVERLAYER_H__ typedef nx_struct cc2520_header_t { nxle_uint8_t length; } cc2520_header_t; typedef struct cc2520_metadata_t { uint8_t lqi; union { uint8_t power; uint8_t ack; uint8_t rssi; }; } cc2520_metadata_t; enum cc2520_reg_access_enums { CC2520_FREG_MASK = 0x3F, // highest address in FREG CC2520_SREG_MASK = 0x7F, // highest address in SREG CC2520_CMD_TXRAM_WRITE = 0x80, // FIXME: not sure... might need to change }; typedef union cc2520_status { uint16_t value; struct { unsigned rx_active :1; unsigned tx_active :1; unsigned dpu_l_active :1; unsigned dpu_h_active :1; unsigned exception_b :1; unsigned exception_a :1; unsigned rssi_valid :1; unsigned xosc_stable :1; }; } cc2520_status_t; typedef union cc2520_frmctrl0 { uint8_t value; struct { unsigned tx_mode : 2; unsigned rx_mode : 2; unsigned energy_scan : 1; unsigned autoack : 1; unsigned autocrc : 1; unsigned append_data_mode : 1; } f; } cc2520_frmctrl0_t; static cc2520_frmctrl0_t cc2520_frmctrl0_default = {.f.autocrc = 1}; typedef union cc2520_txpower { uint8_t value; struct { unsigned pa_power: 8; } f; } cc2520_txpower_t; // Set 0dBm output power static cc2520_txpower_t cc2520_txpower_default = { .f.pa_power = 0x32 }; typedef union cc2520_ccactrl0 { uint8_t value; struct { unsigned cca_thr: 8; } f; } cc2520_ccactrl0_t; // Raises CCA threshold from -108dBm to -8 - 76 = -84dBm //static cc2520_ccactrl0_t cc2520_ccactrl0_default = { .f.cca_thr = 0xF8 }; // FIXME: This might be a problem in the EK devkit. But the threshold has to // be really high! // Raises CCA threshold from -108dBm to 10 - 76dBm static cc2520_ccactrl0_t cc2520_ccactrl0_default = { .f.cca_thr = 0x1A }; typedef union cc2520_mdmctrl0 { uint8_t value; struct { unsigned tx_filter : 1; unsigned preamble_length : 4; unsigned demod_avg_mode : 1; unsigned dem_num_zeros : 2; } f; } cc2520_mdmctrl0_t; // Makes sync word detection less likely by requiring two zero symbols before // the sync word static cc2520_mdmctrl0_t cc2520_mdmctrl0_default = {.f.tx_filter = 1, .f.preamble_length = 2, .f.demod_avg_mode = 0, .f.dem_num_zeros = 2}; typedef union cc2520_mdmctrl1 { uint8_t value; struct { unsigned corr_thr : 5; unsigned corr_thr_sfd : 1; unsigned reserved0 : 2; } f; } cc2520_mdmctrl1_t; // Only one SFD symbol must be above threshold, and raise correlation // threshold static cc2520_mdmctrl1_t cc2520_mdmctrl1_default = {.f.corr_thr = 0x14, .f.corr_thr_sfd = 0}; typedef union cc2520_freqctrl { uint8_t value; struct { unsigned freq : 7; unsigned reserved0 : 1; } f; } cc2520_freqctrl_t; static cc2520_freqctrl_t cc2520_freqctrl_default = {.f.freq = 0x0B }; typedef union cc2520_fifopctrl { uint8_t value; struct { unsigned fifop_thr : 7; unsigned reserved0 : 1; } f; } cc2520_fifopctrl_t; typedef union cc2520_frmfilt0 { uint8_t value; struct { unsigned frame_filter_en : 1; unsigned pan_coordinator : 1; unsigned max_frame_version : 2; unsigned fcf_reserved_mask : 3; unsigned reserved : 1; } f; } cc2520_frmfilt0_t; static cc2520_frmfilt0_t cc2520_frmfilt0_default = {.f.max_frame_version = 2, .f.frame_filter_en = 1}; typedef union cc2520_frmfilt1 { uint8_t value; struct { unsigned reserved0 : 1; unsigned modify_ft_filter : 2; unsigned accept_ft_0_beacon : 1; unsigned accept_ft_1_data : 1; unsigned accept_ft_2_ack : 1; unsigned accept_ft_3_mac_cmd : 1; unsigned accept_ft_4to7_reserved : 1; } f; } cc2520_frmfilt1_t; static cc2520_frmfilt1_t cc2520_frmfilt1_default = {.f.accept_ft_0_beacon = 1, .f.accept_ft_1_data = 1, .f.accept_ft_2_ack = 1, .f.accept_ft_3_mac_cmd = 1}; typedef union cc2520_srcmatch { uint8_t value; struct { unsigned src_match_en : 1; unsigned autopend : 1; unsigned pend_datareq_only : 1; unsigned reserved : 5; } f; } cc2520_srcmatch_t; static cc2520_srcmatch_t cc2520_srcmatch_default = {.f.src_match_en = 1, .f.autopend = 1, .f.pend_datareq_only = 1}; typedef union cc2520_rxctrl { uint8_t value; } cc2520_rxctrl_t; static cc2520_rxctrl_t cc2520_rxctrl_default = {.value = 0x3F}; typedef union cc2520_fsctrl { uint8_t value; } cc2520_fsctrl_t; static cc2520_fsctrl_t cc2520_fsctrl_default = {.value = 0x5A}; typedef union cc2520_fscal1 { uint8_t value; } cc2520_fscal1_t; static cc2520_fscal1_t cc2520_fscal1_default = {.value = 0x2B}; typedef union cc2520_agcctrl1 { uint8_t value; } cc2520_agcctrl1_t; static cc2520_agcctrl1_t cc2520_agcctrl1_default = {.value = 0x11}; typedef union cc2520_adctest0 { uint8_t value; } cc2520_adctest0_t; static cc2520_adctest0_t cc2520_adctest0_default = {.value = 0x10}; typedef union cc2520_adctest1 { uint8_t value; } cc2520_adctest1_t; static cc2520_adctest1_t cc2520_adctest1_default = {.value = 0x0E}; typedef union cc2520_adctest2 { uint8_t value; } cc2520_adctest2_t; static cc2520_adctest2_t cc2520_adctest2_default = {.value = 0x03}; #ifndef CC2520_DEF_CHANNEL #define CC2520_DEF_CHANNEL 25 #endif #ifndef CC2520_DEF_RFPOWER #define CC2520_DEF_RFPOWER 0x32 // 0 dBm #endif enum { CC2520_TX_PWR_MASK = 0xFF, CC2520_TX_PWR_0 = 0x03, // -18 dBm CC2520_TX_PWR_1 = 0x2C, // -7 dBm CC2520_TX_PWR_2 = 0x88, // -4 dBm CC2520_TX_PWR_3 = 0x81, // -2 dBm CC2520_TX_PWR_4 = 0x32, // 0 dBm CC2520_TX_PWR_5 = 0x13, // 1 dBm CC2520_TX_PWR_6 = 0xAB, // 2 dBm CC2520_TX_PWR_7 = 0xF2, // 3 dBm CC2520_TX_PWR_8 = 0xF7, // 5 dBm CC2520_CHANNEL_MASK = 0x1F, }; enum cc2520_register_enums { // FREG Registers CC2520_FRMFILT0 = 0x00, CC2520_FRMFILT1 = 0x01, CC2520_SRCMATCH = 0x02, CC2520_SRCSHORTEN0 = 0x04, CC2520_SRCSHORTEN1 = 0x05, CC2520_SRCSHORTEN2 = 0x06, CC2520_SRCEXTEN0 = 0x08, CC2520_SRCEXTEN1 = 0x09, CC2520_SRCEXTEN2 = 0x0A, CC2520_FRMCTRL0 = 0x0C, CC2520_FRMCTRL1 = 0x0D, CC2520_RXENABLE0 = 0x0E, CC2520_RXENABLE1 = 0x0F, CC2520_EXCFLAG0 = 0x10, CC2520_EXCFLAG1 = 0x11, CC2520_EXCFLAG2 = 0x12, CC2520_EXCMASKA0 = 0x14, CC2520_EXCMASKA1 = 0x15, CC2520_EXCMASKA2 = 0x16, CC2520_EXCMASKB0 = 0x18, CC2520_EXCMASKB1 = 0x19, CC2520_EXCMASKB2 = 0x1A, CC2520_EXCBINDX0 = 0x1C, CC2520_EXCBINDX1 = 0x1D, CC2520_EXCBINDY0 = 0x1E, CC2520_EXCBINDY1 = 0x1F, CC2520_GPIOCTRL0 = 0x20, CC2520_GPIOCTRL1 = 0x21, CC2520_GPIOCTRL2 = 0x22, CC2520_GPIOCTRL3 = 0x23, CC2520_GPIOCTRL4 = 0x24, CC2520_GPIOCTRL5 = 0x25, CC2520_GPIOPOLARITY = 0x26, CC2520_GPIOCTRL = 0x28, CC2520_DPUCON = 0x2A, CC2520_DPUSTAT = 0x2C, CC2520_FREQCTRL = 0x2E, CC2520_FREQTUNE = 0x2F, CC2520_TXPOWER = 0x30, CC2520_TXCTRL = 0x31, CC2520_FSMSTAT0 = 0x32, CC2520_FSMSTAT1 = 0x33, CC2520_FIFOPCTRL = 0x34, CC2520_FSMCTRL = 0x35, CC2520_CCACTRL0 = 0x36, CC2520_CCACTRL1 = 0x37, CC2520_RSSI = 0x38, CC2520_RSSISTAT = 0x39, CC2520_RXFIRST = 0x3C, CC2520_RXFIFOCNT = 0x3E, CC2520_TXFIFOCNT = 0x3F, // SREG registers CC2520_CHIPID = 0x40, CC2520_VERSION = 0x42, CC2520_EXTCLOCK = 0x44, CC2520_MDMCTRL0 = 0x46, CC2520_MDMCTRL1 = 0x47, CC2520_FREQEST = 0x48, CC2520_RXCTRL = 0x4A, CC2520_FSCTRL = 0x4C, CC2520_FSCAL0 = 0x4E, CC2520_FSCAL1 = 0x4F, CC2520_FSCAL2 = 0x50, CC2520_FSCAL3 = 0x51, CC2520_AGCCTRL0 = 0x52, CC2520_AGCCTRL1 = 0x53, CC2520_AGCCTRL2 = 0x54, CC2520_AGCCTRL3 = 0x55, CC2520_ADCTEST0 = 0x56, CC2520_ADCTEST1 = 0x57, CC2520_ADCTEST2 = 0x58, CC2520_MDMTEST0 = 0x5A, CC2520_MDMTEST1 = 0x5B, CC2520_DACTEST0 = 0x5C, CC2520_DACTEST1 = 0x5D, CC2520_ATEST = 0x5E, CC2520_DACTEST2 = 0x5F, CC2520_PTEST0 = 0x60, CC2520_PTEST1 = 0x61, CC2520_RESERVED = 0x62, CC2520_DPUBIST = 0x7A, CC2520_ACTBIST = 0x7C, CC2520_RAMBIST = 0x7E, }; enum cc2520_spi_command_enums { CC2520_CMD_SNOP = 0x00, // CC2520_CMD_IBUFLD = 0x02, // CC2520_CMD_SIBUFEX = 0x03, // CC2520_CMD_SSAMPLECCA = 0x04, // CC2520_CMD_SRES = 0x0f, // CC2520_CMD_MEMORY_MASK = 0x0f, // CC2520_CMD_MEMORY_READ = 0x10, // MEMRD CC2520_CMD_MEMORY_WRITE = 0x20, // MEMWR CC2520_CMD_RXBUF = 0x30, // CC2520_CMD_RXBUFCP = 0x38, // CC2520_CMD_RXBUFMOV = 0x32, // CC2520_CMD_TXBUF = 0x3A, // CC2520_CMD_TXBUFCP = 0x3E, // CC2520_CMD_RANDOM = 0x3C, // CC2520_CMD_SXOSCON = 0x40, // CC2520_CMD_STXCAL = 0x41, // CC2520_CMD_SRXON = 0x42, // CC2520_CMD_STXON = 0x43, // CC2520_CMD_STXONCCA = 0x44, // CC2520_CMD_SRFOFF = 0x45, // CC2520_CMD_SXOSCOFF = 0x46, // CC2520_CMD_SFLUSHRX = 0x47, // CC2520_CMD_SFLUSHTX = 0x48, // CC2520_CMD_SACK = 0x49, // CC2520_CMD_SACKPEND = 0x4A, // CC2520_CMD_SNACK = 0x4B, // CC2520_CMD_SRXMASKBITSET = 0x4C, // CC2520_CMD_SRXMASKBITCLR = 0x4D, // CC2520_CMD_RXMASKAND = 0x4E, // CC2520_CMD_RXMASKOR = 0x4F, // CC2520_CMD_MEMCP = 0x50, // CC2520_CMD_MEMCPR = 0x52, // CC2520_CMD_MEMXCP = 0x54, // CC2520_CMD_MEMXWR = 0x56, // CC2520_CMD_BCLR = 0x58, // CC2520_CMD_BSET = 0x59, // CC2520_CMD_CTR_UCTR = 0x60, // CC2520_CMD_CBCMAC = 0x64, // CC2520_CMD_UCBCMAC = 0x66, // CC2520_CMD_CCM = 0x68, // CC2520_CMD_UCCM = 0x6A, // CC2520_CMD_ECB = 0x70, // CC2520_CMD_ECBO = 0x72, // CC2520_CMD_ECBX = 0x74, // CC2520_CMD_INC = 0x78, // CC2520_CMD_ABORT = 0x7F, // CC2520_CMD_REGISTER_READ = 0x80, // CC2520_CMD_REGISTER_WRITE = 0xC0, // }; #endif // __CC2520XDRIVERLAYER_H__ tinyos-2.1.2+dfsg/tos/chips/cc2520/CC2520DriverLayerC.nc000066400000000000000000000107351207233610700221740ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Author: Janos Sallai, Miklos Maroti * Author: Thomas Schmid (adapted to CC2520) */ #include #include configuration CC2520DriverLayerC { provides { interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; //interface PacketField as AckReceived; interface LocalTime as LocalTimeRadio; interface Alarm; interface PacketAcknowledgements; } uses { interface CC2520DriverConfig as Config; interface PacketTimeStamp; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; interface PacketFlag as AckReceivedFlag; interface RadioAlarm; } } implementation { components CC2520DriverLayerP as DriverLayerP, BusyWaitMicroC, TaskletC, MainC, HplCC2520C as HplC; MainC.SoftwareInit -> DriverLayerP.SoftwareInit; RadioState = DriverLayerP; RadioSend = DriverLayerP; RadioReceive = DriverLayerP; RadioCCA = DriverLayerP; RadioPacket = DriverLayerP; PacketAcknowledgements = DriverLayerP; LocalTimeRadio = HplC; Config = DriverLayerP; DriverLayerP.VREN -> HplC.VREN; DriverLayerP.CSN -> HplC.CSN; DriverLayerP.CCA -> HplC.CCA; DriverLayerP.RSTN -> HplC.RSTN; DriverLayerP.FIFO -> HplC.FIFO; DriverLayerP.FIFOP -> HplC.FIFOP; DriverLayerP.SFD -> HplC.SFD; PacketTransmitPower = DriverLayerP.PacketTransmitPower; DriverLayerP.TransmitPowerFlag = TransmitPowerFlag; PacketRSSI = DriverLayerP.PacketRSSI; DriverLayerP.RSSIFlag = RSSIFlag; PacketTimeSyncOffset = DriverLayerP.PacketTimeSyncOffset; DriverLayerP.TimeSyncFlag = TimeSyncFlag; /* AckReceived = DriverLayerP.AckReceived; components new CC2520MetadataFlagC() as AckFlagC; DriverLayerP.AckFlag -> AckFlagC; */ AckReceivedFlag = DriverLayerP.AckReceivedFlag; PacketLinkQuality = DriverLayerP.PacketLinkQuality; PacketTimeStamp = DriverLayerP.PacketTimeStamp; RadioAlarm = DriverLayerP.RadioAlarm; Alarm = HplC.Alarm; DriverLayerP.SpiResource -> HplC.SpiResource; DriverLayerP.SpiByte -> HplC; DriverLayerP.SfdCapture -> HplC; DriverLayerP.FifopInterrupt -> HplC.FifopInterrupt; DriverLayerP.FifoInterrupt -> HplC.FifoInterrupt; DriverLayerP.Tasklet -> TaskletC; DriverLayerP.BusyWait -> BusyWaitMicroC; DriverLayerP.LocalTime-> HplC.LocalTimeRadio; #ifdef RADIO_DEBUG_MESSAGES components DiagMsgC; DriverLayerP.DiagMsg -> DiagMsgC; #endif components LedsC, NoLedsC; DriverLayerP.Leds -> NoLedsC; #ifdef RADIO_LCD_DEBUG components LcdC; DriverLayerP.Draw -> LcdC; #endif components CC2520SecurityP; DriverLayerP.CC2520Security -> CC2520SecurityP; } tinyos-2.1.2+dfsg/tos/chips/cc2520/CC2520DriverLayerP.nc000066400000000000000000001460231207233610700222110ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Author: Janos Sallai, Miklos Maroti * Author: Thomas Schmid (port to CC2520) * Author: JeongGil Ko (CC2520 modifications and security support) */ #include #include #include #include #include module CC2520DriverLayerP { provides{ interface Init as SoftwareInit @exactlyonce(); interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; //interface PacketField as AckReceived; interface PacketAcknowledgements; } uses{ interface BusyWait; interface LocalTime; interface CC2520DriverConfig as Config; interface Resource as SpiResource; interface SpiByte; interface SpiPacket; interface GeneralIO as CSN; interface GeneralIO as VREN; interface GeneralIO as CCA; interface GeneralIO as RSTN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as SFD; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface GpioInterrupt as FifoInterrupt; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; interface PacketFlag as AckReceivedFlag; interface PacketTimeStamp; interface Tasklet; interface RadioAlarm; #ifdef RADIO_DEBUG_MESSAGES interface DiagMsg; #endif interface Leds; interface Draw; interface CC2520Security; } } implementation{ #define HI_UINT16(val) (((val) >> 8) & 0xFF) #define LO_UINT16(val) ((val) & 0xFF) #define ADDR_DATA 0x200 #define ADDR_NONCE 0x320 #define ADDR_KEY 0x340 #define HIGH_PRIORITY 1 #define LOW_PRIORITY 0 #define NONCE_FLAG_BYTE 0x09 inline void serviceRadio(); inline void downloadMessage(); uint8_t pKey[]= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; uint8_t decNonce[]= { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, }; uint8_t encNonce[]= { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, }; cc2520_header_t* getHeader(message_t* msg) { return ((void*)msg) + call Config.headerLength(msg); } /* * Return a pointer to the data portion of the message. */ void* getPayload(message_t* msg){ return ((void*)msg) + call RadioPacket.headerLength(msg); } cc2520_metadata_t* getMeta(message_t* msg){ return ((void*)msg) + sizeof(message_t) - call RadioPacket.metadataLength(msg); } /*----------------- STATE -----------------*/ enum{ STATE_VR_ON = 0, STATE_PD = 1, STATE_PD_2_IDLE = 2, STATE_IDLE = 3, STATE_IDLE_2_RX_ON = 4, STATE_RX_ON = 5, STATE_BUSY_TX_2_RX_ON = 6, STATE_IDLE_2_TX_ON = 7, STATE_TX_ON = 8, STATE_RX_DOWNLOAD = 9, }; tasklet_norace uint8_t state = STATE_VR_ON; enum{ CMD_NONE = 0, // the state machine has stopped CMD_TURNOFF = 1, // goto SLEEP state CMD_STANDBY = 2, // goto TRX_OFF state CMD_TURNON = 3, // goto RX_ON state CMD_TRANSMIT = 4, // currently transmitting a message CMD_RECEIVE = 5, // currently receiving a message CMD_CCA = 6, // performing clear chanel assesment CMD_CHANNEL = 7, // changing the channel CMD_SIGNAL_DONE = 8, // signal the end of the state transition CMD_DOWNLOAD = 9, // download the received message }; tasklet_norace uint8_t cmd = CMD_NONE; norace bool radioIrq = 0; tasklet_norace uint8_t txPower; tasklet_norace uint8_t channel; tasklet_norace message_t* rxMsg; //#ifdef RADIO_DEBUG_MESSAGES tasklet_norace message_t* txMsg; //#endif message_t rxMsgBuffer; uint32_t capturedTime; // the current time when the last interrupt has occured tasklet_norace uint8_t rssiClear; tasklet_norace uint8_t rssiBusy; norace bool first_packet = TRUE; norace bool sending = FALSE; norace bool receiving = FALSE; norace bool security_processing = FALSE; // used to continue tx after sfd norace uint8_t* txData; norace uint8_t header; norace uint8_t prevdata9, prevdata10; norace uint8_t secMode; norace uint8_t txLength; norace ieee154_simple_header_t* txIeee154header; enum{ // FIXME: need to check these for CC2520 TX_SFD_DELAY = (uint16_t)(0 * RADIO_ALARM_MICROSEC), RX_SFD_DELAY = (uint16_t)(7 * RADIO_ALARM_MICROSEC/2), }; inline cc2520_status_t getStatus(); //inline void sendDoneSignal(error_t error, bool ack); tasklet_async event void RadioAlarm.fired(){ if( state == STATE_PD_2_IDLE ) { state = STATE_IDLE; if( cmd == CMD_STANDBY ) cmd = CMD_SIGNAL_DONE; } else if( state == STATE_IDLE_2_RX_ON ) { state = STATE_RX_ON; // in receive mode, enable SFD capture //call SfdCapture.captureRisingEdge(); //JK cmd = CMD_SIGNAL_DONE; }else{ RADIO_ASSERT(FALSE); } // make sure the rest of the command processing is called call Tasklet.schedule(); } /*----------------- REGISTER -----------------*/ inline cc2520_status_t writeRegister(uint8_t reg, uint8_t value){ cc2520_status_t status; uint8_t v; RADIO_ASSERT( call SpiResource.isOwner() ); call CSN.set(); call CSN.clr(); if( reg <= CC2520_FREG_MASK){ // we can use 1 byte less to write this register using the // register write command RADIO_ASSERT( reg == (reg & CC2520_FREG_MASK) ); status.value = call SpiByte.write(CC2520_CMD_REGISTER_WRITE | reg); } else{ // we have to use the memory write command as the register is in // SREG RADIO_ASSERT( reg == (reg & CC2520_SREG_MASK) ); // the register has to be below the 0x100 memory address. Thus, we // don't have to add anything to the MEMORY_WRITE command. status.value = call SpiByte.write(CC2520_CMD_MEMORY_WRITE); status.value = call SpiByte.write(reg); } // v is the value previously in the register v = call SpiByte.write(value); call CSN.set(); return status; } /* New function by JK -- identical to MEMWR function */ /* This function is to write data to memory spaces above 0x200 */ inline cc2520_status_t writeMemory(uint16_t mem_addr, uint8_t* value, uint8_t count){ cc2520_status_t status; uint8_t v, i; if(mem_addr < 0x200){ mem_addr = 0x200; } RADIO_ASSERT( call SpiResource.isOwner() ); call CSN.set(); call CSN.clr(); status.value = call SpiByte.write(CC2520_CMD_MEMORY_WRITE | HI_UINT16(mem_addr)); status.value = call SpiByte.write(LO_UINT16(mem_addr)); for(i=0;ilength; secMode = call CC2520Security.getSecurityMode(); txIeee154header = (ieee154_simple_header_t*)txData; if(secMode > 0 && (txIeee154header->fcf & (IEEE154_TYPE_DATA << IEEE154_FCF_FRAME_TYPE))){ // Note that the payload starts at txData[9] when 16 bit addressing is used frameCounter = call CC2520Security.getFrameCounter(); frameCounter = 0; memcpy(&encNonce[3], &frameCounter, 4); writeMemory(ADDR_DATA, &txData[11], 2); //JK: Set security related parameters writeMemory(ADDR_KEY, call CC2520Security.getKey(), 16); writeMemory(ADDR_NONCE, encNonce, 16); MEMCP(HIGH_PRIORITY, 16, ADDR_KEY, ADDR_KEY); MEMCP(HIGH_PRIORITY, 16, ADDR_NONCE, ADDR_NONCE); //JK: Send ENC command while(security_processing){} security_processing = TRUE; if(secMode == CTR_MODE){ micLength = 0; CTR(HIGH_PRIORITY, ADDR_KEY/16, txLength - 11 - 2, ADDR_NONCE/16, ADDR_DATA, 0); //11 for txData and 2 for fcs }else if(secMode == CBC_MAC_4){ micLength = 4; CBCMAC(HIGH_PRIORITY, ADDR_KEY/16, txLength - 11 - 2, ADDR_DATA, 0, 1); }else if(secMode == CBC_MAC_8){ micLength = 8; CBCMAC(HIGH_PRIORITY, ADDR_KEY/16, txLength - 11 - 2, ADDR_DATA, 0, 2); }else if(secMode == CBC_MAC_16){ micLength = 16; CBCMAC(HIGH_PRIORITY, ADDR_KEY/16, txLength - 11 - 2, ADDR_DATA, 0, 3); }else if(secMode == CCM_4){ micLength = 4; CCM(HIGH_PRIORITY, ADDR_KEY/16, txLength - 11 - 2, ADDR_NONCE/16, ADDR_DATA, 0, txLength - 11 - 2, 1); }else if(secMode == CCM_8){ micLength = 8; CCM(HIGH_PRIORITY, ADDR_KEY/16, txLength - 11 - 2, ADDR_NONCE/16, ADDR_DATA, 0, txLength - 11 - 2, 2); }else if(secMode == CCM_16){ micLength = 16; CCM(HIGH_PRIORITY, ADDR_KEY/16, txLength - 11 - 2, ADDR_NONCE/16, ADDR_DATA, 0, txLength - 11 - 2, 3); } status = getStatus(); while(status.dpu_h_active) status = getStatus(); readMemory(ADDR_DATA, &txData[11+sizeof(security_header_t)], 2 + micLength); security_processing = FALSE; txData[9+sizeof(security_header_t)] = txData[9]; txData[10+sizeof(security_header_t)] = txData[10]; prevdata9 = txData[9]; prevdata10 = txData[10]; secHdr = (security_header_t*)&txData[9]; // beginning of txData section secHdr->secLevel = secMode; secHdr->keyMode = 1; // Fixed to 1 for now secHdr->reserved = 0; secHdr->frameCounter = frameCounter; secHdr->keyID[0] = 1; // Always first position for now due to fixed keyMode txIeee154header->fcf |= 1 << IEEE154_FCF_SECURITY_ENABLED; txLength += (sizeof(security_header_t) + micLength); } // txLength | txData[0] ... txData[txLength-3] | automatically generated FCS atomic writeTxFifo(&txLength, 1); // FCS is automatically generated txLength -= 2; // preload fcf, dsn, destpan, and dest header = call Config.headerPreloadLength(); if( header > txLength ) header = txLength; txLength -= header; // first upload the header to gain some time atomic writeTxFifo(txData, header); atomic { //call SfdCapture.captureRisingEdge(); strobe(CC2520_CMD_STXON); state = STATE_TX_ON; //*((volatile uint32_t * )0x40010054) |= (1 << 16); call SfdCapture.captureRisingEdge(); } //#ifdef RADIO_DEBUG_MESSAGES txMsg = msg; //#endif // wait for SFD rising edge. return SUCCESS; } inline void continueTx() { void* timesync; uint32_t time32; cc2520_status_t status; /***************************************** * FIXME: We have to check for underrun here! *****************************************/ // prepare for end of TX on falling SFD timesync = call PacketTimeSyncOffset.isSet(txMsg) ? ((void*)txMsg) + call PacketTimeSyncOffset.get(txMsg) : 0; time32 = capturedTime; if( timesync != 0 ) *(timesync_relative_t*)timesync = (*(timesync_absolute_t*)timesync) - time32; // write the rest of the payload to the fifo atomic writeTxFifo(txData+header, txLength); call SfdCapture.captureFallingEdge(); if(secMode > 0){ txData[9] = prevdata9; txData[10] = prevdata10; } // get status status = getStatus(); RADIO_ASSERT ( status.tx_active == 1); // FIXME: have to check for underflow exception! //RADIO_ASSERT ( status.tx_underflow == 0); RADIO_ASSERT ( status.xosc_stable == 1); if( timesync != 0 ) *(timesync_absolute_t*)timesync = (*(timesync_relative_t*)timesync) + time32; call PacketTimeStamp.set(txMsg, time32); #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ){ uint16_t t = call RadioAlarm.getNow(); txLength = getHeader(txMsg)->length; call DiagMsg.chr('t'); call DiagMsg.uint16(time32); call DiagMsg.uint16(t); call DiagMsg.uint16(t-time32); call DiagMsg.uint32(call PacketTimeStamp.isValid(txMsg) ? call PacketTimeStamp.timestamp(txMsg) : 0); call DiagMsg.int8(txLength); call DiagMsg.hex8s(getPayload(txMsg), txLength - 2); if(txLength - 2 > 15) { call DiagMsg.hex8s(&(((uint8_t *)getPayload(txMsg))[15]), txLength - 2 - 15); } if(txIeee154header->fcf & (1 << IEEE154_FCF_ACK_REQ)){ call DiagMsg.str("w/ ack"); } call DiagMsg.send(); } #endif // wait for SFD falling edge state = STATE_BUSY_TX_2_RX_ON; cmd = CMD_TRANSMIT; //call SpiResource.release(); atomic sending = TRUE; } default tasklet_async event void RadioSend.sendDone(error_t error) { } default tasklet_async event void RadioSend.ready() { } /*----------------- CCA -----------------*/ tasklet_async command error_t RadioCCA.request(){ if( cmd != CMD_NONE || state != STATE_RX_ON ) return EBUSY; if(call CCA.get()) { signal RadioCCA.done(SUCCESS); } else { signal RadioCCA.done(EBUSY); } return SUCCESS; } default tasklet_async event void RadioCCA.done(error_t error) { } /*----------------- RECEIVE -----------------*/ // recover from an error // rx fifo flush does not always work inline void recover() { cc2520_status_t status; // reset the radio, initialize registers to default values RADIO_ASSERT(0); resetRadio(); //call SfdCapture.disable(); RADIO_ASSERT(state == STATE_PD); // start oscillator strobe(CC2520_CMD_SXOSCON); // going idle in PD_2_IDLE_TIME state = STATE_PD_2_IDLE; call BusyWait.wait(PD_2_IDLE_TIME); // .86ms OSC startup time // get status status = getStatus(); RADIO_ASSERT ( status.rssi_valid == 0); //RADIO_ASSERT ( status.lock == 0); RADIO_ASSERT ( status.tx_active == 0); //RADIO_ASSERT ( status.enc_busy == 0); //RADIO_ASSERT ( status.tx_underflow == 0); RADIO_ASSERT ( status.xosc_stable == 1); // we're idle now state = STATE_IDLE; // download current channel to the radio setChannel(); // start receiving strobe(CC2520_CMD_SRXON); state = STATE_IDLE_2_RX_ON; //call SfdCapture.captureRisingEdge(); // JK // we will be able to receive packets in 12 symbol periods state = STATE_RX_ON; } inline void recover_err() { cc2520_status_t status; // reset the radio, initialize registers to default values RADIO_ASSERT(0); resetRadio(); // start oscillator strobe(CC2520_CMD_SXOSCON); // going idle in PD_2_IDLE_TIME state = STATE_PD_2_IDLE; //call BusyWait.wait(PD_2_IDLE_TIME); // .86ms OSC startup time // get status status = getStatus(); RADIO_ASSERT ( status.rssi_valid == 0); //RADIO_ASSERT ( status.lock == 0); RADIO_ASSERT ( status.tx_active == 0); //RADIO_ASSERT ( status.enc_busy == 0); //RADIO_ASSERT ( status.tx_underflow == 0); RADIO_ASSERT ( status.xosc_stable == 1); // we're idle now state = STATE_IDLE; // download current channel to the radio setChannel(); // start receiving strobe(CC2520_CMD_SRXON); state = STATE_IDLE_2_RX_ON; //call SfdCapture.captureRisingEdge(); // JK // we will be able to receive packets in 12 symbol periods state = STATE_RX_ON; } inline void endRx(){ receiving = FALSE; } inline void downloadMessage(){ // receiving message to buffer! uint8_t length, micLength; uint16_t crc = 1; uint8_t* data; uint8_t rssi; uint8_t crc_ok_lqi; uint32_t sfdTime, decLimit; cc2520_status_t status; security_header_t* secHdr; ieee154_simple_header_t* ieee154header; //call Draw.fill(COLOR_WHITE); //state = STATE_RX_DOWNLOAD; isSpiAcquired(); atomic sfdTime = capturedTime; // data starts after the length field data = getPayload(rxMsg); // read the length byte readLengthFromRxFifo(&length); #ifdef RADIO_DEBUG_MESSAGES_____ if( call DiagMsg.record() ){ call DiagMsg.str("rx"); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.uint16(sfdTime); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.int8(length); call DiagMsg.hex8s(getPayload(rxMsg), length - 2); call DiagMsg.send(); } #endif // check for too short lengths if (length == 0) { #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ){ call DiagMsg.str("rx 0 length"); call DiagMsg.send(); } #endif if(!first_packet){ atomic recover_err(); atomic flushRxFifo(); } atomic first_packet = FALSE; call CSN.set(); RADIO_ASSERT( call FIFOP.get() == 0 ); RADIO_ASSERT( call FIFO.get() == 0 ); call SpiResource.release(); call CSN.set(); endRx(); return; } if (length == 1) { // skip payload and rssi atomic readCrcOkAndLqiFromRxFifo(&crc_ok_lqi); RADIO_ASSERT( call FIFOP.get() == 0 ); RADIO_ASSERT( call FIFO.get() == 0 ); call SpiResource.release(); call CSN.set(); endRx(); return; } if (length == 2) { // skip payload atomic readRssiFromRxFifo(&rssi); atomic readCrcOkAndLqiFromRxFifo(&crc_ok_lqi); RADIO_ASSERT( call FIFOP.get() == 0 ); RADIO_ASSERT( call FIFO.get() == 0 ); call SpiResource.release(); call CSN.set(); endRx(); return; } // check for too long lengths if( length > 127 ) { #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ){ call DiagMsg.str("rx > 127"); call DiagMsg.send(); } #endif atomic recover_err(); atomic flushRxFifo(); // JK RADIO_ASSERT( call FIFOP.get() == 0 ); RADIO_ASSERT( call FIFO.get() == 0 ); call SpiResource.release(); call CSN.set(); endRx(); return; } if( length > call RadioPacket.maxPayloadLength() + 2 ){ while( length-- > 2 ) { atomic readPayloadFromRxFifo(data, 1); } atomic readRssiFromRxFifo(&rssi); atomic readCrcOkAndLqiFromRxFifo(&crc_ok_lqi); #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ){ call DiagMsg.str("rx too long"); call DiagMsg.send(); } #endif atomic recover_err(); atomic flushRxFifo(); RADIO_ASSERT( call FIFOP.get() == 0 ); call SpiResource.release(); call CSN.set(); endRx(); return; } // if we're here, length must be correct RADIO_ASSERT(length >= 3 && length <= call RadioPacket.maxPayloadLength() + 2); getHeader(rxMsg)->length = length; // we'll read the FCS/CRC separately length -= 2; // download the whole payload readPayloadFromRxFifo(data, length); // the last two bytes are not the fsc, but RSSI(8), CRC_ON(1)+LQI(7) readRssiFromRxFifo(&rssi); readCrcOkAndLqiFromRxFifo(&crc_ok_lqi); ieee154header = (ieee154_simple_header_t*)data; // TODO: actually, we can signal that a message was received, without // timestamp set if (call FIFOP.get() == 1 || call FIFO.get() == 1) { #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ){ call DiagMsg.str("FIFO or FIFOP = 1"); call DiagMsg.send(); } #endif atomic recover_err(); atomic flushRxFifo(); call SpiResource.release(); call CSN.set(); endRx(); return; } if( signal RadioReceive.header(rxMsg) ){ // set RSSI, CRC and LQI only if we're accepting the message call PacketRSSI.set(rxMsg, rssi); call PacketLinkQuality.set(rxMsg, crc_ok_lqi & 0x7f); crc = (crc_ok_lqi > 0x7f) ? 0 : 1; } if(length == 3 || ieee154header->fcf & (2 << IEEE154_FCF_FRAME_TYPE) ){ //call Leds.led2Toggle(); call SpiResource.release(); call CSN.set(); rxMsg = signal RadioReceive.receive(rxMsg); endRx(); return; } // signal only if it has passed the CRC check if( crc == 0){ call PacketTimeStamp.set(rxMsg, sfdTime); #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ){ uint16_t t = call RadioAlarm.getNow(); call DiagMsg.chr('r'); //call DiagMsg.uint16(call RadioAlarm.getNow() - (uint16_t)call PacketTimeStamp.timestamp(rxMsg) ); call DiagMsg.uint16(sfdTime); call DiagMsg.uint16(t); call DiagMsg.uint16(t-sfdTime); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.int8(length); call DiagMsg.hex8s(getPayload(rxMsg), length); if(length > 15) { call DiagMsg.hex8s(&(((uint8_t*)getPayload(rxMsg))[15]), length - 15); } call DiagMsg.send(); } #endif // check fcf for security bit in data packets if((ieee154header->fcf & (1 << IEEE154_FCF_SECURITY_ENABLED)) && (ieee154header->fcf & (IEEE154_TYPE_DATA << IEEE154_FCF_FRAME_TYPE)) ){ secHdr = (security_header_t*)&data[9]; memcpy(&decNonce[3], &(secHdr->frameCounter), 4); // readout nonce from tinyos 15.4 security header writeMemory(ADDR_KEY, call CC2520Security.getKey(), 16); writeMemory(ADDR_NONCE, decNonce, 16); MEMCP(HIGH_PRIORITY, 16, ADDR_KEY, ADDR_KEY); MEMCP(HIGH_PRIORITY, 16, ADDR_NONCE, ADDR_NONCE); // reverse twice since CC2420 uses the correct ordered nonce // TODO: add proper operation for each case atomic security_processing = TRUE; // perform security options. if (secHdr->secLevel == NO_SEC){ micLength = 0; }else if (secHdr->secLevel == CBC_MAC_4){ micLength = 4; }else if (secHdr->secLevel == CBC_MAC_8){ micLength = 8; }else if (secHdr->secLevel == CBC_MAC_16){ micLength = 16; }else if (secHdr->secLevel == CTR_MODE){ writeMemory(ADDR_DATA, &data[11+sizeof(security_header_t)], length - sizeof(security_header_t) - 11); CTR(HIGH_PRIORITY, ADDR_KEY/16, length - sizeof(security_header_t) - 11, ADDR_NONCE/16, ADDR_DATA, 0); //mode = CC2420_CTR; micLength = 0; }else if (secHdr->secLevel == CCM_4){ micLength = 4; }else if (secHdr->secLevel == CCM_8){ micLength = 8; }else if (secHdr->secLevel == CCM_16){ micLength = 16; }else{ // invalid security micLength = 0; } // Wait for security done interrupt (pp. 49) status = getStatus(); decLimit = 0; while(status.dpu_h_active && decLimit++ < 0xFFFF) status = getStatus(); call Leds.led0Toggle(); // copy data from the memory to msg buffer and delete security header data[9] = data[9+sizeof(security_header_t)]; data[10] = data[10+sizeof(security_header_t)]; readMemory(ADDR_DATA, &data[11], length - 11 - sizeof(security_header_t)); atomic security_processing = FALSE; length = length - micLength - sizeof(security_header_t); // TODO: not working out too well // TODO: If I do this do I lose the RSSI pointers? //readMemory(ADDR_DATA, &data[11+sizeof(security_header_t)], length - 11 - sizeof(security_header_t)); //length -= micLength; //memcpy(&data[9], &data[9+sizeof(security_header_t)], 2 + (length - 11 - sizeof(security_header_t))); //length -= micLength - sizeof(security_header_t); // modify length w.r.t. mic length } call SpiResource.release(); call CSN.set(); call Leds.led1Toggle(); rxMsg = signal RadioReceive.receive(rxMsg); endRx(); // ready to receive new message: enable SFD interrupts //call SfdCapture.captureRisingEdge(); // JK }else{ call SpiResource.release(); call CSN.set(); //state = STATE_RX_ON; //cmd = CMD_NONE; //call Draw.drawInt(80,140,5,1,COLOR_BLUE); endRx(); // ready to receive new message: enable SFD interrupts //call SfdCapture.captureRisingEdge();// JK } } /*----------------- IRQ -----------------*/ // SFD (rising edge) for timestamps in RX & TX, falling for TX end async event void SfdCapture.captured( uint16_t time ) { //call SfdCapture.disable(); // if canceling the above takes care of the stopping issue, then //the state machine is getting stck at some point inthe disable //state RADIO_ASSERT( ! radioIrq ); RADIO_ASSERT( state == STATE_RX_ON || state == STATE_TX_ON || state == STATE_BUSY_TX_2_RX_ON ); #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ){ call DiagMsg.str("SFD"); call DiagMsg.uint16(time); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.str("s="); call DiagMsg.uint8(state); if(call FIFO.get()) call DiagMsg.str("FIFO"); if(call FIFOP.get()) call DiagMsg.str("FIFOP"); if(call SFD.get()) call DiagMsg.str("SFD"); call DiagMsg.send(); } #endif if(call SFD.get()) { atomic { // rising edge, safe time and mutex to 0 capturedTime = call LocalTime.get(); // FIXME: there is a small chance that between the SFD and read of // LocalTime, the timer overflowed. This wil incurr an error of 65436. // We have to check for this overflow! But how? if(state == STATE_TX_ON) { if((uint16_t)(time + TX_SFD_DELAY) > (uint16_t)(capturedTime)) // we had an overflow between SFD capture and read of LocalTime capturedTime -= 1<<16; capturedTime += (uint16_t)(time + TX_SFD_DELAY) - (uint16_t)(capturedTime); } else { if((uint16_t)(time - RX_SFD_DELAY) > (uint16_t)(capturedTime)) // we had an overflow between SFD capture and read of LocalTime capturedTime -= 1<<16; capturedTime += (uint16_t)(time - RX_SFD_DELAY) - (uint16_t)(capturedTime); } } } radioIrq = TRUE; call Tasklet.schedule(); } async event void FifoInterrupt.fired(){ } // FIFOP interrupt, last byte received async event void FifopInterrupt.fired(){ if(receiving == FALSE){ atomic receiving = TRUE; downloadMessage(); } } inline void serviceRadio(){ atomic if( isSpiAcquired() ){ radioIrq = FALSE; switch(state) { case STATE_TX_ON: continueTx(); break; case STATE_BUSY_TX_2_RX_ON: state = STATE_RX_ON; cmd = CMD_NONE; if(sending){ atomic sending = FALSE; call SfdCapture.captureRisingEdge(); // JK release this to enable rx side sfd. // do not signal success if the packet requested for an ack // In this case call a timer instead and signal success once the timer expires or an ack is received call Leds.led2Toggle(); #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ){ call DiagMsg.str("RadioSend.sendDone"); call DiagMsg.send(); } #endif signal RadioSend.sendDone(SUCCESS); } default: RADIO_ASSERT(1); } } } default tasklet_async event bool RadioReceive.header(message_t* msg){ return TRUE; } default tasklet_async event message_t* RadioReceive.receive(message_t* msg){ return msg; } /*----------------- TASKLET -----------------*/ tasklet_async event void Tasklet.run(){ if( radioIrq ){ serviceRadio(); } if( cmd != CMD_NONE ){ if( cmd == CMD_DOWNLOAD && state == STATE_RX_ON){ // receive state //downloadMessage(); } else if( CMD_TURNOFF <= cmd && cmd <= CMD_TURNON ) changeState(); else if( cmd == CMD_CHANNEL ) changeChannel(); if( cmd == CMD_SIGNAL_DONE ){ cmd = CMD_NONE; signal RadioState.done(); } } if( cmd == CMD_NONE && state == STATE_RX_ON && ! radioIrq ) signal RadioSend.ready(); if( cmd == CMD_NONE ) call SpiResource.release(); } /*----------------- RadioPacket -----------------*/ async command uint8_t RadioPacket.headerLength(message_t* msg){ return call Config.headerLength(msg) + sizeof(cc2520_header_t); } async command uint8_t RadioPacket.payloadLength(message_t* msg){ return getHeader(msg)->length - 2; } async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length){ RADIO_ASSERT( 1 <= length && length <= 125 ); RADIO_ASSERT( call RadioPacket.headerLength(msg) + length + call RadioPacket.metadataLength(msg) <= sizeof(message_t) ); // we add the length of the CRC, which is automatically generated getHeader(msg)->length = length + 2; } async command uint8_t RadioPacket.maxPayloadLength(){ RADIO_ASSERT( call Config.maxPayloadLength() - sizeof(cc2520_header_t) <= 125 ); return call Config.maxPayloadLength() - sizeof(cc2520_header_t); } async command uint8_t RadioPacket.metadataLength(message_t* msg){ return call Config.metadataLength(msg) + sizeof(cc2520_metadata_t); } async command void RadioPacket.clear(message_t* msg){ // all flags are automatically cleared } /*----------------- PacketTransmitPower -----------------*/ async command bool PacketTransmitPower.isSet(message_t* msg){ return call TransmitPowerFlag.get(msg); } async command uint8_t PacketTransmitPower.get(message_t* msg){ return getMeta(msg)->power; } async command void PacketTransmitPower.clear(message_t* msg){ call TransmitPowerFlag.clear(msg); } async command void PacketTransmitPower.set(message_t* msg, uint8_t value){ call TransmitPowerFlag.set(msg); getMeta(msg)->power = value; } /*----------------- PacketRSSI -----------------*/ async command bool PacketRSSI.isSet(message_t* msg) { return call RSSIFlag.get(msg); } async command uint8_t PacketRSSI.get(message_t* msg) { return getMeta(msg)->rssi; } async command void PacketRSSI.clear(message_t* msg) { call RSSIFlag.clear(msg); } async command void PacketRSSI.set(message_t* msg, uint8_t value) { // just to be safe if the user fails to clear the packet call TransmitPowerFlag.clear(msg); call RSSIFlag.set(msg); getMeta(msg)->rssi = value; } /*----------------- PacketTimeSyncOffset -----------------*/ async command bool PacketTimeSyncOffset.isSet(message_t* msg) { return call TimeSyncFlag.get(msg); } async command uint8_t PacketTimeSyncOffset.get(message_t* msg) { return call RadioPacket.headerLength(msg) + call RadioPacket.payloadLength(msg) - sizeof(timesync_absolute_t); } async command void PacketTimeSyncOffset.clear(message_t* msg) { call TimeSyncFlag.clear(msg); } async command void PacketTimeSyncOffset.set(message_t* msg, uint8_t value) { // we do not store the value, the time sync field is always the last 4 bytes RADIO_ASSERT( call PacketTimeSyncOffset.get(msg) == value ); call TimeSyncFlag.set(msg); } /*----------------- PacketLinkQuality -----------------*/ async command bool PacketLinkQuality.isSet(message_t* msg) { return TRUE; } async command uint8_t PacketLinkQuality.get(message_t* msg) { return getMeta(msg)->lqi; } async command void PacketLinkQuality.clear(message_t* msg) { } async command void PacketLinkQuality.set(message_t* msg, uint8_t value) { getMeta(msg)->lqi = value; } ieee154_simple_header_t* getIeeeHeader(message_t* msg) { return (ieee154_simple_header_t*) (void*)msg;//getHeader(msg);//((void*)msg) + call SubPacket.headerLength(msg); } async command error_t PacketAcknowledgements.requestAck(message_t* msg) { //call SoftwareAckConfig.setAckRequired(msg, TRUE); getIeeeHeader(msg)->fcf |= (1 << IEEE154_FCF_ACK_REQ); return SUCCESS; } async command error_t PacketAcknowledgements.noAck(message_t* msg) { getIeeeHeader(msg)->fcf &= ~(uint16_t)(1 << IEEE154_FCF_ACK_REQ); return SUCCESS; } async command bool PacketAcknowledgements.wasAcked(message_t* msg) { #ifdef CC2520_HARDWARE_ACK return call AckReceivedFlag.get(msg); #else RADIO_ASSERT(1); return FALSE; #endif } } tinyos-2.1.2+dfsg/tos/chips/cc2520/CC2520Radio.h000066400000000000000000000062171207233610700205260ustar00rootroot00000000000000 /* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Author: Janos Sallai * Author: Thomas Schmid (adapted to CC2520) * Author: JeongGil Ko (Security Header Added) */ #ifndef __CC2520RADIO_H__ #define __CC2520RADIO_H__ #include #include #include #include #include #include #include #include #include /** * CC2520 Security Header */ typedef nx_struct security_header_t { nx_uint8_t secLevel:3; nx_uint8_t keyMode:2; nx_uint8_t reserved:3; nx_uint32_t frameCounter; nx_uint8_t keyID[1]; // One byte for now } security_header_t; typedef nx_struct cc2520packet_header_t { cc2520_header_t cc2520; ieee154_simple_header_t ieee154; #ifdef CC2520_HW_SECURITY security_header_t secHdr; #endif #ifndef TFRAMES_ENABLED network_header_t network; #endif #ifndef IEEE154FRAMES_ENABLED activemessage_header_t am; #endif } cc2520packet_header_t; typedef nx_struct cc2520packet_footer_t { // the time stamp is not recorded here, time stamped messaged cannot have max length } cc2520packet_footer_t; typedef struct cc2520packet_metadata_t { #ifdef LOW_POWER_LISTENING lpl_metadata_t lpl; #endif #ifdef PACKET_LINK link_metadata_t link; #endif timestamp_metadata_t timestamp; flags_metadata_t flags; cc2520_metadata_t cc2520; } cc2520packet_metadata_t; enum cc2520_security_enums{ NO_SEC = 0, CBC_MAC_4 = 1, CBC_MAC_8 = 2, CBC_MAC_16 = 3, CTR_MODE = 4, CCM_4 = 5, CCM_8 = 6, CCM_16 = 7 }; #endif//__CC2520RADIO_H__ tinyos-2.1.2+dfsg/tos/chips/cc2520/CC2520RadioC.nc000066400000000000000000000243711207233610700210030ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Author: Miklos Maroti, Janos Sallai * Author: Thomas Schmid (adapted to CC2520) */ #include configuration CC2520RadioC { provides { interface SplitControl; #ifndef IEEE154FRAMES_ENABLED interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface SendNotifier[am_id_t id]; // for TOSThreads interface Receive as ReceiveDefault[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface AMPacket; interface Packet as PacketForActiveMessage; #endif #ifndef TFRAMES_ENABLED interface Ieee154Send; interface Receive as Ieee154Receive; interface SendNotifier as Ieee154Notifier; interface Resource as SendResource[uint8_t clint]; interface Ieee154Packet; interface Packet as PacketForIeee154Message; #endif interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; #ifdef TRAFFIC_MONITOR interface TrafficMonitor; #endif interface RadioChannel; interface PacketField as PacketLinkQuality; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface LocalTime as LocalTimeRadio; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { #define UQ_METADATA_FLAGS "UQ_CC2520_METADATA_FLAGS" #define UQ_RADIO_ALARM "UQ_CC2520_RADIO_ALARM" // -------- RadioP components CC2520RadioP as RadioP; #ifdef RADIO_DEBUG components AssertC; #endif RadioP.Ieee154PacketLayer -> Ieee154PacketLayerC; RadioP.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; RadioP.PacketTimeStamp -> TimeStampingLayerC; RadioP.CC2520Packet -> RadioDriverLayerC; // -------- RadioAlarm components new RadioAlarmC(); RadioAlarmC.Alarm -> RadioDriverLayerC; // -------- Active Message #ifndef IEEE154FRAMES_ENABLED components new ActiveMessageLayerC(); ActiveMessageLayerC.Config -> RadioP; ActiveMessageLayerC.SubSend -> AutoResourceAcquireLayerC; ActiveMessageLayerC.SubReceive -> TinyosNetworkLayerC.TinyosReceive; ActiveMessageLayerC.SubPacket -> TinyosNetworkLayerC.TinyosPacket; AMSend = ActiveMessageLayerC; Receive = ActiveMessageLayerC.Receive; Snoop = ActiveMessageLayerC.Snoop; SendNotifier = ActiveMessageLayerC; AMPacket = ActiveMessageLayerC; PacketForActiveMessage = ActiveMessageLayerC; ReceiveDefault = ActiveMessageLayerC.ReceiveDefault; SnoopDefault = ActiveMessageLayerC.SnoopDefault; #endif // -------- Automatic RadioSend Resource #ifndef IEEE154FRAMES_ENABLED #ifndef TFRAMES_ENABLED components new AutoResourceAcquireLayerC(); AutoResourceAcquireLayerC.Resource -> SendResourceC.Resource[unique(RADIO_SEND_RESOURCE)]; #else components new DummyLayerC() as AutoResourceAcquireLayerC; #endif AutoResourceAcquireLayerC -> TinyosNetworkLayerC.TinyosSend; #endif // -------- RadioSend Resource #ifndef TFRAMES_ENABLED components new SimpleFcfsArbiterC(RADIO_SEND_RESOURCE) as SendResourceC; SendResource = SendResourceC; // -------- Ieee154 Message components new Ieee154MessageLayerC(); Ieee154MessageLayerC.Ieee154PacketLayer -> Ieee154PacketLayerC; Ieee154MessageLayerC.SubSend -> TinyosNetworkLayerC.Ieee154Send; Ieee154MessageLayerC.SubReceive -> TinyosNetworkLayerC.Ieee154Receive; Ieee154MessageLayerC.RadioPacket -> TinyosNetworkLayerC.Ieee154Packet; Ieee154Send = Ieee154MessageLayerC; Ieee154Receive = Ieee154MessageLayerC; Ieee154Notifier = Ieee154MessageLayerC; Ieee154Packet = Ieee154PacketLayerC; PacketForIeee154Message = Ieee154MessageLayerC; #endif // -------- Tinyos Network components new TinyosNetworkLayerC(); TinyosNetworkLayerC.SubSend -> UniqueLayerC; TinyosNetworkLayerC.SubReceive -> PacketLinkLayerC; TinyosNetworkLayerC.SubPacket -> Ieee154PacketLayerC; // -------- IEEE 802.15.4 Packet components new Ieee154PacketLayerC(); Ieee154PacketLayerC.SubPacket -> PacketLinkLayerC; // -------- UniqueLayer Send part (wired twice) components new UniqueLayerC(); UniqueLayerC.Config -> RadioP; UniqueLayerC.SubSend -> PacketLinkLayerC; // -------- Packet Link components new PacketLinkLayerC(); PacketLink = PacketLinkLayerC; #ifdef CC2520_HARDWARE_ACK PacketLinkLayerC.PacketAcknowledgements -> RadioDriverLayerC; #else PacketLinkLayerC.PacketAcknowledgements -> SoftwareAckLayerC; #endif PacketLinkLayerC -> LowPowerListeningLayerC.Send; PacketLinkLayerC -> LowPowerListeningLayerC.Receive; PacketLinkLayerC -> LowPowerListeningLayerC.RadioPacket; // -------- Low Power Listening #ifdef LOW_POWER_LISTENING #warning "*** USING LOW POWER LISTENING LAYER" components new LowPowerListeningLayerC(); LowPowerListeningLayerC.Config -> RadioP; #ifdef CC2520_HARDWARE_ACK LowPowerListeningLayerC.PacketAcknowledgements -> RadioDriverLayerC; #else LowPowerListeningLayerC.PacketAcknowledgements -> SoftwareAckLayerC; #endif #else components new LowPowerListeningDummyC() as LowPowerListeningLayerC; #endif LowPowerListeningLayerC.SubControl -> MessageBufferLayerC; LowPowerListeningLayerC.SubSend -> MessageBufferLayerC; LowPowerListeningLayerC.SubReceive -> MessageBufferLayerC; LowPowerListeningLayerC.SubPacket -> TimeStampingLayerC; SplitControl = LowPowerListeningLayerC; LowPowerListening = LowPowerListeningLayerC; // -------- MessageBuffer components new MessageBufferLayerC(); MessageBufferLayerC.RadioSend -> CollisionAvoidanceLayerC; MessageBufferLayerC.RadioReceive -> UniqueLayerC; MessageBufferLayerC.RadioState -> TrafficMonitorLayerC; RadioChannel = MessageBufferLayerC; // -------- UniqueLayer receive part (wired twice) UniqueLayerC.SubReceive -> CollisionAvoidanceLayerC; // -------- CollisionAvoidance #ifdef SLOTTED_MAC components new SlottedCollisionLayerC() as CollisionAvoidanceLayerC; #else components new RandomCollisionLayerC() as CollisionAvoidanceLayerC; #endif CollisionAvoidanceLayerC.Config -> RadioP; CollisionAvoidanceLayerC.SubSend -> SoftwareAckLayerC; CollisionAvoidanceLayerC.SubReceive -> SoftwareAckLayerC; CollisionAvoidanceLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; // -------- SoftwareAcknowledgement #ifndef CC2520_HARDWARE_ACK components new SoftwareAckLayerC(); SoftwareAckLayerC.AckReceivedFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; SoftwareAckLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; PacketAcknowledgements = SoftwareAckLayerC; #else components new DummyLayerC() as SoftwareAckLayerC; #endif SoftwareAckLayerC.Config -> RadioP; SoftwareAckLayerC.SubSend -> CsmaLayerC; SoftwareAckLayerC.SubReceive -> CsmaLayerC; // -------- Carrier Sense components new DummyLayerC() as CsmaLayerC; CsmaLayerC.Config -> RadioP; CsmaLayerC -> TrafficMonitorLayerC.RadioSend; CsmaLayerC -> TrafficMonitorLayerC.RadioReceive; CsmaLayerC -> RadioDriverLayerC.RadioCCA; // -------- TimeStamping components new TimeStampingLayerC(); TimeStampingLayerC.LocalTimeRadio -> RadioDriverLayerC; TimeStampingLayerC.SubPacket -> MetadataFlagsLayerC; PacketTimeStampRadio = TimeStampingLayerC; PacketTimeStampMilli = TimeStampingLayerC; TimeStampingLayerC.TimeStampFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; // -------- MetadataFlags components new MetadataFlagsLayerC(); MetadataFlagsLayerC.SubPacket -> RadioDriverLayerC; // -------- Traffic Monitor #ifdef TRAFFIC_MONITOR components new TrafficMonitorLayerC(); TrafficMonitor = TrafficMonitorLayerC; #else components new DummyLayerC() as TrafficMonitorLayerC; #endif TrafficMonitorLayerC.Config -> RadioP; TrafficMonitorLayerC -> RadioDriverLayerC.RadioSend; TrafficMonitorLayerC -> RadioDriverLayerC.RadioReceive; TrafficMonitorLayerC -> RadioDriverLayerC.RadioState; // -------- Driver #ifdef CC2520_HARDWARE_ACK components CC2520DriverLayerC as RadioDriverLayerC; PacketAcknowledgements = RadioDriverLayerC; RadioDriverLayerC.Ieee154PacketLayer -> Ieee154PacketLayerC; RadioDriverLayerC.AckReceivedFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; #else components CC2520DriverLayerC as RadioDriverLayerC; #endif RadioDriverLayerC.Config -> RadioP; RadioDriverLayerC.PacketTimeStamp -> TimeStampingLayerC; PacketTransmitPower = RadioDriverLayerC.PacketTransmitPower; PacketLinkQuality = RadioDriverLayerC.PacketLinkQuality; PacketRSSI = RadioDriverLayerC.PacketRSSI; LocalTimeRadio = RadioDriverLayerC; RadioDriverLayerC.TransmitPowerFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.RSSIFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.TimeSyncFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; } tinyos-2.1.2+dfsg/tos/chips/cc2520/CC2520RadioP.nc000066400000000000000000000227431207233610700210210ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Author: Miklos Maroti, Janos Sallai * Author: Thomas Schmid (adapted to CC2520) */ #include #include #include module CC2520RadioP { provides { interface CC2520DriverConfig; interface SoftwareAckConfig; interface UniqueConfig; interface CsmaConfig; interface TrafficMonitorConfig; interface RandomCollisionConfig; interface SlottedCollisionConfig; interface ActiveMessageConfig; interface DummyConfig; #ifdef LOW_POWER_LISTENING interface LowPowerListeningConfig; #endif } uses { interface Ieee154PacketLayer; interface RadioAlarm; interface RadioPacket as CC2520Packet; interface PacketTimeStamp; } } implementation { /*----------------- CC2520DriverConfig -----------------*/ async command uint8_t CC2520DriverConfig.headerLength(message_t* msg) { return offsetof(message_t, data) - sizeof(cc2520packet_header_t); } async command uint8_t CC2520DriverConfig.maxPayloadLength() { return sizeof(cc2520packet_header_t) + TOSH_DATA_LENGTH; } async command uint8_t CC2520DriverConfig.metadataLength(message_t* msg) { return 0; } async command uint8_t CC2520DriverConfig.headerPreloadLength() { // we need the fcf, dsn, destpan, and dest return 7; } async command bool CC2520DriverConfig.requiresRssiCca(message_t* msg) { return call Ieee154PacketLayer.isDataFrame(msg); } /*----------------- SoftwareAckConfig -----------------*/ async command bool SoftwareAckConfig.requiresAckWait(message_t* msg) { return call Ieee154PacketLayer.requiresAckWait(msg); } async command bool SoftwareAckConfig.isAckPacket(message_t* msg) { return call Ieee154PacketLayer.isAckFrame(msg); } async command bool SoftwareAckConfig.verifyAckPacket(message_t* data, message_t* ack) { return call Ieee154PacketLayer.verifyAckReply(data, ack); } async command void SoftwareAckConfig.setAckRequired(message_t* msg, bool ack) { call Ieee154PacketLayer.setAckRequired(msg, ack); } async command bool SoftwareAckConfig.requiresAckReply(message_t* msg) { return call Ieee154PacketLayer.requiresAckReply(msg); } async command void SoftwareAckConfig.createAckPacket(message_t* data, message_t* ack) { call Ieee154PacketLayer.createAckReply(data, ack); } #ifndef SOFTWAREACK_TIMEOUT #define SOFTWAREACK_TIMEOUT 1000 #endif async command uint16_t SoftwareAckConfig.getAckTimeout() { return (uint16_t)(SOFTWAREACK_TIMEOUT); } tasklet_async command void SoftwareAckConfig.reportChannelError() { #ifdef TRAFFIC_MONITOR // signal TrafficMonitorConfig.channelError(); #endif } /*----------------- UniqueConfig -----------------*/ async command uint8_t UniqueConfig.getSequenceNumber(message_t* msg) { return call Ieee154PacketLayer.getDSN(msg); } async command void UniqueConfig.setSequenceNumber(message_t* msg, uint8_t dsn) { call Ieee154PacketLayer.setDSN(msg, dsn); } async command am_addr_t UniqueConfig.getSender(message_t* msg) { return call Ieee154PacketLayer.getSrcAddr(msg); } tasklet_async command void UniqueConfig.reportChannelError() { #ifdef TRAFFIC_MONITOR // signal TrafficMonitorConfig.channelError(); #endif } /*----------------- ActiveMessageConfig -----------------*/ command am_addr_t ActiveMessageConfig.destination(message_t* msg) { return call Ieee154PacketLayer.getDestAddr(msg); } command void ActiveMessageConfig.setDestination(message_t* msg, am_addr_t addr) { call Ieee154PacketLayer.setDestAddr(msg, addr); } command am_addr_t ActiveMessageConfig.source(message_t* msg) { return call Ieee154PacketLayer.getSrcAddr(msg); } command void ActiveMessageConfig.setSource(message_t* msg, am_addr_t addr) { call Ieee154PacketLayer.setSrcAddr(msg, addr); } command am_group_t ActiveMessageConfig.group(message_t* msg) { return call Ieee154PacketLayer.getDestPan(msg); } command void ActiveMessageConfig.setGroup(message_t* msg, am_group_t grp) { call Ieee154PacketLayer.setDestPan(msg, grp); } command error_t ActiveMessageConfig.checkFrame(message_t* msg) { if( ! call Ieee154PacketLayer.isDataFrame(msg) ) call Ieee154PacketLayer.createDataFrame(msg); return SUCCESS; } /*----------------- CsmaConfig -----------------*/ async command bool CsmaConfig.requiresSoftwareCCA(message_t* msg) { return call Ieee154PacketLayer.isDataFrame(msg); } /*----------------- TrafficMonitorConfig -----------------*/ async command uint16_t TrafficMonitorConfig.getBytes(message_t* msg) { // pure airtime: preable (4 bytes), SFD (1 byte), length (1 byte), payload + CRC (len bytes) return call CC2520Packet.payloadLength(msg) + 6; } /*----------------- RandomCollisionConfig -----------------*/ /* * We try to use the same values as in CC2420 * * CC2420_MIN_BACKOFF = 10 jiffies = 320 microsec * CC2420_BACKOFF_PERIOD = 10 jiffies * initial backoff = 0x1F * CC2420_BACKOFF_PERIOD = 310 jiffies = 9920 microsec * congestion backoff = 0x7 * CC2420_BACKOFF_PERIOD = 70 jiffies = 2240 microsec */ #ifndef LOW_POWER_LISTENING #ifndef CC2520_BACKOFF_MIN #define CC2520_BACKOFF_MIN 320 #endif async command uint16_t RandomCollisionConfig.getMinimumBackoff() { return (uint16_t)(CC2520_BACKOFF_MIN * RADIO_ALARM_MICROSEC); } #ifndef CC2520_BACKOFF_INIT #define CC2520_BACKOFF_INIT 4960 // instead of 9920 #endif async command uint16_t RandomCollisionConfig.getInitialBackoff(message_t* msg) { return (uint16_t)(CC2520_BACKOFF_INIT * RADIO_ALARM_MICROSEC); } #ifndef CC2520_BACKOFF_CONG #define CC2520_BACKOFF_CONG 2240 #endif async command uint16_t RandomCollisionConfig.getCongestionBackoff(message_t* msg) { return (uint16_t)(CC2520_BACKOFF_CONG * RADIO_ALARM_MICROSEC); } #endif async command uint16_t RandomCollisionConfig.getTransmitBarrier(message_t* msg) { uint16_t time; // TODO: maybe we should use the embedded timestamp of the message time = call RadioAlarm.getNow(); // estimated response time (download the message, etc) is 5-8 bytes if( call Ieee154PacketLayer.requiresAckReply(msg) ) time += (uint16_t)(32 * (-5 + 16 + 11 + 5) * RADIO_ALARM_MICROSEC); else time += (uint16_t)(32 * (-5 + 5) * RADIO_ALARM_MICROSEC); return time; } tasklet_async event void RadioAlarm.fired() { } /*----------------- SlottedCollisionConfig -----------------*/ async command uint16_t SlottedCollisionConfig.getInitialDelay() { return 300; } async command uint8_t SlottedCollisionConfig.getScheduleExponent() { return 1 + RADIO_ALARM_MILLI_EXP; } async command uint16_t SlottedCollisionConfig.getTransmitTime(message_t* msg) { // TODO: check if the timestamp is correct return call PacketTimeStamp.timestamp(msg); } async command uint16_t SlottedCollisionConfig.getCollisionWindowStart(message_t* msg) { // the preamble (4 bytes), SFD (1 byte), plus two extra for safety return (call PacketTimeStamp.timestamp(msg)) - (uint16_t)(7 * 32 * RADIO_ALARM_MICROSEC); } async command uint16_t SlottedCollisionConfig.getCollisionWindowLength(message_t* msg) { return (uint16_t)(2 * 7 * 32 * RADIO_ALARM_MICROSEC); } /*----------------- Dummy -----------------*/ async command void DummyConfig.nothing() { } /*----------------- LowPowerListening -----------------*/ #ifdef LOW_POWER_LISTENING command bool LowPowerListeningConfig.needsAutoAckRequest(message_t* msg) { return call Ieee154PacketLayer.getDestAddr(msg) != TOS_BCAST_ADDR; } command bool LowPowerListeningConfig.ackRequested(message_t* msg) { return call Ieee154PacketLayer.getAckRequired(msg); } command uint16_t LowPowerListeningConfig.getListenLength() { return 5; } async command uint16_t RandomCollisionConfig.getMinimumBackoff() { return (uint16_t)(320 * RADIO_ALARM_MICROSEC); } async command uint16_t RandomCollisionConfig.getInitialBackoff(message_t* msg) { return (uint16_t)(1600 * RADIO_ALARM_MICROSEC); } async command uint16_t RandomCollisionConfig.getCongestionBackoff(message_t* msg) { return (uint16_t)(3200 * RADIO_ALARM_MICROSEC); } #endif } tinyos-2.1.2+dfsg/tos/chips/cc2520/CC2520Security.nc000066400000000000000000000035401207233610700214440ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ interface CC2520Security{ async command uint8_t getSecurityMode(); command void setSecurityMode(uint8_t mode); command void setKey(uint8_t* pKey, uint8_t length); async command uint8_t* getKey(); async command uint32_t getFrameCounter(); } tinyos-2.1.2+dfsg/tos/chips/cc2520/CC2520SecurityP.nc000066400000000000000000000043101207233610700215600ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ module CC2520SecurityP{ provides interface CC2520Security; } implementation{ norace uint8_t MODE, K_LENGTH; norace uint32_t FRAMECOUNTER = 0; uint8_t PKEY[16]; async command uint8_t CC2520Security.getSecurityMode(){ return MODE; } command void CC2520Security.setSecurityMode(uint8_t mode){ atomic MODE = mode; } command void CC2520Security.setKey(uint8_t* pKey, uint8_t length){ memcpy(PKEY, pKey, length); } async command uint8_t* CC2520Security.getKey(){ return PKEY; } async command uint32_t CC2520Security.getFrameCounter(){ return FRAMECOUNTER++; } } tinyos-2.1.2+dfsg/tos/chips/cc2520/CC2520TimeSyncMessageC.nc000066400000000000000000000064611207233610700230050ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Author: Miklos Maroti, Janos Sallai * Author: Thomas Schmid (adapted to CC2520) */ #include configuration CC2520TimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStampRadio; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC2520ActiveMessageC as ActiveMessageC, new TimeSyncMessageLayerC(); SplitControl = ActiveMessageC; AMPacket = TimeSyncMessageLayerC; Receive = TimeSyncMessageLayerC.Receive; Snoop = TimeSyncMessageLayerC.Snoop; Packet = TimeSyncMessageLayerC; PacketAcknowledgements = ActiveMessageC; LowPowerListening = ActiveMessageC; PacketTimeStampRadio = ActiveMessageC; TimeSyncAMSendRadio = TimeSyncMessageLayerC; TimeSyncPacketRadio = TimeSyncMessageLayerC; PacketTimeStampMilli = ActiveMessageC; TimeSyncAMSendMilli = TimeSyncMessageLayerC; TimeSyncPacketMilli = TimeSyncMessageLayerC; TimeSyncMessageLayerC.PacketTimeStampRadio -> ActiveMessageC; TimeSyncMessageLayerC.PacketTimeStampMilli -> ActiveMessageC; components CC2520DriverLayerC as DriverLayerC; TimeSyncMessageLayerC.LocalTimeRadio -> DriverLayerC; TimeSyncMessageLayerC.PacketTimeSyncOffset -> DriverLayerC.PacketTimeSyncOffset; } tinyos-2.1.2+dfsg/tos/chips/cortex/000077500000000000000000000000001207233610700172005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/000077500000000000000000000000001207233610700175175ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/cortexm3hardware.h000066400000000000000000000072411207233610700231560ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Definitions specific to the Cortex-M3 MCU. * Includes interrupt enable/disable routines for nesC. * * @author Wanja Hofer * @author Thomas Schmid */ #ifndef CORTEXM3_HARDWARE_H #define CORTEXM3_HARDWARE_H #define ROUNDDOWN(a, n) \ ({ \ uint32_t __a = (uint32_t) (a); \ (typeof(a)) (__a - __a % (n)); \ }) // Round up to the nearest multiple of n #define ROUNDUP(a, n) \ ({ \ uint32_t __n = (uint32_t) (n); \ (typeof(a)) (ROUNDDOWN((uint32_t) (a) + __n - 1, __n)); \ }) typedef uint32_t __nesc_atomic_t; inline __nesc_atomic_t __nesc_atomic_start() @spontaneous() __attribute__((always_inline)) { __nesc_atomic_t oldState = 0; __nesc_atomic_t newState = 1; asm volatile( "mrs %[old], primask\n" "msr primask, %[new]\n" : [old] "=&r" (oldState) // output, assure write only! : [new] "r" (newState) // input : "cc", "memory" // clobber condition code flag and memory ); return oldState; } inline void __nesc_atomic_end(__nesc_atomic_t oldState) @spontaneous() __attribute__((always_inline)) { asm volatile("" : : : "memory"); // memory barrier asm volatile( "msr primask, %[old]" : // no output : [old] "r" (oldState) // input ); } // See definitive guide to Cortex-M3, p. 141, 142 // Enables all exceptions except hard fault and NMI inline void __nesc_enable_interrupt() __attribute__((always_inline)) { __nesc_atomic_t newState = 0; asm volatile( "msr primask, %0" : // output : "r" (newState) // input ); } // See definitive guide to Cortex-M3, p. 141, 142 // Disables all exceptions except hard fault and NMI inline void __nesc_disable_interrupt() __attribute__((always_inline)) { __nesc_atomic_t newState = 1; asm volatile( "msr primask, %0" : // output : "r" (newState) // input ); } #endif // CORTEXM3_HARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/000077500000000000000000000000001207233610700203625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/FunctionWrapper.nc000066400000000000000000000032731207233610700240370ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the CSIRO nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Kevin Klues */ interface FunctionWrapper { async command void preamble(); async command void postamble(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/Sam3LowPower.nc000066400000000000000000000033151207233610700232100ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * @author Kevin Klues */ interface Sam3LowPower { async command void configure(); async event void customizePio(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/eefc/000077500000000000000000000000001207233610700212645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/eefc/HplSam3Eefc.nc000066400000000000000000000035431207233610700236450ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Kevin Klues */ interface HplSam3Eefc { command error_t read(void* addr, void* buf, uint16_t size); command error_t write(void* addr, void* buf, uint16_t size); command error_t erase(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/eefc/HplSam3EefcC.nc000066400000000000000000000140121207233610700237410ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Kevin Klues */ #include "sam3eefchardware.h" generic module HplSam3EefcC(uint32_t eefc_base, uint32_t base_addr, uint32_t page_size, uint32_t total_size) { provides interface Init; provides interface InternalFlash; provides interface HplSam3Eefc; } implementation { volatile eefc_t *EEFC; // Temporary holder as we build the flash cmd register eefc_fcr_t fcr; // Shouldn't need this temp_buf (i.e. we should be able to write // directly to the base_addr) // Doesn't seem to work without it though... uint8_t temp_buf[page_size]; __attribute__((noinline)) uint32_t sendCommand(uint8_t cmd, uint32_t arg) { while(!EEFC->fsr.bits.frdy); fcr.bits.fkey = EFFC_FCR_KEY; // Set the key required to send commands fcr.bits.farg = arg; fcr.bits.fcmd = cmd; EEFC->fcr = fcr; while(!EEFC->fsr.bits.frdy); return EEFC->frr.flat; } bool getGpnvmBit(uint8_t bit) { return sendCommand(EFFC_FCMD_GET_GPNVM, 0) & (1 << bit); } void eraseIFlash() { sendCommand(EFFC_FCMD_ERASE_ALL, 0); } void eraseWriteIFlashPage(void* buf, uint32_t page) { // Write the buffer into the internal flash's latch buffer // by writing it to the base address for this flash region memcpy((void*)base_addr, buf, page_size); sendCommand(EFFC_FCMD_ERASE_PAGE_WRITE_PAGE, page); } __attribute__((noinline)) error_t doIFlashWrite(void* saddr, void* buf, uint16_t size) { int i; uint8_t *aligned_saddr = ROUNDDOWN(saddr, page_size); uint8_t *aligned_eaddr = ROUNDDOWN(saddr+size-1, page_size); uint16_t soffset = (uint32_t)saddr - (uint32_t)aligned_saddr; uint16_t next_page = ((uint32_t)aligned_saddr - base_addr)/page_size; uint16_t npages = ((uint32_t)(aligned_eaddr-aligned_saddr))/page_size + 1; // If nothing to write, just return SUCCESS if(size == 0) return SUCCESS; if(((uint32_t)saddr + size) > (base_addr + total_size)) return ESIZE; // Make sure there are no outstanding requests while(!EEFC->fsr.bits.frdy); // Prepare the temporary buffer with the contents of the first page // Preserve original contents at the front memcpy(temp_buf, aligned_saddr, soffset); // If the whole buffer fits within the first page if(aligned_saddr == aligned_eaddr) { //Write new contents to the middle memcpy(temp_buf+soffset, buf, size); // Preserve contents to the end memcpy(temp_buf+soffset+size, aligned_saddr+soffset+size, page_size-soffset-size); } else // Write new contents to the end memcpy(temp_buf+soffset, buf, page_size-soffset); // Write the first page eraseWriteIFlashPage(temp_buf, next_page); // If there was only one page, we're done if(aligned_saddr == aligned_eaddr) return SUCCESS; // Otherwise update variables and move onto the next page buf+=page_size-soffset; size-=page_size-soffset; next_page++; // Write all remaining pages except for the last one which may // have some alignment issues for(i=0; ifmr.bits.frdy = 0; // Don't generate an frdy interrupt EEFC->fmr.bits.fws = 2; // use 3 wait states EEFC->fmr.bits.fam = 0; // enhance for performance return SUCCESS; } command error_t InternalFlash.write(void* addr, void* buf, uint16_t size) { return doIFlashWrite(addr, buf, size); } command error_t InternalFlash.read(void* addr, void* buf, uint16_t size) { memcpy(buf, addr, size); return SUCCESS; } command error_t HplSam3Eefc.write(void* addr, void* buf, uint16_t size) { return doIFlashWrite(addr, buf, size); } command error_t HplSam3Eefc.read(void* addr, void* buf, uint16_t size) { memcpy(buf, addr, size); return SUCCESS; } command error_t HplSam3Eefc.erase() { eraseIFlash(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/eefc/Sam3EefcC.nc000066400000000000000000000044631207233610700233060ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Kevin Klues */ #include "AT91SAM3U4.h" #include "sam3eefchardware.h" configuration Sam3EefcC { provides { interface Init as InitIFlash0; interface Init as InitIFlash1; interface InternalFlash as InternalFlash0; interface InternalFlash as InternalFlash1; } } implementation { components new HplSam3EefcC((uint32_t)AT91C_BASE_EFC0, AT91C_IFLASH0, AT91C_IFLASH0_PAGE_SIZE, AT91C_IFLASH0_SIZE) as IFlash0; components new HplSam3EefcC((uint32_t)AT91C_BASE_EFC1, AT91C_IFLASH1, AT91C_IFLASH1_PAGE_SIZE, AT91C_IFLASH1_SIZE) as IFlash1; InitIFlash0 = IFlash0; InitIFlash1 = IFlash1; InternalFlash0 = IFlash0; InternalFlash1 = IFlash1; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/eefc/eefchardware.h000066400000000000000000000113671207233610700240650ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Enhanced Embedded Flash Controller register definitions. * * @author Thomas Schmid */ #ifndef _EFFCHARDWARE_H #define _EFFCHARDWARE_H /** * EEFC Flash Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 315 */ typedef union { uint32_t flat; struct { uint8_t frdy : 1; // ready interrupt enable uint8_t reserved0 : 7; uint8_t fws : 4; // flash wait state uint8_t reserved1 : 4; uint8_t reserved2 : 8; uint8_t fam : 1; // flash access mode uint8_t reserved3 : 7; } __attribute__((__packed__)) bits; } eefc_fmr_t; /** * EEFC Flash Command Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 316 */ typedef union { uint32_t flat; struct { uint8_t fcmd : 8; // flash command uint16_t farg : 16; // flash command argument uint8_t fkey : 8; // flash writing protection key, has to be written as 0x5A! } __attribute__((__packed__)) bits; } eefc_fcr_t; // For more details on the flash commands, see AT91 ARM Cortex-M3 based // Microcontrollers SAM3U Series, Preliminary, p. 309 #define EFFC_FCMD_GET_FLASH_DESCRIPTOR 0x0 #define EFFC_FCMD_WRITE_PAGE 0x1 #define EFFC_FCMD_WRITE_PAGE_LOCK 0x2 #define EFFC_FCMD_ERASE_PAGE_WRITE_PAGE 0x3 #define EFFC_FCMD_ERASE_PAGE_WRITE_PAGE_LOCK 0x4 #define EFFC_FCMD_ERASE_ALL 0x5 #define EFFC_FCMD_SET_LOCK 0x8 #define EFFC_FCMD_CLEAR_LOCK 0x9 #define EFFC_FCMD_GET_LOCK 0xA #define EFFC_FCMD_SET_GPNVM 0xB #define EFFC_FCMD_CLEAR_GPNVM 0xC #define EFFC_FCMD_GET_GPNVM 0xD #define EFFC_FCMD_START_READ_UNIQUE_ID 0xE #define EFFC_FCMD_STOP_READ_UNIQUE_ID 0xF #define EFFC_FCR_KEY 0x5A /** * EEFC Flash Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 317 */ typedef union { uint32_t flat; struct { uint8_t frdy : 1; // flash ready status uint8_t fcmde : 1; // flash command error status uint8_t flocke : 1; // flash lock error status uint8_t reserved0 : 5; uint8_t reserved1 : 8; uint16_t reserved2 : 16; } __attribute__((__packed__)) bits; } eefc_fsr_t; /** * EEFC Flash Result Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 318 */ typedef union { uint32_t flat; struct { uint32_t fvalue : 32; // flash result value } __attribute__((__packed__)) bits; } eefc_frr_t; /** * EEFC Register definition, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary, p. 314 */ typedef struct effc { volatile eefc_fmr_t fmr; // EEFC Flash Mode Register volatile eefc_fcr_t fcr; // EEFC Flash Command Register volatile eefc_fsr_t fsr; // EEFC Flash Status Register volatile eefc_frr_t frr; // EEFC Flash Result Register } eefc_t; #endif // _EFFCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/matrix/000077500000000000000000000000001207233610700216665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/matrix/matrixhardware.h000066400000000000000000000124271207233610700250670ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Bus Matrix register definitions. * * @author Thomas Schmid */ #ifndef _MATRIXHARDWARE_H #define _MATRIXHARDWARE_H /** * Bus Matrix Master Configuration Register, AT91 ARM Cortex-M3 based * Microcontrollers SAM3U Series, Preliminary, p. 341 */ typedef union { uint32_t flat; struct { uint8_t ulbt : 3; // undefined length burst type uint8_t reserved0 : 5; uint8_t reserved1 : 8; uint16_t reserved2 : 16; }__attribute__((__packed__)) bits; } matrix_mcfg_t; #define MATRIX_MCFG_ULBT_INFINITE_BURST 0x0 #define MATRIX_MCFG_ULBT_SINGLE_ACCESS 0x1 #define MATRIX_MCFG_ULBT_FOUR_BEAT_BURST 0x2 #define MATRIX_MCFG_ULBT_EIGHT_BEAT_BURST 0x3 #define MATRIX_MCFG_ULBT_SIXTEEN_BEAT_BURST 0x4 /** * Bus Matrix Slave Configuration Register, AT91 ARM Cortex-M3 based * Microcontrollers SAM3U Series, Preliminary, p. 342 */ typedef union { uint32_t flat; struct { uint8_t slot_cycle : 8; // maximum number of allowed cycles for a burst uint8_t reserved0 : 8; uint8_t defmstr_type : 2; // default master type uint8_t fixed_defmstr: 3; // fixed default master uint8_t reserved1 : 3; uint8_t arbt : 2; // arbitration type uint8_t reserved2 : 6; }__attribute__((__packed__)) bits; } matrix_scfg_t; #define MATRIX_SCFG_MASTER_TYPE_NO_DEFAULT 0x0 #define MATRIX_SCFG_MASTER_TYPE_LAST_DEFAULT 0x1 #define MATRIX_SCFG_MASTER_TYPE_FIXED_DEFAULT 0x2 #define MATRIX_SCFG_ARBT_ROUND_ROBINT 0x0 #define MATRIX_SCFG_ARBT_FIXED_PRIO 0x1 /** * Bus Matrix Priority Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 343 */ typedef union { uint32_t flat; struct { uint8_t m0pr : 2; // master 0 priority uint8_t reserved0 : 2; uint8_t m1pr : 2; // master 1 priority uint8_t reserved1 : 2; uint8_t m2pr : 2; // master 2 priority uint8_t reserved2 : 2; uint8_t m3pr : 2; // master 3 priority uint8_t reserved3 : 2; uint8_t m4pr : 2; // master 4 priority uint8_t reserved4 : 6; uint8_t reserved5 : 8; }__attribute__((__packed__)) bits; } matrix_pras_t; /** * Bus Matrix Master Remap Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 344 */ typedef union { uint32_t flat; struct { uint8_t rcb0 : 1; // remap command bit for ahb master 0 uint8_t rcb1 : 1; // remap command bit for ahb master 1 uint8_t rcb2 : 1; // remap command bit for ahb master 2 uint8_t rcb3 : 1; // remap command bit for ahb master 3 uint8_t rcb4 : 1; // remap command bit for ahb master 4 uint8_t reserved0 : 3; uint8_t reserved1 : 8; uint16_t reserved2 : 16; }__attribute__((__packed__)) bits; } matrix_mrcr_t; /** * Bus Matrix Write Protection Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 350 */ typedef union { uint32_t flat; struct { uint32_t wpen : 1; uint32_t reserved0 : 7; uint32_t wpkey : 24; }__attribute__((__packed__)) bits; } matrix_wpmr_t; /** * Bus Matrix Write Protection Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 350 */ typedef union { uint32_t flat; struct { uint8_t wpvs : 1; uint8_t reserved0 : 7; uint16_t wpkey : 16; uint8_t reserved1 : 8; }__attribute__((__packed__)) bits; } matrix_wpsr_t; #endif // _MATRIXHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/nvic/000077500000000000000000000000001207233610700213215ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/nvic/HplNVICCntl.nc000066400000000000000000000051151207233610700236710ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Control interface for the NVIC. * * @author Thomas Schmid * @author Wanja Hofer */ interface HplNVICCntl { command void setPriorityGrouping(uint32_t priority_grouping); async command void enableUsageFault(); async command void disableUsageFault(); async command void enableBusFault(); async command void disableBusFault(); async command void enableMemoryProtectionFault(); async command void disableMemoryProtectionFault(); async command bool isSVCallPended(); async command bool isUsageFaultPended(); async command bool isBusFaultPended(); async command bool isMemoryProtectionFaultPended(); async command bool isSysTickActive(); async command bool isPendSVActive(); async command bool isMonitorActive(); async command bool isSVCallActive(); async command bool isUsageFaultActive(); async command bool isBusFaultActive(); async command bool isMemoryProtectionFaultActive(); command void setSVCallPrio(uint8_t prio); command void setPendSVPrio(uint8_t prio); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/nvic/HplNVICCntlP.nc000066400000000000000000000107531207233610700240150ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * NVIC Controller * * @author Thomas Schmid * @author Wanja Hofer */ #include "nvichardware.h" module HplNVICCntlP { provides interface HplNVICCntl; provides interface Init; } implementation{ command void HplNVICCntl.setPriorityGrouping(uint32_t priority_grouping) { uint32_t reg_value=0; reg_value = SCB->AIRCR; /* read old register configuration */ reg_value &= ~((0xFFFFU << 16) | (0x0F << 8)); /* clear bits to change */ reg_value = ((reg_value | NVIC_AIRCR_VECTKEY | (priority_grouping << 8))); /* Insert write key and priorty group */ SCB->AIRCR = reg_value; } async command void HplNVICCntl.enableUsageFault() { SCB->SHCSR.bits.usgfaultena = 1; } async command void HplNVICCntl.disableUsageFault() { SCB->SHCSR.bits.usgfaultena = 0; } async command void HplNVICCntl.enableBusFault() { SCB->SHCSR.bits.busfaultena = 1; } async command void HplNVICCntl.disableBusFault() { SCB->SHCSR.bits.busfaultena = 0; } async command void HplNVICCntl.enableMemoryProtectionFault() { SCB->SHCSR.bits.memfaultena = 1; } async command void HplNVICCntl.disableMemoryProtectionFault() { SCB->SHCSR.bits.memfaultena = 0; } async command bool HplNVICCntl.isSVCallPended() { return (SCB->SHCSR.bits.svcallpended == 0x1); } async command bool HplNVICCntl.isUsageFaultPended() { return (SCB->SHCSR.bits.usgfaultpended == 0x1); } async command bool HplNVICCntl.isBusFaultPended() { return (SCB->SHCSR.bits.busfaultpended == 0x1); } async command bool HplNVICCntl.isMemoryProtectionFaultPended() { return (SCB->SHCSR.bits.memfaultpended == 0x1); } async command bool HplNVICCntl.isSysTickActive() { return (SCB->SHCSR.bits.systickact == 0x1); } async command bool HplNVICCntl.isPendSVActive() { return (SCB->SHCSR.bits.pendsvact == 0x1); } async command bool HplNVICCntl.isMonitorActive() { return (SCB->SHCSR.bits.monitoract == 0x1); } async command bool HplNVICCntl.isSVCallActive() { return (SCB->SHCSR.bits.svcallact == 0x1); } async command bool HplNVICCntl.isUsageFaultActive() { return (SCB->SHCSR.bits.usgfaultact == 0x1); } async command bool HplNVICCntl.isBusFaultActive() { return (SCB->SHCSR.bits.busfaultact == 0x1); } async command bool HplNVICCntl.isMemoryProtectionFaultActive() { return (SCB->SHCSR.bits.memfaultact == 0x1); } command void HplNVICCntl.setSVCallPrio(uint8_t prio) { (SCB->SHP)[7] = prio; } command void HplNVICCntl.setPendSVPrio(uint8_t prio) { (SCB->SHP)[10] = prio; } command error_t Init.init() { // both SVCall and PendSV have the same, lowest prio in the system call HplNVICCntl.setSVCallPrio(0xff); call HplNVICCntl.setPendSVPrio(0xff); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/nvic/HplNVICInterruptCntl.nc000066400000000000000000000042021207233610700256020ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * This is an interface to configure one particular interrupt of the Nested * Vectored Interrupt Controller. * * @author Thomas Schmid */ interface HplNVICInterruptCntl { async command void configure(uint32_t priority); async command void enable(); async command void disable(); async command bool isPending(); async command void setPending(); async command void clearPending(); async command uint32_t getActive(); async command void setPriority(uint32_t priority); async command uint32_t getPriority(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/nvic/HplNVICInterruptP.nc000066400000000000000000000076321207233610700251130ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Generic module representing an NVIC interrupt. * * @author Thomas Schmid */ #include "nvichardware.h" generic module HplNVICInterruptP (irqn_t irqn) @safe() { provides { interface HplNVICInterruptCntl as Cntl; } } implementation { async command void Cntl.configure(uint32_t priority){ unsigned int priGroup = __NVIC_PRIO_BITS; unsigned int nPre = 8 - priGroup; unsigned int nSub = priGroup; unsigned int preemptionPriority; unsigned int subPriority; unsigned int IRQpriority; preemptionPriority = (priority & 0xff00) >> 8; subPriority = (priority & 0xff); // Disable the interrupt first call Cntl.disable(); // Clear any pending status call Cntl.clearPending(); if (subPriority >= (0x01 << nSub)) subPriority = (0x01 << nSub) - 1; if (preemptionPriority >= (0x01 << nPre)) preemptionPriority = (0x01 << nPre) - 1; IRQpriority = (subPriority | (preemptionPriority << nSub)); call Cntl.setPriority(IRQpriority); } inline async command void Cntl.enable(){ NVIC->iser0 = (1 << ((uint32_t)(irqn) & 0x1F)); /* enable interrupt */ } inline async command void Cntl.disable(){ NVIC->icer0 = (1 << ((uint32_t)(irqn) & 0x1F)); /* disable interrupt */ } inline async command bool Cntl.isPending(){ return((irqn_t) (NVIC->ispr0 & (1 << ((uint32_t)(irqn) & 0x1F)))); /* Return Interrupt bit or 'zero' */ } inline async command void Cntl.setPending(){ NVIC->ispr0 = (1 << ((uint32_t)(irqn) & 0x1F)); /* set interrupt pending */ } inline async command void Cntl.clearPending(){ NVIC->icpr0 = (1 << ((uint32_t)(irqn) & 0x1F)); } inline async command uint32_t Cntl.getActive(){ return((irqn_t)(NVIC->iabr0 & (1 << ((uint32_t)(irqn) & 0x1F)))); /* Return Interruptnumber or 'zero' */ } inline async command void Cntl.setPriority(uint32_t priority){ NVIC->ip[(uint32_t)(irqn)] = (priority & 0xff); } inline async command uint32_t Cntl.getPriority(){ return((uint32_t)(NVIC->ip[(uint32_t)(irqn)] >> (8 - __NVIC_PRIO_BITS))); } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/nvic/nvichardware.h000066400000000000000000000151351207233610700241540ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Header definition for the Nested Vector Interrupt Controller. * * @author Thomas Schmid * @author Wanja Hofer */ #ifndef NVICHARDWARE_H #define NVICHARDWARE_H #define __NVIC_PRIO_BITS 4 /*!< standard definition for NVIC Priority Bits */ #define NVIC_AIRCR_VECTKEY (0x5FA << 16) /*!< AIRCR Key for write access */ /** * IO definitions * * define access restrictions to peripheral registers **/ #define __I volatile const /*!< defines 'read only' permissions */ #define __O volatile /*!< defines 'write only' permissions */ #define __IO volatile /*!< defines 'read / write' permissions */ /* memory mapping struct for Nested Vectored Interrupt Controller (NVIC) */ typedef struct { volatile uint32_t iser0; // Interrupt Set Enable uint32_t reserved[31]; volatile uint32_t icer0; // Interrupt Clear-enable uint32_t reserved1[31]; volatile uint32_t ispr0; // Interrupt Set-pending uint32_t reserved2[31]; volatile uint32_t icpr0; // Interrupt Clear-pending uint32_t reserved3[31]; volatile uint32_t iabr0; // Interrupt Active Bit uint32_t reserved4[63]; volatile uint8_t ip[32]; // Interrupt Priority Registers uint32_t reserved5[696]; volatile uint32_t stir; // Software Trigger Interrupt } nvic_t; typedef union { uint32_t flat; struct { uint8_t memfaultact: 1; uint8_t busfaultact: 1; uint8_t reserved0: 1; uint8_t usgfaultact: 1; uint8_t reserved1: 3; uint8_t svcallact: 1; uint8_t monitoract: 1; uint8_t reserved2: 1; uint8_t pendsvact: 1; uint8_t systickact: 1; uint8_t usgfaultpended: 1; uint8_t memfaultpended: 1; uint8_t busfaultpended: 1; uint8_t svcallpended: 1; uint8_t memfaultena: 1; uint8_t busfaultena: 1; uint8_t usgfaultena: 1; uint16_t reserved3: 13; } __attribute__((__packed__)) bits; } nvic_shcsr_t; typedef union { uint32_t flat; struct { uint32_t reserved0 : 1; uint32_t sleeonexit : 1; uint32_t sleepdeep : 1; uint32_t reserved1 : 1; uint32_t sevonpend : 1; uint32_t reserved2 : 27; } __attribute__((__packed__)) bits; } scr_t; /* memory mapping struct for System Control Block */ typedef struct { __I uint32_t CPUID; /*!< CPU ID Base Register */ __IO uint32_t ICSR; /*!< Interrupt Control State Register */ __IO uint32_t VTOR; /*!< Vector Table Offset Register */ __IO uint32_t AIRCR; /*!< Application Interrupt / Reset Control Register */ __IO scr_t scr; /*!< System Control Register */ __IO uint32_t CCR; /*!< Configuration Control Register */ __IO uint8_t SHP[12]; /*!< System Handlers Priority Registers (4-7, 8-11, 12-15) */ __IO nvic_shcsr_t SHCSR; /*!< System Handler Control and State Register */ __IO uint32_t CFSR; /*!< Configurable Fault Status Register */ __IO uint32_t HFSR; /*!< Hard Fault Status Register */ __IO uint32_t DFSR; /*!< Debug Fault Status Register */ __IO uint32_t MMFAR; /*!< Mem Manage Address Register */ __IO uint32_t BFAR; /*!< Bus Fault Address Register */ __IO uint32_t AFSR; /*!< Auxiliary Fault Status Register */ __I uint32_t PFR[2]; /*!< Processor Feature Register */ __I uint32_t DFR; /*!< Debug Feature Register */ __I uint32_t ADR; /*!< Auxiliary Feature Register */ __I uint32_t MMFR[4]; /*!< Memory Model Feature Register */ __I uint32_t ISAR[5]; /*!< ISA Feature Register */ } scb_t; /* Memory mapping of Cortex-M3 Hardware */ volatile nvic_t* NVIC = (volatile nvic_t *) 0xE000E100; // NVIC Base Address #define SCS_BASE (0xE000E000) /*!< System Control Space Base Address */ #define SCB_BASE (SCS_BASE + 0x0D00) /*!< System Control Block Base Address */ #define SCB ((scb_t*) SCB_BASE) /*!< SCB configuration struct */ #endif // SAM3UNVICHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/pdc/000077500000000000000000000000001207233610700211305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/pdc/HplSam3Pdc.nc000066400000000000000000000052551207233610700233570ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ interface HplSam3Pdc { /* Pointer Registers */ async command void setRxPtr(void* addr); async command void setTxPtr(void* addr); async command void setNextRxPtr(void* addr); async command void setNextTxPtr(void* addr); async command uint32_t getRxPtr(); async command uint32_t getTxPtr(); async command uint32_t getNextRxPtr(); async command uint32_t getNextTxPtr(); /* Counter Registers */ async command void setRxCounter(uint16_t counter); async command void setTxCounter(uint16_t counter); async command void setNextRxCounter(uint16_t counter); async command void setNextTxCounter(uint16_t counter); async command uint16_t getRxCounter(); async command uint16_t getTxCounter(); async command uint16_t getNextRxCounter(); async command uint16_t getNextTxCounter(); /* Enable / Disable Register */ async command void enablePdcRx(); async command void enablePdcTx(); async command void disablePdcRx(); async command void disablePdcTx(); /* Status Registers - Checks status */ async command bool rxEnabled(); async command bool txEnabled(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/pdc/HplSam3PdcP.nc000066400000000000000000000137451207233610700235020ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "pdchardware.h" generic module HplSam3PdcP(uint32_t BASE_ADDR){ provides interface HplSam3Pdc as Pdc; } implementation{ uint32_t PDC_BASE_ADDR = (BASE_ADDR + 0x100); async command void Pdc.setRxPtr(void* addr){ volatile periph_rpr_t* RPR = (volatile periph_rpr_t*) (PDC_BASE_ADDR + 0x0); periph_rpr_t rpr; rpr.bits.rxptr = (uint32_t)addr; *RPR = rpr; } async command void Pdc.setTxPtr(void* addr){ volatile periph_tpr_t* TPR = (volatile periph_tpr_t*) (PDC_BASE_ADDR + 0x8); periph_tpr_t tpr; tpr.bits.txptr = (uint32_t)addr; *TPR = tpr; } async command void Pdc.setNextRxPtr(void* addr){ volatile periph_rnpr_t* RNPR = (volatile periph_rnpr_t*) (PDC_BASE_ADDR + 0x10); periph_rnpr_t rnpr; rnpr.bits.rxnptr = (uint32_t)addr; *RNPR = rnpr; } async command void Pdc.setNextTxPtr(void* addr){ volatile periph_tnpr_t* TNPR = (volatile periph_tnpr_t*) (PDC_BASE_ADDR + 0x18); periph_tnpr_t tnpr; tnpr.bits.txnptr = (uint32_t)addr; *TNPR = tnpr; } async command uint32_t Pdc.getRxPtr(){ volatile periph_rpr_t* RPR = (volatile periph_rpr_t*) (PDC_BASE_ADDR + 0x0); return RPR->bits.rxptr; } async command uint32_t Pdc.getTxPtr(){ volatile periph_tpr_t* TPR = (volatile periph_tpr_t*) (PDC_BASE_ADDR + 0x8); return TPR->bits.txptr; } async command uint32_t Pdc.getNextRxPtr(){ volatile periph_rnpr_t* RNPR = (volatile periph_rnpr_t*) (PDC_BASE_ADDR + 0x10); return RNPR->bits.rxnptr; } async command uint32_t Pdc.getNextTxPtr(){ volatile periph_tnpr_t* TNPR = (volatile periph_tnpr_t*) (PDC_BASE_ADDR + 0x18); return TNPR->bits.txnptr; } async command uint16_t Pdc.getRxCounter(){ volatile periph_rcr_t* RCR = (volatile periph_rcr_t*) (PDC_BASE_ADDR + 0x4); return RCR->bits.rxctr; } async command uint16_t Pdc.getTxCounter(){ volatile periph_tcr_t* TCR = (volatile periph_tcr_t*) (PDC_BASE_ADDR + 0xC); return TCR->bits.txctr; } async command uint16_t Pdc.getNextRxCounter(){ volatile periph_rncr_t* RNCR = (volatile periph_rncr_t*) (PDC_BASE_ADDR + 0x14); return RNCR->bits.rxnctr; } async command uint16_t Pdc.getNextTxCounter(){ volatile periph_tncr_t* TNCR = (volatile periph_tncr_t*) (PDC_BASE_ADDR + 0x1C); return TNCR->bits.txnctr; } async command void Pdc.setRxCounter(uint16_t counter){ volatile periph_rcr_t* RCR = (volatile periph_rcr_t*) (PDC_BASE_ADDR + 0x4); periph_rcr_t rcr; rcr.bits.rxctr = counter; *RCR = rcr; } async command void Pdc.setTxCounter(uint16_t counter){ volatile periph_tcr_t* TCR = (volatile periph_tcr_t*) (PDC_BASE_ADDR + 0xC); periph_tcr_t tcr; tcr.bits.txctr = counter; *TCR = tcr; } async command void Pdc.setNextRxCounter(uint16_t counter){ volatile periph_rncr_t* RNCR = (volatile periph_rncr_t*) (PDC_BASE_ADDR + 0x14); periph_rncr_t rncr; rncr.bits.rxnctr = counter; *RNCR = rncr; } async command void Pdc.setNextTxCounter(uint16_t counter){ volatile periph_tncr_t* TNCR = (volatile periph_tncr_t*) (PDC_BASE_ADDR + 0x1C); periph_tncr_t tncr; tncr.bits.txnctr = counter; *TNCR = tncr; } async command void Pdc.enablePdcRx(){ volatile periph_ptcr_t* PTCR = (volatile periph_ptcr_t*) (PDC_BASE_ADDR + 0x20); periph_ptcr_t ptcr; ptcr.bits.rxten = 1; *PTCR = ptcr; } async command void Pdc.enablePdcTx(){ volatile periph_ptcr_t* PTCR = (volatile periph_ptcr_t*) (PDC_BASE_ADDR + 0x20); periph_ptcr_t ptcr; ptcr.bits.txten = 1; *PTCR = ptcr; } async command void Pdc.disablePdcRx(){ volatile periph_ptcr_t* PTCR = (volatile periph_ptcr_t*) (PDC_BASE_ADDR + 0x20); periph_ptcr_t ptcr; ptcr.bits.rxtdis = 1; *PTCR = ptcr; } async command void Pdc.disablePdcTx(){ volatile periph_ptcr_t* PTCR = (volatile periph_ptcr_t*) (PDC_BASE_ADDR + 0x20); periph_ptcr_t ptcr; ptcr.bits.txtdis = 1; *PTCR = ptcr; } async command bool Pdc.rxEnabled(){ volatile periph_ptsr_t* PTSR = (volatile periph_ptsr_t*) (PDC_BASE_ADDR + 0x24); periph_ptsr_t ptsr = *PTSR; if(ptsr.bits.rxten){ return TRUE; }else{ return FALSE; } } async command bool Pdc.txEnabled(){ volatile periph_ptsr_t* PTSR = (volatile periph_ptsr_t*) (PDC_BASE_ADDR + 0x24); periph_ptsr_t ptsr = *PTSR; if(ptsr.bits.txten){ return TRUE; }else{ return FALSE; } } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/pdc/README000066400000000000000000000007651207233610700220200ustar00rootroot00000000000000Generic PDC implementation for SAM3 @author JeongGil Ko @author Thomas Schmid The implementation is based on the preliminary specifications and the MSP430 implementations. - Each PDC supporting user interface (uart, usart, twi, pwm, etc.) should wire to the PDC component for the user interface. - Be sure to enable the peripheral clock for each peripheral's user interface before writing to the PDC registers. If the clock is not active, some registers will be inactive. tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/pdc/pdchardware.h000066400000000000000000000120511207233610700235640ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * PDC register definitions. * * @author JeongGil Ko */ #ifndef _PDCHARDWARE_H #define _PDCHARDWARE_H /** * PDC Received Pointer Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 462 */ typedef union { uint32_t flat; struct { uint32_t rxptr : 32; } __attribute__((__packed__)) bits; } periph_rpr_t; /** * PDC Receive Counter Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 463 */ typedef union { uint32_t flat; struct { uint16_t rxctr : 16; uint16_t reserved0 : 16; } __attribute__((__packed__)) bits; } periph_rcr_t; /** * PDC Transmit Pointer Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 464 */ typedef union { uint32_t flat; struct { uint32_t txptr : 32; } __attribute__((__packed__)) bits; } periph_tpr_t; /** * PDC Transmit Counter Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 464 */ typedef union { uint32_t flat; struct { uint16_t txctr : 16; uint16_t reserved0 : 16; } __attribute__((__packed__)) bits; } periph_tcr_t; /** * PDC Received Next Pointer Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 465 */ typedef union { uint32_t flat; struct { uint32_t rxnptr : 32; } __attribute__((__packed__)) bits; } periph_rnpr_t; /** * PDC Receive Next Counter Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 465 */ typedef union { uint32_t flat; struct { uint16_t rxnctr : 16; uint16_t reserved0 : 16; } __attribute__((__packed__)) bits; } periph_rncr_t; /** * PDC Transmit Pointer Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 466 */ typedef union { uint32_t flat; struct { uint32_t txnptr : 32; } __attribute__((__packed__)) bits; } periph_tnpr_t; /** * PDC Transmit Next Counter Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 466 */ typedef union { uint32_t flat; struct { uint16_t txnctr : 16; uint16_t reserved0 : 16; } __attribute__((__packed__)) bits; } periph_tncr_t; /** * PDC Transfer Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 467 */ typedef union { uint32_t flat; struct { uint8_t rxten : 1; uint8_t rxtdis : 1; uint8_t reserved0 : 6; uint8_t txten : 1; uint8_t txtdis : 1; uint8_t reserved1 : 6; uint16_t reserved2 : 16; } __attribute__((__packed__)) bits; } periph_ptcr_t; /** * PDC Transfer Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 468 */ typedef union { uint32_t flat; struct { uint8_t rxten : 1; uint8_t reserved0 : 7; uint8_t txten : 1; uint8_t reserved1 : 7; uint16_t reserved2 : 16; } __attribute__((__packed__)) bits; } periph_ptsr_t; /** * PDC Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary, p. 461 */ typedef struct pdc { volatile periph_rpr_t rpr; volatile periph_rcr_t rcr; volatile periph_tpr_t tpr; volatile periph_tcr_t tcr; volatile periph_rnpr_t rnpr; volatile periph_rncr_t rncr; volatile periph_tnpr_t tnpr; volatile periph_tncr_t tncr; volatile periph_ptcr_t ptcr; volatile periph_ptsr_t ptsr; } periph_t; #endif // _PDCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/pins/000077500000000000000000000000001207233610700213335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/pins/HplSam3GeneralIOP.nc000066400000000000000000000075041207233610700250000ustar00rootroot00000000000000/** * "Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * This module is only used to dispatch the IRQ to the correct module. * @author Thomas Schmid */ module HplSam3GeneralIOP { provides { interface HplSam3GeneralIOPort as HplPortA; interface HplSam3GeneralIOPort as HplPortB; interface HplSam3GeneralIOPort as HplPortC; } uses { interface FunctionWrapper as PioAInterruptWrapper; interface FunctionWrapper as PioBInterruptWrapper; interface FunctionWrapper as PioCInterruptWrapper; } } implementation { __attribute__((interrupt)) void PioAIrqHandler() @C() @spontaneous() { uint32_t time = 0; call PioAInterruptWrapper.preamble(); signal HplPortA.fired(time); call PioAInterruptWrapper.postamble(); } __attribute__((interrupt)) void PioBIrqHandler() @C() @spontaneous() { uint32_t time = 0; call PioBInterruptWrapper.preamble(); signal HplPortB.fired(time); call PioBInterruptWrapper.postamble(); } __attribute__((interrupt)) void PioCIrqHandler() @C() @spontaneous() { uint32_t time = 0; call PioCInterruptWrapper.preamble(); signal HplPortC.fired(time); call PioCInterruptWrapper.postamble(); } /** * Does nothing! */ async command void HplPortA.enableInterrupt() { } async command void HplPortA.disableInterrupt() { } async command void HplPortA.enableClock() { } async command void HplPortA.disableClock() { } /** * Does nothing! */ async command void HplPortB.enableInterrupt() { } async command void HplPortB.disableInterrupt() { } async command void HplPortB.enableClock() { } async command void HplPortB.disableClock() { } /** * Does nothing! */ async command void HplPortC.enableInterrupt() { } async command void HplPortC.disableInterrupt() { } async command void HplPortC.enableClock() { } async command void HplPortC.disableClock() { } default async event void HplPortA.fired(uint32_t time) {} default async event void HplPortB.fired(uint32_t time) {} default async event void HplPortC.fired(uint32_t time) {} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/pins/HplSam3GeneralIOPin.nc000066400000000000000000000056531207233610700253320ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Wanja Hofer */ interface HplSam3GeneralIOPin { async command void enablePioControl(); /** * Disables the PIO controller from driving the pin. The connected * peripheral (if any) will do that. */ async command void disablePioControl(); async command bool isEnabledPioControl(); async command void enableMultiDrive(); async command void disableMultiDrive(); async command bool isEnabledMultiDrive(); async command void enablePullUpResistor(); async command void disablePullUpResistor(); async command bool isEnabledPullUpResistor(); async command void selectPeripheralA(); async command void selectPeripheralB(); #ifdef CHIP_SAM3_HAS_PERIPHERAL_CD async command void selectPeripheralC(); async command void selectPeripheralD(); #endif /** * Returns TRUE if peripheral A is selected, returns FALSE if * peripheral B is selected. */ async command bool isSelectedPeripheralA(); // interrupt async command void enableInterrupt(); async command void disableInterrupt(); async command bool isEnabledInterrupt(); // edge selection async command void enableEdgeDetection(); async command bool isEnabledEdgeDetection(); async command void fallingEdgeDetection(); async command bool isFallingEdgeDetection(); async command void risingEdgeDetection(); /* TODO: input, and filter functions */ } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/pins/HplSam3GeneralIOPinP.nc000066400000000000000000000260261207233610700254470ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Pin abstraction on the SAM3. * * @author Wanja Hofer */ generic module HplSam3GeneralIOPinP(uint32_t pio_addr, uint8_t bit) { provides { interface GeneralIO as IO; interface GpioInterrupt as Interrupt; interface GpioCapture as Capture; interface HplSam3GeneralIOPin as HplPin; } uses { interface HplSam3GeneralIOPort as HplPort; } } implementation { async command bool IO.get() { if ((call IO.isInput()) == 1) { /* Read bit from Pin Data Status Register */ uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x03c)); uint32_t currentpin = (currentport & (1 << bit)) >> bit; return ((currentpin & 1) == 1); } else { /* Read bit from Output Data Status Register */ uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x038)); uint32_t currentpin = (currentport & (1 << bit)) >> bit; return ((currentpin & 1) == 1); } } async command void IO.set() { /* Set bit in Set Output Data Register */ *((volatile uint32_t *) (pio_addr + 0x030)) = (1 << bit); } async command void IO.clr() { /* Set bit in Clear Output Data Register */ *((volatile uint32_t *) (pio_addr + 0x034)) = (1 << bit); } async command void IO.toggle() { if ((call IO.get()) == 1) { call IO.clr(); } else { call IO.set(); } } async command void IO.makeInput() { /* Set bit in Output Disable Register */ *((volatile uint32_t *) (pio_addr + 0x014)) = (1 << bit); call HplPort.enableClock(); } async command void IO.makeOutput() { /* Set bit in Output Enable Register */ *((volatile uint32_t *) (pio_addr + 0x010)) = (1 << bit); // we don't need the clock in output mode call HplPort.disableClock(); } async command bool IO.isOutput() { /* Read bit from Output Status Register */ uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x018)); uint32_t currentpin = (currentport & (1 << bit)) >> bit; return ((currentpin & 1) == 1); } async command bool IO.isInput() { return (! (call IO.isOutput())); } async command void HplPin.enablePioControl() { /* Set bit in PIO Enable Register */ *((volatile uint32_t *) (pio_addr + 0x000)) = (1 << bit); } async command void HplPin.disablePioControl() { /* Set bit in PIO Disable Register */ *((volatile uint32_t *) (pio_addr + 0x004)) = (1 << bit); } async command bool HplPin.isEnabledPioControl() { /* Read bit from PIO Status Register */ uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x008)); uint32_t currentpin = (currentport & (1 << bit)) >> bit; return ((currentpin & 1) == 1); } async command void HplPin.enableMultiDrive() { /* Set bit in Multi-Driver Enable Register */ *((volatile uint32_t *) (pio_addr + 0x050)) = (1 << bit); } async command void HplPin.disableMultiDrive() { /* Set bit in Multi-Driver Disable Register */ *((volatile uint32_t *) (pio_addr + 0x054)) = (1 << bit); } async command bool HplPin.isEnabledMultiDrive() { /* Read bit from Multi-Driver Status Register */ uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x058)); uint32_t currentpin = (currentport & (1 << bit)) >> bit; return ((currentpin & 1) == 1); } async command void HplPin.enablePullUpResistor() { /* Set bit in Pull-Up Enable Register */ *((volatile uint32_t *) (pio_addr + 0x064)) = (1 << bit); } async command void HplPin.disablePullUpResistor() { /* Set bit in Pull-Up Disable Register */ *((volatile uint32_t *) (pio_addr + 0x060)) = (1 << bit); } async command bool HplPin.isEnabledPullUpResistor() { /* Read bit from Pull-Up Status Register */ uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x068)); uint32_t currentpin = (currentport & (1 << bit)) >> bit; return ((currentpin & 1) == 0); } async command void HplPin.selectPeripheralA() { /* Read in Peripheral AB Select Register */ uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x070)); /* Clear bit */ currentport &= ~ (1 << bit); /* Write back to register */ *((volatile uint32_t *) (pio_addr + 0x070)) = currentport; #ifdef CHIP_SAM3_HAS_PERIPHERAL_CD currentport = *((volatile uint32_t *) (pio_addr + 0x074)); currentport &= ~ (1 << bit); *((volatile uint32_t *) (pio_addr + 0x074)) = currentport; #endif } async command void HplPin.selectPeripheralB() { /* Read in Peripheral AB Select Register */ uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x070)); /* Set bit */ currentport |= (1 << bit); /* Write back to register */ *((volatile uint32_t *) (pio_addr + 0x070)) = currentport; #ifdef CHIP_SAM3_HAS_PERIPHERAL_CD currentport = *((volatile uint32_t *) (pio_addr + 0x074)); /* clear bit */ currentport &= ~(1 << bit); /* Write back to register */ *((volatile uint32_t *) (pio_addr + 0x074)) = currentport; #endif } #ifdef CHIP_SAM3_HAS_PERIPHERAL_CD async command void HplPin.selectPeripheralC() { /* Read in Peripheral AB Select Register */ uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x070)); /* clear bit */ currentport &= ~(1 << bit); /* Write back to register */ *((volatile uint32_t *) (pio_addr + 0x070)) = currentport; currentport = *((volatile uint32_t *) (pio_addr + 0x074)); /* set bit */ currentport |= (1 << bit); /* Write back to register */ *((volatile uint32_t *) (pio_addr + 0x074)) = currentport; } async command void HplPin.selectPeripheralD() { /* Read in Peripheral AB Select Register */ uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x070)); /* set bit */ currentport |= (1 << bit); /* Write back to register */ *((volatile uint32_t *) (pio_addr + 0x070)) = currentport; currentport = *((volatile uint32_t *) (pio_addr + 0x074)); /* set bit */ currentport |= (1 << bit); /* Write back to register */ *((volatile uint32_t *) (pio_addr + 0x074)) = currentport; } #endif async command bool HplPin.isSelectedPeripheralA() { /* Read bit from Peripheral AB Select Register */ uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x070)); uint32_t currentpin = (currentport & (1 << bit)) >> bit; #ifdef CHIP_SAM3_HAS_PERIPHERAL_CD uint32_t currentport2 = *((volatile uint32_t *) (pio_addr + 0x074)); uint32_t currentpin2 = (currentport2 & (1 << bit)) >> bit; return (((currentpin & 1) == 0) && (currentpin2 & 1) == 0); #else return ((currentpin & 1) == 0); #endif } // interrupt async command void HplPin.enableInterrupt() { *((volatile uint32_t *) (pio_addr + 0x040)) = 1 << bit; call HplPort.enableInterrupt(); } async command void HplPin.disableInterrupt() { *((volatile uint32_t *) (pio_addr + 0x044)) = 1 << bit; call HplPort.disableInterrupt(); } async command bool HplPin.isEnabledInterrupt() { uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x048)); uint32_t currentpin = (currentport & (1 << bit)) >> bit; return ((currentpin & 1) == 1); } // edge selection async command void HplPin.enableEdgeDetection() { *((volatile uint32_t *) (pio_addr + 0x0C0)) = 1 << bit; // for precaution, reset additional interrupt modes register // so that we can do just edge detection (rising and falling) *((volatile uint32_t *) (pio_addr + 0x0B4)) = 1 << bit; } async command bool HplPin.isEnabledEdgeDetection() { uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x0C8)); uint32_t currentpin = (currentport & (1 << bit)) >> bit; return ((currentpin & 1) == 0); } async command void HplPin.fallingEdgeDetection() { // set the bit in falling edge register *((volatile uint32_t *) (pio_addr + 0x0D0)) = 1 << bit; // enable additional interrupt modes *((volatile uint32_t *) (pio_addr + 0x0B0)) = 1 << bit; } async command bool HplPin.isFallingEdgeDetection() { uint32_t currentport = *((volatile uint32_t *) (pio_addr + 0x0D8)); uint32_t currentpin = (currentport & (1 << bit)) >> bit; return ((currentpin & 1) == 0); } async command void HplPin.risingEdgeDetection() { // set the bit in the rising edge detection *((volatile uint32_t *) (pio_addr + 0x0D4)) = 1 << bit; // enable additional interrupt modes *((volatile uint32_t *) (pio_addr + 0x0B0)) = 1 << bit; } async event void HplPort.fired(uint32_t time) { signal Interrupt.fired(); signal Capture.captured((uint16_t)time); } async command error_t Interrupt.disable() { call HplPin.disableInterrupt(); return SUCCESS; } async command error_t Interrupt.enableFallingEdge() { call HplPin.enablePioControl(); call HplPin.enableEdgeDetection(); call HplPin.fallingEdgeDetection(); call HplPin.enableInterrupt(); return SUCCESS; } async command error_t Interrupt.enableRisingEdge() { call HplPin.enablePioControl(); call HplPin.enableEdgeDetection(); call HplPin.risingEdgeDetection(); call HplPin.enableInterrupt(); return SUCCESS; } async command error_t Capture.captureRisingEdge() { return call Interrupt.enableRisingEdge(); } async command error_t Capture.captureFallingEdge() { return call Interrupt.enableFallingEdge(); } async command void Capture.disable() { call Interrupt.disable(); } default async event void Interrupt.fired() {} default async event void Capture.captured(uint16_t time) {} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/pins/HplSam3GeneralIOPioC.nc000066400000000000000000000305511207233610700254310ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Abstraction of a PIO controller on the SAM3. Has 32 pins. * * @author wanja@cs.fau.de */ generic configuration HplSam3GeneralIOPioC(uint32_t pio_addr) { provides { interface GeneralIO as Pin0; interface GeneralIO as Pin1; interface GeneralIO as Pin2; interface GeneralIO as Pin3; interface GeneralIO as Pin4; interface GeneralIO as Pin5; interface GeneralIO as Pin6; interface GeneralIO as Pin7; interface GeneralIO as Pin8; interface GeneralIO as Pin9; interface GeneralIO as Pin10; interface GeneralIO as Pin11; interface GeneralIO as Pin12; interface GeneralIO as Pin13; interface GeneralIO as Pin14; interface GeneralIO as Pin15; interface GeneralIO as Pin16; interface GeneralIO as Pin17; interface GeneralIO as Pin18; interface GeneralIO as Pin19; interface GeneralIO as Pin20; interface GeneralIO as Pin21; interface GeneralIO as Pin22; interface GeneralIO as Pin23; interface GeneralIO as Pin24; interface GeneralIO as Pin25; interface GeneralIO as Pin26; interface GeneralIO as Pin27; interface GeneralIO as Pin28; interface GeneralIO as Pin29; interface GeneralIO as Pin30; interface GeneralIO as Pin31; interface HplSam3GeneralIOPin as HplPin0; interface HplSam3GeneralIOPin as HplPin1; interface HplSam3GeneralIOPin as HplPin2; interface HplSam3GeneralIOPin as HplPin3; interface HplSam3GeneralIOPin as HplPin4; interface HplSam3GeneralIOPin as HplPin5; interface HplSam3GeneralIOPin as HplPin6; interface HplSam3GeneralIOPin as HplPin7; interface HplSam3GeneralIOPin as HplPin8; interface HplSam3GeneralIOPin as HplPin9; interface HplSam3GeneralIOPin as HplPin10; interface HplSam3GeneralIOPin as HplPin11; interface HplSam3GeneralIOPin as HplPin12; interface HplSam3GeneralIOPin as HplPin13; interface HplSam3GeneralIOPin as HplPin14; interface HplSam3GeneralIOPin as HplPin15; interface HplSam3GeneralIOPin as HplPin16; interface HplSam3GeneralIOPin as HplPin17; interface HplSam3GeneralIOPin as HplPin18; interface HplSam3GeneralIOPin as HplPin19; interface HplSam3GeneralIOPin as HplPin20; interface HplSam3GeneralIOPin as HplPin21; interface HplSam3GeneralIOPin as HplPin22; interface HplSam3GeneralIOPin as HplPin23; interface HplSam3GeneralIOPin as HplPin24; interface HplSam3GeneralIOPin as HplPin25; interface HplSam3GeneralIOPin as HplPin26; interface HplSam3GeneralIOPin as HplPin27; interface HplSam3GeneralIOPin as HplPin28; interface HplSam3GeneralIOPin as HplPin29; interface HplSam3GeneralIOPin as HplPin30; interface HplSam3GeneralIOPin as HplPin31; interface GpioInterrupt as InterruptPin0; interface GpioInterrupt as InterruptPin1; interface GpioInterrupt as InterruptPin2; interface GpioInterrupt as InterruptPin3; interface GpioInterrupt as InterruptPin4; interface GpioInterrupt as InterruptPin5; interface GpioInterrupt as InterruptPin6; interface GpioInterrupt as InterruptPin7; interface GpioInterrupt as InterruptPin8; interface GpioInterrupt as InterruptPin9; interface GpioInterrupt as InterruptPin10; interface GpioInterrupt as InterruptPin11; interface GpioInterrupt as InterruptPin12; interface GpioInterrupt as InterruptPin13; interface GpioInterrupt as InterruptPin14; interface GpioInterrupt as InterruptPin15; interface GpioInterrupt as InterruptPin16; interface GpioInterrupt as InterruptPin17; interface GpioInterrupt as InterruptPin18; interface GpioInterrupt as InterruptPin19; interface GpioInterrupt as InterruptPin20; interface GpioInterrupt as InterruptPin21; interface GpioInterrupt as InterruptPin22; interface GpioInterrupt as InterruptPin23; interface GpioInterrupt as InterruptPin24; interface GpioInterrupt as InterruptPin25; interface GpioInterrupt as InterruptPin26; interface GpioInterrupt as InterruptPin27; interface GpioInterrupt as InterruptPin28; interface GpioInterrupt as InterruptPin29; interface GpioInterrupt as InterruptPin30; interface GpioInterrupt as InterruptPin31; interface GpioCapture as CapturePin0; interface GpioCapture as CapturePin1; interface GpioCapture as CapturePin2; interface GpioCapture as CapturePin3; interface GpioCapture as CapturePin4; interface GpioCapture as CapturePin5; interface GpioCapture as CapturePin6; interface GpioCapture as CapturePin7; interface GpioCapture as CapturePin8; interface GpioCapture as CapturePin9; interface GpioCapture as CapturePin10; interface GpioCapture as CapturePin11; interface GpioCapture as CapturePin12; interface GpioCapture as CapturePin13; interface GpioCapture as CapturePin14; interface GpioCapture as CapturePin15; interface GpioCapture as CapturePin16; interface GpioCapture as CapturePin17; interface GpioCapture as CapturePin18; interface GpioCapture as CapturePin19; interface GpioCapture as CapturePin20; interface GpioCapture as CapturePin21; interface GpioCapture as CapturePin22; interface GpioCapture as CapturePin23; interface GpioCapture as CapturePin24; interface GpioCapture as CapturePin25; interface GpioCapture as CapturePin26; interface GpioCapture as CapturePin27; interface GpioCapture as CapturePin28; interface GpioCapture as CapturePin29; interface GpioCapture as CapturePin30; interface GpioCapture as CapturePin31; } uses { interface HplSam3GeneralIOPort as HplPort; interface HplNVICInterruptCntl as PIOIrqControl; interface HplSam3PeripheralClockCntl as PIOClockControl; } } implementation { components new HplSam3GeneralIOPinP(pio_addr, 0) as Bit0, new HplSam3GeneralIOPinP(pio_addr, 1) as Bit1, new HplSam3GeneralIOPinP(pio_addr, 2) as Bit2, new HplSam3GeneralIOPinP(pio_addr, 3) as Bit3, new HplSam3GeneralIOPinP(pio_addr, 4) as Bit4, new HplSam3GeneralIOPinP(pio_addr, 5) as Bit5, new HplSam3GeneralIOPinP(pio_addr, 6) as Bit6, new HplSam3GeneralIOPinP(pio_addr, 7) as Bit7, new HplSam3GeneralIOPinP(pio_addr, 8) as Bit8, new HplSam3GeneralIOPinP(pio_addr, 9) as Bit9, new HplSam3GeneralIOPinP(pio_addr, 10) as Bit10, new HplSam3GeneralIOPinP(pio_addr, 11) as Bit11, new HplSam3GeneralIOPinP(pio_addr, 12) as Bit12, new HplSam3GeneralIOPinP(pio_addr, 13) as Bit13, new HplSam3GeneralIOPinP(pio_addr, 14) as Bit14, new HplSam3GeneralIOPinP(pio_addr, 15) as Bit15, new HplSam3GeneralIOPinP(pio_addr, 16) as Bit16, new HplSam3GeneralIOPinP(pio_addr, 17) as Bit17, new HplSam3GeneralIOPinP(pio_addr, 18) as Bit18, new HplSam3GeneralIOPinP(pio_addr, 19) as Bit19, new HplSam3GeneralIOPinP(pio_addr, 20) as Bit20, new HplSam3GeneralIOPinP(pio_addr, 21) as Bit21, new HplSam3GeneralIOPinP(pio_addr, 22) as Bit22, new HplSam3GeneralIOPinP(pio_addr, 23) as Bit23, new HplSam3GeneralIOPinP(pio_addr, 24) as Bit24, new HplSam3GeneralIOPinP(pio_addr, 25) as Bit25, new HplSam3GeneralIOPinP(pio_addr, 26) as Bit26, new HplSam3GeneralIOPinP(pio_addr, 27) as Bit27, new HplSam3GeneralIOPinP(pio_addr, 28) as Bit28, new HplSam3GeneralIOPinP(pio_addr, 29) as Bit29, new HplSam3GeneralIOPinP(pio_addr, 30) as Bit30, new HplSam3GeneralIOPinP(pio_addr, 31) as Bit31; Pin0 = Bit0; Pin1 = Bit1; Pin2 = Bit2; Pin3 = Bit3; Pin4 = Bit4; Pin5 = Bit5; Pin6 = Bit6; Pin7 = Bit7; Pin8 = Bit8; Pin9 = Bit9; Pin10 = Bit10; Pin11 = Bit11; Pin12 = Bit12; Pin13 = Bit13; Pin14 = Bit14; Pin15 = Bit15; Pin16 = Bit16; Pin17 = Bit17; Pin18 = Bit18; Pin19 = Bit19; Pin20 = Bit20; Pin21 = Bit21; Pin22 = Bit22; Pin23 = Bit23; Pin24 = Bit24; Pin25 = Bit25; Pin26 = Bit26; Pin27 = Bit27; Pin28 = Bit28; Pin29 = Bit29; Pin30 = Bit30; Pin31 = Bit31; HplPin0 = Bit0; HplPin1 = Bit1; HplPin2 = Bit2; HplPin3 = Bit3; HplPin4 = Bit4; HplPin5 = Bit5; HplPin6 = Bit6; HplPin7 = Bit7; HplPin8 = Bit8; HplPin9 = Bit9; HplPin10 = Bit10; HplPin11 = Bit11; HplPin12 = Bit12; HplPin13 = Bit13; HplPin14 = Bit14; HplPin15 = Bit15; HplPin16 = Bit16; HplPin17 = Bit17; HplPin18 = Bit18; HplPin19 = Bit19; HplPin20 = Bit20; HplPin21 = Bit21; HplPin22 = Bit22; HplPin23 = Bit23; HplPin24 = Bit24; HplPin25 = Bit25; HplPin26 = Bit26; HplPin27 = Bit27; HplPin28 = Bit28; HplPin29 = Bit29; HplPin30 = Bit30; HplPin31 = Bit31; InterruptPin0 = Bit0; InterruptPin1 = Bit1; InterruptPin2 = Bit2; InterruptPin3 = Bit3; InterruptPin4 = Bit4; InterruptPin5 = Bit5; InterruptPin6 = Bit6; InterruptPin7 = Bit7; InterruptPin8 = Bit8; InterruptPin9 = Bit9; InterruptPin10 = Bit10; InterruptPin11 = Bit11; InterruptPin12 = Bit12; InterruptPin13 = Bit13; InterruptPin14 = Bit14; InterruptPin15 = Bit15; InterruptPin16 = Bit16; InterruptPin17 = Bit17; InterruptPin18 = Bit18; InterruptPin19 = Bit19; InterruptPin20 = Bit20; InterruptPin21 = Bit21; InterruptPin22 = Bit22; InterruptPin23 = Bit23; InterruptPin24 = Bit24; InterruptPin25 = Bit25; InterruptPin26 = Bit26; InterruptPin27 = Bit27; InterruptPin28 = Bit28; InterruptPin29 = Bit29; InterruptPin30 = Bit30; InterruptPin31 = Bit31; CapturePin0 = Bit0; CapturePin1 = Bit1; CapturePin2 = Bit2; CapturePin3 = Bit3; CapturePin4 = Bit4; CapturePin5 = Bit5; CapturePin6 = Bit6; CapturePin7 = Bit7; CapturePin8 = Bit8; CapturePin9 = Bit9; CapturePin10 = Bit10; CapturePin11 = Bit11; CapturePin12 = Bit12; CapturePin13 = Bit13; CapturePin14 = Bit14; CapturePin15 = Bit15; CapturePin16 = Bit16; CapturePin17 = Bit17; CapturePin18 = Bit18; CapturePin19 = Bit19; CapturePin20 = Bit20; CapturePin21 = Bit21; CapturePin22 = Bit22; CapturePin23 = Bit23; CapturePin24 = Bit24; CapturePin25 = Bit25; CapturePin26 = Bit26; CapturePin27 = Bit27; CapturePin28 = Bit28; CapturePin29 = Bit29; CapturePin30 = Bit30; CapturePin31 = Bit31; components new HplSam3GeneralIOPortP(pio_addr) as Port; HplPort = Port.HplPort; PIOIrqControl = Port.PIOIrqControl; PIOClockControl = Port.PIOClockControl; Bit0.HplPort -> Port.Bits[0]; Bit1.HplPort -> Port.Bits[1]; Bit2.HplPort -> Port.Bits[2]; Bit3.HplPort -> Port.Bits[3]; Bit4.HplPort -> Port.Bits[4]; Bit5.HplPort -> Port.Bits[5]; Bit6.HplPort -> Port.Bits[6]; Bit7.HplPort -> Port.Bits[7]; Bit8.HplPort -> Port.Bits[8]; Bit9.HplPort -> Port.Bits[9]; Bit10.HplPort -> Port.Bits[10]; Bit11.HplPort -> Port.Bits[11]; Bit12.HplPort -> Port.Bits[12]; Bit13.HplPort -> Port.Bits[13]; Bit14.HplPort -> Port.Bits[14]; Bit15.HplPort -> Port.Bits[15]; Bit16.HplPort -> Port.Bits[16]; Bit17.HplPort -> Port.Bits[17]; Bit18.HplPort -> Port.Bits[18]; Bit19.HplPort -> Port.Bits[19]; Bit20.HplPort -> Port.Bits[20]; Bit21.HplPort -> Port.Bits[21]; Bit22.HplPort -> Port.Bits[22]; Bit23.HplPort -> Port.Bits[23]; Bit24.HplPort -> Port.Bits[24]; Bit25.HplPort -> Port.Bits[25]; Bit26.HplPort -> Port.Bits[26]; Bit27.HplPort -> Port.Bits[27]; Bit28.HplPort -> Port.Bits[28]; Bit29.HplPort -> Port.Bits[29]; Bit30.HplPort -> Port.Bits[30]; Bit31.HplPort -> Port.Bits[31]; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/pins/HplSam3GeneralIOPort.nc000066400000000000000000000040751207233610700255250ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ interface HplSam3GeneralIOPort { // signals that the interrupt for a specific pin happened async event void fired(uint32_t time); // enables the interrupt on this port async command void enableInterrupt(); // disable the interrupt on this port async command void disableInterrupt(); // enables the peripheral clock async command void enableClock(); // disables the clock if it is not used by anyone async command void disableClock(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/pins/HplSam3GeneralIOPortP.nc000066400000000000000000000107171207233610700256450ustar00rootroot00000000000000/** * "Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ uint32_t clocks = 0; generic module HplSam3GeneralIOPortP(uint32_t pio_addr) { provides { interface HplSam3GeneralIOPort as Bits [uint8_t bit]; } uses { interface HplSam3GeneralIOPort as HplPort; interface HplNVICInterruptCntl as PIOIrqControl; interface HplSam3PeripheralClockCntl as PIOClockControl; } } implementation { uint32_t isr = 0; bool isPending(uint8_t bit) { uint32_t currentpin; // make sure to not loose state for other bits! atomic { isr |= *((volatile uint32_t *) (pio_addr + 0x04C)); currentpin = (isr & (1 << bit)) >> bit; // remove bit isr &= ~( 1 << bit); } return ((currentpin & 1) == 1); } async event void HplPort.fired(uint32_t time) { uint8_t i; uint32_t isrMasked; atomic { // make sure to not loose state for other bits! isr |= *((volatile uint32_t *) (pio_addr + 0x04C)); // only look at pins where the interrupt is enabled isrMasked = isr & *((volatile uint32_t *) (pio_addr + 0x048)); // find out which port for(i=0; i<32; i++){ if(isrMasked & (1 << i)) { signal Bits.fired[i](time); } } // remove signaled bits from isr isr &= ~isrMasked; } } async command void Bits.enableInterrupt[uint8_t bit]() { // Enable the PIO clock if not already enabled (state checked internally) call Bits.enableClock[bit](); // check if the NVIC is already enabled if(call PIOIrqControl.getActive() == 0) { call PIOIrqControl.configure(IRQ_PRIO_PIO); call PIOIrqControl.enable(); } } async command void Bits.disableInterrupt[uint8_t bit]() { // Disable the PIO clock if no one else needs it (state checked internally) call Bits.disableClock[bit](); // if all the interrupts are disabled, disable the NVIC. if(*((volatile uint32_t *) (pio_addr + 0x048)) == 0) { call PIOIrqControl.disable(); } } async command void Bits.enableClock[uint8_t bit]() { atomic { // only enable the peripheral clock if no one else has enabled it. if(!clocks) call PIOClockControl.enable(); clocks |= (1<pcer; pcer.flat |= ( 1 << pid ); ((volatile pmc_pc_t *) (pio_addr))->pcer = pcer; } async command void Cntl.disable() { pmc_pcdr_t pcdr = ((volatile pmc_pc_t *) (pio_addr))->pcdr; pcdr.flat |= ( 1 << pid ); ((volatile pmc_pc_t *) (pio_addr))->pcdr = pcdr; } async command bool Cntl.status() { if(((volatile pmc_pc_t *) (pio_addr))->pcsr.flat & (1 << pid)) return TRUE; else return FALSE; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/pmc/pmchardware.h000066400000000000000000000400141207233610700236060ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Power Management Controller register definitions. * * @author Thomas Schmid */ #ifndef PMCHARDWARE_H #define PMCHARDWARE_H /** * PMC System Clock Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 482 * 0: no effect * 1: enable clock */ typedef union { uint32_t flat; struct { uint8_t reserved0 : 8; uint8_t pck0 : 1; // enables clock output 0 uint8_t pck1 : 1; // enables clock output 1 uint8_t pck2 : 1; // enables clock output 2 uint8_t reserved1 : 5; uint16_t reserved2 : 16; } __attribute__((__packed__)) bits; } pmc_scer_t; /** * PMC System Clock Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 483 * 0: no effect * 1: disable clock */ typedef union { uint32_t flat; struct { uint8_t reserved0 : 8; uint8_t pck0 : 1; // disables clock output 0 uint8_t pck1 : 1; // disables clock output 1 uint8_t pck2 : 1; // disables clock output 2 uint8_t reserved1 : 5; uint16_t reserved2 : 16; } __attribute__((__packed__)) bits; } pmc_scdr_t; /** * PMC System Clock Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 484 * 0: clock disabled * 1: clock enabled */ typedef union { uint32_t flat; struct { uint8_t reserved0 : 8; uint8_t pck0 : 1; // status of clock output 0 uint8_t pck1 : 1; // status of clock output 1 uint8_t pck2 : 1; // status of clock output 2 uint8_t reserved1 : 5; uint16_t reserved2 : 16; } __attribute__((__packed__)) bits; } pmc_scsr_t; /** * PMC Clock Generator Main Oscillator Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 489 * * Note: You have to write 'key' together with every other operation, or else * the write gets aborted. */ typedef union { uint32_t flat; struct { uint8_t moscxten : 1; // main crtystal oscillator enable uint8_t moscxtby : 1; // main crystal oscillator bypass uint8_t waitmode : 1; // wait mode command uint8_t moscrcen : 1; // main on-chip rc oscillator enable uint8_t moscrcf : 3; // main on-chip rc oscillator frequency selection (0: 4MHz, 1: 8MHz, 2: 12MHz, 3: reserved) uint8_t reserved0 : 1; uint8_t moscxtst : 8; // main crystal oscillator start-up time (in slow clock cycles times 8 uint8_t key : 8; // should be written at value 0x37 uint8_t moscsel : 1; // main oscillator selection (0: on-chip RC, 1: main crystal) uint8_t cfden : 1; // clock failure detector enable uint8_t reserved1 : 6; } __attribute__((__packed__)) bits; } pmc_mor_t; #define PMC_MOR_KEY 0x37 /** * PMC Clock Generator Main Clock Frequency Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 490 * read-only */ typedef union { uint32_t flat; struct { uint16_t mainf : 16; // gives the number of main clock cycles within 16 slow clock periods uint8_t mainfrdy : 1; // main clock ready uint16_t reserved0 : 15; } __attribute__((__packed__)) bits; } pmc_mcfr_t; /** * PMC Clock Generator PLLA Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 491 * Note: bit 29 must always be set to 1 when writing this register! */ typedef union { uint32_t flat; struct { uint32_t diva : 8; // divider uint32_t pllacount : 6; // plla counter, specifies the number of slow clock cycles times 8 uint32_t reserved0 : 2; // was start mode. no longer exists! uint32_t mula : 11; // PLLA Multiplier uint32_t reserved1 : 2; uint32_t bit29 : 1; // ALWAYS SET THIS TO 1!!!!!! uint32_t reserved2 : 2; } __attribute__((__packed__)) bits; } pmc_pllar_t; #define PMC_PLLAR_STMODE_FAST_STARTUP 0 #define PMC_PLLAR_STMODE_NORMAL_STARTUP 2 /** * PMC Master Clock Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 493 */ typedef union { uint32_t flat; struct { uint8_t css : 2; // master clock source select uint8_t reserved0 : 2; uint8_t pres : 3; // processor clock prescaler uint8_t reserved1 : 1; uint8_t reserved2 : 5; uint8_t uplldiv : 1; // upll clock divider by 1 or 2 uint8_t reserved3 : 2; uint16_t reserved4 : 16; } __attribute__((__packed__)) bits; } pmc_mckr_t; #define PMC_MCKR_CSS_SLOW_CLOCK 0 #define PMC_MCKR_CSS_MAIN_CLOCK 1 #define PMC_MCKR_CSS_PLLA_CLOCK 2 #define PMC_MCKR_CSS_UPLL_CLOCK 3 #define PMC_MCKR_PRES_DIV_1 0 #define PMC_MCKR_PRES_DIV_2 1 #define PMC_MCKR_PRES_DIV_4 2 #define PMC_MCKR_PRES_DIV_8 3 #define PMC_MCKR_PRES_DIV_16 4 #define PMC_MCKR_PRES_DIV_32 5 #define PMC_MCKR_PRES_DIV_64 6 #define PMC_MCKR_PRES_DIV_3 7 #define PMC_MCKR_UPLLDIV_1 0 #define PMC_MCKR_UPLLDIV_2 1 /** * PMC Programmable Clock Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 494 */ typedef union { uint32_t flat; struct { uint8_t css : 3; // programmable clock source selection uint8_t reserved0 : 1; uint8_t pres : 3; // programmable clock prescaler uint8_t reserved1 : 1; uint8_t reserved2 : 8; uint16_t reserved3: 16; } __attribute__((__packed__)) bits; } pmc_pck_t; #define PMC_PCKX_CSS_SLOW_CLOCK 0 #define PMC_PCKX_CSS_MAIN_CLOCK 1 #define PMC_PCKX_CSS_PLLA_CLOCK 2 #define PMC_PCKX_CSS_UPLL_CLOCK 3 #define PMC_PCKX_CSS_MASTER_CLOCK 4 #define PMC_PCKX_PRES_DIV_1 0 #define PMC_PCKX_PRES_DIV_2 1 #define PMC_PCKX_PRES_DIV_4 2 #define PMC_PCKX_PRES_DIV_8 3 #define PMC_PCKX_PRES_DIV_16 4 #define PMC_PCKX_PRES_DIV_32 5 #define PMC_PCKX_PRES_DIV_64 6 /** * PMC Interrupt Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 495 */ typedef union { uint32_t flat; struct { uint8_t moscxts : 1; // main crystal oscillator status interrupt enable uint8_t locka : 1; // pll a lock interrupt enable uint8_t reserved0 : 1; uint8_t mckrdy : 1; // master clock ready interrupt enable uint8_t reserved1 : 2; uint8_t locku : 1; // utmi pll lock interrupt enable uint8_t reserved2 : 1; uint8_t pckrdy0 : 1; // programmable clock 0 ready interrupt enable uint8_t pckrdy1 : 1; // programmable clock 1 ready interrupt enable uint8_t pckrdy2 : 1; // programmable clock 2 ready interrupt enable uint8_t reserved3 : 5; uint8_t moscsels : 1; // main oscillator selection status interrupt enable uint8_t moscrcs : 1; // main on-chip rc status interrupt enable uint8_t cfdev : 1; // clock failure detector event interrupt enable uint16_t reserved4 : 13; } __attribute__((__packed__)) bits; } pmc_ier_t; /** * PMC Interrupt Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 496 */ typedef union { uint32_t flat; struct { uint8_t moscxts : 1; // main crystal oscillator status interrupt disable uint8_t locka : 1; // pll a lock interrupt disable uint8_t reserved0 : 1; uint8_t mckrdy : 1; // master clock ready interrupt disable uint8_t reserved1 : 2; uint8_t locku : 1; // utmi pll lock interrupt disable uint8_t reserved2 : 1; uint8_t pckrdy0 : 1; // programmable clock 0 ready interrupt disable uint8_t pckrdy1 : 1; // programmable clock 1 ready interrupt disable uint8_t pckrdy2 : 1; // programmable clock 2 ready interrupt disable uint8_t reserved3 : 5; uint8_t moscsels : 1; // main oscillator selection status interrupt disable uint8_t moscrcs : 1; // main on-chip rc status interrupt disable uint8_t cfdev : 1; // clock failure detector event interrupt disable uint16_t reserved4 : 13; } __attribute__((__packed__)) bits; } pmc_idr_t; /** * PMC Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 497 */ typedef union { uint32_t flat; struct { uint8_t moscxts : 1; // main crystal oscillator stabilized uint8_t locka : 1; // pll a locked uint8_t reserved0 : 1; uint8_t mckrdy : 1; // master clock ready uint8_t reserved1 : 2; uint8_t locku : 1; // utmi pll locked uint8_t oscsels : 1; // Slow clock oscillator selection (0: rc osc, 1: external clock) uint8_t pckrdy0 : 1; // programmable clock 0 ready uint8_t pckrdy1 : 1; // programmable clock 1 ready uint8_t pckrdy2 : 1; // programmable clock 2 ready uint8_t reserved2 : 5; uint8_t moscsels : 1; // main oscillator selection (0: done, 1: in progress uint8_t moscrcs : 1; // main on-chip rc stabilized uint8_t cfdev : 1; // clock failure detector event since last read uint8_t cfds : 1; // clock failure detected uint8_t fos : 1; // clock failure detector fault output status uint16_t reserved3 : 11; } __attribute__((__packed__)) bits; } pmc_sr_t; /** * PMC Interrupt Mask Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 499 */ typedef union { uint32_t flat; struct { uint8_t moscxts : 1; // main crystal oscillator status interrupt mask uint8_t locka : 1; // pll a lock interrupt mask uint8_t reserved0 : 1; uint8_t mckrdy : 1; // master clock ready interrupt mask uint8_t reserved1 : 2; uint8_t locku : 1; // utmi pll lock interrupt mask uint8_t reserved2 : 1; uint8_t pckrdy0 : 1; // programmable clock 0 ready interrupt mask uint8_t pckrdy1 : 1; // programmable clock 1 ready interrupt mask uint8_t pckrdy2 : 1; // programmable clock 2 ready interrupt mask uint8_t reserved3 : 5; uint8_t moscsels : 1; // main oscillator selection status interrupt mask uint8_t moscrcs : 1; // main on-chip rc status interrupt mask uint8_t cfdev : 1; // clock failure detector event interrupt mask uint16_t reserved4 : 13; } __attribute__((__packed__)) bits; } pmc_imr_t; /** * PMC Fast Startup Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 500 */ typedef union { uint32_t flat; struct { uint8_t fstt0 : 1; // fast startup input enable 0 uint8_t fstt1 : 1; // fast startup input enable 1 uint8_t fstt2 : 1; // fast startup input enable 2 uint8_t fstt3 : 1; // fast startup input enable 3 uint8_t fstt4 : 1; // fast startup input enable 4 uint8_t fstt5 : 1; // fast startup input enable 5 uint8_t fstt6 : 1; // fast startup input enable 6 uint8_t fstt7 : 1; // fast startup input enable 7 uint8_t fstt8 : 1; // fast startup input enable 8 uint8_t fstt9 : 1; // fast startup input enable 9 uint8_t fstt10 : 1; // fast startup input enable 10 uint8_t fstt11 : 1; // fast startup input enable 11 uint8_t fstt12 : 1; // fast startup input enable 12 uint8_t fstt13 : 1; // fast startup input enable 13 uint8_t fstt14 : 1; // fast startup input enable 14 uint8_t fstt15 : 1; // fast startup input enable 15 uint8_t rttal : 1; // RTT alarm enable uint8_t rtcal : 1; // RTC alarm enable uint8_t usbal : 1; // USB alarm enable uint8_t reserved0 : 1; uint8_t lpm : 1; // low power mode (0: wfi or wfe makes processor go into idle mode, 1: wfe makes processor go into wait mode) uint16_t reserved1 : 11; } __attribute__((__packed__)) bits; } pmc_fsmr_t; /** * PMC Fast Startup Polarity Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 501 */ typedef union { uint32_t flat; struct { uint8_t fstt0 : 1; // fast startup input 0 uint8_t fstt1 : 1; // fast startup input 1 uint8_t fstt2 : 1; // fast startup input 2 uint8_t fstt3 : 1; // fast startup input 3 uint8_t fstt4 : 1; // fast startup input 4 uint8_t fstt5 : 1; // fast startup input 5 uint8_t fstt6 : 1; // fast startup input 6 uint8_t fstt7 : 1; // fast startup input 7 uint8_t fstt8 : 1; // fast startup input 8 uint8_t fstt9 : 1; // fast startup input 9 uint8_t fstt10 : 1; // fast startup input 10 uint8_t fstt11 : 1; // fast startup input 11 uint8_t fstt12 : 1; // fast startup input 12 uint8_t fstt13 : 1; // fast startup input 13 uint8_t fstt14 : 1; // fast startup input 14 uint8_t fstt15 : 1; // fast startup input 15 uint16_t reserved0 : 16; } __attribute__((__packed__)) bits; } pmc_fspr_t; /** * PMC Fault Output Clear Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 502 */ typedef union { uint32_t flat; struct { uint8_t foclr : 1; // fault output clear uint32_t reserved0 : 31; } __attribute__((__packed__)) bits; } pmc_focr_t; /** * PMC Write Protect Mode Register. */ typedef union { uint32_t flat; struct { uint32_t wpen : 1; // Write Protect Enable uint32_t reserved0 : 7; uint32_t wpkey : 24; // Write Protect Key } __attribute__((__packed__)) bits; } pmc_wpmr_t; #define PMC_WPMR_WPKEY 0x504D43 /** * PMC Write Protect Status Register. */ typedef union { uint32_t flat; struct { uint32_t wpvs : 1; // Write Protect Violation Status uint32_t reserved0 : 7; uint32_t wpvsrc : 16; // Write Protect Violation Source uint32_t reserved1 : 8; } __attribute__((__packed__)) bits; } pmc_wpsr_t; #endif // PMCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/000077500000000000000000000000001207233610700206245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/McuSleepC.nc000066400000000000000000000230621207233610700227710ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas schmid */ #include "hardware.h" #include "sam3snvichardware.h" #include "sam3spmchardware.h" #include "sam3ssupchardware.h" #include "sam3rtthardware.h" //#include "sam3stchardware.h" module McuSleepC { provides{ interface McuSleep; interface McuPowerState; interface Sam3LowPower; interface FunctionWrapper as InterruptWrapper; } uses { interface HplSam3Clock; } } implementation{ #define PMC_PIO_CLOCK_MASK 0x3FFFFFFC enum { S_AWAKE, S_SLEEP, S_WAIT, S_BACKUP, }; norace uint32_t ps; norace struct { } wait_restore; // This C function is defined so that we can call it // from platform_bootstrap(), as defined in platform.h void sam3LowPowerConfigure() @C() @spontaneous() { call Sam3LowPower.configure(); } async command void Sam3LowPower.configure() { // Customize pio settings as appropriate for the platform signal Sam3LowPower.customizePio(); } uint32_t getPowerState() { //if (PMC->pcsr.flat & PMC_PIO_CLOCK_MASK) if ((PMC->pc.pcsr.flat > 0) || (PMC->pc1.pcsr.flat > 0)) return S_SLEEP; else return S_WAIT; } void commonSleep() { // Check if any alarms are set for the tc2 alarm hardware. // If not, turn off its peripheral clock // This is necessary because the TMicro alarm is linked to tc2. // More logic will need to be added here later, as more alarms are set up // for use. //if(!(TC->ch2.imr.bits.cpcs & 0x01)) // PMC->pcdr.bits.tc2 = 1; } void commonResume() { // Turn the periperhal clock for tc2 back on so that its alarm can be // set and times can be read from it //PMC->pcer.bits.tc2 = 1; } void setupSleepMode() { // Nothing special to do here yet } void resumeFromSleepMode() { // Nothing special to do here yet } void setupWaitMode() { // Save the state of the cpu we are about to change /* wait_restore.mck = call HplSam3Clock.getMainClockSpeed(); wait_restore.adc_emr = ADC12B->emr; wait_restore.pmc_pcsr = PMC->pcsr; wait_restore.pmc_uckr = PMC->uckr; wait_restore.supc_mr = SUPC->mr; wait_restore.pioa_psr = AT91C_BASE_PIOA->PIO_PSR; wait_restore.piob_psr = AT91C_BASE_PIOB->PIO_PSR; wait_restore.pioc_psr = AT91C_BASE_PIOC->PIO_PSR; wait_restore.pioa_osr = AT91C_BASE_PIOA->PIO_OSR; wait_restore.piob_osr = AT91C_BASE_PIOB->PIO_OSR; wait_restore.pioc_osr = AT91C_BASE_PIOC->PIO_OSR; wait_restore.pioa_pusr = AT91C_BASE_PIOA->PIO_PPUSR; wait_restore.piob_pusr = AT91C_BASE_PIOB->PIO_PPUSR; wait_restore.pioc_pusr = AT91C_BASE_PIOC->PIO_PPUSR; */ // Turn off all clocks to peripheral IO and configure pins // appropriately, so that when we go to sleep we are // drawing the least amount of current possible call Sam3LowPower.configure(); // Force us into 4 MHz with the RC Oscillator /* call HplSam3Clock.mckInit4RC(); // Setup for wait mode PMC->fsmr.bits.lpm = 1; // Only resume from wait mode with an input from the RTT PMC->fsmr.bits.rttal = 1; // Make sure we DON'T go into deep sleep (i.e. backup mode) SCB->scr.bits.sleepdeep = 0; */ } void resumeFromWaitMode() { // Restore the old clock settings /* uint32_t oldMck = wait_restore.mck; if(oldMck > 13000 && oldMck < 49000){ call HplSam3Clock.mckInit48(); }else if(oldMck > 49000 && oldMck < 90000){ call HplSam3Clock.mckInit84(); }else if(oldMck > 90000){ call HplSam3Clock.mckInit96(); } // Restore the ADC to its previous mode ADC12B->emr = wait_restore.adc_emr; // Reenable peripheral clocks, as appropriate PMC->pcer.flat = wait_restore.pmc_pcsr.flat; PMC->pcdr.flat = ~wait_restore.pmc_pcsr.flat; // Reenable the UTMI clock, as appropriate PMC->uckr = wait_restore.pmc_uckr; // Reenable brownout detector, as appropriate { supc_mr_t mr; mr = wait_restore.supc_mr; mr.bits.key = 0xA5; SUPC->mr = mr; } */ // Restore the PIO output/input pin and pullup resistor // settings to the values they had before entering wait mode /* AT91C_BASE_PIOA->PIO_PER = wait_restore.pioa_psr; AT91C_BASE_PIOB->PIO_PER = wait_restore.piob_psr; AT91C_BASE_PIOC->PIO_PER = wait_restore.pioc_psr; AT91C_BASE_PIOA->PIO_PDR = ~wait_restore.pioa_psr; AT91C_BASE_PIOB->PIO_PDR = ~wait_restore.piob_psr; AT91C_BASE_PIOC->PIO_PDR = ~wait_restore.pioc_psr; AT91C_BASE_PIOA->PIO_OER = wait_restore.pioa_osr; AT91C_BASE_PIOB->PIO_OER = wait_restore.piob_osr; AT91C_BASE_PIOC->PIO_OER = wait_restore.pioc_osr; AT91C_BASE_PIOA->PIO_ODR = ~wait_restore.pioa_osr; AT91C_BASE_PIOB->PIO_ODR = ~wait_restore.piob_osr; AT91C_BASE_PIOC->PIO_ODR = ~wait_restore.pioc_osr; // Notice the reverse logic below - its on purpose, check the data sheet // 0 means active, 1 means inactive AT91C_BASE_PIOA->PIO_PPUER = ~wait_restore.pioa_pusr; AT91C_BASE_PIOB->PIO_PPUER = ~wait_restore.piob_pusr; AT91C_BASE_PIOC->PIO_PPUER = ~wait_restore.pioc_pusr; AT91C_BASE_PIOA->PIO_PPUDR = wait_restore.pioa_pusr; AT91C_BASE_PIOB->PIO_PPUDR = wait_restore.piob_pusr; AT91C_BASE_PIOC->PIO_PPUDR = wait_restore.pioc_pusr; */ } void setupBackupMode() { // Not yet supported.... // Need to think more about how to do this since it is essentially a "hibernate" // mode, meaning we will have to save all register and memory state into // non-volatile memory. Possibly more state will need to be saved as well. } void resumeFromBackupMode() { // Not yet supported.... // Need to think more about how to do this since it is essentially a "hibernate" // mode and resuming will be from a reboot, not a simple interrupt service routine // Consider changing vectors.c to call out to this after checking some state variable // stored in the internal EEFC. } async command void McuSleep.sleep() { commonSleep(); switch(ps = getPowerState()) { case S_AWAKE: //Just stay awake... break; case S_SLEEP: // Setup for sleep mode setupSleepMode(); break; case S_WAIT: // Setup for wait mode setupWaitMode(); break; case S_BACKUP: // Setup for backup mode setupBackupMode(); break; default: // Default setup setupSleepMode(); } __nesc_enable_interrupt(); /** * We need to disable sleep while debugging. Else, the GDB connection gets * disconnected. */ #ifndef DEBUG_CORE // Enter appropriate idle mode if(ps != S_AWAKE) __asm volatile ("wfe"); #endif // Normally, at this point we can only be woken up by an interrupt, so execution continues // in the body of the InterruptWrapper.preamble() command before returning to here // However, if we never actually went to sleep, we need to force this command to run. if(ps == S_AWAKE) call InterruptWrapper.preamble(); // all of memory may change at this point, because an IRQ handler // may have posted a task! asm volatile("" : : : "memory"); __nesc_disable_interrupt(); } async command void InterruptWrapper.preamble() { atomic { switch(ps) { case S_AWAKE: // Stayed awake the whole time, so do nothing break; case S_SLEEP: // Resume from sleep mode resumeFromSleepMode(); break; case S_WAIT: // Resume from wait mode resumeFromWaitMode(); break; case S_BACKUP: // Resume from backup mode resumeFromBackupMode(); break; default: // Default resume resumeFromSleepMode(); } if(ps != S_AWAKE) commonResume(); ps = S_AWAKE; } } async command void InterruptWrapper.postamble() { /* Do nothing */ } async command void McuPowerState.update(){} async event void HplSam3Clock.mainClockChanged(){} default async event void Sam3LowPower.customizePio() {} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/adc/000077500000000000000000000000001207233610700213535ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/adc/AdcP.nc000066400000000000000000000171101207233610700225040ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #include "sam3sadchardware.h" module AdcP { provides { interface Read as Read[uint8_t client]; interface ReadNow as ReadNow[uint8_t client]; interface Resource as ResourceReadNow[uint8_t client]; } uses { // for Read only: interface Resource as ResourceRead[uint8_t client]; // for ReadNow only: interface Resource as SubResourceReadNow[uint8_t client]; // for Read and ReadNow: interface Sam3sGetAdc as GetAdc[uint8_t client]; interface AdcConfigure as Config[uint8_t client]; interface Leds; } } implementation { norace uint8_t state; norace uint8_t readNowClient; norace uint8_t setClient; norace uint16_t adcResult; enum { S_READ, S_READNOW, }; error_t configureAdcRegisters(uint8_t client) { const sam3s_adc_channel_config_t * ONE config; config = call Config.getConfiguration[client](); return call GetAdc.configureAdc[client](config); } /** Read.read - TEP 114 **/ command error_t Read.read[uint8_t client]() { state = S_READ; call Leds.led1Toggle(); return call ResourceRead.request[client](); } event void ResourceRead.granted[uint8_t client]() { error_t result = configureAdcRegisters(client); if(result == SUCCESS){ //call actual read! call GetAdc.getData[client](); }else{ //configure failed! call ResourceRead.release[client](); signal Read.readDone[client](result, 0); } } /************************************************/ /** ReadNow.read **/ async command error_t ReadNow.read[uint8_t nowClient]() { if(call SubResourceReadNow.isOwner[nowClient]()){ return call GetAdc.getData[nowClient](); }else{ return FAIL; } } task void signalGranted(){ error_t error = configureAdcRegisters(readNowClient); if(error == SUCCESS){ state = S_READNOW; }else{ // config error } signal ResourceReadNow.granted[readNowClient](); } async command error_t ResourceReadNow.request[uint8_t nowClient]() { if(!call SubResourceReadNow.isOwner[nowClient]()) return call SubResourceReadNow.request[nowClient](); else{ atomic readNowClient = nowClient; post signalGranted(); return SUCCESS; } } event void SubResourceReadNow.granted[uint8_t nowClient]() { error_t error = configureAdcRegisters(nowClient); if(error == SUCCESS){ state = S_READNOW; }else{ // config error } signal ResourceReadNow.granted[nowClient](); } async command error_t ResourceReadNow.immediateRequest[uint8_t nowClient]() { error_t result = call SubResourceReadNow.immediateRequest[nowClient](); if (result == SUCCESS){ result = configureAdcRegisters(nowClient); if (result == SUCCESS) state = S_READNOW; } return result; } async command error_t ResourceReadNow.release[uint8_t nowClient]() { return call SubResourceReadNow.release[nowClient](); } async command bool ResourceReadNow.isOwner[uint8_t nowClient]() { return call SubResourceReadNow.isOwner[nowClient](); } /** Read Done **/ void task readDone() { call ResourceRead.release[setClient](); signal Read.readDone[setClient](SUCCESS, adcResult); } void task readDoneNow() { signal ReadNow.readDone[setClient](SUCCESS, adcResult); } /************************************************/ /** Data is ready! **/ async event error_t GetAdc.dataReady[uint8_t client](uint16_t data) { atomic setClient = client; atomic adcResult = data; switch (state) { case S_READ: call ResourceRead.release[client](); post readDone(); break; case S_READNOW: post readDoneNow(); break; default: break; } return SUCCESS; } /************************************************/ const sam3s_adc_channel_config_t defaultConfig = { channel: 0, trgen : 0, // 0: trigger disabled trgsel : 0, // 0: external trigger lowres : 0, // 0: 12-bit sleep : 0, // 0: normal, adc core and vref are kept on between conversions fwup : 0, // 0: normal, sleep mode is defined by sleep bit freerun : 0, // 0: normal mode, wait for trigger prescal : 2, // ADCClock = MCK / ((prescal + 1)*2) startup : 7, // 112 periods of ADCClock settling : 1, // 5 periods of ADCClock anach : 0, // 0: no analog changed on channel switching tracktim : 1, // Tracking Time = (tracktim + 1) * ADCClock periods transfer : 1, // Transfer Period = (transfer*1+3) * ADCClock periods useq : 0, // 0: normal, converts channel in sequence ibctl : 1, diff : 0, gain : 0, offset : 0, }; default async command error_t ResourceRead.request[uint8_t client]() { return FAIL; } default async command error_t ResourceRead.immediateRequest[uint8_t client]() { return FAIL; } default async command error_t ResourceRead.release[uint8_t client]() { return FAIL; } default async command bool ResourceRead.isOwner[uint8_t client]() { return FALSE; } default event void Read.readDone[uint8_t client]( error_t result, uint16_t val ){} default async command error_t SubResourceReadNow.release[uint8_t nowClient](){ return FAIL;} default async command error_t SubResourceReadNow.request[uint8_t nowClient](){ return FAIL; } default async command bool SubResourceReadNow.isOwner[uint8_t client]() { return FALSE; } default event void ResourceReadNow.granted[uint8_t nowClient](){} default async event void ReadNow.readDone[uint8_t client]( error_t result, uint16_t val ){} default async command error_t SubResourceReadNow.immediateRequest[uint8_t nowClient]() { return FAIL; } default async command error_t GetAdc.getData[uint8_t client](){ return EINVAL; } default async command const sam3s_adc_channel_config_t* Config.getConfiguration[uint8_t client]() { return &defaultConfig; } default async command error_t GetAdc.configureAdc[uint8_t client](const sam3s_adc_channel_config_t *config){ return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/adc/AdcReadClientC.nc000066400000000000000000000042011207233610700244170ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #include "sam3sadchardware.h" generic configuration AdcReadClientC() { provides { interface Read; } uses interface AdcConfigure; } implementation { components AdcP; components new Sam3sAdcClientC(); enum { CLIENT = unique(ADCC_SERVICE), }; Read = AdcP.Read[CLIENT]; AdcConfigure = AdcP.Config[CLIENT]; AdcP.GetAdc[CLIENT] -> Sam3sAdcClientC.Sam3sGetAdc; AdcP.ResourceRead[CLIENT] -> Sam3sAdcClientC.Resource; components NoLedsC as Leds; AdcP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/adc/AdcReadNowClientC.nc000066400000000000000000000042421207233610700251100ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #include "sam3sadchardware.h" generic configuration AdcReadNowClientC() { provides { interface ReadNow; interface Resource; } uses interface AdcConfigure; } implementation { components AdcP; components new Sam3sAdcClientC(); enum { CLIENT = unique(ADCC_SERVICE), }; ReadNow = AdcP.ReadNow[CLIENT]; AdcConfigure = AdcP.Config[CLIENT]; Resource = AdcP.ResourceReadNow[CLIENT]; AdcP.GetAdc[CLIENT] -> Sam3sAdcClientC.Sam3sGetAdc; AdcP.SubResourceReadNow[CLIENT] -> Sam3sAdcClientC.Resource; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/adc/AdcReadStreamClientC.nc000066400000000000000000000044201207233610700255760ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #include "sam3sadchardware.h" generic configuration AdcReadStreamClientC() { provides { interface ReadStream; } uses interface AdcConfigure; } implementation { #ifndef SAM3S_ADC_PDC components AdcStreamP; #else components AdcStreamPDCP as AdcStreamP; #endif components new Sam3sAdcClientC(); components WireAdcStreamP; enum { CLIENT = unique(ADCC_READ_STREAM_SERVICE), }; ReadStream = WireAdcStreamP.ReadStream[CLIENT]; AdcConfigure = WireAdcStreamP.AdcConfigure[CLIENT]; WireAdcStreamP.Resource[CLIENT] -> Sam3sAdcClientC.Resource; WireAdcStreamP.Sam3sGetAdc[CLIENT] -> Sam3sAdcClientC.Sam3sGetAdc; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/adc/AdcStreamP.nc000066400000000000000000000153471207233610700236720ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation for ReadStream interface in Sam3u * (Coverted msp430 and atm128 code) * @author JeongGil Ko * @author Thomas Schmid */ #include "sam3sadchardware.h" module AdcStreamP { provides { interface Init @atleastonce(); interface ReadStream[uint8_t client]; } uses { interface Sam3sGetAdc as GetAdc[uint8_t client]; interface AdcConfigure as Config[uint8_t client]; interface Alarm; interface Leds; } } implementation { enum { NSTREAM = uniqueCount(ADCC_READ_STREAM_SERVICE) }; norace uint8_t client = NSTREAM; struct list_entry_t { uint16_t count; struct list_entry_t * ONE_NOK next; }; struct list_entry_t *bufferQueue[NSTREAM]; struct list_entry_t * ONE_NOK * bufferQueueEnd[NSTREAM]; uint16_t * COUNT_NOK(lastCount) lastBuffer, lastCount; norace uint16_t count; norace uint16_t * COUNT_NOK(count) buffer; norace uint16_t * BND_NOK(buffer, buffer+count) pos; norace uint32_t now, period; command error_t Init.init() { uint8_t i; for (i = 0; i != NSTREAM; i++) bufferQueueEnd[i] = &bufferQueue[i]; return SUCCESS; } void sampleSingle() { call GetAdc.getData[client](); } error_t postBuffer(uint8_t c, uint16_t *buf, uint16_t n) { if (n < sizeof(struct list_entry_t)) return ESIZE; atomic { struct list_entry_t * ONE newEntry = TCAST(struct list_entry_t * ONE, buf); if (!bufferQueueEnd[c]) return FAIL; newEntry->count = n; newEntry->next = NULL; *bufferQueueEnd[c] = newEntry; bufferQueueEnd[c] = &newEntry->next; } return SUCCESS; } command error_t ReadStream.postBuffer[uint8_t c](uint16_t *buf, uint16_t n) { return postBuffer(c, buf, n); } task void readStreamDone() { uint8_t c = client; uint32_t actualPeriod = period; atomic { bufferQueue[c] = NULL; bufferQueueEnd[c] = &bufferQueue[c]; } client = NSTREAM; signal ReadStream.readDone[c](SUCCESS, actualPeriod); } task void readStreamFail() { struct list_entry_t *entry; uint8_t c = client; atomic entry = bufferQueue[c]; for (; entry; entry = entry->next) { uint16_t tmp_count __DEPUTY_UNUSED__ = entry->count; signal ReadStream.bufferDone[c](FAIL, TCAST(uint16_t * COUNT_NOK(tmp_count),entry), entry->count); } atomic { bufferQueue[c] = NULL; bufferQueueEnd[c] = &bufferQueue[c]; } client = NSTREAM; signal ReadStream.readDone[c](FAIL, 0); } task void bufferDone() { uint16_t *b, c; atomic { b = lastBuffer; c = lastCount; lastBuffer = NULL; } signal ReadStream.bufferDone[client](SUCCESS, b, c); } void nextAlarm() { call Alarm.startAt(now, period); now += period; } async event void Alarm.fired() { call Leds.led2Toggle(); sampleSingle(); } error_t nextBuffer(bool startNextAlarm) { atomic { struct list_entry_t *entry = bufferQueue[client]; if (!entry) { // all done bufferQueueEnd[client] = NULL; // prevent post post readStreamDone(); return FAIL; } else { uint16_t tmp_count; bufferQueue[client] = entry->next; if (!bufferQueue[client]) bufferQueueEnd[client] = &bufferQueue[client]; pos = buffer = NULL; count = entry->count; tmp_count = count; pos = buffer = TCAST(uint16_t * COUNT_NOK(tmp_count), entry); if (startNextAlarm) nextAlarm(); return SUCCESS; } } } command error_t ReadStream.read[uint8_t c](uint32_t usPeriod) { /* not exactly microseconds */ /* ADC is currently based on a 1.5MHz clock */ period = usPeriod; client = c; now = call Alarm.getNow(); call GetAdc.configureAdc[c](call Config.getConfiguration[c]()); if (nextBuffer(FALSE) == SUCCESS){ sampleSingle(); } return SUCCESS; } async event error_t GetAdc.dataReady[uint8_t streamClient](uint16_t data) { call Leds.led1Toggle(); if (client == NSTREAM) return FAIL; if (count == 0) { now = call Alarm.getNow(); nextBuffer(TRUE); } else { *pos++ = data; if (pos == buffer + count) { atomic { if (lastBuffer) { /* We failed to signal bufferDone in time. Fail. */ bufferQueueEnd[client] = NULL; // prevent post post readStreamFail(); return FAIL; } else { lastCount = count; lastBuffer = buffer; } } post bufferDone(); nextBuffer(TRUE); } else nextAlarm(); } return FAIL; } const sam3s_adc_channel_config_t defaultConfig = { }; default async command const sam3s_adc_channel_config_t* Config.getConfiguration[uint8_t c]() { return &defaultConfig; } default async command error_t GetAdc.getData[uint8_t c]() { return FAIL; } default async command error_t GetAdc.configureAdc[uint8_t c]( const sam3s_adc_channel_config_t *config){ return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/adc/AdcStreamPDCP.nc000066400000000000000000000107431207233610700242140ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation for ReadStream interface with PDC in Sam3 * @author JeongGil Ko */ #include "sam3sadchardware.h" module AdcStreamPDCP { provides { interface Init @atleastonce(); interface ReadStream[uint8_t client]; } uses { interface Sam3sGetAdc as GetAdc[uint8_t client]; interface AdcConfigure as Config[uint8_t client]; interface HplSam3Pdc as HplPdc; interface Leds; } } implementation { enum { NSTREAM = uniqueCount(ADCC_READ_STREAM_SERVICE) }; norace uint8_t client = NSTREAM; adc_cr_t cr; struct list_entry_t { uint16_t count; struct list_entry_t * ONE_NOK next; }; struct list_entry_t *bufferQueue[NSTREAM]; struct list_entry_t * ONE_NOK * bufferQueueEnd[NSTREAM]; uint16_t * COUNT_NOK(lastCount) lastBuffer, lastCount; norace uint16_t count; norace uint16_t * COUNT_NOK(count) buffer; norace uint16_t * BND_NOK(buffer, buffer+count) pos; norace uint32_t now, period; norace uint16_t originalLength; norace uint16_t *originalPointer; norace uint8_t state; enum{ S_READ, S_IDLE, }; command error_t Init.init() { uint8_t i; state = S_IDLE; for (i = 0; i != NSTREAM; i++) bufferQueueEnd[i] = &bufferQueue[i]; return SUCCESS; } void samplePdc() { // switch this to pdc enable call HplPdc.enablePdcRx(); atomic cr.bits.start = 1; // enable software trigger atomic ADC->cr = cr; } command error_t ReadStream.postBuffer[uint8_t c](uint16_t *buf, uint16_t n) { // set parameters here!!!! // set pdc buffers and set the length as a global parameter originalLength = n; originalPointer = buf; call HplPdc.setRxPtr(buf); call HplPdc.setRxCounter(n); return SUCCESS; } command error_t ReadStream.read[uint8_t c](uint32_t usPeriod) { period = usPeriod; client = c; call GetAdc.configureAdc[c](call Config.getConfiguration[c]()); state = S_READ; //samplePdc(); call GetAdc.getData[c](); call HplPdc.enablePdcRx(); return SUCCESS; } task void signalReadDone(){ signal ReadStream.readDone[client](SUCCESS, period); } task void signalBufferDone(){ signal ReadStream.bufferDone[client](SUCCESS, originalPointer, originalLength); } async event error_t GetAdc.dataReady[uint8_t streamClient](uint16_t data) { if(state == S_READ){ atomic state = S_IDLE; call HplPdc.disablePdcRx(); post signalReadDone(); post signalBufferDone(); } return SUCCESS; } const sam3s_adc_channel_config_t defaultConfig = { }; default async command const sam3s_adc_channel_config_t* Config.getConfiguration[uint8_t c]() { return &defaultConfig; } default async command error_t GetAdc.getData[uint8_t c]() { return FAIL; } default async command error_t GetAdc.configureAdc[uint8_t c]( const sam3s_adc_channel_config_t *config){ return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/adc/Sam3sAdcClientC.nc000066400000000000000000000036431207233610700245430ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #include "sam3sadchardware.h" generic configuration Sam3sAdcClientC() { provides { interface Resource; interface Sam3sGetAdc; } } implementation { components Sam3sAdcP; enum { ID = unique(SAM3SADC_RESOURCE), }; Resource = Sam3sAdcP.Resource[ID]; Sam3sGetAdc = Sam3sAdcP.Sam3sGetAdc[ID]; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/adc/Sam3sAdcImplP.nc000066400000000000000000000154771207233610700242530ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #include "sam3sadchardware.h" module Sam3sAdcImplP { provides { interface Init; interface Sam3sGetAdc as Sam3sAdc[uint8_t id]; } uses { interface HplNVICInterruptCntl as ADCInterrupt; interface HplSam3GeneralIOPin as AdcPin; interface HplSam3PeripheralClockCntl as AdcClockControl; interface HplSam3Clock as ClockConfig; interface FunctionWrapper as AdcInterruptWrapper; #ifdef SAM3S_ADC_PDC interface HplSam3Pdc as HplPdc; #endif interface Leds; } } implementation { norace uint8_t clientID; norace uint8_t state; norace uint8_t channel; enum{ S_ADC, S_IDLE, }; command error_t Init.init(){ /* Enable clock */ call AdcClockControl.enable(); ADC->idr.flat = 0x1f00ffff; // disable all interrupt sources ADC->idr.flat = 0x1f00ffff; // disable all interrupt sources /* Reset ADC */ ADC->cr.flat = 0x1; /* Configure interrupts */ call ADCInterrupt.configure(IRQ_PRIO_ADC); /* Set IO line */ call AdcPin.disablePioControl(); // Disable whatever is set currently call AdcPin.selectPeripheralD(); // set to peripheral D. All ADC pins are on D state = S_IDLE; return SUCCESS; } async command error_t Sam3sAdc.configureAdc[uint8_t id](const sam3s_adc_channel_config_t *config){ adc_chdr_t chdr; adc_idr_t idr; adc_cr_t cr; adc_mr_t mr; adc_acr_t acr; adc_cgr_t cgr = ADC->cgr; adc_cor_t cor = ADC->cor; adc_cher_t cher; adc_ier_t ier; channel = config->channel; //cher.flat = ADC->chsr.flat; // read from status cher.flat = 0; //ier.flat = ADC->imr.flat; // read from mask to see who is enabled ier.flat = 0; chdr.flat = 0x0000FFFF; ADC->chdr = chdr; // disable all channels during setup idr.flat = 0x1f00FFFF; ADC->idr = idr; // disable all interrupts during setup cher.flat |= (1 << config->channel); #ifndef SAM3S_ADC_PDC // enable channel interrupt ier.flat |= (1 << config->channel); #else // enable PDC channel interrupt ier.bits.rxbuff = 1; #endif cr.bits.swrst = 0; cr.bits.start = 0; // disable start bit for the configuration stage mr.bits.trgen = config->trgen; mr.bits.trgsel = config->trgsel ; mr.bits.lowres = config->lowres ; mr.bits.sleep = config->sleep ; mr.bits.fwup = config->fwup ; mr.bits.freerun = config->freerun ; mr.bits.prescal = config->prescal ; mr.bits.startup = config->startup ; mr.bits.settling = config->settling; mr.bits.anach = config->anach ; mr.bits.tracktim = config->tracktim; mr.bits.transfer = config->transfer; mr.bits.useq = config->useq ; acr.bits.ibctl = config->ibctl; cgr.flat &= (3 << (config->channel << 1)); cgr.flat |= (config->gain << (config->channel << 1)); if(config->diff) { cor.flat |= ((1 << config->channel) << 16); } else { cor.flat &= ~ ((1 << config->channel) << 16); } if(config->offset) { cor.flat |= ((1 << config->channel)); } else { cor.flat &= ~ (1 << config->channel); } call ADCInterrupt.enable(); call ADCInterrupt.clearPending(); // We have now locally modified all the register values // Write the register back in its respective memory space ADC->cher = cher; ADC->cr = cr; ADC->mr = mr; ADC->acr = acr; ADC->cgr = cgr; ADC->cor = cor; ADC->ier = ier; call Leds.led0Toggle(); return SUCCESS; } async command error_t Sam3sAdc.getData[uint8_t id](){ adc_cr_t cr; cr.flat = 0; call AdcClockControl.enable(); //call ADCInterrupt.enable(); //call ADCInterrupt.clearPending(); atomic clientID = id; if(state != S_IDLE){ return EBUSY; }else{ cr.bits.start = 1; // enable software trigger ADC->cr = cr; atomic state = S_ADC; call Leds.led1Toggle(); return SUCCESS; } } async event void ClockConfig.mainClockChanged(){} /* Get events (signals) from chips here! */ void handler() @spontaneous() { adc_cr_t cr; adc_isr_t isr = ADC->isr; uint16_t data = 0; call Leds.led2Toggle(); #ifndef SAM3S_ADC_PDC call ADCInterrupt.disable(); // read eoc for the current channel if(isr.flat & (1 << channel)){ data = ADC->cdr[channel].bits.data; cr.bits.start = 0; // disable software trigger ADC->cr = cr; //get data from register atomic state = S_IDLE; call AdcClockControl.disable(); signal Sam3sAdc.dataReady[clientID](data); } #else if(isr.bits.rxbuff){ //call ADCInterrupt.disable(); atomic { state = S_IDLE; cr.bits.start = 0; // enable software trigger ADC->cr = cr; } signal Sam3sAdc.dataReady[clientID](data); }else{ call HplPdc.enablePdcRx(); atomic { cr.bits.start = 1; // enable software trigger ADC->cr = cr; } } #endif } void AdcIrqHandler() @C() @spontaneous() { call AdcInterruptWrapper.preamble(); handler(); call AdcInterruptWrapper.postamble(); } /* Default functions */ default async event error_t Sam3sAdc.dataReady[uint8_t id](uint16_t data){ return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/adc/Sam3sAdcP.nc000066400000000000000000000047451207233610700234250ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #include "sam3sadchardware.h" configuration Sam3sAdcP { provides { interface Resource[uint8_t id]; interface Sam3sGetAdc[uint8_t id]; } } implementation { components Sam3sAdcImplP as AdcImpl; components MainC; components HplNVICC, HplSam3sClockC, HplSam3sGeneralIOC; //components new Resource[uint8_t id]; components new SimpleRoundRobinArbiterC(SAM3SADC_RESOURCE) as Arbiter; AdcImpl.ADCInterrupt -> HplNVICC.ADCInterrupt; AdcImpl.AdcPin -> HplSam3sGeneralIOC.HplPioB1; AdcImpl.AdcClockControl -> HplSam3sClockC.ADCCntl; Resource = Arbiter; // set this!?! Sam3sGetAdc = AdcImpl.Sam3sAdc; MainC.SoftwareInit -> AdcImpl.Init; components LedsC, NoLedsC; AdcImpl.Leds -> LedsC; components McuSleepC; AdcImpl.AdcInterruptWrapper -> McuSleepC; #ifdef SAM3S_ADC_PDC components HplSam3sPdcC; AdcImpl.HplPdc -> HplSam3sPdcC.AdcPdcControl; #endif } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/adc/Sam3sGetAdc.nc000066400000000000000000000034741207233610700237430ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #include "sam3sadchardware.h" interface Sam3sGetAdc { async command error_t configureAdc(const sam3s_adc_channel_config_t *config); async command error_t getData(); async event error_t dataReady(uint16_t data); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/adc/WireAdcStreamP.nc000066400000000000000000000051171207233610700245130ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko * @author Thomas Schmid */ #include "sam3sadchardware.h" configuration WireAdcStreamP { provides interface ReadStream[uint8_t client]; uses { interface AdcConfigure[uint8_t client]; interface Sam3sGetAdc[uint8_t client]; interface Resource[uint8_t client]; } } implementation { #ifndef SAM3S_ADC_PDC components AdcStreamP; #else components AdcStreamPDCP as AdcStreamP; #endif components MainC, new AlarmTMicro16C() as Alarm, new ArbitratedReadStreamC(uniqueCount(ADCC_READ_STREAM_SERVICE), uint16_t) as ArbitrateReadStream; ReadStream = ArbitrateReadStream; AdcConfigure = AdcStreamP; Resource = ArbitrateReadStream; ArbitrateReadStream.Service -> AdcStreamP; #ifdef SAM3S_ADC_PDC components HplSam3sPdcC; AdcStreamP.HplPdc -> HplSam3sPdcC.AdcPdcControl; #else AdcStreamP.Alarm -> Alarm; #endif AdcStreamP.Init <- MainC; Sam3sGetAdc = AdcStreamP.GetAdc; components LedsC, NoLedsC; AdcStreamP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/adc/sam3sadchardware.h000066400000000000000000000551111207233610700247430ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Sam3s ADC register definitions * * @author Thomas Schmid */ #ifndef SAM3SADCHARDWARE_H #define SAM3SADCHARDWARE_H /** * ADC Control Register */ typedef union { uint32_t flat; struct { uint32_t swrst : 1; // Software Reset uint32_t start : 1; // Start Conversion uint32_t reserved : 30; } __attribute__((__packed__)) bits; } adc_cr_t; /** * ADC Mode Register */ typedef union { uint32_t flat; struct { uint32_t trgen : 1; // Trigger Enable uint32_t trgsel : 3; // Trigger Selection uint32_t lowres : 1; // Resolution uint32_t sleep : 1; // Sleep Mode uint32_t fwup : 1; // Fast Wake Up uint32_t freerun : 1; // Free Run Mode uint32_t prescal : 8; // Prescaler Rate Selection uint32_t startup : 4; // Start Up Time uint32_t settling : 2; // Analog Settling Time uint32_t reserved0 : 1; uint32_t anach : 1; // Analog change uint32_t tracktim : 4; // Tracking Time uint32_t transfer : 2; // Transfer Period uint32_t reserved1 : 1; uint32_t useq : 1; // Use Sequence Enable } __attribute__((__packed__)) bits; } adc_mr_t; /** * ADC Channel Sequence 1 Register */ typedef union { uint32_t flat; struct { uint32_t usch1 : 3; // User Sequence Number uint32_t reserved0 : 1; uint32_t usch2 : 3; // User Sequence Number uint32_t reserved1 : 1; uint32_t usch3 : 3; // User Sequence Number uint32_t reserved2 : 1; uint32_t usch4 : 3; // User Sequence Number uint32_t reserved3 : 1; uint32_t usch5 : 3; // User Sequence Number uint32_t reserved4 : 1; uint32_t usch6 : 3; // User Sequence Number uint32_t reserved5 : 1; uint32_t usch7 : 3; // User Sequence Number uint32_t reserved6 : 1; uint32_t usch8 : 3; // User Sequence Number uint32_t reserved7 : 1; } __attribute__((__packed__)) bits; } adc_seqr1_t; /** * ADC Channel Sequence 2 Register */ typedef union { uint32_t flat; struct { uint32_t usch9 : 3; // User Sequence Number uint32_t reserved0 : 1; uint32_t usch10 : 3; // User Sequence Number uint32_t reserved1 : 1; uint32_t usch11 : 3; // User Sequence Number uint32_t reserved2 : 1; uint32_t usch12 : 3; // User Sequence Number uint32_t reserved3 : 1; uint32_t usch13 : 3; // User Sequence Number uint32_t reserved4 : 1; uint32_t usch14 : 3; // User Sequence Number uint32_t reserved5 : 1; uint32_t usch15 : 3; // User Sequence Number uint32_t reserved6 : 1; uint32_t usch16 : 3; // User Sequence Number uint32_t reserved7 : 1; } __attribute__((__packed__)) bits; } adc_seqr2_t; /** * ADC Channel Enable Register */ typedef union { uint32_t flat; struct { uint32_t ch0 : 1; // Channel Enable uint32_t ch1 : 1; // Channel Enable uint32_t ch2 : 1; // Channel Enable uint32_t ch3 : 1; // Channel Enable uint32_t ch4 : 1; // Channel Enable uint32_t ch5 : 1; // Channel Enable uint32_t ch6 : 1; // Channel Enable uint32_t ch7 : 1; // Channel Enable uint32_t ch8 : 1; // Channel Enable uint32_t ch9 : 1; // Channel Enable uint32_t ch10 : 1; // Channel Enable uint32_t ch11 : 1; // Channel Enable uint32_t ch12 : 1; // Channel Enable uint32_t ch13 : 1; // Channel Enable uint32_t ch14 : 1; // Channel Enable uint32_t ch15 : 1; // Channel Enable uint32_t reserved : 16; } __attribute__((__packed__)) bits; } adc_cher_t; /** * ADC Channel Disable Register */ typedef union { uint32_t flat; struct { uint32_t ch0 : 1; // Channel Disable uint32_t ch1 : 1; // Channel Disable uint32_t ch2 : 1; // Channel Disable uint32_t ch3 : 1; // Channel Disable uint32_t ch4 : 1; // Channel Disable uint32_t ch5 : 1; // Channel Disable uint32_t ch6 : 1; // Channel Disable uint32_t ch7 : 1; // Channel Disable uint32_t ch8 : 1; // Channel Disable uint32_t ch9 : 1; // Channel Disable uint32_t ch10 : 1; // Channel Disable uint32_t ch11 : 1; // Channel Disable uint32_t ch12 : 1; // Channel Disable uint32_t ch13 : 1; // Channel Disable uint32_t ch14 : 1; // Channel Disable uint32_t ch15 : 1; // Channel Disable uint32_t reserved : 16; } __attribute__((__packed__)) bits; } adc_chdr_t; /** * ADC Channel Status Register */ typedef union { uint32_t flat; struct { uint32_t ch0 : 1; // Channel Status uint32_t ch1 : 1; // Channel Status uint32_t ch2 : 1; // Channel Status uint32_t ch3 : 1; // Channel Status uint32_t ch4 : 1; // Channel Status uint32_t ch5 : 1; // Channel Status uint32_t ch6 : 1; // Channel Status uint32_t ch7 : 1; // Channel Status uint32_t ch8 : 1; // Channel Status uint32_t ch9 : 1; // Channel Status uint32_t ch10 : 1; // Channel Status uint32_t ch11 : 1; // Channel Status uint32_t ch12 : 1; // Channel Status uint32_t ch13 : 1; // Channel Status uint32_t ch14 : 1; // Channel Status uint32_t ch15 : 1; // Channel Status uint32_t reserved : 16; } __attribute__((__packed__)) bits; } adc_chsr_t; /** * ADC Last Converted Data Register */ typedef union { uint32_t flat; struct { uint32_t ldata : 12; // Last Data Converted uint32_t chnb : 4; // Channel Number uint32_t reserved : 16; } __attribute__((__packed__)) bits; } adc_lcdr_t; /** * ADC Interrupt Enable Register */ typedef union { uint32_t flat; struct { uint32_t eoc0 : 1; // End of Conversion Interrupt Enable x uint32_t eoc1 : 1; // End of Conversion Interrupt Enable x uint32_t eoc2 : 1; // End of Conversion Interrupt Enable x uint32_t eoc3 : 1; // End of Conversion Interrupt Enable x uint32_t eoc4 : 1; // End of Conversion Interrupt Enable x uint32_t eoc5 : 1; // End of Conversion Interrupt Enable x uint32_t eoc6 : 1; // End of Conversion Interrupt Enable x uint32_t eoc7 : 1; // End of Conversion Interrupt Enable x uint32_t eoc8 : 1; // End of Conversion Interrupt Enable x uint32_t eoc9 : 1; // End of Conversion Interrupt Enable x uint32_t eoc10 : 1; // End of Conversion Interrupt Enable x uint32_t eoc11 : 1; // End of Conversion Interrupt Enable x uint32_t eoc12 : 1; // End of Conversion Interrupt Enable x uint32_t eoc13 : 1; // End of Conversion Interrupt Enable x uint32_t eoc14 : 1; // End of Conversion Interrupt Enable x uint32_t eoc15 : 1; // End of Conversion Interrupt Enable x uint32_t reserved0 : 8; uint32_t drdy : 1; // Data Ready Interrupt Enable uint32_t govre : 1; // General Overrun Error Interrupt Enable uint32_t compe : 1; // comparison Event Interrupt Enable uint32_t endrx : 1; // End of Receive Buffer Interrupt Enable uint32_t rxbuff : 1; // Receive Buffer Full Interrupt Enable uint32_t reserved1 : 3; } __attribute__((__packed__)) bits; } adc_ier_t; /** * ADC Interrupt Disable Register */ typedef union { uint32_t flat; struct { uint32_t eoc0 : 1; // End of Conversion Interrupt Disable x uint32_t eoc1 : 1; // End of Conversion Interrupt Disable x uint32_t eoc2 : 1; // End of Conversion Interrupt Disable x uint32_t eoc3 : 1; // End of Conversion Interrupt Disable x uint32_t eoc4 : 1; // End of Conversion Interrupt Disable x uint32_t eoc5 : 1; // End of Conversion Interrupt Disable x uint32_t eoc6 : 1; // End of Conversion Interrupt Disable x uint32_t eoc7 : 1; // End of Conversion Interrupt Disable x uint32_t eoc8 : 1; // End of Conversion Interrupt Disable x uint32_t eoc9 : 1; // End of Conversion Interrupt Disable x uint32_t eoc10 : 1; // End of Conversion Interrupt Disable x uint32_t eoc11 : 1; // End of Conversion Interrupt Disable x uint32_t eoc12 : 1; // End of Conversion Interrupt Disable x uint32_t eoc13 : 1; // End of Conversion Interrupt Disable x uint32_t eoc14 : 1; // End of Conversion Interrupt Disable x uint32_t eoc15 : 1; // End of Conversion Interrupt Disable x uint32_t reserved0 : 8; uint32_t drdy : 1; // Data Ready Interrupt Disable uint32_t govre : 1; // General Overrun Error Interrupt Disable uint32_t compe : 1; // comparison Event Interrupt Disable uint32_t endrx : 1; // End of Receive Buffer Interrupt Disable uint32_t rxbuff : 1; // Receive Buffer Full Interrupt Disable uint32_t reserved1 : 3; } __attribute__((__packed__)) bits; } adc_idr_t; /** * ADC Interrupt Mask Register */ typedef union { uint32_t flat; struct { uint32_t eoc0 : 1; // End of Conversion Interrupt Mask x uint32_t eoc1 : 1; // End of Conversion Interrupt Mask x uint32_t eoc2 : 1; // End of Conversion Interrupt Mask x uint32_t eoc3 : 1; // End of Conversion Interrupt Mask x uint32_t eoc4 : 1; // End of Conversion Interrupt Mask x uint32_t eoc5 : 1; // End of Conversion Interrupt Mask x uint32_t eoc6 : 1; // End of Conversion Interrupt Mask x uint32_t eoc7 : 1; // End of Conversion Interrupt Mask x uint32_t eoc8 : 1; // End of Conversion Interrupt Mask x uint32_t eoc9 : 1; // End of Conversion Interrupt Mask x uint32_t eoc10 : 1; // End of Conversion Interrupt Mask x uint32_t eoc11 : 1; // End of Conversion Interrupt Mask x uint32_t eoc12 : 1; // End of Conversion Interrupt Mask x uint32_t eoc13 : 1; // End of Conversion Interrupt Mask x uint32_t eoc14 : 1; // End of Conversion Interrupt Mask x uint32_t eoc15 : 1; // End of Conversion Interrupt Mask x uint32_t reserved0 : 8; uint32_t drdy : 1; // Data Ready Interrupt Mask uint32_t govre : 1; // General Overrun Error Interrupt Mask uint32_t compe : 1; // comparison Event Interrupt Mask uint32_t endrx : 1; // End of Receive Buffer Interrupt Mask uint32_t rxbuff : 1; // Receive Buffer Full Interrupt Mask uint32_t reserved1 : 3; } __attribute__((__packed__)) bits; } adc_imr_t; /** * ADC Interrupt Status Register */ typedef union { uint32_t flat; struct { uint32_t eoc0 : 1; // End of Conversion Interrupt Status x uint32_t eoc1 : 1; // End of Conversion Interrupt Status x uint32_t eoc2 : 1; // End of Conversion Interrupt Status x uint32_t eoc3 : 1; // End of Conversion Interrupt Status x uint32_t eoc4 : 1; // End of Conversion Interrupt Status x uint32_t eoc5 : 1; // End of Conversion Interrupt Status x uint32_t eoc6 : 1; // End of Conversion Interrupt Status x uint32_t eoc7 : 1; // End of Conversion Interrupt Status x uint32_t eoc8 : 1; // End of Conversion Interrupt Status x uint32_t eoc9 : 1; // End of Conversion Interrupt Status x uint32_t eoc10 : 1; // End of Conversion Interrupt Status x uint32_t eoc11 : 1; // End of Conversion Interrupt Status x uint32_t eoc12 : 1; // End of Conversion Interrupt Status x uint32_t eoc13 : 1; // End of Conversion Interrupt Status x uint32_t eoc14 : 1; // End of Conversion Interrupt Status x uint32_t eoc15 : 1; // End of Conversion Interrupt Status x uint32_t reserved0 : 8; uint32_t drdy : 1; // Data Ready Interrupt Status uint32_t govre : 1; // General Overrun Error Interrupt Status uint32_t compe : 1; // comparison Event Interrupt Status uint32_t endrx : 1; // End of Receive Buffer Interrupt Status uint32_t rxbuff : 1; // Receive Buffer Full Interrupt Status uint32_t reserved1 : 3; } __attribute__((__packed__)) bits; } adc_isr_t; /** * ADC Overrun Status Register */ typedef union { uint32_t flat; struct { uint32_t ovre0 : 1; // Overrun Error x uint32_t ovre1 : 1; // Overrun Error x uint32_t ovre2 : 1; // Overrun Error x uint32_t ovre3 : 1; // Overrun Error x uint32_t ovre4 : 1; // Overrun Error x uint32_t ovre5 : 1; // Overrun Error x uint32_t ovre6 : 1; // Overrun Error x uint32_t ovre7 : 1; // Overrun Error x uint32_t ovre8 : 1; // Overrun Error x uint32_t ovre9 : 1; // Overrun Error x uint32_t ovre10 : 1; // Overrun Error x uint32_t ovre11 : 1; // Overrun Error x uint32_t ovre12 : 1; // Overrun Error x uint32_t ovre13 : 1; // Overrun Error x uint32_t ovre14 : 1; // Overrun Error x uint32_t ovre15 : 1; // Overrun Error x uint32_t reserved : 16; } __attribute__((__packed__)) bits; } adc_over_t; /** * ADC Extended Mode Register */ typedef union { uint32_t flat; struct { uint32_t cmpmode : 2; // Comparison Mode uint32_t reserved0 : 2; uint32_t cmpsel : 4; // Comparison Selected Channel uint32_t reserved1 : 1; uint32_t cmpall : 1; //Compare All Channels uint32_t reserved2 : 14; uint32_t tag : 1; // TAG of ADC_LDCR register uint32_t reserved3 : 7; } __attribute__((__packed__)) bits; } adc_emr_t; /** * ADC Compare Window Register */ typedef union { uint32_t flat; struct { uint32_t lowthres : 12; // Low Threshold uint32_t reserved0 : 4; uint32_t highthres : 12; // High Threshold uint32_t reserved1 : 4; } __attribute__((__packed__)) bits; } adc_cwr_t; /** * ADC Channel Gain Register */ typedef union { uint32_t flat; struct { uint32_t gain0 : 2; // Gain Channel x uint32_t gain1 : 2; // Gain Channel x uint32_t gain2 : 2; // Gain Channel x uint32_t gain3 : 2; // Gain Channel x uint32_t gain4 : 2; // Gain Channel x uint32_t gain5 : 2; // Gain Channel x uint32_t gain6 : 2; // Gain Channel x uint32_t gain7 : 2; // Gain Channel x uint32_t gain8 : 2; // Gain Channel x uint32_t gain9 : 2; // Gain Channel x uint32_t gain10 : 2; // Gain Channel x uint32_t gain11 : 2; // Gain Channel x uint32_t gain12 : 2; // Gain Channel x uint32_t gain13 : 2; // Gain Channel x uint32_t gain14 : 2; // Gain Channel x uint32_t gain15 : 2; // Gain Channel x } __attribute__((__packed__)) bits; } adc_cgr_t; /** * ADC Channel Offset Register */ typedef union { uint32_t flat; struct { uint32_t off0 : 1; // Offset for Channel x uint32_t off1 : 1; // Offset for Channel x uint32_t off2 : 1; // Offset for Channel x uint32_t off3 : 1; // Offset for Channel x uint32_t off4 : 1; // Offset for Channel x uint32_t off5 : 1; // Offset for Channel x uint32_t off6 : 1; // Offset for Channel x uint32_t off7 : 1; // Offset for Channel x uint32_t off8 : 1; // Offset for Channel x uint32_t off9 : 1; // Offset for Channel x uint32_t off10 : 1; // Offset for Channel x uint32_t off11 : 1; // Offset for Channel x uint32_t off12 : 1; // Offset for Channel x uint32_t off13 : 1; // Offset for Channel x uint32_t off14 : 1; // Offset for Channel x uint32_t off15 : 1; // Offset for Channel x uint32_t diff0 : 1; // Differential inputs for channel x uint32_t diff1 : 1; // Differential inputs for channel x uint32_t diff2 : 1; // Differential inputs for channel x uint32_t diff3 : 1; // Differential inputs for channel x uint32_t diff4 : 1; // Differential inputs for channel x uint32_t diff5 : 1; // Differential inputs for channel x uint32_t diff6 : 1; // Differential inputs for channel x uint32_t diff7 : 1; // Differential inputs for channel x uint32_t diff8 : 1; // Differential inputs for channel x uint32_t diff9 : 1; // Differential inputs for channel x uint32_t diff10 : 1; // Differential inputs for channel x uint32_t diff11 : 1; // Differential inputs for channel x uint32_t diff12 : 1; // Differential inputs for channel x uint32_t diff13 : 1; // Differential inputs for channel x uint32_t diff14 : 1; // Differential inputs for channel x uint32_t diff15 : 1; // Differential inputs for channel x } __attribute__((__packed__)) bits; } adc_cor_t; /** * ADC Channel Data Register */ typedef union { uint32_t flat; struct { uint32_t data : 12; // converted Data uint32_t reserved : 20; } __attribute__((__packed__)) bits; } adc_cdr_t; /** * ADC Analog Control Register */ typedef union { uint32_t flat; struct { uint32_t reserved0 : 4; uint32_t tson : 1; // Temperature Sensor On uint32_t reserved1 : 3; uint32_t ibctl : 2; // ADC Bias Current Control uint32_t reserved2 : 22; } __attribute__((__packed__)) bits; } adc_acr_t; /** * ADC Write Protect Mode Register */ typedef union { uint32_t flat; struct { uint32_t wpen : 1; // Write Protect Enable uint32_t reserved0 : 7; uint32_t wpkey : 24; // Write Protect key } __attribute__((__packed__)) bits; } adc_wpmr_t; #define ADC_WPMR_KEY 0x414443 /** * ADC Write Protect Status Register */ typedef union { uint32_t flat; struct { uint32_t wpvs : 1; // Write Protect Violation Status uint32_t reserved0 : 7; uint32_t wpvsrc : 16; // Write Protect Violation Source uint32_t reserved1 : 8; } __attribute__((__packed__)) bits; } adc_wpsr_t; /** * ADC Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3S * Series, Preliminary, p. 989 */ typedef struct adc { volatile adc_cr_t cr; // Control Register volatile adc_mr_t mr; // Mode Register volatile adc_seqr1_t seqr1; // Channel Sequence Register 1 volatile adc_seqr2_t seqr2; // Channel Sequence Register 2 volatile adc_cher_t cher; // Channel Enable Register volatile adc_chdr_t chdr; // Channel Disable Register volatile adc_chsr_t chsr; // channel Status Register uint32_t reserved0; volatile adc_lcdr_t lcdr; // Last Converted Data Register volatile adc_ier_t ier; // Interrupt Enable Register volatile adc_idr_t idr; // Interrupt Disable Register volatile adc_imr_t imr; // Interrupt Mask Register volatile adc_isr_t isr; // Interrupt Status Register uint32_t reserved1; uint32_t reserved2; volatile adc_over_t over; // Overrun Status Register volatile adc_emr_t emr; // Extended Mode Register volatile adc_cwr_t cwr; // Compare Window Register volatile adc_cgr_t cgr; // Channel Gain Register volatile adc_cor_t cor; // Channel Offset Register volatile adc_cdr_t cdr[16]; // Channel Data Register x uint32_t reserved3; volatile adc_acr_t acr; // Analog Control Register uint32_t reserved4[19]; volatile adc_wpmr_t wpmr; // Write Protect Mode Register volatile adc_wpsr_t wpsr; // Write Protect Status Register } adc_t; /** * Memory mapping for the ADC */ #define ADC_BASE_ADDRESS 0x40038000 volatile adc_t* ADC = (volatile adc_t *) ADC_BASE_ADDRESS; // ADC Base Address #define SAM3SADC_RESOURCE "Sam3AdcC.Resource" #define ADCC_SERVICE "AdcC.Service" #define ADCC_READ_STREAM_SERVICE "AdcC.ReadStream.Client" typedef struct { uint32_t channel : 4; uint32_t trgen : 1; uint32_t trgsel : 3; uint32_t lowres : 1; uint32_t sleep : 1; uint32_t fwup : 1; uint32_t freerun : 1; uint32_t prescal : 8; uint32_t startup : 4; uint32_t settling : 2; uint32_t anach : 1; uint32_t tracktim : 4; uint32_t transfer : 2; uint32_t useq : 1; uint32_t ibctl : 2; uint32_t diff : 1; uint32_t gain : 2; uint32_t offset : 1; } sam3s_adc_channel_config_t; #endif //SAM3SADCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/dacc/000077500000000000000000000000001207233610700215165ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/dacc/Sam3sDac.nc000066400000000000000000000103521207233610700234370ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ interface Sam3sDac { /** * triggerEn: enable external trigger mode * triggerSel: select trigger source * wordTransfer: 1: word transfer, 0: half-word * sleep: 1: sleep mode, 0: normal mode * userSel: select channel * tagSelection: 1: bits 13-12 in data select channel * maxSpeed: 1: max speed mode enabled */ command error_t configure( bool triggerEn, uint8_t triggerSel, bool wordTransfer, bool sleep, bool fastWakeUp, uint8_t refreshPeriod, uint8_t userSel, bool tagSelection, bool maxSpeed, uint8_t startupTime); async command error_t enable(uint8_t channel); async command error_t disable(uint8_t channel); /** * Sets the DAC value. If wordTransfer is selected in the configuration, * then the lower half-word of data is one conversion value, and the upper * half-word a second. The DAC has a FIFO of up to 4 conversion values. * * If tagSelection is set, then the upper 15-13 bits of each half-word * indicate the channel. * * @return SUCCESS if ok, EBUSY if the DAC if the FIFO is full. */ async command error_t set(uint32_t data); /** * Set the requested frequency at which the samples in a buffer should be * played out. Not all frequencies are possible. The return value will * indicate the actual frequency set. * * @param frequency The requested frequency in Hz * @return The set frequency in Hz */ command uint32_t setFrequency(uint32_t frequency); /** * Set the buffer to be sent out on the DAC using the PDC. Depending on the * configuration, the buffer can contain word or half-word data, and bit * 13-12 of each half-word can indicate the channel. * * The PDC can hold up to two buffers. The function will return EBUSY if * both slots are currently full. * * @param buffer A pointer to the memory location of the buffer * @param length Size of the buffer * @return SUCCESS if the buffer was added, EBUSY if the PDC is full. */ async command error_t setBuffer(uint32_t *buffer, uint16_t length); /** * Start the PDC transfers. */ async command void startPdc(); /** * Stop the PDC transfers. */ async command void stopPdc(); /** * Signals that a buffer has been completely sent out. This is an indication * that the next buffer can be sent to the PDC. * * @param error SUCCESS if the buffer was sent out without errors. * @param buffer Pointer to the buffer structure that was sent out. * @param length Size of the finished buffer */ async event void bufferDone(error_t error, uint32_t *buffer, uint16_t length); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/dacc/Sam3sDacC.nc000066400000000000000000000045561207233610700235530ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ configuration Sam3sDacC { provides { interface StdControl; interface Sam3sDac; } } implementation { components Sam3sDacP as DacP, LedsC, NoLedsC, HplNVICC, HplSam3sClockC, HplSam3sGeneralIOC; StdControl = DacP; Sam3sDac = DacP; DacP.DacInterrupt -> HplNVICC.DACCInterrupt; DacP.DacPin0 -> HplSam3sGeneralIOC.HplPioB13; DacP.DacPin1 -> HplSam3sGeneralIOC.HplPioB14; DacP.DacClockControl -> HplSam3sClockC.DACCCntl; DacP.ClockConfig -> HplSam3sClockC; components McuSleepC; DacP.DacInterruptWrapper -> McuSleepC; components HplSam3sPdcC; DacP.HplPdc -> HplSam3sPdcC.DacPdcControl; components Sam3sPwmC; DacP.PwmControl -> Sam3sPwmC; DacP.Pwm -> Sam3sPwmC; DacP.Leds -> NoLedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/dacc/Sam3sDacP.nc000066400000000000000000000174121207233610700235630ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #include "sam3sdacchardware.h" #include "sam3spwmhardware.h" module Sam3sDacP { provides { interface StdControl; interface Sam3sDac; } uses { interface HplNVICInterruptCntl as DacInterrupt; interface HplSam3GeneralIOPin as DacPin0; interface HplSam3GeneralIOPin as DacPin1; interface HplSam3PeripheralClockCntl as DacClockControl; interface HplSam3Clock as ClockConfig; interface FunctionWrapper as DacInterruptWrapper; interface HplSam3Pdc as HplPdc; interface Leds; interface StdControl as PwmControl; interface Sam3sPwm as Pwm; } } implementation { norace uint16_t currentLength; norace uint32_t *currentBuffer; norace uint16_t nextLength; norace uint32_t *nextBuffer; command error_t StdControl.start() { atomic { DACC->cr.flat = 0x1; // software reset call DacClockControl.enable(); /* Configure interrupts */ call DacInterrupt.configure(IRQ_PRIO_DAC); /* Set IO line */ call DacPin0.disablePioControl(); // Disable whatever is set currently call DacPin0.selectPeripheralD(); call DacPin1.disablePioControl(); // Disable whatever is set currently call DacPin1.selectPeripheralD(); call Sam3sDac.stopPdc(); } return SUCCESS; } command error_t StdControl.stop() { atomic { call DacClockControl.disable(); call DacInterrupt.disable(); call PwmControl.stop(); } return SUCCESS; } command error_t Sam3sDac.configure( bool triggerEn, // enable external trigger mode uint8_t triggerSel, // select trigger source bool wordTransfer, // 1: word transfer, 0: half-word bool sleep, // 1: sleep mode, 0: normal mode bool fastWakeUp, uint8_t refreshPeriod, uint8_t userSel, // select channel bool tagSelection, // 1: bits 13-12 in data select channel bool maxSpeed, // 1: max speed mode enabled uint8_t startupTime) { dacc_mr_t mr; mr.bits.trgen = triggerEn; mr.bits.trgsel = triggerSel & 0x7; mr.bits.word = wordTransfer; mr.bits.sleep = sleep; mr.bits.fastwkup = fastWakeUp; mr.bits.refresh = refreshPeriod; mr.bits.user_sel = userSel; mr.bits.tag = tagSelection; mr.bits.maxs = maxSpeed; mr.bits.startup = startupTime & 0x3F; DACC->mr = mr; return SUCCESS; } async command error_t Sam3sDac.enable(uint8_t channel) { if(channel >= DACC_MAX_CHANNELS) return FAIL; DACC->cher.flat = (1 << channel); return SUCCESS; } async command error_t Sam3sDac.disable(uint8_t channel) { if(channel >= DACC_MAX_CHANNELS) return FAIL; DACC->chdr.flat = (1 << channel); } async command error_t Sam3sDac.set(uint32_t data) { if(DACC->isr.bits.txrdy) { DACC->cdr.bits.data = data; return SUCCESS; } else { return EBUSY; } } async event void ClockConfig.mainClockChanged(){} command uint32_t Sam3sDac.setFrequency(uint32_t frequency) { uint32_t pwmFreq; dacc_mr_t mr = DACC->mr; if(frequency > 1000000) { // DAC doesn't support this return 0; } call PwmControl.start(); pwmFreq = 1200; // set it at about 1 MHz if(call Pwm.configure(pwmFreq) != SUCCESS) { return 0; } // get the actual frequency pwmFreq = call Pwm.getFrequency(); // now, calculate the period we really need call Pwm.setPeriod(pwmFreq * 1000 / frequency); call Pwm.enableCompare(PWM_COMPARE_DAC, 1); call Pwm.setEventCompares(PWM_EVENT_DAC, (1 << PWM_COMPARE_DAC)); // setup the DAC to be triggered from external triggers mr.bits.trgen = 1; mr.bits.trgsel = 4 + PWM_EVENT_DAC; // select the right event DACC->mr = mr; return pwmFreq * 1000 / (pwmFreq * 1000 / frequency); } async command error_t Sam3sDac.setBuffer(uint32_t *buffer, uint16_t length) { if(call HplPdc.getTxCounter() == 0) { call HplPdc.setTxPtr(buffer); call HplPdc.setTxCounter(length); atomic { currentBuffer = buffer; currentLength = length; } call Sam3sDac.startPdc(); } else { if(call HplPdc.getNextTxCounter() == 0) { dacc_ier_t ier; ier.flat = 0; call HplPdc.setNextTxPtr(buffer); call HplPdc.setNextTxCounter(length); atomic { nextBuffer = buffer; nextLength = length; // enable endtx interrupt again ier.bits.endtx = 1; DACC->ier = ier; } } else { // PDC busy return EBUSY; } } return SUCCESS; } async command void Sam3sDac.startPdc() { dacc_ier_t ier; call DacInterrupt.disable(); call DacInterrupt.clearPending(); call DacInterrupt.enable(); ier.flat = 0; ier.bits.endtx = 1; ier.bits.txbufe = 1; DACC->ier = ier; call HplPdc.enablePdcTx(); } async command void Sam3sDac.stopPdc() { dacc_idr_t idr; call DacInterrupt.disable(); idr.bits.endtx = 1; idr.bits.txbufe = 1; DACC->idr = idr; call HplPdc.disablePdcTx(); } task void signalDone() { signal Sam3sDac.bufferDone(SUCCESS, currentBuffer, currentLength); atomic { currentBuffer = nextBuffer; currentLength = nextLength; } } void handler() @spontaneous() { dacc_isr_t isr = DACC->isr; dacc_idr_t idr; idr.flat = 0; if(isr.bits.txbufe) { // PDC done. Disable interrupts. idr.flat = 0; idr.bits.txbufe = 1; idr.bits.endtx = 1; call HplPdc.disablePdcTx(); call Leds.led0Toggle(); post signalDone(); } else if(isr.bits.endtx) { // Disable endtx. If this was the second last buffer, txbufe will be the // next interrupt. Else the next set buffer will set this interrupt // again. idr.bits.endtx = 1; call Leds.led1Toggle(); post signalDone(); } DACC->idr = idr; } void DaccIrqHandler() @C() @spontaneous() { call DacInterruptWrapper.preamble(); handler(); call DacInterruptWrapper.postamble(); } default async event void Sam3sDac.bufferDone(error_t error, uint32_t *buffer, uint16_t length) { } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/dacc/sam3sdacchardware.h000066400000000000000000000203441207233610700252510ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Sam3s DACC register definitions * * @author Thomas Schmid */ #ifndef SAM3SDACCHARDWARE_H #define SAM3SDACCHARDWARE_H #include "pdchardware.h" /** * DACC Control Register */ typedef union { uint32_t flat; struct { uint32_t swrst : 1; // Software Reset uint32_t reserved : 31; } __attribute__((__packed__)) bits; } dacc_cr_t; /** * DACC Mode Register */ typedef union { uint32_t flat; struct { uint32_t trgen : 1; // Trigger Enable uint32_t trgsel : 3; // Trigger Selection uint32_t word : 1; // Word Transfer uint32_t sleep : 1; // Sleep Mode uint32_t fastwkup : 1; // Fast Wake Up Mode uint32_t reserved0 : 1; uint32_t refresh : 8; // Refresh Period uint32_t user_sel : 2; // User Channel Selection uint32_t reserved1 : 2; uint32_t tag : 1; // Tag Selection Mode uint32_t maxs : 1; // Max Speed Mode uint32_t reserved2 : 2; uint32_t startup : 6; // Startup Time Selection uint32_t reserved3 : 2; } __attribute__((__packed__)) bits; } dacc_mr_t; /** * DACC Channel Enable Register */ typedef union { uint32_t flat; struct { uint32_t ch0 : 1; // Channel 0 enable uint32_t ch1 : 1; // Channel 1 enable uint32_t reserved : 30; } __attribute__((__packed__)) bits; } dacc_cher_t; /** * DACC Channel Disable Register */ typedef union { uint32_t flat; struct { uint32_t ch0 : 1; // Channel 0 disable uint32_t ch1 : 1; // Channel 1 disable uint32_t reserved : 30; } __attribute__((__packed__)) bits; } dacc_chdr_t; /** * DACC Channel Status Register */ typedef union { uint32_t flat; struct { uint32_t ch0 : 1; // Channel 0 Status uint32_t ch1 : 1; // Channel 1 Status uint32_t reserved : 30; } __attribute__((__packed__)) bits; } dacc_chsr_t; /** * DACC Conversion Data Register */ typedef union { uint32_t flat; struct { uint32_t data : 32; // Data to Convert } __attribute__((__packed__)) bits; } dacc_cdr_t; /** * DACC Interrupt Enable Register */ typedef union { uint32_t flat; struct { uint32_t txrdy : 1; // Transmit Ready Interrupt Enable uint32_t eoc : 1; // End of Conversion Interrupt Enable uint32_t endtx : 1; // End of Transmit Buffer Interrupt Enable uint32_t txbufe : 1; // Transmit Buffer Empty Interrupt Enable uint32_t reserved : 28; } __attribute__((__packed__)) bits; } dacc_ier_t; /** * DACC Interrupt Disable Register */ typedef union { uint32_t flat; struct { uint32_t txrdy : 1; // Transmit Ready Interrupt Disable uint32_t eoc : 1; // End of Conversion Interrupt Disable uint32_t endtx : 1; // End of Transmit Buffer Interrupt Disable uint32_t txbufe : 1; // Transmit Buffer Empty Interrupt Disable uint32_t reserved : 28; } __attribute__((__packed__)) bits; } dacc_idr_t; /** * DACC Interrupt Mask Register */ typedef union { uint32_t flat; struct { uint32_t txrdy : 1; // Transmit Ready Interrupt Mask uint32_t eoc : 1; // End of Conversion Interrupt Mask uint32_t endtx : 1; // End of Transmit Buffer Interrupt Mask uint32_t txbufe : 1; // Transmit Buffer Empty Interrupt Mask uint32_t reserved : 28; } __attribute__((__packed__)) bits; } dacc_imr_t; /** * DACC Interrupt Status Register */ typedef union { uint32_t flat; struct { uint32_t txrdy : 1; // Transmit Ready Interrupt Status uint32_t eoc : 1; // End of Conversion Interrupt Status uint32_t endtx : 1; // End of Transmit Buffer Interrupt Status uint32_t txbufe : 1; // Transmit Buffer Empty Interrupt Status uint32_t reserved : 28; } __attribute__((__packed__)) bits; } dacc_isr_t; /** * DACC Analog Current Register */ typedef union { uint32_t flat; struct { uint32_t ibctlch0 : 2; // Analog Output Current Control Channel 0 uint32_t ibctlch1 : 2; // Analog Output Current Control Channel 1 uint32_t reserved0 : 4; uint32_t ibctldaccore : 2; // Bias Current Control for DAC Core uint32_t reserved1 : 22; } __attribute__((__packed__)) bits; } dacc_acr_t; /** * DACC Write Protect Mode Register */ typedef union { uint32_t flat; struct { uint32_t wpen : 1; // Write Protect Enable uint32_t reserved0 : 7; uint32_t wpkey : 24; // Write Protect key } __attribute__((__packed__)) bits; } dacc_wpmr_t; #define DACC_WPMR_KEY 0x444143 /** * DACC Write Protect Status Register */ typedef union { uint32_t flat; struct { uint32_t wproterr : 1; // Write Protection error uint32_t reserved0 : 7; uint32_t wprotaddr : 8; // Write protection error address uint32_t reserved1 : 16; } __attribute__((__packed__)) bits; } dacc_wpsr_t; /** * DACC Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3S * Series, Preliminary, p. 1019 */ typedef struct dacc { volatile dacc_cr_t cr; // Control Register volatile dacc_mr_t mr; // Mode Register uint32_t reserved0; uint32_t reserved1; volatile dacc_cher_t cher; // Channel Enable Register volatile dacc_chdr_t chdr; // Channel Disable Register volatile dacc_chsr_t chsr; // Channel Status Register uint32_t reserved2; volatile dacc_cdr_t cdr; // Channel Data Register volatile dacc_ier_t ier; // Ineterrupt Enable Register volatile dacc_idr_t idr; // Interrupt Disable Register volatile dacc_imr_t imr; // Interrupt Mask Register volatile dacc_isr_t isr; // Interrupt Status Register uint32_t reserved3[24]; volatile dacc_acr_t acr; // Analog current Register uint32_t reserved4[19]; volatile dacc_wpmr_t wpmr; // Write Protect Mode Register volatile dacc_wpsr_t wpsr; // Write Protect Status Register uint32_t reserved5[5]; volatile periph_rpr_t rpr; volatile periph_rcr_t rcr; volatile periph_tpr_t tpr; volatile periph_tcr_t tcr; volatile periph_rnpr_t rnpr; volatile periph_rncr_t rncr; volatile periph_tnpr_t tnpr; volatile periph_tncr_t tncr; volatile periph_ptcr_t ptcr; volatile periph_ptsr_t ptsr; } dacc_t; /** * Memory mapping for the DACC */ #define DACC_BASE_ADDRESS 0x4003C000 volatile dacc_t* DACC = (volatile dacc_t *) DACC_BASE_ADDRESS; // DACC Base Address #define DACC_MAX_CHANNELS 2 #endif //SAM3SADCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/eefc/000077500000000000000000000000001207233610700215265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/eefc/sam3eefchardware.h000066400000000000000000000035361207233610700251120ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #ifndef SAM3SEEFCHARDWARE_H #define SAM3SEEFCHARDWARE_H #include "eefchardware.h" /** * Memory mapping for the EEFC0. No EEFC1 on the Sam3S. */ volatile eefc_t* EEFC0 = (volatile eefc_t*) 0x400E0A00; // EEFC0 Base Address #endif // SAM3SEEFCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/matrix/000077500000000000000000000000001207233610700221305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/matrix/sam3matrixhardware.h000066400000000000000000000105111207233610700261050ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Bus Matrix register definitions. * * @author Thomas Schmid */ #ifndef _SAM3SMATRIXHARDWARE_H #define _SAM3SMATRIXHARDWARE_H #include "matrixhardware.h" /** * System I/O Configuration Register */ typedef union { uint32_t flat; struct { uint32_t reserved0 : 4; uint32_t sysio4 : 1; uint32_t sysio5 : 1; uint32_t sysio6 : 1; uint32_t sysio7 : 1; uint32_t reserved1 : 2; uint32_t sysio10 : 1; uint32_t sysio11 : 1; uint32_t sysio12 : 1; uint32_t reserved2 : 19; }__attribute__((__packed__)) bits; } ccfg_sysio_t; /** * SMC NAND Flash Chip select Configuration Register */ typedef union { uint32_t flat; struct { uint32_t smc_nfcs0 : 1; uint32_t smc_nfcs1 : 1; uint32_t smc_nfcs2 : 1; uint32_t smc_nfcs3 : 1; uint32_t reserved : 28; }__attribute__((__packed__)) bits; } ccfg_smcnfcs_t; /** * Bus Matrix Register definitions, AT91 ARM Cortex-M3 based Microcontrollers * SAM3S Series, Preliminary, p. 352 */ typedef struct matrix { volatile matrix_mcfg_t mcfg0; // master configuration register 0 volatile matrix_mcfg_t mcfg1; // master configuration register 1 volatile matrix_mcfg_t mcfg2; // master configuration register 2 volatile matrix_mcfg_t mcfg3; // master configuration register 3 uint32_t reserved0[12]; volatile matrix_scfg_t scfg0; // slave confgiruation register 0 volatile matrix_scfg_t scfg1; // slave confgiruation register 1 volatile matrix_scfg_t scfg2; // slave confgiruation register 2 volatile matrix_scfg_t scfg3; // slave confgiruation register 3 volatile matrix_scfg_t scfg4; // slave confgiruation register 4 uint32_t reserved1[11]; volatile matrix_pras_t pras0; // priority register A for slave 0 uint32_t reserved2; volatile matrix_pras_t pras1; // priority register A for slave 0 uint32_t reserved3; volatile matrix_pras_t pras2; // priority register A for slave 0 uint32_t reserved4; volatile matrix_pras_t pras3; // priority register A for slave 0 uint32_t reserved5; volatile matrix_pras_t pras4; // priority register A for slave 0 uint32_t reserved6[28]; volatile ccfg_sysio_t sysio; // System I/O Configuration register uint32_t reserved7; volatile ccfg_smcnfcs_t smcnfcs; // SMC Chip Select NAND Flash Assignment Register uint32_t reserved8[49]; volatile matrix_wpmr_t wpmr; // Write Protect Mode Register volatile matrix_wpsr_t wpsr; // Write Protect Status Register } matrix_t; /** * Memory mapping for the MATRIX */ volatile matrix_t* MATRIX = (volatile matrix_t*) 0x400E0200; // MATRIX Base Address #endif // _SAM3SMATRIXHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/nvic/000077500000000000000000000000001207233610700215635ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/nvic/HplNVICC.nc000066400000000000000000000172731207233610700234250ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #include "sam3snvichardware.h" configuration HplNVICC { provides { interface HplNVICCntl; interface Init; interface HplNVICInterruptCntl as SUPCInterrupt; // SUPPLY CONTROLLER interface HplNVICInterruptCntl as RSTCInterrupt; // RESET CONTROLLER interface HplNVICInterruptCntl as RTCInterrupt; // REAL TIME CLOCK interface HplNVICInterruptCntl as RTTInterrupt; // REAL TIME TIMER interface HplNVICInterruptCntl as WDGInterrupt; // WATCHDOG TIMER interface HplNVICInterruptCntl as PMCInterrupt; // PMC interface HplNVICInterruptCntl as EFC0Interrupt; // EFC interface HplNVICInterruptCntl as RES0Interrupt; // Reserved interface HplNVICInterruptCntl as UART0Interrupt; // UART0 interface HplNVICInterruptCntl as UART1Interrupt; // UART1 interface HplNVICInterruptCntl as SMCInterrupt; // SMC interface HplNVICInterruptCntl as PIOAInterrupt; // PARALLEL I/O CONTROLLER A interface HplNVICInterruptCntl as PIOBInterrupt; // PARALLEL I/O CONTROLLER B interface HplNVICInterruptCntl as PIOCInterrupt; // PARALLEL I/O CONTROLLER C interface HplNVICInterruptCntl as USART0Interrupt; // USART0 interface HplNVICInterruptCntl as USART1Interrupt; // USART1 interface HplNVICInterruptCntl as RES1Interrupt; // Reserved interface HplNVICInterruptCntl as RES2Interrupt; // Reserved interface HplNVICInterruptCntl as HSMCIInterrupt; // HIGH SPEED MULTIMEDIA CARD INTERFACE interface HplNVICInterruptCntl as TWI0Interrupt; // TWO WIRE INTERFACE 0 interface HplNVICInterruptCntl as TWI1Interrupt; // TWO WIRE INTERFACE 1 interface HplNVICInterruptCntl as SPIInterrupt; // SERIAL PERIPHERAL INTERFACE interface HplNVICInterruptCntl as SSCInterrupt; // SYNCHRONOUS SERIAL CONTROLLER interface HplNVICInterruptCntl as TC0Interrupt; // TIMER/COUNTER 0 interface HplNVICInterruptCntl as TC1Interrupt; // TIMER/COUNTER 1 interface HplNVICInterruptCntl as TC2Interrupt; // TIMER/COUNTER 2 interface HplNVICInterruptCntl as TC3Interrupt; // TIMER/COUNTER 3 interface HplNVICInterruptCntl as TC4Interrupt; // TIMER/COUNTER 4 interface HplNVICInterruptCntl as TC5Interrupt; // TIMER/COUNTER 5 interface HplNVICInterruptCntl as ADCInterrupt; // ANALOG-TO-DIGITAL CONVERTER interface HplNVICInterruptCntl as DACCInterrupt; // DIGITAL-TO-ANALOG CONVERTE interface HplNVICInterruptCntl as PWMInterrupt; // PULSE WIDTH MODULATION interface HplNVICInterruptCntl as CRCCUInterrupt; // CRC CALCULATION UNIT interface HplNVICInterruptCntl as ACCInterrupt; // ANALOG COMPARATOR interface HplNVICInterruptCntl as UDPInterrupt; // USB DEVICE PORT } } implementation { components HplNVICCntlP, new HplNVICInterruptP(AT91C_ID_SUPC) as SUPC , new HplNVICInterruptP(AT91C_ID_RSTC) as RSTC , new HplNVICInterruptP(AT91C_ID_RTC) as RTC , new HplNVICInterruptP(AT91C_ID_RTT) as RTT , new HplNVICInterruptP(AT91C_ID_WDG) as WDG , new HplNVICInterruptP(AT91C_ID_PMC) as PMC , new HplNVICInterruptP(AT91C_ID_EFC0) as EFC0 , new HplNVICInterruptP(AT91C_ID_RES0) as RES0 , new HplNVICInterruptP(AT91C_ID_UART0) as UART0 , new HplNVICInterruptP(AT91C_ID_UART1) as UART1 , new HplNVICInterruptP(AT91C_ID_SMC) as SMC , new HplNVICInterruptP(AT91C_ID_PIOA) as PIOA , new HplNVICInterruptP(AT91C_ID_PIOB) as PIOB , new HplNVICInterruptP(AT91C_ID_PIOC) as PIOC , new HplNVICInterruptP(AT91C_ID_USART0) as USART0, new HplNVICInterruptP(AT91C_ID_USART1) as USART1, new HplNVICInterruptP(AT91C_ID_RES1) as RES1 , new HplNVICInterruptP(AT91C_ID_RES2) as RES2 , new HplNVICInterruptP(AT91C_ID_HSMCI) as HSMCI , new HplNVICInterruptP(AT91C_ID_TWI0) as TWI0 , new HplNVICInterruptP(AT91C_ID_TWI1) as TWI1 , new HplNVICInterruptP(AT91C_ID_SPI) as SPI , new HplNVICInterruptP(AT91C_ID_SSC) as SSC , new HplNVICInterruptP(AT91C_ID_TC0) as TC0 , new HplNVICInterruptP(AT91C_ID_TC1) as TC1 , new HplNVICInterruptP(AT91C_ID_TC2) as TC2 , new HplNVICInterruptP(AT91C_ID_TC3) as TC3 , new HplNVICInterruptP(AT91C_ID_TC4) as TC4 , new HplNVICInterruptP(AT91C_ID_TC5) as TC5 , new HplNVICInterruptP(AT91C_ID_ADC) as ADC , new HplNVICInterruptP(AT91C_ID_DACC) as DACC , new HplNVICInterruptP(AT91C_ID_PWM) as PWM , new HplNVICInterruptP(AT91C_ID_CRCCU) as CRCCU , new HplNVICInterruptP(AT91C_ID_ACC) as ACC , new HplNVICInterruptP(AT91C_ID_UDP) as UDP ; HplNVICCntl = HplNVICCntlP; Init = HplNVICCntlP; SUPCInterrupt = SUPC.Cntl; RSTCInterrupt = RSTC.Cntl; RTCInterrupt = RTC.Cntl; RTTInterrupt = RTT.Cntl; WDGInterrupt = WDG.Cntl; PMCInterrupt = PMC.Cntl; EFC0Interrupt = EFC0.Cntl; RES0Interrupt = RES0.Cntl; UART0Interrupt = UART0.Cntl; UART1Interrupt = UART1.Cntl; SMCInterrupt = SMC.Cntl; PIOAInterrupt = PIOA.Cntl; PIOBInterrupt = PIOB.Cntl; PIOCInterrupt = PIOC.Cntl; USART0Interrupt = USART0.Cntl; USART1Interrupt = USART1.Cntl; RES1Interrupt = RES1.Cntl; RES2Interrupt = RES2.Cntl; HSMCIInterrupt = HSMCI.Cntl; TWI0Interrupt = TWI0.Cntl; TWI1Interrupt = TWI1.Cntl; SPIInterrupt = SPI.Cntl; SSCInterrupt = SSC.Cntl; TC0Interrupt = TC0.Cntl; TC1Interrupt = TC1.Cntl; TC2Interrupt = TC2.Cntl; TC3Interrupt = TC3.Cntl; TC4Interrupt = TC4.Cntl; TC5Interrupt = TC5.Cntl; ADCInterrupt = ADC.Cntl; DACCInterrupt = DACC.Cntl; PWMInterrupt = PWM.Cntl; CRCCUInterrupt = CRCCU.Cntl; ACCInterrupt = ACC.Cntl; UDPInterrupt = UDP.Cntl; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/nvic/sam3snvichardware.h000066400000000000000000000120761207233610700253660ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ #ifndef SAM3SNVICHARDWARE_H #define SAM3SNVICHARDWARE_H #include "nvichardware.h" #include "sam3shardware.h" /// Interrupt sources typedef enum irqn { /****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ /****** AT91SAM3U4 specific Interrupt Numbers *********************************************************/ IRQn_SUPC = AT91C_ID_SUPC , // SUPPLY CONTROLLER IRQn_RSTC = AT91C_ID_RSTC , // RESET CONTROLLER IRQn_RTC = AT91C_ID_RTC , // REAL TIME CLOCK IRQn_RTT = AT91C_ID_RTT , // REAL TIME TIMER IRQn_WDG = AT91C_ID_WDG , // WATCHDOG TIMER IRQn_PMC = AT91C_ID_PMC , // PMC IRQn_EFC0 = AT91C_ID_EFC0 , // EFC IRQn_RES0 = AT91C_ID_RES0 , // Reserved IRQn_UART0 = AT91C_ID_UART0 , // UART0 IRQn_UART1 = AT91C_ID_UART1 , // UART1 IRQn_SMC = AT91C_ID_SMC , // SMC IRQn_PIOA = AT91C_ID_PIOA , // PARALLEL I/O CONTROLLER A IRQn_PIOB = AT91C_ID_PIOB , // PARALLEL I/O CONTROLLER B IRQn_PIOC = AT91C_ID_PIOC , // PARALLEL I/O CONTROLLER C IRQn_USART0 = AT91C_ID_USART0, // USART0 IRQn_USART1 = AT91C_ID_USART1, // USART1 IRQn_RES1 = AT91C_ID_RES1 , // Reserved IRQn_RES2 = AT91C_ID_RES2 , // Reserved IRQn_HSMCI = AT91C_ID_HSMCI , // HIGH SPEED MULTIMEDIA CARD INTERFACE IRQn_TWI0 = AT91C_ID_TWI0 , // TWO WIRE INTERFACE 0 IRQn_TWI1 = AT91C_ID_TWI1 , // TWO WIRE INTERFACE 1 IRQn_SPI = AT91C_ID_SPI , // SERIAL PERIPHERAL INTERFACE IRQn_SSC = AT91C_ID_SSC , // SYNCHRONOUS SERIAL CONTROLLER IRQn_TC0 = AT91C_ID_TC0 , // TIMER/COUNTER 0 IRQn_TC1 = AT91C_ID_TC1 , // TIMER/COUNTER 1 IRQn_TC2 = AT91C_ID_TC2 , // TIMER/COUNTER 2 IRQn_TC3 = AT91C_ID_TC3 , // TIMER/COUNTER 3 IRQn_TC4 = AT91C_ID_TC4 , // TIMER/COUNTER 4 IRQn_TC5 = AT91C_ID_TC5 , // TIMER/COUNTER 5 IRQn_ADC = AT91C_ID_ADC , // ANALOG-TO-DIGITAL CONVERTER IRQn_DACC = AT91C_ID_DACC , // DIGITAL-TO-ANALOG CONVERTE IRQn_PWM = AT91C_ID_PWM , // PULSE WIDTH MODULATION IRQn_CRCCU = AT91C_ID_CRCCU , // CRC CALCULATION UNIT IRQn_ACC = AT91C_ID_ACC , // ANALOG COMPARATOR IRQn_UDP = AT91C_ID_UDP // USB DEVICE PORT } irqn_t; #endif // SAM3SNVICHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/pdc/000077500000000000000000000000001207233610700213725ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/pdc/HplSam3sPdcC.nc000066400000000000000000000042331207233610700241020ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko * @author Thomas Schmid */ #include "sam3sadchardware.h" #include "sam3sdacchardware.h" #include "sam3spwmhardware.h" configuration HplSam3sPdcC { provides { interface HplSam3Pdc as AdcPdcControl; interface HplSam3Pdc as DacPdcControl; interface HplSam3Pdc as PwmPdcControl; } } implementation { components new HplSam3PdcP(ADC_BASE_ADDRESS) as AdcPdc; components new HplSam3PdcP(DACC_BASE_ADDRESS) as DacPdc; components new HplSam3PdcP(PWM_BASE_ADDRESS) as PwmPdc; AdcPdcControl = AdcPdc; DacPdcControl = DacPdc; PwmPdcControl = PwmPdc; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/pins/000077500000000000000000000000001207233610700215755ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/pins/HplSam3sGeneralIOC.nc000066400000000000000000000742511207233610700254130ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * General-purpose I/O abstraction for the SAM3S. * Includes PIO controllers A, B, C with 32 pins each. * TODO: There are other capabilities that are not integrated yet: * - pull down * - shitt trigger * - parallel capture * * @author Wanja Hofer * @author Thomas Schmid */ configuration HplSam3sGeneralIOC { provides { interface GeneralIO as PioA0; interface GeneralIO as PioA1; interface GeneralIO as PioA2; interface GeneralIO as PioA3; interface GeneralIO as PioA4; interface GeneralIO as PioA5; interface GeneralIO as PioA6; interface GeneralIO as PioA7; interface GeneralIO as PioA8; interface GeneralIO as PioA9; interface GeneralIO as PioA10; interface GeneralIO as PioA11; interface GeneralIO as PioA12; interface GeneralIO as PioA13; interface GeneralIO as PioA14; interface GeneralIO as PioA15; interface GeneralIO as PioA16; interface GeneralIO as PioA17; interface GeneralIO as PioA18; interface GeneralIO as PioA19; interface GeneralIO as PioA20; interface GeneralIO as PioA21; interface GeneralIO as PioA22; interface GeneralIO as PioA23; interface GeneralIO as PioA24; interface GeneralIO as PioA25; interface GeneralIO as PioA26; interface GeneralIO as PioA27; interface GeneralIO as PioA28; interface GeneralIO as PioA29; interface GeneralIO as PioA30; interface GeneralIO as PioA31; interface GeneralIO as PioB0; interface GeneralIO as PioB1; interface GeneralIO as PioB2; interface GeneralIO as PioB3; interface GeneralIO as PioB4; interface GeneralIO as PioB5; interface GeneralIO as PioB6; interface GeneralIO as PioB7; interface GeneralIO as PioB8; interface GeneralIO as PioB9; interface GeneralIO as PioB10; interface GeneralIO as PioB11; interface GeneralIO as PioB12; interface GeneralIO as PioB13; interface GeneralIO as PioB14; interface GeneralIO as PioB15; interface GeneralIO as PioB16; interface GeneralIO as PioB17; interface GeneralIO as PioB18; interface GeneralIO as PioB19; interface GeneralIO as PioB20; interface GeneralIO as PioB21; interface GeneralIO as PioB22; interface GeneralIO as PioB23; interface GeneralIO as PioB24; interface GeneralIO as PioB25; interface GeneralIO as PioB26; interface GeneralIO as PioB27; interface GeneralIO as PioB28; interface GeneralIO as PioB29; interface GeneralIO as PioB30; interface GeneralIO as PioB31; interface GeneralIO as PioC0; interface GeneralIO as PioC1; interface GeneralIO as PioC2; interface GeneralIO as PioC3; interface GeneralIO as PioC4; interface GeneralIO as PioC5; interface GeneralIO as PioC6; interface GeneralIO as PioC7; interface GeneralIO as PioC8; interface GeneralIO as PioC9; interface GeneralIO as PioC10; interface GeneralIO as PioC11; interface GeneralIO as PioC12; interface GeneralIO as PioC13; interface GeneralIO as PioC14; interface GeneralIO as PioC15; interface GeneralIO as PioC16; interface GeneralIO as PioC17; interface GeneralIO as PioC18; interface GeneralIO as PioC19; interface GeneralIO as PioC20; interface GeneralIO as PioC21; interface GeneralIO as PioC22; interface GeneralIO as PioC23; interface GeneralIO as PioC24; interface GeneralIO as PioC25; interface GeneralIO as PioC26; interface GeneralIO as PioC27; interface GeneralIO as PioC28; interface GeneralIO as PioC29; interface GeneralIO as PioC30; interface GeneralIO as PioC31; interface GpioInterrupt as InterruptPioA0; interface GpioInterrupt as InterruptPioA1; interface GpioInterrupt as InterruptPioA2; interface GpioInterrupt as InterruptPioA3; interface GpioInterrupt as InterruptPioA4; interface GpioInterrupt as InterruptPioA5; interface GpioInterrupt as InterruptPioA6; interface GpioInterrupt as InterruptPioA7; interface GpioInterrupt as InterruptPioA8; interface GpioInterrupt as InterruptPioA9; interface GpioInterrupt as InterruptPioA10; interface GpioInterrupt as InterruptPioA11; interface GpioInterrupt as InterruptPioA12; interface GpioInterrupt as InterruptPioA13; interface GpioInterrupt as InterruptPioA14; interface GpioInterrupt as InterruptPioA15; interface GpioInterrupt as InterruptPioA16; interface GpioInterrupt as InterruptPioA17; interface GpioInterrupt as InterruptPioA18; interface GpioInterrupt as InterruptPioA19; interface GpioInterrupt as InterruptPioA20; interface GpioInterrupt as InterruptPioA21; interface GpioInterrupt as InterruptPioA22; interface GpioInterrupt as InterruptPioA23; interface GpioInterrupt as InterruptPioA24; interface GpioInterrupt as InterruptPioA25; interface GpioInterrupt as InterruptPioA26; interface GpioInterrupt as InterruptPioA27; interface GpioInterrupt as InterruptPioA28; interface GpioInterrupt as InterruptPioA29; interface GpioInterrupt as InterruptPioA30; interface GpioInterrupt as InterruptPioA31; interface GpioInterrupt as InterruptPioB0; interface GpioInterrupt as InterruptPioB1; interface GpioInterrupt as InterruptPioB2; interface GpioInterrupt as InterruptPioB3; interface GpioInterrupt as InterruptPioB4; interface GpioInterrupt as InterruptPioB5; interface GpioInterrupt as InterruptPioB6; interface GpioInterrupt as InterruptPioB7; interface GpioInterrupt as InterruptPioB8; interface GpioInterrupt as InterruptPioB9; interface GpioInterrupt as InterruptPioB10; interface GpioInterrupt as InterruptPioB11; interface GpioInterrupt as InterruptPioB12; interface GpioInterrupt as InterruptPioB13; interface GpioInterrupt as InterruptPioB14; interface GpioInterrupt as InterruptPioB15; interface GpioInterrupt as InterruptPioB16; interface GpioInterrupt as InterruptPioB17; interface GpioInterrupt as InterruptPioB18; interface GpioInterrupt as InterruptPioB19; interface GpioInterrupt as InterruptPioB20; interface GpioInterrupt as InterruptPioB21; interface GpioInterrupt as InterruptPioB22; interface GpioInterrupt as InterruptPioB23; interface GpioInterrupt as InterruptPioB24; interface GpioInterrupt as InterruptPioB25; interface GpioInterrupt as InterruptPioB26; interface GpioInterrupt as InterruptPioB27; interface GpioInterrupt as InterruptPioB28; interface GpioInterrupt as InterruptPioB29; interface GpioInterrupt as InterruptPioB30; interface GpioInterrupt as InterruptPioB31; interface GpioInterrupt as InterruptPioC0; interface GpioInterrupt as InterruptPioC1; interface GpioInterrupt as InterruptPioC2; interface GpioInterrupt as InterruptPioC3; interface GpioInterrupt as InterruptPioC4; interface GpioInterrupt as InterruptPioC5; interface GpioInterrupt as InterruptPioC6; interface GpioInterrupt as InterruptPioC7; interface GpioInterrupt as InterruptPioC8; interface GpioInterrupt as InterruptPioC9; interface GpioInterrupt as InterruptPioC10; interface GpioInterrupt as InterruptPioC11; interface GpioInterrupt as InterruptPioC12; interface GpioInterrupt as InterruptPioC13; interface GpioInterrupt as InterruptPioC14; interface GpioInterrupt as InterruptPioC15; interface GpioInterrupt as InterruptPioC16; interface GpioInterrupt as InterruptPioC17; interface GpioInterrupt as InterruptPioC18; interface GpioInterrupt as InterruptPioC19; interface GpioInterrupt as InterruptPioC20; interface GpioInterrupt as InterruptPioC21; interface GpioInterrupt as InterruptPioC22; interface GpioInterrupt as InterruptPioC23; interface GpioInterrupt as InterruptPioC24; interface GpioInterrupt as InterruptPioC25; interface GpioInterrupt as InterruptPioC26; interface GpioInterrupt as InterruptPioC27; interface GpioInterrupt as InterruptPioC28; interface GpioInterrupt as InterruptPioC29; interface GpioInterrupt as InterruptPioC30; interface GpioInterrupt as InterruptPioC31; interface GpioCapture as CapturePioA0; interface GpioCapture as CapturePioA1; interface GpioCapture as CapturePioA2; interface GpioCapture as CapturePioA3; interface GpioCapture as CapturePioA4; interface GpioCapture as CapturePioA5; interface GpioCapture as CapturePioA6; interface GpioCapture as CapturePioA7; interface GpioCapture as CapturePioA8; interface GpioCapture as CapturePioA9; interface GpioCapture as CapturePioA10; interface GpioCapture as CapturePioA11; interface GpioCapture as CapturePioA12; interface GpioCapture as CapturePioA13; interface GpioCapture as CapturePioA14; interface GpioCapture as CapturePioA15; interface GpioCapture as CapturePioA16; interface GpioCapture as CapturePioA17; interface GpioCapture as CapturePioA18; interface GpioCapture as CapturePioA19; interface GpioCapture as CapturePioA20; interface GpioCapture as CapturePioA21; interface GpioCapture as CapturePioA22; interface GpioCapture as CapturePioA23; interface GpioCapture as CapturePioA24; interface GpioCapture as CapturePioA25; interface GpioCapture as CapturePioA26; interface GpioCapture as CapturePioA27; interface GpioCapture as CapturePioA28; interface GpioCapture as CapturePioA29; interface GpioCapture as CapturePioA30; interface GpioCapture as CapturePioA31; interface GpioCapture as CapturePioB0; interface GpioCapture as CapturePioB1; interface GpioCapture as CapturePioB2; interface GpioCapture as CapturePioB3; interface GpioCapture as CapturePioB4; interface GpioCapture as CapturePioB5; interface GpioCapture as CapturePioB6; interface GpioCapture as CapturePioB7; interface GpioCapture as CapturePioB8; interface GpioCapture as CapturePioB9; interface GpioCapture as CapturePioB10; interface GpioCapture as CapturePioB11; interface GpioCapture as CapturePioB12; interface GpioCapture as CapturePioB13; interface GpioCapture as CapturePioB14; interface GpioCapture as CapturePioB15; interface GpioCapture as CapturePioB16; interface GpioCapture as CapturePioB17; interface GpioCapture as CapturePioB18; interface GpioCapture as CapturePioB19; interface GpioCapture as CapturePioB20; interface GpioCapture as CapturePioB21; interface GpioCapture as CapturePioB22; interface GpioCapture as CapturePioB23; interface GpioCapture as CapturePioB24; interface GpioCapture as CapturePioB25; interface GpioCapture as CapturePioB26; interface GpioCapture as CapturePioB27; interface GpioCapture as CapturePioB28; interface GpioCapture as CapturePioB29; interface GpioCapture as CapturePioB30; interface GpioCapture as CapturePioB31; interface GpioCapture as CapturePioC0; interface GpioCapture as CapturePioC1; interface GpioCapture as CapturePioC2; interface GpioCapture as CapturePioC3; interface GpioCapture as CapturePioC4; interface GpioCapture as CapturePioC5; interface GpioCapture as CapturePioC6; interface GpioCapture as CapturePioC7; interface GpioCapture as CapturePioC8; interface GpioCapture as CapturePioC9; interface GpioCapture as CapturePioC10; interface GpioCapture as CapturePioC11; interface GpioCapture as CapturePioC12; interface GpioCapture as CapturePioC13; interface GpioCapture as CapturePioC14; interface GpioCapture as CapturePioC15; interface GpioCapture as CapturePioC16; interface GpioCapture as CapturePioC17; interface GpioCapture as CapturePioC18; interface GpioCapture as CapturePioC19; interface GpioCapture as CapturePioC20; interface GpioCapture as CapturePioC21; interface GpioCapture as CapturePioC22; interface GpioCapture as CapturePioC23; interface GpioCapture as CapturePioC24; interface GpioCapture as CapturePioC25; interface GpioCapture as CapturePioC26; interface GpioCapture as CapturePioC27; interface GpioCapture as CapturePioC28; interface GpioCapture as CapturePioC29; interface GpioCapture as CapturePioC30; interface GpioCapture as CapturePioC31; interface HplSam3GeneralIOPin as HplPioA0; interface HplSam3GeneralIOPin as HplPioA1; interface HplSam3GeneralIOPin as HplPioA2; interface HplSam3GeneralIOPin as HplPioA3; interface HplSam3GeneralIOPin as HplPioA4; interface HplSam3GeneralIOPin as HplPioA5; interface HplSam3GeneralIOPin as HplPioA6; interface HplSam3GeneralIOPin as HplPioA7; interface HplSam3GeneralIOPin as HplPioA8; interface HplSam3GeneralIOPin as HplPioA9; interface HplSam3GeneralIOPin as HplPioA10; interface HplSam3GeneralIOPin as HplPioA11; interface HplSam3GeneralIOPin as HplPioA12; interface HplSam3GeneralIOPin as HplPioA13; interface HplSam3GeneralIOPin as HplPioA14; interface HplSam3GeneralIOPin as HplPioA15; interface HplSam3GeneralIOPin as HplPioA16; interface HplSam3GeneralIOPin as HplPioA17; interface HplSam3GeneralIOPin as HplPioA18; interface HplSam3GeneralIOPin as HplPioA19; interface HplSam3GeneralIOPin as HplPioA20; interface HplSam3GeneralIOPin as HplPioA21; interface HplSam3GeneralIOPin as HplPioA22; interface HplSam3GeneralIOPin as HplPioA23; interface HplSam3GeneralIOPin as HplPioA24; interface HplSam3GeneralIOPin as HplPioA25; interface HplSam3GeneralIOPin as HplPioA26; interface HplSam3GeneralIOPin as HplPioA27; interface HplSam3GeneralIOPin as HplPioA28; interface HplSam3GeneralIOPin as HplPioA29; interface HplSam3GeneralIOPin as HplPioA30; interface HplSam3GeneralIOPin as HplPioA31; interface HplSam3GeneralIOPin as HplPioB0; interface HplSam3GeneralIOPin as HplPioB1; interface HplSam3GeneralIOPin as HplPioB2; interface HplSam3GeneralIOPin as HplPioB3; interface HplSam3GeneralIOPin as HplPioB4; interface HplSam3GeneralIOPin as HplPioB5; interface HplSam3GeneralIOPin as HplPioB6; interface HplSam3GeneralIOPin as HplPioB7; interface HplSam3GeneralIOPin as HplPioB8; interface HplSam3GeneralIOPin as HplPioB9; interface HplSam3GeneralIOPin as HplPioB10; interface HplSam3GeneralIOPin as HplPioB11; interface HplSam3GeneralIOPin as HplPioB12; interface HplSam3GeneralIOPin as HplPioB13; interface HplSam3GeneralIOPin as HplPioB14; interface HplSam3GeneralIOPin as HplPioB15; interface HplSam3GeneralIOPin as HplPioB16; interface HplSam3GeneralIOPin as HplPioB17; interface HplSam3GeneralIOPin as HplPioB18; interface HplSam3GeneralIOPin as HplPioB19; interface HplSam3GeneralIOPin as HplPioB20; interface HplSam3GeneralIOPin as HplPioB21; interface HplSam3GeneralIOPin as HplPioB22; interface HplSam3GeneralIOPin as HplPioB23; interface HplSam3GeneralIOPin as HplPioB24; interface HplSam3GeneralIOPin as HplPioB25; interface HplSam3GeneralIOPin as HplPioB26; interface HplSam3GeneralIOPin as HplPioB27; interface HplSam3GeneralIOPin as HplPioB28; interface HplSam3GeneralIOPin as HplPioB29; interface HplSam3GeneralIOPin as HplPioB30; interface HplSam3GeneralIOPin as HplPioB31; interface HplSam3GeneralIOPin as HplPioC0; interface HplSam3GeneralIOPin as HplPioC1; interface HplSam3GeneralIOPin as HplPioC2; interface HplSam3GeneralIOPin as HplPioC3; interface HplSam3GeneralIOPin as HplPioC4; interface HplSam3GeneralIOPin as HplPioC5; interface HplSam3GeneralIOPin as HplPioC6; interface HplSam3GeneralIOPin as HplPioC7; interface HplSam3GeneralIOPin as HplPioC8; interface HplSam3GeneralIOPin as HplPioC9; interface HplSam3GeneralIOPin as HplPioC10; interface HplSam3GeneralIOPin as HplPioC11; interface HplSam3GeneralIOPin as HplPioC12; interface HplSam3GeneralIOPin as HplPioC13; interface HplSam3GeneralIOPin as HplPioC14; interface HplSam3GeneralIOPin as HplPioC15; interface HplSam3GeneralIOPin as HplPioC16; interface HplSam3GeneralIOPin as HplPioC17; interface HplSam3GeneralIOPin as HplPioC18; interface HplSam3GeneralIOPin as HplPioC19; interface HplSam3GeneralIOPin as HplPioC20; interface HplSam3GeneralIOPin as HplPioC21; interface HplSam3GeneralIOPin as HplPioC22; interface HplSam3GeneralIOPin as HplPioC23; interface HplSam3GeneralIOPin as HplPioC24; interface HplSam3GeneralIOPin as HplPioC25; interface HplSam3GeneralIOPin as HplPioC26; interface HplSam3GeneralIOPin as HplPioC27; interface HplSam3GeneralIOPin as HplPioC28; interface HplSam3GeneralIOPin as HplPioC29; interface HplSam3GeneralIOPin as HplPioC30; interface HplSam3GeneralIOPin as HplPioC31; } } implementation { components new HplSam3GeneralIOPioC(0x400e0e00) as PioA, new HplSam3GeneralIOPioC(0x400e1000) as PioB, new HplSam3GeneralIOPioC(0x400e1200) as PioC; components HplSam3GeneralIOP; PioA.HplPort -> HplSam3GeneralIOP.HplPortA; PioB.HplPort -> HplSam3GeneralIOP.HplPortB; PioC.HplPort -> HplSam3GeneralIOP.HplPortC; components McuSleepC; HplSam3GeneralIOP.PioAInterruptWrapper -> McuSleepC; HplSam3GeneralIOP.PioBInterruptWrapper -> McuSleepC; HplSam3GeneralIOP.PioCInterruptWrapper -> McuSleepC; components HplNVICC, HplSam3sClockC; PioA.PIOIrqControl -> HplNVICC.PIOAInterrupt; PioA.PIOClockControl -> HplSam3sClockC.PIOACntl; PioB.PIOIrqControl -> HplNVICC.PIOBInterrupt; PioB.PIOClockControl -> HplSam3sClockC.PIOBCntl; PioC.PIOIrqControl -> HplNVICC.PIOCInterrupt; PioC.PIOClockControl -> HplSam3sClockC.PIOCCntl; PioA0 = PioA.Pin0; PioA1 = PioA.Pin1; PioA2 = PioA.Pin2; PioA3 = PioA.Pin3; PioA4 = PioA.Pin4; PioA5 = PioA.Pin5; PioA6 = PioA.Pin6; PioA7 = PioA.Pin7; PioA8 = PioA.Pin8; PioA9 = PioA.Pin9; PioA10 = PioA.Pin10; PioA11 = PioA.Pin11; PioA12 = PioA.Pin12; PioA13 = PioA.Pin13; PioA14 = PioA.Pin14; PioA15 = PioA.Pin15; PioA16 = PioA.Pin16; PioA17 = PioA.Pin17; PioA18 = PioA.Pin18; PioA19 = PioA.Pin19; PioA20 = PioA.Pin20; PioA21 = PioA.Pin21; PioA22 = PioA.Pin22; PioA23 = PioA.Pin23; PioA24 = PioA.Pin24; PioA25 = PioA.Pin25; PioA26 = PioA.Pin26; PioA27 = PioA.Pin27; PioA28 = PioA.Pin28; PioA29 = PioA.Pin29; PioA30 = PioA.Pin30; PioA31 = PioA.Pin31; PioB0 = PioB.Pin0; PioB1 = PioB.Pin1; PioB2 = PioB.Pin2; PioB3 = PioB.Pin3; PioB4 = PioB.Pin4; PioB5 = PioB.Pin5; PioB6 = PioB.Pin6; PioB7 = PioB.Pin7; PioB8 = PioB.Pin8; PioB9 = PioB.Pin9; PioB10 = PioB.Pin10; PioB11 = PioB.Pin11; PioB12 = PioB.Pin12; PioB13 = PioB.Pin13; PioB14 = PioB.Pin14; PioB15 = PioB.Pin15; PioB16 = PioB.Pin16; PioB17 = PioB.Pin17; PioB18 = PioB.Pin18; PioB19 = PioB.Pin19; PioB20 = PioB.Pin20; PioB21 = PioB.Pin21; PioB22 = PioB.Pin22; PioB23 = PioB.Pin23; PioB24 = PioB.Pin24; PioB25 = PioB.Pin25; PioB26 = PioB.Pin26; PioB27 = PioB.Pin27; PioB28 = PioB.Pin28; PioB29 = PioB.Pin29; PioB30 = PioB.Pin30; PioB31 = PioB.Pin31; PioC0 = PioC.Pin0; PioC1 = PioC.Pin1; PioC2 = PioC.Pin2; PioC3 = PioC.Pin3; PioC4 = PioC.Pin4; PioC5 = PioC.Pin5; PioC6 = PioC.Pin6; PioC7 = PioC.Pin7; PioC8 = PioC.Pin8; PioC9 = PioC.Pin9; PioC10 = PioC.Pin10; PioC11 = PioC.Pin11; PioC12 = PioC.Pin12; PioC13 = PioC.Pin13; PioC14 = PioC.Pin14; PioC15 = PioC.Pin15; PioC16 = PioC.Pin16; PioC17 = PioC.Pin17; PioC18 = PioC.Pin18; PioC19 = PioC.Pin19; PioC20 = PioC.Pin20; PioC21 = PioC.Pin21; PioC22 = PioC.Pin22; PioC23 = PioC.Pin23; PioC24 = PioC.Pin24; PioC25 = PioC.Pin25; PioC26 = PioC.Pin26; PioC27 = PioC.Pin27; PioC28 = PioC.Pin28; PioC29 = PioC.Pin29; PioC30 = PioC.Pin30; PioC31 = PioC.Pin31; InterruptPioA0 = PioA.InterruptPin0; InterruptPioA1 = PioA.InterruptPin1; InterruptPioA2 = PioA.InterruptPin2; InterruptPioA3 = PioA.InterruptPin3; InterruptPioA4 = PioA.InterruptPin4; InterruptPioA5 = PioA.InterruptPin5; InterruptPioA6 = PioA.InterruptPin6; InterruptPioA7 = PioA.InterruptPin7; InterruptPioA8 = PioA.InterruptPin8; InterruptPioA9 = PioA.InterruptPin9; InterruptPioA10 = PioA.InterruptPin10; InterruptPioA11 = PioA.InterruptPin11; InterruptPioA12 = PioA.InterruptPin12; InterruptPioA13 = PioA.InterruptPin13; InterruptPioA14 = PioA.InterruptPin14; InterruptPioA15 = PioA.InterruptPin15; InterruptPioA16 = PioA.InterruptPin16; InterruptPioA17 = PioA.InterruptPin17; InterruptPioA18 = PioA.InterruptPin18; InterruptPioA19 = PioA.InterruptPin19; InterruptPioA20 = PioA.InterruptPin20; InterruptPioA21 = PioA.InterruptPin21; InterruptPioA22 = PioA.InterruptPin22; InterruptPioA23 = PioA.InterruptPin23; InterruptPioA24 = PioA.InterruptPin24; InterruptPioA25 = PioA.InterruptPin25; InterruptPioA26 = PioA.InterruptPin26; InterruptPioA27 = PioA.InterruptPin27; InterruptPioA28 = PioA.InterruptPin28; InterruptPioA29 = PioA.InterruptPin29; InterruptPioA30 = PioA.InterruptPin30; InterruptPioA31 = PioA.InterruptPin31; InterruptPioB0 = PioB.InterruptPin0; InterruptPioB1 = PioB.InterruptPin1; InterruptPioB2 = PioB.InterruptPin2; InterruptPioB3 = PioB.InterruptPin3; InterruptPioB4 = PioB.InterruptPin4; InterruptPioB5 = PioB.InterruptPin5; InterruptPioB6 = PioB.InterruptPin6; InterruptPioB7 = PioB.InterruptPin7; InterruptPioB8 = PioB.InterruptPin8; InterruptPioB9 = PioB.InterruptPin9; InterruptPioB10 = PioB.InterruptPin10; InterruptPioB11 = PioB.InterruptPin11; InterruptPioB12 = PioB.InterruptPin12; InterruptPioB13 = PioB.InterruptPin13; InterruptPioB14 = PioB.InterruptPin14; InterruptPioB15 = PioB.InterruptPin15; InterruptPioB16 = PioB.InterruptPin16; InterruptPioB17 = PioB.InterruptPin17; InterruptPioB18 = PioB.InterruptPin18; InterruptPioB19 = PioB.InterruptPin19; InterruptPioB20 = PioB.InterruptPin20; InterruptPioB21 = PioB.InterruptPin21; InterruptPioB22 = PioB.InterruptPin22; InterruptPioB23 = PioB.InterruptPin23; InterruptPioB24 = PioB.InterruptPin24; InterruptPioB25 = PioB.InterruptPin25; InterruptPioB26 = PioB.InterruptPin26; InterruptPioB27 = PioB.InterruptPin27; InterruptPioB28 = PioB.InterruptPin28; InterruptPioB29 = PioB.InterruptPin29; InterruptPioB30 = PioB.InterruptPin30; InterruptPioB31 = PioB.InterruptPin31; InterruptPioC0 = PioC.InterruptPin0; InterruptPioC1 = PioC.InterruptPin1; InterruptPioC2 = PioC.InterruptPin2; InterruptPioC3 = PioC.InterruptPin3; InterruptPioC4 = PioC.InterruptPin4; InterruptPioC5 = PioC.InterruptPin5; InterruptPioC6 = PioC.InterruptPin6; InterruptPioC7 = PioC.InterruptPin7; InterruptPioC8 = PioC.InterruptPin8; InterruptPioC9 = PioC.InterruptPin9; InterruptPioC10 = PioC.InterruptPin10; InterruptPioC11 = PioC.InterruptPin11; InterruptPioC12 = PioC.InterruptPin12; InterruptPioC13 = PioC.InterruptPin13; InterruptPioC14 = PioC.InterruptPin14; InterruptPioC15 = PioC.InterruptPin15; InterruptPioC16 = PioC.InterruptPin16; InterruptPioC17 = PioC.InterruptPin17; InterruptPioC18 = PioC.InterruptPin18; InterruptPioC19 = PioC.InterruptPin19; InterruptPioC20 = PioC.InterruptPin20; InterruptPioC21 = PioC.InterruptPin21; InterruptPioC22 = PioC.InterruptPin22; InterruptPioC23 = PioC.InterruptPin23; InterruptPioC24 = PioC.InterruptPin24; InterruptPioC25 = PioC.InterruptPin25; InterruptPioC26 = PioC.InterruptPin26; InterruptPioC27 = PioC.InterruptPin27; InterruptPioC28 = PioC.InterruptPin28; InterruptPioC29 = PioC.InterruptPin29; InterruptPioC30 = PioC.InterruptPin30; InterruptPioC31 = PioC.InterruptPin31; CapturePioA0 = PioA.CapturePin0; CapturePioA1 = PioA.CapturePin1; CapturePioA2 = PioA.CapturePin2; CapturePioA3 = PioA.CapturePin3; CapturePioA4 = PioA.CapturePin4; CapturePioA5 = PioA.CapturePin5; CapturePioA6 = PioA.CapturePin6; CapturePioA7 = PioA.CapturePin7; CapturePioA8 = PioA.CapturePin8; CapturePioA9 = PioA.CapturePin9; CapturePioA10 = PioA.CapturePin10; CapturePioA11 = PioA.CapturePin11; CapturePioA12 = PioA.CapturePin12; CapturePioA13 = PioA.CapturePin13; CapturePioA14 = PioA.CapturePin14; CapturePioA15 = PioA.CapturePin15; CapturePioA16 = PioA.CapturePin16; CapturePioA17 = PioA.CapturePin17; CapturePioA18 = PioA.CapturePin18; CapturePioA19 = PioA.CapturePin19; CapturePioA20 = PioA.CapturePin20; CapturePioA21 = PioA.CapturePin21; CapturePioA22 = PioA.CapturePin22; CapturePioA23 = PioA.CapturePin23; CapturePioA24 = PioA.CapturePin24; CapturePioA25 = PioA.CapturePin25; CapturePioA26 = PioA.CapturePin26; CapturePioA27 = PioA.CapturePin27; CapturePioA28 = PioA.CapturePin28; CapturePioA29 = PioA.CapturePin29; CapturePioA30 = PioA.CapturePin30; CapturePioA31 = PioA.CapturePin31; CapturePioB0 = PioB.CapturePin0; CapturePioB1 = PioB.CapturePin1; CapturePioB2 = PioB.CapturePin2; CapturePioB3 = PioB.CapturePin3; CapturePioB4 = PioB.CapturePin4; CapturePioB5 = PioB.CapturePin5; CapturePioB6 = PioB.CapturePin6; CapturePioB7 = PioB.CapturePin7; CapturePioB8 = PioB.CapturePin8; CapturePioB9 = PioB.CapturePin9; CapturePioB10 = PioB.CapturePin10; CapturePioB11 = PioB.CapturePin11; CapturePioB12 = PioB.CapturePin12; CapturePioB13 = PioB.CapturePin13; CapturePioB14 = PioB.CapturePin14; CapturePioB15 = PioB.CapturePin15; CapturePioB16 = PioB.CapturePin16; CapturePioB17 = PioB.CapturePin17; CapturePioB18 = PioB.CapturePin18; CapturePioB19 = PioB.CapturePin19; CapturePioB20 = PioB.CapturePin20; CapturePioB21 = PioB.CapturePin21; CapturePioB22 = PioB.CapturePin22; CapturePioB23 = PioB.CapturePin23; CapturePioB24 = PioB.CapturePin24; CapturePioB25 = PioB.CapturePin25; CapturePioB26 = PioB.CapturePin26; CapturePioB27 = PioB.CapturePin27; CapturePioB28 = PioB.CapturePin28; CapturePioB29 = PioB.CapturePin29; CapturePioB30 = PioB.CapturePin30; CapturePioB31 = PioB.CapturePin31; CapturePioC0 = PioC.CapturePin0; CapturePioC1 = PioC.CapturePin1; CapturePioC2 = PioC.CapturePin2; CapturePioC3 = PioC.CapturePin3; CapturePioC4 = PioC.CapturePin4; CapturePioC5 = PioC.CapturePin5; CapturePioC6 = PioC.CapturePin6; CapturePioC7 = PioC.CapturePin7; CapturePioC8 = PioC.CapturePin8; CapturePioC9 = PioC.CapturePin9; CapturePioC10 = PioC.CapturePin10; CapturePioC11 = PioC.CapturePin11; CapturePioC12 = PioC.CapturePin12; CapturePioC13 = PioC.CapturePin13; CapturePioC14 = PioC.CapturePin14; CapturePioC15 = PioC.CapturePin15; CapturePioC16 = PioC.CapturePin16; CapturePioC17 = PioC.CapturePin17; CapturePioC18 = PioC.CapturePin18; CapturePioC19 = PioC.CapturePin19; CapturePioC20 = PioC.CapturePin20; CapturePioC21 = PioC.CapturePin21; CapturePioC22 = PioC.CapturePin22; CapturePioC23 = PioC.CapturePin23; CapturePioC24 = PioC.CapturePin24; CapturePioC25 = PioC.CapturePin25; CapturePioC26 = PioC.CapturePin26; CapturePioC27 = PioC.CapturePin27; CapturePioC28 = PioC.CapturePin28; CapturePioC29 = PioC.CapturePin29; CapturePioC30 = PioC.CapturePin30; CapturePioC31 = PioC.CapturePin31; HplPioA0 = PioA.HplPin0; HplPioA1 = PioA.HplPin1; HplPioA2 = PioA.HplPin2; HplPioA3 = PioA.HplPin3; HplPioA4 = PioA.HplPin4; HplPioA5 = PioA.HplPin5; HplPioA6 = PioA.HplPin6; HplPioA7 = PioA.HplPin7; HplPioA8 = PioA.HplPin8; HplPioA9 = PioA.HplPin9; HplPioA10 = PioA.HplPin10; HplPioA11 = PioA.HplPin11; HplPioA12 = PioA.HplPin12; HplPioA13 = PioA.HplPin13; HplPioA14 = PioA.HplPin14; HplPioA15 = PioA.HplPin15; HplPioA16 = PioA.HplPin16; HplPioA17 = PioA.HplPin17; HplPioA18 = PioA.HplPin18; HplPioA19 = PioA.HplPin19; HplPioA20 = PioA.HplPin20; HplPioA21 = PioA.HplPin21; HplPioA22 = PioA.HplPin22; HplPioA23 = PioA.HplPin23; HplPioA24 = PioA.HplPin24; HplPioA25 = PioA.HplPin25; HplPioA26 = PioA.HplPin26; HplPioA27 = PioA.HplPin27; HplPioA28 = PioA.HplPin28; HplPioA29 = PioA.HplPin29; HplPioA30 = PioA.HplPin30; HplPioA31 = PioA.HplPin31; HplPioB0 = PioB.HplPin0; HplPioB1 = PioB.HplPin1; HplPioB2 = PioB.HplPin2; HplPioB3 = PioB.HplPin3; HplPioB4 = PioB.HplPin4; HplPioB5 = PioB.HplPin5; HplPioB6 = PioB.HplPin6; HplPioB7 = PioB.HplPin7; HplPioB8 = PioB.HplPin8; HplPioB9 = PioB.HplPin9; HplPioB10 = PioB.HplPin10; HplPioB11 = PioB.HplPin11; HplPioB12 = PioB.HplPin12; HplPioB13 = PioB.HplPin13; HplPioB14 = PioB.HplPin14; HplPioB15 = PioB.HplPin15; HplPioB16 = PioB.HplPin16; HplPioB17 = PioB.HplPin17; HplPioB18 = PioB.HplPin18; HplPioB19 = PioB.HplPin19; HplPioB20 = PioB.HplPin20; HplPioB21 = PioB.HplPin21; HplPioB22 = PioB.HplPin22; HplPioB23 = PioB.HplPin23; HplPioB24 = PioB.HplPin24; HplPioB25 = PioB.HplPin25; HplPioB26 = PioB.HplPin26; HplPioB27 = PioB.HplPin27; HplPioB28 = PioB.HplPin28; HplPioB29 = PioB.HplPin29; HplPioB30 = PioB.HplPin30; HplPioB31 = PioB.HplPin31; HplPioC0 = PioC.HplPin0; HplPioC1 = PioC.HplPin1; HplPioC2 = PioC.HplPin2; HplPioC3 = PioC.HplPin3; HplPioC4 = PioC.HplPin4; HplPioC5 = PioC.HplPin5; HplPioC6 = PioC.HplPin6; HplPioC7 = PioC.HplPin7; HplPioC8 = PioC.HplPin8; HplPioC9 = PioC.HplPin9; HplPioC10 = PioC.HplPin10; HplPioC11 = PioC.HplPin11; HplPioC12 = PioC.HplPin12; HplPioC13 = PioC.HplPin13; HplPioC14 = PioC.HplPin14; HplPioC15 = PioC.HplPin15; HplPioC16 = PioC.HplPin16; HplPioC17 = PioC.HplPin17; HplPioC18 = PioC.HplPin18; HplPioC19 = PioC.HplPin19; HplPioC20 = PioC.HplPin20; HplPioC21 = PioC.HplPin21; HplPioC22 = PioC.HplPin22; HplPioC23 = PioC.HplPin23; HplPioC24 = PioC.HplPin24; HplPioC25 = PioC.HplPin25; HplPioC26 = PioC.HplPin26; HplPioC27 = PioC.HplPin27; HplPioC28 = PioC.HplPin28; HplPioC29 = PioC.HplPin29; HplPioC30 = PioC.HplPin30; HplPioC31 = PioC.HplPin31; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/pmc/000077500000000000000000000000001207233610700214035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/pmc/HplSam3sClockC.nc000066400000000000000000000166131207233610700244450ustar00rootroot00000000000000/** * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * This is the main configuration for the low-layer clock module. * * @author Thomas Schmid */ configuration HplSam3sClockC { provides { interface HplSam3Clock; interface HplSam3PeripheralClockCntl as RTCCntl; interface HplSam3PeripheralClockCntl as RTTCntl; interface HplSam3PeripheralClockCntl as WDGCntl; interface HplSam3PeripheralClockCntl as PMCCntl; interface HplSam3PeripheralClockCntl as EFC0Cntl; interface HplSam3PeripheralClockCntl as RES0Cntl; interface HplSam3PeripheralClockCntl as UART0Cntl; interface HplSam3PeripheralClockCntl as UART1Cntl; interface HplSam3PeripheralClockCntl as SMCCntl; interface HplSam3PeripheralClockCntl as PIOACntl; interface HplSam3PeripheralClockCntl as PIOBCntl; interface HplSam3PeripheralClockCntl as PIOCCntl; interface HplSam3PeripheralClockCntl as USART0Cntl; interface HplSam3PeripheralClockCntl as USART1Cntl; interface HplSam3PeripheralClockCntl as RES1Cntl; interface HplSam3PeripheralClockCntl as RES2Cntl; interface HplSam3PeripheralClockCntl as HSMCICntl; interface HplSam3PeripheralClockCntl as TWI0Cntl; interface HplSam3PeripheralClockCntl as TWI1Cntl; interface HplSam3PeripheralClockCntl as SPICntl; interface HplSam3PeripheralClockCntl as SSCCntl; interface HplSam3PeripheralClockCntl as TC0Cntl; interface HplSam3PeripheralClockCntl as TC1Cntl; interface HplSam3PeripheralClockCntl as TC2Cntl; interface HplSam3PeripheralClockCntl as TC3Cntl; interface HplSam3PeripheralClockCntl as TC4Cntl; interface HplSam3PeripheralClockCntl as TC5Cntl; interface HplSam3PeripheralClockCntl as ADCCntl; interface HplSam3PeripheralClockCntl as DACCCntl; interface HplSam3PeripheralClockCntl as PWMCntl; interface HplSam3PeripheralClockCntl as CRCCUCntl; interface HplSam3PeripheralClockCntl as ACCCntl; interface HplSam3PeripheralClockCntl as UDPCntl; } } implementation { #define PMC_PC_BASE 0x400e0410 #define PMC_PC1_BASE 0x400e0500 components HplSam3sClockP, new HplSam3PeripheralClockP(AT91C_ID_RTC ,PMC_PC_BASE ) as RTC, new HplSam3PeripheralClockP(AT91C_ID_RTT ,PMC_PC_BASE ) as RTT, new HplSam3PeripheralClockP(AT91C_ID_WDG ,PMC_PC_BASE ) as WDG, new HplSam3PeripheralClockP(AT91C_ID_PMC ,PMC_PC_BASE ) as PMC, new HplSam3PeripheralClockP(AT91C_ID_EFC0 ,PMC_PC_BASE ) as EFC0, new HplSam3PeripheralClockP(AT91C_ID_RES0 ,PMC_PC_BASE ) as RES0, new HplSam3PeripheralClockP(AT91C_ID_UART0 ,PMC_PC_BASE ) as UART0, new HplSam3PeripheralClockP(AT91C_ID_UART1 ,PMC_PC_BASE ) as UART1, new HplSam3PeripheralClockP(AT91C_ID_SMC ,PMC_PC_BASE ) as SMC, new HplSam3PeripheralClockP(AT91C_ID_PIOA ,PMC_PC_BASE ) as PIOA, new HplSam3PeripheralClockP(AT91C_ID_PIOB ,PMC_PC_BASE ) as PIOB, new HplSam3PeripheralClockP(AT91C_ID_PIOC ,PMC_PC_BASE ) as PIOC, new HplSam3PeripheralClockP(AT91C_ID_USART0,PMC_PC_BASE ) as USART0, new HplSam3PeripheralClockP(AT91C_ID_USART1,PMC_PC_BASE ) as USART1, new HplSam3PeripheralClockP(AT91C_ID_RES1 ,PMC_PC_BASE ) as RES1, new HplSam3PeripheralClockP(AT91C_ID_RES2 ,PMC_PC_BASE ) as RES2, new HplSam3PeripheralClockP(AT91C_ID_HSMCI ,PMC_PC_BASE ) as HSMCI, new HplSam3PeripheralClockP(AT91C_ID_TWI0 ,PMC_PC_BASE ) as TWI0, new HplSam3PeripheralClockP(AT91C_ID_TWI1 ,PMC_PC_BASE ) as TWI1, new HplSam3PeripheralClockP(AT91C_ID_SPI ,PMC_PC_BASE ) as SPI, new HplSam3PeripheralClockP(AT91C_ID_SSC ,PMC_PC_BASE ) as SSC, new HplSam3PeripheralClockP(AT91C_ID_TC0 ,PMC_PC_BASE ) as TC0, new HplSam3PeripheralClockP(AT91C_ID_TC1 ,PMC_PC_BASE ) as TC1, new HplSam3PeripheralClockP(AT91C_ID_TC2 ,PMC_PC_BASE ) as TC2, new HplSam3PeripheralClockP(AT91C_ID_TC3 ,PMC_PC_BASE ) as TC3, new HplSam3PeripheralClockP(AT91C_ID_TC4 ,PMC_PC_BASE ) as TC4, new HplSam3PeripheralClockP(AT91C_ID_TC5 ,PMC_PC_BASE ) as TC5, new HplSam3PeripheralClockP(AT91C_ID_ADC ,PMC_PC_BASE ) as ADC, new HplSam3PeripheralClockP(AT91C_ID_DACC ,PMC_PC_BASE ) as DACC, new HplSam3PeripheralClockP(AT91C_ID_PWM ,PMC_PC_BASE ) as PWM, new HplSam3PeripheralClockP(AT91C_ID_CRCCU ,PMC_PC1_BASE) as CRCCU, new HplSam3PeripheralClockP(AT91C_ID_ACC ,PMC_PC1_BASE) as ACC, new HplSam3PeripheralClockP(AT91C_ID_UDP ,PMC_PC1_BASE) as UDP; HplSam3Clock = HplSam3sClockP; RTCCntl = RTC.Cntl; RTTCntl = RTT.Cntl; WDGCntl = WDG.Cntl; PMCCntl = PMC.Cntl; EFC0Cntl = EFC0.Cntl; RES0Cntl = RES0.Cntl; UART0Cntl = UART0.Cntl; UART1Cntl = UART1.Cntl; SMCCntl = SMC.Cntl; PIOACntl = PIOA.Cntl; PIOBCntl = PIOB.Cntl; PIOCCntl = PIOC.Cntl; USART0Cntl = USART0.Cntl; USART1Cntl = USART1.Cntl; RES1Cntl = RES1.Cntl; RES2Cntl = RES2.Cntl; HSMCICntl = HSMCI.Cntl; TWI0Cntl = TWI0.Cntl; TWI1Cntl = TWI1.Cntl; SPICntl = SPI.Cntl; SSCCntl = SSC.Cntl; TC0Cntl = TC0.Cntl; TC1Cntl = TC1.Cntl; TC2Cntl = TC2.Cntl; TC3Cntl = TC3.Cntl; TC4Cntl = TC4.Cntl; TC5Cntl = TC5.Cntl; ADCCntl = ADC.Cntl; DACCCntl = DACC.Cntl; PWMCntl = PWM.Cntl; CRCCUCntl = CRCCU.Cntl; ACCCntl = ACC.Cntl; UDPCntl = UDP.Cntl; components McuSleepC; McuSleepC.HplSam3Clock -> HplSam3sClockP; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/pmc/HplSam3sClockP.nc000066400000000000000000000357031207233610700244630ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * This is a low-level clock component controlling the different clock * systems. * * @author Thomas Schmid */ #include "sam3spmchardware.h" #include "sam3ssupchardware.h" #define CLOCK_TIMEOUT 0xFFFFFFFF module HplSam3sClockP { provides { interface HplSam3Clock; } } implementation { async command error_t HplSam3Clock.slckExternalOsc() { uint32_t timeout = 0; if(SUPC->sr.bits.oscsel == 0) { supc_cr_t cr; cr.flat = 0; // assure it is all zero! cr.bits.xtalsel = 1; cr.bits.key = SUPC_CR_KEY; SUPC->cr = cr; timeout = 0; while (!(SUPC->sr.bits.oscsel) && (timeout++ < CLOCK_TIMEOUT)); } return SUCCESS; } async command error_t HplSam3Clock.slckRCOsc() { uint32_t timeout = 0; if(SUPC->sr.bits.oscsel == 1) { supc_cr_t cr; cr.flat = 0; // assure it is all zero! cr.bits.xtalsel = 0; cr.bits.key = SUPC_CR_KEY; SUPC->cr = cr; timeout = 0; while (!(SUPC->sr.bits.oscsel) && (timeout++ < CLOCK_TIMEOUT)); } return SUCCESS; } async command error_t HplSam3Clock.mckInit48() { pmc_mor_t mor; pmc_mckr_t mckr; pmc_pllar_t pllar; uint32_t timeout = 0; // Check if MCK source is RC or XT if(PMC->mor.bits.moscsel == 0) { // it is RC, turn on XT mor.flat = 0; // make sure it is zreoed out mor.bits.key = PMC_MOR_KEY; mor.bits.moscxtst = 0x3F; // main oscillator startup time mor.bits.moscrcen = 1; // enable the on-chip rc oscillator mor.bits.moscxten = 1; // main crystal oscillator enable PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscxts) && (timeout++ < CLOCK_TIMEOUT)); } // Switch to XT mor.flat = 0; // make sure it is zeroed mor.bits.key = PMC_MOR_KEY; mor.bits.moscxtst = 0x3F; mor.bits.moscrcen = 1; mor.bits.moscxten = 1; mor.bits.moscsel = 1; PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscsels) && (timeout++ < CLOCK_TIMEOUT)); mckr = PMC->mckr; mckr.bits.css = PMC_MCKR_CSS_MAIN_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); // Initialize PLLA pllar.flat = 0; // make sure it is zeroed out pllar.bits.bit29 = 1; // we always have to do this! pllar.bits.mula = 0x3; // multiplication is MULA+1 => 12x4 = 48MHz pllar.bits.pllacount = 0x3F; pllar.bits.diva = 0x1; // divider is bypassed PMC->pllar = pllar; timeout = 0; while (!(PMC->sr.bits.locka) && (timeout++ < CLOCK_TIMEOUT)); // Switch to fast clock mckr.bits.css = PMC_MCKR_CSS_MAIN_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); mckr.bits.pres = PMC_MCKR_PRES_DIV_1; mckr.bits.css = PMC_MCKR_CSS_PLLA_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); signal HplSam3Clock.mainClockChanged(); return SUCCESS; } async command error_t HplSam3Clock.mckInit84() { pmc_mor_t mor; pmc_mckr_t mckr; pmc_pllar_t pllar; uint32_t timeout = 0; // Check if MCK source is RC or XT if(PMC->mor.bits.moscsel == 0) { // it is RC, turn on XT mor.flat = 0; // make sure it is zreoed out mor.bits.key = PMC_MOR_KEY; mor.bits.moscxtst = 0x3F; // main oscillator startup time mor.bits.moscrcen = 1; // enable the on-chip rc oscillator mor.bits.moscxten = 1; // main crystal oscillator enable PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscxts) && (timeout++ < CLOCK_TIMEOUT)); } // Switch to XT mor.flat = 0; // make sure it is zeroed mor.bits.key = PMC_MOR_KEY; mor.bits.moscxtst = 0x3F; mor.bits.moscrcen = 1; mor.bits.moscxten = 1; mor.bits.moscsel = 1; PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscsels) && (timeout++ < CLOCK_TIMEOUT)); mckr = PMC->mckr; mckr.bits.css = PMC_MCKR_CSS_MAIN_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); // Initialize PLLA pllar.flat = 0; // make sure it is zeroed out pllar.bits.bit29 = 1; // we always have to do this! pllar.bits.mula = 0x6; // multiplication is MULA+1 => 12x7 = 84MHz pllar.bits.pllacount = 0x3F; pllar.bits.diva = 0x1; // divider is bypassed PMC->pllar = pllar; timeout = 0; while (!(PMC->sr.bits.locka) && (timeout++ < CLOCK_TIMEOUT)); // Switch to fast clock mckr.bits.css = PMC_MCKR_CSS_MAIN_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); mckr.bits.pres = PMC_MCKR_PRES_DIV_1; mckr.bits.css = PMC_MCKR_CSS_PLLA_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); signal HplSam3Clock.mainClockChanged(); return SUCCESS; } async command error_t HplSam3Clock.mckInit96() { pmc_mor_t mor; pmc_mckr_t mckr; pmc_pllar_t pllar; uint32_t timeout = 0; // Check if MCK source is RC or XT if(PMC->mor.bits.moscsel == 0) { // it is RC, turn on XT mor.flat = 0; // make sure it is zreoed out mor.bits.key = PMC_MOR_KEY; mor.bits.moscxtst = 0x3F; // main oscillator startup time mor.bits.moscrcen = 1; // enable the on-chip rc oscillator mor.bits.moscxten = 1; // main crystal oscillator enable PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscxts) && (timeout++ < CLOCK_TIMEOUT)); } // Switch to XT mor.flat = 0; // make sure it is zeroed mor.bits.key = PMC_MOR_KEY; mor.bits.moscxtst = 0x3F; mor.bits.moscrcen = 1; mor.bits.moscxten = 1; mor.bits.moscsel = 1; PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscsels) && (timeout++ < CLOCK_TIMEOUT)); mckr = PMC->mckr; mckr.bits.css = PMC_MCKR_CSS_MAIN_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); // Initialize PLLA pllar.flat = 0; // make sure it is zeroed out pllar.bits.bit29 = 1; // we always have to do this! pllar.bits.mula = 0x7; // multiplication is MULA+1 => 12x8 = 96MHz pllar.bits.pllacount = 0x3F; pllar.bits.diva = 0x1; // divider is bypassed PMC->pllar = pllar; timeout = 0; while (!(PMC->sr.bits.locka) && (timeout++ < CLOCK_TIMEOUT)); // Switch to fast clock mckr.bits.css = PMC_MCKR_CSS_MAIN_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); mckr.bits.pres = PMC_MCKR_PRES_DIV_1; mckr.bits.css = PMC_MCKR_CSS_PLLA_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); signal HplSam3Clock.mainClockChanged(); return SUCCESS; } async command error_t HplSam3Clock.mckInit4RC(){ pmc_mor_t mor; pmc_mckr_t mckr; pmc_pllar_t pllar; uint32_t timeout = 0; // Check if MCK source is RC or XT if(PMC->mor.bits.moscsel == 1){ // it is XT, turn on RC mor.flat = 0; // make sure it is zreoed out mor.bits.key = PMC_MOR_KEY; mor.bits.moscrcf = 0; // select 4 MHz RC mor.bits.moscrcen = 1; // enable the on-chip rc oscillator mor.bits.moscxten = 1; // main crystal oscillator enable PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscrcs) && (timeout++ < 0xFFFFFFFF)); } // Switch to RC mor.flat = 0; // make sure it is zeroed mor.bits.key = PMC_MOR_KEY; mor.bits.moscrcf = 0; // select 4 MHz RC mor.bits.moscrcen = 1; mor.bits.moscxten = 1; mor.bits.moscsel = 0; PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscsels) && (timeout++ < 0xFFFFFFFF)); mckr = PMC->mckr; mckr.bits.pres = PMC_MCKR_PRES_DIV_1; mckr.bits.css = PMC_MCKR_CSS_MAIN_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < 0xFFFFFFFF)); // turn off external clock mor.bits.moscxten = 0; PMC->mor = mor; // Turn off PLL pllar.flat = 0; // make sure it is zeroed out pllar.bits.bit29 = 1; // this always has to be written as 1! PMC->pllar = pllar; signal HplSam3Clock.mainClockChanged(); return SUCCESS; } async command error_t HplSam3Clock.mckInit8RC(){ pmc_mor_t mor; pmc_mckr_t mckr; pmc_pllar_t pllar; uint32_t timeout = 0; // Check if MCK source is RC or XT if(PMC->mor.bits.moscsel == 1){ // it is XT, turn on RC mor.flat = 0; // make sure it is zreoed out mor.bits.key = PMC_MOR_KEY; mor.bits.moscrcf = 1; // select 8 MHz RC mor.bits.moscrcen = 1; // enable the on-chip rc oscillator mor.bits.moscxten = 1; // main crystal oscillator enable PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscrcs) && (timeout++ < 0xFFFFFFFF)); } // Switch to RC mor.flat = 0; // make sure it is zeroed mor.bits.key = PMC_MOR_KEY; mor.bits.moscrcf = 1; // select 8 MHz RC mor.bits.moscrcen = 1; mor.bits.moscxten = 1; mor.bits.moscsel = 0; PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscsels) && (timeout++ < 0xFFFFFFFF)); mckr = PMC->mckr; mckr.bits.pres = PMC_MCKR_PRES_DIV_1; mckr.bits.css = PMC_MCKR_CSS_MAIN_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < 0xFFFFFFFF)); // turn off external clock mor.bits.moscxten = 0; PMC->mor = mor; // Turn off PLL pllar.flat = 0; // make sure it is zeroed out pllar.bits.bit29 = 1; // this always has to be written as 1! PMC->pllar = pllar; signal HplSam3Clock.mainClockChanged(); return SUCCESS; } async command error_t HplSam3Clock.mckInit12RC() { pmc_mor_t mor; pmc_mckr_t mckr; pmc_pllar_t pllar; uint32_t timeout = 0; // Check if MCK source is RC or XT if(PMC->mor.bits.moscsel == 1) { // it is XT, turn on RC mor.flat = 0; // make sure it is zreoed out mor.bits.key = PMC_MOR_KEY; mor.bits.moscrcf = 3; // select 12 MHz RC mor.bits.moscrcen = 1; // enable the on-chip rc oscillator mor.bits.moscxten = 1; // main crystal oscillator enable PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscrcs) && (timeout++ < CLOCK_TIMEOUT)); } // Switch to RC mor.flat = 0; // make sure it is zeroed mor.bits.key = PMC_MOR_KEY; mor.bits.moscrcf = 3; // select 12 MHz RC mor.bits.moscrcen = 1; mor.bits.moscxten = 1; mor.bits.moscsel = 0; PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscsels) && (timeout++ < CLOCK_TIMEOUT)); mckr = PMC->mckr; mckr.bits.pres = PMC_MCKR_PRES_DIV_1; mckr.bits.css = PMC_MCKR_CSS_MAIN_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); // turn off external clock mor.bits.moscxten = 0; PMC->mor = mor; // Turn off PLL pllar.flat = 0; // make sure it is zeroed out pllar.bits.bit29 = 1; // this always has to be written as 1! PMC->pllar = pllar; signal HplSam3Clock.mainClockChanged(); return SUCCESS; } async command uint32_t HplSam3Clock.getMainClockSpeed() { uint32_t speed = 0; switch(PMC->mckr.bits.css) { case PMC_MCKR_CSS_SLOW_CLOCK: speed = 32; break; case PMC_MCKR_CSS_MAIN_CLOCK: speed = PMC->mcfr.bits.mainf*2048/1000; // 0.48828 corresponds to 16 clock ticks of a 32kHz crystal. break; case PMC_MCKR_CSS_PLLA_CLOCK: if(PMC->pllar.bits.diva != 0) { // note, the PLL multiplier is (mula + 1) speed = PMC->mcfr.bits.mainf*2048/1000 * (PMC->pllar.bits.mula + 1) / PMC->pllar.bits.diva; //speed = PMC->mcfr.bits.mainf*1000/488 * (PMC->pllar.bits.mula + 1) / PMC->pllar.bits.diva; } else speed = 0; break; default: speed = 0; } return speed; } default async event void HplSam3Clock.mainClockChanged(){} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/pmc/sam3spmchardware.h000066400000000000000000000220231207233610700250170ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Sam3s specific PMC registers * * @author Thomas Schmid */ #ifndef SAM3SPMCHARDWARE_H #define SAM3SPMCHARDWARE_H #include "pmchardware.h" /** * PMC Peripheral Clock Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3S Series, * 0: no effect * 1: enable corresponding peripheral clock */ typedef union { uint32_t flat; struct { uint8_t b0 : 1; uint8_t b1 : 1; uint8_t b2 : 1; uint8_t b3 : 1; uint8_t b4 : 1; uint8_t b5 : 1; uint8_t b6 : 1; uint8_t b7 : 1; uint8_t b8 : 1; uint8_t b9 : 1; uint8_t b10 : 1; uint8_t b11 : 1; uint8_t b12 : 1; uint8_t b13 : 1; uint8_t b14 : 1; uint8_t b15 : 1; uint8_t b16 : 1; uint8_t b17 : 1; uint8_t b18 : 1; uint8_t b19 : 1; uint8_t b20 : 1; uint8_t b21 : 1; uint8_t b22 : 1; uint8_t b23 : 1; uint8_t b24 : 1; uint8_t b25 : 1; uint8_t b26 : 1; uint8_t b27 : 1; uint8_t b28 : 1; uint8_t b29 : 1; uint8_t b30 : 1; uint8_t b31 : 1; } __attribute__((__packed__)) bits; } pmc_pcer_t; /** * PMC Peripheral Clock Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 486 * 0: no effect * 1: disable corresponding peripheral clock */ typedef union { uint32_t flat; struct { uint8_t b0 : 1; uint8_t b1 : 1; uint8_t b2 : 1; uint8_t b3 : 1; uint8_t b4 : 1; uint8_t b5 : 1; uint8_t b6 : 1; uint8_t b7 : 1; uint8_t b8 : 1; uint8_t b9 : 1; uint8_t b10 : 1; uint8_t b11 : 1; uint8_t b12 : 1; uint8_t b13 : 1; uint8_t b14 : 1; uint8_t b15 : 1; uint8_t b16 : 1; uint8_t b17 : 1; uint8_t b18 : 1; uint8_t b19 : 1; uint8_t b20 : 1; uint8_t b21 : 1; uint8_t b22 : 1; uint8_t b23 : 1; uint8_t b24 : 1; uint8_t b25 : 1; uint8_t b26 : 1; uint8_t b27 : 1; uint8_t b28 : 1; uint8_t b29 : 1; uint8_t b30 : 1; uint8_t b31 : 1; } __attribute__((__packed__)) bits; } pmc_pcdr_t; /** * PMC Peripheral Clock Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 487 * 0: peripheral clock disabled * 1: peripheral clock enabled */ typedef union { uint32_t flat; struct { uint8_t b0 : 1; uint8_t b1 : 1; uint8_t b2 : 1; uint8_t b3 : 1; uint8_t b4 : 1; uint8_t b5 : 1; uint8_t b6 : 1; uint8_t b7 : 1; uint8_t b8 : 1; uint8_t b9 : 1; uint8_t b10 : 1; uint8_t b11 : 1; uint8_t b12 : 1; uint8_t b13 : 1; uint8_t b14 : 1; uint8_t b15 : 1; uint8_t b16 : 1; uint8_t b17 : 1; uint8_t b18 : 1; uint8_t b19 : 1; uint8_t b20 : 1; uint8_t b21 : 1; uint8_t b22 : 1; uint8_t b23 : 1; uint8_t b24 : 1; uint8_t b25 : 1; uint8_t b26 : 1; uint8_t b27 : 1; uint8_t b28 : 1; uint8_t b29 : 1; uint8_t b30 : 1; uint8_t b31 : 1; } __attribute__((__packed__)) bits; } pmc_pcsr_t; typedef struct { volatile pmc_pcer_t pcer; // Peripheral Clock Enable Register volatile pmc_pcdr_t pcdr; // Peripheral Clock Disable Register volatile pmc_pcsr_t pcsr; // Peripheral Clock Status Register } pmc_pc_t; /** * PMC Clock Generator PLLA Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 491 * Note: bit 29 must always be set to 1 when writing this register! */ typedef union { uint32_t flat; struct { uint8_t divb : 8; // divider uint8_t pllbcount : 6; // pllb counter, specifies the number of slow clock cycles times 8 uint8_t stmode : 2; // start mode uint16_t mulb : 11; // PLLB Multiplier uint8_t reserved0 : 5; } __attribute__((__packed__)) bits; } pmc_pllbr_t; #define PMC_PLLBR_STMODE_FAST_STARTUP 0 #define PMC_PLLBR_STMODE_NORMAL_STARTUP 2 /** * PMC USB Clock Register */ typedef union { uint32_t flat; struct { uint32_t usbs : 1; // USB Input Clock Selection uint32_t reserved0 : 7; uint32_t usbdiv : 4; // Divider for USB Clock uint32_t reserved1 : 20; } __attribute__((__packed__)) bits; } pmc_usb_t; /** * PMC Oscillator Calibration Register. */ typedef union { uint32_t flat; struct { uint32_t cal4 : 7; // RC Oscillator Calibration bits for 4MHz uint32_t sel4 : 1; // Selection of RC Oscillator Calibration bits for 4 MHz uint32_t cal8 : 7; // RC Oscillator Calibration bits for 8MHz uint32_t sel8 : 1; // Selection of RC Oscillator Calibration bits for 8 MHz uint32_t cal12 : 7; // RC Oscillator Calibration bits for 12MHz uint32_t sel12 : 1; // Selection of RC Oscillator Calibration bits for 12 MHz uint32_t reserved0 : 8; } __attribute__((__packed__)) bits; } pmc_ocr_t; /** * PMC Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary, p. 481 */ typedef struct pmc { volatile pmc_scer_t scer; // System Clock Enable Register volatile pmc_scdr_t scdr; // System Clock Disable Register volatile pmc_scsr_t scsr; // System Clock Status Register uint32_t reserved0; volatile pmc_pc_t pc; // Peripheral Clock Control Registers 0 uint32_t reserved1; volatile pmc_mor_t mor; // Main Oscillator Register volatile pmc_mcfr_t mcfr; // Main Clock Frequency Register volatile pmc_pllar_t pllar; // PLLA Register volatile pmc_pllbr_t pllbr; // PLLB Register volatile pmc_mckr_t mckr; // Master Clock Register uint32_t reserved2; volatile pmc_usb_t usb; // USB Clock Register uint32_t reserved3; volatile pmc_pck_t pck0; // Programmable Clock 0 Register volatile pmc_pck_t pck1; // Programmable Clock 1 Register volatile pmc_pck_t pck2; // Programmable Clock 2 Register uint32_t reserved4[5]; volatile pmc_ier_t ier; // Interrupt Enable Register volatile pmc_idr_t idr; // Interrupt Disable Register volatile pmc_sr_t sr; // Status Register volatile pmc_imr_t imr; // Interrupt Mask Register volatile pmc_fsmr_t fsmr; // Fast Startup Mode Register volatile pmc_fspr_t fspr; // Fast Startup Polarity Register volatile pmc_focr_t focr; // Fault Output Clear Register uint32_t reserved5[26]; volatile pmc_wpmr_t wpmr; // Write Protect Mode Register volatile pmc_wpsr_t wpsr; // Write Protect Status Register uint32_t reserved6[5]; volatile pmc_pc_t pc1; // Peripheral Clock Control Registers 1 uint32_t reserved7; volatile pmc_ocr_t ocr; // Oscillator Calibration Register } pmc_t; /** * Memory mapping for the PMC */ volatile pmc_t* PMC = (volatile pmc_t *) 0x400E0400; // PMC Base Address #endif //SAM3UPMCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/pwm/000077500000000000000000000000001207233610700214275ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/pwm/Sam3sPwm.nc000066400000000000000000000054361207233610700234330ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This currently only implements a very minimal subset of the PWM peripheral * capabilities to drive the event lines going to the ADC and DAC. The PWM * unit can do many many more things. * * @author Thomas Schmid */ interface Sam3sPwm { /** * @param frequency Frequency in Herz at which the counter should count. */ async command error_t configure( uint32_t frequency ); /** * @param period Interval period in tics at which the channel 0 will reset. */ async command void setPeriod(uint16_t period); /** * This command returns the actual frequency that the counter is set to. Not * all frequencies are possible. */ async command uint32_t getFrequency(); /** * @param compareNumber Specifies which compare to enable * @param compareValue Sets the compare value at which we match */ async command error_t enableCompare(uint8_t compareNumber, uint16_t compareValue); async command error_t disableCompare(uint8_t compareNumber); /** * @param eventNumber indicates which event channel should be enabled * @param compares Indicates which compares this event is sensitive to. */ async command error_t setEventCompares(uint8_t eventNumber, uint8_t comparers); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/pwm/Sam3sPwmC.nc000066400000000000000000000042421207233610700235300ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ configuration Sam3sPwmC { provides { interface StdControl; interface Sam3sPwm; } } implementation { components Sam3sPwmP as PwmP, LedsC, NoLedsC, HplNVICC, HplSam3sClockC, HplSam3sGeneralIOC; StdControl = PwmP; Sam3sPwm = PwmP; PwmP.PwmInterrupt -> HplNVICC.PWMInterrupt; PwmP.PwmClockControl -> HplSam3sClockC.PWMCntl; PwmP.ClockConfig -> HplSam3sClockC; components McuSleepC; PwmP.PwmInterruptWrapper -> McuSleepC; components HplSam3sPdcC; PwmP.HplPdc -> HplSam3sPdcC.PwmPdcControl; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/pwm/Sam3sPwmP.nc000066400000000000000000000132121207233610700235420ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #include "sam3spwmhardware.h" module Sam3sPwmP { provides { interface StdControl; interface Sam3sPwm; } uses { interface HplNVICInterruptCntl as PwmInterrupt; interface HplSam3PeripheralClockCntl as PwmClockControl; interface HplSam3Clock as ClockConfig; interface FunctionWrapper as PwmInterruptWrapper; interface HplSam3Pdc as HplPdc; interface Leds; } } implementation { norace uint32_t actualFrequency = 0; command error_t StdControl.start() { atomic { call PwmClockControl.enable(); /* Configure interrupts */ call PwmInterrupt.configure(IRQ_PRIO_PWM); } return SUCCESS; } command error_t StdControl.stop() { atomic { call PwmClockControl.disable(); call PwmInterrupt.disable(); } return SUCCESS; } async command error_t Sam3sPwm.configure(uint32_t frequency) { uint8_t i; // get the main clock speed in khz uint32_t mck = call ClockConfig.getMainClockSpeed(); uint32_t divider = mck / frequency; pwm_clk_t clk = PWM->clk; volatile pwm_channel_t *ch0 = &(PWM->channel[0]); pwm_cmr_t cmr = ch0->cmr; // disable channel 0 PWM->dis.flat = 1; if(divider == 0) { // mck is too slow for requested frequency. return FAIL; } // check if we can use modulo counter clocks for(i=0; i<11; i++) { if(divider == (1 << i)) { // GREAT! break; } } if(i < 11) { // we can use the modulo counter cmr.bits.cpre = i; actualFrequency = (mck >> i); } else { // we have to use the divider too cmr.bits.cpre = PWM_CMR_CPRE_CLKA; // find the right combination of modulo counter and divider that matches // the requested frequency the closest. for(i=0; i<11; i++) { divider = (mck >> i) / frequency; if(divider < 255) { clk.bits.diva = divider; clk.bits.prea = i; actualFrequency = (mck >> i) / divider; break; } } if(i >= 11) { // we couldn't find a combination of modulo counter and divider that // works. return FAIL; } } // clock setup done. PWM->clk = clk; ch0->cmr = cmr; // enable channel 0 PWM->ena.flat = 1; return SUCCESS; } async command void Sam3sPwm.setPeriod(uint16_t period) { volatile pwm_channel_t *ch0 = &(PWM->channel[0]); pwm_cdtyupd_t cdtyupd = ch0->cdtyupd; pwm_cprdupd_t cprdupd = ch0->cprdupd; // setup period and duty-cycle. cdtyupd.bits.cdtyupd = period / 2; // 50% duty cycle cprdupd.bits.cprdupd = period; // count at which counter resets to 0 ch0->cdtyupd = cdtyupd; ch0->cprdupd = cprdupd; } async command uint32_t Sam3sPwm.getFrequency() { return actualFrequency; } async command error_t Sam3sPwm.enableCompare(uint8_t compareNumber, uint16_t compareValue) { volatile pwm_comparison_t *compare; pwm_cmpm_t cmpm; pwm_cmpv_t cmpv; if(compareNumber < 8) { compare = &(PWM->comparison[compareNumber]); cmpm = compare->cmpm; cmpv = compare->cmpv; } else { return FAIL; } // turn of comparison compare->cmpm.flat = 0; cmpv.bits.cv = compareValue; cmpm.bits.cen = 1; compare->cmpv = cmpv; compare->cmpm = cmpm; return SUCCESS; } async command error_t Sam3sPwm.disableCompare(uint8_t compareNumber) { volatile pwm_comparison_t *compare; if(compareNumber < 8) { compare = &(PWM->comparison[compareNumber]); } else { return FAIL; } // turn of comparison compare->cmpm.flat = 0; return SUCCESS; } async command error_t Sam3sPwm.setEventCompares(uint8_t eventNumber, uint8_t compares) { switch(eventNumber) { case 0: PWM->elm0r.flat = compares; break; case 1: PWM->elm1r.flat = compares; break; default: return FAIL; } return SUCCESS; } async event void ClockConfig.mainClockChanged(){} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/pwm/sam3spwmhardware.h000066400000000000000000000633141207233610700250770ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Sam3s PWM register definitions * * @author Thomas Schmid */ #ifndef SAM3SPWMHARDWARE_H #define SAM3SPWMHARDWARE_H #define PWM_COMPARE_DAC 0 #define PWM_COMPARE_ADC 1 #define PWM_EVENT_DAC 0 #define PWM_EVENT_ADC 1 /** * PWM Clock Register */ typedef union { uint32_t flat; struct { uint32_t diva : 8; // clock divider A uint32_t prea : 4; // clock source selection uint32_t reserved0 : 4; uint32_t divb : 8; // clock divider B uint32_t preb : 4; // clock source selection uint32_t reserved1 : 4; } __attribute__((__packed__)) bits; } pwm_clk_t; /** * PWM Enable Register */ typedef union { uint32_t flat; struct { uint32_t chid0 : 1; // channel 0 uint32_t chid1 : 1; // channel 1 uint32_t chid2 : 1; // channel 2 uint32_t chid3 : 1; // channel 3 uint32_t reserved : 28; } __attribute__((__packed__)) bits; } pwm_ena_t; /** * PWM Disable Register */ typedef union { uint32_t flat; struct { uint32_t chid0 : 1; // channel 0 uint32_t chid1 : 1; // channel 1 uint32_t chid2 : 1; // channel 2 uint32_t chid3 : 1; // channel 3 uint32_t reserved : 28; } __attribute__((__packed__)) bits; } pwm_dis_t; /** * PWM Status Register */ typedef union { uint32_t flat; struct { uint32_t chid0 : 1; // channel 0 uint32_t chid1 : 1; // channel 1 uint32_t chid2 : 1; // channel 2 uint32_t chid3 : 1; // channel 3 uint32_t reserved : 28; } __attribute__((__packed__)) bits; } pwm_sr_t; /** * PWM Interrupt Enable Register 1 */ typedef union { uint32_t flat; struct { uint32_t chid0 : 1; // channel 0 uint32_t chid1 : 1; // channel 1 uint32_t chid2 : 1; // channel 2 uint32_t chid3 : 1; // channel 3 uint32_t reserved0 : 12; uint32_t fchid0 : 1; // channel 0 uint32_t fchid1 : 1; // channel 1 uint32_t fchid2 : 1; // channel 2 uint32_t fchid3 : 1; // channel 3 uint32_t reserved1 : 12; } __attribute__((__packed__)) bits; } pwm_ier1_t; /** * PWM Interrupt Disable Register 1 */ typedef union { uint32_t flat; struct { uint32_t chid0 : 1; // channel 0 uint32_t chid1 : 1; // channel 1 uint32_t chid2 : 1; // channel 2 uint32_t chid3 : 1; // channel 3 uint32_t reserved0 : 12; uint32_t fchid0 : 1; // channel 0 uint32_t fchid1 : 1; // channel 1 uint32_t fchid2 : 1; // channel 2 uint32_t fchid3 : 1; // channel 3 uint32_t reserved1 : 12; } __attribute__((__packed__)) bits; } pwm_idr1_t; /** * PWM Interrupt Mask Register 1 */ typedef union { uint32_t flat; struct { uint32_t chid0 : 1; // channel 0 uint32_t chid1 : 1; // channel 1 uint32_t chid2 : 1; // channel 2 uint32_t chid3 : 1; // channel 3 uint32_t reserved0 : 12; uint32_t fchid0 : 1; // channel 0 uint32_t fchid1 : 1; // channel 1 uint32_t fchid2 : 1; // channel 2 uint32_t fchid3 : 1; // channel 3 uint32_t reserved1 : 12; } __attribute__((__packed__)) bits; } pwm_imr1_t; /** * PWM Interrupt Status Register 1 */ typedef union { uint32_t flat; struct { uint32_t chid0 : 1; // channel 0 uint32_t chid1 : 1; // channel 1 uint32_t chid2 : 1; // channel 2 uint32_t chid3 : 1; // channel 3 uint32_t reserved0 : 12; uint32_t fchid0 : 1; // channel 0 uint32_t fchid1 : 1; // channel 1 uint32_t fchid2 : 1; // channel 2 uint32_t fchid3 : 1; // channel 3 uint32_t reserved1 : 12; } __attribute__((__packed__)) bits; } pwm_isr1_t; /** * PWM Sync channels Mode Register */ typedef union { uint32_t flat; struct { uint32_t sync0 : 1; uint32_t sync1 : 1; uint32_t sync2 : 1; uint32_t sync3 : 1; uint32_t reserved0 : 12; uint32_t updm : 2; // sync channel update mode uint32_t reserved1 : 2; uint32_t ptrm : 1; // PDC Transfer Request Mode uint32_t ptrcs : 3; // PDC Transfer Request Comparison Selection uint32_t reserved2 : 8; } __attribute__((__packed__)) bits; } pwm_scm_t; /** * PWM Sync Channels Update Control Register */ typedef union { uint32_t flat; struct { uint32_t updulock : 1; // Synchronous Channels Update Unlock uint32_t reserved : 31; } __attribute__((__packed__)) bits; } pwm_scuc_t; /** * PWM Sync Channels Update Period Register */ typedef union { uint32_t flat; struct { uint32_t upr : 4; // update period uint32_t uprcnt : 4; // update period counter uint32_t reserved : 24; } __attribute__((__packed__)) bits; } pwm_scup_t; /** * PWM Sync Channels Update Period Update Register */ typedef union { uint32_t flat; struct { uint32_t uprupd : 4; // update period update uint32_t reserved : 28; } __attribute__((__packed__)) bits; } pwm_scupupd_t; /** * PWM Interrupt Enable Register 2 */ typedef union { uint32_t flat; struct { uint32_t wrdy : 1; // write ready for synchronous channel update interrupt enable uint32_t endtx : 1; // pdc end of tx buffer uint32_t txbufe : 1; // pdc tx buffer empty uint32_t unre : 1; // sync channels update underrun error uint32_t reserved0 : 4; uint32_t cmpm0 : 1; // comparison x match interrupt uint32_t cmpm1 : 1; // comparison x match interrupt uint32_t cmpm2 : 1; // comparison x match interrupt uint32_t cmpm3 : 1; // comparison x match interrupt uint32_t cmpm4 : 1; // comparison x match interrupt uint32_t cmpm5 : 1; // comparison x match interrupt uint32_t cmpm6 : 1; // comparison x match interrupt uint32_t cmpm7 : 1; // comparison x match interrupt uint32_t cmpu0 : 1; // comparison x update interrupt uint32_t cmpu1 : 1; // comparison x update interrupt uint32_t cmpu2 : 1; // comparison x update interrupt uint32_t cmpu3 : 1; // comparison x update interrupt uint32_t cmpu4 : 1; // comparison x update interrupt uint32_t cmpu5 : 1; // comparison x update interrupt uint32_t cmpu6 : 1; // comparison x update interrupt uint32_t cmpu7 : 1; // comparison x update interrupt uint32_t reserved1 : 8; } __attribute__((__packed__)) bits; } pwm_ier2_t; /** * PWM Interrupt Disable Register 2 */ typedef union { uint32_t flat; struct { uint32_t wrdy : 1; // write ready for synchronous channel update interrupt enable uint32_t endtx : 1; // pdc end of tx buffer uint32_t txbufe : 1; // pdc tx buffer empty uint32_t unre : 1; // sync channels update underrun error uint32_t reserved0 : 4; uint32_t cmpm0 : 1; // comparison x match interrupt uint32_t cmpm1 : 1; // comparison x match interrupt uint32_t cmpm2 : 1; // comparison x match interrupt uint32_t cmpm3 : 1; // comparison x match interrupt uint32_t cmpm4 : 1; // comparison x match interrupt uint32_t cmpm5 : 1; // comparison x match interrupt uint32_t cmpm6 : 1; // comparison x match interrupt uint32_t cmpm7 : 1; // comparison x match interrupt uint32_t cmpu0 : 1; // comparison x update interrupt uint32_t cmpu1 : 1; // comparison x update interrupt uint32_t cmpu2 : 1; // comparison x update interrupt uint32_t cmpu3 : 1; // comparison x update interrupt uint32_t cmpu4 : 1; // comparison x update interrupt uint32_t cmpu5 : 1; // comparison x update interrupt uint32_t cmpu6 : 1; // comparison x update interrupt uint32_t cmpu7 : 1; // comparison x update interrupt uint32_t reserved1 : 8; } __attribute__((__packed__)) bits; } pwm_idr2_t; /** * PWM Interrupt Mask Register 2 */ typedef union { uint32_t flat; struct { uint32_t wrdy : 1; // write ready for synchronous channel update interrupt enable uint32_t endtx : 1; // pdc end of tx buffer uint32_t txbufe : 1; // pdc tx buffer empty uint32_t unre : 1; // sync channels update underrun error uint32_t reserved0 : 4; uint32_t cmpm0 : 1; // comparison x match interrupt uint32_t cmpm1 : 1; // comparison x match interrupt uint32_t cmpm2 : 1; // comparison x match interrupt uint32_t cmpm3 : 1; // comparison x match interrupt uint32_t cmpm4 : 1; // comparison x match interrupt uint32_t cmpm5 : 1; // comparison x match interrupt uint32_t cmpm6 : 1; // comparison x match interrupt uint32_t cmpm7 : 1; // comparison x match interrupt uint32_t cmpu0 : 1; // comparison x update interrupt uint32_t cmpu1 : 1; // comparison x update interrupt uint32_t cmpu2 : 1; // comparison x update interrupt uint32_t cmpu3 : 1; // comparison x update interrupt uint32_t cmpu4 : 1; // comparison x update interrupt uint32_t cmpu5 : 1; // comparison x update interrupt uint32_t cmpu6 : 1; // comparison x update interrupt uint32_t cmpu7 : 1; // comparison x update interrupt uint32_t reserved1 : 8; } __attribute__((__packed__)) bits; } pwm_imr2_t; /** * PWM Interrupt Status Register 2 */ typedef union { uint32_t flat; struct { uint32_t wrdy : 1; // write ready for synchronous channel update interrupt enable uint32_t endtx : 1; // pdc end of tx buffer uint32_t txbufe : 1; // pdc tx buffer empty uint32_t unre : 1; // sync channels update underrun error uint32_t reserved0 : 4; uint32_t cmpm0 : 1; // comparison x match interrupt uint32_t cmpm1 : 1; // comparison x match interrupt uint32_t cmpm2 : 1; // comparison x match interrupt uint32_t cmpm3 : 1; // comparison x match interrupt uint32_t cmpm4 : 1; // comparison x match interrupt uint32_t cmpm5 : 1; // comparison x match interrupt uint32_t cmpm6 : 1; // comparison x match interrupt uint32_t cmpm7 : 1; // comparison x match interrupt uint32_t cmpu0 : 1; // comparison x update interrupt uint32_t cmpu1 : 1; // comparison x update interrupt uint32_t cmpu2 : 1; // comparison x update interrupt uint32_t cmpu3 : 1; // comparison x update interrupt uint32_t cmpu4 : 1; // comparison x update interrupt uint32_t cmpu5 : 1; // comparison x update interrupt uint32_t cmpu6 : 1; // comparison x update interrupt uint32_t cmpu7 : 1; // comparison x update interrupt uint32_t reserved1 : 8; } __attribute__((__packed__)) bits; } pwm_isr2_t; /** * PWM Output Override Value Register */ typedef union { uint32_t flat; struct { uint32_t oovh0 : 1; // Output Override value for pwmh output of the channel x uint32_t oovh1 : 1; // Output Override value for pwmh output of the channel x uint32_t oovh2 : 1; // Output Override value for pwmh output of the channel x uint32_t oovh3 : 1; // Output Override value for pwmh output of the channel x uint32_t reserved0 : 12; uint32_t oovl0 : 1; // output override value for pwml output of the channel x uint32_t oovl1 : 1; // output override value for pwml output of the channel x uint32_t oovl2 : 1; // output override value for pwml output of the channel x uint32_t oovl3 : 1; // output override value for pwml output of the channel x uint32_t reserved1 : 12; } __attribute__((__packed__)) bits; } pwm_oov_t; /** * PWM Output Selection Register */ typedef union { uint32_t flat; struct { uint32_t osh0 : 1; // Output Selection for PWMH output of the channel x uint32_t osh1 : 1; // Output Selection for PWMH output of the channel x uint32_t osh2 : 1; // Output Selection for PWMH output of the channel x uint32_t osh3 : 1; // Output Selection for PWMH output of the channel x uint32_t reserved0 : 12; uint32_t osl0 : 1; // output selection for PWML output of the channel x uint32_t osl1 : 1; // output selection for PWML output of the channel x uint32_t osl2 : 1; // output selection for PWML output of the channel x uint32_t osl3 : 1; // output selection for PWML output of the channel x uint32_t reserved1 : 12; } __attribute__((__packed__)) bits; } pwm_os_t; /** * PWM Output Selection Set Register */ typedef union { uint32_t flat; struct { uint32_t ossh0 : 1; // Output Selection Set for PWMH output of the channel x uint32_t ossh1 : 1; // Output Selection Set for PWMH output of the channel x uint32_t ossh2 : 1; // Output Selection Set for PWMH output of the channel x uint32_t ossh3 : 1; // Output Selection Set for PWMH output of the channel x uint32_t reserved0 : 12; uint32_t ossl0 : 1; // Output Selection Set for PWML output of the channel x uint32_t ossl1 : 1; // Output Selection Set for PWML output of the channel x uint32_t ossl2 : 1; // Output Selection Set for PWML output of the channel x uint32_t ossl3 : 1; // Output Selection Set for PWML output of the channel x uint32_t reserved1 : 12; } __attribute__((__packed__)) bits; } pwm_oss_t; /** * PWM Output Selection Clear Register */ typedef union { uint32_t flat; struct { uint32_t osch0 : 1; uint32_t osch1 : 1; uint32_t osch2 : 1; uint32_t osch3 : 1; uint32_t reserved0 : 12; uint32_t oscl0 : 1; uint32_t oscl1 : 1; uint32_t oscl2 : 1; uint32_t oscl3 : 1; uint32_t reserved1 : 12; } __attribute__((__packed__)) bits; } pwm_osc_t; /** * PWM Output Selection Set Update Register */ typedef union { uint32_t flat; struct { uint32_t ossuph0 : 1; uint32_t ossuph1 : 1; uint32_t ossuph2 : 1; uint32_t ossuph3 : 1; uint32_t reserved0 : 12; uint32_t ossupl0 : 1; uint32_t ossupl1 : 1; uint32_t ossupl2 : 1; uint32_t ossupl3 : 1; uint32_t reserved1 : 12; } __attribute__((__packed__)) bits; } pwm_ossupd_t; /** * PWM Output Selection Clear Update Register */ typedef union { uint32_t flat; struct { uint32_t oscuph0 : 1; uint32_t oscuph1 : 1; uint32_t oscuph2 : 1; uint32_t oscuph3 : 1; uint32_t reserved0 : 12; uint32_t oscupl0 : 1; uint32_t oscupl1 : 1; uint32_t oscupl2 : 1; uint32_t oscupl3 : 1; uint32_t reserved1 : 12; } __attribute__((__packed__)) bits; } pwm_oscupd_t; /** * PWM Fault Mode Register */ typedef union { uint32_t flat; struct { uint32_t fpol : 8; uint32_t fmod : 8; uint32_t ffil : 8; uint32_t reserved : 8; } __attribute__((__packed__)) bits; } pwm_fmr_t; /** * PWM Fault Status Register */ typedef union { uint32_t flat; struct { uint32_t fiv : 8; uint32_t fs : 8; uint32_t reserved : 16; } __attribute__((__packed__)) bits; } pwm_fsr_t; /** * PWM Fault Clear Register */ typedef union { uint32_t flat; struct { uint32_t fclr : 8; uint32_t reserved : 24; } __attribute__((__packed__)) bits; } pwm_fcr_t; /** * PWM Fault Protection Value Register */ typedef union { uint32_t flat; struct { uint32_t fpvh0 : 1; uint32_t fpvh1 : 1; uint32_t fpvh2 : 1; uint32_t fpvh3 : 1; uint32_t reserved0 : 12; uint32_t fpvl0 : 1; uint32_t fpvl1 : 1; uint32_t fpvl2 : 1; uint32_t fpvl3 : 1; } __attribute__((__packed__)) bits; } pwm_fpv_t; /** * PWM Fault Protection Enable Register */ typedef union { uint32_t flat; struct { uint32_t fpe0 : 8; uint32_t fpe1 : 8; uint32_t fpe2 : 8; uint32_t fpe3 : 8; } __attribute__((__packed__)) bits; } pwm_fpe_t; /** * PWM Event Line x Register */ typedef union { uint32_t flat; struct { uint32_t csel0 : 1; uint32_t csel1 : 1; uint32_t csel2 : 1; uint32_t csel3 : 1; uint32_t csel4 : 1; uint32_t csel5 : 1; uint32_t csel6 : 1; uint32_t csel7 : 1; uint32_t reserved : 24; } __attribute__((__packed__)) bits; } pwm_elmr_t; /** * PWM Stepper Motor Mode Register */ typedef union { uint32_t flat; struct { uint32_t gcen0 : 1; uint32_t gcen1 : 1; uint32_t reserved0 : 14; uint32_t down0 : 1; uint32_t down1 : 1; uint32_t reserved1 : 14; } __attribute__((__packed__)) bits; } pwm_smmr_t; /** * PWM Write Protect Control Register */ typedef union { uint32_t flat; struct { uint32_t wpcmd : 2; uint32_t wprg0 : 1; uint32_t wprg1 : 1; uint32_t wprg2 : 1; uint32_t wprg3 : 1; uint32_t wprg4 : 1; uint32_t wprg5 : 1; uint32_t wpkey : 24; } __attribute__((__packed__)) bits; } pwm_wpcr_t; #define PWM_WPCR_KEY 0x50574D /** * PWM Write Protect Status Register */ typedef union { uint32_t flat; struct { uint32_t wpsws0 : 1; uint32_t wpsws1 : 1; uint32_t wpsws2 : 1; uint32_t wpsws3 : 1; uint32_t wpsws4 : 1; uint32_t wpsws5 : 1; uint32_t reserved0 : 1; uint32_t wpvs : 1; uint32_t wphws0 : 1; uint32_t wphws1 : 1; uint32_t wphws2 : 1; uint32_t wphws3 : 1; uint32_t wphws4 : 1; uint32_t wphws5 : 1; uint32_t reserved1 : 2; uint32_t wpvsrc : 16; } __attribute__((__packed__)) bits; } pwm_wpsr_t; /** * PWM Comparison x Value Register */ typedef union { uint32_t flat; struct { uint32_t cv : 24; uint32_t cvm : 1; uint32_t reserved : 7; } __attribute__((__packed__)) bits; } pwm_cmpv_t; /** * PWM Comparison x Value Update Register */ typedef union { uint32_t flat; struct { uint32_t cvupd : 24; uint32_t cvmupd : 1; uint32_t reserved : 7; } __attribute__((__packed__)) bits; } pwm_cmpvupd_t; /** * PWM Comparison x Mode Register */ typedef union { uint32_t flat; struct { uint32_t cen : 1; uint32_t reserved0 : 3; uint32_t ctr : 4; uint32_t cpr : 4; uint32_t cprcnt : 4; uint32_t cupr : 4; uint32_t cuprcnt : 4; uint32_t reserved1 : 8; } __attribute__((__packed__)) bits; } pwm_cmpm_t; /** * PWM Comparison x Mode Update Register */ typedef union { uint32_t flat; struct { uint32_t cenupd : 1; uint32_t reserved0 : 3; uint32_t ctrupd : 4; uint32_t cprupd : 4; uint32_t reserved1 : 4; uint32_t cuprupd : 4; uint32_t reserved2 : 12; } __attribute__((__packed__)) bits; } pwm_cmpmupd_t; /** * PWM Channel Mode Register */ typedef union { uint32_t flat; struct { uint32_t cpre : 4; uint32_t reserved0 : 4; uint32_t calg : 1; uint32_t cpol : 1; uint32_t ces : 1; uint32_t reserved1 : 5; uint32_t dte : 1; uint32_t dthi : 1; uint32_t dtli : 1; uint32_t reserved2 : 13; } __attribute__((__packed__)) bits; } pwm_cmr_t; #define PWM_CMR_CPRE_CLKA 11 #define PWM_CMR_CPRE_CLKB 12 /** * PWM Channel Duty Cycle Register */ typedef union { uint32_t flat; struct { uint32_t cdty : 24; uint32_t reserved : 8; } __attribute__((__packed__)) bits; } pwm_cdty_t; /** * PWM Channe Duty Cycle Update Register */ typedef union { uint32_t flat; struct { uint32_t cdtyupd : 24; uint32_t reserved : 8; } __attribute__((__packed__)) bits; } pwm_cdtyupd_t; /** * PWM Channel Period Register */ typedef union { uint32_t flat; struct { uint32_t cprd : 24; uint32_t reserved : 8; } __attribute__((__packed__)) bits; } pwm_cprd_t; /** * PWM Channel Period Update Register */ typedef union { uint32_t flat; struct { uint32_t cprdupd : 24; uint32_t reserved : 8; } __attribute__((__packed__)) bits; } pwm_cprdupd_t; /** * PWM Channel Counter Register */ typedef union { uint32_t flat; struct { uint32_t cnt : 24; uint32_t reserved : 8; } __attribute__((__packed__)) bits; } pwm_ccnt_t; /** * PWM Channel Dead Time Register */ typedef union { uint32_t flat; struct { uint32_t dth : 16; uint32_t dtl : 16; } __attribute__((__packed__)) bits; } pwm_dt_t; /** * PWM Channel Dead Time Update Register */ typedef union { uint32_t flat; struct { uint32_t dthupd : 16; uint32_t dtlupd : 16; } __attribute__((__packed__)) bits; } pwm_dtupd_t; typedef struct pwm_comparison { pwm_cmpv_t cmpv; pwm_cmpvupd_t cmpvupd; pwm_cmpm_t cmpm; pwm_cmpmupd_t cmpmupd; } pwm_comparison_t; typedef struct pwm_channel { pwm_cmr_t cmr; pwm_cdty_t cdty; pwm_cdtyupd_t cdtyupd; pwm_cprd_t cprd; pwm_cprdupd_t cprdupd; pwm_ccnt_t ccnt; pwm_dt_t dt; pwm_dtupd_t dtupd; } pwm_channel_t; /** * PWM Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3S * Series, Preliminary, p. 875 */ typedef struct pwm { volatile pwm_clk_t clk; volatile pwm_ena_t ena; volatile pwm_dis_t dis; volatile pwm_sr_t sr; volatile pwm_ier1_t ier1; volatile pwm_idr1_t idr1; volatile pwm_imr1_t imr1; volatile pwm_isr1_t isr1; volatile pwm_scm_t scm; uint32_t reserved0; volatile pwm_scuc_t scuc; volatile pwm_scup_t scup; volatile pwm_scupupd_t scupupd; volatile pwm_ier2_t ier2; volatile pwm_idr2_t idr2; volatile pwm_imr2_t imr2; volatile pwm_isr2_t isr2; volatile pwm_oov_t oov; volatile pwm_os_t os; volatile pwm_oss_t oss; volatile pwm_osc_t osc; volatile pwm_ossupd_t ossupd; volatile pwm_oscupd_t oscupd; volatile pwm_fmr_t fmr; volatile pwm_fsr_t fsr; volatile pwm_fcr_t fcr; volatile pwm_fpv_t fpv; volatile pwm_fpe_t fpe; uint32_t reserved1[3]; volatile pwm_elmr_t elm0r; volatile pwm_elmr_t elm1r; uint32_t reserved2[11]; volatile pwm_smmr_t smmr; uint32_t reserved3[12]; volatile pwm_wpcr_t wpcr; volatile pwm_wpsr_t wpsr; uint32_t reserved4[17]; volatile pwm_comparison_t comparison[8]; uint32_t reserved5[20]; volatile pwm_channel_t channel[4]; } pwm_t; /** * Memory mapping for the PWM */ #define PWM_BASE_ADDRESS 0x40020000 volatile pwm_t* PWM = (volatile pwm_t *) PWM_BASE_ADDRESS; #endif //SAM3SPWMHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/sam3shardware.h000066400000000000000000000142321207233610700235430ustar00rootroot00000000000000/* * Copyright (c) 2010 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Definitions specific to the SAM3S MCU. * * @author Thomas Schmid */ #ifndef SAM3S_HARDWARE_H #define SAM3S_HARDWARE_H #include // The Sam3s has more I/O Muxing than the Sam3u. #define CHIP_SAM3_HAS_PERIPHERAL_CD 1 // Peripheral ID definitions for the SAM3S // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3S Series, Preliminary, p. 34 #define AT91C_ID_SUPC ( 0) // SUPPLY CONTROLLER #define AT91C_ID_RSTC ( 1) // RESET CONTROLLER #define AT91C_ID_RTC ( 2) // REAL TIME CLOCK #define AT91C_ID_RTT ( 3) // REAL TIME TIMER #define AT91C_ID_WDG ( 4) // WATCHDOG TIMER #define AT91C_ID_PMC ( 5) // PMC #define AT91C_ID_EFC0 ( 6) // EFC #define AT91C_ID_RES0 ( 7) // Reserved #define AT91C_ID_UART0 ( 8) // UART0 #define AT91C_ID_UART1 ( 9) // UART1 #define AT91C_ID_SMC (10) // SMC #define AT91C_ID_PIOA (11) // PARALLEL I/O CONTROLLER A #define AT91C_ID_PIOB (12) // PARALLEL I/O CONTROLLER B #define AT91C_ID_PIOC (13) // PARALLEL I/O CONTROLLER C #define AT91C_ID_USART0 (14) // USART0 #define AT91C_ID_USART1 (15) // USART1 #define AT91C_ID_RES1 (16) // Reserved #define AT91C_ID_RES2 (17) // Reserved #define AT91C_ID_HSMCI (18) // HIGH SPEED MULTIMEDIA CARD INTERFACE #define AT91C_ID_TWI0 (19) // TWO WIRE INTERFACE 0 #define AT91C_ID_TWI1 (20) // TWO WIRE INTERFACE 1 #define AT91C_ID_SPI (21) // SERIAL PERIPHERAL INTERFACE #define AT91C_ID_SSC (22) // SYNCHRONOUS SERIAL CONTROLLER #define AT91C_ID_TC0 (23) // TIMER/COUNTER 0 #define AT91C_ID_TC1 (24) // TIMER/COUNTER 1 #define AT91C_ID_TC2 (25) // TIMER/COUNTER 2 #define AT91C_ID_TC3 (26) // TIMER/COUNTER 3 #define AT91C_ID_TC4 (27) // TIMER/COUNTER 4 #define AT91C_ID_TC5 (28) // TIMER/COUNTER 5 #define AT91C_ID_ADC (29) // ANALOG-TO-DIGITAL CONVERTER #define AT91C_ID_DACC (30) // DIGITAL-TO-ANALOG CONVERTE #define AT91C_ID_PWM (31) // PULSE WIDTH MODULATION #define AT91C_ID_CRCCU (32) // CRC CALCULATION UNIT #define AT91C_ID_ACC (33) // ANALOG COMPARATOR #define AT91C_ID_UDP (34) // USB DEVICE PORT #define SAM3S_PERIPHERALA (0x400e0e00) #define SAM3S_PERIPHERALB (0x400e1000) #define SAM3S_PERIPHERALC (0x400e1200) #define TOSH_ASSIGN_PIN(name, port, bit) \ static inline void TOSH_SET_##name##_PIN() \ {*((volatile uint32_t *) (SAM3S_PERIPHERAL##port + 0x030)) = (1 << bit);} \ static inline void TOSH_CLR_##name##_PIN() \ {*((volatile uint32_t *) (SAM3S_PERIPHERAL##port + 0x034)) = (1 << bit);} \ static inline int TOSH_READ_##name##_PIN() \ { \ /* Read bit from Output Status Register */ \ uint32_t currentport = *((volatile uint32_t *) (SAM3S_PERIPHERAL##port + 0x018)); \ uint32_t currentpin = (currentport & (1 << bit)) >> bit; \ bool isInput = ((currentpin & 1) == 0); \ if (isInput == 1) { \ /* Read bit from Pin Data Status Register */ \ currentport = *((volatile uint32_t *) (SAM3S_PERIPHERAL##port + 0x03c)); \ currentpin = (currentport & (1 << bit)) >> bit; \ return ((currentpin & 1) == 1); \ } else { \ /* Read bit from Output Data Status Register */ \ currentport = *((volatile uint32_t *) (SAM3S_PERIPHERAL##port + 0x038)); \ currentpin = (currentport & (1 << bit)) >> bit; \ return ((currentpin & 1) == 1); \ } \ } \ static inline void TOSH_MAKE_##name##_OUTPUT() \ {*((volatile uint32_t *) (SAM3S_PERIPHERAL##port + 0x010)) = (1 << bit);} \ static inline void TOSH_MAKE_##name##_INPUT() \ {*((volatile uint32_t *) (SAM3S_PERIPHERAL##port + 0x014)) = (1 << bit);} #define TOSH_ASSIGN_OUTPUT_ONLY_PIN(name, port, bit) \ static inline void TOSH_SET_##name##_PIN() \ {*((volatile uint32_t *) (SAM3S_PERIPHERAL##port + 0x030)) = (1 << bit);} \ static inline void TOSH_CLR_##name##_PIN() \ {*((volatile uint32_t *) (SAM3S_PERIPHERAL##port + 0x034)) = (1 << bit);} \ static inline void TOSH_MAKE_##name##_OUTPUT() \ {*((volatile uint32_t *) (SAM3S_PERIPHERAL##port + 0x010)) = (1 << bit);} \ #define TOSH_ALIAS_OUTPUT_ONLY_PIN(alias, connector)\ static inline void TOSH_SET_##alias##_PIN() {TOSH_SET_##connector##_PIN();} \ static inline void TOSH_CLR_##alias##_PIN() {TOSH_CLR_##connector##_PIN();} \ static inline void TOSH_MAKE_##alias##_OUTPUT() {} \ #define TOSH_ALIAS_PIN(alias, connector) \ static inline void TOSH_SET_##alias##_PIN() {TOSH_SET_##connector##_PIN();} \ static inline void TOSH_CLR_##alias##_PIN() {TOSH_CLR_##connector##_PIN();} \ static inline char TOSH_READ_##alias##_PIN() {return TOSH_READ_##connector##_PIN();} \ static inline void TOSH_MAKE_##alias##_OUTPUT() {TOSH_MAKE_##connector##_OUTPUT();} \ #endif // SAM3S_HARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/smc/000077500000000000000000000000001207233610700214065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/smc/sam3smchardware.h000066400000000000000000000063161207233610700246510ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Static Memory Controller Register Definitions * * @author Thomas Schmid */ #ifndef _SAM3SSMCHARDWARE_H #define _SAM3SSMCHARDWARE_H #include "smchardware.h" /** * SMC MODE Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3S Series, Preliminary */ typedef union { uint32_t flat; struct { uint32_t read_mode : 1; // read mode uint32_t write_mode : 1; // write mode uint32_t reserved0 : 2; uint32_t exnw_mode : 2; // nwait mode uint32_t reserved1 : 2; uint32_t reserved2 : 4; uint32_t dbw : 2; // data bus width uint32_t reserved3 : 2; uint32_t tdf_cycles : 4; // data float time uint32_t tdf_mode : 1; // tdf optimization uint32_t reserved4 : 3; uint32_t pmen : 1; // page mode enable (note, not in documentation, but in code at91lib!) uint32_t reserved5 : 3; uint32_t ps : 2; // page mode size (note: not in documentation, but in code at91lib!) uint32_t reserved6 : 2; } __attribute__((__packed__)) bits; } smc_mode_t; typedef struct { volatile smc_setup_t setup; volatile smc_pulse_t pulse; volatile smc_cycle_t cycle; volatile smc_mode_t mode; } smc_cs_t; volatile smc_cs_t* SMC_CS0 = (volatile smc_cs_t*)0x400E0000; volatile smc_cs_t* SMC_CS1 = (volatile smc_cs_t*)0x400E0010; volatile smc_cs_t* SMC_CS2 = (volatile smc_cs_t*)0x400E0020; volatile smc_cs_t* SMC_CS3 = (volatile smc_cs_t*)0x400E0030; volatile smc_cs_t* SMC_CS4 = (volatile smc_cs_t*)0x400E0040; // questionable... #endif //_SAM3USMCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/spi/000077500000000000000000000000001207233610700214175ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/spi/HilSam3SpiC.nc000066400000000000000000000073441207233610700237700ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * SPI Configuration for the SAM3U-EK devkit. Does not use DMA (PDC) at this * point. Byte interface performs busy wait! * * @author Thomas Schmid * @author Kevin Klues */ #include configuration HilSam3SpiC { provides { interface Resource[uint8_t]; interface SpiByte[uint8_t]; interface FastSpiByte[uint8_t]; interface SpiPacket[uint8_t]; interface HplSam3SpiChipSelConfig[uint8_t]; interface HplSam3SpiConfig; } uses { interface Init as SpiChipInit; interface ResourceConfigure[uint8_t]; } } implementation { components RealMainP; RealMainP.PlatformInit -> HilSam3SpiP.Init; components HplSam3SpiC; HplSam3SpiConfig = HplSam3SpiC; HilSam3SpiP.SpiChipInit = SpiChipInit; HilSam3SpiP.HplSam3SpiConfig -> HplSam3SpiC; HilSam3SpiP.HplSam3SpiControl -> HplSam3SpiC; HilSam3SpiP.HplSam3SpiStatus -> HplSam3SpiC; HilSam3SpiP.HplSam3SpiInterrupts -> HplSam3SpiC; HplSam3SpiChipSelConfig[0] = HplSam3SpiC.HplSam3SpiChipSelConfig0; HplSam3SpiChipSelConfig[1] = HplSam3SpiC.HplSam3SpiChipSelConfig1; HplSam3SpiChipSelConfig[2] = HplSam3SpiC.HplSam3SpiChipSelConfig2; HplSam3SpiChipSelConfig[3] = HplSam3SpiC.HplSam3SpiChipSelConfig3; components new FcfsArbiterC(SAM3_SPI_BUS) as ArbiterC; Resource = ArbiterC; ResourceConfigure = ArbiterC; HilSam3SpiP.ArbiterInfo -> ArbiterC; components new AsyncStdControlPowerManagerC() as PM; PM.AsyncStdControl -> HplSam3SpiC; PM.ArbiterInfo -> ArbiterC.ArbiterInfo; PM.ResourceDefaultOwner -> ArbiterC.ResourceDefaultOwner; components HilSam3SpiP; SpiByte = HilSam3SpiP.SpiByte; SpiPacket = HilSam3SpiP.SpiPacket; components new FastSpiSam3C(SAM3_SPI_BUS); FastSpiSam3C.SpiByte -> HilSam3SpiP.SpiByte; FastSpiByte = FastSpiSam3C; components HplSam3sGeneralIOC; HilSam3SpiP.SpiPinMiso -> HplSam3sGeneralIOC.HplPioA12; HilSam3SpiP.SpiPinMosi -> HplSam3sGeneralIOC.HplPioA13; HilSam3SpiP.SpiPinSpck -> HplSam3sGeneralIOC.HplPioA14; components HplNVICC; HilSam3SpiP.SpiIrqControl -> HplNVICC.SPIInterrupt; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/spi/HplSam3SpiC.nc000066400000000000000000000060021207233610700237650ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * The hardware presentation layer for the SAM3U SPI. * * @author Thomas Schmid */ #include "sam3spihardware.h" configuration HplSam3SpiC { provides { interface AsyncStdControl; interface HplSam3SpiConfig; interface HplSam3SpiControl; interface HplSam3SpiInterrupts; interface HplSam3SpiStatus; interface HplSam3SpiChipSelConfig as HplSam3SpiChipSelConfig0; interface HplSam3SpiChipSelConfig as HplSam3SpiChipSelConfig1; interface HplSam3SpiChipSelConfig as HplSam3SpiChipSelConfig2; interface HplSam3SpiChipSelConfig as HplSam3SpiChipSelConfig3; } } implementation { components HplSam3SpiP; AsyncStdControl = HplSam3SpiP; HplSam3SpiConfig = HplSam3SpiP; HplSam3SpiControl = HplSam3SpiP; HplSam3SpiInterrupts = HplSam3SpiP; HplSam3SpiStatus = HplSam3SpiP; components new HplSam3SpiChipSelP(0x40008030) as CS0, new HplSam3SpiChipSelP(0x40008034) as CS1, new HplSam3SpiChipSelP(0x40008038) as CS2, new HplSam3SpiChipSelP(0x4000803C) as CS3; HplSam3SpiChipSelConfig0 = CS0; HplSam3SpiChipSelConfig1 = CS1; HplSam3SpiChipSelConfig2 = CS2; HplSam3SpiChipSelConfig3 = CS3; components HplSam3sClockC; HplSam3SpiP.SpiClockControl -> HplSam3sClockC.SPICntl; HplSam3SpiP.ClockConfig -> HplSam3sClockC; components McuSleepC; HplSam3SpiP.SpiInterruptWrapper -> McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/spi/sam3spihardware.h000066400000000000000000000036151207233610700246720ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Serial Peripheral Interface (SPI) register definitions. * * @author Thomas Schmid */ #ifndef _SAM3SPIHARDWARE_H #define _SAM3SPIHARDWARE_H #include "spihardware.h" /** * Memory mapping for the SPI */ volatile spi_t* SPI = (volatile spi_t *) 0x40008000; // SPI Base Address #endif // _SPIHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/supc/000077500000000000000000000000001207233610700215765ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/supc/sam3ssupchardware.h000066400000000000000000000034611207233610700254120ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ #ifndef SAM3SSUPCHARDWARE_H #define SAM3SSUPCHARDWARE_H #include "supchardware.h" /** * Memory mappin gofr the SUPC */ volatile supc_t* SUPC = (volatile supc_t *) 0x400E1410; #endif //SAM3SSUPCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/timer/000077500000000000000000000000001207233610700217445ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/timer/HplSam3TCC.nc000066400000000000000000000151131207233610700240700ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Top level configuration of the timer counter peripheral. * * @author Thomas Schmid */ #include configuration HplSam3TCC { provides { interface Init; interface HplSam3TC as TC0; interface HplSam3TC as TC1; interface HplSam3TCChannel as TCH0; interface HplSam3TCChannel as TCH1; interface HplSam3TCChannel as TCH2; interface HplSam3TCChannel as TCH3; interface HplSam3TCChannel as TCH4; interface HplSam3TCChannel as TCH5; interface HplSam3TCCapture as TC0Capture; interface HplSam3TCCompare as TC0CompareA; interface HplSam3TCCompare as TC0CompareB; interface HplSam3TCCompare as TC0CompareC; interface HplSam3TCCapture as TC1Capture; interface HplSam3TCCompare as TC1CompareA; interface HplSam3TCCompare as TC1CompareB; interface HplSam3TCCompare as TC1CompareC; interface HplSam3TCCapture as TC2Capture; interface HplSam3TCCompare as TC2CompareA; interface HplSam3TCCompare as TC2CompareB; interface HplSam3TCCompare as TC2CompareC; interface HplSam3TCCapture as TC3Capture; interface HplSam3TCCompare as TC3CompareA; interface HplSam3TCCompare as TC3CompareB; interface HplSam3TCCompare as TC3CompareC; interface HplSam3TCCapture as TC4Capture; interface HplSam3TCCompare as TC4CompareA; interface HplSam3TCCompare as TC4CompareB; interface HplSam3TCCompare as TC4CompareC; interface HplSam3TCCapture as TC5Capture; interface HplSam3TCCompare as TC5CompareA; interface HplSam3TCCompare as TC5CompareB; interface HplSam3TCCompare as TC5CompareC; } } implementation { components HplNVICC, HplSam3TCEventP, HplSam3sClockC, new HplSam3TCChannelP( TC_CH0_BASE ) as TCCH0, new HplSam3TCChannelP( TC_CH1_BASE ) as TCCH1, new HplSam3TCChannelP( TC_CH2_BASE ) as TCCH2, new HplSam3TCChannelP( TC1_CH0_BASE ) as TCCH3, new HplSam3TCChannelP( TC1_CH1_BASE ) as TCCH4, new HplSam3TCChannelP( TC1_CH2_BASE ) as TCCH5; components McuSleepC; HplSam3TCEventP.TC0InterruptWrapper -> McuSleepC; HplSam3TCEventP.TC1InterruptWrapper -> McuSleepC; HplSam3TCEventP.TC2InterruptWrapper -> McuSleepC; HplSam3TCEventP.TC3InterruptWrapper -> McuSleepC; HplSam3TCEventP.TC4InterruptWrapper -> McuSleepC; HplSam3TCEventP.TC5InterruptWrapper -> McuSleepC; TCH0 = TCCH0; TCH1 = TCCH1; TCH2 = TCCH2; TCH3 = TCCH3; TCH4 = TCCH4; TCH5 = TCCH5; TCCH0.NVICTCInterrupt -> HplNVICC.TC0Interrupt; TCCH0.TimerEvent -> HplSam3TCEventP.TC0Event; TCCH0.TCPClockCntl -> HplSam3sClockC.TC0Cntl; TCCH0.ClockConfig -> HplSam3sClockC; TCCH1.NVICTCInterrupt -> HplNVICC.TC1Interrupt; TCCH1.TimerEvent -> HplSam3TCEventP.TC1Event; TCCH1.TCPClockCntl -> HplSam3sClockC.TC1Cntl; TCCH1.ClockConfig -> HplSam3sClockC; TCCH2.NVICTCInterrupt -> HplNVICC.TC2Interrupt; TCCH2.TimerEvent -> HplSam3TCEventP.TC2Event; TCCH2.TCPClockCntl -> HplSam3sClockC.TC2Cntl; TCCH2.ClockConfig -> HplSam3sClockC; TCCH3.NVICTCInterrupt -> HplNVICC.TC3Interrupt; TCCH3.TimerEvent -> HplSam3TCEventP.TC3Event; TCCH3.TCPClockCntl -> HplSam3sClockC.TC3Cntl; TCCH3.ClockConfig -> HplSam3sClockC; TCCH4.NVICTCInterrupt -> HplNVICC.TC4Interrupt; TCCH4.TimerEvent -> HplSam3TCEventP.TC4Event; TCCH4.TCPClockCntl -> HplSam3sClockC.TC4Cntl; TCCH4.ClockConfig -> HplSam3sClockC; TCCH5.NVICTCInterrupt -> HplNVICC.TC5Interrupt; TCCH5.TimerEvent -> HplSam3TCEventP.TC5Event; TCCH5.TCPClockCntl -> HplSam3sClockC.TC5Cntl; TCCH5.ClockConfig -> HplSam3sClockC; TC0Capture = TCCH0.Capture; TC0CompareA = TCCH0.CompareA; TC0CompareB = TCCH0.CompareB; TC0CompareC = TCCH0.CompareC; TC1Capture = TCCH1.Capture; TC1CompareA = TCCH1.CompareA; TC1CompareB = TCCH1.CompareB; TC1CompareC = TCCH1.CompareC; TC2Capture = TCCH2.Capture; TC2CompareA = TCCH2.CompareA; TC2CompareB = TCCH2.CompareB; TC2CompareC = TCCH2.CompareC; TC3Capture = TCCH3.Capture; TC3CompareA = TCCH3.CompareA; TC3CompareB = TCCH3.CompareB; TC3CompareC = TCCH3.CompareC; TC4Capture = TCCH4.Capture; TC4CompareA = TCCH4.CompareA; TC4CompareB = TCCH4.CompareB; TC4CompareC = TCCH4.CompareC; TC5Capture = TCCH5.Capture; TC5CompareA = TCCH5.CompareA; TC5CompareB = TCCH5.CompareB; TC5CompareC = TCCH5.CompareC; components new HplSam3TCP(TC_BASE) as HplTC0; components new HplSam3TCP(TC1_BASE) as HplTC1; Init = HplTC0; Init = HplTC1; HplTC0.ClockConfig -> HplSam3sClockC; HplTC1.ClockConfig -> HplSam3sClockC; HplTC0.TC0 -> TCCH0; HplTC0.TC1 -> TCCH1; HplTC0.TC2 -> TCCH2; HplTC1.TC0 -> TCCH3; HplTC1.TC1 -> TCCH4; HplTC1.TC2 -> TCCH5; HplTC0 = TC0; HplTC1 = TC1; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/timer/HplSam3TCEventP.nc000066400000000000000000000073451207233610700251170ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * SAM3U TC Event dispatcher. * * @author Thomas Schmid */ #include "sam3tchardware.h" module HplSam3TCEventP @safe() { provides { interface HplSam3TCEvent as TC0Event; interface HplSam3TCEvent as TC1Event; interface HplSam3TCEvent as TC2Event; interface HplSam3TCEvent as TC3Event; interface HplSam3TCEvent as TC4Event; interface HplSam3TCEvent as TC5Event; } uses { interface FunctionWrapper as TC0InterruptWrapper; interface FunctionWrapper as TC1InterruptWrapper; interface FunctionWrapper as TC2InterruptWrapper; interface FunctionWrapper as TC3InterruptWrapper; interface FunctionWrapper as TC4InterruptWrapper; interface FunctionWrapper as TC5InterruptWrapper; } } implementation { void TC0IrqHandler() @C() @spontaneous() { call TC0InterruptWrapper.preamble(); signal TC0Event.fired(); call TC0InterruptWrapper.postamble(); } void TC1IrqHandler() @C() @spontaneous() { call TC1InterruptWrapper.preamble(); signal TC1Event.fired(); call TC1InterruptWrapper.postamble(); } void TC2IrqHandler() @C() @spontaneous() { call TC2InterruptWrapper.preamble(); signal TC2Event.fired(); call TC2InterruptWrapper.postamble(); } void TC3IrqHandler() @C() @spontaneous() { call TC3InterruptWrapper.preamble(); signal TC3Event.fired(); call TC3InterruptWrapper.postamble(); } void TC4IrqHandler() @C() @spontaneous() { call TC4InterruptWrapper.preamble(); signal TC4Event.fired(); call TC4InterruptWrapper.postamble(); } void TC5IrqHandler() @C() @spontaneous() { call TC5InterruptWrapper.preamble(); signal TC5Event.fired(); call TC5InterruptWrapper.postamble(); } default async event void TC0Event.fired() {} default async event void TC1Event.fired() {} default async event void TC2Event.fired() {} default async event void TC3Event.fired() {} default async event void TC4Event.fired() {} default async event void TC5Event.fired() {} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/timer/sam3rtthardware.h000066400000000000000000000035601207233610700252340ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Real-Time Timer register definitions. * * @author Thomas Schmid */ #ifndef SAM3SRTTHARDWARE_H #define SAM3SRTTHARDWARE_H #include "rtthardware.h" // Defined in AT91 ARM Coretx-M3 based Microcontrollers, SAM3S Series, volatile rtt_t* RTT = (volatile rtt_t*) 0x400E1430; #endif // SAM3SRTTHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/timer/sam3tchardware.h000066400000000000000000000052221207233610700250260ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Timer Counter register definitions. * * @author Thomas Schmid */ #ifndef SAM3STCHARDWARE_H #define SAM3STCHARDWARE_H #include "tchardware.h" /** * TC definition capture mode */ typedef struct { volatile tc_channel_capture_t ch0; uint32_t reserved0[4]; volatile tc_channel_capture_t ch1; uint32_t reserved1[4]; volatile tc_channel_capture_t ch2; uint32_t reserved2[4]; volatile tc_bcr_t bcr; volatile tc_bmr_t bmr; volatile tc_qier_t qier; volatile tc_qidr_t qidr; volatile tc_qimr_t qimr; volatile tc_qisr_t qisr; } tc_t; /** * TC Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary 9/1/09, p. 827 */ #define TC_BASE 0x40010000 #define TC1_BASE 0x40014000 #define TC_CH0_BASE 0x40010000 #define TC_CH1_BASE 0x40010040 #define TC_CH2_BASE 0x40010080 #define TC1_CH0_BASE 0x40014000 #define TC1_CH1_BASE 0x40014040 #define TC1_CH2_BASE 0x40014080 volatile tc_t* TC = (volatile tc_t*)TC_BASE; volatile tc_t* TC1 = (volatile tc_t*)TC1_BASE; #endif //SAM3UTCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/uart/000077500000000000000000000000001207233610700215775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/uart/HilSam3UartC.nc000066400000000000000000000051031207233610700243170ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ configuration HilSam3UartC { provides { interface StdControl; interface UartByte; interface UartStream; } } implementation { components HilSam3UartP; StdControl = HilSam3UartP; UartByte = HilSam3UartP; UartStream = HilSam3UartP; components HplSam3UartC; HilSam3UartP.HplSam3UartInterrupts -> HplSam3UartC; HilSam3UartP.HplSam3UartStatus -> HplSam3UartC; HilSam3UartP.HplSam3UartControl -> HplSam3UartC; HilSam3UartP.HplSam3UartConfig -> HplSam3UartC; #ifdef THREADS components PlatformInterruptC; HplSam3UartC.PlatformInterrupt -> PlatformInterruptC; #endif components MainC; MainC.SoftwareInit -> HilSam3UartP.Init; components HplNVICC; HilSam3UartP.UartIrqControl -> HplNVICC.UART0Interrupt; components HplSam3sGeneralIOC; HilSam3UartP.UartPin1 -> HplSam3sGeneralIOC.HplPioA9; HilSam3UartP.UartPin2 -> HplSam3sGeneralIOC.HplPioA10; components HplSam3sClockC; HilSam3UartP.UartClockControl -> HplSam3sClockC.UART0Cntl; HilSam3UartP.ClockConfig -> HplSam3sClockC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/uart/sam3uarthardware.h000066400000000000000000000054511207233610700252320ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Definitions specific to the SAM3S UART chip. * * @author Wanja Hofer * @author Thomas Schmid */ #ifndef SAM3SUARTHARDWARE_H #define SAM3SUARTHARDWARE_H #include "uarthardware.h" // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3S Series, Preliminary, p. 663 volatile uint32_t* UART_BASE = (volatile uint32_t *) 0x400e0600; volatile uart_cr_t* UART_CR = (volatile uart_cr_t*) 0x400e0600; // control, wo volatile uart_mr_t* UART_MR = (volatile uart_mr_t*) 0x400e0604; // mode, rw, reset 0x0 volatile uart_ier_t* UART_IER = (volatile uart_ier_t*) 0x400e0608; // interrupt enable, wo volatile uart_idr_t* UART_IDR = (volatile uart_idr_t*) 0x400e060c; // interrupt disable, wo volatile uart_imr_t* UART_IMR = (volatile uart_imr_t*) 0x400e0610; // interrupt mask, ro, reset 0x0 volatile uart_sr_t* UART_SR = (volatile uart_sr_t*) 0x400e0614; // status, ro volatile uart_rhr_t* UART_RHR = (volatile uart_rhr_t*) 0x400e0618; // receive holding, ro, reset 0x0 volatile uart_thr_t* UART_THR = (volatile uart_thr_t*) 0x400e061c; // transmit holding, wo volatile uart_brgr_t* UART_BRGR = (volatile uart_brgr_t*) 0x400e0620; // baud rate generator, rw, reset 0x0 #endif // SAM3SUARTHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/wdtc/000077500000000000000000000000001207233610700215655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/s/wdtc/sam3wdtchardware.h000066400000000000000000000037351207233610700252110ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Watchdog Timer register definitions. * * @author Thomas Schmid */ #ifndef _SAM3SWDTCHARDWARE_H #define _SAM3SWDTCHARDWARE_H #include "wdtchardware.h" /** * Memory mapping for the WDTC * Note that it is NOT 0x400e1440 as mentioned in sam3s preliminary from * Aug-10 */ volatile wdtc_t* WDTC = (volatile wdtc_t *) 0x400E1450; // WDTC Base Address #endif // _SAM3SWDTCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/smc/000077500000000000000000000000001207233610700211445ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/smc/smchardware.h000066400000000000000000000065761207233610700236330ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Static Memory Controller Register Definitions * * @author Thomas Schmid */ #ifndef _SAM3SMCHARDWARE_H #define _SAM3SMCHARDWARE_H /** * SMC SETUP Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. */ typedef union { uint32_t flat; struct { uint32_t nwe_setup : 6; // NWE Setup length uint32_t reserved0 : 2; uint32_t ncs_wr_setup : 6; // ncs setup length in write access uint32_t reserved1 : 2; uint32_t nrd_setup : 6; // nrd setup length uint32_t reserved2 : 2; uint32_t ncs_rd_setup : 6; // ncs setup length in read access uint32_t reserved3 : 2; } __attribute__((__packed__)) bits; } smc_setup_t; /** * SMC PULSE Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. */ typedef union { uint32_t flat; struct { uint32_t nwe_pulse : 6; // NWE setup length uint32_t reserved0 : 2; uint32_t ncs_wr_pulse : 6; // ncs setup length in write access uint32_t reserved1 : 2; uint32_t nrd_pulse : 6; // nrd setup length uint32_t reserved2 : 2; uint32_t ncs_rd_pulse : 6; // ncs setup length in read access uint32_t reserved3 : 2; } __attribute__((__packed__)) bits; } smc_pulse_t; /** * SMC CYCLE Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. */ typedef union { uint32_t flat; struct { uint32_t nwe_cycle : 9; // total write cycle length uint32_t reserved0 : 7; uint32_t nrd_cycle : 9; // total read cycle length uint32_t reserved1 : 7; } __attribute__((__packed__)) bits; } smc_cycle_t; #endif //_SAM3SMCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/000077500000000000000000000000001207233610700211555ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/FastSpiSam3C.nc000066400000000000000000000062601207233610700237030ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Emulate fast spi with SpiByte */ generic module FastSpiSam3C(char resourceName[]) { provides { interface FastSpiByte[uint8_t]; } uses { interface SpiByte[uint8_t]; } } implementation { enum { NUM_CLIENTS = uniqueCount(resourceName) }; volatile uint8_t lastRead[NUM_CLIENTS]; /** * Starts a split-phase SPI data transfer with the given data. * A splitRead/splitReadWrite command must follow this command even * if the result is unimportant. */ async command void FastSpiByte.splitWrite[uint8_t id](uint8_t data){ atomic lastRead[id] = call SpiByte.write[id](data); } /** * Finishes the split-phase SPI data transfer by waiting till * the write command comletes and returning the received data. */ async command uint8_t FastSpiByte.splitRead[uint8_t id](){ atomic return lastRead[id]; } /** * This command first reads the SPI register and then writes * there the new data, then returns. */ async command uint8_t FastSpiByte.splitReadWrite[uint8_t id](uint8_t data){ uint8_t tmp; atomic { tmp = lastRead[id]; lastRead[id] = call SpiByte.write[id](data); } return tmp; } /** * This is the standard SpiByte.write command but a little * faster as we should not need to adjust the power state there. * (To be consistent, this command could have be named splitWriteRead). */ async command uint8_t FastSpiByte.write[uint8_t id](uint8_t data){ return call SpiByte.write[id](data); } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/HilSam3SpiP.nc000066400000000000000000000135121207233610700235350ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * SPI implementation for the SAM3U chip. Does not use DMA (PDC) at this * point. Byte interface performs busy wait! * * @author Thomas Schmid * @author Kevin Klues */ #include "sam3spihardware.h" module HilSam3SpiP { provides { interface Init; interface SpiByte[uint8_t]; interface SpiPacket[uint8_t]; } uses { interface Init as SpiChipInit; interface ArbiterInfo; interface HplSam3SpiConfig; interface HplSam3SpiControl; interface HplSam3SpiInterrupts; interface HplSam3SpiStatus; interface HplNVICInterruptCntl as SpiIrqControl; interface HplSam3GeneralIOPin as SpiPinMiso; interface HplSam3GeneralIOPin as SpiPinMosi; interface HplSam3GeneralIOPin as SpiPinSpck; } } implementation { void signalDone(); task void signalDone_task(); uint8_t* globalTxBuf; uint8_t* globalRxBuf; uint16_t globalLen; command error_t Init.init() { // turn off all interrupts call HplSam3SpiInterrupts.disableAllSpiIrqs(); // configure NVIC call SpiIrqControl.configure(IRQ_PRIO_SPI); call SpiIrqControl.enable(); // configure PIO call SpiPinMiso.disablePioControl(); call SpiPinMiso.selectPeripheralA(); call SpiPinMosi.disablePioControl(); call SpiPinMosi.selectPeripheralA(); call SpiPinSpck.disablePioControl(); call SpiPinSpck.selectPeripheralA(); // reset the SPI configuration call HplSam3SpiControl.resetSpi(); // configure for master call HplSam3SpiConfig.setMaster(); // chip select options call HplSam3SpiConfig.setFixedCS(); // CS needs to be configured for each message sent! //call HplSam3SpiConfig.setVariableCS(); // CS needs to be configured for each message sent! call HplSam3SpiConfig.setDirectCS(); // CS pins are not multiplexed call SpiChipInit.init(); return SUCCESS; } async command uint8_t SpiByte.write[uint8_t device]( uint8_t tx) { uint8_t byte; if(!(call ArbiterInfo.userId() == device)) return -1; //call HplSam3SpiChipSelConfig.enableCSActive(); call HplSam3SpiStatus.setDataToTransmit(tx); while(!call HplSam3SpiStatus.isRxFull()); byte = (uint8_t)call HplSam3SpiStatus.getReceivedData(); return byte; } async command error_t SpiPacket.send[uint8_t device](uint8_t* txBuf, uint8_t* rxBuf, uint16_t len) { uint16_t m_len = len; uint16_t m_pos = 0; if(!(call ArbiterInfo.userId() == device)) return -1; if(len) { while( m_pos < len) { /** * FIXME: in order to be compatible with the general TinyOS * Spi Interface, we can't do automatic CS control!!! if(m_pos == len-1) call HplSam3SpiStatus.setDataToTransmitCS(txBuf[m_pos], 3, TRUE); else call HplSam3SpiStatus.setDataToTransmitCS(txBuf[m_pos], 3, FALSE); */ /* call HplSam3SpiStatus.setDataToTransmitCS(txBuf[m_pos], device, FALSE); while(!call HplSam3SpiStatus.isRxFull()); rxBuf[m_pos] = (uint8_t)call HplSam3SpiStatus.getReceivedData(); */ rxBuf[m_pos] = (uint8_t)call SpiByte.write[device](txBuf[m_pos]); m_pos += 1; } } atomic { globalRxBuf = rxBuf; globalTxBuf = txBuf; globalLen = m_len; } post signalDone_task(); //atomic signal SpiPacket.sendDone(txBuf, rxBuf, m_len, SUCCESS); return SUCCESS; } task void signalDone_task() { atomic signalDone(); } void signalDone() { uint8_t device = call ArbiterInfo.userId(); signal SpiPacket.sendDone[device](globalTxBuf, globalRxBuf, globalLen, SUCCESS); } default async event void SpiPacket.sendDone[uint8_t device](uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len, error_t error) {} async event void HplSam3SpiInterrupts.receivedData(uint16_t data) {}; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/HplSam3SpiChipSelConfig.nc000066400000000000000000000063421207233610700260250ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to configure the Chip Selects of the SAM3U SPI. * * @author Thomas Schmid */ interface HplSam3SpiChipSelConfig { /** * Set the Clock polarity * 0: inactive state is logic zero * 1: inactive state is logic one */ async command error_t setClockPolarity(uint8_t p); /** * Set the Clock Phase * 0: changed on leading edge, and captured on following edge * 1: captured on leading edge, and changed on following edge */ async command error_t setClockPhase(uint8_t p); /** * Disable automatic Chip Select rising between consecutive transmits * (default) */ async command error_t disableAutoCS(); /** * enable automatic Chip Select rising between consecutive transmits. */ async command error_t enableAutoCS(); /** * Enable Chip Select active after transfer (default). */ async command error_t enableCSActive(); /** * Disable Chip Select active after transfer. */ async command error_t disableCSActive(); /** * Set the total amount of bits per transfer. Range is from 8 to 16. */ async command error_t setBitsPerTransfer(uint8_t b); /** * Set the serial clock baud rate by defining the MCK devider, i.e., baud * rate = MCK/divider. * Acceptable values range from 1 to 255. */ async command error_t setBaud(uint8_t divider); /** * Set the delay between NPCS ready to first valid SPCK. */ async command error_t setClkDelay(uint8_t delay); /** * Set the delay between consecutive transfers. */ async command error_t setTxDelay(uint8_t delay); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/HplSam3SpiChipSelP.nc000066400000000000000000000116731207233610700250220ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to control the SAM3U SPI. * * @author Thomas Schmid */ #include "sam3spihardware.h" generic module HplSam3SpiChipSelP(uint32_t csrp) { provides { interface HplSam3SpiChipSelConfig; } } implementation { volatile spi_csr_t *csr = (volatile spi_csr_t*)csrp; bool cs; /** * Set the Clock polarity * 0: inactive state is logic zero * 1: inactive state is logic one */ async command error_t HplSam3SpiChipSelConfig.setClockPolarity(uint8_t p) { spi_csr_t reg = *csr; if(p > 1) return FAIL; reg.bits.cpol = p; *csr = reg; return SUCCESS; } /** * Set the Clock Phase * 0: changed on leading edge, and captured on following edge * 1: captured on leading edge, and changed on following edge */ async command error_t HplSam3SpiChipSelConfig.setClockPhase(uint8_t p) { spi_csr_t reg = *csr; if(p > 1) return FAIL; reg.bits.ncpha = p; *csr = reg; return SUCCESS; } /** * Disable automatic Chip Select rising between consecutive transmits * (default) */ async command error_t HplSam3SpiChipSelConfig.disableAutoCS() { spi_csr_t reg = *csr; reg.bits.csnaat = 0; *csr = reg; return SUCCESS; } /** * enable automatic Chip Select rising between consecutive transmits. */ async command error_t HplSam3SpiChipSelConfig.enableAutoCS() { spi_csr_t reg = *csr; reg.bits.csnaat = 1; *csr = reg; return SUCCESS; } /** * Enable Chip Select active after transfer (default). */ async command error_t HplSam3SpiChipSelConfig.enableCSActive() { spi_csr_t reg = *csr; reg.bits.csaat= 0; *csr = reg; return SUCCESS; } /** * Disable Chip Select active after transfer. */ async command error_t HplSam3SpiChipSelConfig.disableCSActive() { spi_csr_t reg = *csr; reg.bits.csaat= 1; *csr = reg; return SUCCESS; } /** * Set the total amount of bits per transfer. Range is from 8 to 16. */ async command error_t HplSam3SpiChipSelConfig.setBitsPerTransfer(uint8_t b) { spi_csr_t reg = *csr; if(b > 8) return FAIL; reg.bits.bits = b; *csr = reg; return SUCCESS; } /** * Set the serial clock baud rate by defining the MCK devider, i.e., baud * rate = MCK/divider. * Acceptable values range from 1 to 255. */ async command error_t HplSam3SpiChipSelConfig.setBaud(uint8_t divider) { spi_csr_t tcsr = *csr; if(divider == 0) return FAIL; tcsr.bits.scbr = divider; *csr = tcsr; return SUCCESS; } /** * Set the delay between NPCS ready to first valid SPCK. */ async command error_t HplSam3SpiChipSelConfig.setClkDelay(uint8_t delay) { spi_csr_t tcsr = *csr; tcsr.bits.dlybs = delay; *csr = tcsr; return SUCCESS; } /** * Set the delay between consecutive transfers. */ async command error_t HplSam3SpiChipSelConfig.setTxDelay(uint8_t delay) { spi_csr_t tcsr = *csr; tcsr.bits.dlybct = delay; *csr = tcsr; return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/HplSam3SpiConfig.nc000066400000000000000000000063731207233610700245610ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to configure the SAM3 SPI. * * @author Thomas Schmid */ interface HplSam3SpiConfig { /** * Set the SPI interface to Master mode (default). */ async command error_t setMaster(); /** * Set the SPI interface to Slave mode. */ async command error_t setSlave(); /** * Set fixed peripherel select. */ async command error_t setFixedCS(); /** * Set variable peripheral select. */ async command error_t setVariableCS(); /** * Set the Chip Select pins to be directly connected to the chips * (default). */ async command error_t setDirectCS(); /** * Set the Chip Select pins to be connected to a 4- to 16-bit decoder */ async command error_t setMultiplexedCS(); /** * Enable mode fault detection (default). */ async command error_t enableModeFault(); /** * Disable mode fault detection. */ async command error_t disableModeFault(); /** * Disable suppression of transmit if receive register is not empty * (default). */ async command error_t disableWaitTx(); /** * Enable suppression of transmit if receive register is not empty. */ async command error_t enableWaitTx(); /** * Disable local loopback */ async command error_t disableLoopBack(); /** * Enable local loopback */ async command error_t enableLoopBack(); /** * Select peripheral chip */ async command error_t selectChip(uint8_t pcs); /** * Set the delay between chip select changes in MCK clock ticks. */ async command error_t setChipSelectDelay(uint8_t n); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/HplSam3SpiControl.nc000066400000000000000000000035221207233610700247650ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to control the SAM3U SPI. * * @author Thomas Schmid */ interface HplSam3SpiControl { async command void resetSpi(); async command void enableSpi(); async command void disableSpi(); async command void lastTransfer(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/HplSam3SpiInterrupts.nc000066400000000000000000000053701207233610700255270ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to control and query the SAM3 SPI interrupts. * * @author Thomas Schmid */ interface HplSam3SpiInterrupts { async event void receivedData(uint16_t data); async command void disableAllSpiIrqs(); async command void enableRxFullIrq(); async command void disableRxFullIrq(); async command bool isEnabledRxFullIrq(); async command void enableTxDataEmptyIrq(); async command void disableTxDataEmptyIrq(); async command bool isEnabledTxDataEmptyIrq(); async command void enableModeFaultIrq(); async command void disableModeFaultIrq(); async command bool isEnabledModeFaultIrq(); async command void enableOverrunIrq(); async command void disableOverrunIrq(); async command bool isEnabledOverrunIrq(); async command void enableNssRisingIrq(); async command void disableNssRisingIrq(); async command bool isEnabledNssRisingIrq(); async command void enableTxEmptyIrq(); async command void disableTxEmptyIrq(); async command bool isEnabledTxEmptyIrq(); async command void enableUnderrunIrq(); async command void disableUnderrunIrq(); async command bool isEnabledUnderrunIrq(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/HplSam3SpiP.nc000066400000000000000000000332261207233610700235500ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * The hardware presentation layer for the SAM3U SPI. * * @author Thomas Schmid */ #include "sam3spihardware.h" module HplSam3SpiP { provides { interface AsyncStdControl; interface HplSam3SpiConfig; interface HplSam3SpiControl; interface HplSam3SpiInterrupts; interface HplSam3SpiStatus; } uses { interface FunctionWrapper as SpiInterruptWrapper; interface HplSam3PeripheralClockCntl as SpiClockControl; interface HplSam3Clock as ClockConfig; } } implementation { async command error_t AsyncStdControl.start() { // enable peripheral clock call SpiClockControl.enable(); // enable SPI call HplSam3SpiControl.enableSpi(); // enable SPI IRQ (Byte is a busy wait!) //call HplSam3SpiInterrupts.enableRxFullIrq(); return SUCCESS; } async command error_t AsyncStdControl.stop() { // stop the SPI call HplSam3SpiControl.disableSpi(); // stop the peripheral clock call SpiClockControl.disable(); return SUCCESS; } /** * Set the SPI interface to Master mode (default). */ async command error_t HplSam3SpiConfig.setMaster() { spi_mr_t mr = SPI->mr; mr.bits.mstr = 1; SPI->mr = mr; return SUCCESS; } /** * Set the SPI interface to Slave mode. */ async command error_t HplSam3SpiConfig.setSlave() { spi_mr_t mr = SPI->mr; mr.bits.mstr = 0; SPI->mr = mr; return SUCCESS; } /** * Set fixed peripherel select. */ async command error_t HplSam3SpiConfig.setFixedCS() { spi_mr_t mr = SPI->mr; mr.bits.ps = 0; SPI->mr = mr; return SUCCESS; } /** * Set variable peripheral select. */ async command error_t HplSam3SpiConfig.setVariableCS() { spi_mr_t mr = SPI->mr; mr.bits.ps = 1; SPI->mr = mr; return SUCCESS; } /** * Set the Chip Select pins to be directly connected to the chips * (default). */ async command error_t HplSam3SpiConfig.setDirectCS() { spi_mr_t mr = SPI->mr; mr.bits.pcsdec = 0; SPI->mr = mr; return SUCCESS; } /** * Set the Chip Select pins to be connected to a 4- to 16-bit decoder */ async command error_t HplSam3SpiConfig.setMultiplexedCS() { spi_mr_t mr = SPI->mr; mr.bits.pcsdec = 1; SPI->mr = mr; return SUCCESS; } /** * Enable mode fault detection (default). */ async command error_t HplSam3SpiConfig.enableModeFault() { spi_mr_t mr = SPI->mr; mr.bits.modfdis = 0; SPI->mr = mr; return SUCCESS; } /** * Disable mode fault detection. */ async command error_t HplSam3SpiConfig.disableModeFault() { spi_mr_t mr = SPI->mr; mr.bits.modfdis = 1; SPI->mr = mr; return SUCCESS; } /** * Disable suppression of transmit if receive register is not empty * (default). */ async command error_t HplSam3SpiConfig.disableWaitTx() { spi_mr_t mr = SPI->mr; mr.bits.wdrbt = 0; SPI->mr = mr; return SUCCESS; } /** * Enable suppression of transmit if receive register is not empty. */ async command error_t HplSam3SpiConfig.enableWaitTx() { spi_mr_t mr = SPI->mr; mr.bits.wdrbt = 1; SPI->mr = mr; return SUCCESS; } /** * Disable local loopback */ async command error_t HplSam3SpiConfig.disableLoopBack() { spi_mr_t mr = SPI->mr; mr.bits.llb = 0; SPI->mr = mr; return SUCCESS; } /** * Enable local loopback */ async command error_t HplSam3SpiConfig.enableLoopBack() { spi_mr_t mr = SPI->mr; mr.bits.llb = 1; SPI->mr = mr; return SUCCESS; } /** * Select peripheral chip */ async command error_t HplSam3SpiConfig.selectChip(uint8_t pcs) { spi_mr_t mr = SPI->mr; if(SPI->mr.bits.pcsdec == 0) { switch(pcs) { case 0: mr.bits.pcs = 0; break; case 1: mr.bits.pcs = 1; break; case 2: mr.bits.pcs = 3; break; case 3: mr.bits.pcs = 7; break; default: return EINVAL; } } else { if(pcs > 15) return EINVAL; mr.bits.pcs = pcs; } SPI->mr = mr; return SUCCESS; } /** * Set the delay between chip select changes in MCK clock ticks. */ async command error_t HplSam3SpiConfig.setChipSelectDelay(uint8_t n) { spi_mr_t mr = SPI->mr; mr.bits.dlybcs = n; SPI->mr = mr; return SUCCESS; } async command void HplSam3SpiControl.resetSpi() { spi_cr_t cr = SPI->cr; cr.bits.swrst = 1; SPI->cr = cr; } async command void HplSam3SpiControl.enableSpi() { spi_cr_t cr = SPI->cr; cr.bits.spien = 1; SPI->cr = cr; } async command void HplSam3SpiControl.disableSpi() { spi_cr_t cr = SPI->cr; cr.bits.spidis = 1; SPI->cr = cr; } async command void HplSam3SpiControl.lastTransfer() { spi_cr_t cr = SPI->cr; cr.bits.lastxfer = 1; SPI->cr = cr; } __attribute__((interrupt)) void SpiIrqHandler() @C() @spontaneous() { call SpiInterruptWrapper.preamble(); if((call HplSam3SpiInterrupts.isEnabledRxFullIrq() == TRUE) && (call HplSam3SpiStatus.isRxFull() == TRUE)) { uint16_t data = call HplSam3SpiStatus.getReceivedData(); signal HplSam3SpiInterrupts.receivedData(data); } call SpiInterruptWrapper.postamble(); } async command void HplSam3SpiInterrupts.disableAllSpiIrqs() { call HplSam3SpiInterrupts.disableRxFullIrq(); call HplSam3SpiInterrupts.disableTxDataEmptyIrq(); call HplSam3SpiInterrupts.disableModeFaultIrq(); call HplSam3SpiInterrupts.disableOverrunIrq(); call HplSam3SpiInterrupts.disableNssRisingIrq(); call HplSam3SpiInterrupts.disableTxEmptyIrq(); call HplSam3SpiInterrupts.disableUnderrunIrq(); } // RDRF async command void HplSam3SpiInterrupts.enableRxFullIrq() { spi_ier_t ier = SPI->ier; ier.bits.rdrf = 1; SPI->ier = ier; } async command void HplSam3SpiInterrupts.disableRxFullIrq() { spi_idr_t idr = SPI->idr; idr.bits.rdrf = 1; SPI->idr = idr; } async command bool HplSam3SpiInterrupts.isEnabledRxFullIrq() { return (SPI->imr.bits.rdrf == 1); } // TDRE async command void HplSam3SpiInterrupts.enableTxDataEmptyIrq() { spi_ier_t ier = SPI->ier; ier.bits.tdre = 1; SPI->ier = ier; } async command void HplSam3SpiInterrupts.disableTxDataEmptyIrq() { spi_idr_t idr = SPI->idr; idr.bits.tdre = 1; SPI->idr = idr; } async command bool HplSam3SpiInterrupts.isEnabledTxDataEmptyIrq() { return (SPI->imr.bits.tdre == 1); } // MODF async command void HplSam3SpiInterrupts.enableModeFaultIrq() { spi_ier_t ier = SPI->ier; ier.bits.modf = 1; SPI->ier = ier; } async command void HplSam3SpiInterrupts.disableModeFaultIrq() { spi_idr_t idr = SPI->idr; idr.bits.modf = 1; SPI->idr = idr; } async command bool HplSam3SpiInterrupts.isEnabledModeFaultIrq() { return (SPI->imr.bits.modf == 1); } // OVRES async command void HplSam3SpiInterrupts.enableOverrunIrq() { spi_ier_t ier = SPI->ier; ier.bits.ovres = 1; SPI->ier = ier; } async command void HplSam3SpiInterrupts.disableOverrunIrq() { spi_idr_t idr = SPI->idr; idr.bits.ovres = 1; SPI->idr = idr; } async command bool HplSam3SpiInterrupts.isEnabledOverrunIrq() { return (SPI->imr.bits.ovres == 1); } // NSSR async command void HplSam3SpiInterrupts.enableNssRisingIrq() { spi_ier_t ier = SPI->ier; ier.bits.nssr = 1; SPI->ier = ier; } async command void HplSam3SpiInterrupts.disableNssRisingIrq() { spi_idr_t idr = SPI->idr; idr.bits.nssr = 1; SPI->idr = idr; } async command bool HplSam3SpiInterrupts.isEnabledNssRisingIrq() { return (SPI->imr.bits.nssr == 1); } // TXEMPTY async command void HplSam3SpiInterrupts.enableTxEmptyIrq() { spi_ier_t ier = SPI->ier; ier.bits.txempty = 1; SPI->ier = ier; } async command void HplSam3SpiInterrupts.disableTxEmptyIrq() { spi_idr_t idr = SPI->idr; idr.bits.txempty = 1; SPI->idr = idr; } async command bool HplSam3SpiInterrupts.isEnabledTxEmptyIrq() { return (SPI->imr.bits.txempty == 1); } // UNDES async command void HplSam3SpiInterrupts.enableUnderrunIrq() { spi_ier_t ier = SPI->ier; ier.bits.undes = 1; SPI->ier = ier; } async command void HplSam3SpiInterrupts.disableUnderrunIrq() { spi_idr_t idr = SPI->idr; idr.bits.undes = 1; SPI->idr = idr; } async command bool HplSam3SpiInterrupts.isEnabledUnderrunIrq() { return (SPI->imr.bits.undes == 1); } async command uint16_t HplSam3SpiStatus.getReceivedData() { return SPI->rdr.bits.rd; } async command error_t HplSam3SpiStatus.setDataToTransmitCS(uint16_t txchr, uint8_t pcs, bool lastXfer) { spi_tdr_t tdr; if(SPI->mr.bits.ps == 1) { if(SPI->mr.bits.pcsdec == 0) { switch(pcs) { case 0: tdr.bits.pcs = 0; break; case 1: tdr.bits.pcs = 1; break; case 2: tdr.bits.pcs = 3; break; case 3: tdr.bits.pcs = 7; break; default: return EINVAL; } } else { if(pcs > 15) return EINVAL; tdr.bits.pcs = pcs; } tdr.bits.td = txchr; tdr.bits.lastxfer = lastXfer; SPI->tdr = tdr; } else { if(call HplSam3SpiConfig.selectChip(pcs) != SUCCESS) return EINVAL; call HplSam3SpiStatus.setDataToTransmit(txchr); } return SUCCESS; } async command void HplSam3SpiStatus.setDataToTransmit(uint16_t txchr) { spi_tdr_t tdr = SPI->tdr; tdr.bits.td = txchr; SPI->tdr = tdr; } async command bool HplSam3SpiStatus.isRxFull() { return (SPI->sr.bits.rdrf == 1); } async command bool HplSam3SpiStatus.isTxDataEmpty() { return (SPI->sr.bits.tdre == 1); } async command bool HplSam3SpiStatus.isModeFault() { return (SPI->sr.bits.modf == 1); } async command bool HplSam3SpiStatus.isOverrunError() { return (SPI->sr.bits.ovres == 1); } async command bool HplSam3SpiStatus.isNssRising() { return (SPI->sr.bits.nssr == 1); } async command bool HplSam3SpiStatus.isTxEmpty() { return (SPI->sr.bits.txempty == 1); } async command bool HplSam3SpiStatus.isUnderrunError() { return (SPI->sr.bits.undes == 1); } async command bool HplSam3SpiStatus.isSpiEnabled() { return (SPI->sr.bits.spiens == 1); } async event void ClockConfig.mainClockChanged() {}; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/HplSam3SpiStatus.nc000066400000000000000000000043041207233610700246270ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to query the status of the SAM3 SPI. * * @author Thomas Schmid */ interface HplSam3SpiStatus { async command uint16_t getReceivedData(); async command void setDataToTransmit(uint16_t txchr); async command error_t setDataToTransmitCS(uint16_t txchr, uint8_t pcs, bool lastXfer); async command bool isRxFull(); async command bool isTxDataEmpty(); async command bool isModeFault(); async command bool isOverrunError(); async command bool isNssRising(); async command bool isTxEmpty(); async command bool isUnderrunError(); async command bool isSpiEnabled(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/Sam3Spi0C.nc000066400000000000000000000050341207233610700231430ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include generic configuration Sam3Spi0C() { provides { interface Resource; interface SpiByte; interface FastSpiByte; interface SpiPacket; interface HplSam3SpiChipSelConfig; } uses { interface Init as SpiInit; interface ResourceConfigure; } } implementation { enum { CLIENT_ID = unique(SAM3_SPI_BUS), }; components HilSam3SpiC as SpiC; SpiC.SpiChipInit = SpiInit; Resource = SpiC.Resource[CLIENT_ID]; SpiByte = SpiC.SpiByte[CLIENT_ID]; FastSpiByte = SpiC.FastSpiByte[CLIENT_ID]; SpiPacket = SpiC.SpiPacket[CLIENT_ID]; HplSam3SpiChipSelConfig = SpiC.HplSam3SpiChipSelConfig[0]; components new Sam3SpiP(0); ResourceConfigure = Sam3SpiP.ResourceConfigure; Sam3SpiP.SubResourceConfigure <- SpiC.ResourceConfigure[CLIENT_ID]; Sam3SpiP.HplSam3SpiConfig -> SpiC.HplSam3SpiConfig; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/Sam3Spi1C.nc000066400000000000000000000050161207233610700231440ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include generic configuration Sam3Spi1C() { provides { interface Resource; interface SpiByte; interface FastSpiByte; interface SpiPacket; interface HplSam3SpiChipSelConfig; } uses { interface Init as SpiInit; interface ResourceConfigure; } } implementation { enum { CLIENT_ID = unique(SAM3_SPI_BUS), }; components HilSam3SpiC as SpiC; SpiC.SpiChipInit = SpiInit; Resource = SpiC.Resource[CLIENT_ID]; SpiByte = SpiC.SpiByte[CLIENT_ID]; FastSpiByte = SpiC.FastSpiByte[CLIENT_ID]; SpiPacket = SpiC.SpiPacket[CLIENT_ID]; HplSam3SpiChipSelConfig = SpiC.HplSam3SpiChipSelConfig[1]; components new Sam3SpiP(1); ResourceConfigure = Sam3SpiP.ResourceConfigure; Sam3SpiP.SubResourceConfigure <- SpiC.ResourceConfigure[CLIENT_ID]; Sam3SpiP.HplSam3SpiConfig -> SpiC.HplSam3SpiConfig; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/Sam3Spi2C.nc000066400000000000000000000050161207233610700231450ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include generic configuration Sam3Spi2C() { provides { interface Resource; interface SpiByte; interface FastSpiByte; interface SpiPacket; interface HplSam3SpiChipSelConfig; } uses { interface Init as SpiInit; interface ResourceConfigure; } } implementation { enum { CLIENT_ID = unique(SAM3_SPI_BUS), }; components HilSam3SpiC as SpiC; SpiC.SpiChipInit = SpiInit; Resource = SpiC.Resource[CLIENT_ID]; SpiByte = SpiC.SpiByte[CLIENT_ID]; FastSpiByte = SpiC.FastSpiByte[CLIENT_ID]; SpiPacket = SpiC.SpiPacket[CLIENT_ID]; HplSam3SpiChipSelConfig = SpiC.HplSam3SpiChipSelConfig[2]; components new Sam3SpiP(2); ResourceConfigure = Sam3SpiP.ResourceConfigure; Sam3SpiP.SubResourceConfigure <- SpiC.ResourceConfigure[CLIENT_ID]; Sam3SpiP.HplSam3SpiConfig -> SpiC.HplSam3SpiConfig; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/Sam3Spi3C.nc000066400000000000000000000050161207233610700231460ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include generic configuration Sam3Spi3C() { provides { interface Resource; interface SpiByte; interface FastSpiByte; interface SpiPacket; interface HplSam3SpiChipSelConfig; } uses { interface Init as SpiInit; interface ResourceConfigure; } } implementation { enum { CLIENT_ID = unique(SAM3_SPI_BUS), }; components HilSam3SpiC as SpiC; SpiC.SpiChipInit = SpiInit; Resource = SpiC.Resource[CLIENT_ID]; SpiByte = SpiC.SpiByte[CLIENT_ID]; FastSpiByte = SpiC.FastSpiByte[CLIENT_ID]; SpiPacket = SpiC.SpiPacket[CLIENT_ID]; HplSam3SpiChipSelConfig = SpiC.HplSam3SpiChipSelConfig[3]; components new Sam3SpiP(3); ResourceConfigure = Sam3SpiP.ResourceConfigure; Sam3SpiP.SubResourceConfigure <- SpiC.ResourceConfigure[CLIENT_ID]; Sam3SpiP.HplSam3SpiConfig -> SpiC.HplSam3SpiConfig; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/Sam3SpiP.nc000066400000000000000000000041211207233610700230740ustar00rootroot00000000000000/* * Copyright (c) 2009 University of California, Los Angeles * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ generic module Sam3SpiP(uint8_t chip_id) { provides { interface ResourceConfigure as SubResourceConfigure; } uses { interface ResourceConfigure; interface HplSam3SpiConfig; } } implementation { async command void SubResourceConfigure.configure() { call HplSam3SpiConfig.selectChip(chip_id); call ResourceConfigure.configure(); } async command void SubResourceConfigure.unconfigure() { call ResourceConfigure.unconfigure(); } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/spi/spihardware.h000066400000000000000000000242431207233610700236440ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Serial Peripheral Interface (SPI) register definitions. * * @author Thomas Schmid */ #ifndef _SPIHARDWARE_H #define _SPIHARDWARE_H #define SAM3_HPLSPI_RESOURCE "Sam3HplSpi.Resource" #define SAM3_SPI_BUS "Sam3Spi.Bus" /** * SPI Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 621 */ typedef union { uint32_t flat; struct { uint8_t spien : 1; // spi enable uint8_t spidis : 1; // spi disable uint8_t reserved0 : 5; uint8_t swrst : 1; // spi software reset uint8_t reserved1 : 8; uint8_t reserved2 : 8; uint8_t lastxfer : 1; // last transfer uint8_t reserved3 : 7; } __attribute__((__packed__)) bits; } spi_cr_t; /** * SPI Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 622 */ typedef union { uint32_t flat; struct { uint8_t mstr : 1; // master/slave mode uint8_t ps : 1; // peripheral select uint8_t pcsdec : 1; // chip select decode uint8_t reserved0 : 1; uint8_t modfdis : 1; // mode fault detection uint8_t wdrbt : 1; // wait data ready before transfer uint8_t reserved1 : 1; uint8_t llb : 1; // local loopback enable uint8_t reserved2 : 8; uint8_t pcs : 4; // peripheral chip select uint8_t reserved3 : 4; uint8_t dlybcs : 8; // delay between chip selects } __attribute__((__packed__)) bits; } spi_mr_t; /** * SPI Receive Data Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 624 */ typedef union { uint32_t flat; struct { uint16_t rd : 16; // receive data uint8_t pcs : 4; // peripheral chip select uint8_t reserved0 : 4; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } spi_rdr_t; /** * SPI Transmit Data Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 625 */ typedef union { uint32_t flat; struct { uint16_t td : 16; // transmit data uint8_t pcs : 4; // peripheral chip select uint8_t reserved0 : 4; uint8_t lastxfer : 1; // last transfer uint8_t reserved1 : 7; } __attribute__((__packed__)) bits; } spi_tdr_t; /** * SPI Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 626 */ typedef union { uint32_t flat; struct { uint8_t rdrf : 1; // receive data register full uint8_t tdre : 1; // transmit data register empty uint8_t modf : 1; // mode fault error uint8_t ovres : 1; // overrun error status uint8_t reserved0 : 4; uint8_t nssr : 1; // nss rising uint8_t txempty : 1; // transmission registers empty uint8_t undes : 1; // underrun error status (slave only) uint8_t reserved1 : 5; uint8_t spiens : 1; // spi enable status uint8_t reserved2 : 7; uint8_t reserved3 : 8; } __attribute__((__packed__)) bits; } spi_sr_t; /** * SPI Interrupt Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 628 */ typedef union { uint32_t flat; struct { uint8_t rdrf : 1; // receive data register full interrupt enable uint8_t tdre : 1; // spi transmit data register empty interrupt enable uint8_t modf : 1; // mode fault error interrupt enable uint8_t ovres : 1; // overrun error interrupt enable uint8_t reserved0 : 4; uint8_t nssr : 1; // nss rising interrupt enable uint8_t txempty : 1; // transmission registers empty enable uint8_t undes : 1; // underrun error interrupt enable uint8_t reserved1 : 5; uint8_t reserved2 : 8; uint8_t reserved3 : 8; } __attribute__((__packed__)) bits; } spi_ier_t; /** * SPI Interrupt Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 629 */ typedef union { uint32_t flat; struct { uint8_t rdrf : 1; // receive data register full interrupt disable uint8_t tdre : 1; // spi transmit data register empty interrupt disable uint8_t modf : 1; // mode fault error interrupt disable uint8_t ovres : 1; // overrun error interrupt disable uint8_t reserved0 : 4; uint8_t nssr : 1; // nss rising interrupt disable uint8_t txempty : 1; // transmission registers empty disable uint8_t undes : 1; // underrun error interrupt disable uint8_t reserved1 : 5; uint8_t reserved2 : 8; uint8_t reserved3 : 8; } __attribute__((__packed__)) bits; } spi_idr_t; /** * SPI Interrupt Mask Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 630 */ typedef union { uint32_t flat; struct { uint8_t rdrf : 1; // receive data register full interrupt mask uint8_t tdre : 1; // spi transmit data register empty interrupt mask uint8_t modf : 1; // mode fault error interrupt mask uint8_t ovres : 1; // overrun error interrupt mask uint8_t reserved0 : 4; uint8_t nssr : 1; // nss rising interrupt mask uint8_t txempty : 1; // transmission registers empty mask uint8_t undes : 1; // underrun error interrupt mask uint8_t reserved1 : 5; uint8_t reserved2 : 8; uint8_t reserved3 : 8; } __attribute__((__packed__)) bits; } spi_imr_t; /** * SPI Chip Select Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 631 */ typedef union { uint32_t flat; struct { uint8_t cpol : 1; // clock polarity uint8_t ncpha : 1; // clock phase uint8_t csnaat : 1; // chip select not active after transfer (ignored if csaat = 1) uint8_t csaat : 1; // chip select active after transfer uint8_t bits : 4; // bits per transfer uint8_t scbr : 8; // serial clock baud rate uint8_t dlybs : 8; // delay before spck uint8_t dlybct : 8; // delay between consecutive transfers } __attribute__((__packed__)) bits; } spi_csr_t; #define SPI_CSR_BITS_8 0 #define SPI_CSR_BITS_9 1 #define SPI_CSR_BITS_10 2 #define SPI_CSR_BITS_11 3 #define SPI_CSR_BITS_12 4 #define SPI_CSR_BITS_13 5 #define SPI_CSR_BITS_14 6 #define SPI_CSR_BITS_15 7 #define SPI_CSR_BITS_16 8 /** * SPI Write Protection Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 634 */ typedef union { uint32_t flat; struct { uint8_t spiwpen : 1; // spi write protection enable uint8_t reserved0 : 7; uint32_t spiwpkey : 24; // spi write protection key password } __attribute__((__packed__)) bits; } spi_wpcr_t; #define SPI_WPCR_SPIWPKEY 0x535049 /** * SPI Write Protection Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 635 */ typedef union { uint32_t flat; struct { uint8_t spiwpvs : 3; // spi write protection violation status uint8_t reserved0 : 5; uint8_t spiwpvsrc : 8; // spi write protection violation source uint8_t reserved1 : 8; uint8_t reserved2 : 8; } __attribute__((__packed__)) bits; } spi_wpsr_t; /** * SPI Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary 9/1/09, p. 620 */ typedef struct { volatile spi_cr_t cr; // Control Register volatile spi_mr_t mr; // Mode Register volatile spi_rdr_t rdr; // Receive Data Register volatile spi_tdr_t tdr; // Transmit Data Register volatile spi_sr_t sr; // Status Register volatile spi_ier_t ier; // Interrupt Enable Register volatile spi_idr_t idr; // Interrupt Disable Register volatile spi_imr_t imr; // Interrupt Mask Register uint32_t reserved0[4]; volatile spi_csr_t csr0; // Chip Select Register 0 volatile spi_csr_t csr1; // Chip Select Register 1 volatile spi_csr_t csr2; // Chip Select Register 2 volatile spi_csr_t csr3; // Chip Select Register 3 uint32_t reserved1[41]; volatile spi_wpcr_t wpcr; // Write Protection Control Register volatile spi_wpsr_t wpsr; // Write Protection Status Register uint32_t reserved2[5]; } spi_t; #endif // _SPIHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/supc/000077500000000000000000000000001207233610700213345ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/supc/supchardware.h000066400000000000000000000233461207233610700242050ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Supply Controller register definitions. * * @author Thomas Schmid */ #ifndef SUPCHARDWARE_H #define SUPCHARDWARE_H /** * SUPC Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 291 */ typedef union { uint32_t flat; struct { uint8_t reserved0 : 2; uint8_t vroff : 1; // voltage regulator off (1: stop regularot if key correct) uint8_t xtalsel : 1; // crystal oscillator select (1: select crystal if key correct) uint8_t reserved1 : 4; uint16_t reserved2 : 16; uint8_t key : 8; // key shoulc be written to value 0xA5 } __attribute__((__packed__)) bits; } supc_cr_t; #define SUPC_CR_KEY 0xA5 /** * SUPC Supply Monitor Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 292 */ typedef union { uint32_t flat; struct { uint8_t smth : 4; // supply monitor threshold uint8_t reserved0 : 4; uint8_t smsmpl : 3; // supply monitor sampling period uint8_t reserved1 : 1; uint8_t smrsten : 1; // supply monitor reset enable uint8_t smien : 1; // supply monitor interrupt enable uint8_t reserved2 : 2; uint16_t reserved3: 16; } __attribute__((__packed__)) bits; } supc_smmr_t; #define SUPC_SMMR_SMTH_1_9V 0x0 #define SUPC_SMMR_SMTH_2_0V 0x1 #define SUPC_SMMR_SMTH_2_1V 0x2 #define SUPC_SMMR_SMTH_2_2V 0x3 #define SUPC_SMMR_SMTH_2_3V 0x4 #define SUPC_SMMR_SMTH_2_4V 0x5 #define SUPC_SMMR_SMTH_2_5V 0x6 #define SUPC_SMMR_SMTH_2_6V 0x7 #define SUPC_SMMR_SMTH_2_7V 0x8 #define SUPC_SMMR_SMTH_2_8V 0x9 #define SUPC_SMMR_SMTH_2_9V 0xA #define SUPC_SMMR_SMTH_3_0V 0xB #define SUPC_SMMR_SMTH_3_1V 0xC #define SUPC_SMMR_SMTH_3_2V 0xD #define SUPC_SMMR_SMTH_3_3V 0xE #define SUPC_SMMR_SMTH_3_4V 0xF #define SUPC_SMMR_SMSMPL_SMD 0x0 #define SUPC_SMMR_SMSMPL_CSM 0x1 #define SUPC_SMMR_SMSMPL_32SLCK 0x2 #define SUPC_SMMR_SMSMPL_256SLCK 0x3 #define SUPC_SMMR_SMSMPL_2048SLCK 0x4 /** * SUPC Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 294 */ typedef union { uint32_t flat; struct { uint16_t reserved0 : 12; uint8_t bodrsten : 1; // brownout detector reset enable uint8_t boddis : 1; // brownout detector disable uint8_t vddiordy : 1; // VDDIO ready uint8_t reserved1 : 1; uint8_t reserved2 : 4; uint8_t oscbypass : 1; // oscillator bypass uint8_t reserved3 : 3; uint8_t key : 8; // key should be written to value 0xA5 } __attribute__((__packed__)) bits; } supc_mr_t; #define SUPC_MR_KEY 0xA5 /** * SUPC Wake Up Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 295 */ typedef union { uint32_t flat; struct { uint8_t fwupen : 1; // force wake up enable uint8_t smen : 1; // supply monitor wake up enable uint8_t rtten : 1; // real time timer wake up enable uint8_t rtcen : 1; // real time clock waek up enable uint8_t reserved0 : 4; uint8_t fwupdbc : 3; // force wake up debouncer uint8_t reserved1 : 1; uint8_t wkupdbc : 3; // wake up inputs debouncer uint8_t reserved2 : 1; uint16_t reserved3 : 16; } __attribute__((__packed__)) bits; } supc_wumr_t; #define SUPC_WUMR_FWUPDBC_1SCLK 0x0 #define SUPC_WUMR_FWUPDBC_3SCLK 0x1 #define SUPC_WUMR_FWUPDBC_32SCLK 0x2 #define SUPC_WUMR_FWUPDBC_512SCLK 0x3 #define SUPC_WUMR_FWUPDBC_4096SCLK 0x4 #define SUPC_WUMR_FWUPDBC_32768SCLK 0x5 #define SUPC_WUMR_WKUPDBC_1SCLK 0x0 #define SUPC_WUMR_WKUPDBC_3SCLK 0x1 #define SUPC_WUMR_WKUPDBC_32SCLK 0x2 #define SUPC_WUMR_WKUPDBC_512SCLK 0x3 #define SUPC_WUMR_WUKPDBC_4096SCLK 0x4 #define SUPC_WUMR_WKUPDBC_32768SCLK 0x5 /** * SUPC System Controller wake up inputs Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 297 */ typedef union { uint32_t flat; struct { uint8_t wkupen0 : 1; // wake up input enable 0 uint8_t wkupen1 : 1; // wake up input enable 1 uint8_t wkupen2 : 1; // wake up input enable 2 uint8_t wkupen3 : 1; // wake up input enable 3 uint8_t wkupen4 : 1; // wake up input enable 4 uint8_t wkupen5 : 1; // wake up input enable 5 uint8_t wkupen6 : 1; // wake up input enable 6 uint8_t wkupen7 : 1; // wake up input enable 7 uint8_t wkupen8 : 1; // wake up input enable 8 uint8_t wkupen9 : 1; // wake up input enable 9 uint8_t wkupen10 : 1; // wake up input enable 10 uint8_t wkupen11 : 1; // wake up input enable 11 uint8_t wkupen12 : 1; // wake up input enable 12 uint8_t wkupen13 : 1; // wake up input enable 13 uint8_t wkupen14 : 1; // wake up input enable 14 uint8_t wkupen15 : 1; // wake up input enable 15 uint8_t wkupt0 : 1; // wake up input transition 0 uint8_t wkupt1 : 1; // wake up input transition 1 uint8_t wkupt2 : 1; // wake up input transition 2 uint8_t wkupt3 : 1; // wake up input transition 3 uint8_t wkupt4 : 1; // wake up input transition 4 uint8_t wkupt5 : 1; // wake up input transition 5 uint8_t wkupt6 : 1; // wake up input transition 6 uint8_t wkupt7 : 1; // wake up input transition 7 uint8_t wkupt8 : 1; // wake up input transition 8 uint8_t wkupt9 : 1; // wake up input transition 9 uint8_t wkupt10 : 1; // wake up input transition 10 uint8_t wkupt11 : 1; // wake up input transition 11 uint8_t wkupt12 : 1; // wake up input transition 12 uint8_t wkupt13 : 1; // wake up input transition 13 uint8_t wkupt14 : 1; // wake up input transition 14 uint8_t wkupt15 : 1; // wake up input transition 15 } __attribute__((__packed__)) bits; } supc_wuir_t; /** * SUPC Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 298 */ typedef union { uint32_t flat; struct { uint8_t fwups : 1; // fwup wake up status uint8_t wkups : 1; // wkup wake up status uint8_t smws : 1; // supply monitor detection wake up status uint8_t bodrsts : 1; // brownout detector reset status uint8_t smrsts : 1; // supply monitor reset status uint8_t sms : 1; // supply monitor status uint8_t smos : 1; // supply monitor output status uint8_t oscsel : 1; // 32-khz oscillator selection status uint8_t reserved0 : 4; uint8_t fwupis : 1; // fwup input status uint8_t reserved1 : 3; uint8_t wkupis0 : 1; // wkup input status 0 uint8_t wkupis1 : 1; // wkup input status 1 uint8_t wkupis2 : 1; // wkup input status 2 uint8_t wkupis3 : 1; // wkup input status 3 uint8_t wkupis4 : 1; // wkup input status 4 uint8_t wkupis5 : 1; // wkup input status 5 uint8_t wkupis6 : 1; // wkup input status 6 uint8_t wkupis7 : 1; // wkup input status 7 uint8_t wkupis8 : 1; // wkup input status 8 uint8_t wkupis9 : 1; // wkup input status 9 uint8_t wkupis10 : 1; // wkup input status 10 uint8_t wkupis11 : 1; // wkup input status 11 uint8_t wkupis12 : 1; // wkup input status 12 uint8_t wkupis13 : 1; // wkup input status 13 uint8_t wkupis14 : 1; // wkup input status 14 uint8_t wkupis15 : 1; // wkup input status 15 } __attribute__((__packed__)) bits; } supc_sr_t; /** * SUPC Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary, p. 290 */ typedef struct supc { volatile supc_cr_t cr; // Control Register volatile supc_smmr_t smmr; // Supply Monitor Mode Register volatile supc_mr_t mr; // Mode Register volatile supc_wumr_t wumr; // Wake Up Mode Register volatile supc_wuir_t wuir; // Wake Up Inputs Register volatile supc_sr_t sr; // Status Register } supc_t; #endif // SUPCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/000077500000000000000000000000001207233610700215025ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/Alarm32khz16C.nc000066400000000000000000000042641207233610700242220ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Alarm32khzC is the alarm for async 32khz alarms * @author Thomas Schmid * @see Please refer to TEP 102 for more information about this component and its * intended use. */ generic configuration Alarm32khz16C() { provides interface Init; provides interface Alarm; } implementation { components HplSam3TC32khzC as HplSam3TCChannel; components new HilSam3TCAlarmC(T32khz, 32) as HilSam3TCAlarm; Init = HilSam3TCAlarm; Alarm = HilSam3TCAlarm; HilSam3TCAlarm.HplSam3TCChannel -> HplSam3TCChannel; HilSam3TCAlarm.HplSam3TCCompare -> HplSam3TCChannel; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/Alarm32khz32C.nc000066400000000000000000000044451207233610700242210ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Alarm32khzC is the alarm for async 32khz alarms * @author Thomas Schmid * @see Please refer to TEP 102 for more information about this component and its * intended use. */ generic configuration Alarm32khz32C() { provides interface Init; provides interface Alarm; } implementation { #error The existing implementation that is in here was broken and doesn't work. Check it with an Oscilloscope! components HplSam3TC32khzC as HplSam3TCChannel; components new HilSam3TCAlarmC(T32khz, 32) as HilSam3TCAlarm; Init = HilSam3TCAlarm; Alarm = HilSam3TCAlarm; HilSam3TCAlarm.HplSam3TCChannel -> HplSam3TCChannel; HilSam3TCAlarm.HplSam3TCCompare -> HplSam3TCChannel; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/AlarmMilli16C.nc000066400000000000000000000041211207233610700243170ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * AlarmMilliC is the alarm for async millisecond alarms * * @author Thomas Schmid */ generic configuration AlarmMilli16C() { provides { interface Init; interface Alarm; } } implementation { components new Alarm32khz32C() as AlarmC; components CounterMilli16C as Counter; components new TransformAlarmC(TMilli,uint16_t,T32khz,uint32_t,5) as Transform; Init = AlarmC; Alarm = Transform; Transform.AlarmFrom -> AlarmC; Transform.Counter -> Counter; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/AlarmMilliC.nc000066400000000000000000000035201207233610700241520ustar00rootroot00000000000000/** * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #define UQ_ALARM_TMILLI "AlarmMilliC.Alarm" generic configuration AlarmMilliC() { provides { interface Alarm; } } implementation { components AlarmMilliP; Alarm = AlarmMilliP.AlarmMilli[unique(UQ_ALARM_TMILLI)]; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/AlarmMilliP.nc000066400000000000000000000035121207233610700241700ustar00rootroot00000000000000/** * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ configuration AlarmMilliP { provides { interface Alarm as AlarmMilli[uint8_t id]; } } implementation { components HilAlarmMilliC, MainC; MainC.SoftwareInit -> HilAlarmMilliC; AlarmMilli = HilAlarmMilliC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/AlarmTMicro16C.nc000066400000000000000000000036201207233610700244510ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #define UQ_ALARM_TMICRO16 "HilAlarmTMicro16.Alarm" generic configuration AlarmTMicro16C() { provides { interface Alarm; } } implementation { components AlarmTMicro16P; Alarm = AlarmTMicro16P.Alarm[unique(UQ_ALARM_TMICRO16)]; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/AlarmTMicro16P.nc000066400000000000000000000036001207233610700244640ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ configuration AlarmTMicro16P { provides { interface Alarm as Alarm[uint8_t id]; } } implementation { components HilAlarmTMicro16C, MainC; MainC.SoftwareInit -> HilAlarmTMicro16C; Alarm = HilAlarmTMicro16C; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/AlarmTMicro32C.nc000066400000000000000000000044541207233610700244550ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * AlarmTMicroC is the alarm for TMicro alarms * @author Thomas Schmid * @see Please refer to TEP 102 for more information about this component and its * intended use. */ generic configuration AlarmTMicro32C() { provides interface Init; provides interface Alarm; } implementation { #error The existing implementation that is in here was broken and doesn't work. Check it with an Oscilloscope! components HilSam3TCCounterTMicroC as HplSam3TCChannel; components new HilSam3TCAlarmC(TMicro, 1000) as HilSam3TCAlarm; Init = HilSam3TCAlarm; Alarm = HilSam3TCAlarm; HilSam3TCAlarm.HplSam3TCChannel -> HplSam3TCChannel; HilSam3TCAlarm.HplSam3TCCompare -> HplSam3TCChannel; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/BusyWaitMicroC.nc000066400000000000000000000040211207233610700246650ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration BusyWaitMicroC { provides interface BusyWait; } implementation { components new BusyWaitCounterC(TMicro,uint16_t) , CounterTMicro16C ; BusyWait = BusyWaitCounterC; BusyWaitCounterC.Counter -> CounterTMicro16C; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/Counter32khz16C.nc000066400000000000000000000037451207233610700246100ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Counter32khz16C provides at 16-bit counter at 32768 ticks per second. * * @author Thomas Schmid * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration Counter32khz16C { provides interface Counter; } implementation { components HilSam3TCCounter32khzC as CounterFrom; Counter = CounterFrom; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/Counter32khz32C.nc000066400000000000000000000041511207233610700245760ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Counter32khz32C provides at 32-bit counter at 32768 ticks per second. * * @author Thomas Schmid * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration Counter32khz32C { provides interface Counter; } implementation { components HilSam3TCCounter32khzC as CounterFrom; components new TransformCounterC(T32khz,uint32_t,T32khz,uint16_t,0,uint16_t) as Transform; Counter = Transform; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/Counter32khz64C.nc000066400000000000000000000041431207233610700246040ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Counter32khz32C provides at 32-bit counter at 32768 ticks per second. * * @author Thomas Schmid * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration Counter32khz64C { provides interface Counter; } implementation { components Counter32khz32C as CounterFrom; components new TransformCounterC(T32khz,uint64_t,T32khz,uint32_t,0,uint32_t) as Transform; Counter = Transform; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/CounterMilli16C.nc000066400000000000000000000042061207233610700247060ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * CounterMilli16C provides at 32-bit counter at 1024 ticks per second. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration CounterMilli16C { provides interface Counter; } implementation { components Counter32khz16C as CounterFrom; components new TransformCounterC(TMilli,uint16_t,T32khz,uint16_t,5,uint8_t) as Transform; Counter = Transform.Counter; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/CounterTMicro16C.nc000066400000000000000000000041151207233610700250340ustar00rootroot00000000000000/* * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * CounterTMicroC provides at 16-bit counter at at approximately 1us * resolution. However, to get the accurate frequency inquire the * getTimerFrequency() function. * * @author Thomas Schmid * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration CounterTMicro16C { provides { interface Counter; } } implementation { components HilSam3TCCounterTMicroC as CounterFrom; Counter = CounterFrom; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/CounterTMicro32C.nc000066400000000000000000000041541207233610700250350ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * CounterTMicro32C provides a 32-bit counter about 1M ticks per second. * * @author Thomas Schmid * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration CounterTMicro32C { provides interface Counter; } implementation { components HilSam3TCCounterTMicroC as CounterFrom; components new TransformCounterC(TMicro,uint32_t,TMicro,uint16_t,0,uint16_t) as Transform; Counter = Transform; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/CounterToLocalTime64C.nc000066400000000000000000000042751207233610700260250ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * CounterToLocalTimeC converts a 32-bit LocalTime to a Counter. * *

      See TEP102 for more details. * @param precision_tag A type indicating the precision of the LocalTime and * Counter being converted. * * @author Cory Sharp */ generic module CounterToLocalTime64C(typedef precision_tag) @safe() { provides interface LocalTime64; uses interface Counter; } implementation { async command uint64_t LocalTime64.get() { return call Counter.get(); } async event void Counter.overflow() { } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/GpioCaptureC.nc000066400000000000000000000053731207233610700243610ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui * @author Joe Polastre */ generic module GpioCaptureC() @safe() { provides { interface GpioCapture as Capture; } uses { interface HplSam3TCCapture as TCCapture; interface HplSam3GeneralIOPin as GeneralIO; } } implementation { error_t enableCapture( uint8_t mode ) { atomic { call TCCapture.disable(); call GeneralIO.disablePioControl(); call GeneralIO.selectPeripheralA(); call TCCapture.setEdge( mode ); call TCCapture.clearPendingEvent(); call TCCapture.clearOverrun(); call TCCapture.enable(); } return SUCCESS; } async command error_t Capture.captureRisingEdge() { return enableCapture( TC_CMR_ETRGEDG_RISING ); } async command error_t Capture.captureFallingEdge() { return enableCapture( TC_CMR_ETRGEDG_FALLING ); } async command void Capture.disable() { atomic { call TCCapture.disable(); } } async event void TCCapture.captured( uint16_t time ) { call TCCapture.clearPendingEvent(); call TCCapture.clearOverrun(); signal Capture.captured( time ); } async event void TCCapture.overrun() { } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HalSam3RttC.nc000066400000000000000000000037701207233610700240600ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ configuration HalSam3RttC { provides { interface Init; interface Alarm as Alarm; interface LocalTime as LocalTime; } } implementation { components HplSam3RttC, HalSam3RttP; HalSam3RttP.HplSam3Rtt -> HplSam3RttC; HalSam3RttP.RttInit -> HplSam3RttC.Init; Init = HalSam3RttP; Alarm = HalSam3RttP; LocalTime = HalSam3RttP; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HalSam3RttP.nc000066400000000000000000000075671207233610700241050ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Provides an alarm, counter, and local time with TMilli resolution using the * SAM3's RTT. * * @author Thomas Schmid */ module HalSam3RttP @safe() { provides { interface Init; interface Alarm as Alarm; interface LocalTime as LocalTime; } uses { interface HplSam3Rtt; interface Init as RttInit; } } implementation { bool running; command error_t Init.init() { running = FALSE; call RttInit.init(); // make the counter count in milliseconds. This restarts the RTT and // resets the counter. call HplSam3Rtt.setPrescaler(32); return SUCCESS; } async command void Alarm.start(uint32_t dt) { atomic running = TRUE; call Alarm.startAt(call Alarm.getNow(), dt); } async command void Alarm.stop() { atomic running = FALSE; call HplSam3Rtt.disableAlarmInterrupt(); } async command bool Alarm.isRunning() { return running; } async command void Alarm.startAt( uint32_t t0, uint32_t dt) { atomic { uint32_t now = call Alarm.getNow(); uint32_t elapsed = now-t0; if(elapsed >= dt ) { // l.et the timer expire at the next tic of the RTT call HplSam3Rtt.setAlarm(now+1); } else { uint32_t remaining = dt - elapsed; if(remaining <= 1) { call HplSam3Rtt.setAlarm(now + 1); } else { call HplSam3Rtt.setAlarm(now + remaining); } } call HplSam3Rtt.enableAlarmInterrupt(); } } async command uint32_t Alarm.getNow() { uint32_t c; c = call HplSam3Rtt.getTime(); return c; } async command uint32_t Alarm.getAlarm() { uint32_t c; c = call HplSam3Rtt.getAlarm(); return c; } async command uint32_t LocalTime.get() { return call Alarm.getNow(); } async event void HplSam3Rtt.alarmFired() { call Alarm.stop(); call HplSam3Rtt.disableAlarmInterrupt(); signal Alarm.fired(); } async event void HplSam3Rtt.incrementFired() { } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HilAlarmMilliC.nc000066400000000000000000000037441207233610700246170ustar00rootroot00000000000000/** * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ configuration HilAlarmMilliC { provides { interface Init; interface Alarm as AlarmMilli[uint8_t id]; } } implementation { components HalSam3RttC as AlarmC; components new VirtualizeAlarmC(TMilli, uint32_t, uniqueCount(UQ_ALARM_TMILLI)) as VirtAlarmsTMilli; Init = AlarmC; AlarmMilli = VirtAlarmsTMilli.Alarm; VirtAlarmsTMilli.AlarmFrom -> AlarmC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HilAlarmTMicro16C.nc000066400000000000000000000043701207233610700251110ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * */ configuration HilAlarmTMicro16C { provides { interface Init; interface Alarm as Alarm[ uint8_t num ]; } } implementation { components new VirtualizeAlarmC(TMicro, uint16_t, uniqueCount(UQ_ALARM_TMICRO16)) as VirtAlarmsTMicro16; components HilSam3TCCounterTMicroC as HplSam3TCChannel; components new HilSam3TCAlarmC(TMicro, 1000) as HilSam3TCAlarm; Init = HilSam3TCAlarm; Alarm = VirtAlarmsTMicro16.Alarm; VirtAlarmsTMicro16.AlarmFrom -> HilSam3TCAlarm; HilSam3TCAlarm.HplSam3TCChannel -> HplSam3TCChannel; HilSam3TCAlarm.HplSam3TCCompare -> HplSam3TCChannel; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HilSam3TCAlarmC.nc000066400000000000000000000070011207233610700245710ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * HilSam3TCAlarmC is a generic component that wraps the SAM3U HPL timers and * compares into a TinyOS Alarm. * * @author Thomas Schmid * @author Kevin Klues * @see Please refer to TEP 102 for more information about this component and its * intended use. */ generic module HilSam3TCAlarmC(typedef frequency_tag, uint16_t freq_divisor) @safe() { provides { interface Init; interface Alarm as Alarm; } uses { interface HplSam3TCChannel; interface HplSam3TCCompare; } } implementation { command error_t Init.init() { call HplSam3TCCompare.disable(); return SUCCESS; } async command void Alarm.start( uint16_t dt ) { call Alarm.startAt( call Alarm.getNow(), dt ); } async command void Alarm.stop() { call HplSam3TCCompare.disable(); } async event void HplSam3TCCompare.fired() { call HplSam3TCCompare.disable(); signal Alarm.fired(); } async command bool Alarm.isRunning() { return call HplSam3TCCompare.isEnabled(); } async command void Alarm.startAt( uint16_t t0, uint16_t dt ) { uint32_t freq = call HplSam3TCChannel.getTimerFrequency(); dt = (dt*freq)/(uint32_t)freq_divisor + 1; atomic { uint16_t now = call HplSam3TCChannel.get(); uint16_t elapsed = now - t0; if( elapsed >= dt ) { call HplSam3TCCompare.setEventFromNow(2); } else { uint16_t remaining = dt - elapsed; if( remaining <= 2 ) call HplSam3TCCompare.setEventFromNow(2); else call HplSam3TCCompare.setEvent( now+remaining ); } call HplSam3TCCompare.clearPendingEvent(); call HplSam3TCCompare.enable(); } } async command uint16_t Alarm.getNow() { return call HplSam3TCChannel.get(); } async command uint16_t Alarm.getAlarm() { return call HplSam3TCCompare.getEvent(); } async event void HplSam3TCChannel.overflow() { } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HilSam3TCCounter32khzC.nc000066400000000000000000000041351207233610700260430ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * HilSam3TCCounter32khC provides the standard 32khz counter for the SAM3U. * * @author Thomas Schmid * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration HilSam3TCCounter32khzC { provides interface Counter as HilSam3TCCounter32khz; } implementation { components HplSam3TCC; components new HilSam3TCCounterC(T32khz) as Counter; HilSam3TCCounter32khz = Counter; Counter.HplSam3TCChannel -> HplSam3TCC.TC0; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HilSam3TCCounterC.nc000066400000000000000000000046701207233610700251650ustar00rootroot00000000000000/* * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * HilSam3TCCounter is a generic component that wraps the SAM3U HPL timers into a * TinyOS Counter. * * @author Thomas Schmid * @see Please refer to TEP 102 for more information about this component and its * intended use. */ generic module HilSam3TCCounterC( typedef frequency_tag ) @safe() { provides interface Counter as Counter; uses interface HplSam3TCChannel; } implementation { async command uint16_t Counter.get() { return call HplSam3TCChannel.get(); } async command bool Counter.isOverflowPending() { return call HplSam3TCChannel.isOverflowPending(); } async command void Counter.clearOverflow() { call HplSam3TCChannel.clearOverflow(); } async event void HplSam3TCChannel.overflow() { signal Counter.overflow(); } default async event void Counter.overflow() {} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HilSam3TCCounterTMicroC.nc000066400000000000000000000044201207233610700262740ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * HilSam3TCCounterTMicroC provides the an approximate TMicro counter for the * SAM3U. * * @author Thomas Schmid * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration HilSam3TCCounterTMicroC { provides { interface Counter as HilSam3TCCounterTMicro; interface HplSam3TCChannel; interface HplSam3TCCompare; } } implementation { components HplSam3TCC; components new HilSam3TCCounterC(TMicro) as Counter; HilSam3TCCounterTMicro = Counter; Counter.HplSam3TCChannel -> HplSam3TCC.TCH2; HplSam3TCChannel = HplSam3TCC.TCH2; HplSam3TCCompare = HplSam3TCC.TC2CompareC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HilTimerMilliC.nc000066400000000000000000000043741207233610700246430ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid * */ #include "Timer.h" configuration HilTimerMilliC { provides { interface Init; interface Timer as TimerMilli[ uint8_t num ]; interface LocalTime; } } implementation { components new VirtualizeTimerC(TMilli,uniqueCount(UQ_TIMER_MILLI)) as VirtTimersMilli32; components new AlarmToTimerC(TMilli) as AlarmToTimerMilli32; components new AlarmMilliC() as AlarmMilli32; components HalSam3RttC; Init = HalSam3RttC; TimerMilli = VirtTimersMilli32.Timer; LocalTime = HalSam3RttC; VirtTimersMilli32.TimerFrom -> AlarmToTimerMilli32.Timer; AlarmToTimerMilli32.Alarm -> AlarmMilli32.Alarm; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HplSam3Rtt.nc000066400000000000000000000063261207233610700237740ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * HPL interface for the SAM3 Real-Time Timer. * * @author Thomas Schmid */ interface HplSam3Rtt { /** * Sets the prescaler value of the RTT and restart it. This function * disables all interrupt sources! * * @par prescaler 16-bit prescaler for the counter. The RTT is fed by a * 32.768 Hz clock. */ async command error_t setPrescaler(uint16_t prescaler); /** * Retrieves the current time of the timer. * * @return The 32-bit counter value. */ async command uint32_t getTime(); /** * Enables the alarm interrupt of the RTT. */ async command error_t enableAlarmInterrupt(); /** * Disables the alarm interrupt of the RTT. */ async command error_t disableAlarmInterrupt(); /** * Enables the incremental interrupt of the RTT. */ async command error_t enableIncrementalInterrupt(); /** * Disables the incremental interrupt of the RTT. */ async command error_t disableIncrementalInterrupt(); /** * Restart the RTT and resets the counter value. */ async command error_t restart(); /** * Set the alarm for the RTT. * * @par time The 32-bit time value at which the alarm interrupt should * happen. */ async command error_t setAlarm(uint32_t time); /** * Returns the current alarm time. */ async command uint32_t getAlarm(); /** * Event indicating that the increment interrupt fired. */ async event void incrementFired(); /** * Event indicating that the alarm interrupt fired. */ async event void alarmFired(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HplSam3RttC.nc000066400000000000000000000041741207233610700240760ustar00rootroot00000000000000/* * Copyright (c) 2009 The Regents of the University of California. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid * @author Kevin Klues */ configuration HplSam3RttC { provides { interface Init; interface HplSam3Rtt; } } implementation { components HplSam3RttP; Init = HplSam3RttP; HplSam3Rtt = HplSam3RttP; components HplNVICC; HplSam3RttP.HplNVICCntl -> HplNVICC; HplSam3RttP.NVICRTTInterrupt -> HplNVICC.RTTInterrupt; components McuSleepC; HplSam3RttP.RttInterruptWrapper -> McuSleepC; components LedsC; HplSam3RttP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HplSam3RttP.nc000066400000000000000000000113621207233610700241100ustar00rootroot00000000000000/* * Copyright (c) 2009 The Regents of the University of California. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid * @author Kevin Klues */ // Chip specific include that defines the RTT variable #include "sam3rtthardware.h" module HplSam3RttP @safe() { provides { interface Init; interface HplSam3Rtt; } uses { interface HplNVICCntl; interface HplNVICInterruptCntl as NVICRTTInterrupt; interface FunctionWrapper as RttInterruptWrapper; interface Leds; } } implementation { command error_t Init.init() { call NVICRTTInterrupt.configure(0); // now enable the IRQ call NVICRTTInterrupt.enable(); return SUCCESS; } /** * Sets the prescaler value of the RTT and restart it. This function * disables all interrupt sources! */ async command error_t HplSam3Rtt.setPrescaler(uint16_t prescaler) { rtt_mr_t mr = RTT->mr; // after changing the prescaler, we have to restart the RTT mr.bits.rtpres = prescaler; RTT->mr = mr; return call HplSam3Rtt.restart(); } async command uint32_t HplSam3Rtt.getTime() { return RTT->vr; } async command error_t HplSam3Rtt.enableAlarmInterrupt() { rtt_mr_t mr = RTT->mr; mr.bits.almien = 1;; RTT->mr = mr; return SUCCESS; } async command error_t HplSam3Rtt.disableAlarmInterrupt() { rtt_mr_t mr = RTT->mr; mr.bits.almien = 0; RTT->mr = mr; return SUCCESS; } async command error_t HplSam3Rtt.enableIncrementalInterrupt() { rtt_mr_t mr = RTT->mr; mr.bits.rttincien = 1; RTT->mr = mr; return SUCCESS; } async command error_t HplSam3Rtt.disableIncrementalInterrupt() { rtt_mr_t mr = RTT->mr; mr.bits.rttincien = 0; RTT->mr = mr; return SUCCESS; } async command error_t HplSam3Rtt.restart() { rtt_mr_t mr = RTT->mr; mr.bits.rttrst = 1; RTT->mr = mr; return SUCCESS; } async command error_t HplSam3Rtt.setAlarm(uint32_t time) { if(time > 0) { RTT->ar = time - 1; return SUCCESS; } else { return FAIL; } } async command uint32_t HplSam3Rtt.getAlarm() { return RTT->ar; } void RttIrqHandler() @C() @spontaneous() { rtt_sr_t status; call RttInterruptWrapper.preamble(); atomic { //PMC->pc.pcer.bits.tc2 = 1; // FIXME: what is this???? // clear pending interrupt call NVICRTTInterrupt.clearPending(); status = RTT->sr; if (status.bits.rttinc) { // we got an increment interrupt signal HplSam3Rtt.incrementFired(); } if (status.bits.alms) { // we got an alarm //call Leds.led2Toggle(); signal HplSam3Rtt.alarmFired(); } } call RttInterruptWrapper.postamble(); } default async event void HplSam3Rtt.incrementFired() {} default async event void HplSam3Rtt.alarmFired() {} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HplSam3TC.nc000066400000000000000000000036611207233610700235300ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ interface HplSam3TC{ command void enableTC0(); // slclk command void enableTC1(); // slclk command void enableTC2(); // used for TMicro command void disableTC0(); command void disableTC1(); command void disableTC2(); /** * Synchronizes (resets) all thre timer channels at the same time. */ command void sync(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HplSam3TC32khzC.nc000066400000000000000000000037001207233610700245070ustar00rootroot00000000000000/* * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ configuration HplSam3TC32khzC { provides interface HplSam3TCChannel; provides interface HplSam3TCCompare; } implementation { components HplSam3TC32khzMapC as Map; enum { ALARM_ID = unique("Sam3TC32khzMapC") }; HplSam3TCChannel = Map.HplSam3TCChannel[ ALARM_ID ]; HplSam3TCCompare = Map.HplSam3TCCompare[ ALARM_ID ]; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HplSam3TC32khzMapC.nc000066400000000000000000000044271207233610700251540ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * HplSam3TC32khzMapC presents as paramaterized interfaces all of the 32khz * channels on the SAM3U that are available for compile time allocation * by "new Alarm32khz16C()", "new AlarmMilli32C()", and so on. * * Platforms based on the SAM3U are encouraged to copy in and override this * file, presenting only the hardware timers that are available for allocation * on that platform. * * @author Thomas Schmid */ configuration HplSam3TC32khzMapC { provides interface HplSam3TCChannel[ uint8_t id ]; provides interface HplSam3TCCompare[ uint8_t id ]; } implementation { components HplSam3TCC; HplSam3TCChannel[0] = HplSam3TCC.TC0; HplSam3TCCompare[0] = HplSam3TCC.TC0CompareC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HplSam3TCCapture.nc000066400000000000000000000067071207233610700250600ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * SAM3 TC capture interface. * * @author Thomas Schmid */ interface HplSam3TCCapture { /** * Enable the capture event interrupt. */ async command void enable(); /** * Disable the capture event interrupt. */ async command void disable(); /** * Reads the value of the last capture event in RA */ async command uint16_t getEventRA(); /** * Reads the value of the last capture event in RB */ async command uint16_t getEventRB(); /** * Clear any pending event. */ async command void clearPendingEvent(); /** * Set the edge that the capture should occur * * @param cm Capture Mode for edge capture. * enums exist for: * TC_CMR_ETRGEDG_NONE is no capture. * TC_CMR_ETRGEDG_RISING is rising edge capture. * TC_CMR_ETRGEDG_FALLING is a falling edge capture. * TC_CMR_ETRGEDG_EACH captures on both rising and falling edges. */ async command void setEdge(uint8_t cm); /** * Select the external trigger source. Allowed values: * TC_CMR_ABETRG_TIOA * TC_CMR_ABETRG_TIOB */ async command void setExternalTrigger(uint8_t cm); /** * Set external trigger edge. */ async command void setExternalTriggerEdge(uint8_t cm); /** * Determine if a capture load overrun is pending. * * @return TRUE if the capture register has was loaded twice since last read */ async command bool isOverrunPending(); /** * Clear the capture overrun flag for when multiple captures occur */ async command void clearOverrun(); /** * Signalled when an event is captured. * * @param time The time of the capture event */ async event void captured(uint16_t time); /** * Signalled when an overrun occures. */ async event void overrun(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HplSam3TCChannel.nc000066400000000000000000000062421207233610700250170ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * SAM3U TC Channel interface. * * @author Thomas Schmid */ interface HplSam3TCChannel { async command uint16_t get(); async command bool isOverflowPending(); async command void clearOverflow(); async event void overflow(); /** * FIXME: this currently only selects between wave mode or non-wave mode. * This should be extended to all the different posibilities of modes! * * allowed arguments: * TC_CMR_WAVE: selects wave mode. Allows compare on A, B, and C or wave * generation * TC_CMR_CAPTURE: selects capture mode (disables wave mode!). Allows * capture on A, B, and compare on C. (DEFAULT) */ async command void setMode(uint8_t mode); async command uint8_t getMode(); async command void enableEvents(); async command void disableEvents(); async command void enableClock(); async command void disableClock(); /** * Allowed clock sources: * TC_CMR_CLK_TC1: selects MCK/2 * TC_CMR_CLK_TC2: selects MCK/8 * TC_CMR_CLK_TC3: selects MCK/32 * TC_CMR_CLK_TC4: selects MCK/128 * TC_CMR_CLK_SLOW: selects SLCK. if MCK=SLCK, then this clock will be * modified by PRES and MDIV! * TC_CMR_CLK_XC0: selects external clock input 0 * TC_CMR_CLK_XC1: selects external clock input 1 * TC_CMR_CLK_XC2: selects external clock input 2 */ async command void setClockSource(uint8_t clockSource); /** * Returns the current timer frequency in kHz. */ async command uint32_t getTimerFrequency(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HplSam3TCChannelP.nc000066400000000000000000000336521207233610700251440ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Provides a bare bone interface to the SAM3 TC. * * @author Thomas Schmid */ #include "sam3tchardware.h" generic module HplSam3TCChannelP(uint32_t tc_channel_base) @safe() { provides { interface HplSam3TCChannel; interface HplSam3TCCapture as Capture; interface HplSam3TCCompare as CompareA; interface HplSam3TCCompare as CompareB; interface HplSam3TCCompare as CompareC; } uses { interface HplSam3Clock as ClockConfig; interface HplSam3TCEvent as TimerEvent; interface HplNVICInterruptCntl as NVICTCInterrupt; interface HplSam3PeripheralClockCntl as TCPClockCntl; } } implementation { // the CMR registers have slightly different meanings in the two modes! volatile tc_channel_capture_t *CH_CAPTURE = (volatile tc_channel_capture_t*)tc_channel_base; volatile tc_channel_wave_t *CH_WAVE = (volatile tc_channel_wave_t*)tc_channel_base; // interrupt status tc_sr_t sr; /****************************************** * General TC Channel functions ******************************************/ async command uint16_t HplSam3TCChannel.get() { return CH_CAPTURE->cv.bits.cv; } async command bool HplSam3TCChannel.isOverflowPending() { sr.flat |= CH_CAPTURE->sr.flat; return (sr.bits.covfs && 1); } async command void HplSam3TCChannel.clearOverflow() { // read the sr register to clear it sr.flat |= CH_CAPTURE->sr.flat; // assure that the overlof is cleared sr.bits.covfs = 0; } /** * FIXME: this currently only selects between wave mode or non-wave mode. * This should be extended to all the different posibilities of modes! * * allowed arguments: * TC_CMR_WAVE: selects wave mode. Allows compare on A, B, and C or wave * generation * TC_CMR_CAPTURE: selects capture mode (disables wave mode!). Allows * capture on A, B, and compare on C. (DEFAULT) */ async command void HplSam3TCChannel.setMode(uint8_t mode) { switch(mode) { case TC_CMR_WAVE: { tc_cmr_wave_t cmr = CH_WAVE->cmr; cmr.bits.wave = (mode & 0x01); CH_WAVE->cmr = cmr; } case TC_CMR_CAPTURE: { tc_cmr_capture_t cmr = CH_CAPTURE->cmr; cmr.bits.wave = (mode & 0x01); CH_CAPTURE->cmr = cmr; } } } async command uint8_t HplSam3TCChannel.getMode() { // the wave field is the same in capture and wave mode! return CH_CAPTURE->cmr.bits.wave; } /** * This enables the events for this channel and the peripheral clock! */ async command void HplSam3TCChannel.enableEvents() { tc_ier_t ier; tc_ccr_t ccr; ier.flat = 0; ccr.flat = 0; // enable the peripheral clock to this channel call TCPClockCntl.enable(); call NVICTCInterrupt.configure(0); // now enable the IRQ call NVICTCInterrupt.enable(); // by default, we enable at least overflows ier.bits.covfs = 1; CH_CAPTURE->ier = ier; // enable the clock ccr.bits.clken = 1; // start the clock! ccr.bits.swtrg = 1; CH_CAPTURE->ccr = ccr; } /** * This enables the peripheral clock for this channel */ async command void HplSam3TCChannel.enableClock() { // enable the peripheral clock to this channel call TCPClockCntl.enable(); } /** * This disables the events for this channel and the peripheral clock! */ async command void HplSam3TCChannel.disableEvents() { tc_idr_t idr; idr.flat = 0; call NVICTCInterrupt.disable(); call TCPClockCntl.disable(); // disable overruns idr.bits.covfs = 1; CH_CAPTURE->idr = idr; } /** * This disables the peripheral clock for this channel */ async command void HplSam3TCChannel.disableClock() { // disable the peripheral clock to this channel call TCPClockCntl.disable(); } /** * Allowed clock sources: * TC_CMR_CLK_TC1: selects MCK/2 * TC_CMR_CLK_TC2: selects MCK/8 * TC_CMR_CLK_TC3: selects MCK/32 * TC_CMR_CLK_TC4: selects MCK/128 * TC_CMR_CLK_SLOW: selects SLCK. if MCK=SLCK, then this clock will be * modified by PRES and MDIV! * TC_CMR_CLK_XC0: selects external clock input 0 * TC_CMR_CLK_XC1: selects external clock input 1 * TC_CMR_CLK_XC2: selects external clock input 2 */ async command void HplSam3TCChannel.setClockSource(uint8_t clockSource) { // the tcclks is the same in capture and wave! tc_cmr_capture_t cmr = CH_CAPTURE->cmr; cmr.bits.tcclks = clockSource; CH_CAPTURE->cmr = cmr; } async event void TimerEvent.fired() { atomic{ sr.flat |= CH_CAPTURE->sr.flat; // combine the current state for everyone to; if(sr.bits.covfs){ signal HplSam3TCChannel.overflow(); sr.bits.covfs = 0; } if(sr.bits.lovrs){ // only signal if the corresponding capture is enabled if(CH_CAPTURE->imr.bits.ldras) signal Capture.overrun(); if(CH_CAPTURE->imr.bits.ldrbs) signal Capture.overrun(); sr.bits.lovrs = 0; } if(sr.bits.cpas){ signal CompareA.fired(); sr.bits.cpas = 0; } if(sr.bits.cpbs){ signal CompareB.fired(); sr.bits.cpbs = 0; } if(sr.bits.cpcs){ signal CompareC.fired(); sr.bits.cpcs = 0; } if(sr.bits.ldras){ signal Capture.captured(call Capture.getEventRA()); sr.bits.ldras = 0; } if(sr.bits.ldrbs){ signal Capture.captured(call Capture.getEventRB()); sr.bits.ldrbs = 0; } } } async command uint32_t HplSam3TCChannel.getTimerFrequency() { uint32_t mck; if(CH_CAPTURE->cmr.bits.tcclks == TC_CMR_CLK_SLOW) return 32; mck = call ClockConfig.getMainClockSpeed(); return mck >> ((CH_CAPTURE->cmr.bits.tcclks* 2) + 1); } async event void ClockConfig.mainClockChanged() { // in the best case, we would now inform the user! } default async event void HplSam3TCChannel.overflow(){ } /****************************************** * Capture ******************************************/ async command void Capture.enable() { tc_ier_t ier; ier.bits.ldras = 1; ier.bits.ldrbs = 1; ier.bits.lovrs = 1; CH_CAPTURE->ier = ier; } async command void Capture.disable() { tc_idr_t idr; // disable interrupt plus overrun idr.bits.ldras = 1; idr.bits.ldrbs = 1; idr.bits.lovrs = 1; CH_CAPTURE->idr = idr; } async command uint16_t Capture.getEventRA() { return CH_CAPTURE->ra.bits.ra; } async command uint16_t Capture.getEventRB() { return CH_CAPTURE->rb.bits.rb; } async command void Capture.clearPendingEvent() { sr.flat |= CH_CAPTURE->sr.flat; sr.bits.ldras = 0; sr.bits.ldrbs = 0; } async command void Capture.setEdge(uint8_t cm) { tc_cmr_capture_t cmr = CH_CAPTURE->cmr; cmr.bits.ldra = (cm & 0x3); cmr.bits.ldrb = (cm & 0x3); CH_CAPTURE->cmr = cmr; } async command void Capture.setExternalTriggerEdge(uint8_t cm) { tc_cmr_capture_t cmr = CH_CAPTURE->cmr; cmr.bits.etrgedg = (cm & 0x3); CH_CAPTURE->cmr = cmr; } async command void Capture.setExternalTrigger(uint8_t cm ) { tc_cmr_capture_t cmr = CH_CAPTURE->cmr; cmr.bits.abetrg = (cm & 0x1); CH_CAPTURE->cmr = cmr; } async command bool Capture.isOverrunPending() { sr.flat |= CH_CAPTURE->sr.flat; return (sr.bits.lovrs & 0x01); } async command void Capture.clearOverrun() { sr.flat |= CH_CAPTURE->sr.flat; sr.bits.lovrs = 0; } default async event void Capture.overrun() { } default async event void Capture.captured(uint16_t time) { } /****************************************** * Compare A ******************************************/ async command void CompareA.enable() { tc_ier_t ier = CH_WAVE->ier; ier.bits.cpas = 1; CH_WAVE->ier = ier; } async command void CompareA.disable() { tc_idr_t idr = CH_WAVE->idr; idr.bits.cpas = 1; CH_WAVE->idr = idr; } async command bool CompareA.isEnabled() { return (CH_WAVE->imr.bits.cpas & 0x01); } async command void CompareA.clearPendingEvent() { sr.flat |= CH_WAVE->sr.flat; sr.bits.cpas = 0; } async command uint16_t CompareA.getEvent() { return CH_WAVE->ra.bits.ra; } async command void CompareA.setEvent( uint16_t time ) { tc_ra_t ra = CH_WAVE->ra; ra.bits.ra = time; CH_WAVE->ra = ra; } async command void CompareA.setEventFromPrev( uint16_t delta ) { tc_ra_t ra = CH_WAVE->ra; ra.bits.ra += delta; CH_WAVE->ra = ra; } async command void CompareA.setEventFromNow( uint16_t delta ) { tc_ra_t ra = CH_WAVE->ra; ra.bits.ra = CH_WAVE->cv.bits.cv + delta; CH_WAVE->ra = ra; } default async event void CompareA.fired() { } /****************************************** * Compare B ******************************************/ async command void CompareB.enable() { tc_ier_t ier = CH_WAVE->ier; ier.bits.cpbs = 1; CH_WAVE->ier = ier; } async command void CompareB.disable() { tc_idr_t idr = CH_WAVE->idr; idr.bits.cpbs = 1; CH_WAVE->idr = idr; } async command bool CompareB.isEnabled() { return (CH_WAVE->imr.bits.cpbs & 0x01); } async command void CompareB.clearPendingEvent() { sr.flat |= CH_WAVE->sr.flat; sr.bits.cpbs = 0; } async command uint16_t CompareB.getEvent() { return CH_WAVE->rb.bits.rb; } async command void CompareB.setEvent( uint16_t time ) { tc_rb_t rb = CH_WAVE->rb; rb.bits.rb = time; CH_WAVE->rb = rb; } async command void CompareB.setEventFromPrev( uint16_t delta ) { tc_rb_t rb = CH_WAVE->rb; rb.bits.rb += delta; CH_WAVE->rb = rb; } async command void CompareB.setEventFromNow( uint16_t delta ) { tc_rb_t rb = CH_WAVE->rb; rb.bits.rb = CH_WAVE->cv.bits.cv + delta; CH_WAVE->rb = rb; } default async event void CompareB.fired() { } /****************************************** * Compare C ******************************************/ async command void CompareC.enable() { tc_ier_t ier = CH_WAVE->ier; ier.bits.cpcs = 1; CH_WAVE->ier = ier; } async command void CompareC.disable() { tc_idr_t idr = CH_WAVE->idr; idr.bits.cpcs = 1; CH_WAVE->idr = idr; } async command bool CompareC.isEnabled() { return (CH_WAVE->imr.bits.cpcs & 0x01); } async command void CompareC.clearPendingEvent() { sr.flat |= CH_WAVE->sr.flat; sr.bits.cpcs = 0; } async command uint16_t CompareC.getEvent() { return CH_WAVE->rc.bits.rc; } async command void CompareC.setEvent( uint16_t time ) { tc_rc_t rc = CH_WAVE->rc; rc.bits.rc = time; CH_WAVE->rc = rc; } async command void CompareC.setEventFromPrev( uint16_t delta ) { tc_rc_t rc = CH_WAVE->rc; rc.bits.rc += delta; CH_WAVE->rc = rc; } async command void CompareC.setEventFromNow( uint16_t delta ) { tc_rc_t rc = CH_WAVE->rc; rc.bits.rc = CH_WAVE->cv.bits.cv + delta; CH_WAVE->rc = rc; } default async event void CompareC.fired() { } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HplSam3TCCompare.nc000066400000000000000000000040661207233610700250370ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * SAM3 TC compare interface. * * @author Thomas Schmid */ interface HplSam3TCCompare { async command void enable(); async command void disable(); async command bool isEnabled(); async command void clearPendingEvent(); async command uint16_t getEvent(); async command void setEvent( uint16_t time ); async command void setEventFromPrev( uint16_t delta ); async command void setEventFromNow( uint16_t delta ); async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HplSam3TCEvent.nc000066400000000000000000000033271207233610700245310ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * SAM3 TC general event interface. * * @author Thomas Schmid */ interface HplSam3TCEvent { async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/HplSam3TCP.nc000066400000000000000000000107051207233610700236450ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Provides the functionality of the SAM3U TC. It enables and disables the * whole unit and initializes the default configuration. * * @author Thomas Schmid */ #include "sam3tchardware.h" generic module HplSam3TCP(uint32_t tc_base) @safe() { provides { interface Init; interface HplSam3TC as TC; } uses { interface HplSam3TCChannel as TC0; interface HplSam3TCChannel as TC1; interface HplSam3TCChannel as TC2; interface HplSam3Clock as ClockConfig; } } implementation { volatile tc_t *TC_P = (volatile tc_t*)tc_base; command error_t Init.init() { uint32_t mck; uint8_t clockSource; call TC0.setMode(TC_CMR_CAPTURE); call TC1.setMode(TC_CMR_CAPTURE); call TC2.setMode(TC_CMR_CAPTURE); // check the speed of the master clock mck = call ClockConfig.getMainClockSpeed(); // in kHz // convert to MHz to find the right divider mck = mck / 1000; if(mck >= 128) clockSource = TC_CMR_CLK_TC4; else if (mck >= 32) clockSource = TC_CMR_CLK_TC3; else if (mck >= 8) clockSource = TC_CMR_CLK_TC2; else if (mck >= 2) clockSource = TC_CMR_CLK_TC1; else clockSource = TC_CMR_CLK_SLOW; call TC0.setClockSource(clockSource); call TC1.setClockSource(clockSource); call TC2.setClockSource(clockSource); call TC2.enableEvents(); return SUCCESS; } command void TC.enableTC0(){ call TC0.setMode(TC_CMR_CAPTURE); call TC0.setClockSource(TC_CMR_CLK_SLOW); call TC0.enableEvents(); } command void TC.enableTC1(){ call TC1.setMode(TC_CMR_CAPTURE); call TC1.setClockSource(TC_CMR_CLK_SLOW); call TC1.enableEvents(); } command void TC.enableTC2(){ uint32_t mck; call TC2.setMode(TC_CMR_CAPTURE); // check the speed of the master clock mck = call ClockConfig.getMainClockSpeed(); // in kHz // convert to MHz to find the right divider mck = mck / 1000; if(mck >= 128) call TC2.setClockSource(TC_CMR_CLK_TC4); else if (mck >= 32) call TC2.setClockSource(TC_CMR_CLK_TC3); else if (mck >= 8) call TC2.setClockSource(TC_CMR_CLK_TC2); else if (mck >= 2) call TC2.setClockSource(TC_CMR_CLK_TC1); else call TC2.setClockSource(TC_CMR_CLK_SLOW); call TC2.enableEvents(); } command void TC.disableTC0(){ call TC0.disableEvents(); } command void TC.disableTC1(){ call TC1.disableEvents(); } command void TC.disableTC2(){ call TC2.disableEvents(); } command void TC.sync(){ tc_bcr_t bcr = TC_P->bcr; bcr.bits.sync = 1; TC_P->bcr = bcr; } async event void ClockConfig.mainClockChanged() {}; async event void TC0.overflow() {}; async event void TC1.overflow() {}; async event void TC2.overflow() {}; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/LocalTime64.nc000066400000000000000000000047341207233610700240570ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * A LocalTime interface counts time in some units. If you need to detect * time overflow, you should use a component offering the Counter * interface. * *

      The LocalTime interface is parameterised by its "precision" * (milliseconds, microseconds, etc), identified by a type. This prevents, * e.g., unintentionally mixing components expecting milliseconds with * those expecting microseconds as those interfaces have a different type. * *

      See TEP102 for more details. * * @param precision_tag A type indicating the precision of this Counter. * * @author Cory Sharp */ interface LocalTime64 { /** * Return current time. Time starts counting at boot - some time sources * may stop counting while the processor is in low-power mode. * * @return Current time. */ async command uint64_t get(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/LocalTimeMicroC.nc000066400000000000000000000036231207233610700247760ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai * Author: Thomas Schmid (adapted to sam3) */ #include configuration LocalTimeMicroC { provides interface LocalTime; } implementation { components CounterTMicro32C; components new CounterToLocalTimeC(TMicro); LocalTime = CounterToLocalTimeC; CounterToLocalTimeC.Counter -> CounterTMicro32C; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/rtthardware.h000066400000000000000000000054251207233610700242100ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Real-Time Timer register definitions. * * @author Thomas Schmid */ #ifndef RTTHARDWARE_H #define RTTHARDWARE_H typedef union { uint32_t flat; struct { uint16_t rtpres : 16; // RTT prescaler uint8_t almien : 1; // alarm interrupt enable uint8_t rttincien : 1; // RTT increment interrupt enable uint8_t rttrst : 1; // RTT restart uint8_t reserved1 : 5; uint8_t reserved0 : 8; } bits; } rtt_mr_t; /* Note: Never read directly the status register since it gets reset after * each read. Thus, you migh tmiss an interrupt! */ typedef union { uint32_t flat; struct { uint8_t alms : 1; // RT alarm status uint8_t rttinc : 1; // RTT increment status uint8_t reserved2 : 6; uint8_t reserved1 : 8; uint16_t reserved0 : 16; } bits; } rtt_sr_t; // Real Time Timer Register definition typedef struct rtt { volatile rtt_mr_t mr; // Real Time Mode Register volatile uint32_t ar; // Real Time Alarm Register volatile uint32_t vr; // Real Time Value Register volatile rtt_sr_t sr; // Real Time Status Register } rtt_t; #endif // RTTHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/timer/tchardware.h000066400000000000000000000325501207233610700240040ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Timer Counter register definitions. * * @author Thomas Schmid */ #ifndef TCHARDWARE_H #define TCHARDWARE_H /** * TC Block Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 828 */ typedef union { uint32_t flat; struct { uint32_t sync : 1; // synchro command uint32_t reserved0 : 7; uint32_t reserved1 : 8; uint32_t reserved2 : 8; } __attribute__((packed)) bits; } tc_bcr_t; /** * TC Block Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 829 */ typedef union { uint32_t flat; struct { uint32_t tc0xc0s : 2; // external clock signal 0 selection uint32_t tc1xc1s : 2; // external clock signal 1 selection uint32_t tc2xc2s : 2; // external clock signal 2 selection uint32_t reserved0 : 2; uint32_t qden : 1; // quadrature decoder enabled uint32_t posen : 1; // position enabled uint32_t speeden : 1; // speed enabled uint32_t qdtrans : 1; // quadrature decoding transparent uint32_t edgpha : 1; // edge on pha count mode uint32_t inva : 1; // invert pha uint32_t invb : 1; // invert phb uint32_t invidx : 1; // swap pha and phb uint32_t swap : 1; // inverted index uint32_t idxphb : 1; // index pin is phb pin uint32_t reserved1 : 1; uint32_t filter : 1; // filter uint32_t maxfilt : 6; // maximum filter uint32_t reserved2 : 6; } __attribute__((packed)) bits; } tc_bmr_t; /** * TC Channel Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 831 */ typedef union { uint32_t flat; struct { uint32_t clken : 1; // counter clock enable command uint32_t clkdis : 1; // counter clock disable command uint32_t swtrg : 1; // software trigger command uint32_t reserved0 : 5; uint32_t reserved1 : 8; uint32_t reserved2 : 16; } __attribute__((packed)) bits; } tc_ccr_t; /** * TC QDEC Interrupt Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 832 */ typedef union { uint32_t flat; struct { uint32_t idx : 1; // index uint32_t dirchg : 1; // direction change uint32_t qerr : 1; // quadrature error uint32_t reserved0 : 5; uint32_t reserved1 : 8; uint32_t reserved2 : 16; } __attribute__((packed)) bits; } tc_qier_t; /** * TC QDEC Interrupt Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 833 */ typedef union { uint32_t flat; struct { uint32_t idx : 1; // index uint32_t dirchg : 1; // direction change uint32_t qerr : 1; // quadrature error uint32_t reserved0 : 5; uint32_t reserved1 : 8; uint32_t reserved2 : 16; } __attribute__((packed)) bits; } tc_qidr_t; /** * TC QDEC Interrupt Mask Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 834 */ typedef union { uint32_t flat; struct { uint32_t idx : 1; // index uint32_t dirchg : 1; // direction change uint32_t qerr : 1; // quadrature error uint32_t reserved0 : 5; uint32_t reserved1 : 8; uint32_t reserved2 : 16; } __attribute__((packed)) bits; } tc_qimr_t; /** * TC QDEC Interrupt Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 835 */ typedef union { uint32_t flat; struct { uint32_t idx : 1; // index uint32_t dirchg : 1; // direction change uint32_t qerr : 1; // quadrature error uint32_t reserved0 : 5; uint32_t dir : 1; // direction uint32_t reserved1 : 7; uint32_t reserved2 : 16; } __attribute__((packed)) bits; } tc_qisr_t; /** * TC Channel Mode Register Capture Mode, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 836 */ typedef union { uint32_t flat; struct { uint32_t tcclks : 3; // clock selection uint32_t clki : 1; // clock invert uint32_t burst : 2; // burst signal selection uint32_t ldbstop : 1; // counter clock stopped with rb loading uint32_t ldbdis : 1; // counter clock disable with rb loading uint32_t etrgedg : 2; // external trigger edge selection uint32_t abetrg : 1; // tioa or tiob external trigger selection uint32_t reserved0 : 3; uint32_t cpctrg : 1; // rc compare trigger enable uint32_t wave : 1; // wave uint32_t ldra : 2; // ra loading selection uint32_t ldrb : 2; // rb loading selection uint32_t reserved1 : 4; uint32_t reserved2 : 8; } __attribute__((packed)) bits; } tc_cmr_capture_t; #define TC_CMR_ETRGEDG_NONE 0 #define TC_CMR_ETRGEDG_RISING 1 #define TC_CMR_ETRGEDG_FALLING 2 #define TC_CMR_ETRGEDG_EACH 3 #define TC_CMR_CAPTURE 0 #define TC_CMR_WAVE 1 #define TC_CMR_CLK_TC1 0 #define TC_CMR_CLK_TC2 1 #define TC_CMR_CLK_TC3 2 #define TC_CMR_CLK_TC4 3 #define TC_CMR_CLK_SLOW 4 #define TC_CMR_CLK_XC0 5 #define TC_CMR_CLK_XC1 6 #define TC_CMR_CLK_XC2 7 #define TC_CMR_ABETRG_TIOA 0 #define TC_CMR_ABETRG_TIOB 1 /** * TC Channel Mode Register Waveform Mode, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 838 */ typedef union { uint32_t flat; struct { uint32_t tcclks : 3; // clock selection uint32_t clki : 1; // clock invert uint32_t burst : 2; // burst signal selection uint32_t cpcstop : 1; // counter clock stopped with rc compare uint32_t cpcdis : 1; // counter clock disable with rc compare uint32_t eevtedg : 2; // external event edge selection uint32_t eevt : 2; // external event selection uint32_t enetrg : 1; // external event trigger enable uint32_t wavsel : 2; // waveform selection uint32_t wave : 1; // wave uint32_t acpa : 2; // ra compare effect on tioa uint32_t acpc : 2; // rc compare effect on tioa uint32_t aeevt : 2; // external event effect on tioa uint32_t aswtrg : 2; // software trigger effect on tioa uint32_t bcpb : 2; // rb compare effect on tiob uint32_t bcpc : 2; // rc compare effect on tiob uint32_t beevt : 2; // external event effect on tiob uint32_t bswtrg : 2; // software trigger effect on tiob } __attribute__((packed)) bits; } tc_cmr_wave_t; /** * TC Counter Value Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 842 */ typedef union { uint32_t flat; struct { uint32_t cv : 16; // counter value uint32_t reserved : 16; } __attribute__((packed)) bits; } tc_cv_t; /** * TC Register A, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 842 */ typedef union { uint32_t flat; struct { uint32_t ra : 16; // register a uint32_t reserved : 16; } __attribute__((packed)) bits; } tc_ra_t; /** * TC Register B, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 843 */ typedef union { uint32_t flat; struct { uint32_t rb : 16; // register b uint32_t reserved : 16; } __attribute__((packed)) bits; } tc_rb_t; /** * TC Register C, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 843 */ typedef union { uint32_t flat; struct { uint32_t rc : 16; // register c uint32_t reserved : 16; } __attribute__((packed)) bits; } tc_rc_t; /** * TC Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 844 */ typedef union { uint32_t flat; struct { uint32_t covfs : 1; // counter overflow status uint32_t lovrs : 1; // load overrun status uint32_t cpas : 1; // ra compare status uint32_t cpbs : 1; // rb compare status uint32_t cpcs : 1; // rc compare status uint32_t ldras : 1; // ra loading status uint32_t ldrbs : 1; // rb loading status uint32_t etrgs : 1; // external trigger status uint32_t reserved0 : 8; uint32_t clksta : 1; // clock enable status uint32_t mtioa : 1; // tioa mirror uint32_t mtiob : 1; // tiob mirror uint32_t reserved1 : 5; uint32_t reserved2 : 8; } __attribute__((packed)) bits; } tc_sr_t; /** * TC Interrupt Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 846 */ typedef union { uint32_t flat; struct { uint32_t covfs : 1; // counter overflow uint32_t lovrs : 1; // load overrun uint32_t cpas : 1; // ra compare uint32_t cpbs : 1; // rb compare uint32_t cpcs : 1; // rc compare uint32_t ldras : 1; // ra loading uint32_t ldrbs : 1; // rb loading uint32_t etrgs : 1; // external trigger uint32_t reserved0 : 8; uint32_t reserved1 :16; } __attribute__((packed)) bits; } tc_ier_t; /** * TC Interrupt Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 847 */ typedef union { uint32_t flat; struct { uint32_t covfs : 1; // counter overflow uint32_t lovrs : 1; // load overrun uint32_t cpas : 1; // ra compare uint32_t cpbs : 1; // rb compare uint32_t cpcs : 1; // rc compare uint32_t ldras : 1; // ra loading uint32_t ldrbs : 1; // rb loading uint32_t etrgs : 1; // external trigger uint32_t reserved0 : 8; uint32_t reserved1 :16; } __attribute__((packed)) bits; } tc_idr_t; /** * TC Interrupt Mask Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. 848 */ typedef union { uint32_t flat; struct { uint32_t covfs : 1; // counter overflow uint32_t lovrs : 1; // load overrun uint32_t cpas : 1; // ra compare uint32_t cpbs : 1; // rb compare uint32_t cpcs : 1; // rc compare uint32_t ldras : 1; // ra loading uint32_t ldrbs : 1; // rb loading uint32_t etrgs : 1; // external trigger uint32_t reserved0 : 8; uint32_t reserved1 :16; } __attribute__((packed)) bits; } tc_imr_t; /** * Channel definition capture mode */ typedef struct { volatile tc_ccr_t ccr; volatile tc_cmr_capture_t cmr; uint32_t reserved[2]; volatile tc_cv_t cv; volatile tc_ra_t ra; volatile tc_rb_t rb; volatile tc_rc_t rc; volatile tc_sr_t sr; volatile tc_ier_t ier; volatile tc_idr_t idr; volatile tc_imr_t imr; } tc_channel_capture_t; /** * Channel definition wave mode */ typedef struct { volatile tc_ccr_t ccr; volatile tc_cmr_wave_t cmr; uint32_t reserved[2]; volatile tc_cv_t cv; volatile tc_ra_t ra; volatile tc_rb_t rb; volatile tc_rc_t rc; volatile tc_sr_t sr; volatile tc_ier_t ier; volatile tc_idr_t idr; volatile tc_imr_t imr; } tc_channel_wave_t; #endif //TCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/000077500000000000000000000000001207233610700206265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/AT91SAM3U4.h000066400000000000000000021211551207233610700223210ustar00rootroot00000000000000// ---------------------------------------------------------------------------- // ATMEL Microcontroller Software Support - ROUSSET - // ---------------------------------------------------------------------------- // Copyright (c) 2008, Atmel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // - Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the // distribution. // - Neither the name of the copyright holders nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS // OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED // AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY // WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // ---------------------------------------------------------------------------- // File Name : AT91SAM3U4.h // Object : AT91SAM3U4 definitions // Generated : AT91 SW Application Group 06/26/2009 (09:26:22) // // CVS Reference : /AT91SAM3U4.pl/1.38/Thu Jun 4 08:57:57 2009// // CVS Reference : /SYS_SAM3U4.pl/1.4/Fri Oct 17 13:27:57 2008// // CVS Reference : /HMATRIX2_SAM3U4.pl/1.5/Fri Jun 26 07:25:14 2009// // CVS Reference : /PMC_SAM3U4.pl/1.7/Fri Oct 17 13:27:54 2008// // CVS Reference : /EBI_SAM9260.pl/1.1/Fri Sep 30 12:12:14 2005// // CVS Reference : /EFC2_SAM3U4.pl/1.3/Mon Mar 2 10:12:06 2009// // CVS Reference : /HSDRAMC1_6100A.pl/1.2/Mon Aug 9 10:52:25 2004// // CVS Reference : /HSMC4_xxxx.pl/1.9/Fri Oct 17 13:27:56 2008// // CVS Reference : /HECC_6143A.pl/1.1/Wed Feb 9 17:16:57 2005// // CVS Reference : /CORTEX_M3_NVIC.pl/1.8/Fri Jun 19 12:00:55 2009// // CVS Reference : /CORTEX_M3_MPU.pl/1.3/Fri Oct 17 13:27:48 2008// // CVS Reference : /CORTEX_M3.pl/1.1/Mon Sep 15 15:22:06 2008// // CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 09:02:11 2005// // CVS Reference : /DBGU_SAM3U4.pl/1.3/Tue May 5 11:28:09 2009// // CVS Reference : /PIO3_xxxx.pl/1.6/Mon Mar 9 10:43:37 2009// // CVS Reference : /RSTC_6098A.pl/1.4/Fri Oct 17 13:27:55 2008// // CVS Reference : /SHDWC_6122A.pl/1.3/Wed Oct 6 14:16:58 2004// // CVS Reference : /SUPC by datasheet // CVS Reference : /RTTC_6081A.pl/1.2/Thu Nov 4 13:57:22 2004// // CVS Reference : /PITC_6079A.pl/1.2/Thu Nov 4 13:56:22 2004// // CVS Reference : /WDTC_6080A.pl/1.3/Thu Nov 4 13:58:52 2004// // CVS Reference : /TC_6082A.pl/1.8/Fri Oct 17 13:27:58 2008// // CVS Reference : /MCI_6101F.pl/1.3/Fri Jan 23 09:15:32 2009// // CVS Reference : /TWI_6061B.pl/1.3/Fri Oct 17 13:27:59 2008// // CVS Reference : /US_6089J.pl/1.3/Fri Oct 17 13:27:59 2008// // CVS Reference : /SSC_SAM3U4.pl/1.1/Thu Jun 4 09:02:35 2009// // CVS Reference : /SPI2.pl/1.5/Thu Jun 4 08:58:10 2009// // CVS Reference : /PWM_6343B_V400.pl/1.3/Fri Oct 17 13:27:54 2008// // CVS Reference : /DMAC by datasheet // CVS Reference : /UDPHS_SAM9_7ept6dma4iso.pl/1.4/Tue Jun 24 13:05:14 2008// // CVS Reference : /ADC_SAM3UE.pl/1.4/Fri Feb 20 12:19:18 2009// // CVS Reference : /ADC12B by datasheet // CVS Reference : /RTC_1245D.pl/1.3/Fri Sep 17 14:01:31 2004// // ---------------------------------------------------------------------------- #ifndef AT91SAM3U4_H #define AT91SAM3U4_H #ifndef __ASSEMBLY__ typedef volatile unsigned int AT91_REG;// Hardware register definition #define AT91_CAST(a) (a) #else #define AT91_CAST(a) #endif // ***************************************************************************** // SOFTWARE API DEFINITION FOR System Peripherals // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_SYS { AT91_REG HSMC4_CFG; // Configuration Register AT91_REG HSMC4_CTRL; // Control Register AT91_REG HSMC4_SR; // Status Register AT91_REG HSMC4_IER; // Interrupt Enable Register AT91_REG HSMC4_IDR; // Interrupt Disable Register AT91_REG HSMC4_IMR; // Interrupt Mask Register AT91_REG HSMC4_ADDR; // Address Cycle Zero Register AT91_REG HSMC4_BANK; // Bank Register AT91_REG HSMC4_ECCCR; // ECC reset register AT91_REG HSMC4_ECCCMD; // ECC Page size register AT91_REG HSMC4_ECCSR1; // ECC Status register 1 AT91_REG HSMC4_ECCPR0; // ECC Parity register 0 AT91_REG HSMC4_ECCPR1; // ECC Parity register 1 AT91_REG HSMC4_ECCSR2; // ECC Status register 2 AT91_REG HSMC4_ECCPR2; // ECC Parity register 2 AT91_REG HSMC4_ECCPR3; // ECC Parity register 3 AT91_REG HSMC4_ECCPR4; // ECC Parity register 4 AT91_REG HSMC4_ECCPR5; // ECC Parity register 5 AT91_REG HSMC4_ECCPR6; // ECC Parity register 6 AT91_REG HSMC4_ECCPR7; // ECC Parity register 7 AT91_REG HSMC4_ECCPR8; // ECC Parity register 8 AT91_REG HSMC4_ECCPR9; // ECC Parity register 9 AT91_REG HSMC4_ECCPR10; // ECC Parity register 10 AT91_REG HSMC4_ECCPR11; // ECC Parity register 11 AT91_REG HSMC4_ECCPR12; // ECC Parity register 12 AT91_REG HSMC4_ECCPR13; // ECC Parity register 13 AT91_REG HSMC4_ECCPR14; // ECC Parity register 14 AT91_REG HSMC4_Eccpr15; // ECC Parity register 15 AT91_REG Reserved0[40]; // AT91_REG HSMC4_OCMS; // OCMS MODE register AT91_REG HSMC4_KEY1; // KEY1 Register AT91_REG HSMC4_KEY2; // KEY2 Register AT91_REG Reserved1[50]; // AT91_REG HSMC4_WPCR; // Write Protection Control register AT91_REG HSMC4_WPSR; // Write Protection Status Register AT91_REG HSMC4_ADDRSIZE; // Write Protection Status Register AT91_REG HSMC4_IPNAME1; // Write Protection Status Register AT91_REG HSMC4_IPNAME2; // Write Protection Status Register AT91_REG HSMC4_FEATURES; // Write Protection Status Register AT91_REG HSMC4_VER; // HSMC4 Version Register AT91_REG HMATRIX_MCFG0; // Master Configuration Register 0 : ARM I and D AT91_REG HMATRIX_MCFG1; // Master Configuration Register 1 : ARM S AT91_REG HMATRIX_MCFG2; // Master Configuration Register 2 AT91_REG HMATRIX_MCFG3; // Master Configuration Register 3 AT91_REG HMATRIX_MCFG4; // Master Configuration Register 4 AT91_REG HMATRIX_MCFG5; // Master Configuration Register 5 AT91_REG HMATRIX_MCFG6; // Master Configuration Register 6 AT91_REG HMATRIX_MCFG7; // Master Configuration Register 7 AT91_REG Reserved2[8]; // AT91_REG HMATRIX_SCFG0; // Slave Configuration Register 0 AT91_REG HMATRIX_SCFG1; // Slave Configuration Register 1 AT91_REG HMATRIX_SCFG2; // Slave Configuration Register 2 AT91_REG HMATRIX_SCFG3; // Slave Configuration Register 3 AT91_REG HMATRIX_SCFG4; // Slave Configuration Register 4 AT91_REG HMATRIX_SCFG5; // Slave Configuration Register 5 AT91_REG HMATRIX_SCFG6; // Slave Configuration Register 6 AT91_REG HMATRIX_SCFG7; // Slave Configuration Register 5 AT91_REG HMATRIX_SCFG8; // Slave Configuration Register 8 AT91_REG HMATRIX_SCFG9; // Slave Configuration Register 9 AT91_REG Reserved3[42]; // AT91_REG HMATRIX_SFR0 ; // Special Function Register 0 AT91_REG HMATRIX_SFR1 ; // Special Function Register 1 AT91_REG HMATRIX_SFR2 ; // Special Function Register 2 AT91_REG HMATRIX_SFR3 ; // Special Function Register 3 AT91_REG HMATRIX_SFR4 ; // Special Function Register 4 AT91_REG HMATRIX_SFR5 ; // Special Function Register 5 AT91_REG HMATRIX_SFR6 ; // Special Function Register 6 AT91_REG HMATRIX_SFR7 ; // Special Function Register 7 AT91_REG HMATRIX_SFR8 ; // Special Function Register 8 AT91_REG HMATRIX_SFR9 ; // Special Function Register 9 AT91_REG HMATRIX_SFR10; // Special Function Register 10 AT91_REG HMATRIX_SFR11; // Special Function Register 11 AT91_REG HMATRIX_SFR12; // Special Function Register 12 AT91_REG HMATRIX_SFR13; // Special Function Register 13 AT91_REG HMATRIX_SFR14; // Special Function Register 14 AT91_REG HMATRIX_SFR15; // Special Function Register 15 AT91_REG Reserved4[39]; // AT91_REG HMATRIX_ADDRSIZE; // HMATRIX2 ADDRSIZE REGISTER AT91_REG HMATRIX_IPNAME1; // HMATRIX2 IPNAME1 REGISTER AT91_REG HMATRIX_IPNAME2; // HMATRIX2 IPNAME2 REGISTER AT91_REG HMATRIX_FEATURES; // HMATRIX2 FEATURES REGISTER AT91_REG HMATRIX_VER; // HMATRIX2 VERSION REGISTER AT91_REG PMC_SCER; // System Clock Enable Register AT91_REG PMC_SCDR; // System Clock Disable Register AT91_REG PMC_SCSR; // System Clock Status Register AT91_REG Reserved5[1]; // AT91_REG PMC_PCER; // Peripheral Clock Enable Register AT91_REG PMC_PCDR; // Peripheral Clock Disable Register AT91_REG PMC_PCSR; // Peripheral Clock Status Register AT91_REG PMC_UCKR; // UTMI Clock Configuration Register AT91_REG PMC_MOR; // Main Oscillator Register AT91_REG PMC_MCFR; // Main Clock Frequency Register AT91_REG PMC_PLLAR; // PLL Register AT91_REG Reserved6[1]; // AT91_REG PMC_MCKR; // Master Clock Register AT91_REG Reserved7[3]; // AT91_REG PMC_PCKR[8]; // Programmable Clock Register AT91_REG PMC_IER; // Interrupt Enable Register AT91_REG PMC_IDR; // Interrupt Disable Register AT91_REG PMC_SR; // Status Register AT91_REG PMC_IMR; // Interrupt Mask Register AT91_REG PMC_FSMR; // Fast Startup Mode Register AT91_REG PMC_FSPR; // Fast Startup Polarity Register AT91_REG PMC_FOCR; // Fault Output Clear Register AT91_REG Reserved8[28]; // AT91_REG PMC_ADDRSIZE; // PMC ADDRSIZE REGISTER AT91_REG PMC_IPNAME1; // PMC IPNAME1 REGISTER AT91_REG PMC_IPNAME2; // PMC IPNAME2 REGISTER AT91_REG PMC_FEATURES; // PMC FEATURES REGISTER AT91_REG PMC_VER; // APMC VERSION REGISTER AT91_REG Reserved9[64]; // AT91_REG DBGU_CR; // Control Register AT91_REG DBGU_MR; // Mode Register AT91_REG DBGU_IER; // Interrupt Enable Register AT91_REG DBGU_IDR; // Interrupt Disable Register AT91_REG DBGU_IMR; // Interrupt Mask Register AT91_REG DBGU_CSR; // Channel Status Register AT91_REG DBGU_RHR; // Receiver Holding Register AT91_REG DBGU_THR; // Transmitter Holding Register AT91_REG DBGU_BRGR; // Baud Rate Generator Register AT91_REG Reserved10[9]; // AT91_REG DBGU_FNTR; // Force NTRST Register AT91_REG Reserved11[40]; // AT91_REG DBGU_ADDRSIZE; // DBGU ADDRSIZE REGISTER AT91_REG DBGU_IPNAME1; // DBGU IPNAME1 REGISTER AT91_REG DBGU_IPNAME2; // DBGU IPNAME2 REGISTER AT91_REG DBGU_FEATURES; // DBGU FEATURES REGISTER AT91_REG DBGU_VER; // DBGU VERSION REGISTER AT91_REG DBGU_RPR; // Receive Pointer Register AT91_REG DBGU_RCR; // Receive Counter Register AT91_REG DBGU_TPR; // Transmit Pointer Register AT91_REG DBGU_TCR; // Transmit Counter Register AT91_REG DBGU_RNPR; // Receive Next Pointer Register AT91_REG DBGU_RNCR; // Receive Next Counter Register AT91_REG DBGU_TNPR; // Transmit Next Pointer Register AT91_REG DBGU_TNCR; // Transmit Next Counter Register AT91_REG DBGU_PTCR; // PDC Transfer Control Register AT91_REG DBGU_PTSR; // PDC Transfer Status Register AT91_REG Reserved12[6]; // AT91_REG DBGU_CIDR; // Chip ID Register AT91_REG DBGU_EXID; // Chip ID Extension Register AT91_REG Reserved13[46]; // AT91_REG EFC0_FMR; // EFC Flash Mode Register AT91_REG EFC0_FCR; // EFC Flash Command Register AT91_REG EFC0_FSR; // EFC Flash Status Register AT91_REG EFC0_FRR; // EFC Flash Result Register AT91_REG Reserved14[1]; // AT91_REG EFC0_FVR; // EFC Flash Version Register AT91_REG Reserved15[122]; // AT91_REG EFC1_FMR; // EFC Flash Mode Register AT91_REG EFC1_FCR; // EFC Flash Command Register AT91_REG EFC1_FSR; // EFC Flash Status Register AT91_REG EFC1_FRR; // EFC Flash Result Register AT91_REG Reserved16[1]; // AT91_REG EFC1_FVR; // EFC Flash Version Register AT91_REG Reserved17[122]; // AT91_REG PIOA_PER; // PIO Enable Register AT91_REG PIOA_PDR; // PIO Disable Register AT91_REG PIOA_PSR; // PIO Status Register AT91_REG Reserved18[1]; // AT91_REG PIOA_OER; // Output Enable Register AT91_REG PIOA_ODR; // Output Disable Registerr AT91_REG PIOA_OSR; // Output Status Register AT91_REG Reserved19[1]; // AT91_REG PIOA_IFER; // Input Filter Enable Register AT91_REG PIOA_IFDR; // Input Filter Disable Register AT91_REG PIOA_IFSR; // Input Filter Status Register AT91_REG Reserved20[1]; // AT91_REG PIOA_SODR; // Set Output Data Register AT91_REG PIOA_CODR; // Clear Output Data Register AT91_REG PIOA_ODSR; // Output Data Status Register AT91_REG PIOA_PDSR; // Pin Data Status Register AT91_REG PIOA_IER; // Interrupt Enable Register AT91_REG PIOA_IDR; // Interrupt Disable Register AT91_REG PIOA_IMR; // Interrupt Mask Register AT91_REG PIOA_ISR; // Interrupt Status Register AT91_REG PIOA_MDER; // Multi-driver Enable Register AT91_REG PIOA_MDDR; // Multi-driver Disable Register AT91_REG PIOA_MDSR; // Multi-driver Status Register AT91_REG Reserved21[1]; // AT91_REG PIOA_PPUDR; // Pull-up Disable Register AT91_REG PIOA_PPUER; // Pull-up Enable Register AT91_REG PIOA_PPUSR; // Pull-up Status Register AT91_REG Reserved22[1]; // AT91_REG PIOA_ABSR; // Peripheral AB Select Register AT91_REG Reserved23[3]; // AT91_REG PIOA_SCIFSR; // System Clock Glitch Input Filter Select Register AT91_REG PIOA_DIFSR; // Debouncing Input Filter Select Register AT91_REG PIOA_IFDGSR; // Glitch or Debouncing Input Filter Clock Selection Status Register AT91_REG PIOA_SCDR; // Slow Clock Divider Debouncing Register AT91_REG Reserved24[4]; // AT91_REG PIOA_OWER; // Output Write Enable Register AT91_REG PIOA_OWDR; // Output Write Disable Register AT91_REG PIOA_OWSR; // Output Write Status Register AT91_REG Reserved25[1]; // AT91_REG PIOA_AIMER; // Additional Interrupt Modes Enable Register AT91_REG PIOA_AIMDR; // Additional Interrupt Modes Disables Register AT91_REG PIOA_AIMMR; // Additional Interrupt Modes Mask Register AT91_REG Reserved26[1]; // AT91_REG PIOA_ESR; // Edge Select Register AT91_REG PIOA_LSR; // Level Select Register AT91_REG PIOA_ELSR; // Edge/Level Status Register AT91_REG Reserved27[1]; // AT91_REG PIOA_FELLSR; // Falling Edge/Low Level Select Register AT91_REG PIOA_REHLSR; // Rising Edge/ High Level Select Register AT91_REG PIOA_FRLHSR; // Fall/Rise - Low/High Status Register AT91_REG Reserved28[1]; // AT91_REG PIOA_LOCKSR; // Lock Status Register AT91_REG Reserved29[6]; // AT91_REG PIOA_VER; // PIO VERSION REGISTER AT91_REG Reserved30[8]; // AT91_REG PIOA_KER; // Keypad Controller Enable Register AT91_REG PIOA_KRCR; // Keypad Controller Row Column Register AT91_REG PIOA_KDR; // Keypad Controller Debouncing Register AT91_REG Reserved31[1]; // AT91_REG PIOA_KIER; // Keypad Controller Interrupt Enable Register AT91_REG PIOA_KIDR; // Keypad Controller Interrupt Disable Register AT91_REG PIOA_KIMR; // Keypad Controller Interrupt Mask Register AT91_REG PIOA_KSR; // Keypad Controller Status Register AT91_REG PIOA_KKPR; // Keypad Controller Key Press Register AT91_REG PIOA_KKRR; // Keypad Controller Key Release Register AT91_REG Reserved32[46]; // AT91_REG PIOB_PER; // PIO Enable Register AT91_REG PIOB_PDR; // PIO Disable Register AT91_REG PIOB_PSR; // PIO Status Register AT91_REG Reserved33[1]; // AT91_REG PIOB_OER; // Output Enable Register AT91_REG PIOB_ODR; // Output Disable Registerr AT91_REG PIOB_OSR; // Output Status Register AT91_REG Reserved34[1]; // AT91_REG PIOB_IFER; // Input Filter Enable Register AT91_REG PIOB_IFDR; // Input Filter Disable Register AT91_REG PIOB_IFSR; // Input Filter Status Register AT91_REG Reserved35[1]; // AT91_REG PIOB_SODR; // Set Output Data Register AT91_REG PIOB_CODR; // Clear Output Data Register AT91_REG PIOB_ODSR; // Output Data Status Register AT91_REG PIOB_PDSR; // Pin Data Status Register AT91_REG PIOB_IER; // Interrupt Enable Register AT91_REG PIOB_IDR; // Interrupt Disable Register AT91_REG PIOB_IMR; // Interrupt Mask Register AT91_REG PIOB_ISR; // Interrupt Status Register AT91_REG PIOB_MDER; // Multi-driver Enable Register AT91_REG PIOB_MDDR; // Multi-driver Disable Register AT91_REG PIOB_MDSR; // Multi-driver Status Register AT91_REG Reserved36[1]; // AT91_REG PIOB_PPUDR; // Pull-up Disable Register AT91_REG PIOB_PPUER; // Pull-up Enable Register AT91_REG PIOB_PPUSR; // Pull-up Status Register AT91_REG Reserved37[1]; // AT91_REG PIOB_ABSR; // Peripheral AB Select Register AT91_REG Reserved38[3]; // AT91_REG PIOB_SCIFSR; // System Clock Glitch Input Filter Select Register AT91_REG PIOB_DIFSR; // Debouncing Input Filter Select Register AT91_REG PIOB_IFDGSR; // Glitch or Debouncing Input Filter Clock Selection Status Register AT91_REG PIOB_SCDR; // Slow Clock Divider Debouncing Register AT91_REG Reserved39[4]; // AT91_REG PIOB_OWER; // Output Write Enable Register AT91_REG PIOB_OWDR; // Output Write Disable Register AT91_REG PIOB_OWSR; // Output Write Status Register AT91_REG Reserved40[1]; // AT91_REG PIOB_AIMER; // Additional Interrupt Modes Enable Register AT91_REG PIOB_AIMDR; // Additional Interrupt Modes Disables Register AT91_REG PIOB_AIMMR; // Additional Interrupt Modes Mask Register AT91_REG Reserved41[1]; // AT91_REG PIOB_ESR; // Edge Select Register AT91_REG PIOB_LSR; // Level Select Register AT91_REG PIOB_ELSR; // Edge/Level Status Register AT91_REG Reserved42[1]; // AT91_REG PIOB_FELLSR; // Falling Edge/Low Level Select Register AT91_REG PIOB_REHLSR; // Rising Edge/ High Level Select Register AT91_REG PIOB_FRLHSR; // Fall/Rise - Low/High Status Register AT91_REG Reserved43[1]; // AT91_REG PIOB_LOCKSR; // Lock Status Register AT91_REG Reserved44[6]; // AT91_REG PIOB_VER; // PIO VERSION REGISTER AT91_REG Reserved45[8]; // AT91_REG PIOB_KER; // Keypad Controller Enable Register AT91_REG PIOB_KRCR; // Keypad Controller Row Column Register AT91_REG PIOB_KDR; // Keypad Controller Debouncing Register AT91_REG Reserved46[1]; // AT91_REG PIOB_KIER; // Keypad Controller Interrupt Enable Register AT91_REG PIOB_KIDR; // Keypad Controller Interrupt Disable Register AT91_REG PIOB_KIMR; // Keypad Controller Interrupt Mask Register AT91_REG PIOB_KSR; // Keypad Controller Status Register AT91_REG PIOB_KKPR; // Keypad Controller Key Press Register AT91_REG PIOB_KKRR; // Keypad Controller Key Release Register AT91_REG Reserved47[46]; // AT91_REG PIOC_PER; // PIO Enable Register AT91_REG PIOC_PDR; // PIO Disable Register AT91_REG PIOC_PSR; // PIO Status Register AT91_REG Reserved48[1]; // AT91_REG PIOC_OER; // Output Enable Register AT91_REG PIOC_ODR; // Output Disable Registerr AT91_REG PIOC_OSR; // Output Status Register AT91_REG Reserved49[1]; // AT91_REG PIOC_IFER; // Input Filter Enable Register AT91_REG PIOC_IFDR; // Input Filter Disable Register AT91_REG PIOC_IFSR; // Input Filter Status Register AT91_REG Reserved50[1]; // AT91_REG PIOC_SODR; // Set Output Data Register AT91_REG PIOC_CODR; // Clear Output Data Register AT91_REG PIOC_ODSR; // Output Data Status Register AT91_REG PIOC_PDSR; // Pin Data Status Register AT91_REG PIOC_IER; // Interrupt Enable Register AT91_REG PIOC_IDR; // Interrupt Disable Register AT91_REG PIOC_IMR; // Interrupt Mask Register AT91_REG PIOC_ISR; // Interrupt Status Register AT91_REG PIOC_MDER; // Multi-driver Enable Register AT91_REG PIOC_MDDR; // Multi-driver Disable Register AT91_REG PIOC_MDSR; // Multi-driver Status Register AT91_REG Reserved51[1]; // AT91_REG PIOC_PPUDR; // Pull-up Disable Register AT91_REG PIOC_PPUER; // Pull-up Enable Register AT91_REG PIOC_PPUSR; // Pull-up Status Register AT91_REG Reserved52[1]; // AT91_REG PIOC_ABSR; // Peripheral AB Select Register AT91_REG Reserved53[3]; // AT91_REG PIOC_SCIFSR; // System Clock Glitch Input Filter Select Register AT91_REG PIOC_DIFSR; // Debouncing Input Filter Select Register AT91_REG PIOC_IFDGSR; // Glitch or Debouncing Input Filter Clock Selection Status Register AT91_REG PIOC_SCDR; // Slow Clock Divider Debouncing Register AT91_REG Reserved54[4]; // AT91_REG PIOC_OWER; // Output Write Enable Register AT91_REG PIOC_OWDR; // Output Write Disable Register AT91_REG PIOC_OWSR; // Output Write Status Register AT91_REG Reserved55[1]; // AT91_REG PIOC_AIMER; // Additional Interrupt Modes Enable Register AT91_REG PIOC_AIMDR; // Additional Interrupt Modes Disables Register AT91_REG PIOC_AIMMR; // Additional Interrupt Modes Mask Register AT91_REG Reserved56[1]; // AT91_REG PIOC_ESR; // Edge Select Register AT91_REG PIOC_LSR; // Level Select Register AT91_REG PIOC_ELSR; // Edge/Level Status Register AT91_REG Reserved57[1]; // AT91_REG PIOC_FELLSR; // Falling Edge/Low Level Select Register AT91_REG PIOC_REHLSR; // Rising Edge/ High Level Select Register AT91_REG PIOC_FRLHSR; // Fall/Rise - Low/High Status Register AT91_REG Reserved58[1]; // AT91_REG PIOC_LOCKSR; // Lock Status Register AT91_REG Reserved59[6]; // AT91_REG PIOC_VER; // PIO VERSION REGISTER AT91_REG Reserved60[8]; // AT91_REG PIOC_KER; // Keypad Controller Enable Register AT91_REG PIOC_KRCR; // Keypad Controller Row Column Register AT91_REG PIOC_KDR; // Keypad Controller Debouncing Register AT91_REG Reserved61[1]; // AT91_REG PIOC_KIER; // Keypad Controller Interrupt Enable Register AT91_REG PIOC_KIDR; // Keypad Controller Interrupt Disable Register AT91_REG PIOC_KIMR; // Keypad Controller Interrupt Mask Register AT91_REG PIOC_KSR; // Keypad Controller Status Register AT91_REG PIOC_KKPR; // Keypad Controller Key Press Register AT91_REG PIOC_KKRR; // Keypad Controller Key Release Register AT91_REG Reserved62[46]; // AT91_REG RSTC_RCR; // Reset Control Register AT91_REG RSTC_RSR; // Reset Status Register AT91_REG RSTC_RMR; // Reset Mode Register AT91_REG Reserved63[1]; // AT91_REG SUPC_CR; // Supply Controller Control Register AT91_REG SUPC_SMMR; // Supply Controller Supply Monitor Mode Register AT91_REG SUPC_MR; // Supply Controller Mode Register AT91_REG SUPC_WUMR; // Supply Controller Wake Up Mode Register AT91_REG SUPC_WUIR; // Supply Controller Wake Up Inputs Register AT91_REG SUPC_SR; // Supply Controller Status Register AT91_REG Reserved64[2]; // AT91_REG RTTC_RTMR; // Real-time Mode Register AT91_REG RTTC_RTAR; // Real-time Alarm Register AT91_REG RTTC_RTVR; // Real-time Value Register AT91_REG RTTC_RTSR; // Real-time Status Register AT91_REG Reserved65[4]; // AT91_REG WDTC_WDCR; // Watchdog Control Register AT91_REG WDTC_WDMR; // Watchdog Mode Register AT91_REG WDTC_WDSR; // Watchdog Status Register AT91_REG Reserved66[1]; // AT91_REG RTC_CR; // Control Register AT91_REG RTC_MR; // Mode Register AT91_REG RTC_TIMR; // Time Register AT91_REG RTC_CALR; // Calendar Register AT91_REG RTC_TIMALR; // Time Alarm Register AT91_REG RTC_CALALR; // Calendar Alarm Register AT91_REG RTC_SR; // Status Register AT91_REG RTC_SCCR; // Status Clear Command Register AT91_REG RTC_IER; // Interrupt Enable Register AT91_REG RTC_IDR; // Interrupt Disable Register AT91_REG RTC_IMR; // Interrupt Mask Register AT91_REG RTC_VER; // Valid Entry Register AT91_REG SYS_GPBR[8]; // General Purpose Register AT91_REG Reserved67[19]; // AT91_REG RSTC_VER; // Version Register } AT91S_SYS, *AT91PS_SYS; #else #define GPBR (AT91_CAST(AT91_REG *) 0x00001290) // (GPBR) General Purpose Register #endif // -------- GPBR : (SYS Offset: 0x1290) GPBR General Purpose Register -------- #define AT91C_GPBR_GPRV (0x0 << 0) // (SYS) General Purpose Register Value // ***************************************************************************** // SOFTWARE API DEFINITION FOR HSMC4 Chip Select interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_HSMC4_CS { AT91_REG HSMC4_SETUP; // Setup Register AT91_REG HSMC4_PULSE; // Pulse Register AT91_REG HSMC4_CYCLE; // Cycle Register AT91_REG HSMC4_TIMINGS; // Timmings Register AT91_REG HSMC4_MODE; // Mode Register } AT91S_HSMC4_CS, *AT91PS_HSMC4_CS; #else #define HSMC4_SETUP (AT91_CAST(AT91_REG *) 0x00000000) // (HSMC4_SETUP) Setup Register #define HSMC4_PULSE (AT91_CAST(AT91_REG *) 0x00000004) // (HSMC4_PULSE) Pulse Register #define HSMC4_CYCLE (AT91_CAST(AT91_REG *) 0x00000008) // (HSMC4_CYCLE) Cycle Register #define HSMC4_TIMINGS (AT91_CAST(AT91_REG *) 0x0000000C) // (HSMC4_TIMINGS) Timmings Register #define HSMC4_MODE (AT91_CAST(AT91_REG *) 0x00000010) // (HSMC4_MODE) Mode Register #endif // -------- HSMC4_SETUP : (HSMC4_CS Offset: 0x0) HSMC4 SETUP -------- #define AT91C_HSMC4_NWE_SETUP (0x3F << 0) // (HSMC4_CS) NWE Setup length #define AT91C_HSMC4_NCS_WR_SETUP (0x3F << 8) // (HSMC4_CS) NCS Setup length in Write access #define AT91C_HSMC4_NRD_SETUP (0x3F << 16) // (HSMC4_CS) NRD Setup length #define AT91C_HSMC4_NCS_RD_SETUP (0x3F << 24) // (HSMC4_CS) NCS Setup legnth in Read access // -------- HSMC4_PULSE : (HSMC4_CS Offset: 0x4) HSMC4 PULSE -------- #define AT91C_HSMC4_NWE_PULSE (0x3F << 0) // (HSMC4_CS) NWE Pulse Length #define AT91C_HSMC4_NCS_WR_PULSE (0x3F << 8) // (HSMC4_CS) NCS Pulse length in WRITE access #define AT91C_HSMC4_NRD_PULSE (0x3F << 16) // (HSMC4_CS) NRD Pulse length #define AT91C_HSMC4_NCS_RD_PULSE (0x3F << 24) // (HSMC4_CS) NCS Pulse length in READ access // -------- HSMC4_CYCLE : (HSMC4_CS Offset: 0x8) HSMC4 CYCLE -------- #define AT91C_HSMC4_NWE_CYCLE (0x1FF << 0) // (HSMC4_CS) Total Write Cycle Length #define AT91C_HSMC4_NRD_CYCLE (0x1FF << 16) // (HSMC4_CS) Total Read Cycle Length // -------- HSMC4_TIMINGS : (HSMC4_CS Offset: 0xc) HSMC4 TIMINGS -------- #define AT91C_HSMC4_TCLR (0xF << 0) // (HSMC4_CS) CLE to REN low delay #define AT91C_HSMC4_TADL (0xF << 4) // (HSMC4_CS) ALE to data start #define AT91C_HSMC4_TAR (0xF << 8) // (HSMC4_CS) ALE to REN low delay #define AT91C_HSMC4_OCMSEN (0x1 << 12) // (HSMC4_CS) Off Chip Memory Scrambling Enable #define AT91C_HSMC4_TRR (0xF << 16) // (HSMC4_CS) Ready to REN low delay #define AT91C_HSMC4_TWB (0xF << 24) // (HSMC4_CS) WEN high to REN to busy #define AT91C_HSMC4_RBNSEL (0x7 << 28) // (HSMC4_CS) Ready/Busy Line Selection #define AT91C_HSMC4_NFSEL (0x1 << 31) // (HSMC4_CS) Nand Flash Selection // -------- HSMC4_MODE : (HSMC4_CS Offset: 0x10) HSMC4 MODE -------- #define AT91C_HSMC4_READ_MODE (0x1 << 0) // (HSMC4_CS) Read Mode #define AT91C_HSMC4_WRITE_MODE (0x1 << 1) // (HSMC4_CS) Write Mode #define AT91C_HSMC4_EXNW_MODE (0x3 << 4) // (HSMC4_CS) NWAIT Mode #define AT91C_HSMC4_EXNW_MODE_NWAIT_DISABLE (0x0 << 4) // (HSMC4_CS) External NWAIT disabled. #define AT91C_HSMC4_EXNW_MODE_NWAIT_ENABLE_FROZEN (0x2 << 4) // (HSMC4_CS) External NWAIT enabled in frozen mode. #define AT91C_HSMC4_EXNW_MODE_NWAIT_ENABLE_READY (0x3 << 4) // (HSMC4_CS) External NWAIT enabled in ready mode. #define AT91C_HSMC4_BAT (0x1 << 8) // (HSMC4_CS) Byte Access Type #define AT91C_HSMC4_BAT_BYTE_SELECT (0x0 << 8) // (HSMC4_CS) Write controled by ncs, nbs0, nbs1, nbs2, nbs3. Read controled by ncs, nrd, nbs0, nbs1, nbs2, nbs3. #define AT91C_HSMC4_BAT_BYTE_WRITE (0x1 << 8) // (HSMC4_CS) Write controled by ncs, nwe0, nwe1, nwe2, nwe3. Read controled by ncs and nrd. #define AT91C_HSMC4_DBW (0x3 << 12) // (HSMC4_CS) Data Bus Width #define AT91C_HSMC4_DBW_WIDTH_EIGTH_BITS (0x0 << 12) // (HSMC4_CS) 8 bits. #define AT91C_HSMC4_DBW_WIDTH_SIXTEEN_BITS (0x1 << 12) // (HSMC4_CS) 16 bits. #define AT91C_HSMC4_DBW_WIDTH_THIRTY_TWO_BITS (0x2 << 12) // (HSMC4_CS) 32 bits. #define AT91C_HSMC4_TDF_CYCLES (0xF << 16) // (HSMC4_CS) Data Float Time. #define AT91C_HSMC4_TDF_MODE (0x1 << 20) // (HSMC4_CS) TDF Enabled. #define AT91C_HSMC4_PMEN (0x1 << 24) // (HSMC4_CS) Page Mode Enabled. #define AT91C_HSMC4_PS (0x3 << 28) // (HSMC4_CS) Page Size #define AT91C_HSMC4_PS_SIZE_FOUR_BYTES (0x0 << 28) // (HSMC4_CS) 4 bytes. #define AT91C_HSMC4_PS_SIZE_EIGHT_BYTES (0x1 << 28) // (HSMC4_CS) 8 bytes. #define AT91C_HSMC4_PS_SIZE_SIXTEEN_BYTES (0x2 << 28) // (HSMC4_CS) 16 bytes. #define AT91C_HSMC4_PS_SIZE_THIRTY_TWO_BYTES (0x3 << 28) // (HSMC4_CS) 32 bytes. // ***************************************************************************** // SOFTWARE API DEFINITION FOR AHB Static Memory Controller 4 Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_HSMC4 { AT91_REG HSMC4_CFG; // Configuration Register AT91_REG HSMC4_CTRL; // Control Register AT91_REG HSMC4_SR; // Status Register AT91_REG HSMC4_IER; // Interrupt Enable Register AT91_REG HSMC4_IDR; // Interrupt Disable Register AT91_REG HSMC4_IMR; // Interrupt Mask Register AT91_REG HSMC4_ADDR; // Address Cycle Zero Register AT91_REG HSMC4_BANK; // Bank Register AT91_REG HSMC4_ECCCR; // ECC reset register AT91_REG HSMC4_ECCCMD; // ECC Page size register AT91_REG HSMC4_ECCSR1; // ECC Status register 1 AT91_REG HSMC4_ECCPR0; // ECC Parity register 0 AT91_REG HSMC4_ECCPR1; // ECC Parity register 1 AT91_REG HSMC4_ECCSR2; // ECC Status register 2 AT91_REG HSMC4_ECCPR2; // ECC Parity register 2 AT91_REG HSMC4_ECCPR3; // ECC Parity register 3 AT91_REG HSMC4_ECCPR4; // ECC Parity register 4 AT91_REG HSMC4_ECCPR5; // ECC Parity register 5 AT91_REG HSMC4_ECCPR6; // ECC Parity register 6 AT91_REG HSMC4_ECCPR7; // ECC Parity register 7 AT91_REG HSMC4_ECCPR8; // ECC Parity register 8 AT91_REG HSMC4_ECCPR9; // ECC Parity register 9 AT91_REG HSMC4_ECCPR10; // ECC Parity register 10 AT91_REG HSMC4_ECCPR11; // ECC Parity register 11 AT91_REG HSMC4_ECCPR12; // ECC Parity register 12 AT91_REG HSMC4_ECCPR13; // ECC Parity register 13 AT91_REG HSMC4_ECCPR14; // ECC Parity register 14 AT91_REG HSMC4_Eccpr15; // ECC Parity register 15 AT91_REG Reserved0[40]; // AT91_REG HSMC4_OCMS; // OCMS MODE register AT91_REG HSMC4_KEY1; // KEY1 Register AT91_REG HSMC4_KEY2; // KEY2 Register AT91_REG Reserved1[50]; // AT91_REG HSMC4_WPCR; // Write Protection Control register AT91_REG HSMC4_WPSR; // Write Protection Status Register AT91_REG HSMC4_ADDRSIZE; // Write Protection Status Register AT91_REG HSMC4_IPNAME1; // Write Protection Status Register AT91_REG HSMC4_IPNAME2; // Write Protection Status Register AT91_REG HSMC4_FEATURES; // Write Protection Status Register AT91_REG HSMC4_VER; // HSMC4 Version Register AT91_REG HSMC4_DUMMY; // This rtegister was created only ti have AHB constants } AT91S_HSMC4, *AT91PS_HSMC4; #else #define HSMC4_CFG (AT91_CAST(AT91_REG *) 0x00000000) // (HSMC4_CFG) Configuration Register #define HSMC4_CTRL (AT91_CAST(AT91_REG *) 0x00000004) // (HSMC4_CTRL) Control Register #define HSMC4_SR (AT91_CAST(AT91_REG *) 0x00000008) // (HSMC4_SR) Status Register #define HSMC4_IER (AT91_CAST(AT91_REG *) 0x0000000C) // (HSMC4_IER) Interrupt Enable Register #define HSMC4_IDR (AT91_CAST(AT91_REG *) 0x00000010) // (HSMC4_IDR) Interrupt Disable Register #define HSMC4_IMR (AT91_CAST(AT91_REG *) 0x00000014) // (HSMC4_IMR) Interrupt Mask Register #define HSMC4_ADDR (AT91_CAST(AT91_REG *) 0x00000018) // (HSMC4_ADDR) Address Cycle Zero Register #define HSMC4_BANK (AT91_CAST(AT91_REG *) 0x0000001C) // (HSMC4_BANK) Bank Register #define HSMC4_ECCCR (AT91_CAST(AT91_REG *) 0x00000020) // (HSMC4_ECCCR) ECC reset register #define HSMC4_ECCCMD (AT91_CAST(AT91_REG *) 0x00000024) // (HSMC4_ECCCMD) ECC Page size register #define HSMC4_ECCSR1 (AT91_CAST(AT91_REG *) 0x00000028) // (HSMC4_ECCSR1) ECC Status register 1 #define HSMC4_ECCPR0 (AT91_CAST(AT91_REG *) 0x0000002C) // (HSMC4_ECCPR0) ECC Parity register 0 #define HSMC4_ECCPR1 (AT91_CAST(AT91_REG *) 0x00000030) // (HSMC4_ECCPR1) ECC Parity register 1 #define HSMC4_ECCSR2 (AT91_CAST(AT91_REG *) 0x00000034) // (HSMC4_ECCSR2) ECC Status register 2 #define HSMC4_ECCPR2 (AT91_CAST(AT91_REG *) 0x00000038) // (HSMC4_ECCPR2) ECC Parity register 2 #define HSMC4_ECCPR3 (AT91_CAST(AT91_REG *) 0x0000003C) // (HSMC4_ECCPR3) ECC Parity register 3 #define HSMC4_ECCPR4 (AT91_CAST(AT91_REG *) 0x00000040) // (HSMC4_ECCPR4) ECC Parity register 4 #define HSMC4_ECCPR5 (AT91_CAST(AT91_REG *) 0x00000044) // (HSMC4_ECCPR5) ECC Parity register 5 #define HSMC4_ECCPR6 (AT91_CAST(AT91_REG *) 0x00000048) // (HSMC4_ECCPR6) ECC Parity register 6 #define HSMC4_ECCPR7 (AT91_CAST(AT91_REG *) 0x0000004C) // (HSMC4_ECCPR7) ECC Parity register 7 #define HSMC4_ECCPR8 (AT91_CAST(AT91_REG *) 0x00000050) // (HSMC4_ECCPR8) ECC Parity register 8 #define HSMC4_ECCPR9 (AT91_CAST(AT91_REG *) 0x00000054) // (HSMC4_ECCPR9) ECC Parity register 9 #define HSMC4_ECCPR10 (AT91_CAST(AT91_REG *) 0x00000058) // (HSMC4_ECCPR10) ECC Parity register 10 #define HSMC4_ECCPR11 (AT91_CAST(AT91_REG *) 0x0000005C) // (HSMC4_ECCPR11) ECC Parity register 11 #define HSMC4_ECCPR12 (AT91_CAST(AT91_REG *) 0x00000060) // (HSMC4_ECCPR12) ECC Parity register 12 #define HSMC4_ECCPR13 (AT91_CAST(AT91_REG *) 0x00000064) // (HSMC4_ECCPR13) ECC Parity register 13 #define HSMC4_ECCPR14 (AT91_CAST(AT91_REG *) 0x00000068) // (HSMC4_ECCPR14) ECC Parity register 14 #define Hsmc4_Eccpr15 (AT91_CAST(AT91_REG *) 0x0000006C) // (Hsmc4_Eccpr15) ECC Parity register 15 #define HSMC4_OCMS (AT91_CAST(AT91_REG *) 0x00000110) // (HSMC4_OCMS) OCMS MODE register #define HSMC4_KEY1 (AT91_CAST(AT91_REG *) 0x00000114) // (HSMC4_KEY1) KEY1 Register #define HSMC4_KEY2 (AT91_CAST(AT91_REG *) 0x00000118) // (HSMC4_KEY2) KEY2 Register #define HSMC4_WPCR (AT91_CAST(AT91_REG *) 0x000001E4) // (HSMC4_WPCR) Write Protection Control register #define HSMC4_WPSR (AT91_CAST(AT91_REG *) 0x000001E8) // (HSMC4_WPSR) Write Protection Status Register #define HSMC4_ADDRSIZE (AT91_CAST(AT91_REG *) 0x000001EC) // (HSMC4_ADDRSIZE) Write Protection Status Register #define HSMC4_IPNAME1 (AT91_CAST(AT91_REG *) 0x000001F0) // (HSMC4_IPNAME1) Write Protection Status Register #define HSMC4_IPNAME2 (AT91_CAST(AT91_REG *) 0x000001F4) // (HSMC4_IPNAME2) Write Protection Status Register #define HSMC4_FEATURES (AT91_CAST(AT91_REG *) 0x000001F8) // (HSMC4_FEATURES) Write Protection Status Register #define HSMC4_VER (AT91_CAST(AT91_REG *) 0x000001FC) // (HSMC4_VER) HSMC4 Version Register #define HSMC4_DUMMY (AT91_CAST(AT91_REG *) 0x00000200) // (HSMC4_DUMMY) This rtegister was created only ti have AHB constants #endif // -------- HSMC4_CFG : (HSMC4 Offset: 0x0) Configuration Register -------- #define AT91C_HSMC4_PAGESIZE (0x3 << 0) // (HSMC4) PAGESIZE field description #define AT91C_HSMC4_PAGESIZE_528_Bytes (0x0) // (HSMC4) 512 bytes plus 16 bytes page size #define AT91C_HSMC4_PAGESIZE_1056_Bytes (0x1) // (HSMC4) 1024 bytes plus 32 bytes page size #define AT91C_HSMC4_PAGESIZE_2112_Bytes (0x2) // (HSMC4) 2048 bytes plus 64 bytes page size #define AT91C_HSMC4_PAGESIZE_4224_Bytes (0x3) // (HSMC4) 4096 bytes plus 128 bytes page size #define AT91C_HSMC4_WSPARE (0x1 << 8) // (HSMC4) Spare area access in Write Mode #define AT91C_HSMC4_RSPARE (0x1 << 9) // (HSMC4) Spare area access in Read Mode #define AT91C_HSMC4_EDGECTRL (0x1 << 12) // (HSMC4) Rising/Falling Edge Detection Control #define AT91C_HSMC4_RBEDGE (0x1 << 13) // (HSMC4) Ready/Busy Signal edge Detection #define AT91C_HSMC4_DTOCYC (0xF << 16) // (HSMC4) Data Timeout Cycle Number #define AT91C_HSMC4_DTOMUL (0x7 << 20) // (HSMC4) Data Timeout Multiplier #define AT91C_HSMC4_DTOMUL_1 (0x0 << 20) // (HSMC4) DTOCYC x 1 #define AT91C_HSMC4_DTOMUL_16 (0x1 << 20) // (HSMC4) DTOCYC x 16 #define AT91C_HSMC4_DTOMUL_128 (0x2 << 20) // (HSMC4) DTOCYC x 128 #define AT91C_HSMC4_DTOMUL_256 (0x3 << 20) // (HSMC4) DTOCYC x 256 #define AT91C_HSMC4_DTOMUL_1024 (0x4 << 20) // (HSMC4) DTOCYC x 1024 #define AT91C_HSMC4_DTOMUL_4096 (0x5 << 20) // (HSMC4) DTOCYC x 4096 #define AT91C_HSMC4_DTOMUL_65536 (0x6 << 20) // (HSMC4) DTOCYC x 65536 #define AT91C_HSMC4_DTOMUL_1048576 (0x7 << 20) // (HSMC4) DTOCYC x 1048576 // -------- HSMC4_CTRL : (HSMC4 Offset: 0x4) Control Register -------- #define AT91C_HSMC4_NFCEN (0x1 << 0) // (HSMC4) Nand Flash Controller Host Enable #define AT91C_HSMC4_NFCDIS (0x1 << 1) // (HSMC4) Nand Flash Controller Host Disable #define AT91C_HSMC4_HOSTEN (0x1 << 8) // (HSMC4) If set to one, the Host controller is activated and perform a data transfer phase. #define AT91C_HSMC4_HOSTWR (0x1 << 11) // (HSMC4) If this field is set to one, the host transfers data from the internal SRAM to the Memory Device. #define AT91C_HSMC4_HOSTCSID (0x7 << 12) // (HSMC4) Host Controller Chip select Id #define AT91C_HSMC4_HOSTCSID_0 (0x0 << 12) // (HSMC4) CS0 #define AT91C_HSMC4_HOSTCSID_1 (0x1 << 12) // (HSMC4) CS1 #define AT91C_HSMC4_HOSTCSID_2 (0x2 << 12) // (HSMC4) CS2 #define AT91C_HSMC4_HOSTCSID_3 (0x3 << 12) // (HSMC4) CS3 #define AT91C_HSMC4_HOSTCSID_4 (0x4 << 12) // (HSMC4) CS4 #define AT91C_HSMC4_HOSTCSID_5 (0x5 << 12) // (HSMC4) CS5 #define AT91C_HSMC4_HOSTCSID_6 (0x6 << 12) // (HSMC4) CS6 #define AT91C_HSMC4_HOSTCSID_7 (0x7 << 12) // (HSMC4) CS7 #define AT91C_HSMC4_VALID (0x1 << 15) // (HSMC4) When set to 1, a write operation modifies both HOSTCSID and HOSTWR fields. // -------- HSMC4_SR : (HSMC4 Offset: 0x8) HSMC4 Status Register -------- #define AT91C_HSMC4_NFCSTS (0x1 << 0) // (HSMC4) Nand Flash Controller status #define AT91C_HSMC4_RBRISE (0x1 << 4) // (HSMC4) Selected Ready Busy Rising Edge Detected flag #define AT91C_HSMC4_RBFALL (0x1 << 5) // (HSMC4) Selected Ready Busy Falling Edge Detected flag #define AT91C_HSMC4_HOSTBUSY (0x1 << 8) // (HSMC4) Host Busy #define AT91C_HSMC4_HOSTW (0x1 << 11) // (HSMC4) Host Write/Read Operation #define AT91C_HSMC4_HOSTCS (0x7 << 12) // (HSMC4) Host Controller Chip select Id #define AT91C_HSMC4_HOSTCS_0 (0x0 << 12) // (HSMC4) CS0 #define AT91C_HSMC4_HOSTCS_1 (0x1 << 12) // (HSMC4) CS1 #define AT91C_HSMC4_HOSTCS_2 (0x2 << 12) // (HSMC4) CS2 #define AT91C_HSMC4_HOSTCS_3 (0x3 << 12) // (HSMC4) CS3 #define AT91C_HSMC4_HOSTCS_4 (0x4 << 12) // (HSMC4) CS4 #define AT91C_HSMC4_HOSTCS_5 (0x5 << 12) // (HSMC4) CS5 #define AT91C_HSMC4_HOSTCS_6 (0x6 << 12) // (HSMC4) CS6 #define AT91C_HSMC4_HOSTCS_7 (0x7 << 12) // (HSMC4) CS7 #define AT91C_HSMC4_XFRDONE (0x1 << 16) // (HSMC4) Host Data Transfer Terminated #define AT91C_HSMC4_CMDDONE (0x1 << 17) // (HSMC4) Command Done #define AT91C_HSMC4_ECCRDY (0x1 << 18) // (HSMC4) ECC ready #define AT91C_HSMC4_DTOE (0x1 << 20) // (HSMC4) Data timeout Error #define AT91C_HSMC4_UNDEF (0x1 << 21) // (HSMC4) Undefined Area Error #define AT91C_HSMC4_AWB (0x1 << 22) // (HSMC4) Accessing While Busy Error #define AT91C_HSMC4_HASE (0x1 << 23) // (HSMC4) Host Controller Access Size Error #define AT91C_HSMC4_RBEDGE0 (0x1 << 24) // (HSMC4) Ready Busy line 0 Edge detected #define AT91C_HSMC4_RBEDGE1 (0x1 << 25) // (HSMC4) Ready Busy line 1 Edge detected #define AT91C_HSMC4_RBEDGE2 (0x1 << 26) // (HSMC4) Ready Busy line 2 Edge detected #define AT91C_HSMC4_RBEDGE3 (0x1 << 27) // (HSMC4) Ready Busy line 3 Edge detected #define AT91C_HSMC4_RBEDGE4 (0x1 << 28) // (HSMC4) Ready Busy line 4 Edge detected #define AT91C_HSMC4_RBEDGE5 (0x1 << 29) // (HSMC4) Ready Busy line 5 Edge detected #define AT91C_HSMC4_RBEDGE6 (0x1 << 30) // (HSMC4) Ready Busy line 6 Edge detected #define AT91C_HSMC4_RBEDGE7 (0x1 << 31) // (HSMC4) Ready Busy line 7 Edge detected // -------- HSMC4_IER : (HSMC4 Offset: 0xc) HSMC4 Interrupt Enable Register -------- // -------- HSMC4_IDR : (HSMC4 Offset: 0x10) HSMC4 Interrupt Disable Register -------- // -------- HSMC4_IMR : (HSMC4 Offset: 0x14) HSMC4 Interrupt Mask Register -------- // -------- HSMC4_ADDR : (HSMC4 Offset: 0x18) Address Cycle Zero Register -------- #define AT91C_HSMC4_ADDRCYCLE0 (0xFF << 0) // (HSMC4) Nand Flash Array Address cycle 0 // -------- HSMC4_BANK : (HSMC4 Offset: 0x1c) Bank Register -------- #define AT91C_BANK (0x7 << 0) // (HSMC4) Bank identifier #define AT91C_BANK_0 (0x0) // (HSMC4) BANK0 #define AT91C_BANK_1 (0x1) // (HSMC4) BANK1 #define AT91C_BANK_2 (0x2) // (HSMC4) BANK2 #define AT91C_BANK_3 (0x3) // (HSMC4) BANK3 #define AT91C_BANK_4 (0x4) // (HSMC4) BANK4 #define AT91C_BANK_5 (0x5) // (HSMC4) BANK5 #define AT91C_BANK_6 (0x6) // (HSMC4) BANK6 #define AT91C_BANK_7 (0x7) // (HSMC4) BANK7 // -------- HSMC4_ECCCR : (HSMC4 Offset: 0x20) ECC Control Register -------- #define AT91C_HSMC4_ECCRESET (0x1 << 0) // (HSMC4) Reset ECC // -------- HSMC4_ECCCMD : (HSMC4 Offset: 0x24) ECC mode register -------- #define AT91C_ECC_PAGE_SIZE (0x3 << 0) // (HSMC4) Nand Flash page size #define AT91C_ECC_TYPCORRECT (0x3 << 4) // (HSMC4) Nand Flash page size #define AT91C_ECC_TYPCORRECT_ONE_PER_PAGE (0x0 << 4) // (HSMC4) #define AT91C_ECC_TYPCORRECT_ONE_EVERY_256_BYTES (0x1 << 4) // (HSMC4) #define AT91C_ECC_TYPCORRECT_ONE_EVERY_512_BYTES (0x2 << 4) // (HSMC4) // -------- HSMC4_ECCSR1 : (HSMC4 Offset: 0x28) ECC Status Register 1 -------- #define AT91C_HSMC4_ECC_RECERR0 (0x1 << 0) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR0 (0x1 << 1) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR0 (0x1 << 2) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR1 (0x1 << 4) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR1 (0x1 << 5) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR1 (0x1 << 6) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR2 (0x1 << 8) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR2 (0x1 << 9) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR2 (0x1 << 10) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR3 (0x1 << 12) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR3 (0x1 << 13) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR3 (0x1 << 14) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR4 (0x1 << 16) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR4 (0x1 << 17) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR4 (0x1 << 18) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR5 (0x1 << 20) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR5 (0x1 << 21) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR5 (0x1 << 22) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR6 (0x1 << 24) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR6 (0x1 << 25) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR6 (0x1 << 26) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR7 (0x1 << 28) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR7 (0x1 << 29) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR7 (0x1 << 30) // (HSMC4) Multiple Error // -------- HSMC4_ECCPR0 : (HSMC4 Offset: 0x2c) HSMC4 ECC parity Register 0 -------- #define AT91C_HSMC4_ECC_BITADDR (0x7 << 0) // (HSMC4) Corrupted Bit Address in the page #define AT91C_HSMC4_ECC_WORDADDR (0xFF << 3) // (HSMC4) Corrupted Word Address in the page #define AT91C_HSMC4_ECC_NPARITY (0x7FF << 12) // (HSMC4) Parity N // -------- HSMC4_ECCPR1 : (HSMC4 Offset: 0x30) HSMC4 ECC parity Register 1 -------- // -------- HSMC4_ECCSR2 : (HSMC4 Offset: 0x34) ECC Status Register 2 -------- #define AT91C_HSMC4_ECC_RECERR8 (0x1 << 0) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR8 (0x1 << 1) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR8 (0x1 << 2) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR9 (0x1 << 4) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR9 (0x1 << 5) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR9 (0x1 << 6) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR10 (0x1 << 8) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR10 (0x1 << 9) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR10 (0x1 << 10) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR11 (0x1 << 12) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR11 (0x1 << 13) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR11 (0x1 << 14) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR12 (0x1 << 16) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR12 (0x1 << 17) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR12 (0x1 << 18) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR13 (0x1 << 20) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR13 (0x1 << 21) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR13 (0x1 << 22) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR14 (0x1 << 24) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR14 (0x1 << 25) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR14 (0x1 << 26) // (HSMC4) Multiple Error #define AT91C_HSMC4_ECC_RECERR15 (0x1 << 28) // (HSMC4) Recoverable Error #define AT91C_HSMC4_ECC_ECCERR15 (0x1 << 29) // (HSMC4) ECC Error #define AT91C_HSMC4_ECC_MULERR15 (0x1 << 30) // (HSMC4) Multiple Error // -------- HSMC4_ECCPR2 : (HSMC4 Offset: 0x38) HSMC4 ECC parity Register 2 -------- // -------- HSMC4_ECCPR3 : (HSMC4 Offset: 0x3c) HSMC4 ECC parity Register 3 -------- // -------- HSMC4_ECCPR4 : (HSMC4 Offset: 0x40) HSMC4 ECC parity Register 4 -------- // -------- HSMC4_ECCPR5 : (HSMC4 Offset: 0x44) HSMC4 ECC parity Register 5 -------- // -------- HSMC4_ECCPR6 : (HSMC4 Offset: 0x48) HSMC4 ECC parity Register 6 -------- // -------- HSMC4_ECCPR7 : (HSMC4 Offset: 0x4c) HSMC4 ECC parity Register 7 -------- // -------- HSMC4_ECCPR8 : (HSMC4 Offset: 0x50) HSMC4 ECC parity Register 8 -------- // -------- HSMC4_ECCPR9 : (HSMC4 Offset: 0x54) HSMC4 ECC parity Register 9 -------- // -------- HSMC4_ECCPR10 : (HSMC4 Offset: 0x58) HSMC4 ECC parity Register 10 -------- // -------- HSMC4_ECCPR11 : (HSMC4 Offset: 0x5c) HSMC4 ECC parity Register 11 -------- // -------- HSMC4_ECCPR12 : (HSMC4 Offset: 0x60) HSMC4 ECC parity Register 12 -------- // -------- HSMC4_ECCPR13 : (HSMC4 Offset: 0x64) HSMC4 ECC parity Register 13 -------- // -------- HSMC4_ECCPR14 : (HSMC4 Offset: 0x68) HSMC4 ECC parity Register 14 -------- // -------- HSMC4_ECCPR15 : (HSMC4 Offset: 0x6c) HSMC4 ECC parity Register 15 -------- // -------- HSMC4_OCMS : (HSMC4 Offset: 0x110) HSMC4 OCMS Register -------- #define AT91C_HSMC4_OCMS_SRSE (0x1 << 0) // (HSMC4) Static Memory Controller Scrambling Enable #define AT91C_HSMC4_OCMS_SMSE (0x1 << 1) // (HSMC4) SRAM Scramling Enable // -------- HSMC4_KEY1 : (HSMC4 Offset: 0x114) HSMC4 OCMS KEY1 Register -------- #define AT91C_HSMC4_OCMS_KEY1 (0x0 << 0) // (HSMC4) OCMS Key 2 // -------- HSMC4_OCMS_KEY2 : (HSMC4 Offset: 0x118) HSMC4 OCMS KEY2 Register -------- #define AT91C_HSMC4_OCMS_KEY2 (0x0 << 0) // (HSMC4) OCMS Key 2 // -------- HSMC4_WPCR : (HSMC4 Offset: 0x1e4) HSMC4 Witre Protection Control Register -------- #define AT91C_HSMC4_WP_EN (0x1 << 0) // (HSMC4) Write Protection Enable #define AT91C_HSMC4_WP_KEY (0xFFFFFF << 8) // (HSMC4) Protection Password // -------- HSMC4_WPSR : (HSMC4 Offset: 0x1e8) HSMC4 WPSR Register -------- #define AT91C_HSMC4_WP_VS (0xF << 0) // (HSMC4) Write Protection Violation Status #define AT91C_HSMC4_WP_VS_WP_VS0 (0x0) // (HSMC4) No write protection violation since the last read of this register #define AT91C_HSMC4_WP_VS_WP_VS1 (0x1) // (HSMC4) write protection detected unauthorized attempt to write a control register had occured (since the last read) #define AT91C_HSMC4_WP_VS_WP_VS2 (0x2) // (HSMC4) Software reset had been performed while write protection was enabled (since the last read) #define AT91C_HSMC4_WP_VS_WP_VS3 (0x3) // (HSMC4) Both write protection violation and software reset with write protection enabled had occured since the last read #define AT91C_ (0x0 << 8) // (HSMC4) // -------- HSMC4_VER : (HSMC4 Offset: 0x1fc) HSMC4 VERSION Register -------- // -------- HSMC4_DUMMY : (HSMC4 Offset: 0x200) HSMC4 DUMMY REGISTER -------- #define AT91C_HSMC4_CMD1 (0xFF << 2) // (HSMC4) Command Register Value for Cycle 1 #define AT91C_HSMC4_CMD2 (0xFF << 10) // (HSMC4) Command Register Value for Cycle 2 #define AT91C_HSMC4_VCMD2 (0x1 << 18) // (HSMC4) Valid Cycle 2 Command #define AT91C_HSMC4_ACYCLE (0x7 << 19) // (HSMC4) Number of Address required for the current command #define AT91C_HSMC4_ACYCLE_HSMC4_ACYCLE_NONE (0x0 << 19) // (HSMC4) No address cycle #define AT91C_HSMC4_ACYCLE_HSMC4_ACYCLE_ONE (0x1 << 19) // (HSMC4) One address cycle #define AT91C_HSMC4_ACYCLE_HSMC4_ACYCLE_TWO (0x2 << 19) // (HSMC4) Two address cycles #define AT91C_HSMC4_ACYCLE_HSMC4_ACYCLE_THREE (0x3 << 19) // (HSMC4) Three address cycles #define AT91C_HSMC4_ACYCLE_HSMC4_ACYCLE_FOUR (0x4 << 19) // (HSMC4) Four address cycles #define AT91C_HSMC4_ACYCLE_HSMC4_ACYCLE_FIVE (0x5 << 19) // (HSMC4) Five address cycles #define AT91C_HSMC4_CSID (0x7 << 22) // (HSMC4) Chip Select Identifier #define AT91C_HSMC4_CSID_0 (0x0 << 22) // (HSMC4) CS0 #define AT91C_HSMC4_CSID_1 (0x1 << 22) // (HSMC4) CS1 #define AT91C_HSMC4_CSID_2 (0x2 << 22) // (HSMC4) CS2 #define AT91C_HSMC4_CSID_3 (0x3 << 22) // (HSMC4) CS3 #define AT91C_HSMC4_CSID_4 (0x4 << 22) // (HSMC4) CS4 #define AT91C_HSMC4_CSID_5 (0x5 << 22) // (HSMC4) CS5 #define AT91C_HSMC4_CSID_6 (0x6 << 22) // (HSMC4) CS6 #define AT91C_HSMC4_CSID_7 (0x7 << 22) // (HSMC4) CS7 #define AT91C_HSMC4_HOST_EN (0x1 << 25) // (HSMC4) Host Main Controller Enable #define AT91C_HSMC4_HOST_WR (0x1 << 26) // (HSMC4) HOSTWR : Host Main Controller Write Enable #define AT91C_HSMC4_HOSTCMD (0x1 << 27) // (HSMC4) Host Command Enable // ***************************************************************************** // SOFTWARE API DEFINITION FOR AHB Matrix2 Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_HMATRIX2 { AT91_REG HMATRIX2_MCFG0; // Master Configuration Register 0 : ARM I and D AT91_REG HMATRIX2_MCFG1; // Master Configuration Register 1 : ARM S AT91_REG HMATRIX2_MCFG2; // Master Configuration Register 2 AT91_REG HMATRIX2_MCFG3; // Master Configuration Register 3 AT91_REG HMATRIX2_MCFG4; // Master Configuration Register 4 AT91_REG HMATRIX2_MCFG5; // Master Configuration Register 5 AT91_REG HMATRIX2_MCFG6; // Master Configuration Register 6 AT91_REG HMATRIX2_MCFG7; // Master Configuration Register 7 AT91_REG Reserved0[8]; // AT91_REG HMATRIX2_SCFG0; // Slave Configuration Register 0 AT91_REG HMATRIX2_SCFG1; // Slave Configuration Register 1 AT91_REG HMATRIX2_SCFG2; // Slave Configuration Register 2 AT91_REG HMATRIX2_SCFG3; // Slave Configuration Register 3 AT91_REG HMATRIX2_SCFG4; // Slave Configuration Register 4 AT91_REG HMATRIX2_SCFG5; // Slave Configuration Register 5 AT91_REG HMATRIX2_SCFG6; // Slave Configuration Register 6 AT91_REG HMATRIX2_SCFG7; // Slave Configuration Register 5 AT91_REG HMATRIX2_SCFG8; // Slave Configuration Register 8 AT91_REG HMATRIX2_SCFG9; // Slave Configuration Register 9 AT91_REG Reserved1[42]; // AT91_REG HMATRIX2_SFR0 ; // Special Function Register 0 AT91_REG HMATRIX2_SFR1 ; // Special Function Register 1 AT91_REG HMATRIX2_SFR2 ; // Special Function Register 2 AT91_REG HMATRIX2_SFR3 ; // Special Function Register 3 AT91_REG HMATRIX2_SFR4 ; // Special Function Register 4 AT91_REG HMATRIX2_SFR5 ; // Special Function Register 5 AT91_REG HMATRIX2_SFR6 ; // Special Function Register 6 AT91_REG HMATRIX2_SFR7 ; // Special Function Register 7 AT91_REG HMATRIX2_SFR8 ; // Special Function Register 8 AT91_REG HMATRIX2_SFR9 ; // Special Function Register 9 AT91_REG HMATRIX2_SFR10; // Special Function Register 10 AT91_REG HMATRIX2_SFR11; // Special Function Register 11 AT91_REG HMATRIX2_SFR12; // Special Function Register 12 AT91_REG HMATRIX2_SFR13; // Special Function Register 13 AT91_REG HMATRIX2_SFR14; // Special Function Register 14 AT91_REG HMATRIX2_SFR15; // Special Function Register 15 AT91_REG Reserved2[39]; // AT91_REG HMATRIX2_ADDRSIZE; // HMATRIX2 ADDRSIZE REGISTER AT91_REG HMATRIX2_IPNAME1; // HMATRIX2 IPNAME1 REGISTER AT91_REG HMATRIX2_IPNAME2; // HMATRIX2 IPNAME2 REGISTER AT91_REG HMATRIX2_FEATURES; // HMATRIX2 FEATURES REGISTER AT91_REG HMATRIX2_VER; // HMATRIX2 VERSION REGISTER } AT91S_HMATRIX2, *AT91PS_HMATRIX2; #else #define MATRIX_MCFG0 (AT91_CAST(AT91_REG *) 0x00000000) // (MATRIX_MCFG0) Master Configuration Register 0 : ARM I and D #define MATRIX_MCFG1 (AT91_CAST(AT91_REG *) 0x00000004) // (MATRIX_MCFG1) Master Configuration Register 1 : ARM S #define MATRIX_MCFG2 (AT91_CAST(AT91_REG *) 0x00000008) // (MATRIX_MCFG2) Master Configuration Register 2 #define MATRIX_MCFG3 (AT91_CAST(AT91_REG *) 0x0000000C) // (MATRIX_MCFG3) Master Configuration Register 3 #define MATRIX_MCFG4 (AT91_CAST(AT91_REG *) 0x00000010) // (MATRIX_MCFG4) Master Configuration Register 4 #define MATRIX_MCFG5 (AT91_CAST(AT91_REG *) 0x00000014) // (MATRIX_MCFG5) Master Configuration Register 5 #define MATRIX_MCFG6 (AT91_CAST(AT91_REG *) 0x00000018) // (MATRIX_MCFG6) Master Configuration Register 6 #define MATRIX_MCFG7 (AT91_CAST(AT91_REG *) 0x0000001C) // (MATRIX_MCFG7) Master Configuration Register 7 #define MATRIX_SCFG0 (AT91_CAST(AT91_REG *) 0x00000040) // (MATRIX_SCFG0) Slave Configuration Register 0 #define MATRIX_SCFG1 (AT91_CAST(AT91_REG *) 0x00000044) // (MATRIX_SCFG1) Slave Configuration Register 1 #define MATRIX_SCFG2 (AT91_CAST(AT91_REG *) 0x00000048) // (MATRIX_SCFG2) Slave Configuration Register 2 #define MATRIX_SCFG3 (AT91_CAST(AT91_REG *) 0x0000004C) // (MATRIX_SCFG3) Slave Configuration Register 3 #define MATRIX_SCFG4 (AT91_CAST(AT91_REG *) 0x00000050) // (MATRIX_SCFG4) Slave Configuration Register 4 #define MATRIX_SCFG5 (AT91_CAST(AT91_REG *) 0x00000054) // (MATRIX_SCFG5) Slave Configuration Register 5 #define MATRIX_SCFG6 (AT91_CAST(AT91_REG *) 0x00000058) // (MATRIX_SCFG6) Slave Configuration Register 6 #define MATRIX_SCFG7 (AT91_CAST(AT91_REG *) 0x0000005C) // (MATRIX_SCFG7) Slave Configuration Register 5 #define MATRIX_SCFG8 (AT91_CAST(AT91_REG *) 0x00000060) // (MATRIX_SCFG8) Slave Configuration Register 8 #define MATRIX_SCFG9 (AT91_CAST(AT91_REG *) 0x00000064) // (MATRIX_SCFG9) Slave Configuration Register 9 #define MATRIX_SFR0 (AT91_CAST(AT91_REG *) 0x00000110) // (MATRIX_SFR0 ) Special Function Register 0 #define MATRIX_SFR1 (AT91_CAST(AT91_REG *) 0x00000114) // (MATRIX_SFR1 ) Special Function Register 1 #define MATRIX_SFR2 (AT91_CAST(AT91_REG *) 0x00000118) // (MATRIX_SFR2 ) Special Function Register 2 #define MATRIX_SFR3 (AT91_CAST(AT91_REG *) 0x0000011C) // (MATRIX_SFR3 ) Special Function Register 3 #define MATRIX_SFR4 (AT91_CAST(AT91_REG *) 0x00000120) // (MATRIX_SFR4 ) Special Function Register 4 #define MATRIX_SFR5 (AT91_CAST(AT91_REG *) 0x00000124) // (MATRIX_SFR5 ) Special Function Register 5 #define MATRIX_SFR6 (AT91_CAST(AT91_REG *) 0x00000128) // (MATRIX_SFR6 ) Special Function Register 6 #define MATRIX_SFR7 (AT91_CAST(AT91_REG *) 0x0000012C) // (MATRIX_SFR7 ) Special Function Register 7 #define MATRIX_SFR8 (AT91_CAST(AT91_REG *) 0x00000130) // (MATRIX_SFR8 ) Special Function Register 8 #define MATRIX_SFR9 (AT91_CAST(AT91_REG *) 0x00000134) // (MATRIX_SFR9 ) Special Function Register 9 #define MATRIX_SFR10 (AT91_CAST(AT91_REG *) 0x00000138) // (MATRIX_SFR10) Special Function Register 10 #define MATRIX_SFR11 (AT91_CAST(AT91_REG *) 0x0000013C) // (MATRIX_SFR11) Special Function Register 11 #define MATRIX_SFR12 (AT91_CAST(AT91_REG *) 0x00000140) // (MATRIX_SFR12) Special Function Register 12 #define MATRIX_SFR13 (AT91_CAST(AT91_REG *) 0x00000144) // (MATRIX_SFR13) Special Function Register 13 #define MATRIX_SFR14 (AT91_CAST(AT91_REG *) 0x00000148) // (MATRIX_SFR14) Special Function Register 14 #define MATRIX_SFR15 (AT91_CAST(AT91_REG *) 0x0000014C) // (MATRIX_SFR15) Special Function Register 15 #define HMATRIX2_ADDRSIZE (AT91_CAST(AT91_REG *) 0x000001EC) // (HMATRIX2_ADDRSIZE) HMATRIX2 ADDRSIZE REGISTER #define HMATRIX2_IPNAME1 (AT91_CAST(AT91_REG *) 0x000001F0) // (HMATRIX2_IPNAME1) HMATRIX2 IPNAME1 REGISTER #define HMATRIX2_IPNAME2 (AT91_CAST(AT91_REG *) 0x000001F4) // (HMATRIX2_IPNAME2) HMATRIX2 IPNAME2 REGISTER #define HMATRIX2_FEATURES (AT91_CAST(AT91_REG *) 0x000001F8) // (HMATRIX2_FEATURES) HMATRIX2 FEATURES REGISTER #define HMATRIX2_VER (AT91_CAST(AT91_REG *) 0x000001FC) // (HMATRIX2_VER) HMATRIX2 VERSION REGISTER #endif // -------- MATRIX_MCFG0 : (HMATRIX2 Offset: 0x0) Master Configuration Register ARM bus I and D -------- #define AT91C_MATRIX_ULBT (0x7 << 0) // (HMATRIX2) Undefined Length Burst Type #define AT91C_MATRIX_ULBT_INFINIT_LENGTH (0x0) // (HMATRIX2) infinite length burst #define AT91C_MATRIX_ULBT_SINGLE_ACCESS (0x1) // (HMATRIX2) Single Access #define AT91C_MATRIX_ULBT_4_BEAT (0x2) // (HMATRIX2) 4 Beat Burst #define AT91C_MATRIX_ULBT_8_BEAT (0x3) // (HMATRIX2) 8 Beat Burst #define AT91C_MATRIX_ULBT_16_BEAT (0x4) // (HMATRIX2) 16 Beat Burst #define AT91C_MATRIX_ULBT_32_BEAT (0x5) // (HMATRIX2) 32 Beat Burst #define AT91C_MATRIX_ULBT_64_BEAT (0x6) // (HMATRIX2) 64 Beat Burst #define AT91C_MATRIX_ULBT_128_BEAT (0x7) // (HMATRIX2) 128 Beat Burst // -------- MATRIX_MCFG1 : (HMATRIX2 Offset: 0x4) Master Configuration Register ARM bus S -------- // -------- MATRIX_MCFG2 : (HMATRIX2 Offset: 0x8) Master Configuration Register -------- // -------- MATRIX_MCFG3 : (HMATRIX2 Offset: 0xc) Master Configuration Register -------- // -------- MATRIX_MCFG4 : (HMATRIX2 Offset: 0x10) Master Configuration Register -------- // -------- MATRIX_MCFG5 : (HMATRIX2 Offset: 0x14) Master Configuration Register -------- // -------- MATRIX_MCFG6 : (HMATRIX2 Offset: 0x18) Master Configuration Register -------- // -------- MATRIX_MCFG7 : (HMATRIX2 Offset: 0x1c) Master Configuration Register -------- // -------- MATRIX_SCFG0 : (HMATRIX2 Offset: 0x40) Slave Configuration Register 0 -------- #define AT91C_MATRIX_SLOT_CYCLE (0xFF << 0) // (HMATRIX2) Maximum Number of Allowed Cycles for a Burst #define AT91C_MATRIX_DEFMSTR_TYPE (0x3 << 16) // (HMATRIX2) Default Master Type #define AT91C_MATRIX_DEFMSTR_TYPE_NO_DEFMSTR (0x0 << 16) // (HMATRIX2) No Default Master. At the end of current slave access, if no other master request is pending, the slave is deconnected from all masters. This results in having a one cycle latency for the first transfer of a burst. #define AT91C_MATRIX_DEFMSTR_TYPE_LAST_DEFMSTR (0x1 << 16) // (HMATRIX2) Last Default Master. At the end of current slave access, if no other master request is pending, the slave stay connected with the last master having accessed it. This results in not having the one cycle latency when the last master re-trying access on the slave. #define AT91C_MATRIX_DEFMSTR_TYPE_FIXED_DEFMSTR (0x2 << 16) // (HMATRIX2) Fixed Default Master. At the end of current slave access, if no other master request is pending, the slave connects with fixed which number is in FIXED_DEFMSTR field. This results in not having the one cycle latency when the fixed master re-trying access on the slave. #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG0 (0x7 << 18) // (HMATRIX2) Fixed Index of Default Master #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG0_ARMS (0x1 << 18) // (HMATRIX2) ARMS is Default Master // -------- MATRIX_SCFG1 : (HMATRIX2 Offset: 0x44) Slave Configuration Register 1 -------- #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG1 (0x7 << 18) // (HMATRIX2) Fixed Index of Default Master #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG1_ARMS (0x1 << 18) // (HMATRIX2) ARMS is Default Master // -------- MATRIX_SCFG2 : (HMATRIX2 Offset: 0x48) Slave Configuration Register 2 -------- #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG2 (0x7 << 18) // (HMATRIX2) Fixed Index of Default Master #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG2_ARMS (0x1 << 18) // (HMATRIX2) ARMS is Default Master // -------- MATRIX_SCFG3 : (HMATRIX2 Offset: 0x4c) Slave Configuration Register 3 -------- #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG3 (0x7 << 18) // (HMATRIX2) Fixed Index of Default Master #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG3_ARMC (0x0 << 18) // (HMATRIX2) ARMC is Default Master // -------- MATRIX_SCFG4 : (HMATRIX2 Offset: 0x50) Slave Configuration Register 4 -------- #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG4 (0x7 << 18) // (HMATRIX2) Fixed Index of Default Master #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG4_ARMC (0x0 << 18) // (HMATRIX2) ARMC is Default Master // -------- MATRIX_SCFG5 : (HMATRIX2 Offset: 0x54) Slave Configuration Register 5 -------- #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG5 (0x7 << 18) // (HMATRIX2) Fixed Index of Default Master #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG5_ARMS (0x1 << 18) // (HMATRIX2) ARMS is Default Master // -------- MATRIX_SCFG6 : (HMATRIX2 Offset: 0x58) Slave Configuration Register 6 -------- #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG6 (0x7 << 18) // (HMATRIX2) Fixed Index of Default Master #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG6_ARMS (0x1 << 18) // (HMATRIX2) ARMS is Default Master // -------- MATRIX_SCFG7 : (HMATRIX2 Offset: 0x5c) Slave Configuration Register 7 -------- #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG7 (0x7 << 18) // (HMATRIX2) Fixed Index of Default Master #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG7_ARMS (0x1 << 18) // (HMATRIX2) ARMS is Default Master // -------- MATRIX_SCFG8 : (HMATRIX2 Offset: 0x60) Slave Configuration Register 8 -------- #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG8 (0x7 << 18) // (HMATRIX2) Fixed Index of Default Master #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG8_ARMS (0x1 << 18) // (HMATRIX2) ARMS is Default Master #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG8_HDMA (0x4 << 18) // (HMATRIX2) HDMA is Default Master // -------- MATRIX_SCFG9 : (HMATRIX2 Offset: 0x64) Slave Configuration Register 9 -------- #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG9 (0x7 << 18) // (HMATRIX2) Fixed Index of Default Master #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG9_ARMS (0x1 << 18) // (HMATRIX2) ARMS is Default Master #define AT91C_MATRIX_FIXED_DEFMSTR_SCFG9_HDMA (0x4 << 18) // (HMATRIX2) HDMA is Default Master // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x110) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x114) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x118) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x11c) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x120) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x124) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x128) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x12c) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x130) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x134) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x138) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x13c) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x140) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x144) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x148) Special Function Register 0 -------- // -------- MATRIX_SFR0 : (HMATRIX2 Offset: 0x14c) Special Function Register 0 -------- // -------- HMATRIX2_VER : (HMATRIX2 Offset: 0x1fc) VERSION Register -------- #define AT91C_HMATRIX2_VER (0xF << 0) // (HMATRIX2) VERSION Register // ***************************************************************************** // SOFTWARE API DEFINITION FOR NESTED vector Interrupt Controller // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_NVIC { AT91_REG Reserved0[1]; // AT91_REG NVIC_ICTR; // Interrupt Control Type Register AT91_REG Reserved1[2]; // AT91_REG NVIC_STICKCSR; // SysTick Control and Status Register AT91_REG NVIC_STICKRVR; // SysTick Reload Value Register AT91_REG NVIC_STICKCVR; // SysTick Current Value Register AT91_REG NVIC_STICKCALVR; // SysTick Calibration Value Register AT91_REG Reserved2[56]; // AT91_REG NVIC_ISER[8]; // Set Enable Register AT91_REG Reserved3[24]; // AT91_REG NVIC_ICER[8]; // Clear enable Register AT91_REG Reserved4[24]; // AT91_REG NVIC_ISPR[8]; // Set Pending Register AT91_REG Reserved5[24]; // AT91_REG NVIC_ICPR[8]; // Clear Pending Register AT91_REG Reserved6[24]; // AT91_REG NVIC_ABR[8]; // Active Bit Register AT91_REG Reserved7[56]; // AT91_REG NVIC_IPR[60]; // Interrupt Mask Register AT91_REG Reserved8[516]; // AT91_REG NVIC_CPUID; // CPUID Base Register AT91_REG NVIC_ICSR; // Interrupt Control State Register AT91_REG NVIC_VTOFFR; // Vector Table Offset Register AT91_REG NVIC_AIRCR; // Application Interrupt/Reset Control Reg AT91_REG NVIC_SCR; // System Control Register AT91_REG NVIC_CCR; // Configuration Control Register AT91_REG NVIC_HAND4PR; // System Handlers 4-7 Priority Register AT91_REG NVIC_HAND8PR; // System Handlers 8-11 Priority Register AT91_REG NVIC_HAND12PR; // System Handlers 12-15 Priority Register AT91_REG NVIC_HANDCSR; // System Handler Control and State Register AT91_REG NVIC_CFSR; // Configurable Fault Status Register AT91_REG NVIC_HFSR; // Hard Fault Status Register AT91_REG NVIC_DFSR; // Debug Fault Status Register AT91_REG NVIC_MMAR; // Mem Manage Address Register AT91_REG NVIC_BFAR; // Bus Fault Address Register AT91_REG NVIC_AFSR; // Auxiliary Fault Status Register AT91_REG NVIC_PFR0; // Processor Feature register0 AT91_REG NVIC_PFR1; // Processor Feature register1 AT91_REG NVIC_DFR0; // Debug Feature register0 AT91_REG NVIC_AFR0; // Auxiliary Feature register0 AT91_REG NVIC_MMFR0; // Memory Model Feature register0 AT91_REG NVIC_MMFR1; // Memory Model Feature register1 AT91_REG NVIC_MMFR2; // Memory Model Feature register2 AT91_REG NVIC_MMFR3; // Memory Model Feature register3 AT91_REG NVIC_ISAR0; // ISA Feature register0 AT91_REG NVIC_ISAR1; // ISA Feature register1 AT91_REG NVIC_ISAR2; // ISA Feature register2 AT91_REG NVIC_ISAR3; // ISA Feature register3 AT91_REG NVIC_ISAR4; // ISA Feature register4 AT91_REG Reserved9[99]; // AT91_REG NVIC_STIR; // Software Trigger Interrupt Register AT91_REG Reserved10[51]; // AT91_REG NVIC_PID4; // Peripheral identification register AT91_REG NVIC_PID5; // Peripheral identification register AT91_REG NVIC_PID6; // Peripheral identification register AT91_REG NVIC_PID7; // Peripheral identification register AT91_REG NVIC_PID0; // Peripheral identification register b7:0 AT91_REG NVIC_PID1; // Peripheral identification register b15:8 AT91_REG NVIC_PID2; // Peripheral identification register b23:16 AT91_REG NVIC_PID3; // Peripheral identification register b31:24 AT91_REG NVIC_CID0; // Component identification register b7:0 AT91_REG NVIC_CID1; // Component identification register b15:8 AT91_REG NVIC_CID2; // Component identification register b23:16 AT91_REG NVIC_CID3; // Component identification register b31:24 } AT91S_NVIC, *AT91PS_NVIC; #else #define NVIC_ICTR (AT91_CAST(AT91_REG *) 0x00000004) // (NVIC_ICTR) Interrupt Control Type Register #define NVIC_STICKCSR (AT91_CAST(AT91_REG *) 0x00000010) // (NVIC_STICKCSR) SysTick Control and Status Register #define NVIC_STICKRVR (AT91_CAST(AT91_REG *) 0x00000014) // (NVIC_STICKRVR) SysTick Reload Value Register #define NVIC_STICKCVR (AT91_CAST(AT91_REG *) 0x00000018) // (NVIC_STICKCVR) SysTick Current Value Register #define NVIC_STICKCALVR (AT91_CAST(AT91_REG *) 0x0000001C) // (NVIC_STICKCALVR) SysTick Calibration Value Register #define NVIC_ISER (AT91_CAST(AT91_REG *) 0x00000100) // (NVIC_ISER) Set Enable Register #define NVIC_ICER (AT91_CAST(AT91_REG *) 0x00000180) // (NVIC_ICER) Clear enable Register #define NVIC_ISPR (AT91_CAST(AT91_REG *) 0x00000200) // (NVIC_ISPR) Set Pending Register #define NVIC_ICPR (AT91_CAST(AT91_REG *) 0x00000280) // (NVIC_ICPR) Clear Pending Register #define NVIC_IABR (AT91_CAST(AT91_REG *) 0x00000300) // (NVIC_IABR) Active Bit Register #define NVIC_IPR (AT91_CAST(AT91_REG *) 0x00000400) // (NVIC_IPR) Interrupt Mask Register #define NVIC_CPUID (AT91_CAST(AT91_REG *) 0x00000D00) // (NVIC_CPUID) CPUID Base Register #define NVIC_ICSR (AT91_CAST(AT91_REG *) 0x00000D04) // (NVIC_ICSR) Interrupt Control State Register #define NVIC_VTOFFR (AT91_CAST(AT91_REG *) 0x00000D08) // (NVIC_VTOFFR) Vector Table Offset Register #define NVIC_AIRCR (AT91_CAST(AT91_REG *) 0x00000D0C) // (NVIC_AIRCR) Application Interrupt/Reset Control Reg #define NVIC_SCR (AT91_CAST(AT91_REG *) 0x00000D10) // (NVIC_SCR) System Control Register #define NVIC_CCR (AT91_CAST(AT91_REG *) 0x00000D14) // (NVIC_CCR) Configuration Control Register #define NVIC_HAND4PR (AT91_CAST(AT91_REG *) 0x00000D18) // (NVIC_HAND4PR) System Handlers 4-7 Priority Register #define NVIC_HAND8PR (AT91_CAST(AT91_REG *) 0x00000D1C) // (NVIC_HAND8PR) System Handlers 8-11 Priority Register #define NVIC_HAND12PR (AT91_CAST(AT91_REG *) 0x00000D20) // (NVIC_HAND12PR) System Handlers 12-15 Priority Register #define NVIC_HANDCSR (AT91_CAST(AT91_REG *) 0x00000D24) // (NVIC_HANDCSR) System Handler Control and State Register #define NVIC_CFSR (AT91_CAST(AT91_REG *) 0x00000D28) // (NVIC_CFSR) Configurable Fault Status Register #define NVIC_HFSR (AT91_CAST(AT91_REG *) 0x00000D2C) // (NVIC_HFSR) Hard Fault Status Register #define NVIC_DFSR (AT91_CAST(AT91_REG *) 0x00000D30) // (NVIC_DFSR) Debug Fault Status Register #define NVIC_MMAR (AT91_CAST(AT91_REG *) 0x00000D34) // (NVIC_MMAR) Mem Manage Address Register #define NVIC_BFAR (AT91_CAST(AT91_REG *) 0x00000D38) // (NVIC_BFAR) Bus Fault Address Register #define NVIC_AFSR (AT91_CAST(AT91_REG *) 0x00000D3C) // (NVIC_AFSR) Auxiliary Fault Status Register #define NVIC_PFR0 (AT91_CAST(AT91_REG *) 0x00000D40) // (NVIC_PFR0) Processor Feature register0 #define NVIC_PFR1 (AT91_CAST(AT91_REG *) 0x00000D44) // (NVIC_PFR1) Processor Feature register1 #define NVIC_DFR0 (AT91_CAST(AT91_REG *) 0x00000D48) // (NVIC_DFR0) Debug Feature register0 #define NVIC_AFR0 (AT91_CAST(AT91_REG *) 0x00000D4C) // (NVIC_AFR0) Auxiliary Feature register0 #define NVIC_MMFR0 (AT91_CAST(AT91_REG *) 0x00000D50) // (NVIC_MMFR0) Memory Model Feature register0 #define NVIC_MMFR1 (AT91_CAST(AT91_REG *) 0x00000D54) // (NVIC_MMFR1) Memory Model Feature register1 #define NVIC_MMFR2 (AT91_CAST(AT91_REG *) 0x00000D58) // (NVIC_MMFR2) Memory Model Feature register2 #define NVIC_MMFR3 (AT91_CAST(AT91_REG *) 0x00000D5C) // (NVIC_MMFR3) Memory Model Feature register3 #define NVIC_ISAR0 (AT91_CAST(AT91_REG *) 0x00000D60) // (NVIC_ISAR0) ISA Feature register0 #define NVIC_ISAR1 (AT91_CAST(AT91_REG *) 0x00000D64) // (NVIC_ISAR1) ISA Feature register1 #define NVIC_ISAR2 (AT91_CAST(AT91_REG *) 0x00000D68) // (NVIC_ISAR2) ISA Feature register2 #define NVIC_ISAR3 (AT91_CAST(AT91_REG *) 0x00000D6C) // (NVIC_ISAR3) ISA Feature register3 #define NVIC_ISAR4 (AT91_CAST(AT91_REG *) 0x00000D70) // (NVIC_ISAR4) ISA Feature register4 #define NVIC_STIR (AT91_CAST(AT91_REG *) 0x00000F00) // (NVIC_STIR) Software Trigger Interrupt Register #define NVIC_PID4 (AT91_CAST(AT91_REG *) 0x00000FD0) // (NVIC_PID4) Peripheral identification register #define NVIC_PID5 (AT91_CAST(AT91_REG *) 0x00000FD4) // (NVIC_PID5) Peripheral identification register #define NVIC_PID6 (AT91_CAST(AT91_REG *) 0x00000FD8) // (NVIC_PID6) Peripheral identification register #define NVIC_PID7 (AT91_CAST(AT91_REG *) 0x00000FDC) // (NVIC_PID7) Peripheral identification register #define NVIC_PID0 (AT91_CAST(AT91_REG *) 0x00000FE0) // (NVIC_PID0) Peripheral identification register b7:0 #define NVIC_PID1 (AT91_CAST(AT91_REG *) 0x00000FE4) // (NVIC_PID1) Peripheral identification register b15:8 #define NVIC_PID2 (AT91_CAST(AT91_REG *) 0x00000FE8) // (NVIC_PID2) Peripheral identification register b23:16 #define NVIC_PID3 (AT91_CAST(AT91_REG *) 0x00000FEC) // (NVIC_PID3) Peripheral identification register b31:24 #define NVIC_CID0 (AT91_CAST(AT91_REG *) 0x00000FF0) // (NVIC_CID0) Component identification register b7:0 #define NVIC_CID1 (AT91_CAST(AT91_REG *) 0x00000FF4) // (NVIC_CID1) Component identification register b15:8 #define NVIC_CID2 (AT91_CAST(AT91_REG *) 0x00000FF8) // (NVIC_CID2) Component identification register b23:16 #define NVIC_CID3 (AT91_CAST(AT91_REG *) 0x00000FFC) // (NVIC_CID3) Component identification register b31:24 #endif // -------- NVIC_ICTR : (NVIC Offset: 0x4) Interrupt Controller Type Register -------- #define AT91C_NVIC_INTLINESNUM (0xF << 0) // (NVIC) Total number of interrupt lines #define AT91C_NVIC_INTLINESNUM_32 (0x0) // (NVIC) up to 32 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_64 (0x1) // (NVIC) up to 64 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_96 (0x2) // (NVIC) up to 96 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_128 (0x3) // (NVIC) up to 128 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_160 (0x4) // (NVIC) up to 160 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_192 (0x5) // (NVIC) up to 192 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_224 (0x6) // (NVIC) up to 224 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_256 (0x7) // (NVIC) up to 256 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_288 (0x8) // (NVIC) up to 288 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_320 (0x9) // (NVIC) up to 320 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_352 (0xA) // (NVIC) up to 352 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_384 (0xB) // (NVIC) up to 384 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_416 (0xC) // (NVIC) up to 416 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_448 (0xD) // (NVIC) up to 448 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_480 (0xE) // (NVIC) up to 480 interrupt lines supported #define AT91C_NVIC_INTLINESNUM_496 (0xF) // (NVIC) up to 496 interrupt lines supported) // -------- NVIC_STICKCSR : (NVIC Offset: 0x10) SysTick Control and Status Register -------- #define AT91C_NVIC_STICKENABLE (0x1 << 0) // (NVIC) SysTick counter enable. #define AT91C_NVIC_STICKINT (0x1 << 1) // (NVIC) SysTick interrupt enable. #define AT91C_NVIC_STICKCLKSOURCE (0x1 << 2) // (NVIC) Reference clock selection. #define AT91C_NVIC_STICKCOUNTFLAG (0x1 << 16) // (NVIC) Return 1 if timer counted to 0 since last read. // -------- NVIC_STICKRVR : (NVIC Offset: 0x14) SysTick Reload Value Register -------- #define AT91C_NVIC_STICKRELOAD (0xFFFFFF << 0) // (NVIC) SysTick reload value. // -------- NVIC_STICKCVR : (NVIC Offset: 0x18) SysTick Current Value Register -------- #define AT91C_NVIC_STICKCURRENT (0x7FFFFFFF << 0) // (NVIC) SysTick current value. // -------- NVIC_STICKCALVR : (NVIC Offset: 0x1c) SysTick Calibration Value Register -------- #define AT91C_NVIC_STICKTENMS (0xFFFFFF << 0) // (NVIC) Reload value to use for 10ms timing. #define AT91C_NVIC_STICKSKEW (0x1 << 30) // (NVIC) Read as 1 if the calibration value is not exactly 10ms because of clock frequency. #define AT91C_NVIC_STICKNOREF (0x1 << 31) // (NVIC) Read as 1 if the reference clock is not provided. // -------- NVIC_IPR : (NVIC Offset: 0x400) Interrupt Priority Registers -------- #define AT91C_NVIC_PRI_N (0xFF << 0) // (NVIC) Priority of interrupt N (0, 4, 8, etc) #define AT91C_NVIC_PRI_N1 (0xFF << 8) // (NVIC) Priority of interrupt N+1 (1, 5, 9, etc) #define AT91C_NVIC_PRI_N2 (0xFF << 16) // (NVIC) Priority of interrupt N+2 (2, 6, 10, etc) #define AT91C_NVIC_PRI_N3 (0xFF << 24) // (NVIC) Priority of interrupt N+3 (3, 7, 11, etc) // -------- NVIC_CPUID : (NVIC Offset: 0xd00) CPU ID Base Register -------- #define AT91C_NVIC_REVISION (0xF << 0) // (NVIC) Implementation defined revision number. #define AT91C_NVIC_PARTNO (0xFFF << 4) // (NVIC) Number of processor within family #define AT91C_NVIC_CONSTANT (0xF << 16) // (NVIC) Reads as 0xF #define AT91C_NVIC_VARIANT (0xF << 20) // (NVIC) Implementation defined variant number. #define AT91C_NVIC_IMPLEMENTER (0xFF << 24) // (NVIC) Implementer code. ARM is 0x41 // -------- NVIC_ICSR : (NVIC Offset: 0xd04) Interrupt Control State Register -------- #define AT91C_NVIC_VECTACTIVE (0x1FF << 0) // (NVIC) Read-only Active ISR number field #define AT91C_NVIC_RETTOBASE (0x1 << 11) // (NVIC) Read-only #define AT91C_NVIC_VECTPENDING (0x1FF << 12) // (NVIC) Read-only Pending ISR number field #define AT91C_NVIC_ISRPENDING (0x1 << 22) // (NVIC) Read-only Interrupt pending flag. #define AT91C_NVIC_ISRPREEMPT (0x1 << 23) // (NVIC) Read-only You must only use this at debug time #define AT91C_NVIC_PENDSTCLR (0x1 << 25) // (NVIC) Write-only Clear pending SysTick bit #define AT91C_NVIC_PENDSTSET (0x1 << 26) // (NVIC) Read/write Set a pending SysTick bit #define AT91C_NVIC_PENDSVCLR (0x1 << 27) // (NVIC) Write-only Clear pending pendSV bit #define AT91C_NVIC_PENDSVSET (0x1 << 28) // (NVIC) Read/write Set pending pendSV bit #define AT91C_NVIC_NMIPENDSET (0x1 << 31) // (NVIC) Read/write Set pending NMI // -------- NVIC_VTOFFR : (NVIC Offset: 0xd08) Vector Table Offset Register -------- #define AT91C_NVIC_TBLOFF (0x3FFFFF << 7) // (NVIC) Vector table base offset field #define AT91C_NVIC_TBLBASE (0x1 << 29) // (NVIC) Table base is in Code (0) or RAM (1) #define AT91C_NVIC_TBLBASE_CODE (0x0 << 29) // (NVIC) Table base is in CODE #define AT91C_NVIC_TBLBASE_RAM (0x1 << 29) // (NVIC) Table base is in RAM // -------- NVIC_AIRCR : (NVIC Offset: 0xd0c) Application Interrupt and Reset Control Register -------- #define AT91C_NVIC_VECTRESET (0x1 << 0) // (NVIC) System Reset bit #define AT91C_NVIC_VECTCLRACTIVE (0x1 << 1) // (NVIC) Clear active vector bit #define AT91C_NVIC_SYSRESETREQ (0x1 << 2) // (NVIC) Causes a signal to be asserted to the outer system that indicates a reset is requested #define AT91C_NVIC_PRIGROUP (0x7 << 8) // (NVIC) Interrupt priority grouping field #define AT91C_NVIC_PRIGROUP_3 (0x3 << 8) // (NVIC) indicates four bits of pre-emption priority, none bit of subpriority #define AT91C_NVIC_PRIGROUP_4 (0x4 << 8) // (NVIC) indicates three bits of pre-emption priority, one bit of subpriority #define AT91C_NVIC_PRIGROUP_5 (0x5 << 8) // (NVIC) indicates two bits of pre-emption priority, two bits of subpriority #define AT91C_NVIC_PRIGROUP_6 (0x6 << 8) // (NVIC) indicates one bit of pre-emption priority, three bits of subpriority #define AT91C_NVIC_PRIGROUP_7 (0x7 << 8) // (NVIC) indicates no pre-emption priority, four bits of subpriority #define AT91C_NVIC_ENDIANESS (0x1 << 15) // (NVIC) Data endianness bit #define AT91C_NVIC_VECTKEY (0xFFFF << 16) // (NVIC) Register key // -------- NVIC_SCR : (NVIC Offset: 0xd10) System Control Register -------- #define AT91C_NVIC_SLEEPONEXIT (0x1 << 1) // (NVIC) Sleep on exit when returning from Handler mode to Thread mode #define AT91C_NVIC_SLEEPDEEP (0x1 << 2) // (NVIC) Sleep deep bit #define AT91C_NVIC_SEVONPEND (0x1 << 4) // (NVIC) When enabled, this causes WFE to wake up when an interrupt moves from inactive to pended // -------- NVIC_CCR : (NVIC Offset: 0xd14) Configuration Control Register -------- #define AT91C_NVIC_NONEBASETHRDENA (0x1 << 0) // (NVIC) When 0, default, It is only possible to enter Thread mode when returning from the last exception #define AT91C_NVIC_USERSETMPEND (0x1 << 1) // (NVIC) #define AT91C_NVIC_UNALIGN_TRP (0x1 << 3) // (NVIC) Trap for unaligned access #define AT91C_NVIC_DIV_0_TRP (0x1 << 4) // (NVIC) Trap on Divide by 0 #define AT91C_NVIC_BFHFNMIGN (0x1 << 8) // (NVIC) #define AT91C_NVIC_STKALIGN (0x1 << 9) // (NVIC) // -------- NVIC_HAND4PR : (NVIC Offset: 0xd18) System Handlers 4-7 Priority Register -------- #define AT91C_NVIC_PRI_4 (0xFF << 0) // (NVIC) #define AT91C_NVIC_PRI_5 (0xFF << 8) // (NVIC) #define AT91C_NVIC_PRI_6 (0xFF << 16) // (NVIC) #define AT91C_NVIC_PRI_7 (0xFF << 24) // (NVIC) // -------- NVIC_HAND8PR : (NVIC Offset: 0xd1c) System Handlers 8-11 Priority Register -------- #define AT91C_NVIC_PRI_8 (0xFF << 0) // (NVIC) #define AT91C_NVIC_PRI_9 (0xFF << 8) // (NVIC) #define AT91C_NVIC_PRI_10 (0xFF << 16) // (NVIC) #define AT91C_NVIC_PRI_11 (0xFF << 24) // (NVIC) // -------- NVIC_HAND12PR : (NVIC Offset: 0xd20) System Handlers 12-15 Priority Register -------- #define AT91C_NVIC_PRI_12 (0xFF << 0) // (NVIC) #define AT91C_NVIC_PRI_13 (0xFF << 8) // (NVIC) #define AT91C_NVIC_PRI_14 (0xFF << 16) // (NVIC) #define AT91C_NVIC_PRI_15 (0xFF << 24) // (NVIC) // -------- NVIC_HANDCSR : (NVIC Offset: 0xd24) System Handler Control and State Register -------- #define AT91C_NVIC_MEMFAULTACT (0x1 << 0) // (NVIC) #define AT91C_NVIC_BUSFAULTACT (0x1 << 1) // (NVIC) #define AT91C_NVIC_USGFAULTACT (0x1 << 3) // (NVIC) #define AT91C_NVIC_SVCALLACT (0x1 << 7) // (NVIC) #define AT91C_NVIC_MONITORACT (0x1 << 8) // (NVIC) #define AT91C_NVIC_PENDSVACT (0x1 << 10) // (NVIC) #define AT91C_NVIC_SYSTICKACT (0x1 << 11) // (NVIC) #define AT91C_NVIC_USGFAULTPENDED (0x1 << 12) // (NVIC) #define AT91C_NVIC_MEMFAULTPENDED (0x1 << 13) // (NVIC) #define AT91C_NVIC_BUSFAULTPENDED (0x1 << 14) // (NVIC) #define AT91C_NVIC_SVCALLPENDED (0x1 << 15) // (NVIC) #define AT91C_NVIC_MEMFAULTENA (0x1 << 16) // (NVIC) #define AT91C_NVIC_BUSFAULTENA (0x1 << 17) // (NVIC) #define AT91C_NVIC_USGFAULTENA (0x1 << 18) // (NVIC) // -------- NVIC_CFSR : (NVIC Offset: 0xd28) Configurable Fault Status Registers -------- #define AT91C_NVIC_MEMMANAGE (0xFF << 0) // (NVIC) #define AT91C_NVIC_BUSFAULT (0xFF << 8) // (NVIC) #define AT91C_NVIC_USAGEFAULT (0xFF << 16) // (NVIC) // -------- NVIC_BFAR : (NVIC Offset: 0xd38) Bus Fault Address Register -------- #define AT91C_NVIC_IBUSERR (0x1 << 0) // (NVIC) This bit indicates a bus fault on an instruction prefetch #define AT91C_NVIC_PRECISERR (0x1 << 1) // (NVIC) Precise data access error. The BFAR is written with the faulting address #define AT91C_NVIC_IMPRECISERR (0x1 << 2) // (NVIC) Imprecise data access error #define AT91C_NVIC_UNSTKERR (0x1 << 3) // (NVIC) This bit indicates a derived bus fault has occurred on exception return #define AT91C_NVIC_STKERR (0x1 << 4) // (NVIC) This bit indicates a derived bus fault has occurred on exception entry #define AT91C_NVIC_BFARVALID (0x1 << 7) // (NVIC) This bit is set if the BFAR register has valid contents // -------- NVIC_PFR0 : (NVIC Offset: 0xd40) Processor Feature register0 (ID_PFR0) -------- #define AT91C_NVIC_ID_PFR0_0 (0xF << 0) // (NVIC) State0 (T-bit == 0) #define AT91C_NVIC_ID_PRF0_1 (0xF << 4) // (NVIC) State1 (T-bit == 1) // -------- NVIC_PFR1 : (NVIC Offset: 0xd44) Processor Feature register1 (ID_PFR1) -------- #define AT91C_NVIC_ID_PRF1_MODEL (0xF << 8) // (NVIC) Microcontroller programmers model // -------- NVIC_DFR0 : (NVIC Offset: 0xd48) Debug Feature register0 (ID_DFR0) -------- #define AT91C_NVIC_ID_DFR0_MODEL (0xF << 20) // (NVIC) Microcontroller Debug Model memory mapped // -------- NVIC_MMFR0 : (NVIC Offset: 0xd50) Memory Model Feature register0 (ID_MMFR0) -------- #define AT91C_NVIC_ID_MMFR0_PMSA (0xF << 4) // (NVIC) Microcontroller Debug Model memory mapped #define AT91C_NVIC_ID_MMFR0_CACHE (0xF << 8) // (NVIC) Microcontroller Debug Model memory mapped // ***************************************************************************** // SOFTWARE API DEFINITION FOR NESTED vector Interrupt Controller // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_MPU { AT91_REG MPU_TYPE; // MPU Type Register AT91_REG MPU_CTRL; // MPU Control Register AT91_REG MPU_REG_NB; // MPU Region Number Register AT91_REG MPU_REG_BASE_ADDR; // MPU Region Base Address Register AT91_REG MPU_ATTR_SIZE; // MPU Attribute and Size Register AT91_REG MPU_REG_BASE_ADDR1; // MPU Region Base Address Register alias 1 AT91_REG MPU_ATTR_SIZE1; // MPU Attribute and Size Register alias 1 AT91_REG MPU_REG_BASE_ADDR2; // MPU Region Base Address Register alias 2 AT91_REG MPU_ATTR_SIZE2; // MPU Attribute and Size Register alias 2 AT91_REG MPU_REG_BASE_ADDR3; // MPU Region Base Address Register alias 3 AT91_REG MPU_ATTR_SIZE3; // MPU Attribute and Size Register alias 3 } AT91S_MPU, *AT91PS_MPU; #else #define MPU_TYPE (AT91_CAST(AT91_REG *) 0x00000000) // (MPU_TYPE) MPU Type Register #define MPU_CTRL (AT91_CAST(AT91_REG *) 0x00000004) // (MPU_CTRL) MPU Control Register #define MPU_REG_NB (AT91_CAST(AT91_REG *) 0x00000008) // (MPU_REG_NB) MPU Region Number Register #define MPU_REG_BASE_ADDR (AT91_CAST(AT91_REG *) 0x0000000C) // (MPU_REG_BASE_ADDR) MPU Region Base Address Register #define MPU_ATTR_SIZE (AT91_CAST(AT91_REG *) 0x00000010) // (MPU_ATTR_SIZE) MPU Attribute and Size Register #define MPU_REG_BASE_ADDR1 (AT91_CAST(AT91_REG *) 0x00000014) // (MPU_REG_BASE_ADDR1) MPU Region Base Address Register alias 1 #define MPU_ATTR_SIZE1 (AT91_CAST(AT91_REG *) 0x00000018) // (MPU_ATTR_SIZE1) MPU Attribute and Size Register alias 1 #define MPU_REG_BASE_ADDR2 (AT91_CAST(AT91_REG *) 0x0000001C) // (MPU_REG_BASE_ADDR2) MPU Region Base Address Register alias 2 #define MPU_ATTR_SIZE2 (AT91_CAST(AT91_REG *) 0x00000020) // (MPU_ATTR_SIZE2) MPU Attribute and Size Register alias 2 #define MPU_REG_BASE_ADDR3 (AT91_CAST(AT91_REG *) 0x00000024) // (MPU_REG_BASE_ADDR3) MPU Region Base Address Register alias 3 #define MPU_ATTR_SIZE3 (AT91_CAST(AT91_REG *) 0x00000028) // (MPU_ATTR_SIZE3) MPU Attribute and Size Register alias 3 #endif // -------- MPU_TYPE : (MPU Offset: 0x0) -------- #define AT91C_MPU_SEPARATE (0x1 << 0) // (MPU) #define AT91C_MPU_DREGION (0xFF << 8) // (MPU) #define AT91C_MPU_IREGION (0xFF << 16) // (MPU) // -------- MPU_CTRL : (MPU Offset: 0x4) -------- #define AT91C_MPU_ENABLE (0x1 << 0) // (MPU) #define AT91C_MPU_HFNMIENA (0x1 << 1) // (MPU) #define AT91C_MPU_PRIVDEFENA (0x1 << 2) // (MPU) // -------- MPU_REG_NB : (MPU Offset: 0x8) -------- #define AT91C_MPU_REGION (0xFF << 0) // (MPU) // -------- MPU_REG_BASE_ADDR : (MPU Offset: 0xc) -------- #define AT91C_MPU_REG (0xF << 0) // (MPU) #define AT91C_MPU_VALID (0x1 << 4) // (MPU) #define AT91C_MPU_ADDR (0x3FFFFFF << 5) // (MPU) // -------- MPU_ATTR_SIZE : (MPU Offset: 0x10) -------- #define AT91C_MPU_ENA (0x1 << 0) // (MPU) #define AT91C_MPU_SIZE (0xF << 1) // (MPU) #define AT91C_MPU_SRD (0xFF << 8) // (MPU) #define AT91C_MPU_B (0x1 << 16) // (MPU) #define AT91C_MPU_C (0x1 << 17) // (MPU) #define AT91C_MPU_S (0x1 << 18) // (MPU) #define AT91C_MPU_TEX (0x7 << 19) // (MPU) #define AT91C_MPU_AP (0x7 << 24) // (MPU) #define AT91C_MPU_XN (0x7 << 28) // (MPU) // ***************************************************************************** // SOFTWARE API DEFINITION FOR CORTEX_M3 Registers // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_CM3 { AT91_REG CM3_CPUID; // CPU ID Base Register AT91_REG CM3_ICSR; // Interrupt Control State Register AT91_REG CM3_VTOR; // Vector Table Offset Register AT91_REG CM3_AIRCR; // Application Interrupt and Reset Control Register AT91_REG CM3_SCR; // System Controller Register AT91_REG CM3_CCR; // Configuration Control Register AT91_REG CM3_SHPR[3]; // System Handler Priority Register AT91_REG CM3_SHCSR; // System Handler Control and State Register } AT91S_CM3, *AT91PS_CM3; #else #define CM3_CPUID (AT91_CAST(AT91_REG *) 0x00000000) // (CM3_CPUID) CPU ID Base Register #define CM3_ICSR (AT91_CAST(AT91_REG *) 0x00000004) // (CM3_ICSR) Interrupt Control State Register #define CM3_VTOR (AT91_CAST(AT91_REG *) 0x00000008) // (CM3_VTOR) Vector Table Offset Register #define CM3_AIRCR (AT91_CAST(AT91_REG *) 0x0000000C) // (CM3_AIRCR) Application Interrupt and Reset Control Register #define CM3_SCR (AT91_CAST(AT91_REG *) 0x00000010) // (CM3_SCR) System Controller Register #define CM3_CCR (AT91_CAST(AT91_REG *) 0x00000014) // (CM3_CCR) Configuration Control Register #define CM3_SHPR (AT91_CAST(AT91_REG *) 0x00000018) // (CM3_SHPR) System Handler Priority Register #define CM3_SHCSR (AT91_CAST(AT91_REG *) 0x00000024) // (CM3_SHCSR) System Handler Control and State Register #endif // -------- CM3_CPUID : (CM3 Offset: 0x0) -------- // -------- CM3_AIRCR : (CM3 Offset: 0xc) -------- #define AT91C_CM3_SYSRESETREQ (0x1 << 2) // (CM3) A reset is requested by the processor. // -------- CM3_SCR : (CM3 Offset: 0x10) -------- #define AT91C_CM3_SLEEPONEXIT (0x1 << 1) // (CM3) Sleep on exit when returning from Handler mode to Thread mode. Enables interrupt driven applications to avoid returning to empty main application. #define AT91C_CM3_SLEEPDEEP (0x1 << 2) // (CM3) Sleep deep bit. #define AT91C_CM3_SEVONPEND (0x1 << 4) // (CM3) When enabled, this causes WFE to wake up when an interrupt moves from inactive to pended. // -------- CM3_SHCSR : (CM3 Offset: 0x24) -------- #define AT91C_CM3_SYSTICKACT (0x1 << 11) // (CM3) Reads as 1 if SysTick is active. // ***************************************************************************** // SOFTWARE API DEFINITION FOR Peripheral DMA Controller // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_PDC { AT91_REG PDC_RPR; // Receive Pointer Register AT91_REG PDC_RCR; // Receive Counter Register AT91_REG PDC_TPR; // Transmit Pointer Register AT91_REG PDC_TCR; // Transmit Counter Register AT91_REG PDC_RNPR; // Receive Next Pointer Register AT91_REG PDC_RNCR; // Receive Next Counter Register AT91_REG PDC_TNPR; // Transmit Next Pointer Register AT91_REG PDC_TNCR; // Transmit Next Counter Register AT91_REG PDC_PTCR; // PDC Transfer Control Register AT91_REG PDC_PTSR; // PDC Transfer Status Register } AT91S_PDC, *AT91PS_PDC; #else #define PDC_RPR (AT91_CAST(AT91_REG *) 0x00000000) // (PDC_RPR) Receive Pointer Register #define PDC_RCR (AT91_CAST(AT91_REG *) 0x00000004) // (PDC_RCR) Receive Counter Register #define PDC_TPR (AT91_CAST(AT91_REG *) 0x00000008) // (PDC_TPR) Transmit Pointer Register #define PDC_TCR (AT91_CAST(AT91_REG *) 0x0000000C) // (PDC_TCR) Transmit Counter Register #define PDC_RNPR (AT91_CAST(AT91_REG *) 0x00000010) // (PDC_RNPR) Receive Next Pointer Register #define PDC_RNCR (AT91_CAST(AT91_REG *) 0x00000014) // (PDC_RNCR) Receive Next Counter Register #define PDC_TNPR (AT91_CAST(AT91_REG *) 0x00000018) // (PDC_TNPR) Transmit Next Pointer Register #define PDC_TNCR (AT91_CAST(AT91_REG *) 0x0000001C) // (PDC_TNCR) Transmit Next Counter Register #define PDC_PTCR (AT91_CAST(AT91_REG *) 0x00000020) // (PDC_PTCR) PDC Transfer Control Register #define PDC_PTSR (AT91_CAST(AT91_REG *) 0x00000024) // (PDC_PTSR) PDC Transfer Status Register #endif // -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- #define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable #define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable #define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable #define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable // -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- // ***************************************************************************** // SOFTWARE API DEFINITION FOR Debug Unit // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_DBGU { AT91_REG DBGU_CR; // Control Register AT91_REG DBGU_MR; // Mode Register AT91_REG DBGU_IER; // Interrupt Enable Register AT91_REG DBGU_IDR; // Interrupt Disable Register AT91_REG DBGU_IMR; // Interrupt Mask Register AT91_REG DBGU_CSR; // Channel Status Register AT91_REG DBGU_RHR; // Receiver Holding Register AT91_REG DBGU_THR; // Transmitter Holding Register AT91_REG DBGU_BRGR; // Baud Rate Generator Register AT91_REG Reserved0[9]; // AT91_REG DBGU_FNTR; // Force NTRST Register AT91_REG Reserved1[40]; // AT91_REG DBGU_ADDRSIZE; // DBGU ADDRSIZE REGISTER AT91_REG DBGU_IPNAME1; // DBGU IPNAME1 REGISTER AT91_REG DBGU_IPNAME2; // DBGU IPNAME2 REGISTER AT91_REG DBGU_FEATURES; // DBGU FEATURES REGISTER AT91_REG DBGU_VER; // DBGU VERSION REGISTER AT91_REG DBGU_RPR; // Receive Pointer Register AT91_REG DBGU_RCR; // Receive Counter Register AT91_REG DBGU_TPR; // Transmit Pointer Register AT91_REG DBGU_TCR; // Transmit Counter Register AT91_REG DBGU_RNPR; // Receive Next Pointer Register AT91_REG DBGU_RNCR; // Receive Next Counter Register AT91_REG DBGU_TNPR; // Transmit Next Pointer Register AT91_REG DBGU_TNCR; // Transmit Next Counter Register AT91_REG DBGU_PTCR; // PDC Transfer Control Register AT91_REG DBGU_PTSR; // PDC Transfer Status Register AT91_REG Reserved2[6]; // AT91_REG DBGU_CIDR; // Chip ID Register AT91_REG DBGU_EXID; // Chip ID Extension Register } AT91S_DBGU, *AT91PS_DBGU; #else #define DBGU_CR (AT91_CAST(AT91_REG *) 0x00000000) // (DBGU_CR) Control Register #define DBGU_MR (AT91_CAST(AT91_REG *) 0x00000004) // (DBGU_MR) Mode Register #define DBGU_IER (AT91_CAST(AT91_REG *) 0x00000008) // (DBGU_IER) Interrupt Enable Register #define DBGU_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (DBGU_IDR) Interrupt Disable Register #define DBGU_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (DBGU_IMR) Interrupt Mask Register #define DBGU_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (DBGU_CSR) Channel Status Register #define DBGU_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (DBGU_RHR) Receiver Holding Register #define DBGU_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (DBGU_THR) Transmitter Holding Register #define DBGU_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (DBGU_BRGR) Baud Rate Generator Register #define DBGU_FNTR (AT91_CAST(AT91_REG *) 0x00000048) // (DBGU_FNTR) Force NTRST Register #define DBGU_ADDRSIZE (AT91_CAST(AT91_REG *) 0x000000EC) // (DBGU_ADDRSIZE) DBGU ADDRSIZE REGISTER #define DBGU_IPNAME1 (AT91_CAST(AT91_REG *) 0x000000F0) // (DBGU_IPNAME1) DBGU IPNAME1 REGISTER #define DBGU_IPNAME2 (AT91_CAST(AT91_REG *) 0x000000F4) // (DBGU_IPNAME2) DBGU IPNAME2 REGISTER #define DBGU_FEATURES (AT91_CAST(AT91_REG *) 0x000000F8) // (DBGU_FEATURES) DBGU FEATURES REGISTER #define DBGU_VER (AT91_CAST(AT91_REG *) 0x000000FC) // (DBGU_VER) DBGU VERSION REGISTER #define DBGU_CIDR (AT91_CAST(AT91_REG *) 0x00000140) // (DBGU_CIDR) Chip ID Register #define DBGU_EXID (AT91_CAST(AT91_REG *) 0x00000144) // (DBGU_EXID) Chip ID Extension Register #endif // -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- #define AT91C_DBGU_RSTRX (0x1 << 2) // (DBGU) Reset Receiver #define AT91C_DBGU_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter #define AT91C_DBGU_RXEN (0x1 << 4) // (DBGU) Receiver Enable #define AT91C_DBGU_RXDIS (0x1 << 5) // (DBGU) Receiver Disable #define AT91C_DBGU_TXEN (0x1 << 6) // (DBGU) Transmitter Enable #define AT91C_DBGU_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable #define AT91C_DBGU_RSTSTA (0x1 << 8) // (DBGU) Reset Status Bits // -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- #define AT91C_DBGU_PAR (0x7 << 9) // (DBGU) Parity type #define AT91C_DBGU_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity #define AT91C_DBGU_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity #define AT91C_DBGU_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) #define AT91C_DBGU_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) #define AT91C_DBGU_PAR_NONE (0x4 << 9) // (DBGU) No Parity #define AT91C_DBGU_CHMODE (0x3 << 14) // (DBGU) Channel Mode #define AT91C_DBGU_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The debug unit channel operates as an RX/TX debug unit. #define AT91C_DBGU_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. #define AT91C_DBGU_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. #define AT91C_DBGU_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. // -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- #define AT91C_DBGU_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt #define AT91C_DBGU_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt #define AT91C_DBGU_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt #define AT91C_DBGU_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt #define AT91C_DBGU_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt #define AT91C_DBGU_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt #define AT91C_DBGU_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt #define AT91C_DBGU_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt #define AT91C_DBGU_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt #define AT91C_DBGU_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt #define AT91C_DBGU_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt #define AT91C_DBGU_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt // -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- // -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- // -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- // -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- #define AT91C_DBGU_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG // ***************************************************************************** // SOFTWARE API DEFINITION FOR Parallel Input Output Controler // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_PIO { AT91_REG PIO_PER; // PIO Enable Register AT91_REG PIO_PDR; // PIO Disable Register AT91_REG PIO_PSR; // PIO Status Register AT91_REG Reserved0[1]; // AT91_REG PIO_OER; // Output Enable Register AT91_REG PIO_ODR; // Output Disable Registerr AT91_REG PIO_OSR; // Output Status Register AT91_REG Reserved1[1]; // AT91_REG PIO_IFER; // Input Filter Enable Register AT91_REG PIO_IFDR; // Input Filter Disable Register AT91_REG PIO_IFSR; // Input Filter Status Register AT91_REG Reserved2[1]; // AT91_REG PIO_SODR; // Set Output Data Register AT91_REG PIO_CODR; // Clear Output Data Register AT91_REG PIO_ODSR; // Output Data Status Register AT91_REG PIO_PDSR; // Pin Data Status Register AT91_REG PIO_IER; // Interrupt Enable Register AT91_REG PIO_IDR; // Interrupt Disable Register AT91_REG PIO_IMR; // Interrupt Mask Register AT91_REG PIO_ISR; // Interrupt Status Register AT91_REG PIO_MDER; // Multi-driver Enable Register AT91_REG PIO_MDDR; // Multi-driver Disable Register AT91_REG PIO_MDSR; // Multi-driver Status Register AT91_REG Reserved3[1]; // AT91_REG PIO_PPUDR; // Pull-up Disable Register AT91_REG PIO_PPUER; // Pull-up Enable Register AT91_REG PIO_PPUSR; // Pull-up Status Register AT91_REG Reserved4[1]; // AT91_REG PIO_ABSR; // Peripheral AB Select Register AT91_REG Reserved5[3]; // AT91_REG PIO_SCIFSR; // System Clock Glitch Input Filter Select Register AT91_REG PIO_DIFSR; // Debouncing Input Filter Select Register AT91_REG PIO_IFDGSR; // Glitch or Debouncing Input Filter Clock Selection Status Register AT91_REG PIO_SCDR; // Slow Clock Divider Debouncing Register AT91_REG Reserved6[4]; // AT91_REG PIO_OWER; // Output Write Enable Register AT91_REG PIO_OWDR; // Output Write Disable Register AT91_REG PIO_OWSR; // Output Write Status Register AT91_REG Reserved7[1]; // AT91_REG PIO_AIMER; // Additional Interrupt Modes Enable Register AT91_REG PIO_AIMDR; // Additional Interrupt Modes Disables Register AT91_REG PIO_AIMMR; // Additional Interrupt Modes Mask Register AT91_REG Reserved8[1]; // AT91_REG PIO_ESR; // Edge Select Register AT91_REG PIO_LSR; // Level Select Register AT91_REG PIO_ELSR; // Edge/Level Status Register AT91_REG Reserved9[1]; // AT91_REG PIO_FELLSR; // Falling Edge/Low Level Select Register AT91_REG PIO_REHLSR; // Rising Edge/ High Level Select Register AT91_REG PIO_FRLHSR; // Fall/Rise - Low/High Status Register AT91_REG Reserved10[1]; // AT91_REG PIO_LOCKSR; // Lock Status Register AT91_REG Reserved11[6]; // AT91_REG PIO_VER; // PIO VERSION REGISTER AT91_REG Reserved12[8]; // AT91_REG PIO_KER; // Keypad Controller Enable Register AT91_REG PIO_KRCR; // Keypad Controller Row Column Register AT91_REG PIO_KDR; // Keypad Controller Debouncing Register AT91_REG Reserved13[1]; // AT91_REG PIO_KIER; // Keypad Controller Interrupt Enable Register AT91_REG PIO_KIDR; // Keypad Controller Interrupt Disable Register AT91_REG PIO_KIMR; // Keypad Controller Interrupt Mask Register AT91_REG PIO_KSR; // Keypad Controller Status Register AT91_REG PIO_KKPR; // Keypad Controller Key Press Register AT91_REG PIO_KKRR; // Keypad Controller Key Release Register } AT91S_PIO, *AT91PS_PIO; #else #define PIO_PER (AT91_CAST(AT91_REG *) 0x00000000) // (PIO_PER) PIO Enable Register #define PIO_PDR (AT91_CAST(AT91_REG *) 0x00000004) // (PIO_PDR) PIO Disable Register #define PIO_PSR (AT91_CAST(AT91_REG *) 0x00000008) // (PIO_PSR) PIO Status Register #define PIO_OER (AT91_CAST(AT91_REG *) 0x00000010) // (PIO_OER) Output Enable Register #define PIO_ODR (AT91_CAST(AT91_REG *) 0x00000014) // (PIO_ODR) Output Disable Registerr #define PIO_OSR (AT91_CAST(AT91_REG *) 0x00000018) // (PIO_OSR) Output Status Register #define PIO_IFER (AT91_CAST(AT91_REG *) 0x00000020) // (PIO_IFER) Input Filter Enable Register #define PIO_IFDR (AT91_CAST(AT91_REG *) 0x00000024) // (PIO_IFDR) Input Filter Disable Register #define PIO_IFSR (AT91_CAST(AT91_REG *) 0x00000028) // (PIO_IFSR) Input Filter Status Register #define PIO_SODR (AT91_CAST(AT91_REG *) 0x00000030) // (PIO_SODR) Set Output Data Register #define PIO_CODR (AT91_CAST(AT91_REG *) 0x00000034) // (PIO_CODR) Clear Output Data Register #define PIO_ODSR (AT91_CAST(AT91_REG *) 0x00000038) // (PIO_ODSR) Output Data Status Register #define PIO_PDSR (AT91_CAST(AT91_REG *) 0x0000003C) // (PIO_PDSR) Pin Data Status Register #define PIO_IER (AT91_CAST(AT91_REG *) 0x00000040) // (PIO_IER) Interrupt Enable Register #define PIO_IDR (AT91_CAST(AT91_REG *) 0x00000044) // (PIO_IDR) Interrupt Disable Register #define PIO_IMR (AT91_CAST(AT91_REG *) 0x00000048) // (PIO_IMR) Interrupt Mask Register #define PIO_ISR (AT91_CAST(AT91_REG *) 0x0000004C) // (PIO_ISR) Interrupt Status Register #define PIO_MDER (AT91_CAST(AT91_REG *) 0x00000050) // (PIO_MDER) Multi-driver Enable Register #define PIO_MDDR (AT91_CAST(AT91_REG *) 0x00000054) // (PIO_MDDR) Multi-driver Disable Register #define PIO_MDSR (AT91_CAST(AT91_REG *) 0x00000058) // (PIO_MDSR) Multi-driver Status Register #define PIO_PPUDR (AT91_CAST(AT91_REG *) 0x00000060) // (PIO_PPUDR) Pull-up Disable Register #define PIO_PPUER (AT91_CAST(AT91_REG *) 0x00000064) // (PIO_PPUER) Pull-up Enable Register #define PIO_PPUSR (AT91_CAST(AT91_REG *) 0x00000068) // (PIO_PPUSR) Pull-up Status Register #define PIO_ABSR (AT91_CAST(AT91_REG *) 0x00000070) // (PIO_ABSR) Peripheral AB Select Register #define PIO_SCIFSR (AT91_CAST(AT91_REG *) 0x00000080) // (PIO_SCIFSR) System Clock Glitch Input Filter Select Register #define PIO_DIFSR (AT91_CAST(AT91_REG *) 0x00000084) // (PIO_DIFSR) Debouncing Input Filter Select Register #define PIO_IFDGSR (AT91_CAST(AT91_REG *) 0x00000088) // (PIO_IFDGSR) Glitch or Debouncing Input Filter Clock Selection Status Register #define PIO_SCDR (AT91_CAST(AT91_REG *) 0x0000008C) // (PIO_SCDR) Slow Clock Divider Debouncing Register #define PIO_OWER (AT91_CAST(AT91_REG *) 0x000000A0) // (PIO_OWER) Output Write Enable Register #define PIO_OWDR (AT91_CAST(AT91_REG *) 0x000000A4) // (PIO_OWDR) Output Write Disable Register #define PIO_OWSR (AT91_CAST(AT91_REG *) 0x000000A8) // (PIO_OWSR) Output Write Status Register #define PIO_AIMER (AT91_CAST(AT91_REG *) 0x000000B0) // (PIO_AIMER) Additional Interrupt Modes Enable Register #define PIO_AIMDR (AT91_CAST(AT91_REG *) 0x000000B4) // (PIO_AIMDR) Additional Interrupt Modes Disables Register #define PIO_AIMMR (AT91_CAST(AT91_REG *) 0x000000B8) // (PIO_AIMMR) Additional Interrupt Modes Mask Register #define PIO_ESR (AT91_CAST(AT91_REG *) 0x000000C0) // (PIO_ESR) Edge Select Register #define PIO_LSR (AT91_CAST(AT91_REG *) 0x000000C4) // (PIO_LSR) Level Select Register #define PIO_ELSR (AT91_CAST(AT91_REG *) 0x000000C8) // (PIO_ELSR) Edge/Level Status Register #define PIO_FELLSR (AT91_CAST(AT91_REG *) 0x000000D0) // (PIO_FELLSR) Falling Edge/Low Level Select Register #define PIO_REHLSR (AT91_CAST(AT91_REG *) 0x000000D4) // (PIO_REHLSR) Rising Edge/ High Level Select Register #define PIO_FRLHSR (AT91_CAST(AT91_REG *) 0x000000D8) // (PIO_FRLHSR) Fall/Rise - Low/High Status Register #define PIO_LOCKSR (AT91_CAST(AT91_REG *) 0x000000E0) // (PIO_LOCKSR) Lock Status Register #define PIO_VER (AT91_CAST(AT91_REG *) 0x000000FC) // (PIO_VER) PIO VERSION REGISTER #define PIO_KER (AT91_CAST(AT91_REG *) 0x00000120) // (PIO_KER) Keypad Controller Enable Register #define PIO_KRCR (AT91_CAST(AT91_REG *) 0x00000124) // (PIO_KRCR) Keypad Controller Row Column Register #define PIO_KDR (AT91_CAST(AT91_REG *) 0x00000128) // (PIO_KDR) Keypad Controller Debouncing Register #define PIO_KIER (AT91_CAST(AT91_REG *) 0x00000130) // (PIO_KIER) Keypad Controller Interrupt Enable Register #define PIO_KIDR (AT91_CAST(AT91_REG *) 0x00000134) // (PIO_KIDR) Keypad Controller Interrupt Disable Register #define PIO_KIMR (AT91_CAST(AT91_REG *) 0x00000138) // (PIO_KIMR) Keypad Controller Interrupt Mask Register #define PIO_KSR (AT91_CAST(AT91_REG *) 0x0000013C) // (PIO_KSR) Keypad Controller Status Register #define PIO_KKPR (AT91_CAST(AT91_REG *) 0x00000140) // (PIO_KKPR) Keypad Controller Key Press Register #define PIO_KKRR (AT91_CAST(AT91_REG *) 0x00000144) // (PIO_KKRR) Keypad Controller Key Release Register #endif // -------- PIO_KER : (PIO Offset: 0x120) Keypad Controller Enable Register -------- #define AT91C_PIO_KCE (0x1 << 0) // (PIO) Keypad Controller Enable // -------- PIO_KRCR : (PIO Offset: 0x124) Keypad Controller Row Column Register -------- #define AT91C_PIO_NBR (0x7 << 0) // (PIO) Number of Columns of the Keypad Matrix #define AT91C_PIO_NBC (0x7 << 8) // (PIO) Number of Rows of the Keypad Matrix // -------- PIO_KDR : (PIO Offset: 0x128) Keypad Controller Debouncing Register -------- #define AT91C_PIO_DBC (0x3FF << 0) // (PIO) Debouncing Value // -------- PIO_KIER : (PIO Offset: 0x130) Keypad Controller Interrupt Enable Register -------- #define AT91C_PIO_KPR (0x1 << 0) // (PIO) Key Press Interrupt Enable #define AT91C_PIO_KRL (0x1 << 1) // (PIO) Key Release Interrupt Enable // -------- PIO_KIDR : (PIO Offset: 0x134) Keypad Controller Interrupt Disable Register -------- // -------- PIO_KIMR : (PIO Offset: 0x138) Keypad Controller Interrupt Mask Register -------- // -------- PIO_KSR : (PIO Offset: 0x13c) Keypad Controller Status Register -------- #define AT91C_PIO_NBKPR (0x3 << 8) // (PIO) Number of Simultaneous Key Presses #define AT91C_PIO_NBKRL (0x3 << 16) // (PIO) Number of Simultaneous Key Releases // -------- PIO_KKPR : (PIO Offset: 0x140) Keypad Controller Key Press Register -------- #define AT91C_KEY0ROW (0x7 << 0) // (PIO) Row index of the first detected Key Press #define AT91C_KEY0COL (0x7 << 4) // (PIO) Column index of the first detected Key Press #define AT91C_KEY1ROW (0x7 << 8) // (PIO) Row index of the second detected Key Press #define AT91C_KEY1COL (0x7 << 12) // (PIO) Column index of the second detected Key Press #define AT91C_KEY2ROW (0x7 << 16) // (PIO) Row index of the third detected Key Press #define AT91C_KEY2COL (0x7 << 20) // (PIO) Column index of the third detected Key Press #define AT91C_KEY3ROW (0x7 << 24) // (PIO) Row index of the fourth detected Key Press #define AT91C_KEY3COL (0x7 << 28) // (PIO) Column index of the fourth detected Key Press // -------- PIO_KKRR : (PIO Offset: 0x144) Keypad Controller Key Release Register -------- // ***************************************************************************** // SOFTWARE API DEFINITION FOR Power Management Controler // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_PMC { AT91_REG PMC_SCER; // System Clock Enable Register AT91_REG PMC_SCDR; // System Clock Disable Register AT91_REG PMC_SCSR; // System Clock Status Register AT91_REG Reserved0[1]; // AT91_REG PMC_PCER; // Peripheral Clock Enable Register AT91_REG PMC_PCDR; // Peripheral Clock Disable Register AT91_REG PMC_PCSR; // Peripheral Clock Status Register AT91_REG PMC_UCKR; // UTMI Clock Configuration Register AT91_REG PMC_MOR; // Main Oscillator Register AT91_REG PMC_MCFR; // Main Clock Frequency Register AT91_REG PMC_PLLAR; // PLL Register AT91_REG Reserved1[1]; // AT91_REG PMC_MCKR; // Master Clock Register AT91_REG Reserved2[3]; // AT91_REG PMC_PCKR[8]; // Programmable Clock Register AT91_REG PMC_IER; // Interrupt Enable Register AT91_REG PMC_IDR; // Interrupt Disable Register AT91_REG PMC_SR; // Status Register AT91_REG PMC_IMR; // Interrupt Mask Register AT91_REG PMC_FSMR; // Fast Startup Mode Register AT91_REG PMC_FSPR; // Fast Startup Polarity Register AT91_REG PMC_FOCR; // Fault Output Clear Register AT91_REG Reserved3[28]; // AT91_REG PMC_ADDRSIZE; // PMC ADDRSIZE REGISTER AT91_REG PMC_IPNAME1; // PMC IPNAME1 REGISTER AT91_REG PMC_IPNAME2; // PMC IPNAME2 REGISTER AT91_REG PMC_FEATURES; // PMC FEATURES REGISTER AT91_REG PMC_VER; // APMC VERSION REGISTER } AT91S_PMC, *AT91PS_PMC; #else #define PMC_SCER (AT91_CAST(AT91_REG *) 0x00000000) // (PMC_SCER) System Clock Enable Register #define PMC_SCDR (AT91_CAST(AT91_REG *) 0x00000004) // (PMC_SCDR) System Clock Disable Register #define PMC_SCSR (AT91_CAST(AT91_REG *) 0x00000008) // (PMC_SCSR) System Clock Status Register #define PMC_PCER (AT91_CAST(AT91_REG *) 0x00000010) // (PMC_PCER) Peripheral Clock Enable Register #define PMC_PCDR (AT91_CAST(AT91_REG *) 0x00000014) // (PMC_PCDR) Peripheral Clock Disable Register #define PMC_PCSR (AT91_CAST(AT91_REG *) 0x00000018) // (PMC_PCSR) Peripheral Clock Status Register #define CKGR_UCKR (AT91_CAST(AT91_REG *) 0x0000001C) // (CKGR_UCKR) UTMI Clock Configuration Register #define CKGR_MOR (AT91_CAST(AT91_REG *) 0x00000020) // (CKGR_MOR) Main Oscillator Register #define CKGR_MCFR (AT91_CAST(AT91_REG *) 0x00000024) // (CKGR_MCFR) Main Clock Frequency Register #define CKGR_PLLAR (AT91_CAST(AT91_REG *) 0x00000028) // (CKGR_PLLAR) PLL Register #define PMC_MCKR (AT91_CAST(AT91_REG *) 0x00000030) // (PMC_MCKR) Master Clock Register #define PMC_PCKR (AT91_CAST(AT91_REG *) 0x00000040) // (PMC_PCKR) Programmable Clock Register #define PMC_IER (AT91_CAST(AT91_REG *) 0x00000060) // (PMC_IER) Interrupt Enable Register #define PMC_IDR (AT91_CAST(AT91_REG *) 0x00000064) // (PMC_IDR) Interrupt Disable Register #define PMC_SR (AT91_CAST(AT91_REG *) 0x00000068) // (PMC_SR) Status Register #define PMC_IMR (AT91_CAST(AT91_REG *) 0x0000006C) // (PMC_IMR) Interrupt Mask Register #define PMC_FSMR (AT91_CAST(AT91_REG *) 0x00000070) // (PMC_FSMR) Fast Startup Mode Register #define PMC_FSPR (AT91_CAST(AT91_REG *) 0x00000074) // (PMC_FSPR) Fast Startup Polarity Register #define PMC_FOCR (AT91_CAST(AT91_REG *) 0x00000078) // (PMC_FOCR) Fault Output Clear Register #define PMC_ADDRSIZE (AT91_CAST(AT91_REG *) 0x000000EC) // (PMC_ADDRSIZE) PMC ADDRSIZE REGISTER #define PMC_IPNAME1 (AT91_CAST(AT91_REG *) 0x000000F0) // (PMC_IPNAME1) PMC IPNAME1 REGISTER #define PMC_IPNAME2 (AT91_CAST(AT91_REG *) 0x000000F4) // (PMC_IPNAME2) PMC IPNAME2 REGISTER #define PMC_FEATURES (AT91_CAST(AT91_REG *) 0x000000F8) // (PMC_FEATURES) PMC FEATURES REGISTER #define PMC_VER (AT91_CAST(AT91_REG *) 0x000000FC) // (PMC_VER) APMC VERSION REGISTER #endif // -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- #define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock #define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output #define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output #define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output // -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- // -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- // -------- CKGR_UCKR : (PMC Offset: 0x1c) UTMI Clock Configuration Register -------- #define AT91C_CKGR_UPLLEN (0x1 << 16) // (PMC) UTMI PLL Enable #define AT91C_CKGR_UPLLEN_DISABLED (0x0 << 16) // (PMC) The UTMI PLL is disabled #define AT91C_CKGR_UPLLEN_ENABLED (0x1 << 16) // (PMC) The UTMI PLL is enabled #define AT91C_CKGR_UPLLCOUNT (0xF << 20) // (PMC) UTMI Oscillator Start-up Time #define AT91C_CKGR_BIASEN (0x1 << 24) // (PMC) UTMI BIAS Enable #define AT91C_CKGR_BIASEN_DISABLED (0x0 << 24) // (PMC) The UTMI BIAS is disabled #define AT91C_CKGR_BIASEN_ENABLED (0x1 << 24) // (PMC) The UTMI BIAS is enabled #define AT91C_CKGR_BIASCOUNT (0xF << 28) // (PMC) UTMI BIAS Start-up Time // -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- #define AT91C_CKGR_MOSCXTEN (0x1 << 0) // (PMC) Main Crystal Oscillator Enable #define AT91C_CKGR_MOSCXTBY (0x1 << 1) // (PMC) Main Crystal Oscillator Bypass #define AT91C_CKGR_WAITMODE (0x1 << 2) // (PMC) Main Crystal Oscillator Bypass #define AT91C_CKGR_MOSCRCEN (0x1 << 3) // (PMC) Main On-Chip RC Oscillator Enable #define AT91C_CKGR_MOSCRCF (0x7 << 4) // (PMC) Main On-Chip RC Oscillator Frequency Selection #define AT91C_CKGR_MOSCXTST (0xFF << 8) // (PMC) Main Crystal Oscillator Start-up Time #define AT91C_CKGR_KEY (0xFF << 16) // (PMC) Clock Generator Controller Writing Protection Key #define AT91C_CKGR_MOSCSEL (0x1 << 24) // (PMC) Main Oscillator Selection #define AT91C_CKGR_CFDEN (0x1 << 25) // (PMC) Clock Failure Detector Enable // -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- #define AT91C_CKGR_MAINF (0xFFFF << 0) // (PMC) Main Clock Frequency #define AT91C_CKGR_MAINRDY (0x1 << 16) // (PMC) Main Clock Ready // -------- CKGR_PLLAR : (PMC Offset: 0x28) PLL A Register -------- #define AT91C_CKGR_DIVA (0xFF << 0) // (PMC) Divider Selected #define AT91C_CKGR_DIVA_0 (0x0) // (PMC) Divider output is 0 #define AT91C_CKGR_DIVA_BYPASS (0x1) // (PMC) Divider is bypassed #define AT91C_CKGR_PLLACOUNT (0x3F << 8) // (PMC) PLLA Counter #define AT91C_CKGR_STMODE (0x3 << 14) // (PMC) Start Mode #define AT91C_CKGR_STMODE_0 (0x0 << 14) // (PMC) Fast startup #define AT91C_CKGR_STMODE_1 (0x1 << 14) // (PMC) Reserved #define AT91C_CKGR_STMODE_2 (0x2 << 14) // (PMC) Normal startup #define AT91C_CKGR_STMODE_3 (0x3 << 14) // (PMC) Reserved #define AT91C_CKGR_MULA (0x7FF << 16) // (PMC) PLL Multiplier #define AT91C_CKGR_SRC (0x1 << 29) // (PMC) // -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- #define AT91C_PMC_CSS (0x7 << 0) // (PMC) Programmable Clock Selection #define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected #define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected #define AT91C_PMC_CSS_PLLA_CLK (0x2) // (PMC) Clock from PLL A is selected #define AT91C_PMC_CSS_UPLL_CLK (0x3) // (PMC) Clock from UPLL is selected #define AT91C_PMC_CSS_SYS_CLK (0x4) // (PMC) System clock is selected #define AT91C_PMC_PRES (0x7 << 4) // (PMC) Programmable Clock Prescaler #define AT91C_PMC_PRES_CLK (0x0 << 4) // (PMC) Selected clock #define AT91C_PMC_PRES_CLK_2 (0x1 << 4) // (PMC) Selected clock divided by 2 #define AT91C_PMC_PRES_CLK_4 (0x2 << 4) // (PMC) Selected clock divided by 4 #define AT91C_PMC_PRES_CLK_8 (0x3 << 4) // (PMC) Selected clock divided by 8 #define AT91C_PMC_PRES_CLK_16 (0x4 << 4) // (PMC) Selected clock divided by 16 #define AT91C_PMC_PRES_CLK_32 (0x5 << 4) // (PMC) Selected clock divided by 32 #define AT91C_PMC_PRES_CLK_64 (0x6 << 4) // (PMC) Selected clock divided by 64 #define AT91C_PMC_PRES_CLK_3 (0x7 << 4) // (PMC) Selected clock divided by 3 // -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- // -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- #define AT91C_PMC_MOSCXTS (0x1 << 0) // (PMC) Main Crystal Oscillator Status/Enable/Disable/Mask #define AT91C_PMC_LOCKA (0x1 << 1) // (PMC) PLL A Status/Enable/Disable/Mask #define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) Master Clock Status/Enable/Disable/Mask #define AT91C_PMC_LOCKU (0x1 << 6) // (PMC) PLL UTMI Status/Enable/Disable/Mask #define AT91C_PMC_PCKRDY0 (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask #define AT91C_PMC_PCKRDY1 (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask #define AT91C_PMC_PCKRDY2 (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask #define AT91C_PMC_MOSCSELS (0x1 << 16) // (PMC) Main Oscillator Selection Status #define AT91C_PMC_MOSCRCS (0x1 << 17) // (PMC) Main On-Chip RC Oscillator Status #define AT91C_PMC_CFDEV (0x1 << 18) // (PMC) Clock Failure Detector Event // -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- // -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- #define AT91C_PMC_OSCSELS (0x1 << 7) // (PMC) Slow Clock Oscillator Selection #define AT91C_PMC_CFDS (0x1 << 19) // (PMC) Clock Failure Detector Status #define AT91C_PMC_FOS (0x1 << 20) // (PMC) Clock Failure Detector Fault Output Status // -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- // -------- PMC_FSMR : (PMC Offset: 0x70) Fast Startup Mode Register -------- #define AT91C_PMC_FSTT (0xFFFF << 0) // (PMC) Fast Start-up Input Enable 0 to 15 #define AT91C_PMC_RTTAL (0x1 << 16) // (PMC) RTT Alarm Enable #define AT91C_PMC_RTCAL (0x1 << 17) // (PMC) RTC Alarm Enable #define AT91C_PMC_USBAL (0x1 << 18) // (PMC) USB Alarm Enable #define AT91C_PMC_LPM (0x1 << 20) // (PMC) Low Power Mode // -------- PMC_FSPR : (PMC Offset: 0x74) Fast Startup Polarity Register -------- #define AT91C_PMC_FSTP (0xFFFF << 0) // (PMC) Fast Start-up Input Polarity 0 to 15 // -------- PMC_FOCR : (PMC Offset: 0x78) Fault Output Clear Register -------- #define AT91C_PMC_FOCLR (0x1 << 0) // (PMC) Fault Output Clear // ***************************************************************************** // SOFTWARE API DEFINITION FOR Clock Generator Controler // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_CKGR { AT91_REG CKGR_UCKR; // UTMI Clock Configuration Register AT91_REG CKGR_MOR; // Main Oscillator Register AT91_REG CKGR_MCFR; // Main Clock Frequency Register AT91_REG CKGR_PLLAR; // PLL Register } AT91S_CKGR, *AT91PS_CKGR; #else #endif // -------- CKGR_UCKR : (CKGR Offset: 0x0) UTMI Clock Configuration Register -------- // -------- CKGR_MOR : (CKGR Offset: 0x4) Main Oscillator Register -------- // -------- CKGR_MCFR : (CKGR Offset: 0x8) Main Clock Frequency Register -------- // -------- CKGR_PLLAR : (CKGR Offset: 0xc) PLL A Register -------- // ***************************************************************************** // SOFTWARE API DEFINITION FOR Reset Controller Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_RSTC { AT91_REG RSTC_RCR; // Reset Control Register AT91_REG RSTC_RSR; // Reset Status Register AT91_REG RSTC_RMR; // Reset Mode Register AT91_REG Reserved0[60]; // AT91_REG RSTC_VER; // Version Register } AT91S_RSTC, *AT91PS_RSTC; #else #define RSTC_RCR (AT91_CAST(AT91_REG *) 0x00000000) // (RSTC_RCR) Reset Control Register #define RSTC_RSR (AT91_CAST(AT91_REG *) 0x00000004) // (RSTC_RSR) Reset Status Register #define RSTC_RMR (AT91_CAST(AT91_REG *) 0x00000008) // (RSTC_RMR) Reset Mode Register #define RSTC_VER (AT91_CAST(AT91_REG *) 0x000000FC) // (RSTC_VER) Version Register #endif // -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- #define AT91C_RSTC_PROCRST (0x1 << 0) // (RSTC) Processor Reset #define AT91C_RSTC_ICERST (0x1 << 1) // (RSTC) ICE Interface Reset #define AT91C_RSTC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset #define AT91C_RSTC_EXTRST (0x1 << 3) // (RSTC) External Reset #define AT91C_RSTC_KEY (0xA5 << 24) // (RSTC) Password // -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- #define AT91C_RSTC_URSTS (0x1 << 0) // (RSTC) User Reset Status #define AT91C_RSTC_RSTTYP (0x7 << 8) // (RSTC) Reset Type #define AT91C_RSTC_RSTTYP_GENERAL (0x0 << 8) // (RSTC) General reset. Both VDDCORE and VDDBU rising. #define AT91C_RSTC_RSTTYP_WAKEUP (0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. #define AT91C_RSTC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. #define AT91C_RSTC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. #define AT91C_RSTC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. #define AT91C_RSTC_NRSTL (0x1 << 16) // (RSTC) NRST pin level #define AT91C_RSTC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. // -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- #define AT91C_RSTC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable #define AT91C_RSTC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable #define AT91C_RSTC_ERSTL (0xF << 8) // (RSTC) User Reset Enable // ***************************************************************************** // SOFTWARE API DEFINITION FOR Supply Controller Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_SUPC { AT91_REG SUPC_CR; // Supply Controller Control Register AT91_REG SUPC_SMMR; // Supply Controller Supply Monitor Mode Register AT91_REG SUPC_MR; // Supply Controller Mode Register AT91_REG SUPC_WUMR; // Supply Controller Wake Up Mode Register AT91_REG SUPC_WUIR; // Supply Controller Wake Up Inputs Register AT91_REG SUPC_SR; // Supply Controller Status Register } AT91S_SUPC, *AT91PS_SUPC; #else #define SUPC_CR (AT91_CAST(AT91_REG *) 0x00000000) // Supply Controller Control Register #define SUPC_SMMR (AT91_CAST(AT91_REG *) 0x00000004) // Supply Controller Supply Monitor Mode Register #define SUPC_MR (AT91_CAST(AT91_REG *) 0x00000008) // Supply Controller Mode Register #define SUPC_WUMR (AT91_CAST(AT91_REG *) 0x0000000C) // Supply Controller Wake Up Mode Register #define SUPC_WUIR (AT91_CAST(AT91_REG *) 0x00000010) // Supply Controller Wake Up Inputs Register #define SUPC_SR (AT91_CAST(AT91_REG *) 0x00000014) // Supply Controller Status Register #endif // -------- SUPC_CR : (SUPC Offset: 0x00) Supply Controller Control Register -------- #define AT91C_SUPC_CR_VROFF (0x1 << 2) // (SUPC) Voltage Regulator Off #define AT91C_SUPC_CR_VROFF_NO_EFFECT (0x0 << 2) // (SUPC) no effect. #define AT91C_SUPC_CR_VROFF_STOP_VREG (0x1 << 2) // (SUPC) if KEY is correct, asserts vddcore_nreset and stops the voltage regulator. #define AT91C_SUPC_CR_XTALSEL (0x1 << 3) // (SUPC) Crystal Oscillator Select #define AT91C_SUPC_CR_XTALSEL_NO_EFFECT (0x0 << 3) // (SUPC) no effect. #define AT91C_SUPC_CR_XTALSEL_CRYSTAL_SEL (0x1 << 3) // (SUPC) if KEY is correct, switches the slow clock on the crystal oscillator output. #define AT91C_SUPC_CR_KEY (0xA5 << 24) // (SUPC) Password // -------- SUPC_SMMR : (SUPC Offset: 0x04) Supply Controller Supply Monitor Mode Register -------- #define AT91C_SUPC_SMMR_SMTH (0xf << 0) // (SUPC) Supply Monitor Threshold #define AT91C_SUPC_SMMR_SMTH_1_9V (0x0 << 0) // (SUPC) 1.9 V #define AT91C_SUPC_SMMR_SMTH_2_0V (0x1 << 0) // (SUPC) 2.0 V #define AT91C_SUPC_SMMR_SMTH_2_1V (0x2 << 0) // (SUPC) 2.1 V #define AT91C_SUPC_SMMR_SMTH_2_2V (0x3 << 0) // (SUPC) 2.2 V #define AT91C_SUPC_SMMR_SMTH_2_3V (0x4 << 0) // (SUPC) 2.3 V #define AT91C_SUPC_SMMR_SMTH_2_4V (0x5 << 0) // (SUPC) 2.4 V #define AT91C_SUPC_SMMR_SMTH_2_5V (0x6 << 0) // (SUPC) 2.5 V #define AT91C_SUPC_SMMR_SMTH_2_6V (0x7 << 0) // (SUPC) 2.6 V #define AT91C_SUPC_SMMR_SMTH_2_7V (0x8 << 0) // (SUPC) 2.7 V #define AT91C_SUPC_SMMR_SMTH_2_8V (0x9 << 0) // (SUPC) 2.8 V #define AT91C_SUPC_SMMR_SMTH_2_9V (0xA << 0) // (SUPC) 2.9 V #define AT91C_SUPC_SMMR_SMTH_3_0V (0xB << 0) // (SUPC) 3.0 V #define AT91C_SUPC_SMMR_SMTH_3_1V (0xC << 0) // (SUPC) 3.1 V #define AT91C_SUPC_SMMR_SMTH_3_2V (0xD << 0) // (SUPC) 3.2 V #define AT91C_SUPC_SMMR_SMTH_3_3V (0xE << 0) // (SUPC) 3.3 V #define AT91C_SUPC_SMMR_SMTH_3_4V (0xF << 0) // (SUPC) 3.4 V #define AT91C_SUPC_SMMR_SMSMPL (0x7 << 8) // (SUPC) Supply Monitor Sampling Period #define AT91C_SUPC_SMMR_SMSMPL_SMD (0x0 << 8) // (SUPC) Supply Monitor disabled #define AT91C_SUPC_SMMR_SMSMPL_CSM (0x1 << 8) // (SUPC) Continuous Supply Monitor #define AT91C_SUPC_SMMR_SMSMPL_32SLCK (0x2 << 8) // (SUPC) Supply Monitor enabled one SLCK period every 32 SLCK periods #define AT91C_SUPC_SMMR_SMSMPL_256SLCK (0x3 << 8) // (SUPC) Supply Monitor enabled one SLCK period every 256 SLCK periods #define AT91C_SUPC_SMMR_SMSMPL_2048SLCK (0x4 << 8) // (SUPC) Supply Monitor enabled one SLCK period every 2,048 SLCK periods #define AT91C_SUPC_SMMR_SMRSTEN (0x1 << 12) // (SUPC) Supply Monitor Reset Enable #define AT91C_SUPC_SMMR_SMRSTEN_NOT_ENABLE (0x0 << 12) // (SUPC) the core reset signal "vddcore_nreset" is not affected when a supply monitor detection occurs. #define AT91C_SUPC_SMMR_SMRSTEN_ENABLE (0x1 << 12) // (SUPC) the core reset signal, vddcore_nreset is asserted when a supply monitor detection occurs. #define AT91C_SUPC_SMMR_SMIEN (0x1 << 13) // (SUPC) Supply Monitor Interrupt Enable #define AT91C_SUPC_SMMR_SMIEN_NOT_ENABLE (0x0 << 13) // (SUPC) the SUPC interrupt signal is not affected when a supply monitor detection occurs. #define AT91C_SUPC_SMMR_SMIEN_ENABLE (0x1 << 13) // (SUPC) the SUPC interrupt signal is asserted when a supply monitor detection occurs. // -------- SUPC_MR : (SUPC Offset: 0x08) Supply Controller Mode Register -------- #define AT91C_SUPC_MR_BODRSTEN (0x1 << 12) // (SUPC) Brownout Detector Reset Enable #define AT91C_SUPC_MR_BODRSTEN_NOT_ENABLE (0x0 << 12) // (SUPC) the core reset signal "vddcore_nreset" is not affected when a brownout detection occurs. #define AT91C_SUPC_MR_BODRSTEN_ENABLE (0x1 << 12) // (SUPC) the core reset signal, vddcore_nreset is asserted when a brownout detection occurs. #define AT91C_SUPC_MR_BODDIS (0x1 << 13) // (SUPC) Brownout Detector Disable #define AT91C_SUPC_MR_BODDIS_ENABLE (0x0 << 13) // (SUPC) the core brownout detector is enabled. #define AT91C_SUPC_MR_BODDIS_DISABLE (0x1 << 13) // (SUPC) the core brownout detector is disabled. #define AT91C_SUPC_MR_VDDIORDY (0x1 << 14) // (SUPC) VDDIO Ready #define AT91C_SUPC_MR_VDDIORDY_VDDIO_REMOVED (0x0 << 14) // (SUPC) VDDIO is removed (used before going to backup mode when backup batteries are used) #define AT91C_SUPC_MR_VDDIORDY_VDDIO_PRESENT (0x1 << 14) // (SUPC) VDDIO is present (used before going to backup mode when backup batteries are used) #define AT91C_SUPC_MR_OSCBYPASS (0x1 << 20) // (SUPC) Oscillator Bypass #define AT91C_SUPC_MR_OSCBYPASS_NO_EFFECT (0x0 << 20) // (SUPC) no effect. Clock selection depends on XTALSEL value. #define AT91C_SUPC_MR_OSCBYPASS_BYPASS (0x1 << 20) // (SUPC) the 32-KHz XTAL oscillator is selected and is put in bypass mode. #define AT91C_SUPC_MR_KEY (0xff << 24) // (SUPC) Password Key // -------- SUPC_WUMR : (SUPC Offset: 0x0C) Supply Controller Wake Up Mode Register -------- #define AT91C_SUPC_WUMR_FWUPEN (0x1 << 0) // (SUPC) Force Wake Up Enable #define AT91C_SUPC_WUMR_FWUPEN_NOT_ENABLE (0x0 << 0) // (SUPC) the Force Wake Up pin has no wake up effect. #define AT91C_SUPC_WUMR_FWUPEN_ENABLE (0x1 << 0) // (SUPC) the Force Wake Up pin low forces the wake up of the core power supply. #define AT91C_SUPC_WUMR_SMEN (0x1 << 1) // (SUPC) Supply Monitor Wake Up Enable #define AT91C_SUPC_WUMR_SMEN_NOT_ENABLE (0x0 << 1) // (SUPC) the supply monitor detection has no wake up effect. #define AT91C_SUPC_WUMR_SMEN_ENABLE (0x1 << 1) // (SUPC) the supply monitor detection forces the wake up of the core power supply. #define AT91C_SUPC_WUMR_RTTEN (0x1 << 2) // (SUPC) Real Time Timer Wake Up Enable #define AT91C_SUPC_WUMR_RTTEN_NOT_ENABLE (0x0 << 2) // (SUPC) the RTT alarm signal has no wake up effect. #define AT91C_SUPC_WUMR_RTTEN_ENABLE (0x1 << 2) // (SUPC) the RTT alarm signal forces the wake up of the core power supply. #define AT91C_SUPC_WUMR_RTCEN (0x1 << 3) // (SUPC) Real Time Clock Wake Up Enable #define AT91C_SUPC_WUMR_RTCEN_NOT_ENABLE (0x0 << 3) // (SUPC) the RTC alarm signal has no wake up effect. #define AT91C_SUPC_WUMR_RTCEN_ENABLE (0x1 << 3) // (SUPC) the RTC alarm signal forces the wake up of the core power supply. #define AT91C_SUPC_WUMR_FWUPDBC (0x7 << 8) // (SUPC) Force Wake Up Debouncer #define AT91C_SUPC_WUMR_FWUPDBC_1SCLK (0x0 << 8) // (SUPC) Immediate, no debouncing, detected active at least on one Slow Clock edge. #define AT91C_SUPC_WUMR_FWUPDBC_3SCLK (0x1 << 8) // (SUPC) FWUP shall be low for at least 3 SLCK periods #define AT91C_SUPC_WUMR_FWUPDBC_32SCLK (0x2 << 8) // (SUPC) FWUP shall be low for at least 32 SLCK periods #define AT91C_SUPC_WUMR_FWUPDBC_512SCLK (0x3 << 8) // (SUPC) FWUP shall be low for at least 512 SLCK periods #define AT91C_SUPC_WUMR_FWUPDBC_4096SCLK (0x4 << 8) // (SUPC) FWUP shall be low for at least 4,096 SLCK periods #define AT91C_SUPC_WUMR_FWUPDBC_32768SCLK (0x5 << 8) // (SUPC) FWUP shall be low for at least 32,768 SLCK periods #define AT91C_SUPC_WUMR_WKUPDBC (0x7 << 12) // (SUPC) Wake Up Inputs Debouncer #define AT91C_SUPC_WUMR_WKUPDBC_1SCLK (0x0 << 12) // (SUPC) Immediate, no debouncing, detected active at least on one Slow Clock edge. #define AT91C_SUPC_WUMR_WKUPDBC_3SCLK (0x1 << 12) // (SUPC) An enabled wake-up input shall be active for at least 3 SLCK periods #define AT91C_SUPC_WUMR_WKUPDBC_32SCLK (0x2 << 12) // (SUPC) An enabled wake-up input shall be active for at least 32 SLCK periods #define AT91C_SUPC_WUMR_WKUPDBC_512SCLK (0x3 << 12) // (SUPC) An enabled wake-up input shall be active for at least 512 SLCK periods #define AT91C_SUPC_WUMR_WKUPDBC_4096SCLK (0x4 << 12) // (SUPC) An enabled wake-up input shall be active for at least 4,096 SLCK periods #define AT91C_SUPC_WUMR_WKUPDBC_32768SCLK (0x5 << 12) // (SUPC) An enabled wake-up input shall be active for at least 32,768 SLCK periods // -------- SUPC_WUIR : (SUPC Offset: 0x10) Supply Controller Wake Up Inputs Register -------- #define AT91C_SUPC_WUIR_WKUPEN0 (0x1 << 0) // (SUPC) Wake Up Input Enable 0 #define AT91C_SUPC_WUIR_WKUPEN0_NOT_ENABLE (0x0 << 0) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN0_ENABLE (0x1 << 0) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN1 (0x1 << 1) // (SUPC) Wake Up Input Enable 1 #define AT91C_SUPC_WUIR_WKUPEN1_NOT_ENABLE (0x0 << 1) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN1_ENABLE (0x1 << 1) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN2 (0x1 << 2) // (SUPC) Wake Up Input Enable 2 #define AT91C_SUPC_WUIR_WKUPEN2_NOT_ENABLE (0x0 << 2) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN2_ENABLE (0x1 << 2) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN3 (0x1 << 3) // (SUPC) Wake Up Input Enable 3 #define AT91C_SUPC_WUIR_WKUPEN3_NOT_ENABLE (0x0 << 3) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN3_ENABLE (0x1 << 3) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN4 (0x1 << 4) // (SUPC) Wake Up Input Enable 4 #define AT91C_SUPC_WUIR_WKUPEN4_NOT_ENABLE (0x0 << 4) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN4_ENABLE (0x1 << 4) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN5 (0x1 << 5) // (SUPC) Wake Up Input Enable 5 #define AT91C_SUPC_WUIR_WKUPEN5_NOT_ENABLE (0x0 << 5) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN5_ENABLE (0x1 << 5) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN6 (0x1 << 6) // (SUPC) Wake Up Input Enable 6 #define AT91C_SUPC_WUIR_WKUPEN6_NOT_ENABLE (0x0 << 6) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN6_ENABLE (0x1 << 6) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN7 (0x1 << 7) // (SUPC) Wake Up Input Enable 7 #define AT91C_SUPC_WUIR_WKUPEN7_NOT_ENABLE (0x0 << 7) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN7_ENABLE (0x1 << 7) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN8 (0x1 << 8) // (SUPC) Wake Up Input Enable 8 #define AT91C_SUPC_WUIR_WKUPEN8_NOT_ENABLE (0x0 << 8) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN8_ENABLE (0x1 << 8) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN9 (0x1 << 9) // (SUPC) Wake Up Input Enable 9 #define AT91C_SUPC_WUIR_WKUPEN9_NOT_ENABLE (0x0 << 9) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN9_ENABLE (0x1 << 9) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN10 (0x1 << 10) // (SUPC) Wake Up Input Enable 10 #define AT91C_SUPC_WUIR_WKUPEN10_NOT_ENABLE (0x0 << 10) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN10_ENABLE (0x1 << 10) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN11 (0x1 << 11) // (SUPC) Wake Up Input Enable 11 #define AT91C_SUPC_WUIR_WKUPEN11_NOT_ENABLE (0x0 << 11) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN11_ENABLE (0x1 << 11) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN12 (0x1 << 12) // (SUPC) Wake Up Input Enable 12 #define AT91C_SUPC_WUIR_WKUPEN12_NOT_ENABLE (0x0 << 12) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN12_ENABLE (0x1 << 12) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN13 (0x1 << 13) // (SUPC) Wake Up Input Enable 13 #define AT91C_SUPC_WUIR_WKUPEN13_NOT_ENABLE (0x0 << 13) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN13_ENABLE (0x1 << 13) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN14 (0x1 << 14) // (SUPC) Wake Up Input Enable 14 #define AT91C_SUPC_WUIR_WKUPEN14_NOT_ENABLE (0x0 << 14) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN14_ENABLE (0x1 << 14) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPEN15 (0x1 << 15) // (SUPC) Wake Up Input Enable 15 #define AT91C_SUPC_WUIR_WKUPEN15_NOT_ENABLE (0x0 << 15) // (SUPC) the corresponding wake-up input has no wake up effect. #define AT91C_SUPC_WUIR_WKUPEN15_ENABLE (0x1 << 15) // (SUPC) the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT0 (0x1 << 16) // (SUPC) Wake Up Input Transition 0 #define AT91C_SUPC_WUIR_WKUPT0_HIGH_TO_LOW (0x0 << 16) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT0_LOW_TO_HIGH (0x1 << 16) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT1 (0x1 << 17) // (SUPC) Wake Up Input Transition 1 #define AT91C_SUPC_WUIR_WKUPT1_HIGH_TO_LOW (0x0 << 17) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT1_LOW_TO_HIGH (0x1 << 17) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT2 (0x1 << 18) // (SUPC) Wake Up Input Transition 2 #define AT91C_SUPC_WUIR_WKUPT2_HIGH_TO_LOW (0x0 << 18) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT2_LOW_TO_HIGH (0x1 << 18) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT3 (0x1 << 19) // (SUPC) Wake Up Input Transition 3 #define AT91C_SUPC_WUIR_WKUPT3_HIGH_TO_LOW (0x0 << 19) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT3_LOW_TO_HIGH (0x1 << 19) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT4 (0x1 << 20) // (SUPC) Wake Up Input Transition 4 #define AT91C_SUPC_WUIR_WKUPT4_HIGH_TO_LOW (0x0 << 20) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT4_LOW_TO_HIGH (0x1 << 20) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT5 (0x1 << 21) // (SUPC) Wake Up Input Transition 5 #define AT91C_SUPC_WUIR_WKUPT5_HIGH_TO_LOW (0x0 << 21) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT5_LOW_TO_HIGH (0x1 << 21) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT6 (0x1 << 22) // (SUPC) Wake Up Input Transition 6 #define AT91C_SUPC_WUIR_WKUPT6_HIGH_TO_LOW (0x0 << 22) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT6_LOW_TO_HIGH (0x1 << 22) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT7 (0x1 << 23) // (SUPC) Wake Up Input Transition 7 #define AT91C_SUPC_WUIR_WKUPT7_HIGH_TO_LOW (0x0 << 23) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT7_LOW_TO_HIGH (0x1 << 23) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT8 (0x1 << 24) // (SUPC) Wake Up Input Transition 8 #define AT91C_SUPC_WUIR_WKUPT8_HIGH_TO_LOW (0x0 << 24) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT8_LOW_TO_HIGH (0x1 << 24) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT9 (0x1 << 25) // (SUPC) Wake Up Input Transition 9 #define AT91C_SUPC_WUIR_WKUPT9_HIGH_TO_LOW (0x0 << 25) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT9_LOW_TO_HIGH (0x1 << 25) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT10 (0x1 << 26) // (SUPC) Wake Up Input Transition 10 #define AT91C_SUPC_WUIR_WKUPT10_HIGH_TO_LOW (0x0 << 26) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT10_LOW_TO_HIGH (0x1 << 26) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT11 (0x1 << 27) // (SUPC) Wake Up Input Transition 11 #define AT91C_SUPC_WUIR_WKUPT11_HIGH_TO_LOW (0x0 << 27) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT11_LOW_TO_HIGH (0x1 << 27) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT12 (0x1 << 28) // (SUPC) Wake Up Input Transition 12 #define AT91C_SUPC_WUIR_WKUPT12_HIGH_TO_LOW (0x0 << 28) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT12_LOW_TO_HIGH (0x1 << 28) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT13 (0x1 << 29) // (SUPC) Wake Up Input Transition 13 #define AT91C_SUPC_WUIR_WKUPT13_HIGH_TO_LOW (0x0 << 29) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT13_LOW_TO_HIGH (0x1 << 29) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT14 (0x1 << 30) // (SUPC) Wake Up Input Transition 14 #define AT91C_SUPC_WUIR_WKUPT14_HIGH_TO_LOW (0x0 << 30) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT14_LOW_TO_HIGH (0x1 << 30) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT15 (0x1 << 31) // (SUPC) Wake Up Input Transition 15 #define AT91C_SUPC_WUIR_WKUPT15_HIGH_TO_LOW (0x0 << 31) // (SUPC) a high to low level transition on the corresponding wake-up input forces the wake up of the core power supply. #define AT91C_SUPC_WUIR_WKUPT15_LOW_TO_HIGH (0x1 << 31) // (SUPC) a low to high level transition on the corresponding wake-up input forces the wake up of the core power supply. // -------- SUPC_SR : (SUPC Offset: 0x14) Supply Controller Status Register -------- #define AT91C_SUPC_SR_FWUPS (0x1 << 0) // (SUPC) FWUP Wake Up Status #define AT91C_SUPC_SR_FWUPS_NO (0x0 << 0) // (SUPC) no wake up due to the assertion of the FWUP pin has occurred since the last read of SUPC_SR. #define AT91C_SUPC_SR_FWUPS_PRESENT (0x1 << 0) // (SUPC) at least one wake up due to the assertion of the FWUP pin has occurred since the last read of SUPC_SR. #define AT91C_SUPC_SR_WKUPS (0x1 << 1) // (SUPC) WKUP Wake Up Status #define AT91C_SUPC_SR_WKUPS_NO (0x0 << 1) // (SUPC) no wake up due to the assertion of the WKUP pins has occurred since the last read of SUPC_SR. #define AT91C_SUPC_SR_WKUPS_PRESENT (0x1 << 1) // (SUPC) at least one wake up due to the assertion of the WKUP pins has occurred since the last read of SUPC_SR. #define AT91C_SUPC_SR_SMWS (0x1 << 2) // (SUPC) Supply Monitor Detection Wake Up Status #define AT91C_SUPC_SR_SMWS_NO (0x0 << 2) // (SUPC) no wake up due to a supply monitor detection has occurred since the last read of SUPC_SR. #define AT91C_SUPC_SR_SMWS_PRESENT (0x1 << 2) // (SUPC) at least one wake up due to a supply monitor detection has occurred since the last read of SUPC_SR. #define AT91C_SUPC_SR_BODRSTS (0x1 << 3) // (SUPC) Brownout Detector Reset Status #define AT91C_SUPC_SR_BODRSTS_NO (0x0 << 3) // (SUPC) no core brownout detection has generated a core reset since the last read of the SUPC_SR. #define AT91C_SUPC_SR_BODRSTS_PRESENT (0x1 << 3) // (SUPC) at least one core brownout detection has generated a core reset since the last read of the SUPC_SR. #define AT91C_SUPC_SR_SMRSTS (0x1 << 4) // (SUPC) Supply Monitor Reset Status #define AT91C_SUPC_SR_SMRSTS_NO (0x0 << 4) // (SUPC) no supply monitor detection has generated a core reset since the last read of the SUPC_SR. #define AT91C_SUPC_SR_SMRSTS_PRESENT (0x1 << 4) // (SUPC) at least one supply monitor detection has generated a core reset since the last read of the SUPC_SR. #define AT91C_SUPC_SR_SMS (0x1 << 5) // (SUPC) Supply Monitor Status #define AT91C_SUPC_SR_SMS_NO (0x0 << 5) // (SUPC) no supply monitor detection since the last read of SUPC_SR. #define AT91C_SUPC_SR_SMS_PRESENT (0x1 << 5) // (SUPC) at least one supply monitor detection since the last read of SUPC_SR. #define AT91C_SUPC_SR_SMOS (0x1 << 6) // (SUPC) Supply Monitor Output Status #define AT91C_SUPC_SR_SMOS_HIGH (0x0 << 6) // (SUPC) the supply monitor detected VDDUTMI higher than its threshold at its last measurement. #define AT91C_SUPC_SR_SMOS_LOW (0x1 << 6) // (SUPC) the supply monitor detected VDDUTMI lower than its threshold at its last measurement. #define AT91C_SUPC_SR_OSCSEL (0x1 << 7) // (SUPC) 32-kHz Oscillator Selection Status #define AT91C_SUPC_SR_OSCSEL_RC (0x0 << 7) // (SUPC) the slow clock, SLCK is generated by the embedded 32-kHz RC oscillator. #define AT91C_SUPC_SR_OSCSEL_CRYST (0x1 << 7) // (SUPC) the slow clock, SLCK is generated by the 32-kHz crystal oscillator. #define AT91C_SUPC_SR_FWUPIS (0x1 << 12) // (SUPC) FWUP Input Status #define AT91C_SUPC_SR_FWUPIS_LOW (0x0 << 12) // (SUPC) FWUP input is tied low. #define AT91C_SUPC_SR_FWUPIS_HIGH (0x1 << 12) // (SUPC) FWUP input is tied high. #define AT91C_SUPC_SR_WKUPIS0 (0x1 << 16) // (SUPC) WKUP Input Status 0 #define AT91C_SUPC_SR_WKUPIS0_DIS (0x0 << 16) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS0_EN (0x1 << 16) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS1 (0x1 << 17) // (SUPC) WKUP Input Status 1 #define AT91C_SUPC_SR_WKUPIS1_DIS (0x0 << 17) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS1_EN (0x1 << 17) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS2 (0x1 << 18) // (SUPC) WKUP Input Status 2 #define AT91C_SUPC_SR_WKUPIS2_DIS (0x0 << 18) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS2_EN (0x1 << 18) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS3 (0x1 << 19) // (SUPC) WKUP Input Status 3 #define AT91C_SUPC_SR_WKUPIS3_DIS (0x0 << 19) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS3_EN (0x1 << 19) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS4 (0x1 << 20) // (SUPC) WKUP Input Status 4 #define AT91C_SUPC_SR_WKUPIS4_DIS (0x0 << 20) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS4_EN (0x1 << 20) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS5 (0x1 << 21) // (SUPC) WKUP Input Status 5 #define AT91C_SUPC_SR_WKUPIS5_DIS (0x0 << 21) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS5_EN (0x1 << 21) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS6 (0x1 << 22) // (SUPC) WKUP Input Status 6 #define AT91C_SUPC_SR_WKUPIS6_DIS (0x0 << 22) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS6_EN (0x1 << 22) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS7 (0x1 << 23) // (SUPC) WKUP Input Status 7 #define AT91C_SUPC_SR_WKUPIS7_DIS (0x0 << 23) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS7_EN (0x1 << 23) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS8 (0x1 << 24) // (SUPC) WKUP Input Status 8 #define AT91C_SUPC_SR_WKUPIS8_DIS (0x0 << 24) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS8_EN (0x1 << 24) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS9 (0x1 << 25) // (SUPC) WKUP Input Status 9 #define AT91C_SUPC_SR_WKUPIS9_DIS (0x0 << 25) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS9_EN (0x1 << 25) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS10 (0x1 << 26) // (SUPC) WKUP Input Status 10 #define AT91C_SUPC_SR_WKUPIS10_DIS (0x0 << 26) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS10_EN (0x1 << 26) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS11 (0x1 << 27) // (SUPC) WKUP Input Status 11 #define AT91C_SUPC_SR_WKUPIS11_DIS (0x0 << 27) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS11_EN (0x1 << 27) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS12 (0x1 << 28) // (SUPC) WKUP Input Status 12 #define AT91C_SUPC_SR_WKUPIS12_DIS (0x0 << 28) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS12_EN (0x1 << 28) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS13 (0x1 << 29) // (SUPC) WKUP Input Status 13 #define AT91C_SUPC_SR_WKUPIS13_DIS (0x0 << 29) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS13_EN (0x1 << 29) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS14 (0x1 << 30) // (SUPC) WKUP Input Status 14 #define AT91C_SUPC_SR_WKUPIS14_DIS (0x0 << 30) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS14_EN (0x1 << 30) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS15 (0x1 << 31) // (SUPC) WKUP Input Status 15 #define AT91C_SUPC_SR_WKUPIS15_DIS (0x0 << 31) // (SUPC) the corresponding wake-up input is disabled, or was inactive at the time the debouncer triggered a wake up event. #define AT91C_SUPC_SR_WKUPIS15_EN (0x1 << 31) // (SUPC) the corresponding wake-up input was active at the time the debouncer triggered a wake up event. // ***************************************************************************** // SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_RTTC { AT91_REG RTTC_RTMR; // Real-time Mode Register AT91_REG RTTC_RTAR; // Real-time Alarm Register AT91_REG RTTC_RTVR; // Real-time Value Register AT91_REG RTTC_RTSR; // Real-time Status Register } AT91S_RTTC, *AT91PS_RTTC; #else #define RTTC_RTMR (AT91_CAST(AT91_REG *) 0x00000000) // (RTTC_RTMR) Real-time Mode Register #define RTTC_RTAR (AT91_CAST(AT91_REG *) 0x00000004) // (RTTC_RTAR) Real-time Alarm Register #define RTTC_RTVR (AT91_CAST(AT91_REG *) 0x00000008) // (RTTC_RTVR) Real-time Value Register #define RTTC_RTSR (AT91_CAST(AT91_REG *) 0x0000000C) // (RTTC_RTSR) Real-time Status Register #endif // -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- #define AT91C_RTTC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value #define AT91C_RTTC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable #define AT91C_RTTC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable #define AT91C_RTTC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart // -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- #define AT91C_RTTC_ALMV (0x0 << 0) // (RTTC) Alarm Value // -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- #define AT91C_RTTC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value // -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- #define AT91C_RTTC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status #define AT91C_RTTC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment // ***************************************************************************** // SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_WDTC { AT91_REG WDTC_WDCR; // Watchdog Control Register AT91_REG WDTC_WDMR; // Watchdog Mode Register AT91_REG WDTC_WDSR; // Watchdog Status Register } AT91S_WDTC, *AT91PS_WDTC; #else #define WDTC_WDCR (AT91_CAST(AT91_REG *) 0x00000000) // (WDTC_WDCR) Watchdog Control Register #define WDTC_WDMR (AT91_CAST(AT91_REG *) 0x00000004) // (WDTC_WDMR) Watchdog Mode Register #define WDTC_WDSR (AT91_CAST(AT91_REG *) 0x00000008) // (WDTC_WDSR) Watchdog Status Register #endif // -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- #define AT91C_WDTC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart #define AT91C_WDTC_KEY (0xFF << 24) // (WDTC) Watchdog KEY Password // -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- #define AT91C_WDTC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart #define AT91C_WDTC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable #define AT91C_WDTC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable #define AT91C_WDTC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart #define AT91C_WDTC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable #define AT91C_WDTC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value #define AT91C_WDTC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt #define AT91C_WDTC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt // -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- #define AT91C_WDTC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow #define AT91C_WDTC_WDERR (0x1 << 1) // (WDTC) Watchdog Error // ***************************************************************************** // SOFTWARE API DEFINITION FOR Real-time Clock Alarm and Parallel Load Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_RTC { AT91_REG RTC_CR; // Control Register AT91_REG RTC_MR; // Mode Register AT91_REG RTC_TIMR; // Time Register AT91_REG RTC_CALR; // Calendar Register AT91_REG RTC_TIMALR; // Time Alarm Register AT91_REG RTC_CALALR; // Calendar Alarm Register AT91_REG RTC_SR; // Status Register AT91_REG RTC_SCCR; // Status Clear Command Register AT91_REG RTC_IER; // Interrupt Enable Register AT91_REG RTC_IDR; // Interrupt Disable Register AT91_REG RTC_IMR; // Interrupt Mask Register AT91_REG RTC_VER; // Valid Entry Register } AT91S_RTC, *AT91PS_RTC; #else #define RTC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (RTC_CR) Control Register #define RTC_MR (AT91_CAST(AT91_REG *) 0x00000004) // (RTC_MR) Mode Register #define RTC_TIMR (AT91_CAST(AT91_REG *) 0x00000008) // (RTC_TIMR) Time Register #define RTC_CALR (AT91_CAST(AT91_REG *) 0x0000000C) // (RTC_CALR) Calendar Register #define RTC_TIMALR (AT91_CAST(AT91_REG *) 0x00000010) // (RTC_TIMALR) Time Alarm Register #define RTC_CALALR (AT91_CAST(AT91_REG *) 0x00000014) // (RTC_CALALR) Calendar Alarm Register #define RTC_SR (AT91_CAST(AT91_REG *) 0x00000018) // (RTC_SR) Status Register #define RTC_SCCR (AT91_CAST(AT91_REG *) 0x0000001C) // (RTC_SCCR) Status Clear Command Register #define RTC_IER (AT91_CAST(AT91_REG *) 0x00000020) // (RTC_IER) Interrupt Enable Register #define RTC_IDR (AT91_CAST(AT91_REG *) 0x00000024) // (RTC_IDR) Interrupt Disable Register #define RTC_IMR (AT91_CAST(AT91_REG *) 0x00000028) // (RTC_IMR) Interrupt Mask Register #define RTC_VER (AT91_CAST(AT91_REG *) 0x0000002C) // (RTC_VER) Valid Entry Register #endif // -------- RTC_CR : (RTC Offset: 0x0) RTC Control Register -------- #define AT91C_RTC_UPDTIM (0x1 << 0) // (RTC) Update Request Time Register #define AT91C_RTC_UPDCAL (0x1 << 1) // (RTC) Update Request Calendar Register #define AT91C_RTC_TIMEVSEL (0x3 << 8) // (RTC) Time Event Selection #define AT91C_RTC_TIMEVSEL_MINUTE (0x0 << 8) // (RTC) Minute change. #define AT91C_RTC_TIMEVSEL_HOUR (0x1 << 8) // (RTC) Hour change. #define AT91C_RTC_TIMEVSEL_DAY24 (0x2 << 8) // (RTC) Every day at midnight. #define AT91C_RTC_TIMEVSEL_DAY12 (0x3 << 8) // (RTC) Every day at noon. #define AT91C_RTC_CALEVSEL (0x3 << 16) // (RTC) Calendar Event Selection #define AT91C_RTC_CALEVSEL_WEEK (0x0 << 16) // (RTC) Week change (every Monday at time 00:00:00). #define AT91C_RTC_CALEVSEL_MONTH (0x1 << 16) // (RTC) Month change (every 01 of each month at time 00:00:00). #define AT91C_RTC_CALEVSEL_YEAR (0x2 << 16) // (RTC) Year change (every January 1 at time 00:00:00). // -------- RTC_MR : (RTC Offset: 0x4) RTC Mode Register -------- #define AT91C_RTC_HRMOD (0x1 << 0) // (RTC) 12-24 hour Mode // -------- RTC_TIMR : (RTC Offset: 0x8) RTC Time Register -------- #define AT91C_RTC_SEC (0x7F << 0) // (RTC) Current Second #define AT91C_RTC_MIN (0x7F << 8) // (RTC) Current Minute #define AT91C_RTC_HOUR (0x3F << 16) // (RTC) Current Hour #define AT91C_RTC_AMPM (0x1 << 22) // (RTC) Ante Meridiem, Post Meridiem Indicator // -------- RTC_CALR : (RTC Offset: 0xc) RTC Calendar Register -------- #define AT91C_RTC_CENT (0x3F << 0) // (RTC) Current Century #define AT91C_RTC_YEAR (0xFF << 8) // (RTC) Current Year #define AT91C_RTC_MONTH (0x1F << 16) // (RTC) Current Month #define AT91C_RTC_DAY (0x7 << 21) // (RTC) Current Day #define AT91C_RTC_DATE (0x3F << 24) // (RTC) Current Date // -------- RTC_TIMALR : (RTC Offset: 0x10) RTC Time Alarm Register -------- #define AT91C_RTC_SECEN (0x1 << 7) // (RTC) Second Alarm Enable #define AT91C_RTC_MINEN (0x1 << 15) // (RTC) Minute Alarm #define AT91C_RTC_HOUREN (0x1 << 23) // (RTC) Current Hour // -------- RTC_CALALR : (RTC Offset: 0x14) RTC Calendar Alarm Register -------- #define AT91C_RTC_MONTHEN (0x1 << 23) // (RTC) Month Alarm Enable #define AT91C_RTC_DATEEN (0x1 << 31) // (RTC) Date Alarm Enable // -------- RTC_SR : (RTC Offset: 0x18) RTC Status Register -------- #define AT91C_RTC_ACKUPD (0x1 << 0) // (RTC) Acknowledge for Update #define AT91C_RTC_ALARM (0x1 << 1) // (RTC) Alarm Flag #define AT91C_RTC_SECEV (0x1 << 2) // (RTC) Second Event #define AT91C_RTC_TIMEV (0x1 << 3) // (RTC) Time Event #define AT91C_RTC_CALEV (0x1 << 4) // (RTC) Calendar event // -------- RTC_SCCR : (RTC Offset: 0x1c) RTC Status Clear Command Register -------- // -------- RTC_IER : (RTC Offset: 0x20) RTC Interrupt Enable Register -------- // -------- RTC_IDR : (RTC Offset: 0x24) RTC Interrupt Disable Register -------- // -------- RTC_IMR : (RTC Offset: 0x28) RTC Interrupt Mask Register -------- // -------- RTC_VER : (RTC Offset: 0x2c) RTC Valid Entry Register -------- #define AT91C_RTC_NVTIM (0x1 << 0) // (RTC) Non valid Time #define AT91C_RTC_NVCAL (0x1 << 1) // (RTC) Non valid Calendar #define AT91C_RTC_NVTIMALR (0x1 << 2) // (RTC) Non valid time Alarm #define AT91C_RTC_NVCALALR (0x1 << 3) // (RTC) Nonvalid Calendar Alarm // ***************************************************************************** // SOFTWARE API DEFINITION FOR Analog to Digital Convertor // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_ADC { AT91_REG ADC_CR; // ADC Control Register AT91_REG ADC_MR; // ADC Mode Register AT91_REG Reserved0[2]; // AT91_REG ADC_CHER; // ADC Channel Enable Register AT91_REG ADC_CHDR; // ADC Channel Disable Register AT91_REG ADC_CHSR; // ADC Channel Status Register AT91_REG ADC_SR; // ADC Status Register AT91_REG ADC_LCDR; // ADC Last Converted Data Register AT91_REG ADC_IER; // ADC Interrupt Enable Register AT91_REG ADC_IDR; // ADC Interrupt Disable Register AT91_REG ADC_IMR; // ADC Interrupt Mask Register AT91_REG ADC_CDR0; // ADC Channel Data Register 0 AT91_REG ADC_CDR1; // ADC Channel Data Register 1 AT91_REG ADC_CDR2; // ADC Channel Data Register 2 AT91_REG ADC_CDR3; // ADC Channel Data Register 3 AT91_REG ADC_CDR4; // ADC Channel Data Register 4 AT91_REG ADC_CDR5; // ADC Channel Data Register 5 AT91_REG ADC_CDR6; // ADC Channel Data Register 6 AT91_REG ADC_CDR7; // ADC Channel Data Register 7 AT91_REG Reserved1[5]; // AT91_REG ADC_ACR; // Analog Control Register AT91_REG ADC_EMR; // Extended Mode Register AT91_REG Reserved2[32]; // AT91_REG ADC_ADDRSIZE; // ADC ADDRSIZE REGISTER AT91_REG ADC_IPNAME1; // ADC IPNAME1 REGISTER AT91_REG ADC_IPNAME2; // ADC IPNAME2 REGISTER AT91_REG ADC_FEATURES; // ADC FEATURES REGISTER AT91_REG ADC_VER; // ADC VERSION REGISTER AT91_REG ADC_RPR; // Receive Pointer Register AT91_REG ADC_RCR; // Receive Counter Register AT91_REG ADC_TPR; // Transmit Pointer Register AT91_REG ADC_TCR; // Transmit Counter Register AT91_REG ADC_RNPR; // Receive Next Pointer Register AT91_REG ADC_RNCR; // Receive Next Counter Register AT91_REG ADC_TNPR; // Transmit Next Pointer Register AT91_REG ADC_TNCR; // Transmit Next Counter Register AT91_REG ADC_PTCR; // PDC Transfer Control Register AT91_REG ADC_PTSR; // PDC Transfer Status Register } AT91S_ADC, *AT91PS_ADC; #else #define ADC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (ADC_CR) ADC Control Register #define ADC_MR (AT91_CAST(AT91_REG *) 0x00000004) // (ADC_MR) ADC Mode Register #define ADC_CHER (AT91_CAST(AT91_REG *) 0x00000010) // (ADC_CHER) ADC Channel Enable Register #define ADC_CHDR (AT91_CAST(AT91_REG *) 0x00000014) // (ADC_CHDR) ADC Channel Disable Register #define ADC_CHSR (AT91_CAST(AT91_REG *) 0x00000018) // (ADC_CHSR) ADC Channel Status Register #define ADC_SR (AT91_CAST(AT91_REG *) 0x0000001C) // (ADC_SR) ADC Status Register #define ADC_LCDR (AT91_CAST(AT91_REG *) 0x00000020) // (ADC_LCDR) ADC Last Converted Data Register #define ADC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (ADC_IER) ADC Interrupt Enable Register #define ADC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (ADC_IDR) ADC Interrupt Disable Register #define ADC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (ADC_IMR) ADC Interrupt Mask Register #define ADC_CDR0 (AT91_CAST(AT91_REG *) 0x00000030) // (ADC_CDR0) ADC Channel Data Register 0 #define ADC_CDR1 (AT91_CAST(AT91_REG *) 0x00000034) // (ADC_CDR1) ADC Channel Data Register 1 #define ADC_CDR2 (AT91_CAST(AT91_REG *) 0x00000038) // (ADC_CDR2) ADC Channel Data Register 2 #define ADC_CDR3 (AT91_CAST(AT91_REG *) 0x0000003C) // (ADC_CDR3) ADC Channel Data Register 3 #define ADC_CDR4 (AT91_CAST(AT91_REG *) 0x00000040) // (ADC_CDR4) ADC Channel Data Register 4 #define ADC_CDR5 (AT91_CAST(AT91_REG *) 0x00000044) // (ADC_CDR5) ADC Channel Data Register 5 #define ADC_CDR6 (AT91_CAST(AT91_REG *) 0x00000048) // (ADC_CDR6) ADC Channel Data Register 6 #define ADC_CDR7 (AT91_CAST(AT91_REG *) 0x0000004C) // (ADC_CDR7) ADC Channel Data Register 7 #define ADC_ACR (AT91_CAST(AT91_REG *) 0x00000064) // (ADC_ACR) Analog Control Register #define ADC_EMR (AT91_CAST(AT91_REG *) 0x00000068) // (ADC_EMR) Extended Mode Register #define ADC_ADDRSIZE (AT91_CAST(AT91_REG *) 0x000000EC) // (ADC_ADDRSIZE) ADC ADDRSIZE REGISTER #define ADC_IPNAME1 (AT91_CAST(AT91_REG *) 0x000000F0) // (ADC_IPNAME1) ADC IPNAME1 REGISTER #define ADC_IPNAME2 (AT91_CAST(AT91_REG *) 0x000000F4) // (ADC_IPNAME2) ADC IPNAME2 REGISTER #define ADC_FEATURES (AT91_CAST(AT91_REG *) 0x000000F8) // (ADC_FEATURES) ADC FEATURES REGISTER #define ADC_VER (AT91_CAST(AT91_REG *) 0x000000FC) // (ADC_VER) ADC VERSION REGISTER #endif // -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- #define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset #define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion // -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- #define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable #define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software #define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. #define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection #define AT91C_ADC_TRGSEL_EXT (0x0 << 1) // (ADC) Selected TRGSEL = External Trigger #define AT91C_ADC_TRGSEL_TIOA0 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO0 #define AT91C_ADC_TRGSEL_TIOA1 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO1 #define AT91C_ADC_TRGSEL_TIOA2 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO2 #define AT91C_ADC_TRGSEL_PWM0_TRIG (0x4 << 1) // (ADC) Selected TRGSEL = PWM trigger #define AT91C_ADC_TRGSEL_PWM1_TRIG (0x5 << 1) // (ADC) Selected TRGSEL = PWM Trigger #define AT91C_ADC_TRGSEL_RESERVED (0x6 << 1) // (ADC) Selected TRGSEL = Reserved #define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. #define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution #define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution #define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode #define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode #define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode #define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection #define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time #define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time // -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- #define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 #define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 #define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 #define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 #define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 #define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 #define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 #define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 // -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- // -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- // -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- #define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion #define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion #define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion #define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion #define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion #define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion #define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion #define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion #define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error #define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error #define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error #define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error #define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error #define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error #define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error #define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error #define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready #define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun #define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer #define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt // -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- #define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted // -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- // -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- // -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- // -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- #define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data // -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- // -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- // -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- // -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- // -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- // -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- // -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- // -------- ADC_ACR : (ADC Offset: 0x64) ADC Analog Controler Register -------- #define AT91C_ADC_GAIN (0x3 << 0) // (ADC) Input Gain #define AT91C_ADC_IBCTL (0x3 << 6) // (ADC) Bias Current Control #define AT91C_ADC_IBCTL_00 (0x0 << 6) // (ADC) typ - 20% #define AT91C_ADC_IBCTL_01 (0x1 << 6) // (ADC) typ #define AT91C_ADC_IBCTL_10 (0x2 << 6) // (ADC) typ + 20% #define AT91C_ADC_IBCTL_11 (0x3 << 6) // (ADC) typ + 40% #define AT91C_ADC_DIFF (0x1 << 16) // (ADC) Differential Mode #define AT91C_ADC_OFFSET (0x1 << 17) // (ADC) Input OFFSET // -------- ADC_EMR : (ADC Offset: 0x68) ADC Extended Mode Register -------- #define AT91C_OFFMODES (0x1 << 0) // (ADC) Off Mode if #define AT91C_OFF_MODE_STARTUP_TIME (0x1 << 16) // (ADC) Startup Time // -------- ADC_VER : (ADC Offset: 0xfc) ADC VER -------- #define AT91C_ADC_VER (0xF << 0) // (ADC) ADC VER // ***************************************************************************** // SOFTWARE API DEFINITION FOR Analog-to Digital Converter // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_ADC12B { AT91_REG ADC12B_CR; // Control Register AT91_REG ADC12B_MR; // Mode Register AT91_REG Reserved1[2]; AT91_REG ADC12B_CHER; // Channel Enable Register AT91_REG ADC12B_CHDR; // Channel Disable Register AT91_REG ADC12B_CHSR; // Channel Status Register AT91_REG ADC12B_SR; // Status Register AT91_REG ADC12B_LCDR; // Last Converted Data Register AT91_REG ADC12B_IER; // Interrupt Enable Register AT91_REG ADC12B_IDR; // Interrupt Disable Register AT91_REG ADC12B_IMR; // Interrupt Mask Register AT91_REG ADC12B_CDR[8]; // Channel Data Register AT91_REG Reserved2[5]; AT91_REG ADC12B_ACR; // Analog Control Register AT91_REG ADC12B_EMR; // Extended Mode Register } AT91S_ADC12B, *AT91PS_ADC12B; #else #define ADC12B_CR (AT91_CAST(AT91_REG *) 0x00000000) // Control Register #define ADC12B_MR (AT91_CAST(AT91_REG *) 0x00000004) // Mode Register #define ADC12B_CHER (AT91_CAST(AT91_REG *) 0x00000010) // Channel Enable Register #define ADC12B_CHDR (AT91_CAST(AT91_REG *) 0x00000014) // Channel Disable Register #define ADC12B_CHSR (AT91_CAST(AT91_REG *) 0x00000018) // Channel Status Register #define ADC12B_SR (AT91_CAST(AT91_REG *) 0x0000001C) // Status Register #define ADC12B_LCDR (AT91_CAST(AT91_REG *) 0x00000020) // Last Converted Data Register #define ADC12B_IER (AT91_CAST(AT91_REG *) 0x00000024) // Interrupt Enable Register #define ADC12B_IDR (AT91_CAST(AT91_REG *) 0x00000028) // Interrupt Disable Register #define ADC12B_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // Interrupt Mask Register #define ADC12B_CDR (AT91_CAST(AT91_REG *) 0x00000030) // Channel Data Register #define ADC12B_ACR (AT91_CAST(AT91_REG *) 0x00000064) // Analog Control Register #define ADC12B_EMR (AT91_CAST(AT91_REG *) 0x00000068) // Extended Mode Register #endif // -------- ADC12B_CR : (ADC12B Offset: 0x00) Control Register -------- #define AT91C_ADC12B_CR_SWRST (0x1 << 0) // (ADC12B) Software Reset #define AT91C_ADC12B_CR_SWRST_NO_EFFECT (0x0 << 0) // (ADC12B) No effect. #define AT91C_ADC12B_CR_SWRST_RESET (0x1 << 0) // (ADC12B) Resets the ADC12B simulating a hardware reset. #define AT91C_ADC12B_CR_START (0x1 << 1) // (ADC12B) Start Conversion #define AT91C_ADC12B_CR_START_NO_EFFECT (0x0 << 1) // (ADC12B) No effect. #define AT91C_ADC12B_CR_START_BEGIN_ADC (0x1 << 1) // (ADC12B) Begins analog-to-digital conversion. // -------- ADC12B_MR : (ADC12B Offset: 0x04) Mode Register -------- #define AT91C_ADC12B_MR_TRGEN (0x1 << 0) // (ADC12B) Trigger Enable #define AT91C_ADC12B_MR_TRGEN_DIS (0x0 << 0) // (ADC12B) Hardware triggers are disabled. Starting a conversion is only possible by software. #define AT91C_ADC12B_MR_TRGEN_EN (0x1 << 0) // (ADC12B) Hardware trigger selected by TRGSEL field is enabled. #define AT91C_ADC12B_MR_TRGSEL (0x7 << 1) // (ADC12B) Trigger Selection #define AT91C_ADC12B_MR_TRGSEL_EXT_TRIG (0x0 << 1) // (ADC12B) External trigger #define AT91C_ADC12B_MR_TRGSEL_TIOA_0 (0x1 << 1) // (ADC12B) TIO Output of the Timer Counter Channel 0 #define AT91C_ADC12B_MR_TRGSEL_TIOA_1 (0x2 << 1) // (ADC12B) TIO Output of the Timer Counter Channel 1 #define AT91C_ADC12B_MR_TRGSEL_TIOA_2 (0x3 << 1) // (ADC12B) TIO Output of the Timer Counter Channel 2 #define AT91C_ADC12B_MR_TRGSEL_TIOA_3 (0x4 << 1) // (ADC12B) PWM Event Line 0 #define AT91C_ADC12B_MR_TRGSEL_TIOA_4 (0x5 << 1) // (ADC12B) PWM Event Line 1 #define AT91C_ADC12B_MR_LOWRES (0x1 << 4) // (ADC12B) Resolution #define AT91C_ADC12B_MR_LOWRES_12_BIT (0x0 << 4) // (ADC12B) 12-bit resolution #define AT91C_ADC12B_MR_LOWRES_10_BIT (0x1 << 4) // (ADC12B) 10-bit resolution #define AT91C_ADC12B_MR_SLEEP (0x1 << 5) // (ADC12B) Sleep Mode #define AT91C_ADC12B_MR_SLEEP_NORMAL (0x0 << 5) // (ADC12B) Normal Mode #define AT91C_ADC12B_MR_SLEEP_SLEEP (0x1 << 5) // (ADC12B) Sleep Modes (see OFFMODES register) #define AT91C_ADC12B_MR_PRESCAL (0xff << 8) // (ADC12B) Prescaler Rate Selection #define AT91C_ADC12B_MR_STARTUP (0xff << 16) // (ADC12B) Start Up Time #define AT91C_ADC12B_MR_SHTIM (0xf << 24) // (ADC12B) Sample & Hold Time // -------- ADC12B_CHER : (ADC12B Offset: 0x10) Channel Enable Register -------- #define AT91C_ADC12B_CHER_CH0 (0x1 << 0) // (ADC12B) Channel 0 Enable #define AT91C_ADC12B_CHER_CH0_NO_EFFECT (0x0 << 0) // (ADC12B) No effect. #define AT91C_ADC12B_CHER_CH0_ENABLE (0x1 << 0) // (ADC12B) Enables the corresponding channel. #define AT91C_ADC12B_CHER_CH1 (0x1 << 1) // (ADC12B) Channel 1 Enable #define AT91C_ADC12B_CHER_CH1_NO_EFFECT (0x0 << 1) // (ADC12B) No effect. #define AT91C_ADC12B_CHER_CH1_ENABLE (0x1 << 1) // (ADC12B) Enables the corresponding channel. #define AT91C_ADC12B_CHER_CH2 (0x1 << 2) // (ADC12B) Channel 2 Enable #define AT91C_ADC12B_CHER_CH2_NO_EFFECT (0x0 << 2) // (ADC12B) No effect. #define AT91C_ADC12B_CHER_CH2_ENABLE (0x1 << 2) // (ADC12B) Enables the corresponding channel. #define AT91C_ADC12B_CHER_CH3 (0x1 << 3) // (ADC12B) Channel 3 Enable #define AT91C_ADC12B_CHER_CH3_NO_EFFECT (0x0 << 3) // (ADC12B) No effect. #define AT91C_ADC12B_CHER_CH3_ENABLE (0x1 << 3) // (ADC12B) Enables the corresponding channel. #define AT91C_ADC12B_CHER_CH4 (0x1 << 4) // (ADC12B) Channel 4 Enable #define AT91C_ADC12B_CHER_CH4_NO_EFFECT (0x0 << 4) // (ADC12B) No effect. #define AT91C_ADC12B_CHER_CH4_ENABLE (0x1 << 4) // (ADC12B) Enables the corresponding channel. #define AT91C_ADC12B_CHER_CH5 (0x1 << 5) // (ADC12B) Channel 5 Enable #define AT91C_ADC12B_CHER_CH5_NO_EFFECT (0x0 << 5) // (ADC12B) No effect. #define AT91C_ADC12B_CHER_CH5_ENABLE (0x1 << 5) // (ADC12B) Enables the corresponding channel. #define AT91C_ADC12B_CHER_CH6 (0x1 << 6) // (ADC12B) Channel 6 Enable #define AT91C_ADC12B_CHER_CH6_NO_EFFECT (0x0 << 6) // (ADC12B) No effect. #define AT91C_ADC12B_CHER_CH6_ENABLE (0x1 << 6) // (ADC12B) Enables the corresponding channel. #define AT91C_ADC12B_CHER_CH7 (0x1 << 7) // (ADC12B) Channel 7 Enable #define AT91C_ADC12B_CHER_CH7_NO_EFFECT (0x0 << 7) // (ADC12B) No effect. #define AT91C_ADC12B_CHER_CH7_ENABLE (0x1 << 7) // (ADC12B) Enables the corresponding channel. // -------- ADC12B_CHDR : (ADC12B Offset: 0x14) Channel Disable Register -------- #define AT91C_ADC12B_CHDR_CH0 (0x1 << 0) // (ADC12B) Channel 0 Disable #define AT91C_ADC12B_CHDR_CH0_NO_EFFECT (0x0 << 0) // (ADC12B) No effect. #define AT91C_ADC12B_CHDR_CH0_DISABLE (0x1 << 0) // (ADC12B) Disables the corresponding channel. #define AT91C_ADC12B_CHDR_CH1 (0x1 << 1) // (ADC12B) Channel 1 Disable #define AT91C_ADC12B_CHDR_CH1_NO_EFFECT (0x0 << 1) // (ADC12B) No effect. #define AT91C_ADC12B_CHDR_CH1_DISABLE (0x1 << 1) // (ADC12B) Disables the corresponding channel. #define AT91C_ADC12B_CHDR_CH2 (0x1 << 2) // (ADC12B) Channel 2 Disable #define AT91C_ADC12B_CHDR_CH2_NO_EFFECT (0x0 << 2) // (ADC12B) No effect. #define AT91C_ADC12B_CHDR_CH2_DISABLE (0x1 << 2) // (ADC12B) Disables the corresponding channel. #define AT91C_ADC12B_CHDR_CH3 (0x1 << 3) // (ADC12B) Channel 3 Disable #define AT91C_ADC12B_CHDR_CH3_NO_EFFECT (0x0 << 3) // (ADC12B) No effect. #define AT91C_ADC12B_CHDR_CH3_DISABLE (0x1 << 3) // (ADC12B) Disables the corresponding channel. #define AT91C_ADC12B_CHDR_CH4 (0x1 << 4) // (ADC12B) Channel 4 Disable #define AT91C_ADC12B_CHDR_CH4_NO_EFFECT (0x0 << 4) // (ADC12B) No effect. #define AT91C_ADC12B_CHDR_CH4_DISABLE (0x1 << 4) // (ADC12B) Disables the corresponding channel. #define AT91C_ADC12B_CHDR_CH5 (0x1 << 5) // (ADC12B) Channel 5 Disable #define AT91C_ADC12B_CHDR_CH5_NO_EFFECT (0x0 << 5) // (ADC12B) No effect. #define AT91C_ADC12B_CHDR_CH5_DISABLE (0x1 << 5) // (ADC12B) Disables the corresponding channel. #define AT91C_ADC12B_CHDR_CH6 (0x1 << 6) // (ADC12B) Channel 6 Disable #define AT91C_ADC12B_CHDR_CH6_NO_EFFECT (0x0 << 6) // (ADC12B) No effect. #define AT91C_ADC12B_CHDR_CH6_DISABLE (0x1 << 6) // (ADC12B) Disables the corresponding channel. #define AT91C_ADC12B_CHDR_CH7 (0x1 << 7) // (ADC12B) Channel 7 Disable #define AT91C_ADC12B_CHDR_CH7_NO_EFFECT (0x0 << 7) // (ADC12B) No effect. #define AT91C_ADC12B_CHDR_CH7_DISABLE (0x1 << 7) // (ADC12B) Disables the corresponding channel. // -------- ADC12B_CHSR : (ADC12B Offset: 0x18) Channel Status Register -------- #define AT91C_ADC12B_CHSR_CH0 (0x1 << 0) // (ADC12B) Channel 0 Status #define AT91C_ADC12B_CHSR_CH0_DISABLED (0x0 << 0) // (ADC12B) Corresponding channel is disabled. #define AT91C_ADC12B_CHSR_CH0_ENABLED (0x1 << 0) // (ADC12B) Corresponding channel is enabled. #define AT91C_ADC12B_CHSR_CH1 (0x1 << 1) // (ADC12B) Channel 1 Status #define AT91C_ADC12B_CHSR_CH1_DISABLED (0x0 << 1) // (ADC12B) Corresponding channel is disabled. #define AT91C_ADC12B_CHSR_CH1_ENABLED (0x1 << 1) // (ADC12B) Corresponding channel is enabled. #define AT91C_ADC12B_CHSR_CH2 (0x1 << 2) // (ADC12B) Channel 2 Status #define AT91C_ADC12B_CHSR_CH2_DISABLED (0x0 << 2) // (ADC12B) Corresponding channel is disabled. #define AT91C_ADC12B_CHSR_CH2_ENABLED (0x1 << 2) // (ADC12B) Corresponding channel is enabled. #define AT91C_ADC12B_CHSR_CH3 (0x1 << 3) // (ADC12B) Channel 3 Status #define AT91C_ADC12B_CHSR_CH3_DISABLED (0x0 << 3) // (ADC12B) Corresponding channel is disabled. #define AT91C_ADC12B_CHSR_CH3_ENABLED (0x1 << 3) // (ADC12B) Corresponding channel is enabled. #define AT91C_ADC12B_CHSR_CH4 (0x1 << 4) // (ADC12B) Channel 4 Status #define AT91C_ADC12B_CHSR_CH4_DISABLED (0x0 << 4) // (ADC12B) Corresponding channel is disabled. #define AT91C_ADC12B_CHSR_CH4_ENABLED (0x1 << 4) // (ADC12B) Corresponding channel is enabled. #define AT91C_ADC12B_CHSR_CH5 (0x1 << 5) // (ADC12B) Channel 5 Status #define AT91C_ADC12B_CHSR_CH5_DISABLED (0x0 << 5) // (ADC12B) Corresponding channel is disabled. #define AT91C_ADC12B_CHSR_CH5_ENABLED (0x1 << 5) // (ADC12B) Corresponding channel is enabled. #define AT91C_ADC12B_CHSR_CH6 (0x1 << 6) // (ADC12B) Channel 6 Status #define AT91C_ADC12B_CHSR_CH6_DISABLED (0x0 << 6) // (ADC12B) Corresponding channel is disabled. #define AT91C_ADC12B_CHSR_CH6_ENABLED (0x1 << 6) // (ADC12B) Corresponding channel is enabled. #define AT91C_ADC12B_CHSR_CH7 (0x1 << 7) // (ADC12B) Channel 7 Status #define AT91C_ADC12B_CHSR_CH7_DISABLED (0x0 << 7) // (ADC12B) Corresponding channel is disabled. #define AT91C_ADC12B_CHSR_CH7_ENABLED (0x1 << 7) // (ADC12B) Corresponding channel is enabled. // -------- ADC12B_SR : (ADC12B Offset: 0x1C) Status Register -------- #define AT91C_ADC12B_SR_EOC0 (0x1 << 0) // (ADC12B) End of Conversion 0 #define AT91C_ADC12B_SR_EOC0_DISABLE (0x0 << 0) // (ADC12B) Corresponding analog channel is disabled, or the conversion is not finished. #define AT91C_ADC12B_SR_EOC0_ENABLE (0x1 << 0) // (ADC12B) Corresponding analog channel is enabled and conversion is complete. #define AT91C_ADC12B_SR_EOC1 (0x1 << 1) // (ADC12B) End of Conversion 1 #define AT91C_ADC12B_SR_EOC1_DISABLE (0x0 << 1) // (ADC12B) Corresponding analog channel is disabled, or the conversion is not finished. #define AT91C_ADC12B_SR_EOC1_ENABLE (0x1 << 1) // (ADC12B) Corresponding analog channel is enabled and conversion is complete. #define AT91C_ADC12B_SR_EOC2 (0x1 << 2) // (ADC12B) End of Conversion 2 #define AT91C_ADC12B_SR_EOC2_DISABLE (0x0 << 2) // (ADC12B) Corresponding analog channel is disabled, or the conversion is not finished. #define AT91C_ADC12B_SR_EOC2_ENABLE (0x1 << 2) // (ADC12B) Corresponding analog channel is enabled and conversion is complete. #define AT91C_ADC12B_SR_EOC3 (0x1 << 3) // (ADC12B) End of Conversion 3 #define AT91C_ADC12B_SR_EOC3_DISABLE (0x0 << 3) // (ADC12B) Corresponding analog channel is disabled, or the conversion is not finished. #define AT91C_ADC12B_SR_EOC3_ENABLE (0x1 << 3) // (ADC12B) Corresponding analog channel is enabled and conversion is complete. #define AT91C_ADC12B_SR_EOC4 (0x1 << 4) // (ADC12B) End of Conversion 4 #define AT91C_ADC12B_SR_EOC4_DISABLE (0x0 << 4) // (ADC12B) Corresponding analog channel is disabled, or the conversion is not finished. #define AT91C_ADC12B_SR_EOC4_ENABLE (0x1 << 4) // (ADC12B) Corresponding analog channel is enabled and conversion is complete. #define AT91C_ADC12B_SR_EOC5 (0x1 << 5) // (ADC12B) End of Conversion 5 #define AT91C_ADC12B_SR_EOC5_DISABLE (0x0 << 5) // (ADC12B) Corresponding analog channel is disabled, or the conversion is not finished. #define AT91C_ADC12B_SR_EOC5_ENABLE (0x1 << 5) // (ADC12B) Corresponding analog channel is enabled and conversion is complete. #define AT91C_ADC12B_SR_EOC6 (0x1 << 6) // (ADC12B) End of Conversion 6 #define AT91C_ADC12B_SR_EOC6_DISABLE (0x0 << 6) // (ADC12B) Corresponding analog channel is disabled, or the conversion is not finished. #define AT91C_ADC12B_SR_EOC6_ENABLE (0x1 << 6) // (ADC12B) Corresponding analog channel is enabled and conversion is complete. #define AT91C_ADC12B_SR_EOC7 (0x1 << 7) // (ADC12B) End of Conversion 7 #define AT91C_ADC12B_SR_EOC7_DISABLE (0x0 << 7) // (ADC12B) Corresponding analog channel is disabled, or the conversion is not finished. #define AT91C_ADC12B_SR_EOC7_ENABLE (0x1 << 7) // (ADC12B) Corresponding analog channel is enabled and conversion is complete. #define AT91C_ADC12B_SR_OVRE0 (0x1 << 8) // (ADC12B) Overrun Error 0 #define AT91C_ADC12B_SR_OVRE0_NO_ERROR (0x0 << 8) // (ADC12B) No overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE0_ERROR (0x1 << 8) // (ADC12B) There has been an overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE1 (0x1 << 9) // (ADC12B) Overrun Error 1 #define AT91C_ADC12B_SR_OVRE1_NO_ERROR (0x0 << 9) // (ADC12B) No overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE1_ERROR (0x1 << 9) // (ADC12B) There has been an overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE2 (0x1 << 10) // (ADC12B) Overrun Error 2 #define AT91C_ADC12B_SR_OVRE2_NO_ERROR (0x0 << 10) // (ADC12B) No overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE2_ERROR (0x1 << 10) // (ADC12B) There has been an overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE3 (0x1 << 11) // (ADC12B) Overrun Error 3 #define AT91C_ADC12B_SR_OVRE3_NO_ERROR (0x0 << 11) // (ADC12B) No overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE3_ERROR (0x1 << 11) // (ADC12B) There has been an overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE4 (0x1 << 12) // (ADC12B) Overrun Error 4 #define AT91C_ADC12B_SR_OVRE4_NO_ERROR (0x0 << 12) // (ADC12B) No overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE4_ERROR (0x1 << 12) // (ADC12B) There has been an overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE5 (0x1 << 13) // (ADC12B) Overrun Error 5 #define AT91C_ADC12B_SR_OVRE5_NO_ERROR (0x0 << 13) // (ADC12B) No overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE5_ERROR (0x1 << 13) // (ADC12B) There has been an overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE6 (0x1 << 14) // (ADC12B) Overrun Error 6 #define AT91C_ADC12B_SR_OVRE6_NO_ERROR (0x0 << 14) // (ADC12B) No overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE6_ERROR (0x1 << 14) // (ADC12B) There has been an overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE7 (0x1 << 15) // (ADC12B) Overrun Error 7 #define AT91C_ADC12B_SR_OVRE7_NO_ERROR (0x0 << 15) // (ADC12B) No overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_OVRE7_ERROR (0x1 << 15) // (ADC12B) There has been an overrun error on the corresponding channel since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_DRDY (0x1 << 16) // (ADC12B) Data Ready #define AT91C_ADC12B_SR_DRDY_NO_CONV (0x0 << 16) // (ADC12B) No data has been converted since the last read of ADC12B_LCDR. #define AT91C_ADC12B_SR_DRDY_CONV (0x1 << 16) // (ADC12B) At least one data has been converted and is available in ADC12B_LCDR. #define AT91C_ADC12B_SR_GOVRE (0x1 << 17) // (ADC12B) General Overrun Error #define AT91C_ADC12B_SR_GOVRE_NO_ERROR (0x0 << 17) // (ADC12B) No General Overrun Error occurred since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_GOVRE_ERROR (0x1 << 17) // (ADC12B) At least one General Overrun Error has occurred since the last read of ADC12B_SR. #define AT91C_ADC12B_SR_ENDRX (0x1 << 18) // (ADC12B) End of RX Buffer #define AT91C_ADC12B_SR_ENDRX_NOT_REACH (0x0 << 18) // (ADC12B) The Receive Counter Register has not reached 0 since the last write in ADC12B_RCR or ADC12B_RNCR. #define AT91C_ADC12B_SR_ENDRX_REACH_0 (0x1 << 18) // (ADC12B) The Receive Counter Register has reached 0 since the last write in ADC12B_RCR or ADC12B_RNCR. #define AT91C_ADC12B_SR_RXBUFF (0x1 << 19) // (ADC12B) RX Buffer Full #define AT91C_ADC12B_SR_RXBUFF_NO_ZERO (0x0 << 19) // (ADC12B) ADC12B_RCR or ADC12B_RNCR have a value other than 0. #define AT91C_ADC12B_SR_RXBUFF_ZERO (0x1 << 19) // (ADC12B) Both ADC12B_RCR and ADC12B_RNCR have a value of 0. // -------- ADC12B_LCDR : (ADC12B Offset: 0x20) Last Converted Data Register -------- #define AT91C_ADC12B_LCDR_LDATA (0xfff << 0) // (ADC12B) Last Data Converted // -------- ADC12B_IER : (ADC12B Offset: 0x24) Interrupt Enable Register -------- #define AT91C_ADC12B_IER_EOC0 (0x1 << 0) // (ADC12B) End of Conversion Interrupt Enable 0 #define AT91C_ADC12B_IER_EOC0_NO_EFFECT (0x0 << 0) // (ADC12B) No effect. #define AT91C_ADC12B_IER_EOC0_ENABLE (0x1 << 0) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_EOC1 (0x1 << 1) // (ADC12B) End of Conversion Interrupt Enable 1 #define AT91C_ADC12B_IER_EOC1_NO_EFFECT (0x0 << 1) // (ADC12B) No effect. #define AT91C_ADC12B_IER_EOC1_ENABLE (0x1 << 1) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_EOC2 (0x1 << 2) // (ADC12B) End of Conversion Interrupt Enable 2 #define AT91C_ADC12B_IER_EOC2_NO_EFFECT (0x0 << 2) // (ADC12B) No effect. #define AT91C_ADC12B_IER_EOC2_ENABLE (0x1 << 2) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_EOC3 (0x1 << 3) // (ADC12B) End of Conversion Interrupt Enable 3 #define AT91C_ADC12B_IER_EOC3_NO_EFFECT (0x0 << 3) // (ADC12B) No effect. #define AT91C_ADC12B_IER_EOC3_ENABLE (0x1 << 3) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_EOC4 (0x1 << 4) // (ADC12B) End of Conversion Interrupt Enable 4 #define AT91C_ADC12B_IER_EOC4_NO_EFFECT (0x0 << 4) // (ADC12B) No effect. #define AT91C_ADC12B_IER_EOC4_ENABLE (0x1 << 4) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_EOC5 (0x1 << 5) // (ADC12B) End of Conversion Interrupt Enable 5 #define AT91C_ADC12B_IER_EOC5_NO_EFFECT (0x0 << 5) // (ADC12B) No effect. #define AT91C_ADC12B_IER_EOC5_ENABLE (0x1 << 5) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_EOC6 (0x1 << 6) // (ADC12B) End of Conversion Interrupt Enable 6 #define AT91C_ADC12B_IER_EOC6_NO_EFFECT (0x0 << 6) // (ADC12B) No effect. #define AT91C_ADC12B_IER_EOC6_ENABLE (0x1 << 6) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_EOC7 (0x1 << 7) // (ADC12B) End of Conversion Interrupt Enable 7 #define AT91C_ADC12B_IER_EOC7_NO_EFFECT (0x0 << 7) // (ADC12B) No effect. #define AT91C_ADC12B_IER_EOC7_ENABLE (0x1 << 7) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_OVRE0 (0x1 << 8) // (ADC12B) Overrun Error Interrupt Enable 0 #define AT91C_ADC12B_IER_OVRE0_NO_EFFECT (0x0 << 8) // (ADC12B) No effect. #define AT91C_ADC12B_IER_OVRE0_ENABLE (0x1 << 8) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_OVRE1 (0x1 << 9) // (ADC12B) Overrun Error Interrupt Enable 1 #define AT91C_ADC12B_IER_OVRE1_NO_EFFECT (0x0 << 9) // (ADC12B) No effect. #define AT91C_ADC12B_IER_OVRE1_ENABLE (0x1 << 9) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_OVRE2 (0x1 << 10) // (ADC12B) Overrun Error Interrupt Enable 2 #define AT91C_ADC12B_IER_OVRE2_NO_EFFECT (0x0 << 10) // (ADC12B) No effect. #define AT91C_ADC12B_IER_OVRE2_ENABLE (0x1 << 10) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_OVRE3 (0x1 << 11) // (ADC12B) Overrun Error Interrupt Enable 3 #define AT91C_ADC12B_IER_OVRE3_NO_EFFECT (0x0 << 11) // (ADC12B) No effect. #define AT91C_ADC12B_IER_OVRE3_ENABLE (0x1 << 11) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_OVRE4 (0x1 << 12) // (ADC12B) Overrun Error Interrupt Enable 4 #define AT91C_ADC12B_IER_OVRE4_NO_EFFECT (0x0 << 12) // (ADC12B) No effect. #define AT91C_ADC12B_IER_OVRE4_ENABLE (0x1 << 12) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_OVRE5 (0x1 << 13) // (ADC12B) Overrun Error Interrupt Enable 5 #define AT91C_ADC12B_IER_OVRE5_NO_EFFECT (0x0 << 13) // (ADC12B) No effect. #define AT91C_ADC12B_IER_OVRE5_ENABLE (0x1 << 13) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_OVRE6 (0x1 << 14) // (ADC12B) Overrun Error Interrupt Enable 6 #define AT91C_ADC12B_IER_OVRE6_NO_EFFECT (0x0 << 14) // (ADC12B) No effect. #define AT91C_ADC12B_IER_OVRE6_ENABLE (0x1 << 14) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_OVRE7 (0x1 << 15) // (ADC12B) Overrun Error Interrupt Enable 7 #define AT91C_ADC12B_IER_OVRE7_NO_EFFECT (0x0 << 15) // (ADC12B) No effect. #define AT91C_ADC12B_IER_OVRE7_ENABLE (0x1 << 15) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_DRDY (0x1 << 16) // (ADC12B) Data Ready Interrupt Enable #define AT91C_ADC12B_IER_DRDY_NO_EFFECT (0x0 << 16) // (ADC12B) No effect. #define AT91C_ADC12B_IER_DRDY_ENABLE (0x1 << 16) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_GOVRE (0x1 << 17) // (ADC12B) General Overrun Error Interrupt Enable #define AT91C_ADC12B_IER_GOVRE_NO_EFFECT (0x0 << 17) // (ADC12B) No effect. #define AT91C_ADC12B_IER_GOVRE_ENABLE (0x1 << 17) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_ENDRX (0x1 << 18) // (ADC12B) End of Receive Buffer Interrupt Enable #define AT91C_ADC12B_IER_ENDRX_NO_EFFECT (0x0 << 18) // (ADC12B) No effect. #define AT91C_ADC12B_IER_ENDRX_ENABLE (0x1 << 18) // (ADC12B) Enables the corresponding interrupt. #define AT91C_ADC12B_IER_RXBUFF (0x1 << 19) // (ADC12B) Receive Buffer Full Interrupt Enable #define AT91C_ADC12B_IER_RXBUFF_NO_EFFECT (0x0 << 19) // (ADC12B) No effect. #define AT91C_ADC12B_IER_RXBUFF_ENABLE (0x1 << 19) // (ADC12B) Enables the corresponding interrupt. // -------- ADC12B_IDR : (ADC12B Offset: 0x28) Interrupt Disable Register -------- #define AT91C_ADC12B_IDR_EOC0 (0x1 << 0) // (ADC12B) End of Conversion Interrupt Disable 0 #define AT91C_ADC12B_IDR_EOC0_NO_EFFECT (0x0 << 0) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_EOC0_DISABLE (0x1 << 0) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_EOC1 (0x1 << 1) // (ADC12B) End of Conversion Interrupt Disable 1 #define AT91C_ADC12B_IDR_EOC1_NO_EFFECT (0x0 << 1) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_EOC1_DISABLE (0x1 << 1) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_EOC2 (0x1 << 2) // (ADC12B) End of Conversion Interrupt Disable 2 #define AT91C_ADC12B_IDR_EOC2_NO_EFFECT (0x0 << 2) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_EOC2_DISABLE (0x1 << 2) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_EOC3 (0x1 << 3) // (ADC12B) End of Conversion Interrupt Disable 3 #define AT91C_ADC12B_IDR_EOC3_NO_EFFECT (0x0 << 3) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_EOC3_DISABLE (0x1 << 3) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_EOC4 (0x1 << 4) // (ADC12B) End of Conversion Interrupt Disable 4 #define AT91C_ADC12B_IDR_EOC4_NO_EFFECT (0x0 << 4) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_EOC4_DISABLE (0x1 << 4) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_EOC5 (0x1 << 5) // (ADC12B) End of Conversion Interrupt Disable 5 #define AT91C_ADC12B_IDR_EOC5_NO_EFFECT (0x0 << 5) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_EOC5_DISABLE (0x1 << 5) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_EOC6 (0x1 << 6) // (ADC12B) End of Conversion Interrupt Disable 6 #define AT91C_ADC12B_IDR_EOC6_NO_EFFECT (0x0 << 6) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_EOC6_DISABLE (0x1 << 6) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_EOC7 (0x1 << 7) // (ADC12B) End of Conversion Interrupt Disable 7 #define AT91C_ADC12B_IDR_EOC7_NO_EFFECT (0x0 << 7) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_EOC7_DISABLE (0x1 << 7) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_OVRE0 (0x1 << 8) // (ADC12B) Overrun Error Interrupt Disable 0 #define AT91C_ADC12B_IDR_OVRE0_NO_EFFECT (0x0 << 8) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_OVRE0_DISABLE (0x1 << 8) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_OVRE1 (0x1 << 9) // (ADC12B) Overrun Error Interrupt Disable 1 #define AT91C_ADC12B_IDR_OVRE1_NO_EFFECT (0x0 << 9) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_OVRE1_DISABLE (0x1 << 9) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_OVRE2 (0x1 << 10) // (ADC12B) Overrun Error Interrupt Disable 2 #define AT91C_ADC12B_IDR_OVRE2_NO_EFFECT (0x0 << 10) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_OVRE2_DISABLE (0x1 << 10) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_OVRE3 (0x1 << 11) // (ADC12B) Overrun Error Interrupt Disable 3 #define AT91C_ADC12B_IDR_OVRE3_NO_EFFECT (0x0 << 11) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_OVRE3_DISABLE (0x1 << 11) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_OVRE4 (0x1 << 12) // (ADC12B) Overrun Error Interrupt Disable 4 #define AT91C_ADC12B_IDR_OVRE4_NO_EFFECT (0x0 << 12) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_OVRE4_DISABLE (0x1 << 12) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_OVRE5 (0x1 << 13) // (ADC12B) Overrun Error Interrupt Disable 5 #define AT91C_ADC12B_IDR_OVRE5_NO_EFFECT (0x0 << 13) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_OVRE5_DISABLE (0x1 << 13) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_OVRE6 (0x1 << 14) // (ADC12B) Overrun Error Interrupt Disable 6 #define AT91C_ADC12B_IDR_OVRE6_NO_EFFECT (0x0 << 14) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_OVRE6_DISABLE (0x1 << 14) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_OVRE7 (0x1 << 15) // (ADC12B) Overrun Error Interrupt Disable 7 #define AT91C_ADC12B_IDR_OVRE7_NO_EFFECT (0x0 << 15) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_OVRE7_DISABLE (0x1 << 15) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_DRDY (0x1 << 16) // (ADC12B) Data Ready Interrupt Disable #define AT91C_ADC12B_IDR_DRDY_NO_EFFECT (0x0 << 16) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_DRDY_DISABLE (0x1 << 16) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_GOVRE (0x1 << 17) // (ADC12B) General Overrun Error Interrupt Disable #define AT91C_ADC12B_IDR_GOVRE_NO_EFFECT (0x0 << 17) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_GOVRE_DISABLE (0x1 << 17) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_ENDRX (0x1 << 18) // (ADC12B) End of Receive Buffer Interrupt Disable #define AT91C_ADC12B_IDR_ENDRX_NO_EFFECT (0x0 << 18) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_ENDRX_DISABLE (0x1 << 18) // (ADC12B) Disables the corresponding interrupt. #define AT91C_ADC12B_IDR_RXBUFF (0x1 << 19) // (ADC12B) Receive Buffer Full Interrupt Disable #define AT91C_ADC12B_IDR_RXBUFF_NO_EFFECT (0x0 << 19) // (ADC12B) No effect. #define AT91C_ADC12B_IDR_RXBUFF_DISABLE (0x1 << 19) // (ADC12B) Disables the corresponding interrupt. // -------- ADC12B_IMR : (ADC12B Offset: 0x2C) Interrupt Mask Register -------- #define AT91C_ADC12B_IMR_EOC0 (0x1 << 0) // (ADC12B) End of Conversion Interrupt Mask 0 #define AT91C_ADC12B_IMR_EOC0_DIS (0x0 << 0) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_EOC0_EN (0x1 << 0) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_EOC1 (0x1 << 1) // (ADC12B) End of Conversion Interrupt Mask 1 #define AT91C_ADC12B_IMR_EOC1_DIS (0x0 << 1) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_EOC1_EN (0x1 << 1) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_EOC2 (0x1 << 2) // (ADC12B) End of Conversion Interrupt Mask 2 #define AT91C_ADC12B_IMR_EOC2_DIS (0x0 << 2) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_EOC2_EN (0x1 << 2) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_EOC3 (0x1 << 3) // (ADC12B) End of Conversion Interrupt Mask 3 #define AT91C_ADC12B_IMR_EOC3_DIS (0x0 << 3) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_EOC3_EN (0x1 << 3) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_EOC4 (0x1 << 4) // (ADC12B) End of Conversion Interrupt Mask 4 #define AT91C_ADC12B_IMR_EOC4_DIS (0x0 << 4) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_EOC4_EN (0x1 << 4) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_EOC5 (0x1 << 5) // (ADC12B) End of Conversion Interrupt Mask 5 #define AT91C_ADC12B_IMR_EOC5_DIS (0x0 << 5) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_EOC5_EN (0x1 << 5) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_EOC6 (0x1 << 6) // (ADC12B) End of Conversion Interrupt Mask 6 #define AT91C_ADC12B_IMR_EOC6_DIS (0x0 << 6) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_EOC6_EN (0x1 << 6) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_EOC7 (0x1 << 7) // (ADC12B) End of Conversion Interrupt Mask 7 #define AT91C_ADC12B_IMR_EOC7_DIS (0x0 << 7) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_EOC7_EN (0x1 << 7) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_OVRE0 (0x1 << 8) // (ADC12B) Overrun Error Interrupt Mask 0 #define AT91C_ADC12B_IMR_OVRE0_DIS (0x0 << 8) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_OVRE0_EN (0x1 << 8) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_OVRE1 (0x1 << 9) // (ADC12B) Overrun Error Interrupt Mask 1 #define AT91C_ADC12B_IMR_OVRE1_DIS (0x0 << 9) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_OVRE1_EN (0x1 << 9) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_OVRE2 (0x1 << 10) // (ADC12B) Overrun Error Interrupt Mask 2 #define AT91C_ADC12B_IMR_OVRE2_DIS (0x0 << 10) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_OVRE2_EN (0x1 << 10) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_OVRE3 (0x1 << 11) // (ADC12B) Overrun Error Interrupt Mask 3 #define AT91C_ADC12B_IMR_OVRE3_DIS (0x0 << 11) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_OVRE3_EN (0x1 << 11) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_OVRE4 (0x1 << 12) // (ADC12B) Overrun Error Interrupt Mask 4 #define AT91C_ADC12B_IMR_OVRE4_DIS (0x0 << 12) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_OVRE4_EN (0x1 << 12) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_OVRE5 (0x1 << 13) // (ADC12B) Overrun Error Interrupt Mask 5 #define AT91C_ADC12B_IMR_OVRE5_DIS (0x0 << 13) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_OVRE5_EN (0x1 << 13) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_OVRE6 (0x1 << 14) // (ADC12B) Overrun Error Interrupt Mask 6 #define AT91C_ADC12B_IMR_OVRE6_DIS (0x0 << 14) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_OVRE6_EN (0x1 << 14) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_OVRE7 (0x1 << 15) // (ADC12B) Overrun Error Interrupt Mask 7 #define AT91C_ADC12B_IMR_OVRE7_DIS (0x0 << 15) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_OVRE7_EN (0x1 << 15) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_DRDY (0x1 << 16) // (ADC12B) Data Ready Interrupt Mask #define AT91C_ADC12B_IMR_DRDY_DIS (0x0 << 16) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_DRDY_EN (0x1 << 16) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_GOVRE (0x1 << 17) // (ADC12B) General Overrun Error Interrupt Mask #define AT91C_ADC12B_IMR_GOVRE_DIS (0x0 << 17) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_GOVRE_EN (0x1 << 17) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_ENDRX (0x1 << 18) // (ADC12B) End of Receive Buffer Interrupt Mask #define AT91C_ADC12B_IMR_ENDRX_DIS (0x0 << 18) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_ENDRX_EN (0x1 << 18) // (ADC12B) The corresponding interrupt is enabled. #define AT91C_ADC12B_IMR_RXBUFF (0x1 << 19) // (ADC12B) Receive Buffer Full Interrupt Mask #define AT91C_ADC12B_IMR_RXBUFF_DIS (0x0 << 19) // (ADC12B) The corresponding interrupt is disabled. #define AT91C_ADC12B_IMR_RXBUFF_EN (0x1 << 19) // (ADC12B) The corresponding interrupt is enabled. // -------- ADC12B_CDR[8] : (ADC12B Offset: 0x30) Channel Data Register -------- #define AT91C_ADC12B_CDR_DATA (0xfff << 0) // (ADC12B) Converted Data // -------- ADC12B_ACR : (ADC12B Offset: 0x64) Analog Control Register -------- #define AT91C_ADC12B_ACR_GAIN (0x3 << 0) // (ADC12B) Input Gain #define AT91C_ADC12B_ACR_IBCTL (0x3 << 6) // (ADC12B) Bias Current Control #define AT91C_ADC12B_ACR_IBCTL_MIN20 (0x0 << 6) // (ADC12B) typ - 20% #define AT91C_ADC12B_ACR_IBCTL_TYP (0x1 << 6) // (ADC12B) typ #define AT91C_ADC12B_ACR_IBCTL_PLUS20 (0x2 << 6) // (ADC12B) typ + 20% #define AT91C_ADC12B_ACR_IBCTL_PLUS40 (0x3 << 6) // (ADC12B) typ + 40% #define AT91C_ADC12B_ACR_DIFF (0x1 << 16) // (ADC12B) Differential Mode #define AT91C_ADC12B_ACR_DIFF_SINGLE (0x0 << 16) // (ADC12B) Single Ended Mode #define AT91C_ADC12B_ACR_DIFF_FULLY (0x1 << 16) // (ADC12B) Fully Differential Mode #define AT91C_ADC12B_ACR_OFFSET (0x1 << 17) // (ADC12B) Input OFFSET // -------- ADC12B_EMR : (ADC12B Offset: 0x68) Extended Mode Register -------- #define AT91C_ADC12B_EMR_OFFMODES (0x1 << 0) // (ADC12B) Off Mode if Sleep Bit (ADC12B_MR) = 1 #define AT91C_ADC12B_EMR_OFFMODES_STBY (0x0 << 0) // (ADC12B) Standby Mode #define AT91C_ADC12B_EMR_OFFMODES_OFF (0x1 << 0) // (ADC12B) Off Mode #define AT91C_ADC12B_EMR_OFF_MODE_STARTUP_TIME (0xff << 16) // (ADC12B) Startup Time // ***************************************************************************** // SOFTWARE API DEFINITION FOR Timer Counter Channel Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_TC { AT91_REG TC_CCR; // Channel Control Register AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) AT91_REG Reserved0[2]; // AT91_REG TC_CV; // Counter Value AT91_REG TC_RA; // Register A AT91_REG TC_RB; // Register B AT91_REG TC_RC; // Register C AT91_REG TC_SR; // Status Register AT91_REG TC_IER; // Interrupt Enable Register AT91_REG TC_IDR; // Interrupt Disable Register AT91_REG TC_IMR; // Interrupt Mask Register } AT91S_TC, *AT91PS_TC; #else #define TC_CCR (AT91_CAST(AT91_REG *) 0x00000000) // (TC_CCR) Channel Control Register #define TC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (TC_CMR) Channel Mode Register (Capture Mode / Waveform Mode) #define TC_CV (AT91_CAST(AT91_REG *) 0x00000010) // (TC_CV) Counter Value #define TC_RA (AT91_CAST(AT91_REG *) 0x00000014) // (TC_RA) Register A #define TC_RB (AT91_CAST(AT91_REG *) 0x00000018) // (TC_RB) Register B #define TC_RC (AT91_CAST(AT91_REG *) 0x0000001C) // (TC_RC) Register C #define TC_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TC_SR) Status Register #define TC_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TC_IER) Interrupt Enable Register #define TC_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TC_IDR) Interrupt Disable Register #define TC_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TC_IMR) Interrupt Mask Register #endif // -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- #define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command #define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command #define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command // -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- #define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection #define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK #define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK #define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK #define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK #define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK #define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 #define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 #define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 #define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert #define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection #define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal #define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock #define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock #define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock #define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare #define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading #define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare #define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading #define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection #define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None #define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge #define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge #define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge #define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection #define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None #define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge #define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge #define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge #define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection #define AT91C_TC_EEVT_TIOB (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input #define AT91C_TC_EEVT_XC0 (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output #define AT91C_TC_EEVT_XC1 (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output #define AT91C_TC_EEVT_XC2 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output #define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection #define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable #define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection #define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare #define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare #define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare #define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare #define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable #define AT91C_TC_WAVE (0x1 << 15) // (TC) #define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA #define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none #define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set #define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear #define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle #define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection #define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None #define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA #define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA #define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA #define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA #define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none #define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set #define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear #define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle #define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection #define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None #define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA #define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA #define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA #define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA #define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none #define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set #define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear #define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle #define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA #define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none #define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set #define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear #define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle #define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB #define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none #define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set #define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear #define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle #define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB #define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none #define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set #define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear #define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle #define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB #define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none #define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set #define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear #define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle #define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB #define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none #define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set #define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear #define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle // -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- #define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow #define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun #define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare #define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare #define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare #define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading #define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading #define AT91C_TC_ETRGS (0x1 << 7) // (TC) External Trigger #define AT91C_TC_CLKSTA (0x1 << 16) // (TC) Clock Enabling #define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror #define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror // -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- // -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- // -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- // ***************************************************************************** // SOFTWARE API DEFINITION FOR Timer Counter Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_TCB { AT91S_TC TCB_TC0; // TC Channel 0 AT91_REG Reserved0[4]; // AT91S_TC TCB_TC1; // TC Channel 1 AT91_REG Reserved1[4]; // AT91S_TC TCB_TC2; // TC Channel 2 AT91_REG Reserved2[4]; // AT91_REG TCB_BCR; // TC Block Control Register AT91_REG TCB_BMR; // TC Block Mode Register AT91_REG Reserved3[9]; // AT91_REG TCB_ADDRSIZE; // TC ADDRSIZE REGISTER AT91_REG TCB_IPNAME1; // TC IPNAME1 REGISTER AT91_REG TCB_IPNAME2; // TC IPNAME2 REGISTER AT91_REG TCB_FEATURES; // TC FEATURES REGISTER AT91_REG TCB_VER; // Version Register } AT91S_TCB, *AT91PS_TCB; #else #define TCB_BCR (AT91_CAST(AT91_REG *) 0x000000C0) // (TCB_BCR) TC Block Control Register #define TCB_BMR (AT91_CAST(AT91_REG *) 0x000000C4) // (TCB_BMR) TC Block Mode Register #define TC_ADDRSIZE (AT91_CAST(AT91_REG *) 0x000000EC) // (TC_ADDRSIZE) TC ADDRSIZE REGISTER #define TC_IPNAME1 (AT91_CAST(AT91_REG *) 0x000000F0) // (TC_IPNAME1) TC IPNAME1 REGISTER #define TC_IPNAME2 (AT91_CAST(AT91_REG *) 0x000000F4) // (TC_IPNAME2) TC IPNAME2 REGISTER #define TC_FEATURES (AT91_CAST(AT91_REG *) 0x000000F8) // (TC_FEATURES) TC FEATURES REGISTER #define TC_VER (AT91_CAST(AT91_REG *) 0x000000FC) // (TC_VER) Version Register #endif // -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- #define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command // -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- #define AT91C_TCB_TC0XC0S (0x3 << 0) // (TCB) External Clock Signal 0 Selection #define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 #define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 #define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 #define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 #define AT91C_TCB_TC1XC1S (0x3 << 2) // (TCB) External Clock Signal 1 Selection #define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 #define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 #define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 #define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 #define AT91C_TCB_TC2XC2S (0x3 << 4) // (TCB) External Clock Signal 2 Selection #define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 #define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 #define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 #define AT91C_TCB_TC2XC2S_TIOA1 (0x3 << 4) // (TCB) TIOA2 connected to XC2 // ***************************************************************************** // SOFTWARE API DEFINITION FOR Embedded Flash Controller 2.0 // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_EFC { AT91_REG EFC_FMR; // EFC Flash Mode Register AT91_REG EFC_FCR; // EFC Flash Command Register AT91_REG EFC_FSR; // EFC Flash Status Register AT91_REG EFC_FRR; // EFC Flash Result Register AT91_REG Reserved0[1]; // AT91_REG EFC_FVR; // EFC Flash Version Register } AT91S_EFC, *AT91PS_EFC; #else #define EFC_FMR (AT91_CAST(AT91_REG *) 0x00000000) // (EFC_FMR) EFC Flash Mode Register #define EFC_FCR (AT91_CAST(AT91_REG *) 0x00000004) // (EFC_FCR) EFC Flash Command Register #define EFC_FSR (AT91_CAST(AT91_REG *) 0x00000008) // (EFC_FSR) EFC Flash Status Register #define EFC_FRR (AT91_CAST(AT91_REG *) 0x0000000C) // (EFC_FRR) EFC Flash Result Register #define EFC_FVR (AT91_CAST(AT91_REG *) 0x00000014) // (EFC_FVR) EFC Flash Version Register #endif // -------- EFC_FMR : (EFC Offset: 0x0) EFC Flash Mode Register -------- #define AT91C_EFC_FRDY (0x1 << 0) // (EFC) Ready Interrupt Enable #define AT91C_EFC_FWS (0xF << 8) // (EFC) Flash Wait State. #define AT91C_EFC_FWS_0WS (0x0 << 8) // (EFC) 0 Wait State #define AT91C_EFC_FWS_1WS (0x1 << 8) // (EFC) 1 Wait State #define AT91C_EFC_FWS_2WS (0x2 << 8) // (EFC) 2 Wait States #define AT91C_EFC_FWS_3WS (0x3 << 8) // (EFC) 3 Wait States // -------- EFC_FCR : (EFC Offset: 0x4) EFC Flash Command Register -------- #define AT91C_EFC_FCMD (0xFF << 0) // (EFC) Flash Command #define AT91C_EFC_FCMD_GETD (0x0) // (EFC) Get Flash Descriptor #define AT91C_EFC_FCMD_WP (0x1) // (EFC) Write Page #define AT91C_EFC_FCMD_WPL (0x2) // (EFC) Write Page and Lock #define AT91C_EFC_FCMD_EWP (0x3) // (EFC) Erase Page and Write Page #define AT91C_EFC_FCMD_EWPL (0x4) // (EFC) Erase Page and Write Page then Lock #define AT91C_EFC_FCMD_EA (0x5) // (EFC) Erase All #define AT91C_EFC_FCMD_EPL (0x6) // (EFC) Erase Plane #define AT91C_EFC_FCMD_EPA (0x7) // (EFC) Erase Pages #define AT91C_EFC_FCMD_SLB (0x8) // (EFC) Set Lock Bit #define AT91C_EFC_FCMD_CLB (0x9) // (EFC) Clear Lock Bit #define AT91C_EFC_FCMD_GLB (0xA) // (EFC) Get Lock Bit #define AT91C_EFC_FCMD_SFB (0xB) // (EFC) Set Fuse Bit #define AT91C_EFC_FCMD_CFB (0xC) // (EFC) Clear Fuse Bit #define AT91C_EFC_FCMD_GFB (0xD) // (EFC) Get Fuse Bit #define AT91C_EFC_FCMD_STUI (0xE) // (EFC) Start Read Unique ID #define AT91C_EFC_FCMD_SPUI (0xF) // (EFC) Stop Read Unique ID #define AT91C_EFC_FARG (0xFFFF << 8) // (EFC) Flash Command Argument #define AT91C_EFC_FKEY (0x5A << 24) // (EFC) Flash Writing Protection Key // -------- EFC_FSR : (EFC Offset: 0x8) EFC Flash Status Register -------- #define AT91C_EFC_FRDY_S (0x1 << 0) // (EFC) Flash Ready Status #define AT91C_EFC_FCMDE (0x1 << 1) // (EFC) Flash Command Error Status #define AT91C_EFC_LOCKE (0x1 << 2) // (EFC) Flash Lock Error Status // -------- EFC_FRR : (EFC Offset: 0xc) EFC Flash Result Register -------- #define AT91C_EFC_FVALUE (0x0 << 0) // (EFC) Flash Result Value // ***************************************************************************** // SOFTWARE API DEFINITION FOR Multimedia Card Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_MCI { AT91_REG MCI_CR; // MCI Control Register AT91_REG MCI_MR; // MCI Mode Register AT91_REG MCI_DTOR; // MCI Data Timeout Register AT91_REG MCI_SDCR; // MCI SD/SDIO Card Register AT91_REG MCI_ARGR; // MCI Argument Register AT91_REG MCI_CMDR; // MCI Command Register AT91_REG MCI_BLKR; // MCI Block Register AT91_REG MCI_CSTOR; // MCI Completion Signal Timeout Register AT91_REG MCI_RSPR[4]; // MCI Response Register AT91_REG MCI_RDR; // MCI Receive Data Register AT91_REG MCI_TDR; // MCI Transmit Data Register AT91_REG Reserved0[2]; // AT91_REG MCI_SR; // MCI Status Register AT91_REG MCI_IER; // MCI Interrupt Enable Register AT91_REG MCI_IDR; // MCI Interrupt Disable Register AT91_REG MCI_IMR; // MCI Interrupt Mask Register AT91_REG MCI_DMA; // MCI DMA Configuration Register AT91_REG MCI_CFG; // MCI Configuration Register AT91_REG Reserved1[35]; // AT91_REG MCI_WPCR; // MCI Write Protection Control Register AT91_REG MCI_WPSR; // MCI Write Protection Status Register AT91_REG MCI_ADDRSIZE; // MCI ADDRSIZE REGISTER AT91_REG MCI_IPNAME1; // MCI IPNAME1 REGISTER AT91_REG MCI_IPNAME2; // MCI IPNAME2 REGISTER AT91_REG MCI_FEATURES; // MCI FEATURES REGISTER AT91_REG MCI_VER; // MCI VERSION REGISTER AT91_REG MCI_RPR; // Receive Pointer Register AT91_REG MCI_RCR; // Receive Counter Register AT91_REG MCI_TPR; // Transmit Pointer Register AT91_REG MCI_TCR; // Transmit Counter Register AT91_REG MCI_RNPR; // Receive Next Pointer Register AT91_REG MCI_RNCR; // Receive Next Counter Register AT91_REG MCI_TNPR; // Transmit Next Pointer Register AT91_REG MCI_TNCR; // Transmit Next Counter Register AT91_REG MCI_PTCR; // PDC Transfer Control Register AT91_REG MCI_PTSR; // PDC Transfer Status Register AT91_REG Reserved2[54]; // AT91_REG MCI_FIFO; // MCI FIFO Aperture Register } AT91S_MCI, *AT91PS_MCI; #else #define MCI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (MCI_CR) MCI Control Register #define MCI_MR (AT91_CAST(AT91_REG *) 0x00000004) // (MCI_MR) MCI Mode Register #define MCI_DTOR (AT91_CAST(AT91_REG *) 0x00000008) // (MCI_DTOR) MCI Data Timeout Register #define MCI_SDCR (AT91_CAST(AT91_REG *) 0x0000000C) // (MCI_SDCR) MCI SD/SDIO Card Register #define MCI_ARGR (AT91_CAST(AT91_REG *) 0x00000010) // (MCI_ARGR) MCI Argument Register #define MCI_CMDR (AT91_CAST(AT91_REG *) 0x00000014) // (MCI_CMDR) MCI Command Register #define MCI_BLKR (AT91_CAST(AT91_REG *) 0x00000018) // (MCI_BLKR) MCI Block Register #define MCI_CSTOR (AT91_CAST(AT91_REG *) 0x0000001C) // (MCI_CSTOR) MCI Completion Signal Timeout Register #define MCI_RSPR (AT91_CAST(AT91_REG *) 0x00000020) // (MCI_RSPR) MCI Response Register #define MCI_RDR (AT91_CAST(AT91_REG *) 0x00000030) // (MCI_RDR) MCI Receive Data Register #define MCI_TDR (AT91_CAST(AT91_REG *) 0x00000034) // (MCI_TDR) MCI Transmit Data Register #define MCI_SR (AT91_CAST(AT91_REG *) 0x00000040) // (MCI_SR) MCI Status Register #define MCI_IER (AT91_CAST(AT91_REG *) 0x00000044) // (MCI_IER) MCI Interrupt Enable Register #define MCI_IDR (AT91_CAST(AT91_REG *) 0x00000048) // (MCI_IDR) MCI Interrupt Disable Register #define MCI_IMR (AT91_CAST(AT91_REG *) 0x0000004C) // (MCI_IMR) MCI Interrupt Mask Register #define MCI_DMA (AT91_CAST(AT91_REG *) 0x00000050) // (MCI_DMA) MCI DMA Configuration Register #define MCI_CFG (AT91_CAST(AT91_REG *) 0x00000054) // (MCI_CFG) MCI Configuration Register #define MCI_WPCR (AT91_CAST(AT91_REG *) 0x000000E4) // (MCI_WPCR) MCI Write Protection Control Register #define MCI_WPSR (AT91_CAST(AT91_REG *) 0x000000E8) // (MCI_WPSR) MCI Write Protection Status Register #define MCI_ADDRSIZE (AT91_CAST(AT91_REG *) 0x000000EC) // (MCI_ADDRSIZE) MCI ADDRSIZE REGISTER #define MCI_IPNAME1 (AT91_CAST(AT91_REG *) 0x000000F0) // (MCI_IPNAME1) MCI IPNAME1 REGISTER #define MCI_IPNAME2 (AT91_CAST(AT91_REG *) 0x000000F4) // (MCI_IPNAME2) MCI IPNAME2 REGISTER #define MCI_FEATURES (AT91_CAST(AT91_REG *) 0x000000F8) // (MCI_FEATURES) MCI FEATURES REGISTER #define MCI_VER (AT91_CAST(AT91_REG *) 0x000000FC) // (MCI_VER) MCI VERSION REGISTER #define MCI_FIFO (AT91_CAST(AT91_REG *) 0x00000200) // (MCI_FIFO) MCI FIFO Aperture Register #endif // -------- MCI_CR : (MCI Offset: 0x0) MCI Control Register -------- #define AT91C_MCI_MCIEN (0x1 << 0) // (MCI) Multimedia Interface Enable #define AT91C_MCI_MCIEN_0 (0x0) // (MCI) No effect #define AT91C_MCI_MCIEN_1 (0x1) // (MCI) Enable the MultiMedia Interface if MCIDIS is 0 #define AT91C_MCI_MCIDIS (0x1 << 1) // (MCI) Multimedia Interface Disable #define AT91C_MCI_MCIDIS_0 (0x0 << 1) // (MCI) No effect #define AT91C_MCI_MCIDIS_1 (0x1 << 1) // (MCI) Disable the MultiMedia Interface #define AT91C_MCI_PWSEN (0x1 << 2) // (MCI) Power Save Mode Enable #define AT91C_MCI_PWSEN_0 (0x0 << 2) // (MCI) No effect #define AT91C_MCI_PWSEN_1 (0x1 << 2) // (MCI) Enable the Power-saving mode if PWSDIS is 0. #define AT91C_MCI_PWSDIS (0x1 << 3) // (MCI) Power Save Mode Disable #define AT91C_MCI_PWSDIS_0 (0x0 << 3) // (MCI) No effect #define AT91C_MCI_PWSDIS_1 (0x1 << 3) // (MCI) Disable the Power-saving mode. #define AT91C_MCI_IOWAITEN (0x1 << 4) // (MCI) SDIO Read Wait Enable #define AT91C_MCI_IOWAITEN_0 (0x0 << 4) // (MCI) No effect #define AT91C_MCI_IOWAITEN_1 (0x1 << 4) // (MCI) Enables the SDIO Read Wait Operation. #define AT91C_MCI_IOWAITDIS (0x1 << 5) // (MCI) SDIO Read Wait Disable #define AT91C_MCI_IOWAITDIS_0 (0x0 << 5) // (MCI) No effect #define AT91C_MCI_IOWAITDIS_1 (0x1 << 5) // (MCI) Disables the SDIO Read Wait Operation. #define AT91C_MCI_SWRST (0x1 << 7) // (MCI) MCI Software reset #define AT91C_MCI_SWRST_0 (0x0 << 7) // (MCI) No effect #define AT91C_MCI_SWRST_1 (0x1 << 7) // (MCI) Resets the MCI // -------- MCI_MR : (MCI Offset: 0x4) MCI Mode Register -------- #define AT91C_MCI_CLKDIV (0xFF << 0) // (MCI) Clock Divider #define AT91C_MCI_PWSDIV (0x7 << 8) // (MCI) Power Saving Divider #define AT91C_MCI_RDPROOF (0x1 << 11) // (MCI) Read Proof Enable #define AT91C_MCI_RDPROOF_DISABLE (0x0 << 11) // (MCI) Disables Read Proof #define AT91C_MCI_RDPROOF_ENABLE (0x1 << 11) // (MCI) Enables Read Proof #define AT91C_MCI_WRPROOF (0x1 << 12) // (MCI) Write Proof Enable #define AT91C_MCI_WRPROOF_DISABLE (0x0 << 12) // (MCI) Disables Write Proof #define AT91C_MCI_WRPROOF_ENABLE (0x1 << 12) // (MCI) Enables Write Proof #define AT91C_MCI_PDCFBYTE (0x1 << 13) // (MCI) PDC Force Byte Transfer #define AT91C_MCI_PDCFBYTE_DISABLE (0x0 << 13) // (MCI) Disables PDC Force Byte Transfer #define AT91C_MCI_PDCFBYTE_ENABLE (0x1 << 13) // (MCI) Enables PDC Force Byte Transfer #define AT91C_MCI_PDCPADV (0x1 << 14) // (MCI) PDC Padding Value #define AT91C_MCI_PDCMODE (0x1 << 15) // (MCI) PDC Oriented Mode #define AT91C_MCI_PDCMODE_DISABLE (0x0 << 15) // (MCI) Disables PDC Transfer #define AT91C_MCI_PDCMODE_ENABLE (0x1 << 15) // (MCI) Enables PDC Transfer #define AT91C_MCI_BLKLEN (0xFFFF << 16) // (MCI) Data Block Length // -------- MCI_DTOR : (MCI Offset: 0x8) MCI Data Timeout Register -------- #define AT91C_MCI_DTOCYC (0xF << 0) // (MCI) Data Timeout Cycle Number #define AT91C_MCI_DTOMUL (0x7 << 4) // (MCI) Data Timeout Multiplier #define AT91C_MCI_DTOMUL_1 (0x0 << 4) // (MCI) DTOCYC x 1 #define AT91C_MCI_DTOMUL_16 (0x1 << 4) // (MCI) DTOCYC x 16 #define AT91C_MCI_DTOMUL_128 (0x2 << 4) // (MCI) DTOCYC x 128 #define AT91C_MCI_DTOMUL_256 (0x3 << 4) // (MCI) DTOCYC x 256 #define AT91C_MCI_DTOMUL_1024 (0x4 << 4) // (MCI) DTOCYC x 1024 #define AT91C_MCI_DTOMUL_4096 (0x5 << 4) // (MCI) DTOCYC x 4096 #define AT91C_MCI_DTOMUL_65536 (0x6 << 4) // (MCI) DTOCYC x 65536 #define AT91C_MCI_DTOMUL_1048576 (0x7 << 4) // (MCI) DTOCYC x 1048576 // -------- MCI_SDCR : (MCI Offset: 0xc) MCI SD Card Register -------- #define AT91C_MCI_SCDSEL (0x3 << 0) // (MCI) SD Card/SDIO Selector #define AT91C_MCI_SCDSEL_SLOTA (0x0) // (MCI) Slot A selected #define AT91C_MCI_SCDSEL_SLOTB (0x1) // (MCI) Slot B selected #define AT91C_MCI_SCDSEL_SLOTC (0x2) // (MCI) Slot C selected #define AT91C_MCI_SCDSEL_SLOTD (0x3) // (MCI) Slot D selected #define AT91C_MCI_SCDBUS (0x3 << 6) // (MCI) SDCard/SDIO Bus Width #define AT91C_MCI_SCDBUS_1BIT (0x0 << 6) // (MCI) 1-bit data bus #define AT91C_MCI_SCDBUS_4BITS (0x2 << 6) // (MCI) 4-bits data bus #define AT91C_MCI_SCDBUS_8BITS (0x3 << 6) // (MCI) 8-bits data bus // -------- MCI_CMDR : (MCI Offset: 0x14) MCI Command Register -------- #define AT91C_MCI_CMDNB (0x3F << 0) // (MCI) Command Number #define AT91C_MCI_RSPTYP (0x3 << 6) // (MCI) Response Type #define AT91C_MCI_RSPTYP_NO (0x0 << 6) // (MCI) No response #define AT91C_MCI_RSPTYP_48 (0x1 << 6) // (MCI) 48-bit response #define AT91C_MCI_RSPTYP_136 (0x2 << 6) // (MCI) 136-bit response #define AT91C_MCI_RSPTYP_R1B (0x3 << 6) // (MCI) R1b response #define AT91C_MCI_SPCMD (0x7 << 8) // (MCI) Special CMD #define AT91C_MCI_SPCMD_NONE (0x0 << 8) // (MCI) Not a special CMD #define AT91C_MCI_SPCMD_INIT (0x1 << 8) // (MCI) Initialization CMD #define AT91C_MCI_SPCMD_SYNC (0x2 << 8) // (MCI) Synchronized CMD #define AT91C_MCI_SPCMD_CE_ATA (0x3 << 8) // (MCI) CE-ATA Completion Signal disable CMD #define AT91C_MCI_SPCMD_IT_CMD (0x4 << 8) // (MCI) Interrupt command #define AT91C_MCI_SPCMD_IT_REP (0x5 << 8) // (MCI) Interrupt response #define AT91C_MCI_OPDCMD (0x1 << 11) // (MCI) Open Drain Command #define AT91C_MCI_OPDCMD_PUSHPULL (0x0 << 11) // (MCI) Push/pull command #define AT91C_MCI_OPDCMD_OPENDRAIN (0x1 << 11) // (MCI) Open drain command #define AT91C_MCI_MAXLAT (0x1 << 12) // (MCI) Maximum Latency for Command to respond #define AT91C_MCI_MAXLAT_5 (0x0 << 12) // (MCI) 5 cycles maximum latency #define AT91C_MCI_MAXLAT_64 (0x1 << 12) // (MCI) 64 cycles maximum latency #define AT91C_MCI_TRCMD (0x3 << 16) // (MCI) Transfer CMD #define AT91C_MCI_TRCMD_NO (0x0 << 16) // (MCI) No transfer #define AT91C_MCI_TRCMD_START (0x1 << 16) // (MCI) Start transfer #define AT91C_MCI_TRCMD_STOP (0x2 << 16) // (MCI) Stop transfer #define AT91C_MCI_TRDIR (0x1 << 18) // (MCI) Transfer Direction #define AT91C_MCI_TRDIR_WRITE (0x0 << 18) // (MCI) Write #define AT91C_MCI_TRDIR_READ (0x1 << 18) // (MCI) Read #define AT91C_MCI_TRTYP (0x7 << 19) // (MCI) Transfer Type #define AT91C_MCI_TRTYP_BLOCK (0x0 << 19) // (MCI) MMC/SDCard Single Block Transfer type #define AT91C_MCI_TRTYP_MULTIPLE (0x1 << 19) // (MCI) MMC/SDCard Multiple Block transfer type #define AT91C_MCI_TRTYP_STREAM (0x2 << 19) // (MCI) MMC Stream transfer type #define AT91C_MCI_TRTYP_SDIO_BYTE (0x4 << 19) // (MCI) SDIO Byte transfer type #define AT91C_MCI_TRTYP_SDIO_BLOCK (0x5 << 19) // (MCI) SDIO Block transfer type #define AT91C_MCI_IOSPCMD (0x3 << 24) // (MCI) SDIO Special Command #define AT91C_MCI_IOSPCMD_NONE (0x0 << 24) // (MCI) NOT a special command #define AT91C_MCI_IOSPCMD_SUSPEND (0x1 << 24) // (MCI) SDIO Suspend Command #define AT91C_MCI_IOSPCMD_RESUME (0x2 << 24) // (MCI) SDIO Resume Command #define AT91C_MCI_ATACS (0x1 << 26) // (MCI) ATA with command completion signal #define AT91C_MCI_ATACS_NORMAL (0x0 << 26) // (MCI) normal operation mode #define AT91C_MCI_ATACS_COMPLETION (0x1 << 26) // (MCI) completion signal is expected within MCI_CSTOR // -------- MCI_BLKR : (MCI Offset: 0x18) MCI Block Register -------- #define AT91C_MCI_BCNT (0xFFFF << 0) // (MCI) MMC/SDIO Block Count / SDIO Byte Count // -------- MCI_CSTOR : (MCI Offset: 0x1c) MCI Completion Signal Timeout Register -------- #define AT91C_MCI_CSTOCYC (0xF << 0) // (MCI) Completion Signal Timeout Cycle Number #define AT91C_MCI_CSTOMUL (0x7 << 4) // (MCI) Completion Signal Timeout Multiplier #define AT91C_MCI_CSTOMUL_1 (0x0 << 4) // (MCI) CSTOCYC x 1 #define AT91C_MCI_CSTOMUL_16 (0x1 << 4) // (MCI) CSTOCYC x 16 #define AT91C_MCI_CSTOMUL_128 (0x2 << 4) // (MCI) CSTOCYC x 128 #define AT91C_MCI_CSTOMUL_256 (0x3 << 4) // (MCI) CSTOCYC x 256 #define AT91C_MCI_CSTOMUL_1024 (0x4 << 4) // (MCI) CSTOCYC x 1024 #define AT91C_MCI_CSTOMUL_4096 (0x5 << 4) // (MCI) CSTOCYC x 4096 #define AT91C_MCI_CSTOMUL_65536 (0x6 << 4) // (MCI) CSTOCYC x 65536 #define AT91C_MCI_CSTOMUL_1048576 (0x7 << 4) // (MCI) CSTOCYC x 1048576 // -------- MCI_SR : (MCI Offset: 0x40) MCI Status Register -------- #define AT91C_MCI_CMDRDY (0x1 << 0) // (MCI) Command Ready flag #define AT91C_MCI_RXRDY (0x1 << 1) // (MCI) RX Ready flag #define AT91C_MCI_TXRDY (0x1 << 2) // (MCI) TX Ready flag #define AT91C_MCI_BLKE (0x1 << 3) // (MCI) Data Block Transfer Ended flag #define AT91C_MCI_DTIP (0x1 << 4) // (MCI) Data Transfer in Progress flag #define AT91C_MCI_NOTBUSY (0x1 << 5) // (MCI) Data Line Not Busy flag #define AT91C_MCI_ENDRX (0x1 << 6) // (MCI) End of RX Buffer flag #define AT91C_MCI_ENDTX (0x1 << 7) // (MCI) End of TX Buffer flag #define AT91C_MCI_SDIOIRQA (0x1 << 8) // (MCI) SDIO Interrupt for Slot A #define AT91C_MCI_SDIOIRQB (0x1 << 9) // (MCI) SDIO Interrupt for Slot B #define AT91C_MCI_SDIOIRQC (0x1 << 10) // (MCI) SDIO Interrupt for Slot C #define AT91C_MCI_SDIOIRQD (0x1 << 11) // (MCI) SDIO Interrupt for Slot D #define AT91C_MCI_SDIOWAIT (0x1 << 12) // (MCI) SDIO Read Wait operation flag #define AT91C_MCI_CSRCV (0x1 << 13) // (MCI) CE-ATA Completion Signal flag #define AT91C_MCI_RXBUFF (0x1 << 14) // (MCI) RX Buffer Full flag #define AT91C_MCI_TXBUFE (0x1 << 15) // (MCI) TX Buffer Empty flag #define AT91C_MCI_RINDE (0x1 << 16) // (MCI) Response Index Error flag #define AT91C_MCI_RDIRE (0x1 << 17) // (MCI) Response Direction Error flag #define AT91C_MCI_RCRCE (0x1 << 18) // (MCI) Response CRC Error flag #define AT91C_MCI_RENDE (0x1 << 19) // (MCI) Response End Bit Error flag #define AT91C_MCI_RTOE (0x1 << 20) // (MCI) Response Time-out Error flag #define AT91C_MCI_DCRCE (0x1 << 21) // (MCI) data CRC Error flag #define AT91C_MCI_DTOE (0x1 << 22) // (MCI) Data timeout Error flag #define AT91C_MCI_CSTOE (0x1 << 23) // (MCI) Completion Signal timeout Error flag #define AT91C_MCI_BLKOVRE (0x1 << 24) // (MCI) DMA Block Overrun Error flag #define AT91C_MCI_DMADONE (0x1 << 25) // (MCI) DMA Transfer Done flag #define AT91C_MCI_FIFOEMPTY (0x1 << 26) // (MCI) FIFO Empty flag #define AT91C_MCI_XFRDONE (0x1 << 27) // (MCI) Transfer Done flag #define AT91C_MCI_OVRE (0x1 << 30) // (MCI) Overrun flag #define AT91C_MCI_UNRE (0x1 << 31) // (MCI) Underrun flag // -------- MCI_IER : (MCI Offset: 0x44) MCI Interrupt Enable Register -------- // -------- MCI_IDR : (MCI Offset: 0x48) MCI Interrupt Disable Register -------- // -------- MCI_IMR : (MCI Offset: 0x4c) MCI Interrupt Mask Register -------- // -------- MCI_DMA : (MCI Offset: 0x50) MCI DMA Configuration Register -------- #define AT91C_MCI_OFFSET (0x3 << 0) // (MCI) DMA Write Buffer Offset #define AT91C_MCI_CHKSIZE (0x7 << 4) // (MCI) DMA Channel Read/Write Chunk Size #define AT91C_MCI_CHKSIZE_1 (0x0 << 4) // (MCI) Number of data transferred is 1 #define AT91C_MCI_CHKSIZE_4 (0x1 << 4) // (MCI) Number of data transferred is 4 #define AT91C_MCI_CHKSIZE_8 (0x2 << 4) // (MCI) Number of data transferred is 8 #define AT91C_MCI_CHKSIZE_16 (0x3 << 4) // (MCI) Number of data transferred is 16 #define AT91C_MCI_CHKSIZE_32 (0x4 << 4) // (MCI) Number of data transferred is 32 #define AT91C_MCI_DMAEN (0x1 << 8) // (MCI) DMA Hardware Handshaking Enable #define AT91C_MCI_DMAEN_DISABLE (0x0 << 8) // (MCI) DMA interface is disabled #define AT91C_MCI_DMAEN_ENABLE (0x1 << 8) // (MCI) DMA interface is enabled // -------- MCI_CFG : (MCI Offset: 0x54) MCI Configuration Register -------- #define AT91C_MCI_FIFOMODE (0x1 << 0) // (MCI) MCI Internal FIFO Control Mode #define AT91C_MCI_FIFOMODE_AMOUNTDATA (0x0) // (MCI) A write transfer starts when a sufficient amount of datas is written into the FIFO #define AT91C_MCI_FIFOMODE_ONEDATA (0x1) // (MCI) A write transfer starts as soon as one data is written into the FIFO #define AT91C_MCI_FERRCTRL (0x1 << 4) // (MCI) Flow Error Flag Reset Control Mode #define AT91C_MCI_FERRCTRL_RWCMD (0x0 << 4) // (MCI) When an underflow/overflow condition flag is set, a new Write/Read command is needed to reset the flag #define AT91C_MCI_FERRCTRL_READSR (0x1 << 4) // (MCI) When an underflow/overflow condition flag is set, a read status resets the flag #define AT91C_MCI_HSMODE (0x1 << 8) // (MCI) High Speed Mode #define AT91C_MCI_HSMODE_DISABLE (0x0 << 8) // (MCI) Default Bus Timing Mode #define AT91C_MCI_HSMODE_ENABLE (0x1 << 8) // (MCI) High Speed Mode #define AT91C_MCI_LSYNC (0x1 << 12) // (MCI) Synchronize on last block #define AT91C_MCI_LSYNC_CURRENT (0x0 << 12) // (MCI) Pending command sent at end of current data block #define AT91C_MCI_LSYNC_INFINITE (0x1 << 12) // (MCI) Pending command sent at end of block transfer when transfer length is not infinite // -------- MCI_WPCR : (MCI Offset: 0xe4) Write Protection Control Register -------- #define AT91C_MCI_WP_EN (0x1 << 0) // (MCI) Write Protection Enable #define AT91C_MCI_WP_EN_DISABLE (0x0) // (MCI) Write Operation is disabled (if WP_KEY corresponds) #define AT91C_MCI_WP_EN_ENABLE (0x1) // (MCI) Write Operation is enabled (if WP_KEY corresponds) #define AT91C_MCI_WP_KEY (0xFFFFFF << 8) // (MCI) Write Protection Key // -------- MCI_WPSR : (MCI Offset: 0xe8) Write Protection Status Register -------- #define AT91C_MCI_WP_VS (0xF << 0) // (MCI) Write Protection Violation Status #define AT91C_MCI_WP_VS_NO_VIOLATION (0x0) // (MCI) No Write Protection Violation detected since last read #define AT91C_MCI_WP_VS_ON_WRITE (0x1) // (MCI) Write Protection Violation detected since last read #define AT91C_MCI_WP_VS_ON_RESET (0x2) // (MCI) Software Reset Violation detected since last read #define AT91C_MCI_WP_VS_ON_BOTH (0x3) // (MCI) Write Protection and Software Reset Violation detected since last read #define AT91C_MCI_WP_VSRC (0xF << 8) // (MCI) Write Protection Violation Source #define AT91C_MCI_WP_VSRC_NO_VIOLATION (0x0 << 8) // (MCI) No Write Protection Violation detected since last read #define AT91C_MCI_WP_VSRC_MCI_MR (0x1 << 8) // (MCI) Write Protection Violation detected on MCI_MR since last read #define AT91C_MCI_WP_VSRC_MCI_DTOR (0x2 << 8) // (MCI) Write Protection Violation detected on MCI_DTOR since last read #define AT91C_MCI_WP_VSRC_MCI_SDCR (0x3 << 8) // (MCI) Write Protection Violation detected on MCI_SDCR since last read #define AT91C_MCI_WP_VSRC_MCI_CSTOR (0x4 << 8) // (MCI) Write Protection Violation detected on MCI_CSTOR since last read #define AT91C_MCI_WP_VSRC_MCI_DMA (0x5 << 8) // (MCI) Write Protection Violation detected on MCI_DMA since last read #define AT91C_MCI_WP_VSRC_MCI_CFG (0x6 << 8) // (MCI) Write Protection Violation detected on MCI_CFG since last read #define AT91C_MCI_WP_VSRC_MCI_DEL (0x7 << 8) // (MCI) Write Protection Violation detected on MCI_DEL since last read // -------- MCI_VER : (MCI Offset: 0xfc) VERSION Register -------- #define AT91C_MCI_VER (0xF << 0) // (MCI) VERSION Register // ***************************************************************************** // SOFTWARE API DEFINITION FOR Two-wire Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_TWI { AT91_REG TWI_CR; // Control Register AT91_REG TWI_MMR; // Master Mode Register AT91_REG TWI_SMR; // Slave Mode Register AT91_REG TWI_IADR; // Internal Address Register AT91_REG TWI_CWGR; // Clock Waveform Generator Register AT91_REG Reserved0[3]; // AT91_REG TWI_SR; // Status Register AT91_REG TWI_IER; // Interrupt Enable Register AT91_REG TWI_IDR; // Interrupt Disable Register AT91_REG TWI_IMR; // Interrupt Mask Register AT91_REG TWI_RHR; // Receive Holding Register AT91_REG TWI_THR; // Transmit Holding Register AT91_REG Reserved1[45]; // AT91_REG TWI_ADDRSIZE; // TWI ADDRSIZE REGISTER AT91_REG TWI_IPNAME1; // TWI IPNAME1 REGISTER AT91_REG TWI_IPNAME2; // TWI IPNAME2 REGISTER AT91_REG TWI_FEATURES; // TWI FEATURES REGISTER AT91_REG TWI_VER; // Version Register AT91_REG TWI_RPR; // Receive Pointer Register AT91_REG TWI_RCR; // Receive Counter Register AT91_REG TWI_TPR; // Transmit Pointer Register AT91_REG TWI_TCR; // Transmit Counter Register AT91_REG TWI_RNPR; // Receive Next Pointer Register AT91_REG TWI_RNCR; // Receive Next Counter Register AT91_REG TWI_TNPR; // Transmit Next Pointer Register AT91_REG TWI_TNCR; // Transmit Next Counter Register AT91_REG TWI_PTCR; // PDC Transfer Control Register AT91_REG TWI_PTSR; // PDC Transfer Status Register } AT91S_TWI, *AT91PS_TWI; #else #define TWI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (TWI_CR) Control Register #define TWI_MMR (AT91_CAST(AT91_REG *) 0x00000004) // (TWI_MMR) Master Mode Register #define TWI_SMR (AT91_CAST(AT91_REG *) 0x00000008) // (TWI_SMR) Slave Mode Register #define TWI_IADR (AT91_CAST(AT91_REG *) 0x0000000C) // (TWI_IADR) Internal Address Register #define TWI_CWGR (AT91_CAST(AT91_REG *) 0x00000010) // (TWI_CWGR) Clock Waveform Generator Register #define TWI_SR (AT91_CAST(AT91_REG *) 0x00000020) // (TWI_SR) Status Register #define TWI_IER (AT91_CAST(AT91_REG *) 0x00000024) // (TWI_IER) Interrupt Enable Register #define TWI_IDR (AT91_CAST(AT91_REG *) 0x00000028) // (TWI_IDR) Interrupt Disable Register #define TWI_IMR (AT91_CAST(AT91_REG *) 0x0000002C) // (TWI_IMR) Interrupt Mask Register #define TWI_RHR (AT91_CAST(AT91_REG *) 0x00000030) // (TWI_RHR) Receive Holding Register #define TWI_THR (AT91_CAST(AT91_REG *) 0x00000034) // (TWI_THR) Transmit Holding Register #define TWI_ADDRSIZE (AT91_CAST(AT91_REG *) 0x000000EC) // (TWI_ADDRSIZE) TWI ADDRSIZE REGISTER #define TWI_IPNAME1 (AT91_CAST(AT91_REG *) 0x000000F0) // (TWI_IPNAME1) TWI IPNAME1 REGISTER #define TWI_IPNAME2 (AT91_CAST(AT91_REG *) 0x000000F4) // (TWI_IPNAME2) TWI IPNAME2 REGISTER #define TWI_FEATURES (AT91_CAST(AT91_REG *) 0x000000F8) // (TWI_FEATURES) TWI FEATURES REGISTER #define TWI_VER (AT91_CAST(AT91_REG *) 0x000000FC) // (TWI_VER) Version Register #endif // -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- #define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition #define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition #define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled #define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled #define AT91C_TWI_SVEN (0x1 << 4) // (TWI) TWI Slave mode Enabled #define AT91C_TWI_SVDIS (0x1 << 5) // (TWI) TWI Slave mode Disabled #define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset // -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- #define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size #define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address #define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address #define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address #define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address #define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction #define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address // -------- TWI_SMR : (TWI Offset: 0x8) TWI Slave Mode Register -------- #define AT91C_TWI_SADR (0x7F << 16) // (TWI) Slave Address // -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- #define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider #define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider #define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider // -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- #define AT91C_TWI_TXCOMP_SLAVE (0x1 << 0) // (TWI) Transmission Completed #define AT91C_TWI_TXCOMP_MASTER (0x1 << 0) // (TWI) Transmission Completed #define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY #define AT91C_TWI_TXRDY_MASTER (0x1 << 2) // (TWI) Transmit holding register ReaDY #define AT91C_TWI_TXRDY_SLAVE (0x1 << 2) // (TWI) Transmit holding register ReaDY #define AT91C_TWI_SVREAD (0x1 << 3) // (TWI) Slave READ (used only in Slave mode) #define AT91C_TWI_SVACC (0x1 << 4) // (TWI) Slave ACCess (used only in Slave mode) #define AT91C_TWI_GACC (0x1 << 5) // (TWI) General Call ACcess (used only in Slave mode) #define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error (used only in Master and Multi-master mode) #define AT91C_TWI_NACK_SLAVE (0x1 << 8) // (TWI) Not Acknowledged #define AT91C_TWI_NACK_MASTER (0x1 << 8) // (TWI) Not Acknowledged #define AT91C_TWI_ARBLST_MULTI_MASTER (0x1 << 9) // (TWI) Arbitration Lost (used only in Multimaster mode) #define AT91C_TWI_SCLWS (0x1 << 10) // (TWI) Clock Wait State (used only in Slave mode) #define AT91C_TWI_EOSACC (0x1 << 11) // (TWI) End Of Slave ACCess (used only in Slave mode) #define AT91C_TWI_ENDRX (0x1 << 12) // (TWI) End of Receiver Transfer #define AT91C_TWI_ENDTX (0x1 << 13) // (TWI) End of Receiver Transfer #define AT91C_TWI_RXBUFF (0x1 << 14) // (TWI) RXBUFF Interrupt #define AT91C_TWI_TXBUFE (0x1 << 15) // (TWI) TXBUFE Interrupt // -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- // -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- // -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- // ***************************************************************************** // SOFTWARE API DEFINITION FOR Usart // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_USART { AT91_REG US_CR; // Control Register AT91_REG US_MR; // Mode Register AT91_REG US_IER; // Interrupt Enable Register AT91_REG US_IDR; // Interrupt Disable Register AT91_REG US_IMR; // Interrupt Mask Register AT91_REG US_CSR; // Channel Status Register AT91_REG US_RHR; // Receiver Holding Register AT91_REG US_THR; // Transmitter Holding Register AT91_REG US_BRGR; // Baud Rate Generator Register AT91_REG US_RTOR; // Receiver Time-out Register AT91_REG US_TTGR; // Transmitter Time-guard Register AT91_REG Reserved0[5]; // AT91_REG US_FIDI; // FI_DI_Ratio Register AT91_REG US_NER; // Nb Errors Register AT91_REG Reserved1[1]; // AT91_REG US_IF; // IRDA_FILTER Register AT91_REG US_MAN; // Manchester Encoder Decoder Register AT91_REG Reserved2[38]; // AT91_REG US_ADDRSIZE; // US ADDRSIZE REGISTER AT91_REG US_IPNAME1; // US IPNAME1 REGISTER AT91_REG US_IPNAME2; // US IPNAME2 REGISTER AT91_REG US_FEATURES; // US FEATURES REGISTER AT91_REG US_VER; // VERSION Register AT91_REG US_RPR; // Receive Pointer Register AT91_REG US_RCR; // Receive Counter Register AT91_REG US_TPR; // Transmit Pointer Register AT91_REG US_TCR; // Transmit Counter Register AT91_REG US_RNPR; // Receive Next Pointer Register AT91_REG US_RNCR; // Receive Next Counter Register AT91_REG US_TNPR; // Transmit Next Pointer Register AT91_REG US_TNCR; // Transmit Next Counter Register AT91_REG US_PTCR; // PDC Transfer Control Register AT91_REG US_PTSR; // PDC Transfer Status Register } AT91S_USART, *AT91PS_USART; #else #define US_CR (AT91_CAST(AT91_REG *) 0x00000000) // (US_CR) Control Register #define US_MR (AT91_CAST(AT91_REG *) 0x00000004) // (US_MR) Mode Register #define US_IER (AT91_CAST(AT91_REG *) 0x00000008) // (US_IER) Interrupt Enable Register #define US_IDR (AT91_CAST(AT91_REG *) 0x0000000C) // (US_IDR) Interrupt Disable Register #define US_IMR (AT91_CAST(AT91_REG *) 0x00000010) // (US_IMR) Interrupt Mask Register #define US_CSR (AT91_CAST(AT91_REG *) 0x00000014) // (US_CSR) Channel Status Register #define US_RHR (AT91_CAST(AT91_REG *) 0x00000018) // (US_RHR) Receiver Holding Register #define US_THR (AT91_CAST(AT91_REG *) 0x0000001C) // (US_THR) Transmitter Holding Register #define US_BRGR (AT91_CAST(AT91_REG *) 0x00000020) // (US_BRGR) Baud Rate Generator Register #define US_RTOR (AT91_CAST(AT91_REG *) 0x00000024) // (US_RTOR) Receiver Time-out Register #define US_TTGR (AT91_CAST(AT91_REG *) 0x00000028) // (US_TTGR) Transmitter Time-guard Register #define US_FIDI (AT91_CAST(AT91_REG *) 0x00000040) // (US_FIDI) FI_DI_Ratio Register #define US_NER (AT91_CAST(AT91_REG *) 0x00000044) // (US_NER) Nb Errors Register #define US_IF (AT91_CAST(AT91_REG *) 0x0000004C) // (US_IF) IRDA_FILTER Register #define US_MAN (AT91_CAST(AT91_REG *) 0x00000050) // (US_MAN) Manchester Encoder Decoder Register #define US_ADDRSIZE (AT91_CAST(AT91_REG *) 0x000000EC) // (US_ADDRSIZE) US ADDRSIZE REGISTER #define US_IPNAME1 (AT91_CAST(AT91_REG *) 0x000000F0) // (US_IPNAME1) US IPNAME1 REGISTER #define US_IPNAME2 (AT91_CAST(AT91_REG *) 0x000000F4) // (US_IPNAME2) US IPNAME2 REGISTER #define US_FEATURES (AT91_CAST(AT91_REG *) 0x000000F8) // (US_FEATURES) US FEATURES REGISTER #define US_VER (AT91_CAST(AT91_REG *) 0x000000FC) // (US_VER) VERSION Register #endif // -------- US_CR : (USART Offset: 0x0) Control Register -------- #define AT91C_US_RSTRX (0x1 << 2) // (USART) Reset Receiver #define AT91C_US_RSTTX (0x1 << 3) // (USART) Reset Transmitter #define AT91C_US_RXEN (0x1 << 4) // (USART) Receiver Enable #define AT91C_US_RXDIS (0x1 << 5) // (USART) Receiver Disable #define AT91C_US_TXEN (0x1 << 6) // (USART) Transmitter Enable #define AT91C_US_TXDIS (0x1 << 7) // (USART) Transmitter Disable #define AT91C_US_RSTSTA (0x1 << 8) // (USART) Reset Status Bits #define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break #define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break #define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out #define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address #define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations #define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge #define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out #define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable #define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable #define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable #define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable // -------- US_MR : (USART Offset: 0x4) Mode Register -------- #define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode #define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal #define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 #define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking #define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem #define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 #define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 #define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA #define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking #define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock #define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock #define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 #define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) #define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) #define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock #define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits #define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits #define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits #define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits #define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select #define AT91C_US_PAR (0x7 << 9) // (USART) Parity type #define AT91C_US_PAR_EVEN (0x0 << 9) // (USART) Even Parity #define AT91C_US_PAR_ODD (0x1 << 9) // (USART) Odd Parity #define AT91C_US_PAR_SPACE (0x2 << 9) // (USART) Parity forced to 0 (Space) #define AT91C_US_PAR_MARK (0x3 << 9) // (USART) Parity forced to 1 (Mark) #define AT91C_US_PAR_NONE (0x4 << 9) // (USART) No Parity #define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (USART) Multi-drop mode #define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits #define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit #define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits #define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits #define AT91C_US_CHMODE (0x3 << 14) // (USART) Channel Mode #define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (USART) Normal Mode: The USART channel operates as an RX/TX USART. #define AT91C_US_CHMODE_AUTO (0x1 << 14) // (USART) Automatic Echo: Receiver Data Input is connected to the TXD pin. #define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (USART) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. #define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (USART) Remote Loopback: RXD pin is internally connected to TXD pin. #define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order #define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length #define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select #define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode #define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge #define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK #define AT91C_US_VAR_SYNC (0x1 << 22) // (USART) Variable synchronization of command/data sync Start Frame Delimiter #define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions #define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter #define AT91C_US_MANMODE (0x1 << 29) // (USART) Manchester Encoder/Decoder Enable #define AT91C_US_MODSYNC (0x1 << 30) // (USART) Manchester Synchronization mode #define AT91C_US_ONEBIT (0x1 << 31) // (USART) Start Frame Delimiter selector // -------- US_IER : (USART Offset: 0x8) Interrupt Enable Register -------- #define AT91C_US_RXRDY (0x1 << 0) // (USART) RXRDY Interrupt #define AT91C_US_TXRDY (0x1 << 1) // (USART) TXRDY Interrupt #define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break #define AT91C_US_ENDRX (0x1 << 3) // (USART) End of Receive Transfer Interrupt #define AT91C_US_ENDTX (0x1 << 4) // (USART) End of Transmit Interrupt #define AT91C_US_OVRE (0x1 << 5) // (USART) Overrun Interrupt #define AT91C_US_FRAME (0x1 << 6) // (USART) Framing Error Interrupt #define AT91C_US_PARE (0x1 << 7) // (USART) Parity Error Interrupt #define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out #define AT91C_US_TXEMPTY (0x1 << 9) // (USART) TXEMPTY Interrupt #define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached #define AT91C_US_TXBUFE (0x1 << 11) // (USART) TXBUFE Interrupt #define AT91C_US_RXBUFF (0x1 << 12) // (USART) RXBUFF Interrupt #define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge #define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag #define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag #define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag #define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag #define AT91C_US_MANE (0x1 << 20) // (USART) Manchester Error Interrupt // -------- US_IDR : (USART Offset: 0xc) Interrupt Disable Register -------- // -------- US_IMR : (USART Offset: 0x10) Interrupt Mask Register -------- // -------- US_CSR : (USART Offset: 0x14) Channel Status Register -------- #define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input #define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input #define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input #define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input #define AT91C_US_MANERR (0x1 << 24) // (USART) Manchester Error // -------- US_MAN : (USART Offset: 0x50) Manchester Encoder Decoder Register -------- #define AT91C_US_TX_PL (0xF << 0) // (USART) Transmitter Preamble Length #define AT91C_US_TX_PP (0x3 << 8) // (USART) Transmitter Preamble Pattern #define AT91C_US_TX_PP_ALL_ONE (0x0 << 8) // (USART) ALL_ONE #define AT91C_US_TX_PP_ALL_ZERO (0x1 << 8) // (USART) ALL_ZERO #define AT91C_US_TX_PP_ZERO_ONE (0x2 << 8) // (USART) ZERO_ONE #define AT91C_US_TX_PP_ONE_ZERO (0x3 << 8) // (USART) ONE_ZERO #define AT91C_US_TX_MPOL (0x1 << 12) // (USART) Transmitter Manchester Polarity #define AT91C_US_RX_PL (0xF << 16) // (USART) Receiver Preamble Length #define AT91C_US_RX_PP (0x3 << 24) // (USART) Receiver Preamble Pattern detected #define AT91C_US_RX_PP_ALL_ONE (0x0 << 24) // (USART) ALL_ONE #define AT91C_US_RX_PP_ALL_ZERO (0x1 << 24) // (USART) ALL_ZERO #define AT91C_US_RX_PP_ZERO_ONE (0x2 << 24) // (USART) ZERO_ONE #define AT91C_US_RX_PP_ONE_ZERO (0x3 << 24) // (USART) ONE_ZERO #define AT91C_US_RX_MPOL (0x1 << 28) // (USART) Receiver Manchester Polarity #define AT91C_US_DRIFT (0x1 << 30) // (USART) Drift compensation // ***************************************************************************** // SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_SSC { AT91_REG SSC_CR; // Control Register AT91_REG SSC_CMR; // Clock Mode Register AT91_REG Reserved0[2]; // AT91_REG SSC_RCMR; // Receive Clock ModeRegister AT91_REG SSC_RFMR; // Receive Frame Mode Register AT91_REG SSC_TCMR; // Transmit Clock Mode Register AT91_REG SSC_TFMR; // Transmit Frame Mode Register AT91_REG SSC_RHR; // Receive Holding Register AT91_REG SSC_THR; // Transmit Holding Register AT91_REG Reserved1[2]; // AT91_REG SSC_RSHR; // Receive Sync Holding Register AT91_REG SSC_TSHR; // Transmit Sync Holding Register AT91_REG SSC_RC0R; // Receive Compare 0 Register AT91_REG SSC_RC1R; // Receive Compare 1 Register AT91_REG SSC_SR; // Status Register AT91_REG SSC_IER; // Interrupt Enable Register AT91_REG SSC_IDR; // Interrupt Disable Register AT91_REG SSC_IMR; // Interrupt Mask Register } AT91S_SSC, *AT91PS_SSC; #else #define SSC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SSC_CR) Control Register #define SSC_CMR (AT91_CAST(AT91_REG *) 0x00000004) // (SSC_CMR) Clock Mode Register #define SSC_RCMR (AT91_CAST(AT91_REG *) 0x00000010) // (SSC_RCMR) Receive Clock ModeRegister #define SSC_RFMR (AT91_CAST(AT91_REG *) 0x00000014) // (SSC_RFMR) Receive Frame Mode Register #define SSC_TCMR (AT91_CAST(AT91_REG *) 0x00000018) // (SSC_TCMR) Transmit Clock Mode Register #define SSC_TFMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SSC_TFMR) Transmit Frame Mode Register #define SSC_RHR (AT91_CAST(AT91_REG *) 0x00000020) // (SSC_RHR) Receive Holding Register #define SSC_THR (AT91_CAST(AT91_REG *) 0x00000024) // (SSC_THR) Transmit Holding Register #define SSC_RSHR (AT91_CAST(AT91_REG *) 0x00000030) // (SSC_RSHR) Receive Sync Holding Register #define SSC_TSHR (AT91_CAST(AT91_REG *) 0x00000034) // (SSC_TSHR) Transmit Sync Holding Register #define SSC_RC0R (AT91_CAST(AT91_REG *) 0x00000038) // (SSC_RC0R) Receive Compare 0 Register #define SSC_RC1R (AT91_CAST(AT91_REG *) 0x0000003C) // (SSC_RC1R) Receive Compare 1 Register #define SSC_SR (AT91_CAST(AT91_REG *) 0x00000040) // (SSC_SR) Status Register #define SSC_IER (AT91_CAST(AT91_REG *) 0x00000044) // (SSC_IER) Interrupt Enable Register #define SSC_IDR (AT91_CAST(AT91_REG *) 0x00000048) // (SSC_IDR) Interrupt Disable Register #define SSC_IMR (AT91_CAST(AT91_REG *) 0x0000004C) // (SSC_IMR) Interrupt Mask Register #endif // -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- #define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable #define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable #define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable #define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable #define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset // -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- #define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection #define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock #define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal #define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin #define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection #define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only #define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output #define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output #define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion #define AT91C_SSC_CKG (0x3 << 6) // (SSC) Receive/Transmit Clock Gating Selection #define AT91C_SSC_CKG_NONE (0x0 << 6) // (SSC) Receive/Transmit Clock Gating: None, continuous clock #define AT91C_SSC_CKG_LOW (0x1 << 6) // (SSC) Receive/Transmit Clock enabled only if RF Low #define AT91C_SSC_CKG_HIGH (0x2 << 6) // (SSC) Receive/Transmit Clock enabled only if RF High #define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection #define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. #define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start #define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input #define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input #define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input #define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input #define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input #define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input #define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 #define AT91C_SSC_STOP (0x1 << 12) // (SSC) Receive Stop Selection #define AT91C_SSC_STTOUT (0x1 << 15) // (SSC) Receive/Transmit Start Output Selection #define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay #define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection // -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- #define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length #define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode #define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First #define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame #define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length #define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection #define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only #define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse #define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse #define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer #define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer #define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer #define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection // -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- // -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- #define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value #define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable // -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- #define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready #define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty #define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission #define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty #define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready #define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun #define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception #define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full #define AT91C_SSC_CP0 (0x1 << 8) // (SSC) Compare 0 #define AT91C_SSC_CP1 (0x1 << 9) // (SSC) Compare 1 #define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync #define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync #define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable #define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable // -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- // -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- // -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- // ***************************************************************************** // SOFTWARE API DEFINITION FOR PWMC Channel Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_PWMC_CH { AT91_REG PWMC_CMR; // Channel Mode Register AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register AT91_REG PWMC_CDTYUPDR; // Channel Duty Cycle Update Register AT91_REG PWMC_CPRDR; // Channel Period Register AT91_REG PWMC_CPRDUPDR; // Channel Period Update Register AT91_REG PWMC_CCNTR; // Channel Counter Register AT91_REG PWMC_DTR; // Channel Dead Time Value Register AT91_REG PWMC_DTUPDR; // Channel Dead Time Update Value Register } AT91S_PWMC_CH, *AT91PS_PWMC_CH; #else #define PWMC_CMR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_CMR) Channel Mode Register #define PWMC_CDTYR (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_CDTYR) Channel Duty Cycle Register #define PWMC_CDTYUPDR (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_CDTYUPDR) Channel Duty Cycle Update Register #define PWMC_CPRDR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_CPRDR) Channel Period Register #define PWMC_CPRDUPDR (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_CPRDUPDR) Channel Period Update Register #define PWMC_CCNTR (AT91_CAST(AT91_REG *) 0x00000014) // (PWMC_CCNTR) Channel Counter Register #define PWMC_DTR (AT91_CAST(AT91_REG *) 0x00000018) // (PWMC_DTR) Channel Dead Time Value Register #define PWMC_DTUPDR (AT91_CAST(AT91_REG *) 0x0000001C) // (PWMC_DTUPDR) Channel Dead Time Update Value Register #endif // -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- #define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx #define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) #define AT91C_PWMC_CPRE_MCK_DIV_2 (0x1) // (PWMC_CH) #define AT91C_PWMC_CPRE_MCK_DIV_4 (0x2) // (PWMC_CH) #define AT91C_PWMC_CPRE_MCK_DIV_8 (0x3) // (PWMC_CH) #define AT91C_PWMC_CPRE_MCK_DIV_16 (0x4) // (PWMC_CH) #define AT91C_PWMC_CPRE_MCK_DIV_32 (0x5) // (PWMC_CH) #define AT91C_PWMC_CPRE_MCK_DIV_64 (0x6) // (PWMC_CH) #define AT91C_PWMC_CPRE_MCK_DIV_128 (0x7) // (PWMC_CH) #define AT91C_PWMC_CPRE_MCK_DIV_256 (0x8) // (PWMC_CH) #define AT91C_PWMC_CPRE_MCK_DIV_512 (0x9) // (PWMC_CH) #define AT91C_PWMC_CPRE_MCK_DIV_1024 (0xA) // (PWMC_CH) #define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) #define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) #define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment #define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity #define AT91C_PWMC_CES (0x1 << 10) // (PWMC_CH) Counter Event Selection #define AT91C_PWMC_DTE (0x1 << 16) // (PWMC_CH) Dead Time Genrator Enable #define AT91C_PWMC_DTHI (0x1 << 17) // (PWMC_CH) Dead Time PWMHx Output Inverted #define AT91C_PWMC_DTLI (0x1 << 18) // (PWMC_CH) Dead Time PWMLx Output Inverted // -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- #define AT91C_PWMC_CDTY (0xFFFFFF << 0) // (PWMC_CH) Channel Duty Cycle // -------- PWMC_CDTYUPDR : (PWMC_CH Offset: 0x8) PWMC Channel Duty Cycle Update Register -------- #define AT91C_PWMC_CDTYUPD (0xFFFFFF << 0) // (PWMC_CH) Channel Duty Cycle Update // -------- PWMC_CPRDR : (PWMC_CH Offset: 0xc) PWMC Channel Period Register -------- #define AT91C_PWMC_CPRD (0xFFFFFF << 0) // (PWMC_CH) Channel Period // -------- PWMC_CPRDUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Period Update Register -------- #define AT91C_PWMC_CPRDUPD (0xFFFFFF << 0) // (PWMC_CH) Channel Period Update // -------- PWMC_CCNTR : (PWMC_CH Offset: 0x14) PWMC Channel Counter Register -------- #define AT91C_PWMC_CCNT (0xFFFFFF << 0) // (PWMC_CH) Channel Counter // -------- PWMC_DTR : (PWMC_CH Offset: 0x18) Channel Dead Time Value Register -------- #define AT91C_PWMC_DTL (0xFFFF << 0) // (PWMC_CH) Channel Dead Time for PWML #define AT91C_PWMC_DTH (0xFFFF << 16) // (PWMC_CH) Channel Dead Time for PWMH // -------- PWMC_DTUPDR : (PWMC_CH Offset: 0x1c) Channel Dead Time Value Register -------- #define AT91C_PWMC_DTLUPD (0xFFFF << 0) // (PWMC_CH) Channel Dead Time Update for PWML. #define AT91C_PWMC_DTHUPD (0xFFFF << 16) // (PWMC_CH) Channel Dead Time Update for PWMH. // ***************************************************************************** // SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_PWMC { AT91_REG PWMC_MR; // PWMC Mode Register AT91_REG PWMC_ENA; // PWMC Enable Register AT91_REG PWMC_DIS; // PWMC Disable Register AT91_REG PWMC_SR; // PWMC Status Register AT91_REG PWMC_IER1; // PWMC Interrupt Enable Register 1 AT91_REG PWMC_IDR1; // PWMC Interrupt Disable Register 1 AT91_REG PWMC_IMR1; // PWMC Interrupt Mask Register 1 AT91_REG PWMC_ISR1; // PWMC Interrupt Status Register 1 AT91_REG PWMC_SYNC; // PWM Synchronized Channels Register AT91_REG Reserved0[1]; // AT91_REG PWMC_UPCR; // PWM Update Control Register AT91_REG PWMC_SCUP; // PWM Update Period Register AT91_REG PWMC_SCUPUPD; // PWM Update Period Update Register AT91_REG PWMC_IER2; // PWMC Interrupt Enable Register 2 AT91_REG PWMC_IDR2; // PWMC Interrupt Disable Register 2 AT91_REG PWMC_IMR2; // PWMC Interrupt Mask Register 2 AT91_REG PWMC_ISR2; // PWMC Interrupt Status Register 2 AT91_REG PWMC_OOV; // PWM Output Override Value Register AT91_REG PWMC_OS; // PWM Output Selection Register AT91_REG PWMC_OSS; // PWM Output Selection Set Register AT91_REG PWMC_OSC; // PWM Output Selection Clear Register AT91_REG PWMC_OSSUPD; // PWM Output Selection Set Update Register AT91_REG PWMC_OSCUPD; // PWM Output Selection Clear Update Register AT91_REG PWMC_FMR; // PWM Fault Mode Register AT91_REG PWMC_FSR; // PWM Fault Mode Status Register AT91_REG PWMC_FCR; // PWM Fault Mode Clear Register AT91_REG PWMC_FPV; // PWM Fault Protection Value Register AT91_REG PWMC_FPER1; // PWM Fault Protection Enable Register 1 AT91_REG PWMC_FPER2; // PWM Fault Protection Enable Register 2 AT91_REG PWMC_FPER3; // PWM Fault Protection Enable Register 3 AT91_REG PWMC_FPER4; // PWM Fault Protection Enable Register 4 AT91_REG PWMC_EL0MR; // PWM Event Line 0 Mode Register AT91_REG PWMC_EL1MR; // PWM Event Line 1 Mode Register AT91_REG PWMC_EL2MR; // PWM Event Line 2 Mode Register AT91_REG PWMC_EL3MR; // PWM Event Line 3 Mode Register AT91_REG PWMC_EL4MR; // PWM Event Line 4 Mode Register AT91_REG PWMC_EL5MR; // PWM Event Line 5 Mode Register AT91_REG PWMC_EL6MR; // PWM Event Line 6 Mode Register AT91_REG PWMC_EL7MR; // PWM Event Line 7 Mode Register AT91_REG Reserved1[18]; // AT91_REG PWMC_WPCR; // PWM Write Protection Enable Register AT91_REG PWMC_WPSR; // PWM Write Protection Status Register AT91_REG PWMC_ADDRSIZE; // PWMC ADDRSIZE REGISTER AT91_REG PWMC_IPNAME1; // PWMC IPNAME1 REGISTER AT91_REG PWMC_IPNAME2; // PWMC IPNAME2 REGISTER AT91_REG PWMC_FEATURES; // PWMC FEATURES REGISTER AT91_REG PWMC_VER; // PWMC Version Register AT91_REG PWMC_RPR; // Receive Pointer Register AT91_REG PWMC_RCR; // Receive Counter Register AT91_REG PWMC_TPR; // Transmit Pointer Register AT91_REG PWMC_TCR; // Transmit Counter Register AT91_REG PWMC_RNPR; // Receive Next Pointer Register AT91_REG PWMC_RNCR; // Receive Next Counter Register AT91_REG PWMC_TNPR; // Transmit Next Pointer Register AT91_REG PWMC_TNCR; // Transmit Next Counter Register AT91_REG PWMC_PTCR; // PDC Transfer Control Register AT91_REG PWMC_PTSR; // PDC Transfer Status Register AT91_REG Reserved2[2]; // AT91_REG PWMC_CMP0V; // PWM Comparison Value 0 Register AT91_REG PWMC_CMP0VUPD; // PWM Comparison Value 0 Update Register AT91_REG PWMC_CMP0M; // PWM Comparison Mode 0 Register AT91_REG PWMC_CMP0MUPD; // PWM Comparison Mode 0 Update Register AT91_REG PWMC_CMP1V; // PWM Comparison Value 1 Register AT91_REG PWMC_CMP1VUPD; // PWM Comparison Value 1 Update Register AT91_REG PWMC_CMP1M; // PWM Comparison Mode 1 Register AT91_REG PWMC_CMP1MUPD; // PWM Comparison Mode 1 Update Register AT91_REG PWMC_CMP2V; // PWM Comparison Value 2 Register AT91_REG PWMC_CMP2VUPD; // PWM Comparison Value 2 Update Register AT91_REG PWMC_CMP2M; // PWM Comparison Mode 2 Register AT91_REG PWMC_CMP2MUPD; // PWM Comparison Mode 2 Update Register AT91_REG PWMC_CMP3V; // PWM Comparison Value 3 Register AT91_REG PWMC_CMP3VUPD; // PWM Comparison Value 3 Update Register AT91_REG PWMC_CMP3M; // PWM Comparison Mode 3 Register AT91_REG PWMC_CMP3MUPD; // PWM Comparison Mode 3 Update Register AT91_REG PWMC_CMP4V; // PWM Comparison Value 4 Register AT91_REG PWMC_CMP4VUPD; // PWM Comparison Value 4 Update Register AT91_REG PWMC_CMP4M; // PWM Comparison Mode 4 Register AT91_REG PWMC_CMP4MUPD; // PWM Comparison Mode 4 Update Register AT91_REG PWMC_CMP5V; // PWM Comparison Value 5 Register AT91_REG PWMC_CMP5VUPD; // PWM Comparison Value 5 Update Register AT91_REG PWMC_CMP5M; // PWM Comparison Mode 5 Register AT91_REG PWMC_CMP5MUPD; // PWM Comparison Mode 5 Update Register AT91_REG PWMC_CMP6V; // PWM Comparison Value 6 Register AT91_REG PWMC_CMP6VUPD; // PWM Comparison Value 6 Update Register AT91_REG PWMC_CMP6M; // PWM Comparison Mode 6 Register AT91_REG PWMC_CMP6MUPD; // PWM Comparison Mode 6 Update Register AT91_REG PWMC_CMP7V; // PWM Comparison Value 7 Register AT91_REG PWMC_CMP7VUPD; // PWM Comparison Value 7 Update Register AT91_REG PWMC_CMP7M; // PWM Comparison Mode 7 Register AT91_REG PWMC_CMP7MUPD; // PWM Comparison Mode 7 Update Register AT91_REG Reserved3[20]; // AT91S_PWMC_CH PWMC_CH[8]; // PWMC Channel 0 } AT91S_PWMC, *AT91PS_PWMC; #else #define PWMC_MR (AT91_CAST(AT91_REG *) 0x00000000) // (PWMC_MR) PWMC Mode Register #define PWMC_ENA (AT91_CAST(AT91_REG *) 0x00000004) // (PWMC_ENA) PWMC Enable Register #define PWMC_DIS (AT91_CAST(AT91_REG *) 0x00000008) // (PWMC_DIS) PWMC Disable Register #define PWMC_SR (AT91_CAST(AT91_REG *) 0x0000000C) // (PWMC_SR) PWMC Status Register #define PWMC_IER1 (AT91_CAST(AT91_REG *) 0x00000010) // (PWMC_IER1) PWMC Interrupt Enable Register 1 #define PWMC_IDR1 (AT91_CAST(AT91_REG *) 0x00000014) // (PWMC_IDR1) PWMC Interrupt Disable Register 1 #define PWMC_IMR1 (AT91_CAST(AT91_REG *) 0x00000018) // (PWMC_IMR1) PWMC Interrupt Mask Register 1 #define PWMC_ISR1 (AT91_CAST(AT91_REG *) 0x0000001C) // (PWMC_ISR1) PWMC Interrupt Status Register 1 #define PWMC_SYNC (AT91_CAST(AT91_REG *) 0x00000020) // (PWMC_SYNC) PWM Synchronized Channels Register #define PWMC_UPCR (AT91_CAST(AT91_REG *) 0x00000028) // (PWMC_UPCR) PWM Update Control Register #define PWMC_SCUP (AT91_CAST(AT91_REG *) 0x0000002C) // (PWMC_SCUP) PWM Update Period Register #define PWMC_SCUPUPD (AT91_CAST(AT91_REG *) 0x00000030) // (PWMC_SCUPUPD) PWM Update Period Update Register #define PWMC_IER2 (AT91_CAST(AT91_REG *) 0x00000034) // (PWMC_IER2) PWMC Interrupt Enable Register 2 #define PWMC_IDR2 (AT91_CAST(AT91_REG *) 0x00000038) // (PWMC_IDR2) PWMC Interrupt Disable Register 2 #define PWMC_IMR2 (AT91_CAST(AT91_REG *) 0x0000003C) // (PWMC_IMR2) PWMC Interrupt Mask Register 2 #define PWMC_ISR2 (AT91_CAST(AT91_REG *) 0x00000040) // (PWMC_ISR2) PWMC Interrupt Status Register 2 #define PWMC_OOV (AT91_CAST(AT91_REG *) 0x00000044) // (PWMC_OOV) PWM Output Override Value Register #define PWMC_OS (AT91_CAST(AT91_REG *) 0x00000048) // (PWMC_OS) PWM Output Selection Register #define PWMC_OSS (AT91_CAST(AT91_REG *) 0x0000004C) // (PWMC_OSS) PWM Output Selection Set Register #define PWMC_OSC (AT91_CAST(AT91_REG *) 0x00000050) // (PWMC_OSC) PWM Output Selection Clear Register #define PWMC_OSSUPD (AT91_CAST(AT91_REG *) 0x00000054) // (PWMC_OSSUPD) PWM Output Selection Set Update Register #define PWMC_OSCUPD (AT91_CAST(AT91_REG *) 0x00000058) // (PWMC_OSCUPD) PWM Output Selection Clear Update Register #define PWMC_FMR (AT91_CAST(AT91_REG *) 0x0000005C) // (PWMC_FMR) PWM Fault Mode Register #define PWMC_FSR (AT91_CAST(AT91_REG *) 0x00000060) // (PWMC_FSR) PWM Fault Mode Status Register #define PWMC_FCR (AT91_CAST(AT91_REG *) 0x00000064) // (PWMC_FCR) PWM Fault Mode Clear Register #define PWMC_FPV (AT91_CAST(AT91_REG *) 0x00000068) // (PWMC_FPV) PWM Fault Protection Value Register #define PWMC_FPER1 (AT91_CAST(AT91_REG *) 0x0000006C) // (PWMC_FPER1) PWM Fault Protection Enable Register 1 #define PWMC_FPER2 (AT91_CAST(AT91_REG *) 0x00000070) // (PWMC_FPER2) PWM Fault Protection Enable Register 2 #define PWMC_FPER3 (AT91_CAST(AT91_REG *) 0x00000074) // (PWMC_FPER3) PWM Fault Protection Enable Register 3 #define PWMC_FPER4 (AT91_CAST(AT91_REG *) 0x00000078) // (PWMC_FPER4) PWM Fault Protection Enable Register 4 #define PWMC_EL0MR (AT91_CAST(AT91_REG *) 0x0000007C) // (PWMC_EL0MR) PWM Event Line 0 Mode Register #define PWMC_EL1MR (AT91_CAST(AT91_REG *) 0x00000080) // (PWMC_EL1MR) PWM Event Line 1 Mode Register #define PWMC_EL2MR (AT91_CAST(AT91_REG *) 0x00000084) // (PWMC_EL2MR) PWM Event Line 2 Mode Register #define PWMC_EL3MR (AT91_CAST(AT91_REG *) 0x00000088) // (PWMC_EL3MR) PWM Event Line 3 Mode Register #define PWMC_EL4MR (AT91_CAST(AT91_REG *) 0x0000008C) // (PWMC_EL4MR) PWM Event Line 4 Mode Register #define PWMC_EL5MR (AT91_CAST(AT91_REG *) 0x00000090) // (PWMC_EL5MR) PWM Event Line 5 Mode Register #define PWMC_EL6MR (AT91_CAST(AT91_REG *) 0x00000094) // (PWMC_EL6MR) PWM Event Line 6 Mode Register #define PWMC_EL7MR (AT91_CAST(AT91_REG *) 0x00000098) // (PWMC_EL7MR) PWM Event Line 7 Mode Register #define PWMC_WPCR (AT91_CAST(AT91_REG *) 0x000000E4) // (PWMC_WPCR) PWM Write Protection Enable Register #define PWMC_WPSR (AT91_CAST(AT91_REG *) 0x000000E8) // (PWMC_WPSR) PWM Write Protection Status Register #define PWMC_ADDRSIZE (AT91_CAST(AT91_REG *) 0x000000EC) // (PWMC_ADDRSIZE) PWMC ADDRSIZE REGISTER #define PWMC_IPNAME1 (AT91_CAST(AT91_REG *) 0x000000F0) // (PWMC_IPNAME1) PWMC IPNAME1 REGISTER #define PWMC_IPNAME2 (AT91_CAST(AT91_REG *) 0x000000F4) // (PWMC_IPNAME2) PWMC IPNAME2 REGISTER #define PWMC_FEATURES (AT91_CAST(AT91_REG *) 0x000000F8) // (PWMC_FEATURES) PWMC FEATURES REGISTER #define PWMC_VER (AT91_CAST(AT91_REG *) 0x000000FC) // (PWMC_VER) PWMC Version Register #define PWMC_CMP0V (AT91_CAST(AT91_REG *) 0x00000130) // (PWMC_CMP0V) PWM Comparison Value 0 Register #define PWMC_CMP0VUPD (AT91_CAST(AT91_REG *) 0x00000134) // (PWMC_CMP0VUPD) PWM Comparison Value 0 Update Register #define PWMC_CMP0M (AT91_CAST(AT91_REG *) 0x00000138) // (PWMC_CMP0M) PWM Comparison Mode 0 Register #define PWMC_CMP0MUPD (AT91_CAST(AT91_REG *) 0x0000013C) // (PWMC_CMP0MUPD) PWM Comparison Mode 0 Update Register #define PWMC_CMP1V (AT91_CAST(AT91_REG *) 0x00000140) // (PWMC_CMP1V) PWM Comparison Value 1 Register #define PWMC_CMP1VUPD (AT91_CAST(AT91_REG *) 0x00000144) // (PWMC_CMP1VUPD) PWM Comparison Value 1 Update Register #define PWMC_CMP1M (AT91_CAST(AT91_REG *) 0x00000148) // (PWMC_CMP1M) PWM Comparison Mode 1 Register #define PWMC_CMP1MUPD (AT91_CAST(AT91_REG *) 0x0000014C) // (PWMC_CMP1MUPD) PWM Comparison Mode 1 Update Register #define PWMC_CMP2V (AT91_CAST(AT91_REG *) 0x00000150) // (PWMC_CMP2V) PWM Comparison Value 2 Register #define PWMC_CMP2VUPD (AT91_CAST(AT91_REG *) 0x00000154) // (PWMC_CMP2VUPD) PWM Comparison Value 2 Update Register #define PWMC_CMP2M (AT91_CAST(AT91_REG *) 0x00000158) // (PWMC_CMP2M) PWM Comparison Mode 2 Register #define PWMC_CMP2MUPD (AT91_CAST(AT91_REG *) 0x0000015C) // (PWMC_CMP2MUPD) PWM Comparison Mode 2 Update Register #define PWMC_CMP3V (AT91_CAST(AT91_REG *) 0x00000160) // (PWMC_CMP3V) PWM Comparison Value 3 Register #define PWMC_CMP3VUPD (AT91_CAST(AT91_REG *) 0x00000164) // (PWMC_CMP3VUPD) PWM Comparison Value 3 Update Register #define PWMC_CMP3M (AT91_CAST(AT91_REG *) 0x00000168) // (PWMC_CMP3M) PWM Comparison Mode 3 Register #define PWMC_CMP3MUPD (AT91_CAST(AT91_REG *) 0x0000016C) // (PWMC_CMP3MUPD) PWM Comparison Mode 3 Update Register #define PWMC_CMP4V (AT91_CAST(AT91_REG *) 0x00000170) // (PWMC_CMP4V) PWM Comparison Value 4 Register #define PWMC_CMP4VUPD (AT91_CAST(AT91_REG *) 0x00000174) // (PWMC_CMP4VUPD) PWM Comparison Value 4 Update Register #define PWMC_CMP4M (AT91_CAST(AT91_REG *) 0x00000178) // (PWMC_CMP4M) PWM Comparison Mode 4 Register #define PWMC_CMP4MUPD (AT91_CAST(AT91_REG *) 0x0000017C) // (PWMC_CMP4MUPD) PWM Comparison Mode 4 Update Register #define PWMC_CMP5V (AT91_CAST(AT91_REG *) 0x00000180) // (PWMC_CMP5V) PWM Comparison Value 5 Register #define PWMC_CMP5VUPD (AT91_CAST(AT91_REG *) 0x00000184) // (PWMC_CMP5VUPD) PWM Comparison Value 5 Update Register #define PWMC_CMP5M (AT91_CAST(AT91_REG *) 0x00000188) // (PWMC_CMP5M) PWM Comparison Mode 5 Register #define PWMC_CMP5MUPD (AT91_CAST(AT91_REG *) 0x0000018C) // (PWMC_CMP5MUPD) PWM Comparison Mode 5 Update Register #define PWMC_CMP6V (AT91_CAST(AT91_REG *) 0x00000190) // (PWMC_CMP6V) PWM Comparison Value 6 Register #define PWMC_CMP6VUPD (AT91_CAST(AT91_REG *) 0x00000194) // (PWMC_CMP6VUPD) PWM Comparison Value 6 Update Register #define PWMC_CMP6M (AT91_CAST(AT91_REG *) 0x00000198) // (PWMC_CMP6M) PWM Comparison Mode 6 Register #define PWMC_CMP6MUPD (AT91_CAST(AT91_REG *) 0x0000019C) // (PWMC_CMP6MUPD) PWM Comparison Mode 6 Update Register #define PWMC_CMP7V (AT91_CAST(AT91_REG *) 0x000001A0) // (PWMC_CMP7V) PWM Comparison Value 7 Register #define PWMC_CMP7VUPD (AT91_CAST(AT91_REG *) 0x000001A4) // (PWMC_CMP7VUPD) PWM Comparison Value 7 Update Register #define PWMC_CMP7M (AT91_CAST(AT91_REG *) 0x000001A8) // (PWMC_CMP7M) PWM Comparison Mode 7 Register #define PWMC_CMP7MUPD (AT91_CAST(AT91_REG *) 0x000001AC) // (PWMC_CMP7MUPD) PWM Comparison Mode 7 Update Register #endif // -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- #define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. #define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A #define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) #define AT91C_PWMC_PREA_MCK_DIV_2 (0x1 << 8) // (PWMC) #define AT91C_PWMC_PREA_MCK_DIV_4 (0x2 << 8) // (PWMC) #define AT91C_PWMC_PREA_MCK_DIV_8 (0x3 << 8) // (PWMC) #define AT91C_PWMC_PREA_MCK_DIV_16 (0x4 << 8) // (PWMC) #define AT91C_PWMC_PREA_MCK_DIV_32 (0x5 << 8) // (PWMC) #define AT91C_PWMC_PREA_MCK_DIV_64 (0x6 << 8) // (PWMC) #define AT91C_PWMC_PREA_MCK_DIV_128 (0x7 << 8) // (PWMC) #define AT91C_PWMC_PREA_MCK_DIV_256 (0x8 << 8) // (PWMC) #define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. #define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B #define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) #define AT91C_PWMC_PREB_MCK_DIV_2 (0x1 << 24) // (PWMC) #define AT91C_PWMC_PREB_MCK_DIV_4 (0x2 << 24) // (PWMC) #define AT91C_PWMC_PREB_MCK_DIV_8 (0x3 << 24) // (PWMC) #define AT91C_PWMC_PREB_MCK_DIV_16 (0x4 << 24) // (PWMC) #define AT91C_PWMC_PREB_MCK_DIV_32 (0x5 << 24) // (PWMC) #define AT91C_PWMC_PREB_MCK_DIV_64 (0x6 << 24) // (PWMC) #define AT91C_PWMC_PREB_MCK_DIV_128 (0x7 << 24) // (PWMC) #define AT91C_PWMC_PREB_MCK_DIV_256 (0x8 << 24) // (PWMC) #define AT91C_PWMC_CLKSEL (0x1 << 31) // (PWMC) CCK Source Clock Selection // -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- #define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 #define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 #define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 #define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 #define AT91C_PWMC_CHID4 (0x1 << 4) // (PWMC) Channel ID 4 #define AT91C_PWMC_CHID5 (0x1 << 5) // (PWMC) Channel ID 5 #define AT91C_PWMC_CHID6 (0x1 << 6) // (PWMC) Channel ID 6 #define AT91C_PWMC_CHID7 (0x1 << 7) // (PWMC) Channel ID 7 #define AT91C_PWMC_CHID8 (0x1 << 8) // (PWMC) Channel ID 8 #define AT91C_PWMC_CHID9 (0x1 << 9) // (PWMC) Channel ID 9 #define AT91C_PWMC_CHID10 (0x1 << 10) // (PWMC) Channel ID 10 #define AT91C_PWMC_CHID11 (0x1 << 11) // (PWMC) Channel ID 11 #define AT91C_PWMC_CHID12 (0x1 << 12) // (PWMC) Channel ID 12 #define AT91C_PWMC_CHID13 (0x1 << 13) // (PWMC) Channel ID 13 #define AT91C_PWMC_CHID14 (0x1 << 14) // (PWMC) Channel ID 14 #define AT91C_PWMC_CHID15 (0x1 << 15) // (PWMC) Channel ID 15 // -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- // -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- // -------- PWMC_IER1 : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- #define AT91C_PWMC_FCHID0 (0x1 << 16) // (PWMC) Fault Event Channel ID 0 #define AT91C_PWMC_FCHID1 (0x1 << 17) // (PWMC) Fault Event Channel ID 1 #define AT91C_PWMC_FCHID2 (0x1 << 18) // (PWMC) Fault Event Channel ID 2 #define AT91C_PWMC_FCHID3 (0x1 << 19) // (PWMC) Fault Event Channel ID 3 #define AT91C_PWMC_FCHID4 (0x1 << 20) // (PWMC) Fault Event Channel ID 4 #define AT91C_PWMC_FCHID5 (0x1 << 21) // (PWMC) Fault Event Channel ID 5 #define AT91C_PWMC_FCHID6 (0x1 << 22) // (PWMC) Fault Event Channel ID 6 #define AT91C_PWMC_FCHID7 (0x1 << 23) // (PWMC) Fault Event Channel ID 7 #define AT91C_PWMC_FCHID8 (0x1 << 24) // (PWMC) Fault Event Channel ID 8 #define AT91C_PWMC_FCHID9 (0x1 << 25) // (PWMC) Fault Event Channel ID 9 #define AT91C_PWMC_FCHID10 (0x1 << 26) // (PWMC) Fault Event Channel ID 10 #define AT91C_PWMC_FCHID11 (0x1 << 27) // (PWMC) Fault Event Channel ID 11 #define AT91C_PWMC_FCHID12 (0x1 << 28) // (PWMC) Fault Event Channel ID 12 #define AT91C_PWMC_FCHID13 (0x1 << 29) // (PWMC) Fault Event Channel ID 13 #define AT91C_PWMC_FCHID14 (0x1 << 30) // (PWMC) Fault Event Channel ID 14 #define AT91C_PWMC_FCHID15 (0x1 << 31) // (PWMC) Fault Event Channel ID 15 // -------- PWMC_IDR1 : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- // -------- PWMC_IMR1 : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- // -------- PWMC_ISR1 : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- // -------- PWMC_SYNC : (PWMC Offset: 0x20) PWMC Synchronous Channels Register -------- #define AT91C_PWMC_SYNC0 (0x1 << 0) // (PWMC) Synchronous Channel ID 0 #define AT91C_PWMC_SYNC1 (0x1 << 1) // (PWMC) Synchronous Channel ID 1 #define AT91C_PWMC_SYNC2 (0x1 << 2) // (PWMC) Synchronous Channel ID 2 #define AT91C_PWMC_SYNC3 (0x1 << 3) // (PWMC) Synchronous Channel ID 3 #define AT91C_PWMC_SYNC4 (0x1 << 4) // (PWMC) Synchronous Channel ID 4 #define AT91C_PWMC_SYNC5 (0x1 << 5) // (PWMC) Synchronous Channel ID 5 #define AT91C_PWMC_SYNC6 (0x1 << 6) // (PWMC) Synchronous Channel ID 6 #define AT91C_PWMC_SYNC7 (0x1 << 7) // (PWMC) Synchronous Channel ID 7 #define AT91C_PWMC_SYNC8 (0x1 << 8) // (PWMC) Synchronous Channel ID 8 #define AT91C_PWMC_SYNC9 (0x1 << 9) // (PWMC) Synchronous Channel ID 9 #define AT91C_PWMC_SYNC10 (0x1 << 10) // (PWMC) Synchronous Channel ID 10 #define AT91C_PWMC_SYNC11 (0x1 << 11) // (PWMC) Synchronous Channel ID 11 #define AT91C_PWMC_SYNC12 (0x1 << 12) // (PWMC) Synchronous Channel ID 12 #define AT91C_PWMC_SYNC13 (0x1 << 13) // (PWMC) Synchronous Channel ID 13 #define AT91C_PWMC_SYNC14 (0x1 << 14) // (PWMC) Synchronous Channel ID 14 #define AT91C_PWMC_SYNC15 (0x1 << 15) // (PWMC) Synchronous Channel ID 15 #define AT91C_PWMC_UPDM (0x3 << 16) // (PWMC) Synchronous Channels Update mode #define AT91C_PWMC_UPDM_MODE0 (0x0 << 16) // (PWMC) Manual write of data and manual trigger of the update #define AT91C_PWMC_UPDM_MODE1 (0x1 << 16) // (PWMC) Manual write of data and automatic trigger of the update #define AT91C_PWMC_UPDM_MODE2 (0x2 << 16) // (PWMC) Automatic write of data and automatic trigger of the update // -------- PWMC_UPCR : (PWMC Offset: 0x28) PWMC Update Control Register -------- #define AT91C_PWMC_UPDULOCK (0x1 << 0) // (PWMC) Synchronized Channels Duty Cycle Update Unlock // -------- PWMC_SCUP : (PWMC Offset: 0x2c) PWM Update Period Register -------- #define AT91C_PWMC_UPR (0xF << 0) // (PWMC) PWM Update Period. #define AT91C_PWMC_UPRCNT (0xF << 4) // (PWMC) PWM Update Period Counter. // -------- PWMC_SCUPUPD : (PWMC Offset: 0x30) PWM Update Period Update Register -------- #define AT91C_PWMC_UPVUPDAL (0xF << 0) // (PWMC) PWM Update Period Update. // -------- PWMC_IER2 : (PWMC Offset: 0x34) PWMC Interrupt Enable Register -------- #define AT91C_PWMC_WRDY (0x1 << 0) // (PWMC) PDC Write Ready #define AT91C_PWMC_ENDTX (0x1 << 1) // (PWMC) PDC End of TX Buffer #define AT91C_PWMC_TXBUFE (0x1 << 2) // (PWMC) PDC End of TX Buffer #define AT91C_PWMC_UNRE (0x1 << 3) // (PWMC) PDC End of TX Buffer // -------- PWMC_IDR2 : (PWMC Offset: 0x38) PWMC Interrupt Disable Register -------- // -------- PWMC_IMR2 : (PWMC Offset: 0x3c) PWMC Interrupt Mask Register -------- // -------- PWMC_ISR2 : (PWMC Offset: 0x40) PWMC Interrupt Status Register -------- #define AT91C_PWMC_CMPM0 (0x1 << 8) // (PWMC) Comparison x Match #define AT91C_PWMC_CMPM1 (0x1 << 9) // (PWMC) Comparison x Match #define AT91C_PWMC_CMPM2 (0x1 << 10) // (PWMC) Comparison x Match #define AT91C_PWMC_CMPM3 (0x1 << 11) // (PWMC) Comparison x Match #define AT91C_PWMC_CMPM4 (0x1 << 12) // (PWMC) Comparison x Match #define AT91C_PWMC_CMPM5 (0x1 << 13) // (PWMC) Comparison x Match #define AT91C_PWMC_CMPM6 (0x1 << 14) // (PWMC) Comparison x Match #define AT91C_PWMC_CMPM7 (0x1 << 15) // (PWMC) Comparison x Match #define AT91C_PWMC_CMPU0 (0x1 << 16) // (PWMC) Comparison x Update #define AT91C_PWMC_CMPU1 (0x1 << 17) // (PWMC) Comparison x Update #define AT91C_PWMC_CMPU2 (0x1 << 18) // (PWMC) Comparison x Update #define AT91C_PWMC_CMPU3 (0x1 << 19) // (PWMC) Comparison x Update #define AT91C_PWMC_CMPU4 (0x1 << 20) // (PWMC) Comparison x Update #define AT91C_PWMC_CMPU5 (0x1 << 21) // (PWMC) Comparison x Update #define AT91C_PWMC_CMPU6 (0x1 << 22) // (PWMC) Comparison x Update #define AT91C_PWMC_CMPU7 (0x1 << 23) // (PWMC) Comparison x Update // -------- PWMC_OOV : (PWMC Offset: 0x44) PWM Output Override Value Register -------- #define AT91C_PWMC_OOVH0 (0x1 << 0) // (PWMC) Output Override Value for PWMH output of the channel 0 #define AT91C_PWMC_OOVH1 (0x1 << 1) // (PWMC) Output Override Value for PWMH output of the channel 1 #define AT91C_PWMC_OOVH2 (0x1 << 2) // (PWMC) Output Override Value for PWMH output of the channel 2 #define AT91C_PWMC_OOVH3 (0x1 << 3) // (PWMC) Output Override Value for PWMH output of the channel 3 #define AT91C_PWMC_OOVH4 (0x1 << 4) // (PWMC) Output Override Value for PWMH output of the channel 4 #define AT91C_PWMC_OOVH5 (0x1 << 5) // (PWMC) Output Override Value for PWMH output of the channel 5 #define AT91C_PWMC_OOVH6 (0x1 << 6) // (PWMC) Output Override Value for PWMH output of the channel 6 #define AT91C_PWMC_OOVH7 (0x1 << 7) // (PWMC) Output Override Value for PWMH output of the channel 7 #define AT91C_PWMC_OOVH8 (0x1 << 8) // (PWMC) Output Override Value for PWMH output of the channel 8 #define AT91C_PWMC_OOVH9 (0x1 << 9) // (PWMC) Output Override Value for PWMH output of the channel 9 #define AT91C_PWMC_OOVH10 (0x1 << 10) // (PWMC) Output Override Value for PWMH output of the channel 10 #define AT91C_PWMC_OOVH11 (0x1 << 11) // (PWMC) Output Override Value for PWMH output of the channel 11 #define AT91C_PWMC_OOVH12 (0x1 << 12) // (PWMC) Output Override Value for PWMH output of the channel 12 #define AT91C_PWMC_OOVH13 (0x1 << 13) // (PWMC) Output Override Value for PWMH output of the channel 13 #define AT91C_PWMC_OOVH14 (0x1 << 14) // (PWMC) Output Override Value for PWMH output of the channel 14 #define AT91C_PWMC_OOVH15 (0x1 << 15) // (PWMC) Output Override Value for PWMH output of the channel 15 #define AT91C_PWMC_OOVL0 (0x1 << 16) // (PWMC) Output Override Value for PWML output of the channel 0 #define AT91C_PWMC_OOVL1 (0x1 << 17) // (PWMC) Output Override Value for PWML output of the channel 1 #define AT91C_PWMC_OOVL2 (0x1 << 18) // (PWMC) Output Override Value for PWML output of the channel 2 #define AT91C_PWMC_OOVL3 (0x1 << 19) // (PWMC) Output Override Value for PWML output of the channel 3 #define AT91C_PWMC_OOVL4 (0x1 << 20) // (PWMC) Output Override Value for PWML output of the channel 4 #define AT91C_PWMC_OOVL5 (0x1 << 21) // (PWMC) Output Override Value for PWML output of the channel 5 #define AT91C_PWMC_OOVL6 (0x1 << 22) // (PWMC) Output Override Value for PWML output of the channel 6 #define AT91C_PWMC_OOVL7 (0x1 << 23) // (PWMC) Output Override Value for PWML output of the channel 7 #define AT91C_PWMC_OOVL8 (0x1 << 24) // (PWMC) Output Override Value for PWML output of the channel 8 #define AT91C_PWMC_OOVL9 (0x1 << 25) // (PWMC) Output Override Value for PWML output of the channel 9 #define AT91C_PWMC_OOVL10 (0x1 << 26) // (PWMC) Output Override Value for PWML output of the channel 10 #define AT91C_PWMC_OOVL11 (0x1 << 27) // (PWMC) Output Override Value for PWML output of the channel 11 #define AT91C_PWMC_OOVL12 (0x1 << 28) // (PWMC) Output Override Value for PWML output of the channel 12 #define AT91C_PWMC_OOVL13 (0x1 << 29) // (PWMC) Output Override Value for PWML output of the channel 13 #define AT91C_PWMC_OOVL14 (0x1 << 30) // (PWMC) Output Override Value for PWML output of the channel 14 #define AT91C_PWMC_OOVL15 (0x1 << 31) // (PWMC) Output Override Value for PWML output of the channel 15 // -------- PWMC_OS : (PWMC Offset: 0x48) PWM Output Selection Register -------- #define AT91C_PWMC_OSH0 (0x1 << 0) // (PWMC) Output Selection for PWMH output of the channel 0 #define AT91C_PWMC_OSH1 (0x1 << 1) // (PWMC) Output Selection for PWMH output of the channel 1 #define AT91C_PWMC_OSH2 (0x1 << 2) // (PWMC) Output Selection for PWMH output of the channel 2 #define AT91C_PWMC_OSH3 (0x1 << 3) // (PWMC) Output Selection for PWMH output of the channel 3 #define AT91C_PWMC_OSH4 (0x1 << 4) // (PWMC) Output Selection for PWMH output of the channel 4 #define AT91C_PWMC_OSH5 (0x1 << 5) // (PWMC) Output Selection for PWMH output of the channel 5 #define AT91C_PWMC_OSH6 (0x1 << 6) // (PWMC) Output Selection for PWMH output of the channel 6 #define AT91C_PWMC_OSH7 (0x1 << 7) // (PWMC) Output Selection for PWMH output of the channel 7 #define AT91C_PWMC_OSH8 (0x1 << 8) // (PWMC) Output Selection for PWMH output of the channel 8 #define AT91C_PWMC_OSH9 (0x1 << 9) // (PWMC) Output Selection for PWMH output of the channel 9 #define AT91C_PWMC_OSH10 (0x1 << 10) // (PWMC) Output Selection for PWMH output of the channel 10 #define AT91C_PWMC_OSH11 (0x1 << 11) // (PWMC) Output Selection for PWMH output of the channel 11 #define AT91C_PWMC_OSH12 (0x1 << 12) // (PWMC) Output Selection for PWMH output of the channel 12 #define AT91C_PWMC_OSH13 (0x1 << 13) // (PWMC) Output Selection for PWMH output of the channel 13 #define AT91C_PWMC_OSH14 (0x1 << 14) // (PWMC) Output Selection for PWMH output of the channel 14 #define AT91C_PWMC_OSH15 (0x1 << 15) // (PWMC) Output Selection for PWMH output of the channel 15 #define AT91C_PWMC_OSL0 (0x1 << 16) // (PWMC) Output Selection for PWML output of the channel 0 #define AT91C_PWMC_OSL1 (0x1 << 17) // (PWMC) Output Selection for PWML output of the channel 1 #define AT91C_PWMC_OSL2 (0x1 << 18) // (PWMC) Output Selection for PWML output of the channel 2 #define AT91C_PWMC_OSL3 (0x1 << 19) // (PWMC) Output Selection for PWML output of the channel 3 #define AT91C_PWMC_OSL4 (0x1 << 20) // (PWMC) Output Selection for PWML output of the channel 4 #define AT91C_PWMC_OSL5 (0x1 << 21) // (PWMC) Output Selection for PWML output of the channel 5 #define AT91C_PWMC_OSL6 (0x1 << 22) // (PWMC) Output Selection for PWML output of the channel 6 #define AT91C_PWMC_OSL7 (0x1 << 23) // (PWMC) Output Selection for PWML output of the channel 7 #define AT91C_PWMC_OSL8 (0x1 << 24) // (PWMC) Output Selection for PWML output of the channel 8 #define AT91C_PWMC_OSL9 (0x1 << 25) // (PWMC) Output Selection for PWML output of the channel 9 #define AT91C_PWMC_OSL10 (0x1 << 26) // (PWMC) Output Selection for PWML output of the channel 10 #define AT91C_PWMC_OSL11 (0x1 << 27) // (PWMC) Output Selection for PWML output of the channel 11 #define AT91C_PWMC_OSL12 (0x1 << 28) // (PWMC) Output Selection for PWML output of the channel 12 #define AT91C_PWMC_OSL13 (0x1 << 29) // (PWMC) Output Selection for PWML output of the channel 13 #define AT91C_PWMC_OSL14 (0x1 << 30) // (PWMC) Output Selection for PWML output of the channel 14 #define AT91C_PWMC_OSL15 (0x1 << 31) // (PWMC) Output Selection for PWML output of the channel 15 // -------- PWMC_OSS : (PWMC Offset: 0x4c) PWM Output Selection Set Register -------- #define AT91C_PWMC_OSSH0 (0x1 << 0) // (PWMC) Output Selection Set for PWMH output of the channel 0 #define AT91C_PWMC_OSSH1 (0x1 << 1) // (PWMC) Output Selection Set for PWMH output of the channel 1 #define AT91C_PWMC_OSSH2 (0x1 << 2) // (PWMC) Output Selection Set for PWMH output of the channel 2 #define AT91C_PWMC_OSSH3 (0x1 << 3) // (PWMC) Output Selection Set for PWMH output of the channel 3 #define AT91C_PWMC_OSSH4 (0x1 << 4) // (PWMC) Output Selection Set for PWMH output of the channel 4 #define AT91C_PWMC_OSSH5 (0x1 << 5) // (PWMC) Output Selection Set for PWMH output of the channel 5 #define AT91C_PWMC_OSSH6 (0x1 << 6) // (PWMC) Output Selection Set for PWMH output of the channel 6 #define AT91C_PWMC_OSSH7 (0x1 << 7) // (PWMC) Output Selection Set for PWMH output of the channel 7 #define AT91C_PWMC_OSSH8 (0x1 << 8) // (PWMC) Output Selection Set for PWMH output of the channel 8 #define AT91C_PWMC_OSSH9 (0x1 << 9) // (PWMC) Output Selection Set for PWMH output of the channel 9 #define AT91C_PWMC_OSSH10 (0x1 << 10) // (PWMC) Output Selection Set for PWMH output of the channel 10 #define AT91C_PWMC_OSSH11 (0x1 << 11) // (PWMC) Output Selection Set for PWMH output of the channel 11 #define AT91C_PWMC_OSSH12 (0x1 << 12) // (PWMC) Output Selection Set for PWMH output of the channel 12 #define AT91C_PWMC_OSSH13 (0x1 << 13) // (PWMC) Output Selection Set for PWMH output of the channel 13 #define AT91C_PWMC_OSSH14 (0x1 << 14) // (PWMC) Output Selection Set for PWMH output of the channel 14 #define AT91C_PWMC_OSSH15 (0x1 << 15) // (PWMC) Output Selection Set for PWMH output of the channel 15 #define AT91C_PWMC_OSSL0 (0x1 << 16) // (PWMC) Output Selection Set for PWML output of the channel 0 #define AT91C_PWMC_OSSL1 (0x1 << 17) // (PWMC) Output Selection Set for PWML output of the channel 1 #define AT91C_PWMC_OSSL2 (0x1 << 18) // (PWMC) Output Selection Set for PWML output of the channel 2 #define AT91C_PWMC_OSSL3 (0x1 << 19) // (PWMC) Output Selection Set for PWML output of the channel 3 #define AT91C_PWMC_OSSL4 (0x1 << 20) // (PWMC) Output Selection Set for PWML output of the channel 4 #define AT91C_PWMC_OSSL5 (0x1 << 21) // (PWMC) Output Selection Set for PWML output of the channel 5 #define AT91C_PWMC_OSSL6 (0x1 << 22) // (PWMC) Output Selection Set for PWML output of the channel 6 #define AT91C_PWMC_OSSL7 (0x1 << 23) // (PWMC) Output Selection Set for PWML output of the channel 7 #define AT91C_PWMC_OSSL8 (0x1 << 24) // (PWMC) Output Selection Set for PWML output of the channel 8 #define AT91C_PWMC_OSSL9 (0x1 << 25) // (PWMC) Output Selection Set for PWML output of the channel 9 #define AT91C_PWMC_OSSL10 (0x1 << 26) // (PWMC) Output Selection Set for PWML output of the channel 10 #define AT91C_PWMC_OSSL11 (0x1 << 27) // (PWMC) Output Selection Set for PWML output of the channel 11 #define AT91C_PWMC_OSSL12 (0x1 << 28) // (PWMC) Output Selection Set for PWML output of the channel 12 #define AT91C_PWMC_OSSL13 (0x1 << 29) // (PWMC) Output Selection Set for PWML output of the channel 13 #define AT91C_PWMC_OSSL14 (0x1 << 30) // (PWMC) Output Selection Set for PWML output of the channel 14 #define AT91C_PWMC_OSSL15 (0x1 << 31) // (PWMC) Output Selection Set for PWML output of the channel 15 // -------- PWMC_OSC : (PWMC Offset: 0x50) PWM Output Selection Clear Register -------- #define AT91C_PWMC_OSCH0 (0x1 << 0) // (PWMC) Output Selection Clear for PWMH output of the channel 0 #define AT91C_PWMC_OSCH1 (0x1 << 1) // (PWMC) Output Selection Clear for PWMH output of the channel 1 #define AT91C_PWMC_OSCH2 (0x1 << 2) // (PWMC) Output Selection Clear for PWMH output of the channel 2 #define AT91C_PWMC_OSCH3 (0x1 << 3) // (PWMC) Output Selection Clear for PWMH output of the channel 3 #define AT91C_PWMC_OSCH4 (0x1 << 4) // (PWMC) Output Selection Clear for PWMH output of the channel 4 #define AT91C_PWMC_OSCH5 (0x1 << 5) // (PWMC) Output Selection Clear for PWMH output of the channel 5 #define AT91C_PWMC_OSCH6 (0x1 << 6) // (PWMC) Output Selection Clear for PWMH output of the channel 6 #define AT91C_PWMC_OSCH7 (0x1 << 7) // (PWMC) Output Selection Clear for PWMH output of the channel 7 #define AT91C_PWMC_OSCH8 (0x1 << 8) // (PWMC) Output Selection Clear for PWMH output of the channel 8 #define AT91C_PWMC_OSCH9 (0x1 << 9) // (PWMC) Output Selection Clear for PWMH output of the channel 9 #define AT91C_PWMC_OSCH10 (0x1 << 10) // (PWMC) Output Selection Clear for PWMH output of the channel 10 #define AT91C_PWMC_OSCH11 (0x1 << 11) // (PWMC) Output Selection Clear for PWMH output of the channel 11 #define AT91C_PWMC_OSCH12 (0x1 << 12) // (PWMC) Output Selection Clear for PWMH output of the channel 12 #define AT91C_PWMC_OSCH13 (0x1 << 13) // (PWMC) Output Selection Clear for PWMH output of the channel 13 #define AT91C_PWMC_OSCH14 (0x1 << 14) // (PWMC) Output Selection Clear for PWMH output of the channel 14 #define AT91C_PWMC_OSCH15 (0x1 << 15) // (PWMC) Output Selection Clear for PWMH output of the channel 15 #define AT91C_PWMC_OSCL0 (0x1 << 16) // (PWMC) Output Selection Clear for PWML output of the channel 0 #define AT91C_PWMC_OSCL1 (0x1 << 17) // (PWMC) Output Selection Clear for PWML output of the channel 1 #define AT91C_PWMC_OSCL2 (0x1 << 18) // (PWMC) Output Selection Clear for PWML output of the channel 2 #define AT91C_PWMC_OSCL3 (0x1 << 19) // (PWMC) Output Selection Clear for PWML output of the channel 3 #define AT91C_PWMC_OSCL4 (0x1 << 20) // (PWMC) Output Selection Clear for PWML output of the channel 4 #define AT91C_PWMC_OSCL5 (0x1 << 21) // (PWMC) Output Selection Clear for PWML output of the channel 5 #define AT91C_PWMC_OSCL6 (0x1 << 22) // (PWMC) Output Selection Clear for PWML output of the channel 6 #define AT91C_PWMC_OSCL7 (0x1 << 23) // (PWMC) Output Selection Clear for PWML output of the channel 7 #define AT91C_PWMC_OSCL8 (0x1 << 24) // (PWMC) Output Selection Clear for PWML output of the channel 8 #define AT91C_PWMC_OSCL9 (0x1 << 25) // (PWMC) Output Selection Clear for PWML output of the channel 9 #define AT91C_PWMC_OSCL10 (0x1 << 26) // (PWMC) Output Selection Clear for PWML output of the channel 10 #define AT91C_PWMC_OSCL11 (0x1 << 27) // (PWMC) Output Selection Clear for PWML output of the channel 11 #define AT91C_PWMC_OSCL12 (0x1 << 28) // (PWMC) Output Selection Clear for PWML output of the channel 12 #define AT91C_PWMC_OSCL13 (0x1 << 29) // (PWMC) Output Selection Clear for PWML output of the channel 13 #define AT91C_PWMC_OSCL14 (0x1 << 30) // (PWMC) Output Selection Clear for PWML output of the channel 14 #define AT91C_PWMC_OSCL15 (0x1 << 31) // (PWMC) Output Selection Clear for PWML output of the channel 15 // -------- PWMC_OSSUPD : (PWMC Offset: 0x54) Output Selection Set for PWMH / PWML output of the channel x -------- #define AT91C_PWMC_OSSUPDH0 (0x1 << 0) // (PWMC) Output Selection Set for PWMH output of the channel 0 #define AT91C_PWMC_OSSUPDH1 (0x1 << 1) // (PWMC) Output Selection Set for PWMH output of the channel 1 #define AT91C_PWMC_OSSUPDH2 (0x1 << 2) // (PWMC) Output Selection Set for PWMH output of the channel 2 #define AT91C_PWMC_OSSUPDH3 (0x1 << 3) // (PWMC) Output Selection Set for PWMH output of the channel 3 #define AT91C_PWMC_OSSUPDH4 (0x1 << 4) // (PWMC) Output Selection Set for PWMH output of the channel 4 #define AT91C_PWMC_OSSUPDH5 (0x1 << 5) // (PWMC) Output Selection Set for PWMH output of the channel 5 #define AT91C_PWMC_OSSUPDH6 (0x1 << 6) // (PWMC) Output Selection Set for PWMH output of the channel 6 #define AT91C_PWMC_OSSUPDH7 (0x1 << 7) // (PWMC) Output Selection Set for PWMH output of the channel 7 #define AT91C_PWMC_OSSUPDH8 (0x1 << 8) // (PWMC) Output Selection Set for PWMH output of the channel 8 #define AT91C_PWMC_OSSUPDH9 (0x1 << 9) // (PWMC) Output Selection Set for PWMH output of the channel 9 #define AT91C_PWMC_OSSUPDH10 (0x1 << 10) // (PWMC) Output Selection Set for PWMH output of the channel 10 #define AT91C_PWMC_OSSUPDH11 (0x1 << 11) // (PWMC) Output Selection Set for PWMH output of the channel 11 #define AT91C_PWMC_OSSUPDH12 (0x1 << 12) // (PWMC) Output Selection Set for PWMH output of the channel 12 #define AT91C_PWMC_OSSUPDH13 (0x1 << 13) // (PWMC) Output Selection Set for PWMH output of the channel 13 #define AT91C_PWMC_OSSUPDH14 (0x1 << 14) // (PWMC) Output Selection Set for PWMH output of the channel 14 #define AT91C_PWMC_OSSUPDH15 (0x1 << 15) // (PWMC) Output Selection Set for PWMH output of the channel 15 #define AT91C_PWMC_OSSUPDL0 (0x1 << 16) // (PWMC) Output Selection Set for PWML output of the channel 0 #define AT91C_PWMC_OSSUPDL1 (0x1 << 17) // (PWMC) Output Selection Set for PWML output of the channel 1 #define AT91C_PWMC_OSSUPDL2 (0x1 << 18) // (PWMC) Output Selection Set for PWML output of the channel 2 #define AT91C_PWMC_OSSUPDL3 (0x1 << 19) // (PWMC) Output Selection Set for PWML output of the channel 3 #define AT91C_PWMC_OSSUPDL4 (0x1 << 20) // (PWMC) Output Selection Set for PWML output of the channel 4 #define AT91C_PWMC_OSSUPDL5 (0x1 << 21) // (PWMC) Output Selection Set for PWML output of the channel 5 #define AT91C_PWMC_OSSUPDL6 (0x1 << 22) // (PWMC) Output Selection Set for PWML output of the channel 6 #define AT91C_PWMC_OSSUPDL7 (0x1 << 23) // (PWMC) Output Selection Set for PWML output of the channel 7 #define AT91C_PWMC_OSSUPDL8 (0x1 << 24) // (PWMC) Output Selection Set for PWML output of the channel 8 #define AT91C_PWMC_OSSUPDL9 (0x1 << 25) // (PWMC) Output Selection Set for PWML output of the channel 9 #define AT91C_PWMC_OSSUPDL10 (0x1 << 26) // (PWMC) Output Selection Set for PWML output of the channel 10 #define AT91C_PWMC_OSSUPDL11 (0x1 << 27) // (PWMC) Output Selection Set for PWML output of the channel 11 #define AT91C_PWMC_OSSUPDL12 (0x1 << 28) // (PWMC) Output Selection Set for PWML output of the channel 12 #define AT91C_PWMC_OSSUPDL13 (0x1 << 29) // (PWMC) Output Selection Set for PWML output of the channel 13 #define AT91C_PWMC_OSSUPDL14 (0x1 << 30) // (PWMC) Output Selection Set for PWML output of the channel 14 #define AT91C_PWMC_OSSUPDL15 (0x1 << 31) // (PWMC) Output Selection Set for PWML output of the channel 15 // -------- PWMC_OSCUPD : (PWMC Offset: 0x58) Output Selection Clear for PWMH / PWML output of the channel x -------- #define AT91C_PWMC_OSCUPDH0 (0x1 << 0) // (PWMC) Output Selection Clear for PWMH output of the channel 0 #define AT91C_PWMC_OSCUPDH1 (0x1 << 1) // (PWMC) Output Selection Clear for PWMH output of the channel 1 #define AT91C_PWMC_OSCUPDH2 (0x1 << 2) // (PWMC) Output Selection Clear for PWMH output of the channel 2 #define AT91C_PWMC_OSCUPDH3 (0x1 << 3) // (PWMC) Output Selection Clear for PWMH output of the channel 3 #define AT91C_PWMC_OSCUPDH4 (0x1 << 4) // (PWMC) Output Selection Clear for PWMH output of the channel 4 #define AT91C_PWMC_OSCUPDH5 (0x1 << 5) // (PWMC) Output Selection Clear for PWMH output of the channel 5 #define AT91C_PWMC_OSCUPDH6 (0x1 << 6) // (PWMC) Output Selection Clear for PWMH output of the channel 6 #define AT91C_PWMC_OSCUPDH7 (0x1 << 7) // (PWMC) Output Selection Clear for PWMH output of the channel 7 #define AT91C_PWMC_OSCUPDH8 (0x1 << 8) // (PWMC) Output Selection Clear for PWMH output of the channel 8 #define AT91C_PWMC_OSCUPDH9 (0x1 << 9) // (PWMC) Output Selection Clear for PWMH output of the channel 9 #define AT91C_PWMC_OSCUPDH10 (0x1 << 10) // (PWMC) Output Selection Clear for PWMH output of the channel 10 #define AT91C_PWMC_OSCUPDH11 (0x1 << 11) // (PWMC) Output Selection Clear for PWMH output of the channel 11 #define AT91C_PWMC_OSCUPDH12 (0x1 << 12) // (PWMC) Output Selection Clear for PWMH output of the channel 12 #define AT91C_PWMC_OSCUPDH13 (0x1 << 13) // (PWMC) Output Selection Clear for PWMH output of the channel 13 #define AT91C_PWMC_OSCUPDH14 (0x1 << 14) // (PWMC) Output Selection Clear for PWMH output of the channel 14 #define AT91C_PWMC_OSCUPDH15 (0x1 << 15) // (PWMC) Output Selection Clear for PWMH output of the channel 15 #define AT91C_PWMC_OSCUPDL0 (0x1 << 16) // (PWMC) Output Selection Clear for PWML output of the channel 0 #define AT91C_PWMC_OSCUPDL1 (0x1 << 17) // (PWMC) Output Selection Clear for PWML output of the channel 1 #define AT91C_PWMC_OSCUPDL2 (0x1 << 18) // (PWMC) Output Selection Clear for PWML output of the channel 2 #define AT91C_PWMC_OSCUPDL3 (0x1 << 19) // (PWMC) Output Selection Clear for PWML output of the channel 3 #define AT91C_PWMC_OSCUPDL4 (0x1 << 20) // (PWMC) Output Selection Clear for PWML output of the channel 4 #define AT91C_PWMC_OSCUPDL5 (0x1 << 21) // (PWMC) Output Selection Clear for PWML output of the channel 5 #define AT91C_PWMC_OSCUPDL6 (0x1 << 22) // (PWMC) Output Selection Clear for PWML output of the channel 6 #define AT91C_PWMC_OSCUPDL7 (0x1 << 23) // (PWMC) Output Selection Clear for PWML output of the channel 7 #define AT91C_PWMC_OSCUPDL8 (0x1 << 24) // (PWMC) Output Selection Clear for PWML output of the channel 8 #define AT91C_PWMC_OSCUPDL9 (0x1 << 25) // (PWMC) Output Selection Clear for PWML output of the channel 9 #define AT91C_PWMC_OSCUPDL10 (0x1 << 26) // (PWMC) Output Selection Clear for PWML output of the channel 10 #define AT91C_PWMC_OSCUPDL11 (0x1 << 27) // (PWMC) Output Selection Clear for PWML output of the channel 11 #define AT91C_PWMC_OSCUPDL12 (0x1 << 28) // (PWMC) Output Selection Clear for PWML output of the channel 12 #define AT91C_PWMC_OSCUPDL13 (0x1 << 29) // (PWMC) Output Selection Clear for PWML output of the channel 13 #define AT91C_PWMC_OSCUPDL14 (0x1 << 30) // (PWMC) Output Selection Clear for PWML output of the channel 14 #define AT91C_PWMC_OSCUPDL15 (0x1 << 31) // (PWMC) Output Selection Clear for PWML output of the channel 15 // -------- PWMC_FMR : (PWMC Offset: 0x5c) PWM Fault Mode Register -------- #define AT91C_PWMC_FPOL0 (0x1 << 0) // (PWMC) Fault Polarity on fault input 0 #define AT91C_PWMC_FPOL1 (0x1 << 1) // (PWMC) Fault Polarity on fault input 1 #define AT91C_PWMC_FPOL2 (0x1 << 2) // (PWMC) Fault Polarity on fault input 2 #define AT91C_PWMC_FPOL3 (0x1 << 3) // (PWMC) Fault Polarity on fault input 3 #define AT91C_PWMC_FPOL4 (0x1 << 4) // (PWMC) Fault Polarity on fault input 4 #define AT91C_PWMC_FPOL5 (0x1 << 5) // (PWMC) Fault Polarity on fault input 5 #define AT91C_PWMC_FPOL6 (0x1 << 6) // (PWMC) Fault Polarity on fault input 6 #define AT91C_PWMC_FPOL7 (0x1 << 7) // (PWMC) Fault Polarity on fault input 7 #define AT91C_PWMC_FMOD0 (0x1 << 8) // (PWMC) Fault Activation Mode on fault input 0 #define AT91C_PWMC_FMOD1 (0x1 << 9) // (PWMC) Fault Activation Mode on fault input 1 #define AT91C_PWMC_FMOD2 (0x1 << 10) // (PWMC) Fault Activation Mode on fault input 2 #define AT91C_PWMC_FMOD3 (0x1 << 11) // (PWMC) Fault Activation Mode on fault input 3 #define AT91C_PWMC_FMOD4 (0x1 << 12) // (PWMC) Fault Activation Mode on fault input 4 #define AT91C_PWMC_FMOD5 (0x1 << 13) // (PWMC) Fault Activation Mode on fault input 5 #define AT91C_PWMC_FMOD6 (0x1 << 14) // (PWMC) Fault Activation Mode on fault input 6 #define AT91C_PWMC_FMOD7 (0x1 << 15) // (PWMC) Fault Activation Mode on fault input 7 #define AT91C_PWMC_FFIL00 (0x1 << 16) // (PWMC) Fault Filtering on fault input 0 #define AT91C_PWMC_FFIL01 (0x1 << 17) // (PWMC) Fault Filtering on fault input 1 #define AT91C_PWMC_FFIL02 (0x1 << 18) // (PWMC) Fault Filtering on fault input 2 #define AT91C_PWMC_FFIL03 (0x1 << 19) // (PWMC) Fault Filtering on fault input 3 #define AT91C_PWMC_FFIL04 (0x1 << 20) // (PWMC) Fault Filtering on fault input 4 #define AT91C_PWMC_FFIL05 (0x1 << 21) // (PWMC) Fault Filtering on fault input 5 #define AT91C_PWMC_FFIL06 (0x1 << 22) // (PWMC) Fault Filtering on fault input 6 #define AT91C_PWMC_FFIL07 (0x1 << 23) // (PWMC) Fault Filtering on fault input 7 // -------- PWMC_FSR : (PWMC Offset: 0x60) Fault Input x Value -------- #define AT91C_PWMC_FIV0 (0x1 << 0) // (PWMC) Fault Input 0 Value #define AT91C_PWMC_FIV1 (0x1 << 1) // (PWMC) Fault Input 1 Value #define AT91C_PWMC_FIV2 (0x1 << 2) // (PWMC) Fault Input 2 Value #define AT91C_PWMC_FIV3 (0x1 << 3) // (PWMC) Fault Input 3 Value #define AT91C_PWMC_FIV4 (0x1 << 4) // (PWMC) Fault Input 4 Value #define AT91C_PWMC_FIV5 (0x1 << 5) // (PWMC) Fault Input 5 Value #define AT91C_PWMC_FIV6 (0x1 << 6) // (PWMC) Fault Input 6 Value #define AT91C_PWMC_FIV7 (0x1 << 7) // (PWMC) Fault Input 7 Value #define AT91C_PWMC_FS0 (0x1 << 8) // (PWMC) Fault 0 Status #define AT91C_PWMC_FS1 (0x1 << 9) // (PWMC) Fault 1 Status #define AT91C_PWMC_FS2 (0x1 << 10) // (PWMC) Fault 2 Status #define AT91C_PWMC_FS3 (0x1 << 11) // (PWMC) Fault 3 Status #define AT91C_PWMC_FS4 (0x1 << 12) // (PWMC) Fault 4 Status #define AT91C_PWMC_FS5 (0x1 << 13) // (PWMC) Fault 5 Status #define AT91C_PWMC_FS6 (0x1 << 14) // (PWMC) Fault 6 Status #define AT91C_PWMC_FS7 (0x1 << 15) // (PWMC) Fault 7 Status // -------- PWMC_FCR : (PWMC Offset: 0x64) Fault y Clear -------- #define AT91C_PWMC_FCLR0 (0x1 << 0) // (PWMC) Fault 0 Clear #define AT91C_PWMC_FCLR1 (0x1 << 1) // (PWMC) Fault 1 Clear #define AT91C_PWMC_FCLR2 (0x1 << 2) // (PWMC) Fault 2 Clear #define AT91C_PWMC_FCLR3 (0x1 << 3) // (PWMC) Fault 3 Clear #define AT91C_PWMC_FCLR4 (0x1 << 4) // (PWMC) Fault 4 Clear #define AT91C_PWMC_FCLR5 (0x1 << 5) // (PWMC) Fault 5 Clear #define AT91C_PWMC_FCLR6 (0x1 << 6) // (PWMC) Fault 6 Clear #define AT91C_PWMC_FCLR7 (0x1 << 7) // (PWMC) Fault 7 Clear // -------- PWMC_FPV : (PWMC Offset: 0x68) PWM Fault Protection Value -------- #define AT91C_PWMC_FPVH0 (0x1 << 0) // (PWMC) Fault Protection Value for PWMH output on channel 0 #define AT91C_PWMC_FPVH1 (0x1 << 1) // (PWMC) Fault Protection Value for PWMH output on channel 1 #define AT91C_PWMC_FPVH2 (0x1 << 2) // (PWMC) Fault Protection Value for PWMH output on channel 2 #define AT91C_PWMC_FPVH3 (0x1 << 3) // (PWMC) Fault Protection Value for PWMH output on channel 3 #define AT91C_PWMC_FPVH4 (0x1 << 4) // (PWMC) Fault Protection Value for PWMH output on channel 4 #define AT91C_PWMC_FPVH5 (0x1 << 5) // (PWMC) Fault Protection Value for PWMH output on channel 5 #define AT91C_PWMC_FPVH6 (0x1 << 6) // (PWMC) Fault Protection Value for PWMH output on channel 6 #define AT91C_PWMC_FPVH7 (0x1 << 7) // (PWMC) Fault Protection Value for PWMH output on channel 7 #define AT91C_PWMC_FPVL0 (0x1 << 16) // (PWMC) Fault Protection Value for PWML output on channel 0 #define AT91C_PWMC_FPVL1 (0x1 << 17) // (PWMC) Fault Protection Value for PWML output on channel 1 #define AT91C_PWMC_FPVL2 (0x1 << 18) // (PWMC) Fault Protection Value for PWML output on channel 2 #define AT91C_PWMC_FPVL3 (0x1 << 19) // (PWMC) Fault Protection Value for PWML output on channel 3 #define AT91C_PWMC_FPVL4 (0x1 << 20) // (PWMC) Fault Protection Value for PWML output on channel 4 #define AT91C_PWMC_FPVL5 (0x1 << 21) // (PWMC) Fault Protection Value for PWML output on channel 5 #define AT91C_PWMC_FPVL6 (0x1 << 22) // (PWMC) Fault Protection Value for PWML output on channel 6 #define AT91C_PWMC_FPVL7 (0x1 << 23) // (PWMC) Fault Protection Value for PWML output on channel 7 // -------- PWMC_FPER1 : (PWMC Offset: 0x6c) PWM Fault Protection Enable Register 1 -------- #define AT91C_PWMC_FPE0 (0xFF << 0) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 0 #define AT91C_PWMC_FPE1 (0xFF << 8) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 1 #define AT91C_PWMC_FPE2 (0xFF << 16) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 2 #define AT91C_PWMC_FPE3 (0xFF << 24) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 3 // -------- PWMC_FPER2 : (PWMC Offset: 0x70) PWM Fault Protection Enable Register 2 -------- #define AT91C_PWMC_FPE4 (0xFF << 0) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 4 #define AT91C_PWMC_FPE5 (0xFF << 8) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 5 #define AT91C_PWMC_FPE6 (0xFF << 16) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 6 #define AT91C_PWMC_FPE7 (0xFF << 24) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 7 // -------- PWMC_FPER3 : (PWMC Offset: 0x74) PWM Fault Protection Enable Register 3 -------- #define AT91C_PWMC_FPE8 (0xFF << 0) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 8 #define AT91C_PWMC_FPE9 (0xFF << 8) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 9 #define AT91C_PWMC_FPE10 (0xFF << 16) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 10 #define AT91C_PWMC_FPE11 (0xFF << 24) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 11 // -------- PWMC_FPER4 : (PWMC Offset: 0x78) PWM Fault Protection Enable Register 4 -------- #define AT91C_PWMC_FPE12 (0xFF << 0) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 12 #define AT91C_PWMC_FPE13 (0xFF << 8) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 13 #define AT91C_PWMC_FPE14 (0xFF << 16) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 14 #define AT91C_PWMC_FPE15 (0xFF << 24) // (PWMC) Fault Protection Enable with Fault Input y for PWM channel 15 // -------- PWMC_EL0MR : (PWMC Offset: 0x7c) PWM Event Line 0 Mode Register -------- #define AT91C_PWMC_L0CSEL0 (0x1 << 0) // (PWMC) Comparison 0 Selection #define AT91C_PWMC_L0CSEL1 (0x1 << 1) // (PWMC) Comparison 1 Selection #define AT91C_PWMC_L0CSEL2 (0x1 << 2) // (PWMC) Comparison 2 Selection #define AT91C_PWMC_L0CSEL3 (0x1 << 3) // (PWMC) Comparison 3 Selection #define AT91C_PWMC_L0CSEL4 (0x1 << 4) // (PWMC) Comparison 4 Selection #define AT91C_PWMC_L0CSEL5 (0x1 << 5) // (PWMC) Comparison 5 Selection #define AT91C_PWMC_L0CSEL6 (0x1 << 6) // (PWMC) Comparison 6 Selection #define AT91C_PWMC_L0CSEL7 (0x1 << 7) // (PWMC) Comparison 7 Selection // -------- PWMC_EL1MR : (PWMC Offset: 0x80) PWM Event Line 1 Mode Register -------- #define AT91C_PWMC_L1CSEL0 (0x1 << 0) // (PWMC) Comparison 0 Selection #define AT91C_PWMC_L1CSEL1 (0x1 << 1) // (PWMC) Comparison 1 Selection #define AT91C_PWMC_L1CSEL2 (0x1 << 2) // (PWMC) Comparison 2 Selection #define AT91C_PWMC_L1CSEL3 (0x1 << 3) // (PWMC) Comparison 3 Selection #define AT91C_PWMC_L1CSEL4 (0x1 << 4) // (PWMC) Comparison 4 Selection #define AT91C_PWMC_L1CSEL5 (0x1 << 5) // (PWMC) Comparison 5 Selection #define AT91C_PWMC_L1CSEL6 (0x1 << 6) // (PWMC) Comparison 6 Selection #define AT91C_PWMC_L1CSEL7 (0x1 << 7) // (PWMC) Comparison 7 Selection // -------- PWMC_EL2MR : (PWMC Offset: 0x84) PWM Event line 2 Mode Register -------- #define AT91C_PWMC_L2CSEL0 (0x1 << 0) // (PWMC) Comparison 0 Selection #define AT91C_PWMC_L2CSEL1 (0x1 << 1) // (PWMC) Comparison 1 Selection #define AT91C_PWMC_L2CSEL2 (0x1 << 2) // (PWMC) Comparison 2 Selection #define AT91C_PWMC_L2CSEL3 (0x1 << 3) // (PWMC) Comparison 3 Selection #define AT91C_PWMC_L2CSEL4 (0x1 << 4) // (PWMC) Comparison 4 Selection #define AT91C_PWMC_L2CSEL5 (0x1 << 5) // (PWMC) Comparison 5 Selection #define AT91C_PWMC_L2CSEL6 (0x1 << 6) // (PWMC) Comparison 6 Selection #define AT91C_PWMC_L2CSEL7 (0x1 << 7) // (PWMC) Comparison 7 Selection // -------- PWMC_EL3MR : (PWMC Offset: 0x88) PWM Event line 3 Mode Register -------- #define AT91C_PWMC_L3CSEL0 (0x1 << 0) // (PWMC) Comparison 0 Selection #define AT91C_PWMC_L3CSEL1 (0x1 << 1) // (PWMC) Comparison 1 Selection #define AT91C_PWMC_L3CSEL2 (0x1 << 2) // (PWMC) Comparison 2 Selection #define AT91C_PWMC_L3CSEL3 (0x1 << 3) // (PWMC) Comparison 3 Selection #define AT91C_PWMC_L3CSEL4 (0x1 << 4) // (PWMC) Comparison 4 Selection #define AT91C_PWMC_L3CSEL5 (0x1 << 5) // (PWMC) Comparison 5 Selection #define AT91C_PWMC_L3CSEL6 (0x1 << 6) // (PWMC) Comparison 6 Selection #define AT91C_PWMC_L3CSEL7 (0x1 << 7) // (PWMC) Comparison 7 Selection // -------- PWMC_EL4MR : (PWMC Offset: 0x8c) PWM Event line 4 Mode Register -------- #define AT91C_PWMC_L4CSEL0 (0x1 << 0) // (PWMC) Comparison 0 Selection #define AT91C_PWMC_L4CSEL1 (0x1 << 1) // (PWMC) Comparison 1 Selection #define AT91C_PWMC_L4CSEL2 (0x1 << 2) // (PWMC) Comparison 2 Selection #define AT91C_PWMC_L4CSEL3 (0x1 << 3) // (PWMC) Comparison 3 Selection #define AT91C_PWMC_L4CSEL4 (0x1 << 4) // (PWMC) Comparison 4 Selection #define AT91C_PWMC_L4CSEL5 (0x1 << 5) // (PWMC) Comparison 5 Selection #define AT91C_PWMC_L4CSEL6 (0x1 << 6) // (PWMC) Comparison 6 Selection #define AT91C_PWMC_L4CSEL7 (0x1 << 7) // (PWMC) Comparison 7 Selection // -------- PWMC_EL5MR : (PWMC Offset: 0x90) PWM Event line 5 Mode Register -------- #define AT91C_PWMC_L5CSEL0 (0x1 << 0) // (PWMC) Comparison 0 Selection #define AT91C_PWMC_L5CSEL1 (0x1 << 1) // (PWMC) Comparison 1 Selection #define AT91C_PWMC_L5CSEL2 (0x1 << 2) // (PWMC) Comparison 2 Selection #define AT91C_PWMC_L5CSEL3 (0x1 << 3) // (PWMC) Comparison 3 Selection #define AT91C_PWMC_L5CSEL4 (0x1 << 4) // (PWMC) Comparison 4 Selection #define AT91C_PWMC_L5CSEL5 (0x1 << 5) // (PWMC) Comparison 5 Selection #define AT91C_PWMC_L5CSEL6 (0x1 << 6) // (PWMC) Comparison 6 Selection #define AT91C_PWMC_L5CSEL7 (0x1 << 7) // (PWMC) Comparison 7 Selection // -------- PWMC_EL6MR : (PWMC Offset: 0x94) PWM Event line 6 Mode Register -------- #define AT91C_PWMC_L6CSEL0 (0x1 << 0) // (PWMC) Comparison 0 Selection #define AT91C_PWMC_L6CSEL1 (0x1 << 1) // (PWMC) Comparison 1 Selection #define AT91C_PWMC_L6CSEL2 (0x1 << 2) // (PWMC) Comparison 2 Selection #define AT91C_PWMC_L6CSEL3 (0x1 << 3) // (PWMC) Comparison 3 Selection #define AT91C_PWMC_L6CSEL4 (0x1 << 4) // (PWMC) Comparison 4 Selection #define AT91C_PWMC_L6CSEL5 (0x1 << 5) // (PWMC) Comparison 5 Selection #define AT91C_PWMC_L6CSEL6 (0x1 << 6) // (PWMC) Comparison 6 Selection #define AT91C_PWMC_L6CSEL7 (0x1 << 7) // (PWMC) Comparison 7 Selection // -------- PWMC_EL7MR : (PWMC Offset: 0x98) PWM Event line 7 Mode Register -------- #define AT91C_PWMC_L7CSEL0 (0x1 << 0) // (PWMC) Comparison 0 Selection #define AT91C_PWMC_L7CSEL1 (0x1 << 1) // (PWMC) Comparison 1 Selection #define AT91C_PWMC_L7CSEL2 (0x1 << 2) // (PWMC) Comparison 2 Selection #define AT91C_PWMC_L7CSEL3 (0x1 << 3) // (PWMC) Comparison 3 Selection #define AT91C_PWMC_L7CSEL4 (0x1 << 4) // (PWMC) Comparison 4 Selection #define AT91C_PWMC_L7CSEL5 (0x1 << 5) // (PWMC) Comparison 5 Selection #define AT91C_PWMC_L7CSEL6 (0x1 << 6) // (PWMC) Comparison 6 Selection #define AT91C_PWMC_L7CSEL7 (0x1 << 7) // (PWMC) Comparison 7 Selection // -------- PWMC_WPCR : (PWMC Offset: 0xe4) PWM Write Protection Control Register -------- #define AT91C_PWMC_WPCMD (0x3 << 0) // (PWMC) Write Protection Command #define AT91C_PWMC_WPRG0 (0x1 << 2) // (PWMC) Write Protect Register Group 0 #define AT91C_PWMC_WPRG1 (0x1 << 3) // (PWMC) Write Protect Register Group 1 #define AT91C_PWMC_WPRG2 (0x1 << 4) // (PWMC) Write Protect Register Group 2 #define AT91C_PWMC_WPRG3 (0x1 << 5) // (PWMC) Write Protect Register Group 3 #define AT91C_PWMC_WPRG4 (0x1 << 6) // (PWMC) Write Protect Register Group 4 #define AT91C_PWMC_WPRG5 (0x1 << 7) // (PWMC) Write Protect Register Group 5 #define AT91C_PWMC_WPKEY (0xFFFFFF << 8) // (PWMC) Protection Password // -------- PWMC_WPVS : (PWMC Offset: 0xe8) Write Protection Status Register -------- #define AT91C_PWMC_WPSWS0 (0x1 << 0) // (PWMC) Write Protect SW Group 0 Status #define AT91C_PWMC_WPSWS1 (0x1 << 1) // (PWMC) Write Protect SW Group 1 Status #define AT91C_PWMC_WPSWS2 (0x1 << 2) // (PWMC) Write Protect SW Group 2 Status #define AT91C_PWMC_WPSWS3 (0x1 << 3) // (PWMC) Write Protect SW Group 3 Status #define AT91C_PWMC_WPSWS4 (0x1 << 4) // (PWMC) Write Protect SW Group 4 Status #define AT91C_PWMC_WPSWS5 (0x1 << 5) // (PWMC) Write Protect SW Group 5 Status #define AT91C_PWMC_WPVS (0x1 << 7) // (PWMC) Write Protection Enable #define AT91C_PWMC_WPHWS0 (0x1 << 8) // (PWMC) Write Protect HW Group 0 Status #define AT91C_PWMC_WPHWS1 (0x1 << 9) // (PWMC) Write Protect HW Group 1 Status #define AT91C_PWMC_WPHWS2 (0x1 << 10) // (PWMC) Write Protect HW Group 2 Status #define AT91C_PWMC_WPHWS3 (0x1 << 11) // (PWMC) Write Protect HW Group 3 Status #define AT91C_PWMC_WPHWS4 (0x1 << 12) // (PWMC) Write Protect HW Group 4 Status #define AT91C_PWMC_WPHWS5 (0x1 << 13) // (PWMC) Write Protect HW Group 5 Status #define AT91C_PWMC_WPVSRC (0xFFFF << 16) // (PWMC) Write Protection Violation Source // -------- PWMC_CMP0V : (PWMC Offset: 0x130) PWM Comparison Value 0 Register -------- #define AT91C_PWMC_CV (0xFFFFFF << 0) // (PWMC) PWM Comparison Value 0. #define AT91C_PWMC_CVM (0x1 << 24) // (PWMC) Comparison Value 0 Mode. // -------- PWMC_CMP0VUPD : (PWMC Offset: 0x134) PWM Comparison Value 0 Update Register -------- #define AT91C_PWMC_CVUPD (0xFFFFFF << 0) // (PWMC) PWM Comparison Value Update. #define AT91C_PWMC_CVMUPD (0x1 << 24) // (PWMC) Comparison Value Update Mode. // -------- PWMC_CMP0M : (PWMC Offset: 0x138) PWM Comparison 0 Mode Register -------- #define AT91C_PWMC_CEN (0x1 << 0) // (PWMC) Comparison Enable. #define AT91C_PWMC_CTR (0xF << 4) // (PWMC) PWM Comparison Trigger. #define AT91C_PWMC_CPR (0xF << 8) // (PWMC) PWM Comparison Period. #define AT91C_PWMC_CPRCNT (0xF << 12) // (PWMC) PWM Comparison Period Counter. #define AT91C_PWMC_CUPR (0xF << 16) // (PWMC) PWM Comparison Update Period. #define AT91C_PWMC_CUPRCNT (0xF << 20) // (PWMC) PWM Comparison Update Period Counter. // -------- PWMC_CMP0MUPD : (PWMC Offset: 0x13c) PWM Comparison 0 Mode Update Register -------- #define AT91C_PWMC_CENUPD (0x1 << 0) // (PWMC) Comparison Enable Update. #define AT91C_PWMC_CTRUPD (0xF << 4) // (PWMC) PWM Comparison Trigger Update. #define AT91C_PWMC_CPRUPD (0xF << 8) // (PWMC) PWM Comparison Period Update. #define AT91C_PWMC_CUPRUPD (0xF << 16) // (PWMC) PWM Comparison Update Period Update. // -------- PWMC_CMP1V : (PWMC Offset: 0x140) PWM Comparison Value 1 Register -------- // -------- PWMC_CMP1VUPD : (PWMC Offset: 0x144) PWM Comparison Value 1 Update Register -------- // -------- PWMC_CMP1M : (PWMC Offset: 0x148) PWM Comparison 1 Mode Register -------- // -------- PWMC_CMP1MUPD : (PWMC Offset: 0x14c) PWM Comparison 1 Mode Update Register -------- // -------- PWMC_CMP2V : (PWMC Offset: 0x150) PWM Comparison Value 2 Register -------- // -------- PWMC_CMP2VUPD : (PWMC Offset: 0x154) PWM Comparison Value 2 Update Register -------- // -------- PWMC_CMP2M : (PWMC Offset: 0x158) PWM Comparison 2 Mode Register -------- // -------- PWMC_CMP2MUPD : (PWMC Offset: 0x15c) PWM Comparison 2 Mode Update Register -------- // -------- PWMC_CMP3V : (PWMC Offset: 0x160) PWM Comparison Value 3 Register -------- // -------- PWMC_CMP3VUPD : (PWMC Offset: 0x164) PWM Comparison Value 3 Update Register -------- // -------- PWMC_CMP3M : (PWMC Offset: 0x168) PWM Comparison 3 Mode Register -------- // -------- PWMC_CMP3MUPD : (PWMC Offset: 0x16c) PWM Comparison 3 Mode Update Register -------- // -------- PWMC_CMP4V : (PWMC Offset: 0x170) PWM Comparison Value 4 Register -------- // -------- PWMC_CMP4VUPD : (PWMC Offset: 0x174) PWM Comparison Value 4 Update Register -------- // -------- PWMC_CMP4M : (PWMC Offset: 0x178) PWM Comparison 4 Mode Register -------- // -------- PWMC_CMP4MUPD : (PWMC Offset: 0x17c) PWM Comparison 4 Mode Update Register -------- // -------- PWMC_CMP5V : (PWMC Offset: 0x180) PWM Comparison Value 5 Register -------- // -------- PWMC_CMP5VUPD : (PWMC Offset: 0x184) PWM Comparison Value 5 Update Register -------- // -------- PWMC_CMP5M : (PWMC Offset: 0x188) PWM Comparison 5 Mode Register -------- // -------- PWMC_CMP5MUPD : (PWMC Offset: 0x18c) PWM Comparison 5 Mode Update Register -------- // -------- PWMC_CMP6V : (PWMC Offset: 0x190) PWM Comparison Value 6 Register -------- // -------- PWMC_CMP6VUPD : (PWMC Offset: 0x194) PWM Comparison Value 6 Update Register -------- // -------- PWMC_CMP6M : (PWMC Offset: 0x198) PWM Comparison 6 Mode Register -------- // -------- PWMC_CMP6MUPD : (PWMC Offset: 0x19c) PWM Comparison 6 Mode Update Register -------- // -------- PWMC_CMP7V : (PWMC Offset: 0x1a0) PWM Comparison Value 7 Register -------- // -------- PWMC_CMP7VUPD : (PWMC Offset: 0x1a4) PWM Comparison Value 7 Update Register -------- // -------- PWMC_CMP7M : (PWMC Offset: 0x1a8) PWM Comparison 7 Mode Register -------- // -------- PWMC_CMP7MUPD : (PWMC Offset: 0x1ac) PWM Comparison 7 Mode Update Register -------- // ***************************************************************************** // SOFTWARE API DEFINITION FOR Serial Parallel Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_SPI { AT91_REG SPI_CR; // Control Register AT91_REG SPI_MR; // Mode Register AT91_REG SPI_RDR; // Receive Data Register AT91_REG SPI_TDR; // Transmit Data Register AT91_REG SPI_SR; // Status Register AT91_REG SPI_IER; // Interrupt Enable Register AT91_REG SPI_IDR; // Interrupt Disable Register AT91_REG SPI_IMR; // Interrupt Mask Register AT91_REG Reserved0[4]; // AT91_REG SPI_CSR[4]; // Chip Select Register AT91_REG Reserved1[43]; // AT91_REG SPI_ADDRSIZE; // SPI ADDRSIZE REGISTER AT91_REG SPI_IPNAME1; // SPI IPNAME1 REGISTER AT91_REG SPI_IPNAME2; // SPI IPNAME2 REGISTER AT91_REG SPI_FEATURES; // SPI FEATURES REGISTER AT91_REG SPI_VER; // Version Register } AT91S_SPI, *AT91PS_SPI; #else #define SPI_CR (AT91_CAST(AT91_REG *) 0x00000000) // (SPI_CR) Control Register #define SPI_MR (AT91_CAST(AT91_REG *) 0x00000004) // (SPI_MR) Mode Register #define SPI_RDR (AT91_CAST(AT91_REG *) 0x00000008) // (SPI_RDR) Receive Data Register #define SPI_TDR (AT91_CAST(AT91_REG *) 0x0000000C) // (SPI_TDR) Transmit Data Register #define SPI_SR (AT91_CAST(AT91_REG *) 0x00000010) // (SPI_SR) Status Register #define SPI_IER (AT91_CAST(AT91_REG *) 0x00000014) // (SPI_IER) Interrupt Enable Register #define SPI_IDR (AT91_CAST(AT91_REG *) 0x00000018) // (SPI_IDR) Interrupt Disable Register #define SPI_IMR (AT91_CAST(AT91_REG *) 0x0000001C) // (SPI_IMR) Interrupt Mask Register #define SPI_CSR (AT91_CAST(AT91_REG *) 0x00000030) // (SPI_CSR) Chip Select Register #define SPI_ADDRSIZE (AT91_CAST(AT91_REG *) 0x000000EC) // (SPI_ADDRSIZE) SPI ADDRSIZE REGISTER #define SPI_IPNAME1 (AT91_CAST(AT91_REG *) 0x000000F0) // (SPI_IPNAME1) SPI IPNAME1 REGISTER #define SPI_IPNAME2 (AT91_CAST(AT91_REG *) 0x000000F4) // (SPI_IPNAME2) SPI IPNAME2 REGISTER #define SPI_FEATURES (AT91_CAST(AT91_REG *) 0x000000F8) // (SPI_FEATURES) SPI FEATURES REGISTER #define SPI_VER (AT91_CAST(AT91_REG *) 0x000000FC) // (SPI_VER) Version Register #endif // -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- #define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable #define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable #define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset #define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer // -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- #define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode #define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select #define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select #define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select #define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode #define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection #define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection #define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection #define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select #define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects // -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- #define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data #define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status // -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- #define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data #define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status // -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- #define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full #define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty #define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error #define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status #define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer #define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer #define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt #define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt #define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt #define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt #define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status // -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- // -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- // -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- // -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- #define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity #define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase #define AT91C_SPI_CSNAAT (0x1 << 2) // (SPI) Chip Select Not Active After Transfer (Ignored if CSAAT = 1) #define AT91C_SPI_CSAAT (0x1 << 3) // (SPI) Chip Select Active After Transfer #define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer #define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer #define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer #define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer #define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer #define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer #define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer #define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer #define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer #define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer #define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate #define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Serial Clock Baud Rate #define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers // ***************************************************************************** // SOFTWARE API DEFINITION FOR UDPHS Enpoint FIFO data register // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_UDPHS_EPTFIFO { AT91_REG UDPHS_READEPT0[16384]; // FIFO Endpoint Data Register 0 AT91_REG UDPHS_READEPT1[16384]; // FIFO Endpoint Data Register 1 AT91_REG UDPHS_READEPT2[16384]; // FIFO Endpoint Data Register 2 AT91_REG UDPHS_READEPT3[16384]; // FIFO Endpoint Data Register 3 AT91_REG UDPHS_READEPT4[16384]; // FIFO Endpoint Data Register 4 AT91_REG UDPHS_READEPT5[16384]; // FIFO Endpoint Data Register 5 AT91_REG UDPHS_READEPT6[16384]; // FIFO Endpoint Data Register 6 } AT91S_UDPHS_EPTFIFO, *AT91PS_UDPHS_EPTFIFO; #else #define UDPHS_READEPT0 (AT91_CAST(AT91_REG *) 0x00000000) // (UDPHS_READEPT0) FIFO Endpoint Data Register 0 #define UDPHS_READEPT1 (AT91_CAST(AT91_REG *) 0x00010000) // (UDPHS_READEPT1) FIFO Endpoint Data Register 1 #define UDPHS_READEPT2 (AT91_CAST(AT91_REG *) 0x00020000) // (UDPHS_READEPT2) FIFO Endpoint Data Register 2 #define UDPHS_READEPT3 (AT91_CAST(AT91_REG *) 0x00030000) // (UDPHS_READEPT3) FIFO Endpoint Data Register 3 #define UDPHS_READEPT4 (AT91_CAST(AT91_REG *) 0x00040000) // (UDPHS_READEPT4) FIFO Endpoint Data Register 4 #define UDPHS_READEPT5 (AT91_CAST(AT91_REG *) 0x00050000) // (UDPHS_READEPT5) FIFO Endpoint Data Register 5 #define UDPHS_READEPT6 (AT91_CAST(AT91_REG *) 0x00060000) // (UDPHS_READEPT6) FIFO Endpoint Data Register 6 #endif // ***************************************************************************** // SOFTWARE API DEFINITION FOR UDPHS Endpoint struct // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_UDPHS_EPT { AT91_REG UDPHS_EPTCFG; // UDPHS Endpoint Config Register AT91_REG UDPHS_EPTCTLENB; // UDPHS Endpoint Control Enable Register AT91_REG UDPHS_EPTCTLDIS; // UDPHS Endpoint Control Disable Register AT91_REG UDPHS_EPTCTL; // UDPHS Endpoint Control Register AT91_REG Reserved0[1]; // AT91_REG UDPHS_EPTSETSTA; // UDPHS Endpoint Set Status Register AT91_REG UDPHS_EPTCLRSTA; // UDPHS Endpoint Clear Status Register AT91_REG UDPHS_EPTSTA; // UDPHS Endpoint Status Register } AT91S_UDPHS_EPT, *AT91PS_UDPHS_EPT; #else #define UDPHS_EPTCFG (AT91_CAST(AT91_REG *) 0x00000000) // (UDPHS_EPTCFG) UDPHS Endpoint Config Register #define UDPHS_EPTCTLENB (AT91_CAST(AT91_REG *) 0x00000004) // (UDPHS_EPTCTLENB) UDPHS Endpoint Control Enable Register #define UDPHS_EPTCTLDIS (AT91_CAST(AT91_REG *) 0x00000008) // (UDPHS_EPTCTLDIS) UDPHS Endpoint Control Disable Register #define UDPHS_EPTCTL (AT91_CAST(AT91_REG *) 0x0000000C) // (UDPHS_EPTCTL) UDPHS Endpoint Control Register #define UDPHS_EPTSETSTA (AT91_CAST(AT91_REG *) 0x00000014) // (UDPHS_EPTSETSTA) UDPHS Endpoint Set Status Register #define UDPHS_EPTCLRSTA (AT91_CAST(AT91_REG *) 0x00000018) // (UDPHS_EPTCLRSTA) UDPHS Endpoint Clear Status Register #define UDPHS_EPTSTA (AT91_CAST(AT91_REG *) 0x0000001C) // (UDPHS_EPTSTA) UDPHS Endpoint Status Register #endif // -------- UDPHS_EPTCFG : (UDPHS_EPT Offset: 0x0) UDPHS Endpoint Config Register -------- #define AT91C_UDPHS_EPT_SIZE (0x7 << 0) // (UDPHS_EPT) Endpoint Size #define AT91C_UDPHS_EPT_SIZE_8 (0x0) // (UDPHS_EPT) 8 bytes #define AT91C_UDPHS_EPT_SIZE_16 (0x1) // (UDPHS_EPT) 16 bytes #define AT91C_UDPHS_EPT_SIZE_32 (0x2) // (UDPHS_EPT) 32 bytes #define AT91C_UDPHS_EPT_SIZE_64 (0x3) // (UDPHS_EPT) 64 bytes #define AT91C_UDPHS_EPT_SIZE_128 (0x4) // (UDPHS_EPT) 128 bytes #define AT91C_UDPHS_EPT_SIZE_256 (0x5) // (UDPHS_EPT) 256 bytes (if possible) #define AT91C_UDPHS_EPT_SIZE_512 (0x6) // (UDPHS_EPT) 512 bytes (if possible) #define AT91C_UDPHS_EPT_SIZE_1024 (0x7) // (UDPHS_EPT) 1024 bytes (if possible) #define AT91C_UDPHS_EPT_DIR (0x1 << 3) // (UDPHS_EPT) Endpoint Direction 0:OUT, 1:IN #define AT91C_UDPHS_EPT_DIR_OUT (0x0 << 3) // (UDPHS_EPT) Direction OUT #define AT91C_UDPHS_EPT_DIR_IN (0x1 << 3) // (UDPHS_EPT) Direction IN #define AT91C_UDPHS_EPT_TYPE (0x3 << 4) // (UDPHS_EPT) Endpoint Type #define AT91C_UDPHS_EPT_TYPE_CTL_EPT (0x0 << 4) // (UDPHS_EPT) Control endpoint #define AT91C_UDPHS_EPT_TYPE_ISO_EPT (0x1 << 4) // (UDPHS_EPT) Isochronous endpoint #define AT91C_UDPHS_EPT_TYPE_BUL_EPT (0x2 << 4) // (UDPHS_EPT) Bulk endpoint #define AT91C_UDPHS_EPT_TYPE_INT_EPT (0x3 << 4) // (UDPHS_EPT) Interrupt endpoint #define AT91C_UDPHS_BK_NUMBER (0x3 << 6) // (UDPHS_EPT) Number of Banks #define AT91C_UDPHS_BK_NUMBER_0 (0x0 << 6) // (UDPHS_EPT) Zero Bank, the EndPoint is not mapped in memory #define AT91C_UDPHS_BK_NUMBER_1 (0x1 << 6) // (UDPHS_EPT) One Bank (Bank0) #define AT91C_UDPHS_BK_NUMBER_2 (0x2 << 6) // (UDPHS_EPT) Double bank (Ping-Pong : Bank0 / Bank1) #define AT91C_UDPHS_BK_NUMBER_3 (0x3 << 6) // (UDPHS_EPT) Triple Bank (Bank0 / Bank1 / Bank2) (if possible) #define AT91C_UDPHS_NB_TRANS (0x3 << 8) // (UDPHS_EPT) Number Of Transaction per Micro-Frame (High-Bandwidth iso only) #define AT91C_UDPHS_EPT_MAPD (0x1 << 31) // (UDPHS_EPT) Endpoint Mapped (read only // -------- UDPHS_EPTCTLENB : (UDPHS_EPT Offset: 0x4) UDPHS Endpoint Control Enable Register -------- #define AT91C_UDPHS_EPT_ENABL (0x1 << 0) // (UDPHS_EPT) Endpoint Enable #define AT91C_UDPHS_AUTO_VALID (0x1 << 1) // (UDPHS_EPT) Packet Auto-Valid Enable/Disable #define AT91C_UDPHS_INTDIS_DMA (0x1 << 3) // (UDPHS_EPT) Endpoint Interrupts DMA Request Enable/Disable #define AT91C_UDPHS_NYET_DIS (0x1 << 4) // (UDPHS_EPT) NYET Enable/Disable #define AT91C_UDPHS_DATAX_RX (0x1 << 6) // (UDPHS_EPT) DATAx Interrupt Enable/Disable #define AT91C_UDPHS_MDATA_RX (0x1 << 7) // (UDPHS_EPT) MDATA Interrupt Enabled/Disable #define AT91C_UDPHS_ERR_OVFLW (0x1 << 8) // (UDPHS_EPT) OverFlow Error Interrupt Enable/Disable/Status #define AT91C_UDPHS_RX_BK_RDY (0x1 << 9) // (UDPHS_EPT) Received OUT Data #define AT91C_UDPHS_TX_COMPLT (0x1 << 10) // (UDPHS_EPT) Transmitted IN Data Complete Interrupt Enable/Disable or Transmitted IN Data Complete (clear) #define AT91C_UDPHS_ERR_TRANS (0x1 << 11) // (UDPHS_EPT) Transaction Error Interrupt Enable/Disable #define AT91C_UDPHS_TX_PK_RDY (0x1 << 11) // (UDPHS_EPT) TX Packet Ready Interrupt Enable/Disable #define AT91C_UDPHS_RX_SETUP (0x1 << 12) // (UDPHS_EPT) Received SETUP Interrupt Enable/Disable #define AT91C_UDPHS_ERR_FL_ISO (0x1 << 12) // (UDPHS_EPT) Error Flow Clear/Interrupt Enable/Disable #define AT91C_UDPHS_STALL_SNT (0x1 << 13) // (UDPHS_EPT) Stall Sent Clear #define AT91C_UDPHS_ERR_CRISO (0x1 << 13) // (UDPHS_EPT) CRC error / Error NB Trans / Interrupt Enable/Disable #define AT91C_UDPHS_NAK_IN (0x1 << 14) // (UDPHS_EPT) NAKIN ERROR FLUSH / Clear / Interrupt Enable/Disable #define AT91C_UDPHS_NAK_OUT (0x1 << 15) // (UDPHS_EPT) NAKOUT / Clear / Interrupt Enable/Disable #define AT91C_UDPHS_BUSY_BANK (0x1 << 18) // (UDPHS_EPT) Busy Bank Interrupt Enable/Disable #define AT91C_UDPHS_SHRT_PCKT (0x1 << 31) // (UDPHS_EPT) Short Packet / Interrupt Enable/Disable // -------- UDPHS_EPTCTLDIS : (UDPHS_EPT Offset: 0x8) UDPHS Endpoint Control Disable Register -------- #define AT91C_UDPHS_EPT_DISABL (0x1 << 0) // (UDPHS_EPT) Endpoint Disable // -------- UDPHS_EPTCTL : (UDPHS_EPT Offset: 0xc) UDPHS Endpoint Control Register -------- // -------- UDPHS_EPTSETSTA : (UDPHS_EPT Offset: 0x14) UDPHS Endpoint Set Status Register -------- #define AT91C_UDPHS_FRCESTALL (0x1 << 5) // (UDPHS_EPT) Stall Handshake Request Set/Clear/Status #define AT91C_UDPHS_KILL_BANK (0x1 << 9) // (UDPHS_EPT) KILL Bank // -------- UDPHS_EPTCLRSTA : (UDPHS_EPT Offset: 0x18) UDPHS Endpoint Clear Status Register -------- #define AT91C_UDPHS_TOGGLESQ (0x1 << 6) // (UDPHS_EPT) Data Toggle Clear // -------- UDPHS_EPTSTA : (UDPHS_EPT Offset: 0x1c) UDPHS Endpoint Status Register -------- #define AT91C_UDPHS_TOGGLESQ_STA (0x3 << 6) // (UDPHS_EPT) Toggle Sequencing #define AT91C_UDPHS_TOGGLESQ_STA_00 (0x0 << 6) // (UDPHS_EPT) Data0 #define AT91C_UDPHS_TOGGLESQ_STA_01 (0x1 << 6) // (UDPHS_EPT) Data1 #define AT91C_UDPHS_TOGGLESQ_STA_10 (0x2 << 6) // (UDPHS_EPT) Data2 (only for High-Bandwidth Isochronous EndPoint) #define AT91C_UDPHS_TOGGLESQ_STA_11 (0x3 << 6) // (UDPHS_EPT) MData (only for High-Bandwidth Isochronous EndPoint) #define AT91C_UDPHS_CONTROL_DIR (0x3 << 16) // (UDPHS_EPT) #define AT91C_UDPHS_CONTROL_DIR_00 (0x0 << 16) // (UDPHS_EPT) Bank 0 #define AT91C_UDPHS_CONTROL_DIR_01 (0x1 << 16) // (UDPHS_EPT) Bank 1 #define AT91C_UDPHS_CONTROL_DIR_10 (0x2 << 16) // (UDPHS_EPT) Bank 2 #define AT91C_UDPHS_CONTROL_DIR_11 (0x3 << 16) // (UDPHS_EPT) Invalid #define AT91C_UDPHS_CURRENT_BANK (0x3 << 16) // (UDPHS_EPT) #define AT91C_UDPHS_CURRENT_BANK_00 (0x0 << 16) // (UDPHS_EPT) Bank 0 #define AT91C_UDPHS_CURRENT_BANK_01 (0x1 << 16) // (UDPHS_EPT) Bank 1 #define AT91C_UDPHS_CURRENT_BANK_10 (0x2 << 16) // (UDPHS_EPT) Bank 2 #define AT91C_UDPHS_CURRENT_BANK_11 (0x3 << 16) // (UDPHS_EPT) Invalid #define AT91C_UDPHS_BUSY_BANK_STA (0x3 << 18) // (UDPHS_EPT) Busy Bank Number #define AT91C_UDPHS_BUSY_BANK_STA_00 (0x0 << 18) // (UDPHS_EPT) All banks are free #define AT91C_UDPHS_BUSY_BANK_STA_01 (0x1 << 18) // (UDPHS_EPT) 1 busy bank #define AT91C_UDPHS_BUSY_BANK_STA_10 (0x2 << 18) // (UDPHS_EPT) 2 busy banks #define AT91C_UDPHS_BUSY_BANK_STA_11 (0x3 << 18) // (UDPHS_EPT) 3 busy banks (if possible) #define AT91C_UDPHS_BYTE_COUNT (0x7FF << 20) // (UDPHS_EPT) UDPHS Byte Count // ***************************************************************************** // SOFTWARE API DEFINITION FOR UDPHS DMA struct // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_UDPHS_DMA { AT91_REG UDPHS_DMANXTDSC; // UDPHS DMA Channel Next Descriptor Address AT91_REG UDPHS_DMAADDRESS; // UDPHS DMA Channel Address Register AT91_REG UDPHS_DMACONTROL; // UDPHS DMA Channel Control Register AT91_REG UDPHS_DMASTATUS; // UDPHS DMA Channel Status Register } AT91S_UDPHS_DMA, *AT91PS_UDPHS_DMA; #else #define UDPHS_DMANXTDSC (AT91_CAST(AT91_REG *) 0x00000000) // (UDPHS_DMANXTDSC) UDPHS DMA Channel Next Descriptor Address #define UDPHS_DMAADDRESS (AT91_CAST(AT91_REG *) 0x00000004) // (UDPHS_DMAADDRESS) UDPHS DMA Channel Address Register #define UDPHS_DMACONTROL (AT91_CAST(AT91_REG *) 0x00000008) // (UDPHS_DMACONTROL) UDPHS DMA Channel Control Register #define UDPHS_DMASTATUS (AT91_CAST(AT91_REG *) 0x0000000C) // (UDPHS_DMASTATUS) UDPHS DMA Channel Status Register #endif // -------- UDPHS_DMANXTDSC : (UDPHS_DMA Offset: 0x0) UDPHS DMA Next Descriptor Address Register -------- #define AT91C_UDPHS_NXT_DSC_ADD (0xFFFFFFF << 4) // (UDPHS_DMA) next Channel Descriptor // -------- UDPHS_DMAADDRESS : (UDPHS_DMA Offset: 0x4) UDPHS DMA Channel Address Register -------- #define AT91C_UDPHS_BUFF_ADD (0x0 << 0) // (UDPHS_DMA) starting address of a DMA Channel transfer // -------- UDPHS_DMACONTROL : (UDPHS_DMA Offset: 0x8) UDPHS DMA Channel Control Register -------- #define AT91C_UDPHS_CHANN_ENB (0x1 << 0) // (UDPHS_DMA) Channel Enabled #define AT91C_UDPHS_LDNXT_DSC (0x1 << 1) // (UDPHS_DMA) Load Next Channel Transfer Descriptor Enable #define AT91C_UDPHS_END_TR_EN (0x1 << 2) // (UDPHS_DMA) Buffer Close Input Enable #define AT91C_UDPHS_END_B_EN (0x1 << 3) // (UDPHS_DMA) End of DMA Buffer Packet Validation #define AT91C_UDPHS_END_TR_IT (0x1 << 4) // (UDPHS_DMA) End Of Transfer Interrupt Enable #define AT91C_UDPHS_END_BUFFIT (0x1 << 5) // (UDPHS_DMA) End Of Channel Buffer Interrupt Enable #define AT91C_UDPHS_DESC_LD_IT (0x1 << 6) // (UDPHS_DMA) Descriptor Loaded Interrupt Enable #define AT91C_UDPHS_BURST_LCK (0x1 << 7) // (UDPHS_DMA) Burst Lock Enable #define AT91C_UDPHS_BUFF_LENGTH (0xFFFF << 16) // (UDPHS_DMA) Buffer Byte Length (write only) // -------- UDPHS_DMASTATUS : (UDPHS_DMA Offset: 0xc) UDPHS DMA Channelx Status Register -------- #define AT91C_UDPHS_CHANN_ACT (0x1 << 1) // (UDPHS_DMA) #define AT91C_UDPHS_END_TR_ST (0x1 << 4) // (UDPHS_DMA) #define AT91C_UDPHS_END_BF_ST (0x1 << 5) // (UDPHS_DMA) #define AT91C_UDPHS_DESC_LDST (0x1 << 6) // (UDPHS_DMA) #define AT91C_UDPHS_BUFF_COUNT (0xFFFF << 16) // (UDPHS_DMA) // ***************************************************************************** // SOFTWARE API DEFINITION FOR UDPHS High Speed Device Interface // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_UDPHS { AT91_REG UDPHS_CTRL; // UDPHS Control Register AT91_REG UDPHS_FNUM; // UDPHS Frame Number Register AT91_REG Reserved0[2]; // AT91_REG UDPHS_IEN; // UDPHS Interrupt Enable Register AT91_REG UDPHS_INTSTA; // UDPHS Interrupt Status Register AT91_REG UDPHS_CLRINT; // UDPHS Clear Interrupt Register AT91_REG UDPHS_EPTRST; // UDPHS Endpoints Reset Register AT91_REG Reserved1[44]; // AT91_REG UDPHS_TSTSOFCNT; // UDPHS Test SOF Counter Register AT91_REG UDPHS_TSTCNTA; // UDPHS Test A Counter Register AT91_REG UDPHS_TSTCNTB; // UDPHS Test B Counter Register AT91_REG UDPHS_TSTMODREG; // UDPHS Test Mode Register AT91_REG UDPHS_TST; // UDPHS Test Register AT91_REG Reserved2[2]; // AT91_REG UDPHS_RIPPADDRSIZE; // UDPHS PADDRSIZE Register AT91_REG UDPHS_RIPNAME1; // UDPHS Name1 Register AT91_REG UDPHS_RIPNAME2; // UDPHS Name2 Register AT91_REG UDPHS_IPFEATURES; // UDPHS Features Register AT91_REG UDPHS_IPVERSION; // UDPHS Version Register AT91S_UDPHS_EPT UDPHS_EPT[7]; // UDPHS Endpoint struct AT91_REG Reserved3[72]; // AT91S_UDPHS_DMA UDPHS_DMA[6]; // UDPHS DMA channel struct (not use [0]) } AT91S_UDPHS, *AT91PS_UDPHS; #else #define UDPHS_CTRL (AT91_CAST(AT91_REG *) 0x00000000) // (UDPHS_CTRL) UDPHS Control Register #define UDPHS_FNUM (AT91_CAST(AT91_REG *) 0x00000004) // (UDPHS_FNUM) UDPHS Frame Number Register #define UDPHS_IEN (AT91_CAST(AT91_REG *) 0x00000010) // (UDPHS_IEN) UDPHS Interrupt Enable Register #define UDPHS_INTSTA (AT91_CAST(AT91_REG *) 0x00000014) // (UDPHS_INTSTA) UDPHS Interrupt Status Register #define UDPHS_CLRINT (AT91_CAST(AT91_REG *) 0x00000018) // (UDPHS_CLRINT) UDPHS Clear Interrupt Register #define UDPHS_EPTRST (AT91_CAST(AT91_REG *) 0x0000001C) // (UDPHS_EPTRST) UDPHS Endpoints Reset Register #define UDPHS_TSTSOFCNT (AT91_CAST(AT91_REG *) 0x000000D0) // (UDPHS_TSTSOFCNT) UDPHS Test SOF Counter Register #define UDPHS_TSTCNTA (AT91_CAST(AT91_REG *) 0x000000D4) // (UDPHS_TSTCNTA) UDPHS Test A Counter Register #define UDPHS_TSTCNTB (AT91_CAST(AT91_REG *) 0x000000D8) // (UDPHS_TSTCNTB) UDPHS Test B Counter Register #define UDPHS_TSTMODREG (AT91_CAST(AT91_REG *) 0x000000DC) // (UDPHS_TSTMODREG) UDPHS Test Mode Register #define UDPHS_TST (AT91_CAST(AT91_REG *) 0x000000E0) // (UDPHS_TST) UDPHS Test Register #define UDPHS_RIPPADDRSIZE (AT91_CAST(AT91_REG *) 0x000000EC) // (UDPHS_RIPPADDRSIZE) UDPHS PADDRSIZE Register #define UDPHS_RIPNAME1 (AT91_CAST(AT91_REG *) 0x000000F0) // (UDPHS_RIPNAME1) UDPHS Name1 Register #define UDPHS_RIPNAME2 (AT91_CAST(AT91_REG *) 0x000000F4) // (UDPHS_RIPNAME2) UDPHS Name2 Register #define UDPHS_IPFEATURES (AT91_CAST(AT91_REG *) 0x000000F8) // (UDPHS_IPFEATURES) UDPHS Features Register #define UDPHS_IPVERSION (AT91_CAST(AT91_REG *) 0x000000FC) // (UDPHS_IPVERSION) UDPHS Version Register #endif // -------- UDPHS_CTRL : (UDPHS Offset: 0x0) UDPHS Control Register -------- #define AT91C_UDPHS_DEV_ADDR (0x7F << 0) // (UDPHS) UDPHS Address #define AT91C_UDPHS_FADDR_EN (0x1 << 7) // (UDPHS) Function Address Enable #define AT91C_UDPHS_EN_UDPHS (0x1 << 8) // (UDPHS) UDPHS Enable #define AT91C_UDPHS_DETACH (0x1 << 9) // (UDPHS) Detach Command #define AT91C_UDPHS_REWAKEUP (0x1 << 10) // (UDPHS) Send Remote Wake Up #define AT91C_UDPHS_PULLD_DIS (0x1 << 11) // (UDPHS) PullDown Disable // -------- UDPHS_FNUM : (UDPHS Offset: 0x4) UDPHS Frame Number Register -------- #define AT91C_UDPHS_MICRO_FRAME_NUM (0x7 << 0) // (UDPHS) Micro Frame Number #define AT91C_UDPHS_FRAME_NUMBER (0x7FF << 3) // (UDPHS) Frame Number as defined in the Packet Field Formats #define AT91C_UDPHS_FNUM_ERR (0x1 << 31) // (UDPHS) Frame Number CRC Error // -------- UDPHS_IEN : (UDPHS Offset: 0x10) UDPHS Interrupt Enable Register -------- #define AT91C_UDPHS_DET_SUSPD (0x1 << 1) // (UDPHS) Suspend Interrupt Enable/Clear/Status #define AT91C_UDPHS_MICRO_SOF (0x1 << 2) // (UDPHS) Micro-SOF Interrupt Enable/Clear/Status #define AT91C_UDPHS_IEN_SOF (0x1 << 3) // (UDPHS) SOF Interrupt Enable/Clear/Status #define AT91C_UDPHS_ENDRESET (0x1 << 4) // (UDPHS) End Of Reset Interrupt Enable/Clear/Status #define AT91C_UDPHS_WAKE_UP (0x1 << 5) // (UDPHS) Wake Up CPU Interrupt Enable/Clear/Status #define AT91C_UDPHS_ENDOFRSM (0x1 << 6) // (UDPHS) End Of Resume Interrupt Enable/Clear/Status #define AT91C_UDPHS_UPSTR_RES (0x1 << 7) // (UDPHS) Upstream Resume Interrupt Enable/Clear/Status #define AT91C_UDPHS_EPT_INT_0 (0x1 << 8) // (UDPHS) Endpoint 0 Interrupt Enable/Status #define AT91C_UDPHS_EPT_INT_1 (0x1 << 9) // (UDPHS) Endpoint 1 Interrupt Enable/Status #define AT91C_UDPHS_EPT_INT_2 (0x1 << 10) // (UDPHS) Endpoint 2 Interrupt Enable/Status #define AT91C_UDPHS_EPT_INT_3 (0x1 << 11) // (UDPHS) Endpoint 3 Interrupt Enable/Status #define AT91C_UDPHS_EPT_INT_4 (0x1 << 12) // (UDPHS) Endpoint 4 Interrupt Enable/Status #define AT91C_UDPHS_EPT_INT_5 (0x1 << 13) // (UDPHS) Endpoint 5 Interrupt Enable/Status #define AT91C_UDPHS_EPT_INT_6 (0x1 << 14) // (UDPHS) Endpoint 6 Interrupt Enable/Status #define AT91C_UDPHS_DMA_INT_1 (0x1 << 25) // (UDPHS) DMA Channel 1 Interrupt Enable/Status #define AT91C_UDPHS_DMA_INT_2 (0x1 << 26) // (UDPHS) DMA Channel 2 Interrupt Enable/Status #define AT91C_UDPHS_DMA_INT_3 (0x1 << 27) // (UDPHS) DMA Channel 3 Interrupt Enable/Status #define AT91C_UDPHS_DMA_INT_4 (0x1 << 28) // (UDPHS) DMA Channel 4 Interrupt Enable/Status #define AT91C_UDPHS_DMA_INT_5 (0x1 << 29) // (UDPHS) DMA Channel 5 Interrupt Enable/Status #define AT91C_UDPHS_DMA_INT_6 (0x1 << 30) // (UDPHS) DMA Channel 6 Interrupt Enable/Status // -------- UDPHS_INTSTA : (UDPHS Offset: 0x14) UDPHS Interrupt Status Register -------- #define AT91C_UDPHS_SPEED (0x1 << 0) // (UDPHS) Speed Status // -------- UDPHS_CLRINT : (UDPHS Offset: 0x18) UDPHS Clear Interrupt Register -------- // -------- UDPHS_EPTRST : (UDPHS Offset: 0x1c) UDPHS Endpoints Reset Register -------- #define AT91C_UDPHS_RST_EPT_0 (0x1 << 0) // (UDPHS) Endpoint Reset 0 #define AT91C_UDPHS_RST_EPT_1 (0x1 << 1) // (UDPHS) Endpoint Reset 1 #define AT91C_UDPHS_RST_EPT_2 (0x1 << 2) // (UDPHS) Endpoint Reset 2 #define AT91C_UDPHS_RST_EPT_3 (0x1 << 3) // (UDPHS) Endpoint Reset 3 #define AT91C_UDPHS_RST_EPT_4 (0x1 << 4) // (UDPHS) Endpoint Reset 4 #define AT91C_UDPHS_RST_EPT_5 (0x1 << 5) // (UDPHS) Endpoint Reset 5 #define AT91C_UDPHS_RST_EPT_6 (0x1 << 6) // (UDPHS) Endpoint Reset 6 // -------- UDPHS_TSTSOFCNT : (UDPHS Offset: 0xd0) UDPHS Test SOF Counter Register -------- #define AT91C_UDPHS_SOFCNTMAX (0x3 << 0) // (UDPHS) SOF Counter Max Value #define AT91C_UDPHS_SOFCTLOAD (0x1 << 7) // (UDPHS) SOF Counter Load // -------- UDPHS_TSTCNTA : (UDPHS Offset: 0xd4) UDPHS Test A Counter Register -------- #define AT91C_UDPHS_CNTAMAX (0x7FFF << 0) // (UDPHS) A Counter Max Value #define AT91C_UDPHS_CNTALOAD (0x1 << 15) // (UDPHS) A Counter Load // -------- UDPHS_TSTCNTB : (UDPHS Offset: 0xd8) UDPHS Test B Counter Register -------- #define AT91C_UDPHS_CNTBMAX (0x7FFF << 0) // (UDPHS) B Counter Max Value #define AT91C_UDPHS_CNTBLOAD (0x1 << 15) // (UDPHS) B Counter Load // -------- UDPHS_TSTMODREG : (UDPHS Offset: 0xdc) UDPHS Test Mode Register -------- #define AT91C_UDPHS_TSTMODE (0x1F << 1) // (UDPHS) UDPHS Core TestModeReg // -------- UDPHS_TST : (UDPHS Offset: 0xe0) UDPHS Test Register -------- #define AT91C_UDPHS_SPEED_CFG (0x3 << 0) // (UDPHS) Speed Configuration #define AT91C_UDPHS_SPEED_CFG_NM (0x0) // (UDPHS) Normal Mode #define AT91C_UDPHS_SPEED_CFG_RS (0x1) // (UDPHS) Reserved #define AT91C_UDPHS_SPEED_CFG_HS (0x2) // (UDPHS) Force High Speed #define AT91C_UDPHS_SPEED_CFG_FS (0x3) // (UDPHS) Force Full-Speed #define AT91C_UDPHS_TST_J (0x1 << 2) // (UDPHS) TestJMode #define AT91C_UDPHS_TST_K (0x1 << 3) // (UDPHS) TestKMode #define AT91C_UDPHS_TST_PKT (0x1 << 4) // (UDPHS) TestPacketMode #define AT91C_UDPHS_OPMODE2 (0x1 << 5) // (UDPHS) OpMode2 // -------- UDPHS_RIPPADDRSIZE : (UDPHS Offset: 0xec) UDPHS PADDRSIZE Register -------- #define AT91C_UDPHS_IPPADDRSIZE (0x0 << 0) // (UDPHS) 2^UDPHSDEV_PADDR_SIZE // -------- UDPHS_RIPNAME1 : (UDPHS Offset: 0xf0) UDPHS Name Register -------- #define AT91C_UDPHS_IPNAME1 (0x0 << 0) // (UDPHS) ASCII string HUSB // -------- UDPHS_RIPNAME2 : (UDPHS Offset: 0xf4) UDPHS Name Register -------- #define AT91C_UDPHS_IPNAME2 (0x0 << 0) // (UDPHS) ASCII string 2DEV // -------- UDPHS_IPFEATURES : (UDPHS Offset: 0xf8) UDPHS Features Register -------- #define AT91C_UDPHS_EPT_NBR_MAX (0xF << 0) // (UDPHS) Max Number of Endpoints #define AT91C_UDPHS_DMA_CHANNEL_NBR (0x7 << 4) // (UDPHS) Number of DMA Channels #define AT91C_UDPHS_DMA_B_SIZ (0x1 << 7) // (UDPHS) DMA Buffer Size #define AT91C_UDPHS_DMA_FIFO_WORD_DEPTH (0xF << 8) // (UDPHS) DMA FIFO Depth in words #define AT91C_UDPHS_FIFO_MAX_SIZE (0x7 << 12) // (UDPHS) DPRAM size #define AT91C_UDPHS_BW_DPRAM (0x1 << 15) // (UDPHS) DPRAM byte write capability #define AT91C_UDPHS_DATAB16_8 (0x1 << 16) // (UDPHS) UTMI DataBus16_8 #define AT91C_UDPHS_ISO_EPT_1 (0x1 << 17) // (UDPHS) Endpoint 1 High Bandwidth Isochronous Capability #define AT91C_UDPHS_ISO_EPT_2 (0x1 << 18) // (UDPHS) Endpoint 2 High Bandwidth Isochronous Capability #define AT91C_UDPHS_ISO_EPT_5 (0x1 << 21) // (UDPHS) Endpoint 5 High Bandwidth Isochronous Capability #define AT91C_UDPHS_ISO_EPT_6 (0x1 << 22) // (UDPHS) Endpoint 6 High Bandwidth Isochronous Capability // -------- UDPHS_IPVERSION : (UDPHS Offset: 0xfc) UDPHS Version Register -------- #define AT91C_UDPHS_VERSION_NUM (0xFFFF << 0) // (UDPHS) Give the IP version #define AT91C_UDPHS_METAL_FIX_NUM (0x7 << 16) // (UDPHS) Give the number of metal fixes // ***************************************************************************** // SOFTWARE API DEFINITION FOR HDMA Channel structure // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_HDMA_CH { AT91_REG HDMA_SADDR; // HDMA Channel Source Address Register AT91_REG HDMA_DADDR; // HDMA Channel Destination Address Register AT91_REG HDMA_DSCR; // HDMA Channel Descriptor Address Register AT91_REG HDMA_CTRLA; // HDMA Channel Control A Register AT91_REG HDMA_CTRLB; // HDMA Channel Control B Register AT91_REG HDMA_CFG; // HDMA Channel Configuration Register AT91_REG Reserved[4]; // Change for address alignment } AT91S_HDMA_CH, *AT91PS_HDMA_CH; #else #define HDMA_SADDR (AT91_CAST(AT91_REG *) 0x00000000) // (HDMA_SADDR) HDMA Channel Source Address Register #define HDMA_DADDR (AT91_CAST(AT91_REG *) 0x00000004) // (HDMA_DADDR) HDMA Channel Destination Address Register #define HDMA_DSCR (AT91_CAST(AT91_REG *) 0x00000008) // (HDMA_DSCR) HDMA Channel Descriptor Address Register #define HDMA_CTRLA (AT91_CAST(AT91_REG *) 0x0000000C) // (HDMA_CTRLA) HDMA Channel Control A Register #define HDMA_CTRLB (AT91_CAST(AT91_REG *) 0x00000010) // (HDMA_CTRLB) HDMA Channel Control B Register #define HDMA_CFG (AT91_CAST(AT91_REG *) 0x00000014) // (HDMA_CFG) HDMA Channel Configuration Register #endif // -------- HDMA_SADDR : (HDMA_CH Offset: 0x0) -------- #define AT91C_SADDR (0x0 << 0) // (HDMA_CH) // -------- HDMA_DADDR : (HDMA_CH Offset: 0x4) -------- #define AT91C_DADDR (0x0 << 0) // (HDMA_CH) // -------- HDMA_DSCR : (HDMA_CH Offset: 0x8) -------- #define AT91C_HDMA_DSCR (0x3FFFFFFF << 2) // (HDMA_CH) Buffer Transfer descriptor address. This address is word aligned. // -------- HDMA_CTRLA : (HDMA_CH Offset: 0xc) -------- #define AT91C_HDMA_BTSIZE (0xFFFF << 0) // (HDMA_CH) Buffer Transfer Size. #define AT91C_HDMA_SCSIZE (0x1 << 16) // (HDMA_CH) Source Chunk Transfer Size. #define AT91C_HDMA_SCSIZE_1 (0x0 << 16) // (HDMA_CH) 1. #define AT91C_HDMA_SCSIZE_4 (0x1 << 16) // (HDMA_CH) 4. #define AT91C_HDMA_DCSIZE (0x1 << 20) // (HDMA_CH) Destination Chunk Transfer Size #define AT91C_HDMA_DCSIZE_1 (0x0 << 20) // (HDMA_CH) 1. #define AT91C_HDMA_DCSIZE_4 (0x1 << 20) // (HDMA_CH) 4. #define AT91C_HDMA_SRC_WIDTH (0x3 << 24) // (HDMA_CH) Source Single Transfer Size #define AT91C_HDMA_SRC_WIDTH_BYTE (0x0 << 24) // (HDMA_CH) BYTE. #define AT91C_HDMA_SRC_WIDTH_HALFWORD (0x1 << 24) // (HDMA_CH) HALF-WORD. #define AT91C_HDMA_SRC_WIDTH_WORD (0x2 << 24) // (HDMA_CH) WORD. #define AT91C_HDMA_DST_WIDTH (0x3 << 28) // (HDMA_CH) Destination Single Transfer Size #define AT91C_HDMA_DST_WIDTH_BYTE (0x0 << 28) // (HDMA_CH) BYTE. #define AT91C_HDMA_DST_WIDTH_HALFWORD (0x1 << 28) // (HDMA_CH) HALF-WORD. #define AT91C_HDMA_DST_WIDTH_WORD (0x2 << 28) // (HDMA_CH) WORD. #define AT91C_HDMA_DONE (0x1 << 31) // (HDMA_CH) // -------- HDMA_CTRLB : (HDMA_CH Offset: 0x10) -------- #define AT91C_HDMA_SRC_DSCR (0x1 << 16) // (HDMA_CH) Source Buffer Descriptor Fetch operation #define AT91C_HDMA_SRC_DSCR_FETCH_FROM_MEM (0x0 << 16) // (HDMA_CH) Source address is updated when the descriptor is fetched from the memory. #define AT91C_HDMA_SRC_DSCR_FETCH_DISABLE (0x1 << 16) // (HDMA_CH) Buffer Descriptor Fetch operation is disabled for the Source. #define AT91C_HDMA_DST_DSCR (0x1 << 20) // (HDMA_CH) Destination Buffer Descriptor operation #define AT91C_HDMA_DST_DSCR_FETCH_FROM_MEM (0x0 << 20) // (HDMA_CH) Destination address is updated when the descriptor is fetched from the memory. #define AT91C_HDMA_DST_DSCR_FETCH_DISABLE (0x1 << 20) // (HDMA_CH) Buffer Descriptor Fetch operation is disabled for the destination. #define AT91C_HDMA_FC (0x7 << 21) // (HDMA_CH) This field defines which devices controls the size of the buffer transfer, also referred as to the Flow Controller. #define AT91C_HDMA_FC_MEM2MEM (0x0 << 21) // (HDMA_CH) Memory-to-Memory (DMA Controller). #define AT91C_HDMA_FC_MEM2PER (0x1 << 21) // (HDMA_CH) Memory-to-Peripheral (DMA Controller). #define AT91C_HDMA_FC_PER2MEM (0x2 << 21) // (HDMA_CH) Peripheral-to-Memory (DMA Controller). #define AT91C_HDMA_FC_PER2PER (0x3 << 21) // (HDMA_CH) Peripheral-to-Peripheral (DMA Controller). #define AT91C_HDMA_SRC_ADDRESS_MODE (0x3 << 24) // (HDMA_CH) Type of addressing mode #define AT91C_HDMA_SRC_ADDRESS_MODE_INCR (0x0 << 24) // (HDMA_CH) Incrementing Mode. #define AT91C_HDMA_SRC_ADDRESS_MODE_DECR (0x1 << 24) // (HDMA_CH) Decrementing Mode. #define AT91C_HDMA_SRC_ADDRESS_MODE_FIXED (0x2 << 24) // (HDMA_CH) Fixed Mode. #define AT91C_HDMA_DST_ADDRESS_MODE (0x3 << 28) // (HDMA_CH) Type of addressing mode #define AT91C_HDMA_DST_ADDRESS_MODE_INCR (0x0 << 28) // (HDMA_CH) Incrementing Mode. #define AT91C_HDMA_DST_ADDRESS_MODE_DECR (0x1 << 28) // (HDMA_CH) Decrementing Mode. #define AT91C_HDMA_DST_ADDRESS_MODE_FIXED (0x2 << 28) // (HDMA_CH) Fixed Mode. #define AT91C_HDMA_IEN (0x1 << 30) // (HDMA_CH) buffer transfer completed // -------- HDMA_CFG : (HDMA_CH Offset: 0x14) -------- #define AT91C_HDMA_SRC_PER (0xF << 0) // (HDMA_CH) Channel Source Request is associated with peripheral identifier coded SRC_PER handshaking interface. #define AT91C_HDMA_SRC_PER_0 (0x0) // (HDMA_CH) HW Handshaking Interface number 0. #define AT91C_HDMA_SRC_PER_1 (0x1) // (HDMA_CH) HW Handshaking Interface number 1. #define AT91C_HDMA_SRC_PER_2 (0x2) // (HDMA_CH) HW Handshaking Interface number 2. #define AT91C_HDMA_SRC_PER_3 (0x3) // (HDMA_CH) HW Handshaking Interface number 3. #define AT91C_HDMA_SRC_PER_4 (0x4) // (HDMA_CH) HW Handshaking Interface number 4. #define AT91C_HDMA_SRC_PER_5 (0x5) // (HDMA_CH) HW Handshaking Interface number 5. #define AT91C_HDMA_SRC_PER_6 (0x6) // (HDMA_CH) HW Handshaking Interface number 6. #define AT91C_HDMA_SRC_PER_7 (0x7) // (HDMA_CH) HW Handshaking Interface number 7. #define AT91C_HDMA_DST_PER (0xF << 4) // (HDMA_CH) Channel Destination Request is associated with peripheral identifier coded DST_PER handshaking interface. #define AT91C_HDMA_DST_PER_0 (0x0 << 4) // (HDMA_CH) HW Handshaking Interface number 0. #define AT91C_HDMA_DST_PER_1 (0x1 << 4) // (HDMA_CH) HW Handshaking Interface number 1. #define AT91C_HDMA_DST_PER_2 (0x2 << 4) // (HDMA_CH) HW Handshaking Interface number 2. #define AT91C_HDMA_DST_PER_3 (0x3 << 4) // (HDMA_CH) HW Handshaking Interface number 3. #define AT91C_HDMA_DST_PER_4 (0x4 << 4) // (HDMA_CH) HW Handshaking Interface number 4. #define AT91C_HDMA_DST_PER_5 (0x5 << 4) // (HDMA_CH) HW Handshaking Interface number 5. #define AT91C_HDMA_DST_PER_6 (0x6 << 4) // (HDMA_CH) HW Handshaking Interface number 6. #define AT91C_HDMA_DST_PER_7 (0x7 << 4) // (HDMA_CH) HW Handshaking Interface number 7. #define AT91C_HDMA_SRC_H2SEL (0x1 << 9) // (HDMA_CH) Source Handshaking Mode #define AT91C_HDMA_SRC_H2SEL_SW (0x0 << 9) // (HDMA_CH) Software handshaking interface is used to trigger a transfer request. #define AT91C_HDMA_SRC_H2SEL_HW (0x1 << 9) // (HDMA_CH) Hardware handshaking interface is used to trigger a transfer request. #define AT91C_HDMA_DST_H2SEL (0x1 << 13) // (HDMA_CH) Destination Handshaking Mode #define AT91C_HDMA_DST_H2SEL_SW (0x0 << 13) // (HDMA_CH) Software handshaking interface is used to trigger a transfer request. #define AT91C_HDMA_DST_H2SEL_HW (0x1 << 13) // (HDMA_CH) Hardware handshaking interface is used to trigger a transfer request. #define AT91C_HDMA_SOD (0x1 << 16) // (HDMA_CH) STOP ON DONE #define AT91C_HDMA_SOD_DISABLE (0x0 << 16) // (HDMA_CH) STOP ON DONE disabled, the descriptor fetch operation ignores DONE Field of CTRLA register. #define AT91C_HDMA_SOD_ENABLE (0x1 << 16) // (HDMA_CH) STOP ON DONE activated, the DMAC module is automatically disabled if DONE FIELD is set to 1. #define AT91C_HDMA_LOCK_IF (0x1 << 20) // (HDMA_CH) Interface Lock #define AT91C_HDMA_LOCK_IF_DISABLE (0x0 << 20) // (HDMA_CH) Interface Lock capability is disabled. #define AT91C_HDMA_LOCK_IF_ENABLE (0x1 << 20) // (HDMA_CH) Interface Lock capability is enabled. #define AT91C_HDMA_LOCK_B (0x1 << 21) // (HDMA_CH) AHB Bus Lock #define AT91C_HDMA_LOCK_B_DISABLE (0x0 << 21) // (HDMA_CH) AHB Bus Locking capability is disabled. #define AT91C_HDMA_LOCK_B_ENABLE (0x1 << 21) // (HDMA_CH) AHB Bus Locking capability is enabled. #define AT91C_HDMA_LOCK_IF_L (0x1 << 22) // (HDMA_CH) Master Interface Arbiter Lock #define AT91C_HDMA_LOCK_IF_L_CHUNK (0x0 << 22) // (HDMA_CH) The Master Interface Arbiter is locked by the channel x for a chunk transfer. #define AT91C_HDMA_LOCK_IF_L_BUFFER (0x1 << 22) // (HDMA_CH) The Master Interface Arbiter is locked by the channel x for a buffer transfer. #define AT91C_HDMA_AHB_PROT (0x7 << 24) // (HDMA_CH) AHB Prot #define AT91C_HDMA_FIFOCFG (0x3 << 28) // (HDMA_CH) FIFO Request Configuration #define AT91C_HDMA_FIFOCFG_LARGESTBURST (0x0 << 28) // (HDMA_CH) The largest defined length AHB burst is performed on the destination AHB interface. #define AT91C_HDMA_FIFOCFG_HALFFIFO (0x1 << 28) // (HDMA_CH) When half fifo size is available/filled a source/destination request is serviced. #define AT91C_HDMA_FIFOCFG_ENOUGHSPACE (0x2 << 28) // (HDMA_CH) When there is enough space/data available to perfom a single AHB access then the request is serviced. // ***************************************************************************** // SOFTWARE API DEFINITION FOR HDMA controller // ***************************************************************************** #ifndef __ASSEMBLY__ typedef struct _AT91S_HDMA { AT91_REG HDMA_GCFG; // HDMA Global Configuration Register AT91_REG HDMA_EN; // HDMA Controller Enable Register AT91_REG HDMA_SREQ; // HDMA Software Single Request Register AT91_REG HDMA_CREQ; // HDMA Software Chunk Transfer Request Register AT91_REG HDMA_LAST; // HDMA Software Last Transfer Flag Register AT91_REG Reserved0[1]; // AT91_REG HDMA_EBCIER; // HDMA Error, Chained Buffer transfer completed and Buffer transfer completed Interrupt Enable register AT91_REG HDMA_EBCIDR; // HDMA Error, Chained Buffer transfer completed and Buffer transfer completed Interrupt Disable register AT91_REG HDMA_EBCIMR; // HDMA Error, Chained Buffer transfer completed and Buffer transfer completed Mask Register AT91_REG HDMA_EBCISR; // HDMA Error, Chained Buffer transfer completed and Buffer transfer completed Status Register AT91_REG HDMA_CHER; // HDMA Channel Handler Enable Register AT91_REG HDMA_CHDR; // HDMA Channel Handler Disable Register AT91_REG HDMA_CHSR; // HDMA Channel Handler Status Register AT91_REG Reserved1[2]; // AT91S_HDMA_CH HDMA_CH[4]; // HDMA Channel structure AT91_REG Reserved2[68]; // AT91_REG HDMA_ADDRSIZE; // HDMA ADDRSIZE REGISTER AT91_REG HDMA_IPNAME1; // HDMA IPNAME1 REGISTER AT91_REG HDMA_IPNAME2; // HDMA IPNAME2 REGISTER AT91_REG HDMA_FEATURES; // HDMA FEATURES REGISTER AT91_REG HDMA_VER; // HDMA VERSION REGISTER } AT91S_HDMA, *AT91PS_HDMA; #else #define HDMA_GCFG (AT91_CAST(AT91_REG *) 0x00000000) // (HDMA_GCFG) HDMA Global Configuration Register #define HDMA_EN (AT91_CAST(AT91_REG *) 0x00000004) // (HDMA_EN) HDMA Controller Enable Register #define HDMA_SREQ (AT91_CAST(AT91_REG *) 0x00000008) // (HDMA_SREQ) HDMA Software Single Request Register #define HDMA_CREQ (AT91_CAST(AT91_REG *) 0x0000000C) // (HDMA_CREQ) HDMA Software Chunk Transfer Request Register #define HDMA_LAST (AT91_CAST(AT91_REG *) 0x00000010) // (HDMA_LAST) HDMA Software Last Transfer Flag Register #define HDMA_EBCIER (AT91_CAST(AT91_REG *) 0x00000018) // (HDMA_EBCIER) HDMA Error, Chained Buffer transfer completed and Buffer transfer completed Interrupt Enable register #define HDMA_EBCIDR (AT91_CAST(AT91_REG *) 0x0000001C) // (HDMA_EBCIDR) HDMA Error, Chained Buffer transfer completed and Buffer transfer completed Interrupt Disable register #define HDMA_EBCIMR (AT91_CAST(AT91_REG *) 0x00000020) // (HDMA_EBCIMR) HDMA Error, Chained Buffer transfer completed and Buffer transfer completed Mask Register #define HDMA_EBCISR (AT91_CAST(AT91_REG *) 0x00000024) // (HDMA_EBCISR) HDMA Error, Chained Buffer transfer completed and Buffer transfer completed Status Register #define HDMA_CHER (AT91_CAST(AT91_REG *) 0x00000028) // (HDMA_CHER) HDMA Channel Handler Enable Register #define HDMA_CHDR (AT91_CAST(AT91_REG *) 0x0000002C) // (HDMA_CHDR) HDMA Channel Handler Disable Register #define HDMA_CHSR (AT91_CAST(AT91_REG *) 0x00000030) // (HDMA_CHSR) HDMA Channel Handler Status Register #define HDMA_ADDRSIZE (AT91_CAST(AT91_REG *) 0x000001EC) // (HDMA_ADDRSIZE) HDMA ADDRSIZE REGISTER #define HDMA_IPNAME1 (AT91_CAST(AT91_REG *) 0x000001F0) // (HDMA_IPNAME1) HDMA IPNAME1 REGISTER #define HDMA_IPNAME2 (AT91_CAST(AT91_REG *) 0x000001F4) // (HDMA_IPNAME2) HDMA IPNAME2 REGISTER #define HDMA_FEATURES (AT91_CAST(AT91_REG *) 0x000001F8) // (HDMA_FEATURES) HDMA FEATURES REGISTER #define HDMA_VER (AT91_CAST(AT91_REG *) 0x000001FC) // (HDMA_VER) HDMA VERSION REGISTER #endif // -------- HDMA_GCFG : (HDMA Offset: 0x0) -------- #define AT91C_HDMA_ARB_CFG (0x1 << 4) // (HDMA) Arbiter mode. #define AT91C_HDMA_ARB_CFG_FIXED (0x0 << 4) // (HDMA) Fixed priority arbiter. #define AT91C_HDMA_ARB_CFG_ROUND_ROBIN (0x1 << 4) // (HDMA) Modified round robin arbiter. // -------- HDMA_EN : (HDMA Offset: 0x4) -------- #define AT91C_HDMA_ENABLE (0x1 << 0) // (HDMA) #define AT91C_HDMA_ENABLE_DISABLE (0x0) // (HDMA) Disables HDMA. #define AT91C_HDMA_ENABLE_ENABLE (0x1) // (HDMA) Enables HDMA. // -------- HDMA_SREQ : (HDMA Offset: 0x8) -------- #define AT91C_HDMA_SSREQ0 (0x1 << 0) // (HDMA) Request a source single transfer on channel 0 #define AT91C_HDMA_SSREQ0_0 (0x0) // (HDMA) No effect. #define AT91C_HDMA_SSREQ0_1 (0x1) // (HDMA) Request a source single transfer on channel 0. #define AT91C_HDMA_DSREQ0 (0x1 << 1) // (HDMA) Request a destination single transfer on channel 0 #define AT91C_HDMA_DSREQ0_0 (0x0 << 1) // (HDMA) No effect. #define AT91C_HDMA_DSREQ0_1 (0x1 << 1) // (HDMA) Request a destination single transfer on channel 0. #define AT91C_HDMA_SSREQ1 (0x1 << 2) // (HDMA) Request a source single transfer on channel 1 #define AT91C_HDMA_SSREQ1_0 (0x0 << 2) // (HDMA) No effect. #define AT91C_HDMA_SSREQ1_1 (0x1 << 2) // (HDMA) Request a source single transfer on channel 1. #define AT91C_HDMA_DSREQ1 (0x1 << 3) // (HDMA) Request a destination single transfer on channel 1 #define AT91C_HDMA_DSREQ1_0 (0x0 << 3) // (HDMA) No effect. #define AT91C_HDMA_DSREQ1_1 (0x1 << 3) // (HDMA) Request a destination single transfer on channel 1. #define AT91C_HDMA_SSREQ2 (0x1 << 4) // (HDMA) Request a source single transfer on channel 2 #define AT91C_HDMA_SSREQ2_0 (0x0 << 4) // (HDMA) No effect. #define AT91C_HDMA_SSREQ2_1 (0x1 << 4) // (HDMA) Request a source single transfer on channel 2. #define AT91C_HDMA_DSREQ2 (0x1 << 5) // (HDMA) Request a destination single transfer on channel 2 #define AT91C_HDMA_DSREQ2_0 (0x0 << 5) // (HDMA) No effect. #define AT91C_HDMA_DSREQ2_1 (0x1 << 5) // (HDMA) Request a destination single transfer on channel 2. #define AT91C_HDMA_SSREQ3 (0x1 << 6) // (HDMA) Request a source single transfer on channel 3 #define AT91C_HDMA_SSREQ3_0 (0x0 << 6) // (HDMA) No effect. #define AT91C_HDMA_SSREQ3_1 (0x1 << 6) // (HDMA) Request a source single transfer on channel 3. #define AT91C_HDMA_DSREQ3 (0x1 << 7) // (HDMA) Request a destination single transfer on channel 3 #define AT91C_HDMA_DSREQ3_0 (0x0 << 7) // (HDMA) No effect. #define AT91C_HDMA_DSREQ3_1 (0x1 << 7) // (HDMA) Request a destination single transfer on channel 3. // -------- HDMA_CREQ : (HDMA Offset: 0xc) -------- #define AT91C_HDMA_SCREQ0 (0x1 << 0) // (HDMA) Request a source chunk transfer on channel 0 #define AT91C_HDMA_SCREQ0_0 (0x0) // (HDMA) No effect. #define AT91C_HDMA_SCREQ0_1 (0x1) // (HDMA) Request a source chunk transfer on channel 0. #define AT91C_HDMA_DCREQ0 (0x1 << 1) // (HDMA) Request a destination chunk transfer on channel 0 #define AT91C_HDMA_DCREQ0_0 (0x0 << 1) // (HDMA) No effect. #define AT91C_HDMA_DCREQ0_1 (0x1 << 1) // (HDMA) Request a destination chunk transfer on channel 0. #define AT91C_HDMA_SCREQ1 (0x1 << 2) // (HDMA) Request a source chunk transfer on channel 1 #define AT91C_HDMA_SCREQ1_0 (0x0 << 2) // (HDMA) No effect. #define AT91C_HDMA_SCREQ1_1 (0x1 << 2) // (HDMA) Request a source chunk transfer on channel 1. #define AT91C_HDMA_DCREQ1 (0x1 << 3) // (HDMA) Request a destination chunk transfer on channel 1 #define AT91C_HDMA_DCREQ1_0 (0x0 << 3) // (HDMA) No effect. #define AT91C_HDMA_DCREQ1_1 (0x1 << 3) // (HDMA) Request a destination chunk transfer on channel 1. #define AT91C_HDMA_SCREQ2 (0x1 << 4) // (HDMA) Request a source chunk transfer on channel 2 #define AT91C_HDMA_SCREQ2_0 (0x0 << 4) // (HDMA) No effect. #define AT91C_HDMA_SCREQ2_1 (0x1 << 4) // (HDMA) Request a source chunk transfer on channel 2. #define AT91C_HDMA_DCREQ2 (0x1 << 5) // (HDMA) Request a destination chunk transfer on channel 2 #define AT91C_HDMA_DCREQ2_0 (0x0 << 5) // (HDMA) No effect. #define AT91C_HDMA_DCREQ2_1 (0x1 << 5) // (HDMA) Request a destination chunk transfer on channel 2. #define AT91C_HDMA_SCREQ3 (0x1 << 6) // (HDMA) Request a source chunk transfer on channel 3 #define AT91C_HDMA_SCREQ3_0 (0x0 << 6) // (HDMA) No effect. #define AT91C_HDMA_SCREQ3_1 (0x1 << 6) // (HDMA) Request a source chunk transfer on channel 3. #define AT91C_HDMA_DCREQ3 (0x1 << 7) // (HDMA) Request a destination chunk transfer on channel 3 #define AT91C_HDMA_DCREQ3_0 (0x0 << 7) // (HDMA) No effect. #define AT91C_HDMA_DCREQ3_1 (0x1 << 7) // (HDMA) Request a destination chunk transfer on channel 3. // -------- HDMA_LAST : (HDMA Offset: 0x10) -------- #define AT91C_HDMA_SLAST0 (0x1 << 0) // (HDMA) Indicates that this source request is the last transfer of the buffer on channel 0 #define AT91C_HDMA_SLAST0_0 (0x0) // (HDMA) No effect. #define AT91C_HDMA_SLAST0_1 (0x1) // (HDMA) Writing one to SLASTx prior to writing one to SSREQx or SCREQx indicates that this source request is the last transfer of the buffer on channel 0. #define AT91C_HDMA_DLAST0 (0x1 << 1) // (HDMA) Indicates that this destination request is the last transfer of the buffer on channel 0 #define AT91C_HDMA_DLAST0_0 (0x0 << 1) // (HDMA) No effect. #define AT91C_HDMA_DLAST0_1 (0x1 << 1) // (HDMA) Writing one to DLASTx prior to writing one to DSREQx or DCREQx indicates that this destination request is the last transfer of the buffer on channel 0. #define AT91C_HDMA_SLAST1 (0x1 << 2) // (HDMA) Indicates that this source request is the last transfer of the buffer on channel 1 #define AT91C_HDMA_SLAST1_0 (0x0 << 2) // (HDMA) No effect. #define AT91C_HDMA_SLAST1_1 (0x1 << 2) // (HDMA) Writing one to SLASTx prior to writing one to SSREQx or SCREQx indicates that this source request is the last transfer of the buffer on channel 1. #define AT91C_HDMA_DLAST1 (0x1 << 3) // (HDMA) Indicates that this destination request is the last transfer of the buffer on channel 1 #define AT91C_HDMA_DLAST1_0 (0x0 << 3) // (HDMA) No effect. #define AT91C_HDMA_DLAST1_1 (0x1 << 3) // (HDMA) Writing one to DLASTx prior to writing one to DSREQx or DCREQx indicates that this destination request is the last transfer of the buffer on channel 1. #define AT91C_HDMA_SLAST2 (0x1 << 4) // (HDMA) Indicates that this source request is the last transfer of the buffer on channel 2 #define AT91C_HDMA_SLAST2_0 (0x0 << 4) // (HDMA) No effect. #define AT91C_HDMA_SLAST2_1 (0x1 << 4) // (HDMA) Writing one to SLASTx prior to writing one to SSREQx or SCREQx indicates that this source request is the last transfer of the buffer on channel 2. #define AT91C_HDMA_DLAST2 (0x1 << 5) // (HDMA) Indicates that this destination request is the last transfer of the buffer on channel 2 #define AT91C_HDMA_DLAST2_0 (0x0 << 5) // (HDMA) No effect. #define AT91C_HDMA_DLAST2_1 (0x1 << 5) // (HDMA) Writing one to DLASTx prior to writing one to DSREQx or DCREQx indicates that this destination request is the last transfer of the buffer on channel 2. #define AT91C_HDMA_SLAST3 (0x1 << 6) // (HDMA) Indicates that this source request is the last transfer of the buffer on channel 3 #define AT91C_HDMA_SLAST3_0 (0x0 << 6) // (HDMA) No effect. #define AT91C_HDMA_SLAST3_1 (0x1 << 6) // (HDMA) Writing one to SLASTx prior to writing one to SSREQx or SCREQx indicates that this source request is the last transfer of the buffer on channel 3. #define AT91C_HDMA_DLAST3 (0x1 << 7) // (HDMA) Indicates that this destination request is the last transfer of the buffer on channel 3 #define AT91C_HDMA_DLAST3_0 (0x0 << 7) // (HDMA) No effect. #define AT91C_HDMA_DLAST3_1 (0x1 << 7) // (HDMA) Writing one to DLASTx prior to writing one to DSREQx or DCREQx indicates that this destination request is the last transfer of the buffer on channel 3. // -------- HDMA_EBCIER : (HDMA Offset: 0x18) Buffer Transfer Completed/Chained Buffer Transfer Completed/Access Error Interrupt Enable Register -------- #define AT91C_HDMA_BTC0 (0x1 << 0) // (HDMA) Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_BTC1 (0x1 << 1) // (HDMA) Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_BTC2 (0x1 << 2) // (HDMA) Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_BTC3 (0x1 << 3) // (HDMA) Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_BTC4 (0x1 << 4) // (HDMA) Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_BTC5 (0x1 << 5) // (HDMA) Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_BTC6 (0x1 << 6) // (HDMA) Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_BTC7 (0x1 << 7) // (HDMA) Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_CBTC0 (0x1 << 8) // (HDMA) Chained Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_CBTC1 (0x1 << 9) // (HDMA) Chained Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_CBTC2 (0x1 << 10) // (HDMA) Chained Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_CBTC3 (0x1 << 11) // (HDMA) Chained Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_CBTC4 (0x1 << 12) // (HDMA) Chained Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_CBTC5 (0x1 << 13) // (HDMA) Chained Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_CBTC6 (0x1 << 14) // (HDMA) Chained Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_CBTC7 (0x1 << 15) // (HDMA) Chained Buffer Transfer Completed Interrupt Enable/Disable/Status Register #define AT91C_HDMA_ERR0 (0x1 << 16) // (HDMA) Access HDMA_Error Interrupt Enable/Disable/Status Register #define AT91C_HDMA_ERR1 (0x1 << 17) // (HDMA) Access HDMA_Error Interrupt Enable/Disable/Status Register #define AT91C_HDMA_ERR2 (0x1 << 18) // (HDMA) Access HDMA_Error Interrupt Enable/Disable/Status Register #define AT91C_HDMA_ERR3 (0x1 << 19) // (HDMA) Access HDMA_Error Interrupt Enable/Disable/Status Register #define AT91C_HDMA_ERR4 (0x1 << 20) // (HDMA) Access HDMA_Error Interrupt Enable/Disable/Status Register #define AT91C_HDMA_ERR5 (0x1 << 21) // (HDMA) Access HDMA_Error Interrupt Enable/Disable/Status Register #define AT91C_HDMA_ERR6 (0x1 << 22) // (HDMA) Access HDMA_Error Interrupt Enable/Disable/Status Register #define AT91C_HDMA_ERR7 (0x1 << 23) // (HDMA) Access HDMA_Error Interrupt Enable/Disable/Status Register // -------- HDMA_EBCIDR : (HDMA Offset: 0x1c) -------- // -------- HDMA_EBCIMR : (HDMA Offset: 0x20) -------- // -------- HDMA_EBCISR : (HDMA Offset: 0x24) -------- // -------- HDMA_CHER : (HDMA Offset: 0x28) -------- #define AT91C_HDMA_ENA0 (0x1 << 0) // (HDMA) When set, channel 0 enabled. #define AT91C_HDMA_ENA0_0 (0x0) // (HDMA) No effect. #define AT91C_HDMA_ENA0_1 (0x1) // (HDMA) Channel 0 enabled. #define AT91C_HDMA_ENA1 (0x1 << 1) // (HDMA) When set, channel 1 enabled. #define AT91C_HDMA_ENA1_0 (0x0 << 1) // (HDMA) No effect. #define AT91C_HDMA_ENA1_1 (0x1 << 1) // (HDMA) Channel 1 enabled. #define AT91C_HDMA_ENA2 (0x1 << 2) // (HDMA) When set, channel 2 enabled. #define AT91C_HDMA_ENA2_0 (0x0 << 2) // (HDMA) No effect. #define AT91C_HDMA_ENA2_1 (0x1 << 2) // (HDMA) Channel 2 enabled. #define AT91C_HDMA_ENA3 (0x1 << 3) // (HDMA) When set, channel 3 enabled. #define AT91C_HDMA_ENA3_0 (0x0 << 3) // (HDMA) No effect. #define AT91C_HDMA_ENA3_1 (0x1 << 3) // (HDMA) Channel 3 enabled. #define AT91C_HDMA_ENA4 (0x1 << 4) // (HDMA) When set, channel 4 enabled. #define AT91C_HDMA_ENA4_0 (0x0 << 4) // (HDMA) No effect. #define AT91C_HDMA_ENA4_1 (0x1 << 4) // (HDMA) Channel 4 enabled. #define AT91C_HDMA_ENA5 (0x1 << 5) // (HDMA) When set, channel 5 enabled. #define AT91C_HDMA_ENA5_0 (0x0 << 5) // (HDMA) No effect. #define AT91C_HDMA_ENA5_1 (0x1 << 5) // (HDMA) Channel 5 enabled. #define AT91C_HDMA_ENA6 (0x1 << 6) // (HDMA) When set, channel 6 enabled. #define AT91C_HDMA_ENA6_0 (0x0 << 6) // (HDMA) No effect. #define AT91C_HDMA_ENA6_1 (0x1 << 6) // (HDMA) Channel 6 enabled. #define AT91C_HDMA_ENA7 (0x1 << 7) // (HDMA) When set, channel 7 enabled. #define AT91C_HDMA_ENA7_0 (0x0 << 7) // (HDMA) No effect. #define AT91C_HDMA_ENA7_1 (0x1 << 7) // (HDMA) Channel 7 enabled. #define AT91C_HDMA_SUSP0 (0x1 << 8) // (HDMA) When set, channel 0 freezed and its current context. #define AT91C_HDMA_SUSP0_0 (0x0 << 8) // (HDMA) No effect. #define AT91C_HDMA_SUSP0_1 (0x1 << 8) // (HDMA) Channel 0 freezed. #define AT91C_HDMA_SUSP1 (0x1 << 9) // (HDMA) When set, channel 1 freezed and its current context. #define AT91C_HDMA_SUSP1_0 (0x0 << 9) // (HDMA) No effect. #define AT91C_HDMA_SUSP1_1 (0x1 << 9) // (HDMA) Channel 1 freezed. #define AT91C_HDMA_SUSP2 (0x1 << 10) // (HDMA) When set, channel 2 freezed and its current context. #define AT91C_HDMA_SUSP2_0 (0x0 << 10) // (HDMA) No effect. #define AT91C_HDMA_SUSP2_1 (0x1 << 10) // (HDMA) Channel 2 freezed. #define AT91C_HDMA_SUSP3 (0x1 << 11) // (HDMA) When set, channel 3 freezed and its current context. #define AT91C_HDMA_SUSP3_0 (0x0 << 11) // (HDMA) No effect. #define AT91C_HDMA_SUSP3_1 (0x1 << 11) // (HDMA) Channel 3 freezed. #define AT91C_HDMA_SUSP4 (0x1 << 12) // (HDMA) When set, channel 4 freezed and its current context. #define AT91C_HDMA_SUSP4_0 (0x0 << 12) // (HDMA) No effect. #define AT91C_HDMA_SUSP4_1 (0x1 << 12) // (HDMA) Channel 4 freezed. #define AT91C_HDMA_SUSP5 (0x1 << 13) // (HDMA) When set, channel 5 freezed and its current context. #define AT91C_HDMA_SUSP5_0 (0x0 << 13) // (HDMA) No effect. #define AT91C_HDMA_SUSP5_1 (0x1 << 13) // (HDMA) Channel 5 freezed. #define AT91C_HDMA_SUSP6 (0x1 << 14) // (HDMA) When set, channel 6 freezed and its current context. #define AT91C_HDMA_SUSP6_0 (0x0 << 14) // (HDMA) No effect. #define AT91C_HDMA_SUSP6_1 (0x1 << 14) // (HDMA) Channel 6 freezed. #define AT91C_HDMA_SUSP7 (0x1 << 15) // (HDMA) When set, channel 7 freezed and its current context. #define AT91C_HDMA_SUSP7_0 (0x0 << 15) // (HDMA) No effect. #define AT91C_HDMA_SUSP7_1 (0x1 << 15) // (HDMA) Channel 7 freezed. #define AT91C_HDMA_KEEP0 (0x1 << 24) // (HDMA) When set, it resumes the channel 0 from an automatic stall state. #define AT91C_HDMA_KEEP0_0 (0x0 << 24) // (HDMA) No effect. #define AT91C_HDMA_KEEP0_1 (0x1 << 24) // (HDMA) Resumes the channel 0. #define AT91C_HDMA_KEEP1 (0x1 << 25) // (HDMA) When set, it resumes the channel 1 from an automatic stall state. #define AT91C_HDMA_KEEP1_0 (0x0 << 25) // (HDMA) No effect. #define AT91C_HDMA_KEEP1_1 (0x1 << 25) // (HDMA) Resumes the channel 1. #define AT91C_HDMA_KEEP2 (0x1 << 26) // (HDMA) When set, it resumes the channel 2 from an automatic stall state. #define AT91C_HDMA_KEEP2_0 (0x0 << 26) // (HDMA) No effect. #define AT91C_HDMA_KEEP2_1 (0x1 << 26) // (HDMA) Resumes the channel 2. #define AT91C_HDMA_KEEP3 (0x1 << 27) // (HDMA) When set, it resumes the channel 3 from an automatic stall state. #define AT91C_HDMA_KEEP3_0 (0x0 << 27) // (HDMA) No effect. #define AT91C_HDMA_KEEP3_1 (0x1 << 27) // (HDMA) Resumes the channel 3. #define AT91C_HDMA_KEEP4 (0x1 << 28) // (HDMA) When set, it resumes the channel 4 from an automatic stall state. #define AT91C_HDMA_KEEP4_0 (0x0 << 28) // (HDMA) No effect. #define AT91C_HDMA_KEEP4_1 (0x1 << 28) // (HDMA) Resumes the channel 4. #define AT91C_HDMA_KEEP5 (0x1 << 29) // (HDMA) When set, it resumes the channel 5 from an automatic stall state. #define AT91C_HDMA_KEEP5_0 (0x0 << 29) // (HDMA) No effect. #define AT91C_HDMA_KEEP5_1 (0x1 << 29) // (HDMA) Resumes the channel 5. #define AT91C_HDMA_KEEP6 (0x1 << 30) // (HDMA) When set, it resumes the channel 6 from an automatic stall state. #define AT91C_HDMA_KEEP6_0 (0x0 << 30) // (HDMA) No effect. #define AT91C_HDMA_KEEP6_1 (0x1 << 30) // (HDMA) Resumes the channel 6. #define AT91C_HDMA_KEEP7 (0x1 << 31) // (HDMA) When set, it resumes the channel 7 from an automatic stall state. #define AT91C_HDMA_KEEP7_0 (0x0 << 31) // (HDMA) No effect. #define AT91C_HDMA_KEEP7_1 (0x1 << 31) // (HDMA) Resumes the channel 7. // -------- HDMA_CHDR : (HDMA Offset: 0x2c) -------- #define AT91C_HDMA_DIS0 (0x1 << 0) // (HDMA) Write one to this field to disable the channel 0. #define AT91C_HDMA_DIS0_0 (0x0) // (HDMA) No effect. #define AT91C_HDMA_DIS0_1 (0x1) // (HDMA) Disables the channel 0. #define AT91C_HDMA_DIS1 (0x1 << 1) // (HDMA) Write one to this field to disable the channel 1. #define AT91C_HDMA_DIS1_0 (0x0 << 1) // (HDMA) No effect. #define AT91C_HDMA_DIS1_1 (0x1 << 1) // (HDMA) Disables the channel 1. #define AT91C_HDMA_DIS2 (0x1 << 2) // (HDMA) Write one to this field to disable the channel 2. #define AT91C_HDMA_DIS2_0 (0x0 << 2) // (HDMA) No effect. #define AT91C_HDMA_DIS2_1 (0x1 << 2) // (HDMA) Disables the channel 2. #define AT91C_HDMA_DIS3 (0x1 << 3) // (HDMA) Write one to this field to disable the channel 3. #define AT91C_HDMA_DIS3_0 (0x0 << 3) // (HDMA) No effect. #define AT91C_HDMA_DIS3_1 (0x1 << 3) // (HDMA) Disables the channel 3. #define AT91C_HDMA_DIS4 (0x1 << 4) // (HDMA) Write one to this field to disable the channel 4. #define AT91C_HDMA_DIS4_0 (0x0 << 4) // (HDMA) No effect. #define AT91C_HDMA_DIS4_1 (0x1 << 4) // (HDMA) Disables the channel 4. #define AT91C_HDMA_DIS5 (0x1 << 5) // (HDMA) Write one to this field to disable the channel 5. #define AT91C_HDMA_DIS5_0 (0x0 << 5) // (HDMA) No effect. #define AT91C_HDMA_DIS5_1 (0x1 << 5) // (HDMA) Disables the channel 5. #define AT91C_HDMA_DIS6 (0x1 << 6) // (HDMA) Write one to this field to disable the channel 6. #define AT91C_HDMA_DIS6_0 (0x0 << 6) // (HDMA) No effect. #define AT91C_HDMA_DIS6_1 (0x1 << 6) // (HDMA) Disables the channel 6. #define AT91C_HDMA_DIS7 (0x1 << 7) // (HDMA) Write one to this field to disable the channel 7. #define AT91C_HDMA_DIS7_0 (0x0 << 7) // (HDMA) No effect. #define AT91C_HDMA_DIS7_1 (0x1 << 7) // (HDMA) Disables the channel 7. #define AT91C_HDMA_RES0 (0x1 << 8) // (HDMA) Write one to this field to resume the channel 0 transfer restoring its context. #define AT91C_HDMA_RES0_0 (0x0 << 8) // (HDMA) No effect. #define AT91C_HDMA_RES0_1 (0x1 << 8) // (HDMA) Resumes the channel 0. #define AT91C_HDMA_RES1 (0x1 << 9) // (HDMA) Write one to this field to resume the channel 1 transfer restoring its context. #define AT91C_HDMA_RES1_0 (0x0 << 9) // (HDMA) No effect. #define AT91C_HDMA_RES1_1 (0x1 << 9) // (HDMA) Resumes the channel 1. #define AT91C_HDMA_RES2 (0x1 << 10) // (HDMA) Write one to this field to resume the channel 2 transfer restoring its context. #define AT91C_HDMA_RES2_0 (0x0 << 10) // (HDMA) No effect. #define AT91C_HDMA_RES2_1 (0x1 << 10) // (HDMA) Resumes the channel 2. #define AT91C_HDMA_RES3 (0x1 << 11) // (HDMA) Write one to this field to resume the channel 3 transfer restoring its context. #define AT91C_HDMA_RES3_0 (0x0 << 11) // (HDMA) No effect. #define AT91C_HDMA_RES3_1 (0x1 << 11) // (HDMA) Resumes the channel 3. #define AT91C_HDMA_RES4 (0x1 << 12) // (HDMA) Write one to this field to resume the channel 4 transfer restoring its context. #define AT91C_HDMA_RES4_0 (0x0 << 12) // (HDMA) No effect. #define AT91C_HDMA_RES4_1 (0x1 << 12) // (HDMA) Resumes the channel 4. #define AT91C_HDMA_RES5 (0x1 << 13) // (HDMA) Write one to this field to resume the channel 5 transfer restoring its context. #define AT91C_HDMA_RES5_0 (0x0 << 13) // (HDMA) No effect. #define AT91C_HDMA_RES5_1 (0x1 << 13) // (HDMA) Resumes the channel 5. #define AT91C_HDMA_RES6 (0x1 << 14) // (HDMA) Write one to this field to resume the channel 6 transfer restoring its context. #define AT91C_HDMA_RES6_0 (0x0 << 14) // (HDMA) No effect. #define AT91C_HDMA_RES6_1 (0x1 << 14) // (HDMA) Resumes the channel 6. #define AT91C_HDMA_RES7 (0x1 << 15) // (HDMA) Write one to this field to resume the channel 7 transfer restoring its context. #define AT91C_HDMA_RES7_0 (0x0 << 15) // (HDMA) No effect. #define AT91C_HDMA_RES7_1 (0x1 << 15) // (HDMA) Resumes the channel 7. // -------- HDMA_CHSR : (HDMA Offset: 0x30) -------- #define AT91C_HDMA_EMPT0 (0x1 << 16) // (HDMA) When set, channel 0 is empty. #define AT91C_HDMA_EMPT0_0 (0x0 << 16) // (HDMA) No effect. #define AT91C_HDMA_EMPT0_1 (0x1 << 16) // (HDMA) Channel 0 empty. #define AT91C_HDMA_EMPT1 (0x1 << 17) // (HDMA) When set, channel 1 is empty. #define AT91C_HDMA_EMPT1_0 (0x0 << 17) // (HDMA) No effect. #define AT91C_HDMA_EMPT1_1 (0x1 << 17) // (HDMA) Channel 1 empty. #define AT91C_HDMA_EMPT2 (0x1 << 18) // (HDMA) When set, channel 2 is empty. #define AT91C_HDMA_EMPT2_0 (0x0 << 18) // (HDMA) No effect. #define AT91C_HDMA_EMPT2_1 (0x1 << 18) // (HDMA) Channel 2 empty. #define AT91C_HDMA_EMPT3 (0x1 << 19) // (HDMA) When set, channel 3 is empty. #define AT91C_HDMA_EMPT3_0 (0x0 << 19) // (HDMA) No effect. #define AT91C_HDMA_EMPT3_1 (0x1 << 19) // (HDMA) Channel 3 empty. #define AT91C_HDMA_EMPT4 (0x1 << 20) // (HDMA) When set, channel 4 is empty. #define AT91C_HDMA_EMPT4_0 (0x0 << 20) // (HDMA) No effect. #define AT91C_HDMA_EMPT4_1 (0x1 << 20) // (HDMA) Channel 4 empty. #define AT91C_HDMA_EMPT5 (0x1 << 21) // (HDMA) When set, channel 5 is empty. #define AT91C_HDMA_EMPT5_0 (0x0 << 21) // (HDMA) No effect. #define AT91C_HDMA_EMPT5_1 (0x1 << 21) // (HDMA) Channel 5 empty. #define AT91C_HDMA_EMPT6 (0x1 << 22) // (HDMA) When set, channel 6 is empty. #define AT91C_HDMA_EMPT6_0 (0x0 << 22) // (HDMA) No effect. #define AT91C_HDMA_EMPT6_1 (0x1 << 22) // (HDMA) Channel 6 empty. #define AT91C_HDMA_EMPT7 (0x1 << 23) // (HDMA) When set, channel 7 is empty. #define AT91C_HDMA_EMPT7_0 (0x0 << 23) // (HDMA) No effect. #define AT91C_HDMA_EMPT7_1 (0x1 << 23) // (HDMA) Channel 7 empty. #define AT91C_HDMA_STAL0 (0x1 << 24) // (HDMA) When set, channel 0 is stalled. #define AT91C_HDMA_STAL0_0 (0x0 << 24) // (HDMA) No effect. #define AT91C_HDMA_STAL0_1 (0x1 << 24) // (HDMA) Channel 0 stalled. #define AT91C_HDMA_STAL1 (0x1 << 25) // (HDMA) When set, channel 1 is stalled. #define AT91C_HDMA_STAL1_0 (0x0 << 25) // (HDMA) No effect. #define AT91C_HDMA_STAL1_1 (0x1 << 25) // (HDMA) Channel 1 stalled. #define AT91C_HDMA_STAL2 (0x1 << 26) // (HDMA) When set, channel 2 is stalled. #define AT91C_HDMA_STAL2_0 (0x0 << 26) // (HDMA) No effect. #define AT91C_HDMA_STAL2_1 (0x1 << 26) // (HDMA) Channel 2 stalled. #define AT91C_HDMA_STAL3 (0x1 << 27) // (HDMA) When set, channel 3 is stalled. #define AT91C_HDMA_STAL3_0 (0x0 << 27) // (HDMA) No effect. #define AT91C_HDMA_STAL3_1 (0x1 << 27) // (HDMA) Channel 3 stalled. #define AT91C_HDMA_STAL4 (0x1 << 28) // (HDMA) When set, channel 4 is stalled. #define AT91C_HDMA_STAL4_0 (0x0 << 28) // (HDMA) No effect. #define AT91C_HDMA_STAL4_1 (0x1 << 28) // (HDMA) Channel 4 stalled. #define AT91C_HDMA_STAL5 (0x1 << 29) // (HDMA) When set, channel 5 is stalled. #define AT91C_HDMA_STAL5_0 (0x0 << 29) // (HDMA) No effect. #define AT91C_HDMA_STAL5_1 (0x1 << 29) // (HDMA) Channel 5 stalled. #define AT91C_HDMA_STAL6 (0x1 << 30) // (HDMA) When set, channel 6 is stalled. #define AT91C_HDMA_STAL6_0 (0x0 << 30) // (HDMA) No effect. #define AT91C_HDMA_STAL6_1 (0x1 << 30) // (HDMA) Channel 6 stalled. #define AT91C_HDMA_STAL7 (0x1 << 31) // (HDMA) When set, channel 7 is stalled. #define AT91C_HDMA_STAL7_0 (0x0 << 31) // (HDMA) No effect. #define AT91C_HDMA_STAL7_1 (0x1 << 31) // (HDMA) Channel 7 stalled. // -------- HDMA_VER : (HDMA Offset: 0x1fc) -------- // ***************************************************************************** // REGISTER ADDRESS DEFINITION FOR AT91SAM3U4 // ***************************************************************************** // ========== Register definition for SYS peripheral ========== #define AT91C_SYS_GPBR (AT91_CAST(AT91_REG *) 0x400E1290) // (SYS) General Purpose Register // ========== Register definition for HSMC4_CS0 peripheral ========== #define AT91C_CS0_MODE (AT91_CAST(AT91_REG *) 0x400E0080) // (HSMC4_CS0) Mode Register #define AT91C_CS0_PULSE (AT91_CAST(AT91_REG *) 0x400E0074) // (HSMC4_CS0) Pulse Register #define AT91C_CS0_CYCLE (AT91_CAST(AT91_REG *) 0x400E0078) // (HSMC4_CS0) Cycle Register #define AT91C_CS0_TIMINGS (AT91_CAST(AT91_REG *) 0x400E007C) // (HSMC4_CS0) Timmings Register #define AT91C_CS0_SETUP (AT91_CAST(AT91_REG *) 0x400E0070) // (HSMC4_CS0) Setup Register // ========== Register definition for HSMC4_CS1 peripheral ========== #define AT91C_CS1_CYCLE (AT91_CAST(AT91_REG *) 0x400E008C) // (HSMC4_CS1) Cycle Register #define AT91C_CS1_PULSE (AT91_CAST(AT91_REG *) 0x400E0088) // (HSMC4_CS1) Pulse Register #define AT91C_CS1_MODE (AT91_CAST(AT91_REG *) 0x400E0094) // (HSMC4_CS1) Mode Register #define AT91C_CS1_SETUP (AT91_CAST(AT91_REG *) 0x400E0084) // (HSMC4_CS1) Setup Register #define AT91C_CS1_TIMINGS (AT91_CAST(AT91_REG *) 0x400E0090) // (HSMC4_CS1) Timmings Register // ========== Register definition for HSMC4_CS2 peripheral ========== #define AT91C_CS2_PULSE (AT91_CAST(AT91_REG *) 0x400E009C) // (HSMC4_CS2) Pulse Register #define AT91C_CS2_TIMINGS (AT91_CAST(AT91_REG *) 0x400E00A4) // (HSMC4_CS2) Timmings Register #define AT91C_CS2_CYCLE (AT91_CAST(AT91_REG *) 0x400E00A0) // (HSMC4_CS2) Cycle Register #define AT91C_CS2_MODE (AT91_CAST(AT91_REG *) 0x400E00A8) // (HSMC4_CS2) Mode Register #define AT91C_CS2_SETUP (AT91_CAST(AT91_REG *) 0x400E0098) // (HSMC4_CS2) Setup Register // ========== Register definition for HSMC4_CS3 peripheral ========== #define AT91C_CS3_MODE (AT91_CAST(AT91_REG *) 0x400E00BC) // (HSMC4_CS3) Mode Register #define AT91C_CS3_TIMINGS (AT91_CAST(AT91_REG *) 0x400E00B8) // (HSMC4_CS3) Timmings Register #define AT91C_CS3_SETUP (AT91_CAST(AT91_REG *) 0x400E00AC) // (HSMC4_CS3) Setup Register #define AT91C_CS3_CYCLE (AT91_CAST(AT91_REG *) 0x400E00B4) // (HSMC4_CS3) Cycle Register #define AT91C_CS3_PULSE (AT91_CAST(AT91_REG *) 0x400E00B0) // (HSMC4_CS3) Pulse Register // ========== Register definition for HSMC4_NFC peripheral ========== #define AT91C_NFC_MODE (AT91_CAST(AT91_REG *) 0x400E010C) // (HSMC4_NFC) Mode Register #define AT91C_NFC_CYCLE (AT91_CAST(AT91_REG *) 0x400E0104) // (HSMC4_NFC) Cycle Register #define AT91C_NFC_PULSE (AT91_CAST(AT91_REG *) 0x400E0100) // (HSMC4_NFC) Pulse Register #define AT91C_NFC_SETUP (AT91_CAST(AT91_REG *) 0x400E00FC) // (HSMC4_NFC) Setup Register #define AT91C_NFC_TIMINGS (AT91_CAST(AT91_REG *) 0x400E0108) // (HSMC4_NFC) Timmings Register // ========== Register definition for HSMC4 peripheral ========== #define AT91C_HSMC4_IPNAME1 (AT91_CAST(AT91_REG *) 0x400E01F0) // (HSMC4) Write Protection Status Register #define AT91C_HSMC4_ECCPR6 (AT91_CAST(AT91_REG *) 0x400E0048) // (HSMC4) ECC Parity register 6 #define AT91C_HSMC4_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400E01EC) // (HSMC4) Write Protection Status Register #define AT91C_HSMC4_ECCPR11 (AT91_CAST(AT91_REG *) 0x400E005C) // (HSMC4) ECC Parity register 11 #define AT91C_HSMC4_SR (AT91_CAST(AT91_REG *) 0x400E0008) // (HSMC4) Status Register #define AT91C_HSMC4_IMR (AT91_CAST(AT91_REG *) 0x400E0014) // (HSMC4) Interrupt Mask Register #define AT91C_HSMC4_WPSR (AT91_CAST(AT91_REG *) 0x400E01E8) // (HSMC4) Write Protection Status Register #define AT91C_HSMC4_BANK (AT91_CAST(AT91_REG *) 0x400E001C) // (HSMC4) Bank Register #define AT91C_HSMC4_ECCPR8 (AT91_CAST(AT91_REG *) 0x400E0050) // (HSMC4) ECC Parity register 8 #define AT91C_HSMC4_WPCR (AT91_CAST(AT91_REG *) 0x400E01E4) // (HSMC4) Write Protection Control register #define AT91C_HSMC4_ECCPR2 (AT91_CAST(AT91_REG *) 0x400E0038) // (HSMC4) ECC Parity register 2 #define AT91C_HSMC4_ECCPR1 (AT91_CAST(AT91_REG *) 0x400E0030) // (HSMC4) ECC Parity register 1 #define AT91C_HSMC4_ECCSR2 (AT91_CAST(AT91_REG *) 0x400E0034) // (HSMC4) ECC Status register 2 #define AT91C_HSMC4_OCMS (AT91_CAST(AT91_REG *) 0x400E0110) // (HSMC4) OCMS MODE register #define AT91C_HSMC4_ECCPR9 (AT91_CAST(AT91_REG *) 0x400E0054) // (HSMC4) ECC Parity register 9 #define AT91C_HSMC4_DUMMY (AT91_CAST(AT91_REG *) 0x400E0200) // (HSMC4) This rtegister was created only ti have AHB constants #define AT91C_HSMC4_ECCPR5 (AT91_CAST(AT91_REG *) 0x400E0044) // (HSMC4) ECC Parity register 5 #define AT91C_HSMC4_ECCCR (AT91_CAST(AT91_REG *) 0x400E0020) // (HSMC4) ECC reset register #define AT91C_HSMC4_KEY2 (AT91_CAST(AT91_REG *) 0x400E0118) // (HSMC4) KEY2 Register #define AT91C_HSMC4_IER (AT91_CAST(AT91_REG *) 0x400E000C) // (HSMC4) Interrupt Enable Register #define AT91C_HSMC4_ECCSR1 (AT91_CAST(AT91_REG *) 0x400E0028) // (HSMC4) ECC Status register 1 #define AT91C_HSMC4_IDR (AT91_CAST(AT91_REG *) 0x400E0010) // (HSMC4) Interrupt Disable Register #define AT91C_HSMC4_ECCPR0 (AT91_CAST(AT91_REG *) 0x400E002C) // (HSMC4) ECC Parity register 0 #define AT91C_HSMC4_FEATURES (AT91_CAST(AT91_REG *) 0x400E01F8) // (HSMC4) Write Protection Status Register #define AT91C_HSMC4_ECCPR7 (AT91_CAST(AT91_REG *) 0x400E004C) // (HSMC4) ECC Parity register 7 #define AT91C_HSMC4_ECCPR12 (AT91_CAST(AT91_REG *) 0x400E0060) // (HSMC4) ECC Parity register 12 #define AT91C_HSMC4_ECCPR10 (AT91_CAST(AT91_REG *) 0x400E0058) // (HSMC4) ECC Parity register 10 #define AT91C_HSMC4_KEY1 (AT91_CAST(AT91_REG *) 0x400E0114) // (HSMC4) KEY1 Register #define AT91C_HSMC4_VER (AT91_CAST(AT91_REG *) 0x400E01FC) // (HSMC4) HSMC4 Version Register #define AT91C_HSMC4_Eccpr15 (AT91_CAST(AT91_REG *) 0x400E006C) // (HSMC4) ECC Parity register 15 #define AT91C_HSMC4_ECCPR4 (AT91_CAST(AT91_REG *) 0x400E0040) // (HSMC4) ECC Parity register 4 #define AT91C_HSMC4_IPNAME2 (AT91_CAST(AT91_REG *) 0x400E01F4) // (HSMC4) Write Protection Status Register #define AT91C_HSMC4_ECCCMD (AT91_CAST(AT91_REG *) 0x400E0024) // (HSMC4) ECC Page size register #define AT91C_HSMC4_ADDR (AT91_CAST(AT91_REG *) 0x400E0018) // (HSMC4) Address Cycle Zero Register #define AT91C_HSMC4_ECCPR3 (AT91_CAST(AT91_REG *) 0x400E003C) // (HSMC4) ECC Parity register 3 #define AT91C_HSMC4_CFG (AT91_CAST(AT91_REG *) 0x400E0000) // (HSMC4) Configuration Register #define AT91C_HSMC4_CTRL (AT91_CAST(AT91_REG *) 0x400E0004) // (HSMC4) Control Register #define AT91C_HSMC4_ECCPR13 (AT91_CAST(AT91_REG *) 0x400E0064) // (HSMC4) ECC Parity register 13 #define AT91C_HSMC4_ECCPR14 (AT91_CAST(AT91_REG *) 0x400E0068) // (HSMC4) ECC Parity register 14 // ========== Register definition for MATRIX peripheral ========== #define AT91C_MATRIX_SFR2 (AT91_CAST(AT91_REG *) 0x400E0318) // (MATRIX) Special Function Register 2 #define AT91C_MATRIX_SFR3 (AT91_CAST(AT91_REG *) 0x400E031C) // (MATRIX) Special Function Register 3 #define AT91C_MATRIX_SCFG8 (AT91_CAST(AT91_REG *) 0x400E0260) // (MATRIX) Slave Configuration Register 8 #define AT91C_MATRIX_MCFG2 (AT91_CAST(AT91_REG *) 0x400E0208) // (MATRIX) Master Configuration Register 2 #define AT91C_MATRIX_MCFG7 (AT91_CAST(AT91_REG *) 0x400E021C) // (MATRIX) Master Configuration Register 7 #define AT91C_MATRIX_SCFG3 (AT91_CAST(AT91_REG *) 0x400E024C) // (MATRIX) Slave Configuration Register 3 #define AT91C_MATRIX_SCFG0 (AT91_CAST(AT91_REG *) 0x400E0240) // (MATRIX) Slave Configuration Register 0 #define AT91C_MATRIX_SFR12 (AT91_CAST(AT91_REG *) 0x400E0340) // (MATRIX) Special Function Register 12 #define AT91C_MATRIX_SCFG1 (AT91_CAST(AT91_REG *) 0x400E0244) // (MATRIX) Slave Configuration Register 1 #define AT91C_MATRIX_SFR8 (AT91_CAST(AT91_REG *) 0x400E0330) // (MATRIX) Special Function Register 8 #define AT91C_MATRIX_VER (AT91_CAST(AT91_REG *) 0x400E03FC) // (MATRIX) HMATRIX2 VERSION REGISTER #define AT91C_MATRIX_SFR13 (AT91_CAST(AT91_REG *) 0x400E0344) // (MATRIX) Special Function Register 13 #define AT91C_MATRIX_SFR5 (AT91_CAST(AT91_REG *) 0x400E0324) // (MATRIX) Special Function Register 5 #define AT91C_MATRIX_MCFG0 (AT91_CAST(AT91_REG *) 0x400E0200) // (MATRIX) Master Configuration Register 0 : ARM I and D #define AT91C_MATRIX_SCFG6 (AT91_CAST(AT91_REG *) 0x400E0258) // (MATRIX) Slave Configuration Register 6 #define AT91C_MATRIX_SFR14 (AT91_CAST(AT91_REG *) 0x400E0348) // (MATRIX) Special Function Register 14 #define AT91C_MATRIX_SFR1 (AT91_CAST(AT91_REG *) 0x400E0314) // (MATRIX) Special Function Register 1 #define AT91C_MATRIX_SFR15 (AT91_CAST(AT91_REG *) 0x400E034C) // (MATRIX) Special Function Register 15 #define AT91C_MATRIX_SFR6 (AT91_CAST(AT91_REG *) 0x400E0328) // (MATRIX) Special Function Register 6 #define AT91C_MATRIX_SFR11 (AT91_CAST(AT91_REG *) 0x400E033C) // (MATRIX) Special Function Register 11 #define AT91C_MATRIX_IPNAME2 (AT91_CAST(AT91_REG *) 0x400E03F4) // (MATRIX) HMATRIX2 IPNAME2 REGISTER #define AT91C_MATRIX_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400E03EC) // (MATRIX) HMATRIX2 ADDRSIZE REGISTER #define AT91C_MATRIX_MCFG5 (AT91_CAST(AT91_REG *) 0x400E0214) // (MATRIX) Master Configuration Register 5 #define AT91C_MATRIX_SFR9 (AT91_CAST(AT91_REG *) 0x400E0334) // (MATRIX) Special Function Register 9 #define AT91C_MATRIX_MCFG3 (AT91_CAST(AT91_REG *) 0x400E020C) // (MATRIX) Master Configuration Register 3 #define AT91C_MATRIX_SCFG4 (AT91_CAST(AT91_REG *) 0x400E0250) // (MATRIX) Slave Configuration Register 4 #define AT91C_MATRIX_MCFG1 (AT91_CAST(AT91_REG *) 0x400E0204) // (MATRIX) Master Configuration Register 1 : ARM S #define AT91C_MATRIX_SCFG7 (AT91_CAST(AT91_REG *) 0x400E025C) // (MATRIX) Slave Configuration Register 5 #define AT91C_MATRIX_SFR10 (AT91_CAST(AT91_REG *) 0x400E0338) // (MATRIX) Special Function Register 10 #define AT91C_MATRIX_SCFG2 (AT91_CAST(AT91_REG *) 0x400E0248) // (MATRIX) Slave Configuration Register 2 #define AT91C_MATRIX_SFR7 (AT91_CAST(AT91_REG *) 0x400E032C) // (MATRIX) Special Function Register 7 #define AT91C_MATRIX_IPNAME1 (AT91_CAST(AT91_REG *) 0x400E03F0) // (MATRIX) HMATRIX2 IPNAME1 REGISTER #define AT91C_MATRIX_MCFG4 (AT91_CAST(AT91_REG *) 0x400E0210) // (MATRIX) Master Configuration Register 4 #define AT91C_MATRIX_SFR0 (AT91_CAST(AT91_REG *) 0x400E0310) // (MATRIX) Special Function Register 0 #define AT91C_MATRIX_FEATURES (AT91_CAST(AT91_REG *) 0x400E03F8) // (MATRIX) HMATRIX2 FEATURES REGISTER #define AT91C_MATRIX_SCFG5 (AT91_CAST(AT91_REG *) 0x400E0254) // (MATRIX) Slave Configuration Register 5 #define AT91C_MATRIX_MCFG6 (AT91_CAST(AT91_REG *) 0x400E0218) // (MATRIX) Master Configuration Register 6 #define AT91C_MATRIX_SCFG9 (AT91_CAST(AT91_REG *) 0x400E0264) // (MATRIX) Slave Configuration Register 9 #define AT91C_MATRIX_SFR4 (AT91_CAST(AT91_REG *) 0x400E0320) // (MATRIX) Special Function Register 4 // ========== Register definition for NVIC peripheral ========== #define AT91C_NVIC_MMAR (AT91_CAST(AT91_REG *) 0xE000ED34) // (NVIC) Mem Manage Address Register #define AT91C_NVIC_STIR (AT91_CAST(AT91_REG *) 0xE000EF00) // (NVIC) Software Trigger Interrupt Register #define AT91C_NVIC_MMFR2 (AT91_CAST(AT91_REG *) 0xE000ED58) // (NVIC) Memory Model Feature register2 #define AT91C_NVIC_CPUID (AT91_CAST(AT91_REG *) 0xE000ED00) // (NVIC) CPUID Base Register #define AT91C_NVIC_DFSR (AT91_CAST(AT91_REG *) 0xE000ED30) // (NVIC) Debug Fault Status Register #define AT91C_NVIC_HAND4PR (AT91_CAST(AT91_REG *) 0xE000ED18) // (NVIC) System Handlers 4-7 Priority Register #define AT91C_NVIC_HFSR (AT91_CAST(AT91_REG *) 0xE000ED2C) // (NVIC) Hard Fault Status Register #define AT91C_NVIC_PID6 (AT91_CAST(AT91_REG *) 0xE000EFD8) // (NVIC) Peripheral identification register #define AT91C_NVIC_PFR0 (AT91_CAST(AT91_REG *) 0xE000ED40) // (NVIC) Processor Feature register0 #define AT91C_NVIC_VTOFFR (AT91_CAST(AT91_REG *) 0xE000ED08) // (NVIC) Vector Table Offset Register #define AT91C_NVIC_ISPR (AT91_CAST(AT91_REG *) 0xE000E200) // (NVIC) Set Pending Register #define AT91C_NVIC_PID0 (AT91_CAST(AT91_REG *) 0xE000EFE0) // (NVIC) Peripheral identification register b7:0 #define AT91C_NVIC_PID7 (AT91_CAST(AT91_REG *) 0xE000EFDC) // (NVIC) Peripheral identification register #define AT91C_NVIC_STICKRVR (AT91_CAST(AT91_REG *) 0xE000E014) // (NVIC) SysTick Reload Value Register #define AT91C_NVIC_PID2 (AT91_CAST(AT91_REG *) 0xE000EFE8) // (NVIC) Peripheral identification register b23:16 #define AT91C_NVIC_ISAR0 (AT91_CAST(AT91_REG *) 0xE000ED60) // (NVIC) ISA Feature register0 #define AT91C_NVIC_SCR (AT91_CAST(AT91_REG *) 0xE000ED10) // (NVIC) System Control Register #define AT91C_NVIC_PID4 (AT91_CAST(AT91_REG *) 0xE000EFD0) // (NVIC) Peripheral identification register #define AT91C_NVIC_ISAR2 (AT91_CAST(AT91_REG *) 0xE000ED68) // (NVIC) ISA Feature register2 #define AT91C_NVIC_ISER (AT91_CAST(AT91_REG *) 0xE000E100) // (NVIC) Set Enable Register #define AT91C_NVIC_IPR (AT91_CAST(AT91_REG *) 0xE000E400) // (NVIC) Interrupt Mask Register #define AT91C_NVIC_AIRCR (AT91_CAST(AT91_REG *) 0xE000ED0C) // (NVIC) Application Interrupt/Reset Control Reg #define AT91C_NVIC_CID2 (AT91_CAST(AT91_REG *) 0xE000EFF8) // (NVIC) Component identification register b23:16 #define AT91C_NVIC_ICPR (AT91_CAST(AT91_REG *) 0xE000E280) // (NVIC) Clear Pending Register #define AT91C_NVIC_CID3 (AT91_CAST(AT91_REG *) 0xE000EFFC) // (NVIC) Component identification register b31:24 #define AT91C_NVIC_CFSR (AT91_CAST(AT91_REG *) 0xE000ED28) // (NVIC) Configurable Fault Status Register #define AT91C_NVIC_AFR0 (AT91_CAST(AT91_REG *) 0xE000ED4C) // (NVIC) Auxiliary Feature register0 #define AT91C_NVIC_ICSR (AT91_CAST(AT91_REG *) 0xE000ED04) // (NVIC) Interrupt Control State Register #define AT91C_NVIC_CCR (AT91_CAST(AT91_REG *) 0xE000ED14) // (NVIC) Configuration Control Register #define AT91C_NVIC_CID0 (AT91_CAST(AT91_REG *) 0xE000EFF0) // (NVIC) Component identification register b7:0 #define AT91C_NVIC_ISAR1 (AT91_CAST(AT91_REG *) 0xE000ED64) // (NVIC) ISA Feature register1 #define AT91C_NVIC_STICKCVR (AT91_CAST(AT91_REG *) 0xE000E018) // (NVIC) SysTick Current Value Register #define AT91C_NVIC_STICKCSR (AT91_CAST(AT91_REG *) 0xE000E010) // (NVIC) SysTick Control and Status Register #define AT91C_NVIC_CID1 (AT91_CAST(AT91_REG *) 0xE000EFF4) // (NVIC) Component identification register b15:8 #define AT91C_NVIC_DFR0 (AT91_CAST(AT91_REG *) 0xE000ED48) // (NVIC) Debug Feature register0 #define AT91C_NVIC_MMFR3 (AT91_CAST(AT91_REG *) 0xE000ED5C) // (NVIC) Memory Model Feature register3 #define AT91C_NVIC_MMFR0 (AT91_CAST(AT91_REG *) 0xE000ED50) // (NVIC) Memory Model Feature register0 #define AT91C_NVIC_STICKCALVR (AT91_CAST(AT91_REG *) 0xE000E01C) // (NVIC) SysTick Calibration Value Register #define AT91C_NVIC_PID1 (AT91_CAST(AT91_REG *) 0xE000EFE4) // (NVIC) Peripheral identification register b15:8 #define AT91C_NVIC_HAND12PR (AT91_CAST(AT91_REG *) 0xE000ED20) // (NVIC) System Handlers 12-15 Priority Register #define AT91C_NVIC_MMFR1 (AT91_CAST(AT91_REG *) 0xE000ED54) // (NVIC) Memory Model Feature register1 #define AT91C_NVIC_AFSR (AT91_CAST(AT91_REG *) 0xE000ED3C) // (NVIC) Auxiliary Fault Status Register #define AT91C_NVIC_HANDCSR (AT91_CAST(AT91_REG *) 0xE000ED24) // (NVIC) System Handler Control and State Register #define AT91C_NVIC_ISAR4 (AT91_CAST(AT91_REG *) 0xE000ED70) // (NVIC) ISA Feature register4 #define AT91C_NVIC_ABR (AT91_CAST(AT91_REG *) 0xE000E300) // (NVIC) Active Bit Register #define AT91C_NVIC_PFR1 (AT91_CAST(AT91_REG *) 0xE000ED44) // (NVIC) Processor Feature register1 #define AT91C_NVIC_PID5 (AT91_CAST(AT91_REG *) 0xE000EFD4) // (NVIC) Peripheral identification register #define AT91C_NVIC_ICTR (AT91_CAST(AT91_REG *) 0xE000E004) // (NVIC) Interrupt Control Type Register #define AT91C_NVIC_ICER (AT91_CAST(AT91_REG *) 0xE000E180) // (NVIC) Clear enable Register #define AT91C_NVIC_PID3 (AT91_CAST(AT91_REG *) 0xE000EFEC) // (NVIC) Peripheral identification register b31:24 #define AT91C_NVIC_ISAR3 (AT91_CAST(AT91_REG *) 0xE000ED6C) // (NVIC) ISA Feature register3 #define AT91C_NVIC_HAND8PR (AT91_CAST(AT91_REG *) 0xE000ED1C) // (NVIC) System Handlers 8-11 Priority Register #define AT91C_NVIC_BFAR (AT91_CAST(AT91_REG *) 0xE000ED38) // (NVIC) Bus Fault Address Register // ========== Register definition for MPU peripheral ========== #define AT91C_MPU_REG_BASE_ADDR3 (AT91_CAST(AT91_REG *) 0xE000EDB4) // (MPU) MPU Region Base Address Register alias 3 #define AT91C_MPU_REG_NB (AT91_CAST(AT91_REG *) 0xE000ED98) // (MPU) MPU Region Number Register #define AT91C_MPU_ATTR_SIZE1 (AT91_CAST(AT91_REG *) 0xE000EDA8) // (MPU) MPU Attribute and Size Register alias 1 #define AT91C_MPU_REG_BASE_ADDR1 (AT91_CAST(AT91_REG *) 0xE000EDA4) // (MPU) MPU Region Base Address Register alias 1 #define AT91C_MPU_ATTR_SIZE3 (AT91_CAST(AT91_REG *) 0xE000EDB8) // (MPU) MPU Attribute and Size Register alias 3 #define AT91C_MPU_CTRL (AT91_CAST(AT91_REG *) 0xE000ED94) // (MPU) MPU Control Register #define AT91C_MPU_ATTR_SIZE2 (AT91_CAST(AT91_REG *) 0xE000EDB0) // (MPU) MPU Attribute and Size Register alias 2 #define AT91C_MPU_REG_BASE_ADDR (AT91_CAST(AT91_REG *) 0xE000ED9C) // (MPU) MPU Region Base Address Register #define AT91C_MPU_REG_BASE_ADDR2 (AT91_CAST(AT91_REG *) 0xE000EDAC) // (MPU) MPU Region Base Address Register alias 2 #define AT91C_MPU_ATTR_SIZE (AT91_CAST(AT91_REG *) 0xE000EDA0) // (MPU) MPU Attribute and Size Register #define AT91C_MPU_TYPE (AT91_CAST(AT91_REG *) 0xE000ED90) // (MPU) MPU Type Register // ========== Register definition for CM3 peripheral ========== #define AT91C_CM3_SHCSR (AT91_CAST(AT91_REG *) 0xE000ED24) // (CM3) System Handler Control and State Register #define AT91C_CM3_CCR (AT91_CAST(AT91_REG *) 0xE000ED14) // (CM3) Configuration Control Register #define AT91C_CM3_ICSR (AT91_CAST(AT91_REG *) 0xE000ED04) // (CM3) Interrupt Control State Register #define AT91C_CM3_CPUID (AT91_CAST(AT91_REG *) 0xE000ED00) // (CM3) CPU ID Base Register #define AT91C_CM3_SCR (AT91_CAST(AT91_REG *) 0xE000ED10) // (CM3) System Controller Register #define AT91C_CM3_AIRCR (AT91_CAST(AT91_REG *) 0xE000ED0C) // (CM3) Application Interrupt and Reset Control Register #define AT91C_CM3_SHPR (AT91_CAST(AT91_REG *) 0xE000ED18) // (CM3) System Handler Priority Register #define AT91C_CM3_VTOR (AT91_CAST(AT91_REG *) 0xE000ED08) // (CM3) Vector Table Offset Register // ========== Register definition for PDC_DBGU peripheral ========== #define AT91C_DBGU_TPR (AT91_CAST(AT91_REG *) 0x400E0708) // (PDC_DBGU) Transmit Pointer Register #define AT91C_DBGU_PTCR (AT91_CAST(AT91_REG *) 0x400E0720) // (PDC_DBGU) PDC Transfer Control Register #define AT91C_DBGU_TNCR (AT91_CAST(AT91_REG *) 0x400E071C) // (PDC_DBGU) Transmit Next Counter Register #define AT91C_DBGU_PTSR (AT91_CAST(AT91_REG *) 0x400E0724) // (PDC_DBGU) PDC Transfer Status Register #define AT91C_DBGU_RNCR (AT91_CAST(AT91_REG *) 0x400E0714) // (PDC_DBGU) Receive Next Counter Register #define AT91C_DBGU_RPR (AT91_CAST(AT91_REG *) 0x400E0700) // (PDC_DBGU) Receive Pointer Register #define AT91C_DBGU_TCR (AT91_CAST(AT91_REG *) 0x400E070C) // (PDC_DBGU) Transmit Counter Register #define AT91C_DBGU_RNPR (AT91_CAST(AT91_REG *) 0x400E0710) // (PDC_DBGU) Receive Next Pointer Register #define AT91C_DBGU_TNPR (AT91_CAST(AT91_REG *) 0x400E0718) // (PDC_DBGU) Transmit Next Pointer Register #define AT91C_DBGU_RCR (AT91_CAST(AT91_REG *) 0x400E0704) // (PDC_DBGU) Receive Counter Register // ========== Register definition for DBGU peripheral ========== #define AT91C_DBGU_CR (AT91_CAST(AT91_REG *) 0x400E0600) // (DBGU) Control Register #define AT91C_DBGU_IDR (AT91_CAST(AT91_REG *) 0x400E060C) // (DBGU) Interrupt Disable Register #define AT91C_DBGU_CIDR (AT91_CAST(AT91_REG *) 0x400E0740) // (DBGU) Chip ID Register #define AT91C_DBGU_IPNAME2 (AT91_CAST(AT91_REG *) 0x400E06F4) // (DBGU) DBGU IPNAME2 REGISTER #define AT91C_DBGU_FEATURES (AT91_CAST(AT91_REG *) 0x400E06F8) // (DBGU) DBGU FEATURES REGISTER #define AT91C_DBGU_FNTR (AT91_CAST(AT91_REG *) 0x400E0648) // (DBGU) Force NTRST Register #define AT91C_DBGU_RHR (AT91_CAST(AT91_REG *) 0x400E0618) // (DBGU) Receiver Holding Register #define AT91C_DBGU_THR (AT91_CAST(AT91_REG *) 0x400E061C) // (DBGU) Transmitter Holding Register #define AT91C_DBGU_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400E06EC) // (DBGU) DBGU ADDRSIZE REGISTER #define AT91C_DBGU_MR (AT91_CAST(AT91_REG *) 0x400E0604) // (DBGU) Mode Register #define AT91C_DBGU_IER (AT91_CAST(AT91_REG *) 0x400E0608) // (DBGU) Interrupt Enable Register #define AT91C_DBGU_BRGR (AT91_CAST(AT91_REG *) 0x400E0620) // (DBGU) Baud Rate Generator Register #define AT91C_DBGU_CSR (AT91_CAST(AT91_REG *) 0x400E0614) // (DBGU) Channel Status Register #define AT91C_DBGU_VER (AT91_CAST(AT91_REG *) 0x400E06FC) // (DBGU) DBGU VERSION REGISTER #define AT91C_DBGU_IMR (AT91_CAST(AT91_REG *) 0x400E0610) // (DBGU) Interrupt Mask Register #define AT91C_DBGU_IPNAME1 (AT91_CAST(AT91_REG *) 0x400E06F0) // (DBGU) DBGU IPNAME1 REGISTER #define AT91C_DBGU_EXID (AT91_CAST(AT91_REG *) 0x400E0744) // (DBGU) Chip ID Extension Register // ========== Register definition for PIOA peripheral ========== #define AT91C_PIOA_PDR (AT91_CAST(AT91_REG *) 0x400E0C04) // (PIOA) PIO Disable Register #define AT91C_PIOA_FRLHSR (AT91_CAST(AT91_REG *) 0x400E0CD8) // (PIOA) Fall/Rise - Low/High Status Register #define AT91C_PIOA_KIMR (AT91_CAST(AT91_REG *) 0x400E0D38) // (PIOA) Keypad Controller Interrupt Mask Register #define AT91C_PIOA_LSR (AT91_CAST(AT91_REG *) 0x400E0CC4) // (PIOA) Level Select Register #define AT91C_PIOA_IFSR (AT91_CAST(AT91_REG *) 0x400E0C28) // (PIOA) Input Filter Status Register #define AT91C_PIOA_KKRR (AT91_CAST(AT91_REG *) 0x400E0D44) // (PIOA) Keypad Controller Key Release Register #define AT91C_PIOA_ODR (AT91_CAST(AT91_REG *) 0x400E0C14) // (PIOA) Output Disable Registerr #define AT91C_PIOA_SCIFSR (AT91_CAST(AT91_REG *) 0x400E0C80) // (PIOA) System Clock Glitch Input Filter Select Register #define AT91C_PIOA_PER (AT91_CAST(AT91_REG *) 0x400E0C00) // (PIOA) PIO Enable Register #define AT91C_PIOA_VER (AT91_CAST(AT91_REG *) 0x400E0CFC) // (PIOA) PIO VERSION REGISTER #define AT91C_PIOA_OWSR (AT91_CAST(AT91_REG *) 0x400E0CA8) // (PIOA) Output Write Status Register #define AT91C_PIOA_KSR (AT91_CAST(AT91_REG *) 0x400E0D3C) // (PIOA) Keypad Controller Status Register #define AT91C_PIOA_IMR (AT91_CAST(AT91_REG *) 0x400E0C48) // (PIOA) Interrupt Mask Register #define AT91C_PIOA_OWDR (AT91_CAST(AT91_REG *) 0x400E0CA4) // (PIOA) Output Write Disable Register #define AT91C_PIOA_MDSR (AT91_CAST(AT91_REG *) 0x400E0C58) // (PIOA) Multi-driver Status Register #define AT91C_PIOA_IFDR (AT91_CAST(AT91_REG *) 0x400E0C24) // (PIOA) Input Filter Disable Register #define AT91C_PIOA_AIMDR (AT91_CAST(AT91_REG *) 0x400E0CB4) // (PIOA) Additional Interrupt Modes Disables Register #define AT91C_PIOA_CODR (AT91_CAST(AT91_REG *) 0x400E0C34) // (PIOA) Clear Output Data Register #define AT91C_PIOA_SCDR (AT91_CAST(AT91_REG *) 0x400E0C8C) // (PIOA) Slow Clock Divider Debouncing Register #define AT91C_PIOA_KIER (AT91_CAST(AT91_REG *) 0x400E0D30) // (PIOA) Keypad Controller Interrupt Enable Register #define AT91C_PIOA_REHLSR (AT91_CAST(AT91_REG *) 0x400E0CD4) // (PIOA) Rising Edge/ High Level Select Register #define AT91C_PIOA_ISR (AT91_CAST(AT91_REG *) 0x400E0C4C) // (PIOA) Interrupt Status Register #define AT91C_PIOA_ESR (AT91_CAST(AT91_REG *) 0x400E0CC0) // (PIOA) Edge Select Register #define AT91C_PIOA_PPUDR (AT91_CAST(AT91_REG *) 0x400E0C60) // (PIOA) Pull-up Disable Register #define AT91C_PIOA_MDDR (AT91_CAST(AT91_REG *) 0x400E0C54) // (PIOA) Multi-driver Disable Register #define AT91C_PIOA_PSR (AT91_CAST(AT91_REG *) 0x400E0C08) // (PIOA) PIO Status Register #define AT91C_PIOA_PDSR (AT91_CAST(AT91_REG *) 0x400E0C3C) // (PIOA) Pin Data Status Register #define AT91C_PIOA_IFDGSR (AT91_CAST(AT91_REG *) 0x400E0C88) // (PIOA) Glitch or Debouncing Input Filter Clock Selection Status Register #define AT91C_PIOA_FELLSR (AT91_CAST(AT91_REG *) 0x400E0CD0) // (PIOA) Falling Edge/Low Level Select Register #define AT91C_PIOA_PPUSR (AT91_CAST(AT91_REG *) 0x400E0C68) // (PIOA) Pull-up Status Register #define AT91C_PIOA_OER (AT91_CAST(AT91_REG *) 0x400E0C10) // (PIOA) Output Enable Register #define AT91C_PIOA_OSR (AT91_CAST(AT91_REG *) 0x400E0C18) // (PIOA) Output Status Register #define AT91C_PIOA_KKPR (AT91_CAST(AT91_REG *) 0x400E0D40) // (PIOA) Keypad Controller Key Press Register #define AT91C_PIOA_AIMMR (AT91_CAST(AT91_REG *) 0x400E0CB8) // (PIOA) Additional Interrupt Modes Mask Register #define AT91C_PIOA_KRCR (AT91_CAST(AT91_REG *) 0x400E0D24) // (PIOA) Keypad Controller Row Column Register #define AT91C_PIOA_IER (AT91_CAST(AT91_REG *) 0x400E0C40) // (PIOA) Interrupt Enable Register #define AT91C_PIOA_KER (AT91_CAST(AT91_REG *) 0x400E0D20) // (PIOA) Keypad Controller Enable Register #define AT91C_PIOA_PPUER (AT91_CAST(AT91_REG *) 0x400E0C64) // (PIOA) Pull-up Enable Register #define AT91C_PIOA_KIDR (AT91_CAST(AT91_REG *) 0x400E0D34) // (PIOA) Keypad Controller Interrupt Disable Register #define AT91C_PIOA_ABSR (AT91_CAST(AT91_REG *) 0x400E0C70) // (PIOA) Peripheral AB Select Register #define AT91C_PIOA_LOCKSR (AT91_CAST(AT91_REG *) 0x400E0CE0) // (PIOA) Lock Status Register #define AT91C_PIOA_DIFSR (AT91_CAST(AT91_REG *) 0x400E0C84) // (PIOA) Debouncing Input Filter Select Register #define AT91C_PIOA_MDER (AT91_CAST(AT91_REG *) 0x400E0C50) // (PIOA) Multi-driver Enable Register #define AT91C_PIOA_AIMER (AT91_CAST(AT91_REG *) 0x400E0CB0) // (PIOA) Additional Interrupt Modes Enable Register #define AT91C_PIOA_ELSR (AT91_CAST(AT91_REG *) 0x400E0CC8) // (PIOA) Edge/Level Status Register #define AT91C_PIOA_IFER (AT91_CAST(AT91_REG *) 0x400E0C20) // (PIOA) Input Filter Enable Register #define AT91C_PIOA_KDR (AT91_CAST(AT91_REG *) 0x400E0D28) // (PIOA) Keypad Controller Debouncing Register #define AT91C_PIOA_IDR (AT91_CAST(AT91_REG *) 0x400E0C44) // (PIOA) Interrupt Disable Register #define AT91C_PIOA_OWER (AT91_CAST(AT91_REG *) 0x400E0CA0) // (PIOA) Output Write Enable Register #define AT91C_PIOA_ODSR (AT91_CAST(AT91_REG *) 0x400E0C38) // (PIOA) Output Data Status Register #define AT91C_PIOA_SODR (AT91_CAST(AT91_REG *) 0x400E0C30) // (PIOA) Set Output Data Register // ========== Register definition for PIOB peripheral ========== #define AT91C_PIOB_KIDR (AT91_CAST(AT91_REG *) 0x400E0F34) // (PIOB) Keypad Controller Interrupt Disable Register #define AT91C_PIOB_OWSR (AT91_CAST(AT91_REG *) 0x400E0EA8) // (PIOB) Output Write Status Register #define AT91C_PIOB_PSR (AT91_CAST(AT91_REG *) 0x400E0E08) // (PIOB) PIO Status Register #define AT91C_PIOB_MDER (AT91_CAST(AT91_REG *) 0x400E0E50) // (PIOB) Multi-driver Enable Register #define AT91C_PIOB_ODR (AT91_CAST(AT91_REG *) 0x400E0E14) // (PIOB) Output Disable Registerr #define AT91C_PIOB_IDR (AT91_CAST(AT91_REG *) 0x400E0E44) // (PIOB) Interrupt Disable Register #define AT91C_PIOB_AIMER (AT91_CAST(AT91_REG *) 0x400E0EB0) // (PIOB) Additional Interrupt Modes Enable Register #define AT91C_PIOB_DIFSR (AT91_CAST(AT91_REG *) 0x400E0E84) // (PIOB) Debouncing Input Filter Select Register #define AT91C_PIOB_PDR (AT91_CAST(AT91_REG *) 0x400E0E04) // (PIOB) PIO Disable Register #define AT91C_PIOB_REHLSR (AT91_CAST(AT91_REG *) 0x400E0ED4) // (PIOB) Rising Edge/ High Level Select Register #define AT91C_PIOB_PDSR (AT91_CAST(AT91_REG *) 0x400E0E3C) // (PIOB) Pin Data Status Register #define AT91C_PIOB_PPUDR (AT91_CAST(AT91_REG *) 0x400E0E60) // (PIOB) Pull-up Disable Register #define AT91C_PIOB_LSR (AT91_CAST(AT91_REG *) 0x400E0EC4) // (PIOB) Level Select Register #define AT91C_PIOB_OWDR (AT91_CAST(AT91_REG *) 0x400E0EA4) // (PIOB) Output Write Disable Register #define AT91C_PIOB_FELLSR (AT91_CAST(AT91_REG *) 0x400E0ED0) // (PIOB) Falling Edge/Low Level Select Register #define AT91C_PIOB_IFER (AT91_CAST(AT91_REG *) 0x400E0E20) // (PIOB) Input Filter Enable Register #define AT91C_PIOB_ABSR (AT91_CAST(AT91_REG *) 0x400E0E70) // (PIOB) Peripheral AB Select Register #define AT91C_PIOB_KIMR (AT91_CAST(AT91_REG *) 0x400E0F38) // (PIOB) Keypad Controller Interrupt Mask Register #define AT91C_PIOB_KKPR (AT91_CAST(AT91_REG *) 0x400E0F40) // (PIOB) Keypad Controller Key Press Register #define AT91C_PIOB_FRLHSR (AT91_CAST(AT91_REG *) 0x400E0ED8) // (PIOB) Fall/Rise - Low/High Status Register #define AT91C_PIOB_AIMDR (AT91_CAST(AT91_REG *) 0x400E0EB4) // (PIOB) Additional Interrupt Modes Disables Register #define AT91C_PIOB_SCIFSR (AT91_CAST(AT91_REG *) 0x400E0E80) // (PIOB) System Clock Glitch Input Filter Select Register #define AT91C_PIOB_VER (AT91_CAST(AT91_REG *) 0x400E0EFC) // (PIOB) PIO VERSION REGISTER #define AT91C_PIOB_PER (AT91_CAST(AT91_REG *) 0x400E0E00) // (PIOB) PIO Enable Register #define AT91C_PIOB_ELSR (AT91_CAST(AT91_REG *) 0x400E0EC8) // (PIOB) Edge/Level Status Register #define AT91C_PIOB_IMR (AT91_CAST(AT91_REG *) 0x400E0E48) // (PIOB) Interrupt Mask Register #define AT91C_PIOB_PPUSR (AT91_CAST(AT91_REG *) 0x400E0E68) // (PIOB) Pull-up Status Register #define AT91C_PIOB_SCDR (AT91_CAST(AT91_REG *) 0x400E0E8C) // (PIOB) Slow Clock Divider Debouncing Register #define AT91C_PIOB_KSR (AT91_CAST(AT91_REG *) 0x400E0F3C) // (PIOB) Keypad Controller Status Register #define AT91C_PIOB_IFDGSR (AT91_CAST(AT91_REG *) 0x400E0E88) // (PIOB) Glitch or Debouncing Input Filter Clock Selection Status Register #define AT91C_PIOB_ESR (AT91_CAST(AT91_REG *) 0x400E0EC0) // (PIOB) Edge Select Register #define AT91C_PIOB_ODSR (AT91_CAST(AT91_REG *) 0x400E0E38) // (PIOB) Output Data Status Register #define AT91C_PIOB_IFDR (AT91_CAST(AT91_REG *) 0x400E0E24) // (PIOB) Input Filter Disable Register #define AT91C_PIOB_SODR (AT91_CAST(AT91_REG *) 0x400E0E30) // (PIOB) Set Output Data Register #define AT91C_PIOB_IER (AT91_CAST(AT91_REG *) 0x400E0E40) // (PIOB) Interrupt Enable Register #define AT91C_PIOB_MDSR (AT91_CAST(AT91_REG *) 0x400E0E58) // (PIOB) Multi-driver Status Register #define AT91C_PIOB_ISR (AT91_CAST(AT91_REG *) 0x400E0E4C) // (PIOB) Interrupt Status Register #define AT91C_PIOB_IFSR (AT91_CAST(AT91_REG *) 0x400E0E28) // (PIOB) Input Filter Status Register #define AT91C_PIOB_KER (AT91_CAST(AT91_REG *) 0x400E0F20) // (PIOB) Keypad Controller Enable Register #define AT91C_PIOB_KKRR (AT91_CAST(AT91_REG *) 0x400E0F44) // (PIOB) Keypad Controller Key Release Register #define AT91C_PIOB_PPUER (AT91_CAST(AT91_REG *) 0x400E0E64) // (PIOB) Pull-up Enable Register #define AT91C_PIOB_LOCKSR (AT91_CAST(AT91_REG *) 0x400E0EE0) // (PIOB) Lock Status Register #define AT91C_PIOB_OWER (AT91_CAST(AT91_REG *) 0x400E0EA0) // (PIOB) Output Write Enable Register #define AT91C_PIOB_KIER (AT91_CAST(AT91_REG *) 0x400E0F30) // (PIOB) Keypad Controller Interrupt Enable Register #define AT91C_PIOB_MDDR (AT91_CAST(AT91_REG *) 0x400E0E54) // (PIOB) Multi-driver Disable Register #define AT91C_PIOB_KRCR (AT91_CAST(AT91_REG *) 0x400E0F24) // (PIOB) Keypad Controller Row Column Register #define AT91C_PIOB_CODR (AT91_CAST(AT91_REG *) 0x400E0E34) // (PIOB) Clear Output Data Register #define AT91C_PIOB_KDR (AT91_CAST(AT91_REG *) 0x400E0F28) // (PIOB) Keypad Controller Debouncing Register #define AT91C_PIOB_AIMMR (AT91_CAST(AT91_REG *) 0x400E0EB8) // (PIOB) Additional Interrupt Modes Mask Register #define AT91C_PIOB_OER (AT91_CAST(AT91_REG *) 0x400E0E10) // (PIOB) Output Enable Register #define AT91C_PIOB_OSR (AT91_CAST(AT91_REG *) 0x400E0E18) // (PIOB) Output Status Register // ========== Register definition for PIOC peripheral ========== #define AT91C_PIOC_FELLSR (AT91_CAST(AT91_REG *) 0x400E10D0) // (PIOC) Falling Edge/Low Level Select Register #define AT91C_PIOC_FRLHSR (AT91_CAST(AT91_REG *) 0x400E10D8) // (PIOC) Fall/Rise - Low/High Status Register #define AT91C_PIOC_MDDR (AT91_CAST(AT91_REG *) 0x400E1054) // (PIOC) Multi-driver Disable Register #define AT91C_PIOC_IFDGSR (AT91_CAST(AT91_REG *) 0x400E1088) // (PIOC) Glitch or Debouncing Input Filter Clock Selection Status Register #define AT91C_PIOC_ABSR (AT91_CAST(AT91_REG *) 0x400E1070) // (PIOC) Peripheral AB Select Register #define AT91C_PIOC_KIMR (AT91_CAST(AT91_REG *) 0x400E1138) // (PIOC) Keypad Controller Interrupt Mask Register #define AT91C_PIOC_KRCR (AT91_CAST(AT91_REG *) 0x400E1124) // (PIOC) Keypad Controller Row Column Register #define AT91C_PIOC_ODSR (AT91_CAST(AT91_REG *) 0x400E1038) // (PIOC) Output Data Status Register #define AT91C_PIOC_OSR (AT91_CAST(AT91_REG *) 0x400E1018) // (PIOC) Output Status Register #define AT91C_PIOC_IFER (AT91_CAST(AT91_REG *) 0x400E1020) // (PIOC) Input Filter Enable Register #define AT91C_PIOC_KKPR (AT91_CAST(AT91_REG *) 0x400E1140) // (PIOC) Keypad Controller Key Press Register #define AT91C_PIOC_MDSR (AT91_CAST(AT91_REG *) 0x400E1058) // (PIOC) Multi-driver Status Register #define AT91C_PIOC_IFDR (AT91_CAST(AT91_REG *) 0x400E1024) // (PIOC) Input Filter Disable Register #define AT91C_PIOC_MDER (AT91_CAST(AT91_REG *) 0x400E1050) // (PIOC) Multi-driver Enable Register #define AT91C_PIOC_SCDR (AT91_CAST(AT91_REG *) 0x400E108C) // (PIOC) Slow Clock Divider Debouncing Register #define AT91C_PIOC_SCIFSR (AT91_CAST(AT91_REG *) 0x400E1080) // (PIOC) System Clock Glitch Input Filter Select Register #define AT91C_PIOC_IER (AT91_CAST(AT91_REG *) 0x400E1040) // (PIOC) Interrupt Enable Register #define AT91C_PIOC_KDR (AT91_CAST(AT91_REG *) 0x400E1128) // (PIOC) Keypad Controller Debouncing Register #define AT91C_PIOC_OWDR (AT91_CAST(AT91_REG *) 0x400E10A4) // (PIOC) Output Write Disable Register #define AT91C_PIOC_IFSR (AT91_CAST(AT91_REG *) 0x400E1028) // (PIOC) Input Filter Status Register #define AT91C_PIOC_ISR (AT91_CAST(AT91_REG *) 0x400E104C) // (PIOC) Interrupt Status Register #define AT91C_PIOC_PPUDR (AT91_CAST(AT91_REG *) 0x400E1060) // (PIOC) Pull-up Disable Register #define AT91C_PIOC_PDSR (AT91_CAST(AT91_REG *) 0x400E103C) // (PIOC) Pin Data Status Register #define AT91C_PIOC_KKRR (AT91_CAST(AT91_REG *) 0x400E1144) // (PIOC) Keypad Controller Key Release Register #define AT91C_PIOC_AIMDR (AT91_CAST(AT91_REG *) 0x400E10B4) // (PIOC) Additional Interrupt Modes Disables Register #define AT91C_PIOC_LSR (AT91_CAST(AT91_REG *) 0x400E10C4) // (PIOC) Level Select Register #define AT91C_PIOC_PPUER (AT91_CAST(AT91_REG *) 0x400E1064) // (PIOC) Pull-up Enable Register #define AT91C_PIOC_AIMER (AT91_CAST(AT91_REG *) 0x400E10B0) // (PIOC) Additional Interrupt Modes Enable Register #define AT91C_PIOC_OER (AT91_CAST(AT91_REG *) 0x400E1010) // (PIOC) Output Enable Register #define AT91C_PIOC_CODR (AT91_CAST(AT91_REG *) 0x400E1034) // (PIOC) Clear Output Data Register #define AT91C_PIOC_AIMMR (AT91_CAST(AT91_REG *) 0x400E10B8) // (PIOC) Additional Interrupt Modes Mask Register #define AT91C_PIOC_OWER (AT91_CAST(AT91_REG *) 0x400E10A0) // (PIOC) Output Write Enable Register #define AT91C_PIOC_VER (AT91_CAST(AT91_REG *) 0x400E10FC) // (PIOC) PIO VERSION REGISTER #define AT91C_PIOC_IMR (AT91_CAST(AT91_REG *) 0x400E1048) // (PIOC) Interrupt Mask Register #define AT91C_PIOC_PPUSR (AT91_CAST(AT91_REG *) 0x400E1068) // (PIOC) Pull-up Status Register #define AT91C_PIOC_IDR (AT91_CAST(AT91_REG *) 0x400E1044) // (PIOC) Interrupt Disable Register #define AT91C_PIOC_DIFSR (AT91_CAST(AT91_REG *) 0x400E1084) // (PIOC) Debouncing Input Filter Select Register #define AT91C_PIOC_KIDR (AT91_CAST(AT91_REG *) 0x400E1134) // (PIOC) Keypad Controller Interrupt Disable Register #define AT91C_PIOC_KSR (AT91_CAST(AT91_REG *) 0x400E113C) // (PIOC) Keypad Controller Status Register #define AT91C_PIOC_REHLSR (AT91_CAST(AT91_REG *) 0x400E10D4) // (PIOC) Rising Edge/ High Level Select Register #define AT91C_PIOC_ESR (AT91_CAST(AT91_REG *) 0x400E10C0) // (PIOC) Edge Select Register #define AT91C_PIOC_KIER (AT91_CAST(AT91_REG *) 0x400E1130) // (PIOC) Keypad Controller Interrupt Enable Register #define AT91C_PIOC_ELSR (AT91_CAST(AT91_REG *) 0x400E10C8) // (PIOC) Edge/Level Status Register #define AT91C_PIOC_SODR (AT91_CAST(AT91_REG *) 0x400E1030) // (PIOC) Set Output Data Register #define AT91C_PIOC_PSR (AT91_CAST(AT91_REG *) 0x400E1008) // (PIOC) PIO Status Register #define AT91C_PIOC_KER (AT91_CAST(AT91_REG *) 0x400E1120) // (PIOC) Keypad Controller Enable Register #define AT91C_PIOC_ODR (AT91_CAST(AT91_REG *) 0x400E1014) // (PIOC) Output Disable Registerr #define AT91C_PIOC_OWSR (AT91_CAST(AT91_REG *) 0x400E10A8) // (PIOC) Output Write Status Register #define AT91C_PIOC_PDR (AT91_CAST(AT91_REG *) 0x400E1004) // (PIOC) PIO Disable Register #define AT91C_PIOC_LOCKSR (AT91_CAST(AT91_REG *) 0x400E10E0) // (PIOC) Lock Status Register #define AT91C_PIOC_PER (AT91_CAST(AT91_REG *) 0x400E1000) // (PIOC) PIO Enable Register // ========== Register definition for PMC peripheral ========== #define AT91C_PMC_PLLAR (AT91_CAST(AT91_REG *) 0x400E0428) // (PMC) PLL Register #define AT91C_PMC_UCKR (AT91_CAST(AT91_REG *) 0x400E041C) // (PMC) UTMI Clock Configuration Register #define AT91C_PMC_FSMR (AT91_CAST(AT91_REG *) 0x400E0470) // (PMC) Fast Startup Mode Register #define AT91C_PMC_MCKR (AT91_CAST(AT91_REG *) 0x400E0430) // (PMC) Master Clock Register #define AT91C_PMC_SCER (AT91_CAST(AT91_REG *) 0x400E0400) // (PMC) System Clock Enable Register #define AT91C_PMC_PCSR (AT91_CAST(AT91_REG *) 0x400E0418) // (PMC) Peripheral Clock Status Register #define AT91C_PMC_MCFR (AT91_CAST(AT91_REG *) 0x400E0424) // (PMC) Main Clock Frequency Register #define AT91C_PMC_FOCR (AT91_CAST(AT91_REG *) 0x400E0478) // (PMC) Fault Output Clear Register #define AT91C_PMC_FSPR (AT91_CAST(AT91_REG *) 0x400E0474) // (PMC) Fast Startup Polarity Register #define AT91C_PMC_SCSR (AT91_CAST(AT91_REG *) 0x400E0408) // (PMC) System Clock Status Register #define AT91C_PMC_IDR (AT91_CAST(AT91_REG *) 0x400E0464) // (PMC) Interrupt Disable Register #define AT91C_PMC_VER (AT91_CAST(AT91_REG *) 0x400E04FC) // (PMC) APMC VERSION REGISTER #define AT91C_PMC_IMR (AT91_CAST(AT91_REG *) 0x400E046C) // (PMC) Interrupt Mask Register #define AT91C_PMC_IPNAME2 (AT91_CAST(AT91_REG *) 0x400E04F4) // (PMC) PMC IPNAME2 REGISTER #define AT91C_PMC_SCDR (AT91_CAST(AT91_REG *) 0x400E0404) // (PMC) System Clock Disable Register #define AT91C_PMC_PCKR (AT91_CAST(AT91_REG *) 0x400E0440) // (PMC) Programmable Clock Register #define AT91C_PMC_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400E04EC) // (PMC) PMC ADDRSIZE REGISTER #define AT91C_PMC_PCDR (AT91_CAST(AT91_REG *) 0x400E0414) // (PMC) Peripheral Clock Disable Register #define AT91C_PMC_MOR (AT91_CAST(AT91_REG *) 0x400E0420) // (PMC) Main Oscillator Register #define AT91C_PMC_SR (AT91_CAST(AT91_REG *) 0x400E0468) // (PMC) Status Register #define AT91C_PMC_IER (AT91_CAST(AT91_REG *) 0x400E0460) // (PMC) Interrupt Enable Register #define AT91C_PMC_IPNAME1 (AT91_CAST(AT91_REG *) 0x400E04F0) // (PMC) PMC IPNAME1 REGISTER #define AT91C_PMC_PCER (AT91_CAST(AT91_REG *) 0x400E0410) // (PMC) Peripheral Clock Enable Register #define AT91C_PMC_FEATURES (AT91_CAST(AT91_REG *) 0x400E04F8) // (PMC) PMC FEATURES REGISTER // ========== Register definition for CKGR peripheral ========== #define AT91C_CKGR_PLLAR (AT91_CAST(AT91_REG *) 0x400E0428) // (CKGR) PLL Register #define AT91C_CKGR_UCKR (AT91_CAST(AT91_REG *) 0x400E041C) // (CKGR) UTMI Clock Configuration Register #define AT91C_CKGR_MOR (AT91_CAST(AT91_REG *) 0x400E0420) // (CKGR) Main Oscillator Register #define AT91C_CKGR_MCFR (AT91_CAST(AT91_REG *) 0x400E0424) // (CKGR) Main Clock Frequency Register // ========== Register definition for RSTC peripheral ========== #define AT91C_RSTC_VER (AT91_CAST(AT91_REG *) 0x400E12FC) // (RSTC) Version Register #define AT91C_RSTC_RCR (AT91_CAST(AT91_REG *) 0x400E1200) // (RSTC) Reset Control Register #define AT91C_RSTC_RMR (AT91_CAST(AT91_REG *) 0x400E1208) // (RSTC) Reset Mode Register #define AT91C_RSTC_RSR (AT91_CAST(AT91_REG *) 0x400E1204) // (RSTC) Reset Status Register // ========== Register definition for SUPC peripheral ========== #define AT91C_SUPC_CR (AT91_CAST(AT91_REG *) 0x400E1210) // (SUPC) Supply Controller Control Register #define AT91C_SUPC_SMMR (AT91_CAST(AT91_REG *) 0x400E1214) // (SUPC) Supply Controller Supply Monitor Mode Register #define AT91C_SUPC_MR (AT91_CAST(AT91_REG *) 0x400E1218) // (SUPC) Supply Controller Mode Register #define AT91C_SUPC_WUMR (AT91_CAST(AT91_REG *) 0x400E121C) // (SUPC) Supply Controller Wake Up Mode Register #define AT91C_SUPC_WUIR (AT91_CAST(AT91_REG *) 0x400E1220) // (SUPC) Supply Controller Wake Up Inputs Register #define AT91C_SUPC_SR (AT91_CAST(AT91_REG *) 0x400E1224) // (SUPC) Supply Controller Status Register // ========== Register definition for RTTC peripheral ========== #define AT91C_RTTC_RTVR (AT91_CAST(AT91_REG *) 0x400E1238) // (RTTC) Real-time Value Register #define AT91C_RTTC_RTAR (AT91_CAST(AT91_REG *) 0x400E1234) // (RTTC) Real-time Alarm Register #define AT91C_RTTC_RTMR (AT91_CAST(AT91_REG *) 0x400E1230) // (RTTC) Real-time Mode Register #define AT91C_RTTC_RTSR (AT91_CAST(AT91_REG *) 0x400E123C) // (RTTC) Real-time Status Register // ========== Register definition for WDTC peripheral ========== #define AT91C_WDTC_WDSR (AT91_CAST(AT91_REG *) 0x400E1258) // (WDTC) Watchdog Status Register #define AT91C_WDTC_WDMR (AT91_CAST(AT91_REG *) 0x400E1254) // (WDTC) Watchdog Mode Register #define AT91C_WDTC_WDCR (AT91_CAST(AT91_REG *) 0x400E1250) // (WDTC) Watchdog Control Register // ========== Register definition for RTC peripheral ========== #define AT91C_RTC_IMR (AT91_CAST(AT91_REG *) 0x400E1288) // (RTC) Interrupt Mask Register #define AT91C_RTC_SCCR (AT91_CAST(AT91_REG *) 0x400E127C) // (RTC) Status Clear Command Register #define AT91C_RTC_CALR (AT91_CAST(AT91_REG *) 0x400E126C) // (RTC) Calendar Register #define AT91C_RTC_MR (AT91_CAST(AT91_REG *) 0x400E1264) // (RTC) Mode Register #define AT91C_RTC_TIMR (AT91_CAST(AT91_REG *) 0x400E1268) // (RTC) Time Register #define AT91C_RTC_CALALR (AT91_CAST(AT91_REG *) 0x400E1274) // (RTC) Calendar Alarm Register #define AT91C_RTC_VER (AT91_CAST(AT91_REG *) 0x400E128C) // (RTC) Valid Entry Register #define AT91C_RTC_CR (AT91_CAST(AT91_REG *) 0x400E1260) // (RTC) Control Register #define AT91C_RTC_IDR (AT91_CAST(AT91_REG *) 0x400E1284) // (RTC) Interrupt Disable Register #define AT91C_RTC_TIMALR (AT91_CAST(AT91_REG *) 0x400E1270) // (RTC) Time Alarm Register #define AT91C_RTC_IER (AT91_CAST(AT91_REG *) 0x400E1280) // (RTC) Interrupt Enable Register #define AT91C_RTC_SR (AT91_CAST(AT91_REG *) 0x400E1278) // (RTC) Status Register // ========== Register definition for ADC0 peripheral ========== #define AT91C_ADC0_IPNAME2 (AT91_CAST(AT91_REG *) 0x400AC0F4) // (ADC0) ADC IPNAME2 REGISTER #define AT91C_ADC0_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400AC0EC) // (ADC0) ADC ADDRSIZE REGISTER #define AT91C_ADC0_IDR (AT91_CAST(AT91_REG *) 0x400AC028) // (ADC0) ADC Interrupt Disable Register #define AT91C_ADC0_CHSR (AT91_CAST(AT91_REG *) 0x400AC018) // (ADC0) ADC Channel Status Register #define AT91C_ADC0_FEATURES (AT91_CAST(AT91_REG *) 0x400AC0F8) // (ADC0) ADC FEATURES REGISTER #define AT91C_ADC0_CDR0 (AT91_CAST(AT91_REG *) 0x400AC030) // (ADC0) ADC Channel Data Register 0 #define AT91C_ADC0_LCDR (AT91_CAST(AT91_REG *) 0x400AC020) // (ADC0) ADC Last Converted Data Register #define AT91C_ADC0_EMR (AT91_CAST(AT91_REG *) 0x400AC068) // (ADC0) Extended Mode Register #define AT91C_ADC0_CDR3 (AT91_CAST(AT91_REG *) 0x400AC03C) // (ADC0) ADC Channel Data Register 3 #define AT91C_ADC0_CDR7 (AT91_CAST(AT91_REG *) 0x400AC04C) // (ADC0) ADC Channel Data Register 7 #define AT91C_ADC0_SR (AT91_CAST(AT91_REG *) 0x400AC01C) // (ADC0) ADC Status Register #define AT91C_ADC0_ACR (AT91_CAST(AT91_REG *) 0x400AC064) // (ADC0) Analog Control Register #define AT91C_ADC0_CDR5 (AT91_CAST(AT91_REG *) 0x400AC044) // (ADC0) ADC Channel Data Register 5 #define AT91C_ADC0_IPNAME1 (AT91_CAST(AT91_REG *) 0x400AC0F0) // (ADC0) ADC IPNAME1 REGISTER #define AT91C_ADC0_CDR6 (AT91_CAST(AT91_REG *) 0x400AC048) // (ADC0) ADC Channel Data Register 6 #define AT91C_ADC0_MR (AT91_CAST(AT91_REG *) 0x400AC004) // (ADC0) ADC Mode Register #define AT91C_ADC0_CDR1 (AT91_CAST(AT91_REG *) 0x400AC034) // (ADC0) ADC Channel Data Register 1 #define AT91C_ADC0_CDR2 (AT91_CAST(AT91_REG *) 0x400AC038) // (ADC0) ADC Channel Data Register 2 #define AT91C_ADC0_CDR4 (AT91_CAST(AT91_REG *) 0x400AC040) // (ADC0) ADC Channel Data Register 4 #define AT91C_ADC0_CHER (AT91_CAST(AT91_REG *) 0x400AC010) // (ADC0) ADC Channel Enable Register #define AT91C_ADC0_VER (AT91_CAST(AT91_REG *) 0x400AC0FC) // (ADC0) ADC VERSION REGISTER #define AT91C_ADC0_CHDR (AT91_CAST(AT91_REG *) 0x400AC014) // (ADC0) ADC Channel Disable Register #define AT91C_ADC0_CR (AT91_CAST(AT91_REG *) 0x400AC000) // (ADC0) ADC Control Register #define AT91C_ADC0_IMR (AT91_CAST(AT91_REG *) 0x400AC02C) // (ADC0) ADC Interrupt Mask Register #define AT91C_ADC0_IER (AT91_CAST(AT91_REG *) 0x400AC024) // (ADC0) ADC Interrupt Enable Register // ========== Register definition for ADC12B peripheral ========== #define AT91C_ADC12B_CR (AT91_CAST(AT91_REG *) 0x400A8000) // (ADC12B) Control Register #define AT91C_ADC12B_MR (AT91_CAST(AT91_REG *) 0x400A8004) // (ADC12B) Mode Register #define AT91C_ADC12B_CHER (AT91_CAST(AT91_REG *) 0x400A8010) // (ADC12B) Channel Enable Register #define AT91C_ADC12B_CHDR (AT91_CAST(AT91_REG *) 0x400A8014) // (ADC12B) Channel Disable Register #define AT91C_ADC12B_CHSR (AT91_CAST(AT91_REG *) 0x400A8018) // (ADC12B) Channel Status Register #define AT91C_ADC12B_SR (AT91_CAST(AT91_REG *) 0x400A801C) // (ADC12B) Status Register #define AT91C_ADC12B_LCDR (AT91_CAST(AT91_REG *) 0x400A8020) // (ADC12B) Last Converted Data Register #define AT91C_ADC12B_IER (AT91_CAST(AT91_REG *) 0x400A8024) // (ADC12B) Interrupt Enable Register #define AT91C_ADC12B_IDR (AT91_CAST(AT91_REG *) 0x400A8028) // (ADC12B) Interrupt Disable Register #define AT91C_ADC12B_IMR (AT91_CAST(AT91_REG *) 0x400A802C) // (ADC12B) Interrupt Mask Register #define AT91C_ADC12B_CDR (AT91_CAST(AT91_REG *) 0x400A8030) // (ADC12B) Channel Data Register #define AT91C_ADC12B_ACR (AT91_CAST(AT91_REG *) 0x400A8064) // (ADC12B) Analog Control Register #define AT91C_ADC12B_EMR (AT91_CAST(AT91_REG *) 0x400A8068) // (ADC12B) Extended Mode Register // ========== Register definition for TC0 peripheral ========== #define AT91C_TC0_IER (AT91_CAST(AT91_REG *) 0x40080024) // (TC0) Interrupt Enable Register #define AT91C_TC0_CV (AT91_CAST(AT91_REG *) 0x40080010) // (TC0) Counter Value #define AT91C_TC0_RA (AT91_CAST(AT91_REG *) 0x40080014) // (TC0) Register A #define AT91C_TC0_RB (AT91_CAST(AT91_REG *) 0x40080018) // (TC0) Register B #define AT91C_TC0_IDR (AT91_CAST(AT91_REG *) 0x40080028) // (TC0) Interrupt Disable Register #define AT91C_TC0_SR (AT91_CAST(AT91_REG *) 0x40080020) // (TC0) Status Register #define AT91C_TC0_IMR (AT91_CAST(AT91_REG *) 0x4008002C) // (TC0) Interrupt Mask Register #define AT91C_TC0_CMR (AT91_CAST(AT91_REG *) 0x40080004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) #define AT91C_TC0_RC (AT91_CAST(AT91_REG *) 0x4008001C) // (TC0) Register C #define AT91C_TC0_CCR (AT91_CAST(AT91_REG *) 0x40080000) // (TC0) Channel Control Register // ========== Register definition for TC1 peripheral ========== #define AT91C_TC1_SR (AT91_CAST(AT91_REG *) 0x40080060) // (TC1) Status Register #define AT91C_TC1_RA (AT91_CAST(AT91_REG *) 0x40080054) // (TC1) Register A #define AT91C_TC1_IER (AT91_CAST(AT91_REG *) 0x40080064) // (TC1) Interrupt Enable Register #define AT91C_TC1_RB (AT91_CAST(AT91_REG *) 0x40080058) // (TC1) Register B #define AT91C_TC1_IDR (AT91_CAST(AT91_REG *) 0x40080068) // (TC1) Interrupt Disable Register #define AT91C_TC1_CCR (AT91_CAST(AT91_REG *) 0x40080040) // (TC1) Channel Control Register #define AT91C_TC1_IMR (AT91_CAST(AT91_REG *) 0x4008006C) // (TC1) Interrupt Mask Register #define AT91C_TC1_RC (AT91_CAST(AT91_REG *) 0x4008005C) // (TC1) Register C #define AT91C_TC1_CMR (AT91_CAST(AT91_REG *) 0x40080044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) #define AT91C_TC1_CV (AT91_CAST(AT91_REG *) 0x40080050) // (TC1) Counter Value // ========== Register definition for TC2 peripheral ========== #define AT91C_TC2_RA (AT91_CAST(AT91_REG *) 0x40080094) // (TC2) Register A #define AT91C_TC2_RB (AT91_CAST(AT91_REG *) 0x40080098) // (TC2) Register B #define AT91C_TC2_CMR (AT91_CAST(AT91_REG *) 0x40080084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) #define AT91C_TC2_SR (AT91_CAST(AT91_REG *) 0x400800A0) // (TC2) Status Register #define AT91C_TC2_CCR (AT91_CAST(AT91_REG *) 0x40080080) // (TC2) Channel Control Register #define AT91C_TC2_IMR (AT91_CAST(AT91_REG *) 0x400800AC) // (TC2) Interrupt Mask Register #define AT91C_TC2_CV (AT91_CAST(AT91_REG *) 0x40080090) // (TC2) Counter Value #define AT91C_TC2_RC (AT91_CAST(AT91_REG *) 0x4008009C) // (TC2) Register C #define AT91C_TC2_IER (AT91_CAST(AT91_REG *) 0x400800A4) // (TC2) Interrupt Enable Register #define AT91C_TC2_IDR (AT91_CAST(AT91_REG *) 0x400800A8) // (TC2) Interrupt Disable Register // ========== Register definition for TCB0 peripheral ========== #define AT91C_TCB0_BCR (AT91_CAST(AT91_REG *) 0x400800C0) // (TCB0) TC Block Control Register #define AT91C_TCB0_IPNAME2 (AT91_CAST(AT91_REG *) 0x400800F4) // (TCB0) TC IPNAME2 REGISTER #define AT91C_TCB0_IPNAME1 (AT91_CAST(AT91_REG *) 0x400800F0) // (TCB0) TC IPNAME1 REGISTER #define AT91C_TCB0_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400800EC) // (TCB0) TC ADDRSIZE REGISTER #define AT91C_TCB0_FEATURES (AT91_CAST(AT91_REG *) 0x400800F8) // (TCB0) TC FEATURES REGISTER #define AT91C_TCB0_BMR (AT91_CAST(AT91_REG *) 0x400800C4) // (TCB0) TC Block Mode Register #define AT91C_TCB0_VER (AT91_CAST(AT91_REG *) 0x400800FC) // (TCB0) Version Register // ========== Register definition for TCB1 peripheral ========== #define AT91C_TCB1_BCR (AT91_CAST(AT91_REG *) 0x40080100) // (TCB1) TC Block Control Register #define AT91C_TCB1_VER (AT91_CAST(AT91_REG *) 0x4008013C) // (TCB1) Version Register #define AT91C_TCB1_FEATURES (AT91_CAST(AT91_REG *) 0x40080138) // (TCB1) TC FEATURES REGISTER #define AT91C_TCB1_IPNAME2 (AT91_CAST(AT91_REG *) 0x40080134) // (TCB1) TC IPNAME2 REGISTER #define AT91C_TCB1_BMR (AT91_CAST(AT91_REG *) 0x40080104) // (TCB1) TC Block Mode Register #define AT91C_TCB1_ADDRSIZE (AT91_CAST(AT91_REG *) 0x4008012C) // (TCB1) TC ADDRSIZE REGISTER #define AT91C_TCB1_IPNAME1 (AT91_CAST(AT91_REG *) 0x40080130) // (TCB1) TC IPNAME1 REGISTER // ========== Register definition for TCB2 peripheral ========== #define AT91C_TCB2_FEATURES (AT91_CAST(AT91_REG *) 0x40080178) // (TCB2) TC FEATURES REGISTER #define AT91C_TCB2_VER (AT91_CAST(AT91_REG *) 0x4008017C) // (TCB2) Version Register #define AT91C_TCB2_ADDRSIZE (AT91_CAST(AT91_REG *) 0x4008016C) // (TCB2) TC ADDRSIZE REGISTER #define AT91C_TCB2_IPNAME1 (AT91_CAST(AT91_REG *) 0x40080170) // (TCB2) TC IPNAME1 REGISTER #define AT91C_TCB2_IPNAME2 (AT91_CAST(AT91_REG *) 0x40080174) // (TCB2) TC IPNAME2 REGISTER #define AT91C_TCB2_BMR (AT91_CAST(AT91_REG *) 0x40080144) // (TCB2) TC Block Mode Register #define AT91C_TCB2_BCR (AT91_CAST(AT91_REG *) 0x40080140) // (TCB2) TC Block Control Register // ========== Register definition for EFC0 peripheral ========== #define AT91C_EFC0_FCR (AT91_CAST(AT91_REG *) 0x400E0804) // (EFC0) EFC Flash Command Register #define AT91C_EFC0_FRR (AT91_CAST(AT91_REG *) 0x400E080C) // (EFC0) EFC Flash Result Register #define AT91C_EFC0_FMR (AT91_CAST(AT91_REG *) 0x400E0800) // (EFC0) EFC Flash Mode Register #define AT91C_EFC0_FSR (AT91_CAST(AT91_REG *) 0x400E0808) // (EFC0) EFC Flash Status Register #define AT91C_EFC0_FVR (AT91_CAST(AT91_REG *) 0x400E0814) // (EFC0) EFC Flash Version Register // ========== Register definition for EFC1 peripheral ========== #define AT91C_EFC1_FMR (AT91_CAST(AT91_REG *) 0x400E0A00) // (EFC1) EFC Flash Mode Register #define AT91C_EFC1_FVR (AT91_CAST(AT91_REG *) 0x400E0A14) // (EFC1) EFC Flash Version Register #define AT91C_EFC1_FSR (AT91_CAST(AT91_REG *) 0x400E0A08) // (EFC1) EFC Flash Status Register #define AT91C_EFC1_FCR (AT91_CAST(AT91_REG *) 0x400E0A04) // (EFC1) EFC Flash Command Register #define AT91C_EFC1_FRR (AT91_CAST(AT91_REG *) 0x400E0A0C) // (EFC1) EFC Flash Result Register // ========== Register definition for MCI0 peripheral ========== #define AT91C_MCI0_DMA (AT91_CAST(AT91_REG *) 0x40000050) // (MCI0) MCI DMA Configuration Register #define AT91C_MCI0_SDCR (AT91_CAST(AT91_REG *) 0x4000000C) // (MCI0) MCI SD/SDIO Card Register #define AT91C_MCI0_IPNAME1 (AT91_CAST(AT91_REG *) 0x400000F0) // (MCI0) MCI IPNAME1 REGISTER #define AT91C_MCI0_CSTOR (AT91_CAST(AT91_REG *) 0x4000001C) // (MCI0) MCI Completion Signal Timeout Register #define AT91C_MCI0_RDR (AT91_CAST(AT91_REG *) 0x40000030) // (MCI0) MCI Receive Data Register #define AT91C_MCI0_CMDR (AT91_CAST(AT91_REG *) 0x40000014) // (MCI0) MCI Command Register #define AT91C_MCI0_IDR (AT91_CAST(AT91_REG *) 0x40000048) // (MCI0) MCI Interrupt Disable Register #define AT91C_MCI0_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400000EC) // (MCI0) MCI ADDRSIZE REGISTER #define AT91C_MCI0_WPCR (AT91_CAST(AT91_REG *) 0x400000E4) // (MCI0) MCI Write Protection Control Register #define AT91C_MCI0_RSPR (AT91_CAST(AT91_REG *) 0x40000020) // (MCI0) MCI Response Register #define AT91C_MCI0_IPNAME2 (AT91_CAST(AT91_REG *) 0x400000F4) // (MCI0) MCI IPNAME2 REGISTER #define AT91C_MCI0_CR (AT91_CAST(AT91_REG *) 0x40000000) // (MCI0) MCI Control Register #define AT91C_MCI0_IMR (AT91_CAST(AT91_REG *) 0x4000004C) // (MCI0) MCI Interrupt Mask Register #define AT91C_MCI0_WPSR (AT91_CAST(AT91_REG *) 0x400000E8) // (MCI0) MCI Write Protection Status Register #define AT91C_MCI0_DTOR (AT91_CAST(AT91_REG *) 0x40000008) // (MCI0) MCI Data Timeout Register #define AT91C_MCI0_MR (AT91_CAST(AT91_REG *) 0x40000004) // (MCI0) MCI Mode Register #define AT91C_MCI0_SR (AT91_CAST(AT91_REG *) 0x40000040) // (MCI0) MCI Status Register #define AT91C_MCI0_IER (AT91_CAST(AT91_REG *) 0x40000044) // (MCI0) MCI Interrupt Enable Register #define AT91C_MCI0_VER (AT91_CAST(AT91_REG *) 0x400000FC) // (MCI0) MCI VERSION REGISTER #define AT91C_MCI0_FEATURES (AT91_CAST(AT91_REG *) 0x400000F8) // (MCI0) MCI FEATURES REGISTER #define AT91C_MCI0_BLKR (AT91_CAST(AT91_REG *) 0x40000018) // (MCI0) MCI Block Register #define AT91C_MCI0_ARGR (AT91_CAST(AT91_REG *) 0x40000010) // (MCI0) MCI Argument Register #define AT91C_MCI0_FIFO (AT91_CAST(AT91_REG *) 0x40000200) // (MCI0) MCI FIFO Aperture Register #define AT91C_MCI0_TDR (AT91_CAST(AT91_REG *) 0x40000034) // (MCI0) MCI Transmit Data Register #define AT91C_MCI0_CFG (AT91_CAST(AT91_REG *) 0x40000054) // (MCI0) MCI Configuration Register // ========== Register definition for PDC_TWI0 peripheral ========== #define AT91C_TWI0_TNCR (AT91_CAST(AT91_REG *) 0x4008411C) // (PDC_TWI0) Transmit Next Counter Register #define AT91C_TWI0_PTCR (AT91_CAST(AT91_REG *) 0x40084120) // (PDC_TWI0) PDC Transfer Control Register #define AT91C_TWI0_PTSR (AT91_CAST(AT91_REG *) 0x40084124) // (PDC_TWI0) PDC Transfer Status Register #define AT91C_TWI0_RCR (AT91_CAST(AT91_REG *) 0x40084104) // (PDC_TWI0) Receive Counter Register #define AT91C_TWI0_TNPR (AT91_CAST(AT91_REG *) 0x40084118) // (PDC_TWI0) Transmit Next Pointer Register #define AT91C_TWI0_RNPR (AT91_CAST(AT91_REG *) 0x40084110) // (PDC_TWI0) Receive Next Pointer Register #define AT91C_TWI0_RPR (AT91_CAST(AT91_REG *) 0x40084100) // (PDC_TWI0) Receive Pointer Register #define AT91C_TWI0_RNCR (AT91_CAST(AT91_REG *) 0x40084114) // (PDC_TWI0) Receive Next Counter Register #define AT91C_TWI0_TPR (AT91_CAST(AT91_REG *) 0x40084108) // (PDC_TWI0) Transmit Pointer Register #define AT91C_TWI0_TCR (AT91_CAST(AT91_REG *) 0x4008410C) // (PDC_TWI0) Transmit Counter Register // ========== Register definition for PDC_TWI1 peripheral ========== #define AT91C_TWI1_TNCR (AT91_CAST(AT91_REG *) 0x4008811C) // (PDC_TWI1) Transmit Next Counter Register #define AT91C_TWI1_PTCR (AT91_CAST(AT91_REG *) 0x40088120) // (PDC_TWI1) PDC Transfer Control Register #define AT91C_TWI1_RNCR (AT91_CAST(AT91_REG *) 0x40088114) // (PDC_TWI1) Receive Next Counter Register #define AT91C_TWI1_RCR (AT91_CAST(AT91_REG *) 0x40088104) // (PDC_TWI1) Receive Counter Register #define AT91C_TWI1_RPR (AT91_CAST(AT91_REG *) 0x40088100) // (PDC_TWI1) Receive Pointer Register #define AT91C_TWI1_TNPR (AT91_CAST(AT91_REG *) 0x40088118) // (PDC_TWI1) Transmit Next Pointer Register #define AT91C_TWI1_RNPR (AT91_CAST(AT91_REG *) 0x40088110) // (PDC_TWI1) Receive Next Pointer Register #define AT91C_TWI1_TCR (AT91_CAST(AT91_REG *) 0x4008810C) // (PDC_TWI1) Transmit Counter Register #define AT91C_TWI1_TPR (AT91_CAST(AT91_REG *) 0x40088108) // (PDC_TWI1) Transmit Pointer Register #define AT91C_TWI1_PTSR (AT91_CAST(AT91_REG *) 0x40088124) // (PDC_TWI1) PDC Transfer Status Register // ========== Register definition for TWI0 peripheral ========== #define AT91C_TWI0_FEATURES (AT91_CAST(AT91_REG *) 0x400840F8) // (TWI0) TWI FEATURES REGISTER #define AT91C_TWI0_IPNAME1 (AT91_CAST(AT91_REG *) 0x400840F0) // (TWI0) TWI IPNAME1 REGISTER #define AT91C_TWI0_SMR (AT91_CAST(AT91_REG *) 0x40084008) // (TWI0) Slave Mode Register #define AT91C_TWI0_MMR (AT91_CAST(AT91_REG *) 0x40084004) // (TWI0) Master Mode Register #define AT91C_TWI0_SR (AT91_CAST(AT91_REG *) 0x40084020) // (TWI0) Status Register #define AT91C_TWI0_IPNAME2 (AT91_CAST(AT91_REG *) 0x400840F4) // (TWI0) TWI IPNAME2 REGISTER #define AT91C_TWI0_CR (AT91_CAST(AT91_REG *) 0x40084000) // (TWI0) Control Register #define AT91C_TWI0_IER (AT91_CAST(AT91_REG *) 0x40084024) // (TWI0) Interrupt Enable Register #define AT91C_TWI0_RHR (AT91_CAST(AT91_REG *) 0x40084030) // (TWI0) Receive Holding Register #define AT91C_TWI0_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400840EC) // (TWI0) TWI ADDRSIZE REGISTER #define AT91C_TWI0_THR (AT91_CAST(AT91_REG *) 0x40084034) // (TWI0) Transmit Holding Register #define AT91C_TWI0_VER (AT91_CAST(AT91_REG *) 0x400840FC) // (TWI0) Version Register #define AT91C_TWI0_IADR (AT91_CAST(AT91_REG *) 0x4008400C) // (TWI0) Internal Address Register #define AT91C_TWI0_IMR (AT91_CAST(AT91_REG *) 0x4008402C) // (TWI0) Interrupt Mask Register #define AT91C_TWI0_CWGR (AT91_CAST(AT91_REG *) 0x40084010) // (TWI0) Clock Waveform Generator Register #define AT91C_TWI0_IDR (AT91_CAST(AT91_REG *) 0x40084028) // (TWI0) Interrupt Disable Register // ========== Register definition for TWI1 peripheral ========== #define AT91C_TWI1_VER (AT91_CAST(AT91_REG *) 0x400880FC) // (TWI1) Version Register #define AT91C_TWI1_IDR (AT91_CAST(AT91_REG *) 0x40088028) // (TWI1) Interrupt Disable Register #define AT91C_TWI1_IPNAME2 (AT91_CAST(AT91_REG *) 0x400880F4) // (TWI1) TWI IPNAME2 REGISTER #define AT91C_TWI1_CWGR (AT91_CAST(AT91_REG *) 0x40088010) // (TWI1) Clock Waveform Generator Register #define AT91C_TWI1_CR (AT91_CAST(AT91_REG *) 0x40088000) // (TWI1) Control Register #define AT91C_TWI1_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400880EC) // (TWI1) TWI ADDRSIZE REGISTER #define AT91C_TWI1_IADR (AT91_CAST(AT91_REG *) 0x4008800C) // (TWI1) Internal Address Register #define AT91C_TWI1_IER (AT91_CAST(AT91_REG *) 0x40088024) // (TWI1) Interrupt Enable Register #define AT91C_TWI1_SMR (AT91_CAST(AT91_REG *) 0x40088008) // (TWI1) Slave Mode Register #define AT91C_TWI1_RHR (AT91_CAST(AT91_REG *) 0x40088030) // (TWI1) Receive Holding Register #define AT91C_TWI1_FEATURES (AT91_CAST(AT91_REG *) 0x400880F8) // (TWI1) TWI FEATURES REGISTER #define AT91C_TWI1_IMR (AT91_CAST(AT91_REG *) 0x4008802C) // (TWI1) Interrupt Mask Register #define AT91C_TWI1_SR (AT91_CAST(AT91_REG *) 0x40088020) // (TWI1) Status Register #define AT91C_TWI1_THR (AT91_CAST(AT91_REG *) 0x40088034) // (TWI1) Transmit Holding Register #define AT91C_TWI1_MMR (AT91_CAST(AT91_REG *) 0x40088004) // (TWI1) Master Mode Register #define AT91C_TWI1_IPNAME1 (AT91_CAST(AT91_REG *) 0x400880F0) // (TWI1) TWI IPNAME1 REGISTER // ========== Register definition for PDC_US0 peripheral ========== #define AT91C_US0_RNCR (AT91_CAST(AT91_REG *) 0x40090114) // (PDC_US0) Receive Next Counter Register #define AT91C_US0_TNPR (AT91_CAST(AT91_REG *) 0x40090118) // (PDC_US0) Transmit Next Pointer Register #define AT91C_US0_TPR (AT91_CAST(AT91_REG *) 0x40090108) // (PDC_US0) Transmit Pointer Register #define AT91C_US0_RCR (AT91_CAST(AT91_REG *) 0x40090104) // (PDC_US0) Receive Counter Register #define AT91C_US0_RNPR (AT91_CAST(AT91_REG *) 0x40090110) // (PDC_US0) Receive Next Pointer Register #define AT91C_US0_TNCR (AT91_CAST(AT91_REG *) 0x4009011C) // (PDC_US0) Transmit Next Counter Register #define AT91C_US0_PTSR (AT91_CAST(AT91_REG *) 0x40090124) // (PDC_US0) PDC Transfer Status Register #define AT91C_US0_RPR (AT91_CAST(AT91_REG *) 0x40090100) // (PDC_US0) Receive Pointer Register #define AT91C_US0_PTCR (AT91_CAST(AT91_REG *) 0x40090120) // (PDC_US0) PDC Transfer Control Register #define AT91C_US0_TCR (AT91_CAST(AT91_REG *) 0x4009010C) // (PDC_US0) Transmit Counter Register // ========== Register definition for US0 peripheral ========== #define AT91C_US0_NER (AT91_CAST(AT91_REG *) 0x40090044) // (US0) Nb Errors Register #define AT91C_US0_RHR (AT91_CAST(AT91_REG *) 0x40090018) // (US0) Receiver Holding Register #define AT91C_US0_IPNAME1 (AT91_CAST(AT91_REG *) 0x400900F0) // (US0) US IPNAME1 REGISTER #define AT91C_US0_MR (AT91_CAST(AT91_REG *) 0x40090004) // (US0) Mode Register #define AT91C_US0_RTOR (AT91_CAST(AT91_REG *) 0x40090024) // (US0) Receiver Time-out Register #define AT91C_US0_IF (AT91_CAST(AT91_REG *) 0x4009004C) // (US0) IRDA_FILTER Register #define AT91C_US0_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400900EC) // (US0) US ADDRSIZE REGISTER #define AT91C_US0_IDR (AT91_CAST(AT91_REG *) 0x4009000C) // (US0) Interrupt Disable Register #define AT91C_US0_IMR (AT91_CAST(AT91_REG *) 0x40090010) // (US0) Interrupt Mask Register #define AT91C_US0_IER (AT91_CAST(AT91_REG *) 0x40090008) // (US0) Interrupt Enable Register #define AT91C_US0_TTGR (AT91_CAST(AT91_REG *) 0x40090028) // (US0) Transmitter Time-guard Register #define AT91C_US0_IPNAME2 (AT91_CAST(AT91_REG *) 0x400900F4) // (US0) US IPNAME2 REGISTER #define AT91C_US0_FIDI (AT91_CAST(AT91_REG *) 0x40090040) // (US0) FI_DI_Ratio Register #define AT91C_US0_CR (AT91_CAST(AT91_REG *) 0x40090000) // (US0) Control Register #define AT91C_US0_BRGR (AT91_CAST(AT91_REG *) 0x40090020) // (US0) Baud Rate Generator Register #define AT91C_US0_MAN (AT91_CAST(AT91_REG *) 0x40090050) // (US0) Manchester Encoder Decoder Register #define AT91C_US0_VER (AT91_CAST(AT91_REG *) 0x400900FC) // (US0) VERSION Register #define AT91C_US0_FEATURES (AT91_CAST(AT91_REG *) 0x400900F8) // (US0) US FEATURES REGISTER #define AT91C_US0_CSR (AT91_CAST(AT91_REG *) 0x40090014) // (US0) Channel Status Register #define AT91C_US0_THR (AT91_CAST(AT91_REG *) 0x4009001C) // (US0) Transmitter Holding Register // ========== Register definition for PDC_US1 peripheral ========== #define AT91C_US1_TNPR (AT91_CAST(AT91_REG *) 0x40094118) // (PDC_US1) Transmit Next Pointer Register #define AT91C_US1_TPR (AT91_CAST(AT91_REG *) 0x40094108) // (PDC_US1) Transmit Pointer Register #define AT91C_US1_RNCR (AT91_CAST(AT91_REG *) 0x40094114) // (PDC_US1) Receive Next Counter Register #define AT91C_US1_TNCR (AT91_CAST(AT91_REG *) 0x4009411C) // (PDC_US1) Transmit Next Counter Register #define AT91C_US1_RNPR (AT91_CAST(AT91_REG *) 0x40094110) // (PDC_US1) Receive Next Pointer Register #define AT91C_US1_TCR (AT91_CAST(AT91_REG *) 0x4009410C) // (PDC_US1) Transmit Counter Register #define AT91C_US1_PTSR (AT91_CAST(AT91_REG *) 0x40094124) // (PDC_US1) PDC Transfer Status Register #define AT91C_US1_RCR (AT91_CAST(AT91_REG *) 0x40094104) // (PDC_US1) Receive Counter Register #define AT91C_US1_RPR (AT91_CAST(AT91_REG *) 0x40094100) // (PDC_US1) Receive Pointer Register #define AT91C_US1_PTCR (AT91_CAST(AT91_REG *) 0x40094120) // (PDC_US1) PDC Transfer Control Register // ========== Register definition for US1 peripheral ========== #define AT91C_US1_IMR (AT91_CAST(AT91_REG *) 0x40094010) // (US1) Interrupt Mask Register #define AT91C_US1_RTOR (AT91_CAST(AT91_REG *) 0x40094024) // (US1) Receiver Time-out Register #define AT91C_US1_RHR (AT91_CAST(AT91_REG *) 0x40094018) // (US1) Receiver Holding Register #define AT91C_US1_IPNAME1 (AT91_CAST(AT91_REG *) 0x400940F0) // (US1) US IPNAME1 REGISTER #define AT91C_US1_VER (AT91_CAST(AT91_REG *) 0x400940FC) // (US1) VERSION Register #define AT91C_US1_MR (AT91_CAST(AT91_REG *) 0x40094004) // (US1) Mode Register #define AT91C_US1_FEATURES (AT91_CAST(AT91_REG *) 0x400940F8) // (US1) US FEATURES REGISTER #define AT91C_US1_NER (AT91_CAST(AT91_REG *) 0x40094044) // (US1) Nb Errors Register #define AT91C_US1_IPNAME2 (AT91_CAST(AT91_REG *) 0x400940F4) // (US1) US IPNAME2 REGISTER #define AT91C_US1_CR (AT91_CAST(AT91_REG *) 0x40094000) // (US1) Control Register #define AT91C_US1_BRGR (AT91_CAST(AT91_REG *) 0x40094020) // (US1) Baud Rate Generator Register #define AT91C_US1_IF (AT91_CAST(AT91_REG *) 0x4009404C) // (US1) IRDA_FILTER Register #define AT91C_US1_IER (AT91_CAST(AT91_REG *) 0x40094008) // (US1) Interrupt Enable Register #define AT91C_US1_TTGR (AT91_CAST(AT91_REG *) 0x40094028) // (US1) Transmitter Time-guard Register #define AT91C_US1_FIDI (AT91_CAST(AT91_REG *) 0x40094040) // (US1) FI_DI_Ratio Register #define AT91C_US1_MAN (AT91_CAST(AT91_REG *) 0x40094050) // (US1) Manchester Encoder Decoder Register #define AT91C_US1_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400940EC) // (US1) US ADDRSIZE REGISTER #define AT91C_US1_CSR (AT91_CAST(AT91_REG *) 0x40094014) // (US1) Channel Status Register #define AT91C_US1_THR (AT91_CAST(AT91_REG *) 0x4009401C) // (US1) Transmitter Holding Register #define AT91C_US1_IDR (AT91_CAST(AT91_REG *) 0x4009400C) // (US1) Interrupt Disable Register // ========== Register definition for PDC_US2 peripheral ========== #define AT91C_US2_RPR (AT91_CAST(AT91_REG *) 0x40098100) // (PDC_US2) Receive Pointer Register #define AT91C_US2_TPR (AT91_CAST(AT91_REG *) 0x40098108) // (PDC_US2) Transmit Pointer Register #define AT91C_US2_TCR (AT91_CAST(AT91_REG *) 0x4009810C) // (PDC_US2) Transmit Counter Register #define AT91C_US2_PTSR (AT91_CAST(AT91_REG *) 0x40098124) // (PDC_US2) PDC Transfer Status Register #define AT91C_US2_PTCR (AT91_CAST(AT91_REG *) 0x40098120) // (PDC_US2) PDC Transfer Control Register #define AT91C_US2_RNPR (AT91_CAST(AT91_REG *) 0x40098110) // (PDC_US2) Receive Next Pointer Register #define AT91C_US2_TNCR (AT91_CAST(AT91_REG *) 0x4009811C) // (PDC_US2) Transmit Next Counter Register #define AT91C_US2_RNCR (AT91_CAST(AT91_REG *) 0x40098114) // (PDC_US2) Receive Next Counter Register #define AT91C_US2_TNPR (AT91_CAST(AT91_REG *) 0x40098118) // (PDC_US2) Transmit Next Pointer Register #define AT91C_US2_RCR (AT91_CAST(AT91_REG *) 0x40098104) // (PDC_US2) Receive Counter Register // ========== Register definition for US2 peripheral ========== #define AT91C_US2_MAN (AT91_CAST(AT91_REG *) 0x40098050) // (US2) Manchester Encoder Decoder Register #define AT91C_US2_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400980EC) // (US2) US ADDRSIZE REGISTER #define AT91C_US2_MR (AT91_CAST(AT91_REG *) 0x40098004) // (US2) Mode Register #define AT91C_US2_IPNAME1 (AT91_CAST(AT91_REG *) 0x400980F0) // (US2) US IPNAME1 REGISTER #define AT91C_US2_IF (AT91_CAST(AT91_REG *) 0x4009804C) // (US2) IRDA_FILTER Register #define AT91C_US2_BRGR (AT91_CAST(AT91_REG *) 0x40098020) // (US2) Baud Rate Generator Register #define AT91C_US2_FIDI (AT91_CAST(AT91_REG *) 0x40098040) // (US2) FI_DI_Ratio Register #define AT91C_US2_IER (AT91_CAST(AT91_REG *) 0x40098008) // (US2) Interrupt Enable Register #define AT91C_US2_RTOR (AT91_CAST(AT91_REG *) 0x40098024) // (US2) Receiver Time-out Register #define AT91C_US2_CR (AT91_CAST(AT91_REG *) 0x40098000) // (US2) Control Register #define AT91C_US2_THR (AT91_CAST(AT91_REG *) 0x4009801C) // (US2) Transmitter Holding Register #define AT91C_US2_CSR (AT91_CAST(AT91_REG *) 0x40098014) // (US2) Channel Status Register #define AT91C_US2_VER (AT91_CAST(AT91_REG *) 0x400980FC) // (US2) VERSION Register #define AT91C_US2_FEATURES (AT91_CAST(AT91_REG *) 0x400980F8) // (US2) US FEATURES REGISTER #define AT91C_US2_IDR (AT91_CAST(AT91_REG *) 0x4009800C) // (US2) Interrupt Disable Register #define AT91C_US2_TTGR (AT91_CAST(AT91_REG *) 0x40098028) // (US2) Transmitter Time-guard Register #define AT91C_US2_IPNAME2 (AT91_CAST(AT91_REG *) 0x400980F4) // (US2) US IPNAME2 REGISTER #define AT91C_US2_RHR (AT91_CAST(AT91_REG *) 0x40098018) // (US2) Receiver Holding Register #define AT91C_US2_NER (AT91_CAST(AT91_REG *) 0x40098044) // (US2) Nb Errors Register #define AT91C_US2_IMR (AT91_CAST(AT91_REG *) 0x40098010) // (US2) Interrupt Mask Register // ========== Register definition for PDC_US3 peripheral ========== #define AT91C_US3_TPR (AT91_CAST(AT91_REG *) 0x4009C108) // (PDC_US3) Transmit Pointer Register #define AT91C_US3_PTCR (AT91_CAST(AT91_REG *) 0x4009C120) // (PDC_US3) PDC Transfer Control Register #define AT91C_US3_TCR (AT91_CAST(AT91_REG *) 0x4009C10C) // (PDC_US3) Transmit Counter Register #define AT91C_US3_RCR (AT91_CAST(AT91_REG *) 0x4009C104) // (PDC_US3) Receive Counter Register #define AT91C_US3_RNCR (AT91_CAST(AT91_REG *) 0x4009C114) // (PDC_US3) Receive Next Counter Register #define AT91C_US3_RNPR (AT91_CAST(AT91_REG *) 0x4009C110) // (PDC_US3) Receive Next Pointer Register #define AT91C_US3_RPR (AT91_CAST(AT91_REG *) 0x4009C100) // (PDC_US3) Receive Pointer Register #define AT91C_US3_PTSR (AT91_CAST(AT91_REG *) 0x4009C124) // (PDC_US3) PDC Transfer Status Register #define AT91C_US3_TNCR (AT91_CAST(AT91_REG *) 0x4009C11C) // (PDC_US3) Transmit Next Counter Register #define AT91C_US3_TNPR (AT91_CAST(AT91_REG *) 0x4009C118) // (PDC_US3) Transmit Next Pointer Register // ========== Register definition for US3 peripheral ========== #define AT91C_US3_MAN (AT91_CAST(AT91_REG *) 0x4009C050) // (US3) Manchester Encoder Decoder Register #define AT91C_US3_CSR (AT91_CAST(AT91_REG *) 0x4009C014) // (US3) Channel Status Register #define AT91C_US3_BRGR (AT91_CAST(AT91_REG *) 0x4009C020) // (US3) Baud Rate Generator Register #define AT91C_US3_IPNAME2 (AT91_CAST(AT91_REG *) 0x4009C0F4) // (US3) US IPNAME2 REGISTER #define AT91C_US3_RTOR (AT91_CAST(AT91_REG *) 0x4009C024) // (US3) Receiver Time-out Register #define AT91C_US3_ADDRSIZE (AT91_CAST(AT91_REG *) 0x4009C0EC) // (US3) US ADDRSIZE REGISTER #define AT91C_US3_CR (AT91_CAST(AT91_REG *) 0x4009C000) // (US3) Control Register #define AT91C_US3_IF (AT91_CAST(AT91_REG *) 0x4009C04C) // (US3) IRDA_FILTER Register #define AT91C_US3_FEATURES (AT91_CAST(AT91_REG *) 0x4009C0F8) // (US3) US FEATURES REGISTER #define AT91C_US3_VER (AT91_CAST(AT91_REG *) 0x4009C0FC) // (US3) VERSION Register #define AT91C_US3_RHR (AT91_CAST(AT91_REG *) 0x4009C018) // (US3) Receiver Holding Register #define AT91C_US3_TTGR (AT91_CAST(AT91_REG *) 0x4009C028) // (US3) Transmitter Time-guard Register #define AT91C_US3_NER (AT91_CAST(AT91_REG *) 0x4009C044) // (US3) Nb Errors Register #define AT91C_US3_IMR (AT91_CAST(AT91_REG *) 0x4009C010) // (US3) Interrupt Mask Register #define AT91C_US3_THR (AT91_CAST(AT91_REG *) 0x4009C01C) // (US3) Transmitter Holding Register #define AT91C_US3_IDR (AT91_CAST(AT91_REG *) 0x4009C00C) // (US3) Interrupt Disable Register #define AT91C_US3_MR (AT91_CAST(AT91_REG *) 0x4009C004) // (US3) Mode Register #define AT91C_US3_IER (AT91_CAST(AT91_REG *) 0x4009C008) // (US3) Interrupt Enable Register #define AT91C_US3_FIDI (AT91_CAST(AT91_REG *) 0x4009C040) // (US3) FI_DI_Ratio Register #define AT91C_US3_IPNAME1 (AT91_CAST(AT91_REG *) 0x4009C0F0) // (US3) US IPNAME1 REGISTER // ========== Register definition for PDC_SSC0 peripheral ========== #define AT91C_SSC0_RNCR (AT91_CAST(AT91_REG *) 0x40004114) // (PDC_SSC0) Receive Next Counter Register #define AT91C_SSC0_TPR (AT91_CAST(AT91_REG *) 0x40004108) // (PDC_SSC0) Transmit Pointer Register #define AT91C_SSC0_TCR (AT91_CAST(AT91_REG *) 0x4000410C) // (PDC_SSC0) Transmit Counter Register #define AT91C_SSC0_PTCR (AT91_CAST(AT91_REG *) 0x40004120) // (PDC_SSC0) PDC Transfer Control Register #define AT91C_SSC0_TNPR (AT91_CAST(AT91_REG *) 0x40004118) // (PDC_SSC0) Transmit Next Pointer Register #define AT91C_SSC0_RPR (AT91_CAST(AT91_REG *) 0x40004100) // (PDC_SSC0) Receive Pointer Register #define AT91C_SSC0_TNCR (AT91_CAST(AT91_REG *) 0x4000411C) // (PDC_SSC0) Transmit Next Counter Register #define AT91C_SSC0_RNPR (AT91_CAST(AT91_REG *) 0x40004110) // (PDC_SSC0) Receive Next Pointer Register #define AT91C_SSC0_RCR (AT91_CAST(AT91_REG *) 0x40004104) // (PDC_SSC0) Receive Counter Register #define AT91C_SSC0_PTSR (AT91_CAST(AT91_REG *) 0x40004124) // (PDC_SSC0) PDC Transfer Status Register // ========== Register definition for SSC0 peripheral ========== #define AT91C_SSC0_CR (AT91_CAST(AT91_REG *) 0x40004000) // (SSC0) Control Register #define AT91C_SSC0_RHR (AT91_CAST(AT91_REG *) 0x40004020) // (SSC0) Receive Holding Register #define AT91C_SSC0_TSHR (AT91_CAST(AT91_REG *) 0x40004034) // (SSC0) Transmit Sync Holding Register #define AT91C_SSC0_RFMR (AT91_CAST(AT91_REG *) 0x40004014) // (SSC0) Receive Frame Mode Register #define AT91C_SSC0_IDR (AT91_CAST(AT91_REG *) 0x40004048) // (SSC0) Interrupt Disable Register #define AT91C_SSC0_TFMR (AT91_CAST(AT91_REG *) 0x4000401C) // (SSC0) Transmit Frame Mode Register #define AT91C_SSC0_RSHR (AT91_CAST(AT91_REG *) 0x40004030) // (SSC0) Receive Sync Holding Register #define AT91C_SSC0_RC1R (AT91_CAST(AT91_REG *) 0x4000403C) // (SSC0) Receive Compare 1 Register #define AT91C_SSC0_TCMR (AT91_CAST(AT91_REG *) 0x40004018) // (SSC0) Transmit Clock Mode Register #define AT91C_SSC0_RCMR (AT91_CAST(AT91_REG *) 0x40004010) // (SSC0) Receive Clock ModeRegister #define AT91C_SSC0_SR (AT91_CAST(AT91_REG *) 0x40004040) // (SSC0) Status Register #define AT91C_SSC0_RC0R (AT91_CAST(AT91_REG *) 0x40004038) // (SSC0) Receive Compare 0 Register #define AT91C_SSC0_THR (AT91_CAST(AT91_REG *) 0x40004024) // (SSC0) Transmit Holding Register #define AT91C_SSC0_CMR (AT91_CAST(AT91_REG *) 0x40004004) // (SSC0) Clock Mode Register #define AT91C_SSC0_IER (AT91_CAST(AT91_REG *) 0x40004044) // (SSC0) Interrupt Enable Register #define AT91C_SSC0_IMR (AT91_CAST(AT91_REG *) 0x4000404C) // (SSC0) Interrupt Mask Register // ========== Register definition for PDC_PWMC peripheral ========== #define AT91C_PWMC_TNCR (AT91_CAST(AT91_REG *) 0x4008C11C) // (PDC_PWMC) Transmit Next Counter Register #define AT91C_PWMC_TPR (AT91_CAST(AT91_REG *) 0x4008C108) // (PDC_PWMC) Transmit Pointer Register #define AT91C_PWMC_RPR (AT91_CAST(AT91_REG *) 0x4008C100) // (PDC_PWMC) Receive Pointer Register #define AT91C_PWMC_TCR (AT91_CAST(AT91_REG *) 0x4008C10C) // (PDC_PWMC) Transmit Counter Register #define AT91C_PWMC_PTSR (AT91_CAST(AT91_REG *) 0x4008C124) // (PDC_PWMC) PDC Transfer Status Register #define AT91C_PWMC_RNPR (AT91_CAST(AT91_REG *) 0x4008C110) // (PDC_PWMC) Receive Next Pointer Register #define AT91C_PWMC_RCR (AT91_CAST(AT91_REG *) 0x4008C104) // (PDC_PWMC) Receive Counter Register #define AT91C_PWMC_RNCR (AT91_CAST(AT91_REG *) 0x4008C114) // (PDC_PWMC) Receive Next Counter Register #define AT91C_PWMC_PTCR (AT91_CAST(AT91_REG *) 0x4008C120) // (PDC_PWMC) PDC Transfer Control Register #define AT91C_PWMC_TNPR (AT91_CAST(AT91_REG *) 0x4008C118) // (PDC_PWMC) Transmit Next Pointer Register // ========== Register definition for PWMC_CH0 peripheral ========== #define AT91C_PWMC_CH0_DTR (AT91_CAST(AT91_REG *) 0x4008C218) // (PWMC_CH0) Channel Dead Time Value Register #define AT91C_PWMC_CH0_CMR (AT91_CAST(AT91_REG *) 0x4008C200) // (PWMC_CH0) Channel Mode Register #define AT91C_PWMC_CH0_CCNTR (AT91_CAST(AT91_REG *) 0x4008C214) // (PWMC_CH0) Channel Counter Register #define AT91C_PWMC_CH0_CPRDR (AT91_CAST(AT91_REG *) 0x4008C20C) // (PWMC_CH0) Channel Period Register #define AT91C_PWMC_CH0_DTUPDR (AT91_CAST(AT91_REG *) 0x4008C21C) // (PWMC_CH0) Channel Dead Time Update Value Register #define AT91C_PWMC_CH0_CPRDUPDR (AT91_CAST(AT91_REG *) 0x4008C210) // (PWMC_CH0) Channel Period Update Register #define AT91C_PWMC_CH0_CDTYUPDR (AT91_CAST(AT91_REG *) 0x4008C208) // (PWMC_CH0) Channel Duty Cycle Update Register #define AT91C_PWMC_CH0_CDTYR (AT91_CAST(AT91_REG *) 0x4008C204) // (PWMC_CH0) Channel Duty Cycle Register // ========== Register definition for PWMC_CH1 peripheral ========== #define AT91C_PWMC_CH1_CCNTR (AT91_CAST(AT91_REG *) 0x4008C234) // (PWMC_CH1) Channel Counter Register #define AT91C_PWMC_CH1_DTR (AT91_CAST(AT91_REG *) 0x4008C238) // (PWMC_CH1) Channel Dead Time Value Register #define AT91C_PWMC_CH1_CDTYUPDR (AT91_CAST(AT91_REG *) 0x4008C228) // (PWMC_CH1) Channel Duty Cycle Update Register #define AT91C_PWMC_CH1_DTUPDR (AT91_CAST(AT91_REG *) 0x4008C23C) // (PWMC_CH1) Channel Dead Time Update Value Register #define AT91C_PWMC_CH1_CDTYR (AT91_CAST(AT91_REG *) 0x4008C224) // (PWMC_CH1) Channel Duty Cycle Register #define AT91C_PWMC_CH1_CPRDR (AT91_CAST(AT91_REG *) 0x4008C22C) // (PWMC_CH1) Channel Period Register #define AT91C_PWMC_CH1_CPRDUPDR (AT91_CAST(AT91_REG *) 0x4008C230) // (PWMC_CH1) Channel Period Update Register #define AT91C_PWMC_CH1_CMR (AT91_CAST(AT91_REG *) 0x4008C220) // (PWMC_CH1) Channel Mode Register // ========== Register definition for PWMC_CH2 peripheral ========== #define AT91C_PWMC_CH2_CDTYR (AT91_CAST(AT91_REG *) 0x4008C244) // (PWMC_CH2) Channel Duty Cycle Register #define AT91C_PWMC_CH2_DTUPDR (AT91_CAST(AT91_REG *) 0x4008C25C) // (PWMC_CH2) Channel Dead Time Update Value Register #define AT91C_PWMC_CH2_CCNTR (AT91_CAST(AT91_REG *) 0x4008C254) // (PWMC_CH2) Channel Counter Register #define AT91C_PWMC_CH2_CMR (AT91_CAST(AT91_REG *) 0x4008C240) // (PWMC_CH2) Channel Mode Register #define AT91C_PWMC_CH2_CPRDR (AT91_CAST(AT91_REG *) 0x4008C24C) // (PWMC_CH2) Channel Period Register #define AT91C_PWMC_CH2_CPRDUPDR (AT91_CAST(AT91_REG *) 0x4008C250) // (PWMC_CH2) Channel Period Update Register #define AT91C_PWMC_CH2_CDTYUPDR (AT91_CAST(AT91_REG *) 0x4008C248) // (PWMC_CH2) Channel Duty Cycle Update Register #define AT91C_PWMC_CH2_DTR (AT91_CAST(AT91_REG *) 0x4008C258) // (PWMC_CH2) Channel Dead Time Value Register // ========== Register definition for PWMC_CH3 peripheral ========== #define AT91C_PWMC_CH3_CPRDUPDR (AT91_CAST(AT91_REG *) 0x4008C270) // (PWMC_CH3) Channel Period Update Register #define AT91C_PWMC_CH3_DTR (AT91_CAST(AT91_REG *) 0x4008C278) // (PWMC_CH3) Channel Dead Time Value Register #define AT91C_PWMC_CH3_CDTYR (AT91_CAST(AT91_REG *) 0x4008C264) // (PWMC_CH3) Channel Duty Cycle Register #define AT91C_PWMC_CH3_DTUPDR (AT91_CAST(AT91_REG *) 0x4008C27C) // (PWMC_CH3) Channel Dead Time Update Value Register #define AT91C_PWMC_CH3_CDTYUPDR (AT91_CAST(AT91_REG *) 0x4008C268) // (PWMC_CH3) Channel Duty Cycle Update Register #define AT91C_PWMC_CH3_CCNTR (AT91_CAST(AT91_REG *) 0x4008C274) // (PWMC_CH3) Channel Counter Register #define AT91C_PWMC_CH3_CMR (AT91_CAST(AT91_REG *) 0x4008C260) // (PWMC_CH3) Channel Mode Register #define AT91C_PWMC_CH3_CPRDR (AT91_CAST(AT91_REG *) 0x4008C26C) // (PWMC_CH3) Channel Period Register // ========== Register definition for PWMC peripheral ========== #define AT91C_PWMC_CMP6MUPD (AT91_CAST(AT91_REG *) 0x4008C19C) // (PWMC) PWM Comparison Mode 6 Update Register #define AT91C_PWMC_ISR1 (AT91_CAST(AT91_REG *) 0x4008C01C) // (PWMC) PWMC Interrupt Status Register 1 #define AT91C_PWMC_CMP5V (AT91_CAST(AT91_REG *) 0x4008C180) // (PWMC) PWM Comparison Value 5 Register #define AT91C_PWMC_CMP4MUPD (AT91_CAST(AT91_REG *) 0x4008C17C) // (PWMC) PWM Comparison Mode 4 Update Register #define AT91C_PWMC_FMR (AT91_CAST(AT91_REG *) 0x4008C05C) // (PWMC) PWM Fault Mode Register #define AT91C_PWMC_CMP6V (AT91_CAST(AT91_REG *) 0x4008C190) // (PWMC) PWM Comparison Value 6 Register #define AT91C_PWMC_EL4MR (AT91_CAST(AT91_REG *) 0x4008C08C) // (PWMC) PWM Event Line 4 Mode Register #define AT91C_PWMC_UPCR (AT91_CAST(AT91_REG *) 0x4008C028) // (PWMC) PWM Update Control Register #define AT91C_PWMC_CMP1VUPD (AT91_CAST(AT91_REG *) 0x4008C144) // (PWMC) PWM Comparison Value 1 Update Register #define AT91C_PWMC_CMP0M (AT91_CAST(AT91_REG *) 0x4008C138) // (PWMC) PWM Comparison Mode 0 Register #define AT91C_PWMC_CMP5VUPD (AT91_CAST(AT91_REG *) 0x4008C184) // (PWMC) PWM Comparison Value 5 Update Register #define AT91C_PWMC_FPER3 (AT91_CAST(AT91_REG *) 0x4008C074) // (PWMC) PWM Fault Protection Enable Register 3 #define AT91C_PWMC_OSCUPD (AT91_CAST(AT91_REG *) 0x4008C058) // (PWMC) PWM Output Selection Clear Update Register #define AT91C_PWMC_FPER1 (AT91_CAST(AT91_REG *) 0x4008C06C) // (PWMC) PWM Fault Protection Enable Register 1 #define AT91C_PWMC_SCUPUPD (AT91_CAST(AT91_REG *) 0x4008C030) // (PWMC) PWM Update Period Update Register #define AT91C_PWMC_DIS (AT91_CAST(AT91_REG *) 0x4008C008) // (PWMC) PWMC Disable Register #define AT91C_PWMC_IER1 (AT91_CAST(AT91_REG *) 0x4008C010) // (PWMC) PWMC Interrupt Enable Register 1 #define AT91C_PWMC_IMR2 (AT91_CAST(AT91_REG *) 0x4008C03C) // (PWMC) PWMC Interrupt Mask Register 2 #define AT91C_PWMC_CMP0V (AT91_CAST(AT91_REG *) 0x4008C130) // (PWMC) PWM Comparison Value 0 Register #define AT91C_PWMC_SR (AT91_CAST(AT91_REG *) 0x4008C00C) // (PWMC) PWMC Status Register #define AT91C_PWMC_CMP4M (AT91_CAST(AT91_REG *) 0x4008C178) // (PWMC) PWM Comparison Mode 4 Register #define AT91C_PWMC_CMP3M (AT91_CAST(AT91_REG *) 0x4008C168) // (PWMC) PWM Comparison Mode 3 Register #define AT91C_PWMC_IER2 (AT91_CAST(AT91_REG *) 0x4008C034) // (PWMC) PWMC Interrupt Enable Register 2 #define AT91C_PWMC_CMP3VUPD (AT91_CAST(AT91_REG *) 0x4008C164) // (PWMC) PWM Comparison Value 3 Update Register #define AT91C_PWMC_CMP2M (AT91_CAST(AT91_REG *) 0x4008C158) // (PWMC) PWM Comparison Mode 2 Register #define AT91C_PWMC_IDR2 (AT91_CAST(AT91_REG *) 0x4008C038) // (PWMC) PWMC Interrupt Disable Register 2 #define AT91C_PWMC_EL2MR (AT91_CAST(AT91_REG *) 0x4008C084) // (PWMC) PWM Event Line 2 Mode Register #define AT91C_PWMC_CMP7V (AT91_CAST(AT91_REG *) 0x4008C1A0) // (PWMC) PWM Comparison Value 7 Register #define AT91C_PWMC_CMP1M (AT91_CAST(AT91_REG *) 0x4008C148) // (PWMC) PWM Comparison Mode 1 Register #define AT91C_PWMC_CMP0VUPD (AT91_CAST(AT91_REG *) 0x4008C134) // (PWMC) PWM Comparison Value 0 Update Register #define AT91C_PWMC_WPSR (AT91_CAST(AT91_REG *) 0x4008C0E8) // (PWMC) PWM Write Protection Status Register #define AT91C_PWMC_CMP6VUPD (AT91_CAST(AT91_REG *) 0x4008C194) // (PWMC) PWM Comparison Value 6 Update Register #define AT91C_PWMC_CMP1MUPD (AT91_CAST(AT91_REG *) 0x4008C14C) // (PWMC) PWM Comparison Mode 1 Update Register #define AT91C_PWMC_CMP1V (AT91_CAST(AT91_REG *) 0x4008C140) // (PWMC) PWM Comparison Value 1 Register #define AT91C_PWMC_FCR (AT91_CAST(AT91_REG *) 0x4008C064) // (PWMC) PWM Fault Mode Clear Register #define AT91C_PWMC_VER (AT91_CAST(AT91_REG *) 0x4008C0FC) // (PWMC) PWMC Version Register #define AT91C_PWMC_EL1MR (AT91_CAST(AT91_REG *) 0x4008C080) // (PWMC) PWM Event Line 1 Mode Register #define AT91C_PWMC_EL6MR (AT91_CAST(AT91_REG *) 0x4008C094) // (PWMC) PWM Event Line 6 Mode Register #define AT91C_PWMC_ISR2 (AT91_CAST(AT91_REG *) 0x4008C040) // (PWMC) PWMC Interrupt Status Register 2 #define AT91C_PWMC_CMP4VUPD (AT91_CAST(AT91_REG *) 0x4008C174) // (PWMC) PWM Comparison Value 4 Update Register #define AT91C_PWMC_CMP5MUPD (AT91_CAST(AT91_REG *) 0x4008C18C) // (PWMC) PWM Comparison Mode 5 Update Register #define AT91C_PWMC_OS (AT91_CAST(AT91_REG *) 0x4008C048) // (PWMC) PWM Output Selection Register #define AT91C_PWMC_FPV (AT91_CAST(AT91_REG *) 0x4008C068) // (PWMC) PWM Fault Protection Value Register #define AT91C_PWMC_FPER2 (AT91_CAST(AT91_REG *) 0x4008C070) // (PWMC) PWM Fault Protection Enable Register 2 #define AT91C_PWMC_EL7MR (AT91_CAST(AT91_REG *) 0x4008C098) // (PWMC) PWM Event Line 7 Mode Register #define AT91C_PWMC_OSSUPD (AT91_CAST(AT91_REG *) 0x4008C054) // (PWMC) PWM Output Selection Set Update Register #define AT91C_PWMC_FEATURES (AT91_CAST(AT91_REG *) 0x4008C0F8) // (PWMC) PWMC FEATURES REGISTER #define AT91C_PWMC_CMP2V (AT91_CAST(AT91_REG *) 0x4008C150) // (PWMC) PWM Comparison Value 2 Register #define AT91C_PWMC_FSR (AT91_CAST(AT91_REG *) 0x4008C060) // (PWMC) PWM Fault Mode Status Register #define AT91C_PWMC_ADDRSIZE (AT91_CAST(AT91_REG *) 0x4008C0EC) // (PWMC) PWMC ADDRSIZE REGISTER #define AT91C_PWMC_OSC (AT91_CAST(AT91_REG *) 0x4008C050) // (PWMC) PWM Output Selection Clear Register #define AT91C_PWMC_SCUP (AT91_CAST(AT91_REG *) 0x4008C02C) // (PWMC) PWM Update Period Register #define AT91C_PWMC_CMP7MUPD (AT91_CAST(AT91_REG *) 0x4008C1AC) // (PWMC) PWM Comparison Mode 7 Update Register #define AT91C_PWMC_CMP2VUPD (AT91_CAST(AT91_REG *) 0x4008C154) // (PWMC) PWM Comparison Value 2 Update Register #define AT91C_PWMC_FPER4 (AT91_CAST(AT91_REG *) 0x4008C078) // (PWMC) PWM Fault Protection Enable Register 4 #define AT91C_PWMC_IMR1 (AT91_CAST(AT91_REG *) 0x4008C018) // (PWMC) PWMC Interrupt Mask Register 1 #define AT91C_PWMC_EL3MR (AT91_CAST(AT91_REG *) 0x4008C088) // (PWMC) PWM Event Line 3 Mode Register #define AT91C_PWMC_CMP3V (AT91_CAST(AT91_REG *) 0x4008C160) // (PWMC) PWM Comparison Value 3 Register #define AT91C_PWMC_IPNAME1 (AT91_CAST(AT91_REG *) 0x4008C0F0) // (PWMC) PWMC IPNAME1 REGISTER #define AT91C_PWMC_OSS (AT91_CAST(AT91_REG *) 0x4008C04C) // (PWMC) PWM Output Selection Set Register #define AT91C_PWMC_CMP0MUPD (AT91_CAST(AT91_REG *) 0x4008C13C) // (PWMC) PWM Comparison Mode 0 Update Register #define AT91C_PWMC_CMP2MUPD (AT91_CAST(AT91_REG *) 0x4008C15C) // (PWMC) PWM Comparison Mode 2 Update Register #define AT91C_PWMC_CMP4V (AT91_CAST(AT91_REG *) 0x4008C170) // (PWMC) PWM Comparison Value 4 Register #define AT91C_PWMC_ENA (AT91_CAST(AT91_REG *) 0x4008C004) // (PWMC) PWMC Enable Register #define AT91C_PWMC_CMP3MUPD (AT91_CAST(AT91_REG *) 0x4008C16C) // (PWMC) PWM Comparison Mode 3 Update Register #define AT91C_PWMC_EL0MR (AT91_CAST(AT91_REG *) 0x4008C07C) // (PWMC) PWM Event Line 0 Mode Register #define AT91C_PWMC_OOV (AT91_CAST(AT91_REG *) 0x4008C044) // (PWMC) PWM Output Override Value Register #define AT91C_PWMC_WPCR (AT91_CAST(AT91_REG *) 0x4008C0E4) // (PWMC) PWM Write Protection Enable Register #define AT91C_PWMC_CMP7M (AT91_CAST(AT91_REG *) 0x4008C1A8) // (PWMC) PWM Comparison Mode 7 Register #define AT91C_PWMC_CMP6M (AT91_CAST(AT91_REG *) 0x4008C198) // (PWMC) PWM Comparison Mode 6 Register #define AT91C_PWMC_CMP5M (AT91_CAST(AT91_REG *) 0x4008C188) // (PWMC) PWM Comparison Mode 5 Register #define AT91C_PWMC_IPNAME2 (AT91_CAST(AT91_REG *) 0x4008C0F4) // (PWMC) PWMC IPNAME2 REGISTER #define AT91C_PWMC_CMP7VUPD (AT91_CAST(AT91_REG *) 0x4008C1A4) // (PWMC) PWM Comparison Value 7 Update Register #define AT91C_PWMC_SYNC (AT91_CAST(AT91_REG *) 0x4008C020) // (PWMC) PWM Synchronized Channels Register #define AT91C_PWMC_MR (AT91_CAST(AT91_REG *) 0x4008C000) // (PWMC) PWMC Mode Register #define AT91C_PWMC_IDR1 (AT91_CAST(AT91_REG *) 0x4008C014) // (PWMC) PWMC Interrupt Disable Register 1 #define AT91C_PWMC_EL5MR (AT91_CAST(AT91_REG *) 0x4008C090) // (PWMC) PWM Event Line 5 Mode Register // ========== Register definition for SPI0 peripheral ========== #define AT91C_SPI0_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400080EC) // (SPI0) SPI ADDRSIZE REGISTER #define AT91C_SPI0_RDR (AT91_CAST(AT91_REG *) 0x40008008) // (SPI0) Receive Data Register #define AT91C_SPI0_FEATURES (AT91_CAST(AT91_REG *) 0x400080F8) // (SPI0) SPI FEATURES REGISTER #define AT91C_SPI0_CR (AT91_CAST(AT91_REG *) 0x40008000) // (SPI0) Control Register #define AT91C_SPI0_IPNAME1 (AT91_CAST(AT91_REG *) 0x400080F0) // (SPI0) SPI IPNAME1 REGISTER #define AT91C_SPI0_VER (AT91_CAST(AT91_REG *) 0x400080FC) // (SPI0) Version Register #define AT91C_SPI0_IDR (AT91_CAST(AT91_REG *) 0x40008018) // (SPI0) Interrupt Disable Register #define AT91C_SPI0_TDR (AT91_CAST(AT91_REG *) 0x4000800C) // (SPI0) Transmit Data Register #define AT91C_SPI0_MR (AT91_CAST(AT91_REG *) 0x40008004) // (SPI0) Mode Register #define AT91C_SPI0_IER (AT91_CAST(AT91_REG *) 0x40008014) // (SPI0) Interrupt Enable Register #define AT91C_SPI0_IMR (AT91_CAST(AT91_REG *) 0x4000801C) // (SPI0) Interrupt Mask Register #define AT91C_SPI0_IPNAME2 (AT91_CAST(AT91_REG *) 0x400080F4) // (SPI0) SPI IPNAME2 REGISTER #define AT91C_SPI0_CSR (AT91_CAST(AT91_REG *) 0x40008030) // (SPI0) Chip Select Register #define AT91C_SPI0_SR (AT91_CAST(AT91_REG *) 0x40008010) // (SPI0) Status Register // ========== Register definition for UDPHS_EPTFIFO peripheral ========== #define AT91C_UDPHS_EPTFIFO_READEPT6 (AT91_CAST(AT91_REG *) 0x201E0000) // (UDPHS_EPTFIFO) FIFO Endpoint Data Register 6 #define AT91C_UDPHS_EPTFIFO_READEPT2 (AT91_CAST(AT91_REG *) 0x201A0000) // (UDPHS_EPTFIFO) FIFO Endpoint Data Register 2 #define AT91C_UDPHS_EPTFIFO_READEPT1 (AT91_CAST(AT91_REG *) 0x20190000) // (UDPHS_EPTFIFO) FIFO Endpoint Data Register 1 #define AT91C_UDPHS_EPTFIFO_READEPT0 (AT91_CAST(AT91_REG *) 0x20180000) // (UDPHS_EPTFIFO) FIFO Endpoint Data Register 0 #define AT91C_UDPHS_EPTFIFO_READEPT5 (AT91_CAST(AT91_REG *) 0x201D0000) // (UDPHS_EPTFIFO) FIFO Endpoint Data Register 5 #define AT91C_UDPHS_EPTFIFO_READEPT4 (AT91_CAST(AT91_REG *) 0x201C0000) // (UDPHS_EPTFIFO) FIFO Endpoint Data Register 4 #define AT91C_UDPHS_EPTFIFO_READEPT3 (AT91_CAST(AT91_REG *) 0x201B0000) // (UDPHS_EPTFIFO) FIFO Endpoint Data Register 3 // ========== Register definition for UDPHS_EPT_0 peripheral ========== #define AT91C_UDPHS_EPT_0_EPTCTL (AT91_CAST(AT91_REG *) 0x400A410C) // (UDPHS_EPT_0) UDPHS Endpoint Control Register #define AT91C_UDPHS_EPT_0_EPTSTA (AT91_CAST(AT91_REG *) 0x400A411C) // (UDPHS_EPT_0) UDPHS Endpoint Status Register #define AT91C_UDPHS_EPT_0_EPTCLRSTA (AT91_CAST(AT91_REG *) 0x400A4118) // (UDPHS_EPT_0) UDPHS Endpoint Clear Status Register #define AT91C_UDPHS_EPT_0_EPTCTLDIS (AT91_CAST(AT91_REG *) 0x400A4108) // (UDPHS_EPT_0) UDPHS Endpoint Control Disable Register #define AT91C_UDPHS_EPT_0_EPTCFG (AT91_CAST(AT91_REG *) 0x400A4100) // (UDPHS_EPT_0) UDPHS Endpoint Config Register #define AT91C_UDPHS_EPT_0_EPTSETSTA (AT91_CAST(AT91_REG *) 0x400A4114) // (UDPHS_EPT_0) UDPHS Endpoint Set Status Register #define AT91C_UDPHS_EPT_0_EPTCTLENB (AT91_CAST(AT91_REG *) 0x400A4104) // (UDPHS_EPT_0) UDPHS Endpoint Control Enable Register // ========== Register definition for UDPHS_EPT_1 peripheral ========== #define AT91C_UDPHS_EPT_1_EPTSTA (AT91_CAST(AT91_REG *) 0x400A413C) // (UDPHS_EPT_1) UDPHS Endpoint Status Register #define AT91C_UDPHS_EPT_1_EPTSETSTA (AT91_CAST(AT91_REG *) 0x400A4134) // (UDPHS_EPT_1) UDPHS Endpoint Set Status Register #define AT91C_UDPHS_EPT_1_EPTCTL (AT91_CAST(AT91_REG *) 0x400A412C) // (UDPHS_EPT_1) UDPHS Endpoint Control Register #define AT91C_UDPHS_EPT_1_EPTCFG (AT91_CAST(AT91_REG *) 0x400A4120) // (UDPHS_EPT_1) UDPHS Endpoint Config Register #define AT91C_UDPHS_EPT_1_EPTCTLDIS (AT91_CAST(AT91_REG *) 0x400A4128) // (UDPHS_EPT_1) UDPHS Endpoint Control Disable Register #define AT91C_UDPHS_EPT_1_EPTCLRSTA (AT91_CAST(AT91_REG *) 0x400A4138) // (UDPHS_EPT_1) UDPHS Endpoint Clear Status Register #define AT91C_UDPHS_EPT_1_EPTCTLENB (AT91_CAST(AT91_REG *) 0x400A4124) // (UDPHS_EPT_1) UDPHS Endpoint Control Enable Register // ========== Register definition for UDPHS_EPT_2 peripheral ========== #define AT91C_UDPHS_EPT_2_EPTCTLENB (AT91_CAST(AT91_REG *) 0x400A4144) // (UDPHS_EPT_2) UDPHS Endpoint Control Enable Register #define AT91C_UDPHS_EPT_2_EPTCLRSTA (AT91_CAST(AT91_REG *) 0x400A4158) // (UDPHS_EPT_2) UDPHS Endpoint Clear Status Register #define AT91C_UDPHS_EPT_2_EPTCFG (AT91_CAST(AT91_REG *) 0x400A4140) // (UDPHS_EPT_2) UDPHS Endpoint Config Register #define AT91C_UDPHS_EPT_2_EPTCTL (AT91_CAST(AT91_REG *) 0x400A414C) // (UDPHS_EPT_2) UDPHS Endpoint Control Register #define AT91C_UDPHS_EPT_2_EPTSETSTA (AT91_CAST(AT91_REG *) 0x400A4154) // (UDPHS_EPT_2) UDPHS Endpoint Set Status Register #define AT91C_UDPHS_EPT_2_EPTSTA (AT91_CAST(AT91_REG *) 0x400A415C) // (UDPHS_EPT_2) UDPHS Endpoint Status Register #define AT91C_UDPHS_EPT_2_EPTCTLDIS (AT91_CAST(AT91_REG *) 0x400A4148) // (UDPHS_EPT_2) UDPHS Endpoint Control Disable Register // ========== Register definition for UDPHS_EPT_3 peripheral ========== #define AT91C_UDPHS_EPT_3_EPTCTLDIS (AT91_CAST(AT91_REG *) 0x400A4168) // (UDPHS_EPT_3) UDPHS Endpoint Control Disable Register #define AT91C_UDPHS_EPT_3_EPTCTLENB (AT91_CAST(AT91_REG *) 0x400A4164) // (UDPHS_EPT_3) UDPHS Endpoint Control Enable Register #define AT91C_UDPHS_EPT_3_EPTSETSTA (AT91_CAST(AT91_REG *) 0x400A4174) // (UDPHS_EPT_3) UDPHS Endpoint Set Status Register #define AT91C_UDPHS_EPT_3_EPTCLRSTA (AT91_CAST(AT91_REG *) 0x400A4178) // (UDPHS_EPT_3) UDPHS Endpoint Clear Status Register #define AT91C_UDPHS_EPT_3_EPTCFG (AT91_CAST(AT91_REG *) 0x400A4160) // (UDPHS_EPT_3) UDPHS Endpoint Config Register #define AT91C_UDPHS_EPT_3_EPTSTA (AT91_CAST(AT91_REG *) 0x400A417C) // (UDPHS_EPT_3) UDPHS Endpoint Status Register #define AT91C_UDPHS_EPT_3_EPTCTL (AT91_CAST(AT91_REG *) 0x400A416C) // (UDPHS_EPT_3) UDPHS Endpoint Control Register // ========== Register definition for UDPHS_EPT_4 peripheral ========== #define AT91C_UDPHS_EPT_4_EPTSETSTA (AT91_CAST(AT91_REG *) 0x400A4194) // (UDPHS_EPT_4) UDPHS Endpoint Set Status Register #define AT91C_UDPHS_EPT_4_EPTCTLDIS (AT91_CAST(AT91_REG *) 0x400A4188) // (UDPHS_EPT_4) UDPHS Endpoint Control Disable Register #define AT91C_UDPHS_EPT_4_EPTCTL (AT91_CAST(AT91_REG *) 0x400A418C) // (UDPHS_EPT_4) UDPHS Endpoint Control Register #define AT91C_UDPHS_EPT_4_EPTCFG (AT91_CAST(AT91_REG *) 0x400A4180) // (UDPHS_EPT_4) UDPHS Endpoint Config Register #define AT91C_UDPHS_EPT_4_EPTCTLENB (AT91_CAST(AT91_REG *) 0x400A4184) // (UDPHS_EPT_4) UDPHS Endpoint Control Enable Register #define AT91C_UDPHS_EPT_4_EPTSTA (AT91_CAST(AT91_REG *) 0x400A419C) // (UDPHS_EPT_4) UDPHS Endpoint Status Register #define AT91C_UDPHS_EPT_4_EPTCLRSTA (AT91_CAST(AT91_REG *) 0x400A4198) // (UDPHS_EPT_4) UDPHS Endpoint Clear Status Register // ========== Register definition for UDPHS_EPT_5 peripheral ========== #define AT91C_UDPHS_EPT_5_EPTCFG (AT91_CAST(AT91_REG *) 0x400A41A0) // (UDPHS_EPT_5) UDPHS Endpoint Config Register #define AT91C_UDPHS_EPT_5_EPTCTL (AT91_CAST(AT91_REG *) 0x400A41AC) // (UDPHS_EPT_5) UDPHS Endpoint Control Register #define AT91C_UDPHS_EPT_5_EPTCTLENB (AT91_CAST(AT91_REG *) 0x400A41A4) // (UDPHS_EPT_5) UDPHS Endpoint Control Enable Register #define AT91C_UDPHS_EPT_5_EPTSTA (AT91_CAST(AT91_REG *) 0x400A41BC) // (UDPHS_EPT_5) UDPHS Endpoint Status Register #define AT91C_UDPHS_EPT_5_EPTSETSTA (AT91_CAST(AT91_REG *) 0x400A41B4) // (UDPHS_EPT_5) UDPHS Endpoint Set Status Register #define AT91C_UDPHS_EPT_5_EPTCTLDIS (AT91_CAST(AT91_REG *) 0x400A41A8) // (UDPHS_EPT_5) UDPHS Endpoint Control Disable Register #define AT91C_UDPHS_EPT_5_EPTCLRSTA (AT91_CAST(AT91_REG *) 0x400A41B8) // (UDPHS_EPT_5) UDPHS Endpoint Clear Status Register // ========== Register definition for UDPHS_EPT_6 peripheral ========== #define AT91C_UDPHS_EPT_6_EPTCLRSTA (AT91_CAST(AT91_REG *) 0x400A41D8) // (UDPHS_EPT_6) UDPHS Endpoint Clear Status Register #define AT91C_UDPHS_EPT_6_EPTCTL (AT91_CAST(AT91_REG *) 0x400A41CC) // (UDPHS_EPT_6) UDPHS Endpoint Control Register #define AT91C_UDPHS_EPT_6_EPTCFG (AT91_CAST(AT91_REG *) 0x400A41C0) // (UDPHS_EPT_6) UDPHS Endpoint Config Register #define AT91C_UDPHS_EPT_6_EPTCTLDIS (AT91_CAST(AT91_REG *) 0x400A41C8) // (UDPHS_EPT_6) UDPHS Endpoint Control Disable Register #define AT91C_UDPHS_EPT_6_EPTSTA (AT91_CAST(AT91_REG *) 0x400A41DC) // (UDPHS_EPT_6) UDPHS Endpoint Status Register #define AT91C_UDPHS_EPT_6_EPTCTLENB (AT91_CAST(AT91_REG *) 0x400A41C4) // (UDPHS_EPT_6) UDPHS Endpoint Control Enable Register #define AT91C_UDPHS_EPT_6_EPTSETSTA (AT91_CAST(AT91_REG *) 0x400A41D4) // (UDPHS_EPT_6) UDPHS Endpoint Set Status Register // ========== Register definition for UDPHS_DMA_1 peripheral ========== #define AT91C_UDPHS_DMA_1_DMASTATUS (AT91_CAST(AT91_REG *) 0x400A431C) // (UDPHS_DMA_1) UDPHS DMA Channel Status Register #define AT91C_UDPHS_DMA_1_DMACONTROL (AT91_CAST(AT91_REG *) 0x400A4318) // (UDPHS_DMA_1) UDPHS DMA Channel Control Register #define AT91C_UDPHS_DMA_1_DMANXTDSC (AT91_CAST(AT91_REG *) 0x400A4310) // (UDPHS_DMA_1) UDPHS DMA Channel Next Descriptor Address #define AT91C_UDPHS_DMA_1_DMAADDRESS (AT91_CAST(AT91_REG *) 0x400A4314) // (UDPHS_DMA_1) UDPHS DMA Channel Address Register // ========== Register definition for UDPHS_DMA_2 peripheral ========== #define AT91C_UDPHS_DMA_2_DMASTATUS (AT91_CAST(AT91_REG *) 0x400A432C) // (UDPHS_DMA_2) UDPHS DMA Channel Status Register #define AT91C_UDPHS_DMA_2_DMANXTDSC (AT91_CAST(AT91_REG *) 0x400A4320) // (UDPHS_DMA_2) UDPHS DMA Channel Next Descriptor Address #define AT91C_UDPHS_DMA_2_DMACONTROL (AT91_CAST(AT91_REG *) 0x400A4328) // (UDPHS_DMA_2) UDPHS DMA Channel Control Register #define AT91C_UDPHS_DMA_2_DMAADDRESS (AT91_CAST(AT91_REG *) 0x400A4324) // (UDPHS_DMA_2) UDPHS DMA Channel Address Register // ========== Register definition for UDPHS_DMA_3 peripheral ========== #define AT91C_UDPHS_DMA_3_DMACONTROL (AT91_CAST(AT91_REG *) 0x400A4338) // (UDPHS_DMA_3) UDPHS DMA Channel Control Register #define AT91C_UDPHS_DMA_3_DMANXTDSC (AT91_CAST(AT91_REG *) 0x400A4330) // (UDPHS_DMA_3) UDPHS DMA Channel Next Descriptor Address #define AT91C_UDPHS_DMA_3_DMASTATUS (AT91_CAST(AT91_REG *) 0x400A433C) // (UDPHS_DMA_3) UDPHS DMA Channel Status Register #define AT91C_UDPHS_DMA_3_DMAADDRESS (AT91_CAST(AT91_REG *) 0x400A4334) // (UDPHS_DMA_3) UDPHS DMA Channel Address Register // ========== Register definition for UDPHS_DMA_4 peripheral ========== #define AT91C_UDPHS_DMA_4_DMAADDRESS (AT91_CAST(AT91_REG *) 0x400A4344) // (UDPHS_DMA_4) UDPHS DMA Channel Address Register #define AT91C_UDPHS_DMA_4_DMANXTDSC (AT91_CAST(AT91_REG *) 0x400A4340) // (UDPHS_DMA_4) UDPHS DMA Channel Next Descriptor Address #define AT91C_UDPHS_DMA_4_DMASTATUS (AT91_CAST(AT91_REG *) 0x400A434C) // (UDPHS_DMA_4) UDPHS DMA Channel Status Register #define AT91C_UDPHS_DMA_4_DMACONTROL (AT91_CAST(AT91_REG *) 0x400A4348) // (UDPHS_DMA_4) UDPHS DMA Channel Control Register // ========== Register definition for UDPHS_DMA_5 peripheral ========== #define AT91C_UDPHS_DMA_5_DMACONTROL (AT91_CAST(AT91_REG *) 0x400A4358) // (UDPHS_DMA_5) UDPHS DMA Channel Control Register #define AT91C_UDPHS_DMA_5_DMAADDRESS (AT91_CAST(AT91_REG *) 0x400A4354) // (UDPHS_DMA_5) UDPHS DMA Channel Address Register #define AT91C_UDPHS_DMA_5_DMANXTDSC (AT91_CAST(AT91_REG *) 0x400A4350) // (UDPHS_DMA_5) UDPHS DMA Channel Next Descriptor Address #define AT91C_UDPHS_DMA_5_DMASTATUS (AT91_CAST(AT91_REG *) 0x400A435C) // (UDPHS_DMA_5) UDPHS DMA Channel Status Register // ========== Register definition for UDPHS_DMA_6 peripheral ========== #define AT91C_UDPHS_DMA_6_DMASTATUS (AT91_CAST(AT91_REG *) 0x400A436C) // (UDPHS_DMA_6) UDPHS DMA Channel Status Register #define AT91C_UDPHS_DMA_6_DMACONTROL (AT91_CAST(AT91_REG *) 0x400A4368) // (UDPHS_DMA_6) UDPHS DMA Channel Control Register #define AT91C_UDPHS_DMA_6_DMANXTDSC (AT91_CAST(AT91_REG *) 0x400A4360) // (UDPHS_DMA_6) UDPHS DMA Channel Next Descriptor Address #define AT91C_UDPHS_DMA_6_DMAADDRESS (AT91_CAST(AT91_REG *) 0x400A4364) // (UDPHS_DMA_6) UDPHS DMA Channel Address Register // ========== Register definition for UDPHS peripheral ========== #define AT91C_UDPHS_EPTRST (AT91_CAST(AT91_REG *) 0x400A401C) // (UDPHS) UDPHS Endpoints Reset Register #define AT91C_UDPHS_IEN (AT91_CAST(AT91_REG *) 0x400A4010) // (UDPHS) UDPHS Interrupt Enable Register #define AT91C_UDPHS_TSTCNTB (AT91_CAST(AT91_REG *) 0x400A40D8) // (UDPHS) UDPHS Test B Counter Register #define AT91C_UDPHS_RIPNAME2 (AT91_CAST(AT91_REG *) 0x400A40F4) // (UDPHS) UDPHS Name2 Register #define AT91C_UDPHS_RIPPADDRSIZE (AT91_CAST(AT91_REG *) 0x400A40EC) // (UDPHS) UDPHS PADDRSIZE Register #define AT91C_UDPHS_TSTMODREG (AT91_CAST(AT91_REG *) 0x400A40DC) // (UDPHS) UDPHS Test Mode Register #define AT91C_UDPHS_TST (AT91_CAST(AT91_REG *) 0x400A40E0) // (UDPHS) UDPHS Test Register #define AT91C_UDPHS_TSTSOFCNT (AT91_CAST(AT91_REG *) 0x400A40D0) // (UDPHS) UDPHS Test SOF Counter Register #define AT91C_UDPHS_FNUM (AT91_CAST(AT91_REG *) 0x400A4004) // (UDPHS) UDPHS Frame Number Register #define AT91C_UDPHS_TSTCNTA (AT91_CAST(AT91_REG *) 0x400A40D4) // (UDPHS) UDPHS Test A Counter Register #define AT91C_UDPHS_INTSTA (AT91_CAST(AT91_REG *) 0x400A4014) // (UDPHS) UDPHS Interrupt Status Register #define AT91C_UDPHS_IPFEATURES (AT91_CAST(AT91_REG *) 0x400A40F8) // (UDPHS) UDPHS Features Register #define AT91C_UDPHS_CLRINT (AT91_CAST(AT91_REG *) 0x400A4018) // (UDPHS) UDPHS Clear Interrupt Register #define AT91C_UDPHS_RIPNAME1 (AT91_CAST(AT91_REG *) 0x400A40F0) // (UDPHS) UDPHS Name1 Register #define AT91C_UDPHS_CTRL (AT91_CAST(AT91_REG *) 0x400A4000) // (UDPHS) UDPHS Control Register #define AT91C_UDPHS_IPVERSION (AT91_CAST(AT91_REG *) 0x400A40FC) // (UDPHS) UDPHS Version Register // ========== Register definition for HDMA_CH_0 peripheral ========== #define AT91C_HDMA_CH_0_SADDR (AT91_CAST(AT91_REG *) 0x400B003C) // (HDMA_CH_0) HDMA Channel Source Address Register #define AT91C_HDMA_CH_0_DADDR (AT91_CAST(AT91_REG *) 0x400B0040) // (HDMA_CH_0) HDMA Channel Destination Address Register #define AT91C_HDMA_CH_0_CFG (AT91_CAST(AT91_REG *) 0x400B0050) // (HDMA_CH_0) HDMA Channel Configuration Register #define AT91C_HDMA_CH_0_CTRLB (AT91_CAST(AT91_REG *) 0x400B004C) // (HDMA_CH_0) HDMA Channel Control B Register #define AT91C_HDMA_CH_0_CTRLA (AT91_CAST(AT91_REG *) 0x400B0048) // (HDMA_CH_0) HDMA Channel Control A Register #define AT91C_HDMA_CH_0_DSCR (AT91_CAST(AT91_REG *) 0x400B0044) // (HDMA_CH_0) HDMA Channel Descriptor Address Register // ========== Register definition for HDMA_CH_1 peripheral ========== #define AT91C_HDMA_CH_1_DSCR (AT91_CAST(AT91_REG *) 0x400B006C) // (HDMA_CH_1) HDMA Channel Descriptor Address Register #define AT91C_HDMA_CH_1_CTRLB (AT91_CAST(AT91_REG *) 0x400B0074) // (HDMA_CH_1) HDMA Channel Control B Register #define AT91C_HDMA_CH_1_SADDR (AT91_CAST(AT91_REG *) 0x400B0064) // (HDMA_CH_1) HDMA Channel Source Address Register #define AT91C_HDMA_CH_1_CFG (AT91_CAST(AT91_REG *) 0x400B0078) // (HDMA_CH_1) HDMA Channel Configuration Register #define AT91C_HDMA_CH_1_DADDR (AT91_CAST(AT91_REG *) 0x400B0068) // (HDMA_CH_1) HDMA Channel Destination Address Register #define AT91C_HDMA_CH_1_CTRLA (AT91_CAST(AT91_REG *) 0x400B0070) // (HDMA_CH_1) HDMA Channel Control A Register // ========== Register definition for HDMA_CH_2 peripheral ========== #define AT91C_HDMA_CH_2_CTRLA (AT91_CAST(AT91_REG *) 0x400B0098) // (HDMA_CH_2) HDMA Channel Control A Register #define AT91C_HDMA_CH_2_SADDR (AT91_CAST(AT91_REG *) 0x400B008C) // (HDMA_CH_2) HDMA Channel Source Address Register #define AT91C_HDMA_CH_2_CTRLB (AT91_CAST(AT91_REG *) 0x400B009C) // (HDMA_CH_2) HDMA Channel Control B Register #define AT91C_HDMA_CH_2_DADDR (AT91_CAST(AT91_REG *) 0x400B0090) // (HDMA_CH_2) HDMA Channel Destination Address Register #define AT91C_HDMA_CH_2_CFG (AT91_CAST(AT91_REG *) 0x400B00A0) // (HDMA_CH_2) HDMA Channel Configuration Register #define AT91C_HDMA_CH_2_DSCR (AT91_CAST(AT91_REG *) 0x400B0094) // (HDMA_CH_2) HDMA Channel Descriptor Address Register // ========== Register definition for HDMA_CH_3 peripheral ========== #define AT91C_HDMA_CH_3_DSCR (AT91_CAST(AT91_REG *) 0x400B00BC) // (HDMA_CH_3) HDMA Channel Descriptor Address Register #define AT91C_HDMA_CH_3_SADDR (AT91_CAST(AT91_REG *) 0x400B00B4) // (HDMA_CH_3) HDMA Channel Source Address Register #define AT91C_HDMA_CH_3_CTRLB (AT91_CAST(AT91_REG *) 0x400B00C4) // (HDMA_CH_3) HDMA Channel Control B Register #define AT91C_HDMA_CH_3_CFG (AT91_CAST(AT91_REG *) 0x400B00C8) // (HDMA_CH_3) HDMA Channel Configuration Register #define AT91C_HDMA_CH_3_DADDR (AT91_CAST(AT91_REG *) 0x400B00B8) // (HDMA_CH_3) HDMA Channel Destination Address Register #define AT91C_HDMA_CH_3_CTRLA (AT91_CAST(AT91_REG *) 0x400B00C0) // (HDMA_CH_3) HDMA Channel Control A Register // ========== Register definition for HDMA peripheral ========== #define AT91C_HDMA_VER (AT91_CAST(AT91_REG *) 0x400B01FC) // (HDMA) HDMA VERSION REGISTER #define AT91C_HDMA_CHSR (AT91_CAST(AT91_REG *) 0x400B0030) // (HDMA) HDMA Channel Handler Status Register #define AT91C_HDMA_IPNAME2 (AT91_CAST(AT91_REG *) 0x400B01F4) // (HDMA) HDMA IPNAME2 REGISTER #define AT91C_HDMA_EBCIMR (AT91_CAST(AT91_REG *) 0x400B0020) // (HDMA) HDMA Error, Chained Buffer transfer completed and Buffer transfer completed Mask Register #define AT91C_HDMA_CHDR (AT91_CAST(AT91_REG *) 0x400B002C) // (HDMA) HDMA Channel Handler Disable Register #define AT91C_HDMA_EN (AT91_CAST(AT91_REG *) 0x400B0004) // (HDMA) HDMA Controller Enable Register #define AT91C_HDMA_GCFG (AT91_CAST(AT91_REG *) 0x400B0000) // (HDMA) HDMA Global Configuration Register #define AT91C_HDMA_IPNAME1 (AT91_CAST(AT91_REG *) 0x400B01F0) // (HDMA) HDMA IPNAME1 REGISTER #define AT91C_HDMA_LAST (AT91_CAST(AT91_REG *) 0x400B0010) // (HDMA) HDMA Software Last Transfer Flag Register #define AT91C_HDMA_FEATURES (AT91_CAST(AT91_REG *) 0x400B01F8) // (HDMA) HDMA FEATURES REGISTER #define AT91C_HDMA_CREQ (AT91_CAST(AT91_REG *) 0x400B000C) // (HDMA) HDMA Software Chunk Transfer Request Register #define AT91C_HDMA_EBCIER (AT91_CAST(AT91_REG *) 0x400B0018) // (HDMA) HDMA Error, Chained Buffer transfer completed and Buffer transfer completed Interrupt Enable register #define AT91C_HDMA_CHER (AT91_CAST(AT91_REG *) 0x400B0028) // (HDMA) HDMA Channel Handler Enable Register #define AT91C_HDMA_ADDRSIZE (AT91_CAST(AT91_REG *) 0x400B01EC) // (HDMA) HDMA ADDRSIZE REGISTER #define AT91C_HDMA_EBCISR (AT91_CAST(AT91_REG *) 0x400B0024) // (HDMA) HDMA Error, Chained Buffer transfer completed and Buffer transfer completed Status Register #define AT91C_HDMA_SREQ (AT91_CAST(AT91_REG *) 0x400B0008) // (HDMA) HDMA Software Single Request Register #define AT91C_HDMA_EBCIDR (AT91_CAST(AT91_REG *) 0x400B001C) // (HDMA) HDMA Error, Chained Buffer transfer completed and Buffer transfer completed Interrupt Disable register // ***************************************************************************** // PIO DEFINITIONS FOR AT91SAM3U4 // ***************************************************************************** #define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 #define AT91C_PA0_TIOB0 (AT91C_PIO_PA0) // #define AT91C_PA0_SPI0_NPCS1 (AT91C_PIO_PA0) // #define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 #define AT91C_PA1_TIOA0 (AT91C_PIO_PA1) // #define AT91C_PA1_SPI0_NPCS2 (AT91C_PIO_PA1) // #define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 #define AT91C_PA10_TWCK0 (AT91C_PIO_PA10) // #define AT91C_PA10_PWML3 (AT91C_PIO_PA10) // #define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 #define AT91C_PA11_DRXD (AT91C_PIO_PA11) // #define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 #define AT91C_PA12_DTXD (AT91C_PIO_PA12) // #define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 #define AT91C_PA13_SPI0_MISO (AT91C_PIO_PA13) // #define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 #define AT91C_PA14_SPI0_MOSI (AT91C_PIO_PA14) // #define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 #define AT91C_PA15_SPI0_SPCK (AT91C_PIO_PA15) // #define AT91C_PA15_PWMH2 (AT91C_PIO_PA15) // #define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 #define AT91C_PA16_SPI0_NPCS0 (AT91C_PIO_PA16) // #define AT91C_PA16_NCS1 (AT91C_PIO_PA16) // #define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 #define AT91C_PA17_SCK0 (AT91C_PIO_PA17) // #define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 #define AT91C_PA18_TXD0 (AT91C_PIO_PA18) // #define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 #define AT91C_PA19_RXD0 (AT91C_PIO_PA19) // #define AT91C_PA19_SPI0_NPCS3 (AT91C_PIO_PA19) // #define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 #define AT91C_PA2_TCLK0 (AT91C_PIO_PA2) // #define AT91C_PA2_ADTRG1 (AT91C_PIO_PA2) // #define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 #define AT91C_PA20_TXD1 (AT91C_PIO_PA20) // #define AT91C_PA20_PWMH3 (AT91C_PIO_PA20) // #define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 #define AT91C_PA21_RXD1 (AT91C_PIO_PA21) // #define AT91C_PA21_PCK0 (AT91C_PIO_PA21) // #define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 #define AT91C_PA22_TXD2 (AT91C_PIO_PA22) // #define AT91C_PA22_RTS1 (AT91C_PIO_PA22) // #define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 #define AT91C_PA23_RXD2 (AT91C_PIO_PA23) // #define AT91C_PA23_CTS1 (AT91C_PIO_PA23) // #define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 #define AT91C_PA24_TWD1 (AT91C_PIO_PA24) // #define AT91C_PA24_SCK1 (AT91C_PIO_PA24) // #define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 #define AT91C_PA25_TWCK1 (AT91C_PIO_PA25) // #define AT91C_PA25_SCK2 (AT91C_PIO_PA25) // #define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 #define AT91C_PA26_TD0 (AT91C_PIO_PA26) // #define AT91C_PA26_TCLK2 (AT91C_PIO_PA26) // #define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 #define AT91C_PA27_RD0 (AT91C_PIO_PA27) // #define AT91C_PA27_PCK0 (AT91C_PIO_PA27) // #define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 #define AT91C_PA28_TK0 (AT91C_PIO_PA28) // #define AT91C_PA28_PWMH0 (AT91C_PIO_PA28) // #define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 #define AT91C_PA29_RK0 (AT91C_PIO_PA29) // #define AT91C_PA29_PWMH1 (AT91C_PIO_PA29) // #define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 #define AT91C_PA3_MCI0_CK (AT91C_PIO_PA3) // #define AT91C_PA3_PCK1 (AT91C_PIO_PA3) // #define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 #define AT91C_PA30_TF0 (AT91C_PIO_PA30) // #define AT91C_PA30_TIOA2 (AT91C_PIO_PA30) // #define AT91C_PIO_PA31 (1 << 31) // Pin Controlled by PA31 #define AT91C_PA31_RF0 (AT91C_PIO_PA31) // #define AT91C_PA31_TIOB2 (AT91C_PIO_PA31) // #define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 #define AT91C_PA4_MCI0_CDA (AT91C_PIO_PA4) // #define AT91C_PA4_PWMH0 (AT91C_PIO_PA4) // #define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 #define AT91C_PA5_MCI0_DA0 (AT91C_PIO_PA5) // #define AT91C_PA5_PWMH1 (AT91C_PIO_PA5) // #define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 #define AT91C_PA6_MCI0_DA1 (AT91C_PIO_PA6) // #define AT91C_PA6_PWMH2 (AT91C_PIO_PA6) // #define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 #define AT91C_PA7_MCI0_DA2 (AT91C_PIO_PA7) // #define AT91C_PA7_PWML0 (AT91C_PIO_PA7) // #define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 #define AT91C_PA8_MCI0_DA3 (AT91C_PIO_PA8) // #define AT91C_PA8_PWML1 (AT91C_PIO_PA8) // #define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 #define AT91C_PA9_TWD0 (AT91C_PIO_PA9) // #define AT91C_PA9_PWML2 (AT91C_PIO_PA9) // #define AT91C_PIO_PB0 (1 << 0) // Pin Controlled by PB0 #define AT91C_PB0_PWMH0 (AT91C_PIO_PB0) // #define AT91C_PB0_A2 (AT91C_PIO_PB0) // #define AT91C_PIO_PB1 (1 << 1) // Pin Controlled by PB1 #define AT91C_PB1_PWMH1 (AT91C_PIO_PB1) // #define AT91C_PB1_A3 (AT91C_PIO_PB1) // #define AT91C_PIO_PB10 (1 << 10) // Pin Controlled by PB10 #define AT91C_PB10_D1 (AT91C_PIO_PB10) // #define AT91C_PB10_DSR0 (AT91C_PIO_PB10) // #define AT91C_PIO_PB11 (1 << 11) // Pin Controlled by PB11 #define AT91C_PB11_D2 (AT91C_PIO_PB11) // #define AT91C_PB11_DCD0 (AT91C_PIO_PB11) // #define AT91C_PIO_PB12 (1 << 12) // Pin Controlled by PB12 #define AT91C_PB12_D3 (AT91C_PIO_PB12) // #define AT91C_PB12_RI0 (AT91C_PIO_PB12) // #define AT91C_PIO_PB13 (1 << 13) // Pin Controlled by PB13 #define AT91C_PB13_D4 (AT91C_PIO_PB13) // #define AT91C_PB13_PWMH0 (AT91C_PIO_PB13) // #define AT91C_PIO_PB14 (1 << 14) // Pin Controlled by PB14 #define AT91C_PB14_D5 (AT91C_PIO_PB14) // #define AT91C_PB14_PWMH1 (AT91C_PIO_PB14) // #define AT91C_PIO_PB15 (1 << 15) // Pin Controlled by PB15 #define AT91C_PB15_D6 (AT91C_PIO_PB15) // #define AT91C_PB15_PWMH2 (AT91C_PIO_PB15) // #define AT91C_PIO_PB16 (1 << 16) // Pin Controlled by PB16 #define AT91C_PB16_D7 (AT91C_PIO_PB16) // #define AT91C_PB16_PWMH3 (AT91C_PIO_PB16) // #define AT91C_PIO_PB17 (1 << 17) // Pin Controlled by PB17 #define AT91C_PB17_NANDOE (AT91C_PIO_PB17) // #define AT91C_PB17_PWML0 (AT91C_PIO_PB17) // #define AT91C_PIO_PB18 (1 << 18) // Pin Controlled by PB18 #define AT91C_PB18_NANDWE (AT91C_PIO_PB18) // #define AT91C_PB18_PWML1 (AT91C_PIO_PB18) // #define AT91C_PIO_PB19 (1 << 19) // Pin Controlled by PB19 #define AT91C_PB19_NRD (AT91C_PIO_PB19) // #define AT91C_PB19_PWML2 (AT91C_PIO_PB19) // #define AT91C_PIO_PB2 (1 << 2) // Pin Controlled by PB2 #define AT91C_PB2_PWMH2 (AT91C_PIO_PB2) // #define AT91C_PB2_A4 (AT91C_PIO_PB2) // #define AT91C_PIO_PB20 (1 << 20) // Pin Controlled by PB20 #define AT91C_PB20_NCS0 (AT91C_PIO_PB20) // #define AT91C_PB20_PWML3 (AT91C_PIO_PB20) // #define AT91C_PIO_PB21 (1 << 21) // Pin Controlled by PB21 #define AT91C_PB21_A21_NANDALE (AT91C_PIO_PB21) // #define AT91C_PB21_RTS2 (AT91C_PIO_PB21) // #define AT91C_PIO_PB22 (1 << 22) // Pin Controlled by PB22 #define AT91C_PB22_A22_NANDCLE (AT91C_PIO_PB22) // #define AT91C_PB22_CTS2 (AT91C_PIO_PB22) // #define AT91C_PIO_PB23 (1 << 23) // Pin Controlled by PB23 #define AT91C_PB23_NWR0_NWE (AT91C_PIO_PB23) // #define AT91C_PB23_PCK2 (AT91C_PIO_PB23) // #define AT91C_PIO_PB24 (1 << 24) // Pin Controlled by PB24 #define AT91C_PB24_NANDRDY (AT91C_PIO_PB24) // #define AT91C_PB24_PCK1 (AT91C_PIO_PB24) // #define AT91C_PIO_PB25 (1 << 25) // Pin Controlled by PB25 #define AT91C_PB25_D8 (AT91C_PIO_PB25) // #define AT91C_PB25_PWML0 (AT91C_PIO_PB25) // #define AT91C_PIO_PB26 (1 << 26) // Pin Controlled by PB26 #define AT91C_PB26_D9 (AT91C_PIO_PB26) // #define AT91C_PB26_PWML1 (AT91C_PIO_PB26) // #define AT91C_PIO_PB27 (1 << 27) // Pin Controlled by PB27 #define AT91C_PB27_D10 (AT91C_PIO_PB27) // #define AT91C_PB27_PWML2 (AT91C_PIO_PB27) // #define AT91C_PIO_PB28 (1 << 28) // Pin Controlled by PB28 #define AT91C_PB28_D11 (AT91C_PIO_PB28) // #define AT91C_PB28_PWML3 (AT91C_PIO_PB28) // #define AT91C_PIO_PB29 (1 << 29) // Pin Controlled by PB29 #define AT91C_PB29_D12 (AT91C_PIO_PB29) // #define AT91C_PIO_PB3 (1 << 3) // Pin Controlled by PB3 #define AT91C_PB3_PWMH3 (AT91C_PIO_PB3) // #define AT91C_PB3_A5 (AT91C_PIO_PB3) // #define AT91C_PIO_PB30 (1 << 30) // Pin Controlled by PB30 #define AT91C_PB30_D13 (AT91C_PIO_PB30) // #define AT91C_PIO_PB31 (1 << 31) // Pin Controlled by PB31 #define AT91C_PB31_D14 (AT91C_PIO_PB31) // #define AT91C_PIO_PB4 (1 << 4) // Pin Controlled by PB4 #define AT91C_PB4_TCLK1 (AT91C_PIO_PB4) // #define AT91C_PB4_A6 (AT91C_PIO_PB4) // #define AT91C_PIO_PB5 (1 << 5) // Pin Controlled by PB5 #define AT91C_PB5_TIOA1 (AT91C_PIO_PB5) // #define AT91C_PB5_A7 (AT91C_PIO_PB5) // #define AT91C_PIO_PB6 (1 << 6) // Pin Controlled by PB6 #define AT91C_PB6_TIOB1 (AT91C_PIO_PB6) // #define AT91C_PB6_D15 (AT91C_PIO_PB6) // #define AT91C_PIO_PB7 (1 << 7) // Pin Controlled by PB7 #define AT91C_PB7_RTS0 (AT91C_PIO_PB7) // #define AT91C_PB7_A0_NBS0 (AT91C_PIO_PB7) // #define AT91C_PIO_PB8 (1 << 8) // Pin Controlled by PB8 #define AT91C_PB8_CTS0 (AT91C_PIO_PB8) // #define AT91C_PB8_A1 (AT91C_PIO_PB8) // #define AT91C_PIO_PB9 (1 << 9) // Pin Controlled by PB9 #define AT91C_PB9_D0 (AT91C_PIO_PB9) // #define AT91C_PB9_DTR0 (AT91C_PIO_PB9) // #define AT91C_PIO_PC0 (1 << 0) // Pin Controlled by PC0 #define AT91C_PC0_A2 (AT91C_PIO_PC0) // #define AT91C_PIO_PC1 (1 << 1) // Pin Controlled by PC1 #define AT91C_PC1_A3 (AT91C_PIO_PC1) // #define AT91C_PIO_PC10 (1 << 10) // Pin Controlled by PC10 #define AT91C_PC10_A12 (AT91C_PIO_PC10) // #define AT91C_PC10_CTS3 (AT91C_PIO_PC10) // #define AT91C_PIO_PC11 (1 << 11) // Pin Controlled by PC11 #define AT91C_PC11_A13 (AT91C_PIO_PC11) // #define AT91C_PC11_RTS3 (AT91C_PIO_PC11) // #define AT91C_PIO_PC12 (1 << 12) // Pin Controlled by PC12 #define AT91C_PC12_NCS1 (AT91C_PIO_PC12) // #define AT91C_PC12_TXD3 (AT91C_PIO_PC12) // #define AT91C_PIO_PC13 (1 << 13) // Pin Controlled by PC13 #define AT91C_PC13_A2 (AT91C_PIO_PC13) // #define AT91C_PC13_RXD3 (AT91C_PIO_PC13) // #define AT91C_PIO_PC14 (1 << 14) // Pin Controlled by PC14 #define AT91C_PC14_A3 (AT91C_PIO_PC14) // #define AT91C_PC14_SPI0_NPCS2 (AT91C_PIO_PC14) // #define AT91C_PIO_PC15 (1 << 15) // Pin Controlled by PC15 #define AT91C_PC15_NWR1_NBS1 (AT91C_PIO_PC15) // #define AT91C_PIO_PC16 (1 << 16) // Pin Controlled by PC16 #define AT91C_PC16_NCS2 (AT91C_PIO_PC16) // #define AT91C_PC16_PWML3 (AT91C_PIO_PC16) // #define AT91C_PIO_PC17 (1 << 17) // Pin Controlled by PC17 #define AT91C_PC17_NCS3 (AT91C_PIO_PC17) // #define AT91C_PC17_A24 (AT91C_PIO_PC17) // #define AT91C_PIO_PC18 (1 << 18) // Pin Controlled by PC18 #define AT91C_PC18_NWAIT (AT91C_PIO_PC18) // #define AT91C_PIO_PC19 (1 << 19) // Pin Controlled by PC19 #define AT91C_PC19_SCK3 (AT91C_PIO_PC19) // #define AT91C_PC19_NPCS1 (AT91C_PIO_PC19) // #define AT91C_PIO_PC2 (1 << 2) // Pin Controlled by PC2 #define AT91C_PC2_A4 (AT91C_PIO_PC2) // #define AT91C_PIO_PC20 (1 << 20) // Pin Controlled by PC20 #define AT91C_PC20_A14 (AT91C_PIO_PC20) // #define AT91C_PIO_PC21 (1 << 21) // Pin Controlled by PC21 #define AT91C_PC21_A15 (AT91C_PIO_PC21) // #define AT91C_PIO_PC22 (1 << 22) // Pin Controlled by PC22 #define AT91C_PC22_A16 (AT91C_PIO_PC22) // #define AT91C_PIO_PC23 (1 << 23) // Pin Controlled by PC23 #define AT91C_PC23_A17 (AT91C_PIO_PC23) // #define AT91C_PIO_PC24 (1 << 24) // Pin Controlled by PC24 #define AT91C_PC24_A18 (AT91C_PIO_PC24) // #define AT91C_PC24_PWMH0 (AT91C_PIO_PC24) // #define AT91C_PIO_PC25 (1 << 25) // Pin Controlled by PC25 #define AT91C_PC25_A19 (AT91C_PIO_PC25) // #define AT91C_PC25_PWMH1 (AT91C_PIO_PC25) // #define AT91C_PIO_PC26 (1 << 26) // Pin Controlled by PC26 #define AT91C_PC26_A20 (AT91C_PIO_PC26) // #define AT91C_PC26_PWMH2 (AT91C_PIO_PC26) // #define AT91C_PIO_PC27 (1 << 27) // Pin Controlled by PC27 #define AT91C_PC27_A23 (AT91C_PIO_PC27) // #define AT91C_PC27_PWMH3 (AT91C_PIO_PC27) // #define AT91C_PIO_PC28 (1 << 28) // Pin Controlled by PC28 #define AT91C_PC28_A24 (AT91C_PIO_PC28) // #define AT91C_PC28_MCI0_DA4 (AT91C_PIO_PC28) // #define AT91C_PIO_PC29 (1 << 29) // Pin Controlled by PC29 #define AT91C_PC29_PWML0 (AT91C_PIO_PC29) // #define AT91C_PC29_MCI0_DA5 (AT91C_PIO_PC29) // #define AT91C_PIO_PC3 (1 << 3) // Pin Controlled by PC3 #define AT91C_PC3_A5 (AT91C_PIO_PC3) // #define AT91C_PC3_SPI0_NPCS1 (AT91C_PIO_PC3) // #define AT91C_PIO_PC30 (1 << 30) // Pin Controlled by PC30 #define AT91C_PC30_PWML1 (AT91C_PIO_PC30) // #define AT91C_PC30_MCI0_DA6 (AT91C_PIO_PC30) // #define AT91C_PIO_PC31 (1 << 31) // Pin Controlled by PC31 #define AT91C_PC31_PWML2 (AT91C_PIO_PC31) // #define AT91C_PC31_MCI0_DA7 (AT91C_PIO_PC31) // #define AT91C_PIO_PC4 (1 << 4) // Pin Controlled by PC4 #define AT91C_PC4_A6 (AT91C_PIO_PC4) // #define AT91C_PC4_SPI0_NPCS2 (AT91C_PIO_PC4) // #define AT91C_PIO_PC5 (1 << 5) // Pin Controlled by PC5 #define AT91C_PC5_A7 (AT91C_PIO_PC5) // #define AT91C_PC5_SPI0_NPCS3 (AT91C_PIO_PC5) // #define AT91C_PIO_PC6 (1 << 6) // Pin Controlled by PC6 #define AT91C_PC6_A8 (AT91C_PIO_PC6) // #define AT91C_PC6_PWML0 (AT91C_PIO_PC6) // #define AT91C_PIO_PC7 (1 << 7) // Pin Controlled by PC7 #define AT91C_PC7_A9 (AT91C_PIO_PC7) // #define AT91C_PC7_PWML1 (AT91C_PIO_PC7) // #define AT91C_PIO_PC8 (1 << 8) // Pin Controlled by PC8 #define AT91C_PC8_A10 (AT91C_PIO_PC8) // #define AT91C_PC8_PWML2 (AT91C_PIO_PC8) // #define AT91C_PIO_PC9 (1 << 9) // Pin Controlled by PC9 #define AT91C_PC9_A11 (AT91C_PIO_PC9) // #define AT91C_PC9_PWML3 (AT91C_PIO_PC9) // // ***************************************************************************** // PERIPHERAL ID DEFINITIONS FOR AT91SAM3U4 // ***************************************************************************** #define AT91C_ID_SUPC ( 0) // SUPPLY CONTROLLER #define AT91C_ID_RSTC ( 1) // RESET CONTROLLER #define AT91C_ID_RTC ( 2) // REAL TIME CLOCK #define AT91C_ID_RTT ( 3) // REAL TIME TIMER #define AT91C_ID_WDG ( 4) // WATCHDOG TIMER #define AT91C_ID_PMC ( 5) // PMC #define AT91C_ID_EFC0 ( 6) // EFC0 #define AT91C_ID_EFC1 ( 7) // EFC1 #define AT91C_ID_DBGU ( 8) // DBGU #define AT91C_ID_HSMC4 ( 9) // HSMC4 #define AT91C_ID_PIOA (10) // Parallel IO Controller A #define AT91C_ID_PIOB (11) // Parallel IO Controller B #define AT91C_ID_PIOC (12) // Parallel IO Controller C #define AT91C_ID_US0 (13) // USART 0 #define AT91C_ID_US1 (14) // USART 1 #define AT91C_ID_US2 (15) // USART 2 #define AT91C_ID_US3 (16) // USART 3 #define AT91C_ID_MCI0 (17) // Multimedia Card Interface #define AT91C_ID_TWI0 (18) // TWI 0 #define AT91C_ID_TWI1 (19) // TWI 1 #define AT91C_ID_SPI0 (20) // Serial Peripheral Interface #define AT91C_ID_SSC0 (21) // Serial Synchronous Controller 0 #define AT91C_ID_TC0 (22) // Timer Counter 0 #define AT91C_ID_TC1 (23) // Timer Counter 1 #define AT91C_ID_TC2 (24) // Timer Counter 2 #define AT91C_ID_PWMC (25) // Pulse Width Modulation Controller #define AT91C_ID_ADC12B (26) // 12-bit ADC Controller (ADC12B) #define AT91C_ID_ADC (27) // 10-bit ADC Controller (ADC) #define AT91C_ID_HDMA (28) // HDMA #define AT91C_ID_UDPHS (29) // USB Device High Speed #define AT91C_ALL_INT (0x3FFFFFFF) // ALL VALID INTERRUPTS // ***************************************************************************** // BASE ADDRESS DEFINITIONS FOR AT91SAM3U4 // ***************************************************************************** #define AT91C_BASE_SYS (AT91_CAST(AT91PS_SYS) 0x400E0000) // (SYS) Base Address #define AT91C_BASE_HSMC4_CS0 (AT91_CAST(AT91PS_HSMC4_CS) 0x400E0070) // (HSMC4_CS0) Base Address #define AT91C_BASE_HSMC4_CS1 (AT91_CAST(AT91PS_HSMC4_CS) 0x400E0084) // (HSMC4_CS1) Base Address #define AT91C_BASE_HSMC4_CS2 (AT91_CAST(AT91PS_HSMC4_CS) 0x400E0098) // (HSMC4_CS2) Base Address #define AT91C_BASE_HSMC4_CS3 (AT91_CAST(AT91PS_HSMC4_CS) 0x400E00AC) // (HSMC4_CS3) Base Address #define AT91C_BASE_HSMC4_NFC (AT91_CAST(AT91PS_HSMC4_CS) 0x400E00FC) // (HSMC4_NFC) Base Address #define AT91C_BASE_HSMC4 (AT91_CAST(AT91PS_HSMC4) 0x400E0000) // (HSMC4) Base Address #define AT91C_BASE_MATRIX (AT91_CAST(AT91PS_HMATRIX2) 0x400E0200) // (MATRIX) Base Address #define AT91C_BASE_NVIC (AT91_CAST(AT91PS_NVIC) 0xE000E000) // (NVIC) Base Address #define AT91C_BASE_MPU (AT91_CAST(AT91PS_MPU) 0xE000ED90) // (MPU) Base Address #define AT91C_BASE_CM3 (AT91_CAST(AT91PS_CM3) 0xE000ED00) // (CM3) Base Address #define AT91C_BASE_PDC_DBGU (AT91_CAST(AT91PS_PDC) 0x400E0700) // (PDC_DBGU) Base Address #define AT91C_BASE_DBGU (AT91_CAST(AT91PS_DBGU) 0x400E0600) // (DBGU) Base Address #define AT91C_BASE_PIOA (AT91_CAST(AT91PS_PIO) 0x400E0C00) // (PIOA) Base Address #define AT91C_BASE_PIOB (AT91_CAST(AT91PS_PIO) 0x400E0E00) // (PIOB) Base Address #define AT91C_BASE_PIOC (AT91_CAST(AT91PS_PIO) 0x400E1000) // (PIOC) Base Address #define AT91C_BASE_PMC (AT91_CAST(AT91PS_PMC) 0x400E0400) // (PMC) Base Address #define AT91C_BASE_CKGR (AT91_CAST(AT91PS_CKGR) 0x400E041C) // (CKGR) Base Address #define AT91C_BASE_RSTC (AT91_CAST(AT91PS_RSTC) 0x400E1200) // (RSTC) Base Address #define AT91C_BASE_SUPC (AT91_CAST(AT91PS_SUPC) 0x400E1210) // (SUPC) Base Address #define AT91C_BASE_RTTC (AT91_CAST(AT91PS_RTTC) 0x400E1230) // (RTTC) Base Address #define AT91C_BASE_WDTC (AT91_CAST(AT91PS_WDTC) 0x400E1250) // (WDTC) Base Address #define AT91C_BASE_RTC (AT91_CAST(AT91PS_RTC) 0x400E1260) // (RTC) Base Address #define AT91C_BASE_ADC0 (AT91_CAST(AT91PS_ADC) 0x400AC000) // (ADC0) Base Address #define AT91C_BASE_ADC12B (AT91_CAST(AT91PS_ADC12B ) 0x400A8000) // (ADC12B ) Base Address #define AT91C_BASE_TC0 (AT91_CAST(AT91PS_TC) 0x40080000) // (TC0) Base Address #define AT91C_BASE_TC1 (AT91_CAST(AT91PS_TC) 0x40080040) // (TC1) Base Address #define AT91C_BASE_TC2 (AT91_CAST(AT91PS_TC) 0x40080080) // (TC2) Base Address #define AT91C_BASE_TCB0 (AT91_CAST(AT91PS_TCB) 0x40080000) // (TCB0) Base Address #define AT91C_BASE_TCB1 (AT91_CAST(AT91PS_TCB) 0x40080040) // (TCB1) Base Address #define AT91C_BASE_TCB2 (AT91_CAST(AT91PS_TCB) 0x40080080) // (TCB2) Base Address #define AT91C_BASE_EFC0 (AT91_CAST(AT91PS_EFC) 0x400E0800) // (EFC0) Base Address #define AT91C_BASE_EFC1 (AT91_CAST(AT91PS_EFC) 0x400E0A00) // (EFC1) Base Address #define AT91C_BASE_MCI0 (AT91_CAST(AT91PS_MCI) 0x40000000) // (MCI0) Base Address #define AT91C_BASE_PDC_TWI0 (AT91_CAST(AT91PS_PDC) 0x40084100) // (PDC_TWI0) Base Address #define AT91C_BASE_PDC_TWI1 (AT91_CAST(AT91PS_PDC) 0x40088100) // (PDC_TWI1) Base Address #define AT91C_BASE_TWI0 (AT91_CAST(AT91PS_TWI) 0x40084000) // (TWI0) Base Address #define AT91C_BASE_TWI1 (AT91_CAST(AT91PS_TWI) 0x40088000) // (TWI1) Base Address #define AT91C_BASE_PDC_US0 (AT91_CAST(AT91PS_PDC) 0x40090100) // (PDC_US0) Base Address #define AT91C_BASE_US0 (AT91_CAST(AT91PS_USART) 0x40090000) // (US0) Base Address #define AT91C_BASE_PDC_US1 (AT91_CAST(AT91PS_PDC) 0x40094100) // (PDC_US1) Base Address #define AT91C_BASE_US1 (AT91_CAST(AT91PS_USART) 0x40094000) // (US1) Base Address #define AT91C_BASE_PDC_US2 (AT91_CAST(AT91PS_PDC) 0x40098100) // (PDC_US2) Base Address #define AT91C_BASE_US2 (AT91_CAST(AT91PS_USART) 0x40098000) // (US2) Base Address #define AT91C_BASE_PDC_US3 (AT91_CAST(AT91PS_PDC) 0x4009C100) // (PDC_US3) Base Address #define AT91C_BASE_US3 (AT91_CAST(AT91PS_USART) 0x4009C000) // (US3) Base Address #define AT91C_BASE_PDC_SSC0 (AT91_CAST(AT91PS_PDC) 0x40004100) // (PDC_SSC0) Base Address #define AT91C_BASE_SSC0 (AT91_CAST(AT91PS_SSC) 0x40004000) // (SSC0) Base Address #define AT91C_BASE_PDC_PWMC (AT91_CAST(AT91PS_PDC) 0x4008C100) // (PDC_PWMC) Base Address #define AT91C_BASE_PWMC_CH0 (AT91_CAST(AT91PS_PWMC_CH) 0x4008C200) // (PWMC_CH0) Base Address #define AT91C_BASE_PWMC_CH1 (AT91_CAST(AT91PS_PWMC_CH) 0x4008C220) // (PWMC_CH1) Base Address #define AT91C_BASE_PWMC_CH2 (AT91_CAST(AT91PS_PWMC_CH) 0x4008C240) // (PWMC_CH2) Base Address #define AT91C_BASE_PWMC_CH3 (AT91_CAST(AT91PS_PWMC_CH) 0x4008C260) // (PWMC_CH3) Base Address #define AT91C_BASE_PWMC (AT91_CAST(AT91PS_PWMC) 0x4008C000) // (PWMC) Base Address #define AT91C_BASE_SPI0 (AT91_CAST(AT91PS_SPI) 0x40008000) // (SPI0) Base Address #define AT91C_BASE_UDPHS_EPTFIFO (AT91_CAST(AT91PS_UDPHS_EPTFIFO) 0x20180000) // (UDPHS_EPTFIFO) Base Address #define AT91C_BASE_UDPHS_EPT_0 (AT91_CAST(AT91PS_UDPHS_EPT) 0x400A4100) // (UDPHS_EPT_0) Base Address #define AT91C_BASE_UDPHS_EPT_1 (AT91_CAST(AT91PS_UDPHS_EPT) 0x400A4120) // (UDPHS_EPT_1) Base Address #define AT91C_BASE_UDPHS_EPT_2 (AT91_CAST(AT91PS_UDPHS_EPT) 0x400A4140) // (UDPHS_EPT_2) Base Address #define AT91C_BASE_UDPHS_EPT_3 (AT91_CAST(AT91PS_UDPHS_EPT) 0x400A4160) // (UDPHS_EPT_3) Base Address #define AT91C_BASE_UDPHS_EPT_4 (AT91_CAST(AT91PS_UDPHS_EPT) 0x400A4180) // (UDPHS_EPT_4) Base Address #define AT91C_BASE_UDPHS_EPT_5 (AT91_CAST(AT91PS_UDPHS_EPT) 0x400A41A0) // (UDPHS_EPT_5) Base Address #define AT91C_BASE_UDPHS_EPT_6 (AT91_CAST(AT91PS_UDPHS_EPT) 0x400A41C0) // (UDPHS_EPT_6) Base Address #define AT91C_BASE_UDPHS_DMA_1 (AT91_CAST(AT91PS_UDPHS_DMA) 0x400A4310) // (UDPHS_DMA_1) Base Address #define AT91C_BASE_UDPHS_DMA_2 (AT91_CAST(AT91PS_UDPHS_DMA) 0x400A4320) // (UDPHS_DMA_2) Base Address #define AT91C_BASE_UDPHS_DMA_3 (AT91_CAST(AT91PS_UDPHS_DMA) 0x400A4330) // (UDPHS_DMA_3) Base Address #define AT91C_BASE_UDPHS_DMA_4 (AT91_CAST(AT91PS_UDPHS_DMA) 0x400A4340) // (UDPHS_DMA_4) Base Address #define AT91C_BASE_UDPHS_DMA_5 (AT91_CAST(AT91PS_UDPHS_DMA) 0x400A4350) // (UDPHS_DMA_5) Base Address #define AT91C_BASE_UDPHS_DMA_6 (AT91_CAST(AT91PS_UDPHS_DMA) 0x400A4360) // (UDPHS_DMA_6) Base Address #define AT91C_BASE_UDPHS (AT91_CAST(AT91PS_UDPHS) 0x400A4000) // (UDPHS) Base Address #define AT91C_BASE_HDMA_CH_0 (AT91_CAST(AT91PS_HDMA_CH) 0x400B003C) // (HDMA_CH_0) Base Address #define AT91C_BASE_HDMA_CH_1 (AT91_CAST(AT91PS_HDMA_CH) 0x400B0064) // (HDMA_CH_1) Base Address #define AT91C_BASE_HDMA_CH_2 (AT91_CAST(AT91PS_HDMA_CH) 0x400B008C) // (HDMA_CH_2) Base Address #define AT91C_BASE_HDMA_CH_3 (AT91_CAST(AT91PS_HDMA_CH) 0x400B00B4) // (HDMA_CH_3) Base Address #define AT91C_BASE_HDMA (AT91_CAST(AT91PS_HDMA) 0x400B0000) // (HDMA) Base Address // ***************************************************************************** // MEMORY MAPPING DEFINITIONS FOR AT91SAM3U4 // ***************************************************************************** // ITCM #define AT91C_ITCM (0x00100000) // Maximum ITCM Area base address #define AT91C_ITCM_SIZE (0x00010000) // Maximum ITCM Area size in byte (64 Kbytes) // DTCM #define AT91C_DTCM (0x00200000) // Maximum DTCM Area base address #define AT91C_DTCM_SIZE (0x00010000) // Maximum DTCM Area size in byte (64 Kbytes) // IRAM #define AT91C_IRAM (0x20000000) // Maximum Internal SRAM base address #define AT91C_IRAM_SIZE (0x00008000) // Maximum Internal SRAM size in byte (32 Kbytes) // IRAM_MIN #define AT91C_IRAM_MIN (0x00300000) // Minimum Internal RAM base address #define AT91C_IRAM_MIN_SIZE (0x00004000) // Minimum Internal RAM size in byte (16 Kbytes) // IROM #define AT91C_IROM (0x00180000) // Internal ROM base address #define AT91C_IROM_SIZE (0x00008000) // Internal ROM size in byte (32 Kbytes) // IFLASH0 #define AT91C_IFLASH0 (0x00080000) // Maximum IFLASH Area : 128Kbyte base address #define AT91C_IFLASH0_SIZE (0x00020000) // Maximum IFLASH Area : 128Kbyte size in byte (128 Kbytes) #define AT91C_IFLASH0_PAGE_SIZE (256) // Maximum IFLASH Area : 128Kbyte Page Size: 256 bytes #define AT91C_IFLASH0_LOCK_REGION_SIZE (8192) // Maximum IFLASH Area : 128Kbyte Lock Region Size: 8 Kbytes #define AT91C_IFLASH0_NB_OF_PAGES (512) // Maximum IFLASH Area : 128Kbyte Number of Pages: 512 bytes #define AT91C_IFLASH0_NB_OF_LOCK_BITS (16) // Maximum IFLASH Area : 128Kbyte Number of Lock Bits: 16 bytes // IFLASH1 #define AT91C_IFLASH1 (0x00100000) // Maximum IFLASH Area : 128Kbyte base address #define AT91C_IFLASH1_SIZE (0x00020000) // Maximum IFLASH Area : 128Kbyte size in byte (128 Kbytes) #define AT91C_IFLASH1_PAGE_SIZE (256) // Maximum IFLASH Area : 128Kbyte Page Size: 256 bytes #define AT91C_IFLASH1_LOCK_REGION_SIZE (8192) // Maximum IFLASH Area : 128Kbyte Lock Region Size: 8 Kbytes #define AT91C_IFLASH1_NB_OF_PAGES (512) // Maximum IFLASH Area : 128Kbyte Number of Pages: 512 bytes #define AT91C_IFLASH1_NB_OF_LOCK_BITS (16) // Maximum IFLASH Area : 128Kbyte Number of Lock Bits: 16 bytes // EBI_CS0 #define AT91C_EBI_CS0 (0x10000000) // EBI Chip Select 0 base address #define AT91C_EBI_CS0_SIZE (0x10000000) // EBI Chip Select 0 size in byte (262144 Kbytes) // EBI_CS1 #define AT91C_EBI_CS1 (0x20000000) // EBI Chip Select 1 base address #define AT91C_EBI_CS1_SIZE (0x10000000) // EBI Chip Select 1 size in byte (262144 Kbytes) // EBI_SDRAM #define AT91C_EBI_SDRAM (0x20000000) // SDRAM on EBI Chip Select 1 base address #define AT91C_EBI_SDRAM_SIZE (0x10000000) // SDRAM on EBI Chip Select 1 size in byte (262144 Kbytes) // EBI_SDRAM_16BIT #define AT91C_EBI_SDRAM_16BIT (0x20000000) // SDRAM on EBI Chip Select 1 base address #define AT91C_EBI_SDRAM_16BIT_SIZE (0x02000000) // SDRAM on EBI Chip Select 1 size in byte (32768 Kbytes) // EBI_SDRAM_32BIT #define AT91C_EBI_SDRAM_32BIT (0x20000000) // SDRAM on EBI Chip Select 1 base address #define AT91C_EBI_SDRAM_32BIT_SIZE (0x04000000) // SDRAM on EBI Chip Select 1 size in byte (65536 Kbytes) // EBI_CS2 #define AT91C_EBI_CS2 (0x30000000) // EBI Chip Select 2 base address #define AT91C_EBI_CS2_SIZE (0x10000000) // EBI Chip Select 2 size in byte (262144 Kbytes) // EBI_CS3 #define AT91C_EBI_CS3 (0x40000000) // EBI Chip Select 3 base address #define AT91C_EBI_CS3_SIZE (0x10000000) // EBI Chip Select 3 size in byte (262144 Kbytes) // EBI_SM #define AT91C_EBI_SM (0x40000000) // NANDFLASH on EBI Chip Select 3 base address #define AT91C_EBI_SM_SIZE (0x10000000) // NANDFLASH on EBI Chip Select 3 size in byte (262144 Kbytes) // EBI_CS4 #define AT91C_EBI_CS4 (0x50000000) // EBI Chip Select 4 base address #define AT91C_EBI_CS4_SIZE (0x10000000) // EBI Chip Select 4 size in byte (262144 Kbytes) // EBI_CF0 #define AT91C_EBI_CF0 (0x50000000) // CompactFlash 0 on EBI Chip Select 4 base address #define AT91C_EBI_CF0_SIZE (0x10000000) // CompactFlash 0 on EBI Chip Select 4 size in byte (262144 Kbytes) // EBI_CS5 #define AT91C_EBI_CS5 (0x60000000) // EBI Chip Select 5 base address #define AT91C_EBI_CS5_SIZE (0x10000000) // EBI Chip Select 5 size in byte (262144 Kbytes) // EBI_CF1 #define AT91C_EBI_CF1 (0x60000000) // CompactFlash 1 on EBIChip Select 5 base address #define AT91C_EBI_CF1_SIZE (0x10000000) // CompactFlash 1 on EBIChip Select 5 size in byte (262144 Kbytes) #endif tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/McuSleepC.nc000066400000000000000000000271301207233610700227730ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Wanja Hofer * @author Kevin Klues * @author JeongGil Ko */ #include "AT91SAM3U4.h" #include "hardware.h" #include "sam3upmchardware.h" #include "sam3usupchardware.h" #include "sam3unvichardware.h" #include "sam3rtthardware.h" #include "sam3tchardware.h" #include "sam3uadc12bhardware.h" module McuSleepC { provides{ interface McuSleep; interface McuPowerState; interface Sam3LowPower; interface FunctionWrapper as InterruptWrapper; } uses { interface HplSam3Clock; } } implementation{ #define PMC_PIO_CLOCK_MASK 0x3FFFFFFC enum { S_AWAKE, S_SLEEP, S_WAIT, S_BACKUP, }; norace uint32_t ps; norace struct { uint32_t mck; adc12b_emr_t adc_emr; pmc_pcsr_t pmc_pcsr; pmc_uckr_t pmc_uckr; supc_mr_t supc_mr; uint32_t pioa_psr; uint32_t piob_psr; uint32_t pioc_psr; uint32_t pioa_osr; uint32_t piob_osr; uint32_t pioc_osr; uint32_t pioa_pusr; uint32_t piob_pusr; uint32_t pioc_pusr; } wait_restore; // This C function is defined so that we can call it // from platform_bootstrap(), as defined in platform.h void sam3uLowPowerConfigure() @C() @spontaneous() { // Only do this at startup // Configure all PIO as input AT91C_BASE_PIOA->PIO_ODR = 0xFFFFFFFF; AT91C_BASE_PIOB->PIO_ODR = 0xFFFFFFFF; AT91C_BASE_PIOC->PIO_ODR = 0xFFFFFFFF; // Force all peripherals to enable PIO AT91C_BASE_PIOA->PIO_PER = 0xFFFFFFFF; AT91C_BASE_PIOB->PIO_PER = 0xFFFFFFFF; AT91C_BASE_PIOC->PIO_PER = 0xFFFFFFFF; call Sam3LowPower.configure(); } async command void Sam3LowPower.configure() { // Put the ADC into off mode ADC12B->emr.bits.offmodes = 1; // Disable all Peripheral Clocks PMC->pc.pcdr.flat = PMC_PIO_CLOCK_MASK; // Stop UTMI PMC->uckr.bits.upllen = 0; // Disable brownout detector { supc_mr_t mr = SUPC->mr; mr.bits.key = 0xA5; mr.bits.boddis = 1; mr.bits.bodrsten = 0; SUPC->mr = mr; } // Customize pio settings as appropriate for the platform signal Sam3LowPower.customizePio(); } uint32_t getPowerState() { //if (PMC->pc.pcsr.flat & PMC_PIO_CLOCK_MASK) if ( PMC->pc.pcsr.bits.rtc || PMC->pc.pcsr.bits.rtt || PMC->pc.pcsr.bits.wdg || PMC->pc.pcsr.bits.pmc || PMC->pc.pcsr.bits.efc0 || PMC->pc.pcsr.bits.efc1 || PMC->pc.pcsr.bits.dbgu || PMC->pc.pcsr.bits.hsmc4 || PMC->pc.pcsr.bits.pioa || PMC->pc.pcsr.bits.piob || PMC->pc.pcsr.bits.pioc || PMC->pc.pcsr.bits.us0 || PMC->pc.pcsr.bits.us1 || PMC->pc.pcsr.bits.us2 || PMC->pc.pcsr.bits.us3 || PMC->pc.pcsr.bits.mci0 || PMC->pc.pcsr.bits.twi0 || PMC->pc.pcsr.bits.twi1 || PMC->pc.pcsr.bits.spi0 || PMC->pc.pcsr.bits.ssc0 || PMC->pc.pcsr.bits.tc0 || PMC->pc.pcsr.bits.tc1 || PMC->pc.pcsr.bits.tc2 || PMC->pc.pcsr.bits.pwmc || PMC->pc.pcsr.bits.adc12b || PMC->pc.pcsr.bits.adc || PMC->pc.pcsr.bits.hdma || PMC->pc.pcsr.bits.udphs || 0 ) return S_SLEEP; else return S_WAIT; } void commonSleep() { // Check if any alarms are set for the tc2 alarm hardware. // If not, turn off its peripheral clock // This is necessary because the TMicro alarm is linked to tc2. // More logic will need to be added here later, as more alarms are set up // for use. if(!(TC->ch2.imr.bits.cpcs & 0x01)) PMC->pc.pcdr.bits.tc2 = 1; } void commonResume() { // Turn the periperhal clock for tc2 back on so that its alarm can be // set and times can be read from it PMC->pc.pcer.bits.tc2 = 1; } void setupSleepMode() { // Nothing special to do here yet } void resumeFromSleepMode() { // Nothing special to do here yet } void setupWaitMode() { // Save the state of the cpu we are about to change wait_restore.mck = call HplSam3Clock.getMainClockSpeed(); wait_restore.adc_emr = ADC12B->emr; wait_restore.pmc_pcsr = PMC->pc.pcsr; wait_restore.pmc_uckr = PMC->uckr; wait_restore.supc_mr = SUPC->mr; wait_restore.pioa_psr = AT91C_BASE_PIOA->PIO_PSR; wait_restore.piob_psr = AT91C_BASE_PIOB->PIO_PSR; wait_restore.pioc_psr = AT91C_BASE_PIOC->PIO_PSR; wait_restore.pioa_osr = AT91C_BASE_PIOA->PIO_OSR; wait_restore.piob_osr = AT91C_BASE_PIOB->PIO_OSR; wait_restore.pioc_osr = AT91C_BASE_PIOC->PIO_OSR; wait_restore.pioa_pusr = AT91C_BASE_PIOA->PIO_PPUSR; wait_restore.piob_pusr = AT91C_BASE_PIOB->PIO_PPUSR; wait_restore.pioc_pusr = AT91C_BASE_PIOC->PIO_PPUSR; // Turn off all clocks to peripheral IO and configure pins // appropriately, so that when we go to sleep we are // drawing the least amount of current possible call Sam3LowPower.configure(); // Force us into 4 MHz with the RC Oscillator call HplSam3Clock.mckInit4RC(); // Setup for wait mode PMC->fsmr.bits.lpm = 1; // Only resume from wait mode with an input from the RTT PMC->fsmr.bits.rttal = 1; // Make sure we DON'T go into deep sleep (i.e. backup mode) SCB->scr.bits.sleepdeep = 0; } void resumeFromWaitMode() { // Restore the old clock settings uint32_t oldMck = wait_restore.mck; if(oldMck > 13000 && oldMck < 49000){ call HplSam3Clock.mckInit48(); }else if(oldMck > 49000 && oldMck < 90000){ call HplSam3Clock.mckInit84(); }else if(oldMck > 90000){ call HplSam3Clock.mckInit96(); } // Restore the ADC to its previous mode ADC12B->emr = wait_restore.adc_emr; // Reenable peripheral clocks, as appropriate PMC->pc.pcer.flat = wait_restore.pmc_pcsr.flat; PMC->pc.pcdr.flat = ~wait_restore.pmc_pcsr.flat; // Reenable the UTMI clock, as appropriate PMC->uckr = wait_restore.pmc_uckr; // Reenable brownout detector, as appropriate { supc_mr_t mr; mr = wait_restore.supc_mr; mr.bits.key = 0xA5; SUPC->mr = mr; } // Restore the PIO output/input pin and pullup resistor // settings to the values they had before entering wait mode AT91C_BASE_PIOA->PIO_PER = wait_restore.pioa_psr; AT91C_BASE_PIOB->PIO_PER = wait_restore.piob_psr; AT91C_BASE_PIOC->PIO_PER = wait_restore.pioc_psr; AT91C_BASE_PIOA->PIO_PDR = ~wait_restore.pioa_psr; AT91C_BASE_PIOB->PIO_PDR = ~wait_restore.piob_psr; AT91C_BASE_PIOC->PIO_PDR = ~wait_restore.pioc_psr; AT91C_BASE_PIOA->PIO_OER = wait_restore.pioa_osr; AT91C_BASE_PIOB->PIO_OER = wait_restore.piob_osr; AT91C_BASE_PIOC->PIO_OER = wait_restore.pioc_osr; AT91C_BASE_PIOA->PIO_ODR = ~wait_restore.pioa_osr; AT91C_BASE_PIOB->PIO_ODR = ~wait_restore.piob_osr; AT91C_BASE_PIOC->PIO_ODR = ~wait_restore.pioc_osr; // Notice the reverse logic below - its on purpose, check the data sheet // 0 means active, 1 means inactive AT91C_BASE_PIOA->PIO_PPUER = ~wait_restore.pioa_pusr; AT91C_BASE_PIOB->PIO_PPUER = ~wait_restore.piob_pusr; AT91C_BASE_PIOC->PIO_PPUER = ~wait_restore.pioc_pusr; AT91C_BASE_PIOA->PIO_PPUDR = wait_restore.pioa_pusr; AT91C_BASE_PIOB->PIO_PPUDR = wait_restore.piob_pusr; AT91C_BASE_PIOC->PIO_PPUDR = wait_restore.pioc_pusr; } void setupBackupMode() { // Not yet supported.... // Need to think more about how to do this since it is essentially a "hibernate" // mode, meaning we will have to save all register and memory state into // non-volatile memory. Possibly more state will need to be saved as well. } void resumeFromBackupMode() { // Not yet supported.... // Need to think more about how to do this since it is essentially a "hibernate" // mode and resuming will be from a reboot, not a simple interrupt service routine // Consider changing vectors.c to call out to this after checking some state variable // stored in the internal EEFC. } async command void McuSleep.sleep() { commonSleep(); switch(ps = getPowerState()) { case S_AWAKE: //Just stay awake... break; case S_SLEEP: // Setup for sleep mode setupSleepMode(); break; case S_WAIT: // Setup for wait mode setupWaitMode(); break; case S_BACKUP: // Setup for backup mode setupBackupMode(); break; default: // Default setup setupSleepMode(); } __nesc_enable_interrupt(); // Enter appropriate idle mode if(ps != S_AWAKE) __asm volatile ("wfe"); // Normally, at this point we can only be woken up by an interrupt, so execution continues // in the body of the InterruptWrapper.preamble() command before returning to here // However, if we never actually went to sleep, we need to force this command to run. if(ps == S_AWAKE) call InterruptWrapper.preamble(); // all of memory may change at this point, because an IRQ handler // may have posted a task! asm volatile("" : : : "memory"); __nesc_disable_interrupt(); } async command void InterruptWrapper.preamble() { atomic { switch(ps) { case S_AWAKE: // Stayed awake the whole time, so do nothing break; case S_SLEEP: // Resume from sleep mode resumeFromSleepMode(); break; case S_WAIT: // Resume from wait mode resumeFromWaitMode(); break; case S_BACKUP: // Resume from backup mode resumeFromBackupMode(); break; default: // Default resume resumeFromSleepMode(); } if(ps != S_AWAKE) commonResume(); ps = S_AWAKE; } } async command void InterruptWrapper.postamble() { /* Do nothing */ } async command void McuPowerState.update(){} async event void HplSam3Clock.mainClockChanged(){} default async event void Sam3LowPower.customizePio() {} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/000077500000000000000000000000001207233610700216625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/AdcP.nc000066400000000000000000000156561207233610700230300ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" module AdcP { provides { interface Read as Read[uint8_t client]; interface ReadNow as ReadNow[uint8_t client]; interface Resource as ResourceReadNow[uint8_t client]; } uses { // for Read only: interface Resource as ResourceRead[uint8_t client]; // for ReadNow only: interface Resource as SubResourceReadNow[uint8_t client]; // for Read and ReadNow: interface Sam3uGetAdc12b as GetAdc[uint8_t client]; interface AdcConfigure as Config[uint8_t client]; } } implementation { norace uint8_t state; norace uint8_t readNowClient; norace uint8_t setClient; norace uint16_t adcResult; enum { S_READ, S_READNOW, }; error_t configureAdcRegisters(uint8_t client) { const sam3u_adc12_channel_config_t * ONE config; config = call Config.getConfiguration[client](); return call GetAdc.configureAdc[client](config); } /** Read.read - TEP 114 **/ command error_t Read.read[uint8_t client]() { state = S_READ; return call ResourceRead.request[client](); } event void ResourceRead.granted[uint8_t client]() { error_t result = configureAdcRegisters(client); if(result == SUCCESS){ //call actual read! call GetAdc.getData[client](); }else{ //configure failed! call ResourceRead.release[client](); signal Read.readDone[client](result, 0); } } /************************************************/ /** ReadNow.read **/ async command error_t ReadNow.read[uint8_t nowClient]() { if(call SubResourceReadNow.isOwner[nowClient]()){ return call GetAdc.getData[nowClient](); }else{ return FAIL; } } task void signalGranted(){ error_t error = configureAdcRegisters(readNowClient); if(error == SUCCESS){ state = S_READNOW; }else{ // config error } signal ResourceReadNow.granted[readNowClient](); } async command error_t ResourceReadNow.request[uint8_t nowClient]() { if(!call SubResourceReadNow.isOwner[nowClient]()) return call SubResourceReadNow.request[nowClient](); else{ atomic readNowClient = nowClient; post signalGranted(); return SUCCESS; } } event void SubResourceReadNow.granted[uint8_t nowClient]() { error_t error = configureAdcRegisters(nowClient); if(error == SUCCESS){ state = S_READNOW; }else{ // config error } signal ResourceReadNow.granted[nowClient](); } async command error_t ResourceReadNow.immediateRequest[uint8_t nowClient]() { error_t result = call SubResourceReadNow.immediateRequest[nowClient](); if (result == SUCCESS){ result = configureAdcRegisters(nowClient); if (result == SUCCESS) state = S_READNOW; } return result; } async command error_t ResourceReadNow.release[uint8_t nowClient]() { return call SubResourceReadNow.release[nowClient](); } async command bool ResourceReadNow.isOwner[uint8_t nowClient]() { return call SubResourceReadNow.isOwner[nowClient](); } /** Read Done **/ void task readDone() { call ResourceRead.release[setClient](); signal Read.readDone[setClient](SUCCESS, adcResult); } void task readDoneNow() { signal ReadNow.readDone[setClient](SUCCESS, adcResult); } /************************************************/ /** Data is ready! **/ async event error_t GetAdc.dataReady[uint8_t client](uint16_t data) { atomic setClient = client; atomic adcResult = data; switch (state) { case S_READ: call ResourceRead.release[client](); post readDone(); break; case S_READNOW: post readDoneNow(); break; default: break; } return SUCCESS; } /************************************************/ const sam3u_adc12_channel_config_t defaultConfig = { channel: 0, diff: 0, prescal: 2, lowres: 0, shtim: 15, ibctl: 1, sleep: 0, startup: 104, trgen: 0, trgsel: 0 }; default async command error_t ResourceRead.request[uint8_t client]() { return FAIL; } default async command error_t ResourceRead.immediateRequest[uint8_t client]() { return FAIL; } default async command error_t ResourceRead.release[uint8_t client]() { return FAIL; } default async command bool ResourceRead.isOwner[uint8_t client]() { return FALSE; } default event void Read.readDone[uint8_t client]( error_t result, uint16_t val ){} default async command error_t SubResourceReadNow.release[uint8_t nowClient](){ return FAIL;} default async command error_t SubResourceReadNow.request[uint8_t nowClient](){ return FAIL; } default async command bool SubResourceReadNow.isOwner[uint8_t client]() { return FALSE; } default event void ResourceReadNow.granted[uint8_t nowClient](){} default async event void ReadNow.readDone[uint8_t client]( error_t result, uint16_t val ){} default async command error_t SubResourceReadNow.immediateRequest[uint8_t nowClient]() { return FAIL; } default async command error_t GetAdc.getData[uint8_t client](){ return EINVAL; } default async command const sam3u_adc12_channel_config_t* Config.getConfiguration[uint8_t client]() { return &defaultConfig; } default async command error_t GetAdc.configureAdc[uint8_t client](const sam3u_adc12_channel_config_t *config){ return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/AdcReadClientC.nc000066400000000000000000000041351207233610700247340ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" generic configuration AdcReadClientC() { provides { interface Read; } uses interface AdcConfigure; } implementation { components AdcP; components new Sam3uAdc12bClientC(); enum { CLIENT = unique(ADCC_SERVICE), }; Read = AdcP.Read[CLIENT]; AdcConfigure = AdcP.Config[CLIENT]; AdcP.GetAdc[CLIENT] -> Sam3uAdc12bClientC.Sam3uGetAdc12b; AdcP.ResourceRead[CLIENT] -> Sam3uAdc12bClientC.Resource; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/AdcReadNowClientC.nc000066400000000000000000000042621207233610700254210ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" generic configuration AdcReadNowClientC() { provides { interface ReadNow; interface Resource; } uses interface AdcConfigure; } implementation { components AdcP; components new Sam3uAdc12bClientC(); enum { CLIENT = unique(ADCC_SERVICE), }; ReadNow = AdcP.ReadNow[CLIENT]; AdcConfigure = AdcP.Config[CLIENT]; Resource = AdcP.ResourceReadNow[CLIENT]; AdcP.GetAdc[CLIENT] -> Sam3uAdc12bClientC.Sam3uGetAdc12b; AdcP.SubResourceReadNow[CLIENT] -> Sam3uAdc12bClientC.Resource; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/AdcReadStreamClientC.nc000066400000000000000000000044461207233610700261150ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" generic configuration AdcReadStreamClientC() { provides { interface ReadStream; } uses interface AdcConfigure; } implementation { #ifndef SAM3U_ADC12B_PDC components AdcStreamP; #else components AdcStreamPDCP as AdcStreamP; #endif components new Sam3uAdc12bClientC(); components WireAdcStreamP; enum { CLIENT = unique(ADCC_READ_STREAM_SERVICE), }; ReadStream = WireAdcStreamP.ReadStream[CLIENT]; AdcConfigure = WireAdcStreamP.AdcConfigure[CLIENT]; WireAdcStreamP.Resource[CLIENT] -> Sam3uAdc12bClientC.Resource; WireAdcStreamP.Sam3uGetAdc12b[CLIENT] -> Sam3uAdc12bClientC.Sam3uGetAdc12b; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/AdcStreamP.nc000066400000000000000000000152711207233610700241750ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation for ReadStream interface in Sam3u * (Coverted msp430 and atm128 code) * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" module AdcStreamP { provides { interface Init @atleastonce(); interface ReadStream[uint8_t client]; } uses { interface Sam3uGetAdc12b as GetAdc[uint8_t client]; interface AdcConfigure as Config[uint8_t client]; interface Alarm; interface Leds; } } implementation { enum { NSTREAM = uniqueCount(ADCC_READ_STREAM_SERVICE) }; norace uint8_t client = NSTREAM; struct list_entry_t { uint16_t count; struct list_entry_t * ONE_NOK next; }; struct list_entry_t *bufferQueue[NSTREAM]; struct list_entry_t * ONE_NOK * bufferQueueEnd[NSTREAM]; uint16_t * COUNT_NOK(lastCount) lastBuffer, lastCount; norace uint16_t count; norace uint16_t * COUNT_NOK(count) buffer; norace uint16_t * BND_NOK(buffer, buffer+count) pos; norace uint32_t now, period; command error_t Init.init() { uint8_t i; for (i = 0; i != NSTREAM; i++) bufferQueueEnd[i] = &bufferQueue[i]; return SUCCESS; } void sampleSingle() { call GetAdc.getData[client](); } error_t postBuffer(uint8_t c, uint16_t *buf, uint16_t n) { if (n < sizeof(struct list_entry_t)) return ESIZE; atomic { struct list_entry_t * ONE newEntry = TCAST(struct list_entry_t * ONE, buf); if (!bufferQueueEnd[c]) return FAIL; newEntry->count = n; newEntry->next = NULL; *bufferQueueEnd[c] = newEntry; bufferQueueEnd[c] = &newEntry->next; } return SUCCESS; } command error_t ReadStream.postBuffer[uint8_t c](uint16_t *buf, uint16_t n) { return postBuffer(c, buf, n); } task void readStreamDone() { uint8_t c = client; uint32_t actualPeriod = period; atomic { bufferQueue[c] = NULL; bufferQueueEnd[c] = &bufferQueue[c]; } client = NSTREAM; signal ReadStream.readDone[c](SUCCESS, actualPeriod); } task void readStreamFail() { struct list_entry_t *entry; uint8_t c = client; atomic entry = bufferQueue[c]; for (; entry; entry = entry->next) { uint16_t tmp_count __DEPUTY_UNUSED__ = entry->count; signal ReadStream.bufferDone[c](FAIL, TCAST(uint16_t * COUNT_NOK(tmp_count),entry), entry->count); } atomic { bufferQueue[c] = NULL; bufferQueueEnd[c] = &bufferQueue[c]; } client = NSTREAM; signal ReadStream.readDone[c](FAIL, 0); } task void bufferDone() { uint16_t *b, c; atomic { b = lastBuffer; c = lastCount; lastBuffer = NULL; } signal ReadStream.bufferDone[client](SUCCESS, b, c); } void nextAlarm() { call Alarm.startAt(now, period); now += period; } async event void Alarm.fired() { sampleSingle(); } error_t nextBuffer(bool startNextAlarm) { atomic { struct list_entry_t *entry = bufferQueue[client]; if (!entry) { // all done bufferQueueEnd[client] = NULL; // prevent post post readStreamDone(); return FAIL; } else { uint16_t tmp_count; bufferQueue[client] = entry->next; if (!bufferQueue[client]) bufferQueueEnd[client] = &bufferQueue[client]; pos = buffer = NULL; count = entry->count; tmp_count = count; pos = buffer = TCAST(uint16_t * COUNT_NOK(tmp_count), entry); if (startNextAlarm) nextAlarm(); return SUCCESS; } } } command error_t ReadStream.read[uint8_t c](uint32_t usPeriod) { /* not exactly microseconds */ /* ADC is currently based on a 1.5MHz clock */ period = usPeriod; client = c; now = call Alarm.getNow(); call GetAdc.configureAdc[c](call Config.getConfiguration[c]()); if (nextBuffer(FALSE) == SUCCESS){ sampleSingle(); } return SUCCESS; } async event error_t GetAdc.dataReady[uint8_t streamClient](uint16_t data) { call Leds.led0Toggle(); if (client == NSTREAM) return FAIL; if (count == 0) { now = call Alarm.getNow(); nextBuffer(TRUE); } else { *pos++ = data; if (pos == buffer + count) { atomic { if (lastBuffer) { /* We failed to signal bufferDone in time. Fail. */ bufferQueueEnd[client] = NULL; // prevent post post readStreamFail(); return FAIL; } else { lastCount = count; lastBuffer = buffer; } } post bufferDone(); nextBuffer(TRUE); } else nextAlarm(); } return FAIL; } const sam3u_adc12_channel_config_t defaultConfig = { }; default async command const sam3u_adc12_channel_config_t* Config.getConfiguration[uint8_t c]() { return &defaultConfig; } default async command error_t GetAdc.getData[uint8_t c]() { return FAIL; } default async command error_t GetAdc.configureAdc[uint8_t c]( const sam3u_adc12_channel_config_t *config){ return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/AdcStreamPDCP.nc000066400000000000000000000110341207233610700245150ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation for ReadStream interface with PDC in Sam3u * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" module AdcStreamPDCP { provides { interface Init @atleastonce(); interface ReadStream[uint8_t client]; } uses { interface Sam3uGetAdc12b as GetAdc[uint8_t client]; interface AdcConfigure as Config[uint8_t client]; //interface Alarm; interface HplSam3Pdc as HplPdc; interface Leds; } } implementation { enum { NSTREAM = uniqueCount(ADCC_READ_STREAM_SERVICE) }; norace uint8_t client = NSTREAM; volatile adc12b_cr_t *CR = (volatile adc12b_cr_t *) 0x400A8000; adc12b_cr_t cr; struct list_entry_t { uint16_t count; struct list_entry_t * ONE_NOK next; }; struct list_entry_t *bufferQueue[NSTREAM]; struct list_entry_t * ONE_NOK * bufferQueueEnd[NSTREAM]; uint16_t * COUNT_NOK(lastCount) lastBuffer, lastCount; norace uint16_t count; norace uint16_t * COUNT_NOK(count) buffer; norace uint16_t * BND_NOK(buffer, buffer+count) pos; norace uint32_t now, period; norace uint16_t originalLength; norace uint16_t *originalPointer; norace uint8_t state; enum{ S_READ, S_IDLE, }; command error_t Init.init() { uint8_t i; state = S_IDLE; for (i = 0; i != NSTREAM; i++) bufferQueueEnd[i] = &bufferQueue[i]; return SUCCESS; } void samplePdc() { // switch this to pdc enable call HplPdc.enablePdcRx(); atomic cr.bits.start = 1; // enable software trigger atomic *CR = cr; } command error_t ReadStream.postBuffer[uint8_t c](uint16_t *buf, uint16_t n) { // set parameters here!!!! // set pdc buffers and set the length as a global parameter originalLength = n; originalPointer = buf; call HplPdc.setRxPtr(buf); call HplPdc.setRxCounter(n); return SUCCESS; } command error_t ReadStream.read[uint8_t c](uint32_t usPeriod) { period = usPeriod; client = c; call GetAdc.configureAdc[c](call Config.getConfiguration[c]()); state = S_READ; samplePdc(); return SUCCESS; } task void signalReadDone(){ signal ReadStream.readDone[client](SUCCESS, period); } task void signalBufferDone(){ signal ReadStream.bufferDone[client](SUCCESS, originalPointer, originalLength); } async event error_t GetAdc.dataReady[uint8_t streamClient](uint16_t data) { if(state == S_READ){ atomic state = S_IDLE; call HplPdc.disablePdcRx(); post signalReadDone(); post signalBufferDone(); } return SUCCESS; } const sam3u_adc12_channel_config_t defaultConfig = { }; default async command const sam3u_adc12_channel_config_t* Config.getConfiguration[uint8_t c]() { return &defaultConfig; } default async command error_t GetAdc.getData[uint8_t c]() { return FAIL; } default async command error_t GetAdc.configureAdc[uint8_t c]( const sam3u_adc12_channel_config_t *config){ return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/HplAdc12b.nc000066400000000000000000000034221207233610700236450ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ // introduce interfaces for Hpl #include "sam3uadc12bhardware.h" interface HplAdc12b{ async command void startConversion(); async command void stopConversion(); async command void enableConversion(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/HplAdc12bC.nc000066400000000000000000000032571207233610700237560ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ configuration HplAdc12bC{ provides{ interface HplAdc12b; } } implementation{ components HplAdc12P; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/HplAdc12bP.nc000066400000000000000000000032511207233610700237650ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ // Implement lowest layer - Hpl module HplAdc12P { provides interface HplAdc12; } implementation { } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/README000066400000000000000000000004051207233610700225410ustar00rootroot0000000000000012 bit ADC implementation for SAM3U @author JeongGil Ko The implementation is based on the preliminary specifications and the MSP430 implementations. - Supported Interfaces --- Read Interface --- ReadNow Interface --- ReadStream Interface tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/Sam3uAdc12bClientC.nc000066400000000000000000000036731207233610700253640ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" generic configuration Sam3uAdc12bClientC() { provides { interface Resource; interface Sam3uGetAdc12b; } } implementation { components Sam3uAdc12bP; enum { ID = unique(SAM3UADC12_RESOURCE), }; Resource = Sam3uAdc12bP.Resource[ID]; Sam3uGetAdc12b = Sam3uAdc12bP.Sam3uGetAdc12b[ID]; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/Sam3uAdc12bImplP.nc000066400000000000000000000172011207233610700250540ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" module Sam3uAdc12bImplP { provides { interface Init; interface Sam3uGetAdc12b as Sam3uAdc12b[uint8_t id]; } uses { interface HplNVICInterruptCntl as ADC12BInterrupt; interface HplSam3GeneralIOPin as Adc12bPin; interface HplSam3PeripheralClockCntl as Adc12bClockControl; interface HplSam3Clock as ClockConfig; interface FunctionWrapper as Adc12bInterruptWrapper; #ifdef SAM3U_ADC12B_PDC interface HplSam3Pdc as HplPdc; #endif interface Leds; } } implementation { norace uint8_t clientID; norace uint8_t state; enum{ S_ADC, S_IDLE, }; command error_t Init.init(){ /* Enable interrupts */ call ADC12BInterrupt.configure(IRQ_PRIO_ADC12B); // Peripheral ID 26 for ADC12B call ADC12BInterrupt.enable(); /* Enable clock */ call Adc12bClockControl.enable(); /* Set IO line */ call Adc12bPin.disablePioControl(); // Disable whatever is set currently call Adc12bPin.selectPeripheralB(); // set to peripheral B state = S_IDLE; return SUCCESS; } async command error_t Sam3uAdc12b.configureAdc[uint8_t id](const sam3u_adc12_channel_config_t *config){ // Since CHER is write-only read the information in CHSR in CHER format //volatile adc12b_cher_t *CHSR = (volatile adc12b_cher_t *) 0x400A8018; volatile adc12b_cher_t *CHER = (volatile adc12b_cher_t *) 0x400A8010; adc12b_cher_t cher; volatile adc12b_chdr_t *CHDR = (volatile adc12b_chdr_t *) 0x400A8014; adc12b_chdr_t chdr; // Since IER is write-only read the information in IMR in IER format //volatile adc12b_ier_t *IMR = (volatile adc12b_ier_t *) 0x400A802C; volatile adc12b_ier_t *IER = (volatile adc12b_ier_t *) 0x400A8024; adc12b_ier_t ier; volatile adc12b_idr_t *IDR = (volatile adc12b_idr_t *) 0x400A8028; adc12b_idr_t idr; // CR is write-only; There is no need to read it for modification but just set the memory location volatile adc12b_cr_t *CR = (volatile adc12b_cr_t *) 0x400A8000; adc12b_cr_t cr; // MR is read-write volatile adc12b_mr_t *MR = (volatile adc12b_mr_t *) 0x400A8004; adc12b_mr_t mr = *MR; // ACR is read-write volatile adc12b_acr_t *ACR = (volatile adc12b_acr_t *) 0x400A8064; adc12b_acr_t acr = *ACR; // EMR is read-write volatile adc12b_emr_t *EMR = (volatile adc12b_emr_t *) 0x400A8068; adc12b_emr_t emr = *EMR; cher.flat = 0; chdr.flat = 0x000000FF; *CHDR = chdr; idr.flat = 0x000000FF; *IDR = idr; switch(config->channel) { case 0: cher.bits.ch0 = 1; ier.bits.eoc0 = 1; break; case 1: cher.bits.ch1 = 1; ier.bits.eoc1 = 1; break; case 2: cher.bits.ch2 = 1; ier.bits.eoc2 = 1; break; case 3: cher.bits.ch3 = 1; ier.bits.eoc3 = 1; break; case 4: cher.bits.ch4 = 1; ier.bits.eoc4 = 1; break; case 5: cher.bits.ch5 = 1; ier.bits.eoc5 = 1; break; case 6: cher.bits.ch6 = 1; ier.bits.eoc6 = 1; break; case 7: cher.bits.ch7 = 1; ier.bits.eoc7 = 1; break; default: // Just return FAIL? cher.bits.ch0 = 0; ier.bits.eoc0 = 0; break; } cr.bits.swrst = 0; cr.bits.start = 0; // disable start bit for the configuration stage mr.bits.prescal = config->prescal; mr.bits.shtim = config->shtim; mr.bits.lowres = config->lowres; mr.bits.trgen = config->trgen; mr.bits.trgsel = config->trgsel; mr.bits.sleep = config->sleep; mr.bits.startup = config->startup; acr.bits.ibctl = config->ibctl; acr.bits.gain = 0; acr.bits.diff = config->diff; acr.bits.offset = 0; emr.bits.offmodes = 0; emr.bits.off_mode_startup_time = config->startup; // We have now locally modified all the register values // Write the register back in its respective memory space *CHER = cher; *IER = ier; *CR = cr; *MR = mr; *ACR = acr; *EMR = emr; return SUCCESS; } async command error_t Sam3uAdc12b.getData[uint8_t id](){ // CR is write-only; There is no need to read it for modification but just set the memory location volatile adc12b_cr_t *CR = (volatile adc12b_cr_t *) 0x400A8000; adc12b_cr_t cr; call Adc12bClockControl.enable(); atomic clientID = id; if(state != S_IDLE){ return EBUSY; }else{ atomic { state = S_ADC; } cr.bits.start = 1; // enable software trigger *CR = cr; call ADC12BInterrupt.enable(); return SUCCESS; } } async event void ClockConfig.mainClockChanged(){} /* Get events (signals) from chips here! */ void handler() @spontaneous() { // CR is write-only; There is no need to read it for modification but just set the memory location volatile adc12b_cr_t *CR = (volatile adc12b_cr_t *) 0x400A8000; adc12b_cr_t cr; // Read SR volatile adc12b_sr_t *SR = (volatile adc12b_sr_t *) 0x400A801C; adc12b_sr_t sr = *SR; uint16_t data = 0; #ifndef SAM3U_ADC12B_PDC // Read LCDR volatile adc12b_lcdr_t *LCDR = (volatile adc12b_lcdr_t *) 0x400A8020; adc12b_lcdr_t lcdr = *LCDR; call Adc12bClockControl.disable(); if(sr.bits.drdy){ atomic { data = lcdr.bits.ldata; cr.bits.start = 0; // disable software trigger *CR = cr; //get data from register state = S_IDLE; } signal Sam3uAdc12b.dataReady[clientID](data); } #else if(sr.bits.endrx){ atomic state = S_IDLE; atomic cr.bits.start = 0; // enable software trigger atomic *CR = cr; signal Sam3uAdc12b.dataReady[clientID](data); }else{ call HplPdc.enablePdcRx(); atomic cr.bits.start = 1; // enable software trigger atomic *CR = cr; } #endif } void Adc12BIrqHandler() @C() @spontaneous() { call Adc12bInterruptWrapper.preamble(); call ADC12BInterrupt.disable(); handler(); call Adc12bInterruptWrapper.postamble(); } /* Default functions */ default async event error_t Sam3uAdc12b.dataReady[uint8_t id](uint16_t data){ return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/Sam3uAdc12bP.nc000066400000000000000000000050561207233610700242370ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" configuration Sam3uAdc12bP { provides { interface Resource[uint8_t id]; interface Sam3uGetAdc12b[uint8_t id]; } } implementation { components Sam3uAdc12bImplP as Adc12bImpl; components MainC; components HplNVICC, HplSam3uClockC, HplSam3uGeneralIOC; //components new Resource[uint8_t id]; components new SimpleRoundRobinArbiterC(SAM3UADC12_RESOURCE) as Arbiter; Adc12bImpl.ADC12BInterrupt -> HplNVICC.ADC12BInterrupt; Adc12bImpl.Adc12bPin -> HplSam3uGeneralIOC.HplPioA2; Adc12bImpl.Adc12bClockControl -> HplSam3uClockC.ADC12BPPCntl; Resource = Arbiter; // set this!?! Sam3uGetAdc12b = Adc12bImpl.Sam3uAdc12b; MainC.SoftwareInit -> Adc12bImpl.Init; components LedsC, NoLedsC; Adc12bImpl.Leds -> NoLedsC; components McuSleepC; Adc12bImpl.Adc12bInterruptWrapper -> McuSleepC; #ifdef SAM3U_ADC12B_PDC components HplSam3uPdcC; Adc12bImpl.HplPdc -> HplSam3uPdcC.Adc12bPdcControl; #endif } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/Sam3uGetAdc12b.nc000066400000000000000000000035031207233610700245520ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" interface Sam3uGetAdc12b { async command error_t configureAdc(const sam3u_adc12_channel_config_t *config); async command error_t getData(); async event error_t dataReady(uint16_t data); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/WireAdcStreamP.nc000066400000000000000000000051121207233610700250150ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uadc12bhardware.h" configuration WireAdcStreamP { provides interface ReadStream[uint8_t client]; uses { interface AdcConfigure[uint8_t client]; interface Sam3uGetAdc12b[uint8_t client]; interface Resource[uint8_t client]; } } implementation { #ifndef SAM3U_ADC12B_PDC components AdcStreamP; #else components AdcStreamPDCP as AdcStreamP; #endif components MainC, new AlarmTMicro16C() as Alarm, new ArbitratedReadStreamC(uniqueCount(ADCC_READ_STREAM_SERVICE), uint16_t) as ArbitrateReadStream; ReadStream = ArbitrateReadStream; AdcConfigure = AdcStreamP; Resource = ArbitrateReadStream; ArbitrateReadStream.Service -> AdcStreamP; #ifdef SAM3U_ADC12B_PDC components HplSam3uPdcC; AdcStreamP.HplPdc -> HplSam3uPdcC.Adc12bPdcControl; #else AdcStreamP.Alarm -> Alarm; #endif AdcStreamP.Init <- MainC; Sam3uGetAdc12b = AdcStreamP.GetAdc; components LedsC, NoLedsC; AdcStreamP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/adc12b/sam3uadc12bhardware.h000066400000000000000000000374561207233610700255750ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * 12 bit ADC register definitions. * * @author JeongGil Ko */ #ifndef _SAM3UADC12BHARDWARE_H #define _SAM3UADC12BHARDWARE_H /** * ADC12B Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1105 */ typedef union { uint32_t flat; struct { uint8_t swrst : 1; // software reset uint8_t start : 1; // start conversion uint8_t reserved0 : 6; uint16_t reserved1 : 16; uint8_t reserved2 : 8; } __attribute__((__packed__)) bits; } adc12b_cr_t; /** * ADC12B Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1106 */ typedef union { uint32_t flat; struct { uint8_t trgen : 1; // trigger enable uint8_t trgsel : 3; // trigger selection uint8_t lowres : 1; // resolution uint8_t sleep : 1; // sleep mode uint8_t reserved0 : 2; uint8_t prescal : 8; // prescaler rate selection uint8_t startup : 8; // startup time uint8_t shtim : 4; // sample & hold time uint8_t reserved1 : 4; } __attribute__((__packed__)) bits; } adc12b_mr_t; /** * ADC12B Channel Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1108 */ typedef union { uint32_t flat; struct { uint8_t ch0 : 1; uint8_t ch1 : 1; uint8_t ch2 : 1; uint8_t ch3 : 1; uint8_t ch4 : 1; uint8_t ch5 : 1; uint8_t ch6 : 1; uint8_t ch7 : 1; uint16_t reserved0 : 16; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } adc12b_cher_t; /** * ADC12B Channel Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1109 */ typedef union { uint32_t flat; struct { uint8_t ch0 : 1; uint8_t ch1 : 1; uint8_t ch2 : 1; uint8_t ch3 : 1; uint8_t ch4 : 1; uint8_t ch5 : 1; uint8_t ch6 : 1; uint8_t ch7 : 1; uint16_t reserved0 : 16; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } adc12b_chdr_t; /** * ADC12B Channel Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1110 */ typedef union { uint32_t flat; struct { uint8_t ch0 : 1; uint8_t ch1 : 1; uint8_t ch2 : 1; uint8_t ch3 : 1; uint8_t ch4 : 1; uint8_t ch5 : 1; uint8_t ch6 : 1; uint8_t ch7 : 1; uint16_t reserved0 : 16; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } adc12b_chsr_t; /** * ADC12B Analog Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1111 */ typedef union { uint32_t flat; struct { uint8_t gain : 2; // input gain uint8_t reserved0 : 6; uint8_t ibctl : 2; // bias current control uint8_t reserved1 : 6; uint8_t diff : 1; // differential mode uint8_t offset : 1; // input offset uint8_t reserved2 : 6; uint8_t reserved3 : 8; } __attribute__((__packed__)) bits; } adc12b_acr_t; /** * ADC12B Extended Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1112 */ typedef union { uint32_t flat; struct { uint8_t offmodes : 1; // input gain uint8_t reserved0 : 7; uint8_t reserved1 : 8; uint8_t off_mode_startup_time : 8; // startup time uint8_t reserved2 : 8; } __attribute__((__packed__)) bits; } adc12b_emr_t; /** * ADC12B Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1113 */ typedef union { uint32_t flat; struct { uint8_t eoc0 : 1; // end of conversion uint8_t eoc1 : 1; // end of conversion uint8_t eoc2 : 1; // end of conversion uint8_t eoc3 : 1; // end of conversion uint8_t eoc4 : 1; // end of conversion uint8_t eoc5 : 1; // end of conversion uint8_t eoc6 : 1; // end of conversion uint8_t eoc7 : 1; // end of conversion uint8_t ovre0 : 1; // overrun error uint8_t ovre1 : 1; // overrun error uint8_t ovre2 : 1; // overrun error uint8_t ovre3 : 1; // overrun error uint8_t ovre4 : 1; // overrun error uint8_t ovre5 : 1; // overrun error uint8_t ovre6 : 1; // overrun error uint8_t ovre7 : 1; // overrun error uint8_t drdy : 1; // data ready uint8_t govre : 1; // general overrun error uint8_t endrx : 1; // end of rx buffer uint8_t rxbuff : 1; // rx buffer full uint8_t reserved0 : 4; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } adc12b_sr_t; /** * ADC12B Last Converted Data Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1114 */ typedef union { uint32_t flat; struct { uint16_t ldata : 12; // last data converted uint16_t reserved0 : 4; uint16_t reserved1 : 16; } __attribute__((__packed__)) bits; } adc12b_lcdr_t; /** * ADC12B Interrupt Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1115 */ typedef union { uint32_t flat; struct { uint8_t eoc0 : 1; // end of conversion interrupt enable uint8_t eoc1 : 1; // end of conversion interrupt enable uint8_t eoc2 : 1; // end of conversion interrupt enable uint8_t eoc3 : 1; // end of conversion interrupt enable uint8_t eoc4 : 1; // end of conversion interrupt enable uint8_t eoc5 : 1; // end of conversion interrupt enable uint8_t eoc6 : 1; // end of conversion interrupt enable uint8_t eoc7 : 1; // end of conversion interrupt enable uint8_t ovre0 : 1; // overrun error interrupt enable uint8_t ovre1 : 1; // overrun error interrupt enable uint8_t ovre2 : 1; // overrun error interrupt enable uint8_t ovre3 : 1; // overrun error interrupt enable uint8_t ovre4 : 1; // overrun error interrupt enable uint8_t ovre5 : 1; // overrun error interrupt enable uint8_t ovre6 : 1; // overrun error interrupt enable uint8_t ovre7 : 1; // overrun error interrupt enable uint8_t drdy : 1; // data ready interrupt enable uint8_t govre : 1; // general overrun error interrupt enable uint8_t endrx : 1; // end of rx buffer interrupt enable uint8_t rxbuff : 1; // rx buffer full interrupt enable uint8_t reserved0 : 4; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } adc12b_ier_t; /** * ADC12B Interrupt Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1116 */ typedef union { uint32_t flat; struct { uint8_t eoc0 : 1; // end of conversion interrupt disable uint8_t eoc1 : 1; // end of conversion interrupt disable uint8_t eoc2 : 1; // end of conversion interrupt disable uint8_t eoc3 : 1; // end of conversion interrupt disable uint8_t eoc4 : 1; // end of conversion interrupt disable uint8_t eoc5 : 1; // end of conversion interrupt disable uint8_t eoc6 : 1; // end of conversion interrupt disable uint8_t eoc7 : 1; // end of conversion interrupt disable uint8_t ovre0 : 1; // overrun error interrupt disable uint8_t ovre1 : 1; // overrun error interrupt disable uint8_t ovre2 : 1; // overrun error interrupt disable uint8_t ovre3 : 1; // overrun error interrupt disable uint8_t ovre4 : 1; // overrun error interrupt disable uint8_t ovre5 : 1; // overrun error interrupt disable uint8_t ovre6 : 1; // overrun error interrupt disable uint8_t ovre7 : 1; // overrun error interrupt disable uint8_t drdy : 1; // data ready interrupt disable uint8_t govre : 1; // general overrun error interrupt disable uint8_t endrx : 1; // end of rx buffer interrupt disable uint8_t rxbuff : 1; // rx buffer full interrupt disable uint8_t reserved0 : 4; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } adc12b_idr_t; /** * ADC12B Interrupt Mask Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1113 */ typedef union { uint32_t flat; struct { uint8_t eoc0 : 1; // end of conversion interrupt mask uint8_t eoc1 : 1; // end of conversion interrupt mask uint8_t eoc2 : 1; // end of conversion interrupt mask uint8_t eoc3 : 1; // end of conversion interrupt mask uint8_t eoc4 : 1; // end of conversion interrupt mask uint8_t eoc5 : 1; // end of conversion interrupt mask uint8_t eoc6 : 1; // end of conversion interrupt mask uint8_t eoc7 : 1; // end of conversion interrupt mask uint8_t ovre0 : 1; // overrun error interrupt mask uint8_t ovre1 : 1; // overrun error interrupt mask uint8_t ovre2 : 1; // overrun error interrupt mask uint8_t ovre3 : 1; // overrun error interrupt mask uint8_t ovre4 : 1; // overrun error interrupt mask uint8_t ovre5 : 1; // overrun error interrupt mask uint8_t ovre6 : 1; // overrun error interrupt mask uint8_t ovre7 : 1; // overrun error interrupt mask uint8_t drdy : 1; // data ready interrupt mask uint8_t govre : 1; // general overrun error interrupt mask uint8_t endrx : 1; // end of rx buffer interrupt mask uint8_t rxbuff : 1; // rx buffer full interrupt mask uint8_t reserved0 : 4; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } adc12b_imr_t; /** * ADC12B Channel Data Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1114 */ typedef union { uint32_t flat; struct { uint16_t data : 12; // converted data uint16_t reserved0 : 4; uint16_t reserved1 : 16; } __attribute__((__packed__)) bits; } adc12b_cdr_t; /** * ADC12B Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary, p. 1104 */ typedef struct adc12b { volatile adc12b_cr_t cr; // Control Register volatile adc12b_mr_t mr; // Mode Register uint32_t reserved0[2]; volatile adc12b_cher_t cher; // Channel Enable Register volatile adc12b_chdr_t chdr; // Channel Disable Register volatile adc12b_chsr_t chsr; // Channel Status Register volatile adc12b_sr_t sr; // Status Register volatile adc12b_lcdr_t lcdr; // Last Converted Data Register volatile adc12b_ier_t ier; // Interrupt Enable Register volatile adc12b_idr_t idr; // Interrupt Disable Register volatile adc12b_imr_t imr; // Interrupt Mask Register volatile adc12b_cdr_t cdr0; // Channal Data Register volatile adc12b_cdr_t cdr1; // Channal Data Register volatile adc12b_cdr_t cdr2; // Channal Data Register volatile adc12b_cdr_t cdr3; // Channal Data Register volatile adc12b_cdr_t cdr4; // Channal Data Register volatile adc12b_cdr_t cdr5; // Channal Data Register volatile adc12b_cdr_t cdr6; // Channal Data Register volatile adc12b_cdr_t cdr7; // Channal Data Register uint32_t reserved1[5]; volatile adc12b_acr_t acr; // Analog Control Register volatile adc12b_emr_t emr; // Extended Mode Register } adc12b_t; /** * Memory mapping for the ADC12B */ volatile adc12b_t* ADC12B = (volatile adc12b_t *) 0x400A8000; // ADC12B Base Address #define SAM3UADC12_RESOURCE "Sam3uAdc12bC.Resource" #define ADCC_SERVICE "AdcC.Service" #define ADCC_READ_STREAM_SERVICE "AdcC.ReadStream.Client" typedef struct { unsigned int channel: 3; unsigned int diff: 1; unsigned int prescal: 8; unsigned int lowres: 1; unsigned int shtim: 4; unsigned int ibctl: 2; unsigned int sleep: 1; unsigned int startup: 8; unsigned int trgen: 1; unsigned int trgsel: 1; unsigned int : 0; } sam3u_adc12_channel_config_t; #endif // _SAM3UADC12BHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/000077500000000000000000000000001207233610700213675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/HplSam3uDmaC.nc000066400000000000000000000054471207233610700241040ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ configuration HplSam3uDmaC { provides interface HplSam3uDmaControl as Control; provides interface HplSam3uDmaChannel as Channel0; provides interface HplSam3uDmaChannel as Channel1; provides interface HplSam3uDmaChannel as Channel2; provides interface HplSam3uDmaChannel as Channel3; provides interface HplSam3uDmaInterrupt as Interrupt; } implementation { components HplSam3uDmaP; components new HplSam3uDmaXP(0) as Dma0; components new HplSam3uDmaXP(1) as Dma1; components new HplSam3uDmaXP(2) as Dma2; components new HplSam3uDmaXP(3) as Dma3; components HplNVICC; components HplSam3uClockC; components LedsC; Control = HplSam3uDmaP; Channel0 = Dma0; Channel1 = Dma1; Channel2 = Dma2; Channel3 = Dma3; Interrupt = HplSam3uDmaP; Dma0.Interrupt -> HplSam3uDmaP; Dma1.Interrupt -> HplSam3uDmaP; Dma2.Interrupt -> HplSam3uDmaP; Dma3.Interrupt -> HplSam3uDmaP; Dma0.Leds -> LedsC; Dma1.Leds -> LedsC; Dma2.Leds -> LedsC; Dma3.Leds -> LedsC; HplSam3uDmaP.HDMAInterrupt -> HplNVICC.HDMAInterrupt; HplSam3uDmaP.HDMAClockControl -> HplSam3uClockC.HDMAPPCntl; HplSam3uDmaP.Leds -> LedsC; components McuSleepC; HplSam3uDmaP.DmacInterruptWrapper -> McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/HplSam3uDmaChannel.nc000066400000000000000000000055071207233610700252670ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uDmahardware.h" interface HplSam3uDmaChannel { async command error_t setSrcAddr(void* src_addr); async command error_t setDstAddr(void* dst_addr); async command error_t setCtrlA(uint16_t btsize, dmac_chunk_t scsize, dmac_chunk_t dcsize, dmac_width_t src_width, dmac_width_t dst_width); async command uint32_t setBtsize(uint16_t btsize); async command error_t setCtrlB(dmac_dscr_t src_dscr, dmac_dscr_t dst_dscr, dmac_fc_t fc, dmac_inc_t src_inc, dmac_inc_t dst_inc); async command error_t setCfg(uint8_t src_per, uint8_t dst_per, bool srcSwHandshake, bool dstSwHandshake, bool stopOnDone, bool lockIF, bool lockB, dmac_IFL_t lockIFL, dmac_ahbprot_t ahbprot, dmac_fifocfg_t fifocfg); async command void enable(); async command void disable(); async command void enableChannel(uint8_t channel); async command void disableChannel(uint8_t channel); async command void enableChannelInterrupt(uint8_t channel); async command void disableChannelInterrupt(uint8_t channel); async command void enableTransferRequest(uint8_t channel, bool s2d); async command bool getChannelStatus(uint8_t channel); async command void suspendChannel(uint8_t channel); async event void transferDone(error_t success); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/HplSam3uDmaControl.nc000066400000000000000000000034621207233610700253350ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uDmahardware.h" interface HplSam3uDmaControl { async command error_t init(); async command error_t setRoundRobin(); async command error_t setFixedPriority(); async command void reset(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/HplSam3uDmaInterrupt.nc000066400000000000000000000032361207233610700257100ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ interface HplSam3uDmaInterrupt { async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/HplSam3uDmaP.nc000066400000000000000000000055311207233610700241130ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uDmahardware.h" module HplSam3uDmaP { provides interface HplSam3uDmaControl as DmaControl; provides interface HplSam3uDmaInterrupt as Interrupt; uses interface HplNVICInterruptCntl as HDMAInterrupt; uses interface HplSam3uPeripheralClockCntl as HDMAClockControl; uses interface FunctionWrapper as DmacInterruptWrapper; uses interface Leds; } implementation { async command error_t DmaControl.init(){ call HDMAInterrupt.disable(); call HDMAInterrupt.configure(IRQ_PRIO_DMAC); call HDMAInterrupt.enable(); call HDMAClockControl.enable(); return SUCCESS; } async command error_t DmaControl.setRoundRobin(){ volatile dmac_gcfg_t *GCFG = (volatile dmac_gcfg_t *) 0x400B0000; dmac_gcfg_t gcfg = *GCFG; gcfg.bits.arb_cfg = 1; *GCFG = gcfg; return SUCCESS; } async command error_t DmaControl.setFixedPriority(){ volatile dmac_gcfg_t *GCFG = (volatile dmac_gcfg_t *) 0x400B0000; dmac_gcfg_t gcfg = *GCFG; gcfg.bits.arb_cfg = 0; *GCFG = gcfg; return SUCCESS; } async command void DmaControl.reset(){ } void DmacIrqHandler() @C() @spontaneous() { call DmacInterruptWrapper.preamble(); signal Interrupt.fired(); call DmacInterruptWrapper.postamble(); } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/HplSam3uDmaXP.nc000066400000000000000000000217671207233610700242540ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uDmahardware.h" generic module HplSam3uDmaXP(uint8_t DMACHANNEL) { provides interface HplSam3uDmaChannel as Dma; uses interface HplSam3uDmaInterrupt as Interrupt; uses interface Leds; } implementation { uint32_t CHANNEL_OFFSET = 0x3C + (DMACHANNEL * 0x28); async event void Interrupt.fired(){ // Disable channel and send signal up call Dma.disableChannel(DMACHANNEL); call Dma.disableChannelInterrupt(DMACHANNEL); call Dma.disable(); signal Dma.transferDone(SUCCESS); } async command error_t Dma.setSrcAddr(void* src_addr){ volatile dmac_saddrx_t *SADDRX = (volatile dmac_saddrx_t *)(0x400B0000 + CHANNEL_OFFSET); dmac_saddrx_t saddrxx; saddrxx.bits.saddrx = (uint32_t) src_addr; *SADDRX = saddrxx; return SUCCESS; } async command error_t Dma.setDstAddr(void* dst_addr){ volatile dmac_daddrx_t *DADDRX = (volatile dmac_daddrx_t *)(0x400B0004 + CHANNEL_OFFSET); dmac_daddrx_t daddrxx; daddrxx.bits.daddrx = (uint32_t) dst_addr; *DADDRX = daddrxx; return SUCCESS; } async command error_t Dma.setCtrlA(uint16_t btsize, dmac_chunk_t scsize, dmac_chunk_t dcsize, dmac_width_t src_width, dmac_width_t dst_width){ volatile dmac_ctrlax_t *CTRLAX = (volatile dmac_ctrlax_t *)(0x400B000C + CHANNEL_OFFSET); dmac_ctrlax_t ctrlax = *CTRLAX; ctrlax.bits.btsize = btsize; ctrlax.bits.scsize = scsize; ctrlax.bits.dcsize = dcsize; ctrlax.bits.src_width = src_width; ctrlax.bits.dst_width = dst_width; *CTRLAX = ctrlax; return SUCCESS; } async command error_t Dma.setCtrlB(dmac_dscr_t src_dscr, dmac_dscr_t dst_dscr, dmac_fc_t fc, dmac_inc_t src_inc, dmac_inc_t dst_inc){ volatile dmac_ctrlbx_t *CTRLBX = (volatile dmac_ctrlbx_t *)(0x400B0010 + CHANNEL_OFFSET); dmac_ctrlbx_t ctrlbx = *CTRLBX; ctrlbx.bits.src_dscr = src_dscr; ctrlbx.bits.dst_dscr = dst_dscr; ctrlbx.bits.fc = fc; ctrlbx.bits.src_incr = src_inc; ctrlbx.bits.dst_incr = dst_inc; *CTRLBX = ctrlbx; return SUCCESS; } async command uint32_t Dma.setBtsize(uint16_t btsize){ volatile dmac_ctrlax_t *CTRLAX = (volatile dmac_ctrlax_t *)(0x400B000C + CHANNEL_OFFSET); dmac_ctrlax_t ctrlax = *CTRLAX; ctrlax.bits.btsize = btsize; *CTRLAX = ctrlax; return (0x400B000C + CHANNEL_OFFSET); } async command error_t Dma.setCfg(uint8_t src_per, uint8_t dst_per, bool srcSwHandshake, bool dstSwHandshake, bool stopOnDone, bool lockIF, bool lockB, dmac_IFL_t lockIFL, dmac_ahbprot_t ahbprot, dmac_fifocfg_t fifocfg){ volatile dmac_cfgx_t *CFGX = (volatile dmac_cfgx_t *)(0x400B0014 + CHANNEL_OFFSET); dmac_cfgx_t cfgx = *CFGX; cfgx.bits.src_per = src_per; cfgx.bits.dst_per = dst_per; cfgx.bits.src_h2sel = !srcSwHandshake; cfgx.bits.dst_h2sel = !dstSwHandshake; cfgx.bits.sod = stopOnDone; cfgx.bits.lock_if = lockIF; cfgx.bits.lock_b = lockB; cfgx.bits.lock_if_l = lockIFL; cfgx.bits.ahb_prot = ahbprot; cfgx.bits.fifocfg = fifocfg; *CFGX = cfgx; return SUCCESS; } async command void Dma.enable(){ volatile dmac_en_t *EN = (volatile dmac_en_t *) 0x400B0004; dmac_en_t en = *EN; en.bits.enable = 1; *EN = en; } async command void Dma.disable(){ volatile dmac_en_t *EN = (volatile dmac_en_t *) 0x400B0004; dmac_en_t en = *EN; en.bits.enable = 0; *EN = en; } async command void Dma.enableChannel(uint8_t channel){ volatile dmac_cher_t *CHER = (volatile dmac_cher_t *) 0x400B0028; dmac_cher_t cher; switch(DMACHANNEL){ case 0: cher.bits.ena0 = 1; break; case 1: cher.bits.ena1 = 1; break; case 2: cher.bits.ena2 = 1; break; case 3: cher.bits.ena3 = 1; break; default: cher.bits.ena0 = 1; break; } *CHER = cher; } async command void Dma.disableChannel(uint8_t channel){ volatile dmac_chdr_t *CHDR = (volatile dmac_chdr_t *) 0x400B002C; dmac_chdr_t chdr; switch(DMACHANNEL){ case 0: chdr.bits.dis0 = 1; break; case 1: chdr.bits.dis1 = 1; break; case 2: chdr.bits.dis2 = 1; break; case 3: chdr.bits.dis3 = 1; break; default: chdr.bits.dis0 = 1; break; } *CHDR = chdr; } async command void Dma.enableTransferRequest(uint8_t channel, bool s2d){ volatile dmac_sreq_t *SREQ = (volatile dmac_sreq_t *) 0x400B0008; dmac_sreq_t sreq = *SREQ; volatile dmac_last_t *LAST = (volatile dmac_last_t *) 0x400B0010; dmac_last_t last = *LAST; volatile dmac_creq_t *CREQ = (volatile dmac_creq_t *) 0x400B000C; dmac_creq_t creq = *CREQ; switch(DMACHANNEL){ case 0: if(s2d){ last.bits.slast0 = 1; sreq.bits.ssreq0 = 1; }else{ last.bits.dlast0 = 1; sreq.bits.dsreq0 = 1; } break; case 1: if(s2d){ sreq.bits.ssreq1 = 1; last.bits.slast1 = 1; }else{ sreq.bits.dsreq1 = 1; last.bits.dlast1 = 1; } break; case 2: if(s2d){ sreq.bits.ssreq2dash = 1; last.bits.slast2 = 1; }else{ sreq.bits.dsreq2dash = 1; last.bits.dlast2 = 1; } break; case 3: if(s2d){ sreq.bits.ssreq3 = 1; last.bits.slast3 = 1; }else{ sreq.bits.dsreq3 = 1; last.bits.slast3 = 1; } break; default: if(s2d){ sreq.bits.ssreq0 = 1; last.bits.slast0 = 1; }else{ sreq.bits.dsreq0 = 1; last.bits.dlast0 = 1; } break; } *LAST = last; *CREQ = creq; *SREQ = sreq; } async command void Dma.enableChannelInterrupt(uint8_t channel){ volatile dmac_ebcier_t *EBCIER = (volatile dmac_ebcier_t *) 0x400B0018; dmac_ebcier_t ebcier;// = *EBCIER; switch(DMACHANNEL){ case 0: ebcier.bits.btc0 = 1; //ebcier.bits.err0 = 1; break; case 1: ebcier.bits.btc1 = 1; //ebcier.bits.err1 = 1; break; case 2: ebcier.bits.btc2 = 1; //ebcier.bits.err2 = 1; break; case 3: ebcier.bits.btc3 = 1; //ebcier.bits.err3 = 1; break; } *EBCIER = ebcier; } async command void Dma.disableChannelInterrupt(uint8_t channel){ volatile dmac_ebcidr_t *EBCIDR = (volatile dmac_ebcidr_t *) 0x400B001C; dmac_ebcidr_t ebcidr;// = *EBCIER; switch(DMACHANNEL){ case 0: ebcidr.bits.btc0 = 1; //ebcier.bits.err0 = 1; break; case 1: ebcidr.bits.btc1 = 1; //ebcier.bits.err1 = 1; break; case 2: ebcidr.bits.btc2 = 1; //ebcier.bits.err2 = 1; break; case 3: ebcidr.bits.btc3 = 1; //ebcier.bits.err3 = 1; break; } *EBCIDR = ebcidr; } async command bool Dma.getChannelStatus(uint8_t channel){ volatile dmac_chsr_t *CHSR = (volatile dmac_chsr_t *) 0x400B0030; switch(DMACHANNEL){ case 0: return CHSR->bits.ena0; case 1: return CHSR->bits.ena1; case 2: return CHSR->bits.ena2; case 3: return CHSR->bits.ena3; default: return CHSR->bits.ena0; } } async command void Dma.suspendChannel(uint8_t channel){ volatile dmac_cher_t *CHER = (volatile dmac_cher_t *) 0x400B0028; dmac_cher_t cher; switch(DMACHANNEL){ case 0: cher.bits.susp0 = 1; break; case 1: cher.bits.susp1 = 1; break; case 2: cher.bits.susp2 = 1; break; case 3: cher.bits.susp3 = 1; break; default: cher.bits.susp0 = 1; break; } *CHER = cher; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/README000066400000000000000000000002221207233610700222430ustar00rootroot00000000000000DMA Controller Implementation for SAM3U @author JeongGil Ko The implementations are based on the preliminary specifications. tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/Sam3uDmaC.nc000066400000000000000000000052071207233610700234320ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ configuration Sam3uDmaC { provides interface Sam3uDmaControl as Control; provides interface Sam3uDmaChannel as Channel0; provides interface Sam3uDmaChannel as Channel1; provides interface Sam3uDmaChannel as Channel2; provides interface Sam3uDmaChannel as Channel3; } implementation { components new Sam3uDmaChannelP() as Channel0P; components new Sam3uDmaChannelP() as Channel1P; components new Sam3uDmaChannelP() as Channel2P; components new Sam3uDmaChannelP() as Channel3P; components Sam3uDmaControlP as ControlP; components HplSam3uDmaC as DmaC; Control = ControlP; Channel0 = Channel0P; Channel1 = Channel1P; Channel2 = Channel2P; Channel3 = Channel3P; ControlP.DmaControl -> DmaC; //ControlP.DmaChannel0 -> DmaC.Channel0; //ControlP.DmaChannel1 -> DmaC.Channel1; //ControlP.DmaChannel2 -> DmaC.Channel2; //ControlP.DmaChannel3 -> DmaC.Channel3; Channel0P.DmaChannel -> DmaC.Channel0; Channel1P.DmaChannel -> DmaC.Channel1; Channel2P.DmaChannel -> DmaC.Channel2; Channel3P.DmaChannel -> DmaC.Channel3; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/Sam3uDmaChannel.nc000066400000000000000000000075611207233610700246250ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uDmahardware.h" interface Sam3uDmaChannel { async command error_t setupTransfer( uint8_t channel, void *src_addr, /* Source Address */ void *dst_addr, /* Destination Address */ uint16_t btsize, /* Size of buffer transfer */ dmac_chunk_t scsize, /* Source chunk transfer size -- details in header file */ dmac_chunk_t dcsize, /* Destination chunk transfer size -- details in header file */ dmac_width_t src_width, /* details in header file */ dmac_width_t dst_width, /* details in header file */ dmac_dscr_t src_dscr, /* Source address descripter method */ dmac_dscr_t dst_dscr, /* Destination address descripter method */ dmac_fc_t fc, /* Flow Controller -- deatils in header file */ dmac_inc_t src_inc, /* Source addressing mode */ dmac_inc_t dst_inc, /* Source addressing mode */ uint8_t src_per, /* Handshake peripheral, for HW handshakes -- 4 bits */ uint8_t dst_per, /* Handshake peripheral, for HW handshakes -- 4 bits */ bool srcSwHandshake, /* select sw handshake for source */ bool dstSwHandshake, /* select sw handshake for destination */ bool stopOnDone, /* DMAC disable upon done signal */ bool lockIF, /* Interface lock capability */ bool lockB, /* AHB Bus lock capability */ dmac_IFL_t lockIFL, /* Master interface locked by channel for chunk/buffer trasfer -- details in header file */ dmac_ahbprot_t ahbprot, /* Additional info on bus access -- deatils in header file */ dmac_fifocfg_t fifocfg /* Configure FIFO -- Details in header file */ ); async command error_t startTransfer(uint8_t channel); /* set enable bit */ async command error_t repeatTransfer( void *src_addr, void *dst_addr, uint16_t size, uint8_t channel); /* repeat trasfer with the previous settings */ async command error_t swTransferRequest(uint8_t channel, bool s2d); /* set source or destination tranfer request for channel */ async command error_t stopTransfer(uint8_t channel); /* Perform all fuctions needed to disable/stop transfer*/ async command error_t resetAll(uint8_t channel); async event void transferDone(error_t success); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/Sam3uDmaChannelP.nc000066400000000000000000000110651207233610700247370ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uDmahardware.h" generic module Sam3uDmaChannelP() { provides interface Sam3uDmaChannel as Channel; uses interface HplSam3uDmaChannel as DmaChannel; } implementation { async command error_t Channel.setupTransfer( uint8_t channel, void *src_addr, void *dst_addr, uint16_t btsize, dmac_chunk_t scsize, dmac_chunk_t dcsize, dmac_width_t src_width, dmac_width_t dst_width, dmac_dscr_t src_dscr, dmac_dscr_t dst_dscr, dmac_fc_t fc, dmac_inc_t src_inc, dmac_inc_t dst_inc, uint8_t src_per, uint8_t dst_per, bool srcSwHandshake, bool dstSwHandshake, bool stopOnDone, bool lockIF, bool lockB, dmac_IFL_t lockIFL, dmac_ahbprot_t ahbprot, dmac_fifocfg_t fifocfg) { call DmaChannel.enable(); call DmaChannel.disableChannelInterrupt(channel); call DmaChannel.setSrcAddr(src_addr); call DmaChannel.setDstAddr(dst_addr); call DmaChannel.setCtrlA(btsize, scsize, dcsize, src_width, dst_width); call DmaChannel.setCtrlB(src_dscr, dst_dscr, fc, src_inc, dst_inc); call DmaChannel.setCfg(src_per, dst_per, srcSwHandshake, dstSwHandshake, stopOnDone, lockIF, lockB, lockIFL, ahbprot, fifocfg); return SUCCESS; } async command error_t Channel.startTransfer(uint8_t channel) { call DmaChannel.enable(); call DmaChannel.enableChannelInterrupt(channel); call DmaChannel.enableChannel(channel); return SUCCESS; } async command error_t Channel.repeatTransfer( void *src_addr, void *dst_addr, uint16_t size, uint8_t channel) { call DmaChannel.setBtsize(size); call DmaChannel.enable(); call DmaChannel.enableChannelInterrupt(channel); call DmaChannel.enableChannel(channel); return SUCCESS; } async command error_t Channel.swTransferRequest(uint8_t channel, bool s2d) { // Only used for peripheral transmissions and not for memory-memory transfers call DmaChannel.enableTransferRequest(channel, s2d); return SUCCESS; } async command error_t Channel.stopTransfer(uint8_t channel) { if(call DmaChannel.getChannelStatus(channel)){ call DmaChannel.suspendChannel(channel); } call DmaChannel.disableChannel(channel); } async command error_t Channel.resetAll(uint8_t channel) { call DmaChannel.enable(); call DmaChannel.disableChannelInterrupt(channel); call DmaChannel.setSrcAddr(0); call DmaChannel.setDstAddr(0); call DmaChannel.setCtrlA(0, 0, 0, 0, 0); call DmaChannel.setCtrlB(0, 0, 0, 0, 0); call DmaChannel.setCfg(0, 0, 0, 0, 0, 0, 0, 0, 1, 0); call DmaChannel.disable(); return SUCCESS; } async event void DmaChannel.transferDone(error_t success){ signal Channel.transferDone(success); } default async event void Channel.transferDone(error_t success){ } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/Sam3uDmaControl.nc000066400000000000000000000034521207233610700246700ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3uDmahardware.h" interface Sam3uDmaControl { async command error_t init(); async command error_t setArbitor(bool roundRobin); // True is round robin ; False if fixed priority arbitor } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/Sam3uDmaControlP.nc000066400000000000000000000050331207233610700250050ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ module Sam3uDmaControlP { provides interface Sam3uDmaControl as Control; uses interface HplSam3uDmaControl as DmaControl; //uses interface HplSam3uDmaChannel as DmaChannel0; //uses interface HplSam3uDmaChannel as DmaChannel1; //uses interface HplSam3uDmaChannel as DmaChannel2; //uses interface HplSam3uDmaChannel as DmaChannel3; //uses interface HplSam3uDmaInterrupt as Interrupt; } implementation { async command error_t Control.init(){ call DmaControl.init(); return SUCCESS; } async command error_t Control.setArbitor(bool roundRobin){ if(roundRobin){ return call DmaControl.setRoundRobin(); }else{ return call DmaControl.setFixedPriority(); } } /* async event void DmaChannel0.transferDone(error_t err){} async event void DmaChannel1.transferDone(error_t err){} async event void DmaChannel2.transferDone(error_t err){} async event void DmaChannel3.transferDone(error_t err){} */ } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/dma/sam3uDmahardware.h000066400000000000000000000361601207233610700247360ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * 4 Channel DMA Controller register definitions. * * @author JeongGil Ko */ #ifndef _SAM3UDMAHARDWARE_H #define _SAM3UDMAHARDWARE_H /** * DMAC Global Configuration Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1073 */ typedef union { uint32_t flat; struct { uint8_t reserved0 : 4; uint8_t arb_cfg : 1; uint8_t reserved1 : 3; uint16_t reserved2 : 16; uint8_t reserved3 : 8; } __attribute__((__packed__)) bits; } dmac_gcfg_t; /** * DMAC Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1074 */ typedef union { uint32_t flat; struct { uint8_t enable : 1; uint8_t reserved0 : 7; uint16_t reserved1 : 16; uint8_t reserved2 : 8; } __attribute__((__packed__)) bits; } dmac_en_t; /** * DMAC Software Single Request Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1075 */ typedef union { uint32_t flat; struct { uint8_t ssreq0 : 1; uint8_t dsreq0 : 1; uint8_t ssreq1 : 1; uint8_t dsreq1 : 1; uint8_t ssreq2dash : 1; uint8_t dsreq2dash : 1; uint8_t ssreq3 : 1; uint8_t dsreq3 : 1; uint16_t reserved0 : 16; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } dmac_sreq_t; /** * DMAC Software Chunk Request Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1076 */ typedef union { uint32_t flat; struct { uint8_t screq0 : 1; uint8_t dcreq0 : 1; uint8_t screq1 : 1; uint8_t dcreq1 : 1; uint8_t screq2dash : 1; uint8_t dcreq2dash : 1; uint8_t screq3 : 1; uint8_t dcreq3 : 1; uint16_t reserved0 : 16; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } dmac_creq_t; /** * DMAC Software Last Transfer Flag Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1077 */ typedef union { uint32_t flat; struct { uint8_t slast0 : 1; uint8_t dlast0 : 1; uint8_t slast1 : 1; uint8_t dlast1 : 1; uint8_t slast2 : 1; uint8_t dlast2 : 1; uint8_t slast3 : 1; uint8_t dlast3 : 1; uint16_t reserved0 : 16; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } dmac_last_t; /** * DMAC Error, Buffer Transfer and Chained Buffer Transfer Interrupt Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1078 */ typedef union { uint32_t flat; struct { uint8_t btc0 : 1; uint8_t btc1 : 1; uint8_t btc2 : 1; uint8_t btc3 : 1; uint8_t reserved0 : 4; uint8_t cbtc0 : 1; uint8_t cbtc1 : 1; uint8_t cbtc2 : 1; uint8_t cbtc3 : 1; uint8_t reserved1 : 4; uint8_t err0 : 1; uint8_t err1 : 1; uint8_t err2 : 1; uint8_t err3 : 1; uint8_t reserved2 : 4; uint8_t reserved3 : 8; } __attribute__((__packed__)) bits; } dmac_ebcier_t; /** * DMAC Error, Buffer Transfer and Chained Buffer Transfer Interrupt Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1079 */ typedef union { uint32_t flat; struct { uint8_t btc0 : 1; uint8_t btc1 : 1; uint8_t btc2 : 1; uint8_t btc3 : 1; uint8_t reserved0 : 4; uint8_t cbtc0 : 1; uint8_t cbtc1 : 1; uint8_t cbtc2 : 1; uint8_t cbtc3 : 1; uint8_t reserved1 : 4; uint8_t err0 : 1; uint8_t err1 : 1; uint8_t err2 : 1; uint8_t err3 : 1; uint8_t reserved2 : 4; uint8_t reserved3 : 8; } __attribute__((__packed__)) bits; } dmac_ebcidr_t; /** * DMAC Error, Buffer Transfer and Chained Buffer Transfer Interrupt Mask Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1080 */ typedef union { uint32_t flat; struct { uint8_t btc0 : 1; uint8_t btc1 : 1; uint8_t btc2 : 1; uint8_t btc3 : 1; uint8_t reserved0 : 4; uint8_t cbtc0 : 1; uint8_t cbtc1 : 1; uint8_t cbtc2 : 1; uint8_t cbtc3 : 1; uint8_t reserved1 : 4; uint8_t err0 : 1; uint8_t err1 : 1; uint8_t err2 : 1; uint8_t err3 : 1; uint8_t reserved2 : 4; uint8_t reserved3 : 8; } __attribute__((__packed__)) bits; } dmac_ebcimr_t; /** * DMAC Error, Buffer Transfer and Chained Buffer Transfer Interrupt Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1081 */ typedef union { uint32_t flat; struct { uint8_t btc0 : 1; uint8_t btc1 : 1; uint8_t btc2 : 1; uint8_t btc3 : 1; uint8_t reserved0 : 4; uint8_t cbtc0 : 1; uint8_t cbtc1 : 1; uint8_t cbtc2 : 1; uint8_t cbtc3 : 1; uint8_t reserved1 : 4; uint8_t err0 : 1; uint8_t err1 : 1; uint8_t err2 : 1; uint8_t err3 : 1; uint8_t reserved2 : 4; uint8_t reserved3 : 8; } __attribute__((__packed__)) bits; } dmac_ebcisr_t; /** * DMAC Channel Handler Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1082 */ typedef union { uint32_t flat; struct { uint8_t ena0 : 1; uint8_t ena1 : 1; uint8_t ena2 : 1; uint8_t ena3 : 1; uint8_t reserved0 : 4; uint8_t susp0 : 1; uint8_t susp1 : 1; uint8_t susp2 : 1; uint8_t susp3 : 1; uint8_t reserved1 : 4; uint8_t reserved2 : 8; uint8_t keep0 : 1; uint8_t keep1 : 1; uint8_t keep2 : 1; uint8_t keep3 : 1; uint8_t reserved3 : 4; } __attribute__((__packed__)) bits; } dmac_cher_t; /** * DMAC Channel Handler Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1083 */ typedef union { uint32_t flat; struct { uint8_t dis0 : 1; uint8_t dis1 : 1; uint8_t dis2 : 1; uint8_t dis3 : 1; uint8_t reserved0 : 4; uint8_t res0 : 1; uint8_t res1 : 1; uint8_t res2 : 1; uint8_t res3 : 1; uint8_t reserved1 : 4; uint8_t reserved2 : 8; uint8_t reserved3 : 8; } __attribute__((__packed__)) bits; } dmac_chdr_t; /** * DMAC Channel Handler Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1084 */ typedef union { uint32_t flat; struct { uint8_t ena0 : 1; uint8_t ena1 : 1; uint8_t ena2 : 1; uint8_t ena3 : 1; uint8_t reserved0 : 4; uint8_t susp0 : 1; uint8_t susp1 : 1; uint8_t susp2 : 1; uint8_t susp3 : 1; uint8_t reserved1 : 4; uint8_t empt0 : 1; uint8_t empt1 : 1; uint8_t empt2 : 1; uint8_t empt3 : 1; uint8_t reserved2 : 4; uint8_t stal0 : 1; uint8_t stal1 : 1; uint8_t stal2 : 1; uint8_t stal3 : 1; uint8_t reserved3 : 4; } __attribute__((__packed__)) bits; } dmac_chsr_t; /** * DMAC Channal x Source Address Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1085 */ typedef union { uint32_t flat; struct { uint32_t saddrx : 32; } __attribute__((__packed__)) bits; } dmac_saddrx_t; /** * DMAC Channal x Destination Address Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1086 */ typedef union { uint32_t flat; struct { uint32_t daddrx : 32; } __attribute__((__packed__)) bits; } dmac_daddrx_t; /** * DMAC Channal x Descriptor Address Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1087 */ typedef union { uint32_t flat; struct { uint32_t reserved0 : 2; uint32_t dscrx : 30; } __attribute__((__packed__)) bits; } dmac_dscrx_t; /** * DMAC Channal x Control A Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1088 */ typedef union { uint32_t flat; struct { uint16_t btsize : 12; uint16_t scsize : 1; uint16_t reserved0 : 3; uint8_t dcsize : 1; uint8_t reserved1 : 3; uint8_t src_width : 2; uint8_t reserved2 : 2; uint8_t dst_width : 2; uint8_t reserved3 : 1; uint8_t done : 1; } __attribute__((__packed__)) bits; } dmac_ctrlax_t; /** * DMAC Channal x Control B Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1090 */ typedef union { uint32_t flat; struct { uint8_t reserved0 : 8; uint8_t resetved1 : 8; uint8_t src_dscr : 1; uint8_t reserved2 : 3; uint8_t dst_dscr : 1; uint8_t fc : 2; uint8_t reserved3 : 1; uint8_t src_incr : 2; uint8_t reserved4 : 2; uint8_t dst_incr : 2; uint8_t ien : 1; uint8_t reserved5 : 1; } __attribute__((__packed__)) bits; } dmac_ctrlbx_t; /** * DMAC Channal x Configuration Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1090 */ typedef union { uint32_t flat; struct { uint8_t src_per : 4; uint8_t dst_per : 4; uint8_t reserved0 : 1; uint8_t src_h2sel : 1; uint8_t reserved1 : 3; uint8_t dst_h2sel : 1; uint8_t reserved2 : 2; uint8_t sod : 1; uint8_t reserved3 : 3; uint8_t lock_if : 1; uint8_t lock_b : 1; uint8_t lock_if_l : 1; uint8_t reserved4 : 1; uint8_t ahb_prot : 3; uint8_t reserved5 : 1; uint8_t fifocfg : 2; uint8_t reserved6 : 2; } __attribute__((__packed__)) bits; } dmac_cfgx_t; /** * DMAC Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary, p. 1072 */ typedef struct dmac { volatile dmac_gcfg_t gcfg; volatile dmac_en_t en; volatile dmac_sreq_t sreq; volatile dmac_creq_t creq; volatile dmac_last_t last; uint32_t reserved0; volatile dmac_ebcier_t ebcier; volatile dmac_ebcidr_t ebcidr; volatile dmac_ebcimr_t ebcimr; volatile dmac_ebcisr_t ebcisr; volatile dmac_cher_t cher; volatile dmac_chdr_t chdr; volatile dmac_chsr_t chsr; uint32_t reserved1; uint32_t reserved2; volatile dmac_saddrx_t saddr0; volatile dmac_daddrx_t daddr0; volatile dmac_dscrx_t dscr0; volatile dmac_ctrlax_t ctrla0; volatile dmac_ctrlbx_t ctrlb0; volatile dmac_cfgx_t cfg0; uint32_t reserved3; uint32_t reserved4; uint32_t reserved5; uint32_t reserved6; volatile dmac_saddrx_t saddr1; volatile dmac_daddrx_t daddr1; volatile dmac_dscrx_t dscr1; volatile dmac_ctrlax_t ctrla1; volatile dmac_ctrlbx_t ctrlb1; volatile dmac_cfgx_t cfg1; uint32_t reserved7; uint32_t reserved8; uint32_t reserved9; uint32_t reserved10; volatile dmac_saddrx_t saddr2; volatile dmac_daddrx_t daddr2; volatile dmac_dscrx_t dscr2; volatile dmac_ctrlax_t ctrla2; volatile dmac_ctrlbx_t ctrlb2; volatile dmac_cfgx_t cfg2; uint32_t reserved11; uint32_t reserved12; uint32_t reserved13; uint32_t reserved14; volatile dmac_saddrx_t saddr3; volatile dmac_daddrx_t daddr3; volatile dmac_dscrx_t dscr3; volatile dmac_ctrlax_t ctrla3; volatile dmac_ctrlbx_t ctrlb3; volatile dmac_cfgx_t cfg3; } __attribute__((__packed__)) dmac_t; volatile dmac_t* DMAC = (volatile dmac_t *) 0x400B0000; // DMAC Base Address //volatile dmac_gcfg_t* SREQ = (volatile dmac_gcfg_t *) 0x400B0008; /* */ /* typedef enum { DMAC_SINGLE_TRANSFER = 0x0, DMAC_BLOCK_TRANSFER = 0x1, DMAC_BURST_BLOCK_TRANSFER = 0x2, DMAC_REPEATED_SINGLE_TRANSFER = 0x4, DMAC_REPEATED_BLOCK_TRANSFER = 0x5, DMAC_REPEATED_BURST_BLOCK_TRANSFER = 0x7 } dmac_transfer_mode_t; */ typedef enum { ONE_DATA_TRANSFERRED = 0x0, FOUR_DATA_TRANSFERRED = 0x1 } dmac_chunk_t; typedef enum { SINGLE_TRANSFER_SIZE_BYTE = 0x0, SINGLE_TRANSFER_SIZE_HALF_WORD = 0x1, SINGLE_TRANSFER_SIZE_WORD = 0x2 } dmac_width_t; typedef enum { MEMORY_TO_MEMORY = 0x0, MEMORY_TO_PERIPHERAL = 0x1, PERIPHERAL_TO_MEMORY = 0x2, PERIPHERAL_TO_PERIPHERAL = 0x3 } dmac_fc_t; typedef enum { ADDRESS_UPDATE_MEMORY = 0x0, ADDRESS_UPDATE_DISABLED = 0x1 } dmac_dscr_t; typedef enum { INCREMENTING_ADDRESS = 0x0, FIXED_ADDRESS = 0x1 } dmac_inc_t; typedef enum { LOCK_MASTER_ARBITOR_CHUNK = 0x0, LOCK_MASTER_ABRITOR_BUFFER = 0x1 } dmac_IFL_t; typedef enum { DATA_ACCESS_USER_ACCESS_NO_BUFFER_NO_CACHE = 0x1, DATA_ACCESS_PRIV_ACCESS_NO_BUFFER_NO_CACHE = 0x3, DATA_ACCESS_USER_ACCESS_BUFFER_NO_CACHE = 0x5, DATA_ACCESS_PRIV_ACCESS_BUFFER_NO_CACHE = 0x7, DATA_ACCESS_USER_ACCESS_NO_BUFFER_CACHE = 0x9, DATA_ACCESS_PRIV_ACCESS_NO_BUFFER_CACHE = 0xB, DATA_ACCESS_USER_ACCESS_BUFFER_CACHE = 0xD, DATA_ACCESS_PRIV_ACCESS_BUFFER_CACHE = 0xF } dmac_ahbprot_t; typedef enum { LARGEST_LENGTH_AHB_BURST_DST = 0x0, SERV_HALF_FIFO = 0x1, SERV_ENOUGH_FIFO = 0x2 } dmac_fifocfg_t; #endif tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/eefc/000077500000000000000000000000001207233610700215305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/eefc/sam3eefchardware.h000066400000000000000000000036541207233610700251150ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #ifndef SAM3UEEFCHARDWARE_H #define SAM3UEEFCHARDWARE_H #include "eefchardware.h" /** * Memory mapping for the EEFC0 and EEFC1 (SAM3U/4E only!) */ volatile eefc_t* EEFC0 = (volatile eefc_t*) 0x400E0800; // EEFC0 Base Address volatile eefc_t* EEFC1 = (volatile eefc_t*) 0x400E0A00; // EEFC1 Base Address #endif // SAM3UEEFCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/hsmci/000077500000000000000000000000001207233610700217315ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/hsmci/HplSam3uHsmci.nc000066400000000000000000000041511207233610700246740ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * High Speed Multimedia Card Interface HPL Interface definitions. * * @author JeongGil Ko * @author Kevin Klues */ interface HplSam3uHsmci { command error_t init(uint32_t **trans_buf); async event void initDone(hsmci_sd_r6_t* rsp, error_t error); async command error_t sendCommand(uint8_t cmd, uint32_t arg); async event void* sendCommandDone(uint8_t cmd, void* rsp, error_t error); async event void txDone(error_t error); async event void rxDone(error_t error); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/hsmci/HplSam3uHsmciC.nc000066400000000000000000000061211207233610700247760ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * High Speed Multimedia Card Interface HPL Configurations. * * @author JeongGil Ko * @author Kevin Klues */ #include configuration HplSam3uHsmciC { provides { interface AsyncStdControl; interface HplSam3uHsmci; } } implementation { components HplSam3uHsmciP, HplNVICC, HplSam3uClockC, HplSam3uGeneralIOC; HplSam3uHsmci = HplSam3uHsmciP; AsyncStdControl = HplSam3uHsmciP; HplSam3uHsmciP.HSMCIInterrupt -> HplNVICC.MCI0Interrupt; HplSam3uHsmciP.HSMCIPinMCCDA -> HplSam3uGeneralIOC.HplPioA4; HplSam3uHsmciP.HSMCIPinMCCK -> HplSam3uGeneralIOC.HplPioA3; HplSam3uHsmciP.HSMCIPinMCDA0 -> HplSam3uGeneralIOC.HplPioA5; HplSam3uHsmciP.HSMCIPinMCDA1 -> HplSam3uGeneralIOC.HplPioA6; HplSam3uHsmciP.HSMCIPinMCDA2 -> HplSam3uGeneralIOC.HplPioA7; HplSam3uHsmciP.HSMCIPinMCDA3 -> HplSam3uGeneralIOC.HplPioA8; HplSam3uHsmciP.HSMCIPinMCDA4 -> HplSam3uGeneralIOC.HplPioC28; HplSam3uHsmciP.HSMCIPinMCDA5 -> HplSam3uGeneralIOC.HplPioC29; HplSam3uHsmciP.HSMCIPinMCDA6 -> HplSam3uGeneralIOC.HplPioC30; HplSam3uHsmciP.HSMCIPinMCDA7 -> HplSam3uGeneralIOC.HplPioC31; HplSam3uHsmciP.HSMCIClockControl -> HplSam3uClockC.MCI0PPCntl; components McuSleepC; HplSam3uHsmciP.HsmciInterruptWrapper -> McuSleepC; components PlatformHsmciConfigC; HplSam3uHsmciP.PlatformHsmciConfig -> PlatformHsmciConfigC; components BusyWaitMicroC; HplSam3uHsmciP.BusyWait -> BusyWaitMicroC; components LedsC; HplSam3uHsmciP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/hsmci/HplSam3uHsmciP.nc000066400000000000000000000637001207233610700250210ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * High Speed Multimedia Card Interface HPL Implementations. * * @author JeongGil Ko * @author Kevin Klues */ #include module HplSam3uHsmciP { provides { interface AsyncStdControl; interface HplSam3uHsmci; } uses { interface Leds; interface Init as PlatformHsmciConfig; interface BusyWait; interface HplSam3PeripheralClockCntl as HSMCIClockControl; interface HplNVICInterruptCntl as HSMCIInterrupt; interface HplSam3GeneralIOPin as HSMCIPinMCCDA; interface HplSam3GeneralIOPin as HSMCIPinMCCK; interface HplSam3GeneralIOPin as HSMCIPinMCDA0; interface HplSam3GeneralIOPin as HSMCIPinMCDA1; interface HplSam3GeneralIOPin as HSMCIPinMCDA2; interface HplSam3GeneralIOPin as HSMCIPinMCDA3; interface HplSam3GeneralIOPin as HSMCIPinMCDA4; interface HplSam3GeneralIOPin as HSMCIPinMCDA5; interface HplSam3GeneralIOPin as HSMCIPinMCDA6; interface HplSam3GeneralIOPin as HSMCIPinMCDA7; interface FunctionWrapper as HsmciInterruptWrapper; } } implementation { #define BLOCK_LENGTH (HSMCI->blkr.bits.blklen) #define WORDS_PER_BLOCK (BLOCK_LENGTH/4) enum { STATE_OFF, STATE_INACTIVE, STATE_IDLE, STATE_READY, STATE_IDENTIFICATION, STATE_STANDBY, STATE_TRANSFER, STATE_SENDING, STATE_RECEIVING, STATE_PROGRAMMING, STATE_DISCONNECT, }; // Protected by state variables norace uint8_t state = STATE_OFF; norace uint8_t cmd_pending = FALSE; norace uint8_t current_cmd = 0; norace uint8_t acmd = 0; norace uint32_t acmd_arg = 0; norace uint32_t rca_addr = 0; norace uint8_t card_type = 0; norace uint32_t rsp_buf[4]; norace uint32_t *rsp_buf_ptr; norace uint32_t words_transferred = 0; norace uint32_t **trans_buf; void configurePins() { // Disable all interrrupts by default HSMCI->idr.flat = -1; // Configure the SD card interrupt call HSMCIInterrupt.configure(IRQ_PRIO_HSMCI); // Set up the SD card pins call HSMCIPinMCCDA.disablePioControl(); call HSMCIPinMCCDA.selectPeripheralA(); call HSMCIPinMCCK.disablePioControl(); call HSMCIPinMCCK.selectPeripheralA(); call HSMCIPinMCDA0.disablePioControl(); call HSMCIPinMCDA0.selectPeripheralA(); call HSMCIPinMCDA1.disablePioControl(); call HSMCIPinMCDA1.selectPeripheralA(); call HSMCIPinMCDA2.disablePioControl(); call HSMCIPinMCDA2.selectPeripheralA(); call HSMCIPinMCDA3.disablePioControl(); call HSMCIPinMCDA3.selectPeripheralA(); call HSMCIPinMCDA4.disablePioControl(); call HSMCIPinMCDA4.selectPeripheralB(); call HSMCIPinMCDA5.disablePioControl(); call HSMCIPinMCDA5.selectPeripheralB(); call HSMCIPinMCDA6.disablePioControl(); call HSMCIPinMCDA6.selectPeripheralB(); call HSMCIPinMCDA7.disablePioControl(); call HSMCIPinMCDA7.selectPeripheralB(); } void unlockConfigRegs() { // set write protection registers HSMCI->wpmr.bits.wp_key = 0x4D4349; // Magic key for unlocking the regs HSMCI->wpmr.bits.wp_en = 0; } void initConfigRegs() { // Enable mci HSMCI->cr.bits.mcien = 1; // Enable power save mode HSMCI->cr.bits.pwsdis = 0; // Set the multiplier for the timeout between block transfers HSMCI->dtor.bits.dtomul = 0x7; // Set timeout between block transfers HSMCI->dtor.bits.dtocyc = 0xF; // Disable all interrupts HSMCI->idr.flat = -1; // Set the clock divide HSMCI->mr.bits.clkdiv = 58; // Set padding value to 0x00, not 0xFF HSMCI->mr.bits.padv = 0; // Disable allowing byte transfers HSMCI->mr.bits.fbyte = 0; // Disable dma HSMCI->dma.bits.dmaen = 0; // Start writing data immediately when appears in FIFO HSMCI->cfg.bits.fifomode = 1; // Require a new read/write to reset an under/overflow HSMCI->cfg.bits.ferrctrl = 0; // Initialize any platform specific settings call PlatformHsmciConfig.init(); } void swReset() { // set sw reset register HSMCI->cr.bits.swrst = 1; } void issueRealACMD(uint8_t cmd, uint32_t arg) { acmd = cmd; acmd_arg = arg; HSMCI->argr.bits.arg = rca_addr; HSMCI->cmdr.flat = AT91C_APP_CMD; } void* sendCommandDone(error_t e) { return signal HplSam3uHsmci.sendCommandDone(current_cmd, rsp_buf_ptr, e); } async command error_t AsyncStdControl.start() { // start clock, start interrupt, start pin call HSMCIClockControl.enable(); return SUCCESS; } async command error_t AsyncStdControl.stop() { // start clock, start interrupt, start pin call HSMCIClockControl.disable(); return SUCCESS; } command error_t HplSam3uHsmci.init(uint32_t **transb) { // Initialize the first tx and rx buffers trans_buf = transb; // Configure all of the data and interrupt pins configurePins(); // Initialize state variables cmd_pending = FALSE; current_cmd = 0; acmd = 0; acmd_arg = 0; rca_addr = 0; state = STATE_OFF; card_type = 0; words_transferred = 0; rsp_buf_ptr = rsp_buf; // Reset the device swReset(); // Unlock and initialize the configuration registers unlockConfigRegs(); initConfigRegs(); // Run the set of commands to switch the SD card // from Card ID mode to Transfer Mode return call HplSam3uHsmci.sendCommand(CMD_PON, 0); } async command error_t HplSam3uHsmci.sendCommand(uint8_t command_number, uint32_t arg){ if(cmd_pending == TRUE) return EBUSY; if(state == STATE_INACTIVE) return FAIL; // Save the current command so we can identify it in the interrupt handler current_cmd = command_number; // Set the command argument HSMCI->argr.bits.arg = arg; // Set the default values for some registers //HSMCI->cfg.bits.hsmode = 0; HSMCI->mr.bits.wrproof = 1; HSMCI->mr.bits.rdproof = 1; // Clear the response buffer for the next command memset(rsp_buf, 0, sizeof(rsp_buf)); /* Card Power On */ if(state == STATE_OFF) { switch(command_number) { case CMD_PON: HSMCI->cmdr.flat = AT91C_POWER_ON_INIT; break; default: // Notice the return here rather than the break.... // We don't want to wait for an interrupt in this case, so just return return EINVAL; } } /* Valid Commands from any state except STATE_OFF */ else if(command_number == CMD0) { HSMCI->cmdr.flat = AT91C_GO_IDLE_STATE_CMD; } else if(command_number == CMD15) { HSMCI->cmdr.flat = AT91C_GO_INACTIVE_STATE_CMD; } /* Card Identification Mode */ else if(state == STATE_IDLE) { switch(command_number) { case CMD8: HSMCI->cmdr.flat = AT91C_SEND_IF_COND; break; case ACMD41: issueRealACMD(ACMD41_REAL, arg); break; case ACMD41_REAL: HSMCI->cmdr.flat = AT91C_SD_APP_OP_COND_CMD; break; default: // Notice the return here rather than the break.... // We don't want to wait for an interrupt in this case, so just return return EINVAL; } } else if(state == STATE_READY) { switch(command_number) { // case CMD11: // No CMD11 needed on sam3u case CMD2: HSMCI->cmdr.flat = AT91C_ALL_SEND_CID_CMD; break; default: // Notice the return here rather than the break.... } } else if(state == STATE_IDENTIFICATION) { switch(command_number) { case CMD3: HSMCI->cmdr.flat = AT91C_SET_RELATIVE_ADDR_CMD; break; default: // Notice the return here rather than the break.... // We don't want to wait for an interrupt in this case, so just return return EINVAL; } } else if(command_number == CMD13) { HSMCI->cmdr.flat = AT91C_SEND_STATUS_CMD; } /* Transfer Mode */ else if(state == STATE_STANDBY) { switch(command_number) { case CMD4: HSMCI->cmdr.flat = AT91C_SET_DSR_CMD; break; case CMD9: HSMCI->cmdr.flat = AT91C_SEND_CSD_CMD; break; case CMD10: HSMCI->cmdr.flat = AT91C_SEND_CID_CMD; break; case CMD3: HSMCI->cmdr.flat = AT91C_SET_RELATIVE_ADDR_CMD; break; case CMD7: HSMCI->cmdr.flat = AT91C_SEL_DESEL_CARD_CMD; break; default: // Notice the return here rather than the break.... // We don't want to wait for an interrupt in this case, so just return return EINVAL; } } else if(state == STATE_TRANSFER) { switch(command_number) { case CMD7: HSMCI->cmdr.flat = AT91C_SEL_DESEL_CARD_CMD; break; /* Configuration commands */ case CMD16: HSMCI->blkr.bits.blklen = arg; HSMCI->cmdr.flat = AT91C_SET_BLOCKLEN_CMD; break; case CMD32: HSMCI->cmdr.flat = AT91C_TAG_SECTOR_START_CMD; break; case CMD33: HSMCI->cmdr.flat = AT91C_TAG_SECTOR_END_CMD; break; case ACMD6: issueRealACMD(ACMD6_REAL, arg); break; case ACMD42: issueRealACMD(ACMD42_REAL, arg); break; case ACMD23: issueRealACMD(ACMD23_REAL, arg); break; case ACMD6_REAL: HSMCI->sdcr.bits.sdcbus = arg; HSMCI->cmdr.flat = AT91C_SD_SET_BUS_WIDTH_CMD; break; case ACMD42_REAL: HSMCI->cmdr.flat = AT91C_SD_SET_CLR_CARD_DETECT_CMD; break; case ACMD23_REAL: HSMCI->cmdr.flat = AT91C_SD_SET_WR_BLK_ERASE_COUNT_CMD; break; /* Read commands */ case CMD6: HSMCI->cmdr.flat = AT91C_MMC_SWITCH_CMD; break; case CMD17: if(card_type == 3) HSMCI->blkr.bits.blklen = 512; HSMCI->blkr.bits.bcnt = 1; words_transferred = 0; HSMCI->cmdr.flat = AT91C_READ_SINGLE_BLOCK_CMD; break; case CMD18: if(card_type == 3) HSMCI->blkr.bits.blklen = 512; HSMCI->blkr.bits.bcnt = 0; words_transferred = 0; HSMCI->cmdr.flat = AT91C_READ_MULTIPLE_BLOCK_CMD; break; case CMD56R: HSMCI->cmdr.flat = AT91C_GEN_CMD; break; case ACMD13: issueRealACMD(ACMD13_REAL, arg); break; case ACMD22: issueRealACMD(ACMD22_REAL, arg); break; case ACMD51: issueRealACMD(ACMD51_REAL, arg); break; case ACMD13_REAL: HSMCI->cmdr.flat = AT91C_SD_STATUS_CMD; break; case ACMD22_REAL: HSMCI->cmdr.flat = AT91C_SD_SEND_NUM_WR_BLOCKS_CMD; break; case ACMD51_REAL: HSMCI->cmdr.flat = AT91C_SD_SEND_SCR_CMD; break; /* Write commands */ case CMD24: if(card_type == 3) HSMCI->blkr.bits.blklen = 512; HSMCI->blkr.bits.bcnt = 1; words_transferred = 0; HSMCI->cmdr.flat = AT91C_WRITE_BLOCK_CMD; break; case CMD25: if(card_type == 3) HSMCI->blkr.bits.blklen = 512; HSMCI->blkr.bits.bcnt = 0; words_transferred = 0; HSMCI->cmdr.flat = AT91C_WRITE_MULTIPLE_BLOCK_CMD; break; case CMD27: HSMCI->cmdr.flat = AT91C_PROGRAM_CSD_CMD; break; case CMD42: HSMCI->cmdr.flat = AT91C_LOCK_UNLOCK; break; case CMD56W: HSMCI->cmdr.flat = AT91C_GEN_CMD; break; /* Erase commands */ case CMD38: HSMCI->cmdr.flat = AT91C_ERASE_CMD; break; default: // Notice the return here rather than the break.... // We don't want to wait for an interrupt in this case, so just return return EINVAL; } } else if(state == STATE_SENDING) { switch(command_number) { case CMD7: HSMCI->cmdr.flat = AT91C_SEL_DESEL_CARD_CMD; break; case CMD12: HSMCI->cmdr.flat = AT91C_STOP_TRANSMISSION_CMD; break; default: // Notice the return here rather than the break.... // We don't want to wait for an interrupt in this case, so just return return EINVAL; } } else if(state == STATE_RECEIVING) { switch(command_number) { case CMD12: HSMCI->cmdr.flat = AT91C_STOP_TRANSMISSION_CMD; break; default: // Notice the return here rather than the break.... // We don't want to wait for an interrupt in this case, so just return return EINVAL; } } else if(state == STATE_PROGRAMMING) { switch(command_number) { case CMD7: HSMCI->cmdr.flat = AT91C_SEL_DESEL_CARD_CMD; break; default: // Notice the return here rather than the break.... // We don't want to wait for an interrupt in this case, so just return return EINVAL; } } else if(state == STATE_DISCONNECT) { switch(command_number) { case CMD7: HSMCI->cmdr.flat = AT91C_SEL_DESEL_CARD_CMD; break; default: // Notice the return here rather than the break.... // We don't want to wait for an interrupt in this case, so just return return EINVAL; } } else return EINVAL; // if the command was valid, set the cmd_pending flag to TRUE // so we can't try and issue another commend in the process cmd_pending = TRUE; // Unmask the cmdrdy interrupt and turn on interrupts HSMCI->ier.bits.cmdrdy = 1; call HSMCIInterrupt.enable(); return SUCCESS; } // Handle events void handler() @spontaneous() { int i; // if(statusError() && (current_cmd != 40)) { // printf("CMD: %d\n", current_cmd); // printStatus(); // } // Disable interrupts while processing the response // They will be reenabled either below (in the case of a long read/write) // or when the next command comes in call HSMCIInterrupt.disable(); cmd_pending = FALSE; // Copy the response buffer so we can pass it back up // Note that the last 8 bits of the rspr as specified in the SD spec are cut off // i.e. the stop bit and the CRC are not included in what is read out of rspr //memcpy(rsp_buf_ptr, (void*)HSMCI->rspr, sizeof(rsp_buf)); for(i=3; i>=0; i--) rsp_buf_ptr[i] = HSMCI->rspr[0].flat; /* Card Power On */ if(state == STATE_OFF) { switch(current_cmd) { case CMD_PON: state = STATE_IDLE; call HplSam3uHsmci.sendCommand(CMD0, 0); return; default: // should never get here!! signal HplSam3uHsmci.initDone(0, EINVAL); return; } } /* Valid Commands from any state except STATE_OFF */ else if(current_cmd == CMD0) { state = STATE_IDLE; call HplSam3uHsmci.sendCommand(CMD8, ((uint32_t)(1<<8) | (0xAA))); return; } else if(current_cmd == CMD15) { state = STATE_INACTIVE; return; } /* Card Identification Mode */ else if(state == STATE_IDLE) { switch(current_cmd) { case CMD8: if(HSMCI->sr.bits.rtoe) { // response time out... // Implies either // 1) Voltage Mismatch for 2.0 or greater cards // 2) Version 1.x SD card // 3) Not an SD card // Send ACMD41 with HCS = 0 card_type = 1; call HplSam3uHsmci.sendCommand(ACMD41, AT91C_MMC_HOST_VOLTAGE_RANGE); } else { // Version 2.0 or later SD card hsmci_sd_r7_t* rsp = (hsmci_sd_r7_t*)rsp_buf_ptr; card_type = 2; // Check that the voltage range and check pattern are correct if((rsp->vrange == 1) && (rsp->cpattern == 0xAA)) { // Send ACMD41 with HCS = 1 call HplSam3uHsmci.sendCommand(ACMD41, (1 << 30) | AT91C_MMC_HOST_VOLTAGE_RANGE); } else { signal HplSam3uHsmci.initDone(0, FAIL); } } return; case ACMD41: call HplSam3uHsmci.sendCommand(acmd, acmd_arg); return; case ACMD41_REAL: if((card_type == 1) && HSMCI->sr.bits.rtoe) { // response time out... // Not an SD card signal HplSam3uHsmci.initDone(0, FAIL); } else { hsmci_sd_r3_t* rsp = (hsmci_sd_r3_t*)rsp_buf_ptr; if(!rsp->ocr.busy) { // If the card is busy // Resend ACMD41 with same argument as before call HplSam3uHsmci.sendCommand(ACMD41, (1 << 30) | AT91C_MMC_HOST_VOLTAGE_RANGE); } else { if(rsp->ocr.ccs) { // The card is high or extended capacity card_type = 3; } // Ignore check of of s18a and s18r becuase we know we set s18r=0 // Call CMD2 state = STATE_READY; call HplSam3uHsmci.sendCommand(CMD2, 0); } } return; default: // should never get here!! signal HplSam3uHsmci.initDone(0, EINVAL); return; } } else if(state == STATE_READY) { switch(current_cmd) { case CMD2: state = STATE_IDENTIFICATION; call HplSam3uHsmci.sendCommand(CMD3, 0); return; default: // should never get here!! signal HplSam3uHsmci.initDone(0, EINVAL); return; } } else if(state == STATE_IDENTIFICATION) { switch(current_cmd) { case CMD3: state = STATE_STANDBY; rca_addr = (((hsmci_sd_r6_t*)rsp_buf_ptr)->rca << 16); signal HplSam3uHsmci.initDone((hsmci_sd_r6_t*)rsp_buf_ptr, SUCCESS); return; default: // should never get here!! signal HplSam3uHsmci.initDone(0, EINVAL); return; } } /* Transfer Mode */ else if(state == STATE_STANDBY) { switch(current_cmd) { case CMD13: case CMD4: case CMD9: case CMD10: case CMD3: // State doesn't change break; case CMD7: state = STATE_TRANSFER; break; default: // Notice the return here rather than the break.... rsp_buf_ptr = sendCommandDone(EINVAL); return; } } else if(state == STATE_TRANSFER) { switch(current_cmd) { case CMD7: state = STATE_STANDBY; break; /* Configuration commands */ case ACMD6: case ACMD42: case ACMD23: call HplSam3uHsmci.sendCommand(acmd, acmd_arg); return; case ACMD6_REAL: case ACMD42_REAL: case ACMD23_REAL: current_cmd -= 1; //Notice order in the .h file case CMD13: case CMD16: case CMD32: case CMD33: // State doesn't change break; /* Read commands */ case ACMD13: case ACMD22: case ACMD51: call HplSam3uHsmci.sendCommand(acmd, acmd_arg); return; case ACMD13_REAL: case ACMD22_REAL: case ACMD51_REAL: current_cmd -= 1; //Notice order in the .h file case CMD6: case CMD17: case CMD18: case CMD56R: // Seems backwards, but is from perspective of card state = STATE_SENDING; HSMCI->ier.bits.rxrdy = 1; call HSMCIInterrupt.enable(); break; /* Write commands */ case CMD24: case CMD25: case CMD27: case CMD42: case CMD56W: // Seems backwards, but is from perspective of card state = STATE_RECEIVING; HSMCI->ier.bits.txrdy = 1; HSMCI->tdr.bits.data = (*trans_buf)[words_transferred]; call HSMCIInterrupt.enable(); break; /* Erase commands */ case CMD38: state = STATE_PROGRAMMING; break; default: // Notice the return here rather than the break.... rsp_buf_ptr = sendCommandDone(EINVAL); return; } } else if(state == STATE_SENDING) { switch(current_cmd) { case CMD7: words_transferred = 0; HSMCI->idr.bits.rxrdy = 1; state = STATE_STANDBY; signal HplSam3uHsmci.rxDone(ECANCEL); break; case CMD12: // Only called in the case of canceling words_transferred = 0; HSMCI->idr.bits.rxrdy = 1; state = STATE_TRANSFER; signal HplSam3uHsmci.rxDone(ECANCEL); return; case CMD17: // Double check we are really ready to receive while(!HSMCI->sr.bits.rxrdy); // Get the next word (*trans_buf)[words_transferred] = HSMCI->rdr.bits.data; words_transferred++; // Once we've gotten a whole block, we're done if(words_transferred == WORDS_PER_BLOCK) { words_transferred = 0; HSMCI->idr.bits.rxrdy = 1; while(!HSMCI->sr.bits.xfrdone); state = STATE_TRANSFER; signal HplSam3uHsmci.rxDone(SUCCESS); } else call HSMCIInterrupt.enable(); return; default: // Notice the return here rather than the break.... rsp_buf_ptr = sendCommandDone(EINVAL); return; } } else if(state == STATE_RECEIVING) { switch(current_cmd) { case CMD12: // Only called when canceling words_transferred = 0; HSMCI->idr.bits.txrdy = 1; state = STATE_PROGRAMMING; signal HplSam3uHsmci.txDone(ECANCEL); return; case CMD24: // Double check we are really ready to transmit while(!HSMCI->sr.bits.txrdy); words_transferred++; // Once we've transferred a whole block we are done if(words_transferred == WORDS_PER_BLOCK) { words_transferred = 0; HSMCI->idr.bits.txrdy = 1; state = STATE_PROGRAMMING; call HplSam3uHsmci.sendCommand(CMD13, 0); return; } HSMCI->tdr.bits.data = (*trans_buf)[words_transferred]; call HSMCIInterrupt.enable(); return; default: // Notice the return here rather than the break.... rsp_buf_ptr = sendCommandDone(EINVAL); return; } } else if(state == STATE_PROGRAMMING) { switch(current_cmd) { case CMD7: state = STATE_DISCONNECT; break; case CMD13: { hsmci_sd_r1_t *r1 = (hsmci_sd_r1_t*)rsp_buf_ptr; if((r1->status & STATUS_PRG) == STATUS_PRG) call HplSam3uHsmci.sendCommand(CMD13, 0); else { // Go back to the transfer state state = STATE_TRANSFER; // Double check that the whole transfer has completed // and signal that it is done. // These commands only valid if transfer just made // For now it is always the case // Eventually we will need to consider CMD20,28,29,38 though while(!HSMCI->sr.bits.xfrdone); signal HplSam3uHsmci.txDone(SUCCESS); } } return; default: // Notice the return here rather than the break.... rsp_buf_ptr = sendCommandDone(EINVAL); return; } } else if(state == STATE_DISCONNECT) { switch(current_cmd) { case CMD7: state = STATE_PROGRAMMING; break; case CMD13: { hsmci_sd_r1_t *r1 = (hsmci_sd_r1_t*)rsp_buf_ptr; if((r1->status & STATUS_DIS) == STATUS_DIS) call HplSam3uHsmci.sendCommand(CMD13, 0); } return; default: // Notice the return here rather than the break.... rsp_buf_ptr = sendCommandDone(EINVAL); return; } } else { rsp_buf_ptr = sendCommandDone(EINVAL); return; } // Do a buffer swap with the upper layer for the response buffer rsp_buf_ptr = sendCommandDone(SUCCESS); } __attribute__((interrupt)) void HsmciIrqHandler() @C() @spontaneous() { call HsmciInterruptWrapper.preamble(); handler(); call HsmciInterruptWrapper.postamble(); } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/hsmci/SD.nc000066400000000000000000000056541207233610700225730ustar00rootroot00000000000000/* * Copyright (c) 2006, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Interface for communciating with an SD card via a standard sd card slot. * * @author Steve Ayer * @author Konrad Lorincz * @date May 2006 */ interface SD { /** * Returns the card size in bytes. * * @return the card size in bytes. */ command uint32_t readCardSize(); /** * Reads 512 bytes from the SD at sector and copies it to bufferPtr * * @param sector the sector on the SD card (in multiples of 512 bytes). * @param bufferPtr pointer to where the SD will copy the data to. Must be 512 bytes. * @return SUCCESS if it was read successfully; FAIL otherwise */ command error_t readBlock(const uint32_t sector, uint8_t * buffer); /** * Writes 512 bytes from the bufferPtr to the SD card * * @param sector the sector on the SD card (in multiples of 512 bytes * where to write the data to). * @param bufferPtr pointer to data to be added. Must be 512 bytes. * @return SUCCESS if it was written successfully; FAIL otherwise */ command error_t writeBlock(const uint32_t sector, uint8_t * buffer); /** * the device has control over the sd card */ async event void available(); /** * the device has lost control of the sd and should cease * attempts to talk to the card */ async event void unavailable(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/hsmci/SDC.nc000066400000000000000000000041051207233610700226640ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SD Card Interface Configurations. * * @author Kevin Klues */ configuration SDC { provides { interface StdControl; interface SD; } } implementation { components SDP; components Sam3uHsmciC; StdControl = SDP; SD = SDP; enum { RESOURCE_ID = unique(SAM3U_HSMCI_RESOURCE) }; SDP.Sam3uHsmciInit -> Sam3uHsmciC; SDP.Resource -> Sam3uHsmciC.Resource[RESOURCE_ID]; SDP.Sam3uHsmci -> Sam3uHsmciC.Sam3uHsmci[RESOURCE_ID]; components LedsC; SDP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/hsmci/SDP.nc000066400000000000000000000071631207233610700227100ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SD Card Interface Implementation * @author Kevin Klues */ module SDP { provides { interface StdControl; interface SD; } uses { interface Resource; interface Sam3uHsmciInit; interface Sam3uHsmci; interface Leds; } } implementation { norace int initialized = FALSE; norace volatile bool busy = FALSE; norace error_t trans_error; error_t init() { error_t error; busy = TRUE; error = call Sam3uHsmciInit.init(); if(error == SUCCESS) { while(busy); error = trans_error; signal SD.available(); } else { signal SD.unavailable(); busy = FALSE; } initialized = TRUE; return error; } command error_t StdControl.start() { error_t error = call Resource.immediateRequest(); if(!initialized) return ecombine(error, init()); return error; } command error_t StdControl.stop() { return call Resource.release(); } command uint32_t SD.readCardSize(){ return call Sam3uHsmci.readCardSize(); } command error_t SD.readBlock(uint32_t sector, uint8_t *buffer) { error_t error; if(busy) return EBUSY; busy = TRUE; error = call Sam3uHsmci.readBlock(sector, (uint32_t*)buffer); if(error == SUCCESS) { while(busy); error = trans_error; } else busy = FALSE; return error; } command error_t SD.writeBlock(uint32_t sector, uint8_t *buffer) { error_t error; if(busy) return EBUSY; busy = TRUE; error = call Sam3uHsmci.writeBlock(sector, (uint32_t*)buffer); if(error == SUCCESS) { while(busy); error = trans_error; } else busy = FALSE; return error; } async event void Sam3uHsmciInit.initDone(error_t error) { trans_error = error; busy = FALSE; } async event void Sam3uHsmci.readBlockDone(uint32_t *buf, error_t error) { trans_error = error; busy = FALSE; } async event void Sam3uHsmci.writeBlockDone(uint32_t *buf, error_t error) { trans_error = error; busy = FALSE; } event void Resource.granted() {} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/hsmci/Sam3uHsmci.nc000066400000000000000000000041121207233610700242250ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * High Speed Multimedia Card Interface definitions. * * @author JeongGil Ko * @author Kevin Klues */ interface Sam3uHsmci { async command uint64_t readCardSize(); async command error_t readBlock(uint32_t sector, uint32_t *buffer); async event void readBlockDone(uint32_t *buffer, error_t error); async command error_t writeBlock(uint32_t sector, uint32_t *buffer); async event void writeBlockDone(uint32_t *buffer, error_t error); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/hsmci/Sam3uHsmciC.nc000066400000000000000000000047021207233610700243350ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * High Speed Multimedia Card Interface Configurations. * * @author JeongGil Ko * @author Kevin Klues */ #include configuration Sam3uHsmciC { provides { interface Sam3uHsmciInit @exactlyonce(); interface Resource[uint8_t]; interface Sam3uHsmci[uint8_t]; } } implementation { components Sam3uHsmciP; Sam3uHsmciInit = Sam3uHsmciP; Sam3uHsmci = Sam3uHsmciP; components HplSam3uHsmciC; Sam3uHsmciP.HplSam3uHsmci -> HplSam3uHsmciC; Sam3uHsmciP.ArbiterInfo -> FcfsArbiterC; components new FcfsArbiterC(SAM3U_HSMCI_RESOURCE); components new AsyncStdControlPowerManagerC() as PM; Resource = FcfsArbiterC; PM.ResourceDefaultOwner -> FcfsArbiterC; PM.ArbiterInfo -> FcfsArbiterC; PM.AsyncStdControl -> HplSam3uHsmciC; components LedsC; Sam3uHsmciP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/hsmci/Sam3uHsmciInit.nc000066400000000000000000000034111207233610700250520ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * High Speed Multimedia Card Interface definitions. * * @author Kevin Klues */ interface Sam3uHsmciInit { command error_t init(); async event void initDone(error_t error); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/hsmci/Sam3uHsmciP.nc000066400000000000000000000136231207233610700243540ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * High Speed Multimedia Card Interface Implementations. * @author Kevin Klues */ #include "sam3uhsmcihardware.h" module Sam3uHsmciP { provides { interface Sam3uHsmciInit @exactlyonce(); interface Sam3uHsmci[uint8_t]; } uses { interface ArbiterInfo; interface HplSam3uHsmci; interface Leds; } } implementation { #define BYTES_PER_BLOCK 512 #define WORDS_PER_BLOCK ((BYTES_PER_BLOCK)/4) #define BLOCK_MULTIPLIER (card_type ? 1 : 512) #define CURRENT_OWNER (call ArbiterInfo.userId()) enum { SD_STANDARD_CAP, SD_HIGHEXT_CAP, }; enum { S_INACTIVE, S_IDLE, S_BUSY, }; // Protected by state variables norace uint8_t state = S_INACTIVE; norace uint32_t rca_addr; norace int card_type = SD_STANDARD_CAP; norace uint64_t card_size = 0; norace uint32_t *trans_buf; uint32_t computeV1CardSize(hsmci_sd_r2_t* rsp) { int i,j; uint64_t s = rsp->v1_csd.c_size + 1; for(i=2, j=rsp->v1_csd.c_size_mult + 2; j>1; j--) i <<= 1; s*=i; for(i=2, j=rsp->v1_csd.read_bl_len; j>1; j--) i <<= 1; s*=i; return s; } command error_t Sam3uHsmciInit.init() { if(state != S_INACTIVE) return EALREADY; return call HplSam3uHsmci.init(&trans_buf); } async event void HplSam3uHsmci.initDone(hsmci_sd_r6_t* rsp, error_t error) { if(error == SUCCESS) { rca_addr = rsp->rca << 16; call HplSam3uHsmci.sendCommand(CMD9, rca_addr); } else signal Sam3uHsmciInit.initDone(error); } async command uint64_t Sam3uHsmci.readCardSize[uint8_t id](){ if(state != S_INACTIVE) return card_size; return -1; } async event void* HplSam3uHsmci.sendCommandDone(uint8_t cmd, void* rsp, error_t error) { if(state == S_INACTIVE) { if(error == SUCCESS) { switch(cmd) { case CMD9: { hsmci_sd_r2_t *r2 = (hsmci_sd_r2_t*)rsp; card_type = r2->csd.csd_structure; if(card_type == SD_HIGHEXT_CAP) card_size = (r2->csd.c_size + 1)*BYTES_PER_BLOCK*1024; else card_size = computeV1CardSize(r2); call HplSam3uHsmci.sendCommand(CMD7, rca_addr); break; } case CMD7: call HplSam3uHsmci.sendCommand(ACMD6, SD_STAT_DATA_BUS_WIDTH_4BIT); break; case ACMD6: call HplSam3uHsmci.sendCommand(CMD16, BYTES_PER_BLOCK); break; case CMD16: state = S_IDLE; signal Sam3uHsmciInit.initDone(SUCCESS); break; default: //Should never get here!! } } else signal Sam3uHsmciInit.initDone(error); } else if(error != SUCCESS) { state = S_IDLE; switch(cmd) { case CMD17: signal Sam3uHsmci.readBlockDone[CURRENT_OWNER](trans_buf, error); break; case CMD24: signal Sam3uHsmci.writeBlockDone[CURRENT_OWNER](trans_buf, error); break; default: //Should never get here!! } } return rsp; } async command error_t Sam3uHsmci.readBlock[uint8_t id](uint32_t sector, uint32_t *buffer) { if(CURRENT_OWNER != id) return ERESERVE; if(state == S_IDLE) { error_t e; trans_buf = buffer; state = S_BUSY; e = call HplSam3uHsmci.sendCommand(CMD17, sector*BLOCK_MULTIPLIER); if(e != SUCCESS) state = S_IDLE; return e; } return EBUSY; } async command error_t Sam3uHsmci.writeBlock[uint8_t id](uint32_t sector, uint32_t *buffer) { if(CURRENT_OWNER != id) return ERESERVE; if(state == S_IDLE) { error_t e; trans_buf = buffer; state = S_BUSY; e = call HplSam3uHsmci.sendCommand(CMD24, sector*BLOCK_MULTIPLIER); if(e != SUCCESS) state = S_IDLE; return e; } return EBUSY; } async event void HplSam3uHsmci.txDone(error_t error) { state = S_IDLE; signal Sam3uHsmci.writeBlockDone[CURRENT_OWNER](trans_buf, error); } async event void HplSam3uHsmci.rxDone(error_t error) { state = S_IDLE; signal Sam3uHsmci.readBlockDone[CURRENT_OWNER](trans_buf, error); } async default event void Sam3uHsmci.writeBlockDone[uint8_t id](uint32_t *buf, error_t error) {} async default event void Sam3uHsmci.readBlockDone[uint8_t id](uint32_t *buf, error_t error) {} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/hsmci/sam3uhsmcihardware.h000066400000000000000000001146601207233610700257040ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * High Speed Multimedia Card Interface register definitions. * * @author JeongGil Ko * @author Kevin Klues */ #ifndef _SAM3UHSMCIHARDWARE_H #define _SAM3UHSMCIHARDWARE_H // Resource definition #define SAM3U_HSMCI_RESOURCE "Sam3uHsmci.Resource" /** * HSMCI Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 880 */ typedef union { uint32_t flat; struct { uint8_t mcien : 1; uint8_t hsmcidis : 1; uint8_t pwsen : 1; uint8_t pwsdis : 1; uint8_t reserved0 : 3; uint8_t swrst : 1; uint8_t reserved1 : 8; uint16_t reserved2 : 16; } __attribute__((__packed__)) bits; } hsmci_cr_t; /** * HSMCI Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 881 */ typedef union { uint32_t flat; struct { uint8_t clkdiv : 8; uint8_t pwsdiv : 3; uint8_t rdproof : 1; uint8_t wrproof : 1; uint8_t fbyte : 1; uint8_t padv : 1; uint8_t reserved0 : 1; uint16_t blklen : 16; } __attribute__((__packed__)) bits; } hsmci_mr_t; /** * HSMCI Data Timeout Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 883 */ typedef union { uint32_t flat; struct { uint8_t dtocyc : 4; uint8_t dtomul : 3; uint8_t reserved0 : 1; uint8_t reserved1 : 8; uint16_t reserved2 : 16; } __attribute__((__packed__)) bits; } hsmci_dtor_t; /** * HSMCI SDCard/SDIO Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 884 */ typedef union { uint32_t flat; struct { uint8_t sdcsel : 2; uint8_t reserved0 : 4; uint8_t sdcbus : 2; uint8_t reserved1 : 8; uint16_t reserved2 : 16; } __attribute__((__packed__)) bits; } hsmci_sdcr_t; /** * HSMCI Argument Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 885 */ typedef union { uint32_t flat; struct { uint32_t arg : 32; } __attribute__((__packed__)) bits; } hsmci_argr_t; /** * HSMCI Command Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 886 */ typedef union { uint32_t flat; struct { uint8_t cmdnb : 6; uint8_t rsptyp : 2; uint8_t spcmd : 3; uint8_t opdcmd : 1; uint8_t maxlat : 1; uint8_t reserved0 : 3; uint8_t trcmd : 2; uint8_t trdir : 1; uint8_t trtyp : 3; uint8_t reserved1 : 2; uint8_t iospcmd : 2; uint8_t atacs : 1; uint8_t boot_ack : 1; uint8_t reserved2 : 4; } __attribute__((__packed__)) bits; } hsmci_cmdr_t; /** * HSMCI Block Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 889 */ typedef union { uint32_t flat; struct { uint32_t bcnt : 16; uint32_t blklen : 16; } __attribute__((__packed__)) bits; } hsmci_blkr_t; /** * HSMCI Completion Signal Timeout Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 890 */ typedef union { uint32_t flat; struct { uint8_t cstocyc : 4; uint8_t cstomul : 3; uint8_t reserved0 : 1; uint8_t reserved1 : 8; uint16_t reserved2 : 16; } __attribute__((__packed__)) bits; } hsmci_cstor_t; /** * HSMCI Response Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 891 */ typedef union { uint32_t flat; struct { uint32_t rsp : 32; } __attribute__((__packed__)) bits; } hsmci_rspr_t; /** * HSMCI Receive Data Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 892 */ typedef union { uint32_t flat; struct { uint32_t data : 32; } __attribute__((__packed__)) bits; } hsmci_rdr_t; /** * HSMCI Transmit Data Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 893 */ typedef union { uint32_t flat; struct { uint32_t data : 32; } __attribute__((__packed__)) bits; } hsmci_tdr_t; /** * HSMCI Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 894 */ typedef union { uint32_t flat; struct { uint8_t cmdrdy : 1; uint8_t rxrdy : 1; uint8_t txrdy : 1; uint8_t blke : 1; uint8_t dtip : 1; uint8_t notbusy : 1; uint8_t reserved0 : 2; uint8_t mci_sdioirqa : 1; uint8_t reserved1 : 3; uint8_t sdiowait : 1; uint8_t csrcv : 1; uint8_t reserved2 : 2; uint8_t rinde : 1; uint8_t rdire : 1; uint8_t rcrce : 1; uint8_t rende : 1; uint8_t rtoe : 1; uint8_t dcrce : 1; uint8_t dtoe : 1; uint8_t cstoe : 1; uint8_t blkovre : 1; uint8_t dmadone : 1; uint8_t fifoempty : 1; uint8_t xfrdone : 1; uint8_t ackrcv : 1; uint8_t ackrcve : 1; uint8_t ovre : 1; uint8_t unre : 1; } __attribute__((__packed__)) bits; } hsmci_sr_t; /** * HSMCI Interrupt Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 898 */ typedef union { uint32_t flat; struct { uint8_t cmdrdy : 1; uint8_t rxrdy : 1; uint8_t txrdy : 1; uint8_t blke : 1; uint8_t dtip : 1; uint8_t notbusy : 1; uint8_t reserved0 : 2; uint8_t mci_sdioirqa : 1; uint8_t reserved1 : 3; uint8_t sdiowait : 1; uint8_t csrcv : 1; uint8_t reserved2 : 2; uint8_t rinde : 1; uint8_t rdire : 1; uint8_t rcrce : 1; uint8_t rende : 1; uint8_t rtoe : 1; uint8_t dcrce : 1; uint8_t dtoe : 1; uint8_t cstoe : 1; uint8_t blkovre : 1; uint8_t dmadone : 1; uint8_t fifoempty : 1; uint8_t xfrdone : 1; uint8_t ackrcv : 1; uint8_t ackrcve : 1; uint8_t ovre : 1; uint8_t unre : 1; } __attribute__((__packed__)) bits; } hsmci_ier_t; /** * HSMCI Interrupt Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 900 */ typedef union { uint32_t flat; struct { uint8_t cmdrdy : 1; uint8_t rxrdy : 1; uint8_t txrdy : 1; uint8_t blke : 1; uint8_t dtip : 1; uint8_t notbusy : 1; uint8_t reserved0 : 2; uint8_t mci_sdioirqa : 1; uint8_t reserved1 : 3; uint8_t sdiowait : 1; uint8_t csrcv : 1; uint8_t reserved2 : 2; uint8_t rinde : 1; uint8_t rdire : 1; uint8_t rcrce : 1; uint8_t rende : 1; uint8_t rtoe : 1; uint8_t dcrce : 1; uint8_t dtoe : 1; uint8_t cstoe : 1; uint8_t blkovre : 1; uint8_t dmadone : 1; uint8_t fifoempty : 1; uint8_t xfrdone : 1; uint8_t ackrcv : 1; uint8_t ackrcve : 1; uint8_t ovre : 1; uint8_t unre : 1; } __attribute__((__packed__)) bits; } hsmci_idr_t; /** * HSMCI Interrupt Mask Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 902 */ typedef union { uint32_t flat; struct { uint8_t cmdrdy : 1; uint8_t rxrdy : 1; uint8_t txrdy : 1; uint8_t blke : 1; uint8_t dtip : 1; uint8_t notbusy : 1; uint8_t reserved0 : 2; uint8_t mci_sdioirqa : 1; uint8_t reserved1 : 3; uint8_t sdiowait : 1; uint8_t csrcv : 1; uint8_t reserved2 : 2; uint8_t rinde : 1; uint8_t rdire : 1; uint8_t rcrce : 1; uint8_t rende : 1; uint8_t rtoe : 1; uint8_t dcrce : 1; uint8_t dtoe : 1; uint8_t cstoe : 1; uint8_t blkovre : 1; uint8_t dmadone : 1; uint8_t fifoempty : 1; uint8_t xfrdone : 1; uint8_t ackrcv : 1; uint8_t ackrcve : 1; uint8_t ovre : 1; uint8_t unre : 1; } __attribute__((__packed__)) bits; } hsmci_imr_t; /** * HSMCI DMA Configuration Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 904 */ typedef union { uint32_t flat; struct { uint8_t offset : 2; uint8_t reserved0 : 2; uint8_t chksize : 1; uint8_t reserved1 : 3; uint8_t dmaen : 1; uint8_t reserved2 : 3; uint8_t ropt : 1; uint8_t reserved3 : 3; uint16_t reserved4 : 16; } __attribute__((__packed__)) bits; } hsmci_dma_t; /** * HSMCI Configuration Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 905 */ typedef union { uint32_t flat; struct { uint8_t fifomode : 1; uint8_t reserved0 : 3; uint8_t ferrctrl : 1; uint8_t reserved1 : 3; uint8_t hsmode : 1; uint8_t reserved2 : 3; uint8_t lsync : 1; uint8_t reserved3 : 3; uint16_t reserved4 : 16; } __attribute__((__packed__)) bits; } hsmci_cfg_t; /** * HSMCI Write Protection Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 906 */ typedef union { uint32_t flat; struct { uint8_t wp_en : 1; uint8_t reserved0 : 7; uint32_t wp_key : 24; } __attribute__((__packed__)) bits; } hsmci_wpmr_t; /** * HSMCI Write Protect Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 907 */ typedef union { uint32_t flat; struct { uint8_t wp_vs : 4; uint8_t reserved0 : 4; uint16_t wp_key : 16; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } hsmci_wpsr_t; /** * HSMCI FIFO Memory Aperture, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 908 */ typedef union { uint32_t flat; struct { uint32_t data : 32; } __attribute__((__packed__)) bits; } hsmci_fifo_t; /** * HSMCI Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary, p. 879 */ typedef struct hsmci { volatile hsmci_cr_t cr; // Control Register volatile hsmci_mr_t mr; // Mode Register volatile hsmci_dtor_t dtor; // Data Timeout Register volatile hsmci_sdcr_t sdcr; // SD/SDIO Card Register volatile hsmci_argr_t argr; // Argument Register volatile hsmci_cmdr_t cmdr; // Command Register volatile hsmci_blkr_t blkr; // Block Register volatile hsmci_cstor_t cstor; // Completion Signal Timeout Register volatile hsmci_rspr_t rspr[4]; // Response Registers volatile hsmci_rdr_t rdr; // Receive Data Register volatile hsmci_tdr_t tdr; // Transmit Data Register uint32_t reserved0[2]; // ***Reserved*** volatile hsmci_sr_t sr; // Status Register volatile hsmci_ier_t ier; // Interrupt Enable Register volatile hsmci_idr_t idr; // Interrupt Disable Register volatile hsmci_imr_t imr; // Interrupt Mask Register volatile hsmci_dma_t dma; // DMA Configuration Register volatile hsmci_cfg_t cfg; // Configuration Register uint32_t reserved1[3]; // ***Reserved*** volatile hsmci_wpmr_t wpmr; // Write Protection Mode Register volatile hsmci_wpsr_t wpsr; // Write Portection Status Register uint32_t reserved2[5]; // ***Reserved*** } hsmci_t; /** * Memory mapping for the HSMCI controller */ volatile hsmci_t* HSMCI = (volatile hsmci_t *) 0x40000000; volatile hsmci_fifo_t* hsmci_fifo = (volatile hsmci_fifo_t *) 0x40000200; enum { CMD_PON, CMD0, CMD2, CMD3, CMD4, CMD6, CMD7, CMD8, CMD9, CMD10, CMD12, CMD13, CMD15, CMD16, CMD17, CMD18, CMD19, CMD20, CMD24, CMD25, CMD26, CMD27, CMD28, CMD29, CMD30, CMD32, CMD33, CMD38, CMD42, CMD56R, CMD56W, ACMD6, ACMD6_REAL, ACMD13, ACMD13_REAL, ACMD22, ACMD22_REAL, ACMD23, ACMD23_REAL, ACMD41, ACMD41_REAL, ACMD42, ACMD42_REAL, ACMD51, ACMD51_REAL, }; #define AT91C_MCI_CMDNB (0x3F << 0) // (MCI) Command Number #define AT91C_MCI_RSPTYP (0x3 << 6) // (MCI) Response Type #define AT91C_MCI_RSPTYP_NO (0x0 << 6) // (MCI) No response #define AT91C_MCI_RSPTYP_48 (0x1 << 6) // (MCI) 48-bit response #define AT91C_MCI_RSPTYP_136 (0x2 << 6) // (MCI) 136-bit response #define AT91C_MCI_RSPTYP_R1B (0x3 << 6) // (MCI) R1b response #define AT91C_MCI_SPCMD (0x7 << 8) // (MCI) Special CMD #define AT91C_MCI_SPCMD_NONE (0x0 << 8) // (MCI) Not a special CMD #define AT91C_MCI_SPCMD_INIT (0x1 << 8) // (MCI) Initialization CMD #define AT91C_MCI_SPCMD_SYNC (0x2 << 8) // (MCI) Synchronized CMD #define AT91C_MCI_SPCMD_CE_ATA (0x3 << 8) // (MCI) CE-ATA Completion Signal disable CMD #define AT91C_MCI_SPCMD_IT_CMD (0x4 << 8) // (MCI) Interrupt command #define AT91C_MCI_SPCMD_IT_REP (0x5 << 8) // (MCI) Interrupt response #define AT91C_MCI_OPDCMD (0x1 << 11) // (MCI) Open Drain Command #define AT91C_MCI_OPDCMD_PUSHPULL (0x0 << 11) // (MCI) Push/pull command #define AT91C_MCI_OPDCMD_OPENDRAIN (0x1 << 11) // (MCI) Open drain command #define AT91C_MCI_MAXLAT (0x1 << 12) // (MCI) Maximum Latency for Command to respond #define AT91C_MCI_MAXLAT_5 (0x0 << 12) // (MCI) 5 cycles maximum latency #define AT91C_MCI_MAXLAT_64 (0x1 << 12) // (MCI) 64 cycles maximum latency #define AT91C_MCI_TRCMD (0x3 << 16) // (MCI) Transfer CMD #define AT91C_MCI_TRCMD_NO (0x0 << 16) // (MCI) No transfer #define AT91C_MCI_TRCMD_START (0x1 << 16) // (MCI) Start transfer #define AT91C_MCI_TRCMD_STOP (0x2 << 16) // (MCI) Stop transfer #define AT91C_MCI_TRDIR (0x1 << 18) // (MCI) Transfer Direction #define AT91C_MCI_TRDIR_WRITE (0x0 << 18) // (MCI) Write #define AT91C_MCI_TRDIR_READ (0x1 << 18) // (MCI) Read #define AT91C_MCI_TRTYP (0x7 << 19) // (MCI) Transfer Type #define AT91C_MCI_TRTYP_BLOCK (0x0 << 19) // (MCI) MMC/SDCard Single Block Transfer type #define AT91C_MCI_TRTYP_MULTIPLE (0x1 << 19) // (MCI) MMC/SDCard Multiple Block transfer type #define AT91C_MCI_TRTYP_STREAM (0x2 << 19) // (MCI) MMC Stream transfer type #define AT91C_MCI_TRTYP_SDIO_BYTE (0x4 << 19) // (MCI) SDIO Byte transfer type #define AT91C_MCI_TRTYP_SDIO_BLOCK (0x5 << 19) // (MCI) SDIO Block transfer type #define AT91C_MCI_IOSPCMD (0x3 << 24) // (MCI) SDIO Special Command #define AT91C_MCI_IOSPCMD_NONE (0x0 << 24) // (MCI) NOT a special command #define AT91C_MCI_IOSPCMD_SUSPEND (0x1 << 24) // (MCI) SDIO Suspend Command #define AT91C_MCI_IOSPCMD_RESUME (0x2 << 24) // (MCI) SDIO Resume Command #define AT91C_MCI_ATACS (0x1 << 26) // (MCI) ATA with command completion signal #define AT91C_MCI_ATACS_NORMAL (0x0 << 26) // (MCI) normal operation mode #define AT91C_MCI_ATACS_COMPLETION (0x1 << 26) // (MCI) completion //----------------------------------------------------------------------------- /// OCR Register //----------------------------------------------------------------------------- #define AT91C_VDD_16_17 (1 << 4) #define AT91C_VDD_17_18 (1 << 5) #define AT91C_VDD_18_19 (1 << 6) #define AT91C_VDD_19_20 (1 << 7) #define AT91C_VDD_20_21 (1 << 8) #define AT91C_VDD_21_22 (1 << 9) #define AT91C_VDD_22_23 (1 << 10) #define AT91C_VDD_23_24 (1 << 11) #define AT91C_VDD_24_25 (1 << 12) #define AT91C_VDD_25_26 (1 << 13) #define AT91C_VDD_26_27 (1 << 14) #define AT91C_VDD_27_28 (1 << 15) #define AT91C_VDD_28_29 (1 << 16) #define AT91C_VDD_29_30 (1 << 17) #define AT91C_VDD_30_31 (1 << 18) #define AT91C_VDD_31_32 (1 << 19) #define AT91C_VDD_32_33 (1 << 20) #define AT91C_VDD_33_34 (1 << 21) #define AT91C_VDD_34_35 (1 << 22) #define AT91C_VDD_35_36 (1 << 23) #define AT91C_CARD_POWER_UP_BUSY (1 << 31) #define AT91C_MMC_OCR_BIT2930 (3 << 29) #define AT91C_MMC_HOST_VOLTAGE_RANGE (AT91C_VDD_27_28 +\ AT91C_VDD_28_29 +\ AT91C_VDD_29_30 +\ AT91C_VDD_30_31 +\ AT91C_VDD_31_32 +\ AT91C_VDD_32_33) // Basic Commands (class 0) // // Cmd0 MCI + SPI #define AT91C_POWER_ON_INIT (0 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_INIT \ | AT91C_MCI_OPDCMD) #define AT91C_GO_IDLE_STATE_CMD (0 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE ) // Cmd1 SPI #define AT91C_MMC_SEND_OP_COND_CMD (1 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_OPDCMD) // Cmd2 MCI #define AT91C_ALL_SEND_CID_CMD (2 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_136 ) // Cmd3 MCI #define AT91C_SET_RELATIVE_ADDR_CMD (3 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_MAXLAT ) // Cmd4 MCI #define AT91C_SET_DSR_CMD (4 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_NO \ | AT91C_MCI_MAXLAT ) // Cmd6 SD/MMC #define AT91C_MMC_SWITCH_CMD (6 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_MAXLAT ) #define AT91C_SD_SWITCH_CMD (6 | AT91C_MCI_TRCMD_START \ | AT91C_MCI_TRTYP_BLOCK \ | AT91C_MCI_TRDIR_READ \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_MAXLAT ) // cmd7 MCI #define AT91C_SEL_DESEL_CARD_CMD (7 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_MAXLAT ) #define AT91C_SEL_CARD_CMD (7 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_MAXLAT ) #define AT91C_DESEL_CARD_CMD (7 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_NO \ | AT91C_MCI_MAXLAT ) // Cmd8 MCI + SPI #define AT91C_SEND_IF_COND (8 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_MAXLAT ) // Cmd9 MCI + SPI #define AT91C_SEND_CSD_CMD (9 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_136 \ | AT91C_MCI_MAXLAT ) // Cmd10 MCI + SPI #define AT91C_SEND_CID_CMD (10 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_136 \ | AT91C_MCI_MAXLAT ) // Cmd12 MCI + SPI #define AT91C_STOP_TRANSMISSION_CMD (12 | AT91C_MCI_TRCMD_STOP \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_MAXLAT ) // Cmd13 MCI + SPI #define AT91C_SEND_STATUS_CMD (13 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_MAXLAT ) // Cmd15 MCI #define AT91C_GO_INACTIVE_STATE_CMD (15 | AT91C_MCI_RSPTYP_NO ) // Cmd58 SPI #define AT91C_READ_OCR_CMD (58 | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_MAXLAT ) // Cmd59 SPI #define AT91C_CRC_ON_OFF_CMD (59 | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_MAXLAT ) //*------------------------------------------------ //* Class 2 commands: Block oriented Read commands //*------------------------------------------------ // Cmd8 for MMC #define AT91C_SEND_EXT_CSD_CMD (8 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_OPDCMD_PUSHPULL \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_START \ | AT91C_MCI_TRTYP_BLOCK \ | AT91C_MCI_TRDIR \ | AT91C_MCI_MAXLAT) // Cmd16 #define AT91C_SET_BLOCKLEN_CMD (16 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_MAXLAT ) // Cmd17 #define AT91C_READ_SINGLE_BLOCK_CMD (17 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_START \ | AT91C_MCI_TRTYP_BLOCK \ | AT91C_MCI_TRDIR \ | AT91C_MCI_MAXLAT) // Cmd18 #define AT91C_READ_MULTIPLE_BLOCK_CMD (18 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_START \ | AT91C_MCI_TRTYP_MULTIPLE \ | AT91C_MCI_TRDIR \ | AT91C_MCI_MAXLAT) //*------------------------------------------------ //* Class 4 commands: Block oriented write commands //*------------------------------------------------ // Cmd24 #define AT91C_WRITE_BLOCK_CMD (24 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_START \ | (AT91C_MCI_TRTYP_BLOCK \ & ~(AT91C_MCI_TRDIR)) \ | AT91C_MCI_MAXLAT) // Cmd25 #define AT91C_WRITE_MULTIPLE_BLOCK_CMD (25 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_START \ | (AT91C_MCI_TRTYP_MULTIPLE \ & ~(AT91C_MCI_TRDIR)) \ | AT91C_MCI_MAXLAT) // Cmd27 #define AT91C_PROGRAM_CSD_CMD (27 | AT91C_MCI_RSPTYP_48 ) //*---------------------------------------- //* Class 5 commands: Erase commands //*---------------------------------------- // Cmd32 #define AT91C_TAG_SECTOR_START_CMD (32 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_MAXLAT) // Cmd33 #define AT91C_TAG_SECTOR_END_CMD (33 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_MAXLAT) // Cmd38 #define AT91C_ERASE_CMD (38 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_MAXLAT ) //*---------------------------------------- //* Class 7 commands: Lock commands //*---------------------------------------- // Cmd42 #define AT91C_LOCK_UNLOCK (42 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_MAXLAT) //*----------------------------------------------- // Class 8 commands: Application specific commands //*----------------------------------------------- // Cmd55 #define AT91C_APP_CMD (55 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_MAXLAT) // Cmd56 #define AT91C_GEN_CMD (56 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_MAXLAT) // ACMD6 #define AT91C_SD_SET_BUS_WIDTH_CMD (6 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_MAXLAT) // ACMD13 #define AT91C_SD_STATUS_CMD (13 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_START \ | AT91C_MCI_TRTYP_BLOCK \ | AT91C_MCI_TRDIR_READ \ | AT91C_MCI_MAXLAT) // ACMD22 #define AT91C_SD_SEND_NUM_WR_BLOCKS_CMD (22 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_MAXLAT) // ACMD23 #define AT91C_SD_SET_WR_BLK_ERASE_COUNT_CMD (23 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_MAXLAT) // ACMD41 #define AT91C_SD_APP_OP_COND_CMD (41 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_NO ) // ACMD42 #define AT91C_SD_SET_CLR_CARD_DETECT_CMD (42 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_MAXLAT) // ACMD51 #define AT91C_SD_SEND_SCR_CMD (51 | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_TRCMD_START \ | AT91C_MCI_TRDIR_READ \ | AT91C_MCI_TRTYP_BLOCK \ | AT91C_MCI_MAXLAT) //*----------------------------------------------- // SDIO Commands //*----------------------------------------------- // CMD5, R4 #define AT91C_SDIO_SEND_OP_COND (5 | AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ | AT91C_MCI_RSPTYP_48 \ | AT91C_MCI_OPDCMD) // CMD52, R5 #define AT91C_SDIO_IO_RW_DIRECT (52| AT91C_MCI_TRCMD_NO \ | AT91C_MCI_SPCMD_NONE \ //*----------------------------------------------- // Constants //*----------------------------------------------- #define SD_STAT_DATA_BUS_WIDTH_4BIT 0x2 #define SD_STAT_DATA_BUS_WIDTH_1BIT 0x0 #define STATUS_APP_CMD (1 << 5) #define STATUS_SWITCH_ERROR (1 << 7) #define STATUS_READY_FOR_DATA (1 << 8) #define STATUS_IDLE (0 << 9) #define STATUS_READY (1 << 9) #define STATUS_IDENT (2 << 9) #define STATUS_STBY (3 << 9) #define STATUS_TRAN (4 << 9) #define STATUS_DATA (5 << 9) #define STATUS_RCV (6 << 9) #define STATUS_PRG (7 << 9) #define STATUS_DIS (8 << 9) #define STATUS_STATE (0xF << 9) #define STATUS_ERASE_RESET (1 << 13) #define STATUS_WP_ERASE_SKIP (1 << 15) #define STATUS_CIDCSD_OVERWRITE (1 << 16) #define STATUS_OVERRUN (1 << 17) #define STATUS_UNERRUN (1 << 18) #define STATUS_ERROR (1 << 19) #define STATUS_CC_ERROR (1 << 20) #define STATUS_CARD_ECC_FAILED (1 << 21) #define STATUS_ILLEGAL_COMMAND (1 << 22) #define STATUS_COM_CRC_ERROR (1 << 23) #define STATUS_UN_LOCK_FAILED (1 << 24) #define STATUS_CARD_IS_LOCKED (1 << 25) #define STATUS_WP_VIOLATION (1 << 26) #define STATUS_ERASE_PARAM (1 << 27) #define STATUS_ERASE_SEQ_ERROR (1 << 28) #define STATUS_BLOCK_LEN_ERROR (1 << 29) #define STATUS_ADDRESS_MISALIGN (1 << 30) #define STATUS_ADDR_OUT_OR_RANGE (1 << 31) #define STATUS_STOP ( STATUS_CARD_IS_LOCKED \ | STATUS_COM_CRC_ERROR \ | STATUS_ILLEGAL_COMMAND \ | STATUS_CC_ERROR \ | STATUS_ERROR \ | STATUS_STATE \ | STATUS_READY_FOR_DATA ) #define STATUS_WRITE ( STATUS_ADDR_OUT_OR_RANGE \ | STATUS_ADDRESS_MISALIGN \ | STATUS_BLOCK_LEN_ERROR \ | STATUS_WP_VIOLATION \ | STATUS_CARD_IS_LOCKED \ | STATUS_COM_CRC_ERROR \ | STATUS_ILLEGAL_COMMAND \ | STATUS_CC_ERROR \ | STATUS_ERROR \ | STATUS_ERASE_RESET \ | STATUS_STATE \ | STATUS_READY_FOR_DATA ) #define STATUS_READ ( STATUS_ADDR_OUT_OR_RANGE \ | STATUS_ADDRESS_MISALIGN \ | STATUS_BLOCK_LEN_ERROR \ | STATUS_CARD_IS_LOCKED \ | STATUS_COM_CRC_ERROR \ | STATUS_ILLEGAL_COMMAND \ | STATUS_CARD_ECC_FAILED \ | STATUS_CC_ERROR \ | STATUS_ERROR \ | STATUS_ERASE_RESET \ | STATUS_STATE \ | STATUS_READY_FOR_DATA ) #define STATUS_SD_SWITCH ( STATUS_ADDR_OUT_OR_RANGE \ | STATUS_CARD_IS_LOCKED \ | STATUS_COM_CRC_ERROR \ | STATUS_ILLEGAL_COMMAND \ | STATUS_CARD_ECC_FAILED \ | STATUS_CC_ERROR \ | STATUS_ERROR \ | STATUS_UNERRUN \ | STATUS_OVERRUN \ | STATUS_STATE) #define STATUS_MMC_SWITCH ( STATUS_CARD_IS_LOCKED \ | STATUS_COM_CRC_ERROR \ | STATUS_ILLEGAL_COMMAND \ | STATUS_CC_ERROR \ | STATUS_ERROR \ | STATUS_ERASE_RESET \ | STATUS_STATE \ | STATUS_READY_FOR_DATA \ | STATUS_SWITCH_ERROR ) //*----------------------------------------------- // Return Types //*----------------------------------------------- typedef struct hsmci_sd_r1 { uint32_t status : 32; uint32_t cmd_index : 6; } __attribute__((__packed__)) hsmci_sd_r1_t; typedef struct hsmci_sd_r2 { union { struct { uint32_t reserved0 : 1; uint32_t crc7 : 7; uint32_t mdt : 12; uint32_t reserved1 : 4; uint32_t psn : 32; uint32_t prv : 8; uint64_t pnm : 40; uint32_t oid : 16; uint32_t mid : 8; } __attribute__((__packed__)) cid; struct { uint32_t reserved6 : 1; uint32_t crc : 7; uint32_t reserved5 : 2; uint32_t file_format : 2; uint32_t tmp_write_protect : 1; uint32_t perm_write_protect : 1; uint32_t copy : 1; uint32_t file_format_grp : 1; uint32_t reserved4 : 5; uint32_t write_bl_partial : 1; uint32_t write_bl_len : 4; uint32_t r2w_factor : 3; uint32_t reserved3 : 2; uint32_t wp_grp_enable : 1; uint32_t wp_grp_size : 7; uint32_t sector_size : 7; uint32_t erase_blk_en : 1; uint32_t c_size_mult : 3; uint32_t vdd_w_curr_max : 3; uint32_t vdd_w_curr_min : 3; uint32_t vdd_r_curr_max : 3; uint32_t vdd_r_curr_min : 3; uint32_t c_size : 12; uint32_t reserved1 : 2; uint32_t dsr_imp : 1; uint32_t read_blk_misalign : 1; uint32_t write_blk_misalign : 1; uint32_t read_bl_partial : 1; uint32_t read_bl_len : 4; uint32_t ccc : 12; uint32_t tran_speed : 8; uint32_t nsac : 8; uint32_t taac : 8; uint32_t reserved0 : 6; uint32_t csd_structure : 2; } __attribute__((__packed__)) v1_csd; struct { uint32_t reserved6 : 1; uint32_t crc : 7; uint32_t reserved5 : 2; uint32_t file_format : 2; uint32_t tmp_write_protect : 1; uint32_t perm_write_protect : 1; uint32_t copy : 1; uint32_t file_format_grp : 1; uint32_t reserved4 : 5; uint32_t write_bl_partial : 1; uint32_t write_bl_len : 4; uint32_t r2w_factor : 3; uint32_t reserved3 : 2; uint32_t wp_grp_enable : 1; uint32_t wp_grp_size : 7; uint32_t sector_size : 7; uint32_t erase_blk_en : 1; uint32_t reserved2 : 1; uint32_t c_size : 22; uint32_t reserved1 : 6; uint32_t dsr_imp : 1; uint32_t read_blk_misalign : 1; uint32_t write_blk_misalign : 1; uint32_t read_bl_partial : 1; uint32_t read_bl_len : 4; uint32_t ccc : 12; uint32_t tran_speed : 8; uint32_t nsac : 8; uint32_t taac : 8; uint32_t reserved0 : 6; uint32_t csd_structure : 2; } __attribute__((__packed__)) csd; }; } hsmci_sd_r2_t; typedef struct hsmci_sd_r3 { struct { uint32_t reserved0 : 8; uint32_t ocr : 16; uint32_t s18a : 1; uint32_t reserved1 : 4; uint32_t reserved2 : 1; uint32_t ccs : 1; uint32_t busy : 1; } __attribute__((__packed__)) ocr; } hsmci_sd_r3_t; typedef struct hsmci_sd_r6 { uint32_t status : 16; uint32_t rca : 16; } __attribute__((__packed__)) hsmci_sd_r6_t; typedef struct hsmci_sd_r7 { uint32_t cpattern : 8; uint32_t vrange : 4; } __attribute__((__packed__)) hsmci_sd_r7_t; #endif // _SAM3UHSMCIHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/matrix/000077500000000000000000000000001207233610700221325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/matrix/sam3matrixhardware.h000066400000000000000000000101331207233610700261070ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Bus Matrix register definitions. * * @author Thomas Schmid */ #ifndef _SAM3UMATRIXHARDWARE_H #define _SAM3UMATRIXHARDWARE_H #include "matrixhardware.h" /** * Bus Matrix Register definitions, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 339 */ typedef struct matrix { volatile matrix_mcfg_t mcfg0; // master configuration register 0 volatile matrix_mcfg_t mcfg1; // master configuration register 1 volatile matrix_mcfg_t mcfg2; // master configuration register 2 volatile matrix_mcfg_t mcfg3; // master configuration register 3 volatile matrix_mcfg_t mcfg4; // master configuration register 4 uint32_t reserved0[10]; volatile matrix_scfg_t scfg0; // slave confgiruation register 0 volatile matrix_scfg_t scfg1; // slave confgiruation register 1 volatile matrix_scfg_t scfg2; // slave confgiruation register 2 volatile matrix_scfg_t scfg3; // slave confgiruation register 3 volatile matrix_scfg_t scfg4; // slave confgiruation register 4 volatile matrix_scfg_t scfg5; // slave confgiruation register 5 volatile matrix_scfg_t scfg6; // slave confgiruation register 6 volatile matrix_scfg_t scfg7; // slave confgiruation register 7 volatile matrix_scfg_t scfg8; // slave confgiruation register 8 volatile matrix_scfg_t scfg9; // slave confgiruation register 9 uint32_t reserved1[5]; volatile matrix_pras_t pras0; // priority register A for slave 0 uint32_t reserved2; volatile matrix_pras_t pras1; // priority register A for slave 0 uint32_t reserved3; volatile matrix_pras_t pras2; // priority register A for slave 0 uint32_t reserved4; volatile matrix_pras_t pras3; // priority register A for slave 0 uint32_t reserved5; volatile matrix_pras_t pras4; // priority register A for slave 0 uint32_t reserved6; volatile matrix_pras_t pras5; // priority register A for slave 0 uint32_t reserved7; volatile matrix_pras_t pras6; // priority register A for slave 0 uint32_t reserved8; volatile matrix_pras_t pras7; // priority register A for slave 0 uint32_t reserved9; volatile matrix_pras_t pras8; // priority register A for slave 0 uint32_t reserved10; volatile matrix_pras_t pras9; // priority register A for slave 0 uint32_t reserved11[12]; volatile matrix_mrcr_t mrcr; // master remap control register } matrix_t; /** * Memory mapping for the MATRIX */ volatile matrix_t* MATRIX = (volatile matrix_t*) 0x400E0200; // MATRIX Base Address #endif // _SAM3UMATRIXHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/mpu/000077500000000000000000000000001207233610700214275ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/mpu/HplSam3uMpu.nc000066400000000000000000000040651207233610700240740ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL interface to the SAM3U MPU. * * @author wanja@cs.fau.de */ #include "sam3umpuhardware.h" interface HplSam3uMpu { async command void enableMpu(); async command void disableMpu(); async command void enableMpuDuringHardFaults(); async command void disableMpuDuringHardFaults(); async command void enableDefaultBackgroundRegion(); async command void disableDefaultBackgroundRegion(); async command void deployRegion(mpu_rbar_t rbar, mpu_rasr_t rasr); async event void mpuFault(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/mpu/HplSam3uMpuC.nc000066400000000000000000000036721207233610700242020ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author wanja@cs.fau.de */ configuration HplSam3uMpuC { provides interface HplSam3uMpu; } implementation { components HplSam3uMpuP; HplSam3uMpu = HplSam3uMpuP.HplSam3uMpu; components MainC; MainC.SoftwareInit -> HplSam3uMpuP.Init; components HplNVICC; HplSam3uMpuP.HplNVICCntl -> HplNVICC; components McuSleepC; HplSam3uMpuP.MpuInterruptWrapper -> McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/mpu/HplSam3uMpuP.nc000066400000000000000000000067431207233610700242210ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author wanja@cs.fau.de */ #include "sam3umpuhardware.h" module HplSam3uMpuP { provides interface HplSam3uMpu; provides interface HplSam3uMpuStatus; provides interface Init; uses interface HplNVICCntl; uses interface FunctionWrapper as MpuInterruptWrapper; } implementation { command error_t Init.init() { call HplNVICCntl.enableMemoryProtectionFault(); return SUCCESS; } async command void HplSam3uMpu.enableMpu() { MPU_CTRL->bits.enable = 1; } async command void HplSam3uMpu.disableMpu() { MPU_CTRL->bits.enable = 0; } async command void HplSam3uMpu.enableMpuDuringHardFaults() { MPU_CTRL->bits.hfnmiena = 1; } async command void HplSam3uMpu.disableMpuDuringHardFaults() { MPU_CTRL->bits.hfnmiena = 0; } async command void HplSam3uMpu.enableDefaultBackgroundRegion() { MPU_CTRL->bits.privdefena = 1; } async command void HplSam3uMpu.disableDefaultBackgroundRegion() { MPU_CTRL->bits.privdefena = 0; } async command void HplSam3uMpu.deployRegion(mpu_rbar_t rbar, mpu_rasr_t rasr) { // write registers *MPU_RBAR = rbar; *MPU_RASR = rasr; } __attribute__((interrupt)) void MpuFaultHandler() @C() @spontaneous() { call MpuInterruptWrapper.preamble(); signal HplSam3uMpu.mpuFault(); call MpuInterruptWrapper.postamble(); } async command bool HplSam3uMpuStatus.isStackingFault() { return (MPU_MMFSR->bits.mstkerr == 0x1); } async command bool HplSam3uMpuStatus.isUnstackingFault() { return (MPU_MMFSR->bits.munstkerr == 0x1); } async command bool HplSam3uMpuStatus.isDataAccessFault() { return (MPU_MMFSR->bits.daccviol == 0x1); } async command bool HplSam3uMpuStatus.isInstructionAccessFault() { return (MPU_MMFSR->bits.iaccviol == 0x1); } async command bool HplSam3uMpuStatus.isValidFaultAddress() { return (MPU_MMFSR->bits.mmarvalid == 0x1); } async command void *HplSam3uMpuStatus.getFaultAddress() { return (void *) MPU_MMFAR->bits.address; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/mpu/HplSam3uMpuSettings.nc000066400000000000000000000045531207233610700256170ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL interface to the SAM3U MPU settings. * * @author wanja@cs.fau.de */ #include "sam3umpuhardware.h" interface HplSam3uMpuSettings { async command error_t getMpuSettings( uint8_t regionNumber, bool enable, void *baseAddress, uint32_t size, // in bytes (bug: 4 GB not possible with this interface) bool enableInstructionFetch, bool enableReadPrivileged, bool enableWritePrivileged, bool enableReadUnprivileged, bool enableWriteUnprivileged, bool cacheable, // should be turned off for periphery and sys control (definitive guide, p. 213) bool bufferable, // should be turned off for sys control to be strongly ordered (definitive guide, p. 213) uint8_t disabledSubregions, // bit = 1: subregion disabled mpu_rbar_t *rbar, // RBAR register value output mpu_rasr_t *rasr ); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/mpu/HplSam3uMpuSettingsC.nc000066400000000000000000000115511207233610700257160ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author wanja@cs.fau.de */ #include "sam3umpuhardware.h" module HplSam3uMpuSettingsC { provides interface HplSam3uMpuSettings; } implementation { async command error_t HplSam3uMpuSettings.getMpuSettings( uint8_t regionNumber, bool enable, void *baseAddress, uint32_t size, // in bytes (bug: 4 GB not possible with this interface) bool enableInstructionFetch, bool enableReadPrivileged, bool enableWritePrivileged, bool enableReadUnprivileged, bool enableWriteUnprivileged, bool cacheable, // should be turned off for periphery and sys control (definitive guide, p. 213) bool bufferable, // should be turned off for sys control to be strongly ordered (definitive guide, p. 213) uint8_t disabledSubregions, // bit = 1: subregion disabled mpu_rbar_t *rbar_param, // RBAR register value output mpu_rasr_t *rasr_param ) { uint8_t sizeField = 0; // size encoded in 5 bits (definitive guide, p. 209) uint32_t sizeIter = size; uint8_t i = 0; mpu_rbar_t rbar; mpu_rasr_t rasr; if (regionNumber > 7) return FAIL; // size has to be greater or equal to 32 if (size < 32) return FAIL; // compute size encoding while (sizeIter != 0) { sizeIter = sizeIter >> 1; sizeField++; } sizeField -= 2; // 32 bytes has to equal b00100 (4) // size has to be power of 2 // compute size from power sizeIter = 2; // = sizeField of 0 for (i = 0; i < sizeField; i++) { sizeIter *= 2; } if (sizeIter != size) return FAIL; // check alignment of base address to size if ((((uint32_t) baseAddress) & (size - 1)) != 0) return FAIL; // program region rbar.flat = (uint32_t) baseAddress; rbar.bits.region = regionNumber; rbar.bits.valid = 1; // region field is valid rasr.flat = 0; rasr.bits.xn = (enableInstructionFetch == TRUE ? 0 : 1); // 1 = instruction fetch disabled rasr.bits.srd = disabledSubregions; rasr.bits.tex = 0; rasr.bits.s = 1; // shareable rasr.bits.c = (cacheable == TRUE ? 1 : 0); // 1 = cacheable rasr.bits.b = (bufferable == TRUE ? 1 : 0); // 1 = bufferable rasr.bits.size = sizeField; rasr.bits.enable = enable; // region enabled or disabled // access permissions (see definitive guide, p. 209) // impossible combinations return FAIL if (enableReadPrivileged == FALSE) { // SV no read -> SV no access, user no access rasr.bits.ap = 0x0; if (enableWritePrivileged == TRUE || enableReadUnprivileged == TRUE || enableWriteUnprivileged == TRUE) return FAIL; } else { // SV read if (enableWritePrivileged == FALSE) { // SV read-only if (enableWriteUnprivileged == TRUE) return FAIL; if (enableReadUnprivileged == FALSE) { // SV read-only, user no access rasr.bits.ap = 0x5; } else { // SV read-only, user read-only rasr.bits.ap = 0x6; } } else { // SV read/write if (enableReadUnprivileged == FALSE) { // SV read/write, user no read -> user no access if (enableWriteUnprivileged == TRUE) return FAIL; rasr.bits.ap = 0x1; } else { // SV read/write, user read if (enableWriteUnprivileged == FALSE) { // SV read/write, user read-only rasr.bits.ap = 0x2; } else { // SV read/write, user read/write rasr.bits.ap = 0x3; } } } } // output register values *rbar_param = rbar; *rasr_param = rasr; return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/mpu/HplSam3uMpuStatus.nc000066400000000000000000000036601207233610700253000ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL interface to the status of the SAM3U MPU. * * @author wanja@cs.fau.de */ interface HplSam3uMpuStatus { async command bool isStackingFault(); async command bool isUnstackingFault(); async command bool isDataAccessFault(); async command bool isInstructionAccessFault(); async command bool isValidFaultAddress(); async command void *getFaultAddress(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/mpu/sam3umpuhardware.h000066400000000000000000000144141207233610700250740ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Definitions specific to the SAM3U ARM Cortex-M3 memory protection unit. * * @author wanja@cs.fau.de */ #ifndef SAM3UMPUHARDWARE_H #define SAM3UMPUHARDWARE_H // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 211 typedef union { uint32_t flat; struct { uint8_t separate : 1; // support for unified or separate instruction and data memory maps, always unified on SAM3U uint8_t reserved0 : 7; uint8_t dregion : 8; // number of supported MPU data regions, always 8 on SAM3U uint8_t iregion : 8; // number of supported MPU instruction regions, always 0 on SAM3U uint8_t reserved1 : 8; } bits; } mpu_type_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 212 typedef union { uint32_t flat; struct { uint8_t enable : 1; // enables the MPU uint8_t hfnmiena : 1; // enables MPU operation during hard fault, NMI, and FAULTMASK handlers uint8_t privdefena : 1; // enables privileged access to default memory map uint8_t reserved0 : 5; uint8_t reserved1 : 8; uint8_t reserved2 : 8; uint8_t reserved3 : 8; } bits; } mpu_ctrl_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 214 typedef union { uint32_t flat; struct { uint8_t region : 8; // region referenced by RBAR and RASR registers uint8_t reserved0 : 8; uint8_t reserved1 : 8; uint8_t reserved2 : 8; } bits; } mpu_rnr_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 215 typedef union { uint32_t flat; struct { uint8_t region : 4; // MPU region field uint8_t valid : 1; // MPU region number valid bit uint32_t addr : 27; // region base address field, depending on the region size in RASR! } bits; } mpu_rbar_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 216 typedef union { uint32_t flat; struct { uint8_t enable : 1; // region enable bit uint8_t size : 5; // size of the MPU protection region; minimum is 4 (32 B), maximum is 31 (4 GB) uint8_t reserved0 : 2; uint8_t srd : 8; // subregion disable bits; 0 = enabled, 1 = disabled uint8_t b : 1; // bufferable bit uint8_t c : 1; // cacheable bit uint8_t s : 1; // shareable bit uint8_t tex : 3; // type extension field uint8_t reserved1 : 2; uint8_t ap : 3; // access permission field uint8_t reserved2 : 1; uint8_t xn : 1; // instruction access disable bit; 0 = fetches enabled, 1 = fetches disabled uint8_t reserved3 : 3; } bits; } mpu_rasr_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 195 typedef union { uint8_t flat; struct { uint8_t iaccviol : 1; // instruction fetch from location that does not permit execution uint8_t daccviol : 1; // load or store at location that does not permit that uint8_t reserved0 : 1; uint8_t munstkerr : 1; // unstack for an exception return caused access violation(s) uint8_t mstkerr : 1; // stacking for an exception entry caused access violation(s) uint8_t reserved1 : 2; uint8_t mmarvalid : 1; // MMAR holds a valid fault address } bits; } mpu_mmfsr_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 201 typedef union { uint32_t flat; struct { uint32_t address : 32; // when MMARVALID in MMFSR is set to 1, this holds the address of the location that caused the fault } bits; } mpu_mmfar_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 210 volatile uint32_t* MPU_BASE = (volatile uint32_t *) 0xe000ed90; volatile mpu_type_t* MPU_TYPE = (volatile mpu_type_t *) 0xe000ed90; volatile mpu_ctrl_t* MPU_CTRL = (volatile mpu_ctrl_t *) 0xe000ed94; volatile mpu_rnr_t* MPU_RNR = (volatile mpu_rnr_t *) 0xe000ed98; volatile mpu_rbar_t* MPU_RBAR = (volatile mpu_rbar_t *) 0xe000ed9c; volatile mpu_rasr_t* MPU_RASR = (volatile mpu_rasr_t *) 0xe000eda0; volatile mpu_rbar_t* MPU_RBAR_A1 = (volatile mpu_rbar_t *) 0xe000eda4; volatile mpu_rasr_t* MPU_RASR_A1 = (volatile mpu_rasr_t *) 0xe000eda8; volatile mpu_rbar_t* MPU_RBAR_A2 = (volatile mpu_rbar_t *) 0xe000edac; volatile mpu_rasr_t* MPU_RASR_A2 = (volatile mpu_rasr_t *) 0xe000edb0; volatile mpu_rbar_t* MPU_RBAR_A3 = (volatile mpu_rbar_t *) 0xe000edb4; volatile mpu_rasr_t* MPU_RASR_A3 = (volatile mpu_rasr_t *) 0xe000edb8; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 194 volatile mpu_mmfsr_t* MPU_MMFSR = (volatile mpu_mmfsr_t *) 0xe000ed28; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 175 volatile mpu_mmfar_t* MPU_MMFAR = (volatile mpu_mmfar_t *) 0xe000ed34; #endif // SAM3UMPUHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/nvic/000077500000000000000000000000001207233610700215655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/nvic/HplNVICC.nc000066400000000000000000000151371207233610700234240ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ #include "sam3unvichardware.h" configuration HplNVICC { provides { interface HplNVICCntl; interface Init; interface HplNVICInterruptCntl as SUPCInterrupt; // SUPPLY CONTROLLER interface HplNVICInterruptCntl as RSTCInterrupt; // RESET CONTROLLER interface HplNVICInterruptCntl as RTCInterrupt; // REAL TIME CLOCK interface HplNVICInterruptCntl as RTTInterrupt; // REAL TIME TIMER interface HplNVICInterruptCntl as WDGInterrupt; // WATCHDOG TIMER interface HplNVICInterruptCntl as PMCInterrupt; interface HplNVICInterruptCntl as EFC0Interrupt; interface HplNVICInterruptCntl as EFC1Interrupt; interface HplNVICInterruptCntl as DBGUInterrupt; interface HplNVICInterruptCntl as HSMC4Interrupt; interface HplNVICInterruptCntl as PIOAInterrupt; // PARALLEL IO CONTROLLER A interface HplNVICInterruptCntl as PIOBInterrupt; // PARALLEL IO CONTROLLER B interface HplNVICInterruptCntl as PIOCInterrupt; // PARALLEL IO CONTROLLER C interface HplNVICInterruptCntl as US0Interrupt; // USART 0 interface HplNVICInterruptCntl as US1Interrupt; // USART 1 interface HplNVICInterruptCntl as US2Interrupt; // USART 2 interface HplNVICInterruptCntl as US3Interrupt; // USART 3 interface HplNVICInterruptCntl as MCI0Interrupt; // MULTIMEDIA CARD INTERFACE interface HplNVICInterruptCntl as TWI0Interrupt; interface HplNVICInterruptCntl as TWI1Interrupt; interface HplNVICInterruptCntl as SPI0Interrupt; // SERIAL PERIPHERAL INTERFACE interface HplNVICInterruptCntl as SSC0Interrupt; // SERIAL SYNCHRONOUS CONTROLLER 0 interface HplNVICInterruptCntl as TC0Interrupt; // TIMER COUNTER 0 interface HplNVICInterruptCntl as TC1Interrupt; // TIMER COUNTER 1 interface HplNVICInterruptCntl as TC2Interrupt; // TIMER COUNTER 2 interface HplNVICInterruptCntl as PWMCInterrupt; // PULSE WIDTH MODULATION CONTROLLER interface HplNVICInterruptCntl as ADC12BInterrupt; // 12-BIT ADC CONTROLLER interface HplNVICInterruptCntl as ADCInterrupt; // 10-BIT ADC CONTROLLER interface HplNVICInterruptCntl as HDMAInterrupt; interface HplNVICInterruptCntl as UDPHSInterrupt; // USB DEVICE HIGH SPEED } } implementation { components HplNVICCntlP, new HplNVICInterruptP(AT91C_ID_SUPC) as HSUPC, new HplNVICInterruptP(AT91C_ID_RSTC) as HRSTC, new HplNVICInterruptP(AT91C_ID_RTC) as HRTC, new HplNVICInterruptP(AT91C_ID_RTT) as HRTT, new HplNVICInterruptP(AT91C_ID_WDG) as HWDG, new HplNVICInterruptP(AT91C_ID_PMC) as HPMC, new HplNVICInterruptP(AT91C_ID_EFC0) as HEFC0, new HplNVICInterruptP(AT91C_ID_EFC1) as HEFC1, new HplNVICInterruptP(AT91C_ID_DBGU) as HDBGU, new HplNVICInterruptP(AT91C_ID_HSMC4) as HHSMC4, new HplNVICInterruptP(AT91C_ID_PIOA) as HPIOA, new HplNVICInterruptP(AT91C_ID_PIOB) as HPIOB, new HplNVICInterruptP(AT91C_ID_PIOC) as HPIOC, new HplNVICInterruptP(AT91C_ID_US0) as HUS0, new HplNVICInterruptP(AT91C_ID_US1) as HUS1, new HplNVICInterruptP(AT91C_ID_US2) as HUS2, new HplNVICInterruptP(AT91C_ID_US3) as HUS3, new HplNVICInterruptP(AT91C_ID_MCI0) as HMCI0, new HplNVICInterruptP(AT91C_ID_TWI0) as HTWI0, new HplNVICInterruptP(AT91C_ID_TWI1) as HTWI1, new HplNVICInterruptP(AT91C_ID_SPI0) as HSPI0, new HplNVICInterruptP(AT91C_ID_SSC0) as HSSC0, new HplNVICInterruptP(AT91C_ID_TC0) as HTC0, new HplNVICInterruptP(AT91C_ID_TC1) as HTC1, new HplNVICInterruptP(AT91C_ID_TC2) as HTC2, new HplNVICInterruptP(AT91C_ID_PWMC) as HPWMC, new HplNVICInterruptP(AT91C_ID_ADC12B) as HADC12B, new HplNVICInterruptP(AT91C_ID_ADC) as HADC, new HplNVICInterruptP(AT91C_ID_HDMA) as HHDMA, new HplNVICInterruptP(AT91C_ID_UDPHS) as HUDPHS; HplNVICCntl = HplNVICCntlP; Init = HplNVICCntlP; SUPCInterrupt = HSUPC.Cntl; RSTCInterrupt = HRSTC.Cntl; RTCInterrupt = HRTC.Cntl; RTTInterrupt = HRTT.Cntl; WDGInterrupt = HWDG.Cntl; PMCInterrupt = HPMC.Cntl; EFC0Interrupt = HEFC0.Cntl; EFC1Interrupt = HEFC1.Cntl; DBGUInterrupt = HDBGU.Cntl; HSMC4Interrupt = HHSMC4.Cntl; PIOAInterrupt = HPIOA.Cntl; PIOBInterrupt = HPIOB.Cntl; PIOCInterrupt = HPIOC.Cntl; US0Interrupt = HUS0.Cntl; US1Interrupt = HUS1.Cntl; US2Interrupt = HUS2.Cntl; US3Interrupt = HUS3.Cntl; MCI0Interrupt = HMCI0.Cntl; TWI0Interrupt = HTWI0.Cntl; TWI1Interrupt = HTWI1.Cntl; SPI0Interrupt = HSPI0.Cntl; SSC0Interrupt = HSSC0.Cntl; TC0Interrupt = HTC0.Cntl; TC1Interrupt = HTC1.Cntl; TC2Interrupt = HTC2.Cntl; PWMCInterrupt = HPWMC.Cntl; ADC12BInterrupt = HADC12B.Cntl; ADCInterrupt = HADC.Cntl; HDMAInterrupt = HHDMA.Cntl; UDPHSInterrupt = HUDPHS.Cntl; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/nvic/sam3unvichardware.h000066400000000000000000000111371207233610700253670ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ #ifndef SAM3UNVICHARDWARE_H #define SAM3UNVICHARDWARE_H #include "nvichardware.h" #include "sam3uhardware.h" /// Interrupt sources typedef enum irqn { /****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ /****** AT91SAM3U4 specific Interrupt Numbers *********************************************************/ IROn_SUPC = AT91C_ID_SUPC , // SUPPLY CONTROLLER IROn_RSTC = AT91C_ID_RSTC , // RESET CONTROLLER IROn_RTC = AT91C_ID_RTC , // REAL TIME CLOCK IROn_RTT = AT91C_ID_RTT , // REAL TIME TIMER IROn_WDG = AT91C_ID_WDG , // WATCHDOG TIMER IROn_PMC = AT91C_ID_PMC , // PMC IROn_EFC0 = AT91C_ID_EFC0 , // EFC0 IROn_EFC1 = AT91C_ID_EFC1 , // EFC1 IROn_DBGU = AT91C_ID_DBGU , // DBGU IROn_HSMC4 = AT91C_ID_HSMC4, // HSMC4 IROn_PIOA = AT91C_ID_PIOA , // Parallel IO Controller A IROn_PIOB = AT91C_ID_PIOB , // Parallel IO Controller B IROn_PIOC = AT91C_ID_PIOC , // Parallel IO Controller C IROn_US0 = AT91C_ID_US0 , // USART 0 IROn_US1 = AT91C_ID_US1 , // USART 1 IROn_US2 = AT91C_ID_US2 , // USART 2 IROn_US3 = AT91C_ID_US3 , // USART 3 IROn_MCI0 = AT91C_ID_MCI0 , // Multimedia Card Interface IROn_TWI0 = AT91C_ID_TWI0 , // TWI 0 IROn_TWI1 = AT91C_ID_TWI1 , // TWI 1 IROn_SPI0 = AT91C_ID_SPI0 , // Serial Peripheral Interface IROn_SSC0 = AT91C_ID_SSC0 , // Serial Synchronous Controller 0 IROn_TC0 = AT91C_ID_TC0 , // Timer Counter 0 IROn_TC1 = AT91C_ID_TC1 , // Timer Counter 1 IROn_TC2 = AT91C_ID_TC2 , // Timer Counter 2 IROn_PWMC = AT91C_ID_PWMC , // Pulse Width Modulation Controller IROn_ADCC0 = AT91C_ID_ADC12B, // ADC controller0 IROn_ADCC1 = AT91C_ID_ADC, // ADC controller1 IROn_HDMA = AT91C_ID_HDMA , // HDMA IROn_UDPHS = AT91C_ID_UDPHS // USB Device High Speed } irqn_t; #endif // SAM3UNVICHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/pdc/000077500000000000000000000000001207233610700213745ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/pdc/HplSam3uPdcC.nc000066400000000000000000000057041207233610700241120ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ configuration HplSam3uPdcC { provides interface HplSam3Pdc as UartPdcControl; provides interface HplSam3Pdc as Usart0PdcControl; provides interface HplSam3Pdc as Usart1PdcControl; provides interface HplSam3Pdc as Usart2PdcControl; provides interface HplSam3Pdc as Usart3PdcControl; provides interface HplSam3Pdc as Twi0PdcControl; provides interface HplSam3Pdc as Twi1PdcControl; provides interface HplSam3Pdc as PwmPdcControl; } implementation { enum { UART_BASE = 0x400E0600, USART0_BASE = 0x40090000, USART1_BASE = 0x40094000, USART2_BASE = 0x40098000, USART3_BASE = 0x4009C000, TWI0_BASE = 0x40084000, TWI1_BASE = 0x40088000, PWM_BASE = 0x4008C000 }; components new HplSam3PdcP(UART_BASE) as UartPdc; components new HplSam3PdcP(USART0_BASE) as Usart0Pdc; components new HplSam3PdcP(USART1_BASE) as Usart1Pdc; components new HplSam3PdcP(USART2_BASE) as Usart2Pdc; components new HplSam3PdcP(USART3_BASE) as Usart3Pdc; components new HplSam3PdcP(TWI0_BASE) as Twi0Pdc; components new HplSam3PdcP(TWI1_BASE) as Twi1Pdc; components new HplSam3PdcP(PWM_BASE) as PwmPdc; UartPdcControl = UartPdc; Usart0PdcControl = Usart0Pdc; Usart1PdcControl = Usart1Pdc; Usart2PdcControl = Usart2Pdc; Usart3PdcControl = Usart3Pdc; Twi0PdcControl = Twi0Pdc; Twi1PdcControl = Twi1Pdc; PwmPdcControl = PwmPdc; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/pins/000077500000000000000000000000001207233610700215775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/pins/HplSam3uGeneralIOC.nc000066400000000000000000000740301207233610700254120ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * General-purpose I/O abstraction for the SAM3U. * Includes PIO controllers A, B, C with 32 pins each. * * @author Wanja Hofer */ configuration HplSam3uGeneralIOC { provides { interface GeneralIO as PioA0; interface GeneralIO as PioA1; interface GeneralIO as PioA2; interface GeneralIO as PioA3; interface GeneralIO as PioA4; interface GeneralIO as PioA5; interface GeneralIO as PioA6; interface GeneralIO as PioA7; interface GeneralIO as PioA8; interface GeneralIO as PioA9; interface GeneralIO as PioA10; interface GeneralIO as PioA11; interface GeneralIO as PioA12; interface GeneralIO as PioA13; interface GeneralIO as PioA14; interface GeneralIO as PioA15; interface GeneralIO as PioA16; interface GeneralIO as PioA17; interface GeneralIO as PioA18; interface GeneralIO as PioA19; interface GeneralIO as PioA20; interface GeneralIO as PioA21; interface GeneralIO as PioA22; interface GeneralIO as PioA23; interface GeneralIO as PioA24; interface GeneralIO as PioA25; interface GeneralIO as PioA26; interface GeneralIO as PioA27; interface GeneralIO as PioA28; interface GeneralIO as PioA29; interface GeneralIO as PioA30; interface GeneralIO as PioA31; interface GeneralIO as PioB0; interface GeneralIO as PioB1; interface GeneralIO as PioB2; interface GeneralIO as PioB3; interface GeneralIO as PioB4; interface GeneralIO as PioB5; interface GeneralIO as PioB6; interface GeneralIO as PioB7; interface GeneralIO as PioB8; interface GeneralIO as PioB9; interface GeneralIO as PioB10; interface GeneralIO as PioB11; interface GeneralIO as PioB12; interface GeneralIO as PioB13; interface GeneralIO as PioB14; interface GeneralIO as PioB15; interface GeneralIO as PioB16; interface GeneralIO as PioB17; interface GeneralIO as PioB18; interface GeneralIO as PioB19; interface GeneralIO as PioB20; interface GeneralIO as PioB21; interface GeneralIO as PioB22; interface GeneralIO as PioB23; interface GeneralIO as PioB24; interface GeneralIO as PioB25; interface GeneralIO as PioB26; interface GeneralIO as PioB27; interface GeneralIO as PioB28; interface GeneralIO as PioB29; interface GeneralIO as PioB30; interface GeneralIO as PioB31; interface GeneralIO as PioC0; interface GeneralIO as PioC1; interface GeneralIO as PioC2; interface GeneralIO as PioC3; interface GeneralIO as PioC4; interface GeneralIO as PioC5; interface GeneralIO as PioC6; interface GeneralIO as PioC7; interface GeneralIO as PioC8; interface GeneralIO as PioC9; interface GeneralIO as PioC10; interface GeneralIO as PioC11; interface GeneralIO as PioC12; interface GeneralIO as PioC13; interface GeneralIO as PioC14; interface GeneralIO as PioC15; interface GeneralIO as PioC16; interface GeneralIO as PioC17; interface GeneralIO as PioC18; interface GeneralIO as PioC19; interface GeneralIO as PioC20; interface GeneralIO as PioC21; interface GeneralIO as PioC22; interface GeneralIO as PioC23; interface GeneralIO as PioC24; interface GeneralIO as PioC25; interface GeneralIO as PioC26; interface GeneralIO as PioC27; interface GeneralIO as PioC28; interface GeneralIO as PioC29; interface GeneralIO as PioC30; interface GeneralIO as PioC31; interface GpioInterrupt as InterruptPioA0; interface GpioInterrupt as InterruptPioA1; interface GpioInterrupt as InterruptPioA2; interface GpioInterrupt as InterruptPioA3; interface GpioInterrupt as InterruptPioA4; interface GpioInterrupt as InterruptPioA5; interface GpioInterrupt as InterruptPioA6; interface GpioInterrupt as InterruptPioA7; interface GpioInterrupt as InterruptPioA8; interface GpioInterrupt as InterruptPioA9; interface GpioInterrupt as InterruptPioA10; interface GpioInterrupt as InterruptPioA11; interface GpioInterrupt as InterruptPioA12; interface GpioInterrupt as InterruptPioA13; interface GpioInterrupt as InterruptPioA14; interface GpioInterrupt as InterruptPioA15; interface GpioInterrupt as InterruptPioA16; interface GpioInterrupt as InterruptPioA17; interface GpioInterrupt as InterruptPioA18; interface GpioInterrupt as InterruptPioA19; interface GpioInterrupt as InterruptPioA20; interface GpioInterrupt as InterruptPioA21; interface GpioInterrupt as InterruptPioA22; interface GpioInterrupt as InterruptPioA23; interface GpioInterrupt as InterruptPioA24; interface GpioInterrupt as InterruptPioA25; interface GpioInterrupt as InterruptPioA26; interface GpioInterrupt as InterruptPioA27; interface GpioInterrupt as InterruptPioA28; interface GpioInterrupt as InterruptPioA29; interface GpioInterrupt as InterruptPioA30; interface GpioInterrupt as InterruptPioA31; interface GpioInterrupt as InterruptPioB0; interface GpioInterrupt as InterruptPioB1; interface GpioInterrupt as InterruptPioB2; interface GpioInterrupt as InterruptPioB3; interface GpioInterrupt as InterruptPioB4; interface GpioInterrupt as InterruptPioB5; interface GpioInterrupt as InterruptPioB6; interface GpioInterrupt as InterruptPioB7; interface GpioInterrupt as InterruptPioB8; interface GpioInterrupt as InterruptPioB9; interface GpioInterrupt as InterruptPioB10; interface GpioInterrupt as InterruptPioB11; interface GpioInterrupt as InterruptPioB12; interface GpioInterrupt as InterruptPioB13; interface GpioInterrupt as InterruptPioB14; interface GpioInterrupt as InterruptPioB15; interface GpioInterrupt as InterruptPioB16; interface GpioInterrupt as InterruptPioB17; interface GpioInterrupt as InterruptPioB18; interface GpioInterrupt as InterruptPioB19; interface GpioInterrupt as InterruptPioB20; interface GpioInterrupt as InterruptPioB21; interface GpioInterrupt as InterruptPioB22; interface GpioInterrupt as InterruptPioB23; interface GpioInterrupt as InterruptPioB24; interface GpioInterrupt as InterruptPioB25; interface GpioInterrupt as InterruptPioB26; interface GpioInterrupt as InterruptPioB27; interface GpioInterrupt as InterruptPioB28; interface GpioInterrupt as InterruptPioB29; interface GpioInterrupt as InterruptPioB30; interface GpioInterrupt as InterruptPioB31; interface GpioInterrupt as InterruptPioC0; interface GpioInterrupt as InterruptPioC1; interface GpioInterrupt as InterruptPioC2; interface GpioInterrupt as InterruptPioC3; interface GpioInterrupt as InterruptPioC4; interface GpioInterrupt as InterruptPioC5; interface GpioInterrupt as InterruptPioC6; interface GpioInterrupt as InterruptPioC7; interface GpioInterrupt as InterruptPioC8; interface GpioInterrupt as InterruptPioC9; interface GpioInterrupt as InterruptPioC10; interface GpioInterrupt as InterruptPioC11; interface GpioInterrupt as InterruptPioC12; interface GpioInterrupt as InterruptPioC13; interface GpioInterrupt as InterruptPioC14; interface GpioInterrupt as InterruptPioC15; interface GpioInterrupt as InterruptPioC16; interface GpioInterrupt as InterruptPioC17; interface GpioInterrupt as InterruptPioC18; interface GpioInterrupt as InterruptPioC19; interface GpioInterrupt as InterruptPioC20; interface GpioInterrupt as InterruptPioC21; interface GpioInterrupt as InterruptPioC22; interface GpioInterrupt as InterruptPioC23; interface GpioInterrupt as InterruptPioC24; interface GpioInterrupt as InterruptPioC25; interface GpioInterrupt as InterruptPioC26; interface GpioInterrupt as InterruptPioC27; interface GpioInterrupt as InterruptPioC28; interface GpioInterrupt as InterruptPioC29; interface GpioInterrupt as InterruptPioC30; interface GpioInterrupt as InterruptPioC31; interface GpioCapture as CapturePioA0; interface GpioCapture as CapturePioA1; interface GpioCapture as CapturePioA2; interface GpioCapture as CapturePioA3; interface GpioCapture as CapturePioA4; interface GpioCapture as CapturePioA5; interface GpioCapture as CapturePioA6; interface GpioCapture as CapturePioA7; interface GpioCapture as CapturePioA8; interface GpioCapture as CapturePioA9; interface GpioCapture as CapturePioA10; interface GpioCapture as CapturePioA11; interface GpioCapture as CapturePioA12; interface GpioCapture as CapturePioA13; interface GpioCapture as CapturePioA14; interface GpioCapture as CapturePioA15; interface GpioCapture as CapturePioA16; interface GpioCapture as CapturePioA17; interface GpioCapture as CapturePioA18; interface GpioCapture as CapturePioA19; interface GpioCapture as CapturePioA20; interface GpioCapture as CapturePioA21; interface GpioCapture as CapturePioA22; interface GpioCapture as CapturePioA23; interface GpioCapture as CapturePioA24; interface GpioCapture as CapturePioA25; interface GpioCapture as CapturePioA26; interface GpioCapture as CapturePioA27; interface GpioCapture as CapturePioA28; interface GpioCapture as CapturePioA29; interface GpioCapture as CapturePioA30; interface GpioCapture as CapturePioA31; interface GpioCapture as CapturePioB0; interface GpioCapture as CapturePioB1; interface GpioCapture as CapturePioB2; interface GpioCapture as CapturePioB3; interface GpioCapture as CapturePioB4; interface GpioCapture as CapturePioB5; interface GpioCapture as CapturePioB6; interface GpioCapture as CapturePioB7; interface GpioCapture as CapturePioB8; interface GpioCapture as CapturePioB9; interface GpioCapture as CapturePioB10; interface GpioCapture as CapturePioB11; interface GpioCapture as CapturePioB12; interface GpioCapture as CapturePioB13; interface GpioCapture as CapturePioB14; interface GpioCapture as CapturePioB15; interface GpioCapture as CapturePioB16; interface GpioCapture as CapturePioB17; interface GpioCapture as CapturePioB18; interface GpioCapture as CapturePioB19; interface GpioCapture as CapturePioB20; interface GpioCapture as CapturePioB21; interface GpioCapture as CapturePioB22; interface GpioCapture as CapturePioB23; interface GpioCapture as CapturePioB24; interface GpioCapture as CapturePioB25; interface GpioCapture as CapturePioB26; interface GpioCapture as CapturePioB27; interface GpioCapture as CapturePioB28; interface GpioCapture as CapturePioB29; interface GpioCapture as CapturePioB30; interface GpioCapture as CapturePioB31; interface GpioCapture as CapturePioC0; interface GpioCapture as CapturePioC1; interface GpioCapture as CapturePioC2; interface GpioCapture as CapturePioC3; interface GpioCapture as CapturePioC4; interface GpioCapture as CapturePioC5; interface GpioCapture as CapturePioC6; interface GpioCapture as CapturePioC7; interface GpioCapture as CapturePioC8; interface GpioCapture as CapturePioC9; interface GpioCapture as CapturePioC10; interface GpioCapture as CapturePioC11; interface GpioCapture as CapturePioC12; interface GpioCapture as CapturePioC13; interface GpioCapture as CapturePioC14; interface GpioCapture as CapturePioC15; interface GpioCapture as CapturePioC16; interface GpioCapture as CapturePioC17; interface GpioCapture as CapturePioC18; interface GpioCapture as CapturePioC19; interface GpioCapture as CapturePioC20; interface GpioCapture as CapturePioC21; interface GpioCapture as CapturePioC22; interface GpioCapture as CapturePioC23; interface GpioCapture as CapturePioC24; interface GpioCapture as CapturePioC25; interface GpioCapture as CapturePioC26; interface GpioCapture as CapturePioC27; interface GpioCapture as CapturePioC28; interface GpioCapture as CapturePioC29; interface GpioCapture as CapturePioC30; interface GpioCapture as CapturePioC31; interface HplSam3GeneralIOPin as HplPioA0; interface HplSam3GeneralIOPin as HplPioA1; interface HplSam3GeneralIOPin as HplPioA2; interface HplSam3GeneralIOPin as HplPioA3; interface HplSam3GeneralIOPin as HplPioA4; interface HplSam3GeneralIOPin as HplPioA5; interface HplSam3GeneralIOPin as HplPioA6; interface HplSam3GeneralIOPin as HplPioA7; interface HplSam3GeneralIOPin as HplPioA8; interface HplSam3GeneralIOPin as HplPioA9; interface HplSam3GeneralIOPin as HplPioA10; interface HplSam3GeneralIOPin as HplPioA11; interface HplSam3GeneralIOPin as HplPioA12; interface HplSam3GeneralIOPin as HplPioA13; interface HplSam3GeneralIOPin as HplPioA14; interface HplSam3GeneralIOPin as HplPioA15; interface HplSam3GeneralIOPin as HplPioA16; interface HplSam3GeneralIOPin as HplPioA17; interface HplSam3GeneralIOPin as HplPioA18; interface HplSam3GeneralIOPin as HplPioA19; interface HplSam3GeneralIOPin as HplPioA20; interface HplSam3GeneralIOPin as HplPioA21; interface HplSam3GeneralIOPin as HplPioA22; interface HplSam3GeneralIOPin as HplPioA23; interface HplSam3GeneralIOPin as HplPioA24; interface HplSam3GeneralIOPin as HplPioA25; interface HplSam3GeneralIOPin as HplPioA26; interface HplSam3GeneralIOPin as HplPioA27; interface HplSam3GeneralIOPin as HplPioA28; interface HplSam3GeneralIOPin as HplPioA29; interface HplSam3GeneralIOPin as HplPioA30; interface HplSam3GeneralIOPin as HplPioA31; interface HplSam3GeneralIOPin as HplPioB0; interface HplSam3GeneralIOPin as HplPioB1; interface HplSam3GeneralIOPin as HplPioB2; interface HplSam3GeneralIOPin as HplPioB3; interface HplSam3GeneralIOPin as HplPioB4; interface HplSam3GeneralIOPin as HplPioB5; interface HplSam3GeneralIOPin as HplPioB6; interface HplSam3GeneralIOPin as HplPioB7; interface HplSam3GeneralIOPin as HplPioB8; interface HplSam3GeneralIOPin as HplPioB9; interface HplSam3GeneralIOPin as HplPioB10; interface HplSam3GeneralIOPin as HplPioB11; interface HplSam3GeneralIOPin as HplPioB12; interface HplSam3GeneralIOPin as HplPioB13; interface HplSam3GeneralIOPin as HplPioB14; interface HplSam3GeneralIOPin as HplPioB15; interface HplSam3GeneralIOPin as HplPioB16; interface HplSam3GeneralIOPin as HplPioB17; interface HplSam3GeneralIOPin as HplPioB18; interface HplSam3GeneralIOPin as HplPioB19; interface HplSam3GeneralIOPin as HplPioB20; interface HplSam3GeneralIOPin as HplPioB21; interface HplSam3GeneralIOPin as HplPioB22; interface HplSam3GeneralIOPin as HplPioB23; interface HplSam3GeneralIOPin as HplPioB24; interface HplSam3GeneralIOPin as HplPioB25; interface HplSam3GeneralIOPin as HplPioB26; interface HplSam3GeneralIOPin as HplPioB27; interface HplSam3GeneralIOPin as HplPioB28; interface HplSam3GeneralIOPin as HplPioB29; interface HplSam3GeneralIOPin as HplPioB30; interface HplSam3GeneralIOPin as HplPioB31; interface HplSam3GeneralIOPin as HplPioC0; interface HplSam3GeneralIOPin as HplPioC1; interface HplSam3GeneralIOPin as HplPioC2; interface HplSam3GeneralIOPin as HplPioC3; interface HplSam3GeneralIOPin as HplPioC4; interface HplSam3GeneralIOPin as HplPioC5; interface HplSam3GeneralIOPin as HplPioC6; interface HplSam3GeneralIOPin as HplPioC7; interface HplSam3GeneralIOPin as HplPioC8; interface HplSam3GeneralIOPin as HplPioC9; interface HplSam3GeneralIOPin as HplPioC10; interface HplSam3GeneralIOPin as HplPioC11; interface HplSam3GeneralIOPin as HplPioC12; interface HplSam3GeneralIOPin as HplPioC13; interface HplSam3GeneralIOPin as HplPioC14; interface HplSam3GeneralIOPin as HplPioC15; interface HplSam3GeneralIOPin as HplPioC16; interface HplSam3GeneralIOPin as HplPioC17; interface HplSam3GeneralIOPin as HplPioC18; interface HplSam3GeneralIOPin as HplPioC19; interface HplSam3GeneralIOPin as HplPioC20; interface HplSam3GeneralIOPin as HplPioC21; interface HplSam3GeneralIOPin as HplPioC22; interface HplSam3GeneralIOPin as HplPioC23; interface HplSam3GeneralIOPin as HplPioC24; interface HplSam3GeneralIOPin as HplPioC25; interface HplSam3GeneralIOPin as HplPioC26; interface HplSam3GeneralIOPin as HplPioC27; interface HplSam3GeneralIOPin as HplPioC28; interface HplSam3GeneralIOPin as HplPioC29; interface HplSam3GeneralIOPin as HplPioC30; interface HplSam3GeneralIOPin as HplPioC31; } } implementation { components new HplSam3GeneralIOPioC(0x400e0c00) as PioA, new HplSam3GeneralIOPioC(0x400e0e00) as PioB, new HplSam3GeneralIOPioC(0x400e1000) as PioC; components HplSam3GeneralIOP; PioA.HplPort -> HplSam3GeneralIOP.HplPortA; PioB.HplPort -> HplSam3GeneralIOP.HplPortB; PioC.HplPort -> HplSam3GeneralIOP.HplPortC; components McuSleepC; HplSam3GeneralIOP.PioAInterruptWrapper -> McuSleepC; HplSam3GeneralIOP.PioBInterruptWrapper -> McuSleepC; HplSam3GeneralIOP.PioCInterruptWrapper -> McuSleepC; components HplNVICC, HplSam3uClockC; PioA.PIOIrqControl -> HplNVICC.PIOAInterrupt; PioA.PIOClockControl -> HplSam3uClockC.PIOAPPCntl; PioB.PIOIrqControl -> HplNVICC.PIOBInterrupt; PioB.PIOClockControl -> HplSam3uClockC.PIOBPPCntl; PioC.PIOIrqControl -> HplNVICC.PIOCInterrupt; PioC.PIOClockControl -> HplSam3uClockC.PIOCPPCntl; PioA0 = PioA.Pin0; PioA1 = PioA.Pin1; PioA2 = PioA.Pin2; PioA3 = PioA.Pin3; PioA4 = PioA.Pin4; PioA5 = PioA.Pin5; PioA6 = PioA.Pin6; PioA7 = PioA.Pin7; PioA8 = PioA.Pin8; PioA9 = PioA.Pin9; PioA10 = PioA.Pin10; PioA11 = PioA.Pin11; PioA12 = PioA.Pin12; PioA13 = PioA.Pin13; PioA14 = PioA.Pin14; PioA15 = PioA.Pin15; PioA16 = PioA.Pin16; PioA17 = PioA.Pin17; PioA18 = PioA.Pin18; PioA19 = PioA.Pin19; PioA20 = PioA.Pin20; PioA21 = PioA.Pin21; PioA22 = PioA.Pin22; PioA23 = PioA.Pin23; PioA24 = PioA.Pin24; PioA25 = PioA.Pin25; PioA26 = PioA.Pin26; PioA27 = PioA.Pin27; PioA28 = PioA.Pin28; PioA29 = PioA.Pin29; PioA30 = PioA.Pin30; PioA31 = PioA.Pin31; PioB0 = PioB.Pin0; PioB1 = PioB.Pin1; PioB2 = PioB.Pin2; PioB3 = PioB.Pin3; PioB4 = PioB.Pin4; PioB5 = PioB.Pin5; PioB6 = PioB.Pin6; PioB7 = PioB.Pin7; PioB8 = PioB.Pin8; PioB9 = PioB.Pin9; PioB10 = PioB.Pin10; PioB11 = PioB.Pin11; PioB12 = PioB.Pin12; PioB13 = PioB.Pin13; PioB14 = PioB.Pin14; PioB15 = PioB.Pin15; PioB16 = PioB.Pin16; PioB17 = PioB.Pin17; PioB18 = PioB.Pin18; PioB19 = PioB.Pin19; PioB20 = PioB.Pin20; PioB21 = PioB.Pin21; PioB22 = PioB.Pin22; PioB23 = PioB.Pin23; PioB24 = PioB.Pin24; PioB25 = PioB.Pin25; PioB26 = PioB.Pin26; PioB27 = PioB.Pin27; PioB28 = PioB.Pin28; PioB29 = PioB.Pin29; PioB30 = PioB.Pin30; PioB31 = PioB.Pin31; PioC0 = PioC.Pin0; PioC1 = PioC.Pin1; PioC2 = PioC.Pin2; PioC3 = PioC.Pin3; PioC4 = PioC.Pin4; PioC5 = PioC.Pin5; PioC6 = PioC.Pin6; PioC7 = PioC.Pin7; PioC8 = PioC.Pin8; PioC9 = PioC.Pin9; PioC10 = PioC.Pin10; PioC11 = PioC.Pin11; PioC12 = PioC.Pin12; PioC13 = PioC.Pin13; PioC14 = PioC.Pin14; PioC15 = PioC.Pin15; PioC16 = PioC.Pin16; PioC17 = PioC.Pin17; PioC18 = PioC.Pin18; PioC19 = PioC.Pin19; PioC20 = PioC.Pin20; PioC21 = PioC.Pin21; PioC22 = PioC.Pin22; PioC23 = PioC.Pin23; PioC24 = PioC.Pin24; PioC25 = PioC.Pin25; PioC26 = PioC.Pin26; PioC27 = PioC.Pin27; PioC28 = PioC.Pin28; PioC29 = PioC.Pin29; PioC30 = PioC.Pin30; PioC31 = PioC.Pin31; InterruptPioA0 = PioA.InterruptPin0; InterruptPioA1 = PioA.InterruptPin1; InterruptPioA2 = PioA.InterruptPin2; InterruptPioA3 = PioA.InterruptPin3; InterruptPioA4 = PioA.InterruptPin4; InterruptPioA5 = PioA.InterruptPin5; InterruptPioA6 = PioA.InterruptPin6; InterruptPioA7 = PioA.InterruptPin7; InterruptPioA8 = PioA.InterruptPin8; InterruptPioA9 = PioA.InterruptPin9; InterruptPioA10 = PioA.InterruptPin10; InterruptPioA11 = PioA.InterruptPin11; InterruptPioA12 = PioA.InterruptPin12; InterruptPioA13 = PioA.InterruptPin13; InterruptPioA14 = PioA.InterruptPin14; InterruptPioA15 = PioA.InterruptPin15; InterruptPioA16 = PioA.InterruptPin16; InterruptPioA17 = PioA.InterruptPin17; InterruptPioA18 = PioA.InterruptPin18; InterruptPioA19 = PioA.InterruptPin19; InterruptPioA20 = PioA.InterruptPin20; InterruptPioA21 = PioA.InterruptPin21; InterruptPioA22 = PioA.InterruptPin22; InterruptPioA23 = PioA.InterruptPin23; InterruptPioA24 = PioA.InterruptPin24; InterruptPioA25 = PioA.InterruptPin25; InterruptPioA26 = PioA.InterruptPin26; InterruptPioA27 = PioA.InterruptPin27; InterruptPioA28 = PioA.InterruptPin28; InterruptPioA29 = PioA.InterruptPin29; InterruptPioA30 = PioA.InterruptPin30; InterruptPioA31 = PioA.InterruptPin31; InterruptPioB0 = PioB.InterruptPin0; InterruptPioB1 = PioB.InterruptPin1; InterruptPioB2 = PioB.InterruptPin2; InterruptPioB3 = PioB.InterruptPin3; InterruptPioB4 = PioB.InterruptPin4; InterruptPioB5 = PioB.InterruptPin5; InterruptPioB6 = PioB.InterruptPin6; InterruptPioB7 = PioB.InterruptPin7; InterruptPioB8 = PioB.InterruptPin8; InterruptPioB9 = PioB.InterruptPin9; InterruptPioB10 = PioB.InterruptPin10; InterruptPioB11 = PioB.InterruptPin11; InterruptPioB12 = PioB.InterruptPin12; InterruptPioB13 = PioB.InterruptPin13; InterruptPioB14 = PioB.InterruptPin14; InterruptPioB15 = PioB.InterruptPin15; InterruptPioB16 = PioB.InterruptPin16; InterruptPioB17 = PioB.InterruptPin17; InterruptPioB18 = PioB.InterruptPin18; InterruptPioB19 = PioB.InterruptPin19; InterruptPioB20 = PioB.InterruptPin20; InterruptPioB21 = PioB.InterruptPin21; InterruptPioB22 = PioB.InterruptPin22; InterruptPioB23 = PioB.InterruptPin23; InterruptPioB24 = PioB.InterruptPin24; InterruptPioB25 = PioB.InterruptPin25; InterruptPioB26 = PioB.InterruptPin26; InterruptPioB27 = PioB.InterruptPin27; InterruptPioB28 = PioB.InterruptPin28; InterruptPioB29 = PioB.InterruptPin29; InterruptPioB30 = PioB.InterruptPin30; InterruptPioB31 = PioB.InterruptPin31; InterruptPioC0 = PioC.InterruptPin0; InterruptPioC1 = PioC.InterruptPin1; InterruptPioC2 = PioC.InterruptPin2; InterruptPioC3 = PioC.InterruptPin3; InterruptPioC4 = PioC.InterruptPin4; InterruptPioC5 = PioC.InterruptPin5; InterruptPioC6 = PioC.InterruptPin6; InterruptPioC7 = PioC.InterruptPin7; InterruptPioC8 = PioC.InterruptPin8; InterruptPioC9 = PioC.InterruptPin9; InterruptPioC10 = PioC.InterruptPin10; InterruptPioC11 = PioC.InterruptPin11; InterruptPioC12 = PioC.InterruptPin12; InterruptPioC13 = PioC.InterruptPin13; InterruptPioC14 = PioC.InterruptPin14; InterruptPioC15 = PioC.InterruptPin15; InterruptPioC16 = PioC.InterruptPin16; InterruptPioC17 = PioC.InterruptPin17; InterruptPioC18 = PioC.InterruptPin18; InterruptPioC19 = PioC.InterruptPin19; InterruptPioC20 = PioC.InterruptPin20; InterruptPioC21 = PioC.InterruptPin21; InterruptPioC22 = PioC.InterruptPin22; InterruptPioC23 = PioC.InterruptPin23; InterruptPioC24 = PioC.InterruptPin24; InterruptPioC25 = PioC.InterruptPin25; InterruptPioC26 = PioC.InterruptPin26; InterruptPioC27 = PioC.InterruptPin27; InterruptPioC28 = PioC.InterruptPin28; InterruptPioC29 = PioC.InterruptPin29; InterruptPioC30 = PioC.InterruptPin30; InterruptPioC31 = PioC.InterruptPin31; CapturePioA0 = PioA.CapturePin0; CapturePioA1 = PioA.CapturePin1; CapturePioA2 = PioA.CapturePin2; CapturePioA3 = PioA.CapturePin3; CapturePioA4 = PioA.CapturePin4; CapturePioA5 = PioA.CapturePin5; CapturePioA6 = PioA.CapturePin6; CapturePioA7 = PioA.CapturePin7; CapturePioA8 = PioA.CapturePin8; CapturePioA9 = PioA.CapturePin9; CapturePioA10 = PioA.CapturePin10; CapturePioA11 = PioA.CapturePin11; CapturePioA12 = PioA.CapturePin12; CapturePioA13 = PioA.CapturePin13; CapturePioA14 = PioA.CapturePin14; CapturePioA15 = PioA.CapturePin15; CapturePioA16 = PioA.CapturePin16; CapturePioA17 = PioA.CapturePin17; CapturePioA18 = PioA.CapturePin18; CapturePioA19 = PioA.CapturePin19; CapturePioA20 = PioA.CapturePin20; CapturePioA21 = PioA.CapturePin21; CapturePioA22 = PioA.CapturePin22; CapturePioA23 = PioA.CapturePin23; CapturePioA24 = PioA.CapturePin24; CapturePioA25 = PioA.CapturePin25; CapturePioA26 = PioA.CapturePin26; CapturePioA27 = PioA.CapturePin27; CapturePioA28 = PioA.CapturePin28; CapturePioA29 = PioA.CapturePin29; CapturePioA30 = PioA.CapturePin30; CapturePioA31 = PioA.CapturePin31; CapturePioB0 = PioB.CapturePin0; CapturePioB1 = PioB.CapturePin1; CapturePioB2 = PioB.CapturePin2; CapturePioB3 = PioB.CapturePin3; CapturePioB4 = PioB.CapturePin4; CapturePioB5 = PioB.CapturePin5; CapturePioB6 = PioB.CapturePin6; CapturePioB7 = PioB.CapturePin7; CapturePioB8 = PioB.CapturePin8; CapturePioB9 = PioB.CapturePin9; CapturePioB10 = PioB.CapturePin10; CapturePioB11 = PioB.CapturePin11; CapturePioB12 = PioB.CapturePin12; CapturePioB13 = PioB.CapturePin13; CapturePioB14 = PioB.CapturePin14; CapturePioB15 = PioB.CapturePin15; CapturePioB16 = PioB.CapturePin16; CapturePioB17 = PioB.CapturePin17; CapturePioB18 = PioB.CapturePin18; CapturePioB19 = PioB.CapturePin19; CapturePioB20 = PioB.CapturePin20; CapturePioB21 = PioB.CapturePin21; CapturePioB22 = PioB.CapturePin22; CapturePioB23 = PioB.CapturePin23; CapturePioB24 = PioB.CapturePin24; CapturePioB25 = PioB.CapturePin25; CapturePioB26 = PioB.CapturePin26; CapturePioB27 = PioB.CapturePin27; CapturePioB28 = PioB.CapturePin28; CapturePioB29 = PioB.CapturePin29; CapturePioB30 = PioB.CapturePin30; CapturePioB31 = PioB.CapturePin31; CapturePioC0 = PioC.CapturePin0; CapturePioC1 = PioC.CapturePin1; CapturePioC2 = PioC.CapturePin2; CapturePioC3 = PioC.CapturePin3; CapturePioC4 = PioC.CapturePin4; CapturePioC5 = PioC.CapturePin5; CapturePioC6 = PioC.CapturePin6; CapturePioC7 = PioC.CapturePin7; CapturePioC8 = PioC.CapturePin8; CapturePioC9 = PioC.CapturePin9; CapturePioC10 = PioC.CapturePin10; CapturePioC11 = PioC.CapturePin11; CapturePioC12 = PioC.CapturePin12; CapturePioC13 = PioC.CapturePin13; CapturePioC14 = PioC.CapturePin14; CapturePioC15 = PioC.CapturePin15; CapturePioC16 = PioC.CapturePin16; CapturePioC17 = PioC.CapturePin17; CapturePioC18 = PioC.CapturePin18; CapturePioC19 = PioC.CapturePin19; CapturePioC20 = PioC.CapturePin20; CapturePioC21 = PioC.CapturePin21; CapturePioC22 = PioC.CapturePin22; CapturePioC23 = PioC.CapturePin23; CapturePioC24 = PioC.CapturePin24; CapturePioC25 = PioC.CapturePin25; CapturePioC26 = PioC.CapturePin26; CapturePioC27 = PioC.CapturePin27; CapturePioC28 = PioC.CapturePin28; CapturePioC29 = PioC.CapturePin29; CapturePioC30 = PioC.CapturePin30; CapturePioC31 = PioC.CapturePin31; HplPioA0 = PioA.HplPin0; HplPioA1 = PioA.HplPin1; HplPioA2 = PioA.HplPin2; HplPioA3 = PioA.HplPin3; HplPioA4 = PioA.HplPin4; HplPioA5 = PioA.HplPin5; HplPioA6 = PioA.HplPin6; HplPioA7 = PioA.HplPin7; HplPioA8 = PioA.HplPin8; HplPioA9 = PioA.HplPin9; HplPioA10 = PioA.HplPin10; HplPioA11 = PioA.HplPin11; HplPioA12 = PioA.HplPin12; HplPioA13 = PioA.HplPin13; HplPioA14 = PioA.HplPin14; HplPioA15 = PioA.HplPin15; HplPioA16 = PioA.HplPin16; HplPioA17 = PioA.HplPin17; HplPioA18 = PioA.HplPin18; HplPioA19 = PioA.HplPin19; HplPioA20 = PioA.HplPin20; HplPioA21 = PioA.HplPin21; HplPioA22 = PioA.HplPin22; HplPioA23 = PioA.HplPin23; HplPioA24 = PioA.HplPin24; HplPioA25 = PioA.HplPin25; HplPioA26 = PioA.HplPin26; HplPioA27 = PioA.HplPin27; HplPioA28 = PioA.HplPin28; HplPioA29 = PioA.HplPin29; HplPioA30 = PioA.HplPin30; HplPioA31 = PioA.HplPin31; HplPioB0 = PioB.HplPin0; HplPioB1 = PioB.HplPin1; HplPioB2 = PioB.HplPin2; HplPioB3 = PioB.HplPin3; HplPioB4 = PioB.HplPin4; HplPioB5 = PioB.HplPin5; HplPioB6 = PioB.HplPin6; HplPioB7 = PioB.HplPin7; HplPioB8 = PioB.HplPin8; HplPioB9 = PioB.HplPin9; HplPioB10 = PioB.HplPin10; HplPioB11 = PioB.HplPin11; HplPioB12 = PioB.HplPin12; HplPioB13 = PioB.HplPin13; HplPioB14 = PioB.HplPin14; HplPioB15 = PioB.HplPin15; HplPioB16 = PioB.HplPin16; HplPioB17 = PioB.HplPin17; HplPioB18 = PioB.HplPin18; HplPioB19 = PioB.HplPin19; HplPioB20 = PioB.HplPin20; HplPioB21 = PioB.HplPin21; HplPioB22 = PioB.HplPin22; HplPioB23 = PioB.HplPin23; HplPioB24 = PioB.HplPin24; HplPioB25 = PioB.HplPin25; HplPioB26 = PioB.HplPin26; HplPioB27 = PioB.HplPin27; HplPioB28 = PioB.HplPin28; HplPioB29 = PioB.HplPin29; HplPioB30 = PioB.HplPin30; HplPioB31 = PioB.HplPin31; HplPioC0 = PioC.HplPin0; HplPioC1 = PioC.HplPin1; HplPioC2 = PioC.HplPin2; HplPioC3 = PioC.HplPin3; HplPioC4 = PioC.HplPin4; HplPioC5 = PioC.HplPin5; HplPioC6 = PioC.HplPin6; HplPioC7 = PioC.HplPin7; HplPioC8 = PioC.HplPin8; HplPioC9 = PioC.HplPin9; HplPioC10 = PioC.HplPin10; HplPioC11 = PioC.HplPin11; HplPioC12 = PioC.HplPin12; HplPioC13 = PioC.HplPin13; HplPioC14 = PioC.HplPin14; HplPioC15 = PioC.HplPin15; HplPioC16 = PioC.HplPin16; HplPioC17 = PioC.HplPin17; HplPioC18 = PioC.HplPin18; HplPioC19 = PioC.HplPin19; HplPioC20 = PioC.HplPin20; HplPioC21 = PioC.HplPin21; HplPioC22 = PioC.HplPin22; HplPioC23 = PioC.HplPin23; HplPioC24 = PioC.HplPin24; HplPioC25 = PioC.HplPin25; HplPioC26 = PioC.HplPin26; HplPioC27 = PioC.HplPin27; HplPioC28 = PioC.HplPin28; HplPioC29 = PioC.HplPin29; HplPioC30 = PioC.HplPin30; HplPioC31 = PioC.HplPin31; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/pmc/000077500000000000000000000000001207233610700214055ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/pmc/HplSam3uClockC.nc000066400000000000000000000152551207233610700244520ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * This is the main configuration for the low-layer clock module. * * @author Thomas Schmid */ configuration HplSam3uClockC { provides { interface HplSam3Clock; interface HplSam3PeripheralClockCntl as RTCPCCntl ; interface HplSam3PeripheralClockCntl as RTTPPCntl ; interface HplSam3PeripheralClockCntl as WDGPPCntl ; interface HplSam3PeripheralClockCntl as PMCPPCntl ; interface HplSam3PeripheralClockCntl as EFC0PPCntl ; interface HplSam3PeripheralClockCntl as EFC1PPCntl ; interface HplSam3PeripheralClockCntl as DBGUPPCntl ; interface HplSam3PeripheralClockCntl as HSMC4PPCntl ; interface HplSam3PeripheralClockCntl as PIOAPPCntl ; interface HplSam3PeripheralClockCntl as PIOBPPCntl ; interface HplSam3PeripheralClockCntl as PIOCPPCntl ; interface HplSam3PeripheralClockCntl as US0PPCntl ; interface HplSam3PeripheralClockCntl as US1PPCntl ; interface HplSam3PeripheralClockCntl as US2PPCntl ; interface HplSam3PeripheralClockCntl as US3PPCntl ; interface HplSam3PeripheralClockCntl as MCI0PPCntl ; interface HplSam3PeripheralClockCntl as TWI0PPCntl ; interface HplSam3PeripheralClockCntl as TWI1PPCntl ; interface HplSam3PeripheralClockCntl as SPI0PPCntl ; interface HplSam3PeripheralClockCntl as SSC0PPCntl ; interface HplSam3PeripheralClockCntl as TC0PPCntl ; interface HplSam3PeripheralClockCntl as TC1PPCntl ; interface HplSam3PeripheralClockCntl as TC2PPCntl ; interface HplSam3PeripheralClockCntl as PWMCPPCntl ; interface HplSam3PeripheralClockCntl as ADC12BPPCntl; interface HplSam3PeripheralClockCntl as ADCPPCntl ; interface HplSam3PeripheralClockCntl as HDMAPPCntl ; interface HplSam3PeripheralClockCntl as UDPHSPPCntl ; } } implementation { #define PMC_PC_BASE 0x400e0410 components HplSam3uClockP, new HplSam3PeripheralClockP(AT91C_ID_RTC ,PMC_PC_BASE ) as RTC, new HplSam3PeripheralClockP(AT91C_ID_RTT ,PMC_PC_BASE ) as RTT, new HplSam3PeripheralClockP(AT91C_ID_WDG ,PMC_PC_BASE ) as WDG, new HplSam3PeripheralClockP(AT91C_ID_PMC ,PMC_PC_BASE ) as PMC, new HplSam3PeripheralClockP(AT91C_ID_EFC0 ,PMC_PC_BASE ) as EFC0, new HplSam3PeripheralClockP(AT91C_ID_EFC1 ,PMC_PC_BASE ) as EFC1, new HplSam3PeripheralClockP(AT91C_ID_DBGU ,PMC_PC_BASE ) as DBGU, new HplSam3PeripheralClockP(AT91C_ID_HSMC4 ,PMC_PC_BASE ) as HSMC4, new HplSam3PeripheralClockP(AT91C_ID_PIOA ,PMC_PC_BASE ) as PIOA, new HplSam3PeripheralClockP(AT91C_ID_PIOB ,PMC_PC_BASE ) as PIOB, new HplSam3PeripheralClockP(AT91C_ID_PIOC ,PMC_PC_BASE ) as PIOC, new HplSam3PeripheralClockP(AT91C_ID_US0 ,PMC_PC_BASE ) as US0, new HplSam3PeripheralClockP(AT91C_ID_US1 ,PMC_PC_BASE ) as US1, new HplSam3PeripheralClockP(AT91C_ID_US2 ,PMC_PC_BASE ) as US2, new HplSam3PeripheralClockP(AT91C_ID_US3 ,PMC_PC_BASE ) as US3, new HplSam3PeripheralClockP(AT91C_ID_MCI0 ,PMC_PC_BASE ) as MCI0, new HplSam3PeripheralClockP(AT91C_ID_TWI0 ,PMC_PC_BASE ) as TWI0, new HplSam3PeripheralClockP(AT91C_ID_TWI1 ,PMC_PC_BASE ) as TWI1, new HplSam3PeripheralClockP(AT91C_ID_SPI0 ,PMC_PC_BASE ) as SPI0, new HplSam3PeripheralClockP(AT91C_ID_SSC0 ,PMC_PC_BASE ) as SSC0, new HplSam3PeripheralClockP(AT91C_ID_TC0 ,PMC_PC_BASE ) as TC0, new HplSam3PeripheralClockP(AT91C_ID_TC1 ,PMC_PC_BASE ) as TC1, new HplSam3PeripheralClockP(AT91C_ID_TC2 ,PMC_PC_BASE ) as TC2, new HplSam3PeripheralClockP(AT91C_ID_PWMC ,PMC_PC_BASE ) as PWMC, new HplSam3PeripheralClockP(AT91C_ID_ADC12B,PMC_PC_BASE ) as ADC12B, new HplSam3PeripheralClockP(AT91C_ID_ADC ,PMC_PC_BASE ) as ADC, new HplSam3PeripheralClockP(AT91C_ID_HDMA ,PMC_PC_BASE ) as HDMA, new HplSam3PeripheralClockP(AT91C_ID_UDPHS ,PMC_PC_BASE ) as UDPHS; HplSam3Clock = HplSam3uClockP; RTCPCCntl = RTC.Cntl; RTTPPCntl = RTT.Cntl; WDGPPCntl = WDG.Cntl; PMCPPCntl = PMC.Cntl; EFC0PPCntl = EFC0.Cntl; EFC1PPCntl = EFC1.Cntl; DBGUPPCntl = DBGU.Cntl; HSMC4PPCntl = HSMC4.Cntl; PIOAPPCntl = PIOA.Cntl; PIOBPPCntl = PIOB.Cntl; PIOCPPCntl = PIOC.Cntl; US0PPCntl = US0.Cntl; US1PPCntl = US1.Cntl; US2PPCntl = US2.Cntl; US3PPCntl = US3.Cntl; MCI0PPCntl = MCI0.Cntl; TWI0PPCntl = TWI0.Cntl; TWI1PPCntl = TWI1.Cntl; SPI0PPCntl = SPI0.Cntl; SSC0PPCntl = SSC0.Cntl; TC0PPCntl = TC0.Cntl; TC1PPCntl = TC1.Cntl; TC2PPCntl = TC2.Cntl; PWMCPPCntl = PWMC.Cntl; ADC12BPPCntl= ADC12B.Cntl; ADCPPCntl = ADC.Cntl; HDMAPPCntl = HDMA.Cntl; UDPHSPPCntl = UDPHS.Cntl; components McuSleepC; McuSleepC.HplSam3Clock -> HplSam3uClockP; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/pmc/HplSam3uClockP.nc000066400000000000000000000205001207233610700244540ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * This is a low-level clock component controlling the different clock * systems. * * @author Thomas Schmid * @author Kevin Klues */ #include "sam3upmchardware.h" #include "sam3usupchardware.h" #define CLOCK_TIMEOUT 0xFFFFFFFF module HplSam3uClockP { provides { interface HplSam3Clock; } } implementation { async command error_t HplSam3Clock.slckExternalOsc() { uint32_t timeout = 0; if(SUPC->sr.bits.oscsel == 0) { supc_cr_t cr; cr.flat = 0; // assure it is all zero! cr.bits.xtalsel = 1; cr.bits.key = SUPC_CR_KEY; SUPC->cr = cr; timeout = 0; while (!(SUPC->sr.bits.oscsel) && (timeout++ < CLOCK_TIMEOUT)); } return SUCCESS; } async command error_t HplSam3Clock.slckRCOsc() { uint32_t timeout = 0; if(SUPC->sr.bits.oscsel == 1) { supc_cr_t cr; cr.flat = 0; // assure it is all zero! cr.bits.xtalsel = 0; cr.bits.key = SUPC_CR_KEY; SUPC->cr = cr; timeout = 0; while (!(SUPC->sr.bits.oscsel) && (timeout++ < CLOCK_TIMEOUT)); } return SUCCESS; } inline error_t mckInit(uint8_t speed) { pmc_mor_t mor; pmc_mckr_t mckr; pmc_pllar_t pllar; uint32_t timeout = 0; if(speed == 48) speed = 3; else if(speed == 84) speed = 6; else if(speed == 96) speed = 7; else return FAIL; // Check if MCK source is RC or XT if(PMC->mor.bits.moscsel == 0) { // it is RC, turn on XT mor.flat = 0; // make sure it is zreoed out mor.bits.key = PMC_MOR_KEY; mor.bits.moscxtst = 0x07;//0x3F; // main oscillator startup time mor.bits.moscrcen = 1; // enable the on-chip rc oscillator mor.bits.moscxten = 1; // main crystal oscillator enable PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscxts) && (timeout++ < CLOCK_TIMEOUT)); } // Switch to XT mor.flat = 0; // make sure it is zeroed mor.bits.key = PMC_MOR_KEY; mor.bits.moscxtst = 0x07;//0x3F; mor.bits.moscrcen = 1; mor.bits.moscxten = 1; mor.bits.moscsel = 1; PMC->mor = mor; //timeout = 0; //while (!(PMC->sr.bits.moscsels) && (timeout++ < CLOCK_TIMEOUT)); mckr = PMC->mckr; mckr.bits.css = PMC_MCKR_CSS_MAIN_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); // Initialize PLLA pllar.flat = 0; // make sure it is zeroed out pllar.bits.bit29 = 1; // we always have to do this! pllar.bits.mula = speed; // multiplication is MULA+1 => 12x(speed+1) pllar.bits.pllacount = 0x3F; pllar.bits.diva = 0x1; // divider is bypassed //pllar.bits.stmode = PMC_PLLAR_STMODE_FAST_STARTUP; PMC->pllar = pllar; timeout = 0; while (!(PMC->sr.bits.locka) && (timeout++ < CLOCK_TIMEOUT)); // Switch to fast clock mckr.bits.css = PMC_MCKR_CSS_MAIN_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); mckr.bits.pres = PMC_MCKR_PRES_DIV_1; mckr.bits.css = PMC_MCKR_CSS_PLLA_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); signal HplSam3Clock.mainClockChanged(); return SUCCESS; } async command error_t HplSam3Clock.mckInit48() { return mckInit(48); } async command error_t HplSam3Clock.mckInit84() { return mckInit(84); } async command error_t HplSam3Clock.mckInit96() { return mckInit(96); } inline error_t mckInitRC(uint8_t speed) { pmc_mor_t mor; pmc_mckr_t mckr; pmc_pllar_t pllar; uint32_t timeout = 0; if(speed == 4) speed = 0; else if(speed == 8) speed = 1; else if(speed == 12) speed = 2; else return FAIL; // Check if MCK source is RC or XT if(PMC->mor.bits.moscsel == 1) { // it is XT, turn on RC mor.flat = 0; // make sure it is zreoed out mor.bits.key = PMC_MOR_KEY; mor.bits.moscrcf = speed; // select proper MHz RC mor.bits.moscrcen = 1; // enable the on-chip rc oscillator mor.bits.moscxten = 1; // main crystal oscillator enable PMC->mor = mor; timeout = 0; while (!(PMC->sr.bits.moscrcs) && (timeout++ < CLOCK_TIMEOUT)); } // Switch to RC mor.flat = 0; // make sure it is zeroed mor.bits.key = PMC_MOR_KEY; mor.bits.moscrcf = 3; // select 12 MHz RC mor.bits.moscrcen = 1; mor.bits.moscxten = 1; mor.bits.moscsel = 0; PMC->mor = mor; //timeout = 0; //while (!(PMC->sr.bits.moscsels) && (timeout++ < CLOCK_TIMEOUT)); mckr = PMC->mckr; mckr.bits.pres = PMC_MCKR_PRES_DIV_1; mckr.bits.css = PMC_MCKR_CSS_MAIN_CLOCK; PMC->mckr = mckr; timeout = 0; while (!(PMC->sr.bits.mckrdy) && (timeout++ < CLOCK_TIMEOUT)); // turn off external clock mor.bits.moscxten = 0; PMC->mor = mor; // Turn off PLL pllar.flat = 0; // make sure it is zeroed out pllar.bits.bit29 = 1; // this always has to be written as 1! PMC->pllar = pllar; signal HplSam3Clock.mainClockChanged(); return SUCCESS; } async command error_t HplSam3Clock.mckInit4RC() { return mckInitRC(4); } async command error_t HplSam3Clock.mckInit8RC() { return mckInitRC(8); } async command error_t HplSam3Clock.mckInit12RC() { return mckInitRC(12); } async command uint32_t HplSam3Clock.getMainClockSpeed() { uint32_t speed = 0; switch(PMC->mckr.bits.css) { case PMC_MCKR_CSS_SLOW_CLOCK: speed = 32; break; case PMC_MCKR_CSS_MAIN_CLOCK: speed = PMC->mcfr.bits.mainf*2048/1000; // 0.48828 corresponds to 16 clock ticks of a 32kHz crystal. break; case PMC_MCKR_CSS_PLLA_CLOCK: if(PMC->pllar.bits.diva != 0) { // note, the PLL multiplier is (mula + 1) speed = PMC->mcfr.bits.mainf*2048/1000 * (PMC->pllar.bits.mula + 1) / PMC->pllar.bits.diva; //speed = PMC->mcfr.bits.mainf*1000/488 * (PMC->pllar.bits.mula + 1) / PMC->pllar.bits.diva; } else speed = 0; break; default: speed = 0; } return speed; } default async event void HplSam3Clock.mainClockChanged(){} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/pmc/sam3upmchardware.h000066400000000000000000000206211207233610700250250ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Sam3u specific PMC registers * * @author Thomas Schmid */ #ifndef SAM3UPMCHARDWARE_H #define SAM3UPMCHARDWARE_H #include "pmchardware.h" /** * PMC Peripheral Clock Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 485 * 0: no effect * 1: enable corresponding peripheral clock */ typedef union { uint32_t flat; struct { uint8_t reserved0 : 2; uint8_t rtc : 1; // not used after datasheet uint8_t rtt : 1; // not used after datasheet uint8_t wdg : 1; // not used after datasheet uint8_t pmc : 1; // not used after datasheet uint8_t efc0 : 1; // not used after datasheet uint8_t efc1 : 1; // not used after datasheet uint8_t dbgu : 1; uint8_t hsmc4 : 1; uint8_t pioa : 1; uint8_t piob : 1; uint8_t pioc : 1; uint8_t us0 : 1; uint8_t us1 : 1; uint8_t us2 : 1; uint8_t us3 : 1; uint8_t mci0 : 1; uint8_t twi0 : 1; uint8_t twi1 : 1; uint8_t spi0 : 1; uint8_t ssc0 : 1; uint8_t tc0 : 1; uint8_t tc1 : 1; uint8_t tc2 : 1; uint8_t pwmc : 1; uint8_t adc12b : 1; uint8_t adc : 1; uint8_t hdma : 1; uint8_t udphs : 1; uint8_t pid30 : 1; // not used on sam3u uint8_t pid31 : 1; // not use don sam3u } __attribute__((__packed__)) bits; } pmc_pcer_t; /** * PMC Peripheral Clock Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 486 * 0: no effect * 1: disable corresponding peripheral clock */ typedef union { uint32_t flat; struct { uint8_t reserved0 : 2; uint8_t rtc : 1; // not used after datasheet uint8_t rtt : 1; // not used after datasheet uint8_t wdg : 1; // not used after datasheet uint8_t pmc : 1; // not used after datasheet uint8_t efc0 : 1; // not used after datasheet uint8_t efc1 : 1; // not used after datasheet uint8_t dbgu : 1; uint8_t hsmc4 : 1; uint8_t pioa : 1; uint8_t piob : 1; uint8_t pioc : 1; uint8_t us0 : 1; uint8_t us1 : 1; uint8_t us2 : 1; uint8_t us3 : 1; uint8_t mci0 : 1; uint8_t twi0 : 1; uint8_t twi1 : 1; uint8_t spi0 : 1; uint8_t ssc0 : 1; uint8_t tc0 : 1; uint8_t tc1 : 1; uint8_t tc2 : 1; uint8_t pwmc : 1; uint8_t adc12b : 1; uint8_t adc : 1; uint8_t hdma : 1; uint8_t udphs : 1; uint8_t pid30 : 1; // not used on sam3u uint8_t pid31 : 1; // not use don sam3u } __attribute__((__packed__)) bits; } pmc_pcdr_t; /** * PMC Peripheral Clock Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 487 * 0: peripheral clock disabled * 1: peripheral clock enabled */ typedef union { uint32_t flat; struct { uint8_t reserved0 : 2; uint8_t rtc : 1; // not used after datasheet uint8_t rtt : 1; // not used after datasheet uint8_t wdg : 1; // not used after datasheet uint8_t pmc : 1; // not used after datasheet uint8_t efc0 : 1; // not used after datasheet uint8_t efc1 : 1; // not used after datasheet uint8_t dbgu : 1; uint8_t hsmc4 : 1; uint8_t pioa : 1; uint8_t piob : 1; uint8_t pioc : 1; uint8_t us0 : 1; uint8_t us1 : 1; uint8_t us2 : 1; uint8_t us3 : 1; uint8_t mci0 : 1; uint8_t twi0 : 1; uint8_t twi1 : 1; uint8_t spi0 : 1; uint8_t ssc0 : 1; uint8_t tc0 : 1; uint8_t tc1 : 1; uint8_t tc2 : 1; uint8_t pwmc : 1; uint8_t adc12b : 1; uint8_t adc : 1; uint8_t hdma : 1; uint8_t udphs : 1; uint8_t pid30 : 1; // not used on sam3u uint8_t pid31 : 1; // not use don sam3u } __attribute__((__packed__)) bits; } pmc_pcsr_t; /** * PMC UTMI Clock Configuration Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 488 */ typedef union { uint32_t flat; struct { uint16_t reserved0: 16; uint8_t upllen : 1; // UTMI PLL enable uint8_t reserved1 : 3; uint8_t upllcount : 4; // UTMI PLL Start-up Time (in number of slow clock cycles times 8 uint8_t reserved2 : 8; } __attribute__((__packed__)) bits; } pmc_uckr_t; typedef struct { volatile pmc_pcer_t pcer; // Peripheral Clock Enable Register volatile pmc_pcdr_t pcdr; // Peripheral Clock Disable Register volatile pmc_pcsr_t pcsr; // Peripheral Clock Status Register } pmc_pc_t; /** * PMC Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary, p. 481 */ typedef struct pmc { volatile pmc_scer_t scer; // System Clock Enable Register volatile pmc_scdr_t scdr; // System Clock Disable Register volatile pmc_scsr_t scsr; // System Clock Status Register uint32_t reserved0; volatile pmc_pc_t pc; // Peripheral Clock Control Registers volatile pmc_uckr_t uckr; // UTMI Clock Register volatile pmc_mor_t mor; // Main Oscillator Register volatile pmc_mcfr_t mcfr; // Main Clock Frequency Register volatile pmc_pllar_t pllar; // PLLA Register uint32_t reserved1; volatile pmc_mckr_t mckr; // Master Clock Register uint32_t reserved2[3]; volatile pmc_pck_t pck0; // Programmable Clock 0 Register volatile pmc_pck_t pck1; // Programmable Clock 1 Register volatile pmc_pck_t pck2; // Programmable Clock 2 Register uint32_t reserved3[5]; volatile pmc_ier_t ier; // Interrupt Enable Register volatile pmc_idr_t idr; // Interrupt Disable Register volatile pmc_sr_t sr; // Status Register volatile pmc_imr_t imr; // Interrupt Mask Register volatile pmc_fsmr_t fsmr; // Fast Startup Mode Register volatile pmc_fspr_t fspr; // Fast Startup Polarity Register volatile pmc_focr_t focr; // Fault Output Clear Register uint32_t reserved5[26]; volatile pmc_wpmr_t wpmr; // Write Protect Mode Register volatile pmc_wpsr_t wpsr; // Write Protect Status Register } pmc_t; /** * Memory mapping for the PMC */ volatile pmc_t* PMC = (volatile pmc_t *) 0x400E0400; // PMC Base Address #endif //SAM3UPMCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/sam3uhardware.h000066400000000000000000000136021207233610700235470ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Definitions specific to the SAM3U MCU. * Includes interrupt enable/disable routines for nesC. * * @author Wanja Hofer */ #ifndef SAM3U_HARDWARE_H #define SAM3U_HARDWARE_H #include // Peripheral ID definitions for the SAM3U // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 41 #define AT91C_ID_SUPC ( 0) // SUPPLY CONTROLLER #define AT91C_ID_RSTC ( 1) // RESET CONTROLLER #define AT91C_ID_RTC ( 2) // REAL TIME CLOCK #define AT91C_ID_RTT ( 3) // REAL TIME TIMER #define AT91C_ID_WDG ( 4) // WATCHDOG TIMER #define AT91C_ID_PMC ( 5) // PMC #define AT91C_ID_EFC0 ( 6) // EFC0 #define AT91C_ID_EFC1 ( 7) // EFC1 #define AT91C_ID_DBGU ( 8) // DBGU #define AT91C_ID_HSMC4 ( 9) // HSMC4 #define AT91C_ID_PIOA (10) // Parallel IO Controller A #define AT91C_ID_PIOB (11) // Parallel IO Controller B #define AT91C_ID_PIOC (12) // Parallel IO Controller C #define AT91C_ID_US0 (13) // USART 0 #define AT91C_ID_US1 (14) // USART 1 #define AT91C_ID_US2 (15) // USART 2 #define AT91C_ID_US3 (16) // USART 3 #define AT91C_ID_MCI0 (17) // Multimedia Card Interface #define AT91C_ID_TWI0 (18) // TWI 0 #define AT91C_ID_TWI1 (19) // TWI 1 #define AT91C_ID_SPI0 (20) // Serial Peripheral Interface #define AT91C_ID_SSC0 (21) // Serial Synchronous Controller 0 #define AT91C_ID_TC0 (22) // Timer Counter 0 #define AT91C_ID_TC1 (23) // Timer Counter 1 #define AT91C_ID_TC2 (24) // Timer Counter 2 #define AT91C_ID_PWMC (25) // Pulse Width Modulation Controller #define AT91C_ID_ADC12B (26) // 12-bit ADC Controller (ADC12B) #define AT91C_ID_ADC (27) // 10-bit ADC Controller (ADC) #define AT91C_ID_HDMA (28) // HDMA #define AT91C_ID_UDPHS (29) // USB Device High Speed #define SAM3U_PERIPHERALA (0x400e0c00) #define SAM3U_PERIPHERALB (0x400e0e00) #define SAM3U_PERIPHERALC (0x400e1000) #define TOSH_ASSIGN_PIN(name, port, bit) \ static inline void TOSH_SET_##name##_PIN() \ {*((volatile uint32_t *) (SAM3U_PERIPHERAL##port + 0x030)) = (1 << bit);} \ static inline void TOSH_CLR_##name##_PIN() \ {*((volatile uint32_t *) (SAM3U_PERIPHERAL##port + 0x034)) = (1 << bit);} \ static inline int TOSH_READ_##name##_PIN() \ { \ /* Read bit from Output Status Register */ \ uint32_t currentport = *((volatile uint32_t *) (SAM3U_PERIPHERAL##port + 0x018)); \ uint32_t currentpin = (currentport & (1 << bit)) >> bit; \ bool isInput = ((currentpin & 1) == 0); \ if (isInput == 1) { \ /* Read bit from Pin Data Status Register */ \ currentport = *((volatile uint32_t *) (SAM3U_PERIPHERAL##port + 0x03c)); \ currentpin = (currentport & (1 << bit)) >> bit; \ return ((currentpin & 1) == 1); \ } else { \ /* Read bit from Output Data Status Register */ \ currentport = *((volatile uint32_t *) (SAM3U_PERIPHERAL##port + 0x038)); \ currentpin = (currentport & (1 << bit)) >> bit; \ return ((currentpin & 1) == 1); \ } \ } \ static inline void TOSH_MAKE_##name##_OUTPUT() \ {*((volatile uint32_t *) (SAM3U_PERIPHERAL##port + 0x010)) = (1 << bit);} \ static inline void TOSH_MAKE_##name##_INPUT() \ {*((volatile uint32_t *) (SAM3U_PERIPHERAL##port + 0x014)) = (1 << bit);} #define TOSH_ASSIGN_OUTPUT_ONLY_PIN(name, port, bit) \ static inline void TOSH_SET_##name##_PIN() \ {*((volatile uint32_t *) (SAM3U_PERIPHERAL##port + 0x030)) = (1 << bit);} \ static inline void TOSH_CLR_##name##_PIN() \ {*((volatile uint32_t *) (SAM3U_PERIPHERAL##port + 0x034)) = (1 << bit);} \ static inline void TOSH_MAKE_##name##_OUTPUT() \ {*((volatile uint32_t *) (SAM3U_PERIPHERAL##port + 0x010)) = (1 << bit);} \ #define TOSH_ALIAS_OUTPUT_ONLY_PIN(alias, connector)\ static inline void TOSH_SET_##alias##_PIN() {TOSH_SET_##connector##_PIN();} \ static inline void TOSH_CLR_##alias##_PIN() {TOSH_CLR_##connector##_PIN();} \ static inline void TOSH_MAKE_##alias##_OUTPUT() {} \ #define TOSH_ALIAS_PIN(alias, connector) \ static inline void TOSH_SET_##alias##_PIN() {TOSH_SET_##connector##_PIN();} \ static inline void TOSH_CLR_##alias##_PIN() {TOSH_CLR_##connector##_PIN();} \ static inline char TOSH_READ_##alias##_PIN() {return TOSH_READ_##connector##_PIN();} \ static inline void TOSH_MAKE_##alias##_OUTPUT() {TOSH_MAKE_##connector##_OUTPUT();} \ #endif // SAM3U_HARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/smc/000077500000000000000000000000001207233610700214105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/smc/sam3smchardware.h000066400000000000000000000077571207233610700246650ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Static Memory Controller Register Definitions * * @author Thomas Schmid */ #ifndef _SAM3USMCHARDWARE_H #define _SAM3USMCHARDWARE_H #include "smchardware.h" /** * SMC TIMINGS Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. */ typedef union { uint32_t flat; struct { uint32_t tclr : 4; // cle to ren low delay uint32_t tadl : 4; // ale to data start uint32_t tar : 4; // ale to ren low delay uint32_t ocms : 1; // off chip memory scrambling enable uint32_t reserved0 : 3; uint32_t trr : 4; // ready to ren low delay uint32_t reserved1 : 4; uint32_t twb : 4; // wen high to ren to busy uint32_t rbnsel : 3; // ready/busy line selection uint32_t nfsel : 1; // nand flash selection } __attribute__((__packed__)) bits; } smc_timings_t; /** * SMC MODE Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary 9/1/09, p. */ typedef union { uint32_t flat; struct { uint32_t read_mode : 1; // read mode uint32_t write_mode : 1; // write mode uint32_t reserved0 : 2; uint32_t exnw_mode : 2; // nwait mode uint32_t reserved1 : 2; uint32_t bat : 1; // byte access type uint32_t reserved2 : 3; uint32_t dbw : 1; // data bus width uint32_t reserved3 : 3; uint32_t tdf_cycles : 4; // data float time uint32_t tdf_mode : 1; // tdf optimization uint32_t reserved4 : 3; uint32_t pmen : 1; // page mode enable (note, not in documentation, but in code at91lib!) uint32_t reserved5 : 3; uint32_t ps : 2; // page mode size (note: not in documentation, but in code at91lib!) uint32_t reserved6 : 3; } __attribute__((__packed__)) bits; } smc_mode_t; typedef struct { volatile smc_setup_t setup; volatile smc_pulse_t pulse; volatile smc_cycle_t cycle; volatile smc_timings_t timings; volatile smc_mode_t mode; } smc_cs_t; volatile smc_cs_t* SMC_CS0 = (volatile smc_cs_t*)0x400E0070; volatile smc_cs_t* SMC_CS1 = (volatile smc_cs_t*)0x400E0084; volatile smc_cs_t* SMC_CS2 = (volatile smc_cs_t*)0x400E0098; volatile smc_cs_t* SMC_CS3 = (volatile smc_cs_t*)0x400E00AC; #endif //_SAM3USMCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/spi/000077500000000000000000000000001207233610700214215ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/spi/HilSam3SpiC.nc000066400000000000000000000073451207233610700237730ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * SPI Configuration for the SAM3U-EK devkit. Does not use DMA (PDC) at this * point. Byte interface performs busy wait! * * @author Thomas Schmid * @author Kevin Klues */ #include configuration HilSam3SpiC { provides { interface Resource[uint8_t]; interface SpiByte[uint8_t]; interface FastSpiByte[uint8_t]; interface SpiPacket[uint8_t]; interface HplSam3SpiChipSelConfig[uint8_t]; interface HplSam3SpiConfig; } uses { interface Init as SpiChipInit; interface ResourceConfigure[uint8_t]; } } implementation { components RealMainP; RealMainP.PlatformInit -> HilSam3SpiP.Init; components HplSam3SpiC; HplSam3SpiConfig = HplSam3SpiC; HilSam3SpiP.SpiChipInit = SpiChipInit; HilSam3SpiP.HplSam3SpiConfig -> HplSam3SpiC; HilSam3SpiP.HplSam3SpiControl -> HplSam3SpiC; HilSam3SpiP.HplSam3SpiStatus -> HplSam3SpiC; HilSam3SpiP.HplSam3SpiInterrupts -> HplSam3SpiC; HplSam3SpiChipSelConfig[0] = HplSam3SpiC.HplSam3SpiChipSelConfig0; HplSam3SpiChipSelConfig[1] = HplSam3SpiC.HplSam3SpiChipSelConfig1; HplSam3SpiChipSelConfig[2] = HplSam3SpiC.HplSam3SpiChipSelConfig2; HplSam3SpiChipSelConfig[3] = HplSam3SpiC.HplSam3SpiChipSelConfig3; components new FcfsArbiterC(SAM3_SPI_BUS) as ArbiterC; Resource = ArbiterC; ResourceConfigure = ArbiterC; HilSam3SpiP.ArbiterInfo -> ArbiterC; components new AsyncStdControlPowerManagerC() as PM; PM.AsyncStdControl -> HplSam3SpiC; PM.ArbiterInfo -> ArbiterC.ArbiterInfo; PM.ResourceDefaultOwner -> ArbiterC.ResourceDefaultOwner; components HilSam3SpiP; SpiByte = HilSam3SpiP.SpiByte; SpiPacket = HilSam3SpiP.SpiPacket; components new FastSpiSam3C(SAM3_SPI_BUS); FastSpiSam3C.SpiByte -> HilSam3SpiP.SpiByte; FastSpiByte = FastSpiSam3C; components HplSam3uGeneralIOC; HilSam3SpiP.SpiPinMiso -> HplSam3uGeneralIOC.HplPioA13; HilSam3SpiP.SpiPinMosi -> HplSam3uGeneralIOC.HplPioA14; HilSam3SpiP.SpiPinSpck -> HplSam3uGeneralIOC.HplPioA15; components HplNVICC; HilSam3SpiP.SpiIrqControl -> HplNVICC.SPI0Interrupt; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/spi/HplSam3SpiC.nc000066400000000000000000000060051207233610700237720ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * The hardware presentation layer for the SAM3U SPI. * * @author Thomas Schmid */ #include "sam3spihardware.h" configuration HplSam3SpiC { provides { interface AsyncStdControl; interface HplSam3SpiConfig; interface HplSam3SpiControl; interface HplSam3SpiInterrupts; interface HplSam3SpiStatus; interface HplSam3SpiChipSelConfig as HplSam3SpiChipSelConfig0; interface HplSam3SpiChipSelConfig as HplSam3SpiChipSelConfig1; interface HplSam3SpiChipSelConfig as HplSam3SpiChipSelConfig2; interface HplSam3SpiChipSelConfig as HplSam3SpiChipSelConfig3; } } implementation { components HplSam3SpiP; AsyncStdControl = HplSam3SpiP; HplSam3SpiConfig = HplSam3SpiP; HplSam3SpiControl = HplSam3SpiP; HplSam3SpiInterrupts = HplSam3SpiP; HplSam3SpiStatus = HplSam3SpiP; components new HplSam3SpiChipSelP(0x40008030) as CS0, new HplSam3SpiChipSelP(0x40008034) as CS1, new HplSam3SpiChipSelP(0x40008038) as CS2, new HplSam3SpiChipSelP(0x4000803C) as CS3; HplSam3SpiChipSelConfig0 = CS0; HplSam3SpiChipSelConfig1 = CS1; HplSam3SpiChipSelConfig2 = CS2; HplSam3SpiChipSelConfig3 = CS3; components HplSam3uClockC; HplSam3SpiP.SpiClockControl -> HplSam3uClockC.SPI0PPCntl; HplSam3SpiP.ClockConfig -> HplSam3uClockC; components McuSleepC; HplSam3SpiP.SpiInterruptWrapper -> McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/spi/sam3spihardware.h000066400000000000000000000036151207233610700246740ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Serial Peripheral Interface (SPI) register definitions. * * @author Thomas Schmid */ #ifndef _SAM3SPIHARDWARE_H #define _SAM3SPIHARDWARE_H #include "spihardware.h" /** * Memory mapping for the SPI */ volatile spi_t* SPI = (volatile spi_t *) 0x40008000; // SPI Base Address #endif // _SPIHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/supc/000077500000000000000000000000001207233610700216005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/supc/sam3usupchardware.h000066400000000000000000000034611207233610700254160ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ #ifndef SAM3USUPCHARDWARE_H #define SAM3USUPCHARDWARE_H #include "supchardware.h" /** * Memory mappin gofr the SUPC */ volatile supc_t* SUPC = (volatile supc_t *) 0x400E1210; #endif //SAM3USUPCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/timer/000077500000000000000000000000001207233610700217465ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/timer/HplSam3TCC.nc000066400000000000000000000104061207233610700240720ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Top level configuration of the timer counter peripheral. * * @author Thomas Schmid */ #include configuration HplSam3TCC { provides { interface Init; interface HplSam3TC as TC; interface HplSam3TCChannel as TCH0; interface HplSam3TCChannel as TCH1; interface HplSam3TCChannel as TCH2; interface HplSam3TCCapture as TC0Capture; interface HplSam3TCCompare as TC0CompareA; interface HplSam3TCCompare as TC0CompareB; interface HplSam3TCCompare as TC0CompareC; interface HplSam3TCCapture as TC1Capture; interface HplSam3TCCompare as TC1CompareA; interface HplSam3TCCompare as TC1CompareB; interface HplSam3TCCompare as TC1CompareC; interface HplSam3TCCapture as TC2Capture; interface HplSam3TCCompare as TC2CompareA; interface HplSam3TCCompare as TC2CompareB; interface HplSam3TCCompare as TC2CompareC; } } implementation { components HplNVICC, HplSam3TCEventP, HplSam3uClockC, new HplSam3TCChannelP( TC_CH0_BASE ) as TCCH0, new HplSam3TCChannelP( TC_CH1_BASE ) as TCCH1, new HplSam3TCChannelP( TC_CH2_BASE ) as TCCH2; components McuSleepC; HplSam3TCEventP.TC0InterruptWrapper -> McuSleepC; HplSam3TCEventP.TC1InterruptWrapper -> McuSleepC; HplSam3TCEventP.TC2InterruptWrapper -> McuSleepC; TCH0 = TCCH0; TCH1 = TCCH1; TCH2 = TCCH2; TCCH0.NVICTCInterrupt -> HplNVICC.TC0Interrupt; TCCH0.TimerEvent -> HplSam3TCEventP.TC0Event; TCCH0.TCPClockCntl -> HplSam3uClockC.TC0PPCntl; TCCH0.ClockConfig -> HplSam3uClockC; TCCH1.NVICTCInterrupt -> HplNVICC.TC1Interrupt; TCCH1.TimerEvent -> HplSam3TCEventP.TC1Event; TCCH1.TCPClockCntl -> HplSam3uClockC.TC1PPCntl; TCCH1.ClockConfig -> HplSam3uClockC; TCCH2.NVICTCInterrupt -> HplNVICC.TC2Interrupt; TCCH2.TimerEvent -> HplSam3TCEventP.TC2Event; TCCH2.TCPClockCntl -> HplSam3uClockC.TC2PPCntl; TCCH2.ClockConfig -> HplSam3uClockC; TC0Capture = TCCH0.Capture; TC0CompareA = TCCH0.CompareA; TC0CompareB = TCCH0.CompareB; TC0CompareC = TCCH0.CompareC; TC1Capture = TCCH1.Capture; TC1CompareA = TCCH1.CompareA; TC1CompareB = TCCH1.CompareB; TC1CompareC = TCCH1.CompareC; TC2Capture = TCCH2.Capture; TC2CompareA = TCCH2.CompareA; TC2CompareB = TCCH2.CompareB; TC2CompareC = TCCH2.CompareC; components new HplSam3TCP(TC_BASE); Init = HplSam3TCP; HplSam3TCP.ClockConfig -> HplSam3uClockC; HplSam3TCP.TC0 -> TCCH0; HplSam3TCP.TC1 -> TCCH1; HplSam3TCP.TC2 -> TCCH2; TC = HplSam3TCP; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/timer/HplSam3TCEventP.nc000066400000000000000000000053731207233610700251200ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * SAM3U TC Event dispatcher. * * @author Thomas Schmid */ #include "sam3tchardware.h" module HplSam3TCEventP @safe() { provides { interface HplSam3TCEvent as TC0Event; interface HplSam3TCEvent as TC1Event; interface HplSam3TCEvent as TC2Event; } uses { interface FunctionWrapper as TC0InterruptWrapper; interface FunctionWrapper as TC1InterruptWrapper; interface FunctionWrapper as TC2InterruptWrapper; } } implementation { void TC0IrqHandler() @C() @spontaneous() { call TC0InterruptWrapper.preamble(); signal TC0Event.fired(); call TC0InterruptWrapper.postamble(); } void TC1IrqHandler() @C() @spontaneous() { call TC1InterruptWrapper.preamble(); signal TC1Event.fired(); call TC1InterruptWrapper.postamble(); } void TC2IrqHandler() @C() @spontaneous() { call TC2InterruptWrapper.preamble(); signal TC2Event.fired(); call TC2InterruptWrapper.postamble(); } default async event void TC0Event.fired() {} default async event void TC1Event.fired() {} default async event void TC2Event.fired() {} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/timer/sam3rtthardware.h000066400000000000000000000037361207233610700252430ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Real-Time Timer register definitions. * * @author Thomas Schmid */ #ifndef SAM3URTTHARDWARE_H #define SAM3URTTHARDWARE_H #include "rtthardware.h" //#define RTT ((rtt_t *) 0x400E1230) // (RTTC) Base Address // Defined in AT91 ARM Coretx-M3 based Microcontrollers, SAM3U Series, // Preliminary, p. 249 volatile rtt_t* RTT = (volatile rtt_t*) 0x400E1230; #endif // SAM3URTTHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/timer/sam3tchardware.h000066400000000000000000000047361207233610700250410ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Timer Counter register definitions. * * @author Thomas Schmid */ #ifndef SAM3UTCHARDWARE_H #define SAM3UTCHARDWARE_H #include "tchardware.h" /** * TC definition capture mode */ typedef struct { volatile tc_channel_capture_t ch0; uint32_t reserved0[4]; volatile tc_channel_capture_t ch1; uint32_t reserved1[4]; volatile tc_channel_capture_t ch2; uint32_t reserved2[4]; volatile tc_bcr_t bcr; volatile tc_bmr_t bmr; volatile tc_qier_t qier; volatile tc_qidr_t qidr; volatile tc_qimr_t qimr; volatile tc_qisr_t qisr; } tc_t; /** * TC Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary 9/1/09, p. 827 */ #define TC_BASE 0x40080000 #define TC_CH0_BASE 0x40080000 #define TC_CH1_BASE 0x40080040 #define TC_CH2_BASE 0x40080080 volatile tc_t* TC = (volatile tc_t*)TC_BASE; #endif //SAM3UTCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/000077500000000000000000000000001207233610700214315ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/HplSam3uTwi.nc000066400000000000000000000130461207233610700240770ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ // This file shows the Hpl level commands. #include interface HplSam3uTwi{ async command void init(); async command void enableClock(); async command void disableClock(); async command void configureTwi(const sam3u_twi_union_config_t* config); /*Control Register Functions*/ async command void setStart(); async command void setStop(); async command void setMaster(); async command void disMaster(); async command void setSlave(); async command void disSlave(); async command void setQuick(); async command void swReset(); /*Master Mode Register Functions*/ async command void setDeviceAddr(uint8_t dadr); async command void setDirection(uint8_t mread); async command void addrSize(uint8_t iadrsz); /*Slave Mode Register Functions*/ async command void setSlaveAddr(uint8_t sadr); /*Internal Addr Register Functions*/ async command void setInternalAddr(uint32_t iadr); /*Clock Waveform Generator Register Functions*/ async command void setClockLowDiv(uint8_t cldiv); async command void setClockHighDiv(uint8_t chdiv); async command void setClockDiv(uint8_t ckdiv); /*Status Register Functions*/ async command twi_sr_t getStatus(); async command uint8_t getTxCompleted(twi_sr_t *sr); async command uint8_t getRxReady(twi_sr_t *sr); async command uint8_t getTxReady(twi_sr_t *sr); async command uint8_t getSlaveRead(twi_sr_t *sr); async command uint8_t getSlaveAccess(twi_sr_t *sr); async command uint8_t getGenCallAccess(twi_sr_t *sr); async command uint8_t getORErr(twi_sr_t *sr); async command uint8_t getNack(twi_sr_t *sr); async command uint8_t getArbLost(twi_sr_t *sr); async command uint8_t getClockWaitState(twi_sr_t *sr); async command uint8_t getEOSAccess(twi_sr_t *sr); async command uint8_t getEndRx(twi_sr_t *sr); async command uint8_t getEndTx(twi_sr_t *sr); async command uint8_t getRxBufFull(twi_sr_t *sr); async command uint8_t getTxBufEmpty(twi_sr_t *sr); /*Interrupt Enable Register Functions*/ async command void setIntTxComp(); async command void setIntRxReady(); async command void setIntTxReady(); async command void setIntSlaveAccess(); async command void setIntGenCallAccess(); async command void setIntORErr(); async command void setIntNack(); async command void setIntArbLost(); async command void setIntClockWaitState(); async command void setIntEOSAccess(); async command void setIntEndRx(); async command void setIntEndTx(); async command void setIntRxBufFull(); async command void setIntTxBufEmpty(); /*Interrupt Disable Register*/ async command void disableAllInterrupts(); async command void disIntTxComp(); async command void disIntRxReady(); async command void disIntTxReady(); async command void disIntSlaveAccess(); async command void disIntGenCallAccess(); async command void disIntORErr(); async command void disIntNack(); async command void disIntArbLost(); async command void disIntClockWaitState(); async command void disIntEOSAccess(); async command void disIntEndRx(); async command void disIntEndTx(); async command void disIntRxBufFull(); async command void disIntTxBufEmpty(); /*Interrupt Mask Register*/ async command uint8_t maskIntTxComp(); async command uint8_t maskIntRxReady(); async command uint8_t maskIntTxReady(); async command uint8_t maskIntSlaveAccess(); async command uint8_t maskIntGenCallAccess(); async command uint8_t maskIntORErr(); async command uint8_t maskIntNack(); async command uint8_t maskIntArbLost(); async command uint8_t maskIntClockWaitState(); async command uint8_t maskIntEOSAccess(); async command uint8_t maskIntEndRx(); async command uint8_t maskIntEndTx(); async command uint8_t maskIntRxBufFull(); async command uint8_t maskIntTxBufEmpty(); /*Receive Holding Register Function*/ async command uint8_t readRxReg(); /*Transmit Holding Register Functions*/ async command void setTxReg(uint8_t buffer); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/HplSam3uTwiC.nc000066400000000000000000000043111207233610700241750ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko * @author Kevin Klues */ configuration HplSam3uTwiC { provides { interface HplSam3uTwiInterrupt as HplSam3uTwiInterrupt0; interface HplSam3uTwiInterrupt as HplSam3uTwiInterrupt1; interface HplSam3uTwi as HplSam3uTwi0; interface HplSam3uTwi as HplSam3uTwi1; } } implementation{ enum { CLIENT_ID = unique( SAM3U_HPLTWI_RESOURCE ), }; components HplSam3uTwiP as TwiP; HplSam3uTwiInterrupt0 = TwiP.HplSam3uTwiInterrupt0; HplSam3uTwiInterrupt1 = TwiP.HplSam3uTwiInterrupt1; HplSam3uTwi0 = TwiP.HplSam3uTwi0; HplSam3uTwi1 = TwiP.HplSam3uTwi1; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/HplSam3uTwiImplP.nc000066400000000000000000000757561207233610700250610ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3utwihardware.h" module HplSam3uTwiImplP { provides { interface HplSam3uTwi as HplSam3uTwi0; interface HplSam3uTwi as HplSam3uTwi1; interface HplSam3uTwiInterrupt as Interrupt0; interface HplSam3uTwiInterrupt as Interrupt1; } uses { interface HplNVICInterruptCntl as Twi0Interrupt; interface HplNVICInterruptCntl as Twi1Interrupt; interface HplSam3GeneralIOPin as Twd0Pin; interface HplSam3GeneralIOPin as Twd1Pin; interface HplSam3GeneralIOPin as Twck0Pin; interface HplSam3GeneralIOPin as Twck1Pin; interface HplSam3PeripheralClockCntl as Twi0ClockControl; interface HplSam3PeripheralClockCntl as Twi1ClockControl; interface HplSam3Clock as Twi0ClockConfig; interface HplSam3Clock as Twi1ClockConfig; interface FunctionWrapper as Twi0InterruptWrapper; interface FunctionWrapper as Twi1InterruptWrapper; interface Leds; } } implementation{ void Twi0IrqHandler() @C() @spontaneous() { call Twi0InterruptWrapper.preamble(); signal Interrupt0.fired(); call Twi0InterruptWrapper.postamble(); } void Twi1IrqHandler() @C() @spontaneous() { call Twi1InterruptWrapper.preamble(); signal Interrupt1.fired(); call Twi1InterruptWrapper.postamble(); } async command void HplSam3uTwi0.disableAllInterrupts() { call HplSam3uTwi0.disIntTxComp(); call HplSam3uTwi0.disIntRxReady(); call HplSam3uTwi0.disIntTxReady(); call HplSam3uTwi0.disIntSlaveAccess(); call HplSam3uTwi0.disIntGenCallAccess(); call HplSam3uTwi0.disIntORErr(); call HplSam3uTwi0.disIntNack(); call HplSam3uTwi0.disIntArbLost(); call HplSam3uTwi0.disIntClockWaitState(); call HplSam3uTwi0.disIntEOSAccess(); call HplSam3uTwi0.disIntEndRx(); call HplSam3uTwi0.disIntEndTx(); call HplSam3uTwi0.disIntRxBufFull(); call HplSam3uTwi0.disIntTxBufEmpty(); } async command void HplSam3uTwi1.disableAllInterrupts() { call HplSam3uTwi1.disIntTxComp(); call HplSam3uTwi1.disIntRxReady(); call HplSam3uTwi1.disIntTxReady(); call HplSam3uTwi1.disIntSlaveAccess(); call HplSam3uTwi1.disIntGenCallAccess(); call HplSam3uTwi1.disIntORErr(); call HplSam3uTwi1.disIntNack(); call HplSam3uTwi1.disIntArbLost(); call HplSam3uTwi1.disIntClockWaitState(); call HplSam3uTwi1.disIntEOSAccess(); call HplSam3uTwi1.disIntEndRx(); call HplSam3uTwi1.disIntEndTx(); call HplSam3uTwi1.disIntRxBufFull(); call HplSam3uTwi1.disIntTxBufEmpty(); } async command void HplSam3uTwi0.configureTwi(const sam3u_twi_union_config_t *config){ call Twi0Interrupt.configure(IRQ_PRIO_TWI0); call Twi0Interrupt.enable(); call Twi0ClockControl.enable(); call Twd0Pin.disablePioControl(); call Twd0Pin.selectPeripheralA(); call Twck0Pin.disablePioControl(); call Twck0Pin.selectPeripheralA(); call HplSam3uTwi0.setClockLowDiv((uint8_t)config->cldiv); call HplSam3uTwi0.setClockHighDiv((uint8_t)config->chdiv); call HplSam3uTwi0.setClockDiv((uint8_t)config->ckdiv); call HplSam3uTwi0.disableAllInterrupts(); } async command void HplSam3uTwi0.disableClock(){ call Twi0ClockControl.disable(); } async command void HplSam3uTwi1.disableClock(){ call Twi1ClockControl.disable(); } async command void HplSam3uTwi0.enableClock(){ call Twi0ClockControl.enable(); } async command void HplSam3uTwi1.enableClock(){ call Twi1ClockControl.enable(); } async command void HplSam3uTwi1.configureTwi(const sam3u_twi_union_config_t *config){ call Twi1Interrupt.configure(IRQ_PRIO_TWI1); call Twi1Interrupt.enable(); call Twi1ClockControl.enable(); call Twd1Pin.disablePioControl(); call Twd1Pin.selectPeripheralA(); call Twck1Pin.disablePioControl(); call Twck1Pin.selectPeripheralA(); call HplSam3uTwi1.setClockLowDiv((uint8_t)config->cldiv); call HplSam3uTwi1.setClockHighDiv((uint8_t)config->chdiv); call HplSam3uTwi1.setClockDiv((uint8_t)config->ckdiv); call HplSam3uTwi1.disableAllInterrupts(); } async command void HplSam3uTwi0.init(){ call HplSam3uTwi0.disableAllInterrupts(); } async command void HplSam3uTwi1.init(){ call HplSam3uTwi1.disableAllInterrupts(); } async command void HplSam3uTwi0.setStart(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI0_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.start = 1; *CR = cr; } async command void HplSam3uTwi0.setStop(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI0_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.stop = 1; *CR = cr; } async command void HplSam3uTwi1.setStart(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI1_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.start = 1; *CR = cr; } async command void HplSam3uTwi1.setStop(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI1_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.stop = 1; *CR = cr; } async command void HplSam3uTwi0.setMaster(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI0_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.msen = 1; *CR = cr; } async command void HplSam3uTwi0.disMaster(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI0_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.msdis = 1; *CR = cr; } async command void HplSam3uTwi1.setMaster(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI1_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.msen = 1; *CR = cr; } async command void HplSam3uTwi1.disMaster(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI1_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.msdis = 1; *CR = cr; } async command void HplSam3uTwi0.setSlave(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI0_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.sven = 1; *CR = cr; } async command void HplSam3uTwi0.disSlave(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI0_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.svdis = 1; *CR = cr; } async command void HplSam3uTwi1.setSlave(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI1_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.sven = 1; *CR = cr; } async command void HplSam3uTwi1.disSlave(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI1_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.svdis = 1; *CR = cr; } async command void HplSam3uTwi0.setQuick(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI0_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.quick = 1; *CR = cr; } async command void HplSam3uTwi1.setQuick(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI1_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.quick = 1; *CR = cr; } async command void HplSam3uTwi0.swReset(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI0_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.swrst = 1; *CR = cr; } async command void HplSam3uTwi1.swReset(){ volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI1_BASE_ADDR + 0x0); twi_cr_t cr; cr.bits.swrst = 1; *CR = cr; } async command void HplSam3uTwi0.setDeviceAddr(uint8_t dadr){ volatile twi_mmr_t* MMR = (volatile twi_mmr_t *) (TWI0_BASE_ADDR + 0x4); twi_mmr_t mmr = *MMR; mmr.bits.dadr = dadr; *MMR = mmr; } async command void HplSam3uTwi1.setDeviceAddr(uint8_t dadr){ volatile twi_mmr_t* MMR = (volatile twi_mmr_t *) (TWI1_BASE_ADDR + 0x4); twi_mmr_t mmr = *MMR; mmr.bits.dadr = dadr; *MMR = mmr; } async command void HplSam3uTwi0.setDirection(uint8_t mread){ volatile twi_mmr_t* MMR = (volatile twi_mmr_t *) (TWI0_BASE_ADDR + 0x4); twi_mmr_t mmr = *MMR; mmr.bits.mread = mread; *MMR = mmr; } async command void HplSam3uTwi1.setDirection(uint8_t mread){ volatile twi_mmr_t* MMR = (volatile twi_mmr_t *) (TWI1_BASE_ADDR + 0x4); twi_mmr_t mmr = *MMR; mmr.bits.mread = mread; *MMR = mmr; } async command void HplSam3uTwi0.addrSize(uint8_t iadrsz){ volatile twi_mmr_t* MMR = (volatile twi_mmr_t *) (TWI0_BASE_ADDR + 0x4); twi_mmr_t mmr = *MMR; mmr.bits.iadrsz = iadrsz; *MMR = mmr; } async command void HplSam3uTwi1.addrSize(uint8_t iadrsz){ volatile twi_mmr_t* MMR = (volatile twi_mmr_t *) (TWI1_BASE_ADDR + 0x4); twi_mmr_t mmr = *MMR; mmr.bits.iadrsz = iadrsz; *MMR = mmr; } async command void HplSam3uTwi0.setSlaveAddr(uint8_t sadr){ volatile twi_smr_t* SMR = (volatile twi_smr_t *) (TWI0_BASE_ADDR + 0x8); twi_smr_t smr = *SMR; smr.bits.sadr = sadr; *SMR = smr; } async command void HplSam3uTwi1.setSlaveAddr(uint8_t sadr){ volatile twi_smr_t* SMR = (volatile twi_smr_t *) (TWI1_BASE_ADDR + 0x8); twi_smr_t smr = *SMR; smr.bits.sadr = sadr; *SMR = smr; } async command void HplSam3uTwi0.setInternalAddr(uint32_t iadr){ volatile twi_iadr_t* IADR = (volatile twi_iadr_t *) (TWI0_BASE_ADDR + 0xC); twi_iadr_t iadr_r = *IADR; iadr_r.bits.iadr = iadr; *IADR = iadr_r; } async command void HplSam3uTwi1.setInternalAddr(uint32_t iadr){ volatile twi_iadr_t* IADR = (volatile twi_iadr_t *) (TWI1_BASE_ADDR + 0xC); twi_iadr_t iadr_r = *IADR; iadr_r.bits.iadr = iadr; *IADR = iadr_r; } async command void HplSam3uTwi0.setClockLowDiv(uint8_t cldiv){ volatile twi_cwgr_t* CWGR = (volatile twi_cwgr_t *) (TWI0_BASE_ADDR + 0x10); twi_cwgr_t cwgr = *CWGR; cwgr.bits.cldiv = cldiv; *CWGR = cwgr; } async command void HplSam3uTwi1.setClockLowDiv(uint8_t cldiv){ volatile twi_cwgr_t* CWGR = (volatile twi_cwgr_t *) (TWI1_BASE_ADDR + 0x10); twi_cwgr_t cwgr = *CWGR; cwgr.bits.cldiv = cldiv; *CWGR = cwgr; } async command void HplSam3uTwi0.setClockHighDiv(uint8_t chdiv){ volatile twi_cwgr_t* CWGR = (volatile twi_cwgr_t *) (TWI0_BASE_ADDR + 0x10); twi_cwgr_t cwgr = *CWGR; cwgr.bits.chdiv = chdiv; *CWGR = cwgr; } async command void HplSam3uTwi1.setClockHighDiv(uint8_t chdiv){ volatile twi_cwgr_t* CWGR = (volatile twi_cwgr_t *) (TWI1_BASE_ADDR + 0x10); twi_cwgr_t cwgr = *CWGR; cwgr.bits.chdiv = chdiv; *CWGR = cwgr; } async command void HplSam3uTwi0.setClockDiv(uint8_t ckdiv){ volatile twi_cwgr_t* CWGR = (volatile twi_cwgr_t *) (TWI0_BASE_ADDR + 0x10); twi_cwgr_t cwgr = *CWGR; cwgr.bits.ckdiv = ckdiv; *CWGR = cwgr; } async command void HplSam3uTwi1.setClockDiv(uint8_t ckdiv){ volatile twi_cwgr_t* CWGR = (volatile twi_cwgr_t *) (TWI1_BASE_ADDR + 0x10); twi_cwgr_t cwgr = *CWGR; cwgr.bits.ckdiv = ckdiv; *CWGR = cwgr; } async command twi_sr_t HplSam3uTwi0.getStatus() { return TWI0->sr; } async command uint8_t HplSam3uTwi0.getTxCompleted(twi_sr_t *sr){ return sr->bits.txcomp; } async command uint8_t HplSam3uTwi0.getRxReady(twi_sr_t *sr){ return sr->bits.rxrdy; } async command uint8_t HplSam3uTwi0.getTxReady(twi_sr_t *sr){ return sr->bits.txrdy; } async command uint8_t HplSam3uTwi0.getSlaveRead(twi_sr_t *sr){ return sr->bits.svread; } async command uint8_t HplSam3uTwi0.getSlaveAccess(twi_sr_t *sr){ return sr->bits.svacc; } async command uint8_t HplSam3uTwi0.getGenCallAccess(twi_sr_t *sr){ return sr->bits.gacc; } async command uint8_t HplSam3uTwi0.getORErr(twi_sr_t *sr){ return sr->bits.ovre; } async command uint8_t HplSam3uTwi0.getNack(twi_sr_t *sr){ return sr->bits.nack; } async command uint8_t HplSam3uTwi0.getArbLost(twi_sr_t *sr){ return sr->bits.arblst; } async command uint8_t HplSam3uTwi0.getClockWaitState(twi_sr_t *sr){ return sr->bits.sclws; } async command uint8_t HplSam3uTwi0.getEOSAccess(twi_sr_t *sr){ return sr->bits.eosacc; } async command uint8_t HplSam3uTwi0.getEndRx(twi_sr_t *sr){ return sr->bits.endrx; } async command uint8_t HplSam3uTwi0.getEndTx(twi_sr_t *sr){ return sr->bits.endtx; } async command uint8_t HplSam3uTwi0.getRxBufFull(twi_sr_t *sr){ return sr->bits.rxbuff; } async command uint8_t HplSam3uTwi0.getTxBufEmpty(twi_sr_t *sr){ return sr->bits.txbufe; } async command twi_sr_t HplSam3uTwi1.getStatus() { return TWI1->sr; } async command uint8_t HplSam3uTwi1.getTxCompleted(twi_sr_t *sr){ return sr->bits.txcomp; } async command uint8_t HplSam3uTwi1.getRxReady(twi_sr_t *sr){ return sr->bits.rxrdy; } async command uint8_t HplSam3uTwi1.getTxReady(twi_sr_t *sr){ return sr->bits.txrdy; } async command uint8_t HplSam3uTwi1.getSlaveRead(twi_sr_t *sr){ return sr->bits.svread; } async command uint8_t HplSam3uTwi1.getSlaveAccess(twi_sr_t *sr){ return sr->bits.svacc; } async command uint8_t HplSam3uTwi1.getGenCallAccess(twi_sr_t *sr){ return sr->bits.gacc; } async command uint8_t HplSam3uTwi1.getORErr(twi_sr_t *sr){ return sr->bits.ovre; } async command uint8_t HplSam3uTwi1.getNack(twi_sr_t *sr){ return sr->bits.nack; } async command uint8_t HplSam3uTwi1.getArbLost(twi_sr_t *sr){ return sr->bits.arblst; } async command uint8_t HplSam3uTwi1.getClockWaitState(twi_sr_t *sr){ return sr->bits.sclws; } async command uint8_t HplSam3uTwi1.getEOSAccess(twi_sr_t *sr){ return sr->bits.eosacc; } async command uint8_t HplSam3uTwi1.getEndRx(twi_sr_t *sr){ return sr->bits.endrx; } async command uint8_t HplSam3uTwi1.getEndTx(twi_sr_t *sr){ return sr->bits.endtx; } async command uint8_t HplSam3uTwi1.getRxBufFull(twi_sr_t *sr){ return sr->bits.rxbuff; } async command uint8_t HplSam3uTwi1.getTxBufEmpty(twi_sr_t *sr){ return sr->bits.txbufe; } async command void HplSam3uTwi0.setIntTxComp(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.txcomp = 1; *IER = ier; } async command void HplSam3uTwi0.setIntRxReady(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.rxrdy = 1; *IER = ier; } async command void HplSam3uTwi0.setIntTxReady(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.txrdy = 1; *IER = ier; } async command void HplSam3uTwi0.setIntSlaveAccess(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.svacc = 1; *IER = ier; } async command void HplSam3uTwi0.setIntGenCallAccess(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.gacc = 1; *IER = ier; } async command void HplSam3uTwi0.setIntORErr(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.ovre = 1; *IER = ier; } async command void HplSam3uTwi0.setIntNack(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.nack = 1; *IER = ier; } async command void HplSam3uTwi0.setIntArbLost(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.arblst = 1; *IER = ier; } async command void HplSam3uTwi0.setIntClockWaitState(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.sclws = 1; *IER = ier; } async command void HplSam3uTwi0.setIntEOSAccess(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.eosacc = 1; *IER = ier; } async command void HplSam3uTwi0.setIntEndRx(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.endrx = 1; *IER = ier; } async command void HplSam3uTwi0.setIntEndTx(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.endtx = 1; *IER = ier; } async command void HplSam3uTwi0.setIntRxBufFull(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.rxbuff = 1; *IER = ier; } async command void HplSam3uTwi0.setIntTxBufEmpty(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI0_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.txbufe = 1; *IER = ier; } async command void HplSam3uTwi1.setIntTxComp(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.txcomp = 1; *IER = ier; } async command void HplSam3uTwi1.setIntRxReady(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.rxrdy = 1; *IER = ier; } async command void HplSam3uTwi1.setIntTxReady(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.txrdy = 1; *IER = ier; } async command void HplSam3uTwi1.setIntSlaveAccess(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.svacc = 1; *IER = ier; } async command void HplSam3uTwi1.setIntGenCallAccess(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.gacc = 1; *IER = ier; } async command void HplSam3uTwi1.setIntORErr(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.ovre = 1; *IER = ier; } async command void HplSam3uTwi1.setIntNack(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.nack = 1; *IER = ier; } async command void HplSam3uTwi1.setIntArbLost(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.arblst = 1; *IER = ier; } async command void HplSam3uTwi1.setIntClockWaitState(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.sclws = 1; *IER = ier; } async command void HplSam3uTwi1.setIntEOSAccess(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.eosacc = 1; *IER = ier; } async command void HplSam3uTwi1.setIntEndRx(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.endrx = 1; *IER = ier; } async command void HplSam3uTwi1.setIntEndTx(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.endtx = 1; *IER = ier; } async command void HplSam3uTwi1.setIntRxBufFull(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.rxbuff = 1; *IER = ier; } async command void HplSam3uTwi1.setIntTxBufEmpty(){ volatile twi_ier_t* IER = (volatile twi_ier_t *) (TWI1_BASE_ADDR + 0x24); twi_ier_t ier; ier.bits.txbufe = 1; *IER = ier; } async command void HplSam3uTwi0.disIntTxComp(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.txcomp = 1; *IDR = idr; } async command void HplSam3uTwi0.disIntRxReady(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.rxrdy = 1; *IDR = idr; } async command void HplSam3uTwi0.disIntTxReady(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.txrdy = 1; *IDR = idr; } async command void HplSam3uTwi0.disIntSlaveAccess(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.svacc = 1; *IDR = idr; } async command void HplSam3uTwi0.disIntGenCallAccess(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.gacc = 1; *IDR = idr; } async command void HplSam3uTwi0.disIntORErr(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.ovre = 1; *IDR = idr; } async command void HplSam3uTwi0.disIntNack(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.nack = 1; *IDR = idr; } async command void HplSam3uTwi0.disIntArbLost(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.arblst = 1; *IDR = idr; } async command void HplSam3uTwi0.disIntClockWaitState(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.sclws = 1; *IDR = idr; } async command void HplSam3uTwi0.disIntEOSAccess(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.eosacc = 1; *IDR = idr; } async command void HplSam3uTwi0.disIntEndRx(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.endrx = 1; *IDR = idr; } async command void HplSam3uTwi0.disIntEndTx(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.endtx = 1; *IDR = idr; } async command void HplSam3uTwi0.disIntRxBufFull(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.rxbuff = 1; *IDR = idr; } async command void HplSam3uTwi0.disIntTxBufEmpty(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI0_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.txbufe = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntTxComp(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.txcomp = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntRxReady(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.rxrdy = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntTxReady(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.txrdy = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntSlaveAccess(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.svacc = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntGenCallAccess(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.gacc = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntORErr(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.ovre = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntNack(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.nack = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntArbLost(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.arblst = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntClockWaitState(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.sclws = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntEOSAccess(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.eosacc = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntEndRx(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.endrx = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntEndTx(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.endtx = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntRxBufFull(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.rxbuff = 1; *IDR = idr; } async command void HplSam3uTwi1.disIntTxBufEmpty(){ volatile twi_idr_t* IDR = (volatile twi_idr_t *) (TWI1_BASE_ADDR + 0x28); twi_idr_t idr; idr.bits.txbufe = 1; *IDR = idr; } async command uint8_t HplSam3uTwi0.maskIntTxComp(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.txcomp; } async command uint8_t HplSam3uTwi0.maskIntRxReady(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.rxrdy; } async command uint8_t HplSam3uTwi0.maskIntTxReady(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.txrdy; } async command uint8_t HplSam3uTwi0.maskIntSlaveAccess(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.svacc; } async command uint8_t HplSam3uTwi0.maskIntGenCallAccess(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.gacc; } async command uint8_t HplSam3uTwi0.maskIntORErr(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.ovre; } async command uint8_t HplSam3uTwi0.maskIntNack(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.nack; } async command uint8_t HplSam3uTwi0.maskIntArbLost(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.arblst; } async command uint8_t HplSam3uTwi0.maskIntClockWaitState(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.sclws; } async command uint8_t HplSam3uTwi0.maskIntEOSAccess(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.eosacc; } async command uint8_t HplSam3uTwi0.maskIntEndRx(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.endrx; } async command uint8_t HplSam3uTwi0.maskIntEndTx(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.endtx; } async command uint8_t HplSam3uTwi0.maskIntRxBufFull(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.rxbuff; } async command uint8_t HplSam3uTwi0.maskIntTxBufEmpty(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI0_BASE_ADDR + 0x2C); return IMR->bits.txbufe; } async command uint8_t HplSam3uTwi1.maskIntTxComp(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.txcomp; } async command uint8_t HplSam3uTwi1.maskIntRxReady(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.rxrdy; } async command uint8_t HplSam3uTwi1.maskIntTxReady(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.txrdy; } async command uint8_t HplSam3uTwi1.maskIntSlaveAccess(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.svacc; } async command uint8_t HplSam3uTwi1.maskIntGenCallAccess(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.gacc; } async command uint8_t HplSam3uTwi1.maskIntORErr(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.ovre; } async command uint8_t HplSam3uTwi1.maskIntNack(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.nack; } async command uint8_t HplSam3uTwi1.maskIntArbLost(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.arblst; } async command uint8_t HplSam3uTwi1.maskIntClockWaitState(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.sclws; } async command uint8_t HplSam3uTwi1.maskIntEOSAccess(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.eosacc; } async command uint8_t HplSam3uTwi1.maskIntEndRx(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.endrx; } async command uint8_t HplSam3uTwi1.maskIntEndTx(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.endtx; } async command uint8_t HplSam3uTwi1.maskIntRxBufFull(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.rxbuff; } async command uint8_t HplSam3uTwi1.maskIntTxBufEmpty(){ volatile twi_imr_t* IMR = (volatile twi_imr_t *) (TWI1_BASE_ADDR + 0x2C); return IMR->bits.txbufe; } async command uint8_t HplSam3uTwi0.readRxReg(){ volatile twi_rhr_t* RHR = (volatile twi_rhr_t *) (TWI0_BASE_ADDR + 0x30); return RHR->bits.rxdata; } async command uint8_t HplSam3uTwi1.readRxReg(){ volatile twi_rhr_t* RHR = (volatile twi_rhr_t *) (TWI1_BASE_ADDR + 0x30); return RHR->bits.rxdata; } async command void HplSam3uTwi0.setTxReg(uint8_t buffer){ volatile twi_thr_t* THR = (volatile twi_thr_t *) (TWI0_BASE_ADDR + 0x34); twi_thr_t thr = *THR; thr.bits.txdata = buffer; *THR = thr; } async command void HplSam3uTwi1.setTxReg(uint8_t buffer){ volatile twi_thr_t* THR = (volatile twi_thr_t *) (TWI1_BASE_ADDR + 0x34); twi_thr_t thr = *THR; thr.bits.txdata = buffer; *THR = thr; } async event void Twi0ClockConfig.mainClockChanged(){} async event void Twi1ClockConfig.mainClockChanged(){} default async event void Interrupt0.fired(){} default async event void Interrupt1.fired(){} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/HplSam3uTwiInterrupt.nc000066400000000000000000000032361207233610700260140ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ interface HplSam3uTwiInterrupt { async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/HplSam3uTwiP.nc000066400000000000000000000055121207233610700242160ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko * @author Kevin Klues */ configuration HplSam3uTwiP { provides interface HplSam3uTwi as HplSam3uTwi0; provides interface HplSam3uTwi as HplSam3uTwi1; provides interface HplSam3uTwiInterrupt as HplSam3uTwiInterrupt0; provides interface HplSam3uTwiInterrupt as HplSam3uTwiInterrupt1; } implementation { components HplSam3uTwiImplP as HplTwiP; HplSam3uTwi0 = HplTwiP.HplSam3uTwi0; HplSam3uTwi1 = HplTwiP.HplSam3uTwi1; HplSam3uTwiInterrupt0 = HplTwiP.Interrupt0; HplSam3uTwiInterrupt1 = HplTwiP.Interrupt1; // make and connect pins/clock/interrupt for this dude components HplNVICC, HplSam3uClockC, HplSam3uGeneralIOC, LedsC, NoLedsC; HplTwiP.Twi0Interrupt -> HplNVICC.TWI0Interrupt; HplTwiP.Twi1Interrupt -> HplNVICC.TWI1Interrupt; HplTwiP.Twi0ClockControl -> HplSam3uClockC.TWI0PPCntl; HplTwiP.Twi1ClockControl -> HplSam3uClockC.TWI1PPCntl; HplTwiP.Twd0Pin -> HplSam3uGeneralIOC.HplPioA9; HplTwiP.Twd1Pin -> HplSam3uGeneralIOC.HplPioA24; HplTwiP.Twck0Pin -> HplSam3uGeneralIOC.HplPioA10; HplTwiP.Twck1Pin -> HplSam3uGeneralIOC.HplPioA25; HplTwiP.Leds -> NoLedsC; components McuSleepC; HplTwiP.Twi0InterruptWrapper -> McuSleepC; HplTwiP.Twi1InterruptWrapper -> McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/HplSam3uTwiResourceCtrlC.nc000066400000000000000000000040701207233610700265340ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3utwihardware.h" configuration HplSam3uTwiResourceCtrlC { provides interface Resource; provides interface ResourceRequested; uses interface ResourceConfigure; } implementation{ enum { CLIENT_ID = unique( SAM3U_HPLTWI_RESOURCE ), }; components HplSam3uTwiResourceCtrlP as TwiP; Resource = TwiP.Resource[ CLIENT_ID ]; ResourceRequested = TwiP.ResourceRequested[ CLIENT_ID ]; ResourceConfigure = TwiP.ResourceConfigure[ CLIENT_ID ]; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/HplSam3uTwiResourceCtrlP.nc000066400000000000000000000037051207233610700265550ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ configuration HplSam3uTwiResourceCtrlP { provides interface Resource[uint8_t id]; provides interface ResourceRequested[uint8_t id]; uses interface ResourceConfigure[uint8_t id]; } implementation { components new FcfsArbiterC( SAM3U_HPLTWI_RESOURCE ) as Arbiter; Resource = Arbiter; ResourceConfigure = Arbiter; ResourceRequested = Arbiter; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/README000066400000000000000000000006521207233610700223140ustar00rootroot00000000000000Twi Wire Interface (I2C) Implementation for SAM3U @author JeongGil Ko The implementations are based on the preliminary specifications. - The internal address features are not enabled due to the fact that the T2 interfaces do not support these as parameters. It can be easily implemented with Hpl commands. - Needs testing with onboard temperature sensor. The temperature sensor's address is 0x48. tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/Sam3uTwiC.nc000066400000000000000000000075731207233610700235460ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3utwihardware.h" configuration Sam3uTwiC{ provides interface Resource; provides interface ResourceRequested; provides interface I2CPacket as TwiBasicAddr0; provides interface I2CPacket as TwiBasicAddr1; provides interface ResourceConfigure as Configure0[ uint8_t id ]; provides interface ResourceConfigure as Configure1[ uint8_t id ]; provides interface Sam3uTwiInternalAddress as InternalAddress0; provides interface Sam3uTwiInternalAddress as InternalAddress1; uses interface Sam3uTwiConfigure as TwiConfig0; uses interface Sam3uTwiConfigure as TwiConfig1; } implementation{ enum { CLIENT_ID = unique( SAM3U_TWI_BUS ), }; components Sam3uTwiResourceCtrlC as ResourceCtrl; components HplSam3uTwiResourceCtrlC; Resource = ResourceCtrl.Resource[ CLIENT_ID ]; ResourceRequested = HplSam3uTwiResourceCtrlC; ResourceCtrl.TwiResource[ CLIENT_ID ] -> HplSam3uTwiResourceCtrlC; #ifdef SAM3U_TWI_PDC components new Sam3uTwiPDCP(0) as TwiP0; components new Sam3uTwiPDCP(1) as TwiP1; components HplSam3uPdcC; TwiP0.HplPdc -> HplSam3uPdcC.Twi0PdcControl; TwiP1.HplPdc -> HplSam3uPdcC.Twi1PdcControl; #else components new Sam3uTwiP() as TwiP0; components new Sam3uTwiP() as TwiP1; #endif TwiBasicAddr0 = TwiP0.TwiBasicAddr; TwiBasicAddr1 = TwiP1.TwiBasicAddr; TwiConfig0 = TwiP0.Sam3uTwiConfigure[ CLIENT_ID ]; TwiConfig1 = TwiP1.Sam3uTwiConfigure[ CLIENT_ID ]; InternalAddress0 = TwiP0.InternalAddr; InternalAddress1 = TwiP1.InternalAddr; Configure0 = TwiP0.ResourceConfigure; Configure1 = TwiP1.ResourceConfigure; TwiP0.ResourceConfigure[ CLIENT_ID ] <- HplSam3uTwiResourceCtrlC.ResourceConfigure; TwiP1.ResourceConfigure[ CLIENT_ID ] <- HplSam3uTwiResourceCtrlC.ResourceConfigure; components HplSam3uTwiC as HplTwiC; TwiP0.TwiInterrupt -> HplTwiC.HplSam3uTwiInterrupt0; TwiP1.TwiInterrupt -> HplTwiC.HplSam3uTwiInterrupt1; TwiP0.HplTwi -> HplTwiC.HplSam3uTwi0; TwiP1.HplTwi -> HplTwiC.HplSam3uTwi1; components BusyWaitMicroC; TwiP0.BusyWait -> BusyWaitMicroC; TwiP1.BusyWait -> BusyWaitMicroC; components new AlarmTMicro16C() as Alarm0; components new AlarmTMicro16C() as Alarm1; TwiP0.Alarm -> Alarm0; TwiP1.Alarm -> Alarm1; components LedsC; TwiP0.Leds -> LedsC; TwiP1.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/Sam3uTwiConfigure.nc000066400000000000000000000033331207233610700252730ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3utwihardware.h" interface Sam3uTwiConfigure { async command const sam3u_twi_union_config_t* getConfig(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/Sam3uTwiInternalAddress.nc000066400000000000000000000033161207233610700264350ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ interface Sam3uTwiInternalAddress { async command error_t setInternalAddr(uint32_t intAddr, uint8_t size); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/Sam3uTwiP.nc000066400000000000000000000162531207233610700235560ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko * @author Kevin Klues */ #include #include "sam3utwihardware.h" generic module Sam3uTwiP() { provides { interface I2CPacket as TwiBasicAddr; interface ResourceConfigure[uint8_t id]; interface Sam3uTwiInternalAddress as InternalAddr; } uses { interface BusyWait; interface Sam3uTwiConfigure[ uint8_t id ]; interface HplSam3uTwiInterrupt as TwiInterrupt; interface HplSam3uTwi as HplTwi; interface Alarm; interface Leds; } } implementation { enum { IDLE_STATE, TX_STATE, RX_STATE, }; norace uint8_t STATE = IDLE_STATE; const sam3u_twi_union_config_t sam3u_twi_default_config = { cldiv: 0, chdiv: 0, ckdiv: 0 }; norace i2c_flags_t FLAGS; norace uint16_t ADDR; norace uint8_t INIT_LEN; norace uint8_t* INIT_BUFFER; norace uint8_t READ; norace uint8_t WRITE; norace uint8_t IASIZE = 0; norace uint32_t INTADDR = 0; async command error_t InternalAddr.setInternalAddr(uint32_t intAddr, uint8_t size){ if(STATE == IDLE_STATE) { IASIZE = size; INTADDR = intAddr; return SUCCESS; } return FAIL; } async command void ResourceConfigure.configure[ uint8_t id ]() { const sam3u_twi_union_config_t* ONE config; config = call Sam3uTwiConfigure.getConfig[id](); call HplTwi.configureTwi(config); } async command void ResourceConfigure.unconfigure[ uint8_t id ]() { // set a parameter CLEAR! call HplTwi.configureTwi(&sam3u_twi_default_config); } async command error_t TwiBasicAddr.read(i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* buf ) { atomic { if(STATE != IDLE_STATE) return EBUSY; STATE = RX_STATE; } FLAGS = flags; ADDR = addr; INIT_LEN = len; INIT_BUFFER = buf; READ = 0; call HplTwi.getStatus(); if(FLAGS & I2C_START) { call HplTwi.init(); call HplTwi.disSlave(); call HplTwi.setMaster(); call HplTwi.addrSize(IASIZE); call HplTwi.setDeviceAddr((uint8_t)addr); if(IASIZE > 0) call HplTwi.setInternalAddr(INTADDR); call HplTwi.setDirection(1); // read direction call HplTwi.setStart(); } if(INIT_LEN == 1) call HplTwi.setStop(); call HplTwi.setIntNack(); call HplTwi.setIntRxReady(); return SUCCESS; } async command error_t TwiBasicAddr.write(i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* buf ) { atomic { if(STATE != IDLE_STATE) return EBUSY; STATE = TX_STATE; } FLAGS = flags; ADDR = addr; INIT_LEN = len; INIT_BUFFER = buf; WRITE = 0; call HplTwi.getStatus(); if(FLAGS & I2C_START) { call HplTwi.init(); call HplTwi.disSlave(); call HplTwi.setMaster(); call HplTwi.addrSize(IASIZE); call HplTwi.setDeviceAddr((uint8_t)addr); if(IASIZE > 0) call HplTwi.setInternalAddr(INTADDR); call HplTwi.setDirection(0); // write direction } call HplTwi.setTxReg((uint8_t)INIT_BUFFER[WRITE]); call HplTwi.setIntTxReady(); return SUCCESS; } void transferComplete(error_t error) { if(STATE == TX_STATE) { atomic STATE = IDLE_STATE; signal TwiBasicAddr.writeDone(error, ADDR, INIT_LEN, INIT_BUFFER); } else if(STATE == RX_STATE) { atomic STATE = IDLE_STATE; signal TwiBasicAddr.readDone(error, ADDR, INIT_LEN, INIT_BUFFER); } } void handleInterrupt(twi_sr_t *status) { call Leds.led2Toggle(); if(call HplTwi.getNack(status)) { transferComplete(FAIL); } else if(call HplTwi.getRxReady(status)) { INIT_BUFFER[READ] = call HplTwi.readRxReg(); // read out rx buffer READ++; if(READ == INIT_LEN) { call HplTwi.setIntTxComp(); return; } if(READ == (INIT_LEN-1)) { if(FLAGS & I2C_STOP) { call HplTwi.setStop(); } } call HplTwi.setIntRxReady(); } else if(call HplTwi.getTxCompleted(status)) { transferComplete(SUCCESS); } else if(call HplTwi.getTxReady(status)) { WRITE++; if(WRITE == INIT_LEN) { if(FLAGS & I2C_STOP) call HplTwi.setStop(); call HplTwi.setIntTxComp(); } else { call HplTwi.setTxReg((uint8_t)INIT_BUFFER[WRITE]); call HplTwi.setIntTxReady(); } } } async event void TwiInterrupt.fired() { twi_sr_t status; call HplTwi.disableAllInterrupts(); /* NACK errata handling */ /* Do not poll the TWI_SR */ /* Wait 3 x 9 TWCK pulse (max) 2 if IADRR not used, before reading TWI_SR */ /* From 400Khz down to 1Khz, the time to wait will be in us range.*/ // TODO: Fixme // The delay used below is specific fo 100KHz, ned to change it to depend on // the clock frequency actually specified in the configuration call HplTwi.disableClock(); //call Alarm.start(160); call BusyWait.wait(160); status = call HplTwi.getStatus(); call HplTwi.enableClock(); handleInterrupt(&status); } async event void Alarm.fired() { twi_sr_t status; call Leds.led1On(); status = call HplTwi.getStatus(); call HplTwi.enableClock(); handleInterrupt(&status); } default async command const sam3u_twi_union_config_t* Sam3uTwiConfigure.getConfig[uint8_t id]() { return &sam3u_twi_default_config; } default async event void TwiBasicAddr.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data){} default async event void TwiBasicAddr.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data){} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/Sam3uTwiPDCP.nc000066400000000000000000000245571207233610700241130ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include #include "sam3utwihardware.h" generic module Sam3uTwiPDCP(uint8_t channel) { provides interface I2CPacket as TwiBasicAddr; provides interface ResourceConfigure[uint8_t id]; provides interface Sam3uTwiInternalAddress as InternalAddr; uses interface Leds; uses interface Sam3uTwiConfigure[ uint8_t id ]; uses interface HplSam3uTwiInterrupt as TwiInterrupt; uses interface HplSam3uTwi as HplTwi; uses interface HplSam3uPdc as HplPdc; } implementation { typedef enum { RX_STATE, TX_STATE, IDLE_STATE, } sam3u_twi_action_state_t; const sam3u_twi_union_config_t sam3u_twi_default_config = { cldiv: 0, chdiv: 0, ckdiv: 0 }; norace sam3u_twi_action_state_t ACTION_STATE = IDLE_STATE; norace uint16_t ADDR; norace uint8_t LEN; norace uint8_t* BUFFER; norace i2c_flags_t FLAGS; norace uint8_t* INIT_BUFFER; norace uint8_t INIT_LEN; norace uint8_t READ; norace uint8_t WRITE; norace uint8_t IASIZE = 0; norace uint32_t INTADDR = 0; void initTwi(){ switch(channel){ case 0: call HplTwi.init0(); break; case 1: call HplTwi.init1(); break; } } async command void InternalAddr.setInternalAddrSize(uint8_t size){ atomic IASIZE = size; } async command void InternalAddr.setInternalAddr(uint32_t intAddr){ atomic INTADDR = intAddr; } async command void ResourceConfigure.configure[ uint8_t id ]() { const sam3u_twi_union_config_t* ONE config; config = call Sam3uTwiConfigure.getConfig[id](); switch(channel){ case 0: call HplTwi.configureTwi0(config); call HplTwi.setInterruptID(id); break; case 1: call HplTwi.configureTwi1(config); call HplTwi.setInterruptID(id); break; } } async command void ResourceConfigure.unconfigure[ uint8_t id ]() { switch(channel){ case 0: call HplTwi.configureTwi0(&sam3u_twi_default_config); break; case 1: call HplTwi.configureTwi1(&sam3u_twi_default_config); break; } } async command error_t TwiBasicAddr.read(i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* buf ) { const sam3u_twi_union_config_t* ONE config; config = call Sam3uTwiConfigure.getConfig[0](); if(ACTION_STATE != RX_STATE){ if(ACTION_STATE != IDLE_STATE){ return EBUSY; } atomic INIT_BUFFER = buf; atomic INIT_LEN = len; atomic ACTION_STATE = RX_STATE; atomic READ = 0; initTwi(); } atomic FLAGS = flags; atomic ADDR = addr; atomic LEN = len; atomic BUFFER = buf; switch(channel){ case 0: call HplTwi.disMaster0(); call HplTwi.disSlave0(); call HplTwi.setMaster0(); //set up PDC registers call HplPdc.setRxPtr(buf); call HplPdc.setRxCounter(len); //set up master read mode call HplTwi.addrSize0(IASIZE); call HplTwi.setDeviceAddr0((uint8_t)addr); // this is for the connected sensor if(IASIZE > 0) call HplTwi.setInternalAddr0(INTADDR); call HplTwi.setDirection0(1); // read direction //enable interrupt for PDC call HplTwi.setIntRxReady0(); //start the read process via pdc if(flags == I2C_START){ if(len == 1) call HplTwi.setStop0(); call HplPdc.enablePdcRx(); call HplTwi.setStart0(); } break; case 1: call HplTwi.disMaster1(); call HplTwi.disSlave1(); call HplTwi.setMaster1(); //set up PDC registers call HplPdc.setRxPtr(buf); call HplPdc.setRxCounter(len); //set up master read mode call HplTwi.addrSize1(IASIZE); call HplTwi.setDeviceAddr1((uint8_t)addr); // this is for the connected sensor if(IASIZE > 0) call HplTwi.setInternalAddr1(INTADDR); call HplTwi.setDirection1(1); // read direction //enable interrupt for PDC call HplTwi.setIntRxReady1(); //start the read process via pdc if(flags == I2C_START){ if(len == 1) call HplTwi.setStop1(); call HplPdc.enablePdcRx(); call HplTwi.setStart1(); } break; } return SUCCESS; } async command error_t TwiBasicAddr.write(i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* buf ) { if(ACTION_STATE != TX_STATE){ if(ACTION_STATE != IDLE_STATE){ return EBUSY; } atomic INIT_BUFFER = buf; atomic INIT_LEN = len; atomic ACTION_STATE = TX_STATE; atomic WRITE = 0; initTwi(); } atomic FLAGS = flags; atomic ADDR = addr; atomic LEN = len; atomic BUFFER = buf; switch(channel){ case 0: call HplPdc.setTxPtr(buf); call HplPdc.setTxCounter(len); call HplTwi.disSlave0(); call HplTwi.setMaster0(); call HplTwi.addrSize0(IASIZE); call HplTwi.setDeviceAddr0((uint8_t)addr); if(IASIZE > 0) call HplTwi.setInternalAddr0(INTADDR); call HplTwi.setDirection0(0); //write direction call HplTwi.setIntTxReady0(); if(flags == I2C_START){ call HplPdc.enablePdcTx(); if(len == 1){ call HplTwi.setIntTxComp0(); call HplTwi.setStop0(); } } break; case 1: call HplPdc.setTxPtr(buf); call HplPdc.setTxCounter(len); call HplTwi.disSlave1(); call HplTwi.setMaster1(); call HplTwi.addrSize1(IASIZE); call HplTwi.setDeviceAddr1((uint8_t)addr); if(IASIZE > 0) call HplTwi.setInternalAddr1(INTADDR); call HplTwi.setDirection1(0); //write direction call HplTwi.setIntTxReady1(); if(flags == I2C_START){ call HplPdc.enablePdcTx(); if(len == 1){ call HplTwi.setIntTxComp1(); call HplTwi.setStop1(); } } break; } return SUCCESS; } async event void TwiInterrupt.fired0(){ if(ACTION_STATE == RX_STATE){ if(call HplPdc.getRxCounter()){ if(call HplPdc.getRxCounter() == 1){ call HplTwi.setStop0(); } }else if(call HplPdc.getRxCounter() == 0){ atomic ACTION_STATE = IDLE_STATE; call HplPdc.disablePdcRx(); signal TwiBasicAddr.readDone(SUCCESS, ADDR, INIT_LEN, INIT_BUFFER); } }else { // using PDC instead of TWI next block /***/ if(call HplPdc.getTxCounter()){ if(call HplPdc.getTxCounter() == 1){ call HplTwi.setStop0(); atomic ACTION_STATE = IDLE_STATE; call HplTwi.disIntTxReady0(); call HplTwi.disIntTxComp0(); call HplPdc.disablePdcTx(); signal TwiBasicAddr.writeDone(SUCCESS, ADDR, INIT_LEN, INIT_BUFFER); } }else if(call HplPdc.getTxCounter() == 0){ atomic ACTION_STATE = IDLE_STATE; call HplTwi.disIntTxReady0(); call HplTwi.disIntTxComp0(); call HplPdc.disablePdcTx(); call Leds.led2Toggle(); signal TwiBasicAddr.writeDone(SUCCESS, ADDR, INIT_LEN, INIT_BUFFER); } /***/ /**** WRITE ++; if(INIT_LEN != 1 && WRITE == INIT_LEN){ //if(INIT_LEN != 1 && call HplPdc.getTxCounter() == 0 ){ call HplTwi.disIntTxReady0(); call HplTwi.disIntTxComp0(); //call HplPdc.setTxPtr(INIT_BUFFER); //call HplPdc.setTxCounter(1); //call HplPdc.enablePdcTx(); call HplTwi.setStop0(); call HplPdc.disablePdcTx(); atomic ACTION_STATE = IDLE_STATE; signal TwiBasicAddr.writeDone(SUCCESS, ADDR, INIT_LEN, INIT_BUFFER); call Leds.led2Toggle(); }else if( INIT_LEN == 1){ call Leds.led1Toggle(); atomic ACTION_STATE = IDLE_STATE; call HplTwi.disIntTxReady0(); call HplTwi.disIntTxComp0(); call HplPdc.disablePdcTx(); signal TwiBasicAddr.writeDone(SUCCESS, ADDR, INIT_LEN, INIT_BUFFER); } ****/ } } async event void TwiInterrupt.fired1(){ if(ACTION_STATE == RX_STATE){ if(call HplPdc.getRxCounter()){ if(call HplPdc.getRxCounter() == 1){ call HplTwi.setStop1(); } }else if(call HplPdc.getRxCounter() == 0){ atomic ACTION_STATE = IDLE_STATE; call HplPdc.disablePdcRx(); signal TwiBasicAddr.readDone(SUCCESS, ADDR, INIT_LEN, INIT_BUFFER); } }else{ WRITE ++; if(INIT_LEN != 1 && WRITE == INIT_LEN){ call HplTwi.disIntTxReady1(); call HplTwi.disIntTxComp1(); //call HplPdc.setTxPtr(INIT_BUFFER); //call HplPdc.setTxCounter(1); //call HplPdc.enablePdcTx(); call HplTwi.setStop1(); call HplPdc.disablePdcTx(); atomic ACTION_STATE = IDLE_STATE; signal TwiBasicAddr.writeDone(SUCCESS, ADDR, INIT_LEN, INIT_BUFFER); call Leds.led0Toggle(); }else if( INIT_LEN == 1){ call Leds.led1Toggle(); atomic ACTION_STATE = IDLE_STATE; call HplTwi.disIntTxReady1(); call HplTwi.disIntTxComp1(); call HplPdc.disablePdcTx(); signal TwiBasicAddr.writeDone(SUCCESS, ADDR, INIT_LEN, INIT_BUFFER); } } } default async command const sam3u_twi_union_config_t* Sam3uTwiConfigure.getConfig[uint8_t id]() { return &sam3u_twi_default_config; } default async event void TwiBasicAddr.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data){} default async event void TwiBasicAddr.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data){} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/Sam3uTwiResourceCtrlC.nc000066400000000000000000000036361207233610700260770ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ configuration Sam3uTwiResourceCtrlC { provides interface Resource[ uint8_t id ]; uses interface Resource as TwiResource[ uint8_t id ]; } implementation { components Sam3uTwiResourceCtrlP as TwiP; components LedsC, NoLedsC; Resource = TwiP.Resource; TwiResource = TwiP.TwiResource; TwiP.Leds -> NoLedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/Sam3uTwiResourceCtrlP.nc000066400000000000000000000052131207233610700261050ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * @author JeongGil Ko */ #include "sam3utwihardware.h" module Sam3uTwiResourceCtrlP{ provides interface Resource[ uint8_t id ]; uses interface Resource as TwiResource[ uint8_t id ]; uses interface Leds; } implementation{ async command error_t Resource.immediateRequest[ uint8_t id ]() { return call TwiResource.immediateRequest[ id ](); } async command error_t Resource.request[ uint8_t id ]() { return call TwiResource.request[ id ](); } async command bool Resource.isOwner[ uint8_t id ]() { return call TwiResource.isOwner[ id ](); } async command error_t Resource.release[ uint8_t id ]() { return call TwiResource.release[ id ](); } event void TwiResource.granted[ uint8_t id ]() { signal Resource.granted[ id ](); } default async command error_t TwiResource.request[ uint8_t id ]() { return FAIL; } default async command error_t TwiResource.immediateRequest[ uint8_t id ]() { return FAIL; } default async command error_t TwiResource.release[ uint8_t id ]() {return FAIL;} default event void Resource.granted[ uint8_t id ]() {} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/twi/sam3utwihardware.h000066400000000000000000000177111207233610700251030ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * TWI register definitions. * * @author JeongGil Ko */ #ifndef _SAM3UTWIHARDWARE_H #define _SAM3UTWIHARDWARE_H /** * TWI Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 665 */ typedef union { uint32_t flat; struct { uint32_t start : 1; uint32_t stop : 1; uint32_t msen : 1; uint32_t msdis : 1; uint32_t sven : 1; uint32_t svdis : 1; uint32_t quick : 1; uint32_t swrst : 1; uint32_t reserved0 : 8; uint32_t reserved1 : 16; } __attribute__((__packed__)) bits; } twi_cr_t; /** * TWI Master Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 667 */ typedef union { uint32_t flat; struct { uint32_t reserved0 : 8; uint32_t iadrsz : 2; uint32_t reserved1 : 2; uint32_t mread : 1; uint32_t reserved2 : 3; uint32_t dadr : 7; uint32_t reserved3 : 1; uint32_t reserved4 : 8; } __attribute__((__packed__)) bits; } twi_mmr_t; /** * TWI Slave Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 668 */ typedef union { uint32_t flat; struct { uint32_t reserved0 : 16; uint32_t sadr : 7; uint32_t reserved1 : 1; uint32_t reserved2 : 8; } __attribute__((__packed__)) bits; } twi_smr_t; /** * TWI Internal Address Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 669 */ typedef union { uint32_t flat; struct { uint32_t iadr : 24; uint32_t reserved0 : 8; } __attribute__((__packed__)) bits; } twi_iadr_t; /** * TWI Clock Waveform Generator Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 670 */ typedef union { uint32_t flat; struct { uint32_t cldiv : 8; uint32_t chdiv : 8; uint32_t ckdiv : 3; uint32_t reserved0 : 5; uint32_t reserved1 : 8; } __attribute__((__packed__)) bits; } twi_cwgr_t; /** * TWI Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 671 */ typedef union { uint32_t flat; struct { uint32_t txcomp : 1; uint32_t rxrdy : 1; uint32_t txrdy : 1; uint32_t svread : 1; uint32_t svacc : 1; uint32_t gacc : 1; uint32_t ovre : 1; uint32_t reserved0 : 1; uint32_t nack : 1; uint32_t arblst : 1; uint32_t sclws : 1; uint32_t eosacc : 1; uint32_t endrx : 1; uint32_t endtx : 1; uint32_t rxbuff : 1; uint32_t txbufe : 1; uint32_t reserved1 : 16; } __attribute__((__packed__)) bits; } twi_sr_t; /** * TWI Interrupt Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 675 */ typedef union { uint32_t flat; struct { uint32_t txcomp : 1; uint32_t rxrdy : 1; uint32_t txrdy : 1; uint32_t reserved0 : 1; uint32_t svacc : 1; uint32_t gacc : 1; uint32_t ovre : 1; uint32_t reserved1 : 1; uint32_t nack : 1; uint32_t arblst : 1; uint32_t sclws : 1; uint32_t eosacc : 1; uint32_t endrx : 1; uint32_t endtx : 1; uint32_t rxbuff : 1; uint32_t txbufe : 1; uint32_t reserved2 : 16; } __attribute__((__packed__)) bits; } twi_ier_t; /** * TWI Interrupt Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 676 */ typedef union { uint32_t flat; struct { uint8_t txcomp : 1; uint8_t rxrdy : 1; uint8_t txrdy : 1; uint8_t reserved0 : 1; uint8_t svacc : 1; uint8_t gacc : 1; uint8_t ovre : 1; uint8_t reserved1 : 1; uint8_t nack : 1; uint8_t arblst : 1; uint8_t sclws : 1; uint8_t eosacc : 1; uint8_t endrx : 1; uint8_t endtx : 1; uint8_t rxbuff : 1; uint8_t txbufe : 1; uint16_t reserved2 : 16; } __attribute__((__packed__)) bits; } twi_idr_t; /** * TWI Interrupt Mask Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 677 */ typedef union { uint32_t flat; struct { uint32_t txcomp : 1; uint32_t rxrdy : 1; uint32_t txrdy : 1; uint32_t reserved0 : 1; uint32_t svacc : 1; uint32_t gacc : 1; uint32_t ovre : 1; uint32_t reserved1 : 1; uint32_t nack : 1; uint32_t arblst : 1; uint32_t sclws : 1; uint32_t eosacc : 1; uint32_t endrx : 1; uint32_t endtx : 1; uint32_t rxbuff : 1; uint32_t txbufe : 1; uint32_t reserved2 : 16; } __attribute__((__packed__)) bits; } twi_imr_t; /** * TWI Receive Holding Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 678 */ typedef union { uint32_t flat; struct { uint32_t rxdata : 8; uint32_t reserved0 : 8; uint32_t reserved1 : 16; } __attribute__((__packed__)) bits; } twi_rhr_t; /** * TWI Transmit Holding Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 678 */ typedef union { uint32_t flat; struct { uint32_t txdata : 8; uint32_t reserved0 : 8; uint32_t reserved1 : 16; } __attribute__((__packed__)) bits; } twi_thr_t; /** * TWI Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary, p. 664 */ typedef struct twi { volatile twi_cr_t cr; volatile twi_mmr_t mmr; volatile twi_smr_t smr; volatile twi_iadr_t iadr; volatile twi_cwgr_t cwgr; uint32_t reserved0[3]; volatile twi_sr_t sr; volatile twi_ier_t ier; volatile twi_idr_t idr; volatile twi_imr_t imr; volatile twi_rhr_t rhr; volatile twi_thr_t thr; } twi_t; volatile twi_t* TWI0 = (volatile twi_t*) 0x40084000; // base addr for twi0 volatile twi_t* TWI1 = (volatile twi_t*) 0x40088000; // base addr for twi1 #define TWI0_BASE_ADDR 0x40084000 #define TWI1_BASE_ADDR 0x40088000 #define SAM3U_TWI_BUS "SAM3UTWI.Resource" #define SAM3U_HPLTWI_RESOURCE "SAM3UTWI.Resource" typedef struct { unsigned int cldiv :8; unsigned int chdiv :8; unsigned int ckdiv :3; } sam3u_twi_union_config_t; #endif // _SAM3UTWIHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/uart/000077500000000000000000000000001207233610700216015ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/uart/HilSam3UartC.nc000066400000000000000000000051301207233610700243210ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Wanja Hofer */ configuration HilSam3UartC { provides { interface StdControl; interface UartByte; interface UartStream; } } implementation { components HilSam3UartP; StdControl = HilSam3UartP; UartByte = HilSam3UartP; UartStream = HilSam3UartP; components HplSam3UartC; HilSam3UartP.HplSam3UartInterrupts -> HplSam3UartC; HilSam3UartP.HplSam3UartStatus -> HplSam3UartC; HilSam3UartP.HplSam3UartControl -> HplSam3UartC; HilSam3UartP.HplSam3UartConfig -> HplSam3UartC; #ifdef THREADS components PlatformInterruptC; HplSam3UartC.PlatformInterrupt -> PlatformInterruptC; #endif components MainC; MainC.SoftwareInit -> HilSam3UartP.Init; components HplNVICC; HilSam3UartP.UartIrqControl -> HplNVICC.DBGUInterrupt; components HplSam3uGeneralIOC; HilSam3UartP.UartPin1 -> HplSam3uGeneralIOC.HplPioA11; HilSam3UartP.UartPin2 -> HplSam3uGeneralIOC.HplPioA12; components HplSam3uClockC; HilSam3UartP.UartClockControl -> HplSam3uClockC.DBGUPPCntl; HilSam3UartP.ClockConfig -> HplSam3uClockC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/uart/sam3uarthardware.h000066400000000000000000000054201207233610700252300ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Definitions specific to the SAM3U UART chip. * * @author Wanja Hofer */ #ifndef SAM3UUARTHARDWARE_H #define SAM3UUARTHARDWARE_H #include "uarthardware.h" // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 667 volatile uint32_t* UART_BASE = (volatile uint32_t *) 0x400e0600; volatile uart_cr_t* UART_CR = (volatile uart_cr_t*) 0x400e0600; // control, wo volatile uart_mr_t* UART_MR = (volatile uart_mr_t*) 0x400e0604; // mode, rw, reset 0x0 volatile uart_ier_t* UART_IER = (volatile uart_ier_t*) 0x400e0608; // interrupt enable, wo volatile uart_idr_t* UART_IDR = (volatile uart_idr_t*) 0x400e060c; // interrupt disable, wo volatile uart_imr_t* UART_IMR = (volatile uart_imr_t*) 0x400e0610; // interrupt mask, ro, reset 0x0 volatile uart_sr_t* UART_SR = (volatile uart_sr_t*) 0x400e0614; // status, ro volatile uart_rhr_t* UART_RHR = (volatile uart_rhr_t*) 0x400e0618; // receive holding, ro, reset 0x0 volatile uart_thr_t* UART_THR = (volatile uart_thr_t*) 0x400e061c; // transmit holding, wo volatile uart_brgr_t* UART_BRGR = (volatile uart_brgr_t*) 0x400e0620; // baud rate generator, rw, reset 0x0 #endif // SAM3UUARTHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/000077500000000000000000000000001207233610700217645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/HplSam3uUsart0C.nc000066400000000000000000000044631207233610700251530ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ configuration HplSam3uUsart0C{ provides interface HplSam3uUsartControl; } implementation{ components HplSam3uUsart0P as UsartP; HplSam3uUsartControl = UsartP.Usart; components HplSam3uGeneralIOC, HplSam3uClockC, HplNVICC; UsartP.USART_CTS0 -> HplSam3uGeneralIOC.HplPioB8; UsartP.USART_RTS0 -> HplSam3uGeneralIOC.HplPioB7; UsartP.USART_RXD0 -> HplSam3uGeneralIOC.HplPioA19; UsartP.USART_SCK0 -> HplSam3uGeneralIOC.HplPioA17; UsartP.USART_TXD0 -> HplSam3uGeneralIOC.HplPioA18; UsartP.USARTClockControl0 -> HplSam3uClockC.US0PPCntl; UsartP.USARTInterrupt0 -> HplNVICC.US1Interrupt; UsartP.ClockConfig -> HplSam3uClockC; components McuSleepC; UsartP.Usart0InterruptWrapper -> McuSleepC; components LedsC; UsartP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/HplSam3uUsart0P.nc000066400000000000000000000212151207233610700251620ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include module HplSam3uUsart0P{ provides interface HplSam3uUsartControl as Usart; uses{ interface HplNVICInterruptCntl as USARTInterrupt0; interface HplSam3GeneralIOPin as USART_CTS0; interface HplSam3GeneralIOPin as USART_RTS0; interface HplSam3GeneralIOPin as USART_RXD0; interface HplSam3GeneralIOPin as USART_SCK0; interface HplSam3GeneralIOPin as USART_TXD0; interface HplSam3PeripheralClockCntl as USARTClockControl0; interface HplSam3Clock as ClockConfig; interface FunctionWrapper as Usart0InterruptWrapper; interface Leds; } } implementation{ #define USART0_BASE_ADDR 0x40090000 enum{ S_READ, S_WRITE, S_IDLE, }; uint8_t STATE; void enableInterruptRead(){ // enables interrupt for read volatile usart_ier_t *IER = (volatile usart_ier_t*) (USART0_BASE_ADDR + 0x8); usart_ier_t ier = *IER; ier.bits.endrx = 1; *IER = ier; } void enableInterruptWrite(){ // enables interrupt for write volatile usart_ier_t *IER = (volatile usart_ier_t*) (USART0_BASE_ADDR + 0x8); usart_ier_t ier = *IER; ier.bits.endtx = 1; *IER = ier; } void disableInterrupt(){ // disable all interrupts volatile usart_idr_t *IDR = (volatile usart_idr_t*) (USART0_BASE_ADDR + 0xC); usart_idr_t idr = *IDR; idr.bits.endtx = 1; idr.bits.endrx = 1; *IDR = idr; } command void Usart.init(){ // init pins and clock call USARTInterrupt0.configure(IRQ_PRIO_USART1); call USARTInterrupt0.enable(); call USARTClockControl0.enable(); call USART_CTS0.disablePioControl(); call USART_CTS0.selectPeripheralA(); call USART_RTS0.disablePioControl(); call USART_RTS0.selectPeripheralA(); call USART_RXD0.disablePioControl(); call USART_RXD0.selectPeripheralA(); call USART_SCK0.disablePioControl(); call USART_SCK0.selectPeripheralA(); call USART_TXD0.disablePioControl(); call USART_TXD0.selectPeripheralA(); } command void Usart.configure(uint32_t mode, uint32_t baudrate){ //configure control mode and baud rate volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART0_BASE_ADDR + 0x0); usart_cr_t cr = *CR; volatile usart_mr_t *MR = (volatile usart_mr_t*) (USART0_BASE_ADDR + 0x4); usart_mr_t mr = *MR; volatile usart_brgr_t *BRGR = (volatile usart_brgr_t*) (USART0_BASE_ADDR + 0x20); usart_brgr_t brgr = *BRGR; uint32_t cd; uint32_t masterClock = call ClockConfig.getMainClockSpeed(); cd = (masterClock * 1000 / baudrate) / 16; cr.bits.rsttx = 1; cr.bits.rstrx = 1; cr.bits.rxdis = 1; cr.bits.txdis = 1; *CR = cr; mr = (usart_mr_t) mode; *MR = mr; if(mr.bits.sync_cpha == 0 && mr.bits.over == 0){ // Async mode and no oversampling brgr.bits.fp = 0; brgr.bits.cd = cd; // check 35.7.9 of sam3u specs for other modes *BRGR = brgr; } STATE = S_IDLE; } command void Usart.enableTx(){ volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART0_BASE_ADDR + 0x0); usart_cr_t cr; cr.bits.txdis = 0; *CR = cr; cr.bits.txen = 1; *CR = cr; } command void Usart.disableTx(){ volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART0_BASE_ADDR + 0x0); usart_cr_t cr = *CR; cr.bits.txdis = 1; *CR = cr; } command void Usart.enableRx(){ volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART0_BASE_ADDR + 0x0); usart_cr_t cr = *CR; cr.bits.rxen = 1; *CR = cr; } command void Usart.enableRxInterrupt(){ enableInterruptRead(); } command void Usart.enableTxInterrupt(){ enableInterruptWrite(); } command void Usart.disableRx(){ volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART0_BASE_ADDR + 0x0); usart_cr_t cr = *CR; cr.bits.rxdis = 1; *CR = cr; } command error_t Usart.write(uint8_t sync, uint16_t data, uint32_t timeout){ volatile usart_thr_t *THR = (volatile usart_thr_t*) (USART0_BASE_ADDR + 0x1C); usart_thr_t thr = *THR; call Usart.enableTx(); thr.bits.txsynh = sync; thr.bits.txchr = data; *THR = thr; // enable interrupts here! STATE = S_WRITE; enableInterruptWrite(); return SUCCESS; } command error_t Usart.read(uint16_t *data, uint32_t timeout){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART0_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; volatile usart_rhr_t *RHR = (volatile usart_rhr_t*) (USART0_BASE_ADDR + 0x18); usart_rhr_t rhr = *RHR; /* if(timeout == 0){ while(csr.bits.rxrdy == 0); }else{ while(csr.bits.rxrdy == 0){ timeout --; if(timeout == 0) return FAIL; } } */ STATE = S_READ; *data = rhr.bits.rxchr; //&recv_data = data; // enable interrupts here! enableInterruptRead(); return SUCCESS; } command bool Usart.isDataAvailable(){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART0_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; if(csr.bits.rxrdy != 0) return TRUE; else return FALSE; } command void Usart.setIrdaFilter(uint32_t filter){ volatile usart_if_t *IF = (volatile usart_if_t*) (USART0_BASE_ADDR + 0x4C); usart_if_t if_usart = *IF; if_usart = (usart_if_t) filter; *IF = if_usart; } command error_t Usart.putChar(uint8_t sync, uint16_t data){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART0_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; volatile usart_thr_t *THR = (volatile usart_thr_t*) (USART0_BASE_ADDR + 0x1C); usart_thr_t thr = *THR; while(csr.bits.txempty == 0); thr.bits.txsynh = sync; thr.bits.txchr = data; *THR = thr; csr = *CSR; while(csr.bits.txempty == 0); STATE = S_WRITE; // enable interrupts here! enableInterruptWrite(); return SUCCESS; } command bool Usart.isRxReady(){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART0_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; if(csr.bits.rxrdy != 0) return FALSE; else return TRUE; } command error_t Usart.getChar(uint16_t *data){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART0_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; volatile usart_rhr_t *RHR = (volatile usart_rhr_t*) (USART0_BASE_ADDR + 0x18); usart_rhr_t rhr = *RHR; while(csr.bits.rxrdy == 0); *data = rhr.bits.rxchr; STATE = S_READ; // enable interrupts here! enableInterruptRead(); return SUCCESS; } __attribute__((interrupt)) void Usart1IrqHandler() @C() @spontaneous(){ uint8_t recv_data; atomic { call Usart0InterruptWrapper.preamble(); disableInterrupt(); } if(STATE == S_WRITE && CSR->bits.txrdy){ signal Usart.writeDone(); // tx done }else if(CSR->bits.rxrdy){ atomic recv_data = (uint8_t) RHR->bits.rxchr; signal Usart.readDone(recv_data); } atomic { STATE = S_IDLE; enableInterruptRead(); call Usart0InterruptWrapper.postamble(); } } async event void ClockConfig.mainClockChanged() {}; default event void Usart.writeDone(){} default event void Usart.readDone(uint8_t data){} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/HplSam3uUsart1C.nc000066400000000000000000000044661207233610700251570ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ configuration HplSam3uUsart1C{ provides interface HplSam3uUsartControl; } implementation{ components HplSam3uUsart1P as UsartP; HplSam3uUsartControl = UsartP.Usart; components HplSam3uGeneralIOC, HplSam3uClockC, HplNVICC; UsartP.USART_CTS1 -> HplSam3uGeneralIOC.HplPioA23; UsartP.USART_RTS1 -> HplSam3uGeneralIOC.HplPioA22; UsartP.USART_RXD1 -> HplSam3uGeneralIOC.HplPioA21; UsartP.USART_SCK1 -> HplSam3uGeneralIOC.HplPioA24; UsartP.USART_TXD1 -> HplSam3uGeneralIOC.HplPioA20; UsartP.USARTClockControl1 -> HplSam3uClockC.US1PPCntl; UsartP.USARTInterrupt1 -> HplNVICC.US1Interrupt; UsartP.ClockConfig -> HplSam3uClockC; components McuSleepC; UsartP.Usart1InterruptWrapper -> McuSleepC; components LedsC; UsartP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/HplSam3uUsart1P.nc000066400000000000000000000224671207233610700251750ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include module HplSam3uUsart1P{ provides interface HplSam3uUsartControl as Usart; uses{ interface HplNVICInterruptCntl as USARTInterrupt1; interface HplSam3GeneralIOPin as USART_CTS1; interface HplSam3GeneralIOPin as USART_RTS1; interface HplSam3GeneralIOPin as USART_RXD1; interface HplSam3GeneralIOPin as USART_SCK1; interface HplSam3GeneralIOPin as USART_TXD1; interface HplSam3PeripheralClockCntl as USARTClockControl1; interface HplSam3Clock as ClockConfig; interface FunctionWrapper as Usart1InterruptWrapper; interface Leds; } } implementation{ #define USART1_BASE_ADDR 0x40094000 enum{ S_READ, S_WRITE, S_IDLE, }; uint8_t STATE; void enableInterruptRead(){ // enables interrupt for read volatile usart_ier_t *IER = (volatile usart_ier_t*) (USART1_BASE_ADDR + 0x8); usart_ier_t ier = *IER; ier.bits.rxrdy = 1; *IER = ier; } void enableInterruptWrite(){ // enables interrupt for write volatile usart_ier_t *IER = (volatile usart_ier_t*) (USART1_BASE_ADDR + 0x8); usart_ier_t ier = *IER; //ier.flat = 0xFFFFFFFF; ier.bits.txrdy = 1; *IER = ier; } void disableInterrupt(){ // disable all interrupts volatile usart_idr_t *IDR = (volatile usart_idr_t*) (USART1_BASE_ADDR + 0xC); usart_idr_t idr = *IDR; idr.bits.txrdy = 1; idr.bits.rxrdy = 1; *IDR = idr; } void disableRxInterrupt(){ volatile usart_idr_t *IDR = (volatile usart_idr_t*) (USART1_BASE_ADDR + 0xC); usart_idr_t idr = *IDR; idr.bits.rxrdy = 1; *IDR = idr; } void disableTxInterrupt(){ volatile usart_idr_t *IDR = (volatile usart_idr_t*) (USART1_BASE_ADDR + 0xC); usart_idr_t idr = *IDR; idr.bits.txrdy = 1; *IDR = idr; } command void Usart.init(){ // init pins and clock call USART_CTS1.disablePioControl(); call USART_CTS1.selectPeripheralB(); call USART_RTS1.disablePioControl(); call USART_RTS1.selectPeripheralB(); call USART_RXD1.disablePioControl(); call USART_RXD1.selectPeripheralA(); call USART_SCK1.disablePioControl(); call USART_SCK1.selectPeripheralB(); call USART_TXD1.disablePioControl(); call USART_TXD1.selectPeripheralA(); call USARTClockControl1.enable(); } command void Usart.configure(uint32_t mode, uint32_t baudrate){ //configure control mode and baud rate volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART1_BASE_ADDR + 0x0); usart_cr_t cr = *CR; volatile usart_mr_t *MR = (volatile usart_mr_t*) (USART1_BASE_ADDR + 0x4); usart_mr_t mr = *MR; volatile usart_brgr_t *BRGR = (volatile usart_brgr_t*) (USART1_BASE_ADDR + 0x20); usart_brgr_t brgr = *BRGR; uint32_t cd; uint32_t masterClock = call ClockConfig.getMainClockSpeed(); cd = (masterClock * 1000 / baudrate) / 16; cr.bits.rsttx = 1; cr.bits.rstrx = 1; cr.bits.rxdis = 1; cr.bits.txdis = 1; *CR = cr; mr = (usart_mr_t) mode; *MR = mr; if(mr.bits.sync_cpha == 0 && mr.bits.over == 0){ // Async mode and no oversampling brgr.bits.fp = 0; brgr.bits.cd = cd; // check 35.7.9 of sam3u specs for other modes *BRGR = brgr; } call USARTInterrupt1.configure(IRQ_PRIO_USART1); call USARTInterrupt1.enable(); STATE = S_IDLE; } command void Usart.enableTx(){ volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART1_BASE_ADDR + 0x0); usart_cr_t cr; cr.bits.txdis = 0; *CR = cr; cr.bits.txen = 1; *CR = cr; } command void Usart.disableTx(){ volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART1_BASE_ADDR + 0x0); usart_cr_t cr = *CR; cr.bits.txdis = 1; *CR = cr; } command void Usart.enableRx(){ volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART1_BASE_ADDR + 0x0); usart_cr_t cr = *CR; cr.bits.rxen = 1; *CR = cr; call Usart.enableRxInterrupt(); } command void Usart.enableRxInterrupt(){ enableInterruptRead(); } command void Usart.enableTxInterrupt(){ enableInterruptWrite(); } command void Usart.disableRx(){ volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART1_BASE_ADDR + 0x0); usart_cr_t cr = *CR; cr.bits.rxdis = 1; *CR = cr; } command error_t Usart.write(uint8_t sync, uint16_t data, uint32_t timeout){ volatile usart_thr_t *THR = (volatile usart_thr_t*) (USART1_BASE_ADDR + 0x1C); usart_thr_t thr = *THR; call Usart.enableTx(); STATE = S_WRITE; thr.bits.txsynh = sync; thr.bits.txchr = data; *THR = thr; enableInterruptWrite(); // enable interrupts here! return SUCCESS; } command error_t Usart.read(uint16_t *data, uint32_t timeout){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART1_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; volatile usart_rhr_t *RHR = (volatile usart_rhr_t*) (USART1_BASE_ADDR + 0x18); usart_rhr_t rhr = *RHR; /* if(timeout == 0){ while(csr.bits.rxrdy == 0); }else{ while(csr.bits.txrdy == 0){ timeout --; if(timeout == 0) return FAIL; } } */ STATE = S_READ; *data = rhr.bits.rxchr; //&recv_data = data; // enable interrupts here! //enableInterruptRead(); return SUCCESS; } command bool Usart.isDataAvailable(){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART1_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; if(csr.bits.rxrdy != 0) return TRUE; else return FALSE; } command void Usart.setIrdaFilter(uint32_t filter){ volatile usart_if_t *IF = (volatile usart_if_t*) (USART1_BASE_ADDR + 0x4C); usart_if_t if_usart = *IF; if_usart = (usart_if_t) filter; *IF = if_usart; } command error_t Usart.putChar(uint8_t sync, uint16_t data){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART1_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; volatile usart_thr_t *THR = (volatile usart_thr_t*) (USART1_BASE_ADDR + 0x1C); usart_thr_t thr = *THR; while(csr.bits.txempty == 0); thr.bits.txsynh = sync; thr.bits.txchr = data; *THR = thr; csr = *CSR; while(csr.bits.txempty == 0); STATE = S_WRITE; // enable interrupts here! enableInterruptWrite(); return SUCCESS; } command bool Usart.isRxReady(){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART1_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; if(csr.bits.rxrdy != 0) return FALSE; else return TRUE; } command error_t Usart.getChar(uint16_t *data){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART1_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; volatile usart_rhr_t *RHR = (volatile usart_rhr_t*) (USART1_BASE_ADDR + 0x18); usart_rhr_t rhr = *RHR; while(csr.bits.rxrdy == 0); *data = rhr.bits.rxchr; STATE = S_READ; // enable interrupts here! enableInterruptRead(); return SUCCESS; } volatile usart_rhr_t *RHR = (volatile usart_rhr_t*) (USART1_BASE_ADDR + 0x18); volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART1_BASE_ADDR + 0x14); uint16_t recv_data; task void readDoneTask(){ signal Usart.readDone((uint8_t)recv_data); } __attribute__((interrupt)) void Usart1IrqHandler() @C() @spontaneous(){ atomic { call Usart1InterruptWrapper.preamble(); disableInterrupt(); } if(CSR->bits.rxrdy){ atomic recv_data = RHR->bits.rxchr; signal Usart.readDone((uint8_t)recv_data); }else if(STATE == S_WRITE && CSR->bits.txrdy){ signal Usart.writeDone(); // tx done } atomic { STATE = S_IDLE; enableInterruptRead(); call Usart1InterruptWrapper.postamble(); } } async event void ClockConfig.mainClockChanged() {}; default event void Usart.writeDone(){} default event void Usart.readDone(uint8_t data){} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/HplSam3uUsart2C.nc000066400000000000000000000044671207233610700251610ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ configuration HplSam3uUsart2C{ provides interface HplSam3uUsartControl; } implementation{ components HplSam3uUsart2P as UsartP; HplSam3uUsartControl = UsartP.Usart; components HplSam3uGeneralIOC, HplSam3uClockC, HplNVICC; UsartP.USART_CTS2 -> HplSam3uGeneralIOC.HplPioB22; UsartP.USART_RTS2 -> HplSam3uGeneralIOC.HplPioB21; UsartP.USART_RXD2 -> HplSam3uGeneralIOC.HplPioA23; UsartP.USART_SCK2 -> HplSam3uGeneralIOC.HplPioA25; UsartP.USART_TXD2 -> HplSam3uGeneralIOC.HplPioA22; UsartP.USARTClockControl2 -> HplSam3uClockC.US2PPCntl; UsartP.USARTInterrupt2 -> HplNVICC.US1Interrupt; UsartP.ClockConfig -> HplSam3uClockC; components McuSleepC; UsartP.Usart2InterruptWrapper -> McuSleepC; components LedsC; UsartP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/HplSam3uUsart2P.nc000066400000000000000000000212151207233610700251640ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include module HplSam3uUsart2P{ provides interface HplSam3uUsartControl as Usart; uses{ interface HplNVICInterruptCntl as USARTInterrupt2; interface HplSam3GeneralIOPin as USART_CTS2; interface HplSam3GeneralIOPin as USART_RTS2; interface HplSam3GeneralIOPin as USART_RXD2; interface HplSam3GeneralIOPin as USART_SCK2; interface HplSam3GeneralIOPin as USART_TXD2; interface HplSam3PeripheralClockCntl as USARTClockControl2; interface HplSam3Clock as ClockConfig; interface FunctionWrapper as Usart2InterruptWrapper; interface Leds; } } implementation{ #define USART2_BASE_ADDR 0x40098000 enum{ S_READ, S_WRITE, S_IDLE, }; uint8_t STATE; void enableInterruptRead(){ // enables interrupt for read volatile usart_ier_t *IER = (volatile usart_ier_t*) (USART2_BASE_ADDR + 0x8); usart_ier_t ier = *IER; ier.bits.endrx = 1; *IER = ier; } void enableInterruptWrite(){ // enables interrupt for write volatile usart_ier_t *IER = (volatile usart_ier_t*) (USART2_BASE_ADDR + 0x8); usart_ier_t ier = *IER; ier.bits.endtx = 1; *IER = ier; } void disableInterrupt(){ // disable all interrupts volatile usart_idr_t *IDR = (volatile usart_idr_t*) (USART2_BASE_ADDR + 0xC); usart_idr_t idr = *IDR; idr.bits.endtx = 1; idr.bits.endrx = 1; *IDR = idr; } command void Usart.init(){ // init pins and clock call USARTInterrupt2.configure(IRQ_PRIO_USART2); call USARTInterrupt2.enable(); call USARTClockControl2.enable(); call USART_CTS2.disablePioControl(); call USART_CTS2.selectPeripheralB(); call USART_RTS2.disablePioControl(); call USART_RTS2.selectPeripheralB(); call USART_RXD2.disablePioControl(); call USART_RXD2.selectPeripheralA(); call USART_SCK2.disablePioControl(); call USART_SCK2.selectPeripheralB(); call USART_TXD2.disablePioControl(); call USART_TXD2.selectPeripheralA(); } command void Usart.configure(uint32_t mode, uint32_t baudrate){ //configure control mode and baud rate volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART2_BASE_ADDR + 0x0); usart_cr_t cr = *CR; volatile usart_mr_t *MR = (volatile usart_mr_t*) (USART2_BASE_ADDR + 0x4); usart_mr_t mr = *MR; volatile usart_brgr_t *BRGR = (volatile usart_brgr_t*) (USART2_BASE_ADDR + 0x20); usart_brgr_t brgr = *BRGR; uint32_t cd; uint32_t masterClock = call ClockConfig.getMainClockSpeed(); cd = (masterClock * 1000 / baudrate) / 16; cr.bits.rsttx = 1; cr.bits.rstrx = 1; cr.bits.rxdis = 1; cr.bits.txdis = 1; *CR = cr; mr = (usart_mr_t) mode; *MR = mr; if(mr.bits.sync_cpha == 0 && mr.bits.over == 0){ // Async mode and no oversampling brgr.bits.fp = 0; brgr.bits.cd = cd; // check 35.7.9 of sam3u specs for other modes *BRGR = brgr; } STATE = S_IDLE; } command void Usart.enableTx(){ volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART2_BASE_ADDR + 0x0); usart_cr_t cr; cr.bits.txdis = 0; *CR = cr; cr.bits.txen = 1; *CR = cr; } command void Usart.disableTx(){ volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART2_BASE_ADDR + 0x0); usart_cr_t cr = *CR; cr.bits.txdis = 1; *CR = cr; } command void Usart.enableRx(){ volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART2_BASE_ADDR + 0x0); usart_cr_t cr = *CR; cr.bits.rxen = 1; *CR = cr; } command void Usart.enableRxInterrupt(){ enableInterruptRead(); } command void Usart.enableTxInterrupt(){ enableInterruptWrite(); } command void Usart.disableRx(){ volatile usart_cr_t *CR = (volatile usart_cr_t*) (USART2_BASE_ADDR + 0x0); usart_cr_t cr = *CR; cr.bits.rxdis = 1; *CR = cr; } command error_t Usart.write(uint8_t sync, uint16_t data, uint32_t timeout){ volatile usart_thr_t *THR = (volatile usart_thr_t*) (USART2_BASE_ADDR + 0x1C); usart_thr_t thr = *THR; call Usart.enableTx(); thr.bits.txsynh = sync; thr.bits.txchr = data; *THR = thr; // enable interrupts here! STATE = S_WRITE; enableInterruptWrite(); return SUCCESS; } command error_t Usart.read(uint16_t *data, uint32_t timeout){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART2_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; volatile usart_rhr_t *RHR = (volatile usart_rhr_t*) (USART2_BASE_ADDR + 0x18); usart_rhr_t rhr = *RHR; /* if(timeout == 0){ while(csr.bits.rxrdy == 0); }else{ while(csr.bits.txrdy == 0){ timeout --; if(timeout == 0) return FAIL; } } */ STATE = S_READ; *data = rhr.bits.rxchr; //&recv_data = data; // enable interrupts here! enableInterruptRead(); return SUCCESS; } command bool Usart.isDataAvailable(){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART2_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; if(csr.bits.rxrdy != 0) return TRUE; else return FALSE; } command void Usart.setIrdaFilter(uint32_t filter){ volatile usart_if_t *IF = (volatile usart_if_t*) (USART2_BASE_ADDR + 0x4C); usart_if_t if_usart = *IF; if_usart = (usart_if_t) filter; *IF = if_usart; } command error_t Usart.putChar(uint8_t sync, uint16_t data){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART2_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; volatile usart_thr_t *THR = (volatile usart_thr_t*) (USART2_BASE_ADDR + 0x1C); usart_thr_t thr = *THR; while(csr.bits.txempty == 0); thr.bits.txsynh = sync; thr.bits.txchr = data; *THR = thr; csr = *CSR; while(csr.bits.txempty == 0); STATE = S_WRITE; // enable interrupts here! enableInterruptWrite(); return SUCCESS; } command bool Usart.isRxReady(){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART2_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; if(csr.bits.rxrdy != 0) return FALSE; else return TRUE; } command error_t Usart.getChar(uint16_t *data){ volatile usart_csr_t *CSR = (volatile usart_csr_t*) (USART2_BASE_ADDR + 0x14); usart_csr_t csr = *CSR; volatile usart_rhr_t *RHR = (volatile usart_rhr_t*) (USART2_BASE_ADDR + 0x18); usart_rhr_t rhr = *RHR; while(csr.bits.rxrdy == 0); *data = rhr.bits.rxchr; STATE = S_READ; // enable interrupts here! enableInterruptRead(); return SUCCESS; } __attribute__((interrupt)) void Usart1IrqHandler() @C() @spontaneous(){ uint8_t recv_data; atomic { call Usart2InterruptWrapper.preamble(); disableInterrupt(); } if(STATE == S_WRITE && CSR->bits.txrdy){ signal Usart.writeDone(); // tx done }else if(CSR->bits.rxrdy){ atomic recv_data = (uint8_t) RHR->bits.rxchr; signal Usart.readDone(recv_data); } atomic { STATE = S_IDLE; enableInterruptRead(); call Usart2InterruptWrapper.postamble(); } } async event void ClockConfig.mainClockChanged() {}; default event void Usart.writeDone(){} default event void Usart.readDone(uint8_t data){} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/HplSam3uUsartControl.nc000066400000000000000000000043651207233610700263320ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ interface HplSam3uUsartControl{ command void init(); command void configure(uint32_t mode, uint32_t baudrate); command void enableTx(); command void disableTx(); command void enableTxInterrupt(); command void enableRx(); command void enableRxInterrupt(); command void disableRx(); command error_t write(uint8_t sync, uint16_t data, uint32_t timeout); command error_t read(uint16_t *data, uint32_t timeout); command bool isDataAvailable(); command void setIrdaFilter(uint32_t filter); command error_t putChar(uint8_t sync, uint16_t data); command bool isRxReady(); command error_t getChar(uint16_t *data); event void writeDone(); event void readDone(uint8_t data); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/Sam3uUsart.nc000066400000000000000000000036761207233610700243310ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ interface Sam3uUsart{ command void start(uint32_t baud); event void startDone(error_t err); command error_t stop(); event void stopDone(error_t err); command void send(uint8_t data); command void sendStream(void* msg, uint8_t length); command void listen(void* msg, uint8_t length); event void sendDone(error_t error); event void receive(error_t error, uint8_t data); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/Sam3uUsart0C.nc000066400000000000000000000034621207233610700245050ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ configuration Sam3uUsart0C { provides interface Sam3uUsart; } implementation{ components Sam3uUsart0P, HplSam3uUsart0C; Sam3uUsart = Sam3uUsart0P; Sam3uUsart0P.HplUsart -> HplSam3uUsart0C; components LedsC; Sam3uUsart0P.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/Sam3uUsart0P.nc000066400000000000000000000074041207233610700245220ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include module Sam3uUsart0P { provides interface Sam3uUsart; uses interface HplSam3uUsartControl as HplUsart; uses interface Leds; } implementation{ uint32_t mode_register = AT91C_US_USMODE_NORMAL | AT91C_US_CLKS_CLOCK | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE | AT91C_US_NBSTOP_1_BIT | AT91C_US_CHMODE_NORMAL; bool STREAM = FALSE; uint8_t total_send_length, current_length_position; uint8_t *sending_data_ptr; command void Sam3uUsart.start(uint32_t baud){ call HplUsart.init(); call HplUsart.configure(mode_register, baud); call HplUsart.enableTx(); call HplUsart.enableRx(); signal Sam3uUsart.startDone(SUCCESS); } command error_t Sam3uUsart.stop(){ call HplUsart.disableTx(); call HplUsart.disableRx(); signal Sam3uUsart.stopDone(SUCCESS); } command void Sam3uUsart.sendStream(void* msg, uint8_t length){ // send data byte by byte uint8_t data; total_send_length = length; current_length_position = 0; STREAM = TRUE; sending_data_ptr = msg; data = sending_data_ptr[0]; call HplUsart.write(0, data, 0); } command void Sam3uUsart.send(uint8_t data){ // send data byte by byte STREAM = FALSE; call HplUsart.write(0, data, 0); } command void Sam3uUsart.listen(void* msg, uint8_t length){ } event void HplUsart.writeDone(){ current_length_position ++ ; if(!STREAM){ call Leds.led2Toggle(); signal Sam3uUsart.sendDone(SUCCESS); return; }else { current_length_position ++ ; if(total_send_length > current_length_position){ call HplUsart.write(0, (uint8_t)sending_data_ptr[current_length_position], 0); }else{ STREAM = FALSE; signal Sam3uUsart.sendDone(SUCCESS); return; } } } uint8_t rxdata; task void signalReceive(){ signal Sam3uUsart.receive(SUCCESS, rxdata); } event void HplUsart.readDone(uint8_t data){ rxdata = data; post signalReceive(); } default event void Sam3uUsart.sendDone(error_t error){} default event void Sam3uUsart.receive(error_t error, uint8_t data){} default event void Sam3uUsart.startDone(error_t error){} default event void Sam3uUsart.stopDone(error_t error){} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/Sam3uUsart1C.nc000066400000000000000000000034621207233610700245060ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ configuration Sam3uUsart1C { provides interface Sam3uUsart; } implementation{ components Sam3uUsart1P, HplSam3uUsart1C; Sam3uUsart = Sam3uUsart1P; Sam3uUsart1P.HplUsart -> HplSam3uUsart1C; components LedsC; Sam3uUsart1P.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/Sam3uUsart1P.nc000066400000000000000000000074531207233610700245270ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include module Sam3uUsart1P { provides interface Sam3uUsart; uses interface HplSam3uUsartControl as HplUsart; uses interface Leds; } implementation{ uint32_t mode_register = AT91C_US_USMODE_NORMAL | AT91C_US_CLKS_CLOCK | AT91C_US_ASYNC | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE | AT91C_US_NBSTOP_1_BIT | AT91C_US_CHMODE_NORMAL; bool STREAM = FALSE; uint8_t total_send_length, current_length_position; uint8_t *sending_data_ptr; command void Sam3uUsart.start(uint32_t baud){ call HplUsart.init(); call HplUsart.configure(mode_register, baud); call HplUsart.enableTx(); call HplUsart.enableRx(); signal Sam3uUsart.startDone(SUCCESS); } command error_t Sam3uUsart.stop(){ call HplUsart.disableTx(); call HplUsart.disableRx(); signal Sam3uUsart.stopDone(SUCCESS); } command void Sam3uUsart.sendStream(void* msg, uint8_t length){ // send data byte by byte uint8_t data; total_send_length = length; current_length_position = 0; STREAM = TRUE; sending_data_ptr = msg; data = sending_data_ptr[0]; call HplUsart.write(0, data, 0); } command void Sam3uUsart.send(uint8_t data){ // send data byte by byte STREAM = FALSE; call HplUsart.write(0, data, 0); } command void Sam3uUsart.listen(void* msg, uint8_t length){ } event void HplUsart.writeDone(){ current_length_position ++ ; if(!STREAM){ signal Sam3uUsart.sendDone(SUCCESS); return; }else { current_length_position ++ ; if(total_send_length > current_length_position){ call HplUsart.write(0, (uint8_t)sending_data_ptr[current_length_position], 0); }else{ STREAM = FALSE; signal Sam3uUsart.sendDone(SUCCESS); return; } } } uint8_t rxdata; task void signalReceive(){ signal Sam3uUsart.receive(SUCCESS, rxdata); } event void HplUsart.readDone(uint8_t data){ rxdata = data; //signal Sam3uUsart.receive(SUCCESS, data); post signalReceive(); } default event void Sam3uUsart.sendDone(error_t error){} default event void Sam3uUsart.receive(error_t error, uint8_t data){} default event void Sam3uUsart.startDone(error_t error){} default event void Sam3uUsart.stopDone(error_t error){} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/Sam3uUsart2C.nc000066400000000000000000000034621207233610700245070ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ configuration Sam3uUsart2C { provides interface Sam3uUsart; } implementation{ components Sam3uUsart2P, HplSam3uUsart2C; Sam3uUsart = Sam3uUsart2P; Sam3uUsart2P.HplUsart -> HplSam3uUsart2C; components LedsC; Sam3uUsart2P.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/Sam3uUsart2P.nc000066400000000000000000000073451207233610700245300ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include module Sam3uUsart2P { provides interface Sam3uUsart; uses interface HplSam3uUsartControl as HplUsart; uses interface Leds; } implementation{ uint32_t mode_register = AT91C_US_USMODE_NORMAL | AT91C_US_CLKS_CLOCK | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE | AT91C_US_NBSTOP_1_BIT | AT91C_US_CHMODE_NORMAL; bool STREAM = FALSE; uint8_t total_send_length, current_length_position; uint8_t *sending_data_ptr; command void Sam3uUsart.start(uint32_t baud){ call HplUsart.init(); call HplUsart.configure(mode_register, baud); call HplUsart.enableTx(); call HplUsart.enableRx(); signal Sam3uUsart.startDone(SUCCESS); } command error_t Sam3uUsart.stop(){ call HplUsart.disableTx(); call HplUsart.disableRx(); signal Sam3uUsart.stopDone(SUCCESS); } command void Sam3uUsart.sendStream(void* msg, uint8_t length){ // send data byte by byte uint8_t data; total_send_length = length; current_length_position = 0; STREAM = TRUE; sending_data_ptr = msg; data = sending_data_ptr[0]; call HplUsart.write(0, data, 0); } command void Sam3uUsart.send(uint8_t data){ // send data byte by byte STREAM = FALSE; call HplUsart.write(0, data, 0); } command void Sam3uUsart.listen(void* msg, uint8_t length){ } event void HplUsart.writeDone(){ current_length_position ++ ; if(!STREAM){ signal Sam3uUsart.sendDone(SUCCESS); return; }else { current_length_position ++ ; if(total_send_length > current_length_position){ call HplUsart.write(0, (uint8_t)sending_data_ptr[current_length_position], 0); }else{ STREAM = FALSE; signal Sam3uUsart.sendDone(SUCCESS); return; } } } uint8_t rxdata; task void signalReceive(){ signal Sam3uUsart.receive(SUCCESS, rxdata); } event void HplUsart.readDone(uint8_t data){ rxdata = data; post signalReceive(); } default event void Sam3uUsart.sendDone(error_t error){} default event void Sam3uUsart.receive(error_t error, uint8_t data){} default event void Sam3uUsart.startDone(error_t error){} default event void Sam3uUsart.stopDone(error_t error){} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usart/sam3uusarthardware.h000066400000000000000000000354721207233610700257750ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * 12 bit ADC register definitions. * * @author JeongGil Ko */ #ifndef _SAM3UUSARTHARDWARE_H #define _SAM3UUSARTHARDWARE_H typedef union { uint32_t flat; struct { uint8_t reserved0 : 2; uint8_t rstrx : 1; uint8_t rsttx : 1; uint8_t rxen : 1; uint8_t rxdis : 1; uint8_t txen : 1; uint8_t txdis : 1; uint8_t rststa : 1; uint8_t sttbrk : 1; uint8_t stpbrk : 1; uint8_t sttto : 1; uint8_t senda : 1; uint8_t rstit : 1; uint8_t rstnack : 1; uint8_t retto : 1; uint8_t reserved1 : 2; uint8_t rtsen_fcs : 1; uint8_t rtsdis_rcs : 1; uint8_t reserved2 : 4; uint8_t reserved3 : 8; } __attribute__((__packed__)) bits; } usart_cr_t; /* typedef union { uint32_t flat; struct { uint8_t usart_mode : 4; uint8_t usclks : 2; uint8_t chrl : 2; uint8_t sync_cpha : 1; uint8_t par : 3; uint8_t nb_stop : 2; uint8_t chmode : 2; uint8_t msbf_cpol : 1; uint8_t mode9 : 1; uint8_t clko : 1; uint8_t over : 1; uint8_t inack : 1; uint8_t dsnack : 1; uint8_t var_sync : 1; uint8_t invdata : 1; uint8_t max_iteration : 3; uint8_t reserved0 : 1; uint8_t filter : 1; uint8_t man : 1; uint8_t modsync : 1; uint8_t onebit : 1; } __attribute__((__packed__)) bits; } usart_mr_t; */ typedef union { uint32_t flat; struct { uint8_t usart_mode : 4; uint8_t usclks : 2; uint8_t chrl : 2; uint8_t sync_cpha : 1; uint8_t par : 3; uint8_t nb_stop : 2; uint8_t chmode : 2; uint8_t msbf_cpol : 1; uint8_t mode9 : 1; uint8_t clko : 1; uint8_t over : 1; uint8_t inack : 1; uint8_t dsnack : 1; uint8_t var_sync : 1; uint8_t invdata : 1; uint8_t max_iteration : 3; uint8_t reserved0 : 1; uint8_t filter : 1; uint8_t man : 1; uint8_t modsync : 1; uint8_t onebit : 1; } __attribute__((__packed__)) bits; } usart_mr_t; typedef union { uint32_t flat; struct { uint8_t rxrdy : 1; uint8_t txrdy : 1; uint8_t rxbrk : 1; uint8_t endrx : 1; uint8_t endtx : 1; uint8_t ovre : 1; uint8_t frame : 1; uint8_t pare : 1; uint8_t timeout : 1; uint8_t txempty : 1; uint8_t iter_unre : 1; uint8_t txbufe : 1; uint8_t rxbuff : 1; uint8_t nack : 1; uint8_t reserved0 : 2; uint8_t reserved1 : 3; uint8_t ctsic : 1; uint8_t reserved2 : 4; uint8_t mane : 1; uint8_t reserved3 : 7; } __attribute__((__packed__)) bits; } usart_ier_t; typedef union { uint32_t flat; struct { uint8_t rxrdy : 1; uint8_t txrdy : 1; uint8_t rxbrk : 1; uint8_t endrx : 1; uint8_t endtx : 1; uint8_t ovre : 1; uint8_t frame : 1; uint8_t pare : 1; uint8_t timeout : 1; uint8_t txempty : 1; uint8_t iter_unre : 1; uint8_t txbufe : 1; uint8_t rxbuff : 1; uint8_t nack : 1; uint8_t reserved0 : 2; uint8_t reserved1 : 3; uint8_t ctsic : 1; uint8_t reserved2 : 4; uint8_t mane : 1; uint8_t reserved3 : 7; } __attribute__((__packed__)) bits; } usart_idr_t; typedef union { uint32_t flat; struct { uint8_t rxrdy : 1; uint8_t txrdy : 1; uint8_t rxbrk : 1; uint8_t endrx : 1; uint8_t endtx : 1; uint8_t ovre : 1; uint8_t frame : 1; uint8_t pare : 1; uint8_t timeout : 1; uint8_t txempty : 1; uint8_t iter_unre : 1; uint8_t txbufe : 1; uint8_t rxbuff : 1; uint8_t nack : 1; uint8_t reserved0 : 2; uint8_t reserved1 : 3; uint8_t ctsic : 1; uint8_t reserved2 : 4; uint8_t mane : 1; uint8_t reserved3 : 7; } __attribute__((__packed__)) bits; } usart_imr_t; typedef union { uint32_t flat; struct { uint8_t rxrdy : 1; uint8_t txrdy : 1; uint8_t rxbrk : 1; uint8_t endrx : 1; uint8_t endtx : 1; uint8_t ovre : 1; uint8_t frame : 1; uint8_t pare : 1; uint8_t timeout : 1; uint8_t txempty : 1; uint8_t iter_unre : 1; uint8_t txbufe : 1; uint8_t rxbuff : 1; uint8_t nack : 1; uint8_t reserved0 : 2; uint8_t reserved1 : 3; uint8_t ctsic : 1; uint8_t reserved2 : 4; uint8_t manerr : 1; uint8_t reserved3 : 7; } __attribute__((__packed__)) bits; } usart_csr_t; typedef union { uint32_t flat; struct { uint16_t rxchr : 9; uint16_t reserved0 : 6; uint16_t rxsynh : 1; uint16_t reserved1 : 16; } __attribute__((__packed__)) bits; } usart_rhr_t; typedef union { uint32_t flat; struct { uint16_t txchr : 9; uint16_t reserved0 : 6; uint16_t txsynh : 1; uint16_t reserved1 : 16; } __attribute__((__packed__)) bits; } usart_thr_t; typedef union { uint32_t flat; struct { uint16_t cd : 16; uint8_t fp : 1; uint8_t reserved0 : 7; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } usart_brgr_t; typedef union { uint32_t flat; struct { uint16_t to : 16; uint16_t reserved0 : 16; } __attribute__((__packed__)) bits; } usart_rtor_t; typedef union { uint32_t flat; struct { uint8_t tg : 8; uint8_t reserved0 : 8; uint16_t reserved1 : 16; } __attribute__((__packed__)) bits; } usart_ttgr_t; typedef union { uint32_t flat; struct { uint16_t fi_di_ratio : 11; uint16_t reserved0 : 5; uint16_t reserved1 : 16; } __attribute__((__packed__)) bits; } usart_fidi_t; typedef union { uint32_t flat; struct { uint8_t nb_errors : 8; uint8_t reserved0 : 8; uint16_t reserved1 : 16; } __attribute__((__packed__)) bits; } usart_ner_t; typedef union { uint32_t flat; struct { uint8_t irda_filter : 8; uint8_t reserved0 : 8; uint16_t reserved1 : 16; } __attribute__((__packed__)) bits; } usart_if_t; typedef union { uint32_t flat; struct { uint8_t tx_pl : 4; uint8_t reserved0 : 4; uint8_t tx_pp : 2; uint8_t reserved1 : 2; uint8_t tx_mpol : 1; uint8_t reserved2 : 3; uint8_t rx_pl : 4; uint8_t reserved3 : 4; uint8_t rx_pp : 2; uint8_t reserved4 : 2; uint8_t rx_mpol : 1; uint8_t allwaysone : 1; uint8_t drift : 1; uint8_t reserved5 : 1; } __attribute__((__packed__)) bits; } usart_man_t; typedef union { uint32_t flat; struct { uint32_t wpen : 1; uint32_t reserved0 : 7; uint32_t wpkey : 24; } __attribute__((__packed__)) bits; } usart_wpmr_t; typedef union { uint32_t flat; struct { uint8_t wpvs : 1; uint8_t reserved0 : 7; uint16_t wpvsrc : 16; uint8_t reserved1 : 8; } __attribute__((__packed__)) bits; } usart_wpsr_t; typedef union { uint32_t flat; struct { uint16_t version : 12; uint16_t reserved0 : 4; uint16_t mfn : 3; uint16_t reserved1 : 13; } __attribute__((__packed__)) bits; } usart_version_t; typedef struct usart { volatile usart_cr_t cr; volatile usart_mr_t mr; volatile usart_ier_t ier; volatile usart_idr_t idr; volatile usart_imr_t imr; volatile usart_csr_t csr; volatile usart_rhr_t rhr; volatile usart_thr_t thr; volatile usart_brgr_t brgr; volatile usart_rtor_t rtor; volatile usart_ttgr_t ttgr; uint32_t reserved0[5]; volatile usart_fidi_t fidi; volatile usart_ner_t ner; uint32_t reserved1; volatile usart_if_t us_if; volatile usart_man_t man; volatile usart_wpmr_t wpmr; volatile usart_wpsr_t wpsr; uint32_t reserved2[40]; volatile usart_version_t version; } usart_t; volatile usart_t* USART0 = (volatile usart_t *) 0x40090000; volatile usart_t* USART1 = (volatile usart_t *) 0x40094000; volatile usart_t* USART2 = (volatile usart_t *) 0x40098000; volatile usart_t* USART3 = (volatile usart_t *) 0x4009C000; #define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode #define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal #define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 #define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking #define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem #define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 #define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 #define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA #define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking #define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock #define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock #define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 #define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) #define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) #define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock #define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits #define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits #define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits #define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits #define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select #define AT91C_US_ASYNC (0x0 << 8) // (USART) Asynchronous Mode Select #define AT91C_US_PAR (0x7 << 9) // (USART) Parity type #define AT91C_US_PAR_EVEN (0x0 << 9) // (USART) Even Parity #define AT91C_US_PAR_ODD (0x1 << 9) // (USART) Odd Parity #define AT91C_US_PAR_SPACE (0x2 << 9) // (USART) Parity forced to 0 (Space) #define AT91C_US_PAR_MARK (0x3 << 9) // (USART) Parity forced to 1 (Mark) #define AT91C_US_PAR_NONE (0x4 << 9) // (USART) No Parity #define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (USART) Multi-drop mode #define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits #define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit #define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits #define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits #define AT91C_US_CHMODE (0x3 << 14) // (USART) Channel Mode #define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (USART) Normal Mode: The USART channel operates as an RX/TX USART. #define AT91C_US_CHMODE_AUTO (0x1 << 14) // (USART) Automatic Echo: Receiver Data Input is connected to the TXD pin. #define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (USART) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. #define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (USART) Remote Loopback: RXD pin is internally connected to TXD pin. #define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order #define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length #define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select #define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode #define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge #define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK #define AT91C_US_VAR_SYNC (0x1 << 22) // (USART) Variable synchronization of command/data sync Start Frame Delimiter #define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions #define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter #define AT91C_US_MANMODE (0x1 << 29) // (USART) Manchester Encoder/Decoder Enable #define AT91C_US_MODSYNC (0x1 << 30) // (USART) Manchester Synchronization mode #define AT91C_US_ONEBIT (0x1 << 31) // (USART) Start Frame Delimiter selector #endif // _SAM3UUSARTHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/000077500000000000000000000000001207233610700214175ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/Sam3uUsbBufferedSerialP.nc000066400000000000000000000126541207233610700263360ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * High Speed USB to Serial implementation * * @author Kevin Klues */ #include module Sam3uUsbBufferedSerialP { provides { interface StdControl; interface UartByte; interface UartStream; } uses { interface StdControl as SubStdControl; interface UartStream as SubUartStream; } } implementation { #define WBUF_SIZE 256 #define RBUF_SIZE 256 typedef struct { uint8_t buf[WBUF_SIZE]; uint8_t idx; bool free; } wbuf_t; wbuf_t wbufs[2]; uint8_t cwbuf; wbuf_t *pwbuf; uint8_t rbuf[RBUF_SIZE]; command error_t StdControl.start() { error_t e = call SubStdControl.start(); atomic { cwbuf = 0; pwbuf = NULL; wbufs[0].idx = 0; wbufs[1].idx = 0; wbufs[1].free = TRUE; wbufs[1].free = TRUE; } while(call SubUartStream.receive(rbuf, RBUF_SIZE) != SUCCESS); return e; } command error_t StdControl.stop() { return call SubStdControl.stop(); } async command error_t UartByte.send( uint8_t byte ) { return FAIL; } async command error_t UartByte.receive( uint8_t* byte, uint8_t timeout ) { return FAIL; } // Take a look in HdlcTranslateC to understand the logic here // on determining whether this is the last byte or not bool lastByte(uint8_t byte) { static bool seen_delimiter = FALSE; static uint8_t esc_count = 0; if(!seen_delimiter && (byte == HDLC_FLAG_BYTE)) seen_delimiter = TRUE; else if(seen_delimiter && (byte == HDLC_FLAG_BYTE) && ((esc_count % 2) == 0)) { seen_delimiter = FALSE; esc_count = 0; return TRUE; } if(byte == HDLC_CTLESC_BYTE) esc_count++; else esc_count = 0; return FALSE; } task void sendTask() { wbuf_t *pwbuf_temp; atomic pwbuf_temp = pwbuf; while(call SubUartStream.send(pwbuf_temp->buf, pwbuf_temp->idx) != SUCCESS); } task void byteBufferedTask() { // I know HdlcTranslateC is not checking the value of buf, so just pass NULL signal UartStream.sendDone(NULL, 1, SUCCESS); } async command error_t UartStream.send( uint8_t* buf, uint16_t len ) { // Assumes only called with one byte at a time!! // This is the behaviour of the current serial stack... atomic { wbufs[cwbuf].buf[wbufs[cwbuf].idx++] = buf[0]; if(!lastByte(buf[0])) { // Post a task to signal sendDone back to HdlcTranslateC // Should be OK because of the way send() is always a tail call in this // component, and these are async functions. post byteBufferedTask(); } else { wbufs[cwbuf].free = FALSE; if(!pwbuf) { pwbuf = &(wbufs[cwbuf]); cwbuf = !cwbuf; post byteBufferedTask(); post sendTask(); } } } return SUCCESS; } async event void SubUartStream.sendDone( uint8_t* buf, uint16_t len, error_t error ) { atomic { pwbuf->idx = 0; pwbuf->free = TRUE; if(!wbufs[cwbuf].free) { pwbuf = &(wbufs[cwbuf]); cwbuf = !cwbuf; post byteBufferedTask(); post sendTask(); } else { pwbuf = NULL; } } } async command error_t UartStream.receive( uint8_t* buf, uint16_t len ) { return call SubUartStream.receive(buf, len); } async event void SubUartStream.receiveDone( uint8_t *buf, uint16_t len, error_t error ) { while(call SubUartStream.receive(rbuf, RBUF_SIZE) != SUCCESS); signal UartStream.receiveDone(buf, len, error); } async event void SubUartStream.receivedByte( uint8_t byte ) { signal UartStream.receivedByte(byte); } async command error_t UartStream.enableReceiveInterrupt() { return call SubUartStream.enableReceiveInterrupt(); } async command error_t UartStream.disableReceiveInterrupt() { return call SubUartStream.disableReceiveInterrupt(); } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/Sam3uUsbSerialC.nc000066400000000000000000000047661207233610700246630ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * High Speed USB Device Port register definitions. * * @author Kevin Klues */ #include #include configuration Sam3uUsbSerialC { provides { interface StdControl; interface UartStream; interface UartByte; } } implementation { components MainC; components HplNVICC; components HplSam3uClockC; components Sam3uUsbSerialP; components Sam3uUsbBufferedSerialP; components SerialP; StdControl = Sam3uUsbBufferedSerialP; UartStream = Sam3uUsbBufferedSerialP; UartByte = Sam3uUsbBufferedSerialP; Sam3uUsbBufferedSerialP.SubStdControl -> Sam3uUsbSerialP; Sam3uUsbBufferedSerialP.SubUartStream -> Sam3uUsbSerialP; MainC.SoftwareInit -> Sam3uUsbSerialP; Sam3uUsbSerialP.UDPHSInterrupt -> HplNVICC.MCI0Interrupt; Sam3uUsbSerialP.UDPHSClockControl -> HplSam3uClockC.UDPHSPPCntl; components McuSleepC; Sam3uUsbSerialP.UdphsInterruptWrapper -> McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/Sam3uUsbSerialP.nc000066400000000000000000000163001207233610700246630ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * High Speed USB to Serial implementation * * @author Kevin Klues */ #include module Sam3uUsbSerialP { provides { interface Init; interface StdControl; interface UartStream; } uses { interface HplNVICInterruptCntl as UDPHSInterrupt; interface HplSam3PeripheralClockCntl as UDPHSClockControl; interface FunctionWrapper as UdphsInterruptWrapper; } } implementation { #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include norace struct { volatile bool rlock : 1; volatile bool wlock : 1; } flags; norace uint8_t* rbuf; norace uint8_t* wbuf; norace uint16_t rlen; norace uint16_t wlen; //------------------------------------------------------------------------------ // Callbacks re-implementation //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Invoked when the USB device leaves the Suspended state. By default, /// configures the LEDs. //------------------------------------------------------------------------------ void USBDCallbacks_Resumed(void) @spontaneous() { } //------------------------------------------------------------------------------ /// Invoked when the USB device gets suspended. By default, turns off all LEDs. //------------------------------------------------------------------------------ void USBDCallbacks_Suspended(void) @spontaneous() { } //------------------------------------------------------------------------------ /// Callback invoked when data has been received on the USB. //------------------------------------------------------------------------------ void UsbDataReceived(unsigned int unused, unsigned char status, unsigned int received, unsigned int remaining) @spontaneous() { int i; error_t e = (status == USBD_STATUS_SUCCESS) ? SUCCESS : FAIL; flags.rlock = 0; for(i=0; iuckr.bits.upllcount = 1; // Arbitrary for now... PMC->uckr.bits.upllen = 1; while(!PMC->sr.bits.locku); // Enable udphs UDPHS->ctrl.bits.en_udphs = 1; // BOT driver initialization CDCDSerialDriver_Initialize(); // Connect pull-up, wait for configuration USBD_Connect(); return SUCCESS; } command error_t StdControl.stop() { // Disable the UDPHS clock in the PMC call UDPHSClockControl.disable(); // Disable the UPLL PMC->uckr.bits.upllen = 0; // Disabel udphs UDPHS->ctrl.bits.en_udphs = 0; return SUCCESS; } async command error_t UartStream.send( uint8_t* buf, uint16_t len ) { int e; if(flags.wlock) return EBUSY; flags.wlock = 1; wbuf = buf; wlen = len; e = CDCDSerialDriver_Write(wbuf, wlen, (TransferCallback) UsbDataWritten, 0); if (e != USBD_STATUS_SUCCESS) { flags.wlock = 0; return FAIL; } return SUCCESS; } async command error_t UartStream.receive( uint8_t* buf, uint16_t len ) { int e; if(flags.rlock) return EBUSY; flags.rlock = 1; rbuf = buf; rlen = len; e = CDCDSerialDriver_Read(rbuf, rlen, (TransferCallback) UsbDataReceived, 0); if (e != USBD_STATUS_SUCCESS) { flags.rlock = 0; return FAIL; } return SUCCESS; } async command error_t UartStream.enableReceiveInterrupt() { return SUCCESS; } async command error_t UartStream.disableReceiveInterrupt() { return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/board/000077500000000000000000000000001207233610700225065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/board/board.h000066400000000000000000000742511207233610700237570ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \dir /// !Purpose /// /// Definition and functions for using AT91SAM3UE-related features, such /// has PIO pins, memories, etc. /// /// !Usage /// -# The code for booting the board is provided by board_cstartup.S and /// board_lowlevel.c. /// -# For using board PIOs, board characteristics (clock, etc.) and external /// components, see board.h. /// -# For manipulating memories (remapping, SDRAM, etc.), see board_memories.h. //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \unit /// !Purpose /// /// Definition of AT91SAM3UE-EK characteristics, AT91SAM3UE-dependant PIOs and /// external components interfacing. /// /// !Usage /// -# For operating frequency information, see "SAM3UE-EK - Operating frequencies". /// -# For using portable PIO definitions, see "SAM3UE-EK - PIO definitions". /// -# Several USB definitions are included here (see "SAM3UE-EK - USB device"). //------------------------------------------------------------------------------ #ifndef BOARD_H #define BOARD_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "chip.h" #include "AT91SAM3U4.h" //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "SAM3UE-EK - Board Description" /// This page lists several definition related to the board description. /// /// !Definitions /// - BOARD_NAME /// Name of the board. #define BOARD_NAME "AT91SAM3U-EK" /// Board definition. #define at91sam3uek // Chip type //#define fpgasimulation //------------------------------------------------------------------------------ #if defined(fpgasimulation) #define PMC_BY_HARD #endif //------------------------------------------------------------------------------ /// \page "SAM3UE-EK - Operating frequencies" /// This page lists several definition related to the board operating frequency /// (when using the initialization done by board_lowlevel.c). /// /// !Definitions /// - BOARD_MAINOSC /// - BOARD_MCK /// Frequency of the board main oscillator. #define BOARD_MAINOSC 12000000 /// Master clock frequency (when using board_lowlevel.c). #if !defined(fpgasimulation) #define BOARD_MCK 48000000 #else #define BOARD_MCK 22579200 #endif #if defined (fpgasimulation) //#define BOARD_ConfigureSdram(...) { } #endif // fpgasimulation //------------------------------------------------------------------------------ // ADC //------------------------------------------------------------------------------ /// ADC clock frequency, at 10-bit resolution (in Hz) #define ADC_MAX_CK_10BIT 5000000 /// Startup time max, return from Idle mode (in s) #define ADC_STARTUP_TIME_MAX 15 /// Track and hold Acquisition Time min (in ns) #define ADC_TRACK_HOLD_TIME_MIN 1200 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "SAM3UE-EK - USB device" /// This page lists constants describing several characteristics (controller /// type, D+ pull-up type, etc.) of the USB device controller of the chip/board. /// /// !Constants /// - BOARD_USB_UDP /// - BOARD_USB_PULLUP_EXTERNAL /// - BOARD_USB_NUMENDPOINTS /// - BOARD_USB_ENDPOINTS_MAXPACKETSIZE /// - BOARD_USB_ENDPOINTS_BANKS /// Chip has a UDP controller. #define BOARD_USB_UDPHS /// Indicates the D+ pull-up is external. #define BOARD_USB_PULLUP_INTERNAL /// Number of endpoints in the USB controller. #define BOARD_USB_NUMENDPOINTS 7 /// Returns the maximum packet size of the given endpoint. #define BOARD_USB_ENDPOINTS_MAXPACKETSIZE(i) (((i == 0)||(i == 3)||(i == 4)) ? 64 :\ (((i == 1)||(i == 2)) ? 512 : 1024)) /// Returns the number of FIFO banks for the given endpoint. #define BOARD_USB_ENDPOINTS_BANKS(i) ((i == 0) ? 1 : ((i == 1) || (i == 2)) ? 2 : 3) /// USB attributes configuration descriptor (bus or self powered, remote wakeup) #define BOARD_USB_BMATTRIBUTES USBConfigurationDescriptor_SELFPOWERED_RWAKEUP //#define BOARD_USB_BMATTRIBUTES USBConfigurationDescriptor_SELFPOWERED_NORWAKEUP //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "SAM3UE-EK - PIO definitions" /// This pages lists all the pio definitions contained in board.h. The constants /// are named using the following convention: PIN_* for a constant which defines /// a single Pin instance (but may include several PIOs sharing the same /// controller), and PINS_* for a list of Pin instances. /// /// !ADC /// - PIN_ADC0_AD0 /// - PIN_ADC0_AD1 /// - PIN_ADC0_AD2 /// - PIN_ADC0_AD3 /// - PIN_ADC0_AD4 /// - PIN_ADC0_AD5 /// - PIN_ADC0_AD6 /// - PIN_ADC0_AD7 /// - PINS_ADC0 /// /// !CAN /// - PIN_CAN_TRANSCEIVER_RS /// - PIN_CAN1_TRANSCEIVER_TXD /// - PIN_CAN1_TRANSCEIVER_RXD /// - PIN_CAN2_TRANSCEIVER_TXD /// - PIN_CAN2_TRANSCEIVER_RXD /// - PINS_CAN_TRANSCEIVER_TXD /// - PINS_CAN_TRANSCEIVER_RXD /// /// !DBGU /// - PINS_DBGU /// /// !Joystick buttons /// - PIN_JOYSTICK_UP /// - PIN_JOYSTICK_DOWN /// - PIN_JOYSTICK_LEFT /// - PIN_JOYSTICK_RIGHT /// - PIN_JOYSTICK_LCLIC, PIN_JOYSTICK_PUSH /// - PINS_JOYSTICK_MOVE, PINS_JOYSTICK_CLIC, PINS_JOYSTICK /// - JOYSTICK_UP /// - JOYSTICK_DOWN /// - JOYSTICK_LEFT /// - JOYSTICK_RIGHT /// - JOYSTICK_LCLIC, JOYSTICK_PUSH /// /// !EBI /// - PIN_EBI_DATA_BUS /// - PIN_EBI_NCS0 /// - PIN_EBI_NRD /// - PIN_EBI_NWE /// - PIN_EBI_ADDR_BUS /// - PIN_EBI_PSRAM_NBS /// - PIN_EBI_A1 /// - PIN_EBI_LCD_RS /// /// !LEDs /// - PIN_LED_DS1 /// - PIN_LED_DS2 /// - PIN_LED_DS3 /// - PIN_LED_DS4 /// - PINS_LEDS /// - LED_DS1 /// - LED_DS2 /// - LED_DS3 /// - LED_DS4 /// /// !MCI /// - PINS_MCI /// /// !Push buttons /// - PIN_PUSHBUTTON_1 /// - PIN_PUSHBUTTON_2 /// - PIN_PUSHBUTTON_3 /// - PIN_PUSHBUTTON_4 /// - PINS_PUSHBUTTONS /// - PUSHBUTTON_BP1 /// - PUSHBUTTON_BP2 /// - PUSHBUTTON_BP3 /// - PUSHBUTTON_BP4 /// /// !PWMC /// - PIN_PWMC_PWMH0 /// - PIN_PWMC_PWML0 /// - PIN_PWMC_PWMH1 /// - PIN_PWMC_PWML1 /// - PIN_PWMC_PWMH2 /// - PIN_PWMC_PWML2 /// - PIN_PWM_LED0 /// - PIN_PWM_LED1 /// - PIN_PWM_LED2 /// - CHANNEL_PWM_LED0 /// - CHANNEL_PWM_LED1 /// - CHANNEL_PWM_LED2 /// /// !SPI0 /// - PIN_SPI0_MISO /// - PIN_SPI0_MOSI /// - PIN_SPI0_SPCK /// - PINS_SPI0 /// - PIN_SPI0_NPCS3 /// /// !SPI1 /// - PIN_SPI1_MISO /// - PIN_SPI1_MOSI /// - PIN_SPI1_SPCK /// - PINS_SPI1 /// - PIN_SPI1_NPCS3 /// /// ! SSC /// - PIN_SSC_TD /// - PIN_SSC_TK /// - PIN_SSC_TF /// - PINS_SSC_CODEC /// /// ! PCK0 /// - PIN_PCK0 /// /// !TWI /// - PIN_TWI_TWD0 /// - PIN_TWI_TWCK0 /// - PINS_TWI /// /// !USART0 /// - PIN_USART0_RXD /// - PIN_USART0_TXD /// - PIN_USART0_CTS /// - PIN_USART0_RTS /// - PIN_USART0_SCK /// /// !USB /// - PIN_USB_PULLUP /// /// ADC_AD0 pin definition. #define PIN_ADC0_AD0 {1 << 21, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_INPUT, PIO_DEFAULT} /// ADC_AD1 pin definition. #define PIN_ADC0_AD1 {1 << 30, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_INPUT, PIO_DEFAULT} /// ADC_AD2 pin definition. #define PIN_ADC0_AD2 {1 << 3, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_INPUT, PIO_DEFAULT} /// ADC_AD3 pin definition. #define PIN_ADC0_AD3 {1 << 4, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_INPUT, PIO_DEFAULT} /// ADC_AD4 pin definition. #define PIN_ADC0_AD4 {1 << 15, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_INPUT, PIO_DEFAULT} /// ADC_AD5 pin definition. #define PIN_ADC0_AD5 {1 << 16, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_INPUT, PIO_DEFAULT} /// ADC_AD6 pin definition. #define PIN_ADC0_AD6 {1 << 17, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_INPUT, PIO_DEFAULT} /// ADC_AD7 pin definition. #define PIN_ADC0_AD7 {1 << 18, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_INPUT, PIO_DEFAULT} /// Pins ADC #define PINS_ADC PIN_ADC0_AD0, PIN_ADC0_AD1, PIN_ADC0_AD2, PIN_ADC0_AD3, PIN_ADC0_AD4, PIN_ADC0_AD5, PIN_ADC0_AD6, PIN_ADC0_AD7 /// CAN Definition /// RS: Select input for high speed mode or silent mode //#define PIN_CAN_TRANSCEIVER_RS {1<<23, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT} // ///// TXD: Transmit data input //#define PIN_CAN1_TRANSCEIVER_TXD {1<<27, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} ///// RXD: Receive data output //#define PIN_CAN1_TRANSCEIVER_RXD {1<<26, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} /// TXD: Transmit data input //#define PIN_CAN2_TRANSCEIVER_TXD {1<<29, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} ///// RXD: Receive data output //#define PIN_CAN2_TRANSCEIVER_RXD {1<<28, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} ///// TXD pins //#define PINS_CAN_TRANSCEIVER_TXD PIN_CAN1_TRANSCEIVER_TXD, PIN_CAN2_TRANSCEIVER_TXD ///// RXD pins //#define PINS_CAN_TRANSCEIVER_RXD PIN_CAN1_TRANSCEIVER_RXD, PIN_CAN2_TRANSCEIVER_RXD /// DBGU pins (DTXD and DRXD) definitions, PA11,12. #define PINS_DBGU {0x00001800, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} /// EBI #define PIN_EBI_DATA_BUS {0xfe01fe00, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_PULLUP}, \ {1 << 6, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_B, PIO_PULLUP} #define PIN_EBI_NCS0 {1 << 20, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_PULLUP} #define PIN_EBI_NRD {1 << 19, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_PULLUP} #define PIN_EBI_NWE {1 << 23, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_PULLUP} #define PIN_EBI_PSRAM_ADDR_BUS {0x3f00fff, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_PERIPH_A, PIO_PULLUP} #define PIN_EBI_PSRAM_NBS {1 << 7, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_B, PIO_PULLUP}, \ {1 << 15, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_PERIPH_A, PIO_PULLUP} #define PIN_EBI_A1 {1 << 8, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_B, PIO_PULLUP} #define PIN_EBI_NCS2 {1 << 16, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_PERIPH_A, PIO_PULLUP} #define PIN_EBI_LCD_RS {1 << 8, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_B, PIO_PULLUP} /// LED #0 pin definition. #define PIN_LED_0 {1 << 0, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT} /// LED #1 pin definition. #define PIN_LED_1 {1 << 1, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_OUTPUT_1, PIO_DEFAULT} /// LED #2 pin definition. #define PIN_LED_2 {1 << 2, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_OUTPUT_1, PIO_DEFAULT} /// List of all LEDs definitions. #define PINS_LEDS PIN_LED_0, PIN_LED_1, PIN_LED_2 ///// MCI pins definition. #define PINS_MCI {0x1f8, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_PULLUP}, \ {1 << 3, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} /// MCI pin DAT0 (busy) #define PIN_MCI_DAT0 \ {AT91C_PIO_PA5, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_PULLUP} /// MCI pin Card Detect #define PIN_MCI_CD \ {AT91C_PIO_PA25, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_INPUT, PIO_PULLUP} /// Push button #0 definition. #define PIN_PUSHBUTTON_1 {1 << 18, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_INPUT, PIO_DEGLITCH | PIO_PULLUP} /// Push button #1 definition. #define PIN_PUSHBUTTON_2 {1 << 19, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_INPUT, PIO_DEGLITCH | PIO_PULLUP} /// Push button #2 definition /// List of all push button definitions. #define PINS_PUSHBUTTONS PIN_PUSHBUTTON_1, PIN_PUSHBUTTON_2 /// Push button #1 index. #define PUSHBUTTON_BP1 0 /// Push button #2 index. #define PUSHBUTTON_BP2 1 /// Simulated joystick LEFT index. #define JOYSTICK_LEFT 0 /// Simulated joystick RIGHT index. #define JOYSTICK_RIGHT 1 /// PWMC PWM0 pin definition. #define PIN_PWMC_PWMH0 {1 << 0, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT} #define PIN_PWMC_PWML0 {1 << 7, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT} /// PWMC PWM1 pin definition. #define PIN_PWMC_PWMH1 {1 << 1, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT} #define PIN_PWMC_PWML1 {1 << 8, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT} /// PWMC PWM2 pin definition. #define PIN_PWMC_PWMH2 {1 << 2, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT} #define PIN_PWMC_PWML2 {1 << 9, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT} /// PWM pin definition for LED0 #define PIN_PWM_LED0 PIN_PWMC_PWMH0 /// PWM pin definition for LED1 #define PIN_PWM_LED1 PIN_PWMC_PWMH1 /// PWM pin definition for LED2 #define PIN_PWM_LED2 PIN_PWMC_PWMH2 /// PWM channel for LED0 #define CHANNEL_PWM_LED0 0 /// PWM channel for LED1 #define CHANNEL_PWM_LED1 1 /// PWM channel for LED2 #define CHANNEL_PWM_LED2 2 /// SPI0 MISO pin definition. #define PIN_SPI0_MISO {1 << 13, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} /// SPI0 MOSI pin definition. #define PIN_SPI0_MOSI {1 << 14, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} /// SPI0 SPCK pin definition. #define PIN_SPI0_SPCK {1 << 15, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} /// SPI0 chip select 2 pin definition. //#define PIN_SPI0_NPCS2_PC14 {1 << 14, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT} #define PIN_SPI0_NPCS2_PC14 {1 << 14, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_OUTPUT_0, PIO_PULLUP} /// List of SPI0 pin definitions (MISO, MOSI & SPCK). #define PINS_SPI0 PIN_SPI0_MISO, PIN_SPI0_MOSI, PIN_SPI0_SPCK /// SSC pins definition. #define PIN_SSC_TD {0x1 << 26, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} #define PIN_SSC_TK {0x1 << 28, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} #define PIN_SSC_TF {0x1 << 30, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} #define PINS_SSC_CODEC PIN_SSC_TD, PIN_SSC_TK, PIN_SSC_TF /// PCK0 #define PIN_PCK0 {0x1 << 21, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT} /// TWI pins definition. #define TWI_V3XX #define PIN_TWI_TWD0 {0x1 << 9, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} #define PIN_TWI_TWCK0 {0x1 << 10, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} #define PINS_TWI0 PIN_TWI_TWD0, PIN_TWI_TWCK0 #define PIN_TWI_TWD1 {0x1 << 24, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} #define PIN_TWI_TWCK1 {0x1 << 25, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} #define PINS_TWI1 PIN_TWI_TWD1, PIN_TWI_TWCK1 /// USART0 #define PIN_USART0_RXD {0x1 << 19, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} #define PIN_USART0_TXD {0x1 << 18, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} #define PIN_USART0_CTS {0x1 << 8, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT} #define PIN_USART0_RTS {0x1 << 7, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT} #define PIN_USART0_SCK {0x1 << 17, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} /// USART1 #define PIN_USART1_RXD {0x1 << 21, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} #define PIN_USART1_TXD {0x1 << 20, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT} #define PIN_USART1_CTS {0x1 << 23, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT} #define PIN_USART1_RTS {0x1 << 22, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT} #define PIN_USART1_SCK {0x1 << 24, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT} /// USB VBus monitoring pin definition. #define PIN_USB_VBUS {1 << 0, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_INPUT, PIO_DEFAULT} //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "SAM3UE-EK - External components" /// This page lists the definitions related to external on-board components /// located in the board.h file for the AT91SAM3UE-EK. /// /// !AT45 Dataflash Card /// - BOARD_AT45_A_SPI_BASE /// - BOARD_AT45_A_SPI_ID /// - BOARD_AT45_A_SPI_PINS /// - BOARD_AT45_A_SPI /// - BOARD_AT45_A_NPCS /// - BOARD_AT45_A_NPCS_PIN /// /// !AT45 Dataflash (serial onboard DataFlash) /// - BOARD_AT45_B_SPI_BASE /// - BOARD_AT45_B_SPI_ID /// - BOARD_AT45_B_SPI_PINS /// - BOARD_AT45_B_SPI /// - BOARD_AT45_B_NPCS /// - BOARD_AT45_B_NPCS_PIN /// /// !AT26 Serial Flash /// - BOARD_AT26_A_SPI_BASE /// - BOARD_AT26_A_SPI_ID /// - BOARD_AT26_A_SPI_PINS /// - BOARD_AT26_A_SPI /// - BOARD_AT26_A_NPCS /// - BOARD_AT26_A_NPCS_PIN /// /// !SD Card /// - BOARD_SD_MCI_BASE /// - BOARD_SD_MCI_ID /// - BOARD_SD_PINS /// - BOARD_SD_SLOT /// /// !PSRAM /// - BOARD_EBI_PSRAM /// - BOARD_PSRAM_PINS /// - BOARD_LCD_PINS /// Base address of SPI peripheral connected to the dataflash. //#define BOARD_AT45_A_SPI_BASE AT91C_BASE_SPI0 ///// Identifier of SPI peripheral connected to the dataflash. //#define BOARD_AT45_A_SPI_ID AT91C_ID_SPI0 ///// Pins of the SPI peripheral connected to the dataflash. //#define BOARD_AT45_A_SPI_PINS PINS_SPI0 ///// Dataflahs SPI number. //#define BOARD_AT45_A_SPI 0 ///// Chip select connected to the dataflash. //#define BOARD_AT45_A_NPCS 3 ///// Chip select pin connected to the dataflash. //#define BOARD_AT45_A_NPCS_PIN PIN_SPI0_NPCS3 /// Base address of SPI peripheral connected to the dataflash. //#define BOARD_AT45_B_SPI_BASE AT91C_BASE_SPI1 ///// Identifier of SPI peripheral connected to the dataflash. //#define BOARD_AT45_B_SPI_ID AT91C_ID_SPI1 ///// Pins of the SPI peripheral connected to the dataflash. //#define BOARD_AT45_B_SPI_PINS PINS_SPI1 ///// Dataflahs SPI number. //#define BOARD_AT45_B_SPI 1 ///// Chip select connected to the dataflash. //#define BOARD_AT45_B_NPCS 3 ///// Chip select pin connected to the dataflash. //#define BOARD_AT45_B_NPCS_PIN PIN_SPI1_NPCS3 /// Base address of SPI peripheral connected to the serialflash. //#define BOARD_AT26_A_SPI_BASE AT91C_BASE_SPI0 ///// Identifier of SPI peripheral connected to the serialflash. //#define BOARD_AT26_A_SPI_ID AT91C_ID_SPI0 ///// Pins of the SPI peripheral connected to the serialflash. //#define BOARD_AT26_A_SPI_PINS PINS_SPI0 ///// Serialflash SPI number. //#define BOARD_AT26_A_SPI 0 ///// Chip select connected to the serialflash. //#define BOARD_AT26_A_NPCS 3 ///// Chip select pin connected to the serialflash. //#define BOARD_AT26_A_NPCS_PIN PIN_SPI0_NPCS3 /// Base address of the MCI peripheral connected to the SD card. #define BOARD_SD_MCI_BASE AT91C_BASE_MCI0//AT91C_BASE_MCI ///// Peripheral identifier of the MCI connected to the SD card. #define BOARD_SD_MCI_ID AT91C_ID_MCI0 //AT91C_ID_MCI ///// MCI pins that shall be configured to access the SD card. #define BOARD_SD_PINS PINS_MCI #define BOARD_SD_DAT0 PIN_MCI_DAT0 ///// MCI slot to which the SD card is connected to. #define BOARD_SD_SLOT MCI_SD_SLOTA ///// MCI Card Detect pin. #define BOARD_SD_PIN_CD PIN_MCI_CD #define BOARD_EBI_PSRAM 0x60000000 #define BOARD_PSRAM_PINS PIN_EBI_DATA_BUS, PIN_EBI_NCS0, PIN_EBI_NRD, PIN_EBI_NWE, \ PIN_EBI_PSRAM_ADDR_BUS, PIN_EBI_PSRAM_NBS, PIN_EBI_A1 /// Indicates board has an HX8347 external component to manage LCD. #define BOARD_LCD_HX8347 /// LCD pins definition. #define BOARD_LCD_PINS PIN_EBI_DATA_BUS, PIN_EBI_LCD_RS, PIN_EBI_NRD, PIN_EBI_NWE, \ PIN_EBI_NCS2 /// Backlight pin definition. #define BOARD_BACKLIGHT_PIN {1 << 19, AT91C_BASE_PIOC, AT91C_ID_PIOC, \ PIO_OUTPUT_0, PIO_DEFAULT} /// Define HX8347 base address. #define BOARD_LCD_BASE 0x62000000 /// Define HX8347 register select signal. #define BOARD_LCD_RS (1 << 1) /// Display width in pixels. #define BOARD_LCD_WIDTH 240 /// Display height in pixels. #define BOARD_LCD_HEIGHT 320 /// Indicates board has an ADS7843 external component to manage Touch Screen #define BOARD_TSC_ADS7843 /// Touchscreen controller IRQ pin definition. #define PIN_TCS_IRQ {AT91C_PIO_PA24, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_INPUT, PIO_PULLUP} /// Touchscreen controller Busy pin definition. #define PIN_TCS_BUSY {AT91C_PIO_PA2, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_INPUT, PIO_PULLUP} /// Base address of SPI peripheral connected to the touchscreen controller. #define BOARD_TSC_SPI_BASE AT91C_BASE_SPI0 /// Identifier of SPI peripheral connected to the touchscreen controller. #define BOARD_TSC_SPI_ID AT91C_ID_SPI0 /// Pins of the SPI peripheral connected to the touchscreen controller. #define BOARD_TSC_SPI_PINS PINS_SPI0 /// Chip select connected to the touchscreen controller. #define BOARD_TSC_NPCS 2//2 /// Chip select pin connected to the touchscreen controller. #define BOARD_TSC_NPCS_PIN PIN_SPI0_NPCS2_PC14 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "SAM3UE-EK - Memories" /// This page lists definitions related to internal & external on-board memories. /// /// !Embedded Flash /// - BOARD_FLASH_EFC /// Internal SRAM address #define AT91C_ISRAM AT91C_IRAM #define AT91C_ISRAM_SIZE AT91C_IRAM_SIZE #define AT91C_IFLASH (0x80000) #define AT91C_IFLASH_SIZE (0x20000) #define AT91C_IFLASH_PAGE_SIZE (256) // Internal FLASH 0 Page Size: 256 bytes #define AT91C_IFLASH_NB_OF_PAGES (512) // Internal FLASH 0 Number of Pages: 512 #define AT91C_IFLASH_LOCK_REGION_SIZE (8192) // Internal FLASH 0 Lock Region Size: 8 Kbytes #define AT91C_IFLASH_NB_OF_LOCK_BITS (16) // Internal FLASH 0 Number of Lock Bits: 32 #if 0 #define AT91C_IFLASH1 (0x100000) #define AT91C_IFLASH1_SIZE (0x20000) #define AT91C_IFLASH1_PAGE_SIZE (256) // Internal FLASH 1 Page Size: 256 bytes #define AT91C_IFLASH1_NB_OF_PAGES (512) // Internal FLASH 1 Number of Pages: 512 #define AT91C_IFLASH1_LOCK_REGION_SIZE (8192) // Internal FLASH 1 Lock Region Size: 8 Kbytes #define AT91C_IFLASH1_NB_OF_LOCK_BITS (16) // Internal FLASH 1 Number of Lock Bits: 32 #endif /// Indicates chip has an EFC. #define AT91C_BASE_EFC AT91C_BASE_EFC0 #define AT91C_EBI_PSRAM (0x60000000) #define BOARD_PSRAM_SIZE (0x100000) // PSRAM size 1MBytes //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "SAM3UE-EK - External components" /// This page lists the definitions related to external on-board components /// located in the board.h file for the SAM3UE-EK. /// /// !ISO7816 /// - PIN_SMARTCARD_CONNECT /// - PIN_ISO7816_RSTMC /// - PINS_ISO7816 /// /// !DMA /// /// - BOARD_MCI_DMA_CHANNEL /// - BOARD_SSC_DMA_CHANNEL /// /// - DMA_HW_SRC_REQ_ID_MCI0 /// - DMA_HW_DEST_REQ_ID_MCI0 /// - DMA_HW_SRC_REQ_ID_MCI1 /// - DMA_HW_DEST_REQ_ID_MCI1 /// /// - BOARD_SD_DMA_HW_SRC_REQ_ID /// - BOARD_SD_DMA_HW_DEST_REQ_ID /// - BOARD_SSC_DMA_HW_SRC_REQ_ID /// - BOARD_SSC_DMA_HW_DEST_REQ_ID /// Smartcard detection pin #define PIN_SMARTCARD_CONNECT {1 << 5, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_INPUT, PIO_DEFAULT} /// PIN used for reset the smartcard #define PIN_ISO7816_RSTMC {1 << 7, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT} /// Pins used for connect the smartcard #define PINS_ISO7816 PIN_USART0_TXD, PIN_USART0_SCK, PIN_ISO7816_RSTMC /// Dma channel number #define BOARD_MCI_DMA_CHANNEL 0 #define BOARD_SSC_DMA_CHANNEL 2 /// MCI0 DMA hardware handshaking ID #define DMA_HW_SRC_REQ_ID_MCI0 AT91C_HDMA_SRC_PER_0 #define DMA_HW_DEST_REQ_ID_MCI0 AT91C_HDMA_DST_PER_0 /// MCI1 DMA hardware handshaking ID #define DMA_HW_SRC_REQ_ID_MCI1 AT91C_HDMA_SRC_PER_13 #define DMA_HW_DEST_REQ_ID_MCI1 AT91C_HDMA_DST_PER_13 /// SD DMA hardware handshaking ID #define BOARD_SD_DMA_HW_SRC_REQ_ID DMA_HW_SRC_REQ_ID_MCI0 #define BOARD_SD_DMA_HW_DEST_REQ_ID DMA_HW_DEST_REQ_ID_MCI0 /// SSC DMA hardware handshaking ID #define BOARD_SSC_DMA_HW_SRC_REQ_ID AT91C_HDMA_SRC_PER_3 #define BOARD_SSC_DMA_HW_DEST_REQ_ID AT91C_HDMA_DST_PER_3 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "SAM3UE-EK - Individual chip definition" /// This page lists the definitions related to different chip's definition /// located in the board.h file for the SAM3UE-EK. /// DBGU #define BOARD_DBGU_ID AT91C_ID_DBGU /// Rtc #define BOARD_RTC_ID AT91C_ID_RTC /// Twi eeprom #define BOARD_ID_TWI_EEPROM AT91C_ID_TWI1 #define BOARD_BASE_TWI_EEPROM AT91C_BASE_TWI1 #define BOARD_PINS_TWI_EEPROM PINS_TWI1 /// USART #define BOARD_PIN_USART_RXD PIN_USART1_RXD #define BOARD_PIN_USART_TXD PIN_USART1_TXD #define BOARD_PIN_USART_CTS PIN_USART1_CTS #define BOARD_PIN_USART_RTS PIN_USART1_RTS #define BOARD_USART_BASE AT91C_BASE_US1 #define BOARD_ID_USART AT91C_ID_US1 /// Dummy define SDRAM bus width #define BOARD_SDRAM_BUSWIDTH 32 //------------------------------------------------------------------------------ #define PIN_EBI_NANDOE {1 << 17, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_PULLUP} #define PIN_EBI_NANDWE {1 << 18, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_PULLUP} #define PIN_EBI_NANDCLE {1 << 22, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_PULLUP} #define PIN_EBI_NANDALE {1 << 21, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_PULLUP} #if defined(CHIP_NAND_CTRL) /// Nandflash chip enable pin definition. #define BOARD_NF_CE_PIN {1 << 12, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_PERIPH_A, PIO_PULLUP} /// Nandflash ready/busy pin definition. #define BOARD_NF_RB_PIN {1 << 24, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_PERIPH_A, PIO_PULLUP} /// Nandflash controller peripheral pins definition. #define PINS_NANDFLASH BOARD_NF_CE_PIN, BOARD_NF_RB_PIN, PIN_EBI_NANDOE, PIN_EBI_NANDWE,\ PIN_EBI_NANDCLE, PIN_EBI_NANDALE, PIN_EBI_DATA_BUS /// Address for transferring command bytes to the nandflash. #define BOARD_NF_COMMAND_ADDR 0x60000000 /// Address for transferring address bytes to the nandflash. #define BOARD_NF_ADDRESS_ADDR 0x61200000 /// Address for transferring data bytes to the nandflash. #define BOARD_NF_DATA_ADDR 0x61000000 #else /// Nandflash controller peripheral pins definition. #define PINS_NANDFLASH PIN_EBI_DATA_BUS, BOARD_NF_CE_PIN, BOARD_NF_RB_PIN, PIN_EBI_NANDOE, PIN_EBI_NANDWE,\ PIN_EBI_NANDCLE, PIN_EBI_NANDALE /// Nandflash chip enable pin definition. #define BOARD_NF_CE_PIN {1 << 12, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_OUTPUT_1, PIO_DEFAULT} /// Nandflash ready/busy pin definition. #define BOARD_NF_RB_PIN {1 << 24, AT91C_BASE_PIOB, AT91C_ID_PIOB, PIO_INPUT, PIO_PULLUP} /// Address for transferring command bytes to the nandflash. #define BOARD_NF_COMMAND_ADDR 0x61400000 /// Address for transferring address bytes to the nandflash. #define BOARD_NF_ADDRESS_ADDR 0x61200000 /// Address for transferring data bytes to the nandflash. #define BOARD_NF_DATA_ADDR 0x61000000 #endif #endif //#ifndef BOARD_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/board/board_lowlevel.c000066400000000000000000000215531207233610700256600ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !Purpose /// /// Provides the low-level initialization function that gets called on chip /// startup. /// /// !Usage /// /// LowLevelInit() is called in #board_cstartup_xxx.c#. //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include //#include "board_memories.h" #include #include //------------------------------------------------------------------------------ // Local definitions //------------------------------------------------------------------------------ // Settings at 48/48MHz #define AT91C_CKGR_MUL_SHIFT 16 #define AT91C_CKGR_OUT_SHIFT 14 #define AT91C_CKGR_PLLCOUNT_SHIFT 8 #define AT91C_CKGR_DIV_SHIFT 0 #define BOARD_OSCOUNT (AT91C_CKGR_MOSCXTST & (0x3F << 8)) #define BOARD_PLLR ((1 << 29) | (0x7 << AT91C_CKGR_MUL_SHIFT) \ | (0x0 << AT91C_CKGR_OUT_SHIFT) |(0x3f << AT91C_CKGR_PLLCOUNT_SHIFT) \ | (0x1 << AT91C_CKGR_DIV_SHIFT)) #define BOARD_MCKR ( AT91C_PMC_PRES_CLK_2 | AT91C_PMC_CSS_PLLA_CLK) // Define clock timeout #define CLOCK_TIMEOUT 0xFFFFFFFF //------------------------------------------------------------------------------ // Local variables //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Local functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// After POR, at91sam3u device is running on 4MHz internal RC /// At the end of the LowLevelInit procedure MCK = 48MHz PLLA = 96 CPU=48MHz /// Performs the low-level initialization of the chip. This includes EFC, master /// clock, IRQ & watchdog configuration. //------------------------------------------------------------------------------ void LowLevelInit(void) { unsigned int timeout = 0; /* Set 2 WS for Embedded Flash Access ************************************/ AT91C_BASE_EFC0->EFC_FMR = AT91C_EFC_FWS_2WS; AT91C_BASE_EFC1->EFC_FMR = AT91C_EFC_FWS_2WS; /* Watchdog initialization *************************/ AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; /* Select external slow clock ****************************/ if ((AT91C_BASE_SUPC->SUPC_SR & AT91C_SUPC_SR_OSCSEL_CRYST) != AT91C_SUPC_SR_OSCSEL_CRYST) { AT91C_BASE_SUPC->SUPC_CR = AT91C_SUPC_CR_XTALSEL_CRYSTAL_SEL | (0xA5 << 24); timeout = 0; while (!(AT91C_BASE_SUPC->SUPC_SR & AT91C_SUPC_SR_OSCSEL_CRYST) && (timeout++ < CLOCK_TIMEOUT)); } /* Initialize main oscillator ****************************/ if(!(AT91C_BASE_PMC->PMC_MOR & AT91C_CKGR_MOSCSEL)) { AT91C_BASE_PMC->PMC_MOR = (0x37 << 16) | BOARD_OSCOUNT | AT91C_CKGR_MOSCRCEN | AT91C_CKGR_MOSCXTEN; timeout = 0; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCXTS) && (timeout++ < CLOCK_TIMEOUT)); } /* Switch to moscsel */ AT91C_BASE_PMC->PMC_MOR = (0x37 << 16) | BOARD_OSCOUNT | AT91C_CKGR_MOSCRCEN | AT91C_CKGR_MOSCXTEN | AT91C_CKGR_MOSCSEL; timeout = 0; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCSELS) && (timeout++ < CLOCK_TIMEOUT)); AT91C_BASE_PMC->PMC_MCKR = (AT91C_BASE_PMC->PMC_MCKR & ~AT91C_PMC_CSS) | AT91C_PMC_CSS_MAIN_CLK; timeout = 0; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) && (timeout++ < CLOCK_TIMEOUT)); /* Initialize PLLA */ AT91C_BASE_PMC->PMC_PLLAR = BOARD_PLLR; timeout = 0; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA) && (timeout++ < CLOCK_TIMEOUT)); /* Initialize UTMI for USB usage */ AT91C_BASE_CKGR->CKGR_UCKR |= (AT91C_CKGR_UPLLCOUNT & (3 << 20)) | AT91C_CKGR_UPLLEN; timeout = 0; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKU) && (timeout++ < CLOCK_TIMEOUT)); /* Switch to fast clock **********************/ AT91C_BASE_PMC->PMC_MCKR = (BOARD_MCKR & ~AT91C_PMC_CSS) | AT91C_PMC_CSS_MAIN_CLK; timeout = 0; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) && (timeout++ < CLOCK_TIMEOUT)); AT91C_BASE_PMC->PMC_MCKR = BOARD_MCKR; timeout = 0; while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) && (timeout++ < CLOCK_TIMEOUT)); /* Enable clock for UART ************************/ AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_DBGU); /* Optimize CPU setting for speed */ SetDefaultMaster(1); } ////------------------------------------------------------------------------------ ///// Enable or disable default master access ///// \param enalbe 1 enable defaultMaster settings, 0 disable it. ////------------------------------------------------------------------------------ //void SetDefaultMaster(unsigned char enable) //{ // AT91PS_HMATRIX2 pMatrix = AT91C_BASE_MATRIX; // // // Set default master // if (enable == 1) { // // // Set default master: SRAM0 -> Cortex-M3 System // pMatrix->HMATRIX2_SCFG0 |= AT91C_MATRIX_FIXED_DEFMSTR_SCFG0_ARMS | // AT91C_MATRIX_DEFMSTR_TYPE_FIXED_DEFMSTR; // // // Set default master: SRAM1 -> Cortex-M3 System // pMatrix->HMATRIX2_SCFG1 |= AT91C_MATRIX_FIXED_DEFMSTR_SCFG1_ARMS | // AT91C_MATRIX_DEFMSTR_TYPE_FIXED_DEFMSTR; // // // Set default master: Internal flash0 -> Cortex-M3 Instruction/Data // pMatrix->HMATRIX2_SCFG3 |= AT91C_MATRIX_FIXED_DEFMSTR_SCFG3_ARMC | // AT91C_MATRIX_DEFMSTR_TYPE_FIXED_DEFMSTR; // } else { // // // Clear default master: SRAM0 -> Cortex-M3 System // pMatrix->HMATRIX2_SCFG0 &= (~AT91C_MATRIX_DEFMSTR_TYPE); // // // Clear default master: SRAM1 -> Cortex-M3 System // pMatrix->HMATRIX2_SCFG1 &= (~AT91C_MATRIX_DEFMSTR_TYPE); // // // Clear default master: Internal flash0 -> Cortex-M3 Instruction/Data // pMatrix->HMATRIX2_SCFG3 &= (~AT91C_MATRIX_DEFMSTR_TYPE); // } //} //------------------------------------------------------------------------------ /// Set flash wait state /// \param ws Value of flash wait state //------------------------------------------------------------------------------ void SetFlashWaitState(unsigned char ws) { // Set Wait State for Embedded Flash Access AT91C_BASE_EFC0->EFC_FMR = ((ws << 8) & AT91C_EFC_FWS); AT91C_BASE_EFC1->EFC_FMR = ((ws << 8) & AT91C_EFC_FWS); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/board/board_lowlevel.h000066400000000000000000000050231207233610700256570ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !!!Purpose /// /// Collection of methods for lowlevel. /// //------------------------------------------------------------------------------ #ifndef BOARD_LOWLEVEL_H #define BOARD_LOWLEVEL_H //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern void LowLevelInit(void); extern void SetDefaultMaster(unsigned char enable); extern void SetFlashWaitState(unsigned char ws); #endif // BOARD_LOWLEVEL_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/board/chip.h000066400000000000000000000077361207233610700236170ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// !Purpose /// /// Definition of AT91SAM3U4 characteristics and features /// /// !Usage /// -# For ARM core feature, see "AT91SAM3U4 - ARM core features". /// -# For IP features, see "AT91SAM3U4 - IP features". /// -# For misc, see "AT91SAM3U4 - Misc". //------------------------------------------------------------------------------ #ifndef CHIP_H #define CHIP_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "AT91SAM3U4 - ARM core features" /// This page lists several characteristics related to the ARM core /// //ARM core features /// ARM core definition. #define cortexm3 /// family definition. #define at91sam3u //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "AT91SAM3U4 - IP features" /// This page lists several characteristics related to the embedded IP /// //IP FEATURES // EFC GPNVM number #define CHIP_EFC_NUM_GPNVMS 3 /// Indicates chip has an Enhanced EFC. #define CHIP_FLASH_EEFC // DMA channels number #define CHIP_DMA_CHANNEL_NUM 4 // Indicate chip's MCI interface. #define MCI2_INTERFACE // Indicate chip SSC has DMA interface. #define CHIP_SSC_DMA //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "AT91SAM3U4 - Misc " /// This page lists misc features /// //Misc //------------------------------------------------------------------------------ #endif //#ifndef CHIP_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/board/exceptions.h000066400000000000000000000121611207233610700250410ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /* ** This file contains the default exception handlers ** and exception table. */ //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ /// Function prototype for exception table items - interrupt handler. //typedef void( *IrqHandler )( void ); typedef void( *IntFunc )( void ); /// Weak attribute #if defined ( __CC_ARM ) #define WEAK __attribute__ ((weak)) #elif defined ( __ICCARM__ ) #define WEAK __weak #elif defined ( __GNUC__ ) #define WEAK __attribute__ ((weak)) #endif //------------------------------------------------------------------------------ // Global functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Exception Handlers //------------------------------------------------------------------------------ extern WEAK void NMI_Handler( void ); extern WEAK void HardFault_Handler( void ); extern WEAK void MemManage_Handler( void ); extern WEAK void BusFault_Handler( void ); extern WEAK void UsageFault_Handler( void ); extern WEAK void SVC_Handler( void ); extern WEAK void DebugMon_Handler( void ); extern WEAK void PendSV_Handler( void ); extern WEAK void SysTick_Handler( void ); void IrqHandlerNotUsed(void); // System Controller extern void SYS_IrqHandler(void); // SUPPLY CONTROLLER extern WEAK void SUPC_IrqHandler(void); // RESET CONTROLLER extern WEAK void RSTC_IrqHandler(void); // REAL TIME CLOCK extern WEAK void RTC_IrqHandler(void); // REAL TIME TIMER extern WEAK void RTT_IrqHandler(void); // WATCHDOG TIMER extern WEAK void WDT_IrqHandler(void); // PMC extern WEAK void PMC_IrqHandler(void); // EFC0 extern WEAK void EFC0_IrqHandler(void); // EFC1 extern WEAK void EFC1_IrqHandler(void); // DBGU extern WEAK void DBGU_IrqHandler(void); // HSMC4 extern WEAK void HSMC4_IrqHandler(void); // Parallel IO Controller A extern WEAK void PIOA_IrqHandler(void); // Parallel IO Controller B extern WEAK void PIOB_IrqHandler(void); // Parallel IO Controller C extern WEAK void PIOC_IrqHandler(void); // USART 0 extern WEAK void USART0_IrqHandler(void); // USART 1 extern WEAK void USART1_IrqHandler(void); // USART 2 extern WEAK void USART2_IrqHandler(void); // USART 3 extern WEAK void USART3_IrqHandler(void); // Multimedia Card Interface extern WEAK void MCI0_IrqHandler(void); // TWI 0 extern WEAK void TWI0_IrqHandler(void); // TWI 1 extern WEAK void TWI1_IrqHandler(void); // Serial Peripheral Interface 0 extern WEAK void SPI0_IrqHandler(void); // Serial Synchronous Controller 0 extern WEAK void SSC0_IrqHandler(void); // Timer Counter 0 extern WEAK void TC0_IrqHandler(void); // Timer Counter 1 extern WEAK void TC1_IrqHandler(void); // Timer Counter 2 extern WEAK void TC2_IrqHandler(void); // PWM Controller extern WEAK void PWM_IrqHandler(void); // ADC controller0 extern WEAK void ADCC0_IrqHandler(void); // ADC controller1 extern WEAK void ADCC1_IrqHandler(void); // HDMA extern WEAK void HDMA_IrqHandler(void); // USB Device High Speed UDP_HS extern WEAK void UDPD_IrqHandler(void); tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/cmsis/000077500000000000000000000000001207233610700225355ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/cmsis/core_cm3.c000066400000000000000000000420251207233610700243760ustar00rootroot00000000000000/****************************************************************************** * @file: core_cm3.c * @purpose: CMSIS Cortex-M3 Core Peripheral Access Layer Source File * @version: V1.10 * @date: 24. Feb. 2009 *---------------------------------------------------------------------------- * * Copyright (C) 2009 ARM Limited. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * ARM Limited (ARM) is supplying this software for use with Cortex-Mx * processor based microcontrollers. This file can be freely distributed * within development tools that are supporting such ARM based processors. * ******************************************************************************/ #include /* define compiler specific symbols */ #if defined ( __CC_ARM ) #define __ASM __asm /*!< asm keyword for armcc */ #define __INLINE __inline /*!< inline keyword for armcc */ #elif defined ( __ICCARM__ ) #define __ASM __asm /*!< asm keyword for iarcc */ #define __INLINE inline /*!< inline keyword for iarcc. Only avaiable in High optimization mode! */ #define __nop __no_operation /*!< no operation intrinsic in iarcc */ #elif defined ( __GNUC__ ) #define __ASM asm /*!< asm keyword for gcc */ #define __INLINE inline /*!< inline keyword for gcc */ #endif #if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ /** * @brief Return the Process Stack Pointer * * @param none * @return uint32_t ProcessStackPointer * * Return the actual process stack pointer */ __ASM uint32_t __get_PSP(void) { mrs r0, psp bx lr } /** * @brief Set the Process Stack Pointer * * @param uint32_t Process Stack Pointer * @return none * * Assign the value ProcessStackPointer to the MSP * (process stack pointer) Cortex processor register */ __ASM void __set_PSP(uint32_t topOfProcStack) { msr psp, r0 bx lr } /** * @brief Return the Main Stack Pointer * * @param none * @return uint32_t Main Stack Pointer * * Return the current value of the MSP (main stack pointer) * Cortex processor register */ __ASM uint32_t __get_MSP(void) { mrs r0, msp bx lr } /** * @brief Set the Main Stack Pointer * * @param uint32_t Main Stack Pointer * @return none * * Assign the value mainStackPointer to the MSP * (main stack pointer) Cortex processor register */ __ASM void __set_MSP(uint32_t mainStackPointer) { msr msp, r0 bx lr } /** * @brief Reverse byte order in unsigned short value * * @param uint16_t value to reverse * @return uint32_t reversed value * * Reverse byte order in unsigned short value */ __ASM uint32_t __REV16(uint16_t value) { rev16 r0, r0 bx lr } /** * @brief Reverse byte order in signed short value with sign extension to integer * * @param int16_t value to reverse * @return int32_t reversed value * * Reverse byte order in signed short value with sign extension to integer */ __ASM int32_t __REVSH(int16_t value) { revsh r0, r0 bx lr } #if (__ARMCC_VERSION < 400000) /** * @brief Remove the exclusive lock created by ldrex * * @param none * @return none * * Removes the exclusive lock which is created by ldrex. */ __ASM void __CLREX(void) { clrex } /** * @brief Return the Base Priority value * * @param none * @return uint32_t BasePriority * * Return the content of the base priority register */ __ASM uint32_t __get_BASEPRI(void) { mrs r0, basepri bx lr } /** * @brief Set the Base Priority value * * @param uint32_t BasePriority * @return none * * Set the base priority register */ __ASM void __set_BASEPRI(uint32_t basePri) { msr basepri, r0 bx lr } /** * @brief Return the Priority Mask value * * @param none * @return uint32_t PriMask * * Return the state of the priority mask bit from the priority mask * register */ __ASM uint32_t __get_PRIMASK(void) { mrs r0, primask bx lr } /** * @brief Set the Priority Mask value * * @param uint32_t PriMask * @return none * * Set the priority mask bit in the priority mask register */ __ASM void __set_PRIMASK(uint32_t priMask) { msr primask, r0 bx lr } /** * @brief Return the Fault Mask value * * @param none * @return uint32_t FaultMask * * Return the content of the fault mask register */ __ASM uint32_t __get_FAULTMASK(void) { mrs r0, faultmask bx lr } /** * @brief Set the Fault Mask value * * @param uint32_t faultMask value * @return none * * Set the fault mask register */ __ASM void __set_FAULTMASK(uint32_t faultMask) { msr faultmask, r0 bx lr } /** * @brief Return the Control Register value * * @param none * @return uint32_t Control value * * Return the content of the control register */ __ASM uint32_t __get_CONTROL(void) { mrs r0, control bx lr } /** * @brief Set the Control Register value * * @param uint32_t Control value * @return none * * Set the control register */ __ASM void __set_CONTROL(uint32_t control) { msr control, r0 bx lr } #endif /* __ARMCC_VERSION */ #elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/ #pragma diag_suppress=Pe940 /** * @brief Return the Process Stack Pointer * * @param none * @return uint32_t ProcessStackPointer * * Return the actual process stack pointer */ uint32_t __get_PSP(void) { __ASM("mrs r0, psp"); __ASM("bx lr"); } /** * @brief Set the Process Stack Pointer * * @param uint32_t Process Stack Pointer * @return none * * Assign the value ProcessStackPointer to the MSP * (process stack pointer) Cortex processor register */ void __set_PSP(uint32_t topOfProcStack) { __ASM("msr psp, r0"); __ASM("bx lr"); } /** * @brief Return the Main Stack Pointer * * @param none * @return uint32_t Main Stack Pointer * * Return the current value of the MSP (main stack pointer) * Cortex processor register */ uint32_t __get_MSP(void) { __ASM("mrs r0, msp"); __ASM("bx lr"); } /** * @brief Set the Main Stack Pointer * * @param uint32_t Main Stack Pointer * @return none * * Assign the value mainStackPointer to the MSP * (main stack pointer) Cortex processor register */ void __set_MSP(uint32_t topOfMainStack) { __ASM("msr msp, r0"); __ASM("bx lr"); } /** * @brief Reverse byte order in unsigned short value * * @param uint16_t value to reverse * @return uint32_t reversed value * * Reverse byte order in unsigned short value */ uint32_t __REV16(uint16_t value) { __ASM("rev16 r0, r0"); __ASM("bx lr"); } /** * @brief Reverse bit order of value * * @param uint32_t value to reverse * @return uint32_t reversed value * * Reverse bit order of value */ uint32_t __RBIT(uint32_t value) { __ASM("rbit r0, r0"); __ASM("bx lr"); } /** * @brief LDR Exclusive * * @param uint8_t* address * @return uint8_t value of (*address) * * Exclusive LDR command */ uint8_t __LDREXB(uint8_t *addr) { __ASM("ldrexb r0, [r0]"); __ASM("bx lr"); } /** * @brief LDR Exclusive * * @param uint16_t* address * @return uint16_t value of (*address) * * Exclusive LDR command */ uint16_t __LDREXH(uint16_t *addr) { __ASM("ldrexh r0, [r0]"); __ASM("bx lr"); } /** * @brief LDR Exclusive * * @param uint32_t* address * @return uint32_t value of (*address) * * Exclusive LDR command */ uint32_t __LDREXW(uint32_t *addr) { __ASM("ldrex r0, [r0]"); __ASM("bx lr"); } /** * @brief STR Exclusive * * @param uint8_t *address * @param uint8_t value to store * @return uint32_t successful / failed * * Exclusive STR command */ uint32_t __STREXB(uint8_t value, uint8_t *addr) { __ASM("strexb r0, r0, [r1]"); __ASM("bx lr"); } /** * @brief STR Exclusive * * @param uint16_t *address * @param uint16_t value to store * @return uint32_t successful / failed * * Exclusive STR command */ uint32_t __STREXH(uint16_t value, uint16_t *addr) { __ASM("strexh r0, r0, [r1]"); __ASM("bx lr"); } /** * @brief STR Exclusive * * @param uint32_t *address * @param uint32_t value to store * @return uint32_t successful / failed * * Exclusive STR command */ uint32_t __STREXW(uint32_t value, uint32_t *addr) { __ASM("strex r0, r0, [r1]"); __ASM("bx lr"); } #pragma diag_default=Pe940 #elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ /** * @brief Return the Process Stack Pointer * * @param none * @return uint32_t ProcessStackPointer * * Return the actual process stack pointer */ uint32_t __get_PSP(void) { uint32_t result=0; __ASM volatile ("MRS %0, psp" : "=r" (result) ); return(result); } /** * @brief Set the Process Stack Pointer * * @param uint32_t Process Stack Pointer * @return none * * Assign the value ProcessStackPointer to the MSP * (process stack pointer) Cortex processor register */ void __set_PSP(uint32_t topOfProcStack) { __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) ); } /** * @brief Return the Main Stack Pointer * * @param none * @return uint32_t Main Stack Pointer * * Return the current value of the MSP (main stack pointer) * Cortex processor register */ uint32_t __get_MSP(void) { uint32_t result=0; __ASM volatile ("MRS %0, msp" : "=r" (result) ); return(result); } /** * @brief Set the Main Stack Pointer * * @param uint32_t Main Stack Pointer * @return none * * Assign the value mainStackPointer to the MSP * (main stack pointer) Cortex processor register */ void __set_MSP(uint32_t topOfMainStack) { __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) ); } /** * @brief Return the Base Priority value * * @param none * @return uint32_t BasePriority * * Return the content of the base priority register */ uint32_t __get_BASEPRI(void) { uint32_t result=0; __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); return(result); } /** * @brief Set the Base Priority value * * @param uint32_t BasePriority * @return none * * Set the base priority register */ void __set_BASEPRI(uint32_t value) { __ASM volatile ("MSR basepri, %0" : : "r" (value) ); } /** * @brief Return the Priority Mask value * * @param none * @return uint32_t PriMask * * Return the state of the priority mask bit from the priority mask * register */ uint32_t __get_PRIMASK(void) { uint32_t result=0; __ASM volatile ("MRS %0, primask" : "=r" (result) ); return(result); } /** * @brief Set the Priority Mask value * * @param uint32_t PriMask * @return none * * Set the priority mask bit in the priority mask register */ void __set_PRIMASK(uint32_t priMask) { __ASM volatile ("MSR primask, %0" : : "r" (priMask) ); } /** * @brief Return the Fault Mask value * * @param none * @return uint32_t FaultMask * * Return the content of the fault mask register */ uint32_t __get_FAULTMASK(void) { uint32_t result=0; __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); return(result); } /** * @brief Set the Fault Mask value * * @param uint32_t faultMask value * @return none * * Set the fault mask register */ void __set_FAULTMASK(uint32_t faultMask) { __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) ); } /** * @brief Reverse byte order in integer value * * @param uint32_t value to reverse * @return uint32_t reversed value * * Reverse byte order in integer value */ uint32_t __REV(uint32_t value) { uint32_t result=0; __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); return(result); } /** * @brief Reverse byte order in unsigned short value * * @param uint16_t value to reverse * @return uint32_t reversed value * * Reverse byte order in unsigned short value */ uint32_t __REV16(uint16_t value) { uint32_t result=0; __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); return(result); } /** * @brief Reverse byte order in signed short value with sign extension to integer * * @param int32_t value to reverse * @return int32_t reversed value * * Reverse byte order in signed short value with sign extension to integer */ int32_t __REVSH(int16_t value) { uint32_t result=0; __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); return(result); } /** * @brief Reverse bit order of value * * @param uint32_t value to reverse * @return uint32_t reversed value * * Reverse bit order of value */ uint32_t __RBIT(uint32_t value) { uint32_t result=0; __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); return(result); } /** * @brief LDR Exclusive * * @param uint8_t* address * @return uint8_t value of (*address) * * Exclusive LDR command */ uint8_t __LDREXB(uint8_t *addr) { uint8_t result=0; __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); return(result); } /** * @brief LDR Exclusive * * @param uint16_t* address * @return uint16_t value of (*address) * * Exclusive LDR command */ uint16_t __LDREXH(uint16_t *addr) { uint16_t result=0; __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); return(result); } /** * @brief LDR Exclusive * * @param uint32_t* address * @return uint32_t value of (*address) * * Exclusive LDR command */ uint32_t __LDREXW(uint32_t *addr) { uint32_t result=0; __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); return(result); } /** * @brief STR Exclusive * * @param uint8_t *address * @param uint8_t value to store * @return uint32_t successful / failed * * Exclusive STR command */ uint32_t __STREXB(uint8_t value, uint8_t *addr) { uint32_t result=0; __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); return(result); } /** * @brief STR Exclusive * * @param uint16_t *address * @param uint16_t value to store * @return uint32_t successful / failed * * Exclusive STR command */ uint32_t __STREXH(uint16_t value, uint16_t *addr) { uint32_t result=0; __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); return(result); } /** * @brief STR Exclusive * * @param uint32_t *address * @param uint32_t value to store * @return uint32_t successful / failed * * Exclusive STR command */ uint32_t __STREXW(uint32_t value, uint32_t *addr) { uint32_t result=0; __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); return(result); } /** * @brief Return the Control Register value * * @param none * @return uint32_t Control value * * Return the content of the control register */ uint32_t __get_CONTROL(void) { uint32_t result=0; __ASM volatile ("MRS %0, control" : "=r" (result) ); return(result); } /** * @brief Set the Control Register value * * @param uint32_t Control value * @return none * * Set the control register */ void __set_CONTROL(uint32_t control) { __ASM volatile ("MSR control, %0" : : "r" (control) ); } #endif tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/cmsis/core_cm3.h000066400000000000000000001246311207233610700244070ustar00rootroot00000000000000/****************************************************************************** * @file: core_cm3.h * @purpose: CMSIS Cortex-M3 Core Peripheral Access Layer Header File * @version: V1.10 * @date: 24. Feb. 2009 *---------------------------------------------------------------------------- * * Copyright (C) 2009 ARM Limited. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * ARM Limited (ARM) is supplying this software for use with Cortex-Mx * processor based microcontrollers. This file can be freely distributed * within development tools that are supporting such ARM based processors. ******************************************************************************/ #ifndef __CM3_CORE_H__ #define __CM3_CORE_H__ #define __CM3_CMSIS_VERSION_MAIN (0x01) /*!< [31:16] CMSIS HAL main version */ #define __CM3_CMSIS_VERSION_SUB (0x10) /*!< [15:0] CMSIS HAL sub version */ #define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ #define __CORTEX_M (0x03) /*!< Cortex core */ /** * Lint configuration \n * ----------------------- \n * * The following Lint messages will be suppressed and not shown: \n * \n * --- Error 10: --- \n * register uint32_t __regBasePri __asm("basepri"); \n * Error 10: Expecting ';' \n * \n * --- Error 530: --- \n * return(__regBasePri); \n * Warning 530: Symbol '__regBasePri' (line 264) not initialized \n * \n * --- Error 550: --- \n * __regBasePri = (basePri & 0x1ff); \n * } \n * Warning 550: Symbol '__regBasePri' (line 271) not accessed \n * \n * --- Error 754: --- \n * uint32_t RESERVED0[24]; \n * Info 754: local structure member '' (line 109, file ./cm3_core.h) not referenced \n * \n * --- Error 750: --- \n * #define __CM3_CORE_H__ \n * Info 750: local macro '__CM3_CORE_H__' (line 43, file./cm3_core.h) not referenced \n * \n * --- Error 528: --- \n * static __INLINE void NVIC_DisableIRQ(uint32_t IRQn) \n * Warning 528: Symbol 'NVIC_DisableIRQ(unsigned int)' (line 419, file ./cm3_core.h) not referenced \n * \n * --- Error 751: --- \n * } InterruptType_Type; \n * Info 751: local typedef 'InterruptType_Type' (line 170, file ./cm3_core.h) not referenced \n * \n * \n * Note: To re-enable a Message, insert a space before 'lint' * \n * */ /*lint -save */ /*lint -e10 */ /*lint -e530 */ /*lint -e550 */ /*lint -e754 */ /*lint -e750 */ /*lint -e528 */ /*lint -e751 */ #include /* Include standard types */ #if defined (__ICCARM__) #include /* IAR Intrinsics */ #endif #ifndef __NVIC_PRIO_BITS #define __NVIC_PRIO_BITS 4 /*!< standard definition for NVIC Priority Bits */ #endif /** * IO definitions * * define access restrictions to peripheral registers */ #define __I volatile const /*!< defines 'read only' permissions */ #define __O volatile /*!< defines 'write only' permissions */ #define __IO volatile /*!< defines 'read / write' permissions */ /******************************************************************************* * Register Abstraction ******************************************************************************/ /* System Reset */ #define NVIC_VECTRESET 0 /*!< Vector Reset Bit */ #define NVIC_SYSRESETREQ 2 /*!< System Reset Request */ #define NVIC_AIRCR_VECTKEY (0x5FA << 16) /*!< AIRCR Key for write access */ #define NVIC_AIRCR_ENDIANESS 15 /*!< Endianess */ /* Core Debug */ #define CoreDebug_DEMCR_TRCENA (1 << 24) /*!< DEMCR TRCENA enable */ #define ITM_TCR_ITMENA 1 /*!< ITM enable */ /* memory mapping struct for Nested Vectored Interrupt Controller (NVIC) */ typedef struct { __IO uint32_t ISER[8]; /*!< Interrupt Set Enable Register */ uint32_t RESERVED0[24]; __IO uint32_t ICER[8]; /*!< Interrupt Clear Enable Register */ uint32_t RSERVED1[24]; __IO uint32_t ISPR[8]; /*!< Interrupt Set Pending Register */ uint32_t RESERVED2[24]; __IO uint32_t ICPR[8]; /*!< Interrupt Clear Pending Register */ uint32_t RESERVED3[24]; __IO uint32_t IABR[8]; /*!< Interrupt Active bit Register */ uint32_t RESERVED4[56]; __IO uint8_t IP[240]; /*!< Interrupt Priority Register, 8Bit wide */ uint32_t RESERVED5[644]; __O uint32_t STIR; /*!< Software Trigger Interrupt Register */ } NVIC_Type; /* memory mapping struct for System Control Block */ typedef struct { __I uint32_t CPUID; /*!< CPU ID Base Register */ __IO uint32_t ICSR; /*!< Interrupt Control State Register */ __IO uint32_t VTOR; /*!< Vector Table Offset Register */ __IO uint32_t AIRCR; /*!< Application Interrupt / Reset Control Register */ __IO uint32_t SCR; /*!< System Control Register */ __IO uint32_t CCR; /*!< Configuration Control Register */ __IO uint8_t SHP[12]; /*!< System Handlers Priority Registers (4-7, 8-11, 12-15) */ __IO uint32_t SHCSR; /*!< System Handler Control and State Register */ __IO uint32_t CFSR; /*!< Configurable Fault Status Register */ __IO uint32_t HFSR; /*!< Hard Fault Status Register */ __IO uint32_t DFSR; /*!< Debug Fault Status Register */ __IO uint32_t MMFAR; /*!< Mem Manage Address Register */ __IO uint32_t BFAR; /*!< Bus Fault Address Register */ __IO uint32_t AFSR; /*!< Auxiliary Fault Status Register */ __I uint32_t PFR[2]; /*!< Processor Feature Register */ __I uint32_t DFR; /*!< Debug Feature Register */ __I uint32_t ADR; /*!< Auxiliary Feature Register */ __I uint32_t MMFR[4]; /*!< Memory Model Feature Register */ __I uint32_t ISAR[5]; /*!< ISA Feature Register */ } SCB_Type; /* memory mapping struct for SysTick */ typedef struct { __IO uint32_t CTRL; /*!< SysTick Control and Status Register */ __IO uint32_t LOAD; /*!< SysTick Reload Value Register */ __IO uint32_t VAL; /*!< SysTick Current Value Register */ __I uint32_t CALIB; /*!< SysTick Calibration Register */ } SysTick_Type; /* memory mapping structur for ITM */ typedef struct { __O union { __O uint8_t u8; /*!< ITM Stimulus Port 8-bit */ __O uint16_t u16; /*!< ITM Stimulus Port 16-bit */ __O uint32_t u32; /*!< ITM Stimulus Port 32-bit */ } PORT [32]; /*!< ITM Stimulus Port Registers */ uint32_t RESERVED0[864]; __IO uint32_t TER; /*!< ITM Trace Enable Register */ uint32_t RESERVED1[15]; __IO uint32_t TPR; /*!< ITM Trace Privilege Register */ uint32_t RESERVED2[15]; __IO uint32_t TCR; /*!< ITM Trace Control Register */ uint32_t RESERVED3[29]; __IO uint32_t IWR; /*!< ITM Integration Write Register */ __IO uint32_t IRR; /*!< ITM Integration Read Register */ __IO uint32_t IMCR; /*!< ITM Integration Mode Control Register */ uint32_t RESERVED4[43]; __IO uint32_t LAR; /*!< ITM Lock Access Register */ __IO uint32_t LSR; /*!< ITM Lock Status Register */ uint32_t RESERVED5[6]; __I uint32_t PID4; /*!< ITM Product ID Registers */ __I uint32_t PID5; __I uint32_t PID6; __I uint32_t PID7; __I uint32_t PID0; __I uint32_t PID1; __I uint32_t PID2; __I uint32_t PID3; __I uint32_t CID0; __I uint32_t CID1; __I uint32_t CID2; __I uint32_t CID3; } ITM_Type; /* memory mapped struct for Interrupt Type */ typedef struct { uint32_t RESERVED0; __I uint32_t ICTR; /*!< Interrupt Control Type Register */ #if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) __IO uint32_t ACTLR; /*!< Auxiliary Control Register */ #else uint32_t RESERVED1; #endif } InterruptType_Type; /* Memory Protection Unit */ #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1) typedef struct { __I uint32_t TYPE; /*!< MPU Type Register */ __IO uint32_t CTRL; /*!< MPU Control Register */ __IO uint32_t RNR; /*!< MPU Region RNRber Register */ __IO uint32_t RBAR; /*!< MPU Region Base Address Register */ __IO uint32_t RASR; /*!< MPU Region Attribute and Size Register */ __IO uint32_t RBAR_A1; /*!< MPU Alias 1 Region Base Address Register */ __IO uint32_t RASR_A1; /*!< MPU Alias 1 Region Attribute and Size Register */ __IO uint32_t RBAR_A2; /*!< MPU Alias 2 Region Base Address Register */ __IO uint32_t RASR_A2; /*!< MPU Alias 2 Region Attribute and Size Register */ __IO uint32_t RBAR_A3; /*!< MPU Alias 3 Region Base Address Register */ __IO uint32_t RASR_A3; /*!< MPU Alias 3 Region Attribute and Size Register */ } MPU_Type; #endif /* Core Debug Register */ typedef struct { __IO uint32_t DHCSR; /*!< Debug Halting Control and Status Register */ __O uint32_t DCRSR; /*!< Debug Core Register Selector Register */ __IO uint32_t DCRDR; /*!< Debug Core Register Data Register */ __IO uint32_t DEMCR; /*!< Debug Exception and Monitor Control Register */ } CoreDebug_Type; /* Memory mapping of Cortex-M3 Hardware */ #define SCS_BASE (0xE000E000) /*!< System Control Space Base Address */ #define ITM_BASE (0xE0000000) /*!< ITM Base Address */ #define CoreDebug_BASE (0xE000EDF0) /*!< Core Debug Base Address */ #define SysTick_BASE (SCS_BASE + 0x0010) /*!< SysTick Base Address */ #define NVIC_BASE (SCS_BASE + 0x0100) /*!< NVIC Base Address */ #define SCB_BASE (SCS_BASE + 0x0D00) /*!< System Control Block Base Address */ #define InterruptType ((InterruptType_Type *) SCS_BASE) /*!< Interrupt Type Register */ //#define SCB ((SCB_Type *) SCB_BASE) /*!< SCB configuration struct */ #define SysTick ((SysTick_Type *) SysTick_BASE) /*!< SysTick configuration struct */ #define NVIC ((NVIC_Type *) NVIC_BASE) /*!< NVIC configuration struct */ #define ITM ((ITM_Type *) ITM_BASE) /*!< ITM configuration struct */ #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1) #define MPU_BASE (SCS_BASE + 0x0D90) /*!< Memory Protection Unit */ #define MPU ((MPU_Type*) MPU_BASE) /*!< Memory Protection Unit */ #endif /******************************************************************************* * Hardware Abstraction Layer ******************************************************************************/ #if defined ( __CC_ARM ) #define __ASM __asm /*!< asm keyword for ARM Compiler */ #define __INLINE __inline /*!< inline keyword for ARM Compiler */ #elif defined ( __ICCARM__ ) #define __ASM __asm /*!< asm keyword for IAR Compiler */ #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */ #define __NOP __no_operation /*!< no operation intrinsic in IAR Compiler */ #elif defined ( __GNUC__ ) #define __ASM asm /*!< asm keyword for GNU Compiler */ #define __INLINE inline /*!< inline keyword for GNU Compiler */ #endif /* ################### Compiler specific Intrinsics ########################### */ #if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ /* ARM armcc specific functions */ #define __enable_fault_irq __enable_fiq #define __disable_fault_irq __disable_fiq #define __NOP __nop #define __WFI __wfi #define __WFE __wfe #define __SEV __sev #define __ISB() __isb(0) #define __DSB() __dsb(0) #define __DMB() __dmb(0) #define __REV __rev #define __RBIT __rbit #define __LDREXB(ptr) ((unsigned char ) __ldrex(ptr)) #define __LDREXH(ptr) ((unsigned short) __ldrex(ptr)) #define __LDREXW(ptr) ((unsigned int ) __ldrex(ptr)) #define __STREXB(value, ptr) __strex(value, ptr) #define __STREXH(value, ptr) __strex(value, ptr) #define __STREXW(value, ptr) __strex(value, ptr) /* intrinsic unsigned long long __ldrexd(volatile void *ptr) */ /* intrinsic int __strexd(unsigned long long val, volatile void *ptr) */ /* intrinsic void __enable_irq(); */ /* intrinsic void __disable_irq(); */ /** * @brief Return the Process Stack Pointer * * @param none * @return uint32_t ProcessStackPointer * * Return the actual process stack pointer */ extern uint32_t __get_PSP(void); /** * @brief Set the Process Stack Pointer * * @param uint32_t Process Stack Pointer * @return none * * Assign the value ProcessStackPointer to the MSP * (process stack pointer) Cortex processor register */ extern void __set_PSP(uint32_t topOfProcStack); /** * @brief Return the Main Stack Pointer * * @param none * @return uint32_t Main Stack Pointer * * Return the current value of the MSP (main stack pointer) * Cortex processor register */ extern uint32_t __get_MSP(void); /** * @brief Set the Main Stack Pointer * * @param uint32_t Main Stack Pointer * @return none * * Assign the value mainStackPointer to the MSP * (main stack pointer) Cortex processor register */ extern void __set_MSP(uint32_t topOfMainStack); /** * @brief Reverse byte order in unsigned short value * * @param uint16_t value to reverse * @return uint32_t reversed value * * Reverse byte order in unsigned short value */ extern uint32_t __REV16(uint16_t value); /* * @brief Reverse byte order in signed short value with sign extension to integer * * @param int16_t value to reverse * @return int32_t reversed value * * Reverse byte order in signed short value with sign extension to integer */ extern int32_t __REVSH(int16_t value); #if (__ARMCC_VERSION < 400000) /** * @brief Remove the exclusive lock created by ldrex * * @param none * @return none * * Removes the exclusive lock which is created by ldrex. */ extern void __CLREX(void); /** * @brief Return the Base Priority value * * @param none * @return uint32_t BasePriority * * Return the content of the base priority register */ extern uint32_t __get_BASEPRI(void); /** * @brief Set the Base Priority value * * @param uint32_t BasePriority * @return none * * Set the base priority register */ extern void __set_BASEPRI(uint32_t basePri); /** * @brief Return the Priority Mask value * * @param none * @return uint32_t PriMask * * Return the state of the priority mask bit from the priority mask * register */ extern uint32_t __get_PRIMASK(void); /** * @brief Set the Priority Mask value * * @param uint32_t PriMask * @return none * * Set the priority mask bit in the priority mask register */ extern void __set_PRIMASK(uint32_t priMask); /** * @brief Return the Fault Mask value * * @param none * @return uint32_t FaultMask * * Return the content of the fault mask register */ extern uint32_t __get_FAULTMASK(void); /** * @brief Set the Fault Mask value * * @param uint32_t faultMask value * @return none * * Set the fault mask register */ extern void __set_FAULTMASK(uint32_t faultMask); /** * @brief Return the Control Register value * * @param none * @return uint32_t Control value * * Return the content of the control register */ extern uint32_t __get_CONTROL(void); /** * @brief Set the Control Register value * * @param uint32_t Control value * @return none * * Set the control register */ extern void __set_CONTROL(uint32_t control); #else /* (__ARMCC_VERSION >= 400000) */ /** * @brief Remove the exclusive lock created by ldrex * * @param none * @return none * * Removes the exclusive lock which is created by ldrex. */ #define __CLREX __clrex /** * @brief Return the Base Priority value * * @param none * @return uint32_t BasePriority * * Return the content of the base priority register */ static __INLINE uint32_t __get_BASEPRI(void) { register uint32_t __regBasePri __ASM("basepri"); return(__regBasePri); } /** * @brief Set the Base Priority value * * @param uint32_t BasePriority * @return none * * Set the base priority register */ static __INLINE void __set_BASEPRI(uint32_t basePri) { register uint32_t __regBasePri __ASM("basepri"); __regBasePri = (basePri & 0x1ff); } /** * @brief Return the Priority Mask value * * @param none * @return uint32_t PriMask * * Return the state of the priority mask bit from the priority mask * register */ static __INLINE uint32_t __get_PRIMASK(void) { register uint32_t __regPriMask __ASM("primask"); return(__regPriMask); } /** * @brief Set the Priority Mask value * * @param uint32_t PriMask * @return none * * Set the priority mask bit in the priority mask register */ static __INLINE void __set_PRIMASK(uint32_t priMask) { register uint32_t __regPriMask __ASM("primask"); __regPriMask = (priMask); } /** * @brief Return the Fault Mask value * * @param none * @return uint32_t FaultMask * * Return the content of the fault mask register */ static __INLINE uint32_t __get_FAULTMASK(void) { register uint32_t __regFaultMask __ASM("faultmask"); return(__regFaultMask); } /** * @brief Set the Fault Mask value * * @param uint32_t faultMask value * @return none * * Set the fault mask register */ static __INLINE void __set_FAULTMASK(uint32_t faultMask) { register uint32_t __regFaultMask __ASM("faultmask"); __regFaultMask = (faultMask & 1); } /** * @brief Return the Control Register value * * @param none * @return uint32_t Control value * * Return the content of the control register */ static __INLINE uint32_t __get_CONTROL(void) { register uint32_t __regControl __ASM("control"); return(__regControl); } /** * @brief Set the Control Register value * * @param uint32_t Control value * @return none * * Set the control register */ static __INLINE void __set_CONTROL(uint32_t control) { register uint32_t __regControl __ASM("control"); __regControl = control; } #endif /* __ARMCC_VERSION */ #elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/ /* IAR iccarm specific functions */ #define __enable_irq __enable_interrupt /*!< global Interrupt enable */ #define __disable_irq __disable_interrupt /*!< global Interrupt disable */ static __INLINE void __enable_fault_irq() { __ASM ("cpsie f"); } static __INLINE void __disable_fault_irq() { __ASM ("cpsid f"); } static __INLINE void __WFI() { __ASM ("wfi"); } static __INLINE void __WFE() { __ASM ("wfe"); } static __INLINE void __SEV() { __ASM ("sev"); } static __INLINE void __CLREX() { __ASM ("clrex"); } /** * @brief Return the Process Stack Pointer * * @param none * @return uint32_t ProcessStackPointer * * Return the actual process stack pointer */ extern uint32_t __get_PSP(void); /** * @brief Set the Process Stack Pointer * * @param uint32_t Process Stack Pointer * @return none * * Assign the value ProcessStackPointer to the MSP * (process stack pointer) Cortex processor register */ extern void __set_PSP(uint32_t topOfProcStack); /** * @brief Return the Main Stack Pointer * * @param none * @return uint32_t Main Stack Pointer * * Return the current value of the MSP (main stack pointer) * Cortex processor register */ extern uint32_t __get_MSP(void); /** * @brief Set the Main Stack Pointer * * @param uint32_t Main Stack Pointer * @return none * * Assign the value mainStackPointer to the MSP * (main stack pointer) Cortex processor register */ extern void __set_MSP(uint32_t topOfMainStack); /** * @brief Reverse byte order in unsigned short value * * @param uint16_t value to reverse * @return uint32_t reversed value * * Reverse byte order in unsigned short value */ extern uint32_t __REV16(uint16_t value); /** * @brief Reverse bit order of value * * @param uint32_t value to reverse * @return uint32_t reversed value * * Reverse bit order of value */ extern uint32_t __RBIT(uint32_t value); /** * @brief LDR Exclusive * * @param uint8_t* address * @return uint8_t value of (*address) * * Exclusive LDR command */ extern uint8_t __LDREXB(uint8_t *addr); /** * @brief LDR Exclusive * * @param uint16_t* address * @return uint16_t value of (*address) * * Exclusive LDR command */ extern uint16_t __LDREXH(uint16_t *addr); /** * @brief LDR Exclusive * * @param uint32_t* address * @return uint32_t value of (*address) * * Exclusive LDR command */ extern uint32_t __LDREXW(uint32_t *addr); /** * @brief STR Exclusive * * @param uint8_t *address * @param uint8_t value to store * @return uint32_t successful / failed * * Exclusive STR command */ extern uint32_t __STREXB(uint8_t value, uint8_t *addr); /** * @brief STR Exclusive * * @param uint16_t *address * @param uint16_t value to store * @return uint32_t successful / failed * * Exclusive STR command */ extern uint32_t __STREXH(uint16_t value, uint16_t *addr); /** * @brief STR Exclusive * * @param uint32_t *address * @param uint32_t value to store * @return uint32_t successful / failed * * Exclusive STR command */ extern uint32_t __STREXW(uint32_t value, uint32_t *addr); /* intrinsic void __set_PRIMASK(); */ /* intrinsic void __get_PRIMASK(); */ /* intrinsic void __set_FAULTMASK(); */ /* intrinsic void __get_FAULTMASK(); */ /* intrinsic uint32_t __REV(uint32_t value); */ /* intrinsic uint32_t __REVSH(uint32_t value); */ /* intrinsic unsigned long __STREX(unsigned long, unsigned long); */ /* intrinsic unsigned long __LDREX(unsigned long *); */ #elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ /* GNU gcc specific functions */ static __INLINE void __NOP() { __ASM volatile ("nop"); } static __INLINE void __enable_irq() { __ASM volatile ("cpsie i"); } static __INLINE void __disable_irq() { __ASM volatile ("cpsid i"); } static __INLINE void __enable_fault_irq() { __ASM volatile ("cpsie f"); } static __INLINE void __disable_fault_irq() { __ASM volatile ("cpsid f"); } static __INLINE void __WFI() { __ASM volatile ("wfi"); } static __INLINE void __WFE() { __ASM volatile ("wfe"); } static __INLINE void __SEV() { __ASM volatile ("sev"); } static __INLINE void __ISB(void *arg) { __ASM volatile ("isb"); } static __INLINE void __DSB(void *arg) { __ASM volatile ("dsb"); } static __INLINE void __DMB(void *arg) { __ASM volatile ("dmb"); } static __INLINE void __CLREX() { __ASM volatile ("clrex"); } /** * @brief Return the Process Stack Pointer * * @param none * @return uint32_t ProcessStackPointer * * Return the actual process stack pointer */ extern uint32_t __get_PSP(void); /** * @brief Set the Process Stack Pointer * * @param uint32_t Process Stack Pointer * @return none * * Assign the value ProcessStackPointer to the MSP * (process stack pointer) Cortex processor register */ extern void __set_PSP(uint32_t topOfProcStack); /** * @brief Return the Main Stack Pointer * * @param none * @return uint32_t Main Stack Pointer * * Return the current value of the MSP (main stack pointer) * Cortex processor register */ extern uint32_t __get_MSP(void); /** * @brief Set the Main Stack Pointer * * @param uint32_t Main Stack Pointer * @return none * * Assign the value mainStackPointer to the MSP * (main stack pointer) Cortex processor register */ extern void __set_MSP(uint32_t topOfMainStack); /** * @brief Return the Base Priority value * * @param none * @return uint32_t BasePriority * * Return the content of the base priority register */ extern uint32_t __get_BASEPRI(void); /** * @brief Set the Base Priority value * * @param uint32_t BasePriority * @return none * * Set the base priority register */ extern void __set_BASEPRI(uint32_t basePri); /** * @brief Return the Priority Mask value * * @param none * @return uint32_t PriMask * * Return the state of the priority mask bit from the priority mask * register */ extern uint32_t __get_PRIMASK(void); /** * @brief Set the Priority Mask value * * @param uint32_t PriMask * @return none * * Set the priority mask bit in the priority mask register */ extern void __set_PRIMASK(uint32_t priMask); /** * @brief Return the Fault Mask value * * @param none * @return uint32_t FaultMask * * Return the content of the fault mask register */ extern uint32_t __get_FAULTMASK(void); /** * @brief Set the Fault Mask value * * @param uint32_t faultMask value * @return none * * Set the fault mask register */ extern void __set_FAULTMASK(uint32_t faultMask); /** * @brief Return the Control Register value * * @param none * @return uint32_t Control value * * Return the content of the control register */ extern uint32_t __get_CONTROL(void); /** * @brief Set the Control Register value * * @param uint32_t Control value * @return none * * Set the control register */ extern void __set_CONTROL(uint32_t control); /** * @brief Reverse byte order in integer value * * @param uint32_t value to reverse * @return uint32_t reversed value * * Reverse byte order in integer value */ extern uint32_t __REV(uint32_t value); /** * @brief Reverse byte order in unsigned short value * * @param uint16_t value to reverse * @return uint32_t reversed value * * Reverse byte order in unsigned short value */ extern uint32_t __REV16(uint16_t value); /* * Reverse byte order in signed short value with sign extension to integer * * @param int16_t value to reverse * @return int32_t reversed value * * @brief Reverse byte order in signed short value with sign extension to integer */ extern int32_t __REVSH(int16_t value); /** * @brief Reverse bit order of value * * @param uint32_t value to reverse * @return uint32_t reversed value * * Reverse bit order of value */ extern uint32_t __RBIT(uint32_t value); /** * @brief LDR Exclusive * * @param uint8_t* address * @return uint8_t value of (*address) * * Exclusive LDR command */ extern uint8_t __LDREXB(uint8_t *addr); /** * @brief LDR Exclusive * * @param uint16_t* address * @return uint16_t value of (*address) * * Exclusive LDR command */ extern uint16_t __LDREXH(uint16_t *addr); /** * @brief LDR Exclusive * * @param uint32_t* address * @return uint32_t value of (*address) * * Exclusive LDR command */ extern uint32_t __LDREXW(uint32_t *addr); /** * @brief STR Exclusive * * @param uint8_t *address * @param uint8_t value to store * @return uint32_t successful / failed * * Exclusive STR command */ extern uint32_t __STREXB(uint8_t value, uint8_t *addr); /** * @brief STR Exclusive * * @param uint16_t *address * @param uint16_t value to store * @return uint32_t successful / failed * * Exclusive STR command */ extern uint32_t __STREXH(uint16_t value, uint16_t *addr); /** * @brief STR Exclusive * * @param uint32_t *address * @param uint32_t value to store * @return uint32_t successful / failed * * Exclusive STR command */ extern uint32_t __STREXW(uint32_t value, uint32_t *addr); #endif /* ########################## NVIC functions #################################### */ /** * @brief Set the Priority Grouping in NVIC Interrupt Controller * * @param uint32_t priority_grouping is priority grouping field * @return * * Set the priority grouping field using the required unlock sequence. * The parameter priority_grouping is assigned to the field * SCB->AIRCR [10:8] PRIGROUP field. */ static __INLINE void NVIC_SetPriorityGrouping(uint32_t priority_grouping) { uint32_t reg_value=0; reg_value = SCB->AIRCR; /* read old register configuration */ reg_value &= ~((0xFFFFU << 16) | (0x0F << 8)); /* clear bits to change */ reg_value = ((reg_value | NVIC_AIRCR_VECTKEY | (priority_grouping << 8))); /* Insert write key and priorty group */ SCB->AIRCR = reg_value; } /** * @brief Enable Interrupt in NVIC Interrupt Controller * * @param IRQn_Type IRQn specifies the interrupt number * @return none * * Enable a device specific interupt in the NVIC interrupt controller. * The interrupt number cannot be a negative value. */ static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) { NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ } /** * @brief Disable the interrupt line for external interrupt specified * * @param IRQn_Type IRQn is the positive number of the external interrupt * @return none * * Disable a device specific interupt in the NVIC interrupt controller. * The interrupt number cannot be a negative value. */ static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) { NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ } /** * @brief Read the interrupt pending bit for a device specific interrupt source * * @param IRQn_Type IRQn is the number of the device specifc interrupt * @return IRQn_Type Number of pending interrupt or zero * * Read the pending register in NVIC and return the number of the * specified interrupt if its status is pending, otherwise it returns * zero. The interrupt number cannot be a negative value. */ static __INLINE IRQn_Type NVIC_GetPendingIRQ(IRQn_Type IRQn) { return((IRQn_Type) (NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))); /* Return Interrupt bit or 'zero' */ } /** * @brief Set the pending bit for an external interrupt * * @param IRQn_Type IRQn is the Number of the interrupt * @return none * * Set the pending bit for the specified interrupt. * The interrupt number cannot be a negative value. */ static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) { NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ } /** * @brief Clear the pending bit for an external interrupt * * @param IRQn_Type IRQn is the Number of the interrupt * @return none * * Clear the pending bit for the specified interrupt. * The interrupt number cannot be a negative value. */ static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) { NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ } /** * @brief Read the active bit for an external interrupt * * @param IRQn_Type IRQn is the Number of the interrupt * @return IRQn_Type Number of pending interrupt or zero * * Read the active register in NVIC and returns the number of the * specified interrupt if its status is active, otherwise it * returns zero. The interrupt number cannot be a negative value. */ static __INLINE IRQn_Type NVIC_GetActive(IRQn_Type IRQn) { return((IRQn_Type)(NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))); /* Return Interruptnumber or 'zero' */ } /** * @brief Set the priority for an interrupt * * @param IRQn_Type IRQn is the Number of the interrupt * @param priority is the priority for the interrupt * @return none * * Set the priority for the specified interrupt. The interrupt * number can be positive to specify an external (device specific) * interrupt, or negative to specify an internal (core) interrupt. \n * * Note: The priority cannot be set for every core interrupt. */ static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, int32_t priority) { if(IRQn < 0) { SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */ else { //NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ NVIC->IP[(uint32_t)(IRQn)] = (priority & 0xff); } /* set Priority for device specific Interrupts */ } /** * @brief Read the priority for an interrupt * * @param IRQn_Type IRQn is the Number of the interrupt * @return priority is the priority for the interrupt * * Read the priority for the specified interrupt. The interrupt * number can be positive to specify an external (device specific) * interrupt, or negative to specify an internal (core) interrupt. * * The returned priority value is automatically aligned to the implemented * priority bits of the microcontroller. * * Note: The priority cannot be set for every core interrupt. */ static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) { if(IRQn < 0) { return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M3 system interrupts */ else { return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ } /* ################################## SysTick function ############################################ */ #if (!defined (__Vendor_SysTickConfig)) || (__Vendor_SysTickConfig == 0) /* SysTick constants */ #define SYSTICK_ENABLE 0 /* Config-Bit to start or stop the SysTick Timer */ #define SYSTICK_TICKINT 1 /* Config-Bit to enable or disable the SysTick interrupt */ #define SYSTICK_CLKSOURCE 2 /* Clocksource has the offset 2 in SysTick Control and Status Register */ #define SYSTICK_MAXCOUNT ((1<<24) -1) /* SysTick MaxCount */ /** * @brief Initialize and start the SysTick counter and its interrupt. * * @param uint32_t ticks is the number of ticks between two interrupts * @return none * * Initialise the system tick timer and its interrupt and start the * system tick timer / counter in free running mode to generate * periodical interrupts. */ static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SYSTICK_MAXCOUNT) return (1); /* Reload value impossible */ SysTick->LOAD = (ticks & SYSTICK_MAXCOUNT) - 1; /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ SysTick->VAL = (0x00); /* Load the SysTick Counter Value */ SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<AIRCR = (NVIC_AIRCR_VECTKEY | (SCB->AIRCR & (0x700)) | (1<DEMCR & CoreDebug_DEMCR_TRCENA) && (ITM->TCR & ITM_TCR_ITMENA) && (ITM->TER & (1UL << 0)) ) { while (ITM->PORT[0].u32 == 0); ITM->PORT[0].u8 = (uint8_t) ch; } return (ch); } #endif /*lint -restore */ tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/000077500000000000000000000000001207233610700237355ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/dbgu/000077500000000000000000000000001207233610700246565ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/dbgu/dbgu.c000066400000000000000000000123141207233610700257440ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "dbgu.h" #include //------------------------------------------------------------------------------ // Global functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Initializes the DBGU with the given parameters, and enables both the /// transmitter and the receiver. The mode parameter contains the value of the /// DBGU_MR register. /// Value DBGU_STANDARD can be used for mode to get the most common configuration /// (i.e. aysnchronous, 8bits, no parity, 1 stop bit, no flow control). /// \param mode Operating mode to configure. /// \param baudrate Desired baudrate (e.g. 115200). /// \param mck Frequency of the system master clock in Hz. //------------------------------------------------------------------------------ void DBGU_Configure( unsigned int mode, unsigned int baudrate, unsigned int mck) { #if defined(cortexm3) // Enable clock for UART AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_DBGU); #endif // Reset & disable receiver and transmitter, disable interrupts AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; AT91C_BASE_DBGU->DBGU_IDR = 0xFFFFFFFF; // Configure baud rate AT91C_BASE_DBGU->DBGU_BRGR = mck / (baudrate * 16); // Configure mode register AT91C_BASE_DBGU->DBGU_MR = mode; // Disable DMA channel AT91C_BASE_DBGU->DBGU_PTCR = AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS; // Enable receiver and transmitter AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN; } //------------------------------------------------------------------------------ /// Outputs a character on the DBGU line. /// \note This function is synchronous (i.e. uses polling). /// \param c Character to send. //------------------------------------------------------------------------------ void DBGU_PutChar(unsigned char c) { // Wait for the transmitter to be ready while ((AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXEMPTY) == 0); // Send character AT91C_BASE_DBGU->DBGU_THR = c; // Wait for the transfer to complete while ((AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXEMPTY) == 0); } //------------------------------------------------------------------------------ /// Return 1 if a character can be read in DBGU //------------------------------------------------------------------------------ unsigned int DBGU_IsRxReady() { return (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY); } //------------------------------------------------------------------------------ /// Reads and returns a character from the DBGU. /// \note This function is synchronous (i.e. uses polling). /// \return Character received. //------------------------------------------------------------------------------ unsigned char DBGU_GetChar(void) { while ((AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY) == 0); return AT91C_BASE_DBGU->DBGU_RHR; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/dbgu/dbgu.h000066400000000000000000000073241207233610700257560ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !Purpose /// /// This module provides definitions and functions for using the Debug Unit /// (DBGU). /// /// It also overloads the fputc(), fputs() & putchar() functions so the printf() /// method outputs its data on the DBGU. This behavior can be suppressed by /// defining NOFPUT during compilation. /// /// !Usage /// /// -# Enable the DBGU pins (see pio & board.h). /// -# Configure the DBGU using DBGU_Configure with the desired operating mode. /// -# Send characters using DBGU_PutChar() or the printf() method. /// -# Receive characters using DBGU_GetChar(). /// /// \note Unless specified, all the functions defined here operate synchronously; /// i.e. they all wait the data is sent/received before returning. //------------------------------------------------------------------------------ #ifndef DBGU_H #define DBGU_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ /// Standard operating mode (asynchronous, 8bit, no parity, 1 stop bit) #define DBGU_STANDARD AT91C_US_PAR_NONE //------------------------------------------------------------------------------ // Global functions //------------------------------------------------------------------------------ extern void DBGU_Configure( unsigned int mode, unsigned int baudrate, unsigned int mck); extern unsigned char DBGU_GetChar(void); extern void DBGU_PutChar(unsigned char c); extern unsigned int DBGU_IsRxReady(void); #endif //#ifndef DBGU_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/irq/000077500000000000000000000000001207233610700245305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/irq/irq.h000066400000000000000000000073471207233610700255070ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !Purpose /// /// Methods and definitions for configuring interrupts. /// /// !Usage /// /// -# Configure an interrupt source using IRQ_ConfigureIT /// -# Enable or disable interrupt generation of a particular source with /// IRQ_EnableIT and IRQ_DisableIT. /// /// \note Most of the time, peripheral interrupts must be also configured /// inside the peripheral itself. //------------------------------------------------------------------------------ #ifndef IRQ_H #define IRQ_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include #if defined(cortexm3) #include #endif //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ #if 0 #if defined(cortexm3) #ifdef __NVIC_PRIO_BITS #undef __NVIC_PRIO_BITS #define __NVIC_PRIO_BITS ((SCB->AIRCR & 0x700) >> 8) #endif #endif #endif //------------------------------------------------------------------------------ // Global functions //------------------------------------------------------------------------------ extern void IRQ_ConfigureIT(unsigned int source, unsigned int mode, // mode for AIC, priority for NVIC void( *handler )( void )); // ISR extern void IRQ_EnableIT(unsigned int source); extern void IRQ_DisableIT(unsigned int source); #endif //#ifndef IRQ_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/irq/nvic.c000066400000000000000000000153071207233610700256410ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "board.h" #include "irq.h" #include "exceptions.h" #include /// The index of IRQ handler in the exception table #define NVIC_IRQ_HANDLER_INDEX 16 //------------------------------------------------------------------------------ // Global functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Configures an interrupt in the NVIC. The interrupt is identified by its /// source (AT91C_ID_xxx) and is configured to a specified priority and /// interrupt handler function. priority is the value that will be put in NVIC_IPRx /// and the function address will be set in "ExceptionTable". The parameter priority /// will include the preemptionPriority and the subPriority, where the subPriority /// defined in the B[7:0] of the parameter "priority", and the preemptionPriority defined /// in the B[15:8] of the parameter "priority". /// The interrupt is disabled before configuration, so it is useless /// to do it before calling this function. When NVIC_ConfigureIT returns, the /// interrupt will always be disabled and cleared; it must be enabled by a /// call to NVIC_EnableIT(). /// \param source Interrupt source to configure. /// \param priority Pre-emption priority (B[15:8] )+ subPriority (B[7:0]) /// \param handler Interrupt handler function. //------------------------------------------------------------------------------ void IRQ_ConfigureIT( unsigned int source, //unsigned int preemptionPriority, //unsigned int subPriority, unsigned int priority, IntFunc handler) { unsigned int priGroup = __NVIC_PRIO_BITS; unsigned int nPre = 8 - priGroup; unsigned int nSub = priGroup; unsigned int preemptionPriority; unsigned int subPriority; unsigned int IRQpriority; preemptionPriority = (priority & 0xff00) >> 8; subPriority = (priority & 0xff); // Disable the interrupt first NVIC_DisableIRQ((IRQn_Type)source); // Clear any pending status NVIC_ClearPendingIRQ((IRQn_Type)source); // Configure interrupt handler //if (handler == 0) handler = IrqHandlerNotUsed; // GetExceptionTable()[NVIC_IRQ_HANDLER_INDEX + source] = handler; if (subPriority >= (0x01 << nSub)) subPriority = (0x01 << nSub) - 1; if (preemptionPriority >= (0x01 << nPre)) preemptionPriority = (0x01 << nPre) - 1; IRQpriority = (subPriority | (preemptionPriority << nSub)); NVIC_SetPriority((IRQn_Type)source, IRQpriority); } //------------------------------------------------------------------------------ /// Enables interrupt coming from the given (unique) source (AT91C_ID_xxx). /// \param source Interrupt source to enable. //------------------------------------------------------------------------------ void IRQ_EnableIT(unsigned int source) { NVIC_EnableIRQ((IRQn_Type)source); } //------------------------------------------------------------------------------ /// Disables interrupt coming from the given (unique) source (AT91C_ID_xxx). /// \param source Interrupt source to disable. //------------------------------------------------------------------------------ void IRQ_DisableIT(unsigned int source) { NVIC_DisableIRQ((IRQn_Type)source); } //------------------------------------------------------------------------------ /// Set interrupt pending bit from the given (unique) source (AT91C_ID_xxx). /// \param source Interrupt source to set. //------------------------------------------------------------------------------ void NVIC_SetPending(unsigned int source) { NVIC_SetPendingIRQ((IRQn_Type)source); } //------------------------------------------------------------------------------ /// Clear interrupt pending bit from the given (unique) source (AT91C_ID_xxx). /// \param source Interrupt source to clear. //------------------------------------------------------------------------------ void NVIC_ClrPending(unsigned int source) { NVIC_ClearPendingIRQ((IRQn_Type)source); } #if !defined(USE_CMSIS_on) //------------------------------------------------------------------------------ /// Use the Software Trigger Interrupt Register to pend an interrupt. /// \param source Interrupt source to trigger. //------------------------------------------------------------------------------ void NVIC_Swi(unsigned int source) { AT91C_BASE_NVIC->NVIC_STIR = source; } #endif tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/pio/000077500000000000000000000000001207233610700245245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/pio/pio.c000066400000000000000000000332571207233610700254710ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "pio.h" #include //------------------------------------------------------------------------------ // Local Functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Configures one or more pin(s) of a PIO controller as being controlled by /// peripheral A. Optionally, the corresponding internal pull-up(s) can be /// enabled. /// \param pio Pointer to a PIO controller. /// \param mask Bitmask of one or more pin(s) to configure. /// \param enablePullUp Indicates if the pin(s) internal pull-up shall be /// configured. //------------------------------------------------------------------------------ static void PIO_SetPeripheralA( AT91S_PIO *pio, unsigned int mask, unsigned char enablePullUp) { #if !defined(AT91C_PIOA_ASR) unsigned int abmr; #endif // Disable interrupts on the pin(s) pio->PIO_IDR = mask; // Enable the pull-up(s) if necessary if (enablePullUp) { pio->PIO_PPUER = mask; } else { pio->PIO_PPUDR = mask; } // Configure pin #if defined(AT91C_PIOA_ASR) pio->PIO_ASR = mask; #else abmr = pio->PIO_ABSR; pio->PIO_ABSR &= (~mask & abmr); #endif pio->PIO_PDR = mask; } //------------------------------------------------------------------------------ /// Configures one or more pin(s) of a PIO controller as being controlled by /// peripheral B. Optionally, the corresponding internal pull-up(s) can be /// enabled. /// \param pio Pointer to a PIO controller. /// \param mask Bitmask of one or more pin(s) to configure. /// \param enablePullUp Indicates if the pin(s) internal pull-up shall be /// configured. //------------------------------------------------------------------------------ static void PIO_SetPeripheralB( AT91S_PIO *pio, unsigned int mask, unsigned char enablePullUp) { #if !defined(AT91C_PIOA_BSR) unsigned int abmr; #endif // Disable interrupts on the pin(s) pio->PIO_IDR = mask; // Enable the pull-up(s) if necessary if (enablePullUp) { pio->PIO_PPUER = mask; } else { pio->PIO_PPUDR = mask; } // Configure pin #if defined(AT91C_PIOA_BSR) pio->PIO_BSR = mask; #else abmr = pio->PIO_ABSR; pio->PIO_ABSR = mask | abmr; #endif pio->PIO_PDR = mask; } #if defined(AT91C_PIOA_IFDGSR) //Glitch or Debouncing filter selection supported //------------------------------------------------------------------------------ /// Configures Glitch or Debouncing filter for input /// \param pio Pointer to a PIO controller. /// \param mask Bitmask for filter selection. /// each of 32 bit field, 0 is Glitch, 1 is Debouncing /// \param clkDiv Clock divider if Debouncing select, using the lowest 14 bits /// common for all PIO line of selecting deboucing filter //------------------------------------------------------------------------------ static void PIO_SetFilter( AT91S_PIO *pio, unsigned int filterSel, unsigned int clkDiv) { pio->PIO_DIFSR = filterSel;//set Debouncing, 0 bit field no effect pio->PIO_SCIFSR = ~filterSel;//set Glitch, 0 bit field no effect pio->PIO_SCDR = clkDiv & 0x3FFF;//the lowest 14 bits work } #endif //------------------------------------------------------------------------------ /// Configures one or more pin(s) or a PIO controller as inputs. Optionally, /// the corresponding internal pull-up(s) and glitch filter(s) can be /// enabled. /// \param pio Pointer to a PIO controller. /// \param mask Bitmask indicating which pin(s) to configure as input(s). /// \param enablePullUp Indicates if the internal pull-up(s) must be enabled. /// \param enableFilter Indicates if the glitch filter(s) must be enabled. //------------------------------------------------------------------------------ static void PIO_SetInput( AT91S_PIO *pio, unsigned int mask, unsigned char enablePullUp, unsigned char enableFilter) { // Disable interrupts pio->PIO_IDR = mask; // Enable pull-up(s) if necessary if (enablePullUp) { pio->PIO_PPUER = mask; } else { pio->PIO_PPUDR = mask; } // Enable filter(s) if necessary if (enableFilter) { pio->PIO_IFER = mask; } else { pio->PIO_IFDR = mask; } // Configure pin as input pio->PIO_ODR = mask; pio->PIO_PER = mask; } //------------------------------------------------------------------------------ /// Configures one or more pin(s) of a PIO controller as outputs, with the /// given default value. Optionally, the multi-drive feature can be enabled /// on the pin(s). /// \param pio Pointer to a PIO controller. /// \param mask Bitmask indicating which pin(s) to configure. /// \param defaultValue Default level on the pin(s). /// \param enableMultiDrive Indicates if the pin(s) shall be configured as /// open-drain. /// \param enablePullUp Indicates if the pin shall have its pull-up activated. //------------------------------------------------------------------------------ static void PIO_SetOutput( AT91S_PIO *pio, unsigned int mask, unsigned char defaultValue, unsigned char enableMultiDrive, unsigned char enablePullUp) { // Disable interrupts pio->PIO_IDR = mask; // Enable pull-up(s) if necessary if (enablePullUp) { pio->PIO_PPUER = mask; } else { pio->PIO_PPUDR = mask; } // Enable multi-drive if necessary if (enableMultiDrive) { pio->PIO_MDER = mask; } else { pio->PIO_MDDR = mask; } // Set default value if (defaultValue) { pio->PIO_SODR = mask; } else { pio->PIO_CODR = mask; } // Configure pin(s) as output(s) pio->PIO_OER = mask; pio->PIO_PER = mask; } //------------------------------------------------------------------------------ // Global Functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Configures a list of Pin instances, each of which can either hold a single /// pin or a group of pins, depending on the mask value; all pins are configured /// by this function. The size of the array must also be provided and is easily /// computed using PIO_LISTSIZE whenever its length is not known in advance. /// \param list Pointer to a list of Pin instances. /// \param size Size of the Pin list (calculated using PIO_LISTSIZE). /// \return 1 if the pins have been configured properly; otherwise 0. //------------------------------------------------------------------------------ unsigned char PIO_Configure(const Pin *list, unsigned int size) { // Configure pins while (size > 0) { switch (list->type) { case PIO_PERIPH_A: PIO_SetPeripheralA(list->pio, list->mask, (list->attribute & PIO_PULLUP) ? 1 : 0); break; case PIO_PERIPH_B: PIO_SetPeripheralB(list->pio, list->mask, (list->attribute & PIO_PULLUP) ? 1 : 0); break; case PIO_INPUT: AT91C_BASE_PMC->PMC_PCER = 1 << list->id; PIO_SetInput(list->pio, list->mask, (list->attribute & PIO_PULLUP) ? 1 : 0, (list->attribute & PIO_DEGLITCH)? 1 : 0); #if defined(AT91C_PIOA_IFDGSR) //PIO3 with Glitch or Debouncing selection //if glitch input filter enabled, set it if(list->attribute & PIO_DEGLITCH)//Glitch input filter enabled PIO_SetFilter(list->pio, list->inFilter.filterSel, list->inFilter.clkDivider); #endif break; case PIO_OUTPUT_0: case PIO_OUTPUT_1: PIO_SetOutput(list->pio, list->mask, (list->type == PIO_OUTPUT_1), (list->attribute & PIO_OPENDRAIN) ? 1 : 0, (list->attribute & PIO_PULLUP) ? 1 : 0); break; default: return 0; } list++; size--; } return 1; } //------------------------------------------------------------------------------ /// Sets a high output level on all the PIOs defined in the given Pin instance. /// This has no immediate effects on PIOs that are not output, but the PIO /// controller will memorize the value they are changed to outputs. /// \param pin Pointer to a Pin instance describing one or more pins. //------------------------------------------------------------------------------ void PIO_Set(const Pin *pin) { pin->pio->PIO_SODR = pin->mask; } //------------------------------------------------------------------------------ /// Sets a low output level on all the PIOs defined in the given Pin instance. /// This has no immediate effects on PIOs that are not output, but the PIO /// controller will memorize the value they are changed to outputs. /// \param pin Pointer to a Pin instance describing one or more pins. //------------------------------------------------------------------------------ void PIO_Clear(const Pin *pin) { pin->pio->PIO_CODR = pin->mask; } //------------------------------------------------------------------------------ /// Returns 1 if one or more PIO of the given Pin instance currently have a high /// level; otherwise returns 0. This method returns the actual value that is /// being read on the pin. To return the supposed output value of a pin, use /// PIO_GetOutputDataStatus() instead. /// \param pin Pointer to a Pin instance describing one or more pins. /// \return 1 if the Pin instance contains at least one PIO that currently has /// a high level; otherwise 0. //------------------------------------------------------------------------------ unsigned char PIO_Get(const Pin *pin) { unsigned int reg; if ((pin->type == PIO_OUTPUT_0) || (pin->type == PIO_OUTPUT_1)) { reg = pin->pio->PIO_ODSR; } else { reg = pin->pio->PIO_PDSR; } if ((reg & pin->mask) == 0) { return 0; } else { return 1; } } //------------------------------------------------------------------------------ /// Returns 1 if one or more PIO of the given Pin are configured to output a /// high level (even if they are not output). /// To get the actual value of the pin, use PIO_Get() instead. /// \param pin Pointer to a Pin instance describing one or more pins. /// \return 1 if the Pin instance contains at least one PIO that is configured /// to output a high level; otherwise 0. //------------------------------------------------------------------------------ unsigned char PIO_GetOutputDataStatus(const Pin *pin) { if ((pin->pio->PIO_ODSR & pin->mask) == 0) { return 0; } else { return 1; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/pio/pio.h000066400000000000000000000223501207233610700254660ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !!!Purpose /// /// This file provides a basic API for PIO configuration and usage of /// user-controlled pins. Please refer to the board.h file for a list of /// available pin definitions. /// /// !!!Usage /// /// -# Define a constant pin description array such as the following one, using /// the existing definitions provided by the board.h file if possible: /// \code /// const Pin pPins[] = {PIN_USART0_TXD, PIN_USART0_RXD}; /// \endcode /// Alternatively, it is possible to add new pins by provided the full Pin /// structure: /// \code /// // Pin instance to configure PA10 & PA11 as inputs with the internal /// // pull-up enabled. /// const Pin pPins = { /// (1 << 10) | (1 << 11), /// AT91C_BASE_PIOA, /// AT91C_ID_PIOA, /// PIO_INPUT, /// PIO_PULLUP /// }; /// \endcode /// -# Configure a pin array by calling PIO_Configure() with a pointer to the /// array and its size (which is computed using the PIO_LISTSIZE macro). /// -# Change and get the value of a user-controlled pin using the PIO_Set, /// PIO_Clear and PIO_Get methods. /// -# Get the level being currently output by a user-controlled pin configured /// as an output using PIO_GetOutputDataStatus(). //------------------------------------------------------------------------------ #ifndef PIO_H #define PIO_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include //------------------------------------------------------------------------------ // Global Definitions //------------------------------------------------------------------------------ /// The pin is controlled by the associated signal of peripheral A. #define PIO_PERIPH_A 0 /// The pin is controlled by the associated signal of peripheral B. #define PIO_PERIPH_B 1 /// The pin is an input. #define PIO_INPUT 2 /// The pin is an output and has a default level of 0. #define PIO_OUTPUT_0 3 /// The pin is an output and has a default level of 1. #define PIO_OUTPUT_1 4 /// Default pin configuration (no attribute). #define PIO_DEFAULT (0 << 0) /// The internal pin pull-up is active. #define PIO_PULLUP (1 << 0) /// The internal glitch filter is active. #define PIO_DEGLITCH (1 << 1) /// The pin is open-drain. #define PIO_OPENDRAIN (1 << 2) //------------------------------------------------------------------------------ // Global Macros //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Calculates the size of an array of Pin instances. The array must be defined /// locally (i.e. not a pointer), otherwise the computation will not be correct. /// \param pPins Local array of Pin instances. /// \return Number of elements in array. //------------------------------------------------------------------------------ #define PIO_LISTSIZE(pPins) (sizeof(pPins) / sizeof(Pin)) //------------------------------------------------------------------------------ // Global Types //------------------------------------------------------------------------------ typedef struct _ExtIntMode { ///indicate which pin to enable/disable additional Interrupt mode ///each of 32 bit field represents one PIO line. unsigned int itMask; ///select Edge or level interrupt detection source ///each of 32 bit field represents one PIO line, 0 is Edge, 1 is Level unsigned int edgeLvlSel; ///select rising/high or falling/low detection event ///each of 32 bit field represents one PIO line: ///0 is Falling Edge detection event (if selected Edge interrupt /// detection source, or Low Level detection (if selected /// Level interrupt detection source; ///1 is Rising Edge detection(if selected Edge interrupt /// source, or Low Level detection event(if selected Level /// interrupt detection source. unsigned int lowFallOrRiseHighSel; } ExtIntMode; typedef struct _GlitchDeBounceFilter { ///Select Glitch/Debounce filtering for PIO input ///each of 32 bit field represents one PIO line ///0 is Glitch, 1 is Debouncing unsigned int filterSel; ///slow clock divider selection for Debouncing filter unsigned int clkDivider:14; } GlitchDebounceFilter; //------------------------------------------------------------------------------ /// Describes the type and attribute of one PIO pin or a group of similar pins. /// The #type# field can have the following values: /// - PIO_PERIPH_A /// - PIO_PERIPH_B /// - PIO_OUTPUT_0 /// - PIO_OUTPUT_1 /// - PIO_INPUT /// /// The #attribute# field is a bitmask that can either be set to PIO_DEFAULt, /// or combine (using bitwise OR '|') any number of the following constants: /// - PIO_PULLUP /// - PIO_DEGLITCH /// - PIO_OPENDRAIN //------------------------------------------------------------------------------ typedef struct { /// Bitmask indicating which pin(s) to configure. unsigned int mask; /// Pointer to the PIO controller which has the pin(s). AT91S_PIO *pio; /// Peripheral ID of the PIO controller which has the pin(s). unsigned char id; /// Pin type. unsigned char type; /// Pin attribute. unsigned char attribute; #if defined(AT91C_PIOA_AIMMR) ///Additional Interrupt Mode ExtIntMode itMode; #endif #if defined(AT91C_PIOA_IFDGSR) ///Glitch/Debouncing filter GlitchDebounceFilter inFilter; #endif } Pin; //------------------------------------------------------------------------------ // Global Access Macros //------------------------------------------------------------------------------ //Get Glitch input filter enable/disable status #define PIO_GetIFSR(pPin) ((pPin)->pio->PIO_IFSR) //Get Glitch/Deboucing selection status #define PIO_GetIFDGSR(pPin) ((pPin)->pio->PIO_IFDGSR) //Get Additional PIO interrupt mode mask status #define PIO_GetAIMMR(pPin) ((pPin)->pio->PIO_AIMMR) //Get Interrupt status #define PIO_GetISR(pPin) ((pPin)->pio->PIO_ISR) //Get Edge or Level selection status #define PIO_GetELSR(pPin) ((pPin)->pio->PIO_ELSR) //Get Fall/Rise or Low/High selection status #define PIO_GetFRLHSR(pPin) ((pPin)->pio->PIO_FRLHSR) //Get PIO Lock Status #define PIO_GetLockStatus(pPin) ((pPin)->pio->PIO_LOCKSR) //------------------------------------------------------------------------------ // Global Functions //------------------------------------------------------------------------------ extern unsigned char PIO_Configure(const Pin *list, unsigned int size); extern void PIO_Set(const Pin *pin); extern void PIO_Clear(const Pin *pin); extern unsigned char PIO_Get(const Pin *pin); //extern unsigned int PIO_GetISR(const Pin *pin); extern unsigned char PIO_GetOutputDataStatus(const Pin *pin); #endif //#ifndef PIO_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/pio/pio_it.c000066400000000000000000000413031207233610700261540ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /// Disable traces for this file #undef TRACE_LEVEL #define TRACE_LEVEL 0 //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "pio_it.h" #include "pio.h" #include #include #include #include //------------------------------------------------------------------------------ // Local definitions //------------------------------------------------------------------------------ /// \exclude /// Maximum number of interrupt sources that can be defined. This /// constant can be increased, but the current value is the smallest possible /// that will be compatible with all existing projects. #define MAX_INTERRUPT_SOURCES 7 //------------------------------------------------------------------------------ // Local types //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \exclude /// Describes a PIO interrupt source, including the PIO instance triggering the /// interrupt and the associated interrupt handler. //------------------------------------------------------------------------------ typedef struct { /// Pointer to the source pin instance. const Pin *pPin; /// Interrupt handler. void (*handler)(const Pin *); } InterruptSource; //------------------------------------------------------------------------------ // Local variables //------------------------------------------------------------------------------ /// List of interrupt sources. static InterruptSource pSources[MAX_INTERRUPT_SOURCES]; /// Number of currently defined interrupt sources. static unsigned int numSources; //------------------------------------------------------------------------------ // Local functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Handles all interrupts on the given PIO controller. /// \param id PIO controller ID. /// \param pPio PIO controller base address. //------------------------------------------------------------------------------ static void PioInterruptHandler(unsigned int id, AT91S_PIO *pPio) { unsigned int status; unsigned int i; // Read PIO controller status status = pPio->PIO_ISR; status &= pPio->PIO_IMR; // Check pending events if (status != 0) { TRACE_DEBUG("PIO interrupt on PIO controller #%d\n\r", id); // Find triggering source i = 0; while (status != 0) { // There cannot be an unconfigured source enabled. SANITY_CHECK(i < numSources); // Source is configured on the same controller if (pSources[i].pPin->id == id) { // Source has PIOs whose statuses have changed if ((status & pSources[i].pPin->mask) != 0) { TRACE_DEBUG("Interrupt source #%d triggered\n\r", i); pSources[i].handler(pSources[i].pPin); status &= ~(pSources[i].pPin->mask); } } i++; } } } //------------------------------------------------------------------------------ /// Generic PIO interrupt handler. Single entry point for interrupts coming /// from any PIO controller (PIO A, B, C ...). Dispatches the interrupt to /// the user-configured handlers. //------------------------------------------------------------------------------ void PIO_IT_InterruptHandler(void) { #if defined(AT91C_ID_PIOA) // Treat PIOA interrupts PioInterruptHandler(AT91C_ID_PIOA, AT91C_BASE_PIOA); #endif #if defined(AT91C_ID_PIOB) // Treat PIOB interrupts PioInterruptHandler(AT91C_ID_PIOB, AT91C_BASE_PIOB); #endif #if defined(AT91C_ID_PIOC) // Treat PIOC interrupts PioInterruptHandler(AT91C_ID_PIOC, AT91C_BASE_PIOC); #endif #if defined(AT91C_ID_PIOD) // Treat PIOD interrupts PioInterruptHandler(AT91C_ID_PIOD, AT91C_BASE_PIOD); #endif #if defined(AT91C_ID_PIOE) // Treat PIOE interrupts PioInterruptHandler(AT91C_ID_PIOE, AT91C_BASE_PIOE); #endif #if defined(AT91C_ID_PIOABCD) // Treat PIOABCD interrupts #if !defined(AT91C_ID_PIOA) PioInterruptHandler(AT91C_ID_PIOABCD, AT91C_BASE_PIOA); #endif #if !defined(AT91C_ID_PIOB) PioInterruptHandler(AT91C_ID_PIOABCD, AT91C_BASE_PIOB); #endif #if !defined(AT91C_ID_PIOC) PioInterruptHandler(AT91C_ID_PIOABCD, AT91C_BASE_PIOC); #endif #if !defined(AT91C_ID_PIOD) PioInterruptHandler(AT91C_ID_PIOABCD, AT91C_BASE_PIOD); #endif #endif #if defined(AT91C_ID_PIOABCDE) // Treat PIOABCDE interrupts #if !defined(AT91C_ID_PIOA) PioInterruptHandler(AT91C_ID_PIOABCDE, AT91C_BASE_PIOA); #endif #if !defined(AT91C_ID_PIOB) PioInterruptHandler(AT91C_ID_PIOABCDE, AT91C_BASE_PIOB); #endif #if !defined(AT91C_ID_PIOC) PioInterruptHandler(AT91C_ID_PIOABCDE, AT91C_BASE_PIOC); #endif #if !defined(AT91C_ID_PIOD) PioInterruptHandler(AT91C_ID_PIOABCDE, AT91C_BASE_PIOD); #endif #if !defined(AT91C_ID_PIOE) PioInterruptHandler(AT91C_ID_PIOABCDE, AT91C_BASE_PIOE); #endif #endif #if defined(AT91C_ID_PIOCDE) // Treat PIOCDE interrupts #if !defined(AT91C_ID_PIOC) PioInterruptHandler(AT91C_ID_PIOCDE, AT91C_BASE_PIOC); #endif #if !defined(AT91C_ID_PIOD) PioInterruptHandler(AT91C_ID_PIOCDE, AT91C_BASE_PIOD); #endif #if !defined(AT91C_ID_PIOE) PioInterruptHandler(AT91C_ID_PIOCDE, AT91C_BASE_PIOE); #endif #endif } //------------------------------------------------------------------------------ // Global functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Initializes the PIO interrupt management logic. The desired priority of PIO /// interrupts must be provided. Calling this function multiple times result in /// the reset of currently configured interrupts. /// \param priority PIO controller interrupts priority. //------------------------------------------------------------------------------ void PIO_InitializeInterrupts(unsigned int priority) { TRACE_DEBUG("PIO_Initialize()\n\r"); // SANITY_CHECK((priority & ~AT91C_AIC_PRIOR) == 0); // Reset sources numSources = 0; #ifdef AT91C_ID_PIOA // Configure PIO interrupt sources TRACE_DEBUG("PIO_Initialize: Configuring PIOA\n\r"); AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA; AT91C_BASE_PIOA->PIO_ISR; AT91C_BASE_PIOA->PIO_IDR = 0xFFFFFFFF; IRQ_ConfigureIT(AT91C_ID_PIOA, priority, PIO_IT_InterruptHandler); IRQ_EnableIT(AT91C_ID_PIOA); #endif #ifdef AT91C_ID_PIOB TRACE_DEBUG("PIO_Initialize: Configuring PIOB\n\r"); AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOB; AT91C_BASE_PIOB->PIO_ISR; AT91C_BASE_PIOB->PIO_IDR = 0xFFFFFFFF; IRQ_ConfigureIT(AT91C_ID_PIOB, priority, PIO_IT_InterruptHandler); IRQ_EnableIT(AT91C_ID_PIOB); #endif #ifdef AT91C_ID_PIOC TRACE_DEBUG("PIO_Initialize: Configuring PIOC\n\r"); AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOC; AT91C_BASE_PIOC->PIO_ISR; AT91C_BASE_PIOC->PIO_IDR = 0xFFFFFFFF; IRQ_ConfigureIT(AT91C_ID_PIOC, priority, PIO_IT_InterruptHandler); IRQ_EnableIT(AT91C_ID_PIOC); #endif #ifdef AT91C_ID_PIOD TRACE_DEBUG("PIO_Initialize: Configuring PIOD\n\r"); AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOD; AT91C_BASE_PIOC->PIO_ISR; AT91C_BASE_PIOC->PIO_IDR = 0xFFFFFFFF; IRQ_ConfigureIT(AT91C_ID_PIOD, priority, PIO_IT_InterruptHandler); IRQ_EnableIT(AT91C_ID_PIOD); #endif #ifdef AT91C_ID_PIOE TRACE_DEBUG("PIO_Initialize: Configuring PIOE\n\r"); AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOE; AT91C_BASE_PIOC->PIO_ISR; AT91C_BASE_PIOC->PIO_IDR = 0xFFFFFFFF; IRQ_ConfigureIT(AT91C_ID_PIOE, priority, PIO_IT_InterruptHandler); IRQ_EnableIT(AT91C_ID_PIOE); #endif #if defined(AT91C_ID_PIOABCD) // Treat PIOABCD interrupts #if !defined(AT91C_ID_PIOA) \ && !defined(AT91C_ID_PIOB) \ && !defined(AT91C_ID_PIOC) \ && !defined(AT91C_ID_PIOD) TRACE_DEBUG("PIO_Initialize: Configuring PIOABCD\n\r"); AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOABCD; AT91C_BASE_PIOA->PIO_ISR; AT91C_BASE_PIOA->PIO_IDR = 0xFFFFFFFF; IRQ_ConfigureIT(AT91C_ID_PIOABCD, priority, PIO_IT_InterruptHandler); IRQ_EnableIT(AT91C_ID_PIOABCD); #endif #endif #if defined(AT91C_ID_PIOABCDE) // Treat PIOABCDE interrupts #if !defined(AT91C_ID_PIOA) \ && !defined(AT91C_ID_PIOB) \ && !defined(AT91C_ID_PIOC) \ && !defined(AT91C_ID_PIOD) \ && !defined(AT91C_ID_PIOE) TRACE_DEBUG("PIO_Initialize: Configuring PIOABCDE\n\r"); AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOABCDE; AT91C_BASE_PIOA->PIO_ISR; AT91C_BASE_PIOA->PIO_IDR = 0xFFFFFFFF; IRQ_ConfigureIT(AT91C_ID_PIOABCDE, priority, PIO_IT_InterruptHandler); IRQ_EnableIT(AT91C_ID_PIOABCDE); #endif #endif #if defined(AT91C_ID_PIOCDE) // Treat PIOCDE interrupts #if !defined(AT91C_ID_PIOC) \ && !defined(AT91C_ID_PIOD) \ && !defined(AT91C_ID_PIOE) TRACE_DEBUG("PIO_Initialize: Configuring PIOC\n\r"); AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOCDE; AT91C_BASE_PIOC->PIO_ISR; AT91C_BASE_PIOC->PIO_IDR = 0xFFFFFFFF; IRQ_ConfigureIT(AT91C_ID_PIOCDE, priority, PIO_IT_InterruptHandler); IRQ_EnableIT(AT91C_ID_PIOCDE); #endif #endif } //------------------------------------------------------------------------------ /// Configures a PIO or a group of PIO to generate an interrupt on status /// change. The provided interrupt handler will be called with the triggering /// pin as its parameter (enabling different pin instances to share the same /// handler). /// \param pPin Pointer to a Pin instance. /// \param handler Interrupt handler function pointer. //------------------------------------------------------------------------------ void PIO_ConfigureIt(const Pin *pPin, void (*handler)(const Pin *)) { InterruptSource *pSource; TRACE_DEBUG("PIO_ConfigureIt()\n\r"); SANITY_CHECK(pPin); ASSERT(numSources < MAX_INTERRUPT_SOURCES, "-F- PIO_ConfigureIt: Increase MAX_INTERRUPT_SOURCES\n\r"); // Define new source TRACE_DEBUG("PIO_ConfigureIt: Defining new source #%d.\n\r", numSources); pSource = &(pSources[numSources]); pSource->pPin = pPin; pSource->handler = handler; numSources++; } //------------------------------------------------------------------------------ /// Enables the given interrupt source if it has been configured. The status /// register of the corresponding PIO controller is cleared prior to enabling /// the interrupt. /// \param pPin Interrupt source to enable. //------------------------------------------------------------------------------ void PIO_EnableIt(const Pin *pPin) { TRACE_DEBUG("PIO_EnableIt()\n\r"); SANITY_CHECK(pPin); #ifndef NOASSERT { unsigned int i = 0; unsigned char found = 0; while ((i < numSources) && !found) { if (pSources[i].pPin == pPin) { found = 1; } i++; } ASSERT(found, "-F- PIO_EnableIt: Interrupt source has not been configured\n\r"); } #endif pPin->pio->PIO_ISR; pPin->pio->PIO_IER = pPin->mask; #if defined(AT91C_PIOA_AIMMR) //PIO3 with additional interrupt support //configure additional interrupt mode registers if(pPin->mask&pPin->itMode.itMask) { //enable additional interrupt mode pPin->pio->PIO_AIMER = pPin->itMode.itMask; if(pPin->mask&pPin->itMode.edgeLvlSel) //if bit field of selected pin is 1, set as Level detection source pPin->pio->PIO_LSR = pPin->itMode.edgeLvlSel; else //if bit field of selected pin is 0, set as Edge detection source pPin->pio->PIO_ESR = ~(pPin->itMode.edgeLvlSel); if(pPin->mask&pPin->itMode.lowFallOrRiseHighSel) //if bit field of selected pin is 1, set as Rising Edge/High level detection event pPin->pio->PIO_REHLSR = pPin->itMode.lowFallOrRiseHighSel; else //if bit field of selected pin is 0, set as Falling Edge/Low level detection event pPin->pio->PIO_FELLSR = ~(pPin->itMode.lowFallOrRiseHighSel); } #endif } //------------------------------------------------------------------------------ /// Disables a given interrupt source, with no added side effects. /// \param pPin Interrupt source to disable. //------------------------------------------------------------------------------ void PIO_DisableIt(const Pin *pPin) { SANITY_CHECK(pPin); TRACE_DEBUG("PIO_DisableIt()\n\r"); pPin->pio->PIO_IDR = pPin->mask; #if defined(AT91C_PIOA_AIMMR) if(pPin->mask & pPin->itMode.itMask) //disable additional interrupt mode pPin->pio->PIO_AIMDR = pPin->mask & pPin->itMode.itMask; #endif } #if defined(cortexm3) ////------------------------------------------------------------------------------ ///// Override cortex-m3's default PIOA irq handler ////------------------------------------------------------------------------------ //void PioAIrqHandler(void) @C() @spontaneous() //{ // #if defined(AT91C_ID_PIOA) // // Treat PIOA interrupts // PioInterruptHandler(AT91C_ID_PIOA, AT91C_BASE_PIOA); // #endif //} // ////------------------------------------------------------------------------------ ///// Override cortex-m3's default PIOB irq handler ////------------------------------------------------------------------------------ //void PioBIrqHandler(void) @C() @spontaneous() //{ // #if defined(AT91C_ID_PIOB) // // Treat PIOA interrupts // PioInterruptHandler(AT91C_ID_PIOB, AT91C_BASE_PIOB); // #endif //} // ////------------------------------------------------------------------------------ ///// Override cortex-m3's default PIOC irq handler ////------------------------------------------------------------------------------ //void PioCIrqHandler(void) @C() @spontaneous() //{ // #if defined(AT91C_ID_PIOC) // // Treat PIOA interrupts // PioInterruptHandler(AT91C_ID_PIOC, AT91C_BASE_PIOC); // #endif //} #endif tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/pio/pio_it.h000066400000000000000000000102071207233610700261600ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !!!Purpose /// /// Configuration and handling of interrupts on PIO status changes. The API /// provided here have several advantages over the traditional PIO interrupt /// configuration approach: /// - It is highly portable /// - It automatically demultiplexes interrupts when multiples pins have been /// configured on a single PIO controller /// - It allows a group of pins to share the same interrupt /// /// However, it also has several minor drawbacks that may prevent from using it /// in particular applications: /// - It enables the clocks of all PIO controllers /// - PIO controllers all share the same interrupt handler, which does the /// demultiplexing and can be slower than direct configuration /// - It reserves space for a fixed number of interrupts, which can be /// increased by modifying the appropriate constant in pio_it.c. /// /// !!!Usage /// /// -# Initialize the PIO interrupt mechanism using PIO_InitializeInterrupts() /// with the desired priority (0 ... 7). /// -# Configure a status change interrupt on one or more pin(s) with /// PIO_ConfigureIt(). /// -# Enable & disable interrupts on pins using PIO_EnableIt() and /// PIO_DisableIt(). //------------------------------------------------------------------------------ #ifndef PIO_IT_H #define PIO_IT_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "pio.h" //------------------------------------------------------------------------------ // Global functions //------------------------------------------------------------------------------ extern void PIO_InitializeInterrupts(unsigned int priority); extern void PIO_ConfigureIt(const Pin *pPin, void (*handler)(const Pin *)); extern void PIO_EnableIt(const Pin *pPin); extern void PIO_DisableIt(const Pin *pPin); extern void PIO_IT_InterruptHandler(void); #endif //#ifndef PIO_IT_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/pmc/000077500000000000000000000000001207233610700245145ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/pmc/pmc.c000066400000000000000000000173071207233610700254470ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "pmc.h" #include #include #include #ifdef CP15_PRESENT #include #endif #define MASK_STATUS 0x3FFFFFFC //------------------------------------------------------------------------------ // Global functions //------------------------------------------------------------------------------ #if defined(at91sam7l64) || defined(at91sam7l128) //------------------------------------------------------------------------------ /// Sets the fast wake-up inputs that can get the device out of Wait mode. /// \param inputs Fast wake-up inputs to enable. //------------------------------------------------------------------------------ void PMC_SetFastWakeUpInputs(unsigned int inputs) { SANITY_CHECK((inputs & ~0xFF) == 0); AT91C_BASE_PMC->PMC_FSMR = inputs; } #if !defined(__ICCARM__) __attribute__ ((section (".ramfunc"))) // GCC #endif //------------------------------------------------------------------------------ /// Disables the main oscillator, making the device enter Wait mode. //------------------------------------------------------------------------------ void PMC_DisableMainOscillatorForWaitMode(void) { AT91C_BASE_PMC->PMC_MOR = 0x37 << 16; while ((AT91C_BASE_PMC->PMC_MOR & AT91C_PMC_MAINSELS) != AT91C_PMC_MAINSELS); } #endif #if defined(at91sam7l) //------------------------------------------------------------------------------ /// Disables the main oscillator when NOT running on it. //------------------------------------------------------------------------------ void PMC_DisableMainOscillator(void) { AT91C_BASE_PMC->PMC_MOR = 0x37 << 16; while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MAINSELS) == AT91C_PMC_MAINSELS); } #endif //------------------------------------------------------------------------------ /// Disables the processor clock //------------------------------------------------------------------------------ void PMC_DisableProcessorClock(void) { AT91C_BASE_PMC->PMC_SCDR = AT91C_PMC_PCK; while ((AT91C_BASE_PMC->PMC_SCSR & AT91C_PMC_PCK) != AT91C_PMC_PCK); } //------------------------------------------------------------------------------ /// Enables the clock of a peripheral. The peripheral ID (AT91C_ID_xxx) is used /// to identify which peripheral is targetted. /// Note that the ID must NOT be shifted (i.e. 1 << AT91C_ID_xxx). /// \param id Peripheral ID (AT91C_ID_xxx). //------------------------------------------------------------------------------ void PMC_EnablePeripheral(unsigned int id) { SANITY_CHECK(id < 32); if ((AT91C_BASE_PMC->PMC_PCSR & (1 << id)) == (1 << id)) { TRACE_INFO("PMC_EnablePeripheral: clock of peripheral" " %u is already enabled\n\r", id); } else { AT91C_BASE_PMC->PMC_PCER = 1 << id; } } //------------------------------------------------------------------------------ /// Disables the clock of a peripheral. The peripheral ID (AT91C_ID_xxx) is used /// to identify which peripheral is targetted. /// Note that the ID must NOT be shifted (i.e. 1 << AT91C_ID_xxx). /// \param id Peripheral ID (AT91C_ID_xxx). //------------------------------------------------------------------------------ void PMC_DisablePeripheral(unsigned int id) { SANITY_CHECK(id < 32); if ((AT91C_BASE_PMC->PMC_PCSR & (1 << id)) != (1 << id)) { TRACE_INFO("PMC_DisablePeripheral: clock of peripheral" " %u is not enabled\n\r", id); } else { AT91C_BASE_PMC->PMC_PCDR = 1 << id; } } //------------------------------------------------------------------------------ /// Enable all the periph clock via PMC /// (Becareful of the last 2 bits, it is not periph clock) //------------------------------------------------------------------------------ void PMC_EnableAllPeripherals(void) { AT91C_BASE_PMC->PMC_PCER = MASK_STATUS; while( (AT91C_BASE_PMC->PMC_PCSR & MASK_STATUS) != MASK_STATUS); TRACE_INFO("Enable all periph clocks\n\r"); } //------------------------------------------------------------------------------ /// Disable all the periph clock via PMC /// (Becareful of the last 2 bits, it is not periph clock) //------------------------------------------------------------------------------ void PMC_DisableAllPeripherals(void) { AT91C_BASE_PMC->PMC_PCDR = MASK_STATUS; while((AT91C_BASE_PMC->PMC_PCSR & MASK_STATUS) != 0); TRACE_INFO("Disable all periph clocks\n\r"); } //----------------------------------------------------------------------------- /// Get Periph Status //----------------------------------------------------------------------------- unsigned int PMC_IsAllPeriphEnabled(void) { return (AT91C_BASE_PMC->PMC_PCSR == MASK_STATUS); } //----------------------------------------------------------------------------- /// Get Periph Status //----------------------------------------------------------------------------- unsigned int PMC_IsPeriphEnabled(unsigned int id) { return (AT91C_BASE_PMC->PMC_PCSR & (1 << id)); } //------------------------------------------------------------------------------ /// Put the CPU in Idle Mode for lower consumption //------------------------------------------------------------------------------ void PMC_CPUInIdleMode(void) { #ifndef CP15_PRESENT PMC_DisableProcessorClock(); #else AT91C_BASE_PMC->PMC_SCDR = AT91C_PMC_PCK; CP15_WaitForInterrupt(); #endif } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/pmc/pmc.h000066400000000000000000000057061207233610700254540ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ #ifndef PMC_H #define PMC_H //------------------------------------------------------------------------------ // Global functions //------------------------------------------------------------------------------ #if defined(at91sam7l64) || defined(at91sam7l128) extern void PMC_SetFastWakeUpInputs(unsigned int inputs); extern void PMC_DisableMainOscillator(void); extern #ifdef __ICCARM__ __ramfunc #endif //__ICCARM__ void PMC_DisableMainOscillatorForWaitMode(void); #endif // at91sam7l64 at91sam7l128 extern void PMC_DisableProcessorClock(void); extern void PMC_EnablePeripheral(unsigned int id); extern void PMC_DisablePeripheral(unsigned int id); extern void PMC_CPUInIdleMode(void); extern void PMC_EnableAllPeripherals(void); extern void PMC_DisableAllPeripherals(void); extern unsigned int PMC_IsAllPeriphEnabled(void); extern unsigned int PMC_IsPeriphEnabled(unsigned int id); #endif //#ifndef PMC_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/tc/000077500000000000000000000000001207233610700243435ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/tc/tc.h000066400000000000000000000067741207233610700251400ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !Purpose /// /// API for configuring and using Timer Counter (TC) peripherals. /// /// !Usage /// -# Optionally, use TC_FindMckDivisor() to let the program find the best /// TCCLKS field value automatically. /// -# Configure a Timer Counter in the desired mode using TC_Configure(). /// -# Start or stop the timer clock using TC_Start() and TC_Stop(). //------------------------------------------------------------------------------ #ifndef TC_H #define TC_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include #if defined(AT91C_ID_TC0) // nothing to do #elif defined(AT91C_ID_TC012) #define AT91C_ID_TC0 AT91C_ID_TC012 #elif defined(AT91C_ID_TC) #define AT91C_ID_TC0 AT91C_ID_TC #else #error Pb define ID_TC #endif //------------------------------------------------------------------------------ // Global functions //------------------------------------------------------------------------------ extern void TC_Configure(AT91S_TC *pTc, unsigned int mode); extern void TC_Start(AT91S_TC *pTc); extern void TC_Stop(AT91S_TC *pTc); extern unsigned char TC_FindMckDivisor( unsigned int freq, unsigned int mck, unsigned int *div, unsigned int *tcclks); #endif //#ifndef TC_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/usart/000077500000000000000000000000001207233610700250735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/usart/usart.c000066400000000000000000000273401207233610700264030ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "usart.h" #include #include //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Configures an USART peripheral with the specified parameters. /// \param usart Pointer to the USART peripheral to configure. /// \param mode Desired value for the USART mode register (see the datasheet). /// \param baudrate Baudrate at which the USART should operate (in Hz). /// \param masterClock Frequency of the system master clock (in Hz). //------------------------------------------------------------------------------ void USART_Configure(AT91S_USART *usart, unsigned int mode, unsigned int baudrate, unsigned int masterClock) { // Reset and disable receiver & transmitter usart->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS; // Configure mode usart->US_MR = mode; // Configure baudrate // Asynchronous, no oversampling if (((mode & AT91C_US_SYNC) == 0) && ((mode & AT91C_US_OVER) == 0)) { usart->US_BRGR = (masterClock / baudrate) / 16; } // TODO other modes } //------------------------------------------------------------------------------ /// Enables or disables the transmitter of an USART peripheral. /// \param usart Pointer to an USART peripheral /// \param enabled If true, the transmitter is enabled; otherwise it is /// disabled. //------------------------------------------------------------------------------ void USART_SetTransmitterEnabled(AT91S_USART *usart, unsigned char enabled) { if (enabled) { usart->US_CR = AT91C_US_TXEN; } else { usart->US_CR = AT91C_US_TXDIS; } } //------------------------------------------------------------------------------ /// Enables or disables the receiver of an USART peripheral /// \param usart Pointer to an USART peripheral /// \param enabled If true, the receiver is enabled; otherwise it is disabled. //------------------------------------------------------------------------------ void USART_SetReceiverEnabled(AT91S_USART *usart, unsigned char enabled) { if (enabled) { usart->US_CR = AT91C_US_RXEN; } else { usart->US_CR = AT91C_US_RXDIS; } } //------------------------------------------------------------------------------ /// Sends one packet of data through the specified USART peripheral. This /// function operates synchronously, so it only returns when the data has been /// actually sent. /// \param usart Pointer to an USART peripheral. /// \param data Data to send including 9nth bit and sync field if necessary (in /// the same format as the US_THR register in the datasheet). /// \param timeOut Time out value (0 = no timeout). //------------------------------------------------------------------------------ void USART_Write( AT91S_USART *usart, unsigned short data, volatile unsigned int timeOut) { if (timeOut == 0) { while ((usart->US_CSR & AT91C_US_TXEMPTY) == 0); } else { while ((usart->US_CSR & AT91C_US_TXEMPTY) == 0) { if (timeOut == 0) { TRACE_ERROR("USART_Write: Timed out.\n\r"); return; } timeOut--; } } usart->US_THR = data; } //------------------------------------------------------------------------------ /// Sends the contents of a data buffer through the specified USART peripheral. /// This function returns immediately (1 if the buffer has been queued, 0 /// otherwise); poll the ENDTX and TXBUFE bits of the USART status register /// to check for the transfer completion. /// \param usart Pointer to an USART peripheral. /// \param buffer Pointer to the data buffer to send. /// \param size Size of the data buffer (in bytes). //------------------------------------------------------------------------------ unsigned char USART_WriteBuffer( AT91S_USART *usart, void *buffer, unsigned int size) { // Check if the first PDC bank is free if ((usart->US_TCR == 0) && (usart->US_TNCR == 0)) { usart->US_TPR = (unsigned int) buffer; usart->US_TCR = size; usart->US_PTCR = AT91C_PDC_TXTEN; return 1; } // Check if the second PDC bank is free else if (usart->US_TNCR == 0) { usart->US_TNPR = (unsigned int) buffer; usart->US_TNCR = size; return 1; } else { return 0; } } //------------------------------------------------------------------------------ /// Reads and return a packet of data on the specified USART peripheral. This /// function operates asynchronously, so it waits until some data has been /// received. /// \param usart Pointer to an USART peripheral. /// \param timeOut Time out value (0 -> no timeout). //------------------------------------------------------------------------------ unsigned short USART_Read( AT91S_USART *usart, volatile unsigned int timeOut) { if (timeOut == 0) { while ((usart->US_CSR & AT91C_US_RXRDY) == 0); } else { while ((usart->US_CSR & AT91C_US_RXRDY) == 0) { if (timeOut == 0) { TRACE_ERROR("USART_Read: Timed out.\n\r"); return 0; } timeOut--; } } return usart->US_RHR; } //------------------------------------------------------------------------------ /// Reads data from an USART peripheral, filling the provided buffer until it /// becomes full. This function returns immediately with 1 if the buffer has /// been queued for transmission; otherwise 0. /// \param usart Pointer to an USART peripheral. /// \param buffer Pointer to the buffer where the received data will be stored. /// \param size Size of the data buffer (in bytes). //------------------------------------------------------------------------------ unsigned char USART_ReadBuffer(AT91S_USART *usart, void *buffer, unsigned int size) { // Check if the first PDC bank is free if ((usart->US_RCR == 0) && (usart->US_RNCR == 0)) { usart->US_RPR = (unsigned int) buffer; usart->US_RCR = size; usart->US_PTCR = AT91C_PDC_RXTEN; return 1; } // Check if the second PDC bank is free else if (usart->US_RNCR == 0) { usart->US_RNPR = (unsigned int) buffer; usart->US_RNCR = size; return 1; } else { return 0; } } //------------------------------------------------------------------------------ /// Returns 1 if some data has been received and can be read from an USART; /// otherwise returns 0. /// \param usart Pointer to an AT91S_USART instance. //------------------------------------------------------------------------------ unsigned char USART_IsDataAvailable(AT91S_USART *usart) { if ((usart->US_CSR & AT91C_US_RXRDY) != 0) { return 1; } else { return 0; } } //------------------------------------------------------------------------------ /// Sets the filter value for the IRDA demodulator. /// \param pUsart Pointer to an AT91S_USART instance. /// \param filter Filter value. //------------------------------------------------------------------------------ void USART_SetIrdaFilter(AT91S_USART *pUsart, unsigned char filter) { SANITY_CHECK(pUsart); pUsart->US_IF = filter; } //------------------------------------------------------------------------------ /// Sends one packet of data through the specified USART peripheral. This /// function operates synchronously, so it only returns when the data has been /// actually sent. /// \param usart Pointer to an USART peripheral. /// \param data Data to send including 9nth bit and sync field if necessary (in /// the same format as the US_THR register in the datasheet). /// \param timeOut Time out value (0 = no timeout). //------------------------------------------------------------------------------ void USART_PutChar( AT91S_USART *usart, unsigned char c) { // Wait for the transmitter to be ready while ((usart->US_CSR & AT91C_US_TXEMPTY) == 0); // Send character usart->US_THR = c; // Wait for the transfer to complete while ((usart->US_CSR & AT91C_US_TXEMPTY) == 0); } //------------------------------------------------------------------------------ /// Return 1 if a character can be read in USART //------------------------------------------------------------------------------ unsigned int USART_IsRxReady(AT91S_USART *usart) { return (usart->US_CSR & AT91C_US_RXRDY); } //------------------------------------------------------------------------------ /// Reads and returns a character from the USART. /// \note This function is synchronous (i.e. uses polling). /// \return Character received. //------------------------------------------------------------------------------ unsigned char USART_GetChar(AT91S_USART *usart) { while ((usart->US_CSR & AT91C_US_RXRDY) == 0); return usart->US_RHR; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/peripherals/usart/usart.h000066400000000000000000000124501207233610700264040ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \dir /// !Purpose /// /// This module provides several definitions and methods for using an USART /// peripheral. /// /// !Usage /// -# Enable the USART peripheral clock in the PMC. /// -# Enable the required USART PIOs (see pio.h). /// -# Configure the UART by calling USART_Configure. /// -# Enable the transmitter and/or the receiver of the USART using /// USART_SetTransmitterEnabled and USART_SetReceiverEnabled. /// -# Send data through the USART using the USART_Write and /// USART_WriteBuffer methods. /// -# Receive data from the USART using the USART_Read and /// USART_ReadBuffer functions; the availability of data can be polled /// with USART_IsDataAvailable. /// -# Disable the transmitter and/or the receiver of the USART with /// USART_SetTransmitterEnabled and USART_SetReceiverEnabled. //------------------------------------------------------------------------------ #ifndef USART_H #define USART_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USART modes" /// This page lists several common operating modes for an USART peripheral. /// /// !Modes /// - USART_MODE_ASYNCHRONOUS /// - USART_MODE_IRDA /// Basic asynchronous mode, i.e. 8 bits no parity. #define USART_MODE_ASYNCHRONOUS (AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE) /// IRDA mode #define USART_MODE_IRDA (AT91C_US_USMODE_IRDA | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE | AT91C_US_FILTER) //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern void USART_Configure( AT91S_USART *usart, unsigned int mode, unsigned int baudrate, unsigned int masterClock); extern void USART_SetTransmitterEnabled(AT91S_USART *usart, unsigned char enabled); extern void USART_SetReceiverEnabled(AT91S_USART *usart, unsigned char enabled); extern void USART_Write( AT91S_USART *usart, unsigned short data, volatile unsigned int timeOut); extern unsigned char USART_WriteBuffer( AT91S_USART *usart, void *buffer, unsigned int size); extern unsigned short USART_Read( AT91S_USART *usart, volatile unsigned int timeOut); extern unsigned char USART_ReadBuffer( AT91S_USART *usart, void *buffer, unsigned int size); extern unsigned char USART_IsDataAvailable(AT91S_USART *usart); extern void USART_SetIrdaFilter(AT91S_USART *pUsart, unsigned char filter); extern void USART_PutChar(AT91S_USART *usart, unsigned char c); extern unsigned int USART_IsRxReady(AT91S_USART *usart); extern unsigned char USART_GetChar(AT91S_USART *usart); #endif //#ifndef USART_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/sam3uudphshardware.h000066400000000000000000000444111207233610700254060ustar00rootroot00000000000000/* * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * High Speed USB Device Port register definitions. * * @author Kevin Klues */ #ifndef _SAM3UUDPHSHARDWARE_H #define _SAM3UUDPHSHARDWARE_H #include // Resource definition #define SAM3U_UDPHS_RESOURCE "Sam3uUdphs.Resource" //Defines needed by Atmel USB framework typedef irqn_t IRQn_Type; /** * UDPHS Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 973 */ typedef union { uint32_t flat; struct { uint32_t dev_addr : 7; uint32_t faddr_en : 1; uint32_t en_udphs : 1; uint32_t detach : 1; uint32_t rewakeup : 1; uint32_t pulld_dis : 1; uint32_t reserved : 20; } __attribute__((__packed__)) bits; } udphs_ctrl_t; /** * UDPHS Frame Number Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 975 */ typedef union { uint32_t flat; struct { uint32_t micro_frame_num : 3; uint32_t frame_number : 11; uint32_t reserved : 17; uint32_t fnum_err : 1; } __attribute__((__packed__)) bits; } udphs_fnum_t; /** * UDPHS Interrupt Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 976 */ typedef union { uint32_t flat; struct { uint32_t reserved0 : 1; uint32_t det_suspd : 1; uint32_t micro_sof : 1; uint32_t int_sof : 1; uint32_t endreset : 1; uint32_t wake_up : 1; uint32_t endofrsm : 1; uint32_t upstr_res : 1; uint32_t ept_0 : 1; uint32_t ept_1 : 1; uint32_t ept_2 : 1; uint32_t ept_3 : 1; uint32_t ept_4 : 1; uint32_t ept_5 : 1; uint32_t ept_6 : 1; uint32_t reserved1 : 10; uint32_t dma_1 : 1; uint32_t dma_2 : 1; uint32_t dma_3 : 1; uint32_t dma_4 : 1; uint32_t dma_r : 1; uint32_t dma_6 : 1; uint32_t reserved2 : 1; } __attribute__((__packed__)) bits; } udphs_ien_t; /** * UDPHS Interrupt Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 979 */ typedef union { uint32_t flat; struct { uint32_t speed : 1; uint32_t det_suspd : 1; uint32_t micro_sof : 1; uint32_t int_sof : 1; uint32_t endreset : 1; uint32_t wake_up : 1; uint32_t endofrsm : 1; uint32_t upstr_res : 1; uint32_t ept_0 : 1; uint32_t ept_1 : 1; uint32_t ept_2 : 1; uint32_t ept_3 : 1; uint32_t ept_4 : 1; uint32_t ept_5 : 1; uint32_t ept_6 : 1; uint32_t reserved0 : 10; uint32_t dma_1 : 1; uint32_t dma_2 : 1; uint32_t dma_3 : 1; uint32_t dma_4 : 1; uint32_t dma_5 : 1; uint32_t dma_6 : 1; uint32_t reserved1 : 1; } __attribute__((__packed__)) bits; } udphs_intsta_t; /** * UDPHS Clear Interrupt Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 981 */ typedef union { uint32_t flat; struct { uint32_t reserved0 : 1; uint32_t det_suspd : 1; uint32_t micro_sof : 1; uint32_t int_sof : 1; uint32_t endreset : 1; uint32_t wake_up : 1; uint32_t endofrsm : 1; uint32_t upstr_res : 1; uint32_t reserved1 : 24; } __attribute__((__packed__)) bits; } udphs_clrint_t; /** * UDPHS Endpoints Reset Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 982 */ typedef union { uint32_t flat; struct { uint32_t ept_0 : 1; uint32_t ept_1 : 1; uint32_t ept_2 : 1; uint32_t ept_3 : 1; uint32_t ept_4 : 1; uint32_t ept_5 : 1; uint32_t ept_6 : 1; uint32_t reserved : 25; } __attribute__((__packed__)) bits; } udphs_eptrst_t; /** * UDPHS Test Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 983 */ typedef union { uint32_t flat; struct { uint32_t speed_cfg : 2; uint32_t tst_j : 1; uint32_t tst_k : 1; uint32_t tst_pkt : 1; uint32_t opmode2 : 1; uint32_t reserved : 26; } __attribute__((__packed__)) bits; } udphs_tst_t; /** * UDPHS Name1 Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 985 */ typedef union { uint32_t flat; struct { uint32_t ip_name1 : 32; } __attribute__((__packed__)) bits; } udphs_ipname1_t; /** * UDPHS Name2 Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 986 */ typedef union { uint32_t flat; struct { uint32_t ip_name2 : 32; } __attribute__((__packed__)) bits; } udphs_ipname2_t; /** * UDPHS Features Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 987 */ typedef union { uint32_t flat; struct { uint32_t ept_nbr_max : 4; uint32_t dma_channel_nbr : 3; uint32_t dma_b_siz : 1; uint32_t dma_fifo_word_depth : 4; uint32_t fifo_max_size : 3; uint32_t bw_dpram : 1; uint32_t datab16_8 : 1; uint32_t iso_ept_1 : 1; uint32_t iso_ept_2 : 1; uint32_t iso_ept_3 : 1; uint32_t iso_ept_4 : 1; uint32_t iso_ept_5 : 1; uint32_t iso_ept_6 : 1; uint32_t iso_ept_7 : 1; uint32_t iso_ept_8 : 1; uint32_t iso_ept_9 : 1; uint32_t iso_ept_10 : 1; uint32_t iso_ept_11 : 1; uint32_t iso_ept_12 : 1; uint32_t iso_ept_13 : 1; uint32_t iso_ept_14 : 1; uint32_t iso_ept_15 : 1; } __attribute__((__packed__)) bits; } udphs_ipfeatures_t; /** * UDPHS Endpoint Configuration Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 989 */ typedef union { uint32_t flat; struct { uint32_t ept_size : 3; uint32_t ept_dir : 1; uint32_t ept_type : 2; uint32_t bk_number : 2; uint32_t nb_trans : 2; uint32_t reserved : 21; uint32_t ept_mapd : 1; } __attribute__((__packed__)) bits; } udphs_eptcfg_t; /** * UDPHS Endpoint Control Enable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 991 */ typedef union { uint32_t flat; struct { uint32_t ept_enabl : 1; uint32_t auto_valid : 1; uint32_t reserved0 : 1; uint32_t intdis_dma : 1; uint32_t nyet_dis : 1; uint32_t reserved1 : 1; uint32_t datax_rx : 1; uint32_t mdata_rx : 1; uint32_t err_ovflw : 1; uint32_t rx_bk_rdy : 1; uint32_t tx_complt : 1; // union { uint32_t tx_pk_rdy : 1; // uint32_t err_trans : 1; // }; // union { uint32_t rx_setup : 1; // uint32_t err_fl_iso : 1; // }; // union { uint32_t stall_snt : 1; // uint32_t err_criso : 1; // uint32_t err_nbtra : 1; // }; // union { uint32_t nak_in : 1; // uint32_t err_flush : 1; // }; uint32_t nak_out : 1; uint32_t reserved2 : 2; uint32_t busy_bank : 1; uint32_t reserved3 : 12; uint32_t shrt_pckt : 1; } __attribute__((__packed__)) bits; } udphs_eptctlenb_t; /** * UDPHS Endpoint Control Disable Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 993 */ typedef union { uint32_t flat; struct { uint32_t ept_disabl : 1; uint32_t auto_valid : 1; uint32_t reserved0 : 1; uint32_t intdis_dma : 1; uint32_t nyet_dis : 1; uint32_t reserved1 : 1; uint32_t datax_rx : 1; uint32_t mdata_rx : 1; uint32_t err_ovflw : 1; uint32_t rx_bk_rdy : 1; uint32_t tx_complt : 1; // union { uint32_t tx_pk_rdy : 1; // uint32_t err_trans : 1; // }; // union { uint32_t rx_setup : 1; // uint32_t err_fl_iso : 1; // }; // union { uint32_t stall_snt : 1; // uint32_t err_criso : 1; // uint32_t err_nbtra : 1; // }; // union { uint32_t nak_in : 1; // uint32_t err_flush : 1; // }; uint32_t nak_out : 1; uint32_t reserved2 : 2; uint32_t busy_bank : 1; uint32_t reserved3 : 12; uint32_t shrt_pckt : 1; } __attribute__((__packed__)) bits; } udphs_eptctldis_t; /** * UDPHS Endpoint Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 995 */ typedef union { uint32_t flat; struct { uint32_t ept_enabl : 1; uint32_t auto_valid : 1; uint32_t reserved0 : 1; uint32_t intdis_dma : 1; uint32_t nyet_dis : 1; uint32_t reserved1 : 1; uint32_t datax_rx : 1; uint32_t mdata_rx : 1; uint32_t err_ovflw : 1; uint32_t rx_bk_rdy : 1; uint32_t tx_complt : 1; // union { uint32_t tx_pk_rdy : 1; // uint32_t err_trans : 1; // }; // union { uint32_t rx_setup : 1; // uint32_t err_fl_iso : 1; // }; // union { uint32_t stall_snt : 1; // uint32_t err_criso : 1; // uint32_t err_nbtra : 1; // }; // union { uint32_t nak_in : 1; // uint32_t err_flush : 1; // }; uint32_t nak_out : 1; uint32_t reserved2 : 2; uint32_t busy_bank : 1; uint32_t reserved3 : 12; uint32_t shrt_pckt : 1; } __attribute__((__packed__)) bits; } udphs_eptctl_t; /** * UDPHS Endpoint Set Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 998 */ typedef union { uint32_t flat; struct { uint32_t reserved0 : 5; uint32_t frcestall : 1; uint32_t reserved1 : 3; uint32_t kill_bank : 1; uint32_t reserved2 : 1; uint32_t tx_pk_rdy : 1; uint32_t reserved3 : 20; } __attribute__((__packed__)) bits; } udphs_eptsetsta_t; /** * UDPHS Endpoint Clear Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 999 */ typedef union { uint32_t flat; struct { uint32_t reserved0 : 5; uint32_t frcestall : 1; uint32_t togglesq : 1; uint32_t reserved1 : 2; uint32_t rx_bk_rdy : 1; uint32_t tx_complt : 1; uint32_t reserved3 : 1; // union { uint32_t rx_setup : 1; // uint32_t err_fl_iso : 1; // }; // union { uint32_t stall_snt : 1; // uint32_t err_nbtra : 1; // }; // union { uint32_t nak_in : 1; // uint32_t err_flush : 1; // }; uint32_t nak_out : 1; uint32_t reserved4 : 16; } __attribute__((__packed__)) bits; } udphs_eptclrsta_t; /** * UDPHS Endpoint Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 999 */ typedef union { uint32_t flat; struct { uint32_t reserved : 5; uint32_t frcestall : 1; uint32_t togglesq_sta : 2; uint32_t err_ovflw : 1; // union { uint32_t rx_bk_rdy : 1; // uint32_t kill_bank : 1; // }; uint32_t tx_complt : 1; // union { uint32_t tx_pk_rdy : 1; // uint32_t err_trans : 1; // }; // union { uint32_t rx_setup : 1; // uint32_t err_fl_iso : 1; // }; // union { uint32_t stall_snt : 1; // uint32_t err_criso : 1; // uint32_t err_nbtra : 1; // }; // union { uint32_t nak_in : 1; // uint32_t err_flush : 1; // }; uint32_t nak_out : 1; // union { uint32_t current_bank : 2; // uint32_t control_dir : 2; // }; uint32_t busy_bank_sta : 2; uint32_t byte_count : 11; uint32_t shrt_pckt : 1; } __attribute__((__packed__)) bits; } udphs_eptsta_t; /** * UDPHS DMA Next Descriptor Address Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1007 */ typedef union { uint32_t flat; struct { uint32_t nxt_dsc_add : 32; } __attribute__((__packed__)) bits; } udphs_dmanxtdsc_t; /** * UDPHS DMA Channel Address Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1008 */ typedef union { uint32_t flat; struct { uint32_t buff_add : 32; } __attribute__((__packed__)) bits; } udphs_dmaaddress_t; /** * UDPHS DMA Channel Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1009 */ typedef union { uint32_t flat; struct { uint32_t chann_enb : 1; uint32_t ldnxt_dsc : 1; uint32_t end_tr_en : 1; uint32_t end_b_en : 1; uint32_t end_tr_it : 1; uint32_t end_buffit : 1; uint32_t desc_ld_it : 1; uint32_t burst_lck : 1; uint32_t reserved : 8; uint32_t buff_length : 16; } __attribute__((__packed__)) bits; } udphs_dmacontrol_t; /** * UDPHS DMA Channel Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 1011 */ typedef union { uint32_t flat; struct { uint32_t chann_enb : 1; uint32_t chann_act : 1; uint32_t reserved0 : 2; uint32_t end_tr_st : 1; uint32_t end_bf_st : 1; uint32_t desc_ldst : 1; uint32_t reserved1 : 9; uint32_t buff_count : 16; } __attribute__((__packed__)) bits; } udphs_dmastatus_t; /** * UDPHS Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary, p. 972 */ typedef struct { udphs_eptcfg_t cfg; udphs_eptctlenb_t ctlenb; udphs_eptctldis_t ctldis; udphs_eptctl_t ctl; uint32_t endpoint; udphs_eptsetsta_t setsta; udphs_eptclrsta_t crlsta; udphs_eptsta_t sta; } udphs_ept_t; typedef struct { udphs_dmanxtdsc_t nxtdsc; udphs_dmaaddress_t address; udphs_dmacontrol_t control; udphs_dmastatus_t status; } udphs_dma_t; typedef struct udphs { volatile udphs_ctrl_t ctrl; volatile udphs_fnum_t fnum; uint32_t reserved0[2]; volatile udphs_ien_t ien; volatile udphs_intsta_t intsta; volatile udphs_clrint_t clrint; volatile udphs_eptrst_t eptrst; uint32_t reserved1[48]; //Data sheet range is wrong.... volatile udphs_tst_t tst; uint32_t reserved2[3]; // Data sheet range wrong here too.... volatile udphs_ipname1_t ipname1; volatile udphs_ipname2_t ipname2; volatile udphs_ipfeatures_t ipfeatures; uint32_t reserved3[1]; // Not even listed on data sheet... volatile udphs_ept_t ept[7]; uint32_t reserved4[72]; udphs_dma_t reserved_dma0; volatile udphs_dma_t dma[5]; } udphs_t; /** * Memory mapping for the UDPHS controller */ volatile udphs_t* UDPHS = (volatile udphs_t *) 0x400A4000; // Valid endpoint sizes enum { EPT_SIZE_8, EPT_SIZE_16, EPT_SIZE_32, EPT_SIZE_64, EPT_SIZE_128, EPT_SIZE_256, EPT_SIZE_512, EPT_SIZE_1024, }; // Valid endpoint directions enum { EPT_DIR_OUT, EPT_DIR_IN, #define EPT_DIR_DONTCARE EPT_DIR_OUT }; // Valid endpoint transfer types enum { EPT_CTRL, EPT_ISO, EPT_BULK, EPT_INT, }; #endif tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/000077500000000000000000000000001207233610700222105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/000077500000000000000000000000001207233610700235005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/000077500000000000000000000000001207233610700242315ustar00rootroot00000000000000CDCAbstractControlManagementDescriptor.h000066400000000000000000000113201207233610700337720ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of a class for manipulating CDC abstract control management descriptors. !!!Usage Should be included in a list of USB configuration descriptors. */ #ifndef CDCABSTRACTCONTROLMANAGEMENTDESCRIPTOR_H #define CDCABSTRACTCONTROLMANAGEMENTDESCRIPTOR_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC ACM Capabilities" /// This page lists the capabilities of the CDC ACM. /// /// !Capabilities /// - CDCAbstractControlManagementDescriptor_COMMFEATURE /// - CDCAbstractControlManagementDescriptor_LINE /// - CDCAbstractControlManagementDescriptor_SENDBREAK /// - CDCAbstractControlManagementDescriptor_NETWORKCONNECTION /// Device supports the request combination of SetCommFeature, ClearCommFeature /// and GetCommFeature. #define CDCAbstractControlManagementDescriptor_COMMFEATURE (1 << 0) /// Device supports the request combination of SetLineCoding, GetLineCoding and /// SetControlLineState. #define CDCAbstractControlManagementDescriptor_LINE (1 << 1) /// Device supports the SendBreak request. #define CDCAbstractControlManagementDescriptor_SENDBREAK (1 << 2) /// Device supports the NetworkConnection notification. #define CDCAbstractControlManagementDescriptor_NETWORKCONNECTION (1 << 3) //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ #ifdef __ICCARM__ // IAR #pragma pack(1) // IAR #define __attribute__(...) // IAR #endif // IAR //------------------------------------------------------------------------------ /// Describes the command supported by the communication interface class /// with the Abstract Control Model subclass code. //------------------------------------------------------------------------------ typedef struct { /// Size of this descriptor in bytes. unsigned char bFunctionLength; /// Descriptor type (CDCDescriptors_INTERFACE). unsigned char bDescriptorType; /// Descriptor subtype (CDCDescriptors_ABSTRACTCONTROLMANAGEMENT). unsigned char bDescriptorSubtype; /// Configuration capabilities. /// \sa "CDC ACM Capabilities". unsigned char bmCapabilities; } __attribute__ ((packed)) CDCAbstractControlManagementDescriptor; // GCC #ifdef __ICCARM__ // IAR #pragma pack() // IAR #endif // IAR #endif //#ifndef CDCABSTRACTCONTROLMANAGEMENTDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/CDCCallManagementDescriptor.h000066400000000000000000000104271207233610700316270ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of a class for managing CDC call management descriptors. !!!Usage Should be included in a list of configuration descriptors for a USB device. */ #ifndef CDCCALLMANAGEMENTDESCRIPTOR_H #define CDCCALLMANAGEMENTDESCRIPTOR_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC CallManagement Capabilities" /// This page lists CDC CallManagement Capabilities. /// /// !Capabilities /// - CDCCallManagementDescriptor_SELFCALLMANAGEMENT /// - CDCCallManagementDescriptor_DATACALLMANAGEMENT /// Device handles call management itself. #define CDCCallManagementDescriptor_SELFCALLMANAGEMENT (1 << 0) /// Device can exchange call management information over a Data class interface. #define CDCCallManagementDescriptor_DATACALLMANAGEMENT (1 << 1) //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ #ifdef __ICCARM__ // IAR #pragma pack(1) // IAR #define __attribute__(...) // IAR #endif // IAR //------------------------------------------------------------------------------ /// Describes the processing of calls for the communication class interface. //------------------------------------------------------------------------------ typedef struct { /// Size of this descriptor in bytes. unsigned char bFunctionLength; /// Descriptor type (CDCDescriptors_INTERFACE). unsigned char bDescriptorType; /// Descriptor sub-type (CDCDescriptors_CALLMANAGEMENT). unsigned char bDescriptorSubtype; /// Configuration capabilities ("CDC CallManagement Capabilities"). unsigned char bmCapabilities; /// Interface number of the data class interface used for call management /// (optional). unsigned char bDataInterface; } __attribute__ ((packed)) CDCCallManagementDescriptor; // GCC #ifdef __ICCARM__ // IAR #pragma pack() // IAR #endif // IAR #endif //#ifndef CDCCALLMANAGEMENTDESCRIPTOR_H CDCCommunicationInterfaceDescriptor.h000066400000000000000000000064401207233610700333260ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of several constants used when declaring a CDC communication class interface descriptor. */ #ifndef CDCCOMMUNICATIONINTERFACEDESCRIPTOR_H #define CDCCOMMUNICATIONINTERFACEDESCRIPTOR_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC Communication Interface Values" /// This page lists the values for CDC Communication Interface Descriptor. /// /// !Values /// - CDCCommunicationInterfaceDescriptor_CLASS /// - CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL /// - CDCCommunicationInterfaceDescriptor_NOPROTOCOL /// Interface class code for a CDC communication class interface. #define CDCCommunicationInterfaceDescriptor_CLASS 0x02 /// Interface subclass code for an Abstract Control Model interface descriptor. #define CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL 0x02 /// Interface protocol code when a CDC communication interface does not /// implemenent any particular protocol. #define CDCCommunicationInterfaceDescriptor_NOPROTOCOL 0x00 //------------------------------------------------------------------------------ #endif //#ifndef CDCCOMMUNICATIONINTERFACEDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/CDCDataInterfaceDescriptor.h000066400000000000000000000061151207233610700314500ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definitions of constants used when declaring a CDC data class interface descriptor. */ #ifndef CDCDATAINTERFACEDESCRIPTOR_H #define CDCDATAINTERFACEDESCRIPTOR_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC Data Interface Values" /// This page lists the values for CDC Data Interface Descriptor. /// /// !Values /// - CDCDataInterfaceDescriptor_CLASS /// - CDCDataInterfaceDescriptor_SUBCLASS /// - CDCDataInterfaceDescriptor_NOPROTOCOL /// Interface class code for a data class interface. #define CDCDataInterfaceDescriptor_CLASS 0x0A /// Interface subclass code for a data class interface. #define CDCDataInterfaceDescriptor_SUBCLASS 0x00 /// Protocol code for a data class interface which does not implement any /// particular protocol. #define CDCDataInterfaceDescriptor_NOPROTOCOL 0x00 //------------------------------------------------------------------------------ #endif //#ifndef CDCDATAINTERFACEDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/CDCDeviceDescriptor.h000066400000000000000000000057351207233610700301640ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of several constants used when declaring USB CDC device descriptors. */ #ifndef CDCDEVICEDESCRIPTOR_H #define CDCDEVICEDESCRIPTOR_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC Device Descriptor Values" /// This page lists the values for CDC Device Descriptor. /// /// !Values /// - CDCDeviceDescriptor_CLASS /// - CDCDeviceDescriptor_SUBCLASS /// - CDCDeviceDescriptor_PROTOCOL /// Device class code when using the CDC class. #define CDCDeviceDescriptor_CLASS 0x02 /// Device subclass code when using the CDC class. #define CDCDeviceDescriptor_SUBCLASS 0x00 /// Device protocol code when using the CDC class. #define CDCDeviceDescriptor_PROTOCOL 0x00 //------------------------------------------------------------------------------ #endif //#ifndef CDCDEVICEDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/CDCGenericDescriptor.h000066400000000000000000000102251207233610700303270ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of several constants for declaring CDC descriptors. */ #ifndef CDCGENERICDESCRIPTOR_H #define CDCGENERICDESCRIPTOR_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC Specification Release Numbers" /// This page list the CDC Spec. Release Numbers. /// /// !Numbers /// - CDCGenericDescriptor_CDC1_10 /// Identify CDC specification version 1.10. #define CDCGenericDescriptor_CDC1_10 0x0110 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC Descriptro Types" /// This page lists CDC descriptor types. /// /// !Types /// - CDCGenericDescriptor_INTERFACE /// - CDCGenericDescriptor_ENDPOINT ///Indicates that a CDC descriptor applies to an interface. #define CDCGenericDescriptor_INTERFACE 0x24 /// Indicates that a CDC descriptor applies to an endpoint. #define CDCGenericDescriptor_ENDPOINT 0x25 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC Descriptor Subtypes" /// This page lists CDC descriptor sub types /// /// !Types /// - CDCGenericDescriptor_HEADER /// - CDCGenericDescriptor_CALLMANAGEMENT /// - CDCGenericDescriptor_ABSTRACTCONTROLMANAGEMENT /// - CDCGenericDescriptor_UNION /// Header functional descriptor subtype. #define CDCGenericDescriptor_HEADER 0x00 /// Call management functional descriptor subtype. #define CDCGenericDescriptor_CALLMANAGEMENT 0x01 /// Abstract control management descriptor subtype. #define CDCGenericDescriptor_ABSTRACTCONTROLMANAGEMENT 0x02 /// Union descriptor subtype. #define CDCGenericDescriptor_UNION 0x06 //------------------------------------------------------------------------------ #endif //#ifndef CDCGENERICDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/CDCGenericRequest.h000066400000000000000000000056261207233610700276520ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Various definitions used for characterizing USB CDC requests. */ #ifndef CDCGENERICREQUEST_H #define CDCGENERICREQUEST_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC Request Codes" /// This page lists USB CDC Request Codes. /// /// !Codes /// - CDCGenericRequest_SETLINECODING /// - CDCGenericRequest_GETLINECODING /// - CDCGenericRequest_SETCONTROLLINESTATE /// SetLineCoding request code. #define CDCGenericRequest_SETLINECODING 0x20 /// GetLineCoding request code. #define CDCGenericRequest_GETLINECODING 0x21 /// SetControlLineState request code. #define CDCGenericRequest_SETCONTROLLINESTATE 0x22 //------------------------------------------------------------------------------ #endif //#ifndef CDCGENERICREQUEST_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/CDCHeaderDescriptor.h000066400000000000000000000063301207233610700301450ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of the CDCHeaderDescriptor class. !!!Usage Should be included in a USB configuration descriptor. */ #ifndef CDCHEADERDESCRIPTOR_H #define CDCHEADERDESCRIPTOR_H //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ #ifdef __ICCARM__ // IAR #pragma pack(1) // IAR #define __attribute__(...) // IAR #endif // IAR //------------------------------------------------------------------------------ /// Marks the beginning of the concatenated set of functional descriptors /// for the interface. //------------------------------------------------------------------------------ typedef struct { /// Size of this descriptor in bytes. unsigned char bFunctionLength; /// Descriptor type (CDCDescriptors_INTERFACE). unsigned char bDescriptorType; /// Descriptor sub-type (CDCDescriptors_HEADER). unsigned char bDescriptorSubtype; /// USB CDC specification release number. unsigned short bcdCDC; } __attribute__ ((packed)) CDCHeaderDescriptor; // GCC #ifdef __ICCARM__ // IAR #pragma pack() // IAR #endif // IAR #endif //#ifndef CDCHEADERDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/CDCLineCoding.c000066400000000000000000000075571207233610700267400ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /* Title: CDCLineCoding About: Purpose Implementation of the CDCLineCoding class. */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "CDCLineCoding.h" #include //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Initializes the bitrate, number of stop bits, parity checking and /// number of data bits of a CDCLineCoding object. /// \param lineCoding Pointer to a CDCLineCoding instance. /// \param bitrate Bitrate of the virtual COM connection. /// \param stopbits Number of stop bits ("CDC LineCoding StopBits"). /// \param parity Parity check type ("CDC LineCoding ParityChecking"). /// \param databits Number of data bits. //------------------------------------------------------------------------------ void CDCLineCoding_Initialize(CDCLineCoding *lineCoding, unsigned int bitrate, unsigned char stopbits, unsigned char parity, unsigned char databits) { ASSERT(stopbits <= CDCLineCoding_TWOSTOPBITS, "CDCLineCoding_Initialize: Invalid stopbits value (%d)\n\r", stopbits); ASSERT(parity <= CDCLineCoding_SPACEPARITY, "CDCLineCoding_Initialize: Invalid parity value (%d)\n\r", parity); ASSERT(((databits >= 5) && (databits <= 8)) || (databits == 16), "CDCLineCoding_Initialize: Invalid databits value (%d)\n\r", databits); lineCoding->dwDTERate = bitrate; lineCoding->bCharFormat = stopbits; lineCoding->bParityType = parity; lineCoding->bDataBits = databits; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/CDCLineCoding.h000066400000000000000000000130531207233610700267310ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Line coding structure used for by the CDC GetLineCoding and SetLineCoding requests. !!!Usage -# Initialize a CDCLineCoding instance using CDCLineCoding_Initialize. -# Send a CDCLineCoding object to the host in response to a GetLineCoding request. -# Receive a CDCLineCoding object from the host after a SetLineCoding request. */ #ifndef CDCLINECODING_H #define CDCLINECODING_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC LineCoding StopBits" /// This page lists Stop Bits for CDC Line Coding. /// /// !Stop bits /// - CDCLineCoding_ONESTOPBIT /// - CDCLineCoding_ONE5STOPBIT /// - CDCLineCoding_TWOSTOPBITS /// The transmission protocol uses one stop bit. #define CDCLineCoding_ONESTOPBIT 0 /// The transmission protocol uses 1.5 stop bit. #define CDCLineCoding_ONE5STOPBIT 1 /// The transmissin protocol uses two stop bits. #define CDCLineCoding_TWOSTOPBITS 2 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC LineCoding ParityCheckings" /// This page lists Parity checkings for CDC Line Coding. /// /// !Parity checking /// - CDCLineCoding_NOPARITY /// - CDCLineCoding_ODDPARITY /// - CDCLineCoding_EVENPARITY /// - CDCLineCoding_MARKPARITY /// - CDCLineCoding_SPACEPARITY /// No parity checking. #define CDCLineCoding_NOPARITY 0 /// Odd parity checking. #define CDCLineCoding_ODDPARITY 1 /// Even parity checking. #define CDCLineCoding_EVENPARITY 2 /// Mark parity checking. #define CDCLineCoding_MARKPARITY 3 /// Space parity checking. #define CDCLineCoding_SPACEPARITY 4 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ #ifdef __ICCARM__ // IAR #pragma pack(1) // IAR #define __attribute__(...) // IAR #endif // IAR //------------------------------------------------------------------------------ /// Format of the data returned when a GetLineCoding request is received. //------------------------------------------------------------------------------ typedef struct { /// Data terminal rate in bits per second. unsigned int dwDTERate; /// Number of stop bits. /// \sa "CDC LineCoding StopBits". char bCharFormat; /// Type of parity checking used. /// \sa "CDC LineCoding ParityCheckings". char bParityType; /// Number of data bits (5, 6, 7, 8 or 16). char bDataBits; } __attribute__ ((packed)) CDCLineCoding; // GCC #ifdef __ICCARM__ // IAR #pragma pack() // IAR #endif // IAR //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern void CDCLineCoding_Initialize(CDCLineCoding *lineCoding, unsigned int bitrate, unsigned char stopbits, unsigned char parity, unsigned char databits); #endif //#ifndef CDCLINECODING_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/CDCSetControlLineStateRequest.c000066400000000000000000000071601207233610700321710ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** CDCSetControlLineStateRequest.c !!!Purpose Implementation of the CDCSetControlLineStateRequest class. */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "CDCSetControlLineStateRequest.h" //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Notifies if the given request indicates that the DTE signal is present. /// \param request Pointer to a USBGenericRequest instance. /// \return 1 if the DTE signal is present, otherwise 0. //------------------------------------------------------------------------------ unsigned char CDCSetControlLineStateRequest_IsDtePresent( const USBGenericRequest *request) { if ((USBGenericRequest_GetValue(request) & 0x0001) != 0) { return 1; } else { return 0; } } //------------------------------------------------------------------------------ /// Notifies if the given request indicates that the device carrier should /// be activated. /// \param request Pointer to a USBGenericRequest instance. /// \return 1 is the device should activate its carrier, 0 otherwise. //------------------------------------------------------------------------------ unsigned char CDCSetControlLineStateRequest_ActivateCarrier( const USBGenericRequest *request) { if ((USBGenericRequest_GetValue(request) & 0x0002) != 0) { return 1; } else { return 0; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/CDCSetControlLineStateRequest.h000066400000000000000000000053461207233610700322020ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of a class for manipulating SetControlLineState requests. */ #ifndef CDCSETCONTROLLINESTATE_H #define CDCSETCONTROLLINESTATE_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern unsigned char CDCSetControlLineStateRequest_IsDtePresent( const USBGenericRequest *request); extern unsigned char CDCSetControlLineStateRequest_ActivateCarrier( const USBGenericRequest *request); #endif //#ifndef CDCSETCONTROLLINESTATE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/cdc/CDCUnionDescriptor.h000066400000000000000000000066041207233610700300510ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of a class for manipulating CDC union descriptors. !!!Usage Should be included in the list of USB descriptor used for a device configuration. */ #ifndef CDCUNIONDESCRIPTOR_H #define CDCUNIONDESCRIPTOR_H //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ #ifdef __ICCARM__ // IAR #pragma pack(1) // IAR #define __attribute__(...) // IAR #endif // IAR //------------------------------------------------------------------------------ /// Describes the relationship between a group of interfaces that can /// be considered to form a functional unit. //------------------------------------------------------------------------------ typedef struct { /// Size of the descriptor in bytes. unsigned char bFunctionLength; /// Descriptor type (CDCDescriptors_INTERFACE). unsigned char bDescriptorType; /// Descriptor subtype (CDCDescriptors_UNION). unsigned char bDescriptorSubtype; /// Number of the master interface for this union. unsigned char bMasterInterface; /// Number of the first slave interface for this union. unsigned char bSlaveInterface0; } __attribute__ ((packed)) CDCUnionDescriptor; // GCC #ifdef __ICCARM__ // IAR #pragma pack() // IAR #endif // IAR #endif //#ifndef CDCUNIONDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/000077500000000000000000000000001207233610700244305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBConfigurationDescriptor.c000066400000000000000000000150721207233610700320210ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /* Title: USBConfigurationDescriptor implementation About: Purpose Implementation of the USBConfigurationDescriptor class. */ //----------------------------------------------------------------------------- // Headers //----------------------------------------------------------------------------- #include "USBConfigurationDescriptor.h" //----------------------------------------------------------------------------- // Exported functions //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /// Returns the total length of a configuration, i.e. including the /// descriptors following it. /// \param configuration Pointer to a USBConfigurationDescriptor instance. /// \return Total length (in bytes) of the configuration. //----------------------------------------------------------------------------- unsigned int USBConfigurationDescriptor_GetTotalLength( const USBConfigurationDescriptor *config) { return config->wTotalLength; } //----------------------------------------------------------------------------- /// Returns the number of interfaces in a configuration. /// \param configuration Pointer to a USBConfigurationDescriptor instance. /// \return Number of interfaces in configuration. //----------------------------------------------------------------------------- unsigned char USBConfigurationDescriptor_GetNumInterfaces( const USBConfigurationDescriptor *config) { return config->bNumInterfaces; } //----------------------------------------------------------------------------- /// Indicates if the device is self-powered when in a given configuration. /// \param configuration Pointer to a USBConfigurationDescriptor instance. /// \return 1 if the device is self-powered when in the given configuration; /// otherwise 0. //----------------------------------------------------------------------------- unsigned char USBConfigurationDescriptor_IsSelfPowered( const USBConfigurationDescriptor *config) { if ((config->bmAttributes & (1 << 6)) != 0) { return 1; } else { return 0; } } //----------------------------------------------------------------------------- /// Parses the given Configuration descriptor (followed by relevant /// interface, endpoint and class-specific descriptors) into three arrays. /// *Each array must have its size equal or greater to the number of /// descriptors it stores plus one*. A null-value is inserted after the last /// descriptor of each type to indicate the array end. /// /// Note that if the pointer to an array is null (0), nothing is stored in /// it. /// \param configuration Pointer to the start of the whole Configuration /// descriptor. /// \param interfaces Pointer to the Interface descriptor array. /// \param epoints Pointer to the Endpoint descriptor array. /// \param others Pointer to the class-specific descriptor array. //----------------------------------------------------------------------------- void USBConfigurationDescriptor_Parse( const USBConfigurationDescriptor *config, USBInterfaceDescriptor **interfaces, USBEndpointDescriptor **epoints, USBGenericDescriptor **others) { int size; USBGenericDescriptor *descriptor; // Get size of configuration to parse size = USBConfigurationDescriptor_GetTotalLength(config); size -= sizeof(USBConfigurationDescriptor); // Start parsing descriptors descriptor = (USBGenericDescriptor *) config; while (size > 0) { // Get next descriptor descriptor = USBGenericDescriptor_GetNextDescriptor(descriptor); size -= USBGenericDescriptor_GetLength(descriptor); // Store descriptor in correponding array if (USBGenericDescriptor_GetType(descriptor) == USBGenericDescriptor_INTERFACE) { if (interfaces) { *interfaces = (USBInterfaceDescriptor *) descriptor; interfaces++; } } else if (USBGenericDescriptor_GetType(descriptor) == USBGenericDescriptor_ENDPOINT) { if (epoints) { *epoints = (USBEndpointDescriptor *) descriptor; epoints++; } } else if (others) { *others = descriptor; others++; } } // Null-terminate arrays if (interfaces) { *interfaces = 0; } if (epoints) { *epoints = 0; } if (others) { *others = 0; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBConfigurationDescriptor.h000066400000000000000000000151551207233610700320300ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definitions and methods for USB configuration descriptor structures described by the USB specification. !!!Usage -# Declare USBConfigurationDescriptor instance as a part of the configuration descriptors of a USB device. -# To get useful information (field values) from the defined USB device configuration descriptor, use - USBConfigurationDescriptor_GetTotalLength - USBConfigurationDescriptor_GetNumInterfaces - USBConfigurationDescriptor_IsSelfPowered -# To pase the defined USB device configuration descriptor, use - USBConfigurationDescriptor_Parse */ #ifndef USBCONFIGURATIONDESCRIPTOR_H #define USBCONFIGURATIONDESCRIPTOR_H //----------------------------------------------------------------------------- // Headers //----------------------------------------------------------------------------- #include "USBGenericDescriptor.h" #include "USBInterfaceDescriptor.h" #include "USBEndpointDescriptor.h" //----------------------------------------------------------------------------- // Definitions //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /// \page "USB device Attributes" /// /// This page lists the codes of the usb attributes. /// /// !Attributes /// - USBConfigurationDescriptor_BUSPOWERED_NORWAKEUP /// - USBConfigurationDescriptor_SELFPOWERED_NORWAKEUP /// - USBConfigurationDescriptor_BUSPOWERED_RWAKEUP /// - USBConfigurationDescriptor_SELFPOWERED_RWAKEUP /// - USBConfigurationDescriptor_POWER /// Device is bus-powered and not support remote wake-up. #define USBConfigurationDescriptor_BUSPOWERED_NORWAKEUP 0x80 /// Device is self-powered and not support remote wake-up. #define USBConfigurationDescriptor_SELFPOWERED_NORWAKEUP 0xC0 /// Device is bus-powered and supports remote wake-up. #define USBConfigurationDescriptor_BUSPOWERED_RWAKEUP 0xA0 /// Device is self-powered and supports remote wake-up. #define USBConfigurationDescriptor_SELFPOWERED_RWAKEUP 0xE0 /// Calculates the value of the power consumption field given the value in mA. /// \param power The power consumption value in mA /// \return The value that should be set to the field in descriptor #define USBConfigurationDescriptor_POWER(power) (power / 2) //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Types //----------------------------------------------------------------------------- #ifdef __ICCARM__ // IAR #pragma pack(1) // IAR #define __attribute__(...) // IAR #endif // IAR //----------------------------------------------------------------------------- /// USB standard configuration descriptor structure. //----------------------------------------------------------------------------- typedef struct { /// Size of the descriptor in bytes. unsigned char bLength; /// Descriptor type (USBDESC_CONFIGURATION of "USB Descriptor types"). unsigned char bDescriptorType; /// Length of all descriptors returned along with this configuration /// descriptor. unsigned short wTotalLength; /// Number of interfaces in this configuration. unsigned char bNumInterfaces; /// Value for selecting this configuration. unsigned char bConfigurationValue; /// Index of the configuration string descriptor. unsigned char iConfiguration; /// Configuration characteristics. unsigned char bmAttributes; /// Maximum power consumption of the device when in this configuration. unsigned char bMaxPower; } __attribute__ ((packed)) USBConfigurationDescriptor; // GCC #ifdef __ICCARM__ // IAR #pragma pack() // IAR #endif // IAR //----------------------------------------------------------------------------- // Exported functions //----------------------------------------------------------------------------- extern unsigned int USBConfigurationDescriptor_GetTotalLength( const USBConfigurationDescriptor *config); extern unsigned char USBConfigurationDescriptor_GetNumInterfaces( const USBConfigurationDescriptor *config); extern unsigned char USBConfigurationDescriptor_IsSelfPowered( const USBConfigurationDescriptor *config); extern void USBConfigurationDescriptor_Parse( const USBConfigurationDescriptor *config, USBInterfaceDescriptor **interfaces, USBEndpointDescriptor **endpoints, USBGenericDescriptor **others); #endif //#ifndef USBCONFIGURATIONDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBDeviceDescriptor.h000066400000000000000000000115421207233610700304140ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Class for manipulating USB device descriptors. !!!Usage - Declare a USBDeviceDescriptor instance as the device descriptor of a USB device. */ #ifndef USBDEVICEDESCRIPTOR_H #define USBDEVICEDESCRIPTOR_H #include //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB release numbers" /// /// This page lists the codes of USB release numbers. /// /// !Code /// - USBDeviceDescriptor_USB2_00 /// The device supports USB 2.00. #define USBDeviceDescriptor_USB2_00 0x0200 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ #ifdef __ICCARM__ // IAR #pragma pack(1) // IAR #define __attribute__(...) // IAR #endif // IAR //------------------------------------------------------------------------------ /// USB standard device descriptor structure. //------------------------------------------------------------------------------ typedef struct { /// Size of this descriptor in bytes. unsigned char bLength; /// Descriptor type (USBGenericDescriptor_DEVICE). unsigned char bDescriptorType; /// USB specification release number in BCD format. unsigned short bcdUSB; /// Device class code. unsigned char bDeviceClass; /// Device subclass code. unsigned char bDeviceSubClass; /// Device protocol code. unsigned char bDeviceProtocol; /// Maximum packet size of endpoint 0 (in bytes). unsigned char bMaxPacketSize0; /// Vendor ID. unsigned short idVendor; /// Product ID. unsigned short idProduct; /// Device release number in BCD format. unsigned short bcdDevice; /// Index of the manufacturer string descriptor. unsigned char iManufacturer; /// Index of the product string descriptor. unsigned char iProduct; /// Index of the serial number string descriptor. unsigned char iSerialNumber; /// Number of possible configurations for the device. unsigned char bNumConfigurations; } __attribute__ ((packed)) USBDeviceDescriptor; // GCC #if defined(BOARD_USB_OTGHS) typedef struct { /// Size of this descriptor in bytes. unsigned char bLength; /// Descriptor type (USBGenericDescriptor_OTG). unsigned char bDescriptorType; /// Attribute Fields D72: Reserved D1: HNP support D0: SRP support unsigned char bmAttributes; } __attribute__ ((packed)) USBOtgDescriptor; // GCC #endif #ifdef __ICCARM__ // IAR #pragma pack() // IAR #endif // IAR #endif //#ifndef USBDEVICEDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBDeviceQualifierDescriptor.h000066400000000000000000000074511207233610700322620ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Class for manipulating USB device qualifier descriptors. !!!Usage - Declare a USBDeviceQualifierDescriptor instance as the device qualifier descriptor of a USB device. */ #ifndef USBDEVICEQUALIFIERDESCRIPTOR_H #define USBDEVICEQUALIFIERDESCRIPTOR_H //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ #ifdef __ICCARM__ // IAR #pragma pack(1) // IAR #define __attribute__(...) // IAR #endif // IAR //------------------------------------------------------------------------------ /// Alternate device descriptor indicating the capabilities of the device /// in full-speed, if currently in high-speed; or in high-speed, if it is /// currently in full-speed. Only relevant for devices supporting the /// high-speed mode. //------------------------------------------------------------------------------ typedef struct { /// Size of the descriptor in bytes. unsigned char bLength; /// Descriptor type (USBDESC_DEVICE_QUALIFIER or "USB device types"). unsigned char bDescriptorType; /// USB specification release number (in BCD format). unsigned short bcdUSB; /// Device class code. unsigned char bDeviceClass; /// Device subclass code. unsigned char bDeviceSubClass; /// Device protocol code. unsigned char bDeviceProtocol; /// Maximum packet size of endpoint 0. unsigned char bMaxPacketSize0; /// Number of possible configurations for the device. unsigned char bNumConfigurations; /// Reserved. unsigned char bReserved; } __attribute__ ((packed)) USBDeviceQualifierDescriptor; // GCC #ifdef __ICCARM__ // IAR #pragma pack() // IAR #endif // IAR #endif //#ifndef USBDEVICEQUALIFIERDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBEndpointDescriptor.c000066400000000000000000000116711207233610700307730ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /* Title: USBEndpointDescriptor implementation About: Purpose Implementation of the USBEndpointDescriptor class. */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBEndpointDescriptor.h" //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Returns the number of an endpoint given its descriptor. /// \param endpoint Pointer to a USBEndpointDescriptor instance. /// \return Endpoint number. //------------------------------------------------------------------------------ unsigned char USBEndpointDescriptor_GetNumber( const USBEndpointDescriptor *endpoint) { return endpoint->bEndpointAddress & 0xF; } //------------------------------------------------------------------------------ /// Returns the direction of an endpoint given its descriptor. /// \param endpoint Pointer to a USBEndpointDescriptor instance. /// \return Endpoint direction (see ). //------------------------------------------------------------------------------ unsigned char USBEndpointDescriptor_GetDirection( const USBEndpointDescriptor *endpoint) { if ((endpoint->bEndpointAddress & 0x80) != 0) { return USBEndpointDescriptor_IN; } else { return USBEndpointDescriptor_OUT; } } //------------------------------------------------------------------------------ /// Returns the type of an endpoint given its descriptor. /// \param endpoint Pointer to a USBEndpointDescriptor instance. /// \return Endpoint type (see ). //------------------------------------------------------------------------------ unsigned char USBEndpointDescriptor_GetType( const USBEndpointDescriptor *endpoint) { return endpoint->bmAttributes & 0x3; } //------------------------------------------------------------------------------ /// Returns the maximum size of a packet (in bytes) on an endpoint given /// its descriptor. /// \param endpoint - Pointer to a USBEndpointDescriptor instance. /// \return Maximum packet size of endpoint. //------------------------------------------------------------------------------ unsigned short USBEndpointDescriptor_GetMaxPacketSize( const USBEndpointDescriptor *endpoint) { return endpoint->wMaxPacketSize; } //------------------------------------------------------------------------------ /// Returns the polling interval on an endpoint given its descriptor. /// \param endpoint - Pointer to a USBEndpointDescriptor instance. /// \return Polling interval of endpoint. //------------------------------------------------------------------------------ unsigned char USBEndpointDescriptor_GetInterval( const USBEndpointDescriptor *endpoint) { return endpoint->bInterval; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBEndpointDescriptor.h000066400000000000000000000223421207233610700307750ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of a class for handling USB endpoint descriptors. !!!Usage -# Declare USBEndpointDescriptor instance as a part of the configuration descriptors of a USB device. -# To get useful information (field values) from the defined USB device endpoint descriptor (to configure hardware for endpoints, etc), use - USBEndpointDescriptor_GetNumber - USBEndpointDescriptor_GetDirection - USBEndpointDescriptor_GetType - USBEndpointDescriptor_GetMaxPacketSize */ #ifndef USBENDPOINTDESCRIPTOR_H #define USBENDPOINTDESCRIPTOR_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB Endpoint definitions" /// /// This page lists definitions and macro for endpoint descriptors. /// /// - USB Endpoint directions /// - USBEndpointDescriptor_OUT /// - USBEndpointDescriptor_IN /// /// - USB Endpoint types /// - USBEndpointDescriptor_CONTROL /// - USBEndpointDescriptor_ISOCHRONOUS /// - USBEndpointDescriptor_BULK /// - USBEndpointDescriptor_INTERRUPT /// /// - USB Endpoint maximun sizes /// - USBEndpointDescriptor_MAXCTRLSIZE_FS /// - USBEndpointDescriptor_MAXCTRLSIZE_HS /// - USBEndpointDescriptor_MAXBULKSIZE_FS /// - USBEndpointDescriptor_MAXBULKSIZE_HS /// - USBEndpointDescriptor_MAXINTERRUPTSIZE_FS /// - USBEndpointDescriptor_MAXINTERRUPTSIZE_HS /// - USBEndpointDescriptor_MAXISOCHRONOUSSIZE_FS /// - USBEndpointDescriptor_MAXISOCHRONOUSSIZE_HS /// /// - USB Endpoint address define /// - USBEndpointDescriptor_ADDRESS //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB Endpoint directions" /// /// This page lists definitions of USB endpoint directions. /// /// !Directions /// - USBEndpointDescriptor_OUT /// - USBEndpointDescriptor_IN /// Endpoint receives data from the host. #define USBEndpointDescriptor_OUT 0 /// Endpoint sends data to the host. #define USBEndpointDescriptor_IN 1 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB Endpoint types" /// /// This page lists definitions of USB endpoint types. /// /// !Types /// - USBEndpointDescriptor_CONTROL /// - USBEndpointDescriptor_ISOCHRONOUS /// - USBEndpointDescriptor_BULK /// - USBEndpointDescriptor_INTERRUPT /// Control endpoint type. #define USBEndpointDescriptor_CONTROL 0 /// Isochronous endpoint type. #define USBEndpointDescriptor_ISOCHRONOUS 1 /// Bulk endpoint type. #define USBEndpointDescriptor_BULK 2 /// Interrupt endpoint type. #define USBEndpointDescriptor_INTERRUPT 3 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB Endpoint maximun sizes" /// /// This page lists definitions of USB endpoint maximun sizes. /// /// !Sizes /// - USBEndpointDescriptor_MAXCTRLSIZE_FS /// - USBEndpointDescriptor_MAXCTRLSIZE_HS /// - USBEndpointDescriptor_MAXBULKSIZE_FS /// - USBEndpointDescriptor_MAXBULKSIZE_HS /// - USBEndpointDescriptor_MAXINTERRUPTSIZE_FS /// - USBEndpointDescriptor_MAXINTERRUPTSIZE_HS /// - USBEndpointDescriptor_MAXISOCHRONOUSSIZE_FS /// - USBEndpointDescriptor_MAXISOCHRONOUSSIZE_HS /// Maximum size for a full-speed control endpoint. #define USBEndpointDescriptor_MAXCTRLSIZE_FS 64 /// Maximum size for a high-speed control endpoint. #define USBEndpointDescriptor_MAXCTRLSIZE_HS 64 /// Maximum size for a full-speed bulk endpoint. #define USBEndpointDescriptor_MAXBULKSIZE_FS 64 /// Maximum size for a high-speed bulk endpoint. #define USBEndpointDescriptor_MAXBULKSIZE_HS 512 /// Maximum size for a full-speed interrupt endpoint. #define USBEndpointDescriptor_MAXINTERRUPTSIZE_FS 64 /// Maximum size for a high-speed interrupt endpoint. #define USBEndpointDescriptor_MAXINTERRUPTSIZE_HS 1024 /// Maximum size for a full-speed isochronous endpoint. #define USBEndpointDescriptor_MAXISOCHRONOUSSIZE_FS 1023 /// Maximum size for a high-speed isochronous endpoint. #define USBEndpointDescriptor_MAXISOCHRONOUSSIZE_HS 1024 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB Endpoint address define" /// /// This page lists macro for USB endpoint address definition. /// /// !Macro /// - USBEndpointDescriptor_ADDRESS /// Calculates the address of an endpoint given its number and direction /// \param direction USB endpoint direction definition /// \param number USB endpoint number /// \return The value used to set the endpoint descriptor based on input number /// and direction #define USBEndpointDescriptor_ADDRESS(direction, number) \ (((direction & 0x01) << 7) | (number & 0xF)) //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ #ifdef __ICCARM__ // IAR #pragma pack(1) // IAR #define __attribute__(...) // IAR #endif // IAR //------------------------------------------------------------------------------ /// USB standard endpoint descriptor structure. //------------------------------------------------------------------------------ typedef struct { /// Size of the descriptor in bytes. unsigned char bLength; /// Descriptor type (). unsigned char bDescriptorType; /// Address and direction of the endpoint. unsigned char bEndpointAddress; /// Endpoint type and additional characteristics (for isochronous endpoints). unsigned char bmAttributes; /// Maximum packet size (in bytes) of the endpoint. unsigned short wMaxPacketSize; /// Polling rate of the endpoint. unsigned char bInterval; } __attribute__ ((packed)) USBEndpointDescriptor; // GCC #ifdef __ICCARM__ // IAR #pragma pack() // IAR #endif // IAR //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern unsigned char USBEndpointDescriptor_GetNumber( const USBEndpointDescriptor *endpoint); extern unsigned char USBEndpointDescriptor_GetDirection( const USBEndpointDescriptor *endpoint); extern unsigned char USBEndpointDescriptor_GetType( const USBEndpointDescriptor *endpoint); extern unsigned short USBEndpointDescriptor_GetMaxPacketSize( const USBEndpointDescriptor *endpoint); extern unsigned char USBEndpointDescriptor_GetInterval( const USBEndpointDescriptor *endpoint); #endif //#ifndef USBENDPOINTDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBFeatureRequest.c000066400000000000000000000066071207233610700301230ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /* Title: USBFeatureRequest implementation About: Purpose Implementation of the USBFeatureRequest class. */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBFeatureRequest.h" //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Returns the feature selector of a given CLEAR_FEATURE or SET_FEATURE /// request. /// \param request Pointer to a USBGenericRequest instance. /// \return Feature selector. //------------------------------------------------------------------------------ unsigned char USBFeatureRequest_GetFeatureSelector( const USBGenericRequest *request) { return USBGenericRequest_GetValue(request); } //------------------------------------------------------------------------------ /// Indicates the test that the device must undertake following a /// SET_FEATURE request. /// \param request Pointer to a USBGenericRequest instance. /// \return Test selector. //------------------------------------------------------------------------------ unsigned char USBFeatureRequest_GetTestSelector( const USBGenericRequest *request) { return (USBGenericRequest_GetIndex(request) >> 8) & 0xFF; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBFeatureRequest.h000066400000000000000000000135511207233610700301240ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of a class for manipulating CLEAR_FEATURE and SET_FEATURE requests. !!!Usage - To get USB feature request information (field values) from the USBGenericRequest instance, use - USBFeatureRequest_GetFeatureSelector - USBFeatureRequest_GetTestSelector */ #ifndef USBFEATUREREQUEST_H #define USBFEATUREREQUEST_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBGenericRequest.h" //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB Feature Request definitions" /// /// This page lists codes of USB Feature Request /// /// - USB Feature selectors /// - USBFeatureRequest_ENDPOINTHALT /// - USBFeatureRequest_DEVICEREMOTEWAKEUP /// - USBFeatureRequest_TESTMODE /// /// - USB Test mode selectors /// - USBFeatureRequest_TESTJ /// - USBFeatureRequest_TESTK /// - USBFeatureRequest_TESTSE0NAK /// - USBFeatureRequest_TESTPACKET /// - USBFeatureRequest_TESTFORCEENABLE /// - USBFeatureRequest_TESTSENDZLP //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB Feature selectors" /// /// This page lists codes of USB feature selectors. /// /// !Selectors /// - USBFeatureRequest_ENDPOINTHALT /// - USBFeatureRequest_DEVICEREMOTEWAKEUP /// - USBFeatureRequest_TESTMODE /// Halt feature of an endpoint. #define USBFeatureRequest_ENDPOINTHALT 0 /// Remote wake-up feature of the device. #define USBFeatureRequest_DEVICEREMOTEWAKEUP 1 /// Test mode of the device. #define USBFeatureRequest_TESTMODE 2 /// OTG set feature #define USBFeatureRequest_OTG 0x0B //------------------------------------------------------------------------------ /// On The Go Feature Selectors /// b_hnp_enable 3 /// a_hnp_support 4 /// a_alt_hnp_support 5 #define USBFeatureRequest_OTG_B_HNP_ENABLE 3 #define USBFeatureRequest_OTG_A_HNP_SUPPORT 4 #define USBFeatureRequest_OTG_A_ALT_HNP_SUPPORT 5 //------------------------------------------------------------------------------ /// \page "USB Test mode selectors" /// /// This page lists codes of USB high speed test mode selectors. /// /// !Selectors /// - USBFeatureRequest_TESTJ /// - USBFeatureRequest_TESTK /// - USBFeatureRequest_TESTSE0NAK /// - USBFeatureRequest_TESTPACKET /// - USBFeatureRequest_TESTFORCEENABLE /// - USBFeatureRequest_TESTSENDZLP /// Tests the high-output drive level on the D+ line. #define USBFeatureRequest_TESTJ 1 /// Tests the high-output drive level on the D- line. #define USBFeatureRequest_TESTK 2 /// Tests the output impedance, low-level output voltage and loading /// characteristics. #define USBFeatureRequest_TESTSE0NAK 3 /// Tests rise and fall times, eye patterns and jitter. #define USBFeatureRequest_TESTPACKET 4 /// Tests the hub disconnect detection. #define USBFeatureRequest_TESTFORCEENABLE 5 /// Send a ZLP in Test Mode. #define USBFeatureRequest_TESTSENDZLP 6 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern unsigned char USBFeatureRequest_GetFeatureSelector( const USBGenericRequest *request); extern unsigned char USBFeatureRequest_GetTestSelector( const USBGenericRequest *request); #endif //#ifndef USBFEATUREREQUEST_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBGenericDescriptor.c000066400000000000000000000076211207233610700305670ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /* Title: USBGenericDescriptor implementation About: Purpose Implementation of the USBGenericDescriptor class. */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBGenericDescriptor.h" //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Returns the length of a descriptor. /// \param descriptor Pointer to a USBGenericDescriptor instance. /// \return Length of descriptor in bytes. //------------------------------------------------------------------------------ unsigned int USBGenericDescriptor_GetLength( const USBGenericDescriptor *descriptor) { return descriptor->bLength; } //------------------------------------------------------------------------------ /// Returns the type of a descriptor. /// \param descriptor Pointer to a USBGenericDescriptor instance. /// \return Type of descriptor. //------------------------------------------------------------------------------ unsigned char USBGenericDescriptor_GetType( const USBGenericDescriptor *descriptor) { return descriptor->bDescriptorType; } //------------------------------------------------------------------------------ /// Returns a pointer to the descriptor right after the given one, when /// parsing a Configuration descriptor. /// \param descriptor - Pointer to a USBGenericDescriptor instance. /// \return Pointer to the next descriptor. //------------------------------------------------------------------------------ USBGenericDescriptor *USBGenericDescriptor_GetNextDescriptor( const USBGenericDescriptor *descriptor) { return (USBGenericDescriptor *) (((char *) descriptor) + USBGenericDescriptor_GetLength(descriptor)); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBGenericDescriptor.h000066400000000000000000000132411207233610700305670ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !!!Purpose /// /// Definition of a generic USB descriptor class. /// /// !!!Usage /// /// -# Declare or access USB descriptors by USBGenericDescriptor instance. /// -# To get usful information (field values) from the USB descriptors, use /// - USBGenericDescriptor_GetLength /// - USBGenericDescriptor_GetType /// -# To scan the descriptors, use /// - USBGenericDescriptor_GetNextDescriptor //------------------------------------------------------------------------------ #ifndef USBGENERICDESCRIPTOR_H #define USBGENERICDESCRIPTOR_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB Descriptor types" /// /// This page lists the codes of the usb descriptor types /// /// !Types /// - USBGenericDescriptor_DEVICE /// - USBGenericDescriptor_CONFIGURATION /// - USBGenericDescriptor_STRING /// - USBGenericDescriptor_INTERFACE /// - USBGenericDescriptor_ENDPOINT /// - USBGenericDescriptor_DEVICEQUALIFIER /// - USBGenericDescriptor_OTHERSPEEDCONFIGURATION /// - USBGenericDescriptor_INTERFACEPOWER /// - USBGenericDescriptor_OTG /// - USBGenericDescriptor_DEBUG /// - USBGenericDescriptor_INTERFACEASSOCIATION /// Device descriptor type. #define USBGenericDescriptor_DEVICE 1 /// Configuration descriptor type. #define USBGenericDescriptor_CONFIGURATION 2 /// String descriptor type. #define USBGenericDescriptor_STRING 3 /// Interface descriptor type. #define USBGenericDescriptor_INTERFACE 4 /// Endpoint descriptor type. #define USBGenericDescriptor_ENDPOINT 5 /// Device qualifier descriptor type. #define USBGenericDescriptor_DEVICEQUALIFIER 6 /// Other speed configuration descriptor type. #define USBGenericDescriptor_OTHERSPEEDCONFIGURATION 7 /// Interface power descriptor type. #define USBGenericDescriptor_INTERFACEPOWER 8 /// On-The-Go descriptor type. #define USBGenericDescriptor_OTG 9 /// Debug descriptor type. #define USBGenericDescriptor_DEBUG 10 /// Interface association descriptor type. #define USBGenericDescriptor_INTERFACEASSOCIATION 11 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ #ifdef __ICCARM__ // IAR #pragma pack(1) // IAR #define __attribute__(...) // IAR #endif // IAR /// Holds the few fields shared by all USB descriptors. typedef struct { /// Length of the descriptor in bytes. unsigned char bLength; /// Descriptor type. unsigned char bDescriptorType; } __attribute__ ((packed)) USBGenericDescriptor; // GCC #ifdef __ICCARM__ // IAR #pragma pack() // IAR #endif // IAR //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern unsigned int USBGenericDescriptor_GetLength( const USBGenericDescriptor *descriptor); extern unsigned char USBGenericDescriptor_GetType( const USBGenericDescriptor *descriptor); extern USBGenericDescriptor *USBGenericDescriptor_GetNextDescriptor( const USBGenericDescriptor *descriptor); #endif //#ifndef USBGENERICDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBGenericRequest.c000066400000000000000000000143071207233610700301000ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /* Title: USBGenericRequest implementation About: Purpose Implementation of the USBGenericRequest class. */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBGenericRequest.h" //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Returns the type of the given request. /// \param request Pointer to a USBGenericRequest instance. /// \return "USB Request Types" //------------------------------------------------------------------------------ extern unsigned char USBGenericRequest_GetType(const USBGenericRequest *request) { return ((request->bmRequestType >> 5) & 0x3); } //------------------------------------------------------------------------------ /// Returns the request code of the given request. /// \param request Pointer to a USBGenericRequest instance. /// \return Request code. /// \sa "USB Request Codes" //------------------------------------------------------------------------------ unsigned char USBGenericRequest_GetRequest(const USBGenericRequest *request) { return request->bRequest; } //------------------------------------------------------------------------------ /// Returns the wValue field of the given request. /// \param request - Pointer to a USBGenericRequest instance. /// \return Request value. //------------------------------------------------------------------------------ unsigned short USBGenericRequest_GetValue(const USBGenericRequest *request) { return request->wValue; } //------------------------------------------------------------------------------ /// Returns the wIndex field of the given request. /// \param request Pointer to a USBGenericRequest instance. /// \return Request index; //------------------------------------------------------------------------------ unsigned short USBGenericRequest_GetIndex(const USBGenericRequest *request) { return request->wIndex; } //------------------------------------------------------------------------------ /// Returns the expected length of the data phase following a request. /// \param request Pointer to a USBGenericRequest instance. /// \return Length of data phase. //------------------------------------------------------------------------------ unsigned short USBGenericRequest_GetLength(const USBGenericRequest *request) { return request->wLength; } //------------------------------------------------------------------------------ /// Returns the endpoint number targetted by a given request. /// \param request Pointer to a USBGenericRequest instance. /// \return Endpoint number. //------------------------------------------------------------------------------ unsigned char USBGenericRequest_GetEndpointNumber( const USBGenericRequest *request) { return USBGenericRequest_GetIndex(request) & 0xF; } //------------------------------------------------------------------------------ /// Returns the intended recipient of a given request. /// \param request Pointer to a USBGenericRequest instance. /// \return Request recipient. /// \sa "USB Request Recipients" //------------------------------------------------------------------------------ unsigned char USBGenericRequest_GetRecipient(const USBGenericRequest *request) { // Recipient is in bits [0..4] of the bmRequestType field return request->bmRequestType & 0xF; } //------------------------------------------------------------------------------ /// Returns the direction of the data transfer following the given request. /// \param request Pointer to a USBGenericRequest instance. /// \return Transfer direction. /// \sa "USB Request Directions" //------------------------------------------------------------------------------ unsigned char USBGenericRequest_GetDirection(const USBGenericRequest *request) { // Transfer direction is located in bit D7 of the bmRequestType field if ((request->bmRequestType & 0x80) != 0) { return USBGenericRequest_IN; } else { return USBGenericRequest_OUT; } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBGenericRequest.h000066400000000000000000000222341207233610700301030ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of the USBGenericRequest class and its methods. !!!Usage -# Declare or access USB requests by USBGenericRequest instance. -# To get usful information (field values) from the USB requests, use - USBGenericRequest_GetType - USBGenericRequest_GetRequest - USBGenericRequest_GetValue - USBGenericRequest_GetIndex - USBGenericRequest_GetLength - USBGenericRequest_GetEndpointNumber - USBGenericRequest_GetRecipient - USBGenericRequest_GetDirection */ #ifndef USBGENERICREQUEST_H #define USBGENERICREQUEST_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB Generic Request definitions" /// /// This page lists the codes of USB generic request. /// /// - USB Request codes /// - USBGenericRequest_GETSTATUS /// - USBGenericRequest_CLEARFEATURE /// - USBGenericRequest_SETFEATURE /// - USBGenericRequest_SETADDRESS /// - USBGenericRequest_GETDESCRIPTOR /// - USBGenericRequest_SETDESCRIPTOR /// - USBGenericRequest_GETCONFIGURATION /// - USBGenericRequest_SETCONFIGURATION /// - USBGenericRequest_GETINTERFACE /// - USBGenericRequest_SETINTERFACE /// - USBGenericRequest_SYNCHFRAME /// /// - USB Request Recipients /// - USBGenericRequest_DEVICE /// - USBGenericRequest_INTERFACE /// - USBGenericRequest_ENDPOINT /// - USBGenericRequest_OTHER /// /// - USB Request Types /// - USBGenericRequest_STANDARD /// - USBGenericRequest_CLASS /// - USBGenericRequest_VENDOR /// /// - USB Request Directions /// - USBGenericRequest_IN /// - USBGenericRequest_OUT //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB Request codes" /// /// This page lists the USB generic request codes. /// /// !Codes /// - USBGenericRequest_GETSTATUS /// - USBGenericRequest_CLEARFEATURE /// - USBGenericRequest_SETFEATURE /// - USBGenericRequest_SETADDRESS /// - USBGenericRequest_GETDESCRIPTOR /// - USBGenericRequest_SETDESCRIPTOR /// - USBGenericRequest_GETCONFIGURATION /// - USBGenericRequest_SETCONFIGURATION /// - USBGenericRequest_GETINTERFACE /// - USBGenericRequest_SETINTERFACE /// - USBGenericRequest_SYNCHFRAME /// GET_STATUS request code. #define USBGenericRequest_GETSTATUS 0 /// CLEAR_FEATURE request code. #define USBGenericRequest_CLEARFEATURE 1 /// SET_FEATURE request code. #define USBGenericRequest_SETFEATURE 3 /// SET_ADDRESS request code. #define USBGenericRequest_SETADDRESS 5 /// GET_DESCRIPTOR request code. #define USBGenericRequest_GETDESCRIPTOR 6 /// SET_DESCRIPTOR request code. #define USBGenericRequest_SETDESCRIPTOR 7 /// GET_CONFIGURATION request code. #define USBGenericRequest_GETCONFIGURATION 8 /// SET_CONFIGURATION request code. #define USBGenericRequest_SETCONFIGURATION 9 /// GET_INTERFACE request code. #define USBGenericRequest_GETINTERFACE 10 /// SET_INTERFACE request code. #define USBGenericRequest_SETINTERFACE 11 /// SYNCH_FRAME request code. #define USBGenericRequest_SYNCHFRAME 12 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB Request Recipients" /// /// This page lists codes of USB request recipients. /// /// !Recipients /// - USBGenericRequest_DEVICE /// - USBGenericRequest_INTERFACE /// - USBGenericRequest_ENDPOINT /// - USBGenericRequest_OTHER /// Recipient is the whole device. #define USBGenericRequest_DEVICE 0 /// Recipient is an interface. #define USBGenericRequest_INTERFACE 1 /// Recipient is an endpoint. #define USBGenericRequest_ENDPOINT 2 /// Recipient is another entity. #define USBGenericRequest_OTHER 3 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB Request Types" /// /// This page lists codes of USB request types. /// /// !Types /// - USBGenericRequest_STANDARD /// - USBGenericRequest_CLASS /// - USBGenericRequest_VENDOR /// Request is standard. #define USBGenericRequest_STANDARD 0 /// Request is class-specific. #define USBGenericRequest_CLASS 1 /// Request is vendor-specific. #define USBGenericRequest_VENDOR 2 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB Request Directions" /// /// This page lists codes of USB request directions. /// /// !Directions /// - USBGenericRequest_IN /// - USBGenericRequest_OUT /// Transfer occurs from device to the host. #define USBGenericRequest_OUT 0 /// Transfer occurs from the host to the device. #define USBGenericRequest_IN 1 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Generic USB SETUP request sent over Control endpoints. //------------------------------------------------------------------------------ typedef struct { /// Type of request /// \sa "USB Request Recipients" /// \sa "USB Request Types" /// \sa "USB Request Directions" unsigned char bmRequestType:8; /// Request code /// \sa "USB Request Codes" unsigned char bRequest:8; /// Request-specific value parameter. unsigned short wValue:16; /// Request-specific index parameter. unsigned short wIndex:16; /// Expected length (in bytes) of the data phase. unsigned short wLength:16; } USBGenericRequest; //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern unsigned char USBGenericRequest_GetType( const USBGenericRequest *request); extern unsigned char USBGenericRequest_GetRequest( const USBGenericRequest *request); extern unsigned short USBGenericRequest_GetValue( const USBGenericRequest *request); extern unsigned short USBGenericRequest_GetIndex( const USBGenericRequest *request); extern unsigned short USBGenericRequest_GetLength( const USBGenericRequest *request); extern unsigned char USBGenericRequest_GetEndpointNumber( const USBGenericRequest *request); extern unsigned char USBGenericRequest_GetRecipient( const USBGenericRequest *request); extern unsigned char USBGenericRequest_GetDirection( const USBGenericRequest *request); #endif //#ifndef USBGENERICREQUEST_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBGetDescriptorRequest.c000066400000000000000000000072231207233610700313010ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /* Title: USBGetDescriptorRequest implementation About: Purpose Implementation of the USBGetDescriptorRequest class. */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBGetDescriptorRequest.h" //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Returns the type of the descriptor requested by the host given the /// corresponding GET_DESCRIPTOR request. /// \param request Pointer to a USBGenericDescriptor instance. /// \return Type of the requested descriptor. //------------------------------------------------------------------------------ unsigned char USBGetDescriptorRequest_GetDescriptorType( const USBGenericRequest *request) { // Requested descriptor type is in the high-byte of the wValue field return (USBGenericRequest_GetValue(request) >> 8) & 0xFF; } //------------------------------------------------------------------------------ /// Returns the index of the requested descriptor, given the corresponding /// GET_DESCRIPTOR request. /// \param request Pointer to a USBGenericDescriptor instance. /// \return Index of the requested descriptor. //------------------------------------------------------------------------------ unsigned char USBGetDescriptorRequest_GetDescriptorIndex( const USBGenericRequest *request) { // Requested descriptor index if in the low byte of the wValue field return USBGenericRequest_GetValue(request) & 0xFF; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBGetDescriptorRequest.h000066400000000000000000000057631207233610700313150ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of the USBGetDescriptorRequest class. !!!Usage - After a GET_DESCRIPTOR request has been received, retrive the useful values with following functions: - USBGetDescriptorRequest_GetDescriptorType: the descriptor type - USBGetDescriptorRequest_GetDescriptorIndex: the index of the requested descriptor */ #ifndef USBGETDESCRIPTORREQUEST_H #define USBGETDESCRIPTORREQUEST_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBGenericRequest.h" //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern unsigned char USBGetDescriptorRequest_GetDescriptorType( const USBGenericRequest *request); extern unsigned char USBGetDescriptorRequest_GetDescriptorIndex( const USBGenericRequest *request); #endif //#ifndef USBGETDESCRIPTORREQUEST_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBInterfaceDescriptor.h000066400000000000000000000072741207233610700311240ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of a class for manipulating USB interface descriptors. !!!Usage - Declare USBInterfaceDescriptor instance as a part of the configuration descriptors of a USB device. */ #ifndef USBINTERFACEDESCRIPTOR_H #define USBINTERFACEDESCRIPTOR_H //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ #ifdef __ICCARM__ // IAR #pragma pack(1) // IAR #define __attribute__(...) // IAR #endif // IAR //------------------------------------------------------------------------------ /// USB standard interface descriptor structure. //------------------------------------------------------------------------------ typedef struct { /// Size of the descriptor in bytes. unsigned char bLength; /// Descriptor type (USBGenericDescriptor_INTERFACE). unsigned char bDescriptorType; /// Number of the interface in its configuration. unsigned char bInterfaceNumber; /// Value to select this alternate interface setting. unsigned char bAlternateSetting; /// Number of endpoints used by the inteface (excluding endpoint 0). unsigned char bNumEndpoints; /// Interface class code. unsigned char bInterfaceClass; /// Interface subclass code. unsigned char bInterfaceSubClass; /// Interface protocol code. unsigned char bInterfaceProtocol; /// Index of the interface string descriptor. unsigned char iInterface; } __attribute__ ((packed)) USBInterfaceDescriptor; // GCC #ifdef __ICCARM__ // IAR #pragma pack() // IAR #endif // IAR #endif //#ifndef USBINTERFACEDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBInterfaceRequest.c000066400000000000000000000066641207233610700304330ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /* Title: USBInterfaceRequest About: Purpose Implementation of USBInterfaceRequest class methods. */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBInterfaceRequest.h" //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Indicates which interface is targetted by a GET_INTERFACE or /// SET_INTERFACE request. /// \param request Pointer to a USBGenericRequest instance. /// \return Interface number. //------------------------------------------------------------------------------ unsigned char USBInterfaceRequest_GetInterface(const USBGenericRequest *request) { return (USBGenericRequest_GetIndex(request) & 0xFF); } //------------------------------------------------------------------------------ /// Indicates the new alternate setting that the interface targetted by a /// SET_INTERFACE request should use. /// \param request Pointer to a USBGenericRequest instance. /// \return New active setting for the interface. //------------------------------------------------------------------------------ unsigned char USBInterfaceRequest_GetAlternateSetting( const USBGenericRequest *request) { return (USBGenericRequest_GetValue(request) & 0xFF); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBInterfaceRequest.h000066400000000000000000000060631207233610700304310ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definitions for manipulating SET_INTERFACE and GET_INTERFACE request. !!!Usage -# After a SET_INTERFACE request has been received, retrieve the target interface using USBInterfaceRequest_GetInterface and its new alternate setting with USBInterfaceRequest_GetAlternateSetting. -# After a GET_INTERFACE request has been received, retrieve the target interface using USBInterfaceRequest_GetInterface. */ #ifndef USBINTERFACEREQUEST_H #define USBINTERFACEREQUEST_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBGenericRequest.h" //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern unsigned char USBInterfaceRequest_GetInterface( const USBGenericRequest *request); extern unsigned char USBInterfaceRequest_GetAlternateSetting( const USBGenericRequest *request); #endif //#ifndef USBINTERFACEREQUEST_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBSetAddressRequest.c000066400000000000000000000056341207233610700305700ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /* Title: USBSetAddressRequest implementation About: Purpose Implementation of the USBSetAddressRequest class. */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBSetAddressRequest.h" //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Returns the address that the device must take in response to a /// SET_ADDRESS request. /// \param request Pointer to a USBGenericRequest instance. /// \return New device address. //------------------------------------------------------------------------------ unsigned char USBSetAddressRequest_GetAddress(const USBGenericRequest *request) { return USBGenericRequest_GetValue(request) & 0x7F; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBSetAddressRequest.h000066400000000000000000000053431207233610700305720ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of a class for manipulating SET_ADDRESS USB requests. !!!Usage - After a SET_ADDRESS request has been received, retrive the new address value with USBSetAddressRequest_GetAddress. */ #ifndef USBSETADDRESSREQUEST_H #define USBSETADDRESSREQUEST_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBGenericRequest.h" //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern unsigned char USBSetAddressRequest_GetAddress( const USBGenericRequest *request); #endif //#ifndef USBSETADDRESSREQUEST_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBSetConfigurationRequest.c000066400000000000000000000057451207233610700320150ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /* Title: USBSetConfigurationRequest implementation About: Purpose Implementation of the USBSetConfigurationRequest class. */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBSetConfigurationRequest.h" //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Returns the number of the configuration that should be set in response /// to the given SET_CONFIGURATION request. /// \param request Pointer to a USBGenericRequest instance. /// \return Number of the requested configuration. //------------------------------------------------------------------------------ unsigned char USBSetConfigurationRequest_GetConfiguration( const USBGenericRequest *request) { return USBGenericRequest_GetValue(request); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBSetConfigurationRequest.h000066400000000000000000000054231207233610700320130ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of a class for the Set Configuration request. !!!Usage - After a SET_CONFIGURATION request has been received, retrive the new configuration value with USBSetConfigurationRequest_GetConfiguration. */ #ifndef USBSETCONFIGURATIONREQUEST_H #define USBSETCONFIGURATIONREQUEST_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBGenericRequest.h" //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern unsigned char USBSetConfigurationRequest_GetConfiguration( const USBGenericRequest *request); #endif //#ifndef USBSETCONFIGURATIONREQUEST_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/common/core/USBStringDescriptor.h000066400000000000000000000070111207233610700304570ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !!!Purpose /// /// Definition of a class for manipulating String descriptors. //------------------------------------------------------------------------------ #ifndef USBSTRINGDESCRIPTOR_H #define USBSTRINGDESCRIPTOR_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB String Descriptor definitions" /// /// This page lists the codes and macros for USB string descriptor definition. /// /// !Language IDs /// - USBStringDescriptor_ENGLISH_US /// /// !String Descriptor Length /// - USBStringDescriptor_LENGTH /// /// !ASCII to UNICODE convertion /// - USBStringDescriptor_UNICODE /// Language ID for US english. #define USBStringDescriptor_ENGLISH_US 0x09, 0x04 /// Calculates the length of a string descriptor given the number of ascii /// characters/language IDs in it. /// \param length The ascii format string length. /// \return The actual data length in bytes. #define USBStringDescriptor_LENGTH(length) ((length) * 2 + 2) /// Converts an ascii character to its unicode representation. /// \param ascii The ASCII character to convert /// \return A 2-byte-array for the UNICODE based on given ASCII #define USBStringDescriptor_UNICODE(ascii) (ascii), 0 //------------------------------------------------------------------------------ #endif //#ifndef USBSTRINGDESCRIPTOR_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/000077500000000000000000000000001207233610700234475ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/cdc-serial/000077500000000000000000000000001207233610700254555ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/cdc-serial/CDCDSerialDriver.c000066400000000000000000000312451207233610700306370ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /* Title: CDCDSerialDriver implementation About: Purpose Implementation of the CDCDSerialDriver class methods. */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "CDCDSerialDriver.h" #include "CDCDSerialDriverDescriptors.h" #include #include #include #include #include #include //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// USB driver for a CDC class implementing a virtual COM serial connection. //------------------------------------------------------------------------------ typedef struct { /// Standard USBDDriver instance. USBDDriver usbdDriver; /// Current line coding (baudrate, parity, stop bits). CDCLineCoding lineCoding; /// Indicates if the RS232 carrier is active. unsigned char isCarrierActivated; /// Current serial port states unsigned short serialState; } CDCDSerialDriver; //------------------------------------------------------------------------------ // Internal variables //------------------------------------------------------------------------------ /// Static instance of the CDC serial driver. static CDCDSerialDriver cdcdSerialDriver; //------------------------------------------------------------------------------ // Internal functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Callback function which should be invoked after the data of a /// SetLineCoding request has been retrieved. Sends a zero-length packet /// to the host for acknowledging the request. //------------------------------------------------------------------------------ static void CDCDSerialDriver_SetLineCodingCallback() { USBD_Write(0, 0, 0, 0, 0); } //------------------------------------------------------------------------------ /// Receives new line coding information from the USB host. //------------------------------------------------------------------------------ static void CDCDSerialDriver_SetLineCoding() { TRACE_INFO_WP("sLineCoding "); USBD_Read(0, (void *) &(cdcdSerialDriver.lineCoding), sizeof(CDCLineCoding), (TransferCallback) CDCDSerialDriver_SetLineCodingCallback, 0); } //------------------------------------------------------------------------------ /// Sends the current line coding information to the host through Control /// endpoint 0. //------------------------------------------------------------------------------ static void CDCDSerialDriver_GetLineCoding() { TRACE_INFO_WP("gLineCoding "); USBD_Write(0, (void *) &(cdcdSerialDriver.lineCoding), sizeof(CDCLineCoding), 0, 0); } //------------------------------------------------------------------------------ /// Changes the state of the serial driver according to the information /// sent by the host via a SetControlLineState request, and acknowledges /// the request with a zero-length packet. //------------------------------------------------------------------------------ static void CDCDSerialDriver_SetControlLineState(unsigned char activateCarrier, unsigned char isDTEPresent) { TRACE_INFO_WP( "sControlLineState(%d, %d) ", activateCarrier, isDTEPresent); cdcdSerialDriver.isCarrierActivated = activateCarrier; USBD_Write(0, 0, 0, 0, 0); } //------------------------------------------------------------------------------ // Optional RequestReceived() callback re-implementation //------------------------------------------------------------------------------ #if !defined(NOAUTOCALLBACK) //------------------------------------------------------------------------------ /// Re-implemented callback, invoked when a new USB Request is received. //------------------------------------------------------------------------------ void USBDCallbacks_RequestReceived(const USBGenericRequest *request) { CDCDSerialDriver_RequestHandler(request); } #endif //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Initializes the USB Device CDC serial driver & USBD Driver. //------------------------------------------------------------------------------ void CDCDSerialDriver_Initialize() { TRACE_INFO("CDCDSerialDriver_Initialize\n\r"); // Initialize Abstract Control Model attributes CDCLineCoding_Initialize(&(cdcdSerialDriver.lineCoding), 115200, CDCLineCoding_ONESTOPBIT, CDCLineCoding_NOPARITY, 8); cdcdSerialDriver.isCarrierActivated = 0; cdcdSerialDriver.serialState = 0; // Initialize the standard driver USBDDriver_Initialize(&(cdcdSerialDriver.usbdDriver), &cdcdSerialDriverDescriptors, 0); // Multiple settings for interfaces not supported // Initialize the USB driver USBD_Init(); } //------------------------------------------------------------------------------ /// Handles CDC-specific SETUP requests. Should be called from a /// re-implementation of USBDCallbacks_RequestReceived() method. /// \param Pointer to a USBGenericRequest instance. //------------------------------------------------------------------------------ void CDCDSerialDriver_RequestHandler(const USBGenericRequest *request) { TRACE_INFO_WP("NewReq "); // Handle the request switch (USBGenericRequest_GetRequest(request)) { case CDCGenericRequest_SETLINECODING: CDCDSerialDriver_SetLineCoding(); break; case CDCGenericRequest_GETLINECODING: CDCDSerialDriver_GetLineCoding(); break; case CDCGenericRequest_SETCONTROLLINESTATE: CDCDSerialDriver_SetControlLineState( CDCSetControlLineStateRequest_ActivateCarrier(request), CDCSetControlLineStateRequest_IsDtePresent(request)); break; default: USBDDriver_RequestHandler(&(cdcdSerialDriver.usbdDriver), request); break; } } //------------------------------------------------------------------------------ /// Receives data from the host through the virtual COM port created by /// the CDC device serial driver. This function behaves like USBD_Read. /// \param data Pointer to the data buffer to put received data. /// \param size Size of the data buffer in bytes. /// \param callback Optional callback function to invoke when the transfer /// finishes. /// \param argument Optional argument to the callback function. /// \return USBD_STATUS_SUCCESS if the read operation has been started normally; /// otherwise, the corresponding error code. //------------------------------------------------------------------------------ unsigned char CDCDSerialDriver_Read(void *data, unsigned int size, TransferCallback callback, void *argument) { return USBD_Read(CDCDSerialDriverDescriptors_DATAOUT, data, size, callback, argument); } //------------------------------------------------------------------------------ /// Sends a data buffer through the virtual COM port created by the CDC /// device serial driver. This function behaves exactly like USBD_Write. /// \param data Pointer to the data buffer to send. /// \param size Size of the data buffer in bytes. /// \param callback Optional callback function to invoke when the transfer /// finishes. /// \param argument Optional argument to the callback function. /// \return USBD_STATUS_SUCCESS if the read operation has been started normally; /// otherwise, the corresponding error code. //------------------------------------------------------------------------------ unsigned char CDCDSerialDriver_Write(void *data, unsigned int size, TransferCallback callback, void *argument) { return USBD_Write(CDCDSerialDriverDescriptors_DATAIN, data, size, callback, argument); } //------------------------------------------------------------------------------ /// Returns the current status of the RS-232 line. //------------------------------------------------------------------------------ unsigned short CDCDSerialDriver_GetSerialState() { return cdcdSerialDriver.serialState; } //------------------------------------------------------------------------------ /// Sets the current serial state of the device to the given value. /// \param serialState New device state. //------------------------------------------------------------------------------ void CDCDSerialDriver_SetSerialState(unsigned short serialState) { ASSERT((serialState & 0xFF80) == 0, "CDCDSerialDriver_SetSerialState: Bits D7-D15 are reserved\n\r"); // If new state is different from previous one, send a notification to the // host if (cdcdSerialDriver.serialState != serialState) { cdcdSerialDriver.serialState = serialState; USBD_Write(CDCDSerialDriverDescriptors_NOTIFICATION, &(cdcdSerialDriver.serialState), 2, 0, 0); // Reset one-time flags cdcdSerialDriver.serialState &= ~(CDCDSerialDriver_STATE_OVERRUN | CDCDSerialDriver_STATE_PARITY | CDCDSerialDriver_STATE_FRAMING | CDCDSerialDriver_STATE_RINGSIGNAL | CDCDSerialDriver_STATE_BREAK); } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/cdc-serial/CDCDSerialDriver.h000066400000000000000000000120171207233610700306400ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of a class for implementing a USB device CDC serial driver. !!!Usage -# Re-implement the USBDCallbacks_RequestReceived method to pass received requests to CDCDSerialDriver_RequestHandler. *This is automatically done unless the NOAUTOCALLBACK symbol is defined*. -# Initialize the CDC serial and USB drivers using CDCDSerialDriver_Initialize. -# Logically connect the device to the host using USBD_Connect. -# Send serial data to the USB host using CDCDSerialDriver_Write. -# Receive serial data from the USB host using CDCDSerialDriver_Read. */ #ifndef CDCDSERIALDRIVER_H #define CDCDSERIALDRIVER_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include #include //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC Serial Port States" /// This page lists the bit map for CDC Serial Port States. /// /// !BitMaps /// - CDCDSerialDriver_STATE_RXDRIVER /// - CDCDSerialDriver_STATE_TXCARRIER /// - CDCDSerialDriver_STATE_BREAK /// - CDCDSerialDriver_STATE_RINGSIGNAL /// - CDCDSerialDriver_STATE_FRAMING /// - CDCDSerialDriver_STATE_PARITY /// - CDCDSerialDriver_STATE_OVERRUN /// Indicates the receiver carrier signal is present. #define CDCDSerialDriver_STATE_RXDRIVER (1 << 0) /// Indicates the transmission carrier signal is present. #define CDCDSerialDriver_STATE_TXCARRIER (1 << 1) /// Indicates a break has been detected. #define CDCDSerialDriver_STATE_BREAK (1 << 2) /// Indicates a ring signal has been detected. #define CDCDSerialDriver_STATE_RINGSIGNAL (1 << 3) /// Indicates a framing error has occured. #define CDCDSerialDriver_STATE_FRAMING (1 << 4) /// Indicates a parity error has occured. #define CDCDSerialDriver_STATE_PARITY (1 << 5) /// Indicates a data overrun error has occured. #define CDCDSerialDriver_STATE_OVERRUN (1 << 6) //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern void CDCDSerialDriver_Initialize(); extern void CDCDSerialDriver_RequestHandler(const USBGenericRequest *request); extern unsigned char CDCDSerialDriver_Write( void *data, unsigned int size, TransferCallback callback, void *argument); extern unsigned char CDCDSerialDriver_Read( void *data, unsigned int size, TransferCallback callback, void *argument); extern unsigned short CDCDSerialDriver_GetSerialState(); extern void CDCDSerialDriver_SetSerialState(unsigned short serialState); #endif //#ifndef CDCSERIALDRIVER_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/cdc-serial/CDCDSerialDriverDescriptors.c000066400000000000000000000645671207233610700330760ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "CDCDSerialDriverDescriptors.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC Serial Device IDs" /// This page lists the IDs used in the CDC Serial Device Descriptor. /// /// !IDs /// - CDCDSerialDriverDescriptors_PRODUCTID /// - CDCDSerialDriverDescriptors_VENDORID /// - CDCDSerialDriverDescriptors_RELEASE /// Device product ID. #define CDCDSerialDriverDescriptors_PRODUCTID 0x6124 //#define CDCDSerialDriverDescriptors_PRODUCTID 0x6119 /// Device vendor ID (Atmel). #define CDCDSerialDriverDescriptors_VENDORID 0x03EB /// Device release number. #define CDCDSerialDriverDescriptors_RELEASE 0x0100 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Macros //------------------------------------------------------------------------------ /// Returns the minimum between two values. #define MIN(a, b) ((a < b) ? a : b) //------------------------------------------------------------------------------ // Internal structures //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Configuration descriptor list for a device implementing a CDC serial driver. //------------------------------------------------------------------------------ typedef struct { /// Standard configuration descriptor. USBConfigurationDescriptor config; #if defined(BOARD_USB_OTGHS) // OTG descriptor USBOtgDescriptor otgDescriptor; #endif /// Communication interface descriptor. USBInterfaceDescriptor communication; /// CDC header functional descriptor. CDCHeaderDescriptor header; /// CDC call management functional descriptor. CDCCallManagementDescriptor callManagement; /// CDC abstract control management functional descriptor. CDCAbstractControlManagementDescriptor abstractControlManagement; /// CDC union functional descriptor (with one slave interface). CDCUnionDescriptor union1; /// Notification endpoint descriptor. USBEndpointDescriptor notification; /// Data interface descriptor. USBInterfaceDescriptor data; /// Data OUT endpoint descriptor. USBEndpointDescriptor dataOut; /// Data IN endpoint descriptor. USBEndpointDescriptor dataIn; } __attribute__ ((packed)) CDCDSerialDriverConfigurationDescriptors; //------------------------------------------------------------------------------ // Exported variables //------------------------------------------------------------------------------ /// Standard USB device descriptor for the CDC serial driver const USBDeviceDescriptor deviceDescriptor = { sizeof(USBDeviceDescriptor), USBGenericDescriptor_DEVICE, USBDeviceDescriptor_USB2_00, CDCDeviceDescriptor_CLASS, CDCDeviceDescriptor_SUBCLASS, CDCDeviceDescriptor_PROTOCOL, BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0), CDCDSerialDriverDescriptors_VENDORID, CDCDSerialDriverDescriptors_PRODUCTID, CDCDSerialDriverDescriptors_RELEASE, 0, // No string descriptor for manufacturer 1, // Index of product string descriptor is #1 0, // No string descriptor for serial number 1 // Device has 1 possible configuration }; #if defined(BOARD_USB_UDPHS) || defined(BOARD_USB_OTGHS) /// USB device qualifier descriptor. const USBDeviceQualifierDescriptor qualifierDescriptor = { sizeof(USBDeviceQualifierDescriptor), USBGenericDescriptor_DEVICEQUALIFIER, USBDeviceDescriptor_USB2_00, CDCDeviceDescriptor_CLASS, CDCDeviceDescriptor_SUBCLASS, CDCDeviceDescriptor_PROTOCOL, BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0), 1, // Device has one possible configuration 0 // Reserved }; #endif /// Standard USB configuration descriptor for the CDC serial driver const CDCDSerialDriverConfigurationDescriptors configurationDescriptors = { // Standard configuration descriptor { sizeof(USBConfigurationDescriptor), USBGenericDescriptor_CONFIGURATION, sizeof(CDCDSerialDriverConfigurationDescriptors), 2, // There are two interfaces in this configuration 1, // This is configuration #1 0, // No string descriptor for this configuration BOARD_USB_BMATTRIBUTES, USBConfigurationDescriptor_POWER(100) }, #if defined(BOARD_USB_OTGHS) // OTG descriptor { sizeof(USBOtgDescriptor), USBGenericDescriptor_OTG, USBOTGDescriptor_HNP_SRP }, #endif // Communication class interface standard descriptor { sizeof(USBInterfaceDescriptor), USBGenericDescriptor_INTERFACE, 0, // This is interface #0 0, // This is alternate setting #0 for this interface 1, // This interface uses 1 endpoint CDCCommunicationInterfaceDescriptor_CLASS, CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL, CDCCommunicationInterfaceDescriptor_NOPROTOCOL, 0 // No string descriptor for this interface }, // Class-specific header functional descriptor { sizeof(CDCHeaderDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_HEADER, CDCGenericDescriptor_CDC1_10 }, // Class-specific call management functional descriptor { sizeof(CDCCallManagementDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_CALLMANAGEMENT, CDCCallManagementDescriptor_SELFCALLMANAGEMENT, 0 // No associated data interface }, // Class-specific abstract control management functional descriptor { sizeof(CDCAbstractControlManagementDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_ABSTRACTCONTROLMANAGEMENT, CDCAbstractControlManagementDescriptor_LINE }, // Class-specific union functional descriptor with one slave interface { sizeof(CDCUnionDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_UNION, 0, // Number of master interface is #0 1 // First slave interface is #1 }, // Notification endpoint standard descriptor { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN, CDCDSerialDriverDescriptors_NOTIFICATION), USBEndpointDescriptor_INTERRUPT, MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCDSerialDriverDescriptors_NOTIFICATION), USBEndpointDescriptor_MAXINTERRUPTSIZE_FS), 10 // Endpoint is polled every 10ms }, // Data class interface standard descriptor { sizeof(USBInterfaceDescriptor), USBGenericDescriptor_INTERFACE, 1, // This is interface #1 0, // This is alternate setting #0 for this interface 2, // This interface uses 2 endpoints CDCDataInterfaceDescriptor_CLASS, CDCDataInterfaceDescriptor_SUBCLASS, CDCDataInterfaceDescriptor_NOPROTOCOL, 0 // No string descriptor for this interface }, // Bulk-OUT endpoint standard descriptor { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_OUT, CDCDSerialDriverDescriptors_DATAOUT), USBEndpointDescriptor_BULK, 64, // MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCDSerialDriverDescriptors_DATAOUT), // USBEndpointDescriptor_MAXBULKSIZE_FS), 0 // Must be 0 for full-speed bulk endpoints }, // Bulk-IN endpoint descriptor { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN, CDCDSerialDriverDescriptors_DATAIN), USBEndpointDescriptor_BULK, 64, // MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCDSerialDriverDescriptors_DATAIN), // USBEndpointDescriptor_MAXBULKSIZE_FS), 0 // Must be 0 for full-speed bulk endpoints }, }; /// Language ID string descriptor const unsigned char languageIdStringDescriptor[] = { USBStringDescriptor_LENGTH(1), USBGenericDescriptor_STRING, USBStringDescriptor_ENGLISH_US }; #if defined(BOARD_USB_UDPHS) || defined(BOARD_USB_OTGHS) /// Other-speed configuration descriptor (when in full-speed). const CDCDSerialDriverConfigurationDescriptors otherSpeedDescriptorsFS = { // Standard configuration descriptor { sizeof(USBConfigurationDescriptor), USBGenericDescriptor_OTHERSPEEDCONFIGURATION, sizeof(CDCDSerialDriverConfigurationDescriptors), 2, // There are two interfaces in this configuration 1, // This is configuration #1 0, // No string descriptor for this configuration BOARD_USB_BMATTRIBUTES, USBConfigurationDescriptor_POWER(100) }, #if defined(BOARD_USB_OTGHS) // OTG descriptor { sizeof(USBOtgDescriptor), USBGenericDescriptor_OTG, USBOTGDescriptor_HNP_SRP }, #endif // Communication class interface standard descriptor { sizeof(USBInterfaceDescriptor), USBGenericDescriptor_INTERFACE, 0, // This is interface #0 0, // This is alternate setting #0 for this interface 1, // This interface uses 1 endpoint CDCCommunicationInterfaceDescriptor_CLASS, CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL, CDCCommunicationInterfaceDescriptor_NOPROTOCOL, 0 // No string descriptor for this interface }, // Class-specific header functional descriptor { sizeof(CDCHeaderDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_HEADER, CDCGenericDescriptor_CDC1_10 }, // Class-specific call management functional descriptor { sizeof(CDCCallManagementDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_CALLMANAGEMENT, CDCCallManagementDescriptor_SELFCALLMANAGEMENT, 0 // No associated data interface }, // Class-specific abstract control management functional descriptor { sizeof(CDCAbstractControlManagementDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_ABSTRACTCONTROLMANAGEMENT, CDCAbstractControlManagementDescriptor_LINE }, // Class-specific union functional descriptor with one slave interface { sizeof(CDCUnionDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_UNION, 0, // Number of master interface is #0 1 // First slave interface is #1 }, // Notification endpoint standard descriptor { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN, CDCDSerialDriverDescriptors_NOTIFICATION), USBEndpointDescriptor_INTERRUPT, MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCDSerialDriverDescriptors_NOTIFICATION), USBEndpointDescriptor_MAXINTERRUPTSIZE_HS), 10 // Endpoint is polled every 10ms }, // Data class interface standard descriptor { sizeof(USBInterfaceDescriptor), USBGenericDescriptor_INTERFACE, 1, // This is interface #1 0, // This is alternate setting #0 for this interface 2, // This interface uses 2 endpoints CDCDataInterfaceDescriptor_CLASS, CDCDataInterfaceDescriptor_SUBCLASS, CDCDataInterfaceDescriptor_NOPROTOCOL, 0 // No string descriptor for this interface }, // Bulk-OUT endpoint standard descriptor { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_OUT, CDCDSerialDriverDescriptors_DATAOUT), USBEndpointDescriptor_BULK, 512, // MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCDSerialDriverDescriptors_DATAOUT), // USBEndpointDescriptor_MAXBULKSIZE_HS), 0 // Must be 0 for full-speed bulk endpoints }, // Bulk-IN endpoint descriptor { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN, CDCDSerialDriverDescriptors_DATAIN), USBEndpointDescriptor_BULK, 512, // MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCDSerialDriverDescriptors_DATAIN), // USBEndpointDescriptor_MAXBULKSIZE_HS), 0 // Must be 0 for full-speed bulk endpoints }, }; /// Configuration descriptor (when in high-speed). const CDCDSerialDriverConfigurationDescriptors configurationDescriptorsHS = { // Standard configuration descriptor { sizeof(USBConfigurationDescriptor), USBGenericDescriptor_CONFIGURATION, sizeof(CDCDSerialDriverConfigurationDescriptors), 2, // There are two interfaces in this configuration 1, // This is configuration #1 0, // No string descriptor for this configuration BOARD_USB_BMATTRIBUTES, USBConfigurationDescriptor_POWER(100) }, #if defined(BOARD_USB_OTGHS) // OTG descriptor { sizeof(USBOtgDescriptor), USBGenericDescriptor_OTG, USBOTGDescriptor_HNP_SRP }, #endif // Communication class interface standard descriptor { sizeof(USBInterfaceDescriptor), USBGenericDescriptor_INTERFACE, 0, // This is interface #0 0, // This is alternate setting #0 for this interface 1, // This interface uses 1 endpoint CDCCommunicationInterfaceDescriptor_CLASS, CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL, CDCCommunicationInterfaceDescriptor_NOPROTOCOL, 0 // No string descriptor for this interface }, // Class-specific header functional descriptor { sizeof(CDCHeaderDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_HEADER, CDCGenericDescriptor_CDC1_10 }, // Class-specific call management functional descriptor { sizeof(CDCCallManagementDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_CALLMANAGEMENT, CDCCallManagementDescriptor_SELFCALLMANAGEMENT, 0 // No associated data interface }, // Class-specific abstract control management functional descriptor { sizeof(CDCAbstractControlManagementDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_ABSTRACTCONTROLMANAGEMENT, CDCAbstractControlManagementDescriptor_LINE }, // Class-specific union functional descriptor with one slave interface { sizeof(CDCUnionDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_UNION, 0, // Number of master interface is #0 1 // First slave interface is #1 }, // Notification endpoint standard descriptor { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN, CDCDSerialDriverDescriptors_NOTIFICATION), USBEndpointDescriptor_INTERRUPT, MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCDSerialDriverDescriptors_NOTIFICATION), USBEndpointDescriptor_MAXINTERRUPTSIZE_HS), 10 // Endpoint is polled every 10ms }, // Data class interface standard descriptor { sizeof(USBInterfaceDescriptor), USBGenericDescriptor_INTERFACE, 1, // This is interface #1 0, // This is alternate setting #0 for this interface 2, // This interface uses 2 endpoints CDCDataInterfaceDescriptor_CLASS, CDCDataInterfaceDescriptor_SUBCLASS, CDCDataInterfaceDescriptor_NOPROTOCOL, 0 // No string descriptor for this interface }, // Bulk-OUT endpoint standard descriptor { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_OUT, CDCDSerialDriverDescriptors_DATAOUT), USBEndpointDescriptor_BULK, 512, // MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCDSerialDriverDescriptors_DATAOUT), // USBEndpointDescriptor_MAXBULKSIZE_HS), 0 // Must be 0 for full-speed bulk endpoints }, // Bulk-IN endpoint descriptor { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN, CDCDSerialDriverDescriptors_DATAIN), USBEndpointDescriptor_BULK, 512, // MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCDSerialDriverDescriptors_DATAIN), // USBEndpointDescriptor_MAXBULKSIZE_HS), 0 // Must be 0 for full-speed bulk endpoints }, }; /// Other-speed configuration descriptor (when in high-speed). const CDCDSerialDriverConfigurationDescriptors otherSpeedDescriptorsHS = { // Standard configuration descriptor { sizeof(USBConfigurationDescriptor), USBGenericDescriptor_OTHERSPEEDCONFIGURATION, sizeof(CDCDSerialDriverConfigurationDescriptors), 2, // There are two interfaces in this configuration 1, // This is configuration #1 0, // No string descriptor for this configuration BOARD_USB_BMATTRIBUTES, USBConfigurationDescriptor_POWER(100) }, #if defined(BOARD_USB_OTGHS) // OTG descriptor { sizeof(USBOtgDescriptor), USBGenericDescriptor_OTG, USBOTGDescriptor_HNP_SRP }, #endif // Communication class interface standard descriptor { sizeof(USBInterfaceDescriptor), USBGenericDescriptor_INTERFACE, 0, // This is interface #0 0, // This is alternate setting #0 for this interface 1, // This interface uses 1 endpoint CDCCommunicationInterfaceDescriptor_CLASS, CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL, CDCCommunicationInterfaceDescriptor_NOPROTOCOL, 0 // No string descriptor for this interface }, // Class-specific header functional descriptor { sizeof(CDCHeaderDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_HEADER, CDCGenericDescriptor_CDC1_10 }, // Class-specific call management functional descriptor { sizeof(CDCCallManagementDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_CALLMANAGEMENT, CDCCallManagementDescriptor_SELFCALLMANAGEMENT, 0 // No associated data interface }, // Class-specific abstract control management functional descriptor { sizeof(CDCAbstractControlManagementDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_ABSTRACTCONTROLMANAGEMENT, CDCAbstractControlManagementDescriptor_LINE }, // Class-specific union functional descriptor with one slave interface { sizeof(CDCUnionDescriptor), CDCGenericDescriptor_INTERFACE, CDCGenericDescriptor_UNION, 0, // Number of master interface is #0 1 // First slave interface is #1 }, // Notification endpoint standard descriptor { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN, CDCDSerialDriverDescriptors_NOTIFICATION), USBEndpointDescriptor_INTERRUPT, MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCDSerialDriverDescriptors_NOTIFICATION), USBEndpointDescriptor_MAXINTERRUPTSIZE_FS), 10 // Endpoint is polled every 10ms }, // Data class interface standard descriptor { sizeof(USBInterfaceDescriptor), USBGenericDescriptor_INTERFACE, 1, // This is interface #1 0, // This is alternate setting #0 for this interface 2, // This interface uses 2 endpoints CDCDataInterfaceDescriptor_CLASS, CDCDataInterfaceDescriptor_SUBCLASS, CDCDataInterfaceDescriptor_NOPROTOCOL, 0 // No string descriptor for this interface }, // Bulk-OUT endpoint standard descriptor { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_OUT, CDCDSerialDriverDescriptors_DATAOUT), USBEndpointDescriptor_BULK, 64, // MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCDSerialDriverDescriptors_DATAOUT), // USBEndpointDescriptor_MAXBULKSIZE_FS), 0 // Must be 0 for full-speed bulk endpoints }, // Bulk-IN endpoint descriptor { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN, CDCDSerialDriverDescriptors_DATAIN), USBEndpointDescriptor_BULK, 64, // MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCDSerialDriverDescriptors_DATAIN), // USBEndpointDescriptor_MAXBULKSIZE_FS), 0 // Must be 0 for full-speed bulk endpoints }, }; #endif /// Product string descriptor const unsigned char productStringDescriptor[] = { USBStringDescriptor_LENGTH(13), USBGenericDescriptor_STRING, USBStringDescriptor_UNICODE('A'), USBStringDescriptor_UNICODE('T'), USBStringDescriptor_UNICODE('9'), USBStringDescriptor_UNICODE('1'), USBStringDescriptor_UNICODE('U'), USBStringDescriptor_UNICODE('S'), USBStringDescriptor_UNICODE('B'), USBStringDescriptor_UNICODE('S'), USBStringDescriptor_UNICODE('e'), USBStringDescriptor_UNICODE('r'), USBStringDescriptor_UNICODE('i'), USBStringDescriptor_UNICODE('a'), USBStringDescriptor_UNICODE('l') }; /// List of string descriptors used by the device const unsigned char *stringDescriptors[] = { languageIdStringDescriptor, productStringDescriptor, }; /// List of standard descriptors for the serial driver. USBDDriverDescriptors cdcdSerialDriverDescriptors = { &deviceDescriptor, (USBConfigurationDescriptor *) &(configurationDescriptors), #if defined(BOARD_USB_UDPHS) || defined(BOARD_USB_OTGHS) &qualifierDescriptor, (USBConfigurationDescriptor *) &(otherSpeedDescriptorsFS), &deviceDescriptor, (USBConfigurationDescriptor *) &(configurationDescriptorsHS), &qualifierDescriptor, (USBConfigurationDescriptor *) &(otherSpeedDescriptorsHS), #else 0, // No full-speed device qualifier descriptor 0, // No full-speed other speed configuration 0, // No high-speed device descriptor 0, // No high-speed configuration descriptor 0, // No high-speed device qualifier descriptor 0, // No high-speed other speed configuration descriptor #endif stringDescriptors, 2 // 2 string descriptors in list }; tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/cdc-serial/CDCDSerialDriverDescriptors.h000066400000000000000000000070041207233610700330620ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of the USB descriptors required by a CDC device serial driver. */ #ifndef CDCDSERIALDRIVERDESCRIPTORS_H #define CDCDSERIALDRIVERDESCRIPTORS_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "CDC Serial Endpoints" /// This page lists the endpoints used in CDC Serial Device. /// /// !Endpoints /// - CDCDSerialDriverDescriptors_DATAOUT /// - CDCDSerialDriverDescriptors_DATAIN /// - CDCDSerialDriverDescriptors_NOTIFICATION /// Data OUT endpoint number. #define CDCDSerialDriverDescriptors_DATAOUT 1 /// Data IN endpoint number. #define CDCDSerialDriverDescriptors_DATAIN 2 /// Notification endpoint number. #define CDCDSerialDriverDescriptors_NOTIFICATION 3 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Exported variables //------------------------------------------------------------------------------ /// List of descriptors for a CDC device serial driver. extern USBDDriverDescriptors cdcdSerialDriverDescriptors; #endif //#ifndef CDCDDRIVERDESCRIPTORS_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/cdc-serial/drv/000077500000000000000000000000001207233610700262505ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/cdc-serial/drv/6119.inf000066400000000000000000000062301207233610700273470ustar00rootroot00000000000000; $Id: 6119.inf,v 1.1.2.1 2006/12/05 08:33:25 danielru Exp $ [Version] ; Version section Signature="$Chicago$" ; All Windows versions Class=Ports ; This is a serial port driver ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} ; Associated GUID Provider=%ATMEL% ; Driver is provided by ATMEL DriverVer=09/12/2006,1.1.1.5 ; Driver version 1.1.1.5 published on 23 February 2007 [DestinationDirs] ; DestinationDirs section DefaultDestDir=12 ; Default install directory is \drivers or \IOSubSys [Manufacturer] ; Manufacturer section %ATMEL%=AtmelMfg ; Only one manufacturer (ATMEL), models section is named ; AtmelMfg [AtmelMfg] ; Models section corresponding to ATMEL %USBtoSerialConverter%=USBtoSer.Install,USB\VID_03EB&PID_6119 ; Identifies a device with ATMEL Vendor ID (03EBh) and ; Product ID equal to 6119h. Corresponding Install section ; is named USBtoSer.Install [USBtoSer.Install] ; Install section include=mdmcpq.inf CopyFiles=FakeModemCopyFileSection AddReg=USBtoSer.AddReg ; Registry keys to add are listed in USBtoSer.AddReg [USBtoSer.AddReg] ; AddReg section HKR,,DevLoader,,*ntkern ; HKR,,NTMPDriver,,usbser.sys HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" [USBtoSer.Install.Services] ; Services section AddService=usbser,0x00000002,USBtoSer.AddService ; Assign usbser as the PnP driver for the device [USBtoSer.AddService] ; Service install section DisplayName=%USBSer% ; Name of the serial driver ServiceType=1 ; Service kernel driver StartType=3 ; Driver is started by the PnP manager ErrorControl=1 ; Warn about errors ServiceBinary=%12%\usbser.sys ; Driver filename [Strings] ; Strings section ATMEL="ATMEL Corp." ; String value for the ATMEL symbol USBtoSerialConverter="AT91 USB to Serial Converter" ; String value for the USBtoSerialConverter symbol USBSer="USB Serial Driver" ; String value for the USBSer symboltinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/000077500000000000000000000000001207233610700243775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/USBD.h000066400000000000000000000163701207233610700253140ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !!!Purpose /// /// Collection of methods for using the USB device controller on AT91 /// microcontrollers. /// /// !!!Usage /// /// Please refer to the corresponding application note. /// - "AT91 USB device framework" /// - "USBD API" . "USBD API Methods" //------------------------------------------------------------------------------ #ifndef USBD_H #define USBD_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include #include //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB device API return values" /// /// This page lists the return values of the USB %device driver API /// /// !Return codes /// - USBD_STATUS_SUCCESS /// - USBD_STATUS_LOCKED /// - USBD_STATUS_ABORTED /// - USBD_STATUS_RESET /// Indicates the operation was successful. #define USBD_STATUS_SUCCESS 0 /// Endpoint/device is already busy. #define USBD_STATUS_LOCKED 1 /// Operation has been aborted. #define USBD_STATUS_ABORTED 2 /// Operation has been aborted because the device has been reset. #define USBD_STATUS_RESET 3 /// Operation failed because parameter error #define USBD_STATUS_INVALID_PARAMETER 4 /// Operation failed because HW not supported #define USBD_STATUS_HW_NOT_SUPPORTED 5 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB device states" /// /// This page lists the %device states of the USB %device driver. /// /// !States /// - USBD_STATE_SUSPENDED /// - USBD_STATE_ATTACHED /// - USBD_STATE_POWERED /// - USBD_STATE_DEFAULT /// - USBD_STATE_ADDRESS /// - USBD_STATE_CONFIGURED /// The device is currently suspended. #define USBD_STATE_SUSPENDED 0 /// USB cable is plugged into the device. #define USBD_STATE_ATTACHED 1 /// Host is providing +5V through the USB cable. #define USBD_STATE_POWERED 2 /// Device has been reset. #define USBD_STATE_DEFAULT 3 /// The device has been given an address on the bus. #define USBD_STATE_ADDRESS 4 /// A valid configuration has been selected. #define USBD_STATE_CONFIGURED 5 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "USB device LEDs" /// /// This page lists the LEDs used in the USB %device driver. /// /// !LEDs /// - USBD_LEDPOWER /// - USBD_LEDUSB /// - USBD_LEDOTHER /// LED for indicating that the device is powered. #define USBD_LEDPOWER 0 /// LED for indicating USB activity. #define USBD_LEDUSB 1 /// LED for custom usage. #define USBD_LEDOTHER 2 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Callback used by transfer functions (USBD_Read & USBD_Write) to notify /// that a transaction is complete. //------------------------------------------------------------------------------ typedef void (*TransferCallback)(void *pArg, unsigned char status, unsigned int transferred, unsigned int remaining); //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern void UDPD_IrqHandler(void); extern void USBD_Init(void); extern void USBD_ConfigureSpeed(unsigned char forceFS); extern void USBD_Connect(void); extern void USBD_Disconnect(void); extern char USBD_Write( unsigned char bEndpoint, const void *pData, unsigned int size, TransferCallback callback, void *pArg); extern char USBD_Read( unsigned char bEndpoint, void *pData, unsigned int dLength, TransferCallback fCallback, void *pArg); extern unsigned char USBD_Stall(unsigned char bEndpoint); extern void USBD_Halt(unsigned char bEndpoint); extern void USBD_Unhalt(unsigned char bEndpoint); extern void USBD_ConfigureEndpoint(const USBEndpointDescriptor *pDescriptor); extern unsigned char USBD_IsHalted(unsigned char bEndpoint); extern void USBD_RemoteWakeUp(void); extern void USBD_SetAddress(unsigned char address); extern void USBD_SetConfiguration(unsigned char cfgnum); extern unsigned char USBD_GetState(void); extern unsigned char USBD_IsHighSpeed(void); extern void USBD_Test(unsigned char bIndex); #endif //#ifndef USBD_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/USBDCallbacks.h000066400000000000000000000056311207233610700271120ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definitions of callbacks used by the USBD API to notify the user application of incoming events. These functions are declared as 'weak', so they can be re-implemented elsewhere in the application in a transparent way. */ #ifndef USBDCALLBACKS_H #define USBDCALLBACKS_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern void USBDCallbacks_Initialized(void); extern void USBDCallbacks_Reset(void); extern void USBDCallbacks_Suspended(void); extern void USBDCallbacks_Resumed(void); extern void USBDCallbacks_RequestReceived(const USBGenericRequest *request); #endif //#ifndef USBDCALLBACKS_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/USBDCallbacks_Initialized.c000066400000000000000000000063041207233610700314300ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBDCallbacks.h" #include "USBD.h" #include #include //------------------------------------------------------------------------------ // Exported function //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Invoked after the USB driver has been initialized. By default, configures /// the UDP/UDPHS interrupt. //------------------------------------------------------------------------------ void USBDCallbacks_Initialized(void) { #if defined(BOARD_USB_UDP) // Configure and enable the UDP interrupt IRQ_ConfigureIT(AT91C_ID_UDP, 0, UdphsIrqHandler);//, UDPD_IrqHandler); IRQ_EnableIT(AT91C_ID_UDP); #elif defined(BOARD_USB_UDPHS) // Configure and enable the UDPHS interrupt IRQ_ConfigureIT(AT91C_ID_UDPHS, 0, UdphsIrqHandler);//, UDPD_IrqHandler); IRQ_EnableIT(AT91C_ID_UDPHS); #elif defined(BOARD_USB_OTGHS) IRQ_ConfigureIT(AT91C_ID_OTGHS, 1, UdphsIrqHandler); IRQ_EnableIT(AT91C_ID_OTGHS); #else #error Unsupported controller. #endif } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/USBDCallbacks_Reset.c000066400000000000000000000050731207233610700302470ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBDCallbacks.h" //------------------------------------------------------------------------------ // Exported function //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Invoked when the USB driver is reset. Does nothing by default. //------------------------------------------------------------------------------ void USBDCallbacks_Reset(void) { // Does nothing } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/USBDDriver.c000066400000000000000000000700351207233610700264610ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBDDriver.h" #include "USBDDriverCallbacks.h" #include "USBD.h" #include #include #include #include #include #include #include #include #include #include #include #include #include //------------------------------------------------------------------------------ // Local functions //------------------------------------------------------------------------------ #if defined(BOARD_USB_OTGHS) static unsigned char otg_features_supported = 0; #endif //------------------------------------------------------------------------------ /// Send a NULL packet //------------------------------------------------------------------------------ static void TerminateCtrlInWithNull(void *pArg, unsigned char status, unsigned int transferred, unsigned int remaining) { USBD_Write(0, // Endpoint #0 0, // No data buffer 0, // No data buffer (TransferCallback) 0, (void *) 0); } //------------------------------------------------------------------------------ /// Configures the device by setting it into the Configured state and /// initializing all endpoints. /// \param pDriver Pointer to a USBDDriver instance. /// \param cfgnum Configuration number to set. //------------------------------------------------------------------------------ static void SetConfiguration(USBDDriver *pDriver, unsigned char cfgnum) { USBEndpointDescriptor *pEndpoints[BOARD_USB_NUMENDPOINTS+1]; const USBConfigurationDescriptor *pConfiguration; // Use different descriptor depending on device speed if (USBD_IsHighSpeed()) { pConfiguration = pDriver->pDescriptors->pHsConfiguration; } else { pConfiguration = pDriver->pDescriptors->pFsConfiguration; } // Set & save the desired configuration USBD_SetConfiguration(cfgnum); pDriver->cfgnum = cfgnum; // If the configuration is not 0, configure endpoints if (cfgnum != 0) { int i; // Parse configuration to get endpoint descriptors USBConfigurationDescriptor_Parse(pConfiguration, 0, pEndpoints, 0); // Configure endpoints i = 0; while (pEndpoints[i] != 0) { USBD_ConfigureEndpoint(pEndpoints[i]); i++; } } // Should be done before send the ZLP USBDDriverCallbacks_ConfigurationChanged(cfgnum); // Acknowledge the request USBD_Write(0, // Endpoint #0 0, // No data buffer 0, // No data buffer (TransferCallback) 0, (void *) 0); } //------------------------------------------------------------------------------ /// Sends the current configuration number to the host. /// \param pDriver Pointer to a USBDDriver instance. //------------------------------------------------------------------------------ static void GetConfiguration(const USBDDriver *pDriver) { USBD_Write(0, &(pDriver->cfgnum), 1, 0, 0); } //------------------------------------------------------------------------------ /// Sends the current status of the device to the host. /// \param pDriver Pointer to a USBDDriver instance. //------------------------------------------------------------------------------ static void GetDeviceStatus(const USBDDriver *pDriver) { static unsigned short data; const USBConfigurationDescriptor *pConfiguration; data = 0; // Use different configuration depending on device speed if (USBD_IsHighSpeed()) { pConfiguration = pDriver->pDescriptors->pHsConfiguration; } else { pConfiguration = pDriver->pDescriptors->pFsConfiguration; } // Check current configuration for power mode (if device is configured) if (pDriver->cfgnum != 0) { if (USBConfigurationDescriptor_IsSelfPowered(pConfiguration)) { data |= 1; } } // Check if remote wake-up is enabled if (pDriver->isRemoteWakeUpEnabled) { data |= 2; } // Send the device status USBD_Write(0, &data, 2, 0, 0); } //------------------------------------------------------------------------------ /// Sends the current status of an endpoints to the USB host. /// \param bEndpoint Endpoint number. //------------------------------------------------------------------------------ static void GetEndpointStatus(unsigned char bEndpoint) { static unsigned short data; data = 0; // Check if the endpoint exists if (bEndpoint > BOARD_USB_NUMENDPOINTS) { USBD_Stall(0); } else { // Check if the endpoint if currently halted if (USBD_IsHalted(bEndpoint)) { data = 1; } // Send the endpoint status USBD_Write(0, &data, 2, 0, 0); } } //------------------------------------------------------------------------------ /// Sends the requested USB descriptor to the host if available, or STALLs the /// request. /// \param pDriver Pointer to a USBDDriver instance. /// \param type Type of the requested descriptor /// \param idx Index of the requested descriptor. /// \param length Maximum number of bytes to return. //------------------------------------------------------------------------------ static void GetDescriptor( const USBDDriver *pDriver, unsigned char type, unsigned char idx, unsigned int length) { const USBDeviceDescriptor *pDevice; const USBConfigurationDescriptor *pConfiguration; const USBDeviceQualifierDescriptor *pQualifier; const USBConfigurationDescriptor *pOtherSpeed; const USBGenericDescriptor **pStrings = (const USBGenericDescriptor **) pDriver->pDescriptors->pStrings; unsigned char numStrings = pDriver->pDescriptors->numStrings; const USBGenericDescriptor *pString; // Use different set of descriptors depending on device speed if (USBD_IsHighSpeed()) { TRACE_DEBUG("HS "); pDevice = pDriver->pDescriptors->pHsDevice; pConfiguration = pDriver->pDescriptors->pHsConfiguration; pQualifier = pDriver->pDescriptors->pHsQualifier; pOtherSpeed = pDriver->pDescriptors->pHsOtherSpeed; } else { TRACE_DEBUG("FS "); pDevice = pDriver->pDescriptors->pFsDevice; pConfiguration = pDriver->pDescriptors->pFsConfiguration; pQualifier = pDriver->pDescriptors->pFsQualifier; pOtherSpeed = pDriver->pDescriptors->pFsOtherSpeed; } // Check the descriptor type switch (type) { case USBGenericDescriptor_DEVICE: TRACE_INFO_WP("Dev "); // Adjust length and send descriptor if (length > USBGenericDescriptor_GetLength((USBGenericDescriptor *) pDevice)) { length = USBGenericDescriptor_GetLength((USBGenericDescriptor *) pDevice); } USBD_Write(0, pDevice, length, 0, 0); break; case USBGenericDescriptor_CONFIGURATION: TRACE_INFO_WP("Cfg "); // Adjust length and send descriptor if (length > USBConfigurationDescriptor_GetTotalLength(pConfiguration)) { length = USBConfigurationDescriptor_GetTotalLength(pConfiguration); } USBD_Write(0, pConfiguration, length, ((length % pDevice->bMaxPacketSize0) == 0) ? TerminateCtrlInWithNull : 0, 0); break; case USBGenericDescriptor_DEVICEQUALIFIER: TRACE_INFO_WP("Qua "); // Check if descriptor exists if (!pQualifier) { USBD_Stall(0); } else { // Adjust length and send descriptor if (length > USBGenericDescriptor_GetLength((USBGenericDescriptor *) pQualifier)) { length = USBGenericDescriptor_GetLength((USBGenericDescriptor *) pQualifier); } USBD_Write(0, pQualifier, length, 0, 0); } break; case USBGenericDescriptor_OTHERSPEEDCONFIGURATION: TRACE_INFO_WP("OSC "); // Check if descriptor exists if (!pOtherSpeed) { USBD_Stall(0); } else { // Adjust length and send descriptor if (length > USBConfigurationDescriptor_GetTotalLength(pOtherSpeed)) { length = USBConfigurationDescriptor_GetTotalLength(pOtherSpeed); } USBD_Write(0, pOtherSpeed, length, ((length % pDevice->bMaxPacketSize0) == 0) ? TerminateCtrlInWithNull : 0, 0); } break; case USBGenericDescriptor_STRING: TRACE_INFO_WP("Str%d ", idx); // Check if descriptor exists if (idx > numStrings) { USBD_Stall(0); } else { pString = pStrings[idx]; // Adjust length and send descriptor if (length > USBGenericDescriptor_GetLength(pString)) { length = USBGenericDescriptor_GetLength(pString); } USBD_Write(0, pString, length, ((length % pDevice->bMaxPacketSize0) == 0) ? TerminateCtrlInWithNull : 0, 0); } break; default: TRACE_WARNING( "USBDDriver_GetDescriptor: Unknown descriptor type (%d)\n\r", type); USBD_Stall(0); } } //------------------------------------------------------------------------------ /// Sets the active setting of the given interface if the configuration supports /// it; otherwise, the control pipe is STALLed. If the setting of an interface /// changes. /// \parma pDriver Pointer to a USBDDriver instance. /// \parma infnum Interface number. /// \parma setting New active setting for the interface. //------------------------------------------------------------------------------ static void SetInterface( USBDDriver *pDriver, unsigned char infnum, unsigned char setting) { // Make sure alternate settings are supported if (!pDriver->pInterfaces) { USBD_Stall(0); } else { // Change the current setting of the interface and trigger the callback // if necessary if (pDriver->pInterfaces[infnum] != setting) { pDriver->pInterfaces[infnum] = setting; USBDDriverCallbacks_InterfaceSettingChanged(infnum, setting); } // Acknowledge the request USBD_Write(0, 0, 0, 0, 0); } } //------------------------------------------------------------------------------ /// Sends the currently active setting of the given interface to the USB /// host. If alternate settings are not supported, this function STALLs the /// control pipe. /// \param pDriver Pointer to a USBDDriver instance. /// \param infnum Interface number. //------------------------------------------------------------------------------ static void GetInterface( const USBDDriver *pDriver, unsigned char infnum) { // Make sure alternate settings are supported, or STALL the control pipe if (!pDriver->pInterfaces) { USBD_Stall(0); } else { // Sends the current interface setting to the host USBD_Write(0, &(pDriver->pInterfaces[infnum]), 1, 0, 0); } } #if defined(BOARD_USB_UDPHS) || defined(BOARD_USB_OTGHS) //------------------------------------------------------------------------------ // Performs the selected test on the USB device (high-speed only). // \param test Test selector value. //------------------------------------------------------------------------------ static void USBDDriver_Test(unsigned char test) { TRACE_DEBUG("UDPHS_Test\n\r"); // the lower byte of wIndex must be zero // the most significant byte of wIndex is used to specify the specific test mode switch (test) { case USBFeatureRequest_TESTPACKET: //Test mode Test_Packet: //Upon command, a port must repetitively transmit the following test packet until //the exit action is taken. This enables the testing of rise and fall times, eye //patterns, jitter, and any other dynamic waveform specifications. //The test packet is made up by concatenating the following strings. //(Note: For J/K NRZI data, and for NRZ data, the bit on the left is the first one //transmitted. S indicates that a bit stuff occurs, which inserts an extra NRZI data bit. //* N is used to indicate N occurrences of a string of bits or symbols.) //A port in Test_Packet mode must send this packet repetitively. The inter-packet timing //must be no less than the minimum allowable inter-packet gap as defined in Section 7.1.18 and //no greater than 125 us. // Send ZLP USBD_Test(USBFeatureRequest_TESTSENDZLP); // Tst PACKET USBD_Test(USBFeatureRequest_TESTPACKET); while (1); //break; not reached case USBFeatureRequest_TESTJ: //Test mode Test_J: //Upon command, a ports transceiver must enter the high-speed J state and remain in that //state until the exit action is taken. This enables the testing of the high output drive //level on the D+ line. // Send ZLP USBD_Test(USBFeatureRequest_TESTSENDZLP); // Tst J USBD_Test(USBFeatureRequest_TESTJ); while (1); //break; not reached case USBFeatureRequest_TESTK: //Test mode Test_K: //Upon command, a ports transceiver must enter the high-speed K state and remain in //that state until the exit action is taken. This enables the testing of the high output drive //level on the D- line. // Send a ZLP USBD_Test(USBFeatureRequest_TESTSENDZLP); USBD_Test(USBFeatureRequest_TESTK); while (1); //break; not reached case USBFeatureRequest_TESTSE0NAK: //Test mode Test_SE0_NAK: //Upon command, a ports transceiver must enter the high-speed receive mode //and remain in that mode until the exit action is taken. This enables the testing //of output impedance, low level output voltage, and loading characteristics. //In addition, while in this mode, upstream facing ports (and only upstream facing ports) //must respond to any IN token packet with a NAK handshake (only if the packet CRC is //determined to be correct) within the normal allowed device response time. This enables testing of //the device squelch level circuitry and, additionally, provides a general purpose stimulus/response //test for basic functional testing. USBD_Test(USBFeatureRequest_TESTSE0NAK); // Send a ZLP USBD_Test(USBFeatureRequest_TESTSENDZLP); while (1); //break; not reached default: USBD_Stall( 0 ); break; } // The exit action is to power cycle the device. // The device must be disconnected from the host } #endif //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Initializes a USBDDriver instance with a list of descriptors. If /// interfaces can have multiple alternate settings, an array to store the /// current setting for each interface must be provided. /// \param pDriver Pointer to a USBDDriver instance. /// \param pDescriptors Pointer to a USBDDriverDescriptors instance. /// \param pInterfaces Pointer to an array for storing the current alternate /// setting of each interface (optional). //------------------------------------------------------------------------------ void USBDDriver_Initialize( USBDDriver *pDriver, const USBDDriverDescriptors *pDescriptors, unsigned char *pInterfaces) { pDriver->cfgnum = 0; #if (BOARD_USB_BMATTRIBUTES == USBConfigurationDescriptor_SELFPOWERED_RWAKEUP) \ || (BOARD_USB_BMATTRIBUTES == USBConfigurationDescriptor_BUSPOWERED_RWAKEUP) pDriver->isRemoteWakeUpEnabled = 1; #else pDriver->isRemoteWakeUpEnabled = 0; #endif pDriver->pDescriptors = pDescriptors; pDriver->pInterfaces = pInterfaces; // Initialize interfaces array if not null if (pInterfaces != 0) { memset(pInterfaces, sizeof(pInterfaces), 0); } } //------------------------------------------------------------------------------ /// Handles the given request if it is standard, otherwise STALLs it. /// \param pDriver Pointer to a USBDDriver instance. /// \param pRequest Pointer to a USBGenericRequest instance. //------------------------------------------------------------------------------ void USBDDriver_RequestHandler( USBDDriver *pDriver, const USBGenericRequest *pRequest) { unsigned char cfgnum; unsigned char infnum; unsigned char eptnum; unsigned char setting; unsigned char type; unsigned char idx; unsigned int length; unsigned int address; TRACE_INFO_WP("Std "); // Check request code switch (USBGenericRequest_GetRequest(pRequest)) { case USBGenericRequest_GETDESCRIPTOR: TRACE_INFO_WP("gDesc "); // Send the requested descriptor type = USBGetDescriptorRequest_GetDescriptorType(pRequest); idx = USBGetDescriptorRequest_GetDescriptorIndex(pRequest); length = USBGenericRequest_GetLength(pRequest); GetDescriptor(pDriver, type, idx, length); break; case USBGenericRequest_SETADDRESS: TRACE_INFO_WP("sAddr "); // Sends a zero-length packet and then set the device address address = USBSetAddressRequest_GetAddress(pRequest); USBD_Write(0, 0, 0, (TransferCallback) USBD_SetAddress, (void *) address); break; case USBGenericRequest_SETCONFIGURATION: TRACE_INFO_WP("sCfg "); // Set the requested configuration cfgnum = USBSetConfigurationRequest_GetConfiguration(pRequest); SetConfiguration(pDriver, cfgnum); break; case USBGenericRequest_GETCONFIGURATION: TRACE_INFO_WP("gCfg "); // Send the current configuration number GetConfiguration(pDriver); break; case USBGenericRequest_GETSTATUS: TRACE_INFO_WP("gSta "); // Check who is the recipient switch (USBGenericRequest_GetRecipient(pRequest)) { case USBGenericRequest_DEVICE: TRACE_INFO_WP("Dev "); // Send the device status GetDeviceStatus(pDriver); break; case USBGenericRequest_ENDPOINT: TRACE_INFO_WP("Ept "); // Send the endpoint status eptnum = USBGenericRequest_GetEndpointNumber(pRequest); GetEndpointStatus(eptnum); break; default: TRACE_WARNING( "USBDDriver_RequestHandler: Unknown recipient (%d)\n\r", USBGenericRequest_GetRecipient(pRequest)); USBD_Stall(0); } break; case USBGenericRequest_CLEARFEATURE: TRACE_INFO_WP("cFeat "); // Check which is the requested feature switch (USBFeatureRequest_GetFeatureSelector(pRequest)) { case USBFeatureRequest_ENDPOINTHALT: TRACE_INFO_WP("Hlt "); // Unhalt endpoint and send a zero-length packet USBD_Unhalt(USBGenericRequest_GetEndpointNumber(pRequest)); USBD_Write(0, 0, 0, 0, 0); break; case USBFeatureRequest_DEVICEREMOTEWAKEUP: TRACE_INFO_WP("RmWU "); // Disable remote wake-up and send a zero-length packet pDriver->isRemoteWakeUpEnabled = 0; USBD_Write(0, 0, 0, 0, 0); break; default: TRACE_WARNING( "USBDDriver_RequestHandler: Unknown feature selector (%d)\n\r", USBFeatureRequest_GetFeatureSelector(pRequest)); USBD_Stall(0); } break; case USBGenericRequest_SETFEATURE: TRACE_INFO_WP("sFeat "); // Check which is the selected feature switch (USBFeatureRequest_GetFeatureSelector(pRequest)) { case USBFeatureRequest_DEVICEREMOTEWAKEUP: TRACE_INFO_WP("RmWU "); // Enable remote wake-up and send a ZLP pDriver->isRemoteWakeUpEnabled = 1; USBD_Write(0, 0, 0, 0, 0); break; case USBFeatureRequest_ENDPOINTHALT: TRACE_INFO_WP("Halt "); // Halt endpoint USBD_Halt(USBGenericRequest_GetEndpointNumber(pRequest)); USBD_Write(0, 0, 0, 0, 0); break; #if defined(BOARD_USB_UDPHS) || defined(BOARD_USB_OTGHS) case USBFeatureRequest_TESTMODE: // 7.1.20 Test Mode Support if ((USBGenericRequest_GetType(pRequest) == USBGenericRequest_DEVICE) && ((USBGenericRequest_GetIndex(pRequest) & 0x000F) == 0)) { // Handle test request USBDDriver_Test(USBFeatureRequest_GetTestSelector(pRequest)); } else { USBD_Stall(0); } break; #endif #if defined(BOARD_USB_OTGHS) case USBFeatureRequest_OTG_B_HNP_ENABLE: TRACE_INFO_WP("OTG_B_HNP_ENABLE "); otg_features_supported |= 1<isRemoteWakeUpEnabled; } #if defined(BOARD_USB_OTGHS) //------------------------------------------------------------------------------ /// Return OTG features supported /// \return the OTG features //------------------------------------------------------------------------------ unsigned char USBDDriver_returnOTGFeatures(void) { return otg_features_supported; } //------------------------------------------------------------------------------ /// Clear OTG features supported /// \return none //------------------------------------------------------------------------------ void USBDDriver_clearOTGFeatures(void) { otg_features_supported = 0; } #endif tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/USBDDriver.h000066400000000000000000000103721207233610700264640ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose USB Device Driver class definition. !!!Usage -# Instanciate a USBDDriver object and initialize it using USBDDriver_Initialize. -# When a USB SETUP request is received, forward it to the standard driver using USBDDriver_RequestHandler. -# Check the Remote Wakeup setting via USBDDriver_IsRemoteWakeUpEnabled. */ #ifndef USBDDRIVER_H #define USBDDRIVER_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBDDriverDescriptors.h" #include //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// USB device driver structure, holding a list of descriptors identifying /// the device as well as the driver current state. //------------------------------------------------------------------------------ typedef struct { /// List of descriptors used by the device. const USBDDriverDescriptors *pDescriptors; /// Current setting for each interface. unsigned char *pInterfaces; /// Current configuration number (0 -> device is not configured). unsigned char cfgnum; /// Indicates if remote wake up has been enabled by the host. unsigned char isRemoteWakeUpEnabled; #if defined(BOARD_USB_OTGHS) /// Features supported by OTG unsigned char otg_features_supported; #endif } USBDDriver; //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern void USBDDriver_Initialize( USBDDriver *pDriver, const USBDDriverDescriptors *pDescriptors, unsigned char *pInterfaces); extern void USBDDriver_RequestHandler( USBDDriver *pDriver, const USBGenericRequest *pRequest); extern unsigned char USBDDriver_IsRemoteWakeUpEnabled(const USBDDriver *pDriver); #if defined(BOARD_USB_OTGHS) extern unsigned char USBDDriver_returnOTGFeatures(void); extern void USBDDriver_clearOTGFeatures(void); #endif #endif //#ifndef USBDDRIVER_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/USBDDriverCallbacks.h000066400000000000000000000056401207233610700302660ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of several callbacks which are triggered by the USB software driver after receiving specific requests. !!!Usage -# Re-implement the USBDDriverCallbacks_ConfigurationChanged callback to know when the hosts changes the active configuration of the device. -# Re-implement the USBDDriverCallbacks_InterfaceSettingChanged callback to get notified whenever the active setting of an interface is changed by the host. */ #ifndef USBDDRIVERCALLBACKS_H #define USBDDRIVERCALLBACKS_H //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ extern void USBDDriverCallbacks_ConfigurationChanged(unsigned char cfgnum); extern void USBDDriverCallbacks_InterfaceSettingChanged(unsigned char iface, unsigned char setting); #endif //#ifndef USBDDRIVERCALLBACKS_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/USBDDriverCb_CfgChanged.c000066400000000000000000000053221207233610700307540ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBDDriverCallbacks.h" #include //------------------------------------------------------------------------------ // Global functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Indicates that the current configuration of the device has changed. /// \param cfgnum New device configuration index. //------------------------------------------------------------------------------ void USBDDriverCallbacks_ConfigurationChanged(unsigned char cfgnum) { TRACE_INFO_WP("ConfigurationChanged "); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/USBDDriverCb_IfSettingChanged.c000066400000000000000000000054751207233610700321620ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBDDriverCallbacks.h" #include //------------------------------------------------------------------------------ // Global functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Notifies of a change in the currently active setting of an interface. /// \param interface Number of the interface whose setting has changed. /// \param setting New interface setting. //------------------------------------------------------------------------------ void USBDDriverCallbacks_InterfaceSettingChanged( unsigned char iface, unsigned char setting) { TRACE_INFO_WP("InterfaceSettingChanged "); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/USBDDriverDescriptors.h000066400000000000000000000102631207233610700307050ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Definition of a class for declaring USB descriptors required by the device driver. */ #ifndef USBDDRIVERDESCRIPTORS_H #define USBDDRIVERDESCRIPTORS_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include #include #include //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// List of all descriptors used by a USB device driver. Each descriptor can /// be provided in two versions: full-speed and high-speed. Devices which are /// not high-speed capable do not need to provided high-speed descriptors and /// the full-speed qualifier & other speed descriptors. //------------------------------------------------------------------------------ typedef struct { /// Pointer to the full-speed device descriptor. const USBDeviceDescriptor *pFsDevice; /// Pointer to the full-speed configuration descriptor. const USBConfigurationDescriptor *pFsConfiguration; /// Pointer to the full-speed qualifier descriptor. const USBDeviceQualifierDescriptor *pFsQualifier; /// Pointer to the full-speed other speed configuration descriptor. const USBConfigurationDescriptor *pFsOtherSpeed; /// Pointer to the high-speed device descriptor. const USBDeviceDescriptor *pHsDevice; /// Pointer to the high-speed configuration descriptor. const USBConfigurationDescriptor *pHsConfiguration; /// Pointer to the high-speed qualifier descriptor. const USBDeviceQualifierDescriptor *pHsQualifier; /// Pointer to the high-speed other speed configuration descriptor. const USBConfigurationDescriptor *pHsOtherSpeed; /// Pointer to the list of string descriptors. const unsigned char **pStrings; /// Number of string descriptors in list. unsigned char numStrings; } USBDDriverDescriptors; #endif //#ifndef USBDDRIVERDESCRIPTORS_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/USBD_OTGHS.c000066400000000000000000001745231207233610700262600ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBD.h" #include "USBDCallbacks.h" #include "USBDDriver.h" #include #include #include #include #include #include #include #include #if defined(BOARD_USB_OTGHS) //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ /// Maximum number of endpoints interrupts. #define NUM_IT_MAX \ (AT91C_BASE_OTGHS->OTGHS_IPFEATURES & AT91C_OTGHS_EPT_NBR_MAX) /// Maximum number of endpoint DMA interrupts #define NUM_IT_MAX_DMA \ ((AT91C_BASE_OTGHS->OTGHS_IPFEATURES & AT91C_OTGHS_DMA_CHANNEL_NBR)>>4) /// Bits that should be shifted to access DMA control bits. #define SHIFT_DMA 24 /// Bits that should be shifted to access interrupt bits. #define SHIFT_INTERUPT 12 /// Compile option, use DMA. Remove this define for not use DMA. #define DMA /// Max size of the FMA FIFO #define DMA_MAX_FIFO_SIZE 32768 #define EPT_VIRTUAL_SIZE 8192 //------------------------------------------------------------------------------ /// \page "Endpoint states" /// This page lists the endpoint states. /// !States // - UDP_ENDPOINT_DISABLED // - UDP_ENDPOINT_HALTED // - UDP_ENDPOINT_IDLE // - UDP_ENDPOINT_SENDING // - UDP_ENDPOINT_RECEIVING /// Endpoint states: Endpoint is disabled #define UDP_ENDPOINT_DISABLED 0 /// Endpoint states: Endpoint is halted (i.e. STALLs every request) #define UDP_ENDPOINT_HALTED 1 /// Endpoint states: Endpoint is idle (i.e. ready for transmission) #define UDP_ENDPOINT_IDLE 2 /// Endpoint states: Endpoint is sending data #define UDP_ENDPOINT_SENDING 3 /// Endpoint states: Endpoint is receiving data #define UDP_ENDPOINT_RECEIVING 4 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Structures //------------------------------------------------------------------------------ /// Describes an ongoing transfer on a UDP endpoint. typedef struct { /// Pointer to a data buffer used for emission/reception. char *pData; /// Number of bytes which have been written into the UDP internal FIFO /// buffers. volatile int buffered; /// Number of bytes which have been sent/received. volatile int transferred; /// Number of bytes which have not been buffered/transferred yet. volatile int remaining; /// Optional callback to invoke when the transfer completes. volatile TransferCallback fCallback; /// Optional argument to the callback function. void *pArgument; } Transfer; //------------------------------------------------------------------------------ /// Describes the state of an endpoint of the UDP controller. //------------------------------------------------------------------------------ typedef struct { /// Current endpoint state. volatile unsigned char state; /// Current reception bank (0 or 1). unsigned char bank; /// Maximum packet size for the endpoint. unsigned short size; /// Describes an ongoing transfer (if current state is either /// or ) Transfer transfer; /// Special case for send a ZLP unsigned char sendZLP; } Endpoint; //------------------------------------------------------------------------------ // Internal variables //------------------------------------------------------------------------------ /// Holds the internal state for each endpoint of the UDP. static Endpoint endpoints[BOARD_USB_NUMENDPOINTS]; /// Device current state. static unsigned char deviceState; /// Indicates the previous device state static unsigned char previousDeviceState; /// 7.1.20 Test Mode Support /// Test codes for the USB HS test mode. static const char test_packet_buffer[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // JKJKJKJK * 9 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, // JJKKJJKK * 8 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, // JJJJKKKK * 8 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // JJJJJJJKKKKKKK * 8 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD, // JJJJJJJK * 8 0xFC,0x7E,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0x7E // {JKKKKKKK * 10}, JK }; //------------------------------------------------------------------------------ // Internal Functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Enable UDPHS clock //------------------------------------------------------------------------------ static inline void OTGHS_EnableUsbClock( void ) { } //------------------------------------------------------------------------------ /// Disable UDPHS clock //------------------------------------------------------------------------------ static inline void OTGHS_DisableUsbClock( void ) { } //------------------------------------------------------------------------------ /// Enables the transceiver of the USB controller //------------------------------------------------------------------------------ static void OTGHS_EnableTransceiver(void) { AT91C_BASE_OTGHS->OTGHS_CTRL |= AT91C_OTGHS_OTGPADE; } //------------------------------------------------------------------------------ /// Disables the transceiver of the USB controller associated with the specified /// USB driver //------------------------------------------------------------------------------ static void OTGHS_DisableTransceiver(void) { AT91C_BASE_OTGHS->OTGHS_CTRL &= ~AT91C_OTGHS_OTGPADE; } //------------------------------------------------------------------------------ /// Handles a completed transfer on the given endpoint, invoking the /// configured callback if any. /// \param bEndpoint Number of the endpoint for which the transfer has completed. /// \param bStatus Status code returned by the transfer operation //------------------------------------------------------------------------------ static void OTGHS_EndOfTransfer( unsigned char bEndpoint, char bStatus ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); // Check that endpoint was sending or receiving data if( (pEndpoint->state == UDP_ENDPOINT_RECEIVING) || (pEndpoint->state == UDP_ENDPOINT_SENDING) ) { TRACE_DEBUG_WP("Eo"); if(pEndpoint->state == UDP_ENDPOINT_SENDING) { pEndpoint->sendZLP = 0; } // Endpoint returns in Idle state pEndpoint->state = UDP_ENDPOINT_IDLE; // Invoke callback is present if (pTransfer->fCallback != 0) { ((TransferCallback) pTransfer->fCallback) (pTransfer->pArgument, bStatus, pTransfer->transferred, pTransfer->remaining + pTransfer->buffered); } else { TRACE_DEBUG_WP("No callBack\n\r"); } } } //------------------------------------------------------------------------------ /// Transfers a data payload from the current tranfer buffer to the endpoint /// FIFO /// \param bEndpoint Number of the endpoint which is sending data. //------------------------------------------------------------------------------ static void OTGHS_WritePayload( unsigned char bEndpoint ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); char *pFifo; signed int size; unsigned int dCtr; pFifo = (char*)((unsigned int *)AT91C_BASE_OTGHS_EPTFIFO + (EPT_VIRTUAL_SIZE * bEndpoint)); // Get the number of bytes to send size = pEndpoint->size; if (size > pTransfer->remaining) { size = pTransfer->remaining; } // Update transfer descriptor information pTransfer->buffered += size; pTransfer->remaining -= size; // Write packet in the FIFO buffer dCtr = 0; while (size > 0) { pFifo[dCtr] = *(pTransfer->pData); pTransfer->pData++; size--; dCtr++; } } //------------------------------------------------------------------------------ /// Transfers a data payload from an endpoint FIFO to the current transfer buffer /// \param bEndpoint Endpoint number. /// \param wPacketSize Size of received data packet //------------------------------------------------------------------------------ static void OTGHS_ReadPayload( unsigned char bEndpoint, int wPacketSize ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); char *pFifo; unsigned char dBytes=0; pFifo = (char*)((unsigned int *)AT91C_BASE_OTGHS_EPTFIFO + (EPT_VIRTUAL_SIZE * bEndpoint)); // Check that the requested size is not bigger than the remaining transfer if (wPacketSize > pTransfer->remaining) { pTransfer->buffered += wPacketSize - pTransfer->remaining; wPacketSize = pTransfer->remaining; } // Update transfer descriptor information pTransfer->remaining -= wPacketSize; pTransfer->transferred += wPacketSize; // Retrieve packet while (wPacketSize > 0) { *(pTransfer->pData) = pFifo[dBytes]; pTransfer->pData++; wPacketSize--; dBytes++; } } //------------------------------------------------------------------------------ /// Received SETUP packet from endpoint 0 FIFO /// \param pRequest Generic USB SETUP request sent over Control endpoints //------------------------------------------------------------------------------ static void OTGHS_ReadRequest( USBGenericRequest *pRequest ) { unsigned int *pData = (unsigned int *)pRequest; unsigned int fifo; fifo = (AT91C_BASE_OTGHS_EPTFIFO->OTGHS_READEPT0[0]); *pData = fifo; fifo = (AT91C_BASE_OTGHS_EPTFIFO->OTGHS_READEPT0[0]); pData++; *pData = fifo; //TRACE_ERROR("SETUP: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n\r", pData[0],pData[1],pData[2],pData[3],pData[4],pData[5],pData[6],pData[7]); } //------------------------------------------------------------------------------ /// Reset all endpoint transfer descriptors //------------------------------------------------------------------------------ static void OTGHS_ResetEndpoints( void ) { Endpoint *pEndpoint; Transfer *pTransfer; unsigned char bEndpoint; // Reset the transfer descriptor of every endpoint for( bEndpoint = 0; bEndpoint < BOARD_USB_NUMENDPOINTS; bEndpoint++ ) { pEndpoint = &(endpoints[bEndpoint]); pTransfer = &(pEndpoint->transfer); // Reset endpoint transfer descriptor pTransfer->pData = 0; pTransfer->transferred = -1; pTransfer->buffered = -1; pTransfer->remaining = -1; pTransfer->fCallback = 0; pTransfer->pArgument = 0; // Reset endpoint state pEndpoint->bank = 0; pEndpoint->state = UDP_ENDPOINT_DISABLED; // Reset ZLP pEndpoint->sendZLP = 0; } } //------------------------------------------------------------------------------ /// Disable all endpoints (except control endpoint 0), aborting current /// transfers if necessary //------------------------------------------------------------------------------ static void OTGHS_DisableEndpoints( void ) { unsigned char bEndpoint; // Disable each endpoint, terminating any pending transfer // Control endpoint 0 is not disabled for( bEndpoint = 1; bEndpoint < BOARD_USB_NUMENDPOINTS; bEndpoint++ ) { OTGHS_EndOfTransfer( bEndpoint, USBD_STATUS_ABORTED ); endpoints[bEndpoint].state = UDP_ENDPOINT_DISABLED; } } //------------------------------------------------------------------------------ /// Endpoint interrupt handler. /// Handle IN/OUT transfers, received SETUP packets and STALLing /// \param bEndpoint Index of endpoint //------------------------------------------------------------------------------ static void OTGHS_EndpointHandler( unsigned char bEndpoint ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); unsigned int status = AT91C_BASE_OTGHS->OTGHS_DEVEPTISR[bEndpoint]; unsigned short wPacketSize; USBGenericRequest request; TRACE_DEBUG_WP("E%d ", bEndpoint); TRACE_DEBUG_WP("st:0x%X ", status); // Handle interrupts // IN packet sent if((AT91C_BASE_OTGHS->OTGHS_DEVEPTIMR[bEndpoint] & AT91C_OTGHS_TXINI) && (status & AT91C_OTGHS_TXINI )) { TRACE_DEBUG_WP("Wr "); // Check that endpoint was in Sending state if( pEndpoint->state == UDP_ENDPOINT_SENDING ) { if (pTransfer->buffered > 0) { pTransfer->transferred += pTransfer->buffered; pTransfer->buffered = 0; } if( ((pTransfer->buffered)==0) &&((pTransfer->transferred)==0) &&((pTransfer->remaining)==0) &&(pEndpoint->sendZLP == 0)) { pEndpoint->sendZLP = 1; } // End of transfer ? if( (pTransfer->remaining > 0) ||(pEndpoint->sendZLP == 1)) { pEndpoint->sendZLP = 2; // Transfer remaining data TRACE_DEBUG_WP(" %d ", pEndpoint->size); // Send next packet OTGHS_WritePayload(bEndpoint); // Send Token IN AT91C_BASE_OTGHS->OTGHS_DEVEPTICR[bEndpoint] = AT91C_OTGHS_TXINI; // For a non-control endpoint, the FIFOCON bit must be cleared // to start the transfer if ((AT91C_OTGHS_EPT_TYPE & AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[bEndpoint]) != AT91C_OTGHS_EPT_TYPE_CTL_EPT) { // Send IN AT91C_BASE_OTGHS->OTGHS_DEVEPTIDR[bEndpoint] = AT91C_OTGHS_FIFOCON; } } else { TRACE_DEBUG_WP("\n\r0pTransfer->buffered %d \n\r", pTransfer->buffered); TRACE_DEBUG_WP("0pTransfer->transferred %d \n\r", pTransfer->transferred); TRACE_DEBUG_WP("0pTransfer->remaining %d \n\r", pTransfer->remaining); TRACE_DEBUG_WP(" %d ", pTransfer->transferred); // Disable interrupt if this is not a control endpoint if ((AT91C_OTGHS_EPT_TYPE & AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[bEndpoint]) != AT91C_OTGHS_EPT_TYPE_CTL_EPT) { AT91C_BASE_OTGHS->OTGHS_DEVIDR = 1<OTGHS_DEVEPTIDR[bEndpoint] = AT91C_OTGHS_TXINI; OTGHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS); pEndpoint->sendZLP = 0; } } else { TRACE_DEBUG("Error Wr %d", pEndpoint->sendZLP); } } // OUT packet received if( AT91C_OTGHS_RXOUT == (status & AT91C_OTGHS_RXOUT) ) { // Check that the endpoint is in Receiving state if (pEndpoint->state != UDP_ENDPOINT_RECEIVING) { // Check if an ACK has been received on a Control endpoint if( ((AT91C_OTGHS_EPT_TYPE & AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[bEndpoint]) == AT91C_OTGHS_EPT_TYPE_CTL_EPT) && (0 == (status & AT91C_OTGHS_BYCT)) ) { // Control endpoint, 0 bytes received // Acknowledge the data and finish the current transfer TRACE_DEBUG_WP("Ack "); AT91C_BASE_OTGHS->OTGHS_DEVEPTICR[bEndpoint] = AT91C_OTGHS_RXOUT; AT91C_BASE_OTGHS->OTGHS_DEVEPTIDR[bEndpoint] = AT91C_OTGHS_RXOUT; //OTGHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS); } // Check if the data has been STALLed else if( AT91C_OTGHS_STALL == (status & AT91C_OTGHS_STALL)) { // Discard STALLed data TRACE_DEBUG_WP("Discard "); AT91C_BASE_OTGHS->OTGHS_DEVEPTICR[bEndpoint] = AT91C_OTGHS_RXOUT; } else { // NAK the data TRACE_DEBUG_WP("Nak "); AT91C_BASE_OTGHS->OTGHS_DEVIDR = 1<> 20) & 0x7FF); //TRACE_ERROR_WP("out:%d ", wPacketSize); OTGHS_ReadPayload(bEndpoint, wPacketSize); AT91C_BASE_OTGHS->OTGHS_DEVEPTICR[bEndpoint] = AT91C_OTGHS_RXOUT; if((AT91C_OTGHS_EPT_TYPE & AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[bEndpoint]) != AT91C_OTGHS_EPT_TYPE_CTL_EPT) { AT91C_BASE_OTGHS->OTGHS_DEVEPTIDR[bEndpoint] = AT91C_OTGHS_FIFOCON; } // Check if the transfer is finished if ((pTransfer->remaining == 0) || (wPacketSize < pEndpoint->size)) { AT91C_BASE_OTGHS->OTGHS_DEVEPTIDR[bEndpoint] = AT91C_OTGHS_RXOUT; // Disable interrupt if this is not a control endpoint if ((AT91C_OTGHS_EPT_TYPE & AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[bEndpoint]) != AT91C_OTGHS_EPT_TYPE_CTL_EPT) { AT91C_BASE_OTGHS->OTGHS_DEVIDR = 1<OTGHS_DEVEPTICR[bEndpoint] = AT91C_OTGHS_STALL; // If the endpoint is not halted, clear the STALL condition if (pEndpoint->state != UDP_ENDPOINT_HALTED) { TRACE_WARNING("_ " ); AT91C_BASE_OTGHS->OTGHS_DEVEPTIDR[bEndpoint] = AT91C_OTGHS_STALLRQ; } } // SETUP packet received if( AT91C_OTGHS_RXSTP == (status & AT91C_OTGHS_RXSTP) ) { TRACE_DEBUG_WP("Stp "); // If a transfer was pending, complete it // Handles the case where during the status phase of a control write // transfer, the host receives the device ZLP and ack it, but the ack // is not received by the device if ((pEndpoint->state == UDP_ENDPOINT_RECEIVING) || (pEndpoint->state == UDP_ENDPOINT_SENDING)) { OTGHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS); } // Copy the setup packet OTGHS_ReadRequest(&request); // Acknowledge setup packet AT91C_BASE_OTGHS->OTGHS_DEVEPTICR[bEndpoint] = AT91C_OTGHS_RXSTP; // Forward the request to the upper layer USBDCallbacks_RequestReceived(&request); } } //------------------------------------------------------------------------------ // Interrupt service routine //------------------------------------------------------------------------------ #ifdef DMA //---------------------------------------------------------------------------- /// Endpoint DMA interrupt handler. /// This function (ISR) handles dma interrupts /// \param bEndpoint Index of endpoint //---------------------------------------------------------------------------- static void OTGHS_DmaHandler( unsigned char bEndpoint ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); int justTransferred; unsigned int status; unsigned char result = USBD_STATUS_SUCCESS; status = AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMASTATUS; TRACE_DEBUG_WP("Dma Ept%d ", bEndpoint); // Disable DMA interrupt to avoid receiving 2 interrupts (B_EN and TR_EN) AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMACONTROL &= ~(AT91C_OTGHS_END_TR_EN | AT91C_OTGHS_END_B_EN); AT91C_BASE_OTGHS->OTGHS_DEVIDR = (1<buffered - ((status & AT91C_OTGHS_BUFF_COUNT) >> 16); pTransfer->transferred += justTransferred; pTransfer->buffered = ((status & AT91C_OTGHS_BUFF_COUNT) >> 16); pTransfer->remaining -= justTransferred; TRACE_DEBUG_WP("\n\r1pTransfer->buffered %d \n\r", pTransfer->buffered); TRACE_DEBUG_WP("1pTransfer->transferred %d \n\r", pTransfer->transferred); TRACE_DEBUG_WP("1pTransfer->remaining %d \n\r", pTransfer->remaining); if( (pTransfer->remaining + pTransfer->buffered) > 0 ) { // Prepare an other transfer if( pTransfer->remaining > DMA_MAX_FIFO_SIZE ) { pTransfer->buffered = DMA_MAX_FIFO_SIZE; } else { pTransfer->buffered = pTransfer->remaining; } AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMAADDRESS = (unsigned int)((pTransfer->pData) + (pTransfer->transferred)); // Clear unwanted interrupts AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMASTATUS; // Enable DMA endpoint interrupt AT91C_BASE_OTGHS->OTGHS_DEVIER = (1 << SHIFT_DMA << bEndpoint); // DMA config for receive the good size of buffer, or an error buffer AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMACONTROL = 0; // raz AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMACONTROL = ( ((pTransfer->buffered << 16) & AT91C_OTGHS_BUFF_COUNT) | AT91C_OTGHS_END_TR_EN | AT91C_OTGHS_END_TR_IT | AT91C_OTGHS_END_B_EN | AT91C_OTGHS_END_BUFFIT | AT91C_OTGHS_CHANN_ENB ); } } else if( AT91C_OTGHS_END_TR_ST == (status & AT91C_OTGHS_END_TR_ST) ) { TRACE_DEBUG_WP("EndTransf "); pTransfer->transferred = pTransfer->buffered - ((status & AT91C_OTGHS_BUFF_COUNT) >> 16); pTransfer->remaining = 0; TRACE_DEBUG_WP("\n\r0pTransfer->buffered %d \n\r", pTransfer->buffered); TRACE_DEBUG_WP("0pTransfer->transferred %d \n\r", pTransfer->transferred); TRACE_DEBUG_WP("0pTransfer->remaining %d \n\r", pTransfer->remaining); } else { TRACE_ERROR("OTGHS_DmaHandler: Error (0x%08X)\n\r", status); result = USBD_STATUS_ABORTED; } // Invoke callback if( pTransfer->remaining == 0 ) { TRACE_DEBUG_WP("EOT "); OTGHS_EndOfTransfer(bEndpoint, result); } } #endif //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// USB interrupt handler /// Manages device resume, suspend, end of bus reset. /// Forwards endpoint interrupts to the appropriate handler. //------------------------------------------------------------------------------ void RealUdphsIrqHandler(void) @spontaneous() { unsigned int status; unsigned char numIT; call UdphsInterruptWrapper.preamble(); if (deviceState >= USBD_STATE_POWERED) { //LED_Set(USBD_LEDUSB); //TOSH_SET_GREEN_LED_PIN(); } // Get interrupts status status = AT91C_BASE_OTGHS->OTGHS_SR & AT91C_BASE_OTGHS->OTGHS_CTRL & 0xFF; while (status != 0) { //TRACE_ERROR_WP("~"); if((status&AT91C_OTGHS_VBUSTI)==AT91C_OTGHS_VBUSTI) { TRACE_DEBUG_WP("__VBus\n\r"); USBD_Connect(); // Acknowledge the interrupt AT91C_BASE_OTGHS->OTGHS_SCR = AT91C_OTGHS_VBUSTI; } // Don't treat others interrupt for this time AT91C_BASE_OTGHS->OTGHS_SCR = AT91C_OTGHS_IDT | AT91C_OTGHS_SRP | AT91C_OTGHS_VBERR | AT91C_OTGHS_BCERR | AT91C_OTGHS_ROLEEX | AT91C_OTGHS_HNPERR | AT91C_OTGHS_STO; AT91C_BASE_OTGHS->OTGHS_CTRL &= ~(AT91C_OTGHS_IDT); status = AT91C_BASE_OTGHS->OTGHS_SR & AT91C_BASE_OTGHS->OTGHS_CTRL & 0xFF; } // Get OTG Device interrupts status status = AT91C_BASE_OTGHS->OTGHS_DEVISR & AT91C_BASE_OTGHS->OTGHS_DEVIMR; while (status != 0) { //TRACE_ERROR_WP("="); // Start Of Frame (SOF) if((status&AT91C_OTGHS_SOF)==AT91C_OTGHS_SOF) { TRACE_DEBUG_WP("SOF "); // Invoke the SOF callback //USB_StartOfFrameCallback(); // Acknowledge interrupt AT91C_BASE_OTGHS->OTGHS_DEVICR = AT91C_OTGHS_SOF; status &= ~AT91C_OTGHS_SOF; } // Suspend // This interrupt is always treated last (hence the '==') else if (status == AT91C_OTGHS_SUSP) { TRACE_DEBUG_WP("S"); // The device enters the Suspended state // MCK + UDPCK must be off // Pull-Up must be connected // Transceiver must be disabled //LED_Clear(USBD_LEDUSB); //TOSH_CLR_GREEN_LED_PIN(); // Enable wakeup AT91C_BASE_OTGHS->OTGHS_DEVIER = AT91C_OTGHS_EORST | AT91C_OTGHS_WAKEUP | AT91C_OTGHS_EORSM; // Acknowledge interrupt AT91C_BASE_OTGHS->OTGHS_DEVICR = AT91C_OTGHS_SUSP; previousDeviceState = deviceState; deviceState = USBD_STATE_SUSPENDED; OTGHS_DisableTransceiver(); OTGHS_DisableUsbClock(); // Invoke the Suspend callback USBDCallbacks_Suspended(); } // Resume else if( ((status & AT91C_OTGHS_WAKEUP) != 0) // line activity || ((status & AT91C_OTGHS_EORSM) != 0)) { // pc wakeup // Invoke the Resume callback USBDCallbacks_Resumed(); TRACE_DEBUG_WP("R"); OTGHS_EnableUsbClock(); OTGHS_EnableTransceiver(); // The device enters Configured state // MCK + UDPCK must be on // Pull-Up must be connected // Transceiver must be enabled deviceState = previousDeviceState; AT91C_BASE_OTGHS->OTGHS_DEVICR = (AT91C_OTGHS_WAKEUP | AT91C_OTGHS_EORSM | AT91C_OTGHS_SUSP); AT91C_BASE_OTGHS->OTGHS_DEVIER = (AT91C_OTGHS_EORST | AT91C_OTGHS_SUSP); AT91C_BASE_OTGHS->OTGHS_DEVICR = (AT91C_OTGHS_WAKEUP | AT91C_OTGHS_EORSM); AT91C_BASE_OTGHS->OTGHS_DEVIDR = AT91C_OTGHS_WAKEUP; } // End of bus reset else if ((status & AT91C_OTGHS_EORST) == AT91C_OTGHS_EORST) { TRACE_DEBUG_WP("EoB "); // The device enters the Default state deviceState = USBD_STATE_DEFAULT; // MCK + UDPCK are already enabled // Pull-Up is already connected // Transceiver must be enabled // Endpoint 0 must be enabled OTGHS_EnableTransceiver(); USBDDriver_clearOTGFeatures(); // The device leaves the Address & Configured states OTGHS_ResetEndpoints(); OTGHS_DisableEndpoints(); USBD_ConfigureEndpoint(0); // Flush and enable the Suspend interrupt AT91C_BASE_OTGHS->OTGHS_DEVICR = AT91C_OTGHS_WAKEUP | AT91C_OTGHS_SUSP; //// Enable the Start Of Frame (SOF) interrupt if needed //if (pCallbacks->startOfFrame != 0) //{ // AT91C_BASE_OTGHS->OTGHS_DEVIER |= AT91C_OTGHS_SOF; //} // Invoke the Reset callback USBDCallbacks_Reset(); // Acknowledge end of bus reset interrupt AT91C_BASE_OTGHS->OTGHS_DEVICR = AT91C_OTGHS_EORST; } // Handle upstream resume interrupt else if (status & AT91C_OTGHS_UPRSM) { TRACE_DEBUG_WP("ExtRes "); // - Acknowledge the IT AT91C_BASE_OTGHS->OTGHS_DEVICR = AT91C_OTGHS_UPRSM; } // Endpoint interrupts else { #ifndef DMA // Handle endpoint interrupts for (numIT = 0; numIT < NUM_IT_MAX; numIT++) { if ((status & (1 << SHIFT_INTERUPT << numIT)) != 0) { OTGHS_EndpointHandler(numIT); } } #else // Handle endpoint control interrupt if ((status & (1 << SHIFT_INTERUPT << 0)) != 0) { OTGHS_EndpointHandler( 0 ); } else { numIT = 1; while((status&(0x7E<OTGHS_DEVISR & AT91C_BASE_OTGHS->OTGHS_DEVIMR; TRACE_DEBUG_WP("\n\r"); if (status != 0) { TRACE_DEBUG_WP(" - "); } } if (deviceState >= USBD_STATE_POWERED) { //LED_Clear(USBD_LEDUSB); //TOSH_CLR_GREEN_LED_PIN(); } call UdphsInterruptWrapper.postamble(); } void UdphsIrqHandler(void) @C() @spontaneous() { call UdphsInterruptWrapper.preamble(); RealUdphsIrqHandler(); call UdphsInterruptWrapper.postamble(); } //------------------------------------------------------------------------------ /// Configure an endpoint with the provided endpoint descriptor /// \param pDdescriptor Pointer to the endpoint descriptor //------------------------------------------------------------------------------ void USBD_ConfigureEndpoint(const USBEndpointDescriptor *pDescriptor) { Endpoint *pEndpoint; unsigned char bEndpoint; unsigned char bType; unsigned char bEndpointDir; unsigned char bSizeEpt = 0; // NULL descriptor -> Control endpoint 0 if (pDescriptor == 0) { bEndpoint = 0; pEndpoint = &(endpoints[bEndpoint]); bType = USBEndpointDescriptor_CONTROL; bEndpointDir = 0; pEndpoint->size = BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0); pEndpoint->bank = BOARD_USB_ENDPOINTS_BANKS(0); } else { // The endpoint number bEndpoint = USBEndpointDescriptor_GetNumber(pDescriptor); pEndpoint = &(endpoints[bEndpoint]); // Transfer type: Control, Isochronous, Bulk, Interrupt bType = USBEndpointDescriptor_GetType(pDescriptor); // Direction, ignored for control endpoints bEndpointDir = USBEndpointDescriptor_GetDirection(pDescriptor); pEndpoint->size = USBEndpointDescriptor_GetMaxPacketSize(pDescriptor); pEndpoint->bank = BOARD_USB_ENDPOINTS_BANKS(bEndpoint); } // Abort the current transfer is the endpoint was configured and in // Write or Read state if( (pEndpoint->state == UDP_ENDPOINT_RECEIVING) || (pEndpoint->state == UDP_ENDPOINT_SENDING) ) { OTGHS_EndOfTransfer(bEndpoint, USBD_STATUS_RESET); } pEndpoint->state = UDP_ENDPOINT_IDLE; // Disable endpoint AT91C_BASE_OTGHS->OTGHS_DEVEPTIDR[bEndpoint] = AT91C_OTGHS_TXINI | AT91C_OTGHS_RXOUT | AT91C_OTGHS_RXSTP | AT91C_OTGHS_NAKOUT | AT91C_OTGHS_NAKIN | AT91C_OTGHS_OVERFL | AT91C_OTGHS_STALL | AT91C_OTGHS_SHRTPACK | AT91C_OTGHS_MADATA | AT91C_OTGHS_DATAX | AT91C_OTGHS_ERRTRANS | AT91C_OTGHS_NBUSYBK | AT91C_OTGHS_FIFOCON | AT91C_OTGHS_EPDISHDMA | AT91C_OTGHS_NYETDIS | AT91C_OTGHS_STALLRQ; // Reset Endpoint Fifos AT91C_BASE_OTGHS->OTGHS_DEVEPT |= (1<OTGHS_DEVEPT &= ~(1<size <= 8 ) { bSizeEpt = 0; } else if ( pEndpoint->size <= 16 ) { bSizeEpt = 1; } else if ( pEndpoint->size <= 32 ) { bSizeEpt = 2; } else if ( pEndpoint->size <= 64 ) { bSizeEpt = 3; } else if ( pEndpoint->size <= 128 ) { bSizeEpt = 4; } else if ( pEndpoint->size <= 256 ) { bSizeEpt = 5; } else if ( pEndpoint->size <= 512 ) { bSizeEpt = 6; } else if ( pEndpoint->size <= 1024 ) { bSizeEpt = 7; } //else { // sizeEpt = 0; // control endpoint //} // Enable endpoint AT91C_BASE_OTGHS->OTGHS_DEVEPT |= (1<OTGHS_DEVIER = 1<OTGHS_DEVEPTCFG[bEndpoint] = (bSizeEpt << 4) | (bEndpointDir << 8) | (bType << 11) | (((pEndpoint->bank)-1) << 2); if (bType == USBEndpointDescriptor_CONTROL) { AT91C_BASE_OTGHS->OTGHS_DEVEPTIER[bEndpoint] = AT91C_OTGHS_RXSTP; } #ifdef DMA else { AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[bEndpoint] |= AT91C_OTGHS_AUTOSW; } #endif AT91C_BASE_OTGHS->OTGHS_DEVEPTIDR[bEndpoint] = AT91C_OTGHS_NYETDIS;// with nyet //AT91C_BASE_OTGHS->OTGHS_DEVEPTIER[bEndpoint] = AT91C_OTGHS_NYETDIS; // without nyet // Check if the configuration is ok AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[bEndpoint] |= AT91C_OTGHS_ALLOC; if((AT91C_BASE_OTGHS->OTGHS_DEVEPTISR[bEndpoint]&AT91C_OTGHS_CFGOK)==0) { TRACE_ERROR("PB bEndpoint: 0x%X\n\r", bEndpoint); TRACE_ERROR("PB bSizeEpt: 0x%X\n\r", bSizeEpt); TRACE_ERROR("PB bEndpointDir: 0x%X\n\r", bEndpointDir); TRACE_ERROR("PB bType: 0x%X\n\r", bType); TRACE_ERROR("PB pEndpoint->bank: 0x%X\n\r", pEndpoint->bank); TRACE_ERROR("PB OTGHS_EPTCFG: 0x%X\n\r", AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[bEndpoint]); for(;;); } } //------------------------------------------------------------------------------ /// Sends data through an USB endpoint (IN) /// Sets up the transfer descriptor, write one or two data payloads /// (depending on the number of FIFO banks for the endpoint) and then /// starts the actual transfer. The operation is complete when all /// the data has been sent. /// \param bEndpoint Index of endpoint /// \param *pData Data to be written /// \param dLength Data length to be send /// \param fCallback Callback to be call after the success command /// \param *pArgument Callback argument /// \return USBD_STATUS_LOCKED or USBD_STATUS_SUCCESS //------------------------------------------------------------------------------ char USBD_Write( unsigned char bEndpoint, const void *pData, unsigned int dLength, TransferCallback fCallback, void *pArgument ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); //unsigned char i; //unsigned char * data; // Return if the endpoint is not in IDLE state if (pEndpoint->state != UDP_ENDPOINT_IDLE) { return USBD_STATUS_LOCKED; } TRACE_DEBUG_WP("Write%d(%d) ", bEndpoint, dLength); pEndpoint->sendZLP = 0; // Setup the transfer descriptor pTransfer->pData = (void *) pData; pTransfer->remaining = dLength; pTransfer->buffered = 0; pTransfer->transferred = 0; pTransfer->fCallback = fCallback; pTransfer->pArgument = pArgument; // Send one packet pEndpoint->state = UDP_ENDPOINT_SENDING; #ifdef DMA // Test if endpoint type control if (AT91C_OTGHS_EPT_TYPE_CTL_EPT == (AT91C_OTGHS_EPT_TYPE & AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[bEndpoint])) { #endif // Enable endpoint IT AT91C_BASE_OTGHS->OTGHS_DEVIER = (1<OTGHS_DEVEPTIER[bEndpoint] = AT91C_OTGHS_TXINI; #ifdef DMA } else { if( pTransfer->remaining == 0 ) { // DMA not handle ZLP AT91C_BASE_OTGHS->OTGHS_DEVEPTICR[bEndpoint] = AT91C_OTGHS_TXINI; // For a non-control endpoint, the FIFOCON bit must be cleared // to start the transfer if ((AT91C_OTGHS_EPT_TYPE & AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[bEndpoint]) != AT91C_OTGHS_EPT_TYPE_CTL_EPT) { AT91C_BASE_OTGHS->OTGHS_DEVEPTIDR[bEndpoint] = AT91C_OTGHS_FIFOCON; } AT91C_BASE_OTGHS->OTGHS_DEVEPTIDR[bEndpoint] = AT91C_OTGHS_TXINI; // Enable endpoint IT AT91C_BASE_OTGHS->OTGHS_DEVIER = (1<remaining > DMA_MAX_FIFO_SIZE ) { // Transfer the max pTransfer->buffered = DMA_MAX_FIFO_SIZE; } else { // Transfer the good size pTransfer->buffered = pTransfer->remaining; } TRACE_DEBUG_WP("\n\r_WR:%d ", pTransfer->remaining ); TRACE_DEBUG_WP("B:%d ", pTransfer->buffered ); TRACE_DEBUG_WP("T:%d ", pTransfer->transferred ); AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMAADDRESS = (unsigned int)(pTransfer->pData); // Clear unwanted interrupts AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMASTATUS; // Enable DMA endpoint interrupt AT91C_BASE_OTGHS->OTGHS_DEVIER = (1<OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMACONTROL = 0; // raz AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMACONTROL = (((pTransfer->buffered<<16)&AT91C_OTGHS_BUFF_LENGTH) | AT91C_OTGHS_END_B_EN | AT91C_OTGHS_END_BUFFIT | AT91C_OTGHS_CHANN_ENB); } } #endif return USBD_STATUS_SUCCESS; } //------------------------------------------------------------------------------ /// Reads incoming data on an USB endpoint (OUT) /// \param bEndpoint Index of endpoint /// \param *pData Data to be readen /// \param dLength Data length to be receive /// \param fCallback Callback to be call after the success command /// \param *pArgument Callback argument /// \return USBD_STATUS_LOCKED or USBD_STATUS_SUCCESS //------------------------------------------------------------------------------ char USBD_Read( unsigned char bEndpoint, void *pData, unsigned int dLength, TransferCallback fCallback, void *pArgument ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); // Return if the endpoint is not in IDLE state if (pEndpoint->state != UDP_ENDPOINT_IDLE) { return USBD_STATUS_LOCKED; } TRACE_DEBUG_WP("Read%d(%d) ", bEndpoint, dLength); //TRACE_ERROR_WP("Read%d(%d) ", bEndpoint, dLength); // Endpoint enters Receiving state pEndpoint->state = UDP_ENDPOINT_RECEIVING; // Set the transfer descriptor pTransfer->pData = pData; pTransfer->remaining = dLength; pTransfer->buffered = 0; pTransfer->transferred = 0; pTransfer->fCallback = fCallback; pTransfer->pArgument = pArgument; #ifdef DMA // Test if endpoint type control if (AT91C_OTGHS_EPT_TYPE_CTL_EPT == (AT91C_OTGHS_EPT_TYPE & AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[bEndpoint])) { #endif // Control endpoint // Enable endpoint IT AT91C_BASE_OTGHS->OTGHS_DEVIER = (1<OTGHS_DEVEPTIER[bEndpoint] = AT91C_OTGHS_RXOUT; #ifdef DMA } else { TRACE_DEBUG_WP("Read%d(%d) ", bEndpoint, dLength); // Others endpoints (not control) if( pTransfer->remaining > DMA_MAX_FIFO_SIZE ) { // Transfer the max pTransfer->buffered = DMA_MAX_FIFO_SIZE; } else { // Transfer the good size pTransfer->buffered = pTransfer->remaining; } AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMAADDRESS = (unsigned int)(pTransfer->pData); // Clear unwanted interrupts AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMASTATUS; // Enable DMA endpoint interrupt AT91C_BASE_OTGHS->OTGHS_DEVIER = (1<remaining ); TRACE_DEBUG_WP("B:%d ", pTransfer->buffered ); TRACE_DEBUG_WP("T:%d ", pTransfer->transferred ); // DMA config AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMACONTROL = 0; // raz AT91C_BASE_OTGHS->OTGHS_DEVDMA[bEndpoint].OTGHS_DEVDMACONTROL = (((pTransfer->buffered<<16)&AT91C_OTGHS_BUFF_LENGTH) | AT91C_OTGHS_END_TR_EN | AT91C_OTGHS_END_TR_IT | AT91C_OTGHS_END_B_EN | AT91C_OTGHS_END_BUFFIT | AT91C_OTGHS_CHANN_ENB); } #endif return USBD_STATUS_SUCCESS; } //------------------------------------------------------------------------------ /// Put endpoint into Halt state /// \param bEndpoint Index of endpoint //------------------------------------------------------------------------------ void USBD_Halt( unsigned char bEndpoint ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); TRACE_INFO("usbd_Halt%d ", bEndpoint); //TRACE_ERROR("usbd_Halt%d ", bEndpoint); // Check that endpoint is enabled and not already in Halt state if( (pEndpoint->state != UDP_ENDPOINT_DISABLED) && (pEndpoint->state != UDP_ENDPOINT_HALTED) ) { TRACE_INFO("Halt%d ", bEndpoint); // Abort the current transfer if necessary OTGHS_EndOfTransfer(bEndpoint, USBD_STATUS_ABORTED); pEndpoint->state = UDP_ENDPOINT_HALTED; // Put endpoint into Halt state AT91C_BASE_OTGHS->OTGHS_DEVEPTIER[bEndpoint] = AT91C_OTGHS_STALLRQ; AT91C_BASE_OTGHS->OTGHS_DEVEPTIER[bEndpoint] = AT91C_OTGHS_STALL; } } //------------------------------------------------------------------------------ /// Clears the Halt feature on the given endpoint. /// \param bEndpoint Index of endpoint //------------------------------------------------------------------------------ void USBD_Unhalt( unsigned char bEndpoint ) { unsigned int cfgSav; Endpoint *pEndpoint = &(endpoints[bEndpoint]); // Check if the endpoint is enabled if (pEndpoint->state != UDP_ENDPOINT_DISABLED) { TRACE_DEBUG_WP("Unhalt%d ", bEndpoint); //TRACE_ERROR("Unhalt%d ", bEndpoint); // Return endpoint to Idle state pEndpoint->state = UDP_ENDPOINT_IDLE; cfgSav = AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[bEndpoint]; // Reset Endpoint Fifos AT91C_BASE_OTGHS->OTGHS_DEVEPT |= (1<OTGHS_DEVEPT &= ~(1<OTGHS_DEVEPTCFG[bEndpoint] = cfgSav; if((AT91C_BASE_OTGHS->OTGHS_DEVEPTISR[bEndpoint]&AT91C_OTGHS_CFGOK)==0) { TRACE_ERROR("PB bEndpoint: 0x%X\n\r", bEndpoint); for(;;); } // Reset data-toggle AT91C_BASE_OTGHS->OTGHS_DEVEPTIER[bEndpoint] = AT91C_OTGHS_RSTDT; // Clear FORCESTALL flag // Disable stall on endpoint AT91C_BASE_OTGHS->OTGHS_DEVEPTIDR[bEndpoint] = AT91C_OTGHS_STALLRQ; AT91C_BASE_OTGHS->OTGHS_DEVEPTICR[bEndpoint] = AT91C_OTGHS_STALL; } } //------------------------------------------------------------------------------ /// Returns the current Halt status of an endpoint. /// \param bEndpoint Index of endpoint /// \return 1 if the endpoint is currently halted; otherwise 0 //------------------------------------------------------------------------------ unsigned char USBD_IsHalted( unsigned char bEndpoint ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); unsigned char status = 0; if (pEndpoint->state == UDP_ENDPOINT_HALTED) { status = 1; } return( status ); } //------------------------------------------------------------------------------ /// IS High Speed device working in High Speed ? /// \return 1 if the device is in High Speed; otherwise 0 (Full Speed) //------------------------------------------------------------------------------ unsigned char USBD_IsHighSpeed( void ) { unsigned char status = 0; if(AT91C_OTGHS_SPEED_SR_HS == (AT91C_BASE_OTGHS->OTGHS_SR & (0x03<<12))) { // High Speed TRACE_DEBUG_WP("High Speed\n\r"); status = 1; } else { TRACE_DEBUG_WP("Full Speed\n\r"); } return( status ); } //------------------------------------------------------------------------------ /// Causes the endpoint to acknowledge the next received packet with a STALL /// handshake. /// Further packets are then handled normally. /// \param bEndpoint Index of endpoint /// \return Operation result code: USBD_STATUS_LOCKED or USBD_STATUS_SUCCESS //------------------------------------------------------------------------------ unsigned char USBD_Stall( unsigned char bEndpoint ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); // Check that endpoint is in Idle state if (pEndpoint->state != UDP_ENDPOINT_IDLE) { TRACE_WARNING("UDP_Stall: Endpoint%d locked\n\r", bEndpoint); return USBD_STATUS_LOCKED; } TRACE_DEBUG_WP("Stall%d ", bEndpoint); AT91C_BASE_OTGHS->OTGHS_DEVEPTIER[bEndpoint] = AT91C_OTGHS_STALLRQ; return USBD_STATUS_SUCCESS; } //------------------------------------------------------------------------------ /// Activates a remote wakeup procedure //------------------------------------------------------------------------------ void USBD_RemoteWakeUp(void) { TRACE_DEBUG_WP("Remote WakeUp\n\r"); // Device is currently suspended if (deviceState == USBD_STATE_SUSPENDED) { TRACE_DEBUG_WP("RW\n\r"); OTGHS_EnableUsbClock(); OTGHS_EnableTransceiver(); // Activates a remote wakeup AT91C_BASE_OTGHS->OTGHS_DEVCTRL |= AT91C_OTGHS_RMWKUP; } // Device is NOT suspended else { TRACE_WARNING("USBD_RemoteWakeUp: Device is not suspended\n\r"); } } //------------------------------------------------------------------------------ /// Sets the device address /// \param address Adress to be set //------------------------------------------------------------------------------ void USBD_SetAddress( unsigned char address ) { TRACE_DEBUG_WP("SetAddr(%d) ", address); // Set address AT91C_BASE_OTGHS->OTGHS_DEVCTRL &= ~(AT91C_OTGHS_UADD); AT91C_BASE_OTGHS->OTGHS_DEVCTRL |= address & AT91C_OTGHS_UADD; AT91C_BASE_OTGHS->OTGHS_DEVCTRL |= AT91C_OTGHS_ADDEN; // If the address is 0, the device returns to the Default state if (address == 0) { deviceState = USBD_STATE_DEFAULT; } // If the address is non-zero, the device enters the Address state else { deviceState = USBD_STATE_ADDRESS; } } //------------------------------------------------------------------------------ /// Changes the device state from Address to Configured, or from Configured /// to Address. /// This method directly access the last received SETUP packet to decide on /// what to do. /// \param cfgnum configuration number //------------------------------------------------------------------------------ void USBD_SetConfiguration( unsigned char cfgnum ) { TRACE_DEBUG_WP("SetCfg(%d) ", cfgnum); // Check the request if( cfgnum != 0 ) { // Enter Configured state deviceState = USBD_STATE_CONFIGURED; } // If the configuration number is zero, the device goes back to the Address // state else { // Go back to Address state deviceState = USBD_STATE_ADDRESS; // Abort all transfers OTGHS_DisableEndpoints(); } } //------------------------------------------------------------------------------ /// Enables the pull-up on the D+ line to connect the device to the USB. //------------------------------------------------------------------------------ void USBD_Connect( void ) { TRACE_DEBUG_WP("Conn "); #if defined(BOARD_USB_PULLUP_INTERNAL) AT91C_BASE_OTGHS->OTGHS_DEVCTRL &= ~AT91C_OTGHS_DETACH; #else #error "not defined" #endif } //------------------------------------------------------------------------------ /// Disables the pull-up on the D+ line to disconnect the device from the bus. //------------------------------------------------------------------------------ void USBD_Disconnect( void ) { TRACE_DEBUG_WP("Disc "); #if defined(BOARD_USB_PULLUP_INTERNAL) AT91C_BASE_OTGHS->OTGHS_DEVCTRL |= AT91C_OTGHS_DETACH; #else #error "not defined" #endif // Device returns to the Powered state if (deviceState > USBD_STATE_POWERED) { deviceState = USBD_STATE_POWERED; } } //------------------------------------------------------------------------------ /// Certification test for High Speed device. /// \param bIndex Test to be done //------------------------------------------------------------------------------ void USBD_Test( unsigned char bIndex ) { char *pFifo; unsigned char i; AT91C_BASE_OTGHS->OTGHS_DEVIDR &= ~AT91C_OTGHS_SUSP; AT91C_BASE_OTGHS->OTGHS_DEVCTRL |= AT91C_OTGHS_SPDCONF_HS; // remove suspend ? switch( bIndex ) { case USBFeatureRequest_TESTPACKET: TRACE_DEBUG_WP("TEST_PACKET "); AT91C_BASE_OTGHS->OTGHS_DEVDMA[1].OTGHS_DEVDMACONTROL = 0; // raz AT91C_BASE_OTGHS->OTGHS_DEVDMA[2].OTGHS_DEVDMACONTROL = 0; // raz // Configure endpoint 2, 64 bytes, direction IN, type BULK, 1 bank AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[2] = AT91C_OTGHS_EPT_SIZE_64 | AT91C_OTGHS_EPT_DIR_IN | AT91C_OTGHS_EPT_TYPE_BUL_EPT | AT91C_OTGHS_BK_NUMBER_1; // Check if the configuration is ok AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[2] |= AT91C_OTGHS_ALLOC; while((AT91C_BASE_OTGHS->OTGHS_DEVEPTISR[2]&AT91C_OTGHS_CFGOK)==0) { } AT91C_BASE_OTGHS->OTGHS_DEVEPT |= AT91C_OTGHS_EPEN2; // Write FIFO pFifo = (char*)((unsigned int *)AT91C_BASE_OTGHS_EPTFIFO + (EPT_VIRTUAL_SIZE * 2)); for( i=0; iOTGHS_DEVCTRL |= AT91C_OTGHS_TSTPCKT; // Send packet AT91C_BASE_OTGHS->OTGHS_DEVEPTICR[2] = AT91C_OTGHS_TXINI; break; case USBFeatureRequest_TESTJ: TRACE_DEBUG_WP("TEST_J "); AT91C_BASE_OTGHS->OTGHS_DEVCTRL |= AT91C_OTGHS_TSTJ; break; case USBFeatureRequest_TESTK: TRACE_DEBUG_WP("TEST_K "); AT91C_BASE_OTGHS->OTGHS_DEVCTRL |= AT91C_OTGHS_TSTK; break; case USBFeatureRequest_TESTSE0NAK: TRACE_DEBUG_WP("TEST_SEO_NAK "); AT91C_BASE_OTGHS->OTGHS_DEVIDR = 0xFFFFFFFF; break; case USBFeatureRequest_TESTSENDZLP: //while( 0 != (AT91C_BASE_UDPHS->UDPHS_EPT[0].UDPHS_EPTSTA & AT91C_UDPHS_TX_PK_RDY ) ) {} AT91C_BASE_OTGHS->OTGHS_DEVEPTICR[0] = AT91C_OTGHS_TXINI; //while( 0 != (AT91C_BASE_UDPHS->UDPHS_EPT[0].UDPHS_EPTSTA & AT91C_UDPHS_TX_PK_RDY ) ) {} TRACE_DEBUG_WP("SEND_ZLP "); break; } TRACE_DEBUG_WP("\n\r"); } //------------------------------------------------------------------------------ /// Initializes the specified USB driver /// This function initializes the current FIFO bank of endpoints, /// configures the pull-up and VBus lines, disconnects the pull-up and /// then trigger the Init callback. //------------------------------------------------------------------------------ void USBD_Init(void) { // forceFS must not be used ! int i; TRACE_DEBUG_WP("USBD Init()\n\r"); // disable Watchdog AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // Enable USB macro *AT91C_OTGHS_CTRL |= AT91C_OTGHS_USBECTRL; // Automatic mode speed for device *AT91C_OTGHS_DEVCTRL &= ~AT91C_OTGHS_SPDCONF_FS; // Normal mode *AT91C_OTGHS_DEVCTRL &= ~( AT91C_OTGHS_LS | AT91C_OTGHS_TSTJ | AT91C_OTGHS_TSTK | AT91C_OTGHS_TSTPCKT | AT91C_OTGHS_OPMODE2 ); // Normal mode AT91C_BASE_OTGHS->OTGHS_DEVCTRL = 0; AT91C_BASE_OTGHS->OTGHS_HSTCTRL = 0; // Enable OTG pad *AT91C_OTGHS_CTRL |= AT91C_OTGHS_OTGPADE; // Enable clock OTG pad *AT91C_OTGHS_CTRL &= ~AT91C_OTGHS_FRZCLKCTRL; //Usb_disable(); AT91C_BASE_OTGHS->OTGHS_CTRL &= ~AT91C_OTGHS_USBECTRL; AT91C_BASE_OTGHS->OTGHS_CTRL &= ~AT91C_OTGHS_OTGPADE; AT91C_BASE_OTGHS->OTGHS_CTRL |= AT91C_OTGHS_FRZCLKCTRL; //Usb_enable(); AT91C_BASE_OTGHS->OTGHS_CTRL |= AT91C_OTGHS_USBECTRL; AT91C_BASE_OTGHS->OTGHS_CTRL |= AT91C_OTGHS_OTGPADE; AT91C_BASE_OTGHS->OTGHS_CTRL &= ~AT91C_OTGHS_FRZCLKCTRL; //Usb_select_device(); AT91C_BASE_OTGHS->OTGHS_CTRL &= ~AT91C_OTGHS_UIDE; AT91C_BASE_OTGHS->OTGHS_CTRL |= AT91C_OTGHS_UIMOD; // Device is in the Attached state deviceState = USBD_STATE_SUSPENDED; previousDeviceState = USBD_STATE_POWERED; PMC_EnablePeripheral(AT91C_ID_OTGHS); // Reset endpoint structures OTGHS_ResetEndpoints(); // Enables the USB Clock OTGHS_EnableUsbClock(); //926C // Enable USB macro and clear all other bit AT91C_BASE_OTGHS->OTGHS_CTRL |= AT91C_OTGHS_USBECTRL; AT91C_BASE_OTGHS->OTGHS_CTRL = AT91C_OTGHS_USBECTRL; // Configure the pull-up on D+ and disconnect it USBD_Disconnect(); // Enable clock OTG pad AT91C_BASE_OTGHS->OTGHS_CTRL &= ~AT91C_OTGHS_FRZCLKCTRL; TRACE_DEBUG("AT91C_OTGHS_CTRL: 0x%X\n\r", AT91C_BASE_OTGHS->OTGHS_CTRL ); // Clear General IT AT91C_BASE_OTGHS->OTGHS_SCR = 0x01FF; // Clear OTG Device IT AT91C_BASE_OTGHS->OTGHS_DEVICR = 0xFF; // Clear OTG Host IT AT91C_BASE_OTGHS->OTGHS_HSTICR = 0x7F; // Reset all Endpoints Fifos AT91C_BASE_OTGHS->OTGHS_DEVEPT |= (0x7F<<16); AT91C_BASE_OTGHS->OTGHS_DEVEPT &= ~(0x7F<<16); // Disable all endpoints AT91C_BASE_OTGHS->OTGHS_DEVEPT &= ~0x7F; AT91C_BASE_OTGHS->OTGHS_TSTA2 = 0; // Device is in the Attached state deviceState = USBD_STATE_SUSPENDED; previousDeviceState = USBD_STATE_POWERED; // Automatic mode speed for device AT91C_BASE_OTGHS->OTGHS_DEVCTRL &= ~AT91C_OTGHS_SPDCONF_FS; // Force Full Speed mode for device //*AT91C_OTGHS_DEVCTRL = AT91C_OTGHS_SPDCONF_FS; // Force High Speed mode for device //*AT91C_OTGHS_DEVCTRL = AT91C_OTGHS_SPDCONF_HS; AT91C_BASE_OTGHS->OTGHS_DEVCTRL &= ~( AT91C_OTGHS_LS | AT91C_OTGHS_TSTJ | AT91C_OTGHS_TSTK | AT91C_OTGHS_TSTPCKT | AT91C_OTGHS_OPMODE2 ); // Automatic mode speed for host AT91C_BASE_OTGHS->OTGHS_HSTCTRL &= ~AT91C_OTGHS_SPDCONF_HST_FS; // Force Full Speed mode for host //AT91C_BASE_OTGHS->OTGHS_HSTCTRL = AT91C_OTGHS_SPDCONF_HST_FS; // Force High Speed mode for host //*AT91C_BASE_OTGHS->OTGHS_HSTCTRL = AT91C_OTGHS_SPDCONF_HST_HS; // Enable the UID pin select AT91C_BASE_OTGHS->OTGHS_CTRL |= AT91C_OTGHS_UIDE; // Enable USB macro AT91C_BASE_OTGHS->OTGHS_CTRL |= AT91C_OTGHS_USBECTRL; // Enable OTG pad AT91C_BASE_OTGHS->OTGHS_CTRL |= AT91C_OTGHS_OTGPADE; // Enable clock OTG pad AT91C_BASE_OTGHS->OTGHS_CTRL &= ~AT91C_OTGHS_FRZCLKCTRL; // With OR without DMA !!! // Initialization of DMA for( i=1; i<=((AT91C_BASE_OTGHS->OTGHS_IPFEATURES & AT91C_OTGHS_DMA_CHANNEL_NBR)>>4); i++ ) { // RESET endpoint canal DMA: // DMA stop channel command AT91C_BASE_OTGHS->OTGHS_DEVDMA[i].OTGHS_DEVDMACONTROL = 0; // STOP command // Disable endpoint AT91C_BASE_OTGHS->OTGHS_DEVEPTIDR[i] = 0XFFFFFFFF; // Reset endpoint config AT91C_BASE_OTGHS->OTGHS_DEVEPTCFG[i] = 0; // Reset DMA channel (Buff count and Control field) AT91C_BASE_OTGHS->OTGHS_DEVDMA[i].OTGHS_DEVDMACONTROL = 0x02; // NON STOP command // Reset DMA channel 0 (STOP) AT91C_BASE_OTGHS->OTGHS_DEVDMA[i].OTGHS_DEVDMACONTROL = 0; // STOP command // Clear DMA channel status (read the register for clear it) AT91C_BASE_OTGHS->OTGHS_DEVDMA[i].OTGHS_DEVDMASTATUS = AT91C_BASE_OTGHS->OTGHS_DEVDMA[i].OTGHS_DEVDMASTATUS; } // Configure interrupts USBDCallbacks_Initialized(); AT91C_BASE_OTGHS->OTGHS_CTRL |= AT91C_OTGHS_VBUSTI; TRACE_DEBUG("AT91C_OTGHS_CTRL: 0x%X\n\r", AT91C_BASE_OTGHS->OTGHS_CTRL ); TRACE_DEBUG("AT91C_OTGHS_SR: 0x%X\n\r", AT91C_BASE_OTGHS->OTGHS_SR ); AT91C_BASE_OTGHS->OTGHS_DEVIER = AT91C_OTGHS_WAKEUP; TRACE_DEBUG("NUM_IT_MAX_DMA: 0x%X\n\r", NUM_IT_MAX_DMA ); TRACE_DEBUG("NUM_IT_MAX: 0x%X\n\r", NUM_IT_MAX ); } //------------------------------------------------------------------------------ /// Returns the current state of the USB device. /// \return Device current state. //------------------------------------------------------------------------------ unsigned char USBD_GetState( void ) { return deviceState; } #endif // BOARD_USB_OTGHS tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/USBD_UDP.c000066400000000000000000001266211207233610700260200ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \unit !!!Purpose Implementation of USB device functions on a UDP controller. See "USBD API Methods". */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBD.h" #include "USBDCallbacks.h" #include #include #include #include #include #include #if defined(BOARD_USB_UDP) //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "UDP register field values" /// /// This page lists the initialize values of UDP registers. /// /// !Values /// - UDP_RXDATA /// Bit mask for both banks of the UDP_CSR register. #define UDP_RXDATA (AT91C_UDP_RX_DATA_BK0 | AT91C_UDP_RX_DATA_BK1) //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "Endpoint states" /// /// This page lists the endpoint states. /// /// !States // - UDP_ENDPOINT_DISABLED // - UDP_ENDPOINT_HALTED // - UDP_ENDPOINT_IDLE // - UDP_ENDPOINT_SENDING // - UDP_ENDPOINT_RECEIVING /// Endpoint states: Endpoint is disabled #define UDP_ENDPOINT_DISABLED 0 /// Endpoint states: Endpoint is halted (i.e. STALLs every request) #define UDP_ENDPOINT_HALTED 1 /// Endpoint states: Endpoint is idle (i.e. ready for transmission) #define UDP_ENDPOINT_IDLE 2 /// Endpoint states: Endpoint is sending data #define UDP_ENDPOINT_SENDING 3 /// Endpoint states: Endpoint is receiving data #define UDP_ENDPOINT_RECEIVING 4 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// \page "UDP_CSR register access" /// /// This page lists the macroes to access UDP CSR register. /// /// !Macros /// - CLEAR_CSR /// - SET_CSR /// Bitmap for all status bits in CSR. #define REG_NO_EFFECT_1_ALL AT91C_UDP_RX_DATA_BK0 | AT91C_UDP_RX_DATA_BK1 \ |AT91C_UDP_STALLSENT | AT91C_UDP_RXSETUP \ |AT91C_UDP_TXCOMP /// Clears the specified bit(s) in the UDP_CSR register. /// \param endpoint The endpoint number of the CSR to process. /// \param flags The bitmap to set to 1. #define SET_CSR(endpoint, flags) \ { \ volatile unsigned int reg; \ reg = AT91C_BASE_UDP->UDP_CSR[endpoint] ; \ reg |= REG_NO_EFFECT_1_ALL; \ reg |= (flags); \ AT91C_BASE_UDP->UDP_CSR[endpoint] = reg; \ while ( (AT91C_BASE_UDP->UDP_CSR[endpoint] & (flags)) != (flags)); \ } /// Sets the specified bit(s) in the UDP_CSR register. /// \param endpoint The endpoint number of the CSR to process. /// \param flags The bitmap to clear to 0. #define CLEAR_CSR(endpoint, flags) \ { \ volatile unsigned int reg; \ reg = AT91C_BASE_UDP->UDP_CSR[endpoint]; \ reg |= REG_NO_EFFECT_1_ALL; \ reg &= ~(flags); \ AT91C_BASE_UDP->UDP_CSR[endpoint] = reg; \ while ( (AT91C_BASE_UDP->UDP_CSR[endpoint] & (flags)) == (flags)); \ } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ /// Describes an ongoing transfer on a UDP endpoint. typedef struct { /// Pointer to a data buffer used for emission/reception. char *pData; /// Number of bytes which have been written into the UDP internal FIFO /// buffers. volatile int buffered; /// Number of bytes which have been sent/received. volatile int transferred; /// Number of bytes which have not been buffered/transferred yet. volatile int remaining; /// Optional callback to invoke when the transfer completes. volatile TransferCallback fCallback; /// Optional argument to the callback function. void *pArgument; } Transfer; //------------------------------------------------------------------------------ /// Describes the state of an endpoint of the UDP controller. //------------------------------------------------------------------------------ typedef struct { /// Current endpoint state. volatile unsigned char state; /// Current reception bank (0 or 1). volatile unsigned char bank; /// Maximum packet size for the endpoint. volatile unsigned short size; /// Describes an ongoing transfer (if current state is either /// or ) Transfer transfer; } Endpoint; //------------------------------------------------------------------------------ // Internal variables //------------------------------------------------------------------------------ /// Holds the internal state for each endpoint of the UDP. static Endpoint endpoints[BOARD_USB_NUMENDPOINTS]; /// Device current state. static unsigned char deviceState; /// Indicates the previous device state static unsigned char previousDeviceState; //------------------------------------------------------------------------------ // Internal Functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Enables the clock of the UDP peripheral. //------------------------------------------------------------------------------ static inline void UDP_EnablePeripheralClock(void) { AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_UDP; } //------------------------------------------------------------------------------ /// Disables the UDP peripheral clock. //------------------------------------------------------------------------------ static inline void UDP_DisablePeripheralClock(void) { AT91C_BASE_PMC->PMC_PCDR = 1 << AT91C_ID_UDP; } //------------------------------------------------------------------------------ /// Enables the 48MHz USB clock. //------------------------------------------------------------------------------ static inline void UDP_EnableUsbClock(void) { AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP; } //------------------------------------------------------------------------------ /// Disables the 48MHz USB clock. //------------------------------------------------------------------------------ static inline void UDP_DisableUsbClock(void) { AT91C_BASE_PMC->PMC_SCDR = AT91C_PMC_UDP; } //------------------------------------------------------------------------------ /// Enables the UDP transceiver. //------------------------------------------------------------------------------ static inline void UDP_EnableTransceiver(void) { AT91C_BASE_UDP->UDP_TXVC &= ~AT91C_UDP_TXVDIS; } //------------------------------------------------------------------------------ /// Disables the UDP transceiver. //------------------------------------------------------------------------------ static inline void UDP_DisableTransceiver(void) { AT91C_BASE_UDP->UDP_TXVC |= AT91C_UDP_TXVDIS; } //------------------------------------------------------------------------------ /// Handles a completed transfer on the given endpoint, invoking the /// configured callback if any. /// \param bEndpoint Number of the endpoint for which the transfer has completed. /// \param bStatus Status code returned by the transfer operation //------------------------------------------------------------------------------ static void UDP_EndOfTransfer(unsigned char bEndpoint, char bStatus) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); // Check that endpoint was sending or receiving data if( (pEndpoint->state == UDP_ENDPOINT_RECEIVING) || (pEndpoint->state == UDP_ENDPOINT_SENDING)) { TRACE_DEBUG_WP("Eo"); // Endpoint returns in Idle state pEndpoint->state = UDP_ENDPOINT_IDLE; // Invoke callback is present if (pTransfer->fCallback != 0) { ((TransferCallback) pTransfer->fCallback) (pTransfer->pArgument, bStatus, pTransfer->transferred, pTransfer->remaining + pTransfer->buffered); } else { TRACE_DEBUG_WP("No callBack\n\r"); } } } //------------------------------------------------------------------------------ /// Clears the correct reception flag (bank 0 or bank 1) of an endpoint /// \param bEndpoint Index of endpoint //------------------------------------------------------------------------------ static void UDP_ClearRxFlag(unsigned char bEndpoint) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); // Clear flag and change banks if (pEndpoint->bank == 0) { CLEAR_CSR(bEndpoint, AT91C_UDP_RX_DATA_BK0); // Swap bank if in dual-fifo mode if (BOARD_USB_ENDPOINTS_BANKS(bEndpoint) > 1) { pEndpoint->bank = 1; } } else { CLEAR_CSR(bEndpoint, AT91C_UDP_RX_DATA_BK1); pEndpoint->bank = 0; } } //------------------------------------------------------------------------------ /// Transfers a data payload from the current tranfer buffer to the endpoint /// FIFO /// \param bEndpoint Number of the endpoint which is sending data. //------------------------------------------------------------------------------ static void UDP_WritePayload(unsigned char bEndpoint) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); signed int size; // Get the number of bytes to send size = pEndpoint->size; if (size > pTransfer->remaining) { size = pTransfer->remaining; } // Update transfer descriptor information pTransfer->buffered += size; pTransfer->remaining -= size; // Write packet in the FIFO buffer while (size > 0) { AT91C_BASE_UDP->UDP_FDR[bEndpoint] = *(pTransfer->pData); pTransfer->pData++; size--; } } //------------------------------------------------------------------------------ /// Transfers a data payload from an endpoint FIFO to the current transfer buffer /// \param bEndpoint Endpoint number. /// \param wPacketSize Size of received data packet //------------------------------------------------------------------------------ static void UDP_ReadPayload(unsigned char bEndpoint, int wPacketSize) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); // Check that the requested size is not bigger than the remaining transfer if (wPacketSize > pTransfer->remaining) { pTransfer->buffered += wPacketSize - pTransfer->remaining; wPacketSize = pTransfer->remaining; } // Update transfer descriptor information pTransfer->remaining -= wPacketSize; pTransfer->transferred += wPacketSize; // Retrieve packet while (wPacketSize > 0) { *(pTransfer->pData) = (char) AT91C_BASE_UDP->UDP_FDR[bEndpoint]; pTransfer->pData++; wPacketSize--; } } //------------------------------------------------------------------------------ /// Received SETUP packet from endpoint 0 FIFO /// \param pRequest Generic USB SETUP request sent over Control endpoints //------------------------------------------------------------------------------ static void UDP_ReadRequest(USBGenericRequest *pRequest) { unsigned char *pData = (unsigned char *)pRequest; unsigned int i; // Copy packet for (i = 0; i < 8; i++) { *pData = (unsigned char) AT91C_BASE_UDP->UDP_FDR[0]; pData++; } } //------------------------------------------------------------------------------ /// Reset all endpoint transfer descriptors //------------------------------------------------------------------------------ static void UDP_ResetEndpoints( void ) { Endpoint *pEndpoint; Transfer *pTransfer; unsigned char bEndpoint; // Reset the transfer descriptor of every endpoint for (bEndpoint = 0; bEndpoint < BOARD_USB_NUMENDPOINTS; bEndpoint++) { pEndpoint = &(endpoints[bEndpoint]); pTransfer = &(pEndpoint->transfer); // Reset endpoint transfer descriptor pTransfer->pData = 0; pTransfer->transferred = -1; pTransfer->buffered = -1; pTransfer->remaining = -1; pTransfer->fCallback = 0; pTransfer->pArgument = 0; // Reset endpoint state pEndpoint->bank = 0; pEndpoint->state = UDP_ENDPOINT_DISABLED; } } //------------------------------------------------------------------------------ /// Disable all endpoints (except control endpoint 0), aborting current /// transfers if necessary //------------------------------------------------------------------------------ static void UDP_DisableEndpoints( void ) { unsigned char bEndpoint; // Disable each endpoint, terminating any pending transfer // Control endpoint 0 is not disabled for (bEndpoint = 1; bEndpoint < BOARD_USB_NUMENDPOINTS; bEndpoint++) { UDP_EndOfTransfer(bEndpoint, USBD_STATUS_ABORTED); endpoints[bEndpoint].state = UDP_ENDPOINT_DISABLED; } } //------------------------------------------------------------------------------ /// Checks if an ongoing transfer on an endpoint has been completed. /// \param bEndpoint Endpoint number. /// \return 1 if the current transfer on the given endpoint is complete; /// otherwise 0. //------------------------------------------------------------------------------ static unsigned char UDP_IsTransferFinished(unsigned char bEndpoint) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); // Check if it is a Control endpoint // -> Control endpoint must always finish their transfer with a zero-length // packet if ((AT91C_BASE_UDP->UDP_CSR[bEndpoint] & AT91C_UDP_EPTYPE) == AT91C_UDP_EPTYPE_CTRL) { return (pTransfer->buffered < pEndpoint->size); } // Other endpoints only need to transfer all the data else { return (pTransfer->buffered <= pEndpoint->size) && (pTransfer->remaining == 0); } } //------------------------------------------------------------------------------ /// Endpoint interrupt handler. /// Handle IN/OUT transfers, received SETUP packets and STALLing /// \param bEndpoint Index of endpoint //------------------------------------------------------------------------------ static void UDP_EndpointHandler(unsigned char bEndpoint) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); unsigned int status = AT91C_BASE_UDP->UDP_CSR[bEndpoint]; unsigned short wPacketSize; USBGenericRequest request; TRACE_DEBUG_WP("E%d ", bEndpoint); TRACE_DEBUG_WP("st:0x%X ", status); // Handle interrupts // IN packet sent if ((status & AT91C_UDP_TXCOMP) != 0) { TRACE_DEBUG_WP("Wr "); // Check that endpoint was in Sending state if (pEndpoint->state == UDP_ENDPOINT_SENDING) { // End of transfer ? if (UDP_IsTransferFinished(bEndpoint)) { pTransfer->transferred += pTransfer->buffered; pTransfer->buffered = 0; // Disable interrupt if this is not a control endpoint if ((status & AT91C_UDP_EPTYPE) != AT91C_UDP_EPTYPE_CTRL) { AT91C_BASE_UDP->UDP_IDR = 1 << bEndpoint; } UDP_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS); CLEAR_CSR(bEndpoint, AT91C_UDP_TXCOMP); } else { // Transfer remaining data TRACE_DEBUG_WP(" %d ", pEndpoint->size); pTransfer->transferred += pEndpoint->size; pTransfer->buffered -= pEndpoint->size; // Send next packet if (BOARD_USB_ENDPOINTS_BANKS(bEndpoint) == 1) { // No double buffering UDP_WritePayload(bEndpoint); SET_CSR(bEndpoint, AT91C_UDP_TXPKTRDY); CLEAR_CSR(bEndpoint, AT91C_UDP_TXCOMP); } else { // Double buffering SET_CSR(bEndpoint, AT91C_UDP_TXPKTRDY); CLEAR_CSR(bEndpoint, AT91C_UDP_TXCOMP); UDP_WritePayload(bEndpoint); } } } else { // Acknowledge interrupt TRACE_ERROR("Error Wr"); CLEAR_CSR(bEndpoint, AT91C_UDP_TXCOMP); } } // OUT packet received if ((status & UDP_RXDATA) != 0) { TRACE_DEBUG_WP("Rd "); // Check that the endpoint is in Receiving state if (pEndpoint->state != UDP_ENDPOINT_RECEIVING) { // Check if an ACK has been received on a Control endpoint if (((status & AT91C_UDP_EPTYPE) == AT91C_UDP_EPTYPE_CTRL) && ((status & AT91C_UDP_RXBYTECNT) == 0)) { // Acknowledge the data and finish the current transfer UDP_ClearRxFlag(bEndpoint); UDP_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS); } // Check if the data has been STALLed else if ((status & AT91C_UDP_FORCESTALL) != 0) { // Discard STALLed data TRACE_DEBUG_WP("Discard "); UDP_ClearRxFlag(bEndpoint); } // NAK the data else { TRACE_DEBUG_WP("Nak "); AT91C_BASE_UDP->UDP_IDR = 1 << bEndpoint; } } // Endpoint is in Read state else { // Retrieve data and store it into the current transfer buffer wPacketSize = (unsigned short) (status >> 16); TRACE_DEBUG_WP("%d ", wPacketSize); UDP_ReadPayload(bEndpoint, wPacketSize); UDP_ClearRxFlag(bEndpoint); // Check if the transfer is finished if ((pTransfer->remaining == 0) || (wPacketSize < pEndpoint->size)) { // Disable interrupt if this is not a control endpoint if ((status & AT91C_UDP_EPTYPE) != AT91C_UDP_EPTYPE_CTRL) { AT91C_BASE_UDP->UDP_IDR = 1 << bEndpoint; } UDP_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS); } } } // STALL sent if ((status & AT91C_UDP_STALLSENT) != 0) { TRACE_WARNING( "Sta 0x%X [%d] ", status, bEndpoint); // If the endpoint is not halted, clear the STALL condition CLEAR_CSR(bEndpoint, AT91C_UDP_STALLSENT); if (pEndpoint->state != UDP_ENDPOINT_HALTED) { TRACE_WARNING( "_ " ); CLEAR_CSR(bEndpoint, AT91C_UDP_FORCESTALL); } } // SETUP packet received if ((status & AT91C_UDP_RXSETUP) != 0) { TRACE_DEBUG_WP("Stp "); // If a transfer was pending, complete it // Handles the case where during the status phase of a control write // transfer, the host receives the device ZLP and ack it, but the ack // is not received by the device if ((pEndpoint->state == UDP_ENDPOINT_RECEIVING) || (pEndpoint->state == UDP_ENDPOINT_SENDING)) { UDP_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS); } // Copy the setup packet UDP_ReadRequest(&request); // Set the DIR bit before clearing RXSETUP in Control IN sequence if (USBGenericRequest_GetDirection(&request) == USBGenericRequest_IN) { SET_CSR(bEndpoint, AT91C_UDP_DIR); } // Acknowledge setup packet CLEAR_CSR(bEndpoint, AT91C_UDP_RXSETUP); // Forward the request to the upper layer USBDCallbacks_RequestReceived(&request); } } //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// USB interrupt handler /// Manages device resume, suspend, end of bus reset. /// Forwards endpoint interrupts to the appropriate handler. //------------------------------------------------------------------------------ void RealUdphsIrqHandler() @spontaneous() { unsigned int status; int eptnum = 0; // Get interrupt status // Some interrupts may get masked depending on the device state status = AT91C_BASE_UDP->UDP_ISR; status &= AT91C_BASE_UDP->UDP_IMR; if (deviceState < USBD_STATE_POWERED) { status &= AT91C_UDP_WAKEUP | AT91C_UDP_RXRSM; AT91C_BASE_UDP->UDP_ICR = ~status; } // Return immediately if there is no interrupt to service if (status == 0) { return; } // Toggle USB LED if the device is active if (deviceState >= USBD_STATE_POWERED) { //LED_Set(USBD_LEDUSB); //TOSH_SET_GREEN_LED_PIN(); } // Service interrupts //// Start Of Frame (SOF) //if (ISSET(dStatus, AT91C_UDP_SOFINT)) { // // TRACE_DEBUG("SOF"); // // // Invoke the SOF callback // USB_StartOfFrameCallback(pUsb); // // // Acknowledge interrupt // AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_SOFINT; // dStatus &= ~AT91C_UDP_SOFINT; //} // Suspend // This interrupt is always treated last (hence the '==') if (status == AT91C_UDP_RXSUSP) { TRACE_INFO_WP("Susp "); // Don't do anything if the device is already suspended if (deviceState != USBD_STATE_SUSPENDED) { // The device enters the Suspended state // Enable wakeup AT91C_BASE_UDP->UDP_IER = AT91C_UDP_WAKEUP | AT91C_UDP_RXRSM; // Acknowledge interrupt AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_RXSUSP; // Switch to the Suspended state previousDeviceState = deviceState; deviceState = USBD_STATE_SUSPENDED; // Invoke the Suspended callback USBDCallbacks_Suspended(); UDP_DisableTransceiver(); UDP_DisablePeripheralClock(); UDP_DisableUsbClock(); } } // Resume else if ((status & (AT91C_UDP_WAKEUP | AT91C_UDP_RXRSM)) != 0) { TRACE_INFO_WP("Res "); // Don't do anything if the device was not suspended if (deviceState == USBD_STATE_SUSPENDED) { // The device enters its previous state UDP_EnablePeripheralClock(); UDP_EnableUsbClock(); // Enable the transceiver if the device was past the Default // state deviceState = previousDeviceState; if (deviceState >= USBD_STATE_DEFAULT) { UDP_EnableTransceiver(); // Invoke the Resume callback USBDCallbacks_Resumed(); } } // Clear and disable resume interrupts AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_WAKEUP | AT91C_UDP_RXRSM | AT91C_UDP_RXSUSP; AT91C_BASE_UDP->UDP_IDR = AT91C_UDP_WAKEUP | AT91C_UDP_RXRSM; } // End of bus reset else if ((status & AT91C_UDP_ENDBUSRES) != 0) { TRACE_INFO_WP("EoBRes "); // The device enters the Default state deviceState = USBD_STATE_DEFAULT; UDP_EnableTransceiver(); UDP_ResetEndpoints(); UDP_DisableEndpoints(); USBD_ConfigureEndpoint(0); // Flush and enable the Suspend interrupt AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_WAKEUP | AT91C_UDP_RXRSM | AT91C_UDP_RXSUSP; AT91C_BASE_UDP->UDP_IER = AT91C_UDP_RXSUSP; //// Enable the Start Of Frame (SOF) interrupt if needed //if (pUsb->pCallbacks->startOfFrame != 0) { // // AT91C_BASE_UDP->UDP_IER = AT91C_UDP_SOFINT; //} // Invoke the Reset callback USBDCallbacks_Reset(); // Acknowledge end of bus reset interrupt AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_ENDBUSRES; } // Endpoint interrupts else { while (status != 0) { // Check if endpoint has a pending interrupt if ((status & (1 << eptnum)) != 0) { UDP_EndpointHandler(eptnum); status &= ~(1 << eptnum); if (status != 0) { TRACE_INFO_WP("\n\r - "); } } eptnum++; } } // Toggle LED back to its previous state TRACE_INFO_WP("\n\r"); if (deviceState >= USBD_STATE_POWERED) { //LED_Clear(USBD_LEDUSB); //TOSH_CLR_GREEN_LED_PIN(); } } void UdphsIrqHandler(void) @C() @spontaneous() { call UdphsInterruptWrapper.preamble(); RealUdphsIrqHandler(); call UdphsInterruptWrapper.postamble(); } //------------------------------------------------------------------------------ /// Configures an endpoint according to its Endpoint Descriptor. /// \param pDescriptor Pointer to an Endpoint descriptor. //------------------------------------------------------------------------------ void USBD_ConfigureEndpoint(const USBEndpointDescriptor *pDescriptor) { Endpoint *pEndpoint; unsigned char bEndpoint; unsigned char bType; unsigned char bEndpointDir; // NULL descriptor -> Control endpoint 0 if (pDescriptor == 0) { bEndpoint = 0; pEndpoint = &(endpoints[bEndpoint]); bType= USBEndpointDescriptor_CONTROL; bEndpointDir = 0; pEndpoint->size = BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0); } else { bEndpoint = USBEndpointDescriptor_GetNumber(pDescriptor); pEndpoint = &(endpoints[bEndpoint]); bType = USBEndpointDescriptor_GetType(pDescriptor); bEndpointDir = USBEndpointDescriptor_GetDirection(pDescriptor); pEndpoint->size = USBEndpointDescriptor_GetMaxPacketSize(pDescriptor); } // Abort the current transfer is the endpoint was configured and in // Write or Read state if ((pEndpoint->state == UDP_ENDPOINT_RECEIVING) || (pEndpoint->state == UDP_ENDPOINT_SENDING)) { UDP_EndOfTransfer(bEndpoint, USBD_STATUS_RESET); } pEndpoint->state = UDP_ENDPOINT_IDLE; // Reset Endpoint Fifos AT91C_BASE_UDP->UDP_RSTEP |= (1 << bEndpoint); AT91C_BASE_UDP->UDP_RSTEP &= ~(1 << bEndpoint); // Configure endpoint if (bType != USBEndpointDescriptor_CONTROL) { SET_CSR(bEndpoint, (unsigned int)AT91C_UDP_EPEDS | (bType << 8) | (bEndpointDir << 10)); } else { SET_CSR(bEndpoint, (bType << 8) | (bEndpointDir << 10)); AT91C_BASE_UDP->UDP_IER = (1 << bEndpoint); } TRACE_INFO_WP("CfgEpt%d ", bEndpoint); } //------------------------------------------------------------------------------ /// Sends data through a USB endpoint. Sets up the transfer descriptor, /// writes one or two data payloads (depending on the number of FIFO bank /// for the endpoint) and then starts the actual transfer. The operation is /// complete when all the data has been sent. /// /// *If the size of the buffer is greater than the size of the endpoint /// (or twice the size if the endpoint has two FIFO banks), then the buffer /// must be kept allocated until the transfer is finished*. This means that /// it is not possible to declare it on the stack (i.e. as a local variable /// of a function which returns after starting a transfer). /// /// \param bEndpoint Endpoint number. /// \param pData Pointer to a buffer with the data to send. /// \param dLength Size of the data buffer. /// \param fCallback Optional callback function to invoke when the transfer is /// complete. /// \param pArgument Optional argument to the callback function. /// \return USBD_STATUS_SUCCESS if the transfer has been started; /// otherwise, the corresponding error status code. //------------------------------------------------------------------------------ char USBD_Write( unsigned char bEndpoint, const void *pData, unsigned int dLength, TransferCallback fCallback, void *pArgument ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); // Check that the endpoint is in Idle state if (pEndpoint->state != UDP_ENDPOINT_IDLE) { return USBD_STATUS_LOCKED; } TRACE_DEBUG_WP("Write%d(%d) ", bEndpoint, dLength); // Setup the transfer descriptor pTransfer->pData = (void *) pData; pTransfer->remaining = dLength; pTransfer->buffered = 0; pTransfer->transferred = 0; pTransfer->fCallback = fCallback; pTransfer->pArgument = pArgument; // Send the first packet pEndpoint->state = UDP_ENDPOINT_SENDING; while((AT91C_BASE_UDP->UDP_CSR[bEndpoint]&AT91C_UDP_TXPKTRDY)==AT91C_UDP_TXPKTRDY); UDP_WritePayload(bEndpoint); SET_CSR(bEndpoint, AT91C_UDP_TXPKTRDY); // If double buffering is enabled and there is data remaining, // prepare another packet if ((BOARD_USB_ENDPOINTS_BANKS(bEndpoint) > 1) && (pTransfer->remaining > 0)) { UDP_WritePayload(bEndpoint); } // Enable interrupt on endpoint AT91C_BASE_UDP->UDP_IER = 1 << bEndpoint; return USBD_STATUS_SUCCESS; } //------------------------------------------------------------------------------ /// Reads incoming data on an USB endpoint This methods sets the transfer /// descriptor and activate the endpoint interrupt. The actual transfer is /// then carried out by the endpoint interrupt handler. The Read operation /// finishes either when the buffer is full, or a short packet (inferior to /// endpoint maximum size) is received. /// /// *The buffer must be kept allocated until the transfer is finished*. /// \param bEndpoint Endpoint number. /// \param pData Pointer to a data buffer. /// \param dLength Size of the data buffer in bytes. /// \param fCallback Optional end-of-transfer callback function. /// \param pArgument Optional argument to the callback function. /// \return USBD_STATUS_SUCCESS if the read operation has been started; /// otherwise, the corresponding error code. //------------------------------------------------------------------------------ char USBD_Read(unsigned char bEndpoint, void *pData, unsigned int dLength, TransferCallback fCallback, void *pArgument) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); // Return if the endpoint is not in IDLE state if (pEndpoint->state != UDP_ENDPOINT_IDLE) { return USBD_STATUS_LOCKED; } // Endpoint enters Receiving state pEndpoint->state = UDP_ENDPOINT_RECEIVING; TRACE_DEBUG_WP("Read%d(%d) ", bEndpoint, dLength); // Set the transfer descriptor pTransfer->pData = pData; pTransfer->remaining = dLength; pTransfer->buffered = 0; pTransfer->transferred = 0; pTransfer->fCallback = fCallback; pTransfer->pArgument = pArgument; // Enable interrupt on endpoint AT91C_BASE_UDP->UDP_IER = 1 << bEndpoint; return USBD_STATUS_SUCCESS; } //------------------------------------------------------------------------------ /// Sets the HALT feature on the given endpoint (if not already in this state). /// \param bEndpoint Endpoint number. //------------------------------------------------------------------------------ void USBD_Halt(unsigned char bEndpoint) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); // Check that endpoint is enabled and not already in Halt state if ((pEndpoint->state != UDP_ENDPOINT_DISABLED) && (pEndpoint->state != UDP_ENDPOINT_HALTED)) { TRACE_DEBUG_WP("Halt%d ", bEndpoint); // Abort the current transfer if necessary UDP_EndOfTransfer(bEndpoint, USBD_STATUS_ABORTED); // Put endpoint into Halt state SET_CSR(bEndpoint, AT91C_UDP_FORCESTALL); pEndpoint->state = UDP_ENDPOINT_HALTED; // Enable the endpoint interrupt AT91C_BASE_UDP->UDP_IER = 1 << bEndpoint; } } //------------------------------------------------------------------------------ /// Clears the Halt feature on the given endpoint. /// \param bEndpoint Index of endpoint //------------------------------------------------------------------------------ void USBD_Unhalt(unsigned char bEndpoint) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); // Check if the endpoint is enabled if (pEndpoint->state != UDP_ENDPOINT_DISABLED) { TRACE_DEBUG_WP("Unhalt%d ", bEndpoint); // Return endpoint to Idle state pEndpoint->state = UDP_ENDPOINT_IDLE; // Clear FORCESTALL flag CLEAR_CSR(bEndpoint, AT91C_UDP_FORCESTALL); // Reset Endpoint Fifos, beware this is a 2 steps operation AT91C_BASE_UDP->UDP_RSTEP |= 1 << bEndpoint; AT91C_BASE_UDP->UDP_RSTEP &= ~(1 << bEndpoint); } } //------------------------------------------------------------------------------ /// Returns the current Halt status of an endpoint. /// \param bEndpoint Index of endpoint /// \return 1 if the endpoint is currently halted; otherwise 0 //------------------------------------------------------------------------------ unsigned char USBD_IsHalted(unsigned char bEndpoint) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); unsigned char status = 0; if (pEndpoint->state == UDP_ENDPOINT_HALTED) { status = 1; } return( status ); } //------------------------------------------------------------------------------ /// Indicates if the device is running in high or full-speed. Always returns 0 /// since UDP does not support high-speed mode. //------------------------------------------------------------------------------ unsigned char USBD_IsHighSpeed(void) { return 0; } //------------------------------------------------------------------------------ /// Causes the given endpoint to acknowledge the next packet it receives /// with a STALL handshake. /// \param bEndpoint Endpoint number. /// \return USBD_STATUS_SUCCESS or USBD_STATUS_LOCKED. //------------------------------------------------------------------------------ unsigned char USBD_Stall(unsigned char bEndpoint) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); // Check that endpoint is in Idle state if (pEndpoint->state != UDP_ENDPOINT_IDLE) { TRACE_WARNING("UDP_Stall: Endpoint%d locked\n\r", bEndpoint); return USBD_STATUS_LOCKED; } TRACE_DEBUG_WP("Stall%d ", bEndpoint); SET_CSR(bEndpoint, AT91C_UDP_FORCESTALL); return USBD_STATUS_SUCCESS; } //------------------------------------------------------------------------------ /// Starts a remote wake-up procedure. //------------------------------------------------------------------------------ void USBD_RemoteWakeUp(void) { UDP_EnablePeripheralClock(); UDP_EnableUsbClock(); UDP_EnableTransceiver(); TRACE_INFO_WP("RWUp "); // Activates a remote wakeup (edge on ESR), then clear ESR AT91C_BASE_UDP->UDP_GLBSTATE |= AT91C_UDP_ESR; AT91C_BASE_UDP->UDP_GLBSTATE &= ~AT91C_UDP_ESR; } //------------------------------------------------------------------------------ /// Sets the device address to the given value. /// \param address New device address. //------------------------------------------------------------------------------ void USBD_SetAddress(unsigned char address) { TRACE_INFO_WP("SetAddr(%d) ", address); // Set address AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN | address; // If the address is 0, the device returns to the Default state if (address == 0) { AT91C_BASE_UDP->UDP_GLBSTATE = 0; deviceState = USBD_STATE_DEFAULT; } // If the address is non-zero, the device enters the Address state else { AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_FADDEN; deviceState = USBD_STATE_ADDRESS; } } //------------------------------------------------------------------------------ /// Sets the current device configuration. /// \param cfgnum - Configuration number to set. //------------------------------------------------------------------------------ void USBD_SetConfiguration(unsigned char cfgnum) { TRACE_INFO_WP("SetCfg(%d) ", cfgnum); // If the configuration number if non-zero, the device enters the // Configured state if (cfgnum != 0) { // Enter Configured state deviceState = USBD_STATE_CONFIGURED; AT91C_BASE_UDP->UDP_GLBSTATE |= AT91C_UDP_CONFG; } // If the configuration number is zero, the device goes back to the Address // state else { deviceState = USBD_STATE_ADDRESS; AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_FADDEN; // Abort all transfers UDP_DisableEndpoints(); } } //------------------------------------------------------------------------------ /// Connects the pull-up on the D+ line of the USB. //------------------------------------------------------------------------------ void USBD_Connect(void) { TRACE_DEBUG("Conn "); #if defined(BOARD_USB_PULLUP_EXTERNAL) const Pin pinPullUp = PIN_USB_PULLUP; if (pinPullUp.attribute == PIO_OUTPUT_0) { PIO_Set(&pinPullUp); } else { PIO_Clear(&pinPullUp); } #elif defined(BOARD_USB_PULLUP_INTERNAL) AT91C_BASE_UDP->UDP_TXVC |= AT91C_UDP_PUON; #elif defined(BOARD_USB_PULLUP_MATRIX) AT91C_BASE_MATRIX->MATRIX_USBPCR |= AT91C_MATRIX_USBPCR_PUON; #elif !defined(BOARD_USB_PULLUP_ALWAYSON) #error Unsupported pull-up type. #endif } //------------------------------------------------------------------------------ /// Disconnects the pull-up from the D+ line of the USB. //------------------------------------------------------------------------------ void USBD_Disconnect(void) { TRACE_DEBUG("Disc "); #if defined(BOARD_USB_PULLUP_EXTERNAL) const Pin pinPullUp = PIN_USB_PULLUP; if (pinPullUp.attribute == PIO_OUTPUT_0) { PIO_Clear(&pinPullUp); } else { PIO_Set(&pinPullUp); } #elif defined(BOARD_USB_PULLUP_INTERNAL) AT91C_BASE_UDP->UDP_TXVC &= ~AT91C_UDP_PUON; #elif defined(BOARD_USB_PULLUP_MATRIX) AT91C_BASE_MATRIX->MATRIX_USBPCR &= ~AT91C_MATRIX_USBPCR_PUON; #elif !defined(BOARD_USB_PULLUP_ALWAYSON) #error Unsupported pull-up type. #endif // Device returns to the Powered state if (deviceState > USBD_STATE_POWERED) { deviceState = USBD_STATE_POWERED; } if (previousDeviceState > USBD_STATE_POWERED) { previousDeviceState = USBD_STATE_POWERED; } } //------------------------------------------------------------------------------ /// Initializes the USB driver. //------------------------------------------------------------------------------ void USBD_Init(void) { TRACE_INFO_WP("USBD_Init\n\r"); // Reset endpoint structures UDP_ResetEndpoints(); // Configure the pull-up on D+ and disconnect it #if defined(BOARD_USB_PULLUP_EXTERNAL) const Pin pinPullUp = PIN_USB_PULLUP; PIO_Configure(&pinPullUp, 1); #elif defined(BOARD_USB_PULLUP_INTERNAL) AT91C_BASE_UDP->UDP_TXVC &= ~AT91C_UDP_PUON; #elif defined(BOARD_USB_PULLUP_MATRIX) AT91C_BASE_MATRIX->MATRIX_USBPCR &= ~AT91C_MATRIX_USBPCR_PUON; #elif !defined(BOARD_USB_PULLUP_ALWAYSON) #error Missing pull-up definition. #endif // Device is in the Attached state deviceState = USBD_STATE_SUSPENDED; previousDeviceState = USBD_STATE_POWERED; UDP_EnablePeripheralClock(); UDP_EnableUsbClock(); AT91C_BASE_UDP->UDP_IDR = 0xFE; AT91C_BASE_UDP->UDP_IER = AT91C_UDP_WAKEUP; // Configure interrupts USBDCallbacks_Initialized(); } //------------------------------------------------------------------------------ /// Configure USB Speed, should be invoked before USB attachment. /// \param forceFS Force to use FS mode. //------------------------------------------------------------------------------ void USBD_ConfigureSpeed(unsigned char forceFS) { } //------------------------------------------------------------------------------ /// Returns the current state of the USB device. /// \return Device current state. //------------------------------------------------------------------------------ unsigned char USBD_GetState(void) { return deviceState; } #endif // BOARD_USB_UDP tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/usb/device/core/USBD_UDPHS.c000066400000000000000000001770161207233610700262570ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "USBD.h" #include "USBDCallbacks.h" #include "USBDDriver.h" #include #include #include #include #include #include #include #include #ifdef BOARD_USB_UDPHS //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ /// Maximum number of endpoints interrupts. #define NUM_IT_MAX \ (AT91C_BASE_UDPHS->UDPHS_IPFEATURES & AT91C_UDPHS_EPT_NBR_MAX) /// Maximum number of endpoint DMA interrupts #define NUM_IT_MAX_DMA \ ((AT91C_BASE_UDPHS->UDPHS_IPFEATURES & AT91C_UDPHS_DMA_CHANNEL_NBR)>>4) /// Bits that should be shifted to access DMA control bits. #define SHIFT_DMA 24 /// Bits that should be shifted to access interrupt bits. #define SHIFT_INTERUPT 8 /// Compile option, use DMA. Remove this define for not use DMA. #define DMA /// Max size of the FMA FIFO #define DMA_MAX_FIFO_SIZE 65536 #define EPT_VIRTUAL_SIZE 16384 //------------------------------------------------------------------------------ /// \page "Endpoint states" /// This page lists the endpoint states. /// !States // - UDP_ENDPOINT_DISABLED // - UDP_ENDPOINT_HALTED // - UDP_ENDPOINT_IDLE // - UDP_ENDPOINT_SENDING // - UDP_ENDPOINT_RECEIVING /// Endpoint states: Endpoint is disabled #define UDP_ENDPOINT_DISABLED 0 /// Endpoint states: Endpoint is halted (i.e. STALLs every request) #define UDP_ENDPOINT_HALTED 1 /// Endpoint states: Endpoint is idle (i.e. ready for transmission) #define UDP_ENDPOINT_IDLE 2 /// Endpoint states: Endpoint is sending data #define UDP_ENDPOINT_SENDING 3 /// Endpoint states: Endpoint is receiving data #define UDP_ENDPOINT_RECEIVING 4 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Structures //------------------------------------------------------------------------------ /// Describes an ongoing transfer on a UDP endpoint. typedef struct { /// Pointer to a data buffer used for emission/reception. char *pData; /// Number of bytes which have been written into the UDP internal FIFO /// buffers. volatile int buffered; /// Number of bytes which have been sent/received. volatile int transferred; /// Number of bytes which have not been buffered/transferred yet. volatile int remaining; /// Optional callback to invoke when the transfer completes. volatile TransferCallback fCallback; /// Optional argument to the callback function. void *pArgument; } Transfer; //------------------------------------------------------------------------------ /// Describes the state of an endpoint of the UDP controller. //------------------------------------------------------------------------------ typedef struct { /// Current endpoint state. volatile unsigned char state; /// Current reception bank (0 or 1). unsigned char bank; /// Maximum packet size for the endpoint. unsigned short size; /// Describes an ongoing transfer (if current state is either /// or ) Transfer transfer; /// Special case for send a ZLP unsigned char sendZLP; } Endpoint; //------------------------------------------------------------------------------ // Internal variables //------------------------------------------------------------------------------ /// Holds the internal state for each endpoint of the UDP. static Endpoint endpoints[BOARD_USB_NUMENDPOINTS]; /// Device current state. static unsigned char deviceState; /// Indicates the previous device state static unsigned char previousDeviceState; /// 7.1.20 Test Mode Support /// Test codes for the USB HS test mode. static const char test_packet_buffer[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // JKJKJKJK * 9 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, // JJKKJJKK * 8 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, // JJJJKKKK * 8 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // JJJJJJJKKKKKKK * 8 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD, // JJJJJJJK * 8 0xFC,0x7E,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0x7E // {JKKKKKKK * 10}, JK }; // Force HS static const unsigned char forceUsbFS = 0; //------------------------------------------------------------------------------ // Internal Functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Disables the BIAS of the USB controller //------------------------------------------------------------------------------ static inline void UDPHS_DisableBIAS( void ) { // For CAP9, SAM9RL, HS #if !defined (BOARD_USB_NO_BIAS_COMMAND) AT91C_BASE_PMC->PMC_UCKR &= ~AT91C_CKGR_BIASEN_ENABLED; #endif } //------------------------------------------------------------------------------ /// Enables the BIAS of the USB controller //------------------------------------------------------------------------------ static inline void UDPHS_EnableBIAS( void ) { // For CAP9, SAM9RL, HS #if !defined (BOARD_USB_NO_BIAS_COMMAND) UDPHS_DisableBIAS(); AT91C_BASE_PMC->PMC_UCKR |= AT91C_CKGR_BIASEN_ENABLED; #endif } //------------------------------------------------------------------------------ /// Enable UDPHS clock //------------------------------------------------------------------------------ static inline void UDPHS_EnableUsbClock( void ) { #if !defined (PMC_BY_HARD) AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_UDPHS); // Enable 480MHZ //AT91C_BASE_CKGR->CKGR_UCKR |= (AT91C_CKGR_PLLCOUNT & (3 << 20)) | AT91C_CKGR_UPLLEN; AT91C_BASE_CKGR->CKGR_UCKR |= ((0xf << 20) & (3 << 20)) | AT91C_CKGR_UPLLEN; // Wait until UTMI PLL is locked while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKU) == 0); #endif } //------------------------------------------------------------------------------ /// Disable UDPHS clock //------------------------------------------------------------------------------ static inline void UDPHS_DisableUsbClock( void ) { #if !defined (PMC_BY_HARD) AT91C_BASE_PMC->PMC_PCDR = (1 << AT91C_ID_UDPHS); // 480MHZ AT91C_BASE_CKGR->CKGR_UCKR &= ~AT91C_CKGR_UPLLEN; #endif } //------------------------------------------------------------------------------ /// Handles a completed transfer on the given endpoint, invoking the /// configured callback if any. /// \param bEndpoint Number of the endpoint for which the transfer has completed. /// \param bStatus Status code returned by the transfer operation //------------------------------------------------------------------------------ static void UDPHS_EndOfTransfer( unsigned char bEndpoint, char bStatus ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); // Check that endpoint was sending or receiving data if( (pEndpoint->state == UDP_ENDPOINT_RECEIVING) || (pEndpoint->state == UDP_ENDPOINT_SENDING) ) { TRACE_DEBUG_WP("Eo"); if(pEndpoint->state == UDP_ENDPOINT_SENDING) { pEndpoint->sendZLP = 0; } // Endpoint returns in Idle state pEndpoint->state = UDP_ENDPOINT_IDLE; // Invoke callback is present if (pTransfer->fCallback != 0) { ((TransferCallback) pTransfer->fCallback) (pTransfer->pArgument, bStatus, pTransfer->transferred, pTransfer->remaining + pTransfer->buffered); } else { TRACE_DEBUG_WP("No callBack\n\r"); } } } //------------------------------------------------------------------------------ /// Clears the correct RX flag in endpoint status register /// \param bEndpoint Index of endpoint //------------------------------------------------------------------------------ static void UDPHS_ClearRxFlag( unsigned char bEndpoint ) { AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_RX_BK_RDY; } //------------------------------------------------------------------------------ /// Transfers a data payload from the current tranfer buffer to the endpoint /// FIFO /// \param bEndpoint Number of the endpoint which is sending data. //------------------------------------------------------------------------------ static void UDPHS_WritePayload( unsigned char bEndpoint ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); char *pFifo; signed int size; unsigned int dCtr; pFifo = (char*)((unsigned int *)AT91C_BASE_UDPHS_EPTFIFO + (EPT_VIRTUAL_SIZE * bEndpoint)); // Get the number of bytes to send size = pEndpoint->size; if (size > pTransfer->remaining) { size = pTransfer->remaining; } // Update transfer descriptor information pTransfer->buffered += size; pTransfer->remaining -= size; // Write packet in the FIFO buffer dCtr = 0; while (size > 0) { pFifo[dCtr] = *(pTransfer->pData); pTransfer->pData++; size--; dCtr++; } } //------------------------------------------------------------------------------ /// Transfers a data payload from an endpoint FIFO to the current transfer buffer /// \param bEndpoint Endpoint number. /// \param wPacketSize Size of received data packet //------------------------------------------------------------------------------ static void UDPHS_ReadPayload( unsigned char bEndpoint, int wPacketSize ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); char *pFifo; unsigned char dBytes=0; pFifo = (char*)((unsigned int *)AT91C_BASE_UDPHS_EPTFIFO + (EPT_VIRTUAL_SIZE * bEndpoint)); // Check that the requested size is not bigger than the remaining transfer if (wPacketSize > pTransfer->remaining) { pTransfer->buffered += wPacketSize - pTransfer->remaining; wPacketSize = pTransfer->remaining; } // Update transfer descriptor information pTransfer->remaining -= wPacketSize; pTransfer->transferred += wPacketSize; // Retrieve packet while (wPacketSize > 0) { *(pTransfer->pData) = pFifo[dBytes]; pTransfer->pData++; wPacketSize--; dBytes++; } } //------------------------------------------------------------------------------ /// Received SETUP packet from endpoint 0 FIFO /// \param pRequest Generic USB SETUP request sent over Control endpoints //------------------------------------------------------------------------------ static void UDPHS_ReadRequest( USBGenericRequest *pRequest ) { unsigned int *pData = (unsigned int *)pRequest; unsigned int fifo; fifo = (AT91C_BASE_UDPHS_EPTFIFO->UDPHS_READEPT0[0]); *pData = fifo; fifo = (AT91C_BASE_UDPHS_EPTFIFO->UDPHS_READEPT0[0]); pData++; *pData = fifo; //TRACE_ERROR("SETUP: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n\r", pData[0],pData[1],pData[2],pData[3],pData[4],pData[5],pData[6],pData[7]); } //------------------------------------------------------------------------------ /// Reset all endpoint transfer descriptors //------------------------------------------------------------------------------ static void UDPHS_ResetEndpoints( void ) { Endpoint *pEndpoint; Transfer *pTransfer; unsigned char bEndpoint; // Reset the transfer descriptor of every endpoint for( bEndpoint = 0; bEndpoint < BOARD_USB_NUMENDPOINTS; bEndpoint++ ) { pEndpoint = &(endpoints[bEndpoint]); pTransfer = &(pEndpoint->transfer); // Reset endpoint transfer descriptor pTransfer->pData = 0; pTransfer->transferred = -1; pTransfer->buffered = -1; pTransfer->remaining = -1; pTransfer->fCallback = 0; pTransfer->pArgument = 0; // Reset endpoint state pEndpoint->bank = 0; pEndpoint->state = UDP_ENDPOINT_DISABLED; // Reset ZLP pEndpoint->sendZLP = 0; } } //------------------------------------------------------------------------------ /// Disable all endpoints (except control endpoint 0), aborting current /// transfers if necessary //------------------------------------------------------------------------------ static void UDPHS_DisableEndpoints( void ) { unsigned char bEndpoint; // Disable each endpoint, terminating any pending transfer // Control endpoint 0 is not disabled for( bEndpoint = 1; bEndpoint < BOARD_USB_NUMENDPOINTS; bEndpoint++ ) { UDPHS_EndOfTransfer( bEndpoint, USBD_STATUS_ABORTED ); endpoints[bEndpoint].state = UDP_ENDPOINT_DISABLED; } } //------------------------------------------------------------------------------ /// Endpoint interrupt handler. /// Handle IN/OUT transfers, received SETUP packets and STALLing /// \param bEndpoint Index of endpoint //------------------------------------------------------------------------------ static void UDPHS_EndpointHandler( unsigned char bEndpoint ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); unsigned int status = AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTSTA; unsigned short wPacketSize; USBGenericRequest request; TRACE_DEBUG_WP("E%d ", bEndpoint); TRACE_DEBUG_WP("st:0x%X ", status); // Handle interrupts // IN packet sent if( (AT91C_UDPHS_TX_PK_RDY == (AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTL & AT91C_UDPHS_TX_PK_RDY)) && (0 == (status & AT91C_UDPHS_TX_PK_RDY )) ) { TRACE_DEBUG_WP("Wr "); // Check that endpoint was in Sending state if( pEndpoint->state == UDP_ENDPOINT_SENDING ) { if (pTransfer->buffered > 0) { pTransfer->transferred += pTransfer->buffered; pTransfer->buffered = 0; } if( ((pTransfer->buffered)==0) &&((pTransfer->transferred)==0) &&((pTransfer->remaining)==0) &&(pEndpoint->sendZLP == 0)) { pEndpoint->sendZLP = 1; } // End of transfer ? if( (pTransfer->remaining > 0) ||(pEndpoint->sendZLP == 1)) { pEndpoint->sendZLP = 2; TRACE_DEBUG_WP("\n\r1pTransfer->buffered %d \n\r", pTransfer->buffered); TRACE_DEBUG_WP("1pTransfer->transferred %d \n\r", pTransfer->transferred); TRACE_DEBUG_WP("1pTransfer->remaining %d \n\r", pTransfer->remaining); // Transfer remaining data TRACE_DEBUG_WP(" %d ", pEndpoint->size); // Send next packet UDPHS_WritePayload(bEndpoint); AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTSETSTA = AT91C_UDPHS_TX_PK_RDY; } else { TRACE_DEBUG_WP("\n\r0pTransfer->buffered %d \n\r", pTransfer->buffered); TRACE_DEBUG_WP("0pTransfer->transferred %d \n\r", pTransfer->transferred); TRACE_DEBUG_WP("0pTransfer->remaining %d \n\r", pTransfer->remaining); TRACE_DEBUG_WP(" %d ", pTransfer->transferred); // Disable interrupt if this is not a control endpoint if( AT91C_UDPHS_EPT_TYPE_CTL_EPT != (AT91C_UDPHS_EPT_TYPE&(AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG)) ) { AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1<UDPHS_EPT[bEndpoint].UDPHS_EPTCTLDIS = AT91C_UDPHS_TX_PK_RDY; UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS); pEndpoint->sendZLP = 0; } } else { TRACE_DEBUG("Error Wr %d", pEndpoint->sendZLP); } } // OUT packet received if( AT91C_UDPHS_RX_BK_RDY == (status & AT91C_UDPHS_RX_BK_RDY) ) { TRACE_DEBUG_WP("Rd "); // Check that the endpoint is in Receiving state if (pEndpoint->state != UDP_ENDPOINT_RECEIVING) { // Check if an ACK has been received on a Control endpoint if( (0 == (AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG & AT91C_UDPHS_EPT_TYPE)) && (0 == (status & AT91C_UDPHS_BYTE_COUNT)) ) { // Control endpoint, 0 bytes received // Acknowledge the data and finish the current transfer TRACE_DEBUG_WP("Ack "); UDPHS_ClearRxFlag(bEndpoint); UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS); //todo remove endoftranfer and test } // Check if the data has been STALLed else if( AT91C_UDPHS_FRCESTALL == (status & AT91C_UDPHS_FRCESTALL)) { // Discard STALLed data TRACE_DEBUG_WP("Discard "); UDPHS_ClearRxFlag(bEndpoint); } // NAK the data else { TRACE_DEBUG_WP("Nak "); AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1<>20); TRACE_DEBUG_WP("%d ", wPacketSize); UDPHS_ReadPayload(bEndpoint, wPacketSize); UDPHS_ClearRxFlag(bEndpoint); // Check if the transfer is finished if ((pTransfer->remaining == 0) || (wPacketSize < pEndpoint->size)) { AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLDIS = AT91C_UDPHS_RX_BK_RDY; // Disable interrupt if this is not a control endpoint if( AT91C_UDPHS_EPT_TYPE_CTL_EPT != (AT91C_UDPHS_EPT_TYPE & (AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG)) ) { AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1<UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_STALL_SNT; // If the endpoint is not halted, clear the STALL condition if (pEndpoint->state != UDP_ENDPOINT_HALTED) { TRACE_WARNING( "_ " ); AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_FRCESTALL; } } // SETUP packet received if( AT91C_UDPHS_RX_SETUP == (status & AT91C_UDPHS_RX_SETUP) ) { TRACE_DEBUG_WP("Stp "); // If a transfer was pending, complete it // Handles the case where during the status phase of a control write // transfer, the host receives the device ZLP and ack it, but the ack // is not received by the device if ((pEndpoint->state == UDP_ENDPOINT_RECEIVING) || (pEndpoint->state == UDP_ENDPOINT_SENDING)) { UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS); } // Copy the setup packet UDPHS_ReadRequest(&request); // Acknowledge setup packet AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_RX_SETUP; // Forward the request to the upper layer USBDCallbacks_RequestReceived(&request); } } //------------------------------------------------------------------------------ // Interrupt service routine //------------------------------------------------------------------------------ #ifdef DMA //---------------------------------------------------------------------------- /// Endpoint DMA interrupt handler. /// This function (ISR) handles dma interrupts /// \param bEndpoint Index of endpoint //---------------------------------------------------------------------------- static void UDPHS_DmaHandler( unsigned char bEndpoint ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); int justTransferred; unsigned int status; unsigned char result = USBD_STATUS_SUCCESS; status = AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMASTATUS; TRACE_DEBUG_WP("Dma Ept%d ", bEndpoint); // Disable DMA interrupt to avoid receiving 2 interrupts (B_EN and TR_EN) AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMACONTROL &= ~(AT91C_UDPHS_END_TR_EN | AT91C_UDPHS_END_B_EN); AT91C_BASE_UDPHS->UDPHS_IEN &= ~(1 << SHIFT_DMA << bEndpoint); if( AT91C_UDPHS_END_BF_ST == (status & AT91C_UDPHS_END_BF_ST) ) { TRACE_DEBUG_WP("EndBuffer "); // BUFF_COUNT holds the number of untransmitted bytes. // BUFF_COUNT is equal to zero in case of good transfer justTransferred = pTransfer->buffered - ((status & AT91C_UDPHS_BUFF_COUNT) >> 16); pTransfer->transferred += justTransferred; pTransfer->buffered = ((status & AT91C_UDPHS_BUFF_COUNT) >> 16); pTransfer->remaining -= justTransferred; TRACE_DEBUG_WP("\n\r1pTransfer->buffered %d \n\r", pTransfer->buffered); TRACE_DEBUG_WP("1pTransfer->transferred %d \n\r", pTransfer->transferred); TRACE_DEBUG_WP("1pTransfer->remaining %d \n\r", pTransfer->remaining); if( (pTransfer->remaining + pTransfer->buffered) > 0 ) { // Prepare an other transfer if( pTransfer->remaining > DMA_MAX_FIFO_SIZE ) { pTransfer->buffered = DMA_MAX_FIFO_SIZE; } else { pTransfer->buffered = pTransfer->remaining; } AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMAADDRESS = (unsigned int)((pTransfer->pData) + (pTransfer->transferred)); // Clear unwanted interrupts AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMASTATUS; // Enable DMA endpoint interrupt AT91C_BASE_UDPHS->UDPHS_IEN |= (1 << SHIFT_DMA << bEndpoint); // DMA config for receive the good size of buffer, or an error buffer AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMACONTROL = 0; // raz AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMACONTROL = ( ((pTransfer->buffered << 16) & AT91C_UDPHS_BUFF_COUNT) | AT91C_UDPHS_END_TR_EN | AT91C_UDPHS_END_TR_IT | AT91C_UDPHS_END_B_EN | AT91C_UDPHS_END_BUFFIT | AT91C_UDPHS_CHANN_ENB ); } } else if( AT91C_UDPHS_END_TR_ST == (status & AT91C_UDPHS_END_TR_ST) ) { TRACE_DEBUG_WP("EndTransf "); pTransfer->transferred = pTransfer->buffered - ((status & AT91C_UDPHS_BUFF_COUNT) >> 16); pTransfer->remaining = 0; TRACE_DEBUG_WP("\n\r0pTransfer->buffered %d \n\r", pTransfer->buffered); TRACE_DEBUG_WP("0pTransfer->transferred %d \n\r", pTransfer->transferred); TRACE_DEBUG_WP("0pTransfer->remaining %d \n\r", pTransfer->remaining); } else { TRACE_ERROR("UDPHS_DmaHandler: Error (0x%08X)\n\r", status); result = USBD_STATUS_ABORTED; } // Invoke callback if( pTransfer->remaining == 0 ) { TRACE_DEBUG_WP("EOT "); UDPHS_EndOfTransfer(bEndpoint, result); } } #endif //------------------------------------------------------------------------------ // Exported functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// USB interrupt handler /// Manages device resume, suspend, end of bus reset. /// Forwards endpoint interrupts to the appropriate handler. //------------------------------------------------------------------------------ void RealUdphsIrqHandler(void) @spontaneous() { unsigned int status; unsigned char numIT; if (deviceState >= USBD_STATE_POWERED) { //LED_Set(USBD_LEDUSB); //TOSH_SET_GREEN_LED_PIN(); } // Get interrupts status status = AT91C_BASE_UDPHS->UDPHS_INTSTA & AT91C_BASE_UDPHS->UDPHS_IEN; // Handle all UDPHS interrupts TRACE_DEBUG_WP("H"); while (status != 0) { // Start Of Frame (SOF) if ((status & AT91C_UDPHS_IEN_SOF) != 0) { TRACE_DEBUG_WP("SOF "); // Invoke the SOF callback //USB_StartOfFrameCallback(pUsb); // Acknowledge interrupt AT91C_BASE_UDPHS->UDPHS_CLRINT = AT91C_UDPHS_IEN_SOF; status &= ~AT91C_UDPHS_IEN_SOF; } // Suspend // This interrupt is always treated last (hence the '==') else if (status == AT91C_UDPHS_DET_SUSPD) { TRACE_DEBUG_WP("S"); // The device enters the Suspended state // MCK + UDPCK must be off // Pull-Up must be connected // Transceiver must be disabled //LED_Clear(USBD_LEDUSB); //TOSH_CLR_GREEN_LED_PIN(); UDPHS_DisableBIAS(); // Enable wakeup AT91C_BASE_UDPHS->UDPHS_IEN |= AT91C_UDPHS_WAKE_UP | AT91C_UDPHS_ENDOFRSM; AT91C_BASE_UDPHS->UDPHS_IEN &= ~AT91C_UDPHS_DET_SUSPD; // Acknowledge interrupt AT91C_BASE_UDPHS->UDPHS_CLRINT = AT91C_UDPHS_DET_SUSPD | AT91C_UDPHS_WAKE_UP; previousDeviceState = deviceState; deviceState = USBD_STATE_SUSPENDED; UDPHS_DisableUsbClock(); // Invoke the Suspend callback USBDCallbacks_Suspended(); } // Resume else if( ((status & AT91C_UDPHS_WAKE_UP) != 0) // line activity || ((status & AT91C_UDPHS_ENDOFRSM) != 0)) { // pc wakeup { // Invoke the Resume callback USBDCallbacks_Resumed(); TRACE_DEBUG_WP("R"); UDPHS_EnableUsbClock(); UDPHS_EnableBIAS(); // The device enters Configured state // MCK + UDPCK must be on // Pull-Up must be connected // Transceiver must be enabled deviceState = previousDeviceState; AT91C_BASE_UDPHS->UDPHS_CLRINT = AT91C_UDPHS_WAKE_UP | AT91C_UDPHS_ENDOFRSM | AT91C_UDPHS_DET_SUSPD; AT91C_BASE_UDPHS->UDPHS_IEN |= AT91C_UDPHS_ENDOFRSM | AT91C_UDPHS_DET_SUSPD; AT91C_BASE_UDPHS->UDPHS_CLRINT = AT91C_UDPHS_WAKE_UP | AT91C_UDPHS_ENDOFRSM; AT91C_BASE_UDPHS->UDPHS_IEN &= ~AT91C_UDPHS_WAKE_UP; } } // End of bus reset else if ((status & AT91C_UDPHS_ENDRESET) == AT91C_UDPHS_ENDRESET) { // TRACE_DEBUG_WP("EoB "); // The device enters the Default state deviceState = USBD_STATE_DEFAULT; // MCK + UDPCK are already enabled // Pull-Up is already connected // Transceiver must be enabled // Endpoint 0 must be enabled UDPHS_ResetEndpoints(); UDPHS_DisableEndpoints(); USBD_ConfigureEndpoint(0); // Flush and enable the Suspend interrupt AT91C_BASE_UDPHS->UDPHS_CLRINT = AT91C_UDPHS_WAKE_UP | AT91C_UDPHS_DET_SUSPD; //// Enable the Start Of Frame (SOF) interrupt if needed //if (pCallbacks->startOfFrame != 0) //{ // AT91C_BASE_UDPHS->UDPHS_IEN |= AT91C_UDPHS_IEN_SOF; //} // Invoke the Reset callback USBDCallbacks_Reset(); // Acknowledge end of bus reset interrupt AT91C_BASE_UDPHS->UDPHS_CLRINT = AT91C_UDPHS_ENDRESET; AT91C_BASE_UDPHS->UDPHS_IEN |= AT91C_UDPHS_DET_SUSPD; } // Handle upstream resume interrupt else if (status & AT91C_UDPHS_UPSTR_RES) { TRACE_DEBUG_WP("ExtRes "); // - Acknowledge the IT AT91C_BASE_UDPHS->UDPHS_CLRINT = AT91C_UDPHS_UPSTR_RES; } // Endpoint interrupts else { #ifndef DMA // Handle endpoint interrupts for (numIT = 0; numIT < NUM_IT_MAX; numIT++) { if ((status & (1 << SHIFT_INTERUPT << numIT)) != 0) { UDPHS_EndpointHandler(numIT); } } #else // Handle endpoint control interrupt if ((status & (1 << SHIFT_INTERUPT << 0)) != 0) { UDPHS_EndpointHandler( 0 ); } else { numIT = 1; while((status&(0x7E<UDPHS_INTSTA & AT91C_BASE_UDPHS->UDPHS_IEN; TRACE_DEBUG_WP("\n\r"); if (status != 0) { TRACE_DEBUG_WP(" - "); } } if (deviceState >= USBD_STATE_POWERED) { //LED_Clear(USBD_LEDUSB); //TOSH_CLR_GREEN_LED_PIN(); } } void UdphsIrqHandler(void) @C() @spontaneous() { call UdphsInterruptWrapper.preamble(); RealUdphsIrqHandler(); call UdphsInterruptWrapper.postamble(); } //------------------------------------------------------------------------------ /// Configure an endpoint with the provided endpoint descriptor /// \param pDdescriptor Pointer to the endpoint descriptor //------------------------------------------------------------------------------ void USBD_ConfigureEndpoint(const USBEndpointDescriptor *pDescriptor) { Endpoint *pEndpoint; unsigned char bEndpoint; unsigned char bType; unsigned char bEndpointDir; unsigned char bInterval = 0; unsigned char bSizeEpt = 0; // NULL descriptor -> Control endpoint 0 if (pDescriptor == 0) { bEndpoint = 0; pEndpoint = &(endpoints[bEndpoint]); bType = USBEndpointDescriptor_CONTROL; bEndpointDir = 0; pEndpoint->size = BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0); pEndpoint->bank = BOARD_USB_ENDPOINTS_BANKS(0); } else { // The endpoint number bEndpoint = USBEndpointDescriptor_GetNumber(pDescriptor); pEndpoint = &(endpoints[bEndpoint]); // Transfer type: Control, Isochronous, Bulk, Interrupt bType = USBEndpointDescriptor_GetType(pDescriptor); // Direction, ignored for control endpoints bEndpointDir = USBEndpointDescriptor_GetDirection(pDescriptor); // Interval, for ISO endpoints ONLY bInterval = USBEndpointDescriptor_GetInterval(pDescriptor); if (bInterval > 16) bInterval = 16; pEndpoint->size = USBEndpointDescriptor_GetMaxPacketSize(pDescriptor); pEndpoint->bank = BOARD_USB_ENDPOINTS_BANKS(bEndpoint); } // Abort the current transfer is the endpoint was configured and in // Write or Read state if( (pEndpoint->state == UDP_ENDPOINT_RECEIVING) || (pEndpoint->state == UDP_ENDPOINT_SENDING) ) { UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_RESET); } pEndpoint->state = UDP_ENDPOINT_IDLE; // Disable endpoint AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLDIS = AT91C_UDPHS_SHRT_PCKT | AT91C_UDPHS_BUSY_BANK | AT91C_UDPHS_NAK_OUT | AT91C_UDPHS_NAK_IN | AT91C_UDPHS_STALL_SNT | AT91C_UDPHS_RX_SETUP | AT91C_UDPHS_TX_PK_RDY | AT91C_UDPHS_TX_COMPLT | AT91C_UDPHS_RX_BK_RDY | AT91C_UDPHS_ERR_OVFLW | AT91C_UDPHS_MDATA_RX | AT91C_UDPHS_DATAX_RX | AT91C_UDPHS_NYET_DIS | AT91C_UDPHS_INTDIS_DMA | AT91C_UDPHS_AUTO_VALID | AT91C_UDPHS_EPT_DISABL; // Reset Endpoint Fifos AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_TOGGLESQ | AT91C_UDPHS_FRCESTALL; AT91C_BASE_UDPHS->UDPHS_EPTRST = 1<size <= 8 ) { bSizeEpt = 0; } else if ( pEndpoint->size <= 16 ) { bSizeEpt = 1; } else if ( pEndpoint->size <= 32 ) { bSizeEpt = 2; } else if ( pEndpoint->size <= 64 ) { bSizeEpt = 3; } else if ( pEndpoint->size <= 128 ) { bSizeEpt = 4; } else if ( pEndpoint->size <= 256 ) { bSizeEpt = 5; } else if ( pEndpoint->size <= 512 ) { bSizeEpt = 6; } else if ( pEndpoint->size <= 1024 ) { bSizeEpt = 7; } //else { // sizeEpt = 0; // control endpoint //} // Configure endpoint if (bType == USBEndpointDescriptor_CONTROL) { // Enable endpoint IT for control endpoint AT91C_BASE_UDPHS->UDPHS_IEN |= (1<UDPHS_EPT[bEndpoint].UDPHS_EPTCFG = bSizeEpt | (bEndpointDir << 3) | (bType << 4) | ((pEndpoint->bank) << 6) | (bInterval << 8) ; while( (signed int)AT91C_UDPHS_EPT_MAPD != (signed int)((AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG) & AT91C_UDPHS_EPT_MAPD) ) { // resolved by clearing the reset IT in good place TRACE_ERROR("PB bEndpoint: 0x%X\n\r", bEndpoint); TRACE_ERROR("PB bSizeEpt: 0x%X\n\r", bSizeEpt); TRACE_ERROR("PB bEndpointDir: 0x%X\n\r", bEndpointDir); TRACE_ERROR("PB bType: 0x%X\n\r", bType); TRACE_ERROR("PB pEndpoint->bank: 0x%X\n\r", pEndpoint->bank); TRACE_ERROR("PB UDPHS_EPTCFG: 0x%X\n\r", AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG); for(;;); } if (bType == USBEndpointDescriptor_CONTROL) { AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLENB = AT91C_UDPHS_RX_BK_RDY | AT91C_UDPHS_RX_SETUP | AT91C_UDPHS_EPT_ENABL; } else { #ifndef DMA AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLENB = AT91C_UDPHS_EPT_ENABL; #else AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLENB = AT91C_UDPHS_AUTO_VALID | AT91C_UDPHS_EPT_ENABL; #endif } } //------------------------------------------------------------------------------ /// Sends data through an USB endpoint (IN) /// Sets up the transfer descriptor, write one or two data payloads /// (depending on the number of FIFO banks for the endpoint) and then /// starts the actual transfer. The operation is complete when all /// the data has been sent. /// \param bEndpoint Index of endpoint /// \param *pData Data to be written /// \param dLength Data length to be send /// \param fCallback Callback to be call after the success command /// \param *pArgument Callback argument /// \return USBD_STATUS_LOCKED or USBD_STATUS_SUCCESS //------------------------------------------------------------------------------ char USBD_Write( unsigned char bEndpoint, const void *pData, unsigned int dLength, TransferCallback fCallback, void *pArgument ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); // Return if the endpoint is not in IDLE state if (pEndpoint->state != UDP_ENDPOINT_IDLE) { return USBD_STATUS_LOCKED; } TRACE_DEBUG_WP("Write%d(%d) ", bEndpoint, dLength); pEndpoint->sendZLP = 0; // Setup the transfer descriptor pTransfer->pData = (void *) pData; pTransfer->remaining = dLength; pTransfer->buffered = 0; pTransfer->transferred = 0; pTransfer->fCallback = fCallback; pTransfer->pArgument = pArgument; // Send one packet pEndpoint->state = UDP_ENDPOINT_SENDING; #ifdef DMA // Test if endpoint type control if(AT91C_UDPHS_EPT_TYPE_CTL_EPT == (AT91C_UDPHS_EPT_TYPE&(AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG))) { #endif // Enable endpoint IT AT91C_BASE_UDPHS->UDPHS_IEN |= (1 << SHIFT_INTERUPT << bEndpoint); AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLENB = AT91C_UDPHS_TX_PK_RDY; #ifdef DMA } else { if( pTransfer->remaining == 0 ) { // DMA not handle ZLP AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTSETSTA = AT91C_UDPHS_TX_PK_RDY; // Enable endpoint IT AT91C_BASE_UDPHS->UDPHS_IEN |= (1 << SHIFT_INTERUPT << bEndpoint); AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLENB = AT91C_UDPHS_TX_PK_RDY; } else { // Others endpoints (not control) if( pTransfer->remaining > DMA_MAX_FIFO_SIZE ) { // Transfer the max pTransfer->buffered = DMA_MAX_FIFO_SIZE; } else { // Transfer the good size pTransfer->buffered = pTransfer->remaining; } TRACE_DEBUG_WP("\n\r_WR:%d ", pTransfer->remaining ); TRACE_DEBUG_WP("B:%d ", pTransfer->buffered ); TRACE_DEBUG_WP("T:%d ", pTransfer->transferred ); AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMAADDRESS = (unsigned int)(pTransfer->pData); // Clear unwanted interrupts AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMASTATUS; // Enable DMA endpoint interrupt AT91C_BASE_UDPHS->UDPHS_IEN |= (1 << SHIFT_DMA << bEndpoint); // DMA config AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMACONTROL = 0; // raz AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMACONTROL = ( ((pTransfer->buffered << 16) & AT91C_UDPHS_BUFF_COUNT) | AT91C_UDPHS_END_B_EN | AT91C_UDPHS_END_BUFFIT | AT91C_UDPHS_CHANN_ENB ); } } #endif return USBD_STATUS_SUCCESS; } //------------------------------------------------------------------------------ /// Reads incoming data on an USB endpoint (OUT) /// \param bEndpoint Index of endpoint /// \param *pData Data to be readen /// \param dLength Data length to be receive /// \param fCallback Callback to be call after the success command /// \param *pArgument Callback argument /// \return USBD_STATUS_LOCKED or USBD_STATUS_SUCCESS //------------------------------------------------------------------------------ char USBD_Read( unsigned char bEndpoint, void *pData, unsigned int dLength, TransferCallback fCallback, void *pArgument ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); Transfer *pTransfer = &(pEndpoint->transfer); // Return if the endpoint is not in IDLE state if (pEndpoint->state != UDP_ENDPOINT_IDLE) { return USBD_STATUS_LOCKED; } TRACE_DEBUG_WP("Read%d(%d) ", bEndpoint, dLength); // Endpoint enters Receiving state pEndpoint->state = UDP_ENDPOINT_RECEIVING; // Set the transfer descriptor pTransfer->pData = pData; pTransfer->remaining = dLength; pTransfer->buffered = 0; pTransfer->transferred = 0; pTransfer->fCallback = fCallback; pTransfer->pArgument = pArgument; #ifdef DMA // Test if endpoint type control if(AT91C_UDPHS_EPT_TYPE_CTL_EPT == (AT91C_UDPHS_EPT_TYPE&(AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG))) { #endif // Control endpoint // Enable endpoint IT AT91C_BASE_UDPHS->UDPHS_IEN |= (1 << SHIFT_INTERUPT << bEndpoint); AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCTLENB = AT91C_UDPHS_RX_BK_RDY; #ifdef DMA } else { TRACE_DEBUG_WP("Read%d(%d) ", bEndpoint, dLength); // Others endpoints (not control) if( pTransfer->remaining > DMA_MAX_FIFO_SIZE ) { // Transfer the max pTransfer->buffered = DMA_MAX_FIFO_SIZE; } else { // Transfer the good size pTransfer->buffered = pTransfer->remaining; } AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMAADDRESS = (unsigned int)(pTransfer->pData); // Clear unwanted interrupts AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMASTATUS; // Enable DMA endpoint interrupt AT91C_BASE_UDPHS->UDPHS_IEN |= (1 << SHIFT_DMA << bEndpoint); TRACE_DEBUG_WP("\n\r_RR:%d ", pTransfer->remaining ); TRACE_DEBUG_WP("B:%d ", pTransfer->buffered ); TRACE_DEBUG_WP("T:%d ", pTransfer->transferred ); // DMA config AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMACONTROL = 0; // raz AT91C_BASE_UDPHS->UDPHS_DMA[bEndpoint].UDPHS_DMACONTROL = ( ((pTransfer->buffered << 16) & AT91C_UDPHS_BUFF_COUNT) | AT91C_UDPHS_END_TR_EN | AT91C_UDPHS_END_TR_IT | AT91C_UDPHS_END_B_EN | AT91C_UDPHS_END_BUFFIT | AT91C_UDPHS_CHANN_ENB ); } #endif return USBD_STATUS_SUCCESS; } //------------------------------------------------------------------------------ /// Put endpoint into Halt state /// \param bEndpoint Index of endpoint //------------------------------------------------------------------------------ void USBD_Halt( unsigned char bEndpoint ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); TRACE_INFO("usbd_Halt%d ", bEndpoint); // Check that endpoint is enabled and not already in Halt state if( (pEndpoint->state != UDP_ENDPOINT_DISABLED) && (pEndpoint->state != UDP_ENDPOINT_HALTED) ) { TRACE_INFO("Halt%d ", bEndpoint); // Abort the current transfer if necessary UDPHS_EndOfTransfer(bEndpoint, USBD_STATUS_ABORTED); // Put endpoint into Halt state AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTSETSTA = AT91C_UDPHS_FRCESTALL; pEndpoint->state = UDP_ENDPOINT_HALTED; #ifdef DMA // Test if endpoint type control if(AT91C_UDPHS_EPT_TYPE_CTL_EPT == (AT91C_UDPHS_EPT_TYPE&(AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCFG))) { #endif // Enable the endpoint interrupt AT91C_BASE_UDPHS->UDPHS_IEN |= (1<UDPHS_IEN |= (1<state != UDP_ENDPOINT_DISABLED) { TRACE_DEBUG_WP("Unhalt%d ", bEndpoint); // Return endpoint to Idle state pEndpoint->state = UDP_ENDPOINT_IDLE; // Clear FORCESTALL flag AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_TOGGLESQ | AT91C_UDPHS_FRCESTALL; // Reset Endpoint Fifos AT91C_BASE_UDPHS->UDPHS_EPTRST = (1<state == UDP_ENDPOINT_HALTED) { status = 1; } return( status ); } //------------------------------------------------------------------------------ /// IS High Speed device working in High Speed ? /// \return 1 if the device is in High Speed; otherwise 0 (Full Speed) //------------------------------------------------------------------------------ unsigned char USBD_IsHighSpeed( void ) { unsigned char status = 0; if( AT91C_UDPHS_SPEED == (AT91C_BASE_UDPHS->UDPHS_INTSTA & AT91C_UDPHS_SPEED) ) { // High Speed TRACE_DEBUG_WP("High Speed\n\r"); status = 1; } else { TRACE_DEBUG_WP("Full Speed\n\r"); } return( status ); } //------------------------------------------------------------------------------ /// Causes the endpoint to acknowledge the next received packet with a STALL /// handshake. /// Further packets are then handled normally. /// \param bEndpoint Index of endpoint /// \return Operation result code: USBD_STATUS_LOCKED or USBD_STATUS_SUCCESS //------------------------------------------------------------------------------ unsigned char USBD_Stall( unsigned char bEndpoint ) { Endpoint *pEndpoint = &(endpoints[bEndpoint]); // Check that endpoint is in Idle state if (pEndpoint->state != UDP_ENDPOINT_IDLE) { TRACE_WARNING("UDP_Stall: Endpoint%d locked\n\r", bEndpoint); return USBD_STATUS_LOCKED; } TRACE_DEBUG_WP("Stall%d ", bEndpoint); AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTSETSTA = AT91C_UDPHS_FRCESTALL; return USBD_STATUS_SUCCESS; } //------------------------------------------------------------------------------ /// Activates a remote wakeup procedure //------------------------------------------------------------------------------ void USBD_RemoteWakeUp(void) { TRACE_DEBUG_WP("Remote WakeUp\n\r"); // Device is currently suspended if (deviceState == USBD_STATE_SUSPENDED) { TRACE_DEBUG_WP("RW\n\r"); UDPHS_EnableUsbClock(); // Activates a remote wakeup AT91C_BASE_UDPHS->UDPHS_CTRL |= AT91C_UDPHS_REWAKEUP; while ((AT91C_BASE_UDPHS->UDPHS_CTRL&AT91C_UDPHS_REWAKEUP) == AT91C_UDPHS_REWAKEUP) { TRACE_DEBUG_WP("W"); } UDPHS_EnableBIAS(); } // Device is NOT suspended else { TRACE_WARNING("USBD_RemoteWakeUp: Device is not suspended\n\r"); } } //------------------------------------------------------------------------------ /// Sets the device address /// \param address Adress to be set //------------------------------------------------------------------------------ void USBD_SetAddress( unsigned char address ) { TRACE_DEBUG_WP("SetAddr(%d) ", address); // Set address AT91C_BASE_UDPHS->UDPHS_CTRL &= ~AT91C_UDPHS_DEV_ADDR; // RAZ Address AT91C_BASE_UDPHS->UDPHS_CTRL |= address | AT91C_UDPHS_FADDR_EN; // If the address is 0, the device returns to the Default state if (address == 0) { deviceState = USBD_STATE_DEFAULT; } // If the address is non-zero, the device enters the Address state else { deviceState = USBD_STATE_ADDRESS; } } //------------------------------------------------------------------------------ /// Changes the device state from Address to Configured, or from Configured /// to Address. /// This method directly access the last received SETUP packet to decide on /// what to do. /// \param cfgnum configuration number //------------------------------------------------------------------------------ void USBD_SetConfiguration( unsigned char cfgnum ) { TRACE_DEBUG_WP("SetCfg(%d) ", cfgnum); // Check the request if( cfgnum != 0 ) { // Enter Configured state deviceState = USBD_STATE_CONFIGURED; } // If the configuration number is zero, the device goes back to the Address // state else { // Go back to Address state deviceState = USBD_STATE_ADDRESS; // Abort all transfers UDPHS_DisableEndpoints(); } } //------------------------------------------------------------------------------ /// Enables the pull-up on the D+ line to connect the device to the USB. //------------------------------------------------------------------------------ void USBD_Connect( void ) { TRACE_DEBUG_WP("Conn "); #if defined(BOARD_USB_PULLUP_INTERNAL) AT91C_BASE_UDPHS->UDPHS_CTRL &= ~AT91C_UDPHS_DETACH; // Pull Up on DP AT91C_BASE_UDPHS->UDPHS_CTRL |= AT91C_UDPHS_PULLD_DIS; // Disable Pull Down #elif defined(BOARD_USB_PULLUP_INTERNAL_BY_MATRIX) TRACE_DEBUG_WP("PUON 1\n\r"); AT91C_BASE_MATRIX->MATRIX_USBPCR |= AT91C_MATRIX_USBPCR_PUON; #elif defined(BOARD_USB_PULLUP_EXTERNAL) #ifdef PIN_USB_PULLUP const Pin pinPullUp = PIN_USB_PULLUP; if( pinPullUp.attribute == PIO_OUTPUT_0 ) { PIO_Set(&pinPullUp); } else { PIO_Clear(&pinPullUp); } #else #error unsupported now #endif #elif !defined(BOARD_USB_PULLUP_ALWAYSON) #error Unsupported pull-up type. #endif } //------------------------------------------------------------------------------ /// Disables the pull-up on the D+ line to disconnect the device from the bus. //------------------------------------------------------------------------------ void USBD_Disconnect( void ) { TRACE_DEBUG_WP("Disc "); #if defined(BOARD_USB_PULLUP_INTERNAL) AT91C_BASE_UDPHS->UDPHS_CTRL |= AT91C_UDPHS_DETACH; // detach AT91C_BASE_UDPHS->UDPHS_CTRL &= ~AT91C_UDPHS_PULLD_DIS; // Enable Pull Down #elif defined(BOARD_USB_PULLUP_INTERNAL_BY_MATRIX) AT91C_BASE_MATRIX->MATRIX_USBPCR &= ~AT91C_MATRIX_USBPCR_PUON; #elif defined(BOARD_USB_PULLUP_EXTERNAL) #ifdef PIN_USB_PULLUP const Pin pinPullUp = PIN_USB_PULLUP; if (pinPullUp.attribute == PIO_OUTPUT_0) { PIO_Clear(&pinPullUp); } else { PIO_Set(&pinPullUp); } #else #error unsupported now #endif #elif !defined(BOARD_USB_PULLUP_ALWAYSON) #error Unsupported pull-up type. #endif // Device returns to the Powered state if (deviceState > USBD_STATE_POWERED) { deviceState = USBD_STATE_POWERED; } if (previousDeviceState > USBD_STATE_POWERED) { previousDeviceState = USBD_STATE_POWERED; } } //------------------------------------------------------------------------------ /// Certification test for High Speed device. /// \param bIndex Test to be done //------------------------------------------------------------------------------ void USBD_Test( unsigned char bIndex ) { char *pFifo; unsigned char i; AT91C_BASE_UDPHS->UDPHS_IEN &= ~AT91C_UDPHS_DET_SUSPD; // remove suspend for TEST AT91C_BASE_UDPHS->UDPHS_TST |= AT91C_UDPHS_SPEED_CFG_HS; // force High Speed (remove suspend) switch( bIndex ) { case USBFeatureRequest_TESTPACKET: TRACE_DEBUG_WP("TEST_PACKET "); AT91C_BASE_UDPHS->UDPHS_DMA[1].UDPHS_DMACONTROL = 0; AT91C_BASE_UDPHS->UDPHS_DMA[2].UDPHS_DMACONTROL = 0; // Configure endpoint 2, 64 bytes, direction IN, type BULK, 1 bank AT91C_BASE_UDPHS->UDPHS_EPT[2].UDPHS_EPTCFG = AT91C_UDPHS_EPT_SIZE_64 | AT91C_UDPHS_EPT_DIR_IN | AT91C_UDPHS_EPT_TYPE_BUL_EPT | AT91C_UDPHS_BK_NUMBER_1; while( (signed int)(AT91C_BASE_UDPHS->UDPHS_EPT[2].UDPHS_EPTCFG & AT91C_UDPHS_EPT_MAPD) != (signed int)AT91C_UDPHS_EPT_MAPD ) {} AT91C_BASE_UDPHS->UDPHS_EPT[2].UDPHS_EPTCTLENB = AT91C_UDPHS_EPT_ENABL; // Write FIFO pFifo = (char*)((unsigned int *)(AT91C_BASE_UDPHS_EPTFIFO->UDPHS_READEPT0) + (EPT_VIRTUAL_SIZE * 2)); for( i=0; iUDPHS_TST |= AT91C_UDPHS_TST_PKT; // Send packet AT91C_BASE_UDPHS->UDPHS_EPT[2].UDPHS_EPTSETSTA = AT91C_UDPHS_TX_PK_RDY; break; case USBFeatureRequest_TESTJ: TRACE_DEBUG_WP("TEST_J "); AT91C_BASE_UDPHS->UDPHS_TST = AT91C_UDPHS_TST_J; break; case USBFeatureRequest_TESTK: TRACE_DEBUG_WP("TEST_K "); AT91C_BASE_UDPHS->UDPHS_TST = AT91C_UDPHS_TST_K; break; case USBFeatureRequest_TESTSE0NAK: TRACE_DEBUG_WP("TEST_SEO_NAK "); AT91C_BASE_UDPHS->UDPHS_IEN = 0; // for test break; case USBFeatureRequest_TESTSENDZLP: //while( 0 != (AT91C_BASE_UDPHS->UDPHS_EPT[0].UDPHS_EPTSTA & AT91C_UDPHS_TX_PK_RDY ) ) {} AT91C_BASE_UDPHS->UDPHS_EPT[0].UDPHS_EPTSETSTA = AT91C_UDPHS_TX_PK_RDY; //while( 0 != (AT91C_BASE_UDPHS->UDPHS_EPT[0].UDPHS_EPTSTA & AT91C_UDPHS_TX_PK_RDY ) ) {} TRACE_DEBUG_WP("SEND_ZLP "); break; } TRACE_DEBUG_WP("\n\r"); } //------------------------------------------------------------------------------ /// Initializes the specified USB driver /// This function initializes the current FIFO bank of endpoints, /// configures the pull-up and VBus lines, disconnects the pull-up and /// then trigger the Init callback. //------------------------------------------------------------------------------ void USBD_Init(void) { unsigned char i; TRACE_DEBUG_WP("USBD Init()\n\r"); // Reset endpoint structures UDPHS_ResetEndpoints(); // Enables the USB Clock UDPHS_EnableUsbClock(); // Configure the pull-up on D+ and disconnect it #if defined(BOARD_USB_PULLUP_INTERNAL) AT91C_BASE_UDPHS->UDPHS_CTRL |= AT91C_UDPHS_DETACH; // detach AT91C_BASE_UDPHS->UDPHS_CTRL |= AT91C_UDPHS_PULLD_DIS; // Disable Pull Down #elif defined(BOARD_USB_PULLUP_INTERNAL_BY_MATRIX) TRACE_DEBUG_WP("PUON 0\n\r"); AT91C_BASE_MATRIX->MATRIX_USBPCR &= ~AT91C_MATRIX_USBPCR_PUON; #elif defined(BOARD_USB_PULLUP_EXTERNAL) #ifdef PIN_USB_PULLUP const Pin pinPullUp = PIN_USB_PULLUP; PIO_Configure(&pinPullUp, 1); if (pinPullUp.attribute == PIO_OUTPUT_0) { PIO_Clear(&pinPullUp); } else { PIO_Set(&pinPullUp); } #else #error unsupported now #endif #elif !defined(BOARD_USB_PULLUP_ALWAYSON) #error Unsupported pull-up type. #endif // Reset and enable IP UDPHS AT91C_BASE_UDPHS->UDPHS_CTRL &= ~AT91C_UDPHS_EN_UDPHS; AT91C_BASE_UDPHS->UDPHS_CTRL |= AT91C_UDPHS_EN_UDPHS; // Enable and disable of the transceiver is automaticaly done by the IP. // With OR without DMA !!! // Initialization of DMA for( i=1; i<=((AT91C_BASE_UDPHS->UDPHS_IPFEATURES & AT91C_UDPHS_DMA_CHANNEL_NBR)>>4); i++ ) { // RESET endpoint canal DMA: // DMA stop channel command AT91C_BASE_UDPHS->UDPHS_DMA[i].UDPHS_DMACONTROL = 0; // STOP command // Disable endpoint AT91C_BASE_UDPHS->UDPHS_EPT[i].UDPHS_EPTCTLDIS = AT91C_UDPHS_SHRT_PCKT | AT91C_UDPHS_BUSY_BANK | AT91C_UDPHS_NAK_OUT | AT91C_UDPHS_NAK_IN | AT91C_UDPHS_STALL_SNT | AT91C_UDPHS_RX_SETUP | AT91C_UDPHS_TX_PK_RDY | AT91C_UDPHS_TX_COMPLT | AT91C_UDPHS_RX_BK_RDY | AT91C_UDPHS_ERR_OVFLW | AT91C_UDPHS_MDATA_RX | AT91C_UDPHS_DATAX_RX | AT91C_UDPHS_NYET_DIS | AT91C_UDPHS_INTDIS_DMA | AT91C_UDPHS_AUTO_VALID | AT91C_UDPHS_EPT_DISABL; // Clear status endpoint AT91C_BASE_UDPHS->UDPHS_EPT[i].UDPHS_EPTCLRSTA = AT91C_UDPHS_TOGGLESQ | AT91C_UDPHS_FRCESTALL | AT91C_UDPHS_RX_BK_RDY | AT91C_UDPHS_TX_COMPLT | AT91C_UDPHS_RX_SETUP | AT91C_UDPHS_STALL_SNT | AT91C_UDPHS_NAK_IN | AT91C_UDPHS_NAK_OUT; // Reset endpoint config AT91C_BASE_UDPHS->UDPHS_EPT[i].UDPHS_EPTCTLENB = 0; // Reset DMA channel (Buff count and Control field) AT91C_BASE_UDPHS->UDPHS_DMA[i].UDPHS_DMACONTROL = AT91C_UDPHS_LDNXT_DSC; // NON STOP command // Reset DMA channel 0 (STOP) AT91C_BASE_UDPHS->UDPHS_DMA[i].UDPHS_DMACONTROL = 0; // STOP command // Clear DMA channel status (read the register for clear it) AT91C_BASE_UDPHS->UDPHS_DMA[i].UDPHS_DMASTATUS = AT91C_BASE_UDPHS->UDPHS_DMA[i].UDPHS_DMASTATUS; } AT91C_BASE_UDPHS->UDPHS_TST = forceUsbFS ? AT91C_UDPHS_SPEED_CFG_FS : 0; AT91C_BASE_UDPHS->UDPHS_IEN = 0; AT91C_BASE_UDPHS->UDPHS_CLRINT = AT91C_UDPHS_UPSTR_RES | AT91C_UDPHS_ENDOFRSM | AT91C_UDPHS_WAKE_UP | AT91C_UDPHS_ENDRESET | AT91C_UDPHS_IEN_SOF | AT91C_UDPHS_MICRO_SOF | AT91C_UDPHS_DET_SUSPD; // Device is in the Attached state deviceState = USBD_STATE_SUSPENDED; previousDeviceState = USBD_STATE_POWERED; // Disable interrupts AT91C_BASE_UDPHS->UDPHS_IEN = AT91C_UDPHS_ENDOFRSM | AT91C_UDPHS_WAKE_UP | AT91C_UDPHS_DET_SUSPD; // Disable USB clocks UDPHS_DisableUsbClock(); // Configure interrupts USBDCallbacks_Initialized(); } //------------------------------------------------------------------------------ /// Configure USB Speed, should be invoked before USB attachment. /// \param forceFS Force to use FS mode. //------------------------------------------------------------------------------ void USBD_ConfigureSpeed(unsigned char forceFS) { if (forceFS) { AT91C_BASE_UDPHS->UDPHS_TST |= AT91C_UDPHS_SPEED_CFG_FS; } else { AT91C_BASE_UDPHS->UDPHS_TST &= ~AT91C_UDPHS_SPEED_CFG_FS; } } //------------------------------------------------------------------------------ /// Returns the current state of the USB device. /// \return Device current state. //------------------------------------------------------------------------------ unsigned char USBD_GetState( void ) { return deviceState; } #endif // BOARD_USB_UDPHS tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/utility/000077500000000000000000000000001207233610700231225ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/utility/assert.h000066400000000000000000000113211207233610700245720ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !Purpose /// /// Definition of the ASSERT() and SANITY_CHECK() macros, which are used for /// runtime condition & parameter verifying. /// /// !Usage /// /// -# Use ASSERT() in your code to check the value of function parameters, /// return values, etc. *Warning:* the ASSERT() condition must not have /// any side-effect; otherwise, the program may not work properly /// anymore when assertions are disabled. /// -# Use SANITY_CHECK() to perform checks with a default error message /// (outputs the file and line number where the error occured). This /// reduces memory overhead caused by assertion error strings. /// -# Initialize the dbgu to see failed assertions at run-time. /// -# Assertions can be entirely disabled by defining the NOASSERT symbol /// at compilation time. //------------------------------------------------------------------------------ #ifndef ASSERT_H #define ASSERT_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include #include "trace.h" //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ #if defined(NOASSERT) #define ASSERT(...) #define SANITY_CHECK(...) #else #if (TRACE_LEVEL == 0) /// Checks that the given condition is true, /// otherwise stops the program execution. /// \param condition Condition to verify. #define ASSERT(condition, ...) { \ if (!(condition)) { \ while (1); \ } \ } /// Performs the same duty as the ASSERT() macro /// \param condition Condition to verify. #define SANITY_CHECK(condition) ASSERT(condition, ...) #else /// Checks that the given condition is true, otherwise displays an error /// message and stops the program execution. /// \param condition Condition to verify. #define ASSERT(condition, ...) { \ if (!(condition)) { \ printf("-F- ASSERT: "); \ printf(__VA_ARGS__); \ while (1); \ } \ } #define SANITY_ERROR "Sanity check failed at %s:%d\n\r" /// Performs the same duty as the ASSERT() macro, except a default error /// message is output if the condition is false. /// \param condition Condition to verify. #define SANITY_CHECK(condition) ASSERT(condition, SANITY_ERROR, __FILE__, __LINE__) #endif #endif #endif //#ifndef ASSERT_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/utility/led.c000066400000000000000000000126551207233610700240430ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "led.h" #include #include //------------------------------------------------------------------------------ // Local Variables //------------------------------------------------------------------------------ #ifdef PINS_LEDS static const Pin pinsLeds[] = {PINS_LEDS}; static const unsigned int numLeds = PIO_LISTSIZE(pinsLeds); #endif //------------------------------------------------------------------------------ // Global Functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Configures the pin associated with the given LED number. If the LED does /// not exist on the board, the function does nothing. /// \param led Number of the LED to configure. /// \return 1 if the LED exists and has been configured; otherwise 0. //------------------------------------------------------------------------------ unsigned char LED_Configure(unsigned int led) { #ifdef PINS_LEDS // Check that LED exists if (led >= numLeds) { return 0; } // Configure LED return (PIO_Configure(&pinsLeds[led], 1)); #else return 0; #endif } //------------------------------------------------------------------------------ /// Turns the given LED on if it exists; otherwise does nothing. /// \param led Number of the LED to turn on. /// \return 1 if the LED has been turned on; 0 otherwise. //------------------------------------------------------------------------------ unsigned char LED_Set(unsigned int led) { #ifdef PINS_LEDS // Check if LED exists if (led >= numLeds) { return 0; } // Turn LED on if (pinsLeds[led].type == PIO_OUTPUT_0) { PIO_Set(&pinsLeds[led]); } else { PIO_Clear(&pinsLeds[led]); } return 1; #else return 0; #endif } //------------------------------------------------------------------------------ /// Turns a LED off. /// \param led Number of the LED to turn off. /// \param 1 if the LED has been turned off; 0 otherwise. //------------------------------------------------------------------------------ unsigned char LED_Clear(unsigned int led) { #ifdef PINS_LEDS // Check if LED exists if (led >= numLeds) { return 0; } // Turn LED off if (pinsLeds[led].type == PIO_OUTPUT_0) { PIO_Clear(&pinsLeds[led]); } else { PIO_Set(&pinsLeds[led]); } return 1; #else return 0; #endif } //------------------------------------------------------------------------------ /// Toggles the current state of a LED. /// \param led Number of the LED to toggle. /// \return 1 if the LED has been toggled; otherwise 0. //------------------------------------------------------------------------------ unsigned char LED_Toggle(unsigned int led) { #ifdef PINS_LEDS // Check if LED exists if (led >= numLeds) { return 0; } // Toggle LED if (PIO_GetOutputDataStatus(&pinsLeds[led])) { PIO_Clear(&pinsLeds[led]); } else { PIO_Set(&pinsLeds[led]); } return 1; #else return 0; #endif } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/utility/led.h000066400000000000000000000067001207233610700240420ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !Purpose /// /// Small set of functions for simple and portable LED usage. /// /// !Usage /// /// -# Configure one or more LEDs using LED_Configure and /// LED_ConfigureAll. /// -# Set, clear and toggle LEDs using LED_Set, LED_Clear and /// LED_Toggle. /// /// LEDs are numbered starting from 0; the number of LEDs depend on the /// board being used. All the functions defined here will compile properly /// regardless of whether the LED is defined or not; they will simply /// return 0 when a LED which does not exist is given as an argument. /// Also, these functions take into account how each LED is connected on to /// board; thus, might change the level on the corresponding pin /// to 0 or 1, but it will always light the LED on; same thing for the other /// methods. //------------------------------------------------------------------------------ #ifndef LED_H #define LED_H //------------------------------------------------------------------------------ // Global Functions //------------------------------------------------------------------------------ extern unsigned char LED_Configure(unsigned int led); extern unsigned char LED_Set(unsigned int led); extern unsigned char LED_Clear(unsigned int led); extern unsigned char LED_Toggle(unsigned int led); #endif //#ifndef LED_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/utility/stdio.c000066400000000000000000000374001207233610700244140ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !Purpose /// /// Implementation of several stdio.h methods, such as printf(), sprintf() and /// so on. This reduces the memory footprint of the binary when using those /// methods, compared to the libc implementation. /// /// !Usage /// /// Adds stdio.c to the list of file to compile for the project. This will /// automatically replace libc methods by the custom ones. //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include #include //------------------------------------------------------------------------------ // Local Definitions //------------------------------------------------------------------------------ // Maximum string size allowed (in bytes). #define MAX_STRING_SIZE 100 //------------------------------------------------------------------------------ // Global Variables //------------------------------------------------------------------------------ // Required for proper compilation. struct _reent r = {0, (FILE *) 0, (FILE *) 1, (FILE *) 0}; struct _reent *_impure_ptr = &r; //------------------------------------------------------------------------------ // Local Functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Writes a character inside the given string. Returns 1. // \param pStr Storage string. // \param c Character to write. //------------------------------------------------------------------------------ signed int PutChar(char *pStr, char c) { *pStr = c; return 1; } //------------------------------------------------------------------------------ // Writes a string inside the given string. // Returns the size of the written // string. // \param pStr Storage string. // \param pSource Source string. //------------------------------------------------------------------------------ signed int PutString(char *pStr, const char *pSource) { signed int num = 0; while (*pSource != 0) { *pStr++ = *pSource++; num++; } return num; } //------------------------------------------------------------------------------ // Writes an unsigned int inside the given string, using the provided fill & // width parameters. // Returns the size in characters of the written integer. // \param pStr Storage string. // \param fill Fill character. // \param width Minimum integer width. // \param value Integer value. //------------------------------------------------------------------------------ signed int PutUnsignedInt( char *pStr, char fill, signed int width, unsigned int value) { signed int num = 0; // Take current digit into account when calculating width width--; // Recursively write upper digits if ((value / 10) > 0) { num = PutUnsignedInt(pStr, fill, width, value / 10); pStr += num; } // Write filler characters else { while (width > 0) { PutChar(pStr, fill); pStr++; num++; width--; } } // Write lower digit num += PutChar(pStr, (value % 10) + '0'); return num; } //------------------------------------------------------------------------------ // Writes a signed int inside the given string, using the provided fill & width // parameters. // Returns the size of the written integer. // \param pStr Storage string. // \param fill Fill character. // \param width Minimum integer width. // \param value Signed integer value. //------------------------------------------------------------------------------ signed int PutSignedInt( char *pStr, char fill, signed int width, signed int value) { signed int num = 0; unsigned int absolute; // Compute absolute value if (value < 0) { absolute = -value; } else { absolute = value; } // Take current digit into account when calculating width width--; // Recursively write upper digits if ((absolute / 10) > 0) { if (value < 0) { num = PutSignedInt(pStr, fill, width, -(absolute / 10)); } else { num = PutSignedInt(pStr, fill, width, absolute / 10); } pStr += num; } else { // Reserve space for sign if (value < 0) { width--; } // Write filler characters while (width > 0) { PutChar(pStr, fill); pStr++; num++; width--; } // Write sign if (value < 0) { num += PutChar(pStr, '-'); pStr++; } } // Write lower digit num += PutChar(pStr, (absolute % 10) + '0'); return num; } //------------------------------------------------------------------------------ // Writes an hexadecimal value into a string, using the given fill, width & // capital parameters. // Returns the number of char written. // \param pStr Storage string. // \param fill Fill character. // \param width Minimum integer width. // \param maj Indicates if the letters must be printed in lower- or upper-case. // \param value Hexadecimal value. //------------------------------------------------------------------------------ signed int PutHexa( char *pStr, char fill, signed int width, unsigned char maj, unsigned int value) { signed int num = 0; // Decrement width width--; // Recursively output upper digits if ((value >> 4) > 0) { num += PutHexa(pStr, fill, width, maj, value >> 4); pStr += num; } // Write filler chars else { while (width > 0) { PutChar(pStr, fill); pStr++; num++; width--; } } // Write current digit if ((value & 0xF) < 10) { PutChar(pStr, (value & 0xF) + '0'); } else if (maj) { PutChar(pStr, (value & 0xF) - 10 + 'A'); } else { PutChar(pStr, (value & 0xF) - 10 + 'a'); } num++; return num; } //------------------------------------------------------------------------------ // Global Functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Stores the result of a formatted string into another string. Format /// arguments are given in a va_list instance. /// Return the number of characters written. /// \param pStr Destination string. /// \param length Length of Destination string. /// \param pFormat Format string. /// \param ap Argument list. //------------------------------------------------------------------------------ signed int vsnprintf(char *pStr, size_t length, const char *pFormat, va_list ap) { char fill; unsigned char width; signed int num = 0; signed int size = 0; // Clear the string if (pStr) { *pStr = 0; } // Phase string while (*pFormat != 0 && size < length) { // Normal character if (*pFormat != '%') { *pStr++ = *pFormat++; size++; } // Escaped '%' else if (*(pFormat+1) == '%') { *pStr++ = '%'; pFormat += 2; size++; } // Token delimiter else { fill = ' '; width = 0; pFormat++; // Parse filler if (*pFormat == '0') { fill = '0'; pFormat++; } // Parse width while ((*pFormat >= '0') && (*pFormat <= '9')) { width = (width*10) + *pFormat-'0'; pFormat++; } // Check if there is enough space if (size + width > length) { width = length - size; } // Parse type switch (*pFormat) { case 'd': case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break; case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break; case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break; case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break; case 's': num = PutString(pStr, va_arg(ap, char *)); break; case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break; default: return EOF; } pFormat++; pStr += num; size += num; } } // NULL-terminated (final \0 is not counted) if (size < length) { *pStr = 0; } else { *(--pStr) = 0; size--; } return size; } //------------------------------------------------------------------------------ /// Stores the result of a formatted string into another string. Format /// arguments are given in a va_list instance. /// Return the number of characters written. /// \param pString Destination string. /// \param length Length of Destination string. /// \param pFormat Format string. /// \param ... Other arguments //------------------------------------------------------------------------------ signed int snprintf(char *pString, size_t length, const char *pFormat, ...) { va_list ap; signed int rc; va_start(ap, pFormat); rc = vsnprintf(pString, length, pFormat, ap); va_end(ap); return rc; } //------------------------------------------------------------------------------ /// Stores the result of a formatted string into another string. Format /// arguments are given in a va_list instance. /// Return the number of characters written. /// \param pString Destination string. /// \param pFormat Format string. /// \param ap Argument list. //------------------------------------------------------------------------------ signed int vsprintf(char *pString, const char *pFormat, va_list ap) { return vsnprintf(pString, MAX_STRING_SIZE, pFormat, ap); } //------------------------------------------------------------------------------ /// Outputs a formatted string on the given stream. Format arguments are given /// in a va_list instance. /// \param pStream Output stream. /// \param pFormat Format string /// \param ap Argument list. //------------------------------------------------------------------------------ signed int vfprintf(FILE *pStream, const char *pFormat, va_list ap) { char pStr[MAX_STRING_SIZE]; char pError[] = "stdio.c: increase MAX_STRING_SIZE\n\r"; // Write formatted string in buffer if (vsprintf(pStr, pFormat, ap) >= MAX_STRING_SIZE) { fputs(pError, stderr); while (1); // Increase MAX_STRING_SIZE } // Display string return fputs(pStr, pStream); } //------------------------------------------------------------------------------ /// Outputs a formatted string on the DBGU stream. Format arguments are given /// in a va_list instance. /// \param pFormat Format string /// \param ap Argument list. //------------------------------------------------------------------------------ signed int vprintf(const char *pFormat, va_list ap) { return vfprintf(stdout, pFormat, ap); } //------------------------------------------------------------------------------ /// Outputs a formatted string on the given stream, using a variable number of /// arguments. /// \param pStream Output stream. /// \param pFormat Format string. //------------------------------------------------------------------------------ signed int fprintf(FILE *pStream, const char *pFormat, ...) { va_list ap; signed int result; // Forward call to vfprintf va_start(ap, pFormat); result = vfprintf(pStream, pFormat, ap); va_end(ap); return result; } //------------------------------------------------------------------------------ /// Outputs a formatted string on the DBGU stream, using a variable number of /// arguments. /// \param pFormat Format string. //------------------------------------------------------------------------------ signed int printf(const char *pFormat, ...) { va_list ap; signed int result; // Forward call to vprintf va_start(ap, pFormat); result = vprintf(pFormat, ap); va_end(ap); return result; } //------------------------------------------------------------------------------ /// Writes a formatted string inside another string. /// \param pStr Storage string. /// \param pFormat Format string. //------------------------------------------------------------------------------ signed int sprintf(char *pStr, const char *pFormat, ...) { va_list ap; signed int result; // Forward call to vsprintf va_start(ap, pFormat); result = vsprintf(pStr, pFormat, ap); va_end(ap); return result; } //------------------------------------------------------------------------------ /// Outputs a string on stdout. /// \param pStr String to output. //------------------------------------------------------------------------------ signed int puts(const char *pStr) { return fputs(pStr, stdout); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/utility/string.c000066400000000000000000000220141207233610700245730ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !Purpose /// /// Implementation of several methods defined in string.h, for reducing the /// memory footprint when using them (since the whole libc.o file gets included /// even when using a single method). /// /// !Usage /// /// Add string.c to the list of files to compile for the project. This will /// automatically replace standard libc methods by the custom ones. //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include //------------------------------------------------------------------------------ // Global Functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Copies data from a source buffer into a destination buffer. The two buffers /// must NOT overlap. Returns the destination buffer. /// \param pDestination Destination buffer. /// \param pSource Source buffer. /// \param num Number of bytes to copy. //------------------------------------------------------------------------------ void * memcpy(void *pDestination, const void *pSource, size_t num) { unsigned char *pByteDestination; unsigned char *pByteSource; unsigned int *pAlignedSource = (unsigned int *) pSource; unsigned int *pAlignedDestination = (unsigned int *) pDestination; // If num is more than 4 bytes, and both dest. and source are aligned, // then copy dwords if ((((unsigned int) pAlignedDestination & 0x3) == 0) && (((unsigned int) pAlignedSource & 0x3) == 0) && (num >= 4)) { while (num >= 4) { *pAlignedDestination++ = *pAlignedSource++; num -= 4; } } // Copy remaining bytes pByteDestination = (unsigned char *) pAlignedDestination; pByteSource = (unsigned char *) pAlignedSource; while (num--) { *pByteDestination++ = *pByteSource++; } return pDestination; } //------------------------------------------------------------------------------ /// Fills a memory region with the given value. Returns a pointer to the /// memory region. /// \param pBuffer Pointer to the start of the memory region to fill /// \param value Value to fill the region with /// \param num Size to fill in bytes //------------------------------------------------------------------------------ void * memset(void *pBuffer, int value, size_t num) { unsigned char *pByteDestination; unsigned int *pAlignedDestination = (unsigned int *) pBuffer; unsigned int alignedValue = (value << 24) | (value << 16) | (value << 8) | value; // Set words if possible if ((((unsigned int) pAlignedDestination & 0x3) == 0) && (num >= 4)) { while (num >= 4) { *pAlignedDestination++ = alignedValue; num -= 4; } } // Set remaining bytes pByteDestination = (unsigned char *) pAlignedDestination; while (num--) { *pByteDestination++ = value; } return pBuffer; } //----------------------------------------------------------------------------- /// Search a character in the given string. /// Returns a pointer to the character location. /// \param pString Pointer to the start of the string to search. /// \param character The character to find. //----------------------------------------------------------------------------- char * strchr(const char *pString, int character) { char * p = (char *)pString; char c = character & 0xFF; while(*p != c) { if (*p == 0) { return 0; } p++; } return p; } //----------------------------------------------------------------------------- /// Return the length of a given string /// \param pString Pointer to the start of the string. //----------------------------------------------------------------------------- size_t strlen(const char *pString) { unsigned int length = 0; while(*pString++ != 0) { length++; } return length; } //----------------------------------------------------------------------------- /// Search a character backword from the end of given string. /// Returns a pointer to the character location. /// \param pString Pointer to the start of the string to search. /// \param character The character to find. //----------------------------------------------------------------------------- char * strrchr(const char *pString, int character) { char *p = 0; while(*pString != 0) { if (*pString++ == character) { p = (char*)pString; } } return p; } //----------------------------------------------------------------------------- /// Copy from source string to destination string /// Return a pointer to the destination string /// \param pDestination Pointer to the destination string. /// \param pSource Pointer to the source string. //----------------------------------------------------------------------------- char * strcpy(char *pDestination, const char *pSource) { char *pSaveDest = pDestination; for(; (*pDestination = *pSource) != 0; ++pSource, ++pDestination); return pSaveDest; } //----------------------------------------------------------------------------- /// Compare the first specified bytes of 2 given strings /// Return 0 if equals /// Return >0 if 1st string > 2nd string /// Return <0 if 1st string < 2nd string /// \param pString1 Pointer to the start of the 1st string. /// \param pString2 Pointer to the start of the 2nd string. /// \param count Number of bytes that should be compared. //----------------------------------------------------------------------------- int strncmp(const char *pString1, const char *pString2, size_t count) { int r; while(count) { r = *pString1 - *pString2; if (r == 0) { if (*pString1 == 0) { break; } pString1++; pString2++; count--; continue; } return r; } return 0; } //----------------------------------------------------------------------------- /// Copy the first number of bytes from source string to destination string /// Return the pointer to the destination string. /// \param pDestination Pointer to the start of destination string. /// \param pSource Pointer to the start of the source string. /// \param count Number of bytes that should be copied. //----------------------------------------------------------------------------- char * strncpy(char *pDestination, const char *pSource, size_t count) { char *pSaveDest = pDestination; while (count) { *pDestination = *pSource; if (*pSource == 0) { break; } pDestination++; pSource++; count--; } return pSaveDest; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/utility/trace.c000066400000000000000000000232431207233610700243700ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include "trace.h" //------------------------------------------------------------------------------ // Internal variables //------------------------------------------------------------------------------ /// Trace level can be set at applet initialization #if !defined(NOTRACE) && (DYN_TRACES == 1) unsigned int traceLevel = TRACE_LEVEL; #endif #ifndef NOFPUT #include #include //------------------------------------------------------------------------------ /// \exclude /// Implementation of fputc using the DBGU as the standard output. Required /// for printf(). /// \param c Character to write. /// \param pStream Output stream. /// \param The character written if successful, or -1 if the output stream is /// not stdout or stderr. //------------------------------------------------------------------------------ signed int fputc(signed int c, FILE *pStream) { if ((pStream == stdout) || (pStream == stderr)) { TRACE_PutChar(c); return c; } else { return EOF; } } //------------------------------------------------------------------------------ /// \exclude /// Implementation of fputs using the DBGU as the standard output. Required /// for printf(). Does NOT currently use the PDC. /// \param pStr String to write. /// \param pStream Output stream. /// \return Number of characters written if successful, or -1 if the output /// stream is not stdout or stderr. //------------------------------------------------------------------------------ signed int fputs(const char *pStr, FILE *pStream) { signed int num = 0; while (*pStr != 0) { if (fputc(*pStr, pStream) == -1) { return -1; } num++; pStr++; } return num; } #undef putchar //------------------------------------------------------------------------------ /// \exclude /// Outputs a character on the DBGU. /// \param c Character to output. /// \return The character that was output. //------------------------------------------------------------------------------ signed int putchar(signed int c) { return fputc(c, stdout); } #endif //#ifndef NOFPUT //------------------------------------------------------------------------------ // Local Functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Print char if printable. If not print a point /// \param c char to //------------------------------------------------------------------------------ static void PrintChar(unsigned char c) { if( (/*c >= 0x00 &&*/ c <= 0x1F) || (c >= 0xB0 && c <= 0xDF) ) { printf("."); } else { printf("%c", c); } } //------------------------------------------------------------------------------ // Global Functions //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Displays the content of the given frame on the Trace interface. /// \param pBuffer Pointer to the frame to dump. /// \param size Buffer size in bytes. //------------------------------------------------------------------------------ void TRACE_DumpFrame(unsigned char *pFrame, unsigned int size) { unsigned int i; for (i=0; i < size; i++) { printf("%02X ", pFrame[i]); } printf("\n\r"); } //------------------------------------------------------------------------------ /// Displays the content of the given buffer on the Trace interface. /// \param pBuffer Pointer to the buffer to dump. /// \param size Buffer size in bytes. /// \param address Start address to display //------------------------------------------------------------------------------ void TRACE_DumpMemory( unsigned char *pBuffer, unsigned int size, unsigned int address ) { unsigned int i, j; unsigned int lastLineStart; unsigned char* pTmp; for (i=0; i < (size / 16); i++) { printf("0x%08X: ", address + (i*16)); pTmp = (unsigned char*)&pBuffer[i*16]; for (j=0; j < 4; j++) { printf("%02X%02X%02X%02X ", pTmp[0],pTmp[1],pTmp[2],pTmp[3]); pTmp += 4; } pTmp = (unsigned char*)&pBuffer[i*16]; for (j=0; j < 16; j++) { PrintChar(*pTmp++); } printf("\n\r"); } if( (size%16) != 0) { lastLineStart = size - (size%16); printf("0x%08X: ", address + lastLineStart); for (j= lastLineStart; j < lastLineStart+16; j++) { if( (j!=lastLineStart) && (j%4 == 0) ) { printf(" "); } if(j= '0' && key <= '9' ) { value = (value * 10) + (key - '0'); nbNb++; } else if(key == 0x0D || key == ' ') { if(nbNb == 0) { printf("\n\rWrite a number and press ENTER or SPACE!\n\r"); return 0; } else { printf("\n\r"); *pValue = value; return 1; } } else { printf("\n\r'%c' not a number!\n\r", key); return 0; } } } //------------------------------------------------------------------------------ /// Reads an integer and check the value //------------------------------------------------------------------------------ unsigned char TRACE_GetIntegerMinMax( unsigned int *pValue, unsigned int min, unsigned int max ) { unsigned int value = 0; if( TRACE_GetInteger(&value) == 0) { return 0; } if(value < min || value > max) { printf("\n\rThe number have to be between %d and %d\n\r", min, max); return 0; } printf("\n\r"); *pValue = value; return 1; } //------------------------------------------------------------------------------ /// Reads an hexadecimal number //------------------------------------------------------------------------------ unsigned char TRACE_GetHexa32(unsigned int *pValue) { unsigned char key; unsigned int i = 0; unsigned int value = 0; for(i = 0; i < 8; i++) { key = TRACE_GetChar(); TRACE_PutChar(key); if(key >= '0' && key <= '9' ) { value = (value * 16) + (key - '0'); } else if(key >= 'A' && key <= 'F' ) { value = (value * 16) + (key - 'A' + 10) ; } else if(key >= 'a' && key <= 'f' ) { value = (value * 16) + (key - 'a' + 10) ; } else { printf("\n\rIt is not a hexa character!\n\r"); return 0; } } printf("\n\r"); *pValue = value; return 1; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/usb/utility/trace.h000066400000000000000000000356131207233610700244010ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ //------------------------------------------------------------------------------ /// \unit /// /// !Purpose /// /// Standard output methods for reporting debug information, warnings and /// errors, which can be easily be turned on/off. /// /// !Usage /// -# Initialize the DBGU using TRACE_CONFIGURE() if you intend to eventually /// disable ALL traces; otherwise use DBGU_Configure(). /// -# Uses the TRACE_DEBUG(), TRACE_INFO(), TRACE_WARNING(), TRACE_ERROR() /// TRACE_FATAL() macros to output traces throughout the program. /// -# Each type of trace has a level : Debug 5, Info 4, Warning 3, Error 2 /// and Fatal 1. Disable a group of traces by changing the value of /// TRACE_LEVEL during compilation; traces with a level bigger than TRACE_LEVEL /// are not generated. To generate no trace, use the reserved value 0. /// -# Trace disabling can be static or dynamic. If dynamic disabling is selected /// the trace level can be modified in runtime. If static disabling is selected /// the disabled traces are not compiled. /// /// !Trace level description /// -# TRACE_DEBUG (5): Traces whose only purpose is for debugging the program, /// and which do not produce meaningful information otherwise. /// -# TRACE_INFO (4): Informational trace about the program execution. Should /// enable the user to see the execution flow. /// -# TRACE_WARNING (3): Indicates that a minor error has happened. In most case /// it can be discarded safely; it may even be expected. /// -# TRACE_ERROR (2): Indicates an error which may not stop the program execution, /// but which indicates there is a problem with the code. /// -# TRACE_FATAL (1): Indicates a major error which prevents the program from going /// any further. //------------------------------------------------------------------------------ #ifndef TRACE_H #define TRACE_H //------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------ #include #include #include // Select the trace interface // (add usart.o file in makefile if Usart interface is selected) #define TRACE_DBGU 1 //#define TRACE_USART_0 1 //#define TRACE_USART_1 1 //#define TRACE_USART_2 1 #if defined(TRACE_DBGU) #include #else #include #endif //------------------------------------------------------------------------------ // Global Definitions //------------------------------------------------------------------------------ /// Softpack Version #define SOFTPACK_VERSION "1.6" #define TRACE_LEVEL_DEBUG 5 #define TRACE_LEVEL_INFO 4 #define TRACE_LEVEL_WARNING 3 #define TRACE_LEVEL_ERROR 2 #define TRACE_LEVEL_FATAL 1 #define TRACE_LEVEL_NO_TRACE 0 // By default, all traces are output except the debug one. #if !defined(TRACE_LEVEL) #define TRACE_LEVEL TRACE_LEVEL_INFO #endif // By default, trace level is static (not dynamic) #if !defined(DYN_TRACES) #define DYN_TRACES 0 #endif #if defined(NOTRACE) #error "Error: NOTRACE has to be not defined !" #endif #undef NOTRACE #if (DYN_TRACES==0) #if (TRACE_LEVEL == TRACE_LEVEL_NO_TRACE) #define NOTRACE #endif #endif //------------------------------------------------------------------------------ // Global Macros //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// Initializes the trace for normal project /// \param mode DBGU mode. /// \param baudrate DBGU baudrate. /// \param mck Master clock frequency. //------------------------------------------------------------------------------ #if defined(TRACE_DBGU) #define TRACE_CONFIGURE(mode, baudrate, mck) { \ const Pin pinsDbgu[] = {PINS_DBGU}; \ PIO_Configure(pinsDbgu, PIO_LISTSIZE(pinsDbgu)); \ DBGU_Configure(mode, baudrate, mck); \ } #elif defined(TRACE_USART_0) #define TRACE_CONFIGURE(mode, baudrate, mck) { \ const Pin pinsUsart[] = {PIN_USART0_TXD, PIN_USART0_RXD}; \ AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_US0;\ AT91C_BASE_US0->US_IDR = 0xFFFFFFFF;\ PIO_Configure(pinsUsart, PIO_LISTSIZE(pinsUsart)); \ USART_Configure(AT91C_BASE_US0,USART_MODE_ASYNCHRONOUS, baudrate, mck); \ USART_SetTransmitterEnabled(AT91C_BASE_US0,1);\ USART_SetReceiverEnabled(AT91C_BASE_US0,1);\ } #elif defined(TRACE_USART_1) #define TRACE_CONFIGURE(mode, baudrate, mck) { \ const Pin pinsUsart[] = {PIN_USART1_TXD, PIN_USART1_RXD}; \ AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_US1;\ AT91C_BASE_US1->US_IDR = 0xFFFFFFFF;\ PIO_Configure(pinsUsart, PIO_LISTSIZE(pinsUsart)); \ USART_Configure(AT91C_BASE_US1,USART_MODE_ASYNCHRONOUS, baudrate, mck); \ USART_SetTransmitterEnabled(AT91C_BASE_US1,1);\ USART_SetReceiverEnabled(AT91C_BASE_US1,1);\ } #elif defined(TRACE_USART_2) #define TRACE_CONFIGURE(mode, baudrate, mck) { \ const Pin pinsUsart[] = {PIN_USART2_TXD, PIN_USART2_RXD}; \ AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_US2;\ AT91C_BASE_US2->US_IDR = 0xFFFFFFFF;\ PIO_Configure(pinsUsart, PIO_LISTSIZE(pinsUsart)); \ USART_Configure(AT91C_BASE_US2,USART_MODE_ASYNCHRONOUS, baudrate, mck); \ USART_SetTransmitterEnabled(AT91C_BASE_US2,1);\ USART_SetReceiverEnabled(AT91C_BASE_US2,1);\ } #endif //------------------------------------------------------------------------------ /// Initializes the trace for ISP project /// \param mode DBGU mode. /// \param baudrate DBGU baudrate. /// \param mck Master clock frequency. //------------------------------------------------------------------------------ #if (TRACE_LEVEL==0) && (DYN_TRACES==0) #define TRACE_CONFIGURE_ISP(mode, baudrate, mck) {} #elif defined(TRACE_DBGU) #define TRACE_CONFIGURE_ISP(mode, baudrate, mck) { \ const Pin pinsDbgu[] = {PINS_DBGU}; \ PIO_Configure(pinsDbgu, PIO_LISTSIZE(pinsDbgu)); \ DBGU_Configure(mode, baudrate, mck); \ } #elif defined(TRACE_USART_0) #define TRACE_CONFIGURE_ISP(mode, baudrate, mck) { \ const Pin pinsUsart[] = {PIN_USART0_TXD, PIN_USART0_RXD}; \ AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_US0;\ AT91C_BASE_US0->US_IDR = 0xFFFFFFFF;\ PIO_Configure(pinsUsart, PIO_LISTSIZE(pinsUsart)); \ USART_Configure(AT91C_BASE_US0,USART_MODE_ASYNCHRONOUS, baudrate, mck); \ USART_SetTransmitterEnabled(AT91C_BASE_US0,1);\ USART_SetReceiverEnabled(AT91C_BASE_US0,1);\ } #elif defined(TRACE_USART_1) #define TRACE_CONFIGURE_ISP(mode, baudrate, mck) { \ const Pin pinsUsart[] = {PIN_USART1_TXD, PIN_USART1_RXD}; \ AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_US1;\ AT91C_BASE_US1->US_IDR = 0xFFFFFFFF;\ PIO_Configure(pinsUsart, PIO_LISTSIZE(pinsUsart)); \ USART_Configure(AT91C_BASE_US1,USART_MODE_ASYNCHRONOUS, baudrate, mck); \ USART_SetTransmitterEnabled(AT91C_BASE_US1,1);\ USART_SetReceiverEnabled(AT91C_BASE_US1,1);\ } #elif defined(TRACE_USART_2) #define TRACE_CONFIGURE_ISP(mode, baudrate, mck) { \ const Pin pinsUsart[] = {PIN_USART2_TXD, PIN_USART2_RXD}; \ AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_US2;\ AT91C_BASE_US2->US_IDR = 0xFFFFFFFF;\ PIO_Configure(pinsUsart, PIO_LISTSIZE(pinsUsart)); \ USART_Configure(AT91C_BASE_US2,USART_MODE_ASYNCHRONOUS, baudrate, mck); \ USART_SetTransmitterEnabled(AT91C_BASE_US2,1);\ USART_SetReceiverEnabled(AT91C_BASE_US2,1);\ } #endif //------------------------------------------------------------------------------ /// Macros TRACE_PutChar & TRACE_GetChar & TRACE_IsRxReady //------------------------------------------------------------------------------ #if defined(TRACE_DBGU) #define TRACE_PutChar(c) DBGU_PutChar(c) #define TRACE_GetChar() DBGU_GetChar() #define TRACE_IsRxReady() DBGU_IsRxReady() #elif defined(TRACE_USART_0) #define TRACE_PutChar(c) USART_PutChar(AT91C_BASE_US0, c) #define TRACE_GetChar() USART_GetChar(AT91C_BASE_US0) #define TRACE_IsRxReady() USART_IsRxReady(AT91C_BASE_US0) #elif defined(TRACE_USART_1) #define TRACE_PutChar(c) USART_PutChar(AT91C_BASE_US1, c) #define TRACE_GetChar() USART_GetChar(AT91C_BASE_US1) #define TRACE_IsRxReady() USART_IsRxReady(AT91C_BASE_US1) #elif defined(TRACE_USART_2) #define TRACE_PutChar(c) USART_PutChar(AT91C_BASE_US2, c) #define TRACE_GetChar() USART_GetChar(AT91C_BASE_US2) #define TRACE_IsRxReady() USART_IsRxReady(AT91C_BASE_US2) #endif //------------------------------------------------------------------------------ /// Outputs a formatted string using if the log level is high /// enough. Can be disabled by defining TRACE_LEVEL=0 during compilation. /// \param format Formatted string to output. /// \param ... Additional parameters depending on formatted string. //------------------------------------------------------------------------------ #if defined(NOTRACE) // Empty macro #define TRACE_DEBUG(...) { } #define TRACE_INFO(...) { } #define TRACE_WARNING(...) { } #define TRACE_ERROR(...) { } #define TRACE_FATAL(...) { while(1); } #define TRACE_DEBUG_WP(...) { } #define TRACE_INFO_WP(...) { } #define TRACE_WARNING_WP(...) { } #define TRACE_ERROR_WP(...) { } #define TRACE_FATAL_WP(...) { while(1); } #elif (DYN_TRACES == 1) // Trace output depends on traceLevel value #define TRACE_DEBUG(...) { if (traceLevel >= TRACE_LEVEL_DEBUG) { printf("-D- " __VA_ARGS__); } } #define TRACE_INFO(...) { if (traceLevel >= TRACE_LEVEL_INFO) { printf("-I- " __VA_ARGS__); } } #define TRACE_WARNING(...) { if (traceLevel >= TRACE_LEVEL_WARNING) { printf("-W- " __VA_ARGS__); } } #define TRACE_ERROR(...) { if (traceLevel >= TRACE_LEVEL_ERROR) { printf("-E- " __VA_ARGS__); } } #define TRACE_FATAL(...) { if (traceLevel >= TRACE_LEVEL_FATAL) { printf("-F- " __VA_ARGS__); while(1); } } #define TRACE_DEBUG_WP(...) { if (traceLevel >= TRACE_LEVEL_DEBUG) { printf(__VA_ARGS__); } } #define TRACE_INFO_WP(...) { if (traceLevel >= TRACE_LEVEL_INFO) { printf(__VA_ARGS__); } } #define TRACE_WARNING_WP(...) { if (traceLevel >= TRACE_LEVEL_WARNING) { printf(__VA_ARGS__); } } #define TRACE_ERROR_WP(...) { if (traceLevel >= TRACE_LEVEL_ERROR) { printf(__VA_ARGS__); } } #define TRACE_FATAL_WP(...) { if (traceLevel >= TRACE_LEVEL_FATAL) { printf(__VA_ARGS__); while(1); } } #else // Trace compilation depends on TRACE_LEVEL value #if (TRACE_LEVEL >= TRACE_LEVEL_DEBUG) #define TRACE_DEBUG(...) { printf("-D- " __VA_ARGS__); } #define TRACE_DEBUG_WP(...) { printf(__VA_ARGS__); } #else #define TRACE_DEBUG(...) { } #define TRACE_DEBUG_WP(...) { } #endif #if (TRACE_LEVEL >= TRACE_LEVEL_INFO) #define TRACE_INFO(...) { printf("-I- " __VA_ARGS__); } #define TRACE_INFO_WP(...) { printf(__VA_ARGS__); } #else #define TRACE_INFO(...) { } #define TRACE_INFO_WP(...) { } #endif #if (TRACE_LEVEL >= TRACE_LEVEL_WARNING) #define TRACE_WARNING(...) { printf("-W- " __VA_ARGS__); } #define TRACE_WARNING_WP(...) { printf(__VA_ARGS__); } #else #define TRACE_WARNING(...) { } #define TRACE_WARNING_WP(...) { } #endif #if (TRACE_LEVEL >= TRACE_LEVEL_ERROR) #define TRACE_ERROR(...) { printf("-E- " __VA_ARGS__); } #define TRACE_ERROR_WP(...) { printf(__VA_ARGS__); } #else #define TRACE_ERROR(...) { } #define TRACE_ERROR_WP(...) { } #endif #if (TRACE_LEVEL >= TRACE_LEVEL_FATAL) #define TRACE_FATAL(...) { printf("-F- " __VA_ARGS__); while(1); } #define TRACE_FATAL_WP(...) { printf(__VA_ARGS__); while(1); } #else #define TRACE_FATAL(...) { while(1); } #define TRACE_FATAL_WP(...) { while(1); } #endif #endif //------------------------------------------------------------------------------ // Exported variables //------------------------------------------------------------------------------ // Depending on DYN_TRACES, traceLevel is a modifable runtime variable // or a define #if !defined(NOTRACE) && (DYN_TRACES == 1) extern unsigned int traceLevel; #endif //------------------------------------------------------------------------------ // Global Functions //------------------------------------------------------------------------------ extern void TRACE_DumpFrame(unsigned char *pFrame, unsigned int size); extern void TRACE_DumpMemory(unsigned char *pBuffer, unsigned int size, unsigned int address); extern unsigned char TRACE_GetInteger(unsigned int *pValue); extern unsigned char TRACE_GetIntegerMinMax(unsigned int *pValue, unsigned int min, unsigned int max); extern unsigned char TRACE_GetHexa32(unsigned int *pValue); #endif //#ifndef TRACE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/wdtc/000077500000000000000000000000001207233610700215675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/u/wdtc/sam3wdtchardware.h000066400000000000000000000036121207233610700252050ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Watchdog Timer register definitions. * * @author Thomas Schmid */ #ifndef _SAM3UWDTCHARDWARE_H #define _SAM3UWDTCHARDWARE_H #include "wdtchardware.h" /** * Memory mapping for the WDTC */ volatile wdtc_t* WDTC = (volatile wdtc_t *) 0x400E1250; // WDTC Base Address #endif // _SAM3UWDTCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/uart/000077500000000000000000000000001207233610700213355ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/uart/HilSam3UartP.nc000066400000000000000000000175621207233610700241060ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * UART implementation for the SAM3U chip. Does not use DMA (PDC) at this * point, but does use IRQs for operation. * * @author Wanja Hofer */ #include "sam3uarthardware.h" module HilSam3UartP { provides { interface Init; interface StdControl; interface UartByte; interface UartStream; } uses { interface HplSam3UartControl; interface HplSam3UartInterrupts; interface HplSam3UartStatus; interface HplSam3UartConfig; interface HplNVICInterruptCntl as UartIrqControl; interface HplSam3GeneralIOPin as UartPin1; interface HplSam3GeneralIOPin as UartPin2; interface HplSam3PeripheralClockCntl as UartClockControl; interface HplSam3Clock as ClockConfig; } } implementation { uint8_t *receiveBuffer; // pointer to current receive buffer or 0 if none uint16_t receiveBufferLength; // length of the current receive buffer uint16_t receiveBufferPosition; // position of the next character to receive in the buffer uint8_t *transmitBuffer; // pointer to current transmit buffer or 0 if none uint16_t transmitBufferLength; // length of the current transmit buffer uint16_t transmitBufferPosition; // position of the next character to transmit from the buffer void setClockDivisor() { uint32_t mck; uint16_t cd; mck = call ClockConfig.getMainClockSpeed(); // in kHz (e.g., 48,000) // set to 9,600 baud // baudrate = mck / (cd * 16) // cd = mck / (16 * baudrate) // here: cd = mck / 16 * 1000 / baudrate cd = (uint16_t) (((mck / 16) * 1000) / PLATFORM_BAUDRATE); //call HplSam3UartConfig.setClockDivisor(312); // 9,600 baud with MCK = 48 MHz call HplSam3UartConfig.setClockDivisor(cd); } command error_t Init.init() { // turn off all UART IRQs call HplSam3UartInterrupts.disableAllUartIrqs(); // configure NVIC call UartIrqControl.configure(IRQ_PRIO_UART); call UartIrqControl.enable(); // configure PIO call UartPin1.disablePioControl(); call UartPin1.selectPeripheralA(); call UartPin2.disablePioControl(); call UartPin2.selectPeripheralA(); // configure mode and parity call HplSam3UartConfig.setChannelModeAndParityType(UART_MR_CHMODE_NORMAL, UART_MR_PAR_NONE); // configure baud rate setClockDivisor(); // initialize buffer pointers // important because this determines if UartStream is busy or not receiveBuffer = NULL; transmitBuffer = NULL; return SUCCESS; } async event void ClockConfig.mainClockChanged() { // adapt clock divisor to accommodate for PLATFORM_BAUDRATE setClockDivisor(); } command error_t StdControl.start() { // enable peripheral clock call UartClockControl.enable(); // enable receiver and transmitter call HplSam3UartControl.enableReceiver(); call HplSam3UartControl.enableTransmitter(); // enable receive IRQ call HplSam3UartInterrupts.enableRxrdyIrq(); return SUCCESS; } command error_t StdControl.stop() { // will finish any ongoing receptions and transmissions call HplSam3UartControl.disableReceiver(); call HplSam3UartControl.disableTransmitter(); // disable peripheral clock call UartClockControl.disable(); return SUCCESS; } async command error_t UartStream.enableReceiveInterrupt() { call HplSam3UartInterrupts.enableRxrdyIrq(); return SUCCESS; } async command error_t UartStream.disableReceiveInterrupt() { call HplSam3UartInterrupts.disableRxrdyIrq(); return SUCCESS; } async command error_t UartStream.receive(uint8_t* buffer, uint16_t length) { if (length == 0) { return FAIL; } atomic { if (receiveBuffer != NULL) { return EBUSY; // in the middle of a reception } else { receiveBuffer = buffer; receiveBufferLength = length; receiveBufferPosition = 0; call HplSam3UartInterrupts.enableRxrdyIrq(); } } return SUCCESS; } async event void HplSam3UartInterrupts.receivedByte(uint8_t data) { atomic { if (receiveBuffer != NULL) { // receive into buffer receiveBuffer[receiveBufferPosition] = data; receiveBufferPosition++; if (receiveBufferPosition >= receiveBufferLength) { // buffer is full uint8_t *bufferToSignal = receiveBuffer; atomic { receiveBuffer = NULL; call HplSam3UartInterrupts.disableRxrdyIrq(); } // signal reception of complete buffer signal UartStream.receiveDone(bufferToSignal, receiveBufferLength, SUCCESS); } } else { // signal single byte reception signal UartStream.receivedByte(data); } } } async command error_t UartStream.send(uint8_t *buffer, uint16_t length) { if (length == 0) { return FAIL; } atomic { if (transmitBuffer != NULL) { return EBUSY; } else { transmitBufferLength = length; transmitBuffer = buffer; transmitBufferPosition = 0; // enable ready-to-transmit IRQ call HplSam3UartInterrupts.enableTxrdyIrq(); return SUCCESS; } } } async event void HplSam3UartInterrupts.transmitterReady() { atomic { if (transmitBufferPosition < transmitBufferLength) { // characters to transfer in the buffer call HplSam3UartStatus.setCharToTransmit(transmitBuffer[transmitBufferPosition]); transmitBufferPosition++; } else { // all characters transmitted uint8_t *bufferToSignal = transmitBuffer; transmitBuffer = NULL; call HplSam3UartInterrupts.disableTxrdyIrq(); signal UartStream.sendDone(bufferToSignal, transmitBufferLength, SUCCESS); } } } async command error_t UartByte.send(uint8_t byte) { if (call HplSam3UartInterrupts.isEnabledTxrdyIrq() == TRUE) { return FAIL; // in the middle of a stream transmission } // transmit synchronously call HplSam3UartStatus.setCharToTransmit(byte); while (call HplSam3UartStatus.isTransmitterReady() == FALSE); return SUCCESS; } async command error_t UartByte.receive(uint8_t *byte, uint8_t timeout) { // FIXME timeout currently ignored if (call HplSam3UartInterrupts.isEnabledRxrdyIrq() == TRUE) { return FAIL; // in the middle of a stream reception } // receive synchronously while (call HplSam3UartStatus.isReceiverReady() == FALSE); *byte = call HplSam3UartStatus.getReceivedChar(); return SUCCESS; } default async event void UartStream.sendDone(uint8_t *buffer, uint16_t length, error_t error) {} default async event void UartStream.receivedByte(uint8_t byte) {} default async event void UartStream.receiveDone(uint8_t *buffer, uint16_t length, error_t error) {} } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/uart/HplSam3UartC.nc000066400000000000000000000044011207233610700240640ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "sam3uarthardware.h" /** * The hardware presentation layer for the SAM3U UART. * * @author Wanja Hofer */ configuration HplSam3UartC { provides { interface HplSam3UartConfig; interface HplSam3UartControl; interface HplSam3UartInterrupts; interface HplSam3UartStatus; } #ifdef THREADS uses interface PlatformInterrupt; #endif } implementation { components HplSam3UartP; HplSam3UartConfig = HplSam3UartP; HplSam3UartControl = HplSam3UartP; HplSam3UartInterrupts = HplSam3UartP; HplSam3UartStatus = HplSam3UartP; #ifdef THREADS PlatformInterrupt = HplSam3UartP; #endif components McuSleepC; HplSam3UartP.UartInterruptWrapper -> McuSleepC; } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/uart/HplSam3UartConfig.nc000066400000000000000000000047051207233610700251160ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to configure the SAM3U UART. * * @author Wanja Hofer */ interface HplSam3UartConfig { /** * cd = 0: baud rate generator disabled * cd = 0: baud rate = MCK * cd = 2--65535: baud rate = MCK / (cd * 16) */ async command error_t setClockDivisor(uint16_t cd); /** * Have to be set together since they are in the same register. * * chmode = 0x0/UART_MR_CHMODE_NORMAL: normal * chmode = 0x1/UART_MR_CHMODE_AUTOECHO: automatic echo * chmode = 0x2/UART_MR_CHMODE_LOCALLOOP: local loopback * chmode = 0x3/UART_MR_CHMODE_REMOTELOOP: remote loopback * * par = 0x0/UART_MR_PAR_EVEN: even * par = 0x1/UART_MR_PAR_ODD: odd * par = 0x2/UART_MR_PAR_SPACE: space (forced to 0) * par = 0x3/UART_MR_PAR_MARK: mark (forced to 1) * par = 0x4/UART_MR_PAR_NONE: none */ async command error_t setChannelModeAndParityType(uint8_t chmode, uint8_t par); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/uart/HplSam3UartControl.nc000066400000000000000000000037151207233610700253310ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to control the SAM3U UART. * * @author Wanja Hofer */ interface HplSam3UartControl { async command void resetReceiver(); async command void resetTransmitter(); async command void enableReceiver(); async command void disableReceiver(); async command void enableTransmitter(); async command void disableTransmitter(); async command void resetStatusBits(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/uart/HplSam3UartInterrupts.nc000066400000000000000000000057711207233610700260740ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to control and query SAM3U UART interrupts. * * @author Wanja Hofer */ interface HplSam3UartInterrupts { async event void receivedByte(uint8_t data); async event void transmitterReady(); async command void disableAllUartIrqs(); async command void enableRxrdyIrq(); async command void disableRxrdyIrq(); async command bool isEnabledRxrdyIrq(); async command void enableTxrdyIrq(); async command void disableTxrdyIrq(); async command bool isEnabledTxrdyIrq(); async command void enableEndrxIrq(); async command void disableEndrxIrq(); async command bool isEnabledEndrxIrq(); async command void enableEndtxIrq(); async command void disableEndtxIrq(); async command bool isEnabledEndtxIrq(); async command void enableOvreIrq(); async command void disableOvreIrq(); async command bool isEnabledOvreIrq(); async command void enableFrameIrq(); async command void disableFrameIrq(); async command bool isEnabledFrameIrq(); async command void enablePareIrq(); async command void disablePareIrq(); async command bool isEnabledPareIrq(); async command void enableTxemptyIrq(); async command void disableTxemptyIrq(); async command bool isEnabledTxemptyIrq(); async command void enableTxbufeIrq(); async command void disableTxbufeIrq(); async command bool isEnabledTxbufeIrq(); async command void enableRxbuffIrq(); async command void disableRxbuffIrq(); async command bool isEnabledRxbuffIrq(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/uart/HplSam3UartP.nc000066400000000000000000000217421207233610700241100ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "sam3uarthardware.h" /** * The hardware presentation layer for the SAM3U UART. * * @author Wanja Hofer */ module HplSam3UartP { provides { interface HplSam3UartConfig; interface HplSam3UartControl; interface HplSam3UartInterrupts; interface HplSam3UartStatus; } uses { interface FunctionWrapper as UartInterruptWrapper; #ifdef THREADS interface PlatformInterrupt; #endif } } implementation { /** * cd = 0: baud rate generator disabled * cd = 0: baud rate = MCK * cd = 2--65535: baud rate = MCK / (cd * 16) */ async command error_t HplSam3UartConfig.setClockDivisor(uint16_t cd) { UART_BRGR->bits.cd = cd; return SUCCESS; } /** * chmode = 0x0/UART_MR_CHMODE_NORMAL: normal * chmode = 0x1/UART_MR_CHMODE_AUTOECHO: automatic echo * chmode = 0x2/UART_MR_CHMODE_LOCALLOOP: local loopback * chmode = 0x3/UART_MR_CHMODE_REMOTELOOP: remote loopback * * par = 0x0/UART_MR_PAR_EVEN: even * par = 0x1/UART_MR_PAR_ODD: odd * par = 0x2/UART_MR_PAR_SPACE: space (forced to 0) * par = 0x3/UART_MR_PAR_MARK: mark (forced to 1) * par = 0x4/UART_MR_PAR_NONE: none */ async command error_t HplSam3UartConfig.setChannelModeAndParityType(uint8_t chmode, uint8_t par) { uart_mr_t reg; if (chmode > 0x3) return FAIL; if (par > 0x4) return FAIL; reg.flat = 0; reg.bits.par = par; reg.bits.chmode = chmode; *UART_MR = reg; return SUCCESS; } async command void HplSam3UartInterrupts.disableAllUartIrqs() { call HplSam3UartInterrupts.disableRxrdyIrq(); call HplSam3UartInterrupts.disableTxrdyIrq(); call HplSam3UartInterrupts.disableEndrxIrq(); call HplSam3UartInterrupts.disableEndtxIrq(); call HplSam3UartInterrupts.disableOvreIrq(); call HplSam3UartInterrupts.disableFrameIrq(); call HplSam3UartInterrupts.disablePareIrq(); call HplSam3UartInterrupts.disableTxemptyIrq(); call HplSam3UartInterrupts.disableTxbufeIrq(); call HplSam3UartInterrupts.disableRxbuffIrq(); } async command void HplSam3UartControl.resetReceiver() { UART_CR->bits.rstrx = 1; } async command void HplSam3UartControl.resetTransmitter() { UART_CR->bits.rsttx = 1; } async command void HplSam3UartControl.enableReceiver() { UART_CR->bits.rxen = 1; } async command void HplSam3UartControl.disableReceiver() { UART_CR->bits.rxdis = 1; } async command void HplSam3UartControl.enableTransmitter() { UART_CR->bits.txen = 1; } async command void HplSam3UartControl.disableTransmitter() { UART_CR->bits.txdis = 1; } async command void HplSam3UartControl.resetStatusBits() { UART_CR->bits.rststa = 1; } __attribute__((interrupt)) void UartIrqHandler() @C() @spontaneous() { call UartInterruptWrapper.preamble(); if ((call HplSam3UartInterrupts.isEnabledRxrdyIrq() == TRUE) && (call HplSam3UartStatus.isReceiverReady() == TRUE)) { uint8_t data = call HplSam3UartStatus.getReceivedChar(); signal HplSam3UartInterrupts.receivedByte(data); } if ((call HplSam3UartInterrupts.isEnabledTxrdyIrq() == TRUE) && (call HplSam3UartStatus.isTransmitterReady() == TRUE)) { signal HplSam3UartInterrupts.transmitterReady(); } call UartInterruptWrapper.postamble(); #ifdef THREADS call PlatformInterrupt.postAmble(); #endif } // Rxrdy async command void HplSam3UartInterrupts.enableRxrdyIrq() { UART_IER->bits.rxrdy = 1; } async command void HplSam3UartInterrupts.disableRxrdyIrq() { UART_IDR->bits.rxrdy = 1; } async command bool HplSam3UartInterrupts.isEnabledRxrdyIrq() { return (UART_IMR->bits.rxrdy == 0x1); } // Txrdy async command void HplSam3UartInterrupts.enableTxrdyIrq() { UART_IER->bits.txrdy = 1; } async command void HplSam3UartInterrupts.disableTxrdyIrq() { UART_IDR->bits.txrdy = 1; } async command bool HplSam3UartInterrupts.isEnabledTxrdyIrq() { return (UART_IMR->bits.txrdy == 0x1); } // Endrx async command void HplSam3UartInterrupts.enableEndrxIrq() { UART_IER->bits.endrx = 1; } async command void HplSam3UartInterrupts.disableEndrxIrq() { UART_IDR->bits.endrx = 1; } async command bool HplSam3UartInterrupts.isEnabledEndrxIrq() { return (UART_IMR->bits.endrx == 0x1); } // Endtx async command void HplSam3UartInterrupts.enableEndtxIrq() { UART_IER->bits.endtx = 1; } async command void HplSam3UartInterrupts.disableEndtxIrq() { UART_IDR->bits.endtx = 1; } async command bool HplSam3UartInterrupts.isEnabledEndtxIrq() { return (UART_IMR->bits.endtx == 0x1); } // Ovre async command void HplSam3UartInterrupts.enableOvreIrq() { UART_IER->bits.ovre = 1; } async command void HplSam3UartInterrupts.disableOvreIrq() { UART_IDR->bits.ovre = 1; } async command bool HplSam3UartInterrupts.isEnabledOvreIrq() { return (UART_IMR->bits.ovre == 0x1); } // Frame async command void HplSam3UartInterrupts.enableFrameIrq() { UART_IER->bits.frame = 1; } async command void HplSam3UartInterrupts.disableFrameIrq() { UART_IDR->bits.frame = 1; } async command bool HplSam3UartInterrupts.isEnabledFrameIrq() { return (UART_IMR->bits.frame == 0x1); } // Pare async command void HplSam3UartInterrupts.enablePareIrq() { UART_IER->bits.pare = 1; } async command void HplSam3UartInterrupts.disablePareIrq() { UART_IDR->bits.pare = 1; } async command bool HplSam3UartInterrupts.isEnabledPareIrq() { return (UART_IMR->bits.pare == 0x1); } // Txempty async command void HplSam3UartInterrupts.enableTxemptyIrq() { UART_IER->bits.txempty = 1; } async command void HplSam3UartInterrupts.disableTxemptyIrq() { UART_IDR->bits.txempty = 1; } async command bool HplSam3UartInterrupts.isEnabledTxemptyIrq() { return (UART_IMR->bits.txempty == 0x1); } // Txbufe async command void HplSam3UartInterrupts.enableTxbufeIrq() { UART_IER->bits.txbufe = 1; } async command void HplSam3UartInterrupts.disableTxbufeIrq() { UART_IDR->bits.txbufe = 1; } async command bool HplSam3UartInterrupts.isEnabledTxbufeIrq() { return (UART_IMR->bits.txbufe == 0x1); } // Rxbuff async command void HplSam3UartInterrupts.enableRxbuffIrq() { UART_IER->bits.rxbuff = 1; } async command void HplSam3UartInterrupts.disableRxbuffIrq() { UART_IDR->bits.rxbuff = 1; } async command bool HplSam3UartInterrupts.isEnabledRxbuffIrq() { return (UART_IMR->bits.rxbuff == 0x1); } async command uint8_t HplSam3UartStatus.getReceivedChar() { return UART_RHR->bits.rxchr; } async command void HplSam3UartStatus.setCharToTransmit(uint8_t txchr) { UART_THR->bits.txchr = txchr; } async command bool HplSam3UartStatus.isReceiverReady() { return (UART_SR->bits.rxrdy == 0x1); } async command bool HplSam3UartStatus.isTransmitterReady() { return (UART_SR->bits.txrdy == 0x1); } async command bool HplSam3UartStatus.isEndOfReceiverTransfer() { return (UART_SR->bits.endrx == 0x1); } async command bool HplSam3UartStatus.isEndOfTransmitterTransfer() { return (UART_SR->bits.endtx == 0x1); } async command bool HplSam3UartStatus.isOverrunError() { return (UART_SR->bits.ovre == 0x1); } async command bool HplSam3UartStatus.isFramingError() { return (UART_SR->bits.frame == 0x1); } async command bool HplSam3UartStatus.isParityError() { return (UART_SR->bits.pare == 0x1); } async command bool HplSam3UartStatus.isTransmitterEmpty() { return (UART_SR->bits.txempty == 0x1); } async command bool HplSam3UartStatus.isTransmissionBufferEmpty() { return (UART_SR->bits.txbufe == 0x1); } async command bool HplSam3UartStatus.isReceiveBufferFull() { return (UART_SR->bits.rxbuff == 0x1); } } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/uart/HplSam3UartStatus.nc000066400000000000000000000043161207233610700251720ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to query the status of the SAM3U UART. * * @author Wanja Hofer */ interface HplSam3UartStatus { async command uint8_t getReceivedChar(); async command void setCharToTransmit(uint8_t txchr); async command bool isReceiverReady(); async command bool isTransmitterReady(); async command bool isEndOfReceiverTransfer(); async command bool isEndOfTransmitterTransfer(); async command bool isOverrunError(); async command bool isFramingError(); async command bool isParityError(); async command bool isTransmitterEmpty(); async command bool isTransmissionBufferEmpty(); async command bool isReceiveBufferFull(); } tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/uart/uarthardware.h000066400000000000000000000115461207233610700242060ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Definitions specific to the SAM3U UART chip. * * @author Wanja Hofer */ #ifndef UARTHARDWARE_H #define UARTHARDWARE_H // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 668 typedef union { uint32_t flat; struct { uint8_t reserved3 : 2; uint8_t rstrx : 1; // reset receiver uint8_t rsttx : 1; // reset transmitter uint8_t rxen : 1; // receiver enable uint8_t rxdis : 1; // receiver disable uint8_t txen : 1; // transmitter enable uint8_t txdis : 1; // transmitter disable uint8_t rststa : 1; // reset status bits uint8_t reserved2 : 7; uint8_t reserved1 : 8; uint8_t reserved0 : 8; } bits; } uart_cr_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 669 typedef union { uint32_t flat; struct { uint8_t reserved4 : 8; uint8_t reserved3 : 1; uint8_t par : 3; // parity type uint8_t reserved2 : 2; uint8_t chmode : 2; // channel mode uint8_t reserved1 : 8; uint8_t reserved0 : 8; } bits; } uart_mr_t; enum { UART_MR_PAR_EVEN = 0x0, UART_MR_PAR_ODD = 0x1, UART_MR_PAR_SPACE = 0x2, UART_MR_PAR_MARK = 0x3, UART_MR_PAR_NONE = 0x4 }; enum { UART_MR_CHMODE_NORMAL = 0x0, UART_MR_CHMODE_AUTOECHO = 0x1, UART_MR_CHMODE_LOCALLOOP = 0x2, UART_MR_CHMODE_REMOTELOOP = 0x3 }; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 670 typedef union { uint32_t flat; struct { uint8_t rxrdy : 1; // receiver ready uint8_t txrdy : 1; // transmitter ready uint8_t reserved5 : 1; uint8_t endrx : 1; // end of receiver transfer uint8_t endtx : 1; // end of transmitter transfer uint8_t ovre : 1; // overrun error uint8_t frame : 1; // framing error uint8_t pare : 1; // parity error uint8_t reserved4 : 1; uint8_t txempty : 1; // transmitter empty uint8_t reserved3 : 1; uint8_t txbufe : 1; // transmission buffer empty uint8_t rxbuff : 1; // receive buffer full uint8_t reserved2 : 3; uint8_t reserved1 : 8; uint8_t reserved0 : 8; } bits; } uart_ier_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 671 typedef uart_ier_t uart_idr_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 672 typedef uart_ier_t uart_imr_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 673 typedef uart_ier_t uart_sr_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 675 typedef union { uint32_t flat; struct { uint8_t rxchr : 8; // received character uint8_t reserved2 : 8; uint8_t reserved1 : 8; uint8_t reserved0 : 8; } bits; } uart_rhr_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 675 typedef union { uint32_t flat; struct { uint8_t txchr : 8; // character to be transmitted uint8_t reserved2 : 8; uint8_t reserved1 : 8; uint8_t reserved0 : 8; } bits; } uart_thr_t; // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 676 typedef union { uint32_t flat; struct { uint16_t cd : 16; // clock divisor uint8_t reserved1 : 8; uint8_t reserved0 : 8; } bits; } uart_brgr_t; #endif // UARTHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/wdtc/000077500000000000000000000000001207233610700213235ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/cortex/m3/sam3/wdtc/wdtchardware.h000066400000000000000000000070441207233610700241600ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Watchdog Timer register definitions. * * @author Thomas Schmid */ #ifndef _WDTCHARDWARE_H #define _WDTCHARDWARE_H /** * WDTC Control Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 275 */ typedef union { uint32_t flat; struct { uint8_t wdrstt : 1; // watchdog restart uint8_t reserved0 : 7; uint16_t reserved1 : 16; uint8_t key : 8; // password, should be written as 0xA5 } __attribute__((__packed__)) bits; } wdtc_cr_t; #define WDTC_CR_KEY 0xA5 /** * WDTC Mode Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 276 */ typedef union { uint32_t flat; struct { uint16_t wdv : 12; // counter value uint8_t wdfien : 1; // fault interrupt enable uint8_t wdrsten : 1; // reset enable uint8_t wdrproc : 1; // reset processor uint8_t wddis : 1; // watchdog disable uint16_t wdd : 12; // delta value uint8_t wddbghlt : 1; // debug halt uint8_t wdidlehlt : 1; // idle halt uint8_t reserved0 : 2; } __attribute__((__packed__)) bits; } wdtc_mr_t; /** * WDTC Timer Status Register, AT91 ARM Cortex-M3 based Microcontrollers * SAM3U Series, Preliminary, p. 277 */ typedef union { uint32_t flat; struct { uint8_t wdunf : 1; // underflow uint8_t wderr : 1; // error uint8_t reserved0 : 6; uint8_t reserved1 : 8; uint16_t reserved2 : 16; } __attribute__((__packed__)) bits; } wdtc_sr_t; /** * WDTC Register definitions, AT91 ARM Cortex-M3 based Microcontrollers SAM3U * Series, Preliminary, p. 274 */ typedef struct wdtc { volatile wdtc_cr_t cr; // Control Register volatile wdtc_mr_t mr; // Mode Register volatile wdtc_sr_t sr; // Status Register } wdtc_t; #endif // _WDTCHARDWARE_H tinyos-2.1.2+dfsg/tos/chips/ds2401/000077500000000000000000000000001207233610700166115ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/ds2401/CachedIeeeEui64P.nc000066400000000000000000000041421207233610700220300ustar00rootroot00000000000000// $Id: CachedIeeeEui64P.nc,v 1.2 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ /** * Cache an EUI 64 at initialization time and return the cached value for * subsequent queries. */ module CachedIeeeEui64P { uses interface LocalIeeeEui64 as SubIeeeEui64; provides { interface LocalIeeeEui64; interface Init; } } implementation { ieee_eui64_t eui; command error_t Init.init() { atomic eui = call SubIeeeEui64.getId(); return SUCCESS; } command ieee_eui64_t LocalIeeeEui64.getId() { return eui; } } tinyos-2.1.2+dfsg/tos/chips/ds2401/Ds2401.h000066400000000000000000000037011207233610700176400ustar00rootroot00000000000000// $Id: Ds2401.h,v 1.2 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ #ifndef DS2401_H #define DS2401_H enum { DS2401_SERIAL_LENGTH = 6, DS2401_DATA_LENGTH = 8 }; typedef union ds2401_serial_t { uint8_t data[DS2401_DATA_LENGTH]; struct { uint8_t family_code; uint8_t serial[DS2401_SERIAL_LENGTH]; uint8_t crc; }; } ds2401_serial_t; #endif // DS2401_H tinyos-2.1.2+dfsg/tos/chips/ds2401/Ds2401ToIeeeEui64C.nc000066400000000000000000000052521207233610700220270ustar00rootroot00000000000000// $Id: Ds2401ToIeeeEui64C.nc,v 1.2 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ #include "Ds2401.h" #include "IeeeEui64.h" #include "PlatformIeeeEui64.h" /** * Convert silicon serial ID to IEEE EUI 64, according to Application Note * 186 - Creating Global Identifiers Using 1-Wire Devices from Dallas/Maxim. */ module Ds2401ToIeeeEui64C { uses interface HplDs2401 as Hpl; provides interface LocalIeeeEui64; } implementation { command ieee_eui64_t LocalIeeeEui64.getId() { ds2401_serial_t rom; ieee_eui64_t eui; atomic { call Hpl.read(&rom); } // company ID eui.data[0] = IEEE_EUI64_COMPANY_ID_0; eui.data[1] = IEEE_EUI64_COMPANY_ID_1; eui.data[2] = IEEE_EUI64_COMPANY_ID_2; // 16 bits of the ID is generated by software // could be used for hardware model id and revision, for example eui.data[3] = IEEE_EUI64_SERIAL_ID_0; eui.data[4] = IEEE_EUI64_SERIAL_ID_1; // 24 least significant bits of the serial ID read from the DS2401 eui.data[5] = rom.data[3]; eui.data[6] = rom.data[2]; eui.data[7] = rom.data[1]; return eui; } } tinyos-2.1.2+dfsg/tos/chips/ds2401/HplDs2401.nc000066400000000000000000000040231207233610700204530ustar00rootroot00000000000000// $Id: HplDs2401.nc,v 1.2 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ #include "Ds2401.h" /** * Interface to read the 64-bit hardware ID from the DS2401 chip. */ interface HplDs2401 { /** * Read the 64-bit hardware ID (family id, serial, crc) from the DS2401 chip. * @param rom Pointer to a ds2401_serial_t struct, defined in ds2401.h. * @returns SUCCESS on success, an error code otherwise. */ async command error_t read(ds2401_serial_t* rom); } tinyos-2.1.2+dfsg/tos/chips/ds2401/HplDs2401C.nc000066400000000000000000000045311207233610700205620ustar00rootroot00000000000000// $Id: HplDs2401C.nc,v 1.2 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ #include "Ds2401.h" /** * HPL for the DS2401 hardware ID chip. */ module HplDs2401C { provides interface HplDs2401 as Hpl; uses interface OneWireMaster as OneWire; } implementation { bool busy = FALSE; async command error_t Hpl.read(ds2401_serial_t* rom) { uint8_t i; if(busy) { return EBUSY; } busy = TRUE; call OneWire.init(); if(call OneWire.reset() != SUCCESS) { call OneWire.release(); busy = FALSE; return EOFF; } call OneWire.writeByte(0x33); for(i=0;idata[i] = call OneWire.readByte(); } // TODO: crc check call OneWire.release(); busy = FALSE; return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/ds2401/OneWireMaster.nc000066400000000000000000000052671207233610700216710ustar00rootroot00000000000000// $Id: OneWireMaster.nc,v 1.2 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ /** * Interface to interact with 1-wire bus devices, as a master on the 1-wire * bus. */ interface OneWireMaster { /** * Initialize bus (pin is input with pullup). */ async command void idle(); /** * Initialize bus, start sourcing current (pin is input with pullup). */ async command void init(); /** * Release bus, stop sourcing current (pin is three-stated input). */ async command void release(); /** * Generate reset signal. * @returns SUCCESS if a client is present, an error_t error value otherwise. */ async command error_t reset(); /** * Write bit 1 to the bus. */ async command void writeOne(); /** * Write bit 0 to the bus. */ async command void writeZero(); /** * Write 8 bits to the bus, LSB first. * @param b the byte to write. */ async command void writeByte(uint8_t b); /** * Read a bit from the bus. */ async command bool readBit(); /** * Read 8 bits from the bus, LSB first. * @returns the byte read. */ async command uint8_t readByte(); } tinyos-2.1.2+dfsg/tos/chips/ds2401/OneWireMasterC.nc000066400000000000000000000104241207233610700217630ustar00rootroot00000000000000// $Id: OneWireMasterC.nc,v 1.2 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ /** * This module is the implementation of an 1-wire bus master. * */ module OneWireMasterC { uses interface GeneralIO as Pin; uses interface BusyWait as BusyWaitMicro; provides interface OneWireMaster as OneWire; } implementation { async command void OneWire.idle() { call Pin.makeInput(); call Pin.set(); // start sourcing current } async command void OneWire.init() { call OneWire.idle(); call BusyWaitMicro.wait(500); // wait at least 500us after bootup } async command void OneWire.release() { call Pin.makeInput(); call Pin.clr(); // stop sourcing current } async command error_t OneWire.reset() { bool clientPresent; // it is assumed that the bus is in idle state here // transmit reset pulse call Pin.makeOutput(); // output low call Pin.clr(); call BusyWaitMicro.wait(500); // must be at least 480us call OneWire.idle(); // input with pullup set // test for present pulse call BusyWaitMicro.wait(80); // presence pulse is sent 18-60us after reset clientPresent = call Pin.get(); // test for presence pulse call BusyWaitMicro.wait(400); // presence pulse is 60-240us long if (clientPresent == 0) { return SUCCESS; } else { return EOFF; } } async command void OneWire.writeOne() { call Pin.makeOutput(); // output low call Pin.clr(); call BusyWaitMicro.wait(8); // must be 1-15us call OneWire.idle(); // input with pullup set call BusyWaitMicro.wait(72); // low time plus idle time must 60-120us } async command void OneWire.writeZero() { call Pin.makeOutput(); // output low call Pin.clr(); call BusyWaitMicro.wait(72); // must be 60-120us call OneWire.idle(); // input with pullup set call BusyWaitMicro.wait(8); // low time plus idle time must 60-120us } async command void OneWire.writeByte(uint8_t b) { uint8_t i; // send out bits, LSB first for(i=0;i<8;i++) { if(b & 0x01) { call OneWire.writeOne(); } else { call OneWire.writeZero(); } b >>= 1; } } async command bool OneWire.readBit() { bool b; call Pin.makeOutput(); // output low call Pin.clr(); call BusyWaitMicro.wait(1); call OneWire.idle(); // input with pullup set call BusyWaitMicro.wait(8); // must be 1-15us b = call Pin.get(); // read pin call BusyWaitMicro.wait(71); // timeslot length must be 60-120us return b; } async command uint8_t OneWire.readByte() { uint8_t i,b=0; // read bits, LSB first for(i=0;i<8;i++) { b >>= 1; b |= call OneWire.readBit() << 7; } return b; } } tinyos-2.1.2+dfsg/tos/chips/ds2745/000077500000000000000000000000001207233610700166245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/ds2745/DS2745.h000066400000000000000000000045351207233610700176340ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Types and definitions for the Dallas DS2745 I2C Battery Monitor * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:06 $ */ #ifndef _DS2745_H #define _DS2745_H #define DS2745_PTR_SC (0x01) #define DS2745_PTR_TEMPMSB (0x0A) #define DS2745_PTR_TEMPLSB (0x0B) #define DS2745_PTR_VOLTMSB (0x0C) #define DS2745_PTR_VOLTLSB (0x0D) #define DS2745_PTR_CURRMSB (0x0E) #define DS2745_PTR_CURRLSB (0x0F) #define DS2745_PTR_ACCURMSB (0x10) #define DS2745_PTR_ACCURLSB (0x11) #define DS2745_PTR_OFFSETBIAS (0x61) #define DS2745_PTR_ACCBIAS (0x62) #define DS2745_SC_PORF (1 << 6) #define DS2745_SC_SMOD (1 << 5) #define DS2745_SC_NBEN (1 << 4) #define DS2745_SC_PIO (1 << 3) #define DS2745_SC_FQ(_x) (((_x) & 0x3)) #endif /* _DS2745_H */ tinyos-2.1.2+dfsg/tos/chips/ds2745/HplDS2745.nc000066400000000000000000000111731207233610700204450ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HplDS2745 is the HPL inteface to the Dallas DS2745 I2C Battery * Monitor. * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:06 $ */ interface HplDS2745 { /** * Sets a new value to the DS2745 configuration register. * * @param val the new value to be written * * @return SUCCESS if the set will be performed */ command error_t setConfig( uint8_t val ); /** * Signals the completion of the configuration register set. * * @param error SUCCESS if the set was successful */ async event void setConfigDone( error_t error ); /** * Starts a temperature measurement. * * @return SUCCESS if the measurement will be made */ command error_t measureTemperature(); /** * Presents the result of a temperature measurement. * * @param error SUCCESS if the measurement was successful * @param val the temperature reading */ async event void measureTemperatureDone( error_t error, uint16_t val ); /** * Starts a voltage measurement. * * @return SUCCESS if the measurement will be made */ command error_t measureVoltage(); /** * Presents the result of a voltage measurement. * * @param error SUCCESS if the measurement was successful * @param val the voltage reading */ async event void measureVoltageDone( error_t error, uint16_t val); /** * Starts a current measurement. * * @return SUCCESS if the measurement will be made */ command error_t measureCurrent(); /** * Presents the result of a current measurement. * * @param error SUCCESS if the measurement was successful * @param val the current reading */ async event void measureCurrentDone( error_t error, uint16_t val); /** * Starts an accumulated current measurement. * * @return SUCCESS if the measurement will be made */ command error_t measureAccCurrent(); /** * Presents the result of a accumulated current measurement. * * @param error SUCCESS if the measurement was successful * @param val the accumulated current reading */ async event void measureAccCurrentDone( error_t error, uint16_t val); /** * Initiates setting of the current offset bias value * * @param The signed two's complement bias value. * * @return SUCCESS if the setting will be made */ command error_t setOffsetBias(int8_t val); /** * Signals completion and error, if any, in setting the current * offset bias value. * * @param error SUCCESS if the setting was successful */ async event void setOffsetBiasDone( error_t error ); /** * Initiates setting of the accumulated current offset bias value * * @param The signed two's complement bias value. * * @return SUCCESS if the setting will be made */ command error_t setAccOffsetBias(int8_t val); /** * Signals completion and error, if any, in setting the accumulated * current offset bias value. * * @param error SUCCESS if the setting was successful */ async event void setAccOffsetBiasDone( error_t error ); } tinyos-2.1.2+dfsg/tos/chips/ds2745/HplDS2745LogicP.nc000066400000000000000000000173741207233610700215540ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HplDS2745LogicP is the driver for the Dallas DS2745. It requires an * I2C packet interface and provides the HplTMP175 HPL interface. * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:06 $ */ #include "DS2745.h" #include "I2C.h" generic module HplDS2745LogicP(uint16_t devAddr) { provides interface Init; provides interface SplitControl; provides interface HplDS2745; uses interface I2CPacket; } implementation { enum { STATE_IDLE, STATE_STARTING, STATE_STOPPING, STATE_STOPPED, STATE_SETCONFIG, STATE_READTEMP, STATE_READVOLTAGE, STATE_READCURRENT, STATE_READACCCURRENT, STATE_SETBIAS, STATE_SETACCBIAS }; uint8_t mI2CBuffer[4]; uint8_t mState; norace error_t mSSError = SUCCESS; static error_t doReadReg(uint8_t nextState, uint8_t reg) { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = nextState; } else { error = EBUSY; } } if (error) return error; mI2CBuffer[0] = reg; error = call I2CPacket.write(I2C_START,devAddr,1,mI2CBuffer); if (error) atomic mState = STATE_IDLE; return error; } static error_t doSetReg(uint8_t nextState, uint8_t reg, uint16_t val) { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = nextState; } else { error = EBUSY; } } if (error) return error; mI2CBuffer[0] = reg; mI2CBuffer[1] = val; error = call I2CPacket.write((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); if (error) atomic mState = STATE_IDLE; return error; } task void StartDone() { atomic mState = STATE_IDLE; signal SplitControl.startDone(mSSError); return; } task void StopDone() { atomic mState = STATE_STOPPED; signal SplitControl.stopDone(mSSError); return; } command error_t Init.init() { mState = STATE_STOPPED; return SUCCESS; } command error_t SplitControl.start() { error_t error = SUCCESS; atomic { if (mState == STATE_STOPPED) { mState = STATE_STARTING; } else { error = EBUSY; } } if (!error) post StartDone(); return error; } command error_t SplitControl.stop() { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = STATE_STOPPING; } else { error = EBUSY; } } if (!error) post StopDone(); return error; } command error_t HplDS2745.setConfig(uint8_t val) { return doSetReg(STATE_SETCONFIG,DS2745_PTR_SC,val); } command error_t HplDS2745.measureTemperature() { return doReadReg(STATE_READTEMP,DS2745_PTR_TEMPMSB); } command error_t HplDS2745.measureVoltage() { return doReadReg(STATE_READVOLTAGE,DS2745_PTR_VOLTMSB); } command error_t HplDS2745.measureCurrent() { return doReadReg(STATE_READCURRENT,DS2745_PTR_CURRMSB); } command error_t HplDS2745.measureAccCurrent() { return doReadReg(STATE_READTEMP,DS2745_PTR_ACCURMSB); } command error_t HplDS2745.setOffsetBias(int8_t val) { return doSetReg(STATE_SETBIAS,DS2745_PTR_OFFSETBIAS,val); } command error_t HplDS2745.setAccOffsetBias(int8_t val) { return doSetReg(STATE_SETACCBIAS,DS2745_PTR_ACCBIAS,val); } async event void I2CPacket.readDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { uint16_t tempVal; tempVal = buf[0]; tempVal = ((tempVal << 8) | buf[1]); switch (mState) { case STATE_READTEMP: signal HplDS2745.measureTemperatureDone(i2c_error,tempVal); break; case STATE_READVOLTAGE: signal HplDS2745.measureVoltageDone(i2c_error,tempVal); break; case STATE_READCURRENT: signal HplDS2745.measureCurrentDone(i2c_error,tempVal); break; case STATE_READACCCURRENT: signal HplDS2745.measureAccCurrentDone(i2c_error,tempVal); break; default: break; } atomic mState = STATE_IDLE; return; } async event void I2CPacket.writeDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { error_t error = i2c_error; switch (mState) { case STATE_SETCONFIG: atomic mState = STATE_IDLE; signal HplDS2745.setConfigDone(error); break; case STATE_READTEMP: if (error) signal HplDS2745.measureTemperatureDone(error,0); else error = call I2CPacket.read((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); break; case STATE_READVOLTAGE: if (error) signal HplDS2745.measureVoltageDone(error,0); else error = call I2CPacket.read((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); break; case STATE_READCURRENT: if (error) signal HplDS2745.measureCurrentDone(error,0); else error = call I2CPacket.read((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); break; case STATE_READACCCURRENT: if (error) signal HplDS2745.measureAccCurrentDone(error,0); else error = call I2CPacket.read((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); break; case STATE_SETBIAS: atomic mState = STATE_IDLE; signal HplDS2745.setOffsetBiasDone(error); break; case STATE_SETACCBIAS: atomic mState = STATE_IDLE; signal HplDS2745.setAccOffsetBiasDone(error); break; default: atomic mState = STATE_IDLE; break; } if (error) atomic mState = STATE_IDLE; return; } default event void SplitControl.startDone( error_t error ) { return; } default event void SplitControl.stopDone( error_t error ) { return; } default async event void HplDS2745.setConfigDone(error_t error) {return; } default async event void HplDS2745.measureTemperatureDone( error_t error, uint16_t val ){ return; } default async event void HplDS2745.measureVoltageDone( error_t error, uint16_t val ){ return; } default async event void HplDS2745.measureCurrentDone( error_t error, uint16_t val ){ return; } default async event void HplDS2745.measureAccCurrentDone( error_t error, uint16_t val ){ return; } default async event void HplDS2745.setOffsetBiasDone( error_t error ){ return; } default async event void HplDS2745.setAccOffsetBiasDone(error_t error){ return; } } tinyos-2.1.2+dfsg/tos/chips/ds2782/000077500000000000000000000000001207233610700166255ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/ds2782/DS2782.h000066400000000000000000000101271207233610700176300ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Types and definitions for the Dallas DS2782 I2C Battery Monitor * * @author Henrik Makitaavola * @author Phil Buonadonna */ #ifndef _DS2782_H #define _DS2782_H #define DS2782_PTR_SC (0x01) #define DS2782_PTR_TEMPMSB (0x0A) #define DS2782_PTR_TEMPLSB (0x0B) #define DS2782_PTR_VOLTMSB (0x0C) #define DS2782_PTR_VOLTLSB (0x0D) #define DS2782_PTR_CURRMSB (0x0E) #define DS2782_PTR_CURRLSB (0x0F) #define DS2782_PTR_ACCURMSB (0x10) #define DS2782_PTR_ACCURLSB (0x11) #define DS2782_PTR_OFFSETBIAS (0x61) #define DS2782_PTR_ACCBIAS (0x62) #define DS2782_PTR_CONTROL (0x60) #define DS2782_SC_PORF (1 << 6) #define DS2782_SC_SMOD (1 << 5) #define DS2782_SC_NBEN (1 << 4) #define DS2782_SC_PIO (1 << 3) #define DS2782_SC_FQ(_x) (((_x) & 0x3)) #endif /* _DS2782_H */ tinyos-2.1.2+dfsg/tos/chips/ds2782/HplDS2782.nc000066400000000000000000000153301207233610700204460ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HplDS2782 is the HPL inteface to the Dallas DS2782 I2C Battery * Monitor. * * @author Henrik Makitaavola * @author Phil Buonadonna */ interface HplDS2782 { /** * Sets a new value to the DS2782 configuration register. * * @param val the new value to be written * * @return SUCCESS if the set will be performed */ command error_t setConfig( uint8_t val ); /** * Signals the completion of the configuration register set. * * @param error SUCCESS if the set was successful */ async event void setConfigDone( error_t error ); /** * Tells the DS2782 whether or not is is allowed to go into sleep. * * @param allow True allows sleep. * * @return SUCCESS if the set will be performed */ command error_t allowSleep(bool allow); /** * Signals the completion of the sleep call. * * @param error SUCCESS if the set was successful */ async event void allowSleepDone( error_t error ); /** * Starts a temperature measurement. * * @return SUCCESS if the measurement will be made */ command error_t measureTemperature(); /** * Presents the result of a temperature measurement. * * @param error SUCCESS if the measurement was successful * @param val the temperature reading */ async event void measureTemperatureDone( error_t error, uint16_t val ); /** * Starts a voltage measurement. * * @return SUCCESS if the measurement will be made */ command error_t measureVoltage(); /** * Presents the result of a voltage measurement. * * @param error SUCCESS if the measurement was successful * @param val the voltage reading */ async event void measureVoltageDone( error_t error, uint16_t val); /** * Starts a current measurement. * * @return SUCCESS if the measurement will be made */ command error_t measureCurrent(); /** * Presents the result of a current measurement. * * @param error SUCCESS if the measurement was successful * @param val the current reading */ async event void measureCurrentDone( error_t error, uint16_t val); /** * Starts an accumulated current measurement. * * @return SUCCESS if the measurement will be made */ command error_t measureAccCurrent(); /** * Presents the result of a accumulated current measurement. * * @param error SUCCESS if the measurement was successful * @param val the accumulated current reading */ async event void measureAccCurrentDone( error_t error, uint16_t val); /** * Initiates setting of the current offset bias value * * @param The signed two's complement bias value. * * @return SUCCESS if the setting will be made */ command error_t setOffsetBias(int8_t val); /** * Signals completion and error, if any, in setting the current * offset bias value. * * @param error SUCCESS if the setting was successful */ async event void setOffsetBiasDone( error_t error ); /** * Initiates setting of the accumulated current offset bias value * * @param The signed two's complement bias value. * * @return SUCCESS if the setting will be made */ command error_t setAccOffsetBias(int8_t val); /** * Signals completion and error, if any, in setting the accumulated * current offset bias value. * * @param error SUCCESS if the setting was successful */ async event void setAccOffsetBiasDone( error_t error ); } tinyos-2.1.2+dfsg/tos/chips/ds2782/HplDS2782LogicP.nc000066400000000000000000000240001207233610700215360ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HplDS2782LogicP is the driver for the Dallas DS2782. It requires * I2C packet and resource interfaces and provides the HplDS2782 HPL interface. * * @author Henrik Makitaavola * @author Phil Buonadonna */ #include "DS2782.h" #include "I2C.h" generic module HplDS2782LogicP(uint16_t devAddr) { provides interface StdControl; provides interface HplDS2782; uses interface I2CPacket; uses interface Resource as I2CResource; } implementation { enum { STATE_IDLE, STATE_STOPPED, STATE_SETCONFIG, STATE_READTEMP, STATE_READVOLTAGE, STATE_READCURRENT, STATE_READACCCURRENT, STATE_SETBIAS, STATE_SETACCBIAS, STATE_ALLOWSLEEP }; uint8_t mI2CBuffer[4]; uint8_t mState = STATE_STOPPED; bool read; norace error_t mSSError = SUCCESS; static error_t doReadReg(uint8_t nextState, uint8_t reg) { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = nextState; } else { error = EBUSY; } } if (error) return error; mI2CBuffer[0] = reg; read = true; error = call I2CResource.request(); if (error) atomic mState = STATE_IDLE; return error; } static error_t doSetReg(uint8_t nextState, uint8_t reg, uint16_t val) { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = nextState; } else { error = EBUSY; } } if (error) return error; mI2CBuffer[0] = reg; mI2CBuffer[1] = val; read = false; error = call I2CResource.request(); if (error) atomic mState = STATE_IDLE; return error; } command error_t StdControl.start() { error_t error = SUCCESS; atomic { if (mState == STATE_STOPPED) { mState = STATE_IDLE; } else { error = EBUSY; } } return error; } command error_t StdControl.stop() { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = STATE_STOPPED; } else { error = EBUSY; } } return error; } command error_t HplDS2782.setConfig(uint8_t val) { return doSetReg(STATE_SETCONFIG,DS2782_PTR_SC,val); } command error_t HplDS2782.allowSleep(bool allow) { if (allow) return doSetReg(STATE_ALLOWSLEEP,DS2782_PTR_CONTROL,0x60); else return doSetReg(STATE_ALLOWSLEEP,DS2782_PTR_CONTROL,0x0); } command error_t HplDS2782.measureTemperature() { return doReadReg(STATE_READTEMP,DS2782_PTR_TEMPMSB); } command error_t HplDS2782.measureVoltage() { return doReadReg(STATE_READVOLTAGE,DS2782_PTR_VOLTMSB); } command error_t HplDS2782.measureCurrent() { return doReadReg(STATE_READCURRENT,DS2782_PTR_CURRMSB); } command error_t HplDS2782.measureAccCurrent() { return doReadReg(STATE_READTEMP,DS2782_PTR_ACCURMSB); } command error_t HplDS2782.setOffsetBias(int8_t val) { return doSetReg(STATE_SETBIAS,DS2782_PTR_OFFSETBIAS,val); } command error_t HplDS2782.setAccOffsetBias(int8_t val) { return doSetReg(STATE_SETACCBIAS,DS2782_PTR_ACCBIAS,val); } async event void I2CPacket.readDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { uint16_t tempVal; tempVal = buf[0]; tempVal = ((tempVal << 8) | buf[1]); atomic switch (mState) { case STATE_READTEMP: signal HplDS2782.measureTemperatureDone(i2c_error,tempVal); break; case STATE_READVOLTAGE: signal HplDS2782.measureVoltageDone(i2c_error,tempVal); break; case STATE_READCURRENT: signal HplDS2782.measureCurrentDone(i2c_error,tempVal); break; case STATE_READACCCURRENT: signal HplDS2782.measureAccCurrentDone(i2c_error,tempVal); break; default: break; } call I2CResource.release(); atomic mState = STATE_IDLE; return; } event void I2CResource.granted() { if (read) { call I2CPacket.write(I2C_START | I2C_STOP,devAddr,1,mI2CBuffer); } else { call I2CPacket.write(I2C_START | I2C_STOP,devAddr,2,mI2CBuffer); } } async event void I2CPacket.writeDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { error_t error = i2c_error; atomic switch (mState) { case STATE_SETCONFIG: call I2CResource.release(); atomic mState = STATE_IDLE; signal HplDS2782.setConfigDone(error); break; case STATE_READTEMP: if (error) signal HplDS2782.measureTemperatureDone(error,0); else error = call I2CPacket.read((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); break; case STATE_READVOLTAGE: if (error) signal HplDS2782.measureVoltageDone(error,0); else error = call I2CPacket.read((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); break; case STATE_READCURRENT: if (error) signal HplDS2782.measureCurrentDone(error,0); else error = call I2CPacket.read((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); break; case STATE_READACCCURRENT: if (error) signal HplDS2782.measureAccCurrentDone(error,0); else error = call I2CPacket.read((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); break; case STATE_SETBIAS: call I2CResource.release(); atomic mState = STATE_IDLE; signal HplDS2782.setOffsetBiasDone(error); break; case STATE_SETACCBIAS: call I2CResource.release(); atomic mState = STATE_IDLE; signal HplDS2782.setAccOffsetBiasDone(error); break; case STATE_ALLOWSLEEP: call I2CResource.release(); atomic mState = STATE_IDLE; signal HplDS2782.allowSleepDone(error); break; default: call I2CResource.release(); atomic mState = STATE_IDLE; break; } if (error) { call I2CResource.release(); atomic mState = STATE_IDLE; } return; } default async event void HplDS2782.setConfigDone(error_t error) { return; } default async event void HplDS2782.allowSleepDone( error_t error ) { return; } default async event void HplDS2782.measureTemperatureDone( error_t error, uint16_t val ){ return; } default async event void HplDS2782.measureVoltageDone( error_t error, uint16_t val ){ return; } default async event void HplDS2782.measureCurrentDone( error_t error, uint16_t val ){ return; } default async event void HplDS2782.measureAccCurrentDone( error_t error, uint16_t val ){ return; } default async event void HplDS2782.setOffsetBiasDone( error_t error ){ return; } default async event void HplDS2782.setAccOffsetBiasDone(error_t error){ return; } } tinyos-2.1.2+dfsg/tos/chips/lis3l02dq/000077500000000000000000000000001207233610700174115ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/lis3l02dq/HalLIS3L02DQAdvanced.nc000066400000000000000000000047101207233610700232250ustar00rootroot00000000000000/* $Id: HalLIS3L02DQAdvanced.nc,v 1.4 2006-12-12 18:23:06 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ #include "LIS3L02DQ.h" interface HalLIS3L02DQAdvanced { command error_t setDecimation(uint8_t factor); event void setDecimationDone(error_t error); command error_t enableAxis(bool bX, bool bY, bool bZ); event void enableAxisDone(error_t error); command error_t enableAlert(lis_alertflags_t xFlags, lis_alertflags_t yFlags, lis_alertflags_t zFlags, bool requireAll); event void enableAlertDone(error_t error); command error_t getAlertSource(); event void getAlertSourceDone(error_t error, uint8_t vector); command error_t setTLow(uint8_t val); event void setTLowDone(error_t error); command error_t setTHigh(uint8_t val); event void setTHighDone(error_t error); event void alertThreshold(); } tinyos-2.1.2+dfsg/tos/chips/lis3l02dq/HalLIS3L02DQControlP.nc000066400000000000000000000121141207233610700232550ustar00rootroot00000000000000/* $Id: HalLIS3L02DQControlP.nc,v 1.4 2006-12-12 18:23:06 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ #include "LIS3L02DQ.h" module HalLIS3L02DQControlP { provides interface HalLIS3L02DQAdvanced as Advanced; uses interface Resource; uses interface HplLIS3L02DQ as Hpl; } implementation { enum { S_IDLE, S_DECIMATION, S_ENAXIS, S_TLOW, S_THIGH, }; uint8_t state = S_IDLE; uint8_t ctrlReg1Shadow = 0x7; error_t clientResult; uint8_t clientRegAddr; uint8_t clientVal; task void signal_Task() { switch(state) { case S_DECIMATION: state = S_IDLE; call Resource.release(); signal Advanced.setDecimationDone(clientResult); break; case S_ENAXIS: state = S_IDLE; call Resource.release(); signal Advanced.enableAxisDone(clientResult); break; case S_TLOW: state = S_IDLE; call Resource.release(); signal Advanced.setTLowDone(clientResult); break; case S_THIGH: state = S_IDLE; call Resource.release(); signal Advanced.setTHighDone(clientResult); break; default: break; } } event void Resource.granted() { // intentionally left blank } command error_t Advanced.setDecimation(uint8_t factor) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_DECIMATION; ctrlReg1Shadow &= ~LIS3L01DQ_CTRL_REG1_DF(3); ctrlReg1Shadow |= LIS3L01DQ_CTRL_REG1_DF(factor); call Hpl.setReg(LIS3L02DQ_CTRL_REG1, ctrlReg1Shadow); return SUCCESS; } command error_t Advanced.enableAxis(bool bX, bool bY, bool bZ) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_ENAXIS; ctrlReg1Shadow &= ~LIS3L01DQ_CTRL_REG1_DF(7); // if any of them on, power it on if(bZ || bY || bX) ctrlReg1Shadow |= LIS3L01DQ_CTRL_REG1_PD(1); // enable all the relevant axes if(bZ) ctrlReg1Shadow |= LIS3L01DQ_CTRL_REG1_DF(LIS3L01DQ_CTRL_REG1_ZEN); if(bY) ctrlReg1Shadow |= LIS3L01DQ_CTRL_REG1_DF(LIS3L01DQ_CTRL_REG1_YEN); if(bX) ctrlReg1Shadow |= LIS3L01DQ_CTRL_REG1_DF(LIS3L01DQ_CTRL_REG1_XEN); call Hpl.setReg(LIS3L02DQ_CTRL_REG1, ctrlReg1Shadow); return SUCCESS; } command error_t Advanced.setTLow(uint8_t val) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_TLOW; call Hpl.setReg(LIS3L02DQ_THS_L, val); return SUCCESS; } command error_t Advanced.setTHigh(uint8_t val) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_THIGH; call Hpl.setReg(LIS3L02DQ_THS_H, val); return SUCCESS; } async event void Hpl.getRegDone(error_t error, uint8_t regAddr, uint8_t val) {} async event void Hpl.alertThreshold() {} async event void Hpl.setRegDone(error_t error, uint8_t regAddr, uint8_t val) { clientResult = error; clientRegAddr = regAddr; clientVal = val; post signal_Task(); } command error_t Advanced.enableAlert(lis_alertflags_t xFlags, lis_alertflags_t yFlags, lis_alertflags_t zFlags, bool requireAll) { return FAIL; } command error_t Advanced.getAlertSource() { return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/lis3l02dq/HalLIS3L02DQReaderP.nc000066400000000000000000000110541207233610700230410ustar00rootroot00000000000000/* $Id: HalLIS3L02DQReaderP.nc,v 1.4 2006-12-12 18:23:06 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ #include "LIS3L02DQ.h" generic module HalLIS3L02DQReaderP() { provides interface Read as AccelX; provides interface Read as AccelY; provides interface Read as AccelZ; uses interface Resource as AccelXResource; uses interface Resource as AccelYResource; uses interface Resource as AccelZResource; uses interface HplLIS3L02DQ as Hpl; } implementation { enum { S_IDLE, S_GET_XL, S_GET_XH, S_GET_YL, S_GET_YH, S_GET_ZL, S_GET_ZH, }; uint8_t state = S_IDLE; uint16_t readResult; uint8_t byteResult; uint8_t errorResult; task void complete_Task() { switch(state) { case S_GET_XL: readResult += byteResult; state = S_IDLE; call AccelXResource.release(); signal AccelX.readDone(errorResult, readResult); break; case S_GET_XH: readResult = (uint16_t) byteResult & 0xF; readResult <<= 8; state = S_GET_XL; call Hpl.getReg(LIS3L02DQ_OUTX_L); break; case S_GET_YL: readResult += byteResult; state = S_IDLE; call AccelYResource.release(); signal AccelY.readDone(errorResult, readResult); break; case S_GET_YH: readResult = (uint16_t) byteResult & 0xF; readResult <<= 8; state = S_GET_YL; call Hpl.getReg(LIS3L02DQ_OUTY_L); break; case S_GET_ZL: readResult += byteResult; state = S_IDLE; call AccelZResource.release(); signal AccelZ.readDone(errorResult, readResult); break; case S_GET_ZH: readResult = (uint16_t) byteResult & 0xF; readResult <<= 8; state = S_GET_ZL; call Hpl.getReg(LIS3L02DQ_OUTZ_L); break; default: break; } } command error_t AccelX.read() { return call AccelXResource.request(); } command error_t AccelY.read() { return call AccelYResource.request(); } command error_t AccelZ.read() { return call AccelZResource.request(); } event void AccelXResource.granted() { errorResult = call Hpl.getReg(LIS3L02DQ_OUTX_H); if (errorResult != SUCCESS) { state = S_GET_XL; post complete_Task(); } state = S_GET_XH; } event void AccelYResource.granted() { errorResult = call Hpl.getReg(LIS3L02DQ_OUTY_H); if (errorResult != SUCCESS) { state = S_GET_YL; post complete_Task(); } state = S_GET_YH; } event void AccelZResource.granted() { errorResult = call Hpl.getReg(LIS3L02DQ_OUTZ_H); if (errorResult != SUCCESS) { state = S_GET_ZL; post complete_Task(); } state = S_GET_ZH; } async event void Hpl.getRegDone(error_t error, uint8_t regAddr, uint8_t val) { errorResult |= error; byteResult = val; post complete_Task(); } async event void Hpl.setRegDone( error_t error , uint8_t regAddr, uint8_t val) { // intentionally left blank } async event void Hpl.alertThreshold() { } } tinyos-2.1.2+dfsg/tos/chips/lis3l02dq/HplLIS3L02DQ.nc000066400000000000000000000040701207233610700216150ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Hpl interface for the ST LIS3L02DQ 3-Axis Accelerometer * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:06 $ */ interface HplLIS3L02DQ { command error_t getReg(uint8_t regAddr); async event void getRegDone( error_t error, uint8_t regAddr, uint8_t val); command error_t setReg( uint8_t regAddr, uint8_t val); async event void setRegDone( error_t error , uint8_t regAddr, uint8_t val); async event void alertThreshold(); } tinyos-2.1.2+dfsg/tos/chips/lis3l02dq/HplLIS3L02DQLogicSPIP.nc000066400000000000000000000134741207233610700232770ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * This module is the driver components for the ST LIS3L02DQ 3-axis * accelerometer in the 4 wire SPI mode. It requires the SPI packet * interface and assumes the ability to manually toggle the chip select * via a GPIO. It provides the HplLIS3L02DQ HPL interface. * * @author Phil Buonadonna * @author Kaisen Lin * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:06 $ */ module HplLIS3L02DQLogicSPIP { provides interface Init; provides interface SplitControl; provides interface HplLIS3L02DQ; uses interface SpiPacket; uses interface GpioInterrupt as InterruptAlert; uses interface GeneralIO as SPIFRM; } implementation { enum { STATE_IDLE, STATE_STARTING, STATE_STOPPING, STATE_STOPPED, STATE_GETREG, STATE_SETREG, STATE_ERROR }; uint8_t mSPIRxBuf[4],mSPITxBuf[4]; uint8_t mState; bool misInited = FALSE; norace error_t mSSError; task void StartDone() { atomic mState = STATE_IDLE; signal SplitControl.startDone(SUCCESS); return; } task void StopDone() { signal SplitControl.stopDone(mSSError); return; } command error_t Init.init() { atomic { if (!misInited) { misInited = TRUE; mState = STATE_STOPPED; } // Control CS pin manually call SPIFRM.makeOutput(); call SPIFRM.set(); } return SUCCESS; } command error_t SplitControl.start() { error_t error = SUCCESS; atomic { if (mState == STATE_STOPPED) { mState = STATE_STARTING; } else { error = EBUSY; } } if (error) return error; mSPITxBuf[0] = LIS3L02DQ_CTRL_REG1; mSPITxBuf[1] = 0; mSPITxBuf[1] = (LIS3L01DQ_CTRL_REG1_PD(1) | LIS3L01DQ_CTRL_REG1_XEN | LIS3L01DQ_CTRL_REG1_YEN | LIS3L01DQ_CTRL_REG1_ZEN); call SPIFRM.clr(); // CS LOW error = call SpiPacket.send(mSPITxBuf,mSPIRxBuf,2); return error; } command error_t SplitControl.stop() { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = STATE_STOPPING; } else { error = EBUSY; } } if (error) return error; mSPITxBuf[0] = LIS3L02DQ_CTRL_REG1; mSPITxBuf[1] = 0; mSPITxBuf[1] = (LIS3L01DQ_CTRL_REG1_PD(0)); call SPIFRM.clr(); // CS LOW error = call SpiPacket.send(mSPITxBuf,mSPIRxBuf,2); return error; } command error_t HplLIS3L02DQ.getReg(uint8_t regAddr) { error_t error = SUCCESS; if((regAddr < 0x16) || (regAddr > 0x2F)) { error = EINVAL; return error; } mSPITxBuf[0] = regAddr | (1 << 7); // Set the READ bit mSPIRxBuf[1] = 0; mState = STATE_GETREG; call SPIFRM.clr(); // CS LOW error = call SpiPacket.send(mSPITxBuf,mSPIRxBuf,2); return error; } command error_t HplLIS3L02DQ.setReg(uint8_t regAddr, uint8_t val) { error_t error = SUCCESS; if((regAddr < 0x16) || (regAddr > 0x2F)) { error = EINVAL; return error; } mSPITxBuf[0] = regAddr; mSPITxBuf[1] = val; mState = STATE_SETREG; error = call SpiPacket.send(mSPITxBuf,mSPIRxBuf,2); return error; } async event void SpiPacket.sendDone(uint8_t* txBuf, uint8_t* rxBuf, uint16_t len, error_t spi_error ) { error_t error = spi_error; switch (mState) { case STATE_GETREG: mState = STATE_IDLE; call SPIFRM.set(); // CS HIGH signal HplLIS3L02DQ.getRegDone(error, (txBuf[0] & 0x7F) , rxBuf[1]); break; case STATE_SETREG: mState = STATE_IDLE; signal HplLIS3L02DQ.setRegDone(error, (txBuf[0] & 0x7F), txBuf[1]); break; case STATE_STARTING: mState = STATE_IDLE; call SPIFRM.set(); post StartDone(); break; case STATE_STOPPING: mState = STATE_STOPPED; post StopDone(); default: mState = STATE_IDLE; break; } return; } async event void InterruptAlert.fired() { // This alert is decoupled from whatever state the MAX136x is in. // Upper layers must handle dealing with this alert appropriately. signal HplLIS3L02DQ.alertThreshold(); return; } default event void SplitControl.startDone( error_t error ) { return; } default event void SplitControl.stopDone( error_t error ) { return; } default async event void HplLIS3L02DQ.alertThreshold(){ return; } } tinyos-2.1.2+dfsg/tos/chips/lis3l02dq/LIS3L02DQ.h000066400000000000000000000070571207233610700210100ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Types and definitions for the ST LIS3L02DQ 3-axis Accelerometer * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:06 $ */ #ifndef _LIS3L02DQ_H #define _LIS3L02DQ_H #define LIS3L02DQ_OFFSET_X (0x16) #define LIS3L02DQ_OFFSET_Y (0x17) #define LIS3L02DQ_OFFSET_Z (0x18) #define LIS3L02DQ_GAIN_X (0x19) #define LIS3L02DQ_GAIN_Y (0x1A) #define LIS3L02DQ_GAIN_Z (0x1B) #define LIS3L02DQ_CTRL_REG1 (0x20) #define LIS3L02DQ_CTRL_REG2 (0x21) #define LIS3L02DQ_WAKE_UP_CFG (0x23) #define LIS3L02DQ_WAKE_UP_SRC (0x24) #define LIS3L02DQ_WAKE_UP_ACK (0x25) #define LIS3L02DQ_STATUS_REG (0x27) #define LIS3L02DQ_OUTX_L (0x28) #define LIS3L02DQ_OUTX_H (0x29) #define LIS3L02DQ_OUTY_L (0x2A) #define LIS3L02DQ_OUTY_H (0x2B) #define LIS3L02DQ_OUTZ_L (0x2C) #define LIS3L02DQ_OUTZ_H (0x2D) #define LIS3L02DQ_THS_L (0x2E) #define LIS3L02DQ_THS_H (0x2F) #define LIS3L01DQ_CTRL_REG1_PD(_x) (((_x) & 0x3) << 6) #define LIS3L01DQ_CTRL_REG1_DF(_x) (((_x) & 0x3) << 4) #define LIS3L01DQ_CTRL_REG1_ST (1 << 3) #define LIS3L01DQ_CTRL_REG1_ZEN (1 << 2) #define LIS3L01DQ_CTRL_REG1_YEN (1 << 1) #define LIS3L01DQ_CTRL_REG1_XEN (1 << 0) #define LIS3L01DQ_CTRL_REG2_RES (1 << 7) #define LIS3L01DQ_CTRL_REG2_BDU (1 << 6) #define LIS3L01DQ_CTRL_REG2_BLE (1 << 5) #define LIS3L01DQ_CTRL_REG2_BOOT (1 << 4) #define LIS3L01DQ_CTRL_REG2_IEN (1 << 3) #define LIS3L01DQ_CTRL_REG2_DRDY (1 << 2) #define LIS3L01DQ_CTRL_REG2_SIM (1 << 1) #define LIS3L01DQ_CTRL_REG2_DAS (1 << 0) #define LIS3L02DQ_WAKE_UP_CFG_AOI (1 << 7) #define LIS3L02DQ_WAKE_UP_CFG_LIR (1 << 6) #define LIS3L02DQ_WAKE_UP_CFG_ZHIE (1 << 5) #define LIS3L02DQ_WAKE_UP_CFG_ZLIE (1 << 4) #define LIS3L02DQ_WAKE_UP_CFG_YHIE (1 << 3) #define LIS3L02DQ_WAKE_UP_CFG_YLIE (1 << 2) #define LIS3L02DQ_WAKE_UP_CFG_XHIE (1 << 1) #define LIS3L02DQ_WAKE_UP_CFG_XLIE (1 << 0) typedef enum { LIS_AFLAGS_NONE, LIS_AFLAGS_HIGH, LIS_AFLAGS_LOW, LIS_AFLAGS_BOTH } lis_alertflags_t; #endif /* _LIS3L02DQ_H */ tinyos-2.1.2+dfsg/tos/chips/m16c60/000077500000000000000000000000001207233610700166105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/m16c60/62p/000077500000000000000000000000001207233610700172175ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/m16c60/62p/iom16c62p.h000077500000000000000000003643411207233610700210340ustar00rootroot00000000000000/**************************************************************** KPIT Cummins Infosystems Ltd, Pune, India. 1-April-2006. 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. *****************************************************************/ /****************************************************************/ /* M16C/60 62P Include File */ /****************************************************************/ #ifndef __IOM16C62P_H__ #define __IOM16C62P_H__ /*------------------------------------------------------ Processor mode register 0 //0x0004 ------------------------------------------------------*/ union st_pm0 { /* union PM0 */ struct { /* Bit Access */ unsigned char PM0_0:1; /* Processor mode bit 0 */ unsigned char PM0_1:1; /* Processor mode bit 1 */ unsigned char PM0_2:1; /* R/W mode select bit */ unsigned char PM0_3:1; /* Software reset bit */ unsigned char PM0_4:1; /* Multiplexed bus space select bit 0 */ unsigned char PM0_5:1; /* Multiplexed bus space select bit 1 */ unsigned char PM0_6:1; /* Port P40 to P43 function select bit */ unsigned char PM0_7:1; /* BCLK output disable bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Processor mode register 1 //0x0005 ------------------------------------------------------*/ union st_pm1 { /* union PM1 */ struct { /* Bit Access */ unsigned char PM1_0:1; /* CS2 area switching bit */ unsigned char PM1_1:1; /* Port P3_4 to P3_7 function select bit */ unsigned char PM1_2:1; /* Watch dog timer function select bit */ unsigned char PM1_3:1; /* Intermal reserved area expansion bit */ unsigned char PM1_4:1; /* Memory area expansion bit */ unsigned char PM1_5:1; /* Memory area expansion bit */ unsigned char PM1_6:1; /* Reserved bit */ unsigned char PM1_7:1; /* PM17 - Wait bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ System clock control register 0 //0x0006 ------------------------------------------------------*/ union st_cm0 { /* union CM0 */ struct { /* Bit Access */ unsigned char CM0_0:1; /* Clock output function select bit */ unsigned char CM0_1:1; /* Clock output function select bit */ unsigned char CM0_2:1; /* WAIT peripheral function clock stop bit */ unsigned char CM0_3:1; /* Xcin-Xcout drive capacity select bit*/ unsigned char CM0_4:1; /* Port Xc select bit */ unsigned char CM0_5:1; /* Main clock stop bit */ unsigned char CM0_6:1; /* Main clock division select bit 0 */ unsigned char CM0_7:1; /* System clock select bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* system clock control register 0 */ /*------------------------------------------------------ System clock control register 1 //0x0007 ------------------------------------------------------*/ union st_cm1 { /* union CM1 */ struct { /* Bit Access */ unsigned char CM1_0:1; /* All clock stop control bit */ unsigned char CM1_1:1; /* Reserved bit always set to 0 */ unsigned char :1; /* Reserved bit always set to 0 */ unsigned char :1; /* Reserved bit always set to 0 */ unsigned char :1; /* Reserved bit always set to 0 */ unsigned char CM1_5:1; /* Xin-Xouts drive capacity select bit */ unsigned char CM1_6:1; /* Main clock division select bit 1 */ unsigned char CM1_7:1; /* Main clock division select bit 1 */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* system clock control register 1 */ /*------------------------------------------------------ Chip select control register //0x0008 ------------------------------------------------------*/ union st_csr { /* union CSR */ struct { /* Bit Access */ unsigned char CS0 :1; /* CS0~ output enable bit */ unsigned char CS1 :1; /* CS1~ output enable bit */ unsigned char CS2 :1; /* CS2~ output enable bit */ unsigned char CS3 :1; /* CS3~ output enable bit */ unsigned char CS0W:1; /* CS0~ wait bit */ unsigned char CS1W:1; /* CS1~ wait bit */ unsigned char CS2W:1; /* CS2~ wait bit */ unsigned char CS3W:1; /* CS3~ wait bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* Chip select control register */ /*------------------------------------------------------ Address match interrupt enable register //0x0009 ------------------------------------------------------*/ union st_aier { /* union AIER */ struct { /* Bit Access */ unsigned char AIER0:1; /* Address match interrupt0 enable bit*/ unsigned char AIER1:1; /* Address match interrupt1 enable bit*/ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* Address match interrupt enable register */ /*------------------------------------------------------ Protect register //0x000A -----------------------------------------------------*/ union st_prcr { /* union PRCR */ struct { /* Bit Access */ unsigned char PRC0:1; /* Enables writing to system clock control registers 0 & 1 */ unsigned char PRC1:1; /* Enables writing to processor mode registers 0 & 1 */ unsigned char PRC2:1; /* Enables writing to port P9 direction register & SI/Oi control register(i=3,4)*/ unsigned char PRC3:1; /* Enable writting to Power supply detection register 2 and Power supply down detection register */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* Protect register */ /*------------------------------------------------------ Data bank register //0x000B ------------------------------------------------------*/ union st_dbr { /* union DBR */ struct { /* Bit Access */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char OFS :1; /* Offset bit */ unsigned char BSR0:1; /* Bank select bit 0 */ unsigned char BSR1:1; /* Bank select bit 1 */ unsigned char BSR2:1; /* Bank select bit 2 */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ } BIT; /* */ unsigned char BYTE; /* Data bank register */ }; /*------------------------------------------------------ Oscillation stop detection register //0x000C ------------------------------------------------------*/ union st_cm2 { /* union CM2 */ struct { /* Bit Access */ unsigned char CM2_0:1; /* Oscillation stop detection bit */ unsigned char CM2_1:1; /* Main clock switch bit */ unsigned char CM2_2:1; /* Oscillation stop detection status */ unsigned char CM2_3:1; /* Clock monitor bit */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char CM2_7:1; /* Operation select bit(when an oscillation stop is detected) */ } BIT; /* */ unsigned char BYTE; /* Oscillation stop detection register */ }; /*------------------------------------------------------ Watchdog timer control register //0x000f -----------------------------------------------------*/ union st_wdc { /* union WDC */ struct { /* Bit Access */ unsigned char B0:1; /* High-order bit of watchdog timer */ unsigned char B1:1; /* High-order bit of watchdog timer */ unsigned char B2:1; /* High-order bit of watchdog timer */ unsigned char B3:1; /* High-order bit of watchdog timer */ unsigned char B4:1; /* High-order bit of watchdog timer */ unsigned char WDC5:1; /* Cold start / warm start discrimination flag */ unsigned char B6:1; /* Reserved bit, must always be 0 */ unsigned char WDC7:1; /* Prescaler select bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* Watchdog timer control register */ /*------------------------------------------------------ Address match interrupt register 0 //0x0010 -----------------------------------------------------*/ union st_rmad0 { struct{ unsigned char RMAD0L; /* Address match interrupt register 0 low 8 bit */ unsigned char RMAD0M; /* Address match interrupt register 0 mid 8 bit */ unsigned char RMAD0H; /* Address match interrupt register 0 high 8 bit */ unsigned char NC; /* non use */ } BYTE; /* Byte access */ unsigned long DWORD; /* Word Access */ }; /* Address match interrupt register 0 32 bit */ /*------------------------------------------------------ Address match interrupt register 1 //0x0014 -----------------------------------------------------*/ union st_rmad1 { struct{ unsigned char RMAD1L; /* Address match interrupt register 1 low 8 bit */ unsigned char RMAD1M; /* Address match interrupt register 1 mid 8 bit */ unsigned char RMAD1H; /* Address match interrupt register 1 high 8 bit */ unsigned char NC; /* non use */ } BYTE; /* Byte access */ unsigned long DWORD; /* Word Access */ }; /* Address match interrupt register 1 32 bit */ /*------------------------------------------------------ Voltage Detection Register 1 //0x0019 -----------------------------------------------------*/ union st_vcr1 { /* union VCR1 */ struct { /* Bit Access */ unsigned char B0:1; /* Reserved bit,must be 0 */ unsigned char B1:1; /* Reserved bit,must be 0 */ unsigned char B2:1; /* Reserved bit,must be 0 */ unsigned char VC1_3:1; /* Voltage down monitor flag */ unsigned char B4:1; /* Reserved bit,must be 0 */ unsigned char B5:1; /* Reserved bit,must be 0 */ unsigned char B6:1; /* Reserved bit, must always be 0 */ unsigned char B7:1; /* Reserved bit,must be 0 */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* Voltage Detection Register 1 */ /*------------------------------------------------------ Voltage Detection Register 2 //0x001A -----------------------------------------------------*/ union st_vcr2 { /* union VCR2 */ struct { /* Bit Access */ unsigned char B0:1; /* Reserved bit,must be 0 */ unsigned char B1:1; /* Reserved bit,must be 0 */ unsigned char B2:1; /* Reserved bit,must be 0 */ unsigned char B3:1; /* Reserved bit,must be 0 */ unsigned char B4:1; /* Reserved bit,must be 0 */ unsigned char B5:1; /* Reserved bit,must be 0 */ unsigned char VC2_6:1; /* Reset area monitor bit */ unsigned char VC2_7:1; /* Voltage down monitor bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* Voltage Detection Register 1 */ /*------------------------------------------------------ Chip select expansion control register//0x001B -----------------------------------------------------*/ union st_cse { /* union CSE */ struct { /* Bit Access */ unsigned char CSE00W:1; /* CS0~ wait expansion bit */ unsigned char CSE01W:1; /* CS0~ wait expansion bit */ unsigned char CSE10W:1; /* CS1~ wait expansion bit */ unsigned char CSE11W:1; /* CS1~ wait expansion bit */ unsigned char CSE20W:1; /* CS2~ wait expansion bit */ unsigned char CSE21W:1; /* CS2~ wait expansion bit */ unsigned char CSE30W:1; /* CS3~ wait expansion bit */ unsigned char CSE31W:1; /* CS3~ wait expansion bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* Chip select expansion control register */ /*------------------------------------------------------ PLL control register 0 //0x001C -----------------------------------------------------*/ union st_plc0 { /* union */ struct { /* Bit Access */ unsigned char PLC00:1; /* Programmable counter select bit */ unsigned char PLC01:1; /* Programmable counter select bit */ unsigned char PLC02:1; /* Programmable counter select bit */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Reserved bit,set to one */ unsigned char :1; /* Reserved bit,set to zero */ unsigned char :1; /* Reserved bit,set to zero */ unsigned char PLC07:1; /* Operation enable bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* PLL control register 0 */ /*------------------------------------------------------ Processor mode register 2 //0x001E -----------------------------------------------------*/ union st_pm2 { /* union */ struct { /* Bit Access */ unsigned char PM2_0:1; /* Specifying wait when accessing SFR at PLL operation */ unsigned char PM2_1:1; /* System clock protective bit */ unsigned char PM2_2:1; /* WDT count source protective bit */ unsigned char :1; /* Reserved bit,set to zero */ unsigned char :1; /* Reserved bit,set to zero */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* Processor mode register 2 */ /*------------------------------------------------------ Power supply down detection register //0x001F -----------------------------------------------------*/ union st_d4int { /* union */ struct { /* Bit Access */ unsigned char D40:1; /* Power supply down detection interrupt enable bit */ unsigned char D41:1; /* STOP mode deactivation control bit */ unsigned char D42:1; /* Power supply change detection flag */ unsigned char D43:1; /* WDT overflow detect flag */ unsigned char DF0:1; /* Sampling clock select bit */ unsigned char DF1:1; /* Sampling clock select bit */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* Power supply down detection register */ /*------------------------------------------------------ DMA0 source pointer //0x0020 -----------------------------------------------------*/ union st_sar0 { struct{ unsigned char SAR01; /* DMA0 source pointer low 8 bit */ unsigned char SAR0M; /* DMA0 source pointer mid 8 bit */ unsigned char SAR0H; /* DMA0 source pointer high 8 bit */ unsigned char NC; /* non use */ } BYTE; /* Byte access */ unsigned long DWORD; /* Word Access */ }; /* DMA0 source pointer 32 bit */ /*------------------------------------------------------ DMA1 source pointer //0x0030 -----------------------------------------------------*/ union st_sar1 { struct{ unsigned char SAR11; /* DMA1 source pointer low 8 bit */ unsigned char SAR1M; /* DMA1 source pointer mid 8 bit */ unsigned char SAR1H; /* DMA1 source pointer high 8 bit */ unsigned char NC; /* non use */ } BYTE; /* Byte access */ unsigned long DWORD; /* Word Access */ }; /* DMA1 source pointer 32 bit */ /*------------------------------------------------------ DMA0 destination pointer //0x0024 -----------------------------------------------------*/ union st_dar0 { /* DMA0 destination pointer 32 bit */ struct{ unsigned char DAR0L; /* DMA0 destination pointer low 8 bit */ unsigned char DAR0M; /* DMA0 destination pointer mid 8 bit */ unsigned char DAR0H; /* DMA0 destination pointer high 8 bit */ unsigned char NC; /* non use */ } BYTE; /* Byte access */ unsigned long DWORD; /* Word Access */ }; /*------------------------------------------------------ DMA1 destination pointer //0x0034 -----------------------------------------------------*/ union st_dar1 { /* DMA1 destination pointer 32 bit */ struct{ unsigned char DAR1L; /* DMA1 destination pointer low 8 bit */ unsigned char DAR1M; /* DMA1 destination pointer mid 8 bit */ unsigned char DAR1H; /* DMA1 destination pointer high 8 bit */ unsigned char NC; /* non use */ } BYTE; /* Byte access */ unsigned long DWORD; /* Word Access */ }; /*------------------------------------------------------ DMA0 transfer counter //0x0028 -----------------------------------------------------*/ union st_tcr0 { /* DMA0 transfer counter 16 bit */ struct{ unsigned char TCR0L; /* DMA0 transfer counter low 8 bit */ unsigned char TCR0H; /* DMA0 transfer counter high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ DMA1 transfer counter //0x0038 -----------------------------------------------------*/ union st_tcr1 { /* DMA1 transfer counter 16 bit */ struct{ unsigned char TCR1L; /* DMA1 transfer counter low 8 bit */ unsigned char TCR1H; /* DMA1 transfer counter high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ DMA0 control register //0x002c ------------------------------------------------------*/ union st_dm0con { /* DMA0 control register */ struct{ unsigned char DMBIT:1; /* Transfer unit bit select bit */ unsigned char DMASL:1; /* Repeat transfer mode select bit */ unsigned char DMAS :1; /* DMA request bit */ unsigned char DMAE :1; /* DMA enable bit */ unsigned char DSD :1; /* Source address direction select bit */ unsigned char DAD :1; /* Destination address direction select bit */ unsigned char :1; unsigned char :1; }BIT; unsigned char BYTE; }; /*------------------------------------------------------ DMA1 control register //0x003c ------------------------------------------------------*/ union st_dm1con { /* DMA1 control register union */ struct{ unsigned char DMBIT:1; /* Transfer unit bit select bit */ unsigned char DMASL:1; /* Repeat transfer mode select bit */ unsigned char DMAS :1; /* DMA request bit */ unsigned char DMAE :1; /* DMA enable bit */ unsigned char DSD :1; /* Source address direction select bit */ unsigned char DAD :1; /* Destination address direction select bit */ unsigned char :1; /*Nothing assigned */ unsigned char :1; /*Nothing assigned */ }BIT; unsigned char BYTE; }; union st_icr { /* interrupt control registers */ struct{ unsigned char ILVL0:1; /* Interrupt priority level select bit */ unsigned char ILVL1:1; /* Interrupt priority level select bit */ unsigned char ILVL2:1; /* Interrupt priority level select bit */ unsigned char IR :1; /* Interrupt request bit */ unsigned char POL :1; /* Polarity select bit */ unsigned char :1; /* Reserved bit, set to 0 */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ }BIT; unsigned char BYTE; }; union st_icr1 { /* interrupt control registers */ struct{ unsigned char ILVL0:1; /* Interrupt priority level select bit */ unsigned char ILVL1:1; /* Interrupt priority level select bit */ unsigned char ILVL2:1; /* Interrupt priority level select bit */ unsigned char IR :1; /* Interrupt request bit */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ }BIT; unsigned char BYTE; }; /*------------------------------------------------------ bcnic //0x004a ------------------------------------------------------*/ union st_bcnic { /* interrupt control registers*/ struct{ unsigned char ILVL0_BCNIC:1;/* Interrupt priority level select bit */ unsigned char ILVL1_BCNIC:1;/* Interrupt priority level select bit */ unsigned char ILVL2_BCNIC:1;/* Interrupt priority level select bit */ unsigned char IR_BCNIC :1;/* Interrupt request bit */ unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; }BIT; unsigned char BYTE; }; /*------------------------------------------------------ dm0ic //0x004b ------------------------------------------------------*/ union st_dm0ic { /* interrupt control registers*/ struct{ unsigned char ILVL0_DM0IC:1;/* Interrupt priority level select bit */ unsigned char ILVL1_DM0IC:1;/* Interrupt priority level select bit */ unsigned char ILVL2_DM0IC:1;/* Interrupt priority level select bit */ unsigned char IR_DM0IC :1;/* Interrupt request bit */ unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; }BIT; unsigned char BYTE; }; /*------------------------------------------------------ Flash identification register //0x01b4 ------------------------------------------------------*/ union st_fidr { /* Flash identification register */ struct{ unsigned char FIDR0:1; /* Flash identification value */ unsigned char FIDR1:1; /* Flash identification value */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ }BIT; unsigned char BYTE; }; /*------------------------------------------------------ Flash memory control register 1 //0x01b5 ------------------------------------------------------*/ union st_fmr1 { /* Flash identification register */ struct{ unsigned char :1; /* Reserved bit */ unsigned char FMR11:1; /* EW1 mode select bit */ unsigned char :1; /* Reserved bit */ unsigned char :1; /* Reserved bit */ unsigned char :1; /* Reserved bit */ unsigned char :1; /* Reserved bit */ unsigned char FMR16:1; /* Lock bit status flag */ unsigned char :1; /* Reserved bit */ }BIT; unsigned char BYTE; }; /*------------------------------------------------------ Flash memory control register 0 //0x01b7 ------------------------------------------------------*/ union st_fmr0 { /* Flash identification register */ struct{ unsigned char FMR00:1; /* RY/BY~ status flag */ unsigned char FMR01:1; /* EW0 mode select bit */ unsigned char FMR02:1; /* Lock bit disable bit */ unsigned char FMSTP:1; /* Flash memory stop bit */ unsigned char :1; /* Reserved bit */ unsigned char FMR05:1; /* User ROM area select bit */ unsigned char FMR06:1; /* Program status flag */ unsigned char FMR07:1; /* Erase status flag */ }BIT; unsigned char BYTE; }; /*------------------------------------------------------ Address match interrupt register 2 //0x01b8 -----------------------------------------------------*/ union st_rmad2 { struct{ unsigned char RMAD2L; /* Address match interrupt register 2 low 8 bit */ unsigned char RMAD2M; /* Address match interrupt register 2 mid 8 bit */ unsigned char RMAD2H; /* Address match interrupt register 2 high 8 bit */ unsigned char NC; /* non use */ } BYTE; /* Byte access */ unsigned long DWORD; /* Word Access */ }; /* Address match interrupt register 2 32 bit */ /*------------------------------------------------------ Address match interrupt enable register 2 //0x01bb ------------------------------------------------------*/ union st_aier2 { /* Address match interrupt enable register 2 */ struct{ unsigned char AIER20:1; /* Address match interrupt 2 enable bit */ unsigned char AIER21:1; /* Address match interrupt 3 enable bit */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ }BIT; unsigned char BYTE; }; /*------------------------------------------------------ Address match interrupt register 3 //0x01bc -----------------------------------------------------*/ union st_rmad3 { struct{ unsigned char RMAD3L; /* Address match interrupt register 3 low 8 bit */ unsigned char RMAD3M; /* Address match interrupt register 3 mid 8 bit */ unsigned char RMAD3H; /* Address match interrupt register 3 high 8 bit */ unsigned char NC; /* non use */ } BYTE; /* Byte access */ unsigned long DWORD; /* Word Access */ }; /* Address match interrupt register 3 32 bit */ /*------------------------------------------------------ Peripheral clock select register //0x025e ------------------------------------------------------*/ union st_pclkr { /* Peripheral clock select register */ struct{ unsigned char PCLK0 :1; /* TimerA,B clock select bit */ unsigned char PCLK1 :1; /* SI/O clock select bit */ unsigned char :1; /* Reserved bit,set to 0 */ unsigned char :1; /* Reserved bit,set to 0 */ unsigned char :1; /* Reserved bit,set to 0 */ unsigned char :1; /* Reserved bit,set to 0 */ unsigned char :1; /* Reserved bit,set to 0 */ unsigned char :1; /* Reserved bit,set to 0 */ }BIT; unsigned char BYTE; }; /*------------------------------------------------------ Timer B3,4,5 Count start flag //0x0340 ------------------------------------------------------*/ union st_tbsr { /* union tbsr */ struct { /* Bit Access */ unsigned char :1; /* Nothing Assigned */ unsigned char :1; /* Nothing Assigned */ unsigned char :1; /* Nothing Assigned */ unsigned char :1; /* Nothing Assigned */ unsigned char :1; /* Nothing Assigned */ unsigned char TB3S:1; /* Timer B3 count start flag */ unsigned char TB4S:1; /* Timer B4 count start flag */ unsigned char TB5S:1; /* Timer B5 count start flag */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* Timer B3,4,5 Count start flag */ /*------------------------------------------------------ Three-phase PWM control regester 0 //0x0348 ------------------------------------------------------*/ union st_invc0 { /* union invc0 */ struct { /* Bit Access */ unsigned char INV00:1;/* Effective interrupt output polarity select bit */ unsigned char INV01:1;/* Effective interrupt output specification bit */ unsigned char INV02:1;/* Mode select bit */ unsigned char INV03:1;/* Output control bit */ unsigned char INV04:1;/* Positive and negative phases concurrent L output disable function enable bit */ unsigned char INV05:1;/* Positive and negative phases concurrent L output detect flag */ unsigned char INV06:1;/* Modulation mode select bit */ unsigned char INV07:1;/* Software trigger bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Three-phase PWM control regester 1 //0x0349 ------------------------------------------------------*/ union st_invc1 { /* union invc1 */ struct { /* Bit Access */ unsigned char INV10:1;/* Timer Ai start trigger signal select bit */ unsigned char INV11:1;/* Timer A1-1,A2-1,A4-1 control bit */ unsigned char INV12:1;/* Short circuit timer count source select bit*/ unsigned char :1;/* Nothing Assigned */ unsigned char :1;/* Reserved bit (always 0) */ unsigned char :1;/* Nothing Assigned */ unsigned char :1;/* Nothing Assigned */ unsigned char :1;/* Nothing Assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Three-phase output buffer register 0 //0x034a ------------------------------------------------------*/ union st_idb0 { /* union idb0 */ struct { /* Bit Access */ unsigned char DU0 :1;/* U phase output buffer 0 */ unsigned char DUB0:1;/* U~ phase output buffer 0 */ unsigned char DV0 :1;/* V phase output buffer 0 */ unsigned char DVB0:1;/* V~ phase output buffer 0 */ unsigned char DW0 :1;/* W phase output buffer 0 */ unsigned char DWB0:1;/* W~ phase output buffer 0 */ unsigned char :1;/* Nothing Assigned */ unsigned char :1;/* Nothing Assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Three-phase output buffer register 1 //0x034b ------------------------------------------------------*/ union st_idb1 { /* union idb1 */ struct { /* Bit Access */ unsigned char DU1 :1;/* U phase output buffer 1 */ unsigned char DUB1:1;/* U~ phase output buffer 1 */ unsigned char DV1 :1;/* V phase output buffer 1 */ unsigned char DVB1:1;/* V~ phase output buffer 1 */ unsigned char DW1 :1;/* W phase output buffer 1 */ unsigned char DWB1:1;/* W~ phase output buffer 1 */ unsigned char :1;/* Nothing Assigned */ unsigned char :1;/* Nothing Assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*---------------------------------------------------------------------------------- Timer mode registers //0x035b,0x035c,0x035d,0x0396, 0x0397,0x0398,0x0399,0x039a,0x039b,0x039c ---------------------------------------------------------------------------------*/ union st_tmr { /* union tmr */ struct { /* Bit Access */ unsigned char TMOD0:1; /* Operation mode select bit */ unsigned char TMOD1:1; /* Operation mode select bit */ unsigned char MR0 :1; /* Pulse output function select bit */ unsigned char MR1 :1; /* External trigger select bit */ unsigned char MR2 :1; /* Trigger select bit */ unsigned char MR3 :1; /* Must always be "0" in one-shot timer*/ unsigned char TCK0 :1; /* Count source select bit */ unsigned char TCK1 :1; /* Count source select bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*------------------------------------------------------ Interrupt request cause select register 2 //0x035e ------------------------------------------------------*/ union st_ifsr2a { /* union ifsr2a */ struct { /* Bit Access */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char IFSR26 :1; /* Interrupt request cause select bit */ unsigned char IFSR27 :1; /* Interrupt request cause select bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*------------------------------------------------------ Interrupt request cause select register //0x035f -----------------------------------------------------*/ union st_ifsr { /* union IFSR */ struct { /* Bit Access */ unsigned char IFSR0:1; /* INT0~ interrupt polarity switching bit */ unsigned char IFSR1:1; /* INT1~ interrupt polarity switching bit */ unsigned char IFSR2:1; /* INT2~ interrupt polarity switching bit */ unsigned char IFSR3:1; /* INT3~ interrupt polarity switching bit */ unsigned char IFSR4:1; /* INT4~ interrupt polarity switching bit */ unsigned char IFSR5:1; /* INT5~ interrupt polarity switching bit */ unsigned char IFSR6:1; /* Interrupt request cause select bit */ unsigned char IFSR7:1; /* Interrupt request cause select bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ SI/O4 control registers //0x0360 ------------------------------------------------------*/ union st_s4c { /* union S4C */ struct { /* Bit Access */ unsigned char SM40:1; /* Internal synchronous clock select bit */ unsigned char SM41:1; /* Internal synchronous clock select bit */ unsigned char SM42:1; /* Sout4 output disable bit */ unsigned char SM43:1; /* SI/O4 port select bit */ unsigned char SM44:1; /* CLK polarity select bit */ unsigned char SM45:1; /* Transfer direction select bit */ unsigned char SM46:1; /* Synchronous clock select bit */ unsigned char SM47:1; /* Sout4 initial value set bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*------------------------------------------------------ SI/O3 control registers //0x0362 ------------------------------------------------------*/ union st_s3c { /* union S3C */ struct { /* Bit Access */ unsigned char SM30:1; /* Internal synchronous clock select bit */ unsigned char SM31:1; /* Internal synchronous clock select bit */ unsigned char SM32:1; /* Sout3 output disable bit */ unsigned char SM33:1; /* SI/O3 port select bit */ unsigned char SM34:1; /* CLK polarity select bit */ unsigned char SM35:1; /* Transfer direction select bit */ unsigned char SM36:1; /* Synchronous clock select bit */ unsigned char SM37:1; /* Sout3 initial value set bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ UART0 special mode register 4 //0x036c ------------------------------------------------------*/ union st_u0smr4 { /* union u0smr4 */ struct { /* Bit Access */ unsigned char STAREQ :1; /* Start condition generate bit */ unsigned char RSTAREQ:1; /* Restart condition generate bit */ unsigned char STPREQ :1; /* Stop condition generate bit */ unsigned char STSPSEL:1; /* SCL,SDA output select bit */ unsigned char ACKD :1; /* ACK data bit */ unsigned char ACKC :1; /* ACK data output enable bit */ unsigned char SCLHI :1; /* SCL output stop enable bit */ unsigned char SWC9 :1; /* Final bit L hold enable bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ UART0 special mode register 3 //0x036d ------------------------------------------------------*/ union st_u0smr3 { /* union u0smr3 */ struct { /* Bit Access */ unsigned char :1; /* Nothing is assigned */ unsigned char CKPH :1; /* Clock phase set bit */ unsigned char :1; /* Nothing is assigned */ unsigned char NODC :1; /* Clock output set bit */ unsigned char :1; /* Nothing is assigned */ unsigned char DL0 :1; /* SDA0(TxD0) digital delay setup bit */ unsigned char DL1 :1; /* SDA0(TxD0) digital delay setup bit */ unsigned char DL2 :1; /* SDA0(TxD0) digital delay setup bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ UART0 special mode register 2 //0x036e ------------------------------------------------------*/ union st_u0smr2 { /* union u0smr2 */ struct { /* Bit Access */ unsigned char IICM2 :1; /* IIC mode selection bit 2 */ unsigned char CSC :1; /* Clock-synchronous bit */ unsigned char SWC :1; /* SCL wait output bit */ unsigned char ALS :1; /* SDA output stop bit */ unsigned char STAC :1; /* UART0 initialization bit */ unsigned char SWC2 :1; /* SCL wait output bit 2 */ unsigned char SDHI :1; /* SDA output disable bit */ unsigned char :1; /* Nothing is assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ UART0 special mode register //0x036f ------------------------------------------------------*/ union st_u0smr { /* union u0smr */ struct { /* Bit Access */ unsigned char IICM:1; /* IIC mode selection bit */ unsigned char ABC :1; /* Arbitration lost detecting flag control bit */ unsigned char BBS :1; /* Bus busy flag */ unsigned char :1; /* Reserved bit,set to 0 */ unsigned char ABSC:1; /* Bus collision detect sampling clock select bit */ unsigned char ACSE:1; /* Auto clear function select bit of transmit enable bit */ unsigned char SSS :1; /* Transmit start condition select bit */ unsigned char :1; /* Nothing is assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ UART1 special mode register 4 //0x0370 ------------------------------------------------------*/ union st_u1smr4 { /* union u1smr4 */ struct { /* Bit Access */ unsigned char STAREQ:1; /* Start condition generate bit */ unsigned char RSTARE:1; /* Restart condition generate bit */ unsigned char STPREQ:1; /* Stop condition generate bit */ unsigned char STSPSE:1; /* SCL,SDA output select bit */ unsigned char ACKD :1; /* ACK data bit */ unsigned char ACKC :1; /* ACK data output enable bit */ unsigned char SCLHI :1; /* SCL output stop enable bit */ unsigned char SWC9 :1; /* Final bit L hold enable bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ UART1 special mode register 3 //0x0371 ------------------------------------------------------*/ union st_u1smr3 { /* union u1smr3 */ struct { /* Bit Access */ unsigned char :1; /* Nothing is assigned */ unsigned char CKPH :1; /* Clock phase set bit */ unsigned char :1; /* Nothing is assigned */ unsigned char NODC :1; /* Clock output set bit */ unsigned char :1; /* Nothing is assigned */ unsigned char DL0 :1; /* SDA1(TxD1) digital delay setup bit */ unsigned char DL1 :1; /* SDA1(TxD1) digital delay setup bit */ unsigned char DL2 :1; /* SDA1(TxD1) digital delay setup bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ UART1 special mode register 2 //0x0372 ------------------------------------------------------*/ union st_u1smr2 { /* union u1smr2 */ struct { /* Bit Access */ unsigned char IICM2 :1; /* IIC mode selection bit 2 */ unsigned char CSC :1; /* Clock-synchronous bit */ unsigned char SWC :1; /* SCL wait output bit */ unsigned char ALS :1; /* SDA output stop bit */ unsigned char STAC :1; /* UART0 initialization bit */ unsigned char SWC2 :1; /* SCL wait output bit 2 */ unsigned char SDHI :1; /* SDA output disable bit */ unsigned char :1; /* Nothing is assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ UART1 special mode register //0x0373 ------------------------------------------------------*/ union st_u1smr { /* union u1smr */ struct { /* Bit Access */ unsigned char IICM:1; /* IIC mode selection bit */ unsigned char ABC :1; /* Arbitration lost detecting flag control bit */ unsigned char BBS :1; /* Bus busy flag */ unsigned char :1; /* Reserved bit,set to 0 */ unsigned char ABSC:1; /* Bus collision detect sampling clock select bit */ unsigned char ACSE:1; /* Auto clear function select bit of transmit enable bit */ unsigned char SSS :1; /* Transmit start condition select bit */ unsigned char :1; /* Nothing is assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ UART2 special mode register 4 //0x0374 ------------------------------------------------------*/ union st_u2smr4 { /* union u1smr4 */ struct { /* Bit Access */ unsigned char STAREQ:1; /* Start condition generate bit */ unsigned char RSTARE:1; /* Restart condition generate bit */ unsigned char STPREQ:1; /* Stop condition generate bit */ unsigned char STSPSE:1; /* SCL,SDA output select bit */ unsigned char ACKD :1; /* ACK data bit */ unsigned char ACKC :1; /* ACK data output enable bit */ unsigned char SCLHI :1; /* SCL output stop enable bit */ unsigned char SWC9 :1; /* Final bit L hold enable bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ UART2 special mode register 3 //0x0375 ------------------------------------------------------*/ union st_u2smr3 { /* union U2SMR3 */ struct { /* Bit Access */ unsigned char :1; /* Nothing is assigned */ unsigned char CKPH :1; /* Clock phase set bit */ unsigned char :1; /* Nothing is assigned */ unsigned char NODC :1; /* Clock output set bit */ unsigned char :1; /* Nothing is assigned */ unsigned char DL0 :1; /* SDA digital delay setup bit */ unsigned char DL1 :1; /* SDA digital delay setup bit */ unsigned char DL2 :1; /* SDA digital delay setup bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ UART2 special mode register 2 //0x0376 ------------------------------------------------------*/ union st_u2smr2 { /* union U2SMR2 */ struct { /* Bit Access */ unsigned char IICM2:1; /* IIC mode selection bit 2 */ unsigned char CSC :1; /* Clock-synchronous bit */ unsigned char SWC :1; /* SCL wait output bit */ unsigned char ALS :1; /* SDA output stop bit */ unsigned char STAC :1; /* UART2 initialization bit */ unsigned char SWC2 :1; /* SCL wait output bit 2 */ unsigned char SDHI :1; /* SDA output disable bit */ unsigned char :1; /* Nothing is assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ UART2 special mode register //0x0377 ------------------------------------------------------*/ union st_u2smr { /* union U2SMR */ struct { /* Bit Access */ unsigned char IICM :1; /* IIC mode selection bit */ unsigned char ABC :1; /* Arbitration lost detecting flag control bit */ unsigned char BBS :1; /* Reserved bit,set to 0 */ unsigned char :1; /* SCLL sync output enable bit */ unsigned char ABSCS:1; /* Bus collision detect sampling clock select bit */ unsigned char ACSE :1; /* Auto clear function select bit of transmit enable bit */ unsigned char SSS :1; /* Transmit start condition select bit */ unsigned char :1; /* Nothing is assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ UART2 transmit/receive mode register //0x0378 ------------------------------------------------------*/ union st_u2mr { /* union U2MR */ struct { /* Bit Access */ unsigned char SMD0_U2MR :1; /* Serial I/O mode select bit */ unsigned char SMD1_U2MR :1; /* Serial I/O mode select bit */ unsigned char SMD2_U2MR :1; /* Serial I/O mode select bit */ unsigned char CKDIR_U2MR:1; /* Internal/external clock select bit */ unsigned char STPS_U2MR :1; /* Stop bit length select bit */ unsigned char PRY_U2MR :1; /* Odd/even parity select bit */ unsigned char PRYE_U2MR :1; /* Parity enable bit */ unsigned char IOPOL_U2MR:1; /* TxD RxD I/O polarity reverse bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*------------------------------------------------------ UART2 Transmit buffer register 16 bit //0x037a ------------------------------------------------------*/ union st_u2tb { /* UART2 Transmit buffer register 16 bit ; Use "MOV" instruction when writing to this register. */ struct{ unsigned char U2TBL; /* UART2 Transmit buffer register low 8 bit */ unsigned char U2TBH; /* UART2 Transmit buffer register high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ UART2 transmit/receive control register 0//0x037c ------------------------------------------------------*/ union st_u2c0 { /* union U2C0 */ struct { /* Bit Access */ unsigned char CLK0 :1; /* BRG count source select bit */ unsigned char CLK1 :1; /* BRG count source select bit */ unsigned char CRS :1; /* CTS~/RTS~ function select bit */ unsigned char TXEPT:1; /* Transmit register empty flag */ unsigned char CRD :1; /* CTS~/RTS~ disable bit */ unsigned char :1; /* Nothing Assigned */ unsigned char CKPOL:1; /* CLK polarity select bit */ unsigned char UFORM:1; /* Transfer format select bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* UART2 transmit/receive control register 0*/ /*------------------------------------------------------ UART2 transmit/receive control register 1 //0x037d -----------------------------------------------------*/ union st_u2c1 { /* union U2C1 */ struct { /* Bit Access */ unsigned char TE_U2C1:1; /* Transmit enable bit */ unsigned char TI_U2C1:1; /* Transmit buffer empty flag */ unsigned char RE_U2C1:1; /* Receive enable bit */ unsigned char RI_U2C1:1; /* Receive complete flag */ unsigned char U2IRS :1; /* UART2 transmit interrupt cause select bit*/ unsigned char U2RRM :1; /* UART2 continuous receive mode enable bit */ unsigned char U2LCH :1; /* Data logic select bit */ unsigned char U2ERE :1; /* Error signal output enable bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*UART2 transmit/receive control register 1 */ /*------------------------------------------------------ UART2 receive buffer registers //0x037e ------------------------------------------------------*/ union st_u2rb { /* UART2 receive buffer register */ struct { /* Bit Access */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char ABT_U2RB:1; /* Arbitration lost detecting flag */ unsigned char OER_U2RB:1; /* Overrun error flag */ unsigned char FER_U2RB:1; /* Framing error flag */ unsigned char PER_U2RB:1; /* Parity error flag */ unsigned char SUM_U2RB:1; /* Error sum flag */ }BIT; struct{ unsigned char U2RBL; /* Low 8 bit */ unsigned char U2RBH; /* High 8 bit */ }BYTE; unsigned short WORD; }; /*------------------------------------------------------ Count start flag //0x0380 ------------------------------------------------------*/ union st_tabsr { /* union TABSR */ struct { /* Bit Access */ unsigned char TA0S:1; /* Timer A0 count start flag */ unsigned char TA1S:1; /* Timer A1 count start flag */ unsigned char TA2S:1; /* Timer A2 count start flag */ unsigned char TA3S:1; /* Timer A3 count start flag */ unsigned char TA4S:1; /* Timer A4 count start flag */ unsigned char TB0S:1; /* Timer B0 count start flag */ unsigned char TB1S:1; /* Timer B1 count start flag */ unsigned char TB2S:1; /* Timer B2 count start flag */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*UART2 transmit/receive control register 1 */ /*------------------------------------------------------ Clock prescaler reset flag //0x0381 ------------------------------------------------------*/ union st_cpsrf { /* union CPSRF */ struct { /* Bit Access */ unsigned char :1; /* */ unsigned char :1; /* */ unsigned char :1; /* */ unsigned char :1; /* */ unsigned char :1; /* */ unsigned char :1; /* */ unsigned char :1; /* */ unsigned char CPSR:1; /* Clock prescaler reset flag */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* Watchdog timer start register */ /*------------------------------------------------------ One-shot start flag //0x0382 ------------------------------------------------------*/ union st_onsf { /* union ONSF */ struct { /* Bit Access */ unsigned char TA0OS:1; /* Timer A0 one-shot start flag */ unsigned char TA1OS:1; /* Timer A1 one-shot start flag */ unsigned char TA2OS:1; /* Timer A2 one-shot start flag */ unsigned char TA3OS:1; /* Timer A3 one-shot start flag */ unsigned char TA4OS:1; /* Timer A4 one-shot start flag */ unsigned char TAZIE:1; /* Z phase input enable bit */ unsigned char TA0TGL:1; /* Timer A0 event/trigger select bit */ unsigned char TA0TGH:1; /* Timer A0 event/trigger select bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*UART2 transmit/receive control register 1 */ /*------------------------------------------------------ Trigger select register //0x0383 ------------------------------------------------------*/ union st_trgsr { /* union TRGSR */ struct { /* Bit Access */ unsigned char TA1TGL:1; /* Timer A1 event/trigger select bit */ unsigned char TA1TGH:1; /* Timer A1 event/trigger select bit */ unsigned char TA2TGL:1; /* Timer A2 event/trigger select bit */ unsigned char TA2TGH:1; /* Timer A2 event/trigger select bit */ unsigned char TA3TGL:1; /* Timer A3 event/trigger select bit */ unsigned char TA3TGH:1; /* Timer A3 event/trigger select bit */ unsigned char TA4TGL:1; /* Timer A4 event/trigger select bit */ unsigned char TA4TGH:1; /* Timer A4 event/trigger select bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*UART2 transmit/receive control register 1 */ /*------------------------------------------------------ Timer B2 special mode register //0x039e ------------------------------------------------------*/ union st_tb2sc { /* union tb2sc */ struct { /* Bit Access */ unsigned char PWCON :1; /* Timer B2 reload timing switching bit */ unsigned char IVPCR1:1; /* Three phase output port NMI control bit 1 */ unsigned char :1; /* Nothing is assigned */ unsigned char :1; /* Nothing is assigned */ unsigned char :1; /* Nothing is assigned */ unsigned char :1; /* Nothing is assigned */ unsigned char :1; /* Nothing is assigned */ unsigned char :1; /* Nothing is assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*UART2 transmit/receive control register 1 */ /*------------------------------------------------------ UART0 transmit/receive mode register //0x03a0 ------------------------------------------------------*/ union st_u0mr { /* union U0MR */ struct { /* Bit Access */ unsigned char SMD0_U0MR :1; /* Serial I/O mode select bit */ unsigned char SMD1_U0MR :1; /* Serial I/O mode select bit */ unsigned char SMD2_U0MR :1; /* Serial I/O mode select bit */ unsigned char CKDIR_U0MR:1; /* Internal/external clock select bit */ unsigned char STPS_U0MR :1; /* Stop bit length select bit */ unsigned char PRY_U0MR :1; /* Odd/even parity select bit */ unsigned char PRYE_U0MR :1; /* Parity enable bit */ unsigned char IOPOL_U0MR :1; /* TxD,RxD I/O polarity reverse bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*------------------------------------------------------ UART0 transmit/receive mode register //0x03a2 ------------------------------------------------------*/ union st_u0tb { /* UART0 Transmit buffer register 16 bit ; Use "MOV" instruction when writing to this register. */ struct{ unsigned char U0TBL; /* UART0 Transmit buffer register low 8 bit */ unsigned char U0TBH; /* UART0 Transmit buffer register high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ UARTi transmit/receive control register 0 //0x03a4 ------------------------------------------------------*/ union st_u0c0 { /* union U0C0 */ struct { /* Bit Access */ unsigned char CLK0 :1; /* BRG count source select bit */ unsigned char CLK1 :1; /* BRG count source select bit */ unsigned char CRS :1; /* CTS~/RTS~ function select bit */ unsigned char TXEPT:1; /* Transmit register empty flag */ unsigned char CRD :1; /* CTS~/RTS~ disable bit */ unsigned char NCH :1; /* Data output select bit */ unsigned char CKPOL:1; /* CLK polarity select bit */ unsigned char UFORM:1; /* Transfer format select bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*UARTi transmit/receive control register 0 */ /*------------------------------------------------------ UART0 transmit/receive control register 1 //0x03a5 ------------------------------------------------------*/ union st_u0c1 { /* union U0C1 */ struct { /* Bit Access */ unsigned char TE :1; /* Transmit enable bit */ unsigned char TI :1; /* Transmit buffer empty flag */ unsigned char RE :1; /* Receive enable bit */ unsigned char RI :1; /* Receive complete flag */ unsigned char :1; /* Nothing Assigned */ unsigned char :1; /* Nothing Assigned */ unsigned char U0LCH :1; /* Data logic select bit */ unsigned char U0ERE :1; /* Error signal output enable bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*UART0 transmit/receive control register 1 */ /*------------------------------------------------------ UART0 receive buffer register //0x03a6 ------------------------------------------------------*/ union st_u0rb { /* UART0 receive buffer register */ struct { /* Bit Access */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char ABT_U0RB:1; /* Arbitration lost detecting flag */ unsigned char OER_U0RB:1; /* Overrun error flag */ unsigned char FER_U0RB:1; /* Framing error flag */ unsigned char PER_U0RB:1; /* Parity error flag */ unsigned char SUM_U0RB:1; /* Error sum flag */ }BIT; struct{ unsigned char U0RBL; /* Low 8 bit */ unsigned char U0RBH; /* High 8 bit */ }BYTE; unsigned short WORD; }; /*------------------------------------------------------ UART1 transmit/receive mode register //0x03a8 ------------------------------------------------------*/ union st_u1mr { /* union U1MR */ struct { /* Bit Access */ unsigned char SMD0_U1MR :1; /* Serial I/O mode select bit */ unsigned char SMD1_U1MR :1; /* Serial I/O mode select bit */ unsigned char SMD2_U1MR :1; /* Serial I/O mode select bit */ unsigned char CKDIR_U1MR :1; /* Internal/external clock select bit */ unsigned char STPS_U1MR :1; /* Stop bit length select bit */ unsigned char PRY_U1MR :1; /* Odd/even parity select bit */ unsigned char PRYE_U1MR :1; /* Parity enable bit */ unsigned char IOPOL_U1MR :1; /* TxD,RxD I/O polarity reverse bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*------------------------------------------------------ UART1 transmit buffer register //0x03aa ------------------------------------------------------*/ union st_u1tb { /* UART1 Transmit buffer register 16 bit ; Use "MOV" instruction when writing to this register. */ struct{ unsigned char U1TBL; /* UART1 Transmit buffer register low 8 bit */ unsigned char U1TBH; /* UART1 Transmit buffer register high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ UART1 transmit/receive control register 0 //0x03ac ------------------------------------------------------*/ union st_u1c0 { /* union UCR */ struct { /* Bit Access */ unsigned char CLK0 :1; /* BRG count source select bit */ unsigned char CLK1 :1; /* BRG count source select bit */ unsigned char CRS :1; /* CTS~/RTS~ function select bit */ unsigned char TXEPT:1; /* Transmit register empty flag */ unsigned char CRD :1; /* CTS~/RTS~ disable bit */ unsigned char NCH :1; /* Data output select bit */ unsigned char CKPOL:1; /* CLK polarity select bit */ unsigned char UFORM:1; /* Transfer format select bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*UARTi transmit/receive control register 0 */ /*------------------------------------------------------ UART1 transmit/receive control register 1 //0x03ad ------------------------------------------------------*/ union st_u1c1 { /* union U1C1 */ struct { /* Bit Access */ unsigned char TE:1; /* Transmit enable bit */ unsigned char TI:1; /* Transmit buffer empty flag */ unsigned char RE:1; /* Receive enable bit */ unsigned char RI:1; /* Receive complete flag */ unsigned char :1; /* */ unsigned char :1; /* */ unsigned char :1; /* */ unsigned char :1; /* */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*UART1 transmit/receive control register 1 */ /*------------------------------------------------------ UART1 receive buffer register //0x03ae ------------------------------------------------------*/ union st_u1rb { /* UART1 receive buffer register */ struct { /* Bit Access */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Receive data */ unsigned char :1; /* Nothing assigned */ unsigned char :1; /* Nothing assigned */ unsigned char ABT_U1RB:1; /* Arbitration lost detecting flag */ unsigned char OER_U1RB:1; /* Overrun error flag */ unsigned char FER_U1RB:1; /* Framing error flag */ unsigned char PER_U1RB:1; /* Parity error flag */ unsigned char SUM_U1RB:1; /* Error sum flag */ }BIT; struct{ unsigned char U1RBL; /* Low 8 bit */ unsigned char U1RBH; /* High 8 bit */ }BYTE; unsigned short WORD; }; /*------------------------------------------------------ UART transmit/receive control register 2 //0x03b0 ------------------------------------------------------*/ union st_ucon { /* union UCON */ struct { /* Bit Access */ unsigned char U0IRS :1; /* UART0 transmit interrupt cause select bit*/ unsigned char U1IRS :1; /* UART1 transmit interrupt cause select bit*/ unsigned char U0RRM :1; /* UART0 continuous receive mode enable bit */ unsigned char U1RRM :1; /* UART1 continuous receive mode enable bit */ unsigned char CLKMD0:1; /* CLK/CLKS select bit 0 */ unsigned char CLKMD1:1; /* CLK/CLKS select bit 1 */ unsigned char RCSP :1; /* Separate CTS~/RTS~ bit */ unsigned char :1; /* */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*UART transmit/receive control register 2 */ /*------------------------------------------------------ DMA0 request cause select register //0x03b8 ------------------------------------------------------*/ union st_dm0sl { /* DMAi request cause select registers */ struct{ unsigned char DSEL0:1;/* DMA request cause select bit */ unsigned char DSEL1:1;/* DMA request cause select bit */ unsigned char DSEL2:1;/* DMA request cause select bit */ unsigned char DSEL3:1;/* DMA request cause select bit */ unsigned char :1; unsigned char :1; unsigned char DMS :1;/* DMA request cause expansion bit */ unsigned char DSR :1;/* Software DMA request bit */ }BIT; unsigned char BYTE; }; /*------------------------------------------------------ DMA1 request cause select register //0x03ba ------------------------------------------------------*/ union st_dm1sl { /* DMAi request cause select registers */ struct{ unsigned char DSEL0:1; /* DMA request cause select bit */ unsigned char DSEL1:1; /* DMA request cause select bit */ unsigned char DSEL2:1; /* DMA request cause select bit */ unsigned char DSEL3:1; /* DMA request cause select bit */ unsigned char :1; unsigned char :1; unsigned char DMS :1; /* DMA request cause expansion bit */ unsigned char DSR :1; /* Software DMA request bit */ }BIT; unsigned char BYTE; }; /*------------------------------------------------------ CRC data register //0x03bc ------------------------------------------------------*/ union st_crcd { /* CRC data register 16 bit */ struct{ unsigned char CRCDL; /* CRC data register low 8 bit */ unsigned char CRCDH; /* CRC data register high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ A/D register 0 //0x03c0 ------------------------------------------------------*/ union st_ad0 { /* A/D register 0 16 bit */ struct{ unsigned char AD0L; /* A/D register 0 low 8 bit */ unsigned char AD0H; /* A/D register 0 high 8 bit */ }BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ A/D register 1 //0x03c2 ------------------------------------------------------*/ union st_ad1 { /* A/D register 1 16 bit */ struct{ unsigned char AD1L; /* A/D register 1 low 8 bit */ unsigned char AD1H; /* A/D register 1 high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ A/D register 2 //0x03c4 ------------------------------------------------------*/ union st_ad2 { /* A/D register 2 16 bit */ struct{ unsigned char AD2L; /* A/D register 2 low 8 bit */ unsigned char AD2H; /* A/D register 2 high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ A/D register 3 //0x03c6 ------------------------------------------------------*/ union st_ad3 { /* A/D register 3 16 bit */ struct{ unsigned char AD3L; /* A/D register 3 low 8 bit */ unsigned char AD3H; /* A/D register 3 high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ A/D register 4 //0x03c8 ------------------------------------------------------*/ union st_ad4 { /* A/D register 4 16 bit */ struct{ unsigned char AD4L; /* A/D register 4 low 8 bit */ unsigned char AD4H; /* A/D register 4 high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ A/D register 5 //0x03ca ------------------------------------------------------*/ union st_ad5 { /* A/D register 5 16 bit */ struct{ unsigned char AD5L; /* A/D register 5 low 8 bit */ unsigned char AD5H; /* A/D register 5 high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ A/D register 6 //0x03cc ------------------------------------------------------*/ union st_ad6 { /* A/D register 6 16 bit */ struct{ unsigned char AD6L; /* A/D register 6 low 8 bit */ unsigned char AD6H; /* A/D register 6 high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ A/D register 7 //0x03ce ------------------------------------------------------*/ union st_ad7 { /* A/D register 7 16 bit */ struct{ unsigned char AD7L; /* A/D register 7 low 8 bit */ unsigned char AD7H; /* A/D register 7 high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; /*------------------------------------------------------ A/D control register 2 //0x03d4 ------------------------------------------------------*/ union st_adcon2 { /* union ADCON2 */ struct { /* Bit Access */ unsigned char SMP :1; /* A/D conversion method select bit */ unsigned char ADGSEL0 :1; /* Reserved bit (Always set to 0 ) */ unsigned char ADGSEL1 :1; /* Reserved bit (Always set to 0 ) */ unsigned char :1; /* Reserved bit (Always set to 0 ) */ unsigned char CKS2 :1; /* Nothing Assigned. */ unsigned char :1; /* Nothing Assigned. */ unsigned char :1; /* Nothing Assigned. */ unsigned char :1; /* Nothing Assigned. */ } BIT; unsigned char BYTE; /* Byte Access */ }; /*------------------------------------------------------ A/D control register 0 //0x03d6 ------------------------------------------------------*/ union st_adcon0 { /* union ADCON0 */ struct { /* Bit Access */ unsigned char CH0 :1; /* Analog input pin select bit */ unsigned char CH1 :1; /* Analog input pin select bit */ unsigned char CH2 :1; /* Analog input pin select bit */ unsigned char MD0 :1; /* A/D operation mode select bit 0 */ unsigned char MD1 :1; /* A/D operation mode select bit 0 */ unsigned char TRG :1; /* Trigger select bit */ unsigned char ADST:1; /* A/D conversion start flag */ unsigned char CKS0:1; /* Frequency select bit 0 */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*A/D control register 0 */ /*------------------------------------------------------ A/D control register 1 //0x03d7 ------------------------------------------------------*/ union st_adcon1 { /* union ADCON1 */ struct { /* Bit Access */ unsigned char SCAN0:1; /* A/D sweep pin select bit */ unsigned char SCAN1:1; /* A/D sweep pin select bit */ unsigned char MD2 :1; /* A/D operation mode select bit 1 */ unsigned char BITS :1; /* 8/10-bit mode select bit */ unsigned char CKS1 :1; /* Frequency select bit 1 */ unsigned char VCUT :1; /* Vref connect bit */ unsigned char OPA0 :1; /* External op-amp connection mode bit */ unsigned char OPA1 :1; /* External op-amp connection mode bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /*A-D control register 1 */ /*------------------------------------------------------ D/A control register //0x03dc ------------------------------------------------------*/ union st_dacon{ /* union DACON */ struct { /* Bit Access */ unsigned char DA0E :1; /* D/A0 output enable bit */ unsigned char DA1E :1; /* D/A1 output enable bit */ unsigned char :1; /* Nothing Assigned */ unsigned char :1; /* Nothing Assigned */ unsigned char :1; /* Nothing Assigned */ unsigned char :1; /* Nothing Assigned */ unsigned char :1; /* Nothing Assigned */ unsigned char :1; /* Nothing Assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* D/A control register */ /*------------------------------------------------------ Port P14 control register //0x03de ------------------------------------------------------*/ union st_pc14{ /* union pc14 */ struct { /* Bit Access */ unsigned char P140 :1; /* Port P14_0 register */ unsigned char P141 :1; /* Port P14_1 register */ unsigned char :1; /* Nothing Assigned */ unsigned char :1; /* Nothing Assigned */ unsigned char pd140:1; /* Port P14_0 direction register */ unsigned char pd141:1; /* Port P14_1 direction register */ unsigned char :1; /* Nothing Assigned */ unsigned char :1; /* Nothing Assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* Port P14 control register */ /*------------------------------------------------------ Pull-up control register 3 //0x03df ------------------------------------------------------*/ union st_pur3{ /* union pur3 */ struct { /* Bit Access */ unsigned char PU30:1; /* P11_0 to P11_3 pull-up */ unsigned char PU31:1; /* P11_4 to P11_7 pull-up */ unsigned char PU32:1; /* P12_0 to P12_3 pull-up */ unsigned char PU33:1; /* P12_4 to P12_7 pull-up */ unsigned char PU34:1; /* P13_0 to P13_3 pull-up */ unsigned char PU35:1; /* P13_4 to P13_7 pull-up */ unsigned char PU36:1; /* P14_0,P14_1 pull-up */ unsigned char PU37:1; /* P11 to P14 effective bit */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* Pull-up control register 3 */ /*------------------------------------------------------ Port P0 register //0x03e0 ------------------------------------------------------*/ union st_p0 { /* union P0 */ struct { /* Bit Access */ unsigned char P0_0:1; /* Port P00 register */ unsigned char P0_1:1; /* Port P01 register */ unsigned char P0_2:1; /* Port P02 register */ unsigned char P0_3:1; /* Port P03 register */ unsigned char P0_4:1; /* Port P04 register */ unsigned char P0_5:1; /* Port P05 register */ unsigned char P0_6:1; /* Port P06 register */ unsigned char P0_7:1; /* Port P07 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P1 register //0x03e1 ------------------------------------------------------*/ union st_p1 { /* union P1 */ struct { /* Bit Access */ unsigned char P1_0:1;/* Port P10 register */ unsigned char P1_1:1;/* Port P11 register */ unsigned char P1_2:1;/* Port P12 register */ unsigned char P1_3:1;/* Port P13 register */ unsigned char P1_4:1;/* Port P14 register */ unsigned char P1_5:1;/* Port P15 register */ unsigned char P1_6:1;/* Port P16 register */ unsigned char P1_7:1;/* Port P17 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P0 direction register //0x03e2 ------------------------------------------------------*/ union st_pd0 { /* union PD0 */ struct { /* Bit Access */ unsigned char PD0_0:1;/* Port P00 direction register */ unsigned char PD0_1:1;/* Port P01 direction register */ unsigned char PD0_2:1;/* Port P02 direction register */ unsigned char PD0_3:1;/* Port P03 direction register */ unsigned char PD0_4:1;/* Port P04 direction register */ unsigned char PD0_5:1;/* Port P05 direction register */ unsigned char PD0_6:1;/* Port P06 direction register */ unsigned char PD0_7:1;/* Port P07 direction register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P1 direction register //0x03e3 ------------------------------------------------------*/ union st_pd1 { /* union PD1 */ struct { /* Bit Access */ unsigned char PD1_0:1;/* Port P10 direction register */ unsigned char PD1_1:1;/* Port P11 direction register */ unsigned char PD1_2:1;/* Port P12 direction register */ unsigned char PD1_3:1;/* Port P13 direction register */ unsigned char PD1_4:1;/* Port P14 direction register */ unsigned char PD1_5:1;/* Port P15 direction register */ unsigned char PD1_6:1;/* Port P16 direction register */ unsigned char PD1_7:1;/* Port P17 direction register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P2 register //0x03e4 ------------------------------------------------------*/ union st_p2 { /* union P2 */ struct { /* Bit Access */ unsigned char P2_0:1;/* Port P20 register */ unsigned char P2_1:1;/* Port P21 register */ unsigned char P2_2:1;/* Port P22 register */ unsigned char P2_3:1;/* Port P23 register */ unsigned char P2_4:1;/* Port P24 register */ unsigned char P2_5:1;/* Port P25 register */ unsigned char P2_6:1;/* Port P26 register */ unsigned char P2_7:1;/* Port P27 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P3 register //0x03e5 ------------------------------------------------------*/ union st_p3 { /* union P3 */ struct { /* Bit Access */ unsigned char P3_0:1;/* Port P30 register */ unsigned char P3_1:1;/* Port P31 register */ unsigned char P3_2:1;/* Port P32 register */ unsigned char P3_3:1;/* Port P33 register */ unsigned char P3_4:1;/* Port P34 register */ unsigned char P3_5:1;/* Port P35 register */ unsigned char P3_6:1;/* Port P36 register */ unsigned char P3_7:1;/* Port P37 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P2 direction register //0x03e6 ------------------------------------------------------*/ union st_pd2 { /* union PD2 */ struct { /* Bit Access */ unsigned char PD2_0:1;/* Port P20 direction register */ unsigned char PD2_1:1;/* Port P21 direction register */ unsigned char PD2_2:1;/* Port P22 direction register */ unsigned char PD2_3:1;/* Port P23 direction register */ unsigned char PD2_4:1;/* Port P24 direction register */ unsigned char PD2_5:1;/* Port P25 direction register */ unsigned char PD2_6:1;/* Port P26 direction register */ unsigned char PD2_7:1;/* Port P27 direction register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P3 direction register //0x03e7 ------------------------------------------------------*/ union st_pd3 { /* union PD3 */ struct { /* Bit Access */ unsigned char PD3_0:1;/* Port P30 direction register */ unsigned char PD3_1:1;/* Port P31 direction register */ unsigned char PD3_2:1;/* Port P32 direction register */ unsigned char PD3_3:1;/* Port P33 direction register */ unsigned char PD3_4:1;/* Port P34 direction register */ unsigned char PD3_5:1;/* Port P35 direction register */ unsigned char PD3_6:1;/* Port P36 direction register */ unsigned char PD3_7:1;/* Port P37 direction register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P4 register //0x03e8 ------------------------------------------------------*/ union st_p4 { /* union P4 */ struct { /* Bit Access */ unsigned char P4_0:1;/* Port P40 register */ unsigned char P4_1:1;/* Port P41 register */ unsigned char P4_2:1;/* Port P42 register */ unsigned char P4_3:1;/* Port P43 register */ unsigned char P4_4:1;/* Port P44 register */ unsigned char P4_5:1;/* Port P45 register */ unsigned char P4_6:1;/* Port P46 register */ unsigned char P4_7:1;/* Port P47 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P5 register //0x03e9 ------------------------------------------------------*/ union st_p5 { /* union P5 */ struct { /* Bit Access */ unsigned char P5_0:1;/* Port P50 register */ unsigned char P5_1:1;/* Port P51 register */ unsigned char P5_2:1;/* Port P52 register */ unsigned char P5_3:1;/* Port P53 register */ unsigned char P5_4:1;/* Port P54 register */ unsigned char P5_5:1;/* Port P55 register */ unsigned char P5_6:1;/* Port P56 register */ unsigned char P5_7:1;/* Port P57 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P4 direction register //0x03ea ------------------------------------------------------*/ union st_pd4 { /* union PD4 */ struct { /* Bit Access */ unsigned char PD4_0:1;/* Port P40 direction register */ unsigned char PD4_1:1;/* Port P41 direction register */ unsigned char PD4_2:1;/* Port P42 direction register */ unsigned char PD4_3:1;/* Port P43 direction register */ unsigned char PD4_4:1;/* Port P44 direction register */ unsigned char PD4_5:1;/* Port P45 direction register */ unsigned char PD4_6:1;/* Port P46 direction register */ unsigned char PD4_7:1;/* Port P47 direction register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P5 direction register //0x03eb ------------------------------------------------------*/ union st_pd5 { /* union PD5 */ struct { /* Bit Access */ unsigned char PD5_0:1;/* Port P50 direction register */ unsigned char PD5_1:1;/* Port P51 direction register */ unsigned char PD5_2:1;/* Port P52 direction register */ unsigned char PD5_3:1;/* Port P53 direction register */ unsigned char PD5_4:1;/* Port P54 direction register */ unsigned char PD5_5:1;/* Port P55 direction register */ unsigned char PD5_6:1;/* Port P56 direction register */ unsigned char PD5_7:1;/* Port P57 direction register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P6 register //0x03ec ------------------------------------------------------*/ union st_p6 { /* union P6 */ struct { /* Bit Access */ unsigned char P6_0:1;/* Port P60 register */ unsigned char P6_1:1;/* Port P61 register */ unsigned char P6_2:1;/* Port P62 register */ unsigned char P6_3:1;/* Port P63 register */ unsigned char P6_4:1;/* Port P64 register */ unsigned char P6_5:1;/* Port P65 register */ unsigned char P6_6:1;/* Port P66 register */ unsigned char P6_7:1;/* Port P67 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P7 register //0x03ed ------------------------------------------------------*/ union st_p7 { /* union P7 */ struct { /* Bit Access */ unsigned char P7_0:1;/* Port P70 register */ unsigned char P7_1:1;/* Port P71 register */ unsigned char P7_2:1;/* Port P72 register */ unsigned char P7_3:1;/* Port P73 register */ unsigned char P7_4:1;/* Port P74 register */ unsigned char P7_5:1;/* Port P75 register */ unsigned char P7_6:1;/* Port P76 register */ unsigned char P7_7:1;/* Port P77 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P6 direction register //0x03ee ------------------------------------------------------*/ union st_pd6 { /* union PD6 */ struct { /* Bit Access */ unsigned char PD6_0:1;/* Port P60 direction register */ unsigned char PD6_1:1;/* Port P61 direction register */ unsigned char PD6_2:1;/* Port P62 direction register */ unsigned char PD6_3:1;/* Port P63 direction register */ unsigned char PD6_4:1;/* Port P64 direction register */ unsigned char PD6_5:1;/* Port P65 direction register */ unsigned char PD6_6:1;/* Port P66 direction register */ unsigned char PD6_7:1;/* Port P67 direction register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P7 direction register //0x03ef ------------------------------------------------------*/ union st_pd7 { /* union PD7 */ struct { /* Bit Access */ unsigned char PD7_0:1;/* Port P70 direction register */ unsigned char PD7_1:1;/* Port P71 direction register */ unsigned char PD7_2:1;/* Port P72 direction register */ unsigned char PD7_3:1;/* Port P73 direction register */ unsigned char PD7_4:1;/* Port P74 direction register */ unsigned char PD7_5:1;/* Port P75 direction register */ unsigned char PD7_6:1;/* Port P76 direction register */ unsigned char PD7_7:1;/* Port P77 direction register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P8 register //0x03f0 ------------------------------------------------------*/ union st_p8 { /* union P8 */ struct { /* Bit Access */ unsigned char P8_0:1;/* Port P80 register */ unsigned char P8_1:1;/* Port P81 register */ unsigned char P8_2:1;/* Port P82 register */ unsigned char P8_3:1;/* Port P83 register */ unsigned char P8_4:1;/* Port P84 register */ unsigned char P8_5:1;/* Port P85 register */ unsigned char P8_6:1;/* Port P86 register */ unsigned char P8_7:1;/* Port P87 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P9 register //0x03f1 ------------------------------------------------------*/ union st_p9 { /* union P9 */ struct { /* Bit Access */ unsigned char P9_0:1;/* Port P90 register */ unsigned char P9_1:1;/* Port P91 register */ unsigned char P9_2:1;/* Port P92 register */ unsigned char P9_3:1;/* Port P93 register */ unsigned char P9_4:1;/* Port P94 register */ unsigned char P9_5:1;/* Port P95 register */ unsigned char P9_6:1;/* Port P96 register */ unsigned char P9_7:1;/* Port P97 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P8 direction register //0x03f2 ------------------------------------------------------*/ union st_pd8 { /* union PD8 */ struct { /* Bit Access */ unsigned char PD8_0:1;/* Port P80 direction register */ unsigned char PD8_1:1;/* Port P81 direction register */ unsigned char PD8_2:1;/* Port P82 direction register */ unsigned char PD8_3:1;/* Port P83 direction register */ unsigned char PD8_4:1;/* Port P84 direction register */ unsigned char :1;/* Nothing assigned */ unsigned char PD8_6:1;/* Port P86 direction register */ unsigned char PD8_7:1;/* Port P87 direction register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P9 direction register //0x03f3 ------------------------------------------------------*/ union st_pd9 { /* union PD9 */ struct { /* Bit Access */ unsigned char PD9_0:1;/* Port P90 direction register */ unsigned char PD9_1:1;/* Port P91 direction register */ unsigned char PD9_2:1;/* Port P92 direction register */ unsigned char PD9_3:1;/* Port P93 direction register */ unsigned char PD9_4:1;/* Port P94 direction register */ unsigned char PD9_5:1;/* Port P95 direction register */ unsigned char PD9_6:1;/* Port P96 direction register */ unsigned char PD9_7:1;/* Port P97 direction register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P10 register //0x03f4 ------------------------------------------------------*/ union st_p10 { /* union P10 */ struct { /* Bit Access */ unsigned char P10_0:1;/* Port P100 register */ unsigned char P10_1:1;/* Port P101 register */ unsigned char P10_2:1;/* Port P102 register */ unsigned char P10_3:1;/* Port P103 register */ unsigned char P10_4:1;/* Port P104 register */ unsigned char P10_5:1;/* Port P105 register */ unsigned char P10_6:1;/* Port P106 register */ unsigned char P10_7:1;/* Port P107 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P11 register //0x03f5 ------------------------------------------------------*/ union st_p11 { /* union P11 */ struct { /* Bit Access */ unsigned char P11_0:1;/* Port P110 register */ unsigned char P11_1:1;/* Port P111 register */ unsigned char P11_2:1;/* Port P112 register */ unsigned char P11_3:1;/* Port P113 register */ unsigned char P11_4:1;/* Port P114 register */ unsigned char P11_5:1;/* Port P115 register */ unsigned char P11_6:1;/* Port P116 register */ unsigned char P11_7:1;/* Port P117 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P10 direction register //0x03f6 ------------------------------------------------------*/ union st_pd10 { /* union PD10 */ struct { /* Bit Access */ unsigned char PD10_0:1;/* Port P100 direction register */ unsigned char PD10_1:1;/* Port P101 direction register */ unsigned char PD10_2:1;/* Port P102 direction register */ unsigned char PD10_3:1;/* Port P103 direction register */ unsigned char PD10_4:1;/* Port P104 direction register */ unsigned char PD10_5:1;/* Port P105 direction register */ unsigned char PD10_6:1;/* Port P106 direction register */ unsigned char PD10_7:1;/* Port P107 direction register */ } BIT; /* */ char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P11 direction register //0x03f7 ------------------------------------------------------*/ union st_pd11 { /* union PD11 */ struct { /* Bit Access */ unsigned char PD11_0:1;/* Port P110 direction register */ unsigned char PD11_1:1;/* Port P111 direction register */ unsigned char PD11_2:1;/* Port P112 direction register */ unsigned char PD11_3:1;/* Port P113 direction register */ unsigned char PD11_4:1;/* Port P114 direction register */ unsigned char PD11_5:1;/* Port P115 direction register */ unsigned char PD11_6:1;/* Port P116 direction register */ unsigned char PD11_7:1;/* Port P117 direction register */ } BIT; /* */ char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P12 register //0x03f8 ------------------------------------------------------*/ union st_p12 { /* union P12 */ struct { /* Bit Access */ unsigned char P12_0:1;/* Port P120 register */ unsigned char P12_1:1;/* Port P121 register */ unsigned char P12_2:1;/* Port P122 register */ unsigned char P12_3:1;/* Port P123 register */ unsigned char P12_4:1;/* Port P124 register */ unsigned char P12_5:1;/* Port P125 register */ unsigned char P12_6:1;/* Port P126 register */ unsigned char P12_7:1;/* Port P127 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P13 register //0x03f9 ------------------------------------------------------*/ union st_p13 { /* union P13 */ struct { /* Bit Access */ unsigned char P13_0:1;/* Port P130 register */ unsigned char P13_1:1;/* Port P131 register */ unsigned char P13_2:1;/* Port P132 register */ unsigned char P13_3:1;/* Port P133 register */ unsigned char P13_4:1;/* Port P134 register */ unsigned char P13_5:1;/* Port P135 register */ unsigned char P13_6:1;/* Port P136 register */ unsigned char P13_7:1;/* Port P137 register */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P12 direction register //0x03fa ------------------------------------------------------*/ union st_pd12 { /* union PD12 */ struct { /* Bit Access */ unsigned char PD12_0:1;/* Port P120 direction register */ unsigned char PD12_1:1;/* Port P121 direction register */ unsigned char PD12_2:1;/* Port P122 direction register */ unsigned char PD12_3:1;/* Port P123 direction register */ unsigned char PD12_4:1;/* Port P124 direction register */ unsigned char PD12_5:1;/* Port P125 direction register */ unsigned char PD12_6:1;/* Port P126 direction register */ unsigned char PD12_7:1;/* Port P127 direction register */ } BIT; /* */ char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port P13 direction register //0x03fb ------------------------------------------------------*/ union st_pd13 { /* union PD13 */ struct { /* Bit Access */ unsigned char PD13_0:1;/* Port P130 direction register */ unsigned char PD13_1:1;/* Port P131 direction register */ unsigned char PD13_2:1;/* Port P132 direction register */ unsigned char PD13_3:1;/* Port P133 direction register */ unsigned char PD13_4:1;/* Port P134 direction register */ unsigned char PD13_5:1;/* Port P135 direction register */ unsigned char PD13_6:1;/* Port P136 direction register */ unsigned char PD13_7:1;/* Port P137 direction register */ } BIT; /* */ char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Pull-up control register 0 //0x03fc ------------------------------------------------------*/ union st_pur0 { /* union PUR0 */ struct { /* Bit Access */ unsigned char PU00:1;/* P00 to P03 pull-up */ unsigned char PU01:1;/* P04 to P07 pull-up */ unsigned char PU02:1;/* P10 to P13 pull-up */ unsigned char PU03:1;/* P14 to P17 pull-up */ unsigned char PU04:1;/* P20 to P23 pull-up */ unsigned char PU05:1;/* P24 to P27 pull-up */ unsigned char PU06:1;/* P30 to P33 pull-up */ unsigned char PU07:1;/* P34 to P37 pull-up */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Pull-up control register 1 //0x03fd ------------------------------------------------------*/ union st_pur1 { /* union PUR1 */ struct { /* Bit Access */ unsigned char PU10:1;/* P40 to P43 pull-up */ unsigned char PU11:1;/* P44 to P47 pull-up */ unsigned char PU12:1;/* P50 to P53 pull-up */ unsigned char PU13:1;/* P54 to P57 pull-up */ unsigned char PU14:1;/* P60 to P63 pull-up */ unsigned char PU15:1;/* P64 to P67 pull-up */ unsigned char PU16:1;/* P70 to P73 pull-up (Except P70,P71 ; P70,P71 -> N-channel open drain ports)*/ unsigned char PU17:1;/* P74 to P77 pull-up */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Pull-up control register 2 //0x03fe ------------------------------------------------------*/ union st_pur2 { /* union PUR2 */ struct { /* Bit Access */ unsigned char PU20:1;/* P80 to P83 pull-up */ unsigned char PU21:1;/* P84 to P87 pull-up (Except P85) */ unsigned char PU22:1;/* P90 to P93 pull-up */ unsigned char PU23:1;/* P94 to P97 pull-up */ unsigned char PU24:1;/* P100 to P103 pull-up */ unsigned char PU25:1;/* P104 to P107 pull-up */ unsigned char :1;/* Nothing assigned */ unsigned char :1;/* Nothing assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /*------------------------------------------------------ Port control register //0x03ff ------------------------------------------------------*/ union st_pcr { /* union PCR2 */ struct { /* Bit Access */ unsigned char PCR0:1;/* Port P1 control register */ unsigned char :1;/* Nothing assigned */ unsigned char :1;/* Nothing assigned */ unsigned char :1;/* Nothing assigned */ unsigned char :1;/* Nothing assigned */ unsigned char :1;/* Nothing assigned */ unsigned char :1;/* Nothing assigned */ unsigned char :1;/* Nothing assigned */ } BIT; /* */ unsigned char BYTE; /* Byte Access */ }; /* */ /* Processor mode register 0 */ #define PM0 (*(volatile union st_pm0 *)(0x0004)) /* Processor mode register 1 */ #define PM1 (*(volatile union st_pm1 *)(0x0005)) /* System clock control register 0 */ #define CM0 (*(volatile union st_cm0 *)(0x0006)) /* System clock control register 1 */ #define CM1 (*(volatile union st_cm1 *)(0x0007)) /* Chip select control register */ #define CSR (*(volatile union st_csr *)(0x0008)) /* Address match interrupt enable register */ #define AIER (*(volatile union st_aier *)(0x0009)) /* Protect register */ #define PRCR (*(volatile union st_prcr *)(0x000A)) /* Data bank register */ #define DBR (*(volatile union st_dbr *)(0x000B)) /* Oscillation stop detection register */ #define CM2 (*(volatile union st_cm2 *)(0x000C)) /* Watchdog timer start register */ #define WDTS (*(volatile char *)(0x000E)) /* Watchdog timer control register */ #define WDC (*(volatile union st_wdc *)(0x000F)) /* Address match interrupt register 0 */ #define RMAD0 (*(volatile union st_rmad0 *)(0x0010)) /* Address match interrupt register 1 */ #define RMAD1 (*(volatile union st_rmad1 *)(0x0014)) /* Voltage detection register 1 */ #define VCR1 (*(volatile union st_vcr1 *)(0x0019)) /* Voltage detection register 2 */ #define VCR2 (*(volatile union st_vcr2 *)(0x001A)) /* Chip select expansion control register */ #define CSE (*(volatile union st_cse *)(0x001B)) /* PLC control register 0 */ #define PLC0 (*(volatile union st_plc0 *)(0x001C)) /* Processor mode register 2 */ #define PM2 (*(volatile union st_pm2 *)(0x001E)) /* Power supply down detection register */ #define D4INT (*(volatile union st_d4int *)(0x001F)) /* DMA0 source pointer */ #define SAR0 (*(volatile union st_sar0 *)(0x0020)) /* DMA0 destination pointer */ #define DAR0 (*(volatile union st_dar0 *)(0x0024)) /* DMA0 transfer counter */ #define TCR0 (*(volatile union st_tcr0 *)(0x0028)) /* DMA0 control register */ #define DM0CON (*(volatile union st_dm0con *)(0x002C)) /* DMA1 source pointer */ #define SAR1 (*(volatile union st_sar1 *)(0x0030)) /* DMA1 destination pointer */ #define DAR1 (*(volatile union st_dar1 *)(0x0034)) /* DMA1 transfer counter */ #define TCR1 (*(volatile union st_tcr1 *)(0x0038)) /* DMA1 control register */ #define DM1CON (*(volatile union st_dm1con *)(0x003c)) /* INT3~ interrupt control register */ #define INT3IC (*(volatile union st_icr *)(0x0044)) /* Timer B5 interrupt control register */ #define TB5IC (*(volatile union st_icr1 *)(0x0045)) /* Timer B4 interrupt control register */ #define TB4IC (*(volatile union st_icr1 *)(0x0046)) /* Timer B3 interrupt control register */ #define TB3IC (*(volatile union st_icr1 *)(0x0047)) /* UART1 BUS collision detection interrupt control register */ #define U1BCNIC (*(volatile union st_icr1 *)(0x0046)) /* UART0 BUS collision detection interrupt control register */ #define U0BCNIC (*(volatile union st_icr1 *)(0x0047)) /* SI/O4 interrupt control register */ #define S4IC (*(volatile union st_icr *)(0x0048)) /* SI/O3 interrupt control register */ #define S3IC (*(volatile union st_icr *)(0x0049)) /* INT5~ interrupt control register */ #define INT5IC (*(volatile union st_icr *)(0x0048)) /* INT4~ interrupt control register */ #define INT4IC (*(volatile union st_icr *)(0x0049)) /* Bus collision detection interrupt control register */ #define BCNIC (*(volatile union st_bcnic *)(0x004a)) /* DMA0 interrupt control register */ #define DM0IC (*(volatile union st_dm0ic *)(0x004b)) /* DMA1 interrupt control register */ #define DM1IC (*(volatile union st_icr1 *)(0x004c)) /* Key input interrupt control register */ #define KUPIC (*(volatile union st_icr1 *)(0x004D)) /* A/D conversion interrupt control register */ #define ADIC (*(volatile union st_icr1 *)(0x004E)) /* UART2 transmit interrupt control register */ #define S2TIC (*(volatile union st_icr1 *)(0x004F)) /* UART2 receive interrupt control register */ #define S2RIC (*(volatile union st_icr1 *)(0x0050)) /* UART0 transmit interrupt control register */ #define S0TIC (*(volatile union st_icr1 *)(0x0051)) /* UART0 receive interrupt control register */ #define S0RIC (*(volatile union st_icr1 *)(0x0052)) /* UART1 transmit interrupt control register */ #define S1TIC (*(volatile union st_icr1 *)(0x0053)) /* UART1 receive interrupt control register */ #define S1RIC (*(volatile union st_icr1 *)(0x0054)) /* Timer A0 interrupt control register */ #define TA0IC (*(volatile union st_icr1 *)(0x0055)) /* Timer A1 interrupt control register */ #define TA1IC (*(volatile union st_icr1 *)(0x0056)) /* Timer A2 interrupt control register */ #define TA2IC (*(volatile union st_icr1 *)(0x0057)) /* Timer A3 interrupt control register */ #define TA3IC (*(volatile union st_icr1 *)(0x0058)) /* Timer A4 interrupt control register */ #define TA4IC (*(volatile union st_icr1 *)(0x0059)) /* Timer B0 interrupt control register */ #define TB0IC (*(volatile union st_icr1 *)(0x005A)) /* Timer B1 interrupt control register */ #define TB1IC (*(volatile union st_icr1 *)(0x005B)) /* Timer B2 interrupt control register */ #define TB2IC (*(volatile union st_icr1 *)(0x005C)) /* INT0~ interrupt control register */ #define INT0IC (*(volatile union st_icr *)(0x005D)) /* INT1~ interrupt control register */ #define INT1IC (*(volatile union st_icr *)(0x005E)) /* INT2~ interrupt control register */ #define INT2IC (*(volatile union st_icr *)(0x005F)) /* Flash identification register */ #define FIDR (*(volatile union st_fidr *)(0x01b4)) /* Flash memory control register 1 */ #define FMR1 (*(volatile union st_fmr1 *)(0x01b5)) /* Flash memory control register 0 */ #define FMR0 (*(volatile union st_fmr0 *)(0x01b7)) /* Address match interrupt register 2 */ #define RMAD2 (*(volatile union st_rmad2 *)(0x01b8)) /* Address match interrupt enable register 2 */ #define AIER2 (*(volatile union st_aier2 *)(0x01bb)) /* Address match interrupt register 3 */ #define RMAD3 (*(volatile union st_rmad3 *)(0x01bc)) /* Peripheral clock select register */ #define PCLKR (*(volatile union st_pclkr *)(0x025e)) /* Timer B3,4,5 count start flag */ #define TBSR (*(volatile union st_tbsr *)(0x0340)) /******************************************************** * declare SFR short * ********************************************************/ /*-------------------------------------------------------- Timer registers : Read and write data in 16-bit units. --------------------------------------------------------*/ /* Timer A1-1 register */ #define TA1_1 (*(volatile unsigned short *)(0x0342)) /* Timer A2-1 register */ #define TA2_1 (*(volatile unsigned short *)(0x0344)) /* Timer A4-1 register */ #define TA4_1 (*(volatile unsigned short *)(0x0346)) /* Three-phase PWM control regester 0 */ #define INVC0 (*(volatile union st_invc0 *)(0x0348)) /* Three-phase PWM control register 1 */ #define INVC1 (*(volatile union st_invc1 *)(0x0349)) /* Three-phase output buffer register 0 */ #define IDB0 (*(volatile union st_idb0 *)(0x034a)) /* Three-phase output buffer register 1 */ #define IDB1 (*(volatile union st_idb1 *)(0x034b)) /*------------------------------------------------------ Dead time timer ; Use "MOV" instruction when writing to this register. ------------------------------------------------------*/ /* Dead time timer */ #define DTT (*(volatile unsigned char *)(0x034c)) /*------------------------------------------------------------------ Timer B2 interrupt occurrences frequency set counter ; Use "MOV" instruction when writing to this register. -------------------------------------------------------------------*/ /* Timer B2 interrupt occurrences frequency set counter */ #define ICTB2 (*(volatile unsigned char *)(0x034d)) /* Timer B3 register */ #define TB3 (*(volatile unsigned short *)(0x0350)) /* Timer B4 register */ #define TB4 (*(volatile unsigned short *)(0x0352)) /* Timer B5 register */ #define TB5 (*(volatile unsigned short *)(0x0354)) /* Timer B3 mode register */ #define TB3MR (*(volatile union st_tmr *)(0x035b)) /* Timer B4 mode register */ #define TB4MR (*(volatile union st_tmr *)(0x035c)) /* Timer B5 mode register */ #define TB5MR (*(volatile union st_tmr *)(0x035d)) /* Interrupt request cause select register 2 */ #define IFSR2A (*(volatile union st_ifsr2a *)(0x035e)) /* Interrupt cause select register */ #define IFSR (*(volatile union st_ifsr *)(0x035f)) /* SI/O3i transmit/receive register (i=3,4)*/ #define S3TRR (*(volatile unsigned char *)(0x0360)) /* SI/O3 control register */ #define S3C (*(volatile union st_s3c *)(0x0362)) /* SI/O3 bit rate generator (Use "MOV" instruction when writing to these registers)*/ #define S3BRG (*(volatile unsigned char *)(0x0363)) /* SI/O4 transmit/receive register */ #define S4TRR (*(volatile unsigned char *)(0x0364)) /* SI/O4 control register */ #define S4C (*(volatile union st_s4c *)(0x0366)) /* SI/O4 bit rate generator */ #define S4BRG (*(volatile unsigned char *)(0x0367)) /* UART0 special mode register 4 */ #define U0SMR4 (*(volatile union st_u0smr4 *)(0x036c)) /* UART0 special mode register 3 */ #define U0SMR3 (*(volatile union st_u0smr3 *)(0x036d)) /* UART0 special mode register 2 */ #define U0SMR2 (*(volatile union st_u0smr2 *)(0x036e)) /* UART0 special mode register */ #define U0SMR (*(volatile union st_u0smr *)(0x036f)) /* UART1 special mode register 4 */ #define U1SMR4 (*(volatile union st_u1smr4 *)(0x0370)) /* UART1 special mode register 3 */ #define U1SMR3 (*(volatile union st_u1smr3 *)(0x0371)) /* UART1 special mode register 2 */ #define U1SMR2 (*(volatile union st_u1smr2 *)(0x0372)) /* UART1 special mode register */ #define U1SMR (*(volatile union st_u1smr *)(0x0373)) /* UART2 special mode register 4 */ #define U2SMR4 (*(volatile union st_u2smr4 *)(0x0374)) /* UART2 special mode register 3 */ #define U2SMR3 (*(volatile union st_u2smr3 *)(0x0375)) /* UART2 special mode register 2 */ #define U2SMR2 (*(volatile union st_u2smr2 *)(0x0376)) /* UART2 special mode register */ #define U2SMR (*(volatile union st_u2smr *)(0x0377)) /* UART2 transmit/receive mode register */ #define U2MR (*(volatile union st_u2mr *)(0x0378)) /* UART2 bit rate generator */ #define U2BRG (*(volatile unsigned char *)(0x0379)) /* UART2 transmit buffer register */ #define U2TB (*(volatile union st_u2tb *)(0x037a)) /* UART2 transmit/receive control register 0 */ //#pragma ADDRESS u2c0_addr 037cH #define U2C0 (*(volatile union st_u2c0 *)(0x037c)) /* UART2 transmit/receive control register 1 */ #define U2C1 (*(volatile union st_u2c1 *)(0x037d)) /* UART2 receive buffer register */ #define U2RB (*(volatile union st_u2rb *)(0x037e)) /* Count start flag */ #define TABSR (*(volatile union st_tabsr *)(0x0380)) /* Clock prescaler reset flag */ #define CPSRF (*(volatile union st_cpsrf *)(0x0381)) /* One-shot start flag */ #define ONSF (*(volatile union st_onsf *)(0x0382)) /* Trigger select register */ #define TRGSR (*(volatile union st_trgsr *)(0x0383)) /* Up/down flag (Use "MOV" instruction when writing to this register.)*/ #define UDF (*(volatile unsigned char *)(0x0384)) /* Timer A0 register */ #define TA0 (*(volatile unsigned short *)(0x0386)) /* Timer A1 register */ #define TA1 (*(volatile unsigned short *)(0x0388)) /* Timer A2 register */ #define TA2 (*(volatile unsigned short *)(0x038a)) /* Timer A3 register */ #define TA3 (*(volatile unsigned short *)(0x038c)) /* Timer A4 register */ #define TA4 (*(volatile unsigned short *)(0x038e)) /* Timer B0 register */ #define TB0 (*(volatile unsigned short *)(0x0390)) /* Timer B1 register */ #define TB1 (*(volatile unsigned short *)(0x0392)) /* Timer B2 register */ #define TB2 (*(volatile unsigned short *)(0x0394)) /* Timer A0 mode register */ #define TA0MR (*(volatile union st_tmr *)(0x0396)) /* Timer A1 mode register */ #define TA1MR (*(volatile union st_tmr *)(0x0397)) /* Timer A2 mode register */ #define TA2MR (*(volatile union st_tmr *)(0x0398)) /* Timer A3 mode register */ #define TA3MR (*(volatile union st_tmr *)(0x0399)) /* Timer A4 mode register */ #define TA4MR (*(volatile union st_tmr *)(0x039A)) /* Timer B0 mode register */ #define TB0MR (*(volatile union st_tmr *)(0x039b)) /* Timer B1 mode register */ #define TB1MR (*(volatile union st_tmr *)(0x039c)) /* Timer B2 mode register */ #define TB2MR (*(volatile union st_tmr *)(0x039d)) /* Timer B2 special mode register */ #define TB2SC (*(volatile union st_tb2sc *)(0x039e)) /* UART0 transmit/receive mode register */ #define U0MR (*(volatile union st_u0mr *)(0x03a0)) /* UART0 bit rate generator (Use "MOV" instruction when writing to these registers.)*/ #define U0BRG (*(volatile unsigned char *)(0x03a1)) /* UART0 transmit buffer register */ #define U0TB (*(volatile union st_u0tb *)(0x03a2)) /* UART0 transmit/receive control register 0 */ #define U0C0 (*(volatile union st_u0c0 *)(0x03a4)) /* UART0 transmit/receive control register 1 */ #define U0C1 (*(volatile union st_u0c1 *)(0x03a5)) /* UART0 receive buffer register */ #define U0RB (*(volatile union st_u0rb *)(0x03a6)) /* UART1 transmit/receive mode register */ #define U1MR (*(volatile union st_u1mr *)(0x03a8)) /* UART1 bit rate generator */ #define U1BRG (*(volatile unsigned char *)(0x03a9)) /* UART1 transmit buffer register */ #define U1TB (*(volatile union st_u1tb *)(0x03aa)) /* UART1 transmit/receive control register 0 */ #define U1C0 (*(volatile union st_u1c0 *)(0x03ac)) /* UART1 transmit/receive control register 1 */ #define U1C1 (*(volatile union st_u1c1 *)(0x03ad)) /* UART1 receive buffer register */ #define U1RB (*(volatile union st_u1rb *)(0x03ae)) /* UART transmit/receive control register 2 */ #define UCON (*(volatile union st_ucon *)(0x03b0)) /* DMA0 cause select register */ #define DM0SL (*(volatile union st_dm0sl *)(0x03b8)) /* DMA1 cause select register */ #define DM1SL (*(volatile union st_dm1sl *)(0x03ba)) /* CRC data register */ #define CRCD (*(volatile union st_crcd *)(0x03bc)) /* CRC input register */ #define CRCIN (*(volatile unsigned char *)(0x03be)) /* A/D register 0 */ #define AD0 (*(volatile union st_ad0 *)(0x03c0)) /* A/D register 1 */ #define AD1 (*(volatile union st_ad1 *)(0x03c2)) /* A/D register 2 */ #define AD2 (*(volatile union st_ad2 *)(0x03c4)) /* A/D register 3 */ #define AD3 (*(volatile union st_ad3 *)(0x03c6)) /* A/D register 4 */ #define AD4 (*(volatile union st_ad4 *)(0x03c8)) /* A/D register 5 */ #define AD5 (*(volatile union st_ad5 *)(0x03ca)) /* A/D register 6 */ #define AD6 (*(volatile union st_ad6 *)(0x03cc)) /* A/D register 7 */ #define AD7 (*(volatile union st_ad7 *)(0x03ce)) /* A/D control register 2 */ #define ADCON2 (*(volatile union st_adcon2 *)(0x03d4)) /* A/D control register 0 */ #define ADCON0 (*(volatile union st_adcon0 *)(0x03d6)) /* A/D control register 1 */ #define ADCON1 (*(volatile union st_adcon1 *)(0x03d7)) /* D/A register 0 */ #define DA0 (*(volatile unsigned char *)(0x03d8)) /* D/A register 1 */ #define DA1 (*(volatile unsigned char *)(0x03da)) /* D/A control register */ #define DACON (*(volatile union st_dacon *)(0x03dc)) /* Port P14 control register */ #define PC14 (*(volatile union st_pc14 *)(0x03de)) /* Pull-up control register 3 */ #define PUR3 (*(volatile union st_pur3 *)(0x03df)) /* Port P0 register */ #define P0 (*(volatile union st_p0 *)(0x03e0)) /* Port P1 register */ #define P1 (*(volatile union st_p1 *)(0x03e1)) /* Port P0 direction register */ #define PD0 (*(volatile union st_pd0 *)(0x03e2)) /* Port P1 direction register */ #define PD1 (*(volatile union st_pd1 *)(0x03e3)) /* Port P2 register */ #define P2 (*(volatile union st_p2 *)(0x03e4)) /* Port P3 register */ #define P3 (*(volatile union st_p3 *)(0x03e5)) /* Port P2 direction register */ #define PD2 (*(volatile union st_pd2 *)(0x03e6)) /* Port P3 direction register */ #define PD3 (*(volatile union st_pd3 *)(0x03e7)) /* Port P4 register */ #define P4 (*(volatile union st_p4 *)(0x03e8)) /* Port P5 register */ #define P5 (*(volatile union st_p5 *)(0x03e9)) /* Port P4 direction register */ #define PD4 (*(volatile union st_pd4 *)(0x03ea)) /* Port P5 direction register */ #define PD5 (*(volatile union st_pd5 *)(0x03eb)) /* Port P6 register */ #define P6 (*(volatile union st_p6 *)(0x03ec)) /* Port P7 register */ #define P7 (*(volatile union st_p7 *)(0x03ed)) /* Port P6 direction register */ #define PD6 (*(volatile union st_pd6 *)(0x03ee)) /* Port P7 direction register */ #define PD7 (*(volatile union st_pd7 *)(0x03ef)) /* Port P8 register */ #define P8 (*(volatile union st_p8 *)(0x03f0)) /* Port P9 register */ #define P9 (*(volatile union st_p9 *)(0x03f1)) /* Port P8 direction register */ #define PD8 (*(volatile union st_pd8 *)(0x03f2)) /* Port P9 direction register */ #define PD9 (*(volatile union st_pd9 *)(0x03f3)) /* Port P10 register */ #define P10 (*(volatile union st_p10 *)(0x03f4)) /* Port P11 register */ #define P11 (*(volatile union st_p11 *)(0x03f5)) /* Port P10 direction register */ #define PD10 (*(volatile union st_pd10 *)(0x03f6)) /* Port P11 direction register */ #define PD11 (*(volatile union st_pd11 *)(0x03f7)) /* Port P12 register */ #define P12 (*(volatile union st_p12 *)(0x03f8)) /* Port P13 register */ #define P13 (*(volatile union st_p13 *)(0x03f9)) /* Port P12 direction register */ #define PD12 (*(volatile union st_pd12 *)(0x03fa)) /* Port P13 direction register */ #define PD13 (*(volatile union st_pd13 *)(0x03f7)) /* Pull-up control register 0 */ #define PUR0 (*(volatile union st_pur0 *)(0x03fc)) /* Pull-up control register 1 */ #define PUR1 (*(volatile union st_pur1 *)(0x03fd)) /* Pull-up control register 2 */ #define PUR2 (*(volatile union st_pur2 *)(0x03fe)) /* Port control register */ #define PCR (*(volatile union st_pcr *)(0x03ff)) #endif /* __IOM16C62P_H__ */ tinyos-2.1.2+dfsg/tos/chips/m16c60/62p/m16c60.h000066400000000000000000000040441207233610700203060ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * 62P specific includes and defines in the M16C/60 series. * * @author Henrik Makitaavola */ #ifndef __M16C60_H__ #define __M16C60_H__ #include "iom16c62p.h" /* ADC Precision Settings */ enum { M16c60_ADC_PRECISION_10BIT = 1, M16c60_ADC_PRECISION_8BIT = 0, }; #endif // __M16C60_H__ tinyos-2.1.2+dfsg/tos/chips/m16c60/65/000077500000000000000000000000001207233610700170425ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/m16c60/65/iom16c65.h000066400000000000000000005207571207233610700205040ustar00rootroot00000000000000/*--------------------------------------------------------------------------------*/ /* * Copyright (c) 2010 Eistec AB. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * *--------------------------------------------------------------------------------*/ #ifndef __IOM16C65_H__ #define __IOM16C65_H__ /*--------------------------------------------------------------------------------*/ /* General register definitions */ union register8_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; union register16_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; unsigned char bit8 :1; unsigned char bit9 :1; unsigned char bit10 :1; unsigned char bit11 :1; unsigned char bit12 :1; unsigned char bit13 :1; unsigned char bit14 :1; unsigned char bit15 :1; } BIT; struct { unsigned char BYTE0; unsigned char BYTE1; } BYTES; unsigned short WORD; }; union register32_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; unsigned char bit8 :1; unsigned char bit9 :1; unsigned char bit10 :1; unsigned char bit11 :1; unsigned char bit12 :1; unsigned char bit13 :1; unsigned char bit14 :1; unsigned char bit15 :1; unsigned char bit16 :1; unsigned char bit17 :1; unsigned char bit18 :1; unsigned char bit19 :1; unsigned char bit20 :1; unsigned char bit21 :1; unsigned char bit22 :1; unsigned char bit23 :1; unsigned char bit24 :1; unsigned char bit25 :1; unsigned char bit26 :1; unsigned char bit27 :1; unsigned char bit28 :1; unsigned char bit29 :1; unsigned char bit30 :1; unsigned char bit31 :1; } BIT; struct { unsigned char BYTE0; unsigned char BYTE1; unsigned char BYTE2; unsigned char BYTE3; } BYTES; struct { unsigned short WORD0; unsigned short WORD1; } WORDS; unsigned long dWORD; }; /*--------------------------------------------------------------------------------*/ /* Processor Mode Register 0 */ union pm0_t { struct { unsigned char PM00 :1; unsigned char PM01 :1; unsigned char PM02 :1; unsigned char PM03 :1; unsigned char PM04 :1; unsigned char PM05 :1; unsigned char PM06 :1; unsigned char PM07 :1; } BIT; unsigned char BYTE; }; #define PM0 (*(volatile union pm0_t *)(0x0004)) /*--------------------------------------------------------------------------------*/ /* Processor Mode Register 1 */ union pm1_t { struct { unsigned char PM10 :1; unsigned char PM11 :1; unsigned char PM12 :1; unsigned char PM13 :1; unsigned char PM14 :1; unsigned char PM15 :1; unsigned char bit6 :1; unsigned char PM17 :1; } BIT; unsigned char BYTE; }; #define PM1 (*(volatile union pm1_t *)(0x0005)) /*--------------------------------------------------------------------------------*/ /* System Clock Control Register 0 */ union cm0_t { struct { unsigned char CM00 :1; unsigned char CM01 :1; unsigned char CM02 :1; unsigned char CM03 :1; unsigned char CM04 :1; unsigned char CM05 :1; unsigned char CM06 :1; unsigned char CM07 :1; } BIT; unsigned char BYTE; }; #define CM0 (*(volatile union cm0_t *)(0x0006)) /*--------------------------------------------------------------------------------*/ /* System Clock Control Register 1 */ union cm1_t { struct { unsigned char CM10 :1; unsigned char CM11 :1; unsigned char bit2 :1; unsigned char CM13 :1; unsigned char CM14 :1; unsigned char CM15 :1; unsigned char CM16 :1; unsigned char CM17 :1; } BIT; unsigned char BYTE; }; #define CM1 (*(volatile union cm1_t *)(0x0007)) /*--------------------------------------------------------------------------------*/ /* Chip Select Control Register */ union csr_t { struct { unsigned char CS0 :1; unsigned char CS1 :1; unsigned char CS2 :1; unsigned char CS3 :1; unsigned char CS0W :1; unsigned char CS1W :1; unsigned char CS2W :1; unsigned char CS3W :1; } BIT; unsigned char BYTE; }; #define CSR (*(volatile union csr_t *)(0x0008)) /*--------------------------------------------------------------------------------*/ /* External Area Recovery Cycle Control Register */ union ewr_t { struct { unsigned char EWR0 :1; unsigned char EWR1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define EWR (*(volatile union ewr_t *)(0x0009)) /*--------------------------------------------------------------------------------*/ /* Protect Register */ union prcr_t { struct { unsigned char PRC0 :1; unsigned char PRC1 :1; unsigned char PRC2 :1; unsigned char PRC3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char PRC6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PRCR (*(volatile union prcr_t *)(0x000A)) /*--------------------------------------------------------------------------------*/ /* Data Bank Register */ union dbr_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char OFS :1; unsigned char BSR0 :1; unsigned char BSR1 :1; unsigned char BSR2 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define DBR (*(volatile union dbr_t *)(0x000B)) /*--------------------------------------------------------------------------------*/ /* Oscillation Stop Detection Register */ union cm2_t { struct { unsigned char CM20 :1; unsigned char CM21 :1; unsigned char CM22 :1; unsigned char CM23 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char CM27 :1; } BIT; unsigned char BYTE; }; #define CM2 (*(volatile union cm2_t *)(0x000C)) /*--------------------------------------------------------------------------------*/ /* Program 2 Area Control Register */ union prg2c_t { struct { unsigned char PRG2C0 :1; unsigned char IRON :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PRG2C (*(volatile union prg2c_t *)(0x0010)) /*--------------------------------------------------------------------------------*/ /* External Area Wait Control Expansion Register */ union ewc_t { struct { unsigned char EWC00 :1; unsigned char EWC01 :1; unsigned char EWC10 :1; unsigned char EWC11 :1; unsigned char EWC20 :1; unsigned char EWC21 :1; unsigned char EWC30 :1; unsigned char EWC31 :1; } BIT; unsigned char BYTE; }; #define EWC (*(volatile union ewc_t *)(0x0011)) /*--------------------------------------------------------------------------------*/ /* Peripheral Clock Select Register */ union pclkr_t { struct { unsigned char PCLK0 :1; unsigned char PCLK1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char PCLK5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PCLKR (*(volatile union pclkr_t *)(0x0012)) /*--------------------------------------------------------------------------------*/ /* Clock Prescaler Reset Flag */ union cpsrf_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char CPSR :1; } BIT; unsigned char BYTE; }; #define CPSRF (*(volatile union cpsrf_t *)(0x0015)) /*--------------------------------------------------------------------------------*/ /* Reset Source Determine Register */ union rstfr_t { struct { unsigned char CWR :1; unsigned char HWR :1; unsigned char SWR :1; unsigned char WDR :1; unsigned char LVD1R :1; unsigned char LVD2R :1; unsigned char OSDR :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define RSTFR (*(volatile union rstfr_t *)(0x0018)) /*--------------------------------------------------------------------------------*/ /* Voltage Detector 2 Flag Register */ union vcr1_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char VC13 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define VCR1 (*(volatile union vcr1_t *)(0x0019)) /*--------------------------------------------------------------------------------*/ /* Voltage Detector Operation Enable Register */ union vcr2_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char VC25 :1; unsigned char VC26 :1; unsigned char VC27 :1; } BIT; unsigned char BYTE; }; #define VCR2 (*(volatile union vcr2_t *)(0x001A)) /*--------------------------------------------------------------------------------*/ /* Chip Select Expansion Control Register */ union cse_t { struct { unsigned char CSE00W :1; unsigned char CSE01W :1; unsigned char CSE10W :1; unsigned char CSE11W :1; unsigned char CSE20W :1; unsigned char CSE21W :1; unsigned char CSE30W :1; unsigned char CSE31W :1; } BIT; unsigned char BYTE; }; #define CSE (*(volatile union cse_t *)(0x001B)) /*--------------------------------------------------------------------------------*/ /* PLL Control Register 0 */ union plc0_t { struct { unsigned char PLC00 :1; unsigned char PLC01 :1; unsigned char PLC02 :1; unsigned char bit3 :1; unsigned char PLC04 :1; unsigned char PLC05 :1; unsigned char bit6 :1; unsigned char PLC07 :1; } BIT; unsigned char BYTE; }; #define PLC0 (*(volatile union plc0_t *)(0x001C)) /*--------------------------------------------------------------------------------*/ /* Processor Mode Register 2 */ union pm2_t { struct { unsigned char bit0 :1; unsigned char PM21 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char PM24 :1; unsigned char PM25 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PM2 (*(volatile union pm2_t *)(0x001E)) /*--------------------------------------------------------------------------------*/ /* 40 MHz On-Chip Oscillator Control Register 0 */ union fra0_t { struct { unsigned char FRA00 :1; unsigned char FRA01 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define FRA0 (*(volatile union fra0_t *)(0x0022)) /*--------------------------------------------------------------------------------*/ /* Voltage Monitor Function Select Register */ union vwce_t { struct { unsigned char VW12E :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define VWCE (*(volatile union vwce_t *)(0x0026)) /*--------------------------------------------------------------------------------*/ /* Voltage Detector 1 Level Select Register */ union vd1ls_t { struct { unsigned char VD1LS0 :1; unsigned char VD1LS1 :1; unsigned char VD1LS2 :1; unsigned char VD1LS3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define VD1LS (*(volatile union vd1ls_t *)(0x0028)) /*--------------------------------------------------------------------------------*/ /* Voltage Monitor 0 Control Register */ union vw0c_t { struct { unsigned char VW0C0 :1; unsigned char VW0C1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char VW0F0 :1; unsigned char VW0F1 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define VW0C (*(volatile union vw0c_t *)(0x002A)) /*--------------------------------------------------------------------------------*/ /* Voltage Monitor 1 Control Register */ union vw1c_t { struct { unsigned char VW1C0 :1; unsigned char VW1C1 :1; unsigned char VW1C2 :1; unsigned char VW1C3 :1; unsigned char VW1F0 :1; unsigned char VW1F1 :1; unsigned char VW1C6 :1; unsigned char VW1C7 :1; } BIT; unsigned char BYTE; }; #define VW1C (*(volatile union vw1c_t *)(0x002B)) /*--------------------------------------------------------------------------------*/ /* Voltage Monitor 2 Control Register */ union vw2c_t { struct { unsigned char VW2C0 :1; unsigned char VW2C1 :1; unsigned char VW2C2 :1; unsigned char VW2C3 :1; unsigned char VW2F0 :1; unsigned char VW2F1 :1; unsigned char VW2C6 :1; unsigned char VW2C7 :1; } BIT; unsigned char BYTE; }; #define VW2C (*(volatile union vw2c_t *)(0x002C)) /*--------------------------------------------------------------------------------*/ /* Interrupt Control Register 1 */ union icr1_t { struct { unsigned char ILVL0 :1; unsigned char ILVL1 :1; unsigned char ILVL2 :1; unsigned char IR :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; /*--------------------------------------------------------------------------------*/ /* Interrupt Control Register 2 */ union icr2_t { struct { unsigned char ILVL0 :1; unsigned char ILVL1 :1; unsigned char ILVL2 :1; unsigned char IR :1; unsigned char POL :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; /*--------------------------------------------------------------------------------*/ /* INT7 Interrupt Control Register */ #define INT7IC (*(volatile union icr2_t *)(0x0042)) /*--------------------------------------------------------------------------------*/ /* INT6 Interrupt Control Register */ #define INT6IC (*(volatile union icr2_t *)(0x0043)) /*--------------------------------------------------------------------------------*/ /* INT3 Interrupt Control Register */ #define INT3IC (*(volatile union icr2_t *)(0x0044)) /*--------------------------------------------------------------------------------*/ /* Timer B5 Interrupt Control Register */ #define TB5IC (*(volatile union icr1_t *)(0x0045)) /*--------------------------------------------------------------------------------*/ /* Timer B4 Interrupt Control Register */ #define TB4IC (*(volatile union icr1_t *)(0x0046)) /*--------------------------------------------------------------------------------*/ /* UART1 Bus Collision Detection Interrupt Control Register */ #define U1BCNIC (*(volatile union icr1_t *)(0x0046)) /*--------------------------------------------------------------------------------*/ /* Timer B3 Interrupt Control Register */ #define TB3IC (*(volatile union icr1_t *)(0x0047)) /*--------------------------------------------------------------------------------*/ /* UART0 Bus Collision Detection Interrupt Control Register */ #define U0BCNIC (*(volatile union icr1_t *)(0x0047)) /*--------------------------------------------------------------------------------*/ /* SI/O4 Interrupt Control Register */ #define S4IC (*(volatile union icr2_t *)(0x0048)) /*--------------------------------------------------------------------------------*/ /* INT5 Interrupt Control Register */ #define INT5IC (*(volatile union icr2_t *)(0x0048)) /*--------------------------------------------------------------------------------*/ /* SI/O3 Interrupt Control Register */ #define S3IC (*(volatile union icr2_t *)(0x0049)) /*--------------------------------------------------------------------------------*/ /* INT4 Interrupt Control Register */ #define INT4IC (*(volatile union icr2_t *)(0x0049)) /*--------------------------------------------------------------------------------*/ /* UART2 Bus Collision Detection Interrupt Control Register */ #define BCNIC (*(volatile union icr1_t *)(0x004A)) /*--------------------------------------------------------------------------------*/ /* DMA0 Interrupt Control Register */ #define DM0IC (*(volatile union icr1_t *)(0x004B)) /*--------------------------------------------------------------------------------*/ /* DMA1 Interrupt Control Register */ #define DM1IC (*(volatile union icr1_t *)(0x004C)) /*--------------------------------------------------------------------------------*/ /* Key Input Interrupt Control Register */ #define KUPIC (*(volatile union icr1_t *)(0x004D)) /*--------------------------------------------------------------------------------*/ /* A/D Conversion Interrupt Control Register */ #define ADIC (*(volatile union icr1_t *)(0x004E)) /*--------------------------------------------------------------------------------*/ /* UART2 Transmit Interrupt Control Register */ #define S2TIC (*(volatile union icr1_t *)(0x004F)) /*--------------------------------------------------------------------------------*/ /* UART2 Receive Interrupt Control Register */ #define S2RIC (*(volatile union icr1_t *)(0x0050)) /*--------------------------------------------------------------------------------*/ /* UART0 Transmit Interrupt Control Register */ #define S0TIC (*(volatile union icr1_t *)(0x0051)) /*--------------------------------------------------------------------------------*/ /* UART0 Receive Interrupt Control Register */ #define S0RIC (*(volatile union icr1_t *)(0x0052)) /*--------------------------------------------------------------------------------*/ /* UART1 Transmit Interrupt Control Register */ #define S1TIC (*(volatile union icr1_t *)(0x0053)) /*--------------------------------------------------------------------------------*/ /* UART1 Receive Interrupt Control Register */ #define S1RIC (*(volatile union icr1_t *)(0x0054)) /*--------------------------------------------------------------------------------*/ /* Timer A0 Interrupt Control Register */ #define TA0IC (*(volatile union icr1_t *)(0x0055)) /*--------------------------------------------------------------------------------*/ /* Timer A1 Interrupt Control Register */ #define TA1IC (*(volatile union icr1_t *)(0x0056)) /*--------------------------------------------------------------------------------*/ /* Timer A2 Interrupt Control Register */ #define TA2IC (*(volatile union icr1_t *)(0x0057)) /*--------------------------------------------------------------------------------*/ /* Timer A3 Interrupt Control Register */ #define TA3IC (*(volatile union icr1_t *)(0x0058)) /*--------------------------------------------------------------------------------*/ /* Timer A4 Interrupt Control Register */ #define TA4IC (*(volatile union icr1_t *)(0x0059)) /*--------------------------------------------------------------------------------*/ /* Timer B0 Interrupt Control Register */ #define TB0IC (*(volatile union icr1_t *)(0x005A)) /*--------------------------------------------------------------------------------*/ /* Timer B1 Interrupt Control Register */ #define TB1IC (*(volatile union icr1_t *)(0x005B)) /*--------------------------------------------------------------------------------*/ /* Timer B2 Interrupt Control Register */ #define TB2IC (*(volatile union icr1_t *)(0x005C)) /*--------------------------------------------------------------------------------*/ /* INT0 Interrupt Control Register */ #define INT0IC (*(volatile union icr2_t *)(0x005D)) /*--------------------------------------------------------------------------------*/ /* INT1 Interrupt Control Register */ #define INT1IC (*(volatile union icr2_t *)(0x005E)) /*--------------------------------------------------------------------------------*/ /* INT2 Interrupt Control Register */ #define INT2IC (*(volatile union icr2_t *)(0x005F)) /*--------------------------------------------------------------------------------*/ /* DMA2 Interrupt Control Register */ #define DM2IC (*(volatile union icr1_t *)(0x0069)) /*--------------------------------------------------------------------------------*/ /* DMA3 Interrupt Control Register */ #define DM3IC (*(volatile union icr1_t *)(0x006A)) /*--------------------------------------------------------------------------------*/ /* UART5 Bus Collision Detection Interrupt Control Register */ #define U5BCNIC (*(volatile union icr1_t *)(0x006B)) /*--------------------------------------------------------------------------------*/ /* CEC1 Interrupt Control Register */ #define CEC1IC (*(volatile union icr1_t *)(0x006B)) /*--------------------------------------------------------------------------------*/ /* UART5 Transmit Interrupt Control Register */ #define S5TIC (*(volatile union icr1_t *)(0x006C)) /*--------------------------------------------------------------------------------*/ /* CEC2 Interrupt Control Register */ #define CEC2IC (*(volatile union icr1_t *)(0x006C)) /*--------------------------------------------------------------------------------*/ /* UART5 Receive Interrupt Control Register */ #define S5RIC (*(volatile union icr1_t *)(0x006D)) /*--------------------------------------------------------------------------------*/ /* UART6 Bus Collision Detection Interrupt Control Register */ #define U6BCNIC (*(volatile union icr1_t *)(0x006E)) /*--------------------------------------------------------------------------------*/ /* Real-Time Clock Periodic Interrupt Control Register */ #define RTCTIC (*(volatile union icr1_t *)(0x006E)) /*--------------------------------------------------------------------------------*/ /* UART6 Transmit Interrupt Control Register */ #define S6TIC (*(volatile union icr1_t *)(0x006F)) /*--------------------------------------------------------------------------------*/ /* Real-Time Clock Compare Interrupt Control Register */ #define RTCCIC (*(volatile union icr1_t *)(0x006F)) /*--------------------------------------------------------------------------------*/ /* UART6 Receive Interrupt Control Register */ #define S6RIC (*(volatile union icr1_t *)(0x0070)) /*--------------------------------------------------------------------------------*/ /* UART7 Bus Collision Detection Interrupt Control Register */ #define U7BCNIC (*(volatile union icr1_t *)(0x0071)) /*--------------------------------------------------------------------------------*/ /* Remote Control Signal Receiver 0 Interrupt Control Register */ #define PMC0IC (*(volatile union icr1_t *)(0x0071)) /*--------------------------------------------------------------------------------*/ /* UART7 Transmit Interrupt Control Register */ #define S7TIC (*(volatile union icr1_t *)(0x0072)) /*--------------------------------------------------------------------------------*/ /* Remote Control Signal Receiver 1 Interrupt Control Register */ #define PMC1IC (*(volatile union icr1_t *)(0x0072)) /*--------------------------------------------------------------------------------*/ /* UART7 Receive Interrupt Control Register */ #define S7RIC (*(volatile union icr1_t *)(0x0073)) /*--------------------------------------------------------------------------------*/ /* I2C-bus Interface Interrupt Control Register */ #define IICIC (*(volatile union icr1_t *)(0x007B)) /*--------------------------------------------------------------------------------*/ /* SCL/SDA Interrupt Control Register */ #define SCLDAIC (*(volatile union icr1_t *)(0x007C)) /*--------------------------------------------------------------------------------*/ /* DMA0 Source Pointer */ #define SAR0 (*(volatile union register32_t *)(0x0180)) /*--------------------------------------------------------------------------------*/ /* DMA0 Destination Pointer */ #define DAR0 (*(volatile union register32_t *)(0x0184)) /*--------------------------------------------------------------------------------*/ /* DMA0 Transfer Counter */ #define TCR0 (*(volatile union register16_t *)(0x0188)) /*--------------------------------------------------------------------------------*/ /* DMA0 Control Register */ union dm0con_t { struct { unsigned char DMBIT :1; unsigned char DMASL :1; unsigned char DMAS :1; unsigned char DMAE :1; unsigned char DSD :1; unsigned char DAD :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define DM0CON (*(volatile union dm0con_t *)(0x018C)) /*--------------------------------------------------------------------------------*/ /* DMA1 Source Pointer */ #define SAR1 (*(volatile union register32_t *)(0x0190)) /*--------------------------------------------------------------------------------*/ /* DMA1 Destination Pointer */ #define DAR1 (*(volatile union register32_t *)(0x0194)) /*--------------------------------------------------------------------------------*/ /* DMA1 Transfer Counter */ #define TCR1 (*(volatile union register16_t *)(0x0198)) /*--------------------------------------------------------------------------------*/ /* DMA1 Control Register */ union dm1con_t { struct { unsigned char DMBIT :1; unsigned char DMASL :1; unsigned char DMAS :1; unsigned char DMAE :1; unsigned char DSD :1; unsigned char DAD :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define DM1CON (*(volatile union dm1con_t *)(0x019C)) /*--------------------------------------------------------------------------------*/ /* DMA2 Source Pointer */ #define SAR2 (*(volatile union register32_t *)(0x01A0)) /*--------------------------------------------------------------------------------*/ /* DMA2 Destination Pointer */ #define DAR2 (*(volatile union register32_t *)(0x01A4)) /*--------------------------------------------------------------------------------*/ /* DMA2 Transfer Counter */ #define TCR2 (*(volatile union register16_t *)(0x01A8)) /*--------------------------------------------------------------------------------*/ /* DMA2 Control Register */ union dm2con_t { struct { unsigned char DMBIT :1; unsigned char DMASL :1; unsigned char DMAS :1; unsigned char DMAE :1; unsigned char DSD :1; unsigned char DAD :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define DM2CON (*(volatile union dm2con_t *)(0x01AC)) /*--------------------------------------------------------------------------------*/ /* DMA3 Source Pointer */ #define SAR3 (*(volatile union register32_t *)(0x01B0)) /*--------------------------------------------------------------------------------*/ /* DMA3 Destination Pointer */ #define DAR3 (*(volatile union register32_t *)(0x01B4)) /*--------------------------------------------------------------------------------*/ /* DMA3 Transfer Counter */ #define TCR3 (*(volatile union register16_t *)(0x01B8)) /*--------------------------------------------------------------------------------*/ /* DMA3 Control Register */ union dm3con_t { struct { unsigned char DMBIT :1; unsigned char DMASL :1; unsigned char DMAS :1; unsigned char DMAE :1; unsigned char DSD :1; unsigned char DAD :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define DM3CON (*(volatile union dm3con_t *)(0x01BC)) /*--------------------------------------------------------------------------------*/ /* Timer B0-1 Register */ #define TB01 (*(volatile union register16_t *)(0x01C0)) /*--------------------------------------------------------------------------------*/ /* Timer B1-1 Register */ #define TB11 (*(volatile union register16_t *)(0x01C2)) /*--------------------------------------------------------------------------------*/ /* Timer B2-1 Register */ #define TB21 (*(volatile union register16_t *)(0x01C4)) /*--------------------------------------------------------------------------------*/ /* Pulse Period/Pulse Width Measurement Mode Function Select Register 1 */ union ppwfs1_t { struct { unsigned char PPWFS10 :1; unsigned char PPWFS11 :1; unsigned char PPWFS12 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PPWFS1 (*(volatile union ppwfs1_t *)(0x01C6)) /*--------------------------------------------------------------------------------*/ /* Timer B Count Source Select Register 0 */ union tbcs0_t { struct { unsigned char TCS0 :1; unsigned char TCS1 :1; unsigned char TCS2 :1; unsigned char TCS3 :1; unsigned char TCS4 :1; unsigned char TCS5 :1; unsigned char TCS6 :1; unsigned char TCS7 :1; } BIT; unsigned char BYTE; }; #define TBCS0 (*(volatile union tbcs0_t *)(0x01C8)) /*--------------------------------------------------------------------------------*/ /* Timer B Count Source Select Register 1 */ union tbcs1_t { struct { unsigned char TCS0 :1; unsigned char TCS1 :1; unsigned char TCS2 :1; unsigned char TCS3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define TBCS1 (*(volatile union tbcs1_t *)(0x01C9)) /*--------------------------------------------------------------------------------*/ /* Timer AB Division Control Register 0 */ union tckdivc0_t { struct { unsigned char TCDIV00 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define TCKDIVC0 (*(volatile union tckdivc0_t *)(0x01CB)) /*--------------------------------------------------------------------------------*/ /* Timer A Count Source Select Register 0 */ union tacs0_t { struct { unsigned char TCS0 :1; unsigned char TCS1 :1; unsigned char TCS2 :1; unsigned char TCS3 :1; unsigned char TCS4 :1; unsigned char TCS5 :1; unsigned char TCS6 :1; unsigned char TCS7 :1; } BIT; unsigned char BYTE; }; #define TACS0 (*(volatile union tacs0_t *)(0x01D0)) /*--------------------------------------------------------------------------------*/ /* Timer A Count Source Select Register 1 */ union tacs1_t { struct { unsigned char TCS0 :1; unsigned char TCS1 :1; unsigned char TCS2 :1; unsigned char TCS3 :1; unsigned char TCS4 :1; unsigned char TCS5 :1; unsigned char TCS6 :1; unsigned char TCS7 :1; } BIT; unsigned char BYTE; }; #define TACS1 (*(volatile union tacs1_t *)(0x01D1)) /*--------------------------------------------------------------------------------*/ /* Timer A Count Source Select Register 2 */ union tacs2_t { struct { unsigned char TCS0 :1; unsigned char TCS1 :1; unsigned char TCS2 :1; unsigned char TCS3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define TACS2 (*(volatile union tacs2_t *)(0x01D2)) /*--------------------------------------------------------------------------------*/ /* 16-Bit Pulse Width Modulation Mode Function Select Register */ union pwmfs_t { struct { unsigned char bit0 :1; unsigned char PWMFS1 :1; unsigned char PWMFS2 :1; unsigned char bit3 :1; unsigned char PWMFS4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PWMFS (*(volatile union pwmfs_t *)(0x01D4)) /*--------------------------------------------------------------------------------*/ /* Timer A Waveform Output Function Select Register */ union tapofs_t { struct { unsigned char POFS0 :1; unsigned char POFS1 :1; unsigned char POFS2 :1; unsigned char POFS3 :1; unsigned char POFS4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define TAPOFS (*(volatile union tapofs_t *)(0x01D5)) /*--------------------------------------------------------------------------------*/ /* Timer A Output Waveform Change Enable Register */ union taow_t { struct { unsigned char bit0 :1; unsigned char TA1OW :1; unsigned char TA2OW :1; unsigned char bit3 :1; unsigned char TA4OW :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define TAOW (*(volatile union taow_t *)(0x01D8)) /*--------------------------------------------------------------------------------*/ /* Three-Phase Protect Control Register */ union tprc_t { struct { unsigned char TPRC0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define TPRC (*(volatile union tprc_t *)(0x01DA)) /*--------------------------------------------------------------------------------*/ /* Timer B3-1 Register */ #define TB31 (*(volatile union register16_t *)(0x01E0)) /*--------------------------------------------------------------------------------*/ /* Timer B4-1 Register */ #define TB41 (*(volatile union register16_t *)(0x01E2)) /*--------------------------------------------------------------------------------*/ /* Timer B5-1 Register */ #define TB51 (*(volatile union register16_t *)(0x01E4)) /*--------------------------------------------------------------------------------*/ /* Pulse Period/Pulse Width Measurement Mode Function Select Register 2 */ union ppwfs2_t { struct { unsigned char PPWFS20 :1; unsigned char PPWFS21 :1; unsigned char PPWFS22 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PPWFS2 (*(volatile union ppwfs2_t *)(0x01E6)) /*--------------------------------------------------------------------------------*/ /* Timer B Count Source Select Register 2 */ union tbcs2_t { struct { unsigned char TCS0 :1; unsigned char TCS1 :1; unsigned char TCS2 :1; unsigned char TCS3 :1; unsigned char TCS4 :1; unsigned char TCS5 :1; unsigned char TCS6 :1; unsigned char TCS7 :1; } BIT; unsigned char BYTE; }; #define TBCS2 (*(volatile union tbcs2_t *)(0x01E8)) /*--------------------------------------------------------------------------------*/ /* Timer B Count Source Select Register 3 */ union tbcs3_t { struct { unsigned char TCS0 :1; unsigned char TCS1 :1; unsigned char TCS2 :1; unsigned char TCS3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define TBCS3 (*(volatile union tbcs3_t *)(0x01E9)) /*--------------------------------------------------------------------------------*/ /* PMC0 Function Select Register 0 */ union pmc0con0_t { struct { unsigned char EN :1; unsigned char SINV :1; unsigned char FIL :1; unsigned char EHOLD :1; unsigned char HDEN :1; unsigned char SDEN :1; unsigned char DRINT0 :1; unsigned char DRINT1 :1; } BIT; unsigned char BYTE; }; #define PMC0CON0 (*(volatile union pmc0con0_t *)(0x01F0)) /*--------------------------------------------------------------------------------*/ /* PMC0 Function Select Register 1 */ union pmc0con1_t { struct { unsigned char TYP0 :1; unsigned char TYP1 :1; unsigned char CSS :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char EXSDEN :1; unsigned char EXHDEN :1; } BIT; unsigned char BYTE; }; #define PMC0CON1 (*(volatile union pmc0con1_t *)(0x01F1)) /*--------------------------------------------------------------------------------*/ /* PMC0 Function Select Register 2 */ union pmc0con2_t { struct { unsigned char ENFLG :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char INFLG :1; unsigned char CEFLG :1; unsigned char CEINT :1; unsigned char PSEL0 :1; unsigned char PSEL1 :1; } BIT; unsigned char BYTE; }; #define PMC0CON2 (*(volatile union pmc0con2_t *)(0x01F2)) /*--------------------------------------------------------------------------------*/ /* PMC0 Function Select Register 3 */ union pmc0con3_t { struct { unsigned char CRE :1; unsigned char CFR :1; unsigned char CST :1; unsigned char PD :1; unsigned char CSRC0 :1; unsigned char CSRC1 :1; unsigned char CDIV0 :1; unsigned char CDIV1 :1; } BIT; unsigned char BYTE; }; #define PMC0CON3 (*(volatile union pmc0con3_t *)(0x01F3)) /*--------------------------------------------------------------------------------*/ /* PMC0 Status Register */ union pmc0sts_t { struct { unsigned char CPFLG :1; unsigned char REFLG :1; unsigned char DRFLG :1; unsigned char BFULFLG :1; unsigned char PTHDFLG :1; unsigned char PTD0FLG :1; unsigned char PTD1FLG :1; unsigned char SDFLG :1; } BIT; unsigned char BYTE; }; #define PMC0STS (*(volatile union pmc0sts_t *)(0x01F4)) /*--------------------------------------------------------------------------------*/ /* PMC0 Interrupt Source Select Register */ union pmc0int_t { struct { unsigned char CPINT :1; unsigned char REINT :1; unsigned char DRINT :1; unsigned char BFULINT :1; unsigned char PTHDINT :1; unsigned char PTDINT :1; unsigned char TIMINT :1; unsigned char SDINT :1; } BIT; unsigned char BYTE; }; #define PMC0INT (*(volatile union pmc0int_t *)(0x01F5)) /*--------------------------------------------------------------------------------*/ /* PMC0 Compare Control Register */ union pmc0cpc_t { struct { unsigned char CPN0 :1; unsigned char CPN1 :1; unsigned char CPN2 :1; unsigned char bit3 :1; unsigned char CPEN :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PMC0CPC (*(volatile union pmc0cpc_t *)(0x01F6)) /*--------------------------------------------------------------------------------*/ /* PMC0 Compare Data Register */ #define PMC0CPD (*(volatile union register8_t *)(0x01F7)) /*--------------------------------------------------------------------------------*/ /* PMC1 Function Select Register 0 */ union pmc1con0_t { struct { unsigned char EN :1; unsigned char SINV :1; unsigned char FIL :1; unsigned char bit3 :1; unsigned char HDEN :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PMC1CON0 (*(volatile union pmc1con0_t *)(0x01F8)) /*--------------------------------------------------------------------------------*/ /* PMC1 Function Select Register 1 */ union pmc1con1_t { struct { unsigned char TYP0 :1; unsigned char TYP1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PMC1CON1 (*(volatile union pmc1con1_t *)(0x01F9)) /*--------------------------------------------------------------------------------*/ /* PMC1 Function Select Register 2 */ union pmc1con2_t { struct { unsigned char ENFLG :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char INFLG :1; unsigned char CEFLG :1; unsigned char CEINT :1; unsigned char PSEL0 :1; unsigned char PSEL1 :1; } BIT; unsigned char BYTE; }; #define PMC1CON2 (*(volatile union pmc1con2_t *)(0x01FA)) /*--------------------------------------------------------------------------------*/ /* PMC1 Function Select Register 3 */ union pmc1con3_t { struct { unsigned char CRE :1; unsigned char CFR :1; unsigned char CST :1; unsigned char PD :1; unsigned char CSRC0 :1; unsigned char CSRC1 :1; unsigned char CDIV0 :1; unsigned char CDIV1 :1; } BIT; unsigned char BYTE; }; #define PMC1CON3 (*(volatile union pmc1con3_t *)(0x01FB)) /*--------------------------------------------------------------------------------*/ /* PMC1 Status Register */ union pmc1sts_t { struct { unsigned char bit0 :1; unsigned char REFLG :1; unsigned char DRFLG :1; unsigned char bit3 :1; unsigned char PTHDFLG :1; unsigned char PTD0FLG :1; unsigned char PTD1FLG :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PMC1STS (*(volatile union pmc1sts_t *)(0x01FC)) /*--------------------------------------------------------------------------------*/ /* PMC1 Interrupt Source Select Register */ union pmc1int_t { struct { unsigned char bit0 :1; unsigned char REINT :1; unsigned char DRINT :1; unsigned char bit3 :1; unsigned char PTHDINT :1; unsigned char PTDINT :1; unsigned char TIMINT :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PMC1INT (*(volatile union register8_t *)(0x01FD)) /*--------------------------------------------------------------------------------*/ /* Interrupt Source Select Register 3 */ union ifsr3a_t { struct { unsigned char IFSR30 :1; unsigned char IFSR31 :1; unsigned char bit2 :1; unsigned char IFSR33 :1; unsigned char IFSR34 :1; unsigned char IFSR35 :1; unsigned char IFSR36 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define IFSR3A (*(volatile union ifsr3a_t *)(0x0205)) /*--------------------------------------------------------------------------------*/ /* Interrupt Source Select Register 2 */ union ifsr2a_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char IFSR22 :1; unsigned char IFSR23 :1; unsigned char IFSR24 :1; unsigned char IFSR25 :1; unsigned char IFSR26 :1; unsigned char IFSR27 :1; } BIT; unsigned char BYTE; }; #define IFSR2A (*(volatile union ifsr2a_t *)(0x0206)) /*--------------------------------------------------------------------------------*/ /* Interrupt Source Select Register */ union ifsr_t { struct { unsigned char IFSR0 :1; unsigned char IFSR1 :1; unsigned char IFSR2 :1; unsigned char IFSR3 :1; unsigned char IFSR4 :1; unsigned char IFSR5 :1; unsigned char IFSR6 :1; unsigned char IFSR7 :1; } BIT; unsigned char BYTE; }; #define IFSR (*(volatile union ifsr_t *)(0x0207)) /*--------------------------------------------------------------------------------*/ /* Address Match Interrupt Enable Register */ union aier_t { struct { unsigned char AIER0 :1; unsigned char AIER1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define AIER (*(volatile union aier_t *)(0x020E)) /*--------------------------------------------------------------------------------*/ /* Address Match Interrupt Enable Register 2 */ union aier2_t { struct { unsigned char AIER20 :1; unsigned char AIER21 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define AIER2 (*(volatile union aier2_t *)(0x020F)) /*--------------------------------------------------------------------------------*/ /* Address Match Interrupt Register 0 */ #define RMAD0 (*(volatile union register32_t *)(0x0210)) /*--------------------------------------------------------------------------------*/ /* Address Match Interrupt Register 1 */ #define RMAD1 (*(volatile union register32_t *)(0x0214)) /*--------------------------------------------------------------------------------*/ /* Address Match Interrupt Register 2 */ #define RMAD2 (*(volatile union register32_t *)(0x0218)) /*--------------------------------------------------------------------------------*/ /* Address Match Interrupt Register 3 */ #define RMAD3 (*(volatile union register32_t *)(0x021C)) /*--------------------------------------------------------------------------------*/ /* Flash Memory Control Register 0 */ union fmr0_t { struct { unsigned char FMR00 :1; unsigned char FMR01 :1; unsigned char FMR02 :1; unsigned char FMSTP :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char FMR06 :1; unsigned char FMR07 :1; } BIT; unsigned char BYTE; }; #define FMR0 (*(volatile union fmr0_t *)(0x0220)) /*--------------------------------------------------------------------------------*/ /* Flash Memory Control Register 1 */ union fmr1_t { struct { unsigned char bit0 :1; unsigned char FMR11 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char FMR16 :1; unsigned char FMR17 :1; } BIT; unsigned char BYTE; }; #define FMR1 (*(volatile union fmr1_t *)(0x0221)) /*--------------------------------------------------------------------------------*/ /* Flash Memory Control Register 2 */ union fmr2_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char FMR22 :1; unsigned char FMR23 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define FMR2 (*(volatile union fmr2_t *)(0x0222)) /*--------------------------------------------------------------------------------*/ /* Flash Memory Control Register 6 */ union fmr6_t { struct { unsigned char FMR60 :1; unsigned char FMR61 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define FMR6 (*(volatile union fmr6_t *)(0x0230)) /*--------------------------------------------------------------------------------*/ /* UART0 Special Mode Register 4 */ union u0smr4_t { struct { unsigned char STAREQ :1; unsigned char RSTAREQ :1; unsigned char STPREQ :1; unsigned char STSPSEL :1; unsigned char ACKD :1; unsigned char ACKC :1; unsigned char SCLHI :1; unsigned char SWC9 :1; } BIT; unsigned char BYTE; }; #define U0SMR4 (*(volatile union u0smr4_t *)(0x0244)) /*--------------------------------------------------------------------------------*/ /* UART0 Special Mode Register 3 */ union u0smr3_t { struct { unsigned char bit0 :1; unsigned char CKPH :1; unsigned char bit2 :1; unsigned char NODC :1; unsigned char bit4 :1; unsigned char DL0 :1; unsigned char DL1 :1; unsigned char DL2 :1; } BIT; unsigned char BYTE; }; #define U0SMR3 (*(volatile union u0smr3_t *)(0x0245)) /*--------------------------------------------------------------------------------*/ /* UART0 Special Mode Register 2 */ union u0smr2_t { struct { unsigned char IICM2 :1; unsigned char CSC :1; unsigned char SWC :1; unsigned char ALS :1; unsigned char STAC :1; unsigned char SWC2 :1; unsigned char SDHI :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define U0SMR2 (*(volatile union u0smr2_t *)(0x0246)) /*--------------------------------------------------------------------------------*/ /* UART0 Special Mode Register */ union u0smr_t { struct { unsigned char IICM :1; unsigned char ABC :1; unsigned char BBS :1; unsigned char bit3 :1; unsigned char ABSCS :1; unsigned char ACSE :1; unsigned char SSS :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define U0SMR (*(volatile union u0smr_t *)(0x0247)) /*--------------------------------------------------------------------------------*/ /* UART0 Transmit/Receive Mode Register */ union u0mr_t { struct { unsigned char SMD0 :1; unsigned char SMD1 :1; unsigned char SMD2 :1; unsigned char CKDIR :1; unsigned char STPS :1; unsigned char PRY :1; unsigned char PRYE :1; unsigned char IOPOL :1; } BIT; unsigned char BYTE; }; #define U0MR (*(volatile union u0mr_t *)(0x0248)) /*--------------------------------------------------------------------------------*/ /* UART0 Bit Rate Register */ #define U0BRG (*(volatile unsigned char *)(0x0249)) /*--------------------------------------------------------------------------------*/ /* UART0 Transmit Buffer Register */ union st_u0tb { /* UART0 Transmit buffer register 16 bit ; Use "MOV" instruction when writing to this register. */ struct{ unsigned char U0TBL; /* UART0 Transmit buffer register low 8 bit */ unsigned char U0TBH; /* UART0 Transmit buffer register high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; #define U0TB (*(volatile union st_u0tb *)(0x024A)) /*--------------------------------------------------------------------------------*/ /* UART0 Transmit/Receive Control Register 0 */ union u0c0_t { struct { unsigned char CLK0 :1; unsigned char CLK1 :1; unsigned char CRS :1; unsigned char TXEPT :1; unsigned char CRD :1; unsigned char NCH :1; unsigned char CKPOL :1; unsigned char UFORM :1; } BIT; unsigned char BYTE; }; #define U0C0 (*(volatile union u0c0_t *)(0x024C)) /*--------------------------------------------------------------------------------*/ /* UART0 Transmit/Receive Control Register 1 */ union u0c1_t { struct { unsigned char TE :1; unsigned char TI :1; unsigned char RE :1; unsigned char RI :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char U0LCH :1; unsigned char U0ERE :1; } BIT; unsigned char BYTE; }; #define U0C1 (*(volatile union u0c1_t *)(0x024D)) /*--------------------------------------------------------------------------------*/ /* UART0 Receive Buffer Register */ union u0rb_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; unsigned char bit8 :1; unsigned char bit9 :1; unsigned char bit10 :1; unsigned char ABT :1; unsigned char OER :1; unsigned char FER :1; unsigned char PER :1; unsigned char SUM :1; } BIT; struct { unsigned char BYTE0; unsigned char BYTE1; } BYTES; struct { unsigned char U0RBL; unsigned char U0RBH; } BYTE; unsigned short WORD; }; #define U0RB (*(volatile union u0rb_t *)(0x024E)) /*--------------------------------------------------------------------------------*/ /* UART Transmit/Receive Control Register 2 */ union ucon_t { struct { unsigned char U0IRS :1; unsigned char U1IRS :1; unsigned char U0RRM :1; unsigned char U1RRM :1; unsigned char CLKMD0 :1; unsigned char CLKMD1 :1; unsigned char RCSP :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define UCON (*(volatile union ucon_t *)(0x0250)) /*--------------------------------------------------------------------------------*/ /* UART Clock Select Register */ union uclksel0_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char OCOSEL0 :1; unsigned char OCOSEL1 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define UCLKSEL0 (*(volatile union uclksel0_t *)(0x0252)) /*--------------------------------------------------------------------------------*/ /* UART1 Special Mode Register 4 */ union u1smr4_t { struct { unsigned char STAREQ :1; unsigned char RSTAREQ :1; unsigned char STPREQ :1; unsigned char STSPSEL :1; unsigned char ACKD :1; unsigned char ACKC :1; unsigned char SCLHI :1; unsigned char SWC9 :1; } BIT; unsigned char BYTE; }; #define U1SMR4 (*(volatile union u1smr4_t *)(0x0254)) /*--------------------------------------------------------------------------------*/ /* UART1 Special Mode Register 3 */ union u1smr3_t { struct { unsigned char bit0 :1; unsigned char CKPH :1; unsigned char bit2 :1; unsigned char NODC :1; unsigned char bit4 :1; unsigned char DL0 :1; unsigned char DL1 :1; unsigned char DL2 :1; } BIT; unsigned char BYTE; }; #define U1SMR3 (*(volatile union u1smr3_t *)(0x0255)) /*--------------------------------------------------------------------------------*/ /* UART1 Special Mode Register 2 */ union u1smr2_t { struct { unsigned char IICM2 :1; unsigned char CSC :1; unsigned char SWC :1; unsigned char ALS :1; unsigned char STAC :1; unsigned char SWC2 :1; unsigned char SDHI :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define U1SMR2 (*(volatile union u1smr2_t *)(0x0256)) /*--------------------------------------------------------------------------------*/ /* UART1 Special Mode Register */ union u1smr_t { struct { unsigned char IICM :1; unsigned char ABC :1; unsigned char BBS :1; unsigned char bit3 :1; unsigned char ABSCS :1; unsigned char ACSE :1; unsigned char SSS :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define U1SMR (*(volatile union u1smr_t *)(0x0257)) /*--------------------------------------------------------------------------------*/ /* UART1 Transmit/Receive Mode Register */ union u1mr_t { struct { unsigned char SMD0 :1; unsigned char SMD1 :1; unsigned char SMD2 :1; unsigned char CKDIR :1; unsigned char STPS :1; unsigned char PRY :1; unsigned char PRYE :1; unsigned char IOPOL :1; } BIT; unsigned char BYTE; }; #define U1MR (*(volatile union u1mr_t *)(0x0258)) /*--------------------------------------------------------------------------------*/ /* UART1 Bit Rate Register */ #define U1BRG (*(volatile unsigned char *)(0x0259)) /*--------------------------------------------------------------------------------*/ /* UART1 Transmit Buffer Register */ union st_u1tb { /* UART1 Transmit buffer register 16 bit ; Use "MOV" instruction when writing to this register. */ struct{ unsigned char U1TBL; /* UART1 Transmit buffer register low 8 bit */ unsigned char U1TBH; /* UART1 Transmit buffer register high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; #define U1TB (*(volatile union st_u1tb *)(0x025A)) /*--------------------------------------------------------------------------------*/ /* UART1 Transmit/Receive Control Register 0 */ union u1c0_t { struct { unsigned char CLK0 :1; unsigned char CLK1 :1; unsigned char CRS :1; unsigned char TXEPT :1; unsigned char CRD :1; unsigned char NCH :1; unsigned char CKPOL :1; unsigned char UFORM :1; } BIT; unsigned char BYTE; }; #define U1C0 (*(volatile union u1c0_t *)(0x025C)) /*--------------------------------------------------------------------------------*/ /* UART1 Transmit/Receive Control Register 1 */ union u1c1_t { struct { unsigned char TE :1; unsigned char TI :1; unsigned char RE :1; unsigned char RI :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char U1LCH :1; unsigned char U1ERE :1; } BIT; unsigned char BYTE; }; #define U1C1 (*(volatile union u1c1_t *)(0x025D)) /*--------------------------------------------------------------------------------*/ /* UART1 Receive Buffer Register */ union u1rb_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; unsigned char bit8 :1; unsigned char bit9 :1; unsigned char bit10 :1; unsigned char ABT :1; unsigned char OER :1; unsigned char FER :1; unsigned char PER :1; unsigned char SUM :1; } BIT; struct { unsigned char BYTE0; unsigned char BYTE1; } BYTES; struct { unsigned char U1RBL; unsigned char U1RBH; } BYTE; unsigned short WORD; }; #define U1RB (*(volatile union u1rb_t *)(0x025E)) /*--------------------------------------------------------------------------------*/ /* UART2 Special Mode Register 4 */ union u2smr4_t { struct { unsigned char STAREQ :1; unsigned char RSTAREQ :1; unsigned char STPREQ :1; unsigned char STSPSEL :1; unsigned char ACKD :1; unsigned char ACKC :1; unsigned char SCLHI :1; unsigned char SWC9 :1; } BIT; unsigned char BYTE; }; #define U2SMR4 (*(volatile union u2smr4_t *)(0x0264)) /*--------------------------------------------------------------------------------*/ /* UART2 Special Mode Register 3 */ union u2smr3_t { struct { unsigned char bit0 :1; unsigned char CKPH :1; unsigned char bit2 :1; unsigned char NODC :1; unsigned char bit4 :1; unsigned char DL0 :1; unsigned char DL1 :1; unsigned char DL2 :1; } BIT; unsigned char BYTE; }; #define U2SMR3 (*(volatile union u2smr3_t *)(0x0265)) /*--------------------------------------------------------------------------------*/ /* UART2 Special Mode Register 2 */ union u2smr2_t { struct { unsigned char IICM2 :1; unsigned char CSC :1; unsigned char SWC :1; unsigned char ALS :1; unsigned char STAC :1; unsigned char SWC2 :1; unsigned char SDHI :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define U2SMR2 (*(volatile union u2smr2_t *)(0x0266)) /*--------------------------------------------------------------------------------*/ /* UART2 Special Mode Register */ union u2smr_t { struct { unsigned char IICM :1; unsigned char ABC :1; unsigned char BBS :1; unsigned char bit3 :1; unsigned char ABSCS :1; unsigned char ACSE :1; unsigned char SSS :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define U2SMR (*(volatile union u2smr_t *)(0x0267)) /*--------------------------------------------------------------------------------*/ /* UART2 Transmit/Receive Mode Register */ union u2mr_t { struct { unsigned char SMD0 :1; unsigned char SMD1 :1; unsigned char SMD2 :1; unsigned char CKDIR :1; unsigned char STPS :1; unsigned char PRY :1; unsigned char PRYE :1; unsigned char IOPOL :1; } BIT; unsigned char BYTE; }; #define U2MR (*(volatile union u2mr_t *)(0x0268)) /*--------------------------------------------------------------------------------*/ /* UART2 Bit Rate Register */ #define U2BRG (*(volatile unsigned char *)(0x0269)) /*--------------------------------------------------------------------------------*/ /* UART2 Transmit Buffer Register */ union st_u2tb { /* UART2 Transmit buffer register 16 bit ; Use "MOV" instruction when writing to this register. */ struct{ unsigned char U2TBL; /* UART2 Transmit buffer register low 8 bit */ unsigned char U2TBH; /* UART2 Transmit buffer register high 8 bit */ } BYTE; /* Byte access */ unsigned short WORD; /* Word Access */ }; #define U2TB (*(volatile union st_u2tb *)(0x026A)) /*--------------------------------------------------------------------------------*/ /* UART2 Transmit/Receive Control Register 0 */ union u2c0_t { struct { unsigned char CLK0 :1; unsigned char CLK1 :1; unsigned char CRS :1; unsigned char TXEPT :1; unsigned char CRD :1; unsigned char NCH :1; unsigned char CKPOL :1; unsigned char UFORM :1; } BIT; unsigned char BYTE; }; #define U2C0 (*(volatile union u2c0_t *)(0x026C)) /*--------------------------------------------------------------------------------*/ /* UART2 Transmit/Receive Control Register 1 */ union u2c1_t { struct { unsigned char TE_U2C1 :1; unsigned char TI_U2C1 :1; unsigned char RE_U2C1 :1; unsigned char RI_U2C1 :1; unsigned char U2IRS :1; unsigned char U2RRM :1; unsigned char U2LCH :1; unsigned char U2ERE :1; } BIT; unsigned char BYTE; }; #define U2C1 (*(volatile union u2c1_t *)(0x026D)) /*--------------------------------------------------------------------------------*/ /* UART2 Receive Buffer Register */ union u2rb_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; unsigned char bit8 :1; unsigned char bit9 :1; unsigned char bit10 :1; unsigned char ABT :1; unsigned char OER :1; unsigned char FER :1; unsigned char PER :1; unsigned char SUM :1; } BIT; struct { unsigned char BYTE0; unsigned char BYTE1; } BYTES; struct { unsigned char U2RBL; unsigned char U2RBH; } BYTE; unsigned short WORD; }; #define U2RB (*(volatile union u2rb_t *)(0x026E)) /*--------------------------------------------------------------------------------*/ /* SI/O3 Transmit/Receive Register */ #define S3TRR (*(volatile union register8_t *)(0x0270)) /*--------------------------------------------------------------------------------*/ /* SI/O3 Control Register */ union s3c_t { struct { unsigned char SM30 :1; unsigned char SM31 :1; unsigned char SM32 :1; unsigned char SM33 :1; unsigned char SM34 :1; unsigned char SM35 :1; unsigned char SM36 :1; unsigned char SM37 :1; } BIT; unsigned char BYTE; }; #define S3C (*(volatile union s3c_t *)(0x0272)) /*--------------------------------------------------------------------------------*/ /* SI/O3 Bit Rate Register */ #define S3BRG (*(volatile union register8_t *)(0x0273)) /*--------------------------------------------------------------------------------*/ /* SI/O4 Transmit/Receive Register */ #define S4TRR (*(volatile union register8_t *)(0x0274)) /*--------------------------------------------------------------------------------*/ /* SI/O4 Control Register */ union s4c_t { struct { unsigned char SM40 :1; unsigned char SM41 :1; unsigned char SM42 :1; unsigned char SM43 :1; unsigned char SM44 :1; unsigned char SM45 :1; unsigned char SM46 :1; unsigned char SM47 :1; } BIT; unsigned char BYTE; }; #define S4C (*(volatile union s4c_t *)(0x0276)) /*--------------------------------------------------------------------------------*/ /* SI/O4 Bit Rate Register */ #define S4BRG (*(volatile union register8_t *)(0x0277)) /*--------------------------------------------------------------------------------*/ /* SI/O3,4 Control Register 2 */ union s34c2_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char SM22 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char SM26 :1; unsigned char SM27 :1; } BIT; unsigned char BYTE; }; #define S34C2 (*(volatile union s34c2_t *)(0x0278)) /*--------------------------------------------------------------------------------*/ /* UART5 Special Mode Register 4 */ union u5smr4_t { struct { unsigned char STAREQ :1; unsigned char RSTAREQ :1; unsigned char STPREQ :1; unsigned char STSPSEL :1; unsigned char ACKD :1; unsigned char ACKC :1; unsigned char SCLHI :1; unsigned char SWC9 :1; } BIT; unsigned char BYTE; }; #define U5SMR4 (*(volatile union u5smr4_t *)(0x0284)) /*--------------------------------------------------------------------------------*/ /* UART5 Special Mode Register 3 */ union u5smr3_t { struct { unsigned char bit0 :1; unsigned char CKPH :1; unsigned char bit2 :1; unsigned char NODC :1; unsigned char bit4 :1; unsigned char DL0 :1; unsigned char DL1 :1; unsigned char DL2 :1; } BIT; unsigned char BYTE; }; #define U5SMR3 (*(volatile union u5smr3_t *)(0x0285)) /*--------------------------------------------------------------------------------*/ /* UART5 Special Mode Register 2 */ union u5smr2_t { struct { unsigned char IICM2 :1; unsigned char CSC :1; unsigned char SWC :1; unsigned char ALS :1; unsigned char STAC :1; unsigned char SWC2 :1; unsigned char SDHI :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define U5SMR2 (*(volatile union u5smr2_t *)(0x0286)) /*--------------------------------------------------------------------------------*/ /* UART5 Special Mode Register */ union u5smr_t { struct { unsigned char IICM :1; unsigned char ABC :1; unsigned char BBS :1; unsigned char bit3 :1; unsigned char ABSCS :1; unsigned char ACSE :1; unsigned char SSS :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define U5SMR (*(volatile union u5smr_t *)(0x0287)) /*--------------------------------------------------------------------------------*/ /* UART5 Transmit/Receive Mode Register */ union u5mr_t { struct { unsigned char SMD0 :1; unsigned char SMD1 :1; unsigned char SMD2 :1; unsigned char CKDIR :1; unsigned char STPS :1; unsigned char PRY :1; unsigned char PRYE :1; unsigned char IOPOL :1; } BIT; unsigned char BYTE; }; #define U5MR (*(volatile union u5mr_t *)(0x0288)) /*--------------------------------------------------------------------------------*/ /* UART5 Bit Rate Register */ #define U5BRG (*(volatile union register8_t *)(0x0289)) /*--------------------------------------------------------------------------------*/ /* UART5 Transmit Buffer Register */ #define U5TB (*(volatile union register16_t *)(0x028A)) /*--------------------------------------------------------------------------------*/ /* UART5 Transmit/Receive Control Register 0 */ union u5c0_t { struct { unsigned char CLK0 :1; unsigned char CLK1 :1; unsigned char CRS :1; unsigned char TXEPT :1; unsigned char CRD :1; unsigned char NCH :1; unsigned char CKPOL :1; unsigned char UFORM :1; } BIT; unsigned char BYTE; }; #define U5C0 (*(volatile union u5c0_t *)(0x028C)) /*--------------------------------------------------------------------------------*/ /* UART5 Transmit/Receive Control Register 1 */ union u5c1_t { struct { unsigned char TE :1; unsigned char TI :1; unsigned char RE :1; unsigned char RI :1; unsigned char U5IRS :1; unsigned char U5RRM :1; unsigned char U5LCH :1; unsigned char U5ERE :1; } BIT; unsigned char BYTE; }; #define U5C1 (*(volatile union u5c1_t *)(0x028D)) /*--------------------------------------------------------------------------------*/ /* UART5 Receive Buffer Register */ union u5rb_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; unsigned char bit8 :1; unsigned char bit9 :1; unsigned char bit10 :1; unsigned char ABT :1; unsigned char OER :1; unsigned char FER :1; unsigned char PER :1; unsigned char SUM :1; } BIT; struct { unsigned char BYTE0; unsigned char BYTE1; } BYTES; unsigned short WORD; }; #define U5RB (*(volatile union u5rb_t *)(0x028E)) /*--------------------------------------------------------------------------------*/ /* UART6 Special Mode Register 4 */ union u6smr4_t { struct { unsigned char STAREQ :1; unsigned char RSTAREQ :1; unsigned char STPREQ :1; unsigned char STSPSEL :1; unsigned char ACKD :1; unsigned char ACKC :1; unsigned char SCLHI :1; unsigned char SWC9 :1; } BIT; unsigned char BYTE; }; #define U6SMR4 (*(volatile union u6smr4_t *)(0x0294)) /*--------------------------------------------------------------------------------*/ /* UART6 Special Mode Register 3 */ union u6smr3_t { struct { unsigned char bit0 :1; unsigned char CKPH :1; unsigned char bit2 :1; unsigned char NODC :1; unsigned char bit4 :1; unsigned char DL0 :1; unsigned char DL1 :1; unsigned char DL2 :1; } BIT; unsigned char BYTE; }; #define U6SMR3 (*(volatile union u6smr3_t *)(0x0295)) /*--------------------------------------------------------------------------------*/ /* UART6 Special Mode Register 2 */ union u6smr2_t { struct { unsigned char IICM2 :1; unsigned char CSC :1; unsigned char SWC :1; unsigned char ALS :1; unsigned char STAC :1; unsigned char SWC2 :1; unsigned char SDHI :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define U6SMR2 (*(volatile union u6smr2_t *)(0x0296)) /*--------------------------------------------------------------------------------*/ /* UART6 Special Mode Register */ union u6smr_t { struct { unsigned char IICM :1; unsigned char ABC :1; unsigned char BBS :1; unsigned char bit3 :1; unsigned char ABSCS :1; unsigned char ACSE :1; unsigned char SSS :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define U6SMR (*(volatile union u6smr_t *)(0x0297)) /*--------------------------------------------------------------------------------*/ /* UART6 Transmit/Receive Mode Register */ union u6mr_t { struct { unsigned char SMD0 :1; unsigned char SMD1 :1; unsigned char SMD2 :1; unsigned char CKDIR :1; unsigned char STPS :1; unsigned char PRY :1; unsigned char PRYE :1; unsigned char IOPOL :1; } BIT; unsigned char BYTE; }; #define U6MR (*(volatile union u6mr_t *)(0x0298)) /*--------------------------------------------------------------------------------*/ /* UART6 Bit Rate Register */ #define U6BRG (*(volatile union register8_t *)(0x0299)) /*--------------------------------------------------------------------------------*/ /* UART6 Transmit Buffer Register */ #define U6TB (*(volatile union register16_t *)(0x029A)) /*--------------------------------------------------------------------------------*/ /* UART6 Transmit/Receive Control Register 0 */ union u6c0_t { struct { unsigned char CLK0 :1; unsigned char CLK1 :1; unsigned char CRS :1; unsigned char TXEPT :1; unsigned char CRD :1; unsigned char NCH :1; unsigned char CKPOL :1; unsigned char UFORM :1; } BIT; unsigned char BYTE; }; #define U6C0 (*(volatile union u6c0_t *)(0x029C)) /*--------------------------------------------------------------------------------*/ /* UART6 Transmit/Receive Control Register 1 */ union u6c1_t { struct { unsigned char TE :1; unsigned char TI :1; unsigned char RE :1; unsigned char RI :1; unsigned char U6IRS :1; unsigned char U6RRM :1; unsigned char U6LCH :1; unsigned char U6ERE :1; } BIT; unsigned char BYTE; }; #define U6C1 (*(volatile union u6c1_t *)(0x029D)) /*--------------------------------------------------------------------------------*/ /* UART6 Receive Buffer Register */ union u6rb_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; unsigned char bit8 :1; unsigned char bit9 :1; unsigned char bit10 :1; unsigned char ABT :1; unsigned char OER :1; unsigned char FER :1; unsigned char PER :1; unsigned char SUM :1; } BIT; struct { unsigned char BYTE0; unsigned char BYTE1; } BYTES; unsigned short WORD; }; #define U6RB (*(volatile union u6rb_t *)(0x029E)) /*--------------------------------------------------------------------------------*/ /* UART7 Special Mode Register 4 */ union u7smr4_t { struct { unsigned char STAREQ :1; unsigned char RSTAREQ :1; unsigned char STPREQ :1; unsigned char STSPSEL :1; unsigned char ACKD :1; unsigned char ACKC :1; unsigned char SCLHI :1; unsigned char SWC9 :1; } BIT; unsigned char BYTE; }; #define U7SMR4 (*(volatile union u7smr4_t *)(0x02A4)) /*--------------------------------------------------------------------------------*/ /* UART7 Special Mode Register 3 */ union u7smr3_t { struct { unsigned char bit0 :1; unsigned char CKPH :1; unsigned char bit2 :1; unsigned char NODC :1; unsigned char bit4 :1; unsigned char DL0 :1; unsigned char DL1 :1; unsigned char DL2 :1; } BIT; unsigned char BYTE; }; #define U7SMR3 (*(volatile union u7smr3_t *)(0x02A5)) /*--------------------------------------------------------------------------------*/ /* UART7 Special Mode Register 2 */ union u7smr2_t { struct { unsigned char IICM2 :1; unsigned char CSC :1; unsigned char SWC :1; unsigned char ALS :1; unsigned char STAC :1; unsigned char SWC2 :1; unsigned char SDHI :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define U7SMR2 (*(volatile union u7smr2_t *)(0x02A6)) /*--------------------------------------------------------------------------------*/ /* UART7 Special Mode Register */ union u7smr_t { struct { unsigned char IICM :1; unsigned char ABC :1; unsigned char BBS :1; unsigned char bit3 :1; unsigned char ABSCS :1; unsigned char ACSE :1; unsigned char SSS :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define U7SMR (*(volatile union u7smr_t *)(0x02A7)) /*--------------------------------------------------------------------------------*/ /* UART7 Transmit/Receive Mode Register */ union u7mr_t { struct { unsigned char SMD0 :1; unsigned char SMD1 :1; unsigned char SMD2 :1; unsigned char CKDIR :1; unsigned char STPS :1; unsigned char PRY :1; unsigned char PRYE :1; unsigned char IOPOL :1; } BIT; unsigned char BYTE; }; #define U7MR (*(volatile union u7mr_t *)(0x02A8)) /*--------------------------------------------------------------------------------*/ /* UART7 Bit Rate Register */ #define U7BRG (*(volatile union register8_t *)(0x02A9)) /*--------------------------------------------------------------------------------*/ /* UART7 Transmit Buffer Register */ #define U7TB (*(volatile union register16_t *)(0x02AA)) /*--------------------------------------------------------------------------------*/ /* UART7 Transmit/Receive Control Register 0 */ union u7c0_t { struct { unsigned char CLK0 :1; unsigned char CLK1 :1; unsigned char CRS :1; unsigned char TXEPT :1; unsigned char CRD :1; unsigned char NCH :1; unsigned char CKPOL :1; unsigned char UFORM :1; } BIT; unsigned char BYTE; }; #define U7C0 (*(volatile union u7c0_t *)(0x02AC)) /*--------------------------------------------------------------------------------*/ /* UART7 Transmit/Receive Control Register 1 */ union u7c1_t { struct { unsigned char TE :1; unsigned char TI :1; unsigned char RE :1; unsigned char RI :1; unsigned char U7IRS :1; unsigned char U7RRM :1; unsigned char U7LCH :1; unsigned char U7ERE :1; } BIT; unsigned char BYTE; }; #define U7C1 (*(volatile union u7c1_t *)(0x02AD)) /*--------------------------------------------------------------------------------*/ /* UART7 Receive Buffer Register */ union u7rb_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; unsigned char bit8 :1; unsigned char bit9 :1; unsigned char bit10 :1; unsigned char ABT :1; unsigned char OER :1; unsigned char FER :1; unsigned char PER :1; unsigned char SUM :1; } BIT; struct { unsigned char BYTE0; unsigned char BYTE1; } BYTES; unsigned short WORD; }; #define U7RB (*(volatile union u7rb_t *)(0x02AE)) /*--------------------------------------------------------------------------------*/ /* I2C0 Data Shift Register */ #define S00 (*(volatile union register8_t *)(0x02B0)) /*--------------------------------------------------------------------------------*/ /* I2C0 Address Register 0 */ union s0d0_t { struct { unsigned char bit0 :1; unsigned char SAD0 :1; unsigned char SAD1 :1; unsigned char SAD2 :1; unsigned char SAD3 :1; unsigned char SAD4 :1; unsigned char SAD5 :1; unsigned char SAD6 :1; } BIT; unsigned char BYTE; }; #define S0D0 (*(volatile union s0d0_t *)(0x02B2)) /*--------------------------------------------------------------------------------*/ /* I2C0 Control Register 0 */ union s1d0_t { struct { unsigned char BC0 :1; unsigned char BC1 :1; unsigned char BC2 :1; unsigned char ES0 :1; unsigned char ALS :1; unsigned char bit5 :1; unsigned char IHR :1; unsigned char TISS :1; } BIT; unsigned char BYTE; }; #define S1D0 (*(volatile union s1d0_t *)(0x02B3)) /*--------------------------------------------------------------------------------*/ /* I2C0 Clock Control Register */ union s20_t { struct { unsigned char CCR0 :1; unsigned char CCR1 :1; unsigned char CCR2 :1; unsigned char CCR3 :1; unsigned char CCR4 :1; unsigned char FASTMODE :1; unsigned char ACKBIT :1; unsigned char ACKCLK :1; } BIT; unsigned char BYTE; }; #define S20 (*(volatile union s20_t *)(0x02B4)) /*--------------------------------------------------------------------------------*/ /* I2C0 Start/Stop Condition Control Register */ union s2d0_t { struct { unsigned char SSC0 :1; unsigned char SSC1 :1; unsigned char SSC2 :1; unsigned char SSC3 :1; unsigned char SSC4 :1; unsigned char SIP :1; unsigned char SIS :1; unsigned char STSPSEL :1; } BIT; unsigned char BYTE; }; #define S2D0 (*(volatile union s2d0_t *)(0x02B5)) /*--------------------------------------------------------------------------------*/ /* I2C0 Control Register 1 */ union s3d0_t { struct { unsigned char SIM :1; unsigned char WIT :1; unsigned char PED :1; unsigned char PEC :1; unsigned char SDAM :1; unsigned char SCLM :1; unsigned char ICK0 :1; unsigned char ICK1 :1; } BIT; unsigned char BYTE; }; #define S3D0 (*(volatile union s3d0_t *)(0x02B6)) /*--------------------------------------------------------------------------------*/ /* I2C0 Control Register 2 */ union s4d0_t { struct { unsigned char TOE :1; unsigned char TOF :1; unsigned char TOSEL :1; unsigned char ICK2 :1; unsigned char ICK3 :1; unsigned char ICK4 :1; unsigned char MSLAD :1; unsigned char SCPIN :1; } BIT; unsigned char BYTE; }; #define S4D0 (*(volatile union s4d0_t *)(0x02B7)) /*--------------------------------------------------------------------------------*/ /* I2C0 Status Register 0 */ union s10_t { struct { unsigned char LRB :1; unsigned char ADR0 :1; unsigned char AAS :1; unsigned char AL :1; unsigned char PIN :1; unsigned char BB :1; unsigned char TRX :1; unsigned char MST :1; } BIT; unsigned char BYTE; }; #define S10 (*(volatile union s10_t *)(0x02B8)) /*--------------------------------------------------------------------------------*/ /* I2C0 Status Register 1 */ union s11_t { struct { unsigned char AAS0 :1; unsigned char AAS1 :1; unsigned char AAS2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define S11 (*(volatile union s11_t *)(0x02B9)) /*--------------------------------------------------------------------------------*/ /* I2C0 Address Register 1 */ union s0d1_t { struct { unsigned char bit0 :1; unsigned char SAD0 :1; unsigned char SAD1 :1; unsigned char SAD2 :1; unsigned char SAD3 :1; unsigned char SAD4 :1; unsigned char SAD5 :1; unsigned char SAD6 :1; } BIT; unsigned char BYTE; }; #define S0D1 (*(volatile union s0d1_t *)(0x02BA)) /*--------------------------------------------------------------------------------*/ /* I2C0 Address Register 2 */ union s0d2_t { struct { unsigned char bit0 :1; unsigned char SAD0 :1; unsigned char SAD1 :1; unsigned char SAD2 :1; unsigned char SAD3 :1; unsigned char SAD4 :1; unsigned char SAD5 :1; unsigned char SAD6 :1; } BIT; unsigned char BYTE; }; #define S0D2 (*(volatile union s0d2_t *)(0x02BB)) /*--------------------------------------------------------------------------------*/ /* Timer B3/B4/B5 Count Start Flag */ union tbsr_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char TB3S :1; unsigned char TB4S :1; unsigned char TB5S :1; } BIT; unsigned char BYTE; }; #define TBSR (*(volatile union tbsr_t *)(0x0300)) /*--------------------------------------------------------------------------------*/ /* Timer A1-1 Register */ #define TA11 (*(volatile union register16_t *)(0x0302)) /*--------------------------------------------------------------------------------*/ /* Timer A2-1 Register */ #define TA21 (*(volatile union register16_t *)(0x0304)) /*--------------------------------------------------------------------------------*/ /* Timer A4-1 Register */ #define TA41 (*(volatile union register16_t *)(0x0306)) /*--------------------------------------------------------------------------------*/ /* Three-Phase PWM Control Register 0 */ union invc0_t { struct { unsigned char INV00 :1; unsigned char INV01 :1; unsigned char INV02 :1; unsigned char INV03 :1; unsigned char INV04 :1; unsigned char INV05 :1; unsigned char INV06 :1; unsigned char INV07 :1; } BIT; unsigned char BYTE; }; #define INVC0 (*(volatile union invc0_t *)(0x0308)) /*--------------------------------------------------------------------------------*/ /* Three-Phase PWM Control Register 1 */ union invc1_t { struct { unsigned char INV10 :1; unsigned char INV11 :1; unsigned char INV12 :1; unsigned char INV13 :1; unsigned char INV14 :1; unsigned char INV15 :1; unsigned char INV16 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define INVC1 (*(volatile union invc1_t *)(0x0309)) /*--------------------------------------------------------------------------------*/ /* Three-Phase Output Buffer Register 0 */ union idb0_t { struct { unsigned char DU0 :1; unsigned char DUB0 :1; unsigned char DV0 :1; unsigned char DVB0 :1; unsigned char DW0 :1; unsigned char DWB0 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define IDB0 (*(volatile union idb0_t *)(0x030A)) /*--------------------------------------------------------------------------------*/ /* Three-Phase Output Buffer Register 1 */ union idb1_t { struct { unsigned char DU1 :1; unsigned char DUB1 :1; unsigned char DV1 :1; unsigned char DVB1 :1; unsigned char DW1 :1; unsigned char DWB1 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define IDB1 (*(volatile union idb1_t *)(0x030B)) /*--------------------------------------------------------------------------------*/ /* Dead Time Timer */ #define DTT (*(volatile union register8_t *)(0x030C)) /*--------------------------------------------------------------------------------*/ /* Timer B2 Interrupt Generation Frequency Set Counter */ #define ICTB2 (*(volatile union register8_t *)(0x030D)) /*--------------------------------------------------------------------------------*/ /* Position-Data-Retain Function Control Register */ union pdrf_t { struct { unsigned char PDRW :1; unsigned char PDRV :1; unsigned char PDRU :1; unsigned char PDRT :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PDRF (*(volatile union pdrf_t *)(0x030E)) /*--------------------------------------------------------------------------------*/ /* Timer B3 Register */ #define TB3 (*(volatile union register16_t *)(0x0310)) /*--------------------------------------------------------------------------------*/ /* Timer B4 Register */ #define TB4 (*(volatile union register16_t *)(0x0312)) /*--------------------------------------------------------------------------------*/ /* Timer B5 Register */ #define TB5 (*(volatile union register16_t *)(0x0314)) /*--------------------------------------------------------------------------------*/ /* Port Function Control Register */ union pfcr_t { struct { unsigned char PFC0 :1; unsigned char PFC1 :1; unsigned char PFC2 :1; unsigned char PFC3 :1; unsigned char PFC4 :1; unsigned char PFC5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PFCR (*(volatile union pfcr_t *)(0x0318)) /*--------------------------------------------------------------------------------*/ /* Timer B3 Mode Register */ union tb3mr_t { struct { unsigned char TMOD0 :1; unsigned char TMOD1 :1; unsigned char MR0 :1; unsigned char MR1 :1; unsigned char bit4 :1; unsigned char MR3 :1; unsigned char TCK0 :1; unsigned char TCK1 :1; } BIT; unsigned char BYTE; }; #define TB3MR (*(volatile union tb3mr_t *)(0x031B)) /*--------------------------------------------------------------------------------*/ /* Timer B4 Mode Register */ union tb4mr_t { struct { unsigned char TMOD0 :1; unsigned char TMOD1 :1; unsigned char MR0 :1; unsigned char MR1 :1; unsigned char bit4 :1; unsigned char MR3 :1; unsigned char TCK0 :1; unsigned char TCK1 :1; } BIT; unsigned char BYTE; }; #define TB4MR (*(volatile union tb4mr_t *)(0x031C)) /*--------------------------------------------------------------------------------*/ /* Timer B5 Mode Register */ union tb5mr_t { struct { unsigned char TMOD0 :1; unsigned char TMOD1 :1; unsigned char MR0 :1; unsigned char MR1 :1; unsigned char bit4 :1; unsigned char MR3 :1; unsigned char TCK0 :1; unsigned char TCK1 :1; } BIT; unsigned char BYTE; }; #define TB5MR (*(volatile union tb5mr_t *)(0x031D)) /*--------------------------------------------------------------------------------*/ /* Count Start Flag */ union tabsr_t { struct { unsigned char TA0S :1; unsigned char TA1S :1; unsigned char TA2S :1; unsigned char TA3S :1; unsigned char TA4S :1; unsigned char TB0S :1; unsigned char TB1S :1; unsigned char TB2S :1; } BIT; unsigned char BYTE; }; #define TABSR (*(volatile union tabsr_t *)(0x0320)) /*--------------------------------------------------------------------------------*/ /* One-Shot Start Flag */ union onsf_t { struct { unsigned char TA0OS :1; unsigned char TA1OS :1; unsigned char TA2OS :1; unsigned char TA3OS :1; unsigned char TA4OS :1; unsigned char TAZIE :1; unsigned char TA0TGL :1; unsigned char TA0TGH :1; } BIT; unsigned char BYTE; }; #define ONSF (*(volatile union onsf_t *)(0x0322)) /*--------------------------------------------------------------------------------*/ /* Trigger Select Register */ union trgsr_t { struct { unsigned char TA1TGL :1; unsigned char TA1TGH :1; unsigned char TA2TGL :1; unsigned char TA2TGH :1; unsigned char TA3TGL :1; unsigned char TA3TGH :1; unsigned char TA4TGL :1; unsigned char TA4TGH :1; } BIT; unsigned char BYTE; }; #define TRGSR (*(volatile union trgsr_t *)(0x0323)) /*--------------------------------------------------------------------------------*/ /* Up/Down Flag */ union udf_t { struct { unsigned char TA0UD :1; unsigned char TA1UD :1; unsigned char TA2UD :1; unsigned char TA3UD :1; unsigned char TA4UD :1; unsigned char TA2P :1; unsigned char TA3P :1; unsigned char TA4P :1; } BIT; unsigned char BYTE; }; #define UDF (*(volatile unsigned char *)(0x0324)) /*--------------------------------------------------------------------------------*/ /* Timer A0 Register */ #define TA0 (*(volatile union register16_t *)(0x0326)) /*--------------------------------------------------------------------------------*/ /* Timer A1 Register */ #define TA1 (*(volatile union register16_t *)(0x0328)) /*--------------------------------------------------------------------------------*/ /* Timer A2 Register */ #define TA2 (*(volatile union register16_t *)(0x032A)) /*--------------------------------------------------------------------------------*/ /* Timer A3 Register */ #define TA3 (*(volatile union register16_t *)(0x032C)) /*--------------------------------------------------------------------------------*/ /* Timer A4 Register */ #define TA4 (*(volatile union register16_t *)(0x032E)) /*--------------------------------------------------------------------------------*/ /* Timer B0 Register */ #define TB0 (*(volatile union register16_t *)(0x0330)) /*--------------------------------------------------------------------------------*/ /* Timer B1 Register */ #define TB1 (*(volatile union register16_t *)(0x0332)) /*--------------------------------------------------------------------------------*/ /* Timer B2 Register */ #define TB2 (*(volatile union register16_t *)(0x0334)) /*--------------------------------------------------------------------------------*/ /* Timer A0 Mode Register */ union ta0mr_t { struct { unsigned char TMOD0 :1; unsigned char TMOD1 :1; unsigned char MR0 :1; unsigned char MR1 :1; unsigned char MR2 :1; unsigned char MR3 :1; unsigned char TCK0 :1; unsigned char TCK1 :1; } BIT; unsigned char BYTE; }; #define TA0MR (*(volatile union ta0mr_t *)(0x0336)) /*--------------------------------------------------------------------------------*/ /* Timer A1 Mode Register */ union ta1mr_t { struct { unsigned char TMOD0 :1; unsigned char TMOD1 :1; unsigned char MR0 :1; unsigned char MR1 :1; unsigned char MR2 :1; unsigned char MR3 :1; unsigned char TCK0 :1; unsigned char TCK1 :1; } BIT; unsigned char BYTE; }; #define TA1MR (*(volatile union ta1mr_t *)(0x0337)) /*--------------------------------------------------------------------------------*/ /* Timer A2 Mode Register */ union ta2mr_t { struct { unsigned char TMOD0 :1; unsigned char TMOD1 :1; unsigned char MR0 :1; unsigned char MR1 :1; unsigned char MR2 :1; unsigned char MR3 :1; unsigned char TCK0 :1; unsigned char TCK1 :1; } BIT; unsigned char BYTE; }; #define TA2MR (*(volatile union ta2mr_t *)(0x0338)) /*--------------------------------------------------------------------------------*/ /* Timer A3 Mode Register */ union ta3mr_t { struct { unsigned char TMOD0 :1; unsigned char TMOD1 :1; unsigned char MR0 :1; unsigned char MR1 :1; unsigned char MR2 :1; unsigned char MR3 :1; unsigned char TCK0 :1; unsigned char TCK1 :1; } BIT; unsigned char BYTE; }; #define TA3MR (*(volatile union ta3mr_t *)(0x0339)) /*--------------------------------------------------------------------------------*/ /* Timer A4 Mode Register */ union ta4mr_t { struct { unsigned char TMOD0 :1; unsigned char TMOD1 :1; unsigned char MR0 :1; unsigned char MR1 :1; unsigned char MR2 :1; unsigned char MR3 :1; unsigned char TCK0 :1; unsigned char TCK1 :1; } BIT; unsigned char BYTE; }; #define TA4MR (*(volatile union ta4mr_t *)(0x033A)) /*--------------------------------------------------------------------------------*/ /* Timer B0 Mode Register */ union tb0mr_t { struct { unsigned char TMOD0 :1; unsigned char TMOD1 :1; unsigned char MR0 :1; unsigned char MR1 :1; unsigned char bit4 :1; unsigned char MR3 :1; unsigned char TCK0 :1; unsigned char TCK1 :1; } BIT; unsigned char BYTE; }; #define TB0MR (*(volatile union tb0mr_t *)(0x033B)) /*--------------------------------------------------------------------------------*/ /* Timer B1 Mode Register */ union tb1mr_t { struct { unsigned char TMOD0 :1; unsigned char TMOD1 :1; unsigned char MR0 :1; unsigned char MR1 :1; unsigned char bit4 :1; unsigned char MR3 :1; unsigned char TCK0 :1; unsigned char TCK1 :1; } BIT; unsigned char BYTE; }; #define TB1MR (*(volatile union tb1mr_t *)(0x033C)) /*--------------------------------------------------------------------------------*/ /* Timer B2 Mode Register */ union tb2mr_t { struct { unsigned char TMOD0 :1; unsigned char TMOD1 :1; unsigned char MR0 :1; unsigned char MR1 :1; unsigned char bit4 :1; unsigned char MR3 :1; unsigned char TCK0 :1; unsigned char TCK1 :1; } BIT; unsigned char BYTE; }; #define TB2MR (*(volatile union tb2mr_t *)(0x033D)) /*--------------------------------------------------------------------------------*/ /* Timer B2 Special Mode Register */ union tb2sc_t { struct { unsigned char PWCON :1; unsigned char IVPCR1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define TB2SC (*(volatile union tb2sc_t *)(0x033E)) /*--------------------------------------------------------------------------------*/ /* Real-Time Clock Second Data Register */ union rtcsec_t { struct { unsigned char SC00 :1; unsigned char SC01 :1; unsigned char SC02 :1; unsigned char SC03 :1; unsigned char SC10 :1; unsigned char SC11 :1; unsigned char SC12 :1; unsigned char BSY :1; } BIT; unsigned char BYTE; }; #define RTCSEC (*(volatile union rtcsec_t *)(0x0340)) /*--------------------------------------------------------------------------------*/ /* Real-Time Clock Minute Data Register */ union rtcmin_t { struct { unsigned char MN00 :1; unsigned char MN01 :1; unsigned char MN02 :1; unsigned char MN03 :1; unsigned char MN10 :1; unsigned char MN11 :1; unsigned char MN12 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define RTCMIN (*(volatile union rtcmin_t *)(0x0341)) /*--------------------------------------------------------------------------------*/ /* Real-Time Clock Hour Data Register */ union rtchr_t { struct { unsigned char HR00 :1; unsigned char HR01 :1; unsigned char HR02 :1; unsigned char HR03 :1; unsigned char HR10 :1; unsigned char HR11 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define RTCHR (*(volatile union rtchr_t *)(0x0342)) /*--------------------------------------------------------------------------------*/ /* Real-Time Clock Day Data Register */ union rtcwk_t { struct { unsigned char WK0 :1; unsigned char WK1 :1; unsigned char WK2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define RTCWK (*(volatile union rtcwk_t *)(0x0343)) /*--------------------------------------------------------------------------------*/ /* Real-Time Clock Control Register 1 */ union rtccr1_t { struct { unsigned char bit0 :1; unsigned char TCSTF :1; unsigned char TOENA :1; unsigned char bit3 :1; unsigned char RTCRST :1; unsigned char RTCPM :1; unsigned char H12H24 :1; unsigned char TSTART :1; } BIT; unsigned char BYTE; }; #define RTCCR1 (*(volatile union rtccr1_t *)(0x0344)) /*--------------------------------------------------------------------------------*/ /* Real-Time Clock Control Register 2 */ union rtccr2_t { struct { unsigned char SEIE :1; unsigned char MNIE :1; unsigned char HRIE :1; unsigned char DYIE :1; unsigned char WKIE :1; unsigned char RTCCMP0 :1; unsigned char RTCCMP2 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define RTCCR2 (*(volatile union rtccr2_t *)(0x0345)) /*--------------------------------------------------------------------------------*/ /* Real-Time Clock Count Source Select Register */ union rtccsr_t { struct { unsigned char RCS0 :1; unsigned char RCS1 :1; unsigned char RCS2 :1; unsigned char RCS3 :1; unsigned char RCS4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define RTCCSR (*(volatile union rtccsr_t *)(0x0346)) /*--------------------------------------------------------------------------------*/ /* Real-Time Clock Second Compare Data Register */ union rtccsec_t { struct { unsigned char SCMP00 :1; unsigned char SCMP01 :1; unsigned char SCMP02 :1; unsigned char SCMP03 :1; unsigned char SCMP10 :1; unsigned char SCMP11 :1; unsigned char SCMP12 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define RTCCSEC (*(volatile union rtccsec_t *)(0x0348)) /*--------------------------------------------------------------------------------*/ /* Real-Time Clock Minute Compare Data Register */ union rtccmin_t { struct { unsigned char MCMP00 :1; unsigned char MCMP01 :1; unsigned char MCMP02 :1; unsigned char MCMP03 :1; unsigned char MCMP10 :1; unsigned char MCMP11 :1; unsigned char MCMP12 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define RTCCMIN (*(volatile union rtccmin_t *)(0x0349)) /*--------------------------------------------------------------------------------*/ /* Real-Time Clock Hour Compare Data Register */ union rtcchr_t { struct { unsigned char HCMP00 :1; unsigned char HCMP01 :1; unsigned char HCMP02 :1; unsigned char HCMP03 :1; unsigned char HCMP10 :1; unsigned char HCMP11 :1; unsigned char PMCMP :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define RTCCHR (*(volatile union rtcchr_t *)(0x034A)) /*--------------------------------------------------------------------------------*/ /* CEC Function Control Register 1 */ union cecc1_t { struct { unsigned char CECEN :1; unsigned char CCLK0 :1; unsigned char CCLK1 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define CECC1 (*(volatile union cecc1_t *)(0x0350)) /*--------------------------------------------------------------------------------*/ /* CEC Function Control Register 2 */ union cecc2_t { struct { unsigned char CRRNG :1; unsigned char CTNACK :1; unsigned char CTACKEN :1; unsigned char CRACK :1; unsigned char CTABTS :1; unsigned char CFIL :1; unsigned char CSTRRNG :1; unsigned char CDATRNG :1; } BIT; unsigned char BYTE; }; #define CECC2 (*(volatile union cecc2_t *)(0x0351)) /*--------------------------------------------------------------------------------*/ /* CEC Function Control Register 3 */ union cecc3_t { struct { unsigned char CTXDEN :1; unsigned char CRXDEN :1; unsigned char CREGCLR :1; unsigned char CEOMI :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define CECC3 (*(volatile union cecc3_t *)(0x0352)) /*--------------------------------------------------------------------------------*/ /* CEC Function Control Register 4 */ union cecc4_t { struct { unsigned char CRISE0 :1; unsigned char CRISE1 :1; unsigned char CRISE2 :1; unsigned char CABTEN :1; unsigned char CFALL0 :1; unsigned char CFALL1 :1; unsigned char CREGFLG :1; unsigned char CABTWEN :1; } BIT; unsigned char BYTE; }; #define CECC4 (*(volatile union cecc4_t *)(0x0353)) /*--------------------------------------------------------------------------------*/ /* CEC Flag Register */ union cecflg_t { struct { unsigned char CRFLG :1; unsigned char CTFLG :1; unsigned char CRERRFLG :1; unsigned char CTABTFLG :1; unsigned char CTNACKFLG :1; unsigned char CRD8FLG :1; unsigned char CTD8FLG :1; unsigned char CRSTFLG :1; } BIT; unsigned char BYTE; }; #define CECFLG (*(volatile union cecflg_t *)(0x0354)) /*--------------------------------------------------------------------------------*/ /* CEC Interrupt Source Select Register */ union cisel_t { struct { unsigned char CRISEL0 :1; unsigned char CRISEL1 :1; unsigned char CRISEL2 :1; unsigned char CRISELM :1; unsigned char CTISEL0 :1; unsigned char CTISEL1 :1; unsigned char CTISEL2 :1; unsigned char CRISELS :1; } BIT; unsigned char BYTE; }; #define CISEL (*(volatile union cisel_t *)(0x0355)) /*--------------------------------------------------------------------------------*/ /* CEC Transmit Buffer Register 1 */ #define CCTB1 (*(volatile union register8_t *)(0x0356)) /*--------------------------------------------------------------------------------*/ /* CEC Transmit Buffer Register 2 */ union cctb2_t { struct { unsigned char CCTBE :1; unsigned char CCTBA :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define CCTB2 (*(volatile union cctb2_t *)(0x0357)) /*--------------------------------------------------------------------------------*/ /* CEC Receive Buffer Register 1 */ #define CCRB1 (*(volatile union register8_t *)(0x0358)) /*--------------------------------------------------------------------------------*/ /* CEC Receive Buffer Register 2 */ union ccrb2_t { struct { unsigned char CCRBE :1; unsigned char CCRBAO :1; unsigned char CCRBAI :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define CCRB2 (*(volatile union ccrb2_t *)(0x0359)) /*--------------------------------------------------------------------------------*/ /* CEC Receive Follower Address Set Register 1 */ union cradri1_t { struct { unsigned char CRADRI10 :1; unsigned char CRADRI11 :1; unsigned char CRADRI12 :1; unsigned char CRADRI13 :1; unsigned char CRADRI14 :1; unsigned char CRADRI15 :1; unsigned char CRADRI16 :1; unsigned char CRADRI17 :1; } BIT; unsigned char BYTE; }; #define CRADRI1 (*(volatile union cradri1_t *)(0x035A)) /*--------------------------------------------------------------------------------*/ /* CEC Receive Follower Address Set Register 2 */ union cradri2_t { struct { unsigned char CRADRI20 :1; unsigned char CRADRI21 :1; unsigned char CRADRI22 :1; unsigned char CRADRI23 :1; unsigned char CRADRI24 :1; unsigned char CRADRI25 :1; unsigned char CRADRI26 :1; unsigned char CRADRI27 :1; } BIT; unsigned char BYTE; }; #define CRADRI2 (*(volatile union cradri2_t *)(0x035B)) /*--------------------------------------------------------------------------------*/ /* Pull-Up Control Register 0 */ union pur0_t { struct { unsigned char PU00 :1; unsigned char PU01 :1; unsigned char PU02 :1; unsigned char PU03 :1; unsigned char PU04 :1; unsigned char PU05 :1; unsigned char PU06 :1; unsigned char PU07 :1; } BIT; unsigned char BYTE; }; #define PUR0 (*(volatile union pur0_t *)(0x0360)) /*--------------------------------------------------------------------------------*/ /* Pull-Up Control Register 1 */ union pur1_t { struct { unsigned char PU10 :1; unsigned char PU11 :1; unsigned char PU12 :1; unsigned char PU13 :1; unsigned char PU14 :1; unsigned char PU15 :1; unsigned char PU16 :1; unsigned char PU17 :1; } BIT; unsigned char BYTE; }; #define PUR1 (*(volatile union pur1_t *)(0x0361)) /*--------------------------------------------------------------------------------*/ /* Pull-Up Control Register 2 */ union pur2_t { struct { unsigned char PU20 :1; unsigned char PU21 :1; unsigned char PU22 :1; unsigned char PU23 :1; unsigned char PU24 :1; unsigned char PU25 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PUR2 (*(volatile union pur2_t *)(0x0362)) /*--------------------------------------------------------------------------------*/ /* Pull-Up Control Register 3 */ union pur3_t { struct { unsigned char PU30 :1; unsigned char PU31 :1; unsigned char PU32 :1; unsigned char PU33 :1; unsigned char PU34 :1; unsigned char PU35 :1; unsigned char PU36 :1; unsigned char PU37 :1; } BIT; unsigned char BYTE; }; #define PUR3 (*(volatile union pur3_t *)(0x0363)) /*--------------------------------------------------------------------------------*/ /* Port Control Register */ union pcr_t { struct { unsigned char PCR0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char PCR4 :1; unsigned char PCR5 :1; unsigned char PCR6 :1; unsigned char PCR7 :1; } BIT; unsigned char BYTE; }; #define PCR (*(volatile union pcr_t *)(0x0366)) /*--------------------------------------------------------------------------------*/ /* NMI/SD Digital Filter Register */ union nmidf_t { struct { unsigned char NMIDF0 :1; unsigned char NMIDF1 :1; unsigned char NMIDF2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define NMIDF (*(volatile union nmidf_t *)(0x0369)) /*--------------------------------------------------------------------------------*/ /* PWM Control Register 0 */ union pwmcon0_t { struct { unsigned char PWMSEL0 :1; unsigned char PWMSEL1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char PWMCLK0 :1; unsigned char PWMCLK1 :1; } BIT; unsigned char BYTE; }; #define PWMCON0 (*(volatile union pwmcon0_t *)(0x0370)) /*--------------------------------------------------------------------------------*/ /* PWM0 Prescaler */ #define PWMPRE0 (*(volatile union register8_t *)(0x0372)) /*--------------------------------------------------------------------------------*/ /* PWM0 Register */ #define PWMREG0 (*(volatile union register8_t *)(0x0373)) /*--------------------------------------------------------------------------------*/ /* PWM1 Prescaler */ #define PWMPRE1 (*(volatile union register8_t *)(0x0374)) /*--------------------------------------------------------------------------------*/ /* PWM1 Register */ #define PWMREG1 (*(volatile union register8_t *)(0x0375)) /*--------------------------------------------------------------------------------*/ /* PWM Control Register 1 */ union pwmcon1_t { struct { unsigned char PWMEN0 :1; unsigned char PWMEN1 :1; unsigned char PWMPORT0 :1; unsigned char PWMPORT1 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PWMCON1 (*(volatile union pwmcon1_t *)(0x0376)) /*--------------------------------------------------------------------------------*/ /* Count Source Protection Mode Register */ union cspr_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char CSPRO :1; } BIT; unsigned char BYTE; }; #define CSPR (*(volatile union cspr_t *)(0x037C)) /*--------------------------------------------------------------------------------*/ /* Watchdog Timer Refresh Register */ #define WDTR (*(volatile union register8_t *)(0x037D)) /*--------------------------------------------------------------------------------*/ /* Watchdog Timer Start Register */ #define WDTS (*(volatile union register8_t *)(0x037E)) /*--------------------------------------------------------------------------------*/ /* Watchdog Timer Control Register */ union wdc_t { struct { unsigned char WDC0 :1; unsigned char WDC1 :1; unsigned char WDC2 :1; unsigned char WDC3 :1; unsigned char WDC4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char WDC7 :1; } BIT; unsigned char BYTE; }; #define WDC (*(volatile union wdc_t *)(0x037F)) /*--------------------------------------------------------------------------------*/ /* DMA2 Source Select Register */ union dm2sl_t { struct { unsigned char DSEL0 :1; unsigned char DSEL1 :1; unsigned char DSEL2 :1; unsigned char DSEL3 :1; unsigned char DSEL4 :1; unsigned char bit5 :1; unsigned char DMS :1; unsigned char DSR :1; } BIT; unsigned char BYTE; }; #define DM2SL (*(volatile union dm2sl_t *)(0x0390)) /*--------------------------------------------------------------------------------*/ /* DMA3 Source Select Register */ union dm3sl_t { struct { unsigned char DSEL0 :1; unsigned char DSEL1 :1; unsigned char DSEL2 :1; unsigned char DSEL3 :1; unsigned char DSEL4 :1; unsigned char bit5 :1; unsigned char DMS :1; unsigned char DSR :1; } BIT; unsigned char BYTE; }; #define DM3SL (*(volatile union dm3sl_t *)(0x0392)) /*--------------------------------------------------------------------------------*/ /* DMA0 Source Select Register */ union dm0sl_t { struct { unsigned char DSEL0 :1; unsigned char DSEL1 :1; unsigned char DSEL2 :1; unsigned char DSEL3 :1; unsigned char DSEL4 :1; unsigned char bit5 :1; unsigned char DMS :1; unsigned char DSR :1; } BIT; unsigned char BYTE; }; #define DM0SL (*(volatile union dm0sl_t *)(0x0398)) /*--------------------------------------------------------------------------------*/ /* DMA1 Source Select Register */ union dm1sl_t { struct { unsigned char DSEL0 :1; unsigned char DSEL1 :1; unsigned char DSEL2 :1; unsigned char DSEL3 :1; unsigned char DSEL4 :1; unsigned char bit5 :1; unsigned char DMS :1; unsigned char DSR :1; } BIT; unsigned char BYTE; }; #define DM1SL (*(volatile union dm1sl_t *)(0x039A)) /*--------------------------------------------------------------------------------*/ /* Open-Circuit Detection Assist Function Register */ union ainrst_t { struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char AINRST0 :1; unsigned char AINRST1 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define AINRST (*(volatile union ainrst_t *)(0x03A2)) /*--------------------------------------------------------------------------------*/ /* SFR Snoop Address Register */ union crcsar_t { struct { unsigned char CRCSAR0 :1; unsigned char CRCSAR1 :1; unsigned char CRCSAR2 :1; unsigned char CRCSAR3 :1; unsigned char CRCSAR4 :1; unsigned char CRCSAR5 :1; unsigned char CRCSAR6 :1; unsigned char CRCSAR7 :1; unsigned char CRCSAR8 :1; unsigned char CRCSAR9 :1; unsigned char bit10 :1; unsigned char bit11 :1; unsigned char bit12 :1; unsigned char bit13 :1; unsigned char CRCSR :1; unsigned char CRCSW :1; } BIT; struct { unsigned char BYTE0; unsigned char BYTE1; } BYTES; unsigned short WORD; }; #define CRCSAR (*(volatile union crcsar_t *)(0x03B4)) /*--------------------------------------------------------------------------------*/ /* CRC Data Register */ #define CRCD (*(volatile union register16_t *)(0x03BC)) /*--------------------------------------------------------------------------------*/ /* CRC Input Register */ #define CRCIN (*(volatile union register8_t *)(0x03BE)) /*--------------------------------------------------------------------------------*/ /* CRC Mode Register */ union crcmr_t { struct { unsigned char CRCPS :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char CRCMS :1; } BIT; unsigned char BYTE; }; #define CRCMR (*(volatile union crcmr_t *)(0x03B6)) /*--------------------------------------------------------------------------------*/ /* A/D Register 0 */ #define AD0 (*(volatile union register16_t *)(0x03C0)) /*--------------------------------------------------------------------------------*/ /* A/D Register 1 */ #define AD1 (*(volatile union register16_t *)(0x03C2)) /*--------------------------------------------------------------------------------*/ /* A/D Register 2 */ #define AD2 (*(volatile union register16_t *)(0x03C4)) /*--------------------------------------------------------------------------------*/ /* A/D Register 3 */ #define AD3 (*(volatile union register16_t *)(0x03C6)) /*--------------------------------------------------------------------------------*/ /* A/D Register 4 */ #define AD4 (*(volatile union register16_t *)(0x03C8)) /*--------------------------------------------------------------------------------*/ /* A/D Register 5 */ #define AD5 (*(volatile union register16_t *)(0x03CA)) /*--------------------------------------------------------------------------------*/ /* A/D Register 6 */ #define AD6 (*(volatile union register16_t *)(0x03CC)) /*--------------------------------------------------------------------------------*/ /* A/D Register 7 */ #define AD7 (*(volatile union register16_t *)(0x03CE)) /*--------------------------------------------------------------------------------*/ /* A/D Control Register 2 */ union adcon2_t { struct { unsigned char bit0 :1; unsigned char ADGSEL0 :1; unsigned char ADGSEL1 :1; unsigned char bit3 :1; unsigned char CKS2 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char CKS3 :1; } BIT; unsigned char BYTE; }; #define ADCON2 (*(volatile union adcon2_t *)(0x03D4)) /*--------------------------------------------------------------------------------*/ /* A/D Control Register 0 */ union adcon0_t { struct { unsigned char CH0 :1; unsigned char CH1 :1; unsigned char CH2 :1; unsigned char MD0 :1; unsigned char MD1 :1; unsigned char TRG :1; unsigned char ADST :1; unsigned char CKS0 :1; } BIT; unsigned char BYTE; }; #define ADCON0 (*(volatile union adcon0_t *)(0x03D6)) /*--------------------------------------------------------------------------------*/ /* A/D Control Register 1 */ union adcon1_t { struct { unsigned char SCAN0 :1; unsigned char SCAN1 :1; unsigned char MD2 :1; unsigned char bit3 :1; unsigned char CKS1 :1; unsigned char ADSTBY :1; unsigned char ADEX0 :1; unsigned char ADEX1 :1; } BIT; unsigned char BYTE; }; #define ADCON1 (*(volatile union adcon1_t *)(0x03D7)) /*--------------------------------------------------------------------------------*/ /* D/A0 Register */ #define DA0 (*(volatile union register8_t *)(0x03D8)) /*--------------------------------------------------------------------------------*/ /* D/A1 Register */ #define DA1 (*(volatile union register8_t *)(0x03DA)) /*--------------------------------------------------------------------------------*/ /* D/A Control Register */ union dacon_t { struct { unsigned char DA0E :1; unsigned char DA1E :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define DACON (*(volatile union dacon_t *)(0x03DC)) /*--------------------------------------------------------------------------------*/ /* Port P0 Register */ union p0_t { struct { unsigned char P0_0 :1; unsigned char P0_1 :1; unsigned char P0_2 :1; unsigned char P0_3 :1; unsigned char P0_4 :1; unsigned char P0_5 :1; unsigned char P0_6 :1; unsigned char P0_7 :1; } BIT; unsigned char BYTE; }; #define P0 (*(volatile union p0_t *)(0x03E0)) /*--------------------------------------------------------------------------------*/ /* Port P1 Register */ union p1_t { struct { unsigned char P1_0 :1; unsigned char P1_1 :1; unsigned char P1_2 :1; unsigned char P1_3 :1; unsigned char P1_4 :1; unsigned char P1_5 :1; unsigned char P1_6 :1; unsigned char P1_7 :1; } BIT; unsigned char BYTE; }; #define P1 (*(volatile union p1_t *)(0x03E1)) /*--------------------------------------------------------------------------------*/ /* Port P0 Direction Register */ union pd0_t { struct { unsigned char PD0_0 :1; unsigned char PD0_1 :1; unsigned char PD0_2 :1; unsigned char PD0_3 :1; unsigned char PD0_4 :1; unsigned char PD0_5 :1; unsigned char PD0_6 :1; unsigned char PD0_7 :1; } BIT; unsigned char BYTE; }; #define PD0 (*(volatile union pd0_t *)(0x03E2)) /*--------------------------------------------------------------------------------*/ /* Port P1 Direction Register */ union pd1_t { struct { unsigned char PD1_0 :1; unsigned char PD1_1 :1; unsigned char PD1_2 :1; unsigned char PD1_3 :1; unsigned char PD1_4 :1; unsigned char PD1_5 :1; unsigned char PD1_6 :1; unsigned char PD1_7 :1; } BIT; unsigned char BYTE; }; #define PD1 (*(volatile union pd1_t *)(0x03E3)) /*--------------------------------------------------------------------------------*/ /* Port P2 Register */ union p2_t { struct { unsigned char P2_0 :1; unsigned char P2_1 :1; unsigned char P2_2 :1; unsigned char P2_3 :1; unsigned char P2_4 :1; unsigned char P2_5 :1; unsigned char P2_6 :1; unsigned char P2_7 :1; } BIT; unsigned char BYTE; }; #define P2 (*(volatile union p2_t *)(0x03E4)) /*--------------------------------------------------------------------------------*/ /* Port P3 Register */ union p3_t { struct { unsigned char P3_0 :1; unsigned char P3_1 :1; unsigned char P3_2 :1; unsigned char P3_3 :1; unsigned char P3_4 :1; unsigned char P3_5 :1; unsigned char P3_6 :1; unsigned char P3_7 :1; } BIT; unsigned char BYTE; }; #define P3 (*(volatile union p3_t *)(0x03E5)) /*--------------------------------------------------------------------------------*/ /* Port P2 Direction Register */ union pd2_t { struct { unsigned char PD2_0 :1; unsigned char PD2_1 :1; unsigned char PD2_2 :1; unsigned char PD2_3 :1; unsigned char PD2_4 :1; unsigned char PD2_5 :1; unsigned char PD2_6 :1; unsigned char PD2_7 :1; } BIT; unsigned char BYTE; }; #define PD2 (*(volatile union pd2_t *)(0x03E6)) /*--------------------------------------------------------------------------------*/ /* Port P3 Direction Register */ union pd3_t { struct { unsigned char PD3_0 :1; unsigned char PD3_1 :1; unsigned char PD3_2 :1; unsigned char PD3_3 :1; unsigned char PD3_4 :1; unsigned char PD3_5 :1; unsigned char PD3_6 :1; unsigned char PD3_7 :1; } BIT; unsigned char BYTE; }; #define PD3 (*(volatile union pd3_t *)(0x03E7)) /*--------------------------------------------------------------------------------*/ /* Port P4 Register */ union p4_t { struct { unsigned char P4_0 :1; unsigned char P4_1 :1; unsigned char P4_2 :1; unsigned char P4_3 :1; unsigned char P4_4 :1; unsigned char P4_5 :1; unsigned char P4_6 :1; unsigned char P4_7 :1; } BIT; unsigned char BYTE; }; #define P4 (*(volatile union p4_t *)(0x03E8)) /*--------------------------------------------------------------------------------*/ /* Port P5 Register */ union p5_t { struct { unsigned char P5_0 :1; unsigned char P5_1 :1; unsigned char P5_2 :1; unsigned char P5_3 :1; unsigned char P5_4 :1; unsigned char P5_5 :1; unsigned char P5_6 :1; unsigned char P5_7 :1; } BIT; unsigned char BYTE; }; #define P5 (*(volatile union p5_t *)(0x03E9)) /*--------------------------------------------------------------------------------*/ /* Port P4 Direction Register */ union pd4_t { struct { unsigned char PD4_0 :1; unsigned char PD4_1 :1; unsigned char PD4_2 :1; unsigned char PD4_3 :1; unsigned char PD4_4 :1; unsigned char PD4_5 :1; unsigned char PD4_6 :1; unsigned char PD4_7 :1; } BIT; unsigned char BYTE; }; #define PD4 (*(volatile union pd4_t *)(0x03EA)) /*--------------------------------------------------------------------------------*/ /* Port P5 Direction Register */ union pd5_t { struct { unsigned char PD5_0 :1; unsigned char PD5_1 :1; unsigned char PD5_2 :1; unsigned char PD5_3 :1; unsigned char PD5_4 :1; unsigned char PD5_5 :1; unsigned char PD5_6 :1; unsigned char PD5_7 :1; } BIT; unsigned char BYTE; }; #define PD5 (*(volatile union pd5_t *)(0x03EB)) /*--------------------------------------------------------------------------------*/ /* Port P6 Register */ union p6_t { struct { unsigned char P6_0 :1; unsigned char P6_1 :1; unsigned char P6_2 :1; unsigned char P6_3 :1; unsigned char P6_4 :1; unsigned char P6_5 :1; unsigned char P6_6 :1; unsigned char P6_7 :1; } BIT; unsigned char BYTE; }; #define P6 (*(volatile union p6_t *)(0x03EC)) /*--------------------------------------------------------------------------------*/ /* Port P7 Register */ union p7_t { struct { unsigned char P7_0 :1; unsigned char P7_1 :1; unsigned char P7_2 :1; unsigned char P7_3 :1; unsigned char P7_4 :1; unsigned char P7_5 :1; unsigned char P7_6 :1; unsigned char P7_7 :1; } BIT; unsigned char BYTE; }; #define P7 (*(volatile union p7_t *)(0x03ED)) /*--------------------------------------------------------------------------------*/ /* Port P6 Direction Register */ union pd6_t { struct { unsigned char PD6_0 :1; unsigned char PD6_1 :1; unsigned char PD6_2 :1; unsigned char PD6_3 :1; unsigned char PD6_4 :1; unsigned char PD6_5 :1; unsigned char PD6_6 :1; unsigned char PD6_7 :1; } BIT; unsigned char BYTE; }; #define PD6 (*(volatile union pd6_t *)(0x03EE)) /*--------------------------------------------------------------------------------*/ /* Port P7 Direction Register */ union pd7_t { struct { unsigned char PD7_0 :1; unsigned char PD7_1 :1; unsigned char PD7_2 :1; unsigned char PD7_3 :1; unsigned char PD7_4 :1; unsigned char PD7_5 :1; unsigned char PD7_6 :1; unsigned char PD7_7 :1; } BIT; unsigned char BYTE; }; #define PD7 (*(volatile union pd7_t *)(0x03EF)) /*--------------------------------------------------------------------------------*/ /* Port P8 Register */ union p8_t { struct { unsigned char P8_0 :1; unsigned char P8_1 :1; unsigned char P8_2 :1; unsigned char P8_3 :1; unsigned char P8_4 :1; unsigned char P8_5 :1; unsigned char P8_6 :1; unsigned char P8_7 :1; } BIT; unsigned char BYTE; }; #define P8 (*(volatile union p8_t *)(0x03F0)) /*--------------------------------------------------------------------------------*/ /* Port P9 Register */ union p9_t { struct { unsigned char P9_0 :1; unsigned char P9_1 :1; unsigned char P9_2 :1; unsigned char P9_3 :1; unsigned char P9_4 :1; unsigned char P9_5 :1; unsigned char P9_6 :1; unsigned char P9_7 :1; } BIT; unsigned char BYTE; }; #define P9 (*(volatile union p9_t *)(0x03F1)) /*--------------------------------------------------------------------------------*/ /* Port P8 Direction Register */ union pd8_t { struct { unsigned char PD8_0 :1; unsigned char PD8_1 :1; unsigned char PD8_2 :1; unsigned char PD8_3 :1; unsigned char PD8_4 :1; unsigned char PD8_5 :1; unsigned char PD8_6 :1; unsigned char PD8_7 :1; } BIT; unsigned char BYTE; }; #define PD8 (*(volatile union pd8_t *)(0x03F2)) /*--------------------------------------------------------------------------------*/ /* Port P9 Direction Register */ union pd9_t { struct { unsigned char PD9_0 :1; unsigned char PD9_1 :1; unsigned char PD9_2 :1; unsigned char PD9_3 :1; unsigned char PD9_4 :1; unsigned char PD9_5 :1; unsigned char PD9_6 :1; unsigned char PD9_7 :1; } BIT; unsigned char BYTE; }; #define PD9 (*(volatile union pd9_t *)(0x03F3)) /*--------------------------------------------------------------------------------*/ /* Port P10 Register */ union p10_t { struct { unsigned char P10_0 :1; unsigned char P10_1 :1; unsigned char P10_2 :1; unsigned char P10_3 :1; unsigned char P10_4 :1; unsigned char P10_5 :1; unsigned char P10_6 :1; unsigned char P10_7 :1; } BIT; unsigned char BYTE; }; #define P10 (*(volatile union p10_t *)(0x03F4)) /*--------------------------------------------------------------------------------*/ /* Port P11 Register */ union p11_t { struct { unsigned char P11_0 :1; unsigned char P11_1 :1; unsigned char P11_2 :1; unsigned char P11_3 :1; unsigned char P11_4 :1; unsigned char P11_5 :1; unsigned char P11_6 :1; unsigned char P11_7 :1; } BIT; unsigned char BYTE; }; #define P11 (*(volatile union p11_t *)(0x03F5)) /*--------------------------------------------------------------------------------*/ /* Port P10 Direction Register */ union pd10_t { struct { unsigned char PD10_0 :1; unsigned char PD10_1 :1; unsigned char PD10_2 :1; unsigned char PD10_3 :1; unsigned char PD10_4 :1; unsigned char PD10_5 :1; unsigned char PD10_6 :1; unsigned char PD10_7 :1; } BIT; unsigned char BYTE; }; #define PD10 (*(volatile union pd10_t *)(0x03F6)) /*--------------------------------------------------------------------------------*/ /* Port P11 Direction Register */ union pd11_t { struct { unsigned char PD11_0 :1; unsigned char PD11_1 :1; unsigned char PD11_2 :1; unsigned char PD11_3 :1; unsigned char PD11_4 :1; unsigned char PD11_5 :1; unsigned char PD11_6 :1; unsigned char PD11_7 :1; } BIT; unsigned char BYTE; }; #define PD11 (*(volatile union pd11_t *)(0x03F7)) /*--------------------------------------------------------------------------------*/ /* Port P12 Register */ union p12_t { struct { unsigned char P12_0 :1; unsigned char P12_1 :1; unsigned char P12_2 :1; unsigned char P12_3 :1; unsigned char P12_4 :1; unsigned char P12_5 :1; unsigned char P12_6 :1; unsigned char P12_7 :1; } BIT; unsigned char BYTE; }; #define P12 (*(volatile union p12_t *)(0x03F8)) /*--------------------------------------------------------------------------------*/ /* Port P13 Register */ union p13_t { struct { unsigned char P13_0 :1; unsigned char P13_1 :1; unsigned char P13_2 :1; unsigned char P13_3 :1; unsigned char P13_4 :1; unsigned char P13_5 :1; unsigned char P13_6 :1; unsigned char P13_7 :1; } BIT; unsigned char BYTE; }; #define P13 (*(volatile union p13_t *)(0x03F9)) /*--------------------------------------------------------------------------------*/ /* Port P12 Direction Register */ union pd12_t { struct { unsigned char PD12_0 :1; unsigned char PD12_1 :1; unsigned char PD12_2 :1; unsigned char PD12_3 :1; unsigned char PD12_4 :1; unsigned char PD12_5 :1; unsigned char PD12_6 :1; unsigned char PD12_7 :1; } BIT; unsigned char BYTE; }; #define PD12 (*(volatile union pd12_t *)(0x03FA)) /*--------------------------------------------------------------------------------*/ /* Port P13 Direction Register */ union pd13_t { struct { unsigned char PD13_0 :1; unsigned char PD13_1 :1; unsigned char PD13_2 :1; unsigned char PD13_3 :1; unsigned char PD13_4 :1; unsigned char PD13_5 :1; unsigned char PD13_6 :1; unsigned char PD13_7 :1; } BIT; unsigned char BYTE; }; #define PD13 (*(volatile union pd13_t *)(0x03FB)) /*--------------------------------------------------------------------------------*/ /* Port P14 Register */ union p14_t { struct { unsigned char P14_0 :1; unsigned char P14_1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define P14 (*(volatile union p14_t *)(0x03FC)) /*--------------------------------------------------------------------------------*/ /* Port P14 Direction Register */ union pd14_t { struct { unsigned char PD14_0 :1; unsigned char PD14_1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; } BIT; unsigned char BYTE; }; #define PD14 (*(volatile union pd14_t *)(0x03FE)) /*--------------------------------------------------------------------------------*/ /* PMC0 Header Pattern Set Register (Min) */ #define PMC0HDPMIN (*(volatile union register16_t *)(0xD080)) /*--------------------------------------------------------------------------------*/ /* PMC0 Header Pattern Set Register (Max) */ #define PMC0HDPMAX (*(volatile union register16_t *)(0xD082)) /*--------------------------------------------------------------------------------*/ /* PMC0 Data 0 Pattern Set Register (Min) */ #define PMC0D0PMIN (*(volatile union register8_t *)(0xD084)) /*--------------------------------------------------------------------------------*/ /* PMC0 Data 0 Pattern Set Register (Max) */ #define PMC0D0PMAX (*(volatile union register8_t *)(0xD085)) /*--------------------------------------------------------------------------------*/ /* PMC0 Data 1 Pattern Set Register (Min) */ #define PMC0D1PMIN (*(volatile union register8_t *)(0xD086)) /*--------------------------------------------------------------------------------*/ /* PMC0 Data 1 Pattern Set Register (Max) */ #define PMC0D1PMAX (*(volatile union register8_t *)(0xD087)) /*--------------------------------------------------------------------------------*/ /* PMC0 Measurements Register */ #define PMC0TIM (*(volatile union register16_t *)(0xD088)) /*--------------------------------------------------------------------------------*/ /* PMC0 Counter Value Register */ #define PMC0BC (*(volatile union register16_t *)(0xD08A)) /*--------------------------------------------------------------------------------*/ /* PMC0 Receive Data Store Register 0 */ #define PMC0DAT0 (*(volatile union register8_t *)(0xD08C)) /*--------------------------------------------------------------------------------*/ /* PMC0 Receive Data Store Register 1 */ #define PMC0DAT1 (*(volatile union register8_t *)(0xD08D)) /*--------------------------------------------------------------------------------*/ /* PMC0 Receive Data Store Register 2 */ #define PMC0DAT2 (*(volatile union register8_t *)(0xD08E)) /*--------------------------------------------------------------------------------*/ /* PMC0 Receive Data Store Register 3 */ #define PMC0DAT3 (*(volatile union register8_t *)(0xD08F)) /*--------------------------------------------------------------------------------*/ /* PMC0 Receive Data Store Register 4 */ #define PMC0DAT4 (*(volatile union register8_t *)(0xD090)) /*--------------------------------------------------------------------------------*/ /* PMC0 Receive Data Store Register 5 */ #define PMC0DAT5 (*(volatile union register8_t *)(0xD091)) /*--------------------------------------------------------------------------------*/ /* PMC0 Receive Bit Count Register */ #define PMC0RBIT (*(volatile union register8_t *)(0xD092)) /*--------------------------------------------------------------------------------*/ /* PMC1 Header Pattern Set Register (Min) */ #define PMC1HDPMIN (*(volatile union register16_t *)(0xD094)) /*--------------------------------------------------------------------------------*/ /* PMC1 Header Pattern Set Register (Max) */ #define PMC1HDPMAX (*(volatile union register16_t *)(0xD096)) /*--------------------------------------------------------------------------------*/ /* PMC1 Data 0 Pattern Set Register (Min) */ #define PMC1D0PMIN (*(volatile union register8_t *)(0xD098)) /*--------------------------------------------------------------------------------*/ /* PMC1 Data 0 Pattern Set Register (Max) */ #define PMC1D0PMAX (*(volatile union register8_t *)(0xD099)) /*--------------------------------------------------------------------------------*/ /* PMC1 Data 1 Pattern Set Register (Min) */ #define PMC1D1PMIN (*(volatile union register8_t *)(0xD09A)) /*--------------------------------------------------------------------------------*/ /* PMC1 Data 1 Pattern Set Register (Max) */ #define PMC1D1PMAX (*(volatile union register8_t *)(0xD09B)) /*--------------------------------------------------------------------------------*/ /* PMC1 Measurements Register */ #define PMC1TIM (*(volatile union register16_t *)(0xD09C)) /*--------------------------------------------------------------------------------*/ /* PMC1 Counter Value Register */ #define PMC1BC (*(volatile union register16_t *)(0xD09E)) /*--------------------------------------------------------------------------------*/ #endif /* __IOM16C65_H__ */ tinyos-2.1.2+dfsg/tos/chips/m16c60/65/m16c60.h000066400000000000000000000040001207233610700201210ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * 62P specific includes and defines in the M16C/60 series. * * @author Henrik Makitaavola */ #ifndef __M16C60_H__ #define __M16C60_H__ #include "iom16c65.h" /* ADC Precision Settings */ enum { M16c60_ADC_PRECISION_10BIT = 0, }; #endif // __M16C60_H__ tinyos-2.1.2+dfsg/tos/chips/m16c60/McuSleepC.nc000077500000000000000000000042351207233610700207610ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Wiring of TEP 112 (Microcontroller Power Management). * * @author Henrik Makitaavola */ configuration McuSleepC { provides interface McuSleep; provides interface McuPowerState; uses interface McuPowerOverride; } implementation { components McuSleepP, M16c60ControlC; McuSleep = McuSleepP; McuPowerState = McuSleepP; McuSleepP = McuPowerOverride; McuSleepP.M16c60Control -> M16c60ControlC; } tinyos-2.1.2+dfsg/tos/chips/m16c60/McuSleepP.nc000077500000000000000000000043721207233610700210000ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of TEP 112 (Microcontroller Power Management). * * @author Henrik Makitaavola */ module McuSleepP { provides interface McuSleep; provides interface McuPowerState; uses interface McuPowerOverride; uses interface M16c60Control; } implementation { async command void McuSleep.sleep() { call M16c60Control.sleep(); } async command void McuPowerState.update() { } default async command mcu_power_t McuPowerOverride.lowestState() { return M16C60_POWER_STOP; } } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/000077500000000000000000000000001207233610700173375ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/Adc.h000077500000000000000000000012271207233610700202040ustar00rootroot00000000000000/* $Id: Adc.h,v 1.1 2009-09-07 14:12:25 r-studio Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * @author David Gay */ #ifndef __ADC_H__ #define __ADC_H__ #include "M16c60Adc.h" /* Read and ReadNow share client ids */ #define UQ_ADC_READ "adc.read" #define UQ_ADC_READNOW UQ_ADC_READ #define UQ_ADC_READSTREAM "adc.readstream" #endif // __ADC_H__ tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/AdcP.nc000077500000000000000000000106111207233610700204720ustar00rootroot00000000000000/* $Id: AdcP.nc,v 1.1 2009-09-07 14:12:25 r-studio Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Convert M16c60 HAL A/D interface to the HIL interfaces. * @author Fan Zhang */ #include "Timer.h" module AdcP { provides { interface Read[uint8_t client]; interface ReadNow[uint8_t client]; } uses { interface M16c60AdcSingle; interface M16c60AdcConfig[uint8_t client]; } } implementation { enum { IDLE, ACQUIRE_DATA, ACQUIRE_DATA_NOW, }; /* Resource reservation is required, and it's incorrect to call getData again before dataReady is signaled, so there are no races in correct programs */ norace uint8_t state; norace uint8_t client; norace uint16_t val; uint8_t channel() { return call M16c60AdcConfig.getChannel[client](); } uint8_t precision() { return call M16c60AdcConfig.getPrecision[client](); } uint8_t prescaler() { return call M16c60AdcConfig.getPrescaler[client](); } void sample() { call M16c60AdcSingle.getData(channel(), precision(), prescaler()); } error_t startGet(uint8_t newState, uint8_t newClient) { /* Note: we retry imprecise results in dataReady */ state = newState; client = newClient; sample(); return SUCCESS; } command error_t Read.read[uint8_t c]() { return startGet(ACQUIRE_DATA, c); } async command error_t ReadNow.read[uint8_t c]() { return startGet(ACQUIRE_DATA_NOW, c); } task void acquiredData() { state = IDLE; signal Read.readDone[client](SUCCESS, val); } async event void M16c60AdcSingle.dataReady(uint16_t data, bool precise) { switch (state) { case ACQUIRE_DATA: if (!precise) sample(); else { val = data; post acquiredData(); } break; case ACQUIRE_DATA_NOW: if (!precise) sample(); else { state = IDLE; signal ReadNow.readDone[client](SUCCESS, data); } break; default: break; } } /* Configuration defaults. Read ground fast! ;-) */ default async command uint8_t M16c60AdcConfig.getChannel[uint8_t c]() { return M16c60_ADC_CHL_AN0; } default async command uint8_t M16c60AdcConfig.getPrecision[uint8_t c]() { return M16c60_ADC_PRECISION_10BIT; } default async command uint8_t M16c60AdcConfig.getPrescaler[uint8_t c]() { return M16c60_ADC_PRESCALE_2; } default event void Read.readDone[uint8_t c](error_t e, uint16_t d) { } default async event void ReadNow.readDone[uint8_t c](error_t e, uint16_t d) { } } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/AdcReadClientC.nc000077500000000000000000000022571207233610700224170ustar00rootroot00000000000000/* $Id: AdcReadClientC.nc,v 1.1 2009-09-07 14:12:25 r-studio Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Provide, as per TEP101, arbitrated access via a Read interface to the * M16c60 ADC. Users of this component must link it to an * implementation of M16c60AdcConfig which provides the ADC parameters * (channel, etc). * * @author Fan Zhang */ #include "Adc.h" generic configuration AdcReadClientC() { provides interface Read; uses { interface M16c60AdcConfig; interface ResourceConfigure; } } implementation { components WireAdcP, M16c60AdcC; enum { ID = unique(UQ_ADC_READ), HAL_ID = unique(UQ_M16c60ADC_RESOURCE) }; Read = WireAdcP.Read[ID]; M16c60AdcConfig = WireAdcP.M16c60AdcConfig[ID]; WireAdcP.Resource[ID] -> M16c60AdcC.Resource[HAL_ID]; ResourceConfigure = M16c60AdcC.ResourceConfigure[HAL_ID]; } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/AdcReadNowClientC.nc000077500000000000000000000023341207233610700230770ustar00rootroot00000000000000/* $Id: AdcReadNowClientC.nc,v 1.1 2009-09-07 14:12:25 r-studio Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Provide, as per TEP101, Resource-based access to the M16c60 ADC via a * ReadNow interface. Users of this component must link it to an * implementation of M16c60AdcConfig which provides the ADC parameters * (channel, etc). * * @author Fan Zhang */ #include "Adc.h" generic configuration AdcReadNowClientC() { provides { interface Resource; interface ReadNow; } uses { interface M16c60AdcConfig; interface ResourceConfigure; } } implementation { components WireAdcP, M16c60AdcC; enum { ID = unique(UQ_ADC_READNOW), HAL_ID = unique(UQ_M16c60ADC_RESOURCE) }; ReadNow = WireAdcP.ReadNow[ID]; M16c60AdcConfig = WireAdcP.M16c60AdcConfig[ID]; Resource = M16c60AdcC.Resource[HAL_ID]; ResourceConfigure = M16c60AdcC.ResourceConfigure[HAL_ID]; } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/AdcReadStreamClientC.nc000077500000000000000000000023611207233610700235670ustar00rootroot00000000000000/* $Id: AdcReadStreamClientC.nc,v 1.1 2009-09-07 14:12:25 r-studio Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Provide, as per TEP101, arbitrated access via a ReadStream interface to * the M16c60 ADC. Users of this component must link it to an * implementation of M16c60AdcConfig which provides the ADC parameters * (channel, etc). * * @author Fan Zhang */ #include "Adc.h" generic configuration AdcReadStreamClientC() { provides interface ReadStream; uses { interface M16c60AdcConfig; interface ResourceConfigure; } } implementation { components WireAdcStreamP, M16c60AdcC; enum { ID = unique(UQ_ADC_READSTREAM), HAL_ID = unique(UQ_M16c60ADC_RESOURCE) }; ReadStream = WireAdcStreamP.ReadStream[ID]; M16c60AdcConfig = WireAdcStreamP.M16c60AdcConfig[ID]; WireAdcStreamP.Resource[ID] -> M16c60AdcC.Resource[HAL_ID]; ResourceConfigure = M16c60AdcC.ResourceConfigure[HAL_ID]; } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/AdcStreamP.nc000077500000000000000000000162571207233610700216620ustar00rootroot00000000000000/* $Id: AdcStreamP.nc,v 1.1 2009-09-07 14:12:25 r-studio Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Convert M16c60 HAL A/D interface to the HIL interfaces. * @author Fan Zhang */ #include "Timer.h" module AdcStreamP { provides { interface Init @atleastonce(); interface ReadStream[uint8_t client]; } uses { interface M16c60AdcSingle; interface M16c60AdcConfig[uint8_t client]; //interface M16c60Calibrate; interface Alarm; } } implementation { enum { NSTREAM = uniqueCount(UQ_ADC_READSTREAM) }; /* Resource reservation is required, and it's incorrect to call getData again before dataReady is signaled, so there are no races in correct programs */ norace uint8_t client = NSTREAM; /* Stream data */ struct list_entry_t { uint16_t count; struct list_entry_t * ONE_NOK next; }; struct list_entry_t *bufferQueue[NSTREAM]; struct list_entry_t * ONE_NOK * bufferQueueEnd[NSTREAM]; uint16_t * COUNT_NOK(lastCount) lastBuffer, lastCount; norace uint16_t count; norace uint16_t * COUNT_NOK(count) buffer; norace uint16_t * BND_NOK(buffer, buffer+count) pos; norace uint32_t now, period; command error_t Init.init() { uint8_t i; for (i = 0; i != NSTREAM; i++) bufferQueueEnd[i] = &bufferQueue[i]; return SUCCESS; } uint8_t channel() { return call M16c60AdcConfig.getChannel[client](); } uint8_t precision() { return call M16c60AdcConfig.getPrecision[client](); } uint8_t prescaler() { return call M16c60AdcConfig.getPrescaler[client](); } void sample() { call M16c60AdcSingle.getData(channel(), precision(), prescaler()); } command error_t ReadStream.postBuffer[uint8_t c](uint16_t *buf, uint16_t n) { if (n < sizeof(struct list_entry_t)) return ESIZE; atomic { struct list_entry_t * ONE newEntry = TCAST(struct list_entry_t * ONE, buf); if (!bufferQueueEnd[c]) // Can't post right now. return FAIL; newEntry->count = n; newEntry->next = NULL; *bufferQueueEnd[c] = newEntry; bufferQueueEnd[c] = &newEntry->next; } return SUCCESS; } task void readStreamDone() { uint8_t c = client; //uint32_t actualPeriod = call M16c60Calibrate.actualMicro(period); uint32_t actualPeriod = period; // fanzha not debug atomic { bufferQueue[c] = NULL; bufferQueueEnd[c] = &bufferQueue[c]; } client = NSTREAM; signal ReadStream.readDone[c](SUCCESS, actualPeriod); } task void readStreamFail() { /* By now, the pending bufferDone has been signaled (see readStream). */ struct list_entry_t *entry; uint8_t c = client; atomic entry = bufferQueue[c]; for (; entry; entry = entry->next){ uint16_t tmp_count __DEPUTY_UNUSED__ = entry->count; signal ReadStream.bufferDone[c](FAIL, TCAST(uint16_t * COUNT_NOK(tmp_count),entry), entry->count); } atomic { bufferQueue[c] = NULL; bufferQueueEnd[c] = &bufferQueue[c]; } client = NSTREAM; signal ReadStream.readDone[c](FAIL, 0); } task void bufferDone() { uint16_t *b, c; atomic { b = lastBuffer; c = lastCount; lastBuffer = NULL; } signal ReadStream.bufferDone[client](SUCCESS, b, c); } void nextAlarm() { call Alarm.startAt(now, period); now += period; } async event void Alarm.fired() { sample(); } command error_t ReadStream.read[uint8_t c](uint32_t usPeriod) { /* The first reading may be imprecise. So we just do a dummy read to get things rolling - this is indicated by setting count to 0 */ buffer = pos = NULL; count = 0; //period = call M16c60Calibrate.calibrateMicro(usPeriod); client = c; sample(); return SUCCESS; } void nextBuffer() { atomic { struct list_entry_t *entry = bufferQueue[client]; if (!entry) { // all done bufferQueueEnd[client] = NULL; // prevent post post readStreamDone(); } else { uint16_t tmp_count; bufferQueue[client] = entry->next; if (!bufferQueue[client]) bufferQueueEnd[client] = &bufferQueue[client]; pos = buffer = NULL; count = entry->count; tmp_count = count; pos = buffer = TCAST(uint16_t * COUNT_NOK(tmp_count), entry); nextAlarm(); } } } async event void M16c60AdcSingle.dataReady(uint16_t data, bool precise) { if (client == NSTREAM) return; if (count == 0) { now = call Alarm.getNow(); nextBuffer(); } else { *pos++ = data; if (pos == buffer + count) { atomic { if (lastBuffer) { /* We failed to signal bufferDone in time. Fail. */ bufferQueueEnd[client] = NULL; // prevent post post readStreamFail(); return; } else { lastCount = count; lastBuffer = buffer; } } post bufferDone(); nextBuffer(); } else nextAlarm(); } } /* Configuration defaults. Read ground fast! ;-) */ default async command uint8_t M16c60AdcConfig.getChannel[uint8_t c]() { return M16c60_ADC_CHL_AN0; } default async command uint8_t M16c60AdcConfig.getPrecision[uint8_t c]() { return M16c60_ADC_PRECISION_10BIT; } default async command uint8_t M16c60AdcConfig.getPrescaler[uint8_t c]() { return M16c60_ADC_PRESCALE_2; } } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/HplM16c60Adc.nc000077500000000000000000000127521207233610700216230ustar00rootroot00000000000000/// $Id: HplM16c60Adc.nc,v 1.2 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "M16c60Adc.h" /** * HPL interface to the M16c60 A/D conversion subsystem. *

      * conversion when the ADC and ADC interrupt are enabled. * * @author Martin Turon * @author Hu Siquan * @author David Gay */ interface HplM16c60Adc { /** * Read the ADCON0 (ADC control register 0) * @return Current ADCON0 value */ async command M16c60ADCON0_t getADCON0(); /** * Set the ADCON0 (ADC control register 0) * @param adcon0 New ADCON0 value */ async command void setADCON0(M16c60ADCON0_t adcon0); ///////////////////////////////////////////////////////////////////////////////// /** * Read the ADCON1 (ADC control) register * @return Current ADCON1 value */ async command M16c60ADCON1_t getADCON1(); /** * Set the ADCON1 (ADC control) register * @param adcon1 New ADCON1 value */ async command void setADCON1(M16c60ADCON1_t adcon1); ////////////////////////////////////////////////////////////////////////////////// /** * Read the ADCON2 (ADC control) register * @return Current ADCON2 value */ async command M16c60ADCON2_t getADCON2(); /** * Set the ADCON2 (ADC control) register * @param adcon2 New ADCON2 value */ async command void setADCON2(M16c60ADCON2_t adcon2); ///////////////////////////////////////////////////////////////////////////////// /** * Read the latest A/D conversion result * @return A/D value */ async command uint16_t getValue(); /// A/D control utilities. All of these clear any pending A/D interrupt. /** * Enable ADC sampling */ async command void enableAdc(); /** * Disable ADC sampling */ async command void disableAdc(); /** * Enable ADC interrupt */ async command void enableInterruption(); /** * Disable ADC interrupt */ async command void disableInterruption(); /** * Clear the ADC interrupt flag */ async command void resetInterrupt(); /** * Start ADC conversion. If ADC interrupts are enabled, the dataReady event * will be signaled once (in non-continuous mode) or repeatedly (in * continuous mode). */ async command void startConversion(); /** * Enable continuous sampling */ async command void setContinuous(); /** * Disable continuous sampling */ async command void setSingle(); /* A/D status checks */ /** * Is ADC enabled? * @return TRUE if the ADC is enabled, FALSE otherwise */ async command bool isEnabled(); /** * Is A/D conversion in progress? * @return TRUE if the A/D conversion is in progress, FALSE otherwise */ async command bool isStarted(); /** * Is A/D conversion complete? Note that this flag is automatically * cleared when an A/D interrupt occurs. * @return TRUE if the A/D conversion is complete, FALSE otherwise */ async command bool isComplete(); /** * Set ADC precision selection bits * @param scale New ADC prescision. Must be one of the M16c60_ADC_PRECISION_xxx * values from M16c60Adc.h */ async command void setPrecision(uint8_t precision); /** * Set ADC prescaler selection bits * @param scale New ADC prescaler. Must be one of the M16c60_ADC_PRESCALE_xxx * values from M16c60Adc.h */ async command void setPrescaler(uint8_t scale); /** * Cancel A/D conversion and any pending A/D interrupt. Also disables the * ADC interruption (otherwise a sample might start at the next sleep * instruction). This command can assume that the A/D converter is enabled. * @return TRUE if an A/D conversion was in progress or an A/D interrupt * was pending, FALSE otherwise. In single conversion mode, a return * of TRUE implies that the dataReady event will not be signaled. */ async command bool cancel(); /** * A/D interrupt occured * @param data Latest A/D conversion result */ async event void dataReady(uint16_t data); } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/HplM16c60AdcC.nc000077500000000000000000000041671207233610700217270ustar00rootroot00000000000000/// $Id: HplM16c60AdcC.nc,v 1.3 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "M16c60Adc.h" /** * HPL for the M16c60 A/D conversion susbsystem. * * @author Martin Turon * @author Hu Siquan * @author David Gay */ configuration HplM16c60AdcC { provides interface HplM16c60Adc; } implementation { components HplM16c60AdcP, McuSleepC; HplM16c60Adc = HplM16c60AdcP; HplM16c60AdcP.McuPowerState -> McuSleepC; #ifdef THREADS components PlatformInterruptC; HplM16c60AdcP.PlatformInterrupt -> PlatformInterruptC; #endif } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/HplM16c60AdcP.nc000077500000000000000000000150561207233610700217430ustar00rootroot00000000000000/// $Id: HplM16c60AdcP.nc,v 1.3 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "M16c60Adc.h" /** * HPL for the M16c60 A/D conversion susbsystem. * * @author Fan Zhang * */ module HplM16c60AdcP { provides interface HplM16c60Adc; uses interface McuPowerState; #ifdef THREADS uses interface PlatformInterrupt; #define POST_AMBLE() call PlatformInterrupt.postAmble() #else #define POST_AMBLE() #endif } implementation { //=== Direct read of HW registers. ================================= async command M16c60ADCON0_t HplM16c60Adc.getADCON0() { return *(M16c60ADCON0_t*)&ADCON0; } async command M16c60ADCON1_t HplM16c60Adc.getADCON1() { return *(M16c60ADCON1_t*)&ADCON1; } async command M16c60ADCON2_t HplM16c60Adc.getADCON2() { return *(M16c60ADCON2_t*)&ADCON2; } async command uint16_t HplM16c60Adc.getValue() { uint8_t channel = ADCON0.BYTE&0x07; if(channel==0x00){return AD0.WORD;} else if(channel==0x01){return AD1.WORD;} else if(channel==0x02){return AD2.WORD;} else if(channel==0x03){return AD3.WORD;} else if(channel==0x04){return AD4.WORD;} else if(channel==0x05){return AD5.WORD;} else if(channel==0x06){return AD6.WORD;} else {return AD7.WORD;} } DEFINE_UNION_CAST(ADCON02int, M16c60ADCON0_t, uint8_t); // type change from M16c60ADCON0_t to uint8_t DEFINE_UNION_CAST(ADCON12int, M16c60ADCON1_t, uint8_t); DEFINE_UNION_CAST(ADCON22int, M16c60ADCON2_t, uint8_t); //=== Direct write of HW registers. ================================ async command void HplM16c60Adc.setADCON0( M16c60ADCON0_t x ) { ADCON0.BYTE = ADCON02int(x); } async command void HplM16c60Adc.setADCON1( M16c60ADCON1_t x ) { ADCON1.BYTE = ADCON12int(x); } async command void HplM16c60Adc.setADCON2( M16c60ADCON2_t x ) { ADCON2.BYTE = ADCON22int(x); } /* write the precision bit in the ADCON1 register, not supported on all models */ async command void HplM16c60Adc.setPrecision(uint8_t precision){ WRITE_BIT(ADCON1.BYTE, 3, precision); } /* Set ADC prescaler selection bits */ async command void HplM16c60Adc.setPrescaler(uint8_t scale){ if(scale == 0x00){ADCON2.BIT.CKS2=0;ADCON1.BIT.CKS1=0;ADCON0.BIT.CKS0=0;} // fAD/4 prescaler else if(scale == 0x01){ADCON2.BIT.CKS2=0;ADCON1.BIT.CKS1=0;ADCON0.BIT.CKS0=1;} // fAD/2 prescaler else if((scale == 0x02) || (scale == 0x03)){ADCON2.BIT.CKS2=0;ADCON1.BIT.CKS1=1;ADCON0.BIT.CKS0=0;} // fAD prescaler else if(scale == 0x04){ADCON2.BIT.CKS2=1;ADCON1.BIT.CKS1=0;ADCON0.BIT.CKS0=0;} // fAD/12 prescaler else if(scale == 0x05){ADCON2.BIT.CKS2=1;ADCON1.BIT.CKS1=0;ADCON0.BIT.CKS0=1;} // fAD/6 prescaler else if((scale == 0x06) || (scale == 0x07)){ADCON2.BIT.CKS2=1;ADCON1.BIT.CKS1=1;ADCON0.BIT.CKS0=0;} // fAD/3 prescaler } // Individual bit manipulation. These all clear any pending A/D interrupt. async command void HplM16c60Adc.enableAdc() { SET_BIT(ADCON1.BYTE, 5); call McuPowerState.update(); } async command void HplM16c60Adc.disableAdc() { CLR_BIT(ADCON1.BYTE, 5); call McuPowerState.update(); } // A/D conversion interrupt control register is ADIC 2009-2-9 by Fan Zhang async command void HplM16c60Adc.enableInterruption() { ADIC.BIT.ILVL2=0;ADIC.BIT.ILVL1=0;ADIC.BIT.ILVL0=1; } async command void HplM16c60Adc.disableInterruption() { ADIC.BIT.ILVL2=0;ADIC.BIT.ILVL1=0;ADIC.BIT.ILVL0=0; } async command void HplM16c60Adc.startConversion() { ADCON0.BIT.ADST=1; } // ADST=6 async command void HplM16c60Adc.resetInterrupt() { } // Clear the ADC interrupt flag /** * Enable continuous sampling, that is repeat sampling mode */ async command void HplM16c60Adc.setContinuous() { ADCON0.BIT.MD0=0;ADCON0.BIT.MD1=1; } /** * Disable continuous sampling, enable one-shot sampling mode */ async command void HplM16c60Adc.setSingle() { ADCON0.BIT.MD0=0;ADCON0.BIT.MD1=0; } /* A/D status checks */ async command bool HplM16c60Adc.isEnabled(){ // ADCON1 bit 5 controls the ADC, 0 disable connection, 1 connection return READ_BIT(ADCON1.BYTE, 5); } async command bool HplM16c60Adc.isStarted() { return ADCON0.BIT.ADST; } async command bool HplM16c60Adc.isComplete() { // interrupt flag bit return ADIC.BIT.IR; } /* A/D interrupt handlers. Signals dataReady event with interrupts enabled */ default async event void HplM16c60Adc.dataReady(uint16_t done) { } M16C_INTERRUPT_HANDLER(M16C_AD) { uint16_t data = call HplM16c60Adc.getValue(); __nesc_enable_interrupt(); signal HplM16c60Adc.dataReady(data); POST_AMBLE(); } async command bool HplM16c60Adc.cancel() { /* This is tricky */ atomic { /* To cancel a conversion, first turn off ADEN, then turn off ADSC. We also cancel any pending interrupt. Finally we reenable the ADC. */ //ADCON1.VCUT=0; //ADIC.ILVL2=0;ADIC.ILVL1=0;ADIC.ILVL0=0; /* This disable ADC interrupt... */ ADCON0.BIT.ADST=0; //ADCON1.VCUT=1; return TRUE; } } } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/M16c60Adc.h000077500000000000000000000124531207233610700210040ustar00rootroot00000000000000// $Id: M16c60Adc.h,v 1.2 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // @author Martin Turon // @author Hu Siquan #ifndef __H_M16C60ADC_H__ #define __H_M16C60ADC_H__ //================== 8 channel 10-bit ADC ============================== /* Voltage Reference Settings */ enum { M16c60_ADC_VREF_OFF = 0, //!< VR+ = AREF and VR- = GND M16c60_ADC_VREF_AVCC = 1,//!< VR+ = AVcc and VR- = GND }; /* Voltage Reference Settings */ enum { M16c60_ADC_RIGHT_ADJUST = 0, M16c60_ADC_LEFT_ADJUST = 1, }; /* ADC Channel Settings */ enum { M16c60_ADC_CHL_AN0 = 0, M16c60_ADC_CHL_AN1, M16c60_ADC_CHL_AN2, M16c60_ADC_CHL_AN3, M16c60_ADC_CHL_AN4, M16c60_ADC_CHL_AN5, M16c60_ADC_CHL_AN6, M16c60_ADC_CHL_AN7, M16c60_ADC_CHL_AN10 = 8, M16c60_ADC_CHL_AN11, M16c60_ADC_CHL_AN12, M16c60_ADC_CHL_AN13, M16c60_ADC_CHL_AN14, M16c60_ADC_CHL_AN15, M16c60_ADC_CHL_AN16, M16c60_ADC_CHL_AN17, }; /* ADC Control Register 0 */ typedef struct { uint8_t ch012 : 3; //!< Analog Channel and Gain Selection Bits uint8_t md01 : 2; //!< ADC operation mode select bit uint8_t trg : 1; //!< Trigger select bit uint8_t adst : 1; //!< ADC start flag uint8_t cks0 :1; //!< Frequency Selection Bit 0 } M16c60ADCON0_t; /* ADC Control Register 1 */ typedef struct { uint8_t scan01 : 2; //!< ADC scan mode select bit uint8_t md2 : 1; //!< ADC operation mode select bit 1 uint8_t bits : 1; //!< 8/10-bit mode select bit uint8_t cks1 : 1; //!< Frequency select bit 1 uint8_t vcut : 1; //!< Vref connect bit uint8_t opa01 : 2; //!< External op-amp connection mode bit } M16c60ADCON1_t; /* ADC Control Register 2 */ typedef struct { uint8_t smp : 1; //!< ADC method select bit uint8_t adgsel01 : 2; //!< port group select: 00 select P10 group // 01 select NULL // 10 select P0 group // 11 select P2 group uint8_t bit3 : 1; //!< reserved bit (always set to 0) uint8_t cks2 : 1; //!< Frequency select bit 2 uint8_t bit5 : 1; //!< nothing assigned. uint8_t bit6 : 1; //!< nothing assigned. uint8_t bit7 : 1; //!< nothing assigned. } M16c60ADCON2_t; /* ADC Prescaler Settings */ /* Note: each platform must define M16c60_ADC_PRESCALE to the smallest prescaler which guarantees full A/D precision. */ enum { M16c60_ADC_PRESCALE_2 = 1, M16c60_ADC_PRESCALE_3 = 6, M16c60_ADC_PRESCALE_4 = 0, M16c60_ADC_PRESCALE_6 = 5, M16c60_ADC_PRESCALE_12 = 4, // This special value is used to ask the platform for the prescaler // which gives full precision. M16c60_ADC_PRESCALE = 2, }; /* ADC Precision Settings */ // See mcu model header file /* ADC operation mode select bit */ enum { M16c60_ADC_ONESHOT_MODE = 0, M16c60_ADC_REPEAT_MODE, }; /* ADC Enable Settings */ enum { M16c60_ADC_ENABLE_OFF = 0, M16c60_ADC_ENABLE_ON, }; /* ADC Start Conversion Settings */ enum { M16c60_ADC_START_CONVERSION_OFF = 0, M16c60_ADC_START_CONVERSION_ON, }; /* ADC Free Running Select Settings */ enum { M16c60_ADC_FREE_RUNNING_OFF = 0, M16c60_ADC_FREE_RUNNING_ON, }; /* ADC Interrupt Flag Settings */ enum { M16c60_ADC_INT_FLAG_OFF = 0, M16c60_ADC_INT_FLAG_ON, }; /* ADC Interrupt Enable Settings */ enum { M16c60_ADC_INT_ENABLE_OFF = 0, M16c60_ADC_INT_ENABLE_ON, }; typedef uint8_t M16c60_ADCH_t; //!< ADC data register high typedef uint8_t M16c60_ADCL_t; //!< ADC data register low // The resource identifier string for the ADC subsystem #define UQ_M16c60ADC_RESOURCE "M16c60adc.resource" #endif // __H_M16C60ADC_H_ tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/M16c60AdcC.nc000077500000000000000000000054661207233610700212660ustar00rootroot00000000000000/// $Id: M16c60AdcC.nc,v 1.2 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "M16c60Adc.h" /** * HAL for the M16c60 A/D conversion susbsystem. * * @author Hu Siquan * @author David Gay */ configuration M16c60AdcC { provides { interface Resource[uint8_t client]; interface M16c60AdcSingle; interface M16c60AdcMultiple; } uses interface ResourceConfigure[uint8_t client]; } implementation { components M16c60AdcP, HplM16c60AdcC, PlatformC, MainC, new RoundRobinArbiterC(UQ_M16c60ADC_RESOURCE) as AdcArbiter, new AsyncStdControlPowerManagerC() as PM; Resource = AdcArbiter; ResourceConfigure = AdcArbiter; M16c60AdcSingle = M16c60AdcP; M16c60AdcMultiple = M16c60AdcP; PlatformC.SubInit -> M16c60AdcP; M16c60AdcP.HplM16c60Adc -> HplM16c60AdcC; //M16c60AdcP.M16c60Calibrate -> PlatformC; PM.AsyncStdControl -> M16c60AdcP; PM.ResourceDefaultOwner -> AdcArbiter; } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/M16c60AdcConfig.nc000077500000000000000000000022251207233610700222770ustar00rootroot00000000000000/* $Id: M16c60AdcConfig.nc,v 1.1 2009-09-07 14:12:25 r-studio Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "M16c60Adc.h" /** * Clients of higher level must provide this interface to * specify which channel to sample, and with what parameters. * * @author Fan Zang */ interface M16c60AdcConfig { /** * Obtain channel. * @return The A/D channel to use. Must be one of the M16c60_ADC_CHL_xxx * values from M16c60Adc.h. */ async command uint8_t getChannel(); /** * Obtain precision setting. * @return The number of bits, valid values depend on mcu model. */ async command uint8_t getPrecision(); /** * Obtain prescaler value. * @return The prescaler value to use. Must be one of the * M16c60_ADC_PRESCALE_xxx values from M16c60Adc.h. */ async command uint8_t getPrescaler(); } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/M16c60AdcMultiple.nc000077500000000000000000000135541207233610700226740ustar00rootroot00000000000000/// $Id: M16c60AdcMultiple.nc,v 1.2 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Hardware Abstraction Layer interface of Atmega128 for acquiring data * from multiple channels using the ATmega128's free-running mode. *

      * Because of the possibility that samples may be imprecise after * switching channels and/or reference voltages, and because there * is a one sample delay on swithcing channels and reference voltages, * M16c60ADCMultiple is complex. Two straightforward uses are: *

        *
      1. Acquire N samples from channel C: *
          *
        1. call getData to start sampling on channel C at the desired rate * (note that the choice of prescalers is very limited, so you * don't have many choices for sampling rate) *
        2. ignore the first dataReady event *
        3. use the results of the next N dataReady() events, return FALSE * on the last one *
        *
      2. Acquire one sample each from channels C1, ..., Cn (this pseudocode * assumes that none of these channels are differential) *
          *
        1. call getData to start sampling on channel C1 *
        2. on the ith dataReady event switch to channel Ci+1 by changing * *newChannel *
        3. the data passed to the ith dataReady event is for channel Ci-1 * (the data from the first dataReady event is ignored) *
        *
      * * @author Hu Siquan * @author David Gay */ #include "M16c60Adc.h" interface M16c60AdcMultiple { /** * Initiates free-running ADC conversions, with the ability to switch * channels and reference-voltage with a one sample delay. * * @param channel Initial A/D conversion channel. The channel can * be changed in the dataReady event, though these changes happen * with a one-sample delay (this is a hardware restriction). * @param refVoltage Initial A/D reference voltage. See the * M16c60_ADC_VREF_xxx constants in M16c60ADC.h. Like the channel, * the reference voltage can be changed in the dataReady event with * a one-sample delay. * @param leftJustify TRUE to place A/D result in high-order bits * (i.e., shifted left by 6 bits), low to place it in the low-order bits * @param prescaler Prescaler value for the A/D conversion clock. If you * specify M16c60_ADC_PRESCALE, a prescaler will be chosen that guarantees * full precision. Other prescalers can be used to get faster conversions. * See the ATmega128 manual for details. * @return TRUE if the conversion will be precise, FALSE if it will be * imprecise (due to a change in reference voltage, or switching to a * differential input channel) */ async command bool getData(uint8_t channel, uint8_t precision, uint8_t prescaler); /** * Returns the next sample in a free-running conversion. Allow the user * to switch channels and/or reference voltages with a one sample delay. * * @param data a 2 byte unsigned data value sampled by the ADC. * @param precise if this conversion was precise, FALSE if it wasn't * (we assume that the second conversion after a change of reference * voltage or after switching to a differential channel is precise) * @param channel Channel this sample was from. * @param newChannel Change this parameter to switch to a new channel * for the second next sample. * @param newRefVoltage Change this parameter to change the reference * voltage for the second next sample. * * @return TRUE to continue sampling, FALSE to stop. */ async event bool dataReady(uint16_t data, bool precise, uint8_t channel, uint8_t *newChannel, uint8_t *newRefVoltage); /* Note: there is no cancel in free-running mode because you cannot tell from a successful (or unsuccessful) cancellation whether there will be another dataReady event. Thus you cannot tell when you can safely reuse the ADC (short of waiting one ADC conversion period, in which case you might as well use the result of dataReady to cancel). */ } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/M16c60AdcP.nc000077500000000000000000000207111207233610700212710ustar00rootroot00000000000000/* $Id: M16c60AdcP.nc,v 1.2 2010-06-29 22:07:45 scipio Exp $ * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "M16c60Adc.h" /** * Internal component of the M16c60 A/D HAL. * * @author Fan Zhang */ module M16c60AdcP { provides { interface Init; interface AsyncStdControl; interface M16c60AdcSingle; interface M16c60AdcMultiple; } uses { interface HplM16c60Adc; //interface M16c60Calibrate; } } implementation { /* type change from uint8_t to M16c60ADCON0_t, this function is defined at m16c60hardware.h */ DEFINE_UNION_CAST(int2ADCON0, uint8_t, M16c60ADCON0_t); // DEFINE_UNION_CAST(int2ADCON1, uint8_t, M16c60ADCON1_t); DEFINE_UNION_CAST(int2ADCON2, uint8_t, M16c60ADCON2_t); command error_t Init.init() { atomic { M16c60ADCON0_t adcon_0; M16c60ADCON1_t adcon_1; M16c60ADCON2_t adcon_2; adcon_0 = int2ADCON0(0x00); adcon_0 = int2ADCON0(0x20); adcon_0 = int2ADCON0(0x01); call HplM16c60Adc.setADCON0(adcon_0); call HplM16c60Adc.setADCON1(adcon_1); call HplM16c60Adc.setADCON2(adcon_2); } return SUCCESS; } /* We enable the A/D when start is called, and disable it when stop is called. This drops A/D conversion latency by a factor of two (but increases idle mode power consumption a little). */ async command error_t AsyncStdControl.start() { atomic call HplM16c60Adc.enableAdc(); return SUCCESS; } async command error_t AsyncStdControl.stop() { atomic call HplM16c60Adc.disableAdc(); return SUCCESS; } /* Return TRUE if switching to 'channel' with reference voltage 'refVoltage' will give a precise result (the first sample after changing reference voltage or switching to/between a differential channel is imprecise) */ inline bool isPrecise(uint8_t admux, uint8_t channel, uint8_t refVoltage) { return TRUE; } /** * Indicates a sample has been recorded by the ADC as the result * of a ADC interrupt. * * @param data a 2 byte unsigned data value sampled by the ADC. * @param precise if the conversion precise, FALSE if it wasn't. */ async event void HplM16c60Adc.dataReady(uint16_t data) { /* A single sample. Disable the ADC interrupt to avoid starting a new sample at the next "sleep" instruction. */ call HplM16c60Adc.disableInterruption(); call HplM16c60Adc.disableAdc(); signal M16c60AdcSingle.dataReady(data, TRUE); } /* Start sampling based on request parameters * one-shot mode default * refVoltage default */ void getData(uint8_t channel,uint8_t precision, uint8_t prescaler) { M16c60ADCON0_t adcon0_t; M16c60ADCON1_t adcon1_t; M16c60ADCON2_t adcon2_t; if(channel < M16c60_ADC_CHL_AN10) { adcon2_t.adgsel01 = 0; } else if((channel > M16c60_ADC_CHL_AN7) && (channel <= M16c60_ADC_CHL_AN17)) { adcon2_t.adgsel01 = 2; channel=channel-8; } adcon0_t.ch012 = channel; adcon0_t.md01 = 0; adcon0_t.trg = 0; adcon0_t.adst = M16c60_ADC_START_CONVERSION_ON; adcon1_t.md2 = 0; if(precision == M16c60_ADC_PRECISION_10BIT) // 10-bit mode { adcon1_t.bits = 1; } else { adcon1_t.bits = 0; } adcon1_t.vcut = M16c60_ADC_ENABLE_ON; adcon1_t.opa01 = 0; adcon2_t.smp = 1; // sample and hold if(prescaler == 0x00){adcon2_t.cks2=0;adcon1_t.cks1=0;adcon0_t.cks0=0;} // fAD/4 prescaler else if(prescaler == 0x01){adcon2_t.cks2=0;adcon1_t.cks1=0;adcon0_t.cks0=1;} // fAD/2 prescaler else if((prescaler == 0x02) || (prescaler == 0x03)){adcon2_t.cks2=0;adcon1_t.cks1=1;adcon0_t.cks0=0;} // fAD prescaler else if(prescaler == 0x04){adcon2_t.cks2=1;adcon1_t.cks1=0;adcon0_t.cks0=0;} // fAD/12 prescaler else if(prescaler == 0x05){adcon2_t.cks2=1;adcon1_t.cks1=0;adcon0_t.cks0=1;} // fAD/6 prescaler else if((prescaler == 0x06) || (prescaler == 0x07)){adcon2_t.cks2=1;adcon1_t.cks1=1;adcon0_t.cks0=0;} // fAD/3 prescaler call HplM16c60Adc.enableInterruption(); call HplM16c60Adc.setADCON2(adcon2_t); call HplM16c60Adc.setADCON1(adcon1_t); call HplM16c60Adc.setADCON0(adcon0_t); } async command bool M16c60AdcSingle.getData(uint8_t channel, uint8_t precision, uint8_t prescaler) { atomic { getData(channel, precision, prescaler); return TRUE; } } async command bool M16c60AdcSingle.cancel() { /* There is no M16c60AdcMultiple.cancel, for reasons discussed in that interface */ return call HplM16c60Adc.cancel(); } async command bool M16c60AdcMultiple.getData(uint8_t channel, uint8_t precision, uint8_t prescaler) { atomic { getData(channel, precision, prescaler); return TRUE; } } default async event void M16c60AdcSingle.dataReady(uint16_t data, bool precise) { } default async event bool M16c60AdcMultiple.dataReady(uint16_t data, bool precise, uint8_t channel, uint8_t *newChannel, uint8_t *newRefVoltage) { return FALSE; // stop conversion if we somehow end up here. } } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/M16c60AdcPlatform.nc000066400000000000000000000001371207233610700226530ustar00rootroot00000000000000interface M16c60AdcPlatform { async command void adcOn(); async command void adcOff(); }tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/M16c60AdcSingle.nc000077500000000000000000000074761207233610700223300ustar00rootroot00000000000000/// $Id: M16c60AdcSingle.nc,v 1.2 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Hardware Abstraction Layer interface of M16c60 for acquiring * a one-shot sampling from a channel. * * @author Fan Zhang */ #include "M16c60Adc.h" interface M16c60AdcSingle { /** * Initiates an ADC conversion on a given channel. * * @param channel A/D conversion channel. * @param refVoltage Select reference voltage for A/D conversion. See * the M16c60_ADC_VREF_xxx constants in M16c60ADC.h * @param precision 8 to place A/D result in 8 bits, 10 to place it in * the 10 bits * @param prescaler Prescaler value for the A/D conversion clock. If you * specify M16c60_ADC_PRESCALE, a prescaler will be chosen that guarantees * full precision. Other prescalers can be used to get faster conversions. * See the M16c60 manual for details. * @return TRUE if the conversion will be precise, FALSE if it will be * imprecise (due to a change in refernce voltage, or switching to a * differential input channel) */ async command bool getData(uint8_t channel, uint8_t precision, uint8_t prescaler); /** * Indicates a sample has been recorded by the ADC as the result * of a getData() command. * * @param data a 2 byte unsigned data value sampled by the ADC. * @param precise if the conversion precise, FALSE if it wasn't. This * values matches the result from the getData call. */ async event void dataReady(uint16_t data, bool precise); /** * Cancel an outstanding getData operation. Use with care, to * avoid problems with races between the dataReady event and cancel. * @return TRUE if a conversion was in-progress or an interrupt * was pending. dataReady will not be signaled. FALSE if the * conversion was already complete. dataReady will be (or has * already been) signaled. */ async command bool cancel(); } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/WireAdcP.nc000077500000000000000000000020631207233610700213230ustar00rootroot00000000000000/* $Id: WireAdcP.nc,v 1.1 2009-09-07 14:12:25 r-studio Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Support component for AdcReadClientC and AdcReadNowClientC. * * @author David Gay */ configuration WireAdcP { provides { interface Read[uint8_t client]; interface ReadNow[uint8_t client]; } uses { interface M16c60AdcConfig[uint8_t client]; interface Resource[uint8_t client]; } } implementation { components M16c60AdcC, AdcP, new ArbitratedReadC(uint16_t) as ArbitrateRead; Read = ArbitrateRead; ReadNow = AdcP; Resource = ArbitrateRead.Resource; M16c60AdcConfig = AdcP; // provide default M16c60AdcConfig interface ArbitrateRead.Service -> AdcP.Read; AdcP.M16c60AdcSingle -> M16c60AdcC; } tinyos-2.1.2+dfsg/tos/chips/m16c60/adc/WireAdcStreamP.nc000077500000000000000000000023051207233610700224760ustar00rootroot00000000000000/* $Id: WireAdcStreamP.nc,v 1.1 2009-09-07 14:12:25 r-studio Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Support component for AdcReadStreamClientC. * * @author Fan Zhang */ #include "Adc.h" configuration WireAdcStreamP { provides interface ReadStream[uint8_t client]; uses { interface M16c60AdcConfig[uint8_t client]; interface Resource[uint8_t client]; } } implementation { components M16c60AdcC, AdcStreamP, PlatformC, MainC, new AlarmMicro32C(), new ArbitratedReadStreamC(uniqueCount(UQ_ADC_READSTREAM), uint16_t) as ArbitrateReadStream; Resource = ArbitrateReadStream; ReadStream = ArbitrateReadStream; M16c60AdcConfig = AdcStreamP; ArbitrateReadStream.Service -> AdcStreamP; AdcStreamP.Init <- MainC; AdcStreamP.M16c60AdcSingle -> M16c60AdcC; //AdcStreamP.M16c60Calibrate -> PlatformC; AdcStreamP.Alarm -> AlarmMicro32C; } tinyos-2.1.2+dfsg/tos/chips/m16c60/bits.h000077500000000000000000000047021207233610700177300ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __BITS_H__ #define __BITS_H__ #define BIT0 0x1 #define BIT1 0x2 #define BIT2 0x4 #define BIT3 0x8 #define BIT4 0x10 #define BIT5 0x20 #define BIT6 0x40 #define BIT7 0x80 #define BIT8 0x100 #define BIT9 0x200 #define BIT10 0x400 #define BIT11 0x800 #define BIT12 0x1000 #define BIT13 0x2000 #define BIT14 0x4000 #define BIT15 0x8000 #define BIT16 0x10000 #define BIT17 0x20000 #define BIT18 0x40000 #define BIT19 0x80000 #define BIT20 0x100000 #define BIT21 0x200000 #define BIT22 0x400000 #define BIT23 0x800000 #define BIT24 0x1000000 #define BIT25 0x2000000 #define BIT26 0x4000000 #define BIT27 0x8000000 #define BIT28 0x10000000 #define BIT29 0x20000000 #define BIT30 0x40000000 #define BIT31 0x80000000 #endif // __BITS_H__ tinyos-2.1.2+dfsg/tos/chips/m16c60/control/000077500000000000000000000000001207233610700202705ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/m16c60/control/M16c60Control.h000066400000000000000000000052471207233610700226660ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This file includes defines to be used together with the control interfaces * for the M16c/60 mcu. * * @author Henrik Makitaavola */ #ifndef __M16C60_CONTROL_H__ #define __M16C60_CONTROL_H__ #define UQ_M16C60_STOP_MODE_CONTROL "UQ_M16C60_STOP_MODE_CONTROL" #define UQ_M16C60_SYSTEM_CLOCK_CONTROL "UQ_M16C60_SYSTEM_CLOCK_CONTROL" /** * Input to SystemClockControl.minSpeed() and * M16c60Control.defaultSystemClock(). */ typedef enum { M16C60_DONT_CARE = 0x0, M16C60_SUB_CLOCK = 0x1, M16C60_MAIN_CLOCK_DIV_0 = 0x2, M16C60_MAIN_CLOCK_DIV_2 = 0x4, M16C60_MAIN_CLOCK_DIV_4 = 0x8, M16C60_MAIN_CLOCK_DIV_8 = 0x9, M16C60_MAIN_CLOCK_DIV_16 = 0xc, M16C60_PLL_CLOCK = 0xd, } M16c60SystemClock; /** * The different PLL multipliers supported by the M16c/60 mcu. */ typedef enum { M16C60_PLL_2 = 0x1, M16C60_PLL_4 = 0x2, M16C60_PLL_6 = 0x3, M16C60_PLL_8 = 0x4 } M16c60PLLMultiplier; #endif // __M16C60_CONTROL_H__ tinyos-2.1.2+dfsg/tos/chips/m16c60/control/M16c60Control.nc000077500000000000000000000043461207233610700230410ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to initialize, put the M16c/60 to sleep and default system speed. * * @author Henrik Makitaavola */ #include "M16c60Control.h" interface M16c60Control { /** * Initializes the mcu. */ command error_t init(); /** * Sets the default system clock speed. * * @param def Default system speed ( != M16C60_DONT_CARE) */ command error_t defaultSystemClock(M16c60SystemClock def); /** * Put the mcu to sleep. */ async command void sleep(); } tinyos-2.1.2+dfsg/tos/chips/m16c60/control/M16c60ControlC.nc000077500000000000000000000040651207233610700231420ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Wiring for the M16c60ControlP module. * * @author Henrik Makitaavola */ configuration M16c60ControlC { provides interface M16c60Control; } implementation { components M16c60ControlP, M16c60ControlPlatformC; M16c60Control = M16c60ControlP; M16c60ControlP.PlatformCtrl -> M16c60ControlPlatformC; } tinyos-2.1.2+dfsg/tos/chips/m16c60/control/M16c60ControlP.nc000077500000000000000000000244351207233610700231620ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the Control Interfaces for the M16c/60 mcu. * * @author Henrik Makitaavola */ #include "M16c60Control.h" module M16c60ControlP { provides interface M16c60Control; provides interface StopModeControl[uint8_t client]; provides interface SystemClockControl[uint8_t client]; uses interface M16c60ControlPlatform as PlatformCtrl; } implementation { M16c60SystemClock default_system_clock = M16C60_MAIN_CLOCK_DIV_0; // Default system clock speed M16c60SystemClock system_clock = M16C60_DONT_CARE; uint8_t client_system_clock[uniqueCount(UQ_M16C60_SYSTEM_CLOCK_CONTROL)]; uint8_t num_system_clock_clients = uniqueCount(UQ_M16C60_SYSTEM_CLOCK_CONTROL); // Take +1 incase of rest in the division uint8_t client_allow_stop_mode[(uniqueCount(UQ_M16C60_STOP_MODE_CONTROL)/8) + 1]; uint8_t num_allow_stop_mode_clients = uniqueCount(UQ_M16C60_STOP_MODE_CONTROL); bool update_sleep_mode = false; bool allow_stop_mode = true; // Stop mode enabled/disabled, Default: Enabled. void PLLOn() { uint8_t tmp; uint32_t i; CM0.BYTE = 0x08; // Main clock + Sub clock. CM1.BYTE = 0x20; //Clear previous cpu speed setting. PM2.BYTE = 0x00; // PLL > 16MHz (2 waits). tmp = 0x90 + PLL_MULTIPLIER; PLC0.BYTE = tmp; // PLL ON. // Wait for PLL to become stable (50 ms). // TODO (henrik) Make this more efficient when time allows it.For example // use timers or busy waiting. // Tried busy waiting but tosboot started to include alot of // things that it shouldn't which lead to compile errors. for (i = 0; i < 50000UL * MAIN_CRYSTAL_SPEED; ++i) asm volatile("nop"); CM1.BYTE = 0x22; // PLL as system clock. call PlatformCtrl.PLLOn(); } void PLLOff() { uint8_t tmp; CLR_BIT(CM1.BYTE, 1); // Main clock tmp = 0x10 + PLL_MULTIPLIER; PLC0.BYTE = tmp; // Turn off PLL clock call PlatformCtrl.PLLOff(); } error_t setSystemClock(M16c60SystemClock set_clock) { M16c60SystemClock clock = set_clock; atomic { if (clock == M16C60_DONT_CARE) { clock = default_system_clock; } PRCR.BYTE = BIT1 | BIT0; // Turn off protection for cpu & clock register. if (system_clock == M16C60_PLL_CLOCK) { PLLOff(); } // Set correct system clock speed. if (clock == M16C60_MAIN_CLOCK_DIV_8) { SET_BIT(CM0.BYTE, 6); } else if (clock >= M16C60_MAIN_CLOCK_DIV_0 && clock <= M16C60_MAIN_CLOCK_DIV_16) { // Main clock divided by 0, 2 ,4 or 16 CLR_BIT(CM0.BYTE, 6); // Remove division by 8 CLR_FLAG(CM1.BYTE, (0x3 << 6)); // Clear previous cpu speed setting SET_FLAG(CM1.BYTE, ((clock >> 2) << 6)); // New cpu speed } else if (clock == M16C60_SUB_CLOCK) { SET_BIT(CM0.BYTE, 4); // Sub clock on. SET_BIT(CM0.BYTE, 7); // Sub clock as CPU clock } else if (clock == M16C60_PLL_CLOCK) { PLLOn(); } // TODO(Henrik) Maybe need to wait for a while to make sure that the // crystals are stable? CLR_BIT(CM1.BYTE, 5); // Low drive on Xin-Xout. CLR_BIT(CM0.BYTE, 3); // Low drive on XCin-XCout. PRCR.BYTE = 0; // Turn on protection on all registers. atomic system_clock = set_clock; return SUCCESS; } } error_t updateSystemClock() { M16c60SystemClock clock = M16C60_DONT_CARE; uint8_t i; atomic { for (i = 0; i < num_system_clock_clients; ++i) { if (clock < client_system_clock[i]) { clock = client_system_clock[i]; } } if (clock == system_clock) { return SUCCESS; } return setSystemClock(clock); } } void initPin(volatile uint8_t *port, volatile uint8_t *port_d, uint8_t pin, uint16_t state) { uint8_t inactive = (state >> (pin*2)) & 0x3; // Turn off protection of PD9 PRCR.BYTE = BIT2; switch (inactive) { case M16C_PIN_INACTIVE_DONT_CARE: break; case M16C_PIN_INACTIVE_OUTPUT_LOW: SET_BIT((*port_d), pin); CLR_BIT((*port), pin); break; case M16C_PIN_INACTIVE_OUTPUT_HIGH: SET_BIT((*port_d), pin); SET_BIT((*port), pin); break; case M16C_PIN_INACTIVE_INPUT: CLR_BIT((*port_d), pin); CLR_BIT((*port), pin); break; } PRCR.BYTE = 0; } void initPort(volatile uint8_t *port, volatile uint8_t *port_d, uint16_t state) { initPin(port, port_d, 0, state); initPin(port, port_d, 1, state); initPin(port, port_d, 2, state); initPin(port, port_d, 3, state); initPin(port, port_d, 4, state); initPin(port, port_d, 5, state); initPin(port, port_d, 6, state); initPin(port, port_d, 7, state); } void initPins() { initPort(&P0.BYTE, &PD0.BYTE, PORT_P0_INACTIVE_STATE); initPort(&P1.BYTE, &PD1.BYTE, PORT_P1_INACTIVE_STATE); initPort(&P2.BYTE, &PD2.BYTE, PORT_P2_INACTIVE_STATE); initPort(&P3.BYTE, &PD3.BYTE, PORT_P3_INACTIVE_STATE); initPort(&P4.BYTE, &PD4.BYTE, PORT_P4_INACTIVE_STATE); initPort(&P5.BYTE, &PD5.BYTE, PORT_P5_INACTIVE_STATE); initPort(&P6.BYTE, &PD6.BYTE, PORT_P6_INACTIVE_STATE); initPort(&P7.BYTE, &PD7.BYTE, PORT_P7_INACTIVE_STATE); initPort(&P8.BYTE, &PD8.BYTE, PORT_P8_INACTIVE_STATE); initPort(&P9.BYTE, &PD9.BYTE, PORT_P9_INACTIVE_STATE); initPort(&P10.BYTE, &PD10.BYTE, PORT_P_10_INACTIVE_STATE); } command error_t M16c60Control.init() { uint8_t i; uint8_t tmp; initPins(); PRCR.BYTE = BIT1 | BIT0; // Turn off protection for cpu & clock register. PM0.BYTE = BIT7; // Single Chip mode. No BCLK output. PM1.BYTE = BIT3; // Expand internal memory, no global wait state. PCLKR.BIT.PCLK0 = 1; // Set Timer A and B clock bit to F1 PCLKR.BIT.PCLK1 = 1; // Set Timer A and B clock bit to F1 tmp = 0x10 + PLL_MULTIPLIER; // Prepare PLL multiplier PLC0.BYTE = tmp; // Set PLL multiplier PRCR.BYTE = 0; // Initialize the clock and stop mode control arrays. for (i = 0; i < num_system_clock_clients; ++i) { client_system_clock[i] = M16C60_DONT_CARE; } for (i = 0; i < (num_allow_stop_mode_clients/8) + 1; ++i) { client_allow_stop_mode[i] = 0xFF; } return setSystemClock(M16C60_DONT_CARE); } command error_t M16c60Control.defaultSystemClock( M16c60SystemClock def) { if (def == M16C60_DONT_CARE) { return FAIL; } if (def == default_system_clock || system_clock != M16C60_DONT_CARE) { default_system_clock = def; return SUCCESS; } default_system_clock = def; return setSystemClock(M16C60_DONT_CARE); } void updateSleepMode() { uint8_t i; for (i = 0; i < (num_allow_stop_mode_clients/8) + 1; ++i) { if (client_allow_stop_mode[i] != 0xFF) { allow_stop_mode = false; return; } } allow_stop_mode = true; } void waitMode() { __nesc_enable_interrupt(); asm ("wait"); asm volatile ("" : : : "memory"); __nesc_disable_interrupt(); } void stopMode() { uint8_t cm0_tmp, cm1_tmp; __nesc_enable_interrupt(); PRCR.BYTE = 1; // Turn off protection of system clock control registers CLR_BIT(CM2.BYTE, 0); cm0_tmp = CM0.BYTE; cm1_tmp = CM1.BYTE; CM0.BYTE = 0b00001000; asm("bset 0,0x0007"); // Enter stop mode asm("jmp.b MAIN_A"); asm("MAIN_A:"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile ("" : : : "memory"); __nesc_disable_interrupt(); CM0.BYTE = cm0_tmp; CM1.BYTE = cm1_tmp; PRCR.BIT.PRC0 = 0; // Turn on protection of system clock control registers } async command void M16c60Control.sleep() { atomic if (update_sleep_mode) { updateSleepMode(); } if (allow_stop_mode && system_clock != M16C60_PLL_CLOCK) { stopMode(); } else { waitMode(); } } async command void StopModeControl.allowStopMode[uint8_t client](bool allow) { atomic { WRITE_BIT(client_allow_stop_mode[client >> 3], client % 8, allow); if (allow != allow_stop_mode) { update_sleep_mode = true; } } } command error_t SystemClockControl.minSpeed[uint8_t client]( M16c60SystemClock speed) { atomic client_system_clock[client] = speed; atomic if (system_clock < speed) { return updateSystemClock(); } return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/m16c60/control/M16c60ControlPlatform.nc000066400000000000000000000042651207233610700245430ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to signal the platform that the mcu has changed the main clock * speed, PLL is being turned on/off, etc. * Needed so that the platform can take appropriate actions so * that timers can be set to handle the PLL for example. * * @author Henrik Makitaavola */ interface M16c60ControlPlatform { /** * PLL is turned on. */ async command void PLLOn(); /** * PLL is turned off. */ async command void PLLOff(); } tinyos-2.1.2+dfsg/tos/chips/m16c60/control/StopModeControl.nc000066400000000000000000000040761207233610700237140ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface used by components to signal if it * allows the mcu to go into stop mode. * * @author Henrik Makitaavola */ interface StopModeControl { /** * Tells the mcu if it is allowed to go into stop mode. * * @param allow True if stop mode is allowed. */ async command void allowStopMode(bool allow); } tinyos-2.1.2+dfsg/tos/chips/m16c60/control/StopModeControlC.nc000066400000000000000000000042651207233610700240170ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "M16c60Control.h" /** * All components that need to control the mcus sleep * mode should instantiate a component of this configuration. * * @author Henrik Makitaavola */ generic configuration StopModeControlC() { provides interface StopModeControl; } implementation { enum { CLIENT_ID = unique(UQ_M16C60_STOP_MODE_CONTROL), }; components M16c60ControlP; StopModeControl = M16c60ControlP.StopModeControl[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/chips/m16c60/control/SystemClockControl.nc000066400000000000000000000040311207233610700244110ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to control the allowed minimum speed of the mcu. * * @author Henrik Makitaavola */ interface SystemClockControl { /** * Control the minimum speed of the mcu. * * @param speed The allowed minimum speed. */ command error_t minSpeed(M16c60SystemClock speed); } tinyos-2.1.2+dfsg/tos/chips/m16c60/control/SystemClockControlC.nc000066400000000000000000000043231207233610700245200ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "M16c60Control.h" /** * Every component that needs to control the minimum speed * of the mcu should instantiate a new component of this configuration. * * @author Henrik Makitaavola */ generic configuration SystemClockControlC() { provides interface SystemClockControl; } implementation { enum { CLIENT_ID = unique(UQ_M16C60_SYSTEM_CLOCK_CONTROL), }; components M16c60ControlP; SystemClockControl = M16c60ControlP.SystemClockControl[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/chips/m16c60/dac/000077500000000000000000000000001207233610700173375ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/m16c60/dac/HplM16c60Dac.nc000077500000000000000000000012361207233610700216160ustar00rootroot00000000000000/** * HPL interface to the M16c60 D/A converers. * * @author Henrik Makitaavola */ interface HplM16c60Dac { /** * Sets the D/A value. * @param value The new D/A value */ async command void setValue(uint8_t value); /** * Reads the current D/A value. * @return D/A value */ async command uint8_t getValue(); /** * Enables the D/A converter. */ async command void enable(); /** * Disables the D/A converter. */ async command void disable(); /** * Checks the state of the D/A converter. * @return TRUE if the D/A converter is enabled. */ async command bool isEnabled(); } tinyos-2.1.2+dfsg/tos/chips/m16c60/dac/HplM16c60DacC.nc000077500000000000000000000006351207233610700217230ustar00rootroot00000000000000/** * HPL for the M16c60 D/A conversion susbsystem. * * @author Henrik Makitaavola */ configuration HplM16c60DacC { provides interface HplM16c60Dac as Dac0; provides interface HplM16c60Dac as Dac1; } implementation { components new HplM16c60DacP((uint16_t)&DA0, 0) as Dac0_, new HplM16c60DacP((uint16_t)&DA1, 1) as Dac1_; Dac0 = Dac0_; Dac1 = Dac1_; } tinyos-2.1.2+dfsg/tos/chips/m16c60/dac/HplM16c60DacP.nc000077500000000000000000000013511207233610700217340ustar00rootroot00000000000000/** * HPL for the M16c60 A/D conversion susbsystem. * * @author Fan Zhang * */ generic module HplM16c60DacP(uint16_t da_addr, uint8_t da_num) { provides interface HplM16c60Dac; } implementation { #define da (*TCAST(volatile uint8_t* ONE, da_addr)) async command void HplM16c60Dac.setValue(uint8_t value) { da = value; } async command uint8_t HplM16c60Dac.getValue() { return da; } async command void HplM16c60Dac.enable() { SET_BIT(DACON.BYTE, da_num); } async command void HplM16c60Dac.disable() { CLR_BIT(DACON.BYTE, da_num); } async command bool HplM16c60Dac.isEnabled() { return (READ_BIT(DACON.BYTE, da_num) ? true : false); } } tinyos-2.1.2+dfsg/tos/chips/m16c60/interrupts.h000077500000000000000000000072641207233610700212140ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * M16C interrupt id defines. * * @author Per Lindgren * @author Johan Eriksson * @author Johan Nordlander * @author Simon Aittamaa. */ #ifndef M16C_INTERRUPTS_H_ #define M16C_INTERRUPTS_H_ /* Software interrupts - bound to peripheral hardware */ #define M16C_BRK 0 #define M16C_INT3 4 #define M16C_TMRB5 5 #define M16C_TMRB4 6 #define M16C_UART1_BCD 6 #define M16C_TMRB3 7 #define M16C_UART0_BCD 7 #define M16C_INT5 8 #define M16C_SI_O4 8 #define M16C_INT4 9 #define M16C_SI_O3 9 #define M16C_UART2_BCD 10 #define M16C_DMA0 11 #define M16C_DMA1 12 #define M16C_KEY 13 #define M16C_AD 14 #define M16C_UART2_NACK 15 #define M16C_UART2_ACK 16 #define M16C_UART0_NACK 17 #define M16C_UART0_ACK 18 #define M16C_UART1_NACK 19 #define M16C_UART1_ACK 20 #define M16C_TMRA0 21 #define M16C_TMRA1 22 #define M16C_TMRA2 23 #define M16C_TMRA3 24 #define M16C_TMRA4 25 #define M16C_TMRB0 26 #define M16C_TMRB1 27 #define M16C_TMRB2 28 #define M16C_INT0 29 #define M16C_INT1 30 #define M16C_INT2 31 /* Software interrupts - not bound to peripheral hardware */ #define M16C_SINT0 32 #define M16C_SINT1 33 #define M16C_SINT2 34 #define M16C_SINT3 35 #define M16C_SINT4 36 #define M16C_SINT5 37 #define M16C_SINT6 38 #define M16C_SINT7 39 #define M16C_SINT8 40 #define M16C_SINT9 41 #define M16C_SINT10 42 #define M16C_SINT11 43 #define M16C_SINT12 44 #define M16C_SINT13 45 #define M16C_SINT14 46 #define M16C_SINT15 47 #define M16C_SINT16 48 #define M16C_SINT17 49 #define M16C_SINT18 50 #define M16C_SINT19 51 #define M16C_SINT20 52 #define M16C_SINT21 53 #define M16C_SINT22 54 #define M16C_SINT23 55 #define M16C_SINT24 56 #define M16C_SINT25 57 #define M16C_SINT26 58 #define M16C_SINT27 59 #define M16C_SINT28 60 #define M16C_SINT29 61 #define M16C_SINT30 62 #define M16C_SINT31 63 /* Interrupt macro */ #define _M16C_INTERRUPT(id) _vector_##id #define M16C_INTERRUPT(id) \ void __attribute__((interrupt)) _M16C_INTERRUPT(id)(void) #endif tinyos-2.1.2+dfsg/tos/chips/m16c60/m16c60hardware.h000077500000000000000000000145171207233610700214260ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Some M16c/60 needed macros and defines. * * @author Henrik Makitaavola * @author Fan Zhang */ #ifndef __M16C60HARDWARE_H__ #define __M16C60HARDWARE_H__ #include "interrupts.h" #include "m16c60.h" // Include header for mcu model. #include "bits.h" #include "uart/M16c60Uart.h" #include "pins/M16c60Pin.h" #include "adc/M16c60Adc.h" #define true TRUE #define false FALSE //Bit operators using bit number #define _BV(bit) (1 << bit) #define SET_BIT(port, bit) ((port) |= _BV(bit)) #define CLR_BIT(port, bit) ((port) &= ~_BV(bit)) #define READ_BIT(port, bit) (((port) & _BV(bit)) != 0) #define FLIP_BIT(port, bit) ((port) ^= _BV(bit)) #define WRITE_BIT(port, bit, value) \ if (value) SET_BIT((port), (bit)); \ else CLR_BIT((port), (bit)) // Bit operators using bit flag mask #define SET_FLAG(port, flag) ((port) |= (flag)) #define CLR_FLAG(port, flag) ((port) &= ~(flag)) #define READ_FLAG(port, flag) ((port) & (flag)) // We need slightly different defs than M16C_INTERRUPT // for interrupt handlers. #define M16C_INTERRUPT_HANDLER(id) \ M16C_INTERRUPT(id) @atomic_hwevent() @C() typedef float nx_float __attribute__((nx_base_be(afloat))); inline float __nesc_ntoh_afloat(const void *COUNT(sizeof(float)) source) @safe() { float f; memcpy(&f, source, sizeof(float)); return f; } inline float __nesc_hton_afloat(void *COUNT(sizeof(float)) target, float value) @safe() { memcpy(target, &value, sizeof(float)); return value; } // The mov instruction should be used when clearing the interrupt flag. // More information can be found in the manual for the MCU. inline void clear_interrupt(uint16_t interrupt_addr) { atomic { uint8_t tmp = (*TCAST(volatile uint8_t* ONE, interrupt_addr)); CLR_BIT(tmp, 3); asm("mov.w %[interrupt_addr], a0\n\t" "mov.b %[tmp], [a0]" : : [tmp] "r" (tmp) , [interrupt_addr] "r" (interrupt_addr) : "a0"); } } typedef uint8_t mcu_power_t @combine("ecombine"); mcu_power_t mcombine(mcu_power_t m1, mcu_power_t m2) { return (m1 < m2) ? m1: m2; } enum { M16C60_POWER_WAIT = 1, M16C60_POWER_STOP = 2, }; inline void __nesc_enable_interrupt(void) { asm("fset i"); } inline void __nesc_disable_interrupt(void) { asm("fclr i"); } // Macro to create union casting functions. #define DEFINE_UNION_CAST(func_name, from_type, to_type) \ to_type func_name(from_type x_type) { \ union {from_type f_type; to_type t_type;} c_type = {f_type:x_type}; return c_type.t_type; } typedef uint16_t __nesc_atomic_t; #ifndef NESC_BUILD_BINARY /** * Start atomic section. */ inline __nesc_atomic_t __nesc_atomic_start(void) @spontaneous() { __nesc_atomic_t result; // Save the flag register (FLG) asm volatile ("stc flg, %0": "=r"(result): : "%flg"); // Disable interrupts __nesc_disable_interrupt(); asm volatile("" : : : "memory"); // ensure atomic section effect visibility return result; } /** * End atomic section. */ inline void __nesc_atomic_end(__nesc_atomic_t original_FLG) @spontaneous() { // Restore the flag register (FLG) asm volatile("" : : : "memory"); // ensure atomic section effect visibility asm volatile ("ldc %0, flg": : "r"(original_FLG): "%flg"); } #endif // If the platform doesnt have defined any main crystal speed it will // get a default value of 16MHz #ifndef MAIN_CRYSTAL_SPEED #define MAIN_CRYSTAL_SPEED 16 /*MHZ*/ #endif // If the PLL_MULTIPLIER is not defined it will be default to M16C60_PLL_2. #ifndef PLL_MULTIPLIER #define PLL_MULTIPLIER M16C60_PLL_2 #endif // Default inactive pin states #ifndef PORT_P0_INACTIVE_STATE #define PORT_P0_INACTIVE_STATE M16C_PIN_INACTIVE_DONT_CARE #endif #ifndef PORT_P1_INACTIVE_STATE #define PORT_P1_INACTIVE_STATE M16C_PIN_INACTIVE_DONT_CARE #endif #ifndef PORT_P2_INACTIVE_STATE #define PORT_P2_INACTIVE_STATE M16C_PIN_INACTIVE_DONT_CARE #endif #ifndef PORT_P3_INACTIVE_STATE #define PORT_P3_INACTIVE_STATE M16C_PIN_INACTIVE_DONT_CARE #endif #ifndef PORT_P4_INACTIVE_STATE #define PORT_P4_INACTIVE_STATE M16C_PIN_INACTIVE_DONT_CARE #endif #ifndef PORT_P5_INACTIVE_STATE #define PORT_P5_INACTIVE_STATE M16C_PIN_INACTIVE_DONT_CARE #endif #ifndef PORT_P6_INACTIVE_STATE #define PORT_P6_INACTIVE_STATE M16C_PIN_INACTIVE_DONT_CARE #endif #ifndef PORT_P7_INACTIVE_STATE #define PORT_P7_INACTIVE_STATE M16C_PIN_INACTIVE_DONT_CARE #endif #ifndef PORT_P8_INACTIVE_STATE #define PORT_P8_INACTIVE_STATE M16C_PIN_INACTIVE_DONT_CARE #endif #ifndef PORT_P9_INACTIVE_STATE #define PORT_P9_INACTIVE_STATE M16C_PIN_INACTIVE_DONT_CARE #endif #ifndef PORT_P_10_INACTIVE_STATE #define PORT_P_10_INACTIVE_STATE M16C_PIN_INACTIVE_DONT_CARE #endif #endif // __M16C60HARDWARE_H__ tinyos-2.1.2+dfsg/tos/chips/m16c60/pins/000077500000000000000000000000001207233610700175615ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/m16c60/pins/HplM16c60GeneralIOC.nc000077500000000000000000000246621207233610700232710ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Martin Turon */ /** * The HplM16c60GeneralIOC configuration provides GeneralIO interfaces for all * the M16c/60's pins. * * @author Henrik Makitaavola */ configuration HplM16c60GeneralIOC { // provides all the ports as raw ports provides { interface GeneralIO as PortP00; interface GeneralIO as PortP01; interface GeneralIO as PortP02; interface GeneralIO as PortP03; interface GeneralIO as PortP04; interface GeneralIO as PortP05; interface GeneralIO as PortP06; interface GeneralIO as PortP07; interface GeneralIO as PortP10; interface GeneralIO as PortP11; interface GeneralIO as PortP12; interface GeneralIO as PortP13; interface GeneralIO as PortP14; interface GeneralIO as PortP15; interface GeneralIO as PortP16; interface GeneralIO as PortP17; interface GeneralIO as PortP20; interface GeneralIO as PortP21; interface GeneralIO as PortP22; interface GeneralIO as PortP23; interface GeneralIO as PortP24; interface GeneralIO as PortP25; interface GeneralIO as PortP26; interface GeneralIO as PortP27; interface GeneralIO as PortP30; interface GeneralIO as PortP31; interface GeneralIO as PortP32; interface GeneralIO as PortP33; interface GeneralIO as PortP34; interface GeneralIO as PortP35; interface GeneralIO as PortP36; interface GeneralIO as PortP37; interface GeneralIO as PortP40; interface GeneralIO as PortP41; interface GeneralIO as PortP42; interface GeneralIO as PortP43; interface GeneralIO as PortP44; interface GeneralIO as PortP45; interface GeneralIO as PortP46; interface GeneralIO as PortP47; interface GeneralIO as PortP50; interface GeneralIO as PortP51; interface GeneralIO as PortP52; interface GeneralIO as PortP53; interface GeneralIO as PortP54; interface GeneralIO as PortP55; interface GeneralIO as PortP56; interface GeneralIO as PortP57; interface GeneralIO as PortP60; interface GeneralIO as PortP61; interface GeneralIO as PortP62; interface GeneralIO as PortP63; interface GeneralIO as PortP64; interface GeneralIO as PortP65; interface GeneralIO as PortP66; interface GeneralIO as PortP67; interface GeneralIO as PortP70; interface GeneralIO as PortP71; interface GeneralIO as PortP72; interface GeneralIO as PortP73; interface GeneralIO as PortP74; interface GeneralIO as PortP75; interface GeneralIO as PortP76; interface GeneralIO as PortP77; interface GeneralIO as PortP80; interface GeneralIO as PortP81; interface GeneralIO as PortP82; interface GeneralIO as PortP83; interface GeneralIO as PortP84; interface GeneralIO as PortP85; interface GeneralIO as PortP86; interface GeneralIO as PortP87; interface GeneralIO as PortP90; interface GeneralIO as PortP91; interface GeneralIO as PortP92; interface GeneralIO as PortP93; interface GeneralIO as PortP94; interface GeneralIO as PortP95; interface GeneralIO as PortP96; interface GeneralIO as PortP97; interface GeneralIO as PortP100; interface GeneralIO as PortP101; interface GeneralIO as PortP102; interface GeneralIO as PortP103; interface GeneralIO as PortP104; interface GeneralIO as PortP105; interface GeneralIO as PortP106; interface GeneralIO as PortP107; } } implementation { components new HplM16c60GeneralIOPortP((uint16_t)&P0.BYTE, (uint16_t)&PD0.BYTE) as PortP0, new HplM16c60GeneralIOPortP((uint16_t)&P1.BYTE, (uint16_t)&PD1.BYTE) as PortP1, new HplM16c60GeneralIOPortP((uint16_t)&P2.BYTE, (uint16_t)&PD2.BYTE) as PortP2, new HplM16c60GeneralIOPortP((uint16_t)&P3.BYTE, (uint16_t)&PD3.BYTE) as PortP3, new HplM16c60GeneralIOPortP((uint16_t)&P4.BYTE, (uint16_t)&PD4.BYTE) as PortP4, new HplM16c60GeneralIOPortP((uint16_t)&P5.BYTE, (uint16_t)&PD5.BYTE) as PortP5, new HplM16c60GeneralIOPortP((uint16_t)&P6.BYTE, (uint16_t)&PD6.BYTE) as PortP6, new HplM16c60GeneralIOPortP((uint16_t)&P7.BYTE, (uint16_t)&PD7.BYTE) as PortP7, new HplM16c60GeneralIOPortP((uint16_t)&P8.BYTE, (uint16_t)&PD8.BYTE) as PortP8, new HplM16c60GeneralIOPortP((uint16_t)&P9.BYTE, (uint16_t)&PD9.BYTE) as PortP9, new HplM16c60GeneralIOPortP((uint16_t)&P10.BYTE, (uint16_t)&PD10.BYTE) as PortP_10; PortP00 = PortP0.Pin0; PortP01 = PortP0.Pin1; PortP02 = PortP0.Pin2; PortP03 = PortP0.Pin3; PortP04 = PortP0.Pin4; PortP05 = PortP0.Pin5; PortP06 = PortP0.Pin6; PortP07 = PortP0.Pin7; PortP10 = PortP1.Pin0; PortP11 = PortP1.Pin1; PortP12 = PortP1.Pin2; PortP13 = PortP1.Pin3; PortP14 = PortP1.Pin4; PortP15 = PortP1.Pin5; PortP16 = PortP1.Pin6; PortP17 = PortP1.Pin7; PortP20 = PortP2.Pin0; PortP21 = PortP2.Pin1; PortP22 = PortP2.Pin2; PortP23 = PortP2.Pin3; PortP24 = PortP2.Pin4; PortP25 = PortP2.Pin5; PortP26 = PortP2.Pin6; PortP27 = PortP2.Pin7; PortP30 = PortP3.Pin0; PortP31 = PortP3.Pin1; PortP32 = PortP3.Pin2; PortP33 = PortP3.Pin3; PortP34 = PortP3.Pin4; PortP35 = PortP3.Pin5; PortP36 = PortP3.Pin6; PortP37 = PortP3.Pin7; PortP40 = PortP4.Pin0; PortP41 = PortP4.Pin1; PortP42 = PortP4.Pin2; PortP43 = PortP4.Pin3; PortP44 = PortP4.Pin4; PortP45 = PortP4.Pin5; PortP46 = PortP4.Pin6; PortP47 = PortP4.Pin7; PortP50 = PortP5.Pin0; PortP51 = PortP5.Pin1; PortP52 = PortP5.Pin2; PortP53 = PortP5.Pin3; PortP54 = PortP5.Pin4; PortP55 = PortP5.Pin5; PortP56 = PortP5.Pin6; PortP57 = PortP5.Pin7; PortP60 = PortP6.Pin0; PortP61 = PortP6.Pin1; PortP62 = PortP6.Pin2; PortP63 = PortP6.Pin3; PortP64 = PortP6.Pin4; PortP65 = PortP6.Pin5; PortP66 = PortP6.Pin6; PortP67 = PortP6.Pin7; PortP70 = PortP7.Pin0; PortP71 = PortP7.Pin1; PortP72 = PortP7.Pin2; PortP73 = PortP7.Pin3; PortP74 = PortP7.Pin4; PortP75 = PortP7.Pin5; PortP76 = PortP7.Pin6; PortP77 = PortP7.Pin7; PortP80 = PortP8.Pin0; PortP81 = PortP8.Pin1; PortP82 = PortP8.Pin2; PortP83 = PortP8.Pin3; PortP84 = PortP8.Pin4; PortP85 = PortP8.Pin5; PortP86 = PortP8.Pin6; PortP87 = PortP8.Pin7; components new HplM16c60GeneralIOPinPRC2P() as PortP90W, new HplM16c60GeneralIOPinPRC2P() as PortP91W, new HplM16c60GeneralIOPinPRC2P() as PortP92W, new HplM16c60GeneralIOPinPRC2P() as PortP93W, new HplM16c60GeneralIOPinPRC2P() as PortP94W, new HplM16c60GeneralIOPinPRC2P() as PortP95W, new HplM16c60GeneralIOPinPRC2P() as PortP96W, new HplM16c60GeneralIOPinPRC2P() as PortP97W; PortP90W -> PortP9.Pin0; PortP91W -> PortP9.Pin1; PortP92W -> PortP9.Pin2; PortP93W -> PortP9.Pin3; PortP94W -> PortP9.Pin4; PortP95W -> PortP9.Pin5; PortP96W -> PortP9.Pin6; PortP97W -> PortP9.Pin7; PortP90 = PortP90W; PortP91 = PortP91W; PortP92 = PortP92W; PortP93 = PortP93W; PortP94 = PortP94W; PortP95 = PortP95W; PortP96 = PortP96W; PortP97 = PortP97W; PortP100 = PortP_10.Pin0; PortP101 = PortP_10.Pin1; PortP102 = PortP_10.Pin2; PortP103 = PortP_10.Pin3; PortP104 = PortP_10.Pin4; PortP105 = PortP_10.Pin5; PortP106 = PortP_10.Pin6; PortP107 = PortP_10.Pin7; } tinyos-2.1.2+dfsg/tos/chips/m16c60/pins/HplM16c60GeneralIOPinP.nc000077500000000000000000000105211207233610700237420ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Generic pin access for pins mapped into I/O space. * * @author Henrik Makitaavola * @author Martin Turon * @author David Gay */ generic module HplM16c60GeneralIOPinP (uint16_t port_addr, uint16_t ddr_addr, uint16_t bit) { provides interface GeneralIO as IO; } implementation { #define port (*TCAST(volatile uint8_t* ONE, port_addr)) #define ddr (*TCAST(volatile uint8_t* ONE, ddr_addr)) inline async command bool IO.get() { return READ_BIT (port, bit); } inline async command void IO.set() { SET_BIT (port, bit); } inline async command void IO.clr() { CLR_BIT (port, bit); } inline async command void IO.toggle() { atomic FLIP_BIT (port, bit); } inline async command void IO.makeInput() { CLR_BIT (ddr, bit); } inline async command bool IO.isInput() { return !READ_BIT(ddr, bit); } inline async command void IO.makeOutput() { SET_BIT (ddr, bit); } inline async command bool IO.isOutput() { return READ_BIT(ddr, bit); } } tinyos-2.1.2+dfsg/tos/chips/m16c60/pins/HplM16c60GeneralIOPinPRC2P.nc000077500000000000000000000054041207233610700243750ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Generic pin access for pins on the P9 port. The PD9 register * is locked by the PRC2 bit in the PRCR register so it needs * to be unlocked before each access. * * @author Henrik Makitaavola */ generic module HplM16c60GeneralIOPinPRC2P() { provides interface GeneralIO as IO; uses interface GeneralIO as Wrap; } implementation { inline async command bool IO.get() { return call Wrap.get(); } inline async command void IO.set() { call Wrap.set(); } inline async command void IO.clr() { call Wrap.clr(); } inline async command void IO.toggle() { call Wrap.toggle(); } inline async command void IO.makeInput() { atomic { PRCR.BYTE = BIT2; call Wrap.makeInput(); } } inline async command bool IO.isInput() { return call Wrap.isInput(); } inline async command void IO.makeOutput() { atomic { PRCR.BYTE = BIT2; call Wrap.makeOutput(); } } inline async command bool IO.isOutput() { return call Wrap.isOutput(); } } tinyos-2.1.2+dfsg/tos/chips/m16c60/pins/HplM16c60GeneralIOPortP.nc000077500000000000000000000110661207233610700241450ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Generic component to expose a full 8-bit port of GPIO pins. * * @author Henrik Makitaavola * @author Martin Turon */ generic configuration HplM16c60GeneralIOPortP(uint16_t port_addr, uint16_t ddr_addr) { // provides all the ports as raw ports provides { interface GeneralIO as Pin0; interface GeneralIO as Pin1; interface GeneralIO as Pin2; interface GeneralIO as Pin3; interface GeneralIO as Pin4; interface GeneralIO as Pin5; interface GeneralIO as Pin6; interface GeneralIO as Pin7; } } implementation { components new HplM16c60GeneralIOPinP (port_addr, ddr_addr, 0) as Bit0, new HplM16c60GeneralIOPinP (port_addr, ddr_addr, 1) as Bit1, new HplM16c60GeneralIOPinP (port_addr, ddr_addr, 2) as Bit2, new HplM16c60GeneralIOPinP (port_addr, ddr_addr, 3) as Bit3, new HplM16c60GeneralIOPinP (port_addr, ddr_addr, 4) as Bit4, new HplM16c60GeneralIOPinP (port_addr, ddr_addr, 5) as Bit5, new HplM16c60GeneralIOPinP (port_addr, ddr_addr, 6) as Bit6, new HplM16c60GeneralIOPinP (port_addr, ddr_addr, 7) as Bit7; Pin0 = Bit0; Pin1 = Bit1; Pin2 = Bit2; Pin3 = Bit3; Pin4 = Bit4; Pin5 = Bit5; Pin6 = Bit6; Pin7 = Bit7; } tinyos-2.1.2+dfsg/tos/chips/m16c60/pins/HplM16c60Interrupt.nc000077500000000000000000000106761207233610700233550ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface to control an M16c/60 external pin interrupt. * * @author Henrik Makitaavola * @author Joe Polastre * @author Martin Turon */ interface HplM16c60Interrupt { /** * Enables M16c/60 hardware interrupt on a particular port. */ async command void enable(); /** * Disables M16c/60 hardware interrupt on a particular port. */ async command void disable(); /** * Clears the M16c/60 Interrupt Pending Flag for a particular port. */ async command void clear(); /** * Gets the current value of the input voltage of a port. * * @return TRUE if the pin is set high, FALSE if it is set low. */ async command bool getValue(); /** * Sets whether the edge should be high to low or low to high. * @param TRUE if the interrupt should be triggered on a low to high * edge transition, false for interrupts on a high to low transition. */ async command void edge(bool low_to_high); /** * Sets the edge mode to both edges. */ async command void bothEdges(); /** * Signaled when an interrupt occurs on a port. */ async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/m16c60/pins/HplM16c60InterruptC.nc000077500000000000000000000112701207233610700234470ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Martin Turon */ /** * This component providing access to all external pin interrupts on M16c/60. * * @author Henrik Makitaavola */ configuration HplM16c60InterruptC { provides { interface HplM16c60Interrupt as Int0; interface HplM16c60Interrupt as Int1; interface HplM16c60Interrupt as Int2; interface HplM16c60Interrupt as Int3; interface HplM16c60Interrupt as Int4; interface HplM16c60Interrupt as Int5; } } implementation { components HplM16c60InterruptSigP as IrqVector, new HplM16c60InterruptPinP((uint16_t)&INT0IC, 0) as IntPin0, new HplM16c60InterruptPinP((uint16_t)&INT1IC, 1) as IntPin1, new HplM16c60InterruptPinP((uint16_t)&INT2IC, 2) as IntPin2, new HplM16c60InterruptPinP((uint16_t)&INT3IC, 3) as IntPin3, new HplM16c60InterruptPinP((uint16_t)&INT4IC, 4) as IntPin4, new HplM16c60InterruptPinP((uint16_t)&INT5IC, 5) as IntPin5; Int0 = IntPin0; Int1 = IntPin1; Int2 = IntPin2; Int3 = IntPin3; Int4 = IntPin4; Int5 = IntPin5; IntPin0.IrqSignal -> IrqVector.IntSig0; IntPin1.IrqSignal -> IrqVector.IntSig1; IntPin2.IrqSignal -> IrqVector.IntSig2; IntPin3.IrqSignal -> IrqVector.IntSig3; IntPin4.IrqSignal -> IrqVector.IntSig4; IntPin5.IrqSignal -> IrqVector.IntSig5; #ifdef THREADS components PlatformInterruptC; IrqVector.PlatformInterrupt -> PlatformInterruptC; #endif } tinyos-2.1.2+dfsg/tos/chips/m16c60/pins/HplM16c60InterruptPinP.nc000077500000000000000000000111321207233610700241300ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Martin Turon */ /** * Interrupt interface access for interrupt capable GPIO pins. * * @author Henrik Makitaavola */ generic module HplM16c60InterruptPinP (uint16_t ctrl_addr, uint8_t edgebit) { provides interface HplM16c60Interrupt as Irq; uses interface HplM16c60InterruptSig as IrqSignal; } implementation { #define ctrl (*TCAST(volatile uint8_t * ONE, ctrl_addr)) inline async command bool Irq.getValue() { return READ_BIT(ctrl, 3); } inline async command void Irq.clear() { clear_interrupt(ctrl_addr); } inline async command void Irq.disable() { CLR_BIT(ctrl, 0); } inline async command void Irq.enable() { if (edgebit > 3) { SET_BIT(IFSR.BYTE, (edgebit+2)); } SET_BIT(ctrl, 0); } inline async command void Irq.edge(bool low_to_high) { CLR_BIT(IFSR.BYTE, edgebit); // use edge mode // and select rising vs falling if (low_to_high) { SET_BIT(ctrl, 4); } else { CLR_BIT(ctrl, 4); } } inline async command void Irq.bothEdges() { SET_BIT(IFSR.BYTE, edgebit); CLR_BIT(ctrl, 4); } /** * Forward the external interrupt event. */ async event void IrqSignal.fired() { call Irq.clear(); signal Irq.fired(); } default async event void Irq.fired() { } } tinyos-2.1.2+dfsg/tos/chips/m16c60/pins/HplM16c60InterruptSig.nc000077500000000000000000000073431207233610700240150ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface to an M16c/60 external pin interrupt that exposes just the * interrupt vector routine for easy linking to generic components (see * HplM16c60Interrupt for the full interface). * * @author Henrik Makitaavola * @author Martin Turon * @see HplM16c60Interrupt */ interface HplM16c60InterruptSig { /** * Signaled when an interrupt occurs on a pin */ async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/m16c60/pins/HplM16c60InterruptSigP.nc000077500000000000000000000115511207233610700241310ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Martin Turon */ /** * Interrupt interface access for interrupt capable GPIO pins. * Exposes just the interrupt vector routine for * easy linking to generic components. * * @author Henrik Makitaavola */ module HplM16c60InterruptSigP { provides interface HplM16c60InterruptSig as IntSig0; provides interface HplM16c60InterruptSig as IntSig1; provides interface HplM16c60InterruptSig as IntSig2; provides interface HplM16c60InterruptSig as IntSig3; provides interface HplM16c60InterruptSig as IntSig4; provides interface HplM16c60InterruptSig as IntSig5; #ifdef THREADS uses interface PlatformInterrupt; #define POST_AMBLE() call PlatformInterrupt.postAmble() #else #define POST_AMBLE() #endif } implementation { default async event void IntSig0.fired() { } M16C_INTERRUPT_HANDLER(M16C_INT0) { signal IntSig0.fired(); POST_AMBLE(); } default async event void IntSig1.fired() { } M16C_INTERRUPT_HANDLER(M16C_INT1) { signal IntSig1.fired(); POST_AMBLE(); } default async event void IntSig2.fired() { } M16C_INTERRUPT_HANDLER(M16C_INT2) { signal IntSig2.fired(); POST_AMBLE(); } default async event void IntSig3.fired() { } M16C_INTERRUPT_HANDLER(M16C_INT3) { signal IntSig3.fired(); POST_AMBLE(); } default async event void IntSig4.fired() { } M16C_INTERRUPT_HANDLER(M16C_INT4) { signal IntSig4.fired(); POST_AMBLE(); } default async event void IntSig5.fired() { } M16C_INTERRUPT_HANDLER(M16C_INT5) { signal IntSig5.fired(); POST_AMBLE(); } } tinyos-2.1.2+dfsg/tos/chips/m16c60/pins/M16c60InterruptC.nc000077500000000000000000000111001207233610700227730ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Joe Polastre * @author Martin Turon */ /** * Creates a HIL interrupt component from a M16c/60 interrupt. * * @author Henrik Makitaavola */ generic module M16c60InterruptC() { provides interface GpioInterrupt; uses interface HplM16c60Interrupt; } implementation { async command error_t GpioInterrupt.enableRisingEdge() { atomic { call HplM16c60Interrupt.disable(); call HplM16c60Interrupt.edge(true); call HplM16c60Interrupt.clear(); call HplM16c60Interrupt.enable(); } return SUCCESS; } async command error_t GpioInterrupt.enableFallingEdge() { atomic { call HplM16c60Interrupt.disable(); call HplM16c60Interrupt.edge(false); call HplM16c60Interrupt.enable(); // For some reason we need to clear the interrupt after we enable it // to prevent already pending interrupts. call HplM16c60Interrupt.clear(); } return SUCCESS; } async command error_t GpioInterrupt.disable() { atomic { call HplM16c60Interrupt.disable(); call HplM16c60Interrupt.clear(); } return SUCCESS; } async event void HplM16c60Interrupt.fired() { signal GpioInterrupt.fired(); } default async event void GpioInterrupt.fired() { } } tinyos-2.1.2+dfsg/tos/chips/m16c60/pins/M16c60Pin.h000066400000000000000000000045641207233610700212660ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * M16c60 pin defines and enums. * * @author Henrik Makitaavola */ #ifndef __M16C60_PIN_H__ #define __M16C60_PIN_H__ enum { M16C_PIN_INACTIVE_DONT_CARE = 0, M16C_PIN_INACTIVE_OUTPUT_LOW = 1, M16C_PIN_INACTIVE_OUTPUT_HIGH = 2, M16C_PIN_INACTIVE_INPUT = 3 }; #define M16C_PORT_INACTIVE_STATE(p0, p1, p2, p3, p4, p5, p6, p7) p0 | (p1 << 2) | \ (p2 << 4) | (p3 << 6) | \ (p4 << 8) | (p5 << 10) | \ (p6 << 12) | (p7 << 14) #endif // __M16C60_PIN_H__ tinyos-2.1.2+dfsg/tos/chips/m16c60/printf/000077500000000000000000000000001207233610700201125ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/m16c60/printf/m16c60_printf.h000066400000000000000000000204001207233610700225550ustar00rootroot00000000000000/**************************************************************** KPIT Cummins Infosystems Ltd, Pune, India. 1-April-2006. 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. *****************************************************************/ /* Written By: Shrirang Khishti . This is a smaller version of printf Positive points about this function 1. Reduces code size considerably ,very useful in embedded applications 2. No malloc calls are used 3. Supports almost all the functionalities of GNU std printf routine. 4. If user dont want float_support in this customized printf just undef macro float_support */ #ifndef __M16C60_PRINTF_H__ #define __M16C60_PRINTF_H__ #include #include #define printf _printf int left_val,right_val; #define condition *format!='f'&&*format!='d'&&*format!='c'&&*format!='s'&&*format!='l'&&*format!='u'&&*format!='\0'&&*format!=' '&&*format!='i'&&*format!='x'&&*format!='X'&&*format!='o'&&*format!='%'&&*format!='p' #define float_support long temp_arr[]={100000,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000}; /** * @fn * @brief * * @param c */ int _putchar(int c) { /* Convert CR to CR/LF */ if (c == '\n') lowlevel_putc('\r'); lowlevel_putc(c); return c; } /** * @fn void _puts(const char *tempStr) * @brief Prints a NULL-erminated string on UART 1 * * @param s The string to output * */ int _puts(const char *s) { while( *s != '\0' ) _putchar(*s++); return 0; } /** * @fn void strrev(char *str) * @brief Reverses a string * * @param str The string to reverse */ void strrev(char *str) { char *temp, c; int len=strlen(str) ; temp = str + len -1; while(str < temp ) { c = *str; *str = *temp; *temp = c; str++; temp--; } } static void print_hex_oct( long int temp_var,int _div,int corr_factor,int ret_val,int sign,int *cntr_val) { unsigned long int i=1,i1,temp=temp_var; int cntr=0,neg_flag=0; char s1[40]; if(sign==1&&temp_var<0) { temp=-temp_var; neg_flag=1; } if(temp==0) s1[cntr++]='0'; while(temp>0) { i1=temp%_div; temp=temp/_div; if(i1<=9) s1[cntr]=i1+'0'; else s1[cntr]=i1+corr_factor-9; cntr++; } while((left_val-(right_val>cntr?right_val:cntr+neg_flag))>0) { _putchar(' '); left_val--; (*cntr_val)++; } while(right_val-cntr>0) { s1[cntr++]='0'; } if(neg_flag==1) s1[cntr++]='-'; s1[cntr]='\0'; strrev(s1); _puts(s1); (*cntr_val)+=strlen(s1); } #ifdef float_support static void float_print(long double f1,long double f2,int multi,int *cntr_val) { int i=1,temp,cntr=0,i1,neg_flag=0; char s1[10]; if(f1<0) { f1=f1*-1; neg_flag=1; f2=f1; } temp=(int)f1; f1=f1-temp; f1=f1*multi; temp=f1; if(temp==0) s1[cntr++]='0'; while(temp>0) { i1=temp%10; temp=temp/10; s1[cntr]=i1+0x30; cntr++; } while(right_val<9&&(right_val -cntr)>0) s1[cntr++]='0'; s1[cntr]='.'; cntr++; temp=(int)f2; if(temp==0) s1[cntr++]='0'; while(temp>0) { i1=temp%10; temp=temp/10; s1[cntr]=i1+0x30; cntr++; } while(left_val-- -cntr>0) { _putchar(' '); (*cntr_val)++; } if(neg_flag==1) s1[cntr++]='-'; s1[cntr]='\0'; cntr--; strrev(s1); _puts(s1); (*cntr_val)+=strlen(s1); neg_flag=0; } #endif // float_support static int format_val(char *temp,long float_flag,int *cntr_val,int flag) { left_val=0; right_val=0; if(*temp=='\0'&&flag==1) { right_val=3; return 0; } while(*temp!='.'&&*temp!='\0') { if(*temp<'0'||*temp>'9') { while(*temp) { _putchar(*temp++); (*cntr_val)++; } return -1; } else left_val=left_val*10+*temp-'0'; temp++; } if(*temp) temp++; else return left_val; while(*temp) { if(*temp<'0'||*temp>'9') { while(*temp) { _putchar(*temp++); (*cntr_val)++; } return -1; } else right_val=right_val*10+*temp-'0'; temp++; } return 0; } /** * @fn int _printf(const char *format, ...) * @brief Prints a formatted string on UART1 * * @param format The string */ int _printf(const char *format, ...) { int format_cntr=0; char temp_str[20]; int return_flag=0,cntr_val; long double f1,f2; char *str_temp; int *cntr=&cntr_val; va_list ap; va_start(ap, format); *cntr=0; while(*format) { temp_str[format_cntr]='\0'; if(*format=='%') { *format++; while(*format==' ') { format++; _putchar(' '); } while(condition) { temp_str[format_cntr++]=*format++; } temp_str[format_cntr]='\0'; if(*format=='%') { _putchar('%'); (*cntr)++; format_cntr=0; format++; continue; } /************** print unsigned ****************/ else if(*format=='u') { return_flag=format_val(temp_str,0,cntr,0); if(return_flag!=-1) print_hex_oct(va_arg(ap,unsigned int),10,0,return_flag,0,cntr); else { _putchar(*format); (*cntr)++; } format++; format_cntr=0; continue; } /*********** Print Integer Values **************/ else if(*format=='d'||*format=='i') { return_flag=format_val(temp_str,0,cntr,0); if(return_flag!=-1) print_hex_oct(va_arg(ap,int),10,0,return_flag,1,cntr); else { _putchar(*format); (*cntr)++; } format++; format_cntr=0; continue; } /*********** Print hex,Octal values ******************/ else if(*format=='x'||*format=='X'||*format=='o'||*format=='p') { return_flag=format_val(temp_str,0,cntr,0); if(return_flag!=-1) { if(*format=='x'||*format=='p') print_hex_oct(va_arg(ap,unsigned int),16,0x60,return_flag,0,cntr); else if(*format=='X') print_hex_oct(va_arg(ap,unsigned int),16,0x40,return_flag,0,cntr); else print_hex_oct(va_arg(ap,unsigned int),8,0,return_flag,0,cntr); } else { _putchar(*format); (*cntr)++; } format++; format_cntr=0; continue; } /************ Character printing ****************88*/ else if(*format=='c') { return_flag=format_val(temp_str,0,cntr,0); if(return_flag!=-1) { while(return_flag-->1) { _putchar(' '); (*cntr)++; } _putchar(va_arg(ap,int)); (*cntr)+=2; } else { _putchar(*format); (*cntr)++; } format++; format_cntr=0; continue; } /*************** Print String *****************/ else if(*format=='s') { return_flag=format_val(temp_str,0,cntr,0); if(return_flag!=-1) { str_temp=va_arg(ap,char*); while((return_flag-- -(int) strlen(str_temp))>0) { _putchar(' '); (*cntr)++; } _puts(str_temp); (*cntr)+=strlen(str_temp); } else { _putchar(*format); (*cntr)++; } format++; format_cntr=0; continue; } /*************** Print floating point number *****************/ else if(*format=='f'||(*format=='l'&&*(format+1)=='f')) { return_flag=format_val(temp_str,1,cntr,1); if(return_flag!=-1) { if(*format=='l') { f1=va_arg(ap,long double); format+=2; } else { f1=va_arg(ap,double); format++; } f2=f1; #ifdef float_support right_val++; float_print(f1,f2,temp_arr[right_val%10],cntr); #endif } else { _putchar(*format++); (*cntr)++; } format_cntr=0; continue; } else if(*format=='l'&&((*(format+1)=='d')||(*(format+1)=='u'))) { return_flag=format_val(temp_str,0,cntr,0); if((return_flag=-1)&&(*(format+1)=='d')) { print_hex_oct(va_arg(ap,long int),10,0x00,return_flag,1,cntr); } else if((return_flag=-1)&&(*(format+1)=='u')) { print_hex_oct(va_arg(ap,unsigned long int),10,0x00,return_flag,0,cntr); } else { _putchar(*format); _putchar(*(format+1)); (*cntr)+=2; } format+=2; format_cntr=0; continue; } else { _puts(temp_str); format_cntr=0; continue; } } _putchar(*format++); (*cntr)++; } va_end(ap); return cntr_val; } #endif // __M16C60_PRINTF_H__ tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/000077500000000000000000000000001207233610700177305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/HplM16c60Timer.nc000077500000000000000000000121301207233610700225730ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Basic interface to the hardware timers on the M16C/60. * This interface provides four major groups of functionality:
        *
      1. Timer Value: get/set current time *
      2. Interrupt event, occurs when the timer under- or overflows. *
      3. Control of Interrupt: enableInterrupt/disableInterrupt/clearInterrupt... *
      4. Timer Initialization: turn on/off clock source *
      * * @author Henrik Makitaavola * @author Martin Turon */ #include "M16c60Timer.h" interface HplM16c60Timer { /** * Turn on the clock. */ async command void on(); /** * Turn off the clock. */ async command void off(); /** * Check if the clock is on. */ async command bool isOn(); /** * Get the current time. * @return the current time. */ async command uint16_t get(); /** * Set the current time. * @param t the time to set. */ async command void set( uint16_t t ); /** * Signalled on timer interrupt. */ async event void fired(); /** * Clear the interrupt flag. */ async command void clearInterrupt(); /** * Enable the interrupts. */ async command void enableInterrupt(); /** * Turns off interrupts. */ async command void disableInterrupt(); /** * Checks if an interrupt has occured. * @return TRUE if interrupt has triggered. */ async command bool testInterrupt(); /** * Checks if interrupts are on. * @return TRUE if interrups are enabled. */ async command bool isInterruptOn(); /** * Turn stop mode on/off while the timer is on. * @param allow If true the mcu can go into stop mode while * timer is on if false the mcu can only use * wait mode while timer is on. */ async command void allowStopMode(bool allow); } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/HplM16c60TimerACtrl.nc000077500000000000000000000047411207233610700235320ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface for controlling the mode of a TimerA. * * @author Henrik Makitaavola */ #include "M16c60Timer.h" interface HplM16c60TimerACtrl { /** * Sets the timer to timer mode. * * @param settings The settings for the timer mode. */ async command void setTimerMode(st_timer settings); /** * Sets the timer to counter mode. * * @param settings The settings for the counter mode. */ async command void setCounterMode(sta_counter settings); /** * Sets the timer to one-shot mode. * * @param settings The settings for the one-shot mode. */ async command void setOneShotMode(sta_one_shot settings); /** * Starts the timer if in one-shot mode. */ async command void oneShotFire(); } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/HplM16c60TimerACtrlP.nc000077500000000000000000000107631207233610700236530ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the HplM16c60TimerACtrl interface. * * @author Henrik Makitaavola */ #include "M16c60Timer.h" generic module HplM16c60TimerACtrlP (uint8_t timer, uint16_t mode_addr, uint16_t taitg_addr, uint8_t taitg_start_bit) { provides interface HplM16c60TimerACtrl as TimerACtrl; } implementation { #define mode (*TCAST(volatile uint8_t* ONE, mode_addr)) #define taitg (*TCAST(volatile uint8_t* ONE, taitg_addr)) inline void UDFBit(uint16_t bit, uint16_t value) { uint8_t tmp = UDF; WRITE_BIT(tmp, bit, value); // Move tmp variable into UDF (adress 0x0384) asm("mov.b %0,(0x0384)" : : "r"(tmp) ); } inline void setTAiTG(uint8_t flag) { CLR_FLAG(taitg, 0x03 << taitg_start_bit); SET_FLAG(taitg, flag << taitg_start_bit); } async command void TimerACtrl.setTimerMode(st_timer settings) { uint8_t flags = 0; // If timer nr > 1 set "Two-phase pulse signal" bit to zero. if (timer > 1) { UDFBit(timer + 3, 0); } flags = settings.output_pulse << 2 | settings.gate_func << 3 | settings.count_src << 6; mode = flags; } async command void TimerACtrl.setCounterMode(sta_counter settings) { uint8_t flags; uint8_t TAiTG; mode = 1; flags = settings.operation_type << 6; if (settings.two_phase_pulse_mode && timer > 1) { uint8_t tmp = timer; // Used to remove left shift warning // Set flags flags |= 0x04 | settings.two_phase_processing << 7; // If two-phase signal procressing is desired UDF TAiP bit must be set. UDFBit(timer + 3, 1); // Set TAiTGH and TAiTGL in TRGSR to "00b" (TAiIN pin input). if (tmp == 0) tmp = 1; // This line will never be executed because tmp is always > 1 CLR_FLAG(TRGSR.BYTE, 0x03 << ((tmp - 1) * 2)); TAiTG = 0x00; } else { flags |= settings.output_pulse << 2 | settings.count_rising_edge << 3 | settings.up_down_switch << 4; // If two-phase signal procressing is not desired UDF TAiP bit must be cleared. // Note this is only availible for timers A2, A3 and A4 if (timer > 1) { UDFBit(timer + 3, 0); } UDFBit(timer, settings.up_count); TAiTG = settings.event_source; } setTAiTG(TAiTG); mode |= flags; } async command void TimerACtrl.setOneShotMode(sta_one_shot settings) { uint8_t flags; mode = 0x02; flags = settings.output_pulse << 2 | settings.ext_trigger_rising_edge << 3 | settings.trigger << 4 | settings.count_src << 6; setTAiTG(settings.TAiTG_trigger_source); mode |= flags; } async command void TimerACtrl.oneShotFire() { SET_BIT(ONSF.BYTE, timer); } } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/HplM16c60TimerBCtrl.nc000077500000000000000000000044411207233610700235300ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface for controlling the mode of a TimerB. * Precaution when using timer mode, read M16c60Timer.h for more information. * * @author Henrik Makitaavola */ #include "M16c60Timer.h" interface HplM16c60TimerBCtrl { /** * Sets the timer to timer mode. * * @param settings The settings for the timer mode. */ async command void setTimerMode(st_timer settings); /** * Sets the timer to counter mode. * * @param settings The settings for the counter mode. */ async command void setCounterMode(stb_counter settings); } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/HplM16c60TimerBCtrlP.nc000077500000000000000000000044631207233610700236540ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the HplM16c60TimerBCtrl interface. * * @author Henrik Makitaavola */ #include "M16c60Timer.h" generic module HplM16c60TimerBCtrlP (uint16_t mode_addr) { provides interface HplM16c60TimerBCtrl as TimerBCtrl; } implementation { #define mode (*TCAST(volatile uint8_t* ONE, mode_addr)) async command void TimerBCtrl.setTimerMode(st_timer settings) { mode = settings.count_src << 6; } async command void TimerBCtrl.setCounterMode(stb_counter settings) { mode = 1 | settings.count_polarity << 2 | settings.event_source << 7; } } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/HplM16c60TimerC.nc000077500000000000000000000160561207233610700227110ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interfaces to all the M16c/60 timers and controls. * * @author Henrik Makitaavola */ configuration HplM16c60TimerC { provides { interface HplM16c60Timer as TimerA0; interface HplM16c60Timer as TimerA1; interface HplM16c60Timer as TimerA2; interface HplM16c60Timer as TimerA3; interface HplM16c60Timer as TimerA4; interface HplM16c60TimerACtrl as TimerA0Ctrl; interface HplM16c60TimerACtrl as TimerA1Ctrl; interface HplM16c60TimerACtrl as TimerA2Ctrl; interface HplM16c60TimerACtrl as TimerA3Ctrl; interface HplM16c60TimerACtrl as TimerA4Ctrl; interface HplM16c60Timer as TimerB0; interface HplM16c60Timer as TimerB1; interface HplM16c60Timer as TimerB2; interface HplM16c60Timer as TimerB3; interface HplM16c60Timer as TimerB4; interface HplM16c60Timer as TimerB5; interface HplM16c60TimerBCtrl as TimerB0Ctrl; interface HplM16c60TimerBCtrl as TimerB1Ctrl; interface HplM16c60TimerBCtrl as TimerB2Ctrl; interface HplM16c60TimerBCtrl as TimerB3Ctrl; interface HplM16c60TimerBCtrl as TimerB4Ctrl; interface HplM16c60TimerBCtrl as TimerB5Ctrl; } } implementation { components HplM16c60TimerInterruptP as IrqVector, new HplM16c60TimerP((uint16_t)&TA0, (uint16_t)&TA0IC, (uint16_t)&TABSR, 0) as TimerA0_, new HplM16c60TimerP((uint16_t)&TA1, (uint16_t)&TA1IC, (uint16_t)&TABSR, 1) as TimerA1_, new HplM16c60TimerP((uint16_t)&TA2, (uint16_t)&TA2IC, (uint16_t)&TABSR, 2) as TimerA2_, new HplM16c60TimerP((uint16_t)&TA3, (uint16_t)&TA3IC, (uint16_t)&TABSR, 3) as TimerA3_, new HplM16c60TimerP((uint16_t)&TA4, (uint16_t)&TA4IC, (uint16_t)&TABSR, 4) as TimerA4_, new HplM16c60TimerACtrlP(0, (uint16_t)&TA0MR, (uint16_t)&ONSF, 6) as TimerA0Ctrl_, new HplM16c60TimerACtrlP(1, (uint16_t)&TA1MR, (uint16_t)&TRGSR, 0) as TimerA1Ctrl_, new HplM16c60TimerACtrlP(2, (uint16_t)&TA2MR, (uint16_t)&TRGSR, 2) as TimerA2Ctrl_, new HplM16c60TimerACtrlP(3, (uint16_t)&TA3MR, (uint16_t)&TRGSR, 4) as TimerA3Ctrl_, new HplM16c60TimerACtrlP(4, (uint16_t)&TA4MR, (uint16_t)&TRGSR, 6) as TimerA4Ctrl_, new HplM16c60TimerP((uint16_t)&TB0, (uint16_t)&TB0IC, (uint16_t)&TABSR, 5) as TimerB0_, new HplM16c60TimerP((uint16_t)&TB1, (uint16_t)&TB1IC, (uint16_t)&TABSR, 6) as TimerB1_, new HplM16c60TimerP((uint16_t)&TB2, (uint16_t)&TB2IC, (uint16_t)&TABSR, 7) as TimerB2_, new HplM16c60TimerP((uint16_t)&TB3, (uint16_t)&TB3IC, (uint16_t)&TBSR, 5) as TimerB3_, new HplM16c60TimerP((uint16_t)&TB4, (uint16_t)&TB4IC, (uint16_t)&TBSR, 6) as TimerB4_, new HplM16c60TimerP((uint16_t)&TB5, (uint16_t)&TB5IC, (uint16_t)&TBSR, 7) as TimerB5_, new HplM16c60TimerBCtrlP((uint16_t)&TB0MR) as TimerB0Ctrl_, new HplM16c60TimerBCtrlP((uint16_t)&TB1MR) as TimerB1Ctrl_, new HplM16c60TimerBCtrlP((uint16_t)&TB2MR) as TimerB2Ctrl_, new HplM16c60TimerBCtrlP((uint16_t)&TB3MR) as TimerB3Ctrl_, new HplM16c60TimerBCtrlP((uint16_t)&TB4MR) as TimerB4Ctrl_, new HplM16c60TimerBCtrlP((uint16_t)&TB5MR) as TimerB5Ctrl_, new StopModeControlC() as TimerA0StopModeControl, new StopModeControlC() as TimerA1StopModeControl, new StopModeControlC() as TimerA2StopModeControl, new StopModeControlC() as TimerA3StopModeControl, new StopModeControlC() as TimerA4StopModeControl, new StopModeControlC() as TimerB0StopModeControl, new StopModeControlC() as TimerB1StopModeControl, new StopModeControlC() as TimerB2StopModeControl, new StopModeControlC() as TimerB3StopModeControl, new StopModeControlC() as TimerB4StopModeControl, new StopModeControlC() as TimerB5StopModeControl; TimerA0 = TimerA0_; TimerA1 = TimerA1_; TimerA2 = TimerA2_; TimerA3 = TimerA3_; TimerA4 = TimerA4_; TimerA0_.StopModeControl -> TimerA0StopModeControl; TimerA1_.StopModeControl -> TimerA1StopModeControl; TimerA2_.StopModeControl -> TimerA2StopModeControl; TimerA3_.StopModeControl -> TimerA3StopModeControl; TimerA4_.StopModeControl -> TimerA4StopModeControl; TimerB0 = TimerB0_; TimerB1 = TimerB1_; TimerB2 = TimerB2_; TimerB3 = TimerB3_; TimerB4 = TimerB4_; TimerB5 = TimerB5_; TimerB0_.StopModeControl -> TimerB0StopModeControl; TimerB1_.StopModeControl -> TimerB1StopModeControl; TimerB2_.StopModeControl -> TimerB2StopModeControl; TimerB3_.StopModeControl -> TimerB3StopModeControl; TimerB4_.StopModeControl -> TimerB4StopModeControl; TimerB5_.StopModeControl -> TimerB5StopModeControl; TimerA0_.IrqSignal -> IrqVector.TimerA0; TimerA1_.IrqSignal -> IrqVector.TimerA1; TimerA2_.IrqSignal -> IrqVector.TimerA2; TimerA3_.IrqSignal -> IrqVector.TimerA3; TimerA4_.IrqSignal -> IrqVector.TimerA4; TimerB0_.IrqSignal -> IrqVector.TimerB0; TimerB1_.IrqSignal -> IrqVector.TimerB1; TimerB2_.IrqSignal -> IrqVector.TimerB2; TimerB3_.IrqSignal -> IrqVector.TimerB3; TimerB4_.IrqSignal -> IrqVector.TimerB4; TimerB5_.IrqSignal -> IrqVector.TimerB5; TimerA0Ctrl = TimerA0Ctrl_; TimerA1Ctrl = TimerA1Ctrl_; TimerA2Ctrl = TimerA2Ctrl_; TimerA3Ctrl = TimerA3Ctrl_; TimerA4Ctrl = TimerA4Ctrl_; TimerB0Ctrl = TimerB0Ctrl_; TimerB1Ctrl = TimerB1Ctrl_; TimerB2Ctrl = TimerB2Ctrl_; TimerB3Ctrl = TimerB3Ctrl_; TimerB4Ctrl = TimerB4Ctrl_; TimerB5Ctrl = TimerB5Ctrl_; #ifdef THREADS components PlatformInterruptC; IrqVector.PlatformInterrupt -> PlatformInterruptC; #endif } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/HplM16c60TimerInterrupt.nc000077500000000000000000000037421207233610700245210ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface for interrupt signal from a timer. * * @author Henrik Makitaavola */ interface HplM16c60TimerInterrupt { /** * Signal when an overflow/underflow interrupt occurs on a timer. */ async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/HplM16c60TimerInterruptP.nc000077500000000000000000000102521207233610700246330ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * All timer interrupt vector handlers. * These are wired in HplM16c60TimerC. * * @author Henrik Makitaavola */ module HplM16c60TimerInterruptP { provides interface HplM16c60TimerInterrupt as TimerA0; provides interface HplM16c60TimerInterrupt as TimerA1; provides interface HplM16c60TimerInterrupt as TimerA2; provides interface HplM16c60TimerInterrupt as TimerA3; provides interface HplM16c60TimerInterrupt as TimerA4; provides interface HplM16c60TimerInterrupt as TimerB0; provides interface HplM16c60TimerInterrupt as TimerB1; provides interface HplM16c60TimerInterrupt as TimerB2; provides interface HplM16c60TimerInterrupt as TimerB3; provides interface HplM16c60TimerInterrupt as TimerB4; provides interface HplM16c60TimerInterrupt as TimerB5; #ifdef THREADS uses interface PlatformInterrupt; #define POST_AMBLE() call PlatformInterrupt.postAmble() #else #define POST_AMBLE() #endif } implementation { default async event void TimerA0.fired() { } M16C_INTERRUPT_HANDLER(M16C_TMRA0) { signal TimerA0.fired(); POST_AMBLE(); } default async event void TimerA1.fired() { } M16C_INTERRUPT_HANDLER(M16C_TMRA1) { signal TimerA1.fired(); POST_AMBLE(); } default async event void TimerA2.fired() { } M16C_INTERRUPT_HANDLER(M16C_TMRA2) { signal TimerA2.fired(); POST_AMBLE(); } default async event void TimerA3.fired() { } M16C_INTERRUPT_HANDLER(M16C_TMRA3) { signal TimerA3.fired(); POST_AMBLE(); } default async event void TimerA4.fired() { } M16C_INTERRUPT_HANDLER(M16C_TMRA4) { signal TimerA4.fired(); POST_AMBLE(); } default async event void TimerB0.fired() { } M16C_INTERRUPT_HANDLER(M16C_TMRB0) { signal TimerB0.fired(); POST_AMBLE(); } default async event void TimerB1.fired() { } M16C_INTERRUPT_HANDLER(M16C_TMRB1) { signal TimerB1.fired(); POST_AMBLE(); } default async event void TimerB2.fired() { } M16C_INTERRUPT_HANDLER(M16C_TMRB2) { signal TimerB2.fired(); POST_AMBLE(); } default async event void TimerB3.fired() { } M16C_INTERRUPT_HANDLER(M16C_TMRB3) { signal TimerB3.fired(); POST_AMBLE(); } default async event void TimerB4.fired() { } M16C_INTERRUPT_HANDLER(M16C_TMRB4) { signal TimerB4.fired(); POST_AMBLE(); } default async event void TimerB5.fired() { } M16C_INTERRUPT_HANDLER(M16C_TMRB5) { signal TimerB5.fired(); POST_AMBLE(); } } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/HplM16c60TimerP.nc000077500000000000000000000077121207233610700227250ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of a generic HplM16c60Timer interface. * * @author Henrik Makitaavola */ generic module HplM16c60TimerP (uint16_t timer_addr, uint16_t interrupt_addr, uint16_t start_addr, uint8_t start_bit) { provides interface HplM16c60Timer as Timer; uses interface HplM16c60TimerInterrupt as IrqSignal; uses interface StopModeControl; } implementation { #define timer (*TCAST(volatile uint16_t* ONE, timer_addr)) #define start (*TCAST(volatile uint8_t* ONE, start_addr)) #define interrupt (*TCAST(volatile uint8_t* ONE, interrupt_addr)) bool allow_stop_mode = false; async command uint16_t Timer.get() { return timer; } async command void Timer.set( uint16_t t ) { // If the timer is on it must be turned off, else the value will // only be written to the reload register. atomic { if(call Timer.isOn()) { call Timer.off(); timer = t; call Timer.on(); } else { timer = t; } } } // When the timer is turned on in one-shot mode on TimerA // the timer also needs an trigger event to start counting. async command void Timer.on() { atomic if (!allow_stop_mode) { call StopModeControl.allowStopMode(false); } SET_BIT(start, start_bit); } async command void Timer.off() { CLR_BIT(start, start_bit); atomic if (!allow_stop_mode) { call StopModeControl.allowStopMode(true); } } async command bool Timer.isOn() { return READ_BIT(start, start_bit); } async command void Timer.clearInterrupt() { clear_interrupt(interrupt_addr); } async command void Timer.enableInterrupt() { SET_BIT(interrupt, 0); } async command void Timer.disableInterrupt() { CLR_BIT(interrupt, 0); } async command bool Timer.testInterrupt() { return READ_BIT(interrupt, 3); } async command bool Timer.isInterruptOn() { return READ_BIT(interrupt, 0); } async command void Timer.allowStopMode(bool allow) { allow_stop_mode = allow; } // Forward the timer interrupt event. async event void IrqSignal.fired() { signal Timer.fired(); } default async event void Timer.fired() { } } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/M16c60Alarm16C.nc000077500000000000000000000065131207233610700223650ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Build a TEP102 16bits Alarm from a counter and a M16c60 hardware timers. * Use the counter to get the "current time" and the hw timer to count down the * remaining time for the alarm to be fired. * * @author Henrik Makitaavola */ generic module M16c60Alarm16C(typedef precision_tag) { provides interface Alarm as Alarm @atmostonce(); uses interface HplM16c60Timer as ATimer; // Alarm Timer uses interface Counter; } implementation { uint16_t alarm = 0; async command uint16_t Alarm.getNow() { return call Counter.get(); } async command uint16_t Alarm.getAlarm() { return alarm; } async command bool Alarm.isRunning() { return call ATimer.isInterruptOn(); } async command void Alarm.stop() { atomic { call ATimer.off(); call ATimer.disableInterrupt(); } } async command void Alarm.start( uint16_t dt ) { call Alarm.startAt( call Alarm.getNow(), dt); } async command void Alarm.startAt( uint16_t t0, uint16_t dt ) { atomic { uint16_t now, elapsed, expires; now = call Alarm.getNow(); elapsed = now - t0; if (elapsed >= dt) { expires = 0; } else { expires = dt - elapsed - 1; } call ATimer.off(); call ATimer.set(expires); call ATimer.clearInterrupt(); call ATimer.enableInterrupt(); call ATimer.on(); } } async event void ATimer.fired() { call Alarm.stop(); signal Alarm.fired(); } async event void Counter.overflow() {} } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/M16c60Alarm32C.nc000077500000000000000000000107151207233610700223620ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Build a TEP102 32bit Alarm from a counter and two M16c60 hardware timers. * Use the counter to get the "current time" and the hw timer to count down the * remaining time for the alarm to be fired. * * @author Henrik Makitaavola */ generic module M16c60Alarm32C(typedef precision_tag) { provides interface Alarm as Alarm @atmostonce(); uses interface HplM16c60Timer as ATimerLow; // Alarm Timer low bits uses interface HplM16c60Timer as ATimerHigh; // Alarm Timer high bits uses interface Counter; } implementation { uint32_t alarm = 0; async command uint32_t Alarm.getNow() { return call Counter.get(); } async command uint32_t Alarm.getAlarm() { atomic return alarm; } async command bool Alarm.isRunning() { return call ATimerLow.isInterruptOn() || call ATimerHigh.isInterruptOn(); } async command void Alarm.stop() { atomic { call ATimerLow.off(); call ATimerLow.disableInterrupt(); call ATimerHigh.off(); call ATimerHigh.disableInterrupt(); } } async command void Alarm.start( uint32_t dt ) { call Alarm.startAt( call Alarm.getNow(), dt); } async command void Alarm.startAt( uint32_t t0, uint32_t dt ) { atomic { uint32_t now, elapsed, expires; now = call Alarm.getNow(); elapsed = now - t0; if (elapsed >= dt) { expires = 0; } else { expires = dt - elapsed - 1; } alarm = expires; call Alarm.stop(); if (expires <= 0xFFFF) { call ATimerLow.set((uint16_t)expires); call ATimerLow.clearInterrupt(); call ATimerLow.enableInterrupt(); call ATimerLow.on(); } else { uint16_t high_bits; high_bits = expires >> 16; call ATimerHigh.set(high_bits-1); call ATimerHigh.clearInterrupt(); call ATimerHigh.enableInterrupt(); call ATimerHigh.on(); call ATimerLow.set(0xFFFF); call ATimerLow.on(); } } } async event void ATimerLow.fired() { call Alarm.stop(); signal Alarm.fired(); } async event void ATimerHigh.fired() { atomic { uint16_t remaining; call Alarm.stop(); // All the high bits should have been cleared so only the // low should remain. remaining = (uint16_t)(alarm & 0xFFFF); if (remaining != 0) { call ATimerLow.set(remaining); call ATimerLow.clearInterrupt(); call ATimerLow.enableInterrupt(); call ATimerLow.on(); } else { signal Alarm.fired(); } } } async event void Counter.overflow() {} } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/M16c60Counter16C.nc000077500000000000000000000046601207233610700227510ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Build a TEP102 16bits Counter from an M16c/60 hardware timer. * * @author Henrik Makitaavola */ generic module M16c60Counter16C(typedef precision_tag) { provides interface Counter as Counter; uses interface HplM16c60Timer as Timer; } implementation { async command uint16_t Counter.get() { // The timer counts down so the time needs to be inverted. return (0xFFFF) - call Timer.get(); } async command bool Counter.isOverflowPending() { return call Timer.testInterrupt(); } async command void Counter.clearOverflow() { call Timer.clearInterrupt(); } async event void Timer.fired() { signal Counter.overflow(); } } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/M16c60Counter32C.nc000077500000000000000000000052121207233610700227410ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Build a TEP102 32 bit Counter from two M16c/60 hardware timers. * * @author Henrik Makitaavola */ generic module M16c60Counter32C(typedef precision_tag) { provides interface Counter as Counter; uses interface HplM16c60Timer as TimerLow; uses interface HplM16c60Timer as TimerHigh; } implementation { async command uint32_t Counter.get() { uint32_t time = 0; atomic { time = (((uint32_t)call TimerHigh.get()) << 16) + call TimerLow.get(); } // The timers count down so the time needs to be inverted. return (0xFFFFFFFF) - time; } async command bool Counter.isOverflowPending() { return call TimerHigh.testInterrupt(); } async command void Counter.clearOverflow() { call TimerHigh.clearInterrupt(); } async event void TimerHigh.fired() { signal Counter.overflow(); } async event void TimerLow.fired() {} } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/M16c60Timer.h000077500000000000000000000126531207233610700217700ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This file contains structures and defines used together with timer * interfaces and control. * * @author Henrik Makitaavola */ #ifndef __M16C60TIMER_H__ #define __M16C60TIMER_H__ /* * Precations when using Timer A1 and Timer A2. * Read hardware manual page 139. * * Precations when using Timer B2. * Read hardware manual page 156. */ enum { TMR_TIMER_MODE, TMR_COUNTER_MODE, TMR_ONE_SHOT_MODE }; /* Timer mode */ typedef struct { uint8_t output_pulse:1; // TAiMR: MR0 . TAiOUT pin is a pulse output pin if bit is set. No effect on TimerB. uint8_t gate_func:2; // TAiMR: MR1, MR2 [ NO_GATE | TAiIN_LOW | TAiIN_HIGH ] . No effect on TimerB. uint8_t count_src:2; // T*iMR: TCK0, TCK1 [ F1_2 | F8 | F32 | FC32 ] } st_timer; // "gate_func" enum { M16C_TMR_TMR_GF_NO_GATE = 0x0, M16C_TMR_TMR_GF_TAiIN_LOW = 0x2, M16C_TMR_TMR_GF_TAiIN_HIGH = 0x3 }; /* TimerA Counter mode */ typedef struct { uint8_t two_phase_pulse_mode:1; // Use two phase mode, only available for timers A2, A3 and A4, will be ignored else. // Flags active in two-phase mode uint8_t two_phase_processing:1; // TAiMR: TCK1 [ NORMAL | MULTIPLY_BY_4 ] Only active for Timer A3. // Flags active when not using two-phase mode. uint8_t output_pulse:1; // TAIMR: MR0 . TAiOUT is N-channel open drain output when bit is set. uint8_t count_rising_edge:1; // TAiMR: MR1 . Active when event_trigger = TAiIN uint8_t up_down_switch:1; // TAiMR: MR2 [ UDF | TAiOUT ] uint8_t up_count:1; // UDF: TAiUD . Active when up_down_switch = UDF uint8_t event_source:2; // ONSF/TRGS: TAiTG [ TAiIN | TB2 | TA_PREV | TA_NEXT ] // Flags active in both modes uint8_t operation_type:1; // TAiMR: TCK0 [ RELOAD | FREE_RUN ] } sta_counter; // "operation_type" enum { M16C_TMR_CTR_OT_RELOAD = 0x0, M16C_TMR_CTR_OT_FREE_RUN = 0x1 }; // "up_down_switch" enum { M16C_TMR_CTR_UDS_UDF = 0x0, M16C_TMR_CTR_UDS_TAiOUT = 0x1 }; // "two_phase_processing" enum { M16C_TMR_CTR_TPP_NORMAL = 0x0, M16C_TMR_CTR_TPP_MULTIPLY_BY_4 = 0x1 }; /* TimerA one shot mode. */ typedef struct { uint8_t output_pulse:1; // TAiMR: MR0 . TAiOUT pin is a pulse output pin if bit is set. uint8_t ext_trigger_rising_edge:1;// TAiMR: MR1 . Trigger on rising edge of input signal to TAiIN if bit is set. Active when TAiTG = 00b. uint8_t trigger:1; // TAiMR: MR2 [ TAiOS | TAiTG ] uint8_t count_src:2; // TAiMR: TCK0, TCK1 [ F1_2 | F8 | F32 | FC32 ] uint8_t TAiTG_trigger_source:2; // ONSF/TRGS: TAiTG [ TAiIN | TB2 | TA_PREV | TA_NEXT ]. Active if trigger = TAiTG } sta_one_shot; // "trigger" enum { M16C_TMRA_OS_T_TAiOS = 0x00, M16C_TMRA_OS_T_TAiTG = 0x01 }; /* TimerB Counter mode. */ typedef struct { uint8_t count_polarity:2; // TBiMR: MR0, MR1 [ EXT_FALLING_EDGE | EXT_RISING_EDGE | EXT_BOTH ] . Effective if event_source = TBiIN. uint8_t event_source:1; // TBiMR: TCK1 [ TBiIN | TBj ] . j = i-1, except j = 2 if i = 0 and j = 5 if i = 3. } stb_counter; // "counter_polarity" enum { M16C_TMRB_CTR_CP_EXT_FALLING_EDGE = 0x0, M16C_TMRB_CTR_CP_EXT_RISING_EDGE = 0x1, M16C_TMRB_CTR_CP_EXT_BOTH = 0x2, }; // "event_source" enum { M16C_TMRB_CTR_ES_TBiIN = 0x0, M16C_TMRB_CTR_ES_TBj = 0x1 }; /* Common settings */ // TimerA One Shot "TAiTG_trigger_source" , TimerA Counter "event_source" enum { M16C_TMRA_TES_TAiIN = 0x0, M16C_TMRA_TES_TB2 = 0x1, M16C_TMRA_TES_TA_PREV = 0x2, M16C_TMRA_TES_TA_NEXT = 0x3 }; // TimerA/B, TimerA One Shot : "count_src" enum { M16C_TMR_CS_F1_2 = 0x0, M16C_TMR_CS_F8 = 0x1, M16C_TMR_CS_F32 = 0x2, M16C_TMR_CS_FC32 = 0x3 }; #endif // __M16C60TMR_H__ tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/M16c60TimerAInitC.nc000077500000000000000000000070251207233610700231660ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Initialize an M16c/60 TimerA to a particular mode. Expected to be * used at boot time. * @param mode The desired mode of the timer. * @param count_src Count source if applicable. * * @author Henrik Makitaavola */ #include "M16c60Timer.h" generic module M16c60TimerAInitC(uint8_t mode, uint8_t count_src, uint16_t reload, bool enable_interrupt, bool start, bool allow_stop_mode) { provides interface Init @atleastonce(); uses interface HplM16c60TimerACtrl as TimerCtrl; uses interface HplM16c60Timer as Timer; } implementation { command error_t Init.init() { st_timer timer = {0}; sta_counter counter = {0}; sta_one_shot one_shot = {0}; atomic { call Timer.allowStopMode(allow_stop_mode); if (mode == TMR_TIMER_MODE) { timer.gate_func = M16C_TMR_TMR_GF_NO_GATE; timer.count_src = count_src; call TimerCtrl.setTimerMode(timer); call Timer.set(reload); } else if (mode == TMR_COUNTER_MODE) { // 'tmp' only used for avoiding "large integer // implicitly truncated to unsigned type" warning counter.event_source = count_src; call TimerCtrl.setCounterMode(counter); call Timer.set(reload); } else if (mode == TMR_ONE_SHOT_MODE) { one_shot.trigger = M16C_TMRA_OS_T_TAiOS; one_shot.count_src = count_src; call TimerCtrl.setOneShotMode(one_shot); } if (enable_interrupt) { call Timer.enableInterrupt(); } if (start) { call Timer.on(); } } return SUCCESS; } async event void Timer.fired() {} } tinyos-2.1.2+dfsg/tos/chips/m16c60/timer/M16c60TimerBInitC.nc000077500000000000000000000066031207233610700231700ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Initialize an M16c/60 TimerB to a particular mode. Expected to be * used at boot time. * @param mode The desired mode of the timer. * @param count_src Count source if applicable. * * @author Henrik Makitaavola */ generic module M16c60TimerBInitC(uint8_t mode, uint8_t count_src, uint16_t reload, bool enable_interrupt, bool start, bool allow_stop_mode) { provides interface Init @atleastonce(); uses interface HplM16c60TimerBCtrl as TimerCtrl; uses interface HplM16c60Timer as Timer; } implementation { command error_t Init.init() { uint8_t tmp; error_t ret = SUCCESS; st_timer timer = {0}; stb_counter counter = {0}; atomic { call Timer.allowStopMode(allow_stop_mode); if (mode == TMR_TIMER_MODE) { timer.gate_func = M16C_TMR_TMR_GF_NO_GATE; timer.count_src = count_src; call TimerCtrl.setTimerMode(timer); call Timer.set(reload); } else if (mode == TMR_COUNTER_MODE) { // 'tmp' only used for avoiding "large integer // implicitly truncated to unsigned type" warning tmp = count_src & 1; counter.event_source = tmp; call TimerCtrl.setCounterMode(counter); call Timer.set(reload); } else { ret = FAIL; } if (enable_interrupt) { call Timer.enableInterrupt(); } if (start) { call Timer.on(); } } return ret; } async event void Timer.fired() {} } tinyos-2.1.2+dfsg/tos/chips/m16c60/uart/000077500000000000000000000000001207233610700175635ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/m16c60/uart/HplM16c60Uart.nc000077500000000000000000000114201207233610700222620ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL interface for a M16c/60 uart. * * @author Henrik Makitaavola * @author Alec Woo * @author Jonathan Hui */ #include "M16c60Uart.h" interface HplM16c60Uart { async command void setMode(m16c60_uart_mode mode); async command void setSpeed(uint8_t speed); async command uint8_t getSpeed(); async command void setCountSource(m16c60_uart_count_source source); async command void setParity(uart_parity_t parity); async command uart_parity_t getParity(); async command void setStopBits(uart_stop_bits_t stop_bits); async command uart_stop_bits_t getStopBits(); async command void enableCTSRTS(); async command void disableCTSRTS(); async command void enableTx(); async command void disableTx(); async command bool isTxEnabled(); async command void enableRx(); async command void disableRx(); async command bool isRxEnabled(); async command void enableTxInterrupt(); async command void disableTxInterrupt(); async command void enableRxInterrupt(); async command void disableRxInterrupt(); async command void tx( uint8_t data ); async command bool isTxEmpty(); async event void txDone(); async command uint8_t rx(); async command bool isRxEmpty(); async event void rxDone(); async command void i2cStart(); async command void i2cStop(); async command void i2cTx(uint8_t byte); async command bool i2cWaitTx(); async command void i2cStartRx(bool nack); async command uint8_t i2cWaitRx(); } tinyos-2.1.2+dfsg/tos/chips/m16c60/uart/HplM16c60UartC.nc000077500000000000000000000150251207233610700223720ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Martin Turon * @author David Gay */ /** * The M16c/60 uart ports. * * @author Henrik Makitaavola */ configuration HplM16c60UartC { provides { interface HplM16c60Uart as HplUart0; interface HplM16c60Uart as HplUart1; interface HplM16c60Uart as HplUart2; } } implementation { components HplM16c60GeneralIOC as IOs, HplM16c60UartInterruptP as Irqs, new HplM16c60UartP(0, (uint16_t)&U0TB.WORD, (uint16_t)&U0RB.BYTE.U0RBL, (uint16_t)&U0BRG, (uint16_t)&U0MR.BYTE, (uint16_t)&U0SMR.BYTE, (uint16_t)&U0SMR2.BYTE, (uint16_t)&U0SMR3.BYTE, (uint16_t)&U0SMR4.BYTE, (uint16_t)&U0C0.BYTE, (uint16_t)&U0C1.BYTE, (uint16_t)&S0TIC.BYTE, (uint16_t)&S0RIC.BYTE, (uint16_t)&U0BCNIC.BYTE) as HplUart0P, new HplM16c60UartP(1, (uint16_t)&U1TB.WORD, (uint16_t)&U1RB.BYTE.U1RBL, (uint16_t)&U1BRG, (uint16_t)&U1MR.BYTE, (uint16_t)&U1SMR.BYTE, (uint16_t)&U1SMR2.BYTE, (uint16_t)&U1SMR3.BYTE, (uint16_t)&U1SMR4.BYTE, (uint16_t)&U1C0.BYTE, (uint16_t)&U1C1.BYTE, (uint16_t)&S1TIC.BYTE, (uint16_t)&S1RIC.BYTE, (uint16_t)&U1BCNIC.BYTE) as HplUart1P, new HplM16c60UartP(2, (uint16_t)&U2TB.WORD, (uint16_t)&U2RB.BYTE.U2RBL, (uint16_t)&U2BRG, (uint16_t)&U2MR.BYTE, (uint16_t)&U2SMR.BYTE, (uint16_t)&U2SMR2.BYTE, (uint16_t)&U2SMR3.BYTE, (uint16_t)&U2SMR4.BYTE, (uint16_t)&U2C0.BYTE, (uint16_t)&U2C1.BYTE, (uint16_t)&S2TIC.BYTE, (uint16_t)&S2RIC.BYTE, (uint16_t)&BCNIC.BYTE) as HplUart2P; components new StopModeControlC() as Uart0StopModeControl, new StopModeControlC() as Uart1StopModeControl, new StopModeControlC() as Uart2StopModeControl; HplUart0 = HplUart0P.HplUart; HplUart0P.TxIO -> IOs.PortP63; HplUart0P.RxIO -> IOs.PortP62; HplUart0P.Irq -> Irqs.Uart0; HplUart0P.StopModeControl -> Uart0StopModeControl; HplUart1 = HplUart1P.HplUart; HplUart1P.TxIO -> IOs.PortP67; HplUart1P.RxIO -> IOs.PortP66; HplUart1P.Irq -> Irqs.Uart1; HplUart1P.StopModeControl -> Uart1StopModeControl; HplUart2 = HplUart2P.HplUart; HplUart2P.TxIO -> IOs.PortP70; HplUart2P.RxIO -> IOs.PortP71; HplUart2P.Irq -> Irqs.Uart2; HplUart2P.StopModeControl -> Uart2StopModeControl; #ifdef THREADS components PlatformInterruptC; Irqs.PlatformInterrupt -> PlatformInterruptC; #endif } tinyos-2.1.2+dfsg/tos/chips/m16c60/uart/HplM16c60UartInterrupt.nc000077500000000000000000000040251207233610700242020ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface for interrupt signals from a uart. * * @author Henrik Makitaavola */ interface HplM16c60UartInterrupt { /** * Signal when an tx interrupt occurs. */ async event void tx(); /** * Signal when an rx interrupt occurs. */ async event void rx(); } tinyos-2.1.2+dfsg/tos/chips/m16c60/uart/HplM16c60UartInterruptP.nc000077500000000000000000000057741207233610700243360ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * All uart interrupt vector handlers. * These are wired in HplM16c60UartC. * * @author Henrik Makitaavola */ module HplM16c60UartInterruptP { provides interface HplM16c60UartInterrupt as Uart0; provides interface HplM16c60UartInterrupt as Uart1; provides interface HplM16c60UartInterrupt as Uart2; #ifdef THREADS uses interface PlatformInterrupt; #define POST_AMBLE() call PlatformInterrupt.postAmble() #else #define POST_AMBLE() #endif } implementation { default async event void Uart0.tx() { } M16C_INTERRUPT_HANDLER(M16C_UART0_NACK) { signal Uart0.tx(); POST_AMBLE(); } default async event void Uart0.rx() { } M16C_INTERRUPT_HANDLER(M16C_UART0_ACK) { signal Uart0.rx(); POST_AMBLE(); } default async event void Uart1.tx() { } M16C_INTERRUPT_HANDLER(M16C_UART1_NACK) { signal Uart1.tx(); POST_AMBLE(); } default async event void Uart1.rx() { } M16C_INTERRUPT_HANDLER(M16C_UART1_ACK) { signal Uart1.rx(); POST_AMBLE(); } default async event void Uart2.tx() { } M16C_INTERRUPT_HANDLER(M16C_UART2_NACK) { signal Uart2.tx(); POST_AMBLE(); } default async event void Uart2.rx() { } M16C_INTERRUPT_HANDLER(M16C_UART2_ACK) { signal Uart2.rx(); POST_AMBLE(); } } tinyos-2.1.2+dfsg/tos/chips/m16c60/uart/HplM16c60UartP.nc000077500000000000000000000317361207233610700224160ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Alec Woo * @author Jonathan Hui */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Martin Turon * @author David Gay */ /** * Generic HPL module for a Uart(0-2) port on the M16c/60 MCU. * When used in I2C mode the rx/tx interrupts are generated on * acks and nacks. * * @author Henrik Makitaavola */ #include "M16c60Uart.h" generic module HplM16c60UartP(uint8_t uartNr, uint16_t tx_addr, uint16_t rx_addr, uint16_t brg_addr, uint16_t mode_addr, uint16_t smode_addr, uint16_t smode2_addr, uint16_t smode3_addr, uint16_t smode4_addr, uint16_t ctrl0_addr, uint16_t ctrl1_addr, uint16_t txInterrupt_addr, uint16_t rxInterrupt_addr, uint16_t bcnic_addr) { provides interface HplM16c60Uart as HplUart; uses interface GeneralIO as TxIO; uses interface GeneralIO as RxIO; uses interface HplM16c60UartInterrupt as Irq; uses interface StopModeControl; } implementation { #define txBuf (*TCAST(volatile uint16_t* ONE, tx_addr)) #define rxBuf (*TCAST(volatile uint8_t* ONE, rx_addr)) #define txInterrupt (*TCAST(volatile uint8_t* ONE, txInterrupt_addr)) #define rxInterrupt (*TCAST(volatile uint8_t* ONE, rxInterrupt_addr)) #define bcnic (*TCAST(volatile uint8_t* ONE, bcnic_addr)) #define brg (*TCAST(volatile uint8_t* ONE, brg_addr)) #define mode (*TCAST(volatile uint8_t* ONE, mode_addr)) #define smode (*TCAST(volatile uint8_t* ONE, smode_addr)) #define smode2 (*TCAST(volatile uint8_t* ONE, smode2_addr)) #define smode3 (*TCAST(volatile uint8_t* ONE, smode3_addr)) #define smode4 (*TCAST(volatile uint8_t* ONE, smode4_addr)) #define ctrl0 (*TCAST(volatile uint8_t* ONE, ctrl0_addr)) #define ctrl1 (*TCAST(volatile uint8_t* ONE, ctrl1_addr)) async command void HplUart.setMode(m16c60_uart_mode set_mode) { mode &= ~(0x7); smode = 0; smode2 = 0; smode3 = 0; smode4 = 0; switch(set_mode) { case M16C60_UART_MODE_UART_8BITS: SET_BIT(mode, 0); SET_BIT(mode, 2); break; case M16C60_UART_MODE_SPI0: SET_BIT(smode3, 1); ctrl0 = 0x90; SET_BIT(mode, 0); break; case M16C60_UART_MODE_SPI1: ctrl0 = 0xD0; SET_BIT(mode, 0); break; case M16C60_UART_MODE_SPI2: SET_BIT(smode3, 1); ctrl0 = 0xD0; SET_BIT(mode, 0); break; case M16C60_UART_MODE_SPI3: ctrl0 = 0x90; SET_BIT(mode, 0); break; case M16C60_UART_MODE_I2C: call TxIO.makeInput(); call RxIO.makeInput(); bcnic = 0; txInterrupt = 0; rxInterrupt = 0; call HplUart.disableCTSRTS(); SET_BIT(ctrl0, 5); CLR_BIT(ctrl0, 6); SET_BIT(ctrl0, 7); SET_BIT(smode, 0); SET_BIT(smode2, 1); SET_BIT(smode4, 4); SET_BIT(smode4, 5); SET_BIT(mode, 1); break; case M16C60_UART_MODE_OFF: call StopModeControl.allowStopMode(true); return; break; } call StopModeControl.allowStopMode(false); } async command void HplUart.setSpeed(uint8_t speed) { brg = speed; } async command uint8_t HplUart.getSpeed() { return brg; } async command void HplUart.setCountSource(m16c60_uart_count_source source) { ctrl0 &= (~0x3); ctrl0 |= source; } async command void HplUart.setParity(uart_parity_t parity) { switch (parity) { case TOS_UART_PARITY_NONE: CLR_BIT(mode, 6); break; case TOS_UART_PARITY_EVEN: SET_BIT(mode, 6); SET_BIT(mode, 5); break; case TOS_UART_PARITY_ODD: SET_BIT(mode, 6); CLR_BIT(mode, 5); break; default: break; } } async command uart_parity_t HplUart.getParity() { if (READ_BIT(mode, 6) && READ_BIT(mode, 5)) { return TOS_UART_PARITY_EVEN; } else if (READ_BIT(mode, 6)) { return TOS_UART_PARITY_ODD; } else { return TOS_UART_PARITY_NONE; } } async command void HplUart.setStopBits(uart_stop_bits_t stop_bits) { switch (stop_bits) { case TOS_UART_STOP_BITS_1: CLR_BIT(mode, 4); break; case TOS_UART_STOP_BITS_2: SET_BIT(mode, 4); break; default: break; } } async command uart_stop_bits_t HplUart.getStopBits() { if (READ_BIT(mode, 4)) { return TOS_UART_STOP_BITS_2; } else { return TOS_UART_STOP_BITS_1; } } async command void HplUart.enableCTSRTS() { CLR_BIT(ctrl0, 4); } async command void HplUart.disableCTSRTS() { SET_BIT(ctrl0, 4); } async command void HplUart.enableTx() { call TxIO.makeOutput(); SET_BIT(ctrl1, 0); } async command void HplUart.disableTx() { while (!READ_BIT(ctrl0, 3)); // If transmitting, wait for it to finish call TxIO.makeInput(); CLR_BIT(ctrl1, 0); } async command bool HplUart.isTxEnabled() { return READ_BIT(ctrl1, 0); } async command void HplUart.enableRx() { call RxIO.makeInput(); SET_BIT(ctrl1, 2); } async command void HplUart.disableRx() { CLR_BIT(ctrl1, 2); } async command bool HplUart.isRxEnabled() { return READ_BIT(ctrl1, 2); } async command void HplUart.enableTxInterrupt() { atomic { clear_interrupt(txInterrupt_addr); SET_BIT(ctrl1, 1); CLR_BIT(UCON.BYTE, uartNr); SET_BIT(txInterrupt, 0); } } async command void HplUart.disableTxInterrupt() { CLR_BIT(txInterrupt, 0); } async command void HplUart.enableRxInterrupt() { atomic { clear_interrupt(rxInterrupt_addr); SET_BIT(rxInterrupt, 0); } } async command void HplUart.disableRxInterrupt() { CLR_BIT(rxInterrupt, 0); } async command bool HplUart.isTxEmpty() { return READ_BIT(ctrl1, 1); } async command bool HplUart.isRxEmpty() { return !READ_BIT(ctrl1, 3); } async command uint8_t HplUart.rx() { return rxBuf; } async command void HplUart.tx(uint8_t data) { txBuf = data; } async event void Irq.rx() { signal HplUart.rxDone(); } async event void Irq.tx() { signal HplUart.txDone(); } // TODO(henrik) Add a event for the BCNIC interrupt. This makes it // possible to generate start and stops async. async command void HplUart.i2cStart() { smode4 = 0x09; // Generate start. while (!READ_BIT(bcnic, 3)); clear_interrupt(bcnic_addr); smode3 = 0x02; // Drive SCL low between byte transfers. smode4 = 0x00; // Enable output on SDA pin. } async command void HplUart.i2cStop() { smode4 = 0x0C; // Generate stop. while (!READ_BIT(bcnic, 3)); clear_interrupt(bcnic_addr); smode3 = 0x00; // Let SCL float while bus is idle. smode4 = 0x30; // Let SDA float while bus is idle. } void clearInterrupts() { clear_interrupt(txInterrupt_addr); clear_interrupt(rxInterrupt_addr); } async command void HplUart.i2cTx(uint8_t byte) { clearInterrupts(); U2TB.WORD = 0x0100 | (uint16_t)byte; // Bit 8 must be high for the slave // to be able to ack. } async command bool HplUart.i2cWaitTx() { while(!READ_BIT(rxInterrupt, 3) && !READ_BIT(txInterrupt, 3)); if (READ_BIT(rxInterrupt, 3)) { clearInterrupts(); return true; } else { clearInterrupts(); return false; } } async command void HplUart.i2cStartRx(bool nack) { if (nack) { txBuf = 0x01FF; } else { txBuf = 0x00FF; } } async command uint8_t HplUart.i2cWaitRx() { while(!READ_BIT(rxInterrupt, 3) && !READ_BIT(txInterrupt, 3)); clearInterrupts(); return rxBuf; } default async event void HplUart.txDone() {} default async event void HplUart.rxDone() {} } tinyos-2.1.2+dfsg/tos/chips/m16c60/uart/M16c60I2CC.nc000066400000000000000000000047531207233610700213730ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Wiring for the I2CPacket interfaces for M16C/60. * * @author Henrik Makitaavola */ #include "I2C.h" configuration M16c60I2CC { provides { interface I2CPacket as I2CPacket0; interface AsyncStdControl as I2CPacket0Control; interface I2CPacket as I2CPacket1; interface AsyncStdControl as I2CPacket1Control; interface I2CPacket as I2CPacket2; interface AsyncStdControl as I2CPacket2Control; } } implementation { components new M16c60I2CP() as I2C0, new M16c60I2CP() as I2C1, new M16c60I2CP() as I2C2, HplM16c60UartC as Uart; I2C0.HplUart -> Uart.HplUart0; I2CPacket0 = I2C0; I2CPacket0Control = I2C0; I2C1.HplUart -> Uart.HplUart1; I2CPacket1 = I2C1; I2CPacket1Control = I2C1; I2C2.HplUart -> Uart.HplUart2; I2CPacket2 = I2C2; I2CPacket2Control = I2C2; } tinyos-2.1.2+dfsg/tos/chips/m16c60/uart/M16c60I2CP.nc000066400000000000000000000143041207233610700214010ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * I2CPacket interface implementation for a M16c/60 Uart. * * @author Henrik Makitaavola */ #include "I2C.h" generic module M16c60I2CP() { provides interface I2CPacket; provides interface AsyncStdControl; uses interface HplM16c60Uart as HplUart; } implementation { enum { S_OFF, S_IDLE, S_READ_SEND_ADDR, S_READ, S_WRITE, }; norace uint8_t m_state = S_OFF; norace uint8_t* m_data; norace uint8_t m_length; norace uint8_t m_data_pos; norace uint16_t m_addr; norace error_t m_error; norace i2c_flags_t m_flags; void receiveNext(); void writeNext(); void setIdleState() { atomic m_state = S_IDLE; call HplUart.disableTxInterrupt(); call HplUart.disableRxInterrupt(); } async command error_t AsyncStdControl.start() { if (m_state != S_OFF) { return EALREADY; } call HplUart.setMode(M16C60_UART_MODE_I2C); // TODO(henrik) Dont hardcode the speed here. call HplUart.setSpeed((unsigned char)((((float)MAIN_CRYSTAL_SPEED*1000000.0) / (2.0 * (100000.0))) - 0.5)); call HplUart.enableTx(); call HplUart.enableRx(); m_state = S_IDLE; return SUCCESS; } async command error_t AsyncStdControl.stop() { if (m_state == S_OFF) { return EALREADY; } else if (m_state != S_IDLE) { return EBUSY; } call HplUart.setMode(M16C60_UART_MODE_OFF); m_state = S_OFF; return SUCCESS; } async command error_t I2CPacket.read(i2c_flags_t flags, uint16_t addr, uint8_t length, uint8_t* data) { if (m_state == S_OFF) { return EOFF; } else if (m_state != S_IDLE) { return EBUSY; } atomic { m_state = S_READ; m_addr = addr; m_flags = flags; m_length = length; m_data = data; m_data_pos = 0; } if (m_flags & I2C_START) { atomic m_state = S_READ_SEND_ADDR; call HplUart.i2cStart(); call HplUart.enableRxInterrupt(); call HplUart.enableTxInterrupt(); call HplUart.i2cTx((addr<<1)+1); } else { call HplUart.enableRxInterrupt(); call HplUart.enableTxInterrupt(); receiveNext(); } return SUCCESS; } void receiveNext() { bool nack = false; if (m_data_pos == m_length) { // Reception is done if (m_flags & I2C_STOP) { call HplUart.i2cStop(); } setIdleState(); signal I2CPacket.readDone(SUCCESS, m_addr, m_data_pos, m_data); return; } else if (m_data_pos == m_length - 1 && !(m_flags & I2C_ACK_END)) { nack = true; } call HplUart.i2cStartRx(nack); } async command error_t I2CPacket.write(i2c_flags_t flags, uint16_t addr, uint8_t length, uint8_t* data) { if (m_state == S_OFF) { return EOFF; } else if (m_state != S_IDLE) { return EBUSY; } atomic { m_state = S_WRITE; m_addr = addr; m_flags = flags; m_length = length; m_data = data; m_data_pos = 0; } call HplUart.enableRxInterrupt(); call HplUart.enableTxInterrupt(); if (m_flags & I2C_START) { call HplUart.i2cStart(); call HplUart.i2cTx(addr << 1); } else { writeNext(); } return SUCCESS; } void writeNext() { if (m_data_pos == m_length) { // Sending is done if (m_flags & I2C_STOP) { call HplUart.i2cStop(); } setIdleState(); signal I2CPacket.writeDone(SUCCESS, m_addr, m_data_pos, m_data); } else { atomic call HplUart.i2cTx(m_data[m_data_pos++]); } } void interrupt(bool ack) { switch(m_state) { case S_READ_SEND_ADDR: if (!ack) { setIdleState(); signal I2CPacket.readDone(ENOACK, m_addr, 0, m_data); } else { atomic m_state = S_READ; receiveNext(); } break; case S_READ: m_data[m_data_pos++] = call HplUart.rx(); receiveNext(); break; case S_WRITE: if (!ack) { setIdleState(); signal I2CPacket.writeDone(ENOACK, m_addr, 0, m_data); } else { writeNext(); } break; } } async event void HplUart.txDone() { interrupt(false); } async event void HplUart.rxDone() { interrupt(true); } default async event void I2CPacket.writeDone(error_t e, uint16_t addr, uint8_t length, uint8_t* data) {} default async event void I2CPacket.readDone(error_t e, uint16_t addr, uint8_t length, uint8_t* data) {} } tinyos-2.1.2+dfsg/tos/chips/m16c60/uart/M16c60SpiC.nc000066400000000000000000000050621207233610700215430ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Wiring for the Spi interfaces for M16C/60. * * @author Henrik Makitaavola */ configuration M16c60SpiC { provides interface SpiPacket as SpiPacket0; provides interface SpiByte as SpiByte0; provides interface FastSpiByte as FastSpiByte0; provides interface SpiPacket as SpiPacket1; provides interface SpiByte as SpiByte1; provides interface FastSpiByte as FastSpiByte1; provides interface SpiPacket as SpiPacket2; provides interface SpiByte as SpiByte2; provides interface FastSpiByte as FastSpiByte2; } implementation { components HplM16c60UartC as Uarts, new M16c60SpiP() as Spi0, new M16c60SpiP() as Spi1, new M16c60SpiP() as Spi2; Spi0 -> Uarts.HplUart0; SpiPacket0 = Spi0; SpiByte0 = Spi0; FastSpiByte0 = Spi0; Spi1 -> Uarts.HplUart1; SpiPacket1 = Spi1; SpiByte1 = Spi1; FastSpiByte1 = Spi1; Spi2 -> Uarts.HplUart2; SpiPacket2 = Spi2; SpiByte2 = Spi2; FastSpiByte2 = Spi2; } tinyos-2.1.2+dfsg/tos/chips/m16c60/uart/M16c60SpiP.nc000066400000000000000000000101111207233610700215470ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Spi interface implementations for a M16c/60 Uart. * * @author Henrik Makitaavola */ generic module M16c60SpiP() { provides { interface SpiPacket; interface SpiByte; interface FastSpiByte; } uses interface HplM16c60Uart as HplUart; } implementation { enum { S_IDLE, S_PACKET, }; uint8_t m_state = S_IDLE; uint8_t* m_tx_buf; int8_t* m_rx_buf; uint8_t m_length; uint8_t m_pos; async command error_t SpiPacket.send(uint8_t* txBuf, uint8_t* rxBuf, uint16_t len ) { atomic { if (m_state != S_IDLE) { return EBUSY; } m_state = S_PACKET; } if (len == 0) { return EINVAL; } atomic { m_rx_buf = rxBuf; m_tx_buf = txBuf; m_length = len; m_pos = 0; } call HplUart.enableRxInterrupt(); atomic call HplUart.tx(m_tx_buf[m_pos]); return SUCCESS; } async event void HplUart.rxDone() { atomic { if (m_state != S_PACKET) { return; } m_rx_buf[m_pos++] = call HplUart.rx(); if (m_pos == m_length) { // Done sending and receiving. call HplUart.disableRxInterrupt(); m_state = S_IDLE; signal SpiPacket.sendDone(m_tx_buf, m_rx_buf, m_length, SUCCESS); } else { call HplUart.tx(m_tx_buf[m_pos]); } } } async event void HplUart.txDone() {} default async event void SpiPacket.sendDone(uint8_t* txBuf, uint8_t* rxBuf, uint16_t len, error_t error ) {} async command uint8_t SpiByte.write( uint8_t tx ) { uint8_t tmp = call HplUart.rx(); // Empty rx buf call HplUart.tx(tx); while(call HplUart.isRxEmpty()); return call HplUart.rx(); } async command void FastSpiByte.splitWrite(uint8_t data) { uint8_t tmp = call HplUart.rx(); // Empty rx buf call HplUart.tx(data); } async command uint8_t FastSpiByte.splitReadWrite(uint8_t data) { uint8_t tmp; while(call HplUart.isRxEmpty()); tmp = call HplUart.rx(); call HplUart.tx(data); return tmp; } async command uint8_t FastSpiByte.splitRead() { while(call HplUart.isRxEmpty()); return call HplUart.rx(); } async command uint8_t FastSpiByte.write(uint8_t data) { return call SpiByte.write(data); } } tinyos-2.1.2+dfsg/tos/chips/m16c60/uart/M16c60Uart.h000066400000000000000000000053331207233610700214500ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * M16c60 UART typedefs. * * @author Henrik Makitaavola */ #ifndef __M16C60_UART_H__ #define __M16C60_UART_H__ typedef enum { M16C60_UART_MODE_OFF, M16C60_UART_MODE_UART_8BITS, M16C60_UART_MODE_SPI0, M16C60_UART_MODE_SPI1, M16C60_UART_MODE_SPI2, M16C60_UART_MODE_SPI3, M16C60_UART_MODE_I2C, } m16c60_uart_mode; typedef enum { M16C60_UART_COUNT_SOURCE_F1_2 = 0x0, M16C60_UART_COUNT_SOURCE_F8 = 0x1, M16C60_UART_COUNT_SOURCE_F32 = 0x2, } m16c60_uart_count_source; typedef enum { TOS_UART_300, TOS_UART_600, TOS_UART_1200, TOS_UART_2400, TOS_UART_4800, TOS_UART_9600, TOS_UART_19200, TOS_UART_38400, TOS_UART_57600, } uart_speed_t; typedef enum { TOS_UART_OFF, TOS_UART_RONLY, TOS_UART_TONLY, TOS_UART_DUPLEX } uart_duplex_t; typedef enum { TOS_UART_PARITY_NONE, TOS_UART_PARITY_EVEN, TOS_UART_PARITY_ODD } uart_parity_t; typedef enum { TOS_UART_STOP_BITS_1, TOS_UART_STOP_BITS_2 } uart_stop_bits_t; #endif // __M16C60_UART_H__ tinyos-2.1.2+dfsg/tos/chips/m16c60/uart/M16c60UartC.nc000077500000000000000000000110751207233610700217270ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Alec Woo * @author Jonathan Hui */ /** * HAL of the M16c/60 uarts. * * @author Henrik Makitaavola */ configuration M16c60UartC { provides interface UartByte as Uart0Byte; provides interface UartStream as Uart0Stream; provides interface UartControl as Uart0Control; provides interface UartByte as Uart1Byte; provides interface UartStream as Uart1Stream; provides interface UartControl as Uart1Control; provides interface UartByte as Uart2Byte; provides interface UartStream as Uart2Stream; provides interface UartControl as Uart2Control; } implementation { components HplM16c60UartC as HplUartC, M16c60UartCounterPlatformC as Counter; components new M16c60UartP() as Uart0P; Uart0Byte = Uart0P; Uart0Stream = Uart0P; Uart0Control = Uart0P; Uart0P.Counter -> Counter; Uart0P.HplUart -> HplUartC.HplUart0; components new M16c60UartP() as Uart1P; Uart1Byte = Uart1P; Uart1Stream = Uart1P; Uart1Control = Uart1P; Uart1P.Counter -> Counter; Uart1P.HplUart -> HplUartC.HplUart1; components new M16c60UartP() as Uart2P; Uart2Byte = Uart2P; Uart2Stream = Uart2P; Uart2Control = Uart2P; Uart2P.Counter -> Counter; Uart2P.HplUart -> HplUartC.HplUart2; } tinyos-2.1.2+dfsg/tos/chips/m16c60/uart/M16c60UartP.nc000077500000000000000000000276521207233610700217540ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * Generic HAL uart for M16c/60. * * @author Henrik Makitaavola * @author Alec Woo * @author Jonathan Hui * @author Philip Levis */ #include #include "M16c60Uart.h" generic module M16c60UartP() { provides interface UartByte; provides interface UartStream; provides interface UartControl; uses interface HplM16c60Uart as HplUart; uses interface Counter; } implementation { #define SPEED_F1_2(baud) (uint8_t)(((MAIN_CRYSTAL_SPEED * 1000000.0 / (16.0 * (float)baud))+ 0.5) - 1.0) #define SPEED_F8(baud) (uint8_t)(((MAIN_CRYSTAL_SPEED * 1000000.0 / (128.0 * (float)baud))+ 0.5) - 1.0) norace uint16_t m_tx_len, m_rx_len; norace uint8_t *m_tx_buf, *m_rx_buf; norace uint16_t m_tx_pos, m_rx_pos; norace uint16_t m_byte_time; norace uint8_t m_rx_intr; norace uint8_t m_tx_intr; norace uart_duplex_t mode = TOS_UART_OFF; norace uart_speed_t speed; async command error_t UartStream.enableReceiveInterrupt() { if (mode == TOS_UART_TONLY || mode == TOS_UART_OFF) { return FAIL; } atomic { m_rx_intr = 3; call HplUart.enableRxInterrupt(); } return SUCCESS; } async command error_t UartStream.disableReceiveInterrupt() { if (mode == TOS_UART_TONLY || mode == TOS_UART_OFF) { return FAIL; } atomic { call HplUart.disableRxInterrupt(); m_rx_intr = 0; } return SUCCESS; } async command error_t UartStream.receive( uint8_t* buf, uint16_t len ) { if (mode == TOS_UART_TONLY || mode == TOS_UART_OFF) { return FAIL; } if ( len == 0 ) { return FAIL; } atomic { if ( m_rx_buf ) { return EBUSY; } m_rx_buf = buf; m_rx_len = len; m_rx_pos = 0; m_rx_intr |= 1; call HplUart.enableRxInterrupt(); } return SUCCESS; } async event void HplUart.rxDone() { if ( m_rx_buf ) { m_rx_buf[ m_rx_pos++ ] = call HplUart.rx(); if ( m_rx_pos >= m_rx_len ) { uint8_t* buf = m_rx_buf; atomic { m_rx_buf = NULL; if(m_rx_intr != 3) { call HplUart.disableRxInterrupt(); m_rx_intr = 0; } } signal UartStream.receiveDone( buf, m_rx_len, SUCCESS ); } } else { signal UartStream.receivedByte( call HplUart.rx() ); } } async command error_t UartStream.send( uint8_t *buf, uint16_t len) { if (mode == TOS_UART_RONLY || mode == TOS_UART_OFF) { return FAIL; } if ( len == 0 ) return FAIL; else if ( m_tx_buf ) return EBUSY; m_tx_len = len; m_tx_buf = buf; m_tx_pos = 0; m_tx_intr = 1; call HplUart.enableTxInterrupt(); call HplUart.tx( buf[ m_tx_pos++ ] ); return SUCCESS; } async event void HplUart.txDone() { if (!m_tx_intr) { return; } if ( m_tx_pos < m_tx_len ) { call HplUart.tx( m_tx_buf[ m_tx_pos++ ] ); } else { uint8_t* buf = m_tx_buf; m_tx_buf = NULL; m_tx_intr = 0; call HplUart.disableTxInterrupt(); signal UartStream.sendDone( buf, m_tx_len, SUCCESS ); } } async command error_t UartByte.send( uint8_t byte ) { if (mode == TOS_UART_RONLY || mode == TOS_UART_OFF) { return FAIL; } if(m_tx_intr) return FAIL; call HplUart.tx( byte ); while ( !call HplUart.isTxEmpty() ); return SUCCESS; } async command error_t UartByte.receive( uint8_t * byte, uint8_t timeout) { uint32_t timeout_micro32 = m_byte_time * timeout + 1; uint16_t timeout_micro; uint16_t start; if (mode == TOS_UART_TONLY || mode == TOS_UART_OFF) { return FAIL; } if(m_rx_intr) { return FAIL; } // The timeout clock is 16 bits and counts in TMicro. So a check to test that // the total timeout value is smaller than 0xffff - is needed. // TODO(henrik) Resolve this by lovering the clock speed used by the uart module // or make it 32 bits. if(timeout_micro32 > 0xFFF0) { timeout_micro = 0xFFF0; } else { timeout_micro = (uint16_t) timeout_micro32; } start = call Counter.get(); while ( call HplUart.isRxEmpty() ) { if ( ( (uint16_t)call Counter.get() - start ) >= timeout_micro ) return FAIL; } *byte = call HplUart.rx(); return SUCCESS; } async command error_t UartControl.setSpeed(uart_speed_t s) { if (mode != TOS_UART_OFF) { return FAIL; } speed = s; switch (speed) { // 138us/byte @ 57600 case TOS_UART_300: call HplUart.setCountSource(M16C60_UART_COUNT_SOURCE_F8); call HplUart.setSpeed(SPEED_F8(300)); m_byte_time = 138 * 192; break; case TOS_UART_600: call HplUart.setCountSource(M16C60_UART_COUNT_SOURCE_F8); call HplUart.setSpeed(SPEED_F8(600)); m_byte_time = 138 * 96; break; case TOS_UART_1200: call HplUart.setCountSource(M16C60_UART_COUNT_SOURCE_F8); call HplUart.setSpeed(SPEED_F8(1200)); m_byte_time = 138 * 48; break; case TOS_UART_2400: call HplUart.setCountSource(M16C60_UART_COUNT_SOURCE_F8); call HplUart.setSpeed(SPEED_F8(2400)); m_byte_time = 138 * 24; break; case TOS_UART_4800: call HplUart.setCountSource(M16C60_UART_COUNT_SOURCE_F8); call HplUart.setSpeed(SPEED_F8(4800)); m_byte_time = 138 * 12; break; case TOS_UART_9600: call HplUart.setCountSource(M16C60_UART_COUNT_SOURCE_F1_2); call HplUart.setSpeed(SPEED_F1_2(9600)); m_byte_time = 138 * 6; break; case TOS_UART_19200: call HplUart.setCountSource(M16C60_UART_COUNT_SOURCE_F1_2); call HplUart.setSpeed(SPEED_F1_2(19200)); m_byte_time = 138 * 3; break; case TOS_UART_38400: call HplUart.setCountSource(M16C60_UART_COUNT_SOURCE_F1_2); call HplUart.setSpeed(SPEED_F1_2(38400u)); m_byte_time = 138 * 1.5; break; case TOS_UART_57600: call HplUart.setCountSource(M16C60_UART_COUNT_SOURCE_F1_2); call HplUart.setSpeed(SPEED_F1_2(57600u)); m_byte_time = 138; break; default: m_byte_time = 0xFFFF; // Set maximum value as default. break; } return SUCCESS; } async command uart_speed_t UartControl.speed() { return speed; } void uartOn() { call HplUart.setMode(M16C60_UART_MODE_UART_8BITS); call HplUart.disableCTSRTS(); } async command error_t UartControl.setDuplexMode(uart_duplex_t duplex) { // Turn everything off call HplUart.disableTxInterrupt(); call HplUart.disableTx(); call HplUart.disableRxInterrupt(); call HplUart.disableRx(); m_rx_intr = 0; m_tx_intr = 0; mode = duplex; switch (duplex) { case TOS_UART_OFF: call HplUart.setMode(M16C60_UART_MODE_OFF); break; case TOS_UART_RONLY: uartOn(); call HplUart.enableRx(); break; case TOS_UART_TONLY: uartOn(); call HplUart.enableTx(); break; case TOS_UART_DUPLEX: uartOn(); call HplUart.enableTx(); call HplUart.enableRx(); break; default: break; } return SUCCESS; } async command uart_duplex_t UartControl.duplexMode() { atomic return mode; } async command error_t UartControl.setParity(uart_parity_t parity) { if (mode != TOS_UART_OFF) { return FAIL; } call HplUart.setParity(parity); return SUCCESS; } async command uart_parity_t UartControl.parity() { return call HplUart.getParity(); } async command error_t UartControl.setStop() { if (mode != TOS_UART_OFF) { return FAIL; } call HplUart.setStopBits(TOS_UART_STOP_BITS_2); return SUCCESS; } async command error_t UartControl.setNoStop() { if (mode != TOS_UART_OFF) { return FAIL; } call HplUart.setStopBits(TOS_UART_STOP_BITS_1); return SUCCESS; } async command bool UartControl.stopBits() { return (call HplUart.getStopBits() == TOS_UART_STOP_BITS_2); } async event void Counter.overflow() {} default async event void UartStream.sendDone( uint8_t* buf, uint16_t len, error_t error ){} default async event void UartStream.receivedByte( uint8_t byte ){} default async event void UartStream.receiveDone( uint8_t* buf, uint16_t len, error_t error ){} } tinyos-2.1.2+dfsg/tos/chips/max116xx/000077500000000000000000000000001207233610700172715ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/max116xx/HalMAX116xxReaderP.nc000066400000000000000000000111141207233610700227360ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of a Read interface for the HplMAX116xx chips A/D channels. * The read setup and configuration settings must be initialized via * SetSetup and SetConfiguration before a call to Read.read() should be made. * Note that only SCAN[1:0] = 01 and SCAN[1:0] = 11 makes sense. * Channel select bits will be overwritten by the Read interface. * This module works good to be used with ArbitratedReadC. * * @param T The type that is needed to store a A/D value. * ex: uint8_t for MAX11600-MAX11605 and * uint16_t for MAX11612-MAX11617. * @param p_num_channels Number of A/D channels available on the device. * @author Henrik Makitaavola */ #include "HplMAX116xx.h" generic module HalMAX116xxReaderP(typedef T, uint8_t p_num_channels) { provides interface Read[uint8_t ain_id]; provides interface Set as SetSetup; provides interface Set as SetConfiguration; uses interface HplMAX116xx; } implementation { enum { S_IDLE, S_READ, S_READ_DONE }; uint8_t m_state = S_IDLE; T m_value; error_t m_error; uint8_t m_read_adc_channel; max116xx_setup_t m_read_setup; max116xx_configuration_t m_read_configuration; command void SetSetup.set(max116xx_setup_t setup) { m_read_setup = setup; m_read_setup.reg = 1; } command void SetConfiguration.set(max116xx_configuration_t conf) { m_read_configuration = conf; m_read_configuration.reg = 0; } task void signalTask() { m_state = S_IDLE; signal Read.readDone[m_read_adc_channel](m_error, m_value); } command error_t Read.read[uint8_t ain_id]() { if (m_state != S_IDLE) { return EBUSY; } if (ain_id > (p_num_channels - 1)) { return EINVAL; } m_read_configuration.cs = ain_id; m_read_adc_channel = ain_id; if (call HplMAX116xx.setSetupAndConfiguration(m_read_setup, m_read_configuration) == SUCCESS) { m_state = S_READ; return SUCCESS; } else { return FAIL; } } event void HplMAX116xx.setDone(error_t) { if (m_state != S_READ && m_state != S_READ_DONE) { return; } if (m_state == S_READ) { if (call HplMAX116xx.measureChannels(1, &m_value) != SUCCESS) { m_error = FAIL; post signalTask(); } } else if (m_state == S_READ_DONE) { post signalTask(); } } event void HplMAX116xx.measureChannelsDone(error_t e, uint8_t numChannels, T *buf) { if (m_state != S_READ) { return; } m_state = S_READ_DONE; m_error = e; if (m_error != SUCCESS) { post signalTask(); } else { max116xx_setup_t setup; setup.rst = 0; setup.bip_uni = 0; setup.clk = 0; setup.sel = 0; if (call HplMAX116xx.setSetup(setup) != SUCCESS) { m_error = FAIL; post signalTask(); } } } default event void Read.readDone[uint8_t id](error_t e, T val) {} } tinyos-2.1.2+dfsg/tos/chips/max116xx/HplMAX116xx.h000066400000000000000000000042771207233610700213550ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Henrik Makitaavola */ #ifndef __HPLMAX116XX_H__ #define __HPLMAX116XX_H__ // Max116xx setup register members typedef nx_struct max116xx_setup_t { nx_uint8_t reg:1; // Internal driver use only nx_uint8_t sel:3; nx_uint8_t clk:1; nx_uint8_t bip_uni:1; nx_uint8_t rst:1; nx_uint8_t dont_care:1; // Dont care bit } max116xx_setup_t; // Max116xx configuration register members typedef nx_struct max116xx_configuration_t { nx_uint8_t reg:1; // Internal driver use only nx_uint8_t scan:2; nx_uint8_t cs:4; nx_uint8_t sgl_dif:1; } max116xx_configuration_t; #endif // __HPLMAX116XX_H__ tinyos-2.1.2+dfsg/tos/chips/max116xx/HplMAX116xx.nc000066400000000000000000000075711207233610700215260ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface for the Maxim MAX116xx A/D converter chips. * * @param T The type that is needed to store a A/D value. * uint8_t for MAX11600-MAX11605 and uint16_t for * other versions. * @author Henrik Makitaavola */ #include "HplMAX116xx.h" interface HplMAX116xx { /** * Sets the setup register. * * @param setup Register settings. * @return SUCCESS if the regiser will be set. A SUCCESS will * always be followed by a setDone event. */ command error_t setSetup(max116xx_setup_t setup); /** * Sets the configuration register. * * @param conf Register settings. * @param setup Register settings. * @return SUCCESS if the regiser will be set. A SUCCESS will * always be followed by a setDone event. */ command error_t setConfiguration(max116xx_configuration_t conf); /** * Sets both the setup and configuration registers. * * @param setup The setup register settings. * @param conf The configuration register settings. * @return SUCCESS if the regisers will be set. A SUCCESS will * always be followed by a setDone event. */ command error_t setSetupAndConfiguration(max116xx_setup_t setup, max116xx_configuration_t conf); /** * Measuress one or more A/D channels. The parameter values to this command * varies depending on the settings in the setup and configuration * registers. * * @param numChannels The number of A/D channels that should be read. * @param buf Memory where the values should be stored. This must * be big enough to fit all values. * @return SUCCESS if the A/D values will be read. A SUCCESS will * always be followed by a readAdcsDone event. */ command error_t measureChannels(uint8_t numChannels, T* buf); /** * Event signalled after a set of the setup and/or configuration register. * * @param e SUCCESS if the set of the register was successfull. */ event void setDone(error_t e); /** * Event signalled after a reading of one or more A/D channels. * * @param e SUCCESS will the reading was successfull. * @param numChannels Number of A/D channels read. * @param buf memory where the A/D values are stored. */ event void measureChannelsDone(error_t e, uint8_t numChannels, T* buf); } tinyos-2.1.2+dfsg/tos/chips/max116xx/HplMAX116xxP.nc000066400000000000000000000136411207233610700216410ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Generic implementation of the HplMAX116xx interface. * * @param T The type that is needed to store a A/D value. * ex: uint8_t for MAX11600-MAX11605 and * uint16_t for MAX11612-MAX11617. * @param p_addr I2C address of the device. * @param p_num_channels Number of A/D channels available on the device. * @param p_bit_mask Bit mask for the significant bits. * Ex: 0xFF for a 8 bit A/D device and * 0xFFF for a 12 bit A/D device. * @author Henrik Makitaavola */ #include "HplMAX116xx.h" generic module HplMAX116xxP(typedef T, uint8_t p_addr, uint8_t p_num_channels, uint32_t p_bit_mask) // p_bit_mask is 32 bits for future compatibility { provides interface HplMAX116xx; uses { interface Resource as I2CResource; interface I2CPacket as I2C; } } implementation { enum { S_IDLE, S_SET, S_ADC, }; norace error_t m_error; norace uint8_t m_state = S_IDLE; norace uint8_t m_write_buffer[2]; norace uint8_t m_write_length; norace T* m_read_buffer; norace uint8_t m_read_length; void doI2CTask(); bool isIdle() { return m_state == S_IDLE ? true : false; } error_t requestI2C(uint8_t newState) { if (call I2CResource.request() == SUCCESS) { m_state = newState; return SUCCESS; } else { return FAIL; } } task void signalTask() { uint8_t state = m_state; call I2CResource.release(); m_state = S_IDLE; switch(state) { case S_SET: signal HplMAX116xx.setDone(m_error); break; case S_ADC: signal HplMAX116xx.measureChannelsDone(m_error, m_read_length / sizeof(T), m_read_buffer); break; } } error_t set(max116xx_setup_t *setup, max116xx_configuration_t *conf, uint8_t nextState) { m_write_length = 0; if (setup != 0) { m_write_buffer[m_write_length++] = *((uint8_t*)setup); } if (conf != 0) { m_write_buffer[m_write_length++] = *((uint8_t*)conf); } return requestI2C(nextState); } command error_t HplMAX116xx.setSetup(max116xx_setup_t setup) { if (!isIdle()) { return EBUSY; } setup.reg = 1; return set(&setup, 0, S_SET); } command error_t HplMAX116xx.setConfiguration(max116xx_configuration_t conf) { if (!isIdle()) { return EBUSY; } conf.reg = 0; return set(0, &conf, S_SET); } command error_t HplMAX116xx.setSetupAndConfiguration(max116xx_setup_t setup, max116xx_configuration_t conf) { if (!isIdle()) { return EBUSY; } setup.reg = 1; conf.reg = 0; return set(&setup, &conf, S_SET); } command error_t HplMAX116xx.measureChannels(uint8_t numChannels, T *buf) { if (!isIdle()) { return EBUSY; } m_read_length = numChannels*sizeof(T); m_read_buffer = buf; return requestI2C(S_ADC); } async event void I2C.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { m_error = error; post signalTask(); } async event void I2C.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { m_error = error; if (error == SUCCESS) { uint8_t i,j; uint32_t tmp; for (i = 0; i < length/sizeof(T); ++i) { tmp = 0; for (j = 0; j < sizeof(T); ++j) { tmp |= ( (uint32_t)data[i*sizeof(T)+j] << (8 * (sizeof(T)-j-1)) ); } tmp &= p_bit_mask; // A memcpy is needed because if we try to do a cast we will // get a "conversion to non-scalar type requested" error. // Maybe there is a nicer way to do this? memcpy(&m_read_buffer[i], &tmp, sizeof(T)); } } post signalTask(); } event void I2CResource.granted() { doI2CTask(); } void doI2CTask() { switch (m_state) { case S_SET: call I2C.write(I2C_START | I2C_STOP, p_addr, m_write_length, m_write_buffer); break; case S_ADC: call I2C.read(I2C_START | I2C_STOP, p_addr, m_read_length, (uint8_t*)m_read_buffer); break; } } default event void HplMAX116xx.setDone(error_t) {} default event void HplMAX116xx.measureChannelsDone(error_t e, uint8_t numChannels, T *buf) {} } tinyos-2.1.2+dfsg/tos/chips/max116xx/README.txt000066400000000000000000000003041207233610700207640ustar00rootroot00000000000000HPL and HAL implementation for the Maxim Analog-to-Digital Converters MAX116xx series. NOTE: This implementation has only been tested with a MAX11615 chip but should work with other versions to. tinyos-2.1.2+dfsg/tos/chips/max136x/000077500000000000000000000000001207233610700171035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/max136x/HalMAX136xAdvanced.nc000066400000000000000000000051271207233610700225540ustar00rootroot00000000000000/* $Id: HalMAX136xAdvanced.nc,v 1.4 2006-12-12 18:23:06 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #include "MAX136x.h" interface HalMAX136xAdvanced { command error_t setScanMode(max136x_scanflag_t mode, uint8_t chanlow, uint8_t chanhigh); event void setScanModeDone(error_t error); command error_t setMonitorMode(uint8_t chanlow, uint8_t chanhigh, max136x_delayflag_t delay, uint8_t thresholds[12]); event void setMonitorModeDone(error_t error); command error_t setConversionMode(bool bDifferential, bool bBipolar); event void setConversionModeDone(error_t error); command error_t setClock(bool bExtClk); event void setClockDone(error_t error); command error_t setRef(max136x_selflag_t sel, bool bInRefPwr); event void setRefDone(error_t error); command error_t getStatus(); event void getStatusDone(error_t error, uint8_t status, max136x_data_t data); command error_t enableAlert(bool bEnable); event void enableAlertDone(error_t error); event void alertThreshold(); } tinyos-2.1.2+dfsg/tos/chips/max136x/HalMAX136xControlP.nc000066400000000000000000000200401207233610700225760ustar00rootroot00000000000000/* $Id: HalMAX136xControlP.nc,v 1.4 2006-12-12 18:23:06 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #include "MAX136x.h" module HalMAX136xControlP { provides interface HalMAX136xAdvanced; uses interface Resource; uses interface HplMAX136x; } implementation { enum { S_IDLE, S_SETSCANMODE, S_SETMONMODE, S_SETCONVMODE, S_SETCLK, S_SETREF, S_ENALERT, S_GETSTATUS, }; uint8_t state = S_IDLE; uint8_t mI2CBuffer[8]; uint8_t configByteShadow = 0x01; uint8_t setupByteShadow = 0x83; // 0x82 actually, but we want extended monitor write uint8_t monitorByteShadow = 0x0; error_t clientResult; task void alert_Task() { signal HalMAX136xAdvanced.alertThreshold(); } task void signalDone_Task() { switch(state) { case S_SETSCANMODE: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.setScanModeDone(clientResult); break; case S_SETMONMODE: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.setMonitorModeDone(clientResult); break; case S_SETCONVMODE: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.setConversionModeDone(clientResult); break; case S_SETCLK: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.setClockDone(clientResult); break; case S_SETREF: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.setRefDone(clientResult); break; case S_ENALERT: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.enableAlertDone(clientResult); break; case S_GETSTATUS: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.getStatusDone(clientResult, mI2CBuffer[0], 0); break; default: break; } } command error_t HalMAX136xAdvanced.setScanMode(max136x_scanflag_t mode, uint8_t chanlow, uint8_t chanhigh) { // chanlow is always 0 no matter what client says error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_SETSCANMODE; configByteShadow &= ~(MAX136X_CONFIG_SCAN(0x3) | MAX136X_CONFIG_CS(0xF)); configByteShadow |= MAX136X_CONFIG_SCAN(0x0); configByteShadow |= MAX136X_CONFIG_CS(chanhigh); mI2CBuffer[0] = configByteShadow; call HplMAX136x.setConfig(mI2CBuffer, 1); return SUCCESS; } command error_t HalMAX136xAdvanced.setMonitorMode(uint8_t chanlow, uint8_t chanhigh, max136x_delayflag_t delay, uint8_t thresholds[12]) { // chanlow is always 0 no matter what client says uint8_t i; error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_SETMONMODE; configByteShadow &= ~(MAX136X_CONFIG_SCAN(0x3) | MAX136X_CONFIG_CS(0xF)); configByteShadow |= MAX136X_CONFIG_SCAN(0x2); configByteShadow |= MAX136X_CONFIG_CS(chanhigh); monitorByteShadow &= ~MAX136X_MONITOR_DELAY(7); monitorByteShadow |= MAX136X_MONITOR_DELAY(delay); mI2CBuffer[0] = configByteShadow; mI2CBuffer[1] = setupByteShadow; mI2CBuffer[2] = monitorByteShadow; for(i = 0; i < 12; i++) mI2CBuffer[i+3] = thresholds[i]; call HplMAX136x.setConfig(mI2CBuffer, 15); return SUCCESS; } command error_t HalMAX136xAdvanced.setConversionMode(bool bDifferential, bool bBipolar) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_SETCONVMODE; if(bDifferential) configByteShadow &= ~MAX136X_CONFIG_SE; else configByteShadow |= MAX136X_CONFIG_SE; if(bBipolar) setupByteShadow |= MAX136X_SETUP_BIP; else setupByteShadow &= ~MAX136X_SETUP_BIP; mI2CBuffer[0] = configByteShadow; mI2CBuffer[1] = setupByteShadow; call HplMAX136x.setConfig(mI2CBuffer, 2); return SUCCESS; } command error_t HalMAX136xAdvanced.setClock(bool bExtClk) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_SETCLK; if(bExtClk) setupByteShadow |= MAX136X_SETUP_EXTCLK; else setupByteShadow &= ~MAX136X_SETUP_EXTCLK; mI2CBuffer[0] = setupByteShadow; call HplMAX136x.setConfig(mI2CBuffer, 1); return SUCCESS; } command error_t HalMAX136xAdvanced.setRef(max136x_selflag_t sel, bool bInRefPwr) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_SETREF; if(bInRefPwr) setupByteShadow |= MAX136X_SETUP_INTREFOFF; else setupByteShadow &= ~MAX136X_SETUP_INTREFOFF; setupByteShadow &= ~MAX136X_SETUP_REFAIN3SEL(3); setupByteShadow |= MAX136X_SETUP_REFAIN3SEL(sel); mI2CBuffer[0] = setupByteShadow; call HplMAX136x.setConfig(mI2CBuffer, 1); return SUCCESS; } command error_t HalMAX136xAdvanced.getStatus() { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_GETSTATUS; return call HplMAX136x.readStatus(mI2CBuffer, 2); } command error_t HalMAX136xAdvanced.enableAlert(bool bEnable) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_ENALERT; if(bEnable) monitorByteShadow |= MAX136X_MONITOR_INTEN; else monitorByteShadow &= ~MAX136X_MONITOR_INTEN; mI2CBuffer[0] = setupByteShadow; mI2CBuffer[1] = (0xF0 | monitorByteShadow); call HplMAX136x.setConfig(mI2CBuffer, 2); return SUCCESS; } event void Resource.granted() { // intentionally left blank } async event void HplMAX136x.readStatusDone(error_t error, uint8_t* buf) { clientResult = error; post signalDone_Task(); } async event void HplMAX136x.measureChannelsDone( error_t error, uint8_t *buf, uint8_t len ) { /* intentionally left blank */ } async event void HplMAX136x.setConfigDone( error_t error , uint8_t *cfgbuf, uint8_t len) { clientResult = error; post signalDone_Task(); } async event void HplMAX136x.alertThreshold() { post alert_Task(); } } tinyos-2.1.2+dfsg/tos/chips/max136x/HalMAX136xReaderP.nc000066400000000000000000000053761207233610700223770ustar00rootroot00000000000000/* $Id: HalMAX136xReaderP.nc,v 1.4 2006-12-12 18:23:06 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #include "MAX136x.h" generic module HalMAX136xReaderP() { provides interface Read as ADC; uses interface HplMAX136x; uses interface Resource as MAX136xResource; } implementation { uint8_t channelBuf[2]; command error_t ADC.read() { return call MAX136xResource.request(); } event void MAX136xResource.granted() { error_t error; error = call HplMAX136x.measureChannels(channelBuf, 2); if (error) { call MAX136xResource.release(); signal ADC.readDone(error,0); } } async event void HplMAX136x.measureChannelsDone(error_t error, uint8_t *buf, uint8_t len) { uint16_t result = 0; result = buf[0]; result <<= 8; result += buf[1]; call MAX136xResource.release(); signal ADC.readDone(error,result); return; } async event void HplMAX136x.setConfigDone(error_t error, uint8_t *cfgbuf, uint8_t len) { // intentionally left blank } async event void HplMAX136x.alertThreshold() {} async event void HplMAX136x.readStatusDone(error_t error, uint8_t* buf) { } } tinyos-2.1.2+dfsg/tos/chips/max136x/HplMAX136x.nc000066400000000000000000000043111207233610700211370ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Hpl interface for the MAXIM 136x series ADC chips. * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:06 $ */ interface HplMAX136x { command error_t measureChannels(uint8_t *buf,uint8_t len); async event void measureChannelsDone( error_t error, uint8_t *buf, uint8_t len ); command error_t setConfig( uint8_t *cfgbuf, uint8_t len); async event void setConfigDone( error_t error , uint8_t *cfgbuf, uint8_t len); command error_t readStatus(uint8_t *buf, uint8_t len); async event void readStatusDone(error_t error, uint8_t *buf); async event void alertThreshold(); } tinyos-2.1.2+dfsg/tos/chips/max136x/HplMAX136xLogicP.nc000066400000000000000000000134251207233610700222430ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * MAX136xLogicP is the driver for the MAXIM 136x series ADC chip. * It requires an I2C packet interface and provides the HplMAX136x HPL * interface. * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:06 $ */ #include "I2C.h" generic module HplMAX136xLogicP(uint16_t devAddr) { provides interface Init; provides interface SplitControl; provides interface HplMAX136x; uses interface I2CPacket; uses interface GpioInterrupt as InterruptAlert; uses interface GeneralIO as InterruptPin; } implementation { enum { STATE_IDLE, STATE_STARTING, STATE_STOPPING, STATE_STOPPED, STATE_READCH, STATE_SETCONFIG, STATE_READSTATUS, STATE_ERROR, }; uint8_t mState; bool mStopRequested; norace error_t mSSError; static error_t doWrite(uint8_t nextState, uint8_t *buf, uint8_t len) { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = nextState; } else { error = EBUSY; } } if (error) return error; error = call I2CPacket.write(I2C_START | I2C_STOP, devAddr,len,buf); if (error) atomic mState = STATE_IDLE; return error; } static error_t doRead(uint8_t nextState, uint8_t *buf, uint8_t len) { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = nextState; } else { error = EBUSY; } } if (error) return error; error = call I2CPacket.read(I2C_START | I2C_STOP, devAddr,len,buf); if (error) atomic mState = STATE_IDLE; return error; } task void StartDone() { atomic mState = STATE_IDLE; signal SplitControl.startDone(SUCCESS); return; } task void StopDone() { atomic mState = STATE_STOPPED; signal SplitControl.stopDone(mSSError); return; } command error_t Init.init() { call InterruptPin.makeInput(); call InterruptAlert.enableFallingEdge(); atomic { mStopRequested = FALSE; mState = STATE_STOPPED; } return SUCCESS; } command error_t SplitControl.start() { error_t error = SUCCESS; atomic { if (mState == STATE_STOPPED) { mState = STATE_STARTING; } else { error = EBUSY; } } if (error) return error; return post StartDone(); } command error_t SplitControl.stop() { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = STATE_STOPPING; } else { error = EBUSY; } } if (error) return error; return post StopDone(); } command error_t HplMAX136x.readStatus(uint8_t *buf, uint8_t len) { return doRead(STATE_READSTATUS,buf,len); } command error_t HplMAX136x.measureChannels(uint8_t *buf, uint8_t len) { return doRead(STATE_READCH,buf,len); } command error_t HplMAX136x.setConfig(uint8_t *configbuf, uint8_t len) { return doWrite(STATE_SETCONFIG,configbuf,len); } async event void I2CPacket.readDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { error_t error = i2c_error; switch (mState) { case STATE_READCH: mState = STATE_IDLE; signal HplMAX136x.measureChannelsDone(error, buf, len); break; case STATE_READSTATUS: mState = STATE_IDLE; signal HplMAX136x.readStatusDone(error, buf); break; default: mState = STATE_IDLE; break; } return; } async event void I2CPacket.writeDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { error_t error = i2c_error; switch (mState) { case STATE_SETCONFIG: mState = STATE_IDLE; signal HplMAX136x.setConfigDone(error,buf,len); break; default: mState = STATE_IDLE; break; } return; } async event void InterruptAlert.fired() { // This alert is decoupled from whatever state the MAX136x is in. // Upper layers must handle dealing with this alert appropriately. signal HplMAX136x.alertThreshold(); return; } default event void SplitControl.startDone( error_t error ) { return; } default event void SplitControl.stopDone( error_t error ) { return; } default async event void HplMAX136x.alertThreshold(){ return; } } tinyos-2.1.2+dfsg/tos/chips/max136x/MAX136x.h000066400000000000000000000056151207233610700203320ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Types and definitions for the Maxim 136x general purpose ADC chip * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:06 $ */ #ifndef _MAX136X_H #define _MAX136X_H #define MAX136X_CONFIG_SCAN(_x) (((_x) & 0x3) << 5) #define MAX136X_CONFIG_CS(_x) (((_x) & 0xF) << 1) #define MAX136X_CONFIG_SE (1 << 0) #define MAX136X_SETUP_REFAIN3SEL(_x) (((_x) & 0x3) << 5) #define MAX136X_SETUP_INTREFOFF (1 << 4) #define MAX136X_SETUP_EXTCLK (1 << 3) #define MAX136X_SETUP_BIP (1 << 2) #define MAX136X_SETUP_NRESET (1 << 1) #define MAX136X_SETUP_MONSETUP (1 << 0) #define MAX136X_MONITOR_DELAY(_x) (((_x) & 0x7) << 1) #define MAX136X_MONITOR_INTEN (1 << 0) typedef uint16_t max136x_data_t; typedef enum { MAX136X_SCAN_RANGE = 0, MAX136X_SCAN_REPEATED = 1, MAX136X_SCAN_SINGLE = 3, } max136x_scanflag_t; typedef enum { MAX136X_SEL_VDDREF, // SEL1 = 0, SEL0 = 0 MAX136X_SEL_EXTREF, // SEL1 = 0, SEL0 = 1 MAX136X_SEL_INTREF_AIN3IN, // SEL1 = 1, SEL0 = 0 MAX136X_SEL_INTREF_AIN3OUT // SEL1 = 1, SEL0 = 1 } max136x_selflag_t; typedef enum { MAX136X_DELAY_133_0, MAX136X_DELAY_66_5, MAX136X_DELAY_33_3, MAX136X_DELAY_16_6, MAX136X_DELAY_8_3, MAX136X_DELAY_4_2, MAX136X_DELAY_2_0, MAX136X_DELAY_1_0 } max136x_delayflag_t; #endif /* _MAX136X_H */ tinyos-2.1.2+dfsg/tos/chips/mcp4728/000077500000000000000000000000001207233610700170005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/mcp4728/HplMCP4728.h000066400000000000000000000040211207233610700205560ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Henrik Makitaavola */ #ifndef __HPLMCP4728_H__ #define __HPLMCP4728_H__ typedef enum { MCP4728_POWER_DOWN_NORMAL = 0, MCP4728_POWER_DOWN_1K_RESISTOR = 1, MCP4728_POWER_DOWN_100K_RESISTOR = 2, MCP4728_POWER_DOWN_500K_RESISTOR = 3, } MCP4728_POWER_DOWN; typedef enum { MCP4728_CHANNEL_A = 0, MCP4728_CHANNEL_B = 1, MCP4728_CHANNEL_C = 2, MCP4728_CHANNEL_D = 3 } MCP4728_CHANNEL; #endif // __HPLMCP4728_H__ tinyos-2.1.2+dfsg/tos/chips/mcp4728/HplMCP4728.nc000066400000000000000000000141241207233610700207340ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Hpl interface for Microchips MCP4728 12bit digital-to-analog converter * chip with EEPROM. * * @author Henrik Makitaavola */ #include "HplMCP4728.h" // TODO(henrik) Add support for reading registers and all commands. interface HplMCP4728 { /** * Checks the status of EEPROM programming activity. * * @return TRUE if there is no EEPROM activity. */ command bool EEPROMisReady(); /** * Sets the LDAC pin. * * @param high TRUE if LDAC should be high, FALSE for low. */ command void setLDAC(bool high); /** * Sets the reference voltage for the D/A channels. * * @return SUCCESS if the references will be set and a * setRefereceDone event will be signaled. */ command error_t setReference(bool a_internal, bool b_internal, bool c_internal, bool d_internal); /** * Event that indicates the status of a setReference call. * * @param e SUCCESS if the references were successfully set. */ event void setRefereceDone(error_t e); /** * Sets the gain on the D/A channels. * * @param a TRUE for gain of 2, * FALSE for gain 1 on channel a. * @param b TRUE for gain of 2, * FALSE for gain 1 on channel b. * @param c TRUE for gain of 2, * FALSE for gain 1 on channel c. * @param d TRUE for gain of 2, * FALSE for gain 1 on channel d. * * @return SUCCESS if the gains will be set and a * setGainDone event will be signaled. */ command error_t setGain(bool a, bool b, bool c, bool d); /** * Event that indicates the status of a setGain call. * * @param e SUCCESS if the gains were successfully set. */ event void setGainDone(error_t e); /** * Sets power-down mode for the D/A channels. * * @return SUCCESS if the modes will be set and a * setPowerDownDone event will be signaled. */ command error_t setPowerDown(MCP4728_POWER_DOWN a, MCP4728_POWER_DOWN b, MCP4728_POWER_DOWN c, MCP4728_POWER_DOWN d); /** * Event that indicates the status of a setPowerDown call. * * @param e SUCCESS if the power down modes were successfully set. */ event void setPowerDownDone(error_t e); /** * Sets output voltage on the D/A channels. The input is the value * that should be written to the register. * * @return SUCCESS if the voltages will be set and a * setOutputVoltageDone event will be signaled. */ command error_t setOutputVoltage(uint16_t a, uint16_t b, uint16_t c, uint16_t d); /** * Event that indicates the status of a setOutputVoltage call. * * @param e SUCCESS if the voltages were successfully set. */ event void setOutputVoltageDone(error_t e); /** * Specifies the settings of a D/A channel and stores the settings * in EEPROM. On SUCCESS a writeDACRegisterAndEEPROM event is signaled. * * @param channel The channel that the settings should be written to. * @param volt The output voltage of the channel. volt is the value * that will be written to the register and EEPROM. * @param internal_vref TRUE for internal- and * FALSE for external reference. * @param power_down Power-Down mode of the channel. * @param gain TRUE for gain of 2 and FALSE for gain 1. * @param upload TRUE if the voltage output should be updated. * * @return SUCCESS if the settings will be set and a * writeDACRegisterAndEEPROMDone event will be signaled. */ command error_t writeDACRegisterAndEEPROM(MCP4728_CHANNEL channel, uint16_t volt, bool internal_vref, MCP4728_POWER_DOWN power_down, bool gain, bool upload); /** * Event that indicates the status of a writeDACRegisterAndEEPROM call. * * @param e SUCCESS if the call were successful. * @param channel The channel that the settings were applied to. */ event void writeDACRegisterAndEEPROMDone(error_t e, MCP4728_CHANNEL channel); } tinyos-2.1.2+dfsg/tos/chips/mcp4728/HplMCP4728P.nc000066400000000000000000000146641207233610700210650ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the Hpl interface for Microchips MCP4728 12bit * digital-to-analog converter chip with EEPROM. * * @param p_addr The I2C address of the device. * * @author Henrik Makitaavola */ #include "HplMCP4728.h" generic module HplMCP4728P(uint8_t p_addr) { provides interface HplMCP4728; provides interface Init; uses { interface Resource as I2CResource; interface I2CPacket as I2C; interface GeneralIO as RDY; interface GeneralIO as LDAC; } } implementation { enum { S_IDLE, S_SET_REF, S_SET_GAIN, S_SET_POWER_DOWN, S_SET_OUTPUT, S_SET_DAC_REGISTER_EEPROM }; norace uint8_t m_state = S_IDLE; norace uint8_t m_buffer[15]; norace uint8_t m_write_length; norace uint8_t m_dac; norace error_t m_error; task void isReady() { if (!call HplMCP4728.EEPROMisReady()) { post isReady(); } else { call I2C.write(I2C_START | I2C_STOP, p_addr, m_write_length, m_buffer); } } bool isIdle() { return m_state == S_IDLE ? true : false; } error_t requestI2C(uint8_t newState) { if (call I2CResource.request() == SUCCESS) { m_state = newState; return SUCCESS; } else { return FAIL; } } task void signalTask() { uint8_t state = m_state; call I2CResource.release(); m_state = S_IDLE; call LDAC.clr(); call LDAC.set(); switch(state) { case S_SET_REF: signal HplMCP4728.setRefereceDone(m_error); break; case S_SET_GAIN: signal HplMCP4728.setGainDone(m_error); break; case S_SET_POWER_DOWN: signal HplMCP4728.setPowerDownDone(m_error); break; case S_SET_OUTPUT: signal HplMCP4728.setOutputVoltageDone(m_error); break; case S_SET_DAC_REGISTER_EEPROM: signal HplMCP4728.writeDACRegisterAndEEPROMDone(m_error, m_dac); break; } } command error_t Init.init() { call RDY.makeInput(); call LDAC.makeOutput(); call LDAC.set(); return SUCCESS; } command bool HplMCP4728.EEPROMisReady() { return call RDY.get(); } command void HplMCP4728.setLDAC(bool high) { if (high) { call LDAC.set(); } else { call LDAC.clr(); } } command error_t HplMCP4728.setReference(bool a_internal, bool b_internal, bool c_internal, bool d_internal) { if (!isIdle()) { return EBUSY; } m_buffer[0] = 0x80 | a_internal << 3 | b_internal << 2 | c_internal << 1 | d_internal; m_write_length = 1; return requestI2C(S_SET_REF); } command error_t HplMCP4728.setGain(bool a, bool b, bool c, bool d) { if (!isIdle()) { return EBUSY; } m_buffer[0] = 0xc0 | a << 3 | b << 2 | c << 1 | d; m_write_length = 1; return requestI2C(S_SET_GAIN); } command error_t HplMCP4728.setPowerDown(MCP4728_POWER_DOWN a, MCP4728_POWER_DOWN b, MCP4728_POWER_DOWN c, MCP4728_POWER_DOWN d) { if (!isIdle()) { return EBUSY; } m_buffer[0] = 0xa0 | a << 2 | b; m_buffer[1] = c << 6 | d << 4; m_write_length = 2; return requestI2C(S_SET_POWER_DOWN); } command error_t HplMCP4728.setOutputVoltage(uint16_t a, uint16_t b, uint16_t c, uint16_t d) { if (!isIdle()) { return EBUSY; } m_buffer[0] = 0x0F & (a >> 8); m_buffer[1] = 0xFF & a; m_buffer[2] = 0x0F & (b >> 8); m_buffer[3] = 0xFF & b; m_buffer[4] = 0x0F & (c >> 8); m_buffer[5] = 0xFF & c; m_buffer[6] = 0x0F & (d >> 8); m_buffer[7] = 0xFF & d; m_write_length = 8; return requestI2C(S_SET_OUTPUT); } command error_t HplMCP4728.writeDACRegisterAndEEPROM(MCP4728_CHANNEL channel, uint16_t volt, bool internal_vref, MCP4728_POWER_DOWN power_down, bool gain,bool upload) { if (!isIdle()) { return EBUSY; } m_dac = channel; m_buffer[0] = 0x58 | channel << 1 | !upload; m_buffer[1] = internal_vref << 7 | power_down << 5 | gain << 4 | 0xF & (volt >> 8); m_buffer[2] = 0xFF & volt; m_write_length = 3; return requestI2C(S_SET_DAC_REGISTER_EEPROM); } async event void I2C.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { m_error = error; post signalTask(); } event void I2CResource.granted() { post isReady(); } async event void I2C.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) {} } tinyos-2.1.2+dfsg/tos/chips/mm74hc595/000077500000000000000000000000001207233610700172365ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/mm74hc595/MM74HC595C.nc000066400000000000000000000114261207233610700210310ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, Data, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * This configuration provides 'virtual' output pins using the * mm74hc595 Serial-In Parallel-Out (SIPO) chip from Fairchild Semiconductor. * * This driver expects to find a HPL module called HplMM74HC595PinsC (that should * be implemented for a platform or sensorboard) providing GeneralIO interfaces for * the three physical pins of the MM74HC595 that it uses. * * These virtual output pins are presented as implementing the * GeneralIO interface. Calling GeneralIO.makeOutput() or GeneralIO.makeInput() * has no effect -- these pins are always outputs. * * @author Henri Dubois-Ferriere * */ configuration MM74HC595C { provides interface GeneralIO as VirtualPin0; // Q_A on MM74HC595 datasheet provides interface GeneralIO as VirtualPin1; // Q_B provides interface GeneralIO as VirtualPin2; // Q_C provides interface GeneralIO as VirtualPin3; // Q_D provides interface GeneralIO as VirtualPin4; // Q_E provides interface GeneralIO as VirtualPin5; // Q_F provides interface GeneralIO as VirtualPin6; // Q_G provides interface GeneralIO as VirtualPin7; // Q_H } implementation { components MM74HC595ImplP, HplMM74HC595PinsC; MM74HC595ImplP.Ser -> HplMM74HC595PinsC.Ser; MM74HC595ImplP.Sck -> HplMM74HC595PinsC.Sck; MM74HC595ImplP.Rck -> HplMM74HC595PinsC.Rck; components MainC; MainC.SoftwareInit -> MM74HC595ImplP.Init; components BusyWaitMicroC; MM74HC595ImplP.BusyWait -> BusyWaitMicroC; components new MM74HC595P(0) as VPin0; VPin0.set -> MM74HC595ImplP.set; VPin0.get -> MM74HC595ImplP.get; VPin0.toggle -> MM74HC595ImplP.toggle; VPin0.clr -> MM74HC595ImplP.clr; VirtualPin0 = VPin0; components new MM74HC595P(1) as VPin1; VPin1.set -> MM74HC595ImplP.set; VPin1.get -> MM74HC595ImplP.get; VPin1.toggle -> MM74HC595ImplP.toggle; VPin1.clr -> MM74HC595ImplP.clr; VirtualPin1 = VPin1; components new MM74HC595P(2) as VPin2; VPin2.set -> MM74HC595ImplP.set; VPin2.get -> MM74HC595ImplP.get; VPin2.toggle -> MM74HC595ImplP.toggle; VPin2.clr -> MM74HC595ImplP.clr; VirtualPin2 = VPin2; components new MM74HC595P(3) as VPin3; VPin3.set -> MM74HC595ImplP.set; VPin3.get -> MM74HC595ImplP.get; VPin3.toggle -> MM74HC595ImplP.toggle; VPin3.clr -> MM74HC595ImplP.clr; VirtualPin3 = VPin3; components new MM74HC595P(4) as VPin4; VPin4.set -> MM74HC595ImplP.set; VPin4.get -> MM74HC595ImplP.get; VPin4.toggle -> MM74HC595ImplP.toggle; VPin4.clr -> MM74HC595ImplP.clr; VirtualPin4 = VPin4; components new MM74HC595P(5) as VPin5; VPin5.set -> MM74HC595ImplP.set; VPin5.get -> MM74HC595ImplP.get; VPin5.toggle -> MM74HC595ImplP.toggle; VPin5.clr -> MM74HC595ImplP.clr; VirtualPin5 = VPin5; components new MM74HC595P(6) as VPin6; VPin6.set -> MM74HC595ImplP.set; VPin6.get -> MM74HC595ImplP.get; VPin6.toggle -> MM74HC595ImplP.toggle; VPin6.clr -> MM74HC595ImplP.clr; VirtualPin6 = VPin6; components new MM74HC595P(7) as VPin7; VPin7.set -> MM74HC595ImplP.set; VPin7.get -> MM74HC595ImplP.get; VPin7.toggle -> MM74HC595ImplP.toggle; VPin7.clr -> MM74HC595ImplP.clr; VirtualPin7 = VPin7; } tinyos-2.1.2+dfsg/tos/chips/mm74hc595/MM74HC595ImplP.nc000066400000000000000000000063671207233610700217000ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * mm74hc595 driver internals. * * @author Henri Dubois-Ferriere * */ module MM74HC595ImplP { provides interface Init @atleastonce(); provides async command void set(uint8_t pin); provides async command bool get(uint8_t pin); provides async command void clr(uint8_t pin); provides async command void toggle(uint8_t pin); uses interface GeneralIO as Ser; uses interface GeneralIO as Rck; uses interface GeneralIO as Sck; uses interface BusyWait; } implementation { enum { npins = 8 }; uint8_t state; void writeState() { uint8_t i, s; atomic s = state; call Rck.clr(); for (i = 0; i < npins; i++) { call Sck.clr(); if (s & 0x80) { call Ser.set(); } else { call Ser.clr(); } call Sck.set(); s <<= 1; } call Rck.set(); call Sck.clr(); call Ser.clr(); call Rck.clr(); } command error_t Init.init() { state = 0; call Ser.makeOutput(); call Sck.makeOutput(); call Rck.makeOutput(); call Sck.clr(); call Rck.clr(); call Ser.clr(); writeState(); return SUCCESS; } async command void set(uint8_t pin) { atomic { state |= (1 << pin); writeState(); } } async command bool get(uint8_t pin) { atomic return (state >> pin) & 1; } async command void clr(uint8_t pin) { atomic { state &= ~(1 << pin); writeState(); } } async command void toggle(uint8_t pin) { if (call get(pin)) call clr(pin); else call set(pin); } } tinyos-2.1.2+dfsg/tos/chips/mm74hc595/MM74HC595P.nc000066400000000000000000000051661207233610700210520ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, Data, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * @author Henri Dubois-Ferriere * * This is an internal module of the mm74hc595 Serial-In Parallel-Out (SIPO) driver. * Do not wire to this -- use MM74HC595C instead. * */ generic module MM74HC595P(uint8_t outaddr) { provides interface GeneralIO; uses async command void set(uint8_t pin); uses async command bool get(uint8_t pin); uses async command void clr(uint8_t pin); uses async command void toggle(uint8_t pin); } implementation { async command void GeneralIO.set() { call set(outaddr); } async command bool GeneralIO.get() { return call get(outaddr); } async command void GeneralIO.clr() { call clr(outaddr); } async command void GeneralIO.toggle() { call toggle(outaddr); } async command void GeneralIO.makeInput() { } async command void GeneralIO.makeOutput() { } async command bool GeneralIO.isInput() { } async command bool GeneralIO.isOutput() { } } tinyos-2.1.2+dfsg/tos/chips/mma7261qt/000077500000000000000000000000001207233610700173335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/mma7261qt/HplMMA7261QT.h000066400000000000000000000040471207233610700213540ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * MMA7261QT gSelect defines. * * @author Henrik Makitaavola */ #ifndef __HPLMMA7261QT_H__ #define __HPLMMA7261QT_H__ typedef enum mm7261qt_gselect { MMA7261QT_GSELECT_2_5G=0, //most sensitive MMA7261QT_GSELECT_3_3G=1, MMA7261QT_GSELECT_6_7G=2, MMA7261QT_GSELECT_10_0G=3, //least sensitive } mm7261qt_gselect_t; #endif tinyos-2.1.2+dfsg/tos/chips/mma7261qt/HplMMA7261QTControl.nc000066400000000000000000000037101207233610700230620ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * MMA7261QT control interface. * * @author Henrik Makitaavola */ #include "HplMMA7261QT.h" interface HplMMA7261QTControl { async command void on(); async command void off(); async command void gSelect( mm7261qt_gselect_t val); } tinyos-2.1.2+dfsg/tos/chips/mma7261qt/HplMMA7261QTControlC.nc000066400000000000000000000042231207233610700231650ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * MMA7261QT control component. * * @author Henrik Makitaavola */ configuration HplMMA7261QTControlC { provides interface HplMMA7261QTControl; } implementation { components HplMMA7261QTControlP, HplMMA7261QTC; HplMMA7261QTControlP.Sleep -> HplMMA7261QTC.Sleep; HplMMA7261QTControlP.GSelect1 -> HplMMA7261QTC.GSelect1; HplMMA7261QTControlP.GSelect2 -> HplMMA7261QTC.GSelect2; HplMMA7261QTControl = HplMMA7261QTControlP; } tinyos-2.1.2+dfsg/tos/chips/mma7261qt/HplMMA7261QTControlP.nc000066400000000000000000000047711207233610700232120ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * MMA7261QT control. * * @author Henrik Makitaavola */ #include "HplMMA7261QT.h" module HplMMA7261QTControlP { provides interface HplMMA7261QTControl; uses interface GeneralIO as Sleep; uses interface GeneralIO as GSelect1; uses interface GeneralIO as GSelect2; } implementation { async command void HplMMA7261QTControl.on() { call Sleep.set(); call GSelect1.clr(); call GSelect2.clr(); } async command void HplMMA7261QTControl.off() { call GSelect1.clr(); call GSelect2.clr(); call Sleep.clr(); } async command void HplMMA7261QTControl.gSelect( mm7261qt_gselect_t val) { if(val & 1) call GSelect1.set(); else call GSelect1.clr(); if(val & 2) call GSelect2.set(); else call GSelect2.clr(); } } tinyos-2.1.2+dfsg/tos/chips/mma7261qt/HplMMA7261QTReaderC.nc000066400000000000000000000041331207233610700227470ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * MMA7261QT reader. * * @author Henrik Makitaavola */ configuration HplMMA7261QTReaderC { provides interface Read as AccelX; provides interface Read as AccelY; provides interface Read as AccelZ; } implementation { components HplMMA7261QTC; AccelX = HplMMA7261QTC.AccelX; AccelY = HplMMA7261QTC.AccelY; AccelZ = HplMMA7261QTC.AccelZ; } tinyos-2.1.2+dfsg/tos/chips/ms5607/000077500000000000000000000000001207233610700166355ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/ms5607/Ms5607.h000066400000000000000000000051061207233610700177110ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #ifndef MS5607_H #define MS5607_H typedef struct { uint16_t coefficient[6]; } calibration_t; /* * Precision dependent values: supply current/conversion time: * OSR=4096: 12.5uA/9.04ms * OSR=2048: 6.3uA/4.54ms * OSR=1024: 3.2uA/2.28ms * OSR=512: 1.7uA/1.17ms * OSR=256: 0.9uA/0.6ms */ enum { MS5607_PRESSURE_256=8, //resolution RMS=0.13mbar MS5607_PRESSURE_512=6, //resolution RMS=0.084mbar MS5607_PRESSURE_1024=4, //resolution RMS=0.054mbar MS5607_PRESSURE_2048=2, //resolution RMS=0.036mbar MS5607_PRESSURE_4096=0, //resolution RMS=0.024mbar MS5607_TEMPERATURE_256=8<<4, //resolution RMS=0.012 C MS5607_TEMPERATURE_512=6<<4, //resolution RMS=0.008 C MS5607_TEMPERATURE_1024=4<<4, //resolution RMS=0.005 C MS5607_TEMPERATURE_2048=2<<4, //resolution RMS=0.003 C MS5607_TEMPERATURE_4096=0<<4, //resolution RMS=0.002 C MS5607_PRESSURE_MASK=0x0f, } ms5607_precision; #ifndef MS5607_PRECISION #define MS5607_PRECISION 0 //maximum precision with both sensors #endif #define UQ_MS5607_RESOURCE "Ms5607.ReadResource" #endif tinyos-2.1.2+dfsg/tos/chips/ms5607/Ms5607ArbitratedC.nc000066400000000000000000000054751207233610700222000ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "Ms5607.h" configuration Ms5607ArbitratedC { provides interface Read as ReadTemperature[uint8_t client]; provides interface Read as ReadPressure[uint8_t client]; //You can't use the following interfaces if you're waiting for any readDone //the calibration data stays the same for the same chip, but we do not cache it provides interface ReadRef as ReadCalibration; provides interface Set as SetPrecision; } implementation { components Ms5607C; ReadCalibration=Ms5607C; SetPrecision=Ms5607C; components new ArbitratedReadC(uint32_t) as ArbitratedTemp, new FcfsArbiterC(UQ_MS5607TEMP_RESOURCE) as TempArbiter, new ReadClientP(uint32_t) as TempClient; ReadTemperature=ArbitratedTemp.Read; ArbitratedTemp.Resource->TempArbiter; ArbitratedTemp.Service->TempClient; TempClient.ActualRead->Ms5607C.ReadTemperature; components new ArbitratedReadC(uint32_t) as ArbitratedPress, new FcfsArbiterC(UQ_MS5607PRESS_RESOURCE) as PressArbiter, new ReadClientP(uint32_t) as PressClient; ReadPressure=ArbitratedPress.Read; ArbitratedPress.Resource->PressArbiter; ArbitratedPress.Service->PressClient; PressClient.ActualRead->Ms5607C.ReadPressure; } tinyos-2.1.2+dfsg/tos/chips/ms5607/Ms5607C.nc000066400000000000000000000046141207233610700201700ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ #include "Ms5607.h" configuration Ms5607C { provides interface Read as ReadPressure; provides interface Read as ReadTemperature; //You can't use the following interfaces if you're waiting for any readDone //the calibration data stays the same for the same chip, but we do not cache it provides interface ReadRef as ReadCalibration; provides interface Set as SetPrecision; } implementation { components Ms5607P; ReadPressure = Ms5607P.ReadPressure; ReadTemperature = Ms5607P.ReadTemperature; ReadCalibration = Ms5607P.ReadCalibration; SetPrecision = Ms5607P; components HplMs5607C, new TimerMilliC(), MainC; Ms5607P.I2CPacket -> HplMs5607C; Ms5607P.I2CResource -> HplMs5607C.Resource; Ms5607P.Timer -> TimerMilliC; Ms5607P.BusPowerManager -> HplMs5607C; Ms5607P.Init <- MainC.SoftwareInit; } tinyos-2.1.2+dfsg/tos/chips/ms5607/Ms5607CalibrationC.nc000066400000000000000000000043251207233610700223370ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "Ms5607.h" generic configuration Ms5607CalibrationC() { //the calibration data stays the same for the same chip, but we do not cache it provides interface ReadRef as Read; //You can't use the following interface if you're waiting for any readDone provides interface Set as SetPrecision; } implementation { enum { clientid = unique(UQ_MS5607_RESOURCE), }; components Ms5607RawArbiterP, new ResourceReadRefC(calibration_t); SetPrecision=Ms5607RawArbiterP; Read = ResourceReadRefC; ResourceReadRefC.Resource -> Ms5607RawArbiterP.Resource[clientid]; ResourceReadRefC.Service -> Ms5607RawArbiterP.ReadCalibration[clientid]; } tinyos-2.1.2+dfsg/tos/chips/ms5607/Ms5607ConversionDtP.nc000066400000000000000000000047511207233610700225450ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "Ms5607.h" generic module Ms5607ConversionDtP(){ uses interface Read as ReadRawTemp; uses interface ReadRef as ReadCalib; provides interface Read; provides interface Get[uint8_t index]; } implementation{ calibration_t calib; bool calibReady=FALSE; command error_t Read.read(){ if(calibReady) return call ReadRawTemp.read(); else return call ReadCalib.read(&calib); } event void ReadCalib.readDone(error_t err, calibration_t *cal){ if(err==SUCCESS){ err = call ReadRawTemp.read(); } if(err!=SUCCESS) signal Read.readDone(err, 0); } event void ReadRawTemp.readDone(error_t err, uint32_t value){ if(err!=SUCCESS) signal Read.readDone(err, 0); else signal Read.readDone(SUCCESS, (value-((uint32_t)calib.coefficient[4]<<8))); } command uint16_t Get.get[uint8_t index](){ return calib.coefficient[index]; } } tinyos-2.1.2+dfsg/tos/chips/ms5607/Ms5607ConversionPressP.nc000066400000000000000000000047221207233610700232700ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ generic module Ms5607ConversionPressP(){ provides interface Read; uses interface Read as ReadDt; uses interface Read as ReadRawPress; uses interface Get[uint8_t index]; } implementation{ int32_t dT; command error_t Read.read(){ return call ReadDt.read(); } event void ReadDt.readDone(error_t err, int32_t value){ if(err==SUCCESS){ dT=value; err=call ReadRawPress.read(); } if(err!=SUCCESS) signal Read.readDone(err, 0); } event void ReadRawPress.readDone(error_t err, uint32_t value){ if(err!=SUCCESS) signal Read.readDone(err, 0); else { int64_t off=((uint64_t)call Get.get[1]()<<17)+(((int64_t)dT*call Get.get[3]())>>6); int64_t sens=((uint32_t)call Get.get[0]()<<16)+(((int64_t)dT*call Get.get[2]())>>7); uint32_t p=((((uint64_t)value*sens)>>21)-off)>>15; signal Read.readDone(SUCCESS, p); } } } tinyos-2.1.2+dfsg/tos/chips/ms5607/Ms5607ConversionTempP.nc000066400000000000000000000037661207233610700231100ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ generic module Ms5607ConversionTempP(){ provides interface Read; uses interface Read as ReadDt; uses interface Get[uint8_t index]; } implementation{ command error_t Read.read(){ return call ReadDt.read(); } event void ReadDt.readDone(error_t err, int32_t value){ if(err==SUCCESS) signal Read.readDone(SUCCESS, 2000+(((int64_t)value*call Get.get[5]())>>23)); else signal Read.readDone(err, 0); } } tinyos-2.1.2+dfsg/tos/chips/ms5607/Ms5607P.nc000066400000000000000000000240471207233610700202070ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo, Andras Biro */ #include "Ms5607.h" //TODO: norace or atomic (state, i2cBuffer) //TODO: testing: SetPrecision module Ms5607P { provides interface Read as ReadTemperature; provides interface Read as ReadPressure; provides interface ReadRef as ReadCalibration; provides interface Set as SetPrecision; provides interface Init; uses interface Timer; uses interface I2CPacket; uses interface Resource as I2CResource; uses interface BusPowerManager; } implementation { enum { MS5607_ADDRESS = 0x77, }; enum { MS5607_ADC_READ = 0x00, MS5607_CONVERT_TEMPERATURE = 0x58, //-0..8, depending on precision (OSR) MS5607_CONVERT_PRESSURE = 0x48, //-0..8, depending on precision (OSR) MS5607_PROM_READ = 0xA0, // +(address << 1) } ms5607_command; enum { MS5607_TIMEOUT_4096=10, MS5607_TIMEOUT_2048=5, MS5607_TIMEOUT_1024=3, MS5607_TIMEOUT_512=2, MS5607_TIMEOUT_256=1, MS5607_TIMEOUT_RESET=3, } ms5607_timeout; //in ms enum { S_OFF = 0, S_IDLE = 1, S_READ_TEMP_CMD = 2, S_READ_TEMP, S_READ_PRESSURE_CMD, S_READ_PRESSURE, S_READ_CALIB_CMD1, S_READ_CALIB_CMD2, S_READ_CALIB_CMD3, S_READ_CALIB_CMD4, S_READ_CALIB_CMD5, S_READ_CALIB_CMD6, S_READ_CALIB, }; norace uint8_t state=S_OFF; norace uint8_t i2cBuffer[3]; norace calibration_t *calib; norace error_t lastError; uint8_t precision=MS5607_PRECISION; command error_t Init.init(){ call BusPowerManager.configure(MS5607_TIMEOUT_RESET, MS5607_TIMEOUT_RESET); return SUCCESS; } command void SetPrecision.set(uint8_t newPrecision){ if(state<=S_IDLE) precision=newPrecision; } task void signalReadDone(){ switch(state){ case S_READ_CALIB_CMD1: case S_READ_CALIB_CMD2: case S_READ_CALIB_CMD3: case S_READ_CALIB_CMD4: case S_READ_CALIB_CMD5: case S_READ_CALIB_CMD6: case S_READ_CALIB:{ state=S_IDLE; call BusPowerManager.releasePower(); signal ReadCalibration.readDone(lastError, calib); }break; case S_READ_PRESSURE_CMD: case S_READ_PRESSURE:{ uint32_t measurment=(*((nx_uint32_t*)i2cBuffer))>>8;//conversion from big-endian state=S_IDLE; call BusPowerManager.releasePower(); signal ReadPressure.readDone(lastError, measurment); }break; case S_READ_TEMP_CMD: case S_READ_TEMP:{ uint32_t measurment=(*((nx_uint32_t*)i2cBuffer))>>8; state=S_IDLE; call BusPowerManager.releasePower(); signal ReadTemperature.readDone(lastError, measurment); }break; } } command error_t ReadTemperature.read(){ uint8_t prevState=state; if(state > S_IDLE) return EBUSY; state=S_READ_TEMP_CMD; call BusPowerManager.requestPower(); if(prevState==S_IDLE) call I2CResource.request(); return SUCCESS; } command error_t ReadPressure.read(){ uint8_t prevState=state; if(state > S_IDLE) return EBUSY; state=S_READ_PRESSURE_CMD; call BusPowerManager.requestPower(); if(prevState==S_IDLE) call I2CResource.request(); return SUCCESS; } command error_t ReadCalibration.read(calibration_t *cal){ uint8_t prevState=state; if(state > S_IDLE) return EBUSY; state=S_READ_CALIB_CMD1; calib=cal; call BusPowerManager.requestPower(); if(prevState==S_IDLE) call I2CResource.request(); return SUCCESS; } event void BusPowerManager.powerOn(){ if(state==S_OFF) state=S_IDLE; else call I2CResource.request(); } event void BusPowerManager.powerOff(){ state=S_OFF; } event void I2CResource.granted(){ uint8_t i2cCond=0; switch(state){ case S_READ_PRESSURE_CMD:{ i2cCond=I2C_START|I2C_STOP; i2cBuffer[0]=MS5607_CONVERT_PRESSURE - (precision & MS5607_PRESSURE_MASK); }break; case S_READ_TEMP_CMD:{ i2cCond=I2C_START|I2C_STOP; i2cBuffer[0]=MS5607_CONVERT_TEMPERATURE - (precision >> 4); }break; case S_READ_PRESSURE: case S_READ_TEMP:{ i2cCond=I2C_START; i2cBuffer[0]=MS5607_ADC_READ; }break; case S_READ_CALIB_CMD1:{ i2cCond=I2C_START; i2cBuffer[0]=MS5607_PROM_READ+(1<<1); }break; } lastError = call I2CPacket.write(i2cCond, MS5607_ADDRESS, 1, i2cBuffer) ; if( lastError != SUCCESS) { call I2CResource.release(); post signalReadDone(); } } task void startTimer(){ //the timeouts are the same for both sensor, so we convert temperature precision to pressure precision uint8_t prec=precision; if(state==S_READ_TEMP_CMD){ state=S_READ_TEMP; prec=prec>>4; }else{ state=S_READ_PRESSURE; prec=prec&MS5607_PRESSURE_MASK; } switch(prec){ case MS5607_PRESSURE_4096: call Timer.startOneShot(MS5607_TIMEOUT_4096); break; case MS5607_PRESSURE_2048: call Timer.startOneShot(MS5607_TIMEOUT_2048); break; case MS5607_PRESSURE_1024: call Timer.startOneShot(MS5607_TIMEOUT_1024); break; case MS5607_PRESSURE_512: call Timer.startOneShot(MS5607_TIMEOUT_512); break; case MS5607_PRESSURE_256: call Timer.startOneShot(MS5607_TIMEOUT_256); break; } } event void Timer.fired(){ call I2CResource.request(); } async event void I2CPacket.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { uint8_t readLength=0; if(error!=SUCCESS){ lastError=error; call I2CResource.release(); post signalReadDone(); return; } switch(state){ //timer starter states case S_READ_PRESSURE_CMD: case S_READ_TEMP_CMD:{ call I2CResource.release(); post startTimer(); return; }break; //read states case S_READ_PRESSURE: case S_READ_TEMP:{ readLength=3; }break; case S_READ_CALIB_CMD1: case S_READ_CALIB_CMD2: case S_READ_CALIB_CMD3: case S_READ_CALIB_CMD4: case S_READ_CALIB_CMD5: case S_READ_CALIB_CMD6:{ readLength=2; }break; } lastError = call I2CPacket.read(I2C_START|I2C_STOP, MS5607_ADDRESS, readLength, i2cBuffer); if( lastError != SUCCESS) { call I2CResource.release(); lastError=FAIL; post signalReadDone(); } } async event void I2CPacket.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { lastError=error; if(error!=SUCCESS){ call I2CResource.release(); post signalReadDone(); return; } switch(state){ case S_READ_PRESSURE: case S_READ_TEMP:{ call I2CResource.release(); post signalReadDone(); return; }break; case S_READ_CALIB_CMD6:{ call I2CResource.release(); calib->coefficient[5]=*((nx_uint16_t*)data);//data from the sensor is big endian post signalReadDone(); return; }break; case S_READ_CALIB_CMD1:{ calib->coefficient[0]=*((nx_uint16_t*)data);//data from the sensor is big endian state=S_READ_CALIB_CMD2; i2cBuffer[0]=MS5607_PROM_READ+(2<<1); }break; case S_READ_CALIB_CMD2:{ calib->coefficient[1]=*((nx_uint16_t*)data);//data from the sensor is big endian state=S_READ_CALIB_CMD3; i2cBuffer[0]=MS5607_PROM_READ+(3<<1); }break; case S_READ_CALIB_CMD3:{ calib->coefficient[2]=*((nx_uint16_t*)data);//data from the sensor is big endian state=S_READ_CALIB_CMD4; i2cBuffer[0]=MS5607_PROM_READ+(4<<1); }break; case S_READ_CALIB_CMD4:{ calib->coefficient[3]=*((nx_uint16_t*)data);//data from the sensor is big endian state=S_READ_CALIB_CMD5; i2cBuffer[0]=MS5607_PROM_READ+(5<<1); }break; case S_READ_CALIB_CMD5:{ calib->coefficient[4]=*((nx_uint16_t*)data);//data from the sensor is big endian state=S_READ_CALIB_CMD6; i2cBuffer[0]=MS5607_PROM_READ+(6<<1); }break; } //read the next calibration constant lastError = call I2CPacket.write(I2C_START, MS5607_ADDRESS, 1, i2cBuffer); if( lastError != SUCCESS) { call I2CResource.release(); post signalReadDone(); } } default event void ReadCalibration.readDone(error_t err, calibration_t *data){}; default event void ReadPressure.readDone(error_t err, uint32_t data){}; default event void ReadTemperature.readDone(error_t err, uint32_t data){}; } tinyos-2.1.2+dfsg/tos/chips/ms5607/Ms5607PressureC.nc000066400000000000000000000044271207233610700217230ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ generic configuration Ms5607PressureC(){ provides interface Read; //You can't use the following interfaces if you're waiting for any readDone provides interface Set as SetPrecision; } implementation{ components new Ms5607RawTemperatureC(), new Ms5607CalibrationC(), new Ms5607RawPressureC(), new Ms5607ConversionPressP(), new Ms5607ConversionDtP(); Read=Ms5607ConversionPressP.Read; SetPrecision=Ms5607RawPressureC; Ms5607ConversionPressP.Get -> Ms5607ConversionDtP; Ms5607ConversionPressP.ReadDt -> Ms5607ConversionDtP; Ms5607ConversionPressP.ReadRawPress -> Ms5607RawPressureC; Ms5607ConversionDtP.ReadRawTemp -> Ms5607RawTemperatureC; Ms5607ConversionDtP.ReadCalib -> Ms5607CalibrationC; } tinyos-2.1.2+dfsg/tos/chips/ms5607/Ms5607RawArbiterP.nc000066400000000000000000000047761207233610700222010ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "Ms5607.h" configuration Ms5607RawArbiterP { provides interface Read as ReadTemperature[uint8_t client]; provides interface Read as ReadPressure[uint8_t client]; provides interface ReadRef as ReadCalibration[uint8_t client]; provides interface Resource[uint8_t client]; provides interface Set as SetPrecision; } implementation { components Ms5607C, new FcfsArbiterC(UQ_MS5607_RESOURCE); SetPrecision=Ms5607C; Resource=FcfsArbiterC; components new ReadClientP(uint32_t) as ReadTempClient; ReadTemperature = ReadTempClient; ReadTempClient.ActualRead -> Ms5607C.ReadTemperature; components new ReadClientP(uint32_t) as ReadPresClient; ReadPressure = ReadPresClient; ReadPresClient.ActualRead -> Ms5607C.ReadPressure; components new ReadRefClientP(calibration_t) as ReadCalibClient; ReadCalibration = ReadCalibClient; ReadCalibClient.ActualRead -> Ms5607C.ReadCalibration; } tinyos-2.1.2+dfsg/tos/chips/ms5607/Ms5607RawPressureC.nc000066400000000000000000000041371207233610700223730ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "Ms5607.h" generic configuration Ms5607RawPressureC() { provides interface Read; //You can't use the following interface if you're waiting for any readDone provides interface Set as SetPrecision; } implementation { enum { clientid = unique(UQ_MS5607_RESOURCE), }; components Ms5607RawArbiterP, new ResourceReadC(uint32_t); SetPrecision=Ms5607RawArbiterP; Read = ResourceReadC; ResourceReadC.Resource -> Ms5607RawArbiterP.Resource[clientid]; ResourceReadC.Service -> Ms5607RawArbiterP.ReadPressure[clientid]; } tinyos-2.1.2+dfsg/tos/chips/ms5607/Ms5607RawTemperatureC.nc000066400000000000000000000041451207233610700230570ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "Ms5607.h" generic configuration Ms5607RawTemperatureC() { provides interface Read; //You can't use the following interface if you're waiting for any readDone provides interface Set as SetPrecision; } implementation { enum { clientid = unique(UQ_MS5607_RESOURCE), }; components Ms5607RawArbiterP, new ResourceReadC(uint32_t); SetPrecision=Ms5607RawArbiterP; Read = ResourceReadC; ResourceReadC.Resource -> Ms5607RawArbiterP.Resource[clientid]; ResourceReadC.Service -> Ms5607RawArbiterP.ReadTemperature[clientid]; } tinyos-2.1.2+dfsg/tos/chips/ms5607/Ms5607TemperatureC.nc000066400000000000000000000043011207233610700223770ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ generic configuration Ms5607TemperatureC(){ provides interface Read; //You can't use the following interfaces if you're waiting for any readDone provides interface Set as SetPrecision; } implementation{ components new Ms5607RawTemperatureC(), new Ms5607CalibrationC(), new Ms5607ConversionDtP(), new Ms5607ConversionTempP(); Read=Ms5607ConversionTempP.Read; SetPrecision=Ms5607RawTemperatureC; Ms5607ConversionTempP.Get -> Ms5607ConversionDtP; Ms5607ConversionTempP.ReadDt -> Ms5607ConversionDtP; Ms5607ConversionDtP.ReadRawTemp -> Ms5607RawTemperatureC; Ms5607ConversionDtP.ReadCalib -> Ms5607CalibrationC; } tinyos-2.1.2+dfsg/tos/chips/ms5607/ReadRefClientP.nc000066400000000000000000000040471207233610700217530ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ generic module ReadRefClientP(typedef type){ provides interface ReadRef[uint8_t client]; uses interface ReadRef as ActualRead; } implementation{ uint8_t client; command error_t ReadRef.read[uint8_t cl](type* readData){ client = cl; return call ActualRead.read(readData); } event void ActualRead.readDone(error_t result, type* value) { signal ReadRef.readDone[client](result, value); } default event void ReadRef.readDone[uint8_t cl](error_t result, type* value){} } tinyos-2.1.2+dfsg/tos/chips/ms5607/ResourceReadC.nc000066400000000000000000000030741207233610700216510ustar00rootroot00000000000000/* $Id: ArbitratedReadC.nc,v 1.6 2008-06-26 04:39:14 regehr Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implement arbitrated access to a Read interface, based on an * underlying arbitrated Resource interface. * * Note that this code does not deal with unexpected events: it assumes * that all events it receives are in response to commands that it * made. See tos/chips/atm128/adc for an example of using ArbitratedReadC * in a safe way. * * @param width_t Width of the underlying Read interface. * * @author David Gay */ generic module ResourceReadC(typedef width_t) @safe() { provides interface Read; uses { interface Read as Service; interface Resource; } } implementation { command error_t Read.read() { return call Resource.request(); } event void Resource.granted() { call Service.read(); } event void Service.readDone(error_t result, width_t data) { call Resource.release(); signal Read.readDone(result, data); } default async command error_t Resource.request() { return FAIL; } default async command error_t Resource.release() { return FAIL; } default event void Read.readDone(error_t result, width_t data) { } default command error_t Service.read() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/ms5607/ResourceReadRefC.nc000066400000000000000000000032411207233610700223020ustar00rootroot00000000000000/* $Id: ArbitratedReadC.nc,v 1.6 2008-06-26 04:39:14 regehr Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implement arbitrated access to a Read interface, based on an * underlying arbitrated Resource interface. * * Note that this code does not deal with unexpected events: it assumes * that all events it receives are in response to commands that it * made. See tos/chips/atm128/adc for an example of using ArbitratedReadC * in a safe way. * * @param width_t Width of the underlying Read interface. * * @author David Gay */ generic module ResourceReadRefC(typedef width_t) @safe() { provides interface ReadRef; uses { interface ReadRef as Service; interface Resource; } } implementation { width_t* currentVal; command error_t ReadRef.read(width_t* val) { currentVal=val; return call Resource.request(); } event void Resource.granted() { call Service.read(currentVal); } event void Service.readDone(error_t result, width_t* data) { call Resource.release(); signal ReadRef.readDone(result, data); } default async command error_t Resource.request() { return FAIL; } default async command error_t Resource.release() { return FAIL; } default event void ReadRef.readDone(error_t result, width_t* data) { } default command error_t Service.read(width_t* data) { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/msp430/000077500000000000000000000000001207233610700167225ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/msp430/McuSleepC.nc000066400000000000000000000113241207233610700210650ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Implementation of TEP 112 (Microcontroller Power Management) for * the MSP430. Code for low power calculation copied from older * msp430hardware.h by Vlado Handziski, Joe Polastre, and Cory Sharp. * * * @author Philip Levis * @author Vlado Handziski * @author Joe Polastre * @author Cory Sharp * @date October 26, 2005 * @see Please refer to TEP 112 for more information about this component and its * intended use. * */ module McuSleepC @safe() { provides { interface McuSleep; interface McuPowerState; } uses { interface McuPowerOverride; } } implementation { bool dirty = TRUE; mcu_power_t powerState = MSP430_POWER_ACTIVE; /* Note that the power values are maintained in an order * based on their active components, NOT on their values.*/ // NOTE: This table should be in progmem. const uint16_t msp430PowerBits[MSP430_POWER_LPM4 + 1] = { 0, // ACTIVE SR_CPUOFF, // LPM0 SR_SCG0+SR_CPUOFF, // LPM1 SR_SCG1+SR_CPUOFF, // LPM2 SR_SCG1+SR_SCG0+SR_CPUOFF, // LPM3 SR_SCG1+SR_SCG0+SR_OSCOFF+SR_CPUOFF, // LPM4 }; mcu_power_t getPowerState() { mcu_power_t pState = MSP430_POWER_LPM4; // TimerA, USART0, USART1 check if ((((TACCTL0 & CCIE) || (TACCTL1 & CCIE) || (TACCTL2 & CCIE)) && ((TACTL & TASSEL_3) == TASSEL_2)) || ((ME1 & (UTXE0 | URXE0)) && (U0TCTL & SSEL1)) || ((ME2 & (UTXE1 | URXE1)) && (U1TCTL & SSEL1)) #ifdef __msp430_have_usart0_with_i2c // registers end in "nr" to prevent nesC race condition detection || ((U0CTLnr & I2CEN) && (I2CTCTLnr & SSEL1) && (I2CDCTLnr & I2CBUSY) && (U0CTLnr & SYNC) && (U0CTLnr & I2C)) #endif ) pState = MSP430_POWER_LPM1; #ifdef __msp430_have_adc12 // ADC12 check, pre-condition: pState != MSP430_POWER_ACTIVE if (ADC12CTL0 & ADC12ON){ if (ADC12CTL1 & ADC12SSEL_2){ // sample or conversion operation with MCLK or SMCLK if (ADC12CTL1 & ADC12SSEL_1) pState = MSP430_POWER_LPM1; else pState = MSP430_POWER_ACTIVE; } else if ((ADC12CTL1 & SHS0) && ((TACTL & TASSEL_3) == TASSEL_2)){ // Timer A is used as sample-and-hold source and SMCLK sources Timer A // (Timer A interrupts are always disabled when it is used by the // ADC subsystem, that's why the Timer check above is not enough) pState = MSP430_POWER_LPM1; } } #endif return pState; } void computePowerState() { powerState = mcombine(getPowerState(), call McuPowerOverride.lowestState()); } async command void McuSleep.sleep() { uint16_t temp; if (dirty) { computePowerState(); //dirty = 0; } temp = msp430PowerBits[powerState] | SR_GIE; __asm__ __volatile__( "bis %0, r2" : : "m" (temp) ); // All of memory may change at this point... asm volatile ("" : : : "memory"); __nesc_disable_interrupt(); } async command void McuPowerState.update() { atomic dirty = 1; } default async command mcu_power_t McuPowerOverride.lowestState() { return MSP430_POWER_LPM4; } } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/000077500000000000000000000000001207233610700176145ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/AdcP.nc000066400000000000000000000151751207233610700207560ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.8 $ * $Date: 2008-06-27 18:05:23 $ * @author: Jan Hauer * ======================================================================== */ module AdcP @safe() { provides { interface Read as Read[uint8_t client]; interface ReadNow as ReadNow[uint8_t client]; interface Resource as ResourceReadNow[uint8_t client]; } uses { // for Read only: interface Resource as ResourceRead[uint8_t client]; // for ReadNow only: interface Resource as SubResourceReadNow[uint8_t client]; // for Read and ReadNow: interface AdcConfigure as Config[uint8_t client]; interface Msp430Adc12SingleChannel as SingleChannel[uint8_t client]; } } implementation { enum { STATE_READ, STATE_READNOW, STATE_READNOW_INVALID_CONFIG, }; // Resource interface / arbiter makes norace declaration safe norace uint8_t state; norace uint8_t owner; norace uint16_t value; error_t configure(uint8_t client) { error_t result = EINVAL; const msp430adc12_channel_config_t * ONE config; config = call Config.getConfiguration[client](); if (config->inch != INPUT_CHANNEL_NONE) result = call SingleChannel.configureSingle[client](config); return result; } command error_t Read.read[uint8_t client]() { return call ResourceRead.request[client](); } event void ResourceRead.granted[uint8_t client]() { // signalled only for Read.read() error_t result = configure(client); if (result == SUCCESS){ state = STATE_READ; result = call SingleChannel.getData[client](); } else { call ResourceRead.release[client](); signal Read.readDone[client](result, 0); } } async command error_t ResourceReadNow.request[uint8_t nowClient]() { return call SubResourceReadNow.request[nowClient](); } event void SubResourceReadNow.granted[uint8_t nowClient]() { if (configure(nowClient) == SUCCESS) state = STATE_READNOW; else state = STATE_READNOW_INVALID_CONFIG; signal ResourceReadNow.granted[nowClient](); } async command error_t ResourceReadNow.immediateRequest[uint8_t nowClient]() { error_t result = call SubResourceReadNow.immediateRequest[nowClient](); if (result == SUCCESS){ result = configure(nowClient); if (result == SUCCESS) state = STATE_READNOW; } return result; } async command error_t ResourceReadNow.release[uint8_t nowClient]() { return call SubResourceReadNow.release[nowClient](); } async command bool ResourceReadNow.isOwner[uint8_t nowClient]() { return call SubResourceReadNow.isOwner[nowClient](); } async command error_t ReadNow.read[uint8_t nowClient]() { if (state == STATE_READNOW_INVALID_CONFIG) return EINVAL; else return call SingleChannel.getData[nowClient](); } void task readDone() { call ResourceRead.release[owner](); signal Read.readDone[owner](SUCCESS, value); } async event error_t SingleChannel.singleDataReady[uint8_t client](uint16_t data) { switch (state) { case STATE_READ: owner = client; value = data; post readDone(); break; case STATE_READNOW: signal ReadNow.readDone[client](SUCCESS, data); break; default: // error ! break; } return SUCCESS; } async event uint16_t* SingleChannel.multipleDataReady[uint8_t client]( uint16_t *buf, uint16_t numSamples) { // error ! return 0; } default async command error_t ResourceRead.request[uint8_t client]() { return FAIL; } default async command error_t ResourceRead.immediateRequest[uint8_t client]() { return FAIL; } default async command error_t ResourceRead.release[uint8_t client]() { return FAIL; } default async command bool ResourceRead.isOwner[uint8_t client]() { return FALSE; } default event void Read.readDone[uint8_t client]( error_t result, uint16_t val ){} default async command error_t SubResourceReadNow.release[uint8_t nowClient](){ return FAIL;} default async command error_t SubResourceReadNow.request[uint8_t nowClient](){ return FAIL; } default async command bool SubResourceReadNow.isOwner[uint8_t client]() { return FALSE; } default event void ResourceReadNow.granted[uint8_t nowClient](){} default async event void ReadNow.readDone[uint8_t client]( error_t result, uint16_t val ){} default async command error_t SubResourceReadNow.immediateRequest[uint8_t nowClient]() { return FAIL; } default async command error_t SingleChannel.getData[uint8_t client]() { return EINVAL; } const msp430adc12_channel_config_t defaultConfig = {INPUT_CHANNEL_NONE,0,0,0,0,0,0,0}; default async command const msp430adc12_channel_config_t* Config.getConfiguration[uint8_t client]() { return &defaultConfig; } default async command error_t SingleChannel.configureSingle[uint8_t client]( const msp430adc12_channel_config_t *config){ return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/AdcReadClientC.nc000066400000000000000000000060231207233610700226640ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:06 $ * @author: Jan Hauer * ======================================================================== */ /** * This component virtualizes the HIL of ADC12 on MSP430. A client must wire * AdcConfigure to a component that returns the client's adc * configuration data. * * @author Jan Hauer * @see Please refer to the README.txt and TEP 101 for more information about * this component and its intended use. */ #include generic configuration AdcReadClientC() { provides interface Read; uses interface AdcConfigure; } implementation { components AdcP, #ifdef REF_VOLT_AUTO_CONFIGURE // if the client configuration requires a stable // reference voltage, the reference voltage generator // is automatically enabled new Msp430Adc12ClientAutoRVGC() as Msp430AdcClient; #else new Msp430Adc12ClientC() as Msp430AdcClient; #endif enum { CLIENT = unique(ADCC_SERVICE), }; Read = AdcP.Read[CLIENT]; AdcConfigure = AdcP.Config[CLIENT]; AdcP.SingleChannel[CLIENT] -> Msp430AdcClient.Msp430Adc12SingleChannel; AdcP.ResourceRead[CLIENT] -> Msp430AdcClient.Resource; #ifdef REF_VOLT_AUTO_CONFIGURE AdcConfigure = Msp430AdcClient.AdcConfigure; #endif } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/AdcReadNowClientC.nc000066400000000000000000000061651207233610700233570ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:07 $ * @author: Jan Hauer * ======================================================================== */ /** * This component virtualizes the HIL of ADC12 on MSP430. A client must wire * AdcConfigure to a component that returns the client's adc * configuration data. * * @author Jan Hauer * @see Please refer to the README.txt and TEP 101 for more information about * this component and its intended use. */ #include generic configuration AdcReadNowClientC() { provides { interface Resource; interface ReadNow; } uses interface AdcConfigure; } implementation { components AdcP, #ifdef REF_VOLT_AUTO_CONFIGURE // if the client configuration requires a stable // reference voltage, the reference voltage generator // is automatically enabled new Msp430Adc12ClientAutoRVGC() as Msp430AdcClient; #else new Msp430Adc12ClientC() as Msp430AdcClient; #endif enum { CLIENT = unique(ADCC_SERVICE), }; ReadNow = AdcP.ReadNow[CLIENT]; AdcConfigure = AdcP.Config[CLIENT]; AdcP.SingleChannel[CLIENT] -> Msp430AdcClient.Msp430Adc12SingleChannel; Resource = AdcP.ResourceReadNow[CLIENT]; AdcP.SubResourceReadNow[CLIENT] -> Msp430AdcClient.Resource; #ifdef REF_VOLT_AUTO_CONFIGURE AdcConfigure = Msp430AdcClient.AdcConfigure; #endif } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/AdcReadStreamClientC.nc000066400000000000000000000061321207233610700240410ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2008-04-07 09:41:55 $ * @author: Jan Hauer * ======================================================================== */ /** * This component virtualizes the HIL of ADC12 on MSP430. A client must wire * AdcConfigure to a component that returns the client's adc * configuration data. * * @author Jan Hauer * @see Please refer to the README.txt and TEP 101 for more information about * this component and its intended use. */ #include generic configuration AdcReadStreamClientC() { provides interface ReadStream; uses interface AdcConfigure; } implementation { components WireAdcStreamP, #ifdef REF_VOLT_AUTO_CONFIGURE // if the client configuration requires a stable // reference voltage, the reference voltage generator // is automatically enabled new Msp430Adc12ClientAutoRVGC() as Msp430AdcClient; AdcConfigure = Msp430AdcClient.AdcConfigure; #else new Msp430Adc12ClientC() as Msp430AdcClient; #endif enum { RSCLIENT = unique(ADCC_READ_STREAM_SERVICE), }; ReadStream = WireAdcStreamP.ReadStream[RSCLIENT]; AdcConfigure = WireAdcStreamP.AdcConfigure[RSCLIENT]; WireAdcStreamP.Resource[RSCLIENT] -> Msp430AdcClient.Resource; WireAdcStreamP.Msp430Adc12SingleChannel[RSCLIENT] -> Msp430AdcClient.Msp430Adc12SingleChannel; } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/AdcStreamP.nc000066400000000000000000000222121207233610700221200ustar00rootroot00000000000000/* $Id: AdcStreamP.nc,v 1.6 2008-11-10 14:56:12 janhauer Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Convert MSP430 HAL A/D interface to the HIL interfaces (adapted atmega code). * @author David Gay * @author Jan Hauer */ #include "Timer.h" module AdcStreamP @safe() { provides { interface Init @atleastonce(); interface ReadStream[uint8_t client]; } uses { interface Msp430Adc12SingleChannel as SingleChannel[uint8_t client]; interface AdcConfigure[uint8_t client]; interface Alarm; } } implementation { enum { NSTREAM = uniqueCount(ADCC_READ_STREAM_SERVICE) }; /* Resource reservation is required, and it's incorrect to call getData again before dataReady is signaled, so there are no races in correct programs */ norace uint8_t client = NSTREAM; /* Stream data */ struct list_entry_t { uint16_t count; struct list_entry_t * ONE_NOK next; }; struct list_entry_t *bufferQueue[NSTREAM]; struct list_entry_t * ONE_NOK * bufferQueueEnd[NSTREAM]; uint16_t * COUNT_NOK(lastCount) lastBuffer, lastCount; norace uint16_t count; norace uint16_t * COUNT_NOK(count) buffer; norace uint16_t * BND_NOK(buffer, buffer+count) pos; norace uint32_t now, period; norace bool periodModified; command error_t Init.init() { uint8_t i; for (i = 0; i != NSTREAM; i++) bufferQueueEnd[i] = &bufferQueue[i]; return SUCCESS; } void sampleSingle() { call SingleChannel.getData[client](); } error_t postBuffer(uint8_t c, uint16_t *buf, uint16_t n) { if (n < sizeof(struct list_entry_t)) return ESIZE; atomic { struct list_entry_t * ONE newEntry = TCAST(struct list_entry_t * ONE, buf); if (!bufferQueueEnd[c]) // Can't post right now. return FAIL; newEntry->count = n; newEntry->next = NULL; *bufferQueueEnd[c] = newEntry; bufferQueueEnd[c] = &newEntry->next; } return SUCCESS; } command error_t ReadStream.postBuffer[uint8_t c](uint16_t *buf, uint16_t n) { return postBuffer(c, buf, n); } task void readStreamDone() { uint8_t c = client; uint32_t actualPeriod = period; if (periodModified) actualPeriod = period - (period % 1000); atomic { bufferQueue[c] = NULL; bufferQueueEnd[c] = &bufferQueue[c]; } client = NSTREAM; signal ReadStream.readDone[c](SUCCESS, actualPeriod); } task void readStreamFail() { /* By now, the pending bufferDone has been signaled (see readStream). */ struct list_entry_t *entry; uint8_t c = client; atomic entry = bufferQueue[c]; for (; entry; entry = entry->next) { uint16_t tmp_count __DEPUTY_UNUSED__ = entry->count; signal ReadStream.bufferDone[c](FAIL, TCAST(uint16_t * COUNT_NOK(tmp_count),entry), entry->count); } atomic { bufferQueue[c] = NULL; bufferQueueEnd[c] = &bufferQueue[c]; } client = NSTREAM; signal ReadStream.readDone[c](FAIL, 0); } task void bufferDone() { uint16_t *b, c; atomic { b = lastBuffer; c = lastCount; lastBuffer = NULL; } signal ReadStream.bufferDone[client](SUCCESS, b, c); } void nextAlarm() { call Alarm.startAt(now, period); now += period; } async event void Alarm.fired() { sampleSingle(); } error_t nextBuffer(bool startNextAlarm) { atomic { struct list_entry_t *entry = bufferQueue[client]; if (!entry) { // all done bufferQueueEnd[client] = NULL; // prevent post post readStreamDone(); return FAIL; } else { uint16_t tmp_count; bufferQueue[client] = entry->next; if (!bufferQueue[client]) bufferQueueEnd[client] = &bufferQueue[client]; pos = buffer = NULL; count = entry->count; tmp_count = count; pos = buffer = TCAST(uint16_t * COUNT_NOK(tmp_count), entry); if (startNextAlarm) nextAlarm(); return SUCCESS; } } } void nextMultiple(uint8_t c) { if (nextBuffer(FALSE) == SUCCESS){ msp430adc12_channel_config_t config = *call AdcConfigure.getConfiguration[c](); config.sampcon_ssel = SAMPCON_SOURCE_SMCLK; // assumption: SMCLK runs at 1 MHz config.sampcon_id = SAMPCON_CLOCK_DIV_1; if (call SingleChannel.configureMultiple[c]( &config, pos, count, period) == SUCCESS) call SingleChannel.getData[c](); else { postBuffer(c, pos, count); post readStreamFail(); } } } command error_t ReadStream.read[uint8_t c](uint32_t usPeriod) { if (usPeriod & 0xFFFF0000){ // "manual" sampling period = usPeriod / 1000; periodModified = TRUE; client = c; now = call Alarm.getNow(); call SingleChannel.configureSingle[c](call AdcConfigure.getConfiguration[c]()); if (nextBuffer(FALSE) == SUCCESS) sampleSingle(); } else { period = usPeriod; periodModified = FALSE; client = c; nextMultiple(c); } return SUCCESS; } async event error_t SingleChannel.singleDataReady[uint8_t streamClient](uint16_t data) { if (client == NSTREAM) return FAIL; if (count == 0) { now = call Alarm.getNow(); nextBuffer(TRUE); } else { *pos++ = data; if (pos == buffer + count) { atomic { if (lastBuffer) { /* We failed to signal bufferDone in time. Fail. */ bufferQueueEnd[client] = NULL; // prevent post post readStreamFail(); return FAIL; } else { lastCount = count; lastBuffer = buffer; } } post bufferDone(); nextBuffer(TRUE); } else nextAlarm(); } return FAIL; } async event uint16_t* SingleChannel.multipleDataReady[uint8_t streamClient]( uint16_t *buf, uint16_t length) { atomic { if (lastBuffer) { /* We failed to signal bufferDone in time. Fail. */ bufferQueueEnd[client] = NULL; // prevent post post readStreamFail(); return 0; } else { lastBuffer = buffer; lastCount = pos - buffer; } } post bufferDone(); nextMultiple(streamClient); return 0; } const msp430adc12_channel_config_t defaultConfig = { inch: SUPPLY_VOLTAGE_HALF_CHANNEL, sref: REFERENCE_VREFplus_AVss, ref2_5v: REFVOLT_LEVEL_1_5, adc12ssel: SHT_SOURCE_ACLK, adc12div: SHT_CLOCK_DIV_1, sht: SAMPLE_HOLD_4_CYCLES, sampcon_ssel: SAMPCON_SOURCE_SMCLK, sampcon_id: SAMPCON_CLOCK_DIV_1 }; default async command const msp430adc12_channel_config_t* AdcConfigure.getConfiguration[uint8_t c]() { return &defaultConfig; } default async command error_t SingleChannel.configureMultiple[uint8_t c]( const msp430adc12_channel_config_t *config, uint16_t b[], uint16_t numSamples, uint16_t jiffies) { return FAIL; } default async command error_t SingleChannel.getData[uint8_t c]() { return FAIL; } default async command error_t SingleChannel.configureSingle[uint8_t c]( const msp430adc12_channel_config_t *config){ return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/HplAdc12.nc000066400000000000000000000105261207233610700214400ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2008-05-22 17:45:00 $ * @author: Jan Hauer * ======================================================================== */ /** * The HplAdc12 interface exports low-level access to the ADC12 registers * of the MSP430 MCU. * * @author Jan Hauer * @see Please refer to TEP 101 for more information about this component and its * intended use. */ #include interface HplAdc12 { /** * Sets the ADC12 control register ADC12CTL0. * @param control0 ADC12CTL0 register data. **/ async command void setCtl0(adc12ctl0_t control0); /** * Sets the ADC12 control register ADC12CTL1. * @param control1 ADC12CTL1 register data. **/ async command void setCtl1(adc12ctl1_t control1); /** * Returns the ADC12 control register ADC12CTL0. * @return ADC12CTL0 **/ async command adc12ctl0_t getCtl0(); /** Returns the ADC12 control register ADC12CTL1. * @return ADC12CTL1 **/ async command adc12ctl1_t getCtl1(); /** * Sets the ADC12 conversion memory control register ADC12MCTLx. * @param idx The register index (the 'x' in ADC12MCTLx) [0..15] * @param memControl ADC12MCTLx register data. */ async command void setMCtl(uint8_t idx, adc12memctl_t memControl); /** * Returns the ADC12 conversion memory control register ADC12MCTLx. * @param idx The register index (the 'x' in ADC12MCTLx) [0..15] * @return memControl ADC12MCTLx register data. */ async command adc12memctl_t getMCtl(uint8_t idx); /** * Returns the ADC12 conversion memory register ADC12MEMx. * @param idx The register index (the 'x' in ADC12MEMx) [0..15] * @return ADC12MEMx */ async command uint16_t getMem(uint8_t idx); /** * Sets the ADC12 interrupt enable register, ADC12IE. * @param mask Bitmask (0 means interrupt disabled, 1 menas interrupt enabled) */ async command void setIEFlags(uint16_t mask); /** * Returns the ADC12 interrupt enable register, ADC12IE. * @return ADC12IE */ async command uint16_t getIEFlags(); /** * Resets the ADC12 interrupt flag register, ADC12IFG. */ async command void resetIFGs(); /** * Signals a conversion result. * @param iv ADC12 interrupt vector value 0x6, 0x8, ... , 0x24 */ async event void conversionDone(uint16_t iv); /** * Returns the ADC12 BUSY flag. * @return ADC12BUSY */ async command bool isBusy(); /** * Stops a conversion. */ async command void stopConversion(); /** * Starts a conversion. */ async command void startConversion(); /** * Enables conversion (sets the ENC bit). */ async command void enableConversion(); } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/HplAdc12P.nc000066400000000000000000000103331207233610700215540ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.9 $ * $Date: 2009-10-17 11:48:33 $ * @author: Jan Hauer * ======================================================================== */ /** * The HplAdc12 interface exports low-level access to the ADC12 registers * of the MSP430 MCU. * * @author Jan Hauer * @see Please refer to TEP 101 for more information about this component and its * intended use. */ module HplAdc12P { provides interface HplAdc12; } implementation { MSP430REG_NORACE(ADC12CTL0); MSP430REG_NORACE(ADC12CTL1); MSP430REG_NORACE(ADC12IFG); MSP430REG_NORACE(ADC12IE); MSP430REG_NORACE(ADC12IV); DEFINE_UNION_CAST(int2adc12ctl0,adc12ctl0_t,uint16_t) DEFINE_UNION_CAST(int2adc12ctl1,adc12ctl1_t,uint16_t) DEFINE_UNION_CAST(adc12ctl0cast2int,uint16_t,adc12ctl0_t) DEFINE_UNION_CAST(adc12ctl1cast2int,uint16_t,adc12ctl1_t) DEFINE_UNION_CAST(adc12memctl2int,uint8_t,adc12memctl_t) DEFINE_UNION_CAST(int2adc12memctl,adc12memctl_t,uint8_t) async command void HplAdc12.setCtl0(adc12ctl0_t control0){ ADC12CTL0 = adc12ctl0cast2int(control0); } async command void HplAdc12.setCtl1(adc12ctl1_t control1){ ADC12CTL1 = adc12ctl1cast2int(control1); } async command adc12ctl0_t HplAdc12.getCtl0(){ return int2adc12ctl0(ADC12CTL0); } async command adc12ctl1_t HplAdc12.getCtl1(){ return int2adc12ctl1(ADC12CTL1); } async command void HplAdc12.setMCtl(uint8_t i, adc12memctl_t memCtl){ ADC12MCTL[i] = adc12memctl2int(memCtl); } async command adc12memctl_t HplAdc12.getMCtl(uint8_t i){ return int2adc12memctl(ADC12MCTL[i]); } async command uint16_t HplAdc12.getMem(uint8_t i){ return ADC12MEM[i]; } async command void HplAdc12.setIEFlags(uint16_t mask){ ADC12IE = mask; } async command uint16_t HplAdc12.getIEFlags(){ return ADC12IE; } async command void HplAdc12.resetIFGs(){ ADC12IV = 0; ADC12IFG = 0; } async command void HplAdc12.startConversion(){ ADC12CTL0 |= ADC12ON; ADC12CTL0 |= (ADC12SC + ENC); } async command void HplAdc12.stopConversion(){ // stop conversion mode immediately, conversion data is unreliable uint16_t ctl1 = ADC12CTL1; ADC12CTL1 &= ~(CONSEQ0 | CONSEQ1); ADC12CTL0 &= ~(ADC12SC + ENC); ADC12CTL0 &= ~(ADC12ON); ADC12CTL1 |= (ctl1 & (CONSEQ0 | CONSEQ1)); } async command void HplAdc12.enableConversion(){ ADC12CTL0 |= ENC; } async command bool HplAdc12.isBusy(){ return (ADC12CTL1 & ADC12BUSY); } TOSH_SIGNAL(ADC12_VECTOR) { signal HplAdc12.conversionDone(ADC12IV); } } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430Adc12.h000066400000000000000000000222011207233610700215230ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2007-06-25 15:47:14 $ * @author: Jan Hauer * ======================================================================== */ #ifndef MSP430ADC12_H #define MSP430ADC12_H #include "Msp430RefVoltGenerator.h" #define ADC12_TIMERA_ENABLED #define ADC12_P6PIN_AUTO_CONFIGURE #define ADC12_CHECK_ARGS //#define ADC12_ONLY_WITH_DMA // for HIL clients #define REF_VOLT_AUTO_CONFIGURE typedef struct { // see README.txt unsigned int inch: 4; // input channel unsigned int sref: 3; // reference voltage unsigned int ref2_5v: 1; // reference voltage level unsigned int adc12ssel: 2; // clock source sample-hold-time unsigned int adc12div: 3; // clock divider sample-hold-time unsigned int sht: 4; // sample-hold-time unsigned int sampcon_ssel: 2; // clock source sampcon signal unsigned int sampcon_id: 2; // clock divider sampcon unsigned int : 0; // align to a word boundary } msp430adc12_channel_config_t; typedef struct { // see README.txt volatile unsigned inch: 4, // input channel sref: 3, // reference voltage eos: 1; // end of sequence flag } __attribute__ ((packed)) adc12memctl_t; enum inch_enum { // see device specific data sheet which pin Ax is mapped to INPUT_CHANNEL_A0 = 0, // input channel A0 INPUT_CHANNEL_A1 = 1, // input channel A1 INPUT_CHANNEL_A2 = 2, // input channel A2 INPUT_CHANNEL_A3 = 3, // input channel A3 INPUT_CHANNEL_A4 = 4, // input channel A4 INPUT_CHANNEL_A5 = 5, // input channel A5 INPUT_CHANNEL_A6 = 6, // input channel A6 INPUT_CHANNEL_A7 = 7, // input channel A7 EXTERNAL_REF_VOLTAGE_CHANNEL = 8, // VeREF+ (input channel 8) REF_VOLTAGE_NEG_TERMINAL_CHANNEL = 9, // VREF-/VeREF- (input channel 9) TEMPERATURE_DIODE_CHANNEL = 10, // Temperature diode (input channel 10) SUPPLY_VOLTAGE_HALF_CHANNEL = 11, // (AVcc-AVss)/2 (input channel 11-15) INPUT_CHANNEL_NONE = 12 // illegal (identifies invalid settings) }; enum sref_enum { REFERENCE_AVcc_AVss = 0, // VR+ = AVcc and VR-= AVss REFERENCE_VREFplus_AVss = 1, // VR+ = VREF+ and VR-= AVss REFERENCE_VeREFplus_AVss = 2, // VR+ = VeREF+ and VR-= AVss REFERENCE_AVcc_VREFnegterm = 4, // VR+ = AVcc and VR-= VREF-/VeREF- REFERENCE_VREFplus_VREFnegterm = 5, // VR+ = VREF+ and VR-= VREF-/VeREF- REFERENCE_VeREFplus_VREFnegterm = 6 // VR+ = VeREF+ and VR-= VREF-/VeREF- }; enum ref2_5v_enum { REFVOLT_LEVEL_1_5 = 0, // reference voltage of 1.5 V REFVOLT_LEVEL_2_5 = 1, // reference voltage of 2.5 V REFVOLT_LEVEL_NONE = 0, // if e.g. AVcc is chosen }; enum adc12ssel_enum { SHT_SOURCE_ADC12OSC = 0, // ADC12OSC SHT_SOURCE_ACLK = 1, // ACLK SHT_SOURCE_MCLK = 2, // MCLK SHT_SOURCE_SMCLK = 3 // SMCLK }; enum adc12div_enum { SHT_CLOCK_DIV_1 = 0, // ADC12 clock divider of 1 SHT_CLOCK_DIV_2 = 1, // ADC12 clock divider of 2 SHT_CLOCK_DIV_3 = 2, // ADC12 clock divider of 3 SHT_CLOCK_DIV_4 = 3, // ADC12 clock divider of 4 SHT_CLOCK_DIV_5 = 4, // ADC12 clock divider of 5 SHT_CLOCK_DIV_6 = 5, // ADC12 clock divider of 6 SHT_CLOCK_DIV_7 = 6, // ADC12 clock divider of 7 SHT_CLOCK_DIV_8 = 7, // ADC12 clock divider of 8 }; enum sht_enum { SAMPLE_HOLD_4_CYCLES = 0, // sampling duration is 4 clock cycles SAMPLE_HOLD_8_CYCLES = 1, // ... SAMPLE_HOLD_16_CYCLES = 2, SAMPLE_HOLD_32_CYCLES = 3, SAMPLE_HOLD_64_CYCLES = 4, SAMPLE_HOLD_96_CYCLES = 5, SAMPLE_HOLD_128_CYCLES = 6, SAMPLE_HOLD_192_CYCLES = 7, SAMPLE_HOLD_256_CYCLES = 8, SAMPLE_HOLD_384_CYCLES = 9, SAMPLE_HOLD_512_CYCLES = 10, SAMPLE_HOLD_768_CYCLES = 11, SAMPLE_HOLD_1024_CYCLES = 12 }; enum sampcon_ssel_enum { SAMPCON_SOURCE_TACLK = 0, // Timer A clock source is (external) TACLK SAMPCON_SOURCE_ACLK = 1, // Timer A clock source ACLK SAMPCON_SOURCE_SMCLK = 2, // Timer A clock source SMCLK SAMPCON_SOURCE_INCLK = 3, // Timer A clock source is (external) INCLK }; enum sampcon_id_enum { SAMPCON_CLOCK_DIV_1 = 0, // SAMPCON clock divider of 1 SAMPCON_CLOCK_DIV_2 = 1, // SAMPCON clock divider of 2 SAMPCON_CLOCK_DIV_4 = 2, // SAMPCON clock divider of 4 SAMPCON_CLOCK_DIV_8 = 3, // SAMPCON clock divider of 8 }; // The unique string for allocating ADC resource interfaces #define MSP430ADC12_RESOURCE "Msp430Adc12C.Resource" // The unique string for accessing HAL2 #define ADCC_SERVICE "AdcC.Service" // The unique string for accessing HAL2 via ReadStream #define ADCC_READ_STREAM_SERVICE "AdcC.ReadStream.Client" #ifdef __MSP430_TI_HEADERS__ //#if __GNUC__ >= 4 // "The bitfield structures that overlay peripheral registers are not part of // mspgcc in the future; the recommended way of accessing those fields is to // use the masks defined in the TI headers." // (http://www.millennium.berkeley.edu/pipermail/tinyos-devel/2011-March/004804.html) // // Until the ADC driver is updated our temporary workaround is to re-define the // bitfield structures and continue using them when accessing peripheral // registers via the DEFINE_UNION_CAST (the same is done in the MSP430 Timer // and USART drivers). It has been verified that the definitions of the ADC12 // flags has not changed over the different MSP430 chip variants that have an // ADC12, i.e. using common structs is safe (verified for the header files // installed via package msp430mcu-tinyos version 20110613-20110821). // (http://mail.millennium.berkeley.edu/pipermail/tinyos-2.0wg/2011-August/003861.html) typedef struct { volatile unsigned adc12sc:1, enc:1, adc12tovie:1, adc12ovie:1, adc12on:1, refon:1, r2_5v:1, msc:1, sht0:4, sht1:4; volatile unsigned int : 0; // align to word boundary (saves significant amount of code) } __attribute__ ((packed)) adc12ctl0_t; typedef struct { volatile unsigned adc12busy:1, conseq:2, adc12ssel:2, adc12div:3, issh:1, shp:1, shs:2, cstartadd:4; volatile unsigned int : 0; // align to word boundary (saves significant amount of code) } __attribute__ ((packed)) adc12ctl1_t; #else /* Test for GCC bug (bitfield access) - only version 3.2.3 is known to be stable */ #define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__ * 10 + __GNUC_PATCHLEVEL__) #if GCC_VERSION == 332 #error "This msp430-gcc version (3.3.2) is known to contain a bug when accessing bitfield structs." #elif GCC_VERSION != 323 #warning "This version of msp430-gcc might contain a bug when accessing bitfield structs (version 3.2.3 is safe - anything else is on your own risk)" #endif #endif #if !defined(__msp430_have_adc12) && !defined(__MSP430_HAS_ADC12__) #error Target msp430 device does not have ADC12 module #endif #endif tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430Adc12ClientAutoDMAC.nc000066400000000000000000000053411207233610700243170ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.7 $ * $Date: 2008-06-11 00:42:13 $ * @author: Jan Hauer * ======================================================================== */ /** * This component virtualizes access to the HAL of the MSP430 ADC12. ADC * conversion results are copied using DMA. * * @author Jan Hauer * * @see Please refer to the README.txt and TEP 101 for more information about * this component and its intended use. */ #include generic configuration Msp430Adc12ClientAutoDMAC() { provides { interface Resource; interface Msp430Adc12SingleChannel; interface Msp430Adc12Overflow; } } implementation { components Msp430DmaC, Msp430Adc12DMAP, Msp430Adc12P, Msp430Adc12DMAWireC; enum { ID = unique(MSP430ADC12_RESOURCE), }; Resource = Msp430Adc12P.Resource[ID]; Msp430Adc12SingleChannel = Msp430Adc12DMAP.SingleChannel[ID]; Msp430Adc12Overflow = Msp430Adc12P.Overflow[ID]; Msp430Adc12DMAP.SubSingleChannel[ID] -> Msp430Adc12P.SingleChannel[ID]; Msp430Adc12DMAP.AsyncAdcControl[ID] -> Msp430Adc12P.DMAExtension[ID]; } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430Adc12ClientAutoDMA_RVGC.nc000066400000000000000000000061751207233610700250430ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.8 $ $Date: 2008-06-11 00:42:13 $ @author: Jan Hauer * * ======================================================================== */ /** * This component virtualizes access to the HAL of the MSP430 ADC12. ADC * conversion results are copied using DMA and reference voltage is enabled as * required by the configuration. * * @author Jan Hauer * * @see Please refer to the README.txt and TEP 101 for more information about * this component and its intended use. */ #include generic configuration Msp430Adc12ClientAutoDMA_RVGC() { provides { interface Resource; interface Msp430Adc12SingleChannel; interface Msp430Adc12Overflow; } uses interface AdcConfigure; } implementation { components Msp430Adc12P, Msp430RefVoltArbiterP, Msp430Adc12DMAWireC; enum { ID = unique(MSP430ADC12_RESOURCE), }; Resource = Msp430RefVoltArbiterP.ClientResource[ID]; Msp430Adc12Overflow = Msp430Adc12P.Overflow[ID]; Msp430RefVoltArbiterP.AdcResource[ID] -> Msp430Adc12P.Resource[ID]; components new Msp430Adc12ConfAlertC(); AdcConfigure = Msp430Adc12ConfAlertC.ConfUp; Msp430RefVoltArbiterP.Config[ID] -> Msp430Adc12ConfAlertC.ConfSub; components Msp430DmaC, Msp430Adc12DMAP; Msp430Adc12SingleChannel = Msp430Adc12DMAP.SingleChannel[ID]; Msp430Adc12DMAP.SubSingleChannel[ID] -> Msp430Adc12P.SingleChannel[ID]; Msp430Adc12DMAP.AsyncAdcControl[ID] -> Msp430Adc12P.DMAExtension[ID]; } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430Adc12ClientAutoRVGC.nc000066400000000000000000000057301207233610700243560ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.8 $ $Date: 2008-06-11 00:42:13 $ @author: Jan Hauer * * ======================================================================== */ /** * This component virtualizes access to the HAL of the MSP430 ADC12. * Reference voltage is enabled automatically as required by the configuration. * * @author Jan Hauer * * @see Please refer to the README.txt and TEP 101 for more information about * this component and its intended use. */ #include generic configuration Msp430Adc12ClientAutoRVGC() { provides { interface Resource; interface Msp430Adc12SingleChannel; interface Msp430Adc12MultiChannel; interface Msp430Adc12Overflow; } uses interface AdcConfigure; } implementation { components Msp430Adc12P, Msp430RefVoltArbiterP; enum { ID = unique(MSP430ADC12_RESOURCE), }; Resource = Msp430RefVoltArbiterP.ClientResource[ID]; Msp430Adc12SingleChannel = Msp430Adc12P.SingleChannel[ID]; Msp430Adc12MultiChannel = Msp430Adc12P.MultiChannel[ID]; Msp430Adc12Overflow = Msp430Adc12P.Overflow[ID]; Msp430RefVoltArbiterP.AdcResource[ID] -> Msp430Adc12P.Resource[ID]; components new Msp430Adc12ConfAlertC(); AdcConfigure = Msp430Adc12ConfAlertC.ConfUp; Msp430RefVoltArbiterP.Config[ID] -> Msp430Adc12ConfAlertC.ConfSub; } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430Adc12ClientC.nc000066400000000000000000000051021207233610700231370ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2008-06-11 00:42:13 $ * @author: Jan Hauer * ======================================================================== */ /** * This component virtualizes access to the HAL of the MSP430 ADC12. * * @author Jan Hauer * * @see Please refer to the README.txt and TEP 101 for more information about * this component and its intended use. */ #include generic configuration Msp430Adc12ClientC() { provides { interface Resource; interface Msp430Adc12SingleChannel; interface Msp430Adc12MultiChannel; interface Msp430Adc12Overflow; } } implementation { components Msp430Adc12P; enum { ID = unique(MSP430ADC12_RESOURCE), }; Resource = Msp430Adc12P.Resource[ID]; Msp430Adc12SingleChannel = Msp430Adc12P.SingleChannel[ID]; Msp430Adc12MultiChannel = Msp430Adc12P.MultiChannel[ID]; Msp430Adc12Overflow = Msp430Adc12P.Overflow[ID]; } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430Adc12ConfAlertC.nc000066400000000000000000000046751207233610700236140ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ $Date: 2008-06-11 00:42:13 $ @author: Jan Hauer * * ======================================================================== */ /** * The only purpose of this component is to generate a nesC warning * if someone has wired to Msp430Adc12ClientAutoRVGC or * Msp430Adc12ClientAutoDMA_RVGC and forgotten to wire to AdcConfigure. * (nesC optimizes all of its code away). * * @author: Jan Hauer */ #include generic module Msp430Adc12ConfAlertC() { provides interface AdcConfigure as ConfSub; uses interface AdcConfigure as ConfUp; } implementation { async command const msp430adc12_channel_config_t* ConfSub.getConfiguration() { return call ConfUp.getConfiguration(); } } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430Adc12DMAP.nc000066400000000000000000000160421207233610700223440ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2008-06-23 20:25:15 $ * @author: Jan Hauer * ======================================================================== */ #include #include module Msp430Adc12DMAP @safe() { provides { interface Msp430Adc12SingleChannel as SingleChannel[uint8_t id]; } uses { interface Msp430DmaControl as DMAControl; interface Msp430DmaChannel as DMAChannel; interface Msp430Adc12SingleChannel as SubSingleChannel[uint8_t id]; interface AsyncStdControl as AsyncAdcControl[uint8_t id]; } } implementation { enum { MULTIPLE_SINGLE, MULTIPLE_REPEAT, MULTIPLE_SINGLE_AGAIN, }; // norace declarations are safe here, because Msp430Adc12P.nc implements // a lock mechanism which guarantees that no two clients can access the ADC // and the module variables below are only changed after the lock was acquired norace uint8_t client; norace uint8_t mode; norace uint16_t *buffer; norace uint16_t numSamples; async command error_t SingleChannel.configureSingle[uint8_t id]( const msp430adc12_channel_config_t *config) { // don't use DMA for single conversions return call SubSingleChannel.configureSingle[id](config); } async command error_t SingleChannel.configureSingleRepeat[uint8_t id]( const msp430adc12_channel_config_t *config, uint16_t jiffies) { // don't use DMA for single conversions return call SubSingleChannel.configureSingleRepeat[id](config, jiffies); } error_t configure(uint8_t id, const msp430adc12_channel_config_t *config, uint16_t *buf, uint16_t length, uint16_t jiffies, uint8_t _mode) { // for multiple samples single-channel repat-conversion mode // is used, because then there is only one interrupt at the // the end of the whole sequence and DMA has done all the copying error_t result = call SubSingleChannel.configureSingleRepeat[id](config, jiffies); if (result == SUCCESS){ call DMAControl.init(); call DMAControl.setFlags(ENABLE_NMI, NOT_ROUND_ROBIN, ON_FETCH); call DMAChannel.setupTransfer( DMA_SINGLE_TRANSFER, DMA_TRIGGER_ADC12IFGx, DMA_EDGE_SENSITIVE, (void*) ADC12MEM_, buf, length, DMA_WORD, DMA_WORD, DMA_ADDRESS_UNCHANGED, DMA_ADDRESS_INCREMENTED ); call DMAChannel.startTransfer(); client = id; mode = _mode; buffer = buf; numSamples = length; call AsyncAdcControl.start[id](); } return result; } async command error_t SingleChannel.configureMultiple[uint8_t id]( const msp430adc12_channel_config_t *config, uint16_t *buf, uint16_t length, uint16_t jiffies) { return configure(id, config, buf, length, jiffies, MULTIPLE_SINGLE); } async command error_t SingleChannel.configureMultipleRepeat[uint8_t id]( const msp430adc12_channel_config_t *config, uint16_t *buf, uint8_t length, uint16_t jiffies) { return configure(id, config, buf, length, jiffies, MULTIPLE_REPEAT); } async command error_t SingleChannel.getData[uint8_t id]() { if (mode == MULTIPLE_SINGLE_AGAIN) call DMAChannel.repeatTransfer((void*) ADC12MEM_, buffer, numSamples); return call SubSingleChannel.getData[id](); } async event error_t SubSingleChannel.singleDataReady[uint8_t id](uint16_t data) { // forward (only signalled if not in DMA mode) return signal SingleChannel.singleDataReady[id](data); } async event uint16_t* SubSingleChannel.multipleDataReady[uint8_t id](uint16_t buf[], uint16_t num) { // will never get here return 0; } async event void DMAChannel.transferDone(error_t success) { uint8_t oldMode = mode; uint16_t *new_buffer; if (oldMode != MULTIPLE_REPEAT){ call AsyncAdcControl.stop[client](); mode = MULTIPLE_SINGLE_AGAIN; } new_buffer = signal SingleChannel.multipleDataReady[client](buffer, numSamples); if (oldMode == MULTIPLE_REPEAT) { if (new_buffer) { buffer = new_buffer; call DMAChannel.repeatTransfer((void*) ADC12MEM_, buffer, numSamples); } else call AsyncAdcControl.stop[client](); } } default async command error_t SubSingleChannel.configureSingle[uint8_t id]( const msp430adc12_channel_config_t *config) { return FAIL; } default async command error_t SubSingleChannel.configureSingleRepeat[uint8_t id]( const msp430adc12_channel_config_t *config, uint16_t jiffies) { return FAIL; } default async command error_t SubSingleChannel.configureMultiple[uint8_t id]( const msp430adc12_channel_config_t *config, uint16_t buf[], uint16_t num, uint16_t jiffies) { return FAIL; } default async command error_t SubSingleChannel.configureMultipleRepeat[uint8_t id]( const msp430adc12_channel_config_t *config, uint16_t buf[], uint8_t num, uint16_t jiffies) { return FAIL; } default async command error_t SubSingleChannel.getData[uint8_t id]() { return FAIL;} default async event error_t SingleChannel.singleDataReady[uint8_t id]( uint16_t data) { return FAIL; } default async event uint16_t* SingleChannel.multipleDataReady[uint8_t id]( uint16_t buf[], uint16_t num) { return 0;} default async command error_t AsyncAdcControl.stop[uint8_t id]() { return FAIL; } default async command error_t AsyncAdcControl.start[uint8_t id]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430Adc12DMAWireC.nc000066400000000000000000000040701207233610700231540ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2008-04-07 09:41:55 $ * @author: Jan Hauer * ======================================================================== */ configuration Msp430Adc12DMAWireC { } implementation { components Msp430DmaC, Msp430Adc12DMAP; Msp430Adc12DMAP.DMAControl -> Msp430DmaC.Control; Msp430Adc12DMAP.DMAChannel -> Msp430DmaC.Channel2; #warning Accessing DMA.channel2 for ADC12 } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430Adc12ImplP.nc000066400000000000000000000511341207233610700226450ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.14 $ * $Date: 2008-11-10 14:56:12 $ * @author: Jan Hauer * ======================================================================== */ #include module Msp430Adc12ImplP @safe() { provides { interface Init; interface Msp430Adc12SingleChannel as SingleChannel[uint8_t id]; interface Msp430Adc12MultiChannel as MultiChannel[uint8_t id]; interface Msp430Adc12Overflow as Overflow[uint8_t id]; interface AsyncStdControl as DMAExtension[uint8_t id]; } uses { interface ArbiterInfo as ADCArbiterInfo; interface HplAdc12; interface Msp430Timer as TimerA;; interface Msp430TimerControl as ControlA0; interface Msp430TimerControl as ControlA1; interface Msp430Compare as CompareA0; interface Msp430Compare as CompareA1; interface HplMsp430GeneralIO as Port60; interface HplMsp430GeneralIO as Port61; interface HplMsp430GeneralIO as Port62; interface HplMsp430GeneralIO as Port63; interface HplMsp430GeneralIO as Port64; interface HplMsp430GeneralIO as Port65; interface HplMsp430GeneralIO as Port66; interface HplMsp430GeneralIO as Port67; } } implementation { #ifdef ADC12_TIMERA_ENABLED #warning Accessing TimerA for ADC12 #endif enum { SINGLE_DATA = 1, SINGLE_DATA_REPEAT = 2, MULTIPLE_DATA = 4, MULTIPLE_DATA_REPEAT = 8, MULTI_CHANNEL = 16, CONVERSION_MODE_MASK = 0x1F, ADC_BUSY = 32, /* request pending */ USE_TIMERA = 64, /* TimerA used for SAMPCON signal */ ADC_OVERFLOW = 128, }; uint8_t state; /* see enum above */ uint16_t resultBufferLength; /* length of buffer */ uint16_t *COUNT_NOK(resultBufferLength) resultBufferStart; uint16_t resultBufferIndex; /* offset into buffer */ uint8_t numChannels; /* number of channels (multi-channel conversion) */ uint8_t clientID; /* ID of client that called getData() */ command error_t Init.init() { adc12ctl0_t ctl0; atomic { // stop any ongoing conversion (conversion data -if any- is unreliable) call HplAdc12.stopConversion(); // clear pending interrupt flags (potential relict from SW reset / PUC) call HplAdc12.resetIFGs(); ctl0 = call HplAdc12.getCtl0(); ctl0.adc12tovie = 1; ctl0.adc12ovie = 1; call HplAdc12.setCtl0(ctl0); } return SUCCESS; } void prepareTimerA(uint16_t interval, uint16_t csSAMPCON, uint16_t cdSAMPCON) { #ifdef ADC12_TIMERA_ENABLED msp430_compare_control_t ccResetSHI = { ccifg : 0, cov : 0, out : 0, cci : 0, ccie : 0, outmod : 0, cap : 0, clld : 0, scs : 0, ccis : 0, cm : 0 }; call TimerA.setMode(MSP430TIMER_STOP_MODE); call TimerA.clear(); call TimerA.disableEvents(); call TimerA.setClockSource(csSAMPCON); call TimerA.setInputDivider(cdSAMPCON); call ControlA0.setControl(ccResetSHI); call CompareA0.setEvent(interval-1); call CompareA1.setEvent((interval-1)/2); #endif } void startTimerA() { #ifdef ADC12_TIMERA_ENABLED msp430_compare_control_t ccSetSHI = { ccifg : 0, cov : 0, out : 1, cci : 0, ccie : 0, outmod : 0, cap : 0, clld : 0, scs : 0, ccis : 0, cm : 0 }; msp430_compare_control_t ccResetSHI = { ccifg : 0, cov : 0, out : 0, cci : 0, ccie : 0, outmod : 0, cap : 0, clld : 0, scs : 0, ccis : 0, cm : 0 }; msp430_compare_control_t ccRSOutmod = { ccifg : 0, cov : 0, out : 0, cci : 0, ccie : 0, outmod : 7, cap : 0, clld : 0, scs : 0, ccis : 0, cm : 0 }; // manually trigger first conversion, then switch to Reset/set conversionMode call ControlA1.setControl(ccResetSHI); call ControlA1.setControl(ccSetSHI); //call ControlA1.setControl(ccResetSHI); call ControlA1.setControl(ccRSOutmod); call TimerA.setMode(MSP430TIMER_UP_MODE); // go! #endif } void configureAdcPin( uint8_t inch ) { #ifdef ADC12_P6PIN_AUTO_CONFIGURE switch (inch) { case 0: call Port60.selectModuleFunc(); call Port60.makeInput(); break; case 1: call Port61.selectModuleFunc(); call Port61.makeInput(); break; case 2: call Port62.selectModuleFunc(); call Port62.makeInput(); break; case 3: call Port63.selectModuleFunc(); call Port63.makeInput(); break; case 4: call Port64.selectModuleFunc(); call Port64.makeInput(); break; case 5: call Port65.selectModuleFunc(); call Port65.makeInput(); break; case 6: call Port66.selectModuleFunc(); call Port66.makeInput(); break; case 7: call Port67.selectModuleFunc(); call Port67.makeInput(); break; } #endif } void resetAdcPin( uint8_t inch ) { #ifdef ADC12_P6PIN_AUTO_CONFIGURE switch (inch) { case 0: call Port60.selectIOFunc(); break; case 1: call Port61.selectIOFunc(); break; case 2: call Port62.selectIOFunc(); break; case 3: call Port63.selectIOFunc(); break; case 4: call Port64.selectIOFunc(); break; case 5: call Port65.selectIOFunc(); break; case 6: call Port66.selectIOFunc(); break; case 7: call Port67.selectIOFunc(); break; } #endif } async command error_t SingleChannel.configureSingle[uint8_t id]( const msp430adc12_channel_config_t *config) { error_t result = ERESERVE; #ifdef ADC12_CHECK_ARGS if (!config) return EINVAL; #endif atomic { if (state & ADC_BUSY) return EBUSY; if (call ADCArbiterInfo.userId() == id){ adc12ctl1_t ctl1 = { adc12busy: 0, conseq: 0, adc12ssel: config->adc12ssel, adc12div: config->adc12div, issh: 0, shp: 1, shs: 0, cstartadd: 0 }; adc12memctl_t memctl = { inch: config->inch, sref: config->sref, eos: 1 }; adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); ctl0.msc = 1; ctl0.sht0 = config->sht; ctl0.sht1 = config->sht; state = SINGLE_DATA; call HplAdc12.setCtl0(ctl0); call HplAdc12.setCtl1(ctl1); call HplAdc12.setMCtl(0, memctl); call HplAdc12.setIEFlags(0x01); result = SUCCESS; } } return result; } async command error_t SingleChannel.configureSingleRepeat[uint8_t id]( const msp430adc12_channel_config_t *config, uint16_t jiffies) { error_t result = ERESERVE; #ifdef ADC12_CHECK_ARGS #ifndef ADC12_TIMERA_ENABLED if (jiffies>0) return EINVAL; #endif if (!config || jiffies == 1 || jiffies == 2) return EINVAL; #endif atomic { if (state & ADC_BUSY) return EBUSY; if (call ADCArbiterInfo.userId() == id) { adc12ctl1_t ctl1 = { adc12busy: 0, conseq: 2, adc12ssel: config->adc12ssel, adc12div: config->adc12div, issh: 0, shp: 1, shs: (jiffies == 0) ? 0 : 1, cstartadd: 0 }; adc12memctl_t memctl = { inch: config->inch, sref: config->sref, eos: 1 }; adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); ctl0.msc = (jiffies == 0) ? 1 : 0; ctl0.sht0 = config->sht; ctl0.sht1 = config->sht; state = SINGLE_DATA_REPEAT; call HplAdc12.setCtl0(ctl0); call HplAdc12.setCtl1(ctl1); call HplAdc12.setMCtl(0, memctl); call HplAdc12.setIEFlags(0x01); if (jiffies){ state |= USE_TIMERA; prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id); } result = SUCCESS; } } return result; } async command error_t SingleChannel.configureMultiple[uint8_t id]( const msp430adc12_channel_config_t *config, uint16_t *buf, uint16_t length, uint16_t jiffies) { error_t result = ERESERVE; #ifdef ADC12_CHECK_ARGS #ifndef ADC12_TIMERA_ENABLED if (jiffies>0) return EINVAL; #endif if (!config || !buf || !length || jiffies == 1 || jiffies == 2) return EINVAL; #endif atomic { if (state & ADC_BUSY) return EBUSY; if (call ADCArbiterInfo.userId() == id){ adc12ctl1_t ctl1 = { adc12busy: 0, conseq: (length > 16) ? 3 : 1, adc12ssel: config->adc12ssel, adc12div: config->adc12div, issh: 0, shp: 1, shs: (jiffies == 0) ? 0 : 1, cstartadd: 0 }; adc12memctl_t memctl = { inch: config->inch, sref: config->sref, eos: 0 }; uint16_t i, mask = 1; adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); ctl0.msc = (jiffies == 0) ? 1 : 0; ctl0.sht0 = config->sht; ctl0.sht1 = config->sht; state = MULTIPLE_DATA; resultBufferStart = NULL; resultBufferLength = length; resultBufferStart = buf; resultBufferIndex = 0; call HplAdc12.setCtl0(ctl0); call HplAdc12.setCtl1(ctl1); for (i=0; i<(length-1) && i < 15; i++) call HplAdc12.setMCtl(i, memctl); memctl.eos = 1; call HplAdc12.setMCtl(i, memctl); call HplAdc12.setIEFlags(mask << i); if (jiffies){ state |= USE_TIMERA; prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id); } result = SUCCESS; } } return result; } async command error_t SingleChannel.configureMultipleRepeat[uint8_t id]( const msp430adc12_channel_config_t *config, uint16_t *buf, uint8_t length, uint16_t jiffies) { error_t result = ERESERVE; #ifdef ADC12_CHECK_ARGS #ifndef ADC12_TIMERA_ENABLED if (jiffies>0) return EINVAL; #endif if (!config || !buf || !length || length > 16 || jiffies == 1 || jiffies == 2) return EINVAL; #endif atomic { if (state & ADC_BUSY) return EBUSY; if (call ADCArbiterInfo.userId() == id){ adc12ctl1_t ctl1 = { adc12busy: 0, conseq: 3, adc12ssel: config->adc12ssel, adc12div: config->adc12div, issh: 0, shp: 1, shs: (jiffies == 0) ? 0 : 1, cstartadd: 0 }; adc12memctl_t memctl = { inch: config->inch, sref: config->sref, eos: 0 }; uint16_t i, mask = 1; adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); ctl0.msc = (jiffies == 0) ? 1 : 0; ctl0.sht0 = config->sht; ctl0.sht1 = config->sht; state = MULTIPLE_DATA_REPEAT; resultBufferStart = NULL; resultBufferLength = length; resultBufferStart = buf; resultBufferIndex = 0; call HplAdc12.setCtl0(ctl0); call HplAdc12.setCtl1(ctl1); for (i=0; i<(length-1) && i < 15; i++) call HplAdc12.setMCtl(i, memctl); memctl.eos = 1; call HplAdc12.setMCtl(i, memctl); call HplAdc12.setIEFlags(mask << i); if (jiffies){ state |= USE_TIMERA; prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id); } result = SUCCESS; } } return result; } async command error_t SingleChannel.getData[uint8_t id]() { atomic { if (call ADCArbiterInfo.userId() == id){ if ((state & MULTIPLE_DATA_REPEAT) && !resultBufferStart) return EINVAL; if (state & ADC_BUSY) return EBUSY; state |= ADC_BUSY; clientID = id; configureAdcPin((call HplAdc12.getMCtl(0)).inch); call HplAdc12.startConversion(); if (state & USE_TIMERA) startTimerA(); return SUCCESS; } } return FAIL; } async command error_t MultiChannel.configure[uint8_t id]( const msp430adc12_channel_config_t *config, adc12memctl_t *memctl, uint8_t numMemctl, uint16_t *buf, uint16_t numSamples, uint16_t jiffies) { error_t result = ERESERVE; #ifdef ADC12_CHECK_ARGS #ifndef ADC12_TIMERA_ENABLED if (jiffies>0) return EINVAL; #endif if (!config || !memctl || !numMemctl || numMemctl > 15 || !numSamples || !buf || jiffies == 1 || jiffies == 2 || numSamples % (numMemctl+1) != 0) return EINVAL; #endif atomic { if (state & ADC_BUSY) return EBUSY; if (call ADCArbiterInfo.userId() == id){ adc12ctl1_t ctl1 = { adc12busy: 0, conseq: (numSamples > numMemctl+1) ? 3 : 1, adc12ssel: config->adc12ssel, adc12div: config->adc12div, issh: 0, shp: 1, shs: (jiffies == 0) ? 0 : 1, cstartadd: 0 }; adc12memctl_t firstMemctl = { inch: config->inch, sref: config->sref, eos: 0 }; uint16_t i, mask = 1; adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); ctl0.msc = (jiffies == 0) ? 1 : 0; ctl0.sht0 = config->sht; ctl0.sht1 = config->sht; state = MULTI_CHANNEL; resultBufferStart = NULL; resultBufferLength = numSamples; resultBufferStart = buf; resultBufferIndex = 0; numChannels = numMemctl+1; call HplAdc12.setCtl0(ctl0); call HplAdc12.setCtl1(ctl1); call HplAdc12.setMCtl(0, firstMemctl); for (i=0; i<(numMemctl-1) && i < 14; i++){ memctl[i].eos = 0; call HplAdc12.setMCtl(i+1, memctl[i]); } memctl[i].eos = 1; call HplAdc12.setMCtl(i+1, memctl[i]); call HplAdc12.setIEFlags(mask << (i+1)); if (jiffies){ state |= USE_TIMERA; prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id); } result = SUCCESS; } } return result; } async command error_t MultiChannel.getData[uint8_t id]() { uint8_t i; atomic { if (call ADCArbiterInfo.userId() == id){ if (!resultBufferStart) return EINVAL; if (state & ADC_BUSY) return EBUSY; state |= ADC_BUSY; clientID = id; for (i=0; i 16) length = 16; else length = resultBufferLength - resultBufferIndex; do { *resultBuffer++ = call HplAdc12.getMem(i); } while (++i < length); resultBufferIndex += length; if (overflow || resultBufferLength == resultBufferIndex){ stopConversion(); resultBuffer -= resultBufferIndex; k = resultBufferIndex - length; resultBufferIndex = 0; signal SingleChannel.multipleDataReady[clientID](resultBuffer, overflow ? k : resultBufferLength); } else if (resultBufferLength - resultBufferIndex > 15) return; else { // last sequence < 16 samples adc12memctl_t memctl = call HplAdc12.getMCtl(0); memctl.eos = 1; call HplAdc12.setMCtl(resultBufferLength - resultBufferIndex, memctl); } } break; case MULTIPLE_DATA_REPEAT: { uint8_t i = 0; resultBuffer = resultBufferStart; do { *resultBuffer++ = call HplAdc12.getMem(i); } while (++i < resultBufferLength); resultBufferStart = signal SingleChannel.multipleDataReady[clientID]( resultBuffer-resultBufferLength, overflow ? 0 : resultBufferLength); if (!resultBufferStart) stopConversion(); break; } #endif default: stopConversion(); break; } // switch } default async event error_t SingleChannel.singleDataReady[uint8_t id](uint16_t data) { return FAIL; } default async event uint16_t* SingleChannel.multipleDataReady[uint8_t id]( uint16_t *buf, uint16_t numSamples) { return 0; } default async event void MultiChannel.dataReady[uint8_t id](uint16_t *buffer, uint16_t numSamples) {}; default async event void Overflow.memOverflow[uint8_t id](){} default async event void Overflow.conversionTimeOverflow[uint8_t id](){} } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430Adc12MultiChannel.nc000066400000000000000000000114731207233610700242110ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2009-12-03 17:36:13 $ * @author: Jan Hauer * ======================================================================== */ /** * This interface provides access to the ADC12 on the level of HAL. It can be * used to sample up to 16 (different) ADC channels. It separates between * configuration and data collection: every time a client has been granted * access to the ADC subsystem (via the Resource interface), it first has to * configure the ADC. Afterwards the client may call getData() more than once * without reconfiguring the ADC in between (if the client has not released the * ADC via the Resource interface), i.e.

      * * configure() -> ( getData() -> dataReady() )* * * @author Jan Hauer */ #include "Msp430Adc12.h" interface Msp430Adc12MultiChannel { /** * Configures the ADC to perform conversion(s) on multiple channels. Any * previous configuration will be overwritten. If SUCCESS is returned * calling getData() will start the conversion immediately and a * dataReady() event will be signalled with the conversion * result when the conversion has finished. * * @param config Main ADC12 configuration and configuration of the first * channel * * @param memctl List of additional channels and respective reference * voltages * * @param numMemctl Number of entries in the list * * @param buffer Buffer to store the conversion results, it must have * numSamples entries. Results will be stored in the order the channels where * specified. * * @param numSamples Total number of samples. Note: numSamples % * (numMemctl+1) must be zero. For example, to sample every channel twice use * numSamples = (numMemctl+1) * 2 * * @param jiffies Sampling period in terms of clock ticks of "sampcon_ssel" * and input divider "sampcon_id". Samples are taken equally-spaced in * time iterating round-robin over the channels (different channels are * not sampled simultaneously but one after another). * * @return SUCCESS means that the ADC was configured successfully and * getData() can be called to start the conversion. */ async command error_t configure(const msp430adc12_channel_config_t *config, adc12memctl_t *memctl, uint8_t numMemctl, uint16_t *buffer, uint16_t numSamples, uint16_t jiffies); /** * Starts sampling the adc channels using the configuration as specified by * the last call to configure(). * * @return SUCCESS means that the conversion was started successfully and an * event dataReady() will be signalled. Otherwise no event will be signalled. */ async command error_t getData(); /** * Conversion results are ready. Results are stored in the buffer in the * order the channels where specified in the configure() * command, i.e. every (numMemctl+1)-th entry maps to the same channel. * * @param buffer Conversion results (lower 12 bit are valid, respectively). * @param numSamples Number of results stored in buffer */ async event void dataReady(uint16_t *buffer, uint16_t numSamples); } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430Adc12Overflow.nc000066400000000000000000000043231207233610700234250ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2006-12-12 18:23:07 $ * @author: Jan Hauer * ======================================================================== */ /** * Signals an ADC12MEMx overflow or conversion time overflow condition to the * client. * * @author Jan Hauer */ #include "Msp430Adc12.h" interface Msp430Adc12Overflow { /** * An ADC12MEMx overflow condition has occured. */ async event void memOverflow(); /** * A conversion time overflow condition has occured. */ async event void conversionTimeOverflow(); } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430Adc12P.nc000066400000000000000000000067671207233610700220370ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.7 $ * $Date: 2008-05-15 23:57:13 $ * @author: Jan Hauer * ======================================================================== */ #include configuration Msp430Adc12P { provides { interface Resource[uint8_t id]; interface Msp430Adc12SingleChannel as SingleChannel[uint8_t id]; interface Msp430Adc12MultiChannel as MultiChannel[uint8_t id]; interface Msp430Adc12Overflow as Overflow[uint8_t id]; interface AsyncStdControl as DMAExtension[uint8_t id]; } } implementation { components Msp430Adc12ImplP, HplAdc12P, MainC, new SimpleRoundRobinArbiterC(MSP430ADC12_RESOURCE) as Arbiter; Resource = Arbiter; SingleChannel = Msp430Adc12ImplP.SingleChannel; MultiChannel= Msp430Adc12ImplP.MultiChannel; Overflow = Msp430Adc12ImplP.Overflow; DMAExtension = Msp430Adc12ImplP.DMAExtension; Msp430Adc12ImplP.Init <- MainC; Msp430Adc12ImplP.ADCArbiterInfo -> Arbiter; Msp430Adc12ImplP.HplAdc12 -> HplAdc12P; #ifdef ADC12_P6PIN_AUTO_CONFIGURE components HplMsp430GeneralIOC; Msp430Adc12ImplP.Port60 -> HplMsp430GeneralIOC.Port60; Msp430Adc12ImplP.Port61 -> HplMsp430GeneralIOC.Port61; Msp430Adc12ImplP.Port62 -> HplMsp430GeneralIOC.Port62; Msp430Adc12ImplP.Port63 -> HplMsp430GeneralIOC.Port63; Msp430Adc12ImplP.Port64 -> HplMsp430GeneralIOC.Port64; Msp430Adc12ImplP.Port65 -> HplMsp430GeneralIOC.Port65; Msp430Adc12ImplP.Port66 -> HplMsp430GeneralIOC.Port66; Msp430Adc12ImplP.Port67 -> HplMsp430GeneralIOC.Port67; #endif #ifdef ADC12_TIMERA_ENABLED components Msp430TimerC; Msp430Adc12ImplP.TimerA -> Msp430TimerC.TimerA; Msp430Adc12ImplP.ControlA0 -> Msp430TimerC.ControlA0; Msp430Adc12ImplP.ControlA1 -> Msp430TimerC.ControlA1; Msp430Adc12ImplP.CompareA0 -> Msp430TimerC.CompareA0; Msp430Adc12ImplP.CompareA1 -> Msp430TimerC.CompareA1; #endif } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430Adc12SingleChannel.nc000066400000000000000000000277501207233610700243450ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2008-06-27 18:05:23 $ * @author: Jan Hauer * ======================================================================== */ /** * * This interface provides access to the ADC12 on the level of HAL. It can be * used to sample a single adc channel once or repeatedly (one event is * signalled per conversion result) or perform multiple conversions for a * single channel once or repeatedly (one event is signalled per multiple * conversion results). It cannot be used to sample different adc channels with * a single command (use the Msp430Adc12MultiChannel interface instead). * Sampling a channel requires calling a sequence of two commands, configureX() * and getData(), where X is either 'Single', 'SingleRepeat', 'Multiple' or * 'MultipleRepeat'. Conversion results will be signalled by the * dataReadySingle() or dataReadyMultiple() event, depending on the previous * configuration, i.e. there are four possible sequences: * *

      configureSingle() -> ( getData() -> singleDataReady() )* *

      configureSingleRepeat() -> ( getData() -> singleDataReady() )* *

      configureMultiple() -> ( getData() -> multipleDataReady() )* *

      configureMultipleRepeat() -> getData() -> multipleDataReady() * *

      where configureX() and getData() are commands called by the client and * singleDataReady() and multipleDataReady() are events signalled back to the * client by the adc subsystem. Note that a configuration is valid until the * client reconfigures or releases the ADC (using the Resource interface), * except for configureMultipleRepeat(), which is only valid for a single call * to getData(). This means that after a successful configuration with, for * example, configureSingle() the client may call getData() more than once * without reconfiguring the ADC in between (if the client has not released the * ADC via the Resource interface). * * @author Jan Hauer */ #include "Msp430Adc12.h" interface Msp430Adc12SingleChannel { /** * Configures the ADC to perform a single conversion. Any previous * configuration will be overwritten. If SUCCESS is returned calling * getData() will start the conversion immediately and a * singleDataReady() event will be signalled with the conversion * result when the conversion has finished. * * @param config ADC12 configuration data. * * @return SUCCESS means that the ADC was configured successfully and * getData() can be called to start the conversion. */ async command error_t configureSingle(const msp430adc12_channel_config_t *ONE config); /** * Configures the ADC for repeated single channel conversion mode. Any * previous configuration will be overwritten. If SUCCESS is returned calling * getData() will start sampling the adc channel periodically * (the first conversion is started immediately). The sampling period is * specified by the jiffies parameter, which defines the time * between successive conversions in terms of clock ticks of clock source * "sampcon_ssel" and clock input divider "sampcon_id" as specified in the * config parameter. If jiffies is zero successive conversions * are performed as quickly as possible. Conversion result are signalled * until the client returns FAIL in the * singleDataReady() event handler. * * @param config ADC12 configuration data. * @param jiffies Sampling period in terms of clock ticks of "sampcon_ssel" and * input divider "sampcon_id". * * @return SUCCESS means that the ADC was configured successfully and * getData() can be called to start with the first conversion. */ async command error_t configureSingleRepeat(const msp430adc12_channel_config_t *ONE config, uint16_t jiffies); /** * Configures the ADC for sampling a channel numSamples times * with a given sampling period. Any previous configuration will be * overwritten. In contrast to the configureSingleRepeat() * command, this configuration means that only one event will be signalled * after all samples have been taken (which is useful for high-frequency * sampling). If SUCCESS is returned calling getData() will * start sampling the adc channel numSamples times and the first * conversion is started immediately. Conversion results are stored in a * buffer allocated by the client (the buffer * parameter). The sampling period is specified by the jiffies * parameter, which defines the time between successive conversions in terms * of clock ticks of clock source "sampcon_ssel" and clock input divider * "sampcon_id" as specified in the config parameter. If jiffies * is zero successive conversions are performed as quickly as possible. After * numSamples conversions an event * multipleDataReady() is signalled with the conversion results. * * @param config ADC12 configuration data. * @param jiffies Sampling period in terms of clock ticks of "sampcon_ssel" * and input divider "sampcon_id". * @param buffer The user-allocated buffer in which the conversion results * will be stored. It must have at least numSamples entries, * i.e. it must have a size of at least numSamples * 2 byte. * @param numSamples Number of adc samples * * @return SUCCESS means that the ADC was configured successfully and * getData() can be called to start with the first conversion. */ async command error_t configureMultiple( const msp430adc12_channel_config_t *ONE config, uint16_t *COUNT(numSamples) buffer, uint16_t numSamples, uint16_t jiffies); /** * * Configures the ADC for sampling a channel multiple times repeatedly. Any * previous configuration will be overwritten. In contrast to the * configureSingleRepeat() command this configuration means that * an event with numSamples conversion results will be * signalled, where 0 < numSamples <= 16. In contrast to the * configureMultiple() command, this configuration means that * numSamples conversion results will be signalled repeatedly * until the client returns FAIL in the * multipleDataReady() event handler. * * If configureMultipleRepeat() returns SUCCESS calling * getData() will start the the first conversion immediately. * The sampling period is specified by the jiffies parameter, * which defines the time between successive conversions in terms of clock * ticks of clock source "sampcon_ssel" and clock input divider "sampcon_id" * as specified in the config parameter. If jiffies is zero * successive conversions are performed as quickly as possible. After * numSamples conversions an event * multipleDataReady() is signalled with numSamples * conversion results. If the client returns SUCCESS in the * multipleDataReady() event handler, numSamples * new conversions will be performed, otherwise not. * * @param config ADC12 configuration data. * @param jiffies Sampling period in terms of clock ticks of "sampcon_ssel" * and input divider "sampcon_id". * @param buffer The user-allocated buffer in which the conversion results * will be stored. It must have at least numSamples entries, * i.e. it must have a size of at least numSamples * 2 byte. * @param numSamples Number of adc samples to take, 0 < * numSamples <= 16 * * @return SUCCESS means that the ADC was configured successfully and * getData() can be called to start with the first conversion. */ async command error_t configureMultipleRepeat(const msp430adc12_channel_config_t *ONE config, uint16_t *COUNT(numSamples) buffer, uint8_t numSamples, uint16_t jiffies); /** * Starts sampling an adc channel using the configuration as specified by * the last call to any of the four available configuration commands. * * @return SUCCESS means that the conversion was started successfully and an * event singleDataReady() or multipleDataReady() will be signalled * (depending on the previous configuration). Otherwise no such event will be * signalled. */ async command error_t getData(); /** * A single ADC conversion result is ready. If the ADC was configured with * the configureSingle() command, then the return value is * ignored. If the ADC was configured with the * configureSingleRepeat() command then the return value tells * whether another conversion should be performed (SUCCESS()) or * not (FAIL). * * @param data Conversion result (lower 12 bit). * * @return If this event is signalled as response to a call to * configureSingleRepeat() then SUCCESS results in * another sampling and FAIL stops the repeated sampling. * Otherwise the return value is ignored. */ async event error_t singleDataReady(uint16_t data); /** * Multiple ADC conversion results are ready. If the ADC was configured * with the configureMultiple() command, then the return value * is ignored. If the ADC was configured with the * configureMultipleRepeat() command then the returned pointer * defines where to store the next numSamples * conversion results (the client must make sure that the buffer is big * enough!). Returning a null pointer means that the repeated conversion * mode will be stopped. * * @param buffer Conversion results (lower 12 bit are valid, respectively). * @param numSamples Number of samples stored in buffer * * @return * A null pointer stops a repeated conversion mode. Any non-zero value is * interpreted as the next buffer, which must have at least * numSamples entries. The return value is ignored if the ADC * was configured with configureMultiple(). */ async event uint16_t * COUNT_NOK(numSamples) multipleDataReady(uint16_t *COUNT(numSamples) buffer, uint16_t numSamples); } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430RefVoltArbiterImplP.nc000066400000000000000000000150671207233610700247120ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universität Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2007-04-05 13:42:36 $ * @author: Jan Hauer * ======================================================================== */ module Msp430RefVoltArbiterImplP { provides interface Resource as ClientResource[uint8_t client]; uses { interface Resource as AdcResource[uint8_t client]; interface SplitControl as RefVolt_1_5V; interface SplitControl as RefVolt_2_5V; interface AdcConfigure as Config[uint8_t client]; } } implementation { enum { NO_OWNER = 0xFF, }; norace uint8_t syncOwner = NO_OWNER; bool ref2_5v; task void switchOff(); async command error_t ClientResource.request[uint8_t client]() { return call AdcResource.request[client](); } async command error_t ClientResource.immediateRequest[uint8_t client]() { const msp430adc12_channel_config_t* settings = call Config.getConfiguration[client](); if (settings->sref == REFERENCE_VREFplus_AVss || settings->sref == REFERENCE_VREFplus_VREFnegterm) // always fails, because of the possible start-up delay (and async-sync transition) return FAIL; else { return call AdcResource.immediateRequest[client](); } } event void AdcResource.granted[uint8_t client]() { const msp430adc12_channel_config_t* settings = call Config.getConfiguration[client](); if (settings->sref == REFERENCE_VREFplus_AVss || settings->sref == REFERENCE_VREFplus_VREFnegterm){ error_t started; if (syncOwner != NO_OWNER){ // very rare case, which can only occur // if no FIFO task scheduler // is used (see comment below) call AdcResource.release[client](); call AdcResource.request[client](); return; } syncOwner = client; if (settings->ref2_5v == REFVOLT_LEVEL_1_5) { ref2_5v = FALSE; started = call RefVolt_1_5V.start(); } else { ref2_5v = TRUE; started = call RefVolt_2_5V.start(); } if (started != SUCCESS){ syncOwner = NO_OWNER; call AdcResource.release[client](); call AdcResource.request[client](); } } else signal ClientResource.granted[client](); } event void RefVolt_1_5V.startDone(error_t error) { if (syncOwner != NO_OWNER){ // assumption: a client which has called request() must // not call release() before it gets the granted() signal ClientResource.granted[syncOwner](); } } event void RefVolt_2_5V.startDone(error_t error) { if (syncOwner != NO_OWNER){ // assumption: a client which has called request() must // not call release() before it gets the granted() signal ClientResource.granted[syncOwner](); } } async command error_t ClientResource.release[uint8_t client]() { error_t error; if (syncOwner == client) post switchOff(); error = call AdcResource.release[client](); // If syncOwner == client then now there is an inconsistency between // the state of syncOwner and the actual owner of the Resource // (which is not owned by anyone, because it was just released). // The switchOff() task will resolve this incosistency, but a // client can call ClientResource.request() before this task is // posted. However, since Resource.granted is signalled in task context, // with a FIFO task scheduler we can be sure that switchOff() will // always be executed before the next Resource.granted event is // signalled. Unfortunately "TinyOS components MUST NOT assume a // FIFO policy" (TEP106), that's why there is some additional check // in AdcResource.granted above. return error; } task void switchOff() { error_t stopped; // update internal state if (syncOwner != NO_OWNER){ if (ref2_5v) stopped = call RefVolt_2_5V.stop(); else stopped = call RefVolt_1_5V.stop(); if (stopped == SUCCESS) syncOwner = NO_OWNER; else post switchOff(); } } event void RefVolt_1_5V.stopDone(error_t error) { } event void RefVolt_2_5V.stopDone(error_t error) { } async command bool ClientResource.isOwner[uint8_t client]() { return call AdcResource.isOwner[client](); } default event void ClientResource.granted[uint8_t client](){} default async command error_t AdcResource.request[uint8_t client]() { return FAIL; } default async command error_t AdcResource.immediateRequest[uint8_t client]() { return FAIL; } default async command bool AdcResource.isOwner[uint8_t client]() { return FALSE; } default async command error_t AdcResource.release[uint8_t client](){return FAIL;} const msp430adc12_channel_config_t defaultConfig = {INPUT_CHANNEL_NONE,0,0,0,0,0,0,0}; default async command const msp430adc12_channel_config_t* Config.getConfiguration[uint8_t client]() { return &defaultConfig; } } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430RefVoltArbiterP.nc000066400000000000000000000070741207233610700240670ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universität Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:07 $ * @author: Jan Hauer * ======================================================================== */ /** * This component is meant to intercept requests to the Resource * interface on their way to the adc arbiter. It checks whether the client's * adc configuration requires the internal reference voltage generator of the * MSP430 to be enabled during the conversion by inspecting the client's * configuration data (using the AdcConfigure interface). If so it * makes sure that Resource.granted() is held back until the reference voltage * is stable. Clients SHOULD NOT wire to Msp430RefVoltArbiterP but * to the Resource interface provided by * Msp430Adc12ClientAutoRVGC. * * @author Jan Hauer */ configuration Msp430RefVoltArbiterP { provides interface Resource as ClientResource[uint8_t client]; uses { interface Resource as AdcResource[uint8_t client]; interface AdcConfigure as Config[uint8_t client]; } } implementation { components Msp430RefVoltGeneratorP, Msp430RefVoltArbiterImplP, new TimerMilliC() as SwitchOnDelayTimer, new TimerMilliC() as SwitchOffDelayTimer, new TimerMilliC() as SwitchOffSettleTimer, HplAdc12P; ClientResource = Msp430RefVoltArbiterImplP.ClientResource; AdcResource = Msp430RefVoltArbiterImplP.AdcResource; Config = Msp430RefVoltArbiterImplP; Msp430RefVoltArbiterImplP.RefVolt_1_5V -> Msp430RefVoltGeneratorP.RefVolt_1_5V; Msp430RefVoltArbiterImplP.RefVolt_2_5V -> Msp430RefVoltGeneratorP.RefVolt_2_5V; Msp430RefVoltGeneratorP.SwitchOnTimer -> SwitchOnDelayTimer; Msp430RefVoltGeneratorP.SwitchOffTimer -> SwitchOffDelayTimer; Msp430RefVoltGeneratorP.SwitchOffSettleTimer -> SwitchOffSettleTimer; Msp430RefVoltGeneratorP.HplAdc12 -> HplAdc12P; } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430RefVoltGenerator.h000066400000000000000000000056511207233610700241330ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2007-03-14 18:14:06 $ * @author: Jan Hauer * ======================================================================== */ #ifndef REFVOLTGENERATOR_H #define REFVOLTGENERATOR_H // Time for generator to become stable (in ms) - don't change. #define MSP430_REFVOLT_STABILIZE_INTERVAL 17 // Delay before generator is actually switched off after it has been stopped // (in ms). This avoids having to wait another 17 ms in case the generator is // needed again shortly after it has been stopped. #ifndef MSP430_REFVOLT_SWITCHOFF_INTERVAL #define MSP430_REFVOLT_SWITCHOFF_INTERVAL 20 #endif // The two values below depend on the external capacitor CVREF+ (cf. msp430fxxx // datasheet). The values have been measured on the tinynode platform, which // applies the TI's reference design (platforms that don't follow this design // may want to update the values). // Time (in ms) for reference voltage to drop from 2.5v to 1.5v #ifndef MSP430_REFVOLT_SWITCH_2_5_TO_1_5_INTERVAL #define MSP430_REFVOLT_SWITCH_2_5_TO_1_5_INTERVAL 70 #endif // Time (in ms) for reference voltage to drop from 2.5v to 1.5v after being disabled #ifndef MSP430_REFVOLT_DROP_2_5_TO_1_5_INTERVAL #define MSP430_REFVOLT_DROP_2_5_TO_1_5_INTERVAL 2048 #endif #endif tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/Msp430RefVoltGeneratorP.nc000066400000000000000000000221121207233610700244130ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universität Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2010-03-11 09:42:25 $ * @author: Jan Hauer * ======================================================================== */ module Msp430RefVoltGeneratorP { provides { interface SplitControl as RefVolt_1_5V; interface SplitControl as RefVolt_2_5V; } uses { interface HplAdc12; interface Timer as SwitchOnTimer; interface Timer as SwitchOffTimer; interface Timer as SwitchOffSettleTimer; } } implementation { typedef enum { // DO NOT CHANGE ANY OF THE CONSTANTS BELOW! GENERATOR_OFF = 0, REFERENCE_1_5V_STABLE = 1, REFERENCE_2_5V_STABLE = 2, REFERENCE_1_5V_ON_PENDING = 3, REFERENCE_2_5V_ON_PENDING = 4, REFERENCE_1_5V_OFF_PENDING = 5, REFERENCE_2_5V_OFF_PENDING = 6, } state_t; state_t m_state; /***************** Prototypes ****************/ error_t switchOn(uint8_t level); error_t switchOff(); void signalStartDone(state_t state, error_t result); void signalStopDone(state_t state, error_t result); error_t start(state_t targetState); error_t stop(state_t nextState); /***************** SplitControl Commands ****************/ command error_t RefVolt_1_5V.start() { return start(REFERENCE_1_5V_STABLE); } command error_t RefVolt_2_5V.start() { return start(REFERENCE_2_5V_STABLE); } command error_t RefVolt_1_5V.stop() { return stop(REFERENCE_1_5V_OFF_PENDING); } command error_t RefVolt_2_5V.stop() { return stop(REFERENCE_2_5V_OFF_PENDING); } error_t start(state_t targetState){ error_t result; if (m_state == REFERENCE_1_5V_STABLE || m_state == REFERENCE_2_5V_STABLE) { if (targetState == m_state) { result = EALREADY; } else if ((result = switchOn(targetState)) == SUCCESS) { if (m_state==REFERENCE_1_5V_STABLE) { // targetState==REFERENCE_2_5V_STABLE m_state = REFERENCE_2_5V_ON_PENDING; call SwitchOnTimer.startOneShot(MSP430_REFVOLT_STABILIZE_INTERVAL); } else { m_state = REFERENCE_1_5V_ON_PENDING; call SwitchOnTimer.startOneShot(MSP430_REFVOLT_SWITCH_2_5_TO_1_5_INTERVAL); } } } else if (m_state == GENERATOR_OFF) { if ((result = switchOn(targetState)) == SUCCESS) { if (targetState==REFERENCE_1_5V_STABLE && call SwitchOffSettleTimer.isRunning()) { call SwitchOnTimer.startOneShot(MSP430_REFVOLT_SWITCH_2_5_TO_1_5_INTERVAL); } else call SwitchOnTimer.startOneShot(MSP430_REFVOLT_STABILIZE_INTERVAL); call SwitchOffSettleTimer.stop(); m_state = targetState + 2; // +2 turns "XXX_STABLE" state into a "XXX_ON_PENDING" state } } else if (m_state == REFERENCE_1_5V_OFF_PENDING || m_state == REFERENCE_2_5V_OFF_PENDING) { if ((result = switchOn(targetState)) == SUCCESS) { // there is a pending stop() call state_t oldState = m_state; call SwitchOffTimer.stop(); signalStopDone(oldState, FAIL); if (targetState==m_state-4) { m_state=targetState; signalStartDone(targetState, SUCCESS); } else if (m_state==REFERENCE_1_5V_OFF_PENDING) { m_state = REFERENCE_2_5V_ON_PENDING; call SwitchOnTimer.startOneShot(MSP430_REFVOLT_STABILIZE_INTERVAL); } else { m_state = REFERENCE_1_5V_ON_PENDING; call SwitchOnTimer.startOneShot(MSP430_REFVOLT_SWITCH_2_5_TO_1_5_INTERVAL); } } } else if (m_state == targetState + 2) // starting already? result = SUCCESS; else result = EBUSY; return result; } error_t stop(state_t nextState){ error_t result; if (m_state == GENERATOR_OFF) result = EALREADY; else if (m_state == REFERENCE_1_5V_STABLE || m_state == REFERENCE_2_5V_STABLE) { result = SUCCESS; m_state = nextState; // m_state becomes a "XXX_OFF_PENDING" state call SwitchOffTimer.startOneShot(MSP430_REFVOLT_SWITCHOFF_INTERVAL); } else if (m_state == REFERENCE_1_5V_ON_PENDING || m_state == REFERENCE_2_5V_ON_PENDING) { if ((result = switchOff()) == SUCCESS) { // there is a pending start() call state_t oldState = m_state; call SwitchOnTimer.stop(); m_state = GENERATOR_OFF; signalStartDone(oldState, FAIL); signalStopDone(nextState, SUCCESS); } } else if (m_state == nextState) // stopping already? result = SUCCESS; else result = EBUSY; return result; } void signalStartDone(state_t state, error_t result){ if (state == REFERENCE_1_5V_STABLE || state == REFERENCE_1_5V_ON_PENDING) signal RefVolt_1_5V.startDone(result); else signal RefVolt_2_5V.startDone(result); } void signalStopDone(state_t state, error_t result){ if (state == REFERENCE_1_5V_STABLE || state == REFERENCE_1_5V_OFF_PENDING) signal RefVolt_1_5V.stopDone(result); else signal RefVolt_2_5V.stopDone(result); } /***************** Timer Events ******************/ event void SwitchOnTimer.fired() { switch (m_state) { case REFERENCE_1_5V_ON_PENDING: m_state = REFERENCE_1_5V_STABLE; signal RefVolt_1_5V.startDone(SUCCESS); break; case REFERENCE_2_5V_ON_PENDING: m_state = REFERENCE_2_5V_STABLE; signal RefVolt_2_5V.startDone(SUCCESS); break; default: return; } } event void SwitchOffTimer.fired() { switch (m_state) { case REFERENCE_1_5V_OFF_PENDING: if (switchOff() == SUCCESS){ m_state = GENERATOR_OFF; signal RefVolt_1_5V.stopDone(SUCCESS); } else { call SwitchOffTimer.startOneShot(MSP430_REFVOLT_SWITCHOFF_INTERVAL); } break; case REFERENCE_2_5V_OFF_PENDING: if (switchOff() == SUCCESS) { m_state = GENERATOR_OFF; signal RefVolt_2_5V.stopDone(SUCCESS); call SwitchOffSettleTimer.startOneShot(MSP430_REFVOLT_DROP_2_5_TO_1_5_INTERVAL); } else { call SwitchOffTimer.startOneShot(MSP430_REFVOLT_SWITCHOFF_INTERVAL); } break; default: break; } } event void SwitchOffSettleTimer.fired() {} /**************** HplAdc12 Events ***************/ async event void HplAdc12.conversionDone(uint16_t iv) { } /**************** Functions ****************/ error_t switchOn(uint8_t level) { atomic { if (call HplAdc12.isBusy()) { return EBUSY; } else { adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); ctl0.enc = 0; call HplAdc12.setCtl0(ctl0); ctl0.refon = 1; // This is why we don't change the enum at the top ctl0.r2_5v = level - 1; call HplAdc12.setCtl0(ctl0); return SUCCESS; } } } error_t switchOff() { atomic { if (call HplAdc12.isBusy()) { return EBUSY; } else { adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); ctl0.enc = 0; call HplAdc12.setCtl0(ctl0); ctl0.refon = 0; call HplAdc12.setCtl0(ctl0); return SUCCESS; } } } /***************** Defaults ****************/ default event void RefVolt_1_5V.startDone(error_t error){} default event void RefVolt_2_5V.startDone(error_t error){} default event void RefVolt_1_5V.stopDone(error_t error){} default event void RefVolt_2_5V.stopDone(error_t error){} } tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/README.txt000066400000000000000000000210061207233610700213110ustar00rootroot00000000000000The implementation of the 12-bit ADC stack on the MSP430 is in compliance with TEP 101 (tinyos-2.x/doc/txt/tep101.txt) and provides virtualized access to the ADC12 by seven different components: AdcReadClientC, AdcReadNowClientC, AdcReadStreamClientC, Msp430Adc12ClientC, Msp430Adc12ClientAutoDMAC, Msp430Adc12ClientAutoRVGC and Msp430Adc12ClientAutoDMA_RVGC. A client component may wire to any of these components and it SHOULD NOT wire to any other components in 'tinyos-2.x/tos/chips/msp430/adc12'. This document explains the difference between the seven components. 1. HIL ==================================================================== A platform-independent application (an application like 'Oscilloscope' that is supposed to run on, for example, the 'telosb' and 'micaz' platform at the same time) cannot wire to an MSP430-specific interface like Msp430Adc12SingleChannel (there is no MSP430 on micaz). Instead such an application may access the MSP430 ADC through any of the three following components: * AdcReadClientC: to read single ADC values * AdcReadNowClientC: to read single ADC values asynchronously (fast) * AdcReadStreamClientC: to read multiple ADC values These components are less efficient than the MSP430-specific ADC components (described below), but they provide standard TinyOS interfaces for reading ADC values. Thus, if a client component does not care so much about efficiency but rather about portability it should wire to any of these components. 2. HAL ==================================================================== An application that is written for an MSP430-based platform like 'eyesIFX' or 'telosb' can access the ADC12 in a more efficient way via two interfaces: (1) the Msp430Adc12SingleChannel allows to perform one or more ADC conversions on a single channel with a specified sampling frequency and (2) the Msp430Adc12MultiChannel allows to sample a group of up to 16 different ADC channels. On the MSP430 two additional hardware modules may play a role when the ADC12 is used: the internal reference voltage generator and the DMA controller. The voltage generator outputs stabilized voltage of 1.5 V or 2.5 V, which may be used as reference voltage in the conversion process. Whether the internal reference voltage generator should be enabled during the conversion is platform-specific (e.g. the light sensor on the 'eyesIFX' requires a stable reference voltage). When an application requires a stable reference voltage during the sampling process it should wire to the Msp430Adc12ClientAutoRVGC component. This assures that when the app is signalled the Resource.granted() event the reference voltage generator outputs a stable voltage (the level is defined in the configuration data supplied by the application). There are two more things to note: first, the generator is not switched off immediately, when the client calls Resource.release(), but only after some pre-defined interval (see Msp430RefVoltGenerator.h). This can avoid a power-up delay when multiple clients are present. Second, one must not forget to wire the AdcConfigure interface to the Msp430Adc12ClientAutoRVGC or Msp430Adc12ClientAutoDMA_RVGC component in addition to configuring the ADC through the Msp430Adc12SingleChannel interface (a nesC warning will be signalled). The DMA controller can be used to copy conversion data from the ADC registers to the application buffer. DMA is only present on MSP430x15x and MSP430x16x devices. When an application wants to use the DMA it can wire to the Msp430Adc12ClientAutoDMAC component and then conversion results are transferred using DMA. Both, enabling the reference generator and using the DMA, therefore happens transparent to the app. There are four possible combinations reflected by the following components that an MSP430-based application may wire to: * Msp430Adc12ClientC: no DMA, no automatic reference voltage * Msp430Adc12ClientAutoRVGC: automatic reference voltage, but no DMA * Msp430Adc12ClientAutoDMAC: DMA, but no automatic reference voltage * Msp430Adc12ClientAutoDMA_RVGC: DMA and automatic reference voltage Currently Msp430Adc12MultiChannel is only provided by the first two components. I/O PINs -------------------------------------------------------------------- During a conversion the respective ADC port pin (ports 6.0 - 6.7) must be configured such that the peripheral module function is selected and the port pin is switched to input direction. By default, for every client this is done **automatically** in the ADC stack (Msp430Adc12ImplP), i.e. just before the conversion starts the respective pin is switched to peripheral module function and input direction and immediately after the conversion has finished it is switched to I/O function mode. To disable this feature please comment out the "ADC12_P6PIN_AUTO_CONFIGURE" macro in Msp430Adc12.h. Configuration for single channel conversions -------------------------------------------------------------------- The msp430adc12_channel_config_t struct holds all information needed to configure the ADC12 for single channel conversions. The flags come from the following MSP430 registers: ADC12CTL0, ADC12CTL1, ADC12MCTLx and TACTL and are named according to the "MSP430x1xx Family User's Guide". Their meaning is as follows: .inch: ADC12 input channel (ADC12MCTLx register). An (external) input channel maps to one of msp430's A0-A7 pins (see device specific data sheet). .sref: reference voltage (ADC12MCTLx register). If REFERENCE_VREFplus_AVss or REFERENCE_VREFplus_VREFnegterm is chosen AND the client wires to the Msp430Adc12ClientAutoRVGC or Msp430Adc12ClientAutoDMA_RVGC component then the reference voltage generator has automatically been enabled to the voltage level defined by the "ref2_5v" flag (see below) when the Resource.granted() event is signalled to the client. Otherwise this flag is ignored. .ref2_5v: Reference generator voltage level (ADC12CTL0 register). See "sref". .adc12ssel: ADC12 clock source select for the sample-hold-time (ADC12CTL1 register). In combination the "adc12ssel", "adc12div" and "sht" define the sample-hold-time: "adc12ssel" defines the clock source, "adc12div" defines the ADC12 clock divider and "sht" define the time expressed in jiffies. (the sample-hold-time depends on the resistence of the attached sensor, and is calculated using to the formula in section 17.2.4 of the user guide) .adc12div: ADC12 clock divider (ADC12CTL1 register). See "adc12ssel". .sht: Sample-and-hold time (ADC12CTL1 register). See "adc12ssel". .sampcon_ssel: Clock source for the sampling period (TASSEL for TimerA). When an ADC client specifies a non-zero "jiffies" parameter (using the Msp430Adc12SingleChannel.configureX commands), the ADC implementation will automatically configure TimerA to be sourced from "sampcon_ssel" with an input divider of "sampcon_id". During the sampling process TimerA will be used to trigger a single (Msp430Adc12SingleChannel interface) or a sequence of (Msp430Adc12MultiChannel interface) conversions every "jiffies" clock ticks. .sampcon_id: Input divider for "sampcon_ssel" (IDx in TACTL register, TimerA). See "sampcon_ssel". Example: Assuming that SMCLK runs at 1 (binary) MHz the following code snippet performs 2048 ADC conversions on channel A2 with a sampling frequency of 4096 Hz. The sampling period is defined by the combination of SAMPCON_SOURCE_SMCLK, SAMPCON_CLOCK_DIV_1 and a "jiffies" parameter of (2^20 / 4096) = (1048576 / 4096) = = 256 jiffies. #define NUM_SAMPLES 2048 uint16_t buffer[NUM_SAMPLES]; const msp430adc12_channel_config_t config = { INPUT_CHANNEL_A2, REFERENCE_VREFplus_AVss, REFVOLT_LEVEL_NONE, SHT_SOURCE_SMCLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_64_CYCLES, SAMPCON_SOURCE_SMCLK, SAMPCON_CLOCK_DIV_1 }; event void Boot.booted() { call Resource.request(); } event void Resource.granted() { error_t result; result = call SingleChannel.configureMultiple(&config, buffer, NUM_SAMPLES, 256); if (result == SUCCESS) call SingleChannel.getData(); } async event uint16_t* SingleChannel.multipleDataReady(uint16_t *buf, uint16_t length) { // buffer contains conversion results } 3. Implementation ==================================================================== The ADC12 stack is located at tinyos-2.x/tos/chips/msp430/adc12. Sensor wrappers for the msp430 internal sensors are in tinyos-2.x/tos/chips/msp430/sensors, an HAL test app can be found in tinyos-2.x/apps/tests/msp430/Adc12. ----- $Date: 2008/04/07 09:41:55 $ @author: Jan Hauer tinyos-2.1.2+dfsg/tos/chips/msp430/adc12/WireAdcStreamP.nc000066400000000000000000000023651207233610700227560ustar00rootroot00000000000000/* $Id: WireAdcStreamP.nc,v 1.1 2008-04-07 09:41:55 janhauer Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Support component for AdcReadStreamClientC. * * @author David Gay * @author Jan Hauer */ #include "Msp430Adc12.h" configuration WireAdcStreamP { provides interface ReadStream[uint8_t client]; uses { interface AdcConfigure[uint8_t client]; interface Msp430Adc12SingleChannel[uint8_t client]; interface Resource[uint8_t client]; } } implementation { components AdcStreamP, MainC, new AlarmMilli32C() as Alarm, new ArbitratedReadStreamC(uniqueCount(ADCC_READ_STREAM_SERVICE), uint16_t) as ArbitrateReadStream; ReadStream = ArbitrateReadStream; AdcConfigure = AdcStreamP; Resource = ArbitrateReadStream; ArbitrateReadStream.Service -> AdcStreamP; AdcStreamP.Init <- MainC; Msp430Adc12SingleChannel = AdcStreamP.SingleChannel; AdcStreamP.Alarm -> Alarm; } tinyos-2.1.2+dfsg/tos/chips/msp430/dma/000077500000000000000000000000001207233610700174635ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/msp430/dma/HplMsp430DmaC.nc000066400000000000000000000051721207233610700221710ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Ben Greenstein * @author Jonathan Hui * @version $Revision: 1.7 $ $Date: 2010-06-29 22:07:45 $ */ configuration HplMsp430DmaC { provides interface HplMsp430DmaControl as Control; provides interface HplMsp430DmaChannel as Channel0; provides interface HplMsp430DmaChannel as Channel1; provides interface HplMsp430DmaChannel as Channel2; } implementation { components HplMsp430DmaP; components new HplMsp430DmaXP( DMA0CTL_, DMA0SA_, DMA0DA_, DMA0SZ_, DMA0TSEL_MASK, DMA0TSEL_SHIFT ) as Dma0; components new HplMsp430DmaXP( DMA1CTL_, DMA1SA_, DMA1DA_, DMA1SZ_, DMA1TSEL_MASK, DMA1TSEL_SHIFT ) as Dma1; components new HplMsp430DmaXP( DMA2CTL_, DMA2SA_, DMA2DA_, DMA2SZ_, DMA2TSEL_MASK, DMA2TSEL_SHIFT ) as Dma2; Control = HplMsp430DmaP; Channel0 = Dma0; Channel1 = Dma1; Channel2 = Dma2; Dma0.Interrupt -> HplMsp430DmaP; Dma1.Interrupt -> HplMsp430DmaP; Dma2.Interrupt -> HplMsp430DmaP; } tinyos-2.1.2+dfsg/tos/chips/msp430/dma/HplMsp430DmaChannel.nc000066400000000000000000000066601207233610700233620ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Ben Greenstein * @version $Revision: 1.5 $ $Date: 2010-06-29 22:07:45 $ */ interface HplMsp430DmaChannel { async command error_t setTrigger(dma_trigger_t trigger); async command void clearTrigger(); async command void setSingleMode(); async command void setBlockMode(); async command void setBurstMode(); async command void setRepeatedSingleMode(); async command void setRepeatedBlockMode(); async command void setRepeatedBurstMode(); async command void setSrcNoIncrement(); async command void setSrcDecrement(); async command void setSrcIncrement(); async command void setDstNoIncrement(); async command void setDstDecrement(); async command void setDstIncrement(); async command void setWordToWord(); async command void setByteToWord(); async command void setWordToByte(); async command void setByteToByte(); async command void setEdgeSensitive(); async command void setLevelSensitive(); async command void enableDMA(); async command void disableDMA(); async command void enableInterrupt() ; async command void disableInterrupt() ; async command bool interruptPending(); async command bool aborted(); async command void triggerDMA(); async command void setSrc(void *saddr); async command void setDst(void *daddr); async command void setSize(uint16_t sz); async command void setState(dma_channel_state_t s, dma_channel_trigger_t t, void* src, void* dest, uint16_t size); async command void setStateRaw(uint16_t state, uint16_t trigger, void* src, void* dest, uint16_t size); async command dma_channel_state_t getState(); async command void* getSource(); async command void* getDestination(); async command uint16_t getSize(); async command dma_channel_trigger_t getTrigger(); async command void reset(); async event void transferDone(error_t success); } tinyos-2.1.2+dfsg/tos/chips/msp430/dma/HplMsp430DmaControl.nc000066400000000000000000000041151207233610700234230ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Ben Greenstein * @version $Revision: 1.5 $ $Date: 2010-06-29 22:07:45 $ */ #include "Msp430Dma.h" interface HplMsp430DmaControl { async command void setOnFetch(); async command void clearOnFetch(); async command void setRoundRobin(); async command void clearRoundRobin(); async command void setENNMI(); async command void clearENNMI(); async command void setState(dma_state_t s); async command dma_state_t getState(); async command void reset(); } tinyos-2.1.2+dfsg/tos/chips/msp430/dma/HplMsp430DmaInterrupt.nc000066400000000000000000000034041207233610700237770ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Ben Greenstein * @version $Revision: 1.5 $ $Date: 2010-06-29 22:07:45 $ */ interface HplMsp430DmaInterrupt { async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/msp430/dma/HplMsp430DmaP.nc000066400000000000000000000062131207233610700222030ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Ben Greenstein * @author Jonathan Hui * @author Joe Polastre * @version $Revision: 1.8 $ $Date: 2010-06-29 22:07:45 $ */ module HplMsp430DmaP { provides interface HplMsp430DmaControl as DmaControl; provides interface HplMsp430DmaInterrupt as Interrupt; } implementation { MSP430REG_NORACE( DMACTL0 ); MSP430REG_NORACE( DMACTL1 ); // X1 family share the same interrupt vector with DAC, X2 family has its own #if defined(DACDMA_VECTOR) #define XX_DMA_VECTOR_XX DACDMA_VECTOR #elif defined(DMA_VECTOR) #define XX_DMA_VECTOR_XX DMA_VECTOR #else #error "DMA VECTOR not defined for cpu selected" #endif TOSH_SIGNAL( XX_DMA_VECTOR_XX ) { signal Interrupt.fired(); } async command void DmaControl.setOnFetch(){ DMACTL1 |= DMAONFETCH; } async command void DmaControl.clearOnFetch(){ DMACTL1 &= ~DMAONFETCH; } async command void DmaControl.setRoundRobin(){ DMACTL1 |= ROUNDROBIN; } async command void DmaControl.clearRoundRobin(){ DMACTL1 &= ~ROUNDROBIN; } async command void DmaControl.setENNMI(){ DMACTL1 |= ENNMI; } async command void DmaControl.clearENNMI(){ DMACTL1 &= ~ENNMI; } async command void DmaControl.setState(dma_state_t s){ DMACTL1 = *(int*)&s; } async command dma_state_t DmaControl.getState(){ dma_state_t s; s = *(dma_state_t*)&DMACTL1; return s; } async command void DmaControl.reset(){ DMACTL0 = 0; DMACTL1 = 0; } } tinyos-2.1.2+dfsg/tos/chips/msp430/dma/HplMsp430DmaXP.nc000066400000000000000000000160631207233610700223370ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Ben Greenstein * @author Jonathan Hui * @author Joe Polastre * @author Mark Hays * @version $Revision: 1.7 $ $Date: 2010-06-29 22:07:45 $ */ generic module HplMsp430DmaXP( uint16_t DMAxCTL_addr, uint16_t DMAxSA_addr, uint16_t DMAxDA_addr, uint16_t DMAxSZ_addr, uint16_t DMAxTSEL_mask, uint16_t DMAxTSEL_shift ) @safe() { provides interface HplMsp430DmaChannel as DMA; uses interface HplMsp430DmaInterrupt as Interrupt; } implementation { MSP430REG_NORACE( DMACTL0 ); #define DMAxCTL (*(volatile TYPE_DMA0CTL*)DMAxCTL_addr) #define DMAxSA (*(volatile TYPE_DMA0SA*)DMAxSA_addr) #define DMAxDA (*(volatile TYPE_DMA0DA*)DMAxDA_addr) #define DMAxSZ (*(volatile TYPE_DMA0SZ*)DMAxSZ_addr) async event void Interrupt.fired() { error_t error = ( DMAxCTL & DMAABORT ) ? FAIL : SUCCESS; if ( DMAxCTL & DMAIFG ) { DMAxCTL &= ~DMAIFG; DMAxCTL &= ~DMAABORT; signal DMA.transferDone( error ); } } async error_t command DMA.setTrigger( dma_trigger_t trigger ) { if ( DMAxCTL & DMAEN ) return FAIL; DMACTL0 = ( ( DMACTL0 & ~DMAxTSEL_mask ) | ( ( trigger << DMAxTSEL_shift ) & DMAxTSEL_mask ) ); return SUCCESS; } async command void DMA.clearTrigger() { DMACTL0 &= ~DMAxTSEL_mask; } async command void DMA.setSingleMode() { DMAxCTL &= ~( DMADT0 | DMADT1 | DMADT2 ); DMAxCTL |= DMA_SINGLE_TRANSFER; } async command void DMA.setBlockMode() { DMAxCTL &= ~( DMADT0 | DMADT1 | DMADT2 ); DMAxCTL |= DMA_BLOCK_TRANSFER; } async command void DMA.setBurstMode() { DMAxCTL &= ~( DMADT0 | DMADT1 | DMADT2 ); DMAxCTL |= DMA_BURST_BLOCK_TRANSFER; } async command void DMA.setRepeatedSingleMode() { DMAxCTL &= ~( DMADT0 | DMADT1 | DMADT2 ); DMAxCTL |= DMA_REPEATED_SINGLE_TRANSFER; } async command void DMA.setRepeatedBlockMode() { DMAxCTL &= ~( DMADT0 | DMADT1 | DMADT2 ); DMAxCTL |= DMA_REPEATED_BLOCK_TRANSFER; } async command void DMA.setRepeatedBurstMode() { DMAxCTL &= ~( DMADT0 | DMADT1 | DMADT2 ); DMAxCTL |= DMA_REPEATED_BURST_BLOCK_TRANSFER; } async command void DMA.setSrcNoIncrement() { DMAxCTL &= ~( DMASRCINCR0 | DMASRCINCR1 ); DMAxCTL |= DMA_ADDRESS_UNCHANGED; } async command void DMA.setSrcDecrement() { DMAxCTL &= ~( DMASRCINCR0 | DMASRCINCR1 ); DMAxCTL |= DMA_ADDRESS_DECREMENTED; } async command void DMA.setSrcIncrement() { DMAxCTL &= ~( DMASRCINCR0 | DMASRCINCR1 ); DMAxCTL |= DMA_ADDRESS_INCREMENTED; } async command void DMA.setDstNoIncrement() { DMAxCTL &= ~( DMADSTINCR0 | DMADSTINCR1 ); DMAxCTL |= DMA_ADDRESS_UNCHANGED; } async command void DMA.setDstDecrement() { DMAxCTL &= ~( DMADSTINCR0 | DMADSTINCR1 ); DMAxCTL |= DMA_ADDRESS_DECREMENTED; } async command void DMA.setDstIncrement() { DMAxCTL &= ~( DMADSTINCR0 | DMADSTINCR1 ); DMAxCTL |= DMA_ADDRESS_INCREMENTED; } async command void DMA.setWordToWord() { DMAxCTL &= ~(DMASRCBYTE | DMADSTBYTE); DMAxCTL |= DMASWDW; } async command void DMA.setByteToWord() { DMAxCTL &= ~(DMASRCBYTE | DMADSTBYTE); DMAxCTL |= DMASBDW; } async command void DMA.setWordToByte() { DMAxCTL &= ~(DMASRCBYTE | DMADSTBYTE); DMAxCTL |= DMASWDB; } async command void DMA.setByteToByte() { DMAxCTL &= ~(DMASRCBYTE | DMADSTBYTE); DMAxCTL |= DMASBDB; } async command void DMA.setEdgeSensitive() { DMAxCTL &= ~DMALEVEL; } async command void DMA.setLevelSensitive() { DMAxCTL |= DMALEVEL; } async command void DMA.enableDMA() { DMAxCTL |= DMAEN; } async command void DMA.disableDMA() { DMAxCTL &= ~DMAEN; } async command void DMA.enableInterrupt() { DMAxCTL |= DMAIE; } async command void DMA.disableInterrupt() { DMAxCTL &= ~DMAIE; } async command bool DMA.interruptPending() { return !!( DMAxCTL & DMAIFG ); } async command bool DMA.aborted() { return !!( DMAxCTL & DMAABORT ); } async command void DMA.triggerDMA() { DMAxCTL |= DMAREQ; } async command void DMA.setSrc( void *saddr ) { DMAxSA = (uint16_t)saddr; } async command void DMA.setDst( void *daddr ) { DMAxDA = (uint16_t)daddr; } async command void DMA.setSize( uint16_t sz ) { DMAxSZ = sz; } async command void DMA.setState( dma_channel_state_t s, dma_channel_trigger_t t, void* src, void* dest, uint16_t size ) { call DMA.setStateRaw( *(uint16_t*)&s, *(uint16_t*)&t, src, dest, size); } async command void DMA.setStateRaw( uint16_t s, uint16_t t, void* src, void* dest, uint16_t size ) { DMAxSA = (uint16_t)src; DMAxDA = (uint16_t)dest; DMAxSZ = size; call DMA.setTrigger((dma_trigger_t) t); DMAxCTL = s; } async command dma_channel_state_t DMA.getState() { dma_channel_state_t s = *(dma_channel_state_t*) &DMAxCTL; return s; } async command void* DMA.getSource() { return (void*)DMAxSA; } async command void* DMA.getDestination() { return (void*)DMAxDA; } async command uint16_t DMA.getSize() { return DMAxSZ; } async command dma_channel_trigger_t DMA.getTrigger() { dma_channel_trigger_t t; t.trigger = ( DMACTL0 & DMAxTSEL_mask ) >> DMAxTSEL_shift; return t; } async command void DMA.reset() { DMAxCTL = 0; DMAxSA = 0; DMAxDA = 0; DMAxSZ = 0; } } tinyos-2.1.2+dfsg/tos/chips/msp430/dma/Msp430Dma.h000066400000000000000000000131421207233610700212450ustar00rootroot00000000000000/** * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the COPYRIGHT HOLDERS nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDERS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Ben Greenstein * @author Jonathan Hui * @author Mark Hays * @author Xavier Orduna * $Revision: 1.6 $ $Date: 2010-06-29 22:07:45 $ */ #ifndef MSP430DMA_H #define MSP430DMA_H // General stuff enum { DMA_CHANNELS = 3 }; enum { DMA_CHANNEL0 = 0, DMA_CHANNEL1 = 1, DMA_CHANNEL2 = 2, DMA_CHANNEL_UNKNOWN = 3 }; enum { DMA_CHANNEL_AVAILABLE = 0, DMA_CHANNEL_IN_USE = 1 }; //////////////////////////////////////// // Per-channel fields in DMACTL0 enum { DMA0TSEL_SHIFT = 0, DMA1TSEL_SHIFT = 4, DMA2TSEL_SHIFT = 8, DMATSEL_MASK = (uint16_t)0xf, DMA0TSEL_MASK = ( 0xf ), DMA1TSEL_MASK = ( 0xf0 ), DMA2TSEL_MASK = ( 0xf00 ), }; // Per-field (channel) in DMACTL0 typedef enum { DMA_TRIGGER_DMAREQ = 0x0, // software trigger DMA_TRIGGER_TACCR2 = 0x1, DMA_TRIGGER_TBCCR2 = 0x2, #if defined(__msp430x261x) DMA_TRIGGER_UCA0RXIFG = 0x3, // RX on USCIA0 (UART/SPI) DMA_TRIGGER_UCA0TXIFG = 0x4, // TX on USCIA0 (UART/SPI) #else DMA_TRIGGER_URXIFG0 = 0x3, // RX on USART0 (UART/SPI) DMA_TRIGGER_UTXIFG0 = 0x4, // TX on USART0 (UART/SPI) #endif DMA_TRIGGER_DAC12IFG = 0x5, // DAC12_0CTL DAC12IFG bit DMA_TRIGGER_ADC12IFGx = 0x6, DMA_TRIGGER_TACCR0 = 0x7, // CCIFG bit DMA_TRIGGER_TBCCR0 = 0x8, // CCIFG bit #if defined(__msp430x261x) DMA_TRIGGER_UCB0RXIFG = 0x9, // RX on USCIB0 (UART/SPI) DMA_TRIGGER_UCB0TXIFG = 0xa, // TX on USCIB0 (UART/SPI) #else DMA_TRIGGER_URXIFG1 = 0x9, // RX on USART1 (UART/SPI) DMA_TRIGGER_UTXIFG1 = 0xa, // TX on USART1 (UART/SPI) #endif DMA_TRIGGER_MULT = 0xb, // Hardware Multiplier Ready DMA_TRIGGER_DMAxIFG = 0xe, // DMA0IFG triggers DMA channel 1 // DMA1IFG triggers DMA channel 2 // DMA2IFG triggers DMA channel 0 DMA_TRIGGER_DMAE0 = 0xf // External Trigger DMAE0 } dma_trigger_t; typedef struct dma_channel_trigger_s { unsigned int trigger : 4; unsigned int reserved : 12; } __attribute__ ((packed)) dma_channel_trigger_t; //////////////////////////////////////// // Bits in DMACTL1 enum { DISABLE_NMI = 0, ENABLE_NMI = 1, }; enum { NOT_ROUND_ROBIN = 0, ROUND_ROBIN = 1, }; enum { NOT_ON_FETCH = 0, ON_FETCH = 1, }; typedef struct dma_state_s { unsigned int enableNMI : 1; unsigned int roundRobin : 1; unsigned int onFetch : 1; unsigned int reserved : 13; } __attribute__ ((packed)) dma_state_t; //////////////////////////////////////// // Stuff in DMAxCTL // DMADTx enum { DMADT_SHIFT = 12, DMADT_MASK = 0x7, }; typedef enum { DMA_SINGLE_TRANSFER = 0x0, DMA_BLOCK_TRANSFER = 0x1, DMA_BURST_BLOCK_TRANSFER = 0x2, DMA_REPEATED_SINGLE_TRANSFER = 0x4, DMA_REPEATED_BLOCK_TRANSFER = 0x5, DMA_REPEATED_BURST_BLOCK_TRANSFER = 0x7 } dma_transfer_mode_t; // DMA{SRC,DST}INCRx enum { DMASRCINCR_SHIFT = 8, DMADSTINCR_SHIFT = 10, DMAINCR_MASK = 0x3, }; typedef enum { DMA_ADDRESS_UNCHANGED = 0x0, DMA_ADDRESS_DECREMENTED = 0x2, DMA_ADDRESS_INCREMENTED = 0x3 } dma_incr_t; typedef enum { DMA_WORD = 0x0, DMA_BYTE = 0x1 } dma_byte_t; // DMALEVEL typedef enum { DMA_EDGE_SENSITIVE = 0x0, DMA_LEVEL_SENSITIVE = 0x1 } dma_level_t; typedef struct dma_channel_state_s { unsigned int request : 1; unsigned int abort : 1; unsigned int interruptEnable : 1; unsigned int interruptFlag : 1; unsigned int enable : 1; unsigned int level : 1; /* or edge- triggered */ unsigned int srcByte : 1; /* or word */ unsigned int dstByte : 1; unsigned int srcIncrement : 2; /* or no-increment, decrement */ unsigned int dstIncrement : 2; unsigned int transferMode : 3; unsigned int reserved2 : 1; } __attribute__ ((packed)) dma_channel_state_t; #endif tinyos-2.1.2+dfsg/tos/chips/msp430/dma/Msp430DmaC.nc000066400000000000000000000060131207233610700215200ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the HAL level component for the MSP430 DMA module. * This configuration provides the available DMA channels through the * MSP430DMA parameterized interface. If more channels are requested * than available through unique("DMA"), there will be no mapping for * that channel and compilation will fail. * * @author Ben Greenstein * @author Jonathan Hui * @author Joe Polastre * @version $Revision: 1.5 $ $Date: 2010-06-29 22:07:45 $ */ configuration Msp430DmaC { provides interface Msp430DmaControl as Control; provides interface Msp430DmaChannel as Channel0; provides interface Msp430DmaChannel as Channel1; provides interface Msp430DmaChannel as Channel2; } implementation { components HplMsp430DmaC as HplDmaC; components new Msp430DmaChannelP() as Channel0P; Channel0 = Channel0P; Channel0P.HplChannel -> HplDmaC.Channel0; components new Msp430DmaChannelP() as Channel1P; Channel1 = Channel1P; Channel1P.HplChannel -> HplDmaC.Channel1; components new Msp430DmaChannelP() as Channel2P; Channel2 = Channel2P; Channel2P.HplChannel -> HplDmaC.Channel2; components Msp430DmaControlP as ControlP; Control = ControlP; ControlP.HplControl -> HplDmaC; ControlP.HplChannel0 -> HplDmaC.Channel0; ControlP.HplChannel1 -> HplDmaC.Channel1; ControlP.HplChannel2 -> HplDmaC.Channel2; } tinyos-2.1.2+dfsg/tos/chips/msp430/dma/Msp430DmaChannel.nc000066400000000000000000000076361207233610700227220ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Ben Greenstein * @author Joe Polastre * @version $Revision: 1.5 $ $Date: 2010-06-29 22:07:45 $ */ #include "Msp430Dma.h" interface Msp430DmaChannel { /** * Setup a transfer using explicit argument (most robust and simple * mechanism and recommended for novice users) * * See MSP430DMA.h for parameter options */ async command error_t setupTransfer( dma_transfer_mode_t transfer_mode, dma_trigger_t trigger, dma_level_t level, void *src_addr, void *dst_addr, uint16_t size, dma_byte_t src_byte, dma_byte_t dst_byte, dma_incr_t src_incr, dma_incr_t dst_incr ); /** * Raw interface for setting up a DMA transfer. This function is * intended to provide as much raw performance as possible but * sacrifices type checking in the process. Recommended ONLY for * advanced users that have very intricate knowledge of the MSP430 * DMA module described in the user's guide. * * @param state The control register value, as specified by * dma_control_state_t in MSP430DMA.h * @param trigger The trigger for the DMA transfer. Should be one * of the options from dma_trigger_t in MSP430DMA.h * @param src Pointer to the source address * @param dest Pointer to the destination address * @param size Size of the DMA transfer * * See MSP430DMA.h for parameter options */ async command void setupTransferRaw( uint16_t state, uint16_t trigger, void* src, void* dest, int size ); /** * Enable the DMA module. Equivalent to setting the DMA enable bit. * This function does not force a transfer. */ async command error_t startTransfer(); /** * Repeat a DMA transfer using previous settings but new pointers * and transfer size. Automatically starts the transfer (sets the * enable bit). */ async command error_t repeatTransfer( void *src_addr, void *dst_addr, uint16_t size ); /** * Trigger a DMA transfer using software */ async command error_t softwareTrigger(); /** * Stop a DMA transfer in progress */ async command error_t stopTransfer(); /** * Notification that the transfer has completed */ async event void transferDone(error_t success); } tinyos-2.1.2+dfsg/tos/chips/msp430/dma/Msp430DmaChannelP.nc000066400000000000000000000103751207233610700230340ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Ben Greenstein * @author Jonathan Hui * @author Joe Polastre * @version $Revision: 1.5 $ $Date: 2010-06-29 22:07:45 $ */ #include "Msp430Dma.h" generic module Msp430DmaChannelP() { provides interface Msp430DmaChannel as Channel; uses interface HplMsp430DmaChannel as HplChannel; } implementation { norace dma_channel_state_t gChannelState; norace dma_channel_trigger_t gChannelTrigger; async command void Channel.setupTransferRaw( uint16_t s, uint16_t t, void* src, void* dest, int size ) { call HplChannel.setStateRaw( s, t, src, dest, size ); } async command error_t Channel.setupTransfer( dma_transfer_mode_t transfer_mode, dma_trigger_t trigger, dma_level_t level, void *src_addr, void *dst_addr, uint16_t size, dma_byte_t src_byte, dma_byte_t dst_byte, dma_incr_t src_incr, dma_incr_t dst_incr ) { gChannelState.request = 0; gChannelState.abort = 0; gChannelState.interruptEnable = 1; gChannelState.interruptFlag = 0; gChannelState.enable = 0; /* don't start an xfer */ gChannelState.level = level; gChannelState.srcByte = src_byte; gChannelState.dstByte = dst_byte; gChannelState.srcIncrement = src_incr; gChannelState.dstIncrement = dst_incr; gChannelState.transferMode = transfer_mode; gChannelTrigger.trigger = trigger; call HplChannel.setState( gChannelState, gChannelTrigger, src_addr, dst_addr, size ); return SUCCESS; } async command error_t Channel.startTransfer() { call HplChannel.enableDMA(); return SUCCESS; } async command error_t Channel.repeatTransfer( void *src_addr, void *dst_addr, uint16_t size ) { call HplChannel.setSrc( src_addr ); call HplChannel.setDst(dst_addr); call HplChannel.setSize(size); call HplChannel.enableDMA(); return SUCCESS; } async command error_t Channel.softwareTrigger() { if (gChannelTrigger.trigger != DMA_TRIGGER_DMAREQ) return FAIL; call HplChannel.triggerDMA(); return SUCCESS; } async command error_t Channel.stopTransfer() { if ( gChannelState.transferMode != DMA_BURST_BLOCK_TRANSFER || gChannelState.transferMode != DMA_REPEATED_BURST_BLOCK_TRANSFER) return FAIL; call HplChannel.disableDMA(); return SUCCESS; } async event void HplChannel.transferDone( error_t error ) { signal Channel.transferDone( error ); } default async event void Channel.transferDone( error_t error ) {} } tinyos-2.1.2+dfsg/tos/chips/msp430/dma/Msp430DmaControl.nc000066400000000000000000000035651207233610700227670ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Ben Greenstein * @version $Revision: 1.5 $ $Date: 2010-06-29 22:07:45 $ */ #include "Msp430Dma.h" interface Msp430DmaControl { async command void init(); async command void setFlags( bool enable_nmi, bool round_robin, bool on_fetch); } tinyos-2.1.2+dfsg/tos/chips/msp430/dma/Msp430DmaControlP.nc000066400000000000000000000057161207233610700231070ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Ben Greenstein * @author Jonathan Hui * @author Joe Polastre * @version $Revision: 1.5 $ $Date: 2010-06-29 22:07:45 $ */ #include "Msp430Dma.h" module Msp430DmaControlP { provides interface Msp430DmaControl as Control; uses interface HplMsp430DmaControl as HplControl; uses interface HplMsp430DmaChannel as HplChannel0; uses interface HplMsp430DmaChannel as HplChannel1; uses interface HplMsp430DmaChannel as HplChannel2; } implementation { async command void Control.init() { call HplControl.reset(); call HplChannel0.reset(); call HplChannel1.reset(); call HplChannel2.reset(); } async command void Control.setFlags( bool enable_nmi, bool round_robin, bool on_fetch ) { // NOTE: on_fetch must be true when dst addr is flash if (enable_nmi) call HplControl.setENNMI(); else call HplControl.clearENNMI(); if (round_robin) call HplControl.setRoundRobin(); else call HplControl.clearRoundRobin(); if (on_fetch) call HplControl.setOnFetch(); else call HplControl.clearOnFetch(); } async event void HplChannel0.transferDone( error_t error ) {} async event void HplChannel1.transferDone( error_t error ) {} async event void HplChannel2.transferDone( error_t error ) {} } tinyos-2.1.2+dfsg/tos/chips/msp430/msp430hardware.h000066400000000000000000000374171207233610700216530ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // @author Vlado Handziski // @author Joe Polastre // @author Cory Sharp #ifndef _H_msp430hardware_h #define _H_msp430hardware_h #if defined(__MSPGCC__) /* mspgcc */ #include #include #else /* __MSPGCC__ */ /* old mspgcc3, forked mspgcc4 */ #include #include #endif /* __MSPGCC__ */ #include "msp430regtypes.h" #ifdef __MSP430_TI_HEADERS__ /* TI's msp430 headers define FAIL to be 0x80 in the flash module. * I'd prefer that it match the value assigned to it in the * TinyError.h. */ #undef FAIL /* Accommodate old gcc alias */ #define MC_STOP MC__STOP /* Port registers in MSP430 chips have two naming conventions: by * number (e.g., P1IN), and by letter (e.g. PAIN). The numeric-named * registers provide 8-bit values, while the alpha-named registers * provide 16-bit values. * * The headers for certain chips define numeric-named registers. * * In a very few cases, both numeric-named and alpha-named registers * are defined. By inspection, this occurs only for PAIN, which * combines P7IN (at the address of PAIN) and P8IN (at 1+&PAIN); and * for PBIN, which combines P9IN (at the address of PBIN) and P10IN * (at 1+&PBIN). * * In more recent chips, only alpha-named registers are provided. * Since the current TinyOS MSP430 port interface assumes 8-bit * registers, by convention we map numeric-named registers to the * alpha-named registers beginning with PAIN==P1IN. */ #if defined(__MSP430_HAS_PORTA__) || defined(__MSP430_HAS_PORTA_R__) #if (! defined(P1IN_)) && (defined(__MSP430_HAS_PORT1__) || defined(__MSP430_HAS_PORT1_R__)) #define P1IN_ (uint16_t)(PAIN_) #define P1OUT_ (uint16_t)(PAOUT_) #define P1DIR_ (uint16_t)(PADIR_) #define P1SEL_ (uint16_t)(PASEL_) #if defined(__MSP430_HAS_PORT1_R__) #define P1REN_ (uint16_t)(PAREN_) #endif /* __MSP430_HAS_PORT1_R__ */ #endif /* __MSP430_HAS_PORT1__ */ #if (! defined(P2IN_)) && (defined(__MSP430_HAS_PORT2__) || defined(__MSP430_HAS_PORT2_R__)) #define P2IN_ (uint16_t)(PAIN_+1) #define P2OUT_ (uint16_t)(PAOUT_+1) #define P2DIR_ (uint16_t)(PADIR_+1) #define P2SEL_ (uint16_t)(PASEL_+1) #if defined(__MSP430_HAS_PORT2_R__) #define P2REN_ (uint16_t)(PAREN_+1) #endif /* __MSP430_HAS_PORT2_R__ */ #endif /* __MSP430_HAS_PORT2__ */ #endif /* __MSP430_HAS_PORTA__ */ #if defined(__MSP430_HAS_PORTB__) || defined(__MSP430_HAS_PORTB_R__) #if (! defined(P3IN_)) && (defined(__MSP430_HAS_PORT3__) || defined(__MSP430_HAS_PORT3_R__)) #define P3IN_ (uint16_t)(PBIN_) #define P3OUT_ (uint16_t)(PBOUT_) #define P3DIR_ (uint16_t)(PBDIR_) #define P3SEL_ (uint16_t)(PBSEL_) #if defined(__MSP430_HAS_PORT3_R__) #define P3REN_ (uint16_t)(PBREN_) #endif /* __MSP430_HAS_PORT3_R__ */ #endif /* __MSP430_HAS_PORT3__ */ #if (! defined(P4IN_)) && (defined(__MSP430_HAS_PORT4__) || defined(__MSP430_HAS_PORT4_R__)) #define P4IN_ (uint16_t)(PBIN_+1) #define P4OUT_ (uint16_t)(PBOUT_+1) #define P4DIR_ (uint16_t)(PBDIR_+1) #define P4SEL_ (uint16_t)(PBSEL_+1) #if defined(__MSP430_HAS_PORT4_R__) #define P4REN_ (uint16_t)(PBREN_+1) #endif /* __MSP430_HAS_PORT4_R__ */ #endif /* __MSP430_HAS_PORT4__ */ #endif /* __MSP430_HAS_PORTB__ */ #if defined(__MSP430_HAS_PORTC__) || defined(__MSP430_HAS_PORTC_R__) #if (! defined(P5IN_)) && (defined(__MSP430_HAS_PORT5__) || defined(__MSP430_HAS_PORT5_R__)) #define P5IN_ (uint16_t)(PCIN_) #define P5OUT_ (uint16_t)(PCOUT_) #define P5DIR_ (uint16_t)(PCDIR_) #define P5SEL_ (uint16_t)(PCSEL_) #if defined(__MSP430_HAS_PORT5_R__) #define P5REN_ (uint16_t)(PCREN_) #endif /* __MSP430_HAS_PORT5_R__ */ #endif /* __MSP430_HAS_PORT5__ */ #if (! defined(P6IN_)) && (defined(__MSP430_HAS_PORT6__) || defined(__MSP430_HAS_PORT6_R__)) #define P6IN_ (uint16_t)(PCIN_+1) #define P6OUT_ (uint16_t)(PCOUT_+1) #define P6DIR_ (uint16_t)(PCDIR_+1) #define P6SEL_ (uint16_t)(PCSEL_+1) #if defined(__MSP430_HAS_PORT6_R__) #define P6REN_ (uint16_t)(PCREN_+1) #endif /* __MSP430_HAS_PORT6_R__ */ #endif /* __MSP430_HAS_PORT6__ */ #endif /* __MSP430_HAS_PORTC__ */ #if defined(__MSP430_HAS_PORTD__) || defined(__MSP430_HAS_PORTD_R__) #if (! defined(P7IN_)) && (defined(__MSP430_HAS_PORT7__) || defined(__MSP430_HAS_PORT7_R__)) #define P7IN_ (uint16_t)(PDIN_) #define P7OUT_ (uint16_t)(PDOUT_) #define P7DIR_ (uint16_t)(PDDIR_) #define P7SEL_ (uint16_t)(PDSEL_) #if defined(__MSP430_HAS_PORT7_R__) #define P7REN_ (uint16_t)(PDREN_) #endif /* __MSP430_HAS_PORT7_R__ */ #endif /* __MSP430_HAS_PORT7__ */ #if (! defined(P8IN_)) && (defined(__MSP430_HAS_PORT8__) || defined(__MSP430_HAS_PORT8_R__)) #define P8IN_ (uint16_t)(PDIN_+1) #define P8OUT_ (uint16_t)(PDOUT_+1) #define P8DIR_ (uint16_t)(PDDIR_+1) #define P8SEL_ (uint16_t)(PDSEL_+1) #if defined(__MSP430_HAS_PORT8_R__) #define P8REN_ (uint16_t)(PDREN_+1) #endif /* __MSP430_HAS_PORT8_R__ */ #endif /* __MSP430_HAS_PORT8__ */ #endif /* __MSP430_HAS_PORTD__ */ #if defined(__MSP430_HAS_PORTE__) || defined(__MSP430_HAS_PORTE_R__) #if (! defined(P9IN_)) && (defined(__MSP430_HAS_PORT9__) || defined(__MSP430_HAS_PORT9_R__)) #define P9IN_ (uint16_t)(PEIN_) #define P9OUT_ (uint16_t)(PEOUT_) #define P9DIR_ (uint16_t)(PEDIR_) #define P9SEL_ (uint16_t)(PESEL_) #if defined(__MSP430_HAS_PORT9_R__) #define P9REN_ (uint16_t)(PEREN_) #endif /* __MSP430_HAS_PORT9_R__ */ #endif /* __MSP430_HAS_PORT9__ */ #if (! defined(P10IN_)) && (defined(__MSP430_HAS_PORT10__) || defined(__MSP430_HAS_PORT10_R__)) #define P10IN_ (uint16_t)(PEIN_+1) #define P10OUT_ (uint16_t)(PEOUT_+1) #define P10DIR_ (uint16_t)(PEDIR_+1) #define P10SEL_ (uint16_t)(PESEL_+1) #if defined(__MSP430_HAS_PORT10_R__) #define P10REN_ (uint16_t)(PEREN_+1) #endif /* __MSP430_HAS_PORT10_R__ */ #endif /* __MSP430_HAS_PORT10__ */ #endif /* __MSP430_HAS_PORTE__ */ #if defined(__MSP430_HAS_PORTF__) || defined(__MSP430_HAS_PORTF_R__) #if (! defined(P11IN_)) && (defined(__MSP430_HAS_PORT11__) || defined(__MSP430_HAS_PORT11_R__)) #define P11IN_ (uint16_t)(PFIN_) #define P11OUT_ (uint16_t)(PFOUT_) #define P11DIR_ (uint16_t)(PFDIR_) #define P11SEL_ (uint16_t)(PFSEL_) #if defined(__MSP430_HAS_PORT11_R__) #define P11REN_ (uint16_t)(PFREN_) #endif /* __MSP430_HAS_PORT11_R__ */ #endif /* __MSP430_HAS_PORT11__ */ #if (! defined(P12IN_)) && (defined(__MSP430_HAS_PORT12__) || defined(__MSP430_HAS_PORT12_R__)) #define P12IN_ (uint16_t)(PFIN_+1) #define P12OUT_ (uint16_t)(PFOUT_+1) #define P12DIR_ (uint16_t)(PFDIR_+1) #define P12SEL_ (uint16_t)(PFSEL_+1) #if defined(__MSP430_HAS_PORT12_R__) #define P12REN_ (uint16_t)(PFREN_+1) #endif /* __MSP430_HAS_PORT12_R__ */ #endif /* __MSP430_HAS_PORT12__ */ #endif /* __MSP430_HAS_PORTF__ */ #endif /* __MSP430_TI_HEADERS__ */ // CPU memory-mapped register access will cause nesc to issue race condition // warnings. Race conditions are a significant conern when accessing CPU // memory-mapped registers, because they can change even while interrupts // are disabled. This means that the standard nesc tools for resolving race // conditions, atomic statements that disable interrupt handling, do not // resolve CPU register race conditions. So, CPU registers access must be // treated seriously and carefully. // The macro MSP430REG_NORACE allows individual modules to internally // redeclare CPU registers as norace, eliminating nesc's race condition // warnings for their access. This macro should only be used after the // specific CPU register use has been verified safe and correct. Example // use: // // module MyLowLevelModule // { // // ... // } // implementation // { // MSP430REG_NORACE(TACCTL0); // // ... // } #undef norace #define MSP430REG_NORACE_EXPAND(type,name,addr) \ norace static volatile type name asm(#addr) #define MSP430REG_NORACE3(type,name,addr) \ MSP430REG_NORACE_EXPAND(type,name,addr) // MSP430REG_NORACE and MSP430REG_NORACE2 presume naming conventions among // type, name, and addr, which are defined in the local header // msp430regtypes.h and mspgcc's header io.h and its children. #define MSP430REG_NORACE2(rename,name) \ MSP430REG_NORACE3(TYPE_##name,rename,name##_) #define MSP430REG_NORACE(name) \ MSP430REG_NORACE3(TYPE_##name,name,name##_) // Avoid the type-punned pointer warnings from gcc 3.3, which are warning about // creating potentially broken object code. Union casts are the appropriate work // around. Unfortunately, they require a function definiton. #define DEFINE_UNION_CAST(func_name,to_type,from_type) \ to_type func_name(from_type x) @safe() { union {from_type f; to_type t;} c = {f:x}; return c.t; } // redefine ugly defines from msp-gcc #ifndef DONT_REDEFINE_SR_FLAGS #undef C #undef Z #undef N #undef V #undef GIE #undef CPUOFF #undef OSCOFF #undef SCG0 #undef SCG1 #undef LPM0_bits #undef LPM1_bits #undef LPM2_bits #undef LPM3_bits #undef LPM4_bits #define SR_C 0x0001 #define SR_Z 0x0002 #define SR_N 0x0004 #define SR_V 0x0100 #define SR_GIE 0x0008 #define SR_CPUOFF 0x0010 #define SR_OSCOFF 0x0020 #define SR_SCG0 0x0040 #define SR_SCG1 0x0080 #define LPM0_bits SR_CPUOFF #define LPM1_bits SR_SCG0+SR_CPUOFF #define LPM2_bits SR_SCG1+SR_CPUOFF #define LPM3_bits SR_SCG1+SR_SCG0+SR_CPUOFF #define LPM4_bits SR_SCG1+SR_SCG0+SR_OSCOFF+SR_CPUOFF #endif//DONT_REDEFINE_SR_FLAGS #ifdef interrupt #undef interrupt #endif #ifdef wakeup #undef wakeup #endif #ifdef signal #undef signal #endif // Re-definitions for safe tinyOS // These rely on io.h being included at the top of this file // thus pulling the affected header files before the re-definitions #ifdef SAFE_TINYOS #undef ADC12MEM #define ADC12MEM TCAST(int* ONE, ADC12MEM_) /* ADC12 Conversion Memory (for C) */ #undef ADC12MCTL #define ADC12MCTL TCAST(char * ONE, ADC12MCTL_) #endif // define platform constants that can be changed for different compilers // these are all msp430-gcc specific (add as necessary) #if defined(__msp430_headers_adc10_h) || defined(__MSP430_HAS_ADC10__) #define __msp430_have_adc10 #endif #if defined(__msp430_headers_adc12_h) || defined(__MSP430_HAS_ADC12__) #define __msp430_have_adc12 #endif // backwards compatibility to older versions of the header files #ifdef __MSP430_HAS_I2C__ #define __msp430_have_usart0_with_i2c #endif // I2CBusy flag is not defined by current MSP430-GCC #ifdef __msp430_have_usart0_with_i2c #ifndef I2CBUSY #define I2CBUSY (0x01 << 5) #endif MSP430REG_NORACE2(U0CTLnr,U0CTL); MSP430REG_NORACE2(I2CTCTLnr,I2CTCTL); MSP430REG_NORACE2(I2CDCTLnr,I2CDCTL); #endif // The signal attribute has opposite meaning in msp430-gcc than in avr-gcc #define TOSH_SIGNAL(signame) \ void sig_##signame() __attribute__((interrupt (signame), wakeup)) @C() // TOSH_INTERRUPT allows nested interrupts #define TOSH_INTERRUPT(signame) \ void isr_##signame() __attribute__((interrupt (signame), signal, wakeup)) @C() #define SET_FLAG(port, flag) ((port) |= (flag)) #define CLR_FLAG(port, flag) ((port) &= ~(flag)) #define READ_FLAG(port, flag) ((port) & (flag)) // TOSH_ASSIGN_PIN creates functions that are effectively marked as // "norace". This means race conditions that result from their use will not // be detectde by nesc. #define TOSH_ASSIGN_PIN_HEX(name, port, hex) \ void TOSH_SET_##name##_PIN() @safe() { MSP430REG_NORACE2(r,P##port##OUT); r |= hex; } \ void TOSH_CLR_##name##_PIN() @safe() { MSP430REG_NORACE2(r,P##port##OUT); r &= ~hex; } \ void TOSH_TOGGLE_##name##_PIN() @safe(){ MSP430REG_NORACE2(r,P##port##OUT); r ^= hex; } \ uint8_t TOSH_READ_##name##_PIN() @safe() { MSP430REG_NORACE2(r,P##port##IN); return (r & hex); } \ void TOSH_MAKE_##name##_OUTPUT() @safe() { MSP430REG_NORACE2(r,P##port##DIR); r |= hex; } \ void TOSH_MAKE_##name##_INPUT() @safe() { MSP430REG_NORACE2(r,P##port##DIR); r &= ~hex; } \ void TOSH_SEL_##name##_MODFUNC() @safe() { MSP430REG_NORACE2(r,P##port##SEL); r |= hex; } \ void TOSH_SEL_##name##_IOFUNC() @safe() { MSP430REG_NORACE2(r,P##port##SEL); r &= ~hex; } #define TOSH_ASSIGN_PIN(name, port, bit) \ TOSH_ASSIGN_PIN_HEX(name,port,(1<<(bit))) typedef uint8_t mcu_power_t @combine("mcombine"); mcu_power_t mcombine(mcu_power_t m1, mcu_power_t m2) @safe() { return (m1 < m2) ? m1: m2; } enum { MSP430_POWER_ACTIVE = 0, MSP430_POWER_LPM0 = 1, MSP430_POWER_LPM1 = 2, MSP430_POWER_LPM2 = 3, MSP430_POWER_LPM3 = 4, MSP430_POWER_LPM4 = 5 }; void __nesc_disable_interrupt(void) @safe() { dint(); nop(); } void __nesc_enable_interrupt(void) @safe() { eint(); } typedef bool __nesc_atomic_t; __nesc_atomic_t __nesc_atomic_start(void); void __nesc_atomic_end(__nesc_atomic_t reenable_interrupts); #ifndef NESC_BUILD_BINARY /* @spontaneous() functions should not be included when NESC_BUILD_BINARY is #defined, to avoid duplicate functions definitions when binary components are used. Such functions do need a prototype in all cases, though. */ __nesc_atomic_t __nesc_atomic_start(void) @spontaneous() @safe() { __nesc_atomic_t result = ((READ_SR & SR_GIE) != 0); __nesc_disable_interrupt(); asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ return result; } void __nesc_atomic_end(__nesc_atomic_t reenable_interrupts) @spontaneous() @safe() { asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ if( reenable_interrupts ) __nesc_enable_interrupt(); } #endif /* Floating-point network-type support. These functions must convert to/from a 32-bit big-endian integer that follows the layout of Java's java.lang.float.floatToRawIntBits method. Conveniently, for the MSP430 family, this is a straight byte copy... */ typedef float nx_float __attribute__((nx_base_be(afloat))); inline float __nesc_ntoh_afloat(const void *COUNT(sizeof(float)) source) @safe() { float f; memcpy(&f, source, sizeof(float)); return f; } inline float __nesc_hton_afloat(void *COUNT(sizeof(float)) target, float value) @safe() { memcpy(target, &value, sizeof(float)); return value; } /* Support for chips with configurable resistors on digital inputs. These * are denoted with __MSP430_HAS_PORT1_R__ and similar defines. */ enum { MSP430_PORT_RESISTOR_INVALID, /**< Hardware does not support resistor control, or pin is output */ MSP430_PORT_RESISTOR_OFF, /**< Resistor disabled */ MSP430_PORT_RESISTOR_PULLDOWN, /**< Pulldown resistor enabled */ MSP430_PORT_RESISTOR_PULLUP, /**< Pullup resistor enabled */ }; #endif//_H_msp430hardware_h tinyos-2.1.2+dfsg/tos/chips/msp430/msp430regtypes.h000066400000000000000000000421261207233610700217110ustar00rootroot00000000000000 /** * Copyright (c) 2011 Eric B. Decker * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Cory Sharp * @author Xavier Orduna * @author Eric B. Decker */ #ifndef _H_msp430regtypes_h #define _H_msp430regtypes_h /* To generate the primary contents of this file seen below, in mspgcc/msp430/include/, execute the following command: find . | xargs perl -ne ' BEGIN { %t = qw(b uint8_t w uint16_t); } if( /\bsfr([bw])\s*\(\s*(\w+)/ && length($2) > 1 ) { $r{$2} = $t{$1}; print "#define TYPE_$2 $t{$1}\n" if /\bsfr([bw])\s*\(\s*(\w+)/; } elsif( /^#define\s+(\w+)\s+(\w+)\s+$/ ) { print "#define TYPE_$1 $r{$2}\n" if $r{$2}; } ' | sort -u */ #define TYPE_ACTL uint16_t #define TYPE_ADAT uint16_t #define TYPE_ADC10AE uint8_t #define TYPE_ADC10CTL0 uint16_t #define TYPE_ADC10CTL1 uint16_t #define TYPE_ADC10DTC0 uint8_t #define TYPE_ADC10DTC1 uint8_t #define TYPE_ADC10MEM uint16_t #define TYPE_ADC10SA uint16_t #define TYPE_ADC12CTL0 uint16_t #define TYPE_ADC12CTL1 uint16_t #define TYPE_ADC12IE uint16_t #define TYPE_ADC12IFG uint16_t #define TYPE_ADC12IV uint16_t #define TYPE_ADC12MCTL0 uint8_t #define TYPE_ADC12MCTL1 uint8_t #define TYPE_ADC12MCTL10 uint8_t #define TYPE_ADC12MCTL11 uint8_t #define TYPE_ADC12MCTL12 uint8_t #define TYPE_ADC12MCTL13 uint8_t #define TYPE_ADC12MCTL14 uint8_t #define TYPE_ADC12MCTL15 uint8_t #define TYPE_ADC12MCTL2 uint8_t #define TYPE_ADC12MCTL3 uint8_t #define TYPE_ADC12MCTL4 uint8_t #define TYPE_ADC12MCTL5 uint8_t #define TYPE_ADC12MCTL6 uint8_t #define TYPE_ADC12MCTL7 uint8_t #define TYPE_ADC12MCTL8 uint8_t #define TYPE_ADC12MCTL9 uint8_t #define TYPE_ADC12MEM0 uint16_t #define TYPE_ADC12MEM1 uint16_t #define TYPE_ADC12MEM10 uint16_t #define TYPE_ADC12MEM11 uint16_t #define TYPE_ADC12MEM12 uint16_t #define TYPE_ADC12MEM13 uint16_t #define TYPE_ADC12MEM14 uint16_t #define TYPE_ADC12MEM15 uint16_t #define TYPE_ADC12MEM2 uint16_t #define TYPE_ADC12MEM3 uint16_t #define TYPE_ADC12MEM4 uint16_t #define TYPE_ADC12MEM5 uint16_t #define TYPE_ADC12MEM6 uint16_t #define TYPE_ADC12MEM7 uint16_t #define TYPE_ADC12MEM8 uint16_t #define TYPE_ADC12MEM9 uint16_t #define TYPE_AEN uint16_t #define TYPE_AIN uint16_t #define TYPE_BCSCTL1 uint8_t #define TYPE_BCSCTL2 uint8_t #define TYPE_BCSCTL3 uint8_t #define TYPE_BTCNT1 uint8_t #define TYPE_BTCNT2 uint8_t #define TYPE_BTCTL uint8_t #define TYPE_CACTL1 uint8_t #define TYPE_CACTL2 uint8_t #define TYPE_CALBC1_1MHZ uint8_t #define TYPE_CALBC1_8MHZ uint8_t #define TYPE_CALBC1_12MHZ uint8_t #define TYPE_CALBC1_16MHZ uint8_t #define TYPE_CALDCO_1MHZ uint8_t #define TYPE_CALDCO_8MHZ uint8_t #define TYPE_CALDCO_12MHZ uint8_t #define TYPE_CALDCO_16MHZ uint8_t #define TYPE_CAPD uint8_t #define TYPE_CBCTL uint8_t #define TYPE_CCR0 uint16_t #define TYPE_CCR1 uint16_t #define TYPE_CCR2 uint16_t #define TYPE_CCTL0 uint16_t #define TYPE_CCTL1 uint16_t #define TYPE_CCTL2 uint16_t #define TYPE_DAC12CTL0 uint16_t #define TYPE_DAC12IFG uint16_t #define TYPE_DAC12_0CTL uint16_t #define TYPE_DAC12_0DAT uint16_t #define TYPE_DAC12_1CTL uint16_t #define TYPE_DAC12_1DAT uint16_t #define TYPE_DCOCTL uint8_t #define TYPE_DMA0CTL uint16_t #define TYPE_DMA0DAL uint16_t #define TYPE_DMA0DA uint16_t #define TYPE_DMA0SAL uint16_t #define TYPE_DMA0SA uint16_t #define TYPE_DMA0SZ uint16_t #define TYPE_DMA1CTL uint16_t #define TYPE_DMA1DAL uint16_t #define TYPE_DMA1DA uint16_t #define TYPE_DMA1SAL uint16_t #define TYPE_DMA1SA uint16_t #define TYPE_DMA1SZ uint16_t #define TYPE_DMA2CTL uint16_t #define TYPE_DMA2DAL uint16_t #define TYPE_DMA2DA uint16_t #define TYPE_DMA2SAL uint16_t #define TYPE_DMA2SA uint16_t #define TYPE_DMA2SZ uint16_t #define TYPE_DMACTL0 uint16_t #define TYPE_DMACTL1 uint16_t #define TYPE_EPCTL uint8_t #define TYPE_ESPCTL uint16_t #define TYPE_FCTL1 uint16_t #define TYPE_FCTL2 uint16_t #define TYPE_FCTL3 uint16_t #define TYPE_FLL_CTL0 uint8_t #define TYPE_FLL_CTL1 uint8_t #define TYPE_I2CDCTL uint8_t #define TYPE_I2CDR uint8_t #define TYPE_I2CDRB uint8_t #define TYPE_I2CDRW uint16_t #define TYPE_I2CIE uint8_t #define TYPE_I2CIFG uint8_t #define TYPE_I2CIV uint16_t #define TYPE_I2CNDAT uint8_t #define TYPE_I2COA uint16_t #define TYPE_I2CPSC uint8_t #define TYPE_I2CSA uint16_t #define TYPE_I2CSCLH uint8_t #define TYPE_I2CSCLL uint8_t #define TYPE_I2CTCTL uint8_t #define TYPE_IE1 uint8_t #define TYPE_IE2 uint8_t #define TYPE_IFG1 uint8_t #define TYPE_IFG2 uint8_t #define TYPE_LCDACTL uint8_t #define TYPE_LCDAPCTL0 uint8_t #define TYPE_LCDAPCTL1 uint8_t #define TYPE_LCDAVCTL0 uint8_t #define TYPE_LCDAVCTL1 uint8_t #define TYPE_LCDCTL uint8_t #define TYPE_LCDM1 uint8_t #define TYPE_LCDM10 uint8_t #define TYPE_LCDM11 uint8_t #define TYPE_LCDM12 uint8_t #define TYPE_LCDM13 uint8_t #define TYPE_LCDM14 uint8_t #define TYPE_LCDM15 uint8_t #define TYPE_LCDM16 uint8_t #define TYPE_LCDM17 uint8_t #define TYPE_LCDM18 uint8_t #define TYPE_LCDM19 uint8_t #define TYPE_LCDM2 uint8_t #define TYPE_LCDM20 uint8_t #define TYPE_LCDM3 uint8_t #define TYPE_LCDM4 uint8_t #define TYPE_LCDM5 uint8_t #define TYPE_LCDM6 uint8_t #define TYPE_LCDM7 uint8_t #define TYPE_LCDM8 uint8_t #define TYPE_LCDM9 uint8_t #define TYPE_LCDMA uint8_t #define TYPE_LCDMB uint8_t #define TYPE_LCDMC uint8_t #define TYPE_LCDMD uint8_t #define TYPE_LCDME uint8_t #define TYPE_LCDMF uint8_t #define TYPE_MAC uint16_t #define TYPE_MACS uint16_t #define TYPE_MBCTL uint16_t #define TYPE_MBIN0 uint16_t #define TYPE_MBIN1 uint16_t #define TYPE_MBOUT0 uint16_t #define TYPE_MBOUT1 uint16_t #define TYPE_ME1 uint8_t #define TYPE_ME2 uint8_t #define TYPE_MPY uint16_t #define TYPE_MPYS uint16_t #define TYPE_OA0CTL0 uint8_t #define TYPE_OA0CTL1 uint8_t #define TYPE_OA1CTL0 uint8_t #define TYPE_OA1CTL1 uint8_t #define TYPE_OA2CTL0 uint8_t #define TYPE_OA2CTL1 uint8_t #define TYPE_OP2 uint16_t #define TYPE_PORT_OUT uint8_t #define TYPE_PORT_IN uint8_t #define TYPE_PORT_DIR uint8_t #define TYPE_PORT_SEL uint8_t #define TYPE_PORT_REN uint8_t #define TYPE_P0DIR uint8_t #define TYPE_P0IE uint8_t #define TYPE_P0IES uint8_t #define TYPE_P0IFG uint8_t #define TYPE_P0IN uint8_t #define TYPE_P0OUT uint8_t #define TYPE_P1DIR uint8_t #define TYPE_P1IE uint8_t #define TYPE_P1IES uint8_t #define TYPE_P1IFG uint8_t #define TYPE_P1IN uint8_t #define TYPE_P1OUT uint8_t #define TYPE_P1SEL uint8_t #define TYPE_P1REN uint8_t #define TYPE_P2DIR uint8_t #define TYPE_P2IE uint8_t #define TYPE_P2IES uint8_t #define TYPE_P2IFG uint8_t #define TYPE_P2IN uint8_t #define TYPE_P2OUT uint8_t #define TYPE_P2SEL uint8_t #define TYPE_P2REN uint8_t #define TYPE_P3DIR uint8_t #define TYPE_P3IN uint8_t #define TYPE_P3OUT uint8_t #define TYPE_P3SEL uint8_t #define TYPE_P3REN uint8_t #define TYPE_P4DIR uint8_t #define TYPE_P4IN uint8_t #define TYPE_P4OUT uint8_t #define TYPE_P4SEL uint8_t #define TYPE_P4REN uint8_t #define TYPE_P5DIR uint8_t #define TYPE_P5IN uint8_t #define TYPE_P5OUT uint8_t #define TYPE_P5SEL uint8_t #define TYPE_P5REN uint8_t #define TYPE_P6DIR uint8_t #define TYPE_P6IN uint8_t #define TYPE_P6OUT uint8_t #define TYPE_P6SEL uint8_t #define TYPE_P6REN uint8_t #define TYPE_P7DIR uint8_t #define TYPE_P7IN uint8_t #define TYPE_P7OUT uint8_t #define TYPE_P7SEL uint8_t #define TYPE_P8DIR uint8_t #define TYPE_P8IN uint8_t #define TYPE_P8OUT uint8_t #define TYPE_P8SEL uint8_t #define TYPE_P9DIR uint8_t #define TYPE_P9IN uint8_t #define TYPE_P9OUT uint8_t #define TYPE_P9SEL uint8_t /* PAIN differs from 2618 MCU and there's no PBIN */ #ifdef notdef #define TYPE_PAIN uint8_t #define TYPE_PBIN uint8_t #endif #define TYPE_RESHI uint16_t #define TYPE_RESLO uint16_t #define TYPE_RET0 uint16_t #define TYPE_RET1 uint16_t #define TYPE_RET10 uint16_t #define TYPE_RET11 uint16_t #define TYPE_RET12 uint16_t #define TYPE_RET13 uint16_t #define TYPE_RET14 uint16_t #define TYPE_RET15 uint16_t #define TYPE_RET16 uint16_t #define TYPE_RET17 uint16_t #define TYPE_RET18 uint16_t #define TYPE_RET19 uint16_t #define TYPE_RET2 uint16_t #define TYPE_RET20 uint16_t #define TYPE_RET21 uint16_t #define TYPE_RET22 uint16_t #define TYPE_RET23 uint16_t #define TYPE_RET24 uint16_t #define TYPE_RET25 uint16_t #define TYPE_RET26 uint16_t #define TYPE_RET27 uint16_t #define TYPE_RET28 uint16_t #define TYPE_RET29 uint16_t #define TYPE_RET3 uint16_t #define TYPE_RET30 uint16_t #define TYPE_RET31 uint16_t #define TYPE_RET4 uint16_t #define TYPE_RET5 uint16_t #define TYPE_RET6 uint16_t #define TYPE_RET7 uint16_t #define TYPE_RET8 uint16_t #define TYPE_RET9 uint16_t #define TYPE_RTCCTL uint8_t #define TYPE_RTCDAY uint8_t #define TYPE_RTCDOW uint8_t #define TYPE_RTCHOUR uint8_t #define TYPE_RTCMIN uint8_t #define TYPE_RTCMON uint8_t #define TYPE_RTCNT1 uint8_t #define TYPE_RTCNT2 uint8_t #define TYPE_RTCNT3 uint8_t #define TYPE_RTCNT4 uint8_t #define TYPE_RTCSEC uint8_t #define TYPE_RTCTL uint8_t #define TYPE_RTCYEARH uint8_t #define TYPE_RTCYEARL uint8_t #define TYPE_RXBUF uint8_t #define TYPE_RXBUF0 uint8_t #define TYPE_RXBUF1 uint8_t #define TYPE_RXBUF_0 uint8_t #define TYPE_RXBUF_1 uint8_t #define TYPE_SCFI0 uint8_t #define TYPE_SCFI1 uint8_t #define TYPE_SCFQCTL uint8_t #define TYPE_SD16AE uint8_t #define TYPE_SD16CCTL0 uint16_t #define TYPE_SD16CCTL1 uint16_t #define TYPE_SD16CCTL2 uint16_t #define TYPE_SD16CONF0 uint8_t #define TYPE_SD16CONF1 uint8_t #define TYPE_SD16CTL uint16_t #define TYPE_SD16INCTL0 uint8_t #define TYPE_SD16INCTL1 uint8_t #define TYPE_SD16INCTL2 uint8_t #define TYPE_SD16IV uint16_t #define TYPE_SD16MEM0 uint16_t #define TYPE_SD16MEM1 uint16_t #define TYPE_SD16MEM2 uint16_t #define TYPE_SD16PRE0 uint8_t #define TYPE_SD16PRE1 uint8_t #define TYPE_SD16PRE2 uint8_t #define TYPE_SIFCNT uint16_t #define TYPE_SIFCTL0 uint16_t #define TYPE_SIFCTL1 uint16_t #define TYPE_SIFCTL2 uint16_t #define TYPE_SIFCTL3 uint16_t #define TYPE_SIFCTL4 uint16_t #define TYPE_SIFDACR0 uint16_t #define TYPE_SIFDACR1 uint16_t #define TYPE_SIFDACR2 uint16_t #define TYPE_SIFDACR3 uint16_t #define TYPE_SIFDACR4 uint16_t #define TYPE_SIFDACR5 uint16_t #define TYPE_SIFDACR6 uint16_t #define TYPE_SIFDACR7 uint16_t #define TYPE_SIFDEBUG uint16_t #define TYPE_SIFTPSMV uint16_t #define TYPE_SIFTSM0 uint16_t #define TYPE_SIFTSM1 uint16_t #define TYPE_SIFTSM10 uint16_t #define TYPE_SIFTSM11 uint16_t #define TYPE_SIFTSM12 uint16_t #define TYPE_SIFTSM13 uint16_t #define TYPE_SIFTSM14 uint16_t #define TYPE_SIFTSM15 uint16_t #define TYPE_SIFTSM16 uint16_t #define TYPE_SIFTSM17 uint16_t #define TYPE_SIFTSM18 uint16_t #define TYPE_SIFTSM19 uint16_t #define TYPE_SIFTSM2 uint16_t #define TYPE_SIFTSM20 uint16_t #define TYPE_SIFTSM21 uint16_t #define TYPE_SIFTSM22 uint16_t #define TYPE_SIFTSM23 uint16_t #define TYPE_SIFTSM3 uint16_t #define TYPE_SIFTSM4 uint16_t #define TYPE_SIFTSM5 uint16_t #define TYPE_SIFTSM6 uint16_t #define TYPE_SIFTSM7 uint16_t #define TYPE_SIFTSM8 uint16_t #define TYPE_SIFTSM9 uint16_t #define TYPE_SUMEXT uint16_t #define TYPE_SVSCTL uint8_t #define TYPE_SWCTL uint8_t #define TYPE_TA0CCR0 uint16_t #define TYPE_TA0CCR1 uint16_t #define TYPE_TA0CCR2 uint16_t #define TYPE_TA0CCTL0 uint16_t #define TYPE_TA0CCTL1 uint16_t #define TYPE_TA0CCTL2 uint16_t #define TYPE_TA0CTL uint16_t #define TYPE_TA0IV uint16_t #define TYPE_TA0R uint16_t #define TYPE_TA1CCR0 uint16_t #define TYPE_TA1CCR1 uint16_t #define TYPE_TA1CCR2 uint16_t #define TYPE_TA1CCR3 uint16_t #define TYPE_TA1CCR4 uint16_t #define TYPE_TA1CCTL0 uint16_t #define TYPE_TA1CCTL1 uint16_t #define TYPE_TA1CCTL2 uint16_t #define TYPE_TA1CCTL3 uint16_t #define TYPE_TA1CCTL4 uint16_t #define TYPE_TA1CTL uint16_t #define TYPE_TA1IV uint16_t #define TYPE_TACCR0 uint16_t #define TYPE_TACCR1 uint16_t #define TYPE_TACCR2 uint16_t #define TYPE_TACCTL0 uint16_t #define TYPE_TACCTL1 uint16_t #define TYPE_TACCTL2 uint16_t #define TYPE_TACTL uint16_t #define TYPE_TAIV uint16_t #define TYPE_TAR uint16_t #define TYPE_TAR1 uint16_t #define TYPE_TBCCR0 uint16_t #define TYPE_TBCCR1 uint16_t #define TYPE_TBCCR2 uint16_t #define TYPE_TBCCR3 uint16_t #define TYPE_TBCCR4 uint16_t #define TYPE_TBCCR5 uint16_t #define TYPE_TBCCR6 uint16_t #define TYPE_TBCCTL0 uint16_t #define TYPE_TBCCTL1 uint16_t #define TYPE_TBCCTL2 uint16_t #define TYPE_TBCCTL3 uint16_t #define TYPE_TBCCTL4 uint16_t #define TYPE_TBCCTL5 uint16_t #define TYPE_TBCCTL6 uint16_t #define TYPE_TBCTL uint16_t #define TYPE_TBIV uint16_t #define TYPE_TBR uint16_t #define TYPE_TCCTL uint8_t #define TYPE_TLV_ADC12_1_LEN uint8_t #define TYPE_TLV_ADC12_1_TAG uint8_t #define TYPE_TLV_CHECKSUM uint16_t #define TYPE_TLV_DCO_30_LEN uint8_t #define TYPE_TLV_DCO_30_TAG uint8_t #define TYPE_TPCNT1 uint8_t #define TYPE_TPCNT2 uint8_t #define TYPE_TPCTL uint8_t #define TYPE_TPD uint8_t #define TYPE_TPE uint8_t #define TYPE_TXBUF uint8_t #define TYPE_TXBUF0 uint8_t #define TYPE_TXBUF1 uint8_t #define TYPE_TXBUF_0 uint8_t #define TYPE_TXBUF_1 uint8_t #define TYPE_U0BR0 uint8_t #define TYPE_U0BR1 uint8_t #define TYPE_U0CTL uint8_t #define TYPE_U0MCTL uint8_t #define TYPE_U0RCTL uint8_t #define TYPE_U0RXBUF uint8_t #define TYPE_U0TCTL uint8_t #define TYPE_U0TXBUF uint8_t #define TYPE_U1BR0 uint8_t #define TYPE_U1BR1 uint8_t #define TYPE_U1CTL uint8_t #define TYPE_U1MCTL uint8_t #define TYPE_U1RCTL uint8_t #define TYPE_U1RXBUF uint8_t #define TYPE_U1TCTL uint8_t #define TYPE_U1TXBUF uint8_t #define TYPE_UBR0 uint8_t #define TYPE_UBR00 uint8_t #define TYPE_UBR01 uint8_t #define TYPE_UBR0_0 uint8_t #define TYPE_UBR0_1 uint8_t #define TYPE_UBR1 uint8_t #define TYPE_UBR10 uint8_t #define TYPE_UBR11 uint8_t #define TYPE_UBR1_0 uint8_t #define TYPE_UBR1_1 uint8_t #define TYPE_UC0IE uint8_t #define TYPE_UC0IFG uint8_t #define TYPE_UC1IE uint8_t #define TYPE_UC1IFG uint8_t #define TYPE_UCA0ABCTL uint8_t #define TYPE_UCA0BR0 uint8_t #define TYPE_UCA0BR1 uint8_t #define TYPE_UCA0CTL0 uint8_t #define TYPE_UCA0CTL1 uint8_t #define TYPE_UCA0IRRCTL uint8_t #define TYPE_UCA0IRTCTL uint8_t #define TYPE_UCA0MCTL uint8_t #define TYPE_UCA0RXBUF uint8_t #define TYPE_UCA0STAT uint8_t #define TYPE_UCA0TXBUF uint8_t #define TYPE_UCA1ABCTL uint8_t #define TYPE_UCA1BR0 uint8_t #define TYPE_UCA1BR1 uint8_t #define TYPE_UCA1CTL0 uint8_t #define TYPE_UCA1CTL1 uint8_t #define TYPE_UCA1IRRCTL uint8_t #define TYPE_UCA1IRTCTL uint8_t #define TYPE_UCA1MCTL uint8_t #define TYPE_UCA1RXBUF uint8_t #define TYPE_UCA1STAT uint8_t #define TYPE_UCA1TXBUF uint8_t #define TYPE_UCB0BR0 uint8_t #define TYPE_UCB0BR1 uint8_t #define TYPE_UCB0CTL0 uint8_t #define TYPE_UCB0CTL1 uint8_t #define TYPE_UCB0I2CIE uint8_t #define TYPE_UCB0I2COA uint16_t #define TYPE_UCB0I2CSA uint16_t #define TYPE_UCB0RXBUF uint8_t #define TYPE_UCB0STAT uint8_t #define TYPE_UCB0TXBUF uint8_t #define TYPE_UCB1BR0 uint8_t #define TYPE_UCB1BR1 uint8_t #define TYPE_UCB1CTL0 uint8_t #define TYPE_UCB1CTL1 uint8_t #define TYPE_UCB1I2CIE uint8_t #define TYPE_UCB1I2COA uint16_t #define TYPE_UCB1I2CSA uint16_t #define TYPE_UCB1RXBUF uint8_t #define TYPE_UCB1STAT uint8_t #define TYPE_UCB1TXBUF uint8_t #define TYPE_UCTL uint8_t #define TYPE_UCTL0 uint8_t #define TYPE_UCTL1 uint8_t #define TYPE_UCTL_0 uint8_t #define TYPE_UCTL_1 uint8_t #define TYPE_UMCTL uint8_t #define TYPE_UMCTL0 uint8_t #define TYPE_UMCTL1 uint8_t #define TYPE_UMCTL_0 uint8_t #define TYPE_UMCTL_1 uint8_t #define TYPE_URCTL uint8_t #define TYPE_URCTL0 uint8_t #define TYPE_URCTL1 uint8_t #define TYPE_URCTL_0 uint8_t #define TYPE_URCTL_1 uint8_t #define TYPE_USICKCTL uint8_t #define TYPE_USICNT uint8_t #define TYPE_USICTL0 uint8_t #define TYPE_USICTL1 uint8_t #define TYPE_USICTL uint16_t #define TYPE_USISRH uint8_t #define TYPE_USISRL uint8_t #define TYPE_USISR uint16_t #define TYPE_UTCTL uint8_t #define TYPE_UTCTL0 uint8_t #define TYPE_UTCTL1 uint8_t #define TYPE_UTCTL_0 uint8_t #define TYPE_UTCTL_1 uint8_t #define TYPE_WDTCTL uint16_t #endif //_H_msp430regtypes_h tinyos-2.1.2+dfsg/tos/chips/msp430/pins/000077500000000000000000000000001207233610700176735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/msp430/pins/HplMsp430GeneralIO.nc000066400000000000000000000066131207233610700234030ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL for the TI MSP430 family of microprocessors. This provides an * abstraction for general-purpose I/O. * * @author Cory Sharp * @author Peter Bigot */ #include "TinyError.h" interface HplMsp430GeneralIO { /** * Set pin to high. */ async command void set(); /** * Set pin to low. */ async command void clr(); /** * Toggle pin status. */ async command void toggle(); /** * Get the port status that contains the pin. * * @return Status of the port that contains the given pin. The x'th * pin on the port will be represented in the x'th bit. */ async command uint8_t getRaw(); /** * Read pin value. * * @return TRUE if pin is high, FALSE otherwise. */ async command bool get(); /** * Set pin direction to input. */ async command void makeInput(); async command bool isInput(); /** * Set pin direction to output. */ async command void makeOutput(); async command bool isOutput(); /** * Set pin for module specific functionality. */ async command void selectModuleFunc(); async command bool isModuleFunc(); /** * Set pin for I/O functionality. */ async command void selectIOFunc(); async command bool isIOFunc(); /** * Set pin pullup / pull down resistor mode. * @param mode One of the MSP430_PORT_RESISTOR_* values * @return EINVAL if invalid mode or pin does not support resistor configuration; * FAIL if pin is not an input; * SUCCESS if pin supports resistor configuration, is an input, and mode is valid */ async command error_t setResistor(uint8_t mode); /** * Get the pin pullup / pulldown resistor mode. * * @return one of the MSP430_PORT_RESISTOR_* values */ async command uint8_t getResistor(); } tinyos-2.1.2+dfsg/tos/chips/msp430/pins/HplMsp430GeneralIOC.nc000066400000000000000000000645071207233610700235140ustar00rootroot00000000000000/** * Copyright (c) 2011 Eric B. Decker * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL for the TI MSP430 family of microprocessors. This provides an * abstraction for general-purpose I/O. * * @author Joe Polastre * @author Xavier Orduna * @author Peter A. Bigot * @author Eric B. Decker */ configuration HplMsp430GeneralIOC { // provides all the ports as raw ports #if defined(__msp430_have_port1) || defined(__MSP430_HAS_PORT1__) || defined(__MSP430_HAS_PORT1_R__) provides interface HplMsp430GeneralIO as Port10; provides interface HplMsp430GeneralIO as Port11; provides interface HplMsp430GeneralIO as Port12; provides interface HplMsp430GeneralIO as Port13; provides interface HplMsp430GeneralIO as Port14; provides interface HplMsp430GeneralIO as Port15; provides interface HplMsp430GeneralIO as Port16; provides interface HplMsp430GeneralIO as Port17; #endif #if defined(__msp430_have_port2) || defined(__MSP430_HAS_PORT2__) || defined(__MSP430_HAS_PORT2_R__) provides interface HplMsp430GeneralIO as Port20; provides interface HplMsp430GeneralIO as Port21; provides interface HplMsp430GeneralIO as Port22; provides interface HplMsp430GeneralIO as Port23; provides interface HplMsp430GeneralIO as Port24; provides interface HplMsp430GeneralIO as Port25; provides interface HplMsp430GeneralIO as Port26; provides interface HplMsp430GeneralIO as Port27; #endif #if defined(__msp430_have_port3) || defined(__MSP430_HAS_PORT3__) || defined(__MSP430_HAS_PORT3_R__) provides interface HplMsp430GeneralIO as Port30; provides interface HplMsp430GeneralIO as Port31; provides interface HplMsp430GeneralIO as Port32; provides interface HplMsp430GeneralIO as Port33; provides interface HplMsp430GeneralIO as Port34; provides interface HplMsp430GeneralIO as Port35; provides interface HplMsp430GeneralIO as Port36; provides interface HplMsp430GeneralIO as Port37; #endif #if defined(__msp430_have_port4) || defined(__MSP430_HAS_PORT4__) || defined(__MSP430_HAS_PORT4_R__) provides interface HplMsp430GeneralIO as Port40; provides interface HplMsp430GeneralIO as Port41; provides interface HplMsp430GeneralIO as Port42; provides interface HplMsp430GeneralIO as Port43; provides interface HplMsp430GeneralIO as Port44; provides interface HplMsp430GeneralIO as Port45; provides interface HplMsp430GeneralIO as Port46; provides interface HplMsp430GeneralIO as Port47; #endif #if defined(__msp430_have_port5) || defined(__MSP430_HAS_PORT5__) || defined(__MSP430_HAS_PORT5_R__) provides interface HplMsp430GeneralIO as Port50; provides interface HplMsp430GeneralIO as Port51; provides interface HplMsp430GeneralIO as Port52; provides interface HplMsp430GeneralIO as Port53; provides interface HplMsp430GeneralIO as Port54; provides interface HplMsp430GeneralIO as Port55; provides interface HplMsp430GeneralIO as Port56; provides interface HplMsp430GeneralIO as Port57; #endif #if defined(__msp430_have_port6) || defined(__MSP430_HAS_PORT6__) || defined(__MSP430_HAS_PORT6_R__) provides interface HplMsp430GeneralIO as Port60; provides interface HplMsp430GeneralIO as Port61; provides interface HplMsp430GeneralIO as Port62; provides interface HplMsp430GeneralIO as Port63; provides interface HplMsp430GeneralIO as Port64; provides interface HplMsp430GeneralIO as Port65; provides interface HplMsp430GeneralIO as Port66; provides interface HplMsp430GeneralIO as Port67; #endif // provides special ports explicitly // this section of HplMsp430GeneralIOC supports the F14x series #ifdef __msp430x14x provides interface HplMsp430GeneralIO as STE0; provides interface HplMsp430GeneralIO as SIMO0; provides interface HplMsp430GeneralIO as SOMI0; provides interface HplMsp430GeneralIO as UCLK0; provides interface HplMsp430GeneralIO as UTXD0; provides interface HplMsp430GeneralIO as URXD0; provides interface HplMsp430GeneralIO as STE1; provides interface HplMsp430GeneralIO as SIMO1; provides interface HplMsp430GeneralIO as SOMI1; provides interface HplMsp430GeneralIO as UCLK1; provides interface HplMsp430GeneralIO as UTXD1; provides interface HplMsp430GeneralIO as URXD1; provides interface HplMsp430GeneralIO as ADC0; provides interface HplMsp430GeneralIO as ADC1; provides interface HplMsp430GeneralIO as ADC2; provides interface HplMsp430GeneralIO as ADC3; provides interface HplMsp430GeneralIO as ADC4; provides interface HplMsp430GeneralIO as ADC5; provides interface HplMsp430GeneralIO as ADC6; provides interface HplMsp430GeneralIO as ADC7; #endif // this section of HplMsp430GeneralIOC supports the F16x series #ifdef __msp430x16x provides interface HplMsp430GeneralIO as STE0; provides interface HplMsp430GeneralIO as SIMO0; provides interface HplMsp430GeneralIO as SDA; provides interface HplMsp430GeneralIO as SOMI0; provides interface HplMsp430GeneralIO as UCLK0; provides interface HplMsp430GeneralIO as SCL; provides interface HplMsp430GeneralIO as UTXD0; provides interface HplMsp430GeneralIO as URXD0; provides interface HplMsp430GeneralIO as STE1; provides interface HplMsp430GeneralIO as SIMO1; provides interface HplMsp430GeneralIO as SOMI1; provides interface HplMsp430GeneralIO as UCLK1; provides interface HplMsp430GeneralIO as UTXD1; provides interface HplMsp430GeneralIO as URXD1; provides interface HplMsp430GeneralIO as ADC0; provides interface HplMsp430GeneralIO as ADC1; provides interface HplMsp430GeneralIO as ADC2; provides interface HplMsp430GeneralIO as ADC3; provides interface HplMsp430GeneralIO as ADC4; provides interface HplMsp430GeneralIO as ADC5; provides interface HplMsp430GeneralIO as ADC6; provides interface HplMsp430GeneralIO as ADC7; provides interface HplMsp430GeneralIO as DAC0; provides interface HplMsp430GeneralIO as DAC1; provides interface HplMsp430GeneralIO as SVSIN; provides interface HplMsp430GeneralIO as SVSOUT; #endif #if defined(__msp430x261x) || defined(__msp430x26x) provides interface HplMsp430GeneralIO as UCA0CLK; provides interface HplMsp430GeneralIO as UCA0STE; provides interface HplMsp430GeneralIO as UCA0TXD; provides interface HplMsp430GeneralIO as UCA0RXD; provides interface HplMsp430GeneralIO as UCA0SIMO; provides interface HplMsp430GeneralIO as UCA0SOMI; provides interface HplMsp430GeneralIO as UCB0CLK; provides interface HplMsp430GeneralIO as UCB0STE; provides interface HplMsp430GeneralIO as UCB0SIMO; provides interface HplMsp430GeneralIO as UCB0SOMI; provides interface HplMsp430GeneralIO as UCB0SDA; provides interface HplMsp430GeneralIO as UCB0SCL; provides interface HplMsp430GeneralIO as UCA1CLK; provides interface HplMsp430GeneralIO as UCA1STE; provides interface HplMsp430GeneralIO as UCA1TXD; provides interface HplMsp430GeneralIO as UCA1RXD; provides interface HplMsp430GeneralIO as UCA1SIMO; provides interface HplMsp430GeneralIO as UCA1SOMI; provides interface HplMsp430GeneralIO as UCB1CLK; provides interface HplMsp430GeneralIO as UCB1STE; provides interface HplMsp430GeneralIO as UCB1SIMO; provides interface HplMsp430GeneralIO as UCB1SOMI; provides interface HplMsp430GeneralIO as UCB1SDA; provides interface HplMsp430GeneralIO as UCB1SCL; provides interface HplMsp430GeneralIO as ADC0; provides interface HplMsp430GeneralIO as ADC1; provides interface HplMsp430GeneralIO as ADC2; provides interface HplMsp430GeneralIO as ADC3; provides interface HplMsp430GeneralIO as ADC4; provides interface HplMsp430GeneralIO as ADC5; provides interface HplMsp430GeneralIO as ADC6; provides interface HplMsp430GeneralIO as ADC7; provides interface HplMsp430GeneralIO as DAC0; provides interface HplMsp430GeneralIO as DAC1; provides interface HplMsp430GeneralIO as SVSIN; provides interface HplMsp430GeneralIO as SVSOUT; #endif #ifdef __msp430x241x provides interface HplMsp430GeneralIO as UCA0CLK; provides interface HplMsp430GeneralIO as UCA0STE; provides interface HplMsp430GeneralIO as UCA0TXD; provides interface HplMsp430GeneralIO as UCA0RXD; provides interface HplMsp430GeneralIO as UCA0SIMO; provides interface HplMsp430GeneralIO as UCA0SOMI; provides interface HplMsp430GeneralIO as UCB0CLK; provides interface HplMsp430GeneralIO as UCB0STE; provides interface HplMsp430GeneralIO as UCB0SIMO; provides interface HplMsp430GeneralIO as UCB0SOMI; provides interface HplMsp430GeneralIO as UCB0SDA; provides interface HplMsp430GeneralIO as UCB0SCL; provides interface HplMsp430GeneralIO as UCA1CLK; provides interface HplMsp430GeneralIO as UCA1STE; provides interface HplMsp430GeneralIO as UCA1TXD; provides interface HplMsp430GeneralIO as UCA1RXD; provides interface HplMsp430GeneralIO as UCA1SIMO; provides interface HplMsp430GeneralIO as UCA1SOMI; provides interface HplMsp430GeneralIO as UCB1CLK; provides interface HplMsp430GeneralIO as UCB1STE; provides interface HplMsp430GeneralIO as UCB1SIMO; provides interface HplMsp430GeneralIO as UCB1SOMI; provides interface HplMsp430GeneralIO as UCB1SDA; provides interface HplMsp430GeneralIO as UCB1SCL; provides interface HplMsp430GeneralIO as ADC0; provides interface HplMsp430GeneralIO as ADC1; provides interface HplMsp430GeneralIO as ADC2; provides interface HplMsp430GeneralIO as ADC3; provides interface HplMsp430GeneralIO as ADC4; provides interface HplMsp430GeneralIO as ADC5; provides interface HplMsp430GeneralIO as ADC6; provides interface HplMsp430GeneralIO as ADC7; provides interface HplMsp430GeneralIO as SVSIN; provides interface HplMsp430GeneralIO as SVSOUT; #endif #if defined(__cc430x513x) || defined(__cc430x612x) || defined(__cc430x613x) provides interface HplMsp430GeneralIO as CBOUT0; provides interface HplMsp430GeneralIO as TA0CLK; provides interface HplMsp430GeneralIO as CBOUT1; provides interface HplMsp430GeneralIO as TA1CLK; provides interface HplMsp430GeneralIO as ACLK; provides interface HplMsp430GeneralIO as SMCLK; provides interface HplMsp430GeneralIO as RTCCLK; provides interface HplMsp430GeneralIO as ADC12CLK; provides interface HplMsp430GeneralIO as DMAE0; provides interface HplMsp430GeneralIO as SVMOUT; provides interface HplMsp430GeneralIO as TA0CCR0A; provides interface HplMsp430GeneralIO as TA0CCR1A; provides interface HplMsp430GeneralIO as TA0CCR2A; provides interface HplMsp430GeneralIO as TA0CCR3A; provides interface HplMsp430GeneralIO as TA0CCR4A; provides interface HplMsp430GeneralIO as TA1CCR0A; provides interface HplMsp430GeneralIO as TA1CCR1A; provides interface HplMsp430GeneralIO as TA1CCR2A; provides interface HplMsp430GeneralIO as UCA0RXD; provides interface HplMsp430GeneralIO as UCA0SOMI; provides interface HplMsp430GeneralIO as UCA0TXD; provides interface HplMsp430GeneralIO as UCA0SIMO; provides interface HplMsp430GeneralIO as UCA0CLK; provides interface HplMsp430GeneralIO as UCB0STE; provides interface HplMsp430GeneralIO as UCB0SOMI; provides interface HplMsp430GeneralIO as UCB0SCL; provides interface HplMsp430GeneralIO as UCB0SIMO; provides interface HplMsp430GeneralIO as UCB0SDA; provides interface HplMsp430GeneralIO as UCB0CLK; provides interface HplMsp430GeneralIO as UCA0STE; provides interface HplMsp430GeneralIO as RFGDO0; provides interface HplMsp430GeneralIO as RFGDO1; provides interface HplMsp430GeneralIO as RFGDO2; #if defined(__cc430x513x) || defined(__cc430x613x) provides interface HplMsp430GeneralIO as ADC0; provides interface HplMsp430GeneralIO as ADC1; provides interface HplMsp430GeneralIO as ADC2; provides interface HplMsp430GeneralIO as ADC3; provides interface HplMsp430GeneralIO as ADC4; provides interface HplMsp430GeneralIO as ADC5; #if defined(__cc430x613x) provides interface HplMsp430GeneralIO as ADC6; provides interface HplMsp430GeneralIO as ADC7; #endif /* cc430x613x */ #endif /* cc430x513x || cc430x613x */ #endif /* cc430x513x || cc430x612x || cc430x613x */ } implementation { components #if defined(__MSP430_HAS_PORT1_R__) new HplMsp430GeneralIORenP(P1IN_, P1OUT_, P1DIR_, P1SEL_, P1REN_, 0) as P10, new HplMsp430GeneralIORenP(P1IN_, P1OUT_, P1DIR_, P1SEL_, P1REN_, 1) as P11, new HplMsp430GeneralIORenP(P1IN_, P1OUT_, P1DIR_, P1SEL_, P1REN_, 2) as P12, new HplMsp430GeneralIORenP(P1IN_, P1OUT_, P1DIR_, P1SEL_, P1REN_, 3) as P13, new HplMsp430GeneralIORenP(P1IN_, P1OUT_, P1DIR_, P1SEL_, P1REN_, 4) as P14, new HplMsp430GeneralIORenP(P1IN_, P1OUT_, P1DIR_, P1SEL_, P1REN_, 5) as P15, new HplMsp430GeneralIORenP(P1IN_, P1OUT_, P1DIR_, P1SEL_, P1REN_, 6) as P16, new HplMsp430GeneralIORenP(P1IN_, P1OUT_, P1DIR_, P1SEL_, P1REN_, 7) as P17, #elif defined(__msp430_have_port1) || defined(__MSP430_HAS_PORT1__) new HplMsp430GeneralIOP(P1IN_, P1OUT_, P1DIR_, P1SEL_, 0) as P10, new HplMsp430GeneralIOP(P1IN_, P1OUT_, P1DIR_, P1SEL_, 1) as P11, new HplMsp430GeneralIOP(P1IN_, P1OUT_, P1DIR_, P1SEL_, 2) as P12, new HplMsp430GeneralIOP(P1IN_, P1OUT_, P1DIR_, P1SEL_, 3) as P13, new HplMsp430GeneralIOP(P1IN_, P1OUT_, P1DIR_, P1SEL_, 4) as P14, new HplMsp430GeneralIOP(P1IN_, P1OUT_, P1DIR_, P1SEL_, 5) as P15, new HplMsp430GeneralIOP(P1IN_, P1OUT_, P1DIR_, P1SEL_, 6) as P16, new HplMsp430GeneralIOP(P1IN_, P1OUT_, P1DIR_, P1SEL_, 7) as P17, #endif #if defined(__MSP430_HAS_PORT2_R__) new HplMsp430GeneralIORenP(P2IN_, P2OUT_, P2DIR_, P2SEL_, P2REN_, 0) as P20, new HplMsp430GeneralIORenP(P2IN_, P2OUT_, P2DIR_, P2SEL_, P2REN_, 1) as P21, new HplMsp430GeneralIORenP(P2IN_, P2OUT_, P2DIR_, P2SEL_, P2REN_, 2) as P22, new HplMsp430GeneralIORenP(P2IN_, P2OUT_, P2DIR_, P2SEL_, P2REN_, 3) as P23, new HplMsp430GeneralIORenP(P2IN_, P2OUT_, P2DIR_, P2SEL_, P2REN_, 4) as P24, new HplMsp430GeneralIORenP(P2IN_, P2OUT_, P2DIR_, P2SEL_, P2REN_, 5) as P25, new HplMsp430GeneralIORenP(P2IN_, P2OUT_, P2DIR_, P2SEL_, P2REN_, 6) as P26, new HplMsp430GeneralIORenP(P2IN_, P2OUT_, P2DIR_, P2SEL_, P2REN_, 7) as P27, #elif defined(__msp430_have_port2) || defined(__MSP430_HAS_PORT2__) new HplMsp430GeneralIOP(P2IN_, P2OUT_, P2DIR_, P2SEL_, 0) as P20, new HplMsp430GeneralIOP(P2IN_, P2OUT_, P2DIR_, P2SEL_, 1) as P21, new HplMsp430GeneralIOP(P2IN_, P2OUT_, P2DIR_, P2SEL_, 2) as P22, new HplMsp430GeneralIOP(P2IN_, P2OUT_, P2DIR_, P2SEL_, 3) as P23, new HplMsp430GeneralIOP(P2IN_, P2OUT_, P2DIR_, P2SEL_, 4) as P24, new HplMsp430GeneralIOP(P2IN_, P2OUT_, P2DIR_, P2SEL_, 5) as P25, new HplMsp430GeneralIOP(P2IN_, P2OUT_, P2DIR_, P2SEL_, 6) as P26, new HplMsp430GeneralIOP(P2IN_, P2OUT_, P2DIR_, P2SEL_, 7) as P27, #endif #if defined(__MSP430_HAS_PORT3_R__) new HplMsp430GeneralIORenP(P3IN_, P3OUT_, P3DIR_, P3SEL_, P3REN_, 0) as P30, new HplMsp430GeneralIORenP(P3IN_, P3OUT_, P3DIR_, P3SEL_, P3REN_, 1) as P31, new HplMsp430GeneralIORenP(P3IN_, P3OUT_, P3DIR_, P3SEL_, P3REN_, 2) as P32, new HplMsp430GeneralIORenP(P3IN_, P3OUT_, P3DIR_, P3SEL_, P3REN_, 3) as P33, new HplMsp430GeneralIORenP(P3IN_, P3OUT_, P3DIR_, P3SEL_, P3REN_, 4) as P34, new HplMsp430GeneralIORenP(P3IN_, P3OUT_, P3DIR_, P3SEL_, P3REN_, 5) as P35, new HplMsp430GeneralIORenP(P3IN_, P3OUT_, P3DIR_, P3SEL_, P3REN_, 6) as P36, new HplMsp430GeneralIORenP(P3IN_, P3OUT_, P3DIR_, P3SEL_, P3REN_, 7) as P37, #elif defined(__msp430_have_port3) || defined(__MSP430_HAS_PORT3__) new HplMsp430GeneralIOP(P3IN_, P3OUT_, P3DIR_, P3SEL_, 0) as P30, new HplMsp430GeneralIOP(P3IN_, P3OUT_, P3DIR_, P3SEL_, 1) as P31, new HplMsp430GeneralIOP(P3IN_, P3OUT_, P3DIR_, P3SEL_, 2) as P32, new HplMsp430GeneralIOP(P3IN_, P3OUT_, P3DIR_, P3SEL_, 3) as P33, new HplMsp430GeneralIOP(P3IN_, P3OUT_, P3DIR_, P3SEL_, 4) as P34, new HplMsp430GeneralIOP(P3IN_, P3OUT_, P3DIR_, P3SEL_, 5) as P35, new HplMsp430GeneralIOP(P3IN_, P3OUT_, P3DIR_, P3SEL_, 6) as P36, new HplMsp430GeneralIOP(P3IN_, P3OUT_, P3DIR_, P3SEL_, 7) as P37, #endif #if defined(__MSP430_HAS_PORT4_R__) new HplMsp430GeneralIORenP(P4IN_, P4OUT_, P4DIR_, P4SEL_, P4REN_, 0) as P40, new HplMsp430GeneralIORenP(P4IN_, P4OUT_, P4DIR_, P4SEL_, P4REN_, 1) as P41, new HplMsp430GeneralIORenP(P4IN_, P4OUT_, P4DIR_, P4SEL_, P4REN_, 2) as P42, new HplMsp430GeneralIORenP(P4IN_, P4OUT_, P4DIR_, P4SEL_, P4REN_, 3) as P43, new HplMsp430GeneralIORenP(P4IN_, P4OUT_, P4DIR_, P4SEL_, P4REN_, 4) as P44, new HplMsp430GeneralIORenP(P4IN_, P4OUT_, P4DIR_, P4SEL_, P4REN_, 5) as P45, new HplMsp430GeneralIORenP(P4IN_, P4OUT_, P4DIR_, P4SEL_, P4REN_, 6) as P46, new HplMsp430GeneralIORenP(P4IN_, P4OUT_, P4DIR_, P4SEL_, P4REN_, 7) as P47, #elif defined(__msp430_have_port4) || defined(__MSP430_HAS_PORT4__) new HplMsp430GeneralIOP(P4IN_, P4OUT_, P4DIR_, P4SEL_, 0) as P40, new HplMsp430GeneralIOP(P4IN_, P4OUT_, P4DIR_, P4SEL_, 1) as P41, new HplMsp430GeneralIOP(P4IN_, P4OUT_, P4DIR_, P4SEL_, 2) as P42, new HplMsp430GeneralIOP(P4IN_, P4OUT_, P4DIR_, P4SEL_, 3) as P43, new HplMsp430GeneralIOP(P4IN_, P4OUT_, P4DIR_, P4SEL_, 4) as P44, new HplMsp430GeneralIOP(P4IN_, P4OUT_, P4DIR_, P4SEL_, 5) as P45, new HplMsp430GeneralIOP(P4IN_, P4OUT_, P4DIR_, P4SEL_, 6) as P46, new HplMsp430GeneralIOP(P4IN_, P4OUT_, P4DIR_, P4SEL_, 7) as P47, #endif #if defined(__MSP430_HAS_PORT5_R__) new HplMsp430GeneralIORenP(P5IN_, P5OUT_, P5DIR_, P5SEL_, P5REN_, 0) as P50, new HplMsp430GeneralIORenP(P5IN_, P5OUT_, P5DIR_, P5SEL_, P5REN_, 1) as P51, new HplMsp430GeneralIORenP(P5IN_, P5OUT_, P5DIR_, P5SEL_, P5REN_, 2) as P52, new HplMsp430GeneralIORenP(P5IN_, P5OUT_, P5DIR_, P5SEL_, P5REN_, 3) as P53, new HplMsp430GeneralIORenP(P5IN_, P5OUT_, P5DIR_, P5SEL_, P5REN_, 4) as P54, new HplMsp430GeneralIORenP(P5IN_, P5OUT_, P5DIR_, P5SEL_, P5REN_, 5) as P55, new HplMsp430GeneralIORenP(P5IN_, P5OUT_, P5DIR_, P5SEL_, P5REN_, 6) as P56, new HplMsp430GeneralIORenP(P5IN_, P5OUT_, P5DIR_, P5SEL_, P5REN_, 7) as P57, #elif defined(__msp430_have_port5) || defined(__MSP430_HAS_PORT5__) new HplMsp430GeneralIOP(P5IN_, P5OUT_, P5DIR_, P5SEL_, 0) as P50, new HplMsp430GeneralIOP(P5IN_, P5OUT_, P5DIR_, P5SEL_, 1) as P51, new HplMsp430GeneralIOP(P5IN_, P5OUT_, P5DIR_, P5SEL_, 2) as P52, new HplMsp430GeneralIOP(P5IN_, P5OUT_, P5DIR_, P5SEL_, 3) as P53, new HplMsp430GeneralIOP(P5IN_, P5OUT_, P5DIR_, P5SEL_, 4) as P54, new HplMsp430GeneralIOP(P5IN_, P5OUT_, P5DIR_, P5SEL_, 5) as P55, new HplMsp430GeneralIOP(P5IN_, P5OUT_, P5DIR_, P5SEL_, 6) as P56, new HplMsp430GeneralIOP(P5IN_, P5OUT_, P5DIR_, P5SEL_, 7) as P57, #endif #if defined(__MSP430_HAS_PORT6_R__) new HplMsp430GeneralIORenP(P6IN_, P6OUT_, P6DIR_, P6SEL_, P6REN_, 0) as P60, new HplMsp430GeneralIORenP(P6IN_, P6OUT_, P6DIR_, P6SEL_, P6REN_, 1) as P61, new HplMsp430GeneralIORenP(P6IN_, P6OUT_, P6DIR_, P6SEL_, P6REN_, 2) as P62, new HplMsp430GeneralIORenP(P6IN_, P6OUT_, P6DIR_, P6SEL_, P6REN_, 3) as P63, new HplMsp430GeneralIORenP(P6IN_, P6OUT_, P6DIR_, P6SEL_, P6REN_, 4) as P64, new HplMsp430GeneralIORenP(P6IN_, P6OUT_, P6DIR_, P6SEL_, P6REN_, 5) as P65, new HplMsp430GeneralIORenP(P6IN_, P6OUT_, P6DIR_, P6SEL_, P6REN_, 6) as P66, new HplMsp430GeneralIORenP(P6IN_, P6OUT_, P6DIR_, P6SEL_, P6REN_, 7) as P67, #elif defined(__msp430_have_port6) || defined(__MSP430_HAS_PORT6__) new HplMsp430GeneralIOP(P6IN_, P6OUT_, P6DIR_, P6SEL_, 0) as P60, new HplMsp430GeneralIOP(P6IN_, P6OUT_, P6DIR_, P6SEL_, 1) as P61, new HplMsp430GeneralIOP(P6IN_, P6OUT_, P6DIR_, P6SEL_, 2) as P62, new HplMsp430GeneralIOP(P6IN_, P6OUT_, P6DIR_, P6SEL_, 3) as P63, new HplMsp430GeneralIOP(P6IN_, P6OUT_, P6DIR_, P6SEL_, 4) as P64, new HplMsp430GeneralIOP(P6IN_, P6OUT_, P6DIR_, P6SEL_, 5) as P65, new HplMsp430GeneralIOP(P6IN_, P6OUT_, P6DIR_, P6SEL_, 6) as P66, new HplMsp430GeneralIOP(P6IN_, P6OUT_, P6DIR_, P6SEL_, 7) as P67, #endif PlatformC; // dummy to end unknown sequence #if defined(__msp430_have_port1) || defined(__MSP430_HAS_PORT1__) || defined(__MSP430_HAS_PORT1_R__) Port10 = P10; Port11 = P11; Port12 = P12; Port13 = P13; Port14 = P14; Port15 = P15; Port16 = P16; Port17 = P17; #endif #if defined(__msp430_have_port2) || defined(__MSP430_HAS_PORT2__) || defined(__MSP430_HAS_PORT2_R__) Port20 = P20; Port21 = P21; Port22 = P22; Port23 = P23; Port24 = P24; Port25 = P25; Port26 = P26; Port27 = P27; #endif #if defined(__msp430_have_port3) || defined(__MSP430_HAS_PORT3__) || defined(__MSP430_HAS_PORT3_R__) Port30 = P30; Port31 = P31; Port32 = P32; Port33 = P33; Port34 = P34; Port35 = P35; Port36 = P36; Port37 = P37; #endif #if defined(__msp430_have_port4) || defined(__MSP430_HAS_PORT4__) || defined(__MSP430_HAS_PORT4_R__) Port40 = P40; Port41 = P41; Port42 = P42; Port43 = P43; Port44 = P44; Port45 = P45; Port46 = P46; Port47 = P47; #endif #if defined(__msp430_have_port5) || defined(__MSP430_HAS_PORT5__) || defined(__MSP430_HAS_PORT5_R__) Port50 = P50; Port51 = P51; Port52 = P52; Port53 = P53; Port54 = P54; Port55 = P55; Port56 = P56; Port57 = P57; #endif #if defined(__msp430_have_port6) || defined(__MSP430_HAS_PORT6__) || defined(__MSP430_HAS_PORT6_R__) Port60 = P60; Port61 = P61; Port62 = P62; Port63 = P63; Port64 = P64; Port65 = P65; Port66 = P66; Port67 = P67; #endif #ifdef __msp430x14x STE0 = P30; SIMO0 = P31; SOMI0 = P32; UCLK0 = P33; UTXD0 = P34; URXD0 = P35; STE1 = P50; SIMO1 = P51; SOMI1 = P52; UCLK1 = P53; UTXD1 = P36; URXD1 = P37; ADC0 = P60; ADC1 = P61; ADC2 = P62; ADC3 = P63; ADC4 = P64; ADC5 = P65; ADC6 = P66; ADC7 = P67; #endif #ifdef __msp430x16x STE0 = P30; SIMO0 = P31; SDA = P31; SOMI0 = P32; UCLK0 = P33; SCL = P33; UTXD0 = P34; URXD0 = P35; STE1 = P50; SIMO1 = P51; SOMI1 = P52; UCLK1 = P53; UTXD1 = P36; URXD1 = P37; ADC0 = P60; ADC1 = P61; ADC2 = P62; ADC3 = P63; ADC4 = P64; ADC5 = P65; ADC6 = P66; ADC7 = P67; DAC0 = P66; DAC1 = P67; SVSIN = P67; SVSOUT = P57; #endif #if defined(__msp430x261x) || defined(__msp430x26x) UCA0CLK = P30; UCA0STE = P33; UCA0TXD = P34; UCA0RXD = P35; UCA0SIMO = P34; UCA0SOMI = P35; UCB0CLK = P33; UCB0STE = P30; UCB0SIMO = P31; UCB0SOMI = P32; UCB0SDA = P31; UCB0SCL = P32; UCA1CLK = P50; UCA1STE = P53; UCA1TXD = P36; UCA1RXD = P37; UCA1SIMO = P36; UCA1SOMI = P37; UCB1CLK = P53; UCB1STE = P50; UCB1SIMO = P51; UCB1SOMI = P52; UCB1SDA = P51; UCB1SCL = P52; ADC0 = P60; ADC1 = P61; ADC2 = P62; ADC3 = P63; ADC4 = P64; ADC5 = P65; ADC6 = P66; ADC7 = P67; DAC0 = P66; DAC1 = P67; SVSIN = P67; SVSOUT = P57; #endif #if defined(__cc430x513x) || defined(__cc430x612x) || defined(__cc430x613x) /* Terminal functions mapped to port mapping mnemonics, per data * sheet table 3 */ RFGDO0 = P10; // default out RFGDO2 = P11; // default out UCB0SOMI = P12; // default in/out UCB0SCL = P12; // default in/out UCB0SIMO = P13; // default in/out UCB0SDA = P13; // default in/out UCB0CLK = P14; // default in/out UCA0STE = P14; // default in/out UCA0RXD = P15; // default in/out UCA0SOMI = P15; // default in/out UCA0TXD = P16; // default in/out UCA0SIMO = P16; // default in/out UCA0CLK = P17; // default in/out UCB0STE = P17; // default in/out CBOUT1 = P20; // default out TA1CLK = P20; // default in TA1CCR0A = P21; // default in/out TA1CCR1A = P22; // default in/out TA1CCR2A = P23; // default in/out RTCCLK = P24; // default out SVMOUT = P25; // default out ACLK = P26; // default out ADC12CLK = P27; // default out DMAE0 = P27; // default in CBOUT0 = P30; // default out TA0CLK = P30; // default in TA0CCR0A = P31; // defalut in/out TA0CCR1A = P32; // defalut in/out TA0CCR2A = P33; // defalut in/out TA0CCR3A = P34; // defalut in/out TA0CCR4A = P35; // defalut in/out RFGDO1 = P36; // default out SMCLK = P37; // default out // MCLK unassigned // MODCLK undefined // ANALOG unassigned #if defined(__cc430x513x) || defined(__cc430x613x) ADC0 = P20; // secondary ADC1 = P21; // secondary ADC2 = P22; // secondary ADC3 = P23; // secondary ADC4 = P24; // secondary ADC5 = P25; // secondary #if defined(__cc430x613x) ADC6 = P26; // secondary ADC7 = P27; // secondary #endif /* cc430x613x */ #endif /* cc430x513x || cc430x613x */ #endif /* cc430x513x || cc430x612x || cc430x613x */ } tinyos-2.1.2+dfsg/tos/chips/msp430/pins/HplMsp430GeneralIOP.nc000066400000000000000000000064161207233610700235240ustar00rootroot00000000000000 /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre */ #include "msp430regtypes.h" generic module HplMsp430GeneralIOP( unsigned int port_in_addr, unsigned int port_out_addr, unsigned int port_dir_addr, unsigned int port_sel_addr, uint8_t pin ) @safe() { provides interface HplMsp430GeneralIO as IO; } implementation { #define PORTxIN (*TCAST(volatile TYPE_PORT_IN* ONE, port_in_addr)) #define PORTx (*TCAST(volatile TYPE_PORT_OUT* ONE, port_out_addr)) #define PORTxDIR (*TCAST(volatile TYPE_PORT_DIR* ONE, port_dir_addr)) #define PORTxSEL (*TCAST(volatile TYPE_PORT_SEL* ONE, port_sel_addr)) async command void IO.set() { atomic PORTx |= (0x01 << pin); } async command void IO.clr() { atomic PORTx &= ~(0x01 << pin); } async command void IO.toggle() { atomic PORTx ^= (0x01 << pin); } async command uint8_t IO.getRaw() { return PORTxIN & (0x01 << pin); } async command bool IO.get() { return (call IO.getRaw() != 0); } async command void IO.makeInput() { atomic PORTxDIR &= ~(0x01 << pin); } async command bool IO.isInput() { return (PORTxDIR & (0x01 << pin)) == 0; } async command void IO.makeOutput() { atomic PORTxDIR |= (0x01 << pin); } async command bool IO.isOutput() { return (PORTxDIR & (0x01 << pin)) != 0; } async command void IO.selectModuleFunc() { atomic PORTxSEL |= (0x01 << pin); } async command bool IO.isModuleFunc() { return (PORTxSEL & (0x01< */ #include "msp430regtypes.h" generic module HplMsp430GeneralIORenP( unsigned int port_in_addr, unsigned int port_out_addr, unsigned int port_dir_addr, unsigned int port_sel_addr, unsigned int port_ren_addr, uint8_t pin ) @safe() { provides interface HplMsp430GeneralIO as IO; } implementation { #define PORTxIN (*TCAST(volatile TYPE_PORT_IN* ONE, port_in_addr)) #define PORTx (*TCAST(volatile TYPE_PORT_OUT* ONE, port_out_addr)) #define PORTxDIR (*TCAST(volatile TYPE_PORT_DIR* ONE, port_dir_addr)) #define PORTxSEL (*TCAST(volatile TYPE_PORT_SEL* ONE, port_sel_addr)) #define PORTxREN (*TCAST(volatile TYPE_PORT_REN* ONE, port_ren_addr)) async command void IO.set() { atomic PORTx |= (0x01 << pin); } async command void IO.clr() { atomic PORTx &= ~(0x01 << pin); } async command void IO.toggle() { atomic PORTx ^= (0x01 << pin); } async command uint8_t IO.getRaw() { return PORTxIN & (0x01 << pin); } async command bool IO.get() { return (call IO.getRaw() != 0); } async command void IO.makeInput() { atomic PORTxDIR &= ~(0x01 << pin); } async command bool IO.isInput() { return (PORTxDIR & (0x01 << pin)) == 0; } async command void IO.makeOutput() { atomic PORTxDIR |= (0x01 << pin); } async command bool IO.isOutput() { return (PORTxDIR & (0x01 << pin)) != 0; } async command void IO.selectModuleFunc() { atomic PORTxSEL |= (0x01 << pin); } async command bool IO.isModuleFunc() { return (PORTxSEL & (0x01<> 0) & 1; return b; } async command bool Port11.getValue() { bool b; atomic b=(P1IN >> 1) & 1; return b; } async command bool Port12.getValue() { bool b; atomic b=(P1IN >> 2) & 1; return b; } async command bool Port13.getValue() { bool b; atomic b=(P1IN >> 3) & 1; return b; } async command bool Port14.getValue() { bool b; atomic b=(P1IN >> 4) & 1; return b; } async command bool Port15.getValue() { bool b; atomic b=(P1IN >> 5) & 1; return b; } async command bool Port16.getValue() { bool b; atomic b=(P1IN >> 6) & 1; return b; } async command bool Port17.getValue() { bool b; atomic b=(P1IN >> 7) & 1; return b; } async command void Port10.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 0); else P1IES |= (1 << 0); } } async command void Port11.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 1); else P1IES |= (1 << 1); } } async command void Port12.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 2); else P1IES |= (1 << 2); } } async command void Port13.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 3); else P1IES |= (1 << 3); } } async command void Port14.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 4); else P1IES |= (1 << 4); } } async command void Port15.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 5); else P1IES |= (1 << 5); } } async command void Port16.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 6); else P1IES |= (1 << 6); } } async command void Port17.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 7); else P1IES |= (1 << 7); } } #endif #if defined(__msp430_have_port2) || defined(__MSP430_HAS_PORT2__) || defined(__MSP430_HAS_PORT2_R__) TOSH_SIGNAL(PORT2_VECTOR) { volatile int n = P2IFG & P2IE; if (n & (1 << 0)) { signal Port20.fired(); return; } if (n & (1 << 1)) { signal Port21.fired(); return; } if (n & (1 << 2)) { signal Port22.fired(); return; } if (n & (1 << 3)) { signal Port23.fired(); return; } if (n & (1 << 4)) { signal Port24.fired(); return; } if (n & (1 << 5)) { signal Port25.fired(); return; } if (n & (1 << 6)) { signal Port26.fired(); return; } if (n & (1 << 7)) { signal Port27.fired(); return; } } default async event void Port20.fired() { call Port20.clear(); } default async event void Port21.fired() { call Port21.clear(); } default async event void Port22.fired() { call Port22.clear(); } default async event void Port23.fired() { call Port23.clear(); } default async event void Port24.fired() { call Port24.clear(); } default async event void Port25.fired() { call Port25.clear(); } default async event void Port26.fired() { call Port26.clear(); } default async event void Port27.fired() { call Port27.clear(); } async command void Port20.enable() { P2IE |= (1 << 0); } async command void Port21.enable() { P2IE |= (1 << 1); } async command void Port22.enable() { P2IE |= (1 << 2); } async command void Port23.enable() { P2IE |= (1 << 3); } async command void Port24.enable() { P2IE |= (1 << 4); } async command void Port25.enable() { P2IE |= (1 << 5); } async command void Port26.enable() { P2IE |= (1 << 6); } async command void Port27.enable() { P2IE |= (1 << 7); } async command void Port20.disable() { P2IE &= ~(1 << 0); } async command void Port21.disable() { P2IE &= ~(1 << 1); } async command void Port22.disable() { P2IE &= ~(1 << 2); } async command void Port23.disable() { P2IE &= ~(1 << 3); } async command void Port24.disable() { P2IE &= ~(1 << 4); } async command void Port25.disable() { P2IE &= ~(1 << 5); } async command void Port26.disable() { P2IE &= ~(1 << 6); } async command void Port27.disable() { P2IE &= ~(1 << 7); } async command void Port20.clear() { P2IFG &= ~(1 << 0); } async command void Port21.clear() { P2IFG &= ~(1 << 1); } async command void Port22.clear() { P2IFG &= ~(1 << 2); } async command void Port23.clear() { P2IFG &= ~(1 << 3); } async command void Port24.clear() { P2IFG &= ~(1 << 4); } async command void Port25.clear() { P2IFG &= ~(1 << 5); } async command void Port26.clear() { P2IFG &= ~(1 << 6); } async command void Port27.clear() { P2IFG &= ~(1 << 7); } async command bool Port20.getValue() { bool b; atomic b=(P2IN >> 0) & 1; return b; } async command bool Port21.getValue() { bool b; atomic b=(P2IN >> 1) & 1; return b; } async command bool Port22.getValue() { bool b; atomic b=(P2IN >> 2) & 1; return b; } async command bool Port23.getValue() { bool b; atomic b=(P2IN >> 3) & 1; return b; } async command bool Port24.getValue() { bool b; atomic b=(P2IN >> 4) & 1; return b; } async command bool Port25.getValue() { bool b; atomic b=(P2IN >> 5) & 1; return b; } async command bool Port26.getValue() { bool b; atomic b=(P2IN >> 6) & 1; return b; } async command bool Port27.getValue() { bool b; atomic b=(P2IN >> 7) & 1; return b; } async command void Port20.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 0); else P2IES |= (1 << 0); } } async command void Port21.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 1); else P2IES |= (1 << 1); } } async command void Port22.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 2); else P2IES |= (1 << 2); } } async command void Port23.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 3); else P2IES |= (1 << 3); } } async command void Port24.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 4); else P2IES |= (1 << 4); } } async command void Port25.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 5); else P2IES |= (1 << 5); } } async command void Port26.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 6); else P2IES |= (1 << 6); } } async command void Port27.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 7); else P2IES |= (1 << 7); } } #endif } tinyos-2.1.2+dfsg/tos/chips/msp430/pins/Msp430GpioC.nc000066400000000000000000000050551207233610700221320ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the general-purpose I/O abstraction * for the TI MSP430 microcontroller. * * @author Joe Polastre * @see Please refer to TEP 117 for more information about this component and its * intended use. */ generic module Msp430GpioC() @safe() { provides interface GeneralIO; uses interface HplMsp430GeneralIO as HplGeneralIO; } implementation { async command void GeneralIO.set() { call HplGeneralIO.set(); } async command void GeneralIO.clr() { call HplGeneralIO.clr(); } async command void GeneralIO.toggle() { call HplGeneralIO.toggle(); } async command bool GeneralIO.get() { return call HplGeneralIO.get(); } async command void GeneralIO.makeInput() { call HplGeneralIO.makeInput(); } async command bool GeneralIO.isInput() { return call HplGeneralIO.isInput(); } async command void GeneralIO.makeOutput() { call HplGeneralIO.makeOutput(); } async command bool GeneralIO.isOutput() { return call HplGeneralIO.isOutput(); } } tinyos-2.1.2+dfsg/tos/chips/msp430/pins/Msp430InterruptC.nc000066400000000000000000000051631207233610700232300ustar00rootroot00000000000000 /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the GPIO interrupt abstraction for * the TI MSP430 microcontroller. * * @author Jonathan Hui * @author Joe Polastre * @see Please refer to TEP 117 for more information about this component and its * intended use. */ generic module Msp430InterruptC() @safe() { provides interface GpioInterrupt as Interrupt; uses interface HplMsp430Interrupt as HplInterrupt; } implementation { error_t enable( bool rising ) { atomic { call Interrupt.disable(); call HplInterrupt.edge( rising ); call HplInterrupt.enable(); } return SUCCESS; } async command error_t Interrupt.enableRisingEdge() { return enable( TRUE ); } async command error_t Interrupt.enableFallingEdge() { return enable( FALSE ); } async command error_t Interrupt.disable() { atomic { call HplInterrupt.disable(); call HplInterrupt.clear(); } return SUCCESS; } async event void HplInterrupt.fired() { call HplInterrupt.clear(); signal Interrupt.fired(); } } tinyos-2.1.2+dfsg/tos/chips/msp430/sensors/000077500000000000000000000000001207233610700204165ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/msp430/sensors/Msp430InternalTemperatureC.nc000066400000000000000000000046541207233610700257550ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Msp430InternalTemperatureC is the temperature sensor available on * the msp430-based platforms. * * To convert from ADC counts to temperature, convert to voltage by * dividing by 4096 and multiplying by Vref (1.5V). Then subtract * 0.986 from voltage and divide by 0.00355 to get degrees C. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:10 $ */ generic configuration Msp430InternalTemperatureC() { provides interface Read; provides interface ReadStream; } implementation { components new AdcReadClientC(); Read = AdcReadClientC; components new AdcReadStreamClientC(); ReadStream = AdcReadStreamClientC; components Msp430InternalTemperatureP; AdcReadClientC.AdcConfigure -> Msp430InternalTemperatureP; AdcReadStreamClientC.AdcConfigure -> Msp430InternalTemperatureP; } tinyos-2.1.2+dfsg/tos/chips/msp430/sensors/Msp430InternalTemperatureP.nc000066400000000000000000000042441207233610700257650ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "Msp430Adc12.h" module Msp430InternalTemperatureP { provides interface AdcConfigure; } implementation { const msp430adc12_channel_config_t config = { inch: TEMPERATURE_DIODE_CHANNEL, sref: REFERENCE_VREFplus_AVss, ref2_5v: REFVOLT_LEVEL_1_5, adc12ssel: SHT_SOURCE_ACLK, adc12div: SHT_CLOCK_DIV_1, sht: SAMPLE_HOLD_4_CYCLES, sampcon_ssel: SAMPCON_SOURCE_SMCLK, sampcon_id: SAMPCON_CLOCK_DIV_1 }; async command const msp430adc12_channel_config_t* AdcConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/tos/chips/msp430/sensors/Msp430InternalVoltageC.nc000066400000000000000000000050231207233610700250500ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Msp430InternalVoltageC is the voltage sensor available on the * msp430-based platforms. * * To convert from ADC counts to actual voltage, divide by 4096 and * multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:10 $ */ generic configuration Msp430InternalVoltageC() { provides interface Read; provides interface ReadStream; provides interface Resource; provides interface ReadNow; } implementation { components new AdcReadClientC(); Read = AdcReadClientC; components new AdcReadStreamClientC(); ReadStream = AdcReadStreamClientC; components Msp430InternalVoltageP; AdcReadClientC.AdcConfigure -> Msp430InternalVoltageP; AdcReadStreamClientC.AdcConfigure -> Msp430InternalVoltageP; components new AdcReadNowClientC(); Resource = AdcReadNowClientC; ReadNow = AdcReadNowClientC; AdcReadNowClientC.AdcConfigure -> Msp430InternalVoltageP; } tinyos-2.1.2+dfsg/tos/chips/msp430/sensors/Msp430InternalVoltageP.nc000066400000000000000000000042421207233610700250670ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "Msp430Adc12.h" module Msp430InternalVoltageP { provides interface AdcConfigure; } implementation { const msp430adc12_channel_config_t config = { inch: SUPPLY_VOLTAGE_HALF_CHANNEL, sref: REFERENCE_VREFplus_AVss, ref2_5v: REFVOLT_LEVEL_1_5, adc12ssel: SHT_SOURCE_ACLK, adc12div: SHT_CLOCK_DIV_1, sht: SAMPLE_HOLD_4_CYCLES, sampcon_ssel: SAMPCON_SOURCE_SMCLK, sampcon_id: SAMPCON_CLOCK_DIV_1 }; async command const msp430adc12_channel_config_t* AdcConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/000077500000000000000000000000001207233610700200425ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Alarm32khz16C.nc000066400000000000000000000043271207233610700225620ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Alarm32khzC is the alarm for async 32khz alarms * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ generic configuration Alarm32khz16C() { provides interface Init; provides interface Alarm; } implementation { components new Msp430Timer32khzC() as Msp430Timer; components new Msp430AlarmC(T32khz) as Msp430Alarm; Init = Msp430Alarm; Alarm = Msp430Alarm; Msp430Alarm.Msp430Timer -> Msp430Timer; Msp430Alarm.Msp430TimerControl -> Msp430Timer; Msp430Alarm.Msp430Compare -> Msp430Timer; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Alarm32khz32C.nc000066400000000000000000000043061207233610700225550ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Alarm32khzC is the alarm for async 32khz alarms * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ generic configuration Alarm32khz32C() { provides interface Init; provides interface Alarm; } implementation { components new Alarm32khz16C() as AlarmC; components Counter32khz32C as Counter; components new TransformAlarmC(T32khz,uint32_t,T32khz,uint16_t,0) as Transform; Init = AlarmC; Alarm = Transform; Transform.AlarmFrom -> AlarmC; Transform.Counter -> Counter; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/AlarmMicro16C.nc000066400000000000000000000037741207233610700226770ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ generic configuration AlarmMicro16C() { provides interface Init; provides interface Alarm; } implementation { components new Msp430TimerMicroC() as Msp430Timer; components new Msp430AlarmC(TMicro) as Msp430Alarm; Init = Msp430Alarm; Alarm = Msp430Alarm; Msp430Alarm.Msp430Timer -> Msp430Timer; Msp430Alarm.Msp430TimerControl -> Msp430Timer; Msp430Alarm.Msp430Compare -> Msp430Timer; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/AlarmMilli16C.nc000066400000000000000000000043261207233610700226660ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * AlarmMilliC is the alarm for async millisecond alarms * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ generic configuration AlarmMilli16C() { provides interface Init; provides interface Alarm; } implementation { components new Alarm32khz16C() as AlarmFrom; components CounterMilli16C as Counter; components new TransformAlarmC(TMilli,uint16_t,T32khz,uint16_t,5) as Transform; Init = AlarmFrom; Alarm = Transform; Transform.AlarmFrom -> AlarmFrom; Transform.Counter -> Counter; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/AlarmMilli32C.nc000066400000000000000000000043261207233610700226640ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * AlarmMilliC is the alarm for async millisecond alarms * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ generic configuration AlarmMilli32C() { provides interface Init; provides interface Alarm; } implementation { components new Alarm32khz16C() as AlarmFrom; components CounterMilli32C as Counter; components new TransformAlarmC(TMilli,uint32_t,T32khz,uint16_t,5) as Transform; Init = AlarmFrom; Alarm = Transform; Transform.AlarmFrom -> AlarmFrom; Transform.Counter -> Counter; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/AlarmSecond16C.nc000066400000000000000000000035061207233610700230320ustar00rootroot00000000000000 /* "Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /** * AlarmSecondC is the alarm for async one-second alarms * * @author Cory Sharp * @author Peter A. Bigot * @see Please refer to TEP 102 for more information about this component and its * intended use. * @note TSecond is an extension to TEP 102 with the obvious semantics. */ generic configuration AlarmSecond16C() { provides interface Init; provides interface Alarm; } implementation { components new Alarm32khz16C() as AlarmFrom; components CounterSecond16C as Counter; components new TransformAlarmC(TSecond,uint16_t,T32khz,uint16_t,15) as Transform; Init = AlarmFrom; Alarm = Transform; Transform.AlarmFrom -> AlarmFrom; Transform.Counter -> Counter; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/AlarmSecond32C.nc000066400000000000000000000035051207233610700230270ustar00rootroot00000000000000/* "Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /** * AlarmSecondC is the alarm for async one-second alarms * * @author Cory Sharp * @author Peter A. Bigot * @see Please refer to TEP 102 for more information about this component and its * intended use. * @note TSecond is an extension to TEP 102 with the obvious semantics. */ generic configuration AlarmSecond32C() { provides interface Init; provides interface Alarm; } implementation { components new Alarm32khz16C() as AlarmFrom; components CounterSecond32C as Counter; components new TransformAlarmC(TSecond,uint32_t,T32khz,uint16_t,15) as Transform; Init = AlarmFrom; Alarm = Transform; Transform.AlarmFrom -> AlarmFrom; Transform.Counter -> Counter; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/BusyWait32khzC.nc000066400000000000000000000040231207233610700231170ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration BusyWait32khzC { provides interface BusyWait; } implementation { components new BusyWaitCounterC(T32khz,uint16_t) , Msp430Counter32khzC ; BusyWait = BusyWaitCounterC; BusyWaitCounterC.Counter -> Msp430Counter32khzC; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/BusyWaitMicroC.nc000066400000000000000000000040231207233610700232270ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration BusyWaitMicroC { provides interface BusyWait; } implementation { components new BusyWaitCounterC(TMicro,uint16_t) , Msp430CounterMicroC ; BusyWait = BusyWaitCounterC; BusyWaitCounterC.Counter -> Msp430CounterMicroC; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Counter32khz16C.nc000066400000000000000000000037661207233610700231530ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Counter32khz16C provides at 16-bit counter at 32768 ticks per second. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration Counter32khz16C { provides interface Counter; } implementation { components Msp430Counter32khzC as CounterFrom; Counter = CounterFrom; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Counter32khz32C.nc000066400000000000000000000041721207233610700231410ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Counter32khz32C provides at 32-bit counter at 32768 ticks per second. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration Counter32khz32C { provides interface Counter; } implementation { components Msp430Counter32khzC as CounterFrom; components new TransformCounterC(T32khz,uint32_t,T32khz,uint16_t,0,uint16_t) as Transform; Counter = Transform; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/CounterMicro32C.nc000066400000000000000000000032531207233610700232500ustar00rootroot00000000000000 /* "Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /** * CounterMicro32C provides at 32-bit counter at 1048576 ticks per second. * * @author Cory Sharp * @author Peter A. Bigot * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration CounterMicro32C { provides interface Counter; } implementation { components Msp430CounterMicroC as CounterFrom; components new TransformCounterC(TMicro,uint32_t,TMicro,uint16_t,0,uint32_t) as Transform; Counter = Transform.Counter; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/CounterMilli16C.nc000066400000000000000000000042041207233610700232440ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * CounterMilli16C provides at 16-bit counter at 1024 ticks per second. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration CounterMilli16C { provides interface Counter; } implementation { components Msp430Counter32khzC as CounterFrom; components new TransformCounterC(TMilli,uint16_t,T32khz,uint16_t,5,uint8_t) as Transform; Counter = Transform.Counter; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/CounterMilli32C.nc000066400000000000000000000042051207233610700232430ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * CounterMilli32C provides at 32-bit counter at 1024 ticks per second. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration CounterMilli32C { provides interface Counter; } implementation { components Msp430Counter32khzC as CounterFrom; components new TransformCounterC(TMilli,uint32_t,T32khz,uint16_t,5,uint32_t) as Transform; Counter = Transform.Counter; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/CounterSecond16C.nc000066400000000000000000000033631207233610700234160ustar00rootroot00000000000000/* "Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /** * CounterSecond16C provides at 16-bit counter at one ticks per second. * * @author Cory Sharp * @author Peter A. Bigot * @see Please refer to TEP 102 for more information about this component and its * intended use. * @note TSecond is an extension to TEP 102 with the obvious semantics. */ configuration CounterSecond16C { provides interface Counter; } implementation { components Msp430Counter32khzC as CounterFrom; components new TransformCounterC(TSecond,uint16_t,T32khz,uint16_t,15,uint16_t) as Transform; Counter = Transform.Counter; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/CounterSecond32C.nc000066400000000000000000000033631207233610700234140ustar00rootroot00000000000000 /* "Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /** * CounterSecond32C provides at 32-bit counter at one tick per second. * * @author Cory Sharp * @author Peter A. Bigot * @see Please refer to TEP 102 for more information about this component and its * intended use. * @note TSecond is an extension to TEP 102 with the obvious semantics. */ configuration CounterSecond32C { provides interface Counter; } implementation { components Msp430Counter32khzC as CounterFrom; components new TransformCounterC(TSecond,uint32_t,T32khz,uint16_t,15,uint32_t) as Transform; Counter = Transform.Counter; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/GpioCaptureC.nc000066400000000000000000000054371207233610700227220ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui * @author Joe Polastre */ generic module GpioCaptureC() @safe() { provides interface GpioCapture as Capture; uses interface Msp430TimerControl; uses interface Msp430Capture; uses interface HplMsp430GeneralIO as GeneralIO; } implementation { error_t enableCapture( uint8_t mode ) { atomic { call Msp430TimerControl.disableEvents(); call GeneralIO.selectModuleFunc(); call Msp430TimerControl.clearPendingInterrupt(); call Msp430Capture.clearOverflow(); call Msp430TimerControl.setControlAsCapture( mode ); call Msp430TimerControl.enableEvents(); } return SUCCESS; } async command error_t Capture.captureRisingEdge() { return enableCapture( MSP430TIMER_CM_RISING ); } async command error_t Capture.captureFallingEdge() { return enableCapture( MSP430TIMER_CM_FALLING ); } async command void Capture.disable() { atomic { call Msp430TimerControl.disableEvents(); call GeneralIO.selectIOFunc(); } } async event void Msp430Capture.captured( uint16_t time ) { call Msp430TimerControl.clearPendingInterrupt(); call Msp430Capture.clearOverflow(); signal Capture.captured( time ); } } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/HilTimerMilliC.nc000066400000000000000000000050411207233610700231730ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HilTimerMilliC provides a parameterized interface to a virtualized * millisecond timer. TimerMilliC in tos/system/ uses this component to * allocate new timers. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration HilTimerMilliC { provides interface Init; provides interface Timer as TimerMilli[ uint8_t num ]; provides interface LocalTime; } implementation { components new AlarmMilli32C(); components new AlarmToTimerC(TMilli); components new VirtualizeTimerC(TMilli,uniqueCount(UQ_TIMER_MILLI)); components new CounterToLocalTimeC(TMilli); components CounterMilli32C; Init = AlarmMilli32C; TimerMilli = VirtualizeTimerC; LocalTime = CounterToLocalTimeC; VirtualizeTimerC.TimerFrom -> AlarmToTimerC; AlarmToTimerC.Alarm -> AlarmMilli32C; CounterToLocalTimeC.Counter -> CounterMilli32C; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/LocalTimeHybridMicroC.nc000066400000000000000000000040551207233610700245000ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ #include #include configuration LocalTimeHybridMicroC { provides interface LocalTime; } implementation { components Msp430HybridAlarmCounterC; components new TransformCounterC(TMicro, uint32_t, T2ghz, uint32_t, 11, uint32_t); components new CounterToLocalTimeC(TMicro); LocalTime = CounterToLocalTimeC; CounterToLocalTimeC.Counter -> TransformCounterC; TransformCounterC.CounterFrom -> Msp430HybridAlarmCounterC; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/LocalTimeMicroC.nc000066400000000000000000000041511207233610700233330ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ #include configuration LocalTimeMicroC { provides interface LocalTime; } implementation { #ifndef DISABLE_HYBRID_MICRO components LocalTimeHybridMicroC; LocalTime = LocalTimeHybridMicroC; #else components Msp430CounterMicroC; components new TransformCounterC(TMicro, uint32_t, TMicro, uint16_t, 0, uint32_t); components new CounterToLocalTimeC(TMicro); LocalTime = CounterToLocalTimeC; CounterToLocalTimeC.Counter -> TransformCounterC; TransformCounterC.CounterFrom -> Msp430CounterMicroC; #endif } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430AlarmC.nc000066400000000000000000000070351207233610700224370ustar00rootroot00000000000000//$Id: Msp430AlarmC.nc,v 1.6 2010-06-29 22:07:45 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Msp430Alarm is a generic component that wraps the MSP430 HPL timers and * compares into a TinyOS Alarm. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ generic module Msp430AlarmC(typedef frequency_tag) @safe() { provides interface Init; provides interface Alarm as Alarm; uses interface Msp430Timer; uses interface Msp430TimerControl; uses interface Msp430Compare; } implementation { command error_t Init.init() { call Msp430TimerControl.disableEvents(); call Msp430TimerControl.setControlAsCompare(); return SUCCESS; } async command void Alarm.start( uint16_t dt ) { call Alarm.startAt( call Alarm.getNow(), dt ); } async command void Alarm.stop() { call Msp430TimerControl.disableEvents(); } async event void Msp430Compare.fired() { call Msp430TimerControl.disableEvents(); signal Alarm.fired(); } async command bool Alarm.isRunning() { return call Msp430TimerControl.areEventsEnabled(); } async command void Alarm.startAt( uint16_t t0, uint16_t dt ) { atomic { uint16_t now = call Msp430Timer.get(); uint16_t elapsed = now - t0; if( elapsed >= dt ) { call Msp430Compare.setEventFromNow(2); } else { uint16_t remaining = dt - elapsed; if( remaining <= 2 ) call Msp430Compare.setEventFromNow(2); else call Msp430Compare.setEvent( now+remaining ); } call Msp430TimerControl.clearPendingInterrupt(); call Msp430TimerControl.enableEvents(); } } async command uint16_t Alarm.getNow() { return call Msp430Timer.get(); } async command uint16_t Alarm.getAlarm() { return call Msp430Compare.getEvent(); } async event void Msp430Timer.overflow() { } } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430Capture.nc000066400000000000000000000061241207233610700227010ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre */ #include "Msp430Timer.h" interface Msp430Capture { /** * Reads the value of the last capture event in TxCCRx */ async command uint16_t getEvent(); /** * Set the edge that the capture should occur * * @param cm Capture Mode for edge capture. * enums exist for: * MSP430TIMER_CM_NONE is no capture. * MSP430TIMER_CM_RISING is rising edge capture. * MSP430TIMER_CM_FALLING is a falling edge capture. * MSP430TIMER_CM_BOTH captures on both rising and falling edges. */ async command void setEdge(uint8_t cm); /** * Determine if a capture overflow is pending. * * @return TRUE if the capture register has overflowed */ async command bool isOverflowPending(); /** * Clear the capture overflow flag for when multiple captures occur */ async command void clearOverflow(); /** * Set whether the capture should occur synchronously or asynchronously. * TinyOS default is synchronous captures. * WARNING: if the capture signal is asynchronous to the timer clock, * it could case a race condition (see Timer documentation * in MSP430F1xx user guide) * @param synchronous TRUE to synchronize the timer capture with the * next timer clock instead of occurring asynchronously. */ async command void setSynchronous(bool synchronous); /** * Signalled when an event is captured. * * @param time The time of the capture event */ async event void captured(uint16_t time); } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430ClockC.nc000066400000000000000000000036351207233610700224400ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp */ configuration Msp430ClockC { provides interface Init; provides interface Msp430ClockInit; } implementation { components Msp430ClockP, Msp430TimerC, McuSleepC; Init = Msp430ClockP; Msp430ClockInit = Msp430ClockP; McuSleepC.McuPowerOverride -> Msp430ClockP; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430ClockInit.nc000066400000000000000000000037561207233610700231650ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp * @author Vlado Handziski */ interface Msp430ClockInit { event void setupDcoCalibrate(); event void initClocks(); event void initTimerA(); event void initTimerB(); command void defaultSetupDcoCalibrate(); command void defaultInitClocks(); command void defaultInitTimerA(); command void defaultInitTimerB(); } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430ClockP.nc000066400000000000000000000150171207233610700224520ustar00rootroot00000000000000//$Id: Msp430ClockP.nc,v 1.9 2010-06-29 22:07:45 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp * @author Vlado Handziski */ #include #include "Msp430Timer.h" module Msp430ClockP @safe() { provides interface Init; provides interface Msp430ClockInit; provides interface McuPowerOverride; } implementation { MSP430REG_NORACE(IE1); MSP430REG_NORACE(TACTL); MSP430REG_NORACE(TAIV); MSP430REG_NORACE(TBCTL); MSP430REG_NORACE(TBIV); enum { ACLK_CALIB_PERIOD = 8, TARGET_DCO_DELTA = (TARGET_DCO_KHZ / ACLK_KHZ) * ACLK_CALIB_PERIOD, }; async command mcu_power_t McuPowerOverride.lowestState() { return MSP430_POWER_LPM3; } command void Msp430ClockInit.defaultSetupDcoCalibrate() { // --- setup --- TACTL = TASSEL1 | MC1; // source SMCLK, continuous mode, everything else 0 TBCTL = TBSSEL0 | MC1; BCSCTL1 = XT2OFF | RSEL2; BCSCTL2 = 0; TBCCTL0 = CM0; } command void Msp430ClockInit.defaultInitClocks() { // BCSCTL1 // .XT2OFF = 1; disable the external oscillator for SCLK and MCLK // .XTS = 0; set low frequency mode for LXFT1 // .DIVA = 0; set the divisor on ACLK to 1 // .RSEL, do not modify BCSCTL1 = XT2OFF | (BCSCTL1 & (RSEL2|RSEL1|RSEL0)); // BCSCTL2 // .SELM = 0; select DCOCLK as source for MCLK // .DIVM = 0; set the divisor of MCLK to 1 // .SELS = 0; select DCOCLK as source for SCLK // .DIVS = 2; set the divisor of SCLK to 4 // .DCOR = 0; select internal resistor for DCO BCSCTL2 = DIVS1; // IE1.OFIE = 0; no interrupt for oscillator fault CLR_FLAG( IE1, OFIE ); } command void Msp430ClockInit.defaultInitTimerA() { TAR = 0; // TACTL // .TACLGRP = 0; each TACL group latched independently // .CNTL = 0; 16-bit counter // .TASSEL = 2; source SMCLK = DCO/4 // .ID = 0; input divisor of 1 // .MC = 0; initially disabled // .TACLR = 0; reset timer A // .TAIE = 1; enable timer A interrupts TACTL = TASSEL1 | TAIE; } command void Msp430ClockInit.defaultInitTimerB() { TBR = 0; // TBCTL // .TBCLGRP = 0; each TBCL group latched independently // .CNTL = 0; 16-bit counter // .TBSSEL = 1; source ACLK // .ID = 0; input divisor of 1 // .MC = 0; initially disabled // .TBCLR = 0; reset timer B // .TBIE = 1; enable timer B interrupts TBCTL = TBSSEL0 | TBIE; } default event void Msp430ClockInit.setupDcoCalibrate() { call Msp430ClockInit.defaultSetupDcoCalibrate(); } default event void Msp430ClockInit.initClocks() { call Msp430ClockInit.defaultInitClocks(); } default event void Msp430ClockInit.initTimerA() { call Msp430ClockInit.defaultInitTimerA(); } default event void Msp430ClockInit.initTimerB() { call Msp430ClockInit.defaultInitTimerB(); } void startTimerA() { // TACTL.MC = 2; continuous mode TACTL = MC1 | (TACTL & ~(MC1|MC0)); } void stopTimerA() { //TACTL.MC = 0; stop timer B TACTL = TACTL & ~(MC1|MC0); } void startTimerB() { // TBCTL.MC = 2; continuous mode TBCTL = MC1 | (TBCTL & ~(MC1|MC0)); } void stopTimerB() { //TBCTL.MC = 0; stop timer B TBCTL = TBCTL & ~(MC1|MC0); } void set_dco_calib( int calib ) { BCSCTL1 = (BCSCTL1 & ~0x07) | ((calib >> 8) & 0x07); DCOCTL = calib & 0xff; } uint16_t test_calib_busywait_delta( int calib ) { int8_t aclk_count = 2; uint16_t dco_prev = 0; uint16_t dco_curr = 0; set_dco_calib( calib ); while( aclk_count-- > 0 ) { TBCCR0 = TBR + ACLK_CALIB_PERIOD; // set next interrupt TBCCTL0 &= ~CCIFG; // clear pending interrupt while( (TBCCTL0 & CCIFG) == 0 ); // busy wait dco_prev = dco_curr; dco_curr = TAR; } return dco_curr - dco_prev; } // busyCalibrateDCO // Should take about 9ms if ACLK_CALIB_PERIOD=8. // DCOCTL and BCSCTL1 are calibrated when done. void busyCalibrateDco() { // --- variables --- int calib; int step; // --- calibrate --- // Binary search for RSEL,DCO,DCOMOD. // It's okay that RSEL isn't monotonic. for( calib=0,step=0x800; step!=0; step>>=1 ) { // if the step is not past the target, commit it if( test_calib_busywait_delta(calib|step) <= TARGET_DCO_DELTA ) calib |= step; } // if DCOx is 7 (0x0e0 in calib), then the 5-bit MODx is not useable, set it to 0 if( (calib & 0x0e0) == 0x0e0 ) calib &= ~0x01f; set_dco_calib( calib ); } command error_t Init.init() { // Reset timers and clear interrupt vectors TACTL = TACLR; TAIV = 0; TBCTL = TBCLR; TBIV = 0; atomic { signal Msp430ClockInit.setupDcoCalibrate(); busyCalibrateDco(); signal Msp430ClockInit.initClocks(); signal Msp430ClockInit.initTimerA(); signal Msp430ClockInit.initTimerB(); startTimerA(); startTimerB(); } return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430Compare.nc000066400000000000000000000036471207233610700226730ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp */ #include "Msp430Timer.h" interface Msp430Compare { async command uint16_t getEvent(); async command void setEvent( uint16_t time ); async command void setEventFromPrev( uint16_t delta ); async command void setEventFromNow( uint16_t delta ); async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430Counter32khzC.nc000066400000000000000000000041441207233610700237020ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Msp430Counter32khC provides the standard 32khz counter for the MSP430. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration Msp430Counter32khzC { provides interface Counter as Msp430Counter32khz; } implementation { components Msp430TimerC; components new Msp430CounterC(T32khz) as Counter; Msp430Counter32khz = Counter; Counter.Msp430Timer -> Msp430TimerC.TimerB; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430CounterC.nc000066400000000000000000000046021207233610700230170ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Msp430Counter is a generic component that wraps the MSP430 HPL timers into a * TinyOS Counter. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ generic module Msp430CounterC( typedef frequency_tag ) @safe() { provides interface Counter as Counter; uses interface Msp430Timer; } implementation { async command uint16_t Counter.get() { return call Msp430Timer.get(); } async command bool Counter.isOverflowPending() { return call Msp430Timer.isOverflowPending(); } async command void Counter.clearOverflow() { call Msp430Timer.clearOverflow(); } async event void Msp430Timer.overflow() { signal Counter.overflow(); } } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430CounterMicroC.nc000066400000000000000000000041571207233610700240160ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Msp430Counter32khC provides the standard 32khz counter for the MSP430. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration Msp430CounterMicroC { provides interface Counter as Msp430CounterMicro; } implementation { components Msp430TimerC , new Msp430CounterC(TMicro) as Counter ; Msp430CounterMicro = Counter; Counter.Msp430Timer -> Msp430TimerC.TimerA; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430DcoCalibC.nc000066400000000000000000000035321207233610700230410ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp */ configuration Msp430DcoCalibC { } implementation { components Msp430DcoCalibP, Msp430TimerC; Msp430DcoCalibP.TimerMicro -> Msp430TimerC.TimerA; Msp430DcoCalibP.Timer32khz -> Msp430TimerC.TimerB; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430DcoCalibP.nc000066400000000000000000000055301207233610700230560ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp */ #error "Msp430DcoCalibP is broken and will incorrectly adjust TimerA because it does not take into account MCU sleep." module Msp430DcoCalibP { uses interface Msp430Timer as TimerMicro; uses interface Msp430Timer as Timer32khz; } implementation { uint16_t m_prev; enum { TARGET_DELTA = 2048, // number of 32khz ticks during 65536 ticks at 1mhz MAX_DEVIATION = 7, // about 0.35% error }; // this gets executed 32 times a second async event void TimerMicro.overflow() { uint16_t now = call Timer32khz.get(); uint16_t delta = now - m_prev; m_prev = now; if( delta > (TARGET_DELTA+MAX_DEVIATION) ) { // too many 32khz ticks means the DCO is running too slow, speed it up if( DCOCTL < 0xe0 ) { DCOCTL++; } else if( (BCSCTL1 & 7) < 7 ) { BCSCTL1++; DCOCTL = 96; } } else if( delta < (TARGET_DELTA-MAX_DEVIATION) ) { // too few 32khz ticks means the DCO is running too fast, slow it down if( DCOCTL > 0 ) { DCOCTL--; } else if( (BCSCTL1 & 7) > 0 ) { BCSCTL1--; DCOCTL = 128; } } } async event void Timer32khz.overflow() { } } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430DcoSpec.h000066400000000000000000000045371207233610700224530ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Specify the target cpu clock speed of your platform by overriding this file. * * Be aware that tinyos relies on binary 4MHz, that is 4096 binary kHz. Some * platforms have an external high frequency oscilator to generate the SMCLK * (e.g. eyesIFX, and possibly future ZigBee compliant nodes). These * oscillators provide metric frequencies, but may not run in power down * modes. Here, we need to switch the SMCLK source, which is easier if * the external and thd DCO source frequency are the same. * * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) */ #ifndef MS430DCOSPEC_H #define MS430DCOSPEC_H #define TARGET_DCO_KHZ 4096 // the target DCO clock rate in binary kHz #define ACLK_KHZ 32 // the ACLK rate in binary kHz #endif tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430HybridAlarmCounter.h000066400000000000000000000034011207233610700246560ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ #ifndef __MSP430HYBRIDALARMCOUNTER_H__ #define __MSP430HYBRIDALARMCOUNTER_H__ typedef struct T2ghz { uint8_t dummy; } T2ghz; #endif /* __MSP430HYBRIDALARMCOUNTER_H__ */tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430HybridAlarmCounterC.nc000066400000000000000000000045451207233610700251440ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ #include configuration Msp430HybridAlarmCounterC { provides { interface Counter as Counter2ghz; interface Alarm as Alarm2ghz; } } implementation { components Msp430HybridAlarmCounterP ,McuSleepC ,Msp430CounterMicroC ,Msp430Counter32khzC ,new Alarm32khz16C() ,new AlarmMicro16C() ; Msp430HybridAlarmCounterP.Counter32khz -> Msp430Counter32khzC; Msp430HybridAlarmCounterP.CounterMicro -> Msp430CounterMicroC; Msp430HybridAlarmCounterP.Alarm32khz -> Alarm32khz16C; Msp430HybridAlarmCounterP.AlarmMicro -> AlarmMicro16C; Msp430HybridAlarmCounterP.McuPowerOverride <- McuSleepC; Msp430HybridAlarmCounterP.Counter2ghz = Counter2ghz; Msp430HybridAlarmCounterP.Alarm2ghz = Alarm2ghz; }tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430HybridAlarmCounterP.nc000066400000000000000000000167001207233610700251550ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ module Msp430HybridAlarmCounterP { uses { interface Counter as CounterMicro; interface Counter as Counter32khz; interface Alarm as AlarmMicro; interface Alarm as Alarm32khz; } provides { interface McuPowerOverride; interface Counter as Counter2ghz; interface Alarm as Alarm2ghz; } } implementation { norace uint32_t fireTime; /*------------------------- UTILITY FUNCTIONS -------------------------*/ inline uint16_t now32khz() { return call Counter32khz.get(); } inline uint16_t nowMicro() { return call CounterMicro.get(); } // return all three clock readings inline void now(uint16_t* t32khz, uint16_t* tMicro, uint32_t* t2ghz) { uint16_t eMicro; atomic { // now from 32khz *t32khz = now32khz(); // now from Micro *tMicro = nowMicro(); // wait until the 32khz clock ticks while(*t32khz == now32khz()); } // elapsed time since entering this function in Micro eMicro = nowMicro() - *tMicro; // hi byte of hybrid time is 32khz tick *t2ghz = (uint32_t)(*t32khz) << 16; // adjust with the elapsed micro time *t2ghz -= (uint32_t)eMicro << 11 ; } inline uint32_t now2ghz() { uint16_t t32khz, tMicro; uint32_t t2ghz; now(&t32khz, &tMicro, &t2ghz); return t2ghz; } /*------------------------- COUNTER -------------------------*/ /** * Return counter value. May take up to 32us to complete. * @return Current counter value. */ async command uint32_t Counter2ghz.get() { return now2ghz(); } /** * Return TRUE if an overflow event will occur after the outermost atomic * block is exits. FALSE otherwise. * @return Counter pending overflow status. */ async command bool Counter2ghz.isOverflowPending() { return call Counter32khz.isOverflowPending(); } /** * Cancel a pending overflow interrupt. */ async command void Counter2ghz.clearOverflow() { return call Counter32khz.clearOverflow(); } /** * T2ghz timer overflows when T32khz timer does. */ async event void Counter32khz.overflow() { signal Counter2ghz.overflow(); } async event void CounterMicro.overflow() {} default async event void Counter2ghz.overflow() {} /*------------------------- ALARM -------------------------*/ /** * Set a single-short alarm to some time units in the future. Replaces * any current alarm time. Equivalent to start(getNow(), dt). The * fired will be signaled when the alarm expires. * * @param dt Time until the alarm fires. */ async command void Alarm2ghz.start(uint32_t dt) { uint16_t tMicro, t32khz; uint32_t t2ghz; // read all clocks now(&t32khz, &tMicro, &t2ghz); // stop running alarms call Alarm2ghz.stop(); // absolute time of requested firing fireTime = t2ghz + dt; // if dt is close (less than 32 32khz ticks), set up Micro alarm if(dt < (1024ULL << 11)) { call AlarmMicro.startAt(tMicro, dt >> 11); } else { // set up 32khz alarm 8 ticks before it's time call Alarm32khz.startAt(t32khz, (dt >> 16) - 8); } } async event void Alarm32khz.fired() { uint16_t tMicro, t32khz; uint32_t t2ghz, dt; // read all clocks now(&t32khz, &tMicro, &t2ghz); // compute time to firing dt = fireTime - t2ghz; call AlarmMicro.startAt(tMicro, dt >> 11); } async event void AlarmMicro.fired() { // signal Alarm2ghz.fired signal Alarm2ghz.fired(); } /** * Cancel an alarm. Note that the fired event may have * already been signaled (even if your code has not yet started * executing). */ async command void Alarm2ghz.stop() { call Alarm32khz.stop(); call AlarmMicro.stop(); } default async event void Alarm2ghz.fired() {} /** * Check if alarm is running. Note that a FALSE return does not indicate * that the fired event will not be signaled (it may have * already started executing, but not reached your code yet). * * @return TRUE if the alarm is still running. */ async command bool Alarm2ghz.isRunning() { return call Alarm32khz.isRunning() || call AlarmMicro.isRunning(); } /** * Set a single-short alarm to time t0+dt. Replaces any current alarm * time. The fired will be signaled when the alarm expires. * Alarms set in the past will fire "soon". * *

      Because the current time may wrap around, it is possible to use * values of t0 greater than the getNow's result. These * values represent times in the past, i.e., the time at which getNow() * would last of returned that value. * * @param t0 Base time for alarm. * @param dt Alarm time as offset from t0. */ async command void Alarm2ghz.startAt(uint32_t t0, uint32_t dt) { uint16_t tMicro, t32khz; uint32_t t2ghz; // read all clocks now(&t32khz, &tMicro, &t2ghz); // stop running alarms call Alarm2ghz.stop(); // absolute time of requested firing fireTime = t0 + dt; // time till requested firing dt = fireTime - t2ghz; // if dt is close (less than 32 32khz ticks), set up Micro alarm if(dt < (1024ULL << 11)) { call AlarmMicro.startAt(tMicro, dt >> 11); } else { // set up 32khz alarm 8 ticks before it's time call Alarm32khz.startAt(t32khz, (dt >> 16) - 8); } } /** * Return the current time. * @return Current time. */ async command uint32_t Alarm2ghz.getNow(){ return now2ghz(); } /** * Return the time the currently running alarm will fire or the time that * the previously running alarm was set to fire. * @return Alarm time. */ async command uint32_t Alarm2ghz.getAlarm() { return fireTime; } async command mcu_power_t McuPowerOverride.lowestState() { if(call AlarmMicro.isRunning()) return MSP430_POWER_LPM0; // does LPM1 increase jitter??? else return MSP430_POWER_LPM3; } } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430Timer.h000066400000000000000000000077511207233610700222140ustar00rootroot00000000000000//$Id: Msp430Timer.h,v 1.5 2010-06-29 22:07:45 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ //@author Cory Sharp #ifndef _H_Msp430Timer_h #define _H_Msp430Timer_h enum { MSP430TIMER_CM_NONE = 0, MSP430TIMER_CM_RISING = 1, MSP430TIMER_CM_FALLING = 2, MSP430TIMER_CM_BOTH = 3, MSP430TIMER_STOP_MODE = 0, MSP430TIMER_UP_MODE = 1, MSP430TIMER_CONTINUOUS_MODE = 2, MSP430TIMER_UPDOWN_MODE = 3, MSP430TIMER_TACLK = 0, MSP430TIMER_TBCLK = 0, MSP430TIMER_ACLK = 1, MSP430TIMER_SMCLK = 2, MSP430TIMER_INCLK = 3, MSP430TIMER_CLOCKDIV_1 = 0, MSP430TIMER_CLOCKDIV_2 = 1, MSP430TIMER_CLOCKDIV_4 = 2, MSP430TIMER_CLOCKDIV_8 = 3, }; typedef struct { int ccifg : 1; // capture/compare interrupt flag int cov : 1; // capture overflow flag int out : 1; // output value int cci : 1; // capture/compare input value int ccie : 1; // capture/compare interrupt enable int outmod : 3; // output mode int cap : 1; // 1=capture mode, 0=compare mode int clld : 2; // compare latch load int scs : 1; // synchronize capture source int ccis : 2; // capture/compare input select: 0=CCIxA, 1=CCIxB, 2=GND, 3=VCC int cm : 2; // capture mode: 0=none, 1=rising, 2=falling, 3=both } msp430_compare_control_t; typedef struct { int taifg : 1; // timer A interrupt flag int taie : 1; // timer A interrupt enable int taclr : 1; // timer A clear: resets TAR, .id, and .mc int _unused0 : 1; // unused int mc : 2; // mode control: 0=stop, 1=up, 2=continuous, 3=up/down int id : 2; // input divisor: 0=/1, 1=/2, 2=/4, 3=/8 int tassel : 2; // timer A source select: 0=TxCLK, 1=ACLK, 2=SMCLK, 3=INCLK int _unused1 : 6; // unused } msp430_timer_a_control_t; typedef struct { int tbifg : 1; // timer B interrupt flag int tbie : 1; // timer B interrupt enable int tbclr : 1; // timer B clear: resets TAR, .id, and .mc int _unused0 : 1; // unused int mc : 2; // mode control: 0=stop, 1=up, 2=continuous, 3=up/down int id : 2; // input divisor: 0=/1, 1=/2, 2=/4, 3=/8 int tbssel : 2; // timer B source select: 0=TxCLK, 1=ACLK, 2=SMCLK, 3=INCLK int _unused1 : 1; // unused int cntl : 2; // counter length: 0=16-bit, 1=12-bit, 2=10-bit, 3=8-bit int tbclgrp : 2; // tbclx group: 0=independent, 1=0/12/34/56, 2=0/123/456, 3=all int _unused2 : 1; // unused } msp430_timer_b_control_t; #endif//_H_Msp430Timer_h tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430Timer.nc000066400000000000000000000045221207233610700223560ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp * @author Jan Hauer */ //@author Cory Sharp //@author Jan Hauer #include "Msp430Timer.h" interface Msp430Timer { async command uint16_t get(); async command bool isOverflowPending(); async command void clearOverflow(); async event void overflow(); async command void setMode( int mode ); async command int getMode(); async command void clear(); async command void enableEvents(); async command void disableEvents(); async command void setClockSource( uint16_t clockSource ); async command void setInputDivider( uint16_t inputDivider ); // partial timer management, add more commands here as appropriate } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430Timer32khzC.nc000066400000000000000000000040711207233610700233420ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp */ generic configuration Msp430Timer32khzC() { provides interface Msp430Timer; provides interface Msp430TimerControl; provides interface Msp430Compare; } implementation { components Msp430Timer32khzMapC as Map; enum { ALARM_ID = unique("Msp430Timer32khzMapC") }; Msp430Timer = Map.Msp430Timer[ ALARM_ID ]; Msp430TimerControl = Map.Msp430TimerControl[ ALARM_ID ]; Msp430Compare = Map.Msp430Compare[ ALARM_ID ]; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430Timer32khzMapC.nc000066400000000000000000000064161207233610700240050ustar00rootroot00000000000000//$Id: Msp430Timer32khzMapC.nc,v 1.5 2010-06-29 22:07:45 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Msp430Timer32khzMapC presents as paramaterized interfaces all of the 32khz * hardware timers on the MSP430 that are available for compile time allocation * by "new Alarm32khz16C()", "new AlarmMilli32C()", and so on. * * Platforms based on the MSP430 are encouraged to copy in and override this * file, presenting only the hardware timers that are available for allocation * on that platform. * * @author Cory Sharp */ configuration Msp430Timer32khzMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; Msp430Timer[0] = Msp430TimerC.TimerB; Msp430TimerControl[0] = Msp430TimerC.ControlB0; Msp430Compare[0] = Msp430TimerC.CompareB0; Msp430Timer[1] = Msp430TimerC.TimerB; Msp430TimerControl[1] = Msp430TimerC.ControlB1; Msp430Compare[1] = Msp430TimerC.CompareB1; Msp430Timer[2] = Msp430TimerC.TimerB; Msp430TimerControl[2] = Msp430TimerC.ControlB2; Msp430Compare[2] = Msp430TimerC.CompareB2; Msp430Timer[3] = Msp430TimerC.TimerB; Msp430TimerControl[3] = Msp430TimerC.ControlB3; Msp430Compare[3] = Msp430TimerC.CompareB3; Msp430Timer[4] = Msp430TimerC.TimerB; Msp430TimerControl[4] = Msp430TimerC.ControlB4; Msp430Compare[4] = Msp430TimerC.CompareB4; Msp430Timer[5] = Msp430TimerC.TimerB; Msp430TimerControl[5] = Msp430TimerC.ControlB5; Msp430Compare[5] = Msp430TimerC.CompareB5; Msp430Timer[6] = Msp430TimerC.TimerB; Msp430TimerControl[6] = Msp430TimerC.ControlB6; Msp430Compare[6] = Msp430TimerC.CompareB6; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430TimerC.nc000066400000000000000000000155121207233610700224620ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp */ configuration Msp430TimerC { provides interface Msp430Timer as TimerA; provides interface Msp430TimerControl as ControlA0; provides interface Msp430TimerControl as ControlA1; provides interface Msp430TimerControl as ControlA2; provides interface Msp430Compare as CompareA0; provides interface Msp430Compare as CompareA1; provides interface Msp430Compare as CompareA2; provides interface Msp430Capture as CaptureA0; provides interface Msp430Capture as CaptureA1; provides interface Msp430Capture as CaptureA2; provides interface Msp430Timer as TimerB; provides interface Msp430TimerControl as ControlB0; provides interface Msp430TimerControl as ControlB1; provides interface Msp430TimerControl as ControlB2; provides interface Msp430TimerControl as ControlB3; provides interface Msp430TimerControl as ControlB4; provides interface Msp430TimerControl as ControlB5; provides interface Msp430TimerControl as ControlB6; provides interface Msp430Compare as CompareB0; provides interface Msp430Compare as CompareB1; provides interface Msp430Compare as CompareB2; provides interface Msp430Compare as CompareB3; provides interface Msp430Compare as CompareB4; provides interface Msp430Compare as CompareB5; provides interface Msp430Compare as CompareB6; provides interface Msp430Capture as CaptureB0; provides interface Msp430Capture as CaptureB1; provides interface Msp430Capture as CaptureB2; provides interface Msp430Capture as CaptureB3; provides interface Msp430Capture as CaptureB4; provides interface Msp430Capture as CaptureB5; provides interface Msp430Capture as CaptureB6; } implementation { components new Msp430TimerP( TAIV_, TAR_, TACTL_, TAIFG, TACLR, TAIE, TASSEL0, TASSEL1, FALSE ) as Msp430TimerA , new Msp430TimerP( TBIV_, TBR_, TBCTL_, TBIFG, TBCLR, TBIE, TBSSEL0, TBSSEL1, TRUE ) as Msp430TimerB , new Msp430TimerCapComP( TACCTL0_, TACCR0_ ) as Msp430TimerA0 , new Msp430TimerCapComP( TACCTL1_, TACCR1_ ) as Msp430TimerA1 , new Msp430TimerCapComP( TACCTL2_, TACCR2_ ) as Msp430TimerA2 , new Msp430TimerCapComP( TBCCTL0_, TBCCR0_ ) as Msp430TimerB0 , new Msp430TimerCapComP( TBCCTL1_, TBCCR1_ ) as Msp430TimerB1 , new Msp430TimerCapComP( TBCCTL2_, TBCCR2_ ) as Msp430TimerB2 , new Msp430TimerCapComP( TBCCTL3_, TBCCR3_ ) as Msp430TimerB3 , new Msp430TimerCapComP( TBCCTL4_, TBCCR4_ ) as Msp430TimerB4 , new Msp430TimerCapComP( TBCCTL5_, TBCCR5_ ) as Msp430TimerB5 , new Msp430TimerCapComP( TBCCTL6_, TBCCR6_ ) as Msp430TimerB6 , Msp430TimerCommonP as Common ; // Timer A TimerA = Msp430TimerA.Timer; Msp430TimerA.Overflow -> Msp430TimerA.Event[5]; Msp430TimerA.VectorTimerX0 -> Common.VectorTimerA0; Msp430TimerA.VectorTimerX1 -> Common.VectorTimerA1; // Timer A0 ControlA0 = Msp430TimerA0.Control; CompareA0 = Msp430TimerA0.Compare; CaptureA0 = Msp430TimerA0.Capture; Msp430TimerA0.Timer -> Msp430TimerA.Timer; Msp430TimerA0.Event -> Msp430TimerA.Event[0]; // Timer A1 ControlA1 = Msp430TimerA1.Control; CompareA1 = Msp430TimerA1.Compare; CaptureA1 = Msp430TimerA1.Capture; Msp430TimerA1.Timer -> Msp430TimerA.Timer; Msp430TimerA1.Event -> Msp430TimerA.Event[1]; // Timer A2 ControlA2 = Msp430TimerA2.Control; CompareA2 = Msp430TimerA2.Compare; CaptureA2 = Msp430TimerA2.Capture; Msp430TimerA2.Timer -> Msp430TimerA.Timer; Msp430TimerA2.Event -> Msp430TimerA.Event[2]; // Timer B TimerB = Msp430TimerB.Timer; Msp430TimerB.Overflow -> Msp430TimerB.Event[7]; Msp430TimerB.VectorTimerX0 -> Common.VectorTimerB0; Msp430TimerB.VectorTimerX1 -> Common.VectorTimerB1; // Timer B0 ControlB0 = Msp430TimerB0.Control; CompareB0 = Msp430TimerB0.Compare; CaptureB0 = Msp430TimerB0.Capture; Msp430TimerB0.Timer -> Msp430TimerB.Timer; Msp430TimerB0.Event -> Msp430TimerB.Event[0]; // Timer B1 ControlB1 = Msp430TimerB1.Control; CompareB1 = Msp430TimerB1.Compare; CaptureB1 = Msp430TimerB1.Capture; Msp430TimerB1.Timer -> Msp430TimerB.Timer; Msp430TimerB1.Event -> Msp430TimerB.Event[1]; // Timer B2 ControlB2 = Msp430TimerB2.Control; CompareB2 = Msp430TimerB2.Compare; CaptureB2 = Msp430TimerB2.Capture; Msp430TimerB2.Timer -> Msp430TimerB.Timer; Msp430TimerB2.Event -> Msp430TimerB.Event[2]; // Timer B3 ControlB3 = Msp430TimerB3.Control; CompareB3 = Msp430TimerB3.Compare; CaptureB3 = Msp430TimerB3.Capture; Msp430TimerB3.Timer -> Msp430TimerB.Timer; Msp430TimerB3.Event -> Msp430TimerB.Event[3]; // Timer B4 ControlB4 = Msp430TimerB4.Control; CompareB4 = Msp430TimerB4.Compare; CaptureB4 = Msp430TimerB4.Capture; Msp430TimerB4.Timer -> Msp430TimerB.Timer; Msp430TimerB4.Event -> Msp430TimerB.Event[4]; // Timer B5 ControlB5 = Msp430TimerB5.Control; CompareB5 = Msp430TimerB5.Compare; CaptureB5 = Msp430TimerB5.Capture; Msp430TimerB5.Timer -> Msp430TimerB.Timer; Msp430TimerB5.Event -> Msp430TimerB.Event[5]; // Timer B6 ControlB6 = Msp430TimerB6.Control; CompareB6 = Msp430TimerB6.Compare; CaptureB6 = Msp430TimerB6.Capture; Msp430TimerB6.Timer -> Msp430TimerB.Timer; Msp430TimerB6.Event -> Msp430TimerB.Event[6]; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430TimerCapComP.nc000066400000000000000000000117161207233610700235640ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp */ #include "Msp430Timer.h" generic module Msp430TimerCapComP( uint16_t TxCCTLx_addr, uint16_t TxCCRx_addr ) @safe() { provides interface Msp430TimerControl as Control; provides interface Msp430Compare as Compare; provides interface Msp430Capture as Capture; uses interface Msp430Timer as Timer; uses interface Msp430TimerEvent as Event; } implementation { #define TxCCTLx (*TCAST(volatile TYPE_TACCTL0* ONE, TxCCTLx_addr)) #define TxCCRx (*TCAST(volatile TYPE_TACCR0* ONE, TxCCRx_addr)) typedef msp430_compare_control_t cc_t; DEFINE_UNION_CAST(CC2int,uint16_t,cc_t) DEFINE_UNION_CAST(int2CC,cc_t,uint16_t) uint16_t compareControl() { cc_t x = { cm : 1, // capture on rising edge ccis : 0, // capture/compare input select clld : 0, // TBCL1 loads on write to TBCCR1 cap : 0, // compare mode ccie : 0, // capture compare interrupt enable }; return CC2int(x); } uint16_t captureControl(uint8_t l_cm) { cc_t x = { cm : l_cm & 0x03, // capture on none, rising, falling or both edges ccis : 0, // capture/compare input select clld : 0, // TBCL1 loads on write to TBCCR1 cap : 1, // compare mode scs : 0, // non synchronous capture mode ccie : 0, // capture compare interrupt enable }; return CC2int(x); } async command cc_t Control.getControl() { return int2CC(TxCCTLx); } async command bool Control.isInterruptPending() { return TxCCTLx & CCIFG; } async command void Control.clearPendingInterrupt() { CLR_FLAG(TxCCTLx,CCIFG); } async command void Control.setControl( cc_t x ) { TxCCTLx = CC2int(x); } async command void Control.setControlAsCompare() { TxCCTLx = compareControl(); } async command void Control.setControlAsCapture( uint8_t cm ) { TxCCTLx = captureControl( cm ); } async command void Capture.setEdge(uint8_t cm) { cc_t t = call Control.getControl(); t.cm = cm & 0x03; TxCCTLx = CC2int(t); } async command void Capture.setSynchronous( bool sync ) { if( sync ) SET_FLAG( TxCCTLx, SCS ); else CLR_FLAG( TxCCTLx, SCS ); } async command void Control.enableEvents() { SET_FLAG( TxCCTLx, CCIE ); } async command void Control.disableEvents() { CLR_FLAG( TxCCTLx, CCIE ); } async command bool Control.areEventsEnabled() { return READ_FLAG( TxCCTLx, CCIE ); } async command uint16_t Compare.getEvent() { return TxCCRx; } async command uint16_t Capture.getEvent() { return TxCCRx; } async command void Compare.setEvent( uint16_t x ) { TxCCRx = x; } async command void Compare.setEventFromPrev( uint16_t x ) { TxCCRx += x; } async command void Compare.setEventFromNow( uint16_t x ) { TxCCRx = call Timer.get() + x; } async command bool Capture.isOverflowPending() { return READ_FLAG( TxCCTLx, COV ); } async command void Capture.clearOverflow() { CLR_FLAG( TxCCTLx, COV ); } async event void Event.fired() { if( (call Control.getControl()).cap ) signal Capture.captured( call Capture.getEvent() ); else signal Compare.fired(); } default async event void Capture.captured( uint16_t n ) { } default async event void Compare.fired() { } async event void Timer.overflow() { } } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430TimerCommonP.nc000066400000000000000000000010331207233610700236410ustar00rootroot00000000000000 module Msp430TimerCommonP @safe() { provides interface Msp430TimerEvent as VectorTimerA0; provides interface Msp430TimerEvent as VectorTimerA1; provides interface Msp430TimerEvent as VectorTimerB0; provides interface Msp430TimerEvent as VectorTimerB1; } implementation { TOSH_SIGNAL(TIMERA0_VECTOR) { signal VectorTimerA0.fired(); } TOSH_SIGNAL(TIMERA1_VECTOR) { signal VectorTimerA1.fired(); } TOSH_SIGNAL(TIMERB0_VECTOR) { signal VectorTimerB0.fired(); } TOSH_SIGNAL(TIMERB1_VECTOR) { signal VectorTimerB1.fired(); } } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430TimerControl.nc000066400000000000000000000046571207233610700237300ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp * @author Joe Polastre */ #include "Msp430Timer.h" interface Msp430TimerControl { async command msp430_compare_control_t getControl(); async command bool isInterruptPending(); async command void clearPendingInterrupt(); async command void setControl(msp430_compare_control_t control); async command void setControlAsCompare(); /** * Sets the timer in capture mode. * @param cm configures the capture to occur on none, rising, falling or rising_and_falling edges * Msp430Timer.h has convenience definitions: * MSP430TIMER_CM_NONE, MSP430TIMER_CM_RISING, MSP430TIMER_CM_FALLING, MSP430TIMER_CM_BOTH */ async command void setControlAsCapture(uint8_t cm); async command void enableEvents(); async command void disableEvents(); async command bool areEventsEnabled(); } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430TimerEvent.nc000066400000000000000000000033111207233610700233530ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp */ interface Msp430TimerEvent { async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430TimerMicroC.nc000066400000000000000000000040011207233610700234430ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ generic configuration Msp430TimerMicroC() { provides interface Msp430Timer; provides interface Msp430TimerControl; provides interface Msp430Compare; } implementation { components Msp430TimerMicroMapC as Map; enum { ALARM_ID = unique("Msp430TimerMicroMapC") }; Msp430Timer = Map.Msp430Timer[ ALARM_ID ]; Msp430TimerControl = Map.Msp430TimerControl[ ALARM_ID ]; Msp430Compare = Map.Msp430Compare[ ALARM_ID ]; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430TimerMicroMapC.nc000066400000000000000000000043401207233610700241070ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ configuration Msp430TimerMicroMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; Msp430Timer[0] = Msp430TimerC.TimerA; Msp430TimerControl[0] = Msp430TimerC.ControlA0; Msp430Compare[0] = Msp430TimerC.CompareA0; Msp430Timer[1] = Msp430TimerC.TimerA; Msp430TimerControl[1] = Msp430TimerC.ControlA1; Msp430Compare[1] = Msp430TimerC.CompareA1; Msp430Timer[2] = Msp430TimerC.TimerA; Msp430TimerControl[2] = Msp430TimerC.ControlA2; Msp430Compare[2] = Msp430TimerC.CompareA2; } tinyos-2.1.2+dfsg/tos/chips/msp430/timer/Msp430TimerP.nc000066400000000000000000000100161207233610700224710ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp */ #include "msp430regtypes.h" generic module Msp430TimerP( uint16_t TxIV_addr, uint16_t TxR_addr, uint16_t TxCTL_addr, uint16_t TxIFG, uint16_t TxCLR, uint16_t TxIE, uint16_t TxSSEL0, uint16_t TxSSEL1, bool isClockSourceAsync ) @safe() { provides interface Msp430Timer as Timer; provides interface Msp430TimerEvent as Event[uint8_t n]; uses interface Msp430TimerEvent as Overflow; uses interface Msp430TimerEvent as VectorTimerX0; uses interface Msp430TimerEvent as VectorTimerX1; } implementation { #define TxIV (*TCAST(volatile TYPE_TAIV* ONE, TxIV_addr)) #define TxR (*TCAST(volatile TYPE_TAR* ONE, TxR_addr)) #define TxCTL (*TCAST(volatile TYPE_TACTL* ONE, TxCTL_addr)) async command uint16_t Timer.get() { // CSS 10 Feb 2006: Brano Kusy notes MSP430 User's Guide, Section 12.2.1, // Note says reading a counter may return garbage if its clock source is // async. The noted work around is to take a majority vote. if( isClockSourceAsync ) { atomic { uint16_t t0; uint16_t t1=TxR; do { t0=t1; t1=TxR; } while( t0 != t1 ); return t1; } } else { return TxR; } } async command bool Timer.isOverflowPending() { return TxCTL & TxIFG; } async command void Timer.clearOverflow() { CLR_FLAG(TxCTL,TxIFG); } async command void Timer.setMode( int mode ) { TxCTL = (TxCTL & ~(MC1|MC0)) | ((mode<<4) & (MC1|MC0)); } async command int Timer.getMode() { return (TxCTL & (MC1|MC0)) >> 4; } async command void Timer.clear() { TxCTL |= TxCLR; } async command void Timer.enableEvents() { TxCTL |= TxIE; } async command void Timer.disableEvents() { TxCTL &= ~TxIE; } async command void Timer.setClockSource( uint16_t clockSource ) { TxCTL = (TxCTL & ~(TxSSEL0|TxSSEL1)) | ((clockSource << 8) & (TxSSEL0|TxSSEL1)); } async command void Timer.setInputDivider( uint16_t inputDivider ) { TxCTL = (TxCTL & ~(ID0|ID1)) | ((inputDivider << 6) & (ID0|ID1)); } async event void VectorTimerX0.fired() { signal Event.fired[0](); } async event void VectorTimerX1.fired() { uint8_t n = TxIV; signal Event.fired[ n >> 1 ](); } async event void Overflow.fired() { signal Timer.overflow(); } default async event void Timer.overflow() { } default async event void Event.fired[uint8_t n]() { } } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/000077500000000000000000000000001207233610700200605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/msp430/usart/HplMsp430I2C.nc000066400000000000000000000054001207233610700223310ustar00rootroot00000000000000 #include interface HplMsp430I2C { async command bool isI2C(); async command void clearModeI2C(); async command void setModeI2C( msp430_i2c_union_config_t* config ); // U0CTL async command void setMasterMode(); async command void setSlaveMode(); async command void enableI2C(); async command void disableI2C(); // I2CTCTL async command bool getWordMode(); async command void setWordMode( bool mode ); async command bool getRepeatMode(); async command void setRepeatMode( bool mode ); async command uint8_t getClockSource(); async command void setClockSource( uint8_t src ); async command bool getTransmitReceiveMode(); async command void setTransmitMode(); async command void setReceiveMode(); async command bool getStartByte(); async command void setStartByte(); async command bool getStopBit(); async command void setStopBit(); async command bool getStartBit(); async command void setStartBit(); // I2CDR async command uint8_t getData(); async command void setData( uint8_t data ); // I2CNDAT async command uint8_t getTransferByteCount(); async command void setTransferByteCount( uint8_t count ); // I2CPSC async command uint8_t getClockPrescaler(); async command void setClockPrescaler( uint8_t scaler ); // I2CSCLH and I2CSCLL async command uint16_t getShiftClock(); async command void setShiftClock( uint16_t shift ); // I2COA async command uint16_t getOwnAddress(); async command void setOwnAddress( uint16_t addr ); // I2CSA async command uint16_t getSlaveAddress(); async command void setSlaveAddress( uint16_t addr ); // I2CIE async command void disableStartDetect(); async command void enableStartDetect(); async command void disableGeneralCall(); async command void enableGeneralCall(); async command void disableTransmitReady(); async command void enableTransmitReady(); async command void disableReceiveReady(); async command void enableReceiveReady(); async command void disableAccessReady(); async command void enableAccessReady(); async command void disableOwnAddress(); async command void enableOwnAddress(); async command void disableNoAck(); async command void enableNoAck(); async command void disableArbitrationLost(); async command void enableArbitrationLost(); // I2CIFG async command bool isStartDetectPending(); async command bool isGeneralCallPending(); async command bool isTransmitReadyPending(); async command bool isReceiveReadyPending(); async command bool isAccessReadyPending(); async command bool isOwnAddressPending(); async command bool isNoAckPending(); async command bool isArbitrationLostPending(); // I2CIV async command uint8_t getIV(); } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/HplMsp430I2C0C.nc000066400000000000000000000005741207233610700225230ustar00rootroot00000000000000 configuration HplMsp430I2C0C { provides interface HplMsp430I2C; } implementation { components HplMsp430I2C0P as HplI2CP; HplMsp430I2C = HplI2CP; components HplMsp430Usart0P as HplUsartP; HplUsartP.HplI2C -> HplI2CP; HplI2CP.HplUsart -> HplUsartP; components HplMsp430GeneralIOC as GIO; HplI2CP.SIMO -> GIO.SIMO0; HplI2CP.UCLK -> GIO.UCLK0; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/HplMsp430I2C0P.nc000066400000000000000000000176411207233610700225430ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2008-06-24 05:32:31 $ */ module HplMsp430I2C0P @safe() { provides interface HplMsp430I2C as HplI2C; uses interface HplMsp430Usart as HplUsart; uses interface HplMsp430GeneralIO as SIMO; uses interface HplMsp430GeneralIO as UCLK; } implementation { MSP430REG_NORACE(U0CTL); MSP430REG_NORACE(I2CTCTL); MSP430REG_NORACE(I2CDR); MSP430REG_NORACE(I2CSA); MSP430REG_NORACE(I2CIE); async command bool HplI2C.isI2C() { atomic return ((U0CTL & I2C) && (U0CTL & SYNC) && (U0CTL & I2CEN)); } async command void HplI2C.clearModeI2C() { atomic { U0CTL &= ~(I2C | SYNC | I2CEN); call HplUsart.resetUsart(TRUE); } } async command void HplI2C.setModeI2C( msp430_i2c_union_config_t* config ) { call HplUsart.resetUsart(TRUE); call HplUsart.disableUart(); call HplUsart.disableSpi(); call SIMO.makeInput(); call SIMO.selectModuleFunc(); call UCLK.makeInput(); call UCLK.selectModuleFunc(); atomic { U0CTL &= ~(I2C | I2CEN | SYNC); U0CTL = SWRST; U0CTL |= SYNC | I2C; U0CTL &= ~I2CEN; U0CTL = (config->i2cRegisters.uctl | (I2C | SYNC)) & ~I2CEN; I2CTCTL = 0x01; // resetting I2CTCTL first, // before configuring it, // for some reason causes the I2C module to // work after SPI has been used (Issue 14) I2CTCTL = config->i2cRegisters.i2ctctl; I2CPSC = config->i2cRegisters.i2cpsc; I2CSCLH = config->i2cRegisters.i2csclh; I2CSCLL = config->i2cRegisters.i2cscll; I2COA = config->i2cRegisters.i2coa; U0CTL |= I2CEN; } } // U0CTL async command void HplI2C.setMasterMode() { U0CTL |= MST; } async command void HplI2C.setSlaveMode() { U0CTL &= ~MST; } async command void HplI2C.enableI2C() { U0CTL |= I2CEN; } async command void HplI2C.disableI2C() { U0CTL &= ~I2CEN; } // I2CTCTL async command bool HplI2C.getWordMode() { return ( I2CTCTL & I2CWORD ) != 0; } async command void HplI2C.setWordMode( bool mode ) { I2CTCTL |= ( mode & 0x1 ) << 7; } async command bool HplI2C.getRepeatMode() { return ( I2CTCTL & I2CRM ) != 0; } async command void HplI2C.setRepeatMode( bool mode ) { I2CTCTL |= ( mode & 0x1 ) << 6;; } async command uint8_t HplI2C.getClockSource() { return ( I2CTCTL >> 4 ) & 0x3;; } async command void HplI2C.setClockSource( uint8_t src ) { atomic I2CTCTL = ( ( src & 0x3 ) << 4 ) | I2CTCTL; } async command bool HplI2C.getTransmitReceiveMode() { return ( I2CTCTL & I2CTRX ) != 0; } async command void HplI2C.setTransmitMode() { I2CTCTL |= I2CTRX; } async command void HplI2C.setReceiveMode() { I2CTCTL &= ~I2CTRX; } async command bool HplI2C.getStartByte() { return (I2CTCTL & I2CSTB) != 0; } async command void HplI2C.setStartByte() { I2CTCTL |= I2CSTB; } async command bool HplI2C.getStopBit() { return (I2CTCTL & I2CSTP) != 0; } async command void HplI2C.setStopBit() { I2CTCTL |= I2CSTP; } async command bool HplI2C.getStartBit() { return (I2CTCTL & I2CSTT) != 0; } async command void HplI2C.setStartBit() { I2CTCTL |= I2CSTT; } // I2CDR async command uint8_t HplI2C.getData() { return I2CDR; } async command void HplI2C.setData( uint8_t v ) { I2CDR = v; } // I2CNDAT async command uint8_t HplI2C.getTransferByteCount() { return I2CNDAT; } async command void HplI2C.setTransferByteCount( uint8_t v ) { I2CNDAT = v; } // I2CPSC async command uint8_t HplI2C.getClockPrescaler() { return I2CPSC; } async command void HplI2C.setClockPrescaler( uint8_t v ) { I2CPSC = v; } // I2CSCLH and I2CSCLL async command uint16_t HplI2C.getShiftClock() { uint16_t shift; atomic { shift = I2CSCLH; shift <<= 8; shift |= I2CSCLL; } return shift; } async command void HplI2C.setShiftClock( uint16_t shift ) { atomic { I2CSCLH = shift >> 8; I2CSCLL = shift; } } // I2COA async command uint16_t HplI2C.getOwnAddress() { return I2COA; } async command void HplI2C.setOwnAddress( uint16_t addr ) { I2COA = addr; } // I2CSA async command uint16_t HplI2C.getSlaveAddress() { return I2CSA; } async command void HplI2C.setSlaveAddress( uint16_t addr ) { I2CSA = addr; } // I2CIE async command void HplI2C.disableStartDetect() { I2CIE &= ~STTIE; } async command void HplI2C.enableStartDetect() { I2CIE |= STTIE; } async command void HplI2C.disableGeneralCall() { I2CIE &= ~GCIE; } async command void HplI2C.enableGeneralCall() { I2CIE |= GCIE; } async command void HplI2C.disableTransmitReady() { I2CIE &= ~TXRDYIE; } async command void HplI2C.enableTransmitReady() { I2CIE |= TXRDYIE; } async command void HplI2C.disableReceiveReady() { I2CIE &= ~RXRDYIE; } async command void HplI2C.enableReceiveReady() { I2CIE |= RXRDYIE; } async command void HplI2C.disableAccessReady() { I2CIE &= ~ARDYIE; } async command void HplI2C.enableAccessReady() { I2CIE |= ARDYIE; } async command void HplI2C.disableOwnAddress() { I2CIE &= ~OAIE; } async command void HplI2C.enableOwnAddress() { I2CIE |= OAIE; } async command void HplI2C.disableNoAck() { I2CIE &= ~NACKIE; } async command void HplI2C.enableNoAck() { I2CIE |= NACKIE; } async command void HplI2C.disableArbitrationLost() { I2CIE &= ~ALIE; } async command void HplI2C.enableArbitrationLost() { I2CIE |= ALIE; } // I2CIFG async command bool HplI2C.isStartDetectPending() { return ( I2CIFG & STTIFG ) != 0; } async command bool HplI2C.isGeneralCallPending() { return ( I2CIFG & GCIFG ) != 0; } async command bool HplI2C.isTransmitReadyPending() { return ( I2CIFG & TXRDYIFG ) != 0; } async command bool HplI2C.isReceiveReadyPending() { return ( I2CIFG & RXRDYIFG ) != 0; } async command bool HplI2C.isAccessReadyPending() { return ( I2CIFG & ARDYIFG ) != 0; } async command bool HplI2C.isOwnAddressPending() { return ( I2CIFG & OAIFG ) != 0; } async command bool HplI2C.isNoAckPending() { return ( I2CIFG & NACKIFG ) != 0; } async command bool HplI2C.isArbitrationLostPending() { return ( I2CIFG & ALIFG ) != 0; } // I2CIV async command uint8_t HplI2C.getIV() { return I2CIV; } } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/HplMsp430I2CInterrupts.nc000066400000000000000000000033641207233610700244400ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:11 $ */ interface HplMsp430I2CInterrupts { async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/HplMsp430Usart.nc000066400000000000000000000144041207233610700230560ustar00rootroot00000000000000/* * Copyright (c) 2004-2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Byte-level interface to control a USART. *

      The USART can be switched to SPI- or UART-mode. The interface follows * the convention of being stateless, thus a higher layer has to maintain * state information. I.e. calling tx will transmit a byte of * data in the mode (SPI or UART) the USART has been set to before. * * @author Vlado Handziski (handzisk@tkn.tu-berlin.de) * @author Jan Hauer (hauer@tkn.tu-berlin.de) * @author Joe Polastre * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:11 $ */ #include "msp430usart.h" interface HplMsp430Usart { /** * Sets the UxCTL Control Register */ async command void setUctl(msp430_uctl_t control); /** * Reads the UxCTL Control Register */ async command msp430_uctl_t getUctl(); /** * Sets the UxTCTL Transmit Control Register */ async command void setUtctl(msp430_utctl_t control); /** * Reads the UxTCTL Transmit Control Register */ async command msp430_utctl_t getUtctl(); /** * Sets the UxRCTL Receive Control Register */ async command void setUrctl(msp430_urctl_t control); /** * Reads the UxRCTL Receive Control Register */ async command msp430_urctl_t getUrctl(); /** * Sets the UxBR0 and UxBR1 Baud Rate Control Registers */ async command void setUbr(uint16_t ubr); /** * Reads the UxBR0 and UxBR1 Baud Rate Control Registers */ async command uint16_t getUbr(); /** * Sets the UxMCTL Modulation Control Register */ async command void setUmctl(uint8_t umctl); /** * Reads the UxMCTL Modulation Control Register */ async command uint8_t getUmctl(); async command void resetUsart(bool reset); /** * Returns an enum value corresponding to the current mode of the * USART module. */ async command msp430_usartmode_t getMode(); /** * Returns TRUE if the USART has Uart TX mode enabled */ async command bool isUartTx(); /** * Returns TRUE if the USART has Uart RX mode enabled */ async command bool isUartRx(); /** * Returns TRUE if the USART is set to Uart mode (both RX and TX) */ async command bool isUart(); /** * Enables both the Rx and the Tx Uart modules. */ async command void enableUart(); /** * Disables both the Rx and the Tx Uart modules. */ async command void disableUart(); /** * Enables the Uart TX functionality of the USART module. */ async command void enableUartTx(); /** * Disables the Uart TX module. */ async command void disableUartTx(); /** * Enables the Uart RX functionality of the USART module. */ async command void enableUartRx(); /** * Disables the Uart RX module. */ async command void disableUartRx(); /** * Enables the USART when in Spi mode. */ async command void enableSpi(); /** * Disables the USART when in Spi mode. */ async command void disableSpi(); /** * Returns TRUE if the USART is set to Spi mode */ async command bool isSpi(); /** * Switches USART to Spi mode. */ async command void setModeSpi(msp430_spi_union_config_t* config); /** * Switches USART to Uart mode (RX and TX enabled) * Interrupts disabled by default. */ async command void setModeUart(msp430_uart_union_config_t* config); /* Dis/enabling of UTXIFG / URXIFG */ async command void disableRxIntr(); async command void disableTxIntr(); async command void disableIntr(); async command void enableRxIntr(); async command void enableTxIntr(); async command void enableIntr(); /** * TRUE if TX interrupt pending, flag must be cleared explicitly */ async command bool isTxIntrPending(); /** * TRUE if RX interrupt pending, flag must be cleared explicitly */ async command bool isRxIntrPending(); /** * Clears RX interrupt pending flag */ async command void clrRxIntr(); /** * Clears TX interrupt pending flag */ async command void clrTxIntr(); /** * Clears both TX and RX interrupt pending flags */ async command void clrIntr(); /** * SUCCESS if the TX buffer is empty and all of the bits have been * shifted out */ async command bool isTxEmpty(); /** * Transmit a byte of data. When the transmission is completed, * txDone is generated. Only then a new byte may be * transmitted, otherwise the previous byte will be overwritten. * The mode of transmission (Uart or Spi) depends on the current * state of the USART, which must be managed by a higher layer. * * @return SUCCESS always. */ async command void tx(uint8_t data); /** * Get current value from RX-buffer. * * @return SUCCESS always. */ async command uint8_t rx(); } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/HplMsp430Usart0C.nc000066400000000000000000000076111207233610700232430ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * An HPL abstraction of USART0 on the MSP430. * * @author Jonathan Hui * @author Joe Polastre * @version $Revision: 1.7 $ $Date: 2010-06-29 22:07:45 $ */ #include "msp430usart.h" configuration HplMsp430Usart0C { provides interface HplMsp430Usart; provides interface HplMsp430UsartInterrupts; provides interface HplMsp430I2CInterrupts; } implementation { components HplMsp430Usart0P as HplUsartP; HplMsp430Usart = HplUsartP; HplMsp430UsartInterrupts = HplUsartP; HplMsp430I2CInterrupts = HplUsartP; components HplMsp430GeneralIOC as GIO; HplUsartP.SIMO -> GIO.SIMO0; HplUsartP.SOMI -> GIO.SOMI0; HplUsartP.UCLK -> GIO.UCLK0; HplUsartP.URXD -> GIO.URXD0; HplUsartP.UTXD -> GIO.UTXD0; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/HplMsp430Usart0P.nc000066400000000000000000000255541207233610700232660ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Copyright (c) 2004-2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "msp430usart.h" /** * Implementation of USART0 lowlevel functionality - stateless. * Setting a mode will by default disable USART-Interrupts. * * @author: Jan Hauer * @author: Jonathan Hui * @author: Vlado Handziski * @author: Joe Polastre * @author: Philipp Huppertz * @version $Revision: 1.8 $ $Date: 2010-06-04 22:30:21 $ */ module HplMsp430Usart0P @safe() { provides interface HplMsp430Usart as Usart; provides interface HplMsp430UsartInterrupts as Interrupts; provides interface HplMsp430I2CInterrupts as I2CInterrupts; uses interface HplMsp430I2C as HplI2C; uses interface HplMsp430GeneralIO as SIMO; uses interface HplMsp430GeneralIO as SOMI; uses interface HplMsp430GeneralIO as UCLK; uses interface HplMsp430GeneralIO as URXD; uses interface HplMsp430GeneralIO as UTXD; } implementation { MSP430REG_NORACE(IE1); MSP430REG_NORACE(ME1); MSP430REG_NORACE(IFG1); MSP430REG_NORACE(U0TCTL); MSP430REG_NORACE(U0RCTL); MSP430REG_NORACE(U0TXBUF); TOSH_SIGNAL(UART0RX_VECTOR) { uint8_t temp = U0RXBUF; signal Interrupts.rxDone(temp); } TOSH_SIGNAL(UART0TX_VECTOR) { if ( call HplI2C.isI2C() ) signal I2CInterrupts.fired(); else signal Interrupts.txDone(); } async command void Usart.setUctl(msp430_uctl_t control) { U0CTL=uctl2int(control); } async command msp430_uctl_t Usart.getUctl() { return int2uctl(U0CTL); } async command void Usart.setUtctl(msp430_utctl_t control) { U0TCTL=utctl2int(control); } async command msp430_utctl_t Usart.getUtctl() { return int2utctl(U0TCTL); } async command void Usart.setUrctl(msp430_urctl_t control) { U0RCTL=urctl2int(control); } async command msp430_urctl_t Usart.getUrctl() { return int2urctl(U0RCTL); } async command void Usart.setUbr(uint16_t control) { atomic { U0BR0 = control & 0x00FF; U0BR1 = (control >> 8) & 0x00FF; } } async command uint16_t Usart.getUbr() { return (U0BR1 << 8) + U0BR0; } async command void Usart.setUmctl(uint8_t control) { U0MCTL=control; } async command uint8_t Usart.getUmctl() { return U0MCTL; } async command void Usart.resetUsart(bool reset) { if (reset) { U0CTL = SWRST; } else { CLR_FLAG(U0CTL, SWRST); } } async command bool Usart.isSpi() { atomic { return (U0CTL & SYNC) && (ME1 & USPIE0); } } async command bool Usart.isUart() { atomic { return !(U0CTL & SYNC) && ((ME1 & UTXE0) && (ME1 & URXE0)); } } async command bool Usart.isUartTx() { atomic { return !(U0CTL & SYNC) && (ME1 & UTXE0); } } async command bool Usart.isUartRx() { atomic { return !(U0CTL & SYNC) && (ME1 & URXE0); } } async command msp430_usartmode_t Usart.getMode() { if (call Usart.isUart()) return USART_UART; else if (call Usart.isUartRx()) return USART_UART_RX; else if (call Usart.isUartTx()) return USART_UART_TX; else if (call Usart.isSpi()) return USART_SPI; else if (call HplI2C.isI2C()) return USART_I2C; else return USART_NONE; } async command void Usart.enableUart() { atomic{ call UTXD.selectModuleFunc(); call URXD.selectModuleFunc(); } ME1 |= (UTXE0 | URXE0); // USART0 UART module enable } async command void Usart.disableUart() { atomic { ME1 &= ~(UTXE0 | URXE0); // USART0 UART module enable call UTXD.selectIOFunc(); call URXD.selectIOFunc(); } } async command void Usart.enableUartTx() { call UTXD.selectModuleFunc(); ME1 |= UTXE0; // USART0 UART Tx module enable } async command void Usart.disableUartTx() { ME1 &= ~UTXE0; // USART0 UART Tx module enable call UTXD.selectIOFunc(); } async command void Usart.enableUartRx() { call URXD.selectModuleFunc(); ME1 |= URXE0; // USART0 UART Rx module enable } async command void Usart.disableUartRx() { ME1 &= ~URXE0; // USART0 UART Rx module disable call URXD.selectIOFunc(); } async command void Usart.enableSpi() { atomic { call SIMO.selectModuleFunc(); call SOMI.selectModuleFunc(); call UCLK.selectModuleFunc(); } ME1 |= USPIE0; // USART0 SPI module enable } async command void Usart.disableSpi() { atomic { ME1 &= ~USPIE0; // USART0 SPI module disable call SIMO.selectIOFunc(); call SOMI.selectIOFunc(); call UCLK.selectIOFunc(); } } void configSpi(msp430_spi_union_config_t* config) { // U0CTL = (config->spiRegisters.uctl & ~I2C) | SYNC | SWRST; U0CTL = (config->spiRegisters.uctl) | SYNC | SWRST; U0TCTL = config->spiRegisters.utctl; call Usart.setUbr(config->spiRegisters.ubr); call Usart.setUmctl(0x00); } async command void Usart.setModeSpi(msp430_spi_union_config_t* config) { atomic { call Usart.resetUsart(TRUE); call HplI2C.clearModeI2C(); call Usart.disableUart(); configSpi(config); call Usart.enableSpi(); call Usart.resetUsart(FALSE); call Usart.clrIntr(); call Usart.disableIntr(); } return; } void configUart(msp430_uart_union_config_t* config) { U0CTL = (config->uartRegisters.uctl & ~SYNC) | SWRST; U0TCTL = config->uartRegisters.utctl; U0RCTL = config->uartRegisters.urctl; call Usart.setUbr(config->uartRegisters.ubr); call Usart.setUmctl(config->uartRegisters.umctl); } async command void Usart.setModeUart(msp430_uart_union_config_t* config) { atomic { call Usart.resetUsart(TRUE); call HplI2C.clearModeI2C(); call Usart.disableSpi(); configUart(config); if ((config->uartConfig.utxe == 1) && (config->uartConfig.urxe == 1)) { call Usart.enableUart(); } else if ((config->uartConfig.utxe == 0) && (config->uartConfig.urxe == 1)) { call Usart.disableUartTx(); call Usart.enableUartRx(); } else if ((config->uartConfig.utxe == 1) && (config->uartConfig.urxe == 0)){ call Usart.disableUartRx(); call Usart.enableUartTx(); } else { call Usart.disableUart(); } call Usart.resetUsart(FALSE); call Usart.clrIntr(); call Usart.disableIntr(); } return; } async command bool Usart.isTxIntrPending(){ if (IFG1 & UTXIFG0){ return TRUE; } return FALSE; } async command bool Usart.isTxEmpty(){ if (U0TCTL & TXEPT) { return TRUE; } return FALSE; } async command bool Usart.isRxIntrPending(){ if (IFG1 & URXIFG0){ return TRUE; } return FALSE; } async command void Usart.clrTxIntr(){ IFG1 &= ~UTXIFG0; } async command void Usart.clrRxIntr() { IFG1 &= ~URXIFG0; } async command void Usart.clrIntr() { IFG1 &= ~(UTXIFG0 | URXIFG0); } async command void Usart.disableRxIntr() { IE1 &= ~URXIE0; } async command void Usart.disableTxIntr() { IE1 &= ~UTXIE0; } async command void Usart.disableIntr() { IE1 &= ~(UTXIE0 | URXIE0); } async command void Usart.enableRxIntr() { atomic { IFG1 &= ~URXIFG0; IE1 |= URXIE0; } } async command void Usart.enableTxIntr() { atomic { IFG1 &= ~UTXIFG0; IE1 |= UTXIE0; } } async command void Usart.enableIntr() { atomic { IFG1 &= ~(UTXIFG0 | URXIFG0); IE1 |= (UTXIE0 | URXIE0); } } async command void Usart.tx(uint8_t data) { U0TXBUF = data; } async command uint8_t Usart.rx() { return U0RXBUF; } default async event void I2CInterrupts.fired() {} default async command bool HplI2C.isI2C() { return FALSE; } default async command void HplI2C.clearModeI2C() {}; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/HplMsp430Usart1C.nc000066400000000000000000000075721207233610700232520ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * An HPL abstraction of USART1 on the MSP430. * * @author Jonathan Hui * @author Joe Polastre * @version $Revision: 1.7 $ $Date: 2010-06-29 22:07:45 $ */ #include "msp430usart.h" configuration HplMsp430Usart1C { provides interface AsyncStdControl; provides interface HplMsp430Usart; provides interface HplMsp430UsartInterrupts; } implementation { components HplMsp430Usart1P as HplUsartP; components HplMsp430GeneralIOC as GIO; AsyncStdControl = HplUsartP; HplMsp430Usart = HplUsartP; HplMsp430UsartInterrupts = HplUsartP; HplUsartP.SIMO -> GIO.SIMO1; HplUsartP.SOMI -> GIO.SOMI1; HplUsartP.UCLK -> GIO.UCLK1; HplUsartP.URXD -> GIO.URXD1; HplUsartP.UTXD -> GIO.UTXD1; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/HplMsp430Usart1P.nc000066400000000000000000000247561207233610700232720ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Copyright (c) 2004-2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "msp430usart.h" /** * Implementation of USART1 lowlevel functionality - stateless. * Setting a mode will by default disable USART-Interrupts. * * @author: Jan Hauer * @author: Jonathan Hui * @author: Vlado Handziski * @author: Joe Polastre * @version $Revision: 1.7 $ $Date: 2010-06-04 22:30:21 $ */ module HplMsp430Usart1P { provides interface AsyncStdControl; provides interface HplMsp430Usart as Usart; provides interface HplMsp430UsartInterrupts as Interrupts; uses interface HplMsp430GeneralIO as SIMO; uses interface HplMsp430GeneralIO as SOMI; uses interface HplMsp430GeneralIO as UCLK; uses interface HplMsp430GeneralIO as URXD; uses interface HplMsp430GeneralIO as UTXD; } implementation { MSP430REG_NORACE(IE2); MSP430REG_NORACE(ME2); MSP430REG_NORACE(IFG2); MSP430REG_NORACE(U1TCTL); MSP430REG_NORACE(U1RCTL); MSP430REG_NORACE(U1TXBUF); TOSH_SIGNAL(UART1RX_VECTOR) { uint8_t temp = U1RXBUF; signal Interrupts.rxDone(temp); } TOSH_SIGNAL(UART1TX_VECTOR) { signal Interrupts.txDone(); } async command error_t AsyncStdControl.start() { return SUCCESS; } async command error_t AsyncStdControl.stop() { call Usart.disableSpi(); call Usart.disableUart(); return SUCCESS; } async command void Usart.setUctl(msp430_uctl_t control) { U1CTL=uctl2int(control); } async command msp430_uctl_t Usart.getUctl() { return int2uctl(U1CTL); } async command void Usart.setUtctl(msp430_utctl_t control) { U1TCTL=utctl2int(control); } async command msp430_utctl_t Usart.getUtctl() { return int2utctl(U1TCTL); } async command void Usart.setUrctl(msp430_urctl_t control) { U1RCTL=urctl2int(control); } async command msp430_urctl_t Usart.getUrctl() { return int2urctl(U1RCTL); } async command void Usart.setUbr(uint16_t control) { atomic { U1BR0 = control & 0x00FF; U1BR1 = (control >> 8) & 0x00FF; } } async command uint16_t Usart.getUbr() { return (U1BR1 << 8) + U1BR0; } async command void Usart.setUmctl(uint8_t control) { U1MCTL=control; } async command uint8_t Usart.getUmctl() { return U1MCTL; } async command void Usart.resetUsart(bool reset) { if (reset) U1CTL = SWRST; else CLR_FLAG(U1CTL, SWRST); } async command bool Usart.isSpi() { atomic { return (U1CTL & SYNC) && (ME2 & USPIE1); } } async command bool Usart.isUart() { atomic { return !(U1CTL & SYNC) && ((ME2 & UTXE1) && (ME2 & URXE1)); } } async command bool Usart.isUartTx() { atomic { return !(U1CTL & SYNC) && (ME2 & UTXE1); } } async command bool Usart.isUartRx() { atomic { return !(U1CTL & SYNC) && (ME2 & URXE1); } } async command msp430_usartmode_t Usart.getMode() { if (call Usart.isUart()) return USART_UART; else if (call Usart.isUartRx()) return USART_UART_RX; else if (call Usart.isUartTx()) return USART_UART_TX; else if (call Usart.isSpi()) return USART_SPI; else return USART_NONE; } async command void Usart.enableUart() { atomic{ call UTXD.selectModuleFunc(); call URXD.selectModuleFunc(); } ME2 |= (UTXE1 | URXE1); // USART1 UART module enable } async command void Usart.disableUart() { atomic { ME2 &= ~(UTXE1 | URXE1); // USART1 UART module enable call UTXD.selectIOFunc(); call URXD.selectIOFunc(); } } async command void Usart.enableUartTx() { call UTXD.selectModuleFunc(); ME2 |= UTXE1; // USART1 UART Tx module enable } async command void Usart.disableUartTx() { ME2 &= ~UTXE1; // USART1 UART Tx module enable call UTXD.selectIOFunc(); } async command void Usart.enableUartRx() { call URXD.selectModuleFunc(); ME2 |= URXE1; // USART1 UART Rx module enable } async command void Usart.disableUartRx() { ME2 &= ~URXE1; // USART1 UART Rx module disable call URXD.selectIOFunc(); } async command void Usart.enableSpi() { atomic { call SIMO.selectModuleFunc(); call SOMI.selectModuleFunc(); call UCLK.selectModuleFunc(); } ME2 |= USPIE1; // USART1 SPI module enable } async command void Usart.disableSpi() { atomic { ME2 &= ~USPIE1; // USART1 SPI module disable call SIMO.selectIOFunc(); call SOMI.selectIOFunc(); call UCLK.selectIOFunc(); } } void configSpi(msp430_spi_union_config_t* config) { U1CTL = (config->spiRegisters.uctl) | SYNC | SWRST; U1TCTL = config->spiRegisters.utctl; call Usart.setUbr(config->spiRegisters.ubr); call Usart.setUmctl(0x00); } async command void Usart.setModeSpi(msp430_spi_union_config_t* config) { atomic { call Usart.resetUsart(TRUE); call Usart.disableUart(); configSpi(config); call Usart.enableSpi(); call Usart.resetUsart(FALSE); call Usart.clrIntr(); call Usart.disableIntr(); } return; } void configUart(msp430_uart_union_config_t* config) { U1CTL = (config->uartRegisters.uctl & ~SYNC) | SWRST; U1TCTL = config->uartRegisters.utctl; U1RCTL = config->uartRegisters.urctl; call Usart.setUbr(config->uartRegisters.ubr); call Usart.setUmctl(config->uartRegisters.umctl); } async command void Usart.setModeUart(msp430_uart_union_config_t* config) { atomic { call Usart.resetUsart(TRUE); call Usart.disableSpi(); configUart(config); if ((config->uartConfig.utxe == 1) && (config->uartConfig.urxe == 1)) { call Usart.enableUart(); } else if ((config->uartConfig.utxe == 0) && (config->uartConfig.urxe == 1)) { call Usart.disableUartTx(); call Usart.enableUartRx(); } else if ((config->uartConfig.utxe == 1) && (config->uartConfig.urxe == 0)){ call Usart.disableUartRx(); call Usart.enableUartTx(); } else { call Usart.disableUart(); } call Usart.resetUsart(FALSE); call Usart.clrIntr(); call Usart.disableIntr(); } return; } async command bool Usart.isTxIntrPending(){ if (IFG2 & UTXIFG1){ return TRUE; } return FALSE; } async command bool Usart.isTxEmpty(){ if (U1TCTL & TXEPT) { return TRUE; } return FALSE; } async command bool Usart.isRxIntrPending(){ if (IFG2 & URXIFG1){ return TRUE; } return FALSE; } async command void Usart.clrTxIntr(){ IFG2 &= ~UTXIFG1; } async command void Usart.clrRxIntr() { IFG2 &= ~URXIFG1; } async command void Usart.clrIntr() { IFG2 &= ~(UTXIFG1 | URXIFG1); } async command void Usart.disableRxIntr() { IE2 &= ~URXIE1; } async command void Usart.disableTxIntr() { IE2 &= ~UTXIE1; } async command void Usart.disableIntr() { IE2 &= ~(UTXIE1 | URXIE1); } async command void Usart.enableRxIntr() { atomic { IFG2 &= ~URXIFG1; IE2 |= URXIE1; } } async command void Usart.enableTxIntr() { atomic { IFG2 &= ~UTXIFG1; IE2 |= UTXIE1; } } async command void Usart.enableIntr() { atomic { IFG2 &= ~(UTXIFG1 | URXIFG1); IE2 |= (UTXIE1 | URXIE1); } } async command void Usart.tx(uint8_t data) { U1TXBUF = data; } async command uint8_t Usart.rx() { return U1RXBUF; } } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/HplMsp430UsartInterrupts.nc000066400000000000000000000043631207233610700251610ustar00rootroot00000000000000/* * Copyright (c) 2004-2005, Technische Universität Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Byte-level interface to control a USART. *

      The USART can be switched to SPI- or UART-mode. The interface follows * the convention of being stateless, thus a higher layer has to maintain * state information. * * @author Jan Hauer (hauer@tkn.tu-berlin.de) * @author Joe Polastre * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:11 $ */ #include "msp430usart.h" interface HplMsp430UsartInterrupts { /** * A byte of data is about to be transmitted, ie. the TXBuffer is * empty and ready to accept next byte. */ async event void txDone(); /** * A byte of data has been received. */ async event void rxDone(uint8_t data); } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430I2C0P.nc000066400000000000000000000046721207233610700220770ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:11 $ */ configuration Msp430I2C0P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[uint8_t id ]; provides interface I2CPacket as I2CBasicAddr; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430I2CConfigure[ uint8_t id ]; uses interface HplMsp430I2CInterrupts as I2CInterrupts; } implementation { components Msp430I2CP as I2CP; Resource = I2CP.Resource; ResourceConfigure = I2CP.ResourceConfigure; Msp430I2CConfigure = I2CP.Msp430I2CConfigure; I2CBasicAddr = I2CP.I2CBasicAddr; UsartResource = I2CP.UsartResource; I2CInterrupts = I2CP.I2CInterrupts; components HplMsp430I2C0C as HplI2CC; I2CP.HplI2C -> HplI2CC; components LedsC as Leds; I2CP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430I2CC.nc000066400000000000000000000046621207233610700220010ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2008-05-21 22:11:57 $ */ #include #include "msp430usart.h" generic configuration Msp430I2CC() { provides interface Resource; provides interface ResourceRequested; provides interface I2CPacket as I2CBasicAddr; uses interface Msp430I2CConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_I2CO_BUS ), }; components Msp430I2C0P as I2CP; Resource = I2CP.Resource[ CLIENT_ID ]; I2CBasicAddr = I2CP.I2CBasicAddr; Msp430I2CConfigure = I2CP.Msp430I2CConfigure[ CLIENT_ID ]; components new Msp430Usart0C() as UsartC; ResourceRequested = UsartC; I2CP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; I2CP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; I2CP.I2CInterrupts -> UsartC.HplMsp430I2CInterrupts; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430I2CConfigure.nc000066400000000000000000000035751207233610700235420ustar00rootroot00000000000000/* * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface used by Msp430I2C clients to reconfigure the I2C before use * @author Vlado Handziski * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:11 $ */ #include "msp430usart.h" interface Msp430I2CConfigure { async command msp430_i2c_union_config_t* getConfig(); } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430I2CP.nc000066400000000000000000000140501207233610700220060ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:11 $ */ #include module Msp430I2CP { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; provides interface I2CPacket as I2CBasicAddr; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430I2CConfigure[ uint8_t id ]; uses interface HplMsp430I2C as HplI2C; uses interface HplMsp430I2CInterrupts as I2CInterrupts; uses interface Leds; } implementation { MSP430REG_NORACE(I2CIE); enum { TIMEOUT = 64, }; norace uint8_t* m_buf; norace uint8_t m_len; norace uint8_t m_pos; norace i2c_flags_t m_flags; void nextRead(); void nextWrite(); void signalDone( error_t error ); async command error_t Resource.immediateRequest[ uint8_t id ]() { return call UsartResource.immediateRequest[ id ](); } async command error_t Resource.request[ uint8_t id ]() { return call UsartResource.request[ id ](); } async command bool Resource.isOwner[ uint8_t id ]() { return call UsartResource.isOwner[ id ](); } async command error_t Resource.release[ uint8_t id ]() { return call UsartResource.release[ id ](); } async command void ResourceConfigure.configure[ uint8_t id ]() { call HplI2C.setModeI2C(call Msp430I2CConfigure.getConfig[id]()); } async command void ResourceConfigure.unconfigure[ uint8_t id ]() { call HplI2C.clearModeI2C(); } event void UsartResource.granted[ uint8_t id ]() { signal Resource.granted[ id ](); } default async command error_t UsartResource.request[ uint8_t id ]() { return FAIL; } default async command error_t UsartResource.immediateRequest[ uint8_t id ]() { return FAIL; } default async command error_t UsartResource.release[ uint8_t id ]() {return FAIL;} default event void Resource.granted[ uint8_t id ]() {} default async command msp430_i2c_union_config_t* Msp430I2CConfigure.getConfig[uint8_t id]() { return &msp430_i2c_default_config; } async command error_t I2CBasicAddr.read( i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* buf ) { m_buf = buf; m_len = len; m_flags = flags; m_pos = 0; call HplI2C.setMasterMode(); call HplI2C.setReceiveMode(); call HplI2C.setSlaveAddress( addr ); call HplI2C.enableReceiveReady(); call HplI2C.enableAccessReady(); call HplI2C.enableNoAck(); if ( flags & I2C_START ) call HplI2C.setStartBit(); else nextRead(); return SUCCESS; } async command error_t I2CBasicAddr.write( i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* buf ) { m_buf = buf; m_len = len; m_flags = flags; m_pos = 0; call HplI2C.setMasterMode(); call HplI2C.setTransmitMode(); call HplI2C.setSlaveAddress( addr ); call HplI2C.enableTransmitReady(); call HplI2C.enableAccessReady(); call HplI2C.enableNoAck(); if ( flags & I2C_START ) call HplI2C.setStartBit(); else nextWrite(); return SUCCESS; } async event void I2CInterrupts.fired() { int i = 0; switch( call HplI2C.getIV() ) { case 0x04: if ( I2CDCTL & I2CBB ) call HplI2C.setStopBit(); while( I2CDCTL & I2CBUSY ); signalDone( FAIL ); break; case 0x08: while( (I2CDCTL & I2CBUSY) ) { if ( i++ >= TIMEOUT ) { signalDone( FAIL ); return; } } signalDone( SUCCESS ); break; case 0x0A: nextRead(); break; case 0x0C: nextWrite(); break; default: break; } } void nextRead() { m_buf[ m_pos++ ] = call HplI2C.getData(); if ( m_pos == m_len ) { if ( m_flags & I2C_STOP ) call HplI2C.setStopBit(); else signalDone( SUCCESS ); } } void nextWrite() { if ( ( m_pos == m_len - 1 ) && ( m_flags & I2C_STOP ) ) { call HplI2C.setStopBit(); } else if ( m_pos == m_len ) { signalDone( SUCCESS ); return; } call HplI2C.setData( m_buf[ m_pos++ ] ); } void signalDone( error_t error ) { I2CIE = 0; if ( call HplI2C.getTransmitReceiveMode() ) signal I2CBasicAddr.writeDone( error, I2CSA, m_len, m_buf ); else signal I2CBasicAddr.readDone( error, I2CSA, m_len, m_buf ); } default async command bool UsartResource.isOwner[ uint8_t id ]() { return FALSE; } } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430Spi0C.nc000066400000000000000000000110211207233610700222220ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ /** * An implementation of the SPI on USART0 for the MSP430. The current * implementation defaults not using the DMA and performing the SPI * transfers in software. To utilize the DMA, use Msp430SpiDma0P in * place of Msp430SpiNoDma0P. * * @author Jonathan Hui * @author Mark Hays * @version $Revision: 1.8 $ $Date: 2010-06-29 22:07:45 $ */ #include "msp430usart.h" generic configuration Msp430Spi0C() { provides interface Resource; provides interface ResourceRequested; provides interface SpiByte; #ifndef ENABLE_SPI0_DMA provides interface FastSpiByte; #endif provides interface SpiPacket; uses interface Msp430SpiConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_SPIO_BUS ), }; #ifdef ENABLE_SPI0_DMA #warning "Enabling SPI DMA on USART0" components Msp430SpiDma0P as SpiP; #else components Msp430SpiNoDma0P as SpiP; #endif Resource = SpiP.Resource[ CLIENT_ID ]; SpiByte = SpiP.SpiByte; #ifndef ENABLE_SPI0_DMA FastSpiByte = SpiP.FastSpiByte; #endif SpiPacket = SpiP.SpiPacket[ CLIENT_ID ]; Msp430SpiConfigure = SpiP.Msp430SpiConfigure[ CLIENT_ID ]; components new Msp430Usart0C() as UsartC; ResourceRequested = UsartC; SpiP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; SpiP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; SpiP.UsartInterrupts -> UsartC.HplMsp430UsartInterrupts; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430Spi1C.nc000066400000000000000000000110211207233610700222230ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ /** * An implementation of the SPI on USART0 for the MSP430. The current * implementation defaults not using the DMA and performing the SPI * transfers in software. To utilize the DMA, use Msp430SpiDma0P in * place of Msp430SpiNoDma0P. * * @author Jonathan Hui * @author Mark Hays * @version $Revision: 1.9 $ $Date: 2010-06-29 22:07:45 $ */ #include "msp430usart.h" generic configuration Msp430Spi1C() { provides interface Resource; provides interface ResourceRequested; provides interface SpiByte; #ifndef ENABLE_SPI1_DMA provides interface FastSpiByte; #endif provides interface SpiPacket; uses interface Msp430SpiConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_SPI1_BUS ), }; #ifdef ENABLE_SPI1_DMA #warning "Enabling SPI DMA on USART1" components Msp430SpiDma1P as SpiP; #else components Msp430SpiNoDma1P as SpiP; #endif Resource = SpiP.Resource[ CLIENT_ID ]; SpiByte = SpiP.SpiByte; #ifndef ENABLE_SPI1_DMA FastSpiByte = SpiP.FastSpiByte; #endif SpiPacket = SpiP.SpiPacket[ CLIENT_ID ]; Msp430SpiConfigure = SpiP.Msp430SpiConfigure[ CLIENT_ID ]; components new Msp430Usart1C() as UsartC; ResourceRequested = UsartC; SpiP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; SpiP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; SpiP.UsartInterrupts -> UsartC.HplMsp430UsartInterrupts; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430SpiConfigure.nc000066400000000000000000000035751207233610700237200ustar00rootroot00000000000000/* * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface used by Msp430Spi clients to reconfigure the SPI before use * @author Vlado Handziski * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:11 $ */ #include "msp430usart.h" interface Msp430SpiConfigure { async command msp430_spi_union_config_t* getConfig(); } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430SpiDma0P.nc000066400000000000000000000054501207233610700226720ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Mark Hays * @version $Revision: 1.5 $ $Date: 2007-11-08 21:34:42 $ */ configuration Msp430SpiDma0P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; provides interface SpiByte; provides interface SpiPacket[ uint8_t id ]; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430SpiConfigure[ uint8_t id ]; uses interface HplMsp430UsartInterrupts as UsartInterrupts; } implementation { #include "Msp430Dma.h" components new Msp430SpiDmaP(IFG1_, U0TXBUF_, UTXIFG0, (uint16_t) DMA_TRIGGER_UTXIFG0, U0RXBUF_, URXIFG0, (uint16_t) DMA_TRIGGER_URXIFG0) as SpiP; Resource = SpiP.Resource; ResourceConfigure = SpiP.ResourceConfigure; Msp430SpiConfigure = SpiP.Msp430SpiConfigure; SpiByte = SpiP.SpiByte; SpiPacket = SpiP.SpiPacket; UsartResource = SpiP.UsartResource; UsartInterrupts = SpiP.UsartInterrupts; components HplMsp430Usart0C as UsartC; SpiP.Usart -> UsartC; components Msp430DmaC as DmaC; SpiP.DmaChannel1 -> DmaC.Channel1; SpiP.DmaChannel2 -> DmaC.Channel2; components LedsC as Leds; SpiP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430SpiDma1P.nc000066400000000000000000000054461207233610700227000ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Mark Hays * @version $Revision: 1.5 $ $Date: 2007-11-08 21:34:42 $ */ configuration Msp430SpiDma1P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[uint8_t id]; provides interface SpiByte; provides interface SpiPacket[ uint8_t id ]; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430SpiConfigure[ uint8_t id ]; uses interface HplMsp430UsartInterrupts as UsartInterrupts; } implementation { #include "Msp430Dma.h" components new Msp430SpiDmaP(IFG2_, U1TXBUF_, UTXIFG1, (uint16_t) DMA_TRIGGER_UTXIFG1, U1RXBUF_, URXIFG1, (uint16_t) DMA_TRIGGER_URXIFG1) as SpiP; Resource = SpiP.Resource; ResourceConfigure = SpiP.ResourceConfigure; Msp430SpiConfigure = SpiP.Msp430SpiConfigure; SpiByte = SpiP.SpiByte; SpiPacket = SpiP.SpiPacket; UsartResource = SpiP.UsartResource; UsartInterrupts = SpiP.UsartInterrupts; components HplMsp430Usart1C as UsartC; SpiP.Usart -> UsartC; components Msp430DmaC as DmaC; SpiP.DmaChannel1 -> DmaC.Channel1; SpiP.DmaChannel2 -> DmaC.Channel2; components LedsC as Leds; SpiP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430SpiDmaP.nc000066400000000000000000000142011207233610700226040ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Mark Hays * @author Roman Lim * @version $Revision: 1.6 $ $Date: 2008-02-28 17:28:12 $ */ generic module Msp430SpiDmaP( uint16_t IFG_addr, uint16_t TXBUF_addr, uint8_t TXIFG, uint16_t TXTRIG, uint16_t RXBUF_addr, uint8_t RXIFG, uint16_t RXTRIG ) { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; provides interface SpiByte; provides interface SpiPacket[ uint8_t id ]; uses interface Msp430DmaChannel as DmaChannel1; uses interface Msp430DmaChannel as DmaChannel2; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430SpiConfigure[uint8_t id ]; uses interface HplMsp430Usart as Usart; uses interface HplMsp430UsartInterrupts as UsartInterrupts; uses interface Leds; } implementation { #define IFG (*(volatile uint8_t*)IFG_addr) uint8_t* m_tx_buf; uint8_t* m_rx_buf; uint16_t m_len; uint8_t m_client; uint8_t m_dump; void signalDone( error_t error ); task void signalDone_task(); async command error_t Resource.immediateRequest[ uint8_t id ]() { return call UsartResource.immediateRequest[ id ](); } async command error_t Resource.request[ uint8_t id ]() { return call UsartResource.request[ id ](); } async command error_t Resource.release[ uint8_t id ]() { return call UsartResource.release[ id ](); } async command void ResourceConfigure.configure[ uint8_t id ]() { call Usart.setModeSpi(call Msp430SpiConfigure.getConfig[id]()); } async command void ResourceConfigure.unconfigure[ uint8_t id ]() { call Usart.resetUsart(TRUE); call Usart.disableSpi(); call Usart.resetUsart(FALSE); } event void UsartResource.granted[ uint8_t id ]() { signal Resource.granted[ id ](); } async command bool Resource.isOwner[ uint8_t id ]() { return call UsartResource.isOwner[ id ](); } default async command bool UsartResource.isOwner[ uint8_t id ]() { return FALSE; } default async command error_t UsartResource.request[ uint8_t id ]() { return FAIL; } default async command error_t UsartResource.immediateRequest[ uint8_t id ]() { return FAIL; } default async command error_t UsartResource.release[ uint8_t id ]() { return FAIL; } default async command msp430_spi_union_config_t* Msp430SpiConfigure.getConfig[uint8_t id]() { return &msp430_spi_default_config; } default event void Resource.granted[ uint8_t id ]() {} async command uint8_t SpiByte.write( uint8_t tx ) { call Usart.tx( tx ); while( !call Usart.isRxIntrPending() ); call Usart.clrRxIntr(); return call Usart.rx(); } async command error_t SpiPacket.send[ uint8_t id ]( uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len ) { atomic { m_client = id; m_tx_buf = tx_buf; m_rx_buf = rx_buf; m_len = len; } if ( len ) { // clear the interrupt flags IFG &= ~( TXIFG | RXIFG ); // set up the RX xfer call DmaChannel1.setupTransfer(DMA_SINGLE_TRANSFER, RXTRIG, DMA_EDGE_SENSITIVE, (void *) RXBUF_addr, rx_buf ? rx_buf : &m_dump, len, DMA_BYTE, DMA_BYTE, DMA_ADDRESS_UNCHANGED, rx_buf ? DMA_ADDRESS_INCREMENTED : DMA_ADDRESS_UNCHANGED); // this doesn't start a transfer; it simply enables the channel call DmaChannel1.startTransfer(); // set up the TX xfer call DmaChannel2.setupTransfer(DMA_SINGLE_TRANSFER, TXTRIG, DMA_EDGE_SENSITIVE, tx_buf, (void *) TXBUF_addr, len, DMA_BYTE, DMA_BYTE, DMA_ADDRESS_INCREMENTED, DMA_ADDRESS_UNCHANGED); // this doesn't start a transfer; it simply enables the channel call DmaChannel2.startTransfer(); // pong the tx flag to get things rolling IFG |= TXIFG; } else { post signalDone_task(); } return SUCCESS; } task void signalDone_task() { atomic signalDone( SUCCESS ); } async event void DmaChannel1.transferDone( error_t error ) { signalDone( error ); } async event void DmaChannel2.transferDone( error_t error ) {} void signalDone( error_t error ) { signal SpiPacket.sendDone[ m_client ]( m_tx_buf, m_rx_buf, m_len, error ); } async event void UsartInterrupts.txDone() {} async event void UsartInterrupts.rxDone( uint8_t data ) {} default async event void SpiPacket.sendDone[ uint8_t id ]( uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len, error_t error ) {} } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430SpiNoDma0P.nc000066400000000000000000000102031207233610700231570ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ /** * @author Jonathan Hui * @version $Revision: 1.6 $ $Date: 2010-06-29 22:07:45 $ */ configuration Msp430SpiNoDma0P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[uint8_t id ]; provides interface SpiByte; provides interface FastSpiByte; provides interface SpiPacket[ uint8_t id ]; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430SpiConfigure[ uint8_t id ]; uses interface HplMsp430UsartInterrupts as UsartInterrupts; } implementation { components new Msp430SpiNoDmaP() as SpiP; Resource = SpiP.Resource; ResourceConfigure = SpiP.ResourceConfigure; Msp430SpiConfigure = SpiP.Msp430SpiConfigure; SpiByte = SpiP.SpiByte; FastSpiByte = SpiP.FastSpiByte; SpiPacket = SpiP.SpiPacket; UsartResource = SpiP.UsartResource; UsartInterrupts = SpiP.UsartInterrupts; components HplMsp430Usart0C as UsartC; SpiP.Usart -> UsartC; components LedsC as Leds; SpiP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430SpiNoDma1P.nc000066400000000000000000000102031207233610700231600ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ /** * @author Jonathan Hui * @version $Revision: 1.6 $ $Date: 2010-06-29 22:07:45 $ */ configuration Msp430SpiNoDma1P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[uint8_t id ]; provides interface SpiByte; provides interface FastSpiByte; provides interface SpiPacket[ uint8_t id ]; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430SpiConfigure[ uint8_t id ]; uses interface HplMsp430UsartInterrupts as UsartInterrupts; } implementation { components new Msp430SpiNoDmaP() as SpiP; Resource = SpiP.Resource; ResourceConfigure = SpiP.ResourceConfigure; Msp430SpiConfigure = SpiP.Msp430SpiConfigure; SpiByte = SpiP.SpiByte; FastSpiByte = SpiP.FastSpiByte; SpiPacket = SpiP.SpiPacket; UsartResource = SpiP.UsartResource; UsartInterrupts = SpiP.UsartInterrupts; components HplMsp430Usart1C as UsartC; SpiP.Usart -> UsartC; components LedsC as Leds; SpiP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430SpiNoDmaP.nc000066400000000000000000000176441207233610700231170ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ /** * @author Jonathan Hui * @author Jan Hauer (bugfix in continueOp()) * @version $Revision: 1.8 $ $Date: 2010-06-29 22:07:45 $ */ generic module Msp430SpiNoDmaP() { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; provides interface SpiByte; provides interface FastSpiByte; provides interface SpiPacket[ uint8_t id ]; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430SpiConfigure[ uint8_t id ]; uses interface HplMsp430Usart as Usart; uses interface HplMsp430UsartInterrupts as UsartInterrupts; uses interface Leds; } implementation { enum { SPI_ATOMIC_SIZE = 2, }; norace uint16_t m_len; norace uint8_t* COUNT_NOK(m_len) m_tx_buf; norace uint8_t* COUNT_NOK(m_len) m_rx_buf; norace uint16_t m_pos; norace uint8_t m_client; void signalDone(); task void signalDone_task(); async command error_t Resource.immediateRequest[ uint8_t id ]() { return call UsartResource.immediateRequest[ id ](); } async command error_t Resource.request[ uint8_t id ]() { return call UsartResource.request[ id ](); } async command bool Resource.isOwner[ uint8_t id ]() { return call UsartResource.isOwner[ id ](); } async command error_t Resource.release[ uint8_t id ]() { return call UsartResource.release[ id ](); } async command void ResourceConfigure.configure[ uint8_t id ]() { call Usart.setModeSpi(call Msp430SpiConfigure.getConfig[id]()); } async command void ResourceConfigure.unconfigure[ uint8_t id ]() { call Usart.resetUsart(TRUE); call Usart.disableSpi(); call Usart.resetUsart(FALSE); } event void UsartResource.granted[ uint8_t id ]() { signal Resource.granted[ id ](); } async command uint8_t SpiByte.write( uint8_t tx ) { uint8_t byte; // we are in spi mode which is configured to have turned off interrupts //call Usart.disableRxIntr(); call Usart.tx( tx ); while( !call Usart.isRxIntrPending() ); call Usart.clrRxIntr(); byte = call Usart.rx(); //call Usart.enableRxIntr(); return byte; } inline async command void FastSpiByte.splitWrite(uint8_t data) { call Usart.tx( data ); } inline async command uint8_t FastSpiByte.splitRead() { while( !call Usart.isRxIntrPending() ); return call Usart.rx(); } inline async command uint8_t FastSpiByte.splitReadWrite(uint8_t data) { uint8_t b; while( !call Usart.isRxIntrPending() ); b = call Usart.rx(); while( !call Usart.isTxIntrPending() ); call Usart.tx( data ); return b; } inline async command uint8_t FastSpiByte.write(uint8_t data) { call FastSpiByte.splitWrite( data ); return call FastSpiByte.splitRead(); } default async command bool UsartResource.isOwner[ uint8_t id ]() { return FALSE; } default async command error_t UsartResource.request[ uint8_t id ]() { return FAIL; } default async command error_t UsartResource.immediateRequest[ uint8_t id ]() { return FAIL; } default async command error_t UsartResource.release[ uint8_t id ]() { return FAIL; } default async command msp430_spi_union_config_t* Msp430SpiConfigure.getConfig[uint8_t id]() { return &msp430_spi_default_config; } default event void Resource.granted[ uint8_t id ]() {} void continueOp() { uint8_t end; uint8_t tmp; atomic { call Usart.tx( m_tx_buf ? m_tx_buf[ m_pos ] : 0 ); end = m_pos + SPI_ATOMIC_SIZE; if ( end > m_len ) end = m_len; while ( ++m_pos < end ) { while( !call Usart.isRxIntrPending() ); tmp = call Usart.rx(); if ( m_rx_buf ) m_rx_buf[ m_pos - 1 ] = tmp; call Usart.tx( m_tx_buf ? m_tx_buf[ m_pos ] : 0 ); } } } async command error_t SpiPacket.send[ uint8_t id ]( uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len ) { m_client = id; m_tx_buf = tx_buf; m_rx_buf = rx_buf; m_len = len; m_pos = 0; if ( len ) { call Usart.enableRxIntr(); continueOp(); } else { post signalDone_task(); } return SUCCESS; } task void signalDone_task() { atomic signalDone(); } async event void UsartInterrupts.rxDone( uint8_t data ) { if ( m_rx_buf ) m_rx_buf[ m_pos-1 ] = data; if ( m_pos < m_len ) continueOp(); else { call Usart.disableRxIntr(); signalDone(); } } void signalDone() { signal SpiPacket.sendDone[ m_client ]( m_tx_buf, m_rx_buf, m_len, SUCCESS ); } async event void UsartInterrupts.txDone() {} default async event void SpiPacket.sendDone[ uint8_t id ]( uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len, error_t error ) {} } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430Uart0C.nc000066400000000000000000000052131207233610700224100ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * An implementation of the UART on USART0 for the MSP430. * @author Vlado Handziski * @author Jonathan Hui * @author Eric B. Decker * @version $Revision: 1.6 $ $Date: 2008-05-21 22:11:57 $ */ #include "msp430usart.h" generic configuration Msp430Uart0C() { provides interface Resource; provides interface ResourceRequested; provides interface UartStream; provides interface UartByte; uses interface Msp430UartConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_UARTO_BUS ), }; components Msp430Uart0P as UartP; Resource = UartP.Resource[ CLIENT_ID ]; UartStream = UartP.UartStream[ CLIENT_ID ]; UartByte = UartP.UartByte[ CLIENT_ID ]; Msp430UartConfigure = UartP.Msp430UartConfigure[ CLIENT_ID ]; components new Msp430Usart0C() as UsartC; ResourceRequested = UsartC; UartP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; UartP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; UartP.UsartInterrupts[ CLIENT_ID ] -> UsartC.HplMsp430UsartInterrupts; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430Uart0P.nc000066400000000000000000000052761207233610700224360ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Vlado Handziski * @author Eric B. Decker * @version $Revision: 1.5 $ $Date: 2008-05-21 22:11:57 $ */ configuration Msp430Uart0P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; provides interface UartStream[ uint8_t id ]; provides interface UartByte[ uint8_t id ]; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430UartConfigure[ uint8_t id ]; uses interface HplMsp430UsartInterrupts as UsartInterrupts[ uint8_t id ]; } implementation { components new Msp430UartP() as UartP; Resource = UartP.Resource; ResourceConfigure = UartP.ResourceConfigure; Msp430UartConfigure = UartP.Msp430UartConfigure; UartStream = UartP.UartStream; UartByte = UartP.UartByte; UsartResource = UartP.UsartResource; UsartInterrupts = UartP.UsartInterrupts; components HplMsp430Usart0C as UsartC; UartP.Usart -> UsartC; components Counter32khz16C as CounterC; UartP.Counter -> CounterC; components LedsC as Leds; UartP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430Uart1C.nc000066400000000000000000000052131207233610700224110ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * An implementation of the UART on USART1 for the MSP430. * @author Vlado Handziski * @author Jonathan Hui * @author Eric B. Decker * @version $Revision: 1.5 $ $Date: 2008-05-21 22:11:57 $ */ #include "msp430usart.h" generic configuration Msp430Uart1C() { provides interface Resource; provides interface ResourceRequested; provides interface UartStream; provides interface UartByte; uses interface Msp430UartConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_UART1_BUS ), }; components Msp430Uart1P as UartP; Resource = UartP.Resource[ CLIENT_ID ]; UartStream = UartP.UartStream[ CLIENT_ID ]; UartByte = UartP.UartByte[ CLIENT_ID ];; Msp430UartConfigure = UartP.Msp430UartConfigure[ CLIENT_ID ]; components new Msp430Usart1C() as UsartC; ResourceRequested = UsartC; UartP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; UartP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; UartP.UsartInterrupts[ CLIENT_ID ] -> UsartC.HplMsp430UsartInterrupts; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430Uart1P.nc000066400000000000000000000053061207233610700224310ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Vlado Handziski * @author Eric B. Decker * @version $Revision: 1.5 $ $Date: 2008-05-21 22:11:57 $ */ configuration Msp430Uart1P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; provides interface UartStream[ uint8_t id ]; provides interface UartByte[ uint8_t id ]; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430UartConfigure[ uint8_t id ]; uses interface HplMsp430UsartInterrupts as UsartInterrupts[ uint8_t id ]; } implementation { components new Msp430UartP() as UartP; Resource = UartP.Resource; ResourceConfigure = UartP.ResourceConfigure; Msp430UartConfigure = UartP.Msp430UartConfigure; UartStream = UartP.UartStream; UartByte = UartP.UartByte; UsartResource = UartP.UsartResource; UsartInterrupts = UartP.UsartInterrupts; components HplMsp430Usart1C as UsartC; UartP.Usart -> UsartC; components Counter32khz16C as CounterC; UartP.Counter -> CounterC; components LedsC as Leds; UartP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430UartConfigure.nc000066400000000000000000000036011207233610700240660ustar00rootroot00000000000000/* * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface used by Msp430Uart clients to reconfigure the UART before use * @author Vlado Handziski * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:11 $ */ #include "msp430usart.h" interface Msp430UartConfigure { async command msp430_uart_union_config_t* getConfig(); } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430UartP.nc000066400000000000000000000164661207233610700223610ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Vlado Handziski * @author Eric B. Decker * @version $Revision: 1.7 $ $Date: 2008-06-04 05:31:15 $ */ #include generic module Msp430UartP() { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; provides interface UartStream[ uint8_t id ]; provides interface UartByte[ uint8_t id ]; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430UartConfigure[ uint8_t id ]; uses interface HplMsp430Usart as Usart; uses interface HplMsp430UsartInterrupts as UsartInterrupts[ uint8_t id ]; uses interface Counter; uses interface Leds; } implementation { norace uint16_t m_tx_len, m_rx_len; norace uint8_t * COUNT_NOK(m_tx_len) m_tx_buf, * COUNT_NOK(m_rx_len) m_rx_buf; norace uint16_t m_tx_pos, m_rx_pos; norace uint8_t m_byte_time; norace uint8_t current_owner; async command error_t Resource.immediateRequest[ uint8_t id ]() { return call UsartResource.immediateRequest[ id ](); } async command error_t Resource.request[ uint8_t id ]() { return call UsartResource.request[ id ](); } async command bool Resource.isOwner[ uint8_t id ]() { return call UsartResource.isOwner[ id ](); } async command error_t Resource.release[ uint8_t id ]() { if (call UsartResource.isOwner[id]() == FALSE) return FAIL; if ( m_rx_buf || m_tx_buf ) return EBUSY; return call UsartResource.release[ id ](); } async command void ResourceConfigure.configure[ uint8_t id ]() { msp430_uart_union_config_t* config = call Msp430UartConfigure.getConfig[id](); m_byte_time = config->uartConfig.ubr / 2; call Usart.setModeUart(config); call Usart.enableIntr(); } async command void ResourceConfigure.unconfigure[ uint8_t id ]() { call Usart.resetUsart(TRUE); call Usart.disableIntr(); call Usart.disableUart(); /* leave the usart in reset */ //call Usart.resetUsart(FALSE); // this shouldn't be called. } event void UsartResource.granted[ uint8_t id ]() { signal Resource.granted[ id ](); } async command error_t UartStream.enableReceiveInterrupt[ uint8_t id ]() { if (call UsartResource.isOwner[id]() == FALSE) return FAIL; call Usart.enableRxIntr(); return SUCCESS; } async command error_t UartStream.disableReceiveInterrupt[ uint8_t id ]() { if (call UsartResource.isOwner[id]() == FALSE) return FAIL; call Usart.disableRxIntr(); return SUCCESS; } async command error_t UartStream.receive[ uint8_t id ]( uint8_t* buf, uint16_t len ) { if (call UsartResource.isOwner[id]() == FALSE) return FAIL; if ( len == 0 ) return FAIL; atomic { if ( m_rx_buf ) return EBUSY; m_rx_buf = buf; m_rx_len = len; m_rx_pos = 0; } return SUCCESS; } async event void UsartInterrupts.rxDone[uint8_t id]( uint8_t data ) { if ( m_rx_buf ) { m_rx_buf[ m_rx_pos++ ] = data; if ( m_rx_pos >= m_rx_len ) { uint8_t* buf = m_rx_buf; m_rx_buf = NULL; signal UartStream.receiveDone[id]( buf, m_rx_len, SUCCESS ); } } else { signal UartStream.receivedByte[id]( data ); } } async command error_t UartStream.send[ uint8_t id ]( uint8_t* buf, uint16_t len ) { if (call UsartResource.isOwner[id]() == FALSE) return FAIL; if ( len == 0 ) return FAIL; else if ( m_tx_buf ) return EBUSY; m_tx_buf = buf; m_tx_len = len; m_tx_pos = 0; current_owner = id; call Usart.tx( buf[ m_tx_pos++ ] ); return SUCCESS; } async event void UsartInterrupts.txDone[uint8_t id]() { if(current_owner != id) { uint8_t* buf = m_tx_buf; m_tx_buf = NULL; signal UartStream.sendDone[id]( buf, m_tx_len, FAIL ); } else if ( m_tx_pos < m_tx_len ) { call Usart.tx( m_tx_buf[ m_tx_pos++ ] ); } else { uint8_t* buf = m_tx_buf; m_tx_buf = NULL; signal UartStream.sendDone[id]( buf, m_tx_len, SUCCESS ); } } async command error_t UartByte.send[ uint8_t id ]( uint8_t data ) { if (call UsartResource.isOwner[id]() == FALSE) return FAIL; call Usart.clrTxIntr(); call Usart.disableTxIntr (); call Usart.tx( data ); while( !call Usart.isTxIntrPending() ); call Usart.clrTxIntr(); call Usart.enableTxIntr(); return SUCCESS; } async command error_t UartByte.receive[ uint8_t id ]( uint8_t* byte, uint8_t timeout ) { uint16_t timeout_micro = m_byte_time * timeout + 1; uint16_t start; if (call UsartResource.isOwner[id]() == FALSE) return FAIL; start = call Counter.get(); while( !call Usart.isRxIntrPending() ) { if ( ( call Counter.get() - start ) >= timeout_micro ) return FAIL; } *byte = call Usart.rx(); return SUCCESS; } async event void Counter.overflow() {} default async command bool UsartResource.isOwner[ uint8_t id ]() { return FALSE; } default async command error_t UsartResource.request[ uint8_t id ]() { return FAIL; } default async command error_t UsartResource.immediateRequest[ uint8_t id ]() { return FAIL; } default async command error_t UsartResource.release[ uint8_t id ]() { return FAIL; } default async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig[uint8_t id]() { return &msp430_uart_default_config; } default event void Resource.granted[ uint8_t id ]() {} default async event void UartStream.sendDone[ uint8_t id ](uint8_t* buf, uint16_t len, error_t error) {} default async event void UartStream.receivedByte[ uint8_t id ](uint8_t byte) {} default async event void UartStream.receiveDone[ uint8_t id ]( uint8_t* buf, uint16_t len, error_t error ) {} } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430Usart0C.nc000066400000000000000000000054451207233610700226020ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Provides an interface for USART0 on the MSP430. * * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2008-05-21 22:11:57 $ */ generic configuration Msp430Usart0C() { provides interface Resource; provides interface ResourceRequested; provides interface ArbiterInfo; provides interface HplMsp430Usart; provides interface HplMsp430UsartInterrupts; provides interface HplMsp430I2CInterrupts; #ifdef __msp430_have_usart0_with_i2c provides interface HplMsp430I2C; #endif uses interface ResourceConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_HPLUSART0_RESOURCE ), }; components Msp430UsartShare0P as UsartShareP; Resource = UsartShareP.Resource[ CLIENT_ID ]; ResourceRequested = UsartShareP.ResourceRequested[ CLIENT_ID ]; ResourceConfigure = UsartShareP.ResourceConfigure[ CLIENT_ID ]; ArbiterInfo = UsartShareP.ArbiterInfo; HplMsp430UsartInterrupts = UsartShareP.Interrupts[ CLIENT_ID ]; HplMsp430I2CInterrupts = UsartShareP.I2CInterrupts[ CLIENT_ID ]; components HplMsp430Usart0C as HplUsartC; HplMsp430Usart = HplUsartC; #ifdef __msp430_have_usart0_with_i2c components HplMsp430I2C0C as HplI2CC; HplMsp430I2C = HplI2CC; #endif } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430Usart1C.nc000066400000000000000000000050341207233610700225750ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Provides an interface for USART1 on the MSP430. * * @author Vlado Handziski * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2008-05-21 22:11:57 $ */ generic configuration Msp430Usart1C() { provides interface Resource; provides interface ResourceRequested; provides interface ArbiterInfo; provides interface HplMsp430Usart; provides interface HplMsp430UsartInterrupts; uses interface ResourceConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_HPLUSART1_RESOURCE ), }; components Msp430UsartShare1P as UsartShareP; Resource = UsartShareP.Resource[ CLIENT_ID ]; ResourceRequested = UsartShareP.ResourceRequested[ CLIENT_ID ]; ResourceConfigure = UsartShareP.ResourceConfigure[ CLIENT_ID ]; ArbiterInfo = UsartShareP.ArbiterInfo; HplMsp430UsartInterrupts = UsartShareP.Interrupts[ CLIENT_ID ]; components HplMsp430Usart1C as UsartC; HplMsp430Usart = UsartC; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430UsartShare0P.nc000066400000000000000000000050261207233610700235750ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2008-05-21 22:11:57 $ */ configuration Msp430UsartShare0P { provides interface HplMsp430UsartInterrupts as Interrupts[ uint8_t id ]; provides interface HplMsp430I2CInterrupts as I2CInterrupts[ uint8_t id ]; provides interface Resource[ uint8_t id ]; provides interface ResourceRequested[ uint8_t id ]; provides interface ArbiterInfo; uses interface ResourceConfigure[ uint8_t id ]; } implementation { components new Msp430UsartShareP() as UsartShareP; Interrupts = UsartShareP; I2CInterrupts = UsartShareP; components new FcfsArbiterC( MSP430_HPLUSART0_RESOURCE ) as ArbiterC; Resource = ArbiterC; ResourceRequested = ArbiterC; ResourceConfigure = ArbiterC; ArbiterInfo = ArbiterC; UsartShareP.ArbiterInfo -> ArbiterC; components HplMsp430Usart0C as HplUsartC; UsartShareP.RawInterrupts -> HplUsartC; UsartShareP.RawI2CInterrupts -> HplUsartC; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430UsartShare1P.nc000066400000000000000000000051151207233610700235750ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Vlado Handziski * @author Jonathan Hui * @version $Revision: 1.6 $ $Date: 2008-05-21 22:11:57 $ */ configuration Msp430UsartShare1P { provides interface HplMsp430UsartInterrupts as Interrupts[ uint8_t id ]; provides interface Resource[ uint8_t id ]; provides interface ResourceRequested[ uint8_t id ]; provides interface ArbiterInfo; uses interface ResourceConfigure[ uint8_t id ]; } implementation { components new Msp430UsartShareP() as UsartShareP; Interrupts = UsartShareP; UsartShareP.RawInterrupts -> UsartC; components new FcfsArbiterC( MSP430_HPLUSART1_RESOURCE ) as ArbiterC; Resource = ArbiterC; ResourceRequested = ArbiterC; ResourceConfigure = ArbiterC; ArbiterInfo = ArbiterC; UsartShareP.ArbiterInfo -> ArbiterC; components new AsyncStdControlPowerManagerC() as PowerManagerC; PowerManagerC.ResourceDefaultOwner -> ArbiterC; components HplMsp430Usart1C as UsartC; PowerManagerC.AsyncStdControl -> UsartC; } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/Msp430UsartShareP.nc000066400000000000000000000053221207233610700235140ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2008-06-26 04:39:08 $ */ generic module Msp430UsartShareP() @safe() { provides interface HplMsp430UsartInterrupts as Interrupts[ uint8_t id ]; provides interface HplMsp430I2CInterrupts as I2CInterrupts[ uint8_t id ]; uses interface HplMsp430UsartInterrupts as RawInterrupts; uses interface HplMsp430I2CInterrupts as RawI2CInterrupts; uses interface ArbiterInfo; } implementation { async event void RawInterrupts.txDone() { if ( call ArbiterInfo.inUse() ) signal Interrupts.txDone[ call ArbiterInfo.userId() ](); } async event void RawInterrupts.rxDone( uint8_t data ) { if ( call ArbiterInfo.inUse() ) signal Interrupts.rxDone[ call ArbiterInfo.userId() ]( data ); } async event void RawI2CInterrupts.fired() { if ( call ArbiterInfo.inUse() ) signal I2CInterrupts.fired[ call ArbiterInfo.userId() ](); } default async event void Interrupts.txDone[ uint8_t id ]() {} default async event void Interrupts.rxDone[ uint8_t id ]( uint8_t data ) {} default async event void I2CInterrupts.fired[ uint8_t id ]() {} } tinyos-2.1.2+dfsg/tos/chips/msp430/usart/msp430usart.h000066400000000000000000000274501207233610700223460ustar00rootroot00000000000000/* * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Vlado Handziski * @author Philipp Huppertz */ #ifndef _H_Msp430Usart_h #define _H_Msp430Usart_h #define MSP430_HPLUSART0_RESOURCE "Msp430Usart0.Resource" #define MSP430_SPIO_BUS "Msp430Spi0.Resource" #define MSP430_UARTO_BUS "Msp430Uart0.Resource" #define MSP430_I2CO_BUS "Msp430I2C0.Resource" #define MSP430_HPLUSART1_RESOURCE "Msp430Usart1.Resource" #define MSP430_SPI1_BUS "Msp430Spi1.Resource" #define MSP430_UART1_BUS "Msp430Uart1.Resource" typedef enum { USART_NONE = 0, USART_UART = 1, USART_UART_TX = 2, USART_UART_RX = 3, USART_SPI = 4, USART_I2C = 5 } msp430_usartmode_t; typedef struct { unsigned int swrst: 1; //Software reset (0=operational; 1=reset) unsigned int mm: 1; //Multiprocessor mode (0=idle-line protocol; 1=address-bit protocol) unsigned int sync: 1; //Synchronous mode (0=UART; 1=SPI/I2C) unsigned int listen: 1; //Listen enable (0=disabled; 1=enabled, feed tx back to receiver) unsigned int clen: 1; //Character length (0=7-bit data; 1=8-bit data) unsigned int spb: 1; //Stop bits (0=one stop bit; 1=two stop bits) unsigned int pev: 1; //Parity select (0=odd; 1=even) unsigned int pena: 1; //Parity enable (0=disabled; 1=enabled) } __attribute__ ((packed)) msp430_uctl_t ; typedef struct { unsigned int txept:1; //Transmitter empty (0=busy; 1=TX buffer empty or SWRST=1) unsigned int stc:1; //Slave transmit (0=4-pin SPI && STE enabled; 1=3-pin SPI && STE disabled) unsigned int txwake: 1; //Transmiter wake (0=next char is data; 1=next char is address) unsigned int urxse: 1; //Receive start-edge detection (0=disabled; 1=enabled) unsigned int ssel: 2; //Clock source (00=UCLKI; 01=ACLK; 10=SMCLK; 11=SMCLK) unsigned int ckpl: 1; //Clock polarity (0=normal; 1=inverted) unsigned int ckph:1; //Clock phase (0=normal; 1=half-cycle delayed) } __attribute__ ((packed)) msp430_utctl_t; typedef struct { unsigned int rxerr: 1; //Receive error (0=no errors; 1=error detected) unsigned int rxwake: 1; //Receive wake-up (0=received data; 1=received an address) unsigned int urxwie: 1; //Wake-up interrupt-enable (0=all characters set URXIFGx; 1=only address sets URXIFGx) unsigned int urxeie: 1; //Erroneous-character receive (0=rejected; 1=recieved and URXIFGx set) unsigned int brk:1; //Break detect (0=no break; 1=break occured) unsigned int oe:1; //Overrun error (0=no error; 1=overrun error) unsigned int pe:1; //Parity error (0=no error; 1=parity error) unsigned int fe:1; //Framing error (0=no error; 1=low stop bit) } __attribute__ ((packed)) msp430_urctl_t; DEFINE_UNION_CAST(uctl2int,uint8_t,msp430_uctl_t) DEFINE_UNION_CAST(int2uctl,msp430_uctl_t,uint8_t) DEFINE_UNION_CAST(utctl2int,uint8_t,msp430_utctl_t) DEFINE_UNION_CAST(int2utctl,msp430_utctl_t,uint8_t) DEFINE_UNION_CAST(urctl2int,uint8_t,msp430_urctl_t) DEFINE_UNION_CAST(int2urctl,msp430_urctl_t,uint8_t) typedef struct { unsigned int ubr: 16; //Clock division factor (>=0x0002) unsigned int :1; unsigned int mm: 1; //Master mode (0=slave; 1=master) unsigned int :1; unsigned int listen: 1; //Listen enable (0=disabled; 1=enabled, feed tx back to receiver) unsigned int clen: 1; //Character length (0=7-bit data; 1=8-bit data) unsigned int: 3; unsigned int:1; unsigned int stc: 1; //Slave transmit (0=4-pin SPI && STE enabled; 1=3-pin SPI && STE disabled) unsigned int:2; unsigned int ssel: 2; //Clock source (00=external UCLK [slave]; 01=ACLK [master]; 10=SMCLK [master] 11=SMCLK [master]); unsigned int ckpl: 1; //Clock polarity (0=inactive is low && data at rising edge; 1=inverted) unsigned int ckph: 1; //Clock phase (0=normal; 1=half-cycle delayed) unsigned int :0; } msp430_spi_config_t; typedef struct { uint16_t ubr; uint8_t uctl; uint8_t utctl; } msp430_spi_registers_t; typedef union { msp430_spi_config_t spiConfig; msp430_spi_registers_t spiRegisters; } msp430_spi_union_config_t; msp430_spi_union_config_t msp430_spi_default_config = { { ubr : 0x0002, ssel : 0x02, clen : 1, listen : 0, mm : 1, ckph : 1, ckpl : 0, stc : 1 } }; /** The calculations were performed using the msp-uart.pl script: msp-uart.pl -- calculates the uart registers for MSP430 Copyright (C) 2002 - Pedro Zorzenon Neto - pzn dot debian dot org **/ typedef enum { //32KHZ = 32,768 Hz, 1MHZ = 1,048,576 Hz UBR_32KHZ_1200=0x001B, UMCTL_32KHZ_1200=0x94, UBR_32KHZ_1800=0x0012, UMCTL_32KHZ_1800=0x84, UBR_32KHZ_2400=0x000D, UMCTL_32KHZ_2400=0x6D, UBR_32KHZ_4800=0x0006, UMCTL_32KHZ_4800=0x77, UBR_32KHZ_9600=0x0003, UMCTL_32KHZ_9600=0x29, // (Warning: triggers MSP430 errata US14) UBR_1MHZ_1200=0x0369, UMCTL_1MHZ_1200=0x7B, UBR_1MHZ_1800=0x0246, UMCTL_1MHZ_1800=0x55, UBR_1MHZ_2400=0x01B4, UMCTL_1MHZ_2400=0xDF, UBR_1MHZ_4800=0x00DA, UMCTL_1MHZ_4800=0xAA, UBR_1MHZ_9600=0x006D, UMCTL_1MHZ_9600=0x44, UBR_1MHZ_19200=0x0036, UMCTL_1MHZ_19200=0xB5, UBR_1MHZ_38400=0x001B, UMCTL_1MHZ_38400=0x94, UBR_1MHZ_57600=0x0012, UMCTL_1MHZ_57600=0x84, UBR_1MHZ_76800=0x000D, UMCTL_1MHZ_76800=0x6D, UBR_1MHZ_115200=0x0009, UMCTL_1MHZ_115200=0x10, UBR_1MHZ_230400=0x0004, UMCTL_1MHZ_230400=0x55, } msp430_uart_rate_t; typedef struct { unsigned int ubr:16; //Baud rate (use enum msp430_uart_rate_t for predefined rates) unsigned int umctl: 8; //Modulation (use enum msp430_uart_rate_t for predefined rates) unsigned int :1; unsigned int mm: 1; //Multiprocessor mode (0=idle-line protocol; 1=address-bit protocol) unsigned int :1; unsigned int listen: 1; //Listen enable (0=disabled; 1=enabled, feed tx back to receiver) unsigned int clen: 1; //Character length (0=7-bit data; 1=8-bit data) unsigned int spb: 1; //Stop bits (0=one stop bit; 1=two stop bits) unsigned int pev: 1; //Parity select (0=odd; 1=even) unsigned int pena: 1; //Parity enable (0=disabled; 1=enabled) unsigned int :0; unsigned int :3; unsigned int urxse: 1; //Receive start-edge detection (0=disabled; 1=enabled) unsigned int ssel: 2; //Clock source (00=UCLKI; 01=ACLK; 10=SMCLK; 11=SMCLK) unsigned int ckpl: 1; //Clock polarity (0=normal; 1=inverted) unsigned int :1; unsigned int :2; unsigned int urxwie: 1; //Wake-up interrupt-enable (0=all characters set URXIFGx; 1=only address sets URXIFGx) unsigned int urxeie: 1; //Erroneous-character receive (0=rejected; 1=recieved and URXIFGx set) unsigned int :4; unsigned int :0; unsigned int utxe:1; // 1:enable tx module unsigned int urxe:1; // 1:enable rx module } msp430_uart_config_t; typedef struct { uint16_t ubr; uint8_t umctl; uint8_t uctl; uint8_t utctl; uint8_t urctl; uint8_t ume; } msp430_uart_registers_t; typedef union { msp430_uart_config_t uartConfig; msp430_uart_registers_t uartRegisters; } msp430_uart_union_config_t; msp430_uart_union_config_t msp430_uart_default_config = { { utxe : 1, urxe : 1, ubr : UBR_1MHZ_57600, umctl : UMCTL_1MHZ_57600, ssel : 0x02, pena : 0, pev : 0, spb : 0, clen : 1, listen : 0, mm : 0, ckpl : 0, urxse : 0, urxeie : 1, urxwie : 0, utxe : 1, urxe : 1 } }; typedef struct { unsigned int i2cstt: 1; // I2CSTT Bit 0 START bit. (0=No action; 1=Send START condition) unsigned int i2cstp: 1; // I2CSTP Bit 1 STOP bit. (0=No action; 1=Send STOP condition) unsigned int i2cstb: 1; // I2CSTB Bit 2 Start byte. (0=No action; 1=Send START condition and start byte (01h)) unsigned int i2cctrx: 1; //I2CTRX Bit 3 I2C transmit. (0=Receive mode; 1=Transmit mode) pin. unsigned int i2cssel: 2; // I2C clock source select. (00=No clock; 01=ACLK; 10=SMCLK; 11=SMCLK) unsigned int i2ccrm: 1; // I2C repeat mode unsigned int i2cword: 1; // I2C word mode. Selects byte(=0) or word(=1) mode for the I2C data register. } __attribute__ ((packed)) msp430_i2ctctl_t; DEFINE_UNION_CAST(i2ctctl2int,uint8_t,msp430_i2ctctl_t) DEFINE_UNION_CAST(int2i2ctctl,msp430_i2ctctl_t,uint8_t) typedef struct { unsigned int :1; unsigned int mst: 1; //Master mode (0=slave; 1=master) unsigned int :1; unsigned int listen: 1; //Listen enable (0=disabled; 1=enabled, feed tx back to receiver) unsigned int xa: 1; //Extended addressing (0=7-bit addressing; 1=8-bit addressing) unsigned int :1; unsigned int txdmaen: 1; //DMA to TX (0=disabled; 1=enabled) unsigned int rxdmaen: 1; //RX to DMA (0=disabled; 1=enabled) unsigned int :4; unsigned int i2cssel: 2; //Clock source (00=disabled; 01=ACLK; 10=SMCLK; 11=SMCLK) unsigned int i2crm: 1; //Repeat mode (0=use I2CNDAT; 1=count in software) unsigned int i2cword: 1; //Word mode (0=byte mode; 1=word mode) unsigned int i2cpsc: 8; //Clock prescaler (values >0x04 not recomended) unsigned int i2csclh: 8; //High period (high period=[value+2]*i2cpsc; can not be lower than 5*i2cpsc) unsigned int i2cscll: 8; //Low period (low period=[value+2]*i2cpsc; can not be lower than 5*i2cpsc) unsigned int i2coa : 10; // Own address register. unsigned int :6; } msp430_i2c_config_t; typedef struct { uint8_t uctl; uint8_t i2ctctl; uint8_t i2cpsc; uint8_t i2csclh; uint8_t i2cscll; uint16_t i2coa; } msp430_i2c_registers_t; typedef union { msp430_i2c_config_t i2cConfig; msp430_i2c_registers_t i2cRegisters; } msp430_i2c_union_config_t; msp430_i2c_union_config_t msp430_i2c_default_config = { { rxdmaen : 0, txdmaen : 0, xa : 0, listen : 0, mst : 1, i2cword : 0, i2crm : 1, i2cssel : 0x2, i2cpsc : 0, i2csclh : 0x3, i2cscll : 0x3, i2coa : 0, } }; typedef uint8_t uart_speed_t; typedef uint8_t uart_parity_t; typedef uint8_t uart_duplex_t; enum { TOS_UART_1200 = 0, TOS_UART_1800 = 1, TOS_UART_2400 = 2, TOS_UART_4800 = 3, TOS_UART_9600 = 4, TOS_UART_19200 = 5, TOS_UART_38400 = 6, TOS_UART_57600 = 7, TOS_UART_76800 = 8, TOS_UART_115200 = 9, TOS_UART_230400 = 10 }; enum { TOS_UART_OFF, TOS_UART_RONLY, TOS_UART_TONLY, TOS_UART_DUPLEX }; enum { TOS_UART_PARITY_NONE, TOS_UART_PARITY_EVEN, TOS_UART_PARITY_ODD }; #endif//_H_Msp430Usart_h tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/000077500000000000000000000000001207233610700200235ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/000077500000000000000000000000001207233610700207665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciA.nc000066400000000000000000000116761207233610700237020ustar00rootroot00000000000000/* * Copyright (c) 2010 Eric B. Decker * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2004-2005, Technische Universitaet Berlin * All rights reserved. * * Copyright (c) 2004-2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Byte-level interface to control Usci based modules (MSP430X), msp430f2618 etc. * USCI_A supports Uart, SPI, and irDA modes. USCI_B SPI and I2C. Stateless * interface modeled after HplMsp430Usart of the MSP430 family. * * @author Vlado Handziski (handzisk@tkn.tu-berlin.de) * @author Jan Hauer (hauer@tkn.tu-berlin.de) * @author Joe Polastre * @author Xavier Orduna * @author Eric B. Decker * * see msp430usci.h for basic definitions. * See TI MSP430x2xx Family User's Guide SLAU144E for details. */ #include "msp430usci.h" interface HplMsp430UsciA { /* UCxxCTL0 */ async command void setUctl0(msp430_uctl0_t control); async command msp430_uctl0_t getUctl0(); /* UCxxCTL1 */ async command void setUctl1(msp430_uctl1_t control); async command msp430_uctl1_t getUctl1(); /* UCxxBR1 UCxxBR0 */ async command void setUbr(uint16_t ubr); async command uint16_t getUbr(); /* UCxxMCTL */ async command void setUmctl(uint8_t umctl); async command uint8_t getUmctl(); /* * access usci status registers. yes there are control * bits in the status register. */ /* UCxxSTAT */ async command void setUstat(uint8_t ustat); async command uint8_t getUstat(); /* * resetUsci() - reset or unreset module port * * reset: TRUE (set UCSWRST) * FALSE (unset UCSWRST), let the port run */ async command void resetUsci(bool reset); /* * return enum indicating what mode the usci port in in. */ async command msp430_uscimode_t getMode(); /* * configure or deconfigure gpio pins for SPI mode * * switches io pins between port and module function. */ async command void enableSpi(); async command void disableSpi(); /* * Returns TRUE if the Usci is in SPI mode */ async command bool isSpi(); /* * configure usci as spi using config. * leaves interrupts disabled. */ async command void setModeSpi(msp430_spi_union_config_t* config); /* Interrupt control */ async command void disableRxIntr(); async command void disableTxIntr(); async command void disableIntr(); async command void enableRxIntr(); async command void enableTxIntr(); async command void enableIntr(); async command bool isTxIntrPending(); async command bool isRxIntrPending(); async command void clrTxIntr(); async command void clrRxIntr(); async command void clrIntr(); async command bool isTxEmpty(); /** * Transmit a byte of data. When the transmission is completed, * txDone is generated. Only then a new byte may be * transmitted, otherwise the previous byte will be overwritten. */ async command void tx(uint8_t data); /** * Get current value from RX-buffer. * * return: byte received. */ async command uint8_t rx(); /* * Returns TRUE if the Usci is in Uart mode */ async command bool isUart(); /* * configure or deconfigure gpio pins for UART mode * * switches io pins between port and module function. */ async command void enableUart(); async command void disableUart(); /* * configure usci as uart using config. * leaves interrupts disabled. */ async command void setModeUart(msp430_uart_union_config_t* config); } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciA0C.nc000066400000000000000000000047321207233610700240600ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * An HPL abstraction of USCIA0 on the MSP430X. * * @author Jonathan Hui * @author Joe Polastre * @author Xavier Orduna */ #include "msp430usci.h" #define USING_USCIA0 1 configuration HplMsp430UsciA0C { provides interface HplMsp430UsciA; provides interface HplMsp430UsciInterrupts; } implementation { components HplMsp430UsciA0P as HplUsciP; HplMsp430UsciA = HplUsciP; HplMsp430UsciInterrupts = HplUsciP; components HplMsp430GeneralIOC as GIO; HplUsciP.SIMO -> GIO.UCA0SIMO; HplUsciP.SOMI -> GIO.UCA0SOMI; HplUsciP.UCLK -> GIO.UCA0CLK; HplUsciP.URXD -> GIO.UCA0RXD; HplUsciP.UTXD -> GIO.UCA0TXD; components HplMsp430UsciAB0RawInterruptsP as UsciRawInterrupts; HplUsciP.UsciRawInterrupts -> UsciRawInterrupts.UsciA; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciA0P.nc000066400000000000000000000203701207233610700240710ustar00rootroot00000000000000/* * Copyright (c) 2010-2011, Eric B. Decker * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2005-2006, Arch Rock Corporation * Copyright (c) 2004-2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "msp430usci.h" /* * Implementation of usci A0 (uart or spi) low level functionality - stateless. * Setting a mode will by default disable USCI-Interrupts. * * @author: Jan Hauer * @author: Jonathan Hui * @author: Vlado Handziski * @author: Joe Polastre * @author: Philipp Huppertz * @author: Xavier Orduna * @author: Eric B. Decker * * A0, A1: uart, spi, irda. * B0, B1: spi, i2c. * * This module interfaces to usciA0: uart or spi. */ module HplMsp430UsciA0P @safe() { provides { interface HplMsp430UsciA as Usci; interface HplMsp430UsciInterrupts as Interrupts; } uses { interface HplMsp430GeneralIO as SIMO; interface HplMsp430GeneralIO as SOMI; interface HplMsp430GeneralIO as UCLK; interface HplMsp430GeneralIO as URXD; interface HplMsp430GeneralIO as UTXD; interface HplMsp430UsciRawInterrupts as UsciRawInterrupts; } } implementation { MSP430REG_NORACE(IE2); MSP430REG_NORACE(IFG2); MSP430REG_NORACE(UCA0CTL0); MSP430REG_NORACE(UCA0CTL1); MSP430REG_NORACE(UCA0TXBUF); async event void UsciRawInterrupts.rxDone(uint8_t temp) { signal Interrupts.rxDone(temp); } async event void UsciRawInterrupts.txDone() { signal Interrupts.txDone(); } /* Control registers */ async command void Usci.setUctl0(msp430_uctl0_t control) { UCA0CTL0 = uctl02int(control); } async command msp430_uctl0_t Usci.getUctl0() { return int2uctl0(UCA0CTL0); } async command void Usci.setUctl1(msp430_uctl1_t control) { UCA0CTL1 = uctl12int(control); } async command msp430_uctl1_t Usci.getUctl1() { return int2uctl1(UCA0CTL0); } async command void Usci.setUbr(uint16_t control) { atomic { UCA0BR0 = control & 0x00FF; UCA0BR1 = (control >> 8) & 0x00FF; } } async command uint16_t Usci.getUbr() { return (UCA0BR1 << 8) + UCA0BR0; } async command void Usci.setUmctl(uint8_t control) { UCA0MCTL=control; } async command uint8_t Usci.getUmctl() { return UCA0MCTL; } async command void Usci.setUstat(uint8_t control) { UCA0STAT = control; } async command uint8_t Usci.getUstat() { return UCA0STAT; } /* Operations */ async command void Usci.resetUsci(bool reset) { if (reset) SET_FLAG(UCA0CTL1, UCSWRST); else CLR_FLAG(UCA0CTL1, UCSWRST); } bool isSpi() { msp430_uctl0_t tmp; tmp = int2uctl0(UCA0CTL0); return (tmp.ucsync && tmp.ucmode != 3); } bool isI2C() { msp430_uctl0_t tmp; tmp = int2uctl0(UCA0CTL0); return (tmp.ucsync && tmp.ucmode == 3); } bool isUart() { msp430_uctl0_t tmp; tmp = int2uctl0(UCA0CTL0); return (tmp.ucsync == 0); } async command bool Usci.isSpi() { return isSpi(); } async command msp430_uscimode_t Usci.getMode() { if (isSpi()) return USCI_SPI; if (isI2C()) return USCI_I2C; if (isUart()) return USCI_UART; else return USCI_NONE; } async command void Usci.enableSpi() { atomic { call SIMO.selectModuleFunc(); call SOMI.selectModuleFunc(); call UCLK.selectModuleFunc(); } } async command void Usci.disableSpi() { atomic { call SIMO.selectIOFunc(); call SOMI.selectIOFunc(); call UCLK.selectIOFunc(); } } void configSpi(msp430_spi_union_config_t* config) { UCA0CTL1 = (config->spiRegisters.uctl1 | UCSWRST); UCA0CTL0 = (config->spiRegisters.uctl0 | UCSYNC); call Usci.setUbr(config->spiRegisters.ubr); call Usci.setUmctl(0); /* MCTL <- 0 if spi */ } async command void Usci.setModeSpi(msp430_spi_union_config_t* config) { atomic { call Usci.disableIntr(); call Usci.clrIntr(); call Usci.resetUsci(TRUE); call Usci.enableSpi(); configSpi(config); call Usci.resetUsci(FALSE); } } async command bool Usci.isTxIntrPending(){ if (IFG2 & UCA0TXIFG) return TRUE; return FALSE; } async command bool Usci.isRxIntrPending(){ if (IFG2 & UCA0RXIFG) return TRUE; return FALSE; } async command void Usci.clrTxIntr(){ IFG2 &= ~UCA0TXIFG; } async command void Usci.clrRxIntr() { IFG2 &= ~UCA0RXIFG; } async command void Usci.clrIntr() { IFG2 &= ~(UCA0TXIFG | UCA0RXIFG); } async command void Usci.disableRxIntr() { IE2 &= ~UCA0RXIE; } async command void Usci.disableTxIntr() { IE2 &= ~UCA0TXIE; } async command void Usci.disableIntr() { IE2 &= ~(UCA0TXIE | UCA0RXIE); } async command void Usci.enableRxIntr() { atomic { IFG2 &= ~UCA0RXIFG; IE2 |= UCA0RXIE; } } async command void Usci.enableTxIntr() { atomic { IFG2 &= ~UCA0TXIFG; IE2 |= UCA0TXIE; } } async command void Usci.enableIntr() { atomic { IFG2 &= ~(UCA0TXIFG | UCA0RXIFG); IE2 |= (UCA0TXIE | UCA0RXIE); } } /* * Returns true if the transmit path is empty. * * in the usart hardware there was a seperate bit that indicated * both parts of the transmitter path were empty. The TXBUF and * the outgoing shift register. * * Unfortunately, TI changed this in the USCI h/w to a single busy * bit that indcates that either the tx or the rx path is busy. * So if the transmitter is idle but we are receiving a character * then we still think the transmitter is busy. TI sucks. */ async command bool Usci.isTxEmpty() { if (UCA0STAT & UCBUSY) return FALSE; return TRUE; } async command void Usci.tx(uint8_t data) { UCA0TXBUF = data; } async command uint8_t Usci.rx() { return UCA0RXBUF; } async command bool Usci.isUart() { return isUart(); } async command void Usci.enableUart() { atomic { call UTXD.selectModuleFunc(); call URXD.selectModuleFunc(); } } async command void Usci.disableUart() { atomic { call UTXD.selectIOFunc(); call URXD.selectIOFunc(); } } void configUart(msp430_uart_union_config_t* config) { UCA0CTL1 = (config->uartRegisters.uctl1 | UCSWRST); UCA0CTL0 = config->uartRegisters.uctl0; /* ucsync should be off */ call Usci.setUbr(config->uartRegisters.ubr); call Usci.setUmctl(config->uartRegisters.umctl); } async command void Usci.setModeUart(msp430_uart_union_config_t* config) { atomic { call Usci.disableIntr(); call Usci.clrIntr(); call Usci.resetUsci(TRUE); call Usci.enableUart(); configUart(config); call Usci.resetUsci(FALSE); } } } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciA1C.nc000066400000000000000000000047311207233610700240600ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * An HPL abstraction of USCIA1 on the MSP430X. * * @author Jonathan Hui * @author Joe Polastre * @author Xavier Orduna */ #include "msp430usci.h" #define USING_USCIA1 1 configuration HplMsp430UsciA1C { provides interface HplMsp430UsciA; provides interface HplMsp430UsciInterrupts; } implementation { components HplMsp430UsciA1P as HplUsciP; HplMsp430UsciA = HplUsciP; HplMsp430UsciInterrupts = HplUsciP; components HplMsp430GeneralIOC as GIO; HplUsciP.SIMO -> GIO.UCA1SIMO; HplUsciP.SOMI -> GIO.UCA1SOMI; HplUsciP.UCLK -> GIO.UCA1CLK; HplUsciP.URXD -> GIO.UCA1RXD; HplUsciP.UTXD -> GIO.UCA1TXD; components HplMsp430UsciAB1RawInterruptsP as UsciRawInterrupts; HplUsciP.UsciRawInterrupts -> UsciRawInterrupts.UsciA; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciA1P.nc000066400000000000000000000204271207233610700240750ustar00rootroot00000000000000/* * Copyright (c) 2010-2011, Eric B. Decker * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2005-2006, Arch Rock Corporation * Copyright (c) 2004-2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "msp430usci.h" /* * Implementation of usci A1 (uart or spi) low level functionality - stateless. * Setting a mode will by default disable USCI-Interrupts. * * @author: Jan Hauer * @author: Jonathan Hui * @author: Vlado Handziski * @author: Joe Polastre * @author: Philipp Huppertz * @author: Xavier Orduna * @author: Eric B. Decker * * A0, A1: uart, spi, irda. * B0, B1: spi, i2c. * * This module interfaces to usciA1: uart or spi. */ module HplMsp430UsciA1P @safe() { provides { interface HplMsp430UsciA as Usci; interface HplMsp430UsciInterrupts as Interrupts; } uses { interface HplMsp430GeneralIO as SIMO; interface HplMsp430GeneralIO as SOMI; interface HplMsp430GeneralIO as UCLK; interface HplMsp430GeneralIO as URXD; interface HplMsp430GeneralIO as UTXD; interface HplMsp430UsciRawInterrupts as UsciRawInterrupts; } } implementation { MSP430REG_NORACE(UC1IE); MSP430REG_NORACE(UC1IFG); MSP430REG_NORACE(UCA1CTL0); MSP430REG_NORACE(UCA1CTL1); MSP430REG_NORACE(UCA1TXBUF); async event void UsciRawInterrupts.rxDone(uint8_t temp) { signal Interrupts.rxDone(temp); } async event void UsciRawInterrupts.txDone() { signal Interrupts.txDone(); } /* Control registers */ async command void Usci.setUctl0(msp430_uctl0_t control) { UCA1CTL0 = uctl02int(control); } async command msp430_uctl0_t Usci.getUctl0() { return int2uctl0(UCA1CTL0); } async command void Usci.setUctl1(msp430_uctl1_t control) { UCA1CTL1 = uctl12int(control); } async command msp430_uctl1_t Usci.getUctl1() { return int2uctl1(UCA1CTL0); } async command void Usci.setUbr(uint16_t control) { atomic { UCA1BR0 = control & 0x00FF; UCA1BR1 = (control >> 8) & 0x00FF; } } async command uint16_t Usci.getUbr() { return (UCA1BR1 << 8) + UCA1BR0; } async command void Usci.setUmctl(uint8_t control) { UCA1MCTL=control; } async command uint8_t Usci.getUmctl() { return UCA1MCTL; } async command void Usci.setUstat(uint8_t control) { UCA1STAT = control; } async command uint8_t Usci.getUstat() { return UCA1STAT; } /* Operations */ async command void Usci.resetUsci(bool reset) { if (reset) SET_FLAG(UCA1CTL1, UCSWRST); else CLR_FLAG(UCA1CTL1, UCSWRST); } bool isSpi() { msp430_uctl0_t tmp; tmp = int2uctl0(UCA1CTL0); return (tmp.ucsync && tmp.ucmode != 3); } async command bool Usci.isSpi() { return isSpi(); } bool isI2C() { msp430_uctl0_t tmp; tmp = int2uctl0(UCA1CTL0); return (tmp.ucsync && tmp.ucmode == 3); } bool isUart() { msp430_uctl0_t tmp; tmp = int2uctl0(UCA1CTL0); return (tmp.ucsync == 0); } async command msp430_uscimode_t Usci.getMode() { if (isSpi()) return USCI_SPI; if (isI2C()) return USCI_I2C; if (isUart()) return USCI_UART; else return USCI_NONE; } async command void Usci.enableSpi() { atomic { call SIMO.selectModuleFunc(); call SOMI.selectModuleFunc(); call UCLK.selectModuleFunc(); } } async command void Usci.disableSpi() { atomic { call SIMO.selectIOFunc(); call SOMI.selectIOFunc(); call UCLK.selectIOFunc(); } } void configSpi(msp430_spi_union_config_t* config) { UCA1CTL1 = (config->spiRegisters.uctl1 | UCSWRST); UCA1CTL0 = (config->spiRegisters.uctl0 | UCSYNC); call Usci.setUbr(config->spiRegisters.ubr); call Usci.setUmctl(0); /* MCTL <- 0 if spi */ } async command void Usci.setModeSpi(msp430_spi_union_config_t* config) { atomic { call Usci.disableIntr(); call Usci.clrIntr(); call Usci.resetUsci(TRUE); call Usci.enableSpi(); configSpi(config); call Usci.resetUsci(FALSE); } } async command bool Usci.isTxIntrPending(){ if (UC1IFG & UCA1TXIFG) return TRUE; return FALSE; } async command bool Usci.isRxIntrPending(){ if (UC1IFG & UCA1RXIFG) return TRUE; return FALSE; } async command void Usci.clrTxIntr(){ UC1IFG &= ~UCA1TXIFG; } async command void Usci.clrRxIntr() { UC1IFG &= ~UCA1RXIFG; } async command void Usci.clrIntr() { UC1IFG &= ~(UCA1TXIFG | UCA1RXIFG); } async command void Usci.disableRxIntr() { UC1IE &= ~UCA1RXIE; } async command void Usci.disableTxIntr() { UC1IE &= ~UCA1TXIE; } async command void Usci.disableIntr() { UC1IE &= ~(UCA1TXIE | UCA1RXIE); } async command void Usci.enableRxIntr() { atomic { UC1IFG &= ~UCA1RXIFG; UC1IE |= UCA1RXIE; } } async command void Usci.enableTxIntr() { atomic { UC1IFG &= ~UCA1TXIFG; UC1IE |= UCA1TXIE; } } async command void Usci.enableIntr() { atomic { UC1IFG &= ~(UCA1TXIFG | UCA1RXIFG); UC1IE |= (UCA1TXIE | UCA1RXIE); } } /* * Returns true if the transmit path is empty. * * in the usart hardware there was a seperate bit that indicated * both parts of the transmitter path were empty. The TXBUF and * the outgoing shift register. * * Unfortunately, TI changed this in the USCI h/w to a single busy * bit that indcates that either the tx or the rx path is busy. * So if the transmitter is idle but we are receiving a character * then we still think the transmitter is busy. TI sucks. */ async command bool Usci.isTxEmpty() { if (UCA1STAT & UCBUSY) return FALSE; return TRUE; } async command void Usci.tx(uint8_t data) { UCA1TXBUF = data; } async command uint8_t Usci.rx() { return UCA1RXBUF; } async command bool Usci.isUart() { return isUart(); } async command void Usci.enableUart() { atomic { call UTXD.selectModuleFunc(); call URXD.selectModuleFunc(); } } async command void Usci.disableUart() { atomic { call UTXD.selectIOFunc(); call URXD.selectIOFunc(); } } void configUart(msp430_uart_union_config_t* config) { UCA1CTL1 = (config->uartRegisters.uctl1 | UCSWRST); UCA1CTL0 = config->uartRegisters.uctl0; /* ucsync should be off */ call Usci.setUbr(config->uartRegisters.ubr); call Usci.setUmctl(config->uartRegisters.umctl); } async command void Usci.setModeUart(msp430_uart_union_config_t* config) { atomic { call Usci.disableIntr(); call Usci.clrIntr(); call Usci.resetUsci(TRUE); call Usci.enableUart(); configUart(config); call Usci.resetUsci(FALSE); } } } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciAB0RawInterruptsP.nc000066400000000000000000000053111207233610700267430ustar00rootroot00000000000000/* * Copyright (c) 2010-2011 Eric B. Decker * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * An HPL abstraction for USCI A/B shared vector interrupt on the MSP430X. * * @author Xavier Orduna * @author Eric B. Decker */ #include "msp430usci.h" module HplMsp430UsciAB0RawInterruptsP @safe() { provides interface HplMsp430UsciRawInterrupts as UsciA; provides interface HplMsp430UsciRawInterrupts as UsciB; } implementation{ TOSH_SIGNAL(USCIAB0RX_VECTOR) { uint8_t temp; if (IFG2 & UCA0RXIFG){ temp = UCA0RXBUF; signal UsciA.rxDone(temp); } if (IFG2 & UCB0RXIFG){ temp = UCB0RXBUF; signal UsciB.rxDone(temp); } } TOSH_SIGNAL(USCIAB0TX_VECTOR) { if ((IFG2 & UCA0TXIFG) | (IFG2 & UCA0RXIFG)){ signal UsciA.txDone(); } if ((IFG2 & UCB0TXIFG) | (IFG2 & UCB0RXIFG)){ signal UsciB.txDone(); } } /* default handlers */ default async event void UsciA.txDone(){ return; } default async event void UsciA.rxDone(uint8_t temp){ return; } default async event void UsciB.txDone(){ return; } default async event void UsciB.rxDone(uint8_t temp){ return; } } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciAB1RawInterruptsP.nc000066400000000000000000000053261207233610700267520ustar00rootroot00000000000000/* * Copyright (c) 2010-2011 Eric B. Decker * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * An HPL abstraction for USCI A/B shared vector interrupt on the MSP430X. * * @author Xavier Orduna * @author Eric B. Decker */ #include "msp430usci.h" module HplMsp430UsciAB1RawInterruptsP @safe() { provides interface HplMsp430UsciRawInterrupts as UsciA; provides interface HplMsp430UsciRawInterrupts as UsciB; } implementation { TOSH_SIGNAL(USCIAB1RX_VECTOR) { uint8_t temp; if (UC1IFG & UCA1RXIFG){ temp = UCA1RXBUF; signal UsciA.rxDone(temp); } if (UC1IFG & UCB1RXIFG){ temp = UCB1RXBUF; signal UsciB.rxDone(temp); } } TOSH_SIGNAL(USCIAB1TX_VECTOR) { if ((UC1IFG & UCA1TXIFG) | (UC1IFG & UCA1RXIFG)){ signal UsciA.txDone(); } if ((UC1IFG & UCB1TXIFG) | (UC1IFG & UCB1RXIFG)){ signal UsciB.txDone(); } } /* default handlers */ default async event void UsciA.txDone(){ return; } default async event void UsciA.rxDone(uint8_t temp){ return; } default async event void UsciB.txDone(){ return; } default async event void UsciB.rxDone(uint8_t temp){ return; } } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciB.nc000066400000000000000000000142361207233610700236760ustar00rootroot00000000000000/* * Copyright (c) 2010-2011, Eric B. Decker * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2004-2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Byte-level interface to control Usci based modules (MSP430X), msp430f2618 etc. * USCI_B supports SPI and i2c modes. Stateless interface modeled after * HplMsp430Usart of the MSP430 family. * * @author Vlado Handziski (handzisk@tkn.tu-berlin.de) * @author Jan Hauer (hauer@tkn.tu-berlin.de) * @author Joe Polastre * @author Xavier Orduna * @author Eric B. Decker * * see msp430usci.h for basic definitions. * See TI MSP430x2xx Family User's Guide SLAU144E for details. */ #include "msp430usci.h" interface HplMsp430UsciB { /* UCxxCTL0 */ async command void setUctl0(msp430_uctl0_t control); async command msp430_uctl0_t getUctl0(); /* UCxxCTL1 */ async command void setUctl1(msp430_uctl1_t control); async command msp430_uctl1_t getUctl1(); /* UCxxBR1 UCxxBR0 */ async command void setUbr(uint16_t ubr); async command uint16_t getUbr(); /* * access usci status registers. yes there are control * bits in the status register. */ /* UCxxSTAT */ async command void setUstat(uint8_t ustat); async command uint8_t getUstat(); /* * resetUsci() - reset or unreset module port * * reset: TRUE (set UCSWRST) * FALSE (unset UCSWRST), let the port run */ async command void resetUsci(bool reset); /* * return enum indicating what mode the usci port in in. */ async command msp430_uscimode_t getMode(); /* Interrupt control */ async command void disableRxIntr(); async command void disableTxIntr(); async command void disableIntr(); async command void enableRxIntr(); async command void enableTxIntr(); async command void enableIntr(); async command bool isTxIntrPending(); async command bool isRxIntrPending(); async command void clrTxIntr(); async command void clrRxIntr(); async command void clrIntr(); /** * Transmit a byte of data. When the transmission is completed, * txDone is generated. Only then a new byte may be * transmitted, otherwise the previous byte will be overwritten. */ async command void tx(uint8_t data); /** * Get current value from RX-buffer. * * return: byte received. */ async command uint8_t rx(); /*********************************************************************** * * SPI Mode interface * ***********************************************************************/ /* * configure or deconfigure gpio pins for SPI mode * * switches io pins between port and module function. */ async command void enableSpi(); async command void disableSpi(); /* * Returns TRUE if the Usci is in SPI mode */ async command bool isSpi(); /* * configure usci as spi using config. * leaves interrupts disabled. */ async command void setModeSpi(msp430_spi_union_config_t* config); /*********************************************************************** * * I2C Mode interface * ***********************************************************************/ /* * Returns TRUE if the Usci is in i2c mode */ async command bool isI2C(); async command void enableI2C(); async command void disableI2C(); /* * configure usci as i2c using config. * leaves interrupts disabled. */ async command void setModeI2C( msp430_i2c_union_config_t* config ); /* control which direction the bus is in */ async command void setTransmitMode(); async command void setReceiveMode(); /* h/w bits for controlling what to send next when master */ async command void setTXNACK(); async command void setTXStop(); async command void setTXStart(); async command uint16_t getOwnAddress(); async command void setOwnAddress( uint16_t addr ); /* GeneralCall Response control, set/clear */ async command void clearGeneralCall(); async command void setGeneralCall(); /* set master/slave mode, i2c */ async command void setSlaveMode(); async command void setMasterMode(); /* get bits of uctl1 in i2c mode */ async command bool getStopBit(); async command bool getTransmitReceiveMode(); /* when master the SLA (slave address register says who we are talking to. */ async command uint16_t getSlaveAddress(); async command void setSlaveAddress(uint16_t addr); async command void disableNACKInt(); async command void enableNACKInt(); async command void disableStopInt(); async command void enableStopInt(); async command void disableStartInt(); async command void enableStartInt(); async command void disableArbLostInt(); async command void enableArbLostInt(); } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciB0C.nc000066400000000000000000000047231207233610700240610ustar00rootroot00000000000000/* * Copyright (c) 2011 Eric B. Decker * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * An HPL abstraction of USCIB0 on the MSP430. * * @author Jonathan Hui * @author Joe Polastre * @author Xavier Orduna * @author Eric B. Decker */ #include "msp430usci.h" configuration HplMsp430UsciB0C { provides { interface HplMsp430UsciB; interface HplMsp430UsciInterrupts; } } implementation { components HplMsp430UsciB0P as HplUsciP; HplMsp430UsciB = HplUsciP; HplMsp430UsciInterrupts = HplUsciP; components HplMsp430GeneralIOC as GIO; HplUsciP.SIMO -> GIO.UCB0SIMO; HplUsciP.SOMI -> GIO.UCB0SOMI; HplUsciP.UCLK -> GIO.UCB0CLK; components HplMsp430UsciAB0RawInterruptsP as UsciRawInterrupts; HplUsciP.UsciRawInterrupts -> UsciRawInterrupts.UsciB; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciB0P.nc000066400000000000000000000236771207233610700241070ustar00rootroot00000000000000/* * Copyright (c) 2010-2011 Eric B. Decker * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * Copyright (c) 2004-2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "msp430usci.h" /* * Implementation of USCIB0 lowlevel functionality - stateless. * Setting a mode will by default disable USCIB0 interrupts. * * @author: Jan Hauer * @author: Jonathan Hui * @author: Vlado Handziski * @author: Joe Polastre * @author: Philipp Huppertz * @author: Xavier Orduna * @author: Eric B. Decker * @author: Jordi Soucheiron * * A0, A1: uart, spi, irda. * B0, B1: spi, i2c. * * This module interfaces to usciB0: spi or i2c. */ module HplMsp430UsciB0P @safe() { provides { interface HplMsp430UsciB as Usci; interface HplMsp430UsciInterrupts as Interrupts; } uses { interface HplMsp430GeneralIO as SIMO; interface HplMsp430GeneralIO as SOMI; interface HplMsp430GeneralIO as UCLK; interface HplMsp430UsciRawInterrupts as UsciRawInterrupts; } } implementation { MSP430REG_NORACE(IE2); MSP430REG_NORACE(IFG2); MSP430REG_NORACE(UCB0CTL0); MSP430REG_NORACE(UCB0CTL1); MSP430REG_NORACE(UCB0RXBUF); MSP430REG_NORACE(UCB0TXBUF); MSP430REG_NORACE(UCB0I2COA); MSP430REG_NORACE(UCB0I2CIE); async event void UsciRawInterrupts.rxDone(uint8_t temp) { signal Interrupts.rxDone(temp); } async event void UsciRawInterrupts.txDone() { signal Interrupts.txDone(); } /* Control registers */ async command void Usci.setUctl0(msp430_uctl0_t control) { UCB0CTL0 = uctl02int(control); } async command msp430_uctl0_t Usci.getUctl0() { return int2uctl0(UCB0CTL0); } async command void Usci.setUctl1(msp430_uctl1_t control) { UCB0CTL1 = uctl12int(control); } async command msp430_uctl1_t Usci.getUctl1() { return int2uctl1(UCB0CTL1); } async command void Usci.setUbr(uint16_t control) { atomic { UCB0BR0 = control & 0x00FF; UCB0BR1 = (control >> 8) & 0x00FF; } } async command uint16_t Usci.getUbr() { return (UCB0BR1 << 8) + UCB0BR0; } async command void Usci.setUstat(uint8_t control) { UCB0STAT = control; } async command uint8_t Usci.getUstat() { return UCB0STAT; } /* Operations */ async command void Usci.resetUsci(bool reset) { if (reset) SET_FLAG(UCB0CTL1, UCSWRST); else CLR_FLAG(UCB0CTL1, UCSWRST); } bool isSpi() { msp430_uctl0_t tmp; tmp = int2uctl0(UCB0CTL0); return (tmp.ucsync && tmp.ucmode != 3); } bool isI2C() { msp430_uctl0_t tmp; tmp = int2uctl0(UCB0CTL0); return (tmp.ucsync && tmp.ucmode == 3); } async command bool Usci.isSpi() { return isSpi(); } async command msp430_uscimode_t Usci.getMode() { if (isSpi()) return USCI_SPI; if (isI2C()) return USCI_I2C; return USCI_NONE; } async command void Usci.enableSpi() { atomic { call SIMO.selectModuleFunc(); call SOMI.selectModuleFunc(); call UCLK.selectModuleFunc(); } } async command void Usci.disableSpi() { atomic { call SIMO.selectIOFunc(); call SOMI.selectIOFunc(); call UCLK.selectIOFunc(); } } void configSpi(msp430_spi_union_config_t* config) { UCB0CTL1 = (config->spiRegisters.uctl1 | UCSWRST); UCB0CTL0 = (config->spiRegisters.uctl0 | UCSYNC); call Usci.setUbr(config->spiRegisters.ubr); } async command void Usci.setModeSpi(msp430_spi_union_config_t* config) { atomic { call Usci.disableIntr(); call Usci.clrIntr(); call Usci.resetUsci(TRUE); call Usci.enableSpi(); configSpi(config); call Usci.resetUsci(FALSE); } } async command bool Usci.isTxIntrPending(){ if (IFG2 & UCB0TXIFG) return TRUE; return FALSE; } async command bool Usci.isRxIntrPending() { if (IFG2 & UCB0RXIFG) return TRUE; return FALSE; } async command void Usci.clrTxIntr(){ IFG2 &= ~UCB0TXIFG; } async command void Usci.clrRxIntr() { IFG2 &= ~UCB0RXIFG; } async command void Usci.clrIntr() { IFG2 &= ~(UCB0TXIFG | UCB0RXIFG); } async command void Usci.disableRxIntr() { IE2 &= ~UCB0RXIE; } async command void Usci.disableTxIntr() { IE2 &= ~UCB0TXIE; } async command void Usci.disableIntr() { IE2 &= ~(UCB0TXIE | UCB0RXIE); } async command void Usci.enableRxIntr() { atomic { IFG2 &= ~UCB0RXIFG; IE2 |= UCB0RXIE; } } async command void Usci.enableTxIntr() { atomic { IFG2 &= ~UCB0TXIFG; IE2 |= UCB0TXIE; } } async command void Usci.enableIntr() { atomic { IFG2 &= ~(UCB0TXIFG | UCB0RXIFG); IE2 |= (UCB0TXIE | UCB0RXIE); } } async command void Usci.tx(uint8_t data) { UCB0TXBUF = data; } async command uint8_t Usci.rx() { return UCB0RXBUF; } /* * i2c operations */ async command bool Usci.isI2C(){ return isI2C(); } async command void Usci.enableI2C() { atomic { call SIMO.selectModuleFunc(); call SOMI.selectModuleFunc(); call UCLK.selectModuleFunc(); } } async command void Usci.disableI2C() { atomic { call SIMO.selectIOFunc(); call SOMI.selectIOFunc(); call UCLK.selectIOFunc(); } } void configI2C(msp430_i2c_union_config_t* config) { UCB0CTL1 = (config->i2cRegisters.uctl1 | UCSWRST); UCB0CTL0 = (config->i2cRegisters.uctl0 | UCSYNC); call Usci.setUbr(config->i2cRegisters.ubr); UCB0I2COA = config->i2cRegisters.ui2coa; UCB0I2CSA = 0; UCB0I2CIE = 0; } async command void Usci.setModeI2C( msp430_i2c_union_config_t* config ) { atomic { call Usci.disableIntr(); call Usci.clrIntr(); call Usci.resetUsci(TRUE); call Usci.enableI2C(); configI2C(config); call Usci.resetUsci(FALSE); } } async command uint16_t Usci.getOwnAddress(){ return (UCB0I2COA & ~UCGCEN); } async command void Usci.setOwnAddress( uint16_t addr ){ UCB0I2COA &= UCGCEN; UCB0I2COA |= (addr & ~UCGCEN); } /* * commands subsummed into config structure. * * setMasterMode, setSlaveMode, getTransmitReceiveMode, setTransmitMode, * setReceiveMode, getStopBit, setStopBit, getStartBit, * setStartBit, * * the get commands can be replaced by .getUctl0 etc. * * similar things should be done for the other registers. It keeps things * simple and consise. */ /* set direction of the bus */ async command void Usci.setTransmitMode() { UCB0CTL1 |= UCTR; } async command void Usci.setReceiveMode() { UCB0CTL1 &= ~UCTR; } /* transmit a NACK, Stop condition, or Start condition, automatically cleared */ async command void Usci.setTXNACK() { UCB0CTL1 |= UCTXNACK; } async command void Usci.setTXStop() { UCB0CTL1 |= UCTXSTP; } async command void Usci.setTXStart() { UCB0CTL1 |= UCTXSTT; } /* set whether to respond to GeneralCall. */ async command void Usci.clearGeneralCall() { UCB0I2COA &= ~UCGCEN; } async command void Usci.setGeneralCall() { UCB0I2COA |= UCGCEN; } /* set master/slave mode, i2c */ async command void Usci.setSlaveMode() { UCB0CTL0 |= UCMST; } async command void Usci.setMasterMode() { UCB0CTL0 &= ~UCMST; } /* get stop bit in i2c mode */ async command bool Usci.getStopBit() { return (UCB0CTL1 & UCTXSTP); } async command bool Usci.getTransmitReceiveMode() { return (UCB0CTL1 & UCTR); } /* get/set Slave Address, i2cSA */ async command uint16_t Usci.getSlaveAddress() { return UCB0I2CSA; } async command void Usci.setSlaveAddress( uint16_t addr ) { UCB0I2CSA = addr; } /* enable/disable NACK interrupt */ async command void Usci.disableNACKInt() { UCB0I2CIE &= ~UCNACKIE; } async command void Usci.enableNACKInt() { UCB0I2CIE |= UCNACKIE; } /* enable/disable stop condition interrupt */ async command void Usci.disableStopInt() { UCB0I2CIE &= ~UCSTPIE; } async command void Usci.enableStopInt() { UCB0I2CIE |= UCSTPIE; } /* enable/disable start condition interrupt */ async command void Usci.disableStartInt() { UCB0I2CIE &= ~UCSTTIE; } async command void Usci.enableStartInt() { UCB0I2CIE |= UCSTTIE; } /* enable/disable arbitration lost interrupt */ async command void Usci.disableArbLostInt() { UCB0I2CIE &= ~UCALIE; } async command void Usci.enableArbLostInt() { UCB0I2CIE |= UCALIE; } } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciB1C.nc000066400000000000000000000050211207233610700240520ustar00rootroot00000000000000/* * Copyright (c) 2011 Eric B. Decker * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * An HPL abstraction of USCIB1 on the MSP430. * * @author Jonathan Hui * @author Joe Polastre * @author Xavier Orduna * @author Eric B. Decker */ #include "msp430usci.h" configuration HplMsp430UsciB1C { provides { interface HplMsp430UsciB; interface HplMsp430UsciInterrupts; } } implementation { components HplMsp430UsciB1P as HplUsciP; HplMsp430UsciB = HplUsciP; HplMsp430UsciInterrupts = HplUsciP; components HplMsp430GeneralIOC as GIO; HplUsciP.SIMO -> GIO.UCB1SIMO; HplUsciP.SOMI -> GIO.UCB1SOMI; HplUsciP.UCLK -> GIO.UCB1CLK; HplUsciP.USDA -> GIO.UCB1SDA; HplUsciP.USCL -> GIO.UCB1SCL; components HplMsp430UsciAB1RawInterruptsP as UsciRawInterrupts; HplUsciP.UsciRawInterrupts -> UsciRawInterrupts.UsciB; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciB1P.nc000066400000000000000000000242521207233610700240760ustar00rootroot00000000000000/* * Copyright (c) 2010-2011 Eric B. Decker * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * Copyright (c) 2004-2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "msp430usci.h" /* * Implementation of Usci_B1 (spi or i2c) lowlevel functionality - stateless. * Setting a mode will by default disable USCI-Interrupts. * * @author: Jan Hauer * @author: Jonathan Hui * @author: Vlado Handziski * @author: Joe Polastre * @author: Philipp Huppertz * @author: Xavier Orduna * @author: Eric B. Decker * @author: Jordi Soucheiron * * A0, A1: uart, spi, irda. * B0, B1: spi, i2c. * * This module interfaces to usciB1: spi or i2c. */ module HplMsp430UsciB1P @safe() { provides { interface HplMsp430UsciB as Usci; interface HplMsp430UsciInterrupts as Interrupts; } uses { interface HplMsp430GeneralIO as SIMO; interface HplMsp430GeneralIO as SOMI; interface HplMsp430GeneralIO as UCLK; interface HplMsp430GeneralIO as USDA; interface HplMsp430GeneralIO as USCL; interface HplMsp430UsciRawInterrupts as UsciRawInterrupts; } } implementation { MSP430REG_NORACE(UC1IE); MSP430REG_NORACE(UC1IFG); MSP430REG_NORACE(UCB1CTL0); MSP430REG_NORACE(UCB1CTL1); MSP430REG_NORACE(UCB1RXBUF); MSP430REG_NORACE(UCB1TXBUF); MSP430REG_NORACE(UCB1I2COA); MSP430REG_NORACE(UCB1I2CIE); async event void UsciRawInterrupts.rxDone(uint8_t temp) { signal Interrupts.rxDone(temp); } async event void UsciRawInterrupts.txDone() { signal Interrupts.txDone(); } /* Control registers */ async command void Usci.setUctl0(msp430_uctl0_t control) { UCB1CTL0 = uctl02int(control); } async command msp430_uctl0_t Usci.getUctl0() { return int2uctl0(UCB1CTL0); } async command void Usci.setUctl1(msp430_uctl1_t control) { UCB1CTL1 = uctl12int(control); } async command msp430_uctl1_t Usci.getUctl1() { return int2uctl1(UCB1CTL1); } async command void Usci.setUbr(uint16_t control) { atomic { UCB1BR0 = control & 0x00FF; UCB1BR1 = (control >> 8) & 0x00FF; } } async command uint16_t Usci.getUbr() { return (UCB1BR1 << 8) + UCB1BR0; } async command void Usci.setUstat(uint8_t control) { UCB1STAT = control; } async command uint8_t Usci.getUstat() { return UCB1STAT; } /* Operations */ async command void Usci.resetUsci(bool reset) { if (reset) SET_FLAG(UCB1CTL1, UCSWRST); else CLR_FLAG(UCB1CTL1, UCSWRST); } bool isSpi() { msp430_uctl0_t tmp; tmp = int2uctl0(UCB1CTL0); return (tmp.ucsync && tmp.ucmode != 3); } bool isI2C() { msp430_uctl0_t tmp; tmp = int2uctl0(UCB1CTL0); return (tmp.ucsync && tmp.ucmode == 3); } async command bool Usci.isSpi() { return isSpi(); } async command msp430_uscimode_t Usci.getMode() { if (isSpi()) return USCI_SPI; if (isI2C()) return USCI_I2C; return USCI_NONE; } async command void Usci.enableSpi() { atomic { call SIMO.selectModuleFunc(); call SOMI.selectModuleFunc(); call UCLK.selectModuleFunc(); } } async command void Usci.disableSpi() { atomic { call SIMO.selectIOFunc(); call SOMI.selectIOFunc(); call UCLK.selectIOFunc(); } } void configSpi(msp430_spi_union_config_t* config) { UCB1CTL1 = (config->spiRegisters.uctl1 | UCSWRST); UCB1CTL0 = (config->spiRegisters.uctl0 | UCSYNC); call Usci.setUbr(config->spiRegisters.ubr); } async command void Usci.setModeSpi(msp430_spi_union_config_t* config) { atomic { call Usci.disableIntr(); call Usci.clrIntr(); call Usci.resetUsci(TRUE); call Usci.enableSpi(); configSpi(config); call Usci.resetUsci(FALSE); } } async command bool Usci.isTxIntrPending(){ if (UC1IFG & UCB1TXIFG) return TRUE; return FALSE; } async command bool Usci.isRxIntrPending() { if (UC1IFG & UCB1RXIFG) return TRUE; return FALSE; } async command void Usci.clrTxIntr(){ UC1IFG &= ~UCB1TXIFG; } async command void Usci.clrRxIntr() { UC1IFG &= ~UCB1RXIFG; } async command void Usci.clrIntr() { UC1IFG &= ~(UCB1TXIFG | UCB1RXIFG); } async command void Usci.disableRxIntr() { UC1IE &= ~UCB1RXIE; } async command void Usci.disableTxIntr() { UC1IE &= ~UCB1TXIE; } async command void Usci.disableIntr() { UC1IE &= ~(UCB1TXIE | UCB1RXIE); } async command void Usci.enableRxIntr() { atomic { UC1IFG &= ~UCB1RXIFG; UC1IE |= UCB1RXIE; } } async command void Usci.enableTxIntr() { atomic { UC1IFG &= ~UCB1TXIFG; UC1IE |= UCB1TXIE; } } async command void Usci.enableIntr() { atomic { UC1IFG &= ~(UCB1TXIFG | UCB1RXIFG); UC1IE |= (UCB1TXIE | UCB1RXIE); } } async command void Usci.tx(uint8_t data) { UCB1TXBUF = data; } async command uint8_t Usci.rx() { return UCB1RXBUF; } /* * i2c operations */ async command bool Usci.isI2C(){ return isI2C(); } async command void Usci.enableI2C() { atomic { #ifdef PLATFORM_Z1 /* Dirty, needs fixing */ P5OUT &= ~0x06; P5REN &= ~0x06; P5OUT |= 0x06; P5REN |= 0x06; #endif call USDA.selectModuleFunc(); call USCL.selectModuleFunc(); } } async command void Usci.disableI2C() { atomic { call USDA.selectIOFunc(); call USCL.selectIOFunc(); } } void configI2C(msp430_i2c_union_config_t* config) { UCB1CTL1 = (config->i2cRegisters.uctl1 | UCSWRST); UCB1CTL0 = (config->i2cRegisters.uctl0 | UCSYNC); call Usci.setUbr(config->i2cRegisters.ubr); UCB1I2COA = config->i2cRegisters.ui2coa; UCB1I2CSA = 0; UCB1I2CIE = 0; } async command void Usci.setModeI2C( msp430_i2c_union_config_t* config ) { atomic { call Usci.disableIntr(); call Usci.clrIntr(); call Usci.resetUsci(TRUE); call Usci.enableI2C(); configI2C(config); call Usci.resetUsci(FALSE); } } async command uint16_t Usci.getOwnAddress(){ return UCB1I2COA & ~UCGCEN; } async command void Usci.setOwnAddress( uint16_t addr ){ UCB1I2COA &= UCGCEN; UCB1I2COA |= (addr & ~UCGCEN); } /* * commands subsummed into config structure. * * setMasterMode, setSlaveMode, getTransmitReceiveMode, setTransmitMode, * setReceiveMode, getStopBit, setStopBit, getStartBit, * setStartBit, * * the get commands can be replaced by .getUctl0 etc. * * similar things should be done for the other registers. It keeps things * simple and consise. */ /* set direction of the bus */ async command void Usci.setTransmitMode() { UCB1CTL1 |= UCTR; } async command void Usci.setReceiveMode() { UCB1CTL1 &= ~UCTR; } /* transmit a NACK, Stop condition, or Start condition, automatically cleared */ async command void Usci.setTXNACK() { UCB1CTL1 |= UCTXNACK; } async command void Usci.setTXStop() { UCB1CTL1 |= UCTXSTP; } async command void Usci.setTXStart() { UCB1CTL1 |= UCTXSTT; } /* set whether to respond to GeneralCall. */ async command void Usci.clearGeneralCall() { UCB1I2COA &= ~UCGCEN; } async command void Usci.setGeneralCall() { UCB1I2COA |= UCGCEN; } /* set master/slave mode, i2c */ async command void Usci.setSlaveMode() { UCB1CTL0 |= UCMST; } async command void Usci.setMasterMode() { UCB1CTL0 &= ~UCMST; } /* get stop bit in i2c mode */ async command bool Usci.getStopBit() { return (UCB1CTL1 & UCTXSTP); } async command bool Usci.getTransmitReceiveMode() { return (UCB1CTL1 & UCTR); } /* get/set Slave Address, i2cSA */ async command uint16_t Usci.getSlaveAddress() { atomic { return UCB1I2CSA; } } async command void Usci.setSlaveAddress( uint16_t addr ) { atomic { UCB1I2CSA = addr; } } /* enable/disable NACK interrupt */ async command void Usci.disableNACKInt() { UCB1I2CIE &= ~UCNACKIE; } async command void Usci.enableNACKInt() { UCB1I2CIE |= UCNACKIE; } /* enable/disable stop condition interrupt */ async command void Usci.disableStopInt() { UCB1I2CIE &= ~UCSTPIE; } async command void Usci.enableStopInt() { UCB1I2CIE |= UCSTPIE; } /* enable/disable start condition interrupt */ async command void Usci.disableStartInt() { UCB1I2CIE &= ~UCSTTIE; } async command void Usci.enableStartInt() { UCB1I2CIE |= UCSTTIE; } /* enable/disable arbitration lost interrupt */ async command void Usci.disableArbLostInt() { UCB1I2CIE &= ~UCALIE; } async command void Usci.enableArbLostInt() { UCB1I2CIE |= UCALIE; } } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciInterrupts.nc000066400000000000000000000043231207233610700256700ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2004-2005, Technische Universität Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Byte-level interface to control a USCI. *

      The USCI can be switched to SPI, UART or I2C mode. The interface follows * the convention of being stateless, thus a higher layer has to maintain * state information. * * @author Jan Hauer (hauer@tkn.tu-berlin.de) * @author Joe Polastre */ #include "msp430usci.h" interface HplMsp430UsciInterrupts { /** * A byte of data is about to be transmitted, ie. the TXBuffer is * empty and ready to accept next byte. */ async event void txDone(); /* * A byte of data has been received. */ async event void rxDone(uint8_t data); } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/HplMsp430UsciRawInterrupts.nc000066400000000000000000000043211207233610700263400ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2004-2005, Technische Universität Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Byte-level interface to control a USART. *

      The USCI can be switched to SPI- or UART-mode. The interface follows * the convention of being stateless, thus a higher layer has to maintain * state information. * * @author Jan Hauer (hauer@tkn.tu-berlin.de) * @author Joe Polastre */ #include "msp430usci.h" interface HplMsp430UsciRawInterrupts { /* * A byte of data is about to be transmitted, ie. the TXBuffer is * empty and ready to accept next byte. */ async event void txDone(); /* * A byte of data has been received. */ async event void rxDone(uint8_t data); } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430I2C1C.nc000066400000000000000000000050041207233610700227570ustar00rootroot00000000000000/** * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Xavier Orduna * @version $Revision: 1.5 $ $Date: 2008/05/21 22:11:57 $ */ #include #include "msp430usci.h" generic configuration Msp430I2C1C() { provides interface Resource; provides interface ResourceRequested; provides interface I2CPacket as I2CBasicAddr; uses interface Msp430I2CConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_I2C1_BUS ), }; components Msp430I2C1P as I2CP; Resource = I2CP.Resource[ CLIENT_ID ]; I2CBasicAddr = I2CP.I2CBasicAddr; Msp430I2CConfigure = I2CP.Msp430I2CConfigure[ CLIENT_ID ]; components new Msp430UsciB1C() as UsciC; ResourceRequested = UsciC; I2CP.ResourceConfigure[ CLIENT_ID ] <- UsciC.ResourceConfigure; I2CP.UsciResource[ CLIENT_ID ] -> UsciC.Resource; I2CP.Interrupts -> UsciC.HplMsp430UsciInterrupts; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430I2C1P.nc000066400000000000000000000047321207233610700230030ustar00rootroot00000000000000/** * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDERS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Xavier Orduna * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:11 $ */ configuration Msp430I2C1P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[uint8_t id ]; provides interface I2CPacket as I2CBasicAddr; uses interface Resource as UsciResource[ uint8_t id ]; uses interface Msp430I2CConfigure[ uint8_t id ]; uses interface HplMsp430UsciInterrupts as Interrupts; } implementation { components new Msp430I2CP() as I2CP; Resource = I2CP.Resource; ResourceConfigure = I2CP.ResourceConfigure; Msp430I2CConfigure = I2CP.Msp430I2CConfigure; I2CBasicAddr = I2CP.I2CBasicAddr; UsciResource = I2CP.UsciResource; Interrupts = I2CP.Interrupts; components HplMsp430UsciB1C as UsciC; I2CP.UsciB -> UsciC; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430I2CConfigure.nc000066400000000000000000000036401207233610700244410ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface used by Msp430I2C clients to reconfigure the I2C before use * @author Vlado Handziski * @author Xavier Orduna */ #include "msp430usci.h" interface Msp430I2CConfigure { async command msp430_i2c_union_config_t* getConfig(); } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430I2CP.nc000066400000000000000000000163601207233610700227220ustar00rootroot00000000000000/* * Copyright (c) 2010-2011 Eric B. Decker * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui * @author Xavier Orduña * @author Jordi Soucheiron * @author Eric B. Decker */ #include generic module Msp430I2CP() { provides { interface Resource[ uint8_t id ]; interface ResourceConfigure[ uint8_t id ]; interface I2CPacket as I2CBasicAddr; } uses { interface Resource as UsciResource[ uint8_t id ]; interface Msp430I2CConfigure[ uint8_t id ]; interface HplMsp430UsciB as UsciB; interface HplMsp430UsciInterrupts as Interrupts; } } implementation { enum { /* Due to different versions of msp430-gcc toolchain this value has * been incremented (200 in v.3.2.3, 800 in v.4.5.3), it is currently * functional but this has to be addressed */ TIMEOUT = 1200, }; norace uint8_t* m_buf; norace uint8_t m_len; norace uint8_t m_pos; norace i2c_flags_t m_flags; void nextRead(); void nextWrite(); void signalDone( error_t error ); async command error_t Resource.immediateRequest[ uint8_t id ]() { return call UsciResource.immediateRequest[ id ](); } async command error_t Resource.request[ uint8_t id ]() { return call UsciResource.request[ id ](); } async command uint8_t Resource.isOwner[ uint8_t id ]() { return call UsciResource.isOwner[ id ](); } async command error_t Resource.release[ uint8_t id ]() { return call UsciResource.release[ id ](); } async command void ResourceConfigure.configure[ uint8_t id ]() { call UsciB.setModeI2C(call Msp430I2CConfigure.getConfig[id]()); } async command void ResourceConfigure.unconfigure[ uint8_t id ]() { call UsciB.disableI2C(); } event void UsciResource.granted[ uint8_t id ]() { signal Resource.granted[ id ](); } default async command error_t UsciResource.request[ uint8_t id ]() { return FAIL; } default async command error_t UsciResource.immediateRequest[ uint8_t id ]() { return FAIL; } default async command error_t UsciResource.release[ uint8_t id ]() {return FAIL;} default event void Resource.granted[ uint8_t id ]() {} default async command msp430_i2c_union_config_t* Msp430I2CConfigure.getConfig[uint8_t id]() { return (msp430_i2c_union_config_t *) &msp430_i2c_default_config; } async command error_t I2CBasicAddr.read( i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* buf ) { uint16_t i = 0; m_buf = buf; m_len = len; m_flags = flags; m_pos = 0; call UsciB.setReceiveMode(); call UsciB.setSlaveAddress(addr); call UsciB.enableRxIntr(); if ( flags & I2C_START ) { while(call UsciB.getStopBit()){ if(i>=TIMEOUT) { return EBUSY; } i++; } call UsciB.setTXStart(); } else { nextRead(); } return SUCCESS; } async command error_t I2CBasicAddr.write( i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* buf ) { uint16_t i = 0; m_buf = buf; m_len = len; m_flags = flags; m_pos = 0; while((call UsciB.getUstat()) & UCBBUSY) { if(i>=TIMEOUT) { return FAIL; } i++; } call UsciB.setTransmitMode(); call UsciB.setSlaveAddress(addr); call UsciB.enableTxIntr(); if ( flags & I2C_START ) { while(call UsciB.getStopBit()){ if(i>=TIMEOUT) { return EBUSY; } i++; } i=0; while((call UsciB.getUstat()) & UCBBUSY) { if(i>=TIMEOUT) { return FAIL; } i++; } call UsciB.setTXStart(); } else { nextWrite(); } return SUCCESS; } void nextRead() { uint16_t i=0; #ifdef USCI_X2XXX_DELAY for(i=0xffff;i!=0;i--) asm("nop"); //software delay (aprox 25msec on z1) #endif if ( m_pos == m_len ) { if ( m_flags & I2C_STOP ) { call UsciB.setTXStop(); while(!call UsciB.getStopBit()){ if(i>=TIMEOUT) { signalDone( EBUSY ); return; } i++; } signalDone( SUCCESS ); } else { signalDone( SUCCESS ); } } else { m_buf[ m_pos++ ] = call UsciB.rx(); } } void nextWrite() { uint16_t i = 0; #ifdef USCI_X2XXX_DELAY for(i=0xffff;i!=0;i--) asm("nop"); //software delay (aprox 25msec on z1) #endif if ( ( m_pos == m_len) && ( m_flags & I2C_STOP ) ) { call UsciB.setTXStop(); while(call UsciB.getStopBit()){ if(i>=TIMEOUT) { signalDone( EBUSY ); return; } i++; } signalDone( SUCCESS ); } else { if((call UsciB.getUstat()) == ( UCBBUSY | UCNACKIFG | UCSCLLOW)) { signal I2CBasicAddr.writeDone( FAIL, call UsciB.getSlaveAddress(), m_len, m_buf ); return; } call UsciB.tx( m_buf[ m_pos++ ] ); } } async event void Interrupts.txDone(){ call UsciB.clrTxIntr(); if (call UsciB.getTransmitReceiveMode()) nextWrite(); else nextRead(); } async event void Interrupts.rxDone(uint8_t data){ call UsciB.clrRxIntr(); if (call UsciB.getTransmitReceiveMode()) nextWrite(); else nextRead(); } void signalDone(error_t error) { call UsciB.clrIntr(); call UsciB.disableIntr(); if (call UsciB.getTransmitReceiveMode()) signal I2CBasicAddr.writeDone(error, call UsciB.getSlaveAddress(), m_len, m_buf); else signal I2CBasicAddr.readDone(error, call UsciB.getSlaveAddress(), m_len, m_buf); } default async command error_t UsciResource.isOwner[ uint8_t id ]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430SpiB0C.nc000066400000000000000000000054461207233610700232500ustar00rootroot00000000000000/* * Copyright (c) 2010-2011 Eric B. Decker * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * SpiB0: SPI/USCI_B0. Defaults to no DMA, sw SPI implementation. * To utilize the DMA, via Msp430SpiB0DmaP define ENABLE_SPIB0_DMA. * * @author Jonathan Hui * @author Mark Hays * @author Xavier Orduna * @author Eric B. Decker */ #include "msp430usci.h" generic configuration Msp430SpiB0C() { provides { interface Resource; interface ResourceRequested; interface SpiByte; interface SpiPacket; } uses interface Msp430SpiConfigure; } implementation { enum { CLIENT_ID = unique(MSP430_SPI0_BUS), }; #ifdef ENABLE_SPIB0_DMA #warning "Enabling SPI DMA on USCIB0" components Msp430SpiDmaB0P as SpiP; #else components Msp430SpiNoDmaB0P as SpiP; #endif Resource = SpiP.Resource[CLIENT_ID]; SpiByte = SpiP.SpiByte; SpiPacket = SpiP.SpiPacket[CLIENT_ID]; Msp430SpiConfigure = SpiP.Msp430SpiConfigure[CLIENT_ID]; components new Msp430UsciB0C() as UsciC; ResourceRequested = UsciC; SpiP.ResourceConfigure[CLIENT_ID] <- UsciC.ResourceConfigure; SpiP.UsciResource[CLIENT_ID] -> UsciC.Resource; SpiP.UsciInterrupts -> UsciC.HplMsp430UsciInterrupts; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430SpiConfigure.nc000066400000000000000000000036401207233610700246170ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface used by Msp430Spi clients to reconfigure the SPI before use * @author Vlado Handziski * @author Xavier Orduna */ #include "msp430usci.h" interface Msp430SpiConfigure { async command msp430_spi_union_config_t* getConfig(); } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430SpiDmaB0P.nc000066400000000000000000000056061207233610700237050ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Mark Hays * @author Xavier Orduna * @version $Revision: 1.5 $ $Date: 2007/11/08 21:34:42 $ */ configuration Msp430SpiDmaB0P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; provides interface SpiByte; provides interface SpiPacket[ uint8_t id ]; uses interface Resource as UsciResource[ uint8_t id ]; uses interface Msp430SpiConfigure[ uint8_t id ]; uses interface HplMsp430UsciInterrupts as UsciInterrupts; } implementation { #include "Msp430Dma.h" components new Msp430SpiDmaBP(IFG2_, UCB0TXBUF_, UCB0TXIFG, (uint16_t) DMA_TRIGGER_UCB0TXIFG, UCB0RXBUF_, UCB0RXIFG, (uint16_t) DMA_TRIGGER_UCB0RXIFG) as SpiP; Resource = SpiP.Resource; ResourceConfigure = SpiP.ResourceConfigure; Msp430SpiConfigure = SpiP.Msp430SpiConfigure; SpiByte = SpiP.SpiByte; SpiPacket = SpiP.SpiPacket; UsciResource = SpiP.UsciResource; UsciInterrupts = SpiP.UsciInterrupts; components HplMsp430UsciB0C as UsciC; SpiP.Usci -> UsciC; components Msp430DmaC as DmaC; SpiP.DmaChannel1 -> DmaC.Channel1; SpiP.DmaChannel2 -> DmaC.Channel2; components LedsC as Leds; SpiP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430SpiDmaBP.nc000066400000000000000000000143071207233610700236230ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Mark Hays * @author Roman Lim * @author Xavier Orduna * @version $Revision: 1.6 $ $Date: 2008/02/28 17:28:12 $ */ generic module Msp430SpiDmaBP( uint16_t IFG_addr, uint16_t TXBUF_addr, uint8_t TXIFG, uint16_t TXTRIG, uint16_t RXBUF_addr, uint8_t RXIFG, uint16_t RXTRIG ) { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; provides interface SpiByte; provides interface SpiPacket[ uint8_t id ]; uses interface Msp430DmaChannel as DmaChannel1; uses interface Msp430DmaChannel as DmaChannel2; uses interface Resource as UsciResource[ uint8_t id ]; uses interface Msp430SpiConfigure[uint8_t id ]; uses interface HplMsp430UsciB as Usci; uses interface HplMsp430UsciInterrupts as UsciInterrupts; uses interface Leds; } implementation { #define IFG (*(volatile uint8_t*)IFG_addr) uint8_t* m_tx_buf; uint8_t* m_rx_buf; uint16_t m_len; uint8_t m_client; uint8_t m_dump; void signalDone( error_t error ); task void signalDone_task(); async command error_t Resource.immediateRequest[ uint8_t id ]() { return call UsciResource.immediateRequest[ id ](); } async command error_t Resource.request[ uint8_t id ]() { return call UsciResource.request[ id ](); } async command error_t Resource.release[ uint8_t id ]() { return call UsciResource.release[ id ](); } async command void ResourceConfigure.configure[ uint8_t id ]() { call Usci.setModeSpi(call Msp430SpiConfigure.getConfig[id]()); } async command void ResourceConfigure.unconfigure[ uint8_t id ]() { call Usci.resetUsci(TRUE); call Usci.disableSpi(); call Usci.resetUsci(FALSE); } event void UsciResource.granted[ uint8_t id ]() { signal Resource.granted[ id ](); } async command uint8_t Resource.isOwner[ uint8_t id ]() { return call UsciResource.isOwner[ id ](); } default async command error_t UsciResource.isOwner[ uint8_t id ]() { return FAIL; } default async command error_t UsciResource.request[ uint8_t id ]() { return FAIL; } default async command error_t UsciResource.immediateRequest[ uint8_t id ]() { return FAIL; } default async command error_t UsciResource.release[ uint8_t id ]() { return FAIL; } default async command msp430_spi_union_config_t* Msp430SpiConfigure.getConfig[uint8_t id]() { return &msp430_spi_default_config; } default event void Resource.granted[ uint8_t id ]() {} async command uint8_t SpiByte.write( uint8_t tx ) { call Usci.tx( tx ); while( !call Usci.isRxIntrPending() ); call Usci.clrRxIntr(); return call Usci.rx(); } async command error_t SpiPacket.send[ uint8_t id ]( uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len ) { atomic { m_client = id; m_tx_buf = tx_buf; m_rx_buf = rx_buf; m_len = len; } if ( len ) { // clear the interrupt flags IFG &= ~( TXIFG | RXIFG ); // set up the RX xfer call DmaChannel1.setupTransfer(DMA_SINGLE_TRANSFER, RXTRIG, DMA_EDGE_SENSITIVE, (void *) RXBUF_addr, rx_buf ? rx_buf : &m_dump, len, DMA_BYTE, DMA_BYTE, DMA_ADDRESS_UNCHANGED, rx_buf ? DMA_ADDRESS_INCREMENTED : DMA_ADDRESS_UNCHANGED); // this doesn't start a transfer; it simply enables the channel call DmaChannel1.startTransfer(); // set up the TX xfer call DmaChannel2.setupTransfer(DMA_SINGLE_TRANSFER, TXTRIG, DMA_EDGE_SENSITIVE, tx_buf, (void *) TXBUF_addr, len, DMA_BYTE, DMA_BYTE, DMA_ADDRESS_INCREMENTED, DMA_ADDRESS_UNCHANGED); // this doesn't start a transfer; it simply enables the channel call DmaChannel2.startTransfer(); // pong the tx flag to get things rolling IFG |= TXIFG; } else { post signalDone_task(); } return SUCCESS; } task void signalDone_task() { atomic signalDone( SUCCESS ); } async event void DmaChannel1.transferDone( error_t error ) { signalDone( error ); } async event void DmaChannel2.transferDone( error_t error ) {} void signalDone( error_t error ) { signal SpiPacket.sendDone[ m_client ]( m_tx_buf, m_rx_buf, m_len, error ); } async event void UsciInterrupts.txDone() {} async event void UsciInterrupts.rxDone( uint8_t data ) {} default async event void SpiPacket.sendDone[ uint8_t id ]( uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len, error_t error ) {} } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430SpiNoDmaB0P.nc000066400000000000000000000050751207233610700242020ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Xavier Orduna * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:11 $ */ configuration Msp430SpiNoDmaB0P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[uint8_t id ]; provides interface SpiByte; provides interface SpiPacket[ uint8_t id ]; uses interface Resource as UsciResource[ uint8_t id ]; uses interface Msp430SpiConfigure[ uint8_t id ]; uses interface HplMsp430UsciInterrupts as UsciInterrupts; } implementation { components new Msp430SpiNoDmaBP() as SpiP; Resource = SpiP.Resource; ResourceConfigure = SpiP.ResourceConfigure; Msp430SpiConfigure = SpiP.Msp430SpiConfigure; SpiByte = SpiP.SpiByte; SpiPacket = SpiP.SpiPacket; UsciResource = SpiP.UsciResource; UsciInterrupts = SpiP.UsciInterrupts; components HplMsp430UsciB0C as UsciC; SpiP.Usci -> UsciC; components LedsC as Leds; SpiP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430SpiNoDmaBP.nc000066400000000000000000000134131207233610700241150ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Jan Hauer (bugfix in continueOp()) * @author Xavier Orduna * @version $Revision: 1.6 $ $Date: 2008/06/16 07:31:21 $ */ generic module Msp430SpiNoDmaBP() { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; provides interface SpiByte; provides interface SpiPacket[ uint8_t id ]; uses interface Resource as UsciResource[ uint8_t id ]; uses interface Msp430SpiConfigure[ uint8_t id ]; uses interface HplMsp430UsciB as Usci; uses interface HplMsp430UsciInterrupts as UsciInterrupts; uses interface Leds; } implementation { enum { SPI_ATOMIC_SIZE = 2, }; norace uint16_t m_len; norace uint8_t* COUNT_NOK(m_len) m_tx_buf; norace uint8_t* COUNT_NOK(m_len) m_rx_buf; norace uint16_t m_pos; norace uint8_t m_client; void signalDone(); task void signalDone_task(); async command error_t Resource.immediateRequest[ uint8_t id ]() { return call UsciResource.immediateRequest[ id ](); } async command error_t Resource.request[ uint8_t id ]() { return call UsciResource.request[ id ](); } async command uint8_t Resource.isOwner[ uint8_t id ]() { return call UsciResource.isOwner[ id ](); } async command error_t Resource.release[ uint8_t id ]() { return call UsciResource.release[ id ](); } async command void ResourceConfigure.configure[ uint8_t id ]() { call Usci.setModeSpi(call Msp430SpiConfigure.getConfig[id]()); } async command void ResourceConfigure.unconfigure[ uint8_t id ]() { call Usci.resetUsci(TRUE); call Usci.disableSpi(); call Usci.resetUsci(FALSE); } event void UsciResource.granted[ uint8_t id ]() { signal Resource.granted[ id ](); } async command uint8_t SpiByte.write( uint8_t tx ) { uint8_t byte; // we are in spi mode which is configured to have turned off interrupts //call Usart.disableRxIntr(); call Usci.tx( tx ); while( !call Usci.isRxIntrPending() ); call Usci.clrRxIntr(); byte = call Usci.rx(); //call Usart.enableRxIntr(); return byte; } default async command error_t UsciResource.isOwner[ uint8_t id ]() { return FAIL; } default async command error_t UsciResource.request[ uint8_t id ]() { return FAIL; } default async command error_t UsciResource.immediateRequest[ uint8_t id ]() { return FAIL; } default async command error_t UsciResource.release[ uint8_t id ]() { return FAIL; } default async command msp430_spi_union_config_t* Msp430SpiConfigure.getConfig[uint8_t id]() { return (msp430_spi_union_config_t*) &msp430_spi_default_config; } default event void Resource.granted[ uint8_t id ]() {} void continueOp() { uint8_t end; uint8_t tmp; atomic { call Usci.tx( m_tx_buf ? m_tx_buf[ m_pos ] : 0 ); end = m_pos + SPI_ATOMIC_SIZE; if ( end > m_len ) end = m_len; while ( ++m_pos < end ) { while( !call Usci.isRxIntrPending() ); tmp = call Usci.rx(); if ( m_rx_buf ) m_rx_buf[ m_pos - 1 ] = tmp; call Usci.tx( m_tx_buf ? m_tx_buf[ m_pos ] : 0 ); } } } async command error_t SpiPacket.send[ uint8_t id ]( uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len ) { m_client = id; m_tx_buf = tx_buf; m_rx_buf = rx_buf; m_len = len; m_pos = 0; if ( len ) { call Usci.enableRxIntr(); continueOp(); } else { post signalDone_task(); } return SUCCESS; } task void signalDone_task() { atomic signalDone(); } async event void UsciInterrupts.rxDone( uint8_t data ) { if ( m_rx_buf ) m_rx_buf[ m_pos-1 ] = data; if ( m_pos < m_len ) continueOp(); else { call Usci.disableRxIntr(); signalDone(); } } void signalDone() { signal SpiPacket.sendDone[ m_client ]( m_tx_buf, m_rx_buf, m_len, SUCCESS ); } async event void UsciInterrupts.txDone() {} default async event void SpiPacket.sendDone[ uint8_t id ]( uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len, error_t error ) {} } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430Uart0C.nc000066400000000000000000000053341207233610700233220ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * An implementation of the UART on USCIA0 for the MSP430. * @author Vlado Handziski * @author Jonathan Hui * @author Eric B. Decker * @author Xavier Orduna * @version $Revision: 1.6 $ $Date: 2008/05/21 22:11:57 $ */ #include "msp430usci.h" generic configuration Msp430Uart0C() { provides interface Resource; provides interface ResourceRequested; provides interface UartStream; provides interface UartByte; uses interface Msp430UartConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_UART0_BUS ), }; components Msp430Uart0P as UartP; Resource = UartP.Resource[ CLIENT_ID ]; UartStream = UartP.UartStream[ CLIENT_ID ]; UartByte = UartP.UartByte[ CLIENT_ID ]; Msp430UartConfigure = UartP.Msp430UartConfigure[ CLIENT_ID ]; components new Msp430UsciA0C() as UsciC; ResourceRequested = UsciC; UartP.ResourceConfigure[ CLIENT_ID ] <- UsciC.ResourceConfigure; UartP.UsciResource[ CLIENT_ID ] -> UsciC.Resource; UartP.UsciInterrupts[ CLIENT_ID ] -> UsciC.HplMsp430UsciInterrupts; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430Uart0P.nc000066400000000000000000000054161207233610700233400ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Vlado Handziski * @author Eric B. Decker * @author Xavier Orduna * @version $Revision: 1.5 $ $Date: 2008/05/21 22:11:57 $ */ configuration Msp430Uart0P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; provides interface UartStream[ uint8_t id ]; provides interface UartByte[ uint8_t id ]; uses interface Resource as UsciResource[ uint8_t id ]; uses interface Msp430UartConfigure[ uint8_t id ]; uses interface HplMsp430UsciInterrupts as UsciInterrupts[ uint8_t id ]; } implementation { components new Msp430UartP() as UartP; Resource = UartP.Resource; ResourceConfigure = UartP.ResourceConfigure; Msp430UartConfigure = UartP.Msp430UartConfigure; UartStream = UartP.UartStream; UartByte = UartP.UartByte; UsciResource = UartP.UsciResource; UsciInterrupts = UartP.UsciInterrupts; components HplMsp430UsciA0C as UsciC; UartP.Usci -> UsciC; components Counter32khz16C as CounterC; UartP.Counter -> CounterC; components LedsC as Leds; UartP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430Uart1C.nc000066400000000000000000000053341207233610700233230ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * An implementation of the UART on USCIA1 for the MSP430. * @author Vlado Handziski * @author Jonathan Hui * @author Eric B. Decker * @author Xavier Orduna * @version $Revision: 1.5 $ $Date: 2008/05/21 22:11:57 $ */ #include "msp430usci.h" generic configuration Msp430Uart1C() { provides interface Resource; provides interface ResourceRequested; provides interface UartStream; provides interface UartByte; uses interface Msp430UartConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_UART1_BUS ), }; components Msp430Uart1P as UartP; Resource = UartP.Resource[ CLIENT_ID ]; UartStream = UartP.UartStream[ CLIENT_ID ]; UartByte = UartP.UartByte[ CLIENT_ID ]; Msp430UartConfigure = UartP.Msp430UartConfigure[ CLIENT_ID ]; components new Msp430UsciA1C() as UsciC; ResourceRequested = UsciC; UartP.ResourceConfigure[ CLIENT_ID ] <- UsciC.ResourceConfigure; UartP.UsciResource[ CLIENT_ID ] -> UsciC.Resource; UartP.UsciInterrupts[ CLIENT_ID ] -> UsciC.HplMsp430UsciInterrupts; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430Uart1P.nc000066400000000000000000000054261207233610700233420ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Vlado Handziski * @author Eric B. Decker * @author Xavier Orduna * @version $Revision: 1.5 $ $Date: 2008/05/21 22:11:57 $ */ configuration Msp430Uart1P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; provides interface UartStream[ uint8_t id ]; provides interface UartByte[ uint8_t id ]; uses interface Resource as UsciResource[ uint8_t id ]; uses interface Msp430UartConfigure[ uint8_t id ]; uses interface HplMsp430UsciInterrupts as UsciInterrupts[ uint8_t id ]; } implementation { components new Msp430UartP() as UartP; Resource = UartP.Resource; ResourceConfigure = UartP.ResourceConfigure; Msp430UartConfigure = UartP.Msp430UartConfigure; UartStream = UartP.UartStream; UartByte = UartP.UartByte; UsciResource = UartP.UsciResource; UsciInterrupts = UartP.UsciInterrupts; components HplMsp430UsciA1C as UsciC; UartP.Usci -> UsciC; components Counter32khz16C as CounterC; UartP.Counter -> CounterC; components LedsC as Leds; UartP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430UartConfigure.nc000066400000000000000000000036411207233610700250000ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Interface used by Msp430Uart clients to reconfigure the UART before use * * @author Vlado Handziski * @author Xavier Orduna */ #include "msp430usci.h" interface Msp430UartConfigure { async command msp430_uart_union_config_t* getConfig(); } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430UartP.nc000066400000000000000000000164451207233610700232640ustar00rootroot00000000000000/* * Copyright (c) 2010-2011 Eric B. Decker * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Jonathan Hui * @author Vlado Handziski * @author Eric B. Decker * @author Xavier Orduna */ #include generic module Msp430UartP() { provides { interface Resource[ uint8_t id ]; interface ResourceConfigure[ uint8_t id ]; interface UartStream[ uint8_t id ]; interface UartByte[ uint8_t id ]; } uses { interface Resource as UsciResource[ uint8_t id ]; interface Msp430UartConfigure[ uint8_t id ]; interface HplMsp430UsciA as Usci; interface HplMsp430UsciInterrupts as UsciInterrupts[ uint8_t id ]; interface Counter; interface Leds; } } implementation { norace uint16_t m_tx_len, m_rx_len; norace uint8_t * COUNT_NOK(m_tx_len) m_tx_buf, * COUNT_NOK(m_rx_len) m_rx_buf; norace uint16_t m_tx_pos, m_rx_pos; norace uint8_t m_byte_time; norace uint8_t current_owner; async command error_t Resource.immediateRequest[ uint8_t id ]() { return call UsciResource.immediateRequest[ id ](); } async command error_t Resource.request[ uint8_t id ]() { return call UsciResource.request[ id ](); } async command uint8_t Resource.isOwner[ uint8_t id ]() { return call UsciResource.isOwner[ id ](); } async command error_t Resource.release[ uint8_t id ]() { if (call UsciResource.isOwner[id]() == FALSE) return FAIL; if ( m_rx_buf || m_tx_buf ) return EBUSY; return call UsciResource.release[ id ](); } async command void ResourceConfigure.configure[ uint8_t id ]() { msp430_uart_union_config_t* config = call Msp430UartConfigure.getConfig[id](); m_byte_time = config->uartConfig.ubr / 2; //pot donar problemes call Usci.setModeUart(config); call Usci.enableIntr(); } async command void ResourceConfigure.unconfigure[ uint8_t id ]() { call Usci.resetUsci(TRUE); call Usci.disableIntr(); call Usci.disableUart(); } event void UsciResource.granted[ uint8_t id ]() { signal Resource.granted[ id ](); } async command error_t UartStream.enableReceiveInterrupt[ uint8_t id ]() { if (call UsciResource.isOwner[id]() == FALSE) return FAIL; call Usci.enableRxIntr(); return SUCCESS; } async command error_t UartStream.disableReceiveInterrupt[ uint8_t id ]() { if (call UsciResource.isOwner[id]() == FALSE) return FAIL; call Usci.disableRxIntr(); return SUCCESS; } async command error_t UartStream.receive[ uint8_t id ]( uint8_t* buf, uint16_t len ) { if (call UsciResource.isOwner[id]() == FALSE) return FAIL; if ( len == 0 ) return FAIL; atomic { if ( m_rx_buf ) return EBUSY; m_rx_buf = buf; m_rx_len = len; m_rx_pos = 0; } return SUCCESS; } async event void UsciInterrupts.rxDone[uint8_t id]( uint8_t data ) { //call Usci.clrRxIntr(); if ( m_rx_buf ) { m_rx_buf[ m_rx_pos++ ] = data; if ( m_rx_pos >= m_rx_len ) { uint8_t* buf = m_rx_buf; m_rx_buf = NULL; signal UartStream.receiveDone[id]( buf, m_rx_len, SUCCESS ); } } else { signal UartStream.receivedByte[id]( data ); } } async command error_t UartStream.send[ uint8_t id ]( uint8_t* buf, uint16_t len ) { if (call UsciResource.isOwner[id]() == FALSE) return FAIL; if ( len == 0 ) return FAIL; else if ( m_tx_buf ) return EBUSY; m_tx_buf = buf; m_tx_len = len; m_tx_pos = 0; current_owner = id; call Usci.tx( buf[ m_tx_pos++ ] ); return SUCCESS; } async event void UsciInterrupts.txDone[uint8_t id]() { call Usci.clrTxIntr(); if(current_owner != id) { uint8_t* buf = m_tx_buf; m_tx_buf = NULL; signal UartStream.sendDone[id]( buf, m_tx_len, FAIL ); } else if ( m_tx_pos < m_tx_len ) { call Usci.tx( m_tx_buf[ m_tx_pos++ ] ); } else { uint8_t* buf = m_tx_buf; m_tx_buf = NULL; signal UartStream.sendDone[id]( buf, m_tx_len, SUCCESS ); } } async command error_t UartByte.send[ uint8_t id ]( uint8_t data ) { if (call UsciResource.isOwner[id]() == FALSE) return FAIL; call Usci.clrTxIntr(); call Usci.disableTxIntr (); call Usci.tx( data ); while( !call Usci.isTxIntrPending() ); call Usci.clrTxIntr(); call Usci.enableTxIntr(); return SUCCESS; } async command error_t UartByte.receive[ uint8_t id ]( uint8_t* byte, uint8_t timeout ) { uint16_t timeout_micro = m_byte_time * timeout + 1; uint16_t start; if (call UsciResource.isOwner[id]() == FALSE) return FAIL; start = call Counter.get(); while( !call Usci.isRxIntrPending() ) { if ( ( call Counter.get() - start ) >= timeout_micro ) return FAIL; } *byte = call Usci.rx(); return SUCCESS; } async event void Counter.overflow() {} default async command error_t UsciResource.isOwner[ uint8_t id ]() { return FAIL; } default async command error_t UsciResource.request[ uint8_t id ]() { return FAIL; } default async command error_t UsciResource.immediateRequest[ uint8_t id ]() { return FAIL; } default async command error_t UsciResource.release[ uint8_t id ]() { return FAIL; } default async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig[uint8_t id]() { return (msp430_uart_union_config_t *) &msp430_uart_default_config; } default event void Resource.granted[ uint8_t id ]() {} default async event void UartStream.sendDone[ uint8_t id ](uint8_t* buf, uint16_t len, error_t error) {} default async event void UartStream.receivedByte[ uint8_t id ](uint8_t byte) {} default async event void UartStream.receiveDone[ uint8_t id ]( uint8_t* buf, uint16_t len, error_t error ) {} } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430UsciA0C.nc000066400000000000000000000051031207233610700234050ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Provides an interface for USART0 on the MSP430. * * @author Jonathan Hui * @author Xavier Orduna * @version $Revision: 1.5 $ $Date: 2008/05/21 22:11:57 $ */ generic configuration Msp430UsciA0C() { provides interface Resource; provides interface ResourceRequested; provides interface ArbiterInfo; provides interface HplMsp430UsciA; provides interface HplMsp430UsciInterrupts; uses interface ResourceConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_HPLUSCIA0_RESOURCE ), }; components Msp430UsciShareA0P as UsciShareP; Resource = UsciShareP.Resource[ CLIENT_ID ]; ResourceRequested = UsciShareP.ResourceRequested[ CLIENT_ID ]; ResourceConfigure = UsciShareP.ResourceConfigure[ CLIENT_ID ]; ArbiterInfo = UsciShareP.ArbiterInfo; HplMsp430UsciInterrupts = UsciShareP.Interrupts[ CLIENT_ID ]; components HplMsp430UsciA0C as HplUsciC; HplMsp430UsciA = HplUsciC; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430UsciA1C.nc000066400000000000000000000051031207233610700234060ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Provides an interface for USART0 on the MSP430. * * @author Jonathan Hui * @author Xavier Orduna * @version $Revision: 1.5 $ $Date: 2008/05/21 22:11:57 $ */ generic configuration Msp430UsciA1C() { provides interface Resource; provides interface ResourceRequested; provides interface ArbiterInfo; provides interface HplMsp430UsciA; provides interface HplMsp430UsciInterrupts; uses interface ResourceConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_HPLUSCIA1_RESOURCE ), }; components Msp430UsciShareA1P as UsciShareP; Resource = UsciShareP.Resource[ CLIENT_ID ]; ResourceRequested = UsciShareP.ResourceRequested[ CLIENT_ID ]; ResourceConfigure = UsciShareP.ResourceConfigure[ CLIENT_ID ]; ArbiterInfo = UsciShareP.ArbiterInfo; HplMsp430UsciInterrupts = UsciShareP.Interrupts[ CLIENT_ID ]; components HplMsp430UsciA1C as HplUsciC; HplMsp430UsciA = HplUsciC; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430UsciB0C.nc000066400000000000000000000051031207233610700234060ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Provides an interface for USART0 on the MSP430. * * @author Jonathan Hui * @author Xavier Orduna * @version $Revision: 1.5 $ $Date: 2008/05/21 22:11:57 $ */ generic configuration Msp430UsciB0C() { provides interface Resource; provides interface ResourceRequested; provides interface ArbiterInfo; provides interface HplMsp430UsciB; provides interface HplMsp430UsciInterrupts; uses interface ResourceConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_HPLUSCIB0_RESOURCE ), }; components Msp430UsciShareB0P as UsciShareP; Resource = UsciShareP.Resource[ CLIENT_ID ]; ResourceRequested = UsciShareP.ResourceRequested[ CLIENT_ID ]; ResourceConfigure = UsciShareP.ResourceConfigure[ CLIENT_ID ]; ArbiterInfo = UsciShareP.ArbiterInfo; HplMsp430UsciInterrupts = UsciShareP.Interrupts[ CLIENT_ID ]; components HplMsp430UsciB0C as HplUsciC; HplMsp430UsciB = HplUsciC; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430UsciB1C.nc000066400000000000000000000047511207233610700234170ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Provides an interface for USART0 on the MSP430. * * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2008/05/21 22:11:57 $ */ generic configuration Msp430UsciB1C() { provides interface Resource; provides interface ResourceRequested; provides interface ArbiterInfo; provides interface HplMsp430UsciB; provides interface HplMsp430UsciInterrupts; uses interface ResourceConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_HPLUSCIB1_RESOURCE ), }; components Msp430UsciShareB1P as UsciShareP; Resource = UsciShareP.Resource[ CLIENT_ID ]; ResourceRequested = UsciShareP.ResourceRequested[ CLIENT_ID ]; ResourceConfigure = UsciShareP.ResourceConfigure[ CLIENT_ID ]; ArbiterInfo = UsciShareP.ArbiterInfo; HplMsp430UsciInterrupts = UsciShareP.Interrupts[ CLIENT_ID ]; components HplMsp430UsciB1C as HplUsciC; HplMsp430UsciB = HplUsciC; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430UsciShareA0P.nc000066400000000000000000000047201207233610700244110ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Xavier Orduna * @version $Revision: 1.5 $ $Date: 2008/05/21 22:11:57 $ */ configuration Msp430UsciShareA0P { provides interface HplMsp430UsciInterrupts as Interrupts[ uint8_t id ]; provides interface Resource[ uint8_t id ]; provides interface ResourceRequested[ uint8_t id ]; provides interface ArbiterInfo; uses interface ResourceConfigure[ uint8_t id ]; } implementation { components new Msp430UsciShareP() as UsciShareP; Interrupts = UsciShareP; components new FcfsArbiterC( MSP430_HPLUSCIA0_RESOURCE ) as ArbiterC; Resource = ArbiterC; ResourceRequested = ArbiterC; ResourceConfigure = ArbiterC; ArbiterInfo = ArbiterC; UsciShareP.ArbiterInfo -> ArbiterC; components HplMsp430UsciA0C as HplUsciC; UsciShareP.RawInterrupts -> HplUsciC; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430UsciShareA1P.nc000066400000000000000000000046471207233610700244220ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Xavier Orduna * @version $Revision: 1.5 $ $Date: 2008/05/21 22:11:57 $ */ configuration Msp430UsciShareA1P { provides interface HplMsp430UsciInterrupts as Interrupts[ uint8_t id ]; provides interface Resource[ uint8_t id ]; provides interface ResourceRequested[ uint8_t id ]; provides interface ArbiterInfo; uses interface ResourceConfigure[ uint8_t id ]; } implementation { components new Msp430UsciShareP() as UsciShareP; Interrupts = UsciShareP; components new FcfsArbiterC( MSP430_HPLUSCIA1_RESOURCE ) as ArbiterC; Resource = ArbiterC; ResourceRequested = ArbiterC; ResourceConfigure = ArbiterC; ArbiterInfo = ArbiterC; UsciShareP.ArbiterInfo -> ArbiterC; components HplMsp430UsciA1C as HplUsciC; UsciShareP.RawInterrupts -> HplUsciC; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430UsciShareB0P.nc000066400000000000000000000047201207233610700244120ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Xavier Orduna * @version $Revision: 1.5 $ $Date: 2008/05/21 22:11:57 $ */ configuration Msp430UsciShareB0P { provides interface HplMsp430UsciInterrupts as Interrupts[ uint8_t id ]; provides interface Resource[ uint8_t id ]; provides interface ResourceRequested[ uint8_t id ]; provides interface ArbiterInfo; uses interface ResourceConfigure[ uint8_t id ]; } implementation { components new Msp430UsciShareP() as UsciShareP; Interrupts = UsciShareP; components new FcfsArbiterC( MSP430_HPLUSCIB0_RESOURCE ) as ArbiterC; Resource = ArbiterC; ResourceRequested = ArbiterC; ResourceConfigure = ArbiterC; ArbiterInfo = ArbiterC; UsciShareP.ArbiterInfo -> ArbiterC; components HplMsp430UsciB0C as HplUsciC; UsciShareP.RawInterrupts -> HplUsciC; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430UsciShareB1P.nc000066400000000000000000000047201207233610700244130ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Xavier Orduna * @version $Revision: 1.5 $ $Date: 2008/05/21 22:11:57 $ */ configuration Msp430UsciShareB1P { provides interface HplMsp430UsciInterrupts as Interrupts[ uint8_t id ]; provides interface Resource[ uint8_t id ]; provides interface ResourceRequested[ uint8_t id ]; provides interface ArbiterInfo; uses interface ResourceConfigure[ uint8_t id ]; } implementation { components new Msp430UsciShareP() as UsciShareP; Interrupts = UsciShareP; components new FcfsArbiterC( MSP430_HPLUSCIB1_RESOURCE ) as ArbiterC; Resource = ArbiterC; ResourceRequested = ArbiterC; ResourceConfigure = ArbiterC; ArbiterInfo = ArbiterC; UsciShareP.ArbiterInfo -> ArbiterC; components HplMsp430UsciB1C as HplUsciC; UsciShareP.RawInterrupts -> HplUsciC; } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/Msp430UsciShareP.nc000066400000000000000000000047111207233610700242300ustar00rootroot00000000000000/** * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Xavier Orduna * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:11 $ */ generic module Msp430UsciShareP() @safe() { provides interface HplMsp430UsciInterrupts as Interrupts[ uint8_t id ]; uses interface HplMsp430UsciInterrupts as RawInterrupts; uses interface ArbiterInfo; } implementation { async event void RawInterrupts.txDone() { if ( call ArbiterInfo.inUse() ) signal Interrupts.txDone[ call ArbiterInfo.userId() ](); } async event void RawInterrupts.rxDone( uint8_t data ) { if ( call ArbiterInfo.inUse() ) signal Interrupts.rxDone[ call ArbiterInfo.userId() ]( data ); } default async event void Interrupts.txDone[ uint8_t id ]() {} default async event void Interrupts.rxDone[ uint8_t id ]( uint8_t data ) {} } tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/PrintfUART.h000066400000000000000000000312061207233610700230770ustar00rootroot00000000000000/** * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2008 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /* * Writes printf like output to the UART. * This works only on the AVR and MSP430 Microcontrollers! *

      * Note: For AVR we explicitly place the print statements in ROM; for * MSP430 this is done by default! For AVR, if we don't place it * explicitely in ROM, the statements will go in RAM, which will * quickly cause a descent size program to run out of RAM. By default * it doesn't disable the interupts; disabling the interupts when * writing to the UART, slows down/makes the mote quite unresponsive, * and can lead to problems! If you wish to disable all printfs to * the UART, then comment the flag: PRINTFUART_ENABLED. *

       * How to use:
       *   // (0) In your Makefile, define PRINTFUART_ENABLED
       *   CFLAGS += -DPRINTFUART_ENABLED
       *   // (1) Call printfUART_init() from your initialization function 
       *   //     to initialize the UART
       *   printfUART_init();
       *   // (2) Set your UART client to the correct baud rate.  Look at 
       *   //     the comments in printfUART_init(), to figure out what 
       *   //     baud to use for your particular mote
       *
       *   // (3) Send printf statements like this:
       *   printfUART("Hello World, we are in year= %u\n", 2004);
       *   printfUART("Printing uint32_t variable, value= %lu\n", 4294967295);
       *
       * Examples and caveats:
       *   // (1) - Must use curly braces in single section statements.  
       *            (Look in the app.c to see why -- hint: it's a macro)
       *   if (x < 3)
       *       {printfUART("The value of x is %i\n", x);}
       *   // (2) - Otherwise it more or less works like regular printf
       *   printfUART("\nThe value of x=%u, and y=%u\n", x, y); 
       * 
      *
      URL: http://www.eecs.harvard.edu/~konrad/projects/motetrack
      * @author Konrad Lorincz * @author Xavier Orduña * @author Jordi Soucheiron */ #ifndef PRINTFZ1_H #define PRINTFZ1_H #ifndef PRINTFUART_H #define PRINTFUART_H #include #include #warning including printfZ1 // ------------------------------------------------------------------- #ifdef PRINTFUART_ENABLED #define DEBUGBUF_SIZE 256 char debugbuf[DEBUGBUF_SIZE]; char debugbufROMtoRAM[DEBUGBUF_SIZE]; #if defined(PLATFORM_MICAZ) || defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) #define printfUART(__format...) { \ static const char strROM[] PROGMEM = __format; \ strcpy_P((char*) &debugbufROMtoRAM, (PGM_P) &strROM); \ sprintf(debugbuf, debugbufROMtoRAM); \ writedebug(); \ } #else // assume MSP430 architecture (e.g. TelosA, TelosB, etc.) #define printfUART(__format...) { \ sprintf(debugbuf, __format); \ writedebug(); \ } #define printfz1(__format...) { \ snprintf(debugbuf,DEBUGBUF_SIZE, __format); \ writedebug(); \ } #endif #else #define printfz1(X, args...) dbg("printf", X, ## args) #define printfUART(X, args...) dbg("printf", X, ## args) // #define printfUART(__format...) {} void printfz1_init() {} void printfUART_init() {} #endif #define NOprintfUART(__format...) // ------------------------------------------------------------------- #ifdef PRINTFUART_ENABLED /** * Initialize the UART port. Call this from your startup routine. */ #define printfz1_init() {atomic printfUART_init_private();} #define printfUART_init() {atomic printfUART_init_private();} void printfUART_init_private() { #if defined(PLATFORM_MICAZ) || defined(PLATFORM_MICA2) // 56K baud outp(0,UBRR0H); outp(15, UBRR0L); //set baud rate outp((1< = STDRXD = ALT2(in) GPIO<47> = STDTXD = ALT1(out) *********/ //atomic{ //configure the GPIO Alt functions and directions _GPIO_setaltfn(46,2); // STD_RXD _GPIO_setaltfn(47,1); // STD_TXD _GPDR(46) &= ~_GPIO_bit(46); // input _GPDR(47) |= _GPIO_bit(47); // output STLCR |=LCR_DLAB; //turn on DLAB so we can change the divisor STDLL = 8; //configure to 115200; STDLH = 0; STLCR &= ~(LCR_DLAB); //turn off DLAB STLCR |= 0x3; //configure to 8 bits STMCR &= ~MCR_LOOP; STMCR |= MCR_OUT2; STIER |= IER_RAVIE; STIER |= IER_TIE; STIER |= IER_UUE; //enable the UART //STMCR |= MCR_AFE; //Auto flow control enabled; //STMCR |= MCR_RTS; STFCR |= FCR_TRFIFOE; //enable the fifos // call Interrupt.allocate(); // call Interrupt.enable(); //configure all the interrupt stuff //make sure that the interrupt causes an IRQ not an FIQ // __REG(0x40D00008) &= ~(1<<21); //configure the priority as IPR1 //__REG(0x40D00020) = (1<<31 | 21); //unmask the interrupt //__REG(0x40D00004) |= (1<<21); CKEN |= CKEN5_STUART; //enable the UART's clk #else #if defined(PLATFORM_Z1) P3SEL |= 0x30; // P3.4,5 = USCI_A1 TXD/RXD UCA0CTL1 |= UCSSEL_2; // CLK = ACLK UCA0BR0 = 0x45; // 32kHz/9600 = 3.41 UCA0BR1 = 0x00; // UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3 UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** #else // assume TelosA, TelosB, etc. // Variabel baud // To change the baud rate, see /tos/platform/msp430/msp430baudrates.h uint8_t source = SSEL_SMCLK; uint16_t baudrate = 0x0012; // UBR_SMCLK_57600=0x0012 uint8_t mctl = 0x84; // UMCTL_SMCLK_57600=0x84 //uint16_t baudrate = 0x0009; // UBR_SMCLK_115200=0x0009 //uint8_t mctl = 0x10; // UMCTL_SMCLK_115200=0x10 uint16_t l_br = 0; uint8_t l_mctl = 0; uint8_t l_ssel = 0; TOSH_SEL_UTXD1_MODFUNC(); TOSH_SEL_URXD1_MODFUNC(); UCTL1 = SWRST; UCTL1 |= CHAR; // 8-bit char, UART-mode U1RCTL &= ~URXEIE; // even erroneous characters trigger interrupts UCTL1 = SWRST; UCTL1 |= CHAR; // 8-bit char, UART-mode if (l_ssel & 0x80) { U1TCTL &= ~(SSEL_0 | SSEL_1 | SSEL_2 | SSEL_3); U1TCTL |= (l_ssel & 0x7F); } else { U1TCTL &= ~(SSEL_0 | SSEL_1 | SSEL_2 | SSEL_3); U1TCTL |= SSEL_ACLK; // use ACLK, assuming 32khz } if ((l_mctl != 0) || (l_br != 0)) { U1BR0 = l_br & 0x0FF; U1BR1 = (l_br >> 8) & 0x0FF; U1MCTL = l_mctl; } else { U1BR0 = 0x03; // 9600 baud U1BR1 = 0x00; U1MCTL = 0x4A; } ME2 &= ~USPIE1; // USART1 SPI module disable ME2 |= (UTXE1 | URXE1); // USART1 UART module enable U1CTL &= ~SWRST; IFG2 &= ~(UTXIFG1 | URXIFG1); IE2 &= ~(UTXIE1 | URXIE1); // interrupt disabled //async command void USARTControl.setClockSource(uint8_t source) { // atomic { l_ssel = source | 0x80; U1TCTL &= ~(SSEL_0 | SSEL_1 | SSEL_2 | SSEL_3); U1TCTL |= (l_ssel & 0x7F); // } //} //async command void USARTControl.setClockRate(uint16_t baudrate, uint8_t mctl) { //atomic { l_br = baudrate; l_mctl = mctl; U1BR0 = baudrate & 0x0FF; U1BR1 = (baudrate >> 8) & 0x0FF; U1MCTL = mctl; //} //} //async command result_t USARTControl.enableRxIntr(){ //atomic { IFG2 &= ~URXIFG1; IE2 |= URXIE1; //} //return SUCCESS; //} //async command result_t USARTControl.enableTxIntr(){ //atomic { IFG2 &= ~UTXIFG1; IE2 |= UTXIE1; //} //return SUCCESS; //} #endif #endif #endif #endif } #if defined(PLATFORM_MICAZ) || defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) #else #if defined(PLATFORM_IMOTE2) #else #if defined(PLATFORM_Z1) #else // assume AVR architecture (e.g. TelosA, TelosB) bool isTxIntrPending() { if (U1TCTL & TXEPT) { return TRUE; } return FALSE; } #endif #endif #endif /** * Outputs a char to the UART. */ void UARTPutChar(char c) { if (c == '\n') UARTPutChar('\r'); #if defined(PLATFORM_MICAZ) || defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) loop_until_bit_is_set(UCSR0A, UDRE); outb(UDR0,c); #else #if defined(PLATFORM_IMOTE2) STTHR = c; #else #if defined(PLATFORM_Z1) while (!(IFG2&UCA0TXIFG)); atomic UCA0TXBUF = c; #else // assume AVR architecture (e.g. TelosA, TelosB) U1TXBUF = c; while( !isTxIntrPending() ) continue; #endif #endif #endif } /** * Outputs the entire debugbuf to the UART, or until it encounters '\0'. */ void writedebug() { uint16_t i = 0; while (debugbuf[i] != '\0' && i < DEBUGBUF_SIZE) UARTPutChar(debugbuf[i++]); } #endif // PRINTFUART_ENABLED // ------------------------------------------------------------------- #if 0 // -------------------------------------------------------------- #define assertUART(x) if (!(x)) { __assertUART(__FILE__, __LINE__); } void __assertUART(const char* file, int line) { printfUART("ASSERT FAILED: file= %s, lineNbr= %i\n", file, line); // for some reason, CLR means on TOSH_MAKE_RED_LED_OUTPUT(); TOSH_MAKE_YELLOW_LED_OUTPUT(); TOSH_MAKE_GREEN_LED_OUTPUT(); TOSH_CLR_RED_LED_PIN(); TOSH_CLR_YELLOW_LED_PIN(); TOSH_CLR_GREEN_LED_PIN(); exit(1); } // -------------------------------------------------------------- #endif #endif // PRINTFUART_H #endif // PRINTFZ1_H tinyos-2.1.2+dfsg/tos/chips/msp430/x2xxx/usci/msp430usci.h000066400000000000000000000325401207233610700230550ustar00rootroot00000000000000/* * Copyright (c) 2010-2011 Eric B. Decker * Copyright (c) 2009-2010 DEXMA SENSORS SL * All rights reserved. * * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Vlado Handziski * @author Philipp Huppertz * @author Xavier Orduna * @author Eric B. Decker * @author Jordi Soucheiron * * Support the x2 version of the USCI for the TI MSPx2xx (see TI MSP430x2xx * Users guide slau144e). */ #ifndef _H_MSP430USCI_H #define _H_MSP430USCI_H /* * The MSP430X architecture at least the msp430f2618 family * has a total of four ports that can be used independently * usciA0, A1 (uart, spi) and usciB0, B1 (i2c, spi only). * * We set the resources up so multiple use of a given port * can be arbritrated. * * UART0 -> usciA0 SPI2 -> usciA0 * UART1 -> usciA1 SPI3 -> usciA1 * SPI0 -> usciB0 I2C0 * SPI1 -> usciB1 I2C1 * * spi2,3 are mapped to usciA0,A1 because the typical * configuration is to use dual uarts and dual spis * so the less used configuration maps as 2 and 3. */ //USCI A0, A1: UART, SPI #define MSP430_HPLUSCIA0_RESOURCE "Msp430UsciA0.Resource" #define MSP430_HPLUSCIA1_RESOURCE "Msp430UsciA1.Resource" #define MSP430_UART0_BUS MSP430_HPLUSCIA0_RESOURCE #define MSP430_UART1_BUS MSP430_HPLUSCIA1_RESOURCE #define MSP430_SPI2_BUS MSP430_HPLUSCIA0_RESOURCE #define MSP430_SPI3_BUS MSP430_HPLUSCIA1_RESOURCE //USCI B0, B1: SPI, I2C #define MSP430_HPLUSCIB0_RESOURCE "Msp430UsciB0.Resource" #define MSP430_HPLUSCIB1_RESOURCE "Msp430UsciB1.Resource" #define MSP430_SPI0_BUS MSP430_HPLUSCIB0_RESOURCE #define MSP430_SPI1_BUS MSP430_HPLUSCIB1_RESOURCE #define MSP430_I2C0_BUS MSP430_HPLUSCIB0_RESOURCE #define MSP430_I2C1_BUS MSP430_HPLUSCIB1_RESOURCE typedef enum { USCI_NONE = 0, USCI_UART = 1, USCI_SPI = 2, USCI_I2C = 3 } msp430_uscimode_t; /************************************************************************************************************ * * UART mode definitions * */ /* * UCAxCTL0, UART control 0, uart mode */ typedef struct { unsigned int ucsync : 1; // Synchronous mode enable (0=Asynchronous; 1:Synchronous) unsigned int ucmode : 2; // USCI Mode (00=UART Mode; 01=Idle-Line; 10=Addres-Bit; 11=UART Mode, auto baud rate detection) unsigned int ucspb : 1; // Stop bit select. Number of stop bits (0=One stop bit; 1=Two stop bits) unsigned int uc7bit : 1; // Charactaer lenght, (0=8-bit data; 1=7-bit data) unsigned int ucmsb : 1; // endian. Direction of the rx and tx shift (0=LSB first, 1=MSB first) unsigned int ucpar : 1; // Parity Select (0=odd parity; 1=Even parity) unsigned int ucpen : 1; // Parity enable (0=Parity disable; 1=Parity enabled) } __attribute__ ((packed)) msp430_uctl0_t ; /* * UCAxCTL1, UART control 1, uart mode */ typedef struct { unsigned int ucswrst : 1; //Software reset enable (0=disabled; 1=enabled) unsigned int uctxbrk : 1; //Transmit break. (0 = no brk; 1 = tx break next frame unsigned int uctxaddr : 1; //Transmit address. (0=next frame transmitted is data; 1=next frame transmitted is an address) unsigned int ucdorm : 1; //Dormant. (0 = not dormant; 1 = Dormant, only some chars will set UCAxRXIFG) unsigned int ucbrkie : 1; //rx break interrupt -enable, 1 = enabled unsigned int ucrxeie : 1; //rx error interrupt-enable unsigned int ucssel : 2; //USCI clock source select: (00=UCKL; 01=ACLK; 10=SMCLK; 11=SMCLK } __attribute__ ((packed)) msp430_uctl1_t ; //converts from typedefstructs to uint8_t DEFINE_UNION_CAST(uctl02int,uint8_t,msp430_uctl0_t) DEFINE_UNION_CAST(int2uctl0,msp430_uctl0_t,uint8_t) DEFINE_UNION_CAST(uctl12int,uint8_t,msp430_uctl1_t) DEFINE_UNION_CAST(int2uctl1,msp430_uctl1_t,uint8_t) /* * The usci/uart baud rate mechanism is significantly different * than the msp430 usart uart. See section 15.3.9 of the TI * MSP430x2xx Family User's Guide, slau144e for details. * * For 32768Hz and 1048576Hz, we use UCOS16=0. * For higher cpu dco speeds we use oversampling, UCOS16=1. */ typedef enum { UBR_32KHZ_1200=0x001B, UMCTL_32KHZ_1200=0x04, UBR_32KHZ_2400=0x000D, UMCTL_32KHZ_2400=0x0c, UBR_32KHZ_4800=0x0006, UMCTL_32KHZ_4800=0x0e, UBR_32KHZ_9600=0x0003, UMCTL_32KHZ_9600=0x06, UBR_1048MHZ_9600=0x006D, UMCTL_1048MHZ_9600=0x04, UBR_1048MHZ_19200=0x0036, UMCTL_1048MHZ_19200=0x0a, UBR_1048MHZ_38400=0x001B, UMCTL_1048MHZ_38400=0x04, UBR_1048MHZ_57600=0x0012, UMCTL_1048MHZ_57600=0x0c, UBR_1048MHZ_115200=0x0009, UMCTL_1048MHZ_115200=0x02, UBR_1048MHZ_128000=0x0008, UMCTL_1048MHZ_128000=0x02, UBR_1048MHZ_256000=0x0004, UMCTL_1048MHZ_230400=0x02, /* 1MHz = 1000000 Hz, 4MHz 4000000, 8MHz 8000000 * 16MHz 16000000. use UCOS16 for oversampling, * use both UCBRF and UCBRS. * * Settings for 1MHz, 8Mhz, and 16MHz are taken from * a table on page 15-22 of slau144e. */ UBR_1MHZ_9600=0x6, UMCTL_1MHZ_9600=0x81, UBR_1MHZ_19200=0x3, UMCTL_1MHZ_19200=0x41, UBR_1MHZ_57600=0x1, UMCTL_1MHZ_57600=0x0F, UBR_8MHZ_4800=0x68, UMCTL_8MHZ_4800=0x31, UBR_8MHZ_9600=0x34, UMCTL_8MHZ_9600=0x11, UBR_8MHZ_19200=0x1A, UMCTL_8MHZ_19200=0x11, UBR_8MHZ_38400=0x0D, UMCTL_8MHZ_38400=0x01, UBR_8MHZ_57600=0x08, UMCTL_8MHZ_57600=0xB1, UBR_8MHZ_115200=0x04, UMCTL_8MHZ_115200=0x3B, UBR_8MHZ_230400=0x02, UMCTL_8MHZ_230400=0x27, UBR_16MHZ_4800=0xD0, UMCTL_16MHZ_4800=0x51, UBR_16MHZ_9600=0x68, UMCTL_16MHZ_9600=0x31, UBR_16MHZ_19200=0x34, UMCTL_16MHZ_19200=0x11, UBR_16MHZ_38400=0x1A, UMCTL_16MHZ_38400=0x11, UBR_16MHZ_57600=0x11, UMCTL_16MHZ_57600=0x61, UBR_16MHZ_115200=0x8, UMCTL_16MHZ_115200=0xB1, UBR_16MHZ_230400=0x4, UMCTL_16MHZ_230400=0x3B, } msp430_uart_rate_t; typedef struct { unsigned int ubr: 16; // Baud rate (use enum msp430_uart_rate_t for predefined rates) unsigned int umctl: 8; // Modulation (use enum msp430_uart_rate_t for predefined rates) /* start of ctl0 */ unsigned int : 1; // ucsync, should be 0 for uart unsigned int ucmode: 2; // mode: 00 - uart, 01 - Idle, 10 - addr bit, 11 - auto baud. unsigned int ucspb: 1; // stop: 0 - one, 1 - two unsigned int uc7bit: 1; // 7 or 8 bit unsigned int : 1; // msb or lsb first, 0 says lsb, uart should be 0 unsigned int ucpar: 1; // par, 0 odd, 1 even unsigned int ucpen: 1; // par enable, 0 disabled /* start of ctl1 */ unsigned int : 5; // not specified, defaults to 0. unsigned int ucrxeie: 1; // rx err int enable unsigned int ucssel: 2; // clock select, 00 uclk, 01 aclk, 10/11 smclk /* ume, not a control register, backward compatible with usart? * should be okay to nuke. Is this actually used? */ unsigned int utxe:1; // 1:enable tx module unsigned int urxe:1; // 1:enable rx module } msp430_uart_config_t; typedef struct { uint16_t ubr; uint8_t umctl; uint8_t uctl0; uint8_t uctl1; uint8_t ume; } msp430_uart_registers_t; typedef union { msp430_uart_config_t uartConfig; msp430_uart_registers_t uartRegisters; } msp430_uart_union_config_t; const msp430_uart_union_config_t msp430_uart_default_config = { { ubr : UBR_8MHZ_115200, umctl : UMCTL_8MHZ_115200, ucmode : 0, // uart ucspb : 0, // one stop uc7bit : 0, // 8 bit ucpar : 0, // odd parity (but no parity) ucpen : 0, // parity disabled ucrxeie : 0, // err int off ucssel : 2, // smclk utxe : 1, // enable tx urxe : 1, // enable rx } }; /************************************************************************************************************ * * SPI mode definitions * */ typedef struct { unsigned int ubr : 16; // Clock division factor (> = 1) /* ctl0 */ unsigned int : 1; // ucsync, forced to 1 by initilization code. unsigned int ucmode : 2; // 00 3pin spi, 01 4pin ste ah, 10 ste al, 11 i2c unsigned int ucmst : 1; // 0 slave, 1 master unsigned int uc7bit : 1; // 0 8 bit, 1 7 bit. unsigned int ucmsb : 1; // 0 lsb first, 1 msb first unsigned int ucckpl : 1; // 0 inactive low, 1 inactive high unsigned int ucckph : 1; // 0 tx rising uclk, captured falling // 1 captured rising, sent falling edge. /* ctl1 */ unsigned int : 1; // ucswrst, forced to 1 on init unsigned int : 5; // unused. unsigned int ucssel : 2; // BRCLK src, 00 NA, 01 ACLK, 10/11 SMCLK } msp430_spi_config_t; typedef struct { uint16_t ubr; uint8_t uctl0; uint8_t uctl1; } msp430_spi_registers_t; typedef union { msp430_spi_config_t spiConfig; msp430_spi_registers_t spiRegisters; } msp430_spi_union_config_t; const msp430_spi_union_config_t msp430_spi_default_config = { { ubr : 2, /* smclk/2 */ ucmode : 0, /* 3 pin, no ste */ ucmst : 1, /* master */ uc7bit : 0, /* 8 bit */ ucmsb : 1, /* msb first, compatible with msp430 usart */ ucckpl : 0, /* inactive state low */ ucckph : 1, /* data captured on rising, changed falling */ ucssel : 2, /* smclk */ } }; /************************************************************************************************************ * * I2C mode definitions * */ typedef struct { unsigned int : 1; // Sync mode enable, 1 = sync, must be 1 for i2c unsigned int ucmode : 2; // 11 for i2c unsigned int ucmst : 1; // 0 slave, 1 master unsigned int : 1; // unused unsigned int ucmm : 1; // multi master mode unsigned int ucsla10 : 1; // slave addr 7 or 10 bit unsigned int uca10 : 1; // own addr 7 or 10 bit } __attribute__ ((packed)) msp430_i2cctl0_t ; DEFINE_UNION_CAST(i2cctl02int,uint8_t,msp430_i2cctl0_t) DEFINE_UNION_CAST(int2i2cctl0,msp430_i2cctl0_t,uint8_t) typedef struct { unsigned int ucswrst : 1; // Software reset (1 = reset) unsigned int uctxstt : 1; // Transmit start in master. unsigned int uctxstp : 1; // Transmit stop in master. unsigned int uctxnack : 1; // transmit nack unsigned int uctr : 1; // 0 rx, 1 tx unsigned int : 1; // unused unsigned int ucssel : 2; // USCI clock source: (00 UCLKI; 01 ACLK; 10/11 SMCLK } __attribute__ ((packed)) msp430_i2cctl1_t ; typedef struct { uint16_t ubr : 16; /* baud rate divisor */ /* ctl0 */ uint8_t : 1; /* ucsync, forced to 1 by init code */ uint8_t ucmode : 2; /* mode, must be 3 for i2c */ uint8_t ucmst : 1; /* master if 1 */ uint8_t : 1; /* unused */ uint8_t ucmm : 1; /* mult-master mode */ uint8_t ucsla10 : 1; /* slave addr 10 bits vs. 7 */ uint8_t uca10 : 1; /* own addressing mode 10 bits vs. 7 */ /* ctl1 */ uint8_t : 1; /* software reset */ uint8_t : 1; /* gen tx start */ uint8_t : 1; /* gen tx stop */ uint8_t : 1; /* gen nack */ uint8_t uctr : 1; /* tx/rx mode, 1 = tx */ uint8_t : 1; /* unused */ uint8_t ucssel : 2; /* clock src, 00 uclk, 01 aclk, 10/11 smclk */ /* own addr */ uint16_t i2coa : 10; /* own address */ uint8_t : 5; /* unused */ uint8_t ucgcen : 1; /* general call response enable */ } msp430_i2c_config_t; typedef struct { uint16_t ubr; /* 16 bit baud rate */ uint8_t uctl0; /* control word 0 */ uint8_t uctl1; /* control word 1 */ uint16_t ui2coa; /* own address, ucgcen */ } msp430_i2c_registers_t; typedef union { msp430_i2c_config_t i2cConfig; msp430_i2c_registers_t i2cRegisters; } msp430_i2c_union_config_t; const msp430_i2c_union_config_t msp430_i2c_default_config = { { ubr : 2, /* smclk/2 */ ucmode : 3, /* i2c mode */ ucmst : 1, /* master */ ucmm : 0, /* single master */ ucsla10 : 1, /* 10 bit slave */ uca10 : 1, /* 10 bit us */ uctr : 1, /* tx mode to start */ ucssel : 2, /* smclk */ i2coa : 1, /* our address is 1 */ ucgcen : 1, /* respond to general call */ } }; #endif /* _H_MSP430USCI_H */ tinyos-2.1.2+dfsg/tos/chips/pxa27x/000077500000000000000000000000001207233610700170255ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/pxa27x/HplPXA27xInterrupt.nc000066400000000000000000000055401207233610700227250ustar00rootroot00000000000000// $Id: HplPXA27xInterrupt.nc,v 1.6 2008-06-11 00:46:23 razvanm Exp $ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /** * This interface supports the core peripheral interrupts of the PXA27X * processor. * It is usually parameterized based on the Peripheral ID (PPID) of the * interrupt signal. * ARM interrupt levels (IRQ/FIQ) are established by wiring. * Priorities are established by a static table (TOSH_IRP_TABLE) * * Components implementing this interface are expected to provide reentrant * (i.e. atomic) semantics. * * @author: Philip Buonadonna */ interface HplPXA27xInterrupt { /** * Allocates a given peripheral interrupt with the PXA27X interrupt manager. * Specifically, it establishes the interrupt level (IRQ or FIQ) and the * priority. */ async command error_t allocate(); /** * Enables a periperhal interrupt. */ async command void enable(); /** * Disables a peripheral interrupt. */ async command void disable(); /** * The peripheral interrupt event. */ async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/HplPXA27xInterruptCntl.nc000066400000000000000000000043051207233610700235440ustar00rootroot00000000000000// $Id: HplPXA27xInterruptCntl.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * This interface provides access to the ICCR functionality of * the PXA27x interrupt controller. * * Refer to the PXA27x Developers Guide for more information. * * @author: Philip Buonadonna */ interface HplPXA27xInterruptCntl { /** * Sets the ICCR DIM bit of the PXA27x interrupt controller * * @param flag TRUE to set the DIM bit, FALSE to clear * */ async command void setICCR_DIM(bool flag); /** * Gets the value of the ICCR DIM bit. * * @return value TRUE if set, FALSE if clear. */ async command bool getICCR_DIM(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/HplPXA27xInterruptM.nc000066400000000000000000000135511207233610700230430ustar00rootroot00000000000000// $Id: HplPXA27xInterruptM.nc,v 1.6 2008-06-11 00:46:23 razvanm Exp $ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * * Authors: Phil Buonadonna * * Edits: Josh Herbach * Revised: 09/02/2005 */ module HplPXA27xInterruptM { provides { interface HplPXA27xInterrupt as PXA27xIrq[uint8_t id]; interface HplPXA27xInterruptCntl; } } implementation { uint32_t getICHP() { uint32_t val; asm volatile ("mrc p6,0,%0,c5,c0,0\n\t":"=r" (val)); return val; } /* Core PXA27X interrupt dispatch vectors */ /* DO NOT change the name of these functions */ void hplarmv_irq() __attribute__ ((interrupt ("IRQ"))) @C() @atomic_hwevent() { uint32_t IRQPending; IRQPending = getICHP(); // Determine which interrupt to service IRQPending >>= 16; // Right justify to the IRQ portion while (IRQPending & (1 << 15)) { uint8_t PeripheralID = (IRQPending & 0x3f); // Get rid of the Valid bit signal PXA27xIrq.fired[PeripheralID](); // Handler is responsible for clearing interrupt IRQPending = getICHP(); // Determine which interrupt to service IRQPending >>= 16; // Right justify to the IRQ portion } return; } void hplarmv_fiq() __attribute__ ((interrupt ("FIQ"))) @C() @atomic_hwevent() { } static uint8_t usedPriorities = 0; /* Helper functions */ /* NOTE: Read-back of all register writes is necessary to ensure the data latches */ error_t allocate(uint8_t id, bool level, uint8_t priority) { uint32_t tmp; error_t error = FAIL; atomic{ uint8_t i; if(usedPriorities == 0){//assumed that the table will have some entries uint8_t PriorityTable[40], DuplicateTable[40]; for(i = 0; i < 40; i++){ DuplicateTable[i] = PriorityTable[i] = 0xFF; } for(i = 0; i < 40; i++) if(TOSH_IRP_TABLE[i] != 0xff){ if(PriorityTable[TOSH_IRP_TABLE[i]] != 0xFF)/*duplicate priorities in the table, mark for later fixing*/ DuplicateTable[i] = PriorityTable[TOSH_IRP_TABLE[i]]; else PriorityTable[TOSH_IRP_TABLE[i]] = i; } //compress table for(i = 0; i < 40; i++){ if(PriorityTable[i] != 0xff){ PriorityTable[usedPriorities] = PriorityTable[i]; if(i != usedPriorities) PriorityTable[i] = 0xFF; usedPriorities++; } } for(i = 0; i < 40; i++) if(DuplicateTable[i] != 0xFF){ uint8_t j, ExtraTable[40]; for(j = 0; DuplicateTable[i] != PriorityTable[j]; j++); memcpy(ExtraTable + j + 1, PriorityTable + j, usedPriorities - j); memcpy(PriorityTable + j + 1, ExtraTable + j + 1, usedPriorities - j); PriorityTable[j] = i; usedPriorities++; } for(i = 0; i < usedPriorities; i++){ IPR(i) = (IPR_VALID | PriorityTable[i]); tmp = IPR(i); } } if (id < 34){ if(priority == 0xff){ priority = usedPriorities; usedPriorities++; IPR(priority) = (IPR_VALID | (id)); tmp = IPR(priority); } if (level) { _ICLR(id) |= _PPID_Bit(id); tmp = _ICLR(id); } error = SUCCESS; } } return error; } void enable(uint8_t id) { uint32_t tmp; atomic { if (id < 34) { _ICMR(id) |= _PPID_Bit(id); tmp = _ICMR(id); } } return; } void disable(uint8_t id) { uint32_t tmp; atomic { if (id < 34) { _ICMR(id) &= ~(_PPID_Bit(id)); tmp = _ICMR(id); } } return; } /* Interface implementation */ async command error_t PXA27xIrq.allocate[uint8_t id]() { return allocate(id, FALSE, TOSH_IRP_TABLE[id]); } async command void PXA27xIrq.enable[uint8_t id]() { enable(id); return; } async command void PXA27xIrq.disable[uint8_t id]() { disable(id); return; } async command void HplPXA27xInterruptCntl.setICCR_DIM(bool flag) { if (flag) { ICCR |= ICCR_DIM; } else { ICCR = 0; } return; } async command bool HplPXA27xInterruptCntl.getICCR_DIM() { bool result = FALSE; if (ICCR & ICCR_DIM) { result = TRUE; } return result; } default async event void PXA27xIrq.fired[uint8_t id]() { return; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/McuSleepC.nc000066400000000000000000000045771207233610700212040ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * Implementation of TEP 112 (Microcontroller Power Management) for * the Intel Xscale PXA27x * *
       *  $Id: McuSleepC.nc,v 1.5 2008-07-23 17:25:42 idgay Exp $
       * 
      * * @author Philip Buonadonna * */ module McuSleepC { provides { interface McuSleep; interface McuPowerState; } uses { interface McuPowerOverride; } } implementation { async command void McuSleep.sleep() { // Put idle into here. asm volatile ( "mcr p14,0,%0,c7,c0,0" : : "r" (PWRMODE_M_IDLE) ); __nesc_enable_interrupt(); // All of memory may change at this point... asm volatile ("" : : : "memory"); __nesc_disable_interrupt(); return; } async command void McuPowerState.update() { return; } default async command mcu_power_t McuPowerOverride.lowestState() { return 0; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/arm_defs.h000066400000000000000000000050721207233610700207620ustar00rootroot00000000000000/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * * Authors: Philip Buonadonna * * */ #ifndef _ARM_DEFS_H #define _ARM_DEFS_H #define ARM_CPSR_MODE_MASK (0x0000001F) #define ARM_CPSR_INT_MASK (0x000000C0) #define ARM_CPSR_COND_MASK (0xF8000000) #define ARM_CPSR_MODE_USR (0x10) #define ARM_CPSR_MODE_FIQ (0x11) #define ARM_CPSR_MODE_IRQ (0x12) #define ARM_CPSR_MODE_SVC (0x13) #define ARM_CPSR_MODE_ABT (0x17) #define ARM_CPSR_MODE_UND (0x1B) #define ARM_CPSR_MODE_SYS (0x1F) #define ARM_CPSR_BIT_N (1 << 31) #define ARM_CPSR_BIT_Z (1 << 30) #define ARM_CPSR_BIT_C (1 << 29) #define ARM_CPSR_BIT_V (1 << 28) #define ARM_CPSR_BIT_Q (1 << 27) #define ARM_CPSR_BIT_I (1 << 7) #define ARM_CPSR_BIT_F (1 << 6) #define ARM_CPRS_BIT_T (1 << 5) #endif /*_ARM_DEFS_H */ tinyos-2.1.2+dfsg/tos/chips/pxa27x/cif/000077500000000000000000000000001207233610700175665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/pxa27x/cif/HplPXA27XQuickCaptInt.nc000066400000000000000000000056131207233610700237720ustar00rootroot00000000000000/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2005 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Description - PXA27X Quick Capture Interface. * * @author Konrad Lorincz * @version 1.0, August 10, 2005 */ /** * Modified and ported to tinyos-2.x. * * @author Brano Kusy * @version October 25, 2007 */ interface HplPXA27XQuickCaptInt { command error_t init(uint8_t color); command void enable(); command error_t setImageSize(uint16_t sizeX, uint16_t sizeY, uint8_t colorType); command void initDMA(uint32_t num_bytes, void *buf); async command void disableQuick(); async command void startDMA(); // Events/Interrupts command void enableStartOfFrame(); command void disableStartOfFrame(); /*new*/ async event void startOfFrame(); command void enableEndOfFrame(); async event void endOfFrame(); command void enableEndOfLine(); async event void endOfLine(); command void enableRecvDataAvailable(); async event void recvDataAvailable(uint8_t channel); command void enableFIFOOverrun(); async event void fifoOverrun(uint8_t channel); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/cif/HplPXA27XQuickCaptIntC.nc000066400000000000000000000054741207233610700241020ustar00rootroot00000000000000/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2005 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Wiring for the PXA27X Quick Capture Interface. * * @author Konrad Lorincz * @version 1.0 - September 10, 2005 */ /** * Modified and ported to tinyos-2.x. * * @author Brano Kusy (branislav.kusy@gmail.com) * @version October 25, 2007 */ #include "PXA27XQuickCaptInt.h" configuration HplPXA27XQuickCaptIntC { provides interface HplPXA27XQuickCaptInt; } implementation { components HplPXA27XQuickCaptIntM; HplPXA27XQuickCaptInt = HplPXA27XQuickCaptIntM; components HplPXA27xInterruptM; HplPXA27XQuickCaptIntM.PPID_CIF_Irq -> HplPXA27xInterruptM.PXA27xIrq[PPID_CIF]; components HplPXA27xDMAC; HplPXA27XQuickCaptIntM.pxa_dma -> HplPXA27xDMAC.HplPXA27xDMAChnl[CIF_CHAN]; components dmaArrayC; HplPXA27XQuickCaptIntM.dmaArray -> dmaArrayC; components GeneralIOC; HplPXA27XQuickCaptIntM.LED_PIN -> GeneralIOC.GeneralIO[106]; //A40-29 components LedsC; HplPXA27XQuickCaptIntM.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/cif/HplPXA27XQuickCaptIntM.nc000066400000000000000000000305251207233610700241070ustar00rootroot00000000000000/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2005 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Wiring for the PXA27X Quick Capture Interface. * * @author Konrad Lorincz * @version 1.0 - September 10, 2005 */ /** * Modified and ported to tinyos-2.x. * * @author Brano Kusy (branislav.kusy@gmail.com) * @version October 25, 2007 */ #include "PXA27XQuickCaptInt.h" #include "DMA.h" #include "dmaArray.h" module HplPXA27XQuickCaptIntM { provides interface HplPXA27XQuickCaptInt; uses interface HplPXA27xInterrupt as PPID_CIF_Irq; uses interface Leds; uses interface GeneralIO as LED_PIN; uses interface dmaArray; uses interface HplPXA27xDMAChnl as pxa_dma; } implementation { DescArray descArray; void CIF_configurePins(); void CIF_init(uint8_t color){ CIF_configurePins(); //atomic enabledInterrupts = 0; CKEN |= CKEN24_CIF; // enable the CIF clock call PPID_CIF_Irq.allocate(); // generate an CIF interrupt call PPID_CIF_Irq.enable(); // enable the CIF interrupt mask // ------------------------------------------------------ // (1) - Disable the CIF interface call HplPXA27XQuickCaptInt.disableQuick(); // (2) - Set the timing/clocks // a. Have the mote supply the MCLK to the camera sensor CICR4 = CICR4_DIV(CICR4, 1); // Set the MCLK clock rate to 15 MHz CICR4 |= CICR4_MCLK_EN; //was: CICR4 = CICR4_DIV(CICR4, 2); // Set the MCLK clock rate to 15 MHz // b. Have the camera suply the PCLK to the mote CICR4 |= CICR4_PCLK_EN; // c. Set the synchronization signals to be active low //was: CICR4 |= CICR4_HSP; // HREF is active-low? //was: CICR4 |= CICR4_VSP; // VSYNC is active-low // it seems we use active VSP and HSP // (3) - Set the data format (nbr pixels, color space, encoding, etc.) //was: CICR1 = CICR1_DW(CICR1, 4); // Data Width: 10 bits wide data from the sensor //was: CICR1 = CICR1_COLOR_SP(CICR1, 0); // Color Space: Raw //was: CICR1 = CICR1_RAW_BPP(CICR1, 2); // Raw bits per pixel: 10 //was: CICR3 = CICR3_LPF(CICR3, (1024-1)); // lines per frame (rows): 1024 //was: CICR1 = CICR1_PPL(CICR1, (1280-1)); // pixels per line (cols): 1280 CICR1 = CICR1_DW(CICR1, 2); // Data Width: 8 bits wide data from the sensor CICR1 = CICR1_RGB_BPP(CICR1, 2); // RGB bits per pixel: 16 CICR1 = CICR1_RAW_BPP(CICR1, 0); // RAW bits per pixel: 8 CICR3 = CICR3_LPF(CICR3, (240-1)); // lines per frame (height): 240 if (color == COLOR_RGB565) { CICR1 = CICR1_PPL(CICR1, (320-1)); // pixels per line (width): 320 CICR1 = CICR1_COLOR_SP(CICR1, 1); // Color Space: RGB } else { CICR1 = CICR1_PPL(CICR1, (2*320-1)); // pixels per line (width): 320 CICR1 = CICR1_COLOR_SP(CICR1, 0); // Color Space: RAW (default) } // (4) - FIFO DMA threshold level CIFR = CIFR_THL_0(CIFR, 0); // 96 bytes of more in FIFO 0 causea a DMA request // (5) - Initialize the DMA //CIF_InitDMA(); // (6) - Enable the CIF with DMA //was: CIF_setAndEnableCICR0(CICR0 | CICR0_DMA_EN); //new: all CICR0 bits should be set with a single command CICR0 = ((CICR0 | CICR0_DMA_EN) & ~(CICR0_SOFM)) & ~(CICR0_EOFM); } void CIF_setAndEnableCICR0(uint32_t data) { call HplPXA27XQuickCaptInt.disableQuick(); CICR0 = (data | CICR0_EN); } command error_t HplPXA27XQuickCaptInt.init(uint8_t color) { CIF_init(color); return SUCCESS; } command void HplPXA27XQuickCaptInt.enable() { uint32_t tempCICR0 = CICR0; tempCICR0 |= CICR0_EN; tempCICR0 &= ~(CICR0_DIS); //new CICR0 = tempCICR0; } async command void HplPXA27XQuickCaptInt.disableQuick() { CICR0 &= ~(CICR0_EN); CISR |= CISR_CQD; } async command void HplPXA27XQuickCaptInt.startDMA() { atomic{ uint32_t dcsr = call pxa_dma.getDCSR(); call pxa_dma.setMap(DMAREQ_CIF_RECV_0); call pxa_dma.setDALGNbit(1); dcsr &= ~(DCSR_RUN); dcsr &= ~(DCSR_NODESCFETCH); call pxa_dma.setDCSR(dcsr); call pxa_dma.setDDADR((uint32_t)call dmaArray.array_get(&descArray, 0) ); call pxa_dma.setDCSR((call pxa_dma.getDCSR()) | DCSR_RUN ); } } command error_t HplPXA27XQuickCaptInt.setImageSize(uint16_t sizeX, uint16_t sizeY, uint8_t colorType) { if (sizeX > 2048 || sizeY > 2048) return FAIL; // (1) - Set the Quick Capture Interface Size //was: call HplPXA27XQuickCaptInt.disableQuick(); CICR3 = CICR3_LPF(CICR3, (sizeY-1)); //was: CICR1 = CICR1_PPL(CICR1, (sizeX-1)); if (colorType == COLOR_RGB565) CICR1 = CICR1_PPL(CICR1, (sizeX-1)); else CICR1 = CICR1_PPL(CICR1, (2*sizeX-1)); //was: call HplPXA27XQuickCaptInt.enable(); // (2) - Set the DMA transfer size //was: nbrBytesToTransfer = sizeX*sizeY*2; // each pixel is 2 bytes return SUCCESS; } command void HplPXA27XQuickCaptInt.initDMA(uint32_t num_bytes, void *buf) //CIF_InitDMA() { call dmaArray.init(&descArray, num_bytes, CIBR0_ADDR, buf); } command void HplPXA27XQuickCaptInt.disableStartOfFrame() {CIF_setAndEnableCICR0(CICR0 | CICR0_SOFM);} command void HplPXA27XQuickCaptInt.enableStartOfFrame() {CIF_setAndEnableCICR0(CICR0 & ~(CICR0_SOFM));} command void HplPXA27XQuickCaptInt.enableEndOfFrame() {CIF_setAndEnableCICR0(CICR0 & ~(CICR0_EOFM));} command void HplPXA27XQuickCaptInt.enableEndOfLine() {CIF_setAndEnableCICR0(CICR0 & ~(CICR0_EOLM));} command void HplPXA27XQuickCaptInt.enableRecvDataAvailable() {CIF_setAndEnableCICR0(CICR0 & ~(CICR0_RDAVM));} command void HplPXA27XQuickCaptInt.enableFIFOOverrun() {CIF_setAndEnableCICR0(CICR0 & ~(CICR0_FOM));} default async event void HplPXA27XQuickCaptInt.startOfFrame() { return;} default async event void HplPXA27XQuickCaptInt.endOfFrame() { return;} default async event void HplPXA27XQuickCaptInt.endOfLine() { return;} default async event void HplPXA27XQuickCaptInt.recvDataAvailable(uint8_t channel) { return;} default async event void HplPXA27XQuickCaptInt.fifoOverrun(uint8_t channel) { return;} async event void PPID_CIF_Irq.fired() { //atomic{printfUART(">>>>>>>>>>>>>>> PPID_CIF_Irq.fired() >>>>>>>>>>>\n", "");} volatile uint32_t tempCISR; atomic { tempCISR = CISR; } // Start-Of-Frame if ((tempCISR & CISR_SOF) && (~(CICR0) & CICR0_SOFM)) { atomic CISR |= CISR_SOF; signal HplPXA27XQuickCaptInt.startOfFrame(); // this disables CIF after the current frame capture is done CICR0 |= CICR0_DIS; } // End-Of-Frame if ((tempCISR & CISR_EOF) && (~(CICR0) & CICR0_EOFM)) { atomic CISR |= CISR_EOF; signal HplPXA27XQuickCaptInt.endOfFrame(); return; } // End-Of-Line if ((tempCISR & CISR_EOL) && (~(CICR0) & CICR0_EOLM)) { atomic CISR |= CISR_EOL; signal HplPXA27XQuickCaptInt.endOfLine(); } // Receive-Data-Available if (~(CICR0) & CICR0_RDAVM) { if (tempCISR & CISR_RDAV_2) { // channel 2 atomic CISR |= CISR_RDAV_2; signal HplPXA27XQuickCaptInt.recvDataAvailable(2); } if (tempCISR & CISR_RDAV_1) { // channel 1 atomic CISR |= CISR_RDAV_1; signal HplPXA27XQuickCaptInt.recvDataAvailable(1); } if (tempCISR & CISR_RDAV_0) { // channel 0 atomic CISR |= CISR_RDAV_0; signal HplPXA27XQuickCaptInt.recvDataAvailable(0); } } // FIFO Overrun if (~(CICR0) & CICR0_FOM) { if (tempCISR & CISR_IFO_2) { // channel 2 atomic CISR |= CISR_IFO_2; signal HplPXA27XQuickCaptInt.fifoOverrun(2); } if (tempCISR & CISR_IFO_1) { // channel 1 atomic CISR |= CISR_IFO_1; signal HplPXA27XQuickCaptInt.fifoOverrun(1); } if (tempCISR & CISR_IFO_0) { // channel 0 atomic CISR |= CISR_IFO_0; signal HplPXA27XQuickCaptInt.fifoOverrun(0); } } } void CIF_configurePins() { // (1) - Configure the GPIO Alt functions and direction // --- Template ---- //_GPIO_setaltfn(PIN, PIN_ALTFN); //_GPDR(PIN) &= ~_GPIO_bit(PIN); // input //_GPDR(PIN) |= _GPIO_bit(PIN); // output // ----------------- _GPIO_setaltfn(PIN_CIF_MCLK, PIN_CIF_MCLK_ALTFN); _GPIO_setaltfn(PIN_CIF_PCLK, PIN_CIF_PCLK_ALTFN); _GPIO_setaltfn(PIN_CIF_FV, PIN_CIF_FV_ALTFN); _GPIO_setaltfn(PIN_CIF_LV, PIN_CIF_LV_ALTFN); _GPIO_setaltfn(PIN_CIF_DD0, PIN_CIF_DD0_ALTFN); _GPIO_setaltfn(PIN_CIF_DD1, PIN_CIF_DD1_ALTFN); _GPIO_setaltfn(PIN_CIF_DD2, PIN_CIF_DD2_ALTFN); _GPIO_setaltfn(PIN_CIF_DD3, PIN_CIF_DD3_ALTFN); _GPIO_setaltfn(PIN_CIF_DD4, PIN_CIF_DD4_ALTFN); _GPIO_setaltfn(PIN_CIF_DD5, PIN_CIF_DD5_ALTFN); _GPIO_setaltfn(PIN_CIF_DD6, PIN_CIF_DD6_ALTFN); _GPIO_setaltfn(PIN_CIF_DD7, PIN_CIF_DD7_ALTFN); GPDR(PIN_CIF_MCLK) |= _GPIO_bit(PIN_CIF_MCLK); // output (if sensor is master) GPDR(PIN_CIF_PCLK) &= ~_GPIO_bit(PIN_CIF_PCLK); // input (if sensor is master) GPDR(PIN_CIF_FV) &= ~_GPIO_bit(PIN_CIF_FV); // input (if sensor is master) GPDR(PIN_CIF_LV) &= ~_GPIO_bit(PIN_CIF_LV); // input (if sensor is master) GPDR(PIN_CIF_DD0) &= ~_GPIO_bit(PIN_CIF_DD0); // input GPDR(PIN_CIF_DD1) &= ~_GPIO_bit(PIN_CIF_DD1); // input GPDR(PIN_CIF_DD2) &= ~_GPIO_bit(PIN_CIF_DD2); // input GPDR(PIN_CIF_DD3) &= ~_GPIO_bit(PIN_CIF_DD3); // input GPDR(PIN_CIF_DD4) &= ~_GPIO_bit(PIN_CIF_DD4); // input GPDR(PIN_CIF_DD5) &= ~_GPIO_bit(PIN_CIF_DD5); // input GPDR(PIN_CIF_DD6) &= ~_GPIO_bit(PIN_CIF_DD6); // input GPDR(PIN_CIF_DD7) &= ~_GPIO_bit(PIN_CIF_DD7); // input } async event void pxa_dma.interruptDMA(){ call pxa_dma.setDCMD(0); call pxa_dma.setDCSR(DCSR_EORINT | DCSR_ENDINTR | DCSR_STARTINTR | DCSR_BUSERRINTR); } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/cif/PXA27XQuickCaptInt.h000066400000000000000000000127401207233610700231540ustar00rootroot00000000000000/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2005 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Konrad Lorincz * @version 1.0, August 15, 2005 */ /** * @brief Ported to TOS2 * @author Brano Kusy (branislav.kusy@gmail.com) */ #ifndef PXA27XQuickCaptInt_H #define PXA27XQuickCaptInt_H /******************************************************************************/ // Configure the GPIO Alt functions and directions // Note: // - In Sensor Master-Parallel mode, CIF_FV and CIF_LV are set to INPUTS // - In Sensor Slave-Parallel mode, CIF_FV and CIF_LV are set to OUTPUTS // Configure the GPIO Alt Functions and Directions // --- Template ---- // _GPIO_setaltfn(PIN, PIN_ALTFN); // _GPDR(PIN) &= ~_GPIO_bit(PIN); // input // _GPDR(PIN) |= _GPIO_bit(PIN); // output // ----------------- /******************************************************************************/ // (1) - Define the Pin mappings (options are listed as #define PIN_CIF_MCLK 53 // <23,O,1> <42,O,3> <53,O,2> #define PIN_CIF_MCLK_ALTFN 2 #define PIN_CIF_PCLK 54 // <26,I,2> <45,I,3> <54,I,3> #define PIN_CIF_PCLK_ALTFN 3 #define PIN_CIF_FV 84 // <24,I,1> <24,O,1> <43,I,3> <43,O,3> <84,I,3> <84,O,3> #define PIN_CIF_FV_ALTFN 3 #define PIN_CIF_LV 85 // <25,I,1> <25,O,1> <44,I,3> <44,O,3> <85,I,3> <85,O,3> #define PIN_CIF_LV_ALTFN 3 #define PIN_CIF_DD0 81 // <27,I,3> <47,I,1> <81,I,2> <98,I,2> #define PIN_CIF_DD0_ALTFN 2 // SSPEXTCLK STD_TXD BB_OB_DAT0 FF_RTS // CIF_DD0 KP_DKIN5 // GPIO27_LED_B #define PIN_CIF_DD1 55 // <55,I,1> <105,I,1> <114*,I,1> #define PIN_CIF_DD1_ALTFN 1 // BB_IB_DAT1 KP_MKOUT2 CC2420_FIFO // NPREG UVS0 #define PIN_CIF_DD2 51 // <51,I,1> <104,I,1> <116*,I,1> #define PIN_CIF_DD2_ALTFN 1 // BB_OB_DAT3 KP_MKOUT1 CC2420_CCA // U_DET #define PIN_CIF_DD3 50 // <50,I,1> <103,I,1> <115*,I,2> #define PIN_CIF_DD3_ALTFN 1 // BB_OB_DAT2 KP_MKOUT0 CC2420_VREG_EN // NPIOR U_EN #define PIN_CIF_DD4 52 // <52,I,1> <83,I,3> <90,I,3> <95,I,2> #define PIN_CIF_DD4_ALTFN 1 // BB_OB_CLK BB_IB_CLK NURST KP_DKIN2 // GPIO95_LED_R #define PIN_CIF_DD5 48 // <48,I,1> <82,I,3> <91,I,3> <94,I,2> #define PIN_CIF_DD5_ALTFN 1 // BB_OB_DAT1 BB_IB_DAT0 UCLK KP_DKIN1 // GPIO94_D_CARD #define PIN_CIF_DD6 17 // <17,I,2> <93,I,2> #define PIN_CIF_DD6_ALTFN 2 // CIF_DD6 KP_DKIN0 // PWM_OUT_1 GPIO93_D_CARD #define PIN_CIF_DD7 12 // <12,I,2> <108,I,1> #define PIN_CIF_DD7_ALTFN 2 // CIF_DD7 KP_MKOUT5 // 48MHz //#define PIN_CIF_DD8 107 // <107,I,1> //#define PIN_CIF_DD8_ALTFN 1 // CIF_DD8 // KP_MKOUT4 //#define PIN_CIF_DD9 106 // <106,I,1> //#define PIN_CIF_DD9_ALTFN 1 // CIF_DD9 // =================================================================== #define CIF_CHAN (11) #define CIBR0_ADDR (0x50000028) #define CICR0_DIS (1 << 27) /* Quick Capture Interface Disable */ #endif tinyos-2.1.2+dfsg/tos/chips/pxa27x/cif/dmaArray.h000066400000000000000000000053001207233610700214750ustar00rootroot00000000000000/* * Copyright (c) 2005 Yale University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgement: * This product includes software developed by the Embedded Networks * and Applications Lab (ENALAB) at Yale University. * 4. Neither the name of the University nor that of the Laboratory * may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY YALE UNIVERSITY AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */ /** * @brief dma array operations * @author Andrew Barton-Sweeney (abs@cs.yale.edu) * @author Thiago Teixeira */ /** * Modified and ported to tinyos-2.x. * * @author Brano Kusy (branislav.kusy@gmail.com) * @version October 25, 2007 */ #ifndef _DMA_ARRAY_H #define _DMA_ARRAY_H typedef struct { uint32_t DDADR; uint32_t DSADR; uint32_t DTADR; uint32_t DCMD; } DMADescriptor_t; #define MAX_DESC_TRANSFER 8184 // max is 8K-1, CIF requires a multiple of 8 //8192 // ---------------------------------------------- #define DescArray_NBR_DESC 100//8 #define DescArray_BYTE_ALLIGNMENT 16 #define DescArray_BUFFER_SIZE (DescArray_NBR_DESC*sizeof(DMADescriptor_t) + DescArray_BYTE_ALLIGNMENT) typedef struct DescArray { uint8_t data[DescArray_BUFFER_SIZE]; // The data is alligned from data[baseIndex] } DescArray; #endif //_DMA_ARRAY_H tinyos-2.1.2+dfsg/tos/chips/pxa27x/cif/dmaArray.nc000066400000000000000000000060131207233610700216500ustar00rootroot00000000000000/* * Copyright (c) 2005 Yale University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgement: * This product includes software developed by the Embedded Networks * and Applications Lab (ENALAB) at Yale University. * 4. Neither the name of the University nor that of the Laboratory * may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY YALE UNIVERSITY AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */ /** * @brief dma array operations * @author Andrew Barton-Sweeney (abs@cs.yale.edu) * @author Thiago Teixeira */ /** * Modified and ported to tinyos-2.x. * * @author Brano Kusy (branislav.kusy@gmail.com) * @version October 25, 2007 */ #include "DMA.h" interface dmaArray{ async command uint32_t array_getBaseIndex(DescArray *DAPtr); async command DMADescriptor_t* array_get(DescArray *DAPtr, uint8_t descIndex); command void init(DescArray *DAPtr, uint32_t num_bytes, uint32_t sourceAddr, void *buf); command void setSourceAddr(DMADescriptor_t* descPtr, uint32_t val); command void setTargetAddr(DMADescriptor_t* descPtr, uint32_t val); command void enableSourceAddrIncrement(DMADescriptor_t* descPtr, bool enable); command void enableTargetAddrIncrement(DMADescriptor_t* descPtr, bool enable); command void enableSourceFlowControl(DMADescriptor_t* descPtr, bool enable); command void enableTargetFlowControl(DMADescriptor_t* descPtr, bool enable); command void setMaxBurstSize(DMADescriptor_t* descPtr, DMAMaxBurstSize_t size); command void setTransferLength(DMADescriptor_t* descPtr, uint16_t length); command void setTransferWidth(DMADescriptor_t* descPtr, DMATransferWidth_t width); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/cif/dmaArrayC.nc000066400000000000000000000043021207233610700217520ustar00rootroot00000000000000/* * Copyright (c) 2005 Yale University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgement: * This product includes software developed by the Embedded Networks * and Applications Lab (ENALAB) at Yale University. * 4. Neither the name of the University nor that of the Laboratory * may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY YALE UNIVERSITY AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */ /** * @brief dma array operations * @author Andrew Barton-Sweeney (abs@cs.yale.edu) * @author Thiago Teixeira */ /** * Modified and ported to tinyos-2.x. * * @author Brano Kusy (branislav.kusy@gmail.com) * @version October 25, 2007 */ configuration dmaArrayC{ provides interface dmaArray; } implementation { components dmaArrayM; dmaArray = dmaArrayM; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/cif/dmaArrayM.nc000066400000000000000000000154371207233610700217770ustar00rootroot00000000000000/* * Copyright (c) 2005 Yale University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgement: * This product includes software developed by the Embedded Networks * and Applications Lab (ENALAB) at Yale University. * 4. Neither the name of the University nor that of the Laboratory * may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY YALE UNIVERSITY AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */ /** * @brief dma array operations * @author Andrew Barton-Sweeney (abs@cs.yale.edu) * @author Thiago Teixeira */ /** * Modified and ported to tinyos-2.x. * * @author Brano Kusy (branislav.kusy@gmail.com) * @version October 25, 2007 */ module dmaArrayM{ provides interface dmaArray; } implementation { async command uint32_t dmaArray.array_getBaseIndex(DescArray *DAPtr) { uint32_t addr = (uint32_t) (&DAPtr->data[0]); return DescArray_BYTE_ALLIGNMENT - (addr % DescArray_BYTE_ALLIGNMENT); } async command DMADescriptor_t* dmaArray.array_get(DescArray *DAPtr, uint8_t descIndex) { uint32_t baseIndex = call dmaArray.array_getBaseIndex(DAPtr); return (DMADescriptor_t*)&DAPtr->data[baseIndex + descIndex*sizeof(DMADescriptor_t)]; } command void dmaArray.init(DescArray *DAPtr, uint32_t num_bytes, uint32_t sourceAddr, void *buf) { uint8_t i = 0; DMADescriptor_t* descPtr = NULL; //was: uint32_t bytesLeftToSchedule = nbrBytesToTransfer; uint32_t bytesLeftToSchedule = num_bytes; uint32_t image_data = (uint32_t) buf; for (i = 0; bytesLeftToSchedule > 0; ++i) { descPtr = call dmaArray.array_get(DAPtr, i); call dmaArray.setSourceAddr(descPtr, sourceAddr); //was: call dmaArray.setTargetAddr(descPtr, &image.data[ i*(MAX_DESC_TRANSFER/4) ]); call dmaArray.setTargetAddr(descPtr, image_data + i*MAX_DESC_TRANSFER ); call dmaArray.enableSourceAddrIncrement(descPtr, FALSE); call dmaArray.enableTargetAddrIncrement(descPtr, TRUE); call dmaArray.enableSourceFlowControl(descPtr, TRUE); call dmaArray.enableTargetFlowControl(descPtr, FALSE); call dmaArray.setMaxBurstSize(descPtr, 3); // burst size: can be 8, 16, or 32 bytes call dmaArray.setTransferWidth(descPtr, 3); // peripheral width for DMA transactions from CIF is always 8-bytes, regardless of DCMD[WIDTH] if (bytesLeftToSchedule >= MAX_DESC_TRANSFER) { call dmaArray.setTransferLength(descPtr, MAX_DESC_TRANSFER); // 16*8 *2 =256 bytes // must be an integer multiple of 8-bytes bytesLeftToSchedule -= MAX_DESC_TRANSFER; } else { call dmaArray.setTransferLength(descPtr, bytesLeftToSchedule); bytesLeftToSchedule = 0; } // continue running the next descriptor descPtr->DDADR = (uint32_t)call dmaArray.array_get(DAPtr, i+1); } // Set the stop bit for the last descriptor descPtr->DDADR |= DDADR_STOP; } command void dmaArray.setSourceAddr(DMADescriptor_t* descPtr, uint32_t val) { atomic{ descPtr->DSADR = val; } } command void dmaArray.setTargetAddr(DMADescriptor_t* descPtr, uint32_t val) { atomic{ descPtr->DTADR = val; } } command void dmaArray.enableSourceAddrIncrement(DMADescriptor_t* descPtr, bool enable) { atomic{ descPtr->DCMD = (enable == TRUE) ? descPtr->DCMD | DCMD_INCSRCADDR : descPtr->DCMD & ~DCMD_INCSRCADDR; } } command void dmaArray.enableTargetAddrIncrement(DMADescriptor_t* descPtr, bool enable) { atomic{ descPtr->DCMD = (enable == TRUE) ? descPtr->DCMD | DCMD_INCTRGADDR : descPtr->DCMD & ~DCMD_INCTRGADDR; } } command void dmaArray.enableSourceFlowControl(DMADescriptor_t* descPtr, bool enable) { atomic{descPtr->DCMD = (enable == TRUE) ? descPtr->DCMD | DCMD_FLOWSRC : descPtr->DCMD & ~DCMD_FLOWSRC;} } command void dmaArray.enableTargetFlowControl(DMADescriptor_t* descPtr, bool enable) { atomic{descPtr->DCMD = (enable == TRUE) ? descPtr->DCMD | DCMD_FLOWTRG : descPtr->DCMD & ~DCMD_FLOWTRG;} } command void dmaArray.setMaxBurstSize(DMADescriptor_t* descPtr, DMAMaxBurstSize_t size) { if(size >= DMA_BURST_SIZE_8BYTES && size <= DMA_BURST_SIZE_32BYTES){ //if(size >= DMA_BURST_SIZE_8BYTES && size <= DMA_BURST_SIZE_32BYTES){ atomic{ //clear it out since otherwise |'ing doesn't work so well descPtr->DCMD &= ~DCMD_MAXSIZE; descPtr->DCMD |= DCMD_SIZE(size); } } } command void dmaArray.setTransferLength(DMADescriptor_t* descPtr, uint16_t length) { uint16_t currentLength; currentLength = (length < MAX_DESC_TRANSFER) ? length : MAX_DESC_TRANSFER; //was: currentLength = (length<8192) ? length: 8190; atomic{ descPtr->DCMD &= ~DCMD_MAXLEN; descPtr->DCMD |= DCMD_LEN(currentLength); } } command void dmaArray.setTransferWidth(DMADescriptor_t* descPtr, DMATransferWidth_t width) { atomic{ //clear it out since otherwise |'ing doesn't work so well descPtr->DCMD &= ~DCMD_MAXWIDTH; descPtr->DCMD |= DCMD_WIDTH(width); } } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/dma/000077500000000000000000000000001207233610700175665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/pxa27x/dma/DMA.h000066400000000000000000000036631207233610700203500ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ #ifndef _DMA_H #define _DMA_H typedef uint8_t DMAPeripheralID_t; typedef uint8_t DMAPriority_t; typedef enum { DMA_BURST_SIZE_8BYTES, DMA_BURST_SIZE_16BYTES, DMA_BURST_SIZE_32BYTES, } DMAMaxBurstSize_t; typedef enum { DMA_WIDTH_1BYTE, DMA_WIDTH_2BYTES, DMA_WIDTH_4BYTES, } DMATransferWidth_t; #endif /* _DMA_H */ tinyos-2.1.2+dfsg/tos/chips/pxa27x/dma/HalPXA27xDMAChannel.nc000066400000000000000000000047211207233610700233450ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ #include "DMA.h" interface HalPXA27xDMAChannel { command error_t requestChannel(DMAPeripheralID_t peripheralID, DMAPriority_t priority, bool permanent); event error_t requestChannelDone(); command error_t returnChannel(DMAPeripheralID_t peripheralID); command error_t setSourceAddr(uint32_t val); command error_t setTargetAddr(uint32_t val); command error_t enableSourceAddrIncrement(bool enable); command error_t enableTargetAddrIncrement(bool enable); command error_t enableSourceFlowControl(bool enable); command error_t enableTargetFlowControl(bool enable); command error_t setMaxBurstSize(DMAMaxBurstSize_t size); command error_t setTransferLength(uint16_t length); command error_t setTransferWidth(DMATransferWidth_t width); command error_t run(bool InterruptEn); command error_t stop(); async event void Interrupt(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/dma/HalPXA27xDMAChannelC.nc000066400000000000000000000036621207233610700234530ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ configuration HalPXA27xDMAChannelC { provides interface HalPXA27xDMAChannel[uint8_t chnl]; } implementation { components HplPXA27xDMAC, HalPXA27xDMAChannelM; HalPXA27xDMAChannel = HalPXA27xDMAChannelM; HalPXA27xDMAChannelM.HplPXA27xDMAChnl -> HplPXA27xDMAC; HalPXA27xDMAChannelM.HplPXA27xDMACntl -> HplPXA27xDMAC; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/dma/HalPXA27xDMAChannelM.nc000066400000000000000000000160001207233610700234530ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ #include "DMA.h" module HalPXA27xDMAChannelM { provides interface HalPXA27xDMAChannel[uint8_t chnl]; uses interface HplPXA27xDMACntl; uses interface HplPXA27xDMAChnl[uint8_t chnl]; } implementation { uint8_t requestedChannel; task void reqCompleteTask() { signal HalPXA27xDMAChannel.requestChannelDone[requestedChannel](); } command error_t HalPXA27xDMAChannel.requestChannel[uint8_t chnl](DMAPeripheralID_t peripheralID, DMAPriority_t priority, bool permanent) { // priority is decided based on which channel you pick (PXADEV 5-4) // permanent? nothing lasts forever my friend uint32_t valDRCMR; valDRCMR = call HplPXA27xDMACntl.getDRCMR(peripheralID) | DRCMR_MAPVLD; valDRCMR = valDRCMR & ~DRCMR_CHLNUM(0x1F); valDRCMR |= DRCMR_CHLNUM(chnl); call HplPXA27xDMACntl.setDRCMR(peripheralID, valDRCMR); requestedChannel = chnl; post reqCompleteTask(); return SUCCESS; } command error_t HalPXA27xDMAChannel.returnChannel[uint8_t chnl](DMAPeripheralID_t peripheralID) { // modified interface to require peripheralID, this isn't virtualized uint32_t valDRCMR; valDRCMR = call HplPXA27xDMACntl.getDRCMR(peripheralID) & ~DRCMR_MAPVLD; call HplPXA27xDMACntl.setDRCMR(peripheralID, valDRCMR); return SUCCESS; } command error_t HalPXA27xDMAChannel.setSourceAddr[uint8_t chnl](uint32_t val) { call HplPXA27xDMAChnl.setDSADR[chnl](val); return SUCCESS; } command error_t HalPXA27xDMAChannel.setTargetAddr[uint8_t chnl](uint32_t val) { call HplPXA27xDMAChnl.setDTADR[chnl](val); return SUCCESS; } command error_t HalPXA27xDMAChannel.enableSourceAddrIncrement[uint8_t chnl](bool enable) { uint32_t valDCMD; valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); valDCMD = (enable) ? (valDCMD | DCMD_INCSRCADDR) : (valDCMD & ~DCMD_INCSRCADDR); call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); return SUCCESS; } command error_t HalPXA27xDMAChannel.enableTargetAddrIncrement[uint8_t chnl](bool enable) { uint32_t valDCMD; valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); valDCMD = (enable) ? (valDCMD | DCMD_INCTRGADDR) : (valDCMD & ~DCMD_INCTRGADDR); call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); return SUCCESS; } command error_t HalPXA27xDMAChannel.enableSourceFlowControl[uint8_t chnl](bool enable) { uint32_t valDCMD; valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); valDCMD = (enable) ? (valDCMD | DCMD_FLOWSRC) : (valDCMD & ~DCMD_FLOWSRC); call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); return SUCCESS; } command error_t HalPXA27xDMAChannel.enableTargetFlowControl[uint8_t chnl](bool enable) { uint32_t valDCMD; valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); valDCMD = (enable) ? (valDCMD | DCMD_FLOWTRG) : (valDCMD & ~DCMD_FLOWTRG); call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); return SUCCESS; } command error_t HalPXA27xDMAChannel.setMaxBurstSize[uint8_t chnl](DMAMaxBurstSize_t size) { uint32_t valDCMD; valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); valDCMD &= ~DCMD_BURST32; // zero the bits first switch(size) { case DMA_BURST_SIZE_8BYTES: valDCMD |= DCMD_BURST8; break; case DMA_BURST_SIZE_16BYTES: valDCMD |= DCMD_BURST16; break; case DMA_BURST_SIZE_32BYTES: valDCMD |= DCMD_BURST32; break; default: return FAIL; } call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); return SUCCESS; } command error_t HalPXA27xDMAChannel.setTransferLength[uint8_t chnl](uint16_t length) { uint32_t valDCMD; valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); if(length > DCMD_MAXLEN) return FAIL; valDCMD &= ~DCMD_MAXLEN; // zero the bits first valDCMD |= DCMD_LEN(length); call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); return SUCCESS; } command error_t HalPXA27xDMAChannel.setTransferWidth[uint8_t chnl](DMATransferWidth_t width) { uint32_t valDCMD; valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); valDCMD &= ~DCMD_WIDTH4; // zero the bits first switch(width) { case DMA_WIDTH_1BYTE: valDCMD |= DCMD_WIDTH1; break; case DMA_WIDTH_2BYTES: valDCMD |= DCMD_WIDTH2; break; case DMA_WIDTH_4BYTES: valDCMD |= DCMD_WIDTH4; break; default: return FAIL; } call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); return SUCCESS; } command error_t HalPXA27xDMAChannel.run[uint8_t chnl](bool InterruptEn) { uint32_t valDCSR; uint32_t valDCMD; valDCSR = call HplPXA27xDMAChnl.getDCSR[chnl](); valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); valDCMD = (InterruptEn) ? valDCMD | DCMD_ENDIRQEN : valDCSR & ~DCMD_ENDIRQEN; call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); call HplPXA27xDMAChnl.setDCSR[chnl](valDCSR | DCSR_RUN | DCSR_NODESCFETCH); return SUCCESS; } command error_t HalPXA27xDMAChannel.stop[uint8_t chnl]() { uint32_t valDCSR; valDCSR = call HplPXA27xDMAChnl.getDCSR[chnl](); call HplPXA27xDMAChnl.setDCSR[chnl](valDCSR & ~DCSR_RUN); return SUCCESS; } async event void HplPXA27xDMAChnl.interruptDMA[uint8_t chnl]() { // might want to clear interrupt first // ... signal HalPXA27xDMAChannel.Interrupt[chnl](); } default async event void HalPXA27xDMAChannel.Interrupt[uint8_t chnl]() { } default event error_t HalPXA27xDMAChannel.requestChannelDone[uint8_t chnl]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/dma/HplPXA27xDMAC.nc000066400000000000000000000076471207233610700222100ustar00rootroot00000000000000/* $Id: HplPXA27xDMAC.nc,v 1.5 2008-06-11 00:42:14 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ configuration HplPXA27xDMAC { provides { interface HplPXA27xDMACntl; interface HplPXA27xDMAChnl[uint8_t chnl]; } } implementation { components HplPXA27xDMAM; components HplPXA27xInterruptM; components PlatformP; HplPXA27xDMACntl = HplPXA27xDMAM; HplPXA27xDMAChnl[0] = HplPXA27xDMAM.HplPXA27xDMAChnl[0]; HplPXA27xDMAChnl[1] = HplPXA27xDMAM.HplPXA27xDMAChnl[1]; HplPXA27xDMAChnl[2] = HplPXA27xDMAM.HplPXA27xDMAChnl[2]; HplPXA27xDMAChnl[3] = HplPXA27xDMAM.HplPXA27xDMAChnl[3]; HplPXA27xDMAChnl[4] = HplPXA27xDMAM.HplPXA27xDMAChnl[4]; HplPXA27xDMAChnl[5] = HplPXA27xDMAM.HplPXA27xDMAChnl[5]; HplPXA27xDMAChnl[6] = HplPXA27xDMAM.HplPXA27xDMAChnl[6]; HplPXA27xDMAChnl[7] = HplPXA27xDMAM.HplPXA27xDMAChnl[7]; HplPXA27xDMAChnl[8] = HplPXA27xDMAM.HplPXA27xDMAChnl[8]; HplPXA27xDMAChnl[9] = HplPXA27xDMAM.HplPXA27xDMAChnl[9]; HplPXA27xDMAChnl[10] = HplPXA27xDMAM.HplPXA27xDMAChnl[10]; HplPXA27xDMAChnl[11] = HplPXA27xDMAM.HplPXA27xDMAChnl[11]; HplPXA27xDMAChnl[12] = HplPXA27xDMAM.HplPXA27xDMAChnl[12]; HplPXA27xDMAChnl[13] = HplPXA27xDMAM.HplPXA27xDMAChnl[13]; HplPXA27xDMAChnl[14] = HplPXA27xDMAM.HplPXA27xDMAChnl[14]; HplPXA27xDMAChnl[15] = HplPXA27xDMAM.HplPXA27xDMAChnl[15]; HplPXA27xDMAChnl[16] = HplPXA27xDMAM.HplPXA27xDMAChnl[16]; HplPXA27xDMAChnl[17] = HplPXA27xDMAM.HplPXA27xDMAChnl[17]; HplPXA27xDMAChnl[18] = HplPXA27xDMAM.HplPXA27xDMAChnl[18]; HplPXA27xDMAChnl[19] = HplPXA27xDMAM.HplPXA27xDMAChnl[19]; HplPXA27xDMAChnl[20] = HplPXA27xDMAM.HplPXA27xDMAChnl[20]; HplPXA27xDMAChnl[21] = HplPXA27xDMAM.HplPXA27xDMAChnl[21]; HplPXA27xDMAChnl[22] = HplPXA27xDMAM.HplPXA27xDMAChnl[22]; HplPXA27xDMAChnl[23] = HplPXA27xDMAM.HplPXA27xDMAChnl[23]; HplPXA27xDMAChnl[24] = HplPXA27xDMAM.HplPXA27xDMAChnl[24]; HplPXA27xDMAChnl[25] = HplPXA27xDMAM.HplPXA27xDMAChnl[25]; HplPXA27xDMAChnl[26] = HplPXA27xDMAM.HplPXA27xDMAChnl[26]; HplPXA27xDMAChnl[27] = HplPXA27xDMAM.HplPXA27xDMAChnl[27]; HplPXA27xDMAChnl[28] = HplPXA27xDMAM.HplPXA27xDMAChnl[28]; HplPXA27xDMAChnl[29] = HplPXA27xDMAM.HplPXA27xDMAChnl[29]; HplPXA27xDMAChnl[30] = HplPXA27xDMAM.HplPXA27xDMAChnl[30]; HplPXA27xDMAChnl[31] = HplPXA27xDMAM.HplPXA27xDMAChnl[31]; HplPXA27xDMAM.Init <- PlatformP.InitL1; HplPXA27xDMAM.DMAIrq -> HplPXA27xInterruptM.PXA27xIrq[PPID_DMAC]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/dma/HplPXA27xDMAChnl.nc000066400000000000000000000102351207233610700226750ustar00rootroot00000000000000/* $Id: HplPXA27xDMAChnl.nc,v 1.6 2008-06-11 00:46:24 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * * Authors: Phil Buonadonna * Authors: Robbie Adler */ interface HplPXA27xDMAChnl { async command error_t setMap(uint8_t dev); async command void setDALGNbit(bool flag); async command bool getDALGNbit(); async command bool getDINTbit(); async command void setDCSR(uint32_t val); async command uint32_t getDCSR(); async command void setDCMD(uint32_t val); async command uint32_t getDCMD(); async command void setDDADR(uint32_t val); async command uint32_t getDDADR(); async command void setDSADR(uint32_t val); async command uint32_t getDSADR(); async command void setDTADR(uint32_t val); async command uint32_t getDTADR(); async event void interruptDMA(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/dma/HplPXA27xDMACntl.nc000066400000000000000000000045501207233610700227140ustar00rootroot00000000000000/* $Id: HplPXA27xDMACntl.nc,v 1.5 2008-06-11 00:42:14 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * * Authors: Phil Buonadonna * */ interface HplPXA27xDMACntl { async command void setDRCMR(uint8_t peripheral, uint8_t chnl); async command uint8_t getDRCMR(uint8_t peripheral); async command void setDALGN(uint32_t val); async command uint32_t getDALGN(uint32_t val); async command void setDPCSR(uint32_t val); async command uint32_t getDPSCR(); async command void setDRQSR0(uint32_t val); async command uint32_t getDRQSR0(); async command void setDRQSR1(uint32_t val); async command uint32_t getDRQSR1(); async command void setDRQSR2(uint32_t val); async command uint32_t getDRQSR2(); async command uint32_t getDINT(); async command void setFLYCNFG(uint32_t val); async command uint32_t getFLYCNFG(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/dma/HplPXA27xDMAInfo.nc000066400000000000000000000050051207233610700227030ustar00rootroot00000000000000/* $Id: HplPXA27xDMAInfo.nc,v 1.5 2008-06-11 00:42:14 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * This interface is to be PROVIDED by peripheral HPL components that * are DMA-able. It is used to provide information to higher level * components (e.g. HalX) that may implement higher level peripheral * functions using DMA. * * Instantiate the interface multiple times according to how many * I/O addresses a peripheral has that may be assigned to a DMA * src/tgt address register. * * Authors: Phil Buonadonna * */ interface HplPXA27xDMAInfo { /** * Returns a single DMAable address for a peripheral. * * @return addr The 32 bit address of the peripheral register * of interest. */ async command uint32_t getAddr(); /** * Returns the DMA map index that is associated with the getAddr() * function. * * @return index The DMA map register index that is associated with * the getAddr function. */ async command uint8_t getMapIndex(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/dma/HplPXA27xDMAInfoC.nc000066400000000000000000000041311207233610700230050ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ // Example (STUART RX): // peripheral = 19 (Request to Channel Map register in PXA Dev Manual) // baseAddr = &STRBR (DMA address) // Example (STUART TX): // peripheral = 20 // baseAddr = &STTHR generic module HplPXA27xDMAInfoC(uint8_t peripheral, uint32_t baseAddr) { provides interface HplPXA27xDMAInfo; } implementation { async command uint32_t HplPXA27xDMAInfo.getAddr() { return baseAddr; } async command uint8_t HplPXA27xDMAInfo.getMapIndex() { return peripheral; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/dma/HplPXA27xDMAM.nc000066400000000000000000000123501207233610700222050ustar00rootroot00000000000000/* $Id: HplPXA27xDMAM.nc,v 1.5 2008-06-11 00:42:14 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ module HplPXA27xDMAM { provides { interface Init; interface HplPXA27xDMACntl; interface HplPXA27xDMAChnl[uint8_t chnl]; } uses { interface HplPXA27xInterrupt as DMAIrq; } } implementation { command error_t Init.init() { call DMAIrq.allocate(); call DMAIrq.enable(); return SUCCESS; } async command void HplPXA27xDMACntl.setDRCMR(uint8_t peripheral, uint8_t val) { DRCMR(peripheral) = val; } async command uint8_t HplPXA27xDMACntl.getDRCMR(uint8_t peripheral) { return DRCMR(peripheral);} async command void HplPXA27xDMACntl.setDALGN(uint32_t val) {DALGN = val;} async command uint32_t HplPXA27xDMACntl.getDALGN(uint32_t val) {return DALGN; } async command void HplPXA27xDMACntl.setDPCSR(uint32_t val) {DPCSR = val; } async command uint32_t HplPXA27xDMACntl.getDPSCR() {return DPCSR; } async command void HplPXA27xDMACntl.setDRQSR0(uint32_t val) {DRQSR0 = val; } async command uint32_t HplPXA27xDMACntl.getDRQSR0() {return DRQSR0; } async command void HplPXA27xDMACntl.setDRQSR1(uint32_t val) {DRQSR1 = val; } async command uint32_t HplPXA27xDMACntl.getDRQSR1() {return DRQSR1; } async command void HplPXA27xDMACntl.setDRQSR2(uint32_t val) {DRQSR2 = val; } async command uint32_t HplPXA27xDMACntl.getDRQSR2() {return DRQSR2; } async command uint32_t HplPXA27xDMACntl.getDINT() {return DINT; } async command void HplPXA27xDMACntl.setFLYCNFG(uint32_t val) {FLYCNFG = val; } async command uint32_t HplPXA27xDMACntl.getFLYCNFG() {return FLYCNFG; } async command error_t HplPXA27xDMAChnl.setMap[uint8_t chnl](uint8_t dev) { call HplPXA27xDMACntl.setDRCMR(dev,(DRCMR_MAPVLD | DRCMR_CHLNUM(chnl))); return SUCCESS; } async command void HplPXA27xDMAChnl.setDALGNbit[uint8_t chnl](bool flag) { if (flag) { DALGN |= (1 << chnl); } else { DALGN &= ~(1 << chnl); } return; } async command bool HplPXA27xDMAChnl.getDALGNbit[uint8_t chnl]() { return ((DALGN & (1 << chnl)) != 0); } async command bool HplPXA27xDMAChnl.getDINTbit[uint8_t chnl]() { return ((DINT & (1 << chnl)) != 0); } async command void HplPXA27xDMAChnl.setDCSR[uint8_t chnl](uint32_t val) { // uint32_t cycles; //_pxa27x_perf_clear(); DCSR(chnl) = val; //_pxa27x_perf_get(cycles); } async command uint32_t HplPXA27xDMAChnl.getDCSR[uint8_t chnl]() {return DCSR(chnl); } async command void HplPXA27xDMAChnl.setDCMD[uint8_t chnl](uint32_t val) {DCMD(chnl) = val; } async command uint32_t HplPXA27xDMAChnl.getDCMD[uint8_t chnl]() {return DCMD(chnl); } async command void HplPXA27xDMAChnl.setDDADR[uint8_t chnl](uint32_t val) {DDADR(chnl) = val; } async command uint32_t HplPXA27xDMAChnl.getDDADR[uint8_t chnl]() {return DDADR(chnl); } async command void HplPXA27xDMAChnl.setDSADR[uint8_t chnl](uint32_t val) {DSADR(chnl) = val; } async command uint32_t HplPXA27xDMAChnl.getDSADR[uint8_t chnl]() {return DSADR(chnl); } async command void HplPXA27xDMAChnl.setDTADR[uint8_t chnl](uint32_t val) {DTADR(chnl) = val; } async command uint32_t HplPXA27xDMAChnl.getDTADR[uint8_t chnl]() {return DTADR(chnl); } async event void DMAIrq.fired() { uint32_t IntReg; uint8_t chnl; IntReg = call HplPXA27xDMACntl.getDINT(); while (IntReg) { chnl = 31 - _pxa27x_clzui(IntReg); signal HplPXA27xDMAChnl.interruptDMA[chnl](); IntReg &= ~(1 << chnl); } return; } default async event void HplPXA27xDMAChnl.interruptDMA[uint8_t chnl]() { call HplPXA27xDMAChnl.setDCMD[chnl](0); call HplPXA27xDMAChnl.setDCSR[chnl](DCSR_EORINT | DCSR_ENDINTR | DCSR_STARTINTR | DCSR_BUSERRINTR); } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/gpio/000077500000000000000000000000001207233610700177635ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/pxa27x/gpio/GeneralIOC.nc000066400000000000000000000045711207233610700222240ustar00rootroot00000000000000// $Id: GeneralIOC.nc,v 1.6 2008-06-11 00:46:24 razvanm Exp $ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ //@author Phil Buonadonna configuration GeneralIOC { provides { interface GeneralIO[uint8_t pin]; interface HalPXA27xGpioInterrupt[uint8_t pin]; interface GpioInterrupt[uint8_t pin]; } } implementation { components HalPXA27xGeneralIOM; components HplPXA27xGPIOC; GeneralIO = HalPXA27xGeneralIOM; HalPXA27xGpioInterrupt = HalPXA27xGeneralIOM; GpioInterrupt = HalPXA27xGeneralIOM; HalPXA27xGeneralIOM.HplPXA27xGPIOPin -> HplPXA27xGPIOC; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/gpio/HalPXA27xGeneralIOM.nc000066400000000000000000000121471207233610700235730ustar00rootroot00000000000000// $Id: HalPXA27xGeneralIOM.nc,v 1.6 2008-06-11 00:46:24 razvanm Exp $ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ //@author Phil Buonadonna module HalPXA27xGeneralIOM { provides { interface GeneralIO[uint8_t pin]; interface HalPXA27xGpioInterrupt[uint8_t pin]; interface GpioInterrupt[uint8_t pin]; } uses { interface HplPXA27xGPIOPin[uint8_t pin]; } } implementation { async command void GeneralIO.set[uint8_t pin]() { atomic call HplPXA27xGPIOPin.setGPSRbit[pin](); return; } async command void GeneralIO.clr[uint8_t pin]() { atomic call HplPXA27xGPIOPin.setGPCRbit[pin](); return; } async command void GeneralIO.toggle[uint8_t pin]() { atomic { if (call HplPXA27xGPIOPin.getGPLRbit[pin]()) { call HplPXA27xGPIOPin.setGPCRbit[pin](); } else { call HplPXA27xGPIOPin.setGPSRbit[pin](); } } return; } async command bool GeneralIO.get[uint8_t pin]() { bool result; result = call HplPXA27xGPIOPin.getGPLRbit[pin](); return result; } async command void GeneralIO.makeInput[uint8_t pin]() { atomic call HplPXA27xGPIOPin.setGPDRbit[pin](FALSE); return; } async command bool GeneralIO.isInput[uint8_t pin]() { bool result; result = !call HplPXA27xGPIOPin.getGPLRbit[pin](); return result; } async command void GeneralIO.makeOutput[uint8_t pin]() { atomic call HplPXA27xGPIOPin.setGPDRbit[pin](TRUE); return; } async command bool GeneralIO.isOutput[uint8_t pin]() { bool result; result = call HplPXA27xGPIOPin.getGPDRbit[pin](); return result; } async command error_t HalPXA27xGpioInterrupt.enableRisingEdge[uint8_t pin]() { atomic { call HplPXA27xGPIOPin.setGRERbit[pin](TRUE); call HplPXA27xGPIOPin.setGFERbit[pin](FALSE); } return SUCCESS; } async command error_t HalPXA27xGpioInterrupt.enableFallingEdge[uint8_t pin]() { atomic { call HplPXA27xGPIOPin.setGRERbit[pin](FALSE); call HplPXA27xGPIOPin.setGFERbit[pin](TRUE); } return SUCCESS; } async command error_t HalPXA27xGpioInterrupt.enableBothEdge[uint8_t pin]() { atomic { call HplPXA27xGPIOPin.setGRERbit[pin](TRUE); call HplPXA27xGPIOPin.setGFERbit[pin](TRUE); } return SUCCESS; } async command error_t HalPXA27xGpioInterrupt.disable[uint8_t pin]() { atomic { call HplPXA27xGPIOPin.setGRERbit[pin](FALSE); call HplPXA27xGPIOPin.setGFERbit[pin](FALSE); call HplPXA27xGPIOPin.clearGEDRbit[pin](); } return SUCCESS; } async command error_t GpioInterrupt.enableRisingEdge[uint8_t pin]() { return call HalPXA27xGpioInterrupt.enableRisingEdge[pin](); } async command error_t GpioInterrupt.enableFallingEdge[uint8_t pin]() { return call HalPXA27xGpioInterrupt.enableFallingEdge[pin](); } async command error_t GpioInterrupt.disable[uint8_t pin]() { return call HalPXA27xGpioInterrupt.disable[pin](); } async event void HplPXA27xGPIOPin.interruptGPIOPin[uint8_t pin]() { call HplPXA27xGPIOPin.clearGEDRbit[pin](); signal HalPXA27xGpioInterrupt.fired[pin](); signal GpioInterrupt.fired[pin](); return; } default async event void HalPXA27xGpioInterrupt.fired[uint8_t pin]() { return; } default async event void GpioInterrupt.fired[uint8_t pin]() { return; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/gpio/HalPXA27xGpioCapture.nc000066400000000000000000000042551207233610700240740ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * Variant of the GpioCapture interface that provides a capture * on 'BOTH'. * * @author Phil Buonadonna */ interface HalPXA27xGpioCapture { /** * Enable an edge based timer capture event. * * @return Whether the timer capture has been enabled. */ async command error_t captureRisingEdge(); async command error_t captureFallingEdge(); async command error_t captureBothEdge(); /** * Fired when an edge interrupt occurs. * * @param val The value of the 32kHz timer. */ async event void captured(uint16_t time); /** * Disable further captures. */ async command void disable(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/gpio/HalPXA27xGpioInterrupt.nc000066400000000000000000000046131207233610700244630ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * Variant of the standard GpioInterrupt interface that provides a * 'BOTH' trigger. * * @author Phil Buonadonna * */ interface HalPXA27xGpioInterrupt { /** * Enable an edge based interrupt. Calls to these functions are * not cumulative: only the transition type of the last called * function will be monitored for. * * * @return SUCCESS if the interrupt has been enabled */ async command error_t enableRisingEdge(); async command error_t enableFallingEdge(); async command error_t enableBothEdge(); /** * Diables an edge interrupt or capture interrupt * * @return SUCCESS if the interrupt has been disabled */ async command error_t disable(); /** * Fired when an edge interrupt occurs. * * NOTE: Interrupts keep running until "disable()" is called */ async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/gpio/HalPXA27xSoftCaptureC.nc000066400000000000000000000043251207233610700242120ustar00rootroot00000000000000// $Id: HalPXA27xSoftCaptureC.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * Emulates GPIO capture functionality using HalPXA27xGpioInterrupt and the * standard 32khz counter. Provides a method to capture on BOTH edges of * a GPIO transition * * @author Phil Buonadonna */ generic configuration HalPXA27xSoftCaptureC() { provides interface HalPXA27xGpioCapture; uses interface HalPXA27xGpioInterrupt; } implementation { components new HalPXa27xSoftCaptureP(); components Counter32khzC; HalPXA27xGpioCapture = HalPXA27xSoftCaptureP; HalPXA27xGpioInterrupt = HalPXA27xSoftCaptureP; HalPXA27xSoftCaptureP.Counter32khz32 -> Counter32khzC.Counter32khz32; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/gpio/HalPXA27xSoftCaptureP.nc000066400000000000000000000056001207233610700242240ustar00rootroot00000000000000// $Id: HalPXA27xSoftCaptureP.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * Emulates GPIO capture functionality using GpioInterrupt and the * standard 32khz counter. Provides a method to capture on BOTH edges of * a GPIO transition. * * @author Phil Buonadonna */ generic module HalPXA27xSoftCaptureP () { provides interface HalPXA27xGpioCapture; uses { interface HalPXA27xGpioInterrupt; interface Counter as Counter32khz32; } } implementation { async command error_t HalPXA27xGpioCapture.captureRisingEdge() { return (call HalPXA27xGpioInterrupt.enableRisingEdge()); } async command error_t HalPXA27xGpioCapture.captureFallingEdge() { return (call HalPXA27xGpioInterrupt.enableFallingEdge()); } async command error_t HalPXA27xGpioCapture.captureBothEdge() { return (call HalPXA27xGpioInterrupt.enableBothEdge()); } async command void HalPXA27xGpioCapture.disable() { call HalPXA27xGpioInterrupt.disable(); return; } async event void HalPXA27xGpioInterrupt.fired() { uint16_t captureTime; captureTime = (uint16_t) call Counter32khz32.get(); signal HalPXA27xGpioCapture.captured(captureTime); return; } async event void Counter32khz32.overflow() { return; } default async event void HalPXA27xGpioCapture.captured(uint16_t time) { return; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/gpio/HplPXA27xGPIO.nc000066400000000000000000000122731207233610700224260ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * This interface provides direct access to the PXA27x GPIO controller * registers. It is meant as an alternative to the 'per-pin' interface * where the pin abstraction may not be convienient. The event provided is * called at every signal of the underlying first-level interrupt component * and NOT on a per-pin basis. * * Commands in this interface are named according to the following scheme: * set(uint32_t val); * get(); * where is the register as defined in the PXA27x Developers * Guide: General-Purpose IO Controller. * * This interface is NOT intended to be parameterized. * * @author Phil Buonadonna */ interface HplPXA27xGPIO { async command void setGPLR0(uint32_t val); async command uint32_t getGPLR0(); async command void setGPLR1(uint32_t val); async command uint32_t getGPLR1(); async command void setGPLR2(uint32_t val); async command uint32_t getGPLR2(); async command void setGPLR3(uint32_t val); async command uint32_t getGPLR3(); async command void setGPDR0(uint32_t val); async command uint32_t getGPDR0(); async command void setGPDR1(uint32_t val); async command uint32_t getGPDR1(); async command void setGPDR2(uint32_t val); async command uint32_t getGPDR2(); async command void setGPDR3(uint32_t val); async command uint32_t getGPDR3(); async command void setGPSR0(uint32_t val); async command uint32_t getGPSR0(); async command void setGPSR1(uint32_t val); async command uint32_t getGPSR1(); async command void setGPSR2(uint32_t val); async command uint32_t getGPSR2(); async command void setGPSR3(uint32_t val); async command uint32_t getGPSR3(); async command void setGPCR0(uint32_t val); async command uint32_t getGPCR0(); async command void setGPCR1(uint32_t val); async command uint32_t getGPCR1(); async command void setGPCR2(uint32_t val); async command uint32_t getGPCR2(); async command void setGPCR3(uint32_t val); async command uint32_t getGPCR3(); async command void setGRER0(uint32_t val); async command uint32_t getGRER0(); async command void setGRER1(uint32_t val); async command uint32_t getGRER1(); async command void setGRER2(uint32_t val); async command uint32_t getGRER2(); async command void setGRER3(uint32_t val); async command uint32_t getGRER3(); async command void setGFER0(uint32_t val); async command uint32_t getGFER0(); async command void setGFER1(uint32_t val); async command uint32_t getGFER1(); async command void setGFER2(uint32_t val); async command uint32_t getGFER2(); async command void setGFER3(uint32_t val); async command uint32_t getGFER3(); async command void setGEDR0(uint32_t val); async command uint32_t getGEDR0(); async command void setGEDR1(uint32_t val); async command uint32_t getGEDR1(); async command void setGEDR2(uint32_t val); async command uint32_t getGEDR2(); async command void setGEDR3(uint32_t val); async command uint32_t getGEDR3(); async command void setGAFR0_L(uint32_t val); async command uint32_t getGAFR0_L(); async command void setGAFR0_U(uint32_t val); async command uint32_t getGAFR0_U(); async command void setGAFR1_L(uint32_t val); async command uint32_t getGAFR1_L(); async command void setGAFR1_U(uint32_t val); async command uint32_t getGAFR1_U(); async command void setGAFR2_L(uint32_t val); async command uint32_t getGAFR2_L(); async command void setGAFR2_U(uint32_t val); async command uint32_t getGAFR2_U(); async command void setGAFR3_L(uint32_t val); async command uint32_t getGAFR3_L(); async command void setGAFR3_U(uint32_t val); async command uint32_t getGAFR3_U(); async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/gpio/HplPXA27xGPIOC.nc000066400000000000000000000041511207233610700225250ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ configuration HplPXA27xGPIOC { provides { interface HplPXA27xGPIOPin[uint8_t pin]; interface HplPXA27xGPIO; } } implementation { components HplPXA27xGPIOM; components HplPXA27xInterruptM; components PlatformP; HplPXA27xGPIOPin = HplPXA27xGPIOM; HplPXA27xGPIO = HplPXA27xGPIOM; HplPXA27xGPIOM.Init <- PlatformP.InitL1; HplPXA27xGPIOM.GPIOIrq0 -> HplPXA27xInterruptM.PXA27xIrq[PPID_GPIO_0]; HplPXA27xGPIOM.GPIOIrq1 -> HplPXA27xInterruptM.PXA27xIrq[PPID_GPIO_1]; HplPXA27xGPIOM.GPIOIrq -> HplPXA27xInterruptM.PXA27xIrq[PPID_GPIO_X]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/gpio/HplPXA27xGPIOM.nc000066400000000000000000000255531207233610700225500ustar00rootroot00000000000000// $Id: HplPXA27xGPIOM.nc,v 1.6 2008-06-11 00:46:24 razvanm Exp $ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ //@author Phil Buonadonna module HplPXA27xGPIOM { provides { interface Init; interface HplPXA27xGPIOPin[uint8_t pin]; interface HplPXA27xGPIO; } uses { interface HplPXA27xInterrupt as GPIOIrq0; interface HplPXA27xInterrupt as GPIOIrq1; interface HplPXA27xInterrupt as GPIOIrq; // GPIO 2 - 120 only } } implementation { bool gfInitialized = FALSE; command error_t Init.init() { bool isInited; atomic { isInited = gfInitialized; gfInitialized = TRUE; } if (!isInited) { call GPIOIrq0.allocate(); call GPIOIrq1.allocate(); call GPIOIrq.allocate(); call GPIOIrq0.enable(); call GPIOIrq1.enable(); call GPIOIrq.enable(); } return SUCCESS; } async command bool HplPXA27xGPIOPin.getGPLRbit[uint8_t pin]() { return ((GPLR(pin) & _GPIO_bit(pin)) != 0); } async command void HplPXA27xGPIOPin.setGPDRbit[uint8_t pin](bool dir) { if (dir) { GPDR(pin) |= _GPIO_bit(pin); } else { GPDR(pin) &= ~(_GPIO_bit(pin)); } return; } async command bool HplPXA27xGPIOPin.getGPDRbit[uint8_t pin]() { return ((GPDR(pin) & _GPIO_bit(pin)) != 0); } async command void HplPXA27xGPIOPin.setGPSRbit[uint8_t pin]() { GPSR(pin) = _GPIO_bit(pin); return; } async command void HplPXA27xGPIOPin.setGPCRbit[uint8_t pin]() { GPCR(pin) = _GPIO_bit(pin); return; } async command void HplPXA27xGPIOPin.setGRERbit[uint8_t pin](bool flag) { if (flag) { GRER(pin) |= _GPIO_bit(pin); } else { GRER(pin) &= ~(_GPIO_bit(pin)); } return; } async command bool HplPXA27xGPIOPin.getGRERbit[uint8_t pin]() { return ((GRER(pin) & _GPIO_bit(pin)) != 0); } async command void HplPXA27xGPIOPin.setGFERbit[uint8_t pin](bool flag) { if (flag) { GFER(pin) |= _GPIO_bit(pin); } else { GFER(pin) &= ~(_GPIO_bit(pin)); } return; } async command bool HplPXA27xGPIOPin.getGFERbit[uint8_t pin]() { return ((GFER(pin) & _GPIO_bit(pin)) != 0); } async command bool HplPXA27xGPIOPin.getGEDRbit[uint8_t pin]() { return ((GEDR(pin) & _GPIO_bit(pin)) != 0); } async command bool HplPXA27xGPIOPin.clearGEDRbit[uint8_t pin]() { bool flag; flag = ((GEDR(pin) & _GPIO_bit(pin)) != 0); GEDR(pin) = _GPIO_bit(pin); return flag; } async command void HplPXA27xGPIOPin.setGAFRpin[uint8_t pin](uint8_t func) { func &= 0x3; _GPIO_setaltfn(pin,func); return; } async command uint8_t HplPXA27xGPIOPin.getGAFRpin[uint8_t pin]() { return (_GPIO_getaltfun(pin)); } default async event void HplPXA27xGPIOPin.interruptGPIOPin[uint8_t pin]() { call HplPXA27xGPIOPin.clearGEDRbit[pin](); return; } async command void HplPXA27xGPIO.setGPLR0(uint32_t val) {GPLR0 = val;} async command uint32_t HplPXA27xGPIO.getGPLR0() {return GPLR0;} async command void HplPXA27xGPIO.setGPLR1(uint32_t val) {GPLR1 = val;} async command uint32_t HplPXA27xGPIO.getGPLR1() {return GPLR1;} async command void HplPXA27xGPIO.setGPLR2(uint32_t val) {GPLR2 = val;} async command uint32_t HplPXA27xGPIO.getGPLR2() {return GPLR2;} async command void HplPXA27xGPIO.setGPLR3(uint32_t val) {GPLR3 = val;} async command uint32_t HplPXA27xGPIO.getGPLR3() {return GPLR3;} async command void HplPXA27xGPIO.setGPDR0(uint32_t val) {GPDR0 = val;} async command uint32_t HplPXA27xGPIO.getGPDR0() {return GPDR0;} async command void HplPXA27xGPIO.setGPDR1(uint32_t val) {GPDR1 = val;} async command uint32_t HplPXA27xGPIO.getGPDR1() {return GPDR1;} async command void HplPXA27xGPIO.setGPDR2(uint32_t val) {GPDR2 = val;} async command uint32_t HplPXA27xGPIO.getGPDR2() {return GPDR2;} async command void HplPXA27xGPIO.setGPDR3(uint32_t val) {GPDR3 = val;} async command uint32_t HplPXA27xGPIO.getGPDR3() {return GPDR3;} async command void HplPXA27xGPIO.setGPSR0(uint32_t val) {GPSR0 = val;} async command uint32_t HplPXA27xGPIO.getGPSR0() {return GPSR0;} async command void HplPXA27xGPIO.setGPSR1(uint32_t val) {GPSR1 = val;} async command uint32_t HplPXA27xGPIO.getGPSR1() {return GPSR1;} async command void HplPXA27xGPIO.setGPSR2(uint32_t val) {GPSR2 = val;} async command uint32_t HplPXA27xGPIO.getGPSR2() {return GPSR2;} async command void HplPXA27xGPIO.setGPSR3(uint32_t val) {GPSR3 = val;} async command uint32_t HplPXA27xGPIO.getGPSR3() {return GPSR3;} async command void HplPXA27xGPIO.setGPCR0(uint32_t val) {GPCR0 = val;} async command uint32_t HplPXA27xGPIO.getGPCR0() {return GPCR0;} async command void HplPXA27xGPIO.setGPCR1(uint32_t val) {GPCR1 = val;} async command uint32_t HplPXA27xGPIO.getGPCR1() {return GPCR1;} async command void HplPXA27xGPIO.setGPCR2(uint32_t val) {GPCR2 = val;} async command uint32_t HplPXA27xGPIO.getGPCR2() {return GPCR2;} async command void HplPXA27xGPIO.setGPCR3(uint32_t val) {GPCR3 = val;} async command uint32_t HplPXA27xGPIO.getGPCR3() {return GPCR3;} async command void HplPXA27xGPIO.setGRER0(uint32_t val) {GRER0 = val;} async command uint32_t HplPXA27xGPIO.getGRER0() {return GRER0;} async command void HplPXA27xGPIO.setGRER1(uint32_t val) {GRER1 = val;} async command uint32_t HplPXA27xGPIO.getGRER1() {return GRER1;} async command void HplPXA27xGPIO.setGRER2(uint32_t val) {GRER2 = val;} async command uint32_t HplPXA27xGPIO.getGRER2() {return GRER2;} async command void HplPXA27xGPIO.setGRER3(uint32_t val) {GRER3 = val;} async command uint32_t HplPXA27xGPIO.getGRER3() {return GRER3;} async command void HplPXA27xGPIO.setGFER0(uint32_t val) {GFER0 = val;} async command uint32_t HplPXA27xGPIO.getGFER0() {return GFER0;} async command void HplPXA27xGPIO.setGFER1(uint32_t val) {GFER1 = val;} async command uint32_t HplPXA27xGPIO.getGFER1() {return GFER1;} async command void HplPXA27xGPIO.setGFER2(uint32_t val) {GFER2 = val;} async command uint32_t HplPXA27xGPIO.getGFER2() {return GFER2;} async command void HplPXA27xGPIO.setGFER3(uint32_t val) {GFER3 = val;} async command uint32_t HplPXA27xGPIO.getGFER3() {return GFER3;} async command void HplPXA27xGPIO.setGEDR0(uint32_t val) {GEDR0 = val;} async command uint32_t HplPXA27xGPIO.getGEDR0() {return GEDR0;} async command void HplPXA27xGPIO.setGEDR1(uint32_t val) {GEDR1 = val;} async command uint32_t HplPXA27xGPIO.getGEDR1() {return GEDR1;} async command void HplPXA27xGPIO.setGEDR2(uint32_t val) {GEDR2 = val;} async command uint32_t HplPXA27xGPIO.getGEDR2() {return GEDR2;} async command void HplPXA27xGPIO.setGEDR3(uint32_t val) {GEDR3 = val;} async command uint32_t HplPXA27xGPIO.getGEDR3() {return GEDR3;} async command void HplPXA27xGPIO.setGAFR0_L(uint32_t val) {GAFR0_L = val;} async command uint32_t HplPXA27xGPIO.getGAFR0_L() {return GAFR0_L;} async command void HplPXA27xGPIO.setGAFR0_U(uint32_t val) {GAFR0_U = val;} async command uint32_t HplPXA27xGPIO.getGAFR0_U() {return GAFR0_U;} async command void HplPXA27xGPIO.setGAFR1_L(uint32_t val) {GAFR1_L = val;} async command uint32_t HplPXA27xGPIO.getGAFR1_L() {return GAFR1_L;} async command void HplPXA27xGPIO.setGAFR1_U(uint32_t val) {GAFR1_U = val;} async command uint32_t HplPXA27xGPIO.getGAFR1_U() {return GAFR1_U;} async command void HplPXA27xGPIO.setGAFR2_L(uint32_t val) {GAFR2_L = val;} async command uint32_t HplPXA27xGPIO.getGAFR2_L() {return GAFR2_L;} async command void HplPXA27xGPIO.setGAFR2_U(uint32_t val) {GAFR2_U = val;} async command uint32_t HplPXA27xGPIO.getGAFR2_U() {return GAFR2_U;} async command void HplPXA27xGPIO.setGAFR3_L(uint32_t val) {GAFR3_L = val;} async command uint32_t HplPXA27xGPIO.getGAFR3_L() {return GAFR3_L;} async command void HplPXA27xGPIO.setGAFR3_U(uint32_t val) {GAFR3_U = val;} async command uint32_t HplPXA27xGPIO.getGAFR3_U() {return GAFR3_U;} default async event void HplPXA27xGPIO.fired() { return; } async event void GPIOIrq.fired() { uint32_t DetectReg; uint8_t pin; signal HplPXA27xGPIO.fired(); // Mask off GPIO 0 and 1 (handled by direct IRQs) atomic DetectReg = (GEDR0 & ~((1<<1) | (1<<0))); while (DetectReg) { pin = 31 - _pxa27x_clzui(DetectReg); signal HplPXA27xGPIOPin.interruptGPIOPin[pin](); DetectReg &= ~(1 << pin); } atomic DetectReg = GEDR1; while (DetectReg) { pin = 31 - _pxa27x_clzui(DetectReg); signal HplPXA27xGPIOPin.interruptGPIOPin[(pin+32)](); DetectReg &= ~(1 << pin); } atomic DetectReg = GEDR2; while (DetectReg) { pin = 31 - _pxa27x_clzui(DetectReg); signal HplPXA27xGPIOPin.interruptGPIOPin[(pin+64)](); DetectReg &= ~(1 << pin); } atomic DetectReg = GEDR3; while (DetectReg) { pin = 31 - _pxa27x_clzui(DetectReg); signal HplPXA27xGPIOPin.interruptGPIOPin[(pin+96)](); DetectReg &= ~(1 << pin); } return; } async event void GPIOIrq0.fired() { signal HplPXA27xGPIOPin.interruptGPIOPin[0](); } async event void GPIOIrq1.fired() { signal HplPXA27xGPIOPin.interruptGPIOPin[1](); } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/gpio/HplPXA27xGPIOPin.nc000066400000000000000000000111551207233610700230730ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * This interface provides a 'per-pin' abstraction for the PXA27x * GPIO system. It is parameterized by the specific GPIO Pin number * of the PXA27x. * * @author Phil Buonadonna */ interface HplPXA27xGPIOPin { /** * Returns the logic state of a GPIO Pin. * * @return bool TRUE if logic '1', FALSE if logic '0' */ async command bool getGPLRbit(); /** * Configures the direction of a GPIO pin. * * @param dir TRUE to configure as an output, FALSE to configure as an input. */ async command void setGPDRbit(bool dir); /** * Get's the current pin direction configuration. * * @return bool TRUE if configured as an output, FALSE if configured * as an input. */ async command bool getGPDRbit(); /** * Sets a GPIO pin configured as an output to a HIGH state. * */ async command void setGPSRbit(); /** * Sets a GPIO pin configured as an output to a LOW state. * */ async command void setGPCRbit(); /** * Enables/Disables events on the rising edge of a GPIO pin * signal. Calls to this function are independent of calls * to 'setFallingEDEnable()' * * @param flag TRUE to enable rising edge detection, FASLE to * disable. * */ async command void setGRERbit(bool flag); /** * Returns the status of rising edge detection. * * @return val TRUE if rising edge detection is enable, FALSE * otherwise. */ async command bool getGRERbit(); /** * Enables/Disables events on the falling edge of a GPIO pin * signal. Calls to this function are independent of calls to * 'setRisingEDEnable()' * * @param flag TRUE to enable falling edge detection, FASLE to * disable. */ async command void setGFERbit(bool flag); /** * Returns the status of falling edge detection. * * @return val TRUE if falling edge detection is enable, FALSE * otherwise. */ async command bool getGFERbit(); /** * Indicates wether an edge detection event is pending for GPIO Pin * * @return val TRUE if an event is pending. */ async command bool getGEDRbit(); /** * Clears the edge detection event status. * * @return val TRUE if there was a pending event prior to clearing, * FALSE otherwise. */ async command bool clearGEDRbit(); /** * Sets the GPIO pin to one of it's alternate peripheral functions. * Refer to the PXA27x Developers Manual for information on available * alternate functions. * * @param func An integer between 0 and 3 indicating the desired * pin alternate function. */ async command void setGAFRpin(uint8_t func); /** * Returns the current alternate function selected for the GPIO pin. * * @return val An integer between 0 and 3 indicated the current * alternate function. */ async command uint8_t getGAFRpin(); /** * The pin edge detection event. Signalled when a rising/falling edge * occurs on the PIN and the respective edge detect enable is set. * The default event DOES NOT clear any pending requests. * */ async event void interruptGPIOPin(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/i2c/000077500000000000000000000000001207233610700175025ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/pxa27x/i2c/HalPXA27xI2CMasterC.nc000066400000000000000000000044371207233610700232270ustar00rootroot00000000000000/* $Id: HalPXA27xI2CMasterC.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * This Hal module implements the TinyOS 2.0 I2CPacket interface over * the PXA27x I2C Hpl * * @author Phil Buonadonna */ #include generic configuration HalPXA27xI2CMasterC(bool fast_mode) { provides interface I2CPacket; uses interface HplPXA27xGPIOPin as I2CSCL; uses interface HplPXA27xGPIOPin as I2CSDA; } implementation { components new HalPXA27xI2CMasterP(fast_mode); components HplPXA27xI2CC; components PlatformP; I2CPacket = HalPXA27xI2CMasterP; HalPXA27xI2CMasterP.Init <- PlatformP.InitL2; HalPXA27xI2CMasterP.I2C -> HplPXA27xI2CC.I2C; I2CSCL = HalPXA27xI2CMasterP.I2CSCL; I2CSDA = HalPXA27xI2CMasterP.I2CSDA; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/i2c/HalPXA27xI2CMasterP.nc000066400000000000000000000210371207233610700232370ustar00rootroot00000000000000/* $Id: HalPXA27xI2CMasterP.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * This Hal module implements the TinyOS 2.0 I2CPacket interface over * the PXA27x I2C Hpl * * @author Phil Buonadonna */ #include generic module HalPXA27xI2CMasterP(bool fast_mode) { provides interface Init; provides interface I2CPacket; uses interface HplPXA27xI2C as I2C; uses interface HplPXA27xGPIOPin as I2CSCL; uses interface HplPXA27xGPIOPin as I2CSDA; } implementation { // These states don't necessarily reflect the state of the I2C bus, rather the state of this // module WRT an operation. I.E. the module might be in STATE_IDLE, but the I2C bus still // held by the master for a continued read. enum { I2C_STATE_IDLE, I2C_STATE_READSTART, I2C_STATE_READ, I2C_STATE_READEND, I2C_STATE_WRITE, I2C_STATE_WRITEEND, I2C_STATE_ERROR }; uint8_t mI2CState; uint16_t mCurTargetAddr; uint8_t *mCurBuf, mCurBufLen, mCurBufIndex; i2c_flags_t mCurFlags; uint32_t mBaseICRFlags; static void readNextByte() { if (mCurBufIndex >= (mCurBufLen - 1)) { atomic { mI2CState = I2C_STATE_READEND; } if (mCurFlags & I2C_STOP) { call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_DRFIE | ICR_ACKNAK | ICR_TB | ICR_STOP)); } else if (mCurFlags & I2C_ACK_END) { call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_DRFIE | ICR_TB)); } else { call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_DRFIE | ICR_ACKNAK | ICR_TB)); } } else { atomic { mI2CState = I2C_STATE_READ; } call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_DRFIE | ICR_TB)); } return; } static void writeNextByte() { if (mCurBufIndex >= mCurBufLen) { atomic { mI2CState = I2C_STATE_WRITEEND; } if (mCurFlags & I2C_STOP) { call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_TB | ICR_ITEIE | ICR_STOP)); } else { call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_ITEIE | ICR_TB)); } } else { call I2C.setICR((mBaseICRFlags) | (ICR_ALDIE | ICR_ITEIE |ICR_TB)); } return; } static error_t startI2CTransact(uint8_t nextState, uint16_t addr, uint8_t length, uint8_t *data, i2c_flags_t flags, bool bRnW) { error_t error = SUCCESS; uint8_t tmpAddr; if ((data == NULL) || (length == 0)) { return EINVAL; } atomic { if (mI2CState == I2C_STATE_IDLE) { mI2CState = nextState; mCurTargetAddr = addr; mCurBuf = data; mCurBufLen = length; mCurBufIndex = 0; mCurFlags = flags; } else { error = EBUSY; } } if (error) { return error; } if (flags & I2C_START) { tmpAddr = (bRnW) ? 0x1 : 0x0; tmpAddr |= ((addr << 1) & 0xFE); call I2C.setIDBR(tmpAddr); call I2C.setICR( mBaseICRFlags | ICR_ITEIE | ICR_TB | ICR_START); } else if (bRnW) { atomic { readNextByte(); } } else { atomic { writeNextByte(); } } return error; } task void handleReadError() { call I2C.setISAR(0x7F0); call I2C.setICR(mBaseICRFlags | ICR_MA); call I2C.setICR(ICR_UR); call I2C.setICR(mBaseICRFlags); atomic { mI2CState = I2C_STATE_IDLE; signal I2CPacket.readDone(FAIL,mCurTargetAddr,mCurBufLen,mCurBuf); } return; } task void handleWriteError() { call I2C.setISAR(0x7F0); call I2C.setICR(mBaseICRFlags | ICR_MA); call I2C.setICR(ICR_UR); call I2C.setICR(mBaseICRFlags); atomic { mI2CState = I2C_STATE_IDLE; signal I2CPacket.writeDone(FAIL,mCurTargetAddr,mCurBufLen,mCurBuf); } return; } command error_t Init.init() { atomic { mBaseICRFlags = (fast_mode) ? (ICR_FM | ICR_BEIE | ICR_IUE | ICR_SCLE) : (ICR_BEIE | ICR_IUE | ICR_SCLE); call I2CSCL.setGAFRpin(I2C_SCL_ALTFN); call I2CSCL.setGPDRbit(TRUE); call I2CSDA.setGAFRpin(I2C_SDA_ALTFN); call I2CSDA.setGPDRbit(TRUE); mI2CState = I2C_STATE_IDLE; call I2C.setISAR(0); call I2C.setICR(mBaseICRFlags | ICR_ITEIE | ICR_DRFIE); } return SUCCESS; } async command error_t I2CPacket.read(i2c_flags_t flags, uint16_t addr, uint8_t length, uint8_t* data) { error_t error = SUCCESS; if ((flags & I2C_ACK_END) && (flags & I2C_STOP)) { error = EINVAL; return error; } if (flags & I2C_START) { error = startI2CTransact(I2C_STATE_READSTART,addr,length,data,flags,TRUE); } else { error = startI2CTransact(I2C_STATE_READ,addr,length,data,flags,TRUE); } return error; } async command error_t I2CPacket.write(i2c_flags_t flags, uint16_t addr, uint8_t length, uint8_t* data) { error_t error = SUCCESS; error = startI2CTransact(I2C_STATE_WRITE,addr,length,data,flags,FALSE); return error; } async event void I2C.interruptI2C() { uint32_t valISR; // PXA27x Devel Guide is wrong. You have to write to the ISR to clear the bits. valISR = call I2C.getISR(); call I2C.setISR(ISR_ITE | ISR_IRF); // turn off DRFIE and ITEIE //call I2C.setICR((call I2C.getICR()) & ~(ICR_DRFIE | ICR_ITEIE)); //call I2C.setICR(mBaseICRFlags); switch (mI2CState) { case I2C_STATE_IDLE: // Should never get here. Reset all pending interrupts. break; case I2C_STATE_READSTART: if (valISR & (ISR_BED | ISR_ALD)) { mI2CState = I2C_STATE_ERROR; post handleReadError(); break; } readNextByte(); break; case I2C_STATE_READ: if (valISR & (ISR_BED | ISR_ALD)) { mI2CState = I2C_STATE_ERROR; post handleReadError(); break; } mCurBuf[mCurBufIndex] = call I2C.getIDBR(); mCurBufIndex++; readNextByte(); break; case I2C_STATE_READEND: if (valISR & (ISR_BED | ISR_ALD)) { mI2CState = I2C_STATE_ERROR; post handleReadError(); break; } mCurBuf[mCurBufIndex] = call I2C.getIDBR(); mI2CState = I2C_STATE_IDLE; signal I2CPacket.readDone(SUCCESS,mCurTargetAddr,mCurBufLen,mCurBuf); break; case I2C_STATE_WRITE: if (valISR & (ISR_BED | ISR_ALD)) { mI2CState = I2C_STATE_ERROR; post handleWriteError(); break; } call I2C.setIDBR(mCurBuf[mCurBufIndex]); mCurBufIndex++; writeNextByte(); break; case I2C_STATE_WRITEEND: if (valISR & (ISR_BED | ISR_ALD)) { mI2CState = I2C_STATE_ERROR; post handleWriteError(); break; } mI2CState= I2C_STATE_IDLE; //call I2C.setICR(call I2C.getICR() & ~I2C_STOP); call I2C.setICR(mBaseICRFlags); signal I2CPacket.writeDone(SUCCESS,mCurTargetAddr,mCurBufLen,mCurBuf); break; default: break; } return; } default async event void I2CPacket.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { return; } default async event void I2CPacket.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { return; } async event void I2CSDA.interruptGPIOPin() {} async event void I2CSCL.interruptGPIOPin() {} } tinyos-2.1.2+dfsg/tos/chips/pxa27x/i2c/HplPXA27xI2C.nc000066400000000000000000000041341207233610700217610ustar00rootroot00000000000000/* $Id: HplPXA27xI2C.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * The PXA27x I2C HPL interface. * * @author Phil Buonadonna */ interface HplPXA27xI2C { async command uint32_t getIBMR(); async command void setIDBR(uint32_t val); async command uint32_t getIDBR(); async command void setICR(uint32_t val); async command uint32_t getICR(); async command void setISR(uint32_t val); async command uint32_t getISR(); async command void setISAR(uint32_t val); async command uint32_t getISAR(); async event void interruptI2C(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/i2c/HplPXA27xI2CC.nc000066400000000000000000000037251207233610700220710ustar00rootroot00000000000000/* $Id: HplPXA27xI2CC.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadona */ configuration HplPXA27xI2CC { provides interface HplPXA27xI2C as I2C; } implementation { components new HplPXA27xI2CP(0); components HplPXA27xInterruptM; components PlatformP; I2C = HplPXA27xI2CP; HplPXA27xI2CP.Init <- PlatformP.InitL1; HplPXA27xI2CP.I2CIrq -> HplPXA27xInterruptM.PXA27xIrq[PPID_I2C]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/i2c/HplPXA27xI2CP.nc000066400000000000000000000077731207233610700221150ustar00rootroot00000000000000/* $Id: HplPXA27xI2CP.nc,v 1.6 2008-09-08 03:10:23 regehr Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * The Private Hpl Interface for the I2C components. Handles enabling of the * clock for the interface. It DOES NOT affect the I2C_IUE bit of the ICR * register. * * @param dev The I2C to use. 0 = Standard I2c, 1 = Power I2C * * @author Phil Buonadonna */ generic module HplPXA27xI2CP(uint8_t dev) { provides interface Init; provides interface HplPXA27xI2C as I2C; uses interface HplPXA27xInterrupt as I2CIrq; } implementation { bool m_fInit = FALSE; command error_t Init.init() { bool isInited; atomic { isInited = m_fInit; m_fInit = TRUE; } if (!isInited) { switch(dev) { case 0: CKEN |= CKEN14_I2C; ICR = 0; break; case 1: CKEN |= CKEN15_PMI2C; PICR = 0; break; default: break; } call I2CIrq.allocate(); call I2CIrq.enable(); } return SUCCESS; } async command uint32_t I2C.getIBMR() { switch(dev) { case 0: return IBMR; break; case 1: return PIBMR; break; default: return 0; } } async command void I2C.setIDBR(uint32_t val) { switch(dev) { case 0: IDBR = val; break; case 1: PIDBR = val; break; default: break; } return; } async command uint32_t I2C.getIDBR() { switch(dev) { case 0: return IDBR; case 1: return PIDBR; default: return 0; } } async command void I2C.setICR(uint32_t val) { switch(dev) { case 0: ICR = val; break; case 1: PICR = val; break; default: break; } return; } async command uint32_t I2C.getICR() { switch(dev) { case 0: return ICR; case 1: return PICR; default: return 0; } } async command void I2C.setISR(uint32_t val) { switch(dev) { case 0: ISR = val; break; case 1: PISR = val; break; default: break; } } async command uint32_t I2C.getISR() { switch(dev) { case 0: return ISR; case 1: return PISR; default: return 0; } } async command void I2C.setISAR(uint32_t val) { switch(dev) { case 0: ISAR = val; break; case 1: PISAR = val; break; default: break; } return; } async command uint32_t I2C.getISAR() { switch(dev) { case 0: return ISAR; break; case 1: return PISAR; break; default: return 0; } } async event void I2CIrq.fired() { signal I2C.interruptI2C(); return; } default async event void I2C.interruptI2C() { return; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/i2c/HplPXA27xPI2CC.nc000066400000000000000000000036651207233610700222140ustar00rootroot00000000000000/* $Id: HplPXA27xPI2CC.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ configuration HplPXA27xPI2CC { provides interface HplPXA27xI2C as I2C; } implementation { components new HplPXA27xI2CP(1); components HplPXA27xInterruptM; components PlatformP; I2C = HplPXA27xI2CP; HplPXA27xI2CP.Init <- PlatformP.InitL1; HplPXA27xI2CP.I2CIrq -> HplPXA27xInterruptM.PXA27xIrq[PPID_PWR_I2C]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/inttypes.h000066400000000000000000000005261207233610700210600ustar00rootroot00000000000000#ifndef __INTTYPES_H_ #define __INTTYPES_H_ typedef signed char int8_t; typedef unsigned char uint8_t; typedef short int16_t; typedef unsigned short uint16_t; typedef int int32_t; typedef unsigned int uint32_t; typedef long long int64_t; typedef unsigned long long uint64_t; typedef int32_t intptr_t; typedef uint32_t uintptr_t; #endif tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/000077500000000000000000000000001207233610700174275ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/Flash.nc000066400000000000000000000055271207233610700210170ustar00rootroot00000000000000/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /** * Interface for writing and erasing in flash memory * * Author: Josh Herbach * Revision: 1.0 * Date: 09/02/2005 */ interface Flash { /** * Writes numBytes of the buffer data to the address in flash specified * by addr. This function will only set bits low for the bytes it is * supposed to write to.If addr connot be written to for any reason returns * FAIL, otherwise returns SUCCESS. * * @returns SUCCESS or FAIL. */ command error_t write(uint32_t addr, uint8_t* data, uint32_t numBytes); /** * Erases the block of flash that contains addr, setting all bits to 1. * If this function fails for any reason it will return FAIL, otherwise * SUCCESS. * * @returns SUCCESS or FAIL. */ command error_t erase(uint32_t addr); /** * Reads len number of bytes into buf, starting at addr. If addr * cannot be read for any reason returns FAIL, otherwise returns * SUCCESS. */ command error_t read(uint32_t addr, uint8_t* buf, uint32_t len); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/FlashC.nc000066400000000000000000000003441207233610700211120ustar00rootroot00000000000000/* * Author: Josh Herbach * Revision: 1.0 * Date: 09/02/2005 */ configuration FlashC { provides interface Flash; } implementation { components Main, FlashM; Main.StdControl -> FlashM; Flash = FlashM; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/HalP30C.nc000066400000000000000000000035251207233610700210500ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * P30 Hal component * * @author Kaisen Lin * @author Phil Buonadonna */ configuration HalP30C { provides interface Flash; } implementation { components HalP30P, HplP30P, MainC; Flash = HalP30P; MainC.SoftwareInit -> HalP30P; HalP30P.HplP30 -> HplP30P; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/HalP30P.nc000066400000000000000000000160731207233610700210670ustar00rootroot00000000000000/* * Author: Josh Herbach * Revision: 1.0 * Date: 09/02/2005 */ module HalP30P { provides interface Init; provides interface Flash; //does not allow writing into FLASH_PROTECTED_REGION uses interface HplP30; } implementation { #include enum { FLASH_STATE_READ_INACTIVE, FLASH_STATE_PROGRAM, FLASH_STATE_ERASE, FLASH_STATE_READ_ACTIVE }; uint8_t FlashPartitionState[FLASH_PARTITION_COUNT]; uint8_t init = 0, programBufferSupported = 2, currBlock = 0; command error_t Init.init() { int i = 0; if(init != 0) return SUCCESS; init = 1; for(i = 0; i < FLASH_PARTITION_COUNT; i++) FlashPartitionState[i] = FLASH_STATE_READ_INACTIVE; return SUCCESS; } uint16_t writeHelper(uint32_t addr, uint8_t* data, uint32_t numBytes, uint8_t prebyte, uint8_t postbyte){ uint32_t i = 0, j = 0, k = 0; error_t status; uint16_t buffer[FLASH_PROGRAM_BUFFER_SIZE]; if(numBytes == 0) return FAIL; if(addr % 2 == 1){ status = call HplP30.progWord(addr - 1, prebyte | (data[i] << 8)); i++; if(status != SUCCESS) return FAIL; } if(addr % 2 == numBytes % 2){ if(programBufferSupported == 1) for(; i < numBytes; i = k){ for(j = 0, k = i; k < numBytes && j < FLASH_PROGRAM_BUFFER_SIZE; j++, k+=2) buffer[j] = data[k] | (data[k + 1] << 8); status = call HplP30.progBuffer(addr + i, buffer, j); if(status != SUCCESS) return FAIL; } else for(; i < numBytes; i+=2){ status = call HplP30.progWord(addr + i, (data[i + 1] << 8) | data[i]); if(status != SUCCESS) return FAIL; } } else{ if(programBufferSupported == 1) for(; i < numBytes - 1; i = k){ for(j = 0, k = i; k < numBytes - 1 && j < FLASH_PROGRAM_BUFFER_SIZE; j++, k+=2) buffer[j] = data[k] | (data[k + 1] << 8); status = call HplP30.progBuffer(addr + i, buffer, j); if(status != SUCCESS) return FAIL; } else for(; i < numBytes - 1; i+=2){ status = call HplP30.progWord(addr + i, (data[i + 1] << 8) | data[i]); if(status != SUCCESS) return FAIL; } status = call HplP30.progWord(addr + i, data[i] | (postbyte << 8)); if(status != SUCCESS) return FAIL; } return SUCCESS; } void writeExitHelper(uint32_t addr, uint32_t numBytes){ uint32_t i = 0; for(i = addr / FLASH_PARTITION_SIZE; i < (numBytes + addr) / FLASH_PARTITION_SIZE; i++) FlashPartitionState[i] = FLASH_STATE_READ_INACTIVE; } command error_t Flash.write(uint32_t addr, uint8_t* data, uint32_t numBytes) { uint32_t i; uint16_t status; uint8_t blocklen; uint32_t blockAddr = (addr / P30_BLOCK_SIZE) * P30_BLOCK_SIZE; if(addr + numBytes > 0x02000000) //not in the flash memory space return FAIL; if(addr < FLASH_PROTECTED_REGION) return FAIL; for(i = 0; i < FLASH_PARTITION_COUNT; i++) if(i != addr / FLASH_PARTITION_SIZE && FlashPartitionState[i] != FLASH_STATE_READ_INACTIVE && FlashPartitionState[i] != FLASH_STATE_READ_ACTIVE) return FAIL; for(i = addr / FLASH_PARTITION_SIZE; i < (numBytes + addr) / FLASH_PARTITION_SIZE; i++) if(FlashPartitionState[i] != FLASH_STATE_READ_INACTIVE) return FAIL; for(i = addr / FLASH_PARTITION_SIZE; i < (numBytes + addr) / FLASH_PARTITION_SIZE; i++) FlashPartitionState[i] = FLASH_STATE_PROGRAM; atomic{ for(blocklen = 0, i = blockAddr; i < addr + numBytes; i += P30_BLOCK_SIZE, blocklen++) call HplP30.blkUnlock(i); //unlock(i); if(programBufferSupported == 2){ uint16_t testBuf[1]; if(addr % 2 == 0){ testBuf[0] = data[0] | ((*((uint8_t *)(addr + 1))) << 8); status = call HplP30.progBuffer(addr, testBuf, 1); } else{ testBuf[0] = *((uint8_t *)(addr - 1)) | (data[0] << 8); status = call HplP30.progBuffer(addr - 1, testBuf, 1); } if(status != SUCCESS) programBufferSupported = 0; else programBufferSupported = 1; } } if(blocklen == 1){ atomic status = writeHelper(addr,data,numBytes,0xFF,0xFF); if(status == FAIL){ writeExitHelper(addr, numBytes); return FAIL; } } else{ uint32_t bytesLeft = numBytes; atomic status = writeHelper(addr,data, blockAddr + P30_BLOCK_SIZE - addr,0xFF,0xFF); if(status == FAIL){ writeExitHelper(addr, numBytes); return FAIL; } bytesLeft = numBytes - (P30_BLOCK_SIZE - (addr - blockAddr)); for(i = 1; i < blocklen - 1; i++){ atomic status = writeHelper(blockAddr + i * P30_BLOCK_SIZE, (uint8_t *)(data + numBytes - bytesLeft), P30_BLOCK_SIZE,0xFF,0xFF); bytesLeft -= P30_BLOCK_SIZE; if(status == FAIL){ writeExitHelper(addr, numBytes); return FAIL; } } atomic status = writeHelper(blockAddr + i * P30_BLOCK_SIZE, data + (numBytes - bytesLeft), bytesLeft, 0xFF,0xFF); if(status == FAIL){ writeExitHelper(addr, numBytes); return FAIL; } } writeExitHelper(addr, numBytes); return SUCCESS; } command error_t Flash.erase(uint32_t addr){ uint16_t status, i; uint32_t j; if(addr > 0x02000000) //not in the flash memory space return FAIL; if(addr < FLASH_PROTECTED_REGION) return FAIL; addr = (addr / P30_BLOCK_SIZE) * P30_BLOCK_SIZE; for(i = 0; i < FLASH_PARTITION_COUNT; i++) if(i != addr / FLASH_PARTITION_SIZE && FlashPartitionState[i] != FLASH_STATE_READ_INACTIVE && FlashPartitionState[i] != FLASH_STATE_READ_ACTIVE) return FAIL; if(FlashPartitionState[addr / FLASH_PARTITION_SIZE] != FLASH_STATE_READ_INACTIVE) return FAIL; FlashPartitionState[addr / FLASH_PARTITION_SIZE] = FLASH_STATE_ERASE; for(j = 0; j < P30_BLOCK_SIZE; j++){ uint32_t tempCheck = *(uint32_t *)(addr + j); if(tempCheck != 0xFFFFFFFF) break; if(j == P30_BLOCK_SIZE - 1){ FlashPartitionState[addr / FLASH_PARTITION_SIZE] = FLASH_STATE_READ_INACTIVE; return SUCCESS; } } atomic{ call HplP30.blkUnlock(addr); // status = eraseFlash(addr); status = call HplP30.blkErase(addr); } FlashPartitionState[addr / FLASH_PARTITION_SIZE] = FLASH_STATE_READ_INACTIVE; if(status != SUCCESS) return FAIL; return SUCCESS; } // WARNING: Check the endien of this command error_t Flash.read(uint32_t addr, uint8_t* buf, uint32_t len) { error_t status; uint8_t databyte; /* uint16_t dataword; while(len > 1) { atomic { status = call HplP30.readWordBurst(addr, &dataword); } if(status != SUCCESS) return FAIL; *((uint16_t*) buf) = dataword; addr += 2; buf += 2; len -= 2; } if(len == 1) { atomic { status = call HplP30.readWordBurst(addr, &dataword); } if(status != SUCCESS) return FAIL; *buf = (uint8_t) dataword; } */ while(len > 0) { atomic { status = call HplP30.readByteBurst(addr, &databyte); } if(status != SUCCESS) return FAIL; *buf = databyte; addr += 1; buf += 1; len -= 1; } return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/HplP30.nc000066400000000000000000000041311207233610700207560ustar00rootroot00000000000000/* $Id: HplP30.nc,v 1.4 2006-12-12 18:23:12 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Phil Buonadonna */ interface HplP30 { async command error_t progWord(uint32_t addr, uint16_t word); async command error_t progBuffer(uint32_t addr, uint16_t *data, uint8_t len); async command error_t blkErase(uint32_t blkaddr); async command error_t blkLock(uint32_t blkaddr); async command error_t blkUnlock(uint32_t blkaddr); async command error_t readByteBurst(uint32_t addr, uint8_t* bytex); async command error_t readWordBurst(uint32_t addr, uint16_t* word); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/HplP30P.nc000066400000000000000000000112131207233610700210750ustar00rootroot00000000000000/* $Id: HplP30P.nc,v 1.4 2006-12-12 18:23:12 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Phil Buonadonna * */ #include module HplP30P { provides interface HplP30; } implementation { volatile uint16_t * devBaseAddress = (uint16_t *)(0x0); async command error_t HplP30.progWord(uint32_t addr, uint16_t word) { volatile uint16_t *blkAddress = (uint16_t *)addr; uint32_t result; *devBaseAddress = P30_READ_CLRSTATUS; *blkAddress = P30_WRITE_WORDPRGSETUP; *blkAddress = word; do { result = *blkAddress; } while ((result & P30_SR_DWS) == 0); *blkAddress = P30_READ_READARRAY; if (result & (P30_SR_PS | P30_SR_VPPS | P30_SR_BLS)) { return FAIL; } return SUCCESS; } async command error_t HplP30.progBuffer(uint32_t addr, uint16_t *data, uint8_t len) { volatile uint16_t *blkAddress = (uint16_t *)addr; uint32_t i,result; error_t error = SUCCESS; if (len <= 0) { error = EINVAL; goto done; } *devBaseAddress = P30_READ_CLRSTATUS; *blkAddress = P30_WRITE_BUFPRG; result = *blkAddress; if ((result & P30_SR_DWS) == 0) { error = FAIL; goto cleanup; } *blkAddress = len-1; for (i=0;i HalP30C; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/P30BlockP.nc000066400000000000000000000137021207233610700214110ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Kaisen Lin * @author Phil Buonadonna * */ #include #include module P30BlockP { provides interface BlockRead as Read[ storage_volume_t block ]; provides interface BlockWrite as Write[ storage_volume_t block ]; uses interface Leds; uses interface Flash; } implementation { typedef enum { S_IDLE, S_READ, S_WRITE, S_ERASE, S_CRC, S_SYNC, } p30_block_state_t; norace p30_block_state_t m_state = S_IDLE; storage_volume_t clientId = 0xff; storage_addr_t clientAddr; void* clientBuf; storage_len_t clientLen; error_t clientResult; /* * This is a helper function to translate from the client address * space to the underlying HalP30 address space. This is necessary * because HAL provides a flat 32MB interface. */ uint32_t xlateAddr(storage_volume_t b, storage_addr_t addr) { return P30_VMAP[b].base * FLASH_PARTITION_SIZE + addr; } task void signalDoneTask() { switch(m_state) { case S_WRITE: m_state = S_IDLE; signal Write.writeDone[clientId](clientAddr, clientBuf, clientLen, clientResult); break; case S_SYNC: m_state = S_IDLE; signal Write.syncDone[clientId](SUCCESS); break; case S_ERASE: m_state = S_IDLE; signal Write.eraseDone[clientId](clientResult); break; case S_READ: m_state = S_IDLE; signal Read.readDone[clientId](clientAddr, clientBuf, clientLen, clientResult); break; default: break; } } /* * Translate the address to a physical flash address and do the * write. */ command error_t Write.write[ storage_volume_t b ]( storage_addr_t addr, void* buf, storage_len_t len ) { uint32_t physAddr; if(m_state != S_IDLE) return EBUSY; // error check if(addr + len > P30_VMAP[b].size * FLASH_PARTITION_SIZE) return EINVAL; clientId = b; clientAddr = addr; clientBuf = buf; clientLen = len; m_state = S_WRITE; physAddr = xlateAddr(b, addr); clientResult = call Flash.write(physAddr, (uint8_t*) buf, len); post signalDoneTask(); return SUCCESS; } /* * Sync doesn't really do anything because Intel PXA is * write-through. */ command error_t Write.sync[ storage_volume_t b ]() { m_state = S_SYNC; clientId = b; post signalDoneTask(); return SUCCESS; } /* * Because each 2MB partition is divided into 128k erasable pieces, * we must go through and erase all of them. */ command error_t Write.erase[ storage_volume_t b ]() { uint32_t physAddr; uint32_t blocks; if(m_state != S_IDLE) return EBUSY; clientId = b; m_state = S_ERASE; physAddr = xlateAddr(b,0); for(blocks = ((P30_VMAP[b].size)*FLASH_PARTITION_SIZE)/P30_BLOCK_SIZE; blocks > 0; blocks--) { clientResult = call Flash.erase(physAddr); if(clientResult != SUCCESS) break; physAddr += P30_BLOCK_SIZE; } post signalDoneTask(); return SUCCESS; } /* * Translate the address to a physical flash address and do the * read. */ command error_t Read.read[ storage_volume_t b ]( storage_addr_t addr, void* buf, storage_len_t len ) { uint32_t physAddr; if(m_state != S_IDLE) return FAIL; clientId = b; clientAddr = addr; clientBuf = buf; clientLen = len; m_state = S_READ; physAddr = xlateAddr(b,addr); call Flash.read((uint32_t) physAddr, (uint8_t*) buf, (uint32_t) len); post signalDoneTask(); return SUCCESS; } command error_t Read.computeCrc[ storage_volume_t b ]( storage_addr_t addr, storage_len_t len, uint16_t crc) { m_state = S_CRC; clientId = b; post signalDoneTask(); return SUCCESS; } command storage_len_t Read.getSize[ storage_volume_t b]() { return P30_VMAP[b].size * FLASH_PARTITION_SIZE; } default event void Write.writeDone[ storage_volume_t b ]( storage_addr_t addr, void* buf, storage_len_t len, error_t error ) {} default event void Write.eraseDone[ storage_volume_t b ]( error_t error ) {} default event void Write.syncDone[ storage_volume_t b ]( error_t error ) {} default event void Read.readDone[ storage_volume_t b ]( storage_addr_t addr, void* buf, storage_len_t len, error_t error ) {} default event void Read.computeCrcDone[ storage_volume_t b ]( storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error ) {} } tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/P30ConfigC.nc000066400000000000000000000036441207233610700215530ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Kaisen Lin * @author Phil Buonadonna * */ configuration P30ConfigC { provides interface ConfigStorage[ storage_volume_t volume ]; provides interface Mount[ storage_volume_t volume ]; } implementation { components P30ConfigP, MainC; ConfigStorage = P30ConfigP.Config; Mount = P30ConfigP.Mount; components HalP30C; P30ConfigP.Flash -> HalP30C; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/P30ConfigP.nc000066400000000000000000000234231207233610700215650ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Kaisen Lin * @author Phil Buonadonna * */ #include #include module P30ConfigP { provides interface ConfigStorage as Config[ storage_volume_t v ]; provides interface Mount[ storage_volume_t v ]; uses interface Flash; uses interface Leds; } implementation { /* * These are some macros for convenience. Essentially it is cutting * a 2MB chunk into a two pieces. The size of the two pieces is * hardcoded by C_PARTITION_sIZE. It must be a multiple of * P30_BLOCK_SIZE because that is the erasable size. The bigger you * make the C_PARTITION_SIZE, the longer commits will take because * it must erase all the blocks inside. On the other hand, a larger * C_PARTITION_SIZE will give you a larger address space. v is the * parameterized interface that is used in the context of these * macros. */ #define C_PARTITION_SIZE (P30_BLOCK_SIZE*1) #define C_PARTITION_0 (P30_VMAP[v].base * FLASH_PARTITION_SIZE) #define C_PARTITION_1 (P30_VMAP[v].base * FLASH_PARTITION_SIZE + C_PARTITION_SIZE) typedef uint32_t version_t; enum { /* * WARNING: AT45DB has a RAM buffer that allows writes to occur * without actually writing to flash. We simulate this because it * makes rewrites a lot simpler. However, this essentially takes * RAM overhead. However, Configstores are relatively small and * the Intel PXA has a lot of main memory, so we do it anyway. */ BUFFER_SIZE = 2048, INVALID_VERSION = 0xFFFFFFFF, NUM_VOLS = _V_NUMVOLS_, //uniqueCount( "pxa27xp30.Volume" ), }; typedef enum { S_IDLE, S_MOUNT, S_READ, S_WRITE, S_COMMIT, } p30_config_state_t; norace p30_config_state_t m_state = S_IDLE; /* * Each instantiation of a Configstore must keep certain state. This * includes the current version of the page and the active address * within that page since we are splitting it into two pieces. Each * Configstore must also have its own RAM buffer for concurrent * operations. */ uint32_t currentVersion[NUM_VOLS]; uint32_t activeBaseAddr[NUM_VOLS]; uint8_t workBuf[BUFFER_SIZE*NUM_VOLS]; storage_volume_t clientId = 0xff; storage_addr_t clientAddr; void* clientBuf; storage_len_t clientLen; error_t clientResult; task void signalDoneTask() { switch(m_state) { case S_MOUNT: m_state = S_IDLE; signal Mount.mountDone[clientId](clientResult); break; case S_WRITE: m_state = S_IDLE; signal Config.writeDone[clientId](clientAddr, clientBuf, clientLen, clientResult); break; case S_COMMIT: m_state = S_IDLE; signal Config.commitDone[clientId](SUCCESS); break; case S_READ: m_state = S_IDLE; signal Config.readDone[clientId](clientAddr, clientBuf, clientLen, clientResult); break; default: break; } } /* * Erase a config partition. It may be more than one P30 block size, * so erase multiple times. */ void eraseConfigPartition(uint32_t base) { uint32_t blocks; for(blocks = C_PARTITION_SIZE / P30_BLOCK_SIZE; blocks > 0; blocks--) { call Flash.erase(base); base += P30_BLOCK_SIZE; } } /* * Read the data directly from the RAM buffer into the client * buffer... Might be read from Flash depending on semantics */ command error_t Config.read[storage_volume_t v](storage_addr_t addr, void* buf, storage_len_t len) { uint32_t i; clientId = v; clientAddr = addr; clientBuf = buf; clientLen = len; m_state = S_READ; /* for(i = addr; i < addr + len; i++) { ((uint8_t*)buf)[i-addr] = workBuf[(v*BUFFER_SIZE)+i]; } */ call Flash.read(activeBaseAddr[v] + addr, (uint8_t*) buf, len); post signalDoneTask(); return SUCCESS; } /* * Writes the client data into the given address in the RAM * buffer. Data is not actually written to flash until the user * commits. */ command error_t Config.write[storage_volume_t v](storage_addr_t addr, void* buf, storage_len_t len) { uint32_t i; clientId = v; clientAddr = addr; clientBuf = buf; clientLen = len; // error check if(addr + len > BUFFER_SIZE) return FAIL; // out of my artificial bounds m_state = S_WRITE; for(i = addr; i < addr + len; i++) workBuf[(v*BUFFER_SIZE)+i] = ((uint8_t*)buf)[i-addr]; clientResult = SUCCESS; post signalDoneTask(); return SUCCESS; } /* * Determine which partition to write to based on the current one * that is active. Also update the version number. Version numbers * are 0, 1, 2, or 3 and wraps around. Write the RAM buffer out * first BEFORE writing the the new version number. After the * version number is written, the active config is now atomically * switched. Then update any other in memory metadata. */ command error_t Config.commit[storage_volume_t v]() { uint32_t destBaseAddr; if(activeBaseAddr[v] == C_PARTITION_0) destBaseAddr = C_PARTITION_1; else destBaseAddr = C_PARTITION_0; m_state = S_COMMIT; clientId = v; clientResult = SUCCESS; currentVersion[v] = (currentVersion[v] + 1) % 4; // erase target flash area before writing to it eraseConfigPartition(destBaseAddr); // write RAM buffer out call Flash.write(destBaseAddr, (uint8_t*) &workBuf[v*BUFFER_SIZE], BUFFER_SIZE); call Flash.write(destBaseAddr + C_PARTITION_SIZE - sizeof(version_t), (uint8_t*) ¤tVersion[v], sizeof(version_t)); activeBaseAddr[v] = destBaseAddr; post signalDoneTask(); return SUCCESS; } /* * The only metadata that needs to be saved is a version * number. Thus you get the whole partition minus the version number * in terms of space. */ command storage_len_t Config.getSize[storage_volume_t v]() { return C_PARTITION_SIZE - sizeof(version_t); } command bool Config.valid[storage_volume_t v]() { return TRUE; } /* * When a Configstore is mounted, it must do some initial * book-keeping work. It first reads from the two pieces two * determine, which one is the actual active one. Afterwards, we * read from flash into the RAM buffer or else subsequent reads will * not work. */ command error_t Mount.mount[storage_volume_t v]() { version_t v0; version_t v1; m_state = S_MOUNT; clientResult = SUCCESS; clientId = v; currentVersion[v] = INVALID_VERSION; // read version #s from both sectors and determine new one // pick among 0 1 2 3 FFFF call Flash.read(C_PARTITION_0 + C_PARTITION_SIZE - sizeof(version_t), (uint8_t*)&v0, sizeof(version_t)); call Flash.read(C_PARTITION_1 + C_PARTITION_SIZE - sizeof(version_t), (uint8_t*)&v1, sizeof(version_t)); // this logic in this could probably be simplified if(v0 == INVALID_VERSION && v1 == INVALID_VERSION) { // clean partition activeBaseAddr[v] = C_PARTITION_0; currentVersion[v] = 0; } else if(v1 == INVALID_VERSION) { // use v0 activeBaseAddr[v] = C_PARTITION_0; currentVersion[v] = v0; } else if(v0 == INVALID_VERSION) { // use v1 activeBaseAddr[v] = C_PARTITION_1; currentVersion[v] = v1; } else if((v0 + 1) % 4 == v1) { // use v1 activeBaseAddr[v] = C_PARTITION_1; currentVersion[v] = v1; } else if((v1 + 1) % 4 == v0) { // use v0 activeBaseAddr[v] = C_PARTITION_0; currentVersion[v] = v0; } else { // corrupted? erase both, might want to improve this later eraseConfigPartition(C_PARTITION_0); eraseConfigPartition(C_PARTITION_1); currentVersion[v] = 0; } // read into RAM buffer call Flash.read(activeBaseAddr[v], (uint8_t*)&workBuf[v*BUFFER_SIZE], BUFFER_SIZE); post signalDoneTask(); return SUCCESS; } default event void Config.readDone[storage_volume_t v](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} default event void Config.writeDone[storage_volume_t v](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} default event void Config.commitDone[storage_volume_t v](error_t error) {} default event void Mount.mountDone[storage_volume_t v](error_t error) {} } tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/P30LogC.nc000066400000000000000000000037421207233610700210660ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Kaisen Lin * @author Phil Buonadonna * */ configuration P30LogC { provides interface LogWrite as Write[ storage_volume_t volume ]; provides interface LogRead as Read[ storage_volume_t volume ]; uses interface Get as Circular[ storage_volume_t block ]; } implementation { components P30LogP; P30LogP = Write; P30LogP = Read; P30LogP = Circular; components HalP30C; P30LogP.Flash -> HalP30C; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/P30LogCircularP.nc000066400000000000000000000034371207233610700225710ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Kaisen Lin * @author Phil Buonadonna * */ generic module P30LogCircularP( bool IS_CIRCULAR ) { provides interface Get as Circular; } implementation { command bool Circular.get() { return IS_CIRCULAR; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/P30LogP.nc000066400000000000000000000444061207233610700211050ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Kaisen Lin * @author Phil Buonadonna * */ #include #include module P30LogP { provides interface LogRead as Read[ storage_volume_t block ]; provides interface LogWrite as Write[ storage_volume_t block ]; uses interface Leds; uses interface Flash; uses interface Get as Circular[ storage_volume_t block ]; } implementation { #define SEEK_BEGINNING (0x0) #define SEEK_EOL (0xFFFFFFFF) #define L_BASE_BLOCK(_x) (P30_VMAP[_x].base * FLASH_PARTITION_SIZE) #define L_PARTITIONS(_x) ((P30_VMAP[_x].size * FLASH_PARTITION_SIZE) / P30_BLOCK_SIZE) #define L_FULL_RECORD_SIZE (sizeof(record_data_t) + sizeof(record_meta_t)) #define L_RECORD_DATA_SIZE 256 #define L_MAX_RECORDS_PER_BLOCK (P30_BLOCK_SIZE / L_FULL_RECORD_SIZE) // page meta counts as one record // _a = blockId (from parameterized interface), _b = page, _c = record #define L_RAW_OFFSET(_a,_b,_c) (L_BASE_BLOCK(_a) + (_b * P30_BLOCK_SIZE) + (_c * L_FULL_RECORD_SIZE)) enum { INVALID_VERSION = 0xFFFFFFFF, NUM_VOLS = _V_NUMVOLS_, //uniqueCount("pxa27xp30.Volume"), }; enum { PAGE_START = 0x0000, PAGE_USED = 0xFFF0, PAGE_AVAILABLE = 0xFFFF, }; typedef struct page_meta_t { uint16_t header; } page_meta_t; enum { RECORD_VALID = 0x0000, RECORD_INVALID = 0xFFF0, RECORD_EMPTY = 0xFFFF, }; typedef struct record_meta_t { uint16_t status; uint16_t length; } record_meta_t; typedef struct record_data_t { uint8_t data[L_RECORD_DATA_SIZE]; } record_data_t; typedef enum { S_IDLE, S_READ, S_APPEND, S_SYNC, S_ERASE, S_SEEK, } p30_log_state_t; norace p30_log_state_t m_state = S_IDLE; storage_volume_t clientId = 0xff; void* clientBuf; storage_len_t clientLen; error_t clientResult; uint32_t firstBlock[NUM_VOLS]; // 0-15 for 2 MB uint32_t lastBlock[NUM_VOLS]; // 0-15 for 2 MB uint32_t nextFreeRecord[NUM_VOLS]; // 0-X depending on data size storage_cookie_t readCookieOffset[NUM_VOLS]; // this is a raw offset bool gbOverwriteOccured = FALSE; /* This shuffles all the blocks when we run out of space. We have to * do it in a special order so crash recovery is possible. We also * have to write special bytes so we can rewrite to areas without * doing a complete erase. */ void shuffleBlocks(storage_volume_t block) { page_meta_t pageMeta; uint32_t pageCounter; // 1. set the last block to USED, if it's already USED or START, then no effect pageMeta.header = PAGE_USED; call Flash.write(L_RAW_OFFSET(block, lastBlock[block], 0), (uint8_t*) &pageMeta, sizeof(page_meta_t)); // 2. if lastBlock + 1 is free, then set it as last block and the first record is free pageCounter = (lastBlock[block] + 1) % L_PARTITIONS(block); call Flash.read(L_RAW_OFFSET(block, pageCounter, 0), (uint8_t*) &pageMeta, sizeof(page_meta_t)); if(pageMeta.header == PAGE_AVAILABLE) { nextFreeRecord[block] = 1; lastBlock[block] = pageCounter; } else { call Flash.erase(L_RAW_OFFSET(block, firstBlock[block], 0)); pageCounter = (firstBlock[block] + 1) % L_PARTITIONS(block); pageMeta.header = PAGE_START; call Flash.write(L_RAW_OFFSET(block, pageCounter, 0), (uint8_t*) &pageMeta, sizeof(page_meta_t)); nextFreeRecord[block] = 1; lastBlock[block] = firstBlock[block]; firstBlock[block] = pageCounter; gbOverwriteOccured = TRUE; } } /* * Converts a cookie to a page/record/offset tuple */ void cookieToTuple(uint32_t cookie, storage_volume_t block, uint32_t *page, uint32_t *record, uint32_t *offset) { uint32_t mypage; uint32_t myrecord; uint32_t myoffset; mypage = (cookie - L_BASE_BLOCK(block)) / P30_BLOCK_SIZE; cookie = (cookie - L_BASE_BLOCK(block)) % P30_BLOCK_SIZE; myrecord = cookie / L_FULL_RECORD_SIZE; myoffset = (cookie % L_FULL_RECORD_SIZE) - sizeof(record_meta_t); *page = mypage; *record = myrecord; *offset = myoffset; } /* * Ideally, Logstorage would require a mount too, but it doesn't so * it's a total hack. Before any operation, we have to check if a * mount occurred. Mount initializes the your logblock. */ uint8_t mountBits[NUM_VOLS]; void myMount(storage_volume_t block) { page_meta_t pageMeta; record_meta_t recordMeta; uint32_t pageCounter; uint32_t recordCounter; uint32_t freePages = 0; if(mountBits[block] != 0) return; // scan all 128k pages for page meta // annoying corner case of all free pages, write the first page as START for(pageCounter = 0; pageCounter < L_PARTITIONS(block); pageCounter++) { call Flash.read(L_RAW_OFFSET(block, pageCounter, 0), (uint8_t*)&pageMeta, sizeof(page_meta_t)); if(pageMeta.header == PAGE_AVAILABLE) freePages++; } if(freePages == L_PARTITIONS(block)) { pageMeta.header = PAGE_START; call Flash.write(L_RAW_OFFSET(block, 0, 0), (uint8_t*) &pageMeta, sizeof(page_meta_t)); } // if we find a START page, then we are done for(pageCounter = 0; pageCounter < L_PARTITIONS(block); pageCounter++) { call Flash.read(L_RAW_OFFSET(block, pageCounter, 0), (uint8_t*)&pageMeta, sizeof(page_meta_t)); if(pageMeta.header == PAGE_START) { firstBlock[block] = pageCounter; break; } } // if we didn't find a START page, first page is right after AVAILABLE if(pageCounter == L_PARTITIONS(block)) { for(pageCounter = 0; pageCounter < L_PARTITIONS(block); pageCounter++) { call Flash.read(L_RAW_OFFSET(block, pageCounter, 0), (uint8_t*)&pageMeta, sizeof(page_meta_t)); if(pageMeta.header == PAGE_AVAILABLE) { pageCounter = (pageCounter + 1) % L_PARTITIONS(block); firstBlock[block] = pageCounter; // mark that block as a START block pageMeta.header = PAGE_START; call Flash.write(L_RAW_OFFSET(block, pageCounter, 0), (uint8_t*) &pageMeta, sizeof(page_meta_t)); break; } } } // now we scan for next free record location pageCounter = firstBlock[block]; for(recordCounter = 1; recordCounter < L_MAX_RECORDS_PER_BLOCK; recordCounter++) { call Flash.read(L_RAW_OFFSET(block, pageCounter, recordCounter), (uint8_t*) &recordMeta, sizeof(record_meta_t)); if(recordMeta.status == RECORD_EMPTY) { nextFreeRecord[block] = recordCounter; lastBlock[block] = pageCounter; break; } } // Didn't find a free record in the START block, search the first FREE block if(recordCounter == L_MAX_RECORDS_PER_BLOCK) { for(pageCounter = 0; pageCounter < L_PARTITIONS(block); pageCounter++) { call Flash.read(L_RAW_OFFSET(block, pageCounter, 0), (uint8_t*)&pageMeta, sizeof(page_meta_t)); if(pageMeta.header == PAGE_AVAILABLE) { for(recordCounter = 1; recordCounter < L_MAX_RECORDS_PER_BLOCK; recordCounter++) { call Flash.read(L_RAW_OFFSET(block, pageCounter, recordCounter), (uint8_t*) &recordMeta, sizeof(record_meta_t)); if(recordMeta.status == RECORD_EMPTY) { lastBlock[block] = pageCounter; nextFreeRecord[block] = recordCounter; goto mount_complete; } } } } // if here, you didn't find the last block, it must be right before the START block // special case the wrap around if(firstBlock[block] == 0) lastBlock[block] = L_PARTITIONS(block) - 1; else lastBlock[block] = firstBlock[block] - 1; // that last block must be full, so shuffle it shuffleBlocks(block); } mount_complete: readCookieOffset[block] = SEEK_BEGINNING; mountBits[block] = 1; } task void signalDoneTask() { switch(m_state) { case S_APPEND: m_state = S_IDLE; signal Write.appendDone[clientId](clientBuf, clientLen, gbOverwriteOccured, clientResult); gbOverwriteOccured = FALSE; break; case S_SYNC: m_state = S_IDLE; signal Write.syncDone[clientId](SUCCESS); break; case S_ERASE: m_state = S_IDLE; signal Write.eraseDone[clientId](clientResult); break; case S_READ: m_state = S_IDLE; signal Read.readDone[clientId](clientBuf, clientLen, clientResult); break; case S_SEEK: m_state = S_IDLE; signal Read.seekDone[clientId](SUCCESS); break; default: break; } } /* * Invariant should be that everytime after an append completes, * nextFreeRecord should point to a valid free record slot. Uses * nextFreeRecord to append. */ command error_t Write.append[ storage_volume_t block ](void* buf, storage_len_t len) { record_meta_t recordMeta; myMount(block); // error check if(len > L_RECORD_DATA_SIZE) return EINVAL; // if non circular log, fail if((!call Circular.get[block]()) && (lastBlock[block] == (L_PARTITIONS(block) - 1)) && (nextFreeRecord[block] == (L_MAX_RECORDS_PER_BLOCK - 1))) return FAIL; m_state = S_APPEND; clientId = block; clientBuf = buf; clientLen = len; // if you try to log 0, just immediately succeed, this really shouldn't happen if(len == 0) { clientResult = SUCCESS; post signalDoneTask(); return SUCCESS; } // if readCookie was on SEEK_EOL, adjust it back to here if(readCookieOffset[block] == SEEK_EOL) readCookieOffset[block] = L_RAW_OFFSET(block, lastBlock[block], nextFreeRecord[block]) + sizeof(record_meta_t); // use next free record, write the INVALID, write the data, write the VALID recordMeta.status = RECORD_INVALID; recordMeta.length = len; call Flash.write(L_RAW_OFFSET(block, lastBlock[block], nextFreeRecord[block]), (uint8_t*) &recordMeta, sizeof(record_meta_t)); call Flash.write(L_RAW_OFFSET(block, lastBlock[block], nextFreeRecord[block]) + sizeof(record_meta_t), (uint8_t*) buf, len); recordMeta.status = RECORD_VALID; call Flash.write(L_RAW_OFFSET(block, lastBlock[block], nextFreeRecord[block]), (uint8_t*) &recordMeta, sizeof(record_meta_t)); nextFreeRecord[block]++; // see if you need to adjust blocks or shuffle if(nextFreeRecord[block] == L_MAX_RECORDS_PER_BLOCK) shuffleBlocks(block); clientResult = SUCCESS; post signalDoneTask(); return SUCCESS; } /* * We use nextFreeRecord to get the cookie */ command storage_cookie_t Write.currentOffset[ storage_volume_t block ]() { myMount(block); return L_RAW_OFFSET(block, lastBlock[block], nextFreeRecord[block]) + sizeof(record_meta_t); } /* * First we erase all the log data blocks so that they can be * reused. Then we zero the cookies and then write them to our * partitions like the append operation. If we crash in the middle, * you may have to erase again. However, if an erase does fail, at * least all your data will still be there, so that you can try * again. */ command error_t Write.erase[storage_volume_t block]() { uint32_t i; for(i = 0; i < L_PARTITIONS(block); i++) { call Flash.erase(L_BASE_BLOCK(block) + (i * P30_BLOCK_SIZE)); } mountBits[block] = 0; myMount(block); // ... starting block implicitly written by mount m_state = S_ERASE; clientId = block; clientResult = SUCCESS; post signalDoneTask(); return SUCCESS; } /* * Sync does nothing really because unlike the AT45DB, Intel P30 * writes directly through. */ command error_t Write.sync[storage_volume_t block]() { myMount(block); m_state = S_SYNC; clientId = block; clientResult = SUCCESS; post signalDoneTask(); return SUCCESS; } /* * Sanity check the read cookie and adjust for any other special * cookies. Because you can seek to the byte, must it is saved in * flash as records, you have to do a lot of tricky seeking, but * it's done here. Also has to handle any pages that are spilled * over. */ command error_t Read.read[ storage_volume_t block ](void* buf, storage_len_t len) { record_meta_t recordMeta; uint32_t recordCounter; uint32_t pageCounter; uint32_t offset; clientId = block; clientBuf = buf; clientResult = SUCCESS; myMount(block); m_state = S_READ; if(len == 0 || readCookieOffset[block] == SEEK_EOL) { clientResult = SUCCESS; clientLen = 0; post signalDoneTask(); return SUCCESS; } // adjust SEEK_BEGINNING to a real offset if(readCookieOffset[block] == SEEK_BEGINNING) { readCookieOffset[block] = L_RAW_OFFSET(block, firstBlock[block], 1) + sizeof(record_meta_t); } // convert the cookie to something useful cookieToTuple(readCookieOffset[block], block, &pageCounter, &recordCounter, &offset); // sanity check readCookie call Flash.read(L_RAW_OFFSET(block, pageCounter, recordCounter), (uint8_t*) &recordMeta, sizeof(record_meta_t)); if((recordMeta.status == RECORD_VALID) && (offset > len)) { readCookieOffset[block] = L_RAW_OFFSET(block, firstBlock[block], 0) + sizeof(record_meta_t); cookieToTuple(readCookieOffset[block], block, &pageCounter, &recordCounter, &offset); } clientLen = 0; // reset how much actually read and count up while(len != 0) { call Flash.read(L_RAW_OFFSET(block, pageCounter, recordCounter), (uint8_t*) &recordMeta, sizeof(record_meta_t)); if(recordMeta.status == RECORD_INVALID) { goto advance_counter; } if(recordMeta.status == RECORD_EMPTY) { readCookieOffset[block] = SEEK_EOL; post signalDoneTask(); return SUCCESS; } // read partial block and finish if(len < recordMeta.length + offset) { call Flash.read(L_RAW_OFFSET(block, pageCounter, recordCounter) + offset + sizeof(record_meta_t), buf, len); offset = len; buf = buf + len; len = 0; } else { call Flash.read(L_RAW_OFFSET(block, pageCounter, recordCounter) + offset + sizeof(record_meta_t), buf, recordMeta.length - offset); clientLen = clientLen + recordMeta.length - offset; len -= recordMeta.length - offset; buf = buf + recordMeta.length - offset; offset = 0; advance_counter: recordCounter++; if((recordCounter >= L_MAX_RECORDS_PER_BLOCK) && (pageCounter == lastBlock[block])) { readCookieOffset[block] = SEEK_EOL; post signalDoneTask(); return SUCCESS; } // need to adjust page possibly if spills // also need to check if reached end of log (lastBlock[block] or RECORD_AVAILABLE) if(recordCounter >= L_MAX_RECORDS_PER_BLOCK) { pageCounter = (pageCounter + 1) % L_PARTITIONS(block); recordCounter = 1; } } } readCookieOffset[block] = L_RAW_OFFSET(block, pageCounter, recordCounter) + sizeof(record_meta_t) + offset; post signalDoneTask(); return SUCCESS; } command storage_cookie_t Read.currentOffset[ storage_volume_t block ]() { myMount(block); return readCookieOffset[block]; } /* * Just set the cookie. If you seek into an invalid area, just set * it at SEEK_BEGINNING. */ command error_t Read.seek[ storage_volume_t block ](storage_cookie_t offset) { uint32_t page; uint32_t record; uint32_t recordOffset; record_meta_t recordMeta; myMount(block); clientId = block; clientResult = SUCCESS; m_state = S_SEEK; readCookieOffset[block] = offset; post signalDoneTask(); return SUCCESS; } /* * Go through all the pages, if it's a free page, count whatever is * available left. Add them all up. */ command storage_len_t Read.getSize[ storage_volume_t block ]() { storage_len_t len = 0; uint32_t i; uint32_t j; page_meta_t pageMeta; record_meta_t recordMeta; myMount(block); for(i = 0; i < L_PARTITIONS(block); i++) { call Flash.read(L_RAW_OFFSET(block, i, j), (uint8_t*) &pageMeta, sizeof(page_meta_t)); if(pageMeta.header != PAGE_AVAILABLE) { len = len + (sizeof(record_data_t) * L_MAX_RECORDS_PER_BLOCK); continue; } for(j = 1; j < L_MAX_RECORDS_PER_BLOCK; j++) { call Flash.read(L_RAW_OFFSET(block, i, j), (uint8_t*) &recordMeta, sizeof(record_meta_t)); if(recordMeta.status == RECORD_EMPTY) { len = len + ((L_MAX_RECORDS_PER_BLOCK - j) * sizeof(record_meta_t)); break; } } } return len; } default event void Read.readDone[ storage_volume_t block ](void* buf, storage_len_t len, error_t error) {} default event void Read.seekDone[ storage_volume_t block ](error_t error) {} default event void Write.appendDone[ storage_volume_t block ](void* buf, storage_len_t len, bool recordsLost, error_t error) {} default event void Write.eraseDone[ storage_volume_t block ](error_t error) {} default event void Write.syncDone[ storage_volume_t block ](error_t error) {} default command bool Circular.get[ uint8_t id ]() { return FALSE; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/p30/Storage_chip.h000066400000000000000000000035321207233610700222120ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:12 $ */ #ifndef __STORAGE_CHIP_H__ #define __STORAGE_CHIP_H__ typedef uint8_t storage_volume_t; typedef uint8_t storage_block_t; typedef uint8_t storage_log_t; typedef uint8_t storage_config_t; #endif tinyos-2.1.2+dfsg/tos/chips/pxa27x/pxa27x_registers.h000066400000000000000000003273511207233610700224310ustar00rootroot00000000000000// $Id: pxa27x_registers.h,v 1.5 2008-06-11 00:46:23 razvanm Exp $ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * * Authors: Phil Buonadonna * * Edits: Josh Herbach, Konrad Lorincz * Revised: 09/19/2005 */ #ifndef _PXA27X_REGISTER_H #define _PXA27X_REGISTER_H #define _PXAREG(_addr) (*((volatile uint32_t *)(_addr))) #define _PXAREG_OFFSET(_addr,_off) (_PXAREG((uint32_t)(_addr) + (uint32_t)(_off))) /******************************************************************************/ /* Memory Controller */ /******************************************************************************/ #define MDCNFG _PXAREG(0x48000000) /* SDRAM Configuration register 6-43 */ #define MDREFR _PXAREG(0x48000004) /* SDRAM Refresh Control register 6-53 */ #define MSC0 _PXAREG(0x48000008) /* Static Memory Control register 0 6-63 */ #define MSC1 _PXAREG(0x4800000C) /* Static Memory Control register 1 6-63 */ #define MSC2 _PXAREG(0x48000010) /* Static Memory Control register 2 6-63 */ #define MECR _PXAREG(0x48000014) /* Expansion Memory (PC Card/CompactFlash) Bus Configuration register 6-79 */ #define SXCNFG _PXAREG(0x4800001C) /* Synchronous Static Memory Configuration register 6-58 */ #define FLYCNFG _PXAREG(0x48000020) /* Fly-by DMA DVAL<1:0> polarities 5-39 */ #define MCMEM0 _PXAREG(0x48000028) /* PC Card Interface Common Memory Space Socket 0 Timing Configuration register 6-77 */ #define MCMEM1 _PXAREG(0x4800002C) /* PC Card Interface Common Memory Space Socket 1 Timing Configuration register 6-77 */ #define MCATT0 _PXAREG(0x48000030) /* PC Card Interface Attribute Space Socket 0 Timing Configuration register 6-77 */ #define MCATT1 _PXAREG(0x48000034) /* PC Card Interface Attribute Space Socket 1 Timing Configuration register 6-77 */ #define MCIO0 _PXAREG(0x48000038) /* PC Card Interface I/o Space Socket 0 Timing Configuration register 6-78 */ #define MCIO1 _PXAREG(0x4800003C) /* PC Card Interface I/o Space Socket 1 Timing Configuration register 6-78 */ #define MDMRS _PXAREG(0x48000040) /* SDRAM Mode Register Set Configuration register 6-49 */ #define BOOT_DEF _PXAREG(0x48000044) /* Boot Time Default Configuration register 6-75 */ #define ARB_CNTL _PXAREG(0x48000048) /* Arbiter Control register 29-2 */ #define BSCNTR0 _PXAREG(0x4800004C) /* System Memory Buffer Strength Control register 0 6-81 */ #define BSCNTR1 _PXAREG(0x48000050) /* System Memory Buffer Strength Control register 1 6-82 */ #define LCDBSCNTR _PXAREG(0x48000054) /* LCD Buffer Strength Control register 7-102 */ #define MDMRSLP _PXAREG(0x48000058) /* Special Low Power SDRAM Mode Register Set Configuration register 6-51 */ #define BSCNTR2 _PXAREG(0x4800005C) /* System Memory Buffer Strength Control register 2 6-83 */ #define BSCNTR3 _PXAREG(0x48000060) /* System Memory Buffer Strength Control register 3 6-84 */ #define SA1110 _PXAREG(0x48000064) /* SA-1110 Compatibility Mode for Static Memory register 6-70 */ /* MDCNFG Bit Defs */ #define MDCNFG_MDENX (1 << 31) #define MDCNFG_DCACX2 (1 << 30) #define MDCNFG_DSA1110_2 (1 << 28) #define MDCNFG_DADDR2 (1 << 26) #define MDCNFG_DTC2(_x) (((_x) & 0x3) << 24) #define MDCNFG_DNB2 (1 << 23) #define MDCNFG_DRAC2(_x) (((_x) & 0x3) << 21) #define MDCNFG_DCAC2(_x) (((_x) & 0x3) << 19) #define MDCNFG_DWID2 (1 << 18) #define MDCNFG_DE3 (1 << 17) #define MDCNFG_DE2 (1 << 16) #define MDCNFG_STACK1 (1 << 15) #define MDCNFG_DCACX0 (1 << 14) #define MDCNFG_STACK0 (1 << 13) #define MDCNFG_DSA1110_0 (1 << 12) #define MDCNFG_DADDR0 (1 << 10) #define MDCNFG_DTC0(_x) (((_x) & 0x3) << 8) #define MDCNFG_DNB0 (1 << 7) #define MDCNFG_DRAC0(_x) (((_x) & 0x3) << 5) #define MDCNFG_DCAC0(_x) (((_x) & 0x3) << 3) #define MDCNFG_DWID0 (1 << 2) #define MDCNFG_DE1 (1 << 1) #define MDCNFG_DE0 (1 << 0) #define MDCNFG_SETALWAYS ((1 << 27) | (1 << 11)) /* MDREFR Bit Defs */ #define MDREFR_ALTREFA (1 << 31) /* */ #define MDREFR_ALTREFB (1 << 30) /* */ #define MDREFR_K0DB4 (1 << 29) /* */ #define MDREFR_K2FREE (1 << 25) /* */ #define MDREFR_K1FREE (1 << 24) /* */ #define MDREFR_K0FREE (1 << 23) /* */ #define MDREFR_SLFRSH (1 << 22) /* */ #define MDREFR_APD (1 << 20) /* */ #define MDREFR_K2DB2 (1 << 19) /* */ #define MDREFR_K2RUN (1 << 18) /* */ #define MDREFR_K1DB2 (1 << 17) /* */ #define MDREFR_K1RUN (1 << 16) /* */ #define MDREFR_E1PIN (1 << 15) /* */ #define MDREFR_K0DB2 (1 << 14) /* */ #define MDREFR_K0RUN (1 << 13) /* */ #define MDREFR_DRI(_x) ((_x) & 0xfff) /* */ /* MSCx Bit Defs */ #define MSC_RBUFF135 (1 << 31) /* Return Data Buff vs. Streaming nCS 1,3 or 5 */ #define MSC_RRR135(_x) (((_x) & (0x7)) << 28) /* ROM/SRAM Recovery Time nCS 1,3 or 5 */ #define MSC_RDN135(_x) (((_x) & (0x7)) << 24) /* ROM Delay Next Access nCS 1,3 or 5 */ #define MSC_RDF135(_x) (((_x) & (0x7)) << 20) /* ROM Delay First Access nCS 1,3 or 5 */ #define MSC_RBW135 (1 << 19) /* ROM Bus Width nCS 1,3 or 5 */ #define MSC_RT135(_x) (((_x) & (0x7)) << 16) /* ROM Type nCS 1,3 or 5 */ #define MSC_RBUFF024 (1 << 15) /* Return Data Buff vs. Streaming nCS 0,2 or 4 */ #define MSC_RRR024(_x) (((_x) & (0x7)) << 12) /* ROM/SRAM Recover Time nCS 0,2 or 4 */ #define MSC_RDN024(_x) (((_x) & (0x7)) << 8) /* ROM Delay Next Access nCS 0,2 or 4 */ #define MSC_RDF024(_x) (((_x) & (0x7)) << 4) /* ROM Delay First Access nCS 0,2 or 4 */ #define MSC_RBW024 (1 << 3) /* ROM Bus Width nCS 0,2 or 4 */ #define MSC_RT024(_x) (((_x) & (0x7)) << 0) /* ROM Type nCS 0,2 or 4 */ /* SXCNFG Bit defs */ #define SXCNFG_SXEN0 (1) #define SXCNFG_SXEN1 (1<<1) #define SXCNFG_SXCL0(_x) (((_x) & 0x7) << 2) #define SXCNFG_SXTP0(_x) (((_x) & 0x3) << 12) #define SXCNFG_SXCLEXT0 (1<<15) /* ARB_CNTL Bit defs */ #define ARB_CNTL_DMA_SLV_PARK (1 << 31) #define ARB_CNTL_CI_PARK (1 << 30) #define ARB_CNTL_EX_MEM_PARK (1 << 29) #define ARB_CNTL_INT_MEM_PARK (1 << 28) #define ARB_CNTL_USB_PARK (1 << 27) #define ARB_CNTL_LCD_PARK (1 << 26) #define ARB_CNTL_DMA_PARK (1 << 25) #define ARB_CNTL_CORE_PARK (1 << 24) #define ARB_CNTL_LOCK_FLAG (1 << 23) #define ARB_CNTL_LCD_WT(_wt) (((_wt) & 0xF) << 8) #define ARB_CNTL_DMA_WT(_wt) (((_wt) & 0xF) << 4) #define ARB_CNTL_CORE_WT(_wt) (((_wt) & 0xF) << 0) /* SA1110 Bit defs */ #define SA1110_SXSTACK(_x) (((_x) & 0x3) << 12) /******************************************************************************/ /* LCD Controller */ /******************************************************************************/ #define LCCR0 _PXAREG(0x44000000) /* LCD Controller Control register 0 7-56 */ #define LCCR1 _PXAREG(0x44000004) /* LCD Controller Control register 1 7-64 */ #define LCCR2 _PXAREG(0x44000008) /* LCD Controller Control register 2 7-66 */ #define LCCR3 _PXAREG(0x4400000C) /* LCD Controller Control register 3 7-69 */ #define LCCR4 _PXAREG(0x44000010) /* LCD Controller Control register 4 7-74 */ #define LCCR5 _PXAREG(0x44000014) /* LCD Controller Control register 5 7-77 */ #define FBR0 _PXAREG(0x44000020) /* DMA Channel 0 Frame Branch register 7-101 */ #define FBR1 _PXAREG(0x44000024) /* DMA Channel 1 Frame Branch register 7-101 */ #define FBR2 _PXAREG(0x44000028) /* DMA Channel 2 Frame Branch register 7-101 */ #define FBR3 _PXAREG(0x4400002C) /* DMA Channel 3 Frame Branch register 7-101 */ #define FBR4 _PXAREG(0x44000030) /* DMA Channel 4 Frame Branch register 7-101 */ #define LCSR1 _PXAREG(0x44000034) /* LCD Controller Status register 1 7-109 */ #define LCSR0 _PXAREG(0x44000038) /* LCD Controller Status register 0 7-104 */ #define LIIDR _PXAREG(0x4400003C) /* LCD Controller Interrupt ID register 7-116 */ #define TRGBR _PXAREG(0x44000040) /* TMED RGB Seed register 7-97 */ #define TCR _PXAREG(0x44000044) /* TMED Control register 7-98 */ #define OVL1C1 _PXAREG(0x44000050) /* Overlay 1 Control register 1 7-90 */ #define OVL1C2 _PXAREG(0x44000060) /* Overlay 1 Control register 2 7-91 */ #define OVL2C1 _PXAREG(0x44000070) /* Overlay 2 Control register 1 7-92 */ #define OVL2C2 _PXAREG(0x44000080) /* Overlay 2 Control register 2 7-94 */ #define CCR _PXAREG(0x44000090) /* Cursor Control register 7-95 */ #define CMDCR _PXAREG(0x44000100) /* Command Control register 7-96 */ #define PRSR _PXAREG(0x44000104) /* Panel Read Status register 7-103 */ #define FBR5 _PXAREG(0x44000110) /* DMA Channel 5 Frame Branch register 7-101 */ #define FBR6 _PXAREG(0x44000114) /* DMA Channel 6 Frame Branch register 7-101 */ #define FDADR0 _PXAREG(0x44000200) /* DMA Channel 0 Frame Descriptor Address register 7-100 */ #define FSADR0 _PXAREG(0x44000204) /* DMA Channel 0 Frame Source Address register 7-117 */ #define FIDR0 _PXAREG(0x44000208) /* DMA Channel 0 Frame ID register 7-117 */ #define LDCMD0 _PXAREG(0x4400020C) /* LCD DMA Channel 0 Command register 7-118 */ #define FDADR1 _PXAREG(0x44000210) /* DMA Channel 1 Frame Descriptor Address register 7-100 */ #define FSADR1 _PXAREG(0x44000214) /* DMA Channel 1 Frame Source Address register 7-117 */ #define FIDR1 _PXAREG(0x44000218) /* DMA Channel 1 Frame ID register 7-117 */ #define LDCMD1 _PXAREG(0x4400021C) /* LCD DMA Channel 1 Command register 7-118 */ #define FDADR2 _PXAREG(0x44000220) /* DMA Channel 2 Frame Descriptor Address register 7-100 */ #define FSADR2 _PXAREG(0x44000224) /* DMA Channel 2 Frame Source Address register 7-117 */ #define FIDR2 _PXAREG(0x44000228) /* DMA Channel 2 Frame ID register 7-117 */ #define LDCMD2 _PXAREG(0x4400022C) /* LCD DMA Channel 2 Command register 7-118 */ #define FDADR3 _PXAREG(0x44000230) /* DMA Channel 3 Frame Descriptor Address register 7-100 */ #define FSADR3 _PXAREG(0x44000234) /* DMA Channel 3 Frame Source Address register 7-117 */ #define FIDR3 _PXAREG(0x44000238) /* DMA Channel 3 Frame ID register 7-117 */ #define LDCMD3 _PXAREG(0x4400023C) /* LCD DMA Channel 3 Command register 7-118 */ #define FDADR4 _PXAREG(0x44000240) /* DMA Channel 4 Frame Descriptor Address register 7-100 */ #define FSADR4 _PXAREG(0x44000244) /* DMA Channel 4 Frame Source Address register 7-117 */ #define FIDR4 _PXAREG(0x44000248) /* DMA Channel 4 Frame ID register 7-117 */ #define LDCMD4 _PXAREG(0x4400024C) /* LCD DMA Channel 4 Command register 7-118 */ #define FDADR5 _PXAREG(0x44000250) /* DMA Channel 5 Frame Descriptor Address register 7-100 */ #define FSADR5 _PXAREG(0x44000254) /* DMA Channel 5 Frame Source Address register 7-117 */ #define FIDR5 _PXAREG(0x44000258) /* DMA Channel 5 Frame ID register 7-117 */ #define LDCMD5 _PXAREG(0x4400025C) /* LCD DMA Channel 5 Command register 7-118 */ #define FDADR6 _PXAREG(0x44000260) /* DMA Channel 6 Frame Descriptor Address register 7-100 */ #define FSADR6 _PXAREG(0x44000264) /* DMA Channel 6 Frame Source Address register 7-117 */ #define FIDR6 _PXAREG(0x44000268) /* DMA Channel 6 Frame ID register 7-117 */ #define LDCMD6 _PXAREG(0x4400026C) /* LCD DMA Channel 6 Command register 7-118 */ #define LCDBSCNTR _PXAREG(0x48000054) /* LCD Buffer Strength Control register 7-102 */ /******************************************************************************/ /* USB Host Controller */ /******************************************************************************/ #define UHCREV _PXAREG(0x4C000000) /* UHC HCI Spec Revision register 20-10 */ #define UHCHCON _PXAREG(0x4C000004) /* UHC Host Control register 20-10 */ #define UHCCOMS _PXAREG(0x4C000008) /* UHC Command Status register 20-14 */ #define UHCINTS _PXAREG(0x4C00000C) /* UHC Interrupt Status register 20-16 */ #define UHCINTE _PXAREG(0x4C000010) /* UHC Interrupt Enable register 20-18 */ #define UHCINTD _PXAREG(0x4C000014) /* UHC Interrupt Disable register 20-20 */ #define UHCHCCA _PXAREG(0x4C000018) /* UHC Host Controller Communication Area register 20-21 */ #define UHCPCED _PXAREG(0x4C00001C) /* UHC Period Current Endpoint Descriptor register 20-21 */ #define UHCCHED _PXAREG(0x4C000020) /* UHC Control Head Endpoint Descriptor register 20-22 */ #define UHCCCED _PXAREG(0x4C000024) /* UHC Control Current Endpoint Descriptor register 20-22 */ #define UHCBHED _PXAREG(0x4C000028) /* UHC Bulk Head Endpoint Descriptor register 20-23 */ #define UHCBCED _PXAREG(0x4C00002C) /* UHC Bulk Current Endpoint Descriptor register 20-24 */ #define UHCDHEAD _PXAREG(0x4C000030) /* UHC Done Head register 20-25 */ #define UHCFMI _PXAREG(0x4C000034) /* UHC Frame Interval register 20-26 */ #define UHCFMR _PXAREG(0x4C000038) /* UHC Frame Remaining register 20-27 */ #define UHCFMN _PXAREG(0x4C00003C) /* UHC Frame Number register 20-28 */ #define UHCPERS _PXAREG(0x4C000040) /* UHC Periodic Start register 20-29 */ #define UHCLST _PXAREG(0x4C000044) /* UHC Low-Speed Threshold register 20-30 */ #define UHCRHDA _PXAREG(0x4C000048) /* UHC Root Hub Descriptor A register 20-31 */ #define UHCRHDB _PXAREG(0x4C00004C) /* UHC Root Hub Descriptor B register 20-33 */ #define UHCRHS _PXAREG(0x4C000050) /* UHC Root Hub Status register 20-34 */ #define UHCRHPS1 _PXAREG(0x4C000054) /* UHC Root Hub Port 1 Status register 20-35 */ #define UHCRHPS2 _PXAREG(0x4C000058) /* UHC Root Hub Port 2 Status register 20-35 */ #define UHCRHPS3 _PXAREG(0x4C00005C) /* UHC Root Hub Port 3 Status register 20-35 */ #define UHCSTAT _PXAREG(0x4C000060) /* UHC Status register 20-39 */ #define UHCHR _PXAREG(0x4C000064) /* UHC Reset register 20-41 */ #define UHCHIE _PXAREG(0x4C000068) /* UHC Interrupt Enable register 20-44 */ #define UHCHIT _PXAREG(0x4C00006C) /* UHC Interrupt Test register 20-45 */ /******************************************************************************/ /* Quick Capture Interface */ /******************************************************************************/ #define CICR0 _PXAREG(0x50000000) /* Quick Capture Interface Control register 0 27-24 */ #define CICR1 _PXAREG(0x50000004) /* Quick Capture Interface Control register 1 27-28 */ #define CICR2 _PXAREG(0x50000008) /* Quick Capture Interface Control register 2 27-32 */ #define CICR3 _PXAREG(0x5000000C) /* Quick Capture Interface Control register 3 27-33 */ #define CICR4 _PXAREG(0x50000010) /* Quick Capture Interface Control register 4 27-34 */ #define CISR _PXAREG(0x50000014) /* Quick Capture Interface Status register 27-37 */ #define CIFR _PXAREG(0x50000018) /* Quick Capture Interface FIFO Control register 27-40 */ #define CITOR _PXAREG(0x5000001C) /* Quick Capture Interface Time-Out register 27-37 */ #define CIBR0 _PXAREG(0x50000028) /* Quick Capture Interface Receive Buffer register 0 (Channel 0) 27-42 */ #define CIBR1 _PXAREG(0x50000030) /* Quick Capture Interface Receive Buffer register 1 (Channel 1) 27-42 */ #define CIBR2 _PXAREG(0x50000038) /* Quick Capture Interface Receive Buffer register 2 (Channel 2) 27-42 */ /* Quick Capture Interface - Control Register 0 */ #define CICR0_DMA_EN (1 << 31) /* DMA Request Enable */ #define CICR0_EN (1 << 28) /* Quick Capture Interface Enable (and Quick Disable) */ #define CICR0_TOM (1 << 9) /* Time-Out Interrupt Mask */ #define CICR0_RDAVM (1 << 8) /* Receive-Data-Available Interrupt Mask */ #define CICR0_FEM (1 << 7) /* FIFO-Empty Interrupt Mask */ #define CICR0_EOLM (1 << 6) /* End-of-Line Interrupt Mask */ #define CICR0_SOFM (1 << 2) /* Start-of-Frame Interrupt Mask */ #define CICR0_EOFM (1 << 1) /* End-of-Frame Interrupt Mask */ #define CICR0_FOM (1 << 0) /* FIFO Overrun Interrupt Mask */ /* Quick Capture Interface - Control Register 1 */ #define CICR1_TBIT (1 << 31) /* Transparency Bit */ #define CICR1_RGBT_CONV(_data,_x) ((_data & ~(0x7 << 29)) | (_x << 29)) /* RGBT Conversion */ #define CICR1_PPL(_data,_x) ((_data & ~(0x7ff << 15)) | (_x << 15)) /* Pixels per Line */ #define CICR1_RGB_CONV(_data,_x) ((_data & ~(0x7 << 12)) | (_x << 12)) /* RGB Bits per Pixel Conversion */ #define CICR1_RGB_F (1 << 11) /* RGB Format */ #define CICR1_YCBCR_F (1 << 10) /* YCbCr Format */ #define CICR1_RGB_BPP(_data,_x) ((_data & ~(0x7 << 7)) | (_x << 7)) /* RGB Bits per Pixel */ #define CICR1_RAW_BPP(_data,_x) ((_data & ~(0x3 << 5)) | (_x << 5)) /* Raw Bits per Pixel */ #define CICR1_COLOR_SP(_data,_x) ((_data & ~(0x3 << 3)) | (_x << 3)) /* Color Space */ #define CICR1_DW(_data,_x) ((_data & ~(0x7 << 0)) | (_x << 0)) /* Data Width */ /* Quick Capture Interface - Control Register 3 */ #define CICR3_LPF(_data,_x) ((_data & ~(0x7ff << 0)) | (_x << 0)) /* Lines per Frame */ /* Quick Capture Interface - Control Register 4 */ #define CICR4_PCLK_EN (1 << 23) /* Pixel Clock Enable */ #define CICR4_HSP (1 << 21) /* Horizontal Sync Polarity */ #define CICR4_VSP (1 << 20) /* Vertical Sync Polarity */ #define CICR4_MCLK_EN (1 << 19) /* MCLK Enable */ #define CICR4_DIV(_data,_x) ((_data & ~(0xff << 0)) | (_x << 0)) /* Clock Divisor */ /* Quick Capture Interface - Status Register */ #define CISR_FTO (1 << 15) /* FIFO Time-Out */ #define CISR_RDAV_2 (1 << 14) /* Channel 2 Receive Data Available */ #define CISR_RDAV_1 (1 << 13) /* Channel 1 Receive Data Available */ #define CISR_RDAV_0 (1 << 12) /* Channel 0 Receive Data Available */ #define CISR_FEMPTY_2 (1 << 11) /* Channel 2 FIFO Empty */ #define CISR_FEMPTY_1 (1 << 10) /* Channel 1 FIFO Empty */ #define CISR_FEMPTY_0 (1 << 9) /* Channel 0 FIFO Empty */ #define CISR_EOL (1 << 8) /* End-of-Line */ #define CISR_PAR_ERR (1 << 7) /* Parity Error */ #define CISR_CQD (1 << 6) /* Quick Campture Interface Quick Dissable */ #define CISR_CDD (1 << 5) /* Quick Campture Interface Quick Dissable Done */ #define CISR_SOF (1 << 4) /* Start-of-Frame */ #define CISR_EOF (1 << 3) /* End-of-Frame */ #define CISR_IFO_2 (1 << 2) /* FIFO Overrun for Channel 2 */ #define CISR_IFO_1 (1 << 1) /* FIFO Overrun for Channel 1 */ #define CISR_IFO_0 (1 << 0) /* FIFO Overrun for Channel 0 */ /* Quick Capture Interface - FIFO Control Register */ #define CIFR_FLVL0(_data,_x) ((_data & ~(0xff << 8)) | (_x << 8)) /* FIFO 0 Level: value from 0-128 indicates the number of bytes */ #define CIFR_THL_0(_data,_x) ((_data & ~(0x3 << 4)) | (_x << 4)) /* Threshold Level for Channel 0 FIFO */ #define CIFR_RESETF (1 << 3) /* Reset input FIFOs */ /******************************************************************************/ /* DMA Controller */ /******************************************************************************/ #define DCSR0 _PXAREG(0x40000000) /* DMA Control/Status register for Channel 0 5-41 */ #define DCSR1 _PXAREG(0x40000004) /* DMA Control/Status register for Channel 1 5-41 */ #define DCSR2 _PXAREG(0x40000008) /* DMA Control/Status register for Channel 2 5-41 */ #define DCSR3 _PXAREG(0x4000000C) /* DMA Control/Status register for Channel 3 5-41 */ #define DCSR4 _PXAREG(0x40000010) /* DMA Control/Status register for Channel 4 5-41 */ #define DCSR5 _PXAREG(0x40000014) /* DMA Control/Status register for Channel 5 5-41 */ #define DCSR6 _PXAREG(0x40000018) /* DMA Control/Status register for Channel 6 5-41 */ #define DCSR7 _PXAREG(0x4000001C) /* DMA Control/Status register for Channel 7 5-41 */ #define DCSR8 _PXAREG(0x40000020) /* DMA Control/Status register for Channel 8 5-41 */ #define DCSR9 _PXAREG(0x40000024) /* DMA Control/Status register for Channel 9 5-41 */ #define DCSR10 _PXAREG(0x40000028) /* DMA Control/Status register for Channel 10 5-41 */ #define DCSR11 _PXAREG(0x4000002C) /* DMA Control/Status register for Channel 11 5-41 */ #define DCSR12 _PXAREG(0x40000030) /* DMA Control/Status register for Channel 12 5-41 */ #define DCSR13 _PXAREG(0x40000034) /* DMA Control/Status register for Channel 13 5-41 */ #define DCSR14 _PXAREG(0x40000038) /* DMA Control/Status register for Channel 14 5-41 */ #define DCSR15 _PXAREG(0x4000003C) /* DMA Control/Status register for Channel 15 5-41 */ #define DCSR16 _PXAREG(0x40000040) /* DMA Control/Status register for Channel 16 5-41 */ #define DCSR17 _PXAREG(0x40000044) /* DMA Control/Status register for Channel 17 5-41 */ #define DCSR18 _PXAREG(0x40000048) /* DMA Control/Status register for Channel 18 5-41 */ #define DCSR19 _PXAREG(0x4000004C) /* DMA Control/Status register for Channel 19 5-41 */ #define DCSR20 _PXAREG(0x40000050) /* DMA Control/Status register for Channel 20 5-41 */ #define DCSR21 _PXAREG(0x40000054) /* DMA Control/Status register for Channel 21 5-41 */ #define DCSR22 _PXAREG(0x40000058) /* DMA Control/Status register for Channel 22 5-41 */ #define DCSR23 _PXAREG(0x4000005C) /* DMA Control/Status register for Channel 23 5-41 */ #define DCSR24 _PXAREG(0x40000060) /* DMA Control/Status register for Channel 24 5-41 */ #define DCSR25 _PXAREG(0x40000064) /* DMA Control/Status register for Channel 25 5-41 */ #define DCSR26 _PXAREG(0x40000068) /* DMA Control/Status register for Channel 26 5-41 */ #define DCSR27 _PXAREG(0x4000006C) /* DMA Control/Status register for Channel 27 5-41 */ #define DCSR28 _PXAREG(0x40000070) /* DMA Control/Status register for Channel 28 5-41 */ #define DCSR29 _PXAREG(0x40000074) /* DMA Control/Status register for Channel 29 5-41 */ #define DCSR30 _PXAREG(0x40000078) /* DMA Control/Status register for Channel 30 5-41 */ #define DCSR31 _PXAREG(0x4000007C) /* DMA Control/Status register for Channel 31 5-41 */ #define DALGN _PXAREG(0x400000A0) /* DMA Alignment register 5-49 */ #define DPCSR _PXAREG(0x400000A4) /* DMA Programmed I/O Control Status register 5-51 */ #define DRQSR0 _PXAREG(0x400000E0) /* DMA DREQ<0> Status register 5-40 */ #define DRQSR1 _PXAREG(0x400000E4) /* DMA DREQ<1> Status register 5-40 */ #define DRQSR2 _PXAREG(0x400000E8) /* DMA DREQ<2> Status register 5-40 */ #define DINT _PXAREG(0x400000F0) /* DMA Interrupt register 5-48 */ #define DRCMR0 _PXAREG(0x40000100) /* Request to Channel Map register for DREQ<0> (companion chip request 0) 5-31 */ #define DRCMR1 _PXAREG(0x40000104) /* Request to Channel Map register for DREQ<1> (companion chip request 1) 5-31 */ #define DRCMR2 _PXAREG(0x40000108) /* Request to Channel Map register for I2S receive request 5-31 */ #define DRCMR3 _PXAREG(0x4000010C) /* Request to Channel Map register for I2S transmit request 5-31 */ #define DRCMR4 _PXAREG(0x40000110) /* Request to Channel Map register for BTUART receive request 5-31 */ #define DRCMR5 _PXAREG(0x40000114) /* Request to Channel Map register for BTUART transmit request. 5-31 */ #define DRCMR6 _PXAREG(0x40000118) /* Request to Channel Map register for FFUART receive request 5-31 */ #define DRCMR7 _PXAREG(0x4000011C) /* Request to Channel Map register for FFUART transmit request 5-31 */ #define DRCMR8 _PXAREG(0x40000120) /* Request to Channel Map register for AC 97 microphone request 5-31 */ #define DRCMR9 _PXAREG(0x40000124) /* Request to Channel Map register for AC 97 modem receive request 5-31 */ #define DRCMR10 _PXAREG(0x40000128) /* Request to Channel Map register for AC 97 modem transmit request 5-31 */ #define DRCMR11 _PXAREG(0x4000012C) /* Request to Channel Map register for AC 97 audio receive request 5-31 */ #define DRCMR12 _PXAREG(0x40000130) /* Request to Channel Map register for AC 97 audio transmit request 5-31 */ #define DRCMR13 _PXAREG(0x40000134) /* Request to Channel Map register for SSP1 receive request 5-31 */ #define DRCMR14 _PXAREG(0x40000138) /* Request to Channel Map register for SSP1 transmit request 5-31 */ #define DRCMR15 _PXAREG(0x4000013C) /* Request to Channel Map register for SSP2 receive request 5-31 */ #define DRCMR16 _PXAREG(0x40000140) /* Request to Channel Map register for SSP2 transmit request 5-31 */ #define DRCMR17 _PXAREG(0x40000144) /* Request to Channel Map register for ICP receive request 5-31 */ #define DRCMR18 _PXAREG(0x40000148) /* Request to Channel Map register for ICP transmit request 5-31 */ #define DRCMR19 _PXAREG(0x4000014C) /* Request to Channel Map register for STUART receive request 5-31 */ #define DRCMR20 _PXAREG(0x40000150) /* Request to Channel Map register for STUART transmit request 5-31 */ #define DRCMR21 _PXAREG(0x40000154) /* Request to Channel Map register for MMC/SDIO receive request 5-31 */ #define DRCMR22 _PXAREG(0x40000158) /* Request to Channel Map register for MMC/SDIO transmit request 5-31 */ #define DRCMR24 _PXAREG(0x40000160) /* Request to Channel Map register for USB endpoint 0 request 5-31 */ #define DRCMR25 _PXAREG(0x40000164) /* Request to Channel Map register for USB endpoint A request 5-31 */ #define DRCMR26 _PXAREG(0x40000168) /* Request to Channel Map register for USB endpoint B request 5-31 */ #define DRCMR27 _PXAREG(0x4000016C) /* Request to Channel Map register for USB endpoint C request 5-31 */ #define DRCMR28 _PXAREG(0x40000170) /* Request to Channel Map register for USB endpoint D request 5-31 */ #define DRCMR29 _PXAREG(0x40000174) /* Request to Channel Map register for USB endpoint E request 5-31 */ #define DRCMR30 _PXAREG(0x40000178) /* Request to Channel Map register for USB endpoint F request 5-31 */ #define DRCMR31 _PXAREG(0x4000017C) /* Request to Channel Map register for USB endpoint G request 5-31 */ #define DRCMR32 _PXAREG(0x40000180) /* Request to Channel Map register for USB endpoint H request 5-31 */ #define DRCMR33 _PXAREG(0x40000184) /* Request to Channel Map register for USB endpoint I request 5-31 */ #define DRCMR34 _PXAREG(0x40000188) /* Request to Channel Map register for USB endpoint J request 5-31 */ #define DRCMR35 _PXAREG(0x4000018C) /* Request to Channel Map register for USB endpoint K request 5-31 */ #define DRCMR36 _PXAREG(0x40000190) /* Request to Channel Map register for USB endpoint L request 5-31 */ #define DRCMR37 _PXAREG(0x40000194) /* Request to Channel Map register for USB endpoint M request 5-31 */ #define DRCMR38 _PXAREG(0x40000198) /* Request to Channel Map register for USB endpoint N request 5-31 */ #define DRCMR39 _PXAREG(0x4000019C) /* Request to Channel Map register for USB endpoint P request 5-31 */ #define DRCMR40 _PXAREG(0x400001A0) /* Request to Channel Map register for USB endpoint Q request 5-31 */ #define DRCMR41 _PXAREG(0x400001A4) /* Request to Channel Map register for USB endpoint R request 5-31 */ #define DRCMR42 _PXAREG(0x400001A8) /* Request to Channel Map register for USB endpoint S request 5-31 */ #define DRCMR43 _PXAREG(0x400001AC) /* Request to Channel Map register for USB endpoint T request 5-31 */ #define DRCMR44 _PXAREG(0x400001B0) /* Request to Channel Map register for USB endpoint U request 5-31 */ #define DRCMR45 _PXAREG(0x400001B4) /* Request to Channel Map register for USB endpoint V request 5-31 */ #define DRCMR46 _PXAREG(0x400001B8) /* Request to Channel Map register for USB endpoint W request 5-31 */ #define DRCMR47 _PXAREG(0x400001BC) /* Request to Channel Map register for USB endpoint X request 5-31 */ #define DRCMR48 _PXAREG(0x400001C0) /* Request to Channel Map register for MSL receive request 1 5-31 */ #define DRCMR49 _PXAREG(0x400001C4) /* Request to Channel Map register for MSL transmit request 1 5-31 */ #define DRCMR50 _PXAREG(0x400001C8) /* Request to Channel Map register for MSL receive request 2 5-31 */ #define DRCMR51 _PXAREG(0x400001CC) /* Request to Channel Map register for MSL transmit request 2 5-31 */ #define DRCMR52 _PXAREG(0x400001D0) /* Request to Channel Map register for MSL receive request 3 5-31 */ #define DRCMR53 _PXAREG(0x400001D4) /* Request to Channel Map register for MSL transmit request 3 5-31 */ #define DRCMR54 _PXAREG(0x400001D8) /* Request to Channel Map register for MSL receive request 4 5-31 */ #define DRCMR55 _PXAREG(0x400001DC) /* Request to Channel Map register for MSL transmit request 4 5-31 */ #define DRCMR56 _PXAREG(0x400001E0) /* Request to Channel Map register for MSL receive request 5 5-31 */ #define DRCMR57 _PXAREG(0x400001E4) /* Request to Channel Map register for MSL transmit request 5 5-31 */ #define DRCMR58 _PXAREG(0x400001E8) /* Request to Channel Map register for MSL receive request 6 5-31 */ #define DRCMR59 _PXAREG(0x400001EC) /* Request to Channel Map register for MSL transmit request 6 5-31 */ #define DRCMR60 _PXAREG(0x400001F0) /* Request to Channel Map register for MSL receive request 7 5-31 */ #define DRCMR61 _PXAREG(0x400001F4) /* Request to Channel Map register for MSL transmit request 7 5-31 */ #define DRCMR62 _PXAREG(0x400001F8) /* Request to Channel Map register for USIM receive request 5-31 */ #define DRCMR63 _PXAREG(0x400001FC) /* Request to Channel Map register for USIM transmit request 5-31 */ #define DDADR0 _PXAREG(0x40000200) /* DMA Descriptor Address register for Channel 0 5-32 */ #define DSADR0 _PXAREG(0x40000204) /* DMA Source Address register for Channel 0 5-33 */ #define DTADR0 _PXAREG(0x40000208) /* DMA Target Address register for Channel 0 5-34 */ #define DCMD0 _PXAREG(0x4000020C) /* DMA Command Address register for Channel 0 5-35 */ #define DDADR1 _PXAREG(0x40000210) /* DMA Descriptor Address register for Channel 1 5-32 */ #define DSADR1 _PXAREG(0x40000214) /* DMA Source Address register for Channel 1 5-33 */ #define DTADR1 _PXAREG(0x40000218) /* DMA Target Address register for Channel 1 5-34 */ #define DCMD1 _PXAREG(0x4000021C) /* DMA Command Address register for Channel 1 5-35 */ #define DDADR2 _PXAREG(0x40000220) /* DMA Descriptor Address register for Channel 2 5-32 */ #define DSADR2 _PXAREG(0x40000224) /* DMA Source Address register for Channel 2 5-33 */ #define DTADR2 _PXAREG(0x40000228) /* DMA Target Address register for Channel 2 5-34 */ #define DCMD2 _PXAREG(0x4000022C) /* DMA Command Address register for Channel 2 5-35 */ #define DDADR3 _PXAREG(0x40000230) /* DMA Descriptor Address register for Channel 3 5-32 */ #define DSADR3 _PXAREG(0x40000234) /* DMA Source Address register for Channel 3 5-33 */ #define DTADR3 _PXAREG(0x40000238) /* DMA Target Address register for Channel 3 5-34 */ #define DCMD3 _PXAREG(0x4000023C) /* DMA Command Address register for Channel 3 5-35 */ #define DDADR4 _PXAREG(0x40000240) /* DMA Descriptor Address register for Channel 4 5-32 */ #define DSADR4 _PXAREG(0x40000244) /* DMA Source Address register for Channel 4 5-33 */ #define DTADR4 _PXAREG(0x40000248) /* DMA Target Address register for Channel 4 5-34 */ #define DCMD4 _PXAREG(0x4000024C) /* DMA Command Address register for Channel 4 5-35 */ #define DDADR5 _PXAREG(0x40000250) /* DMA Descriptor Address register for Channel 5 5-32 */ #define DSADR5 _PXAREG(0x40000254) /* DMA Source Address register for Channel 5 5-33 */ #define DTADR5 _PXAREG(0x40000258) /* DMA Target Address register for Channel 5 5-34 */ #define DCMD5 _PXAREG(0x4000025C) /* DMA Command Address register for Channel 5 5-35 */ #define DDADR6 _PXAREG(0x40000260) /* DMA Descriptor Address register for Channel 6 5-32 */ #define DSADR6 _PXAREG(0x40000264) /* DMA Source Address register for Channel 6 5-33 */ #define DTADR6 _PXAREG(0x40000268) /* DMA Target Address register for Channel 6 5-34 */ #define DCMD6 _PXAREG(0x4000026C) /* DMA Command Address register for Channel 6 5-35 */ #define DDADR7 _PXAREG(0x40000270) /* DMA Descriptor Address register for Channel 7 5-32 */ #define DSADR7 _PXAREG(0x40000274) /* DMA Source Address register for Channel 7 5-33 */ #define DTADR7 _PXAREG(0x40000278) /* DMA Target Address register for Channel 7 5-34 */ #define DCMD7 _PXAREG(0x4000027C) /* DMA Command Address register for Channel 7 5-35 */ #define DDADR8 _PXAREG(0x40000280) /* DMA Descriptor Address register for Channel 8 5-32 */ #define DSADR8 _PXAREG(0x40000284) /* DMA Source Address register for Channel 8 5-33 */ #define DTADR8 _PXAREG(0x40000288) /* DMA Target Address register for Channel 8 5-34 */ #define DCMD8 _PXAREG(0x4000028C) /* DMA Command Address register for Channel 8 5-35 */ #define DDADR9 _PXAREG(0x40000290) /* DMA Descriptor Address register for Channel 9 5-32 */ #define DSADR9 _PXAREG(0x40000294) /* DMA Source Address register for Channel 9 5-33 */ #define DTADR9 _PXAREG(0x40000298) /* DMA Target Address register for Channel 9 5-34 */ #define DCMD9 _PXAREG(0x4000029C) /* DMA Command Address register for Channel 9 5-35 */ #define DDADR10 _PXAREG(0x400002A0) /* DMA Descriptor Address register for Channel 10 5-32 */ #define DSADR10 _PXAREG(0x400002A4) /* DMA Source Address register for Channel 10 5-33 */ #define DTADR10 _PXAREG(0x400002A8) /* DMA Target Address register for Channel 10 5-34 */ #define DCMD10 _PXAREG(0x400002AC) /* DMA Command Address register for Channel 10 5-35 */ #define DDADR11 _PXAREG(0x400002B0) /* DMA Descriptor Address register for Channel 11 5-32 */ #define DSADR11 _PXAREG(0x400002B4) /* DMA Source Address register for Channel 11 5-33 */ #define DTADR11 _PXAREG(0x400002B8) /* DMA Target Address register for Channel 11 5-34 */ #define DCMD11 _PXAREG(0x400002BC) /* DMA Command Address register for Channel 11 5-35 */ #define DDADR12 _PXAREG(0x400002C0) /* DMA Descriptor Address register for Channel 12 5-32 */ #define DSADR12 _PXAREG(0x400002C4) /* DMA Source Address register for Channel 12 5-33 */ #define DTADR12 _PXAREG(0x400002C8) /* DMA Target Address register for Channel 12 5-34 */ #define DCMD12 _PXAREG(0x400002CC) /* DMA Command Address register for Channel 12 5-35 */ #define DDADR13 _PXAREG(0x400002D0) /* DMA Descriptor Address register for Channel 13 5-32 */ #define DSADR13 _PXAREG(0x400002D4) /* DMA Source Address register for Channel 13 5-33 */ #define DTADR13 _PXAREG(0x400002D8) /* DMA Target Address register for Channel 13 5-34 */ #define DCMD13 _PXAREG(0x400002DC) /* DMA Command Address register for Channel 13 5-35 */ #define DDADR14 _PXAREG(0x400002E0) /* DMA Descriptor Address register for Channel 14 5-32 */ #define DSADR14 _PXAREG(0x400002E4) /* DMA Source Address register for Channel 14 5-33 */ #define DTADR14 _PXAREG(0x400002E8) /* DMA Target Address register for Channel 14 5-34 */ #define DCMD14 _PXAREG(0x400002EC) /* DMA Command Address register for Channel 14 5-35 */ #define DDADR15 _PXAREG(0x400002F0) /* DMA Descriptor Address register for Channel 15 5-32 */ #define DSADR15 _PXAREG(0x400002F4) /* DMA Source Address register for Channel 15 5-33 */ #define DTADR15 _PXAREG(0x400002F8) /* DMA Target Address register for Channel 15 5-34 */ #define DCMD15 _PXAREG(0x400002FC) /* DMA Command Address register for Channel 15 5-35 */ #define DDADR16 _PXAREG(0x40000300) /* DMA Descriptor Address register for Channel 16 5-32 */ #define DSADR16 _PXAREG(0x40000304) /* DMA Source Address register for Channel 16 5-33 */ #define DTADR16 _PXAREG(0x40000308) /* DMA Target Address register for Channel 16 5-34 */ #define DCMD16 _PXAREG(0x4000030C) /* DMA Command Address register for Channel 16 5-35 */ #define DDADR17 _PXAREG(0x40000310) /* DMA Descriptor Address register for Channel 17 5-32 */ #define DSADR17 _PXAREG(0x40000314) /* DMA Source Address register for Channel 17 5-33 */ #define DTADR17 _PXAREG(0x40000318) /* DMA Target Address register for Channel 17 5-34 */ #define DCMD17 _PXAREG(0x4000031C) /* DMA Command Address register for Channel 17 5-35 */ #define DDADR18 _PXAREG(0x40000320) /* DMA Descriptor Address register for Channel 18 5-32 */ #define DSADR18 _PXAREG(0x40000324) /* DMA Source Address register for Channel 18 5-33 */ #define DTADR18 _PXAREG(0x40000328) /* DMA Target Address register for Channel 18 5-34 */ #define DCMD18 _PXAREG(0x4000032C) /* DMA Command Address register for Channel 18 5-35 */ #define DDADR19 _PXAREG(0x40000330) /* DMA Descriptor Address register for Channel 19 5-32 */ #define DSADR19 _PXAREG(0x40000334) /* DMA Source Address register for Channel 19 5-33 */ #define DTADR19 _PXAREG(0x40000338) /* DMA Target Address register for Channel 19 5-34 */ #define DCMD19 _PXAREG(0x4000033C) /* DMA Command Address register for Channel 19 5-35 */ #define DDADR20 _PXAREG(0x40000340) /* DMA Descriptor Address register for Channel 20 5-32 */ #define DSADR20 _PXAREG(0x40000344) /* DMA Source Address register for Channel 20 5-33 */ #define DTADR20 _PXAREG(0x40000348) /* DMA Target Address register for Channel 20 5-34 */ #define DCMD20 _PXAREG(0x4000034C) /* DMA Command Address register for Channel 20 5-35 */ #define DDADR21 _PXAREG(0x40000350) /* DMA Descriptor Address register for Channel 21 5-32 */ #define DSADR21 _PXAREG(0x40000354) /* DMA Source Address register for Channel 21 5-33 */ #define DTADR21 _PXAREG(0x40000358) /* DMA Target Address register for Channel 21 5-34 */ #define DCMD21 _PXAREG(0x4000035C) /* DMA Command Address register for Channel 21 5-35 */ #define DDADR22 _PXAREG(0x40000360) /* DMA Descriptor Address register for Channel 22 5-32 */ #define DSADR22 _PXAREG(0x40000364) /* DMA Source Address register for Channel 22 5-33 */ #define DTADR22 _PXAREG(0x40000368) /* DMA Target Address register for Channel 22 5-34 */ #define DCMD22 _PXAREG(0x4000036C) /* DMA Command Address register for Channel 22 5-35 */ #define DDADR23 _PXAREG(0x40000370) /* DMA Descriptor Address register for Channel 23 5-32 */ #define DSADR23 _PXAREG(0x40000374) /* DMA Source Address register for Channel 23 5-33 */ #define DTADR23 _PXAREG(0x40000378) /* DMA Target Address register for Channel 23 5-34 */ #define DCMD23 _PXAREG(0x4000037C) /* DMA Command Address register for Channel 23 5-35 */ #define DDADR24 _PXAREG(0x40000380) /* DMA Descriptor Address register for Channel 24 5-32 */ #define DSADR24 _PXAREG(0x40000384) /* DMA Source Address register for Channel 24 5-33 */ #define DTADR24 _PXAREG(0x40000388) /* DMA Target Address register for Channel 24 5-34 */ #define DCMD24 _PXAREG(0x4000038C) /* DMA Command Address register for Channel 24 5-35 */ #define DDADR25 _PXAREG(0x40000390) /* DMA Descriptor Address register for Channel 25 5-32 */ #define DSADR25 _PXAREG(0x40000394) /* DMA Source Address register for Channel 25 5-33 */ #define DTADR25 _PXAREG(0x40000398) /* DMA Target Address register for Channel 25 5-34 */ #define DCMD25 _PXAREG(0x4000039C) /* DMA Command Address register for Channel 25 5-35 */ #define DDADR26 _PXAREG(0x400003A0) /* DMA Descriptor Address register for Channel 26 5-32 */ #define DSADR26 _PXAREG(0x400003A4) /* DMA Source Address register for Channel 26 5-33 */ #define DTADR26 _PXAREG(0x400003A8) /* DMA Target Address register for Channel 26 5-34 */ #define DCMD26 _PXAREG(0x400003AC) /* DMA Command Address register for Channel 26 5-35 */ #define DDADR27 _PXAREG(0x400003B0) /* DMA Descriptor Address register for Channel 27 5-32 */ #define DSADR27 _PXAREG(0x400003B4) /* DMA Source Address register for Channel 27 5-33 */ #define DTADR27 _PXAREG(0x400003B8) /* DMA Target Address register for Channel 27 5-34 */ #define DCMD27 _PXAREG(0x400003BC) /* DMA Command Address register for Channel 27 5-35 */ #define DDADR28 _PXAREG(0x400003C0) /* DMA Descriptor Address register for Channel 28 5-32 */ #define DSADR28 _PXAREG(0x400003C4) /* DMA Source Address register for Channel 28 5-33 */ #define DTADR28 _PXAREG(0x400003C8) /* DMA Target Address register for Channel 28 5-34 */ #define DCMD28 _PXAREG(0x400003CC) /* DMA Command Address register for Channel 28 5-35 */ #define DDADR29 _PXAREG(0x400003D0) /* DMA Descriptor Address register for Channel 29 5-32 */ #define DSADR29 _PXAREG(0x400003D4) /* DMA Source Address register for Channel 29 5-33 */ #define DTADR29 _PXAREG(0x400003D8) /* DMA Target Address register for Channel 29 5-34 */ #define DCMD29 _PXAREG(0x400003DC) /* DMA Command Address register for Channel 29 5-35 */ #define DDADR30 _PXAREG(0x400003E0) /* DMA Descriptor Address register for Channel 30 5-32 */ #define DSADR30 _PXAREG(0x400003E4) /* DMA Source Address register for Channel 30 5-33 */ #define DTADR30 _PXAREG(0x400003E8) /* DMA Target Address register for Channel 30 5-34 */ #define DCMD30 _PXAREG(0x400003EC) /* DMA Command Address register for Channel 30 5-35 */ #define DDADR31 _PXAREG(0x400003F0) /* DMA Descriptor Address register for Channel 31 5-32 */ #define DSADR31 _PXAREG(0x400003F4) /* DMA Source Address register for Channel 31 5-33 */ #define DTADR31 _PXAREG(0x400003F8) /* DMA Target Address register for Channel 31 5-34 */ #define DCMD31 _PXAREG(0x400003FC) /* DMA Command Address register for Channel 31 5-35 */ #define DRCMR64 _PXAREG(0x40001100) /* Request to Channel Map register for Memory Stick receive request 5-31 */ #define DRCMR65 _PXAREG(0x40001104) /* Request to Channel Map register for Memory Stick transmit request 5-31 */ #define DRCMR66 _PXAREG(0x40001108) /* Request to Channel Map register for SSP3 receive request 5-31 */ #define DRCMR67 _PXAREG(0x4000110C) /* Request to Channel Map register for SSP3 transmit request 5-31 */ #define DRCMR68 _PXAREG(0x40001110) /* Request to Channel Map register for Quick Capture Interface Receive Request 0 5-31 */ #define DRCMR69 _PXAREG(0x40001114) /* Request to Channel Map register for Quick Capture Interface Receive Request 1 5-31 */ #define DRCMR70 _PXAREG(0x40001118) /* Request to Channel Map register for Quick Capture Interface Receive Request 2 5-31 */ #define DRCMR74 _PXAREG(0x40001128) /* Request to Channel Map register for DREQ<2> (companion chip request 2) 5-31 */ #define FLYCNFG _PXAREG(0x48000020) /* Fly-by DMA DVAL<1:0> polarities 5-39 */ // DMA Register shortcuts #define DCSR(_ch) _PXAREG_OFFSET(&DCSR0,((_ch) << 2)) #define DRQSR(_line) _PXAREG_OFFSET(&DRQSR0,((_line) << 2)) #define DRCMR(_dev) *(((_dev) < 63) ? (&_PXAREG_OFFSET(&DRCMR0, (((_dev) & 0x3f) << 2))) \ : (&_PXAREG_OFFSET(&DRCMR64,(((_dev) & 0x3f) << 2)))) #define DDADR(_ch) _PXAREG_OFFSET(&DDADR0,((_ch) << 4)) #define DSADR(_ch) _PXAREG_OFFSET(&DSADR0,((_ch) << 4)) #define DTADR(_ch) _PXAREG_OFFSET(&DTADR0,((_ch) << 4)) #define DCMD(_ch) _PXAREG_OFFSET(&DCMD0,((_ch) << 4)) #define DDADR_DESCADDR 0xfffffff0 /* Address of next descriptor (mask) */ #define DDADR_STOP (1 << 0) /* Stop (read / write) */ #define DRCMR_MAPVLD (1 << 7) /* Map Valid Channel */ #define DRCMR_CHLNUM(_ch) ((_ch) & 0x1f) #define DCSR_RUN (1 << 31) /* Run Bit (read / write) */ #define DCSR_NODESCFETCH (1 << 30) /* No-Descriptor Fetch (read / write) */ #define DCSR_STOPIRQEN (1 << 29) /* Stop Interrupt Enabled */ #define DCSR_EORIRQEN (1 << 28) /* End-of-Receive Interrupt Enable */ #define DCSR_EORJMPEN (1 << 27) /* Jump to Next Descriptor on EOR */ #define DCSR_EORSTOPEN (1 << 26) /* Stop Channel on EOR */ #define DCSR_SETCMPST (1 << 25) /* Set Descriptor Compare Status */ #define DCSR_CLRCMPST (1 << 24) /* Clear Descriptor Compare Status */ #define DCSR_RASIRQEN (1 << 23) /* Request After Channel Stoopped Interrupt Enable */ #define DCSR_MASKRUN (1 << 22) /* Mask Run */ #define DCSR_CMPST (1 << 10) /* Descriptor Compare Status */ #define DCSR_EORINT (1 << 9) /* End of Recieve */ #define DCSR_REQPEND (1 << 8) /* Request Pending (read-only) */ #define DCSR_RASINTR (1 << 4) /* Request After Channel Stopped */ #define DCSR_STOPINTR (1 << 3) /* Stop Interrupt */ #define DCSR_ENDINTR (1 << 2) /* End Interrupt (read / write) */ #define DCSR_STARTINTR (1 << 1) /* Start Interrupt (read / write) */ #define DCSR_BUSERRINTR (1 << 0) /* Bus Error Interrupt (read / write) */ #define DRQSR_CLR (1 << 8) /* Clear Pending Requests */ #define DCMD_INCSRCADDR (1 << 31) /* Source Address Increment Setting. */ #define DCMD_INCTRGADDR (1 << 30) /* Target Address Increment Setting. */ #define DCMD_FLOWSRC (1 << 29) /* Flow Control by the source. */ #define DCMD_FLOWTRG (1 << 28) /* Flow Control by the target. */ #define DCMD_CMPEN (1 << 25) /* Descriptor Compare Enable */ #define DCMD_ADDRMODE (1 << 23) /* Addressing Mode */ #define DCMD_STARTIRQEN (1 << 22) /* Start Interrupt Enable */ #define DCMD_ENDIRQEN (1 << 21) /* End Interrupt Enable */ #define DCMD_FLYBYS (1 << 20) /* Fly-By Source */ #define DCMD_FLYBYT (1 << 19) /* Fly-By Target */ #define DCMD_BURST8 (1 << 16) /* 8 byte burst */ #define DCMD_BURST16 (2 << 16) /* 16 byte burst */ #define DCMD_BURST32 (3 << 16) /* 32 byte burst */ #define DCMD_WIDTH1 (1 << 14) /* 1 byte width */ #define DCMD_WIDTH2 (2 << 14) /* 2 byte width (HalfWord) */ #define DCMD_WIDTH4 (3 << 14) /* 4 byte width (Word) */ #define DCMD_SIZE(_x) (((_x) & 0x3)<<16) /* Burst Size */ #define DCMD_MAXSIZE DCMD_SIZE(3) #define DCMD_WIDTH(_x) (((_x) & 0x3)<<14) /* Peripheral Width */ #define DCMD_MAXWIDTH DCMD_WIDTH(3) #define DCMD_LEN(_x) (((_x) & 0x1fff)) /* Length of transfer (0 for descriptor ops) */ #define DCMD_MAXLEN DCMD_LEN(0x1fff) #define DMAREQ_DREQ0 (0) #define DMAREQ_DREQ1 (1) #define DMAREQ_I2S_RECV (2) #define DMAREQ_I2S_XMT (3) #define DMAREQ_BTUART_RECV (4) #define DMAREQ_BTUART_XMT (5) #define DMAREQ_FFUAR_RECV (6) #define DMAREQ_FFUART_XMT (7) #define DMAREQ_AC97_MICR (8) #define DMAREQ_AC97_MODEM_RECV (9) #define DMAREQ_AC97_MODEM_XMT (10) #define DMAREQ_AC97_AUDIO_RECV (11) #define DMAREQ_AC97_AUDIO_XMT (12) #define DMAREQ_SSP1_RECV (13) #define DMAREQ_SSP1_XMT (14) #define DMAREQ_SSP2_RECV (15) #define DMAREQ_SSP2_XMT (16) #define DMAREQ_ICP_RECV (17) #define DMAREQ_ICP_XMT (18) #define DMAREQ_STUART_RECV (19) #define DMAREQ_STUART_XMT (20) #define DMAREQ_MMCSDIO_RECV (21) #define DMAREQ_MMCSDIO_XMT (22) #define DMAREQ_USB_EP_0 (24) #define DMAREQ_USB_EP_A (25) #define DMAREQ_USB_EP_B (26) #define DMAREQ_USB_EP_C (27) #define DMAREQ_USB_EP_D (28) #define DMAREQ_USB_EP_E (29) #define DMAREQ_USB_EP_F (30) #define DMAREQ_USB_EP_G (31) #define DMAREQ_USB_EP_H (32) #define DMAREQ_USB_EP_I (33) #define DMAREQ_USB_EP_J (34) #define DMAREQ_USB_EP_K (35) #define DMAREQ_USB_EP_L (36) #define DMAREQ_USB_EP_M (37) #define DMAREQ_USB_EP_N (38) #define DMAREQ_USB_EP_P (39) #define DMAREQ_USB_EP_Q (40) #define DMAREQ_USB_EP_R (41) #define DMAREQ_USB_EP_S (42) #define DMAREQ_USB_EP_T (43) #define DMAREQ_USB_EP_U (44) #define DMAREQ_USB_EP_V (45) #define DMAREQ_USB_EP_W (46) #define DMAREQ_USB_EP_X (47) #define DMAREQ_MSL_RECV_1 (48) #define DMAREQ_MSL_XMT_1 (49) #define DMAREQ_MSL_RECV_2 (50) #define DMAREQ_MSL_XMT_2 (51) #define DMAREQ_MSL_RECV_3 (52) #define DMAREQ_MSL_XMT_3 (53) #define DMAREQ_MSL_RECV_4 (54) #define DMAREQ_MSL_XMT_4 (55) #define DMAREQ_MSL_RECV_5 (56) #define DMAREQ_MSL_XMT_5 (57) #define DMAREQ_MSL_RECV_6 (58) #define DMAREQ_MSL_XMT_6 (59) #define DMAREQ_MSL_RECV_7 (60) #define DMAREQ_MSL_XMT_7 (61) #define DMAREQ_USIM_RECV (62) #define DMAREQ_USIM_XMT (63) #define DMAREQ_MEMSTICK_RECV (64) #define DMAREQ_MEMSTICK_XMT (65) #define DMAREQ_SSP3_RECV (66) #define DMAREQ_SSP3_XMT (67) #define DMAREQ_CIF_RECV_0 (68) #define DMAREQ_CIF_RECV_1 (69) #define DMAREQ_CIF_RECV_2 (70) #define DMAREQ_DREQ2 (74) /******************************************************************************/ /* Full-Function UART */ /******************************************************************************/ #define FFRBR _PXAREG(0x40100000) /* Receive Buffer register 10-13 */ #define FFTHR _PXAREG(0x40100000) /* Transmit Holding register 10-14 */ #define FFDLL _PXAREG(0x40100000) /* Divisor Latch register, low byte 10-14 */ #define FFIER _PXAREG(0x40100004) /* Interrupt Enable register 10-15 */ #define FFDLH _PXAREG(0x40100004) /* Divisor Latch register, high byte 10-14 */ #define FFIIR _PXAREG(0x40100008) /* Interrupt ID register 10-17 */ #define FFFCR _PXAREG(0x40100008) /* FIFO Control register 10-19 */ #define FFLCR _PXAREG(0x4010000C) /* Line Control register 10-25 */ #define FFMCR _PXAREG(0x40100010) /* Modem Control register 10-29 */ #define FFLSR _PXAREG(0x40100014) /* Line Status register 10-26 */ #define FFMSR _PXAREG(0x40100018) /* Modem Status register 10-31 */ #define FFSPR _PXAREG(0x4010001C) /* Scratch Pad register 10-33 */ #define FFISR _PXAREG(0x40100020) /* Infrared Select register 10-33 */ #define FFFOR _PXAREG(0x40100024) /* Receive FIFO Occupancy register 10-22 */ #define FFABR _PXAREG(0x40100028) /* Auto-baud Control register 10-23 */ #define FFACR _PXAREG(0x4010002C) /* Auto-baud Count register 10-24 */ /******************************************************************************/ /* Bluetooth UART */ /******************************************************************************/ #define BTRBR _PXAREG(0x40200000) /* Receive Buffer register 10-13 */ #define BTTHR _PXAREG(0x40200000) /* Transmit Holding register 10-14 */ #define BTDLL _PXAREG(0x40200000) /* Divisor Latch register, low byte 10-14 */ #define BTIER _PXAREG(0x40200004) /* Interrupt Enable register 10-15 */ #define BTDLH _PXAREG(0x40200004) /* Divisor Latch register, high byte 10-14 */ #define BTIIR _PXAREG(0x40200008) /* Interrupt ID register 10-17 */ #define BTFCR _PXAREG(0x40200008) /* FIFO Control register 10-19 */ #define BTLCR _PXAREG(0x4020000C) /* Line Control register 10-25 */ #define BTMCR _PXAREG(0x40200010) /* Modem Control register 10-29 */ #define BTLSR _PXAREG(0x40200014) /* Line Status register 10-26 */ #define BTMSR _PXAREG(0x40200018) /* Modem Status register 10-31 */ #define BTSPR _PXAREG(0x4020001C) /* Scratch Pad register 10-33 */ #define BTISR _PXAREG(0x40200020) /* Infrared Select register 10-33 */ #define BTFOR _PXAREG(0x40200024) /* Receive FIFO Occupancy register 10-22 */ #define BTABR _PXAREG(0x40200028) /* Auto-Baud Control register 10-23 */ #define BTACR _PXAREG(0x4020002C) /* Auto-Baud Count register 10-24 */ #define IER_DMAE (1 << 7) /* DMA Requests Enable */ #define IER_UUE (1 << 6) /* UART Unit Enable */ #define IER_NRZE (1 << 5) /* NRZ coding Enable */ #define IER_RTIOE (1 << 4) /* Receiver Time Out Interrupt Enable */ #define IER_MIE (1 << 3) /* Modem Interrupt Enable */ #define IER_RLSE (1 << 2) /* Receiver Line Status Interrupt Enable */ #define IER_TIE (1 << 1) /* Transmit Data request Interrupt Enable */ #define IER_RAVIE (1 << 0) /* Receiver Data Available Interrupt Enable */ #define IIR_FIFOES1 (1 << 7) /* FIFO Mode Enable Status */ #define IIR_FIFOES0 (1 << 6) /* FIFO Mode Enable Status */ #define IIR_TOD (1 << 3) /* Time Out Detected */ #define IIR_IID_MASK (0x3 << 1) /* Interrupt Source Encoded */ #define IIR_IP (1 << 0) /* Interrupt Pending (active low) */ #define FCR_ITL(_x) ((_x) << 6) /* Interrupt Trigger Level */ #define FCR_BUS (1 << 5) /* 32-Bit Peripheral Bus */ #define FCR_TRAIL (1 << 4) /* Trailing Bytes */ #define FCR_TIL (1 << 3) /* Transmitter Interrupt Level */ #define FCR_RESETTF (1 << 2) /* Reset Transmitter FIFO */ #define FCR_RESETRF (1 << 1) /* Reset Receiver FIFO */ #define FCR_TRFIFOE (1 << 0) /* Transmit and Receive FIFO Enable */ #define ABR_ABT (1 << 3) /* Auto-Baud Rate Calculation */ #define ABR_ABUP (1 << 2) /* Auto-Baud Programmer */ #define ABR_ABLIE (1 << 1) /* Auto-Baud Interrupt */ #define ABR_ABE (1 << 0) /* Auto-Baud Enable */ #define LCR_DLAB (1 << 7) /* Divisor Latch Access */ #define LCR_SB (1 << 6) /* Set Break */ #define LCR_STKYP (1 << 5) /* Sticky Parity */ #define LCR_EPS (1 << 4) /* Even Parity Select */ #define LCR_PEN (1 << 3) /* Parity Enable */ #define LCR_STB (1 << 2) /* Stop Bit */ #define LCR_WLS(_x) ((_x) << 0) /* Word Length Select */ #define LSR_FIFOE (1 << 7) /* FIFO Error Status */ #define LSR_TEMT (1 << 6) /* Transmitter Empty */ #define LSR_TDRQ (1 << 5) /* Transmit Data Request */ #define LSR_BI (1 << 4) /* Break Interrupt */ #define LSR_FE (1 << 3) /* Framing Error */ #define LSR_PE (1 << 2) /* Parity Error */ #define LSR_OE (1 << 1) /* Overrun Error */ #define LSR_DR (1 << 0) /* Data Ready */ #define MCR_AFE (1 << 5) /* Auto-Flow Control Enable */ #define MCR_LOOP (1 << 4) /* Loopback Mode */ #define MCR_OUT2 (1 << 3) /* OUT2 Signal control */ #define MCR_OUT1 (1 << 2) /* Test Bit */ #define MCR_RTS (1 << 1) /* Request to Send */ #define MCR_DTR (1 << 0) /* Data Terminal Ready */ #define MSR_DCD (1 << 7) /* Data Carrier Detect */ #define MSR_RI (1 << 6) /* Ring Indicator */ #define MSR_DSR (1 << 5) /* Data Set Ready */ #define MSR_CTS (1 << 4) /* Clear To Send */ #define MSR_DDCD (1 << 3) /* Delta Data Carrier Detect */ #define MSR_TERI (1 << 2) /* Trailing Edge Ring Indicator */ #define MSR_DDSR (1 << 1) /* Delta Data Set Ready */ #define MSR_DCTS (1 << 0) /* Delta Clear To Send */ #define ISR_RXPL (1 << 4) /* Receive Data Polarity */ #define ISR_TXPL (1 << 3) /* Transmit Data Polarity */ #define ISR_XMODE (1 << 2) /* Transmit Pulse Width Select */ #define ISR_RCVEIR (1 << 1) /* Receiver SIR Enable */ #define ISR_XMITIR (1 << 0) /* Transmitter SIR Enable */ /******************************************************************************/ /* Standard I2C */ /******************************************************************************/ #define IBMR _PXAREG(0x40301680) /* I2C Bus Monitor register 9-30 */ #define IDBR _PXAREG(0x40301688) /* I2C Data Buffer register 9-29 */ #define ICR _PXAREG(0x40301690) /* I2C Control register 9-23 */ #define ISR _PXAREG(0x40301698) /* I2C Status register 9-26 */ #define ISAR _PXAREG(0x403016A0) /* I2C Slave Address register 9-28 */ /* I2C - Control Register */ #define ICR_FM (1 << 15) /* Fast Mode */ #define ICR_UR (1 << 14) /* Unit Reset */ #define ICR_SADIE (1 << 13) /* Slave Address Detected Interrupt Enable */ #define ICR_ALDIE (1 << 12) /* Arbitratino Loss Detected Interrupt Enable */ #define ICR_SSDIE (1 << 11) /* Slave STOP Detected Interrupt Enable */ #define ICR_BEIE (1 << 10) /* Bus Error Interrupt Enable */ #define ICR_DRFIE (1 << 9) /* DBR Receive Full Interupt Enable */ #define ICR_ITEIE (1 << 8) /* IDBR Transmit Empty Interrupt Enable */ #define ICR_GCD (1 << 7) /* General Call Disable */ #define ICR_IUE (1 << 6) /* I2C Unit Enable */ #define ICR_SCLE (1 << 5) /* SCL Enable */ #define ICR_MA (1 << 4) /* Master Abort */ #define ICR_TB (1 << 3) /* Transfer Byte */ #define ICR_ACKNAK (1 << 2) /* Positive/Negative Acknowledge */ #define ICR_STOP (1 << 1) /* Stop */ #define ICR_START (1 << 0) /* Start */ /* I2C - Status Register */ #define ISR_BED (1 << 10) /* Bus Error Detected */ #define ISR_SAD (1 << 9) /* Slave Address Detected */ #define ISR_GCAD (1 << 8) /* General Call Address Detected */ #define ISR_IRF (1 << 7) /* IDBR Receive Full */ #define ISR_ITE (1 << 6) /* IDBR Transmit Empty */ #define ISR_ALD (1 << 5) /* Arbitration Loss Detection */ #define ISR_SSD (1 << 4) /* Slave STOP Detected */ #define ISR_IBB (1 << 3) /* I2C Bus Busy */ #define ISR_UB (1 << 2) /* Unit Busy */ #define ISR_ACKNAK (1 << 1) /* Ack/Nack Status */ #define ISR_RWM (1 << 0) /* Read/Write Mode */ /* I2C - Bus Monitor Register */ #define IBMR_SCL (1 << 1) /* Continousely reflects the value of the SCL pin */ #define IBMR_SDA (1 << 0) /* Continousely reflects the value of the SDA pin */ /******************************************************************************/ /* I2S Controller */ /******************************************************************************/ #define SACR0 _PXAREG(0x40400000) /* Serial Audio Global Control register 14-10 */ #define SACR1 _PXAREG(0x40400004) /* Serial Audio I2S/MSB-Justified Control register 14-13 */ #define SASR0 _PXAREG(0x4040000C) /* Serial Audio I2S/MSB-Justified Interface and FIFO Status register 14-14 */ #define SAIMR _PXAREG(0x40400014) /* Serial Audio Interrupt Mask register 14-18 */ #define SAICR _PXAREG(0x40400018) /* Serial Audio Interrupt Clear register 14-17 */ #define SADIV _PXAREG(0x40400060) /* Audio Clock Divider register 14-16 */ #define SADR _PXAREG(0x40400080) /* Serial Audio Data register (TX and RX FIFO access register). 14-18 */ /******************************************************************************/ /* USB Client Controller */ /******************************************************************************/ #define UDCCR _PXAREG(0x40600000) /* UDC Control register 12-31 */ #define UDCICR0 _PXAREG(0x40600004) /* UDC Interrupt Control register 0 12-35 */ #define UDCICR1 _PXAREG(0x40600008) /* UDC Interrupt Control register 1 12-35 */ #define UDCISR0 _PXAREG(0x4060000C) /* UDC Interrupt Status register 0 12-49 */ #define UDCISR1 _PXAREG(0x40600010) /* UDC Interrupt Status register 1 12-49 */ #define UDCFNR _PXAREG(0x40600014) /* UDC Frame Number register 12-52 */ #define UDCOTGICR _PXAREG(0x40600018) /* UDC OTG Interrupt Control register 12-35 */ #define UDCOTGISR _PXAREG(0x4060001C) /* UDC OTG Interrupt Status register 12-49 */ #define UP2OCR _PXAREG(0x40600020) /* USB Port 2 Output Control register 12-41 */ #define UP3OCR _PXAREG(0x40600024) /* USB Port 3 Output Control register 12-47 */ #define UDCCSR0 _PXAREG(0x40600100) /* UDC Control/Status register-Endpoint 0 12-53 */ #define UDCCSRA _PXAREG(0x40600104) /* UDC Control/Status register-Endpoint A 12-56 */ #define UDCCSRB _PXAREG(0x40600108) /* UDC Control/Status register-Endpoint B 12-56 */ #define UDCCSRC _PXAREG(0x4060010C) /* UDC Control/Status register-Endpoint C 12-56 */ #define UDCCSRD _PXAREG(0x40600110) /* UDC Control/Status register-Endpoint D 12-56 */ #define UDCCSRE _PXAREG(0x40600114) /* UDC Control/Status register-Endpoint E 12-56 */ #define UDCCSRF _PXAREG(0x40600118) /* UDC Control/Status register-Endpoint F 12-56 */ #define UDCCSRG _PXAREG(0x4060011C) /* UDC Control/Status register-Endpoint G 12-56 */ #define UDCCSRH _PXAREG(0x40600120) /* UDC Control/Status register-Endpoint H 12-56 */ #define UDCCSRI _PXAREG(0x40600124) /* UDC Control/Status register-Endpoint I 12-56 */ #define UDCCSRJ _PXAREG(0x40600128) /* UDC Control/Status register-Endpoint J 12-56 */ #define UDCCSRK _PXAREG(0x4060012C) /* UDC Control/Status register-Endpoint K 12-56 */ #define UDCCSRL _PXAREG(0x40600130) /* UDC Control/Status register-Endpoint L 12-56 */ #define UDCCSRM _PXAREG(0x40600134) /* UDC Control/Status register-Endpoint M 12-56 */ #define UDCCSRN _PXAREG(0x40600138) /* UDC Control/Status register-Endpoint N 12-56 */ #define UDCCSRP _PXAREG(0x4060013C) /* UDC Control/Status register-Endpoint P 12-56 */ #define UDCCSRQ _PXAREG(0x40600140) /* UDC Control/Status register-Endpoint Q 12-56 */ #define UDCCSRR _PXAREG(0x40600144) /* UDC Control/Status register-Endpoint R 12-56 */ #define UDCCSRS _PXAREG(0x40600148) /* UDC Control/Status register-Endpoint S 12-56 */ #define UDCCSRT _PXAREG(0x4060014C) /* UDC Control/Status register-Endpoint T 12-56 */ #define UDCCSRU _PXAREG(0x40600150) /* UDC Control/Status register-Endpoint U 12-56 */ #define UDCCSRV _PXAREG(0x40600154) /* UDC Control/Status register-Endpoint V 12-56 */ #define UDCCSRW _PXAREG(0x40600158) /* UDC Control/Status register-Endpoint W 12-56 */ #define UDCCSRX _PXAREG(0x4060015C) /* UDC Control/Status register-Endpoint X 12-56 */ #define UDCBCR0 _PXAREG(0x40600200) /* UDC Byte Count register-Endpoint 0 12-62 */ #define UDCBCRA _PXAREG(0x40600204) /* UDC Byte Count register-Endpoint A 12-62 */ #define UDCBCRB _PXAREG(0x40600208) /* UDC Byte Count register-Endpoint B 12-62 */ #define UDCBCRC _PXAREG(0x4060020C) /* UDC Byte Count register-Endpoint C 12-62 */ #define UDCBCRD _PXAREG(0x40600210) /* UDC Byte Count register-Endpoint D 12-62 */ #define UDCBCRE _PXAREG(0x40600214) /* UDC Byte Count register-Endpoint E 12-62 */ #define UDCBCRF _PXAREG(0x40600218) /* UDC Byte Count register-Endpoint F 12-62 */ #define UDCBCRG _PXAREG(0x4060021C) /* UDC Byte Count register-Endpoint G 12-62 */ #define UDCBCRH _PXAREG(0x40600220) /* UDC Byte Count register-Endpoint H 12-62 */ #define UDCBCRI _PXAREG(0x40600224) /* UDC Byte Count register-Endpoint I 12-62 */ #define UDCBCRJ _PXAREG(0x40600228) /* UDC Byte Count register-Endpoint J 12-62 */ #define UDCBCRK _PXAREG(0x4060022C) /* UDC Byte Count register-Endpoint K 12-62 */ #define UDCBCRL _PXAREG(0x40600230) /* UDC Byte Count register-Endpoint L 12-62 */ #define UDCBCRM _PXAREG(0x40600234) /* UDC Byte Count register-Endpoint M 12-62 */ #define UDCBCRN _PXAREG(0x40600238) /* UDC Byte Count register-Endpoint N 12-62 */ #define UDCBCRP _PXAREG(0x4060023C) /* UDC Byte Count register-Endpoint P 12-62 */ #define UDCBCRQ _PXAREG(0x40600240) /* UDC Byte Count register-Endpoint Q 12-62 */ #define UDCBCRR _PXAREG(0x40600244) /* UDC Byte Count register-Endpoint R 12-62 */ #define UDCBCRS _PXAREG(0x40600248) /* UDC Byte Count register-Endpoint S 12-62 */ #define UDCBCRT _PXAREG(0x4060024C) /* UDC Byte Count register-Endpoint T 12-62 */ #define UDCBCRU _PXAREG(0x40600250) /* UDC Byte Count register-Endpoint U 12-62 */ #define UDCBCRV _PXAREG(0x40600254) /* UDC Byte Count register-Endpoint V 12-62 */ #define UDCBCRW _PXAREG(0x40600258) /* UDC Byte Count register-Endpoint W 12-62 */ #define UDCBCRX _PXAREG(0x4060025C) /* UDC Byte Count register-Endpoint X 12-62 */ #define UDCDR0 _PXAREG(0x40600300) /* UDC Data register-Endpoint 0 12-62 */ #define UDCDRA _PXAREG(0x40600304) /* UDC Data register-Endpoint A 12-62 */ #define UDCDRB _PXAREG(0x40600308) /* UDC Data register-Endpoint B 12-62 */ #define UDCDRC _PXAREG(0x4060030C) /* UDC Data register-Endpoint C 12-62 */ #define UDCDRD _PXAREG(0x40600310) /* UDC Data register-Endpoint D 12-62 */ #define UDCDRE _PXAREG(0x40600314) /* UDC Data register-Endpoint E 12-62 */ #define UDCDRF _PXAREG(0x40600318) /* UDC Data register-Endpoint F 12-62 */ #define UDCDRG _PXAREG(0x4060031C) /* UDC Data register-Endpoint G 12-62 */ #define UDCDRH _PXAREG(0x40600320) /* UDC Data register-Endpoint H 12-62 */ #define UDCDRI _PXAREG(0x40600324) /* UDC Data register-Endpoint I 12-62 */ #define UDCDRJ _PXAREG(0x40600328) /* UDC Data register-Endpoint J 12-62 */ #define UDCDRK _PXAREG(0x4060032C) /* UDC Data register-Endpoint K 12-62 */ #define UDCDRL _PXAREG(0x40600330) /* UDC Data register-Endpoint L 12-62 */ #define UDCDRM _PXAREG(0x40600334) /* UDC Data register-Endpoint M 12-62 */ #define UDCDRN _PXAREG(0x40600338) /* UDC Data register-Endpoint N 12-62 */ #define UDCDRP _PXAREG(0x4060033C) /* UDC Data register-Endpoint P 12-62 */ #define UDCDRQ _PXAREG(0x40600340) /* UDC Data register-Endpoint Q 12-62 */ #define UDCDRR _PXAREG(0x40600344) /* UDC Data register-Endpoint R 12-62 */ #define UDCDRS _PXAREG(0x40600348) /* UDC Data register-Endpoint S 12-62 */ #define UDCDRT _PXAREG(0x4060034C) /* UDC Data register-Endpoint T 12-62 */ #define UDCDRU _PXAREG(0x40600350) /* UDC Data register-Endpoint U 12-62 */ #define UDCDRV _PXAREG(0x40600354) /* UDC Data register-Endpoint V 12-62 */ #define UDCDRW _PXAREG(0x40600358) /* UDC Data register-Endpoint W 12-62 */ #define UDCDRX _PXAREG(0x4060035C) /* UDC Data register-Endpoint X 12-62 */ #define UDCCRA _PXAREG(0x40600404) /* UDC Configuration register-Endpoint A 12-64 */ #define UDCCRB _PXAREG(0x40600408) /* UDC Configuration register-Endpoint B 12-64 */ #define UDCCRC _PXAREG(0x4060040C) /* UDC Configuration register-Endpoint C 12-64 */ #define UDCCRD _PXAREG(0x40600410) /* UDC Configuration register-Endpoint D 12-64 */ #define UDCCRE _PXAREG(0x40600414) /* UDC Configuration register-Endpoint E 12-64 */ #define UDCCRF _PXAREG(0x40600418) /* UDC Configuration register-Endpoint F 12-64 */ #define UDCCRG _PXAREG(0x4060041C) /* UDC Configuration register-Endpoint G 12-64 */ #define UDCCRH _PXAREG(0x40600420) /* UDC Configuration register-Endpoint H 12-64 */ #define UDCCRI _PXAREG(0x40600424) /* UDC Configuration register-Endpoint I 12-64 */ #define UDCCRJ _PXAREG(0x40600428) /* UDC Configuration register-Endpoint J 12-64 */ #define UDCCRK _PXAREG(0x4060042C) /* UDC Configuration register-Endpoint K 12-64 */ #define UDCCRL _PXAREG(0x40600430) /* UDC Configuration register-Endpoint L 12-64 */ #define UDCCRM _PXAREG(0x40600434) /* UDC Configuration register-Endpoint M 12-64 */ #define UDCCRN _PXAREG(0x40600438) /* UDC Configuration register-Endpoint N 12-64 */ #define UDCCRP _PXAREG(0x4060043C) /* UDC Configuration register-Endpoint P 12-64 */ #define UDCCRQ _PXAREG(0x40600440) /* UDC Configuration register-Endpoint Q 12-64 */ #define UDCCRR _PXAREG(0x40600444) /* UDC Configuration register-Endpoint R 12-64 */ #define UDCCRS _PXAREG(0x40600448) /* UDC Configuration register-Endpoint S 12-64 */ #define UDCCRT _PXAREG(0x4060044C) /* UDC Configuration register-Endpoint T 12-64 */ #define UDCCRU _PXAREG(0x40600450) /* UDC Configuration register-Endpoint U 12-64 */ #define UDCCRV _PXAREG(0x40600454) /* UDC Configuration register-Endpoint V 12-64 */ #define UDCCRW _PXAREG(0x40600458) /* UDC Configuration register-Endpoint W 12-64 */ #define UDCCRX _PXAREG(0x4060045C) /* UDC Configuration register-Endpoint X 12-64 */ /* UDCCR register */ #define UDCCR_UDE (1 << 0) /* UDC Enable */ /******************************************************************************/ /* Standard UART */ /******************************************************************************/ #define STRBR _PXAREG(0x40700000) /* Receive Buffer register 10-13 */ #define STTHR _PXAREG(0x40700000) /* Transmit Holding register 10-14 */ #define STDLL _PXAREG(0x40700000) /* Divisor Latch register, low byte 10-14 */ #define STIER _PXAREG(0x40700004) /* Interrupt Enable register 10-15 */ #define STDLH _PXAREG(0x40700004) /* Divisor Latch register, high byte 10-14 */ #define STIIR _PXAREG(0x40700008) /* Interrupt ID register 10-17 */ #define STFCR _PXAREG(0x40700008) /* FIFO Control register 10-19 */ #define STLCR _PXAREG(0x4070000C) /* Line Control register 10-25 */ #define STMCR _PXAREG(0x40700010) /* Modem Control register 10-29 */ #define STLSR _PXAREG(0x40700014) /* Line Status register 10-26 */ #define STMSR _PXAREG(0x40700018) /* Modem Status register 10-31 */ #define STSPR _PXAREG(0x4070001C) /* Scratch Pad register 10-33 */ #define STISR _PXAREG(0x40700020) /* Infrared Select register 10-33 */ #define STFOR _PXAREG(0x40700024) /* Receive FIFO Occupancy register 10-22 */ #define STABR _PXAREG(0x40700028) /* Auto-Baud Control register 10-23 */ #define STACR _PXAREG(0x4070002C) /* Auto-Baud Count register 10-24 */ /******************************************************************************/ /* Infrared Communications Port */ /******************************************************************************/ #define ICCR0 _PXAREG(0x40800000) /* FICP Control register 0 11-10 */ #define ICCR1 _PXAREG(0x40800004) /* FICP Control register 1 11-13 */ #define ICCR2 _PXAREG(0x40800008) /* FICP Control register 2 11-14 */ #define ICDR _PXAREG(0x4080000C) /* FICP Data register 11-15 */ #define ICSR0 _PXAREG(0x40800014) /* FICP Status register 0 11-16 */ #define ICSR1 _PXAREG(0x40800018) /* FICP Status register 1 11-18 */ #define ICFOR _PXAREG(0x4080001C) /* FICP FIFO Occupancy Status register 11-19 */ /******************************************************************************/ /* Real-Time Clock */ /******************************************************************************/ #define RCNR _PXAREG(0x40900000) /* RTC Counter register 21-24 */ #define RTAR _PXAREG(0x40900004) /* RTC Alarm register 21-19 */ #define RTSR _PXAREG(0x40900008) /* RTC Status register 21-17 */ #define RTTR _PXAREG(0x4090000C) /* RTC Timer Trim register 21-16 */ #define RDCR _PXAREG(0x40900010) /* RTC Day Counter register 21-24 */ #define RYCR _PXAREG(0x40900014) /* RTC Year Counter register 21-25 */ #define RDAR1 _PXAREG(0x40900018) /* RTC Wristwatch Day Alarm register 1 21-20 */ #define RYAR1 _PXAREG(0x4090001C) /* RTC Wristwatch Year Alarm register 1 21-21 */ #define RDAR2 _PXAREG(0x40900020) /* RTC Wristwatch Day Alarm register 2 21-20 */ #define RYAR2 _PXAREG(0x40900024) /* RTC Wristwatch Year Alarm register 2 21-21 */ #define SWCR _PXAREG(0x40900028) /* RTC Stopwatch Counter register 21-26 */ #define SWAR1 _PXAREG(0x4090002C) /* RTC Stopwatch Alarm register 1 21-22 */ #define SWAR2 _PXAREG(0x40900030) /* RTC Stopwatch Alarm register 2 21-22 */ #define RTCPICR _PXAREG(0x40900034) /* RTC Periodic Interrupt Counter register 21-27 */ #define PIAR _PXAREG(0x40900038) /* RTC Periodic Interrupt Alarm register 21-23 */ /* RTSR */ #define RTSR_PICE (1 << 15) /* periodic interrupt count enable */ #define RTSR_PIALE (1 << 14) /* periodic interrupt alarm enable */ #define RTSR_PIAL (1 << 13) /* periodic interrupt alarm status */ #define RTSR_SWCE (1 << 12) /* stopwatch count enable */ #define RTSR_SWALE2 (1 << 11) /* stopwatch alarm 2 enable */ #define RTSR_SWAL2 (1 << 10) /* stopwatch alarm 2 status */ #define RTSR_SWALE1 (1 << 9) /* stopwatch alarm 1 enable */ #define RTSR_SWAL1 (1 << 8) /* stopwatch alarm 1 status */ #define RTSR_RDALE2 (1 << 7) /* wristwatch alarm 2 enable */ #define RTSR_RDAL2 (1 << 6) /* wristwatch alarm 2 status */ #define RTSR_RDALE1 (1 << 5) /* wristwatch alarm 1 enable */ #define RTSR_RDAL1 (1 << 4) /* wristwatch alarm 1 status */ #define RTSR_HZE (1 << 3) /* HZ interrupt enable */ #define RTSR_ALE (1 << 2) /* RTC alarm interrupt enable */ #define RTSR_HZ (1 << 1) /* HZ rising edge detected */ #define RTSR_AL (1 << 0) /* RTC alarm detected */ /******************************************************************************/ /* OS Timers */ /******************************************************************************/ #define OSMR0 _PXAREG(0x40A00000) /* OS Timer Match 0 register 22-15 */ #define OSMR1 _PXAREG(0x40A00004) /* OS Timer Match 1 register 22-15 */ #define OSMR2 _PXAREG(0x40A00008) /* OS Timer Match 2 register 22-15 */ #define OSMR3 _PXAREG(0x40A0000C) /* OS Timer Match 3 register 22-15 */ #define OSCR0 _PXAREG(0x40A00010) /* OS Timer Counter 0 register 22-17 */ #define OSSR _PXAREG(0x40A00014) /* OS Timer Status register (used for all counters) 22-18 */ #define OWER _PXAREG(0x40A00018) /* OS Timer Watchdog Enable register 22-16 */ #define OIER _PXAREG(0x40A0001C) /* OS Timer Interrupt Enable register (used for all counters) 22-16 */ #define OSNR _PXAREG(0x40A00020) /* OS Timer Snapshot register 22-19 */ #define OSCR4 _PXAREG(0x40A00040) /* OS Timer Counter 4-11 registers 22-17 */ #define OSCR5 _PXAREG(0x40A00044) #define OSCR6 _PXAREG(0x40A00048) #define OSCR7 _PXAREG(0x40A0004C) #define OSCR8 _PXAREG(0x40A00050) #define OSCR9 _PXAREG(0x40A00054) #define OSCR10 _PXAREG(0x40A00058) #define OSCR11 _PXAREG(0x40A0005C) #define OSMR4 _PXAREG(0x40A00080) /* OS Timer Match 4-11 registers 22-15 */ #define OSMR5 _PXAREG(0x40A00084) #define OSMR6 _PXAREG(0x40A00088) #define OSMR7 _PXAREG(0x40A0008C) #define OSMR8 _PXAREG(0x40A00090) #define OSMR9 _PXAREG(0x40A00094) #define OSMR10 _PXAREG(0x40A00098) #define OSMR11 _PXAREG(0x40A0009C) #define OMCR4 _PXAREG(0x40A000C0) /* OS Match Control 4-7 registers 22-9 */ #define OMCR5 _PXAREG(0x40A000C4) #define OMCR6 _PXAREG(0x40A000C8) #define OMCR7 _PXAREG(0x40A000CC) #define OMCR8 _PXAREG(0x40A000D0) /* OS Match Control 8 register 22-11 */ #define OMCR9 _PXAREG(0x40A000D4) /* OS Match Control 9 register 22-13 */ #define OMCR10 _PXAREG(0x40A000D8) /* OS Match Control 10 register 22-11 */ #define OMCR11 _PXAREG(0x40A000DC) /* OS Match Control 11 register 22-13 */ // OS Timer Register Shortcuts #define OSCR(_ch) *(((_ch) == 0) ? (&OSCR0) : (&_PXAREG_OFFSET(&OSCR4,(((_ch) - 4) << 2)))) #define OSMR(_ch) *(((_ch) < 4) ? (&_PXAREG_OFFSET(&OSMR0,((_ch) << 2))) \ : (&_PXAREG_OFFSET(&OSMR4,(((_ch) - 4) << 2)))) #define OMCR(_ch) _PXAREG_OFFSET(&OMCR4,(((_ch) - 4) << 2)) #define OMCR_N (1 << 9) /* Channel 9 & 11 Snapshot Mode */ #define OMCR_C (1 << 7) /* Channel 4-7 Match Against */ #define OMCR_P (1 << 6) /* Periodic Timer */ #define OMCR_S_NONE (0 << 4) /* No External Sync */ #define OMCR_S_EXT_SYNC_0 (1 << 4) /* Ext Sync Reset OSCRx on rising edge EXT_SYNC<0> */ #define OMCR_S_EXT_SYNC_1 (2 << 4) /* Ext Sync Reset OSCRx on rising edge EXT_SYNC<1> */ #define OMCR_R (1 << 3) /* Match Reset on match */ #define OMCR_CRES(_x) ((((_x) & 0x8) << 5) | (((_x) & 0x7) << 0)) /* Match counter resolution */ #define OWER_WME (1 << 0) /* Watchdog Match Enable */ #define OIER_E11 (1 << 11) /* Interrupt enable channel 11 */ #define OIER_E10 (1 << 10) /* Interrupt enable channel 10 */ #define OIER_E9 (1 << 9) /* Interrupt enable channel 9 */ #define OIER_E8 (1 << 8) /* Interrupt enable channel 8 */ #define OIER_E7 (1 << 7) /* Interrupt enable channel 7 */ #define OIER_E6 (1 << 6) /* Interrupt enable channel 6 */ #define OIER_E5 (1 << 5) /* Interrupt enable channel 5 */ #define OIER_E4 (1 << 4) /* Interrupt enable channel 4 */ #define OIER_E3 (1 << 3) /* Interrupt enable channel 3 */ #define OIER_E2 (1 << 2) /* Interrupt enable channel 2 */ #define OIER_E1 (1 << 1) /* Interrupt enable channel 1 */ #define OIER_E0 (1 << 0) /* Interrupt enable channel 0 */ #define OSSR_M11 (1 << 11) /* Match status channel 11 */ #define OSSR_M10 (1 << 10) /* Match status channel 10 */ #define OSSR_M9 (1 << 9) /* Match status channel 9 */ #define OSSR_M8 (1 << 8) /* Match status channel 8 */ #define OSSR_M7 (1 << 7) /* Match status channel 7 */ #define OSSR_M6 (1 << 6) /* Match status channel 6 */ #define OSSR_M5 (1 << 5) /* Match status channel 5 */ #define OSSR_M4 (1 << 4) /* Match status channel 4 */ #define OSSR_M3 (1 << 3) /* Match status channel 3 */ #define OSSR_M2 (1 << 2) /* Match status channel 2 */ #define OSSR_M1 (1 << 1) /* Match status channel 1 */ #define OSSR_M0 (1 << 0) /* Match status channel 0 */ /******************************************************************************/ /* Pulse-Width Modulation */ /******************************************************************************/ #define PWMCR0 _PXAREG(0x40B00000) /* PWM 0 Control register 23-7 */ #define PWMDCR0 _PXAREG(0x40B00004) /* PWM 0 Duty Cycle register 23-8 */ #define PWMPCR0 _PXAREG(0x40B00008) /* PWM 0 Period register 23-9 */ #define PWMCR2 _PXAREG(0x40B00010) /* PWM 2 Control register 23-7 */ #define PWMDCR2 _PXAREG(0x40B00014) /* PWM 2 Duty Cycle register 23-8 */ #define PWMPCR2 _PXAREG(0x40B00018) /* PWM 2 Period register 23-9 */ #define PWMCR1 _PXAREG(0x40C00000) /* PWM 1 Control register 23-7 */ #define PWMDCR1 _PXAREG(0x40C00004) /* PWM 1 Duty Cycle register 23-8 */ #define PWMPCR1 _PXAREG(0x40C00008) /* PWM 1 Period register 23-9 */ #define PWMCR3 _PXAREG(0x40C00010) /* PWM 3 Control register 23-7 */ #define PWMDCR3 _PXAREG(0x40C00014) /* PWM 3 Duty Cycle register 23-8 */ #define PWMPCR3 _PXAREG(0x40C00018) /* PWM 3 Period register 23-9 */ /******************************************************************************/ /* Interrupt Controller */ /******************************************************************************/ #define ICIP _PXAREG(0x40D00000) /* Interrupt Controller IRQ Pending register 25-11 */ #define ICMR _PXAREG(0x40D00004) /* Interrupt Controller Mask register 25-20 */ #define ICLR _PXAREG(0x40D00008) /* Interrupt Controller Level register 25-24 */ #define ICFP _PXAREG(0x40D0000C) /* Interrupt Controller FIQ Pending register 25-15 */ #define ICPR _PXAREG(0x40D00010) /* Interrupt Controller Pending register 25-6 */ #define ICCR _PXAREG(0x40D00014) /* Interrupt Controller Control register 25-27 */ #define ICHP _PXAREG(0x40D00018) /* Interrupt Controller Highest Priority register 25-30 */ #define IPR(_x) _PXAREG_OFFSET(0x40D0001C,(((_x) & 0x1F) << 2)) /* Interupt Priority Registers 25-29 */ #define ICIP2 _PXAREG(0x40D0009C) /* Interrupt Controller IRQ Pending register 2 25-10 */ #define ICMR2 _PXAREG(0x40D000A0) /* Interrupt Controller Mask register 2 25-23 */ #define ICLR2 _PXAREG(0x40D000A4) /* Interrupt Controller Level register 2 25-27 */ #define ICFP2 _PXAREG(0x40D000A8) /* Interrupt Controller FIQ Pending register 2 25-19 */ #define ICPR2 _PXAREG(0x40D000AC) /* Interrupt Controller Pending register 2 25-6 */ #define IPR_VALID (1 << 31) #define ICCR_DIM (1 << 0) // Interrupt Controller Shortcuts // Argument _id is a peripheral ID number #define _PPID_Bit(_id) (1 << ((_id) & 0x1f)) #define _ICIP(_id) *(((_id) & 0x20) ? (&ICIP2) : (&ICIP)) #define _ICMR(_id) *(((_id) & 0x20) ? (&ICMR2) : (&ICMR)) #define _ICLR(_id) *(((_id) & 0x20) ? (&ICLR2) : (&ICLR)) #define _ICFP(_id) *(((_id) & 0x20) ? (&ICFP2) : (&ICFP)) #define _ICPR(_id) *(((_id) & 0x20) ? (&ICPR2) : (&ICPR)) // Peripheral IDs #define PPID_CIF (33) /* Quick Capture Interface */ #define PPID_RTC_AL (31) /* RTC Alarm */ #define PPID_RTC_HZ (30) /* RTC 1 Hz Clock */ #define PPID_OST_3 (29) /* OS Timer 3 */ #define PPID_OST_2 (28) /* OS Timer 2 */ #define PPID_OST_1 (27) /* OS Timer 1 */ #define PPID_OST_0 (26) /* OS Timer 0 */ #define PPID_DMAC (25) /* DMA Controller */ #define PPID_SSP1 (24) /* SSP 1 */ #define PPID_MMC (23) /* Flash Card Interface/MMC */ #define PPID_FFUART (22) /* FFUART */ #define PPID_BTUART (21) /* BTUART */ #define PPID_STUART (20) /* STUART */ #define PPID_ICP (19) /* Infrared Comm. Port*/ #define PPID_I2C (18) /* I2C */ #define PPID_LCD (17) /* LCD */ #define PPID_SSP2 (16) /* SSP 2 */ #define PPID_USIM (15) /* SmartCard Interface */ #define PPID_AC97 (14) /* AC '97 */ #define PPID_I2S (13) /* I2S */ #define PPID_PMU (12) /* Performance Monitor */ #define PPID_USBC (11) /* USB Client */ #define PPID_GPIO_X (10) /* GPIO except GPIO<1> or GPIO<0> */ #define PPID_GPIO_1 (9) /* GPIO<1> */ #define PPID_GPIO_0 (8) /* GPIO<0> */ #define PPID_OST_4_11 (7) /* OS Timer Channel 4 - 11 */ #define PPID_PWR_I2C (6) /* Power I2C */ #define PPID_MEM_STK (5) /* Memory Stick*/ #define PPID_KEYPAD (4) /* Keypad */ #define PPID_USBH1 (3) /* USB Host 1 */ #define PPID_USBH2 (2) /* USB Host 2 */ #define PPID_MSL (1) /* MSL */ #define PPID_SSP3 (0) /* SSP 3 */ /******************************************************************************/ /* General-Purpose I/O (GPIO) Controller */ /******************************************************************************/ #define GPLR0 _PXAREG(0x40E00000) /* GPIO Pin-Level register GPIO<31:0> 24-28 */ #define GPLR1 _PXAREG(0x40E00004) /* GPIO Pin-Level register GPIO<63:32> 24-28 */ #define GPLR2 _PXAREG(0x40E00008) /* GPIO Pin-Level register GPIO<95:64> 24-28 */ #define GPDR0 _PXAREG(0x40E0000C) /* GPIO Pin Direction register GPIO<31:0> 24-11 */ #define GPDR1 _PXAREG(0x40E00010) /* GPIO Pin Direction register GPIO<63:32> 24-11 */ #define GPDR2 _PXAREG(0x40E00014) /* GPIO Pin Direction register GPIO<95:64> 24-11 */ #define GPSR0 _PXAREG(0x40E00018) /* GPIO Pin Output Set register GPIO<31:0> 24-14 */ #define GPSR1 _PXAREG(0x40E0001C) /* GPIO Pin Output Set register GPIO<63:32> 24-14 */ #define GPSR2 _PXAREG(0x40E00020) /* GPIO Pin Output Set register GPIO<95:64> 24-14 */ #define GPCR0 _PXAREG(0x40E00024) /* GPIO Pin Output Clear register GPIO<31:0> 24-14 */ #define GPCR1 _PXAREG(0x40E00028) /* GPIO Pin Output Clear register GPIO <63:32> 24-14 */ #define GPCR2 _PXAREG(0x40E0002C) /* GPIO pin Output Clear register GPIO <95:64> 24-14 */ #define GRER0 _PXAREG(0x40E00030) /* GPIO Rising-Edge Detect Enable register GPIO<31:0> 24-18 */ #define GRER1 _PXAREG(0x40E00034) /* GPIO Rising-Edge Detect Enable register GPIO<63:32> 24-18 */ #define GRER2 _PXAREG(0x40E00038) /* GPIO Rising-Edge Detect Enable register GPIO<95:64> 24-18 */ #define GFER0 _PXAREG(0x40E0003C) /* GPIO Falling-Edge Detect Enable register GPIO<31:0> 24-18 */ #define GFER1 _PXAREG(0x40E00040) /* GPIO Falling-Edge Detect Enable register GPIO<63:32> 24-18 */ #define GFER2 _PXAREG(0x40E00044) /* GPIO Falling-Edge Detect Enable register GPIO<95:64> 24-18 */ #define GEDR0 _PXAREG(0x40E00048) /* GPIO Edge Detect Status register GPIO<31:0> 24-30 */ #define GEDR1 _PXAREG(0x40E0004C) /* GPIO Edge Detect Status register GPIO<63:32> 24-30 */ #define GEDR2 _PXAREG(0x40E00050) /* GPIO Edge Detect Status register GPIO<95:64> 24-30 */ #define GAFR0_L _PXAREG(0x40E00054) /* GPIO Alternate Function register GPIO<15:0> 24-23 */ #define GAFR0_U _PXAREG(0x40E00058) /* GPIO Alternate Function register GPIO<31:16> 24-23 */ #define GAFR1_L _PXAREG(0x40E0005C) /* GPIO Alternate Function register GPIO<47:32> 24-23 */ #define GAFR1_U _PXAREG(0x40E00060) /* GPIO Alternate Function register GPIO<63:48> 24-23 */ #define GAFR2_L _PXAREG(0x40E00064) /* GPIO Alternate Function register GPIO<79:64> 24-23 */ #define GAFR2_U _PXAREG(0x40E00068) /* GPIO Alternate Function register GPIO <95:80> 24-23 */ #define GAFR3_L _PXAREG(0x40E0006C) /* GPIO Alternate Function register GPIO<111:96> 24-23 */ #define GAFR3_U _PXAREG(0x40E00070) /* GPIO Alternate Function register GPIO<120:112> 24-23 */ #define GPLR3 _PXAREG(0x40E00100) /* GPIO Pin-Level register GPIO<120:96> 24-28 */ #define GPDR3 _PXAREG(0x40E0010C) /* GPIO Pin Direction register GPIO<120:96> 24-11 */ #define GPSR3 _PXAREG(0x40E00118) /* GPIO Pin Output Set register GPIO<120:96> 24-14 */ #define GPCR3 _PXAREG(0x40E00124) /* GPIO Pin Output Clear register GPIO<120:96> 24-14 */ #define GRER3 _PXAREG(0x40E00130) /* GPIO Rising-Edge Detect Enable register GPIO<120:96> 24-18 */ #define GFER3 _PXAREG(0x40E0013C) /* GPIO Falling-Edge Detect Enable register GPIO<120:96> 24-18 */ #define GEDR3 _PXAREG(0x40E00148) /* GPIO Edge Detect Status register GPIO<120:96> 24-18 */ // GPIO Shortcuts #define GPLR(_gpio) *(((_gpio) < 96) ? (&_PXAREG_OFFSET(&GPLR0, ((_gpio) & 0x60) >> 3)) : (&GPLR3)) #define GPDR(_gpio) *(((_gpio) < 96) ? (&_PXAREG_OFFSET(&GPDR0, ((_gpio) & 0x60) >> 3)) : (&GPDR3)) #define GPSR(_gpio) *(((_gpio) < 96) ? (&_PXAREG_OFFSET(&GPSR0, ((_gpio) & 0x60) >> 3)) : (&GPSR3)) #define GPCR(_gpio) *(((_gpio) < 96) ? (&_PXAREG_OFFSET(&GPCR0, ((_gpio) & 0x60) >> 3)) : (&GPCR3)) #define GRER(_gpio) *(((_gpio) < 96) ? (&_PXAREG_OFFSET(&GRER0, ((_gpio) & 0x60) >> 3)) : (&GRER3)) #define GFER(_gpio) *(((_gpio) < 96) ? (&_PXAREG_OFFSET(&GFER0, ((_gpio) & 0x60) >> 3)) : (&GFER3)) #define GEDR(_gpio) *(((_gpio) < 96) ? (&_PXAREG_OFFSET(&GEDR0, ((_gpio) & 0x60) >> 3)) : (&GEDR3)) #define GAFR(_gpio) (_PXAREG_OFFSET(0x40E00054, ((_gpio) & 0x70) >> 2)) // These provide the correct bit/function placement in a SINGLE register #define _GPIO_bit(_gpio) (1 << ((_gpio) & 0x1f)) #define _GPIO_fn(_gpio,_fn) ((_fn) << (((_gpio) & 0x0f) << 1)) #define _GPIO_setaltfn(_gp,_fn) \ GAFR((_gp)) = ((GAFR((_gp)) & ~(_GPIO_fn((_gp),3))) | (_GPIO_fn((_gp),(_fn)))) #define _GPIO_getaltfun(_gp) \ ((GAFR((_gp)) & (_GPIO_fn((_gp),0x3))) >> (((_gp) & 0x0f) << 1)) #define GPIO_OUT 1 #define GPIO_IN 0 #define _PXA_setaltfn(_gp,_fn,_dir) \ { GPDR(_gp) = (_dir==GPIO_OUT)? (GPDR(_gp) | _GPIO_bit(_gp)) : (GPDR(_gp) & ~_GPIO_bit(_gp)); _GPIO_setaltfn(_gp,_fn);} #define _PXA_setgpio(_gp) \ {GPSR(_gp) = _GPIO_bit(_gp);} #define _PXA_clrgpio(_gp) \ {GPCR(_gp) = _GPIO_bit(_gp);} /******************************************************************************/ /* Power Manager and Reset Control */ /******************************************************************************/ #define PMCR _PXAREG(0x40F00000) /* Power Manager Control register 3-67 */ #define PSSR _PXAREG(0x40F00004) /* Power Manager Sleep Status register 3-69 */ #define PSPR _PXAREG(0x40F00008) /* Power Manager Scratch Pad register 3-72 */ #define PWER _PXAREG(0x40F0000C) /* Power Manager Wake-Up Enable register 3-73 */ #define PRER _PXAREG(0x40F00010) /* Power Manager Rising-Edge Detect Enable register 3-76 */ #define PFER _PXAREG(0x40F00014) /* Power Manager Falling-Edge Detect Enable register 3-77 */ #define PEDR _PXAREG(0x40F00018) /* Power Manager Edge-Detect Status register 3-78 */ #define PCFR _PXAREG(0x40F0001C) /* Power Manager General Configuration register 3-79 */ #define PGSR0 _PXAREG(0x40F00020) /* Power Manager GPIO Sleep State register for GPIO<31:0> 3-82 */ #define PGSR1 _PXAREG(0x40F00024) /* Power Manager GPIO Sleep State register for GPIO<63:32> 3-82 */ #define PGSR2 _PXAREG(0x40F00028) /* Power Manager GPIO Sleep State register for GPIO<95:64> 3-82 */ #define PGSR3 _PXAREG(0x40F0002C) /* Power Manager GPIO Sleep State register for GPIO<120:96> 3-82 */ #define RCSR _PXAREG(0x40F00030) /* Reset Controller Status register 3-83 */ #define PSLR _PXAREG(0x40F00034) /* Power Manager Sleep Configuration register 3-84 */ #define PSTR _PXAREG(0x40F00038) /* Power Manager Standby Configuration register 3-87 */ #define PVCR _PXAREG(0x40F00040) /* Power Manager Voltage Change Control register 3-88 */ #define PUCR _PXAREG(0x40F0004C) /* Power Manager USIM Card Control/Status register 3-89 */ #define PKWR _PXAREG(0x40F00050) /* Power Manager Keyboard Wake-Up Enable register 3-91 */ #define PKSR _PXAREG(0x40F00054) /* Power Manager Keyboard Level-Detect Status register 3-92 */ #define PCMD(_x) _PXAREG_OFFSET(0x40F00080,((_x) << 2)) /* Power Manager I2C Command Register File */ #define PMCR_INTRS (1 << 5) /* Interrupt Status */ #define PMCR_IAS (1 << 4) /* Interrupt/Abort Select */ #define PMCR_VIDAS (1 << 3) /* Imprecise-Data-Abort Status for nVDD_FAULT */ #define PMCR_VIDAE (1 << 2) /* Imprecise-Data-Abort Enable for nVDD_FAULT */ #define PMCR_BIDAS (1 << 1) /* Imprecise-Data-Abort Status for nBATT_FAULT */ #define PMCR_BIDAE (1 << 0) /* Imprecise-Data-Abort Enable for nBATT_FAULT */ #define PSSR_OTGPH (1 << 6) /* OTG Peripheral Control Hold */ #define PSSR_RDH (1 << 5) /* Read Disable Hold */ #define PSSR_PH (1 << 4) /* Peripheral Control Hold */ #define PSSR_STS (1 << 3) /* Standby Mode Status */ #define PSSR_VFS (1 << 2) /* VDD Fault Status */ #define PSSR_BFS (1 << 1) /* Battery Fault Status */ #define PSSR_SSS (1 << 0) /* Software Sleep Status */ #define PWER_WERTC (1 << 31) /* Wake-up Enable for RTC Standby, Sleep or Deep-Sleep Mode */ #define PWER_WEP1 (1 << 30) /* Wake-up Enable for PI Power Domain Standby or Deep-Sleep Mode */ #define PWER_WEUSBH2 (1 << 28) /* Wake-up Enable for USB Host Port 2 Standby or Sleep Mode */ #define PWER_WEUSBH1 (1 << 27) /* Wake-up Enable for USB Host Port 1 Standby or Sleep Mode */ #define PWER_WEUSBC (1 << 26) /* Wake-up Enable for USB Client Port Standby or Sleep Mode */ #define PWER_WBB (1 << 25) /* Wake-up Enable for a Rising Edge from MSL or Sleep Mode */ #define PWER_WE35 (1 << 24) /* Wake-up Enable for GPIO<35> for Standby or Sleep Mode */ #define PWER_WEUSIM (1 << 23) /* Wake-up Enable for Rising or Falling Edge from UDET for Standby or Sleep Mode */ #define PWER_WEMUX3_GPIO31 (1 << 19) /* Wake-up Enable due to GPIO<31> for Standby and Sleep Modes */ #define PWER_WEMUX3_GPIO113 (2 << 19) /* Wake-up Enable due to GPIO<113> for Standby and Sleep Modes */ #define PWER_WEMUX2_GPIO38 (0x2 << 16) /* Wake-up Enable due to GPIO<38> for Standby and Sleep Modes */ #define PWER_WEMUX2_GPIO53 (0x3 << 16) /* Wake-up Enable due to GPIO<53> for Standby and Sleep Modes */ #define PWER_WEMUX2_GPIO40 (0x4 << 16) /* Wake-up Enable due to GPIO<40> for Standby and Sleep Modes */ #define PWER_WEMUX2_GPIO36 (0x5 << 15) /* Wake-up Enable due to GPIO<36> for Standby and Sleep Modes */ #define PWER_WE15 (1 << 15) /* Wake-up Enables for GPIO for Standby or Sleep Mode */ #define PWER_WE14 (1 << 14) #define PWER_WE13 (1 << 13) #define PWER_WE12 (1 << 12) #define PWER_WE11 (1 << 11) #define PWER_WE10 (1 << 10) #define PWER_WE9 (1 << 9) #define PWER_WE4 (1 << 4) #define PWER_WE3 (1 << 3) #define PWER_WE1 (1 << 1) #define PWER_WE0 (1 << 0) #define PRER_RE1 (1 << 1) #define PFER_RE1 (1 << 1) #define PCFR_RO (1 << 15) /* RDH Override */ #define PCFR_PO (1 << 14) /* PH Override */ #define PCFR_GPROD (1 << 12) /* GPIO nRESET_OUT Disable */ #define PCFR_L1_EN (1 << 11) /* Sleep MOde/Deep-Sleep Linear Regulator Enable */ #define PCFR_FVC (1 << 10) /* Frequency/Voltage Change */ #define PCFR_DC_EN (1 << 7) /* Sleep/Deep-sleep DC-DC Converter Enable */ #define PCFR_PI2C_EN (1 << 6) /* Power Manager I2C Enable */ #define PCFR_GPR_EN (1 << 4) /* nRESET_GPIO Pin Enable */ #define PCFR_FS (1 << 2) /* Float Static Chip Selects During Sleep Mode */ #define PCFR_FP (1 << 1) /* Float PC Card Pins During Sleep or Deep-Sleep Mode */ #define PCFR_OPDE (1 << 0) /* 13MHz Processor Oscillator Power-Down Enable */ #define RCSR_GPR (1 << 3) /* GPIO Reset */ #define RCSR_SMR (1 << 2) /* Sleep Mode */ #define RCSR_WDR (1 << 1) /* Watchdog Reset */ #define RCSR_HWR (1 << 0) /* Hardware Reset */ #define PCMD_MBC (1 << 12) /* Multi-Byte Command */ #define PCMD_DCE (1 << 11) /* Delay Command Execution */ #define PCMD_LC (1 << 10) /* Last command */ #define PCMD_SQC_CONT (0 << 8) /* Sequence Configuration Continue */ #define PCMD_SQC_PAUSE (1 << 8) /* Sequence Configuration Pause */ #define PCMD_DATA(_x) (((_x) & 0xFF)) /* Command Data */ #define PSLR_SYS_DEL(_x) (((_x) & 0xf) << 28) /* High voltage ramp delay */ #define PSLR_PWR_DEL(_x) (((_x) & 0xf) << 24) /* Low voltage ramp delay */ #define PSLR_PSSD (1 << 23) /* Shorten wake-up delay */ #define PSLR_IVF (1 << 22) /* Ignore VDD_FAULT */ #define PSLR_SL_ROD (1 << 20) /* Don't assert nRESET_OUT */ #define PSLR_SL_R3 (1 << 11) /* SRAM bank 3 retains state */ #define PSLR_SL_R2 (1 << 10) /* SRAM bank 2 retains state */ #define PSLR_SL_R1 (1 << 9) /* SRAM bank 1 retains state */ #define PSLR_SL_R0 (1 << 8) /* SRAM bank 0 retains state */ #define PSLR_SL_PI(_x) (((_x) & 0x3) << 2) /* PI power domain */ #define PWRMODE_M_NORMAL (0) #define PWRMODE_M_IDLE (1) #define PWRMODE_M_STANDBY (2) #define PWRMODE_M_SLEEP (3) #define PWRMODE_M_DEEPSLEEP (4) #define PWRMODE_VC (1 << 3) /* Voltage Change */ /******************************************************************************/ /* Power Manager I2C */ /******************************************************************************/ #define PIBMR _PXAREG(0x40F00180) /* Power Manager I2C Bus Monitor register 9-30 */ #define PIDBR _PXAREG(0x40F00188) /* Power Manager I2C Data Buffer register 9-29 */ #define PICR _PXAREG(0x40F00190) /* Power Manager I2C Control register 9-23 */ #define PISR _PXAREG(0x40F00198) /* Power Manager I2C Status register 9-26 */ #define PISAR _PXAREG(0x40F001A0) /* Power Manager I2C Slave Address register 9-28 */ /******************************************************************************/ /* Synchronous Serial Port 1 */ /******************************************************************************/ #define SSCR0_1 _PXAREG(0x41000000) /* SSP 1 Control register 0 8-25 */ #define SSCR1_1 _PXAREG(0x41000004) /* SSP 1 Control register 1 8-29 */ #define SSSR_1 _PXAREG(0x41000008) /* SSP 1 Status register 8-43 */ #define SSITR_1 _PXAREG(0x4100000C) /* SSP 1 Interrupt Test register 8-42 */ #define SSDR_1 _PXAREG(0x41000010) /* SSP 1 Data Write register/Data Read register 8-48 */ #define SSTO_1 _PXAREG(0x41000028) /* SSP 1 Time-Out register 8-41 */ #define SSPSP_1 _PXAREG(0x4100002C) /* SSP 1 Programmable Serial Protocol 8-39 */ #define SSTSA_1 _PXAREG(0x41000030) /* SSP1 TX Timeslot Active register 8-48 */ #define SSRSA_1 _PXAREG(0x41000034) /* SSP1 RX Timeslot Active register 8-49 */ #define SSTSS_1 _PXAREG(0x41000038) /* SSP1 Timeslot Status register 8-50 */ #define SSACD_1 _PXAREG(0x4100003C) /* SSP1 Audio Clock Divider register 8-51 */ // SSP Bit positions. THESE ARE ALSO VALID FOR SSP2 AND SSP3 #define SSCR0_MOD (1 << 31) /* Mode Network Mode Enable */ #define SSCR0_ACS (1 << 30) /* Audio Clock Select */ #define SSCR0_FRDC(_x) (((_x) & 0x7) << 24) /* Frame Rate Divider Control value */ #define SSCR0_TIM (1 << 23) /* Transmit FIFO underrun interrupt mask */ #define SSCR0_RIM (1 << 22) /* Receive FIFO overrun interrupt mask */ #define SSCR0_NCS (1 << 21) /* Network Clock select */ #define SSCR0_EDSS (1 << 20) /* Extended Data Size select */ #define SSCR0_SCR(_x) (((_x) & 0xFFF) << 8) /* Serial Clock Rate */ #define SSCR0_SSE (1 << 7) /* Synchronous Serial Enable */ #define SSCR0_ECS (1 << 6) /* External Clock select */ #define SSCR0_FRF(_x) (((_x) & 0x3) << 4) /* Frame Format */ #define SSCR0_DSS(_x) (((_x) & 0xF) << 0) /* Data Size Select */ #define SSCR1_TTELP (1 << 31) /* TXD Tristate Enable on Last Phase */ #define SSCR1_TTE (1 << 30) /* TXD Tristate Enable */ #define SSCR1_EBCEI (1 << 29) /* Enable Bit Count Error Interrupt */ #define SSCR1_SCFR (1 << 28) /* Slave clock Free Running */ #define SSCR1_ECRA (1 << 27) /* Enable Clock Request A */ #define SSCR1_ECRB (1 << 26) /* Enable Clock Request B */ #define SSCR1_SCLKDIR (1 << 25) /* SSPSCLKx Direction */ #define SSCR1_SFRMDIR (1 << 24) /* SSP Frame Direction */ #define SSCR1_RWOT (1 << 23) /* Receive Without Transmit */ #define SSCR1_TRAIL (1 << 22) /* Trailing Byte DMA based */ #define SSCR1_TSRE (1 << 21) /* Transmit Service Req Enable */ #define SSCR1_RSRE (1 << 20) /* Receive Service Req. Enable */ #define SSCR1_TINTE (1 << 19) /* Receiver Time-Out Interupt Enable */ #define SSCR1_PINTE (1 << 18) /* Peripheral Trailing Byte Interrupt Enable */ #define SSCR1_IFS (1 << 16) /* Invert Frame Signal */ #define SSCR1_STRF (1 << 15) /* Select FIFO for EFWR */ #define SSCR1_EFWR (1 << 14) /* Enable FIFO Write-Read */ #define SSCR1_RFT(_x) (((_x) & 0xF) << 10) /* Receive FIFO Threshold */ #define SSCR1_TFT(_x) (((_x) & 0xF) << 6) /* Transmit FIFO Threshold */ #define SSCR1_MWDS (1 << 5) /* Microwire Transmit Data Size */ #define SSCR1_SPH (1 << 4) /* Motorola SPI SSPSCLKx Phase */ #define SSCR1_SPO (1 << 3) /* Motorola SPI SSPSCLKx Polarity */ #define SSCR1_LBM (1 << 2) /* Loop-back mode */ #define SSCR1_TIE (1 << 1) /* Transmit FIFO Interrupt Enable */ #define SSCR1_RIE (1 << 0) /* Receive FIFO Interrupt Enable */ #define SSSR_BCE (1 << 23) /* Bit Count Error */ #define SSSR_CSS (1 << 22) /* Clock Synch Status */ #define SSSR_TUR (1 << 21) /* Transmit FIFO Underrun */ #define SSSR_EOC (1 << 20) /* End of Chain */ #define SSSR_TINT (1 << 19) /* Time-out Interrupt */ #define SSSR_PINT (1 << 18) /* Peripheral Trailing Byte Interrupt */ #define SSSR_RFL ((0xf) << 12) /* RX FIFO Level */ #define SSSR_TFL ((0xf) << 8) /* TX FIFO Level */ #define SSSR_ROR (1 << 7) /* RX FIFO Overrun */ #define SSSR_RFS (1 << 6) /* Receive FIFO Service */ #define SSSR_TFS (1 << 5) /* Transmit FIFO Service */ #define SSSR_BSY (1 << 4) /* SSP Port Busy */ #define SSSR_RNE (1 << 3) /* RX FIFO Not Empty */ #define SSSR_TNF (1 << 2) /* TX FIFO Not Full */ #define SSPSP_FSRT (1 << 25) /* Frame Sync Relative Timing */ #define SSPSP_DMYSTOP(_x) (((_x) & 0x3) << 23) /* Dummy Stop */ #define SSPSP_SFRMWDTH(_x) (((_x) & 0x3F) << 16) /* Serial Frame width*/ #define SSPSP_SFRMDLY(_x) (((_x) & 0x7F) << 9) /* Serial Frame delay*/ #define SSPSP_DMYSTRT(_x) (((_x) & 0x3) << 7) /* Dummy Start*/ #define SSPSP_STRTDLY(_x) (((_x) & 0x7) << 4) /* Start Delay*/ #define SSPSP_ETDS (1 << 3) /* End-of-Transfer Data State*/ #define SSPSP_SFRMP (1 << 2) /* Serial Frame Polarity */ #define SSPSP_SCMODE(_x) (((_x) & 0x3)) /* Serial Bit-Rate Clock mode*/ #define SSACD_ACPS(_x) (((_x) & 0x7) << 4) /* Audio Clock PLL Select */ #define SSACD_SCDB (1 << 3) /* Audio Clock PLL Select */ #define SSACD_ACDS(_x) (((_x) & 0x7)) /* Audio Clock Divider Select */ /******************************************************************************/ /* MultiMediaCard/SD/SDIO Controller */ /******************************************************************************/ #define MMC_STRPCL _PXAREG(0x41100000) /* MMC Clock Start/Stop register 15-28 */ #define MMC_STAT _PXAREG(0x41100004) /* MMC Status register 15-28 */ #define MMC_CLKRT _PXAREG(0x41100008) /* MMC Clock Rate register 15-30 */ #define MMC_SPI _PXAREG(0x4110000C) /* MMC SPI Mode register 15-30 */ #define MMC_CMDAT _PXAREG(0x41100010) /* MMC Command/Data register 15-31 */ #define MMC_RESTO _PXAREG(0x41100014) /* MMC Response Time-Out register 15-33 */ #define MMC_RDTO _PXAREG(0x41100018) /* MMC Read Time-Out register 15-33 */ #define MMC_BLKLEN _PXAREG(0x4110001C) /* MMC Block Length register 15-34 */ #define MMC_NUMBLK _PXAREG(0x41100020) /* MMC Number of Blocks register 15-34 */ #define MMC_PRTBUF _PXAREG(0x41100024) /* MMC Buffer Partly Full register 15-35 */ #define MMC_I_MASK _PXAREG(0x41100028) /* MMC Interrupt Mask register 15-35 */ #define MMC_I_REG _PXAREG(0x4110002C) /* MMC Interrupt Request register 15-37 */ #define MMC_CMD _PXAREG(0x41100030) /* MMC Command register 15-40 */ #define MMC_ARGH _PXAREG(0x41100034) /* MMC Argument High register 15-40 */ #define MMC_ARGL _PXAREG(0x41100038) /* MMC Argument Low register 15-41 */ #define MMC_RES _PXAREG(0x4110003C) /* MMC Response FIFO 15-41 */ #define MMC_RXFIFO _PXAREG(0x41100040) /* MMC Receive FIFO 15-41 */ #define MMC_TXFIFO _PXAREG(0x41100044) /* MMC Transmit FIFO 15-42 */ #define MMC_RDWAIT _PXAREG(0x41100048) /* MMC RD_WAIT register 15-42 */ #define MMC_BLKS_REM _PXAREG(0x4110004C) /* MMC Blocks Remaining register 15-43 */ /******************************************************************************/ /* Clocks Manager */ /******************************************************************************/ #define CCCR _PXAREG(0x41300000) /* Core Clock Configuration register 3-94 */ #define CKEN _PXAREG(0x41300004) /* Clock Enable register 3-97 */ #define OSCC _PXAREG(0x41300008) /* Oscillator Configuration register 3-98 */ #define CCSR _PXAREG(0x4130000C) /* Core Clock Status register 3-100 */ #define CCCR_CPDIS (1 << 31) /* Core PLL Output Disable */ #define CCCR_PPDIS (1 << 30) /* Peripheral PLL Output Disable */ #define CCCR_LCD_26 (1 << 27) /* LCD Clock Frequency in Deep-Idle or 13M Mode */ #define CCCR_PLL_EARLY_EN (1 << 26) /* Early PLL Enable */ #define CCCR_A (1 << 25) /* Alt. Setting for Memory Controller Clock */ #define CCCR_N_MASK 0x0380 /* Run Mode Frequency to Turbo Mode Frequency Multiplier */ #define CCCR_M_MASK 0x0060 /* Memory Frequency to Run Mode Frequency Multiplier */ #define CCCR_L_MASK 0x001f /* Crystal Frequency to Memory Frequency Multiplier */ #define CCCR_2N(_x) (((_x) & 0xf) << 7) #define CCCR_L(_x) (((_x) & 0x1f)) #define CKEN24_CIF (1 << 24) /* CIF Unit Clock Enable */ #define CKEN23_SSP1 (1 << 23) /* SSP1 Unit Clock Enable */ #define CKEN22_MEMC (1 << 22) /* Memory Controller */ #define CKEN21_MEMS (1 << 21) /* Memory Stick Host Controller */ #define CKEN20_IMEM (1 << 20) /* Internal Memory Clock Enable */ #define CKEN19_KEYP (1 << 19) /* Keypad Interface Clock Enable */ #define CKEN18_USIM (1 << 18) /* USIM Unit Clock Enable */ #define CKEN17_MSL (1 << 17) /* MSL Inteface Unit Enable */ #define CKEN16_LCD (1 << 16) /* LCD Unit Clock Enable */ #define CKEN15_PMI2C (1 << 15) /* Pomer Manager I2C Unit Clock Enable */ #define CKEN14_I2C (1 << 14) /* I2C Unit Clock Enable */ #define CKEN13_IR (1 << 13) /* Infrared Port Clock Enable */ #define CKEN12_MMC (1 << 12) /* MMC Unit Clock Enable */ #define CKEN11_USBC (1 << 11) /* USB Unit Clock Enable */ #define CKEN10_USBH (1 << 10) /* USB Unit Clock Enable */ #define CKEN9_OST (1 << 9) /* USB Unit Clock Enable */ #define CKEN8_I2S (1 << 8) /* I2S Unit Clock Enable */ #define CKEN7_BTUART (1 << 7) /* BTUART Unit Clock Enable */ #define CKEN6_FFUART (1 << 6) /* FFUART Unit Clock Enable */ #define CKEN5_STUART (1 << 5) /* STUART Unit Clock Enable */ #define CKEN4_SSP3 (1 << 4) /* SSP3 Unit Clock Enable */ #define CKEN3_SSP2 (1 << 3) /* SSP2 Unit Clock Enable */ #define CKEN2_AC97 (1 << 2) /* AC97 Unit Clock Enable */ #define CKEN1_PWM1 (1 << 1) /* PWM1 Clock Enable */ #define CKEN0_PWM0 (1 << 0) /* PWM0 Clock Enable */ #define OSCC_OSD(_x) (((_x) & 0x3) << 5) /* Processor Oscillator Stabilization Delay */ #define OSCC_CRI (1 << 4) /* Clock Request Input Status */ #define OSCC_PIO_EN (1 << 3) /* 13-MHz Processor Oscillator Output Enable */ #define OSCC_TOUT_EN (1 << 2) /* Timekeeping (32.768kHz) Oscillator Output Enable */ #define OSCC_OON (1 << 1) /* 32.768kHz OON (write-once only bit) */ #define OSCC_OOK (1 << 0) /* 32.768kHz OOK (read-only bit) */ #define CCSR_CPDIS_S (1 << 31) /* Core PLL Output Disable Status */ #define CCSR_PPDIS_S (1 << 30) /* Peripheral PLL Output Disable Status */ #define CCSR_CPLCK (1 << 29) /* Core PLL Lock */ #define CCSR_PPLCK (1 << 28) /* Peripheral PLL Lock */ #define CCSR_2N_S_MASK (0x7 << 7) #define CCSR_L_S_MASK (0x1f << 0) #define CLKCFG_T (1 << 0) /* Turbo mode */ #define CLKCFG_F (1 << 1) /* Frequency change */ #define CLKCFG_HT (1 << 2) /* Half-turbo Mode */ #define CLKCFG_B (1 << 3) /* Fast-bus mode */ /******************************************************************************/ /* Mobile Scalable Link (MSL) Interface */ /******************************************************************************/ #define BBFIFO1 _PXAREG(0x41400004) /* MSL Channel 1 Receive/Transmit FIFO register 16-13 */ #define BBFIFO2 _PXAREG(0x41400008) /* MSL Channel 2 Receive/Transmit FIFO register 16-13 */ #define BBFIFO3 _PXAREG(0x4140000C) /* MSL Channel 3 Receive/Transmit FIFO register 16-13 */ #define BBFIFO4 _PXAREG(0x41400010) /* MSL Channel 4 Receive/Transmit FIFO register 16-13 */ #define BBFIFO5 _PXAREG(0x41400014) /* MSL Channel 5 Receive/Transmit FIFO register 16-13 */ #define BBFIFO6 _PXAREG(0x41400018) /* MSL Channel 6 Receive/Transmit FIFO register 16-13 */ #define BBFIFO7 _PXAREG(0x4140001C) /* MSL Channel 7 Receive/Transmit FIFO register 16-13 */ #define BBCFG1 _PXAREG(0x41400044) /* MSL Channel 1 Configuration register 16-15 */ #define BBCFG2 _PXAREG(0x41400048) /* MSL Channel 2 Configuration register 16-15 */ #define BBCFG3 _PXAREG(0x4140004C) /* MSL Channel 3 Configuration register 16-15 */ #define BBCFG4 _PXAREG(0x41400050) /* MSL Channel 4 Configuration register 16-15 */ #define BBCFG5 _PXAREG(0x41400054) /* MSL Channel 5 Configuration register 16-15 */ #define BBCFG6 _PXAREG(0x41400058) /* MSL Channel 6 Configuration register 16-15 */ #define BBCFG7 _PXAREG(0x4140005C) /* MSL Channel 7 Configuration register 16-15 */ #define BBSTAT1 _PXAREG(0x41400084) /* MSL Channel 1 Status register 16-19 */ #define BBSTAT2 _PXAREG(0x41400088) /* MSL Channel 2 Status register 16-19 */ #define BBSTAT3 _PXAREG(0x4140008C) /* MSL Channel 3 Status register 16-19 */ #define BBSTAT4 _PXAREG(0x41400090) /* MSL Channel 4 Status register 16-19 */ #define BBSTAT5 _PXAREG(0x41400094) /* MSL Channel 5 Status register 16-19 */ #define BBSTAT6 _PXAREG(0x41400098) /* MSL Channel 6 Status register 16-19 */ #define BBSTAT7 _PXAREG(0x4140009C) /* MSL Channel 7 Status register 16-19 */ #define BBEOM1 _PXAREG(0x414000C4) /* MSL Channel 1 EOM register 16-22 */ #define BBEOM2 _PXAREG(0x414000C8) /* MSL Channel 2 EOM register 16-22 */ #define BBEOM3 _PXAREG(0x414000CC) /* MSL Channel 3 EOM register 16-22 */ #define BBEOM4 _PXAREG(0x414000D0) /* MSL Channel 4 EOM register 16-22 */ #define BBEOM5 _PXAREG(0x414000D4) /* MSL Channel 5 EOM register 16-22 */ #define BBEOM6 _PXAREG(0x414000D8) /* MSL Channel 6 EOM register 16-22 */ #define BBEOM7 _PXAREG(0x414000DC) /* MSL Channel 7 EOM register 16-22 */ #define BBIID _PXAREG(0x41400108) /* MSL Interrupt ID register 16-23 */ #define BBFREQ _PXAREG(0x41400110) /* MSL Transmit Frequency Select register 10-6 */ #define BBWAIT _PXAREG(0x41400114) /* MSL Wait Count register 16-24 */ #define BBCST _PXAREG(0x41400118) /* MSL Clock Stop Time register 16-25 */ #define BBWAKE _PXAREG(0x41400140) /* MSL Wake-Up register 16-26 */ #define BBITFC _PXAREG(0x41400144) /* MSL Interface Width register 10-6 */ /******************************************************************************/ /* Keypad Interface */ /******************************************************************************/ #define KPC _PXAREG(0x41500000) /* Keypad Interface Control register 18-12 */ #define KPDK _PXAREG(0x41500008) /* Keypad Interface Direct Key register 18-16 */ #define KPREC _PXAREG(0x41500010) /* Keypad Interface Rotary Encoder Count register 18-17 */ #define KPMK _PXAREG(0x41500018) /* Keypad Interface Matrix Key register 18-18 */ #define KPAS _PXAREG(0x41500020) /* Keypad Interface Automatic Scan register 18-18 */ #define KPASMKP0 _PXAREG(0x41500028) /* Keypad Interface Automatic Scan Multiple Keypress register 0 18-20 */ #define KPASMKP1 _PXAREG(0x41500030) /* Keypad Interface Automatic Scan Multiple Keypress register 1 18-20 */ #define KPASMKP2 _PXAREG(0x41500038) /* Keypad Interface Automatic Scan Multiple Keypress register 2 18-20 */ #define KPASMKP3 _PXAREG(0x41500040) /* Keypad Interface Automatic Scan Multiple Keypress register 3 18-20 */ #define KPKDI _PXAREG(0x41500048) /* Keypad Interface Key Debounce Interval register 18-23 */ /******************************************************************************/ /* Universal Subscriber ID (USIM) Interface */ /******************************************************************************/ #define RBR _PXAREG(0x41600000) /* USIM Receive Buffer register 19-18 */ #define THR _PXAREG(0x41600004) /* USIM Transmit Holding register 19-19 */ #define IER _PXAREG(0x41600008) /* USIM Interrupt Enable register 19-20 */ #define IIR _PXAREG(0x4160000C) /* USIM Interrupt Identification register 19-22 */ #define FCR _PXAREG(0x41600010) /* USIM FIFO Control register 19-24 */ #define FSR _PXAREG(0x41600014) /* USIM FIFO Status register 19-26 */ #define ECR _PXAREG(0x41600018) /* USIM Error Control register 19-27 */ #define LCR _PXAREG(0x4160001C) /* USIM Line Control register 19-29 */ #define USCCR _PXAREG(0x41600020) /* USIM Card Control register 19-31 */ #define LSR _PXAREG(0x41600024) /* USIM Line Status register 19-32 */ #define EGTR _PXAREG(0x41600028) /* USIM Extra Guard Time register 19-34 */ #define BGTR _PXAREG(0x4160002C) /* USIM Block Guard Time register 19-34 */ #define TOR _PXAREG(0x41600030) /* USIM Time-Out register 19-35 */ #define CLKR _PXAREG(0x41600034) /* USIM Clock register 19-36 */ #define DLR _PXAREG(0x41600038) /* USIM Divisor Latch register 19-37 */ #define FLR _PXAREG(0x4160003C) /* USIM Factor Latch register 19-37 */ #define CWTR _PXAREG(0x41600040) /* USIM Character Waiting Time register 19-38 */ #define BWTR _PXAREG(0x41600044) /* USIM Block Waiting Time register 19-39 */ /******************************************************************************/ /* Synchronous Serial Port 2 */ /******************************************************************************/ #define SSCR0_2 _PXAREG(0x41700000) /* SSP2 Control register 0 8-25 */ #define SSCR1_2 _PXAREG(0x41700004) /* SSP 2 Control register 1 8-29 */ #define SSSR_2 _PXAREG(0x41700008) /* SSP 2 Status register 8-43 */ #define SSITR_2 _PXAREG(0x4170000C) /* SSP 2 Interrupt Test register 8-42 */ #define SSDR_2 _PXAREG(0x41700010) /* SSP 2 Data Write register/Data Read register 8-48 */ #define SSTO_2 _PXAREG(0x41700028) /* SSP 2 Time-Out register 8-41 */ #define SSPSP_2 _PXAREG(0x4170002C) /* SSP 2 Programmable Serial Protocol 8-39 */ #define SSTSA_2 _PXAREG(0x41700030) /* SSP2 TX Timeslot Active register 8-48 */ #define SSRSA_2 _PXAREG(0x41700034) /* SSP2 RX Timeslot Active register 8-49 */ #define SSTSS_2 _PXAREG(0x41700038) /* SSP2 Timeslot Status register 8-50 */ #define SSACD_2 _PXAREG(0x4170003C) /* SSP2 Audio Clock Divider register 8-51 */ /******************************************************************************/ /* Memory Stick Host Controller */ /******************************************************************************/ #define MSCMR _PXAREG(0x41800000) /* MSHC Command register 17-8 */ #define MSCRSR _PXAREG(0x41800004) /* MSHC Control and Status register 17-9 */ #define MSINT _PXAREG(0x41800008) /* MSHC Interrupt and Status register 17-10 */ #define MSINTEN _PXAREG(0x4180000C) /* MSHC Interrupt Enable register 17-11 */ #define MSCR2 _PXAREG(0x41800010) /* MSHC Control register 2 17-12 */ #define MSACD _PXAREG(0x41800014) /* MSHC ACD Command register 17-13 */ #define MSRXFIFO _PXAREG(0x41800018) /* MSHC Receive FIFO register 17-14 */ #define MSTXFIFO _PXAREG(0x4180001C) /* MSHC Transmit FIFO register 17-15 */ /******************************************************************************/ /* Synchronous Serial Port 3 */ /******************************************************************************/ #define SSCR0_3 _PXAREG(0x41900000) /* SSP 3 Control register 0 8-25 */ #define SSCR1_3 _PXAREG(0x41900004) /* SSP 3 Control register 1 8-29 */ #define SSSR_3 _PXAREG(0x41900008) /* SSP 3 Status register 8-43 */ #define SSITR_3 _PXAREG(0x4190000C) /* SSP 3 Interrupt Test register 8-42 */ #define SSDR_3 _PXAREG(0x41900010) /* SSP 3 Data Write register/Data Read register 8-48 */ #define SSTO_3 _PXAREG(0x41900028) /* SSP 3 Time-Out register 8-41 */ #define SSPSP_3 _PXAREG(0x4190002C) /* SSP 3 Programmable Serial Protocol 8-39 */ #define SSTSA_3 _PXAREG(0x41900030) /* SSP TX Timeslot Active register 8-48 */ #define SSRSA_3 _PXAREG(0x41900034) /* SSP RX Timeslot Active register 8-49 */ #define SSTSS_3 _PXAREG(0x41900038) /* SSP Timeslot Status register 8-50 */ #define SSACD_3 _PXAREG(0x4190003C) /* SSP Audio Clock Divider register 8-51 */ #endif /* _PXA27X_REGISTER_H */ tinyos-2.1.2+dfsg/tos/chips/pxa27x/pxa27x_util.s000066400000000000000000000203711207233610700214020ustar00rootroot00000000000000 .macro CPWAIT Rd MRC P15, 0, \Rd, C2, C0, 0 @ arbitrary read of CP15 into register Rd MOV \Rd, \Rd @ wait for it (foward dependency) SUB PC, PC, #4 @ branch to next instruction .endm .macro ALLOCATE Rd MCR P15, 0, \Rd, C7, C2, 5 @ perform line allocation based on Rd .endm @@@@@@@@@@@@@@@@@@@@@@@@@ @ to create an assembly function that confirms to AAPCS (or so I think ;o) @ .func function name @ STMFD R13!, {R4 - R12, LR}..alternatively STMFD R13!, {registers used, LR} @ {function body} @ LDMFD R13!, {R4 - R12, PC}...must match above with LR replaced by PC @ .endfunc @@@@@@@@@@@@@@@@@@@@@@@@@@ @whether WT or WB is used is determined in mmu_table.s .extern MMUTable .equ MEMORY_CONFIG_BASE,(0x48000000) .equ FLASH_SYNC_value, (0x25C3<<1) @ Value to set flash into burst 16 sync mode @.equ FLASH_SYNC_value, (0x25C2<<1) @ Value to set flash into burst 8 sync mode .equ FLASH_WRITE,(0x0060) @ Code for writing to flash .equ FLASH_READSTATUS,(0x0070) @ Code for reading status .equ FLASH_WCONF,(0x0003) @ Code to confirm write to flash .equ FLASH_READ,(0x00FF) @ Code to place flash in read mode .equ SXCNFG_sync_value,(0x7011) @ SXCNFG value for burst16 sync flash operation @ .equ SXCNFG_sync_value,(0x6011) @ SXCNFG value for burst8 sync flash operation .equ SXCNFG_offset,(0x1c) .global initMMU .global initSyncFlash .global enableICache .global enableDCache .global disableDCache .global invalidateDCache .global cleanDCache .global globalCleanAndInvalidateDCache initSyncFlash: @this function MUST be called after the ICACHE is initialized to work correctly!!! @also, the DCache being on in WB mode will possibly cause this to randomly FAIL! .func initSyncFlash STMFD R13!, {R4 - R7, LR} ldr r1, =MEMORY_CONFIG_BASE @ Memory config register base ldr r2, =FLASH_SYNC_value @ Value to set into flash RCR register ldr r3, =FLASH_WRITE @ Write to flash instruction ldr r4, =FLASH_WCONF @ Write to flash confirm instruction ldr r5, =FLASH_READ @ Load "read array" mode command ldr r6, =0x0 @ Boot ROM Flash Base address ldr r7, =SXCNFG_sync_value @ SXCNFG Magic number for now b goSyncFlash @align on cache line so that we fetch the next 8 instructions... .align 5 goSyncFlash: @ Now program everything into the Flash and SXCNFG registers str r7, [r1, #SXCNFG_offset] @ Update PXA27x SXCNFG register strh r3, [r2] @ Yes, the data is on the address bus! strh r4, [r2] @ Confirm the write to the RCR strh r5, [r6] @ Place flash back in read mode ldrh r5, [r6] @ Create a data dependency stall to guarantee write nop @ go to the end of the cache line nop nop LDMFD R13!, {R4 - R7, PC} .endfunc @assembly routine to init our MMU initMMU: .func initMMU MRC P15,0,R0,C3,C0,0 @read the domain register into R0 ORR R0, R0, #0xFF @make sure that we completely enable domain 0 MCR P15,0,R0,C3,C0,0 @write the domain register CPWAIT R0 @be anal and make sure it completes @time to setup the page table base register @LDR R0, =MMUTable @move the table we want into R0 MCR P15, 0, R0, C2, C0 @save it CPWAIT R0 @wait it @time to enable the MMU! MRC P15,0,R0,C1,C0,0 @get CP15 register 1 ORR R0, R0, #0x1 @set the MMU enable bit MCR P15,0,R0,C1,C0,0 @save it CPWAIT R0 @wait it MOV PC, LR .endfunc enableICache: .func enableICache @icache section @globally unlock the icache MCR P15, 0, R0, C9, C1, 1 CPWAIT R0 @globally unlock the itlb MCR P15, 0, R0, C10, C4, 1 CPWAIT R0 @invalidate just the icache and BTB....write to P15 C7, C5, 0 MCR P15, 0, R0, C7, C5, 0 CPWAIT R0 @invalidate the iTLB...write to P15 C8, C5, 0 MCR P15, 0, R0, c8, c5, 0 @save it CPWAIT R0 @wait it @Enable instruction cache MRC P15, 0, R0, C1, C0, 0 @get CP15 register 1 ORR R0, R0, #0x1000 @set the icache bit MCR P15, 0, R0, C1, C0, 0 @wait it CPWAIT R0 @enable the BTB MRC P15, 0, R0, C1, C0, 0 @get CP15 register 1 ORR R0, R0, #0x800 @set the btb enable bit MCR P15, 0, R0, C1, C0, 0 @save it CPWAIT R0 @wait it MOV PC, LR .endfunc enableDCache: .func enableDCache @globally unlock the dtlb MCR P15, 0, R0, c10, c8, 1 CPWAIT R0 @globally unlock the dcache MCR P15, 0, R0, C9, c2, 1 CPWAIT R0 @first invalidate dcache and mini-dcache MCR P15, 0, R0, C7, C6, 0 CPWAIT R0 @invalidate the dTLB...write to P15 C8, C6, 0 MCR P15, 0, R0, C8, C6, 0 @save it CPWAIT R0 @wait it @ now, enable data cache MCR P15, 0, R0, C7, C10, 4 @drain write buffer MRC P15, 0, R0, C1, C0, 0 @get CP15 register 1 ORR R0, R0, #0x4 @set the dcache enable bit MCR P15, 0, R0, C1, C0, 0 @save it CPWAIT R0 @wait it MOV PC, LR .endfunc disableDCache: .func disableDCache @since caching might be WB or WT for a given line, need to invalidate/flush dcache to ensure coherency @globally unlock the dcache STMFD R13!, {R0, LR} MCR P15, 0, R0, C9, c2, 1 CPWAIT R0 @globally clean and invalidate the cache bl globalCleanAndInvalidateDCache @ now, disable data cache MCR P15, 0, R0, C7, C10, 4 @drain write buffer MRC P15, 0, R0, C1, C0, 0 @get CP15 register 1 BIC R0, R0, #0x4 @clear the dcache enable bit MCR P15, 0, R0, C1, C0, 0 @save it CPWAIT R0 @wait it LDMFD R13!, {R0, LR} .endfunc @function to invalidate the DCCache for a given Buffer @funtion take 2 parameters @R0 = base virtual address to evict @R1 = number of bytes to evict...cache line is 32 bytes invalidateDCache: .func invalidateDCache CMPS R1,#0 @check that we're greater than 0 MOVLE PC, LR @return if not invalidateDCacheLoop: MCR P15, 0, R0, C7, C6, 1 @invalidate this line SUBS R1, R1, #32 @subtract out 32 w/CPSR update ADD R0, R0, #32 @add 32 to the address w/o CPSR update BGT invalidateDCacheLoop @rerun if subtract is greater than MOV PC, LR .endfunc @function to clean the DCCache for a given Buffer @if a line is dirty, it will be cleaned...i.e. written back to memory in WB mode @funtion take 2 parameters @R0 = base virtual address to evict @R1 = number of bytes to evict...cache line is 32 bytes cleanDCache: .func cleanDCache CMPS R1,#0 @check that we're greater than 0 MOVLE PC, LR @return if not cleanDCacheLoop: MCR P15, 0, R0, C7, C10, 1 @clean this line SUBS R1, R1, #32 @subtract out 32 w/CPSR update ADD R0, R0, #32 @add 32 to the address w/o CPSR update BGT cleanDCacheLoop @rerun if subtract is greater than MCR P15, 0, R0, C7, C10, 4 @drain write buffer CPWAIT R0 @wait it MOV PC, LR .endfunc @Global Clean/Invalidate THE DATA CACHE @R1 contains the virtual address of a region of cacheable memory reserved for @this clean operation @R0 is the loop count; Iterate 1024 times which is the number of lines in the @data cache globalCleanAndInvalidateDCache: .func globalCleanAndInvalidateDCache @note, this function assumes that we will NEVER have anything physical at @address 0x04000000 corresponds to static chip select 1 STMFD R13!, {R0 - R3, LR} LDR R1, =0x04000000 MOV R0, #1024 LOOP1: ALLOCATE R1 @ Allocate a line at the virtual address @ specified by R1. SUBS R0, R0, #1 @ Decrement loop count ADD R1, R1, #32 @ Increment the address in R1 to the next cache line BNE LOOP1 @Clean the Mini-data Cache @ Cant use line-allocate command, so cycle 2KB of unused data through. @ R2 contains the virtual address of a region of cacheable memory reserved for @ cleaning the Mini-data Cache @ R0 is the loop count; Iterate 64 times which is the number of lines in the @ Mini-data Cache. @note, this function assumes that we will NEVER have anything physical at @address 0x05000000 corresponds to static chip select 1 LDR R2, =0x05000000 MOV R0, #64 LOOP2: SUBS R0, R0, #1 @ Decrement loop count LDR R3,[R2],#32 @ Load and increment to next cache line BNE LOOP2 @ Invalidate the data cache and mini-data cache MCR P15, 0, R0, C7, C6, 0 LDMFD R13!, {R0 - R3, PC} .endfunc .end tinyos-2.1.2+dfsg/tos/chips/pxa27x/pxa27xhardware.h000066400000000000000000000135711207233610700220540ustar00rootroot00000000000000// $Id: pxa27xhardware.h,v 1.8 2010-06-29 22:07:45 scipio Exp $ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * * * Copyright (c) 2000-2002 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * Authors: Philip Buonadonna * * Edits: Josh Herbach * Revised: 09/02/2005 */ #ifndef PXA27X_HARDWARE_H #define PXA27X_HARDWARE_H #include "arm_defs.h" #include "pxa27x_registers.h" #define _pxa27x_perf_clear() {asm volatile ("mcr p14,0,%0,c0,c1,0\n\t"::"r" (0x5));} #define _pxa27x_perf_get(_x) {asm volatile ("mrc p14,0,%0,c1,c1,0":"=r" (_x));} // External utility functions extern void enableICache(); extern void initSyncFlash(); inline uint32_t _pxa27x_clzui(uint32_t i) { uint32_t count; asm volatile ("clz %0,%1": "=r" (count) : "r" (i)); return count; } typedef uint32_t __nesc_atomic_t; //NOTE...at the moment, these functions will ONLY disable the IRQ...FIQ is left alone inline __nesc_atomic_t __nesc_atomic_start(void) @spontaneous() { uint32_t result = 0; uint32_t temp = 0; asm volatile ( "mrs %0,CPSR\n\t" "orr %1,%2,%4\n\t" "msr CPSR_cf,%3" : "=r" (result) , "=r" (temp) : "0" (result) , "1" (temp) , "i" (ARM_CPSR_INT_MASK) ); asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ return result; } inline void __nesc_atomic_end(__nesc_atomic_t oldState) @spontaneous() { uint32_t statusReg = 0; //make sure that we only mess with the INT bit asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ oldState &= ARM_CPSR_INT_MASK; asm volatile ( "mrs %0,CPSR\n\t" "bic %0, %1, %2\n\t" "orr %0, %1, %3\n\t" "msr CPSR_c, %1" : "=r" (statusReg) : "0" (statusReg),"i" (ARM_CPSR_INT_MASK), "r" (oldState) ); return; } inline void __nesc_enable_interrupt() { uint32_t statusReg = 0; asm volatile ( "mrs %0,CPSR\n\t" "bic %0,%1,#0xc0\n\t" "msr CPSR_c, %1" : "=r" (statusReg) : "0" (statusReg) ); return; } inline void __nesc_disable_interrupt() { uint32_t statusReg = 0; asm volatile ( "mrs %0,CPSR\n\t" "orr %0,%1,#0xc0\n\t" "msr CPSR_c,%1\n\t" : "=r" (statusReg) : "0" (statusReg) ); return; } inline void __nesc_atomic_sleep() { /* * Atomically enable interrupts and sleep , * LN : FOR NOW SLEEP IS DISABLED will be adding this functionality shortly */ __nesc_enable_interrupt(); return; } typedef uint8_t mcu_power_t @combine("mcombine"); /** Combine function. */ mcu_power_t mcombine(mcu_power_t m1, mcu_power_t m2) { return (m1 < m2)? m1: m2; } #endif //TOSH_HARDWARE_H tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/000077500000000000000000000000001207233610700176325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HalPXA27xPSPDMAC.nc000066400000000000000000000050101207233610700225760ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ generic configuration HalPXA27xSpiDMAC(uint8_t valSCR, uint8_t valDSS, bool enableRWOT) { provides interface Init; provides interface SpiByte; provides interface SpiPacket[uint8_t instance]; provides interface HalPXA27xSSPCntl; uses { interface HplPXA27xSSP as SSP; interface HplPXA27xDMAChnl as RxDMA; interface HplPXA27xDMAChnl as TxDMA; interface HplPXA27xDMAInfo as SSPRxDMAInfo; interface HplPXA27xDMAInfo as SSPTxDMAInfo; } } implementation { components new HalPXA27xSpiDMAM(3, valSCR, valDSS, enableRWOT); components HalPXA27xSSPControlP; Init = HalPXA27xSpiSSPM; SpiByte = HalPXA27xSpiSSPM; SpiPacket = HalPXA27xSpiSSPM; HalPXA27xSSPCntl = HalPXA27xSSPControlP; SSP = HalPXA27xSpiSSPM; SSP = HalPXA27xSSPControlP; RxDMA = HalPXA27xSpiDMAM; TxDMA = HalPXA27xSpiDMAM; SSPRxDMAInfo = HalPXA27xSpiDMAM; SSPTxDMAInfo = HalPXA27xSpiDMAM; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HalPXA27xPSPPioC.nc000066400000000000000000000043151207233610700227330ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ generic configuration HalPXA27xSpiPioC(uint8_t valSCR, uint8_t valDSS, bool enableRWOT) { provides interface Init; provides interface SpiByte; provides interface SpiPacket[uint8_t instance]; provides interface HalPXA27xSSPCntl; uses interface HplPXA27xSSP as SSP; } implementation { components new HalPXA27xSpiPioM(3, valSCR, valDSS, enableRWOT); components HalPXA27xSSPControlP; Init = HalPXA27xSpiPioM; SpiByte = HalPXA27xSpiPioM; SpiPacket = HalPXA27xSpiPioM; HalPXA27xSSPCntl = HalPXA27xSSPControlP; SSP = HalPXA27xSpiPioM; SSP = HalPXA27xSSPControlP; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HalPXA27xSSPCntl.nc000066400000000000000000000106541207233610700230070ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ #include "SSP.h" interface HalPXA27xSSPCntl { /** *configure the port to be Master of SCLK * *@param enable: port is master of SCLK if TRUE, slave if FALSE * *@return FAIL if error, SUCCESS otherwise */ command error_t setMasterSCLK(bool enable); /** *configure the port to be Master of SFRM * *@param enable: port is master of SFRM if TRUE, slave if FALSE * *@return FAIL if error, SUCCESS otherwise */ command error_t setMasterSFRM(bool enable); /** *configure the port to be in ReceiveWithoutTransmit mode * *@param enable: port only receives if TRUE, slave if FALSE * *@return FAIL if error, SUCCESS otherwise */ command error_t setReceiveWithoutTransmit(bool enable); /** *configure the port to be in SPI, SSP, Microwire, or PSP modes * *@param format: format to use...see SSP.h for encodings * *@return FAIL if error, SUCCESS otherwise */ command error_t setSSPFormat(SSPFrameFormat_t format); /** *configure how many bits wide the port should consider 1 sample * *@param width: bits to use * *@return FAIL if error, SUCCESS otherwise */ command error_t setDataWidth(SSPDataWidth_t width); /** *configure the port to invert the SFRM signal * *@param enable: invert the signal if TRUE, don't invert if FALSE * *@return FAIL if error, SUCCESS otherwise */ command error_t enableInvertedSFRM(bool enable); /** *configure the depth of the RX FIFO at which point an interrupt is generated * *@param level: fifo level...see SSP.h for encodings * *@return FAIL if error, SUCCESS otherwise */ command error_t setRxFifoLevel(SSPFifoLevel_t level); /** *configure the depth of the TX FIFO at which point an interrupt is generated * *@param level: fifo level...see SSP.h for encodings * *@return FAIL if error, SUCCESS otherwise */ command error_t setTxFifoLevel(SSPFifoLevel_t level); /** *configure the width of microwire commands * *@param size: 8 bit or 16 bit commands...see SSP.h for encodings * *@return FAIL if error, SUCCESS otherwise */ command error_t setMicrowireTxSize(SSPMicrowireTxSize_t size); /************************************ *clk specific configuration routines ************************************/ /** *configure the clock divider for the port. * *@param clkdivider: divider for the port...clk will be 13M/(clkdivider) * *@return FAIL if error, SUCCESS otherwise */ command error_t setClkRate(uint16_t clkdivider); /** *configure the Clk Mode of the port. * *@param mode: SSP_NORMALMODE for normal operation, SSP_NETWORKMODE for * network mode * *@return FAIL if error, SUCCESS otherwise */ command error_t setClkMode(SSPClkMode_t mode); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HalPXA27xSSPControlP.nc000066400000000000000000000120201207233610700236340ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #include "SSP.h" module HalPXA27xSSPControlP { provides interface HalPXA27xSSPCntl; uses interface HplPXA27xSSP as SSP; } implementation { command error_t HalPXA27xSSPCntl.setMasterSCLK(bool enable) { uint32_t valSSCR1; valSSCR1 = call SSP.getSSCR1() & ~SSCR1_SCLKDIR; if(!enable) valSSCR1 |= SSCR1_SCLKDIR; call SSP.setSSCR1(valSSCR1); return SUCCESS; } command error_t HalPXA27xSSPCntl.setMasterSFRM(bool enable) { uint32_t valSSCR1; valSSCR1 = call SSP.getSSCR1() & ~SSCR1_SFRMDIR; if(!enable) valSSCR1 |= SSCR1_SFRMDIR; call SSP.setSSCR1(valSSCR1); return SUCCESS; } command error_t HalPXA27xSSPCntl.setReceiveWithoutTransmit(bool enable) { uint32_t valSSCR1; valSSCR1 = call SSP.getSSCR1() & ~SSCR1_RWOT; if(enable) valSSCR1 |= SSCR1_RWOT; call SSP.setSSCR1(valSSCR1); return SUCCESS; } command error_t HalPXA27xSSPCntl.setSSPFormat(SSPFrameFormat_t format) { uint32_t valSSCR0; valSSCR0 = call SSP.getSSCR0() & ~SSCR0_FRF(3); call SSP.setSSCR0(valSSCR0 | SSCR0_FRF(format)); return SUCCESS; } command error_t HalPXA27xSSPCntl.setDataWidth(SSPDataWidth_t width) { uint8_t bitEDSS; uint32_t valSSCR0; if(width < 4) return EINVAL; // width + 1 = bits to use, don't forget to adjust! width -= 1; bitEDSS = width & 0x10; // keep bit 4 width = width & 0xF; // keep bits 0-3 valSSCR0 = call SSP.getSSCR0() & ~SSCR0_DSS(0xF) & ~SSCR0_EDSS; if(bitEDSS) valSSCR0 |= SSCR0_EDSS; valSSCR0 |= SSCR0_DSS(width); call SSP.setSSCR0(valSSCR0); return SUCCESS; } command error_t HalPXA27xSSPCntl.enableInvertedSFRM(bool enable) { uint32_t valSSCR1; valSSCR1 = call SSP.getSSCR1() & ~SSCR1_IFS; if(!enable) valSSCR1 |= SSCR1_IFS; call SSP.setSSCR1(valSSCR1); return SUCCESS; } command error_t HalPXA27xSSPCntl.setRxFifoLevel(SSPFifoLevel_t level) { uint32_t valSSCR1; valSSCR1 = call SSP.getSSCR1() & ~SSCR1_RFT(0xF); call SSP.setSSCR1(valSSCR1 | SSCR1_RFT(level)); return SUCCESS; } command error_t HalPXA27xSSPCntl.setTxFifoLevel(SSPFifoLevel_t level) { uint32_t valSSCR1; valSSCR1 = call SSP.getSSCR1() & ~SSCR1_TFT(0xF); call SSP.setSSCR1(valSSCR1 | SSCR1_TFT(level)); return SUCCESS; } command error_t HalPXA27xSSPCntl.setMicrowireTxSize(SSPMicrowireTxSize_t size) { uint32_t valSSCR1; valSSCR1 = call SSP.getSSCR1(); if(size == UWIRE_16BIT) valSSCR1 |= SSCR1_MWDS; else if(size == UWIRE_8BIT) valSSCR1 &= ~ SSCR1_MWDS; else return FAIL; call SSP.setSSCR1(valSSCR1); return SUCCESS; } command error_t HalPXA27xSSPCntl.setClkRate(uint16_t clkdivider) { uint32_t valSSCR0; clkdivider -= 1; // check PXA Dev Manual for why to do this valSSCR0 = call SSP.getSSCR0() & ~SSCR0_SCR(0xFFF); valSSCR0 |= SSCR0_SCR(clkdivider); call SSP.setSSCR0(valSSCR0); return SUCCESS; } command error_t HalPXA27xSSPCntl.setClkMode(SSPClkMode_t mode) { uint32_t valSSCR0; valSSCR0 = call SSP.getSSCR0(); if(mode == SSP_NETWORKMODE) valSSCR0 |= SSCR0_NCS; else if(mode == SSP_NORMALMODE) valSSCR0 &= ~SSCR0_NCS; else return FAIL; call SSP.setSSCR0(valSSCR0); return SUCCESS; } async event void SSP.interruptSSP() { // intentionally left blank, not supposed to handle interrupts } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HalPXA27xSSPDMAC.nc000066400000000000000000000050101207233610700226010ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ generic configuration HalPXA27xSpiDMAC(uint8_t valSCR, uint8_t valDSS, bool enableRWOT) { provides interface Init; provides interface SpiByte; provides interface SpiPacket[uint8_t instance]; provides interface HalPXA27xSSPCntl; uses { interface HplPXA27xSSP as SSP; interface HplPXA27xDMAChnl as RxDMA; interface HplPXA27xDMAChnl as TxDMA; interface HplPXA27xDMAInfo as SSPRxDMAInfo; interface HplPXA27xDMAInfo as SSPTxDMAInfo; } } implementation { components new HalPXA27xSpiDMAM(1, valSCR, valDSS, enableRWOT); components HalPXA27xSSPControlP; Init = HalPXA27xSpiDMAM; SpiByte = HalPXA27xSpiDMAM; SpiPacket = HalPXA27xSpiDMAM; HalPXA27xSSPCntl = HalPXA27xSSPControlP; SSP = HalPXA27xSpiDMAM; SSP = HalPXA27xSSPControlP; RxDMA = HalPXA27xSpiDMAM; TxDMA = HalPXA27xSpiDMAM; SSPRxDMAInfo = HalPXA27xSpiDMAM; SSPTxDMAInfo = HalPXA27xSpiDMAM; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HalPXA27xSSPPioC.nc000066400000000000000000000043151207233610700227360ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ generic configuration HalPXA27xSpiPioC(uint8_t valSCR, uint8_t valDSS, bool enableRWOT) { provides interface Init; provides interface SpiByte; provides interface SpiPacket[uint8_t instance]; provides interface HalPXA27xSSPCntl; uses interface HplPXA27xSSP as SSP; } implementation { components new HalPXA27xSpiPioM(1, valSCR, valDSS, enableRWOT); components HalPXA27xSSPControlP; Init = HalPXA27xSpiPioM; SpiByte = HalPXA27xSpiPioM; SpiPacket = HalPXA27xSpiPioM; HalPXA27xSSPCntl = HalPXA27xSSPControlP; SSP = HalPXA27xSpiPioM; SSP = HalPXA27xSSPControlP; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HalPXA27xSpiDMAC.nc000066400000000000000000000050561207233610700227010ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ generic configuration HalPXA27xSpiDMAC(uint8_t valSCR, uint8_t valDSS, bool enableRWOT) { provides interface Init; provides interface SpiByte; provides interface SpiPacket[uint8_t instance]; provides interface HalPXA27xSSPCntl; uses { interface HplPXA27xSSP as SSP; interface HplPXA27xDMAChnl as RxDMA; interface HplPXA27xDMAChnl as TxDMA; interface HplPXA27xDMAInfo as SSPRxDMAInfo; interface HplPXA27xDMAInfo as SSPTxDMAInfo; } } implementation { components new HalPXA27xSpiDMAM(0, valSCR, valDSS, enableRWOT); components HalPXA27xSSPControlP; Init = HalPXA27xSpiDMAM; SpiByte = HalPXA27xSpiDMAM; SpiPacket = HalPXA27xSpiDMAM; HalPXA27xSSPCntl = HalPXA27xSSPControlP; SSP = HalPXA27xSpiDMAM; SSP = HalPXA27xSSPControlP; RxDMA = HalPXA27xSpiDMAM.RxDMA; TxDMA = HalPXA27xSpiDMAM.TxDMA; SSPRxDMAInfo = HalPXA27xSpiDMAM.SSPRxDMAInfo; SSPTxDMAInfo = HalPXA27xSpiDMAM.SSPTxDMAInfo; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HalPXA27xSpiDMAM.nc000066400000000000000000000146661207233610700227220ustar00rootroot00000000000000/* $Id: HalPXA27xSpiDMAM.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * Implements the TOS 2.0 SpiByte and SpiPacket interfaces for the PXA27x. * It assumes the Motorola Serial Peripheral Interface format. * Uses DMA for the packet based transfers. * * @param valSCR The value for the SCR field in the SSCR0 register of the * associated SSP peripheral. * * @param valDSS The value for the DSS field in the SSCR0 register of the * associated SSP peripheral. * * @author Phil Buonadonna */ generic module HalPXA27xSpiDMAM(uint8_t valFRF, uint8_t valSCR, uint8_t valDSS, bool enableRWOT) { provides { interface Init; interface SpiByte; interface SpiPacket[uint8_t instance]; } uses { interface HplPXA27xSSP as SSP; interface HplPXA27xDMAChnl as RxDMA; interface HplPXA27xDMAChnl as TxDMA; interface HplPXA27xDMAInfo as SSPRxDMAInfo; interface HplPXA27xDMAInfo as SSPTxDMAInfo; } } implementation { // The BitBuckets need to be 8 bytes. norace unsigned long long txBitBucket, rxBitBucket; //norace uint8_t ucBitBucket[0x10000]; //norace uint32_t txBitBucket, rxBitBucket; uint8_t *txCurrentBuf, *rxCurrentBuf; uint8_t instanceCurrent; uint32_t lenCurrent; command error_t Init.init() { //txBitBucket = (uint32_t)((uint32_t)&ullBitBucket[1] * ~0x7); //rxBitBucket = txBitBucket + 8; //rxBitBucket = txBitBucket = (uint32_t)&ucBitBucket[0]; txCurrentBuf = rxCurrentBuf = NULL; lenCurrent = 0 ; instanceCurrent = 0; call SSP.setSSCR1((SSCR1_TRAIL | SSCR1_RFT(8) | SSCR1_TFT(8))); call SSP.setSSTO(3500); call SSP.setSSCR0(SSCR0_SCR(valSCR) | SSCR0_SSE | SSCR0_FRF(valFRF) | SSCR0_DSS(valDSS) ); call TxDMA.setMap(call SSPTxDMAInfo.getMapIndex()); call RxDMA.setMap(call SSPRxDMAInfo.getMapIndex()); call TxDMA.setDALGNbit(TRUE); call RxDMA.setDALGNbit(TRUE); return SUCCESS; } async command uint8_t SpiByte.write(uint8_t tx) { volatile uint32_t tmp; volatile uint8_t val; #if 1 while ((call SSP.getSSSR()) & SSSR_RNE) { tmp = call SSP.getSSDR(); } #endif call SSP.setSSDR(tx); while ((call SSP.getSSSR()) & SSSR_BSY); val = call SSP.getSSDR(); return val; } async command error_t SpiPacket.send[uint8_t instance](uint8_t* txBuf, uint8_t* rxBuf, uint16_t len) { uint32_t tmp; uint32_t txAddr,rxAddr; uint32_t txDMAFlags, rxDMAFlags; error_t error = FAIL; #if 1 while ((call SSP.getSSSR()) & SSSR_RNE) { tmp = call SSP.getSSDR(); } #endif atomic { txCurrentBuf = txBuf; rxCurrentBuf = rxBuf; lenCurrent = len; instanceCurrent = instance; } txDMAFlags = (DCMD_FLOWTRG | DCMD_BURST8 | DCMD_WIDTH1 | DCMD_LEN(len)); rxDMAFlags = (DCMD_FLOWSRC | DCMD_ENDIRQEN | DCMD_BURST8 | DCMD_WIDTH1 | DCMD_LEN(len)); if (rxBuf == NULL) { rxAddr = (uint32_t)&rxBitBucket; } else { rxAddr = (uint32_t)rxBuf; rxDMAFlags |= DCMD_INCTRGADDR; } if (txBuf == NULL) { txAddr = (uint32_t)&txBitBucket; } else { txAddr = (uint32_t)txBuf; txDMAFlags |= DCMD_INCSRCADDR; } call RxDMA.setDCSR(DCSR_NODESCFETCH | DCSR_EORIRQEN | DCSR_EORINT); call RxDMA.setDSADR(call SSPRxDMAInfo.getAddr()); call RxDMA.setDTADR(rxAddr); call RxDMA.setDCMD(rxDMAFlags); call TxDMA.setDCSR(DCSR_NODESCFETCH); call TxDMA.setDSADR(txAddr); call TxDMA.setDTADR(call SSPTxDMAInfo.getAddr()); call TxDMA.setDCMD(txDMAFlags); call SSP.setSSSR(SSSR_TINT); call SSP.setSSCR1((call SSP.getSSCR1()) | SSCR1_RSRE | SSCR1_TSRE); call RxDMA.setDCSR(DCSR_RUN | DCSR_NODESCFETCH | DCSR_EORIRQEN); call TxDMA.setDCSR(DCSR_RUN | DCSR_NODESCFETCH); error = SUCCESS; return error; } async event void RxDMA.interruptDMA() { uint8_t *txBuf,*rxBuf; uint8_t instance; uint32_t len; atomic { instance = instanceCurrent; len = lenCurrent; txBuf = txCurrentBuf; rxBuf = rxCurrentBuf; lenCurrent = 0; } call RxDMA.setDCMD(0); call RxDMA.setDCSR(DCSR_EORINT | DCSR_ENDINTR | DCSR_STARTINTR | DCSR_BUSERRINTR); signal SpiPacket.sendDone[instance](txBuf,rxBuf,len,SUCCESS); return; } async event void TxDMA.interruptDMA() { // The transmit side should NOT generate an interrupt. call TxDMA.setDCMD(0); call TxDMA.setDCSR(DCSR_EORINT | DCSR_ENDINTR | DCSR_STARTINTR | DCSR_BUSERRINTR); return; } async event void SSP.interruptSSP() { // For this Hal, we should never get here normally // Perhaps we should signal any weird errors? For now, just clear the interrupts call SSP.setSSSR(SSSR_BCE | SSSR_TUR | SSSR_EOC | SSSR_TINT | SSSR_PINT | SSSR_ROR ); return; } default async event void SpiPacket.sendDone[uint8_t instance](uint8_t* txBuf, uint8_t* rxBuf, uint16_t len, error_t error) { return; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HalPXA27xSpiPioC.nc000066400000000000000000000043151207233610700230240ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ generic configuration HalPXA27xSpiPioC(uint8_t valSCR, uint8_t valDSS, bool enableRWOT) { provides interface Init; provides interface SpiByte; provides interface SpiPacket[uint8_t instance]; provides interface HalPXA27xSSPCntl; uses interface HplPXA27xSSP as SSP; } implementation { components new HalPXA27xSpiPioM(0, valSCR, valDSS, enableRWOT); components HalPXA27xSSPControlP; Init = HalPXA27xSpiPioM; SpiByte = HalPXA27xSpiPioM; SpiPacket = HalPXA27xSpiPioM; HalPXA27xSSPCntl = HalPXA27xSSPControlP; SSP = HalPXA27xSpiPioM; SSP = HalPXA27xSSPControlP; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HalPXA27xSpiPioM.nc000066400000000000000000000141001207233610700230270ustar00rootroot00000000000000/* $Id: HalPXA27xSpiPioM.nc,v 1.6 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * Implements the TOS 2.0 SpiByte and SpiPacket interfaces for the PXA27x. * Provides master mode communication for a variety of frame formats, speeds * and data sizes. * * @param valFRF The frame format to use. * * @param valSCR The value for the SSP clock rate. * * @param valDSS The value for the DSS field in the SSCR0 register of the * associated SSP peripheral. * * @param enableRWOT Enables Receive without transmit mode. Used only for * the SpiPacket interface. If the txBuf parameter of SpiPacket.send is null * the implementation will continuously clock in data without regard to the * contents of the TX FIFO. This is different from the spec for the interface * which requires that the transmitter send zeros (0) for this case. * * @author Phil Buonadonna * @author Miklos Maroti, Brano Kusy */ generic module HalPXA27xSpiPioM(uint8_t valFRF, uint8_t valSCR, uint8_t valDSS, bool enableRWOT) { provides { interface Init; interface SpiByte; interface SpiPacket[uint8_t instance]; } uses { interface HplPXA27xSSP as SSP; } } implementation { enum{ FLAGS_SSCR0 = SSCR0_SCR(valSCR) | SSCR0_FRF(/*0*/valFRF) | SSCR0_DSS(valDSS), FLAGS_SSCR1 = 0 }; // The BitBuckets need to be 8 bytes. norace unsigned long long txBitBucket, rxBitBucket; norace uint8_t *txCurrentBuf, *rxCurrentBuf, *txPtr, *rxPtr; norace uint8_t txInc, rxInc; norace uint8_t instanceCurrent; uint32_t lenCurrent, lenRemain; command error_t Init.init() { txBitBucket = 0, rxBitBucket = 0; txCurrentBuf = rxCurrentBuf = NULL; lenCurrent = 0 ; instanceCurrent = 0; atomic lenRemain = 0; call SSP.setSSCR1(FLAGS_SSCR1); call SSP.setSSTO(3500 /*96*8*/); call SSP.setSSCR0(FLAGS_SSCR0); call SSP.setSSCR0(FLAGS_SSCR0 | SSCR0_SSE); return SUCCESS; } async command uint8_t SpiByte.write(uint8_t tx) { volatile uint8_t val; #if 1 while ((call SSP.getSSSR()) & SSSR_RNE) { call SSP.getSSDR(); } #endif call SSP.setSSDR(tx); while ((call SSP.getSSSR()) & SSSR_BSY); val = call SSP.getSSDR(); return val; } async command error_t SpiPacket.send[uint8_t instance](uint8_t* txBuf, uint8_t* rxBuf, uint16_t len) { uint32_t i; #if 1 while ((call SSP.getSSSR()) & SSSR_RNE) { call SSP.getSSDR(); } #endif txCurrentBuf = txBuf; rxCurrentBuf = rxBuf; atomic lenCurrent = lenRemain = len; instanceCurrent = instance; if (rxBuf == NULL) { rxPtr = (uint8_t *)&rxBitBucket; rxInc = 0; } else { rxPtr = rxBuf; rxInc = 1; } if (txBuf == NULL) { txPtr = (uint8_t *)&txBitBucket; txInc = 0; } else { txPtr = txBuf; txInc = 1; } if ((txBuf == NULL) && (enableRWOT == TRUE)) { call SSP.setSSCR0(FLAGS_SSCR0); call SSP.setSSCR1(FLAGS_SSCR1 | SSCR1_RWOT); call SSP.setSSCR0(FLAGS_SSCR0 | SSCR0_SSE); while (len > 0) { while (!(call SSP.getSSSR() & SSSR_RNE)); *rxPtr = call SSP.getSSDR(); rxPtr += rxInc; len--; } call SSP.setSSCR0(FLAGS_SSCR0); call SSP.setSSCR1(FLAGS_SSCR1); call SSP.setSSCR0(FLAGS_SSCR0 | SSCR0_SSE); } else { uint8_t burst = (len < 16) ? len : 16; for (i = 0;i < burst; i++) { call SSP.setSSDR(*txPtr); txPtr += txInc; } call SSP.setSSCR1(FLAGS_SSCR1 | SSCR1_TINTE | SSCR1_RIE); } return SUCCESS; } async event void SSP.interruptSSP() { uint32_t i, uiStatus, uiFifoLevel; uint32_t burst; uiStatus = call SSP.getSSSR(); call SSP.setSSSR(SSSR_TINT); uiFifoLevel = (((uiStatus & SSSR_RFL) >> 12) | 0xF) + 1; uiFifoLevel = (uiFifoLevel > lenRemain) ? lenRemain : uiFifoLevel; if( !(uiStatus & SSSR_RNE)) return; for (i = 0; i < uiFifoLevel; i++) { *rxPtr = call SSP.getSSDR(); rxPtr += rxInc; } atomic { lenRemain -= uiFifoLevel; burst = (lenRemain < 16) ? lenRemain : 16; } if (burst > 0) { for (i = 0;i < burst;i++) { call SSP.setSSDR(*txPtr); txPtr += txInc; } } else { uint32_t len = lenCurrent; call SSP.setSSCR1(FLAGS_SSCR1); lenCurrent = 0; signal SpiPacket.sendDone[instanceCurrent](txCurrentBuf, rxCurrentBuf,len,SUCCESS); } return; } default async event void SpiPacket.sendDone[uint8_t instance](uint8_t* txBuf, uint8_t* rxBuf, uint16_t len, error_t error) { return; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HalPXA27xuWireDMAC.nc000066400000000000000000000050101207233610700232270ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ generic configuration HalPXA27xSpiDMAC(uint8_t valSCR, uint8_t valDSS, bool enableRWOT) { provides interface Init; provides interface SpiByte; provides interface SpiPacket[uint8_t instance]; provides interface HalPXA27xSSPCntl; uses { interface HplPXA27xSSP as SSP; interface HplPXA27xDMAChnl as RxDMA; interface HplPXA27xDMAChnl as TxDMA; interface HplPXA27xDMAInfo as SSPRxDMAInfo; interface HplPXA27xDMAInfo as SSPTxDMAInfo; } } implementation { components new HalPXA27xSpiDMAM(2, valSCR, valDSS, enableRWOT); components HalPXA27xSSPControlP; Init = HalPXA27xSpiDMAM; SpiByte = HalPXA27xSpiDMAM; SpiPacket = HalPXA27xSpiDMAM; HalPXA27xSSPCntl = HalPXA27xSSPControlP; SSP = HalPXA27xSpiDMAM; SSP = HalPXA27xSSPControlP; RxDMA = HalPXA27xSpiDMAM; TxDMA = HalPXA27xSpiDMAM; SSPRxDMAInfo = HalPXA27xSpiDMAM; SSPTxDMAInfo = HalPXA27xSpiDMAM; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HalPXA27xuWirePioC.nc000066400000000000000000000043151207233610700233640ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ generic configuration HalPXA27xSpiPioC(uint8_t valSCR, uint8_t valDSS, bool enableRWOT) { provides interface Init; provides interface SpiByte; provides interface SpiPacket[uint8_t instance]; provides interface HalPXA27xSSPCntl; uses interface HplPXA27xSSP as SSP; } implementation { components new HalPXA27xSpiPioM(2, valSCR, valDSS, enableRWOT); components HalPXA27xSSPControlP; Init = HalPXA27xSpiPioM; SpiByte = HalPXA27xSpiPioM; SpiPacket = HalPXA27xSpiPioM; HalPXA27xSSPCntl = HalPXA27xSSPControlP; SSP = HalPXA27xSpiPioM; SSP = HalPXA27xSSPControlP; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HplPXA27xSSP.nc000066400000000000000000000051431207233610700222020ustar00rootroot00000000000000/* $Id: HplPXA27xSSP.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ interface HplPXA27xSSP { async command void setSSCR0(uint32_t val); async command uint32_t getSSCR0(); async command void setSSCR1(uint32_t val); async command uint32_t getSSCR1(); async command void setSSSR(uint32_t val); async command uint32_t getSSSR(); async command void setSSITR(uint32_t val); async command uint32_t getSSITR(); async command void setSSDR(uint32_t val); async command uint32_t getSSDR(); async command void setSSTO(uint32_t val); async command uint32_t getSSTO(); async command void setSSPSP(uint32_t val); async command uint32_t getSSPSP(); async command void setSSTSA(uint32_t val); async command uint32_t getSSTSA(); async command void setSSRSA(uint32_t val); async command uint32_t getSSRSA(); async command void setSSTSS(uint32_t val); async command uint32_t getSSTSS(); async command void setSSACD(uint32_t val); async command uint32_t getSSACD(); async event void interruptSSP(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HplPXA27xSSP1C.nc000066400000000000000000000043241207233610700223660ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ configuration HplPXA27xSSP1C { provides { interface HplPXA27xSSP; interface HplPXA27xDMAInfo as SSPRxDMAReg; interface HplPXA27xDMAInfo as SSPTxDMAReg; } } implementation { components HplPXA27xSSPP; components HplPXA27xInterruptM; components PlatformP; HplPXA27xSSP = HplPXA27xSSPP.HplPXA27xSSP[1]; components new HplPXA27xDMAInfoC(13, (uint32_t)&SSDR_1) as SSPRxDMA; components new HplPXA27xDMAInfoC(14, (uint32_t)&SSDR_1) as SSPTxDMA; SSPRxDMAReg = SSPRxDMA; SSPTxDMAReg = SSPTxDMA; HplPXA27xSSPP.Init[1] <- PlatformP.InitL1; HplPXA27xSSPP.SSP1Irq -> HplPXA27xInterruptM.PXA27xIrq[PPID_SSP1]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HplPXA27xSSP2C.nc000066400000000000000000000043241207233610700223670ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ configuration HplPXA27xSSP2C { provides { interface HplPXA27xSSP; interface HplPXA27xDMAInfo as SSPRxDMAReg; interface HplPXA27xDMAInfo as SSPTxDMAReg; } } implementation { components HplPXA27xSSPP; components HplPXA27xInterruptM; components PlatformP; HplPXA27xSSP = HplPXA27xSSPP.HplPXA27xSSP[2]; components new HplPXA27xDMAInfoC(15, (uint32_t)&SSDR_2) as SSPRxDMA; components new HplPXA27xDMAInfoC(16, (uint32_t)&SSDR_2) as SSPTxDMA; SSPRxDMAReg = SSPRxDMA; SSPTxDMAReg = SSPTxDMA; HplPXA27xSSPP.Init[2] <- PlatformP.InitL1; HplPXA27xSSPP.SSP2Irq -> HplPXA27xInterruptM.PXA27xIrq[PPID_SSP2]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HplPXA27xSSP3C.nc000066400000000000000000000043321207233610700223670ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ configuration HplPXA27xSSP3C { provides { interface HplPXA27xSSP; interface HplPXA27xDMAInfo as SSPRxDMAInfo; interface HplPXA27xDMAInfo as SSPTxDMAInfo; } } implementation { components HplPXA27xSSPP; components HplPXA27xInterruptM; components PlatformP; HplPXA27xSSP = HplPXA27xSSPP.HplPXA27xSSP[3]; components new HplPXA27xDMAInfoC(66, (uint32_t)&SSDR_3) as SSPRxDMA; components new HplPXA27xDMAInfoC(67, (uint32_t)&SSDR_3) as SSPTxDMA; SSPRxDMAInfo = SSPRxDMA; SSPTxDMAInfo = SSPTxDMA; HplPXA27xSSPP.Init[3] <- PlatformP.InitL1; HplPXA27xSSPP.SSP3Irq -> HplPXA27xInterruptM.PXA27xIrq[PPID_SSP3]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/HplPXA27xSSPP.nc000066400000000000000000000176571207233610700223370ustar00rootroot00000000000000/* $Id: HplPXA27xSSPP.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ module HplPXA27xSSPP { provides { interface Init[uint8_t chnl]; interface HplPXA27xSSP[uint8_t chnl]; } uses { interface HplPXA27xInterrupt as SSP1Irq; interface HplPXA27xInterrupt as SSP2Irq; interface HplPXA27xInterrupt as SSP3Irq; } } implementation { command error_t Init.init[uint8_t chnl]() { error_t error = SUCCESS; switch (chnl) { case 1: CKEN |= CKEN23_SSP1; call SSP1Irq.enable(); break; case 2: CKEN |= CKEN3_SSP2; call SSP2Irq.enable(); break; case 3: CKEN |= CKEN4_SSP3; //call SSP3Irq.allocate(); call SSP3Irq.enable(); break; default: error = FAIL; break; } return error; } async command void HplPXA27xSSP.setSSCR0[uint8_t chnl](uint32_t val) { switch (chnl) { case 1: SSCR0_1 = val; break; case 2: SSCR0_2 = val; break; case 3: SSCR0_3 = val; break; default: break; } return; } async command uint32_t HplPXA27xSSP.getSSCR0[uint8_t chnl]() { switch (chnl) { case 1: return SSCR0_1; break; case 2: return SSCR0_2; break; case 3: return SSCR0_3; break; default: return 0; } } async command void HplPXA27xSSP.setSSCR1[uint8_t chnl](uint32_t val) { switch (chnl) { case 1: SSCR1_1 = val; break; case 2: SSCR1_2 = val; break; case 3: SSCR1_3 = val; break; default: break; } return; } async command uint32_t HplPXA27xSSP.getSSCR1[uint8_t chnl]() { switch (chnl) { case 1: return SSCR1_1; break; case 2: return SSCR1_2; break; case 3: return SSCR1_3; break; default: return 0; } } async command void HplPXA27xSSP.setSSSR[uint8_t chnl](uint32_t val) { switch (chnl) { case 1: SSSR_1 = val; break; case 2: SSSR_2 = val; break; case 3: SSSR_3 = val; break; default: break; } return; } async command uint32_t HplPXA27xSSP.getSSSR[uint8_t chnl]() { switch (chnl) { case 1: return SSSR_1; break; case 2: return SSSR_2; break; case 3: return SSSR_3; break; default: return 0; } } async command void HplPXA27xSSP.setSSITR[uint8_t chnl](uint32_t val) { switch (chnl) { case 1: SSITR_1 = val; break; case 2: SSITR_2 = val; break; case 3: SSITR_3 = val; break; default: break; } return; } async command uint32_t HplPXA27xSSP.getSSITR[uint8_t chnl]() { switch (chnl) { case 1: return SSITR_1; break; case 2: return SSITR_2; break; case 3: return SSITR_3; break; default: return 0; } } async command void HplPXA27xSSP.setSSDR[uint8_t chnl](uint32_t val) { switch (chnl) { case 1: SSDR_1 = val; break; case 2: SSDR_2 = val; break; case 3: SSDR_3 = val; break; default: break; } return; } async command uint32_t HplPXA27xSSP.getSSDR[uint8_t chnl]() { switch (chnl) { case 1: return SSDR_1; break; case 2: return SSDR_2; break; case 3: return SSDR_3; break; default: return 0; } } async command void HplPXA27xSSP.setSSTO[uint8_t chnl](uint32_t val) { switch (chnl) { case 1: SSTO_1 = val; break; case 2: SSTO_2 = val; break; case 3: SSTO_3 = val; break; default: break; } return; } async command uint32_t HplPXA27xSSP.getSSTO[uint8_t chnl]() { switch (chnl) { case 1: return SSTO_1; break; case 2: return SSTO_2; break; case 3: return SSTO_3; break; default: return 0; } } async command void HplPXA27xSSP.setSSPSP[uint8_t chnl](uint32_t val) { switch (chnl) { case 1: SSPSP_1 = val; break; case 2: SSPSP_2 = val; break; case 3: SSPSP_3 = val; break; default: break; } return; } async command uint32_t HplPXA27xSSP.getSSPSP[uint8_t chnl]() { switch (chnl) { case 1: return SSPSP_1; break; case 2: return SSPSP_2; break; case 3: return SSPSP_3; break; default: return 0; } } async command void HplPXA27xSSP.setSSTSA[uint8_t chnl](uint32_t val) { switch (chnl) { case 1: SSTSA_1 = val; break; case 2: SSTSA_2 = val; break; case 3: SSTSA_3 = val; break; default: break; } return; } async command uint32_t HplPXA27xSSP.getSSTSA[uint8_t chnl]() { switch (chnl) { case 1: return SSTSA_1; break; case 2: return SSTSA_2; break; case 3: return SSTSA_3; break; default: return 0; } } async command void HplPXA27xSSP.setSSRSA[uint8_t chnl](uint32_t val) { switch (chnl) { case 1: SSRSA_1 = val; break; case 2: SSRSA_2 = val; break; case 3: SSRSA_3 = val; break; default: break; } return; } async command uint32_t HplPXA27xSSP.getSSRSA[uint8_t chnl]() { switch (chnl) { case 1: return SSRSA_1; break; case 2: return SSRSA_2; break; case 3: return SSRSA_3; break; default: return 0; } } async command void HplPXA27xSSP.setSSTSS[uint8_t chnl](uint32_t val) { switch (chnl) { case 1: SSTSS_1 = val; break; case 2: SSTSS_2 = val; break; case 3: SSTSS_3 = val; break; default: break; } return; } async command uint32_t HplPXA27xSSP.getSSTSS[uint8_t chnl]() { switch (chnl) { case 1: return SSTSS_1; break; case 2: return SSTSS_2; break; case 3: return SSTSS_3; break; default: return 0; } } async command void HplPXA27xSSP.setSSACD[uint8_t chnl](uint32_t val) { switch (chnl) { case 1: SSACD_1 = val; break; case 2: SSACD_2 = val; break; case 3: SSACD_3 = val; break; default: break; } return; } async command uint32_t HplPXA27xSSP.getSSACD[uint8_t chnl]() { switch (chnl) { case 1: return SSACD_1; break; case 2: return SSACD_2; break; case 3: return SSACD_3; break; default: return 0; } } default async event void HplPXA27xSSP.interruptSSP[uint8_t chnl]() { call HplPXA27xSSP.setSSSR[chnl](SSSR_BCE | SSSR_TUR | SSSR_EOC | SSSR_TINT | SSSR_PINT | SSSR_ROR ); return; } async event void SSP1Irq.fired() { signal HplPXA27xSSP.interruptSSP[1](); } async event void SSP2Irq.fired() { signal HplPXA27xSSP.interruptSSP[2](); } async event void SSP3Irq.fired() { signal HplPXA27xSSP.interruptSSP[3](); } default async command void SSP1Irq.enable() {return;} default async command void SSP2Irq.enable() {return;} default async command void SSP3Irq.enable() {return;} } tinyos-2.1.2+dfsg/tos/chips/pxa27x/ssp/SSP.h000066400000000000000000000037311207233610700204540ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #ifndef _SSP_H #define _SSP_H typedef enum { SSP_FORMAT_SPI = 0, SSP_FORMAT_TISSP, SSP_FORMAT_UWIRE, SSP_FORMAT_PSP, } SSPFrameFormat_t; typedef uint8_t SSPDataWidth_t; typedef uint8_t SSPFifoLevel_t; typedef enum { UWIRE_8BIT, UWIRE_16BIT, } SSPMicrowireTxSize_t; typedef enum { SSP_NORMALMODE, SSP_NETWORKMODE, } SSPClkMode_t; #endif /* _SSP_H */ tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/000077500000000000000000000000001207233610700201455ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/Alarm32khzC.nc000066400000000000000000000041041207233610700225070ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Phil Buonadonna * */ generic configuration Alarm32khzC() { provides interface Init; provides interface Alarm as Alarm32khz32; } implementation { components new HalPXA27xAlarmM(T32khz,1) as PhysAlarm32khz; components HalPXA27xOSTimerMapC; enum {OST_CLIENT_ID = unique("PXA27xOSTimer.Resource")}; Init = PhysAlarm32khz; Alarm32khz32 = PhysAlarm32khz; PhysAlarm32khz.OSTInit -> HalPXA27xOSTimerMapC.Init; PhysAlarm32khz.OSTChnl -> HalPXA27xOSTimerMapC.OSTChnl[OST_CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/AlarmMilliC.nc000066400000000000000000000041051207233610700226150ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Phil Buonadonna * */ generic configuration AlarmMilliC() { provides interface Init; provides interface Alarm as AlarmMilli32; } implementation { components new HalPXA27xAlarmM(TMilli,2) as PhysAlarmMilli; components HalPXA27xOSTimerMapC; enum {OST_CLIENT_ID = unique("PXA27xOSTimer.Resource")}; Init = PhysAlarmMilli; AlarmMilli32 = PhysAlarmMilli; PhysAlarmMilli.OSTInit -> HalPXA27xOSTimerMapC.Init; PhysAlarmMilli.OSTChnl -> HalPXA27xOSTimerMapC.OSTChnl[OST_CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/BusyWait32khzC.nc000066400000000000000000000040731207233610700232270ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * This configuration piggybacks off of the TOS 2.0 Counter32khzC component. * This component manages initialization of the underlying Timer components. * * @author Phil Buonadonna */ configuration BusyWait32khzC { provides interface BusyWait as BusyWait32khz16; } implementation { components new HalPXA27xBusyWaitPM(T32khz,397) as PXA27xBusyWait32khz; components HplPXA27xOSTimerC; BusyWait32khz16 = PXA27xBusyWait32khz.BusyWait; PXA27xBusyWait32khz.OST -> HplPXA27xOSTimerC.OST0; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/BusyWaitMicroC.nc000066400000000000000000000041271207233610700233370ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * Implements the BusyWaitMicroC timer component. This component * instantiates a new Counter with Microsecond precision and * binds it to the BusyWait interface via PXA27xBusyWaitP * * @author Phil Buonadonna */ configuration BusyWaitMicroC { provides interface BusyWait as BusyWaitMicro16; } implementation { components new HalPXA27xBusyWaitM(TMicro,13) as PXA27xBusyWaitMicro; components HplPXA27xOSTimerC; BusyWaitMicro16 = PXA27xBusyWaitMicro.BusyWait; PXA27xBusyWaitMicro.OST -> HplPXA27xOSTimerC.OST0; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/Counter32khz32C.nc000066400000000000000000000044261207233610700232460ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Phil Buonadonna * */ configuration Counter32khz32C { provides interface Counter as Counter32khz32; provides interface LocalTime as LocalTime32khz; } implementation { components new HalPXA27xCounterM(T32khz,1) as PhysCounter32khz32; components HalPXA27xOSTimerMapC; components PlatformP; enum {OST_CLIENT_ID = unique("PXA27xOSTimer.Resource")}; Counter32khz32 = PhysCounter32khz32.Counter; LocalTime32khz = PhysCounter32khz32.LocalTime; // Wire the initialization to the platform init routine PlatformP.InitL0 -> PhysCounter32khz32.Init; PhysCounter32khz32.OSTInit -> HalPXA27xOSTimerMapC.Init; PhysCounter32khz32.OSTChnl -> HalPXA27xOSTimerMapC.OSTChnl[OST_CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/Counter32khzC.nc000066400000000000000000000044241207233610700230770ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Phil Buonadonna * */ configuration Counter32khzC { provides interface Counter as Counter32khz32; provides interface LocalTime as LocalTime32khz; } implementation { components new HalPXA27xCounterM(T32khz,1) as PhysCounter32khz32; components HalPXA27xOSTimerMapC; components PlatformP; enum {OST_CLIENT_ID = unique("PXA27xOSTimer.Resource")}; Counter32khz32 = PhysCounter32khz32.Counter; LocalTime32khz = PhysCounter32khz32.LocalTime; // Wire the initialization to the platform init routine PlatformP.InitL0 -> PhysCounter32khz32.Init; PhysCounter32khz32.OSTInit -> HalPXA27xOSTimerMapC.Init; PhysCounter32khz32.OSTChnl -> HalPXA27xOSTimerMapC.OSTChnl[OST_CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/CounterMilliC.nc000066400000000000000000000044241207233610700232040ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Phil Buonadonna * */ configuration CounterMilliC { provides interface Counter as CounterMilli32; provides interface LocalTime as LocalTimeMilli; } implementation { components new HalPXA27xCounterM(TMilli,2) as PhysCounterMilli32; components HalPXA27xOSTimerMapC; components PlatformP; enum {OST_CLIENT_ID = unique("PXA27xOSTimer.Resource")}; CounterMilli32 = PhysCounterMilli32.Counter; LocalTimeMilli = PhysCounterMilli32.LocalTime; // Wire the initialization to the plaform init routine PlatformP.InitL0 -> PhysCounterMilli32.Init; PhysCounterMilli32.OSTInit -> HalPXA27xOSTimerMapC.Init; PhysCounterMilli32.OSTChnl -> HalPXA27xOSTimerMapC.OSTChnl[OST_CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HalPXA27xAlarmM.nc000066400000000000000000000103711207233610700232010ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Phil Buonadonna * */ // @author Phil Buonadonna #include "Timer.h" generic module HalPXA27xAlarmM(typedef frequency_tag, uint8_t resolution) { provides { interface Init; interface Alarm as Alarm; } uses { interface Init as OSTInit; interface HplPXA27xOSTimer as OSTChnl; } } implementation { bool mfRunning; uint32_t mMinDeltaT; task void lateAlarm() { atomic { mfRunning = FALSE; signal Alarm.fired(); } } command error_t Init.init() { call OSTInit.init(); // Continue on match, Non-periodic, w/ given resolution atomic { mfRunning = FALSE; switch (resolution) { case 1: // 1/32768 second mMinDeltaT = 10; break; case 2: // 1 ms mMinDeltaT = 1; break; case 3: // 1 s mMinDeltaT = 1; break; case 4: // 1 us mMinDeltaT = 300; break; default: // External mMinDeltaT = 0; break; } call OSTChnl.setOMCR(OMCR_C | OMCR_P | OMCR_CRES(resolution)); call OSTChnl.setOSCR(0); } return SUCCESS; } async command void Alarm.start( uint32_t dt ) { uint32_t t0,t1,tf; //uint32_t cycles; bool bPending; if (dt < mMinDeltaT) dt = mMinDeltaT; atomic { //_pxa27x_perf_clear(); t0 = call OSTChnl.getOSCR(); tf = t0 + dt; call OSTChnl.setOIERbit(TRUE); call OSTChnl.setOSMR(tf); //_pxa27x_perf_get(cycles); mfRunning = TRUE; t1 = call OSTChnl.getOSCR(); bPending = call OSTChnl.getOSSRbit(); if ((dt <= (t1 - t0)) && !(bPending)) { call OSTChnl.setOIERbit(FALSE); post lateAlarm(); } } return; } async command void Alarm.stop() { atomic { call OSTChnl.setOIERbit(FALSE); mfRunning = FALSE; } return; } async command bool Alarm.isRunning() { bool flag; atomic flag = mfRunning; return flag; } async command void Alarm.startAt( uint32_t t0, uint32_t dt ) { uint32_t tf,t1; bool bPending; tf = t0 + dt; atomic { call OSTChnl.setOIERbit(TRUE); call OSTChnl.setOSMR(tf); mfRunning = TRUE; t1 = call OSTChnl.getOSCR(); bPending = call OSTChnl.getOSSRbit(); if ((dt <= (t1 - t0)) && !(bPending)) { call OSTChnl.setOIERbit(FALSE); post lateAlarm(); } } return; } async command uint32_t Alarm.getNow() { return call OSTChnl.getOSCR(); } async command uint32_t Alarm.getAlarm() { return call OSTChnl.getOSMR(); } async event void OSTChnl.fired() { call OSTChnl.clearOSSRbit(); call OSTChnl.setOIERbit(FALSE); mfRunning = FALSE; signal Alarm.fired(); return; } default async event void Alarm.fired() { return; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HalPXA27xBusyWaitM.nc000066400000000000000000000050601207233610700237130ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * This private component provides a 16-bit BusyWait interface * of a given precision over OS Timer channel 0 * * @param precision_tag A type tag mapped to the set precision * * @param val4xScale A value to scale the underlying counter by. * The passed in parameter is given by the equation * val4xScale = (3.25 MHz/) * 4 * and rounded to the nearest integer. * Example: Counter precision of 32.768 kHz would have * a val4xScale of 397 * * @author Phil Buonadonna * */ generic module HalPXA27xBusyWaitM(typedef precision_tag, uint16_t val4xScale) { provides interface BusyWait; uses interface HplPXA27xOSTimer as OST; } implementation { async command void BusyWait.wait(uint16_t dt) { uint32_t dCounts; atomic { uint32_t t0 = call OST.getOSCR(); dCounts = (dt * 4) * val4xScale; dCounts >>= 2; while (((call OST.getOSCR()) - t0) < dCounts); } } async event void OST.fired() { return; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HalPXA27xCounterM.nc000066400000000000000000000063101207233610700235620ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * Implements a TOS 2.0 Counter on the PXA27x HPL. The PXA27x does not * have an explicit overflow notification. We emulate one by using * the associated match register set to 0. This requires we initialize * the counter to 1 to avoid a false notification at startup. * * @author Phil Buonadonna */ #include "Timer.h" generic module HalPXA27xCounterM(typedef frequency_tag, uint8_t resolution) { provides { interface Init; interface Counter as Counter; interface LocalTime as LocalTime; } uses { interface Init as OSTInit; interface HplPXA27xOSTimer as OSTChnl; } } implementation { command error_t Init.init() { call OSTInit.init(); // Continue on match, Non-periodic, w/ given resolution atomic { call OSTChnl.setOMCR(OMCR_C | OMCR_P | OMCR_CRES(resolution)); call OSTChnl.setOSMR(0); call OSTChnl.setOSCR(1); call OSTChnl.clearOSSRbit(); call OSTChnl.setOIERbit(TRUE); } return SUCCESS; } async command uint32_t Counter.get() { uint32_t cntr; cntr = call OSTChnl.getOSCR(); return cntr; } async command bool Counter.isOverflowPending() { bool flag; atomic flag = call OSTChnl.getOSSRbit(); return flag; } async command void Counter.clearOverflow() { atomic call OSTChnl.clearOSSRbit(); } async event void OSTChnl.fired() { call OSTChnl.clearOSSRbit(); signal Counter.overflow(); return; } async command uint32_t LocalTime.get() { uint32_t cntr; cntr = call OSTChnl.getOSCR(); return cntr; } default async event void Counter.overflow() { return; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HalPXA27xOSTimerMapC.nc000066400000000000000000000043741207233610700241210ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * This components maps requested timer resources connected using the * 'PXA27xOSTimer.Resource' flag to physical timer resource of the PXA27x. * * @author Phil Buonadonna * */ configuration HalPXA27xOSTimerMapC { provides { interface Init; interface HplPXA27xOSTimer as OSTChnl[uint8_t id]; } } implementation { components HplPXA27xOSTimerC; Init = HplPXA27xOSTimerC; OSTChnl[0] = HplPXA27xOSTimerC.OST4; OSTChnl[1] = HplPXA27xOSTimerC.OST5; OSTChnl[2] = HplPXA27xOSTimerC.OST6; OSTChnl[3] = HplPXA27xOSTimerC.OST7; OSTChnl[4] = HplPXA27xOSTimerC.OST8; OSTChnl[5] = HplPXA27xOSTimerC.OST9; OSTChnl[6] = HplPXA27xOSTimerC.OST10; OSTChnl[7] = HplPXA27xOSTimerC.OST11; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HalPXA27xSleep.nc000066400000000000000000000060021207233610700230740ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * This interfaces provides HAL level sleep functionality for the PXA27x. * * @author Kaisen Lin * @author Phil Buonadonna * */ interface HalPXA27xSleep { /** * Sleep for a given number of milliseconds. Only standard * sleep mode is used. This function supports * sleep times up to 65534ms. Larger sleep durations must * use one of the other methods. * * @param time Sleep duration in milliseconds up to 65534. * */ async command void sleepMillis(uint16_t time); /** * Sleep for a given number of seconds up to 62859 sec. * If the function is passed a value greater than 62859, it * will default to the maximum. For sleep durations greater * than 30 secs, the processor will be placed into deep sleep * mode. Otherwise standard sleep mode is used. * * @param time Sleep duration in seconds. * */ async command void sleepSeconds(uint32_t time); /** * Sleep for a given number of minutes up to 1439 min. Deep * sleep mode is used. If the function is passed a value * greater than 1439, it will default to the maximum. * * @param time Sleep duration in minutes. */ async command void sleepMinutes(uint32_t time); /** * Sleep for a given number of hours up to 23 hours. Deep * sleep mode is used. If the function is passed a value * greater than 23, it will default to the maximum. * * @param time Sleep duration in hours */ async command void sleepHours(uint16_t time); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HalPXA27xSleepC.nc000066400000000000000000000037171207233610700232110ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Kaisen Lin * @author Phil Buonadonna * */ configuration HalPXA27xSleepC { provides interface HalPXA27xSleep; } implementation { components HalPXA27xSleepM; HalPXA27xSleep = HalPXA27xSleepM; components HplPXA27xRTCM, HplPXA27xPowerM; HalPXA27xSleepM.HplPXA27xRTC -> HplPXA27xRTCM; HalPXA27xSleepM.HplPXA27xPower -> HplPXA27xPowerM; components LedsC; HalPXA27xSleepM.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HalPXA27xSleepM.nc000066400000000000000000000073061207233610700232210ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Kaisen Lin * @author Phil Buonadonna * */ module HalPXA27xSleepM { provides interface HalPXA27xSleep; uses interface HplPXA27xRTC; uses interface HplPXA27xPower; uses interface Leds; } implementation { void doSleep(uint32_t swRegVal, bool useDeepSleep) { int i; call HplPXA27xPower.setPWER(PWER_WERTC); // let it wrap around itself if necessary call HplPXA27xRTC.setSWCR(0); call HplPXA27xRTC.setSWAR1(swRegVal); // minutes call HplPXA27xRTC.setSWAR2(0x00FFFFFF); for(i = 0; i < 10; i++); // spin for a bit call HplPXA27xRTC.setRTSR(RTSR_SWCE); for(i = 0; i < 5000; i++); // spin for a bit if (useDeepSleep) { call HplPXA27xPower.setPWRMode(PWRMODE_M_DEEPSLEEP); // this call never returns } else { call HplPXA27xPower.setPWRMode(PWRMODE_M_SLEEP); // this call never returns } } async command void HalPXA27xSleep.sleepMillis(uint16_t time) { int i; call HplPXA27xPower.setPWER(PWER_WERTC); // let it wrap around itself if necessary call HplPXA27xRTC.setPIAR(time); // implicitly resets RTCPICR for(i = 0; i < 10; i++); // spin for a bit call HplPXA27xRTC.setRTSR(RTSR_PICE); for(i = 0; i < 5000; i++); // spin for a bit call HplPXA27xPower.setPWRMode(PWRMODE_M_SLEEP); // this call never returns } async command void HalPXA27xSleep.sleepSeconds(uint32_t time) { uint32_t hrs = time / 3600; uint32_t mins = (time / 60) % 60; uint32_t secs = time % 60; uint32_t swReg; if (hrs > 23) { hrs = 23; mins = 59; secs = 59; } swReg = ((hrs << 19) | (mins << 13) | (secs << 7)); doSleep(swReg); return; } async command void HalPXA27xSleep.sleepMinutes(uint32_t time) { uint32_t hrs = time / 60; uint32_t mins = time % 60; uint32_t swReg; if (hrs > 23) { hrs = 23; mins = 59; } swReg = ((hrs << 19) | (mins << 13)); doSleep(swReg); return; } async command void HalPXA27xSleep.sleepHours(uint16_t time) { uint32_t hrs = time; uint32_t swReg; if (hrs > 23) { hrs = 23; } swReg = (hrs << 19); doSleep(swReg); return; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HalPXA27xWatchdog.nc000066400000000000000000000043501207233610700235700ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ interface HalPXA27xWatchdog { /** * Enable the watchdog resource with the given timeout interval. * This function may be called multiple times to reset the timeout * interval. However, the watchdog function itself is sticky and * will remain enabled until system reset. * * @param interval The timeout interval in untis of 3.25MHZ clock cycle * ticks. * */ async command void enable(uint32_t interval); /** * Tickle/reset the watchdog counter. This function must be * called on a regular basis to prevent the watchdog from resetting the * system. * */ async command void tickle(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HalPXA27xWatchdogC.nc000066400000000000000000000037031207233610700236740ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ module HalPXA27xWatchdogC { provides interface HalPXA27xWatchdog; } implementation { components HplPXA27xOSTimerC; components HalPXA27xWatchdogM; HalPXA27xWatchdog = HalPXA27xWatchdogM; HalPXA27xWatchdogM.HplPXA27xOSTimerWatchdog -> HplPXA27xOSTimerC.OSTWDCntl; HalPXA27xWatchdogM.HplPXA27xOSTimer -> HplPXA27xOSTimerC.OST0M3; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HalPXA27xWatchdogM.nc000066400000000000000000000050001207233610700236760ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ module HalPXA27xWatchdogM { provides interface HalPXA27xWatchdog; uses interface HplPXA27xOSTimerWatchdog; uses interface HplPXA27xOSTimer; } implementation { uint32_t gResetInterval; async command void HalPXA27xWatchdog.enable(uint32_t interval) { uint32_t curMatch; atomic { gResetInterval = interval; curMatch = call HplPXA27xOSTimer.getOSCR(); curMatch = (curMatch + gResetInterval) % 0xFFFFFFFF; call HplPXA27xOSTimer.setOSMR(curMatch); call HplPXA27xOSTimerWatchdog.enableWatchdog(); } } async command void HalPXA27xWatchdog.tickle() { uint32_t curMatch; atomic { curMatch = call HplPXA27xOSTimer.getOSCR(); curMatch = (curMatch + gResetInterval) % 0xFFFFFFFF; call HplPXA27xOSTimer.setOSMR(curMatch); } } // This won't ever get called. Rather, the system will reset. async event void HplPXA27xOSTimer.fired() {} } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HplPXA27xOSTimer.nc000066400000000000000000000110711207233610700233670ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * This interface exposes a single OS Timer channel * on the PXA27x processor. Each channel includes a counter register * (OSCRx), a match register (OSMRx), a match control register (OMCRx) * and support for events on each channel. * * Do not confuse this HPL interface with the generic 'Timer' interface * provided by TOS 2.x. They are completely different. * * Channels 0 thru 3 are the PXA25x compatibility timers. There are NO * match control register for these channels. * Calls to getOSCR/setOSCR for channels 1 thru 3 are remmaped to OSCR0. * * There may be additional configured inter-dependencies between the timer * channels. Refer to the PXA27x Developer's Guide for more information. * * @author Phil Buonadonna */ interface HplPXA27xOSTimer { /** * Set/initialize the counter register (OSCRx) for the channel * * @param val Desired value to initialize/reset the counter register to. * */ async command void setOSCR(uint32_t val); /** * Get the current counter register (OSCRx) value for the channel. * * @return value The 32-bit value of the counter register. */ async command uint32_t getOSCR(); /** * Set the match register (OSMRx) for the channel. * * @param val The desired 32-bit match value. */ async command void setOSMR(uint32_t val); /** * Get the current match register (OSMRx) value for the channel. * * @return value The 32-bit value of the match register. */ async command uint32_t getOSMR(); /** * Set the timer channel match control register (OMCRx). * * @param val The desired OMCR value. */ async command void setOMCR(uint32_t val); /** * Get the current channel match control register (OMCRx) setting. * * @return value The current OMCR value. */ async command uint32_t getOMCR(); /** * Returns the bit value of the OSSR register corresponding to the * channel. Indicates if a match event has ocurred. * * @return flag TRUE if an event is signaled (OSSR.M{n} is set). * FALSE otherwise * * */ async command bool getOSSRbit(); /** * Clears the bit position of the OSSR register corresponding to the * channel. Returns the value of the bit before clearing. * * @return flag TRUE if an event is signaled (OSSR.M{n} set) prior * to clearing. FALSE otherwise. */ async command bool clearOSSRbit(); /** * Sets the OIER bit corresponding to the timer match channel. * * @param flag TRUE to set the OIER bit, FALSE to clear. */ async command void setOIERbit(bool flag); /** * Returns the setting of the OIER bit corresponding to the timer * match channel. * * @return flag TRUE if set, FALSE if not set. */ async command bool getOIERbit(); /** * Get the snapshot register (OSNR) value. * Any parameterization of this function is ignored. */ async command uint32_t getOSNR(); /** * Timer channel interrupt. Fired when the channel match register matches * configured */ async event void fired(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HplPXA27xOSTimerC.nc000066400000000000000000000063001207233610700234710ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Phil Buonadonna * */ configuration HplPXA27xOSTimerC { provides { interface Init; interface HplPXA27xOSTimer as OST0; interface HplPXA27xOSTimer as OST0M1; interface HplPXA27xOSTimer as OST0M2; interface HplPXA27xOSTimer as OST0M3; interface HplPXA27xOSTimer as OST4; interface HplPXA27xOSTimer as OST5; interface HplPXA27xOSTimer as OST6; interface HplPXA27xOSTimer as OST7; interface HplPXA27xOSTimer as OST8; interface HplPXA27xOSTimer as OST9; interface HplPXA27xOSTimer as OST10; interface HplPXA27xOSTimer as OST11; interface HplPXA27xOSTimerWatchdog as OSTWDCntl; } } implementation { components HplPXA27xOSTimerM, HplPXA27xInterruptM; Init = HplPXA27xOSTimerM; OST0 = HplPXA27xOSTimerM.PXA27xOST[0]; OST0M1 = HplPXA27xOSTimerM.PXA27xOST[1]; OST0M2 = HplPXA27xOSTimerM.PXA27xOST[2]; OST0M3 = HplPXA27xOSTimerM.PXA27xOST[3]; OST4 = HplPXA27xOSTimerM.PXA27xOST[4]; OST5 = HplPXA27xOSTimerM.PXA27xOST[5]; OST6 = HplPXA27xOSTimerM.PXA27xOST[6]; OST7 = HplPXA27xOSTimerM.PXA27xOST[7]; OST8 = HplPXA27xOSTimerM.PXA27xOST[8]; OST9 = HplPXA27xOSTimerM.PXA27xOST[9]; OST10 = HplPXA27xOSTimerM.PXA27xOST[10]; OST11 = HplPXA27xOSTimerM.PXA27xOST[11]; OSTWDCntl = HplPXA27xOSTimerM.PXA27xWD; HplPXA27xOSTimerM.OST0Irq -> HplPXA27xInterruptM.PXA27xIrq[PPID_OST_0]; HplPXA27xOSTimerM.OST1Irq -> HplPXA27xInterruptM.PXA27xIrq[PPID_OST_1]; HplPXA27xOSTimerM.OST2Irq -> HplPXA27xInterruptM.PXA27xIrq[PPID_OST_2]; HplPXA27xOSTimerM.OST3Irq -> HplPXA27xInterruptM.PXA27xIrq[PPID_OST_3]; HplPXA27xOSTimerM.OST4_11Irq -> HplPXA27xInterruptM.PXA27xIrq[PPID_OST_4_11]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HplPXA27xOSTimerM.nc000066400000000000000000000130131207233610700235020ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Phil Buonadonna * */ module HplPXA27xOSTimerM { provides { interface Init; interface HplPXA27xOSTimer as PXA27xOST[uint8_t chnl_id]; interface HplPXA27xOSTimerWatchdog as PXA27xWD; } uses { interface HplPXA27xInterrupt as OST0Irq; interface HplPXA27xInterrupt as OST1Irq; interface HplPXA27xInterrupt as OST2Irq; interface HplPXA27xInterrupt as OST3Irq; interface HplPXA27xInterrupt as OST4_11Irq; } } implementation { bool gfInitialized = FALSE; void DispatchOSTInterrupt(uint8_t id) { signal PXA27xOST.fired[id](); return; } command error_t Init.init() { bool initflag; atomic { initflag = gfInitialized; gfInitialized = TRUE; } if (!initflag) { OIER = 0x0UL; OSSR = 0xFFFFFFFF; // Clear all status bits. call OST0Irq.allocate(); call OST1Irq.allocate(); call OST2Irq.allocate(); call OST3Irq.allocate(); call OST4_11Irq.allocate(); call OST0Irq.enable(); call OST1Irq.enable(); call OST2Irq.enable(); call OST3Irq.enable(); call OST4_11Irq.enable(); } return SUCCESS; } async command void PXA27xOST.setOSCR[uint8_t chnl_id](uint32_t val) { uint8_t remap_id; remap_id = ((chnl_id < 4) ? (0) : (chnl_id)); OSCR(remap_id) = val; return; } async command uint32_t PXA27xOST.getOSCR[uint8_t chnl_id]() { uint8_t remap_id; uint32_t val; remap_id = ((chnl_id < 4) ? (0) : (chnl_id)); val = OSCR(remap_id); return val; } async command void PXA27xOST.setOSMR[uint8_t chnl_id](uint32_t val) { OSMR(chnl_id) = val; return; } async command uint32_t PXA27xOST.getOSMR[uint8_t chnl_id]() { uint32_t val; val = OSMR(chnl_id); return val; } async command void PXA27xOST.setOMCR[uint8_t chnl_id](uint32_t val) { if (chnl_id > 3) { OMCR(chnl_id) = val; } return; } async command uint32_t PXA27xOST.getOMCR[uint8_t chnl_id]() { uint32_t val = 0; if (chnl_id > 3) { val = OMCR(chnl_id); } return val; } async command bool PXA27xOST.getOSSRbit[uint8_t chnl_id]() { bool bFlag = FALSE; if (((OSSR) & (1 << chnl_id)) != 0) { bFlag = TRUE; } return bFlag; } async command bool PXA27xOST.clearOSSRbit[uint8_t chnl_id]() { bool bFlag = FALSE; if (((OSSR) & (1 << chnl_id)) != 0) { bFlag = TRUE; } // Clear the bit value OSSR = (1 << chnl_id); return bFlag; } async command void PXA27xOST.setOIERbit[uint8_t chnl_id](bool flag) { if (flag == TRUE) { OIER |= (1 << chnl_id); } else { OIER &= ~(1 << chnl_id); } return; } async command bool PXA27xOST.getOIERbit[uint8_t chnl_id]() { return ((OIER & (1 << chnl_id)) != 0); } async command uint32_t PXA27xOST.getOSNR[uint8_t chnl_id]() { uint32_t val; val = OSNR; return val; } async command void PXA27xWD.enableWatchdog() { OWER = OWER_WME; } // All interrupts are funneled through DispatchOSTInterrupt. // This should not have any impact on performance and simplifies // the software implementation. async event void OST0Irq.fired() { DispatchOSTInterrupt(0); } async event void OST1Irq.fired() { DispatchOSTInterrupt(1); } async event void OST2Irq.fired() { DispatchOSTInterrupt(2); } async event void OST3Irq.fired() { DispatchOSTInterrupt(3); } async event void OST4_11Irq.fired() { uint32_t statusReg; uint8_t chnl; statusReg = OSSR; statusReg &= ~(OSSR_M3 | OSSR_M2 | OSSR_M1 | OSSR_M0); while (statusReg) { chnl = 31 - _pxa27x_clzui(statusReg); DispatchOSTInterrupt(chnl); statusReg &= ~(1 << chnl); } return; } default async event void PXA27xOST.fired[uint8_t chnl_id]() { call PXA27xOST.setOIERbit[chnl_id](FALSE); call PXA27xOST.clearOSSRbit[chnl_id](); return; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HplPXA27xOSTimerWatchdog.nc000066400000000000000000000036561207233610700250620ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * This interface exposes the watchdog control of the PXA27x OS Timer * * Refer to the PXA27x Developer's Guide for more information. * * @author Phil Buonadonna */ interface HplPXA27xOSTimerWatchdog { /** * Enable the timer-based watchdog reset feature. * Once enabled, this feature may only be disabled by a reset. */ async command void enableWatchdog(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HplPXA27xPower.nc000066400000000000000000000034301207233610700231410ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Kaisen Lin * @author Phil Buonadonna * */ /* * Code to access some power management registers */ interface HplPXA27xPower { async command void setPWER(uint32_t val); async command void setPWRMode(uint8_t val); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HplPXA27xPowerM.nc000066400000000000000000000037561207233610700232710ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Kaisen Lin * @author Phil Buonadonna * */ module HplPXA27xPowerM { provides interface HplPXA27xPower; } implementation { async command void HplPXA27xPower.setPWER(uint32_t val) { PWER = val; } async command void HplPXA27xPower.setPWRMode(uint8_t val) { val = val & 0xF; asm volatile ( "mcr p14,0,%0,c7,c0,0" : : "r" (val) ); __nesc_enable_interrupt(); __nesc_disable_interrupt(); } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HplPXA27xRTC.nc000066400000000000000000000040071207233610700224760ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Kaisen Lin * @author Phil Buonadonna * */ /* * Code to access some RTC registers */ interface HplPXA27xRTC { async command void setRTCPICR(uint16_t val); async command uint16_t getRTCPICR(); async command void setPIAR(uint16_t val); async command uint16_t getPIAR(); async command void setRTSR(uint16_t val); async command void setSWAR1(uint32_t val); async command void setSWAR2(uint32_t val); async command void setSWCR(uint32_t val); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/timer/HplPXA27xRTCM.nc000066400000000000000000000043711207233610700226170ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Kaisen Lin * @author Phil Buonadonna * */ module HplPXA27xRTCM { provides interface HplPXA27xRTC; } implementation { async command void HplPXA27xRTC.setRTCPICR(uint16_t val) { RTCPICR = val; } async command uint16_t HplPXA27xRTC.getRTCPICR() { return RTCPICR; } async command void HplPXA27xRTC.setPIAR(uint16_t val) { PIAR = val; } async command uint16_t HplPXA27xRTC.getPIAR() { return PIAR; } async command void HplPXA27xRTC.setRTSR(uint16_t val) { RTSR = val; } async command void HplPXA27xRTC.setSWAR1(uint32_t val) { SWAR1 = val; } async command void HplPXA27xRTC.setSWAR2(uint32_t val) { SWAR2 = val; } async command void HplPXA27xRTC.setSWCR(uint32_t val) { SWCR = val; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/uart/000077500000000000000000000000001207233610700200005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/pxa27x/uart/HalPXA27xSerialCntl.nc000066400000000000000000000045661207233610700237340ustar00rootroot00000000000000/* $Id: HalPXA27xSerialCntl.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Phil Buonadonna */ #include "pxa27x_serial.h" interface HalPXA27xSerialCntl { /** * Modify runtime port parameters * * @param baudrate The integer value of baudrate * @param databits The Number of data bits * @param partiy Values of EVEN,ODD or NONE * @param stopbits Values of 1 or 2 * @param flow_cntl TRUE to enable hardware flow control * * @return SUCCESS if parameters successfully applied. FAIL otherwise */ async command error_t configPort(uint32_t baudrate, uint8_t databits, uart_parity_t parity, uint8_t stopbits, bool flow_cntl); /** * Flush the port FIFOs * * @return SUCCESS if flushed, FAIL otherwise. */ async command error_t flushPort(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/uart/HalPXA27xSerialP.nc000066400000000000000000000324001207233610700232170ustar00rootroot00000000000000/* $Id: HalPXA27xSerialP.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /** * Implements the UartByte, UartStream and HalPXA27xSerialPacket interface * for a PXA27x UART. * * * @param defaultRate Default baud rate for the serial port. * * * @author Phil Buonadonna */ #include "pxa27x_serial.h" generic module HalPXA27xSerialP(uint32_t defaultRate) { provides { interface Init; interface StdControl; interface UartByte; interface UartStream; interface HalPXA27xSerialPacket; interface HalPXA27xSerialCntl; } uses { interface Init as UARTInit; interface HplPXA27xUART as UART; interface HplPXA27xDMAChnl as RxDMA; interface HplPXA27xDMAChnl as TxDMA; interface HplPXA27xDMAInfo as UARTRxDMAInfo; interface HplPXA27xDMAInfo as UARTTxDMAInfo; } } implementation { uint8_t *txCurrentBuf, *rxCurrentBuf; uint32_t txCurrentLen, rxCurrentLen, rxCurrentIdx; uint32_t gulFCRShadow; bool gbUsingUartStreamSendIF = FALSE; bool gbUsingUartStreamRcvIF = FALSE; bool gbRcvByteEvtEnabled = TRUE; command error_t Init.init() { error_t error = SUCCESS; atomic { call UARTInit.init(); txCurrentBuf = rxCurrentBuf = NULL; gbUsingUartStreamSendIF = FALSE; gbUsingUartStreamRcvIF = FALSE; gbRcvByteEvtEnabled = TRUE; gulFCRShadow = (FCR_TRFIFOE | FCR_ITL(0)); // FIFO Mode, 1 byte Rx threshold } call TxDMA.setMap(call UARTTxDMAInfo.getMapIndex()); call RxDMA.setMap(call UARTRxDMAInfo.getMapIndex()); call TxDMA.setDALGNbit(TRUE); call RxDMA.setDALGNbit(TRUE); error = call HalPXA27xSerialCntl.configPort(defaultRate,8,NONE,1,FALSE); atomic {call UART.setFCR(gulFCRShadow);} return error; } command error_t StdControl.start() { atomic { call UART.setIER(IER_UUE | IER_RAVIE); } return SUCCESS; } command error_t StdControl.stop() { atomic { call UART.setIER(0); } return SUCCESS; } async command error_t UartByte.send(uint8_t data) { atomic call UART.setTHR(data); while ((call UART.getLSR() & LSR_TEMT) == 0); return SUCCESS; } async command error_t UartByte.receive( uint8_t *data, uint8_t timeout) { error_t error = FAIL; uint8_t t; for (t = 0; t < timeout; t++) { if (call UART.getLSR() & LSR_DR) { *data = call UART.getRBR(); error = SUCCESS; break; } } return error; } async command error_t UartStream.send( uint8_t* buf, uint16_t len ) { error_t error; atomic gbUsingUartStreamSendIF = TRUE; error = call HalPXA27xSerialPacket.send(buf,len); if (error) { atomic gbUsingUartStreamSendIF = FALSE; } return error; } async command error_t UartStream.enableReceiveInterrupt() { error_t error = SUCCESS; atomic { if (rxCurrentBuf == NULL) { call UART.setIER(call UART.getIER() | IER_RAVIE); } gbRcvByteEvtEnabled = TRUE; } return SUCCESS; } async command error_t UartStream.disableReceiveInterrupt() { atomic { // Check to make sure a short stream/packet call isn't in progress if ((rxCurrentBuf == NULL) || (rxCurrentLen >= 8)) { call UART.setIER(call UART.getIER() & ~IER_RAVIE); } gbRcvByteEvtEnabled = FALSE; } return SUCCESS; } async command error_t UartStream.receive( uint8_t* buf, uint16_t len ) { error_t error; atomic gbUsingUartStreamRcvIF = TRUE; error = call HalPXA27xSerialPacket.receive(buf,len,0); if (error) { atomic gbUsingUartStreamRcvIF = FALSE; } return error; } async command error_t HalPXA27xSerialPacket.send(uint8_t *buf, uint16_t len) { uint32_t txAddr; uint32_t DMAFlags; error_t error = SUCCESS; atomic { if (txCurrentBuf == NULL) { txCurrentBuf = buf; txCurrentLen = len; } else { error = FAIL; } } if (error) return error; if (len < 8) { uint16_t i; // Use PIO. Invariant: FIFO is empty atomic { gulFCRShadow |= FCR_TIL; call UART.setFCR(gulFCRShadow); } for (i = 0;i < len;i++) { call UART.setTHR(buf[i]); } atomic call UART.setIER(call UART.getIER() | IER_TIE); } else { // Use DMA DMAFlags = (DCMD_FLOWTRG | DCMD_BURST8 | DCMD_WIDTH1 | DCMD_ENDIRQEN | DCMD_LEN(len) ); txAddr = (uint32_t) buf; DMAFlags |= DCMD_INCSRCADDR; call TxDMA.setDCSR(DCSR_NODESCFETCH); call TxDMA.setDSADR(txAddr); call TxDMA.setDTADR(call UARTTxDMAInfo.getAddr()); call TxDMA.setDCMD(DMAFlags); atomic { call UART.setIER(call UART.getIER() | IER_DMAE); } call TxDMA.setDCSR(DCSR_RUN | DCSR_NODESCFETCH); } return error; } async command error_t HalPXA27xSerialPacket.receive(uint8_t *buf, uint16_t len, uint16_t timeout) { uint32_t rxAddr; uint32_t DMAFlags; error_t error = SUCCESS; atomic { if (rxCurrentBuf == NULL) { rxCurrentBuf = buf; rxCurrentLen = len; rxCurrentIdx = 0; } else { error = FAIL; } } if (error) return error; if (len < 8) { // Use PIO. Invariant: FIFO is empty atomic { gulFCRShadow = ((gulFCRShadow & ~(FCR_ITL(3))) | FCR_ITL(0)); call UART.setFCR(gulFCRShadow); call UART.setIER(call UART.getIER() | IER_RAVIE); } } else { // Use DMA DMAFlags = (DCMD_FLOWSRC | DCMD_BURST8 | DCMD_WIDTH1 | DCMD_ENDIRQEN | DCMD_LEN(len) ); rxAddr = (uint32_t) buf; DMAFlags |= DCMD_INCTRGADDR; call RxDMA.setDCSR(DCSR_NODESCFETCH); call RxDMA.setDTADR(rxAddr); call RxDMA.setDSADR(call UARTRxDMAInfo.getAddr()); call RxDMA.setDCMD(DMAFlags); atomic { gulFCRShadow = ((gulFCRShadow & ~(FCR_ITL(3))) | FCR_ITL(1)); call UART.setFCR(gulFCRShadow); call UART.setIER((call UART.getIER() & ~IER_RAVIE) | IER_DMAE); } call RxDMA.setDCSR(DCSR_RUN | DCSR_NODESCFETCH); } return error; } void DispatchStreamRcvSignal() { uint8_t *pBuf = rxCurrentBuf; uint16_t len = rxCurrentLen; rxCurrentBuf = NULL; if (gbUsingUartStreamRcvIF) { gbUsingUartStreamRcvIF = FALSE; signal UartStream.receiveDone(pBuf, len, SUCCESS); } else { pBuf = signal HalPXA27xSerialPacket.receiveDone(pBuf, len, SUCCESS); if (pBuf) { call HalPXA27xSerialPacket.receive(pBuf,len,0); } } return; } void DispatchStreamSendSignal() { uint8_t *pBuf = txCurrentBuf; uint16_t len = txCurrentLen; txCurrentBuf = NULL; if (gbUsingUartStreamSendIF) { gbUsingUartStreamSendIF = FALSE; signal UartStream.sendDone(pBuf, len, SUCCESS); } else { pBuf = signal HalPXA27xSerialPacket.sendDone(pBuf, len, SUCCESS); if (pBuf) { call HalPXA27xSerialPacket.send(pBuf,len); } } return; } async event void RxDMA.interruptDMA() { call RxDMA.setDCMD(0); call RxDMA.setDCSR(DCSR_EORINT | DCSR_ENDINTR | DCSR_STARTINTR | DCSR_BUSERRINTR); DispatchStreamRcvSignal(); if (gbRcvByteEvtEnabled) call UART.setIER(call UART.getIER() | IER_RAVIE); return; } async event void TxDMA.interruptDMA() { call TxDMA.setDCMD(0); call TxDMA.setDCSR(DCSR_EORINT | DCSR_ENDINTR | DCSR_STARTINTR | DCSR_BUSERRINTR); DispatchStreamSendSignal(); return; } async command error_t HalPXA27xSerialCntl.configPort(uint32_t baudrate, uint8_t databits, uart_parity_t parity, uint8_t stopbits, bool flow_cntl) { uint32_t uiDivisor; uint32_t valLCR = 0; uint32_t valMCR = MCR_OUT2; uiDivisor = 921600/baudrate; // Check for invalid baud rate divisor value. // XXX - Eventually could use '0' to imply auto rate detection if ((uiDivisor & 0xFFFF0000) || (uiDivisor == 0)) { return EINVAL; } if ((databits > 8 || databits < 5)) { return EINVAL; } valLCR |= LCR_WLS((databits-5)); switch (parity) { case EVEN: valLCR |= LCR_EPS; // Fall through to enable case ODD: valLCR |= LCR_PEN; break; case NONE: break; default: return EINVAL; break; } if ((stopbits > 2) || (stopbits < 1)) { return EINVAL; } else if (stopbits == 2) { valLCR |= LCR_STB; } if (flow_cntl) { valMCR |= MCR_AFE; } atomic { call UART.setDLL((uiDivisor & 0xFF)); call UART.setDLH(((uiDivisor >> 8) & 0xFF)); call UART.setLCR(valLCR); call UART.setMCR(valMCR); } return SUCCESS; } async command error_t HalPXA27xSerialCntl.flushPort() { atomic { call UART.setFCR(gulFCRShadow | FCR_RESETTF | FCR_RESETRF); } return SUCCESS; } async event void UART.interruptUART() { uint8_t error, intSource; uint8_t ucByte; intSource = call UART.getIIR(); intSource &= IIR_IID_MASK; intSource = intSource >> 1; switch (intSource) { case 0: // MODEM STATUS break; case 1: // TRANSMIT FIFO call UART.setIER(call UART.getIER() & ~IER_TIE); DispatchStreamSendSignal(); break; case 2: // RECEIVE FIFO data available while (call UART.getLSR() & LSR_DR) { ucByte = call UART.getRBR(); if (rxCurrentBuf != NULL) { rxCurrentBuf[rxCurrentIdx] = ucByte; rxCurrentIdx++; if (rxCurrentIdx >= rxCurrentLen) DispatchStreamRcvSignal(); } else if (gbRcvByteEvtEnabled) { signal UartStream.receivedByte(ucByte); } } break; case 3: // ERROR error = call UART.getLSR(); break; default: break; } return; } default async event void UartStream.sendDone( uint8_t* buf, uint16_t len, error_t error ) { return; } default async event void UartStream.receivedByte(uint8_t data) { return; } default async event void UartStream.receiveDone( uint8_t* buf, uint16_t len, error_t error ) { return; } default async event uint8_t* HalPXA27xSerialPacket.sendDone(uint8_t *buf, uint16_t len, uart_status_t status) { return NULL; } default async event uint8_t* HalPXA27xSerialPacket.receiveDone(uint8_t *buf, uint16_t len, uart_status_t status) { return NULL; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/uart/HalPXA27xSerialPacket.nc000066400000000000000000000067441207233610700242430ustar00rootroot00000000000000/* $Id: HalPXA27xSerialPacket.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Phil Buonadonna */ #include "pxa27x_serial.h" interface HalPXA27xSerialPacket { /** * Begin transmission of a UART stream. If SUCCESS is returned, * sendDone will be signalled when transmission is * complete. * * @param buf Buffer for bytes to send. * @param len Number of bytes to send. * @return SUCCESS if request was accepted, FAIL otherwise. */ async command error_t send(uint8_t *buf, uint16_t len); /** * Signal completion of sending a stream. * * @param buf Bytes sent. * @param len Number of bytes sent. * @param status UART error status. * * @return buf A pointer to a new buffer of equal length * as in the original send call that is to be transmitted (chained * send). Set to NULL to end further transmissions. */ async event uint8_t *sendDone(uint8_t *buf, uint16_t len, uart_status_t status); /** * Begin reception of a UART stream. If SUCCESS is returned, * receiveDone will be signalled when reception is * complete. * * @param buf Buffer for received bytes. * @param len Number of bytes to receive. * @param timeout Timeout, in milliseconds, for receive operation * * @return SUCCESS if request was accepted, FAIL otherwise. */ async command error_t receive(uint8_t *buf, uint16_t len, uint16_t timeout); /** * Signal completion of receiving a stream. * * @param buf Buffer for bytes received. * @param len Number of bytes received. * @param status UART error status * * @return buf A pointer to a new buffer of equal or greater length * as in the original receive call in which it intiate a * new packet reception (chained receive). Set to NULL to terminate further * reception. */ async event uint8_t *receiveDone(uint8_t *buf, uint16_t len, uart_status_t status); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/uart/HplPXA27xBTUARTC.nc000066400000000000000000000037631207233610700230150ustar00rootroot00000000000000/* $Id: HplPXA27xBTUARTC.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ configuration HplPXA27xBTUARTC { provides interface Init; provides interface HplPXA27xUART as BTUART; } implementation { components new HplPXA27xUARTP((uint32_t)&BTRBR); components HplPXA27xInterruptM; Init = HplPXA27xUARTP; BTUART = HplPXA27xUARTP.UART; HplPXA27xUARTP.UARTIrq -> HplPXA27xInterruptM.PXA27xIrq[PPID_BTUART]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/uart/HplPXA27xFFUARTC.nc000066400000000000000000000037631207233610700230030ustar00rootroot00000000000000/* $Id: HplPXA27xFFUARTC.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ configuration HplPXA27xFFUARTC { provides interface Init; provides interface HplPXA27xUART as FFUART; } implementation { components new HplPXA27xUARTP((uint32_t)&FFRBR); components HplPXA27xInterruptM; Init = HplPXA27xUARTP; FFUART = HplPXA27xUARTP.UART; HplPXA27xUARTP.UARTIrq -> HplPXA27xInterruptM.PXA27xIrq[PPID_FFUART]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/uart/HplPXA27xSTUARTC.nc000066400000000000000000000037631207233610700230360ustar00rootroot00000000000000/* $Id: HplPXA27xSTUARTC.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ configuration HplPXA27xSTUARTC { provides interface Init; provides interface HplPXA27xUART as STUART; } implementation { components new HplPXA27xUARTP((uint32_t)&STRBR); components HplPXA27xInterruptM; Init = HplPXA27xUARTP; STUART = HplPXA27xUARTP.UART; HplPXA27xUARTP.UARTIrq -> HplPXA27xInterruptM.PXA27xIrq[PPID_STUART]; } tinyos-2.1.2+dfsg/tos/chips/pxa27x/uart/HplPXA27xUART.nc000066400000000000000000000055271207233610700224640ustar00rootroot00000000000000/* $Id: HplPXA27xUART.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * Interface to access UART peripheral register on the PXA27x. Function * names are based on the common portion of the names outlined in * the PXA27x Developers Guide. * * @author Phil Buonadonna */ interface HplPXA27xUART { async command uint32_t getRBR(); async command void setTHR(uint32_t val); async command void setDLL(uint32_t val); async command uint32_t getDLL(); async command void setDLH(uint32_t val); async command uint32_t getDLH(); async command void setIER(uint32_t val); async command uint32_t getIER(); async command uint32_t getIIR(); async command void setFCR(uint32_t val); async command void setLCR(uint32_t val); async command uint32_t getLCR(); async command void setMCR(uint32_t val); async command uint32_t getMCR(); async command uint32_t getLSR(); async command uint32_t getMSR(); async command void setSPR(uint32_t val); async command uint32_t getSPR(); async command void setISR(uint32_t val); async command uint32_t getISR(); async command void setFOR(uint32_t val); async command uint32_t getFOR(); async command void setABR(uint32_t val); async command uint32_t getABR(); async command uint32_t getACR(); async event void interruptUART(); } tinyos-2.1.2+dfsg/tos/chips/pxa27x/uart/HplPXA27xUARTP.nc000066400000000000000000000122561207233610700226010ustar00rootroot00000000000000/* $Id: HplPXA27xUARTP.nc,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * Provides low-level initialization, 1st level interrupt dispatch and register * access for the different uarts. It is a generic that's bound to * the particular UART upon creation. * * @param baseaddr. The base address of the associated uart. One of * &FFRBR, &BTRBR or &STRBR. * This component automatically handles setting of the DLAB bit for * divisor register access (DLL and DLH) * * @author Phil Buonadonna */ #include "PXA27X_UARTREG.h" generic module HplPXA27xUARTP(uint32_t base_addr) { provides interface Init; provides interface HplPXA27xUART as UART; uses interface HplPXA27xInterrupt as UARTIrq; } implementation { bool m_fInit = FALSE; command error_t Init.init() { bool isInited; atomic { isInited = m_fInit; m_fInit = TRUE; } if (!isInited) { switch (base_addr) { case (0x40100000): CKEN |= CKEN6_FFUART; break; case (0x40200000): CKEN |= CKEN7_BTUART; break; case (0x40700000): CKEN |= CKEN5_STUART; break; default: break; } call UARTIrq.allocate(); call UARTIrq.enable(); UARTLCR(base_addr) |= LCR_DLAB; UARTDLL(base_addr) = 0x04; UARTDLH(base_addr) = 0x00; UARTLCR(base_addr) &= ~LCR_DLAB; } return SUCCESS; } async command uint32_t UART.getRBR() { return UARTRBR(base_addr); } async command void UART.setTHR(uint32_t val) { UARTTHR(base_addr) = val; } async command void UART.setDLL(uint32_t val) { UARTLCR(base_addr) |= LCR_DLAB; UARTDLL(base_addr) = val; UARTLCR(base_addr) &= ~LCR_DLAB; } async command uint32_t UART.getDLL() { uint32_t val; UARTLCR(base_addr) |= LCR_DLAB; val = UARTDLL(base_addr); UARTLCR(base_addr) &= ~LCR_DLAB; return val; } async command void UART.setDLH(uint32_t val) { UARTLCR(base_addr) |= LCR_DLAB; UARTDLH(base_addr) = val; UARTLCR(base_addr) &= ~LCR_DLAB; } async command uint32_t UART.getDLH() { uint32_t val; UARTLCR(base_addr) |= LCR_DLAB; val = UARTDLH(base_addr); UARTLCR(base_addr) &= ~LCR_DLAB; return val; } async command void UART.setIER(uint32_t val) { UARTIER(base_addr) = val; } async command uint32_t UART.getIER() { return UARTIER(base_addr); } async command uint32_t UART.getIIR() { return UARTIIR(base_addr); } async command void UART.setFCR(uint32_t val) { UARTFCR(base_addr) = val; } async command void UART.setLCR(uint32_t val) { UARTLCR(base_addr) = val; } async command uint32_t UART.getLCR() { return UARTLCR(base_addr); } async command void UART.setMCR(uint32_t val) { UARTMCR(base_addr) = val; } async command uint32_t UART.getMCR() { return UARTMCR(base_addr); } async command uint32_t UART.getLSR() { return UARTLSR(base_addr); } async command uint32_t UART.getMSR() { return UARTMSR(base_addr); } async command void UART.setSPR(uint32_t val) { UARTSPR(base_addr) = val; } async command uint32_t UART.getSPR() { return UARTSPR(base_addr); } async command void UART.setISR(uint32_t val) { UARTISR(base_addr) = val; } async command uint32_t UART.getISR() { return UARTISR(base_addr); } async command void UART.setFOR(uint32_t val) { UARTFOR(base_addr) = val; } async command uint32_t UART.getFOR() { return UARTFOR(base_addr); } async command void UART.setABR(uint32_t val) { UARTABR(base_addr) = val; } async command uint32_t UART.getABR() { return UARTABR(base_addr); } async command uint32_t UART.getACR() { return UARTACR(base_addr); } async event void UARTIrq.fired () { signal UART.interruptUART(); } default async event void UART.interruptUART() { return; } } tinyos-2.1.2+dfsg/tos/chips/pxa27x/uart/PXA27X_UARTREG.h000066400000000000000000000050611207233610700222750ustar00rootroot00000000000000/* $Id: PXA27X_UARTREG.h,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * Helper macros to make programming the HplPXA27xUARTP component easier */ #ifndef _PXA27X_UARTREG_H #define _PXA27X_UARTREG_H #define UARTRBR(_base) _PXAREG_OFFSET(_base,0) #define UARTTHR(_base) _PXAREG_OFFSET(_base,0) #define UARTIER(_base) _PXAREG_OFFSET(_base,0x04) #define UARTIIR(_base) _PXAREG_OFFSET(_base,0x08) #define UARTFCR(_base) _PXAREG_OFFSET(_base,0x08) #define UARTLCR(_base) _PXAREG_OFFSET(_base,0x0C) #define UARTMCR(_base) _PXAREG_OFFSET(_base,0x10) #define UARTLSR(_base) _PXAREG_OFFSET(_base,0x14) #define UARTMSR(_base) _PXAREG_OFFSET(_base,0x18) #define UARTSPR(_base) _PXAREG_OFFSET(_base,0x1C) #define UARTISR(_base) _PXAREG_OFFSET(_base,0x20) #define UARTFOR(_base) _PXAREG_OFFSET(_base,0x24) #define UARTABR(_base) _PXAREG_OFFSET(_base,0x28) #define UARTACR(_base) _PXAREG_OFFSET(_base,0x2C) #define UARTDLL(_base) _PXAREG_OFFSET(_base,0) #define UARTDLH(_base) _PXAREG_OFFSET(_base,0x04) #endif /* _PXA27X_UARTREG_H */ tinyos-2.1.2+dfsg/tos/chips/pxa27x/uart/pxa27x_serial.h000066400000000000000000000035061207233610700226450ustar00rootroot00000000000000/* $Id: pxa27x_serial.h,v 1.5 2008-06-11 00:42:13 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ #ifndef _pxa27x_serial_h #define _pxa27x_serial_h typedef uint8_t uart_status_t; // ??? if this is supposed to be a uint8_t typedef enum { EVEN, ODD, NONE } uart_parity_t; #endif /* _pxa27x_serial_h */ tinyos-2.1.2+dfsg/tos/chips/rf212/000077500000000000000000000000001207233610700165305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/rf212/README000066400000000000000000000023521207233610700174120ustar00rootroot00000000000000 The RF212 radio driver has the following configuration options. Some of these are set in the platforms/xxx/chips/rf212/RadioConfig.h header file, see the meshbean900 platform for example, others can be set in your Makefile. RF212_TRX_CTRL_0_VALUE: This is the value of the TRX_CTRL_0 register which configures the output pin currents and the CLKM clock: RF212_CCA_MODE_VALUE: This is the default value of the CCA_MODE field in the PHY_CC_CCA register which is used to configure the default mode of the clear channel assesment RF212_CCA_THRES_VALUE: This is the value of the CCA_THRES register that controls the energy levels used for clear channel assesment. RF212_DEF_RFPOWER: This is the default value of the TX_PWR field of the PHY_TX_PWR register. This can be cahanged via the PacketTransmitPower interface provided by the RF212ActiveMessageC. RF212_DEF_CHANNEL: This is the default value of the CHANNEL field of the PHY_CC_CCA register. This can be cahanged via the RadioChannel interface provided by the RF212ActiveMessageC. RF212_RSSI_ENERGY: If you define this, then the content of the RF212_PHY_ED_LEVEL is queried instead of the RSSI value for eahc incoming message. This value can be obtained with the PacketRSSI interface. tinyos-2.1.2+dfsg/tos/chips/rf212/RF212ActiveMessageC.nc000066400000000000000000000064001207233610700223520ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #ifdef IEEE154FRAMES_ENABLED #error "You cannot use ActiveMessageC with IEEE154FRAMES_ENABLED defined" #endif configuration RF212ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface SendNotifier[am_id_t id]; // for TOSThreads interface Receive as ReceiveDefault[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketField as PacketLinkQuality; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface LinkPacketMetadata; interface LocalTime as LocalTimeRadio; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components RF212RadioC as RadioC; SplitControl = RadioC; AMSend = RadioC; Receive = RadioC.Receive; Snoop = RadioC.Snoop; SendNotifier = RadioC; ReceiveDefault = RadioC.ReceiveDefault; SnoopDefault = RadioC.SnoopDefault; Packet = RadioC.PacketForActiveMessage; AMPacket = RadioC; PacketAcknowledgements = RadioC; LowPowerListening = RadioC; PacketLink = RadioC; RadioChannel = RadioC; PacketLinkQuality = RadioC.PacketLinkQuality; PacketTransmitPower = RadioC.PacketTransmitPower; PacketRSSI = RadioC.PacketRSSI; LinkPacketMetadata = RadioC; LocalTimeRadio = RadioC; PacketTimeStampMilli = RadioC; PacketTimeStampRadio = RadioC; } tinyos-2.1.2+dfsg/tos/chips/rf212/RF212DriverConfig.nc000066400000000000000000000050541207233610700221140ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface RF212DriverConfig { /** * Returns the length of a dummy header to align the payload properly. */ async command uint8_t headerLength(message_t* msg); /** * Returns the maximum length of the PHY payload including the * length field but not counting the FCF field. */ async command uint8_t maxPayloadLength(); /** * Returns the length of a dummy metadata section to align the * metadata section properly. */ async command uint8_t metadataLength(message_t* msg); /** * Gets the number of bytes we should read before the RadioReceive.header * event is fired. If the length of the packet is less than this amount, * then that event is fired earlier. The header length must be at least one. */ async command uint8_t headerPreloadLength(); /** * Returns TRUE if before sending this message we should make sure that * the channel is clear via a very basic (and quick) RSSI check. */ async command bool requiresRssiCca(message_t* msg); } tinyos-2.1.2+dfsg/tos/chips/rf212/RF212DriverLayer.h000066400000000000000000000127151207233610700216140ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __RF212DRIVERLAYER_H__ #define __RF212DRIVERLAYER_H__ typedef nx_struct rf212_header_t { nxle_uint8_t length; } rf212_header_t; typedef struct rf212_metadata_t { uint8_t lqi; union { uint8_t power; uint8_t rssi; }; } rf212_metadata_t; enum rf212_registers_enum { RF212_TRX_STATUS = 0x01, RF212_TRX_STATE = 0x02, RF212_TRX_CTRL_0 = 0x03, RF212_TRX_CTRL_1 = 0x04, RF212_PHY_TX_PWR = 0x05, RF212_PHY_RSSI = 0x06, RF212_PHY_ED_LEVEL = 0x07, RF212_PHY_CC_CCA = 0x08, RF212_CCA_THRES = 0x09, RF212_TRX_CTRL_2 = 0x0C, RF212_IRQ_MASK = 0x0E, RF212_IRQ_STATUS = 0x0F, RF212_VREG_CTRL = 0x10, RF212_BATMON = 0x11, RF212_XOSC_CTRL = 0x12, RF212_PLL_CF = 0x1A, RF212_PLL_DCU = 0x1B, RF212_PART_NUM = 0x1C, RF212_VERSION_NUM = 0x1D, RF212_MAN_ID_0 = 0x1E, RF212_MAN_ID_1 = 0x1F, RF212_SHORT_ADDR_0 = 0x20, RF212_SHORT_ADDR_1 = 0x21, RF212_PAN_ID_0 = 0x22, RF212_PAN_ID_1 = 0x23, RF212_IEEE_ADDR_0 = 0x24, RF212_IEEE_ADDR_1 = 0x25, RF212_IEEE_ADDR_2 = 0x26, RF212_IEEE_ADDR_3 = 0x27, RF212_IEEE_ADDR_4 = 0x28, RF212_IEEE_ADDR_5 = 0x29, RF212_IEEE_ADDR_6 = 0x2A, RF212_IEEE_ADDR_7 = 0x2B, RF212_XAH_CTRL = 0x2C, RF212_CSMA_SEED_0 = 0x2D, RF212_CSMA_SEED_1 = 0x2E, }; enum rf212_trx_status_enums { RF212_CCA_DONE = 1 << 7, RF212_CCA_STATUS = 1 << 6, RF212_TRX_STATUS_MASK = 0x1F, RF212_P_ON = 0, RF212_BUSY_RX = 1, RF212_BUSY_TX = 2, RF212_RX_ON = 6, RF212_TRX_OFF = 8, RF212_PLL_ON = 9, RF212_SLEEP = 15, RF212_BUSY_RX_AACK = 17, RF212_BUSR_TX_ARET = 18, RF212_RX_AACK_ON = 22, RF212_TX_ARET_ON = 25, RF212_RX_ON_NOCLK = 28, RF212_AACK_ON_NOCLK = 29, RF212_BUSY_RX_AACK_NOCLK = 30, RF212_STATE_TRANSITION_IN_PROGRESS = 31, }; enum rf212_trx_state_enums { RF212_TRAC_STATUS_MASK = 0xE0, RF212_TRAC_SUCCESS = 0, RF212_TRAC_SUCCESS_DATA_PENDING = 1 << 5, RF212_TRAC_SUCCESS_WAIT_FOR_ACK = 2 << 5, RF212_TRAC_CHANNEL_ACCESS_FAILURE = 3 << 5, RF212_TRAC_NO_ACK = 5 << 5, RF212_TRAC_INVALID = 7 << 5, RF212_TRX_CMD_MASK = 0x1F, RF212_NOP = 0, RF212_TX_START = 2, RF212_FORCE_TRX_OFF = 3, }; enum rf212_trx_data_modes { RF212_DATA_MODE_BPSK_20 = 0x00, RF212_DATA_MODE_BPSK_40 = 0x04, RF212_DATA_MODE_OQPSK_SIN_RC_100 = 0x08, RF212_DATA_MODE_OQPSK_SIN_RC_200 = 0x09, RF212_DATA_MODE_OQPSK_SIN_RC_400_SCR = 0x2A, RF212_DATA_MODE_OQPSK_SIN_RC_400 = 0x0A, RF212_DATA_MODE_OQPSK_SIN_250 = 0x0C, RF212_DATA_MODE_OQPSK_SIN_500 = 0x0D, RF212_DATA_MODE_OQPSK_SIN_1000_SCR = 0x2E, RF212_DATA_MODE_OQPSK_SIN_1000 = 0x0E, RF212_DATA_MODE_OQPSK_RC_250 = 0x1C, RF212_DATA_MODE_OQPSK_RC_500 = 0x1D, RF212_DATA_MODE_OQPSK_RC_1000_SCR = 0x3E, RF212_DATA_MODE_OQPSK_RC_1000 = 0x1E, RF212_DATA_MODE_DEFAULT = 0x00, // BPSK_20 }; enum rf212_phy_rssi_enums { RF212_RX_CRC_VALID = 1 << 7, RF212_RSSI_MASK = 0x1F, }; enum rf212_phy_cc_cca_enums { RF212_CCA_REQUEST = 1 << 7, RF212_CCA_MODE_0 = 0 << 5, RF212_CCA_MODE_1 = 1 << 5, RF212_CCA_MODE_2 = 2 << 5, RF212_CCA_MODE_3 = 3 << 5, RF212_CHANNEL_DEFAULT = 11, RF212_CHANNEL_MASK = 0x1F, }; enum rf212_irq_register_enums { RF212_IRQ_BAT_LOW = 1 << 7, RF212_IRQ_TRX_UR = 1 << 6, RF212_IRQ_AMI = 1 << 5, RF212_IRQ_CCA_ED_DONE = 1 << 4, RF212_IRQ_TRX_END = 1 << 3, RF212_IRQ_RX_START = 1 << 2, RF212_IRQ_PLL_UNLOCK = 1 << 1, RF212_IRQ_PLL_LOCK = 1 << 0, }; enum rf212_batmon_enums { RF212_BATMON_OK = 1 << 5, RF212_BATMON_VHR = 1 << 4, RF212_BATMON_VTH_MASK = 0x0F, }; enum rf212_vreg_ctrl_enums { RF212_AVREG_EXT = 1 << 7, RF212_AVDD_OK = 1 << 6, RF212_DVREG_EXT = 1 << 3, RF212_DVDD_OK = 1 << 2, }; enum rf212_xosc_ctrl_enums { RF212_XTAL_MODE_OFF = 0 << 4, RF212_XTAL_MODE_EXTERNAL = 4 << 4, RF212_XTAL_MODE_INTERNAL = 15 << 4, }; enum rf212_spi_command_enums { RF212_CMD_REGISTER_READ = 0x80, RF212_CMD_REGISTER_WRITE = 0xC0, RF212_CMD_REGISTER_MASK = 0x3F, RF212_CMD_FRAME_READ = 0x20, RF212_CMD_FRAME_WRITE = 0x60, RF212_CMD_SRAM_READ = 0x00, RF212_CMD_SRAM_WRITE = 0x40, }; #endif//__RF212DRIVERLAYER_H__ tinyos-2.1.2+dfsg/tos/chips/rf212/RF212DriverLayerC.nc000066400000000000000000000075431207233610700220730ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include configuration RF212DriverLayerC { provides { interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; interface LinkPacketMetadata; interface LocalTime as LocalTimeRadio; interface Alarm; } uses { interface RF212DriverConfig as Config; interface PacketTimeStamp; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; interface RadioAlarm; } } implementation { components RF212DriverLayerP, HplRF212C, BusyWaitMicroC, TaskletC, MainC; RadioState = RF212DriverLayerP; RadioSend = RF212DriverLayerP; RadioReceive = RF212DriverLayerP; RadioCCA = RF212DriverLayerP; RadioPacket = RF212DriverLayerP; LocalTimeRadio = HplRF212C; Config = RF212DriverLayerP; PacketTransmitPower = RF212DriverLayerP.PacketTransmitPower; TransmitPowerFlag = RF212DriverLayerP.TransmitPowerFlag; PacketRSSI = RF212DriverLayerP.PacketRSSI; RSSIFlag = RF212DriverLayerP.RSSIFlag; PacketTimeSyncOffset = RF212DriverLayerP.PacketTimeSyncOffset; TimeSyncFlag = RF212DriverLayerP.TimeSyncFlag; PacketLinkQuality = RF212DriverLayerP.PacketLinkQuality; PacketTimeStamp = RF212DriverLayerP.PacketTimeStamp; LinkPacketMetadata = RF212DriverLayerP; RF212DriverLayerP.LocalTime -> HplRF212C; Alarm = HplRF212C.Alarm; RadioAlarm = RF212DriverLayerP.RadioAlarm; RF212DriverLayerP.SELN -> HplRF212C.SELN; RF212DriverLayerP.SpiResource -> HplRF212C.SpiResource; RF212DriverLayerP.FastSpiByte -> HplRF212C; RF212DriverLayerP.SLP_TR -> HplRF212C.SLP_TR; RF212DriverLayerP.RSTN -> HplRF212C.RSTN; RF212DriverLayerP.IRQ -> HplRF212C.IRQ; RF212DriverLayerP.Tasklet -> TaskletC; RF212DriverLayerP.BusyWait -> BusyWaitMicroC; #ifdef RADIO_DEBUG components DiagMsgC; RF212DriverLayerP.DiagMsg -> DiagMsgC; #endif MainC.SoftwareInit -> RF212DriverLayerP.SoftwareInit; components RealMainP; RealMainP.PlatformInit -> RF212DriverLayerP.PlatformInit; } tinyos-2.1.2+dfsg/tos/chips/rf212/RF212DriverLayerP.nc000066400000000000000000000643121207233610700221050ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti * Author: Andras Biro */ #include #include #include #include #include module RF212DriverLayerP { provides { interface Init as PlatformInit @exactlyonce(); interface Init as SoftwareInit @exactlyonce(); interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; interface LinkPacketMetadata; } uses { interface GeneralIO as SELN; interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as SLP_TR; interface GeneralIO as RSTN; interface GpioCapture as IRQ; interface BusyWait; interface LocalTime; interface RF212DriverConfig as Config; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; interface PacketTimeStamp; interface Tasklet; interface RadioAlarm; #ifdef RADIO_DEBUG interface DiagMsg; #endif } } implementation { rf212_header_t* getHeader(message_t* msg) { return ((void*)msg) + call Config.headerLength(msg); } void* getPayload(message_t* msg) { return ((void*)msg) + call RadioPacket.headerLength(msg); } rf212_metadata_t* getMeta(message_t* msg) { return ((void*)msg) + sizeof(message_t) - call RadioPacket.metadataLength(msg); } /*----------------- STATE -----------------*/ tasklet_norace uint8_t state; enum { STATE_P_ON = 0, STATE_SLEEP = 1, STATE_SLEEP_2_TRX_OFF = 2, STATE_TRX_OFF = 3, STATE_TRX_OFF_2_RX_ON = 4, STATE_RX_ON = 5, STATE_BUSY_TX_2_RX_ON = 6, }; tasklet_norace uint8_t cmd; enum { CMD_NONE = 0, // the state machine has stopped CMD_TURNOFF = 1, // goto SLEEP state CMD_STANDBY = 2, // goto TRX_OFF state CMD_TURNON = 3, // goto RX_ON state CMD_TRANSMIT = 4, // currently transmitting a message CMD_RECEIVE = 5, // currently receiving a message CMD_CCA = 6, // performing clear chanel assesment CMD_CHANNEL = 7, // changing the channel CMD_SIGNAL_DONE = 8, // signal the end of the state transition CMD_DOWNLOAD = 9, // download the received message }; norace bool radioIrq; tasklet_norace uint8_t txPower; tasklet_norace uint8_t channel; tasklet_norace message_t* rxMsg; message_t rxMsgBuffer; uint16_t capturedTime; // the current time when the last interrupt has occured tasklet_norace uint8_t rssiClear; tasklet_norace uint8_t rssiBusy; /*----------------- REGISTER -----------------*/ inline void writeRegister(uint8_t reg, uint8_t value) { RADIO_ASSERT( call SpiResource.isOwner() ); RADIO_ASSERT( reg == (reg & RF212_CMD_REGISTER_MASK) ); call SELN.clr(); call FastSpiByte.splitWrite(RF212_CMD_REGISTER_WRITE | reg); call FastSpiByte.splitReadWrite(value); call FastSpiByte.splitRead(); call SELN.set(); } inline uint8_t readRegister(uint8_t reg) { RADIO_ASSERT( call SpiResource.isOwner() ); RADIO_ASSERT( reg == (reg & RF212_CMD_REGISTER_MASK) ); call SELN.clr(); call FastSpiByte.splitWrite(RF212_CMD_REGISTER_READ | reg); call FastSpiByte.splitReadWrite(0); reg = call FastSpiByte.splitRead(); call SELN.set(); return reg; } /*----------------- ALARM -----------------*/ // TODO: these constants are depending on the (changable) physical layer enum { TX_SFD_DELAY = (uint16_t)(177 * RADIO_ALARM_MICROSEC), RX_SFD_DELAY = (uint16_t)(8 * RADIO_ALARM_MICROSEC), }; tasklet_async event void RadioAlarm.fired() { } /*----------------- INIT -----------------*/ command error_t PlatformInit.init() { call SELN.makeOutput(); call SELN.set(); call SLP_TR.makeOutput(); call SLP_TR.clr(); call RSTN.makeOutput(); call RSTN.set(); rxMsg = &rxMsgBuffer; // these are just good approximates rssiClear = 0; rssiBusy = 90; return SUCCESS; } command error_t SoftwareInit.init() { // for powering up the radio return call SpiResource.request(); } void resetRadio() { //TODO: all waiting should be optimized in this function call BusyWait.wait(15); call RSTN.clr(); call SLP_TR.clr(); call BusyWait.wait(15); call RSTN.set(); writeRegister(RF212_TRX_CTRL_0, RF212_TRX_CTRL_0_VALUE); writeRegister(RF212_TRX_STATE, RF212_TRX_OFF); //this is way too much (should be done in around 200us), but 510 seemd too short, and it happens quite rarely call BusyWait.wait(1000); writeRegister(RF212_IRQ_MASK, RF212_IRQ_TRX_UR | RF212_IRQ_PLL_LOCK | RF212_IRQ_TRX_END | RF212_IRQ_RX_START | RF212_IRQ_CCA_ED_DONE); // update register values if different from default if( RF212_CCA_THRES_VALUE != 0x77 ) writeRegister(RF212_CCA_THRES, RF212_CCA_THRES_VALUE); if( RF212_DEF_RFPOWER != 0x60 ) writeRegister(RF212_PHY_TX_PWR, RF212_DEF_RFPOWER); if( RF212_TRX_CTRL_2_VALUE != RF212_DATA_MODE_DEFAULT ) writeRegister(RF212_TRX_CTRL_2, RF212_TRX_CTRL_2_VALUE); writeRegister(RF212_PHY_CC_CCA, RF212_CCA_MODE_VALUE | channel); state = STATE_TRX_OFF; } void initRadio() { call BusyWait.wait(510); call RSTN.clr(); call SLP_TR.clr(); call BusyWait.wait(6); call RSTN.set(); writeRegister(RF212_TRX_CTRL_0, RF212_TRX_CTRL_0_VALUE); writeRegister(RF212_TRX_STATE, RF212_TRX_OFF); call BusyWait.wait(510); writeRegister(RF212_IRQ_MASK, RF212_IRQ_TRX_UR | RF212_IRQ_PLL_LOCK | RF212_IRQ_TRX_END | RF212_IRQ_RX_START | RF212_IRQ_CCA_ED_DONE); // update register values if different from default if( RF212_CCA_THRES_VALUE != 0x77 ) writeRegister(RF212_CCA_THRES, RF212_CCA_THRES_VALUE); if( RF212_DEF_RFPOWER != 0x60 ) writeRegister(RF212_PHY_TX_PWR, RF212_DEF_RFPOWER); if( RF212_TRX_CTRL_2_VALUE != RF212_DATA_MODE_DEFAULT ) writeRegister(RF212_TRX_CTRL_2, RF212_TRX_CTRL_2_VALUE); txPower = RF212_DEF_RFPOWER; channel = RF212_DEF_CHANNEL & RF212_CHANNEL_MASK; writeRegister(RF212_PHY_CC_CCA, RF212_CCA_MODE_VALUE | channel); call SLP_TR.set(); state = STATE_SLEEP; } /*----------------- SPI -----------------*/ event void SpiResource.granted() { call SELN.makeOutput(); call SELN.set(); if( state == STATE_P_ON ) { initRadio(); call SpiResource.release(); } else call Tasklet.schedule(); } bool isSpiAcquired() { if( call SpiResource.isOwner() ) return TRUE; if( call SpiResource.immediateRequest() == SUCCESS ) { call SELN.makeOutput(); call SELN.set(); return TRUE; } call SpiResource.request(); return FALSE; } /*----------------- CHANNEL -----------------*/ tasklet_async command uint8_t RadioState.getChannel() { return channel; } tasklet_async command error_t RadioState.setChannel(uint8_t c) { c &= RF212_CHANNEL_MASK; if( cmd != CMD_NONE ) return EBUSY; else if( channel == c ) return EALREADY; channel = c; cmd = CMD_CHANNEL; call Tasklet.schedule(); return SUCCESS; } inline void changeChannel() { RADIO_ASSERT( cmd == CMD_CHANNEL ); RADIO_ASSERT( state == STATE_SLEEP || state == STATE_TRX_OFF || state == STATE_RX_ON ); if( isSpiAcquired() ) { writeRegister(RF212_PHY_CC_CCA, RF212_CCA_MODE_VALUE | channel); if( state == STATE_RX_ON ) state = STATE_TRX_OFF_2_RX_ON; else cmd = CMD_SIGNAL_DONE; } } /*----------------- TURN ON/OFF -----------------*/ inline void changeState() { if( (cmd == CMD_STANDBY || cmd == CMD_TURNON) && state == STATE_SLEEP && isSpiAcquired()) { RADIO_ASSERT( ! radioIrq ); call IRQ.captureRisingEdge(); state = STATE_SLEEP_2_TRX_OFF; call SLP_TR.clr(); } else if( cmd == CMD_TURNON && state == STATE_TRX_OFF && isSpiAcquired() ) { // setChannel was ignored in SLEEP because the SPI was not working, so do it here writeRegister(RF212_PHY_CC_CCA, RF212_CCA_MODE_VALUE | channel); writeRegister(RF212_TRX_STATE, RF212_RX_ON); state = STATE_TRX_OFF_2_RX_ON; } else if( (cmd == CMD_TURNOFF || cmd == CMD_STANDBY) && state == STATE_RX_ON && isSpiAcquired() ) { call IRQ.disable(); writeRegister(RF212_TRX_STATE, RF212_FORCE_TRX_OFF); state = STATE_TRX_OFF; } if( cmd == CMD_TURNOFF && state == STATE_TRX_OFF ) { readRegister(RF212_IRQ_STATUS); // clear the interrupt register call SLP_TR.set(); state = STATE_SLEEP; cmd = CMD_SIGNAL_DONE; } else if( cmd == CMD_STANDBY && state == STATE_TRX_OFF ) cmd = CMD_SIGNAL_DONE; } tasklet_async command error_t RadioState.turnOff() { if( cmd != CMD_NONE ) return EBUSY; else if( state == STATE_SLEEP ) return EALREADY; cmd = CMD_TURNOFF; call Tasklet.schedule(); return SUCCESS; } tasklet_async command error_t RadioState.standby() { if( cmd != CMD_NONE ) return EBUSY; else if( state == STATE_TRX_OFF ) return EALREADY; cmd = CMD_STANDBY; call Tasklet.schedule(); return SUCCESS; } tasklet_async command error_t RadioState.turnOn() { if( cmd != CMD_NONE ) return EBUSY; else if( state == STATE_RX_ON ) return EALREADY; cmd = CMD_TURNON; call Tasklet.schedule(); return SUCCESS; } default tasklet_async event void RadioState.done() { } /*----------------- TRANSMIT -----------------*/ tasklet_async command error_t RadioSend.send(message_t* msg) { uint16_t time; uint8_t length; uint8_t* data; uint8_t header; uint32_t time32; void* timesync; if( cmd != CMD_NONE || state != STATE_RX_ON || ! isSpiAcquired() || radioIrq ) return EBUSY; length = call PacketTransmitPower.isSet(msg) ? call PacketTransmitPower.get(msg) : RF212_DEF_RFPOWER; if( length != txPower ) { txPower = length; writeRegister(RF212_PHY_TX_PWR, txPower); } if( call Config.requiresRssiCca(msg) && (readRegister(RF212_PHY_RSSI) & RF212_RSSI_MASK) > ((rssiClear + rssiBusy) >> 3) ) return EBUSY; writeRegister(RF212_TRX_STATE, RF212_PLL_ON); // do something useful, just to wait a little timesync = call PacketTimeSyncOffset.isSet(msg) ? ((void*)msg) + call PacketTimeSyncOffset.get(msg) : 0; time32 = call LocalTime.get(); // we have missed an incoming message in this short amount of time if( (readRegister(RF212_TRX_STATUS) & RF212_TRX_STATUS_MASK) != RF212_PLL_ON ) { RADIO_ASSERT( (readRegister(RF212_TRX_STATUS) & RF212_TRX_STATUS_MASK) == RF212_BUSY_RX ); writeRegister(RF212_TRX_STATE, RF212_RX_ON); return EBUSY; } atomic { call SLP_TR.set(); time = call RadioAlarm.getNow(); } call SLP_TR.clr(); RADIO_ASSERT( ! radioIrq ); call SELN.clr(); call FastSpiByte.splitWrite(RF212_CMD_FRAME_WRITE); data = getPayload(msg); length = getHeader(msg)->length; // length | data[0] ... data[length-3] | automatically generated FCS call FastSpiByte.splitReadWrite(length); // the FCS is atomatically generated (2 bytes), but the rf212 needs two dummy bytes, otherwise it will generate a TRX_UR interrupt // length -= 2; header = call Config.headerPreloadLength(); if( header > length ) header = length; length -= header; // first upload the header to gain some time do { call FastSpiByte.splitReadWrite(*(data++)); } while( --header != 0 ); time32 += (int16_t)(time + TX_SFD_DELAY) - (int16_t)(time32); if( timesync != 0 ) *(timesync_relative_t*)timesync = (*(timesync_absolute_t*)timesync) - time32; while( length-- != 0 ) call FastSpiByte.splitReadWrite(*(data++)); // wait for the SPI transfer to finish call FastSpiByte.splitRead(); call SELN.set(); /* * There is a very small window (~1 microsecond) when the RF212 went * into PLL_ON state but was somehow not properly initialized because * of an incoming message and could not go into BUSY_TX. I think the * radio can even receive a message, and generate a TRX_UR interrupt * because of concurrent access, but that message probably cannot be * recovered. * * TODO: this needs to be verified, and make sure that the chip is * not locked up in this case. */ // go back to RX_ON state when finished writeRegister(RF212_TRX_STATE, RF212_RX_ON); if( timesync != 0 ) *(timesync_absolute_t*)timesync = (*(timesync_relative_t*)timesync) + time32; call PacketTimeStamp.set(msg, time32); #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ) { length = getHeader(msg)->length; call DiagMsg.chr('t'); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.uint16(call LocalTime.get()); call DiagMsg.int8(length); call DiagMsg.hex8s(getPayload(msg), length-2); call DiagMsg.send(); } #endif // wait for the TRX_END interrupt state = STATE_BUSY_TX_2_RX_ON; cmd = CMD_TRANSMIT; return SUCCESS; } default tasklet_async event void RadioSend.sendDone(error_t error) { } default tasklet_async event void RadioSend.ready() { } /*----------------- CCA -----------------*/ tasklet_async command error_t RadioCCA.request() { if( cmd != CMD_NONE || state != STATE_RX_ON || ! isSpiAcquired() ) return EBUSY; cmd = CMD_CCA; writeRegister(RF212_PHY_CC_CCA, RF212_CCA_REQUEST | RF212_CCA_MODE_VALUE | channel); return SUCCESS; } default tasklet_async event void RadioCCA.done(error_t error) { } /*----------------- RECEIVE -----------------*/ inline void downloadMessage() { uint8_t length; bool crcValid = FALSE; call SELN.clr(); call FastSpiByte.write(RF212_CMD_FRAME_READ); // read the length byte length = call FastSpiByte.write(0); // if correct length if( length >= 3 && length <= call RadioPacket.maxPayloadLength() + 2 ) { uint8_t read; uint8_t* data; // initiate the reading call FastSpiByte.splitWrite(0); data = getPayload(rxMsg); getHeader(rxMsg)->length = length; // we do not store the CRC field length -= 2; read = call Config.headerPreloadLength(); if( length < read ) read = length; length -= read; do { *(data++) = call FastSpiByte.splitReadWrite(0); } while( --read != 0 ); if( signal RadioReceive.header(rxMsg) ) { while( length-- != 0 ) *(data++) = call FastSpiByte.splitReadWrite(0); call FastSpiByte.splitReadWrite(0); // two CRC bytes call FastSpiByte.splitReadWrite(0); call PacketLinkQuality.set(rxMsg, call FastSpiByte.splitReadWrite(0)); call FastSpiByte.splitReadWrite(0); // ED crcValid = call FastSpiByte.splitRead() & RF212_RX_CRC_VALID; // RX_STATUS } else call FastSpiByte.splitRead(); // finish the SPI transfer } call SELN.set(); state = STATE_RX_ON; #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ) { length = getHeader(rxMsg)->length; call DiagMsg.chr('r'); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.uint16(call LocalTime.get()); call DiagMsg.int8(crcValid ? length : -length); call DiagMsg.hex8s(getPayload(rxMsg), length - 2); call DiagMsg.int8(call PacketRSSI.isSet(rxMsg) ? call PacketRSSI.get(rxMsg) : -1); call DiagMsg.uint8(call PacketLinkQuality.isSet(rxMsg) ? call PacketLinkQuality.get(rxMsg) : 0); call DiagMsg.send(); } #endif cmd = CMD_NONE; // signal only if it has passed the CRC check if( crcValid ) rxMsg = signal RadioReceive.receive(rxMsg); } /*----------------- IRQ -----------------*/ async event void IRQ.captured(uint16_t time) { RADIO_ASSERT( ! radioIrq ); atomic { capturedTime = time; radioIrq = TRUE; } call Tasklet.schedule(); } void serviceRadio() { if( isSpiAcquired() ) { uint16_t time; uint32_t time32; uint8_t irq; uint8_t temp; atomic time = capturedTime; radioIrq = FALSE; irq = readRegister(RF212_IRQ_STATUS); //this is really bad, but unfortunatly sometimes happens (e.g. radio receives a message while turning on). can't found better solution than reset if(irq == 0 ){ RADIO_ASSERT(FALSE); if (cmd == CMD_TURNON){ resetRadio(); //CMD_TURNON will be restarted at the tasklet when serviceRadio returns } else RADIO_ASSERT(FALSE); /* * We don't care (yet) with CHANNEL, CCA, RECEIVE and TRANSMIT, mostly becouse all of them needs to turn the radio back on, which needs PLL_LOCK irq, * but we don't want to signal RadioState.done() * However it seems most problems happens when turning on the radio */ return; } #ifdef RADIO_DEBUG // TODO: handle this interrupt if( irq & RF212_IRQ_TRX_UR ) { if( call DiagMsg.record() ) { call DiagMsg.str("assert ur"); call DiagMsg.uint16(call LocalTime.get()); call DiagMsg.hex8(readRegister(RF212_TRX_STATUS)); call DiagMsg.hex8(readRegister(RF212_TRX_STATE)); call DiagMsg.hex8(irq); call DiagMsg.uint8(state); call DiagMsg.uint8(cmd); call DiagMsg.send(); } } #endif #ifdef RF212_RSSI_ENERGY if( irq & RF212_IRQ_TRX_END ) { if( irq == RF212_IRQ_TRX_END || (irq == (RF212_IRQ_RX_START | RF212_IRQ_TRX_END) && cmd == CMD_NONE) ) call PacketRSSI.set(rxMsg, readRegister(RF212_PHY_ED_LEVEL)); else call PacketRSSI.clear(rxMsg); } #endif if ( irq & RF212_IRQ_CCA_ED_DONE) { if( state == STATE_SLEEP_2_TRX_OFF ) state = STATE_TRX_OFF; else if( cmd == CMD_CCA ) { uint8_t cca; RADIO_ASSERT( state == STATE_RX_ON ); cmd = CMD_NONE; cca = readRegister(RF212_TRX_STATUS); // sometimes we don't handle yet the RX_START interrupt, but we're already receiving. // It's all right though, CCA reports busy as it should. RADIO_ASSERT( (cca & RF212_TRX_STATUS_MASK) == RF212_RX_ON || (cca & RF212_TRX_STATUS_MASK) == RF212_BUSY_RX); signal RadioCCA.done( (cca & RF212_CCA_DONE) ? ((cca & RF212_CCA_STATUS) ? SUCCESS : EBUSY) : FAIL ); } else if( state != STATE_RX_ON ) //if we receive a message during CCA, we will still get this interrupt, but we're already reported FAIL at RX_START RADIO_ASSERT(FALSE); } // This should be OK now, since we enable the interrupts in SLEEP state, before changing to TRX_OFF // // sometimes we miss a PLL lock interrupt after turn on // if( cmd == CMD_TURNON || cmd == CMD_CHANNEL ) // { // RADIO_ASSERT( irq & RF212_IRQ_PLL_LOCK ); // RADIO_ASSERT( state == STATE_TRX_OFF_2_RX_ON ); // // state = STATE_RX_ON; // cmd = CMD_SIGNAL_DONE; // } else if( irq & RF212_IRQ_PLL_LOCK ) { RADIO_ASSERT( state == STATE_TRX_OFF_2_RX_ON ); if( cmd == CMD_TURNON || cmd == CMD_CHANNEL ) { state = STATE_RX_ON; cmd = CMD_SIGNAL_DONE; } else RADIO_ASSERT( FALSE ); } if( irq & RF212_IRQ_RX_START ) { if( cmd == CMD_CCA ) { cmd = CMD_NONE; signal RadioCCA.done(FAIL); } if( cmd == CMD_NONE ) { RADIO_ASSERT( state == STATE_RX_ON ); // the most likely place for busy channel, with no TRX_END interrupt if( irq == RF212_IRQ_RX_START ) { temp = readRegister(RF212_PHY_RSSI) & RF212_RSSI_MASK; rssiBusy += temp - (rssiBusy >> 2); #ifndef RF212_RSSI_ENERGY call PacketRSSI.set(rxMsg, temp); } else { call PacketRSSI.clear(rxMsg); #endif } /* * The timestamp corresponds to the first event which could not * have been a PLL_LOCK because then cmd != CMD_NONE, so we must * have received a message (and could also have received the * TRX_END interrupt in the mean time, but that is fine. Also, * we could not be after a transmission, because then cmd = * CMD_TRANSMIT. */ if( irq == RF212_IRQ_RX_START ) // just to be cautious { time32 = call LocalTime.get(); time32 += (int16_t)(time - RX_SFD_DELAY) - (int16_t)(time32); call PacketTimeStamp.set(rxMsg, time32); } else call PacketTimeStamp.clear(rxMsg); cmd = CMD_RECEIVE; } else RADIO_ASSERT( cmd == CMD_TURNOFF ); } if( irq & RF212_IRQ_TRX_END ) { if( cmd == CMD_TRANSMIT ) { RADIO_ASSERT( state == STATE_BUSY_TX_2_RX_ON ); state = STATE_RX_ON; cmd = CMD_NONE; signal RadioSend.sendDone(SUCCESS); // TODO: we could have missed a received message RADIO_ASSERT( ! (irq & RF212_IRQ_RX_START) ); } else if( cmd == CMD_RECEIVE ) { RADIO_ASSERT( state == STATE_RX_ON ); // the most likely place for clear channel (hope to avoid acks) rssiClear += (readRegister(RF212_PHY_RSSI) & RF212_RSSI_MASK) - (rssiClear >> 2); cmd = CMD_DOWNLOAD; } else RADIO_ASSERT(FALSE); } } } default tasklet_async event bool RadioReceive.header(message_t* msg) { return TRUE; } default tasklet_async event message_t* RadioReceive.receive(message_t* msg) { return msg; } /*----------------- TASKLET -----------------*/ task void releaseSpi() { call SpiResource.release(); } tasklet_async event void Tasklet.run() { if( radioIrq ) serviceRadio(); if( cmd != CMD_NONE ) { if( cmd == CMD_DOWNLOAD ) downloadMessage(); else if( CMD_TURNOFF <= cmd && cmd <= CMD_TURNON ) changeState(); else if( cmd == CMD_CHANNEL ) changeChannel(); if( cmd == CMD_SIGNAL_DONE ) { cmd = CMD_NONE; signal RadioState.done(); } } if( cmd == CMD_NONE && state == STATE_RX_ON && ! radioIrq ) signal RadioSend.ready(); if( cmd == CMD_NONE ) post releaseSpi(); } /*----------------- RadioPacket -----------------*/ async command uint8_t RadioPacket.headerLength(message_t* msg) { return call Config.headerLength(msg) + sizeof(rf212_header_t); } async command uint8_t RadioPacket.payloadLength(message_t* msg) { return getHeader(msg)->length - 2; } async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length) { RADIO_ASSERT( 1 <= length && length <= 125 ); RADIO_ASSERT( call RadioPacket.headerLength(msg) + length + call RadioPacket.metadataLength(msg) <= sizeof(message_t) ); // we add the length of the CRC, which is automatically generated getHeader(msg)->length = length + 2; } async command uint8_t RadioPacket.maxPayloadLength() { RADIO_ASSERT( call Config.maxPayloadLength() - sizeof(rf212_header_t) <= 125 ); return call Config.maxPayloadLength() - sizeof(rf212_header_t); } async command uint8_t RadioPacket.metadataLength(message_t* msg) { return call Config.metadataLength(msg) + sizeof(rf212_metadata_t); } async command void RadioPacket.clear(message_t* msg) { // all flags are automatically cleared } /*----------------- PacketTransmitPower -----------------*/ async command bool PacketTransmitPower.isSet(message_t* msg) { return call TransmitPowerFlag.get(msg); } async command uint8_t PacketTransmitPower.get(message_t* msg) { return getMeta(msg)->power; } async command void PacketTransmitPower.clear(message_t* msg) { call TransmitPowerFlag.clear(msg); } async command void PacketTransmitPower.set(message_t* msg, uint8_t value) { call TransmitPowerFlag.set(msg); getMeta(msg)->power = value; } /*----------------- PacketRSSI -----------------*/ async command bool PacketRSSI.isSet(message_t* msg) { return call RSSIFlag.get(msg); } async command uint8_t PacketRSSI.get(message_t* msg) { return getMeta(msg)->rssi; } async command void PacketRSSI.clear(message_t* msg) { call RSSIFlag.clear(msg); } async command void PacketRSSI.set(message_t* msg, uint8_t value) { // just to be safe if the user fails to clear the packet call TransmitPowerFlag.clear(msg); call RSSIFlag.set(msg); getMeta(msg)->rssi = value; } /*----------------- PacketTimeSyncOffset -----------------*/ async command bool PacketTimeSyncOffset.isSet(message_t* msg) { return call TimeSyncFlag.get(msg); } async command uint8_t PacketTimeSyncOffset.get(message_t* msg) { return call RadioPacket.headerLength(msg) + call RadioPacket.payloadLength(msg) - sizeof(timesync_absolute_t); } async command void PacketTimeSyncOffset.clear(message_t* msg) { call TimeSyncFlag.clear(msg); } async command void PacketTimeSyncOffset.set(message_t* msg, uint8_t value) { // we do not store the value, the time sync field is always the last 4 bytes RADIO_ASSERT( call PacketTimeSyncOffset.get(msg) == value ); call TimeSyncFlag.set(msg); } /*----------------- PacketLinkQuality -----------------*/ async command bool PacketLinkQuality.isSet(message_t* msg) { return TRUE; } async command uint8_t PacketLinkQuality.get(message_t* msg) { return getMeta(msg)->lqi; } async command void PacketLinkQuality.clear(message_t* msg) { } async command void PacketLinkQuality.set(message_t* msg, uint8_t value) { getMeta(msg)->lqi = value; } /*----------------- LinkPacketMetadata -----------------*/ async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) { return call PacketLinkQuality.get(msg) > 200; } } tinyos-2.1.2+dfsg/tos/chips/rf212/RF212Ieee154MessageC.nc000066400000000000000000000061661207233610700222510ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #ifdef TFRAMES_ENABLED #error "You cannot use Ieee154MessageC with TFRAMES_ENABLED defined" #endif configuration RF212Ieee154MessageC { provides { interface SplitControl; interface Ieee154Send; interface Receive as Ieee154Receive; interface SendNotifier; interface Ieee154Packet; interface Packet; interface Resource as SendResource[uint8_t clint]; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketField as PacketLinkQuality; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface LocalTime as LocalTimeRadio; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components RF212RadioC; SplitControl = RF212RadioC; Ieee154Send = RF212RadioC.Ieee154Send; Ieee154Receive = RF212RadioC.Ieee154Receive; SendNotifier = RF212RadioC.Ieee154Notifier; Packet = RF212RadioC.PacketForIeee154Message; Ieee154Packet = RF212RadioC; SendResource = RF212RadioC; PacketAcknowledgements = RF212RadioC; LowPowerListening = RF212RadioC; PacketLink = RF212RadioC; RadioChannel = RF212RadioC; PacketLinkQuality = RF212RadioC.PacketLinkQuality; PacketTransmitPower = RF212RadioC.PacketTransmitPower; PacketRSSI = RF212RadioC.PacketRSSI; LocalTimeRadio = RF212RadioC; PacketTimeStampMilli = RF212RadioC; PacketTimeStampRadio = RF212RadioC; } tinyos-2.1.2+dfsg/tos/chips/rf212/RF212Radio.h000066400000000000000000000051041207233610700204140ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __RF212RADIO_H__ #define __RF212RADIO_H__ #include #include #include #include #include #include #include #include #include typedef nx_struct rf212packet_header_t { rf212_header_t rf212; ieee154_simple_header_t ieee154; #ifndef TFRAMES_ENABLED network_header_t network; #endif #ifndef IEEE154FRAMES_ENABLED activemessage_header_t am; #endif } rf212packet_header_t; typedef nx_struct rf212packet_footer_t { // the time stamp is not recorded here, time stamped messaged cannot have max length } rf212packet_footer_t; typedef struct rf212packet_metadata_t { #ifdef LOW_POWER_LISTENING lpl_metadata_t lpl; #endif #ifdef PACKET_LINK link_metadata_t link; #endif timestamp_metadata_t timestamp; flags_metadata_t flags; rf212_metadata_t rf212; } rf212packet_metadata_t; #endif//__RF212RADIO_H__ tinyos-2.1.2+dfsg/tos/chips/rf212/RF212RadioC.nc000066400000000000000000000232271207233610700206760ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include configuration RF212RadioC { provides { interface SplitControl; #ifndef IEEE154FRAMES_ENABLED interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface SendNotifier[am_id_t id]; // for TOSThreads interface Receive as ReceiveDefault[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface AMPacket; interface Packet as PacketForActiveMessage; #endif #ifndef TFRAMES_ENABLED interface Ieee154Send; interface Receive as Ieee154Receive; interface SendNotifier as Ieee154Notifier; interface Resource as SendResource[uint8_t clint]; interface Ieee154Packet; interface Packet as PacketForIeee154Message; #endif interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; #ifdef TRAFFIC_MONITOR interface TrafficMonitor; #endif interface RadioChannel; interface PacketField as PacketLinkQuality; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface LinkPacketMetadata; interface LocalTime as LocalTimeRadio; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { #define UQ_METADATA_FLAGS "UQ_RF212_METADATA_FLAGS" #define UQ_RADIO_ALARM "UQ_RF212_RADIO_ALARM" // -------- RadioP components RF212RadioP as RadioP; #ifdef RADIO_DEBUG components AssertC; #endif RadioP.Ieee154PacketLayer -> Ieee154PacketLayerC; RadioP.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; RadioP.PacketTimeStamp -> TimeStampingLayerC; RadioP.RF212Packet -> RadioDriverLayerC; // -------- RadioAlarm components new RadioAlarmC(); RadioAlarmC.Alarm -> RadioDriverLayerC; // -------- Active Message #ifndef IEEE154FRAMES_ENABLED components new ActiveMessageLayerC(); ActiveMessageLayerC.Config -> RadioP; ActiveMessageLayerC.SubSend -> AutoResourceAcquireLayerC; ActiveMessageLayerC.SubReceive -> TinyosNetworkLayerC.TinyosReceive; ActiveMessageLayerC.SubPacket -> TinyosNetworkLayerC.TinyosPacket; AMSend = ActiveMessageLayerC; Receive = ActiveMessageLayerC.Receive; Snoop = ActiveMessageLayerC.Snoop; SendNotifier = ActiveMessageLayerC; AMPacket = ActiveMessageLayerC; PacketForActiveMessage = ActiveMessageLayerC; ReceiveDefault = ActiveMessageLayerC.ReceiveDefault; SnoopDefault = ActiveMessageLayerC.SnoopDefault; #endif // -------- Automatic RadioSend Resource #ifndef IEEE154FRAMES_ENABLED #ifndef TFRAMES_ENABLED components new AutoResourceAcquireLayerC(); AutoResourceAcquireLayerC.Resource -> SendResourceC.Resource[unique(RADIO_SEND_RESOURCE)]; #else components new DummyLayerC() as AutoResourceAcquireLayerC; #endif AutoResourceAcquireLayerC -> TinyosNetworkLayerC.TinyosSend; #endif // -------- RadioSend Resource #ifndef TFRAMES_ENABLED components new SimpleFcfsArbiterC(RADIO_SEND_RESOURCE) as SendResourceC; SendResource = SendResourceC; // -------- Ieee154 Message components new Ieee154MessageLayerC(); Ieee154MessageLayerC.Ieee154PacketLayer -> Ieee154PacketLayerC; Ieee154MessageLayerC.SubSend -> TinyosNetworkLayerC.Ieee154Send; Ieee154MessageLayerC.SubReceive -> TinyosNetworkLayerC.Ieee154Receive; Ieee154MessageLayerC.RadioPacket -> TinyosNetworkLayerC.Ieee154Packet; Ieee154Send = Ieee154MessageLayerC; Ieee154Receive = Ieee154MessageLayerC; Ieee154Notifier = Ieee154MessageLayerC; Ieee154Packet = Ieee154PacketLayerC; PacketForIeee154Message = Ieee154MessageLayerC; #endif // -------- Tinyos Network components new TinyosNetworkLayerC(); TinyosNetworkLayerC.SubSend -> UniqueLayerC; TinyosNetworkLayerC.SubReceive -> PacketLinkLayerC; TinyosNetworkLayerC.SubPacket -> Ieee154PacketLayerC; // -------- IEEE 802.15.4 Packet components new Ieee154PacketLayerC(); Ieee154PacketLayerC.SubPacket -> PacketLinkLayerC; // -------- UniqueLayer Send part (wired twice) components new UniqueLayerC(); UniqueLayerC.Config -> RadioP; UniqueLayerC.SubSend -> PacketLinkLayerC; // -------- Packet Link components new PacketLinkLayerC(); PacketLink = PacketLinkLayerC; PacketLinkLayerC.PacketAcknowledgements -> SoftwareAckLayerC; PacketLinkLayerC -> LowPowerListeningLayerC.Send; PacketLinkLayerC -> LowPowerListeningLayerC.Receive; PacketLinkLayerC -> LowPowerListeningLayerC.RadioPacket; // -------- Low Power Listening #ifdef LOW_POWER_LISTENING #warning "*** USING LOW POWER LISTENING LAYER" components new LowPowerListeningLayerC(); LowPowerListeningLayerC.Config -> RadioP; LowPowerListeningLayerC.PacketAcknowledgements -> SoftwareAckLayerC; #else components new LowPowerListeningDummyC() as LowPowerListeningLayerC; #endif LowPowerListeningLayerC.SubControl -> MessageBufferLayerC; LowPowerListeningLayerC.SubSend -> MessageBufferLayerC; LowPowerListeningLayerC.SubReceive -> MessageBufferLayerC; LowPowerListeningLayerC.SubPacket -> TimeStampingLayerC; SplitControl = LowPowerListeningLayerC; LowPowerListening = LowPowerListeningLayerC; // -------- MessageBuffer components new MessageBufferLayerC(); MessageBufferLayerC.RadioSend -> CollisionAvoidanceLayerC; MessageBufferLayerC.RadioReceive -> UniqueLayerC; MessageBufferLayerC.RadioState -> TrafficMonitorLayerC; RadioChannel = MessageBufferLayerC; // -------- UniqueLayer receive part (wired twice) UniqueLayerC.SubReceive -> CollisionAvoidanceLayerC; // -------- CollisionAvoidance #ifdef SLOTTED_MAC components new SlottedCollisionLayerC() as CollisionAvoidanceLayerC; #else components new RandomCollisionLayerC() as CollisionAvoidanceLayerC; #endif CollisionAvoidanceLayerC.Config -> RadioP; CollisionAvoidanceLayerC.SubSend -> SoftwareAckLayerC; CollisionAvoidanceLayerC.SubReceive -> SoftwareAckLayerC; CollisionAvoidanceLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; // -------- SoftwareAcknowledgement components new SoftwareAckLayerC(); SoftwareAckLayerC.AckReceivedFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; SoftwareAckLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; PacketAcknowledgements = SoftwareAckLayerC; SoftwareAckLayerC.Config -> RadioP; SoftwareAckLayerC.SubSend -> CsmaLayerC; SoftwareAckLayerC.SubReceive -> CsmaLayerC; // -------- Carrier Sense components new DummyLayerC() as CsmaLayerC; CsmaLayerC.Config -> RadioP; CsmaLayerC -> TrafficMonitorLayerC.RadioSend; CsmaLayerC -> TrafficMonitorLayerC.RadioReceive; CsmaLayerC -> RadioDriverLayerC.RadioCCA; // -------- TimeStamping components new TimeStampingLayerC(); TimeStampingLayerC.LocalTimeRadio -> RadioDriverLayerC; TimeStampingLayerC.SubPacket -> MetadataFlagsLayerC; PacketTimeStampRadio = TimeStampingLayerC; PacketTimeStampMilli = TimeStampingLayerC; TimeStampingLayerC.TimeStampFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; // -------- MetadataFlags components new MetadataFlagsLayerC(); MetadataFlagsLayerC.SubPacket -> RadioDriverLayerC; // -------- Traffic Monitor #ifdef TRAFFIC_MONITOR components new TrafficMonitorLayerC(); TrafficMonitor = TrafficMonitorLayerC; #else components new DummyLayerC() as TrafficMonitorLayerC; #endif TrafficMonitorLayerC.Config -> RadioP; TrafficMonitorLayerC -> RadioDriverLayerC.RadioSend; TrafficMonitorLayerC -> RadioDriverLayerC.RadioReceive; TrafficMonitorLayerC -> RadioDriverLayerC.RadioState; // -------- Driver components RF212DriverLayerC as RadioDriverLayerC; RadioDriverLayerC.Config -> RadioP; RadioDriverLayerC.PacketTimeStamp -> TimeStampingLayerC; PacketTransmitPower = RadioDriverLayerC.PacketTransmitPower; PacketLinkQuality = RadioDriverLayerC.PacketLinkQuality; PacketRSSI = RadioDriverLayerC.PacketRSSI; LinkPacketMetadata = RadioDriverLayerC; LocalTimeRadio = RadioDriverLayerC; RadioDriverLayerC.TransmitPowerFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.RSSIFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.TimeSyncFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; } tinyos-2.1.2+dfsg/tos/chips/rf212/RF212RadioP.nc000066400000000000000000000245431207233610700207150ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti * Author: Andras Biro */ #include #include #include module RF212RadioP { provides { interface RF212DriverConfig; interface SoftwareAckConfig; interface UniqueConfig; interface CsmaConfig; interface TrafficMonitorConfig; interface RandomCollisionConfig; interface SlottedCollisionConfig; interface ActiveMessageConfig; interface DummyConfig; #ifdef LOW_POWER_LISTENING interface LowPowerListeningConfig; #endif } uses { interface Ieee154PacketLayer; interface RadioAlarm; interface RadioPacket as RF212Packet; interface PacketTimeStamp; } } implementation { inline uint8_t getSymbolTime() { switch( RF212_TRX_CTRL_2_VALUE ) { case RF212_DATA_MODE_BPSK_20: return 50; case RF212_DATA_MODE_BPSK_40: return 25; case RF212_DATA_MODE_OQPSK_SIN_RC_100: case RF212_DATA_MODE_OQPSK_SIN_RC_200: case RF212_DATA_MODE_OQPSK_SIN_RC_400_SCR: case RF212_DATA_MODE_OQPSK_SIN_RC_400: return 40; case RF212_DATA_MODE_OQPSK_SIN_250: case RF212_DATA_MODE_OQPSK_RC_250: case RF212_DATA_MODE_OQPSK_SIN_500: case RF212_DATA_MODE_OQPSK_RC_500: case RF212_DATA_MODE_OQPSK_SIN_1000_SCR: case RF212_DATA_MODE_OQPSK_SIN_1000: case RF212_DATA_MODE_OQPSK_RC_1000_SCR: case RF212_DATA_MODE_OQPSK_RC_1000: return 16; } } inline bool isBpsk() { switch( RF212_TRX_CTRL_2_VALUE ) { case RF212_DATA_MODE_BPSK_20: case RF212_DATA_MODE_BPSK_40: return TRUE; default: return FALSE; } } /*----------------- RF212DriverConfig -----------------*/ async command uint8_t RF212DriverConfig.headerLength(message_t* msg) { return offsetof(message_t, data) - sizeof(rf212packet_header_t); } async command uint8_t RF212DriverConfig.maxPayloadLength() { return sizeof(rf212packet_header_t) + TOSH_DATA_LENGTH; } async command uint8_t RF212DriverConfig.metadataLength(message_t* msg) { return 0; } async command uint8_t RF212DriverConfig.headerPreloadLength() { // we need the fcf, dsn, destpan and dest return 7; } async command bool RF212DriverConfig.requiresRssiCca(message_t* msg) { return call Ieee154PacketLayer.isDataFrame(msg); } /*----------------- SoftwareAckConfig -----------------*/ async command bool SoftwareAckConfig.requiresAckWait(message_t* msg) { return call Ieee154PacketLayer.requiresAckWait(msg); } async command bool SoftwareAckConfig.isAckPacket(message_t* msg) { return call Ieee154PacketLayer.isAckFrame(msg); } async command bool SoftwareAckConfig.verifyAckPacket(message_t* data, message_t* ack) { return call Ieee154PacketLayer.verifyAckReply(data, ack); } async command void SoftwareAckConfig.setAckRequired(message_t* msg, bool ack) { call Ieee154PacketLayer.setAckRequired(msg, ack); } async command bool SoftwareAckConfig.requiresAckReply(message_t* msg) { return call Ieee154PacketLayer.requiresAckReply(msg); } async command void SoftwareAckConfig.createAckPacket(message_t* data, message_t* ack) { call Ieee154PacketLayer.createAckReply(data, ack); } // 802.15.4 standard: // =aTurnaroundTime+phySHRDuration+6*phySymbolsPerOctet // =12s + phySymbolsPerOctet + 6o * phySymbolsPerOctet // SHR: BPSK: 40; OQPSK: 10 // phySymbolsPerOctet: BPSK: 8; OQPSK: 2 // plus we add a constant for safety #ifndef SOFTWAREACK_TIMEOUT_PLUS #define SOFTWAREACK_TIMEOUT_PLUS 1000 #endif async command uint16_t SoftwareAckConfig.getAckTimeout() { #ifndef SOFTWAREACK_TIMEOUT if(isBpsk()) return ((12+40+6*8) * getSymbolTime() + SOFTWAREACK_TIMEOUT_PLUS) * RADIO_ALARM_MICROSEC; else return ((12+10+6*2) * getSymbolTime() + SOFTWAREACK_TIMEOUT_PLUS) * RADIO_ALARM_MICROSEC; #else return (uint16_t)(SOFTWAREACK_TIMEOUT * RADIO_ALARM_MICROSEC); #endif } tasklet_async command void SoftwareAckConfig.reportChannelError() { #ifdef TRAFFIC_MONITOR // signal TrafficMonitorConfig.channelError(); #endif } /*----------------- UniqueConfig -----------------*/ async command uint8_t UniqueConfig.getSequenceNumber(message_t* msg) { return call Ieee154PacketLayer.getDSN(msg); } async command void UniqueConfig.setSequenceNumber(message_t* msg, uint8_t dsn) { call Ieee154PacketLayer.setDSN(msg, dsn); } async command am_addr_t UniqueConfig.getSender(message_t* msg) { return call Ieee154PacketLayer.getSrcAddr(msg); } tasklet_async command void UniqueConfig.reportChannelError() { #ifdef TRAFFIC_MONITOR // signal TrafficMonitorConfig.channelError(); #endif } /*----------------- ActiveMessageConfig -----------------*/ command am_addr_t ActiveMessageConfig.destination(message_t* msg) { return call Ieee154PacketLayer.getDestAddr(msg); } command void ActiveMessageConfig.setDestination(message_t* msg, am_addr_t addr) { call Ieee154PacketLayer.setDestAddr(msg, addr); } command am_addr_t ActiveMessageConfig.source(message_t* msg) { return call Ieee154PacketLayer.getSrcAddr(msg); } command void ActiveMessageConfig.setSource(message_t* msg, am_addr_t addr) { call Ieee154PacketLayer.setSrcAddr(msg, addr); } command am_group_t ActiveMessageConfig.group(message_t* msg) { return call Ieee154PacketLayer.getDestPan(msg); } command void ActiveMessageConfig.setGroup(message_t* msg, am_group_t grp) { call Ieee154PacketLayer.setDestPan(msg, grp); } command error_t ActiveMessageConfig.checkFrame(message_t* msg) { if( ! call Ieee154PacketLayer.isDataFrame(msg) ) call Ieee154PacketLayer.createDataFrame(msg); return SUCCESS; } /*----------------- CsmaConfig -----------------*/ async command bool CsmaConfig.requiresSoftwareCCA(message_t* msg) { return call Ieee154PacketLayer.isDataFrame(msg); } /*----------------- TrafficMonitorConfig -----------------*/ async command uint16_t TrafficMonitorConfig.getBytes(message_t* msg) { // pure airtime: preable (4 bytes), SFD (1 byte), length (1 byte), payload + CRC (len bytes) return call RF212Packet.payloadLength(msg) + 6; } /*----------------- RandomCollisionConfig -----------------*/ // 802.15.4 constants: // aUnitBackoffPeriod: 20 symbol // macMinBE:0..5 (8), default 3 // but we don't care about the standard yet, just converted the rf230 lpl timeouts to SymbolTime base async command uint16_t RandomCollisionConfig.getMinimumBackoff() { return (uint16_t)(10 * 8 * getSymbolTime() * RADIO_ALARM_MICROSEC); } async command uint16_t RandomCollisionConfig.getInitialBackoff(message_t* msg) { return (uint16_t)(50 * 8 * getSymbolTime() * RADIO_ALARM_MICROSEC); } async command uint16_t RandomCollisionConfig.getCongestionBackoff(message_t* msg) { return (uint16_t)(100 * 8 * getSymbolTime() * RADIO_ALARM_MICROSEC); } // 802.15.4 standard: SIFS (no ack requested): 12 symbol; LIFS (ack requested): 40 symbol async command uint16_t RandomCollisionConfig.getTransmitBarrier(message_t* msg) { uint16_t time; // TODO: maybe we should use the embedded timestamp of the message time = call RadioAlarm.getNow(); // estimated response time (download the message, etc) is 5-8 bytes if( call Ieee154PacketLayer.requiresAckReply(msg) ) time += (uint16_t)(40 * getSymbolTime() * RADIO_ALARM_MICROSEC); else time += (uint16_t)(12 * getSymbolTime() * RADIO_ALARM_MICROSEC); return time; } tasklet_async event void RadioAlarm.fired() { } /*----------------- SlottedCollisionConfig -----------------*/ async command uint16_t SlottedCollisionConfig.getInitialDelay() { return 300; } async command uint8_t SlottedCollisionConfig.getScheduleExponent() { return 1 + RADIO_ALARM_MILLI_EXP; } async command uint16_t SlottedCollisionConfig.getTransmitTime(message_t* msg) { // TODO: check if the timestamp is correct return call PacketTimeStamp.timestamp(msg); } async command uint16_t SlottedCollisionConfig.getCollisionWindowStart(message_t* msg) { // the preamble (4 bytes), SFD (1 byte), plus two extra for safety return (call PacketTimeStamp.timestamp(msg)) - (uint16_t)(7 * 32 * RADIO_ALARM_MICROSEC); } async command uint16_t SlottedCollisionConfig.getCollisionWindowLength(message_t* msg) { return (uint16_t)(2 * 7 * 32 * RADIO_ALARM_MICROSEC); } /*----------------- Dummy -----------------*/ async command void DummyConfig.nothing() { } /*----------------- LowPowerListening -----------------*/ #ifdef LOW_POWER_LISTENING command bool LowPowerListeningConfig.needsAutoAckRequest(message_t* msg) { return call Ieee154PacketLayer.getDestAddr(msg) != TOS_BCAST_ADDR; } command bool LowPowerListeningConfig.ackRequested(message_t* msg) { return call Ieee154PacketLayer.getAckRequired(msg); } command uint16_t LowPowerListeningConfig.getListenLength() { switch(getSymbolTime()){ case 50: { return 38; }; case 40: { return 24; }; case 25:{ return 20; }; case 16:{ return 12; } default:{ return getSymbolTime(); } } } #endif } tinyos-2.1.2+dfsg/tos/chips/rf212/RF212TimeSyncMessageC.nc000066400000000000000000000063461207233610700227030ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include configuration RF212TimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStampRadio; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components RF212ActiveMessageC as ActiveMessageC, new TimeSyncMessageLayerC(); SplitControl = ActiveMessageC; AMPacket = TimeSyncMessageLayerC; Receive = TimeSyncMessageLayerC.Receive; Snoop = TimeSyncMessageLayerC.Snoop; Packet = TimeSyncMessageLayerC; PacketAcknowledgements = ActiveMessageC; LowPowerListening = ActiveMessageC; PacketTimeStampRadio = ActiveMessageC; TimeSyncAMSendRadio = TimeSyncMessageLayerC; TimeSyncPacketRadio = TimeSyncMessageLayerC; PacketTimeStampMilli = ActiveMessageC; TimeSyncAMSendMilli = TimeSyncMessageLayerC; TimeSyncPacketMilli = TimeSyncMessageLayerC; TimeSyncMessageLayerC.PacketTimeStampRadio -> ActiveMessageC; TimeSyncMessageLayerC.PacketTimeStampMilli -> ActiveMessageC; components RF212DriverLayerC as DriverLayerC; TimeSyncMessageLayerC.LocalTimeRadio -> DriverLayerC; TimeSyncMessageLayerC.PacketTimeSyncOffset -> DriverLayerC.PacketTimeSyncOffset; } tinyos-2.1.2+dfsg/tos/chips/rf230/000077500000000000000000000000001207233610700165305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/rf230/README000066400000000000000000000046201207233610700174120ustar00rootroot00000000000000 The RF230 radio driver has the following configuration options. Some of these are set in the platforms/xxx/chips/rf230/RadioConfig.h header file, see the IRIS platform for example, others can be set in your Makefile. RF230_TRX_CTRL_0_VALUE: This is the value of the TRX_CTRL_0 register which configures the output pin currents and the CLKM clock: RF230_CCA_MODE_VALUE: This is the default value of the CCA_MODE field in the PHY_CC_CCA register which is used to configure the default mode of the clear channel assesment RF230_CCA_THRES_VALUE: This is the value of the CCA_THRES register that controls the energy levels used for clear channel assesment. RF230_DEF_RFPOWER: This is the default value of the TX_PWR field of the PHY_TX_PWR register. This can be cahanged via the PacketTransmitPower interface provided by the RF230ActiveMessageC. RF230_DEF_CHANNEL: This is the default value of the CHANNEL field of the PHY_CC_CCA register. This can be cahanged via the RadioChannel interface provided by the RF230ActiveMessageC. RF230_CRCBYTE_COMMAND: This is the command used to calculate the CRC for the RF230 chip, since it does not support hardware CRC checking (in rev A). RF230_SLOW_SPI: Define this if your microcontroller SPI interface is slower then 250 kbit/s. This delays the start of transmission to when the header is at least uploaded into the TX buffer. RF230_RSSI_ENERGY: If you define this, then the content of the RF230_PHY_ED_LEVEL is queried instead of the RSSI value for eahc incoming message. This value can be obtained with the PacketRSSI interface. RF230_HARDWARE_ACK If you define this, then the radio stack will use hardware acknowledgements and address recognition. In particular, you will not be able to snoop on onther messages. The load on the CPU is reduced, you should be able to send more messages under heavy load. Note, that the PacketRSSI interface will return the energy level (and not the rssi value) of received packet. RF230_HWACK_SLOPPY_TIMESTAMP If you define this, then the code that calculates the time stamp of the SFD from a single interrupt at the end of the message reception will not use floating point computation, which will be faster but less precise. RF230_BACKOFF_MIN RF230_BACKOFF_INIT RF230_BACKOFF_CONG The minimum backoff time, the initial backoff time, and the cognestion backoff time in microseconds for the random CSMA/CA algorithm. See the RF230RadioP.nc. tinyos-2.1.2+dfsg/tos/chips/rf230/RF230ActiveMessageC.nc000066400000000000000000000064001207233610700223520ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #ifdef IEEE154FRAMES_ENABLED #error "You cannot use ActiveMessageC with IEEE154FRAMES_ENABLED defined" #endif configuration RF230ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface SendNotifier[am_id_t id]; // for TOSThreads interface Receive as ReceiveDefault[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketField as PacketLinkQuality; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface LinkPacketMetadata; interface LocalTime as LocalTimeRadio; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components RF230RadioC as RadioC; SplitControl = RadioC; AMSend = RadioC; Receive = RadioC.Receive; Snoop = RadioC.Snoop; SendNotifier = RadioC; ReceiveDefault = RadioC.ReceiveDefault; SnoopDefault = RadioC.SnoopDefault; Packet = RadioC.PacketForActiveMessage; AMPacket = RadioC; PacketAcknowledgements = RadioC; LowPowerListening = RadioC; PacketLink = RadioC; RadioChannel = RadioC; PacketLinkQuality = RadioC.PacketLinkQuality; PacketTransmitPower = RadioC.PacketTransmitPower; PacketRSSI = RadioC.PacketRSSI; LinkPacketMetadata = RadioC; LocalTimeRadio = RadioC; PacketTimeStampMilli = RadioC; PacketTimeStampRadio = RadioC; } tinyos-2.1.2+dfsg/tos/chips/rf230/RF230DriverConfig.nc000066400000000000000000000050541207233610700221140ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface RF230DriverConfig { /** * Returns the length of a dummy header to align the payload properly. */ async command uint8_t headerLength(message_t* msg); /** * Returns the maximum length of the PHY payload including the * length field but not counting the FCF field. */ async command uint8_t maxPayloadLength(); /** * Returns the length of a dummy metadata section to align the * metadata section properly. */ async command uint8_t metadataLength(message_t* msg); /** * Gets the number of bytes we should read before the RadioReceive.header * event is fired. If the length of the packet is less than this amount, * then that event is fired earlier. The header length must be at least one. */ async command uint8_t headerPreloadLength(); /** * Returns TRUE if before sending this message we should make sure that * the channel is clear via a very basic (and quick) RSSI check. */ async command bool requiresRssiCca(message_t* msg); } tinyos-2.1.2+dfsg/tos/chips/rf230/RF230DriverHwAckC.nc000066400000000000000000000077751207233610700220230ustar00rootroot00000000000000/* * Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include configuration RF230DriverHwAckC { provides { interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; interface LinkPacketMetadata; interface LocalTime as LocalTimeRadio; interface Alarm; interface PacketAcknowledgements; } uses { interface RF230DriverConfig as Config; interface PacketTimeStamp; interface Ieee154PacketLayer; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; interface PacketFlag as AckReceivedFlag; interface RadioAlarm; } } implementation { components RF230DriverHwAckP as DriverLayerP, HplRF230C, BusyWaitMicroC, TaskletC, MainC, ActiveMessageAddressC; RadioState = DriverLayerP; RadioSend = DriverLayerP; RadioReceive = DriverLayerP; RadioCCA = DriverLayerP; RadioPacket = DriverLayerP; LocalTimeRadio = HplRF230C; Config = DriverLayerP; PacketTransmitPower = DriverLayerP.PacketTransmitPower; TransmitPowerFlag = DriverLayerP.TransmitPowerFlag; PacketRSSI = DriverLayerP.PacketRSSI; RSSIFlag = DriverLayerP.RSSIFlag; PacketTimeSyncOffset = DriverLayerP.PacketTimeSyncOffset; TimeSyncFlag = DriverLayerP.TimeSyncFlag; PacketLinkQuality = DriverLayerP.PacketLinkQuality; PacketTimeStamp = DriverLayerP.PacketTimeStamp; LinkPacketMetadata = DriverLayerP; DriverLayerP.LocalTime -> HplRF230C; Alarm = HplRF230C.Alarm; RadioAlarm = DriverLayerP.RadioAlarm; DriverLayerP.SELN -> HplRF230C.SELN; DriverLayerP.SpiResource -> HplRF230C.SpiResource; DriverLayerP.FastSpiByte -> HplRF230C; DriverLayerP.SLP_TR -> HplRF230C.SLP_TR; DriverLayerP.RSTN -> HplRF230C.RSTN; DriverLayerP.IRQ -> HplRF230C.IRQ; DriverLayerP.Tasklet -> TaskletC; DriverLayerP.BusyWait -> BusyWaitMicroC; #ifdef RADIO_DEBUG components DiagMsgC; DriverLayerP.DiagMsg -> DiagMsgC; #endif MainC.SoftwareInit -> DriverLayerP.SoftwareInit; components RealMainP; RealMainP.PlatformInit -> DriverLayerP.PlatformInit; AckReceivedFlag = DriverLayerP.AckReceivedFlag; DriverLayerP.ActiveMessageAddress -> ActiveMessageAddressC; PacketAcknowledgements = DriverLayerP; Ieee154PacketLayer = DriverLayerP; } tinyos-2.1.2+dfsg/tos/chips/rf230/RF230DriverHwAckP.nc000066400000000000000000000617151207233610700220320ustar00rootroot00000000000000/* * Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include #include #include #include module RF230DriverHwAckP { provides { interface Init as PlatformInit @exactlyonce(); interface Init as SoftwareInit @exactlyonce(); interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; interface LinkPacketMetadata; interface PacketAcknowledgements; } uses { interface GeneralIO as SELN; interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as SLP_TR; interface GeneralIO as RSTN; interface GpioCapture as IRQ; interface BusyWait; interface LocalTime; interface RF230DriverConfig as Config; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; interface PacketTimeStamp; interface Tasklet; interface RadioAlarm; interface PacketFlag as AckReceivedFlag; interface Ieee154PacketLayer; interface ActiveMessageAddress; #ifdef RADIO_DEBUG interface DiagMsg; #endif } } implementation { rf230_header_t* getHeader(message_t* msg) { return ((void*)msg) + call Config.headerLength(msg); } void* getPayload(message_t* msg) { return ((void*)msg) + call RadioPacket.headerLength(msg); } rf230_metadata_t* getMeta(message_t* msg) { return ((void*)msg) + sizeof(message_t) - call RadioPacket.metadataLength(msg); } /*----------------- STATE -----------------*/ tasklet_norace uint8_t state; enum { STATE_P_ON = 0, STATE_SLEEP = 1, STATE_SLEEP_2_TRX_OFF = 2, STATE_TRX_OFF = 3, STATE_TRX_OFF_2_RX_ON = 4, STATE_RX_ON = 5, STATE_BUSY_TX_2_RX_ON = 6, }; tasklet_norace uint8_t cmd; enum { CMD_NONE = 0, // the state machine has stopped CMD_TURNOFF = 1, // goto SLEEP state CMD_STANDBY = 2, // goto TRX_OFF state CMD_TURNON = 3, // goto RX_ON state CMD_TRANSMIT = 4, // currently transmitting a message CMD_CCA = 6, // performing clear chanel assesment CMD_CHANNEL = 7, // changing the channel CMD_SIGNAL_DONE = 8, // signal the end of the state transition CMD_DOWNLOAD = 9, // download the received message }; norace bool radioIrq; tasklet_norace uint8_t txPower; tasklet_norace uint8_t channel; tasklet_norace message_t* rxMsg; message_t rxMsgBuffer; uint16_t capturedTime; // the current time when the last interrupt has occured /*----------------- REGISTER -----------------*/ inline void writeRegister(uint8_t reg, uint8_t value) { RADIO_ASSERT( call SpiResource.isOwner() ); RADIO_ASSERT( reg == (reg & RF230_CMD_REGISTER_MASK) ); call SELN.clr(); call FastSpiByte.splitWrite(RF230_CMD_REGISTER_WRITE | reg); call FastSpiByte.splitReadWrite(value); call FastSpiByte.splitRead(); call SELN.set(); } inline uint8_t readRegister(uint8_t reg) { RADIO_ASSERT( call SpiResource.isOwner() ); RADIO_ASSERT( reg == (reg & RF230_CMD_REGISTER_MASK) ); call SELN.clr(); call FastSpiByte.splitWrite(RF230_CMD_REGISTER_READ | reg); call FastSpiByte.splitReadWrite(0); reg = call FastSpiByte.splitRead(); call SELN.set(); return reg; } /*----------------- ALARM -----------------*/ enum { SLEEP_WAKEUP_TIME = (uint16_t)(880 * RADIO_ALARM_MICROSEC), PLL_CALIBRATION_TIME = (uint16_t)(180 * RADIO_ALARM_MICROSEC), CCA_REQUEST_TIME = (uint16_t)(140 * RADIO_ALARM_MICROSEC), // 8 undocumented delay, 128 for CSMA, 16 for delay, 5*32 for preamble and SFD TX_SFD_DELAY = (uint16_t)((8 + 128 + 16 + 5*32) * RADIO_ALARM_MICROSEC), // 32 for frame length, 16 for delay RX_SFD_DELAY = (uint16_t)((32 + 16) * RADIO_ALARM_MICROSEC), }; tasklet_async event void RadioAlarm.fired() { if( state == STATE_SLEEP_2_TRX_OFF ) state = STATE_TRX_OFF; else if( state == STATE_TRX_OFF_2_RX_ON ) { RADIO_ASSERT( cmd == CMD_TURNON || cmd == CMD_CHANNEL ); state = STATE_RX_ON; cmd = CMD_SIGNAL_DONE; } else if( cmd == CMD_CCA ) { uint8_t cca; RADIO_ASSERT( state == STATE_RX_ON ); cmd = CMD_NONE; cca = readRegister(RF230_TRX_STATUS); RADIO_ASSERT( (cca & RF230_TRX_STATUS_MASK) == RF230_RX_AACK_ON ); signal RadioCCA.done( (cca & RF230_CCA_DONE) ? ((cca & RF230_CCA_STATUS) ? SUCCESS : EBUSY) : FAIL ); } else RADIO_ASSERT(FALSE); // make sure the rest of the command processing is called call Tasklet.schedule(); } /*----------------- INIT -----------------*/ command error_t PlatformInit.init() { call SELN.makeOutput(); call SELN.set(); call SLP_TR.makeOutput(); call SLP_TR.clr(); call RSTN.makeOutput(); call RSTN.set(); rxMsg = &rxMsgBuffer; return SUCCESS; } command error_t SoftwareInit.init() { // for powering up the radio return call SpiResource.request(); } void initRadio() { uint16_t temp; call BusyWait.wait(510); call RSTN.clr(); call SLP_TR.clr(); call BusyWait.wait(6); call RSTN.set(); writeRegister(RF230_TRX_CTRL_0, RF230_TRX_CTRL_0_VALUE); writeRegister(RF230_TRX_STATE, RF230_TRX_OFF); call BusyWait.wait(510); writeRegister(RF230_IRQ_MASK, RF230_IRQ_TRX_UR | RF230_IRQ_TRX_END ); writeRegister(RF230_CCA_THRES, RF230_CCA_THRES_VALUE); writeRegister(RF230_PHY_TX_PWR, RF230_TX_AUTO_CRC_ON | (RF230_DEF_RFPOWER & RF230_TX_PWR_MASK)); txPower = RF230_DEF_RFPOWER & RF230_TX_PWR_MASK; channel = RF230_DEF_CHANNEL & RF230_CHANNEL_MASK; writeRegister(RF230_PHY_CC_CCA, RF230_CCA_MODE_VALUE | channel); writeRegister(RF230_XAH_CTRL, 0); writeRegister(RF230_CSMA_SEED_1, 0); temp = call ActiveMessageAddress.amGroup(); writeRegister(RF230_PAN_ID_0, temp); writeRegister(RF230_PAN_ID_1, temp >> 8); call SLP_TR.set(); state = STATE_SLEEP; } /*----------------- SPI -----------------*/ event void SpiResource.granted() { call SELN.makeOutput(); call SELN.set(); if( state == STATE_P_ON ) { initRadio(); call SpiResource.release(); } else call Tasklet.schedule(); } bool isSpiAcquired() { if( call SpiResource.isOwner() ) return TRUE; if( call SpiResource.immediateRequest() == SUCCESS ) { call SELN.makeOutput(); call SELN.set(); return TRUE; } call SpiResource.request(); return FALSE; } /*----------------- CHANNEL -----------------*/ tasklet_async command uint8_t RadioState.getChannel() { return channel; } tasklet_async command error_t RadioState.setChannel(uint8_t c) { c &= RF230_CHANNEL_MASK; if( cmd != CMD_NONE ) return EBUSY; else if( channel == c ) return EALREADY; channel = c; cmd = CMD_CHANNEL; call Tasklet.schedule(); return SUCCESS; } inline void changeChannel() { RADIO_ASSERT( cmd == CMD_CHANNEL ); RADIO_ASSERT( state == STATE_SLEEP || state == STATE_TRX_OFF || state == STATE_RX_ON ); if( isSpiAcquired() && call RadioAlarm.isFree() ) { writeRegister(RF230_PHY_CC_CCA, RF230_CCA_MODE_VALUE | channel); if( state == STATE_RX_ON ) { call RadioAlarm.wait(PLL_CALIBRATION_TIME); state = STATE_TRX_OFF_2_RX_ON; } else cmd = CMD_SIGNAL_DONE; } } /*----------------- TURN ON/OFF -----------------*/ inline void changeState() { if( (cmd == CMD_STANDBY || cmd == CMD_TURNON) && state == STATE_SLEEP && call RadioAlarm.isFree() ) { call SLP_TR.clr(); call RadioAlarm.wait(SLEEP_WAKEUP_TIME); state = STATE_SLEEP_2_TRX_OFF; } else if( cmd == CMD_TURNON && state == STATE_TRX_OFF && isSpiAcquired() && call RadioAlarm.isFree() ) { uint16_t temp; RADIO_ASSERT( ! radioIrq ); readRegister(RF230_IRQ_STATUS); // clear the interrupt register call IRQ.captureRisingEdge(); // setChannel was ignored in SLEEP because the SPI was not working, so do it here writeRegister(RF230_PHY_CC_CCA, RF230_CCA_MODE_VALUE | channel); temp = call ActiveMessageAddress.amAddress(); writeRegister(RF230_SHORT_ADDR_0, temp); writeRegister(RF230_SHORT_ADDR_1, temp >> 8); call RadioAlarm.wait(PLL_CALIBRATION_TIME); writeRegister(RF230_TRX_STATE, RF230_RX_AACK_ON); state = STATE_TRX_OFF_2_RX_ON; } else if( (cmd == CMD_TURNOFF || cmd == CMD_STANDBY) && state == STATE_RX_ON && isSpiAcquired() ) { writeRegister(RF230_TRX_STATE, RF230_FORCE_TRX_OFF); call IRQ.disable(); radioIrq = FALSE; state = STATE_TRX_OFF; } if( cmd == CMD_TURNOFF && state == STATE_TRX_OFF ) { call SLP_TR.set(); state = STATE_SLEEP; cmd = CMD_SIGNAL_DONE; } else if( cmd == CMD_STANDBY && state == STATE_TRX_OFF ) cmd = CMD_SIGNAL_DONE; } tasklet_async command error_t RadioState.turnOff() { if( cmd != CMD_NONE ) return EBUSY; else if( state == STATE_SLEEP ) return EALREADY; cmd = CMD_TURNOFF; call Tasklet.schedule(); return SUCCESS; } tasklet_async command error_t RadioState.standby() { if( cmd != CMD_NONE || (state == STATE_SLEEP && ! call RadioAlarm.isFree()) ) return EBUSY; else if( state == STATE_TRX_OFF ) return EALREADY; cmd = CMD_STANDBY; call Tasklet.schedule(); return SUCCESS; } tasklet_async command error_t RadioState.turnOn() { if( cmd != CMD_NONE || (state == STATE_SLEEP && ! call RadioAlarm.isFree()) ) return EBUSY; else if( state == STATE_RX_ON ) return EALREADY; cmd = CMD_TURNON; call Tasklet.schedule(); return SUCCESS; } default tasklet_async event void RadioState.done() { } task void changeAddress() { call Tasklet.suspend(); if( isSpiAcquired() ) { uint16_t temp = call ActiveMessageAddress.amAddress(); writeRegister(RF230_SHORT_ADDR_0, temp); writeRegister(RF230_SHORT_ADDR_1, temp >> 8); } else post changeAddress(); call Tasklet.resume(); } async event void ActiveMessageAddress.changed() { post changeAddress(); } /*----------------- TRANSMIT -----------------*/ tasklet_norace message_t* txMsg; tasklet_async command error_t RadioSend.send(message_t* msg) { uint16_t time; uint8_t length; uint8_t* data; uint8_t header; uint32_t time32; void* timesync; if( cmd != CMD_NONE || state != STATE_RX_ON || ! isSpiAcquired() || radioIrq ) return EBUSY; length = (call PacketTransmitPower.isSet(msg) ? call PacketTransmitPower.get(msg) : RF230_DEF_RFPOWER) & RF230_TX_PWR_MASK; if( length != txPower ) { txPower = length; writeRegister(RF230_PHY_TX_PWR, RF230_TX_AUTO_CRC_ON | txPower); } writeRegister(RF230_TRX_STATE, RF230_TX_ARET_ON); // do something useful, just to wait a little time32 = call LocalTime.get(); timesync = call PacketTimeSyncOffset.isSet(msg) ? ((void*)msg) + call PacketTimeSyncOffset.get(msg) : 0; // we have missed an incoming message in this short amount of time if( (readRegister(RF230_TRX_STATUS) & RF230_TRX_STATUS_MASK) != RF230_TX_ARET_ON ) { RADIO_ASSERT( (readRegister(RF230_TRX_STATUS) & RF230_TRX_STATUS_MASK) == RF230_BUSY_RX_AACK ); writeRegister(RF230_TRX_STATE, RF230_RX_AACK_ON); return EBUSY; } #ifndef RF230_SLOW_SPI atomic { call SLP_TR.set(); time = call RadioAlarm.getNow(); } call SLP_TR.clr(); #endif RADIO_ASSERT( ! radioIrq ); call SELN.clr(); call FastSpiByte.splitWrite(RF230_CMD_FRAME_WRITE); data = getPayload(msg); length = getHeader(msg)->length; // length | data[0] ... data[length-3] | automatically generated FCS call FastSpiByte.splitReadWrite(length); // the FCS is atomatically generated (2 bytes) length -= 2; header = call Config.headerPreloadLength(); if( header > length ) header = length; length -= header; // first upload the header to gain some time do { call FastSpiByte.splitReadWrite(*(data++)); } while( --header != 0 ); #ifdef RF230_SLOW_SPI atomic { call SLP_TR.set(); time = call RadioAlarm.getNow(); } call SLP_TR.clr(); #endif time32 += (int16_t)(time + TX_SFD_DELAY) - (int16_t)(time32); if( timesync != 0 ) *(timesync_relative_t*)timesync = (*(timesync_absolute_t*)timesync) - time32; while( length-- != 0 ) call FastSpiByte.splitReadWrite(*(data++)); // wait for the SPI transfer to finish call FastSpiByte.splitRead(); call SELN.set(); /* * There is a very small window (~1 microsecond) when the RF230 went * into PLL_ON state but was somehow not properly initialized because * of an incoming message and could not go into BUSY_TX. I think the * radio can even receive a message, and generate a TRX_UR interrupt * because of concurrent access, but that message probably cannot be * recovered. * * TODO: this needs to be verified, and make sure that the chip is * not locked up in this case. */ // go back to RX_ON state when finished writeRegister(RF230_TRX_STATE, RF230_RX_AACK_ON); if( timesync != 0 ) *(timesync_absolute_t*)timesync = (*(timesync_relative_t*)timesync) + time32; call PacketTimeStamp.set(msg, time32); #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ) { length = getHeader(msg)->length; call DiagMsg.chr('t'); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.int8(length); call DiagMsg.hex8s(getPayload(msg), length - 2); call DiagMsg.send(); } #endif // wait for the TRX_END interrupt txMsg = msg; state = STATE_BUSY_TX_2_RX_ON; cmd = CMD_TRANSMIT; return SUCCESS; } default tasklet_async event void RadioSend.sendDone(error_t error) { } default tasklet_async event void RadioSend.ready() { } /*----------------- CCA -----------------*/ tasklet_async command error_t RadioCCA.request() { if( cmd != CMD_NONE || state != STATE_RX_ON || ! isSpiAcquired() || ! call RadioAlarm.isFree() ) return EBUSY; // see Errata B7 of the datasheet // writeRegister(RF230_TRX_STATE, RF230_PLL_ON); // writeRegister(RF230_TRX_STATE, RF230_RX_AACK_ON); writeRegister(RF230_PHY_CC_CCA, RF230_CCA_REQUEST | RF230_CCA_MODE_VALUE | channel); call RadioAlarm.wait(CCA_REQUEST_TIME); cmd = CMD_CCA; return SUCCESS; } default tasklet_async event void RadioCCA.done(error_t error) { } /*----------------- RECEIVE -----------------*/ inline void downloadMessage() { uint8_t length; bool crcValid = FALSE; call SELN.clr(); call FastSpiByte.write(RF230_CMD_FRAME_READ); // read the length byte length = call FastSpiByte.write(0); // if correct length if( length >= 3 && length <= call RadioPacket.maxPayloadLength() + 2 ) { uint8_t read; uint8_t* data; // initiate the reading call FastSpiByte.splitWrite(0); data = getPayload(rxMsg); getHeader(rxMsg)->length = length; // we do not store the CRC field length -= 2; read = call Config.headerPreloadLength(); if( length < read ) read = length; length -= read; do { *(data++) = call FastSpiByte.splitReadWrite(0); } while( --read != 0 ); if( signal RadioReceive.header(rxMsg) ) { while( length-- != 0 ) *(data++) = call FastSpiByte.splitReadWrite(0); call FastSpiByte.splitReadWrite(0); // two CRC bytes call FastSpiByte.splitReadWrite(0); call PacketLinkQuality.set(rxMsg, call FastSpiByte.splitRead()); // we should have no other incoming message or buffer underflow crcValid = ! radioIrq; } else call FastSpiByte.splitRead(); // finish the SPI transfer } call SELN.set(); if( crcValid && call PacketTimeStamp.isValid(rxMsg) ) { uint32_t time32 = call PacketTimeStamp.timestamp(rxMsg); length = getHeader(rxMsg)->length; /* * If you hate floating point arithmetics and do not care of up to 400 microsecond time stamping errors, * then define RF230_HWACK_SLOPPY_TIMESTAMP, which will be significantly faster. */ #ifdef RF230_HWACK_SLOPPY_TIMESTAMP time32 -= (uint16_t)(RX_SFD_DELAY) + ((uint16_t)(length) << (RADIO_ALARM_MILLI_EXP - 5)); #else time32 -= (uint16_t)(RX_SFD_DELAY) + (uint16_t)(32.0 * RADIO_ALARM_MICROSEC * (uint16_t)length); #endif call PacketTimeStamp.set(rxMsg, time32); } #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ) { length = getHeader(rxMsg)->length; call DiagMsg.chr('r'); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.int8(crcValid ? length : -length); call DiagMsg.hex8s(getPayload(rxMsg), length - 2); call DiagMsg.int8(call PacketRSSI.isSet(rxMsg) ? call PacketRSSI.get(rxMsg) : -1); call DiagMsg.uint8(call PacketLinkQuality.isSet(rxMsg) ? call PacketLinkQuality.get(rxMsg) : 0); call DiagMsg.send(); } #endif state = STATE_RX_ON; cmd = CMD_NONE; // signal only if it has passed the CRC check if( crcValid ) rxMsg = signal RadioReceive.receive(rxMsg); } /*----------------- IRQ -----------------*/ async event void IRQ.captured(uint16_t time) { RADIO_ASSERT( ! radioIrq ); atomic { capturedTime = time; radioIrq = TRUE; } call Tasklet.schedule(); } void serviceRadio() { if( isSpiAcquired() ) { uint16_t time; uint32_t time32; uint8_t irq; uint8_t temp; atomic time = capturedTime; radioIrq = FALSE; irq = readRegister(RF230_IRQ_STATUS); #ifdef RADIO_DEBUG // TODO: handle this interrupt if( irq & RF230_IRQ_TRX_UR ) { if( call DiagMsg.record() ) { call DiagMsg.str("assert ur"); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.hex8(readRegister(RF230_TRX_STATUS)); call DiagMsg.hex8(readRegister(RF230_TRX_STATE)); call DiagMsg.hex8(irq); call DiagMsg.uint8(state); call DiagMsg.uint8(cmd); call DiagMsg.send(); } } #endif if( irq & RF230_IRQ_TRX_END ) { if( cmd == CMD_TRANSMIT ) { RADIO_ASSERT( state == STATE_BUSY_TX_2_RX_ON ); temp = readRegister(RF230_TRX_STATE) & RF230_TRAC_STATUS_MASK; if( call Ieee154PacketLayer.getAckRequired(txMsg) ) call AckReceivedFlag.setValue(txMsg, temp != RF230_TRAC_NO_ACK); state = STATE_RX_ON; cmd = CMD_NONE; signal RadioSend.sendDone(temp != RF230_TRAC_CHANNEL_ACCESS_FAILURE ? SUCCESS : EBUSY); // TODO: we could have missed a received message RADIO_ASSERT( ! (irq & RF230_IRQ_RX_START) ); } else if( cmd == CMD_NONE ) { RADIO_ASSERT( state == STATE_RX_ON ); if( irq == RF230_IRQ_TRX_END ) { call PacketRSSI.set(rxMsg, readRegister(RF230_PHY_ED_LEVEL)); // TODO: compensate for packet transmission time when downloading time32 = call LocalTime.get(); time32 += (int16_t)(time) - (int16_t)(time32); call PacketTimeStamp.set(rxMsg, time32); } else { call PacketRSSI.clear(rxMsg); call PacketTimeStamp.clear(rxMsg); } cmd = CMD_DOWNLOAD; } else RADIO_ASSERT(FALSE); } } } default tasklet_async event bool RadioReceive.header(message_t* msg) { return TRUE; } default tasklet_async event message_t* RadioReceive.receive(message_t* msg) { return msg; } /*----------------- TASKLET -----------------*/ task void releaseSpi() { call SpiResource.release(); } tasklet_async event void Tasklet.run() { if( radioIrq ) serviceRadio(); if( cmd != CMD_NONE ) { if( cmd == CMD_DOWNLOAD ) downloadMessage(); else if( CMD_TURNOFF <= cmd && cmd <= CMD_TURNON ) changeState(); else if( cmd == CMD_CHANNEL ) changeChannel(); if( cmd == CMD_SIGNAL_DONE ) { cmd = CMD_NONE; signal RadioState.done(); } } if( cmd == CMD_NONE && state == STATE_RX_ON && ! radioIrq ) signal RadioSend.ready(); if( cmd == CMD_NONE ) post releaseSpi(); } /*----------------- RadioPacket -----------------*/ async command uint8_t RadioPacket.headerLength(message_t* msg) { return call Config.headerLength(msg) + sizeof(rf230_header_t); } async command uint8_t RadioPacket.payloadLength(message_t* msg) { return getHeader(msg)->length - 2; } async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length) { RADIO_ASSERT( 1 <= length && length <= 125 ); RADIO_ASSERT( call RadioPacket.headerLength(msg) + length + call RadioPacket.metadataLength(msg) <= sizeof(message_t) ); // we add the length of the CRC, which is automatically generated getHeader(msg)->length = length + 2; } async command uint8_t RadioPacket.maxPayloadLength() { RADIO_ASSERT( call Config.maxPayloadLength() - sizeof(rf230_header_t) <= 125 ); return call Config.maxPayloadLength() - sizeof(rf230_header_t); } async command uint8_t RadioPacket.metadataLength(message_t* msg) { return call Config.metadataLength(msg) + sizeof(rf230_metadata_t); } async command void RadioPacket.clear(message_t* msg) { // all flags are automatically cleared } /*----------------- PacketTransmitPower -----------------*/ async command bool PacketTransmitPower.isSet(message_t* msg) { return call TransmitPowerFlag.get(msg); } async command uint8_t PacketTransmitPower.get(message_t* msg) { return getMeta(msg)->power; } async command void PacketTransmitPower.clear(message_t* msg) { call TransmitPowerFlag.clear(msg); } async command void PacketTransmitPower.set(message_t* msg, uint8_t value) { call TransmitPowerFlag.set(msg); getMeta(msg)->power = value; } /*----------------- PacketRSSI -----------------*/ async command bool PacketRSSI.isSet(message_t* msg) { return call RSSIFlag.get(msg); } async command uint8_t PacketRSSI.get(message_t* msg) { return getMeta(msg)->rssi; } async command void PacketRSSI.clear(message_t* msg) { call RSSIFlag.clear(msg); } async command void PacketRSSI.set(message_t* msg, uint8_t value) { // just to be safe if the user fails to clear the packet call TransmitPowerFlag.clear(msg); call RSSIFlag.set(msg); getMeta(msg)->rssi = value; } /*----------------- PacketTimeSyncOffset -----------------*/ async command bool PacketTimeSyncOffset.isSet(message_t* msg) { return call TimeSyncFlag.get(msg); } async command uint8_t PacketTimeSyncOffset.get(message_t* msg) { return call RadioPacket.headerLength(msg) + call RadioPacket.payloadLength(msg) - sizeof(timesync_absolute_t); } async command void PacketTimeSyncOffset.clear(message_t* msg) { call TimeSyncFlag.clear(msg); } async command void PacketTimeSyncOffset.set(message_t* msg, uint8_t value) { // we do not store the value, the time sync field is always the last 4 bytes RADIO_ASSERT( call PacketTimeSyncOffset.get(msg) == value ); call TimeSyncFlag.set(msg); } /*----------------- PacketLinkQuality -----------------*/ async command bool PacketLinkQuality.isSet(message_t* msg) { return TRUE; } async command uint8_t PacketLinkQuality.get(message_t* msg) { return getMeta(msg)->lqi; } async command void PacketLinkQuality.clear(message_t* msg) { } async command void PacketLinkQuality.set(message_t* msg, uint8_t value) { getMeta(msg)->lqi = value; } /*----------------- PacketAcknowledgements -----------------*/ async command error_t PacketAcknowledgements.requestAck(message_t* msg) { call Ieee154PacketLayer.setAckRequired(msg, TRUE); return SUCCESS; } async command error_t PacketAcknowledgements.noAck(message_t* msg) { call Ieee154PacketLayer.setAckRequired(msg, FALSE); return SUCCESS; } async command bool PacketAcknowledgements.wasAcked(message_t* msg) { return call AckReceivedFlag.get(msg); } /*----------------- LinkPacketMetadata -----------------*/ async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) { return call PacketLinkQuality.get(msg) > 200; } } tinyos-2.1.2+dfsg/tos/chips/rf230/RF230DriverLayer.h000066400000000000000000000113771207233610700216170ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __RF230DRIVERLAYER_H__ #define __RF230DRIVERLAYER_H__ typedef nx_struct rf230_header_t { nxle_uint8_t length; } rf230_header_t; typedef struct rf230_metadata_t { uint8_t lqi; union { uint8_t power; uint8_t rssi; }; } rf230_metadata_t; enum rf230_registers_enum { RF230_TRX_STATUS = 0x01, RF230_TRX_STATE = 0x02, RF230_TRX_CTRL_0 = 0x03, RF230_PHY_TX_PWR = 0x05, RF230_PHY_RSSI = 0x06, RF230_PHY_ED_LEVEL = 0x07, RF230_PHY_CC_CCA = 0x08, RF230_CCA_THRES = 0x09, RF230_IRQ_MASK = 0x0E, RF230_IRQ_STATUS = 0x0F, RF230_VREG_CTRL = 0x10, RF230_BATMON = 0x11, RF230_XOSC_CTRL = 0x12, RF230_PLL_CF = 0x1A, RF230_PLL_DCU = 0x1B, RF230_PART_NUM = 0x1C, RF230_VERSION_NUM = 0x1D, RF230_MAN_ID_0 = 0x1E, RF230_MAN_ID_1 = 0x1F, RF230_SHORT_ADDR_0 = 0x20, RF230_SHORT_ADDR_1 = 0x21, RF230_PAN_ID_0 = 0x22, RF230_PAN_ID_1 = 0x23, RF230_IEEE_ADDR_0 = 0x24, RF230_IEEE_ADDR_1 = 0x25, RF230_IEEE_ADDR_2 = 0x26, RF230_IEEE_ADDR_3 = 0x27, RF230_IEEE_ADDR_4 = 0x28, RF230_IEEE_ADDR_5 = 0x29, RF230_IEEE_ADDR_6 = 0x2A, RF230_IEEE_ADDR_7 = 0x2B, RF230_XAH_CTRL = 0x2C, RF230_CSMA_SEED_0 = 0x2D, RF230_CSMA_SEED_1 = 0x2E, }; enum rf230_trx_register_enums { RF230_CCA_DONE = 1 << 7, RF230_CCA_STATUS = 1 << 6, RF230_TRX_STATUS_MASK = 0x1F, RF230_P_ON = 0, RF230_BUSY_RX = 1, RF230_BUSY_TX = 2, RF230_RX_ON = 6, RF230_TRX_OFF = 8, RF230_PLL_ON = 9, RF230_SLEEP = 15, RF230_BUSY_RX_AACK = 17, RF230_BUSR_TX_ARET = 18, RF230_RX_AACK_ON = 22, RF230_TX_ARET_ON = 25, RF230_RX_ON_NOCLK = 28, RF230_AACK_ON_NOCLK = 29, RF230_BUSY_RX_AACK_NOCLK = 30, RF230_STATE_TRANSITION_IN_PROGRESS = 31, RF230_TRAC_STATUS_MASK = 0xE0, RF230_TRAC_SUCCESS = 0, RF230_TRAC_SUCCESS_DATA_PENDING = 1 << 5, RF230_TRAC_CHANNEL_ACCESS_FAILURE = 3 << 5, RF230_TRAC_NO_ACK = 5 << 5, RF230_TRAC_INVALID = 7 << 5, RF230_TRX_CMD_MASK = 0x1F, RF230_NOP = 0, RF230_TX_START = 2, RF230_FORCE_TRX_OFF = 3, }; enum rf230_phy_register_enums { RF230_TX_AUTO_CRC_ON = 1 << 7, RF230_TX_PWR_MASK = 0x0F, RF230_RSSI_MASK = 0x1F, RF230_CCA_REQUEST = 1 << 7, RF230_CCA_MODE_0 = 0 << 5, RF230_CCA_MODE_1 = 1 << 5, RF230_CCA_MODE_2 = 2 << 5, RF230_CCA_MODE_3 = 3 << 5, RF230_CHANNEL_DEFAULT = 11, RF230_CHANNEL_MASK = 0x1F, RF230_CCA_CS_THRES_SHIFT = 4, RF230_CCA_ED_THRES_SHIFT = 0, }; enum rf230_irq_register_enums { RF230_IRQ_BAT_LOW = 1 << 7, RF230_IRQ_TRX_UR = 1 << 6, RF230_IRQ_TRX_END = 1 << 3, RF230_IRQ_RX_START = 1 << 2, RF230_IRQ_PLL_UNLOCK = 1 << 1, RF230_IRQ_PLL_LOCK = 1 << 0, }; enum rf230_control_register_enums { RF230_AVREG_EXT = 1 << 7, RF230_AVDD_OK = 1 << 6, RF230_DVREG_EXT = 1 << 3, RF230_DVDD_OK = 1 << 2, RF230_BATMON_OK = 1 << 5, RF230_BATMON_VHR = 1 << 4, RF230_BATMON_VTH_MASK = 0x0F, RF230_XTAL_MODE_OFF = 0 << 4, RF230_XTAL_MODE_EXTERNAL = 4 << 4, RF230_XTAL_MODE_INTERNAL = 15 << 4, }; enum rf230_pll_register_enums { RF230_PLL_CF_START = 1 << 7, RF230_PLL_DCU_START = 1 << 7, }; enum rf230_spi_command_enums { RF230_CMD_REGISTER_READ = 0x80, RF230_CMD_REGISTER_WRITE = 0xC0, RF230_CMD_REGISTER_MASK = 0x3F, RF230_CMD_FRAME_READ = 0x20, RF230_CMD_FRAME_WRITE = 0x60, RF230_CMD_SRAM_READ = 0x00, RF230_CMD_SRAM_WRITE = 0x40, }; #endif//__RF230DRIVERLAYER_H__ tinyos-2.1.2+dfsg/tos/chips/rf230/RF230DriverLayerC.nc000066400000000000000000000073521207233610700220710ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include configuration RF230DriverLayerC { provides { interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; interface LinkPacketMetadata; interface LocalTime as LocalTimeRadio; interface Alarm; } uses { interface RF230DriverConfig as Config; interface PacketTimeStamp; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; interface RadioAlarm; } } implementation { components RF230DriverLayerP as DriverLayerP, HplRF230C, BusyWaitMicroC, TaskletC, MainC; RadioState = DriverLayerP; RadioSend = DriverLayerP; RadioReceive = DriverLayerP; RadioCCA = DriverLayerP; RadioPacket = DriverLayerP; LocalTimeRadio = HplRF230C; Config = DriverLayerP; PacketTransmitPower = DriverLayerP.PacketTransmitPower; TransmitPowerFlag = DriverLayerP.TransmitPowerFlag; PacketRSSI = DriverLayerP.PacketRSSI; RSSIFlag = DriverLayerP.RSSIFlag; PacketTimeSyncOffset = DriverLayerP.PacketTimeSyncOffset; TimeSyncFlag = DriverLayerP.TimeSyncFlag; PacketLinkQuality = DriverLayerP.PacketLinkQuality; PacketTimeStamp = DriverLayerP.PacketTimeStamp; LinkPacketMetadata = DriverLayerP; DriverLayerP.LocalTime -> HplRF230C; Alarm = HplRF230C.Alarm; RadioAlarm = DriverLayerP.RadioAlarm; DriverLayerP.SELN -> HplRF230C.SELN; DriverLayerP.SpiResource -> HplRF230C.SpiResource; DriverLayerP.FastSpiByte -> HplRF230C; DriverLayerP.SLP_TR -> HplRF230C.SLP_TR; DriverLayerP.RSTN -> HplRF230C.RSTN; DriverLayerP.IRQ -> HplRF230C.IRQ; DriverLayerP.Tasklet -> TaskletC; DriverLayerP.BusyWait -> BusyWaitMicroC; #ifdef RADIO_DEBUG components DiagMsgC; DriverLayerP.DiagMsg -> DiagMsgC; #endif MainC.SoftwareInit -> DriverLayerP.SoftwareInit; components RealMainP; RealMainP.PlatformInit -> DriverLayerP.PlatformInit; } tinyos-2.1.2+dfsg/tos/chips/rf230/RF230DriverLayerP.nc000066400000000000000000000612701207233610700221050ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti * Author: Branislav Kusy (bugfixes) */ #include #include #include #include #include module RF230DriverLayerP { provides { interface Init as PlatformInit @exactlyonce(); interface Init as SoftwareInit @exactlyonce(); interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; interface LinkPacketMetadata; } uses { interface GeneralIO as SELN; interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as SLP_TR; interface GeneralIO as RSTN; interface GpioCapture as IRQ; interface BusyWait; interface LocalTime; interface RF230DriverConfig as Config; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; interface PacketTimeStamp; interface Tasklet; interface RadioAlarm; #ifdef RADIO_DEBUG interface DiagMsg; #endif } } implementation { rf230_header_t* getHeader(message_t* msg) { return ((void*)msg) + call Config.headerLength(msg); } void* getPayload(message_t* msg) { return ((void*)msg) + call RadioPacket.headerLength(msg); } rf230_metadata_t* getMeta(message_t* msg) { return ((void*)msg) + sizeof(message_t) - call RadioPacket.metadataLength(msg); } /*----------------- STATE -----------------*/ tasklet_norace uint8_t state; enum { STATE_P_ON = 0, STATE_SLEEP = 1, STATE_SLEEP_2_TRX_OFF = 2, STATE_TRX_OFF = 3, STATE_TRX_OFF_2_RX_ON = 4, STATE_RX_ON = 5, STATE_BUSY_TX_2_RX_ON = 6, }; tasklet_norace uint8_t cmd; enum { CMD_NONE = 0, // the state machine has stopped CMD_TURNOFF = 1, // goto SLEEP state CMD_STANDBY = 2, // goto TRX_OFF state CMD_TURNON = 3, // goto RX_ON state CMD_TRANSMIT = 4, // currently transmitting a message CMD_RECEIVE = 5, // currently receiving a message CMD_CCA = 6, // performing clear chanel assesment CMD_CHANNEL = 7, // changing the channel CMD_SIGNAL_DONE = 8, // signal the end of the state transition CMD_DOWNLOAD = 9, // download the received message }; norace bool radioIrq; tasklet_norace uint8_t txPower; tasklet_norace uint8_t channel; tasklet_norace message_t* rxMsg; message_t rxMsgBuffer; uint16_t capturedTime; // the current time when the last interrupt has occured tasklet_norace uint8_t rssiClear; tasklet_norace uint8_t rssiBusy; /*----------------- REGISTER -----------------*/ inline void writeRegister(uint8_t reg, uint8_t value) { RADIO_ASSERT( call SpiResource.isOwner() ); RADIO_ASSERT( reg == (reg & RF230_CMD_REGISTER_MASK) ); call SELN.clr(); call FastSpiByte.splitWrite(RF230_CMD_REGISTER_WRITE | reg); call FastSpiByte.splitReadWrite(value); call FastSpiByte.splitRead(); call SELN.set(); } inline uint8_t readRegister(uint8_t reg) { RADIO_ASSERT( call SpiResource.isOwner() ); RADIO_ASSERT( reg == (reg & RF230_CMD_REGISTER_MASK) ); call SELN.clr(); call FastSpiByte.splitWrite(RF230_CMD_REGISTER_READ | reg); call FastSpiByte.splitReadWrite(0); reg = call FastSpiByte.splitRead(); call SELN.set(); return reg; } /*----------------- ALARM -----------------*/ enum { SLEEP_WAKEUP_TIME = (uint16_t)(880 * RADIO_ALARM_MICROSEC), CCA_REQUEST_TIME = (uint16_t)(140 * RADIO_ALARM_MICROSEC), TX_SFD_DELAY = (uint16_t)(176 * RADIO_ALARM_MICROSEC), RX_SFD_DELAY = (uint16_t)(8 * RADIO_ALARM_MICROSEC), }; tasklet_async event void RadioAlarm.fired() { if( state == STATE_SLEEP_2_TRX_OFF ) state = STATE_TRX_OFF; else if( cmd == CMD_CCA ) { uint8_t cca; RADIO_ASSERT( state == STATE_RX_ON ); cmd = CMD_NONE; cca = readRegister(RF230_TRX_STATUS); RADIO_ASSERT( (cca & RF230_TRX_STATUS_MASK) == RF230_RX_ON ); signal RadioCCA.done( (cca & RF230_CCA_DONE) ? ((cca & RF230_CCA_STATUS) ? SUCCESS : EBUSY) : FAIL ); } else RADIO_ASSERT(FALSE); // make sure the rest of the command processing is called call Tasklet.schedule(); } /*----------------- INIT -----------------*/ command error_t PlatformInit.init() { call SELN.makeOutput(); call SELN.set(); call SLP_TR.makeOutput(); call SLP_TR.clr(); call RSTN.makeOutput(); call RSTN.set(); rxMsg = &rxMsgBuffer; // these are just good approximates rssiClear = 0; rssiBusy = 90; return SUCCESS; } command error_t SoftwareInit.init() { // for powering up the radio return call SpiResource.request(); } void initRadio() { call BusyWait.wait(510); call RSTN.clr(); call SLP_TR.clr(); call BusyWait.wait(6); call RSTN.set(); writeRegister(RF230_TRX_CTRL_0, RF230_TRX_CTRL_0_VALUE); writeRegister(RF230_TRX_STATE, RF230_TRX_OFF); call BusyWait.wait(510); writeRegister(RF230_IRQ_MASK, RF230_IRQ_TRX_UR | RF230_IRQ_PLL_LOCK | RF230_IRQ_TRX_END | RF230_IRQ_RX_START); writeRegister(RF230_CCA_THRES, RF230_CCA_THRES_VALUE); writeRegister(RF230_PHY_TX_PWR, RF230_TX_AUTO_CRC_ON | (RF230_DEF_RFPOWER & RF230_TX_PWR_MASK)); txPower = RF230_DEF_RFPOWER & RF230_TX_PWR_MASK; channel = RF230_DEF_CHANNEL & RF230_CHANNEL_MASK; writeRegister(RF230_PHY_CC_CCA, RF230_CCA_MODE_VALUE | channel); call SLP_TR.set(); state = STATE_SLEEP; } /*----------------- SPI -----------------*/ event void SpiResource.granted() { call SELN.makeOutput(); call SELN.set(); if( state == STATE_P_ON ) { initRadio(); call SpiResource.release(); } else call Tasklet.schedule(); } bool isSpiAcquired() { if( call SpiResource.isOwner() ) return TRUE; if( call SpiResource.immediateRequest() == SUCCESS ) { call SELN.makeOutput(); call SELN.set(); return TRUE; } call SpiResource.request(); return FALSE; } /*----------------- CHANNEL -----------------*/ tasklet_async command uint8_t RadioState.getChannel() { return channel; } tasklet_async command error_t RadioState.setChannel(uint8_t c) { c &= RF230_CHANNEL_MASK; if( cmd != CMD_NONE ) return EBUSY; else if( channel == c ) return EALREADY; channel = c; cmd = CMD_CHANNEL; call Tasklet.schedule(); return SUCCESS; } inline void changeChannel() { RADIO_ASSERT( cmd == CMD_CHANNEL ); RADIO_ASSERT( state == STATE_SLEEP || state == STATE_TRX_OFF || state == STATE_RX_ON ); if( isSpiAcquired() ) { writeRegister(RF230_PHY_CC_CCA, RF230_CCA_MODE_VALUE | channel); if( state == STATE_RX_ON ) state = STATE_TRX_OFF_2_RX_ON; else cmd = CMD_SIGNAL_DONE; } } /*----------------- TURN ON/OFF -----------------*/ inline void changeState() { if( (cmd == CMD_STANDBY || cmd == CMD_TURNON) && state == STATE_SLEEP && call RadioAlarm.isFree() ) { call SLP_TR.clr(); call RadioAlarm.wait(SLEEP_WAKEUP_TIME); state = STATE_SLEEP_2_TRX_OFF; } else if( cmd == CMD_TURNON && state == STATE_TRX_OFF && isSpiAcquired() ) { RADIO_ASSERT( ! radioIrq ); readRegister(RF230_IRQ_STATUS); // clear the interrupt register call IRQ.captureRisingEdge(); // setChannel was ignored in SLEEP because the SPI was not working, so do it here writeRegister(RF230_PHY_CC_CCA, RF230_CCA_MODE_VALUE | channel); writeRegister(RF230_TRX_STATE, RF230_RX_ON); state = STATE_TRX_OFF_2_RX_ON; #ifdef RADIO_DEBUG_PARTNUM if( call DiagMsg.record() ) { call DiagMsg.str("partnum"); call DiagMsg.hex8(readRegister(RF230_PART_NUM)); call DiagMsg.hex8(readRegister(RF230_VERSION_NUM)); call DiagMsg.hex8(readRegister(RF230_MAN_ID_0)); call DiagMsg.hex8(readRegister(RF230_MAN_ID_1)); call DiagMsg.send(); } #endif } else if( (cmd == CMD_TURNOFF || cmd == CMD_STANDBY) && state == STATE_RX_ON && isSpiAcquired() ) { writeRegister(RF230_TRX_STATE, RF230_FORCE_TRX_OFF); call IRQ.disable(); radioIrq = FALSE; state = STATE_TRX_OFF; } if( cmd == CMD_TURNOFF && state == STATE_TRX_OFF ) { call SLP_TR.set(); state = STATE_SLEEP; cmd = CMD_SIGNAL_DONE; } else if( cmd == CMD_STANDBY && state == STATE_TRX_OFF ) cmd = CMD_SIGNAL_DONE; } tasklet_async command error_t RadioState.turnOff() { if( cmd != CMD_NONE ) return EBUSY; else if( state == STATE_SLEEP ) return EALREADY; cmd = CMD_TURNOFF; call Tasklet.schedule(); return SUCCESS; } tasklet_async command error_t RadioState.standby() { if( cmd != CMD_NONE || (state == STATE_SLEEP && ! call RadioAlarm.isFree()) ) return EBUSY; else if( state == STATE_TRX_OFF ) return EALREADY; cmd = CMD_STANDBY; call Tasklet.schedule(); return SUCCESS; } tasklet_async command error_t RadioState.turnOn() { if( cmd != CMD_NONE || (state == STATE_SLEEP && ! call RadioAlarm.isFree()) ) return EBUSY; else if( state == STATE_RX_ON ) return EALREADY; cmd = CMD_TURNON; call Tasklet.schedule(); return SUCCESS; } default tasklet_async event void RadioState.done() { } /*----------------- TRANSMIT -----------------*/ tasklet_async command error_t RadioSend.send(message_t* msg) { uint16_t time; uint8_t length; uint8_t* data; uint8_t header; uint32_t time32; void* timesync; if( cmd != CMD_NONE || state != STATE_RX_ON || ! isSpiAcquired() || radioIrq ) return EBUSY; length = (call PacketTransmitPower.isSet(msg) ? call PacketTransmitPower.get(msg) : RF230_DEF_RFPOWER) & RF230_TX_PWR_MASK; if( length != txPower ) { txPower = length; writeRegister(RF230_PHY_TX_PWR, RF230_TX_AUTO_CRC_ON | txPower); } if( call Config.requiresRssiCca(msg) && (readRegister(RF230_PHY_RSSI) & RF230_RSSI_MASK) > ((rssiClear + rssiBusy) >> 3) ) return EBUSY; writeRegister(RF230_TRX_STATE, RF230_PLL_ON); // do something useful, just to wait a little time32 = call LocalTime.get(); timesync = call PacketTimeSyncOffset.isSet(msg) ? ((void*)msg) + call PacketTimeSyncOffset.get(msg) : 0; // we have missed an incoming message in this short amount of time if( (readRegister(RF230_TRX_STATUS) & RF230_TRX_STATUS_MASK) != RF230_PLL_ON ) { RADIO_ASSERT( (readRegister(RF230_TRX_STATUS) & RF230_TRX_STATUS_MASK) == RF230_BUSY_RX ); writeRegister(RF230_TRX_STATE, RF230_RX_ON); return EBUSY; } #ifndef RF230_SLOW_SPI atomic { call SLP_TR.set(); time = call RadioAlarm.getNow(); } call SLP_TR.clr(); #endif RADIO_ASSERT( ! radioIrq ); call SELN.clr(); call FastSpiByte.splitWrite(RF230_CMD_FRAME_WRITE); data = getPayload(msg); length = getHeader(msg)->length; // length | data[0] ... data[length-3] | automatically generated FCS call FastSpiByte.splitReadWrite(length); // the FCS is atomatically generated (2 bytes) length -= 2; header = call Config.headerPreloadLength(); if( header > length ) header = length; length -= header; // first upload the header to gain some time do { call FastSpiByte.splitReadWrite(*(data++)); } while( --header != 0 ); #ifdef RF230_SLOW_SPI atomic { call SLP_TR.set(); time = call RadioAlarm.getNow(); } call SLP_TR.clr(); #endif time32 += (int16_t)(time + TX_SFD_DELAY) - (int16_t)(time32); if( timesync != 0 ) *(timesync_relative_t*)timesync = (*(timesync_absolute_t*)timesync) - time32; while( length-- != 0 ) call FastSpiByte.splitReadWrite(*(data++)); // wait for the SPI transfer to finish call FastSpiByte.splitRead(); call SELN.set(); /* * There is a very small window (~1 microsecond) when the RF230 went * into PLL_ON state but was somehow not properly initialized because * of an incoming message and could not go into BUSY_TX. I think the * radio can even receive a message, and generate a TRX_UR interrupt * because of concurrent access, but that message probably cannot be * recovered. * * TODO: this needs to be verified, and make sure that the chip is * not locked up in this case. */ // go back to RX_ON state when finished writeRegister(RF230_TRX_STATE, RF230_RX_ON); if( timesync != 0 ) *(timesync_absolute_t*)timesync = (*(timesync_relative_t*)timesync) + time32; call PacketTimeStamp.set(msg, time32); #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ) { length = getHeader(msg)->length; call DiagMsg.chr('t'); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.int8(length); call DiagMsg.hex8s(getPayload(msg), length - 2); call DiagMsg.send(); } #endif // wait for the TRX_END interrupt state = STATE_BUSY_TX_2_RX_ON; cmd = CMD_TRANSMIT; return SUCCESS; } default tasklet_async event void RadioSend.sendDone(error_t error) { } default tasklet_async event void RadioSend.ready() { } /*----------------- CCA -----------------*/ tasklet_async command error_t RadioCCA.request() { if( cmd != CMD_NONE || state != STATE_RX_ON || ! isSpiAcquired() || ! call RadioAlarm.isFree() ) return EBUSY; // see Errata B7 of the datasheet // writeRegister(RF230_TRX_STATE, RF230_PLL_ON); // writeRegister(RF230_TRX_STATE, RF230_RX_ON); writeRegister(RF230_PHY_CC_CCA, RF230_CCA_REQUEST | RF230_CCA_MODE_VALUE | channel); call RadioAlarm.wait(CCA_REQUEST_TIME); cmd = CMD_CCA; return SUCCESS; } default tasklet_async event void RadioCCA.done(error_t error) { } /*----------------- RECEIVE -----------------*/ inline void downloadMessage() { uint8_t length; uint16_t crc; call SELN.clr(); call FastSpiByte.write(RF230_CMD_FRAME_READ); // read the length byte length = call FastSpiByte.write(0); // if correct length if( length >= 3 && length <= call RadioPacket.maxPayloadLength() + 2 ) { uint8_t read; uint8_t* data; // initiate the reading call FastSpiByte.splitWrite(0); data = getPayload(rxMsg); getHeader(rxMsg)->length = length; crc = 0; // we do not store the CRC field length -= 2; read = call Config.headerPreloadLength(); if( length < read ) read = length; length -= read; do { crc = RF230_CRCBYTE_COMMAND(crc, *(data++) = call FastSpiByte.splitReadWrite(0)); } while( --read != 0 ); if( signal RadioReceive.header(rxMsg) ) { while( length-- != 0 ) crc = RF230_CRCBYTE_COMMAND(crc, *(data++) = call FastSpiByte.splitReadWrite(0)); crc = RF230_CRCBYTE_COMMAND(crc, call FastSpiByte.splitReadWrite(0)); crc = RF230_CRCBYTE_COMMAND(crc, call FastSpiByte.splitReadWrite(0)); call PacketLinkQuality.set(rxMsg, call FastSpiByte.splitRead()); } else { call FastSpiByte.splitRead(); // finish the SPI transfer crc = 1; } } else crc = 1; call SELN.set(); state = STATE_RX_ON; #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ) { length = getHeader(rxMsg)->length; call DiagMsg.chr('r'); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.int8(crc == 0 ? length : -length); call DiagMsg.hex8s(getPayload(rxMsg), length - 2); call DiagMsg.int8(call PacketRSSI.isSet(rxMsg) ? call PacketRSSI.get(rxMsg) : -1); call DiagMsg.uint8(call PacketLinkQuality.isSet(rxMsg) ? call PacketLinkQuality.get(rxMsg) : 0); call DiagMsg.send(); } #endif cmd = CMD_NONE; // signal only if it has passed the CRC check if( crc == 0 ) rxMsg = signal RadioReceive.receive(rxMsg); } /*----------------- IRQ -----------------*/ async event void IRQ.captured(uint16_t time) { RADIO_ASSERT( ! radioIrq ); atomic { capturedTime = time; radioIrq = TRUE; } call Tasklet.schedule(); } void serviceRadio() { if( isSpiAcquired() ) { uint16_t time; uint32_t time32; uint8_t irq; uint8_t temp; atomic time = capturedTime; radioIrq = FALSE; irq = readRegister(RF230_IRQ_STATUS); #ifdef RADIO_DEBUG // TODO: handle this interrupt if( irq & RF230_IRQ_TRX_UR ) { if( call DiagMsg.record() ) { call DiagMsg.str("assert ur"); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.hex8(readRegister(RF230_TRX_STATUS)); call DiagMsg.hex8(readRegister(RF230_TRX_STATE)); call DiagMsg.hex8(irq); call DiagMsg.uint8(state); call DiagMsg.uint8(cmd); call DiagMsg.send(); } } #endif #ifdef RF230_RSSI_ENERGY if( irq & RF230_IRQ_TRX_END ) { if( irq == RF230_IRQ_TRX_END || (irq == (RF230_IRQ_RX_START | RF230_IRQ_TRX_END) && cmd == CMD_NONE) ) call PacketRSSI.set(rxMsg, readRegister(RF230_PHY_ED_LEVEL)); else call PacketRSSI.clear(rxMsg); } #endif // sometimes we miss a PLL lock interrupt after turn on if( cmd == CMD_TURNON || cmd == CMD_CHANNEL ) { RADIO_ASSERT( irq & RF230_IRQ_PLL_LOCK ); RADIO_ASSERT( state == STATE_TRX_OFF_2_RX_ON ); state = STATE_RX_ON; cmd = CMD_SIGNAL_DONE; } else if( irq & RF230_IRQ_PLL_LOCK ) { RADIO_ASSERT( cmd == CMD_TRANSMIT ); RADIO_ASSERT( state == STATE_BUSY_TX_2_RX_ON ); } if( irq & RF230_IRQ_RX_START ) { if( cmd == CMD_CCA ) { signal RadioCCA.done(FAIL); cmd = CMD_NONE; } if( cmd == CMD_NONE ) { RADIO_ASSERT( state == STATE_RX_ON ); // the most likely place for busy channel, with no TRX_END interrupt if( irq == RF230_IRQ_RX_START ) { temp = readRegister(RF230_PHY_RSSI) & RF230_RSSI_MASK; rssiBusy += temp - (rssiBusy >> 2); #ifndef RF230_RSSI_ENERGY call PacketRSSI.set(rxMsg, temp); } else { call PacketRSSI.clear(rxMsg); #endif } /* * The timestamp corresponds to the first event which could not * have been a PLL_LOCK because then cmd != CMD_NONE, so we must * have received a message (and could also have received the * TRX_END interrupt in the mean time, but that is fine. Also, * we could not be after a transmission, because then cmd = * CMD_TRANSMIT. */ if( irq == RF230_IRQ_RX_START ) // just to be cautious { time32 = call LocalTime.get(); time32 += (int16_t)(time - RX_SFD_DELAY) - (int16_t)(time32); call PacketTimeStamp.set(rxMsg, time32); } else call PacketTimeStamp.clear(rxMsg); cmd = CMD_RECEIVE; } else RADIO_ASSERT( cmd == CMD_TURNOFF ); } if( irq & RF230_IRQ_TRX_END ) { if( cmd == CMD_TRANSMIT ) { RADIO_ASSERT( state == STATE_BUSY_TX_2_RX_ON ); state = STATE_RX_ON; cmd = CMD_NONE; signal RadioSend.sendDone(SUCCESS); // TODO: we could have missed a received message RADIO_ASSERT( ! (irq & RF230_IRQ_RX_START) ); } else if( cmd == CMD_RECEIVE ) { RADIO_ASSERT( state == STATE_RX_ON ); // the most likely place for clear channel (hope to avoid acks) rssiClear += (readRegister(RF230_PHY_RSSI) & RF230_RSSI_MASK) - (rssiClear >> 2); cmd = CMD_DOWNLOAD; } else RADIO_ASSERT(FALSE); } } } default tasklet_async event bool RadioReceive.header(message_t* msg) { return TRUE; } default tasklet_async event message_t* RadioReceive.receive(message_t* msg) { return msg; } /*----------------- TASKLET -----------------*/ task void releaseSpi() { call SpiResource.release(); } tasklet_async event void Tasklet.run() { if( radioIrq ) serviceRadio(); if( cmd != CMD_NONE ) { if( cmd == CMD_DOWNLOAD ) downloadMessage(); else if( CMD_TURNOFF <= cmd && cmd <= CMD_TURNON ) changeState(); else if( cmd == CMD_CHANNEL ) changeChannel(); if( cmd == CMD_SIGNAL_DONE ) { cmd = CMD_NONE; signal RadioState.done(); } } if( cmd == CMD_NONE && state == STATE_RX_ON && ! radioIrq ) signal RadioSend.ready(); if( cmd == CMD_NONE ) post releaseSpi(); } /*----------------- RadioPacket -----------------*/ async command uint8_t RadioPacket.headerLength(message_t* msg) { return call Config.headerLength(msg) + sizeof(rf230_header_t); } async command uint8_t RadioPacket.payloadLength(message_t* msg) { return getHeader(msg)->length - 2; } async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length) { RADIO_ASSERT( 1 <= length && length <= 125 ); RADIO_ASSERT( call RadioPacket.headerLength(msg) + length + call RadioPacket.metadataLength(msg) <= sizeof(message_t) ); // we add the length of the CRC, which is automatically generated getHeader(msg)->length = length + 2; } async command uint8_t RadioPacket.maxPayloadLength() { RADIO_ASSERT( call Config.maxPayloadLength() - sizeof(rf230_header_t) <= 125 ); return call Config.maxPayloadLength() - sizeof(rf230_header_t); } async command uint8_t RadioPacket.metadataLength(message_t* msg) { return call Config.metadataLength(msg) + sizeof(rf230_metadata_t); } async command void RadioPacket.clear(message_t* msg) { // all flags are automatically cleared } /*----------------- PacketTransmitPower -----------------*/ async command bool PacketTransmitPower.isSet(message_t* msg) { return call TransmitPowerFlag.get(msg); } async command uint8_t PacketTransmitPower.get(message_t* msg) { return getMeta(msg)->power; } async command void PacketTransmitPower.clear(message_t* msg) { call TransmitPowerFlag.clear(msg); } async command void PacketTransmitPower.set(message_t* msg, uint8_t value) { call TransmitPowerFlag.set(msg); getMeta(msg)->power = value; } /*----------------- PacketRSSI -----------------*/ async command bool PacketRSSI.isSet(message_t* msg) { return call RSSIFlag.get(msg); } async command uint8_t PacketRSSI.get(message_t* msg) { return getMeta(msg)->rssi; } async command void PacketRSSI.clear(message_t* msg) { call RSSIFlag.clear(msg); } async command void PacketRSSI.set(message_t* msg, uint8_t value) { // just to be safe if the user fails to clear the packet call TransmitPowerFlag.clear(msg); call RSSIFlag.set(msg); getMeta(msg)->rssi = value; } /*----------------- PacketTimeSyncOffset -----------------*/ async command bool PacketTimeSyncOffset.isSet(message_t* msg) { return call TimeSyncFlag.get(msg); } async command uint8_t PacketTimeSyncOffset.get(message_t* msg) { return call RadioPacket.headerLength(msg) + call RadioPacket.payloadLength(msg) - sizeof(timesync_absolute_t); } async command void PacketTimeSyncOffset.clear(message_t* msg) { call TimeSyncFlag.clear(msg); } async command void PacketTimeSyncOffset.set(message_t* msg, uint8_t value) { // we do not store the value, the time sync field is always the last 4 bytes RADIO_ASSERT( call PacketTimeSyncOffset.get(msg) == value ); call TimeSyncFlag.set(msg); } /*----------------- PacketLinkQuality -----------------*/ async command bool PacketLinkQuality.isSet(message_t* msg) { return TRUE; } async command uint8_t PacketLinkQuality.get(message_t* msg) { return getMeta(msg)->lqi; } async command void PacketLinkQuality.clear(message_t* msg) { } async command void PacketLinkQuality.set(message_t* msg, uint8_t value) { getMeta(msg)->lqi = value; } /*----------------- LinkPacketMetadata -----------------*/ async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) { return call PacketLinkQuality.get(msg) > 200; } } tinyos-2.1.2+dfsg/tos/chips/rf230/RF230Ieee154MessageC.nc000066400000000000000000000061661207233610700222510ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #ifdef TFRAMES_ENABLED #error "You cannot use Ieee154MessageC with TFRAMES_ENABLED defined" #endif configuration RF230Ieee154MessageC { provides { interface SplitControl; interface Ieee154Send; interface Receive as Ieee154Receive; interface SendNotifier; interface Ieee154Packet; interface Packet; interface Resource as SendResource[uint8_t clint]; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketField as PacketLinkQuality; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface LocalTime as LocalTimeRadio; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components RF230RadioC; SplitControl = RF230RadioC; Ieee154Send = RF230RadioC.Ieee154Send; Ieee154Receive = RF230RadioC.Ieee154Receive; SendNotifier = RF230RadioC.Ieee154Notifier; Packet = RF230RadioC.PacketForIeee154Message; Ieee154Packet = RF230RadioC; SendResource = RF230RadioC; PacketAcknowledgements = RF230RadioC; LowPowerListening = RF230RadioC; PacketLink = RF230RadioC; RadioChannel = RF230RadioC; PacketLinkQuality = RF230RadioC.PacketLinkQuality; PacketTransmitPower = RF230RadioC.PacketTransmitPower; PacketRSSI = RF230RadioC.PacketRSSI; LocalTimeRadio = RF230RadioC; PacketTimeStampMilli = RF230RadioC; PacketTimeStampRadio = RF230RadioC; } tinyos-2.1.2+dfsg/tos/chips/rf230/RF230Radio.h000066400000000000000000000051041207233610700204140ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __RF230RADIO_H__ #define __RF230RADIO_H__ #include #include #include #include #include #include #include #include #include typedef nx_struct rf230packet_header_t { rf230_header_t rf230; ieee154_simple_header_t ieee154; #ifndef TFRAMES_ENABLED network_header_t network; #endif #ifndef IEEE154FRAMES_ENABLED activemessage_header_t am; #endif } rf230packet_header_t; typedef nx_struct rf230packet_footer_t { // the time stamp is not recorded here, time stamped messaged cannot have max length } rf230packet_footer_t; typedef struct rf230packet_metadata_t { #ifdef LOW_POWER_LISTENING lpl_metadata_t lpl; #endif #ifdef PACKET_LINK link_metadata_t link; #endif timestamp_metadata_t timestamp; flags_metadata_t flags; rf230_metadata_t rf230; } rf230packet_metadata_t; #endif//__RF230RADIO_H__ tinyos-2.1.2+dfsg/tos/chips/rf230/RF230RadioC.nc000066400000000000000000000243541207233610700207000ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include configuration RF230RadioC { provides { interface SplitControl; #ifndef IEEE154FRAMES_ENABLED interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface SendNotifier[am_id_t id]; // for TOSThreads interface Receive as ReceiveDefault[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface AMPacket; interface Packet as PacketForActiveMessage; #endif #ifndef TFRAMES_ENABLED interface Ieee154Send; interface Receive as Ieee154Receive; interface SendNotifier as Ieee154Notifier; interface Resource as SendResource[uint8_t clint]; interface Ieee154Packet; interface Packet as PacketForIeee154Message; #endif interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; #ifdef TRAFFIC_MONITOR interface TrafficMonitor; #endif interface RadioChannel; interface PacketField as PacketLinkQuality; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface LinkPacketMetadata; interface LocalTime as LocalTimeRadio; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { #define UQ_METADATA_FLAGS "UQ_RF230_METADATA_FLAGS" #define UQ_RADIO_ALARM "UQ_RF230_RADIO_ALARM" // -------- RadioP components RF230RadioP as RadioP; #ifdef RADIO_DEBUG components AssertC; #endif RadioP.Ieee154PacketLayer -> Ieee154PacketLayerC; RadioP.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; RadioP.PacketTimeStamp -> TimeStampingLayerC; RadioP.RF230Packet -> RadioDriverLayerC; // -------- RadioAlarm components new RadioAlarmC(); RadioAlarmC.Alarm -> RadioDriverLayerC; // -------- Active Message #ifndef IEEE154FRAMES_ENABLED components new ActiveMessageLayerC(); ActiveMessageLayerC.Config -> RadioP; ActiveMessageLayerC.SubSend -> AutoResourceAcquireLayerC; ActiveMessageLayerC.SubReceive -> TinyosNetworkLayerC.TinyosReceive; ActiveMessageLayerC.SubPacket -> TinyosNetworkLayerC.TinyosPacket; AMSend = ActiveMessageLayerC; Receive = ActiveMessageLayerC.Receive; Snoop = ActiveMessageLayerC.Snoop; SendNotifier = ActiveMessageLayerC; AMPacket = ActiveMessageLayerC; PacketForActiveMessage = ActiveMessageLayerC; ReceiveDefault = ActiveMessageLayerC.ReceiveDefault; SnoopDefault = ActiveMessageLayerC.SnoopDefault; #endif // -------- Automatic RadioSend Resource #ifndef IEEE154FRAMES_ENABLED #ifndef TFRAMES_ENABLED components new AutoResourceAcquireLayerC(); AutoResourceAcquireLayerC.Resource -> SendResourceC.Resource[unique(RADIO_SEND_RESOURCE)]; #else components new DummyLayerC() as AutoResourceAcquireLayerC; #endif AutoResourceAcquireLayerC -> TinyosNetworkLayerC.TinyosSend; #endif // -------- RadioSend Resource #ifndef TFRAMES_ENABLED components new SimpleFcfsArbiterC(RADIO_SEND_RESOURCE) as SendResourceC; SendResource = SendResourceC; // -------- Ieee154 Message components new Ieee154MessageLayerC(); Ieee154MessageLayerC.Ieee154PacketLayer -> Ieee154PacketLayerC; Ieee154MessageLayerC.SubSend -> TinyosNetworkLayerC.Ieee154Send; Ieee154MessageLayerC.SubReceive -> TinyosNetworkLayerC.Ieee154Receive; Ieee154MessageLayerC.RadioPacket -> TinyosNetworkLayerC.Ieee154Packet; Ieee154Send = Ieee154MessageLayerC; Ieee154Receive = Ieee154MessageLayerC; Ieee154Notifier = Ieee154MessageLayerC; Ieee154Packet = Ieee154PacketLayerC; PacketForIeee154Message = Ieee154MessageLayerC; #endif // -------- Tinyos Network components new TinyosNetworkLayerC(); TinyosNetworkLayerC.SubSend -> UniqueLayerC; TinyosNetworkLayerC.SubReceive -> PacketLinkLayerC; TinyosNetworkLayerC.SubPacket -> Ieee154PacketLayerC; // -------- IEEE 802.15.4 Packet components new Ieee154PacketLayerC(); Ieee154PacketLayerC.SubPacket -> PacketLinkLayerC; // -------- UniqueLayer Send part (wired twice) components new UniqueLayerC(); UniqueLayerC.Config -> RadioP; UniqueLayerC.SubSend -> PacketLinkLayerC; // -------- Packet Link components new PacketLinkLayerC(); PacketLink = PacketLinkLayerC; #ifdef RF230_HARDWARE_ACK PacketLinkLayerC.PacketAcknowledgements -> RadioDriverLayerC; #else PacketLinkLayerC.PacketAcknowledgements -> SoftwareAckLayerC; #endif PacketLinkLayerC -> LowPowerListeningLayerC.Send; PacketLinkLayerC -> LowPowerListeningLayerC.Receive; PacketLinkLayerC -> LowPowerListeningLayerC.RadioPacket; // -------- Low Power Listening #ifdef LOW_POWER_LISTENING #warning "*** USING LOW POWER LISTENING LAYER" components new LowPowerListeningLayerC(); LowPowerListeningLayerC.Config -> RadioP; #ifdef RF230_HARDWARE_ACK LowPowerListeningLayerC.PacketAcknowledgements -> RadioDriverLayerC; #else LowPowerListeningLayerC.PacketAcknowledgements -> SoftwareAckLayerC; #endif #else components new LowPowerListeningDummyC() as LowPowerListeningLayerC; #endif LowPowerListeningLayerC.SubControl -> MessageBufferLayerC; LowPowerListeningLayerC.SubSend -> MessageBufferLayerC; LowPowerListeningLayerC.SubReceive -> MessageBufferLayerC; LowPowerListeningLayerC.SubPacket -> TimeStampingLayerC; SplitControl = LowPowerListeningLayerC; LowPowerListening = LowPowerListeningLayerC; // -------- MessageBuffer components new MessageBufferLayerC(); MessageBufferLayerC.RadioSend -> CollisionAvoidanceLayerC; MessageBufferLayerC.RadioReceive -> UniqueLayerC; MessageBufferLayerC.RadioState -> TrafficMonitorLayerC; RadioChannel = MessageBufferLayerC; // -------- UniqueLayer receive part (wired twice) UniqueLayerC.SubReceive -> CollisionAvoidanceLayerC; // -------- CollisionAvoidance #ifdef SLOTTED_MAC components new SlottedCollisionLayerC() as CollisionAvoidanceLayerC; #else components new RandomCollisionLayerC() as CollisionAvoidanceLayerC; #endif CollisionAvoidanceLayerC.Config -> RadioP; CollisionAvoidanceLayerC.SubSend -> SoftwareAckLayerC; CollisionAvoidanceLayerC.SubReceive -> SoftwareAckLayerC; CollisionAvoidanceLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; // -------- SoftwareAcknowledgement #ifndef RF230_HARDWARE_ACK components new SoftwareAckLayerC(); SoftwareAckLayerC.AckReceivedFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; SoftwareAckLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; PacketAcknowledgements = SoftwareAckLayerC; #else components new DummyLayerC() as SoftwareAckLayerC; #endif SoftwareAckLayerC.Config -> RadioP; SoftwareAckLayerC.SubSend -> CsmaLayerC; SoftwareAckLayerC.SubReceive -> CsmaLayerC; // -------- Carrier Sense components new DummyLayerC() as CsmaLayerC; CsmaLayerC.Config -> RadioP; CsmaLayerC -> TrafficMonitorLayerC.RadioSend; CsmaLayerC -> TrafficMonitorLayerC.RadioReceive; CsmaLayerC -> RadioDriverLayerC.RadioCCA; // -------- TimeStamping components new TimeStampingLayerC(); TimeStampingLayerC.LocalTimeRadio -> RadioDriverLayerC; TimeStampingLayerC.SubPacket -> MetadataFlagsLayerC; PacketTimeStampRadio = TimeStampingLayerC; PacketTimeStampMilli = TimeStampingLayerC; TimeStampingLayerC.TimeStampFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; // -------- MetadataFlags components new MetadataFlagsLayerC(); MetadataFlagsLayerC.SubPacket -> RadioDriverLayerC; // -------- Traffic Monitor #ifdef TRAFFIC_MONITOR components new TrafficMonitorLayerC(); TrafficMonitor = TrafficMonitorLayerC; #else components new DummyLayerC() as TrafficMonitorLayerC; #endif TrafficMonitorLayerC.Config -> RadioP; TrafficMonitorLayerC -> RadioDriverLayerC.RadioSend; TrafficMonitorLayerC -> RadioDriverLayerC.RadioReceive; TrafficMonitorLayerC -> RadioDriverLayerC.RadioState; // -------- Driver #ifdef RF230_HARDWARE_ACK components RF230DriverHwAckC as RadioDriverLayerC; PacketAcknowledgements = RadioDriverLayerC; RadioDriverLayerC.Ieee154PacketLayer -> Ieee154PacketLayerC; RadioDriverLayerC.AckReceivedFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; #else components RF230DriverLayerC as RadioDriverLayerC; #endif RadioDriverLayerC.Config -> RadioP; RadioDriverLayerC.PacketTimeStamp -> TimeStampingLayerC; PacketTransmitPower = RadioDriverLayerC.PacketTransmitPower; PacketLinkQuality = RadioDriverLayerC.PacketLinkQuality; PacketRSSI = RadioDriverLayerC.PacketRSSI; LinkPacketMetadata = RadioDriverLayerC; LocalTimeRadio = RadioDriverLayerC; RadioDriverLayerC.TransmitPowerFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.RSSIFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.TimeSyncFlag -> MetadataFlagsLayerC.PacketFlag[unique(UQ_METADATA_FLAGS)]; RadioDriverLayerC.RadioAlarm -> RadioAlarmC.RadioAlarm[unique(UQ_RADIO_ALARM)]; } tinyos-2.1.2+dfsg/tos/chips/rf230/RF230RadioP.nc000066400000000000000000000226321207233610700207120ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include #include module RF230RadioP { provides { interface RF230DriverConfig; interface SoftwareAckConfig; interface UniqueConfig; interface CsmaConfig; interface TrafficMonitorConfig; interface RandomCollisionConfig; interface SlottedCollisionConfig; interface ActiveMessageConfig; interface DummyConfig; #ifdef LOW_POWER_LISTENING interface LowPowerListeningConfig; #endif } uses { interface Ieee154PacketLayer; interface RadioAlarm; interface RadioPacket as RF230Packet; interface PacketTimeStamp; } } implementation { /*----------------- RF230DriverConfig -----------------*/ async command uint8_t RF230DriverConfig.headerLength(message_t* msg) { return offsetof(message_t, data) - sizeof(rf230packet_header_t); } async command uint8_t RF230DriverConfig.maxPayloadLength() { return sizeof(rf230packet_header_t) + TOSH_DATA_LENGTH; } async command uint8_t RF230DriverConfig.metadataLength(message_t* msg) { return 0; } async command uint8_t RF230DriverConfig.headerPreloadLength() { // we need the fcf, dsn, destpan and dest return 7; } async command bool RF230DriverConfig.requiresRssiCca(message_t* msg) { return call Ieee154PacketLayer.isDataFrame(msg); } /*----------------- SoftwareAckConfig -----------------*/ async command bool SoftwareAckConfig.requiresAckWait(message_t* msg) { return call Ieee154PacketLayer.requiresAckWait(msg); } async command bool SoftwareAckConfig.isAckPacket(message_t* msg) { return call Ieee154PacketLayer.isAckFrame(msg); } async command bool SoftwareAckConfig.verifyAckPacket(message_t* data, message_t* ack) { return call Ieee154PacketLayer.verifyAckReply(data, ack); } async command void SoftwareAckConfig.setAckRequired(message_t* msg, bool ack) { call Ieee154PacketLayer.setAckRequired(msg, ack); } async command bool SoftwareAckConfig.requiresAckReply(message_t* msg) { return call Ieee154PacketLayer.requiresAckReply(msg); } async command void SoftwareAckConfig.createAckPacket(message_t* data, message_t* ack) { call Ieee154PacketLayer.createAckReply(data, ack); } #ifndef SOFTWAREACK_TIMEOUT #define SOFTWAREACK_TIMEOUT 1000 #endif async command uint16_t SoftwareAckConfig.getAckTimeout() { return (uint16_t)(SOFTWAREACK_TIMEOUT * RADIO_ALARM_MICROSEC); } tasklet_async command void SoftwareAckConfig.reportChannelError() { #ifdef TRAFFIC_MONITOR // signal TrafficMonitorConfig.channelError(); #endif } /*----------------- UniqueConfig -----------------*/ async command uint8_t UniqueConfig.getSequenceNumber(message_t* msg) { return call Ieee154PacketLayer.getDSN(msg); } async command void UniqueConfig.setSequenceNumber(message_t* msg, uint8_t dsn) { call Ieee154PacketLayer.setDSN(msg, dsn); } async command am_addr_t UniqueConfig.getSender(message_t* msg) { return call Ieee154PacketLayer.getSrcAddr(msg); } tasklet_async command void UniqueConfig.reportChannelError() { #ifdef TRAFFIC_MONITOR // signal TrafficMonitorConfig.channelError(); #endif } /*----------------- ActiveMessageConfig -----------------*/ command am_addr_t ActiveMessageConfig.destination(message_t* msg) { return call Ieee154PacketLayer.getDestAddr(msg); } command void ActiveMessageConfig.setDestination(message_t* msg, am_addr_t addr) { call Ieee154PacketLayer.setDestAddr(msg, addr); } command am_addr_t ActiveMessageConfig.source(message_t* msg) { return call Ieee154PacketLayer.getSrcAddr(msg); } command void ActiveMessageConfig.setSource(message_t* msg, am_addr_t addr) { call Ieee154PacketLayer.setSrcAddr(msg, addr); } command am_group_t ActiveMessageConfig.group(message_t* msg) { return call Ieee154PacketLayer.getDestPan(msg); } command void ActiveMessageConfig.setGroup(message_t* msg, am_group_t grp) { call Ieee154PacketLayer.setDestPan(msg, grp); } command error_t ActiveMessageConfig.checkFrame(message_t* msg) { if( ! call Ieee154PacketLayer.isDataFrame(msg) ) call Ieee154PacketLayer.createDataFrame(msg); return SUCCESS; } /*----------------- CsmaConfig -----------------*/ async command bool CsmaConfig.requiresSoftwareCCA(message_t* msg) { return call Ieee154PacketLayer.isDataFrame(msg); } /*----------------- TrafficMonitorConfig -----------------*/ async command uint16_t TrafficMonitorConfig.getBytes(message_t* msg) { // pure airtime: preable (4 bytes), SFD (1 byte), length (1 byte), payload + CRC (len bytes) return call RF230Packet.payloadLength(msg) + 6; } /*----------------- RandomCollisionConfig -----------------*/ /* * We try to use the same values as in CC2420 * * CC2420_MIN_BACKOFF = 10 jiffies = 320 microsec * CC2420_BACKOFF_PERIOD = 10 jiffies * initial backoff = 0x1F * CC2420_BACKOFF_PERIOD = 310 jiffies = 9920 microsec * congestion backoff = 0x7 * CC2420_BACKOFF_PERIOD = 70 jiffies = 2240 microsec */ #ifndef LOW_POWER_LISTENING #ifndef RF230_BACKOFF_MIN #define RF230_BACKOFF_MIN 320 #endif async command uint16_t RandomCollisionConfig.getMinimumBackoff() { return (uint16_t)(RF230_BACKOFF_MIN * RADIO_ALARM_MICROSEC); } #ifndef RF230_BACKOFF_INIT #define RF230_BACKOFF_INIT 4960 // instead of 9920 #endif async command uint16_t RandomCollisionConfig.getInitialBackoff(message_t* msg) { return (uint16_t)(RF230_BACKOFF_INIT * RADIO_ALARM_MICROSEC); } #ifndef RF230_BACKOFF_CONG #define RF230_BACKOFF_CONG 2240 #endif async command uint16_t RandomCollisionConfig.getCongestionBackoff(message_t* msg) { return (uint16_t)(RF230_BACKOFF_CONG * RADIO_ALARM_MICROSEC); } #endif async command uint16_t RandomCollisionConfig.getTransmitBarrier(message_t* msg) { uint16_t time; // TODO: maybe we should use the embedded timestamp of the message time = call RadioAlarm.getNow(); // estimated response time (download the message, etc) is 5-8 bytes if( call Ieee154PacketLayer.requiresAckReply(msg) ) time += (uint16_t)(32 * (-5 + 16 + 11 + 5) * RADIO_ALARM_MICROSEC); else time += (uint16_t)(32 * (-5 + 5) * RADIO_ALARM_MICROSEC); return time; } tasklet_async event void RadioAlarm.fired() { } /*----------------- SlottedCollisionConfig -----------------*/ async command uint16_t SlottedCollisionConfig.getInitialDelay() { return 300; } async command uint8_t SlottedCollisionConfig.getScheduleExponent() { return 1 + RADIO_ALARM_MILLI_EXP; } async command uint16_t SlottedCollisionConfig.getTransmitTime(message_t* msg) { // TODO: check if the timestamp is correct return call PacketTimeStamp.timestamp(msg); } async command uint16_t SlottedCollisionConfig.getCollisionWindowStart(message_t* msg) { // the preamble (4 bytes), SFD (1 byte), plus two extra for safety return (call PacketTimeStamp.timestamp(msg)) - (uint16_t)(7 * 32 * RADIO_ALARM_MICROSEC); } async command uint16_t SlottedCollisionConfig.getCollisionWindowLength(message_t* msg) { return (uint16_t)(2 * 7 * 32 * RADIO_ALARM_MICROSEC); } /*----------------- Dummy -----------------*/ async command void DummyConfig.nothing() { } /*----------------- LowPowerListening -----------------*/ #ifdef LOW_POWER_LISTENING command bool LowPowerListeningConfig.needsAutoAckRequest(message_t* msg) { return call Ieee154PacketLayer.getDestAddr(msg) != TOS_BCAST_ADDR; } command bool LowPowerListeningConfig.ackRequested(message_t* msg) { return call Ieee154PacketLayer.getAckRequired(msg); } command uint16_t LowPowerListeningConfig.getListenLength() { return 5; } async command uint16_t RandomCollisionConfig.getMinimumBackoff() { return (uint16_t)(320 * RADIO_ALARM_MICROSEC); } async command uint16_t RandomCollisionConfig.getInitialBackoff(message_t* msg) { return (uint16_t)(1600 * RADIO_ALARM_MICROSEC); } async command uint16_t RandomCollisionConfig.getCongestionBackoff(message_t* msg) { return (uint16_t)(3200 * RADIO_ALARM_MICROSEC); } #endif } tinyos-2.1.2+dfsg/tos/chips/rf230/RF230TimeSyncMessageC.nc000066400000000000000000000064741207233610700227050ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include configuration RF230TimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStampRadio; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components RF230ActiveMessageC as ActiveMessageC, new TimeSyncMessageLayerC(); SplitControl = ActiveMessageC; AMPacket = TimeSyncMessageLayerC; Receive = TimeSyncMessageLayerC.Receive; Snoop = TimeSyncMessageLayerC.Snoop; Packet = TimeSyncMessageLayerC; PacketAcknowledgements = ActiveMessageC; LowPowerListening = ActiveMessageC; PacketTimeStampRadio = ActiveMessageC; TimeSyncAMSendRadio = TimeSyncMessageLayerC; TimeSyncPacketRadio = TimeSyncMessageLayerC; PacketTimeStampMilli = ActiveMessageC; TimeSyncAMSendMilli = TimeSyncMessageLayerC; TimeSyncPacketMilli = TimeSyncMessageLayerC; TimeSyncMessageLayerC.PacketTimeStampRadio -> ActiveMessageC; TimeSyncMessageLayerC.PacketTimeStampMilli -> ActiveMessageC; #ifdef RF230_HARDWARE_ACK components RF230DriverHwAckC as DriverLayerC; #else components RF230DriverLayerC as DriverLayerC; #endif TimeSyncMessageLayerC.LocalTimeRadio -> DriverLayerC; TimeSyncMessageLayerC.PacketTimeSyncOffset -> DriverLayerC.PacketTimeSyncOffset; } tinyos-2.1.2+dfsg/tos/chips/sht11/000077500000000000000000000000001207233610700166345ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/sht11/HalSht11Advanced.nc000066400000000000000000000036421207233610700221360ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ interface HalSht11Advanced { command error_t getVoltageStatus(); event void getVoltageStatusDone(error_t error, bool isLow); command error_t setHeater(bool isOn); event void setHeaterDone(error_t error); command error_t setResolution(bool resolution); event void setResolutionDone(error_t error); } tinyos-2.1.2+dfsg/tos/chips/sht11/HalSht11ControlP.nc000066400000000000000000000104561207233610700221720ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * * @author Kaisen Lin * @author Phil Buonadonna */ #include "SensirionSht11.h" module HalSht11ControlP { provides interface HalSht11Advanced; uses interface SensirionSht11; uses interface Resource; } implementation { enum { S_IDLE, S_GETVOLT, S_SETHEAT, S_SETRES, }; uint8_t state = S_IDLE; uint8_t statusRegisterShadow = 0x0; error_t clientResult; error_t clientVal; task void signal_Task() { switch(state) { case S_GETVOLT: state = S_IDLE; call Resource.release(); signal HalSht11Advanced.getVoltageStatusDone(clientResult, clientVal & SHT11_STATUS_LOW_BATTERY_BIT); break; case S_SETHEAT: state = S_IDLE; call Resource.release(); signal HalSht11Advanced.setHeaterDone(clientResult); break; case S_SETRES: state = S_IDLE; call Resource.release(); signal HalSht11Advanced.setResolutionDone(clientResult); break; default: break; } } command error_t HalSht11Advanced.getVoltageStatus() { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_GETVOLT; call SensirionSht11.readStatusReg(); return SUCCESS; } command error_t HalSht11Advanced.setHeater(bool isOn) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_SETHEAT; if(isOn) statusRegisterShadow |= SHT11_STATUS_HEATER_ON_BIT; else statusRegisterShadow &= ~SHT11_STATUS_HEATER_ON_BIT; call SensirionSht11.writeStatusReg(statusRegisterShadow); return SUCCESS; } command error_t HalSht11Advanced.setResolution(bool resolution) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_SETRES; if(resolution) statusRegisterShadow |= SHT11_STATUS_LOW_RES_BIT; else statusRegisterShadow &= ~SHT11_STATUS_LOW_RES_BIT; call SensirionSht11.writeStatusReg(statusRegisterShadow); return SUCCESS; } event void SensirionSht11.readStatusRegDone( error_t result, uint8_t val ) { clientResult = result; clientVal = val; post signal_Task(); } event void SensirionSht11.writeStatusRegDone( error_t result ) { clientResult = result; post signal_Task(); } event void Resource.granted() { /* intentionally left blank */ } event void SensirionSht11.resetDone( error_t result ) {} event void SensirionSht11.measureTemperatureDone( error_t result, uint16_t val ) {} event void SensirionSht11.measureHumidityDone( error_t result, uint16_t val ) {} } tinyos-2.1.2+dfsg/tos/chips/sht11/SensirionSht11.h000066400000000000000000000036411207233610700216030ustar00rootroot00000000000000#ifndef SENSIRIONSHT11_H #define SENSIRIONSHT11_H /* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * * @author Gilman Tolle */ enum { SHT11_TEMPERATURE_BITS = 14, SHT11_HUMIDITY_BITS = 12, }; enum { SHT11_STATUS_LOW_RES_BIT = 1 << 0, SHT11_STATUS_NO_RELOAD_BIT = 1 << 1, SHT11_STATUS_HEATER_ON_BIT = 1 << 2, SHT11_STATUS_LOW_BATTERY_BIT = 1 << 6, } sht_bits_t; #endif tinyos-2.1.2+dfsg/tos/chips/sht11/SensirionSht11.nc000066400000000000000000000072571207233610700217630ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * SensirionSht11 is the rich interface to the Sensirion SHT11 * temperature/humidity sensor. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:12 $ */ interface SensirionSht11 { /** * Resets the sensor. * * @return SUCCESS if the sensor will be reset */ command error_t reset(); /** * Signals that the sensor has been reset. * * @param result SUCCESS if the reset succeeded */ event void resetDone( error_t result ); /** * Starts a temperature measurement. * * @return SUCCESS if the measurement will be made */ command error_t measureTemperature(); /** * Presents the result of a temperature measurement. * * @param result SUCCESS if the measurement was successful * @param val the temperature reading */ event void measureTemperatureDone( error_t result, uint16_t val ); /** * Starts a humidity measurement. * * @return SUCCESS if the measurement will be made */ command error_t measureHumidity(); /** * Presents the result of a humidity measurement. * * @param result SUCCESS if the measurement was successful * @param val the humidity reading */ event void measureHumidityDone( error_t result, uint16_t val ); /** * Reads the current contents of the SHT11 status and control * register. See the datasheet for interpretation of this register. * * @return SUCCESS if the read will be performed */ command error_t readStatusReg(); /** * Presents the value of the status register. * * @param result SUCCESS if the read succeeded * @param val the value of the register */ event void readStatusRegDone( error_t result, uint8_t val ); /** * Writes a new value to the SHT11 status and control register. * * @param val the new value to be written * * @return SUCCESS if the write will be performed */ command error_t writeStatusReg( uint8_t val ); /** * Signals the completion of the status register write. * * @param result SUCCESS if the write was successful */ event void writeStatusRegDone( error_t result ); } tinyos-2.1.2+dfsg/tos/chips/sht11/SensirionSht11LogicP.nc000066400000000000000000000250051207233610700230500ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "Timer.h" #include "SensirionSht11.h" /** * SensirionSht11LogicP contains the actual driver logic needed to * read from the Sensirion SHT11 temperature/humidity sensor. It * depends on 2 underlying GeneralIO interfaces, one for the data pin * and one for the clock pin, and one underlying GpioInterrupt. It * provides the HAL-level SensirionSht11 interface. It's generic, so * you can instantiate it multiple times if you have more than one * Sensirion SHT11 attached to a node. * *

      * This code assumes that the MCU clock is less than 10 MHz. If you * ever run this on a faster MCU, you'll need to insert a lot of * waits to keep the Sensirion happy. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:12 $ */ generic module SensirionSht11LogicP() { provides interface SensirionSht11[ uint8_t client ]; uses interface GeneralIO as DATA; uses interface GeneralIO as CLOCK; uses interface GpioInterrupt as InterruptDATA; uses interface Timer; uses interface Leds; } implementation { typedef enum { CMD_MEASURE_TEMPERATURE = 0x3, CMD_MEASURE_HUMIDITY = 0x5, CMD_READ_STATUS = 0x7, CMD_WRITE_STATUS = 0x6, CMD_SOFT_RESET = 0x1E, } sht_cmd_t; enum { TIMEOUT_RESET = 11, TIMEOUT_14BIT = 330, TIMEOUT_12BIT = 250, //70, TIMEOUT_8BIT = 250, //15, } sht_timeout_t; bool on = TRUE; bool busy = FALSE; uint8_t status = 0; sht_cmd_t cmd; uint8_t newStatus; bool writeFail = FALSE; uint8_t currentClient; error_t performCommand(); void initPins(); void resetDevice(); void transmissionStart(); void sendCommand(uint8_t _cmd); void writeByte(uint8_t byte); error_t waitForResponse(); void enableInterrupt(); uint8_t readByte(); void ack(); void endTransmission(); task void readSensor(); task void signalStatusDone(); command error_t SensirionSht11.reset[ uint8_t client ]() { if ( !on ) { return EOFF; } if ( busy ) { return EBUSY; } else { busy = TRUE; } cmd = CMD_SOFT_RESET; currentClient = client; return performCommand(); } command error_t SensirionSht11.measureTemperature[ uint8_t client ]() { if ( !on ) { return EOFF; } if ( busy ) { return EBUSY; } else { busy = TRUE; } cmd = CMD_MEASURE_TEMPERATURE; currentClient = client; return performCommand(); } command error_t SensirionSht11.measureHumidity[ uint8_t client ]() { if ( !on ) { return EOFF; } if ( busy ) { return EBUSY; } else { busy = TRUE; } cmd = CMD_MEASURE_HUMIDITY; currentClient = client; return performCommand(); } /* FIXME: these don't seem to work */ command error_t SensirionSht11.readStatusReg[ uint8_t client ]() { if ( !on ) { return EOFF; } if ( busy ) { return EBUSY; } else { busy = TRUE; } cmd = CMD_READ_STATUS; currentClient = client; return performCommand(); } /* FIXME: these don't seem to work */ command error_t SensirionSht11.writeStatusReg[ uint8_t client ]( uint8_t val ) { if ( !on ) { return EOFF; } if ( busy ) { return EBUSY; } else { busy = TRUE; } cmd = CMD_WRITE_STATUS; newStatus = val; currentClient = client; return performCommand(); } // performCommand() returns both error_t and status reg -- fortunately, error_t is 8bit error_t performCommand() { initPins(); resetDevice(); transmissionStart(); cmd &= 0x1F; // clear the first 3 address bits to 000 sendCommand(cmd); if ( waitForResponse() != SUCCESS ) { busy = FALSE; return FAIL; } switch(cmd) { case CMD_SOFT_RESET: call Timer.startOneShot( TIMEOUT_RESET ); break; case CMD_MEASURE_TEMPERATURE: enableInterrupt(); if ( status & SHT11_STATUS_LOW_RES_BIT ) { call Timer.startOneShot( TIMEOUT_12BIT ); } else { call Timer.startOneShot( TIMEOUT_14BIT ); } break; case CMD_MEASURE_HUMIDITY: enableInterrupt(); if ( status & SHT11_STATUS_LOW_RES_BIT ) { call Timer.startOneShot( TIMEOUT_8BIT ); } else { call Timer.startOneShot( TIMEOUT_12BIT ); } break; case CMD_READ_STATUS: { uint8_t tempStatus; uint8_t crc; tempStatus = readByte(); crc = readByte(); endTransmission(); status = tempStatus; // FIXME: need to check CRC! post signalStatusDone(); } case CMD_WRITE_STATUS: writeByte( newStatus ); if ( waitForResponse() != SUCCESS ) { writeFail = TRUE; } else { status = newStatus; } post signalStatusDone(); } // leave the device busy...we're waiting for an interrupt return SUCCESS; } void initPins() { call CLOCK.makeOutput(); call CLOCK.clr(); call DATA.makeInput(); call DATA.set(); call InterruptDATA.disable(); } void resetDevice() { uint8_t i; call DATA.makeOutput(); call DATA.set(); call CLOCK.clr(); for( i = 0; i < 9; i++ ) { call CLOCK.set(); call CLOCK.clr(); } } void transmissionStart() { call DATA.makeOutput(); call DATA.set(); call CLOCK.clr(); call CLOCK.set(); call DATA.clr(); call CLOCK.clr(); call CLOCK.set(); call DATA.set(); call CLOCK.clr(); } void sendCommand(uint8_t _cmd) { writeByte(_cmd); } void writeByte(uint8_t byte) { uint8_t i; for( i = 0; i < 8; i++ ) { if ( byte & 0x80 ) call DATA.set(); else call DATA.clr(); byte = byte << 1; call CLOCK.set(); call CLOCK.clr(); } } error_t waitForResponse() { call DATA.makeInput(); call DATA.set(); call CLOCK.set(); if (call DATA.get()) { // the device didn't pull the DATA line low // the command wasn't received or acknowledged return FAIL; } call CLOCK.clr(); return SUCCESS; } void enableInterrupt() { call DATA.makeInput(); call DATA.set(); call InterruptDATA.enableFallingEdge(); } event void Timer.fired() { switch(cmd) { case CMD_SOFT_RESET: // driver has waited long enough for device to reset busy = FALSE; signal SensirionSht11.resetDone[currentClient]( SUCCESS ); break; case CMD_MEASURE_TEMPERATURE: // timeout expired with no data interrupt busy = FALSE; signal SensirionSht11.measureTemperatureDone[currentClient]( FAIL, 0 ); break; case CMD_MEASURE_HUMIDITY: // timeout expired with no data interrupt busy = FALSE; signal SensirionSht11.measureHumidityDone[currentClient]( FAIL, 0 ); break; default: // we're in an unexpected state. what to do? break; } } async event void InterruptDATA.fired() { call InterruptDATA.disable(); post readSensor(); } task void readSensor() { uint16_t data = 0; uint8_t crc = 0; if ( busy == FALSE ) { // the interrupt was received after the timeout. // we've already signaled FAIL to the client, so just give up. return; } call Timer.stop(); data = readByte() << 8; data |= readByte(); crc = readByte(); endTransmission(); switch( cmd ) { case CMD_MEASURE_TEMPERATURE: busy = FALSE; signal SensirionSht11.measureTemperatureDone[currentClient]( SUCCESS, data ); break; case CMD_MEASURE_HUMIDITY: busy = FALSE; signal SensirionSht11.measureHumidityDone[currentClient]( SUCCESS, data ); break; default: break; // unknown command - shouldn't reach here } } uint8_t readByte() { uint8_t byte = 0; uint8_t i; for( i = 0; i < 8; i++ ) { call CLOCK.set(); if (call DATA.get()) byte |= 1; if (i != 7) byte = byte << 1; call CLOCK.clr(); } ack(); return byte; } void ack() { call DATA.makeOutput(); call DATA.clr(); call CLOCK.set(); call CLOCK.clr(); call DATA.makeInput(); call DATA.set(); } void endTransmission() { call DATA.makeOutput(); call DATA.set(); call CLOCK.set(); call CLOCK.clr(); } task void signalStatusDone() { bool _writeFail = writeFail; switch( cmd ) { case CMD_READ_STATUS: busy = FALSE; signal SensirionSht11.readStatusRegDone[currentClient]( SUCCESS, status ); break; case CMD_WRITE_STATUS: busy = FALSE; writeFail = FALSE; signal SensirionSht11.writeStatusRegDone[currentClient]( (_writeFail ? FAIL : SUCCESS) ); break; default: // shouldn't happen. break; } } default event void SensirionSht11.resetDone[uint8_t client]( error_t result ) { } default event void SensirionSht11.measureTemperatureDone[uint8_t client]( error_t result, uint16_t val ) { } default event void SensirionSht11.measureHumidityDone[uint8_t client]( error_t result, uint16_t val ) { } default event void SensirionSht11.readStatusRegDone[uint8_t client]( error_t result, uint8_t val ) { } default event void SensirionSht11.writeStatusRegDone[uint8_t client]( error_t result ) { } } tinyos-2.1.2+dfsg/tos/chips/sht11/SensirionSht11ReaderP.nc000066400000000000000000000103331207233610700232130ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * SensirionSht11ReaderP transforms the HAL-level SensirionSht11 * interface into a pair of SID Read interfaces, one for the * temperature sensor and one for the humidity sensor. It acquires the * underlying resource before executing each read, enabling * arbitrated access. * * @author Gilman Tolle * @version $Revision: 1.5 $ $Date: 2007-04-13 21:46:18 $ */ #include generic module SensirionSht11ReaderP() { provides interface DeviceMetadata as TemperatureMetadata; provides interface Read as Temperature; provides interface DeviceMetadata as HumidityMetadata; provides interface Read as Humidity; uses interface Resource as TempResource; uses interface Resource as HumResource; uses interface SensirionSht11 as Sht11Temp; uses interface SensirionSht11 as Sht11Hum; } implementation { command uint8_t TemperatureMetadata.getSignificantBits() { return SHT11_TEMPERATURE_BITS; } command error_t Temperature.read() { call TempResource.request(); return SUCCESS; } event void TempResource.granted() { error_t result; if ((result = call Sht11Temp.measureTemperature()) != SUCCESS) { call TempResource.release(); signal Temperature.readDone( result, 0 ); } } event void Sht11Temp.measureTemperatureDone( error_t result, uint16_t val ) { call TempResource.release(); signal Temperature.readDone( result, val ); } command uint8_t HumidityMetadata.getSignificantBits() { return SHT11_HUMIDITY_BITS; } command error_t Humidity.read() { call HumResource.request(); return SUCCESS; } event void HumResource.granted() { error_t result; if ((result = call Sht11Hum.measureHumidity()) != SUCCESS) { call HumResource.release(); signal Humidity.readDone( result, 0 ); } } event void Sht11Hum.measureHumidityDone( error_t result, uint16_t val ) { call HumResource.release(); signal Humidity.readDone( result, val ); } event void Sht11Temp.resetDone( error_t result ) { } event void Sht11Temp.measureHumidityDone( error_t result, uint16_t val ) { } event void Sht11Temp.readStatusRegDone( error_t result, uint8_t val ) { } event void Sht11Temp.writeStatusRegDone( error_t result ) { } event void Sht11Hum.resetDone( error_t result ) { } event void Sht11Hum.measureTemperatureDone( error_t result, uint16_t val ) { } event void Sht11Hum.readStatusRegDone( error_t result, uint8_t val ) { } event void Sht11Hum.writeStatusRegDone( error_t result ) { } default event void Temperature.readDone( error_t result, uint16_t val ) { } default event void Humidity.readDone( error_t result, uint16_t val ) { } } tinyos-2.1.2+dfsg/tos/chips/sht21/000077500000000000000000000000001207233610700166355ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/sht21/Sht21.h000066400000000000000000000036441207233610700177160ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ #ifndef SHT21_H #define SHT21_H enum { RESOLUTION_12_14BIT = 0x00, //humidity _ , temperature _ RESOLUTION_8_12BIT = 0x01, RESOLUTION_10_13BIT = 0x80, RESOLUTION_11_11BIT = 0x81, } Sht21Resolution; #define UQ_SHT21HUMI_RESOURCE "Sht21Humidity.ReadResource" #define UQ_SHT21TEMP_RESOURCE "Sht21Temperature.ReadResource" #endif tinyos-2.1.2+dfsg/tos/chips/sht21/Sht21ArbitratedC.nc000066400000000000000000000047311207233610700221720ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "Sht21.h" configuration Sht21ArbitratedC { provides interface Read as ReadTemperature[uint8_t client]; provides interface Read as ReadHumidity[uint8_t client]; } implementation { components Sht21C; components new ArbitratedReadC(uint16_t) as ArbitratedTemp, new FcfsArbiterC(UQ_SHT21TEMP_RESOURCE) as TempArbiter, new ReadClientP(uint16_t) as TempClient; ReadTemperature=ArbitratedTemp.Read; ArbitratedTemp.Resource->TempArbiter; ArbitratedTemp.Service->TempClient; TempClient.ActualRead->Sht21C.Temperature; components new ArbitratedReadC(uint16_t) as ArbitratedHumi, new FcfsArbiterC(UQ_SHT21HUMI_RESOURCE) as HumiArbiter, new ReadClientP(uint16_t) as HumiClient; ReadHumidity=ArbitratedHumi.Read; ArbitratedHumi.Resource->HumiArbiter; ArbitratedHumi.Service->HumiClient; HumiClient.ActualRead->Sht21C.Humidity; }tinyos-2.1.2+dfsg/tos/chips/sht21/Sht21C.nc000066400000000000000000000040011207233610700201560ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo, Andras Biro */ configuration Sht21C { provides interface Read as Temperature; provides interface Read as Humidity; } implementation { components Sht21P, MainC, new TimerMilliC(); Temperature = Sht21P.Temperature; Humidity = Sht21P.Humidity; Sht21P.Timer -> TimerMilliC; Sht21P.Init <- MainC.SoftwareInit; components HplSht21C; Sht21P.I2CPacket -> HplSht21C; Sht21P.I2CResource -> HplSht21C; Sht21P.BusPowerManager->HplSht21C; } tinyos-2.1.2+dfsg/tos/chips/sht21/Sht21P.nc000066400000000000000000000151131207233610700202010ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo, Andras Biro */ #include "Sht21.h" module Sht21P { provides interface Read as Temperature; provides interface Read as Humidity; uses interface I2CPacket; uses interface Timer; uses interface Resource as I2CResource; uses interface BusPowerManager; provides interface Init; } implementation { enum { SHT21_TRIGGER_T_MEASUREMENT_HOLD_MASTER = 0xE3, SHT21_TRIGGER_RH_MEASUREMENT_HOLD_MASTER = 0xE5, SHT21_TRIGGER_T_MEASUREMENT_NO_HOLD_MASTER = 0xF3, SHT21_TRIGGER_RH_MEASUREMENT_NO_HOLD_MASTER = 0xF5, SHT21_WRITE_USER_REGISTER = 0xE6, SHT21_READ_USER_REGISTER = 0xE7, SHT21_SOFT_RESET = 0xFE, } Sht21Command; enum { SHT21_HEATER_ON = 0x04, SHT21_HEATER_OFF = 0x00, } Sht21Heater; enum { SHT21_I2C_ADDRESS = 64, } Sht21Header; enum { SHT21_TIMEOUT_14BIT = 85, SHT21_TIMEOUT_13BIT = 43, SHT21_TIMEOUT_12BIT = 22, SHT21_TIMEOUT_11BIT = 11, SHT21_TIMEOUT_10BIT = 6, SHT21_TIMEOUT_8BIT = 3, SHT21_TIMEOUT_RESET = 15, } Sht21Timeout; uint8_t i2cBuffer[2]; norace error_t lastError; enum { S_OFF = 0, S_IDLE, S_READ_TEMP_CMD, S_READ_TEMP, S_READ_HUMIDITY_CMD, S_READ_HUMIDITY, }; uint8_t state = S_OFF; bool otherSensorRequested=FALSE; command error_t Init.init(){ call BusPowerManager.configure(SHT21_TIMEOUT_RESET,SHT21_TIMEOUT_RESET); return SUCCESS; } command error_t Temperature.read() { uint8_t prevState=state; if(!otherSensorRequested && (state==S_READ_HUMIDITY || state==S_READ_HUMIDITY_CMD)){ otherSensorRequested=TRUE; return SUCCESS; } else if(state==S_READ_TEMP || state==S_READ_TEMP_CMD) return EBUSY; state=S_READ_TEMP_CMD; call BusPowerManager.requestPower(); if(prevState==S_IDLE) call I2CResource.request(); return SUCCESS; } command error_t Humidity.read() { uint8_t prevState=state; if(!otherSensorRequested && (state==S_READ_TEMP || state==S_READ_TEMP_CMD)){ otherSensorRequested=TRUE; return SUCCESS; } else if(state==S_READ_HUMIDITY || state==S_READ_HUMIDITY_CMD) return EBUSY; state = S_READ_HUMIDITY_CMD; call BusPowerManager.requestPower(); if(prevState==S_IDLE) call I2CResource.request(); return SUCCESS; } event void BusPowerManager.powerOn(){ if(state==S_OFF) state=S_IDLE; else call I2CResource.request(); } event void BusPowerManager.powerOff(){ state=S_OFF; } inline error_t sendCommand(){ switch(state){ case S_READ_TEMP: case S_READ_HUMIDITY: return call I2CPacket.read(I2C_START | I2C_STOP, SHT21_I2C_ADDRESS, 2, i2cBuffer); break; case S_READ_TEMP_CMD: i2cBuffer[0]=SHT21_TRIGGER_T_MEASUREMENT_NO_HOLD_MASTER; break; case S_READ_HUMIDITY_CMD: i2cBuffer[0]=SHT21_TRIGGER_RH_MEASUREMENT_NO_HOLD_MASTER; break; } return call I2CPacket.write(I2C_START, SHT21_I2C_ADDRESS, 1, i2cBuffer); } task void signalReadDone() { uint16_t result=(i2cBuffer[0]<<8)+(i2cBuffer[1]&0xfc); uint8_t signalState=state; //restore state, *Requested variables, release bus if(otherSensorRequested){ if(state==S_READ_HUMIDITY) state = S_READ_TEMP; else state = S_READ_HUMIDITY; otherSensorRequested=FALSE; } else { state=S_IDLE; call I2CResource.release(); call BusPowerManager.releasePower(); } //signaling if(signalState == S_READ_TEMP) { signal Temperature.readDone(lastError, result); } if(signalState == S_READ_HUMIDITY){ signal Humidity.readDone(lastError, result); } //run *Requested operations if(state==S_READ_HUMIDITY||state==S_READ_TEMP){ lastError = sendCommand(); if(lastError != SUCCESS) post signalReadDone(); } } event void I2CResource.granted() { lastError = sendCommand(); if(lastError != SUCCESS){ post signalReadDone(); } } task void startTimer(){ switch(state){ case S_READ_TEMP_CMD: state=S_READ_TEMP; call Timer.startOneShot(SHT21_TIMEOUT_14BIT); break; case S_READ_HUMIDITY_CMD: state=S_READ_HUMIDITY; call Timer.startOneShot(SHT21_TIMEOUT_12BIT); break; } } async event void I2CPacket.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { call I2CResource.release(); if(error==SUCCESS){ post startTimer(); } else { lastError=error; post signalReadDone(); } } event void Timer.fired() { call I2CResource.request(); } async event void I2CPacket.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { lastError=error; post signalReadDone(); } default event void Temperature.readDone(error_t error, uint16_t val) {} default event void Humidity.readDone(error_t error, uint16_t val) {} } tinyos-2.1.2+dfsg/tos/chips/sht21/Sht21RawHumidityC.nc000066400000000000000000000034021207233610700223510ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "Sht21.h" generic configuration Sht21RawHumidityC() { provides interface Read; } implementation { components Sht21ArbitratedC; Read=Sht21ArbitratedC.ReadHumidity[unique(UQ_SHT21HUMI_RESOURCE)]; }tinyos-2.1.2+dfsg/tos/chips/sht21/Sht21RawTemperatureC.nc000066400000000000000000000034111207233610700230520ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include "Sht21.h" generic configuration Sht21RawTemperatureC() { provides interface Read; } implementation { components Sht21ArbitratedC; Read=Sht21ArbitratedC.ReadTemperature[unique(UQ_SHT21TEMP_RESOURCE)]; }tinyos-2.1.2+dfsg/tos/chips/stm25p/000077500000000000000000000000001207233610700170265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/stm25p/BlockStorageC.nc000066400000000000000000000050051207233610700220320ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the block storage abstraction from TEP103 for the * ST M25P serial code flash. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:12 $ */ #include "Stm25p.h" generic configuration BlockStorageC( volume_id_t volume_id ) { provides interface BlockRead; provides interface BlockWrite; provides interface StorageMap; } implementation { enum { BLOCK_ID = unique( "Stm25p.Block" ), VOLUME_ID = unique( "Stm25p.Volume" ), }; components Stm25pBlockP as BlockP; BlockRead = BlockP.Read[ BLOCK_ID ]; BlockWrite = BlockP.Write[ BLOCK_ID ]; StorageMap = BlockP.StorageMap[ BLOCK_ID ]; components Stm25pSectorC as SectorC; BlockP.ClientResource[ BLOCK_ID ] -> SectorC.ClientResource[ VOLUME_ID ]; BlockP.Sector[ BLOCK_ID ] -> SectorC.Sector[ VOLUME_ID ]; components new Stm25pBinderP( volume_id ) as BinderP; BinderP.Volume -> SectorC.Volume[ VOLUME_ID ]; } tinyos-2.1.2+dfsg/tos/chips/stm25p/ConfigStorageC.nc000066400000000000000000000047221207233610700222120ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the config storage abstraction from TEP103 for * the ST M25P serial code flash. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:12 $ */ #include generic configuration ConfigStorageC( volume_id_t volume_id ) { provides interface Mount; provides interface ConfigStorage; } implementation { enum { CONFIG_ID = unique( "Stm25p.Config" ), VOLUME_ID = unique( "Stm25p.Volume" ), }; components Stm25pConfigP as ConfigP; Mount = ConfigP.Mount[ CONFIG_ID ]; ConfigStorage = ConfigP.Config[ CONFIG_ID ]; components Stm25pSectorC as SectorC; ConfigP.ClientResource[ CONFIG_ID ] -> SectorC.ClientResource[ VOLUME_ID ]; ConfigP.Sector[ CONFIG_ID ] -> SectorC.Sector[ VOLUME_ID ]; components new Stm25pBinderP( volume_id ) as BinderP; BinderP.Volume -> SectorC.Volume[ VOLUME_ID ]; } tinyos-2.1.2+dfsg/tos/chips/stm25p/LogStorageC.nc000066400000000000000000000053671207233610700215340ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the log storage abstraction from TEP103 for the * ST M25P serial code flash. This is a record-based implementation, * meaning all successful appendeds will survive crash-style * failure. Note that appends are limited to a maximum of 254 bytes at * a time. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:12 $ */ #include generic configuration LogStorageC( volume_id_t volume_id, bool circular ) { provides interface LogRead; provides interface LogWrite; } implementation { enum { LOG_ID = unique( "Stm25p.Log" ), VOLUME_ID = unique( "Stm25p.Volume" ), }; components Stm25pLogP as LogP; LogRead = LogP.Read[ LOG_ID ]; LogWrite = LogP.Write[ LOG_ID ]; components Stm25pSectorC as SectorC; LogP.ClientResource[ LOG_ID ] -> SectorC.ClientResource[ VOLUME_ID ]; LogP.Sector[ LOG_ID ] -> SectorC.Sector[ VOLUME_ID ]; components new Stm25pBinderP( volume_id ) as BinderP; BinderP.Volume -> SectorC.Volume[ VOLUME_ID ]; components new Stm25pLogConfigP( circular ) as ConfigP; LogP.Circular[ LOG_ID ] -> ConfigP; components MainC; MainC.SoftwareInit -> LogP; } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25p.h000066400000000000000000000043251207233610700202750ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:12 $ */ #ifndef __STM25P_H__ #define __STM25P_H__ #include "Storage.h" typedef storage_addr_t stm25p_addr_t; typedef storage_len_t stm25p_len_t; enum { STM25P_NUM_SECTORS = 16, STM25P_SECTOR_SIZE_LOG2 = 16, STM25P_SECTOR_SIZE = 1L << STM25P_SECTOR_SIZE_LOG2, STM25P_SECTOR_MASK = 0xffff, STM25P_PAGE_SIZE_LOG2 = 8, STM25P_PAGE_SIZE = 1 << STM25P_PAGE_SIZE_LOG2, STM25P_PAGE_MASK = STM25P_PAGE_SIZE - 1, STM25P_INVALID_ADDRESS = 0xffffffff, }; typedef struct stm25p_volume_info_t { uint8_t base; uint8_t size; } stm25p_volume_info_t; #endif tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pBinderP.nc000066400000000000000000000035561207233610700217170ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:12 $ */ generic module Stm25pBinderP( volume_id_t volume ) { uses interface Stm25pVolume as Volume; } implementation { async event volume_id_t Volume.getVolumeId() { return volume; } } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pBlockP.nc000066400000000000000000000172221207233610700215410ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:12 $ */ module Stm25pBlockP { provides interface BlockRead as Read[ uint8_t id ]; provides interface BlockWrite as Write[ uint8_t id ]; provides interface StorageMap[ uint8_t id ]; uses interface Stm25pSector as Sector[ uint8_t id ]; uses interface Resource as ClientResource[ uint8_t id ]; uses interface Leds; } implementation { enum { NUM_BLOCKS = uniqueCount( "Stm25p.Block" ), }; typedef enum { S_IDLE, S_READ, S_CRC, S_WRITE, S_SYNC, S_ERASE, } stm25p_block_req_t; typedef struct stm25p_block_state_t { storage_addr_t addr; void* buf; storage_len_t len; stm25p_block_req_t req; } stm25p_block_state_t; stm25p_block_state_t m_block_state[ NUM_BLOCKS ]; stm25p_block_state_t m_req; error_t newRequest( uint8_t client ); void signalDone( uint8_t id, uint16_t crc, error_t error ); command storage_addr_t StorageMap.getPhysicalAddress[ uint8_t id ]( storage_addr_t addr ) { return call Sector.getPhysicalAddress[ id ]( addr ); } command storage_len_t Read.getSize[ uint8_t id ]() { return ( (storage_len_t)call Sector.getNumSectors[ id ]() << STM25P_SECTOR_SIZE_LOG2 ); } command error_t Read.read[ uint8_t id ]( storage_addr_t addr, void* buf, storage_len_t len ) { m_req.req = S_READ; m_req.addr = addr; m_req.buf = buf; m_req.len = len; return newRequest( id ); } command error_t Read.computeCrc[ uint8_t id ]( storage_addr_t addr, storage_len_t len, uint16_t crc ) { m_req.req = S_CRC; m_req.addr = addr; m_req.buf = (void*)crc; m_req.len = len; return newRequest( id ); } command error_t Write.write[ uint8_t id ]( storage_addr_t addr, void* buf, storage_len_t len ) { m_req.req = S_WRITE; m_req.addr = addr; m_req.buf = buf; m_req.len = len; return newRequest( id ); } command error_t Write.sync[ uint8_t id ]() { m_req.req = S_SYNC; return newRequest( id ); } command error_t Write.erase[ uint8_t id ]() { m_req.req = S_ERASE; return newRequest( id ); } error_t newRequest( uint8_t client ) { if ( m_block_state[ client ].req != S_IDLE ) return FAIL; call ClientResource.request[ client ](); m_block_state[ client ] = m_req; return SUCCESS; } event void ClientResource.granted[ uint8_t id ]() { switch( m_block_state[ id ].req ) { case S_READ: call Sector.read[ id ]( m_block_state[ id ].addr, m_block_state[ id ].buf, m_block_state[ id ].len ); break; case S_CRC: call Sector.computeCrc[ id ]( (uint16_t)m_block_state[ id ].buf, m_block_state[ id ].addr, m_block_state[ id ].len ); break; case S_WRITE: call Sector.write[ id ]( m_block_state[ id ].addr, m_block_state[ id ].buf, m_block_state[ id ].len ); break; case S_ERASE: call Sector.erase[ id ]( 0, call Sector.getNumSectors[ id ]() ); break; case S_SYNC: signalDone( id, 0, SUCCESS ); break; case S_IDLE: break; } } event void Sector.readDone[ uint8_t id ]( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len, error_t error ) { signalDone( id, 0, error ); } event void Sector.writeDone[ uint8_t id ]( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len, error_t error ){ signalDone( id, 0, error ); } event void Sector.eraseDone[ uint8_t id ]( uint8_t sector, uint8_t num_sectors, error_t error ) { signalDone( id, 0, error ); } event void Sector.computeCrcDone[ uint8_t id ]( stm25p_addr_t addr, stm25p_len_t len, uint16_t crc, error_t error ) { signalDone( id, crc, error ); } void signalDone( uint8_t id, uint16_t crc, error_t error ) { stm25p_block_req_t req = m_block_state[ id ].req; call ClientResource.release[ id ](); m_block_state[ id ].req = S_IDLE; switch( req ) { case S_READ: signal Read.readDone[ id ]( m_block_state[ id ].addr, m_block_state[ id ].buf, m_block_state[ id ].len, error ); break; case S_CRC: signal Read.computeCrcDone[ id ]( m_block_state[ id ].addr, m_block_state[ id ].len, crc, error ); break; case S_WRITE: signal Write.writeDone[ id ]( m_block_state[ id ].addr, m_block_state[ id ].buf, m_block_state[ id ].len, error ); break; case S_SYNC: signal Write.syncDone[ id ]( error ); break; case S_ERASE: signal Write.eraseDone[ id ]( error ); break; case S_IDLE: break; } } default event void Read.readDone[ uint8_t id ]( storage_addr_t addr, void* buf, storage_len_t len, error_t error ) {} default event void Read.computeCrcDone[ uint8_t id ]( storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error ) {} default event void Write.writeDone[ uint8_t id ]( storage_addr_t addr, void* buf, storage_len_t len, error_t error ) {} default event void Write.eraseDone[ uint8_t id ]( error_t error ) {} default event void Write.syncDone[ uint8_t id ]( error_t error ) {} default command storage_addr_t Sector.getPhysicalAddress[ uint8_t id ]( storage_addr_t addr ) { return 0xffffffff; } default command uint8_t Sector.getNumSectors[ uint8_t id ]() { return 0; } default command error_t Sector.read[ uint8_t id ]( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len ) { return FAIL; } default command error_t Sector.write[ uint8_t id ]( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len ) { return FAIL; } default command error_t Sector.erase[ uint8_t id ]( uint8_t sector, uint8_t num_sectors ) { return FAIL; } default command error_t Sector.computeCrc[ uint8_t id ]( uint16_t crc, storage_addr_t addr, storage_len_t len ) { return FAIL; } default async command error_t ClientResource.request[ uint8_t id ]() { return FAIL; } default async command error_t ClientResource.release[ uint8_t id ]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pConfigP.nc000066400000000000000000000325111207233610700217120ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:12 $ */ #include module Stm25pConfigP { provides interface Mount[ uint8_t client ]; provides interface ConfigStorage as Config[ uint8_t client ]; uses interface Stm25pSector as Sector[ uint8_t client ]; uses interface Resource as ClientResource[ uint8_t client ]; uses interface Leds; } implementation { enum { NUM_CLIENTS = uniqueCount( "Stm25p.Config" ), CONFIG_SIZE = 2048, CHUNK_SIZE_LOG2 = 8, CHUNK_SIZE = 1 << CHUNK_SIZE_LOG2, NUM_CHUNKS = CONFIG_SIZE / CHUNK_SIZE, BUF_SIZE = 16, INVALID_VERSION = -1, }; enum { S_IDLE, S_MOUNT, S_READ, S_WRITE, S_COMMIT, }; typedef struct { uint16_t addr; void* buf; uint16_t len; uint8_t req; } config_state_t; config_state_t m_config_state[ NUM_CLIENTS ]; config_state_t m_req; typedef struct { uint16_t chunk_addr[ NUM_CHUNKS ]; uint16_t write_addr; int16_t version; uint8_t cur_sector; bool valid : 1; } config_info_t; config_info_t m_config_info[ NUM_CLIENTS ]; typedef struct { int32_t version; uint16_t crc; } config_metadata_t; config_metadata_t m_metadata[ 2 ]; uint8_t m_buf[ BUF_SIZE ]; uint16_t m_chunk; uint16_t m_offset; enum { S_COPY_BEFORE, S_COPY_AFTER, }; uint8_t m_meta_state; error_t newRequest( uint8_t client ); void continueMount( uint8_t id ); void continueWrite( uint8_t id ); void continueCommit( uint8_t id ); void signalDone( uint8_t id, error_t error ); command error_t Mount.mount[ uint8_t client ]() { if ( call Sector.getNumSectors[ client ]() != 2 ) return ESIZE; m_req.req = S_MOUNT; return newRequest( client ); } command error_t Config.read[ uint8_t client ]( storage_addr_t addr, void* buf, storage_len_t len ) { if ( !m_config_info[ client ].valid ) return FAIL; m_req.req = S_READ; m_req.addr = addr; m_req.buf = buf; m_req.len = len; return newRequest( client ); } command error_t Config.write[ uint8_t client ]( storage_addr_t addr, void* buf, storage_len_t len ) { m_req.req = S_WRITE; m_req.addr = addr; m_req.buf = buf; m_req.len = len; return newRequest( client ); } command error_t Config.commit[ uint8_t client ]() { m_req.req = S_COMMIT; return newRequest( client ); } command storage_len_t Config.getSize[ uint8_t client ]() { return CONFIG_SIZE; } command bool Config.valid[ uint8_t client ]() { return m_config_info[ client ].valid; } error_t newRequest( uint8_t client ) { if ( m_config_state[ client ].req != S_IDLE ) return EBUSY; call ClientResource.request[ client ](); m_config_state[ client ] = m_req; return SUCCESS; } stm25p_addr_t calcAddr( uint8_t id, uint16_t addr, bool current ) { stm25p_addr_t result = addr; if ( !(current ^ m_config_info[ id ].cur_sector) ) result += STM25P_SECTOR_SIZE; return result; } event void ClientResource.granted[ uint8_t id ]() { m_chunk = 0; m_offset = 0; switch( m_config_state[ id ].req ) { case S_IDLE: break; case S_MOUNT: continueMount( id ); break; case S_READ: call Sector.read[ id ]( calcAddr( id, m_config_state[ id ].addr, TRUE ), m_config_state[ id ].buf, m_config_state[ id ].len ); break; case S_WRITE: m_meta_state = S_COPY_BEFORE; m_chunk = m_config_state[ id ].addr >> CHUNK_SIZE_LOG2; continueWrite( id ); break; case S_COMMIT: continueCommit( id ); break; } } void continueMount( uint8_t id ) { uint32_t addr = 0; uint8_t cur_sector = 0; int i; switch( m_chunk ) { case 1: addr = STM25P_SECTOR_SIZE; // fall through case 0: addr += STM25P_SECTOR_SIZE - sizeof( config_metadata_t ); call Sector.read[ id ]( addr, (uint8_t*)&m_metadata[ m_chunk ], sizeof( config_metadata_t ) ); break; case 3: addr = STM25P_SECTOR_SIZE; // fall through case 2: call Sector.computeCrc[ id ]( 0, addr, CONFIG_SIZE ); break; case 4: if ( m_metadata[ 0 ].version != INVALID_VERSION || m_metadata[ 1 ].version != INVALID_VERSION ) { m_config_info[ id ].valid = TRUE; if ( m_metadata[ 0 ].version == INVALID_VERSION ) cur_sector = 1; else if ( m_metadata[ 1 ].version == INVALID_VERSION ) cur_sector = 0; else cur_sector = (( m_metadata[1].version - m_metadata[0].version ) > 0); } m_config_info[ id ].cur_sector = cur_sector; m_config_info[ id ].version = m_metadata[ cur_sector ].version; call Sector.erase[ id ]( !cur_sector, 1 ); break; case 5: // initialize chunk addrs for ( i = 0; i < NUM_CHUNKS; i++ ) m_config_info[ id ].chunk_addr[ i ] = i << CHUNK_SIZE_LOG2; m_config_info[ id ].write_addr = CONFIG_SIZE; signalDone( id, SUCCESS ); break; } m_chunk++; } event void Sector.readDone[ uint8_t id ]( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len, error_t error ) { switch ( m_config_state[ id ].req ) { case S_IDLE: break; case S_MOUNT: continueMount( id ); break; case S_READ: signalDone( id, error ); break; case S_WRITE: addr = calcAddr( id, m_config_info[ id ].write_addr, FALSE ); call Sector.write[ id ]( addr, buf, len ); break; case S_COMMIT: addr = ((uint16_t)m_chunk << CHUNK_SIZE_LOG2) + m_offset; addr = calcAddr( id, addr, FALSE ); call Sector.write[ id ]( addr, buf, len ); break; } } void continueWrite( uint8_t id ) { config_state_t* state = &m_config_state[ id ]; config_info_t* info = &m_config_info[ id ]; uint8_t chunk = m_chunk + (m_offset / CHUNK_SIZE); uint8_t offset = m_offset & 0xff; uint32_t addr; uint16_t len; // compute addr for copy addr = info->chunk_addr[ chunk ] + offset; addr = calcAddr( id, addr, info->chunk_addr[ chunk ] < CONFIG_SIZE ); switch( m_meta_state ) { case S_COPY_BEFORE: // copy old data before if ( offset < (uint8_t)state->addr ) { len = (uint8_t)state->addr - offset; if ( len > sizeof( m_buf ) ) len = sizeof( m_buf ); call Sector.read[ id ]( addr, m_buf, len ); } // write new data else if ( offset == (uint8_t)state->addr ) { addr = calcAddr( id, info->write_addr, FALSE ); len = state->len; call Sector.write[ id ]( addr, state->buf, len ); m_meta_state = S_COPY_AFTER; } break; case S_COPY_AFTER: // copy old data after if ( offset != 0 ) { len = CHUNK_SIZE - offset; if ( len > sizeof( m_buf ) ) len = sizeof( m_buf ); call Sector.read[ id ]( addr, m_buf, len ); } // all done, update chunk addrs else { info->write_addr -= m_offset; for ( chunk = 0; chunk < m_offset / CHUNK_SIZE; chunk++ ) { info->chunk_addr[ m_chunk+chunk ] = info->write_addr; info->write_addr += CHUNK_SIZE; } signalDone( id, SUCCESS ); } break; } } event void Sector.writeDone[ uint8_t id ]( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len, error_t error ){ switch( m_config_state[ id ].req ) { case S_WRITE: m_config_info[ id ].write_addr += len; m_offset += len; continueWrite( id ); break; case S_COMMIT: m_offset += len; continueCommit( id ); break; } } event void Sector.eraseDone[ uint8_t id ]( uint8_t sector, uint8_t num_sectors, error_t error ) { if ( m_config_state[ id ].req == S_MOUNT ) continueMount( id ); else continueCommit( id ); } void continueCommit( uint8_t id ) { config_info_t* info = &m_config_info[ id ]; uint32_t addr; uint16_t len; int i; // check if time to copy next chunk if ( m_offset >= CHUNK_SIZE ) { m_chunk++; m_offset = 0; } // copy data if ( m_chunk < NUM_CHUNKS ) { // compute addr for copy addr = info->chunk_addr[ m_chunk ] + m_offset; addr = calcAddr( id, addr, info->chunk_addr[ m_chunk ] < CONFIG_SIZE ); len = sizeof( m_buf ); call Sector.read[ id ]( addr, m_buf, len ); } // compute crc else if ( m_chunk == NUM_CHUNKS ) { addr = calcAddr( 0, 0, FALSE ); call Sector.computeCrc[ id ]( 0, addr, CONFIG_SIZE ); m_chunk++; } // swap and erase other sector else if ( m_chunk == NUM_CHUNKS + 1 ) { info->cur_sector ^= 1; info->write_addr = CONFIG_SIZE; // initialize chunks for ( i = 0; i < NUM_CHUNKS; i++ ) info->chunk_addr[ i ] = (uint16_t)i << CHUNK_SIZE_LOG2; call Sector.erase[ id ]( !info->cur_sector, 1 ); m_chunk++; } // signal done else { m_config_info[ id ].valid = TRUE; signalDone( id, SUCCESS ); } } event void Sector.computeCrcDone[ uint8_t id ]( stm25p_addr_t addr, stm25p_len_t len, uint16_t crc, error_t error ) { // mount if ( m_config_state[ id ].req == S_MOUNT ) { uint8_t chunk = addr >> STM25P_SECTOR_SIZE_LOG2; if ( m_metadata[ chunk ].crc != crc ) m_metadata[ chunk ].version = INVALID_VERSION; continueMount( id ); } // commit else { bool cur_sector = m_config_info[ id ].cur_sector; m_config_info[ id ].version++; m_metadata[ !cur_sector ].version = m_config_info[ id ].version; m_metadata[ !cur_sector ].crc = crc; addr += STM25P_SECTOR_SIZE - sizeof( config_metadata_t ); call Sector.write[ id ]( addr, (uint8_t*)&m_metadata[ !cur_sector ], sizeof( config_metadata_t ) ); } } void signalDone( uint8_t id, error_t error ) { uint8_t req = m_config_state[ id ].req; call ClientResource.release[ id ](); m_config_state[ id ].req = S_IDLE; switch( req ) { case S_MOUNT: signal Mount.mountDone[ id ]( error ); break; case S_READ: signal Config.readDone[ id ]( m_config_state[ id ].addr, m_config_state[ id ].buf, m_config_state[ id ].len, error ); break; case S_WRITE: signal Config.writeDone[ id ]( m_config_state[ id ].addr, m_config_state[ id ].buf, m_config_state[ id ].len, error ); break; case S_COMMIT: signal Config.commitDone[ id ]( error ); break; } } default event void Mount.mountDone[ uint8_t id ]( error_t error ) {} default event void Config.readDone[ uint8_t id ]( storage_addr_t addr, void* buf, storage_len_t len, error_t error ) {} default event void Config.writeDone[ uint8_t id ]( storage_addr_t addr, void* buf, storage_len_t len, error_t error ) {} default event void Config.commitDone[ uint8_t id ]( error_t error ) {} default command storage_addr_t Sector.getPhysicalAddress[ uint8_t id ]( storage_addr_t addr ) { return 0xffffffff; } default command uint8_t Sector.getNumSectors[ uint8_t id ]() { return 0; } default command error_t Sector.read[ uint8_t id ]( storage_addr_t addr, uint8_t* buf, storage_len_t len ) { return FAIL; } default command error_t Sector.write[ uint8_t id ]( storage_addr_t addr, uint8_t* buf, storage_len_t len ) { return FAIL; } default command error_t Sector.erase[ uint8_t id ]( uint8_t sector, uint8_t num_sectors ) { return FAIL; } default command error_t Sector.computeCrc[ uint8_t id ]( uint16_t crc, storage_addr_t addr, storage_len_t len ) { return FAIL; } default async command error_t ClientResource.request[ uint8_t id ]() { return FAIL; } default async command error_t ClientResource.release[ uint8_t id ]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pLogConfigP.nc000066400000000000000000000035471207233610700223630ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:12 $ */ generic module Stm25pLogConfigP( bool IS_CIRCULAR ) { provides interface Get as Circular; } implementation { command bool Circular.get() { return IS_CIRCULAR; } } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pLogP.nc000066400000000000000000000375341207233610700212400ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.9 $ $Date: 2009-12-23 02:28:47 $ */ #include module Stm25pLogP { provides interface Init; provides interface LogRead as Read[ uint8_t id ]; provides interface LogWrite as Write[ uint8_t id ]; uses interface Stm25pSector as Sector[ uint8_t id ]; uses interface Resource as ClientResource[ uint8_t id ]; uses interface Get as Circular[ uint8_t id ]; uses interface Leds; } implementation { enum { NUM_LOGS = uniqueCount( "Stm25p.Log" ), BLOCK_SIZE = 4096, BLOCK_SIZE_LOG2 = 12, BLOCK_MASK = BLOCK_SIZE - 1, BLOCKS_PER_SECTOR = STM25P_SECTOR_SIZE / BLOCK_SIZE, MAX_RECORD_SIZE = 254, INVALID_HEADER = 0xff, }; typedef enum { S_IDLE, S_READ, S_SEEK, S_ERASE, S_APPEND, S_SYNC, } stm25p_log_req_t; typedef struct stm25p_log_state_t { storage_cookie_t cookie; void* buf; uint8_t len; stm25p_log_req_t req; } stm25p_log_state_t; typedef struct stm25p_log_info_t { stm25p_addr_t read_addr; stm25p_addr_t remaining; stm25p_addr_t write_addr; } stm25p_log_info_t; stm25p_log_state_t m_log_state[ NUM_LOGS ]; stm25p_log_state_t m_req; stm25p_log_info_t m_log_info[ NUM_LOGS ]; stm25p_addr_t m_addr; bool m_records_lost; uint8_t m_header; uint8_t m_len; typedef enum { S_SEARCH_BLOCKS, S_SEARCH_RECORDS, S_SEARCH_SEEK, S_HEADER, S_DATA, } stm25p_log_rw_state_t; stm25p_log_rw_state_t m_rw_state; error_t newRequest( uint8_t client ); void continueReadOp( uint8_t client ); void continueAppendOp( uint8_t client ); void signalDone( uint8_t id, error_t error ); command error_t Init.init() { int i; for ( i = 0; i < NUM_LOGS; i++ ) { m_log_info[ i ].read_addr = STM25P_INVALID_ADDRESS; m_log_info[ i ].write_addr = 0; } return SUCCESS; } command error_t Read.read[ uint8_t id ]( void* buf, storage_len_t len ) { m_req.req = S_READ; m_req.buf = buf; m_req.len = len; m_len = len; return newRequest( id ); } command error_t Read.seek[ uint8_t id ]( storage_addr_t cookie ) { if ( cookie > m_log_info[ id ].write_addr ) return FAIL; m_req.req = S_SEEK; m_req.cookie = cookie; return newRequest( id ); } command storage_cookie_t Read.currentOffset[ uint8_t id ]() { return m_log_info[ id ].read_addr; } command storage_cookie_t Read.getSize[ uint8_t id ]() { return ( (storage_len_t)call Sector.getNumSectors[ id ]() << STM25P_SECTOR_SIZE_LOG2 ); } command storage_cookie_t Write.currentOffset[ uint8_t id ]() { return m_log_info[ id ].write_addr; } command error_t Write.erase[ uint8_t id ]() { m_req.req = S_ERASE; return newRequest( id ); } command error_t Write.append[ uint8_t id ]( void* buf, storage_len_t len ) { uint16_t bytes_left = (uint16_t)m_log_info[ id ].write_addr % BLOCK_SIZE; bytes_left = BLOCK_SIZE - bytes_left; // don't allow appends larger than maximum record size if ( len > MAX_RECORD_SIZE ) return EINVAL; // move to next block if current block doesn't have enough space if ( sizeof( m_header ) + len > bytes_left ) m_log_info[ id ].write_addr += bytes_left; // if log is not circular, make sure it doesn't grow too large if ( !call Circular.get[ id ]() && ( (uint8_t)(m_log_info[ id ].write_addr >> STM25P_SECTOR_SIZE_LOG2) >= call Sector.getNumSectors[ id ]() ) ) return ESIZE; m_records_lost = FALSE; m_req.req = S_APPEND; m_req.buf = buf; m_req.len = len; return newRequest( id ); } command error_t Write.sync[ uint8_t id ]() { m_req.req = S_SYNC; return newRequest( id ); } error_t newRequest( uint8_t client ) { if ( m_log_state[ client ].req != S_IDLE ) return FAIL; call ClientResource.request[ client ](); m_log_state[ client ] = m_req; return SUCCESS; } uint8_t calcSector( uint8_t client, stm25p_addr_t addr ) { uint8_t sector = call Sector.getNumSectors[ client ](); return (uint8_t)(( addr >> STM25P_SECTOR_SIZE_LOG2 ) % sector); } stm25p_addr_t calcAddr( uint8_t client, stm25p_addr_t addr ) { stm25p_addr_t result = calcSector( client, addr ); result <<= STM25P_SECTOR_SIZE_LOG2; result |= addr & STM25P_SECTOR_MASK; return result; } event void ClientResource.granted[ uint8_t id ]() { // log never used, need to find start and end of log if ( m_log_info[ id ].read_addr == STM25P_INVALID_ADDRESS && m_log_state[ id ].req != S_ERASE ) { m_rw_state = S_SEARCH_BLOCKS; call Sector.read[ id ]( 0, (uint8_t*)&m_addr, sizeof( m_addr ) ); } // start and end of log known, do the requested operation else { switch( m_log_state[ id ].req ) { case S_READ: m_rw_state = (m_log_info[ id ].remaining) ? S_DATA : S_HEADER; continueReadOp( id ); break; case S_SEEK: { // make sure the cookie is still within the range of valid data uint8_t numSectors = call Sector.getNumSectors[ id ](); uint8_t readSector = (m_log_state[ id ].cookie >> STM25P_SECTOR_SIZE_LOG2); uint8_t writeSector = ((m_log_info[ id ].write_addr-1)>>STM25P_SECTOR_SIZE_LOG2)+1; // if cookie is overwritten, advance to beginning of log if ( (writeSector - readSector) > numSectors ) { m_log_state[ id ].cookie = (storage_cookie_t)(writeSector-numSectors) <= m_log_info[ client ].write_addr ) { signalDone( client, SUCCESS ); return; } buf = &m_header; len = sizeof( m_header ); if ( m_rw_state == S_DATA ) { // if header is invalid, move to next block if ( m_header == INVALID_HEADER ) { m_rw_state = S_HEADER; read_addr += BLOCK_SIZE; read_addr &= ~BLOCK_MASK; } else { buf = m_log_state[ client ].buf + m_log_state[ client ].len - m_len; // truncate if record is shorter than requested length if ( m_log_info[ client ].remaining < m_len ) len = m_log_info[ client ].remaining; else len = m_len; } } // if on block boundary if ( !((uint16_t)read_addr & BLOCK_MASK ) ) read_addr += sizeof( m_addr ); m_log_info[ client ].read_addr = read_addr; call Sector.read[ client ]( calcAddr( client, read_addr ), buf, len ); } event void Sector.readDone[ uint8_t id ]( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len, error_t error ) { stm25p_log_info_t* log_info = &m_log_info[ id ]; // searching for the first and last log blocks switch( m_rw_state ) { case S_SEARCH_BLOCKS: { uint16_t block = addr >> BLOCK_SIZE_LOG2; // record potential starting and ending addresses if ( m_addr != STM25P_INVALID_ADDRESS ) { if ( m_addr < log_info->read_addr ) log_info->read_addr = m_addr; if ( m_addr > log_info->write_addr ) log_info->write_addr = m_addr; } // move on to next log block if (++block < (call Sector.getNumSectors[ id ]()*BLOCKS_PER_SECTOR)) { addr += BLOCK_SIZE; call Sector.read[ id ]( addr, (uint8_t*)&m_addr, sizeof( m_addr ) ); } // if log is empty, continue operation else if ( log_info->read_addr == STM25P_INVALID_ADDRESS ) { log_info->read_addr = 0; log_info->write_addr = 0; signal ClientResource.granted[ id ](); } // search for last record else { log_info->write_addr += sizeof( m_addr ); m_rw_state = S_SEARCH_RECORDS; call Sector.read[ id ]( calcAddr(id, log_info->write_addr), &m_header, sizeof( m_header ) ); } } break; case S_SEARCH_RECORDS: { // searching for the last log record to write uint16_t cur_block = log_info->write_addr >> BLOCK_SIZE_LOG2; uint16_t new_block = ( log_info->write_addr + sizeof( m_header ) + m_header ) >> BLOCK_SIZE_LOG2; // if header is valid and is on same block, move to next record if ( m_header != INVALID_HEADER && cur_block == new_block ) { log_info->write_addr += sizeof( m_header ) + m_header; call Sector.read[ id ]( calcAddr( id, log_info->write_addr ), &m_header, sizeof( m_header ) ); } // found last record else { signal ClientResource.granted[ id ](); } } break; case S_SEARCH_SEEK: { // searching for last log record to read log_info->read_addr += sizeof( m_header ) + m_header; // if not yet at cookie, keep searching if ( log_info->read_addr < m_log_state[ id ].cookie ) { call Sector.read[ id ]( calcAddr(id, log_info->read_addr), &m_header, sizeof( m_header ) ); } // at or passed cookie, stop else { log_info->remaining = log_info->read_addr - m_log_state[ id ].cookie; log_info->read_addr = m_log_state[ id ].cookie; signalDone( id, error ); } } break; case S_HEADER: { // if header is invalid, move to next block if ( m_header == INVALID_HEADER ) { log_info->read_addr += BLOCK_SIZE; log_info->read_addr &= ~BLOCK_MASK; } else { log_info->read_addr += sizeof( m_header ); log_info->remaining = m_header; m_rw_state = S_DATA; } continueReadOp( id ); } break; case S_DATA: { log_info->read_addr += len; log_info->remaining -= len; m_len -= len; m_rw_state = S_HEADER; continueReadOp( id ); break; } } } void continueAppendOp( uint8_t client ) { stm25p_addr_t write_addr = m_log_info[ client ].write_addr; void* buf; uint8_t len; if ( !(uint16_t)write_addr ) { m_records_lost = TRUE; call Sector.erase[ client ]( calcSector( client, write_addr ), 1 ); } else { if ( !((uint16_t)write_addr & BLOCK_MASK) ) { buf = &m_log_info[ client ].write_addr; len = sizeof( m_addr ); } else if ( m_rw_state == S_HEADER ) { buf = &m_log_state[ client ].len; len = sizeof( m_log_state[ client ].len ); } else { buf = m_log_state[ client ].buf; len = m_log_state[ client ].len; } call Sector.write[ client ]( calcAddr( client, write_addr ), buf, len ); } } event void Sector.eraseDone[ uint8_t id ]( uint8_t sector, uint8_t num_sectors, error_t error ) { if ( m_log_state[ id ].req == S_ERASE ) { m_log_info[ id ].read_addr = 0; m_log_info[ id ].write_addr = 0; signalDone( id, error ); } else { // advance read pointer if write pointer has gone too far ahead // (the log could have cycled around) stm25p_addr_t volume_size = STM25P_SECTOR_SIZE * ( call Sector.getNumSectors[ id ]() - 1 ); if ( m_log_info[ id ].write_addr > volume_size ) { stm25p_addr_t read_addr = m_log_info[ id ].write_addr - volume_size; if ( m_log_info[ id ].read_addr < read_addr ) m_log_info[ id ].read_addr = read_addr; } m_addr = m_log_info[ id ].write_addr; call Sector.write[ id ]( calcAddr( id, m_addr ), (uint8_t*)&m_addr, sizeof( m_addr ) ); } } event void Sector.writeDone[ uint8_t id ]( storage_addr_t addr, uint8_t* buf, storage_len_t len, error_t error ) { m_log_info[ id ].write_addr += len; if ( m_rw_state == S_HEADER ) { if ( len == sizeof( m_header ) ) m_rw_state = S_DATA; continueAppendOp( id ); } else { signalDone( id, error ); } } void signalDone( uint8_t id, error_t error ) { stm25p_log_req_t req = m_log_state[ id ].req; void* buf = m_log_state[ id ].buf; storage_len_t len = m_log_state[ id ].len; call ClientResource.release[ id ](); m_log_state[ id ].req = S_IDLE; switch( req ) { case S_IDLE: break; case S_READ: signal Read.readDone[ id ]( buf, len - m_len, error ); break; case S_SEEK: signal Read.seekDone[ id ]( error ); break; case S_ERASE: signal Write.eraseDone[ id ]( error ); break; case S_APPEND: signal Write.appendDone[ id ]( buf, len, m_records_lost, error ); break; case S_SYNC: signal Write.syncDone[ id ]( error ); break; } } event void Sector.computeCrcDone[ uint8_t id ]( stm25p_addr_t addr, stm25p_len_t len, uint16_t crc, error_t error ) {} default event void Read.readDone[ uint8_t id ]( void* data, storage_len_t len, error_t error ) {} default event void Read.seekDone[ uint8_t id ]( error_t error ) {} default event void Write.eraseDone[ uint8_t id ]( error_t error ) {} default event void Write.appendDone[ uint8_t id ]( void* data, storage_len_t len, bool recordsLost, error_t error ) {} default event void Write.syncDone[ uint8_t id ]( error_t error ) {} default command storage_addr_t Sector.getPhysicalAddress[ uint8_t id ]( storage_addr_t addr ) { return 0xffffffff; } default command uint8_t Sector.getNumSectors[ uint8_t id ]() { return 0; } default command error_t Sector.read[ uint8_t id ]( storage_addr_t addr, uint8_t* buf, storage_len_t len ) { return FAIL; } default command error_t Sector.write[ uint8_t id ]( storage_addr_t addr, uint8_t* buf, storage_len_t len ) { return FAIL; } default command error_t Sector.erase[ uint8_t id ]( uint8_t sector, uint8_t num_sectors ) { return FAIL; } default command error_t Sector.computeCrc[ uint8_t id ]( uint16_t crc, storage_addr_t addr, storage_len_t len ) { return FAIL; } default async command error_t ClientResource.request[ uint8_t id ]() { return FAIL; } default async command error_t ClientResource.release[ uint8_t id ]() { return FAIL; } default command bool Circular.get[ uint8_t id ]() { return FALSE; } } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pOffC.nc000066400000000000000000000036501207233610700212040ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ configuration Stm25pOffC { provides interface Init as Stm25pOff; } implementation { components Stm25pOffP; Stm25pOff = Stm25pOffP; components HplStm25pSpiC as SpiC; Stm25pOffP.SpiResource -> SpiC; Stm25pOffP.SpiByte -> SpiC; components HplStm25pPinsC as PinsC; Stm25pOffP.CSN -> PinsC.CSN; Stm25pOffP.Hold -> PinsC.Hold; } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pOffP.nc000066400000000000000000000044541207233610700212240ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ module Stm25pOffP { provides interface Init as Stm25pOff; uses interface Resource as SpiResource; uses interface GeneralIO as CSN; uses interface GeneralIO as Hold; uses interface SpiByte; } implementation { command error_t Stm25pOff.init() { if(!uniqueCount("Stm25pOn")) call SpiResource.request(); return SUCCESS; } event void SpiResource.granted() { //we get the granted event if the real driver asks for the resource if(!uniqueCount("Stm25pOn")) { call CSN.makeOutput(); call Hold.makeOutput(); call CSN.clr(); call Hold.clr(); call SpiByte.write(0xb9);//deep sleep call CSN.set(); call Hold.set(); call SpiResource.release(); } } } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pSector.nc000066400000000000000000000125571207233610700216340ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HAL for the ST M25P family of serial code flash chips. This * provides a sector level abstraction to perform basic * operations. Upon completion of a write/erase operation, all data is * committed to non-volatile storage. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:13 $ */ #include "Stm25p.h" interface Stm25pSector { /** * Get the physical address of a volume address. * * @return The physical address corresponding to the volume address. */ command stm25p_addr_t getPhysicalAddress( stm25p_addr_t addr ); /** * Get the number of sectors in the volume. */ command uint8_t getNumSectors(); /** * Read data from the flash chip. On SUCCESS, the * readDone event will be signalled when the operation * is complete. * * @param addr within volume to read data from. * @param buf pointer to read buffer. * @param len number of bytes to read. * @return SUCCESS if request was accepted, FAIL otherwise. */ command error_t read( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len ); /** * Signals when the read operation is complete. * * @param addr within the volume that data was read from. * @param buf pointer to buffer that data was placed. * @param len number of bytes read. * @param error notification of how the operation went. */ event void readDone( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len, error_t error ); /** * Write data to the flash chip. On SUCCESS, the * writeDone event will be signalled when the operation * is complete. * * @param addr within volume to write data to. * @param buf pointer to data buffer. * @param len number of bytes to write. * @return SUCCESS if request was accepted, FAIL otherwise. */ command error_t write( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len ); /** * Signals when the write operation is complete. * * @param addr within the volume that data was written to. * @param buf pointer to data buffer. * @param len number of bytes written. * @param error notification of how the operation went. */ event void writeDone( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len, error_t error ); /** * Erase a number of sectors. On SUCCESS, the eraseDone * event will be signalled when the operation completes. * * @param sector within volume to begin erasing. * @param num_sectors number of sectors to erase. * @return SUCCESS if request was accepted, FAIL otherwise. */ command error_t erase( uint8_t sector, uint8_t num_sectors ); /** * Signals when the erase operation is complete. * * @param sector within volume that erasing begain. * @param num_sectors number of sectors erased. * @param error notification of how the operation went. */ event void eraseDone( uint8_t sector, uint8_t num_sectors, error_t error ); /** * Compute CRC for some contiguous data. On SUCCESS, the * computeCrcDone event will be signalled when the * operation completes. * * @param crc the crc value to start with. * @param addr within the volume to begin crc computation. * @param len number of bytes to compute crc over. * @return SUCCESS if the request was accepted, FAIL otherwise. */ command error_t computeCrc( uint16_t crc, stm25p_addr_t addr, stm25p_len_t len ); /** * Signals when the crc computation is complete. * * @param addr within the volume that the crc computation began at. * @param len number of bytes that the crc was computed over. * @param crc the resulting crc value * @param error notification of how the operation went. */ event void computeCrcDone( stm25p_addr_t addr, stm25p_len_t len, uint16_t crc, error_t error ); } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pSectorC.nc000066400000000000000000000051331207233610700217270ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the sector storage absraction for the ST M25P * serial code flash. * * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2007-02-04 19:55:17 $ */ configuration Stm25pSectorC { provides interface Resource as ClientResource[ uint8_t id ]; provides interface Stm25pSector as Sector[ uint8_t id ]; provides interface Stm25pVolume as Volume[ uint8_t id ]; } implementation { components MainC; components Stm25pSectorP as SectorP; ClientResource = SectorP; Sector = SectorP; Volume = SectorP; components new FcfsArbiterC( "Stm25p.Volume" ) as ArbiterC; SectorP.Stm25pResource -> ArbiterC; components new SplitControlDeferredPowerManagerC( 1024 ) as PowerManagerC; PowerManagerC.SplitControl -> SectorP; PowerManagerC.ResourceDefaultOwner -> ArbiterC; PowerManagerC.ArbiterInfo -> ArbiterC; components Stm25pSpiC as SpiC; SectorP.SpiResource -> SpiC; SectorP.Spi -> SpiC; MainC.SoftwareInit -> SpiC; components LedsC as Leds; SectorP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pSectorP.nc000066400000000000000000000205261207233610700217470ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2007-12-22 08:11:51 $ */ #include #include module Stm25pSectorP { provides interface SplitControl; provides interface Resource as ClientResource[ uint8_t id ]; provides interface Stm25pSector as Sector[ uint8_t id ]; provides interface Stm25pVolume as Volume[ uint8_t id ]; uses interface Resource as Stm25pResource[ uint8_t id ]; uses interface Resource as SpiResource; uses interface Stm25pSpi as Spi; uses interface Leds; } implementation { enum { NO_CLIENT = 0xff, }; typedef enum { S_IDLE, S_READ, S_WRITE, S_ERASE, S_CRC, } stm25p_sector_state_t; norace stm25p_sector_state_t m_state; typedef enum { S_NONE, S_START, S_STOP, } stm25p_power_state_t; norace stm25p_power_state_t m_power_state; norace uint8_t m_client; norace stm25p_addr_t m_addr; norace stm25p_len_t m_len; norace stm25p_len_t m_cur_len; norace uint8_t* m_buf; norace error_t m_error; norace uint16_t m_crc; void bindVolume(); void signalDone( error_t error ); task void signalDone_task(); command error_t SplitControl.start() { error_t error = call SpiResource.request(); if ( error == SUCCESS ) m_power_state = S_START; return error; } command error_t SplitControl.stop() { error_t error = call SpiResource.request(); if ( error == SUCCESS ) m_power_state = S_STOP; return error; } async command error_t ClientResource.request[ uint8_t id ]() { return call Stm25pResource.request[ id ](); } async command error_t ClientResource.immediateRequest[ uint8_t id ]() { return FAIL; } async command error_t ClientResource.release[ uint8_t id ]() { if ( m_client == id ) { m_state = S_IDLE; m_client = NO_CLIENT; call SpiResource.release(); call Stm25pResource.release[ id ](); return SUCCESS; } return FAIL; } event void Stm25pResource.granted[ uint8_t id ]() { m_client = id; call SpiResource.request(); } uint8_t getVolumeId( uint8_t client ) { return signal Volume.getVolumeId[ client ](); } event void SpiResource.granted() { error_t error; stm25p_power_state_t power_state = m_power_state; m_power_state = S_NONE; if ( power_state == S_START ) { error = call Spi.powerUp(); call SpiResource.release(); signal SplitControl.startDone( error ); return; } else if ( power_state == S_STOP ) { error = call Spi.powerDown(); call SpiResource.release(); signal SplitControl.stopDone( error ); return; } signal ClientResource.granted[ m_client ](); } async command bool ClientResource.isOwner[ uint8_t id ]() { return call Stm25pResource.isOwner[id](); } stm25p_addr_t physicalAddr( uint8_t id, stm25p_addr_t addr ) { return addr + ( (stm25p_addr_t)STM25P_VMAP[ getVolumeId( id ) ].base << STM25P_SECTOR_SIZE_LOG2 ); } stm25p_len_t calcWriteLen( stm25p_addr_t addr ) { stm25p_len_t len = STM25P_PAGE_SIZE - ( addr & STM25P_PAGE_MASK ); return ( m_cur_len < len ) ? m_cur_len : len; } command stm25p_addr_t Sector.getPhysicalAddress[ uint8_t id ]( stm25p_addr_t addr ) { return physicalAddr( id, addr ); } command uint8_t Sector.getNumSectors[ uint8_t id ]() { return STM25P_VMAP[ getVolumeId( id ) ].size; } command error_t Sector.read[ uint8_t id ]( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len ) { m_state = S_READ; m_addr = addr; m_buf = buf; m_len = len; return call Spi.read( physicalAddr( id, addr ), buf, len ); } async event void Spi.readDone( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len, error_t error ) { signalDone( error ); } command error_t Sector.write[ uint8_t id ]( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len ) { m_state = S_WRITE; m_addr = addr; m_buf = buf; m_len = m_cur_len = len; return call Spi.pageProgram( physicalAddr( id, addr ), buf, calcWriteLen( addr ) ); } async event void Spi.pageProgramDone( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len, error_t error ) { addr += len; buf += len; m_cur_len -= len; if ( !m_cur_len ) signalDone( SUCCESS ); else call Spi.pageProgram( addr, buf, calcWriteLen( addr ) ); } command error_t Sector.erase[ uint8_t id ]( uint8_t sector, uint8_t num_sectors ) { m_state = S_ERASE; m_addr = sector; m_len = num_sectors; m_cur_len = 0; return call Spi.sectorErase( STM25P_VMAP[ getVolumeId(id) ].base + m_addr + m_cur_len ); } async event void Spi.sectorEraseDone( uint8_t sector, error_t error ) { if ( ++m_cur_len < m_len ) call Spi.sectorErase( STM25P_VMAP[getVolumeId(m_client)].base + m_addr + m_cur_len ); else signalDone( error ); } command error_t Sector.computeCrc[ uint8_t id ]( uint16_t crc, stm25p_addr_t addr, stm25p_len_t len ) { m_state = S_CRC; m_addr = addr; m_len = len; return call Spi.computeCrc( crc, physicalAddr( id, addr ), m_len ); } async event void Spi.computeCrcDone( uint16_t crc, stm25p_addr_t addr, stm25p_len_t len, error_t error ) { m_crc = crc; signalDone( SUCCESS ); } async event void Spi.bulkEraseDone( error_t error ) { } void signalDone( error_t error ) { m_error = error; post signalDone_task(); } task void signalDone_task() { switch( m_state ) { case S_IDLE: signal ClientResource.granted[ m_client ](); break; case S_READ: signal Sector.readDone[ m_client ]( m_addr, m_buf, m_len, m_error ); break; case S_CRC: signal Sector.computeCrcDone[ m_client ]( m_addr, m_len, m_crc, m_error ); break; case S_WRITE: signal Sector.writeDone[ m_client ]( m_addr, m_buf, m_len, m_error ); break; case S_ERASE: signal Sector.eraseDone[ m_client ]( m_addr, m_len, m_error ); break; default: break; } } default event void ClientResource.granted[ uint8_t id ]() {} default event void Sector.readDone[ uint8_t id ]( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len, error_t error ) {} default event void Sector.writeDone[ uint8_t id ]( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len, error_t error ) {} default event void Sector.eraseDone[ uint8_t id ]( uint8_t sector, uint8_t num_sectors, error_t error ) {} default event void Sector.computeCrcDone[ uint8_t id ]( stm25p_addr_t addr, stm25p_len_t len, uint16_t crc, error_t error ) {} default async event volume_id_t Volume.getVolumeId[ uint8_t id ]() { return 0xff; } } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pSpi.nc000066400000000000000000000130151207233610700211160ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * SPI abstraction for the ST M25P family of serial code flash chips. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:13 $ */ interface Stm25pSpi { /** * Put chip into deep power down mode. * * @return SUCCESS if the request completed successfully, FAIL * otherwise. */ async command error_t powerDown(); /** * Release chip from power down mode. * * @return SUCCESS if the request completed successfully, FAIL * otherwise. */ async command error_t powerUp(); /** * Initiate a read operation. On SUCCESS, the readDone * event will be signalled when the operation completes. * * @param addr the physical address to start at. * @param buf pointer to data buffer. * @param len number of bytes to read. * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t read( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len ); /** * Signals the completion of a read operation. * * @param addr the starting physical address. * @param buf pointer to data buffer. * @param len number of bytes read. * @param error notification of how the operation went. */ async event void readDone( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len, error_t error ); /** * Initiate a crc computation. On SUCCESS, the * computeCrcDone event will be signalled when the * operation completes. * * @param crc starting crc value. * @param addr the starting physical address. * @param len the number of bytes to do crc computation over. * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t computeCrc( uint16_t crc, stm25p_addr_t addr, stm25p_len_t len ); /** * Signals the completion of a crc computation operation. * * @param crc resulting crc value. * @param addr the starting physical address. * @param len the number of bytes the crc was computed over. * @param error notification of how the operation went. */ async event void computeCrcDone( uint16_t crc, stm25p_addr_t addr, stm25p_len_t len, error_t error ); /** * Initiate a page program. On SUCCESS, the * pageProgramDone event will be signalled when the * operation completes. * * @param addr starting physical address. * @param buf pointer to data buffer. * @param len number of bytes to write. * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t pageProgram( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len ); /** * Signal the completion of a page program operation. * * @param addr starting physical address. * @param buf pointer to data buffer. * @param len number of bytes to write. * @param error notification of how the operation went. */ async event void pageProgramDone( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len, error_t error ); /** * Initiate a sector erase. On SUCCESS, the * sectorEraseDone event will be signalled when the * operation completes. * * @param sector physical sector to erase. * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t sectorErase( uint8_t sector ); /** * Signals the completion of a sector erase operation. * * @param sector physical sector erased * @param error notification of how the operation went. */ async event void sectorEraseDone( uint8_t sector, error_t error ); /** * Initiate a bulk erase. On SUCCESS, the bulkEraseDone * event will be signalled when the operation completes. * * @return SUCCESS if the request was accepted, FAIL otherwise. */ async command error_t bulkErase(); /** * Signals the completion of a bulk erase operation. * * @param error notification of how the operation went. */ async event void bulkEraseDone( error_t error ); } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pSpiC.nc000066400000000000000000000043701207233610700212250ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the SPI bus abstraction for the ST M25P serial * code flash. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:13 $ */ configuration Stm25pSpiC { provides interface Init; provides interface Resource; provides interface Stm25pSpi; } implementation { components Stm25pSpiP as SpiP; Init = SpiP; Resource = SpiP.ClientResource; Stm25pSpi = SpiP; components HplStm25pSpiC as SpiC; SpiP.SpiResource -> SpiC; SpiP.SpiByte -> SpiC; SpiP.SpiPacket -> SpiC; components HplStm25pPinsC as PinsC; SpiP.CSN -> PinsC.CSN; SpiP.Hold -> PinsC.Hold; components LedsC as Leds; SpiP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pSpiP.nc000066400000000000000000000163461207233610700212500ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:13 $ */ #include "crc.h" module Stm25pSpiP { provides interface Init; provides interface Resource as ClientResource; provides interface Stm25pSpi as Spi; uses interface Resource as SpiResource; uses interface GeneralIO as CSN; uses interface GeneralIO as Hold; uses interface SpiByte; uses interface SpiPacket; uses interface Leds; } implementation { enum { CRC_BUF_SIZE = 16, }; typedef enum { S_READ = 0x03, S_PAGE_PROGRAM = 0x02, S_SECTOR_ERASE = 0xd8, S_BULK_ERASE = 0xc7, S_WRITE_ENABLE = 0x06, S_POWER_ON = 0xab, S_DEEP_SLEEP = 0xb9, S_READ_STATUS = 0x05, } stm25p_cmd_t; enum { // this disables the Stm25pOff component STM25PON = unique("Stm25pOn") }; norace uint8_t m_cmd[ 4 ]; norace bool m_is_writing = FALSE; norace bool m_computing_crc = FALSE; bool m_init=FALSE; norace stm25p_addr_t m_addr; norace uint8_t* m_buf; norace stm25p_len_t m_len; norace stm25p_addr_t m_cur_addr; norace stm25p_len_t m_cur_len; norace uint8_t m_crc_buf[ CRC_BUF_SIZE ]; norace uint16_t m_crc; error_t newRequest( bool write, stm25p_len_t cmd_len ); void signalDone( error_t error ); uint8_t sendCmd( uint8_t cmd, uint8_t len ) { uint8_t tmp = 0; int i; call CSN.clr(); for ( i = 0; i < len; i++ ) tmp = call SpiByte.write( cmd ); call CSN.set(); return tmp; } command error_t Init.init() { call CSN.makeOutput(); call Hold.makeOutput(); call CSN.set(); call Hold.set(); if(call SpiResource.request()==SUCCESS) m_init=TRUE; //otherwise we can't put the chip to deep sleep return SUCCESS; } async command error_t ClientResource.request() { return call SpiResource.request(); } async command error_t ClientResource.immediateRequest() { return call SpiResource.immediateRequest(); } async command error_t ClientResource.release() { return call SpiResource.release(); } async command bool ClientResource.isOwner() { return call SpiResource.isOwner(); } stm25p_len_t calcReadLen() { return ( m_cur_len < CRC_BUF_SIZE ) ? m_cur_len : CRC_BUF_SIZE; } async command error_t Spi.powerDown() { sendCmd( S_DEEP_SLEEP, 1 ); return SUCCESS; } async command error_t Spi.powerUp() { sendCmd( S_POWER_ON, 5 ); return SUCCESS; } async command error_t Spi.read( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len ) { m_cmd[ 0 ] = S_READ; m_addr = addr; m_buf = buf; m_len = len; return newRequest( FALSE, 4 ); } async command error_t Spi.computeCrc( uint16_t crc, stm25p_addr_t addr, stm25p_len_t len ) { m_computing_crc = TRUE; m_crc = crc; m_addr = m_cur_addr = addr; m_len = m_cur_len = len; return call Spi.read( addr, m_crc_buf, calcReadLen() ); } async command error_t Spi.pageProgram( stm25p_addr_t addr, uint8_t* buf, stm25p_len_t len ) { m_cmd[ 0 ] = S_PAGE_PROGRAM; m_addr = addr; m_buf = buf; m_len = len; return newRequest( TRUE, 4 ); } async command error_t Spi.sectorErase( uint8_t sector ) { m_cmd[ 0 ] = S_SECTOR_ERASE; m_addr = (stm25p_addr_t)sector << STM25P_SECTOR_SIZE_LOG2; return newRequest( TRUE, 4 ); } async command error_t Spi.bulkErase() { m_cmd[ 0 ] = S_BULK_ERASE; return newRequest( TRUE, 1 ); } error_t newRequest( bool write, stm25p_len_t cmd_len ) { m_cmd[ 1 ] = m_addr >> 16; m_cmd[ 2 ] = m_addr >> 8; m_cmd[ 3 ] = m_addr; if ( write ) sendCmd( S_WRITE_ENABLE, 1 ); call CSN.clr(); call SpiPacket.send( m_cmd, NULL, cmd_len ); return SUCCESS; } void releaseAndRequest() { call SpiResource.release(); call SpiResource.request(); } async event void SpiPacket.sendDone( uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len, error_t error ) { int i; switch( m_cmd[ 0 ] ) { case S_READ: if ( tx_buf == m_cmd ) { call SpiPacket.send( NULL, m_buf, m_len ); break; } else if ( m_computing_crc ) { for ( i = 0; i < len; i++ ) m_crc = crcByte( m_crc, m_crc_buf[ i ] ); m_cur_addr += len; m_cur_len -= len; if ( m_cur_len ) { call SpiPacket.send( NULL, m_crc_buf, calcReadLen() ); break; } } call CSN.set(); signalDone( SUCCESS ); break; case S_PAGE_PROGRAM: if ( tx_buf == m_cmd ) { call SpiPacket.send( m_buf, NULL, m_len ); break; } // fall through case S_SECTOR_ERASE: case S_BULK_ERASE: call CSN.set(); m_is_writing = TRUE; releaseAndRequest(); break; default: break; } } event void SpiResource.granted() { if (m_init) { m_init=FALSE; call Spi.powerDown(); call SpiResource.release(); } else if ( !m_is_writing ) signal ClientResource.granted(); else if ( sendCmd( S_READ_STATUS, 2 ) & 0x1 ) releaseAndRequest(); else signalDone( SUCCESS ); } void signalDone( error_t error ) { m_is_writing = FALSE; switch( m_cmd[ 0 ] ) { case S_READ: if ( m_computing_crc ) { m_computing_crc = FALSE; signal Spi.computeCrcDone( m_crc, m_addr, m_len, error ); } else { signal Spi.readDone( m_addr, m_buf, m_len, error ); } break; case S_PAGE_PROGRAM: signal Spi.pageProgramDone( m_addr, m_buf, m_len, error ); break; case S_SECTOR_ERASE: signal Spi.sectorEraseDone( m_addr >> STM25P_SECTOR_SIZE_LOG2, error ); break; case S_BULK_ERASE: signal Spi.bulkEraseDone( error ); break; } } } tinyos-2.1.2+dfsg/tos/chips/stm25p/Stm25pVolume.nc000066400000000000000000000036431207233610700216400ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Abstraction to provide the id of a volume. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:13 $ */ #include "Stm25p.h" interface Stm25pVolume { /** * Signals a request to provide the id of a volume. * * @return the id of the volume. */ async event volume_id_t getVolumeId(); } tinyos-2.1.2+dfsg/tos/chips/stm25p/StorageMap.nc000066400000000000000000000037571207233610700214260ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * An abstraction to map volume addresses to physical addresses. * * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2007-04-02 05:03:07 $ */ #include "Stm25p.h" interface StorageMap { /** * Get the physical address of a volume address. * * @param addr the volume addres. * @return the physical address. */ command storage_addr_t getPhysicalAddress( storage_addr_t addr ); } tinyos-2.1.2+dfsg/tos/chips/stm25p/Storage_chip.h000066400000000000000000000033461207233610700216140ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:13 $ */ #ifndef __STORAGE_CHIP_H__ #define __STORAGE_CHIP_H__ #endif tinyos-2.1.2+dfsg/tos/chips/tda5250/000077500000000000000000000000001207233610700167605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/tda5250/ClkDiv.nc000066400000000000000000000050071207233610700204600ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Revision: 1.1 $ * $Date: 2007-03-10 22:01:58 $ */ /** * This radio provides a clock divider output that can be used to drive * a high frequency clock of an micro processor. * @author: Andreas Koepke */ interface ClkDiv { /** * this event signals that the clkdiv delivers a stable signal */ async event void startDone(); /** * this event signals that the clkdiv will stop to deliver a stable signal */ async event void stopping(); /** * From now on, never switch the clkdiv off -- consumes more energy! * This command may take a while until it takes effect. */ // command void alwaysOnMode(); /** * Return to default mode: clkdiv is switched on when the radio demands * it, other components will get the start/stop events and hence know what * is going on now. */ // command void sporadicMode(); } tinyos-2.1.2+dfsg/tos/chips/tda5250/HplTda5250Config.nc000066400000000000000000000354671207233610700221370ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * @author: Kevin Klues (klues@tkn.tu-berlin.de) * ======================================================================== */ #include "tda5250Const.h" /** * This interface provides commands and events for configureing the radio modes. * * @author Kevin Klues */ interface HplTda5250Config { /** * Resets all Radio Registers to default values. * The default values can be found in tda5250RegDefaults.h */ async command void reset(); /** * Set the data slicer to use the RC integrator. * The data slicer is an analog-to-digital converter for the radio data. * When using RC integrator the mean value of the analog data is used * to convert the analog data to a Bit. */ async command void UseRCIntegrator(); /** * Set the data slicer to use the Peak Detector. * The data slicer is an analog-to-digital converter for the radio data. * When using peak detector the peak value of the analog data is used * to convert the analog data to a Bit. */ async command void UsePeakDetector(); /** * Powers the radio down. */ async command void PowerDown(); /** * Powers the radio up. */ async command void PowerUp(); /** * Switch radio to test operation. * FIXME: Whatever this means... */ async command void RunInTestMode(); /** * Switches the radio to normal operation. */ async command void RunInNormalMode(); /** * Control the radio Tx and Rx mode externally. */ async command void ControlRxTxExternally(); /** * Control the radio Tx and Rx mode internally. */ async command void ControlRxTxInternally(); /** * Use FSK modulation. * * @param pos_shift Capacitor value for positive shift. * @param neg_shift Capacitor value for negative shift. */ async command void UseFSK(tda5250_cap_vals_t pos_shift, tda5250_cap_vals_t neg_shift); /** * Use ASK mosulation. * * @param pos_shift Capacitor value for positive shift. (FIXME: makes sense?) */ async command void UseASK(tda5250_cap_vals_t pos_shift); /** * Disables internal clock during power down. */ async command void SetClockOffDuringPowerDown(); /** * Enables internal clock during power down. */ async command void SetClockOnDuringPowerDown(); /** * Enables inverting the radio data. */ async command void InvertData(); /** * Disables inverting radio data. */ async command void DontInvertData(); /** * Use the RSSI data valid detection. * For the data valid detection 3 thresholds must be defined. * The data is only considered valid if the RSSI is greater than RSSI threshold * and the data rate is between the lower and upper data rate threshold. * * @param value The RSSI threshold for valid data. * @param lower_bound Lower data rate threshold. * @param upper_bound Upper data rate threshold. */ async command void UseRSSIDataValidDetection(uint8_t value, uint16_t lower_bound, uint16_t upper_bound); /** * Use the Vcc data valid detection. * For the data valid detection 3 thresholds must be defined. * The data is only considered valid if the voltage is greater than voltage threshold * and the data rate is between the lower and upper data rate threshold. * * @param value The voltage threshold for valid data. * @param lower_bound Lower data rate threshold. * @param upper_bound Upper data rate threshold. */ async command void UseVCCDataValidDetection(uint8_t value, uint16_t lower_bound, uint16_t upper_bound); /** * Use the data valid detection. * This means that the receiving data is checked either by RSSI data valid detection or * by Vcc data valid detection if it is actual data and no noise. */ async command void UseDataValidDetection(); /** Do not use data valid detection. * This means that it is assumed that the receiving data is * always valid data. * It is absolutely necessary to * set the RSSI-ADC (and the Window counter) into continuous mode. */ async command void UseDataAlwaysValid(); /** * Sets the ADC to continious mode. * Analog sampling data is taken continously. */ async command void ADCContinuousMode(); /** * Sets the ADC to one shot mode. * The sampling data is taken in one shot. */ async command void ADCOneShotMode(); /** * Sets the data calid detection in continous mode. */ async command void DataValidContinuousMode(); /** * Sets the data calid detection in one shot mode. */ async command void DataValidOneShotMode(); /** * Sets the low noise amplifier to high gain */ async command void HighLNAGain(); /** * Sets the low noise amplifier to low gain */ async command void LowLNAGain(); /** * Enables the receiver when in TIMER_MODE or SELF_POLLING_MODE. */ async command void EnableReceiverInTimedModes(); /** * Disables the receiver when in TIMER_MODE or SELF_POLLING_MODE. */ async command void DisableReceiverInTimedModes(); /** * Use high transmit power. */ async command void UseHighTxPower(); /** * Use low transmit power. */ async command void UseLowTxPower(); /** * Tune the nominal frequency with a Bipolar FET. * * @param ramp_time Ramp time. * @param cap_val Capacitor value. */ async command void TuneNomFreqWithBipolarFET(tda5250_bipolar_fet_ramp_times_t ramp_time, tda5250_cap_vals_t cap_val); /** * Tune the nominal frequency with a FET * * @param cap_val Capacitor value. */ async command void TuneNomFreqWithFET(tda5250_cap_vals_t cap_val); /** * Set the mode of the radio to SlaveMode. */ async command void SetSlaveMode(); /** * Set the mode of the radio to TimerMode. * * @param on_time The time (ms) the radio is on. * @param off_time The time (ms) the radio is off. */ async command void SetTimerMode(float on_time, float off_time); /** * Resets the timers set in SetTimerMode(). */ async command void ResetTimerMode(); /** * Set the mode of the radio to SetSelfPollingMode. * * @param on_time The time (ms) the radio is on. * @param off_time The time (ms) the radio is off. */ async command void SetSelfPollingMode(float on_time, float off_time); /** * Reset the timers set in SetSelfPollingMode. */ async command void ResetSelfPollingMode(); /** * Set the contents of the LPF register with the Low pass filter * * @param data_cutoff LowPassFilter characteristics. For recognized values see tda5250Const.h */ async command void SetLowPassFilter(tda5250_data_cutoff_freqs_t data_cutoff); /** * Set the contents of the LPF register with the IQ filter value. * * @param iq_cutoff IQ filter characteristics. For recognized values see tda5250Const.h */ async command void SetIQFilter(tda5250_iq_cutoff_freqs_t iq_cutoff); /** * Set the on time time of the radio. * This only makes sense when radio is in TIMER or SELF_POLLING Mode. * * @param time The time (ms) the radio is on. */ async command void SetOnTime_ms(float time); /** * Set the off time time of the radio. * This only makes sense when radio is in TIMER or SELF_POLLING Mode. * * @param time The time (ms) the radio is off. */ async command void SetOffTime_ms(float time); /** * Initialzes the CLK_DIV so that SetRadioClock(tda5250_clock_out_freqs_t freq) * can be used. */ async command void UseSetClock(); /** * Sets the CLK_DIV to specified output. UseSetClock() must be called before! * Available frequencies given in TDA5250ClockFreq_t struct in tda5250Const.h. * * @param freq The new clock frequency (see tda5250.h). */ async command void SetRadioClock(tda5250_clock_out_freqs_t freq); /** * Sets the CLK_DIV to 18Mhz output. */ async command void Use18MHzClock(); /** * Sets the CLK_DIV to 32Khz output. */ async command void Use32KHzClock(); /** * Sets the CLK_DIV to use window count as output. */ async command void UseWindowCountAsClock(); /** * Set the value on the attached Potentiometer * for the RF Power setting. * * @param RF Power. */ async command void SetRFPower(uint8_t value); /** * Sets the RSSI threshold for internal evaluation. * * @param RSSI threshold value. */ async command void SetRSSIThreshold(uint8_t value); /** * Sets the threshold values for internal evaluation. * (FIXME: what threshold is set with this?) * * @param value Threshold value. */ async command void SetVCCOver5Threshold(uint8_t value); /** * Sets the lower data rate threshold for data valid detection. * * @param Lower data rate threshold value. */ async command void SetLowerDataRateThreshold(uint16_t value); /** * Sets the upper data rate threshold for data valid detection. * * @param Upper data rate threshold value. */ async command void SetUpperDataRateThreshold(uint16_t value); /** * Gets the currnet RSSI value. * * @return Current RSSI. */ async command uint8_t GetRSSIValue(); /** * Gets the current status of the ADC select feedback Bit. * The ADC select feedback Bit is "0" if the ADC is connected to * a resistor network dividing the Vcc voltage by 5. * The ADC select feedback Bit is "1" if the ADC is connected to * the RSSI voltage. * * @return "0" if ADC connected to Vcc/5. * "1" if ADC connected to RSSI voltage. */ async command uint8_t GetADCSelectFeedbackBit(); /** * Gets the current status of the ADC Power down feedback Bit. * The ADC Power down feedback Bit is "0" if ADC power is up. * It is "1" if ADC power is down. * * @return "0" if ADC power is up * "1" otherwise. */ async command uint8_t GetADCPowerDownFeedbackBit(); /** * Checks if the data rate is less than the lower threshold set by * SetLowerDataRateThreshold(uint16_t value). * * @return TRUE if data rate is less than lower threshold * FALSE otherwise. */ async command bool IsDataRateLessThanLowerThreshold(); /** * Checks if the data rate is between the lower threshold set by * SetLowerDataRateThreshold(uint16_t value) and upper threshold set by * SetUpperDataRateThreshold(uint16_t value). * * @return TRUE if data rate is between the lower and upper threshold * FALSE otherwise. */ async command bool IsDataRateBetweenThresholds(); /** * Checks if the data rate is less than the upper threshold set by * SetUpperDataRateThreshold(uint16_t value). * * @return TRUE if data rate is less than upper threshold * FALSE otherwise. */ async command bool IsDataRateLessThanUpperThreshold(); /** * Checks if the data rate is less than half of the lower threshold set by * SetLowerDataRateThreshold(uint16_t value). * * @return TRUE if data rate is less than half of the lower threshold * FALSE otherwise. */ async command bool IsDataRateLessThanHalfOfLowerThreshold(); /** * Checks if the data rate is between the halves of the lower threshold set by * SetLowerDataRateThreshold(uint16_t value) and the upper threshold set by * SetUpperDataRateThreshold(uint16_t value). * * @return TRUE if the data rate is between the halves of the lower and upper threshold * FALSE otherwise. */ async command bool IsDataRateBetweenHalvesOfThresholds(); /** * Checks if the data rate is half of the upper threshold set by * SetUpperDataRateThreshold(uint16_t value). * * @return TRUE if data rate is less than half of the upper threshold * FALSE otherwise. */ async command bool IsDataRateLessThanHalfOfUpperThreshold(); /** * Checks if the current RSSI equals the threshold set * with SetRSSIThreshold(uint8_t value). * * @return TRUE if RSSI equals the threshold value * FALSE otherwise. */ async command bool IsRSSIEqualToThreshold(); /** * Checks if the current RSSI is graeter than the threshold set * with SetRSSIThreshold(uint8_t value). * * @return TRUE if RSSI greater than threshold value * FALSE otherwise. */ async command bool IsRSSIGreaterThanThreshold(); /** * Checks if the Tx Rx and Sleep radiomodes can be set via pin. * This only concerns SetTxMode(), SetRxMode() and SetSleepMode(). * * @return TRUE if radiomodes can be set via pin * FALSE otherwise. */ async command bool IsTxRxPinControlled(); /** * Switches the radio to TxMode when in SLAVE_MODE */ async command void SetTxMode(); /** * Switches the radio to RxMode when in SLAVE_MODE */ async command void SetRxMode(); /** * Switches the radio to SleepMode when in SLAVE_MODE */ async command void SetSleepMode(); /** * Notification of interrupt when in * TimerMode or SelfPollingMode. */ async event void PWDDDInterrupt(); } tinyos-2.1.2+dfsg/tos/chips/tda5250/HplTda5250ConfigC.nc000066400000000000000000000067701207233610700222350ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * ======================================================================== */ /** * Controlling the TDA5250 at the HPL layer. * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ #include "tda5250Const.h" #include "tda5250RegDefaultSettings.h" #include "tda5250RegTypes.h" configuration HplTda5250ConfigC { provides { interface Init; interface HplTda5250Config; interface Resource as Resource; } } implementation { components HplTda5250ConfigP , Tda5250RegistersC , Tda5250RadioIOC , Tda5250RadioInterruptC ; Init = HplTda5250ConfigP; Init = Tda5250RegistersC; Resource = Tda5250RegistersC.Resource; HplTda5250Config = HplTda5250ConfigP; HplTda5250ConfigP.CONFIG -> Tda5250RegistersC.CONFIG; HplTda5250ConfigP.FSK -> Tda5250RegistersC.FSK; HplTda5250ConfigP.XTAL_TUNING -> Tda5250RegistersC.XTAL_TUNING; HplTda5250ConfigP.LPF -> Tda5250RegistersC.LPF; HplTda5250ConfigP.ON_TIME -> Tda5250RegistersC.ON_TIME; HplTda5250ConfigP.OFF_TIME -> Tda5250RegistersC.OFF_TIME; HplTda5250ConfigP.COUNT_TH1 -> Tda5250RegistersC.COUNT_TH1; HplTda5250ConfigP.COUNT_TH2 -> Tda5250RegistersC.COUNT_TH2; HplTda5250ConfigP.RSSI_TH3 -> Tda5250RegistersC.RSSI_TH3; HplTda5250ConfigP.RF_POWER -> Tda5250RegistersC.RF_POWER; HplTda5250ConfigP.CLK_DIV -> Tda5250RegistersC.CLK_DIV; HplTda5250ConfigP.XTAL_CONFIG -> Tda5250RegistersC.XTAL_CONFIG; HplTda5250ConfigP.BLOCK_PD -> Tda5250RegistersC.BLOCK_PD; HplTda5250ConfigP.STATUS -> Tda5250RegistersC.STATUS; HplTda5250ConfigP.ADC -> Tda5250RegistersC.ADC; HplTda5250ConfigP.ASKNFSK -> Tda5250RadioIOC.Tda5250RadioPASKNFSK; HplTda5250ConfigP.PWDDD -> Tda5250RadioIOC.Tda5250RadioPWDDD; HplTda5250ConfigP.TXRX -> Tda5250RadioIOC.Tda5250RadioTXRX; HplTda5250ConfigP.PWDDDInterrupt -> Tda5250RadioInterruptC; } tinyos-2.1.2+dfsg/tos/chips/tda5250/HplTda5250ConfigP.nc000066400000000000000000000457131207233610700222520ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2008-06-13 13:40:59 $ * ======================================================================== */ /** * HplTda5250ConfigP module * * @author Kevin Klues (klues@tkn.tu-berlin.de) * @author Philipp Huppertz (huppertz@tkn.tu-berlin.de) */ module HplTda5250ConfigP { provides { interface Init; interface HplTda5250Config; } uses { interface Tda5250WriteReg as CONFIG; interface Tda5250WriteReg as FSK; interface Tda5250WriteReg as XTAL_TUNING; interface Tda5250WriteReg as LPF; interface Tda5250WriteReg as ON_TIME; interface Tda5250WriteReg as OFF_TIME; interface Tda5250WriteReg as COUNT_TH1; interface Tda5250WriteReg as COUNT_TH2; interface Tda5250WriteReg as RSSI_TH3; interface Tda5250WriteReg as RF_POWER; interface Tda5250WriteReg as CLK_DIV; interface Tda5250WriteReg as XTAL_CONFIG; interface Tda5250WriteReg as BLOCK_PD; interface Tda5250ReadReg as STATUS; interface Tda5250ReadReg as ADC; interface GeneralIO as ASKNFSK; interface GeneralIO as TXRX; interface GeneralIO as PWDDD; interface GpioInterrupt as PWDDDInterrupt; } } implementation { /**************************************************************************************************** ** ** ** ** ** Important !!! Only function marked with << tested >> are potentially working! ** ** ** ** ** *****************************************************************************************************/ /**************************************************************** Global Variables Declared *****************************************************************/ norace uint16_t currentConfig = TDA5250_REG_DEFAULT_SETTING_CONFIG; uint8_t currentClockDiv; norace uint8_t currentLpf = TDA5250_REG_DEFAULT_SETTING_LPF; /**************************************************************** async commands Implemented *****************************************************************/ /** * Initializes the Radio, setting up all Pin configurations * to the MicroProcessor that is driving it and resetting * all Registers to their default values * * @return always returns SUCCESS */ command error_t Init.init() { // setting pins to output call TXRX.makeOutput(); call PWDDD.makeOutput(); // initializing pin values call TXRX.set(); call PWDDD.clr(); return SUCCESS; } /** * Reset all Radio Registers to the default values as defined * in the tda5250RegDefaults.h file * << tested >> */ async command void HplTda5250Config.reset() { //Keep three state variables to know current value of //config register, ClockDiv, and Lpf register atomic { currentConfig = TDA5250_REG_DEFAULT_SETTING_CONFIG; currentClockDiv = TDA5250_REG_DEFAULT_SETTING_CLK_DIV; currentLpf = TDA5250_REG_DEFAULT_SETTING_LPF; } call CONFIG.set(TDA5250_REG_DEFAULT_SETTING_CONFIG); call FSK.set(TDA5250_REG_DEFAULT_SETTING_FSK); call XTAL_TUNING.set(TDA5250_REG_DEFAULT_SETTING_XTAL_TUNING); call LPF.set(TDA5250_REG_DEFAULT_SETTING_LPF); call ON_TIME.set(TDA5250_REG_DEFAULT_SETTING_ON_TIME); call OFF_TIME.set(TDA5250_REG_DEFAULT_SETTING_OFF_TIME); call COUNT_TH1.set(TDA5250_REG_DEFAULT_SETTING_COUNT_TH1); call COUNT_TH2.set(TDA5250_REG_DEFAULT_SETTING_COUNT_TH2); call RSSI_TH3.set(TDA5250_REG_DEFAULT_SETTING_RSSI_TH3); call CLK_DIV.set(TDA5250_REG_DEFAULT_SETTING_CLK_DIV); call XTAL_CONFIG.set(TDA5250_REG_DEFAULT_SETTING_XTAL_CONFIG); call BLOCK_PD.set(TDA5250_REG_DEFAULT_SETTING_BLOCK_PD); } async command void HplTda5250Config.SetLowPassFilter(tda5250_data_cutoff_freqs_t data_cutoff){ currentLpf = (((data_cutoff << 4) | (currentLpf & 0x0F))); call LPF.set(currentLpf); } async command void HplTda5250Config.SetIQFilter(tda5250_iq_cutoff_freqs_t iq_cutoff){ currentLpf = (((iq_cutoff & 0x0F) | (currentLpf & 0xF0))); call LPF.set(currentLpf); } async command void HplTda5250Config.UseRCIntegrator() { currentConfig = CONFIG_SLICER_RC_INTEGRATOR(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.UsePeakDetector() { currentConfig = CONFIG_SLICER_PEAK_DETECTOR(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.PowerDown() { currentConfig = CONFIG_ALL_PD_POWER_DOWN(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.PowerUp() { currentConfig = CONFIG_ALL_PD_NORMAL(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.RunInTestMode() { currentConfig = CONFIG_TESTMODE_TESTMODE(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.RunInNormalMode() { currentConfig = CONFIG_TESTMODE_NORMAL(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.ControlRxTxExternally() { currentConfig = CONFIG_CONTROL_TXRX_EXTERNAL(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.ControlRxTxInternally() { currentConfig = CONFIG_CONTROL_TXRX_REGISTER(currentConfig); call CONFIG.set(currentConfig); } /* << tested >> */ async command void HplTda5250Config.UseFSK(tda5250_cap_vals_t pos_shift, tda5250_cap_vals_t neg_shift) { currentConfig = CONFIG_ASK_NFSK_FSK(currentConfig); if(currentConfig & MASK_CONFIG_CONTROL_TXRX_REGISTER) { call CONFIG.set(currentConfig); } else { call ASKNFSK.clr(); } call FSK.set(((uint16_t)((((uint16_t)pos_shift) << 8) + neg_shift))); } /* << tested >> */ async command void HplTda5250Config.UseASK(tda5250_cap_vals_t value) { currentConfig = CONFIG_ASK_NFSK_ASK(currentConfig); if(currentConfig & MASK_CONFIG_CONTROL_TXRX_REGISTER) { call CONFIG.set(currentConfig); } else { call ASKNFSK.set(); } call FSK.set((((uint16_t)value) << 8)); } async command void HplTda5250Config.SetClockOffDuringPowerDown() { currentConfig = CONFIG_CLK_EN_OFF(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.SetClockOnDuringPowerDown() { currentConfig = CONFIG_CLK_EN_ON(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.InvertData() { currentConfig = CONFIG_RX_DATA_INV_YES(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.DontInvertData() { currentConfig = CONFIG_RX_DATA_INV_NO(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.UseRSSIDataValidDetection(uint8_t value, uint16_t lower_bound, uint16_t upper_bound) { currentConfig = CONFIG_D_OUT_IFVALID(currentConfig); call CONFIG.set(currentConfig); call COUNT_TH1.set(lower_bound); call COUNT_TH2.set(upper_bound); call RSSI_TH3.set(0xC0 | value); } async command void HplTda5250Config.UseVCCDataValidDetection(uint8_t value, uint16_t lower_bound, uint16_t upper_bound) { currentConfig = CONFIG_D_OUT_IFVALID(currentConfig); call CONFIG.set(currentConfig); call COUNT_TH1.set(lower_bound); call COUNT_TH2.set(upper_bound); call RSSI_TH3.set(0x3F & value); } async command void HplTda5250Config.UseDataValidDetection() { currentConfig = CONFIG_D_OUT_IFVALID(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.UseDataAlwaysValid() { currentConfig = CONFIG_D_OUT_ALWAYS(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.ADCContinuousMode() { currentConfig = CONFIG_ADC_MODE_CONT(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.ADCOneShotMode() { currentConfig = CONFIG_ADC_MODE_ONESHOT(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.DataValidContinuousMode() { currentConfig = CONFIG_F_COUNT_MODE_CONT(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.DataValidOneShotMode() { currentConfig = CONFIG_F_COUNT_MODE_ONESHOT(currentConfig); call CONFIG.set(currentConfig); } /* <> */ async command void HplTda5250Config.HighLNAGain() { currentConfig = CONFIG_LNA_GAIN_HIGH(currentConfig); call CONFIG.set(currentConfig); } /* <> */ async command void HplTda5250Config.LowLNAGain() { currentConfig = CONFIG_LNA_GAIN_LOW(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.EnableReceiverInTimedModes() { currentConfig = CONFIG_EN_RX_ENABLE(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.DisableReceiverInTimedModes() { currentConfig = CONFIG_EN_RX_DISABLE(currentConfig); call CONFIG.set(currentConfig); } /* <> */ async command void HplTda5250Config.UseHighTxPower() { currentConfig = CONFIG_PA_PWR_HIGHTX(currentConfig); call CONFIG.set(currentConfig); } /* <> */ async command void HplTda5250Config.UseLowTxPower() { currentConfig = CONFIG_PA_PWR_LOWTX(currentConfig); call CONFIG.set(currentConfig); } async command void HplTda5250Config.TuneNomFreqWithBipolarFET(tda5250_bipolar_fet_ramp_times_t ramp_time, tda5250_cap_vals_t cap_val) { call XTAL_CONFIG.set(ramp_time); call XTAL_CONFIG.set(((uint16_t)cap_val) & 0x003F); } async command void HplTda5250Config.TuneNomFreqWithFET(tda5250_cap_vals_t cap_val) { call XTAL_CONFIG.set(0x00); call XTAL_CONFIG.set(((uint16_t)cap_val) & 0x003F); } /* <> */ async command void HplTda5250Config.SetRFPower(uint8_t value) { call RF_POWER.set(value); } /** Set the mode of the radio The choices are SLAVE_MODE, TIMER_MODE, SELF_POLLING_MODE */ /* << tested >> */ async command void HplTda5250Config.SetSlaveMode() { call PWDDDInterrupt.disable(); call PWDDD.makeOutput(); call PWDDD.clr(); currentConfig = CONFIG_MODE_1_SLAVE_OR_TIMER(currentConfig); currentConfig = CONFIG_MODE_2_SLAVE(currentConfig); // SetSlaveMode() is always called in conjunction with another function that writes the config... // call CONFIG.set(currentConfig); } async command void HplTda5250Config.SetTimerMode(float on_time, float off_time) { call PWDDD.clr(); call ON_TIME.set(TDA5250_CONVERT_TIME(on_time)); call OFF_TIME.set(TDA5250_CONVERT_TIME(off_time)); currentConfig = CONFIG_MODE_1_SLAVE_OR_TIMER(currentConfig); currentConfig = CONFIG_MODE_2_TIMER(currentConfig); call CONFIG.set(currentConfig); call TXRX.set(); call PWDDD.makeInput(); call PWDDDInterrupt.enableFallingEdge(); } async command void HplTda5250Config.ResetTimerMode() { call PWDDD.clr(); currentConfig = CONFIG_MODE_1_SLAVE_OR_TIMER(currentConfig); currentConfig = CONFIG_MODE_2_TIMER(currentConfig); call CONFIG.set(currentConfig); call PWDDD.makeInput(); call PWDDDInterrupt.enableFallingEdge(); } async command void HplTda5250Config.SetSelfPollingMode(float on_time, float off_time) { call PWDDD.clr(); call ON_TIME.set(TDA5250_CONVERT_TIME(on_time)); call OFF_TIME.set(TDA5250_CONVERT_TIME(off_time)); currentConfig = CONFIG_MODE_1_SELF_POLLING(currentConfig); call CONFIG.set(currentConfig); call TXRX.set(); call PWDDD.makeInput(); call PWDDDInterrupt.enableFallingEdge(); } async command void HplTda5250Config.ResetSelfPollingMode() { call PWDDD.clr(); currentConfig = CONFIG_MODE_1_SELF_POLLING(currentConfig); call CONFIG.set(currentConfig); call TXRX.set(); call PWDDD.makeInput(); call PWDDDInterrupt.enableFallingEdge(); } /** Set the on time and off time of the radio (Only makes sense when in TIMER or SELF_POLLING Mode) */ async command void HplTda5250Config.SetOnTime_ms(float time) { call ON_TIME.set(TDA5250_CONVERT_TIME(time)); } async command void HplTda5250Config.SetOffTime_ms(float time) { call OFF_TIME.set(TDA5250_CONVERT_TIME(time)); } /** Set the frequency that the CLK_DIV outputs (Available frequencies given in Tda5250ClockFreq_t struct) */ async command void HplTda5250Config.UseSetClock() { currentClockDiv &= 0x0F; call CLK_DIV.set(currentClockDiv); } async command void HplTda5250Config.Use18MHzClock() { currentClockDiv |= 0x10; currentClockDiv &= 0x1F; call CLK_DIV.set(currentClockDiv); } async command void HplTda5250Config.Use32KHzClock() { currentClockDiv |= 0x20; currentClockDiv &= 0x2F; call CLK_DIV.set(currentClockDiv); } async command void HplTda5250Config.UseWindowCountAsClock() { currentClockDiv |= 0x30; call CLK_DIV.set(currentClockDiv); } async command void HplTda5250Config.SetRadioClock(tda5250_clock_out_freqs_t freq) { currentClockDiv = (currentClockDiv & 0x30) + freq; call CLK_DIV.set(currentClockDiv); } /** Sets the threshold Values for internal evaluation */ /* <> */ async command void HplTda5250Config.SetRSSIThreshold(uint8_t value) { call RSSI_TH3.set(0xC0 | value); } async command void HplTda5250Config.SetVCCOver5Threshold(uint8_t value) { call RSSI_TH3.set(0x3F & value); } async command void HplTda5250Config.SetLowerDataRateThreshold(uint16_t value) { call COUNT_TH1.set(value); } async command void HplTda5250Config.SetUpperDataRateThreshold(uint16_t value) { call COUNT_TH2.set(value); } /** Get parts of certain registers according to their logical functionality */ async command uint8_t HplTda5250Config.GetRSSIValue() { return (0x3F & call ADC.get()); } async command uint8_t HplTda5250Config.GetADCSelectFeedbackBit() { return ((0x40 & call ADC.get()) >> 6); } async command uint8_t HplTda5250Config.GetADCPowerDownFeedbackBit() { return ((0x80 & call ADC.get()) >> 7); } async command bool HplTda5250Config.IsDataRateLessThanLowerThreshold() { if((0x80 & call STATUS.get()) == TRUE) return TRUE; return FALSE; } async command bool HplTda5250Config.IsDataRateBetweenThresholds() { if((0x40 & call STATUS.get()) == TRUE) return TRUE; return FALSE; } async command bool HplTda5250Config.IsDataRateLessThanUpperThreshold() { if((0x20 & call STATUS.get()) == TRUE) return TRUE; return FALSE; } async command bool HplTda5250Config.IsDataRateLessThanHalfOfLowerThreshold() { if((0x10 & call STATUS.get()) == TRUE) return TRUE; return FALSE; } async command bool HplTda5250Config.IsDataRateBetweenHalvesOfThresholds() { if((0x08 & call STATUS.get()) == TRUE) return TRUE; return FALSE; } async command bool HplTda5250Config.IsDataRateLessThanHalfOfUpperThreshold() { if((0x04 & call STATUS.get()) == TRUE) return TRUE; return FALSE; } async command bool HplTda5250Config.IsRSSIEqualToThreshold() { if((0x02 & call STATUS.get()) == TRUE) return TRUE; return FALSE; } async command bool HplTda5250Config.IsRSSIGreaterThanThreshold() { if((0x01 & call STATUS.get()) == TRUE) return TRUE; return FALSE; } /** Switches radio between states when in SLAVE_MODE */ /* << tested >> */ async command void HplTda5250Config.SetTxMode() { currentConfig = CONFIG_RX_NTX_TX(currentConfig); currentConfig = CONFIG_ALL_PD_NORMAL(currentConfig); if (currentConfig & MASK_CONFIG_CONTROL_TXRX_REGISTER) { call CONFIG.set(currentConfig); } else { call TXRX.clr(); call PWDDD.clr(); } } /* << tested >> */ async command void HplTda5250Config.SetRxMode() { currentConfig = CONFIG_RX_NTX_RX(currentConfig); currentConfig = CONFIG_ALL_PD_NORMAL(currentConfig); if (currentConfig & MASK_CONFIG_CONTROL_TXRX_REGISTER) { call CONFIG.set(currentConfig); } else { call TXRX.set(); call PWDDD.clr(); } } /* << tested >> */ async command void HplTda5250Config.SetSleepMode() { currentConfig = CONFIG_ALL_PD_POWER_DOWN(currentConfig); call PWDDD.makeOutput(); call PWDDD.set(); } async command bool HplTda5250Config.IsTxRxPinControlled() { return (currentConfig & MASK_CONFIG_CONTROL_TXRX_REGISTER); } /**************************************************************** Events Implemented ************************************************/ /** Interrupt Signal on PWD_DD pin in TIMER_MODE and SELF_POLLING_MODE */ async event void PWDDDInterrupt.fired() { signal HplTda5250Config.PWDDDInterrupt(); } default async event void HplTda5250Config.PWDDDInterrupt() {} } tinyos-2.1.2+dfsg/tos/chips/tda5250/HplTda5250Data.nc000066400000000000000000000064011207233610700215650ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * ======================================================================== */ /** * Interface for sending and receiving bytes of data over the TDA5250 Radio. * This interface lets you receive and send bytes of data. * In conjunction to this the HplTda5250DataControl interface is used to * switch between receiving and sending. * * @see HplTda5250DataControl * @author Kevin Klues (klues@tkn.tu-berlin.de) */ interface HplTda5250Data { /** * Transmit a byte of data over the radio. * Before you call this command you must switch * the radio to Tx mode via the HplTda5250DataControl * interface. * @param data The data byte to be transmitted. * @return SUCCESS Byte successfully transmitted. FAIL Byte could not be transmitted. */ async command error_t tx(uint8_t data); /** * Signalled when the next byte can be made ready to transmit. * Receiving such an event does not guarantee that the previous * byte has already been transmitted, just that the next one can * now be handed over for transmission. */ async event void txReady(); /** * Command for querying whether any bytes are still waiting to be transmitted. * * @return TRUE if all bytes are trasnmitted * FALSE otherwise. */ //async command bool isTxDone(); /** * Signaled when a byte of data has been received from the radio. * Before you call this command you must switch * the radio to Rx mode via the HplTda5250DataControl * interface. * @param data The data byte received. */ async event void rxDone(uint8_t data); } tinyos-2.1.2+dfsg/tos/chips/tda5250/HplTda5250DataC.nc000066400000000000000000000052261207233610700216740ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * ======================================================================== */ /** * Controlling the TDA5250 at the HPL layer. * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ configuration HplTda5250DataC { provides { interface Init; interface HplTda5250Data; interface HplTda5250DataControl; interface ResourceRequested; interface Resource as Resource; } } implementation { components HplTda5250DataP, Tda5250RadioIOC, HplTda5250DataIOC; Init = HplTda5250DataP; Resource = HplTda5250DataP.Resource; ResourceRequested = HplTda5250DataP.ResourceRequested; HplTda5250Data = HplTda5250DataP; HplTda5250DataControl = HplTda5250DataP; HplTda5250DataP.DATA -> Tda5250RadioIOC.Tda5250RadioDATA; HplTda5250DataP.Uart -> HplTda5250DataIOC.UartStream; HplTda5250DataP.UartDataControl -> HplTda5250DataIOC.UartDataControl; HplTda5250DataP.UartResource -> HplTda5250DataIOC.Resource; HplTda5250DataP.UartResourceRequested -> HplTda5250DataIOC.ResourceRequested; } tinyos-2.1.2+dfsg/tos/chips/tda5250/HplTda5250DataControl.nc000066400000000000000000000012221207233610700231220ustar00rootroot00000000000000 /** * Interface for controlling the data interface of the TDA5250 Radio. * This interface lets you switch between Tx and Rx. * In conjunction to this the HplTda5250Data interface * is used for the actual receiving and sending of data. * * @see HplTda5250Data * @author Philipp Huppertz (huppertz@tkn.tu-berlin.de) */ interface HplTda5250DataControl { /** * Sets the radio to transmit. * * @return SUCCESS on success * FAIL otherwise. */ async command error_t setToTx(); /** * Sets the radio to receive. * * @return SUCCESS on success * FAIL otherwise. */ async command error_t setToRx(); } tinyos-2.1.2+dfsg/tos/chips/tda5250/HplTda5250DataP.nc000066400000000000000000000105131207233610700217040ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * ======================================================================== */ /** * HplTda5250DataP module * * @author Philipp Hupertz (huppertz@tkn.tu-berlin.de) * @author Kevin Klues (klues@tkn.tu-berlin.de) */ module HplTda5250DataP { provides { interface Init; interface HplTda5250Data; interface HplTda5250DataControl; interface Resource; interface ResourceRequested; } uses { interface GeneralIO as DATA; interface UartStream as Uart; interface HplTda5250DataControl as UartDataControl; interface Resource as UartResource; interface ResourceRequested as UartResourceRequested; } } implementation { /** * Initializes the Radio, setting up all Pin configurations * to the MicroProcessor that is driving it * * @return always returns SUCCESS */ command error_t Init.init() { call DATA.makeOutput(); call DATA.clr(); //Make Rx default call DATA.makeInput(); return SUCCESS; } async command error_t Resource.request() { return call UartResource.request(); } async command error_t Resource.immediateRequest() { if(call UartResource.immediateRequest() == EBUSY) { return EBUSY; } return SUCCESS; } async command error_t Resource.release() { return call UartResource.release(); } async command bool Resource.isOwner() { return call UartResource.isOwner(); } event void UartResource.granted() { signal Resource.granted(); } async event void UartResourceRequested.requested() { signal ResourceRequested.requested(); } async event void UartResourceRequested.immediateRequested() { signal ResourceRequested.immediateRequested(); } async command error_t HplTda5250Data.tx(uint8_t data) { if(call UartResource.isOwner() == FALSE) return FAIL; return call Uart.send(&data, 1); } async event void Uart.sendDone( uint8_t* buf, uint16_t len, error_t error ) { if(call UartResource.isOwner() == FALSE) return; signal HplTda5250Data.txReady(); } async event void Uart.receivedByte( uint8_t data ) { if(call UartResource.isOwner() == FALSE) return; signal HplTda5250Data.rxDone(data); } async event void Uart.receiveDone( uint8_t* buf, uint16_t len, error_t error ) {} async command error_t HplTda5250DataControl.setToTx() { call UartDataControl.setToTx(); return SUCCESS; } async command error_t HplTda5250DataControl.setToRx() { call UartDataControl.setToRx(); return SUCCESS; } default event void Resource.granted() {} default async event void HplTda5250Data.txReady() {} default async event void HplTda5250Data.rxDone(uint8_t data) {} } tinyos-2.1.2+dfsg/tos/chips/tda5250/RfPower.nc000066400000000000000000000032361207233610700206720ustar00rootroot00000000000000/* -*- mode: c++ -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ interface RfPower { async command error_t set(uint8_t setting); } tinyos-2.1.2+dfsg/tos/chips/tda5250/Tda5250ActiveMessageC.nc000066400000000000000000000063731207233610700231030ustar00rootroot00000000000000// $Id: Tda5250ActiveMessageC.nc,v 1.7 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: Tda5250ActiveMessageC.nc,v 1.7 2010-06-29 22:07:46 scipio Exp $ * */ /** * * The Active Message layer for the TDA5250 radio. This configuration * just layers the AM dispatch (Tda5250ActiveMessageP) on top of the * underlying TDA5250 radio packet. * * @author Philip Levis * @author Vlado Handziski (TDA5250 modifications) * @date July 20 2005 */ #include "Timer.h" configuration Tda5250ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface AMPacket; interface Packet; interface PacketAcknowledgements; interface Tda5250Packet; } } implementation { components Tda5250ActiveMessageP as AM, RadioDataLinkC as Radio; components ActiveMessageAddressC as Address; SplitControl = Radio; Packet = Radio; PacketAcknowledgements = Radio; Tda5250Packet = AM; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; AMPacket = AM; AM.SubSend -> Radio.Send; AM.SubReceive -> Radio.Receive; AM.SubPacket -> Radio.Packet; AM.amAddress -> Address; } tinyos-2.1.2+dfsg/tos/chips/tda5250/Tda5250ActiveMessageP.nc000066400000000000000000000135421207233610700231140ustar00rootroot00000000000000// -*- mode:c++; indent-tabs-mode: nil -*- $Id: Tda5250ActiveMessageP.nc,v 1.11 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: Tda5250ActiveMessageP.nc,v 1.11 2010-06-29 22:07:46 scipio Exp $ * */ /** * @author Philip Levis * @author Vlado Handziski (TDA5250 modifications) * @date July 20 2005 */ module Tda5250ActiveMessageP { provides { interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface AMPacket; interface Tda5250Packet; } uses { interface Send as SubSend; interface Receive as SubReceive; interface Packet as SubPacket; command am_addr_t amAddress(); } } implementation { tda5250_header_t* getHeader( message_t* msg ) { return (tda5250_header_t*)( msg->data - sizeof(tda5250_header_t) ); } tda5250_metadata_t* getMetadata(message_t* amsg) { return (tda5250_metadata_t*)((uint8_t*)amsg->footer + sizeof(message_radio_footer_t)); } command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len) { tda5250_header_t* header = getHeader(msg); header->type = id; header->dest = addr; header->src = call amAddress(); return call SubSend.send(msg, len); } command error_t AMSend.cancel[am_id_t id](message_t* msg) { return call SubSend.cancel(msg); } event void SubSend.sendDone(message_t* msg, error_t result) { signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call SubPacket.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call SubPacket.getPayload(m, len); } /* Receiving a packet */ event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { if (call AMPacket.isForMe(msg)) { return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len); } else { return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len); } } command am_addr_t AMPacket.address() { return call amAddress(); } command am_addr_t AMPacket.destination(message_t* amsg) { tda5250_header_t* header = getHeader(amsg); return header->dest; } command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { tda5250_header_t* header = getHeader(amsg); header->dest = addr; } command am_addr_t AMPacket.source(message_t* amsg) { tda5250_header_t* header = getHeader(amsg); return header->src; } command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { tda5250_header_t* header = getHeader(amsg); header->src = addr; } command bool AMPacket.isForMe(message_t* amsg) { return (call AMPacket.destination(amsg) == call AMPacket.address() || call AMPacket.destination(amsg) == AM_BROADCAST_ADDR); } command am_id_t AMPacket.type(message_t* amsg) { tda5250_header_t* header = getHeader(amsg); return header->type; } command void AMPacket.setType(message_t* amsg, am_id_t type) { tda5250_header_t* header = getHeader(amsg); header->type = type; } command void AMPacket.setGroup(message_t* msg, am_group_t group) { return; } command am_group_t AMPacket.group(message_t* msg) { return TOS_AM_GROUP; } command am_group_t AMPacket.localGroup() { return TOS_AM_GROUP; } async command uint8_t Tda5250Packet.getSnr(message_t* msg) { return getMetadata(msg)->strength; } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { return; } } tinyos-2.1.2+dfsg/tos/chips/tda5250/Tda5250Control.nc000066400000000000000000000104471207233610700216750ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * @author: Kevin Klues (klues@tkn.tu-berlin.de) * ======================================================================== */ #include "tda5250Control.h" /** * This interface provides commands and events for controlling the radio modes. * * @author: Kevin Klues (klues@tkn.tu-berlin.de) * */ interface Tda5250Control { /** * Switches radio to TimerMode. * * @param on_time Sets the time (ms) the radio is on. * @param off_time Sets the time (ms) the radio is off. * * @return SUCCESS on success * FAIL otherwise. */ async command error_t TimerMode(float on_time, float off_time); /** * Resets the timers set in TimerMode(). * * @return SUCCESS on success * FAIL otherwise. */ async command error_t ResetTimerMode(); /** * Switches radio to SelfPollingMode. * * @param on_time Sets the time (ms) the radio is on. * @param off_time Sets the time (ms) the radio is off. * * @return SUCCESS on success * FAIL otherwise. */ async command error_t SelfPollingMode(float on_time, float off_time); /** * Resets the timers set in SelfPollingMode(float, float). * * @return SUCCESS on success * FAIL otherwise. */ async command error_t ResetSelfPollingMode(); /** * Switches radio to TxMode. * * @return SUCCESS on success * FAIL otherwise. */ async command error_t TxMode(); /** * Switches radio to RxMode. * * @return SUCCESS on success * FAIL otherwise. */ async command error_t RxMode(); /** * Switches radio to SleepMode. * * @return SUCCESS on success * FAIL otherwise. */ async command error_t SleepMode(); /** * Notification that radio mode is switched to TimerModeDone. */ async event void TimerModeDone(); /** * Notification that radio mode is switched to SelfPollingMode. */ async event void SelfPollingModeDone(); /** * Notification that radio mode is switched to TxMode. */ async event void TxModeDone(); /** * Notification that radio mode is switched to RxMode. */ async event void RxModeDone(); /** * Notification that the rssi is stable. */ async event void RssiStable(); /** * Notification that radio mode is switched to SleepMode. */ async event void SleepModeDone(); /** * Notification of interrupt when in * TimerMode or SelfPollingMode. */ async event void PWDDDInterrupt(); } tinyos-2.1.2+dfsg/tos/chips/tda5250/Tda5250Packet.nc000066400000000000000000000035601207233610700214620ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Revision: 1.1 $ * $Date: 2007-07-24 12:22:42 $ */ /** * Access the specific fields of this radio * @author: Andreas Koepke */ #include "message.h" interface Tda5250Packet { async command uint8_t getSnr(message_t* msg); } tinyos-2.1.2+dfsg/tos/chips/tda5250/Tda5250RadioC.nc000066400000000000000000000057401207233610700214160ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.7 $ * $Date: 2008-06-17 16:53:50 $ * ======================================================================== */ /** * Controlling the Tda5250 at the Hpl layer. * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ #include "tda5250Const.h" #include "tda5250RegDefaultSettings.h" #include "tda5250RegTypes.h" configuration Tda5250RadioC { provides { interface SplitControl; interface Tda5250Control; interface ResourceRequested; interface RadioByteComm; interface ClkDiv; } } implementation { components Tda5250RadioP , HplTda5250ConfigC , HplTda5250DataC , new Alarm32khz16C() as DelayTimer , MainC; MainC.SoftwareInit -> HplTda5250ConfigC; MainC.SoftwareInit -> HplTda5250DataC; MainC.SoftwareInit -> Tda5250RadioP; Tda5250Control = Tda5250RadioP; ResourceRequested = Tda5250RadioP; RadioByteComm = Tda5250RadioP; SplitControl = Tda5250RadioP; ClkDiv = Tda5250RadioP; Tda5250RadioP.DelayTimer -> DelayTimer; Tda5250RadioP.ConfigResource -> HplTda5250ConfigC; Tda5250RadioP.DataResource -> HplTda5250DataC; Tda5250RadioP.DataResourceRequested -> HplTda5250DataC; Tda5250RadioP.HplTda5250Config -> HplTda5250ConfigC; Tda5250RadioP.HplTda5250Data -> HplTda5250DataC; Tda5250RadioP.HplTda5250DataControl -> HplTda5250DataC; } tinyos-2.1.2+dfsg/tos/chips/tda5250/Tda5250RadioP.nc000066400000000000000000000376031207233610700214360ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.9 $ * $Date: 2008-06-18 01:25:54 $ * @author: Kevin Klues (klues@tkn.tu-berlin.de) * ======================================================================== */ #include "tda5250Const.h" /* * Controlling the Tda5250 * * Switch modes and initialize. * * @author Kevin Klues * @author Philipp Huppertz * @author Andreas Koepke */ #include "Timer.h" module Tda5250RadioP { provides { interface Init; interface SplitControl; interface Tda5250Control; interface RadioByteComm; interface ResourceRequested; interface ClkDiv; #ifdef LNDW interface RfPower; #endif } uses { interface HplTda5250Config; interface HplTda5250Data; interface HplTda5250DataControl; interface Resource as ConfigResource; interface Resource as DataResource; interface ResourceRequested as DataResourceRequested; interface Alarm as DelayTimer; } } implementation { typedef enum { TRANSMITTER_DELAY, RECEIVER_DELAY, RSSISTABLE_DELAY } delayTimer_t; delayTimer_t delayTimer; // current Mode of the Timer (RssiStable, TxSetupTime, RxSetupTime) radioMode_t radioMode; // Current Mode of the Radio float onTime, offTime; #ifdef LNDW norace bool rfpowerdirty = FALSE; norace uint8_t rfpower = INITIAL_RF_POWER; task void setRfPower() { uint8_t rp, rd; atomic { rp = rfpower; rd = rfpowerdirty; } if(rd) { if(call ConfigResource.immediateRequest() == SUCCESS) { call HplTda5250Config.SetRFPower(rp); atomic rfpowerdirty = FALSE; } else { post setRfPower(); } } } #endif /**************** Radio Init *****************/ command error_t Init.init() { radioMode = RADIO_MODE_OFF; return SUCCESS; } /**************** Radio Start *****************/ task void startDoneTask() { signal ClkDiv.startDone(); signal SplitControl.startDone(SUCCESS); } command error_t SplitControl.start() { radioMode_t mode; atomic mode = radioMode; if(mode == RADIO_MODE_OFF) { atomic radioMode = RADIO_MODE_ON_TRANSITION; return call ConfigResource.request(); } return FAIL; } /**************** Radio Stop *****************/ task void stopDoneTask() { signal SplitControl.stopDone(SUCCESS); } command error_t SplitControl.stop(){ atomic radioMode = RADIO_MODE_OFF_TRANSITION; return call ConfigResource.request(); } /* radioBusy * This function checks whether the radio is busy * so as to decide whether it can perform some operation or not. */ bool radioBusy() { switch(radioMode) { case RADIO_MODE_OFF: case RADIO_MODE_ON_TRANSITION: case RADIO_MODE_OFF_TRANSITION: case RADIO_MODE_TX_TRANSITION: case RADIO_MODE_RX_TRANSITION: case RADIO_MODE_TIMER_TRANSITION: case RADIO_MODE_SELF_POLLING_TRANSITION: case RADIO_MODE_SLEEP_TRANSITION: return TRUE; default: return FALSE; } } void switchConfigResource() { radioMode_t mode; atomic mode = radioMode; switch(mode) { case RADIO_MODE_ON_TRANSITION: call HplTda5250Config.reset(); call HplTda5250Config.SetRFPower(INITIAL_RF_POWER); // call HplTda5250Config.SetClockOnDuringPowerDown(); call ConfigResource.release(); atomic radioMode = RADIO_MODE_ON; post startDoneTask(); break; case RADIO_MODE_OFF_TRANSITION: signal ClkDiv.stopping(); call HplTda5250Config.SetSleepMode(); call ConfigResource.release(); atomic radioMode = RADIO_MODE_OFF; post stopDoneTask(); break; case RADIO_MODE_SLEEP_TRANSITION: signal ClkDiv.stopping(); call HplTda5250Config.SetSlaveMode(); call HplTda5250Config.SetSleepMode(); atomic radioMode = RADIO_MODE_SLEEP; signal Tda5250Control.SleepModeDone(); #ifdef LNDW if(rfpowerdirty) post setRfPower(); #endif break; case RADIO_MODE_TX_TRANSITION: call HplTda5250Config.SetSlaveMode(); call HplTda5250Config.SetTxMode(); if (!(call HplTda5250Config.IsTxRxPinControlled())) call ConfigResource.release(); atomic delayTimer = TRANSMITTER_DELAY; call DelayTimer.start(TDA5250_TRANSMITTER_SETUP_TIME); break; case RADIO_MODE_RX_TRANSITION: call HplTda5250Config.SetSlaveMode(); call HplTda5250Config.SetRxMode(); if (!(call HplTda5250Config.IsTxRxPinControlled())) call ConfigResource.release(); atomic delayTimer = RECEIVER_DELAY; call DelayTimer.start(TDA5250_RECEIVER_SETUP_TIME); break; case RADIO_MODE_TIMER_TRANSITION: call HplTda5250Config.SetTimerMode(onTime, offTime); call ConfigResource.release(); atomic radioMode = RADIO_MODE_TIMER; signal Tda5250Control.TimerModeDone(); break; case RADIO_MODE_SELF_POLLING_TRANSITION: call HplTda5250Config.SetSelfPollingMode(onTime, offTime); call ConfigResource.release(); atomic radioMode = RADIO_MODE_SELF_POLLING; signal Tda5250Control.SelfPollingModeDone(); break; default: break; } } event void ConfigResource.granted() { switchConfigResource(); } void switchDataResource() { radioMode_t mode; atomic mode = radioMode; switch(mode) { case RADIO_MODE_TX_TRANSITION: atomic radioMode = RADIO_MODE_TX; signal Tda5250Control.TxModeDone(); break; case RADIO_MODE_RX_TRANSITION: atomic radioMode = RADIO_MODE_RX; signal Tda5250Control.RxModeDone(); break; default: break; } } event void DataResource.granted() { switchDataResource(); } // information for higher layers that the DataResource has been requested async event void DataResourceRequested.requested() { signal ResourceRequested.requested(); } async event void DataResourceRequested.immediateRequested() { signal ResourceRequested.immediateRequested(); } /** Set the mode of the radio The choices are TIMER_MODE, SELF_POLLING_MODE */ async command error_t Tda5250Control.TimerMode(float on_time, float off_time) { radioMode_t mode; atomic { if(radioBusy() == FALSE) { radioMode = RADIO_MODE_TIMER_TRANSITION; onTime = on_time; offTime = off_time; } mode = radioMode; } if(radioMode == RADIO_MODE_TIMER_TRANSITION) { call DataResource.release(); if (call ConfigResource.immediateRequest() == SUCCESS) { switchConfigResource(); } else { call ConfigResource.request(); } return SUCCESS; } return FAIL; } async command error_t Tda5250Control.ResetTimerMode() { radioMode_t mode; atomic { if(radioBusy() == FALSE) { radioMode = RADIO_MODE_TIMER_TRANSITION; } mode = radioMode; } if(radioMode == RADIO_MODE_TIMER_TRANSITION) { call DataResource.release(); if (call ConfigResource.immediateRequest() == SUCCESS) { switchConfigResource(); } else { call ConfigResource.request(); } return SUCCESS; } return FAIL; } async command error_t Tda5250Control.SelfPollingMode(float on_time, float off_time) { radioMode_t mode; atomic { if(radioBusy() == FALSE) { radioMode = RADIO_MODE_SELF_POLLING_TRANSITION; onTime = on_time; offTime = off_time; } mode = radioMode; } if(radioMode == RADIO_MODE_SELF_POLLING_TRANSITION) { call DataResource.release(); if (call ConfigResource.immediateRequest() == SUCCESS) { switchConfigResource(); } else { call ConfigResource.request(); } return SUCCESS; } return FAIL; } async command error_t Tda5250Control.ResetSelfPollingMode() { radioMode_t mode; atomic { if(radioBusy() == FALSE) { radioMode = RADIO_MODE_SELF_POLLING_TRANSITION; } mode = radioMode; } if(radioMode == RADIO_MODE_SELF_POLLING_TRANSITION) { call DataResource.release(); if (call ConfigResource.immediateRequest() == SUCCESS) { switchConfigResource(); } else { call ConfigResource.request(); } return SUCCESS; } return FAIL; } async command error_t Tda5250Control.SleepMode() { radioMode_t mode; atomic{ if(radioBusy() == FALSE) { radioMode = RADIO_MODE_SLEEP_TRANSITION; } mode = radioMode; } if(mode == RADIO_MODE_SLEEP_TRANSITION) { call DataResource.release(); switchConfigResource(); return SUCCESS; } return FAIL; } async command error_t Tda5250Control.TxMode() { radioMode_t mode; atomic { if(radioBusy() == FALSE) { radioMode = RADIO_MODE_TX_TRANSITION; } mode = radioMode; } if(mode == RADIO_MODE_TX_TRANSITION) { call DataResource.release(); call HplTda5250DataControl.setToTx(); if (call HplTda5250Config.IsTxRxPinControlled()) { switchConfigResource(); } else { if (call ConfigResource.immediateRequest() == SUCCESS) { switchConfigResource(); } else { call ConfigResource.request(); } } return SUCCESS; } return FAIL; } async command error_t Tda5250Control.RxMode() { radioMode_t mode; atomic { if(radioBusy() == FALSE) { radioMode = RADIO_MODE_RX_TRANSITION; } mode = radioMode; } if(mode == RADIO_MODE_RX_TRANSITION) { call DataResource.release(); call HplTda5250DataControl.setToRx(); if (call HplTda5250Config.IsTxRxPinControlled()) { switchConfigResource(); } else { if (call ConfigResource.immediateRequest() == SUCCESS) { switchConfigResource(); } else { call ConfigResource.request(); } } return SUCCESS; } return FAIL; } async event void HplTda5250Data.txReady() { signal RadioByteComm.txByteReady(SUCCESS); } async event void HplTda5250Data.rxDone(uint8_t data) { signal RadioByteComm.rxByteReady(data); } async event void HplTda5250Config.PWDDDInterrupt() { signal Tda5250Control.PWDDDInterrupt(); } async command void RadioByteComm.txByte(uint8_t data) { error_t error = call HplTda5250Data.tx(data); if(error != SUCCESS) { signal RadioByteComm.txByteReady(error); } } async command bool RadioByteComm.isTxDone() { //return call HplTda5250Data.isTxDone(); return TRUE; } /* Generate events (these are no interrupts */ async event void DelayTimer.fired() { delayTimer_t delay; atomic { delay = delayTimer; } switch (delay) { case RSSISTABLE_DELAY : signal Tda5250Control.RssiStable(); break; case RECEIVER_DELAY : signal ClkDiv.startDone(); delayTimer = RSSISTABLE_DELAY; call DelayTimer.start(TDA5250_RSSI_STABLE_TIME-TDA5250_RECEIVER_SETUP_TIME); if (call DataResource.immediateRequest() == SUCCESS) { switchDataResource(); } else { call DataResource.request(); } break; case TRANSMITTER_DELAY : signal ClkDiv.startDone(); if (call DataResource.immediateRequest() == SUCCESS) { switchDataResource(); } else { call DataResource.request(); } break; } } default async event void ResourceRequested.requested() { } default async event void ResourceRequested.immediateRequested() { } default async event void Tda5250Control.TimerModeDone(){ } default async event void Tda5250Control.SelfPollingModeDone(){ } default async event void Tda5250Control.RxModeDone(){ } default async event void Tda5250Control.TxModeDone(){ } default async event void Tda5250Control.SleepModeDone(){ } default async event void Tda5250Control.PWDDDInterrupt() { } default async event void RadioByteComm.rxByteReady(uint8_t data) { } default async event void RadioByteComm.txByteReady(error_t error) { } default async event void ClkDiv.startDone() { } default async event void ClkDiv.stopping() { } #ifdef LNDW async command error_t RfPower.set(uint8_t setting) { atomic { rfpower = setting; rfpowerdirty = TRUE; } return SUCCESS; } #endif } tinyos-2.1.2+dfsg/tos/chips/tda5250/Tda5250ReadReg.nc000066400000000000000000000042521207233610700215630ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * ======================================================================== */ /** * Allows reading of a specified register. See "tda5250RegTypes.h". * ReadReg is parameterized by the register it uses. * * @param reg_type Defines the register to read from. * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ interface Tda5250ReadReg { /** * Reads from the paramterized register. * * @return Data content of the register. */ async command reg_type get(); } tinyos-2.1.2+dfsg/tos/chips/tda5250/Tda5250RegComm.nc000066400000000000000000000050641207233610700216050ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /** * Interface for writing and reading bytes to and from the Tda5250 Radio * registers. * * @author: Kevin Klues (klues@tkn.tu-berlin.de) */ interface Tda5250RegComm { /** * Transmit a byte of data to a given register. * * @param address The address of the register to write to. * @param data The 8-bit data value to write to the register. * * @return always SUCCESS. */ async command error_t writeByte(uint8_t address, uint8_t data); /** * Transmit a word of data to a given register. * * @param address The address of the register to write to. * @param data The 16-bit data value to write to the register. * * @return always SUCCESS. */ async command error_t writeWord(uint8_t address, uint16_t data); /** * Read a byte of data from a given register. * * @param address The address of the register to read from. * * @return The 16-bit data value read from the register. */ async command uint8_t readByte(uint8_t address); } tinyos-2.1.2+dfsg/tos/chips/tda5250/Tda5250RegCommP.nc000066400000000000000000000071761207233610700217330ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * @author Kevin Klues (klues@tkn.tu-berlin.de) * ======================================================================== */ module Tda5250RegCommP { provides { interface Init; interface Tda5250RegComm; interface Resource; } uses { interface GeneralIO as BusM; interface Resource as SpiResource; interface SpiByte; } } implementation { command error_t Init.init() { // setting pins to output call BusM.makeOutput(); //initializing pin values call BusM.set(); //Use SPI for writing to Regs return SUCCESS; } async command error_t Resource.request() { return call SpiResource.request(); } async command error_t Resource.immediateRequest() { if(call SpiResource.immediateRequest() == EBUSY) return EBUSY; return SUCCESS; } async command bool Resource.isOwner() { return call SpiResource.isOwner(); } async command error_t Resource.release() { return call SpiResource.release(); } event void SpiResource.granted() { signal Resource.granted(); } async command error_t Tda5250RegComm.writeByte(uint8_t address, uint8_t data) { if(call SpiResource.isOwner() == FALSE) { return FAIL; } call SpiByte.write(address); call SpiByte.write(data); return SUCCESS; } async command error_t Tda5250RegComm.writeWord(uint8_t address, uint16_t data) { if(call SpiResource.isOwner() == FALSE) return FAIL; call SpiByte.write(address); call SpiByte.write(((uint8_t) (data >> 8))); call SpiByte.write(((uint8_t) data)); return SUCCESS; } async command uint8_t Tda5250RegComm.readByte(uint8_t address){ if(call SpiResource.isOwner() == FALSE) return 0x00; call SpiByte.write(address); // FIXME: Put SIMO/SOMI in input return call SpiByte.write(0x00); } } tinyos-2.1.2+dfsg/tos/chips/tda5250/Tda5250RegistersC.nc000066400000000000000000000102271207233610700223230ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * ======================================================================== */ /** * Provides access to the registers of the tda5250 radio. * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ configuration Tda5250RegistersC { provides { interface Init; interface Resource; interface Tda5250WriteReg as CONFIG; interface Tda5250WriteReg as FSK; interface Tda5250WriteReg as XTAL_TUNING; interface Tda5250WriteReg as LPF; interface Tda5250WriteReg as ON_TIME; interface Tda5250WriteReg as OFF_TIME; interface Tda5250WriteReg as COUNT_TH1; interface Tda5250WriteReg as COUNT_TH2; interface Tda5250WriteReg as RSSI_TH3; interface Tda5250WriteReg as RF_POWER; interface Tda5250WriteReg as CLK_DIV; interface Tda5250WriteReg as XTAL_CONFIG; interface Tda5250WriteReg as BLOCK_PD; interface Tda5250ReadReg as STATUS; interface Tda5250ReadReg as ADC; } } implementation { components Tda5250RegistersP , Tda5250RadioIOC , Tda5250RegCommC ; Init = Tda5250RegistersP; Init = Tda5250RegCommC; Resource = Tda5250RegCommC; CONFIG = Tda5250RegistersP.CONFIG; FSK = Tda5250RegistersP.FSK; XTAL_TUNING = Tda5250RegistersP.XTAL_TUNING; LPF = Tda5250RegistersP.LPF; ON_TIME = Tda5250RegistersP.ON_TIME; OFF_TIME = Tda5250RegistersP.OFF_TIME; COUNT_TH1 = Tda5250RegistersP.COUNT_TH1; COUNT_TH2 = Tda5250RegistersP.COUNT_TH2; RSSI_TH3 = Tda5250RegistersP.RSSI_TH3; RF_POWER = Tda5250RegistersP.RF_POWER; CLK_DIV = Tda5250RegistersP.CLK_DIV; XTAL_CONFIG = Tda5250RegistersP.XTAL_CONFIG; BLOCK_PD = Tda5250RegistersP.BLOCK_PD; STATUS = Tda5250RegistersP.STATUS; ADC = Tda5250RegistersP.ADC; Tda5250RegistersP.Pot -> Tda5250RegCommC; Tda5250RegistersP.Tda5250RegComm -> Tda5250RegCommC; Tda5250RegistersP.ENTDA -> Tda5250RadioIOC.Tda5250RadioENTDA; } tinyos-2.1.2+dfsg/tos/chips/tda5250/Tda5250RegistersP.nc000066400000000000000000000127241207233610700223440ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * ======================================================================== */ /** * Tda5250RegistersP Module * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ module Tda5250RegistersP { provides { interface Init; interface Tda5250WriteReg as CONFIG; interface Tda5250WriteReg as FSK; interface Tda5250WriteReg as XTAL_TUNING; interface Tda5250WriteReg as LPF; interface Tda5250WriteReg as ON_TIME; interface Tda5250WriteReg as OFF_TIME; interface Tda5250WriteReg as COUNT_TH1; interface Tda5250WriteReg as COUNT_TH2; interface Tda5250WriteReg as RSSI_TH3; interface Tda5250WriteReg as RF_POWER; interface Tda5250WriteReg as CLK_DIV; interface Tda5250WriteReg as XTAL_CONFIG; interface Tda5250WriteReg as BLOCK_PD; interface Tda5250ReadReg as STATUS; interface Tda5250ReadReg as ADC; } uses { interface Tda5250RegComm; interface Pot; interface GeneralIO as ENTDA; } } implementation { error_t writeByte(uint8_t addr, uint16_t data) { error_t result; call ENTDA.clr(); result = call Tda5250RegComm.writeByte(addr, data); call ENTDA.set(); return result; } error_t writeWord(uint8_t addr, uint16_t data) { error_t result; call ENTDA.clr(); result = call Tda5250RegComm.writeWord(addr, data); call ENTDA.set(); return result; } uint8_t readByte(uint8_t addr) { uint8_t result; call ENTDA.clr(); result = call Tda5250RegComm.readByte(addr); call ENTDA.set(); return result; } command error_t Init.init() { // setting pins to output call ENTDA.makeOutput(); // initializing pin values call ENTDA.set(); return SUCCESS; } async command error_t CONFIG.set(uint16_t data) { return writeWord(TDA5250_REG_ADDR_CONFIG, data); }; async command error_t FSK.set(uint16_t data) { return writeWord(TDA5250_REG_ADDR_FSK, data); }; async command error_t XTAL_TUNING.set(uint16_t data) { return writeWord(TDA5250_REG_ADDR_XTAL_TUNING, data); }; async command error_t LPF.set(uint8_t data) { return writeByte(TDA5250_REG_ADDR_LPF, data); }; async command error_t ON_TIME.set(uint16_t data) { return writeWord(TDA5250_REG_ADDR_ON_TIME, data); }; async command error_t OFF_TIME.set(uint16_t data) { return writeWord(TDA5250_REG_ADDR_OFF_TIME, data); }; async command error_t COUNT_TH1.set(uint16_t data) { return writeWord(TDA5250_REG_ADDR_COUNT_TH1, data); }; async command error_t COUNT_TH2.set(uint16_t data) { return writeWord(TDA5250_REG_ADDR_COUNT_TH2, data); }; async command error_t RSSI_TH3.set(uint8_t data) { return writeByte(TDA5250_REG_ADDR_RSSI_TH3, data); }; async command error_t RF_POWER.set(uint8_t data) { return call Pot.set(data); }; async command error_t CLK_DIV.set(uint8_t data) { return writeByte(TDA5250_REG_ADDR_CLK_DIV, data); }; async command error_t XTAL_CONFIG.set(uint8_t data) { return writeByte(TDA5250_REG_ADDR_XTAL_CONFIG, data); }; async command error_t BLOCK_PD.set(uint16_t data) { return writeWord(TDA5250_REG_ADDR_BLOCK_PD, data); }; async command uint8_t STATUS.get() { return readByte(TDA5250_REG_ADDR_STATUS); }; async command uint8_t ADC.get() { return readByte(TDA5250_REG_ADDR_ADC); }; } tinyos-2.1.2+dfsg/tos/chips/tda5250/Tda5250WriteReg.nc000066400000000000000000000043561207233610700220070ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * ======================================================================== */ /** * Allows writing to a specified register. See "tda5250RegTypes.h". * WriteReg is parameterized by the register it uses. * * @param reg_type Defines the register to write to. * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ interface Tda5250WriteReg { /** * Writes to the parametrized register. * * @param v Data written to the register. * * @return SUCCESS on success * FAIL otherwise. */ async command error_t set(reg_type v); } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/000077500000000000000000000000001207233610700175205ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/ChannelCongestion.nc000066400000000000000000000037561207233610700234560ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface of MAC to inform any interested party on current congestion state * in radio neighborhood. * @author Andreas Koepke (koepke at tkn.tu-berlin.de) */ interface ChannelCongestion { /** * signal current congestion level. There are 5 levels, 0 means no * congestion, 5 means high congestion */ async event void congestionEvent(uint8_t level); } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/CsmaMacC.nc000066400000000000000000000070401207233610700214520ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Configuration for the CsmaMac. * * @author: Kevin Klues (klues@tkn.tu-berlin.de) * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) * @author: Philipp Huppertz (huppertz@tkn.tu-berlin.de) */ // #define MAC_DEBUG configuration CsmaMacC { provides { interface SplitControl; interface MacSend; interface MacReceive; interface Packet; } uses { interface PhySend as PacketSend; interface PhyReceive as PacketReceive; interface Packet as SubPacket; interface Tda5250Control; interface UartPhyControl; interface RadioTimeStamping; } } implementation { components Tda5250RadioC, CsmaMacP, RssiFixedThresholdCMC as Cca, new Alarm32khz16C() as Timer, new TimerMilliC() as ReRxTimer, DuplicateC, TimeDiffC, LocalTimeC, RandomLfsrC #ifdef MAC_DEBUG ,PlatformLedsC #endif ; SplitControl = CsmaMacP; MacSend = CsmaMacP; MacReceive = CsmaMacP; Tda5250Control = CsmaMacP; UartPhyControl = CsmaMacP; RadioTimeStamping = CsmaMacP; CsmaMacP = Packet; CsmaMacP = SubPacket; CsmaMacP = PacketSend; CsmaMacP = PacketReceive; CsmaMacP.CcaStdControl -> Cca.StdControl; CsmaMacP.ChannelMonitor -> Cca.ChannelMonitor; CsmaMacP.ChannelMonitorData -> Cca.ChannelMonitorData; CsmaMacP.ChannelMonitorControl -> Cca.ChannelMonitorControl; CsmaMacP.RssiAdcResource -> Cca.RssiAdcResource; components ActiveMessageAddressC; CsmaMacP.amAddress -> ActiveMessageAddressC; CsmaMacP.Random -> RandomLfsrC; CsmaMacP.RadioResourceRequested -> Tda5250RadioC.ResourceRequested; CsmaMacP.Timer -> Timer; CsmaMacP.ReRxTimer -> ReRxTimer; CsmaMacP.Duplicate -> DuplicateC; CsmaMacP.TimeDiff16 -> TimeDiffC; CsmaMacP.LocalTime32kHz -> LocalTimeC; #ifdef MACM_DEBUG components new SerialDebugC() as SD; CsmaMacP.SerialDebug -> SD; #endif } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/CsmaMacP.nc000066400000000000000000000635001207233610700214720ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "radiopacketfunctions.h" #include "flagfunctions.h" #include "PacketAck.h" /** * An implementation of a Csma Mac. * * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) * @author: Kevin Klues (klues@tkn.tu-berlin.de) * @author Philipp Huppertz (huppertz@tkn.tu-berlin.de) */ // #define MACM_DEBUG // debug... module CsmaMacP { provides { interface SplitControl; interface MacSend; interface MacReceive; interface Packet; } uses { interface StdControl as CcaStdControl; interface PhySend as PacketSend; interface PhyReceive as PacketReceive; interface RadioTimeStamping; interface Tda5250Control as RadioModes; interface ResourceRequested as RadioResourceRequested; interface UartPhyControl; interface Packet as SubPacket; interface ChannelMonitor; interface ChannelMonitorControl; interface ChannelMonitorData; interface Resource as RssiAdcResource; interface Random; interface Timer as ReRxTimer; interface Duplicate; interface TimeDiff16; interface Alarm as Timer; async command am_addr_t amAddress(); interface LocalTime as LocalTime32kHz; #ifdef MACM_DEBUG interface SerialDebug; #endif } } implementation { /****** debug vars & defs & functions ***********************/ #ifdef MACM_DEBUG void sdDebug(uint16_t p) { call SerialDebug.putPlace(p); }; #else void sdDebug(uint16_t p) {}; #endif /******* constants and type definitions *********************/ enum { BYTE_TIME=ENCODED_32KHZ_BYTE_TIME, // phy encoded PREAMBLE_BYTE_TIME=TDA5250_32KHZ_BYTE_TIME, // no coding PHY_HEADER_TIME=6*PREAMBLE_BYTE_TIME, // 6 Phy Preamble TIME_CORRECTION=TDA5250_32KHZ_BYTE_TIME+2, // difference between txSFD and rxSFD SUB_HEADER_TIME=PHY_HEADER_TIME + sizeof(tda5250_header_t)*BYTE_TIME, SUB_FOOTER_TIME=2*BYTE_TIME, // 2 bytes crc MAXTIMERVALUE=0xFFFF, // helps to compute backoff DATA_DETECT_TIME=17, RX_SETUP_TIME=102, // time to set up receiver TX_SETUP_TIME=58, // time to set up transmitter ADDED_DELAY = 30, RX_ACK_TIMEOUT=RX_SETUP_TIME + PHY_HEADER_TIME + 2*ADDED_DELAY, TX_GAP_TIME=RX_ACK_TIMEOUT + TX_SETUP_TIME + 33, MAX_SHORT_RETRY=7, MAX_LONG_RETRY=4, BACKOFF_MASK=0xFFF, // minimum time around one packet time MIN_PREAMBLE_BYTES=2, TOKEN_ACK_FLAG = 64, TOKEN_ACK_MASK = 0x3f, INVALID_SNR = 0xffff }; /**************** Module Global Variables *****************/ /* state vars & defs */ typedef enum { CCA, // clear channel assessment CCA_ACK, SW_RX, // switch to receive RX, // rx mode done, listening & waiting for packet SW_RX_ACK, RX_ACK, RX_ACK_P, RX_P, SW_TX, TX, SW_TX_ACK, TX_ACK, INIT } macState_t; /* flags */ typedef enum { RSSI_STABLE = 1, RESUME_BACKOFF = 2, CANCEL_SEND = 4, CCA_PENDING = 8 } flags_t; /* Packet vars */ message_t* txBufPtr = NULL; message_t ackMsg; uint8_t txLen; uint8_t shortRetryCounter = 0; uint8_t longRetryCounter = 0; unsigned checkCounter; macState_t macState = INIT; uint8_t flags = 0; uint8_t seqNo; uint16_t restLaufzeit; uint16_t rssiValue = 0; uint32_t rxTime = 0; /****** Secure switching of radio modes ***/ task void SetRxModeTask(); task void SetTxModeTask(); task void ReleaseAdcTask() { macState_t ms; atomic ms = macState; if(isFlagSet(&flags, CCA_PENDING)) { post ReleaseAdcTask(); } else { if((ms > CCA) && (ms != INIT) && call RssiAdcResource.isOwner()) { call RssiAdcResource.release(); } } } void setRxMode(); void setTxMode(); void requestAdc() { if(macState != INIT) { call RssiAdcResource.immediateRequest(); } else { call RssiAdcResource.request(); } } void setRxMode() { rssiValue = INVALID_SNR; if(call RadioModes.RxMode() == FAIL) { post SetRxModeTask(); } if(macState == INIT) { requestAdc(); } else { post ReleaseAdcTask(); } } task void SetRxModeTask() { atomic { if((macState == SW_RX) || (macState == SW_RX_ACK) || (macState == INIT)) setRxMode(); } } void setTxMode() { clearFlag(&flags, RSSI_STABLE); if(call RadioModes.TxMode() == FAIL) { post SetTxModeTask(); } post ReleaseAdcTask(); } task void SetTxModeTask() { atomic { if((macState == SW_TX) || (macState == SW_TX_ACK)) setTxMode(); } } /**************** Helper functions ********/ task void postponeReRx() { call ReRxTimer.startOneShot(5000); } uint16_t backoff(uint8_t counter) { uint16_t mask = BACKOFF_MASK >> (MAX_LONG_RETRY - counter); return (call Random.rand16() & mask); } void interruptBackoffTimer() { if(call Timer.isRunning()) { restLaufzeit = call TimeDiff16.computeDelta(call Timer.getAlarm(), call Timer.getNow()); call Timer.stop(); if(restLaufzeit > BACKOFF_MASK) { restLaufzeit = call Random.rand16() & 0xFF; } setFlag(&flags, RESUME_BACKOFF); } } void storeStrength(message_t *m) { if(rssiValue != INVALID_SNR) { (getMetadata(m))->strength = rssiValue; } else { if(call RssiAdcResource.isOwner()) { (getMetadata(m))->strength = call ChannelMonitorData.readSnr(); } else { (getMetadata(m))->strength = 1; } } } void signalSendDone(error_t error) { message_t *m; error_t e = error; atomic { m = txBufPtr; txBufPtr = 0; txLen = 0; longRetryCounter = 0; shortRetryCounter = 0; if(isFlagSet(&flags, CANCEL_SEND)) { e = ECANCEL; } storeStrength(m); clearFlag(&flags, CANCEL_SEND); } signal MacSend.sendDone(m, e); } void updateLongRetryCounters() { longRetryCounter++; shortRetryCounter = 1; if(longRetryCounter > MAX_LONG_RETRY) { sdDebug(13); getMetadata(txBufPtr)->ack = WAS_NOT_ACKED; signalSendDone(FAIL); } } void updateRetryCounters() { shortRetryCounter++; if(shortRetryCounter > MAX_SHORT_RETRY) { longRetryCounter++; shortRetryCounter = 1; if(longRetryCounter > MAX_LONG_RETRY) { getMetadata(txBufPtr)->ack = WAS_NOT_ACKED; signalSendDone(FAIL); } } } void computeBackoff() { if(!isFlagSet(&flags, RESUME_BACKOFF)) { setFlag(&flags, RESUME_BACKOFF); restLaufzeit = backoff(longRetryCounter); updateRetryCounters(); sdDebug(92); } } bool isNewMsg(message_t* msg) { return call Duplicate.isNew(getHeader(msg)->src, getHeader(msg)->dest, (getHeader(msg)->token) & TOKEN_ACK_MASK); } void rememberMsg(message_t* msg) { call Duplicate.remember(getHeader(msg)->src, getHeader(msg)->dest, (getHeader(msg)->token) & TOKEN_ACK_MASK); } void checkSend() { if((txBufPtr != NULL) && (macState == RX) && (!call Timer.isRunning())) { macState = CCA; checkCounter = 0; requestAdc(); call Timer.start(DATA_DETECT_TIME); sdDebug(170); } else { sdDebug(171); post ReleaseAdcTask(); } } bool needsAckRx(message_t* msg) { bool rVal = FALSE; uint8_t token; if(getHeader(msg)->dest < AM_BROADCAST_ADDR) { token = getHeader(msg)->token; if(isFlagSet(&token, ACK_REQUESTED)) rVal = TRUE; } return rVal; } bool needsAckTx(message_t* msg) { bool rVal = FALSE; if(getHeader(msg)->dest < AM_BROADCAST_ADDR) { if((getMetadata(msg)->ack == ACK_REQUESTED) || (getMetadata(msg)->ack != NO_ACK_REQUESTED)) { rVal = TRUE; } } return rVal; } void prepareAck(message_t* msg) { uint8_t rToken = getHeader(msg)->token & TOKEN_ACK_MASK; setFlag(&rToken, TOKEN_ACK_FLAG); getHeader(&ackMsg)->token = rToken; getHeader(&ackMsg)->src = call amAddress(); getHeader(&ackMsg)->dest = getHeader(msg)->src; getHeader(&ackMsg)->type = getHeader(msg)->type; } bool msgIsForMe(message_t* msg) { if(getHeader(msg)->dest == AM_BROADCAST_ADDR) return TRUE; if(getHeader(msg)->dest == call amAddress()) return TRUE; return FALSE; } bool ackIsForMe(message_t* msg) { uint8_t localToken = seqNo; setFlag(&localToken, TOKEN_ACK_FLAG); if((getHeader(msg)->dest == call amAddress()) && (localToken == getHeader(msg)->token)) return TRUE; return FALSE; } bool isControl(message_t* m) { uint8_t token = getHeader(m)->token; return isFlagSet(&token, TOKEN_ACK_FLAG); } /**************** SplitControl *****************/ task void StartDoneTask() { atomic { macState = RX; call UartPhyControl.setNumPreambles(MIN_PREAMBLE_BYTES); } post ReleaseAdcTask(); signal SplitControl.startDone(SUCCESS); } command error_t SplitControl.start() { call CcaStdControl.start(); atomic { macState = INIT; setRxMode(); sdDebug(1); } return SUCCESS; } task void StopDone() { atomic { if (macState != RX) { post StopDone(); sdDebug(2); } else { sdDebug(3); call Timer.stop(); txBufPtr = NULL; macState = INIT; shortRetryCounter = 0; longRetryCounter = 0; flags = 0; signal SplitControl.stopDone(SUCCESS); } } } command error_t SplitControl.stop() { call CcaStdControl.stop(); sdDebug(4); post StopDone(); return SUCCESS; } /****** Packet interface ********************/ command void Packet.clear(message_t* msg) { call SubPacket.clear(msg); } command uint8_t Packet.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg); } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call SubPacket.setPayloadLength(msg,len); } command uint8_t Packet.maxPayloadLength() { return call SubPacket.maxPayloadLength(); } command void* Packet.getPayload(message_t* msg, uint8_t len) { return call SubPacket.getPayload(msg, len); } /****** Radio(Mode) events *************************/ async event void RadioModes.RssiStable() { atomic { setFlag(&flags, RSSI_STABLE); if(macState == INIT) { sdDebug(11); if(call RssiAdcResource.isOwner()) { call ChannelMonitorControl.updateNoiseFloor(); } } else { sdDebug(12); } } } async event void RadioModes.RxModeDone() { post postponeReRx(); atomic { if(macState == SW_RX) { sdDebug(21); macState = RX; if(isFlagSet(&flags, RESUME_BACKOFF)) { clearFlag(&flags, RESUME_BACKOFF); call Timer.start(restLaufzeit); } else { call Timer.start(backoff(longRetryCounter)); } } else if(macState == SW_RX_ACK) { sdDebug(22); macState = RX_ACK; } else if(macState == INIT) { sdDebug(24); } else { sdDebug(25); } } } async event void RadioModes.TxModeDone() { post postponeReRx(); atomic { if(macState == SW_TX) { sdDebug(30); if(txBufPtr) { macState = TX; if(call PacketSend.send(txBufPtr, txLen) == SUCCESS) { sdDebug(31); } else { sdDebug(32); } } } else if(macState == SW_TX_ACK) { macState = TX_ACK; if(call PacketSend.send(&ackMsg, 0) == SUCCESS) { sdDebug(53); } else { sdDebug(54); } } else { sdDebug(33); } } } /****** MacSend events *************************/ async command error_t MacSend.send(message_t* msg, uint8_t len) { error_t err = SUCCESS; atomic { if((shortRetryCounter == 0) && (txBufPtr == NULL) && (macState != INIT)) { sdDebug(40); shortRetryCounter = 1; longRetryCounter = 1; txBufPtr = msg; txLen = len; sdDebug(10); sdDebug(len); seqNo++; if(seqNo >= TOKEN_ACK_FLAG) seqNo = 1; getHeader(msg)->token = seqNo; if(needsAckTx(msg)) getHeader(msg)->token |= ACK_REQUESTED; if(macState != RX_P) checkSend(); } else { sdDebug(41); err = EBUSY; } } return err; } async command error_t MacSend.cancel(message_t* msg) { error_t err = SUCCESS; if((shortRetryCounter != 0) && (txBufPtr == msg) && (macState != TX) && (macState != RX_ACK) && (macState != SW_RX_ACK)) { sdDebug(50); shortRetryCounter = 0; txBufPtr = NULL; txLen = 0; signal MacSend.sendDone(msg, ECANCEL); } else { sdDebug(51); err = FAIL; } return err; } /****** PacketSerializer events **********************/ async event void PacketReceive.receiveDetected() { rssiValue = INVALID_SNR; if(macState <= RX_ACK) { sdDebug(60); interruptBackoffTimer(); if(macState == CCA) computeBackoff(); } if(macState <= RX) { sdDebug(61); macState = RX_P; requestAdc(); } else if(macState <= RX_ACK) { sdDebug(62); macState = RX_ACK_P; } else if(macState == INIT) { sdDebug(63); } else { post ReleaseAdcTask(); sdDebug(64); } } async event message_t* PacketReceive.receiveDone(message_t* msg, void* payload, uint8_t len, error_t error) { message_t* m = msg; bool isCnt; macState_t action = RX; if(macState == RX_P) { if(error == SUCCESS) { sdDebug(82); isCnt = isControl(msg); if(msgIsForMe(msg)) { if(!isCnt) { storeStrength(msg); if(isNewMsg(m)) { m = signal MacReceive.receiveDone(msg); rememberMsg(m); } if(needsAckRx(msg)) { sdDebug(87); action = CCA_ACK; } else { sdDebug(88); } } else { sdDebug(89); } } else { sdDebug(90); } } else { sdDebug(91); } } else if(macState == RX_ACK_P) { if(error == SUCCESS) { if(ackIsForMe(msg)) { sdDebug(92); (getMetadata(txBufPtr))->ack = WAS_ACKED; signalSendDone(SUCCESS); } else { sdDebug(93); updateLongRetryCounters(); } } else { if(call Timer.isRunning()) { sdDebug(94); action = RX_ACK; } else { sdDebug(95); if(needsAckTx(txBufPtr)) { updateLongRetryCounters(); } else { signalSendDone(SUCCESS); } } } } else if(macState == INIT) { action = INIT; } if(action == CCA_ACK) { prepareAck(msg); macState = CCA_ACK; call Timer.start(RX_SETUP_TIME - TX_SETUP_TIME + ADDED_DELAY); } else if(action == RX_ACK) { macState = RX_ACK; } else if(action == RX) { macState = RX; if(isFlagSet(&flags, RESUME_BACKOFF)) { clearFlag(&flags, RESUME_BACKOFF); call Timer.start(restLaufzeit); } else { call Timer.start(backoff(longRetryCounter)); } } else if(action == TX) { macState = SW_TX; setTxMode(); } else if(action == INIT) { } else { sdDebug(94); } post ReleaseAdcTask(); return m; } async event void PacketSend.sendDone(message_t* msg, error_t error) { if(macState == TX) { if(needsAckTx(msg)) { sdDebug(97); macState = SW_RX_ACK; call Timer.start(RX_ACK_TIMEOUT); } else { sdDebug(99); signalSendDone(error); macState = SW_RX; } setRxMode(); } else if(macState == TX_ACK) { macState = SW_RX; setRxMode(); } post ReleaseAdcTask(); } /****** Timer ******************************/ void checkOnBusy() { if(macState == CCA) { computeBackoff(); macState = RX; requestAdc(); sdDebug(150); if(!call Timer.isRunning()) call Timer.start(TX_GAP_TIME >> 1); } else if(macState == RX) { if(!call Timer.isRunning()) call Timer.start(TX_GAP_TIME + backoff(0)); } } void checkOnIdle() { if(macState == RX) { checkSend(); } else if(macState == CCA) { checkCounter++; if(checkCounter < 3) { sdDebug(158); call Timer.start((TX_GAP_TIME + backoff(0))>>1); requestAdc(); } else { call Timer.stop(); sdDebug(159); macState = SW_TX; setTxMode(); } } } async event void Timer.fired() { sdDebug(100); if(macState == CCA) { if((!call RssiAdcResource.isOwner()) || (call ChannelMonitor.start() != SUCCESS)) { if(call UartPhyControl.isBusy()) { sdDebug(101); checkOnBusy(); } else { sdDebug(102); checkOnIdle(); } } else { setFlag(&flags, CCA_PENDING); } } else if(macState == RX_ACK) { if(needsAckTx(txBufPtr)) { sdDebug(103); updateLongRetryCounters(); macState = RX; call Timer.start(backoff(longRetryCounter)); } else { sdDebug(104); } } else if(macState == CCA_ACK) { sdDebug(160); macState = SW_TX_ACK; setTxMode(); } else if((macState == RX_ACK_P) || (macState == RX_P)) { sdDebug(108); } else if(macState == INIT) { sdDebug(109); post StartDoneTask(); } else { sdDebug(110); checkSend(); } } /****** ChannelMonitor events *********************/ async event void ChannelMonitor.channelBusy() { clearFlag(&flags, CCA_PENDING); sdDebug(120); checkOnBusy(); } async event void ChannelMonitor.channelIdle() { clearFlag(&flags, CCA_PENDING); sdDebug(121); checkOnIdle(); } /****** ChannelMonitorControl events **************/ event void ChannelMonitorControl.updateNoiseFloorDone() { if(macState == INIT) { sdDebug(122); post StartDoneTask(); } else { sdDebug(124); } } /***** ChannelMonitorData events ******************/ async event void ChannelMonitorData.getSnrDone(int16_t data) { atomic if((macState == RX_P) || (macState == RX_ACK_P)) rssiValue = data; post ReleaseAdcTask(); } /***** unused Radio Modes events **************************/ async event void RadioModes.TimerModeDone() {} async event void RadioModes.SleepModeDone() { atomic setRxMode(); } async event void RadioModes.SelfPollingModeDone() {} async event void RadioModes.PWDDDInterrupt() {} event void ReRxTimer.fired() { atomic { if((macState == RX) && (call RadioModes.SleepMode() == SUCCESS)) { // ok } else { post postponeReRx(); } } } /***** abused TimeStamping events **************************/ async event void RadioTimeStamping.receivedSFD( uint16_t time ) { if(call RssiAdcResource.isOwner()) call ChannelMonitorData.getSnr(); if(macState == RX_P) { rxTime = call LocalTime32kHz.get(); call ChannelMonitor.rxSuccess(); } } async event void RadioTimeStamping.transmittedSFD( uint16_t time, message_t* p_msg ) { if((macState == TX) && (p_msg == txBufPtr)) { // to do } } /***** Rssi Resource events ******************/ event void RssiAdcResource.granted() { macState_t ms; atomic ms = macState; if((ms == INIT) && isFlagSet(&flags, RSSI_STABLE)) { sdDebug(145); call ChannelMonitorControl.updateNoiseFloor(); } else { sdDebug(146); call RssiAdcResource.release(); } } /***** RadioData Resource events **************/ async event void RadioResourceRequested.requested() { atomic { /* This gives other devices the chance to get the Resource because RxMode implies a new arbitration round. */ if (macState == RX) setRxMode(); } } // we don't care about urgent Resource requestes async event void RadioResourceRequested.immediateRequested() {} } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/Duplicate.h000066400000000000000000000037751207233610700216170ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * constants and definitions for duplicate detector * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) */ #ifndef DUPLICATE_H #define DUPLICATE_H typedef struct known_t { am_addr_t src; am_addr_t dest; uint8_t seqno; uint8_t age; } known_t; enum { TABLE_ENTRIES=16, MAX_AGE=0xff, AGE_INTERVALL = 1024, // every second increase the age of the messages }; #endif tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/Duplicate.nc000066400000000000000000000041111207233610700217510ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Keep information for the MAC protocols to suppress duplicates. * @author Andreas Koepke (koepke at tkn.tu-berlin.de) */ interface Duplicate { /** check whether this message is a new message, does not store anything */ async command bool isNew(am_addr_t src, am_addr_t dest, uint8_t seqno); /** remember the fingerprint of this message, stores/updates the information */ async command void remember(am_addr_t src, am_addr_t dest, uint8_t seqno); } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/DuplicateC.nc000066400000000000000000000043301207233610700220570ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Helper component for MAC protocols to suppress duplicates * To do: turn it into a generic? * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) */ #include "Duplicate.h" configuration DuplicateC { provides { interface Duplicate; } } implementation { components MainC; components new TimerMilliC() as Timer; components DuplicateP; Duplicate = DuplicateP; DuplicateP.Timer -> Timer; // make information soft state MainC.SoftwareInit -> DuplicateP; #ifdef DUPLICATE_DEBUG components new SerialDebugC() as SD; DuplicateP.SerialDebug -> SD; #endif } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/DuplicateP.nc000066400000000000000000000111271207233610700220760ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Helper component for MAC protocols to suppress duplicates * To do: turn it into a generic? * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) */ module DuplicateP { provides { interface Duplicate; interface Init; } uses { interface Timer as Timer; #ifdef DUPLICATE_DEBUG interface SerialDebug; #endif } } implementation { known_t knownTable[TABLE_ENTRIES]; #ifdef DUPLICATE_DEBUG void sdDebug(uint16_t p) { call SerialDebug.putPlace(p); } known_t dupOldest; unsigned last; task void dump() { sdDebug(3000 + last); sdDebug(dupOldest.src); sdDebug(dupOldest.dest); sdDebug(dupOldest.seqno); sdDebug(dupOldest.age); sdDebug(4000); sdDebug(knownTable[last].src); sdDebug(knownTable[last].dest); sdDebug(knownTable[last].seqno); sdDebug(knownTable[last].age); sdDebug(5000); } #else void sdDebug(uint16_t p) {}; #endif /** helper functions */ task void ageMsgsTask() { unsigned i; for(i = 0; i < TABLE_ENTRIES; i++) { atomic { if(knownTable[i].age < MAX_AGE) ++knownTable[i].age; } } } unsigned findOldest() { unsigned i; unsigned oldIndex = 0; unsigned age = knownTable[oldIndex].age; for(i = 1; i < TABLE_ENTRIES; i++) { if(age < knownTable[i].age) { oldIndex = i; age = knownTable[i].age; } } return oldIndex; } /*** duplicate interface */ async command bool Duplicate.isNew(am_addr_t src, am_addr_t dest, uint8_t seqno) { bool rVal = TRUE; unsigned i; for(i=0; i < TABLE_ENTRIES; i++) { if((knownTable[i].age < MAX_AGE) && (src == knownTable[i].src) && (dest == knownTable[i].dest) && (seqno == knownTable[i].seqno)) { knownTable[i].age = 0; rVal = FALSE; break; } } sdDebug(100 + rVal); sdDebug(200 + i); return rVal; } async command void Duplicate.remember(am_addr_t src, am_addr_t dest, uint8_t seqno) { unsigned oldest = findOldest(); #ifdef DUPLICATE_DEBUG dupOldest = knownTable[oldest]; last = oldest; post dump(); #endif knownTable[oldest].src = src; knownTable[oldest].dest = dest; knownTable[oldest].seqno = seqno; knownTable[oldest].age = 0; post ageMsgsTask(); } /** helper interfaces */ event void Timer.fired() { call Timer.startOneShot(AGE_INTERVALL); post ageMsgsTask(); } command error_t Init.init(){ uint8_t i; for(i = 0; i < TABLE_ENTRIES; i++) { atomic { knownTable[i].age = MAX_AGE; } } call Timer.startOneShot(AGE_INTERVALL); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/RedMac.h000066400000000000000000000042421207233610700210260ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * packet headers for RedMac primitive messages * - Author -------------------------------------------------------------- * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) * ======================================================================== */ #ifndef RED_MAC_H #define RED_MAC_H typedef nx_struct red_mac_header_t { nx_uint8_t repetitionCounter; nx_uint32_t time; // processing delay of message } red_mac_header_t; #define RELIABLE_MCAST_MIN_ADDR 0xE000 #endif tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/RedMacC.nc000066400000000000000000000104761207233610700213100ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * low power nonpersistent CSMA MAC, rendez-vous via redundantly sent packets * - Author -------------------------------------------------------------- * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) * ======================================================================== */ // #define REDMAC_DEBUG #ifdef REDMAC_PERFORMANCE #include #endif configuration RedMacC { provides { interface SplitControl; interface MacSend; interface MacReceive; interface Packet; interface Sleeptime; interface ChannelCongestion; #ifdef MAC_EVAL interface MacEval; #endif } uses { interface PhySend as PacketSend; interface PhyReceive as PacketReceive; interface Packet as SubPacket; interface Tda5250Control; interface UartPhyControl; interface RadioTimeStamping; } } implementation { components MainC, RedMacP, RssiFixedThresholdCMC as Cca, new Alarm32khz16C() as Timer, new Alarm32khz16C() as SampleTimer, RandomLfsrC, LocalTimeC, DuplicateC, TimeDiffC; components ActiveMessageAddressC; RedMacP.amAddress -> ActiveMessageAddressC; MainC.SoftwareInit -> RedMacP; SplitControl = RedMacP; MacSend = RedMacP; MacReceive = RedMacP; Tda5250Control = RedMacP; UartPhyControl = RedMacP; RadioTimeStamping = RedMacP; ChannelCongestion = RedMacP; RedMacP = PacketSend; RedMacP = PacketReceive; RedMacP = SubPacket; RedMacP = Packet; RedMacP = Sleeptime; RedMacP.CcaStdControl -> Cca.StdControl; RedMacP.ChannelMonitor -> Cca.ChannelMonitor; RedMacP.ChannelMonitorData -> Cca.ChannelMonitorData; RedMacP.ChannelMonitorControl -> Cca.ChannelMonitorControl; RedMacP.RssiAdcResource -> Cca.RssiAdcResource; MainC.SoftwareInit -> RandomLfsrC; RedMacP.Random -> RandomLfsrC; RedMacP.Timer -> Timer; RedMacP.SampleTimer -> SampleTimer; RedMacP.LocalTime32kHz -> LocalTimeC; RedMacP.Duplicate -> DuplicateC; RedMacP.TimeDiff16 -> TimeDiffC; RedMacP.TimeDiff32 -> TimeDiffC; /* components PlatformLedsC; RedMacP.Led0 -> PlatformLedsC.Led0; RedMacP.Led1 -> PlatformLedsC.Led1; RedMacP.Led2 -> PlatformLedsC.Led2; RedMacP.Led3 -> PlatformLedsC.Led3; */ #ifdef MAC_EVAL MacEval = RedMacP; #endif #ifdef REDMAC_DEBUG components new SerialDebugC() as SD; RedMacP.SerialDebug -> SD; #endif #ifdef REDMAC_PERFORMANCE components new PerformanceC() as Perf; RedMacP.Performance -> Perf; #endif #ifdef DELTATIMEDEBUG components DeltaTraceC; RedMacP.DeltaTrace -> DeltaTraceC; #endif } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/RedMacP.nc000066400000000000000000001254561207233610700213320ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * low power nonpersistent CSMA MAC, rendez-vous via redundantly sent packets * - Author -------------------------------------------------------------- * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) * ======================================================================== */ #include "radiopacketfunctions.h" #include "flagfunctions.h" #include "PacketAck.h" #include "RedMac.h" #ifdef DELTATIMEDEBUG #include "DeltaTrace.h" #endif module RedMacP { provides { interface Init; interface SplitControl; interface MacSend; interface MacReceive; interface Packet; interface Sleeptime; interface Teamgeist; interface ChannelCongestion; #ifdef MAC_EVAL interface MacEval; #endif } uses { interface StdControl as CcaStdControl; interface PhySend as PacketSend; interface PhyReceive as PacketReceive; interface RadioTimeStamping; interface Tda5250Control as RadioModes; interface UartPhyControl; interface ChannelMonitor; interface ChannelMonitorControl; interface ChannelMonitorData; interface Resource as RssiAdcResource; interface Random; interface Packet as SubPacket; interface Alarm as Timer; interface Alarm as SampleTimer; interface LocalTime as LocalTime32kHz; interface Duplicate; interface TimeDiff16; interface TimeDiff32; async command am_addr_t amAddress(); /* interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; interface GeneralIO as Led3; */ #ifdef REDMAC_DEBUG interface SerialDebug; #endif #ifdef REDMAC_PERFORMANCE interface Performance; #endif #ifdef DELTATIMEDEBUG interface DeltaTrace; #endif } } implementation { /****** MAC State machine *********************************/ typedef enum { RX, RX_ACK, CCA, CCA_ACK, RX_P, RX_ACK_P, SLEEP, TX, TX_ACK, INIT, STOP } macState_t; macState_t macState; /****** debug vars & defs & functions ***********************/ #ifdef REDMAC_DEBUG void sdDebug(uint16_t p) { call SerialDebug.putPlace(p); } uint8_t repCounter; #else void sdDebug(uint16_t p) {}; #endif #ifdef REDMAC_PERFORMANCE PfmTxMsg_t txStat; PfmRxMsg_t rxStat; #endif /**************** Module Global Constants *****************/ enum { BYTE_TIME=ENCODED_32KHZ_BYTE_TIME, // phy encoded PREAMBLE_BYTE_TIME=TDA5250_32KHZ_BYTE_TIME, // no coding PHY_HEADER_TIME=6*PREAMBLE_BYTE_TIME, // 6 Phy Preamble TIME_CORRECTION=TDA5250_32KHZ_BYTE_TIME+2, // difference between txSFD and rxSFD SUB_HEADER_TIME=PHY_HEADER_TIME + sizeof(message_header_t)*BYTE_TIME, SUB_FOOTER_TIME=2*BYTE_TIME, // 2 bytes crc // DEFAULT_SLEEP_TIME=1625, #ifndef DEFAULT_SLEEP_TIME DEFAULT_SLEEP_TIME=2048, // DEFAULT_SLEEP_TIME=4096, // DEFAULT_SLEEP_TIME=8192, // DEFAULT_SLEEP_TIME=16384, // DEFAULT_SLEEP_TIME=32768U, // DEFAULT_SLEEP_TIME=65535U, #endif DATA_DETECT_TIME=17, RX_SETUP_TIME=102, // time to set up receiver TX_SETUP_TIME=58, // time to set up transmitter ADDED_DELAY = 30, RX_ACK_TIMEOUT = RX_SETUP_TIME + PHY_HEADER_TIME + ADDED_DELAY + 30, TX_GAP_TIME = RX_ACK_TIMEOUT + TX_SETUP_TIME + 33, // the duration of a send ACK ACK_DURATION = SUB_HEADER_TIME + SUB_FOOTER_TIME, NAV_FACTOR = 4, #ifndef MAC_EVAL MAX_SHORT_RETRY=9, MAX_LONG_RETRY=3, ADD_NAV = 2, INCREASE_BACKOFF = TRUE, #endif TOKEN_ACK_FLAG = 64, TOKEN_ACK_MASK = 0x3f, INVALID_SNR = 0xffff, // PREAMBLE_LONG = 5, // PREAMBLE_SHORT = 2, // reduced minimal backoff ZERO_BACKOFF_MASK = 0xff }; #ifdef MAC_EVAL uint8_t MAX_SHORT_RETRY = 9; uint8_t MAX_LONG_RETRY = 3; uint8_t ADD_NAV = 4; bool INCREASE_BACKOFF = TRUE; #endif #ifdef DELTATIMEDEBUG DeltaTrace_t dTrace; #endif /**************** Module Global Variables *****************/ /* flags */ typedef enum { SWITCHING = 1, RSSI_STABLE = 2, UNHANDLED_PACKET = 4, MESSAGE_PREPARED = 8, RESUME_BACKOFF = 16, CANCEL_SEND = 32, ACTION_DETECTED = 64, TEAMGEIST_ACTIVE=128 } flags_t; uint8_t flags = 0; uint8_t checkCounter = 0; uint8_t shortRetryCounter = 0; uint8_t longRetryCounter = 0; uint16_t networkSleeptime = DEFAULT_SLEEP_TIME; uint16_t localSleeptime = DEFAULT_SLEEP_TIME; uint16_t rssiValue = 0; uint32_t restLaufzeit = 0; uint32_t rxTime = 0; am_id_t teamgeistType = 0; uint8_t congestionLevel = 0; message_t *txBufPtr = NULL; uint16_t txLen = 0; red_mac_header_t *txMacHdr = NULL; uint16_t seqNo; message_t ackMsg; uint16_t MIN_BACKOFF_MASK; /****** Secure switching of radio modes ***/ void interruptBackoffTimer(); task void SetRxModeTask(); task void SetTxModeTask(); task void SetSleepModeTask(); task void ReleaseAdcTask() { bool release = FALSE; atomic { if((macState >= SLEEP) && call RssiAdcResource.isOwner()) { release = TRUE; } } if(release) call RssiAdcResource.release(); } void requestAdc() { if(!call RssiAdcResource.isOwner()) { call RssiAdcResource.immediateRequest(); } } void setRxMode() { setFlag(&flags, SWITCHING); clearFlag(&flags, RSSI_STABLE); // sdDebug(10); checkCounter = 0; rssiValue = INVALID_SNR; if(call RadioModes.RxMode() == FAIL) { post SetRxModeTask(); } else { #ifdef REDMAC_PERFORMANCE call Performance.macRxMode(); #endif } requestAdc(); } task void SetRxModeTask() { atomic { if(isFlagSet(&flags, SWITCHING) && ((macState <= CCA) || (macState == INIT))) setRxMode(); } } void setSleepMode() { // sdDebug(20); clearFlag(&flags, RSSI_STABLE); post ReleaseAdcTask(); setFlag(&flags, SWITCHING); if(call RadioModes.SleepMode() == FAIL) { post SetSleepModeTask(); } else { #ifdef REDMAC_PERFORMANCE call Performance.macSleepMode(); #endif } } task void SetSleepModeTask() { atomic if(isFlagSet(&flags, SWITCHING) && ((macState == SLEEP) || (macState == STOP))) setSleepMode(); } void setTxMode() { post ReleaseAdcTask(); // sdDebug(30); clearFlag(&flags, RSSI_STABLE); setFlag(&flags, SWITCHING); if(call RadioModes.TxMode() == FAIL) { post SetTxModeTask(); } else { #ifdef REDMAC_PERFORMANCE call Performance.macTxMode(); #endif } } task void SetTxModeTask() { atomic { if(isFlagSet(&flags, SWITCHING) && ((macState == TX) || (macState == TX_ACK))) setTxMode(); } } /**************** Helper functions ************************/ void computeBackoff(); void checkSend() { if((shortRetryCounter) && (txBufPtr != NULL) && (isFlagSet(&flags, MESSAGE_PREPARED)) && (macState == SLEEP) && (!isFlagSet(&flags, RESUME_BACKOFF)) && (!call Timer.isRunning())) { // sdDebug(40); macState = CCA; checkCounter = 0; setRxMode(); } /* else { if(txBufPtr) // sdDebug(41); if(shortRetryCounter) // sdDebug(42); if(isFlagSet(&flags, MESSAGE_PREPARED)) // sdDebug(43); if(txBufPtr) { if(macState == SLEEP) // sdDebug(44); if(!isFlagSet(&flags, RESUME_BACKOFF)) // sdDebug(45); if(!call Timer.isRunning()) // sdDebug(46); } } */ } uint32_t backoff(uint8_t counter) { uint32_t rVal = call Random.rand16() & MIN_BACKOFF_MASK; if(!INCREASE_BACKOFF) counter = 1; return (rVal << counter) + ZERO_BACKOFF_MASK; } bool needsAckTx(message_t* msg) { bool rVal = FALSE; if(getHeader(msg)->dest < AM_BROADCAST_ADDR) { if(getMetadata(msg)->ack != NO_ACK_REQUESTED) { rVal = TRUE; } } return rVal; } bool needsAckRx(message_t* msg, uint8_t *level) { bool rVal = FALSE; am_addr_t dest = getHeader(msg)->dest; uint8_t token; uint16_t snr = 1; if(dest < AM_BROADCAST_ADDR) { if(dest < RELIABLE_MCAST_MIN_ADDR) { token = getHeader(msg)->token; if(isFlagSet(&token, ACK_REQUESTED)) { rVal = TRUE; } } else { if(isFlagSet(&flags, TEAMGEIST_ACTIVE) && (getHeader(msg)->type == teamgeistType)) { if(rssiValue != INVALID_SNR) snr = rssiValue; *level = 2; rVal = signal Teamgeist.needsAck(msg, getHeader(msg)->src, getHeader(msg)->dest, snr); } } } return rVal; } task void PrepareMsgTask() { message_t *msg; uint8_t length; red_mac_header_t *macHdr; uint16_t sT; atomic { msg = txBufPtr; length = txLen; sT = networkSleeptime; } if(msg == NULL) return; macHdr = (red_mac_header_t *)call SubPacket.getPayload(msg, sizeof(red_mac_header_t)); macHdr->repetitionCounter = sT/(length * BYTE_TIME + SUB_HEADER_TIME + SUB_FOOTER_TIME + TX_GAP_TIME) + 1; atomic { if((longRetryCounter > 1) && isFlagSet(&flags, TEAMGEIST_ACTIVE) && (getHeader(msg)->type == teamgeistType)) { getHeader(msg)->dest = signal Teamgeist.getDestination(msg, longRetryCounter - 1); } getHeader(msg)->token = seqNo; if(needsAckTx(msg)) getHeader(msg)->token |= ACK_REQUESTED; txMacHdr = macHdr; setFlag(&flags, MESSAGE_PREPARED); if((macState == SLEEP) && (!call Timer.isRunning()) && (!isFlagSet(&flags, RESUME_BACKOFF))) { if((longRetryCounter == 1) && (getHeader(msg)->dest != AM_BROADCAST_ADDR)) { call Timer.start((call Random.rand16() >> 3) & ZERO_BACKOFF_MASK); } else { sdDebug(332); sdDebug(macHdr->repetitionCounter); call Timer.start(backoff(longRetryCounter)); } } #ifdef REDMAC_PERFORMANCE txStat.type = getHeader(msg)->type; txStat.to = getHeader(msg)->dest; txStat.token = getHeader(msg)->token; txStat.maxRepCounter = macHdr->repetitionCounter; txStat.creationTime = getMetadata(msg)->time; #endif getMetadata(msg)->maxRepetitions = macHdr->repetitionCounter; } } void storeStrength(message_t *m) { if(rssiValue != INVALID_SNR) { (getMetadata(m))->strength = rssiValue; } else { if(call RssiAdcResource.isOwner()) { (getMetadata(m))->strength = call ChannelMonitorData.readSnr(); } else { (getMetadata(m))->strength = 1; } } } bool prepareRepetition() { bool repeat; atomic { if(isFlagSet(&flags, CANCEL_SEND)) { repeat = txMacHdr->repetitionCounter = 0; } else { repeat = txMacHdr->repetitionCounter; txMacHdr->repetitionCounter--; } } return repeat; } void signalSendDone(error_t error) { message_t *m; error_t e = error; // sdDebug(50); atomic { m = txBufPtr; txBufPtr = NULL; txLen = 0; #ifdef REDMAC_PERFORMANCE txStat.repCounter = txMacHdr->repetitionCounter; txStat.longRetry = longRetryCounter; txStat.shortRetry = shortRetryCounter; #endif longRetryCounter = 0; shortRetryCounter = 0; storeStrength(m); if(isFlagSet(&flags, CANCEL_SEND)) { e = ECANCEL; } clearFlag(&flags, MESSAGE_PREPARED); clearFlag(&flags, CANCEL_SEND); } // sdDebug(3000 + e); // sdDebug(4000 + getHeader(m)->type); signal MacSend.sendDone(m, e); #ifdef REDMAC_PERFORMANCE txStat.success = e; txStat.strength = getMetadata(m)->strength; call Performance.macTxMsgStats(&txStat); #endif } void updateRetryCounters() { shortRetryCounter++; if(shortRetryCounter > MAX_SHORT_RETRY) { longRetryCounter++; shortRetryCounter = 1; if(longRetryCounter > MAX_LONG_RETRY) { // sdDebug(60); signalSendDone(FAIL); } } } void updateLongRetryCounters() { atomic { clearFlag(&flags, MESSAGE_PREPARED); longRetryCounter++; shortRetryCounter = 1; if(longRetryCounter > MAX_LONG_RETRY) { // sdDebug(70); signalSendDone(FAIL); } else { post PrepareMsgTask(); } } } bool ackIsForMe(message_t* msg) { uint8_t localToken = seqNo; setFlag(&localToken, TOKEN_ACK_FLAG); if((getHeader(msg)->dest == call amAddress()) && (localToken == getHeader(msg)->token)) return TRUE; return FALSE; } void interruptBackoffTimer() { if(call Timer.isRunning()) { restLaufzeit = call TimeDiff16.computeDelta(call Timer.getAlarm(), call Timer.getNow()); call Timer.stop(); if(restLaufzeit > MIN_BACKOFF_MASK << MAX_LONG_RETRY) { restLaufzeit = call Random.rand16() & ZERO_BACKOFF_MASK; } setFlag(&flags, RESUME_BACKOFF); } } void computeBackoff() { if(!isFlagSet(&flags, RESUME_BACKOFF)) { setFlag(&flags, RESUME_BACKOFF); restLaufzeit = backoff(longRetryCounter); updateRetryCounters(); } } bool msgIsForMe(message_t* msg) { if(getHeader(msg)->dest == AM_BROADCAST_ADDR) return TRUE; if(getHeader(msg)->dest == call amAddress()) return TRUE; if(getHeader(msg)->dest >= RELIABLE_MCAST_MIN_ADDR) return TRUE; return FALSE; } bool isControl(message_t* m) { uint8_t token = getHeader(m)->token; return isFlagSet(&token, TOKEN_ACK_FLAG); } bool isNewMsg(message_t* msg) { return call Duplicate.isNew(getHeader(msg)->src, getHeader(msg)->dest, (getHeader(msg)->token) & TOKEN_ACK_MASK); } void rememberMsg(message_t* msg) { call Duplicate.remember(getHeader(msg)->src, getHeader(msg)->dest, (getHeader(msg)->token) & TOKEN_ACK_MASK); } void prepareAck(message_t* msg) { uint8_t rToken = getHeader(msg)->token & TOKEN_ACK_MASK; setFlag(&rToken, TOKEN_ACK_FLAG); getHeader(&ackMsg)->token = rToken; getHeader(&ackMsg)->src = call amAddress(); getHeader(&ackMsg)->dest = getHeader(msg)->src; getHeader(&ackMsg)->type = getHeader(msg)->type; #ifdef REDMAC_DEBUG repCounter = ((red_mac_header_t *) call SubPacket.getPayload(msg, sizeof(red_mac_header_t)))->repetitionCounter; #endif } uint32_t calcGeneratedTime(red_mac_header_t *m) { uint32_t lt = rxTime - m->time - TIME_CORRECTION; #ifdef DELTATIMEDEBUG dTrace.now = rxTime; dTrace.msgTime = lt; dTrace.delta = m->time; call DeltaTrace.traceRx(&dTrace); #endif return lt; } /**************** Init ************************/ command error_t Init.init(){ atomic { macState = INIT; seqNo = call Random.rand16() % TOKEN_ACK_FLAG; for(MIN_BACKOFF_MASK = 1; MIN_BACKOFF_MASK < networkSleeptime; ) { MIN_BACKOFF_MASK = (MIN_BACKOFF_MASK << 1) + 1; } MIN_BACKOFF_MASK >>= 2; } #ifdef REDMAC_DEBUG call SerialDebug.putShortDesc("RedMacP"); #endif return SUCCESS; } /**************** SplitControl *****************/ task void StartDoneTask() { // sdDebug(90); atomic { call SampleTimer.start(localSleeptime); macState = SLEEP; setFlag(&flags, TEAMGEIST_ACTIVE); teamgeistType = signal Teamgeist.observedAMType(); } signal SplitControl.startDone(SUCCESS); } command error_t SplitControl.start() { call CcaStdControl.start(); atomic { macState = INIT; setRxMode(); // sdDebug(100); } return SUCCESS; } task void StopDoneTask() { call Init.init(); // sdDebug(110); signal SplitControl.stopDone(SUCCESS); } command error_t SplitControl.stop() { call CcaStdControl.stop(); call Timer.stop(); call SampleTimer.stop(); atomic { if((macState == SLEEP) && isFlagSet(&flags, SWITCHING)) { macState = STOP; // sdDebug(120); } else { macState = STOP; setSleepMode(); // sdDebug(121); } } return SUCCESS; } /****** Packet interface ********************/ command void Packet.clear(message_t* msg) { call SubPacket.clear(msg); } command uint8_t Packet.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg) - sizeof(red_mac_header_t); } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call SubPacket.setPayloadLength(msg,len + sizeof(red_mac_header_t)); } command uint8_t Packet.maxPayloadLength() { return call SubPacket.maxPayloadLength() - sizeof(red_mac_header_t); } command void* Packet.getPayload(message_t* msg, uint8_t len) { nx_uint8_t *payload = (nx_uint8_t *)call SubPacket.getPayload(msg, len + sizeof(red_mac_header_t)); return (void*)(payload + sizeof(red_mac_header_t)); } /****** Radio(Mode) events *************************/ async event void RadioModes.RssiStable() { setFlag(&flags, RSSI_STABLE); if((macState == RX) || (macState == CCA)) { call Timer.start(DATA_DETECT_TIME); // sdDebug(130); } else if(macState == RX_P) { // sdDebug(131); if(call RssiAdcResource.isOwner()) call ChannelMonitorData.getSnr(); } else if(macState == RX_ACK) { } else if(macState == RX_ACK_P) { } else if(macState == INIT) { // sdDebug(133); if(call RssiAdcResource.isOwner()) { call ChannelMonitorControl.updateNoiseFloor(); } else { call RssiAdcResource.request(); } } else if(macState == STOP) { // sdDebug(134); } else { // sdDebug(135); } } async event void RadioModes.RxModeDone() { atomic { clearFlag(&flags, SWITCHING); if((macState == RX) || (macState == RX_ACK) || (macState == CCA) || (macState == INIT) || (macState == STOP)) { // sdDebug(140); if(macState != RX_ACK) requestAdc(); } else { // sdDebug(141); } } } async event void RadioModes.TxModeDone() { // sdDebug(150); atomic { clearFlag(&flags, SWITCHING); if(macState == TX) { setFlag(&flags, ACTION_DETECTED); if(call PacketSend.send(txBufPtr, txLen) == SUCCESS) { // sdDebug(151); } else { // sdDebug(152); } } else if(macState == TX_ACK) { if(call PacketSend.send(&ackMsg, 0) == SUCCESS) { // sdDebug(153); } else { // sdDebug(154); } } else { // sdDebug(155); } } } async event void RadioModes.SleepModeDone() { // sdDebug(160); atomic { clearFlag(&flags, SWITCHING); if(isFlagSet(&flags, ACTION_DETECTED)) { if(congestionLevel < 5) congestionLevel++; } else { if(congestionLevel > 0) congestionLevel--; } // if(congestionLevel > 3) // sdDebug(2000 + congestionLevel); if(macState == SLEEP) { // sdDebug(161); if(!call Timer.isRunning()) { // sdDebug(162); if(isFlagSet(&flags, RESUME_BACKOFF)) { // sdDebug(164); clearFlag(&flags, RESUME_BACKOFF); call Timer.start(restLaufzeit); restLaufzeit = 0; } else { // sdDebug(165); checkSend(); } } } else if(macState == STOP) { // sdDebug(168); post StopDoneTask(); } signal ChannelCongestion.congestionEvent(congestionLevel); } } /****** MacSend events *************************/ async command error_t MacSend.send(message_t* msg, uint8_t len) { error_t err = SUCCESS; atomic { if((shortRetryCounter == 0) && (txBufPtr == NULL)) { clearFlag(&flags, MESSAGE_PREPARED); // sdDebug(5000 + getHeader(msg)->type); shortRetryCounter = 1; longRetryCounter = 1; txBufPtr = msg; txLen = len + sizeof(red_mac_header_t); seqNo++; if(seqNo >= TOKEN_ACK_FLAG) seqNo = 1; #ifdef REDMAC_PERFORMANCE txStat.payloadLength = txLen; txStat.interfaceTime = call LocalTime32kHz.get(); #endif } else { // sdDebug(171); err = EBUSY; } } if(err == SUCCESS) { post PrepareMsgTask(); } return err; } async command error_t MacSend.cancel(message_t* msg) { error_t err = FAIL; atomic { if(msg == txBufPtr) { // sdDebug(320); setFlag(&flags, CANCEL_SEND); shortRetryCounter = MAX_SHORT_RETRY + 2; longRetryCounter = MAX_LONG_RETRY + 2; if(macState == SLEEP) { // sdDebug(321); signalSendDone(ECANCEL); } else { // sdDebug(322); } // sdDebug(1000 + macState); err = SUCCESS; } else { // sdDebug(323); // sdDebug(1100 + macState); } } return err; } /****** PacketSerializer events **********************/ async event void PacketReceive.receiveDetected() { rssiValue = INVALID_SNR; setFlag(&flags, ACTION_DETECTED); call ChannelMonitor.rxSuccess(); if(macState <= CCA_ACK) { if(macState == CCA) { computeBackoff(); #ifdef REDMAC_PERFORMANCE call Performance.macDetectedOnCca(); #endif } if(macState != RX_ACK) { macState = RX_P; } else { macState = RX_ACK_P; } } else if(macState == INIT) { // sdDebug(180); setFlag(&flags, UNHANDLED_PACKET); } } async event message_t* PacketReceive.receiveDone(message_t* msg, void* payload, uint8_t len, error_t error) { message_t *m = msg; macState_t action = STOP; uint32_t nav = 0; uint8_t level = 0; bool isCnt; #ifdef REDMAC_PERFORMANCE rxStat.duplicate = PERF_UNKNOWN; rxStat.repCounter = 0xff; #endif // sdDebug(190); if(macState == RX_P) { // sdDebug(191); if(error == SUCCESS) { // sdDebug(192); isCnt = isControl(msg); if(msgIsForMe(msg)) { if(!isCnt) { // sdDebug(193); if(isNewMsg(msg)) { #ifdef REDMAC_PERFORMANCE rxStat.duplicate = PERF_NEW_MSG; #endif // sdDebug(194); storeStrength(msg); #ifdef DELTATIMEDEBUG dTrace.sender = getHeader(msg)->src; #endif getMetadata(msg)->sfdtime = rxTime; getMetadata(msg)->time = calcGeneratedTime((red_mac_header_t*) payload); getMetadata(msg)->ack = WAS_NOT_ACKED; m = signal MacReceive.receiveDone(msg); // assume a buffer swap -- if buffer is not swapped, assume that the // message was not successfully delivered to upper layers if(m != msg) { // sdDebug(195); rememberMsg(msg); } else { // sdDebug(196); action = RX; #ifdef REDMAC_PERFORMANCE call Performance.macQueueFull(); #endif } } else { #ifdef REDMAC_PERFORMANCE rxStat.duplicate = PERF_REPEATED_MSG; #endif } if(needsAckRx(msg, &level) && (action != RX)) { action = CCA_ACK; if(level == 2) { getMetadata(msg)->ack = WAS_ACKED; } } else { // sdDebug(198); if(action != RX) { nav = ((red_mac_header_t*)payload)->repetitionCounter * (SUB_HEADER_TIME + getHeader(msg)->length*BYTE_TIME + SUB_FOOTER_TIME + RX_ACK_TIMEOUT + TX_SETUP_TIME) + ACK_DURATION; action = SLEEP; } } } else { // sdDebug(199); action = RX; } } else { // sdDebug(200); action = SLEEP; if(!isCnt) { nav = ((red_mac_header_t*)payload)->repetitionCounter * (SUB_HEADER_TIME + getHeader(msg)->length*BYTE_TIME + SUB_FOOTER_TIME + RX_ACK_TIMEOUT + TX_SETUP_TIME) + ACK_DURATION; } } } else { // sdDebug(201); action = SLEEP; } } else if(macState == RX_ACK_P) { if(error == SUCCESS) { if(ackIsForMe(msg)) { // sdDebug(202); getMetadata(txBufPtr)->ack = WAS_ACKED; getMetadata(txBufPtr)->repetitions = txMacHdr->repetitionCounter; if(isFlagSet(&flags, TEAMGEIST_ACTIVE) && (getHeader(txBufPtr)->type == teamgeistType)) { signal Teamgeist.gotAck(txBufPtr, getHeader(msg)->src, getMetadata(txBufPtr)->strength); } // sdDebug(203); signalSendDone(SUCCESS); // sdDebug(30000 + getHeader(msg)->src); action = SLEEP; } else { // sdDebug(203); updateLongRetryCounters(); // this will eventually schedule the right backoff macState = SLEEP; // so much traffic is going on -- take a nap setSleepMode(); action = INIT; // a difficult way to say: do nothing } } else { if(call Timer.isRunning()) { // sdDebug(204); action = RX_ACK; } else { // sdDebug(205); updateLongRetryCounters(); action = RX; } } } else { // sdDebug(206); action = INIT; } if(action == CCA_ACK) { macState = CCA_ACK; if(call Random.rand16() & 2) { call Timer.start(RX_SETUP_TIME - TX_SETUP_TIME + 16 - level*8 + ADDED_DELAY); } else { macState = TX_ACK; call Timer.start(RX_SETUP_TIME - TX_SETUP_TIME + 16); } prepareAck(msg); } else if(action == RX_ACK) { macState = RX_ACK; } else if(action == RX) { macState = RX; checkCounter = 0; call Timer.start(DATA_DETECT_TIME); } else if(action == SLEEP) { macState = SLEEP; if(isFlagSet(&flags, RESUME_BACKOFF)) { nav = nav*(uint32_t)ADD_NAV/(uint32_t)NAV_FACTOR; if(nav > restLaufzeit) restLaufzeit += nav; } else { setFlag(&flags, RESUME_BACKOFF); restLaufzeit = call Random.rand16() & ZERO_BACKOFF_MASK; } setSleepMode(); } else if(action == INIT) { clearFlag(&flags, UNHANDLED_PACKET); } else { // sdDebug(207); } #ifdef REDMAC_PERFORMANCE if(error == SUCCESS) { rxStat.type = getHeader(msg)->type; rxStat.from = getHeader(msg)->src; rxStat.to = getHeader(msg)->dest; rxStat.token = getHeader(msg)->token; if(!isControl(msg)) rxStat.repCounter = ((red_mac_header_t*)payload)->repetitionCounter; rxStat.payloadLength = len; rxStat.strength = rssiValue; rxStat.creationTime = getMetadata(msg)->time; call Performance.macRxStats(&rxStat); } #endif return m; } async event void PacketSend.sendDone(message_t* msg, error_t error) { if(macState == TX) { macState = RX_ACK; setRxMode(); call Timer.start(RX_ACK_TIMEOUT); // sdDebug(220); checkCounter = 0; } else if(macState == TX_ACK) { checkCounter = 0; macState = SLEEP; setSleepMode(); // macState = RX; // setRxMode(); // sdDebug(221); #ifdef REDMAC_DEBUG // sdDebug(40000U + repCounter); #endif } } /***** TimeStamping stuff **************************/ async event void RadioTimeStamping.receivedSFD( uint16_t time ) { if(call RssiAdcResource.isOwner()) call ChannelMonitorData.getSnr(); if(macState == RX_P) { rxTime = call LocalTime32kHz.get(); call ChannelMonitor.rxSuccess(); } } async event void RadioTimeStamping.transmittedSFD( uint16_t time, message_t* p_msg ) { if((macState == TX) && (p_msg == txBufPtr)) { #ifdef DELTATIMEDEBUG dTrace.now = call LocalTime32kHz.get(); dTrace.msgTime = getMetadata(p_msg)->time; dTrace.delta = call TimeDiff32.computeDelta(dTrace.now, dTrace.msgTime); txMacHdr->time = dTrace.delta; call DeltaTrace.traceTx(&dTrace); getMetadata(p_msg)->sfdtime = dTrace.now; #else getMetadata(p_msg)->sfdtime = call LocalTime32kHz.get(); txMacHdr->time = call TimeDiff32.computeDelta(getMetadata(p_msg)->sfdtime, getMetadata(p_msg)->time); #endif } } /****** Timer ******************************/ void checkOnBusy() { setFlag(&flags, ACTION_DETECTED); if((macState == RX) || (macState == CCA) || (macState == CCA_ACK)) { if(macState == CCA) { computeBackoff(); #ifdef REDMAC_PERFORMANCE call Performance.macBusyOnCca(); #endif } requestAdc(); // sdDebug(230); macState = RX; checkCounter = 0; call Timer.start(TX_GAP_TIME>>1); } } void checkOnIdle() { if(macState == RX) { checkCounter++; if(checkCounter >= 3) { // sdDebug(240); macState = SLEEP; setSleepMode(); } else { // sdDebug(241); call Timer.start(TX_GAP_TIME >> 1); requestAdc(); } } else if(macState == CCA) { checkCounter++; if(checkCounter < 3) { // sdDebug(242); call Timer.start(TX_GAP_TIME >> 1); requestAdc(); } else { // sdDebug(243); macState = TX; setTxMode(); #ifdef REDMAC_PERFORMANCE call Performance.macIdleOnCca(); txStat.txModeTime = call LocalTime32kHz.get(); #endif } } else if(macState == CCA_ACK) { // sdDebug(244); macState = TX_ACK; setTxMode(); // sdDebug(20000 + getHeader(&ackMsg)->dest); #ifdef REDMAC_PERFORMANCE call Performance.macTxAckStats(getHeader(&ackMsg)->type, getHeader(&ackMsg)->dest, getHeader(&ackMsg)->token); #endif } } async event void Timer.fired() { // sdDebug(250); if((macState == RX) || (macState == CCA) || (macState == CCA_ACK)) { if((!call RssiAdcResource.isOwner()) || (call ChannelMonitor.start() != SUCCESS)) { if(call UartPhyControl.isBusy()) { // sdDebug(251); checkOnBusy(); } else { // sdDebug(252); checkOnIdle(); } } } else if(macState == RX_ACK) { if(prepareRepetition()) { // sdDebug(253); macState = TX; setTxMode(); } else { if(needsAckTx(txBufPtr)) { // sdDebug(254); #ifdef REDMAC_PERFORMANCE call Performance.macAckTimeout(); #endif updateLongRetryCounters(); } else { // sdDebug(255); signalSendDone(SUCCESS); } macState = SLEEP; setSleepMode(); } } else if(macState == TX_ACK) { setTxMode(); // sdDebug(10000 + getHeader(&ackMsg)->dest); } else if(macState == SLEEP) { if(isFlagSet(&flags, SWITCHING)) { // sdDebug(256); call Timer.start(call Random.rand16() & 0x0f); } else { if(isFlagSet(&flags, RESUME_BACKOFF)) { // sdDebug(261); clearFlag(&flags, RESUME_BACKOFF); call Timer.start(restLaufzeit); restLaufzeit = 0; } else { // sdDebug(262); checkSend(); } } } else if((macState == RX_ACK_P) || (macState == RX_P)) { // sdDebug(258); } else if(macState == INIT) { // sdDebug(259); post StartDoneTask(); } else { // sdDebug(260); } } /****** SampleTimer ******************************/ async event void SampleTimer.fired() { call SampleTimer.start(localSleeptime); // sdDebug(270); if((macState == SLEEP) && (!isFlagSet(&flags, SWITCHING))) { clearFlag(&flags, ACTION_DETECTED); interruptBackoffTimer(); macState = RX; // sdDebug(271); setRxMode(); call Timer.stop(); } } /***** Sleeptime **********************************/ async command void Sleeptime.setLocalSleeptime(uint16_t sT) { atomic localSleeptime = sT; } async command uint16_t Sleeptime.getLocalSleeptime() { uint16_t st; atomic st = localSleeptime; return st; } async command void Sleeptime.setNetworkSleeptime(uint16_t sT) { atomic { networkSleeptime = sT; for(MIN_BACKOFF_MASK = 1; MIN_BACKOFF_MASK < sT; ) { MIN_BACKOFF_MASK = (MIN_BACKOFF_MASK << 1) + 1; } MIN_BACKOFF_MASK >>= 3; } } async command uint16_t Sleeptime.getNetworkSleeptime() { uint16_t st; atomic st = networkSleeptime; return st; } /****** ChannelMonitor events *********************/ async event void ChannelMonitor.channelBusy() { // sdDebug(280); checkOnBusy(); } async event void ChannelMonitor.channelIdle() { // sdDebug(281); checkOnIdle(); } /****** ChannelMonitorControl events **************/ event void ChannelMonitorControl.updateNoiseFloorDone() { if(macState == INIT) { // sdDebug(290); call Timer.start(call Random.rand16() % localSleeptime); setSleepMode(); } else { // sdDebug(291); } } /***** ChannelMonitorData events ******************/ async event void ChannelMonitorData.getSnrDone(int16_t data) { atomic if((macState == RX_P) || (macState == RX_ACK_P)) rssiValue = data; } /***** Rssi Resource events ******************/ event void RssiAdcResource.granted() { macState_t ms; atomic ms = macState; if(ms < SLEEP) { // sdDebug(300); } else if(ms == INIT) { // sdDebug(301); call ChannelMonitorControl.updateNoiseFloor(); } else { // sdDebug(302); post ReleaseAdcTask(); } } /***** default Teamgeist events **************************/ default event am_id_t Teamgeist.observedAMType() { clearFlag(&flags, TEAMGEIST_ACTIVE); return teamgeistType; } default async event bool Teamgeist.needsAck(message_t *msg, am_addr_t src, am_addr_t dest, uint16_t snr) { clearFlag(&flags, TEAMGEIST_ACTIVE); return TRUE; } default async event uint8_t Teamgeist.estimateForwarders(message_t *msg) { return 1; } default async event am_addr_t Teamgeist.getDestination(message_t *msg, uint8_t retryCounter) { return getHeader(msg)->dest; } default async event void Teamgeist.gotAck(message_t *msg, am_addr_t ackSender, uint16_t snr) { } default async event void ChannelCongestion.congestionEvent(uint8_t level) {} /***** Mac Eval *******************************************/ #ifdef MAC_EVAL async command void MacEval.setBackoffMask(uint16_t mask) { atomic MIN_BACKOFF_MASK = mask; } async command void MacEval.increaseBackoff(bool value) { atomic INCREASE_BACKOFF = value; } async command void MacEval.addNav(uint8_t value) { atomic ADD_NAV = value; } async command void MacEval.setLongRetry(uint8_t lr) { atomic MAX_LONG_RETRY = lr; } async command void MacEval.setShortRetry(uint8_t sr) { atomic MAX_SHORT_RETRY = sr; } #endif /***** unused Radio Modes events **************************/ async event void RadioModes.TimerModeDone() {} async event void RadioModes.SelfPollingModeDone() {} async event void RadioModes.PWDDDInterrupt() {} } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/Sleeptime.nc000066400000000000000000000053431207233610700217760ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface to control the duty cycle of the MAC * @author Andreas Koepke (koepke at tkn.tu-berlin.de) */ interface Sleeptime { /** * set the sleep time of the MAC in units of a 32kHz clock, the setting * takes effect on the next wakeup. * * Caution 1: To avoid synchroninization of the wake up times, some * additional randomization can be necessary, esp. when * switching from shorter to longer sleep times. * Caution 2: The local sleep time must be equal or shorter than the * network sleep time */ async command void setLocalSleeptime(uint16_t sT); /** * which sleep time is in effect? */ async command uint16_t getLocalSleeptime(); /** * set the expected sleep time of the network -- this defines how long this * node will attempt to wake up a remote node. * Caution: The local sleep time must be equal or shorter than the * network sleep time */ async command void setNetworkSleeptime(uint16_t sT); /** * how long do we expect our neighbors to sleep? */ async command uint16_t getNetworkSleeptime(); } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/SpeckMacDC.nc000066400000000000000000000105451207233610700217440ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * low power nonpersistent CSMA MAC, rendez-vous via redundantly sent packets * - Author -------------------------------------------------------------- * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) * ======================================================================== */ // #define SPECKMAC_DEBUG #ifdef SPECKMAC_PERFORMANCE #include #endif configuration SpeckMacDC { provides { interface SplitControl; interface MacSend; interface MacReceive; interface Packet; interface Sleeptime; interface ChannelCongestion; #ifdef MAC_EVAL interface MacEval; #endif } uses { interface PhySend as PacketSend; interface PhyReceive as PacketReceive; interface Packet as SubPacket; interface Tda5250Control; interface UartPhyControl; interface RadioTimeStamping; } } implementation { components MainC, SpeckMacDP, RssiFixedThresholdCMC as Cca, new Alarm32khz16C() as Timer, new Alarm32khz16C() as SampleTimer, RandomLfsrC, LocalTimeC, DuplicateC, TimeDiffC; components ActiveMessageAddressC; SpeckMacDP.amAddress -> ActiveMessageAddressC; MainC.SoftwareInit -> SpeckMacDP; SplitControl = SpeckMacDP; MacSend = SpeckMacDP; MacReceive = SpeckMacDP; Tda5250Control = SpeckMacDP; UartPhyControl = SpeckMacDP; RadioTimeStamping = SpeckMacDP; ChannelCongestion = SpeckMacDP; SpeckMacDP = PacketSend; SpeckMacDP = PacketReceive; SpeckMacDP = SubPacket; SpeckMacDP = Packet; SpeckMacDP = Sleeptime; SpeckMacDP.CcaStdControl -> Cca.StdControl; SpeckMacDP.ChannelMonitor -> Cca.ChannelMonitor; SpeckMacDP.ChannelMonitorData -> Cca.ChannelMonitorData; SpeckMacDP.ChannelMonitorControl -> Cca.ChannelMonitorControl; SpeckMacDP.RssiAdcResource -> Cca.RssiAdcResource; MainC.SoftwareInit -> RandomLfsrC; SpeckMacDP.Random -> RandomLfsrC; SpeckMacDP.Timer -> Timer; SpeckMacDP.SampleTimer -> SampleTimer; SpeckMacDP.LocalTime32kHz -> LocalTimeC; SpeckMacDP.Duplicate -> DuplicateC; SpeckMacDP.TimeDiff16 -> TimeDiffC; SpeckMacDP.TimeDiff32 -> TimeDiffC; /* components PlatformLedsC; SpeckMacDP.Led0 -> PlatformLedsC.Led0; SpeckMacDP.Led1 -> PlatformLedsC.Led1; SpeckMacDP.Led2 -> PlatformLedsC.Led2; SpeckMacDP.Led3 -> PlatformLedsC.Led3; */ #ifdef MAC_EVAL MacEval = SpeckMacDP; #endif #ifdef SPECKMAC_DEBUG components new SerialDebugC() as SD; SpeckMacDP.SerialDebug -> SD; #endif #ifdef SPECKMAC_PERFORMANCE components new PerformanceC() as Perf; SpeckMacDP.Performance -> Perf; #endif } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/SpeckMacDP.nc000066400000000000000000001104701207233610700217570ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * low power nonpersistent CSMA MAC, rendez-vous via redundantly sent packets * - Author -------------------------------------------------------------- * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) * ======================================================================== */ #include "radiopacketfunctions.h" #include "flagfunctions.h" #include "PacketAck.h" #include "RedMac.h" module SpeckMacDP { provides { interface Init; interface SplitControl; interface MacSend; interface MacReceive; interface Packet; interface Sleeptime; interface ChannelCongestion; #ifdef MAC_EVAL interface MacEval; #endif } uses { interface StdControl as CcaStdControl; interface PhySend as PacketSend; interface PhyReceive as PacketReceive; interface RadioTimeStamping; interface Tda5250Control as RadioModes; interface UartPhyControl; interface ChannelMonitor; interface ChannelMonitorControl; interface ChannelMonitorData; interface Resource as RssiAdcResource; interface Random; interface Packet as SubPacket; interface Alarm as Timer; interface Alarm as SampleTimer; interface LocalTime as LocalTime32kHz; interface Duplicate; interface TimeDiff16; interface TimeDiff32; async command am_addr_t amAddress(); /* interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; interface GeneralIO as Led3; */ #ifdef SPECKMAC_DEBUG interface SerialDebug; #endif #ifdef SPECKMAC_PERFORMANCE interface Performance; #endif } } implementation { /****** MAC State machine *********************************/ typedef enum { RX, RX_ACK, CCA, CCA_ACK, RX_P, RX_ACK_P, SLEEP, TX, TX_ACK, INIT, STOP } macState_t; macState_t macState; /****** debug vars & defs & functions ***********************/ #ifdef SPECKMAC_DEBUG void sdDebug(uint16_t p) { call SerialDebug.putPlace(p); } uint8_t repCounter; #else void sdDebug(uint16_t p) {}; #endif #ifdef SPECKMAC_PERFORMANCE macTxStat_t txStat; macRxStat_t rxStat; #endif /**************** Module Global Constants *****************/ enum { BYTE_TIME=ENCODED_32KHZ_BYTE_TIME, // phy encoded PREAMBLE_BYTE_TIME=TDA5250_32KHZ_BYTE_TIME, // no coding PHY_HEADER_TIME=6*PREAMBLE_BYTE_TIME, // 6 Phy Preamble TIME_CORRECTION=TDA5250_32KHZ_BYTE_TIME+2, // difference between txSFD and rxSFD SUB_HEADER_TIME=PHY_HEADER_TIME + sizeof(message_header_t)*BYTE_TIME, SUB_FOOTER_TIME=2*BYTE_TIME, // 2 bytes crc #ifndef DEFAULT_SLEEP_TIME DEFAULT_SLEEP_TIME=1625, // DEFAULT_SLEEP_TIME=3250, // DEFAULT_SLEEP_TIME=6500, // DEFAULT_SLEEP_TIME=8192, // DEFAULT_SLEEP_TIME=16384, // DEFAULT_SLEEP_TIME=32768U, // DEFAULT_SLEEP_TIME=65535U, #endif DATA_DETECT_TIME=17, RX_SETUP_TIME=102, // time to set up receiver TX_SETUP_TIME=58, // time to set up transmitter ADDED_DELAY = 30, RX_ACK_TIMEOUT = RX_SETUP_TIME + PHY_HEADER_TIME + ADDED_DELAY + 30, TX_GAP_TIME = RX_ACK_TIMEOUT + TX_SETUP_TIME + 33, // the duration of a send ACK ACK_DURATION = SUB_HEADER_TIME + SUB_FOOTER_TIME, NAV_FACTOR = 4, #ifndef MAC_EVAL MAX_SHORT_RETRY=9, MAX_LONG_RETRY=3, ADD_NAV = 4, INCREASE_BACKOFF = TRUE, #endif TOKEN_ACK_FLAG = 64, TOKEN_ACK_MASK = 0x3f, INVALID_SNR = 0xffff, // PREAMBLE_LONG = 5, // PREAMBLE_SHORT = 2, // reduced minimal backoff ZERO_BACKOFF_MASK = 0xff }; /**************** Module Global Variables *****************/ #ifdef MAC_EVAL uint8_t MAX_SHORT_RETRY = 9; uint8_t MAX_LONG_RETRY = 3; uint8_t ADD_NAV = 4; bool INCREASE_BACKOFF = TRUE; #endif /* flags */ typedef enum { SWITCHING = 1, RSSI_STABLE = 2, UNHANDLED_PACKET = 4, MESSAGE_PREPARED = 8, RESUME_BACKOFF = 16, CANCEL_SEND = 32, ACTION_DETECTED = 64, } flags_t; uint8_t flags = 0; uint8_t checkCounter = 0; uint8_t shortRetryCounter = 0; uint8_t longRetryCounter = 0; uint16_t networkSleeptime = DEFAULT_SLEEP_TIME; uint16_t localSleeptime = DEFAULT_SLEEP_TIME; uint16_t rssiValue = 0; uint32_t restLaufzeit = 0; uint32_t rxTime = 0; uint8_t congestionLevel = 0; message_t *txBufPtr = NULL; uint16_t txLen = 0; red_mac_header_t *txMacHdr = NULL; uint16_t seqNo; message_t ackMsg; uint16_t MIN_BACKOFF_MASK; /****** Secure switching of radio modes ***/ void interruptBackoffTimer(); task void SetRxModeTask(); task void SetTxModeTask(); task void SetSleepModeTask(); task void ReleaseAdcTask() { bool release = FALSE; atomic { if((macState >= SLEEP) && call RssiAdcResource.isOwner()) { release = TRUE; } } if(release) call RssiAdcResource.release(); } void requestAdc() { if(!call RssiAdcResource.isOwner()) { call RssiAdcResource.immediateRequest(); } } void setRxMode() { setFlag(&flags, SWITCHING); clearFlag(&flags, RSSI_STABLE); checkCounter = 0; rssiValue = INVALID_SNR; if(call RadioModes.RxMode() == FAIL) { post SetRxModeTask(); } else { #ifdef SPECKMAC_PERFORMANCE call Performance.macRxMode(); #endif } requestAdc(); } task void SetRxModeTask() { atomic { if(isFlagSet(&flags, SWITCHING) && ((macState <= CCA) || (macState == INIT))) setRxMode(); } } void setSleepMode() { clearFlag(&flags, RSSI_STABLE); post ReleaseAdcTask(); setFlag(&flags, SWITCHING); if(call RadioModes.SleepMode() == FAIL) { post SetSleepModeTask(); } else { #ifdef SPECKMAC_PERFORMANCE call Performance.macSleepMode(); #endif } } task void SetSleepModeTask() { atomic if(isFlagSet(&flags, SWITCHING) && ((macState == SLEEP) || (macState == STOP))) setSleepMode(); } void setTxMode() { post ReleaseAdcTask(); clearFlag(&flags, RSSI_STABLE); setFlag(&flags, SWITCHING); if(call RadioModes.TxMode() == FAIL) { post SetTxModeTask(); } else { #ifdef SPECKMAC_PERFORMANCE call Performance.macTxMode(); #endif } } task void SetTxModeTask() { atomic { if(isFlagSet(&flags, SWITCHING) && ((macState == TX) || (macState == TX_ACK))) setTxMode(); } } /**************** Helper functions ************************/ void computeBackoff(); void checkSend() { if((shortRetryCounter) && (txBufPtr != NULL) && (isFlagSet(&flags, MESSAGE_PREPARED)) && (macState == SLEEP) && (!isFlagSet(&flags, RESUME_BACKOFF)) && (!call Timer.isRunning())) { macState = CCA; checkCounter = 0; setRxMode(); } } uint32_t backoff(uint8_t counter) { uint32_t rVal = call Random.rand16() & MIN_BACKOFF_MASK; if(!INCREASE_BACKOFF) counter = 1; return (rVal << counter) + ZERO_BACKOFF_MASK; } bool needsAckTx(message_t* msg) { bool rVal = FALSE; if(getHeader(msg)->dest < AM_BROADCAST_ADDR) { if(getMetadata(msg)->ack != NO_ACK_REQUESTED) { rVal = TRUE; } } return rVal; } bool needsAckRx(message_t* msg) { bool rVal = FALSE; am_addr_t dest = getHeader(msg)->dest; uint8_t token; if(dest < AM_BROADCAST_ADDR) { token = getHeader(msg)->token; if(isFlagSet(&token, ACK_REQUESTED)) { rVal = TRUE; } } return rVal; } task void PrepareMsgTask() { message_t *msg; uint8_t length; red_mac_header_t *macHdr; uint16_t sT; atomic { msg = txBufPtr; length = txLen; sT = networkSleeptime; } if(msg == NULL) return; macHdr = (red_mac_header_t *)call SubPacket.getPayload(msg, sizeof(red_mac_header_t)); macHdr->repetitionCounter = sT/(length * BYTE_TIME + SUB_HEADER_TIME + SUB_FOOTER_TIME) + 1; atomic { getHeader(msg)->token = seqNo; if(needsAckTx(msg)) getHeader(msg)->token |= ACK_REQUESTED; txMacHdr = macHdr; setFlag(&flags, MESSAGE_PREPARED); if(macState == SLEEP) { } else { } if(!call Timer.isRunning()) { } else { } if(!isFlagSet(&flags, RESUME_BACKOFF)) { } else { } if((macState == SLEEP) && (!call Timer.isRunning()) && (!isFlagSet(&flags, RESUME_BACKOFF))) { if((longRetryCounter == 1) && (getHeader(msg)->dest != AM_BROADCAST_ADDR)) { call Timer.start((call Random.rand16() >> 3) & ZERO_BACKOFF_MASK); } else { call Timer.start(backoff(longRetryCounter)); } } #ifdef SPECKMAC_PERFORMANCE txStat.type = getHeader(msg)->type; txStat.to = getHeader(msg)->dest; txStat.token = getHeader(msg)->token; txStat.maxRepCounter = macHdr->repetitionCounter; txStat.creationTime = getMetadata(msg)->time; #endif getMetadata(msg)->maxRepetitions = macHdr->repetitionCounter; } } void storeStrength(message_t *m) { if(rssiValue != INVALID_SNR) { (getMetadata(m))->strength = rssiValue; } else { if(call RssiAdcResource.isOwner()) { (getMetadata(m))->strength = call ChannelMonitorData.readSnr(); } else { (getMetadata(m))->strength = 1; } } } bool prepareRepetition() { bool repeat; atomic { if(isFlagSet(&flags, CANCEL_SEND)) { repeat = txMacHdr->repetitionCounter = 0; } else { repeat = txMacHdr->repetitionCounter; txMacHdr->repetitionCounter--; } } return repeat; } void signalSendDone(error_t error) { message_t *m; error_t e = error; atomic { m = txBufPtr; txBufPtr = NULL; txLen = 0; #ifdef SPECKMAC_PERFORMANCE txStat.repCounter = txMacHdr->repetitionCounter; txStat.longRetry = longRetryCounter; txStat.shortRetry = shortRetryCounter; #endif longRetryCounter = 0; shortRetryCounter = 0; storeStrength(m); if(isFlagSet(&flags, CANCEL_SEND)) { e = ECANCEL; } clearFlag(&flags, MESSAGE_PREPARED); clearFlag(&flags, CANCEL_SEND); } signal MacSend.sendDone(m, e); #ifdef SPECKMAC_PERFORMANCE txStat.success = e; txStat.strength = getMetadata(m)->strength; call Performance.macTxMsgStats(&txStat); #endif } void updateRetryCounters() { shortRetryCounter++; if(shortRetryCounter > MAX_SHORT_RETRY) { longRetryCounter++; shortRetryCounter = 1; if(longRetryCounter > MAX_LONG_RETRY) { signalSendDone(FAIL); } } } void updateLongRetryCounters() { atomic { clearFlag(&flags, MESSAGE_PREPARED); longRetryCounter++; shortRetryCounter = 1; if(longRetryCounter > MAX_LONG_RETRY) { signalSendDone(FAIL); } else { post PrepareMsgTask(); } } } bool ackIsForMe(message_t* msg) { uint8_t localToken = seqNo; setFlag(&localToken, TOKEN_ACK_FLAG); if((getHeader(msg)->dest == call amAddress()) && (localToken == getHeader(msg)->token)) return TRUE; return FALSE; } void interruptBackoffTimer() { if(call Timer.isRunning()) { restLaufzeit = call TimeDiff16.computeDelta(call Timer.getAlarm(), call Timer.getNow()); call Timer.stop(); if(restLaufzeit > MIN_BACKOFF_MASK << MAX_LONG_RETRY) { restLaufzeit = call Random.rand16() & ZERO_BACKOFF_MASK; } setFlag(&flags, RESUME_BACKOFF); } } void computeBackoff() { if(!isFlagSet(&flags, RESUME_BACKOFF)) { setFlag(&flags, RESUME_BACKOFF); restLaufzeit = backoff(longRetryCounter); updateRetryCounters(); } } bool msgIsForMe(message_t* msg) { if(getHeader(msg)->dest == AM_BROADCAST_ADDR) return TRUE; if(getHeader(msg)->dest == call amAddress()) return TRUE; if(getHeader(msg)->dest >= RELIABLE_MCAST_MIN_ADDR) return TRUE; return FALSE; } bool isControl(message_t* m) { uint8_t token = getHeader(m)->token; return isFlagSet(&token, TOKEN_ACK_FLAG); } bool isNewMsg(message_t* msg) { return call Duplicate.isNew(getHeader(msg)->src, getHeader(msg)->dest, (getHeader(msg)->token) & TOKEN_ACK_MASK); } void rememberMsg(message_t* msg) { call Duplicate.remember(getHeader(msg)->src, getHeader(msg)->dest, (getHeader(msg)->token) & TOKEN_ACK_MASK); } void prepareAck(message_t* msg) { uint8_t rToken = getHeader(msg)->token & TOKEN_ACK_MASK; setFlag(&rToken, TOKEN_ACK_FLAG); getHeader(&ackMsg)->token = rToken; getHeader(&ackMsg)->src = call amAddress(); getHeader(&ackMsg)->dest = getHeader(msg)->src; getHeader(&ackMsg)->type = getHeader(msg)->type; #ifdef SPECKMAC_DEBUG repCounter = ((red_mac_header_t *) call SubPacket.getPayload(msg, sizeof(red_mac_header_t)))->repetitionCounter; #endif } uint32_t calcGeneratedTime(red_mac_header_t *m) { return rxTime - m->time - TIME_CORRECTION; } /**************** Init ************************/ command error_t Init.init(){ atomic { macState = INIT; seqNo = call Random.rand16() % TOKEN_ACK_FLAG; for(MIN_BACKOFF_MASK = 1; MIN_BACKOFF_MASK < networkSleeptime; ) { MIN_BACKOFF_MASK = (MIN_BACKOFF_MASK << 1) + 1; } MIN_BACKOFF_MASK >>= 2; if(MIN_BACKOFF_MASK < 0x3ff) MIN_BACKOFF_MASK=0x3ff; } #ifdef SPECKMAC_DEBUG call SerialDebug.putShortDesc("SpeckMacP"); #endif return SUCCESS; } /**************** SplitControl *****************/ task void StartDoneTask() { atomic { call SampleTimer.start(localSleeptime); macState = SLEEP; sdDebug(60); } signal SplitControl.startDone(SUCCESS); } command error_t SplitControl.start() { call CcaStdControl.start(); atomic { macState = INIT; setRxMode(); } sdDebug(10); return SUCCESS; } task void StopDoneTask() { call Init.init(); signal SplitControl.stopDone(SUCCESS); } command error_t SplitControl.stop() { call CcaStdControl.stop(); call Timer.stop(); call SampleTimer.stop(); atomic { if((macState == SLEEP) && isFlagSet(&flags, SWITCHING)) { macState = STOP; } else { macState = STOP; setSleepMode(); } } return SUCCESS; } /****** Packet interface ********************/ command void Packet.clear(message_t* msg) { call SubPacket.clear(msg); } command uint8_t Packet.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg) - sizeof(red_mac_header_t); } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call SubPacket.setPayloadLength(msg,len + sizeof(red_mac_header_t)); } command uint8_t Packet.maxPayloadLength() { return call SubPacket.maxPayloadLength() - sizeof(red_mac_header_t); } command void* Packet.getPayload(message_t* msg, uint8_t len) { nx_uint8_t *payload = (nx_uint8_t *)call SubPacket.getPayload(msg, len + sizeof(red_mac_header_t)); return (void*)(payload + sizeof(red_mac_header_t)); } /****** Radio(Mode) events *************************/ async event void RadioModes.RssiStable() { setFlag(&flags, RSSI_STABLE); if((macState == RX) || (macState == CCA)) { call Timer.start(DATA_DETECT_TIME); } else if(macState == RX_P) { if(call RssiAdcResource.isOwner()) call ChannelMonitorData.getSnr(); } else if(macState == RX_ACK) { // if(call RssiAdcResource.isOwner()) call ChannelMonitor.start(); } else if(macState == RX_ACK_P) { } else if(macState == INIT) { if(call RssiAdcResource.isOwner()) { sdDebug(20); call ChannelMonitorControl.updateNoiseFloor(); } else { sdDebug(21); call RssiAdcResource.request(); } } else if(macState == STOP) { } else { } } async event void RadioModes.RxModeDone() { atomic { clearFlag(&flags, SWITCHING); if((macState == RX) || (macState == RX_ACK) || (macState == CCA) || (macState == INIT) || (macState == STOP)) { if(macState != RX_ACK) requestAdc(); } else { } } } async event void RadioModes.TxModeDone() { atomic { clearFlag(&flags, SWITCHING); if(macState == TX) { setFlag(&flags, ACTION_DETECTED); if(call PacketSend.send(txBufPtr, txLen) == SUCCESS) { } else { } } else if(macState == TX_ACK) { if(call PacketSend.send(&ackMsg, 0) == SUCCESS) { } else { } } else { } } } async event void RadioModes.SleepModeDone() { atomic { clearFlag(&flags, SWITCHING); if(isFlagSet(&flags, ACTION_DETECTED)) { if(congestionLevel < 5) congestionLevel++; } else { if(congestionLevel > 0) congestionLevel--; } if(macState == SLEEP) { if(!call Timer.isRunning()) { if(isFlagSet(&flags, RESUME_BACKOFF)) { clearFlag(&flags, RESUME_BACKOFF); call Timer.start(restLaufzeit); restLaufzeit = 0; } else { checkSend(); } } } else if(macState == STOP) { post StopDoneTask(); } signal ChannelCongestion.congestionEvent(congestionLevel); } } /****** MacSend events *************************/ async command error_t MacSend.send(message_t* msg, uint8_t len) { error_t err = SUCCESS; atomic { if((shortRetryCounter == 0) && (txBufPtr == NULL)) { clearFlag(&flags, MESSAGE_PREPARED); shortRetryCounter = 1; longRetryCounter = 1; txBufPtr = msg; txLen = len + sizeof(red_mac_header_t); seqNo++; if(seqNo >= TOKEN_ACK_FLAG) seqNo = 1; #ifdef SPECKMAC_PERFORMANCE txStat.payloadLength = txLen; txStat.interfaceTime = call LocalTime32kHz.get(); #endif } else { err = EBUSY; } } if(err == SUCCESS) { post PrepareMsgTask(); } return err; } async command error_t MacSend.cancel(message_t* msg) { error_t err = FAIL; atomic { if(msg == txBufPtr) { setFlag(&flags, CANCEL_SEND); shortRetryCounter = MAX_SHORT_RETRY + 2; longRetryCounter = MAX_LONG_RETRY + 2; if(macState == SLEEP) { signalSendDone(ECANCEL); } else { } err = SUCCESS; } else { } } return err; } /****** PacketSerializer events **********************/ async event void PacketReceive.receiveDetected() { rssiValue = INVALID_SNR; setFlag(&flags, ACTION_DETECTED); call ChannelMonitor.rxSuccess(); if(macState <= CCA_ACK) { if(macState == CCA) { computeBackoff(); #ifdef SPECKMAC_PERFORMANCE call Performance.macDetectedOnCca(); #endif } if(macState != RX_ACK) { macState = RX_P; } else { macState = RX_ACK_P; } } else if(macState == INIT) { setFlag(&flags, UNHANDLED_PACKET); } } async event message_t* PacketReceive.receiveDone(message_t* msg, void* payload, uint8_t len, error_t error) { message_t *m = msg; macState_t action = STOP; uint32_t nav = 0; bool isCnt; #ifdef SPECKMAC_PERFORMANCE rxStat.duplicate = PERF_UNKNOWN; rxStat.repCounter = 0xff; #endif if(macState == RX_P) { if(error == SUCCESS) { isCnt = isControl(msg); if(msgIsForMe(msg)) { if(!isCnt) { if(isNewMsg(msg)) { #ifdef SPECKMAC_PERFORMANCE rxStat.duplicate = PERF_NEW_MSG; #endif storeStrength(msg); getMetadata(msg)->sfdtime = rxTime; getMetadata(msg)->time = calcGeneratedTime((red_mac_header_t*) payload); getMetadata(msg)->ack = WAS_NOT_ACKED; m = signal MacReceive.receiveDone(msg); // assume a buffer swap -- if buffer is not swapped, assume that the // message was not successfully delivered to upper layers if(m != msg) { rememberMsg(msg); } else { action = RX; #ifdef SPECKMAC_PERFORMANCE call Performance.macQueueFull(); #endif } } #ifdef SPECKMAC_PERFORMANCE else { rxStat.duplicate = PERF_REPEATED_MSG; } #endif if(needsAckRx(msg) && (action != RX)) { if(((red_mac_header_t*)payload)->repetitionCounter == 0) { action = CCA_ACK; } else { action = RX; } } else { if(action != RX) { nav = ((red_mac_header_t*)payload)->repetitionCounter * (SUB_HEADER_TIME + getHeader(msg)->length*BYTE_TIME + SUB_FOOTER_TIME) + RX_ACK_TIMEOUT + TX_SETUP_TIME + ACK_DURATION; action = SLEEP; } } } else { action = RX; } } else { action = SLEEP; if(!isCnt) { nav = ((red_mac_header_t*)payload)->repetitionCounter * (SUB_HEADER_TIME + getHeader(msg)->length*BYTE_TIME + SUB_FOOTER_TIME) + RX_ACK_TIMEOUT + TX_SETUP_TIME + ACK_DURATION; } } } else { action = SLEEP; } } else if(macState == RX_ACK_P) { if(error == SUCCESS) { if(ackIsForMe(msg)) { storeStrength(msg); getMetadata(txBufPtr)->ack = WAS_ACKED; getMetadata(txBufPtr)->repetitions = txMacHdr->repetitionCounter; signalSendDone(SUCCESS); action = SLEEP; } else { updateLongRetryCounters(); // this will eventually schedule the right backoff macState = SLEEP; // so much traffic is going on -- take a nap setSleepMode(); action = INIT; // a difficult way to say: do nothing } } else { if(call Timer.isRunning()) { action = RX_ACK; } else { updateLongRetryCounters(); action = RX; } } } else { action = INIT; } if(action == CCA_ACK) { macState = TX_ACK; call Timer.start(RX_SETUP_TIME - TX_SETUP_TIME + 16); prepareAck(msg); } else if(action == RX_ACK) { macState = RX_ACK; } else if(action == RX) { macState = RX; checkCounter = 0; call Timer.start(DATA_DETECT_TIME); } else if(action == SLEEP) { macState = SLEEP; if(isFlagSet(&flags, RESUME_BACKOFF)) { if(nav > restLaufzeit) { if(nav > restLaufzeit) restLaufzeit += ((uint32_t)ADD_NAV*nav/NAV_FACTOR); } } else { setFlag(&flags, RESUME_BACKOFF); restLaufzeit = call Random.rand16() & ZERO_BACKOFF_MASK; } setSleepMode(); } else if(action == INIT) { clearFlag(&flags, UNHANDLED_PACKET); } else { } #ifdef SPECKMAC_PERFORMANCE if(error == SUCCESS) { rxStat.type = getHeader(msg)->type; rxStat.from = getHeader(msg)->src; rxStat.to = getHeader(msg)->dest; rxStat.token = getHeader(msg)->token; if(!isControl(msg)) rxStat.repCounter = ((red_mac_header_t*)payload)->repetitionCounter; rxStat.payloadLength = len; rxStat.strength = rssiValue; rxStat.creationTime = getMetadata(msg)->time; call Performance.macRxStats(&rxStat); } #endif return m; } async event void PacketSend.sendDone(message_t* msg, error_t error) { if(macState == TX) { if(prepareRepetition()) { call PacketSend.send(txBufPtr, txLen); } else { macState = RX_ACK; setRxMode(); call Timer.start(RX_ACK_TIMEOUT); checkCounter = 0; } } else if(macState == TX_ACK) { checkCounter = 0; macState = RX; setRxMode(); #ifdef SPECKMAC_DEBUG #endif } } /***** TimeStamping stuff **************************/ async event void RadioTimeStamping.receivedSFD( uint16_t time ) { if(call RssiAdcResource.isOwner()) call ChannelMonitorData.getSnr(); if(macState == RX_P) { rxTime = call LocalTime32kHz.get(); call ChannelMonitor.rxSuccess(); } } async event void RadioTimeStamping.transmittedSFD(uint16_t time, message_t* p_msg ) { if((macState == TX) && (p_msg == txBufPtr)) { getMetadata(p_msg)->sfdtime = call LocalTime32kHz.get(); txMacHdr->time = call TimeDiff32.computeDelta(getMetadata(p_msg)->sfdtime, getMetadata(p_msg)->time); } } /****** Timer ******************************/ void checkOnBusy() { setFlag(&flags, ACTION_DETECTED); if((macState == RX) || (macState == CCA) || (macState == CCA_ACK)) { if(macState == CCA) { computeBackoff(); #ifdef SPECKMAC_PERFORMANCE call Performance.macBusyOnCca(); #endif } requestAdc(); macState = RX; checkCounter = 0; call Timer.start(TX_GAP_TIME>>1); } } void checkOnIdle() { if(macState == RX) { checkCounter++; if(checkCounter < 2) { call Timer.start(DATA_DETECT_TIME); requestAdc(); } else { macState = SLEEP; setSleepMode(); } } else if(macState == CCA) { checkCounter++; if(checkCounter < 3) { call Timer.start(TX_GAP_TIME >> 1); requestAdc(); } else { macState = TX; setTxMode(); #ifdef SPECKMAC_PERFORMANCE call Performance.macIdleOnCca(); txStat.txModeTime = call LocalTime32kHz.get(); #endif } } } async event void Timer.fired() { if((macState == RX) || (macState == CCA) || (macState == CCA_ACK)) { if((!call RssiAdcResource.isOwner()) || (call ChannelMonitor.start() != SUCCESS)) { if(call UartPhyControl.isBusy()) { checkOnBusy(); } else { checkOnIdle(); } } } else if(macState == RX_ACK) { if(needsAckTx(txBufPtr)) { #ifdef SPECKMAC_PERFORMANCE call Performance.macAckTimeout(); #endif updateLongRetryCounters(); } else { signalSendDone(SUCCESS); } macState = SLEEP; setSleepMode(); } else if(macState == TX_ACK) { setTxMode(); } else if(macState == SLEEP) { if(isFlagSet(&flags, SWITCHING)) { call Timer.start(call Random.rand16() & 0x0f); } else { if(isFlagSet(&flags, RESUME_BACKOFF)) { clearFlag(&flags, RESUME_BACKOFF); call Timer.start(restLaufzeit); restLaufzeit = 0; } else { checkSend(); } } } else if((macState == RX_ACK_P) || (macState == RX_P)) { } else if(macState == INIT) { post StartDoneTask(); sdDebug(50); } else { } } /****** SampleTimer ******************************/ async event void SampleTimer.fired() { call SampleTimer.start(localSleeptime); if((macState == SLEEP) && (!isFlagSet(&flags, SWITCHING))) { clearFlag(&flags, ACTION_DETECTED); interruptBackoffTimer(); macState = RX; setRxMode(); call Timer.stop(); } } /***** Sleeptime **********************************/ async command void Sleeptime.setLocalSleeptime(uint16_t sT) { atomic localSleeptime = sT; } async command uint16_t Sleeptime.getLocalSleeptime() { uint16_t st; atomic st = localSleeptime; return st; } async command void Sleeptime.setNetworkSleeptime(uint16_t sT) { atomic { networkSleeptime = sT; for(MIN_BACKOFF_MASK = 1; MIN_BACKOFF_MASK < sT; ) { MIN_BACKOFF_MASK = (MIN_BACKOFF_MASK << 1) + 1; } MIN_BACKOFF_MASK >>= 3; } } async command uint16_t Sleeptime.getNetworkSleeptime() { uint16_t st; atomic st = networkSleeptime; return st; } /****** ChannelMonitor events *********************/ async event void ChannelMonitor.channelBusy() { checkOnBusy(); } async event void ChannelMonitor.channelIdle() { checkOnIdle(); } /****** ChannelMonitorControl events **************/ event void ChannelMonitorControl.updateNoiseFloorDone() { if(macState == INIT) { call Timer.start(call Random.rand16() % localSleeptime); setSleepMode(); sdDebug(40); } else { } } /***** ChannelMonitorData events ******************/ async event void ChannelMonitorData.getSnrDone(int16_t data) { atomic if((macState == RX_P) || (macState == RX_ACK_P)) rssiValue = data; } /***** Rssi Resource events ******************/ event void RssiAdcResource.granted() { macState_t ms; atomic ms = macState; if(ms < SLEEP) { } else if(ms == INIT) { sdDebug(30); call ChannelMonitorControl.updateNoiseFloor(); } else { post ReleaseAdcTask(); } } /***** Mac Eval *******************************************/ #ifdef MAC_EVAL async command void MacEval.setBackoffMask(uint16_t mask) { atomic MIN_BACKOFF_MASK = mask; } async command void MacEval.increaseBackoff(bool value) { atomic INCREASE_BACKOFF = value; } async command void MacEval.addNav(bool value) { atomic ADD_NAV = value; } async command void MacEval.setLongRetry(uint8_t lr) { atomic MAX_LONG_RETRY = lr; } async command void MacEval.setShortRetry(uint8_t sr) { atomic MAX_SHORT_RETRY = sr; } #endif /***** unused events **************************/ default async event void ChannelCongestion.congestionEvent(uint8_t level) {} /***** unused Radio Modes events **************************/ async event void RadioModes.TimerModeDone() {} async event void RadioModes.SelfPollingModeDone() {} async event void RadioModes.PWDDDInterrupt() {} } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/Teamgeist.nc000066400000000000000000000054671207233610700220000ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface that helps the MAC to cooperate with the routing * @author Andreas Koepke (koepke at tkn.tu-berlin.de) */ interface Teamgeist { /** * Get the AM type of the messages that are jointly routed by the MAC and * the routing layer. Only for these messages the MAC tries to access the * routing layer. */ event am_id_t observedAMType(); /** * The MAC layer uses this function to ask the routing protocol whether it * should acknowledge and thus propose himself as a forwarder. */ async event bool needsAck(message_t *msg, am_addr_t src, am_addr_t dest, uint16_t snr); /** * Sending the message to the original destination did not work. * Ask for a different one. */ async event am_addr_t getDestination(message_t *msg, uint8_t retryCounter); /** * Information on the ACK. */ async event void gotAck(message_t *msg, am_addr_t ackSender, uint16_t snr); /** * The MAC layer uses this function to ask the routing protocol how many * potential forwarders there are. This may not give a precise number, but * a rough estimate. */ async event uint8_t estimateForwarders(message_t *msg); } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/TimeDiff.nc000066400000000000000000000036741207233610700215430ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Manipulate time differences, with overflow checking * @author: Andreas Koepke (koepke@tkn.tu-berlin.de */ interface TimeDiff { /** compute delta of two times (now - past), checks for overflow assuming that now is always > past */ async command uint32_t computeDelta(uint32_t time_now, uint32_t time_past); } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/TimeDiff16.nc000066400000000000000000000036761207233610700217140ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Manipulate time differences, with overflow checking * @author: Andreas Koepke (koepke@tkn.tu-berlin.de */ interface TimeDiff16 { /** compute delta of two times (now - past), checks for overflow assuming that now is always > past */ async command uint16_t computeDelta(uint16_t time_now, uint16_t time_past); } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/TimeDiff32.nc000066400000000000000000000036761207233610700217120ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Manipulate time differences, with overflow checking * @author: Andreas Koepke (koepke@tkn.tu-berlin.de */ interface TimeDiff32 { /** compute delta of two times (now - past), checks for overflow assuming that now is always > past */ async command uint32_t computeDelta(uint32_t time_now, uint32_t time_past); } tinyos-2.1.2+dfsg/tos/chips/tda5250/mac/TimeDiffC.nc000066400000000000000000000046771207233610700216520ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of timediff interface * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) */ module TimeDiffC { provides { interface TimeDiff32; interface TimeDiff16; } } implementation { async command uint32_t TimeDiff32.computeDelta(uint32_t time_now, uint32_t time_past) { uint32_t rval; if(time_now >= time_past) { rval = time_now - time_past; } else { rval = (uint32_t)(-1) - time_past + time_now; } return rval; } async command uint16_t TimeDiff16.computeDelta(uint16_t time_now, uint16_t time_past) { uint16_t rval; if(time_now >= time_past) { rval = time_now - time_past; } else { rval = (uint16_t)(-1) - time_past + time_now; } return rval; } } tinyos-2.1.2+dfsg/tos/chips/tda5250/tda5250Const.h000066400000000000000000000354361207233610700212370ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * ======================================================================== */ /** * tda5250Const Header File * Defines constants and macros for use with the TDA5250 Radio * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ #ifndef TDA5250CONST_H #define TDA5250CONST_H // List of valid output frequencies for clock typedef enum { CLOCK_OUT_FREQ_NINE_MHZ = 0x00, CLOCK_OUT_FREQ_FOUR_POINT_FIVE_MHZ = 0x01, CLOCK_OUT_FREQ_THREE_MHZ = 0x02, CLOCK_OUT_FREQ_TWO_POINT_TWO_FIVE_MHZ = 0x03, CLOCK_OUT_FREQ_ONE_POINT_EIGHT_MHZ = 0x04, CLOCK_OUT_FREQ_ONE_POINT_FIVE_MHZ = 0x05, CLOCK_OUT_FREQ_ONE_POINT_TWO_EIGHT_MHZ = 0x06, CLOCK_OUT_FREQ_ONE_POINT_ONE_TWO_FIVE_MHZ = 0x07, CLOCK_OUT_FREQ_ONE_MHZ = 0x08, CLOCK_OUT_FREQ_POINT_NINE_MHZ = 0x09, CLOCK_OUT_FREQ_POINT_EIGHT_TWO_MHZ = 0x0A, CLOCK_OUT_FREQ_POINT_SEVEN_FIVE_MHZ = 0x0B, CLOCK_OUT_FREQ_POINT_SIX_NINE_MHZ = 0x0C, CLOCK_OUT_FREQ_POINT_SIX_FOUR_MHZ = 0x0D, CLOCK_OUT_FREQ_POINT_SIX_MHZ = 0x0E, CLOCK_OUT_FREQ_POINT_FIVE_SIX_MHZ = 0x0F, CLOCK_OUT_FREQ_THIRTY_TWO_KHZ = 0x80, CLOCK_OUT_FREQ_WINDOW_COUNT_COMPLETE = 0xC0 } tda5250_clock_out_freqs_t; //List of valid cutoff frequencies for the IQ Filter typedef enum { DATA_CUTOFF_FREQ_FIVE_KHZ = 0x00, DATA_CUTOFF_FREQ_SEVEN_KHZ = 0x01, DATA_CUTOFF_FREQ_NINE_KHZ = 0x02, DATA_CUTOFF_FREQ_ELEVEN_KHZ = 0x03, DATA_CUTOFF_FREQ_FOURTEEN_KHZ = 0x04, DATA_CUTOFF_FREQ_EIGHTEEN_KHZ = 0x05, DATA_CUTOFF_FREQ_TWENTY_THREE_KHZ = 0x06, DATA_CUTOFF_FREQ_TWENTY_EIGHT_KHZ = 0x07, DATA_CUTOFF_FREQ_THIRTY_TWO_KHZ = 0x08, DATA_CUTOFF_FREQ_THIRTY_NINE_KHZ = 0x09, DATA_CUTOFF_FREQ_FOURTY_NINE_KHZ = 0x0A, DATA_CUTOFF_FREQ_FIFTY_FIVE_KHZ = 0x0B, DATA_CUTOFF_FREQ_SIXTY_FOUR_KHZ = 0x0C, DATA_CUTOFF_FREQ_SEVENTY_THREE_KHZ = 0x0D, DATA_CUTOFF_FREQ_EIGHTY_SIX_KHZ = 0x0E, DATA_CUTOFF_FREQ_ONE_HUNDRED_TWO_KHZ = 0x0F } tda5250_data_cutoff_freqs_t; //List of valid cutoff frequencies for the Lowpass //data filter typedef enum { IQ_CUTOFF_FREQ_THREE_HUNDRED_FIFTY_KHZ = 0x01, IQ_CUTOFF_FREQ_TWO_HUNDRED_FIFTY_KHZ = 0x02, IQ_CUTOFF_FREQ_TWO_HUNDRED_KHZ = 0x03, IQ_CUTOFF_FREQ_ONE_HUNDRED_FIFTY_KHZ = 0x04, IQ_CUTOFF_FREQ_ONE_HUNDRED_KHZ = 0x05, IQ_CUTOFF_FREQ_FIFTY_KHZ = 0x06 } tda5250_iq_cutoff_freqs_t; //List of valid capacitor values for tuning the nominal //frequency setting typedef enum { CAP_VAL_ZERO_F = 0x00, CAP_VAL_TWO_HUNDRED_FIFTY_FF = 0x01, CAP_VAL_FIVE_HUNDRED_FIFTY_FF = 0x02, CAP_VAL_SEVEN_HUNDRED_FIFTY_FF = 0x03, CAP_VAL_ONE_PF = 0x04, CAP_VAL_ONE_POINT_TWO_FIVE_PF = 0x05, CAP_VAL_ONE_POINT_FIVE_PF = 0x06, CAP_VAL_ONE_POINT_SEVEN_FIVE_PF = 0x07, CAP_VAL_TWO_PF = 0x08, CAP_VAL_TWO_POINT_TWO_FIVE_PF = 0x09, CAP_VAL_TWO_POINT_FIVE_PF = 0x0A, CAP_VAL_TWO_POINT_SEVEN_FIVE_PF = 0x0B, CAP_VAL_THREE_PF = 0x0C, CAP_VAL_THREE_POINT_TWO_FIVE_PF = 0x0D, CAP_VAL_THREE_POINT_FIVE_PF = 0x0E, CAP_VAL_THREE_POINT_SEVEN_FIVE_PF = 0x0F, CAP_VAL_FOUR_PF = 0x10, CAP_VAL_FOUR_POINT_TWO_FIVE_PF = 0x11, CAP_VAL_FOUR_POINT_FIVE_PF = 0x12, CAP_VAL_FOUR_POINT_SEVEN_FIVE_PF = 0x13, CAP_VAL_FIVE_PF = 0x14, CAP_VAL_FIVE_POINT_TWO_FIVE_PF = 0x15, CAP_VAL_FIVE_POINT_FIVE_PF = 0x16, CAP_VAL_FIVE_POINT_SEVEN_FIVE_PF = 0x17, CAP_VAL_SIX_PF = 0x18, CAP_VAL_SIX_POINT_TWO_FIVE_PF = 0x19, CAP_VAL_SIX_POINT_FIVE_PF = 0x1A, CAP_VAL_SIX_POINT_SEVEN_FIVE_PF = 0x1B, CAP_VAL_SEVEN_PF = 0x1C, CAP_VAL_SEVEN_POINT_TWO_FIVE_PF = 0x1D, CAP_VAL_SEVEN_POINT_FIVE_PF = 0x1E, CAP_VAL_SEVEN_POINT_SEVEN_FIVE_PF = 0x1F, CAP_VAL_EIGHT_PF = 0x10, CAP_VAL_EIGHT_POINT_TWO_FIVE_PF = 0x11, CAP_VAL_EIGHT_POINT_FIVE_PF = 0x12, CAP_VAL_EIGHT_POINT_SEVEN_FIVE_PF = 0x13, CAP_VAL_NINE_PF = 0x14, CAP_VAL_NINE_POINT_TWO_FIVE_PF = 0x15, CAP_VAL_NINE_POINT_FIVE_PF = 0x16, CAP_VAL_NINE_POINT_SEVEN_FIVE_PF = 0x17, CAP_VAL_TEN_PF = 0x18, CAP_VAL_TEN_POINT_TWO_FIVE_PF = 0x19, CAP_VAL_TEN_POINT_FIVE_PF = 0x1A, CAP_VAL_TEN_POINT_SEVEN_FIVE_PF = 0x1B, CAP_VAL_ELEVEN_PF = 0x1C, CAP_VAL_ELEVEN_POINT_TWO_FIVE_PF = 0x1D, CAP_VAL_ELEVEN_POINT_FIVE_PF = 0x1E, CAP_VAL_ELEVEN_POINT_SEVEN_FIVE_PF = 0x1F, CAP_VAL_TWELVE_PF = 0x10, CAP_VAL_TWELVE_POINT_TWO_FIVE_PF = 0x11, CAP_VAL_TWELVE_POINT_FIVE_PF = 0x12, CAP_VAL_TWELVE_POINT_SEVEN_FIVE_PF = 0x13, CAP_VAL_THIRTEEN_PF = 0x14, CAP_VAL_THIRTEEN_POINT_TWO_FIVE_PF = 0x15, CAP_VAL_THIRTEEN_POINT_FIVE_PF = 0x16, CAP_VAL_THIRTEEN_POINT_SEVEN_FIVE_PF = 0x17, CAP_VAL_FOURTEEN_PF = 0x18, CAP_VAL_FOURTEEN_POINT_TWO_FIVE_PF = 0x19, CAP_VAL_FOURTEEN_POINT_FIVE_PF = 0x1A, CAP_VAL_FOURTEEN_POINT_SEVEN_FIVE_PF = 0x1B, CAP_VAL_FIFTEEN_PF = 0x1C, CAP_VAL_FIFTEEN_POINT_TWO_FIVE_PF = 0x1D, CAP_VAL_FIFTEEN_POINT_FIVE_PF = 0x1E, CAP_VAL_FIFTEEN_POINT_SEVEN_FIVE_PF = 0x1F } tda5250_cap_vals_t; //List of valid times for Bipolar Ramp typedef enum { BIPOLAR_FET_RAMP_TIME_LESS_THAN_TWO_MS = 0x01, BIPOLAR_FET_RAMP_TIME_FOUR_MS = 0x03, BIPOLAR_FET_RAMP_TIME_EIGHT_MS = 0x05, BIPOLAR_FET_RAMP_TIME_TWELVE_MS = 0x07 } tda5250_bipolar_fet_ramp_times_t; #define TDA5250_RECEIVE_FREQUENCY 868.3 // kHz #define TDA5250_OSCILLATOR_FREQUENCY ((3.0/4.0) * TDA5250_RECEIVE_FREQUENCY) // kHz #define TDA5250_INTERMEDIATE_FREQUENCY ((3.0) * TDA5250_RECEIVE_FREQUENCY) // kHz #define TDA5250_INTERNAL_OSC_FREQUENCY 32.768 //kHz #define TDA5250_CLOCK_OUT_BASE_FREQUENCY 18089.6 //kHz #define TDA5250_CONSTANT_FOR_FREQ_TO_TH_VALUE 2261 //khz of integer for 18089.6/2/4 #define TDA5250_CONVERT_TIME(time) ((uint16_t)(0xFFFF - ((time*TDA5250_INTERNAL_OSC_FREQUENCY)))) #define TDA5250_CONVERT_FREQ_TO_TH_VALUE(freq, clock_freq) \ ((TDA5250_CONSTANT_FOR_FREQ_TO_TH_VALUE/(clock_freq*freq))*1000) #define TDA5250_SYSTEM_SETUP_TIME (12000/TDA5250_INTERNAL_OSC_FREQUENCY) //12000us #define TDA5250_RECEIVER_SETUP_TIME (2860/TDA5250_INTERNAL_OSC_FREQUENCY) // 2860us #define TDA5250_DATA_DETECTION_SETUP_TIME (3380/TDA5250_INTERNAL_OSC_FREQUENCY) // 3380us #define TDA5250_RSSI_STABLE_TIME (3380/TDA5250_INTERNAL_OSC_FREQUENCY) // 3380us #define TDA5250_CLOCK_OUT_SETUP_TIME (500/TDA5250_INTERNAL_OSC_FREQUENCY) // 500us #define TDA5250_TRANSMITTER_SETUP_TIME (1430/TDA5250_INTERNAL_OSC_FREQUENCY) // 1430us #define TDA5250_XTAL_STARTUP_TIME (500/TDA5250_INTERNAL_OSC_FREQUENCY) // 500us // Subaddresses of data registers write #define TDA5250_REG_ADDR_CONFIG 0x00 #define TDA5250_REG_ADDR_FSK 0x01 #define TDA5250_REG_ADDR_XTAL_TUNING 0x02 #define TDA5250_REG_ADDR_LPF 0x03 #define TDA5250_REG_ADDR_ON_TIME 0x04 #define TDA5250_REG_ADDR_OFF_TIME 0x05 #define TDA5250_REG_ADDR_COUNT_TH1 0x06 #define TDA5250_REG_ADDR_COUNT_TH2 0x07 #define TDA5250_REG_ADDR_RSSI_TH3 0x08 #define TDA5250_REG_ADDR_CLK_DIV 0x0D #define TDA5250_REG_ADDR_XTAL_CONFIG 0x0E #define TDA5250_REG_ADDR_BLOCK_PD 0x0F // Subaddresses of data registers read #define TDA5250_REG_ADDR_STATUS 0x80 #define TDA5250_REG_ADDR_ADC 0x81 // Mask Values for write registers (16 or 8 bit) /************* Apply these masks by & with original */ #define MASK_CONFIG_SLICER_RC_INTEGRATOR 0x7FFF #define MASK_CONFIG_ALL_PD_NORMAL 0xBFFF #define MASK_CONFIG_TESTMODE_NORMAL 0xDFFF #define MASK_CONFIG_CONTROL_TXRX_EXTERNAL 0xEFFF #define MASK_CONFIG_ASK_NFSK_FSK 0xF7FF #define MASK_CONFIG_RX_NTX_TX 0xFBFF #define MASK_CONFIG_CLK_EN_OFF 0xFDFF #define MASK_CONFIG_RX_DATA_INV_NO 0xFEFF #define MASK_CONFIG_D_OUT_IFVALID 0xFF7F #define MASK_CONFIG_ADC_MODE_ONESHOT 0xFFBF #define MASK_CONFIG_F_COUNT_MODE_ONESHOT 0xFFDF #define MASK_CONFIG_LNA_GAIN_LOW 0xFFEF #define MASK_CONFIG_EN_RX_DISABLE 0xFFF7 #define MASK_CONFIG_MODE_2_SLAVE 0xFFFB #define MASK_CONFIG_MODE_1_SLAVE_TIMER 0xFFFD #define MASK_CONFIG_PA_PWR_LOWTX 0xFFFE /************* Apply these masks by | with original */ #define MASK_CONFIG_SLICER_PEAK_DETECTOR 0x8000 #define MASK_CONFIG_ALL_PD_POWER_DOWN 0x4000 #define MASK_CONFIG_TESTMODE_TESTMODE 0x2000 #define MASK_CONFIG_CONTROL_TXRX_REGISTER 0x1000 #define MASK_CONFIG_ASK_NFSK_ASK 0x0800 #define MASK_CONFIG_RX_NTX_RX 0x0400 #define MASK_CONFIG_CLK_EN_ON 0x0200 #define MASK_CONFIG_RX_DATA_INV_YES 0x0100 #define MASK_CONFIG_D_OUT_ALWAYS 0x0080 #define MASK_CONFIG_ADC_MODE_CONT 0x0040 #define MASK_CONFIG_F_COUNT_MODE_CONT 0x0020 #define MASK_CONFIG_LNA_GAIN_HIGH 0x0010 #define MASK_CONFIG_EN_RX_ENABLE 0x0008 #define MASK_CONFIG_MODE_2_TIMER 0x0004 #define MASK_CONFIG_MODE_1_SELF_POLLING 0x0002 #define MASK_CONFIG_PA_PWR_HIGHTX 0x0001 // Mask Values for write registers (16 or 8 bit) /************* Apply these masks by & with original */ #define CONFIG_SLICER_RC_INTEGRATOR(config) (config & 0x7FFF) #define CONFIG_ALL_PD_NORMAL(config) (config & 0xBFFF) #define CONFIG_TESTMODE_NORMAL(config) (config & 0xDFFF) #define CONFIG_CONTROL_TXRX_EXTERNAL(config) (config & 0xEFFF) #define CONFIG_ASK_NFSK_FSK(config) (config & 0xF7FF) #define CONFIG_RX_NTX_TX(config) (config & 0xFBFF) #define CONFIG_CLK_EN_OFF(config) (config & 0xFDFF) #define CONFIG_RX_DATA_INV_NO(config) (config & 0xFEFF) #define CONFIG_D_OUT_IFVALID(config) (config & 0xFF7F) #define CONFIG_ADC_MODE_ONESHOT(config) (config & 0xFFBF) #define CONFIG_F_COUNT_MODE_ONESHOT(config) (config & 0xFFDF) #define CONFIG_LNA_GAIN_LOW(config) (config & 0xFFEF) #define CONFIG_EN_RX_DISABLE(config) (config & 0xFFF7) #define CONFIG_MODE_2_SLAVE(config) (config & 0xFFFB) #define CONFIG_MODE_1_SLAVE_OR_TIMER(config) (config & 0xFFFD) #define CONFIG_PA_PWR_LOWTX(config) (config & 0xFFFE) #define XTAL_CONFIG_FET(xtal) (xtal & 0xFE) #define XTAL_CONFIG_FSK_RAMP0_FALSE(xtal) (xtal & 0xFB) #define XTAL_CONFIG_FSK_RAMP1_FALSE(xtal) (xtal & 0xFD) /************* Apply these masks by | with original */ #define CONFIG_SLICER_PEAK_DETECTOR(config) (config | 0x8000) #define CONFIG_ALL_PD_POWER_DOWN(config) (config | 0x4000) #define CONFIG_TESTMODE_TESTMODE(config) (config | 0x2000) #define CONFIG_CONTROL_TXRX_REGISTER(config) (config | 0x1000) #define CONFIG_ASK_NFSK_ASK(config) (config | 0x0800) #define CONFIG_RX_NTX_RX(config) (config | 0x0400) #define CONFIG_CLK_EN_ON(config) (config | 0x0200) #define CONFIG_RX_DATA_INV_YES(config) (config | 0x0100) #define CONFIG_D_OUT_ALWAYS(config) (config | 0x0080) #define CONFIG_ADC_MODE_CONT(config) (config | 0x0040) #define CONFIG_F_COUNT_MODE_CONT(config) (config | 0x0020) #define CONFIG_LNA_GAIN_HIGH(config) (config | 0x0010) #define CONFIG_EN_RX_ENABLE(config) (config | 0x0008) #define CONFIG_MODE_2_TIMER(config) (config | 0x0004) #define CONFIG_MODE_1_SELF_POLLING(config) (config | 0x0002) #define CONFIG_PA_PWR_HIGHTX(config) (config | 0x0001) #define XTAL_CONFIG_BIPOLAR(xtal) (xtal | 0x01) #define XTAL_CONFIG_FSK_RAMP0_TRUE(xtal) (xtal | 0x04) #define XTAL_CONFIG_FSK_RAMP1_TRUE(xtal) (xtal | 0x02) #endif //TDA5250CONST_H tinyos-2.1.2+dfsg/tos/chips/tda5250/tda5250Control.h000066400000000000000000000050331207233610700215570ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * Macros for configuring the TDA5250. * - Revision ------------------------------------------------------------ * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * Author: Kevin Klues (klues@tkn.tu-berlin.de) * ======================================================================== */ #ifndef TDA5250CONTROL_H #define TDA5250CONTROL_H typedef enum { RADIO_MODE_ON_TRANSITION, RADIO_MODE_ON, RADIO_MODE_OFF_TRANSITION, RADIO_MODE_OFF, RADIO_MODE_TX_TRANSITION, RADIO_MODE_TX, RADIO_MODE_RX_TRANSITION, RADIO_MODE_RX, RADIO_MODE_CCA_TRANSITION, RADIO_MODE_CCA, RADIO_MODE_TIMER_TRANSITION, RADIO_MODE_TIMER, RADIO_MODE_SELF_POLLING_TRANSITION, RADIO_MODE_SELF_POLLING, RADIO_MODE_SLEEP_TRANSITION, RADIO_MODE_SLEEP } radioMode_t; #define INIT_RSSI_THRESHOLD 26 #define TH1_VALUE 0x0000 #define TH2_VALUE 0xFFFF #endif //TDA5250CONTROL_H tinyos-2.1.2+dfsg/tos/chips/tda5250/tda5250RegDefaultsSettings.h000066400000000000000000000054231207233610700240700ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * ======================================================================== */ /** * tda5250RegDefaultSettings Header File * Defines the default values of the registers for the TDA5250 Radio * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ #ifndef TDA5250REGDEFAULTSETTINGS_H #define TDA5250REGDEFAULTSETTINGS_H // Default values of data registers #define TDA5250_REG_DEFAULT_SETTING_CONFIG 0x04F9 #define TDA5250_REG_DEFAULT_SETTING_FSK 0x0A0C #define TDA5250_REG_DEFAULT_SETTING_XTAL_TUNING 0x0012 #define TDA5250_REG_DEFAULT_SETTING_LPF 0x18 #define TDA5250_REG_DEFAULT_SETTING_ON_TIME 0xFEC0 #define TDA5250_REG_DEFAULT_SETTING_OFF_TIME 0xF380 #define TDA5250_REG_DEFAULT_SETTING_COUNT_TH1 0x0000 #define TDA5250_REG_DEFAULT_SETTING_COUNT_TH2 0x0001 #define TDA5250_REG_DEFAULT_SETTING_RSSI_TH3 0xFF #define TDA5250_REG_DEFAULT_SETTING_CLK_DIV 0x08 #define TDA5250_REG_DEFAULT_SETTING_XTAL_CONFIG 0x01 #define TDA5250_REG_DEFAULT_SETTING_BLOCK_PD 0xFFFF #endif //TDA5250REGDEFAULTSETTINGS_H tinyos-2.1.2+dfsg/tos/chips/tda5250/tda5250RegTypes.h000066400000000000000000000056131207233610700217050ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:13 $ * ======================================================================== */ /** * tda5250RegTypes Header File * Defines the register types for the registers on the TDA5250 Radio * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ #ifndef TDA5250REGTYPES_H #define TDA5250REGTYPES_H //Macro for receiving an address and figuring out its type #define TDA5250_REG_TYPE(addr) TDA5250_REG_TYPE_#addr // Default values of data registers #define TDA5250_REG_TYPE_CONFIG uint16_t #define TDA5250_REG_TYPE_FSK uint16_t #define TDA5250_REG_TYPE_XTAL_TUNING uint16_t #define TDA5250_REG_TYPE_LPF uint8_t #define TDA5250_REG_TYPE_ON_TIME uint16_t #define TDA5250_REG_TYPE_OFF_TIME uint16_t #define TDA5250_REG_TYPE_COUNT_TH1 uint16_t #define TDA5250_REG_TYPE_COUNT_TH2 uint16_t #define TDA5250_REG_TYPE_RSSI_TH3 uint8_t #define TDA5250_REG_TYPE_RF_POWER uint8_t #define TDA5250_REG_TYPE_CLK_DIV uint8_t #define TDA5250_REG_TYPE_XTAL_CONFIG uint8_t #define TDA5250_REG_TYPE_BLOCK_PD uint16_t #define TDA5250_REG_TYPE_STATUS uint8_t #define TDA5250_REG_TYPE_ADC uint8_t #endif //TDA5250REGTYPES_H tinyos-2.1.2+dfsg/tos/chips/tda5250/tda5250_message.h000066400000000000000000000020141207233610700217160ustar00rootroot00000000000000#ifndef TDA5250_MESSAGE_H #define TDA5250_MESSAGE_H #include "AM.h" #include "PacketAck.h" /* * highest bit of token set: this message is ACK and not intended for the * upper layers. Token is used for alternating bit like duplicate detection, * and set by the sender in [0,127] intervall. The receiver reflects the * token in the Ack, with the highest bit set. */ typedef nx_struct tda5250_header_t { nx_uint8_t length; nx_am_addr_t src; nx_am_addr_t dest; nx_am_id_t type; nx_uint8_t token; } tda5250_header_t; typedef nx_struct tda5250_footer_t { nxle_uint16_t crc; } tda5250_footer_t; typedef nx_struct tda5250_metadata_t { nx_uint16_t strength; nx_uint8_t ack; /* local time when message was generated */ nx_uint32_t time; /* time of sfd generation */ nx_uint32_t sfdtime; nx_uint8_t sendSecurityMode; nx_uint8_t receiveSecurityMode; /* some meta information that allows to compute a density */ nx_uint8_t maxRepetitions; nx_uint8_t repetitions; } tda5250_metadata_t; #endif tinyos-2.1.2+dfsg/tos/chips/tmp102/000077500000000000000000000000001207233610700167175ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/tmp102/SimpleTMP102C.nc000066400000000000000000000044031207233610700214020ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Implementation of a simple read interface for the TMP102 temperature * sensor built-in Zolertia Z1 motes * * @author: Xavier Orduna * @author: Jordi Soucheiron */ generic configuration SimpleTMP102C() { provides interface Read; } implementation { components SimpleTMP102P; Read = SimpleTMP102P; components new TimerMilliC() as TimerSensor; SimpleTMP102P.TimerSensor -> TimerSensor; components new TimerMilliC() as TimerFail; SimpleTMP102P.TimerFail -> TimerFail; components new Msp430I2C1C() as I2C; SimpleTMP102P.Resource -> I2C; SimpleTMP102P.ResourceRequested -> I2C; SimpleTMP102P.I2CBasicAddr -> I2C; } tinyos-2.1.2+dfsg/tos/chips/tmp102/SimpleTMP102P.nc000066400000000000000000000076161207233610700214300ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Implementation of a simple read interface for the TMP102 temperature * sensor built-in Zolertia Z1 motes, returns value in celsius degrees * multiplied by 10, only 1 digit accuracy. * * @author: Xavier Orduna * @author: Jordi Soucheiron */ #include "TMP102.h" module SimpleTMP102P { provides interface Read; uses { interface Timer as TimerSensor; interface Timer as TimerFail; interface Resource; interface ResourceRequested; interface I2CPacket as I2CBasicAddr; } } implementation { uint16_t temp; uint8_t pointer; uint8_t temperaturebuff[2]; uint16_t tmpaddr; norace uint8_t tempcmd; task void calculateTemp(){ uint16_t tmp = temp; #ifdef Z1_TMP102_CELSIUS if(tmp > 2047) tmp -= (1<<12); atomic tmp *= 0.625; #endif signal Read.readDone(SUCCESS, tmp); } command error_t Read.read(){ atomic P5DIR |= 0x01; atomic P5OUT |= 0x01; call TimerSensor.startOneShot(100); //call TimerFail.startOneShot(1024); return SUCCESS; } event void TimerSensor.fired() { call Resource.request(); } event void TimerFail.fired() { signal Read.readDone(SUCCESS, 0); } event void Resource.granted(){ error_t error; pointer = TMP102_TEMPREG; tempcmd = TMP_READ_TMP; error= call I2CBasicAddr.write((I2C_START | I2C_STOP), TMP102_ADDRESS, 1, &pointer); if(error){ call Resource.release(); signal Read.readDone(error, 0); } } async event void I2CBasicAddr.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t *data){ if(call Resource.isOwner()) { uint16_t tmp; for(tmp=0;tmp<0xffff;tmp++); //delay call Resource.release(); tmp = data[0]; tmp = tmp << 8; tmp = tmp + data[1]; tmp = tmp >> 4; atomic temp = tmp; post calculateTemp(); } } async event void I2CBasicAddr.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t *data){ if(call Resource.isOwner()){ error_t e; e = call I2CBasicAddr.read((I2C_START | I2C_STOP), TMP102_ADDRESS, 2, temperaturebuff); if(e){ call Resource.release(); signal Read.readDone(error, 0); } } } async event void ResourceRequested.requested(){ } async event void ResourceRequested.immediateRequested(){ } } tinyos-2.1.2+dfsg/tos/chips/tmp102/TMP102.h000066400000000000000000000036371207233610700177640ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Implementation of a simple read interface for the TMP102 temperature * sensor built-in Zolertia Z1 motes * * @author: Xavier Orduna * @author: Jordi Soucheiron */ #ifndef TMP102_H #define TMP102_H #define TMP102_ADDRESS 0x48 #define TMP102_TEMPREG 0x00 #define TMP_READ_TMP 1 #endif tinyos-2.1.2+dfsg/tos/chips/tmp175/000077500000000000000000000000001207233610700167315ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/tmp175/HalTMP175Advanced.nc000066400000000000000000000046451207233610700222340ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HalTMP175Advanced is the HAL control interface for the TI TMP175 * Digital Temperature Sensor. * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ #include "TMP175.h" interface HalTMP175Advanced { command error_t setThermostatMode(bool useInt); event void setThermostatModeDone(error_t error); command error_t setPolarity(bool polarity); event void setPolarityDone(error_t error); command error_t setFaultQueue(tmp175_fqd_t depth); event void setFaultQueueDone(error_t error); command error_t setResolution(tmp175_res_t res); event void setResolutionDone(error_t error); command error_t setTLow(uint16_t val); event void setTLowDone(error_t error); command error_t setTHigh(uint16_t val); event void setTHighDone(error_t error); event void alertThreshold(); } tinyos-2.1.2+dfsg/tos/chips/tmp175/HalTMP175ControlP.nc000066400000000000000000000166711207233610700222710ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HalTMP175ControlP device specific Hal interfaces for the TI TMP175 Chip. * * Note that only the data path uses split phase resource arbitration * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ module HalTMP175ControlP { provides interface HalTMP175Advanced; uses interface HplTMP175; uses interface Resource as TMP175Resource; } implementation { enum { STATE_SET_MODE, STATE_SET_POLARITY, STATE_SET_FQ, STATE_SET_RES, STATE_NONE, STATE_SET_TLOW, STATE_SET_THIGH, }; uint8_t mState = STATE_NONE; uint8_t mConfigRegVal = 0; error_t mHplError; task void complete_Alert() { signal HalTMP175Advanced.alertThreshold(); } static error_t setCfg(uint8_t nextState, uint32_t val) { error_t error; mState = nextState; error = call HplTMP175.setConfigReg(val); if (error) { call TMP175Resource.release(); } else { mConfigRegVal = val; } return error; } static error_t setThresh(uint8_t nextState, uint32_t val) { error_t error; mState = nextState; if(mState == STATE_SET_TLOW) error = call HplTMP175.setTLowReg(val << 4); else error = call HplTMP175.setTHighReg(val << 4); if (error) { call TMP175Resource.release(); } return error; } command error_t HalTMP175Advanced.setThermostatMode(bool useInt) { error_t error; uint8_t newRegVal; error = call TMP175Resource.immediateRequest(); if (error) { return error; } newRegVal = (useInt) ? (mConfigRegVal | TMP175_CFG_TM) : (mConfigRegVal & ~TMP175_CFG_TM); error = setCfg(STATE_SET_MODE, newRegVal); return error; } command error_t HalTMP175Advanced.setPolarity(bool polarity) { error_t error; uint8_t newRegVal; error = call TMP175Resource.immediateRequest(); if (error) { return error; } newRegVal = (polarity) ? (mConfigRegVal | TMP175_CFG_POL) : (mConfigRegVal & ~TMP175_CFG_POL); error = setCfg(STATE_SET_POLARITY, newRegVal); return error; } command error_t HalTMP175Advanced.setFaultQueue(tmp175_fqd_t depth) { error_t error; uint8_t newRegVal; if ((uint8_t)depth > 3) { error = EINVAL; return error; } error = call TMP175Resource.immediateRequest(); if (error) { return error; } newRegVal = (mConfigRegVal & ~TMP175_CFG_FQ(3)) | (TMP175_CFG_FQ(depth)); error = setCfg(STATE_SET_FQ, newRegVal); return error; } command error_t HalTMP175Advanced.setResolution(tmp175_res_t res) { error_t error; uint8_t newRegVal; if ((uint8_t)res > 3) { error = EINVAL; return error; } error = call TMP175Resource.immediateRequest(); if (error) { return error; } newRegVal = (mConfigRegVal & ~TMP175_CFG_RES(3)) | (TMP175_CFG_RES(res)); error = setCfg(STATE_SET_RES, newRegVal); return error; } command error_t HalTMP175Advanced.setTLow(uint16_t val) { error_t error; error = call TMP175Resource.immediateRequest(); if (error) { return error; } error = setThresh(STATE_SET_TLOW, val); if (error) { call TMP175Resource.release(); } return error; } command error_t HalTMP175Advanced.setTHigh(uint16_t val) { error_t error; error = call TMP175Resource.immediateRequest(); if (error) { return error; } error = setThresh(STATE_SET_THIGH, val); if (error) { call TMP175Resource.release(); } return error; } task void handleConfigReg() { error_t lasterror; atomic lasterror = mHplError; call TMP175Resource.release(); switch (mState) { case STATE_SET_MODE: mState = STATE_NONE; signal HalTMP175Advanced.setThermostatModeDone(lasterror); break; case STATE_SET_POLARITY: mState = STATE_NONE; signal HalTMP175Advanced.setPolarityDone(lasterror); break; case STATE_SET_FQ: mState = STATE_NONE; signal HalTMP175Advanced.setFaultQueueDone(lasterror); break; case STATE_SET_RES: mState = STATE_NONE; signal HalTMP175Advanced.setResolutionDone(lasterror); break; default: break; } //mState = STATE_NONE; return; } task void handleTReg() { error_t lasterror; atomic lasterror = mHplError; call TMP175Resource.release(); switch (mState) { case STATE_SET_TLOW: mState = STATE_NONE; signal HalTMP175Advanced.setTLowDone(lasterror); break; case STATE_SET_THIGH: mState = STATE_NONE; signal HalTMP175Advanced.setTHighDone(lasterror); break; default: mState = STATE_NONE; break; } //mState = STATE_NONE; } event void TMP175Resource.granted() { // intentionally left blank } async event void HplTMP175.setConfigRegDone(error_t error) { mHplError = error; post handleConfigReg(); return; } async event void HplTMP175.setTLowRegDone(error_t error) { mHplError = error; post handleTReg(); } async event void HplTMP175.setTHighRegDone(error_t error) { mHplError = error; post handleTReg(); } async event void HplTMP175.alertThreshold() { post complete_Alert(); } async event void HplTMP175.measureTemperatureDone(error_t error, uint16_t val) { // intentionally left blank } default event void HalTMP175Advanced.setTHighDone(error_t error) { return; } default event void HalTMP175Advanced.setThermostatModeDone(error_t error){ return; } default event void HalTMP175Advanced.setPolarityDone(error_t error){ return; } default event void HalTMP175Advanced.setFaultQueueDone(error_t error){ return; } default event void HalTMP175Advanced.setResolutionDone(error_t error){ return; } default event void HalTMP175Advanced.setTLowDone(error_t error){ return; } default event void HalTMP175Advanced.alertThreshold(){ return; } } tinyos-2.1.2+dfsg/tos/chips/tmp175/HalTMP175ReaderP.nc000066400000000000000000000061311207233610700220410ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HalTMP175ReaderP provides the service level HIL and device * specific Hal interfaces for the TI TMP175 Chip. * * Note that only the data path uses split phase resource arbitration * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ generic module HalTMP175ReaderP() { provides interface Read as Temperature; uses interface HplTMP175; uses interface Resource as TMP175Resource; } implementation { enum { STATE_SET_MODE, STATE_SET_POLARITY, STATE_SET_FQ, STATE_SET_RES, STATE_NONE }; uint8_t mState = STATE_NONE; uint8_t mConfigRegVal = 0; error_t mHplError; command error_t Temperature.read() { return call TMP175Resource.request(); } event void TMP175Resource.granted() { error_t error; error = call HplTMP175.measureTemperature(); if (error) { call TMP175Resource.release(); signal Temperature.readDone(error,0); } return; } async event void HplTMP175.measureTemperatureDone(error_t tmp175_error, uint16_t val) { call TMP175Resource.release(); signal Temperature.readDone(tmp175_error,(val >> 4)); return; } // intentionally left empty async event void HplTMP175.setTLowRegDone(error_t error) {} async event void HplTMP175.setTHighRegDone(error_t error) {} async event void HplTMP175.setConfigRegDone(error_t error) {} async event void HplTMP175.alertThreshold() {} default event void Temperature.readDone(error_t error, uint16_t val) {return ;} } tinyos-2.1.2+dfsg/tos/chips/tmp175/HplTMP175.nc000066400000000000000000000055041207233610700206200ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HplTMP175 is the HPL inteface to the Texas Instrument TMP175 * Digital Temperature Sensor. * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ interface HplTMP175 { /** * Starts a temperature measurement. * * @return SUCCESS if the measurement will be made */ command error_t measureTemperature(); /** * Presents the result of a temperature measurement. * * @param error SUCCESS if the measurement was successful * @param val the temperature reading */ async event void measureTemperatureDone( error_t error, uint16_t val ); /** * Sets a new value to the TMP175 configuration register. * * @param val the new value to be written * * @return SUCCESS if the set will be performed */ command error_t setConfigReg( uint8_t val ); /** * Signals the completion of the configuration register set. * * @param error SUCCESS if the set was successful */ async event void setConfigRegDone( error_t error ); command error_t setTLowReg(uint16_t val); async event void setTLowRegDone(error_t error); command error_t setTHighReg(uint16_t val); async event void setTHighRegDone(error_t error); async event void alertThreshold(); } tinyos-2.1.2+dfsg/tos/chips/tmp175/HplTMP175LogicP.nc000066400000000000000000000167541207233610700217270ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HplTMP175LogicP is the driver for the TI TMP175. It requires an * I2C packet interface and provides the HplTMP175 HPL interface. * This module DOES NOT apply any specific configuration to the GpioInterrupt * pin associated with the theshold alerts. This must be handled by an * outside configuration/module according to the host platform. * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ #include "TMP175.h" #include "I2C.h" generic module HplTMP175LogicP(uint16_t devAddr) { provides interface Init; provides interface SplitControl; provides interface HplTMP175; uses interface I2CPacket; uses interface GpioInterrupt as AlertInterrupt; uses interface GeneralIO as InterruptPin; } implementation { enum { STATE_IDLE, STATE_STARTING, STATE_STOPPING, STATE_STOPPED, STATE_READTEMP, STATE_SETCONFIG, STATE_SETTHIGH, STATE_SETTLOW, }; bool mfPtrReset; uint8_t mI2CBuffer[4]; uint8_t mState; uint8_t mConfigRegVal; norace error_t mSSError; static error_t doSetReg(uint8_t nextState, uint8_t reg, uint8_t val) { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = nextState; } else { error = EBUSY; } } if (error) return error; mI2CBuffer[0] = reg; mI2CBuffer[1] = val; error = call I2CPacket.write((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); if (error) atomic mState = STATE_IDLE; return error; } static error_t doSetRegWord(uint8_t nextState, uint8_t reg, uint16_t val) { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = nextState; } else { error = EBUSY; } } if (error) return error; mI2CBuffer[0] = reg; mI2CBuffer[1] = (val >> 8) & 0xFF; mI2CBuffer[2] = val & 0xFF; error = call I2CPacket.write((I2C_START | I2C_STOP),devAddr,3,mI2CBuffer); if (error) atomic mState = STATE_IDLE; return error; } task void StartDone() { atomic mState = STATE_IDLE; signal SplitControl.startDone(mSSError); return; } task void StopDone() { atomic mState = STATE_STOPPED; signal SplitControl.stopDone(mSSError); return; } command error_t Init.init() { // careful! this can be changed via polarity I believe call InterruptPin.makeInput(); call AlertInterrupt.enableRisingEdge(); mfPtrReset = FALSE; mConfigRegVal = 0; mState = STATE_STOPPED; return SUCCESS; } command error_t SplitControl.start() { error_t error = SUCCESS; atomic { if (mState == STATE_STOPPED) { mState = STATE_IDLE; } else { error = EBUSY; } } if (error) return error; return doSetReg(STATE_STARTING,TMP175_PTR_CFG,(mConfigRegVal & ~TMP175_CFG_SD)); } command error_t SplitControl.stop() { return doSetReg(STATE_STOPPING,TMP175_PTR_CFG,(mConfigRegVal | TMP175_CFG_SD)); } command error_t HplTMP175.measureTemperature() { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = STATE_READTEMP; } else { error = EBUSY; } } if (error) return error; mI2CBuffer[0] = mI2CBuffer[1] = 0; error = call I2CPacket.read(I2C_START | I2C_STOP, devAddr,2,mI2CBuffer); if (error) atomic mState = STATE_IDLE; return error; } command error_t HplTMP175.setConfigReg( uint8_t val ){ return doSetReg(STATE_SETCONFIG,TMP175_PTR_CFG,val); } command error_t HplTMP175.setTLowReg(uint16_t val){ return doSetRegWord(STATE_SETTLOW,TMP175_PTR_TLOW,val); } command error_t HplTMP175.setTHighReg(uint16_t val){ return doSetRegWord(STATE_SETTHIGH,TMP175_PTR_THIGH,val); } async event void I2CPacket.readDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { uint16_t tempVal; switch (mState) { case STATE_READTEMP: tempVal = buf[0]; tempVal = ((tempVal << 8) | buf[1]); mState = STATE_IDLE; signal HplTMP175.measureTemperatureDone(i2c_error,tempVal); break; default: break; } return; } async event void I2CPacket.writeDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { error_t error = i2c_error; if (mfPtrReset) { mfPtrReset = FALSE; switch (mState) { case STATE_STARTING: mSSError = error; post StartDone(); break; case STATE_STOPPING: mSSError = error; post StopDone(); break; case STATE_READTEMP: // Should never get here. break; case STATE_SETCONFIG: mState = STATE_IDLE; signal HplTMP175.setConfigRegDone(error); break; case STATE_SETTHIGH: mState = STATE_IDLE; signal HplTMP175.setTHighRegDone(error); break; case STATE_SETTLOW: mState = STATE_IDLE; signal HplTMP175.setTLowRegDone(error); break; default: mState = STATE_IDLE; break; } } else { // Reset the PTR register back to the temperature register mI2CBuffer[0] = TMP175_PTR_TEMP; mfPtrReset = TRUE; call I2CPacket.write(I2C_START | I2C_STOP, devAddr,1,mI2CBuffer); } return; } async event void AlertInterrupt.fired() { // This alert is decoupled from whatever state the TMP175 is in. // Upper layers must handle dealing with this alert appropriately. signal HplTMP175.alertThreshold(); return; } default event void SplitControl.startDone( error_t error ) { return; } default event void SplitControl.stopDone( error_t error ) { return; } default async event void HplTMP175.measureTemperatureDone( error_t error, uint16_t val ){ return; } default async event void HplTMP175.setConfigRegDone( error_t error ){ return; } default async event void HplTMP175.setTHighRegDone(error_t error){ return; } default async event void HplTMP175.setTLowRegDone(error_t error){ return; } default async event void HplTMP175.alertThreshold(){ return; } } tinyos-2.1.2+dfsg/tos/chips/tmp175/TMP175.h000066400000000000000000000045331207233610700200040ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Types and definitions for the TI TMP175 * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ #ifndef _TMP175_H #define _TMP175_H #define TMP175_PTR_TEMP (0x0) #define TMP175_PTR_CFG (0x1) #define TMP175_PTR_TLOW (0x2) #define TMP175_PTR_THIGH (0x3) #define TMP175_CFG_OS (1 << 7) #define TMP175_CFG_RES(_x) (((_x) & 0x3) << 5) #define TMP175_CFG_FQ(_x) (((_x) & 0x3) << 3) #define TMP175_CFG_POL (1 << 2) #define TMP175_CFG_TM (1 << 1) #define TMP175_CFG_SD (1 << 0) typedef enum { TMP175_FQD_1 = 0, TMP175_FQD_2 = 1, TMP175_FQD_4 = 2, TMP175_FQD_6 = 3 } tmp175_fqd_t; typedef enum { TMP175_RES_9BIT, TMP175_RES_10BIT, TMP175_RES_11BIT, TMP175_RES_12BIT } tmp175_res_t; #endif /* _TMP175_H */ tinyos-2.1.2+dfsg/tos/chips/tsl2561/000077500000000000000000000000001207233610700170145ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/tsl2561/HalTsl2561Advanced.nc000066400000000000000000000043771207233610700225040ustar00rootroot00000000000000/* $Id: HalTsl2561Advanced.nc,v 1.4 2006-12-12 18:23:14 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ interface HalTsl2561Advanced { command error_t setGain(bool gainHigh); event void setGainDone(error_t error); command error_t setIntegration(uint8_t val); event void setIntegrationDone(error_t error); command error_t setPersistence(uint8_t val); event void setPersistenceDone(error_t error); command error_t setTLow(uint16_t val); event void setTLowDone(error_t error); command error_t setTHigh(uint16_t val); event void setTHighDone(error_t error); command error_t enableAlert(bool enable); event void enableAlertDone(error_t error); event void alertThreshold(); } tinyos-2.1.2+dfsg/tos/chips/tsl2561/HalTsl2561ControlP.nc000066400000000000000000000161771207233610700225400ustar00rootroot00000000000000/* $Id: HalTsl2561ControlP.nc,v 1.4 2006-12-12 18:23:14 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #include "TSL256x.h" module HalTsl2561ControlP { provides interface HalTsl2561Advanced; uses interface Resource; uses interface HplTSL256x; } implementation { enum { S_IDLE = 0, S_GAIN, S_INTEG, S_PERSIST, S_TLOW, S_THIGH, S_ENALERT, }; uint8_t state = S_IDLE; error_t clientResult; uint8_t timingRegisterShadow = 0x02; uint8_t iControlRegisterShadow = 0x0; task void complete_Alert() { signal HalTsl2561Advanced.alertThreshold(); } task void complete_Task() { switch(state) { case S_GAIN: state = S_IDLE; call Resource.release(); signal HalTsl2561Advanced.setGainDone(clientResult); break; case S_INTEG: state = S_IDLE; call Resource.release(); signal HalTsl2561Advanced.setIntegrationDone(clientResult); break; case S_PERSIST: state = S_IDLE; call Resource.release(); signal HalTsl2561Advanced.setPersistenceDone(clientResult); break; case S_TLOW: state = S_IDLE; call Resource.release(); signal HalTsl2561Advanced.setTLowDone(clientResult); break; case S_THIGH: state = S_IDLE; call Resource.release(); signal HalTsl2561Advanced.setTHighDone(clientResult); break; case S_ENALERT: state = S_IDLE; call Resource.release(); signal HalTsl2561Advanced.enableAlertDone(clientResult); break; default: break; } } command error_t HalTsl2561Advanced.setGain(bool gainHigh) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_GAIN; if(gainHigh) timingRegisterShadow |= TSL256X_TIMING_GAIN; else timingRegisterShadow &= ~TSL256X_TIMING_GAIN; call HplTSL256x.setTIMING(timingRegisterShadow); return SUCCESS; } command error_t HalTsl2561Advanced.setIntegration(uint8_t val) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_INTEG; timingRegisterShadow |= TSL256X_TIMING_MANUAL; timingRegisterShadow |= TSL256X_TIMING_INTEG(val); call HplTSL256x.setTIMING(timingRegisterShadow); return SUCCESS; } command error_t HalTsl2561Advanced.setPersistence(uint8_t val) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_PERSIST; iControlRegisterShadow &= ~TSL256X_INTERRUPT_PERSIST(0xF); iControlRegisterShadow |= TSL256X_INTERRUPT_PERSIST(val); call HplTSL256x.setINTERRUPT(iControlRegisterShadow); return SUCCESS; } command error_t HalTsl2561Advanced.setTLow(uint16_t val) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_TLOW; call HplTSL256x.setTHRESHLOW(val); return SUCCESS; } command error_t HalTsl2561Advanced.setTHigh(uint16_t val) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_THIGH; call HplTSL256x.setTHRESHHIGH(val); return SUCCESS; } command error_t HalTsl2561Advanced.enableAlert(bool enable) { error_t status; if(state != S_IDLE) return FAIL; state = S_ENALERT; iControlRegisterShadow &= ~TSL256X_INTERRUPT_INTR(3); // strip off interrupt select if(enable) iControlRegisterShadow |= TSL256X_INTERRUPT_INTR(1); status = call Resource.immediateRequest(); if(status != SUCCESS) { status = call Resource.request(); return status; } else { call HplTSL256x.setINTERRUPT(iControlRegisterShadow); } return SUCCESS; } event void Resource.granted() { // Only use Queued requests for alertEnable if (state == S_ENALERT) { call HplTSL256x.setINTERRUPT(iControlRegisterShadow); } return; } async event void HplTSL256x.setTIMINGDone(error_t error) { clientResult = error; post complete_Task(); } async event void HplTSL256x.setINTERRUPTDone(error_t error) { clientResult = error; post complete_Task(); } async event void HplTSL256x.setTHRESHLOWDone(error_t error) { clientResult = error; post complete_Task(); } async event void HplTSL256x.setTHRESHHIGHDone(error_t error) { clientResult = error; post complete_Task(); } async event void HplTSL256x.alertThreshold() { post complete_Alert(); } // stubs async event void HplTSL256x.getIDDone(error_t error, uint8_t idval) {} // intentionally left empty async event void HplTSL256x.setCONTROLDone(error_t error) {} async event void HplTSL256x.measureCh0Done(error_t error, uint16_t val) {} async event void HplTSL256x.measureCh1Done(error_t error, uint16_t val) {} // default stuff /* default event void HalTsl2561Advanced.setGainDone(error_t error) {} default event void HalTsl2561Advanced.setIntegrationDone(error_t error) {} default event void HalTsl2561Advanced.setPersistenceDone(error_t error) {} default event void HalTsl2561Advanced.setTLowDone(error_t error) {} default event void HalTsl2561Advanced.setTHighDone(error_t error) {} default event void HalTsl2561Advanced.enableAlertDone(error_t error) {} default event void HalTsl2561Advanced.alertThreshold() {} */ } tinyos-2.1.2+dfsg/tos/chips/tsl2561/HalTsl2561ReaderP.nc000066400000000000000000000101201207233610700223000ustar00rootroot00000000000000/* $Id: HalTsl2561ReaderP.nc,v 1.4 2006-12-12 18:23:14 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ // someone better power this up via SplitControl generic module HalTsl2561ReaderP() { provides interface Read as BroadbandPhoto; provides interface Read as IRPhoto; uses interface Resource as BroadbandResource; uses interface Resource as IRResource; uses interface HplTSL256x; } implementation { enum { S_OFF = 0, S_READY, S_READ_BB, S_READ_IR, }; norace uint8_t m_state = S_READY; error_t m_error; uint16_t m_val; task void signalDone_task() { switch(m_state) { case S_READ_BB: m_state = S_READY; call BroadbandResource.release(); signal BroadbandPhoto.readDone(m_error, m_val); break; case S_READ_IR: m_state = S_READY; call IRResource.release(); signal IRPhoto.readDone(m_error, m_val); break; default: m_state = S_READY; break; } } command error_t BroadbandPhoto.read() { error_t status; if(m_state != S_READY) return FAIL; status = call BroadbandResource.request(); return status; } command error_t IRPhoto.read() { error_t status; if(m_state != S_READY) return FAIL; status = call IRResource.request(); return status; } event void BroadbandResource.granted() { error_t result; result = call HplTSL256x.measureCh0(); if(result != SUCCESS) { call BroadbandResource.release(); signal BroadbandPhoto.readDone(result, 0); } } event void IRResource.granted() { error_t result; result = call HplTSL256x.measureCh1(); if(result != SUCCESS) { call IRResource.release(); signal IRPhoto.readDone(result, 0); } } async event void HplTSL256x.measureCh0Done(error_t error, uint16_t val) { m_state = S_READ_BB; m_error = error; m_val = val; post signalDone_task(); } async event void HplTSL256x.measureCh1Done(error_t error, uint16_t val) { m_state = S_READ_IR; m_error = error; m_val = val; post signalDone_task(); } async event void HplTSL256x.setCONTROLDone(error_t error) {} async event void HplTSL256x.setTIMINGDone(error_t error) {} async event void HplTSL256x.setTHRESHLOWDone(error_t error) {} async event void HplTSL256x.setTHRESHHIGHDone(error_t error) {} async event void HplTSL256x.setINTERRUPTDone(error_t error) {} async event void HplTSL256x.getIDDone(error_t error, uint8_t idval) {} async event void HplTSL256x.alertThreshold() {} } tinyos-2.1.2+dfsg/tos/chips/tsl2561/HplTSL2561LogicP.nc000066400000000000000000000226041207233610700220640ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * TSL2561LogicP is the driver for the Taos TSL2561, the I2C variant * of the Taos TSL256x line. * It requires an I2C packet interface and provides the * TSL256x HPL interface. * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ #include "TSL256x.h" #include "I2C.h" generic module HplTSL2561LogicP(uint16_t devAddr) { provides interface Init; provides interface SplitControl; provides interface HplTSL256x; uses interface I2CPacket; uses interface GpioInterrupt as InterruptAlert; uses interface Leds; uses interface GeneralIO as InterruptPin; } implementation { enum { STATE_IDLE, STATE_STARTING, STATE_STOPPING, STATE_STOPPED, STATE_READCH0, STATE_READCH1, STATE_SETCONTROL, STATE_SETTIMING, STATE_SETLOW, STATE_SETHIGH, STATE_SETINTERRUPT, STATE_READID, STATE_CLRINTERRUPTS, STATE_ERROR }; bool interruptBit; // determine if I2C write was to clear an interrupt uint8_t mI2CBuffer[4]; uint8_t mState; norace error_t mSSError; static error_t doWriteReg(uint8_t nextState, uint8_t reg, uint16_t val, uint8_t size) { error_t error = SUCCESS; atomic { if ((mState == STATE_IDLE) || (mState == STATE_STARTING)) { mState = nextState; } else { error = EBUSY; } } if (error) return error; mI2CBuffer[0] = (TSL256X_COMMAND_CMD | reg); mI2CBuffer[1] = (uint8_t)(val & 0xFF); mI2CBuffer[2] = (uint8_t)((val >> 8) & 0xFF); error = call I2CPacket.write(I2C_START | I2C_STOP,devAddr,(size + 1),mI2CBuffer); if (error) atomic mState = STATE_IDLE; return error; } static error_t doReadPrep(uint8_t nextState, uint8_t reg) { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = nextState; } else { error = EBUSY; } } if (error) return error; mI2CBuffer[0] = (TSL256X_COMMAND_CMD | reg ); error = call I2CPacket.write(I2C_START,devAddr,1,mI2CBuffer); if (error) atomic mState = STATE_IDLE; return error; } static error_t clearInterrupt() { error_t error; mI2CBuffer[0] = (TSL256X_COMMAND_CMD | TSL256X_COMMAND_CLEAR); error = call I2CPacket.write(I2C_START | I2C_STOP, devAddr, 1, mI2CBuffer); if (error == SUCCESS) interruptBit = TRUE; return error; } task void StartDone() { signal SplitControl.startDone(mSSError); return; } task void StopDone() { signal SplitControl.stopDone(mSSError); return; } command error_t Init.init() { call InterruptPin.makeInput(); call InterruptAlert.enableFallingEdge(); mState = STATE_STOPPED; interruptBit = FALSE; return SUCCESS; } command error_t SplitControl.start() { error_t error = SUCCESS; atomic { if (mState == STATE_STOPPED) { mState = STATE_STARTING; } else { error = EBUSY; } } if (error) return error; return doWriteReg(STATE_STARTING,(TSL256X_COMMAND_CLEAR | TSL256X_PTR_CONTROL), (TSL256X_CONTROL_POWER_ON),1); } command error_t SplitControl.stop() { return doWriteReg(STATE_STOPPING,(TSL256X_COMMAND_CLEAR | TSL256X_PTR_CONTROL), (TSL256X_CONTROL_POWER_OFF),1); } command error_t HplTSL256x.measureCh0() { return doReadPrep(STATE_READCH0,TSL256X_PTR_DATA0LOW); } command error_t HplTSL256x.measureCh1() { return doReadPrep(STATE_READCH1,TSL256X_PTR_DATA1LOW); } command error_t HplTSL256x.setCONTROL(uint8_t val) { return doWriteReg(STATE_SETCONTROL,TSL256X_PTR_CONTROL,val,1); } command error_t HplTSL256x.setTIMING(uint8_t val) { return doWriteReg(STATE_SETTIMING,TSL256X_PTR_TIMING,val,1); } command error_t HplTSL256x.setTHRESHLOW(uint16_t val) { // As it turns out, you have to use the SMB Write Word flag to use this command return doWriteReg(STATE_SETLOW,(TSL256X_COMMAND_WORD | TSL256X_PTR_THRESHLOWLOW),val,2); } command error_t HplTSL256x.setTHRESHHIGH(uint16_t val) { // As it turns out, you have to use the SMB Write Word flag to use this command return doWriteReg(STATE_SETHIGH,(TSL256X_COMMAND_WORD | TSL256X_PTR_THRESHHIGHLOW),val,2); } command error_t HplTSL256x.setINTERRUPT(uint8_t val) { return doWriteReg(STATE_SETINTERRUPT,(TSL256X_COMMAND_CLEAR | TSL256X_PTR_INTERRUPT),val,1); } command error_t HplTSL256x.getID() { return doReadPrep(STATE_READID,TSL256X_PTR_ID); } async event void I2CPacket.readDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { uint16_t tempVal; error_t error = i2c_error; switch (mState) { case STATE_READCH0: tempVal = buf[1]; tempVal = ((tempVal << 8) | buf[0]); mState = STATE_IDLE; signal HplTSL256x.measureCh0Done(error,tempVal); break; case STATE_READCH1: tempVal = buf[1]; tempVal = ((tempVal << 8) | buf[0]); mState = STATE_IDLE; signal HplTSL256x.measureCh1Done(error,tempVal); break; case STATE_READID: mState = STATE_IDLE; signal HplTSL256x.getIDDone(error,buf[0]); break; default: mState = STATE_IDLE; break; } return; } async event void I2CPacket.writeDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { error_t error = i2c_error; switch (mState) { case STATE_STARTING: mSSError = error; mState = STATE_IDLE; post StartDone(); break; case STATE_STOPPING: mSSError = error; mState = STATE_STOPPED; post StopDone(); break; case STATE_READCH0: error = call I2CPacket.read(I2C_START | I2C_STOP,devAddr,2,mI2CBuffer); break; case STATE_READCH1: error = call I2CPacket.read(I2C_START | I2C_STOP,devAddr,2,mI2CBuffer); break; case STATE_SETCONTROL: mState = STATE_IDLE; signal HplTSL256x.setCONTROLDone(error); break; case STATE_SETTIMING: mState = STATE_IDLE; signal HplTSL256x.setTIMINGDone(error); break; case STATE_SETINTERRUPT: mState = STATE_IDLE; signal HplTSL256x.setINTERRUPTDone(error); break; case STATE_SETHIGH: mState = STATE_IDLE; signal HplTSL256x.setTHRESHHIGHDone(error); break; case STATE_SETLOW: mState = STATE_IDLE; signal HplTSL256x.setTHRESHLOWDone(error); break; case STATE_READID: error = call I2CPacket.read(I2C_STOP,devAddr,1,mI2CBuffer); break; default: mState = STATE_IDLE; break; } return; } async event void InterruptAlert.fired() { // This alert is decoupled from whatever state the TSL2561 is in. // Upper layers must handle dealing with this alert appropriately. signal HplTSL256x.alertThreshold(); // need to clear interrupt, this is dangerous... // if you get interrupted while someone is reading... // ... the I2C bus may become inconsistent? //clearInterrupt(); return; } default event void SplitControl.startDone( error_t error ) { return; } default event void SplitControl.stopDone( error_t error ) { return; } default async event void HplTSL256x.measureCh0Done( error_t error, uint16_t val ){ return; } default async event void HplTSL256x.measureCh1Done( error_t error, uint16_t val ){ return; } default async event void HplTSL256x.setCONTROLDone( error_t error ){ return; } default async event void HplTSL256x.setTIMINGDone(error_t error){ return; } default async event void HplTSL256x.setTHRESHLOWDone(error_t error){ return;} default async event void HplTSL256x.setTHRESHHIGHDone(error_t error){ return; } default async event void HplTSL256x.setINTERRUPTDone(error_t error){ return;} default async event void HplTSL256x.getIDDone(error_t error, uint8_t idval){ return; } default async event void HplTSL256x.alertThreshold(){ return; } } tinyos-2.1.2+dfsg/tos/chips/tsl2561/HplTSL256x.nc000066400000000000000000000051421207233610700210730ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HplTSL256x is the Hpl inteface to the Taos TSL256x series * Light-to-Digital converters. * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ interface HplTSL256x { command error_t measureCh0(); async event void measureCh0Done( error_t error, uint16_t val ); command error_t measureCh1(); async event void measureCh1Done( error_t error, uint16_t val ); command error_t setCONTROL( uint8_t val ); async event void setCONTROLDone( error_t error ); command error_t setTIMING( uint8_t val ); async event void setTIMINGDone( error_t error ); command error_t setTHRESHLOW(uint16_t val); async event void setTHRESHLOWDone(error_t error); command error_t setTHRESHHIGH(uint16_t val); async event void setTHRESHHIGHDone(error_t error); command error_t setINTERRUPT(uint8_t val); async event void setINTERRUPTDone(error_t error); command error_t getID(); async event void getIDDone(error_t error, uint8_t idval); async event void alertThreshold(); } tinyos-2.1.2+dfsg/tos/chips/tsl2561/TSL256x.h000066400000000000000000000053671207233610700202670ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in so1urce and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Types and definitions for the Taos TSL256x sensor * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ #ifndef _TSL256X_H #define _TSL256X_H #define TSL256X_PTR_CONTROL (0x0) #define TSL256X_PTR_TIMING (0x1) #define TSL256X_PTR_THRESHLOWLOW (0x2) #define TSL256X_PTR_THRESHLOWHIGH (0x3) #define TSL256X_PTR_THRESHHIGHLOW (0x4) #define TSL256X_PTR_THRESHHIGHIGH (0x5) #define TSL256X_PTR_INTERRUPT (0x6) #define TSL256X_PTR_CRC (0x8) #define TSL256X_PTR_ID (0xA) #define TSL256X_PTR_DATA0LOW (0xC) #define TSL256X_PTR_DATA0HIGH (0xD) #define TSL256X_PTR_DATA1LOW (0xE) #define TSL256X_PTR_DATA1HIGH (0xF) #define TSL256X_COMMAND_CMD (1<<7) #define TSL256X_COMMAND_CLEAR (1<<6) #define TSL256X_COMMAND_WORD (1<<5) #define TSL256X_COMMAND_BLOCK (1<<4) #define TSL256X_COMMAND_ADDRESS(_x) ((_x) & 0xF) #define TSL256X_CONTROL_POWER_ON (0x3) #define TSL256X_CONTROL_POWER_OFF (0x0) #define TSL256X_TIMING_GAIN (1<<4) #define TSL256X_TIMING_MANUAL (1<<3) #define TSL256X_TIMING_INTEG(_x) ((_x) & 0x3) #define TSL256X_INTERRUPT_INTR(_x) (((_x) & 0x3) << 4) #define TSL256X_INTERRUPT_PERSIST(_x) ((_x) & 0xF) #endif /* _TSL256X_H */ tinyos-2.1.2+dfsg/tos/chips/xe1205/000077500000000000000000000000001207233610700166205ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/xe1205/AckSendReceive.nc000066400000000000000000000001611207233610700217530ustar00rootroot00000000000000interface AckSendReceive { command void setAckPayload(uint16_t _pl); command uint16_t getAckPayload(); } tinyos-2.1.2+dfsg/tos/chips/xe1205/CsmaControl.nc000066400000000000000000000001501207233610700213620ustar00rootroot00000000000000interface CsmaControl { async command void enableCca(); async command void disableCca(); } tinyos-2.1.2+dfsg/tos/chips/xe1205/LPLControl.nc000066400000000000000000000001151207233610700211270ustar00rootroot00000000000000 interface LPLControl { async command void setMode(uint8_t mode); } tinyos-2.1.2+dfsg/tos/chips/xe1205/LowPowerListening.nc000066400000000000000000000113271207233610700226010ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Low Power Listening interface * * @author David Moss * @author Jonathan Hui */ interface LowPowerListening { /** * Set this this node's radio sleep interval, in milliseconds. * Once every interval, the node will sleep and perform an Rx check * on the radio. Setting the sleep interval to 0 will keep the radio * always on. * * This is the equivalent of setting the local duty cycle rate. * * @param sleepIntervalMs the length of this node's Rx check interval, in [ms] */ command void setLocalSleepInterval(uint16_t sleepIntervalMs); /** * @return the local node's sleep interval, in [ms] */ command uint16_t getLocalSleepInterval(); /** * Set this node's radio duty cycle rate, in units of [percentage*100]. * For example, to get a 0.05% duty cycle, * * call LowPowerListening.setDutyCycle(5); // or equivalently... * call LowPowerListening.setDutyCycle(00005); // for better readability? * * * For a 100% duty cycle (always on), * * call LowPowerListening.setDutyCycle(10000); * * * This is the equivalent of setting the local sleep interval explicitly. * * @param dutyCycle The duty cycle percentage, in units of [percentage*100] */ command void setLocalDutyCycle(uint16_t dutyCycle); /** * @return this node's radio duty cycle rate, in units of [percentage*100] */ command uint16_t getLocalDutyCycle(); /** * Configure this outgoing message so it can be transmitted to a neighbor mote * with the specified Rx sleep interval. * @param msg Pointer to the message that will be sent * @param sleepInterval The receiving node's sleep interval, in [ms] */ command void setRxSleepInterval(message_t *msg, uint16_t sleepIntervalMs); /** * @return the destination node's sleep interval configured in this message */ command uint16_t getRxSleepInterval(message_t *msg); /** * Configure this outgoing message so it can be transmitted to a neighbor mote * with the specified Rx duty cycle rate. * Duty cycle is in units of [percentage*100], i.e. 0.25% duty cycle = 25. * * @param msg Pointer to the message that will be sent * @param dutyCycle The duty cycle of the receiving mote, in units of * [percentage*100] */ command void setRxDutyCycle(message_t *msg, uint16_t dutyCycle); /** * @return the destination node's duty cycle configured in this message * in units of [percentage*100] */ command uint16_t getRxDutyCycle(message_t *msg); /** * Convert a duty cycle, in units of [percentage*100], to * the sleep interval of the mote in milliseconds * @param dutyCycle The duty cycle in units of [percentage*100] * @return The equivalent sleep interval, in units of [ms] */ command uint16_t dutyCycleToSleepInterval(uint16_t dutyCycle); /** * Convert a sleep interval, in units of [ms], to a duty cycle * in units of [percentage*100] * @param sleepInterval The sleep interval in units of [ms] * @return The duty cycle in units of [percentage*100] */ command uint16_t sleepIntervalToDutyCycle(uint16_t sleepInterval); } tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205.h000066400000000000000000000137351207233610700176260ustar00rootroot00000000000000/* * Copyright (c) 2005, Ecole Polytechnique Federale de Lausanne (EPFL) * and Shockfish SA, Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * and Shockfish SA, nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * XE1205 constants and helper macros and functions. * */ /** * @author Henri Dubois-Ferriere * @author Remy Blank * */ #ifndef _XE1205CONST_H #define _XE1205CONST_H #include "AM.h" typedef nx_struct xe1205_header_t { nx_am_addr_t dest; nx_am_addr_t source; nx_am_id_t type; nx_am_group_t group; nx_uint8_t ack; } xe1205_header_t; typedef nx_struct xe1205_footer_t { #ifdef LOW_POWER_LISTENING nx_uint16_t rxInterval; #endif nxle_uint16_t crc; } xe1205_footer_t; typedef nx_struct xe1205_metadata_t { nx_uint8_t length; nx_uint8_t strength; } xe1205_metadata_t; /* * Register address generators. */ #define XE1205_WRITE(register_) (((register_) << 1) | 0x01) #define XE1205_READ(register_) (((register_) << 1) | 0x41) /** * Register addresses. */ enum xe1205_register_enums { MCParam_0 = 0, MCParam_1 = 1, MCParam_2 = 2, MCParam_3 = 3, MCParam_4 = 4, IrqParam_5 = 5, IrqParam_6 = 6, TXParam_7 = 7, RXParam_8 = 8, RXParam_9 = 9, RXParam_10 = 10, RXParam_11 = 11, RXParam_12 = 12, Pattern_13 = 13, Pattern_14 = 14, Pattern_15 = 15, Pattern_16 = 16, OscParam_17 = 17, OscParam_18 = 18, TParam_19 = 19, TParam_21 = 21, TParam_22 = 22, XE1205_RegCount }; #ifndef TOSH_DATA_LENGTH #define TOSH_DATA_LENGTH 28 #endif enum { xe1205_mtu=TOSH_DATA_LENGTH + sizeof(xe1205_header_t) + sizeof(xe1205_footer_t) }; enum { data_pattern = 0x893456, ack_pattern = 0x123fed }; typedef enum { rx_irq0_none=0, rx_irq0_write_byte=1, rx_irq0_nFifoEmpty=2, rx_irq0_Pattern=3, } xe1205_rx_irq0_src_t; typedef enum xe1205_rx_irq1_src_t { rx_irq1_none=0, rx_irq1_FifoFull=1, rx_irq1_Rssi=2 } xe1205_rx_irq1_src_t; // In TX, IRQ0 is always mapped to nFifoEmpty typedef enum { tx_irq1_FifoFull=0, tx_irq1_TxStopped=1 } xe1205_tx_irq1_src_t; typedef enum { xe1205_channelpreset_868mhz=0, xe1205_channelpreset_869mhz=1, xe1205_channelpreset_870mhz=2, xe1205_channelpreset_433mhz=3, xe1205_channelpreset_434mhz=4, xe1205_channelpreset_435mhz=5, } xe1205_channelpreset_t; typedef enum { xe1205_txpower_0dbm=0, xe1205_txpower_5dbm=1, xe1205_txpower_10dbm=2, xe1205_txpower_15dbm=3 } xe1205_txpower_t; typedef enum { xe1205_bitrate_152340=152340U, xe1205_bitrate_76170=76170U, xe1205_bitrate_50780=50780U, xe1205_bitrate_38085=38085U, // xe1205_bitrate_30468=30468, // xe1205_bitrate_19042=19042, // xe1205_bitrate_12695=12695, // xe1205_bitrate_8017=8017, // xe1205_bitrate_4760=4760 } xe1205_bitrate_t; /** * Receiver modes. */ enum { XE1205_LnaModeA = 0, XE1205_LnaModeB = 1 }; /** * Radio Transition times. * See Table 4 of the XE1205 data sheet. */ enum xe1205_transition_time_enums { XE1205_Standby_to_RX_Time = 700, // RX wakeup time (us), with quartz oscillator enabled XE1205_TX_to_RX_Time = 500, // RX wakeup time (us), with freq. synthesizer enabled XE1205_Standby_to_TX_Time = 250, // TX wakeup time (us), with quartz oscillator enabled XE1205_RX_to_TX_Time = 100, // TX wakeup time (us), with freq. synthesizer enabled XE1205_FS_Wakeup_Time = 200, // Frequency synthesizer wakeup time XE1205_Sleep_to_Standby_Time = 1000 // Quartz oscillator wakeup time ( xxx 7ms for 3rd overtone????) }; // xxx merge into above enum but check enum { XE1205_Sleep_to_RX_Time = XE1205_Sleep_to_Standby_Time + XE1205_Standby_to_RX_Time, XE1205_Sleep_to_TX_Time = XE1205_Sleep_to_Standby_Time + XE1205_Standby_to_TX_Time }; enum { RSSI_BELOW_110 = 0, RSSI_110_TO_105 = 1, RSSI_105_TO_100 = 2, RSSI_100_TO_95 = 3, RSSI_95_TO_90 = 4, RSSI_90_TO_85 = 5, RSSI_ABOVE_85 = 6 }; uint8_t const rssiTab[] = { RSSI_BELOW_110, // 0b0000 RSSI_110_TO_105, // 0b0001 RSSI_105_TO_100, // 0b0010 RSSI_100_TO_95, // 0b0011 RSSI_95_TO_90, // 0b0100 * RSSI_95_TO_90, // 0b0101 * RSSI_95_TO_90, // 0b0110 * RSSI_95_TO_90, // 0b0111 RSSI_90_TO_85, // 0b1000 * RSSI_90_TO_85, // 0b1001 * RSSI_90_TO_85, // 0b1010 * RSSI_90_TO_85, // 0b1011 RSSI_ABOVE_85, // 0b1100 * RSSI_ABOVE_85, // 0b1101 * RSSI_ABOVE_85, // 0b1110 * RSSI_ABOVE_85 // 0b1111 // (*) : 'inconsistent' pairs }; #endif /* _XE1205CONST_H */ tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205ActiveMessageC.nc000066400000000000000000000060341207233610700225350ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * @author Henri Dubois-Ferriere * */ configuration XE1205ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface AMPacket; interface Packet; interface PacketAcknowledgements; #ifdef LOW_POWER_LISTENING interface LowPowerListening; #endif } } implementation { components XE1205SendReceiveC; Packet = XE1205SendReceiveC; PacketAcknowledgements = XE1205SendReceiveC; components XE1205ActiveMessageP; #ifdef LOW_POWER_LISTENING components XE1205LowPowerListeningC as Lpl; LowPowerListening = Lpl; XE1205ActiveMessageP.SubSend -> Lpl.Send; XE1205ActiveMessageP.SubReceive -> Lpl.Receive; SplitControl = Lpl; #else XE1205ActiveMessageP.Packet -> XE1205SendReceiveC; XE1205ActiveMessageP.SubSend -> XE1205SendReceiveC.Send; XE1205ActiveMessageP.SubReceive -> XE1205SendReceiveC.Receive; SplitControl = XE1205SendReceiveC; #endif AMPacket = XE1205ActiveMessageP; AMSend = XE1205ActiveMessageP; Receive = XE1205ActiveMessageP.Receive; Snoop = XE1205ActiveMessageP.Snoop; components ActiveMessageAddressC; XE1205ActiveMessageP.amAddress -> ActiveMessageAddressC; components XE1205IrqConfC, XE1205PatternConfC, XE1205PhyRssiConfC; } tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205ActiveMessageP.nc000066400000000000000000000122241207233610700225500ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * @author Henri Dubois-Ferriere * */ module XE1205ActiveMessageP { uses interface Packet; uses interface Send as SubSend; uses interface Receive as SubReceive; uses command am_addr_t amAddress(); provides interface AMSend[am_id_t id]; provides interface AMPacket; provides interface Receive[am_id_t id]; provides interface Receive as Snoop[am_id_t id]; } implementation { // xxx - this is replicated in ActiveMessageP. // put in XE1205.h? xe1205_header_t* getHeader( message_t* msg ) { return (xe1205_header_t*)( msg->data - sizeof(xe1205_header_t) ); } command am_addr_t AMPacket.address() { return call amAddress(); } command am_addr_t AMPacket.destination(message_t* msg) { xe1205_header_t* header = getHeader(msg); return header->dest; } command void AMPacket.setDestination(message_t* msg, am_addr_t addr) { xe1205_header_t* header = getHeader(msg); header->dest = addr; } command am_addr_t AMPacket.source(message_t* msg) { xe1205_header_t* header = getHeader(msg); return header->source; } command void AMPacket.setSource(message_t* msg, am_addr_t addr) { xe1205_header_t* header = getHeader(msg); header->source = addr; } command bool AMPacket.isForMe(message_t* msg) { return (call AMPacket.destination(msg) == call AMPacket.address() || call AMPacket.destination(msg) == AM_BROADCAST_ADDR); } command am_id_t AMPacket.type(message_t* msg) { xe1205_header_t* header = getHeader(msg); return header->type; } command void AMPacket.setType(message_t* msg, am_id_t type) { xe1205_header_t* header = getHeader(msg); header->type = type; } command void AMPacket.setGroup(message_t* msg, am_group_t group) { xe1205_header_t* header = getHeader(msg); header->group = group; } command am_group_t AMPacket.group(message_t* msg) { xe1205_header_t* header = getHeader(msg); return header->group; } command am_group_t AMPacket.localGroup() { return TOS_AM_GROUP; } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len) { xe1205_header_t* header = getHeader(msg); header->type = id; header->dest = addr; header->source = call AMPacket.address(); header->group = TOS_AM_GROUP; return call SubSend.send(msg, len); } command error_t AMSend.cancel[am_id_t id](message_t* msg) { return call SubSend.cancel(msg); } event void SubSend.sendDone(message_t* msg, error_t result) { signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { return; } event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) __attribute__ ((noinline)) { if (call AMPacket.isForMe(msg)) { return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len); } else { return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len); } } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } } tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205CsmaP.nc000066400000000000000000000164741207233610700207260ustar00rootroot00000000000000/* Copyright (c) 2007 Shockfish SA * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Maxime Muller * */ #include "XE1205.h" #include "XE1205LowPowerListening.h" #define MAX(X,Y) X>Y ? X:Y module XE1205CsmaP { provides { interface Init @atleastonce(); interface SplitControl @atleastonce(); interface Send; interface Receive; interface CsmaControl; interface LPLControl; interface CsmaBackoff[am_id_t amId]; } uses { interface SplitControl as SubControl; interface Receive as SubReceive; interface Send as SubSend; interface XE1205PhyRssi as Rssi; interface XE1205PhyConf as RadioConf; interface Timer as BackoffTimer; interface Random; } } implementation { enum { RADIO_DISABLED, RADIO_IDLE, RADIO_RX, RADIO_TX, }; uint8_t rState; uint8_t rxRssi; uint8_t clrRssi; norace uint8_t rssiSampleCnt; bool enableCCA; message_t * txMsg; uint8_t txLen; enum { RSSI_RX = 0, RSSI_CLR = 1, }; uint16_t MA_LENGTH = 8; uint8_t MAX_RSSI_SAMPLE = 4; norace float RSSI_RX_MA; norace float RSSI_CLR_MA; /* * function prototypes */ task void readRssi(); task void send(); command error_t Init.init() { rssiSampleCnt=0; rState = RADIO_DISABLED; RSSI_RX_MA = RSSI_ABOVE_85; RSSI_CLR_MA = RSSI_90_TO_85; return SUCCESS; } command error_t SplitControl.start() { return call SubControl.start(); } event void SubControl.startDone(error_t err) { if (err!=SUCCESS) { atomic { if (rState == RADIO_TX) signal Send.sendDone(txMsg,FAIL); else signal SplitControl.startDone(err); } } else { atomic { if (rState == RADIO_TX) { if(enableCCA==TRUE) { if(SUCCESS != post readRssi()) { signal Send.sendDone(txMsg,FAIL); } return; } else { post send(); return; if (SUCCESS != post send()) { signal Send.sendDone(txMsg,FAIL); return; } } } signal SplitControl.startDone(err); } } } command error_t SplitControl.stop() { return call SubControl.stop(); } event void SubControl.stopDone(error_t err) { atomic { if (rState == RADIO_RX) // LPL: shutdown if no activity if (err==SUCCESS) rState = RADIO_IDLE; } signal SplitControl.stopDone(err); } void updateRssiMA(uint8_t maType, uint8_t value) { switch (maType) { case RSSI_CLR: if((float)value < MAX(RSSI_RX_MA,RSSI_CLR_MA)) RSSI_CLR_MA = (RSSI_CLR_MA*(MA_LENGTH - 1)+ value )/(MA_LENGTH); break; case RSSI_RX: RSSI_RX_MA = (RSSI_RX_MA*(MA_LENGTH - 1)+ value )/(MA_LENGTH); break; default: break; } } event message_t *SubReceive.receive(message_t* msg, void* payload, uint8_t len){ uint8_t strgth = ((xe1205_metadata_t*)((uint8_t*)msg->footer + sizeof(xe1205_footer_t)))->strength; updateRssiMA(RSSI_RX, strgth); return signal Receive.receive(msg, payload, len); } command error_t Send.send(message_t* msg, uint8_t len) { error_t err; atomic { switch (rState) { case RADIO_DISABLED: return EOFF; default: rState = RADIO_TX; atomic txMsg = msg; atomic txLen = len; err = call SubControl.start(); return err; } } } task void send() { if (SUCCESS != call SubSend.send(txMsg, txLen)) { atomic rState = RADIO_IDLE; signal Send.sendDone(txMsg, FAIL); } } event void SubSend.sendDone(message_t *msg, error_t err) { atomic rState = RADIO_IDLE; signal Send.sendDone(msg, err); } command void* Send.getPayload(message_t* m,uint8_t len) { return m->data; } command uint8_t Send.maxPayloadLength() { return TOSH_DATA_LENGTH; } command error_t Send.cancel( message_t* p_msg ) { return FAIL; } task void readRssi() { if(SUCCESS!=call Rssi.getRssi()) { atomic { if (rState == RADIO_TX) { signal Send.sendDone(txMsg, FAIL); } else { signal SplitControl.startDone(FAIL); } } } } event void BackoffTimer.fired() { rssiSampleCnt = 0; if(SUCCESS != post send()) { atomic rState = RADIO_IDLE; signal Send.sendDone(txMsg,FAIL); } } async event void Rssi.rssiDone(uint8_t val) { updateRssiMA(RSSI_CLR, val); atomic { if (rState == RADIO_DISABLED) { rState = RADIO_IDLE; signal SplitControl.startDone(SUCCESS); return; } } // RX for LPL only atomic { if (rState == RADIO_RX) { if (RSSI_CLR_MA >= (float)val) { // go back to sleep call SubControl.stop(); return; } else // tell lpl layer we have some activity signal SplitControl.startDone(SUCCESS); } // TX if (rState == RADIO_TX) { rssiSampleCnt++; if ( RSSI_RX_MA >= (float)val || RSSI_CLR_MA >= (float)val || !enableCCA) { // it's a go if (enableCCA) { call BackoffTimer.startOneShot(signal CsmaBackoff.initial[((xe1205_header_t*)(txMsg->data - sizeof(xe1205_header_t)))->type](txMsg)); } else post send(); return; } else if (enableCCA && rssiSampleCnt < MAX_RSSI_SAMPLE) { post readRssi(); } else { call BackoffTimer.startOneShot(signal CsmaBackoff.congestion[((xe1205_header_t*)(txMsg->data - sizeof(xe1205_header_t)))->type](txMsg)); } } } } async command void LPLControl.setMode(uint8_t mode) { switch (mode) { case RX: atomic { if(rState!=RADIO_TX) rState = RADIO_RX; } break; case IDLE: atomic rState = RADIO_IDLE; default: return; } } async command void CsmaControl.enableCca() { atomic enableCCA = TRUE; } async command void CsmaControl.disableCca() { atomic enableCCA = FALSE; } default async event uint16_t CsmaBackoff.initial[am_id_t amId](message_t *m) { return (call Random.rand16() & 0x07) + 1; } default async event uint16_t CsmaBackoff.congestion[am_id_t amId](message_t *m) { return (call Random.rand16() & 0xF) + 1; } } tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205CsmaRadioC.nc000066400000000000000000000051661207233610700216640ustar00rootroot00000000000000/* Copyright (c) 2007 Shockfish SA * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Maxime Muller * */ #include "message.h" #include "XE1205.h" configuration XE1205CsmaRadioC { provides { interface SplitControl; interface Send; interface Receive; interface Packet; interface CsmaControl; interface CsmaBackoff[am_id_t amId]; interface PacketAcknowledgements; interface LPLControl; } } implementation { components XE1205CsmaP as CsmaP; components XE1205SendReceiveP as SendReceive; components XE1205PhyP; components new TimerMilliC() as BackoffTimerC; components MainC, RandomC,ActiveMessageC, ActiveMessageAddressC; MainC.SoftwareInit -> CsmaP; Send = CsmaP; Receive = CsmaP; Packet = SendReceive; PacketAcknowledgements = SendReceive; SplitControl = CsmaP; CsmaControl = CsmaP; CsmaBackoff = CsmaP; LPLControl = CsmaP; CsmaP.SubControl -> SendReceive.SplitControl; CsmaP.SubReceive -> SendReceive.Receive; CsmaP.SubSend -> SendReceive.Send; CsmaP.Rssi -> XE1205PhyP.XE1205PhyRssi; CsmaP.BackoffTimer -> BackoffTimerC; CsmaP.Random -> RandomC; } tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205Fifo.nc000066400000000000000000000060771207233610700206040ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * Interface for access to the XE1205 radio Fifo. * * @author Henri Dubois-Ferriere */ interface XE1205Fifo { /** * Write a sequence of data bytes to the output FIFO. * Care must be taken not to overflow the FIFO (16 bytes). * If call returns SUCCESS, writeDone will be signalled upon completion. * * @param data a pointer to the send buffer. * @param length number of bytes written. * @return SUCCESS if the request was accepted for transfer */ async command error_t write(uint8_t* data, uint8_t length); /** * Signals the completion of the previous write operation. * * @param error SUCCESS if the operation completed successfully, FAIL * otherwise */ async event void writeDone(error_t error); /** * Read a sequence of data bytes from the input FIFO. * The FIFO level is not checked, and care must be taken not to underflow * the FIFO (16 bytes). * * @param data a pointer to the receive buffer. * @param length number of bytes to read. * @return SUCCESS if the request was accepted for transfer */ async command error_t read(uint8_t* data, uint8_t length); /** * Signals the completion of the previous write operation. * * @param error SUCCESS if the operation completed successfully, FAIL * otherwise */ async event void readDone(error_t error ); } tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205LowPowerListening.h000066400000000000000000000041151207233610700231720ustar00rootroot00000000000000/* Copyright (c) 2007 Shockfish SA * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Maxime Muller * */ #ifndef XE1205LOWPOWERLISTENING_H #define XE1205LOWPOWERLISTENING_H /** * Amount of time, in milliseconds, to keep the radio on after * a successful receive addressed to this node */ #ifndef DELAY_AFTER_RECEIVE #define DELAY_AFTER_RECEIVE 20 #endif /** * Value used to indicate the message being sent should be transmitted * one time */ #ifndef ONE_MESSAGE #define ONE_MESSAGE 0 #endif #ifndef DEFAULT_DUTY_PERIOD #define DEFAULT_DUTY_PERIOD 80 #endif enum { IDLE = 0, RX = 1, }; #endif tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205LowPowerListeningC.nc000066400000000000000000000031011207233610700234400ustar00rootroot00000000000000 configuration XE1205LowPowerListeningC { provides { interface SplitControl; interface Send; interface Receive; interface LowPowerListening; // interface CsmaBackoff[am_id_t amId]; } } implementation { components MainC, XE1205ActiveMessageC, XE1205LowPowerListeningP, /*XE1205CsmaP as*/ XE1205CsmaRadioC, RandomC; components new TimerMilliC() as SendTimeoutC; components new TimerMilliC() as OnTimerC; components new TimerMilliC() as OffTimerC; Send = XE1205LowPowerListeningP; Receive = XE1205LowPowerListeningP; SplitControl = XE1205LowPowerListeningP; LowPowerListening = XE1205LowPowerListeningP; // CsmaBackoff = XE1205LowPowerListeningP; MainC.SoftwareInit -> XE1205LowPowerListeningP; //XE1205LowPowerListeningP.LowPowerListening -> XE1205CsmaRadioC; XE1205LowPowerListeningP.SubControl -> XE1205CsmaRadioC; XE1205LowPowerListeningP.CsmaControl -> XE1205CsmaRadioC; // XE1205LowPowerListeningP.SubBackoff -> XE1205CsmaRadioC; XE1205LowPowerListeningP.SubSend -> XE1205CsmaRadioC.Send; XE1205LowPowerListeningP.SubReceive -> XE1205CsmaRadioC.Receive; XE1205LowPowerListeningP.AMPacket -> XE1205ActiveMessageC; XE1205LowPowerListeningP.PacketAcknowledgements -> XE1205ActiveMessageC;// XE1205CsmaRadioC; XE1205LowPowerListeningP.SendTimeout -> SendTimeoutC; XE1205LowPowerListeningP.OnTimer -> OnTimerC; XE1205LowPowerListeningP.OffTimer -> OffTimerC; XE1205LowPowerListeningP.Random -> RandomC; XE1205LowPowerListeningP.LPLControl -> XE1205CsmaRadioC.LPLControl; } tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205LowPowerListeningP.nc000066400000000000000000000226001207233610700234620ustar00rootroot00000000000000/* Copyright (c) 2007 Shockfish SA * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Maxime Muller * */ #include "XE1205LowPowerListening.h" module XE1205LowPowerListeningP { provides { interface Init; interface SplitControl; interface Send; interface Receive; interface LowPowerListening; } uses { interface LPLControl; interface SplitControl as SubControl; interface CsmaControl; interface Send as SubSend; interface Receive as SubReceive; interface AMPacket; interface PacketAcknowledgements; interface Timer as SendTimeout; interface Timer as OnTimer; interface Timer as OffTimer; interface Random; } } implementation { message_t * curTxMsg; uint8_t curTxMsgLength; uint8_t seqNo; uint8_t lastSeqNo; uint8_t txSeqNo; uint16_t sleepInterval; uint16_t sleepTime; bool fromSplitStart = FALSE; bool fromSplitStop = FALSE; typedef enum { RADIO_INIT, RADIO_ON, RADIO_OFF, RADIO_TX, } lpl_state_t; lpl_state_t rState; void sendDone(error_t err); xe1205_header_t* getHeader( message_t* msg ) { return (xe1205_header_t*)( msg->data - sizeof(xe1205_header_t) ); } xe1205_footer_t* getFooter(message_t* msg) { return (xe1205_footer_t*)(msg->footer); } command error_t Init.init() { sleepTime = DEFAULT_DUTY_PERIOD; atomic rState = RADIO_INIT; txSeqNo = call Random.rand16()&0xFE; return SUCCESS; } command error_t SplitControl.start() { // start dutyCycling if (rState == RADIO_OFF || rState == RADIO_INIT) { if (SUCCESS==call SubControl.start()) { fromSplitStart = TRUE; return SUCCESS; } } return FAIL; } event void SubControl.startDone(error_t err) { if(err==SUCCESS) { if(sleepTime > 0) {// keep radio on for a while call OffTimer.stop(); call OnTimer.startOneShot(DELAY_AFTER_RECEIVE); } if (sleepTime == 0) // radio always on call LPLControl.setMode(IDLE); atomic rState = RADIO_ON; if (fromSplitStart) { fromSplitStart=FALSE; signal SplitControl.startDone(err); } } else { call SubControl.start(); } } command error_t SplitControl.stop() { fromSplitStop = TRUE; return call SubControl.stop(); } event void SubControl.stopDone(error_t err) { if(!err) { if (rState == RADIO_ON) { if (call OnTimer.isRunning()) { call OnTimer.stop(); } } atomic rState = RADIO_OFF; if (fromSplitStop==FALSE) { call OffTimer.startOneShot(sleepTime); } else { fromSplitStop = FALSE; signal SplitControl.startDone(err); } } else call OffTimer.startOneShot(sleepTime); } event void OffTimer.fired() { if (SUCCESS==call SubControl.start()) { if (sleepTime > 0) call LPLControl.setMode(RX); if (sleepTime == 0) // radio always on call LPLControl.setMode(IDLE); } else call OffTimer.startOneShot(sleepTime); } event void OnTimer.fired() { // switch off the radio if(sleepTime > 0) if (SUCCESS != call SubControl.stop()) { // retry call OnTimer.startOneShot(DELAY_AFTER_RECEIVE); } } task void sendPkt() { if(SUCCESS != call SubSend.send(curTxMsg,curTxMsgLength)) { call LPLControl.setMode(IDLE); call OffTimer.startOneShot(sleepTime); sendDone(FAIL); } } /* * send commands */ command error_t Send.send(message_t *msg, uint8_t len) { if (rState == RADIO_INIT) return EOFF; else { call OffTimer.stop(); call OnTimer.stop(); atomic rState = RADIO_TX; curTxMsg = msg; curTxMsgLength = len; if(call LowPowerListening.getRxSleepInterval(curTxMsg) > ONE_MESSAGE) { txSeqNo+=0x02; if (AM_BROADCAST_ADDR != call AMPacket.destination(curTxMsg)) { getHeader(curTxMsg)->ack = txSeqNo|0x01; } else getHeader(curTxMsg)->ack = txSeqNo&0xFE; call CsmaControl.enableCca(); if(SUCCESS==post sendPkt()) { call SendTimeout.startOneShot(call LowPowerListening.getRxSleepInterval(curTxMsg) * 2); return SUCCESS; } else { call SendTimeout.stop(); call LPLControl.setMode(IDLE); call OffTimer.startOneShot(sleepTime); return FAIL; } } else { call LPLControl.setMode(IDLE); call OffTimer.startOneShot(sleepTime); return FAIL; } } } event void SendTimeout.fired() { atomic { if (rState == RADIO_TX) // let sendDone occur rState = RADIO_ON; } call OffTimer.startOneShot(DELAY_AFTER_RECEIVE); } void sendDone(error_t err) { atomic { if (rState == RADIO_TX) rState = RADIO_ON; } if(err!=FAIL) call SubControl.stop(); signal Send.sendDone(curTxMsg, err); } event void SubSend.sendDone(message_t *msg, error_t err) { if(rState == RADIO_TX && call SendTimeout.isRunning()) { if ( AM_BROADCAST_ADDR != call AMPacket.destination(msg) && err==SUCCESS) { call SendTimeout.stop(); sendDone(err); } else { // ack timeout or bcast msg call CsmaControl.disableCca(); if(SUCCESS!=post sendPkt()) { sendDone(FAIL); } } } else { sendDone(err); } } command error_t Send.cancel(message_t *msg) { if(curTxMsg == msg) { atomic rState = RADIO_ON; return SUCCESS; } return FAIL; } command uint8_t Send.maxPayloadLength() { return call SubSend.maxPayloadLength(); } command void *Send.getPayload(message_t* msg, uint8_t len) { return call SubSend.getPayload(msg,len); } /* * Receive commands */ event message_t *SubReceive.receive(message_t *msg,void *payload, uint8_t len) { if ((getHeader(msg)->ack & 0xFE ) == lastSeqNo && call AMPacket.destination(msg) == AM_BROADCAST_ADDR) { return msg; } else { lastSeqNo = getHeader(msg)->ack & 0xFE; if(!call SendTimeout.isRunning()) { // catched a packet between pktSend call OffTimer.startOneShot(DELAY_AFTER_RECEIVE); } return signal Receive.receive(msg,payload,len); } } uint16_t getActualDutyCycle(uint16_t dutyCycle) { if(dutyCycle > 10000) { return 10000; } else if(dutyCycle == 0) { return 1; } return dutyCycle; } command void LowPowerListening.setLocalSleepInterval(uint16_t sTime) { if(sleepTime == 0 && sTime >0) { call LPLControl.setMode(RX); call OnTimer.startOneShot(DELAY_AFTER_RECEIVE); } sleepTime = sTime; } command uint16_t LowPowerListening.getLocalSleepInterval() { return sleepTime; } command void LowPowerListening.setLocalDutyCycle(uint16_t d) { return call LowPowerListening.setLocalSleepInterval(call LowPowerListening.dutyCycleToSleepInterval(d)); } command uint16_t LowPowerListening.getLocalDutyCycle() { return call LowPowerListening.sleepIntervalToDutyCycle(sleepTime); } command void LowPowerListening.setRxSleepInterval(message_t *msg, uint16_t sleepIntervalMs) { xe1205_footer_t *footer = getFooter(msg); footer->rxInterval = sleepIntervalMs; } command uint16_t LowPowerListening.getRxSleepInterval(message_t *msg) { xe1205_footer_t *footer = getFooter(msg); if (footer->rxInterval >= 0) return sleepTime; else return -(footer->rxInterval + 1); } command void LowPowerListening.setRxDutyCycle(message_t *msg, uint16_t dCycle) { getFooter(msg)->rxInterval = call LowPowerListening.dutyCycleToSleepInterval(dCycle); } command uint16_t LowPowerListening.getRxDutyCycle(message_t *msg) { return call LowPowerListening.sleepIntervalToDutyCycle(getFooter(msg)->rxInterval); } command uint16_t LowPowerListening.dutyCycleToSleepInterval(uint16_t dCycle) { dCycle = getActualDutyCycle(dCycle); if(dCycle == 10000) { return 0; } return (DELAY_AFTER_RECEIVE * (10000 - dCycle)) / dCycle; } command uint16_t LowPowerListening.sleepIntervalToDutyCycle(uint16_t sInterval) { if(sInterval == 0) { return 10000; } return getActualDutyCycle((DELAY_AFTER_RECEIVE * 10000) / (sInterval + DELAY_AFTER_RECEIVE)); } } tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205PacketC.nc000066400000000000000000000040561207233610700212260ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * @author Henri Dubois-Ferriere * */ #include "message.h" configuration XE1205PacketC { provides interface AMPacket; provides interface Packet; } implementation { components XE1205PacketP; AMPacket = XE1205PacketP; Packet = XE1205PacketP; components ActiveMessageAddressC; XE1205PacketP.amAddress -> ActiveMessageAddressC; } tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205SendReceiveC.nc000066400000000000000000000047041207233610700222130ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * @author Henri Dubois-Ferriere * */ configuration XE1205SendReceiveC { provides interface Send; provides interface Packet; provides interface PacketAcknowledgements; provides interface AckSendReceive; provides interface SplitControl @atleastonce(); provides interface Receive; } implementation { components XE1205SendReceiveP; Send = XE1205SendReceiveP; Receive = XE1205SendReceiveP; Packet = XE1205SendReceiveP; PacketAcknowledgements = XE1205SendReceiveP; AckSendReceive = XE1205SendReceiveP; SplitControl = XE1205SendReceiveP; components XE1205PhyC; XE1205SendReceiveP.XE1205PhyRxTx -> XE1205PhyC; XE1205SendReceiveP.XE1205PhyRssi -> XE1205PhyC; XE1205SendReceiveP.PhySplitControl -> XE1205PhyC; } tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205SendReceiveP.nc000066400000000000000000000345531207233610700222350ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * @author Henri Dubois-Ferriere * */ module XE1205SendReceiveP { provides interface Send; provides interface Packet; provides interface PacketAcknowledgements; provides interface Receive; provides interface AckSendReceive; provides interface SplitControl @atleastonce(); uses interface XE1205PhyRxTx; uses interface XE1205PhyRssi; uses interface SplitControl as PhySplitControl; } implementation { #include "crc.h" #include "xe1205debug.h" #define min(X, Y) ((X) < (Y) ? (X) : (Y)) enum { PKT_CODE = 0, ACK_CODE = 1 }; // Phy header definition. This is not seen by anything above us. typedef nx_struct xe1205_phy_header_t { nx_uint8_t whitening; nx_uint8_t length; } xe1205_phy_header_t; typedef struct ackMsg_t { uint16_t pl; } ackMsg_t; xe1205_phy_header_t txPhyHdr; norace xe1205_phy_header_t rxPhyHdr; // we don't accept an incoming packet until previous one has been copied into local buf norace message_t ackMsg; norace message_t *ackMsgPtr = &ackMsg; norace message_t *txMsgSendDonePtr=NULL; norace message_t *txMsgPtr=NULL; // message under transmission (non-null until after sendDone). norace uint8_t _len; norace char txBuf[16]; // buffer used to pass outgoing bytes to Phy norace uint8_t *rxBufPtr=NULL; // pointer to raw frame received from Phy message_t rxMsg; // for rx path buffer swapping with upper modules message_t *rxMsgPtr=&rxMsg; norace uint8_t txIndex, txLen; // State for packet transmissions norace uint16_t txRunningCRC; // Crc for outgoing pkts is computed incrementally norace uint8_t txWhiteByte; norace bool sendingAck=FALSE; uint16_t ackPayload; bool warmUp=FALSE; uint8_t const pktPreamble[] = { 0x55, 0x55, 0x55, (data_pattern >> 16) & 0xff, (data_pattern >> 8) & 0xff, data_pattern & 0xff }; uint8_t const ackPreamble[] = { 0x55, 0x55, 0x55, (ack_pattern >> 16) & 0xff, (ack_pattern >> 8) & 0xff, ack_pattern & 0xff }; task void signalPacketReceived(); error_t sendRadioOn(uint8_t preamble); xe1205_header_t* getHeader( message_t* msg ) { return (xe1205_header_t*)( msg->data - sizeof(xe1205_header_t) ); } xe1205_footer_t* getFooter(message_t* msg) { return (xe1205_footer_t*)(msg->footer); } xe1205_metadata_t* getMetadata(message_t* msg) { return (xe1205_metadata_t*)((uint8_t*)msg->footer + sizeof(xe1205_footer_t)); } command void AckSendReceive.setAckPayload(uint16_t _pl) { ackPayload = _pl; } command uint16_t AckSendReceive.getAckPayload() { return ackPayload; } command uint8_t Send.maxPayloadLength() { return call Packet.maxPayloadLength(); } command void* Send.getPayload(message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } task void sendDoneTask() { txMsgSendDonePtr = txMsgPtr; txMsgPtr=NULL; signal Send.sendDone(txMsgSendDonePtr, SUCCESS); } task void sendDoneFailTask() { txMsgSendDonePtr = txMsgPtr; txMsgPtr=NULL; signal Send.sendDone(txMsgSendDonePtr, FAIL); } task void sendDoneNoAckTask() { txMsgSendDonePtr = txMsgPtr; txMsgPtr=NULL; signal Send.sendDone(txMsgSendDonePtr, ENOACK); } command error_t SplitControl.start() { error_t err; err = call PhySplitControl.start(); return err; } command error_t SplitControl.stop() { error_t err; // One could also argue that this is split phase so should cope and do the right thing. // Or one could argue that whatever the phy is doing underneath just gets interrupted. if (call XE1205PhyRxTx.busy()) return EBUSY; err = call PhySplitControl.stop(); txMsgPtr=NULL; rxBufPtr = NULL; return err; } event void PhySplitControl.startDone(error_t error) { if (txMsgPtr!=NULL) { sendRadioOn(PKT_CODE); } else { if (warmUp==TRUE) { post sendDoneFailTask(); } } warmUp=FALSE; signal SplitControl.startDone(error); } event void PhySplitControl.stopDone(error_t error) { signal SplitControl.stopDone(error); } task void sendAck() { atomic { ((xe1205_metadata_t*)((uint8_t*)ackMsgPtr->footer + sizeof(xe1205_footer_t)))->length = sizeof(ackMsg_t); ((xe1205_header_t*)(&ackMsg.data - sizeof(xe1205_header_t)))->group = \ (getHeader((message_t*)rxMsgPtr))->group; ((xe1205_header_t*)(ackMsgPtr->data - sizeof(xe1205_header_t)))->type = \ ((xe1205_header_t*)(rxMsgPtr->data - sizeof(xe1205_header_t)))->type; ((xe1205_header_t*)(ackMsgPtr->data - sizeof(xe1205_header_t)))->dest = \ ((xe1205_header_t*)(rxMsgPtr->data - sizeof(xe1205_header_t)))->source; ((xe1205_header_t*)(ackMsgPtr->data - sizeof(xe1205_header_t)))->source = TOS_NODE_ID; ((ackMsg_t*)(ackMsgPtr->data))->pl = ackPayload; txMsgPtr = ackMsgPtr; } _len = sizeof(ackMsg_t); sendRadioOn(ACK_CODE); } command error_t Send.cancel(message_t* msg) { /* Cancel is unsupported for now. */ return FAIL; } void checkCrcAndUnwhiten(uint8_t* msg, uint8_t white, uint8_t len) { uint16_t crc = 0; uint8_t i, b; uint8_t* uwPtr ; atomic uwPtr= (uint8_t*) getHeader(rxMsgPtr); for(i = 0; i < sizeof(xe1205_header_t) + len + offsetof(xe1205_footer_t,crc) ; i++) { b = msg[i] ^ white; uwPtr[i] = b; crc = crcByte(crc, b); } atomic { getFooter(rxMsgPtr)->crc = (crc == (msg[i] | (msg[i+1] << 8))); } } inline void updateCRCAndWhiten(char* src, char* dst, uint8_t len) { uint8_t i; for(i=0; i < len; i++) { txRunningCRC = crcByte(txRunningCRC, src[i]); dst[i] = src[i] ^ txWhiteByte; } } error_t sendRadioOn(uint8_t preamble) { error_t err; txWhiteByte++; txPhyHdr.whitening = txWhiteByte; txPhyHdr.length = _len; txRunningCRC=0; getMetadata(txMsgPtr)->length = _len; if ((((xe1205_header_t*)( (uint8_t*)txMsgPtr->data - sizeof(xe1205_header_t)))->ack & 0x01)==0x01) { call XE1205PhyRxTx.enableAck(TRUE); } txIndex = min(sizeof(xe1205_header_t) + _len + sizeof(xe1205_footer_t), sizeof(txBuf) - sizeof(pktPreamble) - sizeof(xe1205_phy_header_t)); txLen = _len + sizeof(xe1205_header_t) + sizeof(xe1205_footer_t); if (txIndex == txLen - 1) txIndex--; // don't send a single last byte switch (preamble) { case PKT_CODE: memcpy(txBuf, pktPreamble, sizeof(pktPreamble)); memcpy(txBuf + sizeof(pktPreamble), &txPhyHdr, sizeof(txPhyHdr)); break; case ACK_CODE: sendingAck=TRUE; memcpy(txBuf, ackPreamble, sizeof(ackPreamble)); memcpy(txBuf + sizeof(pktPreamble), &txPhyHdr, sizeof(txPhyHdr)); break; } if (txIndex == txLen) { // slap on CRC if we're already at end of packet updateCRCAndWhiten((char*) getHeader(txMsgPtr), txBuf + sizeof(pktPreamble) + sizeof(xe1205_phy_header_t), sizeof(xe1205_header_t) + _len); txBuf[sizeof(pktPreamble) + sizeof(xe1205_phy_header_t) + txLen - 2] = txRunningCRC & 0xff; txBuf[sizeof(pktPreamble) + sizeof(xe1205_phy_header_t) + txLen - 1] = txRunningCRC >> 8; } else { updateCRCAndWhiten((char*) getHeader(txMsgPtr), txBuf + sizeof(pktPreamble) + sizeof(xe1205_phy_header_t), txIndex); } // note that the continue send can come in before this instruction returns . err = call XE1205PhyRxTx.sendFrame(txBuf, txIndex + sizeof(pktPreamble) + sizeof(xe1205_phy_header_t)); if (err != SUCCESS) { if (preamble==PKT_CODE) post sendDoneFailTask(); txMsgPtr = NULL; } return err; } command error_t Send.send(message_t* msg, uint8_t len) { atomic { if (txMsgPtr){ return EBUSY;} if (msg==NULL) { return FAIL;} if (call XE1205PhyRxTx.busy()==TRUE){ return EBUSY;} if (call XE1205PhyRxTx.off()) { txMsgPtr = msg; _len = len; if(call PhySplitControl.start()==SUCCESS) { warmUp=TRUE; return SUCCESS; } else {txMsgPtr=NULL;return EOFF;} } txMsgPtr = msg; _len = len; } return sendRadioOn(PKT_CODE); } async event char* XE1205PhyRxTx.continueSend(uint8_t* len) __attribute__ ((noinline)) { uint8_t curIndex = txIndex; uint8_t l = min(txLen - txIndex, sizeof(txBuf)); if (txIndex + l == txLen - 1) l--; // don't send a single last byte *len = l; if (!l) return NULL; txIndex += l; // if we're at end of packet, slap on CRC if (txIndex == txLen) { updateCRCAndWhiten(&((char*) (getHeader(txMsgPtr)))[curIndex], txBuf, l - 2); txBuf[l - 2] = txRunningCRC & 0xff; txBuf[l - 1] = txRunningCRC >> 8; } else { updateCRCAndWhiten(((char*) getHeader(txMsgPtr)) + curIndex, txBuf, l); } return txBuf; } uint8_t sendDones = 0; async event void XE1205PhyRxTx.sendFrameDone(error_t err) __attribute__ ((noinline)) { sendDones++; if(sendingAck==FALSE) { switch (err) { case SUCCESS: if (post sendDoneTask() != SUCCESS) xe1205check(2, FAIL); break; case ENOACK: if(post sendDoneNoAckTask() !=SUCCESS) xe1205check(2, FAIL); break; default: if (post sendDoneFailTask() != SUCCESS) xe1205check(2, FAIL); } } else { txMsgPtr = NULL; sendingAck=FALSE; post signalPacketReceived(); } } command void Packet.clear(message_t* msg) { memset(getHeader(msg), 0, sizeof(xe1205_header_t)); memset(getFooter(msg), 0, sizeof(xe1205_footer_t)); memset(getMetadata(msg), 0, sizeof(xe1205_metadata_t)); } command uint8_t Packet.payloadLength(message_t* msg) { return getMetadata(msg)->length; } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { getMetadata(msg)->length = len; } command uint8_t Packet.maxPayloadLength() { return TOSH_DATA_LENGTH; } command void* Packet.getPayload(message_t* msg, uint8_t len) { if (len <= TOSH_DATA_LENGTH) { return (void*)msg->data; } else { return NULL; } } async command error_t PacketAcknowledgements.requestAck(message_t* msg) { (getHeader(msg))-> ack |= 0x01; return SUCCESS; } async command error_t PacketAcknowledgements.noAck(message_t* msg) { (getHeader(msg))-> ack &= 0xFE; return SUCCESS; } async command bool PacketAcknowledgements.wasAcked(message_t* msg) { return (getHeader(msg))-> ack & 0x01; } default event void Send.sendDone(message_t* msg, error_t error) { } async event uint8_t XE1205PhyRxTx.rxFrameBegin(char* data, uint8_t len) __attribute__ ((noinline)) { uint8_t datalen; memcpy(&rxPhyHdr, data, sizeof(xe1205_phy_header_t)); datalen = rxPhyHdr.length; if (datalen > TOSH_DATA_LENGTH || rxBufPtr) return len; return datalen + sizeof(xe1205_header_t) + sizeof(xe1205_footer_t) + sizeof(xe1205_phy_header_t); } task void signalPacketReceived() { atomic { getMetadata((message_t*) rxMsgPtr)->length = rxPhyHdr.length; rxBufPtr = NULL; rxMsgPtr = signal Receive.receive(rxMsgPtr, rxMsgPtr->data, getMetadata(rxMsgPtr)->length); } } uint32_t nrxmsgs; async event void XE1205PhyRxTx.rxFrameEnd(char* data, uint8_t len, error_t status) __attribute__ ((noinline)) { if (status != SUCCESS){ return;} if (rxBufPtr) return; // this could happen whenever rxFrameBegin was called with rxBufPtr still active rxBufPtr = (data + sizeof(xe1205_phy_header_t)); checkCrcAndUnwhiten(rxBufPtr, rxPhyHdr.whitening, rxPhyHdr.length); if (!getFooter(rxMsgPtr)->crc) { atomic rxBufPtr = NULL; return; } getMetadata((message_t*) rxMsgPtr)->strength = call XE1205PhyRssi.readRxRssi(); getMetadata((message_t*) rxMsgPtr)->length = rxPhyHdr.length; if ((getHeader((message_t*)rxMsgPtr))->dest == TOS_NODE_ID && (((getHeader((message_t*)rxMsgPtr))->ack)& 0x01)==1) { post sendAck(); } else { post signalPacketReceived(); } } async event void XE1205PhyRxTx.rxAckEnd(char* data, uint8_t len, error_t status) __attribute__ ((noinline)) { sendingAck=FALSE; if (status != SUCCESS) { post sendDoneNoAckTask(); return; } if (rxBufPtr) { post sendDoneNoAckTask(); return; // this could happen whenever rxFrameBegin was called with rxBufPtr still active } rxBufPtr = (data + sizeof(xe1205_phy_header_t)); checkCrcAndUnwhiten(rxBufPtr, rxPhyHdr.whitening, rxPhyHdr.length); if (!getFooter(rxMsgPtr)->crc) { post sendDoneNoAckTask(); atomic rxBufPtr = NULL; return; } getMetadata((message_t*) rxMsgPtr)->strength = call XE1205PhyRssi.readRxRssi(); getMetadata((message_t*) rxMsgPtr)->length = rxPhyHdr.length; if ((getHeader((message_t*)rxMsgPtr))->dest == TOS_NODE_ID) { post sendDoneTask(); } else { post sendDoneNoAckTask(); } atomic rxBufPtr = NULL; } async event void XE1205PhyRssi.rssiDone(uint8_t _rssi) { } } tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205SpiC.nc000066400000000000000000000100031207233610700205370ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of basic SPI primitives for the Semtech/Xemics XE1205 radio. * * @author Jonathan Hui * @author Henri Dubois-Ferriere * @version $Revision: 1.5 $ $Date: 2007-07-13 15:54:08 $ */ #include "XE1205.h" generic configuration XE1205SpiC() { provides interface Resource; // registers provides interface XE1205Register as MCParam0; provides interface XE1205Register as MCParam1; provides interface XE1205Register as MCParam2; provides interface XE1205Register as MCParam3; provides interface XE1205Register as MCParam4; provides interface XE1205Register as IrqParam5; provides interface XE1205Register as IrqParam6; provides interface XE1205Register as TXParam7; provides interface XE1205Register as RXParam8; provides interface XE1205Register as RXParam9; provides interface XE1205Register as RXParam10; provides interface XE1205Register as RXParam11; provides interface XE1205Register as RXParam12; provides interface XE1205Register as Pattern13; provides interface XE1205Register as Pattern14; provides interface XE1205Register as Pattern15; provides interface XE1205Register as Pattern16; provides interface XE1205Register as OscParam17; provides interface XE1205Register as OscParam18; provides interface XE1205Register as TParam19; provides interface XE1205Register as TParam21; provides interface XE1205Register as TParam22; // fifos provides interface XE1205Fifo; } implementation { enum { CLIENT_ID = unique( "XE1205Spi.Resource" ), }; components XE1205SpiP as Spi; Resource = Spi.Resource[ CLIENT_ID ]; // registers MCParam0 = Spi.Reg[ MCParam_0 ]; MCParam1 = Spi.Reg[ MCParam_1 ]; MCParam2 = Spi.Reg[ MCParam_2 ]; MCParam3 = Spi.Reg[ MCParam_3 ]; MCParam4 = Spi.Reg[ MCParam_4 ]; IrqParam5 = Spi.Reg[ IrqParam_5 ]; IrqParam6 = Spi.Reg[ IrqParam_6 ]; TXParam7 = Spi.Reg[ TXParam_7 ]; RXParam8 = Spi.Reg[ RXParam_8 ]; RXParam9 = Spi.Reg[ RXParam_9 ]; RXParam10 = Spi.Reg[ RXParam_10 ]; RXParam11 = Spi.Reg[ RXParam_11 ]; RXParam12 = Spi.Reg[ RXParam_12 ]; Pattern13 = Spi.Reg[ Pattern_13 ]; Pattern14 = Spi.Reg[ Pattern_14 ]; Pattern15 = Spi.Reg[ Pattern_15 ]; Pattern16 = Spi.Reg[ Pattern_16 ]; OscParam17 = Spi.Reg[ OscParam_17 ]; OscParam18 = Spi.Reg[ OscParam_18 ]; TParam19 = Spi.Reg[ TParam_19 ]; TParam21 = Spi.Reg[ TParam_21 ]; TParam22 = Spi.Reg[ TParam_22 ]; XE1205Fifo = Spi.Fifo; } tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205SpiImplP.nc000066400000000000000000000166701207233610700214160ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * @author Jonathan Hui * @author Henri Dubois-Ferriere * @version $Revision: 1.5 $ $Date: 2007-07-13 15:54:08 $ */ module XE1205SpiImplP { provides interface XE1205Fifo as Fifo @atmostonce(); provides interface XE1205Register as Reg[uint8_t id]; provides interface Init @atleastonce(); provides interface Resource[ uint8_t id ]; uses interface Resource as SpiResource; uses interface GeneralIO as NssDataPin; uses interface GeneralIO as NssConfigPin; uses interface SpiByte; uses interface SpiPacket; } implementation { #include "xe1205debug.h" enum { RESOURCE_COUNT = uniqueCount( "XE1205Spi.Resource" ), NO_HOLDER = 0xff, }; bool m_resource_busy = FALSE; uint8_t m_requests = 0; uint8_t m_holder = NO_HOLDER; command error_t Init.init() { call NssDataPin.makeOutput(); call NssConfigPin.makeOutput(); call NssDataPin.set(); call NssConfigPin.set(); return SUCCESS; } async command error_t Resource.request[ uint8_t id ]() { atomic { if ( m_resource_busy ) m_requests |= 1 << id; else { m_holder = id; m_resource_busy = TRUE; call SpiResource.request(); } } return SUCCESS; } async command error_t Resource.immediateRequest[ uint8_t id ]() { error_t error; atomic { if ( m_resource_busy ) return EBUSY; error = call SpiResource.immediateRequest(); if ( error == SUCCESS ) { m_holder = id; m_resource_busy = TRUE; } xe1205check(9, error); } return error; } async command error_t Resource.release[ uint8_t id ]() { uint8_t i; atomic { if ( m_holder != id ) { xe1205check(11, 1); return FAIL; } m_holder = NO_HOLDER; call SpiResource.release(); if ( !m_requests ) { m_resource_busy = FALSE; } else { for ( i = m_holder + 1; ; i++ ) { if ( i >= RESOURCE_COUNT ) i = 0; if ( m_requests & ( 1 << i ) ) { m_holder = i; m_requests &= ~( 1 << i ); call SpiResource.request(); return SUCCESS; } } } return SUCCESS; } } async command bool Resource.isOwner[ uint8_t id ]() { atomic return (m_holder == id); } event void SpiResource.granted() { uint8_t holder; atomic holder = m_holder; signal Resource.granted[ holder ](); } default event void Resource.granted[ uint8_t id ]() { } async command error_t Fifo.write(uint8_t* data, uint8_t length) __attribute__ ((noinline)){ #if 0 if (call NssDataPin.get() != TRUE || call NssConfigPin.get() != TRUE) xe1205check(8, 1); #endif call SpiPacket.send(data, NULL, length); return SUCCESS; } async event void SpiPacket.sendDone(uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len, error_t error) { #if 0 if (call NssConfigPin.get() != TRUE) xe1205check(4, 1); if (call NssDataPin.get() != FALSE) xe1205check(12, 1); #endif TOSH_SET_NSS_DATA_PIN(); if (tx_buf) { signal Fifo.writeDone(error); } else signal Fifo.readDone(error); } async command error_t Fifo.read(uint8_t* data, uint8_t length) { error_t status; #if 0 if (call NssDataPin.get() != TRUE || call NssConfigPin.get() != TRUE) xe1205check(5, 1); #endif TOSH_CLR_NSS_DATA_PIN(); status = call SpiPacket.send(NULL, data, length); if (status != SUCCESS) { xe1205check(3, status); call NssDataPin.set(); return status; } return SUCCESS; } async command void Reg.read[uint8_t addr](uint8_t* data) { #if 1 if (call NssDataPin.get() != TRUE || call NssConfigPin.get() != TRUE) xe1205check(6, 1); #endif call NssDataPin.set(); call NssConfigPin.clr(); call SpiByte.write(XE1205_READ(addr)); *data = call SpiByte.write(0); call NssConfigPin.set(); } async command void Reg.write[uint8_t addr](uint8_t data) { #if 1 if (call NssDataPin.get() != TRUE || call NssConfigPin.get() != TRUE) xe1205check(7, 1); #endif call NssDataPin.set(); call NssConfigPin.clr(); call SpiByte.write(XE1205_WRITE(addr)); call SpiByte.write(data); call NssConfigPin.set(); } default async event void Fifo.readDone(error_t error) {} default async event void Fifo.writeDone(error_t error) {} } tinyos-2.1.2+dfsg/tos/chips/xe1205/XE1205SpiP.nc000066400000000000000000000100401207233610700205550ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * @author Jonathan Hui * @author Henri Dubois-Ferriere * @version $Revision: 1.5 $ $Date: 2007-07-13 15:54:08 $ */ configuration XE1205SpiP { provides interface Resource[ uint8_t id ]; provides interface XE1205Fifo as Fifo; provides interface XE1205Register as Reg[ uint8_t id ]; } implementation { components XE1205SpiImplP as SpiP; Resource = SpiP; Fifo = SpiP; Reg = SpiP; components new HplXE1205SpiC(); SpiP.SpiResource -> HplXE1205SpiC; SpiP.SpiByte -> HplXE1205SpiC; SpiP.SpiPacket -> HplXE1205SpiC; components MainC; MainC.SoftwareInit -> SpiP; components HplXE1205PinsC; SpiP.NssConfigPin -> HplXE1205PinsC.NssConfigPin; SpiP.NssDataPin -> HplXE1205PinsC.NssDataPin; components new Msp430GpioC() as DPin; } tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/000077500000000000000000000000001207233610700175455ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/XE1205IrqConf.nc000066400000000000000000000071331207233610700222010ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * Interface for control of interrupt-related functions * on the XE1205 radio. * * The current 2.x XE1205 driver is only intended for use of the radio in * buffered mode - therefore IRQ settings for non-buffered mode are not exposed. * * @author Henri Dubois-Ferriere */ interface XE1205IrqConf { #include "XE1205.h" /* * Set IRQ0 sources in Rx mode. * * @param src IRQ source. * @return SUCCESS if configuration done ok, error status otherwise. * */ async command error_t setRxIrq0Source(xe1205_rx_irq0_src_t src); /* * Set IRQ1 sources in Rx mode. * * @param src IRQ source. * @return SUCCESS if configuration done ok, error status otherwise. * */ async command error_t setRxIrq1Source(xe1205_rx_irq1_src_t src); /* * Set IRQ1 source in Tx mode. * * @param haveResource: if TRUE, bus is assumed to be already owned by the caller. * @param src IRQ source. * @return SUCCESS if configuration done ok, error status otherwise. * */ async command error_t setTxIrq1Source(xe1205_tx_irq1_src_t src); /** * Clear FIFO overrun flag. * * @param haveResource: if TRUE, bus is assumed to be already owned by the caller. * @return SUCCESS if operation done ok, error status otherwise. * */ async command error_t clearFifoOverrun(bool haveResource); /** * Get FIFO overrun flag. * * @param haveResource: if TRUE, bus is assumed to be already owned by the caller. * @param fifooverun will be written with 1 if the FIFO overran, 0 else. * @return SUCCESS if operation done ok, error status otherwise. * */ async command error_t getFifoOverrun(bool haveResource, bool* fifooverrun); /** * Arm the pattern detector (clear Start_detect flag). * * @return SUCCESS if operation done ok, error status otherwise. * */ async command error_t armPatternDetector(bool haveResource); } tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/XE1205IrqConfC.nc000066400000000000000000000043001207233610700222750ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * Implementation of XE1205IrqConf interface. * * @author Henri Dubois-Ferriere */ configuration XE1205IrqConfC { provides interface XE1205IrqConf; } implementation { components XE1205IrqConfP; components MainC; MainC.SoftwareInit -> XE1205IrqConfP.Init; components new XE1205SpiC(); XE1205IrqConfP.SpiResource -> XE1205SpiC; XE1205IrqConfP.IrqParam5 -> XE1205SpiC.IrqParam5; XE1205IrqConfP.IrqParam6 -> XE1205SpiC.IrqParam6; XE1205IrqConf = XE1205IrqConfP; } tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/XE1205IrqConfP.nc000066400000000000000000000142321207233610700223170ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * Implementation of XE1205IrqConf interface. * * @author Henri Dubois-Ferriere */ module XE1205IrqConfP { provides interface XE1205IrqConf; provides interface Init @atleastonce(); uses interface XE1205Register as IrqParam5; uses interface XE1205Register as IrqParam6; uses interface Resource as SpiResource; } implementation { #include "xe1205debug.h" // norace is ok because protected by the isOwner() calls norace uint8_t irqparam5; norace uint8_t irqparam6; task void initTask() { atomic { xe1205check(1, call SpiResource.immediateRequest()); // should always succeed: task happens after softwareInit, before interrupts are enabled call IrqParam5.write(0x59); // IRQ0: Write_byte, IRQ1: fifofull, Tx_IRQ: TX_stopped. call IrqParam6.write(0x54); // fill fifo on pattern, clear pattern detect bit, start transmission when fifo not empty // no irq interrupt irqparam5=0x59; irqparam6=0x54; call SpiResource.release(); } } command error_t Init.init() { post initTask(); return SUCCESS; } event void SpiResource.granted() { } /* * Set IRQ0 sources in Rx mode. * @param src may be one of: irq_write_byte, irq_nFifoEmpty, or irq_Pattern. */ async command error_t XE1205IrqConf.setRxIrq0Source(xe1205_rx_irq0_src_t src) { error_t status; if (src > 3) return EINVAL; if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(2, status); if (status != SUCCESS) return status; irqparam5 &= ~(3 << 6); irqparam5 |= (src << 6); call IrqParam5.write(irqparam5); call SpiResource.release(); return SUCCESS; } /* * Set IRQ1 sources in Rx mode. * @param src may be one of: irq_Rssi or irq_FifoFull. */ async command error_t XE1205IrqConf.setRxIrq1Source(xe1205_rx_irq1_src_t src) { error_t status; if (src > 2) return EINVAL; if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(3, status); if (status != SUCCESS) return status; irqparam5 &= ~(3 << 4); irqparam5 |= (src << 4); call IrqParam5.write(irqparam5); call SpiResource.release(); return SUCCESS; } /* * Set IRQ1 sources in Tx mode. * @param src my be one of: irq_FifoFull or irq_TxStopped. */ async command error_t XE1205IrqConf.setTxIrq1Source(xe1205_tx_irq1_src_t src) { error_t status; if (src > 1) return EINVAL; if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(4, status); if (status != SUCCESS) return status; irqparam5 &= ~(1 << 3); irqparam5 |= (src << 3); call IrqParam5.write(irqparam5); call SpiResource.release(); return SUCCESS; } void clearFifoOverrun() { irqparam5 |= 1; call IrqParam5.write(irqparam5); } /** * Clear FIFO overrun flag. */ async command error_t XE1205IrqConf.clearFifoOverrun(bool haveResource) { error_t status; if (haveResource) { clearFifoOverrun(); } else { if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); clearFifoOverrun(); call SpiResource.release(); } return SUCCESS; } bool getFifoOverrun() { uint8_t reg; call IrqParam5.read(®); return reg & 1; } async command error_t XE1205IrqConf.getFifoOverrun(bool haveResource, bool* fifooverrun) { error_t status; if (haveResource) { *fifooverrun = getFifoOverrun(); } else { if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(5, status); if (status != SUCCESS) return status; *fifooverrun = getFifoOverrun(); call SpiResource.release(); } return SUCCESS; } void armPatternDetector() { irqparam6 |= (1 << 6); call IrqParam6.write(irqparam6); } /** * Arm the pattern detector (clear Start_detect flag). */ async command error_t XE1205IrqConf.armPatternDetector(bool haveResource) { error_t status; if (haveResource) { armPatternDetector(); } else { if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(5, status); if (status != SUCCESS) return status; armPatternDetector(); call SpiResource.release(); } return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/XE1205PatternConf.nc000066400000000000000000000057701207233610700230700ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * Interface for preamble detection settings * on the XE1205 radio. * * @author Henri Dubois-Ferriere */ interface XE1205PatternConf { /** * Set the length of the preamble searched by the XE1205 * pattern detection module. * * @param len patten length (1 <= len <= 4) * @return SUCCESS if operation done ok, error status otherwise */ async command error_t setDetectLen(uint8_t len); /** * Load a preamble pattern into the XE1205 pattern detection module. * * @param pattern pointer to pattern bytes. * @param len pattern length (1 <= len <= 4). Note that this may be larger * than value set using setPatternLength; in this case the extra bytes * are programmed into the radio but ignored by the pattern detection stage. * @return SUCCESS if operation done ok, error status otherwise */ async command error_t loadPattern(uint8_t* pattern, uint8_t len); async command error_t loadDataPatternHasBus(); async command error_t loadAckPatternHasBus(); /** * Set the number of bit errors accepted by the XE1205 * pattern detection module. * * @param nerrors max. number of errors accepted (0 <= len <= 3) * @return SUCCESS if operation done ok, error status otherwise */ async command error_t setDetectErrorTol(uint8_t nerrors); } tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/XE1205PatternConfC.nc000066400000000000000000000046221207233610700231660ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * Implementation of XE1205PatternConf interface. * * @author Henri Dubois-Ferriere */ configuration XE1205PatternConfC { provides interface XE1205PatternConf; } implementation { components XE1205PatternConfP; components MainC; MainC.SoftwareInit -> XE1205PatternConfP.Init; components new XE1205SpiC(); XE1205PatternConfP.SpiResource -> XE1205SpiC; XE1205PatternConfP.RXParam10 -> XE1205SpiC.RXParam10; XE1205PatternConfP.Pattern13 -> XE1205SpiC.Pattern13; XE1205PatternConfP.Pattern14 -> XE1205SpiC.Pattern14; XE1205PatternConfP.Pattern15 -> XE1205SpiC.Pattern15; XE1205PatternConfP.Pattern16 -> XE1205SpiC.Pattern16; XE1205PatternConf = XE1205PatternConfP; } tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/XE1205PatternConfP.nc000066400000000000000000000117131207233610700232020ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * Implementation of XE1205PatternConf interface. * * @author Henri Dubois-Ferriere */ module XE1205PatternConfP { provides interface XE1205PatternConf; provides interface Init @atleastonce(); uses interface Resource as SpiResource; uses interface XE1205Register as RXParam10; uses interface XE1205Register as Pattern13; uses interface XE1205Register as Pattern14; uses interface XE1205Register as Pattern15; uses interface XE1205Register as Pattern16; } implementation { #include "xe1205debug.h" task void initTask() { atomic { xe1205check(1, call SpiResource.immediateRequest()); // should always succeed: task happens after softwareInit, before interrupts are enabled call RXParam10.write(0x10 | 2 << 2); // pattern detection enabled, error tolerance=0, pattern length 3 call Pattern13.write((data_pattern >> 16) & 0xff); call Pattern14.write((data_pattern >> 8) & 0xff); call Pattern15.write(data_pattern & 0xff); call SpiResource.release(); } } command error_t Init.init() { post initTask(); return SUCCESS; } event void SpiResource.granted() { } async command error_t XE1205PatternConf.setDetectLen(uint8_t len) { uint8_t reg; error_t status; if (len == 0 || len > 4) return EINVAL; if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(2, status); if (status != SUCCESS) return status; call RXParam10.read(®); reg &= ~(3 << 2); reg |= (len << 2); call RXParam10.write(reg); call SpiResource.release(); return SUCCESS; } async command error_t XE1205PatternConf.loadDataPatternHasBus() { call Pattern13.write((data_pattern >> 16) & 0xff); call Pattern14.write((data_pattern >> 8) & 0xff); call Pattern15.write(data_pattern & 0xff); return SUCCESS; } async command error_t XE1205PatternConf.loadAckPatternHasBus() { call Pattern13.write((ack_pattern >> 16) & 0xff); call Pattern14.write((ack_pattern >> 8) & 0xff); call Pattern15.write(ack_pattern & 0xff); return SUCCESS; } async command error_t XE1205PatternConf.loadPattern(uint8_t* pattern, uint8_t len) { error_t status; if (len == 0 || len > 4) return EINVAL; if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(3, status); if (status != SUCCESS) return status; call Pattern13.write(*pattern++); if (len == 1) goto done; call Pattern14.write(*pattern++); if (len == 2) goto done; call Pattern15.write(*pattern++); if (len == 3) goto done; call Pattern16.write(*pattern); done: call SpiResource.release(); return SUCCESS; } async command error_t XE1205PatternConf.setDetectErrorTol(uint8_t nerrors) { uint8_t reg; error_t status; if (nerrors > 3) return EINVAL; if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(4, status); if (status != SUCCESS) return status; call RXParam10.read(®); reg &= ~(0x03); reg |= nerrors; call RXParam10.write(reg); call SpiResource.release(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/XE1205PhyConf.nc000066400000000000000000000057521207233610700222130ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * Interface for physical parameter settings (bw, bitrate, power) * on the XE1205 radio. * * @author Henri Dubois-Ferriere */ interface XE1205PhyConf { #include "XE1205.h" /** * Tune the XE1205 to operate on a preset channel. * * @param preset Channel index as defined in XE1205.h * @return SUCCESS if configuration done ok, error status otherwise. */ command error_t tunePreset(xe1205_channelpreset_t preset); /** * Set the output power of the XE1205. * * @param pow Power index as defined in XE1205.h * @return SUCCESS if configuration done ok, error status otherwise. */ async command error_t setRFPower(xe1205_txpower_t txpow); /** * Set the raw communication bitrate. The frequency deviation and receiver * filter bandwidth are also set to appropriate values for the bitrate. Advanced users * can still override the freq. dev and bw values with the individual functions below. * * @param value_ Bitrate (min 1190 bps, max 152340 bps) * @return SUCCESS if configuration done ok, error status otherwise. */ command error_t setBitrate(xe1205_bitrate_t bitrate); /** * Get the time (in us) to send/receive a byte at current bit rate. * * @return time (in us). */ async command uint16_t getByteTime_us(); } tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/XE1205PhyRssiConfC.nc000066400000000000000000000051741207233610700231550ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * Implementation of XE1205RssiConf and XE1205PhyConf interfaces. * * @author Henri Dubois-Ferriere */ configuration XE1205PhyRssiConfC { provides interface XE1205PhyConf; provides interface XE1205RssiConf; } implementation { components XE1205PhyRssiConfP; components MainC; MainC.SoftwareInit -> XE1205PhyRssiConfP.Init; components new XE1205SpiC(); XE1205PhyRssiConfP.SpiResource -> XE1205SpiC; XE1205PhyRssiConfP.MCParam0 -> XE1205SpiC.MCParam0; XE1205PhyRssiConfP.MCParam1 -> XE1205SpiC.MCParam1; XE1205PhyRssiConfP.MCParam2 -> XE1205SpiC.MCParam2; XE1205PhyRssiConfP.MCParam3 -> XE1205SpiC.MCParam3; XE1205PhyRssiConfP.MCParam4 -> XE1205SpiC.MCParam4; XE1205PhyRssiConfP.TXParam7 -> XE1205SpiC.TXParam7; XE1205PhyRssiConfP.RXParam8 -> XE1205SpiC.RXParam8; XE1205PhyRssiConfP.RXParam9 -> XE1205SpiC.RXParam9; XE1205PhyConf = XE1205PhyRssiConfP; XE1205RssiConf = XE1205PhyRssiConfP; } tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/XE1205PhyRssiConfP.nc000066400000000000000000000254671207233610700232010ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * Implementation of XE1205PhyConf and XE1205RssiConf interfaces. * These are implemented jointly because the rssi measure period depends * on the frequency deviation (which itself depends on bitrate). * * @author Henri Dubois-Ferriere */ module XE1205PhyRssiConfP { provides interface XE1205PhyConf; provides interface XE1205RssiConf; provides interface Init @atleastonce(); uses interface Resource as SpiResource; uses interface XE1205Register as MCParam0; uses interface XE1205Register as MCParam1; uses interface XE1205Register as MCParam2; uses interface XE1205Register as MCParam3; uses interface XE1205Register as MCParam4; uses interface XE1205Register as TXParam7; uses interface XE1205Register as RXParam8; uses interface XE1205Register as RXParam9; } implementation { #include "xe1205debug.h" /* * Default settings for initial parameters. */ #ifndef XE1205_BITRATE_DEFAULT #define XE1205_BITRATE_DEFAULT 76170 #endif //xxx/make this computed as a fun of XE1205_BITRATE_DEFAULT #ifndef XE1205_FREQDEV_DEFAULT #define XE1205_FREQDEV_DEFAULT 100000 #endif /* * Register calculation helper macros. */ #define XE1205_FREQ(value_) (((value_) * 100) / 50113L) #define XE1205_EFFECTIVE_FREQ(value_) (((int32_t)((int16_t)(value_)) * 50113L) / 100) #define XE1205_FREQ_DEV_HI(value_) ((XE1205_FREQ(value_) >> 8) & 0x01) #define XE1205_FREQ_DEV_LO(value_) (XE1205_FREQ(value_) & 0xff) #define XE1205_FREQ_HI(value_) ((XE1205_FREQ(value_) >> 8) & 0xff) #define XE1205_FREQ_LO(value_) (XE1205_FREQ(value_) & 0xff) #define XE1205_BIT_RATE(value_) ((152340L / (value_) - 1) & 0x7f) #define XE1205_EFFECTIVE_BIT_RATE(value_) (152340L / ((value_) + 1)) /** * Frequency bands. */ enum xe1205_freq_bands { XE1205_Band_434 = 434000000, XE1205_Band_869 = 869000000, XE1205_Band_915 = 915000000 }; // this value is the time between rssi measurement updates, plus a buffer time. // we keep it cached for fast access during packet reception uint16_t rssi_period_us; // time to xmit/receive a byte at current bitrate uint16_t byte_time_us; // norace is ok because protected by the isOwner() calls norace uint8_t rxparam9 = 0xff; norace uint8_t txparam7 = 0xff; // returns appropriate baseband filter in khz bw for given bitrate in bits/sec. uint16_t baseband_bw_from_bitrate(uint32_t bitrate) { return (bitrate * 400) /152340; } // returns appropriate freq. deviation for given bitrate in bits/sec. uint32_t freq_dev_from_bitrate(uint32_t bitrate) { return (bitrate * 6) / 5; } // returns xe1205 encoding of baseband bandwidth in appropriate bit positions // for writing into rxparam7 register uint8_t baseband_bw_rxparam7_bits(uint16_t bbw_khz) { if(bbw_khz <= 10) { return 0x00; } else if(bbw_khz <= 20) { return 0x20; } else if(bbw_khz <= 40) { return 0x40; } else if(bbw_khz <= 200) { return 0x60; } else if(bbw_khz <= 400) { return 0x10; } else return 0x10; } // returns the period (in us) between two successive rssi measurements // (see xemics data sheet 4.2.3.4), as a function of frequency deviation uint16_t rssi_meas_time(uint32_t freqdev_hz) { if (freqdev_hz > 20000) // at 152kbps, equiv to 2 byte times, at 76kbps, equiv to 1 byte time, at 38kbps equiv to 4 bits, etc return 100; else if (freqdev_hz > 10000) // at 9.6kbps, equiv to 4 byte times. return 200; else if (freqdev_hz > 7000) return 300; else if (freqdev_hz > 5000) // at 4.8kbps, equiv to 4 byte times. return 400; else return 500; // at 1200, equiv to 13 byte times. } task void initTask() { atomic { byte_time_us = 8000000 / XE1205_BITRATE_DEFAULT; rssi_period_us = rssi_meas_time(XE1205_FREQDEV_DEFAULT) + 10; xe1205check(1, call SpiResource.immediateRequest()); // should always succeed: task happens after softwareInit, before interrupts are enabled call TXParam7.write(0x00); // tx power 0dbm, normal modulation & bitsync, no flitering txparam7=0; call MCParam0.write(0x3c | XE1205_FREQ_DEV_HI(XE1205_FREQDEV_DEFAULT)); // buffered mode, transceiver select using SW(0:1), Data output, 868mhz band, call MCParam1.write(XE1205_FREQ_DEV_LO(XE1205_FREQDEV_DEFAULT)); call MCParam2.write(XE1205_BIT_RATE(XE1205_BITRATE_DEFAULT)); call MCParam3.write(XE1205_FREQ_HI(-1000000)); // 869mhz - 1mhz = 868mhz (preset 0) call MCParam4.write(XE1205_FREQ_LO(-1000000)); call RXParam8.write(baseband_bw_rxparam7_bits(baseband_bw_from_bitrate(XE1205_BITRATE_DEFAULT)) | 0x0a); // calibrate & init baseband filter each time bbw changes call RXParam9.write(0x00); // rssi off by default, fei off rxparam9=0; call SpiResource.release(); } } command error_t Init.init() { post initTask(); return SUCCESS; } event void SpiResource.granted() { } error_t tuneManual(uint32_t freq) { uint32_t bandCenter; uint8_t mcp0reg; uint16_t mcp34reg; error_t status; if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(2, status); if (status != SUCCESS) return status; call MCParam0.read(&mcp0reg); mcp0reg &= ~0x6; if ((freq >= (XE1205_Band_434 + XE1205_EFFECTIVE_FREQ(0x8000))) && (freq <= (XE1205_Band_434 + XE1205_EFFECTIVE_FREQ(0x7fff)))) { mcp0reg |= (1 << 1); bandCenter = XE1205_Band_434; } else if ((freq >= (XE1205_Band_869 + XE1205_EFFECTIVE_FREQ(0x8000))) && (freq <= (XE1205_Band_869 + XE1205_EFFECTIVE_FREQ(0x7fff)))) { mcp0reg |= (2 << 1); bandCenter = XE1205_Band_869; } else if ((freq >= (XE1205_Band_915+ XE1205_EFFECTIVE_FREQ(0x8000))) && (freq <= (XE1205_Band_915 + XE1205_EFFECTIVE_FREQ(0x7fff)))) { mcp0reg |= (3 << 1); bandCenter = XE1205_Band_915; } else { call SpiResource.release(); return EINVAL; } mcp34reg = XE1205_FREQ(freq - bandCenter); call MCParam0.write(mcp0reg); call MCParam3.write(mcp34reg >> 8); call MCParam4.write(mcp34reg & 0xff); call SpiResource.release(); return SUCCESS; } command error_t XE1205PhyConf.tunePreset(xe1205_channelpreset_t preset) { switch(preset) { case xe1205_channelpreset_868mhz: return tuneManual(868000000); case xe1205_channelpreset_869mhz: return tuneManual(869000000); case xe1205_channelpreset_870mhz: return tuneManual(870000000); case xe1205_channelpreset_433mhz: return tuneManual(433000000); case xe1205_channelpreset_434mhz: return tuneManual(434000000); case xe1205_channelpreset_435mhz: return tuneManual(435000000); default: return FAIL; } } async command error_t XE1205PhyConf.setRFPower(xe1205_txpower_t txpow) { error_t status; if (txpow > xe1205_txpower_15dbm) return EINVAL; if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(3, status); if (status != SUCCESS) return status; txparam7 &= ~(3 << 6); txparam7 |= (txpow << 6); call TXParam7.write(txparam7); call SpiResource.release(); return SUCCESS; } command error_t XE1205PhyConf.setBitrate(xe1205_bitrate_t bitrate) { uint16_t bbw; uint32_t freqdev; uint8_t rxp8reg, mcp0reg, mcp1reg, mcp2reg; error_t status; if (bitrate < xe1205_bitrate_38085 || bitrate > xe1205_bitrate_152340) return EINVAL; if (call SpiResource.isOwner()) return EBUSY; status = call SpiResource.immediateRequest(); xe1205check(4, status); if (status != SUCCESS) return status; // receiver bandwidth call RXParam8.read(&rxp8reg); bbw = baseband_bw_from_bitrate(bitrate); rxp8reg &= ~0x70; rxp8reg |= baseband_bw_rxparam7_bits(bbw); // frequency deviation freqdev = freq_dev_from_bitrate(bitrate); rssi_period_us = rssi_meas_time(freqdev) + 10; call MCParam0.read(&mcp0reg); mcp0reg &= ~0x01; mcp0reg |= XE1205_FREQ_DEV_HI(freqdev); mcp1reg = XE1205_FREQ_DEV_LO(freqdev); mcp2reg = XE1205_BIT_RATE(bitrate); call RXParam8.write(rxp8reg); call MCParam0.write(mcp0reg); call MCParam1.write(mcp1reg); call MCParam2.write(mcp2reg);; atomic byte_time_us = 8000000 / bitrate; call SpiResource.release(); return SUCCESS; } async command uint16_t XE1205PhyConf.getByteTime_us() { return byte_time_us; } async command error_t XE1205RssiConf.setRssiMode(bool on) { // must have bus if (on) rxparam9 |= 0x80; else rxparam9 &= ~0x80; call RXParam9.write(rxparam9); return SUCCESS; } async command uint16_t XE1205RssiConf.getRssiMeasurePeriod_us() { return rssi_period_us; } async command error_t XE1205RssiConf.setRssiRange(bool high) { // must have bus if (high) { rxparam9 |= 0x40; } else { rxparam9 &= ~0x40; } call RXParam9.write(rxparam9); return SUCCESS; } async command error_t XE1205RssiConf.getRssi(uint8_t* rssi) { // must have bus call RXParam9.read(rssi); *rssi = (*rssi >> 4) & 0x03; return SUCCESS; } } tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/XE1205Register.nc000066400000000000000000000044251207233610700224250ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * Interface for access to registers onthe XE1205 radio. * * @author Henri Dubois-Ferriere */ /** * * @author Henri Dubois-Ferriere */ #include "XE1205.h" interface XE1205Register { /** * Read a data word from the register. * * @param data pointer to place the register value. * @return status byte from the read. */ async command void read(uint8_t* data); /** * Write a data word to the register. * * @param data value to write to register. * @return status byte from the write. */ async command void write(uint8_t data); } tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/XE1205RssiConf.nc000066400000000000000000000056541207233610700223740ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * Interface for Rssi settings and measurements * on the XE1205 radio. * * @author Henri Dubois-Ferriere */ interface XE1205RssiConf { /** * Enable RSSI measurements. * * @param on: 1 to enable, 0 to disable * @return SUCCESS if operation done ok, error status otherwise */ async command error_t setRssiMode(bool on); /** * Return the returns the period (in us) between two successive rssi measurements, * taking into account the current setting of the frequency deviation. * * @return rssi measure period. */ async command uint16_t getRssiMeasurePeriod_us(); /** * Set RSSI measurement points to low/high values at * * @param high: 1 for high range (-95, -90, -85 dBm) * 0 for low range (-110, -105, -100 dBm) * @return SUCCESS if operation done ok, error status otherwise */ async command error_t setRssiRange(bool high); /** * Read RSSI value in 2 bits. RSSI block should be enabled before calling this. * * @param rssi Pointer to byte where rssi will be written. * @return SUCCESS if operation done ok, error status otherwise * (in which case *rssi should not be used). */ async command error_t getRssi(uint8_t* rssi); } tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/registers.html000066400000000000000000000040671207233610700224510ustar00rootroot00000000000000 XE1205 Registers in TinyOS 2.x driver
      Register Initialized Read Written
      MCParam0 PhyRssiConfP PhyRssiConfP PhyRssiConfP
      MCParam1 PhyRssiConfP PhyRssiConfP PhyRssiConfP
      MCParam2 PhyRssiConfP PhyRssiConfP PhyRssiConfP
      MCParam3 PhyRssiConfP PhyRssiConfP PhyRssiConfP
      MCParam4 PhyRssiConfP PhyRssiConfP PhyRssiConfP
      IrqParam5 IrqConfP IrqConfP IrqConfP
      IrqParam6 IrqConfP IrqConfP IrqConfP
      TXParam7 PhyRssiConfP PhyRssiConfP PhyRssiConfP
      RXParam8 PhyRssiConfP PhyRssiConfP PhyRssiConfP
      RXParam9 PhyRssiConfP PhyRssiConfP PhyRssiConfP
      RXParam10 PatternConfP PatternConfP PatternConfP
      RXParam11 - - -
      RXParam12 - - -
      Pattern13 - - PatternConfP
      Pattern14 - - PatternConfP
      Pattern15 - - PatternConfP
      Pattern16 - - PatternConfP
      OscParam17 - - -
      OscParam18 - - -
      TParam19 - - -
      TParam21 - - -
      TParam22 - - -
      tinyos-2.1.2+dfsg/tos/chips/xe1205/conf/registers.txt000066400000000000000000000030541207233610700223170ustar00rootroot00000000000000 Changeable registers: name | Addr | (a)sync | r/w(*) | Interface | init -------------------------------------------------------------------------------------------------- freq_dev | 0[0], 1[0-7] | ? | r/w | XE1205PhyConf | bitrate | 2[0-6] | ? | r/w | XE1205PhyConf | freq_lo | 3[0-7],4[0-7] | ? | r/w | XE1205PhyConf | rx_irq_0 | 5[6-7] | async | w | XE1205IrqConf | rx_irq_1 | 5[4-5] | async | w | XE1205IrqConf | tx_irq_1 | 5[3] | async | w | XE1205IrqConf | fifooverun | 5[0] | async | w | XE1205IrqConf | start_detect | 6[6] | async | w | XE1205IrqConf | power | 7[6-7] | ? | r/w | XE1205PhyConf | bw | 8[4-6] | same as | w | XE1205PhyConf | | bitrate | | | rssi | 9[7] | async | w | XE1205RssiConf | rssi_range | 9[6] | async | r/w | XE1205RssiConf | rssi_out | 9[4-5] | async | r | XE1205RssiConf | pattern | 10[4] | ? | w | XE1205PatternConf | * pat_size | 10[2-3] | async | w | XE1205PatternConf | pat_tol | 10[0-1] | ? | w | XE1205PatternConf | reg_pattern | 13-16 | async | w | XE1205PatternConf | (*) (at higher levels, reads my be cached) tinyos-2.1.2+dfsg/tos/chips/xe1205/crc.h000066400000000000000000000103771207233610700175500ustar00rootroot00000000000000// $Id: crc.h,v 1.6 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef CRC_H #define CRC_H uint16_t const ccitt_crc16_table[256] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 }; uint16_t crcByte(uint16_t fcs, uint8_t c) { fcs = ccitt_crc16_table[(fcs >> 8 ^ c) & 0xffU] ^ (fcs << 8); return fcs; } #endif tinyos-2.1.2+dfsg/tos/chips/xe1205/phy/000077500000000000000000000000001207233610700174205ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/chips/xe1205/phy/XE1205PhyC.nc000066400000000000000000000062041207233610700213540ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * @author Henri Dubois-Ferriere * */ configuration XE1205PhyC { provides interface XE1205PhyRxTx; provides interface XE1205PhyRssi; provides interface SplitControl; } implementation { components XE1205PhyP; components XE1205PhySwitchC; XE1205PhyP.XE1205PhySwitch -> XE1205PhySwitchC; components new XE1205SpiC(); XE1205PhyP.XE1205Fifo -> XE1205SpiC; XE1205PhyP.SpiResourceRX -> XE1205SpiC; components new XE1205SpiC() as SpiTX; XE1205PhyP.SpiResourceTX -> SpiTX; components new XE1205SpiC() as SpiConfig; XE1205PhyP.SpiResourceConfig -> SpiConfig; components new XE1205SpiC() as SpiRSSI; XE1205PhyP.SpiResourceRssi -> SpiRSSI; components HplXE1205InterruptsC; XE1205PhyP.Interrupt0 -> HplXE1205InterruptsC.Interrupt0; XE1205PhyP.Interrupt1 -> HplXE1205InterruptsC.Interrupt1; XE1205PhyRxTx = XE1205PhyP; SplitControl = XE1205PhyP; XE1205PhyRssi = XE1205PhyP; components MainC; MainC.SoftwareInit -> XE1205PhyP.Init; components XE1205PatternConfC; XE1205PhyP.XE1205PatternConf -> XE1205PatternConfC; components XE1205IrqConfC; XE1205PhyP.XE1205IrqConf -> XE1205IrqConfC; components XE1205PhyRssiConfC; XE1205PhyP.XE1205RssiConf -> XE1205PhyRssiConfC; components new Alarm32khz16C(); XE1205PhyP.Alarm32khz16 -> Alarm32khz16C.Alarm; #if 0 components new Msp430GpioC() as DpinM, HplMsp430GeneralIOC; DpinM -> HplMsp430GeneralIOC.Port41; XE1205PhyP.Dpin -> DpinM; #endif } tinyos-2.1.2+dfsg/tos/chips/xe1205/phy/XE1205PhyP.nc000066400000000000000000000371631207233610700214010ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * @author Henri Dubois-Ferriere * */ #include "Timer.h" module XE1205PhyP { provides interface XE1205PhyRxTx; provides interface XE1205PhyRssi; provides interface Init @atleastonce(); provides interface SplitControl @atleastonce(); uses interface Resource as SpiResourceTX; uses interface Resource as SpiResourceRX; uses interface Resource as SpiResourceConfig; uses interface Resource as SpiResourceRssi; uses interface XE1205PhySwitch; uses interface XE1205IrqConf; uses interface XE1205Fifo; uses interface XE1205RssiConf; uses interface XE1205PatternConf; uses interface GpioInterrupt as Interrupt0; uses interface GpioInterrupt as Interrupt1; uses interface Alarm as Alarm32khz16; #if 0 uses interface GeneralIO as Dpin; #endif } implementation { #include "xe1205debug.h" char* txBuf = NULL; uint8_t rxFrameIndex = 0; uint8_t rxFrameLen = 0; uint8_t nextTxLen=0; uint8_t nextRxLen; // Bugfix 29.1.2010: Plus 2 Bytes for the xe1205_phy_header_t // defined in XE1205SendReceiveP.nc // This is just a hack to make it work, this entire code needs // to be cleaned up & documented! char rxFrame[xe1205_mtu + 2]; uint8_t headerLen = 4; uint16_t stats_rxOverruns; enum { RSSI_RANGE_LOW=1, RSSI_RANGE_HIGH=2, RSSI_OFF=0, }; uint8_t rssiRange = RSSI_OFF; norace uint8_t rssiL,rssiH; uint8_t * rLow = &rssiL; uint8_t * rHigh = &rssiH; bool enableAck = FALSE; typedef enum { // remember to update busy() and off(), start(), stop() if states are added RADIO_LISTEN=0, RADIO_RX_HEADER=1, RADIO_RX_PACKET=2, RADIO_RX_PACKET_LAST=3, RADIO_TX=4, RADIO_SLEEP=5, RADIO_STARTING=6, RADIO_RSSI=7, RADIO_RX_ACK=8, RADIO_TX_ACK=9 } phy_state_t; phy_state_t state = RADIO_SLEEP; void armPatternDetect(); //////////////////////////////////////////////////////////////////////////////////// // // jiffy/microseconds/bytetime conversion functions. // //////////////////////////////////////////////////////////////////////////////////// // 1 jiffie = 1/32768 = 30.52us; // we approximate to 32us for quicker computation and also to account for interrupt/processing overhead. inline uint32_t usecs_to_jiffies(uint32_t usecs) { return usecs >> 5; } command error_t Init.init() { #if 0 call Dpin.makeOutput(); #endif call XE1205PhySwitch.sleepMode(); call XE1205PhySwitch.antennaOff(); return SUCCESS; } task void startDone() { signal SplitControl.startDone(SUCCESS); } event void SpiResourceTX.granted() { } event void SpiResourceRX.granted() { } event void SpiResourceConfig.granted() { armPatternDetect(); call SpiResourceConfig.release(); atomic { if (state == RADIO_STARTING){ post startDone(); } if (state == RADIO_RX_ACK) { enableAck=FALSE; signal XE1205PhyRxTx.sendFrameDone(FAIL); } state = RADIO_LISTEN; call Interrupt0.enableRisingEdge(); } } event void SpiResourceRssi.granted() { } task void stopDone() { signal SplitControl.stopDone(SUCCESS); } command error_t SplitControl.start() { atomic { if (state == RADIO_LISTEN){ post startDone(); return SUCCESS;} if (state != RADIO_SLEEP) return EBUSY; state = RADIO_STARTING; } call XE1205PhySwitch.rxMode(); call XE1205PhySwitch.antennaRx(); call Alarm32khz16.start(usecs_to_jiffies(XE1205_Sleep_to_RX_Time)); return SUCCESS; } command error_t SplitControl.stop() { atomic { if (!call XE1205PhyRxTx.busy()) { call XE1205PhySwitch.sleepMode(); call XE1205PhySwitch.antennaOff(); state = RADIO_SLEEP; call Interrupt0.disable(); call Interrupt1.disable(); post stopDone(); return SUCCESS; } else return FAIL; } } default event void SplitControl.startDone(error_t error) { } default event void SplitControl.stopDone(error_t error) { } default async event void XE1205PhyRssi.rssiDone(uint8_t _rssi) { } async command bool XE1205PhyRxTx.busy() { atomic return (state != RADIO_LISTEN && state != RADIO_SLEEP); } async command bool XE1205PhyRxTx.off() { atomic return (state == RADIO_SLEEP || state == RADIO_STARTING); } async command void XE1205PhyRxTx.enableAck(bool onOff) { atomic enableAck = onOff; } void armPatternDetect() { // small chance of a pattern arriving right after we arm, // and IRQ0 hasn't been enabled yet, so we would miss the interrupt // xxx maybe this can also be addressed with periodic timer? call XE1205IrqConf.armPatternDetector(TRUE); call XE1205IrqConf.clearFifoOverrun(TRUE); } async command void XE1205PhyRxTx.setRxHeaderLen(uint8_t l) { if (l > 8) l = 8; if (!l) return; headerLen = l; } async command uint8_t XE1205PhyRxTx.getRxHeaderLen() { return headerLen; } void computeNextRxLength() { uint8_t n = rxFrameLen - rxFrameIndex; // for timesync and such, we want the end of the packet to coincide with a fifofull event, // so that we know precisely when last byte was received if (n > 16) { if (n < 32) nextRxLen = n - 15; else nextRxLen = 15; } else { nextRxLen = n; } } async command uint8_t XE1205PhyRssi.readRxRssi() { return rssiTab[(rssiH<<2) |rssiL]; } task void rssiDone() { signal XE1205PhyRssi.rssiDone( rssiTab[(rssiH<<2) |rssiL]); } void readRssi() { if(rssiRange ==RSSI_RANGE_LOW ) { rssiRange = RSSI_RANGE_HIGH; call XE1205RssiConf.getRssi(rLow); call XE1205RssiConf.setRssiRange(TRUE); call Alarm32khz16.start(usecs_to_jiffies(call XE1205RssiConf.getRssiMeasurePeriod_us())); } else { call XE1205RssiConf.getRssi(rHigh); call XE1205RssiConf.setRssiMode(FALSE); if(state == RADIO_RSSI) { armPatternDetect(); call SpiResourceRssi.release(); call Interrupt0.enableRisingEdge(); atomic state = RADIO_LISTEN; signal XE1205PhyRssi.rssiDone( rssiTab[(rssiH<<2) |rssiL]); } else { // go on with rx of packet call Alarm32khz16.start(3000); } rssiRange = RSSI_OFF; } } error_t getRssi() { error_t err; err = call XE1205RssiConf.setRssiMode(TRUE); err = ecombine(err,call XE1205RssiConf.setRssiRange(FALSE)); rssiRange=RSSI_RANGE_LOW; call Alarm32khz16.start(usecs_to_jiffies(call XE1205RssiConf.getRssiMeasurePeriod_us())); return err; } async command error_t XE1205PhyRssi.getRssi() { error_t err; atomic { if (state != RADIO_LISTEN&&rssiRange==RSSI_OFF) return EBUSY; if (call XE1205PhyRxTx.off()) { return EOFF; } if(call SpiResourceRssi.immediateRequest() != SUCCESS) { return FAIL; } err=getRssi(); if (SUCCESS ==err) { state = RADIO_RSSI; } return err; } } async command error_t XE1205PhyRxTx.sendFrame(char* data, uint8_t frameLen) __attribute__ ((noinline)) { error_t status; if (frameLen < 6) return EINVAL; atomic { if (state == RADIO_SLEEP) return EOFF; if (call XE1205PhyRxTx.busy()) return EBUSY; if (frameLen == 0 || frameLen > xe1205_mtu + 7) return EINVAL; // 7 = 4 preamble + 3 sync call XE1205PhySwitch.txMode(); // it takes 100us to switch from rx to tx, ie less than one byte at 76kbps call Interrupt0.disable(); status = call SpiResourceTX.immediateRequest(); xe1205check(3, status); if (status != SUCCESS) { call XE1205PhySwitch.rxMode(); call SpiResourceConfig.request(); return status; } call XE1205PhySwitch.antennaTx(); state = RADIO_TX; } call XE1205Fifo.write(data, frameLen); atomic { txBuf = signal XE1205PhyRxTx.continueSend(&nextTxLen); } if (nextTxLen) { call Interrupt0.enableFallingEdge(); } else { call Interrupt0.disable(); call Interrupt1.enableRisingEdge(); } // cannot happen with current SPI implementation (at least with NoDma) #if 0 if (status != SUCCESS) { xe1205error(8, status); call XE1205PhySwitch.rxMode(); call XE1205PhySwitch.antennaRx(); call XE1205PatternConf.loadDataPatternHasBus(); armPatternDetect(); call SpiResourceTX.release(); atomic { call Interrupt0.enableRisingEdge(); state = RADIO_LISTEN; } return status; } #endif return SUCCESS; } uint16_t rxByte=0; /** * In transmit: nTxFifoEmpty. (ie after the last byte has been *read out of the fifo*) * In receive: write_byte. */ async event void Interrupt0.fired() __attribute__ ((noinline)) { error_t status; switch (state) { case RADIO_RX_ACK: call Alarm32khz16.stop(); case RADIO_LISTEN: rxByte=1; atomic state = RADIO_RX_HEADER; status = call SpiResourceRX.immediateRequest(); atomic { if (status != SUCCESS) { state = RADIO_LISTEN; call Interrupt0.disable(); // because pattern detector won't be rearmed right away call SpiResourceConfig.request(); return; } } call Alarm32khz16.start(3000); return; case RADIO_RX_HEADER: rxByte++; if (rxByte == 2) { call Alarm32khz16.start(3000); } if (rxByte == headerLen + 1) { call Interrupt0.disable(); call XE1205Fifo.read(rxFrame, headerLen); call Interrupt1.enableRisingEdge(); } return; case RADIO_TX: call Interrupt0.disable(); // avoid spurious IRQ0s from nTxFifoEmpty rebounding briefly after first byte is written. // note that we should really wait till writedone() to re-enable either interrupt. call XE1205Fifo.write(txBuf, nextTxLen); txBuf = signal XE1205PhyRxTx.continueSend(&nextTxLen); if (nextTxLen) { call Interrupt0.enableFallingEdge(); } else { call Interrupt0.disable(); call Interrupt1.enableRisingEdge(); } return; case RADIO_RSSI: // trigged while getting rssi call Interrupt0.disable(); // because pattern detector won't be rearmed right away return; default: return; } } /** * In transmit: TxStopped. (ie after the last byte has been *sent*) * In receive: Fifofull. */ async event void Interrupt1.fired() __attribute__ ((noinline)) { switch (state) { case RADIO_RX_PACKET: call Interrupt1.disable(); // in case it briefly goes back to full just after we read first byte call XE1205Fifo.read(&rxFrame[rxFrameIndex], nextRxLen); rxFrameIndex += nextRxLen; computeNextRxLength(); if (nextRxLen==0) { state = RADIO_RX_PACKET_LAST; } return; case RADIO_RX_HEADER: // somehow the FIFO has filled before we finished reading the header bytes call Interrupt1.disable(); call Alarm32khz16.stop(); signal XE1205PhyRxTx.rxFrameEnd(NULL, 0, FAIL); call XE1205PatternConf.loadDataPatternHasBus(); armPatternDetect(); call SpiResourceRX.release(); atomic { call Interrupt0.enableRisingEdge(); state = RADIO_LISTEN; } return; case RADIO_TX: call Interrupt1.disable(); call XE1205PhySwitch.rxMode(); call XE1205PhySwitch.antennaRx(); if (enableAck==FALSE) { call XE1205PatternConf.loadDataPatternHasBus(); armPatternDetect(); signal XE1205PhyRxTx.sendFrameDone(SUCCESS); call SpiResourceTX.release(); atomic { call Interrupt0.enableRisingEdge(); state = RADIO_LISTEN; } } else { call XE1205PatternConf.loadAckPatternHasBus(); armPatternDetect(); call SpiResourceTX.release(); call Alarm32khz16.start(usecs_to_jiffies(8000)); atomic { call Interrupt0.enableRisingEdge(); state = RADIO_RX_ACK; } } return; default: return; } } async event void XE1205Fifo.readDone(error_t error) { switch(state) { case RADIO_RX_HEADER: rxFrameLen = signal XE1205PhyRxTx.rxFrameBegin(rxFrame, headerLen); if (rxFrameLen <= headerLen) { call Interrupt1.disable(); call Alarm32khz16.stop(); signal XE1205PhyRxTx.rxFrameEnd(NULL, 0, FAIL); call XE1205PatternConf.loadDataPatternHasBus(); armPatternDetect(); call SpiResourceRX.release(); atomic { state = RADIO_LISTEN; call Interrupt0.enableRisingEdge(); } return; } atomic { if(rssiRange==RSSI_OFF) { getRssi(); } } rxFrameIndex = headerLen; computeNextRxLength(); state = RADIO_RX_PACKET; return; case RADIO_RX_PACKET_LAST: call Alarm32khz16.stop(); atomic { call XE1205PatternConf.loadDataPatternHasBus(); armPatternDetect(); state = RADIO_LISTEN; call Interrupt0.enableRisingEdge(); call SpiResourceRX.release(); } if( enableAck == FALSE) { signal XE1205PhyRxTx.rxFrameEnd(rxFrame, rxFrameLen + headerLen, SUCCESS); } else { enableAck = FALSE; signal XE1205PhyRxTx.rxAckEnd(rxFrame, rxFrameLen + headerLen, SUCCESS); } return; case RADIO_RX_PACKET: call Interrupt1.enableRisingEdge(); return; default: xe1205check(10, FAIL); return; } } async event void XE1205Fifo.writeDone(error_t error) __attribute__ ((noinline)) { } async event void Alarm32khz16.fired() { switch(state) { case RADIO_STARTING: call SpiResourceConfig.request(); return; case RADIO_LISTEN: case RADIO_RX_HEADER: case RADIO_RX_PACKET: if (rssiRange!=RSSI_OFF) { readRssi(); return; } stats_rxOverruns++; signal XE1205PhyRxTx.rxFrameEnd(NULL, 0, FAIL); call XE1205PatternConf.loadDataPatternHasBus(); armPatternDetect(); call SpiResourceRX.release(); atomic { state = RADIO_LISTEN; call Interrupt0.enableRisingEdge(); } return; case RADIO_RSSI: readRssi(); return; case RADIO_RX_ACK: // ack timeout enableAck = FALSE; call SpiResourceRX.immediateRequest(); signal XE1205PhyRxTx.rxFrameEnd(NULL, 0, FAIL); call XE1205PatternConf.loadDataPatternHasBus(); armPatternDetect(); call SpiResourceRX.release(); atomic { state = RADIO_LISTEN; call Interrupt0.enableRisingEdge(); } signal XE1205PhyRxTx.sendFrameDone(ENOACK); return; default: return; } } } tinyos-2.1.2+dfsg/tos/chips/xe1205/phy/XE1205PhyRssi.nc000066400000000000000000000002301207233610700221030ustar00rootroot00000000000000interface XE1205PhyRssi { async command error_t getRssi(); async command uint8_t readRxRssi(); async event void rssiDone(uint8_t _rssi); } tinyos-2.1.2+dfsg/tos/chips/xe1205/phy/XE1205PhyRxTx.nc000066400000000000000000000112601207233610700220750ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * @author Henri Dubois-Ferriere * */ interface XE1205PhyRxTx { /** * Send a buffer. This call will be followed up with continueSend() events * (see below) until the client module indicates that there is nothing left to send. * * @param data a pointer to an array of bytes to send * @param len length of the array (6 <= len <= 16) * @return error SUCCESS if the operation initiated successfully, otherwise EOFF, EBUSY, EINVAL, or FAIL. * */ async command error_t sendFrame(char* data, uint8_t len); /** * Signalled by the Phy layer to fetch more bytes to send. * * @param len pointer to length field indicating number of bytes in next send. If 0, nothing more to send. * @return pointer to bytes to be sent. If NULL, nothing more to send. * */ async event char* continueSend(uint8_t* len); /** * Signalled after the last buffer has been sent, where the 'last buffer' is the one following which * the client module returned NULL to continueSendBuf(). * */ async event void sendFrameDone(error_t err); /** * Receive a frame header. This is called when 'len' bytes have been received after * detecting a preamble, where 'len' is the value set by calling setRxHeaderLen. * * The client should return the total number to read in this frame (which can be * equal to len, for example if this frame is a short ack code). * * @param data pointer to frame header * @param len length of frame header * @return total number of bytes in this frame (including header bytes). * */ async event uint8_t rxFrameBegin(char* data, uint8_t len); /** * Signalled at end of a frame reception. * * @param data pointer to frame (at first byte of header) * @param len length of frame * @param status SUCCESS if packet received ok, ERROR if packet reception was aborted. * */ async event void rxFrameEnd(char* data, uint8_t len, error_t status); /** * Signalled at end of a Ack reception. * * @param data pointer to Ack (at first byte of header) * @param len length of the Ack * @param status SUCCESS if packet received ok, ERROR if packet reception was aborted. * */ async event void rxAckEnd(char* data, uint8_t len, error_t status); /** * Set header size, ie number of bytes at start of packet to be read and passed along * with the rxFrameBegin() event. * * @param len length of header, 2 <= len <= 8 * */ async command void setRxHeaderLen(uint8_t len); /** * Get the current header size. * * @return header size * */ async command uint8_t getRxHeaderLen(); /** * Check busy/idle state of phy. * * @return TRUE if phy is sending or receiving a packet, FALSE otherwise. * */ async command bool busy(); /** * Check on/off state of phy. * * @return TRUE if phy is idle, standby, starting, or stopping, FALSE otherwise. * */ async command bool off(); async command void enableAck(bool onOff); } tinyos-2.1.2+dfsg/tos/chips/xe1205/phy/XE1205PhySwitch.nc000066400000000000000000000047671207233610700224470ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * Interface for phy mode switches on XE1205 radio. * * @author Henri Dubois-Ferriere * */ interface XE1205PhySwitch { /** * Power down the XE1205. */ async command void sleepMode(); /** * Set the XE1205 to standby mode, i.e. oscillator running but everything else disabled. */ async command void standbyMode(); /** * Set the XE1205 to receive mode. */ async command void rxMode(); /** * Set the XE1205 to transmit mode. */ async command void txMode(); /** * Disconnect the antenna from both receiver and transmitter. */ async command void antennaOff(); /** * Connect the antenna to the receiver. */ async command void antennaRx(); /** * Connect the antenna to the transmitter. */ async command void antennaTx(); } tinyos-2.1.2+dfsg/tos/chips/xe1205/phy/XE1205PhySwitchC.nc000066400000000000000000000046711207233610700225440ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * @author Henri Dubois-Ferriere * */ configuration XE1205PhySwitchC { provides interface XE1205PhySwitch; } implementation { components XE1205PhySwitchP; XE1205PhySwitch = XE1205PhySwitchP; components HplXE1205PinsC; XE1205PhySwitchP.AntSelTXPin -> HplXE1205PinsC.AntSelTXPin; XE1205PhySwitchP.AntSelRXPin -> HplXE1205PinsC.AntSelRXPin; XE1205PhySwitchP.DataPin -> HplXE1205PinsC.DataPin; XE1205PhySwitchP.ModeSel0Pin -> HplXE1205PinsC.ModeSel0Pin; XE1205PhySwitchP.ModeSel1Pin -> HplXE1205PinsC.ModeSel1Pin; XE1205PhySwitchP.Irq0Pin -> HplXE1205PinsC.Irq0Pin; XE1205PhySwitchP.Irq1Pin -> HplXE1205PinsC.Irq1Pin; components MainC; MainC.SoftwareInit -> XE1205PhySwitchP.Init; } tinyos-2.1.2+dfsg/tos/chips/xe1205/phy/XE1205PhySwitchP.nc000066400000000000000000000071561207233610700225620ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * @author Henri Dubois-Ferriere * */ module XE1205PhySwitchP { provides interface XE1205PhySwitch; provides interface Init @atleastonce(); uses interface GeneralIO as AntSelTXPin; uses interface GeneralIO as AntSelRXPin; uses interface GeneralIO as DataPin; // only used in continuous mode, not currently supported uses interface GeneralIO as ModeSel0Pin; uses interface GeneralIO as ModeSel1Pin; uses interface GeneralIO as Irq0Pin; uses interface GeneralIO as Irq1Pin; } implementation { command error_t Init.init() { call ModeSel0Pin.makeOutput(); call ModeSel1Pin.makeOutput(); call AntSelTXPin.makeOutput(); call AntSelRXPin.makeOutput(); call DataPin.makeOutput(); call XE1205PhySwitch.standbyMode(); return SUCCESS; } async command void XE1205PhySwitch.sleepMode() { call ModeSel0Pin.clr(); call ModeSel1Pin.clr(); call Irq0Pin.makeOutput(); call Irq1Pin.makeOutput(); call DataPin.makeOutput(); } async command void XE1205PhySwitch.standbyMode() { call ModeSel0Pin.set(); call ModeSel1Pin.set(); call Irq0Pin.makeOutput(); call Irq1Pin.makeOutput(); call DataPin.makeOutput(); } async command void XE1205PhySwitch.rxMode() { call Irq0Pin.makeInput(); call Irq1Pin.makeInput(); call DataPin.makeInput(); call ModeSel0Pin.set(); call ModeSel1Pin.clr(); } async command void XE1205PhySwitch.txMode() { call Irq0Pin.makeInput(); call Irq1Pin.makeInput(); call DataPin.makeOutput(); call ModeSel1Pin.set(); call ModeSel0Pin.clr(); } async command void XE1205PhySwitch.antennaOff() { call AntSelRXPin.clr(); call AntSelTXPin.clr(); } async command void XE1205PhySwitch.antennaRx() { call AntSelRXPin.set(); call AntSelTXPin.clr(); } async command void XE1205PhySwitch.antennaTx() { call AntSelRXPin.clr(); call AntSelTXPin.set(); } } tinyos-2.1.2+dfsg/tos/chips/xe1205/xe1205debug.h000066400000000000000000000006571207233610700207340ustar00rootroot00000000000000uint8_t var; uint16_t lasterr; void xe1205error(uint8_t loc, uint8_t value_) __attribute__ ((noinline)) { // this is just to make sure the compiler doesn't optimize // out calls to this function, since we use it as a gdb breakpoint atomic var += value_ + loc; } void xe1205check(uint8_t loc, error_t err) __attribute__ ((noinline)) { if (err != SUCCESS) { atomic lasterr = loc; xe1205error(loc, err); } } tinyos-2.1.2+dfsg/tos/interfaces/000077500000000000000000000000001207233610700167115ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/interfaces/AMPacket.nc000066400000000000000000000165541207233610700206730ustar00rootroot00000000000000// $Id: AMPacket.nc,v 1.8 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2004-5 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-5 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The Active Message accessors, which provide the AM local address and * functionality for querying packets. Active Messages are a single-hop * communication protocol. Therefore, fields such as source and destination * represent the single-hop source and destination. Multihop sources and * destinations are defined by the corresponding multihop protocol (if any). * Also see the Packet interface. * * @author Philip Levis * @date January 18 2005 * @see Packet * @see AMSend * @see TEP 116: Packet Protocols */ #include #include interface AMPacket { /** * Return the node's active message address associated with this AM stack. * @return The address */ command am_addr_t address(); /** * Return the AM address of the destination of the AM packet. * If amsg is not an AM packet, the results of this command * are undefined. * @param 'message_t* ONE amsg' the packet * @return the destination address of the packet. */ command am_addr_t destination(message_t* amsg); /** * Return the AM address of the source of the AM packet. * If amsg is not an AM packet, the results of this command * are undefined. * @param 'message_t* ONE amsg' the packet * @return the source address of the packet. */ command am_addr_t source(message_t* amsg); /** * Set the AM address of the destination field of the AM packet. As * the AM address is set as part of sending with the AMSend * interface, this command is not used for sending packets. Rather, * it is used when a component, such as a queue, needs to buffer a * request to send. The component can save the destination address * and then recover it when actually sending. If amsg is * not an AM packet, the results of this command are undefined. * * @param 'message_t* ONE amsg' the packet * @param addr the address */ command void setDestination(message_t* amsg, am_addr_t addr); /** * Set the AM address of the source field of the AM packet. As * the AM address is set as part of sending with the AMSend * interface, this command is not used for sending packets. Rather, * it is used when a component, such as a queue, needs to buffer a * request to send. The component can save the source address * and then recover it when actually sending. As an AM layer generally * sets the source address to be the local address, this interface * is not commonly used except when a system is bypassing the AM * layer (e.g., a protocol bridge). If amsg is * not an AM packet, the results of this command are undefined. * * @param 'message_t* ONE amsg' the packet * @param addr the address */ command void setSource(message_t* amsg, am_addr_t addr); /** * Return whether amsg is destined for this mote. This is * partially a shortcut for testing whether the return value of * destination and address are the same. It * may, however, include additional logic. For example, there * may be an AM broadcast address: destination will return * the broadcast address, but address will still be * the mote's local address. If amsg is not an AM packet, * the results of this command are undefined. * * @param 'message_t* ONE amsg' the packet * @return whether the packet is addressed to this AM stack */ command bool isForMe(message_t* amsg); /** * Return the AM type of the AM packet. * If amsg is not an AM packet, the results of this command * are undefined. * * @param 'message_t* ONE amsg' the packet * @return the AM type */ command am_id_t type(message_t* amsg); /** * Set the AM type of the AM packet. As the AM type is set as part * of sending with the AMSend interface, this command is not used * for sending packets. Instead, it is used when a component, such * as a queue, needs to buffer a request to send. The component can * save the AM type in the packet then recover it when actually * sending. If amsg is not an AM packet, the results of * this command are undefined. * * @param 'message_t* ONE amsg' the packet * @param t the AM type */ command void setType(message_t* amsg, am_id_t t); /** * Get the AM group of the AM packet. The AM group is a logical * identifier that distinguishes sets of nodes which may share * a physical communication medium but wish to not communicate. * The AM group logically separates the sets of nodes. When * a node sends a packet, it fills in its AM group, and typically * nodes only receive packets whose AM group field matches their * own. * * @param 'message_t* ONE amsg' the packet * @return the AM group of this packet */ command am_group_t group(message_t* amsg); /** * Set the AM group field of a packet. Note that most data link * stacks will set this field automatically on a send request, which * may overwrite changes made with this command. * * @param 'message_t* ONE amsg' the packet * @param group the packet's new AM group value */ command void setGroup(message_t* amsg, am_group_t grp); /** * Provides the current AM group of this communication interface. * * @return The AM group. */ command am_group_t localGroup(); } tinyos-2.1.2+dfsg/tos/interfaces/AMSend.nc000066400000000000000000000125261207233610700203500ustar00rootroot00000000000000// $Id: AMSend.nc,v 1.8 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** The basic active message message sending interface. Also see * Packet, Receive, and Send. * * @author Philip Levis * @date January 5 2005 * @see Packet * @see AMPacket * @see Receive * @see TEP 116: Packet Protocols */ #include #include #include interface AMSend { /** * Send a packet with a data payload of len to address * addr. To determine the maximum available size, use the * Packet interface of the component providing AMSend. If send * returns SUCCESS, then the component will signal the sendDone * event in the future; if send returns an error, it will not * signal the event. Note that a component may accept a send * request which it later finds it cannot satisfy; in this case, it * will signal sendDone with error code. * * @param addr address to which to send the packet * @param 'message_t* ONE msg' the packet * @param len the length of the data in the packet payload * @return SUCCESS if the request to send succeeded and a * sendDone will be signaled later, EBUSY if the * abstraction cannot send now but will be able to * later, or FAIL if the communication layer is not * in a state that can send (e.g., off). * @see sendDone */ command error_t send(am_addr_t addr, message_t* msg, uint8_t len); /** * Cancel a requested transmission. Returns SUCCESS if the * transmission was canceled properly (not sent in its * entirety). Note that the component may not know * if the send was successfully canceled, if the radio is * handling much of the logic; in this case, a component * should be conservative and return an appropriate error code. * A successful call to cancel must always result in a * sendFailed event, and never a sendSucceeded event. * * @param 'message_t* ONE msg' the packet whose transmission should be cancelled. * @return SUCCESS if the transmission was cancelled, FAIL otherwise. * @see sendDone */ command error_t cancel(message_t* msg); /** * Signaled in response to an accepted send request. msg is * the message buffer sent, and error indicates whether * the send was successful. * * @param 'message_t* ONE msg' the packet which was submitted as a send request * @param error SUCCESS if it was sent successfully, FAIL if it was not, * ECANCEL if it was cancelled * @see send * @see cancel */ event void sendDone(message_t* msg, error_t error); /** * Return the maximum payload length that this communication layer * can provide. This command behaves identically to * Packet.maxPayloadLength and is included in this * interface as a convenience. * * @return the maximum payload length */ command uint8_t maxPayloadLength(); /** * Return a pointer to a protocol's payload region in a packet. * This command behaves identically to Packet.getPayload * (minus the length parameter) and is included in this interface * as a convenience. * * @param 'message_t* ONE msg' the packet * @return 'void* COUNT(len)' the payload of the packet */ command void* getPayload(message_t* msg, uint8_t len); } tinyos-2.1.2+dfsg/tos/interfaces/ActiveMessageAddress.nc000066400000000000000000000043121207233610700232610ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "AM.h" /** * @author Phil Levis * @author David Moss */ interface ActiveMessageAddress { /** * Set the active message address of this node * @param group The node's group ID * @param addr The node's active message address */ async command void setAddress(am_group_t group, am_addr_t addr); /** * @return the active message address of this node */ async command am_addr_t amAddress(); /** * @return the group address of this node */ async command am_group_t amGroup(); /** * Notification that the address or group settings changed. */ async event void changed(); } tinyos-2.1.2+dfsg/tos/interfaces/AdcConfigure.nc000066400000000000000000000052261207233610700215710ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:14 $ * @author: Jan Hauer * ======================================================================== */ /** * This interface is intended to be provided by an ADC client and used by the * ADC subsystem to retrieve the client's ADC configuration. * * @author Jan Hauer * @see Please refer to TEP 101 for more information about this interface and * its intended use. */ interface AdcConfigure { /** * Returns the configuration of an ADC client. adc_config_t is * a hardware specific data type that contains all information necessary to * configure the respective ADC hardware for the client. A client MUST always * return the same configuration and, if configuration data is passed as a * pointer, the ADC subsystem (HIL component) MUST NOT reference it after the * return of this command. * * @return chip specific configuration. */ async command adc_config_t getConfiguration(); } tinyos-2.1.2+dfsg/tos/interfaces/ArbiterInfo.nc000066400000000000000000000105311207233610700214370ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2010-06-29 22:07:46 $ * ======================================================================== */ /** * Please refer to TEP 108 for more information about this interface and its * intended use.

      * * The ArbiterInfo interface allows a component to query the current * status of an arbiter. It must be provided by ALL arbiter implementations, * and can be used for a variety of different purposes. Normally it will be * used in conjunction with the Resource interface for performing run time * checks on access rights to a particular shared resource. * * @author Kevin Klues (klueska@cs.wustl.edu) */ interface ArbiterInfo { /** * Check whether a resource is currently allocated. * * @return TRUE If the resource being arbitrated is currently allocated * to any of its users
      * FALSE Otherwise. */ async command bool inUse(); /** * Get the id of the client currently using a resource. * * @return Id of the current owner of the resource
      * 0xFF if no one currently owns the resource */ async command uint8_t userId(); } tinyos-2.1.2+dfsg/tos/interfaces/AsyncStdControl.nc000066400000000000000000000107031207233610700223250ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2010-06-29 22:07:46 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this interface and its * intended use.

      * * This is the asynchronous counterpart to the StdContol interface. It * should be used for switching between the on and off power states of * the component providing it. This interface differs from the * StdControl interface only in the fact that any of its commands can * be called from asynchronous context. * * @author Joe Polastre * @author Kevin Klues (klueska@cs.wustl.edu) */ interface AsyncStdControl { /** * Start this component and all of its subcomponents. * * @return SUCCESS if the component was either already on or was * successfully turned on
      * FAIL otherwise */ async command error_t start(); /** * Stop the component and any pertinent subcomponents (not all * subcomponents may be turned off due to wakeup timers, etc.). * * @return SUCCESS if the component was either already off or was * successfully turned off
      * FAIL otherwise */ async command error_t stop(); } tinyos-2.1.2+dfsg/tos/interfaces/BigQueue.nc000066400000000000000000000064511207233610700207470ustar00rootroot00000000000000/* $Id: BigQueue.nc,v 1.2 2007-09-19 17:29:17 klueska Exp $ */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to a FIFO list (queue) that contains items * of a specific type. The queue has a maximum size. * * @author Philip Levis * @author Kyle Jamieson * @date $Date: 2007-09-19 17:29:17 $ */ interface BigQueue { /** * Returns if the queue is empty. * * @return Whether the queue is empty. */ command bool empty(); /** * The number of elements currently in the queue. * Always less than or equal to maxSize(). * * @return The number of elements in the queue. */ command uint16_t size(); /** * The maximum number of elements the queue can hold. * * @return The maximum queue size. */ command uint16_t maxSize(); /** * Get the head of the queue without removing it. If the queue * is empty, the return value is undefined. * * @return The head of the queue. */ command t head(); /** * Remove the head of the queue. If the queue is empty, the return * value is undefined. * * @return The head of the queue. */ command t dequeue(); /** * Enqueue an element to the tail of the queue. * * @param newVal - the element to enqueue * @return SUCCESS if the element was enqueued successfully, FAIL * if it was not enqueued. */ command error_t enqueue(t newVal); /** * Return the nth element of the queue without dequeueing it, * where 0 is the head of the queue and (size - 1) is the tail. * If the element requested is larger than the current queue size, * the return value is undefined. * * @param index - the index of the element to return * @return the requested element in the queue. */ command t element(uint16_t idx); } tinyos-2.1.2+dfsg/tos/interfaces/BitVector.nc000066400000000000000000000052631207233610700211420ustar00rootroot00000000000000//$Id: BitVector.nc,v 1.5 2010-06-29 22:07:46 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to a bit vector. * * @author Cory Sharp */ interface BitVector { /** * Clear all bits in the vector. */ async command void clearAll(); /** * Set all bits in the vector. */ async command void setAll(); /** * Read a bit from the vector. * @param bitnum Bit to read. * @return Bit value. */ async command bool get(uint16_t bitnum); /** * Set a bit in the vector. * @param bitnum Bit to set. */ async command void set(uint16_t bitnum); /** * Set a bit in the vector. * @param bitnum Bit to clear. */ async command void clear(uint16_t bitnum); /** * Toggle a bit in the vector. * @param bitnum Bit to toggle. */ async command void toggle(uint16_t bitnum); /** * Write a bit in the vector. * @param bitnum Bit to clear. * @param value New bit value. */ async command void assign(uint16_t bitnum, bool value); /** * Return bit vector length. * @return Bit vector length. */ async command uint16_t size(); } tinyos-2.1.2+dfsg/tos/interfaces/BlockRead.nc000066400000000000000000000075461207233610700210750ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Read interface for the block storage abstraction described in * TEP103. * * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2008-06-04 03:00:25 $ */ #include "Storage.h" interface BlockRead { /** * Initiate a read operation within a given volume. On SUCCESS, the * readDone event will signal completion of the * operation. * * @param addr starting address to begin reading. * @param 'void* COUNT(len) buf' buffer to place read data. * @param len number of bytes to read. * @return *

    1. SUCCESS if the request was accepted, *
    2. EINVAL if the parameters are invalid *
    3. EBUSY if a request is already being processed. */ command error_t read(storage_addr_t addr, void* buf, storage_len_t len); /** * Signals the completion of a read operation. * * @param addr starting address of read. * @param 'void* COUNT(len) buf' buffer where read data was placed. * @param len number of bytes read. * @param error SUCCESS if the operation was successful, FAIL if * it failed */ event void readDone(storage_addr_t addr, void* buf, storage_len_t len, error_t error); /** * Initiate a crc computation. On SUCCESS, the * computeCrcDone event will signal completion of the * operation. * * @param addr starting address. * @param len the number of bytes to compute the crc over. * @parm crc initial CRC value * @return *
    4. SUCCESS if the request was accepted, *
    5. EINVAL if the parameters are invalid *
    6. EBUSY if a request is already being processed. */ command error_t computeCrc(storage_addr_t addr, storage_len_t len, uint16_t crc); /** * Signals the completion of a crc computation. * * @param addr stating address. * @param len number of bytes the crc was computed over. * @param crc the resulting crc value. * @param error SUCCESS if the operation was successful, FAIL if * it failed */ event void computeCrcDone(storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error); /** * Report the usable volume size in bytes (this may be different than * the actual volume size because of metadata overheads). * @return Volume size. */ command storage_len_t getSize(); } tinyos-2.1.2+dfsg/tos/interfaces/BlockWrite.nc000066400000000000000000000101151207233610700212760ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Write interface for the block storage abstraction described in * TEP103. * * @author Jonathan Hui * @version $Revision: 1.6 $ $Date: 2008-06-04 03:00:25 $ */ #include "Storage.h" interface BlockWrite { /** * Initiate a write operation within a given volume. On SUCCESS, the * writeDone event will signal completion of the * operation. *

      * Between two erases, no byte may be written more than once. * * @param addr starting address to begin write. * @param 'void* COUNT(len) buf' buffer to write data from. * @param len number of bytes to write. * @return *

    7. SUCCESS if the request was accepted, *
    8. EINVAL if the parameters are invalid *
    9. EBUSY if a request is already being processed. */ command error_t write(storage_addr_t addr, void* buf, storage_len_t len); /** * Signals the completion of a write operation. However, data is not * guaranteed to survive a power-cycle unless a sync operation has * been completed. * * @param addr starting address of write. * @param 'void* COUNT(len) buf' buffer that written data was read from. * @param len number of bytes written. * @param error SUCCESS if the operation was successful, FAIL if * it failed */ event void writeDone(storage_addr_t addr, void* buf, storage_len_t len, error_t error); /** * Initiate an erase operation. On SUCCESS, the * eraseDone event will signal completion of the * operation. * * @return *
    10. SUCCESS if the request was accepted, *
    11. EBUSY if a request is already being processed. */ command error_t erase(); /** * Signals the completion of an erase operation. * * @param error SUCCESS if the operation was successful, FAIL if * it failed */ event void eraseDone(error_t error); /** * Initiate a sync operation to finalize writes to the volume. A * sync operation must be issued to ensure that data is stored in * non-volatile storage. On SUCCES, the syncDone event * will signal completion of the operation. * * @return *
    12. SUCCESS if the request was accepted, *
    13. EBUSY if a request is already being processed. */ command error_t sync(); /** * Signals the completion of a sync operation. All written data is * flushed to non-volatile storage after this event. * * @param error SUCCESS if the operation was successful, FAIL if * it failed */ event void syncDone(error_t error); } tinyos-2.1.2+dfsg/tos/interfaces/Boot.nc000066400000000000000000000047551207233610700201510ustar00rootroot00000000000000// $Id: Boot.nc,v 1.6 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2004-5 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-5 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Interface that notifies components when TinyOS has booted * (initialized all of its components), as discussed in TEP 107. * * @author Philip Levis * @date January 5 2005 */ interface Boot { /** * Signaled when the system has booted successfully. Components can * assume the system has been initialized properly. Services may * need to be started to work, however. * * @see StdControl * @see SplitConrol * @see TEP 107: Boot Sequence */ event void booted(); } tinyos-2.1.2+dfsg/tos/interfaces/Cache.nc000066400000000000000000000046411207233610700202430ustar00rootroot00000000000000/* * Copyright (c) 2006 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * A data item cache. The cache does not own the items it caches: * there is no allocation/deallocation policy, or notification of * eviction. Correspondingly, using references (pointers) as data * items can be difficult. * * @author Rodrigo Fonseca * @author Philip Levis */ interface Cache { /** * Inserts an item in the cache, evicting if necessary. * An atomic lookup after insert should return true. * * @param item - the data item to insert. */ command void insert(t item); /** * Return whether the data item is in the cache. * * @param item - the data item to query * @return Whether the item is in the cache. */ command bool lookup(t item); /** * Flush the cache of all entries. * */ command void flush(); } tinyos-2.1.2+dfsg/tos/interfaces/CoAPClient.nc000066400000000000000000000103301207233610700211510ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include typedef uint8_t method_t; interface CoAPClient { /** * Sends a new CoAP request. * * The CoAP library handles PDU retransmissions automatically. * If/when a response is received, @c request_done will be called. * Only a single CoAP request can be handled at a time. * * @param dest Address of CoAP server to send the request to. * @param method CoAP method type (COAP_REQUEST_GET, COAP_REQUEST_PUT). * @param optlist All CoAP options to include, ordered correctly. * @param len Payload length, if the request will have a payload. * @param data Payload data. May be NULL if len is zero. * @returns SUCCESS if the request is sent. */ command error_t request(struct sockaddr_in6 *dest, method_t method, coap_list_t *optlist, uint16_t len, void *data); /** * Similar to @c request, but can handle large payloads in the request via * the CoAP block mechanism. * * Payload data is requested as-needed via the @c streamed_next_block event. * * Not yet implemented. * * TODO: Implement! * * @param dest Address of CoAP server to send the request to. * @param method CoAP method type (COAP_REQUEST_GET, COAP_REQUEST_PUT). * @param optlist All CoAP options to include, ordered correctly. * @returns SUCCESS if the request is sent. */ command error_t streamed_request(struct sockaddr_in6 *dest, method_t method, coap_list_t *optlist); /** * Called in response to a @c streamed_request to obtain payload data. * * @param blockno The payload block number. * @param len On entry set to the desired payload block length. When the end * of the payload data is reached, @c len must be set to the length of the * final block. Returning less payload data than requested is not permitted * except for the final block. * @param data Receives the pointer to the next block of payload data. * @returns SUCCESS if the payload data block could be provided. */ event error_t streamed_next_block(uint16_t blockno, uint16_t *len, void **data); /** * Called when a response is received. * * TODO: Implement support for CoAP block responses. * * @param code The CoAP response code (in 3.5 packed format). * @param mediatype Response payload media type, if applicable. * @param len The length of any payload data, or zero if no response payload. * @param data Response payload data, if any. * @param more If set, the response is using block transfer and there are * further data blocks expected. The final block does not have this flag * set. */ event void request_done(uint8_t code, uint8_t mediatype, uint16_t len, void *data, bool more); } tinyos-2.1.2+dfsg/tos/interfaces/CoAPServer.nc000066400000000000000000000040751207233610700212120ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "tinyos_coap_resources.h" interface CoAPServer { /* * bind a local address. */ command error_t bind(uint16_t port); /* * register the .wellknown/core resource */ command error_t registerWellknownCore(); /* * register a TinyOS resource with libcoap */ command error_t registerResource(char uri[MAX_URI_LENGTH], unsigned int uri_length, unsigned char mediatype, unsigned int writable, unsigned int splitphase, unsigned int immediately); } tinyos-2.1.2+dfsg/tos/interfaces/ConfigStorage.nc000066400000000000000000000134671207233610700220000ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Read interface for the log storage abstraction described in * TEP103. * * @author Jonathan Hui * @author David Gay * @version $Revision: 1.5 $ $Date: 2008-06-04 03:00:25 $ */ #include "Storage.h" interface ConfigStorage { /** * Initiate a read operation within a given volume. On SUCCESS, the * readDone event will signal completion of the * operation. The data read is the contents of the config volume * as of the last commit operation. * * @param addr starting address to begin reading. * @param 'void* COUNT(len) buf' buffer to place read data. * @param len number of bytes to read. * @return *
    14. SUCCESS if the request was accepted, *
    15. EINVAL if the parameters are invalid *
    16. EOFF if the volume has not been mounted *
    17. EBUSY if a request is already being processed. *
    18. FAIL if the volume does not contain valid data * (see valid) */ command error_t read(storage_addr_t addr, void* buf, storage_len_t len); /** * Signals the completion of a read operation. * * @param addr starting address of read. * @param 'void* COUNT(len) buf' buffer where read data was placed. * @param len number of bytes read. * @param error SUCCESS if the operation was successful, FAIL if * it failed */ event void readDone(storage_addr_t addr, void* buf, storage_len_t len, error_t error); /** * Initiate a write operation within a given volume. On SUCCESS, the * writeDone event will signal completion of the * operation. * * @param addr starting address to begin write. * @param 'void* COUNT(len) buf' buffer to write data from. * @param len number of bytes to write. * @return *
    19. SUCCESS if the request was accepted, *
    20. EINVAL if the parameters are invalid *
    21. EOFF if the volume has not been mounted *
    22. EBUSY if a request is already being processed. */ command error_t write(storage_addr_t addr, void* buf, storage_len_t len); /** * Signals the completion of a write operation. However, data is not * guaranteed to survive a power-cycle unless a commit operation has * been completed. * * @param addr starting address of write. * @param 'void* COUNT(len) buf' buffer that written data was read from. * @param len number of bytes written. * @param error SUCCESS if the operation was successful, FAIL if * it failed */ event void writeDone(storage_addr_t addr, void* buf, storage_len_t len, error_t error); /** * Initiate a commit operation and finialize any additional writes to the * volume. A commit operation must be issued to ensure that data is * stored in non-volatile storage. On SUCCES, the commitDone * event will signal completion of the operation. * * @return *
    23. SUCCESS if the request was accepted, *
    24. EBUSY if a request is already being processed. *
    25. EOFF if the volume has not been mounted */ command error_t commit(); /** * Signals the completion of a commit operation. All written data is * flushed to non-volatile storage after this event. * * @param error SUCCESS if the operation was successful, FAIL if * it failed */ event void commitDone(error_t error); /** * Report the usable volume size in bytes (this may be significantly * different from the actual volume size, e.g., it's approximately * half the volume size on the AT45DB implementation). * * @return Volume size. The result is undefined if the volume hasn't * been mounted. */ command storage_len_t getSize(); /** * Report whether this config volume contains valid data. Committing * a volume makes it valid. * * @return TRUE if the volume contains valid data, FALSE otherwise. The * result is undefined if the volume hasn't been mounted. */ command bool valid(); } tinyos-2.1.2+dfsg/tos/interfaces/Crc.nc000066400000000000000000000047671207233610700177600ustar00rootroot00000000000000/* * * Copyright (c) 2000-2007 The Regents of the University of * California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Compute the CRC-16 value of a byte array. * * @author Jonathan Hui * @author David Moss */ interface Crc { /** * Compute the CRC-16 value of a byte array. * * @param 'void* COUNT(len) buf' A pointer to the buffer over which to compute CRC. * @param len The length of the buffer over which to compute CRC. * @return The CRC-16 value. */ async command uint16_t crc16(void* buf, uint8_t len); /** * Compute a generic CRC-16 using a given seed. Used to compute CRC's * of discontinuous data. * * @param startCrc An initial CRC value to begin with * @param 'void* COUNT(len) buf' A pointer to a buffer of data * @param len The length of the buffer * @return The CRC-16 value. */ async command uint16_t seededCrc16(uint16_t startCrc, void *buf, uint8_t len); } tinyos-2.1.2+dfsg/tos/interfaces/CsmaBackoff.nc000066400000000000000000000044471207233610700214030ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface for MAC Backoff values from the radio stack. * Allows application to change the backoff on a per packet basis. * Only used if congestion control is enabled. * * @author Joe Polastre */ interface CsmaBackoff { /** * Return initial backoff time before attempting to send message m. The * units are radio dependent. * @param 'message_t* ONE m' * @return Initial backoff time */ async event uint16_t initial(message_t* m); /** * Return backoff time after message m could not be send due to congestion. * The units are raio dependent. * @param 'message_t* ONE m' * @return Backoff time after congestion */ async event uint16_t congestion(message_t* m); } tinyos-2.1.2+dfsg/tos/interfaces/DeviceMetadata.nc000066400000000000000000000035521207233610700221000ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DeviceMetadata is a way to obtain information about a generic data * access device represented by a SID. See TEP109 and TEP114 for details. * * @author Gilman Tolle * @version $Revision: 1.1 $ */ interface DeviceMetadata { command uint8_t getSignificantBits(); } tinyos-2.1.2+dfsg/tos/interfaces/FastSpiByte.nc000066400000000000000000000061251207233610700214340ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ /** * This is a natural extension of the SpiByte interface which allows fast * data transfers comparable to the SpiStream interface. You may want to * use the following code sequence to write a buffer as fast as possible * * uint8_t *data; * uint8_t *response; * * // start the first byte * call FastSpiByte.splitWrite(data[0]); * for(i = 1; i < length; ++i) { * // finish the previous one and write the next one * response[i-1] = call FastSpiByte.splitReadWrite(data[i]); * } * // finish the last byte * response[length-1] = call FastSpiByte.splitRead(); * * You can also do some useful computation (like calculate a CRC) while the * hardware is sending the byte. */ interface FastSpiByte { /** * Starts a split-phase SPI data transfer with the given data. * A splitRead/splitReadWrite command must follow this command even * if the result is unimportant. */ async command void splitWrite(uint8_t data); /** * Finishes the split-phase SPI data transfer by waiting till * the write command comletes and returning the received data. */ async command uint8_t splitRead(); /** * This command first reads the SPI register and then writes * there the new data, then returns. */ async command uint8_t splitReadWrite(uint8_t data); /** * This is the standard SpiByte.write command but a little * faster as we should not need to adjust the power state there. * (To be consistent, this command could have be named splitWriteRead). */ async command uint8_t write(uint8_t data); } tinyos-2.1.2+dfsg/tos/interfaces/GeneralIO.nc000066400000000000000000000037011207233610700210410ustar00rootroot00000000000000// $Id: GeneralIO.nc,v 1.5 2010-06-29 22:07:46 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre */ interface GeneralIO { async command void set(); async command void clr(); async command void toggle(); async command bool get(); async command void makeInput(); async command bool isInput(); async command void makeOutput(); async command bool isOutput(); } tinyos-2.1.2+dfsg/tos/interfaces/Get.nc000066400000000000000000000043421207233610700177550ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The Get interface is intended for synchronous reading of small * values. The type of the value is given as a template * argument. Generally, these values are backed by memory or * computation. Because no error code is included, the get() call must * be guaranteed to succeed. * *

      * See TEP114 - SIDs: Source and Sink Independent Drivers for details. * * @param val_t the type of the object that will be returned * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ interface Get { /** * Retrieves a value of type val_t. * * @return the value itself */ command val_t get(); } tinyos-2.1.2+dfsg/tos/interfaces/GetNow.nc000066400000000000000000000043701207233610700204420ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2008-06-10 14:41:42 $ * @author Jan Hauer * ======================================================================== */ /** * Similar to the Get interface (see TEP 114) this interface can be * used for reading small values, but in contrast to the Get interface * the value is read asynchronously. * * @param data_type the type of the object that will be returned */ interface GetNow { /** * Returns a value of type data_type. * * @return the value itself */ async command data_type getNow(); } tinyos-2.1.2+dfsg/tos/interfaces/GetSet.nc000066400000000000000000000047121207233610700204320ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The GetSet interface is intended for synchronous reading and * writing of small values. The type of the value is given as a * template argument. Generally, these values are backed by memory or * computation. Because no error code is included, both calls must be * guaranteed to succeed. This interface should be used when a single * logical unit supports both getting and setting. * *

      * See TEP114 - SIDs: Source and Sink Independent Drivers for details. * * @param val_t the type of the object that will be stored * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ interface GetSet { /** * Retrieves a value of type val_t. * * @return the value itself */ command val_t get(); /** * Stores a value of type val_t. * * @param val the value to be stored */ command void set( val_t val ); } tinyos-2.1.2+dfsg/tos/interfaces/GpioCapture.nc000066400000000000000000000044751207233610700214670ustar00rootroot00000000000000// $Id: GpioCapture.nc,v 1.5 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface for microcontroller-independent 32kHz timer capture events. * * @author Jonathan Hui * @author Philip Levis * @author Joe Polastre * @date September 30 2005 * */ #include "TinyError.h" interface GpioCapture { /** * Enable an edge based timer capture event. * * @return Whether the timer capture has been enabled. */ async command error_t captureRisingEdge(); async command error_t captureFallingEdge(); /** * Fired when an edge interrupt occurs. * * @param val The value of the 32kHz timer. */ async event void captured(uint16_t time); /** * Disable further captures. */ async command void disable(); } tinyos-2.1.2+dfsg/tos/interfaces/GpioInterrupt.nc000066400000000000000000000047371207233610700220610ustar00rootroot00000000000000// $Id: GpioInterrupt.nc,v 1.5 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui * @author Joe Polastre * Revision: $Revision: 1.5 $ * * Provides a microcontroller-independent presentation of interrupts */ interface GpioInterrupt { /** * Enable an edge based interrupt. Calls to these functions are * not cumulative: only the transition type of the last called function * will be monitored for. * * * @return SUCCESS if the interrupt has been enabled */ async command error_t enableRisingEdge(); async command error_t enableFallingEdge(); /** * Diables an edge interrupt or capture interrupt * * @return SUCCESS if the interrupt has been disabled */ async command error_t disable(); /** * Fired when an edge interrupt occurs. * * NOTE: Interrupts keep running until "disable()" is called */ async event void fired(); } tinyos-2.1.2+dfsg/tos/interfaces/I2CPacket.nc000066400000000000000000000120121207233610700207340ustar00rootroot00000000000000// $Id: I2CPacket.nc,v 1.7 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * I2C Packet/buffer interface for sending data over the I2C bus. * The address, length, and buffer must be specified. The I2C bus then * has control of that buffer and returns it when the operation has * completed. The I2CPacket interface supports master-mode communication * and provides for multiple repeated STARTs and multiple reads/writes * within the same START transaction. * The interface is typed according to the address size supported by * the master hardware. Masters capable of supporting extended (10-bit) * I2C addressing MUST export both types. Applications should use the * smallest address size to ensure best portability. * * @param addr_size A type indicating the slave address size. Supported * values are TI2CExtdAddr (for 10-bit addressing) and TI2CBasicAddr (7-bit * addressing). * * @author Joe Polastre * @author Phil Buonadonna * @author Jonathan Hui * @author Phil Levis * Revision: $Revision: 1.7 $ */ #include interface I2CPacket { /** * Perform an I2C read operation * * @param flags Flags that may be logical ORed and defined by: * I2C_START - The START condition is transmitted at the beginning * of the packet if set. * I2C_STOP - The STOP condition is transmitted at the end of the * packet if set. * I2C_ACK_END - ACK the last byte if set. Otherwise NACK last byte. This * flag cannot be used with the I2C_STOP flag. * @param addr The slave device address. Only used if I2C_START is set. * @param length Length, in bytes, to be read * @param 'uint8_t* COUNT(length) data' A point to a data buffer to read into * * @return SUCCESS if bus available and request accepted. */ async command error_t read(i2c_flags_t flags, uint16_t addr, uint8_t length, uint8_t* data); /** * Perform an I2C write operation * * @param flags Flags that may be logical ORed and defined by: * I2C_START - The START condition is transmitted at the beginning * of the packet if set. * I2C_STOP - The STOP condition is transmitted at the end of the * packet if set. * @param addr The slave device address. Only used if I2C_START is set. * @param length Length, in bytes, to be read * @param 'uint8_t* COUNT(length) data' A point to a data buffer to read into * * @return SUCCESS if bus available and request accepted. */ async command error_t write(i2c_flags_t flags, uint16_t addr, uint8_t length, uint8_t* data); /** * Notification that the read operation has completed * * @param addr The slave device address * @param length Length, in bytes, read * @param 'uint8_t* COUNT(length) data' Pointer to the received data buffer * @param success SUCCESS if transfer completed without error. */ async event void readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data); /** * Notification that the write operation has completed * * @param addr The slave device address * @param length Length, in bytes, written * @param 'uint8_t* COUNT(length) data' Pointer to the data buffer written * @param success SUCCESS if transfer completed without error. */ async event void writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data); } tinyos-2.1.2+dfsg/tos/interfaces/Ieee154Packet.nc000066400000000000000000000041341207233610700214660ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include interface Ieee154Packet { command ieee154_saddr_t address(); command ieee154_saddr_t destination(message_t* msg); command ieee154_saddr_t source(message_t* msg); command void setDestination(message_t* msg, ieee154_saddr_t addr); command void setSource(message_t* msg, ieee154_saddr_t addr); command bool isForMe(message_t* msg); command ieee154_panid_t pan(message_t* msg); command void setPan(message_t* msg, ieee154_panid_t grp); command ieee154_panid_t localPan(); } tinyos-2.1.2+dfsg/tos/interfaces/Ieee154Send.nc000066400000000000000000000114021207233610700211440ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include #include #include /* * * The only change from the AMSend interface is that instead of * sending to an AMID, we now send to a ieee154_saddr_t. * */ interface Ieee154Send { /** * Send a packet with a data payload of len to address * addr. To determine the maximum available size, use the * Packet interface of the component providing AMSend. If send * returns SUCCESS, then the component will signal the sendDone * event in the future; if send returns an error, it will not * signal the event. Note that a component may accept a send * request which it later finds it cannot satisfy; in this case, it * will signal sendDone with error code. * * @param addr address to which to send the packet * @param msg the packet * @param len the length of the data in the packet payload * @return SUCCESS if the request to send succeeded and a * sendDone will be signaled later, EBUSY if the * abstraction cannot send now but will be able to * later, or FAIL if the communication layer is not * in a state that can send (e.g., off). * @see sendDone */ command error_t send(ieee154_saddr_t addr, message_t* msg, uint8_t len); /** * Cancel a requested transmission. Returns SUCCESS if the * transmission was canceled properly (not sent in its * entirety). Note that the component may not know * if the send was successfully canceled, if the radio is * handling much of the logic; in this case, a component * should be conservative and return an appropriate error code. * A successful call to cancel must always result in a * sendFailed event, and never a sendSucceeded event. * * @param msg the packet whose transmission should be cancelled. * @return SUCCESS if the transmission was cancelled, FAIL otherwise. * @see sendDone */ command error_t cancel(message_t* msg); /** * Signaled in response to an accepted send request. msg is * the message buffer sent, and error indicates whether * the send was successful. * * @param msg the packet which was submitted as a send request * @param error SUCCESS if it was sent successfully, FAIL if it was not, * ECANCEL if it was cancelled * @see send * @see cancel */ event void sendDone(message_t* msg, error_t error); /** * Return the maximum payload length that this communication layer * can provide. This command behaves identically to * Packet.maxPayloadLength and is included in this * interface as a convenience. * * @return the maximum payload length */ command uint8_t maxPayloadLength(); /** * Return a pointer to a protocol's payload region in a packet. * This command behaves identically to Packet.getPayload * (minus the length parameter) and is included in this interface * as a convenience. * * @param msg the packet * @return the payload of the packet */ command void* getPayload(message_t* msg, uint8_t len); } tinyos-2.1.2+dfsg/tos/interfaces/Init.nc000066400000000000000000000047341207233610700201460ustar00rootroot00000000000000// $Id: Init.nc,v 1.6 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2004-5 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-5 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** The basic synchronous initialization interface. * * @author Philip Levis * @date January 17 2005 */ #include "TinyError.h" interface Init { /** * Initialize this component. Initialization should not assume that * any component is running: init() cannot call any commands besides * those that initialize other components. * * @return SUCCESS if initialized properly, FAIL otherwise. * @see TEP 107: Boot Sequence * */ command error_t init(); } tinyos-2.1.2+dfsg/tos/interfaces/Intercept.nc000066400000000000000000000017331207233610700211740ustar00rootroot00000000000000/** * Allows protocol layers above the routing layer to perform data * aggregation or make application-specific decisions on whether to * forward via the return value of the forward event. * * @author Philip Levis * @author Kyle Jamieson * @version $Id: Intercept.nc,v 1.6 2008-06-04 03:00:26 regehr Exp $ * @see TEP 116: Packet Protocols, TEP 119: Collection */ #include #include interface Intercept { /** * Signals that a message has been received, which is supposed to be * forwarded to another destination. * * @param 'message_t* ONE msg' The complete message received. * * @param 'void* COUNT(len) payload' The payload portion of the packet for this * protocol layer. * * @param len The length of the payload buffer. * * @return TRUE indicates the packet should be forwarded, FALSE * indicates that it should not be forwarded. * */ event bool forward(message_t* msg, void* payload, uint8_t len); } tinyos-2.1.2+dfsg/tos/interfaces/InternalFlash.nc000066400000000000000000000056711207233610700217760ustar00rootroot00000000000000/* * * Copyright (c) 2000-2007 The Regents of the University of * California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * A generic interface to read from and write to the internal flash of * a microcontroller. * * @author Jonathan Hui * @author Prabal Dutta (Port to T2) */ interface InternalFlash { /** * Read size bytes starting from addr and * return them in buf. * * @param addr A pointer to the starting address from which to read. * @param 'void* COUNT(size) buf' A pointer to the buffer into which read bytes are * placed. * @param size The number of bytes to read. * @return SUCCESS if the bytes were successfully read. * FAIL if the call could not be completed. */ command error_t read(void* addr, void* buf, uint16_t size); /** * Write size bytes from buf into internal * flash starting at addr. * * @param addr A pointer to the starting address to which to write. * @param 'void* COUNT(size) buf' A pointer to the buffer from which bytes are read. * @param size The number of bytes to write. * @return SUCCESS if the bytes were successfully written. * FAIL if the call could not be completed. */ command error_t write(void* addr, void* buf, uint16_t size); } tinyos-2.1.2+dfsg/tos/interfaces/Led.nc000066400000000000000000000043101207233610700177350ustar00rootroot00000000000000/* * Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** An interface to control a single LED. * * Provides the ability to turn on, turn off, and toggle an LED. * * Implementations of this interface are provided by the LedC * component, both as positional names (Led0) and by color (Green). * * @author Peter A. Bigot */ interface Led { /** Turn the LED on. */ async command void on (); /** Turn the LED off. */ async command void off (); /** Turn the LED on or off, depending on parameter. * @param turn_on if TRUE, turn LED on; otherwise turn LED off */ async command void set (bool turn_on); /** Toggle the LED. */ async command void toggle (); } tinyos-2.1.2+dfsg/tos/interfaces/Leds.nc000066400000000000000000000111071207233610700201220ustar00rootroot00000000000000// $Id: Leds.nc,v 1.6 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2005-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Commands for controlling three LEDs. A platform can provide this * interface if it has more than or fewer than three LEDs. In the * former case, these commands refer to the first three LEDs. In the * latter case, some of the commands are null operations, and the set * of non-null operations must be contiguous and start at Led1. That * is, on platforms with 2 LEDs, LED 3's commands are null operations, * while on platforms with 1 LED, LED 2 and LED 3's commands are null * opertations. * * @author Joe Polastre * @author Philip Levis */ #include "Leds.h" interface Leds { /** * Turn on LED 0. The color of this LED depends on the platform. */ async command void led0On(); /** * Turn off LED 0. The color of this LED depends on the platform. */ async command void led0Off(); /** * Toggle LED 0; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led0Toggle(); /** * Turn on LED 1. The color of this LED depends on the platform. */ async command void led1On(); /** * Turn off LED 1. The color of this LED depends on the platform. */ async command void led1Off(); /** * Toggle LED 1; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led1Toggle(); /** * Turn on LED 2. The color of this LED depends on the platform. */ async command void led2On(); /** * Turn off LED 2. The color of this LED depends on the platform. */ async command void led2Off(); /** * Toggle LED 2; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led2Toggle(); /** * Get the current LED settings as a bitmask. Each bit corresponds to * whether an LED is on; bit 0 is LED 0, bit 1 is LED 1, etc. You can * also use the enums LEDS_LED0, LEDS_LED1. For example, this expression * will determine whether LED 2 is on: * *

       (call Leds.get() & LEDS_LED2) 
      * * This command supports up to 8 LEDs; if a platform has fewer, then * those LEDs should always be off (their bit is zero). Also see * set(). * * @return a bitmask describing which LEDs are on and which are off */ async command uint8_t get(); /** * Set the current LED configuration using a bitmask. Each bit * corresponds to whether an LED is on; bit 0 is LED 0, bit 1 is LED * 1, etc. You can also use the enums LEDS_LED0, LEDS_LED1. For example, * this statement will configure the LEDs so LED 0 and LED 2 are on: * *
       call Leds.set(LEDS_LED0 | LEDS_LED2); 
      * * This statement will turn LED 1 on if it was not already: * *
      call Leds.set(call Leds.get() | LEDS_LED1);
      * * @param val a bitmask describing the on/off settings of the LEDs */ async command void set(uint8_t val); } tinyos-2.1.2+dfsg/tos/interfaces/LibCoAP.nc000066400000000000000000000037141207233610700204510ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include interface LibCoAP { /* * */ command coap_tid_t send(coap_context_t *ctx, struct sockaddr_in6 *dst, coap_pdu_t *pdu, int free_pdu); /* * */ command error_t bind(uint16_t port); /* * */ event void read(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip6_metadata *meta); } tinyos-2.1.2+dfsg/tos/interfaces/LinkPacketMetadata.nc000066400000000000000000000042101207233610700227160ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This interface provides metadata associated with a link layer packet. * @author Philip Levis */ interface LinkPacketMetadata { /** * Return true if the channel during this packet had high quality (few bit errors). * A good rule of thumb for "high quality" is that the channel quality * would enable MTU packets to have a reception rate of 90% or greater. * * @param 'message_t* ONE msg' A received packet during which the channel was measured. * @return Whether the channel had high quality. */ async command bool highChannelQuality(message_t* msg); } tinyos-2.1.2+dfsg/tos/interfaces/LocalIeeeEui64.nc000066400000000000000000000037021207233610700216740ustar00rootroot00000000000000// $Id: LocalIeeeEui64.nc,v 1.2 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai * Author: Gilman Tolle, Jonathan Hui (TEP 122) */ #include "IeeeEui64.h" /** * Interface to read the 64-bit IEEE EUI. * */ interface LocalIeeeEui64 { /** * Get the 64-bit IEEE EUI. * @returns the 64-bit IEEE EUI type, defined in tos/types/IeeeEui64.h */ command ieee_eui64_t getId(); } tinyos-2.1.2+dfsg/tos/interfaces/LogRead.nc000066400000000000000000000117061207233610700205550ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Read interface for the log storage abstraction described in * TEP103. * * @author Jonathan Hui * @author David Gay * @version $Revision: 1.5 $ $Date: 2008-06-04 03:00:29 $ */ #include "Storage.h" interface LogRead { /** * Initiate a read operation from the current position within a given log * volume. On SUCCESS, the readDone event will signal * completion of the operation. * * @param 'void* COUNT(len) buf' buffer to place read data. * @param len number of bytes to read. * @return *
    26. SUCCESS if the request was accepted, *
    27. EBUSY if a request is already being processed. */ command error_t read(void* buf, storage_len_t len); /** * Signals the completion of a read operation. The current read position is * advanced by len bytes. * * @param addr starting address of read. * @param 'void* COUNT(len) buf' buffer where read data was placed. * @param len number of bytes read - this may be less than requested * (even equal to 0) if the end of the log was reached * @param error SUCCESS if read was possible, FAIL otherwise */ event void readDone(void* buf, storage_len_t len, error_t error); /** * Return a "cookie" representing the current read offset within the * log. This cookie can be used in a subsequent seek operation to * return to the same place in the log (if it hasn't been overwritten). * * @return Cookie representing current offset. * SEEK_BEGINNING will be returned if:
        *
      • a write in a circular log overwrote the previous read position *
      • seek was passed a cookie representing a position before the * current beginning of a circular log *
      * Note that SEEK_BEGINNING can also be returned at * other times (just after erasing a log, etc). */ command storage_cookie_t currentOffset(); /** * Set the read position in the log, using a cookie returned by the * currentOffset commands of LogRead or * LogWrite, or the special value SEEK_BEGINNING. * * If the specified position has been overwritten, the read position * will be set to the beginning of the log. * * @return *
    28. SUCCESS if the request was accepted, *
    29. EBUSY if a request is already being processed. */ command error_t seek(storage_cookie_t offset); /** * Report success of seek operation. If SUCCESS is returned, * the read position has been changed as requested. If other values are * returned, the read position is undefined. * * @param error SUCCESS if the seek was succesful, EINVAL if the cookie * was invalid and FAIL for other errors. */ event void seekDone(error_t error); /** * Report approximate log capacity in bytes. Note that use of * sync, failures and general overhead may reduce the number * of bytes available to the log. * * @return Volume size. */ command storage_len_t getSize(); } tinyos-2.1.2+dfsg/tos/interfaces/LogWrite.nc000066400000000000000000000106761207233610700210010ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Write interface for the log storage abstraction described in * TEP103. * * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2008-06-04 03:00:29 $ */ #include "Storage.h" interface LogWrite { /** * Append data to a given volume. On SUCCESS, the appendDone * event will signal completion of the operation. * * @param 'void* COUNT(len) buf' buffer to write data from. * @param len number of bytes to write. * @return *
    30. SUCCESS if the request was accepted, *
    31. EINVAL if the request is invalid (len too large). *
    32. EBUSY if a request is already being processed. */ command error_t append(void* buf, storage_len_t len); /** * Signals the completion of an append operation. However, data is not * guaranteed to survive a power-cycle unless a commit operation has * been completed. * * @param 'void* COUNT(len) buf' buffer that written data was read from. * @param len number of bytes actually written (valid even in case of error) * @param records_lost TRUE if this append destroyed some old records from * the beginning of the log (only possible for circular logs). * @param error SUCCESS if append was possible, ESIZE if the (linear) log * is full and FAIL for other errors. */ event void appendDone(void* buf, storage_len_t len, bool recordsLost, error_t error); /** * Return a "cookie" representing the current append offset within the * log. This cookie can be used in a subsequent seek operation (see * LogRead to start reading from this place in the log (if * it hasn't been overwritten). * * The current write position is not known before the first read, append, * seek, erase or sync. * * @return Cookie representing current offset. */ command storage_cookie_t currentOffset(); /** * Initiate an erase operation. On SUCCESS, the * eraseDone event will signal completion of the * operation. * * @return *
    33. SUCCESS if the request was accepted, *
    34. EBUSY if a request is already being processed. */ command error_t erase(); /** * Signals the completion of an erase operation. * * @param error SUCCESS if the log was erased, FAIL otherwise. */ event void eraseDone(error_t error); /** * Ensure all writes are present on flash, and that failure in subsequent * writes cannot cause loss of earlier writes. On SUCCES, the * commitDone event will signal completion of the operation. * * @return *
    35. SUCCESS if the request was accepted, *
    36. EBUSY if a request is already being processed. */ command error_t sync(); /** * Signals the successful or unsuccessful completion of a sync operation. * * @param error SUCCESS if the log was synchronised, FAIL otherwise. */ event void syncDone(error_t error); } tinyos-2.1.2+dfsg/tos/interfaces/LowPowerListening.nc000066400000000000000000000055661207233610700227020ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Low Power Listening interface * * @author Jonathan Hui * @author David Moss */ #include "message.h" interface LowPowerListening { /** * Set this this node's radio wakeup interval, in milliseconds. After * each interval, the node will wakeup and check for radio activity. * * Note: The wakeup interval can be set to 0 to indicate that the radio * should stay on all the time but in order to get a startDone this * should only be done when the duty-cycling is off (after a stopDone). * * @param intervalMs the length of this node's Rx check interval, in [ms] */ command void setLocalWakeupInterval(uint16_t intervalMs); /** * @return the local node's wakeup interval, in [ms] */ command uint16_t getLocalWakeupInterval(); /** * Configure this outgoing message so it can be transmitted to a neighbor mote * with the specified wakeup interval. * @param 'message_t* ONE msg' Pointer to the message that will be sent * @param intervalMs The receiving node's wakeup interval, in [ms] */ command void setRemoteWakeupInterval(message_t *msg, uint16_t intervalMs); /** * @param 'message_t* ONE msg' * @return the destination node's wakeup interval configured in this message */ command uint16_t getRemoteWakeupInterval(message_t *msg); } tinyos-2.1.2+dfsg/tos/interfaces/McuPowerOverride.nc000066400000000000000000000051611207233610700224770ustar00rootroot00000000000000/// $Id: McuPowerOverride.nc,v 1.5 2010-06-29 22:07:46 scipio Exp $ /** * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface to allow high-level components to set a lower bound for a * microcontroller's low power state. This is sometimes necessary, * e.g., if a very low power state has a long wakeup latency that will * violate application timing requirements. TEP 112 describes how * TinyOS incorporates this information when the Scheduler tells * the MCU to enter a low power state. * * @author Philip Levis * @date Oct 26, 2005 * @see TEP 112: Microconroller Power Management */ #include "hardware.h" interface McuPowerOverride { /** * Called when computing the low power state, in order to allow * a high-level component to institute a lower bound. Because * this command originates deep within the basic TinyOS scheduling * mechanisms, it should be used very sparingly. Refer to TEP 112 for * details. * * @return the lowest power state the system can enter to meet the * requirements of this component */ async command mcu_power_t lowestState(); } tinyos-2.1.2+dfsg/tos/interfaces/McuPowerState.nc000066400000000000000000000043161207233610700220010ustar00rootroot00000000000000/// $Id: McuPowerState.nc,v 1.5 2010-06-29 22:07:46 scipio Exp $ /** * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface to instruct TinyOS that the low-power state of the MCU * may have changed. TEP 112 describes how an MCU computes this state * and how the Scheduler uses this interface to manage system power * draw. * * @author Philip Levis * @date Oct 26, 2005 * @see TEP 112: Microcontroller Power Management */ interface McuPowerState { /** * Called by any component to tell TinyOS that the MCU low * power state may have changed. Generally, this should be * called whenever a peripheral/timer is started/stopped. */ async command void update(); } tinyos-2.1.2+dfsg/tos/interfaces/McuSleep.nc000066400000000000000000000071001207233610700207460ustar00rootroot00000000000000/// $Id: McuSleep.nc,v 1.5 2010-06-29 22:07:46 scipio Exp $ /** * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to instruct the MCU to enter a low power state. TEP112 * describes how an MCU computes this state and how the Scheduler uses * this interface to manage system power draw. * * @author Philip Levis * @author Martin Turon * @date Oct 26, 2005 * */ interface McuSleep { /** Called by the scheduler to put the MCU to sleep. */ async command void sleep(); } tinyos-2.1.2+dfsg/tos/interfaces/Mount.nc000066400000000000000000000023051207233610700203350ustar00rootroot00000000000000/* Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Mount a volume. * * @author David Gay * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ interface Mount { /** * Mount a particular volume. This must be done before the volume's * first use. mountDone will be signaled if SUCCESS is * returned. * @return SUCCESS if mount request is accepted, FAIL if mount has * already been attempted. */ command error_t mount(); /** * Report success or failure of mount operation. If the mount failed, * no operation should be perfomed on the volume. Note that success * should not be used to indicate that the volume contains valid data, * rather failure indicates some major internal problem that prevents * the volume from being used. * * @param error SUCCESS if the mount succeeded, FAIL otherwise. */ event void mountDone(error_t error); } tinyos-2.1.2+dfsg/tos/interfaces/MultiLed.nc000066400000000000000000000055371207233610700207640ustar00rootroot00000000000000/* * Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** An interface to control a series of LEDs. * * Allows use of a series of LEDs as a visual binary register. Bit i * of the value is a 1 iff LED i is on. * * This interface is generically implemented by the LedC component. * * @author Peter A. Bigot */ interface MultiLed { /** Read the value represented by the on status of the LEDs. */ async command unsigned int get (); /** Set the LEDs to represent the given value. */ async command void set (unsigned int val); /** Invoke the Led.on() function for the specified LED. * @param led_id Position of LED to turn on, starting with LED 0 */ async command void on (unsigned int led_id); /** Invoke the Led.off() function for the specified LED. * @param led_id Position of LED to turn on, starting with LED 0 */ async command void off (unsigned int led_id); /** Invoke the Led.set() function for the specified LED. * @param led_id Position of LED to turn on, starting with LED 0 * @param turn_on if TRUE, turn LED on; otherwise turn it off */ async command void setSingle (unsigned int led_id, bool turn_on); /** Invoke the Led.toggle() function for the specified LED. * @param led_id Position of LED to turn on, starting with LED 0 */ async command void toggle (unsigned int led_id); } tinyos-2.1.2+dfsg/tos/interfaces/Notify.nc000066400000000000000000000056031207233610700205070ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The Notify interface is intended for delivery of values from * self-triggered devices, at relatively low rates. For example, a * driver for a motion detector or a switch might provide this * interface. The type of the value is given as a template * argument. Generally, these values are backed by memory or * computation. Because no error code is included, both calls must be * guaranteed to succeed. This interface should be used when a single * logical unit supports both getting and setting. * *

      * See TEP114 - SIDs: Source and Sink Independent Drivers for details. * * @param val_t the type of the object that will be stored * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ interface Notify { /** * Enables delivery of notifications from the device to the calling * generic client component. * * @return SUCCESS if notifications were enabled */ command error_t enable(); /** * Disables delivery of notifications from the device to the calling * generic client component. * * @return SUCCESS if notifications were disabled */ command error_t disable(); /** * Signals the arrival of a new value from the device. * * @param val the value arriving from the device */ event void notify( val_t val ); } tinyos-2.1.2+dfsg/tos/interfaces/Packet.nc000066400000000000000000000120541207233610700204440ustar00rootroot00000000000000// $Id: Packet.nc,v 1.9 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2004-5 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-5 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The basic message data type accessors. Protocols may use * additional packet interfaces for their protocol specific * data/metadata. * * @author Philip Levis * @date January 5 2005 * @see TEP 116: Packet Protocols */ #include interface Packet { /** * Clear out this packet. Note that this is a deep operation and * total operation: calling clear() on any layer will completely * clear the packet for reuse. * @param 'message_t* ONE msg' the packet to clear */ command void clear(message_t* msg); /** * Return the length of the payload of msg. This value may be less * than what maxPayloadLength() returns, if the packet is smaller than * the MTU. If a communication component does not support variably * sized data regions, then payloadLength() will always return * the same value as maxPayloadLength(). * * @param 'message_t* ONE msg' the packet to examine * @return the length of its current payload */ command uint8_t payloadLength(message_t* msg); /** * Set the length field of the packet. This value is not checked * for validity (e.g., if it is larger than the maximum payload * size). This command is not used when sending packets, as calls * to send include a length parameter. Rather, it is used by * components, such as queues, that need to buffer requests to * send. This command allows the component to store the length * specified in the request and later recover it when actually * sending. * * @param 'message_t* ONE msg' the packet * @param len the value to set its length field to */ command void setPayloadLength(message_t* msg, uint8_t len); /** * Return the maximum payload length that this communication layer * can provide. Note that, depending on protocol fields, a given * request to send a packet may not be able to send the maximum * payload length (e.g., if there are variable length * fields). Protocols may provide specialized interfaces for these * circumstances. * * @return the maximum size payload allowed by this layer */ command uint8_t maxPayloadLength(); /** * Return a pointer to a protocol's payload region in a packet. * If the caller intends to write to the payload region then * the len parameter must reflect the maximum required * length. If the caller (only) wants to read from the payload * region, then len may be set to the value of * payloadLength(). If the payload region is smaller than * len this command returns NULL. The offset where * the payload region starts within a packet is fixed, i.e. for * a given msg this command will always return the same * pointer or NULL. * * @param 'message_t* ONE msg' the packet * @param len the length of payload required * @return 'void* COUNT_NOK(len)' a pointer to the packet's data payload for this layer * or NULL if len is too big */ command void* getPayload(message_t* msg, uint8_t len); } tinyos-2.1.2+dfsg/tos/interfaces/PacketAcknowledgements.nc000066400000000000000000000065331207233610700236640ustar00rootroot00000000000000/* * Copyright (c) 2000-2006 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * This interface allows a component to enable or disable acknowledgments * on a per-packet basis. * * @author Jonathan Hui * @author Philip Levis * @author Joe Polastre * @date June 21 2006 */ interface PacketAcknowledgements { /** * Tell a protocol that when it sends this packet, it should use synchronous * acknowledgments. * The acknowledgment is synchronous as the caller can check whether the * ack was received through the wasAcked() command as soon as a send operation * completes. * * @param 'message_t* ONE msg' - A message which should be acknowledged when transmitted. * @return SUCCESS if acknowledgements are enabled, EBUSY * if the communication layer cannot enable them at this time, FAIL * if it does not support them. */ async command error_t requestAck( message_t* msg ); /** * Tell a protocol that when it sends this packet, it should not use * synchronous acknowledgments. * * @param 'message_t* ONE msg' - A message which should not be acknowledged when transmitted. * @return SUCCESS if acknowledgements are disabled, EBUSY * if the communication layer cannot disable them at this time, FAIL * if it cannot support unacknowledged communication. */ async command error_t noAck( message_t* msg ); /** * Tell a caller whether or not a transmitted packet was acknowledged. * If acknowledgments on the packet had been disabled through noAck(), * then the return value is undefined. If a packet * layer does not support acknowledgements, this command must return always * return FALSE. * * @param 'message_t* ONE msg' - A transmitted message. * @return Whether the packet was acknowledged. * */ async command bool wasAcked(message_t* msg); } tinyos-2.1.2+dfsg/tos/interfaces/PacketLink.nc000066400000000000000000000051321207233610700212610ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author David Moss * @author Jon Wyant */ interface PacketLink { /** * Set the maximum number of times attempt message delivery * Default is 0 * @param 'message_t* ONE msg' * @param maxRetries the maximum number of attempts to deliver * the message */ command void setRetries(message_t *msg, uint16_t maxRetries); /** * Set a delay between each retry attempt * @param msg * @param retryDelay the delay betweeen retry attempts, in milliseconds */ command void setRetryDelay(message_t *msg, uint16_t retryDelay); /** * @param 'message_t* ONE msg' * @return the maximum number of retry attempts for this message */ command uint16_t getRetries(message_t *msg); /** * @param 'message_t* ONE msg' * @return the delay between retry attempts in ms for this message */ command uint16_t getRetryDelay(message_t *msg); /** * @param 'message_t* ONE msg' * @return TRUE if the message was delivered. */ command bool wasDelivered(message_t *msg); } tinyos-2.1.2+dfsg/tos/interfaces/PacketTimeStamp.nc000066400000000000000000000064521207233610700222750ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface PacketTimeStamp { /** * @param 'message_t *ONE msg' Message to examine. * * Returns TRUE if the time stamp of the message is valid. Under special * circumstances the radio chip might not be able to correctly assign a * precise time value to an incoming packet (e.g. under very heavy traffic * multiple interrupts can occur before they could be serviced, and even * if capture registers are used, it is not possible to get the time stamp * for the first or last unserviced event), in which case the time stamp * value should not be used. It is recommended that the isValid command be * called from the receive or sendDone event handler. */ async command bool isValid(message_t* msg); /** * @param 'message_t *ONE msg' Message to get timestamp from. * * Return the time stamp for the given message. Please check with the * isValid command if this value can be relied upon. If this command is * called after transmission, then the transmit time of the packet * is returned (the time when the frame synchronization byte was * transmitted). If this command is called after the message is received, * the tne receive time of the message is returned. It is recommended that * the timestamp command be called only from the receive or sendDone event * handler. */ async command size_type timestamp(message_t* msg); /** * @param 'message_t *ONE msg' Message to modify. * * Sets the isValid flag to FALSE. */ async command void clear(message_t* msg); /** * @param 'message_t *ONE msg' Message to modify. * * Sets the isValid flag to TRUE and the time stamp value to the * specified value. */ async command void set(message_t* msg, size_type value); } tinyos-2.1.2+dfsg/tos/interfaces/ParameterInit.nc000066400000000000000000000052541207233610700220050ustar00rootroot00000000000000// $Id: ParameterInit.nc,v 1.6 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2004-5 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-5 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * A synchronous initialization interface that takes a single parameter. * * @author Philip Levis * @date June 6 2005 * @see TEP 107: Boot Sequence */ #include "TinyError.h" interface ParameterInit { /** * Initialize this component. Initialization should not assume that * any component is running: init() cannot call any commands besides * those that initialize other components. This command behaves * identically to Init.init, except that it takes a parameter. * * @param param the initialization parameter * @return SUCCESS if initialized properly, FAIL otherwise. */ command error_t init(parameter param); } tinyos-2.1.2+dfsg/tos/interfaces/Pool.nc000066400000000000000000000066731207233610700201600ustar00rootroot00000000000000/* $Id: Pool.nc,v 1.5 2008-06-04 03:00:31 regehr Exp $ */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * An allocation pool of a specific type memory objects. * The Pool allows components to allocate (get) * and deallocate (put) elements. The pool * does not require that deallocations be items which were * originally allocated. E.g., a program can create two * pools of the same type and pass items between them. * This allows, for example, a component to allocate a pool * of message buffers and freely buffer swap them on * Receive.receive events. * * @author Philip Levis * @author Kyle Jamieson * @date $Date: 2008-06-04 03:00:31 $ */ interface Pool { /** * Returns whether there any elements remaining in the pool. * If empty returns TRUE, then get will return * NULL. If empty returns FALSE, then get will * return a pointer to an object. * * @return Whether the pool is empty. */ command bool empty(); /** * Returns how many elements are in the pool. If size * returns 0, empty() will return TRUE. If size returns * a non-zero value, empty() will return FALSE. The * return value of size is always <e; the return * value of maxSize(). * * @return How many elements are in the pool. */ command uint8_t size(); /** * Returns the maximum number of elements in the pool * (the size of a full pool). * * @return Maximum size. */ command uint8_t maxSize(); /** * Deallocate an object, putting it back into the pool. * * @param 't* ONE newVal' * @return SUCCESS if the entry was put in successfully, FAIL * if the pool is full. */ command error_t put(t* newVal); /** * Allocate an element from the pool. * * @return 't* ONE_NOK' A pointer if the pool is not empty, NULL if * the pool is empty. */ command t* get(); } tinyos-2.1.2+dfsg/tos/interfaces/Queue.nc000066400000000000000000000064771207233610700203350ustar00rootroot00000000000000/* $Id: Queue.nc,v 1.5 2008-06-04 03:00:31 regehr Exp $ */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to a FIFO list (queue) that contains items * of a specific type. The queue has a maximum size. * * @author Philip Levis * @author Kyle Jamieson * @date $Date: 2008-06-04 03:00:31 $ */ interface Queue { /** * Returns if the queue is empty. * * @return Whether the queue is empty. */ command bool empty(); /** * The number of elements currently in the queue. * Always less than or equal to maxSize(). * * @return The number of elements in the queue. */ command uint8_t size(); /** * The maximum number of elements the queue can hold. * * @return The maximum queue size. */ command uint8_t maxSize(); /** * Get the head of the queue without removing it. If the queue * is empty, the return value is undefined. * * @return 't ONE' The head of the queue. */ command t head(); /** * Remove the head of the queue. If the queue is empty, the return * value is undefined. * * @return 't ONE' The head of the queue. */ command t dequeue(); /** * Enqueue an element to the tail of the queue. * * @param 't ONE newVal' - the element to enqueue * @return SUCCESS if the element was enqueued successfully, FAIL * if it was not enqueued. */ command error_t enqueue(t newVal); /** * Return the nth element of the queue without dequeueing it, * where 0 is the head of the queue and (size - 1) is the tail. * If the element requested is larger than the current queue size, * the return value is undefined. * * @param index - the index of the element to return * @return 't ONE' the requested element in the queue. */ command t element(uint8_t idx); } tinyos-2.1.2+dfsg/tos/interfaces/README000066400000000000000000000000161207233610700175660ustar00rootroot00000000000000Update this. tinyos-2.1.2+dfsg/tos/interfaces/RadioTimeStamping.nc000066400000000000000000000051131207233610700226130ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface for receiving time stamp information from the radio. * This information is also embedded in packet metadata. * * @author Jonathan Hui * @author Philip Levis * @author Joe Polastre * @date October 10 2005 * */ interface RadioTimeStamping { /** * Provides the time at which start of frame delimiter has been * transmitted: units are in terms of a 32kHz clock. * @param 'message_t* ONE p_msg' */ async event void transmittedSFD( uint16_t time, message_t* p_msg ); /** * Provides the time at which start of frame delimiter was received: * units are in terms of a 32kHz clock. NOTE that receiving * a receivedSFD() event does NOT mean that a packet will be * received; the transmission may stop, become corrupted, or be * filtered by the physical or link layers. The number of rxSFD * events will always be great than or equal to the number of * Receive message events. */ async event void receivedSFD( uint16_t time ); } tinyos-2.1.2+dfsg/tos/interfaces/Random.nc000066400000000000000000000040751207233610700204610ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface for generating 16-bit and 32-bit random numbers. * * @author Barbara Hohlt * @date March 1 2005 */ interface Random { /** * Produces a 32-bit pseudorandom number. * @return Returns the 32-bit pseudorandom number. */ async command uint32_t rand32(); /** * Produces a 32-bit pseudorandom number. * @return Returns low 16 bits of the pseudorandom number. */ async command uint16_t rand16(); } tinyos-2.1.2+dfsg/tos/interfaces/Read.nc000066400000000000000000000047351207233610700201170ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The Read interface is intended for split-phase low-rate or * high-latency reading of small values. The type of the value is * given as a template argument. Because this interface is * split-phase, these values may be backed by hardware, or a * long-running computation. * *

      * See TEP114 - SIDs: Source and Sink Independent Drivers for details. * * @param val_t the type of the object that will be returned * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:14 $ */ interface Read { /** * Initiates a read of the value. * * @return SUCCESS if a readDone() event will eventually come back. */ command error_t read(); /** * Signals the completion of the read(). * * @param result SUCCESS if the read() was successful * @param val the value that has been read */ event void readDone( error_t result, val_t val ); } tinyos-2.1.2+dfsg/tos/interfaces/ReadNow.nc000066400000000000000000000053201207233610700205720ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The ReadNow interface is intended for split-phase low-latency * reading of small values. The type of the value is given as a * template argument. Because this interface is split-phase, these * values may be backed by hardware. Providers of this interface * should also provide a Resource interface, and this interface should * only be used after the resource has been acquired. Otherwise, the * low-latency requirement may be impossible to meet. * *

      * This interface has the same calling semantics as the Read interface * described in TEP 114, except that it is async. * * @param val_t the type of the object that will be returned * * @author Gilman Tolle * @version $Revision: 1.5 $ $Date: 2008-06-16 18:58:51 $ */ interface ReadNow { /** * Initiates a read of the value. * * @return SUCCESS if a readDone() event will eventually come back. */ async command error_t read(); /** * Signals the completion of the read(). * * @param result SUCCESS if the read() was successful * @param val the value that has been read */ async event void readDone( error_t result, val_t val ); } tinyos-2.1.2+dfsg/tos/interfaces/ReadRef.nc000066400000000000000000000054521207233610700205510ustar00rootroot00000000000000/** * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The ReadRef interface is intended for split-phase low-rate or * high-latency reading of large values. The type of the value is * given as a template argument. When a value is too large to be * comfortably passed on the stack, the caller should allocate space * for the value and pass the pointer to read(). When the readDone() * comes back, the space will be filled with the new value. * *

      * See TEP114 - SIDs: Source and Sink Independent Drivers for details. * * @param val_t the type of the object that will be returned * * @author Gilman Tolle * @version $Revision: 1.5 $ $Date: 2008-06-04 03:00:31 $ */ interface ReadRef { /** * Initiates a read of the value. * * @param 'val_t* ONE val' a pointer to space that will be filled by the value * * @return SUCCESS if a readDone() event will eventually come back. */ command error_t read( val_t* val ); /** * Signals the completion of the read(). The returned pointer will * be the same as the original pointer passed to read(). * * @param result SUCCESS if the read() was successful * @param 'val_t* ONE val' a pointer to the value that has been read */ event void readDone( error_t result, val_t* val ); } tinyos-2.1.2+dfsg/tos/interfaces/ReadResource.nc000066400000000000000000000034151207233610700216210ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ interface ReadResource { command int get(coap_tid_t id); event void getDone(error_t result, coap_tid_t id, uint8_t asyn_message, uint8_t* val, size_t buflen); event void getDoneDeferred(coap_tid_t id); } tinyos-2.1.2+dfsg/tos/interfaces/ReadStream.nc000066400000000000000000000105061207233610700212640ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The ReadStream interface is intended for buffered high data rate * reading, usually from sensor devices. The type of the values being * read is given as a template argument. * *

      To use this interface, allocate one or more buffers in your own * space. Then, call postBuffer to pass these buffers into the * device. Call read() to begin the sampling process. The buffers will * be filled in the order originally posted, and a bufferDone() event * will be signaled once each buffer has been filled with data. At any * time while the read() is running, you may post new buffers to be * filled. If the lower layer finishes signaling readDone() and then * finds that no more buffers have been posted, it will consider the * read to be finished, and signal readDone(). * *

      * See TEP114 - SIDs: Source and Sink Independent Drivers for details. * * @param val_t the type of the object that will be returned * * @author Gilman Tolle * @version $Revision: 1.5 $ $Date: 2008-06-04 03:00:31 $ */ interface ReadStream { /** * Passes a buffer to the device, and indicates how many values * should be placed into the buffer. Make sure your count doesn't * overrun the buffer. * * @param 'val_t* COUNT(count) buf' a pointer to the buffer * @param count the number of values the buffer should hold * * @return SUCCESS if the post was successful */ command error_t postBuffer(val_t* buf, uint16_t count); /** * Directs the device to start filling buffers by sampling with the * specified period. * * @param usPeriod the between-sample period in microseconds * * @return SUCCESS if the reading process began */ command error_t read(uint32_t usPeriod); /** * Signalled when a previously posted buffer has been filled by the * device. In the event of a read error, result will not equal * SUCCESS, and the buffer will be filled with zeroes. * * @param result SUCCESS if the buffer was filled without errors * @param 'val_t* COUNT(count) buf' a pointer to the buffer that has been filled * @param count the number of values actually read */ event void bufferDone(error_t result, val_t* buf, uint16_t count); /** * Signalled when a buffer has been filled but no more buffers have * been posted. In the event of a read error, all previously posted * buffers will have their bufferDone() event signalled, and then * this event will be signalled with a non-SUCCESS argument. * * @param result SUCCESS if all buffers were filled without errors * @param usActualPeriod Actual sampling period used - may be different * from period requested at read time. Undefined if result != SUCCESS. */ event void readDone(error_t result, uint32_t usActualPeriod); } tinyos-2.1.2+dfsg/tos/interfaces/Receive.nc000066400000000000000000000064341207233610700206240ustar00rootroot00000000000000// $Id: Receive.nc,v 1.8 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The basic message reception interface. * * @author Philip Levis * @date November 16, 2004 * @see Packet * @see Send * @see TEP 116: Packet Protocols */ #include #include interface Receive { /** * Receive a packet buffer, returning a buffer for the signaling * component to use for the next reception. The return value * can be the same as msg, as long as the handling * component copies out the data it needs. * * Note that misuse of this interface is one of the most * common bugs in TinyOS code. For example, if a component both calls a * send on the passed message and returns it, then it is possible * the buffer will be reused before the send occurs, overwriting * the component's data. This would cause the mote to possibly * instead send a packet it most recently received. * * @param 'message_t* ONE msg' the receied packet * @param 'void* COUNT(len) payload' a pointer to the packet's payload * @param len the length of the data region pointed to by payload * @return 'message_t* ONE' a packet buffer for the stack to use for the next * received packet. */ event message_t* receive(message_t* msg, void* payload, uint8_t len); } tinyos-2.1.2+dfsg/tos/interfaces/Resource.nc000066400000000000000000000125651207233610700210330ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Please refer to TEP 108 for more information about this interface and its * intended use.

      * * The Resource interface can be used to gain access to * shared resources. It is always offered as a parameterized * interface, and its users gain access to the resource through some * predefined arbitration policy. * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.6 $ * @date $Date: 2010-06-29 22:07:46 $ */ interface Resource { /** * Request access to a shared resource. You must call release() * when you are done with it. * * @return SUCCESS When a request has been accepted. The granted() * event will be signaled once you have control of the * resource.
      * EBUSY You have already requested this resource and a * granted event is pending */ async command error_t request(); /** * Request immediate access to a shared resource. You must call release() * when you are done with it. * * @return SUCCESS When a request has been accepted.
      * FAIL The request cannot be fulfilled */ async command error_t immediateRequest(); /** * You are now in control of the resource. */ event void granted(); /** * Release a shared resource you previously acquired. * * @return SUCCESS The resource has been released
      * FAIL You tried to release but you are not the * owner of the resource * * @note This command should never be called between putting in a request * and waiting for a granted event. Doing so will result in a * potential race condition. There are ways to guarantee that no * race will occur, but they are clumsy and overly complicated. * Since it doesn't logically make since to be calling * release before receiving a granted event, * we have opted to keep thing simple and warn you about the potential * race. */ async command error_t release(); /** * Check if the user of this interface is the current * owner of the Resource * @return TRUE It is the owner
      * FALSE It is not the owner */ async command bool isOwner(); } tinyos-2.1.2+dfsg/tos/interfaces/ResourceConfigure.nc000066400000000000000000000052311207233610700226650ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2010-06-29 22:07:46 $ * ======================================================================== * */ /** * Please refer to TEP 108 for more information about this interface and its * intended use.

      * * This interface is provided by a Resource arbiter in order to allow * users of a shared resource to configure that resource just before being * granted access to it. It will always be parameterized along side * a parameterized Resource interface, with the ids from one mapping directly * onto the ids of the other. * * @author Kevin Klues (klueska@cs.wustl.edu) */ interface ResourceConfigure { /** * Used to configure a resource just before being granted access to it. * Must always be used in conjuntion with the Resource interface. */ async command void configure(); /** * Used to unconfigure a resource just before releasing it. * Must always be used in conjuntion with the Resource interface. */ async command void unconfigure(); } tinyos-2.1.2+dfsg/tos/interfaces/ResourceDefaultOwner.nc000066400000000000000000000062361207233610700233510ustar00rootroot00000000000000/* * Copyright (c) 2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Please refer to TEP 108 for more information about this interface and its * intended use.

      * * @author Kevin Klues (klues@tkn.tu-berlin.edu) * @version $ $ * @date $Date: 2007-02-04 20:06:42 $ */ interface ResourceDefaultOwner { /** * Event sent to the resource controller giving it control whenever a resource * goes idle. That is to say, whenever no one currently owns the resource, * and there are no more pending requests */ async event void granted(); /** * Release control of the resource * * @return SUCCESS The resource has been released and pending requests * can resume.
      * FAIL You tried to release but you are not the * owner of the resource */ async command error_t release(); /** * Check if the user of this interface is the current * owner of the Resource * * @return TRUE It is the owner
      * FALSE It is not the owner */ async command bool isOwner(); /** * This event is signalled whenever the user of this interface * currently has control of the resource, and another user requests * it through the Resource.request() command. You may want to * consider releasing a resource based on this event */ async event void requested(); /** * This event is signalled whenever the user of this interface * currently has control of the resource, and another user requests * it through the Resource.immediateRequest() command. You may * want to consider releasing a resource based on this event */ async event void immediateRequested(); } tinyos-2.1.2+dfsg/tos/interfaces/ResourceQueue.nc000066400000000000000000000056631207233610700220410ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A queue interface for managing client ids when performing resource * arbitration. A single slot in the queue is guaranteed to each resource * client, with the actual queing policy determined by the implementation * of the interface. * * @author Kevin Klues * @date $Date: 2010-06-29 22:07:46 $ */ #include "Resource.h" interface ResourceQueue { /** * Check to see if the queue is empty. * * @return TRUE if the queue is empty.
      * FALSE if there is at least one entry in the queue */ async command bool isEmpty(); /** * Check to see if a given client id has already been enqueued * and is waiting to be processed. * * @return TRUE if the client id is in the queue.
      * FALSE if it does not */ async command bool isEnqueued(resource_client_id_t id); /** * Retreive the client id of the next resource in the queue. * If the queue is empty, the return value is undefined. * * @return The client id at the head of the queue. */ async command resource_client_id_t dequeue(); /** * Enqueue a client id * * @param clientId - the client id to enqueue * @return SUCCESS if the client id was enqueued successfully
      * EBUSY if it has already been enqueued. */ async command error_t enqueue(resource_client_id_t id); } tinyos-2.1.2+dfsg/tos/interfaces/ResourceRequested.nc000066400000000000000000000051121207233610700227030ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Please refer to TEP 108 for more information about this interface and its * intended use.

      * * The ResourceRequested interface can be used in conjunction with the * Resource interface in order to receive events based on other users * requests. * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.5 $ * @date $Date: 2010-06-29 22:07:46 $ */ interface ResourceRequested { /** * This event is signalled whenever the user of this interface * currently has control of the resource, and another user requests * it through the Resource.request() command. You may want to * consider releasing a resource based on this event */ async event void requested(); /** * This event is signalled whenever the user of this interface * currently has control of the resource, and another user requests * it through the Resource.immediateRequest() command. You may * want to consider releasing a resource based on this event */ async event void immediateRequested(); } tinyos-2.1.2+dfsg/tos/interfaces/Scheduler.nc000066400000000000000000000053611207233610700211560ustar00rootroot00000000000000// $Id: Scheduler.nc,v 1.6 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2004-5 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-5 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The interface to a TinyOS task scheduler. * * @author Philip Levis * @date January 19 2005 * @see TEP 106: Tasks and Schedulers * @see TEP 107: Boot Sequence */ interface Scheduler { /** * Initialize the scheduler. */ command void init(); /** * Run the next task if one is waiting, otherwise return immediately. * * @return whether a task was run -- TRUE indicates a task * ran, FALSE indicates there was no task to run. */ command bool runNextTask(); /** * Enter an infinite task-running loop. Put the MCU into a low power * state when the processor is idle (task queue empty, waiting for * interrupts). This call never returns. */ command void taskLoop(); } tinyos-2.1.2+dfsg/tos/interfaces/Send.nc000066400000000000000000000122251207233610700201260ustar00rootroot00000000000000// $Id: Send.nc,v 1.8 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2004-5 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-5 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The basic address-free message sending interface. * * @author Philip Levis * @date January 5 2005 * @see Packet * @see Receive */ #include #include interface Send { /** * Send a packet with a data payload of len. To determine * the maximum available size, use the Packet interface of the * component providing Send. If send returns SUCCESS, then the * component will signal the sendDone event in the future; if send * returns an error, it will not signal sendDone. Note that a * component may accept a send request which it later finds it * cannot satisfy; in this case, it will signal sendDone with an * appropriate error code. * * @param 'message_t* ONE msg' the packet to send * @param len the length of the packet payload * @return SUCCESS if the request was accepted and will issue * a sendDone event, EBUSY if the component cannot accept * the request now but will be able to later, FAIL * if the stack is in a state that cannot accept requests * (e.g., it's off). */ command error_t send(message_t* msg, uint8_t len); /** * Cancel a requested transmission. Returns SUCCESS if the * transmission was cancelled properly (not sent in its * entirety). Note that the component may not know * if the send was successfully cancelled, if the radio is * handling much of the logic; in this case, a component * should be conservative and return an appropriate error code. * * @param 'message_t* ONE msg' the packet whose transmission should be cancelled * @return SUCCESS if the packet was successfully cancelled, FAIL * otherwise */ command error_t cancel(message_t* msg); /** * Signaled in response to an accepted send request. msg * is the sent buffer, and error indicates whether the * send was succesful, and if not, the cause of the failure. * * @param 'message_t* ONE msg' the message which was requested to send * @param error SUCCESS if it was transmitted successfully, FAIL if * it was not, ECANCEL if it was cancelled via cancel */ event void sendDone(message_t* msg, error_t error); /** * Return the maximum payload length that this communication layer * can provide. This command behaves identically to * Packet.maxPayloadLength and is included in this * interface as a convenience. * * @return the maximum payload length */ command uint8_t maxPayloadLength(); /** * Return a pointer to a protocol's payload region in a packet which * at least a certain length. If the payload region is smaller than * the len parameter, then getPayload returns NULL. This command * behaves identicallt to Packet.getPayload and is * included in this interface as a convenience. * * @param 'message_t* ONE msg' the packet * @return 'void* COUNT_NOK(len)' a pointer to the packet's payload */ command void* getPayload(message_t* msg, uint8_t len); } tinyos-2.1.2+dfsg/tos/interfaces/SendNotifier.nc000066400000000000000000000047201207233610700216270ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * The radio stack notifies the entire system that it is about to send * a packet. Other modules in the system can call back within this event * to modify the packet's metadata. For example, we can setup a module * in the system to make every CTP data packet send with low power listening * enabled: * * event void SendNotifier.aboutToSend[AM_COLLECTION_DATA](uint8_t dest, * message_t *msg) { * call LowPowerListening.setRxSleepInterval(msg, 512); * } * * @author David Moss */ #include "message.h" #include "AM.h" interface SendNotifier { /** * The system is about to send this message. Fill in any last modifications * and the message will be sent. * * @param dest The destination address of the messsage * @param 'message_t* ONE msg' The message about to be transmitted */ event void aboutToSend(am_addr_t dest, message_t *msg); } tinyos-2.1.2+dfsg/tos/interfaces/Set.nc000066400000000000000000000043601207233610700177710ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The Set interface is intended for synchronous writing of small * values. The type of the value is given as a template * argument. Generally, these values are backed by memory or * computation. Because no error code is included, the set() call must * be guaranteed to succeed. * *

      * See TEP114 - SIDs: Source and Sink Independent Drivers for details. * * @param val_t the type of the object that will be stored * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:15 $ */ interface Set { /** * Stores a value of type val_t. * * @param val the value to be stored */ command void set( val_t val ); } tinyos-2.1.2+dfsg/tos/interfaces/SetNow.nc000066400000000000000000000045231207233610700204560ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2008-06-10 14:41:42 $ * @author Jan Hauer * ======================================================================== */ /** * Similar to the Set interface (see TEP 114) this interface can be * used for storing small values, but in contrast to the Set interface * the value is stored asynchronously. * * @param data_type the type of the object that will be stored */ interface SetNow { /** * Stores a value of type data_type. * * @param val the value to be stored * @return SUCCESS if the value was stored, * FAIL otherwise */ async command error_t setNow(data_type val); } tinyos-2.1.2+dfsg/tos/interfaces/SpiByte.nc000066400000000000000000000037551207233610700206240ustar00rootroot00000000000000// $Id: SpiByte.nc,v 1.6 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui * @author Joe Polastre */ interface SpiByte { /** * Synchronous transmit and receive (can be in interrupt context) * @param tx Byte to transmit * @param rx Received byte is stored here. */ async command uint8_t write( uint8_t tx ); } tinyos-2.1.2+dfsg/tos/interfaces/SpiPacket.nc000066400000000000000000000075141207233610700211250ustar00rootroot00000000000000// $Id: SpiPacket.nc,v 1.8 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SPI Packet/buffer interface for sending data over an SPI bus. This * interface provides a split-phase send command which can be used for * sending, receiving or both. It is a "send" command because reading * from the SPI requires writing bytes. The send call allows NULL * parameters for receive or send only operations. This interface is * for buffer based transfers where the microcontroller is the master * (clocking) device. * * Often, an SPI bus must first be acquired using a Resource interface * before sending commands with SPIPacket. In the case of multiple * devices attached to a single SPI bus, chip select pins are often also * used. * * @author Philip Levis * @author Jonathan Hui * @author Joe Polastre * Revision: $Revision: 1.8 $ */ interface SpiPacket { /** * Send a message over the SPI bus. * * @param 'uint8_t* COUNT_NOK(len) txBuf' A pointer to the buffer to send over the bus. If this * parameter is NULL, then the SPI will send zeroes. * @param 'uint8_t* COUNT_NOK(len) rxBuf' A pointer to the buffer where received data should * be stored. If this parameter is NULL, then the SPI will * discard incoming bytes. * @param len Length of the message. Note that non-NULL rxBuf and txBuf * parameters must be AT LEAST as large as len, or the SPI * will overflow a buffer. * * @return SUCCESS if the request was accepted for transfer */ async command error_t send( uint8_t* txBuf, uint8_t* rxBuf, uint16_t len ); /** * Notification that the send command has completed. * * @param 'uint8_t* COUNT_NOK(len) txBuf' The buffer used for transmission * @param 'uint8_t* COUNT_NOK(len) rxBuf' The buffer used for reception * @param len The request length of the transfer, but not necessarily * the number of bytes that were actually transferred * @param error SUCCESS if the operation completed successfully, FAIL * otherwise */ async event void sendDone( uint8_t* txBuf, uint8_t* rxBuf, uint16_t len, error_t error ); } tinyos-2.1.2+dfsg/tos/interfaces/SplitControl.nc000066400000000000000000000137671207233610700217050ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2010-06-29 22:07:46 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this interface and its * intended use.

      * * This is the split-phase counterpart to the StdContol interface. It * should be used for switching between the on and off power states of * the component providing it. For each start() or * stop() command, if the command returns SUCCESS, then a * corresponding startDone() or stopDone() event * must be signalled. * * @author Joe Polastre * @author Kevin Klues (klueska@cs.wustl.edu) */ interface SplitControl { /** * Start this component and all of its subcomponents. Return * values of SUCCESS will always result in a startDone() * event being signalled. * * @return SUCCESS if the device is already in the process of * starting or the device was off and the device is now ready to turn * on. After receiving this return value, you should expect a * startDone event in the near future.
      * EBUSY if the component is in the middle of powering down * i.e. a stop() command has been called, * and a stopDone() event is pending
      * EALREADY if the device is already on
      * FAIL Otherwise */ command error_t start(); /** * Notify caller that the component has been started and is ready to * receive other commands. * * @param error -- SUCCESS if the component was successfully * turned on, FAIL otherwise */ event void startDone(error_t error); /** * Start this component and all of its subcomponents. Return * values of SUCCESS will always result in a startDone() * event being signalled. * * @return SUCCESS if the device is already in the process of * stopping or the device was on and the device is now ready to turn * off. After receiving this return value, you should expect a * stopDone event in the near future.
      * EBUSY if the component is in the middle of powering up * i.e. a start() command has been called, * and a startDone() event is pending
      * EALREADY if the device is already off
      * FAIL Otherwise */ command error_t stop(); /** * Notify caller that the component has been stopped. * * @param error -- SUCCESS if the component was successfully * turned off, FAIL otherwise */ event void stopDone(error_t error); } tinyos-2.1.2+dfsg/tos/interfaces/State.nc000066400000000000000000000046601207233610700203210ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * State machine interface * @author David Moss - dmm@rincon.com */ interface State { /** * This will allow a state change so long as the current * state is S_IDLE. * @return SUCCESS if the state is change, FAIL if it isn't */ async command error_t requestState(uint8_t reqState); /** * Force the state machine to go into a certain state, * regardless of the current state it's in. */ async command void forceState(uint8_t reqState); /** * Set the current state back to S_IDLE */ async command void toIdle(); /** * @return TRUE if the state machine is in S_IDLE */ async command bool isIdle(); /** * @return TRUE if the state machine is in the given state */ async command bool isState(uint8_t myState); /** * Get the current state */ async command uint8_t getState(); } tinyos-2.1.2+dfsg/tos/interfaces/StdControl.nc000066400000000000000000000106461207233610700213350ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2010-06-29 22:07:46 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this interface and its * intended use.

      * * This interface is used to switch between * the on and off power states of the component providing it. A call to the * start() command is a request to switch a component into the * on state, and a call to the stop() is a request to switch a * component into the off state. * * @author Joe Polastre * @author Kevin Klues (klueska@cs.wustl.edu) */ interface StdControl { /** * Start this component and all of its subcomponents. * * @return SUCCESS if the component was either already on or was * successfully turned on
      * FAIL otherwise */ command error_t start(); /** * Stop the component and any pertinent subcomponents (not all * subcomponents may be turned off due to wakeup timers, etc.). * * @return SUCCESS if the component was either already off or was * successfully turned off
      * FAIL otherwise */ command error_t stop(); } tinyos-2.1.2+dfsg/tos/interfaces/SystemLowPowerListening.nc000066400000000000000000000004051207233610700240720ustar00rootroot00000000000000interface SystemLowPowerListening { command void setDefaultRemoteWakeupInterval(uint16_t intervalMs); command void setDelayAfterReceive(uint16_t intervalMs); command uint16_t getDefaultRemoteWakeupInterval(); command uint16_t getDelayAfterReceive(); } tinyos-2.1.2+dfsg/tos/interfaces/TaskBasic.nc000066400000000000000000000057741207233610700211140ustar00rootroot00000000000000// $Id: TaskBasic.nc,v 1.6 2010-06-29 22:07:46 scipio Exp $ /* * Copyright (c) 2004-5 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-5 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The basic TinyOS task interface. Components generally do not wire to * this interface: the nesC compiler handles it automatically through the * post and task keywords. * * @author Philip Levis * @date January 12, 2005 * @see TEP 106: Tasks and Schedulers */ #include "TinyError.h" interface TaskBasic { /** * Post this task to the TinyOS scheduler. At some later time, * depending on the scheduling policy, the scheduler will signal the * run() event. * * @return SUCCESS if task was successfuly * posted; the semantics of a non-SUCCESS return value depend on the * implementation of this interface (the class of task). */ async command error_t postTask(); /** * Event from the scheduler to run this task. Following the TinyOS * concurrency model, the codes invoked from run() signals * execute atomically with respect to one another, but can be * preempted by async commands/events. */ event void runTask(); } tinyos-2.1.2+dfsg/tos/interfaces/TimeSyncAMSend.nc000066400000000000000000000110501207233610700220130ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philip Levis * @author Miklos Maroti * * @see TimeSyncPacket */ #include #include #include interface TimeSyncAMSend { /** * This command sends a regular message just like AMSend.send, but * it also performs sender-receiver time synchronization. The event_time * parameter holds the time of some event as expressed in the local clock of * the sender. The receiver can obtain the time of this event (expressed in its * own local time) via the TimeSyncPacket interface. * * @param addr address to which to send the packet * @param msg the packet * @param len the length of the data in the packet payload * @param event_time the synchronization point to be transfered with the message * @return SUCCESS if the request to send succeeded and a * sendDone will be signaled later, EBUSY if the * abstraction cannot send now but will be able to * later, or FAIL if the communication layer is not * in a state that can send (e.g., off). * @see sendDone */ command error_t send(am_addr_t addr, message_t* msg, uint8_t len, size_type event_time); /** * Cancel a requested transmission. Returns SUCCESS if the * transmission was canceled properly (not sent in its * entirety). Note that the component may not know * if the send was successfully canceled, if the radio is * handling much of the logic; in this case, a component * should be conservative and return an appropriate error code. * A successful call to cancel must always result in a * sendFailed event, and never a sendSucceeded event. * * @param msg the packet whose transmission should be cancelled. * @return SUCCESS if the transmission was cancelled, FAIL otherwise. * @see sendDone */ command error_t cancel(message_t* msg); /** * Signaled in response to an accepted send request. msg is * the message buffer sent, and error indicates whether * the send was successful. * * @param msg the packet which was submitted as a send request * @param error SUCCESS if it was sent successfully, FAIL if it was not, * ECANCEL if it was cancelled * @see send * @see cancel */ event void sendDone(message_t* msg, error_t error); /** * Return the maximum payload length that this communication layer * can provide. This command behaves identically to * Packet.maxPayloadLength and is included in this * interface as a convenience. * * @return the maximum payload length */ command uint8_t maxPayloadLength(); /** * Return a pointer to a protocol's payload region in a packet. * This command behaves identically to Packet.getPayload * (minus the length parameter) and is included in this interface * as a convenience. * * @param msg the packet * @return the payload of the packet */ command void* getPayload(message_t* msg, uint8_t len); } tinyos-2.1.2+dfsg/tos/interfaces/TimeSyncPacket.nc000066400000000000000000000051741207233610700221250ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "message.h" interface TimeSyncPacket { /** * Returns TRUE if the value returned by getTime can be trusted. * Under certain circumstances the received message cannot be properly * time stamped, so the sender-receiver synchronization cannot be finished * on the receiver side. In this case, this command returns FALSE. * This command MUST BE called only on the receiver side and only for * messages transmitted via the TimeSyncSend interface. It is recommended * that this command be called from the receive event handler. */ command bool isValid(message_t* msg); /** * This command should be called by the receiver of a message. The time * of the synchronization event is returned as expressed in the local * clock of the caller. This command MUST BE called only on the receiver * side and only for messages transmitted via the TimeSyncSend interface. * It is recommended that this command be called from the receive event * handler. */ command size_type eventTime(message_t* msg); } tinyos-2.1.2+dfsg/tos/interfaces/UartByte.nc000066400000000000000000000044341207233610700207770ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2008-06-04 03:00:35 $ */ interface UartByte { /** * Send a single uart byte. The call blocks until it is ready to * accept another byte for sending. * * @param byte The byte to send. * @return SUCCESS if byte was sent, FAIL otherwise. */ async command error_t send( uint8_t byte ); /** * Receive a single uart byte. The call blocks until a byte is * received. * * @param 'uint8_t* ONE byte' Where to place received byte. * @param timeout How long in byte times to wait. * @return SUCCESS if a byte was received, FAIL if timed out. */ async command error_t receive( uint8_t* byte, uint8_t timeout ); } tinyos-2.1.2+dfsg/tos/interfaces/UartControl.nc000066400000000000000000000106571207233610700215200ustar00rootroot00000000000000/* $Id: UartControl.nc,v 1.2 2009-09-14 00:25:59 scipio Exp $ */ /* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A hardware-independent (HIL) interface for configuring a UART. * Allows setting speed, parity bits, stop bits, and duplex mode. * Parameters are generally TinyOS enum constants, defined within a * chip's header files, such that using an unsupported setting * will reference an undefined constant and lead to a compilation * error. * * @author Philip Levis * @date $Date: 2009-09-14 00:25:59 $ */ interface UartControl { /** Set the UART speed for both reception and transmission. * This command should be called only when both reception * and transmission are disabled, either through a power interface * or setDuplexMode(). The parameter is a constant of the * form TOS_UART_XX, where XX is the speed, such as * TOS_UART_57600. Different platforms support different speeds. * A compilation error on the constant indicates the platform * does not support that speed. * * @param speed The UART speed to change to. */ async command error_t setSpeed(uart_speed_t speed); /** * Returns the current UART speed. */ async command uart_speed_t speed(); /** * Set the duplex mode of the UART. Valid modes are * TOS_UART_OFF, TOS_UART_RONLY, TOS_UART_TONLY, and * TOS_UART_DUPLEX. Some platforms may support only * a subset of these modes: trying to use an unsupported * mode is a compile-time error. The duplex mode setting * affects what kinds of interrupts the UART will issue. * * @param duplex The duplex mode to change to. */ async command error_t setDuplexMode(uart_duplex_t duplex); /** * Return the current duplex mode. */ async command uart_duplex_t duplexMode(); /** * Set whether UART bytes have even parity bits, odd * parity bits, or no parity bits. This command should * only be called when both the receive and transmit paths * are disabled, either through a power control interface * or setDuplexMode. Valid parity settings are * TOS_UART_PARITY_NONE, TOS_UART_PARITY_EVEN, * and TOS_UART_PARITY_ODD. * * @param parity The parity mode to change to. */ async command error_t setParity(uart_parity_t parity); /** * Return the current parity mode. */ async command uart_parity_t parity(); /** * Enable stop bits. This command should only be called * when both the receive and transmits paths are disabled, * either through a power control interface or setDuplexMode. */ async command error_t setStop(); /** * Disable stop bits. This command should only be called * when both the receive and transmits paths are disabled, * either through a power control interface or setDuplexMode. */ async command error_t setNoStop(); /** * Returns whether stop bits are enabled. */ async command bool stopBits(); } tinyos-2.1.2+dfsg/tos/interfaces/UartStream.nc000066400000000000000000000071741207233610700213330ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2008-06-04 03:00:35 $ */ interface UartStream { /** * Begin transmission of a UART stream. If SUCCESS is returned, * sendDone will be signalled when transmission is * complete. * * @param 'uint8_t* COUNT(len) buf' Buffer for bytes to send. * @param len Number of bytes to send. * @return SUCCESS if request was accepted, FAIL otherwise. */ async command error_t send( uint8_t* buf, uint16_t len ); /** * Signal completion of sending a stream. * * @param 'uint8_t* COUNT(len) buf' Bytes sent. * @param len Number of bytes sent. * @param error SUCCESS if the transmission was successful, FAIL otherwise. */ async event void sendDone( uint8_t* buf, uint16_t len, error_t error ); /** * Enable the receive byte interrupt. The receive event * is signalled each time a byte is received. * * @return SUCCESS if interrupt was enabled, FAIL otherwise. */ async command error_t enableReceiveInterrupt(); /** * Disable the receive byte interrupt. * * @return SUCCESS if interrupt was disabled, FAIL otherwise. */ async command error_t disableReceiveInterrupt(); /** * Signals the receipt of a byte. * * @param byte The byte received. */ async event void receivedByte( uint8_t byte ); /** * Begin reception of a UART stream. If SUCCESS is returned, * receiveDone will be signalled when reception is * complete. * * @param 'uint8_t* COUNT(len) buf' Buffer for received bytes. * @param len Number of bytes to receive. * @return SUCCESS if request was accepted, FAIL otherwise. */ async command error_t receive( uint8_t* buf, uint16_t len ); /** * Signal completion of receiving a stream. * * @param 'uint8_t* COUNT(len) buf' Buffer for bytes received. * @param len Number of bytes received. * @param error SUCCESS if the reception was successful, FAIL otherwise. */ async event void receiveDone( uint8_t* buf, uint16_t len, error_t error ); } tinyos-2.1.2+dfsg/tos/interfaces/WriteResource.nc000066400000000000000000000034171207233610700220420ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ interface WriteResource { command int put(uint8_t *val, size_t buflen, coap_tid_t id); event void putDone(error_t result, coap_tid_t id, uint8_t asyn_message); event void putDoneDeferred(coap_tid_t id); } tinyos-2.1.2+dfsg/tos/lib/000077500000000000000000000000001207233610700153345ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/byte_radio/000077500000000000000000000000001207233610700174555ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/byte_radio/ChannelMonitor.nc000066400000000000000000000047351207233610700227300ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * This interface is an abstraction of Clear Channel Assessment (CCA) in byte radios. * It provides commands and events to perform CCA. * * @see ChannelMonitorControl * @see ChannelMonitorData * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ interface ChannelMonitor { /** * Start observing the channel. * Either the event channelBusy() or channelIdle() will be indicated. * * @return SUCCESS on success * FAIL otherwise. */ async command error_t start(); /** * Indicates that the channel is busy. */ async event void channelBusy(); /** * Indicates that the channel is idle. */ async event void channelIdle(); /** * Tells the channel monitor that the last busy event * actually indicated a message. */ async command void rxSuccess(); } tinyos-2.1.2+dfsg/tos/lib/byte_radio/ChannelMonitorControl.nc000066400000000000000000000043051207233610700242620ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * This control interface is used by byte radio CCA components based on RSSI * valid detection with a floating threshold. * * @see ChannelMonitor * @see ChannelMonitorData * * @author Kevin Klues (klues@tkn.tu-berlin.de) * @author Andreas Koepke (koepke@tkn.tu-berlin.de) */ interface ChannelMonitorControl { /** * Update the noise floor. * * @return SUCCESS if the noise floor can be updated * FAIL otherwise. */ async command error_t updateNoiseFloor(); /** * Indicates that the noisefloor has been updated. */ event void updateNoiseFloorDone(); } tinyos-2.1.2+dfsg/tos/lib/byte_radio/ChannelMonitorData.nc000066400000000000000000000060341207233610700235140ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * This interface is used by byte radio CCA components based on RSSI * valid detection with a floating threshold. * * It provides commands and events to read the Signal to Noise Ratio * (SNR) and noisefloor of the radio channel. * * @see ChannelMonitor * @see ChannelMonitorControl * * @author Kevin Klues (klues@tkn.tu-berlin.de) * @author Andreas Koepke (koepke@tkn.tu-berlin.de) */ interface ChannelMonitorData { /** * Sets the gradient for the conversion of mV and dB. * * @param grad This is calculated as grad = mV/dB */ async command void setGradient(int16_t grad); /** * Returns the currently used gradient to convert between * dB and mV. * * @return The currently used gradient. */ async command int16_t getGradient(); /** * Starts the SNR measurement * * @returns SUCCESS on success * FAIL otherwise. */ async command error_t getSnr(); /** * Returns the SNR value in dB. * * @param snr The SNR value in dB. */ async event void getSnrDone(int16_t snr); /** * try to be lucky: read anything stored as the rssi and * make a crude and fast conversion to an snr value */ async command uint16_t readSnr(); /** * Get the noisefloor in mV. * * @return The noisefloor in mV. */ async command uint16_t getNoiseFloor(); } tinyos-2.1.2+dfsg/tos/lib/byte_radio/LinkLayerC.nc000066400000000000000000000050251207233610700217760ustar00rootroot00000000000000/* * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * This is the configuration for a really simple link layer. * * @author Kevin Klues (klues@tkn.tu-berlin.de) * @author Philipp Huppertz (huppertz@tkn.tu-berlin.de) */ configuration LinkLayerC { provides { interface SplitControl; interface Send; interface Receive; interface PacketAcknowledgements; } uses { interface SplitControl as MacSplitControl; interface SplitControl as RadioSplitControl; interface MacSend as SendDown; interface MacReceive as ReceiveLower; interface Packet; } } implementation { components LinkLayerP as Llc, MainC; MainC.SoftwareInit -> Llc; SplitControl = Llc; MacSplitControl = Llc.MacSplitControl; RadioSplitControl = Llc.RadioSplitControl; Send = Llc.Send; Receive = Llc.Receive; Packet = Llc.Packet; PacketAcknowledgements = Llc; ReceiveLower = Llc.ReceiveLower; SendDown = Llc.SendDown; } tinyos-2.1.2+dfsg/tos/lib/byte_radio/LinkLayerP.nc000066400000000000000000000167111207233610700220170ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "radiopacketfunctions.h" #include "message.h" #include "PacketAck.h" /** * This is the implementation of a really simple link layer. * * @author Andreas Koepke */ module LinkLayerP { provides { interface Init; interface SplitControl; interface Receive; interface Send; interface PacketAcknowledgements; } uses { interface SplitControl as MacSplitControl; interface SplitControl as RadioSplitControl; interface MacSend as SendDown; interface MacReceive as ReceiveLower; interface Packet; } } implementation { /* Tx/Rx buffers & pointers */ message_t* txBufPtr; message_t* rxBufPtr; message_t rxBuf; /* state vars */ error_t splitStateError; // state of SplitControl interfaces bool rxBusy; // blocks an incoming packet if the rxBuffer is in use // #define LLCM_DEBUG /**************** Helper functions ******/ void signalFailure() { #ifdef LLCM_DEBUG atomic { for(;;) { ; } } #endif } /**************** Init *****************/ command error_t Init.init(){ atomic { rxBufPtr = &rxBuf; txBufPtr = 0; splitStateError = EOFF; rxBusy = FALSE; } return SUCCESS; } /**************** Start *****************/ void checkStartDone(error_t error) { atomic { if ( (splitStateError == SUCCESS) && (error == SUCCESS) ) { signal SplitControl.startDone(SUCCESS); } else if ( (error == SUCCESS) && (splitStateError == EOFF) ) { splitStateError = SUCCESS; } else { signal SplitControl.startDone(FAIL); } } } event void MacSplitControl.startDone(error_t error) { checkStartDone(error); } event void RadioSplitControl.startDone(error_t error) { checkStartDone(error); } command error_t SplitControl.start() { call MacSplitControl.start(); call RadioSplitControl.start(); return SUCCESS; } /**************** Stop *****************/ void checkStopDone(error_t error) { atomic { if ( (splitStateError == EOFF) && (error == SUCCESS) ) { signal SplitControl.stopDone(SUCCESS); } else if ( (error == SUCCESS) && (splitStateError == SUCCESS) ) { splitStateError = EOFF; } else { signal SplitControl.stopDone(FAIL); } } } event void MacSplitControl.stopDone(error_t error) { checkStopDone(error); } event void RadioSplitControl.stopDone(error_t error) { checkStopDone(error); } command error_t SplitControl.stop(){ call MacSplitControl.stop(); call RadioSplitControl.stop(); return SUCCESS; } /**************** Send ****************/ task void SendDoneSuccessTask() { message_t* txPtr; atomic txPtr = txBufPtr; signal Send.sendDone(txPtr, SUCCESS); } task void SendDoneCancelTask() { message_t* txPtr; atomic txPtr = txBufPtr; signal Send.sendDone(txPtr, ECANCEL); } task void SendDoneFailTask() { message_t* txPtr; atomic txPtr = txBufPtr; signal Send.sendDone(txPtr, FAIL); } command error_t Send.send(message_t *msg, uint8_t len) { if(getMetadata(msg)->ack != NO_ACK_REQUESTED) { // ensure reasonable value getMetadata(msg)->ack = ACK_REQUESTED; } return call SendDown.send(msg, len); } command error_t Send.cancel(message_t* msg) { return call SendDown.cancel(msg); } command uint8_t Send.maxPayloadLength() { return call Packet.maxPayloadLength(); } command void* Send.getPayload(message_t* msg, uint8_t len) { return call Packet.getPayload(msg, len); } async event void SendDown.sendDone(message_t* msg, error_t error) { atomic { txBufPtr = msg; } if (error == SUCCESS) { post SendDoneSuccessTask(); } else if (error == ECANCEL) { post SendDoneCancelTask(); } else { post SendDoneFailTask(); } } /*************** Receive ***************/ task void ReceiveTask() { void *payload; uint8_t len; message_t* tmpMsgPtr; atomic { len = call Packet.payloadLength(rxBufPtr); payload = call Packet.getPayload(rxBufPtr, len); tmpMsgPtr = rxBufPtr; } tmpMsgPtr = signal Receive.receive(tmpMsgPtr, payload , len); atomic { rxBufPtr = tmpMsgPtr; rxBusy = FALSE; } } async event message_t* ReceiveLower.receiveDone(message_t* msg) { message_t* msgPtr; atomic { if (rxBusy) { msgPtr = msg; } else { rxBusy = TRUE; msgPtr = rxBufPtr; rxBufPtr = msg; post ReceiveTask(); } } return msgPtr; } /*************** default events ***********/ /* for lazy buggers who do not want to do something with a packet */ default event void Send.sendDone(message_t* sent, error_t success) { } default event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) { return msg; } /* PacketAcknowledgements interface */ async command error_t PacketAcknowledgements.requestAck(message_t* msg) { getMetadata(msg)->ack = ACK_REQUESTED; return SUCCESS; } async command error_t PacketAcknowledgements.noAck(message_t* msg) { getMetadata(msg)->ack = NO_ACK_REQUESTED; return SUCCESS; } async command bool PacketAcknowledgements.wasAcked(message_t* msg) { bool rVal = FALSE; if(getMetadata(msg)->ack == WAS_ACKED) rVal = TRUE; return rVal; } } tinyos-2.1.2+dfsg/tos/lib/byte_radio/MacReceive.nc000066400000000000000000000053711207233610700220100ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include /** * This interface is similar to the Receive interface. * * The interface provides one event in async context which indicates that * a packet was received. It Is provided by the MAC layer ofi * a byte radio. * * @see Receive * * @author Philipp Huppertz */ interface MacReceive { /** * Receive a packet buffer, returning a buffer for the signaling * component to use for the next reception. The return value * can be the same as msg, as long as the handling * component copies out the data it needs. * * Note that misuse of this interface is one of the most * common bugs in TinyOS code. For example, if a component both calls a * send on the passed message and returns it, then it is possible * the buffer will be reused before the send occurs, overwriting * the component's data. This would cause the mote to possibly * instead send a packet it most recently received. * * @param msg the received packet * @return a packet buffer for the stack to use for the next * received packet. */ async event message_t* receiveDone(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/byte_radio/MacSend.nc000066400000000000000000000073241207233610700213170ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include #include /** * This interface is similar to the Send interface. * * It provides the same basic functionality as the Send interface in async * context. It is provided by the MAC layer of byte radios. * * @see Send * * @author Philipp Huppertz */ interface MacSend { /** * Send a packet with a data payload of len. To determine * the maximum available size, use the Packet interface of the * component providing Send. If send returns SUCCESS, then the * component will signal the sendDone event in the future; if send * returns an error, it will not signal sendDone. Note that a * component may accept a send request which it later finds it * cannot satisfy; in this case, it will signal sendDone with an * appropriate error code. * * @param msg the packet to send * @param len the length of the packet payload * @return SUCCESS if the request was accepted and will issue * a sendDone event, EBUSY if the component cannot accept * the request now but will be able to later, FAIL * if the stack is in a state that cannot accept requests * (e.g., it's off). */ async command error_t send(message_t* msg, uint8_t len); /** * Cancel a requested transmission. Returns SUCCESS if the * transmission was cancelled properly (not sent at all) * * @param msg the packet whose transmission should be cancelled * @return SUCCESS if the packet was successfully cancelled, FAIL * otherwise */ async command error_t cancel(message_t* msg); /** * Signaled in response to an accepted send request. msg * is the sent buffer, and error indicates whether the * send was succesful, and if not, the cause of the failure. * * @param msg the message which was requested to send * @param error SUCCESS if it was transmitted successfully, FAIL if * it was not, ECANCEL if it was cancelled via cancel */ async event void sendDone(message_t* msg, error_t error); } tinyos-2.1.2+dfsg/tos/lib/byte_radio/PacketAck.h000066400000000000000000000042571207233610700214640ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * provide constants for packet ack interface * - Author -------------------------------------------------------------- * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) * ======================================================================== */ #ifndef PACKET_ACK_H #define PACKET_ACK_H /* #define NO_ACK_REQUESTED 1 #define WAS_ACKED 2 #define ACK_REQUESTED 128 */ typedef enum { NO_ACK_REQUESTED = 1, WAS_ACKED, WAS_NOT_ACKED, ACK_REQUESTED = 128U } packet_ack_t; #endif tinyos-2.1.2+dfsg/tos/lib/byte_radio/PacketSerializerP.nc000066400000000000000000000175771207233610700234010ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.9 $ * $Date: 2010-01-27 14:42:10 $ * ======================================================================== */ #include "crc.h" #include "message.h" #include "radiopacketfunctions.h" /** * This module in conjunction with the UartPhyC turns byte streams * into packtes. * * @see UartPhyC * * @author Kevin Klues * @author Philipp Huppertz */ module PacketSerializerP { provides { interface PhySend; interface PhyReceive; interface Packet; interface RadioTimeStamping; } uses { interface RadioByteComm; interface PhyPacketTx; interface PhyPacketRx; #ifdef PACKETSERIALIZER_DEBUG interface SerialDebug; #endif } } implementation { #ifdef PACKETSERIALIZER_DEBUG void sdDebug(uint16_t p) { call SerialDebug.putPlace(p); } #else void sdDebug(uint16_t p) {}; #endif /* Module Global Variables */ message_t rxMsg; // rx message buffer message_t *rxBufPtr = &rxMsg; // pointer to rx buffer message_t *txBufPtr = NULL; // pointer to tx buffer uint16_t crc = 0; // CRC value of either the current incoming or outgoing packet uint8_t byteCnt = 0; // index into current datapacket /* Local Function Declarations */ void TransmitNextByte(); void ReceiveNextByte(uint8_t data); typedef enum { SFD_OFFSET = sizeof(message_header_t) - sizeof(message_radio_header_t) + 2 } pserializer_constants_t; /*- Radio Send */ async command error_t PhySend.send(message_t* msg, uint8_t len) { atomic { crc = 0; txBufPtr = msg; // assume "right (LSB) aligned" unions -- highly compiler and platform specific byteCnt = sizeof(message_header_t) - sizeof(message_radio_header_t); getHeader(msg)->length = len; sdDebug(4000 + getHeader(msg)->token); } call PhyPacketTx.sendHeader(); return SUCCESS; } async event void PhyPacketTx.sendHeaderDone() { TransmitNextByte(); } async event void RadioByteComm.txByteReady(error_t error) { if(error == SUCCESS) { TransmitNextByte(); } else { signal PhySend.sendDone(txBufPtr, FAIL); } } void TransmitNextByte() { if(byteCnt < sizeof(message_header_t) + getHeader(txBufPtr)->length) { // transmit the data part uint8_t* buf = (uint8_t *)(txBufPtr); crc = crcByte(crc, buf[byteCnt]); call RadioByteComm.txByte(buf[byteCnt]); byteCnt++; if(byteCnt == SFD_OFFSET) { signal RadioTimeStamping.transmittedSFD(0, txBufPtr); } } else if(byteCnt == sizeof(message_header_t) + getHeader(txBufPtr)->length) { call RadioByteComm.txByte(crc); byteCnt++; } else if(byteCnt == sizeof(message_header_t) + getHeader(txBufPtr)->length + 1) { call RadioByteComm.txByte(crc >> 8); byteCnt++; } else { call PhyPacketTx.sendFooter(); } } async event void PhyPacketTx.sendFooterDone() { sdDebug(6000 + getHeader(txBufPtr)->token); signal PhySend.sendDone((message_t*)txBufPtr, SUCCESS); } /* Radio Receive */ async event void PhyPacketRx.recvHeaderDone(error_t error) { if(error == SUCCESS) { byteCnt = sizeof(message_header_t) - sizeof(message_radio_header_t); getHeader(rxBufPtr)->length = sizeof(message_radio_header_t); crc = 0; signal PhyReceive.receiveDetected(); } } async event void RadioByteComm.rxByteReady(uint8_t data) { ReceiveNextByte(data); } async event void PhyPacketRx.recvFooterDone(error_t error) { // we care about wrong crc in this layer if(!getFooter(rxBufPtr)->crc) { error = FAIL; } else { } byteCnt = 0; rxBufPtr = signal PhyReceive.receiveDone(rxBufPtr, rxBufPtr->data, getHeader(rxBufPtr)->length, error); } /* Receive the next Byte from the USART */ void ReceiveNextByte(uint8_t data) { uint8_t* buf = (uint8_t *)(rxBufPtr); buf[byteCnt++] = data; if(byteCnt <= sizeof(message_header_t) + getHeader(rxBufPtr)->length) { crc = crcByte(crc, data); if(byteCnt == SFD_OFFSET) { signal RadioTimeStamping.receivedSFD(0); } else if(byteCnt == sizeof(message_header_t) + getHeader(rxBufPtr)->length) { byteCnt = offsetof(message_t, footer) + offsetof(message_radio_footer_t, crc); } if(getHeader(rxBufPtr)->length > TOSH_DATA_LENGTH) { getFooter(rxBufPtr)->crc = 0; call PhyPacketRx.recvFooter(); } } else if(byteCnt >= offsetof(message_t, footer) + offsetof(message_radio_footer_t, crc) + sizeof(crc)) { message_radio_footer_t* footer = getFooter(rxBufPtr); footer->crc = (footer->crc == crc); call PhyPacketRx.recvFooter(); sdDebug(5000 + getHeader(rxBufPtr)->token); } } /* Packet interface */ command void Packet.clear(message_t* msg) { memset(msg, 0, sizeof(message_t)); } command uint8_t Packet.payloadLength(message_t* msg) { return (getHeader(msg))->length; } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { getHeader(msg)->length = len; } command uint8_t Packet.maxPayloadLength() { return TOSH_DATA_LENGTH; } command void* Packet.getPayload(message_t* msg, uint8_t len) { if (len <= TOSH_DATA_LENGTH) { return (void*)msg->data; } else { return NULL; } } // Default events for radio send/receive coordinators do nothing. // Be very careful using these, or you'll break the stack. default async event void RadioTimeStamping.transmittedSFD(uint16_t time, message_t* msgBuff) { } default async event void RadioTimeStamping.receivedSFD(uint16_t time) { } } tinyos-2.1.2+dfsg/tos/lib/byte_radio/PhyPacketRx.nc000066400000000000000000000051261207233610700222050ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:28 $ * ======================================================================== */ /** * Physical Packet Receive Interface for byte radios. * Commands and events provided by the Radio Interface * to communicate with upper layers about the status of a * received packet. * * @author Kevin Klues */ interface PhyPacketRx { /** * Notification that a packet header was received. * * @param error Will be SUCCESS if a packet header has been received FAIL * otherwise. */ async event void recvHeaderDone(error_t error); /** * Start receiving the packet footer. */ async command void recvFooter(); /** * Notification that the the packet footer was received. * * @param error Will be SUCCESS if a packet incl. footer was received. * It will be FAIL if the packet was not fully received (timeout). */ async event void recvFooterDone(error_t error); } tinyos-2.1.2+dfsg/tos/lib/byte_radio/PhyPacketTx.nc000066400000000000000000000047001207233610700222040ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:28 $ * ======================================================================== */ /** * Physical Packet Transmission Interface for byte radios. * Commands and events provided by the Physical Layer * to communicate with upper layers about the status of a * packet that is being transmitted. * * @author Kevin Klues */ interface PhyPacketTx { /** * Start sending a new packet header. */ async command void sendHeader(); /** * Notification that the packet header was sent. * */ async event void sendHeaderDone(); /** * Start sending the packet footer. */ async command void sendFooter(); /** * Notification that the the packet footer was sent. * */ async event void sendFooterDone(); } tinyos-2.1.2+dfsg/tos/lib/byte_radio/PhyReceive.nc000066400000000000000000000064231207233610700220470ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include /** * This interface is similar to the Receive interface. * * The interface provides two events in async context which indicate that * a packet is detected or was received. It is provided by the Phy layer * of byte radios. * * @see Receive * * @author Philipp Huppertz */ interface PhyReceive { /** * Receive a packet buffer, returning a buffer for the signaling * component to use for the next reception. The return value * can be the same as msg, as long as the handling * component copies out the data it needs. The msg may * be invalid when error is not SUCCESS ! * * Note that misuse of this interface is one of the most * common bugs in TinyOS code. For example, if a component both calls a * send on the passed message and returns it, then it is possible * the buffer will be reused before the send occurs, overwriting * the component's data. This would cause the mote to possibly * instead send a packet it most recently received. * * @param msg the received packet * @param payload a pointer to the packet's payload * @param len the length of the data region pointed to by payload * @param error FAIL if the packet was corrupted (e.g. wrong crc) * @return a packet buffer for the stack to use for the next * received packet. */ async event message_t* receiveDone(message_t* msg, void* payload, uint8_t len, error_t error); /** * Indicates that a packet has been detected. This means that the packet's physical header * (preamble bytes + sync byte + SFD byte) was received. * */ async event void receiveDetected(); } tinyos-2.1.2+dfsg/tos/lib/byte_radio/PhySend.nc000066400000000000000000000064631207233610700213620ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include #include /** * This interface is similar to the Send interface. * * This interface provides the basic functionality of the Send interface * in async context. It is provided by the Phy Layer. * * @see Send * * @author Philipp Huppertz */ interface PhySend { /** * Send a packet with a data payload of len. To determine * the maximum available size, use the Packet interface of the * component providing Send. If send returns SUCCESS, then the * component will signal the sendDone event in the future; if send * returns an error, it will not signal sendDone. Note that a * component may accept a send request which it later finds it * cannot satisfy; in this case, it will signal sendDone with an * appropriate error code. * * @param msg the packet to send * @param len the length of the packet payload * @return SUCCESS if the request was accepted and will issue * a sendDone event, EBUSY if the component cannot accept * the request now but will be able to later, FAIL * if the stack is in a state that cannot accept requests * (e.g., it's off). */ async command error_t send(message_t* msg, uint8_t len); /** * Signaled in response to an accepted send request. msg * is the sent buffer, and error indicates whether the * send was succesful, and if not, the cause of the failure. * * @param msg the message which was requested to send * @param error SUCCESS if it was transmitted successfully, FAIL if * it was not. */ async event void sendDone(message_t* msg, error_t error); } tinyos-2.1.2+dfsg/tos/lib/byte_radio/RadioByteComm.nc000066400000000000000000000061351207233610700225020ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * A byte-level communication interface for byte radios. * It signals byte receptions and * provides a split-phased byte send interface. txByteReady states * that the component can accept another byte in its queue to send, * while txDone states that the send queue has been emptied. * * @author Jason Hill * @author David Gay * @author Philip Levis */ interface RadioByteComm { /** * Transmits a byte over the radio. * * @param data The byte to be transmitted. */ async command void txByte(uint8_t data); /** * Notification that the radio is ready to receive another byte. * * @param data The byte read from the radio. */ async event void rxByteReady(uint8_t data); /** * Notification that the bus is ready to transmit/queue another byte. * * @param error Success Notification of the successful transmission of the last byte. */ async event void txByteReady(error_t error); /** * Check to see if the transmission is done and the queue is empty * * @return TRUE if the queue is empty and no more bytes will be sent. * FALSE if bytes remain in the queue. */ async command bool isTxDone(); } tinyos-2.1.2+dfsg/tos/lib/byte_radio/UartPhyControl.nc000066400000000000000000000052711207233610700227410ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * This interface provides commands to control the structure of * transmitted (physical) packets and provides commands and events * to control the physical layer of byte radios. * * @author Philipp Huppertz (huppertz@tkn.tu-berlin.de) */ interface UartPhyControl { /** * Sets the number of transmitted preamble bytes. * * @param numPreambleBytes the numbeof preamble bytes. * * @return SUCCESS if it could be set (no current receiving/transmitting) FALSE otherwise. */ async command error_t setNumPreambles(uint16_t numPreambleBytes); /** * Sets the timeout after the byte-stream is considered dead if no more * bytes occur on the sending or receiving side. This means isBusy() * returns FALSE. * * @param byteTimeout timeout in ms. * * @return SUCCESS if it could be set (no current receiving/transmitting) * FALSE otherwise. */ command error_t setByteTimeout(uint8_t byteTimeout); /** * Tests if the UartPhy is busy with sending or receiving a packet. * * @return TRUE if active * FALSE otherwise. */ async command bool isBusy(); } tinyos-2.1.2+dfsg/tos/lib/byte_radio/flagfunctions.h000066400000000000000000000043601207233610700224730ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * some helper functions that ease dealing with flags in a bit field * - Author -------------------------------------------------------------- * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) * ======================================================================== */ #ifndef FLAG_FUNCTIONS_H #define FLAG_FUNCTIONS_H void setFlag(uint8_t *which, uint8_t pos) { (*which) |= pos; } void clearFlag(uint8_t *which, uint8_t pos) { (*which) = (*which) & (~pos); } bool isFlagSet(const uint8_t *which, uint8_t pos) { return (*which) & pos; } #endif tinyos-2.1.2+dfsg/tos/lib/byte_radio/manchester.h000066400000000000000000000066071207233610700217700ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * provide functions to encode/decode a manchester stream * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:28 $ * @author Andreas Koepke * ======================================================================== */ const uint8_t nibbleToManchesterByte[] = { 0x55, 0x56, 0x59, 0x5a, 0x65, 0x66, 0x69, 0x6a, 0x95, 0x96, 0x99, 0x9a, 0xa5, 0xa6, 0xa9, 0xaa }; const uint8_t manchesterByteToNibble[] = { 0x0, 0x1, 0xff, 0xff, 0x2, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4, 0x5, 0xff, 0xff, 0x6, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8, 0x9, 0xff, 0xff, 0xa, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, 0xd, 0xff, 0xff, 0xe, 0xf }; uint8_t manchesterEncodeNibble(uint8_t nib) { return nibbleToManchesterByte[nib]; } uint8_t manchesterDecodeByte(uint8_t b) { uint8_t dec; if(b < 0x55) { dec = 0xff; } else if(b > 0xaa) { dec = 0xff; } else { dec = manchesterByteToNibble[b - 0x55]; } return dec; } tinyos-2.1.2+dfsg/tos/lib/byte_radio/radiopacketfunctions.h000066400000000000000000000051351207233610700240510ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * Platformindependant packet structure accessor functions * - Author -------------------------------------------------------------- * @author: Philipp Huppertz (huppertz@tkn.tu-berlin.de) * ======================================================================== */ #ifndef RADIO_PACKET_FUNCTIONS_H #define RADIO_PACKET_FUNCTIONS_H #include "message.h" /* Packet structure accessor functions * note: platform-independant radiostructures are called message_radio_header_t & message_radio_footer_t */ message_radio_header_t* getHeader(message_t* amsg) { return (message_radio_header_t*)(amsg->data - sizeof(message_radio_header_t)); } message_radio_footer_t* getFooter(message_t* amsg) { return (message_radio_footer_t*)(amsg->footer); } message_radio_metadata_t* getMetadata(message_t* amsg) { return (message_radio_metadata_t*)((uint8_t*)amsg->footer + sizeof(message_radio_footer_t)); } #endif tinyos-2.1.2+dfsg/tos/lib/byte_radio/shellsort.h000066400000000000000000000007321207233610700216470ustar00rootroot00000000000000/*integriert shellsort Algorithmus*/ /*shellsort aufsteigend sortierend aus Kernighan Ritchie (S.61)*/ #ifndef __SHELLSORT_H__ #define __SHELLSORT_H__ void shellsort(uint16_t basis[] , uint16_t size) { int gap, i, j, temp; for (gap = size/2; gap > 0; gap /= 2) for (i = gap; i < size; i++) for (j = i-gap; j >= 0 && basis[j] > basis[j+gap]; j-=gap) { temp = basis[j]; basis[j] = basis[j+gap]; basis[j+gap] = temp; } } #endif /* __SHELLSORT_H__ */ tinyos-2.1.2+dfsg/tos/lib/diagmsg/000077500000000000000000000000001207233610700167475ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/diagmsg/Assert.h000066400000000000000000000035161207233610700203660ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __ASSERT_H__ #define __ASSERT_H__ #ifdef ASSERT_NONE #define ASSERT(COND) for(;0;) #else void assert(bool condition, const char* file, uint16_t line); #define ASSERT(COND) assert(COND, __FILE__, __LINE__) #endif #endif//__ASSERT_H__ tinyos-2.1.2+dfsg/tos/lib/diagmsg/AssertC.nc000066400000000000000000000033731207233610700206430ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ configuration AssertC { } implementation { #ifndef ASSERT_NONE components AssertP, DiagMsgC, LedsC; AssertP.DiagMsg -> DiagMsgC; AssertP.Leds -> LedsC; #endif } tinyos-2.1.2+dfsg/tos/lib/diagmsg/AssertP.nc000066400000000000000000000043051207233610700206540ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ module AssertP { uses { interface DiagMsg; interface Leds; } } implementation { void assert(bool condition, const char* file, uint16_t line) __attribute__((noinline)) @C() @spontaneous() { if( ! condition ) { #ifdef ASSERT_LEDON call Leds.led0On(); #endif if( call DiagMsg.record() ) { uint8_t del = 0; uint8_t len = 0; while( file[len] != 0 ) { if( file[len] == '\\' || file[len] == '/' ) del = len + 1; ++len; } file += del; call DiagMsg.str("assert"); call DiagMsg.str(file); call DiagMsg.uint16(line); call DiagMsg.send(); } } } } tinyos-2.1.2+dfsg/tos/lib/diagmsg/DiagMsg.nc000066400000000000000000000101231207233610700206010ustar00rootroot00000000000000/* * Copyright (c) 2002-2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ /** * The DiagMsg interface allows messages to be sent back to the base station * containing several values and their type information, like in * printf(...). The base station must be connected to a PC using * a serial cable. On the PC a Java application (net.tinyos.util.DiagMsg) * decodes the message and displays its content using the correct type * information. See the implementation for the format of the message. */ interface DiagMsg { /** * Initiates the recording of a new DiagMsg. It returns FALSE if * the component is busy recording or sending another message. */ async command bool record(); /** * Adds a new value to the end of the message. If the message * cannot hold more information, then the new value is simply dropped. */ async command void int8(int8_t value); async command void uint8(uint8_t value); async command void hex8(uint8_t value); async command void int16(int16_t value); async command void uint16(uint16_t value); async command void hex16(uint16_t value); async command void int32(int32_t value); async command void int64(int64_t value); async command void uint64(uint64_t value); async command void uint32(uint32_t value); async command void hex32(uint32_t value); async command void real(float value); async command void chr(char value); /** * Adds an array of values to the end of the message. * The maximum length of the array is 15. * If the message cannot hold all elements of the array, * then no value is stored. */ async command void int8s(const int8_t *value, uint8_t len); async command void uint8s(const uint8_t *value, uint8_t len); async command void hex8s(const uint8_t *value, uint8_t len); async command void int16s(const int16_t *value, uint8_t len); async command void uint16s(const uint16_t *value, uint8_t len); async command void hex16s(const uint16_t *value, uint8_t len); async command void int32s(const int32_t *value, uint8_t len); async command void uint32s(const uint32_t *value, uint8_t len); async command void hex32s(const uint32_t *value, uint8_t len); async command void int64s(const int64_t *value, uint8_t len); async command void uint64s(const uint64_t *value, uint8_t len); async command void reals(const float *value, uint8_t len); async command void chrs(const char *value, uint8_t len); /** * This is a shorthand method for chrs */ async command void str(const char* value); /** * Initiates the sending of the recorded message. */ async command void send(); } tinyos-2.1.2+dfsg/tos/lib/diagmsg/DiagMsgC.nc000066400000000000000000000041241207233610700207100ustar00rootroot00000000000000/* * Copyright (c) 2002-2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ configuration DiagMsgC { provides interface DiagMsg; } implementation { #ifdef DIAGMSG_NONE components NoDiagMsgC; DiagMsg = NoDiagMsgC; #else enum { AM_DIAG_MSG = 0xB1, }; components DiagMsgP; DiagMsg = DiagMsgP.DiagMsg; #ifdef DIAGMSG_RADIO components new AMSenderC(AM_DIAG_MSG); #else components new SerialAMSenderC(AM_DIAG_MSG) as AMSenderC; #ifdef DIAGMSG_SERIAL_START components SerialStartC; #endif #endif DiagMsgP.AMSend -> AMSenderC; DiagMsgP.Packet -> AMSenderC; #endif } tinyos-2.1.2+dfsg/tos/lib/diagmsg/DiagMsgP.nc000066400000000000000000000201761207233610700207320ustar00rootroot00000000000000/* * Copyright (c) 2002-2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include module DiagMsgP { provides { interface DiagMsg; } uses { interface AMSend; interface Packet; } } #ifndef DIAGMSG_BASE_STATION #define DIAGMSG_BASE_STATION AM_BROADCAST_ADDR #endif #ifndef DIAGMSG_RETRY_COUNT #define DIAGMSG_RETRY_COUNT 2 #endif #ifndef DIAGMSG_RECORDED_MSGS #define DIAGMSG_RECORDED_MSGS 10 #endif implementation { enum { STATE_READY = 1, STATE_RECORDING_FIRST = 2, // recording the first 4-bit descriptor STATE_RECORDING_SECOND = 3, // recording the second 4-bit descriptor STATE_MSG_FULL = 4, STATE_BUFFER_FULL = 5, }; norace volatile uint8_t state = STATE_READY; // the state of the recording message_t msgs[DIAGMSG_RECORDED_MSGS]; // circular buffer of messages norace message_t *recording = msgs; // the message that is beeing or going to be recorded message_t *sending = 0; // the message that is beeing sent, or the null pointer norace uint8_t nextData; // points to the next unsued byte norace uint8_t prevType; // points to the type descriptor norace uint8_t retries; // number of remaining retries // two type fields are stored in on byte enum { TYPE_END = 0, TYPE_INT8 = 1, TYPE_UINT8 = 2, TYPE_HEX8 = 3, TYPE_INT16 = 4, TYPE_UINT16 = 5, TYPE_HEX16 = 6, TYPE_INT32 = 7, TYPE_UINT32 = 8, TYPE_HEX32 = 9, TYPE_FLOAT = 10, TYPE_CHAR = 11, TYPE_INT64 = 12, TYPE_UINT64 = 13, TYPE_ARRAY = 15, }; /* The format of the payload is as follows: Each value has an associated data type descriptor. The descriptor takes 4-bits, and two descriptors are packed into one byte. The double-descriptor is followed by the data bytes needed to store the corresponding value. Two sample layouts are: [D2, D1] [V1] ... [V1] [V2] ... [V2] [D2, D1] [V1] ... [V1] [V2] ... [V2] [0, D3] [V3] ... [V3] where D1, D2, D3 denotes the data type descriptors, and V1, V2 and V3 denotes the bytes where the corresponding values are stored. If there is an odd number of data descriptors, then a zero data descriptor TYPE_END is inserted. Each data type (except arrays) uses a fixed number of bytes to store the value. For arrays, the first byte of the array holds the data type of the array (higer 4 bits) and the length of the array (lower 4 bits). The actual data follows this first byte. */ async command bool DiagMsg.record() { atomic { // currently recording or no more space if( state != STATE_READY ) return FALSE; state = STATE_RECORDING_FIRST; nextData = 0; } return TRUE; } /** * Allocates space in the message for size bytes * and sets the type information to type. * Returns the index in msg.data where the data * should be stored or -1 if no more space is avaliable. */ int8_t allocate(uint8_t size, uint8_t type) { int8_t ret = -1; if( state == STATE_RECORDING_FIRST ) { if( nextData + 1 + size <= TOSH_DATA_LENGTH ) { state = STATE_RECORDING_SECOND; prevType = nextData++; ((uint8_t*) &(recording->data))[prevType] = type; ret = nextData; nextData += size; } else state = STATE_MSG_FULL; } else if( state == STATE_RECORDING_SECOND ) { if( nextData + size <= TOSH_DATA_LENGTH ) { state = STATE_RECORDING_FIRST; ((uint8_t*) &(recording->data))[prevType] += (type << 4); ret = nextData; nextData += size; } else state = STATE_MSG_FULL; } return ret; } void copyData(uint8_t size, uint8_t type2, const void* data) { int8_t start = allocate(size, type2); if( start >= 0 ) memcpy(&(recording->data[start]), data, size); } void copyArray(uint8_t size, uint8_t type2, const void* data, uint8_t len) { int8_t start; if( len > 15 ) len = 15; start = allocate(size*len + 1, TYPE_ARRAY); if( start >= 0 ) { recording->data[start] = (type2 << 4) + len; memcpy(&(recording->data[start + 1]), data, size*len); } } #define IMPLEMENT(NAME, TYPE, TYPE2) \ async command void DiagMsg.NAME(TYPE value) { copyData(sizeof(TYPE), TYPE2, &value); } \ async command void DiagMsg.NAME##s(const TYPE *value, uint8_t len) { copyArray(sizeof(TYPE), TYPE2, value, len); } IMPLEMENT(int8, int8_t, TYPE_INT8) IMPLEMENT(uint8, uint8_t, TYPE_UINT8) IMPLEMENT(hex8, uint8_t, TYPE_HEX8) IMPLEMENT(int16, int16_t, TYPE_INT16) IMPLEMENT(uint16, uint16_t, TYPE_UINT16) IMPLEMENT(hex16, uint16_t, TYPE_HEX16) IMPLEMENT(int32, int32_t, TYPE_INT32) IMPLEMENT(uint32, uint32_t, TYPE_UINT32) IMPLEMENT(hex32, uint32_t, TYPE_HEX32) IMPLEMENT(int64, int64_t, TYPE_INT64) IMPLEMENT(uint64, uint64_t, TYPE_UINT64) IMPLEMENT(real, float, TYPE_FLOAT) IMPLEMENT(chr, char, TYPE_CHAR) async command void DiagMsg.str(const char* str) { int8_t len = 0; while( str[len] != 0 && len < 15 ) ++len; call DiagMsg.chrs(str, len); } // TODO: this is a hack because setPayloadLength should be async inline void setPayloadLength(message_t* msg, uint8_t length) { (*(uint8_t*) &(msg->header)) = length; } inline uint8_t getPayloadLength(message_t* msg) { return *(uint8_t*) &(msg->header); } task void send() { message_t* msg; atomic msg = sending; // if the stack is not started, then drop the message // (cannot spin with tasks becasue we might be in software or hardware init) if( call AMSend.send(DIAGMSG_BASE_STATION, msg, getPayloadLength(msg)) != SUCCESS ) atomic sending = 0; } // calculates the next message_t pointer in the msgs circular buffer static inline message_t* nextPointer(message_t* ptr) { if( ++ptr >= msgs + DIAGMSG_RECORDED_MSGS ) return msgs; else return ptr; } async command void DiagMsg.send() { // no message recorded if( state == STATE_READY ) return; // store the length setPayloadLength(recording, nextData); atomic { if( sending == 0 ) { sending = recording; retries = DIAGMSG_RETRY_COUNT; post send(); } recording = nextPointer(recording); if( recording == sending ) state = STATE_BUFFER_FULL; else state = STATE_READY; } } event void AMSend.sendDone(message_t* p, error_t error) { atomic { // retry if not successful if( error != SUCCESS && --retries > 0 ) post send(); else { p = nextPointer(sending); if( p != recording ) { sending = p; retries = DIAGMSG_RETRY_COUNT; post send(); } else { sending = 0; if( state == STATE_BUFFER_FULL ) { state = STATE_READY; if( call DiagMsg.record() ) { call DiagMsg.str("DiagMsgOverflow"); call DiagMsg.send(); } } } } } } } tinyos-2.1.2+dfsg/tos/lib/diagmsg/NoDiagMsgC.nc000066400000000000000000000047241207233610700212130ustar00rootroot00000000000000/* * Copyright (c) 2003-2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ module NoDiagMsgC { provides interface DiagMsg; } implementation { async command bool DiagMsg.record() { return FALSE; } #define IMPLEMENT(NAME, TYPE, TYPE2) \ async command void DiagMsg.NAME(TYPE value) { } \ async command void DiagMsg.NAME##s(const TYPE *value, uint8_t len) { } IMPLEMENT(int8, int8_t, TYPE_INT8) IMPLEMENT(uint8, uint8_t, TYPE_UINT8) IMPLEMENT(hex8, uint8_t, TYPE_HEX8) IMPLEMENT(int16, int16_t, TYPE_INT16) IMPLEMENT(uint16, uint16_t, TYPE_UINT16) IMPLEMENT(hex16, uint16_t, TYPE_HEX16) IMPLEMENT(int32, int32_t, TYPE_INT32) IMPLEMENT(uint32, uint32_t, TYPE_UINT32) IMPLEMENT(hex32, uint32_t, TYPE_HEX32) IMPLEMENT(int64, int64_t, TYPE_INT64) IMPLEMENT(uint64, uint64_t, TYPE_UINT64) IMPLEMENT(real, float, TYPE_FLOAT) IMPLEMENT(chr, char, TYPE_CHAR) async command void DiagMsg.str(const char* str) { } async command void DiagMsg.send() { } } tinyos-2.1.2+dfsg/tos/lib/diagmsg/README000066400000000000000000000062161207233610700176340ustar00rootroot00000000000000DiagMsg: Author/Contact: miklos.maroti@vanderbilt.edu (Miklos Maroti, ISIS, Vanderbilt) DESCRIPTION: The DiagMsg component allows messages to be sent back to the base station containing several diagnostic or debugging values together with their type information. The base station must run the GenericBase or TOSBase application which forwards all messages to a PC connected to the base station. A java programm (java net.tinyos.util.DiagMsg) displays the messages on the screen according to the formating rules contained in the message. The following data types are supported: 1,2, 4 and 8 byte long signed, unsigned and hexadecimal integers, characters, floating point numbers, strings and arrays of the previous types (of length up to 15). Each field requires an additional 4 bit type descriptor. USAGE: When you want to report some data, write code something like this: if( call DiagMsg.record() ) { call DiagMsg.str("test"); call DiagMsg.uint8(17); call DiagMsg.int16(1973); call DiagMsg.real(12.345); call DiagMsg.chr('Z'); call DiagMsg.uint32(123456789); call DiagMsg.send(); } The DiagMsg component will record the message and will send it as soon as possible. You can record up to 29 bytes of data in a single message. Each field uses and additional 4-bit type descriptor. For arrays, including strings, there is an additional 1-byte length descriptor as well. The diag message above, for example, uses 5+1+1+2+4+1+4+7*0.5 = 21.5 that is 22 bytes. If the message cannot hold more fields, then additional fields will be silently ignored. THE JAVA PROGRAM: The java program (DiagMsgs) displays each DiagMsg in a line. The program can connect to a SerialForward application, or can use the serial port directly. ASSERT: A separate component (AssertC) provides an ASSERT macro that can be used to signal error conditions with a DiagMsg. You have to include the AssertC component only once in your application, and where ever you want to use the ASSERT macro you need to include only the Assert.h header file. TUNABLE PARAMETERS: The DiagMsg component can be configured by defining the following values in your Makefile: DIAGMSG_NONE: Turns off sending diagmessage completely DIAGMSG_RADIO: By default all diag messages are sent over the serial line, this will reroute them to the radio DIAGMSG_SERIAL_START: By default the DiagMsgC component does not turn on the serial stack. Either you have to explicitely start the serial stack before diag messgaes can be sent, or you can define this value in your Makefile, and the SerialStartC component will be automatically incuded. DIAGMSG_BASE_STATION: The node ID of the base station or 0xFFFF to broadcast the message. The default value is to broadcast the message. DIAGMSG_RETRY_COUNT: The DiagMsg component will retry messages this many times before dropping them. The base station must acknowledge them (this is done automatically). DIAGMSG_RECORDED_MSGS: The DiagMsg component keeps an internal buffer of this many messages. This allows sending several small messages without waiting for their completion. ASSERT_NONE: Disables assertion checking ASSERT_LEDON: Turns on LED0 when an assert fails. tinyos-2.1.2+dfsg/tos/lib/fragpool/000077500000000000000000000000001207233610700171455ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/fragpool/FragmentPool.nc000066400000000000000000000122521207233610700220660ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Support for a memory pool that fragments a large block into * arbitrarily sized smaller blocks based on need. * * The use case is buffer management for arbitrarily-sized messages, * such as HDLC frames received. A client requests a block of memory, * fills part of it, then returns the remainder to the pool. It may * then request a new block, while the newly received message is * processed. Ultimately, the fragment is released back to the pool. * The largest available fragment is returned for each request. * * @author Peter A. Bigot */ interface FragmentPool { /** Size of the pool, in bytes */ async command unsigned int poolSize (); /** Number of slots for the pool * * This imposes an upper limit on the number of fragments allowed. */ async command unsigned int slotCount (); /** Get the longest available fragment in the pool. * * @note No error checking is done on the pointers passed to this * method. You must provide addresses for both the start and the * end fragment pointer. * * @param start Pointer to where the start of the fragment should be * written. The address will be 16-bit aligned. The stored value * is valid only when this function returns SUCCESS. * * @param end Pointer to where the end of the fragment should be * written. This is the offset at which writing is no longer * permitted. The stored value is valid only when this function * returns SUCCESS. * * @param minimum_size Minimum size, in bytes, that is useful to * the caller. If the largest available fragment is not at least * this size, returns ENOMEM. * * @return SUCCESS if a fragment is available. ENOMEM if no * fragments are available. start and end are updated only if this * returns SUCCESS. */ async command error_t request (uint8_t** start, uint8_t** end, unsigned int minimum_size); /** Release part of a previously allocated fragment. * * Note that a lack of available slots may prevent the fragment from * being split, so there is no guarantee that the remainder of the * fragment is available for re-use. If it is, available() will be * signaled. If it is not, the entire fragment remains allocated * until it is released. * * @param start Pointer to the fragment start. Must be a value * previously returned by request but which has not been released or * frozen. * * @param end Pointer to the first byte of the released portion of * the fragment. * * @return SUCCESS in absence of an error, whether or not the * remainder of the fragment could be made available. EINVAL if the * provided start does not correspond to a fragment, or if the end * is outside the fragment. */ async command error_t freeze (const uint8_t* start, const uint8_t* end); /** Release the fragment at the given address. * * @param start The address returned as start from a previous * request that has not been released. * * @return SUCCESS if the fragment was freed. EINVAL if the start * address does not correspond to a fragment. EALREADY if the * fragment had already been released. */ async command error_t release (const uint8_t* start); /** Notification that a new fragment is available. * * Clients that require a minimum buffer length in order to function * may link to this event to be notified when a candidate is * created. * * @param length The number of bytes in the newly released * fragment. */ async event void available (unsigned int length); } tinyos-2.1.2+dfsg/tos/lib/fragpool/FragmentPoolC.nc000066400000000000000000000055661207233610700222030ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "FragmentPoolImpl.h" /** Allocate a block of memory that can be partioned into individual * fragments. * * There is no limit on the duration that a fragment may be held, nor * any assumption on the order in which fragments are released. * Requests will fail only if the entire pool is in use. * * @param POOL_SIZE_B the number of bytes in the fragmentable buffer. * This must be a multiple of two, to preserve 16-bit alignment. It's * not checked in the code, so don't be a goober and ignore this * requirement. * * @param FRAGMENT_COUNT the maximum number of fragments * * @author Peter A. Bigot */ generic configuration FragmentPoolC (unsigned int POOL_SIZE_B, unsigned int FRAGMENT_COUNT) { provides { interface FragmentPool; #if TEST_FRAGMENT_POOL interface FragmentPoolStorage; #endif /* TEST_FRAGMENT_POOL */ } } implementation { enum { POOL_ID = unique(UQ_FRAGMENT_POOL) }; components new FragmentPoolStorageP(POOL_ID, POOL_SIZE_B, FRAGMENT_COUNT); components FragmentPoolImplC; FragmentPoolImplC.FragmentPoolStorage[POOL_ID] -> FragmentPoolStorageP; FragmentPool = FragmentPoolImplC.FragmentPool[POOL_ID]; #if TEST_FRAGMENT_POOL FragmentPoolStorage = FragmentPoolStorageP; #endif /* TEST_FRAGMENT_POOL */ } tinyos-2.1.2+dfsg/tos/lib/fragpool/FragmentPoolImpl.h000066400000000000000000000055601207233610700225430ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _FRAGMENT_POOL_IMPL_H_ #define _FRAGMENT_POOL_IMPL_H_ /** The code used for unique identifiers for fragment pool */ #define UQ_FRAGMENT_POOL "Unique.FragmentPool" /** Type used for a fragment pool identifier. * * @note The test and validation infrastructure assumes this can take * negative values, so don't make it unsigned. */ typedef int fragment_pool_id_t; /** Structure used to represent a signal fragment of a pool. The * implementation maintains an array of these. The following * invariants hold: * * + the start address of the pool is the start address of the first * fragment * * + the sum of the absolute values of the fragment lengths equals the * size of the pool * * + if the length of fragment i is zero, the length of all following * fragments is zero * * + if the length of a fragment i is positive, the length of fragment * i+1 is non-positive (adjacent free fragments are merged) */ typedef struct FragmentPoolSlot_t { /** Pointer to the start of the fragment. Undefined if the slot * is not in use. */ uint8_t* start; /** Length of the fragment. If negative, the fragment is in use. * If zero, the slot is not in use. If positive, the fragment is * available. */ int length; } FragmentPoolSlot_t; #endif /* _FRAGMENT_POOL_IMPL_H_ */ tinyos-2.1.2+dfsg/tos/lib/fragpool/FragmentPoolImpl.nc000066400000000000000000000037411207233610700227130ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "FragmentPoolImpl.h" /** Internal interface used to communicate specific pool data to the * infrastructure. * * @author Peter A. Bigot */ interface FragmentPoolImpl { /** Return a pointer to the array of slots for a specific pool */ async command FragmentPoolSlot_t* slots (); /** Return the number of slots for a specific pool */ async command unsigned int slotCount (); } tinyos-2.1.2+dfsg/tos/lib/fragpool/FragmentPoolImplC.nc000066400000000000000000000045421207233610700230160ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "FragmentPoolImpl.h" /** Configuration that links together all the pools with the pool * management implementation. * * @author Peter A. Bigot */ configuration FragmentPoolImplC { provides { interface FragmentPool[fragment_pool_id_t]; #if TEST_FRAGMENT_POOL interface FragmentPoolTest; #endif /* TEST_FRAGMENT_POOL */ } uses { interface FragmentPoolStorage[fragment_pool_id_t]; } } implementation { enum { NUM_POOLS = uniqueCount(UQ_FRAGMENT_POOL) }; components new FragmentPoolImplP(NUM_POOLS); FragmentPool = FragmentPoolImplP; FragmentPoolStorage = FragmentPoolImplP; #if TEST_FRAGMENT_POOL FragmentPoolTest = FragmentPoolImplP; #endif /* TEST_FRAGMENT_POOL */ components MainC; MainC.SoftwareInit -> FragmentPoolImplP; } tinyos-2.1.2+dfsg/tos/lib/fragpool/FragmentPoolImplP.nc000066400000000000000000000277021207233610700230360ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Module to implement management of all fragment pools. * * @param NUM_POOLS The total number of pools allocated throughout the * system. * * @author Peter A. Bigot */ generic module FragmentPoolImplP (unsigned int NUM_POOLS) { provides { interface Init; interface FragmentPool[fragment_pool_id_t]; #if TEST_FRAGMENT_POOL interface FragmentPoolTest; #endif /* TEST_FRAGMENT_POOL */ } uses { interface FragmentPoolStorage[fragment_pool_id_t]; } } implementation { /** Information on a specific pool */ typedef struct FragmentPool_t { /** Where the slot array for the pool got placed */ FragmentPoolSlot_t* slots; /** The number of slots in the pool */ unsigned int slot_count; } FragmentPool_t; /** Data for all pools. The slots array contents of each structure * must be maintained atomically. */ FragmentPool_t pools__[NUM_POOLS]; #if TEST_FRAGMENT_POOL async command unsigned int FragmentPoolTest.numPools () { return sizeof(pools__) / sizeof(*pools__); } async command FragmentPoolSlot_t* FragmentPoolTest.slots (fragment_pool_id_t pid) { return pools__[pid].slots; } async command unsigned int FragmentPoolTest.slotCount (fragment_pool_id_t pid) { return pools__[pid].slot_count; } async command uint8_t* FragmentPoolTest.pool (fragment_pool_id_t pid) { return call FragmentPoolStorage.pool[pid](); } async command unsigned int FragmentPoolTest.poolSize (fragment_pool_id_t pid) { return call FragmentPoolStorage.poolSize[pid](); } #endif /* TEST_FRAGMENT_POOL */ bool initialized__; void initialize__ () { if (! initialized__) { int pid; /* Extract the individual pool data. Note that each pool can be a * different size, and have a different number of slots. This * code relies on zero-init of pools__ to maintain the slot * invariants. */ for (pid = 0; pid < NUM_POOLS; ++pid) { FragmentPool_t* pp = pools__ + pid; pp->slots = call FragmentPoolStorage.slots[pid](); pp->slot_count = call FragmentPoolStorage.slotCount[pid](); if (0 < pp->slot_count) { pp->slots[0].start = call FragmentPoolStorage.pool[pid](); pp->slots[0].length = call FragmentPoolStorage.poolSize[pid](); } } initialized__ = TRUE; } } #define CHECK_INITIALIZED__() atomic do { if (! initialized__) { initialize__(); } } while (0) command error_t Init.init () { atomic initialize__(); return SUCCESS; } default async command fragment_pool_id_t FragmentPoolStorage.id[ fragment_pool_id_t pid] () { return -1; } default async command uint8_t* FragmentPoolStorage.pool[ fragment_pool_id_t pid] () { return 0; } default async command unsigned int FragmentPoolStorage.poolSize[ fragment_pool_id_t pid] () { return 0; } default async command FragmentPoolSlot_t* FragmentPoolStorage.slots[ fragment_pool_id_t pid] () { return 0; } default async command unsigned int FragmentPoolStorage.slotCount[ fragment_pool_id_t pid] () { return 0; } default async event void FragmentPool.available[ fragment_pool_id_t pid] (unsigned int length) { } async command unsigned int FragmentPool.poolSize[ fragment_pool_id_t pid] () { return call FragmentPoolStorage.poolSize[pid](); } async command unsigned int FragmentPool.slotCount[ fragment_pool_id_t pid] () { return call FragmentPoolStorage.slotCount[pid](); } #if DEBUG_FRAGMENT_POOL void validatePool__ (fragment_pool_id_t pid) { FragmentPoolSlot_t* sp = pools_[pid].slots; FragmentPoolSlot_t* spe = sp + pools_[pid].slot_count; unsigned int size = 0; while (sp < spe) { size += abs(sp->length); ++sp; } if (call FragmentPoolStorage.poolSize[pid]() != size) { DisplayCode_lock(15); } } #else #define validatePool__(_p) ((void)0) #endif async command error_t FragmentPool.request[fragment_pool_id_t pid] (uint8_t** start, uint8_t** end, unsigned int minimum_size) { FragmentPoolSlot_t* sp; FragmentPoolSlot_t* spe; FragmentPoolSlot_t* bsp; unsigned int bsp_length; atomic { CHECK_INITIALIZED__(); sp = pools__[pid].slots; spe = sp + pools__[pid].slot_count; /* Find the longest open fragment in the pool that's at least * the requested size. */ bsp = 0; bsp_length = minimum_size; while (sp < spe) { if ((0 < sp->length) && (bsp_length <= sp->length)) { bsp = sp; bsp_length = sp->length; } ++sp; } /* If no satisfactory fragment is available, return failure. */ if (! bsp) { return ENOMEM; } /* Store the return values and mark the fragment in use */ *start = bsp->start; *end = bsp->start + bsp->length; bsp->length = - bsp->length; validatePool__(pid); } // end atomic return SUCCESS; } #if DEBUG_FRAGMENT_POOL volatile const uint8_t* start__; volatile const uint8_t* end__; volatile FragmentPoolSlot_t slots__[8]; #endif async command error_t FragmentPool.freeze[fragment_pool_id_t pid] (const uint8_t* start, const uint8_t* end) { FragmentPoolSlot_t* sp; FragmentPoolSlot_t* spe; unsigned int free_length; bool need_release = FALSE; //CHECK_INITIALIZED__(); sp = pools__[pid].slots; spe = sp + pools__[pid].slot_count; atomic { uint8_t* fep; #if DEBUG_FRAGMENT_POOL start__ = start; end__ = end; memcpy(slots__, pools_[pid].slots, pools_[pid].slot_count * sizeof(*slots__)); #endif while ((sp < spe) && (start != sp->start)) { ++sp; } if (sp == spe) { return EINVAL; } /* Get a pointer to the end of the original fragment */ fep = sp->start - sp->length; if ((end < sp->start) || (fep < end)) { // end not within fragment: error return EINVAL; } /* Determine how many bytes are potentially released. If it's * an odd number, decrement it to ensure fragment sizes are * multiples of two. */ free_length = fep - end; if (1 & free_length) { --free_length; } if (sp->start == end) { // Releasing whole thing; just use that implementation // (outside atomic block) need_release = TRUE; goto post_atomic; } if ((0 == free_length) || ((sp+1) == spe)) { // Entire fragment remains frozen; or, there're no slots to // merge to: short exit return SUCCESS; } if (0 < sp[1].length) { /* The following fragment is free, we can adjust its start to * merge it with the released portion without using any * additional slots. */ sp->length += free_length; ++sp; sp->start -= free_length; sp->length += free_length; } else { if (0 > sp[1].length) { /* Next slot holds a frozen fragment. We'll need to shift * it and everything that follows up one slot. If there are * no unused slots at the end, we just leave this fragment * fully allocated. */ if (0 != spe[-1].length) { // Last slot is used: no room to shift return SUCCESS; } /* Shift spe down to point to the first unused slot above * sp+1 (which we know is used) */ while (((sp+2) < spe) && (0 == spe[-1].length)) { --spe; } memmove(sp+2, sp+1, (spe - (sp+1)) * sizeof(*sp)); } sp->length += free_length; sp[1].start = sp->start - sp->length; ++sp; sp->length = free_length; } free_length = sp->length; post_atomic: validatePool__(pid); /*FALLTHRU*/ } /* atomic */ if (need_release) { return call FragmentPool.release[pid](start); } signal FragmentPool.available[pid](free_length); return SUCCESS; } async command error_t FragmentPool.release[fragment_pool_id_t pid] (const uint8_t* start) { FragmentPoolSlot_t* sp; FragmentPoolSlot_t* spe; FragmentPoolSlot_t* bsp; FragmentPoolSlot_t* asp; unsigned int merged_length; //CHECK_INITIALIZED__(); sp = pools__[pid].slots; spe = sp + pools__[pid].slot_count; atomic { /* Scan for the fragment at the given address. */ while ((sp < spe) && (start != sp->start)) { ++sp; } /* Two ways to fail: we didn't find the fragment, or the fragment * isn't in use. They're both catastrophic: one is a user * failure, the other may be either a user or an infrastructure * failure. Give the user a chance to identify the problem. */ if (sp == spe) { return EINVAL; } if (0 <= sp->length) { return EALREADY; } /* Release the fragment */ sp->length = -sp->length; /* See whether we can merge with the slot below and/or above * this one. */ bsp = asp = sp; if ((pools__[pid].slots < bsp) && (0 < bsp[-1].length)) { --bsp; } if (((asp+1) < spe) && (0 < asp[1].length)) { ++asp; } /* bsp points to the slot holding the start of the merged * fragment. asp points to the last slot that can be aggregated * into the merged fragment. If they aren't the same, there are * dead slots we can re-use. Shift the active slots above asp * down to above bsp, and reset the state of the rest. */ sp = bsp; if (bsp < asp) { int num_freed_slots = asp - bsp; /* Aggregate the lengths from the intervening slots into the first * one. */ asp = bsp; while (asp++ < (bsp + num_freed_slots)) { bsp->length += asp->length; } /* Keep copying until we've hit the upper bound or an unused * slot */ while (asp < spe) { asp[-num_freed_slots] = *asp; if (0 == asp->length) { break; } ++asp; } /* Mark unused the slots we freed */ bsp = asp - num_freed_slots; while (bsp < asp) { bsp->length = 0; ++bsp; } } merged_length = sp->length; validatePool__(pid); } // end atomic signal FragmentPool.available[pid](merged_length); return SUCCESS; } #undef CHECK_INITIALIZED__ } tinyos-2.1.2+dfsg/tos/lib/fragpool/FragmentPoolStorage.nc000066400000000000000000000046411207233610700234160ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "FragmentPoolImpl.h" /** Provide the core configuration information for a specific pool. * * This interface allows each pool to have a different buffer size and * number of available slots. On software initialization, the overall * pool manager collects the basic information for each pool and * initializes the data structures. * * @author Peter A. Bigot */ interface FragmentPoolStorage { /** The identifier for the pool; debug use only */ async command fragment_pool_id_t id (); /** Address of the start of the pool */ async command uint8_t* pool (); /** Size of the pool, in bytess */ async command unsigned int poolSize (); /** Pointer to the array of slots for the pool */ async command FragmentPoolSlot_t* slots (); /** Number of slots for the pool */ async command unsigned int slotCount (); } tinyos-2.1.2+dfsg/tos/lib/fragpool/FragmentPoolStorageP.nc000066400000000000000000000053421207233610700235350ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "FragmentPoolImpl.h" /** The module that reserves storage for the pool. * * @param POOL_SIZE_B the number of bytes in the fragmentable buffer * @param FRAGMENT_COUNT the maximum number of fragments * * @author Peter A. Bigot */ generic module FragmentPoolStorageP (fragment_pool_id_t POOL_ID, unsigned int POOL_SIZE_B, unsigned int FRAGMENT_COUNT) { provides interface FragmentPoolStorage; } implementation { /** The pool buffer. Aligned to 16-bits. */ uint16_t pool[(1 + POOL_SIZE_B) / 2]; /** Information on fragmentation of the buffer */ FragmentPoolSlot_t slots[FRAGMENT_COUNT]; // = { { (uint8_t*)pool, sizeof(pool) } }; async command fragment_pool_id_t FragmentPoolStorage.id () { return POOL_ID; } async command uint8_t* FragmentPoolStorage.pool () { return (uint8_t*)pool; } async command unsigned int FragmentPoolStorage.poolSize () { return sizeof(pool); } async command FragmentPoolSlot_t* FragmentPoolStorage.slots () { return slots; } async command unsigned int FragmentPoolStorage.slotCount () { return sizeof(slots) / sizeof(*slots); } } tinyos-2.1.2+dfsg/tos/lib/fragpool/FragmentPoolTest.nc000066400000000000000000000054211207233610700227260ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "FragmentPoolImpl.h" /** Back-end interface for white-box testing of implementation. * * Provides low-level access to the internals of FragmentPoolImplP so * that we can externally verify maintenance of the slot invariants * and retrieve other information that is not normally necessary in * client modules. * * @author Peter A. Bigot */ interface FragmentPoolTest { /** The number of pools supported by the system */ async command unsigned int numPools (); /** Access the slot data for a given pool. * * @param pid The pool id for which the first slot is requested */ async command FragmentPoolSlot_t* slots (fragment_pool_id_t pid); /** Provide the number of slots in the given pool. * * @param pid The pool id for which the slot count is requested */ async command unsigned int slotCount (fragment_pool_id_t pid); /** Access the buffer for a given pool. * * @param pid The pool id for which the buffer is requested */ async command uint8_t* pool (fragment_pool_id_t pid); /** Provide the size of the given pool. * * @param pid The pool id for which the pool size is requested */ async command unsigned int poolSize (fragment_pool_id_t pid); } tinyos-2.1.2+dfsg/tos/lib/fragpool/README.txt000066400000000000000000000015471207233610700206520ustar00rootroot00000000000000Introduction to FragmentPoolC This utility provides support for a memory pool that fragments a large block into arbitrarily sized smaller blocks based on need. The use case is buffer management for arbitrarily-sized messages, such as HDLC frames received. A client requests a block of memory, fills part of it, then returns the remainder to the pool. It may then request a new block, while the newly received message is processed. Ultimately, the fragment is released back to the pool. The largest available fragment is returned for each request. The size of the buffer and the number of fragments that can be simultaneously supported are individually configurable for each pool. There is no limit on the duration that a fragment may be held, nor any assumption on the order in which fragments are released. Requests will fail only if the entire pool is in use. tinyos-2.1.2+dfsg/tos/lib/fragpool/tests/000077500000000000000000000000001207233610700203075ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/fragpool/tests/Basic/000077500000000000000000000000001207233610700213305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/fragpool/tests/Basic/Makefile000066400000000000000000000002151207233610700227660ustar00rootroot00000000000000COMPONENT = TestAppC PFLAGS += -DTEST_FRAGMENT_POOL PFLAGS += -I$(TOSDIR)/lib/fragpool PFLAGS += -I$(TOSDIR)/lib/printf include $(MAKERULES) tinyos-2.1.2+dfsg/tos/lib/fragpool/tests/Basic/TestAppC.nc000066400000000000000000000040361207233610700233400ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Unit test for the behavior of the FragmentPool infrastructure. * * @author Peter A. Bigot */ configuration TestAppC { } implementation { components TestP; components MainC; TestP.Boot -> MainC; components new FragmentPoolC(1024, 10); TestP.FragmentPool -> FragmentPoolC; TestP.FragmentPoolStorage -> FragmentPoolC; components FragmentPoolImplC; TestP.FragmentPoolTest -> FragmentPoolImplC; #include } tinyos-2.1.2+dfsg/tos/lib/fragpool/tests/Basic/TestP.nc000066400000000000000000000477401207233610700227250ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include module TestP { uses { interface Boot; interface FragmentPool; interface FragmentPoolStorage; interface FragmentPoolTest; } #include } implementation { #include #ifndef MAX_SLOTS #define MAX_SLOTS (20) #endif /* MAX_SLOTS */ /** Length of the fragment from the most recent * FragmentPool.available() event. Normally set to -1 to indicate * no fragments have been released. */ int fragmentLength_; uint8_t* fragments_[MAX_SLOTS]; unsigned int fragmentLengths_[MAX_SLOTS]; async event void FragmentPool.available (unsigned int length) { fragmentLength_ = length; } int verifyPoolIntegrity (fragment_pool_id_t pid, const char* tag) { FragmentPoolSlot_t* slots = call FragmentPoolTest.slots(pid); unsigned int slot_count = call FragmentPoolTest.slotCount(pid); uint8_t* pool = call FragmentPoolTest.pool(pid); unsigned int pool_size = call FragmentPoolTest.poolSize(pid); uint8_t* pp = pool; unsigned int size = 0; int sid = 0; int used_fragments = 0; printf("Verifying integrity of pool %d for %s\r\n", pid, tag); while (sid < slot_count) { FragmentPoolSlot_t* sp = slots + sid; //printf(" SLOT[%d] : %p %d\r\n", sid, sp->start, sp->length); /* Stop on unused slot */ if (0 == sp->length) { break; } /* Fragment should start at proper address */ ASSERT_EQUAL_PTR(pp, sp->start); /* Adjust next fragment address and total length */ if (0 < sp->length) { /* Fragment is available */ pp += sp->length; size += sp->length; if (0 < sid) { /* Previous fragment must be in use */ ASSERT_TRUE(0 > slots[sid-1].length); } if ((sid+1) < slot_count) { /* Next slot must not be available */ ASSERT_TRUE(0 >= slots[sid+1].length); } } else { // (0 > sp->length) /* Fragment is in use */ ++used_fragments; pp -= sp->length; size -= sp->length; } ++sid; } /* Entire pool must be accounted for in fragments */ ASSERT_EQUAL(pool_size, size); /* Remainder of pool slots must be marked unused */ while (sid < slot_count) { FragmentPoolSlot_t* sp = slots + sid; //printf(" SLOT[%d] : UNUSED %p %d\r\n", sid, sp->start, sp->length); ASSERT_EQUAL(0, sp->length); // ASSERT_EQUAL_PTR(0, sp->start); ++sid; } printf("done Verifying integrity of pool %d for %s; %d fragments in use\r\n", pid, tag, used_fragments); /* Return the number of fragments that were in use */ return used_fragments; } void verifyPoolAvailable (fragment_pool_id_t pid, const char* tag) { int n; printf("Verifying pool %d is completely available at %s\r\n", pid, tag); n = verifyPoolIntegrity(pid, tag); ASSERT_EQUAL(0, n); printf("done Verifying pool %d is completely available at %s\r\n", pid, tag); } void testPoolCount () { ASSERT_EQUAL(1, call FragmentPoolTest.numPools()); ASSERT_EQUAL(call FragmentPoolTest.slotCount(0), call FragmentPoolStorage.slotCount()); } void testPoolInit () { fragment_pool_id_t pid; pid = call FragmentPoolTest.numPools(); while (0 <= --pid) { FragmentPoolSlot_t* slots = call FragmentPoolTest.slots(pid); int slot_count = call FragmentPoolTest.slotCount(pid); int sid = 0; ASSERT_EQUAL_PTR(slots[sid].start, call FragmentPoolStorage.pool()); ASSERT_TRUE(0 == (1 & ((uint16_t)slots[sid].start))); ASSERT_EQUAL(slots[sid].length, call FragmentPoolStorage.poolSize()); ASSERT_TRUE(0 == (1 & slots[sid].length)); while (++sid < slot_count) { ASSERT_EQUAL_PTR(slots[sid].start, 0); ASSERT_EQUAL(slots[sid].length, 0); } } ASSERT_EQUAL(call FragmentPool.poolSize(), call FragmentPoolStorage.poolSize()); ASSERT_EQUAL(call FragmentPool.slotCount(), call FragmentPoolStorage.slotCount()); } void testPool0Params () { printf("Pool id %d ; addr %p ; size %u ; slots %p ; slotCount %u\r\n", call FragmentPoolStorage.id(), call FragmentPoolStorage.pool(), call FragmentPoolStorage.poolSize(), call FragmentPoolStorage.slots(), call FragmentPoolStorage.slotCount()); ASSERT_EQUAL(0, call FragmentPoolStorage.id()); ASSERT_EQUAL(1024, call FragmentPoolStorage.poolSize()); ASSERT_EQUAL(10, call FragmentPoolStorage.slotCount()); } void testSingleAlloc () { fragment_pool_id_t pid = call FragmentPoolStorage.id(); FragmentPoolSlot_t* slots = call FragmentPoolTest.slots(pid); //unsigned int slot_count = call FragmentPoolTest.slotCount(pid); uint8_t* pool = call FragmentPoolStorage.pool(); unsigned int pool_size = call FragmentPoolStorage.poolSize(); uint8_t* start; uint8_t* end; uint8_t* start2; uint8_t* end2; error_t rc; verifyPoolAvailable(pid, "testSingleAlloc.pre"); rc = call FragmentPool.request(&start, &end, 0); /* Returned fragment equals entire pool */ ASSERT_EQUAL(SUCCESS, rc); ASSERT_EQUAL_PTR(pool, start); ASSERT_EQUAL_PTR(start + pool_size, end); /* One slot, all in use */ ASSERT_EQUAL_PTR(pool, slots[0].start); ASSERT_EQUAL(- pool_size, slots[0].length); ASSERT_EQUAL_PTR(0, slots[1].start); ASSERT_EQUAL(0, slots[1].length); /* Can't allocate another fragment */ rc = call FragmentPool.request(&start2, &end2, 0); ASSERT_EQUAL(ENOMEM, rc); /* Release the fragment */ fragmentLength_ = -1; rc = call FragmentPool.release(start); ASSERT_EQUAL(SUCCESS, rc); ASSERT_EQUAL(pool_size, fragmentLength_); /* One slot, available */ ASSERT_EQUAL_PTR(pool, slots[0].start); ASSERT_EQUAL(pool_size, slots[0].length); ASSERT_EQUAL_PTR(0, slots[1].start); ASSERT_EQUAL(0, slots[1].length); verifyPoolAvailable(pid, "testSingleAlloc.post"); } void testDoubleAlloc () { fragment_pool_id_t pid = call FragmentPoolStorage.id(); FragmentPoolSlot_t* slots = call FragmentPoolTest.slots(pid); //unsigned int slot_count = call FragmentPoolTest.slotCount(pid); uint8_t* pool = call FragmentPoolStorage.pool(); unsigned int pool_size = call FragmentPoolStorage.poolSize(); uint8_t* start; uint8_t* end; unsigned int length; int rv; error_t rc; verifyPoolAvailable(pid, "testDoubleAlloc.init"); rc = call FragmentPool.request(&start, &end, 0); /* Returned fragment equals entire pool */ ASSERT_EQUAL(SUCCESS, rc); ASSERT_EQUAL_PTR(pool, start); ASSERT_EQUAL_PTR(start + pool_size, end); /* One slot, all in use */ rv = verifyPoolIntegrity(pid, "testDoubleAlloc.post1"); ASSERT_EQUAL(1, rv); /* Freeze half the pool */ length = (end - start) / 2; fragmentLength_ = -1; rc = call FragmentPool.freeze(start, start + length); ASSERT_EQUAL(SUCCESS, rc); ASSERT_EQUAL(length, fragmentLength_); rv = verifyPoolIntegrity(pid, "testDoubleAlloc.postRel1"); ASSERT_EQUAL(1, rv); ASSERT_EQUAL(pool_size - length, slots[1].length); ASSERT_EQUAL_PTR(pool + length, slots[1].start); /* Release the frozen half */ fragmentLength_ = -1; rc = call FragmentPool.release(start); ASSERT_EQUAL(SUCCESS, rc); ASSERT_EQUAL(pool_size, fragmentLength_); // merged fragment is entire pool verifyPoolAvailable(pid, "testDoubleAlloc.done"); } // Check that we cannot allocate more fragments than there are // slots, even if there is space available. void testOverPartition () { fragment_pool_id_t pid = call FragmentPoolStorage.id(); unsigned int slot_count = call FragmentPoolTest.slotCount(pid); unsigned int pool_size = call FragmentPoolStorage.poolSize(); char tag[16]; error_t rc; int length = 0; int sid; int n; uint8_t* start; uint8_t* end; ASSERT_TRUE(slot_count <= MAX_SLOTS); verifyPoolAvailable(pid, "testOverPartition.init"); sid = 0; while (sid < slot_count) { rc = call FragmentPool.request(&start, &end, 0); ASSERT_EQUAL(SUCCESS, rc); sprintf(tag, "tOP %d req", sid); verifyPoolIntegrity(pid, tag); fragments_[sid] = start; ++sid; fragmentLength_ = -1; rc = call FragmentPool.freeze(start, start + 2*sid); ASSERT_EQUAL(SUCCESS, rc); if (sid < slot_count) { length += 2*sid; ASSERT_EQUAL(fragmentLength_, pool_size - length); } else { // No slots to partition last fragment ASSERT_EQUAL(fragmentLength_, -1); } sprintf(tag, "tOP %d frz", sid); n = verifyPoolIntegrity(pid, tag); ASSERT_EQUAL(sid, n); } rc = call FragmentPool.request(&start, &end, 0); ASSERT_EQUAL(ENOMEM, rc); verifyPoolIntegrity(pid, "tOP.denied"); while (0 <= --sid) { fragmentLength_ = -1; rc = call FragmentPool.release(fragments_[sid]); sprintf(tag, "tOP %d rel", sid); verifyPoolIntegrity(pid, tag); ASSERT_EQUAL(fragmentLength_, pool_size - length); length -= 2*sid; } verifyPoolAvailable(pid, "testOverPartition.done"); } int partitionPool (uint8_t** fragments, fragment_pool_id_t pid, int num_fragments) { unsigned int slot_count = call FragmentPoolTest.slotCount(pid); unsigned int pool_size = call FragmentPoolStorage.poolSize(); uint8_t* start = 0; uint8_t* end; int sid; int per_fragment_length; error_t rc; int n; if (num_fragments > slot_count) { num_fragments = slot_count; } per_fragment_length = pool_size / num_fragments; for (sid = 0; sid < num_fragments; ++sid) { if (0 < sid) { rc = call FragmentPool.freeze(start, start + per_fragment_length); ASSERT_EQUAL(SUCCESS, rc); fragmentLengths_[sid-1] = per_fragment_length; } rc = call FragmentPool.request(&start, &end, 0); ASSERT_EQUAL(SUCCESS, rc); fragments_[sid] = start; } fragmentLengths_[sid-1] = pool_size - (num_fragments - 1) * per_fragment_length; n = verifyPoolIntegrity(pid, "partitionPool"); ASSERT_EQUAL(num_fragments, n); return num_fragments; } void testFreezeMisuse () { fragment_pool_id_t pid = call FragmentPoolStorage.id(); uint8_t* pool = call FragmentPoolStorage.pool(); unsigned int pool_size = call FragmentPoolStorage.poolSize(); int length; uint8_t* start; uint8_t* end; error_t rc; // pass invalid start pointer verifyPoolAvailable(pid, "testFreezeMisuse.init"); rc = call FragmentPool.freeze(pool, pool + pool_size); ASSERT_EQUAL(EINVAL, rc); rc = call FragmentPool.freeze(pool + 4, pool + 8); ASSERT_EQUAL(EINVAL, rc); rc = call FragmentPool.request(&start, &end, 0); ASSERT_EQUAL(SUCCESS, rc); length = 1 + pool_size / 4; // end not in fragment rc = call FragmentPool.freeze(start, start - 4); ASSERT_EQUAL(EINVAL, rc); rc = call FragmentPool.freeze(start, end + 4); ASSERT_EQUAL(EINVAL, rc); // end equals fragment end rc = call FragmentPool.freeze(start, end); ASSERT_EQUAL(SUCCESS, rc); // end equals start rc = call FragmentPool.freeze(start, start); ASSERT_EQUAL(SUCCESS, rc); verifyPoolAvailable(pid, "testFreezeMisuse.freezeStart"); } // test full and partial slot usage void testForwardReleaseFull () { fragment_pool_id_t pid = call FragmentPoolStorage.id(); unsigned int slot_count = call FragmentPoolTest.slotCount(pid); int num_fragments = partitionPool(fragments_, pid, slot_count); char tag[16]; int sid; error_t rc; int n; ASSERT_EQUAL(slot_count, num_fragments); for (sid = 0; sid < num_fragments; ++sid) { sprintf(tag, "tFRF.%d", sid); n = verifyPoolIntegrity(pid, tag); ASSERT_EQUAL(num_fragments - sid, n); rc = call FragmentPool.release(fragments_[sid]); ASSERT_EQUAL(SUCCESS, rc); } verifyPoolAvailable(pid, "tFRF.done"); } void testBackwardReleaseFull () { fragment_pool_id_t pid = call FragmentPoolStorage.id(); unsigned int slot_count = call FragmentPoolTest.slotCount(pid); int num_fragments = partitionPool(fragments_, pid, slot_count); char tag[16]; int rsid; int sid; error_t rc; int n; ASSERT_EQUAL(slot_count, num_fragments); for (rsid = 0; rsid < num_fragments; ++rsid) { sid = num_fragments - rsid - 1; sprintf(tag, "tBRF.%d", rsid); n = verifyPoolIntegrity(pid, tag); ASSERT_EQUAL(num_fragments - rsid, n); rc = call FragmentPool.release(fragments_[sid]); ASSERT_EQUAL(SUCCESS, rc); } verifyPoolAvailable(pid, "tFRF.done"); } void testMiddleRelease () { fragment_pool_id_t pid = call FragmentPoolStorage.id(); unsigned int slot_count = call FragmentPoolTest.slotCount(pid); int num_fragments = partitionPool(fragments_, pid, slot_count); char tag[16]; int nfreed; int sid; error_t rc; int n; ASSERT_EQUAL(slot_count, num_fragments); nfreed = 0; // Release the odd-numbered fragments nfreed = 0; for (sid = 1; sid < num_fragments; sid += 2) { sprintf(tag, "tMR.%d", sid); rc = call FragmentPool.release(fragments_[sid]); fragments_[sid] = 0; ++nfreed; n = verifyPoolIntegrity(pid, tag); ASSERT_EQUAL(num_fragments - nfreed, n); } n = verifyPoolIntegrity(pid, "tMR.evenRel"); ASSERT_EQUAL(slot_count / 2, n); // Release fragment 2. This merges with 1 and 3 already released. fragmentLength_ = -1; rc = call FragmentPool.release(fragments_[2]); ASSERT_EQUAL(SUCCESS, rc); fragments_[2] = 0; ++nfreed; ASSERT_EQUAL(fragmentLength_, fragmentLengths_[1] + fragmentLengths_[2] + fragmentLengths_[3]); n = verifyPoolIntegrity(pid, "tMR.2"); ASSERT_EQUAL(num_fragments - nfreed, n); // Release the remaining fragments for (sid = 0; sid < num_fragments; ++sid) { if (0 == fragments_[sid]) { continue; } sprintf(tag, "tMR.%d", sid); rc = call FragmentPool.release(fragments_[sid]); ASSERT_EQUAL(SUCCESS, rc); ++nfreed; n = verifyPoolIntegrity(pid, tag); ASSERT_EQUAL(num_fragments - nfreed, n); } verifyPoolAvailable(pid, "tFRF.done"); } void testAlignment () { fragment_pool_id_t pid = call FragmentPoolStorage.id(); FragmentPoolSlot_t* slots = call FragmentPoolTest.slots(pid); error_t rc; uint8_t* start; uint8_t* end; rc = call FragmentPool.request(&start, &end, 0); ASSERT_TRUE(0 == (1 & ((uint16_t)start))); ASSERT_TRUE(0 == (1 & ((uint16_t)end))); rc = call FragmentPool.freeze(start, start + 3); ASSERT_EQUAL_PTR(start, slots[0].start); ASSERT_EQUAL(-4, slots[0].length); ASSERT_EQUAL_PTR(start+4, slots[1].start); rc = call FragmentPool.release(start); } void testMiddleFreeze () { fragment_pool_id_t pid = call FragmentPoolStorage.id(); unsigned int slot_count = call FragmentPoolTest.slotCount(pid); int num_fragments = partitionPool(fragments_, pid, slot_count); int rsid; error_t rc; ASSERT_EQUAL(slot_count, num_fragments); verifyPoolIntegrity(pid, "mf1"); /* Release slot 2 */ rc = call FragmentPool.release(fragments_[2]); fragments_[2] = 0; ASSERT_EQUAL(SUCCESS, rc); /* Freeze slot 1 */ rc = call FragmentPool.freeze(fragments_[1], fragments_[1] + 5); ASSERT_EQUAL(SUCCESS, rc); verifyPoolIntegrity(pid, "mf2"); for (rsid = 0; rsid < num_fragments; ++rsid) { if (fragments_[rsid]) { rc = call FragmentPool.release(fragments_[rsid]); } } verifyPoolAvailable(pid, "mf3"); } void testMinimumSize () { fragment_pool_id_t pid = call FragmentPoolStorage.id(); unsigned int slot_count = call FragmentPoolTest.slotCount(pid); int num_fragments = partitionPool(fragments_, pid, slot_count); uint8_t* start; uint8_t* end; int frag_size; int rsid; error_t rc; ASSERT_EQUAL(slot_count, num_fragments); verifyPoolIntegrity(pid, "mf1"); /* Release slot 2 */ fragmentLength_ = -1; rc = call FragmentPool.release(fragments_[2]); ASSERT_EQUAL(SUCCESS, rc); ASSERT_TRUE(0 < fragmentLength_); frag_size = fragmentLength_ + 3; rc = call FragmentPool.request(&start, &end, frag_size); ASSERT_EQUAL(ENOMEM, rc); rc = call FragmentPool.release(fragments_[3]); ASSERT_EQUAL(SUCCESS, rc); ASSERT_TRUE(frag_size < fragmentLength_); rc = call FragmentPool.request(&start, &end, frag_size); ASSERT_EQUAL(SUCCESS, rc); rc = call FragmentPool.release(start); ASSERT_EQUAL(SUCCESS, rc); verifyPoolIntegrity(pid, "mf2"); for (rsid = 0; rsid < num_fragments; ++rsid) { if (fragments_[rsid]) { rc = call FragmentPool.release(fragments_[rsid]); } } verifyPoolAvailable(pid, "mf3"); } void testDoubleFreezeInternal () { fragment_pool_id_t pid = call FragmentPoolStorage.id(); unsigned int slot_count = call FragmentPoolTest.slotCount(pid); int num_fragments = partitionPool(fragments_, pid, slot_count); uint8_t* start; uint8_t* end; int frag_size; int rsid; error_t rc; /* Set up so the first N-1 slots are used, with the last one * empty */ call FragmentPool.release(fragments_[slot_count-1]); call FragmentPool.release(fragments_[slot_count-2]); rc = call FragmentPool.request(&start, &end, 0); verifyPoolIntegrity(pid, "dfi1"); /* Now reduce the size of the second-to-last active slot */ call FragmentPool.freeze(fragments_[slot_count-3], fragments_[slot_count-3] + 5); verifyPoolIntegrity(pid, "dfi2"); call FragmentPool.release(start); for (rsid = 0; rsid < num_fragments; ++rsid) { if (fragments_[rsid]) { rc = call FragmentPool.release(fragments_[rsid]); } } verifyPoolAvailable(pid, "dfiend"); } event void Boot.booted () { printf("Starting test of FragmentPool\r\n"); testPoolCount(); testPoolInit(); verifyPoolIntegrity(call FragmentPoolStorage.id(), "begin"); testPool0Params(); testSingleAlloc(); testDoubleAlloc(); testOverPartition(); testFreezeMisuse(); testForwardReleaseFull(); testBackwardReleaseFull(); testMiddleRelease(); testAlignment(); testMiddleFreeze(); testMinimumSize(); testDoubleFreezeInternal(); verifyPoolIntegrity(call FragmentPoolStorage.id(), "end"); ALL_TESTS_PASSED(); } } tinyos-2.1.2+dfsg/tos/lib/ftsp/000077500000000000000000000000001207233610700163105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/ftsp/GlobalTime.nc000066400000000000000000000061321207233610700206530ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti, Brano Kusy (kusy@isis.vanderbilt.edu) * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) */ #include "Timer.h" interface GlobalTime { /** * Returns the current local time of this mote. */ async command uint32_t getLocalTime(); /** * Reads the current global time. This method is a combination * of getLocalTime and local2Global. * @return SUCCESS if this mote is synchronized, FAIL otherwise. */ async command error_t getGlobalTime(uint32_t *time); /** * Converts the local time given in time into the * corresponding global time and stores this again in * time. The following equation is used to compute the * conversion: * * globalTime = localTime + offset + skew * (localTime - syncPoint) * * The skew is normalized to 0.0 (1.0 is subtracted) to increase the * machine precision. The syncPoint value is periodically updated to * increase the machine precision of the floating point arithmetic and * also to allow time wrap. * * @return SUCCESS if this mote is synchronized, FAIL otherwise. */ async command error_t local2Global(uint32_t *time); /** * Converts the global time given in time into the * correspoding local time and stores this again in * time. This method performs the inverse of the * local2Global transformation. * * @return SUCCESS if this mote is synchronized, FAIL otherwise. */ async command error_t global2Local(uint32_t *time); } tinyos-2.1.2+dfsg/tos/lib/ftsp/TimeSync32kC.nc000077500000000000000000000063341207233610700210210ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti, Brano Kusy, Janos Sallai * Date last modified: 3/17/03 * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) * Adapted for 32kHz and LPL: 6/16/09 by Thomas Schmid (thomas.schmid@ucla.edu) */ #include "TimeSyncMsg.h" configuration TimeSync32kC { uses interface Boot; provides interface Init; provides interface StdControl; provides interface GlobalTime; //interfaces for extra functionality: need not to be wired provides interface TimeSyncInfo; provides interface TimeSyncMode; provides interface TimeSyncNotify; } implementation { components new TimeSyncP(T32khz) as TimeSyncP; GlobalTime = TimeSyncP; StdControl = TimeSyncP; Init = TimeSyncP; Boot = TimeSyncP; TimeSyncInfo = TimeSyncP; TimeSyncMode = TimeSyncP; TimeSyncNotify = TimeSyncP; components TimeSyncMessageC as ActiveMessageC; TimeSyncP.RadioControl -> ActiveMessageC; TimeSyncP.Send -> ActiveMessageC.TimeSyncAMSend32khz[TIMESYNC_AM_FTSP]; TimeSyncP.Receive -> ActiveMessageC.Receive[TIMESYNC_AM_FTSP]; TimeSyncP.TimeSyncPacket -> ActiveMessageC; components Counter32khz32C, new CounterToLocalTimeC(T32khz) as LocalTime32khzC; LocalTime32khzC.Counter -> Counter32khz32C; TimeSyncP.LocalTime -> LocalTime32khzC; components new TimerMilliC() as TimerC; TimeSyncP.Timer -> TimerC; components RandomC; TimeSyncP.Random -> RandomC; #if defined(TIMESYNC_LEDS) components LedsC; #else components NoLedsC as LedsC; #endif TimeSyncP.Leds -> LedsC; #ifdef LOW_POWER_LISTENING TimeSyncP.LowPowerListening -> ActiveMessageC; #endif } tinyos-2.1.2+dfsg/tos/lib/ftsp/TimeSyncC.nc000066400000000000000000000060271207233610700204750ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti, Brano Kusy, Janos Sallai * Date last modified: 3/17/03 * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) */ #include "TimeSyncMsg.h" configuration TimeSyncC { uses interface Boot; provides interface Init; provides interface StdControl; provides interface GlobalTime; //interfaces for extra fcionality: need not to be wired provides interface TimeSyncInfo; provides interface TimeSyncMode; provides interface TimeSyncNotify; } implementation { components new TimeSyncP(TMilli); GlobalTime = TimeSyncP; StdControl = TimeSyncP; Init = TimeSyncP; Boot = TimeSyncP; TimeSyncInfo = TimeSyncP; TimeSyncMode = TimeSyncP; TimeSyncNotify = TimeSyncP; components TimeSyncMessageC as ActiveMessageC; TimeSyncP.RadioControl -> ActiveMessageC; TimeSyncP.Send -> ActiveMessageC.TimeSyncAMSendMilli[TIMESYNC_AM_FTSP]; TimeSyncP.Receive -> ActiveMessageC.Receive[TIMESYNC_AM_FTSP]; TimeSyncP.TimeSyncPacket -> ActiveMessageC; components LocalTimeMilliC; TimeSyncP.LocalTime -> LocalTimeMilliC; components new TimerMilliC() as TimerC; TimeSyncP.Timer -> TimerC; components RandomC; TimeSyncP.Random -> RandomC; #if defined(TIMESYNC_LEDS) components LedsC; #else components NoLedsC as LedsC; #endif TimeSyncP.Leds -> LedsC; #ifdef LOW_POWER_LISTENING TimeSyncP.LowPowerListening -> ActiveMessageC; #endif } tinyos-2.1.2+dfsg/tos/lib/ftsp/TimeSyncInfo.nc000066400000000000000000000052751207233610700212120ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti, Brano Kusy (kusy@isis.vanderbilt.edu) * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) */ interface TimeSyncInfo { /** * Returns current offset of the local time wrt global time. */ async command uint32_t getOffset(); /** * Returns current skew of the local time wrt global time. * This value is normalized to 0.0 (1.0 is subtracted) to get maximum * representation precision. */ async command float getSkew(); /** * Returns the local time of the last synchronization point. This * value is close to the current local time and updated when a new * time synchronization message arrives. */ async command uint32_t getSyncPoint(); /** * Returns the current root to which this node is synchronized. */ async command uint16_t getRootID(); /** * Returns the latest seq number seen from the current root. */ async command uint8_t getSeqNum(); /** * Returns the number of entries stored currently in the * regerssion table. */ async command uint8_t getNumEntries(); /** * Returns the value of heartBeats variable. */ async command uint8_t getHeartBeats(); } tinyos-2.1.2+dfsg/tos/lib/ftsp/TimeSyncMode.nc000066400000000000000000000046501207233610700211770ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti, Brano Kusy (kusy@isis.vanderbilt.edu) * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) */ /** * the time sync module can work in two modes: * - TS_TIMER_MODE (default): TS msgs sent period. from the timer * - TS_USER_MODE: TS msgs sent only when explic. asked by user * via TimeSyncMode.send() command, TimeSync.Timer * is stopped in this mode */ interface TimeSyncMode { /** * Sets the current mode of the TimeSync module. * returns FAIL if didn't succeed */ command error_t setMode(uint8_t mode); /** * Gets the current mode of the TimeSync module. */ command uint8_t getMode(); /** * command to send out time synchronization message. * returns FAIL if TimeSync not in TS_USER_MODE */ command error_t send(); } tinyos-2.1.2+dfsg/tos/lib/ftsp/TimeSyncMsg.h000066400000000000000000000053331207233610700206670ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti, Brano Kusy (kusy@isis.vanderbilt.edu) * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) */ #if defined(TIMESYNCMSG_H) #else #define TIMESYNCMSG_H typedef nx_struct TimeSyncMsg { nx_uint16_t rootID; // the node id of the synchronization root nx_uint16_t nodeID; // the node if of the sender nx_uint8_t seqNum; // sequence number for the root /* * After TEP 133, the message timestamp contains the difference between * event time and the time the message was actually sent out. TimeSyncP * sends the local time associated with this globalTime to the * TimeStamping mechanism, which then calculates the difference. * * On the receiving side, the difference is applied to the local * timestamp. The receiving timestamp thus represents the time on the * receiving clock when the remote globalTime was taken. */ nx_uint32_t globalTime; //just for convenience nx_uint32_t localTime; } TimeSyncMsg; enum { TIMESYNC_AM_FTSP = 0x3E, TIMESYNCMSG_LEN = sizeof(TimeSyncMsg) - sizeof(nx_uint32_t), TS_TIMER_MODE = 0, // see TimeSyncMode interface TS_USER_MODE = 1, // see TimeSyncMode interface }; #endif tinyos-2.1.2+dfsg/tos/lib/ftsp/TimeSyncNotify.nc000066400000000000000000000041101207233610700215520ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti, Brano Kusy (kusy@isis.vanderbilt.edu) * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) */ /** * time sync module (TimeSyncM) provides notification of arriving * and transmitted time-sync msgs through TimeSyncNotify interface: */ interface TimeSyncNotify { /** * fired when time-sync msg is received and accepted */ event void msg_received(); /** * fired when time-sync msg is sent by TimeSyncM or the sending did not * succeed */ event void msg_sent(); } tinyos-2.1.2+dfsg/tos/lib/ftsp/TimeSyncP.nc000066400000000000000000000371701207233610700205150ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Miklos Maroti, Brano Kusy (kusy@isis.vanderbilt.edu), Janos Sallai * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) */ #include "TimeSyncMsg.h" generic module TimeSyncP(typedef precision_tag) { provides { interface Init; interface StdControl; interface GlobalTime; //interfaces for extra functionality: need not to be wired interface TimeSyncInfo; interface TimeSyncMode; interface TimeSyncNotify; } uses { interface Boot; interface SplitControl as RadioControl; interface TimeSyncAMSend as Send; interface Receive; interface Timer; interface Random; interface Leds; interface TimeSyncPacket; interface LocalTime as LocalTime; #ifdef LOW_POWER_LISTENING interface LowPowerListening; #endif } } implementation { #ifndef TIMESYNC_RATE #define TIMESYNC_RATE 10 #endif enum { MAX_ENTRIES = 8, // number of entries in the table BEACON_RATE = TIMESYNC_RATE, // how often send the beacon msg (in seconds) ROOT_TIMEOUT = 5, //time to declare itself the root if no msg was received (in sync periods) IGNORE_ROOT_MSG = 4, // after becoming the root ignore other roots messages (in send period) ENTRY_VALID_LIMIT = 4, // number of entries to become synchronized ENTRY_SEND_LIMIT = 3, // number of entries to send sync messages ENTRY_THROWOUT_LIMIT = 500, // if time sync error is bigger than this clear the table }; typedef struct TableItem { uint8_t state; uint32_t localTime; int32_t timeOffset; // globalTime - localTime } TableItem; enum { ENTRY_EMPTY = 0, ENTRY_FULL = 1, }; TableItem table[MAX_ENTRIES]; uint8_t tableEntries; enum { STATE_IDLE = 0x00, STATE_PROCESSING = 0x01, STATE_SENDING = 0x02, STATE_INIT = 0x04, }; uint8_t state, mode; /* We do linear regression from localTime to timeOffset (globalTime - localTime). This way we can keep the slope close to zero (ideally) and represent it as a float with high precision. timeOffset - offsetAverage = skew * (localTime - localAverage) timeOffset = offsetAverage + skew * (localTime - localAverage) globalTime = localTime + offsetAverage + skew * (localTime - localAverage) */ float skew; uint32_t localAverage; int32_t offsetAverage; uint8_t numEntries; // the number of full entries in the table message_t processedMsgBuffer; message_t* processedMsg; message_t outgoingMsgBuffer; TimeSyncMsg* outgoingMsg; uint8_t heartBeats; // the number of sucessfully sent messages // since adding a new entry with lower beacon id than ours async command uint32_t GlobalTime.getLocalTime() { return call LocalTime.get(); } async command error_t GlobalTime.getGlobalTime(uint32_t *time) { *time = call GlobalTime.getLocalTime(); return call GlobalTime.local2Global(time); } error_t is_synced() { if (numEntries>=ENTRY_VALID_LIMIT || outgoingMsg->rootID==TOS_NODE_ID) return SUCCESS; else return FAIL; } async command error_t GlobalTime.local2Global(uint32_t *time) { *time += offsetAverage + (int32_t)(skew * (int32_t)(*time - localAverage)); return is_synced(); } async command error_t GlobalTime.global2Local(uint32_t *time) { uint32_t approxLocalTime = *time - offsetAverage; *time = approxLocalTime - (int32_t)(skew * (int32_t)(approxLocalTime - localAverage)); return is_synced(); } void calculateConversion() { float newSkew = skew; uint32_t newLocalAverage; int32_t newOffsetAverage; int32_t localAverageRest; int32_t offsetAverageRest; int64_t localSum; int64_t offsetSum; int8_t i; for(i = 0; i < MAX_ENTRIES && table[i].state != ENTRY_FULL; ++i) ; if( i >= MAX_ENTRIES ) // table is empty return; /* We use a rough approximation first to avoid time overflow errors. The idea is that all times in the table should be relatively close to each other. */ newLocalAverage = table[i].localTime; newOffsetAverage = table[i].timeOffset; localSum = 0; localAverageRest = 0; offsetSum = 0; offsetAverageRest = 0; while( ++i < MAX_ENTRIES ) if( table[i].state == ENTRY_FULL ) { /* This only works because C ISO 1999 defines the signe for modulo the same as for the Dividend! */ localSum += (int32_t)(table[i].localTime - newLocalAverage) / tableEntries; localAverageRest += (table[i].localTime - newLocalAverage) % tableEntries; offsetSum += (int32_t)(table[i].timeOffset - newOffsetAverage) / tableEntries; offsetAverageRest += (table[i].timeOffset - newOffsetAverage) % tableEntries; } newLocalAverage += localSum + localAverageRest / tableEntries; newOffsetAverage += offsetSum + offsetAverageRest / tableEntries; localSum = offsetSum = 0; for(i = 0; i < MAX_ENTRIES; ++i) if( table[i].state == ENTRY_FULL ) { int32_t a = table[i].localTime - newLocalAverage; int32_t b = table[i].timeOffset - newOffsetAverage; localSum += (int64_t)a * a; offsetSum += (int64_t)a * b; } if( localSum != 0 ) newSkew = (float)offsetSum / (float)localSum; atomic { skew = newSkew; offsetAverage = newOffsetAverage; localAverage = newLocalAverage; numEntries = tableEntries; } } void clearTable() { int8_t i; for(i = 0; i < MAX_ENTRIES; ++i) table[i].state = ENTRY_EMPTY; atomic numEntries = 0; } uint8_t numErrors=0; void addNewEntry(TimeSyncMsg *msg) { int8_t i, freeItem = -1, oldestItem = 0; uint32_t age, oldestTime = 0; int32_t timeError; // clear table if the received entry's been inconsistent for some time timeError = msg->localTime; call GlobalTime.local2Global((uint32_t*)(&timeError)); timeError -= msg->globalTime; if( (is_synced() == SUCCESS) && (timeError > ENTRY_THROWOUT_LIMIT || timeError < -ENTRY_THROWOUT_LIMIT)) { if (++numErrors>3) clearTable(); return; // don't incorporate a bad reading } tableEntries = 0; // don't reset table size unless you're recounting numErrors = 0; for(i = 0; i < MAX_ENTRIES; ++i) { age = msg->localTime - table[i].localTime; //logical time error compensation if( age >= 0x7FFFFFFFL ) table[i].state = ENTRY_EMPTY; if( table[i].state == ENTRY_EMPTY ) freeItem = i; else ++tableEntries; if( age >= oldestTime ) { oldestTime = age; oldestItem = i; } } if( freeItem < 0 ) freeItem = oldestItem; else ++tableEntries; table[freeItem].state = ENTRY_FULL; table[freeItem].localTime = msg->localTime; table[freeItem].timeOffset = msg->globalTime - msg->localTime; } void task processMsg() { TimeSyncMsg* msg = (TimeSyncMsg*)(call Send.getPayload(processedMsg, sizeof(TimeSyncMsg))); if( msg->rootID < outgoingMsg->rootID && //after becoming the root, a node ignores messages that advertise the old root (it may take //some time for all nodes to timeout and discard the old root) !(heartBeats < IGNORE_ROOT_MSG && outgoingMsg->rootID == TOS_NODE_ID) ){ outgoingMsg->rootID = msg->rootID; outgoingMsg->seqNum = msg->seqNum; } else if( outgoingMsg->rootID == msg->rootID && (int8_t)(msg->seqNum - outgoingMsg->seqNum) > 0 ) { outgoingMsg->seqNum = msg->seqNum; } else goto exit; call Leds.led0Toggle(); if( outgoingMsg->rootID < TOS_NODE_ID ) heartBeats = 0; addNewEntry(msg); calculateConversion(); signal TimeSyncNotify.msg_received(); exit: state &= ~STATE_PROCESSING; } event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) { #ifdef TIMESYNC_DEBUG // this code can be used to simulate multiple hopsf uint8_t incomingID = (uint8_t)((TimeSyncMsg*)payload)->nodeID; int8_t diff = (incomingID & 0x0F) - (TOS_NODE_ID & 0x0F); if( diff < -1 || diff > 1 ) return msg; diff = (incomingID & 0xF0) - (TOS_NODE_ID & 0xF0); if( diff < -16 || diff > 16 ) return msg; #endif if( (state & STATE_PROCESSING) == 0 && call TimeSyncPacket.isValid(msg)) { message_t* old = processedMsg; processedMsg = msg; ((TimeSyncMsg*)(payload))->localTime = call TimeSyncPacket.eventTime(msg); state |= STATE_PROCESSING; post processMsg(); return old; } return msg; } task void sendMsg() { uint32_t localTime, globalTime; globalTime = localTime = call GlobalTime.getLocalTime(); call GlobalTime.local2Global(&globalTime); // we need to periodically update the reference point for the root // to avoid wrapping the 32-bit (localTime - localAverage) value if( outgoingMsg->rootID == TOS_NODE_ID ) { if( (int32_t)(localTime - localAverage) >= 0x20000000 ) { atomic { localAverage = localTime; offsetAverage = globalTime - localTime; } } } else if( heartBeats >= ROOT_TIMEOUT ) { heartBeats = 0; //to allow ROOT_SWITCH_IGNORE to work outgoingMsg->rootID = TOS_NODE_ID; ++(outgoingMsg->seqNum); // maybe set it to zero? } outgoingMsg->globalTime = globalTime; #ifdef LOW_POWER_LISTENING call LowPowerListening.setRemoteWakeupInterval(&outgoingMsgBuffer, LPL_INTERVAL); #endif // we don't send time sync msg, if we don't have enough data if( numEntries < ENTRY_SEND_LIMIT && outgoingMsg->rootID != TOS_NODE_ID ){ ++heartBeats; state &= ~STATE_SENDING; } else if( call Send.send(AM_BROADCAST_ADDR, &outgoingMsgBuffer, TIMESYNCMSG_LEN, localTime ) != SUCCESS ){ state &= ~STATE_SENDING; signal TimeSyncNotify.msg_sent(); } } event void Send.sendDone(message_t* ptr, error_t error) { if (ptr != &outgoingMsgBuffer) return; if(error == SUCCESS) { ++heartBeats; call Leds.led1Toggle(); if( outgoingMsg->rootID == TOS_NODE_ID ) ++(outgoingMsg->seqNum); } state &= ~STATE_SENDING; signal TimeSyncNotify.msg_sent(); } void timeSyncMsgSend() { if( outgoingMsg->rootID == 0xFFFF && ++heartBeats >= ROOT_TIMEOUT ) { outgoingMsg->seqNum = 0; outgoingMsg->rootID = TOS_NODE_ID; } if( outgoingMsg->rootID != 0xFFFF && (state & STATE_SENDING) == 0 ) { state |= STATE_SENDING; post sendMsg(); } } event void Timer.fired() { if (mode == TS_TIMER_MODE) { timeSyncMsgSend(); } else call Timer.stop(); } command error_t TimeSyncMode.setMode(uint8_t mode_){ if (mode_ == TS_TIMER_MODE){ call Timer.startPeriodic((uint32_t)(896U+(call Random.rand16()&0xFF)) * BEACON_RATE); } else call Timer.stop(); mode = mode_; return SUCCESS; } command uint8_t TimeSyncMode.getMode(){ return mode; } command error_t TimeSyncMode.send(){ if (mode == TS_USER_MODE){ timeSyncMsgSend(); return SUCCESS; } return FAIL; } command error_t Init.init() { atomic{ skew = 0.0; localAverage = 0; offsetAverage = 0; }; clearTable(); atomic outgoingMsg = (TimeSyncMsg*)call Send.getPayload(&outgoingMsgBuffer, sizeof(TimeSyncMsg)); outgoingMsg->rootID = 0xFFFF; processedMsg = &processedMsgBuffer; state = STATE_INIT; return SUCCESS; } event void Boot.booted() { call RadioControl.start(); call StdControl.start(); } command error_t StdControl.start() { heartBeats = 0; outgoingMsg->nodeID = TOS_NODE_ID; call TimeSyncMode.setMode(TS_TIMER_MODE); return SUCCESS; } command error_t StdControl.stop() { call Timer.stop(); return SUCCESS; } async command float TimeSyncInfo.getSkew() { return skew; } async command uint32_t TimeSyncInfo.getOffset() { return offsetAverage; } async command uint32_t TimeSyncInfo.getSyncPoint() { return localAverage; } async command uint16_t TimeSyncInfo.getRootID() { return outgoingMsg->rootID; } async command uint8_t TimeSyncInfo.getSeqNum() { return outgoingMsg->seqNum; } async command uint8_t TimeSyncInfo.getNumEntries() { return numEntries; } async command uint8_t TimeSyncInfo.getHeartBeats() { return heartBeats; } default event void TimeSyncNotify.msg_received(){} default event void TimeSyncNotify.msg_sent(){} event void RadioControl.startDone(error_t error){} event void RadioControl.stopDone(error_t error){} } tinyos-2.1.2+dfsg/tos/lib/ftsp/TimeSyncTRadioC.nc000077500000000000000000000064301207233610700216010ustar00rootroot00000000000000/* * Copyright (c) 2002, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti, Brano Kusy, Janos Sallai * Date last modified: 3/17/03 * Ported to T2: 3/17/08 by Brano Kusy (branislav.kusy@gmail.com) * Adapted for 32kHz and LPL: 6/16/09 by Thomas Schmid (thomas.schmid@ucla.edu) * Adapted for TRadio: 2/21/11 by Thomas Schmid */ #include "TimeSyncMsg.h" #include "RadioConfig.h" configuration TimeSyncTRadioC { uses interface Boot; provides interface Init; provides interface StdControl; provides interface GlobalTime; //interfaces for extra functionality: need not to be wired provides interface TimeSyncInfo; provides interface TimeSyncMode; provides interface TimeSyncNotify; } implementation { components new TimeSyncP(TRadio) as TimeSyncP; GlobalTime = TimeSyncP; StdControl = TimeSyncP; Init = TimeSyncP; Boot = TimeSyncP; TimeSyncInfo = TimeSyncP; TimeSyncMode = TimeSyncP; TimeSyncNotify = TimeSyncP; components TimeSyncMessageC as ActiveMessageC; TimeSyncP.RadioControl -> ActiveMessageC; TimeSyncP.Send -> ActiveMessageC.TimeSyncAMSendRadio[TIMESYNC_AM_FTSP]; TimeSyncP.Receive -> ActiveMessageC.Receive[TIMESYNC_AM_FTSP]; TimeSyncP.TimeSyncPacket -> ActiveMessageC; components CounterRadio32C, new CounterToLocalTimeC(TRadio) as LocalTimeC; LocalTimeC.Counter -> CounterRadio32C; TimeSyncP.LocalTime -> LocalTimeC; components new TimerMilliC() as TimerC; TimeSyncP.Timer -> TimerC; components RandomC; TimeSyncP.Random -> RandomC; #if defined(TIMESYNC_LEDS) components LedsC; #else components NoLedsC as LedsC; #endif TimeSyncP.Leds -> LedsC; #ifdef LOW_POWER_LISTENING TimeSyncP.LowPowerListening -> ActiveMessageC; #endif } tinyos-2.1.2+dfsg/tos/lib/gpio/000077500000000000000000000000001207233610700162725ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/gpio/SoftCaptureC.nc000066400000000000000000000045461207233610700211670ustar00rootroot00000000000000// $Id: SoftCaptureC.nc,v 1.6 2008-06-11 00:46:24 razvanm Exp $ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /** * Emulates GPIO capture functionality using GpioInterrupt and the * standard 32khz counter * * @author Phil Buonadonna */ generic configuration SoftCaptureC() { provides interface GpioCapture; uses interface GpioInterrupt; } implementation { components new SoftCaptureP(); components Counter32khzC; GpioCapture = SoftCaptureP; GpioInterrupt = SoftCaptureP; SoftCaptureP.Counter32khz32 -> Counter32khzC.Counter32khz32; } tinyos-2.1.2+dfsg/tos/lib/gpio/SoftCaptureP.nc000066400000000000000000000055761207233610700212100ustar00rootroot00000000000000// $Id: SoftCaptureP.nc,v 1.6 2008-06-11 00:46:24 razvanm Exp $ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /** * Emulates GPIO capture functionality using GpioInterrupt and the * standard 32khz counter * * @author Phil Buonadonna */ generic module SoftCaptureP () { provides interface GpioCapture; uses { interface GpioInterrupt; interface Counter as Counter32khz32; } } implementation { async command error_t GpioCapture.captureRisingEdge() { return (call GpioInterrupt.enableRisingEdge()); } async command error_t GpioCapture.captureFallingEdge() { return (call GpioInterrupt.enableFallingEdge()); } async command void GpioCapture.disable() { call GpioInterrupt.disable(); return; } async event void GpioInterrupt.fired() { uint16_t captureTime; captureTime = (uint16_t) call Counter32khz32.get(); signal GpioCapture.captured(captureTime); return; } async event void Counter32khz32.overflow() { return; } default async event void GpioCapture.captured(uint16_t time) { return; } } tinyos-2.1.2+dfsg/tos/lib/gpio/SoftIrqC.nc000066400000000000000000000042301207233610700203050ustar00rootroot00000000000000/** * Copyright (c) 2004-2005 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Martin Turon * * $Id: SoftIrqC.nc,v 1.5 2010-06-29 22:07:47 scipio Exp $ */ /** * Software emulation of external interrupt pin. */ generic configuration SoftIrqC (uint8_t interval) { provides { interface Interrupt; // interrupt interface to emulate } uses { interface GeneralIO; // pin to poll for irq } } implementation { components new SoftIrqP(interval), new TimerMilliC() as IrqTimer; Interrupt = SoftIrqP; GeneralIO = SoftIrqP; SoftIrqP.IrqTimer -> IrqTimer; // strap into an OSKI system timer } tinyos-2.1.2+dfsg/tos/lib/gpio/SoftIrqP.nc000066400000000000000000000064671207233610700203400ustar00rootroot00000000000000/** * Copyright (c) 2004-2005 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Matt Miller, Crossbow * @author Martin Turon, Crossbow * * $Id: SoftIrqP.nc,v 1.5 2010-06-29 22:07:47 scipio Exp $ */ /** * Interrupt emulation interface access for GPIO pins. * * @param interval How often to check soft irq pin in msec */ generic module SoftIrqP (uint8_t interval) { provides interface Interrupt as SoftIrq; uses { interface Timer as IrqTimer; interface GeneralIO as IrqPin; } } implementation { norace struct { uint8_t final : 1; uint8_t last : 1; } state; // ************* SoftIrq Interrupt handlers and dispatch ************* /** * Enable an edge interrupt on a SoftIrq pin that is not capable of * external hardware INTERRUPT. Best we can do is poll periodically * and monitor line level changes */ async command error_t SoftIrq.startWait(bool low_to_high) { atomic { state.final = low_to_high; } // save state we await state.last = call IrqPin.get(); // get current state call IrqTimer.startOneShotNow(interval); // wait interval in msec return SUCCESS; } /** * Timer Event fired so now check SoftIrq pin level */ event void IrqTimer.fired() { uint8_t l_state = call IrqPin.get(); if ((state.last != state.final) && (state.final == l_state)) { // If we found an edge, fire SoftIrq! signal SoftIrq.fired(); } // Otherwise, restart timer and try again state.last = l_state; return call IrqTimer.startOneShotNow(interval); } /** * disables Irq interrupts */ async command error_t SoftIrq.disable() { call IrqTimer.stop(); return SUCCESS; } //default async event void SoftIrq.fired() { return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/mac/000077500000000000000000000000001207233610700160745ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/000077500000000000000000000000001207233610700171225ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/ActiveMessageC.nc000066400000000000000000000112471207233610700222740ustar00rootroot00000000000000/* * Copyright (c) 2011, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== * Author(s): Jan Hauer * ======================================================================== */ /* The Active Message abstraction on top of the TKN15.4 MAC. Take a look at the * top of TKN154ActiveMessageP.nc to understand the approach (and issues). **/ // Disable scanning (MLME_SCAN will not work): #define IEEE154_SCAN_DISABLED // Disable promiscuous mode (PromiscuousMode.start() will not work): #define IEEE154_PROMISCUOUS_MODE_DISABLED // Disable association (MLME_ASSOCIATE will not work): #define IEEE154_ASSOCIATION_DISABLED // Disable association (MLME_DISASSOCIATE will not work): #define IEEE154_DISASSOCIATION_DISABLED // Disable coordinator realignment (MLME_ORPHAN will not work): #define IEEE154_COORD_REALIGNMENT_DISABLED // Disable transmission of broadcasts from coordinator to devices: #define IEEE154_COORD_BROADCAST_DISABLED // Disable indirect transmissions (MCPS_DATA.request with TX_OPTIONS_INDIRECT will not work): #define IEEE154_INDIRECT_TX_DISABLED // Disallow next higher layer to switch to receive mode (MLME_RX_ENABLE will fail): #define IEEE154_RXENABLE_DISABLED // Set the MAC Tx queue sizes to minimum (one DATA frame): #ifdef TXCONTROL_POOL_SIZE #undef TXCONTROL_POOL_SIZE #endif #define TXCONTROL_POOL_SIZE 0 #ifdef TXFRAME_POOL_SIZE #undef TXFRAME_POOL_SIZE #endif #define TXFRAME_POOL_SIZE 1 #ifdef CAP_TX_QUEUE_SIZE #undef CAP_TX_QUEUE_SIZE #endif #define CAP_TX_QUEUE_SIZE 1 #if defined(LOW_POWER_LISTENING) // If LOW_POWER_LISTENING is defined, then AMSenderC() instantiates an LplAMSenderC // instead of a DirectAMSenderC(). Currently we only support a DirectAMSenderC(). #error "LOW_POWER_LISTENING must not be defined when TKN15.4 MAC is used!" #endif configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; // The following interface may be useful to access more metadata // (RSSI, LQI, timestamp) of a frame interface IEEE154Frame; /* interface PacketTimeStamp as PacketTimeStamp32khz;*/ /* interface PacketTimeStamp as PacketTimeStampMilli;*/ /* interface LowPowerListening;*/ } } implementation { components TKN154ActiveMessageP as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; AMPacket = AM; Packet = AM; PacketAcknowledgements = AM; /* LowPowerListening = AM;*/ /* PacketTimeStamp32khz = AM;*/ /* PacketTimeStampMilli = AM;*/ components ActiveMessageAddressC; AM.ActiveMessageAddress -> ActiveMessageAddressC; components new StateC(); AM.SplitControlState -> StateC; components Ieee802154NonBeaconEnabledC as MAC; IEEE154Frame = MAC; AM.MLME_RESET -> MAC; AM.MCPS_DATA -> MAC; AM.MLME_SET -> MAC; AM.MLME_GET -> MAC; AM.Frame-> MAC; AM.SubPacket -> MAC.Packet; components LedsC; AM.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/AssociateP.nc000066400000000000000000000334211207233610700215020ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.9 $ * $Date: 2009-12-14 12:50:06 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" module AssociateP { provides { interface Init; interface MLME_ASSOCIATE; interface MLME_COMM_STATUS; } uses { interface FrameRx as AssociationRequestRx; interface FrameTx as AssociationRequestTx; interface FrameExtracted as AssociationResponseExtracted; interface FrameTx as AssociationResponseTx; interface DataRequest; interface Timer as ResponseTimeout; interface Pool as TxFramePool; interface Pool as TxControlPool; interface MLME_GET; interface MLME_SET; interface FrameUtility; interface IEEE154Frame as Frame; interface Get as LocalExtendedAddress; } } implementation { enum { S_IDLE = 0xFF, }; uint8_t m_payloadAssocRequest[2]; uint8_t m_payloadAssocResponse[MAX_PENDING_ASSOC_RESPONSES][4]; uint8_t m_coordAddrMode; uint8_t m_assocRespStatus; uint16_t m_shortAddress; bool m_associationOngoing; command error_t Init.init() { uint8_t i; call ResponseTimeout.stop(); m_payloadAssocRequest[0] = S_IDLE; m_coordAddrMode = 0; m_associationOngoing = FALSE; for (i=0; iSecurityLevel) status = IEEE154_UNSUPPORTED_SECURITY; else if (ChannelPage != IEEE154_SUPPORTED_CHANNELPAGE || LogicalChannel > 26 || !(IEEE154_SUPPORTED_CHANNELS & ((uint32_t) 1 << LogicalChannel)) || (CoordAddrMode != ADDR_MODE_SHORT_ADDRESS && CoordAddrMode != ADDR_MODE_EXTENDED_ADDRESS)) status = IEEE154_INVALID_PARAMETER; else if (m_associationOngoing || !(txFrame = call TxFramePool.get())) status = IEEE154_TRANSACTION_OVERFLOW; else if (!(txControl = call TxControlPool.get())) { call TxFramePool.put(txFrame); status = IEEE154_TRANSACTION_OVERFLOW; } if (status == IEEE154_SUCCESS) { m_assocRespStatus = IEEE154_NO_DATA; m_shortAddress = 0xFFFF; call MLME_SET.phyCurrentChannel(LogicalChannel); call MLME_SET.macPANId(CoordPANID); m_coordAddrMode = CoordAddrMode; if (CoordAddrMode == ADDR_MODE_SHORT_ADDRESS) call MLME_SET.macCoordShortAddress(CoordAddress.shortAddress); else call MLME_SET.macCoordExtendedAddress(CoordAddress.extendedAddress); txFrame->header = &txControl->header; txFrame->metadata = &txControl->metadata; srcAddress.extendedAddress = call LocalExtendedAddress.get(); txFrame->headerLen = call FrameUtility.writeHeader( txFrame->header->mhr, CoordAddrMode, CoordPANID, &CoordAddress, ADDR_MODE_EXTENDED_ADDRESS, 0xFFFF, &srcAddress, 0); txFrame->header->mhr[MHR_INDEX_FC1] = FC1_ACK_REQUEST | FC1_FRAMETYPE_CMD; txFrame->header->mhr[MHR_INDEX_FC2] = FC2_SRC_MODE_EXTENDED | (CoordAddrMode == ADDR_MODE_SHORT_ADDRESS ? FC2_DEST_MODE_SHORT : FC2_DEST_MODE_EXTENDED); m_payloadAssocRequest[0] = CMD_FRAME_ASSOCIATION_REQUEST; m_payloadAssocRequest[1] = *((uint8_t*) &CapabilityInformation); txFrame->payload = m_payloadAssocRequest; txFrame->payloadLen = 2; m_associationOngoing = TRUE; if ((status = call AssociationRequestTx.transmit(txFrame)) != IEEE154_SUCCESS) { m_associationOngoing = FALSE; call TxFramePool.put(txFrame); call TxControlPool.put(txControl); } } dbg_serial("AssociationP", "MLME_ASSOCIATE.request -> result: %lu\n", (uint32_t) status); return status; } event void AssociationRequestTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { call TxControlPool.put((ieee154_txcontrol_t*) ((uint8_t*) txFrame->header - offsetof(ieee154_txcontrol_t, header))); call TxFramePool.put(txFrame); if (status != IEEE154_SUCCESS) { dbg_serial("AssociationP", "transmitDone() failed!\n"); m_associationOngoing = FALSE; signal MLME_ASSOCIATE.confirm(0xFFFF, status, 0); } else { // we expect a response from the coordinator within "macResponseWaitTime" call ResponseTimeout.startOneShot(call MLME_GET.macResponseWaitTime()*IEEE154_aBaseSuperframeDuration); dbg_serial("AssociationP", "transmitDone() ok, waiting for %lu\n", (uint32_t) (call MLME_GET.macResponseWaitTime() * IEEE154_aBaseSuperframeDuration)); } } event message_t* AssociationResponseExtracted.received(message_t* frame, ieee154_txframe_t *txFrame) { uint8_t *payload = (uint8_t *) &frame->data; ieee154_macShortAddress_t shortAddress = *((nxle_uint16_t*) (payload + 1)); ieee154_association_status_t assocRespStatus = *(payload + 3); if (m_associationOngoing) { call ResponseTimeout.stop(); m_associationOngoing = FALSE; if (assocRespStatus == IEEE154_ASSOCIATION_SUCCESSFUL) { call MLME_SET.macShortAddress(shortAddress); if ((call MLME_GET.macCoordShortAddress() != IEEE154_DEFAULT_COORDSHORTADDRESS) && (call Frame.getSrcAddrMode(frame) == ADDR_MODE_EXTENDED_ADDRESS)) { ieee154_address_t coordExtendedAddress; call Frame.getSrcAddr(frame, &coordExtendedAddress); call MLME_SET.macCoordExtendedAddress(coordExtendedAddress.extendedAddress); } } else call MLME_SET.macPANId(0xFFFF); signal MLME_ASSOCIATE.confirm( call MLME_GET.macShortAddress(), assocRespStatus, NULL); dbg_serial("AssociationP", "confirm, status: %lu, my new address: 0x%lx\n", (uint32_t) assocRespStatus, (uint32_t) shortAddress); } return frame; } event void ResponseTimeout.fired() { uint8_t coordAddress[8]; nxle_uint16_t *shortAddress = (nxle_uint16_t*) coordAddress; if (!m_associationOngoing) return; // have not yet received an AssociationResponse within "macResponseWaitTime", // -> we explicitly poll the coordinator now dbg_serial("AssociationP", "Polling the coordinator for an AssociationResponse now...\n"); if (m_coordAddrMode == ADDR_MODE_SHORT_ADDRESS) *shortAddress = call MLME_GET.macCoordShortAddress(); else call FrameUtility.copyCoordExtendedAddressLE(coordAddress); if (call DataRequest.poll(m_coordAddrMode, call MLME_GET.macPANId(), coordAddress, ADDR_MODE_EXTENDED_ADDRESS) != IEEE154_SUCCESS) { signal DataRequest.pollDone(); // this will signal FAIL to the next higher layer dbg_serial("AssociationP", "Poll failed (locally)...\n"); } } event void DataRequest.pollDone() { if (m_associationOngoing) { // our explicit poll did not result in an AssociationResponse, give up... call ResponseTimeout.stop(); m_associationOngoing = FALSE; call MLME_SET.macPANId(0xFFFF); signal MLME_ASSOCIATE.confirm(0xFFFF, IEEE154_NO_DATA, 0); dbg_serial("AssociationP", "No AssociationResponse after polling...\n"); } } /* ------------------- MLME_ASSOCIATE Response ------------------- */ event message_t* AssociationRequestRx.received(message_t* frame) { uint8_t *payload = (uint8_t *) &frame->data; ieee154_address_t srcAddress; if (call Frame.getSrcAddrMode(frame) == ADDR_MODE_EXTENDED_ADDRESS && call Frame.getSrcAddr(frame, &srcAddress) == SUCCESS) signal MLME_ASSOCIATE.indication(srcAddress.extendedAddress, *((ieee154_CapabilityInformation_t*) (payload + 1)), 0); return frame; } command ieee154_status_t MLME_ASSOCIATE.response ( uint64_t deviceAddress, uint16_t assocShortAddress, ieee154_association_status_t status, ieee154_security_t *security) { uint8_t i; ieee154_status_t txStatus = IEEE154_SUCCESS; ieee154_txframe_t *txFrame; ieee154_txcontrol_t *txControl; ieee154_address_t srcAddress; for (i=0; iSecurityLevel) txStatus = IEEE154_UNSUPPORTED_SECURITY; else if (i == MAX_PENDING_ASSOC_RESPONSES || !(txFrame = call TxFramePool.get())) txStatus = IEEE154_TRANSACTION_OVERFLOW; else if (!(txControl = call TxControlPool.get())) { call TxFramePool.put(txFrame); txStatus = IEEE154_TRANSACTION_OVERFLOW; } else { txFrame->header = &txControl->header; txFrame->metadata = &txControl->metadata; txFrame->payload = m_payloadAssocResponse[i]; srcAddress.extendedAddress = call LocalExtendedAddress.get(); txFrame->headerLen = call FrameUtility.writeHeader( txFrame->header->mhr, ADDR_MODE_EXTENDED_ADDRESS, call MLME_GET.macPANId(), (ieee154_address_t*) &deviceAddress, ADDR_MODE_EXTENDED_ADDRESS, call MLME_GET.macPANId(), &srcAddress, 1); txFrame->header->mhr[MHR_INDEX_FC1] = FC1_ACK_REQUEST | FC1_FRAMETYPE_CMD | FC1_PAN_ID_COMPRESSION; txFrame->header->mhr[MHR_INDEX_FC2] = FC2_SRC_MODE_EXTENDED | FC2_DEST_MODE_EXTENDED; txFrame->payload[0] = CMD_FRAME_ASSOCIATION_RESPONSE; *((nxle_uint16_t*) &txFrame->payload[1]) = assocShortAddress; txFrame->payload[3] = status; txFrame->payloadLen = 4; if ((txStatus = call AssociationResponseTx.transmit(txFrame)) != IEEE154_SUCCESS) { txFrame->payload[0] = S_IDLE; call TxFramePool.put(txFrame); call TxControlPool.put(txControl); } } return txStatus; } event void AssociationResponseTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { ieee154_address_t srcAddress, deviceAddress; srcAddress.extendedAddress = call LocalExtendedAddress.get(); if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == FC2_DEST_MODE_SHORT) deviceAddress.shortAddress = *((nxle_uint16_t*) (&(txFrame->header->mhr[MHR_INDEX_ADDRESS]) + 2)); else call FrameUtility.convertToNative(&deviceAddress.extendedAddress, (&(txFrame->header->mhr[MHR_INDEX_ADDRESS]) + 2)); txFrame->payload[0] = S_IDLE; call TxControlPool.put((ieee154_txcontrol_t*) ((uint8_t*) txFrame->header - offsetof(ieee154_txcontrol_t, header))); call TxFramePool.put(txFrame); signal MLME_COMM_STATUS.indication(call MLME_GET.macPANId(), ADDR_MODE_EXTENDED_ADDRESS, srcAddress, ADDR_MODE_EXTENDED_ADDRESS, deviceAddress, status, 0); } /* ------------------- Defaults ------------------- */ default event void MLME_ASSOCIATE.indication ( uint64_t DeviceAddress, ieee154_CapabilityInformation_t CapabilityInformation, ieee154_security_t *security) {} default event void MLME_ASSOCIATE.confirm ( uint16_t AssocShortAddress, uint8_t status, ieee154_security_t *security) {} default event void MLME_COMM_STATUS.indication ( uint16_t PANId, uint8_t SrcAddrMode, ieee154_address_t SrcAddr, uint8_t DstAddrMode, ieee154_address_t DstAddr, ieee154_status_t status, ieee154_security_t *security) {} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/BackupP.nc000066400000000000000000000043331207233610700207740ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2008-06-16 18:00:22 $ * @author Jan Hauer * ======================================================================== */ generic module BackupP(typedef backup_t) { provides { interface SetNow as Store; interface GetNow as Retrieve; } } implementation { backup_t m_backup; async command error_t Store.setNow(backup_t* backup) { memcpy(&m_backup, backup, sizeof(backup_t)); return SUCCESS; } async command backup_t* Retrieve.getNow() { return &m_backup; } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/BeaconRequestRxP.nc000066400000000000000000000152241207233610700226420ustar00rootroot00000000000000/* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-05-28 09:52:54 $ * @author: Jasper Buesch * ======================================================================== */ #include "TKN154_MAC.h" #include "TKN154.h" module BeaconRequestRxP { provides { interface Init as Reset; interface IEEE154TxBeaconPayload; } uses { interface FrameRx as BeaconRequestRx; interface FrameTx as BeaconRequestResponseTx; interface MLME_GET; interface FrameUtility; interface IEEE154Frame as Frame; } } implementation { /* variables that describe the beacon (payload) */ norace ieee154_txframe_t m_beaconFrame; ieee154_header_t m_header; ieee154_metadata_t m_metadata; uint8_t m_beaconPayloadLen; uint8_t m_payload[IEEE154_aMaxBeaconPayloadLength]; /* ------------------- Init ------------------- */ command error_t Reset.init() { m_beaconPayloadLen = 0; m_beaconFrame.header = &m_header; m_beaconFrame.headerLen = 0; m_beaconFrame.payload = m_payload; m_beaconFrame.payloadLen = 4; // first 4 bytes belong to superframe- & gts-fields m_beaconFrame.metadata = &m_metadata; dbg_serial("BeaconRequestResponderP","Init()\n"); return SUCCESS; } /* ------------------- Beacon-Request Response ------------------- */ task void sendBeaconTask(){ call BeaconRequestResponseTx.transmit(&m_beaconFrame); } event message_t* BeaconRequestRx.received(message_t* frame) { uint8_t offset = 0; ieee154_macShortAddress_t shortAddress = call MLME_GET.macShortAddress(); bool isShortAddr; shortAddress = call MLME_GET.macShortAddress(); isShortAddr = (shortAddress != 0xFFFE); m_beaconFrame.header->mhr[MHR_INDEX_FC1] = FC1_FRAMETYPE_BEACON; m_beaconFrame.header->mhr[MHR_INDEX_FC2] = isShortAddr ? FC2_SRC_MODE_SHORT : FC2_SRC_MODE_EXTENDED; offset = MHR_INDEX_ADDRESS; *((nxle_uint16_t*) &m_beaconFrame.header->mhr[offset]) = call MLME_GET.macPANId(); offset += sizeof(ieee154_macPANId_t); if (isShortAddr) { *((nxle_uint16_t*) &m_beaconFrame.header->mhr[offset]) = shortAddress; offset += sizeof(ieee154_macShortAddress_t); } else { call FrameUtility.copyLocalExtendedAddressLE(&m_beaconFrame.header->mhr[offset]); offset += 8; } m_beaconFrame.headerLen = offset; // Superframe-spec m_payload[BEACON_INDEX_SF_SPEC1] = 0xff; // beacon- and superframe order always 15 in nonbeacon-enabled mode m_payload[BEACON_INDEX_SF_SPEC2] = 0x00; if (call MLME_GET.macPanCoordinator() == TRUE) m_payload[BEACON_INDEX_SF_SPEC2] |= SF_SPEC2_PAN_COORD; if (call MLME_GET.macAssociationPermit() == TRUE) m_payload[BEACON_INDEX_SF_SPEC2] |= SF_SPEC2_ASSOCIATION_PERMIT; if (call MLME_GET.macBattLifeExt() == TRUE) m_payload[BEACON_INDEX_SF_SPEC2] |= SF_SPEC2_BATT_LIFE_EXT; // GTS-spec m_payload[BEACON_INDEX_GTS_SPEC] = 0; // Pending-Address-spec (behind empty single-byte GTS field) m_payload[BEACON_INDEX_GTS_SPEC + 1] = 0; signal IEEE154TxBeaconPayload.aboutToTransmit(); post sendBeaconTask(); return frame; } event void BeaconRequestResponseTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status){ signal IEEE154TxBeaconPayload.beaconTransmitted(); } /* ----------------------- Beacon Payload ----------------------- */ command error_t IEEE154TxBeaconPayload.setBeaconPayload(void *beaconPayload, uint8_t length) { dbg_serial("BeaconRequestResponderP","IEEE154TxBeaconPayload.setBeaconPayload\n\n"); if (length < IEEE154_aMaxBeaconPayloadLength){ memcpy(&m_payload[4], beaconPayload, length); m_beaconFrame.payloadLen = 4 + length; signal IEEE154TxBeaconPayload.setBeaconPayloadDone(beaconPayload, length); return SUCCESS; } else return ESIZE; } command const void* IEEE154TxBeaconPayload.getBeaconPayload(){ return &m_payload[4]; // the first four bytes are non-user bytes } command uint8_t IEEE154TxBeaconPayload.getBeaconPayloadLength(){ return m_beaconFrame.payloadLen - 4; // Beacon-Payload in NonBeaconed mode at least 4 bytes (non-user payload) } command error_t IEEE154TxBeaconPayload.modifyBeaconPayload(uint8_t offset, void *buffer, uint8_t bufferLength){ uint16_t totalLen = offset + bufferLength; if (totalLen > IEEE154_aMaxBeaconPayloadLength || call IEEE154TxBeaconPayload.getBeaconPayloadLength() < totalLen) return ESIZE; else { memcpy(&m_payload[4+offset], buffer, bufferLength); signal IEEE154TxBeaconPayload.modifyBeaconPayloadDone(offset, buffer , bufferLength); } return SUCCESS; } default event void IEEE154TxBeaconPayload.setBeaconPayloadDone(void *beaconPayload, uint8_t length) {} default event void IEEE154TxBeaconPayload.modifyBeaconPayloadDone(uint8_t offset, void *buffer, uint8_t bufferLength) {} default event void IEEE154TxBeaconPayload.aboutToTransmit() {} default event void IEEE154TxBeaconPayload.beaconTransmitted() {} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/BeaconSynchronizeP.nc000066400000000000000000000502621207233610700232140ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.11 $ * $Date: 2009-12-14 12:50:06 $ * @author Jan Hauer * ======================================================================== */ /** * This module is responsible for periodic beacon tracking in a * beacon-enabled PAN. */ #include "TKN154_MAC.h" module BeaconSynchronizeP { provides { interface Init as Reset; interface MLME_SYNC; interface MLME_BEACON_NOTIFY; interface MLME_SYNC_LOSS; interface SuperframeStructure as IncomingSF; interface GetNow as IsTrackingBeacons; interface SplitControl as TrackSingleBeacon; } uses { interface MLME_GET; interface MLME_SET; interface FrameUtility; interface IEEE154BeaconFrame as BeaconFrame; interface Alarm as TrackAlarm; interface RadioRx as BeaconRx; interface RadioOff; interface DataRequest; interface FrameRx as CoordRealignmentRx; interface TransferableResource as RadioToken; interface TimeCalc; interface IEEE154Frame as Frame; interface Leds; } } implementation { /* state variables */ norace uint8_t m_state; norace uint8_t m_numBeaconsMissed; /* temporary buffers for the MLME-SYNC parameters */ uint8_t m_updateLogicalChannel; bool m_updateTrackBeacon; /* variables that describe the current beacon configuration */ norace ieee154_macBeaconOrder_t m_beaconOrder; norace uint32_t m_dt; norace uint32_t m_lastBeaconRxTime; message_t m_beacon; norace message_t *m_beaconPtr = &m_beacon; /* variables that describe the latest superframe */ norace uint32_t m_sfSlotDuration; norace bool m_framePendingBit; norace uint8_t m_numCapSlots; norace uint8_t m_numGtsSlots; norace uint16_t m_battLifeExtDuration; uint8_t m_gtsField[1+1+3*7]; enum { RX_PREPARE = 0x00, RX_RECEIVING = 0x01, RX_RADIO_OFF = 0x02, RX_FIRST_SCAN= 0x03, RX_MASK = 0x03, MODE_INACTIVE = 0x00, MODE_TRACK_SINGLE = 0x04, MODE_TRACK_CONTINUOUS = 0x08, MODE_MASK = 0x0C, BEACON_RECEIVED = 0x10, UPDATE_PENDING = 0x20, INTERNAL_REQUEST = 0x40, EXTERNAL_REQUEST = 0x80, }; /* function/task prototypes */ void trackNextBeacon(); uint32_t getBeaconInterval(ieee154_macBeaconOrder_t BO); task void processBeaconTask(); task void signalGrantedTask(); /* accessing/manipulating the current state */ void setBeaconReceived() { m_state |= BEACON_RECEIVED; } void resetBeaconReceived() { m_state &= ~BEACON_RECEIVED; } bool wasBeaconReceived() { return (m_state & BEACON_RECEIVED) ? TRUE : FALSE; } void setUpdatePending() { m_state |= UPDATE_PENDING; } void resetUpdatePending() { m_state &= ~UPDATE_PENDING; } bool isUpdatePending() { return (m_state & UPDATE_PENDING) ? TRUE : FALSE; } void setInternalRequest() { m_state |= INTERNAL_REQUEST; } void resetInternalRequest() { m_state &= ~INTERNAL_REQUEST; } bool isInternalRequest() { return (m_state & INTERNAL_REQUEST) ? TRUE : FALSE; } void setExternalRequest() { m_state |= EXTERNAL_REQUEST; } void resetExternalRequest() { m_state &= ~EXTERNAL_REQUEST; } bool isExternalRequest() { return (m_state & EXTERNAL_REQUEST) ? TRUE : FALSE; } uint8_t getMode() { return (m_state & MODE_MASK); } void setMode(uint8_t mode) { m_state &= ~MODE_MASK; m_state |= (mode & MODE_MASK); } uint8_t getRxState() { return (m_state & RX_MASK); } void setRxState(uint8_t state) { m_state &= ~RX_MASK; m_state |= (state & RX_MASK); } command error_t Reset.init() { // Reset this component - will only be called while we're not owning the token if (call IsTrackingBeacons.getNow() || (isUpdatePending() && isExternalRequest() && m_updateTrackBeacon)) signal MLME_SYNC_LOSS.indication( IEEE154_BEACON_LOSS, call MLME_GET.macPANId(), call MLME_GET.phyCurrentChannel(), call MLME_GET.phyCurrentPage(), NULL); if (isInternalRequest()) signal TrackSingleBeacon.startDone(FAIL); resetUpdatePending(); resetInternalRequest(); resetExternalRequest(); setMode(MODE_INACTIVE); return SUCCESS; } /* ----------------------- MLME-SYNC ----------------------- */ /* * Allows to synchronize with the beacons from a coordinator. */ command ieee154_status_t MLME_SYNC.request ( uint8_t logicalChannel, uint8_t channelPage, bool trackBeacon) { error_t status = IEEE154_SUCCESS; uint32_t supportedChannels = IEEE154_SUPPORTED_CHANNELS; uint32_t currentChannelBit = 1; currentChannelBit <<= logicalChannel; if (!(currentChannelBit & supportedChannels) || (call MLME_GET.macPANId() == 0xFFFF) || (channelPage != IEEE154_SUPPORTED_CHANNELPAGE) || !IEEE154_BEACON_ENABLED_PAN) status = IEEE154_INVALID_PARAMETER; else { m_updateTrackBeacon = trackBeacon; m_updateLogicalChannel = logicalChannel; setExternalRequest(); setUpdatePending(); call RadioToken.request(); } dbg_serial("BeaconSynchronizeP", "MLME_SYNC.request -> result: %lu\n", (uint32_t) status); return status; } event void RadioToken.granted() { if (isUpdatePending()) { dbg_serial("BeaconSynchronizeP", "Updating configuration...\n"); if (m_updateTrackBeacon) setMode(MODE_TRACK_CONTINUOUS); else setMode(MODE_TRACK_SINGLE); call MLME_SET.phyCurrentChannel(m_updateLogicalChannel); m_beaconOrder = call MLME_GET.macBeaconOrder(); m_dt = getBeaconInterval(m_beaconOrder); m_numBeaconsMissed = IEEE154_aMaxLostBeacons; // will be reset when first beacon is received resetUpdatePending(); setRxState(RX_FIRST_SCAN); } trackNextBeacon(); } async event void RadioToken.transferredFrom(uint8_t clientFrom) { dbg_serial("BeaconSynchronizeP", "Got token (transferred).\n"); if (isUpdatePending()) post signalGrantedTask(); else trackNextBeacon(); } task void signalGrantedTask() { signal RadioToken.granted(); } void trackNextBeacon() { bool missed = FALSE; if (getMode() == MODE_INACTIVE) { // nothing to do, just give up the token dbg_serial("BeaconSynchronizeP", "Stop tracking.\n"); call RadioToken.release(); return; } if (getRxState() != RX_FIRST_SCAN) { dbg_serial("BeaconSynchronizeP","Token.transferred(), expecting beacon in %lu symbols.\n", (uint32_t) ((m_lastBeaconRxTime + m_dt) - call TrackAlarm.getNow())); // we have received at least one previous beacon, get ready for the next setRxState(RX_PREPARE); while (call TimeCalc.hasExpired(m_lastBeaconRxTime, m_dt)) { // missed a beacon! dbg_serial("BeaconSynchronizeP", "Missed a beacon, expected it: %lu, now: %lu\n", m_lastBeaconRxTime + m_dt, call TrackAlarm.getNow()); missed = TRUE; m_dt += getBeaconInterval(m_beaconOrder); m_numBeaconsMissed++; } if (m_numBeaconsMissed >= IEEE154_aMaxLostBeacons) { dbg_serial("BeaconSynchronizeP", "Missed too many beacons.\n"); post processBeaconTask(); return; } if (missed) { // let other components get a chance to use the radio call RadioToken.request(); dbg_serial("BeaconSynchronizeP", "Skipping a beacon.\n"); call RadioToken.release(); return; } } if (call RadioOff.isOff()) signal RadioOff.offDone(); else if (call RadioOff.off() != SUCCESS) ASSERT(0); } async event void RadioOff.offDone() { uint32_t delay = IEEE154_RADIO_RX_DELAY + IEEE154_MAX_BEACON_JITTER(m_beaconOrder); if (getRxState() == RX_FIRST_SCAN) { // initial scan: switch to Rx immediately call BeaconRx.enableRx(0, 0); } else if (getRxState() == RX_PREPARE) { if (!call TimeCalc.hasExpired(m_lastBeaconRxTime - delay, m_dt)) call TrackAlarm.startAt(m_lastBeaconRxTime - delay, m_dt); else signal TrackAlarm.fired(); } else { post processBeaconTask(); } } async event void BeaconRx.enableRxDone() { uint32_t dt; uint8_t previousState = getRxState(); setRxState(RX_RECEIVING); switch (previousState) { case RX_FIRST_SCAN: // "To acquire beacon synchronization, a device shall enable its // receiver and search for at most [aBaseSuperframeDuration * (2^n + 1)] // symbols, where n is the value of macBeaconOrder [...] Once the number // of missed beacons reaches aMaxLostBeacons, the MLME shall notify the // next higher layer." (Sect. 7.5.4.1) dt = (((uint32_t) 1 << m_beaconOrder) + (uint32_t) 1) * (uint32_t) IEEE154_aBaseSuperframeDuration * (uint32_t) IEEE154_aMaxLostBeacons; call TrackAlarm.start(dt); dbg_serial("BeaconSynchronizeP","Rx enabled, expecting first beacon within next %lu symbols.\n", dt); break; case RX_PREPARE: dt = m_dt + IEEE154_MAX_BEACON_LISTEN_TIME(m_beaconOrder); call TrackAlarm.startAt(m_lastBeaconRxTime, dt); dbg_serial("BeaconSynchronizeP","Rx enabled, expecting beacon within next %lu symbols.\n", (uint32_t) ((m_lastBeaconRxTime + dt) - call TrackAlarm.getNow())); break; default: ASSERT(0); break; } } async event void TrackAlarm.fired() { if (getRxState() == RX_PREPARE) { // enable Rx uint32_t maxBeaconJitter = IEEE154_MAX_BEACON_JITTER(m_beaconOrder); if (maxBeaconJitter > m_dt) maxBeaconJitter = m_dt; // receive immediately call BeaconRx.enableRx(m_lastBeaconRxTime, m_dt - maxBeaconJitter); } else { // disable Rx error_t error = call RadioOff.off(); ASSERT(getRxState() == RX_RECEIVING && error == SUCCESS); } } event message_t* BeaconRx.received(message_t *frame) { if (wasBeaconReceived()) { dbg_serial("BeaconSynchronizeP", "Got another beacon! -> ignoring it ...\n"); return frame; } else if (!call FrameUtility.isBeaconFromCoord(frame)) { dbg_serial("BeaconSynchronizeP", "Got a beacon, but not from my coordinator.\n"); return frame; } else { message_t *tmp = m_beaconPtr; setBeaconReceived(); m_beaconPtr = frame; dbg_serial("BeaconSynchronizeP", "Got beacon, timestamp: %lu, now: %lu\n", ((ieee154_metadata_t*) m_beaconPtr->metadata)->timestamp, (uint32_t) call TrackAlarm.getNow()); if (getRxState() == RX_RECEIVING) { call TrackAlarm.stop(); // may fail call RadioOff.off(); // may fail } return tmp; } } task void processBeaconTask() { // task will be executed after every (un)successful attempt to track a beacon bool wasInternalRequest = isInternalRequest(); if (wasBeaconReceived() && !call Frame.isTimestampValid(m_beaconPtr)) { dbg_serial("BeaconSynchronizeP", "Received beacon has invalid timestamp, discarding it!\n"); resetBeaconReceived(); } if (getMode() == MODE_TRACK_SINGLE) setMode(MODE_INACTIVE); // we're done with a single shot resetInternalRequest(); // whether we next release the token or pass it to the CAP // component, we want it back (because we decide later // whether we'll actually stop tracking the beacon in future) call RadioToken.request(); if (!wasBeaconReceived()) { resetBeaconReceived(); // buffer ready m_numBeaconsMissed += 1; m_dt += getBeaconInterval(m_beaconOrder); dbg_serial("BeaconSynchronizeP", "Missed a beacon (total missed: %lu).\n", (uint32_t) m_numBeaconsMissed); if (wasInternalRequest) { // note: if it only was an internal request, the // mode was reset above already (SINGLE_SHOT) signal TrackSingleBeacon.startDone(FAIL); } if (isExternalRequest() && m_numBeaconsMissed >= IEEE154_aMaxLostBeacons) { resetExternalRequest(); setMode(MODE_INACTIVE); dbg_serial("BeaconSynchronizeP", "MLME_SYNC_LOSS!\n"); signal MLME_SYNC_LOSS.indication( IEEE154_BEACON_LOSS, call MLME_GET.macPANId(), call MLME_GET.phyCurrentChannel(), call MLME_GET.phyCurrentPage(), NULL); } call RadioToken.release(); } else { // received the beacon! uint8_t *payload = (uint8_t *) m_beaconPtr->data; ieee154_macAutoRequest_t autoRequest = call MLME_GET.macAutoRequest(); uint8_t pendAddrSpecOffset = 3 + (((payload[2] & 7) > 0) ? 1 + (payload[2] & 7) * 3: 0); // skip GTS uint8_t pendAddrSpec = payload[pendAddrSpecOffset]; uint8_t *beaconPayload = payload + pendAddrSpecOffset + 1; uint8_t beaconPayloadSize = call BeaconFrame.getBeaconPayloadLength(m_beaconPtr); uint8_t pendingAddrMode = ADDR_MODE_NOT_PRESENT; uint8_t *mhr = MHR(m_beaconPtr); uint8_t frameLen = ((uint8_t*) m_beaconPtr)[0] & FRAMECTL_LENGTH_MASK; uint8_t gtsFieldLength; uint32_t timestamp = call Frame.getTimestamp(m_beaconPtr); dbg_serial("BeaconSynchronizeP", "Got beacon, bsn: %lu, offset to last: %lu\n", (uint32_t) mhr[MHR_INDEX_SEQNO], (uint32_t) (timestamp - m_lastBeaconRxTime)); m_numBeaconsMissed = 0; m_numGtsSlots = payload[BEACON_INDEX_GTS_SPEC] & GTS_DESCRIPTOR_COUNT_MASK; gtsFieldLength = 1 + ((m_numGtsSlots > 0) ? 1 + m_numGtsSlots * 3: 0); m_lastBeaconRxTime = timestamp; m_numCapSlots = ((payload[BEACON_INDEX_SF_SPEC2] & SF_SPEC2_FINAL_CAPSLOT_MASK) >> SF_SPEC2_FINAL_CAPSLOT_OFFSET) + 1; m_sfSlotDuration = (((uint32_t) 1) << ((payload[BEACON_INDEX_SF_SPEC1] & SF_SPEC1_SO_MASK) >> SF_SPEC1_SO_OFFSET)) * IEEE154_aBaseSlotDuration; memcpy(m_gtsField, &payload[BEACON_INDEX_GTS_SPEC], gtsFieldLength); // check for battery life extension if (payload[BEACON_INDEX_SF_SPEC2] & SF_SPEC2_BATT_LIFE_EXT) { // BLE is active; calculate the time offset from slot0 m_battLifeExtDuration = IEEE154_SHR_DURATION + frameLen * IEEE154_SYMBOLS_PER_OCTET; if (frameLen > IEEE154_aMaxSIFSFrameSize) m_battLifeExtDuration += call MLME_GET.macMinLIFSPeriod(); else m_battLifeExtDuration += call MLME_GET.macMinSIFSPeriod(); m_battLifeExtDuration = m_battLifeExtDuration + call MLME_GET.macBattLifeExtPeriods() * 20; } else m_battLifeExtDuration = 0; m_framePendingBit = mhr[MHR_INDEX_FC1] & FC1_FRAME_PENDING ? TRUE : FALSE; m_beaconOrder = (payload[BEACON_INDEX_SF_SPEC1] & SF_SPEC1_BO_MASK) >> SF_SPEC1_BO_OFFSET; m_dt = getBeaconInterval(m_beaconOrder); dbg_serial("BeaconSynchronizeP", "Handing over to CAP.\n"); call RadioToken.transferTo(RADIO_CLIENT_DEVICECAP); if (pendAddrSpec & PENDING_ADDRESS_SHORT_MASK) beaconPayload += (pendAddrSpec & PENDING_ADDRESS_SHORT_MASK) * 2; if (pendAddrSpec & PENDING_ADDRESS_EXT_MASK) beaconPayload += ((pendAddrSpec & PENDING_ADDRESS_EXT_MASK) >> 4) * 8; // check for pending data (once we signal MLME_BEACON_NOTIFY we cannot // touch this frame anymore!) if (autoRequest) pendingAddrMode = call BeaconFrame.isLocalAddrPending(m_beaconPtr); if (pendingAddrMode != ADDR_MODE_NOT_PRESENT) { // the coord has pending data uint8_t CoordAddrMode; uint16_t CoordPANId; uint8_t *CoordAddress; uint8_t SrcAddrMode = pendingAddrMode; if ((mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK) == FC2_SRC_MODE_SHORT) CoordAddrMode = ADDR_MODE_SHORT_ADDRESS; else CoordAddrMode = ADDR_MODE_EXTENDED_ADDRESS; CoordAddress = &(mhr[MHR_INDEX_ADDRESS+2]); CoordPANId = *((nxle_uint16_t*) &(mhr[MHR_INDEX_ADDRESS])); call DataRequest.poll(CoordAddrMode, CoordPANId, CoordAddress, SrcAddrMode); } if (!autoRequest || beaconPayloadSize) m_beaconPtr = signal MLME_BEACON_NOTIFY.indication(m_beaconPtr); resetBeaconReceived(); // buffer ready } dbg_serial_flush(); } command error_t TrackSingleBeacon.start() { // Track a single beacon now dbg_serial("BeaconSynchronizeP", "Internal request.\n"); setInternalRequest(); call RadioToken.request(); if (!isUpdatePending()) { m_updateLogicalChannel = call MLME_GET.phyCurrentChannel(); m_updateTrackBeacon = FALSE; setUpdatePending(); } return SUCCESS; } command error_t TrackSingleBeacon.stop() { // we will stop automatically after beacon was tracked/not found return FAIL; } /* ----------------------- SF Structure, etc. ----------------------- */ async command uint32_t IncomingSF.sfStartTime() { return m_lastBeaconRxTime; } async command uint32_t IncomingSF.sfSlotDuration() { return m_sfSlotDuration; } async command uint8_t IncomingSF.numCapSlots() { return m_numCapSlots; } async command uint8_t IncomingSF.numGtsSlots() { return m_numGtsSlots; } async command uint16_t IncomingSF.battLifeExtDuration() { return m_battLifeExtDuration; } async command const uint8_t* IncomingSF.gtsFields() { return m_gtsField; } async command uint16_t IncomingSF.guardTime() { return IEEE154_MAX_BEACON_JITTER(m_beaconOrder) + IEEE154_RADIO_RX_DELAY; } async command bool IncomingSF.isBroadcastPending() { return m_framePendingBit; } async command uint32_t IncomingSF.beaconInterval() { return getBeaconInterval(m_beaconOrder); } async command bool IsTrackingBeacons.getNow() { return (getMode() == MODE_TRACK_CONTINUOUS); } uint32_t getBeaconInterval(ieee154_macBeaconOrder_t BO) { if (BO >= 15) BO = 14; return (((uint32_t) 1 << BO) * (uint32_t) IEEE154_aBaseSuperframeDuration); } event void DataRequest.pollDone() {} default event message_t* MLME_BEACON_NOTIFY.indication (message_t* frame) {return frame;} default event void MLME_SYNC_LOSS.indication ( ieee154_status_t lossReason, uint16_t panID, uint8_t logicalChannel, uint8_t channelPage, ieee154_security_t *security) {} event message_t* CoordRealignmentRx.received(message_t* frame) { uint8_t *payload = call Frame.getPayload(frame); ieee154_macPANId_t panID = *(nxle_uint16_t*) &payload[1]; if (panID == call MLME_GET.macPANId()) signal MLME_SYNC_LOSS.indication( IEEE154_REALIGNMENT, // LossReason panID, // PANId payload[5], // LogicalChannel, call Frame.getPayloadLength(frame) == 9 ? payload[8] : call MLME_GET.phyCurrentPage(), NULL); return frame; } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/BeaconTransmitP.nc000066400000000000000000001036031207233610700225000ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.12 $ * $Date: 2010-01-05 16:41:16 $ * @author Jan Hauer * ======================================================================== */ /** * This module is responsible for periodic beacon transmission in a * beacon-enabled PAN. */ #include "TKN154_MAC.h" #include "TKN154_PHY.h" module BeaconTransmitP { provides { interface Init as Reset; interface MLME_START; interface IEEE154TxBeaconPayload; interface SuperframeStructure as OutgoingSF; interface GetNow as IsSendingBeacons; } uses { interface Notify as GtsSpecUpdated; interface Notify as PendingAddrSpecUpdated; interface Notify as PIBUpdate[uint8_t attributeID]; interface Alarm as BeaconSendAlarm; interface Timer as BeaconPayloadUpdateTimer; interface RadioOff; interface RadioTx as BeaconTx; interface MLME_GET; interface MLME_SET; interface TransferableResource as RadioToken; interface FrameTx as RealignmentBeaconEnabledTx; interface FrameTx as RealignmentNonBeaconEnabledTx; interface FrameRx as BeaconRequestRx; interface WriteBeaconField as GtsInfoWrite; interface WriteBeaconField as PendingAddrWrite; interface FrameUtility; interface GetNow as IsTrackingBeacons; interface SuperframeStructure as IncomingSF; interface Set as SetMacSuperframeOrder; interface Set as SetMacBeaconTxTime; interface Set as SetMacPanCoordinator; interface GetSet as GetSetRealignmentFrame; interface GetNow as IsBroadcastReady; interface TimeCalc; interface Random; interface Leds; } } implementation { /* state variables */ norace uint8_t m_requestBitmap; norace uint8_t m_txState; uint8_t m_payloadState; norace bool m_txOneBeaconImmediately; /* variables that describe the current superframe configuration */ norace uint32_t m_startTime; norace uint8_t m_beaconOrder; norace uint8_t m_superframeOrder; norace uint32_t m_beaconInterval; norace uint32_t m_previousBeaconInterval; norace uint32_t m_dt; norace uint32_t m_lastBeaconTxTime; norace ieee154_macBattLifeExtPeriods_t m_battLifeExtPeriods; /* variables that describe the latest superframe */ norace uint32_t m_sfSlotDuration; norace bool m_framePendingBit; norace uint8_t m_numCapSlots; norace uint8_t m_numGtsSlots; norace uint16_t m_battLifeExtDuration; uint8_t m_gtsField[1+1+3*7]; /* variables that describe the beacon (payload) */ norace ieee154_txframe_t m_beaconFrame; ieee154_header_t m_header; ieee154_metadata_t m_metadata; void *m_updateBeaconPayload; uint8_t m_updateBeaconOffset; uint8_t m_updateBeaconLength; uint8_t m_beaconPayloadLen; uint8_t m_pendingAddrLen; uint8_t m_pendingGtsLen; /* buffers for the parameters of the MLME-START request */ uint16_t m_updatePANId; uint8_t m_updateLogicalChannel; uint32_t m_updateStartTime; norace uint8_t m_updateBeaconOrder; uint8_t m_updateSuperframeOrder; bool m_updatePANCoordinator; bool m_updateBatteryLifeExtension; enum { MAX_BEACON_PAYLOAD_SIZE = IEEE154_aMaxBeaconOverhead + IEEE154_aMaxBeaconPayloadLength, REQUEST_UPDATE_SF = 0x01, REQUEST_REALIGNMENT = 0x02, REQUEST_CONFIRM_PENDING = 0x04, REQUEST_REALIGNMENT_DONE_PENDING = 0x08, MODIFIED_SF_SPEC = 0x01, MODIFIED_GTS_FIELD = 0x02, MODIFIED_PENDING_ADDR_FIELD = 0x04, MODIFIED_SPECS_MASK = 0x0F, MODIFIED_BEACON_PAYLOAD = 0x10, MODIFIED_BEACON_PAYLOAD_NEW = 0x20, MODIFIED_BEACON_PAYLOAD_MASK = 0xF0, S_TX_IDLE = 0, S_TX_LOCKED = 1, S_TX_WAITING = 2, }; uint8_t m_payload[MAX_BEACON_PAYLOAD_SIZE]; /* function/task prototypes */ task void txDoneTask(); task void signalStartConfirmSuccessTask(); void nextRound(); void prepareBeaconTransmission(); void continueStartRequest(); void finishRealignment(ieee154_txframe_t *frame, ieee154_status_t status); command error_t Reset.init() { // reset this component, will only be called while we're not owning the token // TODO: check to signal MLME_START.confirm ? call MLME_SET.macBSN(call Random.rand16()); m_beaconFrame.header = &m_header; m_beaconFrame.headerLen = 0; m_beaconFrame.payload = m_payload; m_beaconFrame.payloadLen = 0; m_beaconFrame.metadata = &m_metadata; m_updateBeaconPayload = NULL; m_updateBeaconLength = 0; m_requestBitmap = m_payloadState = m_txState = 0; m_beaconPayloadLen = m_pendingAddrLen = m_pendingGtsLen = 0; m_gtsField[0] = 0; m_numCapSlots = 0; m_numGtsSlots = 0; m_beaconOrder = 15; call BeaconPayloadUpdateTimer.stop(); call BeaconSendAlarm.stop(); return SUCCESS; } /* ----------------------- MLME-START ----------------------- */ /* "The MLME-START.request primitive allows the PAN coordinator to initiate a * new PAN or to begin using a new superframe configuration. This primitive may * also be used by a device already associated with an existing PAN to begin * using a new superframe configuration." (IEEE 802.15.4-2006 Sect. 7.1.14.1) **/ command ieee154_status_t MLME_START.request ( uint16_t panID, uint8_t logicalChannel, uint8_t channelPage, uint32_t startTime, uint8_t beaconOrder, uint8_t superframeOrder, bool panCoordinator, bool batteryLifeExtension, bool coordRealignment, ieee154_security_t *coordRealignSecurity, ieee154_security_t *beaconSecurity) { ieee154_status_t status = IEEE154_SUCCESS; ieee154_macShortAddress_t shortAddress = call MLME_GET.macShortAddress(); // check parameters if ((coordRealignSecurity && coordRealignSecurity->SecurityLevel) || (beaconSecurity && beaconSecurity->SecurityLevel)) status = IEEE154_UNSUPPORTED_SECURITY; else if (shortAddress == 0xFFFF) status = IEEE154_NO_SHORT_ADDRESS; else if (logicalChannel > 26 || beaconOrder > 15 || (channelPage != IEEE154_SUPPORTED_CHANNELPAGE) || !(IEEE154_SUPPORTED_CHANNELS & ((uint32_t) 1 << logicalChannel)) || (superframeOrder > beaconOrder)) status = IEEE154_INVALID_PARAMETER; else if (startTime && !call IsTrackingBeacons.getNow()) status = IEEE154_TRACKING_OFF; else if (startTime & 0xFF000000) status = IEEE154_INVALID_PARAMETER; else if (m_requestBitmap & (REQUEST_CONFIRM_PENDING | REQUEST_UPDATE_SF)) status = IEEE154_TRANSACTION_OVERFLOW; else { // New configuration *will* be put in operation, we'll buffer // the parameters now, and continue once we get the token. if (panCoordinator) startTime = 0; // start immediately if (beaconOrder == 15) superframeOrder = 15; // beaconless PAN m_updatePANId = panID; m_updateLogicalChannel = logicalChannel; m_updateStartTime = startTime; m_updateBeaconOrder = beaconOrder; m_updateSuperframeOrder = superframeOrder; m_updatePANCoordinator = panCoordinator; m_updateBatteryLifeExtension = batteryLifeExtension; m_requestBitmap = (REQUEST_CONFIRM_PENDING | REQUEST_UPDATE_SF); // lock if (coordRealignment) m_requestBitmap |= REQUEST_REALIGNMENT; if (m_beaconOrder == 15) { // We're not already transmitting beacons, i.e. we have to request the token // (otherwise we'd get the token "automatically" for the next scheduled beacon). call RadioToken.request(); } // We'll continue the MLME_START operation in continueStartRequest() once we have the token } dbg_serial("BeaconTransmitP", "MLME_START.request -> result: %lu\n", (uint32_t) status); return status; } void continueStartRequest() { uint8_t offset; ieee154_macShortAddress_t shortAddress; bool isShortAddr; // (1) coord realignment? if (m_requestBitmap & REQUEST_REALIGNMENT) { ieee154_txframe_t *realignmentFrame = call GetSetRealignmentFrame.get(); m_requestBitmap &= ~REQUEST_REALIGNMENT; if (realignmentFrame == NULL) { // allocation failed! m_requestBitmap = 0; signal MLME_START.confirm(IEEE154_TRANSACTION_OVERFLOW); return; } // set the payload portion of the realignmentFrame // (the header fields are already set correctly) realignmentFrame->payload[0] = CMD_FRAME_COORDINATOR_REALIGNMENT; *((nxle_uint16_t*) &realignmentFrame->payload[1]) = m_updatePANId; *((nxle_uint16_t*) &realignmentFrame->payload[3]) = call MLME_GET.macShortAddress(); realignmentFrame->payload[5] = m_updateLogicalChannel; *((nxle_uint16_t*) &realignmentFrame->payload[6]) = 0xFFFF; realignmentFrame->payloadLen = 8; if (m_beaconOrder < 15) { // we're already transmitting beacons; the realignment frame // must be sent (broadcast) after the next beacon if (call RealignmentBeaconEnabledTx.transmit(realignmentFrame) != IEEE154_SUCCESS) { m_requestBitmap = 0; call GetSetRealignmentFrame.set(realignmentFrame); signal MLME_START.confirm(IEEE154_TRANSACTION_OVERFLOW); } else { // The realignment frame will be transmitted immediately after // the next beacon - the result will be signalled in // RealignmentBeaconEnabledTx.transmitDone(). Only then the superframe // structure is updated and MLME_START.confirm signalled. m_requestBitmap |= REQUEST_REALIGNMENT_DONE_PENDING; // lock } } else { // send realignment frame in unslotted csma-ca now if (call RealignmentNonBeaconEnabledTx.transmit(realignmentFrame) != IEEE154_SUCCESS) { m_requestBitmap = 0; call GetSetRealignmentFrame.set(realignmentFrame); signal MLME_START.confirm(IEEE154_TRANSACTION_OVERFLOW); } else { // A realignment frame will be transmitted now, the result will // be signalled in RealignmentNonBeaconEnabledTx.transmitDone(). Only // then the superframe structure is updated and MLME_START.confirm // signalled. m_requestBitmap |= REQUEST_REALIGNMENT_DONE_PENDING; // lock } } return; } // (2) update internal state m_startTime = m_updateStartTime; m_txOneBeaconImmediately = FALSE; m_previousBeaconInterval = 0; m_beaconOrder = m_updateBeaconOrder; if (m_beaconOrder < 15) { m_beaconInterval = ((uint32_t) 1 << m_beaconOrder) * IEEE154_aBaseSuperframeDuration; } else { m_beaconInterval = 0; } m_superframeOrder = m_updateSuperframeOrder; if (m_startTime) // schedule outgoing beacon relative to incoming beacon; here we calculate // the last time we would have sent a beacon (simplifies the code below) m_lastBeaconTxTime = call IncomingSF.sfStartTime() + m_startTime - m_beaconInterval; else { // no StartTime defined by next higher layer - but // if a realignment frame was transmitted, the next // beacon tx time must take the old BI into consideration if (m_requestBitmap & REQUEST_REALIGNMENT_DONE_PENDING) m_previousBeaconInterval = m_beaconInterval; else m_txOneBeaconImmediately = TRUE; } m_dt = m_beaconInterval; m_battLifeExtPeriods = call MLME_GET.macBattLifeExtPeriods(); m_txState = S_TX_IDLE; // (3) update PIB call MLME_SET.macBeaconOrder(m_beaconOrder); call SetMacSuperframeOrder.set(m_superframeOrder); call MLME_SET.macPANId(m_updatePANId); call MLME_SET.phyCurrentChannel(m_updateLogicalChannel); if (m_beaconOrder < 15) call MLME_SET.macBattLifeExt(m_updateBatteryLifeExtension); call SetMacPanCoordinator.set(m_updatePANCoordinator); // (4) assemble beacon header and payload shortAddress = call MLME_GET.macShortAddress(); isShortAddr = (shortAddress != 0xFFFE); m_beaconFrame.header->mhr[MHR_INDEX_FC1] = FC1_FRAMETYPE_BEACON; m_beaconFrame.header->mhr[MHR_INDEX_FC2] = isShortAddr ? FC2_SRC_MODE_SHORT : FC2_SRC_MODE_EXTENDED; m_beaconFrame.header->mhr[MHR_INDEX_SEQNO] = call MLME_GET.macBSN() + 1; offset = MHR_INDEX_ADDRESS; *((nxle_uint16_t*) &m_beaconFrame.header->mhr[offset]) = m_updatePANId; offset += sizeof(ieee154_macPANId_t); if (isShortAddr) { *((nxle_uint16_t*) &m_beaconFrame.header->mhr[offset]) = shortAddress; offset += sizeof(ieee154_macShortAddress_t); } else { call FrameUtility.copyLocalExtendedAddressLE(&m_beaconFrame.header->mhr[offset]); offset += 8; } m_beaconFrame.headerLen = offset; m_payloadState |= MODIFIED_SPECS_MASK; // update beacon payload signal BeaconPayloadUpdateTimer.fired(); // assemble initial beacon payload if (m_beaconOrder < 15) { // beacon-enabled PAN, signal confirm after next // beacon has been transmitted (see MSC, Fig. 38) m_requestBitmap = REQUEST_CONFIRM_PENDING; } else { // beaconless PAN, we're done m_requestBitmap = 0; signal MLME_START.confirm(IEEE154_SUCCESS); } } task void signalGrantedTask() { signal RadioToken.granted(); } event void RadioToken.granted() { dbg_serial("BeaconSynchronizeP","Token granted.\n"); if (m_requestBitmap & REQUEST_REALIGNMENT_DONE_PENDING) { // very unlikely: we have not yet received a done() // event after sending out a realignment frame dbg_serial("BeaconTransmitP", "Realignment pending (request: %lu) !\n", (uint32_t) m_requestBitmap); post signalGrantedTask(); // spin return; } else if (m_requestBitmap & REQUEST_UPDATE_SF) { dbg_serial("BeaconTransmitP","Putting new superframe spec into operation\n"); m_requestBitmap &= ~REQUEST_UPDATE_SF; continueStartRequest(); } nextRound(); } void nextRound() { if (call RadioOff.isOff()) prepareBeaconTransmission(); else ASSERT(call RadioOff.off() == SUCCESS); // will continue in prepareBeaconTransmission() } async event void RadioToken.transferredFrom(uint8_t fromClientID) { dbg_serial("BeaconTransmitP","Token transferred, will Tx beacon in %lu\n", (uint32_t) ((m_lastBeaconTxTime + m_dt) - call BeaconSendAlarm.getNow())); if (m_requestBitmap & (REQUEST_REALIGNMENT_DONE_PENDING | REQUEST_UPDATE_SF)) post signalGrantedTask(); // need to be in sync context else nextRound(); } async event void RadioOff.offDone() { prepareBeaconTransmission(); } void prepareBeaconTransmission() { if (m_txState == S_TX_LOCKED) { // have not had time to finish processing the last sent beacon dbg_serial("BeaconTransmitP", "Token was returned too fast!\n"); post signalGrantedTask(); } else if (m_beaconOrder == 15) { // we're not sending any beacons!? dbg_serial("BeaconTransmitP", "Stop sending beacons.\n"); call RadioToken.release(); } else { // get ready for next beacon transmission atomic { uint32_t delay = IEEE154_RADIO_TX_DELAY; m_txState = S_TX_WAITING; if (m_txOneBeaconImmediately) { // transmit the beacon now dbg_serial("BeaconTransmitP", "Sending a beacon immediately.\n"); signal BeaconSendAlarm.fired(); return; } else if (m_startTime != 0) { // The outgoing superframe (our beacon transmission) has to be scheduled relative // to an incoming superframe (from our coordinator). The standard says that this // should be done only for the initial beacon tranmission, but we do it for // every transmission, because otherwise we'll run into problems (overlapping // superframes) due to clock drift eventually if (call IsTrackingBeacons.getNow()) { // we calculate the "ideal" time of our last transmitted beacon // relative to the last incoming beacon uint32_t idealLastTxTime = call IncomingSF.sfStartTime() + m_startTime - m_beaconInterval; // only if the offset between ideal and the actual last beacon transmission // is close (i.e. could have been an effect of clock drift), we replace the // timestamp of the actual transmission with that one of the ideal beacon time; // max. clock drift per node is +- 40 ppm, we need to consider +- 80 ppm; // max. clock drift is a function of the BO; we take two discrete values to // cover the "lower" BO (max. 1ms drift) and "upper" BO (max. 24 ms drift) // this could be done more granular one day ... uint32_t maxAllowedOffset = (m_beaconOrder > 9) ? 1488 : 62; uint32_t jitter; if ( (jitter = idealLastTxTime - m_lastBeaconTxTime) < maxAllowedOffset || (jitter = m_lastBeaconTxTime - idealLastTxTime) < maxAllowedOffset) { m_lastBeaconTxTime = idealLastTxTime; dbg_serial("BeaconTransmitP", "Scheduling beacon relative to last Rx beacon (correcting a jitter of: %lu), updated TxTime %lu\n", (uint32_t) jitter, (uint32_t) m_lastBeaconTxTime); } else { // we don't touch m_lastBeaconTxTime! dbg_serial("BeaconTransmitP", "Jitter too large (missed an incoming beacon?)! %lu vs. %lu\n", idealLastTxTime, m_lastBeaconTxTime); } } } else if (m_previousBeaconInterval != 0) { // a new sf spec was put into operation, after a realignment frame // broadcast; the next beacon time should still be calculated using the // old BI (one last time) dbg_serial("BeaconTransmitP", "Sending beacon after realignment dt=%lu.\n", m_previousBeaconInterval); m_dt = m_previousBeaconInterval; m_previousBeaconInterval = 0; if (m_requestBitmap & REQUEST_CONFIRM_PENDING) { // only now the next higher layer is to be informed m_requestBitmap &= ~REQUEST_CONFIRM_PENDING; post signalStartConfirmSuccessTask(); } } // The next beacon should be transmitted at time m_lastBeaconTxTime + m_dt, where m_dt // is typically the beacon interval. First we check if we're still in time. while (call TimeCalc.hasExpired(m_lastBeaconTxTime, m_dt)) { // too late, we need to skip a beacon! dbg_serial("BeaconTransmitP", "Skipping a beacon: scheduled=%lu, now=%lu.\n", (uint32_t) m_lastBeaconTxTime + m_dt, (uint32_t) call BeaconSendAlarm.getNow()); m_dt += m_beaconInterval; } if (!call TimeCalc.hasExpired(m_lastBeaconTxTime - delay, m_dt)) { // don't load the beacon frame in the radio just yet - rather set a timer and // give the next higher layer the chance to modify the beacon payload call BeaconSendAlarm.startAt(m_lastBeaconTxTime - delay, m_dt); } else signal BeaconSendAlarm.fired(); } } } task void signalStartConfirmSuccessTask() { signal MLME_START.confirm(SUCCESS); } async event void BeaconSendAlarm.fired() { // start/schedule beacon transmission m_txState = S_TX_LOCKED; if (call IsBroadcastReady.getNow()) m_beaconFrame.header->mhr[MHR_INDEX_FC1] |= FC1_FRAME_PENDING; else m_beaconFrame.header->mhr[MHR_INDEX_FC1] &= ~FC1_FRAME_PENDING; if (m_txOneBeaconImmediately) { m_txOneBeaconImmediately = FALSE; m_dt = 0; } call BeaconTx.transmit(&m_beaconFrame, m_lastBeaconTxTime, m_dt); dbg_serial("BeaconTransmitP","Beacon Tx scheduled for %lu\n", m_lastBeaconTxTime + m_dt); } async event void BeaconTx.transmitDone(ieee154_txframe_t *frame, error_t result) { // The beacon frame was transmitted, i.e. the CAP has just started // update the state then pass the token on to the next component uint8_t gtsFieldLength; uint32_t timestamp = ((ieee154_metadata_t*) frame->metadata)->timestamp; ASSERT(result == SUCCESS); // must succeed, we're sending without CCA or ACK request if (timestamp != IEEE154_INVALID_TIMESTAMP) { dbg_serial("BeaconTransmitP", "Beacon Tx (bsn: %lu), offset to last %lu\n", (uint32_t) frame->header->mhr[MHR_INDEX_SEQNO], (uint32_t) (timestamp - m_lastBeaconTxTime)); m_lastBeaconTxTime = timestamp; m_dt = m_beaconInterval; // transmit the next beacon at m_lastBeaconTxTime + m_dt } else { // Timestamp is invalid; this is bad. We need the beacon timestamp for the // slotted CSMA-CA, because it defines the slot reference time. We can't use this superframe dbg_serial("BeaconTransmitP", "Invalid timestamp!\n"); m_dt += m_beaconInterval; call RadioToken.request(); call RadioToken.release(); return; } // update superframe-related variables m_numGtsSlots = (frame->payload[BEACON_INDEX_GTS_SPEC] & GTS_DESCRIPTOR_COUNT_MASK) >> GTS_DESCRIPTOR_COUNT_OFFSET; gtsFieldLength = 1 + ((m_numGtsSlots > 0) ? 1 + m_numGtsSlots * 3: 0); m_numCapSlots = ((frame->payload[BEACON_INDEX_SF_SPEC2] & SF_SPEC2_FINAL_CAPSLOT_MASK) >> SF_SPEC2_FINAL_CAPSLOT_OFFSET) + 1; m_sfSlotDuration = (((uint32_t) 1) << ((frame->payload[BEACON_INDEX_SF_SPEC1] & SF_SPEC1_SO_MASK) >> SF_SPEC1_SO_OFFSET)) * (uint32_t) IEEE154_aBaseSlotDuration; if (frame->header->mhr[MHR_INDEX_FC1] & FC1_FRAME_PENDING) m_framePendingBit = TRUE; else m_framePendingBit = FALSE; memcpy(m_gtsField, &frame->payload[BEACON_INDEX_GTS_SPEC], gtsFieldLength); if (frame->payload[BEACON_INDEX_SF_SPEC2] & SF_SPEC2_BATT_LIFE_EXT) { // BLE is active; calculate the time offset from slot 0 m_battLifeExtDuration = IEEE154_SHR_DURATION + (frame->headerLen + frame->payloadLen + 2) * IEEE154_SYMBOLS_PER_OCTET; if (frame->headerLen + frame->payloadLen + 2 > IEEE154_aMaxSIFSFrameSize) m_battLifeExtDuration += IEEE154_MIN_LIFS_PERIOD; else m_battLifeExtDuration += IEEE154_MIN_SIFS_PERIOD; m_battLifeExtDuration = m_battLifeExtDuration + m_battLifeExtPeriods * 20; } else m_battLifeExtDuration = 0; // we pass on the token now, but make a reservation to get it back // to transmit the next beacon (at the start of the next superframe) call RadioToken.request(); call RadioToken.transferTo(RADIO_CLIENT_COORDBROADCAST); post txDoneTask(); } task void txDoneTask() { call MLME_SET.macBSN(m_beaconFrame.header->mhr[MHR_INDEX_SEQNO]); m_beaconFrame.header->mhr[MHR_INDEX_SEQNO] += 1; // may be overwritten by the next higher layer call SetMacBeaconTxTime.set(m_lastBeaconTxTime); // start of slot0, ie. first preamble byte of beacon call BeaconPayloadUpdateTimer.startOneShotAt(m_lastBeaconTxTime, (m_beaconInterval>BEACON_PAYLOAD_UPDATE_INTERVAL) ? (m_beaconInterval - BEACON_PAYLOAD_UPDATE_INTERVAL): 0); if (m_requestBitmap & REQUEST_CONFIRM_PENDING) { m_requestBitmap &= ~REQUEST_CONFIRM_PENDING; signal MLME_START.confirm(IEEE154_SUCCESS); } m_txState = S_TX_IDLE; signal IEEE154TxBeaconPayload.beaconTransmitted(); dbg_serial_flush(); } /* ----------------------- Beacon Payload ----------------------- */ /* * All access to the payload fields in the beacon happen * through a set of temporary variables/flags, and just before * the frame is loaded into the radio these changes are * written into the actual payload portion of the beacon frame. */ command error_t IEEE154TxBeaconPayload.setBeaconPayload(void *beaconPayload, uint8_t length) { if (length > IEEE154_aMaxBeaconPayloadLength) return ESIZE; else { if (m_payloadState & MODIFIED_BEACON_PAYLOAD) return EBUSY; m_updateBeaconPayload = beaconPayload; m_updateBeaconLength = length; m_updateBeaconOffset = 0; m_payloadState |= (MODIFIED_BEACON_PAYLOAD | MODIFIED_BEACON_PAYLOAD_NEW); } return SUCCESS; } command const void* IEEE154TxBeaconPayload.getBeaconPayload() { return &m_payload[IEEE154_aMaxBeaconOverhead]; } command uint8_t IEEE154TxBeaconPayload.getBeaconPayloadLength() { return m_beaconFrame.payloadLen - (m_pendingAddrLen + m_pendingGtsLen + 2); } command error_t IEEE154TxBeaconPayload.modifyBeaconPayload(uint8_t offset, void *buffer, uint8_t bufferLength) { uint16_t totalLen = offset + bufferLength; if (totalLen > IEEE154_aMaxBeaconPayloadLength || call IEEE154TxBeaconPayload.getBeaconPayloadLength() < totalLen) return ESIZE; else { if (m_payloadState & MODIFIED_BEACON_PAYLOAD) return EBUSY; m_updateBeaconPayload = buffer; m_updateBeaconOffset = offset; m_updateBeaconLength = bufferLength; m_payloadState |= MODIFIED_BEACON_PAYLOAD; } return SUCCESS; } event void PIBUpdate.notify[uint8_t attributeID](const void* attributeValue) { switch (attributeID) { case IEEE154_macAssociationPermit: atomic m_payloadState |= MODIFIED_SF_SPEC; break; case IEEE154_macGTSPermit: atomic m_payloadState |= MODIFIED_GTS_FIELD; break; default: break; } } event void PendingAddrSpecUpdated.notify(bool val) { atomic m_payloadState |= MODIFIED_PENDING_ADDR_FIELD; } event void GtsSpecUpdated.notify(bool val) { atomic m_payloadState |= MODIFIED_GTS_FIELD; } uint8_t getNumGtsSlots(uint8_t *gtsInfoField) { uint8_t i, num=0; for (i=0; i<((gtsInfoField[0] & GTS_DESCRIPTOR_COUNT_MASK) >> GTS_DESCRIPTOR_COUNT_OFFSET); i++) num += ((gtsInfoField[4+i*3] & GTS_LENGTH_MASK) >> GTS_LENGTH_OFFSET); return num; } event void BeaconPayloadUpdateTimer.fired() { // in this order the MAC payload is updated: // (1) pending addresses // (2) GTS spec // (3) SF spec // (4) beacon payload (if there's enough time) uint8_t len=0, *beaconSpecs = &m_payload[IEEE154_aMaxBeaconOverhead]; // going backwards uint8_t beaconPayloadUpdated = 0, numGtsSlots = m_numGtsSlots; atomic { if (m_txState == S_TX_LOCKED) { dbg_serial("BeaconTransmitP", "BeaconPayloadUpdateTimer fired too late!\n"); return; // too late ! } // (1) update pending addresses if (m_payloadState & MODIFIED_PENDING_ADDR_FIELD) { len = call PendingAddrWrite.write(beaconSpecs-1, beaconSpecs-m_payload); beaconSpecs -= len; if (len != m_pendingAddrLen) { m_pendingAddrLen = len; m_payloadState |= MODIFIED_SPECS_MASK; // need to rewrite specs before } } else beaconSpecs -= m_pendingAddrLen; // (2) update GTS spec if (m_payloadState & MODIFIED_GTS_FIELD) { len = call GtsInfoWrite.write(beaconSpecs-1, beaconSpecs-m_payload); beaconSpecs -= len; numGtsSlots = getNumGtsSlots(beaconSpecs); if (len != m_pendingGtsLen || ((15-numGtsSlots) != m_numCapSlots-1)) { m_pendingGtsLen = len; m_payloadState |= MODIFIED_SPECS_MASK; // need to rewrite specs before } } else beaconSpecs -= m_pendingGtsLen; // (3) update SF spec beaconSpecs -= 2; // sizeof SF Spec if (m_payloadState & MODIFIED_SF_SPEC) { beaconSpecs[BEACON_INDEX_SF_SPEC1] = (m_beaconOrder << SF_SPEC1_BO_OFFSET) | (m_superframeOrder << SF_SPEC1_SO_OFFSET); beaconSpecs[BEACON_INDEX_SF_SPEC2] = 0; if (call MLME_GET.macAssociationPermit()) beaconSpecs[BEACON_INDEX_SF_SPEC2] |= SF_SPEC2_ASSOCIATION_PERMIT; if (call MLME_GET.macPanCoordinator()) beaconSpecs[BEACON_INDEX_SF_SPEC2] |= SF_SPEC2_PAN_COORD; beaconSpecs[BEACON_INDEX_SF_SPEC2] |= ((15-numGtsSlots) & SF_SPEC2_FINAL_CAPSLOT_MASK); } m_beaconFrame.payloadLen = (m_pendingAddrLen + m_pendingGtsLen + 2) + m_beaconPayloadLen; m_beaconFrame.payload = beaconSpecs; m_payloadState &= ~MODIFIED_SPECS_MASK; // clear flags } // end atomic (give BeaconSendAlarm.fired() the chance to execute) signal IEEE154TxBeaconPayload.aboutToTransmit(); m_beaconFrame.header->mhr[MHR_INDEX_SEQNO] = call MLME_GET.macBSN() + 1; atomic { // (4) try to update beacon payload if (m_txState == S_TX_LOCKED) { dbg_serial("BeaconTransmitP", "Not enough time for beacon payload update!\n"); return; // too late ! } if (m_payloadState & MODIFIED_BEACON_PAYLOAD) { memcpy(&m_payload[IEEE154_aMaxBeaconOverhead + m_updateBeaconOffset], m_updateBeaconPayload, m_updateBeaconLength); beaconPayloadUpdated = (m_payloadState & MODIFIED_BEACON_PAYLOAD_MASK); if (beaconPayloadUpdated & MODIFIED_BEACON_PAYLOAD_NEW) m_beaconPayloadLen = m_updateBeaconOffset + m_updateBeaconLength; } m_beaconFrame.payloadLen = (m_pendingAddrLen + m_pendingGtsLen + 2) + m_beaconPayloadLen; m_payloadState &= ~MODIFIED_BEACON_PAYLOAD_MASK; } if (beaconPayloadUpdated) { if ((beaconPayloadUpdated & MODIFIED_BEACON_PAYLOAD_NEW)) signal IEEE154TxBeaconPayload.setBeaconPayloadDone(m_updateBeaconPayload, m_updateBeaconLength); else signal IEEE154TxBeaconPayload.modifyBeaconPayloadDone(m_updateBeaconOffset, m_updateBeaconPayload, m_updateBeaconLength); } } /* ----------------------- Realignment ----------------------- */ /* In beaconenabled mode a realignment frame is broadcast in the CAP * immediately after the beacon was transmitted. In non-beaconenabled mode a * realignment frame is sent using unslotted CSMA. In both cases, if the * transmission was successful, the superframe spec should be updated now. **/ event void RealignmentBeaconEnabledTx.transmitDone(ieee154_txframe_t *frame, ieee154_status_t status) { finishRealignment(frame, status); } event void RealignmentNonBeaconEnabledTx.transmitDone(ieee154_txframe_t *frame, ieee154_status_t status) { finishRealignment(frame, status); } void finishRealignment(ieee154_txframe_t *frame, ieee154_status_t status) { call GetSetRealignmentFrame.set(frame); if (status == IEEE154_SUCCESS) { continueStartRequest(); m_requestBitmap &= ~REQUEST_REALIGNMENT_DONE_PENDING; // unlock // signal confirm where we calculate the next beacon transmission time } else { m_requestBitmap = 0; signal MLME_START.confirm(status); } } /* ----------------------- BeaconRequest ----------------------- */ event message_t* BeaconRequestRx.received(message_t* frame) { if (m_beaconOrder == 15) { // transmit the beacon frame using unslotted CSMA-CA // TODO } return frame; } /* ----------------------- SF Structure, etc. ----------------------- */ async command uint32_t OutgoingSF.sfStartTime() { return m_lastBeaconTxTime; } async command uint32_t OutgoingSF.sfSlotDuration() { return m_sfSlotDuration; } async command uint8_t OutgoingSF.numCapSlots() { return m_numCapSlots; } async command uint8_t OutgoingSF.numGtsSlots() { return m_numGtsSlots; } async command uint16_t OutgoingSF.battLifeExtDuration() { return m_battLifeExtDuration; } async command const uint8_t* OutgoingSF.gtsFields() { return m_gtsField; } async command uint16_t OutgoingSF.guardTime() { return IEEE154_MAX_BEACON_JITTER(m_beaconOrder) + IEEE154_RADIO_TX_DELAY; } async command bool OutgoingSF.isBroadcastPending() { return m_framePendingBit; } async command uint32_t OutgoingSF.beaconInterval() { return ((uint32_t) 1 << m_beaconOrder) * IEEE154_aBaseSuperframeDuration; } async command bool IsSendingBeacons.getNow() { return (m_beaconOrder < 15) || ((m_requestBitmap & REQUEST_CONFIRM_PENDING) && m_updateBeaconOrder < 15); } default event void MLME_START.confirm(ieee154_status_t status) {} default event void IEEE154TxBeaconPayload.setBeaconPayloadDone(void *beaconPayload, uint8_t length) {} default event void IEEE154TxBeaconPayload.modifyBeaconPayloadDone(uint8_t offset, void *buffer, uint8_t bufferLength) {} default event void IEEE154TxBeaconPayload.aboutToTransmit() {} default event void IEEE154TxBeaconPayload.beaconTransmitted() {} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/CoordBroadcastP.nc000066400000000000000000000116771207233610700224710ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2009-03-24 12:56:46 $ * @author Jan Hauer * ======================================================================== */ /* This component is responsible for sending broadcast frames from * a coordinator to devices. **/ #include "TKN154_MAC.h" module CoordBroadcastP { provides { interface Init as Reset; interface FrameTx as BroadcastDataFrame; interface FrameTx as RealignmentTx; interface GetNow as IsBroadcastReady; } uses { interface Queue; interface FrameTxNow as CapTransmitNow; interface TransferableResource as RadioToken; interface SuperframeStructure as OutgoingSF; } } implementation { norace bool m_lock; norace ieee154_txframe_t *m_realignmentFrame; norace ieee154_txframe_t *m_queueHead; norace ieee154_txframe_t *m_transmittedFrame; norace ieee154_status_t m_status; task void transmitNowDoneTask(); command error_t Reset.init() { while (call Queue.size()) signal BroadcastDataFrame.transmitDone(call Queue.dequeue(), IEEE154_TRANSACTION_OVERFLOW); if (m_realignmentFrame) signal RealignmentTx.transmitDone(m_realignmentFrame, IEEE154_TRANSACTION_OVERFLOW); m_realignmentFrame = m_queueHead = m_transmittedFrame = NULL; m_lock = FALSE; return SUCCESS; } command ieee154_status_t BroadcastDataFrame.transmit(ieee154_txframe_t *txFrame) { if (call Queue.enqueue(txFrame) != SUCCESS) return IEEE154_TRANSACTION_OVERFLOW; atomic { if (m_queueHead == NULL) m_queueHead = call Queue.head(); } return IEEE154_SUCCESS; } command ieee154_status_t RealignmentTx.transmit(ieee154_txframe_t *frame) { atomic { if (!m_realignmentFrame) { m_realignmentFrame = frame; return IEEE154_SUCCESS; } else return IEEE154_TRANSACTION_OVERFLOW; } } async command bool IsBroadcastReady.getNow() { if (m_lock) return FALSE; else return (m_realignmentFrame != NULL || m_queueHead != NULL); } async event void RadioToken.transferredFrom(uint8_t fromClient) { // CAP has started - are there any broadcast frames to be transmitted? if (call OutgoingSF.isBroadcastPending()) { ieee154_txframe_t *broadcastFrame = m_realignmentFrame; if (broadcastFrame == NULL) broadcastFrame = m_queueHead; ASSERT(broadcastFrame != NULL); m_lock = TRUE; call CapTransmitNow.transmitNow(broadcastFrame); } call RadioToken.transferTo(RADIO_CLIENT_COORDCAP); } async event void CapTransmitNow.transmitNowDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { m_transmittedFrame = txFrame; m_status = status; post transmitNowDoneTask(); } task void transmitNowDoneTask() { if (!m_lock) return; if (m_transmittedFrame == m_realignmentFrame) { m_realignmentFrame = NULL; signal RealignmentTx.transmitDone(m_transmittedFrame, m_status); } else if (m_transmittedFrame == m_queueHead) { call Queue.dequeue(); if (call Queue.empty()) m_queueHead = NULL; else m_queueHead = call Queue.head(); signal BroadcastDataFrame.transmitDone(m_transmittedFrame, m_status); } m_lock = FALSE; } event void RadioToken.granted(){ ASSERT(0); } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/CoordCfpP.nc000066400000000000000000000464101207233610700212700ustar00rootroot00000000000000/* * Copyright (c) 2010, CISTER/ISEP - Polytechnic Institute of Porto * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * * @author Ricardo Severino * @author Stefano Tennina * ======================================================================== */ #include "TKN154_MAC.h" #include "GTS.h" module CoordCfpP { provides { interface Init; interface WriteBeaconField as GtsInfoWrite; interface FrameTx as CfpTx; interface Purge; interface FrameRx; interface Notify as GtsSpecUpdated; interface MLME_GTS; } uses { interface TransferableResource as RadioToken; interface Alarm as CfpSlotAlarm; interface Alarm as CfpEndAlarm; interface SuperframeStructure as OutgoingSF; interface RadioTx; interface RadioRx; interface RadioOff; interface MLME_GET; interface MLME_SET; interface FrameRx as GtsRequestRx; interface IEEE154Frame as Frame; } } implementation { uint8_t m_slotNumber; uint8_t m_gtsStartSlot; uint32_t m_numGtsSlots; uint32_t m_numCapSlots; uint32_t m_cfpSlotDuration; uint32_t m_cfpDurationn; uint32_t m_capDuration; norace gtsInfoEntryType m_gtsDatabase[GTS_MAX_SLOTS]; gtsInfoEntryType m_expiredDesc; gtsDescriptorType m_savedDescriptor; gtsSlotElementType m_gtsSlotList[GTS_MAX_SLOTS]; //maps messages in the GTS buffer to each gts slot uint8_t m_gtsDescriptorCount; uint8_t m_gtsDirections; uint8_t m_gts_schedule[IEEE154_aNumSuperframeSlots]; //the GTS schedule that relates a slot with the corresponding GTS slot number uint8_t m_gtsSlotNumber; gtsBufferType m_gtsSendBuffer; gtsSlotElementType *gtsTXSlotListPtr; uint8_t m_currentTxGts; uint8_t m_reqPending; uint8_t m_beaconCounter; task void startCoordGtsSend(); task void removeGtsDescTask(); task void gtsExpirationManagementTask(); task void signalGtsTrasmitDoneTask(); error_t m_txResult; ieee154_txframe_t *m_transmitedFrame; uint8_t computeExpirationTime (ieee154_macBeaconOrder_t BO) { uint8_t expon; uint8_t gtsExpirationTime; if (BO < 9) { expon=8-BO; if (expon == 0) gtsExpirationTime=2; else { expon--; gtsExpirationTime=2 * (2< 0) { m_gtsDatabase[i].startingSlot=0; //set starting slot to 0 signal GtsSpecUpdated.notify(TRUE); return GTS_OP_SUCCESS; } } return GTS_OP_FAILED; } } gts_op_status_t removeGts (uint8_t gtsLength, uint8_t direction, uint16_t address) { uint8_t i; uint8_t removedLength=0; uint8_t removedSSlot=0; uint8_t removedGtsId=0; uint8_t slotFound=0; //search for the slot for (i=0; i 0) { removedLength=m_gtsDatabase[i].length; removedSSlot=m_gtsDatabase[i].startingSlot; removedGtsId=m_gtsDatabase[i].gtsId; m_gtsDatabase[i].gtsId=0; m_gtsDatabase[i].startingSlot=0; m_gtsDatabase[i].length=0; m_gtsDatabase[i].direction=0; m_gtsDatabase[i].devAddress=0; m_gtsDatabase[i].expiration=0; slotFound=1; } } if (slotFound) { //adjust table if (m_gtsDescriptorCount > 1 && removedGtsId < m_gtsDescriptorCount) { for (i=removedGtsId-1; i=m_gtsStartSlot; i--) { m_gts_schedule[i]=m_gts_schedule[i-removedLength]-1; if (m_gts_schedule[i] > 16) m_gts_schedule[i]=255; } m_gtsStartSlot=m_gtsStartSlot+removedLength; signal GtsSpecUpdated.notify(TRUE); m_reqPending=0; return GTS_OP_SUCCESS; } else { //failed ot remove m_reqPending=0; return GTS_OP_FAILED; } } gts_op_status_t addGts (uint8_t gtsLength, uint8_t direction, uint16_t address) { uint8_t i; if (m_gtsDescriptorCount >= GTS_MAX_SLOTS) { m_reqPending=0; return GTS_OP_FAILED; } //check if the address already exists in the GTS list for (i=0 ; i < GTS_MAX_SLOTS; i++) { if ( m_gtsDatabase[i].devAddress == address && m_gtsDatabase[i].direction == direction && m_gtsDatabase[i].gtsId > 0) { m_reqPending=0; return GTS_OP_FAILED; } } m_gtsStartSlot-=gtsLength; m_gtsDatabase[m_gtsDescriptorCount].gtsId=m_gtsDescriptorCount+1; m_gtsDatabase[m_gtsDescriptorCount].startingSlot=m_gtsStartSlot; m_gtsDatabase[m_gtsDescriptorCount].length=gtsLength; m_gtsDatabase[m_gtsDescriptorCount].direction=direction; m_gtsDatabase[m_gtsDescriptorCount].devAddress=address; m_gtsDatabase[m_gtsDescriptorCount].expiration=0x00; for (i=m_gtsStartSlot; iheader->mhr[MHR_INDEX_ADDRESS+2])) | ((data->header->mhr[MHR_INDEX_ADDRESS+3]) << 8); for (i=0 ; i < GTS_MAX_SLOTS ; i++) { //SEARCH FOR A VALID GTS if ( m_gtsDatabase[i].devAddress == dstAddr && m_gtsDatabase[i].direction == GTS_RX_DIRECTION && m_gtsDatabase[i].gtsId != 0) { gtsAvailableIndex=m_gtsSendBuffer.availableGtsIndex[m_gtsSendBuffer.availableGtsIndexCount]; m_gtsSendBuffer.availableGtsIndexCount --; m_gtsSendBuffer.frame[gtsAvailableIndex]=data; m_gtsSlotList[i].elementCount ++; m_gtsSlotList[i].gtsFrameIndex[m_gtsSlotList[i].elementIn]=gtsAvailableIndex; m_gtsSlotList[i].elementIn ++; status=1; } } if (!status) atomic signal CfpTx.transmitDone(data, IEEE154_INVALID_GTS); } return IEEE154_SUCCESS; } command ieee154_status_t Purge.purge (uint8_t msduHandle) { // request to purge a frame (triggered by MCPS_DATA.purge()) return IEEE154_INVALID_HANDLE; } async event void RadioToken.transferredFrom (uint8_t fromClient) { // the CFP has started, this component now owns the token - atomic{ uint16_t guardTime=call OutgoingSF.guardTime(); m_cfpSlotDuration = (uint32_t) call OutgoingSF.sfSlotDuration(); m_numCapSlots=(uint32_t) call OutgoingSF.numCapSlots(); m_numGtsSlots=16-m_numCapSlots; m_cfpDurationn=(uint32_t) m_numGtsSlots * m_cfpSlotDuration; m_capDuration=m_numCapSlots * m_cfpSlotDuration; m_slotNumber=(uint8_t) m_numCapSlots; call CfpEndAlarm.startAt(call OutgoingSF.sfStartTime(), m_capDuration+m_cfpDurationn-guardTime); call CfpSlotAlarm.startAt(call OutgoingSF.sfStartTime(), m_capDuration); } if (m_reqPending == 2) { m_beaconCounter++; if (m_beaconCounter > IEEE154_aGTSDescPersistenceTime-1) { post removeGtsDescTask(); } } post gtsExpirationManagementTask(); } async event void CfpEndAlarm.fired () { call CfpEndAlarm.stop(); call CfpSlotAlarm.stop(); //Transfer token #ifndef IEEE154_BEACON_SYNC_DISABLED call RadioToken.transferTo(RADIO_CLIENT_BEACONSYNCHRONIZE); #else call RadioToken.transferTo(RADIO_CLIENT_BEACONTRANSMIT); #endif } async event void CfpSlotAlarm.fired () { m_gtsSlotNumber=m_gts_schedule[m_slotNumber]; //check schedule for the gts slot number if (m_gtsSlotNumber<=GTS_MAX_SLOTS ) { if (m_gtsDatabase[m_gtsSlotNumber].direction == GTS_RX_DIRECTION && m_gtsDatabase[m_gtsSlotNumber].gtsId != 0) { call RadioOff.off(); atomic if (m_gtsSlotNumber <= GTS_MAX_SLOTS ) post startCoordGtsSend(); } else if (m_gtsDatabase[m_gtsSlotNumber].direction == GTS_TX_DIRECTION && m_gtsDatabase[m_gtsSlotNumber].gtsId != 0) { call RadioRx.enableRx(0, 0); } } if (m_slotNumber < IEEE154_aNumSuperframeSlots-1) call CfpSlotAlarm.startAt(call OutgoingSF.sfStartTime(), m_cfpSlotDuration*(m_slotNumber+1)); else { call CfpSlotAlarm.stop(); } m_slotNumber++; } async event void RadioOff.offDone () {} event message_t* GtsRequestRx.received (message_t* frame) { uint8_t *payload=(uint8_t *) &frame->data; error_t status=0; ieee154_address_t srcAddress; uint8_t gtsCharacteristics = *(payload+1); atomic if (!m_reqPending) { m_reqPending=1; call Frame.getSrcAddr(frame, &srcAddress); if (GtsGetReqType(gtsCharacteristics) == GTS_ALOC_REQ) //allocation request status = addGts(GtsGetLength(gtsCharacteristics), GtsGetDirection(gtsCharacteristics), srcAddress.shortAddress); else if (GtsGetReqType(gtsCharacteristics) == GTS_DEALOC_REQ) status=removeGts(GtsGetLength(gtsCharacteristics), GtsGetDirection(gtsCharacteristics), srcAddress.shortAddress); if (status == 1) { signal MLME_GTS.indication ( srcAddress.shortAddress, gtsCharacteristics, 0); } m_reqPending=0; } return (frame); } command uint8_t GtsInfoWrite.write (uint8_t *lastBytePtr, uint8_t maxlen) { uint8_t ind=0; uint8_t slot; if (maxlen == 0) return 0; else { if (m_gtsDescriptorCount) { m_gtsDirections=0; for (slot=0; slot<7;slot++) { if (m_gtsDatabase[slot].gtsId != 0 && m_gtsDatabase[slot].devAddress!=0x0000) { lastBytePtr[-ind]=GtsSetDescriptor(m_gtsDatabase[slot].startingSlot, m_gtsDatabase[slot].length); ind++; lastBytePtr[-ind]=m_gtsDatabase[slot].devAddress >> 8; ind++; lastBytePtr[-ind]=m_gtsDatabase[slot].devAddress; ind++; if ( m_gtsDatabase[slot].direction == GTS_RX_DIRECTION ) m_gtsDirections=m_gtsDirections | (1 << slot); } } lastBytePtr[-ind]=m_gtsDirections; ind++; } lastBytePtr[-ind]=GtsSetSpecification(m_gtsDescriptorCount, 1); return ind+1; } } task void signalGtsTrasmitDoneTask() { atomic { signal CfpTx.transmitDone(m_transmitedFrame, m_txResult); //transmitted a frame and got ack: reset slot expiration counter m_gtsDatabase[m_gtsSlotNumber].expiration=0; } //continue transmitting m_gtsSendBuffer.availableGtsIndexCount++; m_gtsSendBuffer.availableGtsIndex[m_gtsSendBuffer.availableGtsIndexCount]= gtsTXSlotListPtr->gtsFrameIndex[gtsTXSlotListPtr->elementOut]; gtsTXSlotListPtr->elementCount--; if (gtsTXSlotListPtr->elementOut++ >= GTS_SEND_BUFFER_SIZE) gtsTXSlotListPtr->elementOut=0; if ( gtsTXSlotListPtr->elementCount > 0) post startCoordGtsSend(); } async event void RadioTx.transmitDone ( ieee154_txframe_t *frame, error_t result) { atomic { m_txResult=result; m_transmitedFrame=frame; } post signalGtsTrasmitDoneTask(); } async event void RadioRx.enableRxDone(){} event message_t* RadioRx.received(message_t *frame) { //received a frame: reset slot expiration counter atomic m_gtsDatabase[m_gtsSlotNumber].expiration=0; return signal FrameRx.received(frame); } event void RadioToken.granted() { ASSERT(0); // should never happen, because we never call RadioToken.request() } command ieee154_status_t MLME_GTS.requestFromPAN ( uint8_t GtsCharacteristics, uint16_t DeviceAddress, ieee154_security_t *security ) { //This is used in case the Coordinator whishes to deallocate a gts error_t status=0; if (!m_reqPending) { m_reqPending=2; if (GtsGetReqType(GtsCharacteristics) == GTS_DEALOC_REQ) status=removeGtsFromPAN(GtsGetLength(GtsCharacteristics), GtsGetDirection(GtsCharacteristics), DeviceAddress); if (status == GTS_OP_SUCCESS) { signal MLME_GTS.indication ( DeviceAddress, GtsCharacteristics, 0); m_reqPending=2; m_savedDescriptor.gtsCharacteristics=GtsCharacteristics; m_savedDescriptor.devAddress=DeviceAddress; } else{ m_reqPending=0; } } } task void startCoordGtsSend () { atomic{ if (m_gtsSlotNumber<=GTS_MAX_SLOTS) { gtsTXSlotListPtr=&m_gtsSlotList[m_gtsSlotNumber]; m_currentTxGts=m_gtsSlotNumber; if (gtsTXSlotListPtr->elementCount > 0) { ieee154_macDSN_t dsn = call MLME_GET.macDSN(); ieee154_txframe_t* gtsFrame = m_gtsSendBuffer.frame[gtsTXSlotListPtr->gtsFrameIndex[gtsTXSlotListPtr->elementOut]]; gtsFrame->header->mhr[MHR_INDEX_SEQNO]=dsn; call MLME_SET.macDSN(dsn+1); call RadioTx.transmit(gtsFrame,0, 0); } } } } task void removeGtsDescTask () { atomic{ if (removeGts(GtsGetLength(m_savedDescriptor.gtsCharacteristics), GtsGetDirection(m_savedDescriptor.gtsCharacteristics), m_savedDescriptor.devAddress)) { m_reqPending=0; m_beaconCounter=0; } } } task void gtsExpirationManagementTask() { uint8_t desc; uint8_t gtsExpTime; //Increase expiration counters and check expiration gtsExpTime=computeExpirationTime(call MLME_GET.macBeaconOrder()); for (desc=0; desc < GTS_MAX_SLOTS; desc++) { atomic if (m_gtsDatabase[desc].gtsId) { if (m_gtsDatabase[desc].expiration++ >= gtsExpTime-1) { //deallocate gts m_reqPending=1; removeGts(m_gtsDatabase[desc].length,m_gtsDatabase[desc].direction, m_gtsDatabase[desc].devAddress); m_reqPending=0; } } } } command ieee154_status_t MLME_GTS.request ( uint8_t GtsCharacteristics, ieee154_security_t *security ){} command error_t GtsSpecUpdated.enable () {return FAIL;} command error_t GtsSpecUpdated.disable () {return FAIL;} default event void GtsSpecUpdated.notify (bool val) {return;} default event void MLME_GTS.indication ( uint16_t DeviceAddress, uint8_t GtsCharacteristics, ieee154_security_t *security ){} default event void MLME_GTS.confirm ( uint8_t GtsCharacteristics, ieee154_status_t status ){} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/CoordRealignmentP.nc000066400000000000000000000200111207233610700230120ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-06-02 08:40:12 $ * @author Jan Hauer * ======================================================================== */ /* "The coordinator realignment command is sent by the PAN coordinator or a * coordinator either following the reception of an orphan notification command * from a device that is recognized to be on its PAN or when any of its PAN * configuration attributes change due to the receipt of an MLME-START.request * primitive." IEEE 802.15.4-2006, Sec. 7.3.8 **/ #include "TKN154_MAC.h" module CoordRealignmentP { provides { interface Init; interface MLME_ORPHAN; interface MLME_COMM_STATUS; interface GetSet as GetSetRealignmentFrame; } uses { interface FrameTx as CoordRealignmentTx; interface FrameRx as OrphanNotificationRx; interface FrameUtility; interface MLME_GET; interface IEEE154Frame as Frame; interface Pool as TxFramePool; interface Pool as TxControlPool; interface Get as LocalExtendedAddress; } } implementation { enum { ORPHAN_RESPONSE, BEACON_REALIGNMENT, }; uint8_t m_payload[9]; bool m_busy = FALSE; void destroyRealignmentFrame(ieee154_txframe_t *frame); ieee154_txframe_t *newRealignmentFrame(uint8_t type, ieee154_address_t *dstAddress); command error_t Init.init() { return SUCCESS; } command ieee154_txframe_t* GetSetRealignmentFrame.get() { ieee154_address_t bcastAddr; bcastAddr.shortAddress = 0xFFFF; return newRealignmentFrame(BEACON_REALIGNMENT, &bcastAddr); } command void GetSetRealignmentFrame.set(ieee154_txframe_t* frame) { destroyRealignmentFrame(frame); } event message_t* OrphanNotificationRx.received(message_t* frame) { ieee154_address_t srcAddress; if (call Frame.getSrcAddrMode(frame) == ADDR_MODE_EXTENDED_ADDRESS && call Frame.getSrcAddr(frame, &srcAddress) == SUCCESS) signal MLME_ORPHAN.indication ( srcAddress.extendedAddress, NULL); return frame; } command ieee154_status_t MLME_ORPHAN.response ( uint64_t OrphanAddress, uint16_t ShortAddress, bool AssociatedMember, ieee154_security_t *security) { ieee154_txframe_t *txFrame; ieee154_status_t txStatus; ieee154_address_t dstAddress; dstAddress.extendedAddress = OrphanAddress; if (!AssociatedMember) txStatus = IEEE154_SUCCESS; else if (m_busy || (txFrame = newRealignmentFrame(ORPHAN_RESPONSE, &dstAddress)) == NULL) txStatus = IEEE154_TRANSACTION_OVERFLOW; else { m_busy = TRUE; txFrame->payload[0] = CMD_FRAME_COORDINATOR_REALIGNMENT; *((nxle_uint16_t*) &txFrame->payload[1]) = call MLME_GET.macPANId(); *((nxle_uint16_t*) &txFrame->payload[3]) = call MLME_GET.macShortAddress(); txFrame->payload[5] = call MLME_GET.phyCurrentChannel(); *((nxle_uint16_t*) &txFrame->payload[6]) = ShortAddress; txFrame->payloadLen = 8; if ((txStatus = call CoordRealignmentTx.transmit(txFrame)) != IEEE154_SUCCESS) { m_busy = FALSE; destroyRealignmentFrame(txFrame); } } return txStatus; } ieee154_txframe_t *newRealignmentFrame(uint8_t type, ieee154_address_t *dstAddress) { ieee154_txframe_t *txFrame = NULL; ieee154_txcontrol_t *txControl; uint8_t dstAddrMode; ieee154_address_t srcAddress; if ((txFrame = call TxFramePool.get()) != NULL) { if ((txControl = call TxControlPool.get()) == NULL) { call TxFramePool.put(txFrame); txFrame = NULL; } else { txFrame->header = &txControl->header; txFrame->metadata = &txControl->metadata; txFrame->payload = m_payload; txFrame->header->mhr[MHR_INDEX_FC1] = FC1_FRAMETYPE_CMD; txFrame->header->mhr[MHR_INDEX_FC2] = FC2_SRC_MODE_EXTENDED; if (type == ORPHAN_RESPONSE) { txFrame->header->mhr[MHR_INDEX_FC2] |= FC2_DEST_MODE_EXTENDED; dstAddrMode = ADDR_MODE_EXTENDED_ADDRESS; txFrame->header->mhr[MHR_INDEX_FC1] |= FC1_ACK_REQUEST; } else { txFrame->header->mhr[MHR_INDEX_FC2] |= FC2_DEST_MODE_SHORT; dstAddrMode = ADDR_MODE_SHORT_ADDRESS; } srcAddress.extendedAddress = call LocalExtendedAddress.get(); txFrame->headerLen = call FrameUtility.writeHeader( txFrame->header->mhr, dstAddrMode, 0xFFFF, dstAddress, ADDR_MODE_EXTENDED_ADDRESS, call MLME_GET.macPANId(), &srcAddress, FALSE); } } return txFrame; } void destroyRealignmentFrame(ieee154_txframe_t *frame) { call TxControlPool.put((ieee154_txcontrol_t*) ((uint8_t*) frame->header - offsetof(ieee154_txcontrol_t, header))); call TxFramePool.put(frame); } event void CoordRealignmentTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { uint8_t *mhr = MHR(txFrame); ieee154_address_t dstAddr; ieee154_address_t srcAddr; if (m_busy) { call FrameUtility.convertToNative(&dstAddr.extendedAddress, &mhr[MHR_INDEX_ADDRESS+2]); call FrameUtility.convertToNative(&srcAddr.extendedAddress, &mhr[MHR_INDEX_ADDRESS+2+8+2]); signal MLME_COMM_STATUS.indication ( *((nxle_uint16_t*) &txFrame->payload[1]), // PANId ADDR_MODE_EXTENDED_ADDRESS, // SrcAddrMode srcAddr, ADDR_MODE_EXTENDED_ADDRESS, // DstAddrMode dstAddr, status, NULL); call TxControlPool.put((ieee154_txcontrol_t*) ((uint8_t*) txFrame->header - offsetof(ieee154_txcontrol_t, header))); call TxFramePool.put(txFrame); m_busy = FALSE; } } default event void MLME_COMM_STATUS.indication ( uint16_t PANId, uint8_t SrcAddrMode, ieee154_address_t SrcAddr, uint8_t DstAddrMode, ieee154_address_t DstAddr, ieee154_status_t status, ieee154_security_t *security) {} default event void MLME_ORPHAN.indication ( uint64_t OrphanAddress, ieee154_security_t *security) {} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/DataP.nc000066400000000000000000000237141207233610700204440ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2009-04-28 14:12:03 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" module DataP { provides { interface Init; interface MCPS_DATA; interface MCPS_PURGE; } uses { interface FrameRx as CoordCapRx; interface FrameTx as DeviceCapTx; interface FrameTx as CoordCapTx; interface FrameTx as BroadcastTx; interface FrameRx as DeviceCapRx; interface Pool as TxFramePool; interface FrameTx as DeviceCfpTx; interface FrameTx as CoordCfpTx; interface FrameTx as IndirectTx; interface FrameRx as CoordCfpRx; interface FrameRx as DeviceCfpRx; interface FrameUtility; interface Purge as PurgeDirect; interface Purge as PurgeIndirect; interface Purge as PurgeGtsDevice; interface Purge as PurgeGtsCoord; interface MLME_GET; interface Leds; interface Packet; interface IEEE154Frame as Frame; interface Get as LocalExtendedAddress; } } implementation { message_t* dataReceived(message_t* frame); void finishTxTransaction(ieee154_txframe_t *txFrame, ieee154_status_t status); command error_t Init.init() { return SUCCESS; } command ieee154_status_t MCPS_DATA.request ( message_t *frame, uint8_t payloadLen, uint8_t msduHandle, uint8_t txOptions) { uint8_t srcAddrMode = call Frame.getSrcAddrMode(frame); uint8_t dstAddrMode = call Frame.getDstAddrMode(frame); ieee154_address_t dstAddr; ieee154_status_t txStatus; ieee154_txframe_t *txFrame; uint8_t sfType=0; uint8_t *mhr, mhrLen = call Frame.getHeaderLength(frame); if (payloadLen > call Packet.maxPayloadLength() || mhrLen + payloadLen + 2 > IEEE154_aMaxPHYPacketSize) // extra 2 for MAC footer (CRC) txStatus = IEEE154_INVALID_PARAMETER; else if ((!srcAddrMode && !dstAddrMode) || (srcAddrMode > ADDR_MODE_EXTENDED_ADDRESS || dstAddrMode > ADDR_MODE_EXTENDED_ADDRESS) || (srcAddrMode == ADDR_MODE_RESERVED || dstAddrMode == ADDR_MODE_RESERVED)) txStatus = IEEE154_INVALID_ADDRESS; else if (!(txFrame = call TxFramePool.get())) txStatus = IEEE154_TRANSACTION_OVERFLOW; else { // construct the DATA frame txFrame->header = &((message_header_t*) frame->header)->ieee154; txFrame->payload = (uint8_t*) frame->data; txFrame->metadata = &((message_metadata_t*) frame->metadata)->ieee154; txFrame->payloadLen = payloadLen; mhr = txFrame->header->mhr; txFrame->headerLen = mhrLen; mhr[MHR_INDEX_FC1] &= ~(FC1_FRAMETYPE_MASK | FC1_FRAME_PENDING | FC1_ACK_REQUEST); mhr[MHR_INDEX_FC1] |= FC1_FRAMETYPE_DATA; if (txOptions & TX_OPTIONS_ACK) mhr[MHR_INDEX_FC1] |= FC1_ACK_REQUEST; mhr[MHR_INDEX_FC2] &= ~FC2_FRAME_VERSION_MASK; if (payloadLen > IEEE154_aMaxMACSafePayloadSize) mhr[MHR_INDEX_FC2] |= FC2_FRAME_VERSION_1; txFrame->handle = msduHandle; // in case a node is both, coordinator and device (e.g. in a // cluster-tree topology), it has to be decided whether the frame // is to be sent in the incoming or outgoing superframe (sf); // we do this by comparing the destination address to the // coordinator address in the PIB, if they match the frame is // sent in the incoming sf otherwise in the outgoing sf call Frame.getDstAddr(frame, &dstAddr); if (dstAddrMode == ADDR_MODE_SHORT_ADDRESS) { if (dstAddr.shortAddress == call MLME_GET.macCoordShortAddress()) sfType = INCOMING_SUPERFRAME; else sfType = OUTGOING_SUPERFRAME; } else if (dstAddrMode == ADDR_MODE_EXTENDED_ADDRESS) { if (dstAddr.extendedAddress == call MLME_GET.macCoordExtendedAddress()) sfType = INCOMING_SUPERFRAME; else sfType = OUTGOING_SUPERFRAME; } else if (dstAddrMode == ADDR_MODE_NOT_PRESENT) // to PAN Coord sfType = INCOMING_SUPERFRAME; // GTS? if (txOptions & TX_OPTIONS_GTS) { if (sfType == INCOMING_SUPERFRAME) txStatus = call DeviceCfpTx.transmit(txFrame); else txStatus = call CoordCfpTx.transmit(txFrame); // indirect transmission? } else if ((txOptions & TX_OPTIONS_INDIRECT) && (dstAddrMode >= ADDR_MODE_SHORT_ADDRESS)) { if (dstAddrMode == ADDR_MODE_SHORT_ADDRESS && dstAddr.shortAddress == 0xFFFF) { mhr[MHR_INDEX_FC1] &= ~FC1_ACK_REQUEST; txStatus = call BroadcastTx.transmit(txFrame); } else txStatus = call IndirectTx.transmit(txFrame); // transmission in the CAP } else if (sfType == INCOMING_SUPERFRAME) txStatus = call DeviceCapTx.transmit(txFrame); else txStatus = call CoordCapTx.transmit(txFrame); if (txStatus != IEEE154_SUCCESS) { call TxFramePool.put(txFrame); } } return txStatus; } command ieee154_status_t MCPS_PURGE.request ( uint8_t msduHandle) { if (call PurgeDirect.purge(msduHandle) == IEEE154_SUCCESS || call PurgeIndirect.purge(msduHandle) == IEEE154_SUCCESS || call PurgeGtsDevice.purge(msduHandle) == IEEE154_SUCCESS || call PurgeGtsCoord.purge(msduHandle) == IEEE154_SUCCESS) return IEEE154_SUCCESS; else return IEEE154_INVALID_HANDLE; } event void PurgeDirect.purgeDone(ieee154_txframe_t *data, ieee154_status_t status) { finishTxTransaction(data, status); } event void PurgeIndirect.purgeDone(ieee154_txframe_t *data, ieee154_status_t status) { finishTxTransaction(data, status); } event void PurgeGtsDevice.purgeDone(ieee154_txframe_t *data, ieee154_status_t status) { finishTxTransaction(data, status); } event void PurgeGtsCoord.purgeDone(ieee154_txframe_t *data, ieee154_status_t status) { finishTxTransaction(data, status); } event message_t* CoordCfpRx.received(message_t* frame) { return dataReceived(frame); } event message_t* DeviceCfpRx.received(message_t* frame) { return dataReceived(frame); } event message_t* CoordCapRx.received(message_t* frame) { return dataReceived(frame); } event message_t* DeviceCapRx.received(message_t* frame) { return dataReceived(frame); } message_t* dataReceived(message_t* frame) { return signal MCPS_DATA.indication(frame); } void finishTxTransaction(ieee154_txframe_t *txFrame, ieee154_status_t status) { uint8_t handle = txFrame->handle; uint32_t txTime = txFrame->metadata->timestamp; message_t *msg = (message_t*) ((uint8_t*) txFrame->header - offsetof(message_t, header)); call TxFramePool.put(txFrame); signal MCPS_DATA.confirm(msg, handle, status, txTime); } event void BroadcastTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { finishTxTransaction(txFrame, status); } event void DeviceCapTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { finishTxTransaction(txFrame, status); } event void CoordCapTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { finishTxTransaction(txFrame, status); } event void DeviceCfpTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { finishTxTransaction(txFrame, status); } event void CoordCfpTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { finishTxTransaction(txFrame, status); } event void IndirectTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { finishTxTransaction(txFrame, status); } default event void MCPS_DATA.confirm( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t Timestamp) {} default event message_t* MCPS_DATA.indication(message_t* frame) { return frame; } default command ieee154_status_t DeviceCfpTx.transmit(ieee154_txframe_t *data) {return IEEE154_INVALID_GTS;} default command ieee154_status_t BroadcastTx.transmit(ieee154_txframe_t *data) {return IEEE154_INVALID_PARAMETER;} default command ieee154_status_t CoordCfpTx.transmit(ieee154_txframe_t *data) {return IEEE154_INVALID_GTS;} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/DebugC.nc000066400000000000000000000042131207233610700205750ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-25 16:47:49 $ * @author: Jan Hauer * ======================================================================== */ #define NEW_PRINTF_SEMANTICS #include "printf.h" configuration DebugC { } implementation { components DebugP, LedsC, MainC; DebugP.Boot -> MainC; DebugP.Leds -> LedsC; components PrintfC; components SerialStartC; #if defined(PLATFORM_TELOSB) components UserButtonC; DebugP.ButtonPressed -> UserButtonC; #endif } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/DebugP.nc000066400000000000000000000116151207233610700206160ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-04-17 14:47:09 $ * @author: Jan Hauer * ======================================================================== */ #include "printf.h" #if defined(PLATFORM_TELOSB) #include #endif module DebugP { uses { interface Boot; interface Leds; #if defined(PLATFORM_TELOSB) interface Notify as ButtonPressed; #endif } } implementation { enum { MAX_LEN_FUNNAME = 50, MAX_LEN_FILENAME = 50, NUM_LIST_ENTRIES = 20, }; typedef struct { const char *filename; uint16_t line; const char *format; uint32_t param[2]; } debug_list_entry_t; norace debug_list_entry_t m_list[NUM_LIST_ENTRIES]; norace uint8_t m_head; norace uint8_t m_tail; norace bool m_overflow; uint16_t m_assertCounter; norace uint16_t m_assertLine; norace char m_assertFilename[MAX_LEN_FILENAME]; norace char m_assertFunction[MAX_LEN_FUNNAME]; event void Boot.booted() { #if defined(PLATFORM_TELOSB) call ButtonPressed.enable(); #endif } #if defined(PLATFORM_TELOSB) event void ButtonPressed.notify( button_state_t val ) { dbg_serial_flush(); } #endif task void assertFailTask() { if (m_assertCounter == 0) { printf("Assert failed: File: %s, line: %d, function: %s.\n", m_assertFilename, m_assertLine, m_assertFunction); printfflush(); } if (m_assertCounter++ < 3000) { call Leds.led0On(); call Leds.led1On(); call Leds.led2On(); } else { call Leds.led0Off(); call Leds.led1Off(); call Leds.led2Off(); } if (m_assertCounter > 6000) m_assertCounter = 0; post assertFailTask(); } void tkn154_assert(bool val, const char *filename, uint16_t line, const char *func) @C() @spontaneous() { if (!val) { if (m_assertLine == 0) { // only catch the first failure, output it periodically m_assertLine = line; strncpy(m_assertFilename, filename, MAX_LEN_FILENAME); strncpy(m_assertFunction, func, MAX_LEN_FUNNAME); post assertFailTask(); } } } void tkn154_dbg_serial(const char *filename, uint16_t line, ...) @C() @spontaneous() { // This function must be fast: we just copy the strings and // output them later in the flush-function if ((m_head + 1) % NUM_LIST_ENTRIES != m_tail) { va_list argp; m_list[m_head].filename = filename; m_list[m_head].line = line; va_start(argp, line); m_list[m_head].format = va_arg(argp, char*); m_list[m_head].param[0] = va_arg(argp, uint32_t); m_list[m_head].param[1] = va_arg(argp, uint32_t); va_end(argp); m_head = (m_head + 1) % NUM_LIST_ENTRIES; } else m_overflow = TRUE; } task void serialFlushTask() { if (m_overflow) printf("SERIAL OVERFLOW!\n"); if (m_head != m_tail) { printf("%s:%d:", m_list[m_tail].filename, m_list[m_tail].line); printf(m_list[m_tail].format, m_list[m_tail].param[0], m_list[m_tail].param[1]); atomic { if (++m_tail >= NUM_LIST_ENTRIES) m_tail = 0; } } if (m_head != m_tail) post serialFlushTask(); printfflush(); } void tkn154_dbg_serial_flush() @C() @spontaneous() { post serialFlushTask(); } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/DeviceCfpP.nc000066400000000000000000000350741207233610700214250ustar00rootroot00000000000000/* * Copyright (c) 2010, CISTER/ISEP - Polytechnic Institute of Porto * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * * @author Ricardo Severino * @author Stefano Tennina * ======================================================================== */ #include "TKN154_MAC.h" #include "GTS.h" module DeviceCfpP { provides { interface Init; interface FrameTx as CfpTx; interface Purge; interface FrameRx; interface MLME_GTS; } uses { interface TransferableResource as RadioToken; interface Alarm as CfpSlotAlarm; interface Alarm as CfpEndAlarm; interface SuperframeStructure as IncomingSF; interface RadioTx; interface RadioRx; interface RadioOff; interface MLME_GET; interface MLME_SET; interface FrameTx as GTSrequestTx; interface Pool as TxFramePool; interface Pool as TxControlPool; interface FrameUtility; } } implementation { uint8_t m_gtsReqCharacteristics; uint8_t m_gtsCharacteristics; uint16_t m_gtsSlotAddress; uint8_t m_gtsReqPending; uint8_t m_gtsBeaconCounter; uint8_t m_gtsField[1+1+3*7]; gtsBufferType m_gtsSendBuffer; uint8_t m_slotNumber; uint8_t m_gtsTxStartSlot; uint8_t m_gtsTxEndSlot; uint8_t m_gtsRxStartSlot; uint8_t m_gtsRxEndSlot; uint32_t m_numGtsSlots; uint32_t m_numCapSlots; uint32_t m_cfpSlotDuration; uint32_t m_cfpDuration; uint32_t m_capDuration; uint8_t m_gtsTXON; uint8_t m_gtsRXON; uint8_t m_gtsSlotDir; uint8_t m_payload_GTS_Request[2]; uint8_t m_GtsOnTXSlot; ieee154_macShortAddress_t m_myAddress; ieee154_txframe_t *m_frameDone; task void startGtsSend(); task void signalGtsConfirmSuccessTask(); task void signalGtsConfirmDeniedTask(); task void signalCfpTxDone(); task void signalGtsConfirmNoAddressTask(); task void signalGtsIndicationTask(); task void signalGtsConfirmNoDataTask(); void initGtsBuffer() { int i=0; atomic for(i=0;i<7;i++) { m_gtsSendBuffer.gtsSendBufferCount = 0x00; m_gtsSendBuffer.gtsSendBufferMsgIn = 0x00; m_gtsSendBuffer.gtsSendBufferMsgOut = 0x00; } } uint8_t GtsSetCharacteristics(uint8_t gtsLength, uint8_t gtsDirection, uint8_t characteristicType) { return ( (gtsLength << 0) | (gtsDirection << 4) | (characteristicType << 5)); } uint8_t GtsGetReqType(uint8_t gtsCharacteristics) { if ( (gtsCharacteristics & 0x20) == 0x20) return GTS_ALOC_REQ; else return GTS_DEALOC_REQ; } command error_t Init.init() { atomic{ m_gtsReqPending=0; m_gtsBeaconCounter=0; m_gtsTXON=0; m_gtsRXON=0; m_GtsOnTXSlot=0; } initGtsBuffer(); return SUCCESS; } command ieee154_status_t MLME_GTS.request ( uint8_t GtsCharacteristics, ieee154_security_t *security ) { ieee154_status_t status = IEEE154_SUCCESS; ieee154_txframe_t *txFrame=0; ieee154_txcontrol_t *txControl=0; ieee154_address_t srcAddress; ieee154_macDSN_t dsn = call MLME_GET.macDSN(); ieee154_address_t DeviceAddress; atomic m_gtsCharacteristics=GtsCharacteristics; if (security && security->SecurityLevel) status = IEEE154_UNSUPPORTED_SECURITY; atomic { m_myAddress=srcAddress.shortAddress=call MLME_GET.macShortAddress(); if ( srcAddress.shortAddress==0xFFFF || srcAddress.shortAddress==0xFFFE) { post signalGtsConfirmNoAddressTask(); status=IEEE154_NO_SHORT_ADDRESS; } else if (!(txFrame=call TxFramePool.get())) status=IEEE154_TRANSACTION_OVERFLOW; else if (!(txControl=call TxControlPool.get())) { call TxFramePool.put(txFrame); status=IEEE154_TRANSACTION_OVERFLOW; } } atomic { if (status==IEEE154_SUCCESS) { // construct the frame txFrame->header=&txControl->header; txFrame->metadata=&txControl->metadata; txFrame->header->mhr[MHR_INDEX_FC1]=FC1_ACK_REQUEST | FC1_FRAMETYPE_CMD; txFrame->header->mhr[MHR_INDEX_FC2]=FC2_SRC_MODE_SHORT; txFrame->header->mhr[MHR_INDEX_SEQNO]=dsn; call MLME_SET.macDSN(dsn+1); txFrame->headerLen=call FrameUtility.writeHeader( txFrame->header->mhr, ADDR_MODE_NOT_PRESENT, call MLME_GET.macPANId(), &DeviceAddress, ADDR_MODE_SHORT_ADDRESS, call MLME_GET.macPANId(), &srcAddress, 0); m_payload_GTS_Request[0]=CMD_FRAME_GTS_REQUEST; m_payload_GTS_Request[1]=GtsCharacteristics; txFrame->payload=m_payload_GTS_Request; txFrame->payloadLen=2; status=call GTSrequestTx.transmit(txFrame); m_gtsReqCharacteristics=GtsCharacteristics; } if (status != IEEE154_SUCCESS) { call TxFramePool.put(txFrame); call TxControlPool.put(txControl); } else m_gtsReqPending=1; } return status; } command ieee154_status_t CfpTx.transmit(ieee154_txframe_t *data) { atomic{ if (m_gtsTXON==1) { //if there is a TX gts and gts mechanism is on for this device // request to send a frame in a GTS slot (triggered by MCPS_DATA.request()) gtsBufferType* gtsSendBufferPtr = &m_gtsSendBuffer; gtsSendBufferPtr->frame[gtsSendBufferPtr->gtsSendBufferMsgIn] = data; gtsSendBufferPtr->gtsSendBufferMsgIn++; gtsSendBufferPtr->gtsSendBufferCount++; if (gtsSendBufferPtr->gtsSendBufferMsgIn==GTS_SEND_BUFFER_SIZE) gtsSendBufferPtr->gtsSendBufferMsgIn=0; if (m_GtsOnTXSlot) post startGtsSend(); return IEEE154_SUCCESS; } else return IEEE154_INVALID_GTS; } } command ieee154_status_t Purge.purge(uint8_t msduHandle) { // request to purge a frame (triggered by MCPS_DATA.purge()) return IEEE154_INVALID_HANDLE; } async event void RadioToken.transferredFrom(uint8_t fromClient) { // the CFP has started, this component now owns the token - const uint8_t* gtsFieldPtr; uint8_t gtsFieldLength; uint8_t GTS_FIELD_INDEX=0; uint8_t numGts; uint16_t gtsSlotAddress; uint8_t i, DIR_MASK; uint16_t guardTime=call IncomingSF.guardTime(); m_cfpSlotDuration=(uint32_t) call IncomingSF.sfSlotDuration(); m_numCapSlots=(uint32_t) call IncomingSF.numCapSlots(); m_numGtsSlots=16-m_numCapSlots; m_cfpDuration=(uint32_t) m_numGtsSlots * m_cfpSlotDuration; m_capDuration=m_numCapSlots * m_cfpSlotDuration; m_slotNumber=(uint8_t) m_numCapSlots-1; call CfpEndAlarm.startAt(call IncomingSF.sfStartTime(), m_capDuration+m_cfpDuration-guardTime); //process gts gtsFieldPtr=call IncomingSF.gtsFields(); gtsFieldLength=1 + ((call IncomingSF.numGtsSlots() > 0) ? 1 + call IncomingSF.numGtsSlots() * 3: 0); memcpy(m_gtsField, gtsFieldPtr, gtsFieldLength); numGts=(m_gtsField[0] & GTS_DESCRIPTOR_COUNT_MASK); m_gtsSlotDir=m_gtsField[1]; GTS_FIELD_INDEX=2; m_gtsTXON=0; m_gtsRXON=0; for (i=numGts; i>0; i--) { gtsSlotAddress= ( m_gtsField[GTS_FIELD_INDEX] | m_gtsField[GTS_FIELD_INDEX+1] << 8 ); DIR_MASK=(0x01 << (i-1)); if (gtsSlotAddress == m_myAddress) { if ((m_gtsSlotDir & DIR_MASK) == GTS_TX_DIRECTION) {//TX gts m_gtsTXON=1;//gts slots on m_gtsTxStartSlot=m_gtsField[GTS_FIELD_INDEX+2] & 0x0f; m_gtsTxEndSlot=m_gtsTxStartSlot+((m_gtsField[GTS_FIELD_INDEX+2] & 0xf0) >> 4); m_gtsCharacteristics=GtsSetCharacteristics(m_gtsTxEndSlot-m_gtsTxStartSlot, 0, 1); m_gtsSlotAddress=gtsSlotAddress; if (m_gtsTxStartSlot == 0) { m_gtsTXON=0; if (m_gtsReqPending == 1) { post signalGtsConfirmDeniedTask(); m_gtsReqPending=0; } else { post signalGtsIndicationTask(); } } if (m_gtsReqPending && m_gtsCharacteristics == m_gtsReqCharacteristics) { post signalGtsConfirmSuccessTask(); m_gtsReqPending=0; m_gtsBeaconCounter=0; } } else { //RX gts m_gtsRXON=1; m_gtsRxStartSlot=m_gtsField[GTS_FIELD_INDEX+2] & 0x0f ; m_gtsRxEndSlot=m_gtsRxStartSlot+((m_gtsField[GTS_FIELD_INDEX+2] & 0xf0) >> 4); m_gtsCharacteristics=GtsSetCharacteristics(m_gtsRxEndSlot-m_gtsRxStartSlot, 1, 1); m_gtsSlotAddress=gtsSlotAddress; if (m_gtsRxStartSlot == 0) { m_gtsRXON=0; if (m_gtsReqPending == 1) { post signalGtsConfirmDeniedTask(); m_gtsReqPending=0; } else { post signalGtsIndicationTask(); } } if (m_gtsReqPending && m_gtsCharacteristics == m_gtsReqCharacteristics) { post signalGtsConfirmSuccessTask(); m_gtsReqPending=0; m_gtsBeaconCounter=0; } } } GTS_FIELD_INDEX+=3; } if (m_gtsReqPending) { if (m_gtsBeaconCounter++ > IEEE154_aGTSDescPersistenceTime) { post signalGtsConfirmNoDataTask(); m_gtsReqPending=0; m_gtsBeaconCounter=0; } } call CfpSlotAlarm.startAt(call IncomingSF.sfStartTime(), m_capDuration); } task void signalGtsConfirmNoAddressTask() { atomic signal MLME_GTS.confirm(m_gtsCharacteristics,IEEE154_NO_SHORT_ADDRESS); } task void signalGtsConfirmSuccessTask() { atomic signal MLME_GTS.confirm(m_gtsReqCharacteristics,IEEE154_SUCCESS); } task void signalGtsConfirmNoDataTask() { atomic signal MLME_GTS.confirm(m_gtsReqCharacteristics,IEEE154_NO_DATA); } task void signalGtsConfirmDeniedTask() {; atomic signal MLME_GTS.confirm(m_gtsReqCharacteristics,IEEE154_DENIED); } task void signalGtsIndicationTask() { atomic signal MLME_GTS.indication(m_gtsSlotAddress, m_gtsCharacteristics,0); } task void startGtsSend() { ieee154_txframe_t* gtsFrame; ieee154_macDSN_t dsn = call MLME_GET.macDSN(); atomic{ if (m_slotNumber >= m_gtsTxStartSlot && m_slotNumber header->mhr[MHR_INDEX_SEQNO]=dsn; call MLME_SET.macDSN(dsn+1); call RadioTx.transmit(gtsFrame,0, 0); } } } task void signalCfpTxDone() { atomic signal CfpTx.transmitDone(m_frameDone, IEEE154_SUCCESS); } async event void CfpEndAlarm.fired() { call CfpEndAlarm.stop(); call CfpSlotAlarm.stop(); m_GtsOnTXSlot=0; #ifndef IEEE154_BEACON_TX_DISABLED call RadioToken.transferTo(RADIO_CLIENT_BEACONTRANSMIT); #else call RadioToken.transferTo(RADIO_CLIENT_BEACONSYNCHRONIZE); #endif } async event void CfpSlotAlarm.fired() { m_slotNumber++; if (m_slotNumber >= m_gtsTxStartSlot && m_slotNumber 0 ) { call RadioOff.off(); m_GtsOnTXSlot=1; post startGtsSend(); } else if (m_slotNumber >= m_gtsRxStartSlot && m_slotNumber 0) post startGtsSend(); } } async event void RadioRx.enableRxDone(){} event message_t* RadioRx.received(message_t *frame) { // signal it to responsible client component return signal FrameRx.received(frame); } event void RadioToken.granted() { ASSERT(0); // should never happen, because we never call RadioToken.request() } event void GTSrequestTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { atomic{ call TxControlPool.put((ieee154_txcontrol_t*) ((uint8_t*) txFrame->header - offsetof(ieee154_txcontrol_t, header))); call TxFramePool.put(txFrame); if (GtsGetReqType(m_gtsReqCharacteristics)==GTS_DEALOC_REQ) { post signalGtsConfirmSuccessTask(); m_gtsReqPending=0; } } } command ieee154_status_t MLME_GTS.requestFromPAN ( //Only for PAN Coordinator use uint8_t GtsCharacteristics, uint16_t DeviceAddress, ieee154_security_t *security ){} default event void MLME_GTS.indication ( uint16_t DeviceAddress, uint8_t GtsCharacteristics, ieee154_security_t *security ){} default event void MLME_GTS.confirm ( uint8_t GtsCharacteristics, ieee154_status_t status ){} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/DisassociateP.nc000066400000000000000000000252551207233610700222100ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2009-10-16 12:25:45 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" module DisassociateP { provides { interface Init; interface MLME_DISASSOCIATE; } uses { interface FrameTx as DisassociationIndirectTx; interface FrameTx as DisassociationDirectTx; interface FrameTx as DisassociationToCoord; interface FrameRx as DisassociationDirectRxFromCoord; interface FrameExtracted as DisassociationExtractedFromCoord; interface FrameRx as DisassociationRxFromDevice; interface Pool as TxFramePool; interface Pool as TxControlPool; interface MLME_GET; interface MLME_SET; interface FrameUtility; interface IEEE154Frame as Frame; interface Get as LocalExtendedAddress; } } implementation { enum { S_IDLE = 0xFF, }; uint8_t m_payloadDisassocRequest[2]; uint8_t m_coordAddrMode; bool m_disAssociationOngoing; void resetPanValuesInPib(); command error_t Init.init() { m_payloadDisassocRequest[0] = S_IDLE; m_coordAddrMode = 0; m_disAssociationOngoing = FALSE; return SUCCESS; } /* ------------------- MLME_DISASSOCIATE (initiating) ------------------- */ command ieee154_status_t MLME_DISASSOCIATE.request ( uint8_t DeviceAddrMode, uint16_t DevicePANID, ieee154_address_t DeviceAddress, ieee154_disassociation_reason_t DisassociateReason, bool TxIndirect, ieee154_security_t *security) { ieee154_status_t status = IEEE154_SUCCESS; ieee154_txframe_t *txFrame=0; ieee154_txcontrol_t *txControl=0; ieee154_address_t srcAddress; if (security && security->SecurityLevel) status = IEEE154_UNSUPPORTED_SECURITY; else if (call MLME_GET.macPANId() != DevicePANID || (DeviceAddrMode != ADDR_MODE_SHORT_ADDRESS && DeviceAddrMode != ADDR_MODE_EXTENDED_ADDRESS)) status = IEEE154_INVALID_PARAMETER; else if (m_disAssociationOngoing || !(txFrame = call TxFramePool.get())) status = IEEE154_TRANSACTION_OVERFLOW; else if (!(txControl = call TxControlPool.get())) { call TxFramePool.put(txFrame); status = IEEE154_TRANSACTION_OVERFLOW; } if (status == IEEE154_SUCCESS) { txFrame->header = &txControl->header; txFrame->metadata = &txControl->metadata; srcAddress.extendedAddress = call LocalExtendedAddress.get(); txFrame->headerLen = call FrameUtility.writeHeader( txFrame->header->mhr, DeviceAddrMode, call MLME_GET.macPANId(), &DeviceAddress, ADDR_MODE_EXTENDED_ADDRESS, call MLME_GET.macPANId(), &srcAddress, TRUE); txFrame->header->mhr[MHR_INDEX_FC1] = FC1_ACK_REQUEST | FC1_FRAMETYPE_CMD | FC1_PAN_ID_COMPRESSION; txFrame->header->mhr[MHR_INDEX_FC2] = FC2_SRC_MODE_EXTENDED | (DeviceAddrMode == ADDR_MODE_SHORT_ADDRESS ? FC2_DEST_MODE_SHORT : FC2_DEST_MODE_EXTENDED); m_payloadDisassocRequest[0] = CMD_FRAME_DISASSOCIATION_NOTIFICATION; m_payloadDisassocRequest[1] = DisassociateReason; txFrame->payload = m_payloadDisassocRequest; txFrame->payloadLen = 2; m_disAssociationOngoing = TRUE; if ((DeviceAddrMode == ADDR_MODE_SHORT_ADDRESS && DeviceAddress.shortAddress == call MLME_GET.macCoordShortAddress()) || (DeviceAddrMode == ADDR_MODE_EXTENDED_ADDRESS && DeviceAddress.extendedAddress == call MLME_GET.macCoordExtendedAddress())) { status = call DisassociationToCoord.transmit(txFrame); } else if (TxIndirect) { status = call DisassociationIndirectTx.transmit(txFrame); } else { status = call DisassociationDirectTx.transmit(txFrame); } if (status != IEEE154_SUCCESS) { m_disAssociationOngoing = FALSE; call TxFramePool.put(txFrame); call TxControlPool.put(txControl); } } dbg_serial("DisassociateP", "MLME_DISASSOCIATE.request -> result: %lu\n", (uint32_t) status); return status; } event void DisassociationToCoord.transmitDone(ieee154_txframe_t *data, ieee154_status_t status) { // transmitted a disassociation notification to our coordinator uint8_t *mhr = MHR(data), srcAddrOffset = 7; uint8_t DeviceAddrMode = (mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK) >> FC2_SRC_MODE_OFFSET; uint16_t DevicePANID = *((nxle_uint16_t*) (&(mhr[MHR_INDEX_ADDRESS]))); ieee154_address_t DeviceAddress; if ((mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == FC2_DEST_MODE_EXTENDED) srcAddrOffset += 6; call FrameUtility.convertToNative(&DeviceAddress.extendedAddress, &mhr[srcAddrOffset]); call TxControlPool.put((ieee154_txcontrol_t*) ((uint8_t*) data->header - offsetof(ieee154_txcontrol_t, header))); call TxFramePool.put(data); dbg_serial("DisassociateP", "transmitDone() -> result: %lu\n", (uint32_t) status); m_disAssociationOngoing = FALSE; // "[...] even if the acknowledgment is not received, // the device should consider itself disassociated." (Sect. 7.5.3.2) if (status == IEEE154_SUCCESS || status == IEEE154_NO_ACK) resetPanValuesInPib(); signal MLME_DISASSOCIATE.confirm(status, DeviceAddrMode, DevicePANID, DeviceAddress); } event void DisassociationIndirectTx.transmitDone(ieee154_txframe_t *data, ieee154_status_t status) { signal DisassociationDirectTx.transmitDone(data, status); } event void DisassociationDirectTx.transmitDone(ieee154_txframe_t *data, ieee154_status_t status) { // transmitted a disassociation notification to a device uint8_t *mhr = MHR(data), dstAddrOffset = 5; uint8_t DeviceAddrMode = (mhr[1] & FC2_DEST_MODE_MASK) >> FC2_DEST_MODE_OFFSET; uint16_t DevicePANID = *((nxle_uint16_t*) (&(mhr[MHR_INDEX_ADDRESS]))); ieee154_address_t DeviceAddress; call FrameUtility.convertToNative(&DeviceAddress.extendedAddress, &mhr[dstAddrOffset]); call TxControlPool.put((ieee154_txcontrol_t*) ((uint8_t*) data->header - offsetof(ieee154_txcontrol_t, header))); call TxFramePool.put(data); dbg_serial("DisassociateP", "transmitDone() -> result: %lu\n", (uint32_t) status); m_disAssociationOngoing = FALSE; // "[...] even if the acknowledgment is not received, // the device should consider itself disassociated." (Sect. 7.5.3.2) if (status == IEEE154_SUCCESS || status == IEEE154_NO_ACK) resetPanValuesInPib(); signal MLME_DISASSOCIATE.confirm(status, DeviceAddrMode, DevicePANID, DeviceAddress); } /* ------------------- MLME_DISASSOCIATE (receiving) ------------------- */ event message_t* DisassociationDirectRxFromCoord.received(message_t* frame) { // received a disassociation notification from the coordinator (direct tx) ieee154_address_t address; address.extendedAddress = call LocalExtendedAddress.get(); signal MLME_DISASSOCIATE.indication(address.extendedAddress, frame->data[1], NULL); return frame; } event message_t* DisassociationExtractedFromCoord.received(message_t* frame, ieee154_txframe_t *txFrame) { // received a disassociation notification from the coordinator (indirect transmission) return signal DisassociationDirectRxFromCoord.received(frame); } event message_t* DisassociationRxFromDevice.received(message_t* frame) { // received a disassociation notification from the device ieee154_address_t address; if (call Frame.getSrcAddrMode(frame) == ADDR_MODE_EXTENDED_ADDRESS && call Frame.getSrcAddr(frame, &address) == SUCCESS) signal MLME_DISASSOCIATE.indication(address.extendedAddress, frame->data[1], NULL); dbg_serial("DisassociateP", "Received disassociation request from %lx\n", (uint32_t) address.shortAddress); return frame; } void resetPanValuesInPib() { // "An associated device shall disassociate itself by removing // all references to the PAN; the MLME shall set macPANId, // macShortAddress, macAssociatedPANCoord, macCoordShortAddress // and macCoordExtended- Address to the default values." (Sect. 7.5.3.2) call MLME_SET.macPANId(IEEE154_DEFAULT_PANID); call MLME_SET.macShortAddress(IEEE154_DEFAULT_SHORTADDRESS); call MLME_SET.macAssociatedPANCoord(IEEE154_DEFAULT_ASSOCIATEDPANCOORD); call MLME_SET.macCoordShortAddress(IEEE154_DEFAULT_COORDSHORTADDRESS); call MLME_SET.macCoordExtendedAddress(0); } /* ------------------- Defaults ------------------- */ default event void MLME_DISASSOCIATE.indication ( uint64_t DeviceAddress, ieee154_disassociation_reason_t DisassociateReason, ieee154_security_t *security) {} default event void MLME_DISASSOCIATE.confirm ( ieee154_status_t status, uint8_t DeviceAddrMode, uint16_t DevicePANID, ieee154_address_t DeviceAddress) {} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/DispatchQueueP.nc000066400000000000000000000127771207233610700223460ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-12-14 12:50:06 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" generic module DispatchQueueP() { provides { interface Init as Reset; interface FrameTx[uint8_t client]; interface FrameRx as FrameExtracted[uint8_t client]; interface Purge; } uses { interface Queue; interface FrameTx as FrameTxCsma; interface FrameRx as SubFrameExtracted; } } implementation { task void txTask(); bool m_state; uint8_t m_client; enum { TX_DONE_PENDING = 0x01, RESET_PENDING = 0x02, }; bool isTxDonePending() { return (m_state & TX_DONE_PENDING) ? TRUE : FALSE; } void setTxDonePending() { m_state |= TX_DONE_PENDING; } void resetTxDonePending() { m_state &= ~TX_DONE_PENDING; } bool isResetPending() { return (m_state & RESET_PENDING) ? TRUE : FALSE; } void setResetPending() { m_state |= RESET_PENDING; } void resetResetPending() { m_state &= ~RESET_PENDING; } command error_t Reset.init() { setResetPending(); while (call Queue.size()) { ieee154_txframe_t *txFrame = call Queue.dequeue(); signal FrameTx.transmitDone[txFrame->client](txFrame, IEEE154_TRANSACTION_OVERFLOW); } resetResetPending(); return SUCCESS; } command ieee154_status_t FrameTx.transmit[uint8_t client](ieee154_txframe_t *txFrame) { txFrame->client = client; if (isResetPending() || call Queue.enqueue(txFrame) != SUCCESS) return IEEE154_TRANSACTION_OVERFLOW; else { post txTask(); return IEEE154_SUCCESS; } } task void txTask() { if (!isTxDonePending() && call Queue.size()) { ieee154_txframe_t *txFrame = call Queue.head(); if (txFrame->headerLen == 0) { // was purged call Queue.dequeue(); signal Purge.purgeDone(txFrame, IEEE154_SUCCESS); post txTask(); } m_client = txFrame->client; setTxDonePending(); if (call FrameTxCsma.transmit(txFrame) != IEEE154_SUCCESS) resetTxDonePending(); } } event void FrameTxCsma.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { resetTxDonePending(); if (!call Queue.size()) return; // all frames were spooled out (reset) call Queue.dequeue(); signal FrameTx.transmitDone[txFrame->client](txFrame, status); if (IEEE154_BEACON_ENABLED_PAN && status == IEEE154_NO_BEACON) { // this means that we lost sync -> spool out all queued frames while (call Queue.size()) { ieee154_txframe_t *frame = call Queue.dequeue(); signal FrameTx.transmitDone[frame->client](frame, IEEE154_NO_BEACON); } } post txTask(); } event message_t* SubFrameExtracted.received(message_t* frame) { // this event is signalled when a frame has been received // in response to a data request command frame. The transmitDone // event will be signalled later return signal FrameExtracted.received[m_client](frame); } default event void FrameTx.transmitDone[uint8_t client](ieee154_txframe_t *txFrame, ieee154_status_t status) {} command ieee154_status_t Purge.purge(uint8_t msduHandle) { uint8_t qSize = call Queue.size(), i; // must never purge the first element (element 0), because it was already handed down to // the dispatcher (we don't own it anymore), all others may be purged. for (i=1; iheader->mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK) == FC1_FRAMETYPE_DATA) && txFrame->handle == msduHandle) { txFrame->headerLen = 0; // mark as invalid return IEEE154_SUCCESS; } } return IEEE154_INVALID_HANDLE; } default event void Purge.purgeDone(ieee154_txframe_t *txFrame, ieee154_status_t status) {} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/DispatchSlottedCsmaP.nc000066400000000000000000000705341207233610700234770ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.8 $ * $Date: 2009-12-14 12:50:06 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_PHY.h" #include "TKN154_MAC.h" /** * This module is responsible for the transmission/reception of DATA and * COMMAND frames in the CAP of beacon-enabled PANs. Its main tasks are * initialization of the parameters of the slotted CSMA-CA algorithm (NB, BE, * etc.), initiating retransmissions and dealing with broadcast transmissions. * It does not implement the actual CSMA-CA algorithm, because due to its * timing requirements the CSMA-CA algorithm is not part of the MAC * implementation but of the chip-specific radio driver. * * This module does slightly different things depending on whether it is the * CAP for an outgoing superframe (sfDirection = OUTGOING_SUPERFRAME), i.e. the * CAP from the perspective of a coordinator after it has transmitted its own * beacon; or for an incoming superframe (sfDirection = INCOMING_SUPERFRAME), * i.e. the CAP from the perspective of a device after it has received a * beacon from its coordinator. For example, in the CAP a coordinator will * typically listen for incoming frames from the devices, and a device will * typically switch the radio off unless it has a frame to transmit. */ generic module DispatchSlottedCsmaP(uint8_t sfDirection) { provides { interface Init as Reset; interface FrameTx as FrameTx; interface FrameRx as FrameRx[uint8_t frameType]; interface FrameExtracted as FrameExtracted[uint8_t frameType]; interface FrameTxNow as BroadcastTx; interface Notify as WasRxEnabled; } uses { interface Alarm as CapEndAlarm; interface Alarm as BLEAlarm; interface Alarm as RxWaitAlarm; interface TransferableResource as RadioToken; interface ResourceRequested as RadioTokenRequested; interface SuperframeStructure; interface GetNow as IsRadioTokenRequested; interface GetNow as IsRxEnableActive; interface Get as GetIndirectTxFrame; interface Notify as RxEnableStateChange; interface GetNow as IsTrackingBeacons; interface Notify as PIBUpdateMacRxOnWhenIdle; interface FrameUtility; interface SlottedCsmaCa; interface RadioRx; interface RadioOff; interface MLME_GET; interface MLME_SET; interface TimeCalc; interface Leds; interface SetNow as FrameBackup; interface GetNow as FrameRestore; interface SplitControl as TrackSingleBeacon; interface MLME_SYNC_LOSS; } } implementation { typedef enum { SWITCH_OFF, WAIT_FOR_RXDONE, WAIT_FOR_TXDONE, DO_NOTHING, } next_state_t; typedef enum { INDIRECT_TX_ALARM, BROADCAST_ALARM, NO_ALARM, } rx_alarm_t; enum { COORD_ROLE = (sfDirection == OUTGOING_SUPERFRAME), DEVICE_ROLE = !COORD_ROLE, RADIO_CLIENT_CFP = COORD_ROLE ? RADIO_CLIENT_COORDCFP : RADIO_CLIENT_DEVICECFP, }; /* state / frame management */ norace bool m_lock; norace bool m_resume; norace ieee154_txframe_t *m_currentFrame; norace ieee154_txframe_t *m_bcastFrame; norace ieee154_txframe_t *m_lastFrame; norace uint16_t m_remainingBackoff; ieee154_macRxOnWhenIdle_t macRxOnWhenIdle; /* variables for the slotted CSMA-CA */ norace ieee154_csma_t m_csma; norace ieee154_macMaxBE_t m_BE; norace ieee154_macMaxCSMABackoffs_t m_macMaxCSMABackoffs; norace ieee154_macMaxBE_t m_macMaxBE; norace ieee154_macMaxFrameRetries_t m_macMaxFrameRetries; norace ieee154_status_t m_txStatus; norace uint32_t m_transactionTime; norace bool m_indirectTxPending = FALSE; norace bool m_broadcastRxPending; norace ieee154_macMaxFrameTotalWaitTime_t m_macMaxFrameTotalWaitTime; /* function / task prototypes */ void stopAllAlarms(); next_state_t tryReceive(); next_state_t tryTransmit(); next_state_t trySwitchOff(); void backupCurrentFrame(); void restoreFrameFromBackup(); void updateState(); void setCurrentFrame(ieee154_txframe_t *frame); void signalTxBroadcastDone(ieee154_txframe_t *frame, ieee154_status_t error); task void signalTxDoneTask(); task void setupTxBroadcastTask(); task void wasRxEnabledTask(); #ifdef TKN154_DEBUG enum { HEADER_STR_LEN = 27, DBG_STR_SIZE = 250, }; norace uint16_t m_dbgNumEntries; norace char m_dbgStr[HEADER_STR_LEN + DBG_STR_SIZE] = "updateState() transitions: "; void dbg_push_state(uint8_t state) { if (m_dbgNumEntries < DBG_STR_SIZE-3) m_dbgStr[HEADER_STR_LEN + m_dbgNumEntries++] = '0' + state; } void dbg_flush_state() { m_dbgStr[HEADER_STR_LEN + m_dbgNumEntries++] = '\n'; m_dbgStr[HEADER_STR_LEN + m_dbgNumEntries++] = 0; dbg_serial("DispatchSlottedCsmaP",m_dbgStr); m_dbgNumEntries = 0; } #else #define dbg_push_state(X) #define dbg_flush_state() #endif error_t reset(error_t error) { if (call RadioToken.isOwner()) // internal error! this must not happen! return FAIL; if (m_currentFrame) signal FrameTx.transmitDone(m_currentFrame, error); if (m_lastFrame) signal FrameTx.transmitDone(m_lastFrame, error); if (m_bcastFrame) signalTxBroadcastDone(m_bcastFrame, error); m_currentFrame = m_lastFrame = m_bcastFrame = NULL; m_macMaxFrameTotalWaitTime = call MLME_GET.macMaxFrameTotalWaitTime(); stopAllAlarms(); return SUCCESS; } command error_t Reset.init() { return reset(IEEE154_TRANSACTION_OVERFLOW); } event void MLME_SYNC_LOSS.indication ( ieee154_status_t lossReason, uint16_t PANId, uint8_t LogicalChannel, uint8_t ChannelPage, ieee154_security_t *security ) { // we lost sync to the coordinator -> spool out current packet reset(IEEE154_NO_BEACON); } async event void RadioToken.transferredFrom(uint8_t fromClient) { // we got the token, i.e. CAP has just started uint32_t capDuration = (uint32_t) call SuperframeStructure.numCapSlots() * (uint32_t) call SuperframeStructure.sfSlotDuration(); uint16_t guardTime = call SuperframeStructure.guardTime(); dbg_serial("DispatchSlottedCsmaP", "Got token, remaining CAP time: %lu\n", call SuperframeStructure.sfStartTime() + capDuration - guardTime - call CapEndAlarm.getNow()); if (capDuration < guardTime) { // CAP is too short to do anything useful dbg_serial("DispatchSlottedCsmaP", "CAP too short!\n"); call RadioToken.transferTo(RADIO_CLIENT_CFP); return; } else { capDuration -= guardTime; if (DEVICE_ROLE) m_broadcastRxPending = call SuperframeStructure.isBroadcastPending(); else { // COORD_ROLE if (m_bcastFrame != NULL) { // we have to transmit a broadcast frame immediately; this // may require to a backup of the previously active frame // and a reinitializing the CSMA parameters -> will do it // in task context and then continue m_lock = TRUE; post setupTxBroadcastTask(); dbg_serial("DispatchSlottedCsmaP", "Preparing broadcast...\n"); } } call CapEndAlarm.startAt(call SuperframeStructure.sfStartTime(), capDuration); if (call SuperframeStructure.battLifeExtDuration() > 0) { dbg_serial("DispatchSlottedCsmaP", "battLifeExtDuration enabled!\n"); call BLEAlarm.startAt(call SuperframeStructure.sfStartTime(), call SuperframeStructure.battLifeExtDuration()); } } updateState(); } command ieee154_status_t FrameTx.transmit(ieee154_txframe_t *frame) { if (m_currentFrame != NULL) { // we've not finished transmitting the current frame yet dbg_serial("DispatchSlottedCsmaP", "Overflow\n"); return IEEE154_TRANSACTION_OVERFLOW; } else { setCurrentFrame(frame); /* dbg_serial("DispatchSlottedCsmaP", "New frame to transmit, DSN: %lu\n", (uint32_t) MHR(frame)[MHR_INDEX_SEQNO]);*/ // a beacon must be found before transmitting in a beacon-enabled PAN if (DEVICE_ROLE && !call IsTrackingBeacons.getNow()) { call TrackSingleBeacon.start(); dbg_serial("DispatchSlottedCsmaP", "Tracking single beacon now\n"); // we'll get the Token after a beacon was found or a SYNC_LOSS event // if none was found during the next aBaseSuperframeDuration*(2n+1) symbols } updateState(); return IEEE154_SUCCESS; } } event void TrackSingleBeacon.startDone(error_t error) { if (error != SUCCESS) // beacon could not be tracked reset(IEEE154_NO_BEACON); // else: we'll get the RadioToken and continue as usual ... } task void setupTxBroadcastTask() { ieee154_macDSN_t tmp; ieee154_txframe_t *oldFrame = m_currentFrame; if (COORD_ROLE) { if (m_bcastFrame != NULL) { // broadcasts should be transmitted *immediately* after the beacon, // which may interrupt a pending transmit operation from the previous // CAP; back up the last active frame configuration (may be none) // and restore it after the broadcast frame has been transmitted; // do this through interfaces and don't wire them for DEVICE_ROLE, // so we don't waste the RAM of devices backupCurrentFrame(); setCurrentFrame(m_bcastFrame); if (oldFrame) { // now the sequence number are out of order... swap them back tmp = m_bcastFrame->header->mhr[MHR_INDEX_SEQNO]; m_bcastFrame->header->mhr[MHR_INDEX_SEQNO] = oldFrame->header->mhr[MHR_INDEX_SEQNO]; oldFrame->header->mhr[MHR_INDEX_SEQNO] = tmp; } } } m_lock = FALSE; updateState(); } void setCurrentFrame(ieee154_txframe_t *frame) { ieee154_macDSN_t dsn = call MLME_GET.macDSN(); frame->header->mhr[MHR_INDEX_SEQNO] = dsn++; call MLME_SET.macDSN(dsn); m_csma.NB = 0; m_csma.macMaxCsmaBackoffs = m_macMaxCSMABackoffs = call MLME_GET.macMaxCSMABackoffs(); m_csma.macMaxBE = m_macMaxBE = call MLME_GET.macMaxBE(); m_csma.BE = call MLME_GET.macMinBE(); if (call MLME_GET.macBattLifeExt() && m_csma.BE > 2) m_csma.BE = 2; m_BE = m_csma.BE; if (COORD_ROLE && call GetIndirectTxFrame.get() == frame) m_macMaxFrameRetries = 0; // this is an indirect transmissions (never retransmit) else m_macMaxFrameRetries = call MLME_GET.macMaxFrameRetries(); m_transactionTime = IEEE154_SHR_DURATION + (frame->headerLen + frame->payloadLen + 2) * IEEE154_SYMBOLS_PER_OCTET; // extra 2 for CRC if (frame->header->mhr[MHR_INDEX_FC1] & FC1_ACK_REQUEST) m_transactionTime += (IEEE154_aTurnaroundTime + IEEE154_aUnitBackoffPeriod + 11 * IEEE154_SYMBOLS_PER_OCTET); // 11 byte for the ACK PPDU // if (frame->headerLen + frame->payloadLen > IEEE154_aMaxSIFSFrameSize) // m_transactionTime += call MLME_GET.macMinLIFSPeriod(); // else // m_transactionTime += call MLME_GET.macMinSIFSPeriod(); m_macMaxFrameTotalWaitTime = call MLME_GET.macMaxFrameTotalWaitTime(); m_currentFrame = frame; } void stopAllAlarms() { call CapEndAlarm.stop(); if (DEVICE_ROLE) call RxWaitAlarm.stop(); call BLEAlarm.stop(); } /** * The updateState() function is called whenever something happened that * might require a state transition; it implements a lock mechanism (m_lock) * to prevent race conditions. Whenever the lock is set a "done"-event (from * the SlottedCsmaCa/RadioRx/RadioOff interface) is pending and will "soon" * unset the lock (and then updateState() will called again). The * updateState() function decides about the next state by checking a list of * possible current states ordered by priority, e.g. it first always checks * whether the CAP is still active. Calling this function more than necessary * can do no harm. */ void updateState() { uint32_t capDuration; next_state_t next; atomic { // long atomics are bad... but in this block, once the/ current state has // been determined only one branch will/ be taken (there are no loops) if (m_lock || !call RadioToken.isOwner()) return; m_lock = TRUE; // lock capDuration = (uint32_t) call SuperframeStructure.numCapSlots() * (uint32_t) call SuperframeStructure.sfSlotDuration(); // Check 1: has the CAP finished? if ((call TimeCalc.hasExpired(call SuperframeStructure.sfStartTime(), capDuration - call SuperframeStructure.guardTime()) || !call CapEndAlarm.isRunning())) { dbg_push_state(1); if (call RadioOff.isOff()) { stopAllAlarms(); // may still fire, but is locked through isOwner() if (DEVICE_ROLE && m_indirectTxPending) signal RxWaitAlarm.fired(); m_broadcastRxPending = FALSE; if (COORD_ROLE && m_bcastFrame) { // didn't manage to transmit a broadcast restoreFrameFromBackup(); signalTxBroadcastDone(m_bcastFrame, IEEE154_CHANNEL_ACCESS_FAILURE); m_bcastFrame = NULL; } m_lock = FALSE; // unlock dbg_flush_state(); dbg_serial("DispatchSlottedCsmaP", "Handing over to CFP.\n"); call RadioToken.transferTo(RADIO_CLIENT_CFP); return; } else next = SWITCH_OFF; } // Check 2: should a broadcast frame be received/transmitted // immediately at the start of CAP? else if (DEVICE_ROLE && m_broadcastRxPending) { // receive a broadcast from coordinator dbg_push_state(2); next = tryReceive(); } else if (COORD_ROLE && m_bcastFrame) { dbg_push_state(2); next = tryTransmit(); } // Check 3: was an indirect transmission successfully started // and are we now waiting for a frame from the coordinator? else if (DEVICE_ROLE && m_indirectTxPending) { dbg_push_state(3); next = tryReceive(); } // Check 4: is some other operation (like MLME-SCAN or MLME-RESET) pending? else if (call IsRadioTokenRequested.getNow()) { dbg_push_state(4); if (call RadioOff.isOff()) { stopAllAlarms(); // may still fire, but is locked through isOwner() // nothing more to do... just release the Token m_lock = FALSE; // unlock dbg_serial("DispatchSlottedCsmaP", "Token requested: Handing over to CFP.\n"); call RadioToken.release(); return; } else next = SWITCH_OFF; } // Check 5: is battery life extension (BLE) active and // has the BLE period expired? else if (call SuperframeStructure.battLifeExtDuration() > 0 && call TimeCalc.hasExpired(call SuperframeStructure.sfStartTime(), call SuperframeStructure.battLifeExtDuration()) && !call IsRxEnableActive.getNow() && !macRxOnWhenIdle) { dbg_push_state(5); next = trySwitchOff(); } // Check 6: is there a frame ready to transmit? else if (m_currentFrame != NULL) { dbg_push_state(6); next = tryTransmit(); } // Check 7: should we be in receive mode? else if (COORD_ROLE || call IsRxEnableActive.getNow() || macRxOnWhenIdle) { dbg_push_state(7); next = tryReceive(); if (next == DO_NOTHING) { // if there was an active MLME_RX_ENABLE.request then we'll // inform the next higher layer that radio is now in Rx mode post wasRxEnabledTask(); } } // Check 8: just make sure the radio is switched off else { dbg_push_state(8); next = trySwitchOff(); } // if there is nothing to do, then we must clear the lock if (next == DO_NOTHING) m_lock = FALSE; } // atomic // put next state in operation (possibly keeping the lock) switch (next) { case SWITCH_OFF: ASSERT(call RadioOff.off() == SUCCESS); break; case WAIT_FOR_RXDONE: break; case WAIT_FOR_TXDONE: break; case DO_NOTHING: break; } } next_state_t tryTransmit() { // tries to transmit m_currentFrame uint32_t capDuration = (uint32_t) call SuperframeStructure.numCapSlots() * (uint32_t) call SuperframeStructure.sfSlotDuration(); next_state_t next; if (!call RadioOff.isOff()) next = SWITCH_OFF; else { uint32_t dtMax = capDuration - call SuperframeStructure.guardTime() - m_transactionTime; // round to backoff boundary dtMax = dtMax + (IEEE154_aUnitBackoffPeriod - (dtMax % IEEE154_aUnitBackoffPeriod)); if (dtMax > capDuration) dtMax = 0; if (call SuperframeStructure.battLifeExtDuration() > 0) { // battery life extension uint16_t bleLen = call SuperframeStructure.battLifeExtDuration(); if (bleLen < dtMax) dtMax = bleLen; } if (call TimeCalc.hasExpired(call SuperframeStructure.sfStartTime(), dtMax)) next = DO_NOTHING; // frame doesn't fit in the remaining CAP else { error_t res; res = call SlottedCsmaCa.transmit(m_currentFrame, &m_csma, call SuperframeStructure.sfStartTime(), dtMax, m_resume, m_remainingBackoff); /* dbg_serial("DispatchSlottedCsmaP", "SlottedCsmaCa.transmit() -> %lu\n", (uint32_t) res);*/ next = WAIT_FOR_TXDONE; // this will NOT clear the lock } } return next; } next_state_t tryReceive() { next_state_t next; if (call RadioRx.isReceiving()) next = DO_NOTHING; else if (!call RadioOff.isOff()) next = SWITCH_OFF; else { call RadioRx.enableRx(0, 0); next = WAIT_FOR_RXDONE; } return next; } next_state_t trySwitchOff() { next_state_t next; if (call RadioOff.isOff()) next = DO_NOTHING; else next = SWITCH_OFF; return next; } async event void RadioOff.offDone() { m_lock = FALSE; updateState(); } async event void RadioRx.enableRxDone() { if (DEVICE_ROLE && (m_indirectTxPending || m_broadcastRxPending)) call RxWaitAlarm.start(m_macMaxFrameTotalWaitTime); m_lock = FALSE; updateState(); } async event void CapEndAlarm.fired() { dbg_serial("DispatchSlottedCsmaP", "CapEndAlarm.fired()\n"); updateState(); } async event void BLEAlarm.fired() { updateState();} event void RxEnableStateChange.notify(bool whatever) { updateState();} event void PIBUpdateMacRxOnWhenIdle.notify( const void* val ) { atomic macRxOnWhenIdle = *((ieee154_macRxOnWhenIdle_t*) val); updateState(); } async event void RxWaitAlarm.fired() { if (DEVICE_ROLE && (m_indirectTxPending || m_broadcastRxPending)) atomic { if (m_indirectTxPending) { m_indirectTxPending = FALSE; post signalTxDoneTask(); } else if (m_broadcastRxPending) { m_broadcastRxPending = FALSE; updateState(); } } } async event void SlottedCsmaCa.transmitDone(ieee154_txframe_t *frame, ieee154_csma_t *csma, bool ackPendingFlag, uint16_t remainingBackoff, error_t result) { bool done = TRUE; /* dbg_serial("DispatchSlottedCsmaP", "SlottedCsmaCa.transmitDone() -> %lu\n", (uint32_t) result);*/ m_resume = FALSE; switch (result) { case SUCCESS: // frame was successfully transmitted, if ACK was requested // then a matching ACK was successfully received as well m_txStatus = IEEE154_SUCCESS; if (DEVICE_ROLE && frame->payload[0] == CMD_FRAME_DATA_REQUEST && ((frame->header->mhr[MHR_INDEX_FC1]) & FC1_FRAMETYPE_MASK) == FC1_FRAMETYPE_CMD) { // this was a data request frame m_txStatus = IEEE154_NO_DATA; // pessimistic if (ackPendingFlag) { // the coordinator has data for us; switch to Rx // to complete the indirect transmission m_indirectTxPending = TRUE; m_lastFrame = m_currentFrame; m_currentFrame = NULL; ASSERT(call RadioRx.enableRx(0, 0) == SUCCESS); return; } } break; case FAIL: // The CSMA-CA algorithm failed: the frame was not transmitted, // because channel was never idle m_txStatus = IEEE154_CHANNEL_ACCESS_FAILURE; break; case ENOACK: // frame was transmitted, but we didn't receive an ACK (although // we requested an one). note: coordinator never retransmits an // indirect transmission (see above) if (m_macMaxFrameRetries > 0) { // retransmit: reinitialize CSMA-CA parameters done = FALSE; m_csma.NB = 0; m_csma.macMaxCsmaBackoffs = m_macMaxCSMABackoffs; m_csma.macMaxBE = m_macMaxBE; m_csma.BE = m_BE; m_macMaxFrameRetries -= 1; } else m_txStatus = IEEE154_NO_ACK; break; case EINVAL: // DEBUG!!! dbg_serial("DispatchSlottedCsmaP", "EINVAL returned by transmitDone()!\n"); // fall through case ERETRY: // frame was not transmitted, because the transaction does not // fit in the remaining CAP (in beacon-enabled PANs only) dbg_serial("DispatchSlottedCsmaP", "Transaction didn't fit, current BE: %lu\n", (uint32_t) csma->BE); m_resume = TRUE; m_remainingBackoff = remainingBackoff; done = FALSE; m_lock = FALSE; // debug! problem: if CAP endalarm has fired it's a deadlock! if (!call CapEndAlarm.isRunning()) updateState(); return; break; default: ASSERT(0); break; } if (COORD_ROLE && frame == m_bcastFrame) { // always signal result of broadcast transmissions immediately restoreFrameFromBackup(); signalTxBroadcastDone(m_bcastFrame, (!done) ? IEEE154_CHANNEL_ACCESS_FAILURE : m_txStatus); m_bcastFrame = NULL; } else if (done) { m_lastFrame = m_currentFrame; m_currentFrame = NULL; post signalTxDoneTask(); } m_lock = FALSE; updateState(); } task void signalTxDoneTask() { ieee154_txframe_t *lastFrame = m_lastFrame; ieee154_status_t status = m_txStatus; m_indirectTxPending = FALSE; m_lastFrame = NULL; // only now can the next transmission can begin if (lastFrame) { /* dbg_serial("DispatchSlottedCsmaP", "Transmit done, DSN: %lu, result: 0x%lx\n", */ /* (uint32_t) MHR(lastFrame)[MHR_INDEX_SEQNO], (uint32_t) status);*/ signal FrameTx.transmitDone(lastFrame, status); } updateState(); } event message_t* RadioRx.received(message_t* frame) { // received a frame -> find out frame type and // signal it to responsible client component uint8_t *payload = (uint8_t *) frame->data; uint8_t *mhr = MHR(frame); uint8_t frameType = mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK; if (frameType == FC1_FRAMETYPE_CMD) frameType += payload[0]; dbg_serial("DispatchSlottedCsmaP", "Received frame, DSN: %lu, type: 0x%lu\n", (uint32_t) mhr[MHR_INDEX_SEQNO], (uint32_t) frameType); atomic { if (DEVICE_ROLE && (m_indirectTxPending || m_broadcastRxPending)) { message_t* frameBuf; call RxWaitAlarm.stop(); // TODO: check the following: // is this frame from our coordinator? hmm... we cannot say/ with // certainty, because we might only know either the coordinator // extended or short address (and the frame could/ have been sent // with the other addressing mode) ?? m_txStatus = IEEE154_SUCCESS; if (m_indirectTxPending) frameBuf = signal FrameExtracted.received[frameType](frame, m_lastFrame); // indirect tx from coord else frameBuf = signal FrameRx.received[frameType](frame); // broadcast from coordinator signal RxWaitAlarm.fired(); return frameBuf; } else return signal FrameRx.received[frameType](frame); } } void backupCurrentFrame() { ieee154_cap_frame_backup_t backup = {m_transactionTime, m_currentFrame, m_csma}; call FrameBackup.setNow(&backup); } void restoreFrameFromBackup() { ieee154_cap_frame_backup_t *backup = call FrameRestore.getNow(); if (backup != NULL) { m_currentFrame = backup->frame; memcpy(&m_csma, &backup->csma, sizeof(ieee154_csma_t)); m_transactionTime = backup->transactionTime; } } async command ieee154_status_t BroadcastTx.transmitNow(ieee154_txframe_t *frame) { // if this command is called then it is (MUST be) called only just before // the token is transferred to this component and it is then called // only once per CAP (max. one broadcast is allowed after a beacon // transmission) atomic { if (!call RadioToken.isOwner() && m_bcastFrame == NULL) { m_bcastFrame = frame; return IEEE154_SUCCESS; } else { ASSERT(0); return IEEE154_TRANSACTION_OVERFLOW; } } } void signalTxBroadcastDone(ieee154_txframe_t *frame, ieee154_status_t error) { signal BroadcastTx.transmitNowDone(frame, error); } task void wasRxEnabledTask() { signal WasRxEnabled.notify(TRUE); } event void RadioToken.granted() { ASSERT(0); // should never happen } default event void FrameTx.transmitDone(ieee154_txframe_t *data, ieee154_status_t status) {} default event message_t* FrameRx.received[uint8_t client](message_t* data) {return data;} default async command bool IsRxEnableActive.getNow() {return FALSE;} default async command void RxWaitAlarm.start(uint32_t dt) {ASSERT(0);} default async command void RxWaitAlarm.stop() {ASSERT(0);} default async command void RxWaitAlarm.startAt(uint32_t t0, uint32_t dt) {ASSERT(0);} default async command bool SuperframeStructure.isBroadcastPending() { return FALSE;} default async event void BroadcastTx.transmitNowDone(ieee154_txframe_t *frame, ieee154_status_t status) {} default event message_t* FrameExtracted.received[uint8_t client](message_t* msg, ieee154_txframe_t *txFrame) {return msg;} default async command error_t FrameBackup.setNow(ieee154_cap_frame_backup_t* val) {return FAIL;} default async command ieee154_cap_frame_backup_t* FrameRestore.getNow() {return NULL;} event void TrackSingleBeacon.stopDone(error_t error){} default command error_t TrackSingleBeacon.start() {if (DEVICE_ROLE) ASSERT(0); return SUCCESS;} command error_t WasRxEnabled.enable() {return FAIL;} command error_t WasRxEnabled.disable() {return FAIL;} async event void RadioTokenRequested.requested(){ updateState(); } async event void RadioTokenRequested.immediateRequested(){ updateState(); } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/DispatchUnslottedCsmaP.nc000066400000000000000000000445011207233610700240350ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.10 $ * $Date: 2009-05-18 12:54:10 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_PHY.h" #include "TKN154_MAC.h" /** * This module is responsible for the transmission/reception of DATA and * COMMAND frames in a nonbeacon-enabled PAN. Its main tasks are initialization * of the parameters of the unslotted CSMA-CA algorithm (NB, BE, etc.), * initiating retransmissions and managing requests for enabling the receiver * for a finite period of time. It does not implement the actual CSMA-CA * algorithm, because due to its timing requirements the CSMA-CA algorithm is * not part of the MAC implementation but of the chip-specific radio driver. */ module DispatchUnslottedCsmaP { provides { interface Init as Reset; interface MLME_START; interface FrameTx as FrameTx; interface FrameRx as FrameRx[uint8_t frameType]; interface FrameExtracted as FrameExtracted[uint8_t frameType]; interface Notify as WasRxEnabled; } uses { interface Timer as IndirectTxWaitTimer; interface TransferableResource as RadioToken; interface ResourceRequested as RadioTokenRequested; interface GetNow as IsRadioTokenRequested; interface GetNow as IsRxEnableActive; interface Set as SetMacSuperframeOrder; interface Set as SetMacPanCoordinator; interface Get as GetIndirectTxFrame; interface Notify as RxEnableStateChange; interface Notify as PIBUpdateMacRxOnWhenIdle; interface FrameUtility; interface UnslottedCsmaCa; interface RadioRx; interface RadioOff; interface MLME_GET; interface MLME_SET; interface TimeCalc; interface Leds; } } implementation { typedef enum { SWITCH_OFF, WAIT_FOR_RXDONE, WAIT_FOR_TXDONE, DO_NOTHING, } next_state_t; typedef enum { INDIRECT_TX_ALARM, NO_ALARM, } rx_alarm_t; /* state / frame management */ norace bool m_lock; norace bool m_resume; norace ieee154_txframe_t *m_currentFrame; norace ieee154_txframe_t *m_lastFrame; norace ieee154_macRxOnWhenIdle_t m_macRxOnWhenIdle; /* variables for the unslotted CSMA-CA */ norace ieee154_csma_t m_csma; norace ieee154_macMaxBE_t m_BE; norace ieee154_macMaxCSMABackoffs_t m_macMaxCSMABackoffs; norace ieee154_macMaxBE_t m_macMaxBE; norace ieee154_macMaxFrameRetries_t m_macMaxFrameRetries; norace ieee154_status_t m_txStatus; norace uint32_t m_transactionTime; norace bool m_indirectTxPending = FALSE; /* function / task prototypes */ next_state_t tryReceive(); next_state_t tryTransmit(); next_state_t trySwitchOff(); void backupCurrentFrame(); void restoreFrameFromBackup(); void updateState(); void setCurrentFrame(ieee154_txframe_t *frame); void signalTxBroadcastDone(ieee154_txframe_t *frame, ieee154_status_t error); task void signalTxDoneTask(); task void wasRxEnabledTask(); task void startIndirectTxTimerTask(); task void signalStartConfirmTask(); command error_t Reset.init() { if (m_currentFrame) signal FrameTx.transmitDone(m_currentFrame, IEEE154_TRANSACTION_OVERFLOW); if (m_lastFrame) signal FrameTx.transmitDone(m_lastFrame, IEEE154_TRANSACTION_OVERFLOW); m_currentFrame = m_lastFrame = NULL; call IndirectTxWaitTimer.stop(); return SUCCESS; } command ieee154_status_t MLME_START.request ( uint16_t panID, uint8_t logicalChannel, uint8_t channelPage, uint32_t startTime, uint8_t beaconOrder, uint8_t superframeOrder, bool panCoordinator, bool batteryLifeExtension, bool coordRealignment, ieee154_security_t *coordRealignSecurity, ieee154_security_t *beaconSecurity) { ieee154_status_t status; ieee154_macShortAddress_t shortAddress = call MLME_GET.macShortAddress(); // check parameters if ((coordRealignSecurity && coordRealignSecurity->SecurityLevel) || (beaconSecurity && beaconSecurity->SecurityLevel)) status = IEEE154_UNSUPPORTED_SECURITY; else if (shortAddress == 0xFFFF) status = IEEE154_NO_SHORT_ADDRESS; else if (logicalChannel > 26 || (channelPage != IEEE154_SUPPORTED_CHANNELPAGE) || !(IEEE154_SUPPORTED_CHANNELS & ((uint32_t) 1 << logicalChannel))) status = IEEE154_INVALID_PARAMETER; else if (beaconOrder != 15) status = IEEE154_INVALID_PARAMETER; else { call MLME_SET.macPANId(panID); call MLME_SET.phyCurrentChannel(logicalChannel); call MLME_SET.macBeaconOrder(beaconOrder); call SetMacPanCoordinator.set(panCoordinator); //TODO: check realignment post signalStartConfirmTask(); status = IEEE154_SUCCESS; } dbg_serial("DispatchUnslottedCsmaP", "MLME_START.request -> result: %lu\n", (uint32_t) status); dbg_serial_flush(); return status; } task void signalStartConfirmTask() { signal MLME_START.confirm(IEEE154_SUCCESS); } command ieee154_status_t FrameTx.transmit(ieee154_txframe_t *frame) { if (m_currentFrame != NULL) { // we've not finished transmitting the current frame yet dbg_serial("DispatchUnslottedCsmaP", "Overflow\n"); return IEEE154_TRANSACTION_OVERFLOW; } else { setCurrentFrame(frame); if (call RadioToken.isOwner()) updateState(); else call RadioToken.request(); return IEEE154_SUCCESS; } } event void RadioToken.granted() { updateState(); } void setCurrentFrame(ieee154_txframe_t *frame) { if (frame->header->mhr[MHR_INDEX_FC1] != FC1_FRAMETYPE_BEACON) { // set the sequence number for command/data frame ieee154_macDSN_t dsn = call MLME_GET.macDSN(); frame->header->mhr[MHR_INDEX_SEQNO] = dsn++; call MLME_SET.macDSN(dsn); } else { // set the sequence number for beacon frame ieee154_macBSN_t bsn = call MLME_GET.macBSN(); frame->header->mhr[MHR_INDEX_SEQNO] = bsn++; call MLME_SET.macBSN(bsn); } m_csma.NB = 0; m_csma.macMaxCsmaBackoffs = m_macMaxCSMABackoffs = call MLME_GET.macMaxCSMABackoffs(); m_csma.macMaxBE = m_macMaxBE = call MLME_GET.macMaxBE(); m_csma.BE = call MLME_GET.macMinBE(); if (call MLME_GET.macBattLifeExt() && m_csma.BE > 2) m_csma.BE = 2; m_BE = m_csma.BE; if (call GetIndirectTxFrame.get() == frame) m_macMaxFrameRetries = 0; // this is an indirect transmissions (never retransmit) else m_macMaxFrameRetries = call MLME_GET.macMaxFrameRetries(); m_transactionTime = IEEE154_SHR_DURATION + (frame->headerLen + frame->payloadLen + 2) * IEEE154_SYMBOLS_PER_OCTET; // extra 2 for CRC if (frame->header->mhr[MHR_INDEX_FC1] & FC1_ACK_REQUEST) m_transactionTime += (IEEE154_aTurnaroundTime + IEEE154_aUnitBackoffPeriod + 11 * IEEE154_SYMBOLS_PER_OCTET); // 11 byte for the ACK PPDU // if (frame->headerLen + frame->payloadLen > IEEE154_aMaxSIFSFrameSize) // m_transactionTime += call MLME_GET.macMinLIFSPeriod(); // else // m_transactionTime += call MLME_GET.macMinSIFSPeriod(); m_currentFrame = frame; } /** * The updateState() function is called whenever some event happened that * might require a state transition; it implements a lock mechanism (m_lock) * to prevent race conditions. Whenever the lock is set a "done"-event (from * a RadioTx/RadioRx/RadioOff interface) is pending and will "soon" unset the * lock (and then updateState() will called again). The updateState() * function decides about the next state by checking a list of possible * current states ordered by priority. Calling this function more than * necessary can do no harm. */ void updateState() { next_state_t next; atomic { // long atomics are bad... but in this block, once the // current state has been determined only one branch will // be taken (there are no loops) if (m_lock || !call RadioToken.isOwner()) return; m_lock = TRUE; // lock // Check 1: was an indirect transmission successfully started // and are we now waiting for a frame from the coordinator? if (m_indirectTxPending) { next = tryReceive(); } // Check 2: is some other operation (like MLME-SCAN or MLME-RESET) pending? else if (call IsRadioTokenRequested.getNow()) { if (call RadioOff.isOff()) { // nothing more to do... just release the Token dbg_serial("DispatchUnslottedCsmaP", "Token requested: releasing it.\n"); call RadioToken.request(); // we want it back afterwards ... m_lock = FALSE; // unlock call RadioToken.release(); return; } else next = SWITCH_OFF; } // Check 3: is there a frame ready to transmit? else if (m_currentFrame != NULL) { next = tryTransmit(); } // Check 4: should we be in receive mode? else if (call IsRxEnableActive.getNow() || m_macRxOnWhenIdle) { next = tryReceive(); if (next == DO_NOTHING) { // if there was an active MLME_RX_ENABLE.request then we'll // inform the next higher layer that radio is now in Rx mode post wasRxEnabledTask(); } } // Check 5: just make sure the radio is switched off else { next = trySwitchOff(); if (next == DO_NOTHING) { // nothing more to do... just release the Token m_lock = FALSE; // unlock dbg_serial("DispatchUnslottedCsmaP", "Releasing token\n"); call RadioToken.release(); return; } } // if there is nothing to do, then we must clear the lock if (next == DO_NOTHING) m_lock = FALSE; } // atomic // put next state in operation (possibly keeping the lock) switch (next) { case SWITCH_OFF: ASSERT(call RadioOff.off() == SUCCESS); break; case WAIT_FOR_RXDONE: break; case WAIT_FOR_TXDONE: break; case DO_NOTHING: break; } } next_state_t tryTransmit() { // tries to transmit m_currentFrame next_state_t next; if (!call RadioOff.isOff()) next = SWITCH_OFF; else { error_t res; res = call UnslottedCsmaCa.transmit(m_currentFrame, &m_csma); dbg_serial("DispatchUnslottedCsmaP", "UnslottedCsmaCa.transmit() -> %lu\n", (uint32_t) res); next = WAIT_FOR_TXDONE; // this will NOT clear the lock } return next; } next_state_t tryReceive() { next_state_t next; if (call RadioRx.isReceiving()) next = DO_NOTHING; else if (!call RadioOff.isOff()) next = SWITCH_OFF; else { call RadioRx.enableRx(0, 0); next = WAIT_FOR_RXDONE; } return next; } next_state_t trySwitchOff() { next_state_t next; if (call RadioOff.isOff()) next = DO_NOTHING; else next = SWITCH_OFF; return next; } async event void RadioOff.offDone() { m_lock = FALSE; updateState(); } async event void RadioRx.enableRxDone() { if (m_indirectTxPending) // indirect transmission, now waiting for data post startIndirectTxTimerTask(); m_lock = FALSE; updateState(); } event void RxEnableStateChange.notify(bool whatever) { if (!call RadioToken.isOwner()) call RadioToken.request(); else updateState(); } event void PIBUpdateMacRxOnWhenIdle.notify( const void* val ) { atomic m_macRxOnWhenIdle = *((ieee154_macRxOnWhenIdle_t*) val); signal RxEnableStateChange.notify(TRUE); } event void IndirectTxWaitTimer.fired() { atomic { if (m_indirectTxPending) { m_indirectTxPending = FALSE; post signalTxDoneTask(); } } } task void startIndirectTxTimerTask() { call IndirectTxWaitTimer.startOneShot(call MLME_GET.macMaxFrameTotalWaitTime()); } async event void UnslottedCsmaCa.transmitDone(ieee154_txframe_t *frame, ieee154_csma_t *csma, bool ackPendingFlag, error_t result) { bool done = TRUE; dbg_serial("DispatchUnslottedCsmaP", "UnslottedCsmaCa.transmitDone() -> %lu\n", (uint32_t) result); m_resume = FALSE; switch (result) { case SUCCESS: // frame was successfully transmitted, if ACK was requested // then a matching ACK was successfully received as well m_txStatus = IEEE154_SUCCESS; if (frame->payload[0] == CMD_FRAME_DATA_REQUEST && ((frame->header->mhr[MHR_INDEX_FC1]) & FC1_FRAMETYPE_MASK) == FC1_FRAMETYPE_CMD) { // this was a data request frame m_txStatus = IEEE154_NO_DATA; // pessimistic if (ackPendingFlag) { // the coordinator has data for us; switch to Rx // to complete the indirect transmission m_indirectTxPending = TRUE; m_lastFrame = m_currentFrame; m_currentFrame = NULL; ASSERT(call RadioRx.enableRx(0, 0) == SUCCESS); return; } } break; case FAIL: // The CSMA-CA algorithm failed: the frame was not transmitted, // because channel was never idle m_txStatus = IEEE154_CHANNEL_ACCESS_FAILURE; break; case ENOACK: // frame was transmitted, but we didn't receive an ACK (although // we requested an one). note: coordinator never retransmits an // indirect transmission (see above) if (m_macMaxFrameRetries > 0) { // retransmit: reinitialize CSMA-CA parameters done = FALSE; m_csma.NB = 0; m_csma.macMaxCsmaBackoffs = m_macMaxCSMABackoffs; m_csma.macMaxBE = m_macMaxBE; m_csma.BE = m_BE; m_macMaxFrameRetries -= 1; } else m_txStatus = IEEE154_NO_ACK; break; default: ASSERT(0); break; } if (done) { m_lastFrame = m_currentFrame; m_currentFrame = NULL; post signalTxDoneTask(); } m_lock = FALSE; updateState(); dbg_serial_flush(); } task void signalTxDoneTask() { ieee154_txframe_t *lastFrame = m_lastFrame; ieee154_status_t status = m_txStatus; m_indirectTxPending = FALSE; m_lastFrame = NULL; // only now the next transmission can begin if (lastFrame) { dbg_serial("DispatchUnslottedCsmaP", "Transmit done, DSN: %lu, result: 0x%lx\n", (uint32_t) MHR(lastFrame)[MHR_INDEX_SEQNO], (uint32_t) status); signal FrameTx.transmitDone(lastFrame, status); } updateState(); } event message_t* RadioRx.received(message_t* frame) { // received a frame -> find out frame type and // signal it to responsible client component uint8_t *payload = (uint8_t *) frame->data; uint8_t *mhr = MHR(frame); uint8_t frameType = mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK; if (frameType == FC1_FRAMETYPE_CMD) frameType += payload[0]; atomic { if (m_indirectTxPending) { message_t* frameBuf; call IndirectTxWaitTimer.stop(); // TODO: check! //if (frame->payloadLen) // is this frame from our coordinator? hmm... we cannot say // with certainty, because we might only know either the // coordinator extended or short address (and the frame could // have been sent with the other addressing mode) ?? m_txStatus = IEEE154_SUCCESS; frameBuf = signal FrameExtracted.received[frameType](frame, m_lastFrame); signal IndirectTxWaitTimer.fired(); return frameBuf; } else return signal FrameRx.received[frameType](frame); } } task void wasRxEnabledTask() { signal WasRxEnabled.notify(TRUE); } default event void FrameTx.transmitDone(ieee154_txframe_t *data, ieee154_status_t status) {} default event message_t* FrameRx.received[uint8_t client](message_t* data) {return data;} default async command bool IsRxEnableActive.getNow() {return FALSE;} default event message_t* FrameExtracted.received[uint8_t client](message_t* msg, ieee154_txframe_t *txFrame) {return msg;} command error_t WasRxEnabled.enable() {return FAIL;} command error_t WasRxEnabled.disable() {return FAIL;} default event void MLME_START.confirm(ieee154_status_t status) {} async event void RadioToken.transferredFrom(uint8_t fromClientID) {ASSERT(0);} async event void RadioTokenRequested.requested(){ updateState(); } async event void RadioTokenRequested.immediateRequested(){ updateState(); } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/GTS.h000066400000000000000000000060151207233610700177320ustar00rootroot00000000000000/* * Copyright (c) 2010, CISTER/ISEP - Polytechnic Institute of Porto * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * * @author Ricardo Severino * @author Stefano Tennina * ======================================================================== */ #ifndef __GTS_H #define __GTS_H #define GTS_PERMIT_ENABLED 0x80 #define GTS_MAX_SLOTS 7 #define GTS_TX_DIRECTION 0 #define GTS_RX_DIRECTION 1 #define GTS_ALOC_REQ 1 #define GTS_DEALOC_REQ 0 #define GTS_SEND_BUFFER_SIZE 10 typedef enum gts_op_status { GTS_OP_FAILED =0, GTS_OP_SUCCESS = 1, } gts_op_status_t; typedef struct { uint8_t gtsCharacteristics; uint16_t devAddress; } gtsDescriptorType; typedef struct { uint8_t gtsId; uint8_t startingSlot; uint8_t length; uint8_t direction; uint16_t devAddress; uint8_t expiration; } gtsInfoEntryType; //GTS entry (used in the PAN coordinator) typedef struct { uint8_t gtsId; uint8_t startingSlot; uint8_t length; uint16_t devAddress; uint8_t persistenceTime; } gtsInfoEntryType_null; typedef struct { uint8_t elementCount; uint8_t elementIn; uint8_t elementOut; uint8_t gtsFrameIndex[GTS_SEND_BUFFER_SIZE]; } gtsSlotElementType; typedef struct { ieee154_txframe_t *frame[GTS_SEND_BUFFER_SIZE]; uint8_t availableGtsIndex[GTS_SEND_BUFFER_SIZE]; uint8_t availableGtsIndexCount; uint8_t gtsSendBufferCount; uint8_t gtsSendBufferMsgIn; uint8_t gtsSendBufferMsgOut; } gtsBufferType; #endif tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/InactivePeriodP.nc000066400000000000000000000137741207233610700225050ustar00rootroot00000000000000/* * Copyright (c) 2010, KTH Royal Institute of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright notice, this * list of conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * - Neither the name of the Royal Institute of Technology nor the names of its * contributors may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. */ /** * The component InactivePeriodP owns the radio token during the inactive period in * nodes in beacon-enabled networks. It powers the radio down and restarts it before * handing over the radio token to the beacon reception/transmission component. * Depending on the actual radio, powering it down may result in less energy * consumption than idle, e.g. for the CC2420 powering down means disabling the * crystal oscillator, which saves a significant amount energy compard to the * idle state. * * @author João Faria * @author Aitor Hernandez * @author Jan Hauer */ #include "TKN154_MAC.h" generic module InactivePeriodP(uint8_t sfDirection) { uses { interface TransferableResource as RadioToken; interface Alarm as Alarm; interface SplitControl as RadioControl; interface SuperframeStructure as SF; interface GetNow as IsEmbedded; interface RadioOff; interface MLME_GET; interface TimeCalc; } } implementation { #ifndef IEEE154_RADIO_POWERUP_TIME async event void RadioToken.transferredFrom(uint8_t fromClient) { dbg_serial("InactivePeriodP", "Power down disabled, transferring token\n"); if (sfDirection == OUTGOING_SUPERFRAME) { call RadioToken.transferTo(RADIO_CLIENT_BEACONSYNCHRONIZE); } else { call RadioToken.transferTo(RADIO_CLIENT_BEACONTRANSMIT); } } async event void RadioOff.offDone() { ASSERT(0);} event void RadioControl.stopDone(error_t result) { } event void RadioControl.startDone(error_t result) { } async event void Alarm.fired() { ASSERT(0);} event void RadioToken.granted() { ASSERT(0);} #else task void offDoneTask(); task void firedTask(); void transferToken() { dbg_serial("InactivePeriodP", "Transferring token\n"); if (sfDirection == OUTGOING_SUPERFRAME) { call RadioToken.transferTo(RADIO_CLIENT_BEACONSYNCHRONIZE); } else { call RadioToken.transferTo(RADIO_CLIENT_BEACONTRANSMIT); } } uint32_t maxDt() { return call SF.beaconInterval() - IEEE154_RADIO_POWERUP_TIME - call SF.guardTime(); } bool tooLate() { if (call IsEmbedded.getNow()) { // we have a situation where there is an incoming and outgoing superframe // (scenario as indicated in 802.15.4-2006 Fig. 67), so the inactive period // is not "inactive", we should not power down (TODO: we might power down // for a smaller amount of time, the time in between two superframes) return TRUE; } else return call TimeCalc.hasExpired(call SF.sfStartTime(), maxDt()); } async event void RadioToken.transferredFrom(uint8_t fromClient) { if (tooLate()) { dbg_serial("InactivePeriodP", "Got token: Not enough time to powerdown %lu, %lu.\n", (uint32_t) call SF.beaconInterval(), maxDt()); transferToken(); } else { error_t error = call RadioOff.off(); dbg_serial("InactivePeriodP", "Got token, switching radio off: %lu (%lu)\n", (uint32_t) error, call Alarm.getNow()); if (error == EALREADY) signal RadioOff.offDone(); else if (error != SUCCESS) transferToken(); } } async event void RadioOff.offDone() { post offDoneTask(); } task void offDoneTask() { dbg_serial("InactivePeriodP", "Trying to power radio down\n"); if (tooLate() || call RadioControl.stop() != SUCCESS) /* Disable the radio chip, voltage reg, oscillator, mm */ transferToken(); } event void RadioControl.stopDone(error_t result) { // NOTE: RadioControl is fanning out, so we have to check if we // are the actual client that is owning the radio (or if someone // else has called RadioControl.stop). if (call RadioToken.isOwner()) { dbg_serial("InactivePeriodP", "Radio powered down: %lu\n", (uint32_t) result); call Alarm.startAt(call SF.sfStartTime(), maxDt()); } } async event void Alarm.fired() { post firedTask(); } task void firedTask() { dbg_serial("InactivePeriodP", "Powering radio up again (%lu)\n", call Alarm.getNow()); call RadioControl.start(); } event void RadioControl.startDone(error_t error) { // comment at RadioControl.stopDone() applies here as well if (call RadioToken.isOwner()) { dbg_serial("InactivePeriodP", "Done: radio powered up (%lu)\n", call Alarm.getNow()); transferToken(); } } event void RadioToken.granted() { ASSERT(0);} #endif } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/IndirectTxP.nc000066400000000000000000000353631207233610700216530ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.10 $ * $Date: 2010-02-04 16:31:15 $ * @author Jan Hauer * @author: Jasper Buesch * ======================================================================== */ module IndirectTxP { provides { interface Init as Reset; interface FrameTx[uint8_t client]; interface WriteBeaconField as PendingAddrWrite; interface Notify as PendingAddrSpecUpdated; interface Get as GetIndirectTxFrame; interface Purge; } uses { interface FrameTx as CoordCapTx; interface FrameRx as DataRequestRx; interface MLME_GET; interface IEEE154Frame; interface Timer as IndirectTxTimeout; interface TimeCalc; interface Leds; } } implementation { enum { SEND_THIS_FRAME = 0x80, NUM_MAX_PENDING = 7, }; ieee154_txframe_t *m_txFrameTable[NUM_MAX_PENDING]; ieee154_txframe_t *m_pendingTxFrame; uint8_t m_client; uint8_t m_numTableEntries; uint8_t m_numShortPending; uint8_t m_numExtPending; ieee154_txframe_t m_emptyDataFrame; ieee154_metadata_t m_emptyDataFrameMetadata; ieee154_header_t m_emptyDataFrameHeader; task void tryCoordCapTxTask(); void tryCoordCapTx(); void transmitEmptyDataFrame(message_t* dataRequestFrame); command error_t Reset.init() { uint8_t i; // CAP/Queue component is always reset first, i.e. there // should be no outstanding frames call IndirectTxTimeout.stop(); for (i=0; iclient](m_txFrameTable[i], IEEE154_TRANSACTION_OVERFLOW); for (i=0; ihandle == msduHandle) && (m_client != m_txFrameTable[i]->client) ){ ieee154_txframe_t *purgedFrame; purgedFrame = m_txFrameTable[i]; m_txFrameTable[i] = NULL; m_numTableEntries -= 1; signal Purge.purgeDone(purgedFrame, IEEE154_PURGED); return IEEE154_SUCCESS; } } return IEEE154_INVALID_HANDLE; } command uint8_t PendingAddrWrite.write(uint8_t *lastBytePtr, uint8_t maxlen) { // writes the pending addr field (inside the beacon frame) // we go "backwards", i.e. start with the extended addresses, // then the short addresses, then the "Pending Address Specification" uint8_t i, j, k; uint8_t numShort, numExt; nxle_uint16_t *shortAddrPtr; ieee154_txframe_t *txFrame; numExt = 0; for (i=0; iheader->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == FC2_DEST_MODE_EXTENDED) { uint8_t *curExtAddrPtr = &(txFrame->header->mhr[MHR_INDEX_ADDRESS + sizeof(ieee154_macPANId_t)]); k = 0; // search for duplicate dest. address for (j=0; jheader->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == FC2_DEST_MODE_SHORT) { nxle_uint16_t shortAddr; shortAddr = *((nxle_uint16_t*) &txFrame->header->mhr[MHR_INDEX_ADDRESS + sizeof(ieee154_macPANId_t)]); for (j=0; j= NUM_MAX_PENDING) { dbg_serial("IndirectTxP", "Overflow\n"); return IEEE154_TRANSACTION_OVERFLOW; } txFrame->client = client; txFrame->metadata->timestamp = call IndirectTxTimeout.getNow(); for (i=0; iheader->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == FC2_DEST_MODE_SHORT) m_numShortPending++; else if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == FC2_DEST_MODE_EXTENDED) m_numExtPending++; if (!call IndirectTxTimeout.isRunning()) call IndirectTxTimeout.startOneShot(getPersistenceTimeSymbols()); dbg_serial("IndirectTxP", "Preparing a transmission.\n"); signal PendingAddrSpecUpdated.notify(TRUE); return IEEE154_SUCCESS; } event message_t* DataRequestRx.received(message_t* frame) { uint8_t i, j, srcAddressMode, dstAddressMode, *src; uint8_t *mhr = MHR(frame); uint8_t destMode = (mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK); ieee154_txframe_t *dataResponseFrame = NULL; // received a data request frame from a device // have we got some pending data for it ? srcAddressMode = (mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK); if (!(srcAddressMode & FC2_SRC_MODE_SHORT)) return frame; // no source address src = mhr + MHR_INDEX_ADDRESS; if (destMode == FC2_DEST_MODE_SHORT) src += 4; else if (destMode == FC2_DEST_MODE_EXTENDED) src += 10; if (!((mhr[MHR_INDEX_FC1] & FC1_PAN_ID_COMPRESSION) && (mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_SHORT))) src += 2; for (i=0; iheader->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK); if ((dstAddressMode << 4) != srcAddressMode) continue; else { // we know: dstAddressMode IN [2,3] uint8_t *dst = &(m_txFrameTable[i]->header->mhr[MHR_INDEX_ADDRESS]) + 2; uint8_t len = ((srcAddressMode == FC2_SRC_MODE_SHORT) ? 2 : 8); for (j=0; jheader->mhr[MHR_INDEX_FC1] |= FC1_FRAME_PENDING; } } } } if (dataResponseFrame != NULL) { // found a matching frame, mark it for transmission dbg_serial("IndirectTxP", "We have data for this device, trying to transmit...\n"); dataResponseFrame->client |= SEND_THIS_FRAME; post tryCoordCapTxTask(); } else { dbg_serial("IndirectTxP", "We don't have data for this device, sending an empty frame...\n"); transmitEmptyDataFrame(frame); } return frame; } void transmitEmptyDataFrame(message_t* dataRequestFrame) { // the cast in the next line is dangerous -> this is only a temporary workaround! // (until the new T2 message buffer abstraction is available) message_t *emptyDataMsg = (message_t *) m_emptyDataFrame.header; ieee154_address_t dstAddr; uint16_t dstPanID; if (m_emptyDataFrame.client != 0) return; // locked (already transmitting an empty data frame) if (call IEEE154Frame.getSrcAddr(dataRequestFrame, &dstAddr) != IEEE154_SUCCESS || call IEEE154Frame.getSrcPANId(dataRequestFrame, &dstPanID) != IEEE154_SUCCESS) return; call IEEE154Frame.setAddressingFields(emptyDataMsg, call IEEE154Frame.getDstAddrMode(dataRequestFrame), // will become srcAddrMode call IEEE154Frame.getSrcAddrMode(dataRequestFrame), // will become dstAddrMode dstPanID, &dstAddr, NULL //security ); MHR(&m_emptyDataFrame)[MHR_INDEX_FC1] |= FC1_FRAMETYPE_DATA; m_emptyDataFrame.headerLen = call IEEE154Frame.getHeaderLength(emptyDataMsg); m_emptyDataFrame.client = 1; // lock if (call CoordCapTx.transmit(&m_emptyDataFrame) != IEEE154_SUCCESS) m_emptyDataFrame.client = 0; // unlock } void tryCoordCapTx() { // iterate over the queued frames and transmit them in the CAP // (if they are marked for transmission) uint8_t i; if (m_pendingTxFrame == NULL && m_numTableEntries) { for (i=0; iclient & SEND_THIS_FRAME)) { m_pendingTxFrame = m_txFrameTable[i]; m_client = m_txFrameTable[i]->client; if (call CoordCapTx.transmit(m_txFrameTable[i]) == IEEE154_SUCCESS) { dbg_serial("IndirectTxP", "Started a transmission.\n"); } else { m_pendingTxFrame = NULL; post tryCoordCapTxTask(); } return; // done - wait for txDone } } } task void tryCoordCapTxTask() { tryCoordCapTx(); } event void IndirectTxTimeout.fired() { // a transaction has expired uint32_t now = call IndirectTxTimeout.getNow(), dt=0; uint32_t persistenceTime = getPersistenceTimeSymbols(); uint8_t i; for (i=0; imetadata->timestamp, persistenceTime)) { ieee154_txframe_t *txFrame = m_txFrameTable[i]; txFrame->client &= ~SEND_THIS_FRAME; m_txFrameTable[i] = NULL; m_numTableEntries -= 1; if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == FC2_DEST_MODE_SHORT) m_numShortPending--; else if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == FC2_DEST_MODE_EXTENDED) m_numExtPending--; signal FrameTx.transmitDone[txFrame->client](txFrame, IEEE154_TRANSACTION_EXPIRED); signal PendingAddrSpecUpdated.notify(TRUE); } else if (call TimeCalc.timeElapsed(m_txFrameTable[i]->metadata->timestamp, now) > dt) { dt = call TimeCalc.timeElapsed(m_txFrameTable[i]->metadata->timestamp, now); } } if (dt != 0) { if (dt > persistenceTime) dt = persistenceTime; call IndirectTxTimeout.startOneShot(persistenceTime - dt); } } event void CoordCapTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { uint8_t i; // TODO: if CSMA-CA algorithm failed, then frame shall still remain in transaction queue dbg_serial("IndirectTxP", "transmitDone(), status: %lu\n", (uint32_t) status); if (txFrame == &m_emptyDataFrame) { m_emptyDataFrame.client = 0; // unlock return; } for (i=0; iclient = m_client; txFrame->client &= ~SEND_THIS_FRAME; m_numTableEntries -= 1; if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == FC2_DEST_MODE_SHORT) m_numShortPending--; else if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == FC2_DEST_MODE_EXTENDED) m_numExtPending--; signal FrameTx.transmitDone[txFrame->client](txFrame, status); post tryCoordCapTxTask(); } command ieee154_txframe_t* GetIndirectTxFrame.get() { return m_pendingTxFrame;} command error_t PendingAddrSpecUpdated.enable() {return FAIL;} command error_t PendingAddrSpecUpdated.disable() {return FAIL;} default event void PendingAddrSpecUpdated.notify( bool val ) {return;} default event void FrameTx.transmitDone[uint8_t client](ieee154_txframe_t *txFrame, ieee154_status_t status) {} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/Makefile.include000066400000000000000000000045641207233610700222150ustar00rootroot00000000000000# Make sure that TinyOS Makerules has been included *before* including # this Makefile, because it expands the PLATFORM variable, which we need TKN154_PLATFORM_INCLUDE ?= $(TOSDIR)/platforms/$(PLATFORM)/mac/tkn154/Makefile.include TKN154_EXTRAS += $(wildcard $(TOSDIR)/lib/mac/tkn154/extras/*.extra) CFLAGS += -I$(TOSDIR)/lib/mac/tkn154 \ -I$(TOSDIR)/lib/mac/tkn154/dummies \ -I$(TOSDIR)/lib/mac/tkn154/interfaces/MCPS \ -I$(TOSDIR)/lib/mac/tkn154/interfaces/MLME \ -I$(TOSDIR)/lib/mac/tkn154/interfaces/private \ -I$(TOSDIR)/lib/mac/tkn154/interfaces/public # Whenever platforms have identical configuration we don't need to put copies of # Makefile.include under "platforms/$(PLATFORM)/mac/tkn154/", intead we make a # redirect to the Makefile.include here: # The shimmer2 platform configuration is identical to telosb ifeq ($(findstring $(PLATFORM),shimmer2), shimmer2) TKN154_PLATFORM_INCLUDE = $(TOSDIR)/platforms/telosb/mac/tkn154/Makefile.include endif # The shimmer2r platform configuration is identical to telosb ifeq ($(findstring $(PLATFORM),shimmer2r), shimmer2r) TKN154_PLATFORM_INCLUDE = $(TOSDIR)/platforms/telosb/mac/tkn154/Makefile.include endif #################################### Extras #################################### # legacy ifdef IEEE154_EXTENDED_ADDRESS $(error To set the extended address of a device to X pass 'extaddr,X' to the make system (e.g. "make telosb extaddr,0x012345")) endif # legacy ifdef TKN154_DEBUG $(error To enable debug mode pass 'tkn154debug' to the make system (e.g. "make telosb tkn154debug")) endif # Pull in our extras (note we cannot use TOSMAKE_PATH, because it has already # been parsed), so we do it "manually" ourselves now $(foreach file,$(TKN154_EXTRAS),$(if $(filter $(call names,$(file)),$(GOALS)),$(eval include $(file)))) ############################### Platform include ############################### # 1. check whether target is "clean" ifneq ($(strip $(foreach g,$(GOALS),$(findstring $(g),clean))),) # do nothing (Makerules' default clean branch will be executed) # 2. check whether the platform is supported, by testing if file # TKN154_PLATFORM_INCLUDE exists else ifeq ($(strip $(wildcard $(TKN154_PLATFORM_INCLUDE))),) $(error The target platform is not supported by the TKN15.4 MAC) else # 3. platform is supported: now include the platform-specific # TKN15.4 Makefile include $(TKN154_PLATFORM_INCLUDE) endif tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/PibP.nc000066400000000000000000001162631207233610700203070ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Date: 2009-09-08 09:04:43 $ * @author Jan Hauer * ======================================================================== */ /** * This component maintains the PIB (PAN Information Base) attributes and * provides interfaces for accessing fields in a MAC frame. */ #include "TKN154.h" #include "TKN154_PIB.h" #include "TKN154_PHY.h" module PibP { provides { interface Init as LocalInit; interface MLME_RESET; interface MLME_GET; interface MLME_SET; interface Set as SetMacSuperframeOrder; interface Set as SetMacBeaconTxTime; interface Set as SetMacPanCoordinator; interface FrameUtility; interface IEEE154Frame as Frame; interface IEEE154BeaconFrame as BeaconFrame; interface Get as GetLocalExtendedAddress; interface GetNow as IsRadioTokenRequested; interface Notify as PIBUpdate[uint8_t PIBAttributeID]; interface Packet; interface TimeCalc; } uses { interface Get as PromiscuousModeGet; interface Init as DispatchReset; interface Init as DispatchQueueReset; interface Init as MacReset; interface SplitControl as RadioControl; interface Random; interface TransferableResource as RadioToken; interface RadioOff; interface LocalTime; } } implementation { ieee154_PIB_t m_pib; uint8_t m_numResetClientPending; bool m_setDefaultPIB; norace uint8_t m_resetSpin; #ifdef IEEE154_EXTENDED_ADDRESS const uint64_t m_aExtendedAddressLE = IEEE154_EXTENDED_ADDRESS; #else norace uint64_t m_aExtendedAddressLE; #endif task void radioControlStopTask(); void updateMacMaxFrameTotalWaitTime(); void resetAttributesToDefault(); bool isLocalExtendedAddress(uint8_t *addrLE); bool isCoordExtendedAddress(uint8_t *addrLE); uint8_t getPendAddrSpecOffset(uint8_t *macPayloadField); task void resetSpinTask(); command error_t LocalInit.init() { #ifndef IEEE154_EXTENDED_ADDRESS m_aExtendedAddressLE = (((uint64_t) call Random.rand32() ) << 32 ) | call Random.rand32(); #endif resetAttributesToDefault(); return SUCCESS; } void resetAttributesToDefault() { m_pib.phyCurrentChannel = IEEE154_DEFAULT_CURRENTCHANNEL; m_pib.phyTransmitPower = (IEEE154_TXPOWER_TOLERANCE | (IEEE154_DEFAULT_TRANSMITPOWER_dBm & 0x3F)); m_pib.phyCCAMode = IEEE154_DEFAULT_CCAMODE; m_pib.phyCurrentPage = IEEE154_DEFAULT_CURRENTPAGE; m_pib.macAssociatedPANCoord = IEEE154_DEFAULT_ASSOCIATEDPANCOORD; m_pib.macAssociationPermit = IEEE154_DEFAULT_ASSOCIATIONPERMIT; m_pib.macAutoRequest = IEEE154_DEFAULT_AUTOREQUEST; m_pib.macBattLifeExt = IEEE154_DEFAULT_BATTLIFEEXT; m_pib.macBattLifeExtPeriods = IEEE154_DEFAULT_BATTLIFEEXTPERIODS; m_pib.macBeaconPayloadLength = IEEE154_DEFAULT_BEACONPAYLOADLENGTH; m_pib.macBeaconOrder = IEEE154_DEFAULT_BEACONORDER; m_pib.macBeaconTxTime = IEEE154_DEFAULT_BEACONTXTIME; m_pib.macBSN = 0xFF & (call Random.rand16()); // macCoordExtendedAddress: default is undefined m_pib.macCoordShortAddress = IEEE154_DEFAULT_COORDSHORTADDRESS; m_pib.macDSN = 0xFF & (call Random.rand16()); m_pib.macGTSPermit = IEEE154_DEFAULT_GTSPERMIT; m_pib.macMaxBE = IEEE154_DEFAULT_MAXBE; m_pib.macMaxCSMABackoffs = IEEE154_DEFAULT_MAXCSMABACKOFFS; m_pib.macMaxFrameRetries = IEEE154_DEFAULT_MAXFRAMERETRIES; m_pib.macMinBE = IEEE154_DEFAULT_MINBE; m_pib.macPANId = IEEE154_DEFAULT_PANID; m_pib.macPromiscuousMode = IEEE154_DEFAULT_PROMISCUOUSMODE; m_pib.macResponseWaitTime = IEEE154_DEFAULT_RESPONSEWAITTIME; m_pib.macRxOnWhenIdle = IEEE154_DEFAULT_RXONWHENIDLE; m_pib.macSecurityEnabled = IEEE154_DEFAULT_SECURITYENABLED; m_pib.macShortAddress = IEEE154_DEFAULT_SHORTADDRESS; m_pib.macSuperframeOrder = IEEE154_DEFAULT_SUPERFRAMEORDER; m_pib.macTransactionPersistenceTime = IEEE154_DEFAULT_TRANSACTIONPERSISTENCETIME; m_pib.macPanCoordinator = IEEE154_DEFAULT_MACPANCOORDINATOR; updateMacMaxFrameTotalWaitTime(); } void updateMacMaxFrameTotalWaitTime() { // using equation 14 on page 160 ieee154_macMinBE_t macMinBE = m_pib.macMinBE; ieee154_macMaxBE_t macMaxBE = m_pib.macMaxBE; ieee154_macMaxCSMABackoffs_t macMaxCSMABackoffs = m_pib.macMaxCSMABackoffs; uint8_t m = macMaxBE - macMinBE, k; uint32_t waitTime = 0; if (macMaxCSMABackoffs < m) m = macMaxCSMABackoffs; waitTime = (((uint16_t) 1 << macMaxBE) - 1) * (macMaxCSMABackoffs - m); if (m) { k = 0; while (k != m) { waitTime += ((uint16_t) 1 << (macMinBE+k)); k += 1; } } waitTime *= IEEE154_aUnitBackoffPeriod; waitTime += call MLME_GET.phyMaxFrameDuration(); m_pib.macMaxFrameTotalWaitTime = waitTime; } command ieee154_status_t MLME_RESET.request(bool SetDefaultPIB) { // resetting the complete stack is not so easy... // first we acquire the Token (get exclusive radio access), then we switch off // the radio and reset all MAC components, starting from the ones that might // still have any frames queued / allocated to get them flushed out. While we // own the Token all other components are "inactive" (and there are no pending // Alarms!), but there can still be pending Timers/tasks -> we stop all Timers // through MacReset.init() and then spin a few tasks in between to get // everything "flushed out" ieee154_status_t status = IEEE154_SUCCESS; if (call PromiscuousModeGet.get()) status = IEEE154_TRANSACTION_OVERFLOW; // must first cancel promiscuous mode! else { m_setDefaultPIB = SetDefaultPIB; m_resetSpin = 5; call RadioToken.request(); } dbg_serial("PibP", "MLME_RESET.request(%lu) -> result: %lu\n", (uint32_t) SetDefaultPIB, (uint32_t) status); return status; } event void RadioToken.granted() { if (call RadioOff.off() != SUCCESS) signal RadioOff.offDone(); } async event void RadioOff.offDone() { post radioControlStopTask(); } task void radioControlStopTask() { error_t result = call RadioControl.stop(); if (result == EALREADY) signal RadioControl.stopDone(SUCCESS); else ASSERT(result == SUCCESS); } event void RadioControl.stopDone(error_t result) { // NOTE: RadioControl is fanning out, so we have to check if we // are the actual client that is owning the radio (or if someone // else has called RadioControl.stop). if (call RadioToken.isOwner()) { ASSERT(result == SUCCESS); call DispatchReset.init(); // resets the dispatch component(s), spools out frames call DispatchQueueReset.init(); // resets the dispatch queue component(s), spools out frames call MacReset.init(); // resets the remaining components post resetSpinTask(); } } task void resetSpinTask() { m_resetSpin -= 1; if (m_resetSpin != 0) { post resetSpinTask(); return; } ASSERT(call RadioControl.start() == SUCCESS); } async command token_requested_t IsRadioTokenRequested.getNow(){ return m_resetSpin != 0; } event void RadioControl.startDone(error_t error) { // comment at RadioControl.stopDone() applies here as well if (call RadioToken.isOwner()) { if (m_setDefaultPIB) resetAttributesToDefault(); signal PIBUpdate.notify[IEEE154_phyCurrentChannel](&m_pib.phyCurrentChannel); signal PIBUpdate.notify[IEEE154_macShortAddress](&m_pib.macShortAddress); signal PIBUpdate.notify[IEEE154_macPANId](&m_pib.macPANId); signal PIBUpdate.notify[IEEE154_phyCCAMode](&m_pib.phyCCAMode); signal PIBUpdate.notify[IEEE154_phyTransmitPower](&m_pib.phyTransmitPower); signal PIBUpdate.notify[IEEE154_phyCurrentPage](&m_pib.phyCurrentPage); signal PIBUpdate.notify[IEEE154_macPanCoordinator](&m_pib.macPanCoordinator); call RadioToken.release(); signal MLME_RESET.confirm(IEEE154_SUCCESS); } } /* ----------------------- MLME-GET ----------------------- */ command ieee154_phyCurrentChannel_t MLME_GET.phyCurrentChannel() { return m_pib.phyCurrentChannel;} command ieee154_phyChannelsSupported_t MLME_GET.phyChannelsSupported() { return IEEE154_SUPPORTED_CHANNELS;} command ieee154_phyTransmitPower_t MLME_GET.phyTransmitPower() { return m_pib.phyTransmitPower;} command ieee154_phyCCAMode_t MLME_GET.phyCCAMode() { return m_pib.phyCCAMode;} command ieee154_phyCurrentPage_t MLME_GET.phyCurrentPage() { return m_pib.phyCurrentPage;} command ieee154_phyMaxFrameDuration_t MLME_GET.phyMaxFrameDuration() { return IEEE154_MAX_FRAME_DURATION;} command ieee154_phySHRDuration_t MLME_GET.phySHRDuration() { return IEEE154_SHR_DURATION;} command ieee154_phySymbolsPerOctet_t MLME_GET.phySymbolsPerOctet() { return IEEE154_SYMBOLS_PER_OCTET;} command ieee154_macAckWaitDuration_t MLME_GET.macAckWaitDuration() { return IEEE154_ACK_WAIT_DURATION;} command ieee154_macAssociationPermit_t MLME_GET.macAssociationPermit() { return m_pib.macAssociationPermit;} command ieee154_macAutoRequest_t MLME_GET.macAutoRequest() { return m_pib.macAutoRequest;} command ieee154_macBattLifeExt_t MLME_GET.macBattLifeExt() { return m_pib.macBattLifeExt;} command ieee154_macBattLifeExtPeriods_t MLME_GET.macBattLifeExtPeriods() { return m_pib.macBattLifeExtPeriods;} command ieee154_macBeaconOrder_t MLME_GET.macBeaconOrder() { return m_pib.macBeaconOrder;} command ieee154_macBeaconTxTime_t MLME_GET.macBeaconTxTime() { return m_pib.macBeaconTxTime;} command ieee154_macBSN_t MLME_GET.macBSN() { return m_pib.macBSN;} command ieee154_macCoordExtendedAddress_t MLME_GET.macCoordExtendedAddress() { return m_pib.macCoordExtendedAddress;} command ieee154_macCoordShortAddress_t MLME_GET.macCoordShortAddress() { return m_pib.macCoordShortAddress;} command ieee154_macDSN_t MLME_GET.macDSN() { return m_pib.macDSN;} command ieee154_macGTSPermit_t MLME_GET.macGTSPermit() { return m_pib.macGTSPermit;} command ieee154_macMaxCSMABackoffs_t MLME_GET.macMaxCSMABackoffs() { return m_pib.macMaxCSMABackoffs;} command ieee154_macMinBE_t MLME_GET.macMinBE() { return m_pib.macMinBE;} command ieee154_macPANId_t MLME_GET.macPANId() { return m_pib.macPANId;} command ieee154_macPromiscuousMode_t MLME_GET.macPromiscuousMode() { return call PromiscuousModeGet.get();} command ieee154_macRxOnWhenIdle_t MLME_GET.macRxOnWhenIdle() { return m_pib.macRxOnWhenIdle;} command ieee154_macShortAddress_t MLME_GET.macShortAddress() { return m_pib.macShortAddress;} command ieee154_macSuperframeOrder_t MLME_GET.macSuperframeOrder() { return m_pib.macSuperframeOrder;} command ieee154_macTransactionPersistenceTime_t MLME_GET.macTransactionPersistenceTime() { return m_pib.macTransactionPersistenceTime;} command ieee154_macAssociatedPANCoord_t MLME_GET.macAssociatedPANCoord() { return m_pib.macAssociatedPANCoord;} command ieee154_macMaxBE_t MLME_GET.macMaxBE() { return m_pib.macMaxBE;} command ieee154_macMaxFrameTotalWaitTime_t MLME_GET.macMaxFrameTotalWaitTime() { return m_pib.macMaxFrameTotalWaitTime;} command ieee154_macMaxFrameRetries_t MLME_GET.macMaxFrameRetries() { return m_pib.macMaxFrameRetries;} command ieee154_macResponseWaitTime_t MLME_GET.macResponseWaitTime() { return m_pib.macResponseWaitTime;} command ieee154_macSyncSymbolOffset_t MLME_GET.macSyncSymbolOffset() { return IEEE154_SYNC_SYMBOL_OFFSET;} command ieee154_macTimestampSupported_t MLME_GET.macTimestampSupported() { return IEEE154_TIMESTAMP_SUPPORTED;} command ieee154_macSecurityEnabled_t MLME_GET.macSecurityEnabled() { return m_pib.macSecurityEnabled;} command ieee154_macMinLIFSPeriod_t MLME_GET.macMinLIFSPeriod() { return IEEE154_MIN_LIFS_PERIOD;} command ieee154_macMinSIFSPeriod_t MLME_GET.macMinSIFSPeriod() { return IEEE154_MIN_SIFS_PERIOD;} command ieee154_macPanCoordinator_t MLME_GET.macPanCoordinator() { return m_pib.macPanCoordinator;} /* ----------------------- MLME-SET ----------------------- */ command ieee154_status_t MLME_SET.phyCurrentChannel(ieee154_phyCurrentChannel_t value) { uint32_t i = 1; uint8_t k = value; while (i && k) { i <<= 1; k -= 1; } if (!(IEEE154_SUPPORTED_CHANNELS & i)) return IEEE154_INVALID_PARAMETER; m_pib.phyCurrentChannel = value; signal PIBUpdate.notify[IEEE154_phyCurrentChannel](&m_pib.phyCurrentChannel); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.phyTransmitPower(ieee154_phyTransmitPower_t value) { m_pib.phyTransmitPower = (value & 0x3F); signal PIBUpdate.notify[IEEE154_phyTransmitPower](&m_pib.phyTransmitPower); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.phyCCAMode(ieee154_phyCCAMode_t value) { if (value < 1 || value > 3) return IEEE154_INVALID_PARAMETER; m_pib.phyCCAMode = value; signal PIBUpdate.notify[IEEE154_phyCCAMode](&m_pib.phyCCAMode); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.phyCurrentPage(ieee154_phyCurrentPage_t value) { if (value > 31) return IEEE154_INVALID_PARAMETER; m_pib.phyCurrentPage = value; signal PIBUpdate.notify[IEEE154_phyCurrentPage](&m_pib.phyCurrentPage); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macAssociationPermit(ieee154_macAssociationPermit_t value) { m_pib.macAssociationPermit = value; signal PIBUpdate.notify[IEEE154_macAssociationPermit](&m_pib.macAssociationPermit); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macAutoRequest(ieee154_macAutoRequest_t value) { m_pib.macAutoRequest = value; signal PIBUpdate.notify[IEEE154_macAutoRequest](&m_pib.macAutoRequest); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macBattLifeExt(ieee154_macBattLifeExt_t value) { m_pib.macBattLifeExt = value; signal PIBUpdate.notify[IEEE154_macBattLifeExt](&m_pib.macBattLifeExt); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macBattLifeExtPeriods(ieee154_macBattLifeExtPeriods_t value) { if (value < 6 || value > 41) return IEEE154_INVALID_PARAMETER; m_pib.macBattLifeExtPeriods = value; signal PIBUpdate.notify[IEEE154_macBattLifeExtPeriods](&m_pib.macBattLifeExtPeriods); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macBeaconOrder(ieee154_macBeaconOrder_t value) { if (value > 15) return IEEE154_INVALID_PARAMETER; m_pib.macBeaconOrder = value; signal PIBUpdate.notify[IEEE154_macBeaconOrder](&m_pib.macBeaconOrder); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macBSN(ieee154_macBSN_t value) { m_pib.macBSN = value; signal PIBUpdate.notify[IEEE154_macBSN](&m_pib.macBSN); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macCoordExtendedAddress(ieee154_macCoordExtendedAddress_t value) { m_pib.macCoordExtendedAddress = value; signal PIBUpdate.notify[IEEE154_macCoordExtendedAddress](&m_pib.macCoordExtendedAddress); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macCoordShortAddress(ieee154_macCoordShortAddress_t value) { m_pib.macCoordShortAddress = value; signal PIBUpdate.notify[IEEE154_macCoordShortAddress](&m_pib.macCoordShortAddress); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macDSN(ieee154_macDSN_t value) { m_pib.macDSN = value; signal PIBUpdate.notify[IEEE154_macDSN](&m_pib.macDSN); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macGTSPermit(ieee154_macGTSPermit_t value) { m_pib.macGTSPermit = value; signal PIBUpdate.notify[IEEE154_macGTSPermit](&m_pib.macGTSPermit); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macMaxCSMABackoffs(ieee154_macMaxCSMABackoffs_t value) { if (value > 5) return IEEE154_INVALID_PARAMETER; m_pib.macMaxCSMABackoffs = value; updateMacMaxFrameTotalWaitTime(); signal PIBUpdate.notify[IEEE154_macMaxCSMABackoffs](&m_pib.macMaxCSMABackoffs); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macMinBE(ieee154_macMinBE_t value) { if (value > m_pib.macMaxBE) return IEEE154_INVALID_PARAMETER; m_pib.macMinBE = value; updateMacMaxFrameTotalWaitTime(); signal PIBUpdate.notify[IEEE154_macMinBE](&m_pib.macMinBE); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macPANId(ieee154_macPANId_t value) { m_pib.macPANId = value; signal PIBUpdate.notify[IEEE154_macPANId](&m_pib.macPANId); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macRxOnWhenIdle(ieee154_macRxOnWhenIdle_t value) { m_pib.macRxOnWhenIdle = value; signal PIBUpdate.notify[IEEE154_macRxOnWhenIdle](&m_pib.macRxOnWhenIdle); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macShortAddress(ieee154_macShortAddress_t value) { m_pib.macShortAddress = value; signal PIBUpdate.notify[IEEE154_macShortAddress](&m_pib.macShortAddress); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macTransactionPersistenceTime(ieee154_macTransactionPersistenceTime_t value) { m_pib.macTransactionPersistenceTime = value; signal PIBUpdate.notify[IEEE154_macTransactionPersistenceTime](&m_pib.macTransactionPersistenceTime); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macAssociatedPANCoord(ieee154_macAssociatedPANCoord_t value) { m_pib.macAssociatedPANCoord = value; signal PIBUpdate.notify[IEEE154_macAssociatedPANCoord](&m_pib.macAssociatedPANCoord); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macMaxBE(ieee154_macMaxBE_t value) { if (value < 3 || value > 8) return IEEE154_INVALID_PARAMETER; m_pib.macMaxBE = value; updateMacMaxFrameTotalWaitTime(); signal PIBUpdate.notify[IEEE154_macMaxBE](&m_pib.macMaxBE); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macMaxFrameTotalWaitTime(ieee154_macMaxFrameTotalWaitTime_t value) { // equation 14 on page 160 defines how macMaxFrameTotalWaitTime is calculated; // its value depends only on other PIB attributes and constants - why does the standard // allow setting it by the next higher layer ?? m_pib.macMaxFrameTotalWaitTime = value; signal PIBUpdate.notify[IEEE154_macMaxFrameTotalWaitTime](&m_pib.macMaxFrameTotalWaitTime); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macMaxFrameRetries(ieee154_macMaxFrameRetries_t value) { if (value > 7) return IEEE154_INVALID_PARAMETER; m_pib.macMaxFrameRetries = value; signal PIBUpdate.notify[IEEE154_macMaxFrameRetries](&m_pib.macMaxFrameRetries); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macResponseWaitTime(ieee154_macResponseWaitTime_t value) { if (value < 2 || value > 64) return IEEE154_INVALID_PARAMETER; m_pib.macResponseWaitTime = value; signal PIBUpdate.notify[IEEE154_macResponseWaitTime](&m_pib.macResponseWaitTime); return IEEE154_SUCCESS; } command ieee154_status_t MLME_SET.macSecurityEnabled(ieee154_macSecurityEnabled_t value) { return IEEE154_UNSUPPORTED_ATTRIBUTE; } // Read-only attributes (writable only by MAC components) command void SetMacSuperframeOrder.set( ieee154_macSuperframeOrder_t value) { m_pib.macSuperframeOrder = value; signal PIBUpdate.notify[IEEE154_macSuperframeOrder](&m_pib.macSuperframeOrder); } command void SetMacBeaconTxTime.set( ieee154_macBeaconTxTime_t value) { m_pib.macBeaconTxTime = value; signal PIBUpdate.notify[IEEE154_macBeaconTxTime](&m_pib.macBeaconTxTime); } command void SetMacPanCoordinator.set( ieee154_macPanCoordinator_t value) { m_pib.macPanCoordinator = value; signal PIBUpdate.notify[IEEE154_macPanCoordinator](&m_pib.macPanCoordinator); } /* ----------------------- TimeCalc ----------------------- */ async command uint32_t TimeCalc.timeElapsed(uint32_t t0, uint32_t t1) { // t0 occured before t1, what is the delta? if (t0 <= t1) return t1 - t0; else return ~(t0 - t1) + 1; } async command bool TimeCalc.hasExpired(uint32_t t0, uint32_t dt) { // t0 is in the past, what about t0+dt? uint32_t now = call LocalTime.get(), elapsed; if (now >= t0) elapsed = now - t0; else elapsed = ~(t0 - now) + 1; return (elapsed >= dt); } /* ----------------------- Frame Access ----------------------- */ command void Packet.clear(message_t* msg) { message_header_t* header = (message_header_t*) msg->header; message_metadata_t* metadata = (message_metadata_t*) msg->metadata; header->ieee154.length = 0; memset( header->ieee154.mhr, 0x0, MHR_MAX_LEN); memset( &metadata->ieee154, 0x0, sizeof(ieee154_metadata_t)); } command uint8_t Packet.payloadLength(message_t* msg) { return ((message_header_t*) msg->header)->ieee154.length; } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { ((message_header_t*) msg->header)->ieee154.length = len; } command uint8_t Packet.maxPayloadLength() { return TOSH_DATA_LENGTH; } command void* Packet.getPayload(message_t* msg, uint8_t len) { return msg->data; } async command uint8_t FrameUtility.writeHeader( uint8_t* mhr, uint8_t DstAddrMode, uint16_t DstPANId, ieee154_address_t* DstAddr, uint8_t SrcAddrMode, uint16_t SrcPANId, const ieee154_address_t* SrcAddr, bool PANIDCompression) { uint8_t offset = MHR_INDEX_ADDRESS; if (DstAddrMode == ADDR_MODE_SHORT_ADDRESS || DstAddrMode == ADDR_MODE_EXTENDED_ADDRESS) { *((nxle_uint16_t*) &mhr[offset]) = DstPANId; offset += 2; if (DstAddrMode == ADDR_MODE_SHORT_ADDRESS) { *((nxle_uint16_t*) &mhr[offset]) = DstAddr->shortAddress; offset += 2; } else { call FrameUtility.convertToLE(&mhr[offset], &DstAddr->extendedAddress); offset += 8; } } if (SrcAddrMode == ADDR_MODE_SHORT_ADDRESS || SrcAddrMode == ADDR_MODE_EXTENDED_ADDRESS) { if (DstPANId != SrcPANId || !PANIDCompression) { *((nxle_uint16_t*) &mhr[offset]) = SrcPANId; offset += 2; } if (SrcAddrMode == ADDR_MODE_SHORT_ADDRESS) { *((nxle_uint16_t*) &mhr[offset]) = SrcAddr->shortAddress; offset += 2; } else { call FrameUtility.convertToLE(&mhr[offset], &SrcAddr->extendedAddress); offset += 8; } } return offset; } command bool FrameUtility.isBeaconFromCoord(message_t *frame) { uint8_t offset = MHR_INDEX_ADDRESS; uint8_t *mhr = MHR(frame); if ((mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK) != FC1_FRAMETYPE_BEACON) return FALSE; // not a beacon frame if (!(mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK)) return FALSE; // source address information missing if (mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) return FALSE; // beacons don't include dest address if ((*(nxle_uint16_t*) (&mhr[offset])) != m_pib.macPANId) return FALSE; // wrong PAN ID offset += 2; if ((mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK) == FC2_SRC_MODE_SHORT) { if ((*(nxle_uint16_t*) (&mhr[offset])) != m_pib.macCoordShortAddress) return FALSE; } else if ((mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK) == FC2_SRC_MODE_EXTENDED) { if (!isCoordExtendedAddress(mhr + offset)) return FALSE; } return TRUE; } async command error_t FrameUtility.getMHRLength(uint8_t fcf1, uint8_t fcf2, uint8_t *len) { uint8_t idCompression; uint8_t offset = MHR_INDEX_ADDRESS; if (fcf1 & FC1_SECURITY_ENABLED) return FAIL; // not supported idCompression = (fcf1 & FC1_PAN_ID_COMPRESSION); if (fcf2 & 0x08) { // short or ext. address offset += 4; // pan id + short address if (fcf2 & 0x04) // ext. address offset += 6; // diff to short address } if (fcf2 & 0x80) { // short or ext. address offset += 2; if (!idCompression) offset += 2; if (fcf2 & 0x40) // ext. address offset += 6; // diff to short address } *len = offset; return SUCCESS; } command error_t Frame.setAddressingFields(message_t* frame, uint8_t srcAddrMode, uint8_t dstAddrMode, uint16_t dstPANId, ieee154_address_t *dstAddr, ieee154_security_t *security) { uint8_t *mhr = MHR(frame); ieee154_address_t srcAddress; ieee154_macPANId_t srcPANId = call MLME_GET.macPANId(); if (security && security->SecurityLevel) return FAIL; // not implemented mhr[MHR_INDEX_FC2] &= ~(FC2_DEST_MODE_MASK | FC2_SRC_MODE_MASK); mhr[MHR_INDEX_FC2] |= dstAddrMode << FC2_DEST_MODE_OFFSET; mhr[MHR_INDEX_FC2] |= srcAddrMode << FC2_SRC_MODE_OFFSET; if (srcAddrMode == ADDR_MODE_SHORT_ADDRESS) srcAddress.shortAddress = call MLME_GET.macShortAddress(); else srcAddress.extendedAddress = call GetLocalExtendedAddress.get(); if (dstAddrMode >= ADDR_MODE_SHORT_ADDRESS && srcAddrMode >= ADDR_MODE_SHORT_ADDRESS && dstPANId == srcPANId) mhr[MHR_INDEX_FC1] |= FC1_PAN_ID_COMPRESSION; else mhr[MHR_INDEX_FC1] &= ~FC1_PAN_ID_COMPRESSION; call FrameUtility.writeHeader( mhr, dstAddrMode, dstPANId, dstAddr, srcAddrMode, srcPANId, &srcAddress, (mhr[MHR_INDEX_FC1] & FC1_PAN_ID_COMPRESSION) ? TRUE: FALSE); return SUCCESS; } command uint8_t Frame.getFrameType(message_t* frame) { uint8_t *mhr = MHR(frame); return (mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK); } command void* Frame.getHeader(message_t* frame) { uint8_t *mhr = MHR(frame); return (void*) &(mhr[MHR_INDEX_FC1]); } command uint8_t Frame.getHeaderLength(message_t* frame) { uint8_t len; uint8_t *mhr = MHR(frame); call FrameUtility.getMHRLength(mhr[0], mhr[1], &len); return len; } command void* Frame.getPayload(message_t* frame) { uint8_t *payload = (uint8_t *) frame->data; return payload; } command uint8_t Frame.getPayloadLength(message_t* frame) { uint8_t len = ((ieee154_header_t*) frame->header)->length & FRAMECTL_LENGTH_MASK; return len; } command uint32_t Frame.getTimestamp(message_t* frame) { ieee154_metadata_t *metadata = (ieee154_metadata_t*) frame->metadata; return metadata->timestamp; } command bool Frame.isTimestampValid(message_t* frame) { ieee154_metadata_t *metadata = (ieee154_metadata_t*) frame->metadata; if (metadata->timestamp == IEEE154_INVALID_TIMESTAMP) return FALSE; else return TRUE; } command uint8_t Frame.getDSN(message_t* frame) { uint8_t *mhr = MHR(frame); return mhr[MHR_INDEX_SEQNO]; } command uint8_t Frame.getLinkQuality(message_t* frame) { ieee154_metadata_t *metadata = (ieee154_metadata_t*) frame->metadata; return metadata->linkQuality; } command int8_t Frame.getRSSI(message_t* frame) { ieee154_metadata_t *metadata = (ieee154_metadata_t*) frame->metadata; return metadata->rssi; } command uint8_t Frame.getSrcAddrMode(message_t* frame) { uint8_t *mhr = MHR(frame); return (mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK) >> FC2_SRC_MODE_OFFSET; } command error_t Frame.getSrcAddr(message_t* frame, ieee154_address_t *address) { uint8_t *mhr = MHR(frame); uint8_t offset = MHR_INDEX_ADDRESS; uint8_t destMode = (mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK); if (!(mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_SHORT)) return FAIL; if (destMode == FC2_DEST_MODE_SHORT) offset += 4; else if (destMode == FC2_DEST_MODE_EXTENDED) offset += 10; if (!((mhr[MHR_INDEX_FC1] & FC1_PAN_ID_COMPRESSION) && (mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_SHORT))) offset += 2; if ((mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK) == FC2_SRC_MODE_SHORT) address->shortAddress = *((nxle_uint16_t*) (&(mhr[offset]))); else call FrameUtility.convertToNative(&address->extendedAddress, (&(mhr[offset]))); return SUCCESS; } command error_t Frame.getSrcPANId(message_t* frame, uint16_t *PANID) { uint8_t *mhr = MHR(frame); uint8_t offset = MHR_INDEX_ADDRESS; uint8_t destMode = (mhr[1] & FC2_DEST_MODE_MASK); if (!(mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_SHORT)) return FAIL; if (destMode == FC2_DEST_MODE_SHORT) offset += 4; else if (destMode == FC2_DEST_MODE_EXTENDED) offset += 10; if ((mhr[MHR_INDEX_FC1] & FC1_PAN_ID_COMPRESSION) && (mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_SHORT)) *PANID = *((nxle_uint16_t*) (&(mhr[MHR_INDEX_ADDRESS]))); else if ((mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK) == FC2_SRC_MODE_SHORT) *PANID = *((nxle_uint16_t*) (&(mhr[offset]))); else *PANID = *((nxle_uint16_t*) (&(mhr[offset]))); return SUCCESS; } command uint8_t Frame.getDstAddrMode(message_t* frame) { uint8_t *mhr = MHR(frame); return (mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) >> FC2_DEST_MODE_OFFSET; } command error_t Frame.getDstAddr(message_t* frame, ieee154_address_t *address) { uint8_t *mhr = MHR(frame); if (!(mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_SHORT)) return FAIL; if ((mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == FC2_DEST_MODE_SHORT) address->shortAddress = *((nxle_uint16_t*) (&(mhr[MHR_INDEX_ADDRESS]) + 2)); else call FrameUtility.convertToNative(&address->extendedAddress, (&(mhr[MHR_INDEX_ADDRESS]) + 2)); return SUCCESS; } command error_t Frame.getDstPANId(message_t* frame, uint16_t *PANID) { uint8_t *mhr = MHR(frame); if (!(mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_SHORT)) return FAIL; *PANID = *((nxle_uint16_t*) (&(mhr[MHR_INDEX_ADDRESS]))); return SUCCESS; } command bool Frame.wasPromiscuousModeEnabled(message_t* frame) { return (((ieee154_header_t*) frame->header)->length & FRAMECTL_PROMISCUOUS) ? TRUE : FALSE; } command bool Frame.hasStandardCompliantHeader(message_t* frame) { uint8_t *mhr = MHR(frame); if (((mhr[0] & FC1_FRAMETYPE_MASK) > 0x03) || ((mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == 0x04) || ((mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK) == 0x40) || #ifndef IEEE154_SECURITY_ENABLED ((mhr[0] & FC1_SECURITY_ENABLED)) || #endif (mhr[MHR_INDEX_FC2] & FC2_FRAME_VERSION_2)) return FALSE; else return TRUE; } /* ----------------------- Beacon Frame Access ----------------------- */ uint8_t getPendAddrSpecOffset(uint8_t *macPayloadField) { uint8_t gtsDescriptorCount = macPayloadField[BEACON_INDEX_GTS_SPEC] & GTS_DESCRIPTOR_COUNT_MASK; return BEACON_INDEX_GTS_SPEC + 1 + ((gtsDescriptorCount > 0) ? 1 + gtsDescriptorCount * 3: 0); } command error_t BeaconFrame.getPendAddrSpec(message_t* frame, uint8_t* pendAddrSpec) { uint8_t *mhr = MHR(frame); if (((mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK) != FC1_FRAMETYPE_BEACON)) return FAIL; else { uint8_t *payload = (uint8_t *) frame->data; uint8_t pendAddrSpecOffset = getPendAddrSpecOffset(payload); *pendAddrSpec = payload[pendAddrSpecOffset]; return SUCCESS; } } command error_t BeaconFrame.getPendAddr(message_t* frame, uint8_t addrMode, ieee154_address_t buffer[], uint8_t bufferSize) { uint8_t *mhr = MHR(frame); uint8_t *payload = (uint8_t *) frame->data; uint8_t pendAddrSpecOffset = getPendAddrSpecOffset(payload); uint8_t pendAddrSpec = payload[pendAddrSpecOffset], i; if (((mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK) != FC1_FRAMETYPE_BEACON)) return FAIL; if (addrMode == ADDR_MODE_SHORT_ADDRESS) { for (i=0; i<(pendAddrSpec & PENDING_ADDRESS_SHORT_MASK) && i> 4) && idata; uint8_t pendAddrSpecOffset = getPendAddrSpecOffset(payload); uint8_t pendAddrSpec = payload[pendAddrSpecOffset], i; ieee154_macShortAddress_t shortAddress = call MLME_GET.macShortAddress(); if (((mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK) != FC1_FRAMETYPE_BEACON)) return ADDR_MODE_NOT_PRESENT; for (i=0; i<(pendAddrSpec & PENDING_ADDRESS_SHORT_MASK); i++) if (*((nxle_uint16_t*) (payload + pendAddrSpecOffset + 1 + 2*i)) == shortAddress) return ADDR_MODE_SHORT_ADDRESS; for (i=0; i<((pendAddrSpec & PENDING_ADDRESS_EXT_MASK) >> 4); i++) if (isLocalExtendedAddress(((payload + pendAddrSpecOffset + 1 + (pendAddrSpec & PENDING_ADDRESS_SHORT_MASK)*2 + 8*i)))) return ADDR_MODE_EXTENDED_ADDRESS; return ADDR_MODE_NOT_PRESENT; } command void* BeaconFrame.getBeaconPayload(message_t* frame) { uint8_t *mhr = MHR(frame); uint8_t *payload = (uint8_t *) frame->data; if ((mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK) == FC1_FRAMETYPE_BEACON) { uint8_t pendAddrSpecOffset = getPendAddrSpecOffset(payload); uint8_t pendAddrSpec = payload[pendAddrSpecOffset]; payload += (pendAddrSpecOffset + 1); if (pendAddrSpec & PENDING_ADDRESS_SHORT_MASK) payload += (pendAddrSpec & PENDING_ADDRESS_SHORT_MASK) * 2; if (pendAddrSpec & PENDING_ADDRESS_EXT_MASK) payload += ((pendAddrSpec & PENDING_ADDRESS_EXT_MASK) >> 4) * 8; } return payload; } command uint8_t BeaconFrame.getBeaconPayloadLength(message_t* frame) { uint8_t *mhr = MHR(frame); uint8_t len = ((ieee154_header_t*) frame->header)->length & FRAMECTL_LENGTH_MASK; if ((mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK) == FC1_FRAMETYPE_BEACON) { uint8_t *payload = call BeaconFrame.getBeaconPayload(frame); len = len - (payload - (uint8_t *) frame->data); } return len; } command uint8_t BeaconFrame.getBSN(message_t* frame) { return call Frame.getDSN(frame); } command error_t BeaconFrame.parsePANDescriptor( message_t *frame, uint8_t LogicalChannel, uint8_t ChannelPage, ieee154_PANDescriptor_t *pdescriptor) { uint8_t *mhr = MHR(frame); uint8_t offset; ieee154_metadata_t *metadata = (ieee154_metadata_t*) frame->metadata; if ((mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK) != FC1_FRAMETYPE_BEACON || (((mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK) != FC2_SRC_MODE_SHORT) && ((mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK) != FC2_SRC_MODE_EXTENDED))) return FAIL; pdescriptor->CoordAddrMode = (mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK) >> FC2_SRC_MODE_OFFSET; offset = MHR_INDEX_ADDRESS; pdescriptor->CoordPANId = *((nxle_uint16_t*) &mhr[offset]); offset += sizeof(ieee154_macPANId_t); if ((mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK) == FC2_SRC_MODE_SHORT) pdescriptor->CoordAddress.shortAddress = *((nxle_uint16_t*) &mhr[offset]); else call FrameUtility.convertToNative(&pdescriptor->CoordAddress.extendedAddress, &mhr[offset]); pdescriptor->LogicalChannel = LogicalChannel; pdescriptor->ChannelPage = ChannelPage; ((uint8_t*) &pdescriptor->SuperframeSpec)[0] = frame->data[BEACON_INDEX_SF_SPEC1]; // little endian ((uint8_t*) &pdescriptor->SuperframeSpec)[1] = frame->data[BEACON_INDEX_SF_SPEC2]; pdescriptor->GTSPermit = (frame->data[BEACON_INDEX_GTS_SPEC] & GTS_SPEC_PERMIT) ? 1 : 0; pdescriptor->LinkQuality = metadata->linkQuality; pdescriptor->TimeStamp = metadata->timestamp; #ifndef IEEE154_SECURITY_ENABLED pdescriptor->SecurityFailure = IEEE154_SUCCESS; pdescriptor->SecurityLevel = 0; pdescriptor->KeyIdMode = 0; pdescriptor->KeySource = 0; pdescriptor->KeyIndex = 0; #else #error Implementation of BeaconFrame.parsePANDescriptor() needs to be adapted! #endif return SUCCESS; } /* ----------------------- FrameUtility, etc. ----------------------- */ command uint64_t GetLocalExtendedAddress.get() { return m_aExtendedAddressLE; } async command void FrameUtility.convertToLE(uint8_t *destLE, const uint64_t *src) { uint8_t i; uint64_t srcCopy = *src; for (i=0; i<8; i++) { destLE[i] = srcCopy; srcCopy >>= 8; } } async command void FrameUtility.convertToNative(uint64_t *dest, const uint8_t *srcLE) { // on msp430 nxle_uint64_t doesn't work, this is a workaround uint32_t lower = *((nxle_uint32_t*) srcLE); uint64_t upper = *((nxle_uint32_t*) (srcLE+4)); *dest = (upper << 32) + lower; } async command void FrameUtility.copyLocalExtendedAddressLE(uint8_t *destLE) { call FrameUtility.convertToLE(destLE, &m_aExtendedAddressLE); } command void FrameUtility.copyCoordExtendedAddressLE(uint8_t *destLE) { call FrameUtility.convertToLE(destLE, &m_pib.macCoordExtendedAddress); } bool isLocalExtendedAddress(uint8_t *addrLE) { uint64_t dest; call FrameUtility.convertToNative(&dest, addrLE); return dest == m_aExtendedAddressLE; } bool isCoordExtendedAddress(uint8_t *addrLE) { uint64_t dest; call FrameUtility.convertToNative(&dest, addrLE); return dest == m_pib.macCoordExtendedAddress; } default event void PIBUpdate.notify[uint8_t PIBAttributeID](const void* PIBAttributeValue) {} command error_t PIBUpdate.enable[uint8_t PIBAttributeID]() {return FAIL;} command error_t PIBUpdate.disable[uint8_t PIBAttributeID]() {return FAIL;} async event void RadioToken.transferredFrom(uint8_t fromClient){ASSERT(0);} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/PollP.nc000066400000000000000000000213321207233610700204730ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2010-01-05 16:41:16 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" module PollP { provides { interface Init; interface MLME_POLL; interface FrameRx as DataRx; interface DataRequest as DataRequest[uint8_t client]; } uses { interface FrameTx as PollTx; interface FrameExtracted as DataExtracted; interface FrameUtility; interface Pool as TxFramePool; interface Pool as TxControlPool; interface MLME_GET; interface Get as LocalExtendedAddress; } } implementation { enum { HANDLE_MLME_POLL_REQUEST = 0xFF, HANDLE_MLME_POLL_SUCCESS = 0xFE, }; int m_numPending; uint8_t m_dataRequestCmdID = CMD_FRAME_DATA_REQUEST; void assembleDataRequestFrame( uint8_t destAddrMode, uint16_t destPANId, uint8_t* DstAddr, uint8_t srcAddrMode, ieee154_txframe_t *txFrame); command error_t Init.init() { m_numPending = 0; return SUCCESS; } command ieee154_status_t MLME_POLL.request ( uint8_t coordAddrMode, uint16_t coordPANID, ieee154_address_t coordAddress, ieee154_security_t *security) { ieee154_txframe_t *txFrame; ieee154_txcontrol_t *txControl; uint8_t srcAddrMode = 2; ieee154_status_t status = IEEE154_SUCCESS; uint8_t coordAddressLE[8]; // little endian is what we want nxle_uint16_t *shortAddress = (nxle_uint16_t*) coordAddressLE; if (security && security->SecurityLevel) status = IEEE154_UNSUPPORTED_SECURITY; else if (coordAddrMode < 2 || coordAddrMode > 3 || coordPANID == 0xFFFF) status = IEEE154_INVALID_PARAMETER; else if (!(txFrame = call TxFramePool.get())) // none of the predefined return value really fits status = IEEE154_TRANSACTION_OVERFLOW; else if (!(txControl = call TxControlPool.get())) { call TxFramePool.put(txFrame); status = IEEE154_TRANSACTION_OVERFLOW; } else { txFrame->header = &txControl->header; txFrame->metadata = &txControl->metadata; if (coordAddrMode == ADDR_MODE_SHORT_ADDRESS) *shortAddress = coordAddress.shortAddress; else call FrameUtility.convertToLE(coordAddressLE, &coordAddress.extendedAddress); txFrame->handle = HANDLE_MLME_POLL_REQUEST; if (call MLME_GET.macShortAddress() >= 0xFFFE) srcAddrMode = 3; assembleDataRequestFrame(coordAddrMode, coordPANID, coordAddressLE, srcAddrMode, txFrame); if ((status = call PollTx.transmit(txFrame)) != IEEE154_SUCCESS) { call TxFramePool.put(txFrame); call TxControlPool.put(txControl); status = IEEE154_TRANSACTION_OVERFLOW; } else m_numPending++; } dbg_serial("PollP", "MLME_POLL.request -> result: %lu\n", (uint32_t) status); return status; } command ieee154_status_t DataRequest.poll[uint8_t client](uint8_t CoordAddrMode, uint16_t CoordPANId, uint8_t *CoordAddressLE, uint8_t srcAddrMode) { ieee154_txframe_t *txFrame; ieee154_txcontrol_t *txControl; ieee154_status_t status = IEEE154_TRANSACTION_OVERFLOW; dbg_serial("PollP", "Internal Poll\n"); if (client == SYNC_POLL_CLIENT && m_numPending != 0) { // no point in auto-requesting if user request is pending signal DataRequest.pollDone[client](); return IEEE154_SUCCESS; } else if ((txFrame = call TxFramePool.get()) != NULL) { if ((txControl = call TxControlPool.get()) != NULL) { txFrame->header = &txControl->header; txFrame->metadata = &txControl->metadata; txFrame->handle = client; assembleDataRequestFrame(CoordAddrMode, CoordPANId, CoordAddressLE, srcAddrMode, txFrame); if ((status = call PollTx.transmit(txFrame)) != IEEE154_SUCCESS) { call TxControlPool.put(txControl); call TxFramePool.put(txFrame); dbg_serial("PollP", "Tx Overflow\n"); } else m_numPending++; } else { call TxFramePool.put(txFrame); } } dbg_serial("PollP", "Status %lu, numPending: %lu\n", (uint32_t) status, (uint32_t) m_numPending); if (status != IEEE154_SUCCESS) signal DataRequest.pollDone[client](); return status; } void assembleDataRequestFrame(uint8_t destAddrMode, uint16_t destPANId, uint8_t* destAddrPtrLE, uint8_t srcAddrMode, ieee154_txframe_t *txFrame) { // destAddrPtrLE points to an address in little-endian format ! ieee154_address_t srcAddress; uint8_t *mhr; uint16_t srcPANId; ieee154_address_t DstAddr; srcPANId = call MLME_GET.macPANId(); memcpy(&DstAddr, destAddrPtrLE, destAddrMode == 2 ? 2 : 8); mhr = txFrame->header->mhr; mhr[MHR_INDEX_FC1] = FC1_FRAMETYPE_CMD | FC1_ACK_REQUEST; if (destAddrMode >= 2 && srcAddrMode >= 2 && destPANId == srcPANId) mhr[MHR_INDEX_FC1] |= FC1_PAN_ID_COMPRESSION; mhr[MHR_INDEX_FC2] = destAddrMode << FC2_DEST_MODE_OFFSET; mhr[MHR_INDEX_FC2] |= srcAddrMode << FC2_SRC_MODE_OFFSET; if (srcAddrMode == 2) srcAddress.shortAddress = call MLME_GET.macShortAddress(); else srcAddress.extendedAddress = call LocalExtendedAddress.get(); txFrame->headerLen = call FrameUtility.writeHeader( txFrame->header->mhr, destAddrMode, destPANId, &DstAddr, srcAddrMode, srcPANId, &srcAddress, (mhr[MHR_INDEX_FC1] & FC1_PAN_ID_COMPRESSION) ? TRUE: FALSE); txFrame->payload = &m_dataRequestCmdID; txFrame->payloadLen = 1; } event message_t* DataExtracted.received(message_t* frame, ieee154_txframe_t *txFrame) { if (!txFrame) { dbg_serial("PollP", "Internal error\n"); return frame; } else dbg_serial("PollP", "Extracted data successfully\n"); if (txFrame->handle == HANDLE_MLME_POLL_REQUEST) signal MLME_POLL.confirm(IEEE154_SUCCESS); else signal DataRequest.pollDone[txFrame->handle](); txFrame->handle = HANDLE_MLME_POLL_SUCCESS; // mark as processed // TODO: check if pending bit is set (then initiate another POLL) return signal DataRx.received(frame); } event void PollTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { dbg_serial("PollP", "transmitDone()\n"); m_numPending--; if (txFrame->handle != HANDLE_MLME_POLL_SUCCESS) { // didn't receive a DATA frame from the coordinator if (status == IEEE154_SUCCESS) // TODO: can this happen if a frame other than DATA was extracted? status = IEEE154_NO_DATA; if (txFrame->handle == HANDLE_MLME_POLL_REQUEST) signal MLME_POLL.confirm(status); else signal DataRequest.pollDone[txFrame->handle](); } call TxControlPool.put((ieee154_txcontrol_t*) ((uint8_t*) txFrame->header - offsetof(ieee154_txcontrol_t, header))); call TxFramePool.put(txFrame); } default event void MLME_POLL.confirm(ieee154_status_t status) {} default event void DataRequest.pollDone[uint8_t client]() {} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/PromiscuousModeP.nc000066400000000000000000000112341207233610700227220ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2009-03-24 12:56:46 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_PHY.h" #include "TKN154_MAC.h" module PromiscuousModeP { provides { interface Init; interface SplitControl as PromiscuousMode; interface Get as PromiscuousModeGet; interface FrameRx; interface GetNow as IsRadioTokenRequested; } uses { interface TransferableResource as RadioToken; interface RadioRx as PromiscuousRx; interface RadioOff; interface Set as RadioPromiscuousMode; } } implementation { norace enum promiscuous_state { S_STOPPING, S_STOPPED, S_STARTING, S_STARTED, } m_state; command error_t Init.init() { m_state = S_STOPPED; return SUCCESS; } /* ----------------------- Promiscuous Mode ----------------------- */ command bool PromiscuousModeGet.get() { return (m_state == S_STARTED); } command error_t PromiscuousMode.start() { error_t result = FAIL; if (m_state == S_STOPPED) { m_state = S_STARTING; call RadioToken.request(); result = SUCCESS; } dbg_serial("PromiscuousModeP", "PromiscuousMode.start -> result: %lu\n", (uint32_t) result); return result; } event void RadioToken.granted() { call RadioPromiscuousMode.set(TRUE); if (call RadioOff.isOff()) signal RadioOff.offDone(); else call RadioOff.off(); } task void signalStartDoneTask() { m_state = S_STARTED; dbg_serial("PromiscuousModeP", "Promiscuous mode enabled.\n"); signal PromiscuousMode.startDone(SUCCESS); } async event void PromiscuousRx.enableRxDone() { post signalStartDoneTask(); } event message_t* PromiscuousRx.received(message_t *frame) { if (m_state == S_STARTED) { ((ieee154_header_t*) frame->header)->length |= FRAMECTL_PROMISCUOUS; return signal FrameRx.received(frame); } else return frame; } command error_t PromiscuousMode.stop() { error_t result = FAIL; if (m_state == S_STARTED) { m_state = S_STOPPING; call RadioOff.off(); result = SUCCESS; } dbg_serial("PromiscuousModeP", "PromiscuousMode.stop -> result: %lu\n", (uint32_t) result); return result; } task void continueStopTask() { call RadioPromiscuousMode.set(FALSE); m_state = S_STOPPED; call RadioToken.release(); dbg_serial("PromiscuousModeP", "Promiscuous mode disabled.\n"); signal PromiscuousMode.stopDone(SUCCESS); } async event void RadioOff.offDone() { if (m_state == S_STARTING) { call PromiscuousRx.enableRx(0, 0); } else post continueStopTask(); } async command token_requested_t IsRadioTokenRequested.getNow(){ return m_state == S_STARTING; } default event void PromiscuousMode.startDone(error_t error) {} default event void PromiscuousMode.stopDone(error_t error) {} async event void RadioToken.transferredFrom(uint8_t clientFrom){ASSERT(0);} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/README.txt000066400000000000000000000112341207233610700206210ustar00rootroot00000000000000 This directory contains "TKN15.4", a platform-independent IEEE 802.15.4-2006 MAC implementation. The core implementation is platform-independent, but in order to use the code on a TinyOS 2 platform, the platform must provide (1) a suitable radio driver, (2) Alarms/Timers with symbol precision and (3) some "platform glue" code (defining guard times, etc.). Currently the supported platforms are: telosb, shimmer2(r) and micaz (note: because these platforms do not have a clock that satisfies the precision/accuracy requirements of the IEEE 802.15.4 standard -- 62.500 Hz, +-40 ppm in the 2.4 GHz band -- the timing in beacon-enabled mode is not fully standard compliant). The implementation also includes an AM layer, so it can be used underneath TinyOS routing protocols such as CTP (take a look at apps/tests/tkn154/README.txt). As of July 13, 2011 the MAC also includes the IEEE 802.15.4-2006 GTS services; this part of the implementation was contributed by CISTER/ISEP, Polytechnic Institute of Porto. Status (last updated Dec. 23, 2011) ----------------------------------- Missing functionality: - security services - PAN ID conflict notification/resolution - indirect transmissions: frames are not kept in transaction queue in case CSMA-CA algorithm fails Known Issues: - resetting the MAC during operation (via MLME_RESET) has not been sufficiently tested - if initial beacon Tx timestamp is invalid, the coordinator will hang - frame pending flags are (need to be) set in the ACK headers - transmitting coordinator realignment frames has not been tested - during an ongoing CSMA-CA transmission incoming frames are ignored - on a beacon-enabled PAN: if the device cannot find the beacon the DATA frame is not transmitted (but it should be transmitted using unslotted CSMA-CA, see Sect. 7.5.6.1 "Transmission") - ACK timestamps are invalid (relevant only in promiscuous mode) Implementation -------------- MAC implementation: tos/lib/mac/tkn154 MAC interfaces: tos/lib/mac/tkn154/interfaces CC2420 driver: tos/chips/cc2420_tkn154 TelosB "platform glue" code: tos/platforms/telosb/mac/tkn154 micaZ "platform glue" code: tos/platforms/micaz/mac/tkn154 (Shimmer2(r) platforms reuse the telosb configuration this is triggered via tos/lib/mac/tkn154/Makefile.include) Example applications: apps/tests/tkn154 Note: TEP3 recommends that interface names "should be mixed case, starting upper case". To match the syntax used in the IEEE 802.15.4 standard the interfaces provided by the MAC to the next higher layer deviate from this convention (they are all caps, e.g. MLME_START). Documentation ------------- A technical report on TKN15.4 is available here: http://www.tkn.tu-berlin.de/publications/papers/TKN154.pdf TKN15.4 is the basis for the implementation of the TinyOS 15.4 WG: http://www.tinyos.net/scoop/special/working_group_tinyos_154 Copyright --------- This work was supported by the European Commision within the 6th Framework Programme ICT Project ANGEL (Reference: 033506) and within the 7th Framework Programme ICT Project CONET (Reference: 224053). Author: Jan-Hinrich Hauer /* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/RadioClientC.nc000066400000000000000000000051001207233610700217400ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2009-05-14 13:20:35 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" generic configuration RadioClientC(uint8_t clientID) { provides { interface RadioOff; interface RadioRx; interface RadioTx; interface SlottedCsmaCa; interface UnslottedCsmaCa; interface TransferableResource as RadioToken; interface ResourceRequested as RadioTokenRequested; } } implementation { components RadioControlP; RadioRx = RadioControlP.RadioRx[clientID]; RadioTx = RadioControlP.RadioTx[clientID]; RadioOff = RadioControlP.RadioOff[clientID]; SlottedCsmaCa = RadioControlP.SlottedCsmaCa[clientID]; UnslottedCsmaCa = RadioControlP.UnslottedCsmaCa[clientID]; RadioToken = RadioControlP.TransferableResource[clientID]; RadioTokenRequested = RadioControlP.ResourceRequested[clientID]; } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/RadioControlImplP.nc000066400000000000000000000157241207233610700230160ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2010-01-05 16:41:16 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" module RadioControlImplP { provides { interface RadioRx as MacRx[uint8_t client]; interface RadioTx as MacTx[uint8_t client]; interface SlottedCsmaCa as SlottedCsmaCa[uint8_t client]; interface UnslottedCsmaCa as UnslottedCsmaCa[uint8_t client]; interface RadioOff as MacRadioOff[uint8_t client]; } uses { interface ArbiterInfo; interface RadioRx as PhyRx; interface RadioTx as PhyTx; interface SlottedCsmaCa as PhySlottedCsmaCa; interface UnslottedCsmaCa as PhyUnslottedCsmaCa; interface RadioOff as PhyRadioOff; interface Get as RadioPromiscuousMode; interface Leds; } } implementation { /* ----------------------- RadioRx ----------------------- */ async command error_t MacRx.enableRx[uint8_t client](uint32_t t0, uint32_t dt) { if (client == call ArbiterInfo.userId()) return call PhyRx.enableRx(t0, dt); else { ASSERT(0); return IEEE154_TRANSACTION_OVERFLOW; } } async event void PhyRx.enableRxDone() { signal MacRx.enableRxDone[call ArbiterInfo.userId()](); } event message_t* PhyRx.received(message_t *msg) { uint8_t *mhr = MHR(msg); dbg_serial("RadioControlImplP", "Received frame, DSN: %lu, type: 0x%lu\n", (uint32_t) mhr[MHR_INDEX_SEQNO], (uint32_t) mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK); if (((mhr[1] & FC2_FRAME_VERSION_MASK) > FC2_FRAME_VERSION_1) && (!call RadioPromiscuousMode.get())) return msg; #ifndef IEEE154_SECURITY_ENABLED if ((mhr[0] & FC1_SECURITY_ENABLED) && (!call RadioPromiscuousMode.get())) return msg; #endif return signal MacRx.received[call ArbiterInfo.userId()](msg); } async command bool MacRx.isReceiving[uint8_t client]() { if (client == call ArbiterInfo.userId()) return call PhyRx.isReceiving(); else { ASSERT(0); return FAIL; } } default async event void MacRx.enableRxDone[uint8_t client]() { ASSERT(0); } default event message_t* MacRx.received[uint8_t client](message_t *frame) { ASSERT(0); return frame; } /* ----------------------- RadioTx ----------------------- */ async command error_t MacTx.transmit[uint8_t client](ieee154_txframe_t *frame, uint32_t t0, uint32_t dt) { if (client == call ArbiterInfo.userId()) return call PhyTx.transmit(frame, t0, dt); else { ASSERT(0); return IEEE154_TRANSACTION_OVERFLOW; } } async event void PhyTx.transmitDone(ieee154_txframe_t *frame, error_t result) { signal MacTx.transmitDone[call ArbiterInfo.userId()](frame, result); } default async event void MacTx.transmitDone[uint8_t client](ieee154_txframe_t *frame, error_t result) { ASSERT(0); } /* ----------------------- Unslotted CSMA ----------------------- */ async command error_t UnslottedCsmaCa.transmit[uint8_t client](ieee154_txframe_t *frame, ieee154_csma_t *csma) { if (client == call ArbiterInfo.userId()) return call PhyUnslottedCsmaCa.transmit(frame, csma); else { ASSERT(0); return IEEE154_TRANSACTION_OVERFLOW; } } async event void PhyUnslottedCsmaCa.transmitDone(ieee154_txframe_t *frame, ieee154_csma_t *csma, bool ackPendingFlag, error_t result) { signal UnslottedCsmaCa.transmitDone[call ArbiterInfo.userId()]( frame, csma, ackPendingFlag, result); } default async event void UnslottedCsmaCa.transmitDone[uint8_t client]( ieee154_txframe_t *frame, ieee154_csma_t *csma, bool ackPendingFlag, error_t result) { ASSERT(0); } /* ----------------------- Slotted CSMA ----------------------- */ async command error_t SlottedCsmaCa.transmit[uint8_t client](ieee154_txframe_t *frame, ieee154_csma_t *csma, uint32_t slot0Time, uint32_t dtMax, bool resume, uint16_t remainingBackoff) { if (client == call ArbiterInfo.userId()) return call PhySlottedCsmaCa.transmit(frame, csma, slot0Time, dtMax, resume, remainingBackoff); else { ASSERT(0); return IEEE154_TRANSACTION_OVERFLOW; } } async event void PhySlottedCsmaCa.transmitDone(ieee154_txframe_t *frame, ieee154_csma_t *csma, bool ackPendingFlag, uint16_t remainingBackoff, error_t result) { signal SlottedCsmaCa.transmitDone[call ArbiterInfo.userId()]( frame, csma, ackPendingFlag, remainingBackoff, result); } default async event void SlottedCsmaCa.transmitDone[uint8_t client]( ieee154_txframe_t *frame, ieee154_csma_t *csma, bool ackPendingFlag, uint16_t remainingBackoff, error_t result) { ASSERT(0); } /* ----------------------- RadioOff ----------------------- */ async command error_t MacRadioOff.off[uint8_t client]() { if (client == call ArbiterInfo.userId()) return call PhyRadioOff.off(); else { ASSERT(0); return EBUSY; } } async event void PhyRadioOff.offDone() { signal MacRadioOff.offDone[call ArbiterInfo.userId()](); } async command bool MacRadioOff.isOff[uint8_t client]() { if (client == call ArbiterInfo.userId()) return call PhyRadioOff.isOff(); else return EBUSY; } default async event void MacRadioOff.offDone[uint8_t client]() { ASSERT(0); } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/RadioControlP.nc000066400000000000000000000070001207233610700221600ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-24 12:56:46 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" configuration RadioControlP { provides { interface RadioRx as RadioRx[uint8_t client]; interface RadioTx as RadioTx[uint8_t client]; interface SlottedCsmaCa as SlottedCsmaCa[uint8_t client]; interface UnslottedCsmaCa as UnslottedCsmaCa[uint8_t client]; interface RadioOff as RadioOff[uint8_t client]; interface TransferableResource[uint8_t id]; interface ResourceRequested[uint8_t id]; } uses { interface RadioRx as PhyRx; interface RadioTx as PhyTx; interface SlottedCsmaCa as PhySlottedCsmaCa; interface UnslottedCsmaCa as PhyUnslottedCsmaCa; interface RadioOff as PhyRadioOff; interface Get as RadioPromiscuousMode; interface ResourceConfigure[uint8_t id]; interface Leds; } } implementation { components RadioControlImplP; RadioRx = RadioControlImplP.MacRx; RadioTx = RadioControlImplP.MacTx; SlottedCsmaCa = RadioControlImplP.SlottedCsmaCa; UnslottedCsmaCa = RadioControlImplP.UnslottedCsmaCa; RadioOff = RadioControlImplP.MacRadioOff; PhyRx = RadioControlImplP.PhyRx; PhyTx = RadioControlImplP.PhyTx; PhySlottedCsmaCa = RadioControlImplP.PhySlottedCsmaCa; PhyUnslottedCsmaCa = RadioControlImplP.PhyUnslottedCsmaCa; PhyRadioOff = RadioControlImplP.PhyRadioOff; RadioPromiscuousMode = RadioControlImplP; Leds = RadioControlImplP; components MainC; components new RoundRobinResourceQueueC(uniqueCount(IEEE802154_RADIO_RESOURCE)) as Queue; components new SimpleTransferArbiterP() as Arbiter; MainC.SoftwareInit -> Queue; TransferableResource = Arbiter; ResourceRequested = Arbiter; RadioControlImplP.ArbiterInfo -> Arbiter; ResourceConfigure = Arbiter; Arbiter.Queue -> Queue; } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/RxEnableP.nc000066400000000000000000000157361207233610700213000ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2009-03-04 18:31:29 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_PHY.h" #include "TKN154_MAC.h" module RxEnableP { provides { interface Init as Reset; interface MLME_RX_ENABLE; interface GetNow as IsRxEnableActive; interface Notify as RxEnableStateChange; } uses { interface Timer as RxEnableTimer; interface Get as IsMacPanCoordinator; interface SuperframeStructure as IncomingSuperframeStructure; interface SuperframeStructure as OutgoingSuperframeStructure; interface GetNow as IsTrackingBeacons; interface GetNow as IsSendingBeacons; interface Notify as WasRxEnabled; interface TimeCalc; } } implementation { uint32_t m_rxOnDuration; uint32_t m_rxOnOffset; uint32_t m_rxOnAnchor; norace bool m_isRxEnabled; bool m_confirmPending; command error_t Reset.init() { if (m_confirmPending) { m_confirmPending = FALSE; signal MLME_RX_ENABLE.confirm(IEEE154_SUCCESS); } m_isRxEnabled = FALSE; call RxEnableTimer.stop(); return SUCCESS; } /* ----------------------- MLME-RX-ENABLE ----------------------- */ command ieee154_status_t MLME_RX_ENABLE.request ( bool DeferPermit, uint32_t RxOnTime, uint32_t RxOnDuration) { ieee154_status_t status = IEEE154_SUCCESS; uint32_t lastBeaconTime=0; uint32_t beaconInterval=0; if (m_confirmPending) status = IEEE154_TRANSACTION_OVERFLOW; else if (IEEE154_BEACON_ENABLED_PAN && RxOnTime > 0xFFFFFF) status = IEEE154_INVALID_PARAMETER; else if (RxOnDuration > 0xFFFFFF) status = IEEE154_INVALID_PARAMETER; else if (IEEE154_BEACON_ENABLED_PAN) { if (call IsSendingBeacons.getNow() && call IsMacPanCoordinator.get()) { // for OUTGOING SUPERFRAME lastBeaconTime = call OutgoingSuperframeStructure.sfStartTime(); beaconInterval = call OutgoingSuperframeStructure.sfSlotDuration() * 16; } else if (call IsTrackingBeacons.getNow()) { // for INCOMING SUPERFRAME lastBeaconTime = call IncomingSuperframeStructure.sfStartTime(); beaconInterval = call IncomingSuperframeStructure.sfSlotDuration() * 16; } if (beaconInterval == 0) status = IEEE154_PAST_TIME; // we're not even sending/receiving beacons else if (RxOnTime+RxOnDuration >= beaconInterval) status = IEEE154_ON_TIME_TOO_LONG; else if (call TimeCalc.hasExpired(lastBeaconTime, RxOnTime - IEEE154_aTurnaroundTime)) { if (!DeferPermit) status = IEEE154_PAST_TIME; else { // defer to next beacon RxOnTime += beaconInterval; } } if (status == IEEE154_SUCCESS) { m_rxOnAnchor = lastBeaconTime; m_rxOnOffset = RxOnTime; } } else { // this is a nonbeacon-enabled PAN m_rxOnAnchor = call RxEnableTimer.getNow(); m_rxOnOffset = 0; } if (status == IEEE154_SUCCESS) { m_rxOnDuration = RxOnDuration; m_isRxEnabled = FALSE; m_confirmPending = TRUE; call RxEnableTimer.startOneShotAt(m_rxOnAnchor, m_rxOnOffset); signal RxEnableStateChange.notify(TRUE); } dbg_serial("RxEnableP", "MLME_RX_ENABLE.request -> result: %lu\n", (uint32_t) status); return status; } event void RxEnableTimer.fired() { if (!m_isRxEnabled) { m_isRxEnabled = TRUE; call RxEnableTimer.startOneShotAt(m_rxOnAnchor, m_rxOnOffset + m_rxOnDuration); } else { m_isRxEnabled = FALSE; if (m_confirmPending) { // this means we tried to enable rx, but never succeeded, because // there were "other responsibilities" - but is SUCCESS really // an appropriate error code in this case? m_confirmPending = FALSE; dbg_serial("RxEnableP", "never actually managed to switch to Rx mode\n"); signal MLME_RX_ENABLE.confirm(IEEE154_SUCCESS); } } signal RxEnableStateChange.notify(TRUE); dbg_serial_flush(); } async command bool IsRxEnableActive.getNow() { return m_isRxEnabled; } event void WasRxEnabled.notify(bool val) { if (m_isRxEnabled && m_confirmPending) { m_confirmPending = FALSE; signal MLME_RX_ENABLE.confirm(IEEE154_SUCCESS); } dbg_serial("RxEnableP", "Radio is now (%lu) in Rx\n", (uint32_t) call RxEnableTimer.getNow()); dbg_serial_flush(); } command error_t RxEnableStateChange.enable() {return FAIL;} command error_t RxEnableStateChange.disable() {return FAIL;} default event void MLME_RX_ENABLE.confirm(ieee154_status_t status) {} default async command uint32_t IncomingSuperframeStructure.sfStartTime() {return 0;} default async command uint32_t IncomingSuperframeStructure.sfSlotDuration() {return 0;} default async command uint32_t OutgoingSuperframeStructure.sfStartTime() {return 0;} default async command uint32_t OutgoingSuperframeStructure.sfSlotDuration() {return 0;} default async command bool IsTrackingBeacons.getNow() { return FALSE;} default async command bool IsSendingBeacons.getNow() { return FALSE;} default command ieee154_macPanCoordinator_t IsMacPanCoordinator.get() { return FALSE;} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/ScanP.nc000066400000000000000000000425141207233610700204560ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.12 $ * $Date: 2009-06-02 08:40:12 $ * @author Jan Hauer * ======================================================================== */ /** * This module is responsible for channel scanning. */ #include "TKN154_MAC.h" module ScanP { provides { interface Init; interface MLME_SCAN; interface MLME_BEACON_NOTIFY; interface GetNow as IsRadioTokenRequested; } uses { interface MLME_GET; interface MLME_SET; interface EnergyDetection; interface RadioOff; interface RadioRx; interface RadioTx; interface IEEE154Frame as Frame; interface IEEE154BeaconFrame as BeaconFrame; interface Timer as ScanTimer; interface Pool as TxFramePool; interface Pool as TxControlPool; interface TransferableResource as RadioToken; interface FrameUtility; interface Leds; } } implementation { enum { MAX_PAYLOAD_SIZE = 1, LAST_CHANNEL = 26, }; #define INVALID_CHANNEL_BITMASK 0xFC000000L ieee154_txframe_t *m_txFrame = NULL; uint8_t m_payload[MAX_PAYLOAD_SIZE]; uint8_t m_scanType; uint32_t m_scanChannels; norace uint8_t m_currentChannelNum; bool m_terminateScan; void* m_resultList; uint8_t m_resultListNumEntries; uint8_t m_resultIndex; ieee154_macPANId_t m_PANID; norace uint32_t m_scanDuration; norace bool m_busy = FALSE; void nextIteration(); void continueScanRequest(); task void startTimerTask(); task void nextIterationTask(); command error_t Init.init() { // triggered by MLME_RESET; Note: Init will not be called // while this component owns the RadioToken, so the worst case is // that a MLME_SCAN was accepted (returned IEEE154_SUCCESS) // but the RadioToken.granted() has not been signalled if (m_busy) { m_terminateScan = TRUE; nextIteration(); // signals confirm and resets state } return SUCCESS; } /* ----------------------- MLME-SCAN ----------------------- */ /* "The MLME-SCAN.request primitive is used to initiate a channel scan over a * given list of channels. A device can use a channel scan to measure the * energy on the channel, search for the coordinator with which it associated, * or search for all coordinators transmitting beacon frames within the POS of * the scanning device." (IEEE 802.15.4-2006 Sect. 7.1.11.1) **/ command ieee154_status_t MLME_SCAN.request ( uint8_t ScanType, uint32_t ScanChannels, uint8_t ScanDuration, uint8_t ChannelPage, uint8_t EnergyDetectListNumEntries, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumEntries, ieee154_PANDescriptor_t* PANDescriptorList, ieee154_security_t *security) { ieee154_status_t status = IEEE154_SUCCESS; ieee154_phyChannelsSupported_t supportedChannels = call MLME_GET.phyChannelsSupported(); ieee154_txcontrol_t *txControl = NULL; if (m_busy) { status = IEEE154_SCAN_IN_PROGRESS; } else if (security && security->SecurityLevel) { status = IEEE154_UNSUPPORTED_SECURITY; } if ((ScanType > 3) || (ScanType < 3 && ScanDuration > 14) || (ChannelPage != IEEE154_SUPPORTED_CHANNELPAGE) || !(supportedChannels & ScanChannels) || ((ScanType != ORPHAN_SCAN) && ((EnergyDetectListNumEntries && PANDescriptorListNumEntries) || (EnergyDetectList != NULL && PANDescriptorList != NULL) || (EnergyDetectListNumEntries && EnergyDetectList == NULL) || (PANDescriptorListNumEntries && PANDescriptorList == NULL)))) { status = IEEE154_INVALID_PARAMETER; } else if ((ScanType == ACTIVE_SCAN || ScanType == ORPHAN_SCAN) && ((m_txFrame = call TxFramePool.get()) == NULL)) { status = IEEE154_TRANSACTION_OVERFLOW; } else if ((ScanType == ACTIVE_SCAN || ScanType == ORPHAN_SCAN) && ((txControl = call TxControlPool.get()) == NULL)) { call TxFramePool.put(m_txFrame); m_txFrame = NULL; status = IEEE154_TRANSACTION_OVERFLOW; } else { if (m_txFrame != NULL){ m_txFrame->header = &txControl->header; m_txFrame->payload = m_payload; m_txFrame->metadata = &txControl->metadata; } m_busy = TRUE; m_scanType = ScanType; m_scanChannels = ScanChannels; m_scanDuration = (((uint32_t) 1 << ScanDuration) + 1) * IEEE154_aBaseSuperframeDuration; m_PANID = call MLME_GET.macPANId(); m_currentChannelNum = 0; m_terminateScan = FALSE; m_resultIndex = 0; if (ScanType == ENERGY_DETECTION_SCAN) { m_resultList = EnergyDetectList; m_resultListNumEntries = EnergyDetectListNumEntries; } else { m_resultList = PANDescriptorList; m_resultListNumEntries = PANDescriptorListNumEntries; } if (m_resultList == NULL) m_resultListNumEntries = 0; call RadioToken.request(); } dbg_serial("ScanP", "MLME_SCAN.request -> result: %lu\n", (uint32_t) status); return status; } event void RadioToken.granted() { if (call RadioOff.isOff()) continueScanRequest(); else { error_t e = call RadioOff.off(); ASSERT(e == SUCCESS); } // will continue in continueScanRequest() } task void continueScanRequestTask() { continueScanRequest(); } void continueScanRequest() { uint8_t i; ieee154_macPANId_t bcastPANID = 0xFFFF; ieee154_macDSN_t dsn = call MLME_GET.macDSN(); if (!m_busy) { call RadioToken.release(); return; } switch (m_scanType) { case ACTIVE_SCAN: // beacon request frame m_txFrame->header->mhr[MHR_INDEX_FC1] = FC1_FRAMETYPE_CMD; m_txFrame->header->mhr[MHR_INDEX_FC2] = FC2_DEST_MODE_SHORT; m_txFrame->header->mhr[MHR_INDEX_SEQNO] = dsn; call MLME_SET.macDSN(dsn+1); for (i=0; i<4; i++) // broadcast dest PAN ID + broadcast dest addr m_txFrame->header->mhr[MHR_INDEX_ADDRESS + i] = 0xFF; m_txFrame->headerLen = 7; m_payload[0] = CMD_FRAME_BEACON_REQUEST; m_txFrame->payloadLen = 1; // fall through case PASSIVE_SCAN: call MLME_SET.macPANId(bcastPANID); break; case ORPHAN_SCAN: // orphan notification frame m_scanDuration = call MLME_GET.macResponseWaitTime() * IEEE154_aBaseSuperframeDuration; m_txFrame->header->mhr[MHR_INDEX_FC1] = FC1_FRAMETYPE_CMD | FC1_PAN_ID_COMPRESSION; m_txFrame->header->mhr[MHR_INDEX_FC2] = FC2_SRC_MODE_EXTENDED | FC2_DEST_MODE_SHORT; m_txFrame->header->mhr[MHR_INDEX_SEQNO] = dsn; call MLME_SET.macDSN(dsn+1); for (i=0; i<4; i++) // broadcast dest PAN ID + broadcast dest addr m_txFrame->header->mhr[MHR_INDEX_ADDRESS + i] = 0xFF; call FrameUtility.copyLocalExtendedAddressLE((uint8_t*) &(m_txFrame->header->mhr[MHR_INDEX_ADDRESS + i])); m_txFrame->headerLen = 15; m_payload[0] = CMD_FRAME_ORPHAN_NOTIFICATION; m_txFrame->payloadLen = 1; break; } nextIteration(); } void nextIteration() { ieee154_phyChannelsSupported_t supportedChannels = call MLME_GET.phyChannelsSupported(); uint32_t currentChannelBit = (uint32_t) 1 << m_currentChannelNum; error_t radioStatus = SUCCESS; if (!m_terminateScan){ while (m_currentChannelNum <= LAST_CHANNEL && !(m_scanChannels & currentChannelBit & supportedChannels)){ m_currentChannelNum++; currentChannelBit <<= 1; } } if (m_currentChannelNum <= LAST_CHANNEL && !m_terminateScan) { // scan the next channel call MLME_SET.phyCurrentChannel(m_currentChannelNum); dbg_serial("ScanP", "Scanning channel %lu...\n", (uint32_t) m_currentChannelNum); switch (m_scanType) { case PASSIVE_SCAN: radioStatus = call RadioRx.enableRx(0, 0); break; case ACTIVE_SCAN: // fall through case ORPHAN_SCAN: radioStatus = call RadioTx.transmit(m_txFrame, 0, 0); break; case ENERGY_DETECTION_SCAN: radioStatus = call EnergyDetection.start(m_scanDuration); break; } ASSERT(radioStatus == SUCCESS); } else { // we're done ieee154_status_t result = IEEE154_SUCCESS; uint32_t unscannedChannels = 0; if (m_terminateScan){ // Scan operation terminated because the max. // number of PAN descriptors/ED samples was reached. // Check if there are channels that were unscanned. // In active/passive scan we consider a channel // unscanned if it was not completely scanned. if (m_scanType == PASSIVE_SCAN || m_scanType == ACTIVE_SCAN) currentChannelBit >>= 1; // last (partially) scanned channel while (!(currentChannelBit & INVALID_CHANNEL_BITMASK) && (m_scanChannels & currentChannelBit)){ unscannedChannels |= currentChannelBit; currentChannelBit <<= 1; } if (unscannedChannels) // some channels were not (completely) scanned result = IEEE154_LIMIT_REACHED; } else if (m_scanType != ENERGY_DETECTION_SCAN && !m_resultIndex) result = IEEE154_NO_BEACON; if (m_scanType == PASSIVE_SCAN || m_scanType == ACTIVE_SCAN) call MLME_SET.macPANId(m_PANID); if (m_txFrame != NULL) { call TxControlPool.put((ieee154_txcontrol_t*) ((uint8_t*) m_txFrame->header - offsetof(ieee154_txcontrol_t, header))); call TxFramePool.put(m_txFrame); } m_txFrame = NULL; if (call RadioToken.isOwner()) call RadioToken.release(); m_busy = FALSE; dbg_serial("ScanP", "MLME_SCAN.confirm()\n"); signal MLME_SCAN.confirm ( result, m_scanType, IEEE154_SUPPORTED_CHANNELPAGE, unscannedChannels, (m_scanType == ENERGY_DETECTION_SCAN) ? m_resultIndex : 0, (m_scanType == ENERGY_DETECTION_SCAN) ? (int8_t*) m_resultList : NULL, ((m_scanType == ACTIVE_SCAN || m_scanType == PASSIVE_SCAN) && call MLME_GET.macAutoRequest()) ? m_resultIndex : 0, ((m_scanType == ACTIVE_SCAN || m_scanType == PASSIVE_SCAN) && call MLME_GET.macAutoRequest()) ? (ieee154_PANDescriptor_t*) m_resultList : NULL); } dbg_serial_flush(); } async event void RadioRx.enableRxDone() { post startTimerTask(); } /* ----------------------- EnergyDetection ----------------------- */ event void EnergyDetection.done(error_t status, int8_t EnergyLevel) { if (status == SUCCESS && m_resultListNumEntries) ((uint8_t*) m_resultList)[m_resultIndex++] = EnergyLevel; if (m_resultIndex == m_resultListNumEntries) m_terminateScan = TRUE; // done if (call RadioOff.off() == EALREADY) signal RadioOff.offDone(); } /* ----------------------- Active/Orphan scan ----------------------- */ async event void RadioTx.transmitDone(ieee154_txframe_t *frame, error_t result) { error_t e = call RadioRx.enableRx(0, 0); ASSERT(e == SUCCESS); } /* -------- Receive events (for Active/Passive/Orphan scan) -------- */ event message_t* RadioRx.received(message_t *frame) { if (!m_busy) return frame; if (m_scanType == ORPHAN_SCAN) { uint8_t *payload = call Frame.getPayload(frame); if (!m_resultIndex) if ((MHR(frame)[0] & FC1_FRAMETYPE_MASK) == FC1_FRAMETYPE_CMD && payload[0] == CMD_FRAME_COORDINATOR_REALIGNMENT) { // Sect. 7.5.4.3: "the device shall update its MAC PIB with the PAN // information contained in the coordinator realignment command" call MLME_SET.macPANId( *((nxle_uint16_t*) &payload[1]) ); call MLME_SET.macCoordShortAddress( *((nxle_uint16_t*) &payload[3]) ); call MLME_SET.phyCurrentChannel( *((nxle_uint16_t*) &payload[5]) ); call MLME_SET.macShortAddress( *((nxle_uint16_t*) &payload[6]) ); m_resultIndex++; dbg_serial("ScanP", "Received coordinator realignment frame.\n"); m_terminateScan = TRUE; call ScanTimer.stop(); call RadioOff.off(); } } else if ((((ieee154_header_t*) frame->header)->mhr[0] & FC1_FRAMETYPE_MASK) == FC1_FRAMETYPE_BEACON) { // PASSIVE_SCAN / ACTIVE_SCAN: // A beacon frame containing a non-empty payload is always signalled // to the next higher layer (regardless of the value of macAutoRequest); // when macAutoRequest is set to TRUE, then the beacon is always // stored in the PAN Descriptor list (see 7.1.11.2.1 - Table 68) if (!call MLME_GET.macAutoRequest()) return signal MLME_BEACON_NOTIFY.indication (frame); else if (m_resultIndex >= m_resultListNumEntries) { m_terminateScan = TRUE; call ScanTimer.stop(); call RadioOff.off(); } else if (call BeaconFrame.parsePANDescriptor( frame, m_currentChannelNum, IEEE154_SUPPORTED_CHANNELPAGE, &((ieee154_PANDescriptor_t*) m_resultList)[m_resultIndex]) == SUCCESS) { // check uniqueness: PAN ID and source address must // not be found in a previously received beacon uint8_t i; ieee154_PANDescriptor_t* descriptor = (ieee154_PANDescriptor_t*) m_resultList; dbg_serial("ScanP", "Received beacon, source: 0x%lx, channel: %lu.\n", (uint32_t) descriptor[m_resultIndex].CoordAddress.shortAddress, (uint32_t) m_currentChannelNum); for (i=0; i 0) return signal MLME_BEACON_NOTIFY.indication (frame); } // PASSIVE_SCAN / ACTIVE_SCAN return frame; } /* ----------------------- Common ----------------------- */ task void startTimerTask() { call ScanTimer.startOneShot(m_scanDuration); } event void ScanTimer.fired() { if (call RadioToken.isOwner()) call RadioOff.off(); } async event void RadioOff.offDone() { if (m_currentChannelNum == 0) post continueScanRequestTask(); else { m_currentChannelNum++; post nextIterationTask(); } } task void nextIterationTask() { nextIteration(); } async command token_requested_t IsRadioTokenRequested.getNow(){ return m_busy;} async event void RadioToken.transferredFrom(uint8_t id){ ASSERT(0);} default event message_t* MLME_BEACON_NOTIFY.indication (message_t *beaconFrame) {return beaconFrame;} default event void MLME_SCAN.confirm ( ieee154_status_t status, uint8_t ScanType, uint8_t ChannelPage, uint32_t UnscannedChannels, uint8_t EnergyDetectListNumEntries, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumEntries, ieee154_PANDescriptor_t* PANDescriptorList) {} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/SimpleTransferArbiterP.nc000066400000000000000000000135771207233610700240500ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Please refer to TEP 108 for more information about this component and its * intended use.

      * * This component provides the Resource, ArbiterInfo, and ResourceRequested * interfaces and uses the ResourceConfigure interface as * described in TEP 108. It provides arbitration to a shared resource. * An queue is used to keep track of which users have put * in requests for the resource. Upon the release of the resource by one * of these users, the queue is checked and the next user * that has a pending request will ge granted control of the resource. If * there are no pending requests, then the resource becomes idle and any * user can put in a request and immediately receive access to the * Resource. * * @author Kevin Klues (klues@tkn.tu-berlin.de) * @author Philip Levis * @author: Jan Hauer (added TransferableResource interface) */ generic module SimpleTransferArbiterP() { provides { interface TransferableResource as Resource[uint8_t id]; interface ResourceRequested[uint8_t id]; interface ArbiterInfo; } uses { interface ResourceConfigure[uint8_t id]; interface ResourceQueue as Queue; } } implementation { enum {RES_IDLE = 0, RES_GRANTING = 1, RES_BUSY = 2}; enum {NO_RES = 0xFF}; uint8_t state = RES_IDLE; norace uint8_t resId = NO_RES; norace uint8_t reqResId; task void grantedTask(); async command error_t Resource.request[uint8_t id]() { signal ResourceRequested.requested[resId](); atomic { if(state == RES_IDLE) { state = RES_GRANTING; reqResId = id; post grantedTask(); return SUCCESS; } return call Queue.enqueue(id); } } async command error_t Resource.immediateRequest[uint8_t id]() { signal ResourceRequested.immediateRequested[resId](); atomic { if(state == RES_IDLE) { state = RES_BUSY; resId = id; call ResourceConfigure.configure[resId](); return SUCCESS; } return FAIL; } } async command error_t Resource.release[uint8_t id]() { bool released = FALSE; atomic { if(state == RES_BUSY && resId == id) { if(call Queue.isEmpty() == FALSE) { reqResId = call Queue.dequeue(); state = RES_GRANTING; post grantedTask(); } else { resId = NO_RES; state = RES_IDLE; } released = TRUE; } } if(released == TRUE) { call ResourceConfigure.unconfigure[id](); return SUCCESS; } return FAIL; } async command error_t Resource.transferTo[uint8_t fromID](uint8_t toID) { atomic { if (call ArbiterInfo.userId() == fromID) { call ResourceConfigure.unconfigure[fromID](); call ResourceConfigure.configure[resId](); resId = toID; signal Resource.transferredFrom[toID](fromID); // consider moving this outside the atomic return SUCCESS; } } return FAIL; } /** Check if the Resource is currently in use */ async command bool ArbiterInfo.inUse() { atomic { if (state == RES_IDLE) return FALSE; } return TRUE; } /** Returns the current user of the Resource. If there is no current user, the return value will be 0xFF */ async command uint8_t ArbiterInfo.userId() { atomic { if(state != RES_BUSY) return NO_RES; return resId; } } /** * Returns whether you are the current owner of the resource or not */ async command bool Resource.isOwner[uint8_t id]() { atomic { if(resId == id && state == RES_BUSY) return TRUE; else return FALSE; } } task void grantedTask() { atomic { resId = reqResId; state = RES_BUSY; } call ResourceConfigure.configure[resId](); signal Resource.granted[resId](); } //Default event/command handlers default event void Resource.granted[uint8_t id]() { } default async event void ResourceRequested.requested[uint8_t id]() { } default async event void ResourceRequested.immediateRequested[uint8_t id]() { } default async command void ResourceConfigure.configure[uint8_t id]() { } default async command void ResourceConfigure.unconfigure[uint8_t id]() { } default async event void Resource.transferredFrom[uint8_t id](uint8_t c) { } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/TKN154.h000066400000000000000000000302361207233610700201650ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-09-14 12:17:18 $ * @author Jan Hauer * ======================================================================== */ #ifndef __TKN154_H #define __TKN154_H /**************************************************** * IEEE 802.15.4 Enumerations */ typedef enum ieee154_status { IEEE154_SUCCESS = 0x00, IEEE154_BEACON_LOSS = 0xE0, IEEE154_CHANNEL_ACCESS_FAILURE = 0xE1, IEEE154_COUNTER_ERROR = 0xDB, IEEE154_DENIED = 0xE2, IEEE154_DISABLE_TRX_FAILURE = 0xE3, IEEE154_FRAME_TOO_LONG = 0xE5, IEEE154_IMPROPER_KEY_TYPE = 0xDC, IEEE154_IMPROPER_SECURITY_LEVEL = 0xDD, IEEE154_INVALID_ADDRESS = 0xF5, IEEE154_INVALID_GTS = 0xE6, IEEE154_INVALID_HANDLE = 0xE7, IEEE154_INVALID_INDEX = 0xF9, IEEE154_INVALID_PARAMETER = 0xE8, IEEE154_LIMIT_REACHED = 0xFA, IEEE154_NO_ACK = 0xE9, IEEE154_NO_BEACON = 0xEA, IEEE154_NO_DATA = 0xEB, IEEE154_NO_SHORT_ADDRESS = 0xEC, IEEE154_ON_TIME_TOO_LONG = 0xF6, IEEE154_OUT_OF_CAP = 0xED, IEEE154_PAN_ID_CONFLICT = 0xEE, IEEE154_PAST_TIME = 0xF7, IEEE154_READ_ONLY = 0xFB, IEEE154_REALIGNMENT = 0xEF, IEEE154_SCAN_IN_PROGRESS = 0xFC, IEEE154_SECURITY_ERROR = 0xE4, //FAILED_SECURITY_CHECK = 0xE4 //802.15.4_2003 IEEE154_SUPERFRAME_OVERLAP = 0xFD, IEEE154_TRACKING_OFF = 0xF8, IEEE154_TRANSACTION_EXPIRED = 0xF0, IEEE154_TRANSACTION_OVERFLOW = 0xF1, IEEE154_TX_ACTIVE = 0xF2, IEEE154_UNAVAILABLE_KEY = 0xF3, IEEE154_UNSUPPORTED_ATTRIBUTE = 0xF4, IEEE154_UNSUPPORTED_LEGACY = 0xDE, IEEE154_UNSUPPORTED_SECURITY = 0xDF, IEEE154_PURGED = 0xDA, // custom attribute } ieee154_status_t; typedef enum ieee154_association_status { IEEE154_ASSOCIATION_SUCCESSFUL = 0x00, IEEE154_PAN_AT_CAPACITY = 0x01, IEEE154_ACCESS_DENIED = 0x02 } ieee154_association_status_t; typedef enum ieee154_disassociation_reason { IEEE154_COORDINATOR_WISHES_DEVICE_TO_LEAVE = 0x01, IEEE154_DEVICE_WISHES_TO_LEAVE = 0x02 } ieee154_disassociation_reason_t; typedef union ieee154_address { // Whether this is a short or extended address // depends on the respective addressing mode uint16_t shortAddress; uint64_t extendedAddress; } ieee154_address_t; typedef struct ieee154_security { // Whether the first 0, 4 or 8 byte of KeySource // are valid depends on the KeyIdMode parameter uint8_t SecurityLevel; uint8_t KeyIdMode; uint8_t KeySource[8]; uint8_t KeyIndex; } ieee154_security_t; typedef nx_struct { nxle_uint8_t AlternatePANCoordinator :1; nxle_uint8_t DeviceType :1; nxle_uint8_t PowerSource :1; nxle_uint8_t ReceiverOnWhenIdle :1; nxle_uint8_t Reserved :2; nxle_uint8_t SecurityCapability :1; nxle_uint8_t AllocateAddress :1; } ieee154_CapabilityInformation_t; typedef nx_struct { nxle_uint8_t BeaconOrder :4; nxle_uint8_t SuperframeOrder :4; nxle_uint8_t FinalCAPSlot :4; nxle_uint8_t BatteryLifeExtension :1; nxle_uint8_t Reserved :1; nxle_uint8_t PANCoordinator :1; nxle_uint8_t AssociationPermit :1; } ieee154_SuperframeSpec_t; typedef struct ieee154_PANDescriptor { uint8_t CoordAddrMode; uint16_t CoordPANId; ieee154_address_t CoordAddress; uint8_t LogicalChannel; uint8_t ChannelPage; ieee154_SuperframeSpec_t SuperframeSpec; bool GTSPermit; uint8_t LinkQuality; uint32_t TimeStamp; ieee154_status_t SecurityFailure; uint8_t SecurityLevel; uint8_t KeyIdMode; uint64_t KeySource; uint8_t KeyIndex; } ieee154_PANDescriptor_t; enum { // Values for the PANType parameter of the MLME_RESET.request primitive BEACON_ENABLED_PAN, NONBEACON_ENABLED_PAN, // Values for the TxOptions parameter of MCPS_DATA.request() TX_OPTIONS_ACK = 0x01, TX_OPTIONS_GTS = 0x02, TX_OPTIONS_INDIRECT = 0x04, // Values for Destination/Source Addressing Mode (MCPS_DATA.request(), etc.) ADDR_MODE_NOT_PRESENT = 0x00, ADDR_MODE_RESERVED = 0x01, ADDR_MODE_SHORT_ADDRESS = 0x02, ADDR_MODE_EXTENDED_ADDRESS = 0x03, // ScanType parameter for MLME-SCAN primitive ENERGY_DETECTION_SCAN = 0x00, ACTIVE_SCAN = 0x01, PASSIVE_SCAN = 0x02, ORPHAN_SCAN = 0x03, // Frame types FRAMETYPE_BEACON = 0x00, FRAMETYPE_DATA = 0x01, FRAMETYPE_ACK = 0x02, FRAMETYPE_CMD = 0x03, }; /**************************************************** * typedefs PIB value types */ typedef uint8_t ieee154_phyCurrentChannel_t; typedef uint32_t ieee154_phyChannelsSupported_t; typedef uint8_t ieee154_phyTransmitPower_t; typedef uint8_t ieee154_phyCCAMode_t; typedef uint8_t ieee154_phyCurrentPage_t; typedef uint16_t ieee154_phyMaxFrameDuration_t; typedef uint8_t ieee154_phySHRDuration_t; typedef uint8_t ieee154_phySymbolsPerOctet_t; typedef uint8_t ieee154_macAckWaitDuration_t; typedef bool ieee154_macAssociatedPANCoord_t; typedef bool ieee154_macAssociationPermit_t; typedef bool ieee154_macAutoRequest_t; typedef bool ieee154_macBattLifeExt_t; typedef uint8_t ieee154_macBattLifeExtPeriods_t; typedef uint8_t* ieee154_macBeaconPayload_t; typedef uint8_t ieee154_macBeaconPayloadLength_t; typedef uint8_t ieee154_macBeaconOrder_t; typedef uint32_t ieee154_macBeaconTxTime_t; typedef uint8_t ieee154_macBSN_t; typedef uint64_t ieee154_macCoordExtendedAddress_t; typedef uint16_t ieee154_macCoordShortAddress_t; typedef uint8_t ieee154_macDSN_t; typedef bool ieee154_macGTSPermit_t; typedef uint8_t ieee154_macMaxBE_t; typedef uint8_t ieee154_macMaxCSMABackoffs_t; typedef uint32_t ieee154_macMaxFrameTotalWaitTime_t; typedef uint8_t ieee154_macMaxFrameRetries_t; typedef uint8_t ieee154_macMinBE_t; typedef uint8_t ieee154_macMinLIFSPeriod_t; typedef uint8_t ieee154_macMinSIFSPeriod_t; typedef uint16_t ieee154_macPANId_t; typedef bool ieee154_macPromiscuousMode_t; typedef uint8_t ieee154_macResponseWaitTime_t; typedef bool ieee154_macRxOnWhenIdle_t; typedef bool ieee154_macSecurityEnabled_t; typedef uint16_t ieee154_macShortAddress_t; typedef uint8_t ieee154_macSuperframeOrder_t; typedef uint16_t ieee154_macSyncSymbolOffset_t; typedef bool ieee154_macTimestampSupported_t; typedef uint16_t ieee154_macTransactionPersistenceTime_t; // own typedefs typedef bool ieee154_macPanCoordinator_t; // When security is implemented the following line should be commented out #define IEEE154_SECURITY_DISABLED /**************************************************** * Flags for disabling MAC functionality (to save program memory) */ // Disable scanning (MLME_SCAN will fail): // #define IEEE154_SCAN_DISABLED // // Disable beacon tracking (MLME_SYNC will fail): // #define IEEE154_BEACON_SYNC_DISABLED // // Disable beacon transmission (MLME_START will fail): // #define IEEE154_BEACON_TX_DISABLED // // Disable promiscuous mode (PromiscuousMode.start() will fail): // #define IEEE154_PROMISCUOUS_MODE_DISABLED // // Disallow next higher layer to switch to receive mode (MLME_RX_ENABLE will fail): // #define IEEE154_RXENABLE_DISABLED // // Disable association (MLME_ASSOCIATE will fail): // #define IEEE154_ASSOCIATION_DISABLED // // Disable association (MLME_DISASSOCIATE will fail): // #define IEEE154_DISASSOCIATION_DISABLED // // Disable coordinator realignment (MLME_ORPHAN will fail): // #define IEEE154_COORD_REALIGNMENT_DISABLED // // Disable transmission of broadcasts from coordinator to devices: // #define IEEE154_COORD_BROADCAST_DISABLED // Disable indirect transmissions (MCPS_DATA.request with TX_OPTIONS_INDIRECT // and MLME_POLL will fail): // #define IEEE154_INDIRECT_TX_DISABLED // Disables support for active message layer frame format (saves some RAM) // #define TKN154_ACTIVE_MESSAGE_SUPPORT_DISABLED // Disable powerdown of the radio during inactive period (only relevant in // beacon-enabled mode), i.e. radio will remain idle and use more energy. This // would make sense, e.g. if BO=SO, because then there is no inactive period. // #define IEEE154_INACTIVE_PERIOD_POWERDOWN_DISABLED /**************************************************** * Static memory allocation for Queue/Pool */ // Command frames that are generated by the MAC in response to a user request // (such as MLME_ASSOCIATE.request()) are not statically allocated. Instead, // there is a pool of TXFRAME_POOL_SIZE frames shared among all MAC components, // i.e. the following macro defines an upper limit on the number of COMMAND // frames that the MAC may have instantiate in parallel. #ifndef TXCONTROL_POOL_SIZE #define TXCONTROL_POOL_SIZE 3 #endif // The MAC uses its own structure to represent frames that are to be // transmitted (e.g. this structure encapsulates the message_t). It is not // statically allocated, but a pool of those structure is shared among all MAC // components. The structure is used to encapsulate both, DATA and COMMAND // frames, so TXFRAME_POOL_SIZE should be at least TXCONTROL_POOL_SIZE, because // the MAC needs one such structure per each COMMAND frame it generates. If // you want to modify the number of DATA frames that the MAC can queue (by // default at least 1, see below "+ 1") before transmission then this is the // variable you need to change. #ifndef TXFRAME_POOL_SIZE #define TXFRAME_POOL_SIZE (TXCONTROL_POOL_SIZE + 1) #endif // The number of frames that the MAC can queue before they are transmitted // using (un-)slotted CSMA/CA algorithm. #ifndef CAP_TX_QUEUE_SIZE #define CAP_TX_QUEUE_SIZE TXFRAME_POOL_SIZE #endif // The number of indirect transmissions the MAC can queue (TX_OPTIONS_INDIRECT // flag was passed to MCPS_DATA.request()). #ifndef MAX_PENDING_ASSOC_RESPONSES #define MAX_PENDING_ASSOC_RESPONSES 7 #endif enum { // PHY sublayer constant needed to calculate mpdu size IEEE154_aMaxPHYPacketSize = 127, }; #endif // __TKN154_H tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/TKN154ActiveMessageP.nc000066400000000000000000000474531207233610700231300ustar00rootroot00000000000000/* * Copyright (c) 2011, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== * Author(s): Jan Hauer * ======================================================================== */ #include "AM.h" #include "TKN154.h" #include "TKN154_MAC.h" /* This module implements the Active Message abstraction over the * nonbeacon-enabled variant of the IEEE 802.15.4 MAC. Currently, when this * module is enabled (via SplitControl.start()) it makes sure that radio is * always in receive mode (unless we're transmitting), i.e. the * LowPowerListening interface is not yet implemented and the duty cycle is * 100%. * * The IEEE 802.15.4 frame format is different from the frame format used in * TinyOS. This module transparently converts between the two, to make both * sides happy: the upper layer in TinyOS will see the actual AM payload * starting at message_t->data, which allows briding between interfaces (so * apps like Oscilloscope are working). And before passing frames down to the * 15.4 MAC we make sure the AM type (and network byte) are moved to the MAC * payload portion (at message_t->data). This workaround and involves extra * memmoves, and will disappear once TinyOS introduces a new message buffer * abstraction. * * There are some TinyOS/CC2420 macros that are supported (e.g. set via CFLAGS * in the Makefile): TFRAMES_ENABLED, CC2420_DEF_CHANNEL, * CC2420_NO_ADDRESS_RECOGNITION, CC2420_NO_ACKNOWLEDGEMENTS **/ module TKN154ActiveMessageP { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; /* interface PacketTimeStamp as PacketTimeStamp32khz;*/ /* interface PacketTimeStamp as PacketTimeStampMilli;*/ /* interface LowPowerListening;*/ } uses { interface MLME_RESET; interface MCPS_DATA; interface MLME_SET; interface MLME_GET; interface IEEE154Frame as Frame; interface ActiveMessageAddress; interface Packet as SubPacket; interface State as SplitControlState; interface Leds; } } implementation { #ifdef TKN154_ACTIVE_MESSAGE_SUPPORT_DISABLED // When TKN154_ACTIVE_MESSAGE_SUPPORT_DISABLED is defined this component cannot // work, because it relies on some extra struct members which are disabled in // that case -> Make sure TKN154_ACTIVE_MESSAGE_SUPPORT_DISABLED is not defined! #error "TKN154_ACTIVE_MESSAGE_SUPPORT_DISABLED must not be defined if AM is used!" #endif enum { S_IDLE, S_STOPPED, S_STARTING, S_STARTED, S_STOPPING, }; enum { MAX_RX_ON_TIME = 0xFFFFFF, ADDRESS_NOT_PRESENT = 0, #ifndef TFRAMES_ENABLED PAYLOAD_OFFSET = 2, // 1 byte each for I-Frame byte + AM type #else PAYLOAD_OFFSET = 1, // 1 byte for AM type #endif T2_6LOWPAN_NETWORK_ID = 0x3f, // The 6LowPAN NALP ID for a TinyOS network (TEP 125) FC1_RESERVED_BIT = 0x80, FC2_RESERVED_BIT = 0x01, }; void updateLocalAddresses(); error_t status2Error(ieee154_status_t status) { switch (status) { case IEEE154_SUCCESS: return SUCCESS; case IEEE154_FRAME_TOO_LONG: return ESIZE; case IEEE154_NO_ACK: return ENOACK; break; case IEEE154_TRANSACTION_OVERFLOW: return EBUSY; case IEEE154_PURGED: return ECANCEL; case IEEE154_CHANNEL_ACCESS_FAILURE: // fall through default: return status; } } ieee154_header_t *getIeee154Header(message_t* m) { uint8_t *p = call Frame.getHeader(m); ieee154_header_t *header = (ieee154_header_t *) (p - offsetof(ieee154_header_t, mhr)); return header; } /**************** Functions dealing with ACKs ****************/ void setAckRequest(message_t *msg) { // We don't use Frame.getHeader() because this function // will be called from async context ieee154_header_t *hdr = (ieee154_header_t *) msg; uint8_t *fcf1 = &(((uint8_t*) hdr->mhr)[MHR_INDEX_FC1]); *fcf1 |= FC1_ACK_REQUEST; } void clearAckRequest(message_t *msg) { ieee154_header_t *hdr = (ieee154_header_t *) msg; uint8_t *fcf1 = &(((uint8_t*) hdr->mhr)[MHR_INDEX_FC1]); *fcf1 &= ~FC1_ACK_REQUEST; } bool isAckRequested(message_t *msg) { uint8_t *fcf1 = &(((uint8_t*) call Frame.getHeader(msg))[MHR_INDEX_FC1]); return (*fcf1 & FC1_ACK_REQUEST) ? TRUE : FALSE; } // We need to remember if a packet was acknowledeged, and use a // reserved flag in the 802.15.4 MAC header for that purpose bool wasAcked(message_t *msg) { ieee154_header_t *hdr = (ieee154_header_t *) msg; uint8_t *fcf2 = &(((uint8_t*) hdr->mhr)[MHR_INDEX_FC2]); return (*fcf2 & FC2_RESERVED_BIT) ? TRUE : FALSE; } void setWasAcked(message_t *msg) { uint8_t *fcf2 = &(((uint8_t*) call Frame.getHeader(msg))[MHR_INDEX_FC2]); *fcf2 |= FC2_RESERVED_BIT; } void clearWasAcked(message_t *msg) { uint8_t *fcf2 = &(((uint8_t*) call Frame.getHeader(msg))[MHR_INDEX_FC2]); *fcf2 &= ~FC2_RESERVED_BIT; } /***************** SplitControl & related commands ****************/ command error_t SplitControl.start() { if (call SplitControlState.requestState(S_STARTING) == SUCCESS) { error_t result = status2Error(call MLME_RESET.request(TRUE)); if (result != SUCCESS) call SplitControlState.toIdle(); return result; } else if (call SplitControlState.isState(S_STARTED)) { return EALREADY; } else if (call SplitControlState.isState(S_STARTING)) { return SUCCESS; } return EBUSY; } event void MLME_RESET.confirm(ieee154_status_t status) { error_t result = status2Error(status); if (result == SUCCESS) { // The MAC has been reset - we first set some radio parameters // in the way that the next TinyOS higher layer expects it // (as a reference we use the CC2420 stack) call MLME_SET.macDSN(0); // always start with seqno 0 (not random) updateLocalAddresses(); // sets source and PAN addresses #ifdef CC2420_DEF_CHANNEL call MLME_SET.phyCurrentChannel(CC2420_DEF_CHANNEL); #else call MLME_SET.phyCurrentChannel(26); #endif call MLME_SET.macAutoRequest(FALSE); call MLME_SET.macRxOnWhenIdle(TRUE); call SplitControlState.forceState(S_STARTED); signal SplitControl.startDone(SUCCESS); } if (result != SUCCESS) { // something went wrong -> reset state, signal error to upper layer if (call SplitControlState.isState(S_STARTING)) call SplitControlState.toIdle(); signal SplitControl.startDone(result); } else { // will continue in MLME_RX_ENABLE.confirm and signal startDone() there } } command error_t SplitControl.stop() { // The 15.4 MAC doesn't provide a stop command - instead we disable Rx and // switch state (MLME_RESET would be executed during next SplitControl.start()) if (call SplitControlState.isState(S_STARTED)) { call SplitControlState.forceState(S_IDLE); call MLME_SET.macRxOnWhenIdle(FALSE); signal SplitControl.stopDone(SUCCESS); return SUCCESS; } else if(call SplitControlState.isState(S_STOPPED)) { return EALREADY; } else if(call SplitControlState.isState(S_STOPPING)) { return SUCCESS; } return EBUSY; } void updateLocalAddresses() { call MLME_SET.macPANId(call ActiveMessageAddress.amGroup()); call MLME_SET.macShortAddress(call ActiveMessageAddress.amAddress()); } task void updateLocalAddressTask() { updateLocalAddresses(); } async event void ActiveMessageAddress.changed() { post updateLocalAddressTask(); } /***************** AMSend Commands ****************/ command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len) { uint8_t *p = call Frame.getPayload(msg); ieee154_address_t destAddr; uint8_t txOptions = 0; ieee154_status_t status; ieee154_header_t *header = getIeee154Header(msg); dbg_serial("TKN154ActiveMessageP", "AMSend.send AM_ID = %lu, addr = %lu\n", (uint32_t) id, (uint32_t) addr); dbg_serial_flush(); if (!call SplitControlState.isState(S_STARTED)) return EOFF; if (len > call AMSend.maxPayloadLength[id]()) return ESIZE; // Shift the payload and add the AM type + network byte, because in the // IEEE 802.15.4 these are part of the MAC payload, rather than MAC header // (as which message_t treats them). We do this, because we want to // support bridging between interfaces e.g. radio/serial. memmove(p + PAYLOAD_OFFSET, p, len); header->type = p[PAYLOAD_OFFSET-1] = header->type; #ifndef TFRAMES_ENABLED header->network = p[PAYLOAD_OFFSET-2] = T2_6LOWPAN_NETWORK_ID; #endif // We intentionally overwrite some previously set MAC header fields to // mimic the behavior of the standard CC2420 driver in TinyOS destAddr.shortAddress = addr; call Frame.setAddressingFields(msg, ADDR_MODE_SHORT_ADDRESS, ADDR_MODE_SHORT_ADDRESS, call ActiveMessageAddress.amGroup(), &destAddr, NULL); if (isAckRequested(msg) && addr != AM_BROADCAST_ADDR) txOptions = TX_OPTIONS_ACK; status = call MCPS_DATA.request(msg, len + PAYLOAD_OFFSET, 0, txOptions); dbg_serial("TKN154ActiveMessageP", "AMSend.send[%lu], status: %lx\n", (uint32_t) id, (uint32_t) status); dbg_serial_flush(); return status2Error(status); } command error_t AMSend.cancel[am_id_t id](message_t* msg) { // We don't support cancel(). There is the MCPS_PURGE interface, but it // would require that the next higher layer keeps track of the 'msduHandle' // and there's no such concept in TinyOS ... return FAIL; } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } /***************** AMPacket Commands ****************/ command am_addr_t AMPacket.address() { return call ActiveMessageAddress.amAddress(); } command am_addr_t AMPacket.destination(message_t* msg) { ieee154_address_t address; if (call Frame.getDstAddr(msg, &address) != SUCCESS) address.shortAddress = ADDRESS_NOT_PRESENT; // not present return address.shortAddress; } command void AMPacket.setSource(message_t* msg, am_addr_t addr) { // The 15.4 MAC doesn't allow to set the source address of a packet // explicitly, instead it will automatically set it to 'macShortAddress' // when the frame is passed down (Tx path) via MCPS_DATA.request(). // The next higher layer may still want to use setSource() and source() // to store some temporary data. We use a fixed offset, because the // TinyOS frame format is fixed... nxle_uint16_t *src = (nxle_uint16_t*) &(((uint8_t*) call Frame.getHeader(msg))[MHR_INDEX_ADDRESS + 4]); *src = addr; } command am_addr_t AMPacket.source(message_t* msg) { // see comment for AMPacket.setSource() return *((nxle_uint16_t*) &(((uint8_t*) call Frame.getHeader(msg))[MHR_INDEX_ADDRESS + 4])); } command void AMPacket.setDestination(message_t* msg, am_addr_t addr) { ieee154_address_t dstAddr; uint16_t panID = ADDRESS_NOT_PRESENT; // default call Frame.getDstPANId(msg, &panID); dstAddr.shortAddress = addr; call Frame.setAddressingFields(msg, ADDR_MODE_SHORT_ADDRESS, ADDR_MODE_SHORT_ADDRESS, panID, &dstAddr, NULL); } command bool AMPacket.isForMe(message_t* msg) { return (call AMPacket.destination(msg) == call AMPacket.address() || call AMPacket.destination(msg) == AM_BROADCAST_ADDR); } command am_id_t AMPacket.type(message_t* msg) { ieee154_header_t *header = getIeee154Header(msg); return header->type; } command void AMPacket.setType(message_t* msg, am_id_t type) { ieee154_header_t *header = getIeee154Header(msg); header->type = type; } command am_group_t AMPacket.group(message_t* msg) { uint16_t panID = ADDRESS_NOT_PRESENT; // default (if not set) call Frame.getDstPANId(msg, &panID); return panID; } command void AMPacket.setGroup(message_t* msg, am_group_t grp) { ieee154_address_t dstAddr; dstAddr.shortAddress = call AMPacket.destination(msg); call Frame.setAddressingFields(msg, call Frame.getSrcAddrMode(msg), call Frame.getDstAddrMode(msg), grp, &dstAddr, NULL); } command am_group_t AMPacket.localGroup() { return call ActiveMessageAddress.amGroup(); } async command error_t PacketAcknowledgements.requestAck( message_t* msg ) { setAckRequest(msg); return SUCCESS; } async command error_t PacketAcknowledgements.noAck( message_t* msg ) { clearAckRequest(msg); return SUCCESS; } async command bool PacketAcknowledgements.wasAcked(message_t* msg) { return wasAcked(msg); } /***************** Packet interface ****************/ command void Packet.clear(message_t* msg) { call SubPacket.clear(msg); } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call SubPacket.setPayloadLength(msg, len); } command uint8_t Packet.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg); } command uint8_t Packet.maxPayloadLength() { uint8_t len = call SubPacket.maxPayloadLength(); // TinyOS uses a static header of 9 byte. The maximum allowed // MAC payload is then 116. The MAC would signal an error later // (when you call MCPS_DATA.request()), which we must avoid... if (len > 116) len = 116; else if (len < PAYLOAD_OFFSET) return 0; // Reserve one (or two) byte for the AM type and network ID // (they are part of the IEEE 802.15.4 MAC payload, not header!) len -= PAYLOAD_OFFSET; return len; } command void* Packet.getPayload(message_t* msg, uint8_t len) { if (len > call Packet.maxPayloadLength()) return NULL; else return call Frame.getPayload(msg); } /***************** Timestamping ****************/ // TODO -> the Frame.getTimestamp() command will return a 62.5 KHz timestamp // which must be converted to 32 KHz or milli LocalTime. /* async command bool PacketTimeStamp32khz.isValid(message_t* msg);*/ /* async command uint32_t PacketTimeStamp32khz.timestamp(message_t* msg);*/ /* async command void PacketTimeStamp32khz.clear(message_t* msg);*/ /* async command void PacketTimeStamp32khz.set(message_t* msg, uint32_t value);*/ /* async command bool PacketTimeStampMilli.isValid(message_t* msg);*/ /* async command uint32_t PacketTimeStampMilli.timestamp(message_t* msg);*/ /* async command void PacketTimeStampMilli.clear(message_t* msg);*/ /* async command void PacketTimeStampMilli.set(message_t* msg, uint32_t value);*/ /***************** MCPS_DATA events ****************/ event void MCPS_DATA.confirm(message_t *frame, uint8_t msduHandle, ieee154_status_t status, uint32_t Timestamp) { void *payload = call Frame.getPayload(frame); uint8_t payloadLength = call Frame.getPayloadLength(frame); // Remember if this packet was acked because we might need this info later // (PacketAcknowledgements.wasAcked()): it was acked if the ACK_REQUEST // flag was set and the MCPS_DATA.confirm eventpacket had a status code // IEEE154_SUCCESS. if (isAckRequested(frame) && status == IEEE154_SUCCESS) setWasAcked(frame); else clearWasAcked(frame); // revert the memmove we did in MCPS_DATA.request() above memmove(payload, payload + PAYLOAD_OFFSET, payloadLength - PAYLOAD_OFFSET); call Packet.setPayloadLength(frame, payloadLength - PAYLOAD_OFFSET); dbg_serial("TKN154ActiveMessageP", "AMSend.sendDone[%lu], status: %lu\n", (uint32_t) call AMPacket.type(frame), (uint32_t) status); dbg_serial("TKN154ActiveMessageP", "... TxTime: %lu (valid: %lu)\n", Timestamp, (uint32_t) call Frame.isTimestampValid(frame)); signal AMSend.sendDone[call AMPacket.type(frame)](frame, status2Error(status)); dbg_serial_flush(); } event message_t* MCPS_DATA.indication ( message_t* frame ) { void *payload = call Frame.getPayload(frame); uint8_t payloadLen = call Frame.getPayloadLength(frame); ieee154_header_t *header = getIeee154Header(frame); // We have to be a bit careful here, because the MAC will accept frames that // in TinyOS a next higher layer does not expect -> filter those out if (!call Frame.hasStandardCompliantHeader(frame) || call Frame.getFrameType(frame) != 1) // must be a DATA frame return frame; header->type = ((uint8_t*) payload)[PAYLOAD_OFFSET-1]; #ifndef TFRAMES_ENABLED header->network = ((uint8_t*) payload)[PAYLOAD_OFFSET-2]; #endif // Shift the payload and add the AM type + network byte, because in the // IEEE 802.15.4 these are part of the MAC payload, rather than MAC header // (as which message_t treats them). We do this, because we want to // support bridging between interfaces e.g. radio/serial. payloadLen -= PAYLOAD_OFFSET; memmove(payload, payload + PAYLOAD_OFFSET, payloadLen); call Packet.setPayloadLength(frame, payloadLen); dbg_serial("TKN154ActiveMessageP", "MCPS_DATA.indication, AMtype: %lu, payloadlen: %lu\n", (uint32_t) call AMPacket.type(frame), (uint32_t) payloadLen); dbg_serial("TKN154ActiveMessageP", "... RxTime: %lu (valid: %lu)\n", (uint32_t) call Frame.getTimestamp(frame), (uint32_t) call Frame.isTimestampValid(frame)); dbg_serial_flush(); if (call AMPacket.isForMe(frame)) return signal Receive.receive[call AMPacket.type(frame)](frame, call AMSend.getPayload[call AMPacket.type(frame)](frame,0), payloadLen); else return signal Snoop.receive[call AMPacket.type(frame)](frame, call AMSend.getPayload[call AMPacket.type(frame)](frame,0), payloadLen); } /***************** Misc. / defaults ****************/ default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/TKN154BeaconEnabledP.nc000066400000000000000000000562321207233610700230450ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Jan Hauer */ #include "TKN154_PHY.h" #include "TKN154_MAC.h" #include "TKN154_PIB.h" #define IEEE154_BEACON_ENABLED_PAN TRUE configuration TKN154BeaconEnabledP { provides { /* MCPS-SAP */ interface MCPS_DATA; interface MCPS_PURGE; interface Packet; /* MLME-SAP */ interface MLME_ASSOCIATE; interface MLME_BEACON_NOTIFY; interface MLME_COMM_STATUS; interface MLME_DISASSOCIATE; interface MLME_GET; interface MLME_GTS; interface MLME_ORPHAN; interface MLME_POLL; interface MLME_RESET; interface MLME_RX_ENABLE; interface MLME_SCAN; interface MLME_SET; interface MLME_START; interface MLME_SYNC; interface MLME_SYNC_LOSS; interface Notify as PIBUpdate[uint8_t attributeID]; interface IEEE154Frame; interface IEEE154BeaconFrame; interface IEEE154TxBeaconPayload; interface SplitControl as PromiscuousMode; interface Get as GetLocalExtendedAddress; interface TimeCalc; interface FrameUtility; } uses { interface RadioRx; interface RadioTx; interface RadioOff; interface SlottedCsmaCa; interface EnergyDetection; interface SplitControl as PhySplitControl; interface Set as RadioPromiscuousMode; interface Alarm as Alarm1; interface Alarm as Alarm2; interface Alarm as Alarm3; interface Alarm as Alarm4; interface Alarm as Alarm5; interface Alarm as Alarm6; interface Alarm as Alarm7; interface Alarm as Alarm8; interface Alarm as Alarm9; interface Alarm as Alarm10; interface Alarm as Alarm11; interface Alarm as Alarm12; interface Alarm as Alarm13; interface Timer as Timer1; interface Timer as Timer2; interface Timer as Timer3; interface Timer as Timer4; interface Timer as Timer5; interface LocalTime; interface Random; interface Leds; } } implementation { components DataP, PibP, RadioControlP, #ifndef IEEE154_INDIRECT_TX_DISABLED IndirectTxP, PollP, #else NoIndirectTxP as IndirectTxP, NoPollP as PollP, #endif #ifndef IEEE154_SCAN_DISABLED ScanP, #else NoScanP as ScanP, #endif #ifndef IEEE154_ASSOCIATION_DISABLED AssociateP, #else NoAssociateP as AssociateP, #endif #ifndef IEEE154_DISASSOCIATION_DISABLED DisassociateP, #else NoDisassociateP as DisassociateP, #endif #ifndef IEEE154_BEACON_SYNC_DISABLED BeaconSynchronizeP, new DispatchQueueP() as DeviceCapQueue, new DispatchSlottedCsmaP(INCOMING_SUPERFRAME) as DeviceCap, #else NoBeaconSynchronizeP as BeaconSynchronizeP, new NoDispatchQueueP() as DeviceCapQueue, new NoDispatchSlottedCsmaP(INCOMING_SUPERFRAME) as DeviceCap, #endif #ifndef IEEE154_BEACON_TX_DISABLED BeaconTransmitP, new DispatchQueueP() as CoordCapQueue, new DispatchSlottedCsmaP(OUTGOING_SUPERFRAME) as CoordCap, #else NoBeaconTransmitP as BeaconTransmitP, new NoDispatchQueueP() as CoordCapQueue, new NoDispatchSlottedCsmaP(OUTGOING_SUPERFRAME) as CoordCap, #endif new InactivePeriodP(INCOMING_SUPERFRAME) as DeviceInactivePeriod, new InactivePeriodP(OUTGOING_SUPERFRAME) as CoordInactivePeriod, #ifndef IEEE154_RXENABLE_DISABLED RxEnableP, #else NoRxEnableP as RxEnableP, #endif #ifndef IEEE154_PROMISCUOUS_MODE_DISABLED PromiscuousModeP, #else NoPromiscuousModeP as PromiscuousModeP, #endif #ifndef IEEE154_COORD_REALIGNMENT_DISABLED CoordRealignmentP, #else NoCoordRealignmentP as CoordRealignmentP, #endif #ifndef IEEE154_COORD_BROADCAST_DISABLED CoordBroadcastP, #else NoCoordBroadcastP as CoordBroadcastP, #endif #if defined(IEEE154_GTS_COORD_ENABLED) && defined(IEEE154_GTS_DEVICE_ENABLED) #error "You must not define both IEEE154_GTS_COORD_ENABLED and IEEE154_GTS_DEVICE_ENABLED!" #endif #ifdef IEEE154_GTS_COORD_ENABLED CoordCfpP as CoordCfp, #else NoCoordCfpP as CoordCfp, #endif #ifdef IEEE154_GTS_DEVICE_ENABLED DeviceCfpP as DeviceCfp, #else NoDeviceCfpP as DeviceCfp, #endif new PoolC(ieee154_txframe_t, TXFRAME_POOL_SIZE) as TxFramePoolP, new PoolC(ieee154_txcontrol_t, TXCONTROL_POOL_SIZE) as TxControlPoolP, new QueueC(ieee154_txframe_t*, CAP_TX_QUEUE_SIZE) as DeviceCapQueueC, new QueueC(ieee154_txframe_t*, CAP_TX_QUEUE_SIZE) as CoordCapQueueC, new QueueC(ieee154_txframe_t*, CAP_TX_QUEUE_SIZE) as BroadcastQueueC; components MainC; /* MCPS */ MCPS_DATA = DataP; MCPS_PURGE = DataP; /* MLME */ MLME_START = BeaconTransmitP; MLME_ASSOCIATE = AssociateP; MLME_DISASSOCIATE = DisassociateP; MLME_BEACON_NOTIFY = BeaconSynchronizeP; MLME_BEACON_NOTIFY = ScanP; MLME_COMM_STATUS = AssociateP; MLME_COMM_STATUS = CoordRealignmentP; MLME_GET = PibP; MLME_ORPHAN = CoordRealignmentP; MLME_POLL = PollP; MLME_RESET = PibP; MLME_RX_ENABLE = RxEnableP; MLME_SCAN = ScanP; MLME_SET = PibP; MLME_SYNC = BeaconSynchronizeP; MLME_SYNC_LOSS = BeaconSynchronizeP; #ifdef IEEE154_GTS_COORD_ENABLED MLME_GTS = CoordCfp; #else MLME_GTS = DeviceCfp; #endif IEEE154Frame = PibP; IEEE154BeaconFrame = PibP; PromiscuousMode = PromiscuousModeP; GetLocalExtendedAddress = PibP.GetLocalExtendedAddress; IEEE154TxBeaconPayload = BeaconTransmitP; Packet = PibP; TimeCalc = PibP; FrameUtility = PibP; /* ----------------------- Scanning (MLME-SCAN) ----------------------- */ components new RadioClientC(RADIO_CLIENT_SCAN) as ScanRadioClient; PibP.MacReset -> ScanP; ScanP.MLME_GET -> PibP; ScanP.MLME_SET -> PibP.MLME_SET; ScanP.EnergyDetection = EnergyDetection; ScanP.RadioRx -> ScanRadioClient; ScanP.RadioTx -> ScanRadioClient; ScanP.Frame -> PibP; ScanP.BeaconFrame -> PibP; ScanP.RadioOff -> ScanRadioClient; ScanP.ScanTimer = Timer1; ScanP.TxFramePool -> TxFramePoolP; ScanP.TxControlPool -> TxControlPoolP; ScanP.RadioToken -> ScanRadioClient; ScanP.Leds = Leds; ScanP.FrameUtility -> PibP; /* ----------------- Beacon Transmission (MLME-START) ----------------- */ components new RadioClientC(RADIO_CLIENT_BEACONTRANSMIT) as BeaconTxRadioClient; PibP.MacReset -> BeaconTransmitP; BeaconTransmitP.PIBUpdate[IEEE154_macAssociationPermit] -> PibP.PIBUpdate[IEEE154_macAssociationPermit]; BeaconTransmitP.PIBUpdate[IEEE154_macGTSPermit] -> PibP.PIBUpdate[IEEE154_macGTSPermit]; BeaconTransmitP.BeaconSendAlarm = Alarm1; BeaconTransmitP.BeaconPayloadUpdateTimer = Timer2; BeaconTransmitP.RadioOff -> BeaconTxRadioClient; BeaconTransmitP.BeaconTx -> BeaconTxRadioClient; BeaconTransmitP.MLME_SET -> PibP.MLME_SET; BeaconTransmitP.MLME_GET -> PibP; BeaconTransmitP.SetMacSuperframeOrder -> PibP.SetMacSuperframeOrder; BeaconTransmitP.SetMacBeaconTxTime -> PibP.SetMacBeaconTxTime; BeaconTransmitP.SetMacPanCoordinator -> PibP.SetMacPanCoordinator; BeaconTransmitP.RadioToken -> BeaconTxRadioClient; BeaconTransmitP.RealignmentBeaconEnabledTx -> CoordBroadcastP.RealignmentTx; BeaconTransmitP.RealignmentNonBeaconEnabledTx -> CoordCapQueue.FrameTx[unique(CAP_TX_CLIENT)]; BeaconTransmitP.BeaconRequestRx -> CoordCap.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_BEACON_REQUEST]; BeaconTransmitP.GtsInfoWrite -> CoordCfp.GtsInfoWrite; BeaconTransmitP.PendingAddrSpecUpdated -> IndirectTxP.PendingAddrSpecUpdated; BeaconTransmitP.PendingAddrWrite -> IndirectTxP.PendingAddrWrite; BeaconTransmitP.GtsSpecUpdated -> CoordCfp.GtsSpecUpdated; BeaconTransmitP.FrameUtility -> PibP.FrameUtility; BeaconTransmitP.IsTrackingBeacons -> BeaconSynchronizeP.IsTrackingBeacons; BeaconTransmitP.IncomingSF -> BeaconSynchronizeP.IncomingSF; BeaconTransmitP.GetSetRealignmentFrame -> CoordRealignmentP; BeaconTransmitP.IsBroadcastReady -> CoordBroadcastP.IsBroadcastReady; BeaconTransmitP.TimeCalc -> PibP; BeaconTransmitP.Random = Random; BeaconTransmitP.Leds = Leds; /* ------------------ Beacon Tracking (MLME-SYNC) ------------------ */ components new RadioClientC(RADIO_CLIENT_BEACONSYNCHRONIZE) as SyncRadioClient; PibP.MacReset -> BeaconSynchronizeP; BeaconSynchronizeP.MLME_SET -> PibP.MLME_SET; BeaconSynchronizeP.MLME_GET -> PibP; BeaconSynchronizeP.TrackAlarm = Alarm2; BeaconSynchronizeP.FrameUtility -> PibP; BeaconSynchronizeP.Frame -> PibP; BeaconSynchronizeP.BeaconFrame -> PibP; BeaconSynchronizeP.BeaconRx -> SyncRadioClient; BeaconSynchronizeP.RadioOff -> SyncRadioClient; BeaconSynchronizeP.DataRequest -> PollP.DataRequest[SYNC_POLL_CLIENT]; BeaconSynchronizeP.RadioToken -> SyncRadioClient; BeaconSynchronizeP.TimeCalc -> PibP; BeaconSynchronizeP.CoordRealignmentRx -> DeviceCap.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_COORDINATOR_REALIGNMENT]; BeaconSynchronizeP.Leds = Leds; /* -------------------- Association (MLME-ASSOCIATE) -------------------- */ PibP.MacReset -> AssociateP; AssociateP.AssociationRequestRx -> CoordCap.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_ASSOCIATION_REQUEST]; AssociateP.AssociationRequestTx -> DeviceCapQueue.FrameTx[unique(CAP_TX_CLIENT)]; AssociateP.AssociationResponseExtracted -> DeviceCap.FrameExtracted[FC1_FRAMETYPE_CMD + CMD_FRAME_ASSOCIATION_RESPONSE]; AssociateP.AssociationResponseTx -> IndirectTxP.FrameTx[unique(INDIRECT_TX_CLIENT)]; AssociateP.DataRequest -> PollP.DataRequest[ASSOCIATE_POLL_CLIENT]; AssociateP.ResponseTimeout = Timer3; AssociateP.TxFramePool -> TxFramePoolP; AssociateP.TxControlPool -> TxControlPoolP; AssociateP.MLME_GET -> PibP; AssociateP.MLME_SET -> PibP.MLME_SET; AssociateP.FrameUtility -> PibP; AssociateP.Frame -> PibP; AssociateP.LocalExtendedAddress -> PibP.GetLocalExtendedAddress; /* --------------- Disassociation (MLME-DISASSOCIATE) --------------- */ PibP.MacReset -> DisassociateP; DisassociateP.DisassociationIndirectTx -> IndirectTxP.FrameTx[unique(INDIRECT_TX_CLIENT)]; DisassociateP.DisassociationDirectTx -> CoordCapQueue.FrameTx[unique(CAP_TX_CLIENT)]; DisassociateP.DisassociationToCoord -> DeviceCapQueue.FrameTx[unique(CAP_TX_CLIENT)]; DisassociateP.DisassociationDirectRxFromCoord -> DeviceCap.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_DISASSOCIATION_NOTIFICATION]; DisassociateP.DisassociationExtractedFromCoord -> DeviceCap.FrameExtracted[FC1_FRAMETYPE_CMD + CMD_FRAME_DISASSOCIATION_NOTIFICATION]; DisassociateP.DisassociationRxFromDevice -> CoordCap.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_DISASSOCIATION_NOTIFICATION]; DisassociateP.TxFramePool -> TxFramePoolP; DisassociateP.TxControlPool -> TxControlPoolP; DisassociateP.MLME_GET -> PibP; DisassociateP.MLME_SET -> PibP; DisassociateP.FrameUtility -> PibP; DisassociateP.Frame -> PibP; DisassociateP.LocalExtendedAddress -> PibP.GetLocalExtendedAddress; /* ------------------ Data Transmission (MCPS-DATA) ------------------- */ DataP.CoordCapRx -> CoordCap.FrameRx[FC1_FRAMETYPE_DATA]; DataP.DeviceCapTx -> DeviceCapQueue.FrameTx[unique(CAP_TX_CLIENT)]; DataP.CoordCapTx -> CoordCapQueue.FrameTx[unique(CAP_TX_CLIENT)]; DataP.DeviceCapRx -> PollP.DataRx; DataP.DeviceCapRx -> PromiscuousModeP.FrameRx; DataP.DeviceCapRx -> DeviceCap.FrameRx[FC1_FRAMETYPE_DATA]; DataP.TxFramePool -> TxFramePoolP; DataP.BroadcastTx -> CoordBroadcastP.BroadcastDataFrame; DataP.DeviceCfpTx -> DeviceCfp.CfpTx; DataP.CoordCfpTx -> CoordCfp.CfpTx; DataP.DeviceCfpRx -> DeviceCfp.FrameRx; DataP.CoordCfpRx -> CoordCfp.FrameRx; DataP.IndirectTx -> IndirectTxP.FrameTx[unique(INDIRECT_TX_CLIENT)]; DataP.FrameUtility -> PibP; DataP.Frame -> PibP; DataP.PurgeDirect -> DeviceCapQueue; DataP.PurgeIndirect -> IndirectTxP; DataP.PurgeGtsDevice -> DeviceCfp; DataP.PurgeGtsCoord -> CoordCfp; DataP.MLME_GET -> PibP; DataP.Packet -> PibP; DataP.Leds = Leds; /* ------------------------ Polling (MLME-POLL) ----------------------- */ PibP.MacReset -> PollP; PollP.PollTx -> DeviceCapQueue.FrameTx[unique(CAP_TX_CLIENT)]; PollP.DataExtracted -> DeviceCap.FrameExtracted[FC1_FRAMETYPE_DATA]; PollP.FrameUtility -> PibP; PollP.TxFramePool -> TxFramePoolP; PollP.TxControlPool -> TxControlPoolP; PollP.MLME_GET -> PibP; PollP.LocalExtendedAddress -> PibP.GetLocalExtendedAddress; /* ---------------------- Indirect transmission ----------------------- */ PibP.MacReset -> IndirectTxP; IndirectTxP.CoordCapTx -> CoordCapQueue.FrameTx[unique(CAP_TX_CLIENT)]; IndirectTxP.DataRequestRx -> CoordCap.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_DATA_REQUEST]; IndirectTxP.MLME_GET -> PibP; IndirectTxP.IEEE154Frame -> PibP; IndirectTxP.IndirectTxTimeout = Timer4; IndirectTxP.TimeCalc -> PibP; IndirectTxP.Leds = Leds; /* ---------------------------- Realignment --------------------------- */ PibP.MacReset -> CoordRealignmentP; CoordRealignmentP.CoordRealignmentTx -> CoordCapQueue.FrameTx[unique(CAP_TX_CLIENT)]; CoordRealignmentP.OrphanNotificationRx -> CoordCap.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_ORPHAN_NOTIFICATION]; CoordRealignmentP.FrameUtility -> PibP; CoordRealignmentP.Frame -> PibP; CoordRealignmentP.TxFramePool -> TxFramePoolP; CoordRealignmentP.TxControlPool -> TxControlPoolP; CoordRealignmentP.MLME_GET -> PibP; CoordRealignmentP.LocalExtendedAddress -> PibP.GetLocalExtendedAddress; /* ---------------------------- Broadcasts ---------------------------- */ components new RadioClientC(RADIO_CLIENT_COORDBROADCAST) as CoordBroadcastRadioClient; PibP.MacReset -> CoordBroadcastP; CoordBroadcastP.RadioToken -> CoordBroadcastRadioClient; CoordBroadcastP.OutgoingSF -> BeaconTransmitP.OutgoingSF; CoordBroadcastP.CapTransmitNow -> CoordCap.BroadcastTx; CoordBroadcastP.Queue -> BroadcastQueueC; /* --------------------- CAP (incoming superframe) -------------------- */ PibP.DispatchQueueReset -> DeviceCapQueue; DeviceCapQueue.Queue -> DeviceCapQueueC; DeviceCapQueue.FrameTxCsma -> DeviceCap; PibP.DispatchQueueReset -> CoordCapQueue; CoordCapQueue.Queue -> CoordCapQueueC; CoordCapQueue.FrameTxCsma -> CoordCap; components new RadioClientC(RADIO_CLIENT_DEVICECAP) as DeviceCapRadioClient; PibP.DispatchReset -> DeviceCap; DeviceCap.CapEndAlarm = Alarm3; DeviceCap.BLEAlarm = Alarm4; DeviceCap.RxWaitAlarm = Alarm5; DeviceCap.RadioToken -> DeviceCapRadioClient; DeviceCap.RadioTokenRequested -> DeviceCapRadioClient; DeviceCap.SuperframeStructure -> BeaconSynchronizeP.IncomingSF; DeviceCap.IsRxEnableActive -> RxEnableP.IsRxEnableActive; DeviceCap.IsRadioTokenRequested -> PibP.IsRadioTokenRequested; // fan out... DeviceCap.IsRadioTokenRequested -> PromiscuousModeP.IsRadioTokenRequested; DeviceCap.IsRadioTokenRequested -> ScanP.IsRadioTokenRequested; DeviceCap.GetIndirectTxFrame -> IndirectTxP; DeviceCap.RxEnableStateChange -> RxEnableP.RxEnableStateChange; DeviceCap.IsTrackingBeacons -> BeaconSynchronizeP.IsTrackingBeacons; DeviceCap.PIBUpdateMacRxOnWhenIdle -> PibP.PIBUpdate[IEEE154_macRxOnWhenIdle]; DeviceCap.FrameUtility -> PibP; DeviceCap.SlottedCsmaCa -> DeviceCapRadioClient; DeviceCap.RadioRx -> DeviceCapRadioClient; DeviceCap.RadioOff -> DeviceCapRadioClient; DeviceCap.MLME_GET -> PibP; DeviceCap.MLME_SET -> PibP.MLME_SET; DeviceCap.TimeCalc -> PibP; DeviceCap.Leds = Leds; DeviceCap.TrackSingleBeacon -> BeaconSynchronizeP.TrackSingleBeacon; DeviceCap.MLME_SYNC_LOSS -> BeaconSynchronizeP; /* ---------------------- CAP (outgoing superframe) ------------------- */ components new RadioClientC(RADIO_CLIENT_COORDCAP) as CoordCapRadioClient, new BackupP(ieee154_cap_frame_backup_t); PibP.DispatchReset -> CoordCap; CoordCap.CapEndAlarm = Alarm6; CoordCap.BLEAlarm = Alarm7; CoordCap.RadioToken -> CoordCapRadioClient; CoordCap.RadioTokenRequested -> CoordCapRadioClient; CoordCap.SuperframeStructure -> BeaconTransmitP.OutgoingSF; CoordCap.IsRxEnableActive -> RxEnableP.IsRxEnableActive; CoordCap.IsRadioTokenRequested -> PibP.IsRadioTokenRequested; // fan out... CoordCap.IsRadioTokenRequested -> PromiscuousModeP.IsRadioTokenRequested; CoordCap.IsRadioTokenRequested -> ScanP.IsRadioTokenRequested; CoordCap.GetIndirectTxFrame -> IndirectTxP; CoordCap.RxEnableStateChange -> RxEnableP.RxEnableStateChange; CoordCap.IsTrackingBeacons -> BeaconSynchronizeP.IsTrackingBeacons; CoordCap.PIBUpdateMacRxOnWhenIdle -> PibP.PIBUpdate[IEEE154_macRxOnWhenIdle]; CoordCap.FrameUtility -> PibP; CoordCap.SlottedCsmaCa -> CoordCapRadioClient; CoordCap.RadioRx -> CoordCapRadioClient; CoordCap.RadioOff -> CoordCapRadioClient; CoordCap.MLME_GET -> PibP; CoordCap.MLME_SET -> PibP.MLME_SET; CoordCap.TimeCalc -> PibP; CoordCap.Leds = Leds; CoordCap.FrameBackup -> BackupP; CoordCap.FrameRestore -> BackupP; /* -------------------- GTS (incoming superframe) --------------------- */ components new RadioClientC(RADIO_CLIENT_DEVICECFP) as DeviceCfpRadioClient; PibP.MacReset -> DeviceCfp; DeviceCfp.RadioToken -> DeviceCfpRadioClient; DeviceCfp.IncomingSF -> BeaconSynchronizeP.IncomingSF; DeviceCfp.CfpSlotAlarm = Alarm8; DeviceCfp.CfpEndAlarm = Alarm9; DeviceCfp.RadioTx -> DeviceCfpRadioClient; DeviceCfp.RadioRx -> DeviceCfpRadioClient; DeviceCfp.RadioOff -> DeviceCfpRadioClient; DeviceCfp.MLME_GET -> PibP; DeviceCfp.MLME_SET -> PibP.MLME_SET; DeviceCfp.GTSrequestTx -> DeviceCapQueue.FrameTx[unique(CAP_TX_CLIENT)]; DeviceCfp.TxFramePool -> TxFramePoolP; DeviceCfp.TxControlPool -> TxControlPoolP; DeviceCfp.FrameUtility -> PibP; /* -------------------- GTS (outgoing superframe) --------------------- */ components new RadioClientC(RADIO_CLIENT_COORDCFP) as CoordCfpRadioClient; PibP.MacReset -> CoordCfp; CoordCfp.RadioToken -> CoordCfpRadioClient; CoordCfp.OutgoingSF -> BeaconTransmitP.OutgoingSF; CoordCfp.CfpSlotAlarm = Alarm10; CoordCfp.CfpEndAlarm = Alarm11; CoordCfp.RadioTx -> CoordCfpRadioClient; CoordCfp.RadioRx -> CoordCfpRadioClient; CoordCfp.RadioOff -> CoordCfpRadioClient; CoordCfp.MLME_GET -> PibP; CoordCfp.MLME_SET -> PibP.MLME_SET; CoordCfp.GtsRequestRx -> CoordCap.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_GTS_REQUEST]; CoordCfp.Frame -> PibP; /* --------------- Inactive Period (incoming superframe) -------------- */ components new RadioClientC(RADIO_CLIENT_DEVICE_INACTIVE_PERIOD) as DeviceInactivePeriodClient; DeviceInactivePeriod.RadioToken -> DeviceInactivePeriodClient; DeviceInactivePeriod.Alarm = Alarm12; DeviceInactivePeriod.RadioControl = PhySplitControl; DeviceInactivePeriod.SF -> BeaconSynchronizeP.IncomingSF; DeviceInactivePeriod.IsEmbedded -> BeaconTransmitP.IsSendingBeacons; DeviceInactivePeriod.RadioOff -> DeviceInactivePeriodClient; DeviceInactivePeriod.MLME_GET -> PibP; DeviceInactivePeriod.TimeCalc -> PibP; /* --------------- Inactive Period (outgoing superframe) -------------- */ components new RadioClientC(RADIO_CLIENT_COORD_INACTIVE_PERIOD) as CoordInactivePeriodClient; CoordInactivePeriod.RadioToken -> CoordInactivePeriodClient; CoordInactivePeriod.Alarm = Alarm13; CoordInactivePeriod.RadioControl = PhySplitControl; CoordInactivePeriod.SF -> BeaconTransmitP.OutgoingSF; CoordInactivePeriod.IsEmbedded -> BeaconSynchronizeP.IsTrackingBeacons; CoordInactivePeriod.RadioOff -> CoordInactivePeriodClient; CoordInactivePeriod.MLME_GET -> PibP; CoordInactivePeriod.TimeCalc -> PibP; /* -------------------------- promiscuous mode ------------------------ */ components new RadioClientC(RADIO_CLIENT_PROMISCUOUSMODE) as PromiscuousModeRadioClient; PibP.MacReset -> PromiscuousModeP; PromiscuousModeP.RadioToken -> PromiscuousModeRadioClient; PromiscuousModeP.PromiscuousRx -> PromiscuousModeRadioClient; PromiscuousModeP.RadioOff -> PromiscuousModeRadioClient; PromiscuousModeP.RadioPromiscuousMode = RadioPromiscuousMode; /* --------------------------- MLME-RX-ENABLE ------------------------ */ PibP.MacReset -> RxEnableP; RxEnableP.IncomingSuperframeStructure -> BeaconSynchronizeP; RxEnableP.OutgoingSuperframeStructure -> BeaconTransmitP; RxEnableP.IsTrackingBeacons -> BeaconSynchronizeP.IsTrackingBeacons; RxEnableP.IsSendingBeacons-> BeaconTransmitP.IsSendingBeacons; RxEnableP.TimeCalc -> PibP.TimeCalc; RxEnableP.WasRxEnabled -> DeviceCap.WasRxEnabled; RxEnableP.WasRxEnabled -> CoordCap.WasRxEnabled; RxEnableP.RxEnableTimer = Timer5; /* ------------------------------- PIB -------------------------------- */ components new RadioClientC(RADIO_CLIENT_PIB) as PibRadioClient; PIBUpdate = PibP; MainC.SoftwareInit -> PibP.LocalInit; PibP.RadioControl = PhySplitControl; PibP.Random = Random; PibP.PromiscuousModeGet -> PromiscuousModeP; PibP.LocalTime = LocalTime; PibP.RadioToken -> PibRadioClient; PibP.RadioOff -> PibRadioClient; /* ------------------------- Radio Control ---------------------------- */ RadioControlP.PhyTx = RadioTx; RadioControlP.PhySlottedCsmaCa = SlottedCsmaCa; RadioControlP.PhyRx = RadioRx; RadioControlP.PhyRadioOff = RadioOff; RadioControlP.RadioPromiscuousMode -> PromiscuousModeP; RadioControlP.Leds = Leds; } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/TKN154NonBeaconEnabledP.nc000066400000000000000000000324511207233610700235150ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.10 $ * $Date: 2009-10-16 12:25:46 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_PHY.h" #include "TKN154_MAC.h" #include "TKN154_PIB.h" #define IEEE154_BEACON_ENABLED_PAN FALSE configuration TKN154NonBeaconEnabledP { provides { /* MCPS-SAP */ interface MCPS_DATA; interface MCPS_PURGE; interface Packet; /* MLME-SAP */ interface MLME_ASSOCIATE; interface MLME_BEACON_NOTIFY; interface MLME_COMM_STATUS; interface MLME_DISASSOCIATE; interface MLME_GET; interface MLME_ORPHAN; interface MLME_POLL; interface MLME_RESET; interface MLME_RX_ENABLE; interface MLME_SCAN; interface MLME_SET; interface MLME_START; interface Notify as PIBUpdate[uint8_t attributeID]; interface IEEE154Frame; interface IEEE154BeaconFrame; interface IEEE154TxBeaconPayload; interface SplitControl as PromiscuousMode; interface Get as GetLocalExtendedAddress; interface TimeCalc; interface FrameUtility; } uses { interface RadioRx; interface RadioTx; interface RadioOff; interface UnslottedCsmaCa; interface EnergyDetection; interface SplitControl as PhySplitControl; interface Set as RadioPromiscuousMode; interface Timer as Timer1; interface Timer as Timer2; interface Timer as Timer3; interface Timer as Timer4; interface Timer as Timer5; interface LocalTime; interface Random; interface Leds; } } implementation { components DataP, PibP, RadioControlP, DispatchUnslottedCsmaP as DispatchP, #if CAP_TX_QUEUE_SIZE == 1 new NoDispatchQueueP() as DispatchQueueP, #else new DispatchQueueP() as DispatchQueueP, #endif #ifndef IEEE154_INDIRECT_TX_DISABLED IndirectTxP, PollP, #else NoIndirectTxP as IndirectTxP, NoPollP as PollP, #endif #ifndef IEEE154_SCAN_DISABLED ScanP, BeaconRequestRxP, #else NoScanP as ScanP, NoBeaconRequestRxP as BeaconRequestRxP, #endif #ifndef IEEE154_ASSOCIATION_DISABLED AssociateP, #else NoAssociateP as AssociateP, #endif #ifndef IEEE154_DISASSOCIATION_DISABLED DisassociateP, #else NoDisassociateP as DisassociateP, #endif #ifndef IEEE154_RXENABLE_DISABLED RxEnableP, #else NoRxEnableP as RxEnableP, #endif #ifndef IEEE154_PROMISCUOUS_MODE_DISABLED PromiscuousModeP, #else NoPromiscuousModeP as PromiscuousModeP, #endif #ifndef IEEE154_COORD_REALIGNMENT_DISABLED CoordRealignmentP, #else NoCoordRealignmentP as CoordRealignmentP, #endif new PoolC(ieee154_txframe_t, TXFRAME_POOL_SIZE) as TxFramePoolP, new PoolC(ieee154_txcontrol_t, TXCONTROL_POOL_SIZE) as TxControlPoolP, new QueueC(ieee154_txframe_t*, CAP_TX_QUEUE_SIZE) as DispatchQueueC; components MainC; /* MCPS */ MCPS_DATA = DataP; MCPS_PURGE = DataP; /* MLME */ MLME_START = DispatchP; MLME_ASSOCIATE = AssociateP; MLME_DISASSOCIATE = DisassociateP; MLME_BEACON_NOTIFY = ScanP; MLME_COMM_STATUS = AssociateP; MLME_COMM_STATUS = CoordRealignmentP; MLME_GET = PibP; MLME_ORPHAN = CoordRealignmentP; MLME_POLL = PollP; MLME_RESET = PibP; MLME_RX_ENABLE = RxEnableP; MLME_SCAN = ScanP; MLME_SET = PibP; IEEE154Frame = PibP; IEEE154BeaconFrame = PibP; IEEE154TxBeaconPayload = BeaconRequestRxP; PromiscuousMode = PromiscuousModeP; GetLocalExtendedAddress = PibP.GetLocalExtendedAddress; Packet = PibP; TimeCalc = PibP; FrameUtility = PibP; /* ----------------------- Scanning (MLME-SCAN) ----------------------- */ components new RadioClientC(RADIO_CLIENT_SCAN) as ScanRadioClient; PibP.MacReset -> ScanP; ScanP.MLME_GET -> PibP; ScanP.MLME_SET -> PibP.MLME_SET; ScanP.EnergyDetection = EnergyDetection; ScanP.RadioRx -> ScanRadioClient; ScanP.RadioTx -> ScanRadioClient; ScanP.Frame -> PibP; ScanP.BeaconFrame -> PibP; ScanP.RadioOff -> ScanRadioClient; ScanP.ScanTimer = Timer1; ScanP.TxFramePool -> TxFramePoolP; ScanP.TxControlPool -> TxControlPoolP; ScanP.RadioToken -> ScanRadioClient; ScanP.Leds = Leds; ScanP.FrameUtility -> PibP; /* -------------------- Responding to Active Scans --------------------- */ PibP.MacReset -> BeaconRequestRxP; BeaconRequestRxP.BeaconRequestRx -> DispatchP.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_BEACON_REQUEST]; BeaconRequestRxP.BeaconRequestResponseTx -> DispatchQueueP.FrameTx[unique(CAP_TX_CLIENT)]; BeaconRequestRxP.MLME_GET -> PibP; BeaconRequestRxP.FrameUtility -> PibP; BeaconRequestRxP.Frame -> PibP; /* -------------------- Association (MLME-ASSOCIATE) -------------------- */ PibP.MacReset -> AssociateP; AssociateP.AssociationRequestRx -> DispatchP.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_ASSOCIATION_REQUEST]; AssociateP.AssociationRequestTx -> DispatchQueueP.FrameTx[unique(CAP_TX_CLIENT)]; AssociateP.AssociationResponseExtracted -> DispatchP.FrameExtracted[FC1_FRAMETYPE_CMD + CMD_FRAME_ASSOCIATION_RESPONSE]; AssociateP.AssociationResponseTx -> IndirectTxP.FrameTx[unique(INDIRECT_TX_CLIENT)]; AssociateP.DataRequest -> PollP.DataRequest[ASSOCIATE_POLL_CLIENT]; AssociateP.ResponseTimeout = Timer2; AssociateP.TxFramePool -> TxFramePoolP; AssociateP.TxControlPool -> TxControlPoolP; AssociateP.MLME_GET -> PibP; AssociateP.MLME_SET -> PibP.MLME_SET; AssociateP.FrameUtility -> PibP; AssociateP.Frame -> PibP; AssociateP.LocalExtendedAddress -> PibP.GetLocalExtendedAddress; /* --------------- Disassociation (MLME-DISASSOCIATE) --------------- */ PibP.MacReset -> DisassociateP; DisassociateP.DisassociationIndirectTx -> IndirectTxP.FrameTx[unique(INDIRECT_TX_CLIENT)]; DisassociateP.DisassociationDirectTx -> DispatchQueueP.FrameTx[unique(CAP_TX_CLIENT)]; DisassociateP.DisassociationToCoord -> DispatchQueueP.FrameTx[unique(CAP_TX_CLIENT)]; DisassociateP.DisassociationExtractedFromCoord -> DispatchP.FrameExtracted[FC1_FRAMETYPE_CMD + CMD_FRAME_DISASSOCIATION_NOTIFICATION]; DisassociateP.DisassociationRxFromDevice -> DispatchP.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_DISASSOCIATION_NOTIFICATION]; DisassociateP.TxFramePool -> TxFramePoolP; DisassociateP.TxControlPool -> TxControlPoolP; DisassociateP.MLME_GET -> PibP; DisassociateP.MLME_SET -> PibP; DisassociateP.FrameUtility -> PibP; DisassociateP.Frame -> PibP; DisassociateP.LocalExtendedAddress -> PibP.GetLocalExtendedAddress; /* ------------------ Data Transmission (MCPS-DATA) ------------------- */ DataP.DeviceCapTx -> DispatchQueueP.FrameTx[unique(CAP_TX_CLIENT)]; DataP.CoordCapTx -> DispatchQueueP.FrameTx[unique(CAP_TX_CLIENT)]; DataP.DeviceCapRx -> PollP.DataRx; DataP.DeviceCapRx -> PromiscuousModeP.FrameRx; DataP.DeviceCapRx -> DispatchP.FrameRx[FC1_FRAMETYPE_DATA]; DataP.TxFramePool -> TxFramePoolP; DataP.IndirectTx -> IndirectTxP.FrameTx[unique(INDIRECT_TX_CLIENT)]; DataP.FrameUtility -> PibP; DataP.Frame -> PibP; DataP.PurgeDirect -> DispatchQueueP; DataP.PurgeIndirect -> IndirectTxP; DataP.MLME_GET -> PibP; DataP.Packet -> PibP; DataP.Leds = Leds; /* ------------------------ Polling (MLME-POLL) ----------------------- */ PibP.MacReset -> PollP; PollP.PollTx -> DispatchQueueP.FrameTx[unique(CAP_TX_CLIENT)]; PollP.DataExtracted -> DispatchP.FrameExtracted[FC1_FRAMETYPE_DATA]; PollP.FrameUtility -> PibP; PollP.TxFramePool -> TxFramePoolP; PollP.TxControlPool -> TxControlPoolP; PollP.MLME_GET -> PibP; PollP.LocalExtendedAddress -> PibP.GetLocalExtendedAddress; /* ---------------------- Indirect transmission ----------------------- */ PibP.MacReset -> IndirectTxP; IndirectTxP.CoordCapTx -> DispatchQueueP.FrameTx[unique(CAP_TX_CLIENT)]; IndirectTxP.DataRequestRx -> DispatchP.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_DATA_REQUEST]; IndirectTxP.MLME_GET -> PibP; IndirectTxP.IEEE154Frame -> PibP; IndirectTxP.IndirectTxTimeout = Timer3; IndirectTxP.TimeCalc -> PibP; IndirectTxP.Leds = Leds; /* ---------------------------- Realignment --------------------------- */ PibP.MacReset -> CoordRealignmentP; CoordRealignmentP.CoordRealignmentTx -> DispatchQueueP.FrameTx[unique(CAP_TX_CLIENT)]; CoordRealignmentP.OrphanNotificationRx -> DispatchP.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_ORPHAN_NOTIFICATION]; CoordRealignmentP.FrameUtility -> PibP; CoordRealignmentP.Frame -> PibP; CoordRealignmentP.TxFramePool -> TxFramePoolP; CoordRealignmentP.TxControlPool -> TxControlPoolP; CoordRealignmentP.MLME_GET -> PibP; CoordRealignmentP.LocalExtendedAddress -> PibP.GetLocalExtendedAddress; /* --------------------- DispatchP -------------------- */ PibP.DispatchReset -> DispatchP; PibP.DispatchQueueReset -> DispatchQueueP; DispatchQueueP.Queue -> DispatchQueueC; DispatchQueueP.FrameTxCsma -> DispatchP; components new RadioClientC(unique(IEEE802154_RADIO_RESOURCE)) as DispatchRadioClient; PibP.DispatchReset -> DispatchP; DispatchP.IndirectTxWaitTimer = Timer4; DispatchP.RadioToken -> DispatchRadioClient; DispatchP.SetMacSuperframeOrder -> PibP.SetMacSuperframeOrder; DispatchP.SetMacPanCoordinator -> PibP.SetMacPanCoordinator; DispatchP.IsRxEnableActive -> RxEnableP.IsRxEnableActive; DispatchP.RadioTokenRequested -> DispatchRadioClient; DispatchP.IsRadioTokenRequested -> PibP.IsRadioTokenRequested; // fan out... DispatchP.IsRadioTokenRequested -> PromiscuousModeP.IsRadioTokenRequested; DispatchP.IsRadioTokenRequested -> ScanP.IsRadioTokenRequested; DispatchP.GetIndirectTxFrame -> IndirectTxP; DispatchP.RxEnableStateChange -> RxEnableP.RxEnableStateChange; DispatchP.PIBUpdateMacRxOnWhenIdle -> PibP.PIBUpdate[IEEE154_macRxOnWhenIdle]; DispatchP.FrameUtility -> PibP; DispatchP.UnslottedCsmaCa -> DispatchRadioClient; DispatchP.RadioRx -> DispatchRadioClient; DispatchP.RadioOff -> DispatchRadioClient; DispatchP.MLME_GET -> PibP; DispatchP.MLME_SET -> PibP.MLME_SET; DispatchP.TimeCalc -> PibP; DispatchP.Leds = Leds; /* -------------------------- promiscuous mode ------------------------ */ components new RadioClientC(RADIO_CLIENT_PROMISCUOUSMODE) as PromiscuousModeRadioClient; PibP.MacReset -> PromiscuousModeP; PromiscuousModeP.RadioToken -> PromiscuousModeRadioClient; PromiscuousModeP.PromiscuousRx -> PromiscuousModeRadioClient; PromiscuousModeP.RadioOff -> PromiscuousModeRadioClient; PromiscuousModeP.RadioPromiscuousMode = RadioPromiscuousMode; /* --------------------------- MLME-RX-ENABLE ------------------------ */ PibP.MacReset -> RxEnableP; RxEnableP.TimeCalc -> PibP.TimeCalc; RxEnableP.WasRxEnabled -> DispatchP.WasRxEnabled; RxEnableP.RxEnableTimer = Timer5; /* ------------------------------- PIB -------------------------------- */ components new RadioClientC(RADIO_CLIENT_PIB) as PibRadioClient; PIBUpdate = PibP; MainC.SoftwareInit -> PibP.LocalInit; PibP.RadioControl = PhySplitControl; PibP.Random = Random; PibP.PromiscuousModeGet -> PromiscuousModeP; PibP.LocalTime = LocalTime; PibP.RadioToken -> PibRadioClient; PibP.RadioOff -> PibRadioClient; /* ------------------------- Radio Control ---------------------------- */ RadioControlP.PhyTx = RadioTx; RadioControlP.PhyUnslottedCsmaCa = UnslottedCsmaCa; RadioControlP.PhyRx = RadioRx; RadioControlP.PhyRadioOff = RadioOff; RadioControlP.RadioPromiscuousMode -> PromiscuousModeP; RadioControlP.Leds = Leds; } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/TKN154_MAC.h000066400000000000000000000330611207233610700206440ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Date: 2009-05-28 09:52:54 $ * @author Jan Hauer * ======================================================================== */ #ifndef __TKN154_MAC_H #define __TKN154_MAC_H #include "TKN154.h" #include "TKN154_PHY.h" #include "TKN154_platform.h" /**************************************************** * IEEE 802.15.4 PAN information base identifiers **/ enum { // PHY Sublayer PIB IEEE154_phyCurrentChannel = 0x00, IEEE154_phyChannelsSupported = 0x01, IEEE154_phyTransmitPower = 0x02, IEEE154_phyCCAMode = 0x03, IEEE154_phyCurrentPage = 0x04, IEEE154_phyMaxFrameDuration = 0x05, IEEE154_phySHRDuration = 0x06, IEEE154_phySymbolsPerOctet = 0x07, // MAC Sublayer PIB IEEE154_macAckWaitDuration = 0x40, IEEE154_macAssociatedPANCoord = 0x56, IEEE154_macAssociationPermit = 0x41, IEEE154_macAutoRequest = 0x42, IEEE154_macBattLifeExt = 0x43, IEEE154_macBattLifeExtPeriods = 0x44, IEEE154_macBeaconPayload = 0x45, IEEE154_macBeaconPayloadLength = 0x46, IEEE154_macBeaconOrder = 0x47, IEEE154_macBeaconTxTime = 0x48, IEEE154_macBSN = 0x49, IEEE154_macCoordExtendedAddress = 0x4A, IEEE154_macCoordShortAddress = 0x4B, IEEE154_macDSN = 0x4C, IEEE154_macGTSPermit = 0x4D, IEEE154_macMaxBE = 0x57, IEEE154_macMaxCSMABackoffs = 0x4E, IEEE154_macMaxFrameTotalWaitTime = 0x58, IEEE154_macMaxFrameRetries = 0x59, IEEE154_macMinBE = 0x4F, IEEE154_macMinLIFSPeriod = 0xA0, IEEE154_macMinSIFSPeriod = 0xA1, IEEE154_macPANId = 0x50, IEEE154_macPromiscuousMode = 0x51, IEEE154_macResponseWaitTime = 0x5A, IEEE154_macRxOnWhenIdle = 0x52, IEEE154_macSecurityEnabled = 0x5D, IEEE154_macShortAddress = 0x53, IEEE154_macSuperframeOrder = 0x54, IEEE154_macSyncSymbolOffset = 0x5B, IEEE154_macTimestampSupported = 0x5C, IEEE154_macTransactionPersistenceTime = 0x55, // custom attributes (not present in the standard PIB) IEEE154_macPanCoordinator = 0xF0, }; enum { // MAC header indices MHR_INDEX_FC1 = 0, MHR_INDEX_FC2 = 1, MHR_INDEX_SEQNO = 2, MHR_INDEX_ADDRESS = 3, MHR_MAX_LEN = 23, // Frame Control field in MHR FC1_FRAMETYPE_BEACON = 0x00, FC1_FRAMETYPE_DATA = 0x01, FC1_FRAMETYPE_ACK = 0x02, FC1_FRAMETYPE_CMD = 0x03, FC1_FRAMETYPE_MASK = 0x07, FC1_SECURITY_ENABLED = 0x08, FC1_FRAME_PENDING = 0x10, FC1_ACK_REQUEST = 0x20, FC1_PAN_ID_COMPRESSION = 0x40, FC2_DEST_MODE_SHORT = 0x08, FC2_DEST_MODE_EXTENDED = 0x0c, FC2_DEST_MODE_MASK = 0x0c, FC2_DEST_MODE_OFFSET = 2, FC2_SRC_MODE_SHORT = 0x80, FC2_SRC_MODE_EXTENDED = 0xc0, FC2_SRC_MODE_MASK = 0xc0, FC2_SRC_MODE_OFFSET = 6, FC2_FRAME_VERSION_1 = 0x10, FC2_FRAME_VERSION_2 = 0x20, FC2_FRAME_VERSION_MASK = 0x30, }; /** some unique strings */ #define SYNC_POLL_CLIENT unique("PollP.client") #define ASSOCIATE_POLL_CLIENT unique("PollP.client") #define CAP_TX_CLIENT "CapQueueP.FrameTx.client" #define INDIRECT_TX_CLIENT "IndirectTx.client" #define IEEE802154_RADIO_RESOURCE "RadioRxTxP.resource" enum { // The following identfiers map to components that access the radio // via RadioClientC(). They are used as parameters for RadioClientC(), // the TransferableResource.transferTo() command and in // the TransferableResource.transferredFrom() event RADIO_CLIENT_SCAN = unique(IEEE802154_RADIO_RESOURCE), RADIO_CLIENT_PIB = unique(IEEE802154_RADIO_RESOURCE), RADIO_CLIENT_PROMISCUOUSMODE = unique(IEEE802154_RADIO_RESOURCE), RADIO_CLIENT_BEACONTRANSMIT = unique(IEEE802154_RADIO_RESOURCE), RADIO_CLIENT_COORDBROADCAST = unique(IEEE802154_RADIO_RESOURCE), RADIO_CLIENT_COORDCAP = unique(IEEE802154_RADIO_RESOURCE), RADIO_CLIENT_COORDCFP = unique(IEEE802154_RADIO_RESOURCE), RADIO_CLIENT_COORD_INACTIVE_PERIOD = unique(IEEE802154_RADIO_RESOURCE), RADIO_CLIENT_BEACONSYNCHRONIZE = unique(IEEE802154_RADIO_RESOURCE), RADIO_CLIENT_DEVICECAP = unique(IEEE802154_RADIO_RESOURCE), RADIO_CLIENT_DEVICECFP = unique(IEEE802154_RADIO_RESOURCE), RADIO_CLIENT_DEVICE_INACTIVE_PERIOD = unique(IEEE802154_RADIO_RESOURCE), }; enum { // parameter for the generic DispatchSlottedCsmaP OUTGOING_SUPERFRAME, INCOMING_SUPERFRAME, }; /**************************************************** * Default time-related constants for beacon-enabled PANs, * these may be overridden by platform-specific constants. * */ #ifndef IEEE154_MAX_BEACON_JITTER // will start to listen for a beacon MAX_BEACON_JITTER_TIME(BO) symbols // before its expected arrival, where BO is the current beacon order // (here --by default-- BO is ignored) #define IEEE154_MAX_BEACON_JITTER(BO) 20 #endif #ifndef IEEE154_MAX_BEACON_LISTEN_TIME // maximum time to listen for a beacon after its expected arrival, // before it is declared as missed #define IEEE154_MAX_BEACON_LISTEN_TIME(BO) (128 * IEEE154_SYMBOLS_PER_OCTET + IEEE154_MAX_BEACON_JITTER(BO)) #endif typedef struct { uint8_t length; // top bit denotes -> promiscuous mode uint8_t mhr[MHR_MAX_LEN]; #ifndef TKN154_ACTIVE_MESSAGE_SUPPORT_DISABLED // This is a workaround: both, network and AM ID, are actually part of the // MAC payload, but in the TinyOS world they are part of the header. To // support bridging between between radio and serial stack above AM layer // we will let it look like TinyOS expects it to look like, which involves // some extra overhead in our AM layer (a memmove) as well as adding the // one (or two) struct members below. #ifndef TFRAMES_ENABLED /** I-Frame 6LowPAN interoperability byte */ uint8_t network; #endif /** Active Message identifier */ uint8_t type; #endif } ieee154_header_t; typedef nx_struct { nx_uint32_t timestamp; nx_int8_t rssi; nx_uint8_t linkQuality; } ieee154_metadata_t; typedef struct { ieee154_header_t *header; uint8_t *payload; ieee154_metadata_t *metadata; uint8_t headerLen; uint8_t payloadLen; uint8_t client; uint8_t handle; } ieee154_txframe_t; typedef struct { ieee154_header_t header; ieee154_metadata_t metadata; } ieee154_txcontrol_t; typedef struct ieee154_csma { uint8_t BE; // initial backoff exponent uint8_t macMaxBE; // maximum backoff exponent uint8_t macMaxCsmaBackoffs; // maximum number of allowed backoffs uint8_t NB; // number of backoff during current transmission } ieee154_csma_t; typedef struct { uint32_t transactionTime; ieee154_txframe_t *frame; ieee154_csma_t csma; } ieee154_cap_frame_backup_t; #define MHR(x) (((ieee154_header_t*) (x)->header)->mhr) // COMMAND frames enum { CMD_FRAME_ASSOCIATION_REQUEST = 1, CMD_FRAME_ASSOCIATION_RESPONSE = 2, CMD_FRAME_DISASSOCIATION_NOTIFICATION = 3, CMD_FRAME_DATA_REQUEST = 4, CMD_FRAME_PAN_ID_CONFLICT_NOTIFICATION = 5, CMD_FRAME_ORPHAN_NOTIFICATION = 6, CMD_FRAME_BEACON_REQUEST = 7, CMD_FRAME_COORDINATOR_REALIGNMENT = 8, CMD_FRAME_GTS_REQUEST = 9 }; enum { // MAC payload fields inside a beacon frame BEACON_INDEX_SF_SPEC1 = 0, BEACON_INDEX_SF_SPEC2 = 1, BEACON_INDEX_GTS_SPEC = 2, SF_SPEC1_BO_MASK = 0x0F, SF_SPEC1_BO_OFFSET = 0, SF_SPEC1_SO_MASK = 0xF0, SF_SPEC1_SO_OFFSET = 4, SF_SPEC2_FINAL_CAPSLOT_MASK = 0x0F, SF_SPEC2_FINAL_CAPSLOT_OFFSET = 0, SF_SPEC2_BATT_LIFE_EXT = 0x10, SF_SPEC2_PAN_COORD = 0x40, SF_SPEC2_ASSOCIATION_PERMIT = 0x80, GTS_DESCRIPTOR_COUNT_MASK = 0x07, GTS_DESCRIPTOR_COUNT_OFFSET = 0, GTS_LENGTH_MASK = 0xF0, GTS_LENGTH_OFFSET = 4, GTS_SPEC_PERMIT = 0x80, PENDING_ADDRESS_SHORT_MASK = 0x07, PENDING_ADDRESS_EXT_MASK = 0x70, }; enum { // PHY sublayer constants IEEE154_aTurnaroundTime = 12, FRAMECTL_LENGTH_MASK = 0x7F, // "length" member in ieee154_header_t FRAMECTL_PROMISCUOUS = 0x80, // "length" member in ieee154_header_t }; #define IEEE154_SUPPORTED_CHANNELPAGE (IEEE154_SUPPORTED_CHANNELS >> 27) enum { // MAC sublayer constants IEEE154_aNumSuperframeSlots = 16, IEEE154_aMaxMPDUUnsecuredOverhead = 25, IEEE154_aMinMPDUOverhead = 9, IEEE154_aBaseSlotDuration = 60, IEEE154_aBaseSuperframeDuration = (IEEE154_aBaseSlotDuration * IEEE154_aNumSuperframeSlots), IEEE154_aGTSDescPersistenceTime = 4, IEEE154_aMaxBeaconOverhead = 75, IEEE154_aMaxBeaconPayloadLength = (IEEE154_aMaxPHYPacketSize - IEEE154_aMaxBeaconOverhead), IEEE154_aMaxLostBeacons = 4, IEEE154_aMaxMACSafePayloadSize = (IEEE154_aMaxPHYPacketSize - IEEE154_aMaxMPDUUnsecuredOverhead), IEEE154_aMaxMACPayloadSize = (IEEE154_aMaxPHYPacketSize - IEEE154_aMinMPDUOverhead), IEEE154_aMaxSIFSFrameSize = 18, IEEE154_aMinCAPLength = 440, IEEE154_aUnitBackoffPeriod = 20, }; // combine function for IsRadioTokenRequested (GetNow) interface typedef bool token_requested_t __attribute__((combine(rcombine))); token_requested_t rcombine(token_requested_t r1, token_requested_t r2) { return r1 || r2; } #ifdef TKN154_DEBUG /****************************************************************** * ATTENTION! Debugging over serial is a lot of overhead. To * keep it simple, here are the rules you have to follow when * using the dbg_serial() macro: * * - dbg_serial() is used like dbg(), i.e. you pass it at least * two strings, the first one describing the component/file, * the second is a format string (like in printf()) * - following the second string, there may be zero up to * two parameters -- these must be (cast to) uint32_t and * the format specifier must be "%lu", e.g. * dbg_serial("MyComponentP", "Value: %lu\n", (uint32_t) val); * - both strings must be constants (pointers always valid) * - no data is sent over serial, unless dbg_serial_flush() is * called; try to call it when the system is idle or at least * when no time-critical operations are pending; on TelosB * you can also press the user button to trigger a flush * - on the PC use the printf java client to display the debug * output (see tinyos-2.x/apps/tests/TestPrintf/README.txt); * the output format is component:line-in-source-code:text * * The ASSERT(X) macro is used to test for errors. If X evaluates * to zero, then 3 leds start blinking simulataneously (about 2Hz) * and the node *continuously* outputs over serial the filename/line * where the (first) ASSERT has failed. This means, even if your * TelosB was not attached to your PC while the ASSERT failed you * can typically still pull the information out later. * * When TKN154_DEBUG is not defined (which is the default), then * dbg_serial() maps to dbg(), i.e. is completely removed unless * the platform is TOSSIM, and in the ASSERT(X) statement X is * evaluated/executed, but the result is ignored. **/ /* -> functions are defined in DebugP.nc */ void tkn154_assert(bool val, const char *filename, uint16_t line, const char *func); void tkn154_dbg_serial(const char *filename, uint16_t line, ...); void tkn154_dbg_serial_flush(); #define ASSERT(X) tkn154_assert(X, __FILE__,__LINE__,__FUNCTION__) #define dbg_serial(m, ...) tkn154_dbg_serial(m, __LINE__,__VA_ARGS__) #define dbg_serial_flush() tkn154_dbg_serial_flush() #else // Note: in an ASSERT(X) the X must always be evaluated/executed! #define ASSERT(X) while(!(X)){ break;} #define dbg_serial(m, ...) dbg(m, __VA_ARGS__) #define dbg_serial_flush() #endif #endif // __TKN154_MAC_H tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/TKN154_PIB.h000066400000000000000000000176221207233610700206630ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Date: 2009-03-04 18:31:37 $ * @author Torsten Halbhuebner * @author Jan Hauer * ======================================================================== */ #ifndef __TKN154_PIB_H #define __TKN154_PIB_H /**************************************************** * IEEE 802.15.4 PAN information base (PIB) */ typedef struct ieee154_PIB { /** bool types */ // 0x41 ieee154_macAssociationPermit_t macAssociationPermit; // 0x42 ieee154_macAutoRequest_t macAutoRequest; // 0x43 ieee154_macBattLifeExt_t macBattLifeExt; // 0x4D ieee154_macGTSPermit_t macGTSPermit; // 0x51 ieee154_macPromiscuousMode_t macPromiscuousMode; // 0x52 ieee154_macRxOnWhenIdle_t macRxOnWhenIdle; // 0x56 ieee154_macAssociatedPANCoord_t macAssociatedPANCoord; // 0x5D ieee154_macSecurityEnabled_t macSecurityEnabled; // custom attribute ieee154_macPanCoordinator_t macPanCoordinator; /** uint8_t types */ // 0x00 ieee154_phyCurrentChannel_t phyCurrentChannel; // 0x02 ieee154_phyTransmitPower_t phyTransmitPower; // 0x03 ieee154_phyCCAMode_t phyCCAMode; // 0x04 ieee154_phyCurrentPage_t phyCurrentPage; // 0x44 ieee154_macBattLifeExtPeriods_t macBattLifeExtPeriods; // 0x46 ieee154_macBeaconPayloadLength_t macBeaconPayloadLength; // 0x47 ieee154_macBeaconOrder_t macBeaconOrder; // 0x49 ieee154_macBSN_t macBSN; // 0x4C ieee154_macDSN_t macDSN; // 0x4E ieee154_macMaxCSMABackoffs_t macMaxCSMABackoffs; // 0x4F ieee154_macMinBE_t macMinBE; // 0x54 ieee154_macSuperframeOrder_t macSuperframeOrder; // 0x57 ieee154_macMaxBE_t macMaxBE; // 0x59 ieee154_macMaxFrameRetries_t macMaxFrameRetries; // 0x5a ieee154_macResponseWaitTime_t macResponseWaitTime; /** larger than uint8_t types */ // 0x4B ieee154_macCoordShortAddress_t macCoordShortAddress; // 0x50 ieee154_macPANId_t macPANId; // 0x53 ieee154_macShortAddress_t macShortAddress; // 0x55 ieee154_macTransactionPersistenceTime_t macTransactionPersistenceTime; // TODO: check type ieee154_macMaxFrameTotalWaitTime_t macMaxFrameTotalWaitTime; ieee154_macBeaconTxTime_t macBeaconTxTime; // 0x4A ieee154_macCoordExtendedAddress_t macCoordExtendedAddress; } ieee154_PIB_t; // PHY PIB default attributes #ifndef IEEE154_DEFAULT_CURRENTCHANNEL #define IEEE154_DEFAULT_CURRENTCHANNEL 26 #endif #ifndef IEEE154_DEFAULT_CHANNELSSUPPORTED_PAGE0 #define IEEE154_DEFAULT_CHANNELSSUPPORTED_PAGE0 0x07FFF800 #endif #ifndef IEEE154_DEFAULT_CHANNELSSUPPORTED_PAGE1 #define IEEE154_DEFAULT_CHANNELSSUPPORTED_PAGE1 0 #endif #ifndef IEEE154_DEFAULT_CHANNELSSUPPORTED_PAGE2 #define IEEE154_DEFAULT_CHANNELSSUPPORTED_PAGE2 0 #endif #ifndef IEEE154_DEFAULT_CCAMODE #define IEEE154_DEFAULT_CCAMODE 3 #endif #ifndef IEEE154_DEFAULT_CURRENTPAGE #define IEEE154_DEFAULT_CURRENTPAGE 0 #endif #ifndef IEEE154_DEFAULT_TRANSMITPOWER_dBm #define IEEE154_DEFAULT_TRANSMITPOWER_dBm 0 #endif // MAC PIB default attributes #ifndef IEEE154_DEFAULT_ASSOCIATEDPANCOORD #define IEEE154_DEFAULT_ASSOCIATEDPANCOORD FALSE #endif #ifndef IEEE154_DEFAULT_ASSOCIATIONPERMIT #define IEEE154_DEFAULT_ASSOCIATIONPERMIT FALSE #endif #ifndef IEEE154_DEFAULT_AUTOREQUEST #define IEEE154_DEFAULT_AUTOREQUEST TRUE #endif #ifndef IEEE154_DEFAULT_BATTLIFEEXT #define IEEE154_DEFAULT_BATTLIFEEXT FALSE #endif #ifndef IEEE154_DEFAULT_BATTLIFEEXTPERIODS #define IEEE154_DEFAULT_BATTLIFEEXTPERIODS 6 #endif #ifndef IEEE154_DEFAULT_BEACONPAYLOAD #define IEEE154_DEFAULT_BEACONPAYLOAD NULL #endif #ifndef IEEE154_DEFAULT_BEACONPAYLOADLENGTH #define IEEE154_DEFAULT_BEACONPAYLOADLENGTH 0 #endif #ifndef IEEE154_DEFAULT_BEACONORDER #define IEEE154_DEFAULT_BEACONORDER 15 #endif #ifndef IEEE154_DEFAULT_BEACONTXTIME #define IEEE154_DEFAULT_BEACONTXTIME 0 #endif #ifndef IEEE154_DEFAULT_COORDSHORTADDRESS #define IEEE154_DEFAULT_COORDSHORTADDRESS 0xFFFF #endif #ifndef IEEE154_DEFAULT_GTSPERMIT #define IEEE154_DEFAULT_GTSPERMIT TRUE #endif #ifndef IEEE154_DEFAULT_MAXBE #define IEEE154_DEFAULT_MAXBE 5 #endif #ifndef IEEE154_DEFAULT_MAXCSMABACKOFFS #define IEEE154_DEFAULT_MAXCSMABACKOFFS 4 #endif #ifndef IEEE154_DEFAULT_MAXFRAMETOTALWAITTIME #define IEEE154_DEFAULT_MAXFRAMETOTALWAITTIME 2626 #endif #ifndef IEEE154_DEFAULT_MAXFRAMERETRIES #define IEEE154_DEFAULT_MAXFRAMERETRIES 3 #endif #ifndef IEEE154_DEFAULT_MINBE #define IEEE154_DEFAULT_MINBE 3 #endif #ifndef IEEE154_DEFAULT_MINLIFSPERIOD #define IEEE154_DEFAULT_MINLIFSPERIOD 40 #endif #ifndef IEEE154_DEFAULT_MINSIFSPERIOD #define IEEE154_DEFAULT_MINSIFSPERIOD 12 #endif #ifndef IEEE154_DEFAULT_PANID #define IEEE154_DEFAULT_PANID 0xFFFF #endif #ifndef IEEE154_DEFAULT_PROMISCUOUSMODE #define IEEE154_DEFAULT_PROMISCUOUSMODE FALSE #endif #ifndef IEEE154_DEFAULT_RESPONSEWAITTIME #define IEEE154_DEFAULT_RESPONSEWAITTIME 32 #endif #ifndef IEEE154_DEFAULT_RXONWHENIDLE #define IEEE154_DEFAULT_RXONWHENIDLE FALSE #endif #ifndef IEEE154_DEFAULT_SECURITYENABLED #define IEEE154_DEFAULT_SECURITYENABLED FALSE #endif #ifndef IEEE154_DEFAULT_SHORTADDRESS #define IEEE154_DEFAULT_SHORTADDRESS 0xFFFF #endif #ifndef IEEE154_DEFAULT_SUPERFRAMEORDER #define IEEE154_DEFAULT_SUPERFRAMEORDER 15 #endif #ifndef IEEE154_DEFAULT_SYNCSYMBOLOFFSET #define IEEE154_DEFAULT_SYNCSYMBOLOFFSET 0 #endif #ifndef IEEE154_DEFAULT_TIMESTAMPSUPPORTED #define IEEE154_DEFAULT_TIMESTAMPSUPPORTED TRUE #endif #ifndef IEEE154_DEFAULT_TRANSACTIONPERSISTENCETIME #define IEEE154_DEFAULT_TRANSACTIONPERSISTENCETIME 0x01F4 #endif #ifndef IEEE154_DEFAULT_MACPANCOORDINATOR #define IEEE154_DEFAULT_MACPANCOORDINATOR FALSE #endif #define IEEE154_INVALID_TIMESTAMP (0xffffffff) #endif // __TKN154_PIB_H tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/000077500000000000000000000000001207233610700205655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoAssociateP.nc000066400000000000000000000121431207233610700234400ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:39 $ * @author Jan Hauer * ======================================================================== */ /** Empty placeholder component for AssociateP. */ #include "TKN154_MAC.h" module NoAssociateP { provides { interface Init; interface MLME_ASSOCIATE; interface MLME_COMM_STATUS; } uses { interface FrameRx as AssociationRequestRx; interface FrameTx as AssociationRequestTx; interface FrameExtracted as AssociationResponseExtracted; interface FrameTx as AssociationResponseTx; interface DataRequest; interface Timer as ResponseTimeout; interface Pool as TxFramePool; interface Pool as TxControlPool; interface MLME_GET; interface MLME_SET; interface FrameUtility; interface IEEE154Frame as Frame; interface Get as LocalExtendedAddress; } } implementation { command error_t Init.init() { return SUCCESS; } /* ------------------- MLME_ASSOCIATE Request ------------------- */ command ieee154_status_t MLME_ASSOCIATE.request ( uint8_t LogicalChannel, uint8_t ChannelPage, uint8_t CoordAddrMode, uint16_t CoordPANID, ieee154_address_t CoordAddress, ieee154_CapabilityInformation_t CapabilityInformation, ieee154_security_t *security ) { return IEEE154_TRANSACTION_OVERFLOW; } event void AssociationRequestTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { } event void ResponseTimeout.fired() { } event message_t* AssociationResponseExtracted.received(message_t* frame, ieee154_txframe_t *txFrame) { return frame; } event void DataRequest.pollDone() { } /* ------------------- MLME_ASSOCIATE Response ------------------- */ event message_t* AssociationRequestRx.received(message_t* frame) { return frame; } command ieee154_status_t MLME_ASSOCIATE.response ( uint64_t deviceAddress, uint16_t assocShortAddress, ieee154_association_status_t status, ieee154_security_t *security ) { return IEEE154_TRANSACTION_OVERFLOW; } event void AssociationResponseTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { } /* ------------------- Defaults ------------------- */ default event void MLME_ASSOCIATE.indication ( uint64_t DeviceAddress, ieee154_CapabilityInformation_t CapabilityInformation, ieee154_security_t *security ){} default event void MLME_ASSOCIATE.confirm ( uint16_t AssocShortAddress, uint8_t status, ieee154_security_t *security ){} default event void MLME_COMM_STATUS.indication ( uint16_t PANId, uint8_t SrcAddrMode, ieee154_address_t SrcAddr, uint8_t DstAddrMode, ieee154_address_t DstAddr, ieee154_status_t status, ieee154_security_t *security ){} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoBeaconRequestRxP.nc000066400000000000000000000057241207233610700246060ustar00rootroot00000000000000/* * Copyright (c) 2009, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-05-28 09:52:54 $ * @author: Jasper Buesch * ======================================================================== */ /** Empty placeholder component for BeaconRequestRxP. */ #include "TKN154_MAC.h" #include "TKN154.h" module NoBeaconRequestRxP { provides { interface Init as Reset; interface IEEE154TxBeaconPayload; } uses { interface FrameRx as BeaconRequestRx; interface FrameTx as BeaconRequestResponseTx; interface MLME_GET; interface FrameUtility; interface IEEE154Frame as Frame; } } implementation { command error_t Reset.init() { return SUCCESS; } event message_t* BeaconRequestRx.received(message_t* frame) { return frame; } event void BeaconRequestResponseTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status){ } /* ----------------------- Beacon Payload ----------------------- */ command error_t IEEE154TxBeaconPayload.setBeaconPayload(void *beaconPayload, uint8_t length) { return EOFF; } command const void* IEEE154TxBeaconPayload.getBeaconPayload(){ return NULL; } command uint8_t IEEE154TxBeaconPayload.getBeaconPayloadLength(){ return 0; } command error_t IEEE154TxBeaconPayload.modifyBeaconPayload(uint8_t offset, void *buffer, uint8_t bufferLength){ return EOFF; } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoBeaconSynchronizeP.nc000066400000000000000000000111761207233610700251550ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2009-03-24 12:56:47 $ * @author Jan Hauer * ======================================================================== */ /** Empty placeholder component for BeaconSynchronizeP. */ #include "TKN154_MAC.h" module NoBeaconSynchronizeP { provides { interface Init as Reset; interface MLME_SYNC; interface MLME_BEACON_NOTIFY; interface MLME_SYNC_LOSS; interface SuperframeStructure as IncomingSF; interface GetNow as IsTrackingBeacons; interface StdControl as TrackSingleBeacon; } uses { interface MLME_GET; interface MLME_SET; interface FrameUtility; interface IEEE154BeaconFrame as BeaconFrame; interface Alarm as TrackAlarm; interface RadioRx as BeaconRx; interface RadioOff; interface DataRequest; interface FrameRx as CoordRealignmentRx; interface TransferableResource as RadioToken; interface TimeCalc; interface IEEE154Frame as Frame; interface Leds; } } implementation { command error_t Reset.init() { return SUCCESS; } command ieee154_status_t MLME_SYNC.request ( uint8_t logicalChannel, uint8_t channelPage, bool trackBeacon) { return IEEE154_TRANSACTION_OVERFLOW; } event void RadioToken.granted() { } async event void RadioToken.transferredFrom(uint8_t fromClient) { call RadioToken.transferTo(RADIO_CLIENT_BEACONTRANSMIT); } async event void RadioOff.offDone() { } async event void BeaconRx.enableRxDone() { } async event void TrackAlarm.fired() { } event message_t* BeaconRx.received(message_t *frame) { return frame; } command error_t TrackSingleBeacon.start() { return FAIL; } command error_t TrackSingleBeacon.stop() { return FAIL; } /* ----------------------- SF Structure, etc. ----------------------- */ async command uint32_t IncomingSF.sfStartTime() { return 0; } async command uint32_t IncomingSF.sfSlotDuration() { return 0; } async command uint8_t IncomingSF.numCapSlots() { return 0; } async command uint8_t IncomingSF.numGtsSlots() { return 0; } async command uint16_t IncomingSF.battLifeExtDuration() { return 0; } async command const uint8_t* IncomingSF.gtsFields() { return NULL; } async command uint16_t IncomingSF.guardTime() { return 0; } async command bool IncomingSF.isBroadcastPending() { return 0; } async command uint32_t IncomingSF.beaconInterval() { return 0;} async command bool IsTrackingBeacons.getNow() { return 0; } event void DataRequest.pollDone(){} default event message_t* MLME_BEACON_NOTIFY.indication (message_t* frame){return frame;} default event void MLME_SYNC_LOSS.indication ( ieee154_status_t lossReason, uint16_t panID, uint8_t logicalChannel, uint8_t channelPage, ieee154_security_t *security){} event message_t* CoordRealignmentRx.received(message_t* frame) { return frame; } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoBeaconTransmitP.nc000066400000000000000000000140451207233610700244410ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.8 $ * $Date: 2009-12-14 16:46:49 $ * @author Jan Hauer * ======================================================================== */ /** Empty placeholder component for BeaconTransmitP. */ #include "TKN154_MAC.h" #include "TKN154_PHY.h" module NoBeaconTransmitP { provides { interface Init as Reset; interface MLME_START; interface IEEE154TxBeaconPayload; interface SuperframeStructure as OutgoingSF; interface GetNow as IsSendingBeacons; } uses { interface Notify as GtsSpecUpdated; interface Notify as PendingAddrSpecUpdated; interface Notify as PIBUpdate[uint8_t attributeID]; interface Alarm as BeaconSendAlarm; interface Timer as BeaconPayloadUpdateTimer; interface RadioOff; interface RadioTx as BeaconTx; interface MLME_GET; interface MLME_SET; interface TransferableResource as RadioToken; interface FrameTx as RealignmentBeaconEnabledTx; interface FrameTx as RealignmentNonBeaconEnabledTx; interface FrameRx as BeaconRequestRx; interface WriteBeaconField as GtsInfoWrite; interface WriteBeaconField as PendingAddrWrite; interface FrameUtility; interface GetNow as IsTrackingBeacons; interface SuperframeStructure as IncomingSF; interface Set as SetMacSuperframeOrder; interface Set as SetMacBeaconTxTime; interface Set as SetMacPanCoordinator; interface GetSet as GetSetRealignmentFrame; interface GetNow as IsBroadcastReady; interface TimeCalc; interface Random; interface Leds; } } implementation { command error_t Reset.init() { return SUCCESS; } command ieee154_status_t MLME_START.request ( uint16_t panID, uint8_t logicalChannel, uint8_t channelPage, uint32_t startTime, uint8_t beaconOrder, uint8_t superframeOrder, bool panCoordinator, bool batteryLifeExtension, bool coordRealignment, ieee154_security_t *coordRealignSecurity, ieee154_security_t *beaconSecurity) { return IEEE154_TRANSACTION_OVERFLOW; } event void RadioToken.granted() { } async event void RadioToken.transferredFrom(uint8_t from) { call RadioToken.transferTo(RADIO_CLIENT_BEACONSYNCHRONIZE); } async event void RadioOff.offDone() { } async event void BeaconSendAlarm.fired() {} async event void BeaconTx.transmitDone(ieee154_txframe_t *frame, error_t result){} command error_t IEEE154TxBeaconPayload.setBeaconPayload(void *beaconPayload, uint8_t length) { return ESIZE; } command const void* IEEE154TxBeaconPayload.getBeaconPayload() { return NULL; } command uint8_t IEEE154TxBeaconPayload.getBeaconPayloadLength() {return 0; } command error_t IEEE154TxBeaconPayload.modifyBeaconPayload(uint8_t offset, void *buffer, uint8_t bufferLength) { return ESIZE; } event void PIBUpdate.notify[uint8_t attributeID](const void* attributeValue) { } event void PendingAddrSpecUpdated.notify(bool val) { } event void GtsSpecUpdated.notify(bool val) { } event void BeaconPayloadUpdateTimer.fired() { } event void RealignmentBeaconEnabledTx.transmitDone(ieee154_txframe_t *frame, ieee154_status_t status) { } event void RealignmentNonBeaconEnabledTx.transmitDone(ieee154_txframe_t *frame, ieee154_status_t status) { } event message_t* BeaconRequestRx.received(message_t* frame) { return frame; } async command uint32_t OutgoingSF.sfStartTime() {return 0;} async command uint32_t OutgoingSF.sfSlotDuration() {return 0;} async command uint8_t OutgoingSF.numCapSlots() {return 0;} async command uint8_t OutgoingSF.numGtsSlots() {return 0;} async command uint16_t OutgoingSF.battLifeExtDuration() {return 0;} async command const uint8_t* OutgoingSF.gtsFields() {return NULL;} async command uint16_t OutgoingSF.guardTime() {return 0;} async command bool OutgoingSF.isBroadcastPending() {return FALSE;} async command uint32_t OutgoingSF.beaconInterval() { return 0;} async command bool IsSendingBeacons.getNow() {return FALSE;} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoCoordBroadcastP.nc000066400000000000000000000060521207233610700244200ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-24 12:56:47 $ * @author Jan Hauer * ======================================================================== */ /** Empty placeholder component for CoordBroadcastP. */ #include "TKN154_MAC.h" module NoCoordBroadcastP { provides { interface Init as Reset; interface FrameTx as BroadcastDataFrame; interface FrameTx as RealignmentTx; interface GetNow as IsBroadcastReady; } uses { interface Queue; interface FrameTxNow as CapTransmitNow; interface TransferableResource as RadioToken; interface GetNow as BeaconFramePendingBit; interface SuperframeStructure as OutgoingSF; interface Leds; } } implementation { command error_t Reset.init() { return SUCCESS; } command ieee154_status_t BroadcastDataFrame.transmit(ieee154_txframe_t *txFrame) { return IEEE154_TRANSACTION_OVERFLOW; } command ieee154_status_t RealignmentTx.transmit(ieee154_txframe_t *frame) { return IEEE154_TRANSACTION_OVERFLOW; } async command bool IsBroadcastReady.getNow() { return FALSE; } async event void RadioToken.transferredFrom(uint8_t fromClient) { call RadioToken.transferTo(RADIO_CLIENT_COORDCAP); } async event void CapTransmitNow.transmitNowDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { } event void RadioToken.granted(){ } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoCoordCfpP.nc000066400000000000000000000160221207233610700232240ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.7 $ * $Date: 2009-03-24 12:56:47 $ * @author Jan Hauer * ======================================================================== */ /* * Copyright (c) 2010, CISTER/ISEP - Polytechnic Institute of Porto * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * * @author Ricardo Severino * @author Stefano Tennina * ======================================================================== */ /** * The contention free period (CFP) in beacon mode, a.k.a. GTS, is not yet * implemented - this is only an empty placeholder. In contrast to the CAP * component the GTS component for an incoming superframe will probably be very * different from the GTS for an outgoing superframe. That is why there are two * separate placeholder components (DeviceCfpP and CoordCfpP) instead of one * generic CfpP component. This component would deal with the GTS for an * outgoing superframe, i.e. from the perspective of a coordinator. */ #include "TKN154_MAC.h" module NoCoordCfpP { provides { interface Init; interface WriteBeaconField as GtsInfoWrite; interface FrameTx as CfpTx; interface Purge; interface FrameRx; interface Notify as GtsSpecUpdated; interface MLME_GTS; } uses { interface TransferableResource as RadioToken; interface Alarm as CfpSlotAlarm; interface Alarm as CfpEndAlarm; interface SuperframeStructure as OutgoingSF; interface RadioTx; interface RadioRx; interface RadioOff; interface MLME_GET; interface MLME_SET; interface FrameRx as GtsRequestRx; interface IEEE154Frame as Frame; } } implementation { command error_t Init.init() { return SUCCESS; } command ieee154_status_t CfpTx.transmit(ieee154_txframe_t *data) { return IEEE154_INVALID_GTS; } command ieee154_status_t Purge.purge(uint8_t msduHandle) { // request to purge a frame (triggered by MCPS_DATA.purge()) return IEEE154_INVALID_HANDLE; } async event void RadioToken.transferredFrom(uint8_t fromClient) { #ifndef IEEE154_BEACON_SYNC_DISABLED call RadioToken.transferTo(RADIO_CLIENT_BEACONSYNCHRONIZE); #else call RadioToken.transferTo(RADIO_CLIENT_BEACONTRANSMIT); #endif } async event void CfpEndAlarm.fired() {} async event void CfpSlotAlarm.fired() {} async event void RadioOff.offDone() {} event message_t* GtsRequestRx.received(message_t* frame) { return(frame); } command uint8_t GtsInfoWrite.write(uint8_t *lastBytePtr, uint8_t maxlen) { if (maxlen == 0) return 0; else { lastBytePtr[0] = 0; // GTS Specifications return 1; } } async event void RadioTx.transmitDone( ieee154_txframe_t *frame, error_t result) {} async event void RadioRx.enableRxDone(){} event message_t* RadioRx.received(message_t *frame) { return signal FrameRx.received(frame); } event void RadioToken.granted() { ASSERT(0); // should never happen, because we never call RadioToken.request() } command ieee154_status_t MLME_GTS.request ( uint8_t GtsCharacteristics, ieee154_security_t *security ) { //This is used in case the Coordinator whishes to deallocate a gts } command ieee154_status_t MLME_GTS.requestFromPAN ( //Only for PAN Coordinator use uint8_t GtsCharacteristics, uint16_t DeviceAddress, ieee154_security_t *security ){} command error_t GtsSpecUpdated.enable() {return FAIL;} command error_t GtsSpecUpdated.disable() {return FAIL;} default event void GtsSpecUpdated.notify( bool val ) {return;} default event void MLME_GTS.indication ( uint16_t DeviceAddress, uint8_t GtsCharacteristics, ieee154_security_t *security ){} default event void MLME_GTS.confirm ( uint8_t GtsCharacteristics, ieee154_status_t status ){} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoCoordRealignmentP.nc000066400000000000000000000074271207233610700247720ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:40 $ * @author Jan Hauer * ======================================================================== */ /** Empty placeholder component for CoordRealignmentP. */ #include "TKN154_MAC.h" module NoCoordRealignmentP { provides { interface Init; interface MLME_ORPHAN; interface MLME_COMM_STATUS; interface GetSet as GetSetRealignmentFrame; } uses { interface FrameTx as CoordRealignmentTx; interface FrameRx as OrphanNotificationRx; interface FrameUtility; interface MLME_GET; interface IEEE154Frame as Frame; interface Pool as TxFramePool; interface Pool as TxControlPool; interface Get as LocalExtendedAddress; } } implementation { command error_t Init.init() { return SUCCESS; } command ieee154_txframe_t* GetSetRealignmentFrame.get() { return NULL; } command void GetSetRealignmentFrame.set(ieee154_txframe_t* frame) { } event message_t* OrphanNotificationRx.received(message_t* frame) { return frame; } command ieee154_status_t MLME_ORPHAN.response ( uint64_t OrphanAddress, uint16_t ShortAddress, bool AssociatedMember, ieee154_security_t *security ) { return IEEE154_TRANSACTION_OVERFLOW; } event void CoordRealignmentTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { } default event void MLME_COMM_STATUS.indication ( uint16_t PANId, uint8_t SrcAddrMode, ieee154_address_t SrcAddr, uint8_t DstAddrMode, ieee154_address_t DstAddr, ieee154_status_t status, ieee154_security_t *security ){} default event void MLME_ORPHAN.indication ( uint64_t OrphanAddress, ieee154_security_t *security ){} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoDeviceCfpP.nc000066400000000000000000000152401207233610700233560ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.7 $ * $Date: 2009-03-24 12:56:47 $ * @author Jan Hauer * ======================================================================== */ /* * Copyright (c) 2010, CISTER/ISEP - Polytechnic Institute of Porto * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * * @author Ricardo Severino * @author Stefano Tennina * ======================================================================== */ /** * The contention free period (CFP) in beacon mode, a.k.a. GTS, is not yet * implemented - this is only an empty placeholder. In contrast to the CAP * component the GTS component for an incoming superframe will probably be very * different from the GTS for an outgoing superframe. That is why there are two * separate placeholder components (DeviceCfpP and CoordCfpP) instead of one * generic CfpP component. This component would deal with the GTS for an * incoming superframe, i.e. from the perspective of a device. */ #include "TKN154_MAC.h" module NoDeviceCfpP { provides { interface Init; interface FrameTx as CfpTx; interface Purge; interface FrameRx; interface MLME_GTS; } uses { interface TransferableResource as RadioToken; interface Alarm as CfpSlotAlarm; interface Alarm as CfpEndAlarm; interface SuperframeStructure as IncomingSF; interface RadioTx; interface RadioRx; interface RadioOff; interface MLME_GET; interface MLME_SET; interface FrameTx as GTSrequestTx; interface Pool as TxFramePool; interface Pool as TxControlPool; interface FrameUtility; } } implementation { command error_t Init.init() { return SUCCESS; } command ieee154_status_t MLME_GTS.requestFromPAN ( uint8_t GtsCharacteristics, uint16_t DeviceAddress, ieee154_security_t *security ) { return IEEE154_INVALID_GTS; } command ieee154_status_t MLME_GTS.request ( uint8_t GtsCharacteristics, ieee154_security_t *security ) { return IEEE154_INVALID_GTS; } command ieee154_status_t CfpTx.transmit(ieee154_txframe_t *data) { return IEEE154_INVALID_GTS; } command ieee154_status_t Purge.purge(uint8_t msduHandle) { // request to purge a frame (triggered by MCPS_DATA.purge()) return IEEE154_INVALID_HANDLE; } async event void RadioToken.transferredFrom(uint8_t fromClient) { #ifndef IEEE154_BEACON_TX_DISABLED call RadioToken.transferTo(RADIO_CLIENT_BEACONTRANSMIT); #else call RadioToken.transferTo(RADIO_CLIENT_BEACONSYNCHRONIZE); #endif } async event void CfpEndAlarm.fired() {} async event void CfpSlotAlarm.fired() {} async event void RadioOff.offDone() {} async event void RadioTx.transmitDone( ieee154_txframe_t *frame, error_t result) {} async event void RadioRx.enableRxDone(){} event message_t* RadioRx.received(message_t *frame) { // signal it to responsible client component return signal FrameRx.received(frame); } event void RadioToken.granted() { ASSERT(0); // should never happen, because we never call RadioToken.request() } event void GTSrequestTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) {} default event void MLME_GTS.indication ( uint16_t DeviceAddress, uint8_t GtsCharacteristics, ieee154_security_t *security ){} default event void MLME_GTS.confirm ( uint8_t GtsCharacteristics, ieee154_status_t status ){} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoDisassociateP.nc000066400000000000000000000107701207233610700241440ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-10-16 16:18:29 $ * @author Jan Hauer * ======================================================================== */ /** Empty placeholder component for DisassociateP. */ #include "TKN154_MAC.h" module NoDisassociateP { provides { interface Init; interface MLME_DISASSOCIATE; } uses { interface FrameTx as DisassociationIndirectTx; interface FrameTx as DisassociationDirectTx; interface FrameTx as DisassociationToCoord; interface FrameRx as DisassociationDirectRxFromCoord; interface FrameExtracted as DisassociationExtractedFromCoord; interface FrameRx as DisassociationRxFromDevice; interface Pool as TxFramePool; interface Pool as TxControlPool; interface MLME_GET; interface MLME_SET; interface FrameUtility; interface IEEE154Frame as Frame; interface Get as LocalExtendedAddress; } } implementation { command error_t Init.init() { return SUCCESS; } /* ------------------- MLME_DISASSOCIATE (initiating) ------------------- */ command ieee154_status_t MLME_DISASSOCIATE.request ( uint8_t DeviceAddrMode, uint16_t DevicePANID, ieee154_address_t DeviceAddress, ieee154_disassociation_reason_t DisassociateReason, bool TxIndirect, ieee154_security_t *security ) { return IEEE154_TRANSACTION_OVERFLOW; } event void DisassociationToCoord.transmitDone(ieee154_txframe_t *data, ieee154_status_t status) { } event void DisassociationIndirectTx.transmitDone(ieee154_txframe_t *data, ieee154_status_t status) { } event void DisassociationDirectTx.transmitDone(ieee154_txframe_t *data, ieee154_status_t status) { } /* ------------------- MLME_DISASSOCIATE (receiving) ------------------- */ event message_t* DisassociationDirectRxFromCoord.received(message_t* frame) { return frame; } event message_t* DisassociationExtractedFromCoord.received(message_t* frame, ieee154_txframe_t *txFrame) { return frame; } event message_t* DisassociationRxFromDevice.received(message_t* frame) { return frame; } /* ------------------- Defaults ------------------- */ default event void MLME_DISASSOCIATE.indication ( uint64_t DeviceAddress, ieee154_disassociation_reason_t DisassociateReason, ieee154_security_t *security ){} default event void MLME_DISASSOCIATE.confirm ( ieee154_status_t status, uint8_t DeviceAddrMode, uint16_t DevicePANID, ieee154_address_t DeviceAddress ){} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoDispatchQueueP.nc000066400000000000000000000064771207233610700243060ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-03-05 10:07:14 $ * @author Jan Hauer * ======================================================================== */ /** Placeholder component for DispatchQueueP: frames are forwarded immediately * without queuing, i.e. this component is not a "dead end" like most other * placeholders.*/ #include "TKN154_MAC.h" generic module NoDispatchQueueP() { provides { interface Init as Reset; interface FrameTx[uint8_t client]; interface FrameRx as FrameExtracted[uint8_t client]; interface Purge; } uses { interface Queue; interface FrameTx as FrameTxCsma; interface FrameRx as SubFrameExtracted; } } implementation { uint8_t m_client; command error_t Reset.init() { return SUCCESS; } command ieee154_status_t FrameTx.transmit[uint8_t client](ieee154_txframe_t *txFrame) { ieee154_status_t status; txFrame->client = client; status = call FrameTxCsma.transmit(txFrame); if (status == IEEE154_SUCCESS) m_client = client; return status; } event void FrameTxCsma.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { signal FrameTx.transmitDone[txFrame->client](txFrame, status); } event message_t* SubFrameExtracted.received(message_t* frame) { return signal FrameExtracted.received[m_client](frame); } default event void FrameTx.transmitDone[uint8_t client](ieee154_txframe_t *txFrame, ieee154_status_t status){} command ieee154_status_t Purge.purge(uint8_t msduHandle) { return IEEE154_INVALID_HANDLE; } default event void Purge.purgeDone(ieee154_txframe_t *txFrame, ieee154_status_t status){} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoDispatchSlottedCsmaP.nc000066400000000000000000000121121207233610700254230ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2009-10-27 11:29:15 $ * @author Jan Hauer * ======================================================================== */ /** Empty placeholder component for DispatchSlottedCsmaP. */ #include "TKN154_PHY.h" #include "TKN154_MAC.h" generic module NoDispatchSlottedCsmaP(uint8_t sfDirection) { provides { interface Init as Reset; interface FrameTx as FrameTx; interface FrameRx as FrameRx[uint8_t frameType]; interface FrameExtracted as FrameExtracted[uint8_t frameType]; interface FrameTxNow as BroadcastTx; interface Notify as WasRxEnabled; } uses { interface Alarm as CapEndAlarm; interface Alarm as BLEAlarm; interface Alarm as RxWaitAlarm; interface GetNow as IsRadioTokenRequested; interface TransferableResource as RadioToken; interface ResourceRequested as RadioTokenRequested; interface SuperframeStructure; interface GetNow as IsRxEnableActive; interface Get as GetIndirectTxFrame; interface Notify as RxEnableStateChange; interface GetNow as IsTrackingBeacons; interface Notify as PIBUpdateMacRxOnWhenIdle; interface FrameUtility; interface SlottedCsmaCa; interface RadioRx; interface RadioOff; interface MLME_GET; interface MLME_SET; interface TimeCalc; interface Leds; interface SetNow as FrameBackup; interface GetNow as FrameRestore; interface StdControl as TrackSingleBeacon; interface MLME_SYNC_LOSS; } } implementation { enum { COORD_ROLE = (sfDirection == OUTGOING_SUPERFRAME), DEVICE_ROLE = !COORD_ROLE, RADIO_CLIENT_CFP = COORD_ROLE ? RADIO_CLIENT_COORDCFP : RADIO_CLIENT_DEVICECFP, }; command error_t Reset.init() { return SUCCESS; } async event void RadioToken.transferredFrom(uint8_t c) { call RadioToken.transferTo(RADIO_CLIENT_CFP); } command ieee154_status_t FrameTx.transmit(ieee154_txframe_t *frame) { return IEEE154_TRANSACTION_OVERFLOW; } async event void RadioOff.offDone(){ } async event void RadioRx.enableRxDone(){} async event void CapEndAlarm.fired(){ } async event void BLEAlarm.fired(){ } event void RxEnableStateChange.notify(bool whatever){ } async event void RxWaitAlarm.fired(){ } async event void SlottedCsmaCa.transmitDone(ieee154_txframe_t *frame, ieee154_csma_t *csma, bool ackPendingFlag, uint16_t remainingBackoff, error_t result) { } event message_t* RadioRx.received(message_t* frame) { return frame; } async command ieee154_status_t BroadcastTx.transmitNow(ieee154_txframe_t *frame) { return IEEE154_TRANSACTION_OVERFLOW;} event void RadioToken.granted() { } command error_t WasRxEnabled.enable(){return FAIL;} command error_t WasRxEnabled.disable(){return FAIL;} event void PIBUpdateMacRxOnWhenIdle.notify( const void* val ) {} async event void RadioTokenRequested.requested(){ } async event void RadioTokenRequested.immediateRequested(){ } event void MLME_SYNC_LOSS.indication ( ieee154_status_t lossReason, uint16_t PANId, uint8_t LogicalChannel, uint8_t ChannelPage, ieee154_security_t *security ){ } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoIndirectTxP.nc000066400000000000000000000062621207233610700236070ustar00rootroot00000000000000/* * Copyright (c) 2011, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== * Author(s): Jan Hauer * ======================================================================== */ /** Empty placeholder component for IndirectTxP. */ module NoIndirectTxP { provides { interface Init as Reset; interface FrameTx[uint8_t client]; interface WriteBeaconField as PendingAddrWrite; interface Notify as PendingAddrSpecUpdated; interface Get as GetIndirectTxFrame; interface Purge; } uses { interface FrameTx as CoordCapTx; interface FrameRx as DataRequestRx; interface MLME_GET; interface IEEE154Frame; interface Timer as IndirectTxTimeout; interface TimeCalc; interface Leds; } } implementation { command error_t Reset.init() { return SUCCESS; } command ieee154_status_t Purge.purge(uint8_t msduHandle) { return IEEE154_INVALID_HANDLE; } command uint8_t PendingAddrWrite.write(uint8_t *lastBytePtr, uint8_t maxlen) { *lastBytePtr = 0; return 1; } command ieee154_status_t FrameTx.transmit[uint8_t client](ieee154_txframe_t *txFrame) { return IEEE154_TRANSACTION_OVERFLOW; } event message_t* DataRequestRx.received(message_t* frame) { return frame; } event void IndirectTxTimeout.fired() { } event void CoordCapTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { } command ieee154_txframe_t* GetIndirectTxFrame.get() { return NULL;} command error_t PendingAddrSpecUpdated.enable() {return FAIL;} command error_t PendingAddrSpecUpdated.disable() {return FAIL;} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoPollP.nc000066400000000000000000000062261207233610700224400ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2010-01-05 16:41:16 $ * @author Jan Hauer * ======================================================================== */ /** Empty placeholder component for PollP. */ #include "TKN154_MAC.h" module NoPollP { provides { interface Init; interface MLME_POLL; interface FrameRx as DataRx; interface DataRequest as DataRequest[uint8_t client]; } uses { interface FrameTx as PollTx; interface FrameExtracted as DataExtracted; interface FrameUtility; interface Pool as TxFramePool; interface Pool as TxControlPool; interface MLME_GET; interface Get as LocalExtendedAddress; } } implementation { command error_t Init.init() { return SUCCESS; } command ieee154_status_t MLME_POLL.request ( uint8_t coordAddrMode, uint16_t coordPANID, ieee154_address_t coordAddress, ieee154_security_t *security) { return IEEE154_TRANSACTION_OVERFLOW; } command ieee154_status_t DataRequest.poll[uint8_t client](uint8_t CoordAddrMode, uint16_t CoordPANId, uint8_t *CoordAddressLE, uint8_t srcAddrMode) { return IEEE154_TRANSACTION_OVERFLOW; } event message_t* DataExtracted.received(message_t* frame, ieee154_txframe_t *txFrame) { return frame; } event void PollTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status) { } } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoPromiscuousModeP.nc000066400000000000000000000062401207233610700246630ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2010-02-04 16:31:15 $ * @author Jan Hauer * ======================================================================== */ /** Empty placeholder component for PromiscuousModeP. */ #include "TKN154_PHY.h" #include "TKN154_MAC.h" module NoPromiscuousModeP { provides { interface Init; interface SplitControl as PromiscuousMode; interface Get as PromiscuousModeGet; interface FrameRx; interface GetNow as IsRadioTokenRequested; } uses { interface TransferableResource as RadioToken; interface RadioRx as PromiscuousRx; interface RadioOff; interface Set as RadioPromiscuousMode; } } implementation { command error_t Init.init() { return SUCCESS; } /* ----------------------- Promiscuous Mode ----------------------- */ command bool PromiscuousModeGet.get() { return FALSE; } command error_t PromiscuousMode.start() { return FAIL; } event void RadioToken.granted() { ASSERT(0);} event message_t* PromiscuousRx.received(message_t *frame) { return frame; } async event void PromiscuousRx.enableRxDone(){} command error_t PromiscuousMode.stop() { return FAIL; } async event void RadioOff.offDone() { } default event void PromiscuousMode.startDone(error_t error){} default event void PromiscuousMode.stopDone(error_t error){} async command token_requested_t IsRadioTokenRequested.getNow(){ return FALSE;} async event void RadioToken.transferredFrom(uint8_t clientFrom){ASSERT(0);} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoRxEnableP.nc000066400000000000000000000064401207233610700232300ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:40 $ * @author Jan Hauer * ======================================================================== */ /** Empty placeholder component for RxEnableP. */ #include "TKN154_PHY.h" #include "TKN154_MAC.h" module NoRxEnableP { provides { interface Init; interface MLME_RX_ENABLE; interface GetNow as IsRxEnableActive; interface Notify as RxEnableStateChange; } uses { interface Timer as RxEnableTimer; interface Get as IsMacPanCoordinator; interface GetNow as IsTrackingBeacons; interface GetNow as IsSendingBeacons; interface SuperframeStructure as IncomingSuperframeStructure; interface SuperframeStructure as OutgoingSuperframeStructure; interface Notify as WasRxEnabled; interface TimeCalc; } } implementation { command error_t Init.init() { return SUCCESS; } /* ----------------------- MLME-RX-ENABLE ----------------------- */ command ieee154_status_t MLME_RX_ENABLE.request ( bool DeferPermit, uint32_t RxOnTime, uint32_t RxOnDuration ) { return IEEE154_TRANSACTION_OVERFLOW; } event void RxEnableTimer.fired() {} async command bool IsRxEnableActive.getNow() { return FALSE; } event void WasRxEnabled.notify( bool val ) { } command error_t RxEnableStateChange.enable(){return FAIL;} command error_t RxEnableStateChange.disable(){return FAIL;} default event void MLME_RX_ENABLE.confirm(ieee154_status_t status){} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/dummies/NoScanP.nc000066400000000000000000000074751207233610700224250ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2009-03-24 12:56:47 $ * @author Jan Hauer * ======================================================================== */ /** Empty placeholder component for ScanP. */ #include "TKN154_MAC.h" module NoScanP { provides { interface Init; interface MLME_SCAN; interface MLME_BEACON_NOTIFY; interface GetNow as IsRadioTokenRequested; } uses { interface MLME_GET; interface MLME_SET; interface EnergyDetection; interface RadioOff; interface RadioRx; interface RadioTx; interface IEEE154Frame as Frame; interface IEEE154BeaconFrame as BeaconFrame; interface Timer as ScanTimer; interface Pool as TxFramePool; interface Pool as TxControlPool; interface TransferableResource as RadioToken; interface FrameUtility; interface Leds; } } implementation { command error_t Init.init() { return SUCCESS;} command ieee154_status_t MLME_SCAN.request ( uint8_t ScanType, uint32_t ScanChannels, uint8_t ScanDuration, uint8_t ChannelPage, uint8_t EnergyDetectListNumEntries, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumEntries, ieee154_PANDescriptor_t* PANDescriptorList, ieee154_security_t *security ) { return IEEE154_TRANSACTION_OVERFLOW; } event void RadioToken.granted() { ASSERT(0); } event void EnergyDetection.done(error_t status, int8_t EnergyLevel){} async event void RadioRx.enableRxDone(){} event message_t* RadioRx.received(message_t *frame) { return frame; } async event void RadioTx.transmitDone(ieee154_txframe_t *frame, error_t result){} event void ScanTimer.fired() { } async event void RadioOff.offDone() { } async event void RadioToken.transferredFrom(uint8_t fromClient){ASSERT(0);} async command token_requested_t IsRadioTokenRequested.getNow(){ return FALSE;} } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/extras/000077500000000000000000000000001207233610700204305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/extras/extaddr.extra000066400000000000000000000002711207233610700231300ustar00rootroot00000000000000ifeq ($(EXTADDR),) $(error To set an extended address X pass 'extaddr,X' to the make system (e.g. "make telosb extaddr,0x012345")) endif PFLAGS += -DIEEE154_EXTENDED_ADDRESS=$(EXTADDR) tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/extras/tkn154debug.extra000066400000000000000000000001361207233610700235320ustar00rootroot00000000000000CFLAGS += -DTKN154_DEBUG CFLAGS += -I$(TOSDIR)/lib/printf CFLAGS += -DPRINTF_BUFFER_SIZE=1000 tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/000077500000000000000000000000001207233610700212455ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MCPS/000077500000000000000000000000001207233610700220075ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MCPS/MCPS_DATA.nc000066400000000000000000000105521207233610700236670ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:40 $ * @author: Jan Hauer * ======================================================================== */ /** * The MCPS-DATA.request primitive requests the transfer of a data SPDU (i.e., * MSDU) from a local SSCS entity to a single peer SSCS entity. (IEEE * 802.15.4-2006, Sect. 7.1.1) */ #include "TKN154.h" #include interface MCPS_DATA { /** * "Requests to transfer a data SPDU (i.e., MSDU) from a local SSCS * entity to a single peer SSCS entity." (IEEE 802.15.4-2006, Sec. * 7.1.1.1) * * The source/destination addressing mode, destination PAN * identifier, destination address, the payload and (optionally) the * security mode/key are part of the frame and must have * been set (through the IEEE154Frame interface) before * calling this command. * * If this command returns IEEE154_SUCCESS, then the confirm event * will be signalled in the future; otherwise, the confirm event * will not be signalled. * * @param frame The frame to send * @param payloadLen The length of the frame payload * @param msduHandle Handle associated with the frame * @param TxOptions Bitwised OR transmission options * * @return IEEE154_SUCCESS if the request succeeded and only * then the confirm() event will be signalled; * an appropriate error code otherwise * @see confirm */ command ieee154_status_t request ( message_t *frame, uint8_t payloadLen, uint8_t msduHandle, uint8_t TxOptions ); /** * Reports the result of a request to transfer a frame to a peer * SSCS entity. * * @param frame The frame which was requested to be sent * @param msduHandle The handle associated with the frame * @param status The status of the last MSDU transmission * @param timestamp Time of transmission (invalid if status * is not IEEE154_SUCCESS) */ event void confirm ( message_t *frame, uint8_t msduHandle, ieee154_status_t status, uint32_t Timestamp ); /** * Indicates the arrival of a frame. Use the IEEE154Frame * interface to get the payload, source/destination addresses, DSN * and other information associated with this frame. * * @return A frame buffer for the stack to use for the next received frame */ event message_t* indication ( message_t* frame ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MCPS/MCPS_PURGE.nc000066400000000000000000000050361207233610700240410ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:40 $ * @author: Jan Hauer * ======================================================================== */ /** * The MCPS-PURGE.request primitive allows the next higher layer to purge an * MSDU from the transaction queue. (IEEE 802.15.4-2006, Sect. 7.1.1) */ #include "TKN154.h" interface MCPS_PURGE { /** * Requests to purge a frame from the transaction queue. The result * will be returned immediately (there is no confirm event for this * command). * * @param msduHandle The handle of the frame to be purged from the * transaction queue * * @return IEEE154_SUCCESS if the request succeeded, an * appropriate error code otherwise */ command ieee154_status_t request ( uint8_t msduHandle ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/000077500000000000000000000000001207233610700217775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_ASSOCIATE.nc000066400000000000000000000132411207233610700244470ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:40 $ * @author: Jan Hauer * ======================================================================== */ /** * MLME-SAP association primitives define how a device becomes * associated with a PAN. (IEEE 802.15.4-2006, Sect. 7.1.3) */ #include "TKN154.h" interface MLME_ASSOCIATE { /** * Requests to associate with a PAN. * * @param LogicalChannel The logical channel on which to attempt * association * @param ChannelPage The channel page on which to attempt association * @param CoordAddrMode The coordinator addressing mode * @param CoordPANID The 16 bit PAN identifier of the coordinator * @param CoordAddress Individual device address of the coordinator as * per the CoordAddrMode * @param CapabilityInformation Specifies the operational capabilities * of the associating device * @param security The security options (NULL means security is * disabled) * * @return IEEE154_SUCCESS if the request succeeded and a confirm event * will be signalled, an appropriate error code otherwise * (no confirm event will be signalled in this case) * @see confirm */ command ieee154_status_t request ( uint8_t LogicalChannel, uint8_t ChannelPage, uint8_t CoordAddrMode, uint16_t CoordPANID, ieee154_address_t CoordAddress, ieee154_CapabilityInformation_t CapabilityInformation, ieee154_security_t *security ); /** * Notification that a device has requested to associate with this PAN. * * @param DeviceAddress the 64-bit address of the requesting device * @param CapabilityInformation Specifies the operational capabilities * of the associating device * @param security The security options (NULL means security is * disabled) */ event void indication ( uint64_t DeviceAddress, ieee154_CapabilityInformation_t CapabilityInformation, ieee154_security_t *security ); /** * Sends a response to a device that requested to associate with this PAN. * * @param DeviceAddress The 64-bit address of the device to respond to * @param AssocShortAddress The short device address allocated by the * coordinator on successful allocation. * @param status The status of the association attempt * @param security The security options (NULL means security is * disabled) * * @return IEEE154_SUCCESS if the request succeeded and an indication event * will be signalled through the MLME_COMM_STATUS interface later, * an appropriate error code otherwise (no MLME_COMM_STATUS.indication * event will be signalled in this case) */ command ieee154_status_t response ( uint64_t DeviceAddress, uint16_t AssocShortAddress, ieee154_association_status_t status, ieee154_security_t *security ); /** * Confirms an association attempt. * * @param AssocShortAddress The short device address allocated by the * coordinator on successful association * @param status The status of the association attempt * @param security The security options, NULL means security is * disabled */ event void confirm ( uint16_t AssocShortAddress, uint8_t status, ieee154_security_t *security ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_BEACON_NOTIFY.nc000066400000000000000000000052531207233610700251570ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:40 $ * @author: Jan Hauer * ======================================================================== */ /** * The MLME-SAP beacon notification primitive defines how a device may be * notified when a beacon is received during normal operating conditions. * (IEEE 802.15.4-2006, Sect. 7.1.5) */ #include "TKN154.h" #include interface MLME_BEACON_NOTIFY { /** * A beacon frame has been received. This event is signalled only if * either the PIB attribute macAutoRequest is set to FALSE * or the beacon payload is not empty. * * The beacon parameters can be accessed through the * IEEE154BeaconFrame interface. The IEEE154Frame * interface can be used to inspect the addressing fields in the MAC * header. * * @param beacon The beacon frame * * @return A frame buffer for the stack to use for the next received frame */ event message_t* indication ( message_t *beaconFrame ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_COMM_STATUS.nc000066400000000000000000000063151207233610700247760ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:40 $ * @author: Jan Hauer * ======================================================================== */ /** * The MLME-SAP communication status primitive defines how the MLME * communicates to the next higher layer about transmission status, * when the transmission was instigated by a response primitive, and * about security errors on incoming packets. (IEEE 802.15.4-2006, * Sect. 7.1.12) */ #include "TKN154.h" interface MLME_COMM_STATUS { /** * Allows the MLME to indicate a communications status. * * @param PanID The 16-bit PAN identifier of the device from which the * frame was received or to which the frame was being sent * @param SrcAddrMode The source addressing mode * @param SrcAddr Individual device address of the source as per SrcAddrMode * @param DstAddrMode The destination addressing mode * @param DstAddr Individual device address of the destination * as per DstAddrMode * @param status The communications status * @param security The security options, NULL means security is * disabled */ event void indication ( uint16_t PANId, uint8_t SrcAddrMode, ieee154_address_t SrcAddr, uint8_t DstAddrMode, ieee154_address_t DstAddr, ieee154_status_t status, ieee154_security_t *security ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_DISASSOCIATE.nc000066400000000000000000000116571207233610700250200ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:42 $ * @author: Jan Hauer * ======================================================================== */ /** * The MLME-SAP disassociation primitives define how a device can * disassociate from a PAN. (IEEE 802.15.4-2006, Sect. 7.1.4) */ #include "TKN154.h" interface MLME_DISASSOCIATE { /** * Requests disassociation from a PAN. * * @param DeviceAddrMode The addressing mode of the device to which to send * the disassociation notification command. * @param DevicePANID The PAN identifier of the device to which to send the * disassociation notification command. * @param DeviceAddress The address of the device to which to send the * disassociation notification command * @param DisassociateReason The reason for the disassociation * @param TxIndirect TRUE if disassociation notification command is to be sent * indirectly * @param security The security options (NULL means security is * disabled) * * @return IEEE154_SUCCESS if the request succeeded and a confirm event * will be signalled, an appropriate error code otherwise * (no confirm event will be signalled in this case) * @see confirm */ command ieee154_status_t request ( uint8_t DeviceAddrMode, uint16_t DevicePANID, ieee154_address_t DeviceAddress, ieee154_disassociation_reason_t DisassociateReason, bool TxIndirect, ieee154_security_t *security ); /** * Signals that a device has requested disassociation from this PAN. * * @param DeviceAddress the 64-bit address of the requesting device * @param DisassociateReason Reason for the disassociation * @param security The security options (NULL means security is * disabled) */ event void indication ( uint64_t DeviceAddress, ieee154_disassociation_reason_t DisassociateReason, ieee154_security_t *security ); /** * Confirmsn a disassociation attempt. * * @param status The status of the disassociation attempt * @param DeviceAddrMode The addressing mode of the device that has either * requested disassociation or been instructed to * disassociate by its coordinator. * @param DevicePANID The PAN identifier of the device that has either * requested disassociation or been instructed to * disassociate by its coordinator. * @param DeviceAddress The address of the device that has either requested * disassociation or been instructed to disassociate * by its coordinator. */ event void confirm ( ieee154_status_t status, uint8_t DeviceAddrMode, uint16_t DevicePANID, ieee154_address_t DeviceAddress ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_GET.nc000066400000000000000000000154161207233610700235610ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:42 $ * @author Jan Hauer * ======================================================================== */ /** * This interface allows to read attribute values from the PHY/MAC PIB. * Instead of passing the PIB attribute identifier, there is a separate * command per attribute (and there are no confirm events). * * NOTE: for the attributes macBeaconPayload (0x45) and * macBeaconPayloadLength (0x46) use the * IEEE154TxBeaconPayload interface; for promiscuous mode * there is a separate (SplitControl) interface. */ #include "TKN154.h" interface MLME_GET { /** @return PIB attribute phyCurrentChannel (0x00) */ command ieee154_phyCurrentChannel_t phyCurrentChannel(); /** @return PIB attribute phyChannelsSupported (0x01) */ command ieee154_phyChannelsSupported_t phyChannelsSupported(); /** @return PIB attribute phyTransmitPower (0x02) */ command ieee154_phyTransmitPower_t phyTransmitPower(); /** @return PIB attribute phyCCAMode (0x03) */ command ieee154_phyCCAMode_t phyCCAMode(); /** @return PIB attribute phyCurrentPage (0x04) */ command ieee154_phyCurrentPage_t phyCurrentPage(); /** @return PIB attribute phyMaxFrameDuration (0x05) */ command ieee154_phyMaxFrameDuration_t phyMaxFrameDuration(); /** @return PIB attribute phySHRDuration (0x06) */ command ieee154_phySHRDuration_t phySHRDuration(); /** @return PIB attribute phySymbolsPerOctet (0x07) */ command ieee154_phySymbolsPerOctet_t phySymbolsPerOctet(); /** @return PIB attribute macAckWaitDuration (0x40) */ command ieee154_macAckWaitDuration_t macAckWaitDuration(); /** @return PIB attribute macAssociationPermit (0x41) */ command ieee154_macAssociationPermit_t macAssociationPermit(); /** @return PIB attribute macAutoRequest (0x42) */ command ieee154_macAutoRequest_t macAutoRequest(); /** @return PIB attribute macBattLifeExt (0x43) */ command ieee154_macBattLifeExt_t macBattLifeExt(); /** @return PIB attribute macBattLifeExtPeriods (0x44) */ command ieee154_macBattLifeExtPeriods_t macBattLifeExtPeriods(); /* macBeaconPayload (0x45) and macBeaconPayloadLength (0x46) are read * through the IEEE154TxBeaconPayload interface. */ /** @return PIB attribute macBeaconOrder (0x47) */ command ieee154_macBeaconOrder_t macBeaconOrder(); /** @return PIB attribute macBeaconTxTime (0x48) */ command ieee154_macBeaconTxTime_t macBeaconTxTime(); /** @return PIB attribute macBSN (0x49) */ command ieee154_macBSN_t macBSN(); /** @return PIB attribute macCoordExtendedAddress (0x4A) */ command ieee154_macCoordExtendedAddress_t macCoordExtendedAddress(); /** @return PIB attribute macCoordShortAddress (0x4B) */ command ieee154_macCoordShortAddress_t macCoordShortAddress(); /** @return PIB attribute macDSN (0x4C) */ command ieee154_macDSN_t macDSN(); /** @return PIB attribute macGTSPermit (0x4D) */ command ieee154_macGTSPermit_t macGTSPermit(); /** @return PIB attribute macMaxCSMABackoffs (0x4E) */ command ieee154_macMaxCSMABackoffs_t macMaxCSMABackoffs(); /** @return PIB attribute macMinBE (0x4F) */ command ieee154_macMinBE_t macMinBE(); /** @return PIB attribute macPANId (0x50) */ command ieee154_macPANId_t macPANId(); /** @return PIB attribute macPromiscuousMode (0x51) */ command ieee154_macPromiscuousMode_t macPromiscuousMode(); /** @return PIB attribute macRxOnWhenIdle (0x52) */ command ieee154_macRxOnWhenIdle_t macRxOnWhenIdle(); /** @return PIB attribute macShortAddress (0x53) */ command ieee154_macShortAddress_t macShortAddress(); /** @return PIB attribute macSuperframeOrder (0x54) */ command ieee154_macSuperframeOrder_t macSuperframeOrder(); /** @return PIB attribute macTransactionPersistenceTime (0x55) */ command ieee154_macTransactionPersistenceTime_t macTransactionPersistenceTime(); /** @return PIB attribute macAssociatedPANCoord (0x56) */ command ieee154_macAssociatedPANCoord_t macAssociatedPANCoord(); /** @return PIB attribute macMaxBE (0x57) */ command ieee154_macMaxBE_t macMaxBE(); /** @return PIB attribute macMaxFrameTotalWaitTime (0x58) */ command ieee154_macMaxFrameTotalWaitTime_t macMaxFrameTotalWaitTime(); /** @return PIB attribute macMaxFrameRetries (0x59) */ command ieee154_macMaxFrameRetries_t macMaxFrameRetries(); /** @return PIB attribute macResponseWaitTime (0x5A) */ command ieee154_macResponseWaitTime_t macResponseWaitTime(); /** @return PIB attribute macSyncSymbolOffset (0x5B) */ command ieee154_macSyncSymbolOffset_t macSyncSymbolOffset(); /** @return PIB attribute macTimestampSupported (0x5C) */ command ieee154_macTimestampSupported_t macTimestampSupported(); /** @return PIB attribute macSecurityEnabled (0x5D) */ command ieee154_macSecurityEnabled_t macSecurityEnabled(); /** @return PIB attribute macMinLIFSPeriod */ command ieee154_macMinLIFSPeriod_t macMinLIFSPeriod(); /** @return PIB attribute macMinSIFSPeriod */ command ieee154_macMinSIFSPeriod_t macMinSIFSPeriod(); /** @return custom attribute macPanCoordinator */ command ieee154_macPanCoordinator_t macPanCoordinator(); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_GTS.nc000066400000000000000000000116471207233610700236010ustar00rootroot00000000000000/* * Copyright (c) 2010, CISTER/ISEP - Polytechnic Institute of Porto * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * * * @author Ricardo Severino * @author Stefano Tennina * ======================================================================== */ /** * The MLME-SAP GTS management primitives define how GTSs are * requested and maintained. A device wishing to use these primitives * and GTSs in general will already be tracking the beacons of its PAN * coordinator. (IEEE 802.15.4-2006, Sect. 7.1.7) */ #include "TKN154.h" interface MLME_GTS { /** * Request allocation of a new GTS or deallocation * * @param GtsCharacteristics The characteristics of the GTS request * @param security The security options (NULL means security is * disabled) * @return IEEE154_SUCCESS if the request succeeded and a confirm event * will be signalled, an appropriate error code otherwise * (no confirm event will be signalled in this case) * @see confirm */ command ieee154_status_t request ( uint8_t GtsCharacteristics, ieee154_security_t *security ); /** * Request deallocation of a device's GTS slot by the PAN coordinator. * * This command extends the standard primitives to allow a PAN coordinator to * specify the address of the device, whose GTS should be deallocated. This * information is not provided in the regular MLME_GTS.request interface, but * it is required when the next higher layer on the PAN coordinator wants to * specify whose device's slot should be deallocated. * * @param GtsCharacteristics The characteristics of the GTS request * @param DeviceAddress Short address of the device, whose GTS is to * be deallocated * @param security The security options (NULL means security is * disabled) * @return IEEE154_SUCCESS if the request succeeded and a confirm event * will be signalled, an appropriate error code otherwise * (no confirm event will be signalled in this case) * @see confirm */ command ieee154_status_t requestFromPAN ( uint8_t GtsCharacteristics, uint16_t DeviceAddress, ieee154_security_t *security); /** * Reports the results of a request to allocate a new GTS or * deallocate an existing GTS * * @param GtsCharacteristics The characteristics of the GTS request * @param status The status of the GTS request */ event void confirm ( uint8_t GtsCharacteristics, ieee154_status_t status ); /** * Indicates that a GTS has been allocated or that a previously allocated * GTS has been deallocated * * All pointers are valid only until the return of this event. * * @param DeviceAddress Short address of the device that has been allocated * or deallocated a GTS * @param GtsCharacteristics The characteristics of the GTS request * @param security The security options, NULL means security is * disabled */ event void indication ( uint16_t DeviceAddress, uint8_t GtsCharacteristics, ieee154_security_t *security ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_ORPHAN.nc000066400000000000000000000100611207233610700241200ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:42 $ * @author Jan Hauer * ======================================================================== */ /** * MLME-SAP orphan notification primitives define how a coordinator * can issue a notification of an orphaned device. (IEEE 802.15.4-2006, * Sect. 7.1.8) */ #include "TKN154.h" interface MLME_ORPHAN { /** * Allows the MLME of a coordinator to notify the next higher layer of the * presence of an orphaned device * * @param OrphanAddress The 64-bit extended address of the orphaned device * @param security The security options (NULL means security is * disabled) */ event void indication ( uint64_t OrphanAddress, ieee154_security_t *security ); /** * Allows the next higher layer of a coordinator to respond to the * indication primitive * * @param OrphanAddres The 64-bit extended address of the orphaned device * @param ShortAddress The 16-bit short address allocated to the orphaned * device if it is associated with this coordinator. The * special short address 0xfffe indicates that no short * address was allocated, and the device will use its * 64-bit extended address in all communications. If the * device was not associated with this coordinator, this * field will contain the value 0xffff and be ignored on * receipt. * @param AssociatedMember TRUE if the orphaned device is associated * with this coordinator * @param security The security options (NULL means security is * disabled) * @return IEEE154_SUCCESS if the request succeeded and an indication event * will be signalled through the MLME_COMM_STATUS interface later, * otherwise an appropriate error code (no MLME_COMM_STATUS.indication * event will be signalled in this case) */ command ieee154_status_t response ( uint64_t OrphanAddres, uint16_t ShortAddress, bool AssociatedMember, ieee154_security_t *security ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_POLL.nc000066400000000000000000000064141207233610700237060ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:42 $ * @author Jan Hauer * ======================================================================== */ /** * MLME-SAP polling primitives define how to request data from a * coordinator. (IEEE 802.15.4-2006, Sect. 7.1.16) */ #include "TKN154.h" interface MLME_POLL { /** * Prompts the device to request data from the coordinator. * * @param CoordAddrMode The addressing mode of the coordinator to which * the poll is intended * @param CoordPANID The PAN identifier of the coordinator to which the * poll is intended * @param CoordAddress The address of the coordinator to which the * poll is intended * @param security The security options (NULL means security is * disabled) * @return IEEE154_SUCCESS if the request succeeded and a confirm event * will be signalled, an appropriate error code otherwise * (no confirm event will be signalled in this case) * @see confirm */ command ieee154_status_t request ( uint8_t CoordAddrMode, uint16_t CoordPANID, ieee154_address_t CoordAddress, ieee154_security_t *security ); /** * Reports the results of a request to poll the coordinator for data * * @param status The status of the data request */ event void confirm ( ieee154_status_t status ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_RESET.nc000066400000000000000000000071701207233610700240220ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:42 $ * @author Jan Hauer * ======================================================================== */ /** * MLME-SAP reset primitives specify how to reset the MAC sublayer to * its default values. (IEEE 802.15.4-2006, Sect. 7.1.9) */ #include "TKN154.h" interface MLME_RESET { /** * Allows the next higher layer to request that the MLME performs a * reset operation. This command initializes the MAC and must be * called at least once before the MAC can be used. * * Two things are important: * (1) This command will fail while promiscuous mode is enabled * (promiscuous mode is controlled through a separate SplitControl * interface). (2) While the MLME_RESET.confirm is pending the next * higher layer MUST NOT call any MAC commands; if there are any * other pending request the MAC will signal their corresponding confirm * events before MLME_RESET.confirm is signalled (with a status code of * IEEE154_TRANSACTION_OVERFLOW). * * @param SetDefaultPIB If TRUE, the MAC sublayer is reset and all MAC PIB * attributes are set to their default values. If * FALSE, the MAC sublayer is reset but all MAC PIB * attributes retain their values prior to the * generation of the reset primitive. * * @return IEEE154_SUCCESS if the request succeeded and a confirm event * will be signalled, an appropriate error code otherwise * (no confirm event will be signalled in this case) * */ command ieee154_status_t request ( bool SetDefaultPIB ); /** * Reports the results of the reset operation * * @param status The status of the reset operation */ event void confirm ( ieee154_status_t status ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_RX_ENABLE.nc000066400000000000000000000066501207233610700245010ustar00rootroot00000000000000 /* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:42 $ * @author Jan Hauer * ======================================================================== */ /** * MLME-SAP receiver state primitives define how a device can enable * or disable the receiver at a given time. (IEEE 802.15.4-2006, Sect. * 7.1.10) */ #include "TKN154.h" interface MLME_RX_ENABLE { /** * Allows the next higher layer to request that the receiver is * enabled for a finite period of time * * @param DeferPermit TRUE if the receiver enable can be deferred until * during the next superframe if the requested time has * already passed * @param RxOnTime The number of symbols from the start of the superframe * before the receiver is to be enabled. The precision * of this value is a minimum of 20 bits. This parameter * is ignored for nonbeacon-enabled PANs * @param RxOnDuration The number of symbols for which the receiver * is to be enabled * @return IEEE154_SUCCESS if the request succeeded and a confirm event * will be signalled, an appropriate error code otherwise * (no confirm event will be signalled in this case) * @see confirm */ command ieee154_status_t request ( bool DeferPermit, uint32_t RxOnTime, uint32_t RxOnDuration ); /** * Reports the results of the attempt to enable the receiver * * @param status The status of the receiver enable request */ event void confirm ( ieee154_status_t status ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_SCAN.nc000066400000000000000000000145631207233610700236700ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:42 $ * @author Jan Hauer * ======================================================================== */ /** * MLME-SAP scan primitives define how a device can determine the * energy usage or the presence or absence of PANs in a communications * channel. (IEEE 802.15.4-2006, Sect. 7.1.10) */ #include "TKN154.h" interface MLME_SCAN { /** * Initializes a channel scan over a given list of channels. * * If the PIB attribute macAutoRequest is set to FALSE, then * for each received beacon a PAN descriptor is signalled to the next higher * layer through a separate MLME_BEACON_NOTIFY.indication() * event; otherwise the result of the channel scan is stored in a user * allocated buffer, either EnergyDetectList or * PANDescriptorList depending on ScanType, and the * buffer is returned when the scan is completed. * * Both of the parameters EnergyDetectList and * PANDescriptorList may be NULL, but at least one of them * must be NULL. * * @param ScanType The type of scan performed: ENERGY_DETECTION_SCAN, * ACTIVE_SCAN, PASSIVE_SCAN or ORPHAN_SCAN * @param ScanChannels The 27 LSBs indicate which channels are to be * scanned (1 = scan, 0 = don't scan) * @param ScanDuration Value used to calculate the length of time to * spend scanning each channel for ED, active, and * passive scans. This parameter is ignored for * orphan scans. * @param ChannelPage The channel page on which to perform the scan * @param EnergyDetectListNumEntries The number of entries in the * EnergyDetectList. * @param EnergyDetectList An empty buffer (allocated by the caller) * to store the result of the energy measurements * or NULL if the result should not be stored * @param PANDescriptorListNumEntries The number of entries in the * PANDescriptorList. * @param PANDescriptorList An empty buffer (allocated by the caller) * to store the result of the active/passive scan * or NULL if the result should not be stored * @param security The security options (NULL means security is * disabled) * @return IEEE154_SUCCESS if the request succeeded and a confirm event * will be signalled, an appropriate error code otherwise * (no confirm event will be signalled in this case) * @see confirm */ command ieee154_status_t request ( uint8_t ScanType, uint32_t ScanChannels, uint8_t ScanDuration, uint8_t ChannelPage, uint8_t EnergyDetectListNumEntries, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumEntries, ieee154_PANDescriptor_t* PANDescriptorList, ieee154_security_t *security ); /** * Reports the results of the channel scan request, returning * the buffers passed in the request command. * * @param status The status of the scan request * @param ScanType The type of scan performed * @param ChannelPage The channel page on which the scan * was performed (see 6.1.2). * @param UnscannedChannels The 27 LSBs indicate which channels are not * scanned (0 = scanned, 1 = not scanned) * @param EnergyDetectNumResults The number of valid entries in the * EnergyDetectList. * @param EnergyDetectList The buffer list of energy measurements, one for * each channel searched during an ED scan @param PANDescriptorListNumResults The number of valid entries in the * PANDescriptorList. * @param PANDescriptorList The list of PAN descriptors, one for each * unique beacon found during an active or passive scan */ event void confirm ( ieee154_status_t status, uint8_t ScanType, uint8_t ChannelPage, uint32_t UnscannedChannels, uint8_t EnergyDetectNumResults, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumResults, ieee154_PANDescriptor_t* PANDescriptorList ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_SET.nc000066400000000000000000000250761207233610700236000ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:42 $ * @author Jan Hauer * ======================================================================== */ /** * This interface allows to set attribute values in the PHY/MAC PIB. * Instead of passing the PIB attribute identifier, there is a separate * command per attribute (and there are no confirm events). * * NOTE: for the attributes macBeaconPayload (0x45) and * macBeaconPayloadLength (0x46) use the * IEEE154TxBeaconPayload interface; for promiscuous mode * there is a separate (SplitControl) interface. */ #include "TKN154.h" interface MLME_SET { /** @param value new PIB attribute value for phyCurrentChannel (0x00) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t phyCurrentChannel(ieee154_phyCurrentChannel_t value); /** @param value new PIB attribute value for phyTransmitPower (0x02) * (2 MSBs are ignored) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t phyTransmitPower(ieee154_phyTransmitPower_t value); /** @param value new PIB attribute value for phyCCAMode (0x03) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t phyCCAMode(ieee154_phyCCAMode_t value); /** @param value new PIB attribute value for phyCurrentPage (0x04) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t phyCurrentPage(ieee154_phyCurrentPage_t value); /** @param value new PIB attribute value for macAssociationPermit (0x41) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macAssociationPermit(ieee154_macAssociationPermit_t value); /** @param value new PIB attribute value for macAutoRequest (0x42) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macAutoRequest(ieee154_macAutoRequest_t value); /** @param value new PIB attribute value for macBattLifeExt (0x43) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macBattLifeExt(ieee154_macBattLifeExt_t value); /** @param value new PIB attribute value for macBattLifeExtPeriods (0x44) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macBattLifeExtPeriods(ieee154_macBattLifeExtPeriods_t value); /* macBeaconPayload (0x45) and macBeaconPayloadLength (0x46) are set * through the IEEE154TxBeaconPayload interface. */ /** @param value new PIB attribute value for macBeaconOrder (0x47) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macBeaconOrder(ieee154_macBeaconOrder_t value); /** @param value new PIB attribute value for macBSN (0x49) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macBSN(ieee154_macBSN_t value); /** @param value new PIB attribute value for macCoordExtendedAddress (0x4A) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macCoordExtendedAddress(ieee154_macCoordExtendedAddress_t value); /** @param value new PIB attribute value for macCoordShortAddress (0x4B) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macCoordShortAddress(ieee154_macCoordShortAddress_t value); /** @param value new PIB attribute value for macDSN (0x4C) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macDSN(ieee154_macDSN_t value); /** @param value new PIB attribute value for macGTSPermit (0x4D) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macGTSPermit(ieee154_macGTSPermit_t value); /** @param value new PIB attribute value for macMaxCSMABackoffs (0x4E) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macMaxCSMABackoffs(ieee154_macMaxCSMABackoffs_t value); /** @param value new PIB attribute value for macMinBE (0x4F) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macMinBE(ieee154_macMinBE_t value); /** @param value new PIB attribute value for macPANId (0x50) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macPANId(ieee154_macPANId_t value); /* macPromiscuousMode (0x51) is (re-)set through the * PromiscuousMode (SplitControl) interface. */ /** @param value new PIB attribute value for macRxOnWhenIdle (0x52) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macRxOnWhenIdle(ieee154_macRxOnWhenIdle_t value); /** @param value new PIB attribute value for macShortAddress (0x53) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macShortAddress(ieee154_macShortAddress_t value); /** @param value new PIB attribute value for macTransactionPersistenceTime (0x55) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macTransactionPersistenceTime(ieee154_macTransactionPersistenceTime_t value); /** @param value new PIB attribute value for macAssociatedPANCoord (0x56) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macAssociatedPANCoord(ieee154_macAssociatedPANCoord_t value); /** @param value new PIB attribute value for macMaxBE (0x57) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macMaxBE(ieee154_macMaxBE_t value); /** @param value new PIB attribute value for macMaxFrameTotalWaitTime (0x58) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macMaxFrameTotalWaitTime(ieee154_macMaxFrameTotalWaitTime_t value); /** @param value new PIB attribute value for macMaxFrameRetries (0x59) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macMaxFrameRetries(ieee154_macMaxFrameRetries_t value); /** @param value new PIB attribute value for macResponseWaitTime (0x5A) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macResponseWaitTime(ieee154_macResponseWaitTime_t value); /** @param value new PIB attribute value for macSecurityEnabled (0x5D) * @returns IEEE154_SUCCESS if PIB attribute was updated, INVALID_PARAMETER if * parameter value is out of valid range and PIB was not updated */ command ieee154_status_t macSecurityEnabled(ieee154_macSecurityEnabled_t value); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_START.nc000066400000000000000000000132201207233610700240260ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-04-17 14:47:09 $ * @author Jan Hauer * ======================================================================== */ /** * MLME-SAP start primitives define how an FFD can request to start * using a new superframe configuration in order to initiate a PAN, * begin transmitting beacons on an already existing PAN, thus * facilitating device discovery, or to stop transmitting beacons. * (IEEE 802.15.4-2006, Sect. 7.1.14) */ #include "TKN154.h" interface MLME_START { /** * Requests to start using a new superframe configuration. * * @param PANId The PAN identifier to be used by the device * @param LogicalChannel The logical channel on which to start transmitting * beacons * @param ChannelPage The channel page on which to begin using the new * superframe configuration. * @param StartTime The time at which to begin transmitting beacons. If this * parameter is equal to 0x000000, beacon transmissions * will begin immediately. Otherwise, the specified time is * relative to the received beacon of the coordinator with * which the device synchronizes. * This parameter is ignored if either the beaconOrder * parameter has a value of 15 or the panCoordinator * parameter is TRUE.The time is specified in symbols and * is rounded to a backoff slot boundary. This is a 24-bit * value, and the precision of this value shall be a * minimum of 20 bits, with the lowest 4 bits being the * least significant. * @param BeaconOrder The beacon order of the superframe * @param SuperframeOrder The superframe order of the superframe * @param PanCoordinator If TRUE, the device will become the PAN coordinator * of a new PAN. If FALSE, the device will begin * transmitting beacons on the PAN with which it * is associated * @param BatteryLifeExtension If TRUE, the receiver of the beaconing * device is disabled after the IFS period * @param CoordRealignment TRUE if a coordinator realignment command is to * be transmitted prior to changing the superframe * configuration * @param coordRealignSecurity The security options for the coordinator * realignment command (NULL means security * is disabled) * @param beaconSecurity The security options for beacon frames * (NULL means security is disabled) * * @return IEEE154_SUCCESS if the request succeeded and a confirm event * will be signalled, an appropriate error code otherwise * (no confirm event will be signalled in this case) * @see confirm */ command ieee154_status_t request ( uint16_t PANId, uint8_t LogicalChannel, uint8_t ChannelPage, uint32_t StartTime, uint8_t BeaconOrder, uint8_t SuperframeOrder, bool PanCoordinator, bool BatteryLifeExtension, bool CoordRealignment, ieee154_security_t *coordRealignSecurity, ieee154_security_t *beaconSecurity ); /** * Signalled in response to a successful request. * Reports the results of the attempt to start using a new superframe * configuration * * @param status The result of the attempt to start using an * updated superframe configuration */ event void confirm ( ieee154_status_t status ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_SYNC.nc000066400000000000000000000062541207233610700237160ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:42 $ * @author Jan Hauer * ======================================================================== */ /** * MLME-SAP synchronization primitives define how synchronization with * a coordinator may be achieved and how a loss of synchronization is * communicated to the next higher layer. (IEEE 802.15.4-2006, Sect. * 7.1.15) */ interface MLME_SYNC { /** * Requests to synchronize with the coordinator by acquiring and, if * specified, tracking its beacons. * * @param LogicalChannel Logical channel on which to attempt coordinator * synchronization * @param ChannelPage The channel page on which to attempt coordinator * synchronization. * @param TrackBeacon TRUE if the MLME is to synchronize with the next * beacon and attempt to track all future beacons. * FALSE if the MLME is to synchronize with only the * next beacon. * @return IEEE154_SUCCESS if the request succeeded and the device * is now trying to acquire synchronization with the coordinator. * Note: the MLME_SYNC_LOSS interface is used to signal * when synchronization was lost (or never acquired) */ command ieee154_status_t request ( uint8_t LogicalChannel, uint8_t ChannelPage, bool TrackBeacon ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/MLME/MLME_SYNC_LOSS.nc000066400000000000000000000060571207233610700245570ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:42 $ * @author Jan Hauer * ======================================================================== */ /** * MLME-SAP synchronization primitives define how synchronization with * a coordinator may be achieved and how a loss of synchronization is * communicated to the next higher layer. (IEEE 802.15.4-2006, Sect. * 7.1.15) */ #include "TKN154.h" interface MLME_SYNC_LOSS { /** * Indicates the loss of synchronization with a coordinator * * @param lossReason The reason that synchronization was lost * @param PANId The PAN identifier with which the device lost * synchronization or to which it was realigned. * @param LogicalChannel The logical channel on which the device lost synchronization or to which it was realigned. * @param ChannelPage The channel page on which the device lost * synchronization or to which it was realigned. * @param security The security options, NULL means security is * disabled. */ event void indication ( ieee154_status_t lossReason, uint16_t PANId, uint8_t LogicalChannel, uint8_t ChannelPage, ieee154_security_t *security ); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/000077500000000000000000000000001207233610700227175ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/DataRequest.nc000066400000000000000000000047441207233610700254740ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2008-06-16 18:00:32 $ * @author Jan Hauer * ======================================================================== */ interface DataRequest { /** * Sends a data request frame to the coordinator. * * @param CoordAddrMode coordinator address mode * @param CoordPANId coordinator PAN ID * @param CoordAddressLE points to coordinator address stored in * little endian format * @param SrcAddrMode source address mode * @returns IEEE154_SUCCESS if a data request frame will be transmitted and * only then pollDone will be signalled. **/ command ieee154_status_t poll(uint8_t CoordAddrMode, uint16_t CoordPANId, uint8_t *CoordAddressLE, uint8_t SrcAddrMode); /** * Signalled in response to a successful poll command **/ event void pollDone(); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/EnergyDetection.nc000066400000000000000000000054131207233610700263340ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:42 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" interface EnergyDetection { /** * Requests to measure the energy level on the current channel; the * measurement should last for duration symbols and the * maximum energy level is signalled through the done * event. * * @param duration Duration of the energy detection measurement * (in symbol time) * @return SUCCESS if the request was accepted and only then * the done event will be signalled, FAIL otherwise **/ command error_t start(uint32_t duration); /** * Signalled in response to a call to start; * returns the maximum energy measured on the channel over the * specified period of time. * * @param status SUCCESS if the measurement succeeded * and only then EnergyLevel is valid, FAIL * otherwise * @param EnergyLevel The maximum energy on the channel **/ event void done(error_t status, int8_t EnergyLevel); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/FrameExtracted.nc000066400000000000000000000043031207233610700261370ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2008-06-16 18:00:32 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" interface FrameExtracted { /** * A frame was extracted from the coordinator. * * @param rxFrame The frame received from the coordinator * @param txFrame The data request frame sent to the coordinator * @return A frame buffer for the stack to use for the next received frame **/ event message_t* received(message_t* rxFrame, ieee154_txframe_t *txFrame); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/FrameRx.nc000066400000000000000000000041201207233610700246020ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2009-03-04 18:31:44 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" interface FrameRx { /** * Received a frame. * * @param frame the received frame * @return a buffer to be used by the stack for the next * incoming frame */ event message_t* received(message_t* frame); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/FrameTx.nc000066400000000000000000000045761207233610700246230ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:44 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" interface FrameTx { /** * Transmits a frame. * * @param txFrame the frame to transmit * @return IEEE154_SUCCESS if the request was accepted and * only then transmitDone() will be signalled */ command ieee154_status_t transmit(ieee154_txframe_t *txFrame); /** * Signals the completion of the transmission of a frame. * * @param txFrame the frame that was transmitted * @param status the result of the transmission */ event void transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/FrameTxNow.nc000066400000000000000000000046231207233610700253000ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:44 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" interface FrameTxNow { /** * Transmits a frame. * * @param txFrame the frame to transmit * @return IEEE154_SUCCESS if the request was accepted and * only then transmitDone() will be signalled */ async command ieee154_status_t transmitNow(ieee154_txframe_t *frame); /** * Signals the completion of the transmission of a frame. * * @param txFrame the frame that was transmitted * @param status the result of the transmission */ async event void transmitNowDone(ieee154_txframe_t *frame, ieee154_status_t status); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/FrameUtility.nc000066400000000000000000000060421207233610700256610ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ $Date: 2008-06-16 18:00:33 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154.h" interface FrameUtility { /* Writes the addressing fields in the MAC header of a frame * and returns number of bytes in the MAC header.*/ async command uint8_t writeHeader( uint8_t* mhr, uint8_t DstAddrMode, uint16_t DstPANId, ieee154_address_t* DstAddr, uint8_t SrcAddrMode, uint16_t SrcPANId, const ieee154_address_t* SrcAddr, bool PANIDCompression); /* Determines the lenght of the MAC header depending on the frame control field*/ async command error_t getMHRLength(uint8_t fcf1, uint8_t fcf2, uint8_t *len); /* Returns TRUE if source address is the current coordinator and * src PAN is current PAN */ command bool isBeaconFromCoord(message_t *frame); /* writes the local extended address in little endian format */ async command void copyLocalExtendedAddressLE(uint8_t *destLE); /* writes the coordinator's extended address in little endian format */ command void copyCoordExtendedAddressLE(uint8_t *destLE); /* converts a uint64_t to little endian */ async command void convertToLE(uint8_t *destLE, const uint64_t *srcNative); /* converts little endian to a uint64_t */ async command void convertToNative(uint64_t *destNative, const uint8_t *srcLE); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/Purge.nc000066400000000000000000000040171207233610700243250ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2008-06-16 18:00:33 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154.h" interface Purge { /* purges a frame from the transaction queue */ command ieee154_status_t purge(uint8_t msduHandle); event void purgeDone(ieee154_txframe_t *txFrame, ieee154_status_t status); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/RadioOff.nc000066400000000000000000000052041207233610700247330ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:44 $ * @author Jan Hauer * ======================================================================== */ interface RadioOff { /** * Disables the transceiver and changes the radio state to RADIO_OFF. This * command will succeed only if the current state of the radio is RECEIVING. * * @return SUCCESS if the command was accepted and the offDone() * event will be signalled; EALREADY if the radio is already switched off, * i.e. in state RADIO_OFF; FAIL if the radio was not switched of because * the current state is not RECEIVING. */ async command error_t off(); /** * Signalled in response to a successful call to off(). The radio is * now in the state RADIO_OFF. **/ async event void offDone(); /** * Tells whether the radio is in state RADIO_OFF. * * @return TRUE if the radio is in the state RADIO_OFF, FALSE otherwise */ async command bool isOff(); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/RadioRx.nc000066400000000000000000000073341207233610700246200ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:44 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_platform.h" interface RadioRx { /** * Switches the radio to receive mode at time t0 + dt or immediately * if t0 + dt lies in the past. Analogous to the Timer * interface t0 is interpreted as a time in the past. Consequently, * if dt = 0 then the radio is always switched to receive mode * immediately. This command will fail, if the radio is currently not in * state RADIO_OFF. Once the radio is in receive mode an event * enableRxDone will be signalled. * * @param t0 Reference time for receive operation * * @param dt A positive offset relative to t0. * * @return SUCCESS if the command was accepted and only then the * enableRxDone() event will be signalled; FAIL, if the command was * not accepted, because the radio is currently not in the state RADIO_OFF. */ async command error_t enableRx(uint32_t t0, uint32_t dt); /** * Signalled in response to a successful call to enableRx(). This * event is completing the enableRx() operation, the radio is now in * the state RECEIVING. It will stay in receive mode until it is switched off * through the RadioOff interface. Received frames will be signalled * through the received() event. **/ async event void enableRxDone(); /** * Tells whether the radio is in state RECEIVING, i.e. in receive * mode. * * @return TRUE if the radio is in the state RECEIVING, FALSE otherwise */ async command bool isReceiving(); /** * A frame was received and passed the filters described in * IEEE 802.15.4-2006 Sec. 7.5.6.2 ("Reception and rejection"). * * @param frame The received frame * * @return a buffer to be used by the driver for the next * incoming frame */ event message_t* received(message_t *frame); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/RadioTx.nc000066400000000000000000000100561207233610700246150ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:44 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" #include "TKN154_platform.h" interface RadioTx { /** * Transmits a frame at time t0 + dt or immediately if t0 + * dt lies in the past. The frame is transmitted regardless of the * channel condition (without prior CCA). Analogous to the Timer * interface t0 is interpreted as a time in the past. If * dt is zero then the frame is transmitted immediately. This * command will fail, if the radio is currently not in state RADIO_OFF. * * Iff the ACK_REQUESTED flag is set in the frame's header a successful * transmission will include an acknowledgement from the destination; then, * the callee will perform the necessary steps for receiving this * acknowledgement following the specification in IEEE 802.15.4-2006 Sect. * 7.5.6.4. * * @param frame The frame to transmit * * @param t0 Reference time for transmission * * @param dt A positive offset relative to t0 * * @return SUCCESS if the transmission was triggered successfully and only * then transmitDone() will be signalled; FAIL, if the command was * not accepted, because the radio is currently not in the state RADIO_OFF; * EINVAL if frame or a pointer therein is invalid, or the length * of the frame is invalid */ async command error_t transmit(ieee154_txframe_t *frame, uint32_t t0, uint32_t dt); /** * Signalled in response to a call to transmit() and completing * the transmission of a frame. The radio is now back in state RADIO_OFF. * The time of the transmission -- the point in time when the first bit of the * PPDU was transmitted -- is given by timestamp. Since the * frame was transmitted without CCA the transmission can only have * failed if no acknowledgement was received although one was requested. * * @param frame The frame that was transmitted. * * @param result SUCCESS if the frame was transmitted (and a matching * acknowledgement was received, if requested); ENOACK if the frame was * transmitted, but no matching acknowledgement was received although one * was requested **/ async event void transmitDone(ieee154_txframe_t *frame, error_t result); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/SlottedCsmaCa.nc000066400000000000000000000135551207233610700257400ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-03-04 18:31:45 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" #include "TKN154_PHY.h" interface SlottedCsmaCa { /** * Transmits a frame using the slotted CSMA-CA algorithm as specified in IEEE * 802.15.4-2006 standard Sect. 7.5.1.4. This command will fail if the * current state of the radio is not RADIO_OFF. The initial CSMA-CA * parameters are passed as a parameter and may be modified by the callee. * The caller must not access csma until the transmitDone * event has been signalled. * * slot0Time defines the beginning of the first slot in the CAP. * Any transmission must commence on a backoff slot boundary relative to * slot0Time. The last possible time for transmission is defined by * slot0Time+dtMax. If the transmission cannot commence at or before * slot0Time+dtMax then an event transmitDone() with error * code ERETRY will be signalled and csma will reflect the current * state of the CSMA-CA algorithm. The caller can then resume the * transmission of this frame in the next CAP based on the * remainingBackoff passed in the transmitDone() event, by * setting resume to TRUE in the transmit() call. * * Iff the ACK_REQUESTED flag is set in the frame's header a successful * transmission will include an acknowledgement from the destination; then, * the callee will perform the necessary steps for receiving this * acknowledgement following the specification in IEEE 802.15.4-2006 Sect. * 7.5.6.4. * * @param frame The frame to transmit. * * @param csma Initial parameters for the slotted CSMA-CA algorithm. * * @param slot0Time Reference time for the backoff slot boundaries * * @param dtMax slot0Time+dtMax is the last time the frame may be * transmitted. * * @param resume TRUE means that the initial backoff is defined by the * remainingBackoff parameter, FALSE means the * remainingBackoff is to be ignored. * * @param remainingBackoff initial backoff (ignored if resume * is FALSE. * * @return SUCCESS if the slotted CSMA-CA was triggered successfully; * EINVAL if frame or a pointer therein is invalid; FAIL otherwise. */ async command error_t transmit(ieee154_txframe_t *frame, ieee154_csma_t *csma, uint32_t slot0Time, uint32_t dtMax, bool resume, uint16_t remainingBackoff); /** * Signalled in response to a call to transmit(). This event * completes the transmit operation. A transmission failed if either * the channel was never idle during any of the macMaxCsmaBackoffs+1 * transmission attempts, if no acknowledgement was received although one was * requested or if the frame could not be transmitted before the specified * deadline (slot0Time+dtMax). * * @param frame The frame that was to be transmitted. * * @param csma Parameters for the slotted CSMA-CA algorithm; this pointer is * identical to the one passed to the transmit command, the content, * however, may have changed. * * @param ackPendingFlag TRUE if an acknowledgement was received and the * "pending" flag is set in the header of the ACK frame, FALSE otherwise * (this is typically only relevant for indirect transmissions) * * @param remainingBackoff Only valid if result = ERETRY, and * then it describes the remaining backoff time (in symbols) to be used * for the transmission of the frame in the following CAP. * * @result result SUCCESS if the the frame was transmitted (and a matching * acknowledgement was received, if requested); FAIL if the CSMA-CA algorithm * failed because NB > macMaxCsmaBackoffs; ERETRY if the frame could not be * transmitted because transmission would have started later than * slot0Time+dtMax */ async event void transmitDone(ieee154_txframe_t *frame, ieee154_csma_t *csma, bool ackPendingFlag, uint16_t remainingBackoff, error_t result); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/SuperframeStructure.nc000066400000000000000000000100231207233610700272670ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-03-04 18:31:45 $ * @author Jan Hauer * ======================================================================== */ /* A superframe is bounded by beacons and divided into 16 equally-sized slots, * which are part of either CAP or CFP (GTS). This interface can be used to * determine the various parameters of a superframe, for example the begin of * the inactive period would be calculated as: * * sfStartTime + (numCapSlot + numGtsSlots) * sfSlotDuration * **/ interface SuperframeStructure { /** * Returns the absolute time (in symbols) when the superframe started, * i.e. the timestamp of the beacon marking the first slot. * * @returns superframe start time **/ async command uint32_t sfStartTime(); /** * Duration (in symbols) of a single superframe slot. * Zero means, the CAP is not valid (no valid beacon was received). * * @returns superframe slot duration **/ async command uint32_t sfSlotDuration(); /** * Number of CAP slots. * * @returns number of CAP slots **/ async command uint8_t numCapSlots(); /** * Number of GTS slots. * * @returns number of GTS slots **/ async command uint8_t numGtsSlots(); /** * Duration of the battery life extension period (in symbols), * Zero means battery life extension is not used (disabled). * * @returns duration of the battery life extension period, * zero means battery life extension is disabled **/ async command uint16_t battLifeExtDuration(); /** * Returns a pointer to the content of the GTS fields of the * last received/transmitted beacon. * * @returns GTS fields **/ async command const uint8_t* gtsFields(); /** * The last "guardTime" symbols of CAP/CFP should not be used, * i.e. transmission/reception should stop "guardTime" symbols * before the actual end of the CAP/CFP. * * @returns guard time **/ async command uint16_t guardTime(); /** * Tells whether the frame pending bit is set in the header * of the beacon frame. * * @returns TRUE is frame pending bit in beacon header is set, FALSE otherwise **/ async command bool isBroadcastPending(); /** * The beacon interval (in symbols) in which the superframe is embedded. * * @returns beacon interval **/ async command uint32_t beaconInterval(); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/TimeCalc.nc000066400000000000000000000043731207233610700247310ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2008-06-16 18:00:34 $ * @author Jan Hauer * ======================================================================== */ interface TimeCalc { /** * Returns the interval between time t1 and time t0 assuming * that t0 happened before t1. * @return interval between t1 and t0 */ async command uint32_t timeElapsed(uint32_t t0, uint32_t t1); /** * Assuming that t0 lies in the past, this command returns TRUE * iff t0+dt lies also in the past. * @return TRUE if t0+dt is later than "now" */ async command bool hasExpired(uint32_t t0, uint32_t dt); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/TransferableResource.nc000066400000000000000000000142031207233610700273610ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * This interface is the same as the standard Resource * interface, except that it has one new command transferTo() * and one new event transferred(), which allow to pass * the resource from one component to another. * * @author Jan Hauer */ interface TransferableResource { /** * Request access to a shared resource. You must call release() * when you are done with it. * * @return SUCCESS When a request has been accepted. The granted() * event will be signaled once you have control of the * resource.
      * EBUSY You have already requested this resource and a * granted event is pending */ async command error_t request(); /** * Request immediate access to a shared resource. You must call release() * when you are done with it. * * @return SUCCESS When a request has been accepted.
      * FAIL The request cannot be fulfilled */ async command error_t immediateRequest(); /** * You are now in control of the resource. */ event void granted(); /** * Transfers ownership of a resource to another client, which will in turn * be signalled the transferred() event. This command may override * the default queueing policy. * * @param dstClient The identifier of the client to transfer the resource to. * * @return SUCCESS If ownership has been transferred; FAIL if ownership has * not been transferred, because the caller is not owner of the resource or * a client with the identifer dstClient is not present. */ async command error_t transferTo(uint8_t dstClient); /** * Another client transferred ownership of the resource to you by calling * the transfer() command, i.e. you are now in control of the resource. * * @param srcClient The identifier of the client that transferred the resource to you. */ async event void transferredFrom(uint8_t srcClient); /** * Release a shared resource you previously acquired. * * @return SUCCESS The resource has been released
      * FAIL You tried to release but you are not the * owner of the resource * * @note This command should never be called between putting in a request * and waiting for a granted event. Doing so will result in a * potential race condition. There are ways to guarantee that no * race will occur, but they are clumsy and overly complicated. * Since it doesn't logically make since to be calling * release before receiving a granted event, * we have opted to keep thing simple and warn you about the potential * race. */ async command error_t release(); /** * Check if the user of this interface is the current * owner of the Resource * @return TRUE It is the owner
      * FALSE It is not the owner */ async command bool isOwner(); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/UnslottedCsmaCa.nc000066400000000000000000000106721207233610700263000ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-03-04 18:31:45 $ * @author Jan Hauer * ======================================================================== */ #include "TKN154_MAC.h" #include "TKN154_platform.h" interface UnslottedCsmaCa { /** * Transmits a frame using the unslotted CSMA-CA algorithm as specified in * IEEE 802.15.4-2006 standard Sect. 7.5.1.4. This command will fail if the * current state of the radio is not RADIO_OFF. The initial CSMA-CA parameters * are passed as a parameter and may be modified by the callee. The caller * must not access csma until the transmitDone event * has been signalled. * * Iff the ACK_REQUESTED flag is set in the frame's header a successful * transmission will include an acknowledgement from the destination; * then, the callee will perform the necessary steps for receiving this * acknowledgement following the specification in IEEE 802.15.4-2006 * Sect. 7.5.6.4. * * @param frame The frame to transmit. * * @param csma Parameters for the unslotted CSMA-CA algorithm. * * @return SUCCESS if the unslotted CSMA-CA algorithm was triggered * successfully; EINVAL if frame or a pointer therein is invalid; * FAIL if the radio is not in state RADIO_OFF. */ async command error_t transmit(ieee154_txframe_t *frame, ieee154_csma_t *csma); /** * Signalled in response to a call to transmit(). This event completes * the transmit operation. If the transmission succeeded then * the time of the transmission -- the point in time when the first bit of the * PPDU was transmitted -- will be stored in the metadata field of the frame. * A transmission failed if either all CCA operation(s) failed (including * backoffs, i.e. NB > macMaxCsmaBackoffs) or if no acknowledgement was received * although one was requested. * * @param frame The frame that was to be transmitted. * * @param csma Parameters for the unslotted CSMA-CA algorithm; this * pointer is identical to the one passed to the transmit command, * the content, however, may have changed. * * @param ackPendingFlag TRUE if an acknowledgement was received and the * "pending" flag is set in the header of the ACK frame, FALSE otherwise * (this is typically only relevant for indirect transmissions) * * @param result SUCCESS if the frame was transmitted (and a matching * acknowledgement was received, if requested); ENOACK if the frame was * transmitted, but no matching acknowledgement was received, although one * was requested; FAIL if the CSMA-CA algorithm failed because * NB > macMaxCsmaBackoffs. */ async event void transmitDone(ieee154_txframe_t *frame, ieee154_csma_t *csma, bool ackPendingFlag, error_t result); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/private/WriteBeaconField.nc000066400000000000000000000050371207233610700264140ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - Neither the name of the * Technische Universitaet Berlin nor the names of its contributors may be used * to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2008-06-16 18:00:34 $ * @author Jan Hauer * ======================================================================== */ interface WriteBeaconField { /** * Writes a field inside a beacon frame (either "GTS fields" * or "Pending address field", see Fig. 44). IMPORTANT: * the pointer lastBytePtr points to the address of * the last byte that the callee may write. E.g. assume * we want to write a GTS information field of total 4 byte, * the "GTS Specification" byte would be written at lastBytePtr[-3], * the "GTS Directions" field at at lastBytePtr[-2] and so on. * * @param lastBytePtr Address of last byte to write * * @param maxlen Maximum number of bytes that may be written * * @return The number of bytes that have actually been written */ command uint8_t write(uint8_t *lastBytePtr, uint8_t maxlen); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/public/000077500000000000000000000000001207233610700225235ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/public/IEEE154BeaconFrame.nc000066400000000000000000000137021207233610700260740ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-09-07 15:29:20 $ * @author Jan Hauer * ======================================================================== */ /** * The IEEE154BeaconFrame interface allows to access the content of a beacon * frame. */ #include interface IEEE154BeaconFrame { /** * Reads the Pending Address Specification of a beacon frame. * * @param frame the beacon frame * @param pendAddrSpec a pointer to where the Pending Address * Specification should be written * @return FAIL if the frame is not a beacon frame, * SUCCESS otherwise */ command error_t getPendAddrSpec(message_t* frame, uint8_t* pendAddrSpec); /** * Reads the Pending Addresses of a given type (short or extended) from a * beacon frame. * * @param frame the beacon frame * @param addrMode the address mode of the sought addresses, either * ADDR_MODE_SHORT_ADDRESS or ADDR_MODE_EXTENDED_ADDRESS * @param buffer a pointer to an array of "bufferSize" addresses * @param bufferSize number of address entries in the buffer * * @return FAIL if the frame is not a beacon frame, * SUCCESS otherwise */ command error_t getPendAddr(message_t* frame, uint8_t addrMode, ieee154_address_t buffer[], uint8_t bufferSize); /** * Determines whether the local macShortAddress or aExtendedAddress * (as currently registered in the PIB) is part of the pending * address list of a beacon. * * @param frame the beacon frame * * @return ADDR_MODE_NOT_PRESENT if the frame is not a beacon * beacon frame, or the local address is not part of * the pending address list, * ADDR_MODE_SHORT_ADDRESS if the local macShortAddress * is part of the pending address list, * ADDR_MODE_EXTENDED_ADDRESS if the local aExtendedAddress * is part of the pending address list */ command uint8_t isLocalAddrPending(message_t* frame); /** * Parses the PAN Descriptor of a beacon frame. Since a frame * does not include information about the channel that it was * received on this information must be provided by the caller. * * @param frame the beacon frame * @param LogicalChannel will be written to PANDescriptor->LogicalChannel * @param ChannelPage will be written to PANDescriptor->ChannelPage * @param PANDescriptor a pointer to a PAN Descriptor, that will hold * the PAN Descriptor as parsed of the beacon frame * @param bufferSize number of address entries in the buffer * * @return SUCCESS if the frame is a valid beacon frame and the * PANDescriptor was successfully parsed, FAIL * otherwise */ command error_t parsePANDescriptor(message_t *frame, uint8_t LogicalChannel, uint8_t ChannelPage, ieee154_PANDescriptor_t *pdescriptor); /** * Returns a pointer to the beacon payload. * * @param frame the beacon frame * @return a pointer to the beacon payload, or, if the * frame is not a beacon frame, a pointer to * the MAC payload. If the frame was received * while in promiscuous mode, then this command * returns a pointer to the first byte of the MHR. */ command void* getBeaconPayload(message_t* frame); /** * Returns the length of the beacon payload portion of the frame * (in byte). * * @param frame the frame * @return the length (in byte) of the frame's beacon payload * portion, or, if the frame is not a beacon frame * the length of the MAC payload. If the frame * was received while in promiscuous mode, then * this command returns the length of MHR + MAC Payload. */ command uint8_t getBeaconPayloadLength(message_t* frame); /** * Returns the (beacon) sequence number of the frame. * * @param frame the frame * @return sequence number of the frame */ command uint8_t getBSN(message_t* frame); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/public/IEEE154Frame.nc000066400000000000000000000236551207233610700247740ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:46 $ * @author Jan Hauer * ======================================================================== */ /** * The IEEE154Frame interface allows to access the content of a IEEE 802.15.4 * frame. */ #include #include interface IEEE154Frame { /** * Returns the source addressing mode of the frame. * * @param frame the frame * @return source addressing mode of the frame; either * ADDR_MODE_NOT_PRESENT, ADDR_MODE_RESERVED, * ADDR_MODE_SHORT_ADDRESS or ADDR_MODE_EXTENDED_ADDRESS */ command uint8_t getSrcAddrMode(message_t* frame); /** * Reads the source address (to be interpreted * as specified by the source addressing mode) of the frame. * * @param frame the frame * @param address a pointer to where the source address * will be written * @return SUCCESS, if the source address is present * and was written to "address", * FAIL otherwise (source address remains * unmodified) */ command error_t getSrcAddr(message_t* frame, ieee154_address_t *address); /** * Reads the source PAN identifier of the frame. * * @param frame the frame * @param PANID a pointer to where the source PAN identifier * will be written * @return SUCCESS, if the source PAN identifier is present * and was written to "PANID", * FAIL otherwise (PANID remains unmodified) */ command error_t getSrcPANId(message_t* frame, uint16_t* PANID); /** * Returns the destination addressing mode of the frame. * * @param frame the frame * @return destination addressing mode of the frame; either * ADDR_MODE_NOT_PRESENT, ADDR_MODE_RESERVED, * ADDR_MODE_SHORT_ADDRESS or ADDR_MODE_EXTENDED_ADDRESS */ command uint8_t getDstAddrMode(message_t* frame); /** * Reads the destination address (to be interpreted * as specified by the destination addressing mode) of the frame. * * @param frame the frame * @param address a pointer to where the destination address * will be written * @return SUCCESS, if the destination address is present * and was written to "address", * FAIL otherwise (destination address * remains unmodified) */ command error_t getDstAddr(message_t* frame, ieee154_address_t *address); /** * Reads the destination PAN identifier of the frame. * * @param PANID a pointer to where the destination * PAN identifier should be written * @param frame the frame * @return SUCCESS, if the destination PAN identifier * is present and was copied to "PANID", * FAIL otherwise (PANID remains unmodified) */ command error_t getDstPANId(message_t* frame, uint16_t* PANID); /** * Sets the addressing fields in the MAC header of a frame. The source * PAN identifier and the source address will be set automatically, their * values depend on the SrcAddrMode parameter: if * SrcAddrMode is a short or extended address, then * the current PIB attributes macShortAddress or * aExtendedAddress and macPANId are used. * * @param frame the frame * @param srcAddrMode the source addressing mode * @param dstAddrMode the destination addressing mode * @param dstPANID the 16 bit PAN identifier of the destination * @param dstAddr individual device address of the destination as per * the dstAddrMode * @param security the security options (NULL means security is * disabled) * * @return SUCCESS if the addressing fields where written, * FAIL if an incorrect addressing mode was specified */ command error_t setAddressingFields(message_t* frame, uint8_t SrcAddrMode, uint8_t DstAddrMode, uint16_t DstPANID, ieee154_address_t *DstAddr, ieee154_security_t *security); /** * Returns a pointer to the MAC payload portion of a frame. * * @param frame the frame * @return a pointer to the frame's payload */ command void* getPayload(message_t* frame); /** * Returns the length of the MAC payload portion of the frame (in byte). * * @param frame the frame * @return the length of the frame's payload (in byte) */ command uint8_t getPayloadLength(message_t* frame); /** * Returns the point in time when the first bit (of the PHY preamble) of the * frame was received or transmitted. Time is expressed in symbols as local * time (which can also be accessed via the LocalTime interface * provided by your platform, e.g. * tos/platforms/telosb/mac/tkn154/timer/LocalTime62500hzC). If * isTimestampValid() returns FALSE then the timestamp is not valid * and must be ignored. * * @param frame the frame * @return timestamp of the frame */ command uint32_t getTimestamp(message_t* frame); /** * Tells whether the timestamp is valid. * * @return TRUE if timestamp is valid, FALSE otherwise. */ command bool isTimestampValid(message_t* frame); /** * Returns the sequence number of the frame. * * @param frame the frame * @return sequence number of the frame */ command uint8_t getDSN(message_t* frame); /** * Returns the link quality level of a received frame, where * "link quality level" is defined in Sect. 6.9.8 of the * IEEE 802.15.4-2006 standard. For the CC2420 radio it is * identical with the LQI. * * @param frame the frame * @return link quality level */ command uint8_t getLinkQuality(message_t* frame); /** * Returns the average RSSI (in dBm) of a received frame. The * IEEE 802.15.4-2006 standard does not specify that a radio * must provide RSSI, so this command is optional: if a * radio does not provide per-frame RSSI then this call will * return a value of +127. * * @param frame the frame * @return RSSI */ command int8_t getRSSI(message_t* frame); /** * Returns the type of the frame * BEACON=0, DATA=1, ACK=2, COMMAND=3. * * Note: For beacon frames one can use the IEEE154BeaconFrame * interface to inspect additional fields of the frame. * * @param frame the frame * @return the type of the frame */ command uint8_t getFrameType(message_t* frame); /** * Returns a pointer to the MAC header (i.e. to the first byte of * the Frame Control field). * * @param frame the frame * @return a pointer to the frame's header */ command void* getHeader(message_t* frame); /** * Returns the length of the MAC header. * * @param frame the frame * @return the length of the MAC header (in byte) */ command uint8_t getHeaderLength(message_t* frame); /** * Tells whether or not the frame was received while * promiscuous mode was enabled. * * @param frame the frame * @return TRUE if frame was received while in promiscuous * mode, FALSE otherwise */ command bool wasPromiscuousModeEnabled(message_t* frame); /** * Tells whether or not the frame has a standard compliant * IEEE 802.15.4 header - this will only be relevant for frames * received while in promiscuous mode, because then no filtering * (except CRC check) was applied. Note: if this command returns * FALSE, then all other commands in this interface (except * wasPromiscuousModeEnabled()) and the * IEEE154BeaconFrame interface return undefined values! * * @param frame the frame * @return TRUE if frame has a standard compliant header, * FALSE otherwise */ command bool hasStandardCompliantHeader(message_t* frame); } tinyos-2.1.2+dfsg/tos/lib/mac/tkn154/interfaces/public/IEEE154TxBeaconPayload.nc000066400000000000000000000137261207233610700267550ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:46 $ * @author Jan Hauer * ======================================================================== */ /** * The IEEE154TxBeaconPayload interface allows to access the payload portion of * the beacon frame that is periodically transmitted by a coordinator in a * beacon-enabled PAN. This interface replaces the MLME-SET command for the PIB * attribute values 0x45 (macBeaconPayload) and 0x46 (macBeaconPayloadLength). */ #include interface IEEE154TxBeaconPayload { /** * Sets the beacon payload portion for all subsequently transmitted beacons. * This command replaces the MLME-SET command for the PIB attribute values * 0x45 (macBeaconPayload) and 0x46 (macBeaconPayloadLength). The * setBeaconPayloadDone() event will be signalled when the * beacon payload has been set -- until then beaconPayload must * not be modified. * * @param beaconPayload the new beacon payload * @param length the length of the new beacon payload (in byte) * * @return EBUSY if another transaction is pending, ESIZE if length is too big, * SUCCESS otherwise (and only then the setBeaconPayloadDone event * will be signalled) */ command error_t setBeaconPayload(void *beaconPayload, uint8_t length); /** * Signalled in response to a setBeaconPayload() request. * Indicates that the beacon payload has been copied and returns the * ownership of the buffer to the next higher layer. * * @param beaconPayload the beaconPayload passed in the * setBeaconPayload() command * @param length the length passed in the * setBeaconPayload() command */ event void setBeaconPayloadDone(void *beaconPayload, uint8_t length); /** * Returns a pointer to the current beacon payload. * * @return the current beacon payload */ command const void* getBeaconPayload(); /** * Returns the length of the current beacon payload (in byte). * * @return length of the current beacon payload */ command uint8_t getBeaconPayloadLength(); /** * Replaces (overwrites) a portion of the current beacon payload. Whenever * possible, to minimize overhead, the next higher layer should prefer this * command over the setBeaconPayload() command. The * modifyBeaconPayloadDone() event will be signalled when the beacon * payload has been updated -- until then buffer must not be * modified. * * @param offset offset into the current beacon payload * @param buffer the buffer to be written * @param length the length of the buffer * * @return EBUSY if another transaction is pending, ESIZE if offset+length is * too big, SUCCESS otherwise (and only then the * modifyBeaconPayloadDone event will be signalled) */ command error_t modifyBeaconPayload(uint8_t offset, void *buffer, uint8_t bufferLength); /** * Signalled in response to a modifyBeaconPayload() request. * Indicates that the beacon payload has been updated. * * @param offset the offset passed in the * modifyBeaconPayload() command * @param buffer the buffer passed in the * modifyBeaconPayload() command * @param bufferLength the bufferLength passed in the * modifyBeaconPayload() command */ event void modifyBeaconPayloadDone(uint8_t offset, void *buffer, uint8_t bufferLength); /** * Indicates that a beacon frame will be transmitted "soon" and now is a good * time to update the beacon payload (if desired). * * The usual policy is that (1) this event is signalled before every beacon * transmission, and (2) that a subsequent call to setPayload * will still update the beacon payload portion of this beacon. However, * because of tight timing constraints in beacon-enabled mode neither can be * guaranteed! */ event void aboutToTransmit(); /** * Indicates that a beacon frame has been transmitted (the * getBeaconPayload command can be used to inspect the * beacon payload). */ event void beaconTransmitted(); } tinyos-2.1.2+dfsg/tos/lib/net/000077500000000000000000000000001207233610700161225ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/4bitle/000077500000000000000000000000001207233610700173055ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/4bitle/LinkEstimator.h000066400000000000000000000103431207233610700222440ustar00rootroot00000000000000/* $Id: LinkEstimator.h,v 1.5 2010-06-29 22:07:47 scipio Exp $ */ /* * Copyright (c) 2006 University of Southern California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef LINK_ESITIMATOR_H #define LINK_ESITIMATOR_H /* @ author Omprakash Gnawali @ Created: June 08, 2006 */ // Number of entries in the neighbor table #define NEIGHBOR_TABLE_SIZE 10 // Masks for the flag field in the link estimation header enum { // use last four bits to keep track of // how many footer entries there are NUM_ENTRIES_FLAG = 15, }; // The first byte of each outgoing packet is a control byte // Bits 4..7 reserved for routing and other protocols // Bits 0..3 is used by the link estimator to encode the // number of linkest entries in the packet // link estimator header added to // every message passing through the link estimator typedef nx_struct linkest_header { nx_uint8_t flags; nx_uint8_t seq; } linkest_header_t; // for outgoing link estimator message // so that we can compute bi-directional quality typedef nx_struct neighbor_stat_entry { nx_am_addr_t ll_addr; nx_uint8_t inquality; } neighbor_stat_entry_t; // we put the above neighbor entry in the footer typedef nx_struct linkest_footer { neighbor_stat_entry_t neighborList[1]; } linkest_footer_t; // Flags for the neighbor table entry enum { VALID_ENTRY = 0x1, // A link becomes mature after BLQ_PKT_WINDOW // packets are received and an estimate is computed MATURE_ENTRY = 0x2, // Flag to indicate that this link has received the // first sequence number INIT_ENTRY = 0x4, // The upper layer has requested that this link be pinned // Useful if we don't want to lose the root from the table PINNED_ENTRY = 0x8 }; // neighbor table entry typedef struct neighbor_table_entry { // link layer address of the neighbor am_addr_t ll_addr; // last beacon sequence number received from this neighbor uint8_t lastseq; // number of beacons received after last beacon estimator update // the update happens every BLQ_PKT_WINDOW beacon packets uint8_t rcvcnt; // number of beacon packets missed after last beacon estimator update uint8_t failcnt; // flags to describe the state of this entry uint8_t flags; // inbound qualities in the range [1..255] // 1 bad, 255 good uint8_t inquality; // ETX for the link to this neighbor. This is the quality returned to // the users of the link estimator uint16_t etx; // Number of data packets successfully sent (ack'd) to this neighbor // since the last data estimator update round. This update happens // every DLQ_PKT_WINDOW data packets uint8_t data_success; // The total number of data packets transmission attempt to this neighbor // since the last data estimator update round. uint8_t data_total; } neighbor_table_entry_t; #endif tinyos-2.1.2+dfsg/tos/lib/net/4bitle/LinkEstimator.nc000066400000000000000000000060371207233610700224220ustar00rootroot00000000000000/* $Id: LinkEstimator.nc,v 1.3 2010-06-29 22:07:47 scipio Exp $ */ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** Provides an additive quality measure for a neighbor. The * provided quality increases when the true link quality increases. * @author Rodrigo Fonseca * @author Omprakash Gnawali * @date $Date: 2010-06-29 22:07:47 $ */ /* Quality of a link is defined by the implementor of this interface. * It could be ETX, PRR, etc. */ interface LinkEstimator { /* get link quality for link to the neighbor */ command uint16_t getLinkQuality(uint16_t neighbor); /* insert this neighbor into the neighbor table */ command error_t insertNeighbor(am_addr_t neighbor); /* pin a neighbor so that it does not get evicted */ command error_t pinNeighbor(am_addr_t neighbor); /* pin a neighbor so that it does not get evicted */ command error_t unpinNeighbor(am_addr_t neighbor); /* called when an acknowledgement is received; sign of a successful data transmission; to update forward link quality */ command error_t txAck(am_addr_t neighbor); /* called when an acknowledgement is not received; could be due to data pkt or acknowledgement loss; to update forward link quality */ command error_t txNoAck(am_addr_t neighbor); /* called when the parent changes; clear state about data-driven link quality */ command error_t clearDLQ(am_addr_t neighbor); /* signal when this neighbor is evicted from the neighbor table */ event void evicted(am_addr_t neighbor); } tinyos-2.1.2+dfsg/tos/lib/net/4bitle/LinkEstimatorC.nc000066400000000000000000000036501207233610700225230ustar00rootroot00000000000000/* $Id: LinkEstimatorC.nc,v 1.2 2010-06-29 22:07:47 scipio Exp $ */ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** The public component of the link estimator that provides the * quality to and from a neighbor * * @author Rodrigo Fonseca * @date $Date: 2010-06-29 22:07:47 $ */ configuration LinkEstimatorC { provides { interface LinkEstimator; } } tinyos-2.1.2+dfsg/tos/lib/net/4bitle/LinkEstimatorP.nc000066400000000000000000000530061207233610700225400ustar00rootroot00000000000000/* $Id: LinkEstimatorP.nc,v 1.19 2010-06-29 22:07:47 scipio Exp $ */ /* * Copyright (c) 2006 University of Southern California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* @ author Omprakash Gnawali @ Created: April 24, 2006 */ #include "./LinkEstimator.h" module LinkEstimatorP { provides { interface StdControl; interface AMSend as Send; interface Receive; interface LinkEstimator; interface Init; interface Packet; interface CompareBit; } uses { interface AMSend; interface AMPacket as SubAMPacket; interface Packet as SubPacket; interface Receive as SubReceive; interface LinkPacketMetadata; interface Random; } } implementation { // configure the link estimator and some constants enum { // If the etx estimate is below this threshold // do not evict a link EVICT_ETX_THRESHOLD = 65, // if received sequence number if larger than the last sequence // number by this gap, we reinitialize the link MAX_PKT_GAP = 10, BEST_ETX = 10, INVALID_RVAL = 0xff, INVALID_NEIGHBOR_ADDR = 0xff, // if we don't know the link quality, we need to return a value so // large that it will not be used to form paths VERY_LARGE_ETX_VALUE = 0xffff, // decay the link estimate using this alpha // we use a denominator of 10, so this corresponds to 0.2 ALPHA = 9, // number of packets to wait before computing a new // DLQ (Data-driven Link Quality) DLQ_PKT_WINDOW = 5, // number of beacons to wait before computing a new // BLQ (Beacon-driven Link Quality) BLQ_PKT_WINDOW = 3, // largest ETX value that we feed into the link quality EWMA // a value of 70 corresponds to having to make six transmissions // to successfully receive one acknowledgement LARGE_ETX_VALUE = 70 }; // keep information about links from the neighbors neighbor_table_entry_t NeighborTable[NEIGHBOR_TABLE_SIZE]; // link estimation sequence, increment every time a beacon is sent uint8_t linkEstSeq = 0; // if there is not enough room in the packet to put all the neighbor table // entries, in order to do round robin we need to remember which entry // we sent in the last beacon uint8_t prevSentIdx = 0; // get the link estimation header in the packet linkest_header_t* getHeader(message_t* m) { return (linkest_header_t*)call SubPacket.getPayload(m, sizeof(linkest_header_t)); } // get the link estimation footer (neighbor entries) in the packet linkest_footer_t* getFooter(message_t* m, uint8_t len) { // To get a footer at offset "len", the payload must be len + sizeof large. return (linkest_footer_t*)(len + (uint8_t *)call Packet.getPayload(m,len + sizeof(linkest_footer_t))); } // add the link estimation header (seq no) and link estimation // footer (neighbor entries) in the packet. Call just before sending // the packet. uint8_t addLinkEstHeaderAndFooter(message_t *msg, uint8_t len) { uint8_t newlen; linkest_header_t * ONE hdr; linkest_footer_t * ONE footer; uint8_t i, j, k; uint8_t maxEntries, newPrevSentIdx; dbg("LI", "newlen1 = %d\n", len); hdr = getHeader(msg); footer = getFooter(msg, len); maxEntries = ((call SubPacket.maxPayloadLength() - len - sizeof(linkest_header_t)) / sizeof(linkest_footer_t)); // Depending on the number of bits used to store the number // of entries, we can encode up to NUM_ENTRIES_FLAG using those bits if (maxEntries > NUM_ENTRIES_FLAG) { maxEntries = NUM_ENTRIES_FLAG; } dbg("LI", "Max payload is: %d, maxEntries is: %d\n", call SubPacket.maxPayloadLength(), maxEntries); j = 0; newPrevSentIdx = 0; for (i = 0; i < NEIGHBOR_TABLE_SIZE && j < maxEntries; i++) { uint8_t neighborCount; neighbor_stat_entry_t * COUNT(neighborCount) neighborLists; if(maxEntries <= NEIGHBOR_TABLE_SIZE) neighborCount = maxEntries; else neighborCount = NEIGHBOR_TABLE_SIZE; neighborLists = TCAST(neighbor_stat_entry_t * COUNT(neighborCount), footer->neighborList); k = (prevSentIdx + i + 1) % NEIGHBOR_TABLE_SIZE; if ((NeighborTable[k].flags & VALID_ENTRY) && (NeighborTable[k].flags & MATURE_ENTRY)) { neighborLists[j].ll_addr = NeighborTable[k].ll_addr; neighborLists[j].inquality = NeighborTable[k].inquality; newPrevSentIdx = k; dbg("LI", "Loaded on footer: %d %d %d\n", j, neighborLists[j].ll_addr, neighborLists[j].inquality); j++; } } prevSentIdx = newPrevSentIdx; hdr->seq = linkEstSeq++; hdr->flags = 0; hdr->flags |= (NUM_ENTRIES_FLAG & j); newlen = sizeof(linkest_header_t) + len + j*sizeof(linkest_footer_t); dbg("LI", "newlen2 = %d\n", newlen); return newlen; } // initialize the given entry in the table for neighbor ll_addr void initNeighborIdx(uint8_t i, am_addr_t ll_addr) { neighbor_table_entry_t *ne; ne = &NeighborTable[i]; ne->ll_addr = ll_addr; ne->lastseq = 0; ne->rcvcnt = 0; ne->failcnt = 0; ne->flags = (INIT_ENTRY | VALID_ENTRY); ne->inquality = 0; ne->etx = 0; } // find the index to the entry for neighbor ll_addr uint8_t findIdx(am_addr_t ll_addr) { uint8_t i; for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { if (NeighborTable[i].flags & VALID_ENTRY) { if (NeighborTable[i].ll_addr == ll_addr) { return i; } } } return INVALID_RVAL; } // find an empty slot in the neighbor table uint8_t findEmptyNeighborIdx() { uint8_t i; for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { if (NeighborTable[i].flags & VALID_ENTRY) { } else { return i; } } return INVALID_RVAL; } // find the index to the worst neighbor if the eetx // estimate is greater than the given threshold uint8_t findWorstNeighborIdx(uint8_t thresholdETX) { uint8_t i, worstNeighborIdx; uint16_t worstETX, thisETX; worstNeighborIdx = INVALID_RVAL; worstETX = 0; for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { if (!(NeighborTable[i].flags & VALID_ENTRY)) { dbg("LI", "Invalid so continuing\n"); continue; } if (!(NeighborTable[i].flags & MATURE_ENTRY)) { dbg("LI", "Not mature, so continuing\n"); continue; } if (NeighborTable[i].flags & PINNED_ENTRY) { dbg("LI", "Pinned entry, so continuing\n"); continue; } thisETX = NeighborTable[i].etx; if (thisETX >= worstETX) { worstNeighborIdx = i; worstETX = thisETX; } } if (worstETX >= thresholdETX) { return worstNeighborIdx; } else { return INVALID_RVAL; } } // find the index to a random entry that is // valid but not pinned uint8_t findRandomNeighborIdx() { uint8_t i; uint8_t cnt; uint8_t num_eligible_eviction; num_eligible_eviction = 0; for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { if (NeighborTable[i].flags & VALID_ENTRY) { if (NeighborTable[i].flags & PINNED_ENTRY || NeighborTable[i].flags & MATURE_ENTRY) { } else { num_eligible_eviction++; } } } if (num_eligible_eviction == 0) { return INVALID_RVAL; } cnt = call Random.rand16() % num_eligible_eviction; for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { if (!NeighborTable[i].flags & VALID_ENTRY) continue; if (NeighborTable[i].flags & PINNED_ENTRY || NeighborTable[i].flags & MATURE_ENTRY) continue; if (cnt-- == 0) return i; } return INVALID_RVAL; } // update the ETX estimator // called when new beacon estimate is done // also called when new DEETX estimate is done void updateETX(neighbor_table_entry_t *ne, uint16_t newEst) { ne->etx = (ALPHA * ne->etx + (10 - ALPHA) * newEst)/10; } // update data driven ETX void updateDETX(neighbor_table_entry_t *ne) { uint16_t estETX; if (ne->data_success == 0) { // if there were no successful packet transmission in the // last window, our current estimate is the number of failed // transmissions estETX = ne->data_total * 10; } else { estETX = (10 * ne->data_total) / ne->data_success; ne->data_success = 0; ne->data_total = 0; } updateETX(ne, estETX); } // ETX (Expected number of Transmission) // computeETX returns ETX*10 uint16_t computeETX(uint8_t q1) { uint16_t q; if (q1 > 0) { q = 2500 / q1; if (q > 250) { q = VERY_LARGE_ETX_VALUE; } return q; } else { return VERY_LARGE_ETX_VALUE; } } // update the inbound link quality by // munging receive, fail count since last update void updateNeighborTableEst(am_addr_t n) { uint8_t i, totalPkt; neighbor_table_entry_t *ne; uint8_t newEst; uint8_t minPkt; minPkt = BLQ_PKT_WINDOW; dbg("LI", "%s\n", __FUNCTION__); for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { ne = &NeighborTable[i]; if (ne->ll_addr == n) { if (ne->flags & VALID_ENTRY) { dbg("LI", "Making link: %d mature\n", i); totalPkt = ne->rcvcnt + ne->failcnt; if (!(ne->flags & MATURE_ENTRY)) { newEst = (250UL * ne->rcvcnt) / totalPkt; ne->inquality = newEst; ne->etx = computeETX(ne->inquality); } ne->flags |= MATURE_ENTRY; dbg("LI", "MinPkt: %d, totalPkt: %d\n", minPkt, totalPkt); newEst = (250UL * ne->rcvcnt) / totalPkt; dbg("LI,LITest", " %hu: %hhu -> %hhu", ne->ll_addr, ne->inquality, (ALPHA * ne->inquality + (10-ALPHA) * newEst)/10); ne->inquality = (ALPHA * ne->inquality + (10-ALPHA) * newEst)/10; ne->rcvcnt = 0; ne->failcnt = 0; updateETX(ne, computeETX(ne->inquality)); } else { dbg("LI", " - entry %i is invalid.\n", (int)i); } } } } // we received seq from the neighbor in idx // update the last seen seq, receive and fail count // refresh the age void updateNeighborEntryIdx(uint8_t idx, uint8_t seq) { uint8_t packetGap; if (NeighborTable[idx].flags & INIT_ENTRY) { dbg("LI", "Init entry update\n"); NeighborTable[idx].flags &= ~INIT_ENTRY; } packetGap = seq - NeighborTable[idx].lastseq; dbg("LI", "updateNeighborEntryIdx: prevseq %d, curseq %d, gap %d\n", NeighborTable[idx].lastseq, seq, packetGap); NeighborTable[idx].lastseq = seq; NeighborTable[idx].rcvcnt++; if (packetGap > 0) { NeighborTable[idx].failcnt += packetGap - 1; } if (packetGap > MAX_PKT_GAP) { initNeighborIdx(idx, NeighborTable[idx].ll_addr); NeighborTable[idx].lastseq = seq; NeighborTable[idx].rcvcnt = 1; } else if (((NeighborTable[idx].rcvcnt + NeighborTable[idx].failcnt) >= BLQ_PKT_WINDOW) || (packetGap >= BLQ_PKT_WINDOW)) { updateNeighborTableEst(NeighborTable[idx].ll_addr); } } // print the neighbor table. for debugging. void print_neighbor_table() { uint8_t i; neighbor_table_entry_t *ne; for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { ne = &NeighborTable[i]; if (ne->flags & VALID_ENTRY) { dbg("LI,LITest", "%d:%d inQ=%d, rcv=%d, fail=%d, Q=%d\n", i, ne->ll_addr, ne->inquality, ne->rcvcnt, ne->failcnt, computeETX(ne->inquality)); } } } // print the packet. for debugging. void print_packet(message_t* msg, uint8_t len) { uint8_t i; uint8_t* b; b = (uint8_t *)msg->data; for(i=0; idata_success++; ne->data_total++; if (ne->data_total >= DLQ_PKT_WINDOW) { updateDETX(ne); } return SUCCESS; } // called when an acknowledgement is not received; could be due to // data pkt or acknowledgement loss; to update forward link quality command error_t LinkEstimator.txNoAck(am_addr_t neighbor) { neighbor_table_entry_t *ne; uint8_t nidx = findIdx(neighbor); if (nidx == INVALID_RVAL) { return FAIL; } ne = &NeighborTable[nidx]; ne->data_total++; if (ne->data_total >= DLQ_PKT_WINDOW) { updateDETX(ne); } return SUCCESS; } // called when the parent changes; clear state about data-driven link quality command error_t LinkEstimator.clearDLQ(am_addr_t neighbor) { neighbor_table_entry_t *ne; uint8_t nidx = findIdx(neighbor); if (nidx == INVALID_RVAL) { return FAIL; } ne = &NeighborTable[nidx]; ne->data_total = 0; ne->data_success = 0; return SUCCESS; } // user of link estimator calls send here // slap the header and footer before sending the message command error_t Send.send(am_addr_t addr, message_t* msg, uint8_t len) { uint8_t newlen; newlen = addLinkEstHeaderAndFooter(msg, len); dbg("LITest", "%s packet of length %hhu became %hhu\n", __FUNCTION__, len, newlen); dbg("LI", "Sending seq: %d\n", linkEstSeq); print_packet(msg, newlen); return call AMSend.send(addr, msg, newlen); } // done sending the message that originated by // the user of this component event void AMSend.sendDone(message_t* msg, error_t error ) { signal Send.sendDone(msg, error); } // cascade the calls down command uint8_t Send.cancel(message_t* msg) { return call AMSend.cancel(msg); } command uint8_t Send.maxPayloadLength() { return call Packet.maxPayloadLength(); } command void* Send.getPayload(message_t* msg, uint8_t len) { return call Packet.getPayload(msg, len); } // called when link estimator generator packet or // packets from upper layer that are wired to pass through // link estimator is received void processReceivedMessage(message_t* ONE msg, void* COUNT_NOK(len) payload, uint8_t len) { uint8_t nidx; uint8_t num_entries; dbg("LI", "LI receiving packet, buf addr: %x\n", payload); print_packet(msg, len); if (call SubAMPacket.destination(msg) == AM_BROADCAST_ADDR) { linkest_header_t* hdr = getHeader(msg); am_addr_t ll_addr; ll_addr = call SubAMPacket.source(msg); dbg("LI", "Got seq: %d from link: %d\n", hdr->seq, ll_addr); num_entries = hdr->flags & NUM_ENTRIES_FLAG; print_neighbor_table(); // update neighbor table with this information // find the neighbor // if found // update the entry // else // find an empty entry // if found // initialize the entry // else // find a bad neighbor to be evicted // if found // evict the neighbor and init the entry // else // we can not accommodate this neighbor in the table nidx = findIdx(ll_addr); if (nidx != INVALID_RVAL) { dbg("LI", "Found the entry so updating\n"); updateNeighborEntryIdx(nidx, hdr->seq); } else { nidx = findEmptyNeighborIdx(); if (nidx != INVALID_RVAL) { dbg("LI", "Found an empty entry\n"); initNeighborIdx(nidx, ll_addr); NeighborTable[nidx].lastseq = hdr->seq; updateNeighborEntryIdx(nidx, hdr->seq); } else { nidx = findWorstNeighborIdx(EVICT_ETX_THRESHOLD); if (nidx != INVALID_RVAL) { dbg("LI", "Evicted neighbor %d at idx %d\n", NeighborTable[nidx].ll_addr, nidx); signal LinkEstimator.evicted(NeighborTable[nidx].ll_addr); initNeighborIdx(nidx, ll_addr); } else { dbg("LI", "No room in the table\n"); /* if the white bit is set, lets ask the router if the path through this link is better than at least one known path - if so lets insert this link into the table. */ if (call LinkPacketMetadata.highChannelQuality(msg)) { if (signal CompareBit.shouldInsert(msg, call Packet.getPayload(msg, call Packet.payloadLength(msg)), call Packet.payloadLength(msg))) { nidx = findRandomNeighborIdx(); if (nidx != INVALID_RVAL) { signal LinkEstimator.evicted(NeighborTable[nidx].ll_addr); initNeighborIdx(nidx, ll_addr); } } } } } } } } // new messages are received here // update the neighbor table with the header // and footer in the message // then signal the user of this component event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { dbg("LI", "Received upper packet. Will signal up\n"); processReceivedMessage(msg, payload, len); return signal Receive.receive(msg, call Packet.getPayload(msg, call Packet.payloadLength(msg)), call Packet.payloadLength(msg)); } command void Packet.clear(message_t* msg) { call SubPacket.clear(msg); } // subtract the space occupied by the link estimation // header and footer from the incoming payload size command uint8_t Packet.payloadLength(message_t* msg) { linkest_header_t *hdr; hdr = getHeader(msg); return call SubPacket.payloadLength(msg) - sizeof(linkest_header_t) - sizeof(linkest_footer_t)*(NUM_ENTRIES_FLAG & hdr->flags); } // account for the space used by header and footer // while setting the payload length command void Packet.setPayloadLength(message_t* msg, uint8_t len) { linkest_header_t *hdr; hdr = getHeader(msg); call SubPacket.setPayloadLength(msg, len + sizeof(linkest_header_t) + sizeof(linkest_footer_t)*(NUM_ENTRIES_FLAG & hdr->flags)); } command uint8_t Packet.maxPayloadLength() { return call SubPacket.maxPayloadLength() - sizeof(linkest_header_t); } // application payload pointer is just past the link estimation header command void* Packet.getPayload(message_t* msg, uint8_t len) { void* payload = call SubPacket.getPayload(msg, len + sizeof(linkest_header_t)); if (payload != NULL) { payload += sizeof(linkest_header_t); } return payload; } } tinyos-2.1.2+dfsg/tos/lib/net/6lowpan/000077500000000000000000000000001207233610700175105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/6lowpan/IP.h000066400000000000000000000032101207233610700201650ustar00rootroot00000000000000/* * Copyright (c) 2007 Matus Harvan * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __IP_H__ #define __IP_H__ typedef struct { uint8_t addr[16]; } ip6_addr_t; #endif // __IP_H__ tinyos-2.1.2+dfsg/tos/lib/net/6lowpan/IP.nc000066400000000000000000000070221207233610700203430ustar00rootroot00000000000000/* * Copyright (c) 2007 Matus Harvan * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * This interface design was inspired Andrew Christian's port * of Adam Dunkel's uIP to TinyOS 1.x. The original interface file * is distributed under the following copyrights: * * Copyright (c) 2005 Hewlett-Packard Company * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of the Hewlett-Packard Company nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * /* * IP address interface. * */ #include "IP.h" interface IP { command void getAddress(ip6_addr_t *addr); command void setAddress(const ip6_addr_t *addr); command void setAddressAutoconf(const ip6_addr_t *addr); } tinyos-2.1.2+dfsg/tos/lib/net/6lowpan/IPC.nc000066400000000000000000000053351207233610700204530ustar00rootroot00000000000000/* * Copyright (c) 2007 Matus Harvan * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "IP.h" #include "IP_internal.h" #include "message.h" #ifdef ENABLE_PRINTF_DEBUG #include "printf.h" #endif /* ENABLE_PRINTF_DEBUG */ configuration IPC { provides { interface SplitControl as IPControl; interface IP; interface UDPClient[uint8_t i]; } } implementation { components IPP; components ActiveMessageC as AM; //TODO: need at least 2 pkts for ND components new PoolC(lowpan_pkt_t, SEND_PKTS) as SendPktPool; components new PoolC(app_data_t, FRAG_BUFS) as AppDataPool; components new PoolC(frag_info_t, FRAG_BUFS*FRAGS_PER_DATAGRAM) as FragInfoPool; components new TimerMilliC() as Timer; components LedsC; IPControl = IPP; UDPClient = IPP.UDPClient; IP = IPP.IP; IPP.MessageControl -> AM; IPP.Receive -> AM.Receive[AM_IP_MSG]; IPP.AMSend -> AM.AMSend[AM_IP_MSG]; IPP.Packet -> AM; IPP.AMPacket -> AM; IPP.SendPktPool -> SendPktPool; IPP.AppDataPool -> AppDataPool; IPP.FragInfoPool -> FragInfoPool; IPP.Leds -> LedsC; IPP.Timer -> Timer; #ifdef ENABLE_PRINTF_DEBUG components PrintfC; IPP.PrintfControl -> PrintfC; IPP.PrintfFlush -> PrintfC; #endif /* ENABLE_PRINTF_DEBUG */ } tinyos-2.1.2+dfsg/tos/lib/net/6lowpan/IPP.nc000066400000000000000000001731351207233610700204740ustar00rootroot00000000000000/* * Copyright (c) 2007 Matus Harvan * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Parts of the 6lowpan implementation design were inspired Andrew * Christian's port of Adam Dunkel's uIP to TinyOS 1.x. This work is * distributed under the following copyrights: * * Copyright (c) 2001-2003, Adam Dunkels. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2005, Hewlett-Packard Company * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of the Hewlett-Packard Company nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * The actual implementaion of the 6lowpan/IPv6 stack lives in this file. */ #include "IP.h" #include "IP_internal.h" #include "message.h" #ifdef ENABLE_PRINTF_DEBUG #include "printf.h" #endif /* ENABLE_PRINTF_DEBUG */ module IPP { provides { interface SplitControl as IPControl; interface IP; interface UDPClient[uint8_t i]; } uses { interface Timer as Timer; interface Pool as SendPktPool; interface Pool as AppDataPool; interface Pool as FragInfoPool; interface SplitControl as MessageControl; interface Receive; interface AMSend; interface Packet; interface AMPacket; #ifdef ENABLE_PRINTF_DEBUG interface PrintfFlush; interface SplitControl as PrintfControl; #endif /* ENABLE_PRINTF_DEBUG */ interface Leds; } } implementation { /* global variables */ enum { COUNT_UDP_CLIENT = uniqueCount("UDPClient"), COUNT_UDP_CONNS = COUNT_UDP_CLIENT }; ip6_addr_t global_addr; ip6_addr_t linklocal_addr; uint16_t g_dgram_tag = 0; uint16_t uip_len, uip_slen; uint8_t uip_flags; /* The uip_flags variable is used for communication between the TCP/IP stack and the application program. */ message_t g_msg; // AM for sending lowpan_pkt_t rx_pkt; // packet used for receiving //struct lowpan_pkt send_pkt[SEND_PKTS]; // packets to be sent lowpan_pkt_t *send_queue; // packets to be sent - queue frag_buf_t frag_bufs[FRAG_BUFS]; // fragment reassembly buffers struct udp_conn udp_conns[COUNT_UDP_CONNS]; static uint16_t lastport; /* Keeps track of the last port used for a new connection. */ static int g_send_pending = 0; // Pre-declare // clear all fields, set app_data = NULL void lowpan_pkt_clear(lowpan_pkt_t *pkt); int ip6_addr_cmp(const ip6_addr_t *a, const ip6_addr_t *b); static void dump_serial_packet(const unsigned char *packet, const int len); /*---------------------------------------------------------------------------*/ /* from http://www.nabble.com/memcpy-assumes-16-bit-alignment--t712619.html */ void * my_memcpy(void *dst0, const void *src0, size_t len) { char *dst = (char *)dst0; const char *src = (const char *)src0; void *ret = dst0; for (; len > 0; len--) *dst++ = *src++; return ret; } /* * Use this function for copying/setting/memset() 16-bit values * on the MSP430 !!! * * The mspgcc compiler geenrates broken code when doing memset with 16 * bit values, i.e. things go wrong if they are not aligned at 16-bit * boundaries. See * http://www.nabble.com/msp430-gcc-generating-unaligned-access.-t2261862.html * and page 25 in http://www.eecs.harvard.edu/~konrad/projects/motetrack/mspgcc-manual-20031127.pdf for details. */ /* use when DST may be UNALIGNED */ inline void set_16t(void *dst, uint16_t val) { *((uint8_t*)dst) = *((uint8_t*)&val); *(((uint8_t*)dst)+1) = *(((uint8_t*)&val)+1); //memcpy((uint8_t*)dst, (uint8_t*)&val, sizeof(uint8_t)); //memcpy(((uint8_t*)dst)+1, ((uint8_t*)&val)+1, sizeof(uint8_t)); } /* use when SRC may be UNALIGNED */ inline uint16_t get_16t(void *val) { uint16_t tmp; *((uint8_t*)&tmp) = *((uint8_t*)val); *(((uint8_t*)&tmp)+1) = *(((uint8_t*)val)+1); //memcpy((uint8_t*)&tmp, (uint8_t*)val, sizeof(uint8_t)); //memcpy(((uint8_t*)&tmp)+1, ((uint8_t*)val)+1, sizeof(uint8_t)); return tmp; } inline uint16_t htons( uint16_t val ) { // The MSB is little-endian; network order is big return ((val & 0xff) << 8) | ((val & 0xff00) >> 8); } inline uint16_t ntohs( uint16_t val ) { // The MSB is little-endian; network order is big return ((val & 0xff) << 8) | ((val & 0xff00) >> 8); } inline void htonl( uint32_t val, uint8_t *dest ) { dest[0] = (val & 0xff000000) >> 24; dest[1] = (val & 0x00ff0000) >> 16; dest[2] = (val & 0x0000ff00) >> 8; dest[3] = (val & 0x000000ff); } inline uint32_t ntohl( uint8_t *src ) { return (((uint32_t) src[0]) << 24) | (((uint32_t) src[1]) << 16) | (((uint32_t) src[2]) << 8) | (((uint32_t) src[3])); } /* inline void uip_pack_ipaddr( ip6_addr_t *addr, uint8_t *new_addr) { memcpy(addr, new_addr, sizeof(addr)); } // Unpack the IP address into an array of octet inline void uip_unpack_ipaddr( uint8_t *in, uint8_t *out ) { memcpy(out, in, sizeof(ip6_addr_t)); } */ /*---------------------------------------------------------------------------*/ /* This should be optimized for aligned and unaligned case */ static uint16_t ip_chksum(const uint8_t *buf, uint16_t len, uint16_t acc) { uint16_t v; for (; len > 1; len -= 2) { v = (((uint16_t) buf[1]) << 8) | ((uint16_t) buf[0]); if ( (acc += v) < v ) acc++; buf += 2; } // add an odd byte (note we pad with 0) if (len) { v = (uint16_t) buf[0]; if ( (acc += v) < v ) acc++; } return acc; } /* * IPv6 checksum of the pseudo-header (RFC 2460, Sec 8.1) * src_addr and dst_addr are in nerwork byte order * len is in host byte order (will internally be converted) */ static uint16_t ipv6_chksum(const ip6_addr_t* src_addr, const ip6_addr_t* dst_addr, const uint8_t next_header, const uint16_t upper_layer_len, uint16_t acc) { uint16_t tmp; /* source address */ acc = ip_chksum((const uint8_t *) src_addr, sizeof(*src_addr), acc); /* destination address */ acc = ip_chksum((const uint8_t *) dst_addr, sizeof(*dst_addr), acc); /* upper-layer packet length */ tmp = htons(upper_layer_len); acc = ip_chksum((const uint8_t *) &tmp, sizeof(tmp), acc); /* next header */ tmp = htons(next_header); acc = ip_chksum((const uint8_t *) &tmp, sizeof(tmp), acc); return acc; } /* same as above, but including the uppel-layer buffer */ static uint16_t ipv6_chksum_data(const ip6_addr_t* src_addr, const ip6_addr_t* dst_addr, const uint8_t next_header, const uint8_t *data, uint16_t data_len, uint16_t acc) { /* upper-layer payload */ acc = ip_chksum(data, data_len, acc); return ipv6_chksum(src_addr, dst_addr, next_header, data_len, acc); } /*---------------------------------------------------------------------------*/ bool ipv6_addr_is_zero(const ip6_addr_t *addr) { int i; for (i=0;i<16;i++) { if (addr->addr[i]) { return FALSE; } } return TRUE; } bool ipv6_addr_is_linklocal_unicast(const ip6_addr_t *addr) { if ( addr->addr[0] == 0xFE && addr->addr[1] == 0x80 && addr->addr[2] == 0 && addr->addr[3] == 0 && addr->addr[4] == 0 && addr->addr[5] == 0 && addr->addr[6] == 0 && addr->addr[7] == 0 ) return TRUE; else return FALSE; } //TODO: prepend pan_id once we have a proper 802.15.4 stack void ipv6_iface_id_from_am_addr(am_addr_t am_addr, uint8_t *host_part) { memset(host_part, 0, 6); host_part[4] = 0xFF; host_part[5] = 0xFE; host_part += 6; set_16t(host_part, htons(am_addr)); } void ipv6_iface_id_from_hw_addr(hw_addr_t *hw_addr, uint8_t *host_part) { if (hw_addr->type == HW_ADDR_SHORT) { memset(host_part, 0, 6); host_part[4] = 0xFF; host_part[5] = 0xFE; host_part[7] = hw_addr->addr_short[0]; host_part[8] = hw_addr->addr_short[1]; //ipv6_iface_id_from_am_addr(hw_addr->addr_short, host_part); } else { //TODO } } bool ipv6_addr_is_linklocal_multicast(const ip6_addr_t *addr) { if (addr->addr[0] == 0xFF && addr->addr[1] == 0x02) return TRUE; else return FALSE; } bool ipv6_addr_is_linklocal(const ip6_addr_t *addr) { return (ipv6_addr_is_linklocal_unicast(addr) || ipv6_addr_is_linklocal_multicast(addr)); } bool ipv6_addr_is_linklocal_allnodes(const ip6_addr_t *addr) { //TODO: interface-local addr FF01::1 if ( addr->addr[0] == 0xFF && addr->addr[1] == 0x02 && addr->addr[2] == 0 && addr->addr[3] == 0 && addr->addr[4] == 0 && addr->addr[5] == 0 && addr->addr[6] == 0 && addr->addr[7] == 0 && addr->addr[8] == 0 && addr->addr[9] == 0 && addr->addr[10] == 0 && addr->addr[11] == 0 && addr->addr[12] == 0 && addr->addr[13] == 0 && addr->addr[14] == 0 && addr->addr[15] == 0x01 ) return TRUE; else return FALSE; } bool ipv6_addr_is_solicited_node_multicast_prefix(const ip6_addr_t *addr) { // Solicited-Node Address: FF02:0:0:0:0:1:FFXX:XXXX // Solicited-Node multicast address are computed as a function of a // node's unicast and anycast addresses. A Solicited-Node multicast // address is formed by taking the low-order 24 bits of an address // (unicast or anycast) and appending those bits to the prefix // FF02:0:0:0:0:1:FF00::/104 resulting in a multicast address in the // range // FF02:0:0:0:0:1:FF00:0000 // to // FF02:0:0:0:0:1:FFFF:FFFF if ( addr->addr[0] == 0xFF && addr->addr[1] == 0x02 && addr->addr[2] == 0 && addr->addr[3] == 0 && addr->addr[4] == 0 && addr->addr[5] == 0 && addr->addr[6] == 0 && addr->addr[7] == 0 && addr->addr[8] == 0 && addr->addr[9] == 0 && addr->addr[10] == 0 && addr->addr[11] == 0x01 && addr->addr[12] == 0xFF ) return TRUE; else return FALSE; } uint8_t cmp_ipv6_addr(const ip6_addr_t *addr1, const ip6_addr_t *addr2) { return memcmp(addr1, addr2, sizeof(ip6_addr_t)); } uint8_t ipv6_addr_is_for_me(const ip6_addr_t *addr) { //TODO: loopback addr (::1) //TODO: interface-local addr FF01::1 if (cmp_ipv6_addr(addr, &global_addr) == 0 || cmp_ipv6_addr(addr, &linklocal_addr) == 0 || ipv6_addr_is_linklocal_allnodes(addr) || (ipv6_addr_is_solicited_node_multicast_prefix(addr) && (((addr->addr[13] == global_addr.addr[13]) && (addr->addr[14] == global_addr.addr[14]) && (addr->addr[15] == global_addr.addr[15]) ) || ((addr->addr[13] == linklocal_addr.addr[13]) && (addr->addr[14] == linklocal_addr.addr[14]) && (addr->addr[15] == linklocal_addr.addr[15]) ) ) ) ) return 1; else return 0; } /* determine the right src_addr given a dst_addr */ ip6_addr_t * determine_src_ipv6_addr(const ip6_addr_t *dst_addr) { if (ipv6_addr_is_linklocal(dst_addr)) { return &linklocal_addr; } else { return &global_addr; } } uint8_t cmp_hw_addr(const hw_addr_t *addr1, const hw_addr_t *addr2) { // for short addresses compare only the first two bytes if (addr1->type == HW_ADDR_SHORT && addr2->type == HW_ADDR_SHORT) { return memcmp(addr1->addr_short, addr2->addr_short, 2); } else { return memcmp(addr1, addr2, sizeof(hw_addr_t)); } } uint8_t hw_addr_is_broadcat(const hw_addr_t *hw_addr) { if (hw_addr->type == HW_ADDR_SHORT && hw_addr->addr_short[0] == 0xFF && hw_addr->addr_short[1] == 0xFF) return 1; // TODO: long address else return 0; } uint8_t hw_addr_is_for_me(const hw_addr_t *addr) { am_addr_t am_addr = call AMPacket.address(); if (hw_addr_is_broadcat(addr) || (addr->addr_short[0] == (uint8_t) am_addr && addr->addr_short[1] == (uint8_t) (am_addr >> 8)) ) return 1; else return 0; } /*---------------------------------------------------------------------------*/ void increment_g_dgram_tag() { uint16_t tmp = ntohs(g_dgram_tag); if (tmp == 0xFFFF) tmp = 0; else tmp++; g_dgram_tag = htons(tmp); } void lowpan_pkt_clear(lowpan_pkt_t *pkt) { memset(pkt, 0, sizeof(*pkt)); pkt->header_begin = pkt->header + sizeof(pkt->header); } /* void frag_buf_clear(frag_buf_t *frag_buf) { memset(frag_buf, 0, sizeof(*frag_buf)); frag_buf->buf_begin = frag_buf->buf; } */ frag_buf_t * find_fragment(hw_addr_t *hw_src_addr, hw_addr_t *hw_dst_addr, uint16_t dgram_size, uint16_t dgram_tag) { int i; for (i = 0; i< FRAG_BUFS; i++) { //printf("find_frag\n"); if (frag_bufs[i].frag_timeout != FRAG_FREE) { //printf("find: [%d] %d\n", i, frag_bufs[i].frag_timeout); /* printf("find: tag: 0x%04X, size: %d\n", get_16t(&frag_bufs[i].dgram_tag), ntohs(get_16t(&frag_bufs[i].dgram_size))); */ if ( get_16t(&(frag_bufs[i].dgram_tag)) == dgram_tag && get_16t(&(frag_bufs[i].dgram_size)) == dgram_size && cmp_hw_addr(&frag_bufs[i].hw_src_addr, hw_src_addr) == 0 && cmp_hw_addr(&frag_bufs[i].hw_dst_addr, hw_dst_addr) == 0 ) { return &(frag_bufs[i]); } } else { //printf("find: [%d] FREE\n", i); } } return NULL; } void free_frag_list(frag_info_t *p) { frag_info_t *q; while (p) { q = p->next; call FragInfoPool.put(p); p = q; } } /*---------------------------------------------------------------------------*/ void ip_init() { //int i; lastport = 1024; memset(udp_conns, 0, sizeof(udp_conns)); //memset(&global_addr, 0, sizeof(global_addr)); memset(&linklocal_addr, 0, sizeof(linklocal_addr)); memset(frag_bufs, 0, sizeof(frag_bufs)); /* for(i=0;i= 32000) { lastport = 4096; } for (c = 0; c < COUNT_UDP_CONNS; ++c) { if (udp_conns[c].lport == lastport) { goto again; } } return lastport; } /* ========================= IPv6 - output ================================= */ task void sendTask() { lowpan_pkt_t *pkt = send_queue; struct lowpan_frag_hdr *frag_hdr; uint8_t *payload; uint8_t frame_len; uint8_t len; /* length of the fragment just being sent * excluding the 6lowpan optional headers */ uint8_t remaining_len; /* how much more data can we fit * into this fragment */ uint8_t *tmp_cpy_buf; /* simplifies memcpy */ uint8_t tmp_cpy_len; /* simplifies memcpy */ if (!pkt || g_send_pending) { return; } //len = pkt->header_len + pkt->app_data_len - pkt->dgram_offset*8; if (pkt->header_len + pkt->app_data_len <= LINK_DATA_MTU) { /* fragmentation not needed */ frame_len = pkt->header_len + pkt->app_data_len; /* prepare the AM */ call Packet.clear(&g_msg); call Packet.setPayloadLength(&g_msg, frame_len); payload = call Packet.getPayload(&g_msg, frame_len); // memset(payload, 0 , payload_len); // should check payload_len here /* copy header */ if (pkt->header_begin && pkt->header_len) memcpy(payload, pkt->header_begin, pkt->header_len); payload += pkt->header_len; /* copy app_data */ if (pkt->app_data_begin && pkt->app_data_len) memcpy(payload, pkt->app_data_begin, pkt->app_data_len); } else { /* do fragmentation */ if (pkt->dgram_offset == 0) { /* first fragment */ increment_g_dgram_tag(); set_16t(&pkt->dgram_size, htons(pkt->header_len + pkt->app_data_len)); /* align fragment length at an 8-byte multiple */ len = LINK_DATA_MTU - sizeof(struct lowpan_frag_hdr); len -= len%8; frame_len = len + sizeof(struct lowpan_frag_hdr); } else { /* subsequent fragment */ if (pkt->header_len + pkt->app_data_len - pkt->dgram_offset*8 <= LINK_DATA_MTU - sizeof(struct lowpan_frag_hdr) - sizeof(uint8_t)) { /* last fragment -- does not have to be aligned * at an 8-byte multiple */ len = pkt->header_len + pkt->app_data_len - pkt->dgram_offset*8; } else { /* align fragment length at an 8-byte multiple */ len = LINK_DATA_MTU - sizeof(struct lowpan_frag_hdr) - sizeof(uint8_t); len -= len%8; } frame_len = len + sizeof(struct lowpan_frag_hdr) + sizeof(uint8_t); } /* prepare the AM */ call Packet.clear(&g_msg); call Packet.setPayloadLength(&g_msg,frame_len); payload = call Packet.getPayload(&g_msg, frame_len); remaining_len = frame_len; if (remaining_len != frame_len) { //TODO: report an error #ifdef ENABLE_PRINTF_DEBUG printf("payload length does not match requested length\n"); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ return; } /* fill in the fragment header */ frag_hdr = (struct lowpan_frag_hdr *) payload; set_16t(&frag_hdr->dgram_size, pkt->dgram_size); set_16t(&frag_hdr->dgram_tag, g_dgram_tag); payload += sizeof(struct lowpan_frag_hdr); remaining_len -= sizeof(struct lowpan_frag_hdr); if (pkt->dgram_offset == 0) { /* first fragment */ frag_hdr->dispatch |= DISPATCH_FIRST_FRAG; } else { /* subsequent fragment */ frag_hdr->dispatch |= DISPATCH_SUBSEQ_FRAG; *payload = pkt->dgram_offset; payload += sizeof(uint8_t); } /* copy header */ if (pkt->header_begin && pkt->header_len && pkt->header_len > pkt->dgram_offset*8 /* don't copy the header if offset is beyond it*/ ) { /* determine what has to be copied */ tmp_cpy_buf = pkt->header_begin + pkt->dgram_offset*8; tmp_cpy_len = min(pkt->header_len - pkt->dgram_offset*8, remaining_len); /* copy it */ memcpy(payload, tmp_cpy_buf, tmp_cpy_len); payload += tmp_cpy_len; remaining_len -= tmp_cpy_len; } /* copy app_data */ if (remaining_len && pkt->app_data_begin && pkt->app_data_len ) { /* determine what has to be copied */ if (pkt->dgram_offset*8 > pkt->header_len) { tmp_cpy_buf = pkt->app_data_begin + pkt->dgram_offset*8 - pkt->header_len; } else { /* header has been copied only now, offset not yet updated */ tmp_cpy_buf = pkt->app_data_begin; } tmp_cpy_len = min(remaining_len, pkt->app_data_len - (pkt->dgram_offset*8 - pkt->header_len)); /* copy it */ memcpy(payload, tmp_cpy_buf, tmp_cpy_len); payload += tmp_cpy_len; remaining_len -= tmp_cpy_len; } /* update the offset - in 8-byte multiples */ pkt->dgram_offset += len/8; if (len%8) { /* last fragment with a special length */ pkt->dgram_offset++; } } /* send the AM */ g_send_pending = 1; call AMSend.send(AM_BROADCAST_ADDR, &g_msg, frame_len); //call AMSend.send(0x12, &g_msg, frame_len); } event void AMSend.sendDone(message_t* msg, error_t error) { uint16_t len; lowpan_pkt_t *pkt = send_queue; g_send_pending = 0; if (!send_queue) { // somethign really went wrong... return; } len = pkt->header_len + pkt->app_data_len; if (len <= LINK_DATA_MTU || pkt->dgram_offset*8 >= len){ /* packet has been completely sent, we can move on to the next one */ /* UDPClient.sendDone notification */ if (send_queue->notify_num != LOWPAN_PKT_NO_NOTIFY) { signal UDPClient.sendDone[send_queue->notify_num - 1] (SUCCESS, send_queue->app_data); } /* deallocation of app_data (fragment reassembly buffer) */ if (send_queue->app_data_dealloc == APP_DATA_DEALLOC_TRUE && send_queue->app_data) { call AppDataPool.put((app_data_t*) send_queue->app_data); send_queue->app_data = NULL; } pkt = send_queue->next; call SendPktPool.put(send_queue); send_queue = pkt; } if (send_queue) { post sendTask(); } } void ipv6_output_uncompressed(lowpan_pkt_t *pkt, const uint8_t next_header) { struct ip6_hdr *hdr; lowpan_pkt_t *p; pkt->header_begin -= sizeof(struct ip6_hdr); pkt->header_len += sizeof(struct ip6_hdr); hdr = (struct ip6_hdr *) pkt->header_begin; /* fill in the IPv6 header */ hdr->vtc = IPV6_VERSION; /* IPv6 version */ /* payload length */ set_16t(&hdr->plen, htons(pkt->header_len + pkt->app_data_len - sizeof(struct ip6_hdr))); hdr->nxt_hdr = next_header; hdr->hlim = IP_HOP_LIMIT; /* hop limit */ memcpy(&hdr->src_addr, &pkt->ip_src_addr, sizeof(hdr->src_addr)); memcpy(&hdr->dst_addr, &pkt->ip_dst_addr, sizeof(hdr->dst_addr)); /* set 6lowpan dispatch value */ pkt->header_begin -= sizeof(uint8_t); pkt->header_len += sizeof(uint8_t); *(pkt->header_begin) = DISPATCH_UNCOMPRESSED_IPV6; //TODO: check if neighbor is information available // if yes // fill in hw_addr // append to send_queue // else // append to neighbor_queue // request ND, add an entry into the neighbor table /* append pkt to send queue */ if(!send_queue) { send_queue = pkt; } else { for(p=send_queue; p->next; p=p->next); p->next = pkt; } /* schedule sendTask */ post sendTask(); } /* determines length of the inline carried fields for the HC1 encoding * the return value is the number of bits, bot bytes !!! */ int get_hc1_length(uint8_t hc1_enc) { int len = 0; /* Hop Limit always carried inline */ len += 8; /* source IP address */ if ((hc1_enc & HC1_SRC_PREFIX_MASK) == HC1_SRC_PREFIX_INLINE) len += 64; if ((hc1_enc & HC1_SRC_IFACEID_MASK) == HC1_SRC_IFACEID_INLINE) len += 64; /* destination IP address */ if ((hc1_enc & HC1_DST_PREFIX_MASK) == HC1_DST_PREFIX_INLINE) len += 64; if ((hc1_enc & HC1_DST_IFACEID_MASK) == HC1_DST_IFACEID_INLINE) len += 64; /* Traffic Class and Flow Label */ if ((hc1_enc & HC1_TCFL_MASK) == HC1_TCFL_INLINE) len += 24; /* Next Header */ if ((hc1_enc & HC1_NEXTHDR_MASK) == HC1_NEXTHDR_INLINE) len += 8; return len; } void ipv6_compressed_output(lowpan_pkt_t *pkt, const uint8_t next_header, uint8_t hc2_enc, bool hc2_present) { lowpan_pkt_t *p; uint8_t hc1_enc = 0; /* HC2 compression */ if (hc2_present) { hc1_enc |= HC1_HC2_PRESENT; } else { hc1_enc |= HC1_HC2_NONE; } /* next header */ switch (next_header) { case NEXT_HEADER_UDP: hc1_enc |= HC1_NEXTHDR_UDP; break; case NEXT_HEADER_ICMP6: hc1_enc |= HC1_NEXTHDR_ICMP; break; case NEXT_HEADER_TCP: hc1_enc |= HC1_NEXTHDR_TCP; break; default: hc1_enc |= HC1_NEXTHDR_INLINE; pkt->header_begin -= sizeof(next_header); pkt->header_len += sizeof(next_header); *(pkt->header_begin) = next_header; break; } /* we're always sending packets with TC anf FL zero */ hc1_enc |= HC1_TCFL_ZERO; /* destination address interface identifier */ hc1_enc |= HC1_DST_IFACEID_INLINE; pkt->header_begin -= 8; pkt->header_len += 8; memcpy(pkt->header_begin, ((void*)&(pkt->ip_dst_addr)) + 8, 8); /* destination address prefix */ if (ipv6_addr_is_linklocal_unicast(&pkt->ip_dst_addr)) { hc1_enc |= HC1_DST_PREFIX_LINKLOCAL; } else { hc1_enc |= HC1_DST_PREFIX_INLINE; pkt->header_begin -= 8; pkt->header_len += 8; memcpy(pkt->header_begin, &(pkt->ip_dst_addr), 8); } /* source address interface identifier */ hc1_enc |= HC1_SRC_IFACEID_INLINE; pkt->header_begin -= 8; pkt->header_len += 8; memcpy(pkt->header_begin, ((void*)&(pkt->ip_src_addr)) + 8, 8); /* source address prefix */ if (ipv6_addr_is_linklocal_unicast(&pkt->ip_src_addr)) { hc1_enc |= HC1_SRC_PREFIX_LINKLOCAL; } else { hc1_enc |= HC1_SRC_PREFIX_INLINE; pkt->header_begin -= 8; pkt->header_len += 8; memcpy(pkt->header_begin, &(pkt->ip_src_addr), 8); } /* Hop Limit */ pkt->header_begin -= sizeof(uint8_t); pkt->header_len += sizeof(uint8_t); *pkt->header_begin = IP_HOP_LIMIT; /* HC2 encoding field */ if (hc2_present) { pkt->header_begin -= sizeof(uint8_t); pkt->header_len += sizeof(uint8_t); *(pkt->header_begin) = hc2_enc; } /* HC1 encoding field */ pkt->header_begin -= sizeof(uint8_t); pkt->header_len += sizeof(uint8_t); *(pkt->header_begin) = hc1_enc; /* set 6lowpan dispatch value */ pkt->header_begin -= sizeof(uint8_t); pkt->header_len += sizeof(uint8_t); *(pkt->header_begin) = DISPATCH_COMPRESSED_IPV6; /* append pkt to send queue */ if(!send_queue) { send_queue = pkt; } else { for(p=send_queue; p->next; p=p->next); p->next = pkt; } /* schedule sendTask */ post sendTask(); } void icmpv6_output(lowpan_pkt_t *pkt, uint8_t type, uint8_t code) { struct icmp6_hdr *hdr; uint16_t cksum = 0; /* fill in the source address if not set */ if (ipv6_addr_is_zero(&pkt->ip_src_addr)) { memcpy(&pkt->ip_src_addr, determine_src_ipv6_addr(&pkt->ip_dst_addr), sizeof(pkt->ip_src_addr)); } /* fill in the ICMPv6 header */ pkt->header_begin -= sizeof(struct icmp6_hdr); pkt->header_len += sizeof(struct icmp6_hdr); hdr = (struct icmp6_hdr *) pkt->header_begin; hdr->type = type; hdr->code = code; /* calculate the checksum */ set_16t(&hdr->cksum, 0); cksum = ipv6_chksum(&pkt->ip_src_addr, &pkt->ip_dst_addr, NEXT_HEADER_ICMP6, pkt->header_len + pkt->app_data_len, cksum); cksum = ip_chksum((void*)hdr, sizeof(struct icmp6_hdr), cksum); cksum = ip_chksum(pkt->app_data_begin, pkt->app_data_len, cksum); cksum = ~cksum; set_16t(&hdr->cksum, cksum); ipv6_compressed_output(pkt, NEXT_HEADER_ICMP6, 0, FALSE); } error_t udp_uncompressed_output(void* buf, uint16_t len, const ip6_addr_t *src_addr, const ip6_addr_t *dst_addr, uint16_t src_port, uint16_t dst_port, uint8_t udp_client_num) { struct udp_hdr *hdr; lowpan_pkt_t *pkt; uint16_t cksum = 0; if (!dst_addr) return FAIL; pkt = call SendPktPool.get(); if (!pkt) return FAIL; lowpan_pkt_clear(pkt); /* set the UDPCliemt number to allow for signalling sendDone */ pkt->notify_num = udp_client_num; /* set application data */ pkt->app_data = buf; pkt->app_data_begin = buf; pkt->app_data_len = len; /* set IP addresses */ memcpy(&pkt->ip_dst_addr, dst_addr, sizeof(pkt->ip_dst_addr)); if (src_addr) { memcpy(&pkt->ip_src_addr, src_addr, sizeof(pkt->ip_src_addr)); } else { memcpy(&pkt->ip_src_addr, determine_src_ipv6_addr(dst_addr), sizeof(pkt->ip_src_addr)); } /* fill in the UDP header */ pkt->header_begin -= sizeof(struct udp_hdr); pkt->header_len += sizeof(struct udp_hdr); hdr = (struct udp_hdr *) pkt->header_begin; /* src port */ set_16t(&hdr->srcport, src_port); /* dst port */ set_16t(&hdr->dstport, dst_port); /* length */ set_16t(&hdr->len,htons(len + sizeof(struct udp_hdr))); /* checksum */ set_16t(&hdr->chksum, 0); cksum = ip_chksum((uint8_t*) hdr, sizeof(struct udp_hdr), cksum); cksum = ipv6_chksum(&pkt->ip_dst_addr, &pkt->ip_src_addr, NEXT_HEADER_UDP, sizeof(struct udp_hdr) + len, cksum); cksum = ip_chksum(buf, len, cksum); if (cksum != 0xFFFF) { cksum = ~cksum; } set_16t(&hdr->chksum, cksum); ipv6_compressed_output(pkt, NEXT_HEADER_UDP, 0, FALSE); return SUCCESS; } error_t udp_compressed_output(void* buf, uint16_t len, const ip6_addr_t *src_addr, const ip6_addr_t *dst_addr, uint16_t src_port, uint16_t dst_port, uint8_t udp_client_num) { lowpan_pkt_t *pkt; uint16_t cksum = 0; uint16_t hc2_enc = 0; uint16_t udp_len = htons(len + sizeof(struct udp_hdr)); if (!dst_addr) return FAIL; pkt = call SendPktPool.get(); if (!pkt) return FAIL; lowpan_pkt_clear(pkt); /* set the UDPCliemt number to allow for signalling sendDone */ pkt->notify_num = udp_client_num; /* set application data */ pkt->app_data = buf; pkt->app_data_begin = buf; pkt->app_data_len = len; /* set IP addresses */ memcpy(&pkt->ip_dst_addr, dst_addr, sizeof(pkt->ip_dst_addr)); if (src_addr) { memcpy(&pkt->ip_src_addr, src_addr, sizeof(pkt->ip_src_addr)); } else { memcpy(&pkt->ip_src_addr, determine_src_ipv6_addr(dst_addr), sizeof(pkt->ip_src_addr)); } /* Checksum */ cksum = 0; cksum = ip_chksum((void*) &src_port, sizeof(src_port), cksum); cksum = ip_chksum((void*) &dst_port, sizeof(src_port), cksum); cksum = ip_chksum((void*) &udp_len, sizeof(udp_len), cksum); cksum = ipv6_chksum(&pkt->ip_dst_addr, &pkt->ip_src_addr, NEXT_HEADER_UDP, sizeof(struct udp_hdr) + len, cksum); cksum = ip_chksum(buf, len, cksum); if (cksum != 0xFFFF) { cksum = ~cksum; } /* HC_UDP encoding */ /* Checksum */ pkt->header_begin -= sizeof(cksum); pkt->header_len += sizeof(cksum); set_16t(pkt->header_begin, cksum); /* Length */ //hc2_enc |= HC2_UDP_LEN_COMPR; hc2_enc |= HC2_UDP_LEN_INLINE; pkt->header_begin -= sizeof(udp_len); pkt->header_len += sizeof(udp_len); set_16t(pkt->header_begin, udp_len); /* Destination Port */ hc2_enc |= HC2_UDP_DST_PORT_INLINE; pkt->header_begin -= sizeof(dst_port); pkt->header_len += sizeof(dst_port); set_16t(pkt->header_begin, dst_port); /* Source Port */ hc2_enc |= HC2_UDP_SRC_PORT_INLINE; pkt->header_begin -= sizeof(src_port); pkt->header_len += sizeof(src_port); set_16t(pkt->header_begin, src_port); ipv6_compressed_output(pkt, NEXT_HEADER_UDP, hc2_enc, TRUE); return SUCCESS; } /* ========================== IPv6 - input ================================= */ void icmpv6_input(uint8_t* buf, uint16_t len) { lowpan_pkt_t *pkt; struct icmp6_hdr *hdr = (struct icmp6_hdr *)buf; /* Compute and check the IP header checksum. */ if (ipv6_chksum_data(&rx_pkt.ip_src_addr, &rx_pkt.ip_dst_addr, NEXT_HEADER_ICMP6, buf, len, 0) != 0xffff) { #ifdef ENABLE_PRINTF_DEBUG printf("icmpv6_input(): checksum failed\n"); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ call Leds.led0Toggle(); return; } buf += sizeof(struct icmp6_hdr); len -= sizeof(struct icmp6_hdr); switch (hdr->type) { case ICMP_TYPE_ECHO_REQUEST: /* ICMP code has to be 0 */ if (hdr->code != 0) { return; } call Leds.led2Toggle(); /* send back an ICMP ECHO REPLY */ /* allocate a packet for the reply */ pkt = call SendPktPool.get(); if (!pkt) { #ifdef ENABLE_PRINTF_DEBUG printf("icmpv6_input() - failed to alloc pkt\n"); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ return; } lowpan_pkt_clear(pkt); /* copy/set ICMP data */ if (rx_pkt.app_data) { /* fragment reassembly took place - ICMP data is in app_data buf */ pkt->app_data = rx_pkt.app_data; pkt->app_data_begin = buf; pkt->app_data_len = len; pkt->app_data_dealloc = rx_pkt.app_data_dealloc; rx_pkt.app_data_dealloc = APP_DATA_DEALLOC_FALSE; rx_pkt.app_data = NULL; } else { /* there is no app_data buf, everything fits into the header buf */ pkt->header_begin -= len; my_memcpy(pkt->header_begin, buf, len); pkt->app_data_begin = pkt->header_begin; pkt->app_data_len = len; } /* set destination address */ memcpy(&pkt->ip_dst_addr, &rx_pkt.ip_src_addr, sizeof(pkt->ip_dst_addr)); // source address determined automatically icmpv6_output(pkt, ICMP_TYPE_ECHO_REPLY, 0); break; case ICMP_TYPE_ECHO_REPLY: break; } } /* UDP input processing. */ void udp_input(uint8_t* buf, uint16_t len) { struct udp_conn *conn; int c; struct udp_hdr *hdr = (struct udp_hdr *)buf; /* Compute and check the IP header checksum. */ if (ipv6_chksum_data(&rx_pkt.ip_src_addr, &rx_pkt.ip_dst_addr, NEXT_HEADER_UDP, buf, len, 0) != 0xffff) { #ifdef ENABLE_PRINTF_DEBUG printf("udp_input(): checksum failed\n"); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ call Leds.led0Toggle(); return; } if (htons(len) != hdr->len) { #ifdef ENABLE_PRINTF_DEBUG printf("length check failed\n"); printf("reported length: %d\n", len); printf("UDP header len: %d\n", ntohs(hdr->len)); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ return; } /* Scan the list of UDP sockets and look for one that is accepting this port */ for (c = 0, conn = udp_conns; c < COUNT_UDP_CONNS; c++, conn++) { /* printf("lport: 0x%X\n", conn->lport); printf("rport: 0x%X\n", conn->rport); printf("conn->ripaddr: "); dump_serial_packet(&(conn->ripaddr), sizeof(ip6_addr_t)); printf("src_addr: "); dump_serial_packet(src_addr, sizeof(ip6_addr_t)); */ if ( (conn->lport != 0 && conn->lport == hdr->dstport) && (conn->rport == 0 || conn->rport == hdr->srcport) && (ipv6_addr_is_zero(&(conn->ripaddr)) || (cmp_ipv6_addr(&conn->ripaddr, &rx_pkt.ip_src_addr) == 0)) ) goto udp_match_found; } #ifdef ENABLE_PRINTF_DEBUG printf("udp_input(): no connection matched - dropping UDP packet\n"); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ return; udp_match_found: len -= sizeof(struct udp_hdr); if (len > 0) { signal UDPClient.receive[c](&rx_pkt.ip_src_addr, ntohs(hdr->srcport), buf+sizeof(struct udp_hdr), len); } } void udp_input_compressed(uint8_t* buf, uint16_t len, uint8_t hc2_enc) { struct udp_conn *conn; int c; uint16_t src_port; uint16_t dst_port; uint16_t chksum; uint16_t tmp_chksum; uint16_t tmp_len; /* UDP Source Port */ if ((hc2_enc & HC2_UDP_SRC_PORT_MASK) == HC2_UDP_SRC_PORT_INLINE) { src_port = get_16t(buf); buf += sizeof(src_port); len -= sizeof(src_port); } else { //TODO return; } /* UDP Destination Port */ if ((hc2_enc & HC2_UDP_DST_PORT_MASK) == HC2_UDP_DST_PORT_INLINE) { dst_port = get_16t(buf); buf += sizeof(dst_port); len -= sizeof(dst_port); } else { //TODO return; } /* UDP Length */ if ((hc2_enc & HC2_UDP_LEN_MASK) == HC2_UDP_LEN_INLINE) { /* check the length */ if (ntohs(get_16t(buf)) != len + sizeof(uint16_t)*2) { #ifdef ENABLE_PRINTF_DEBUG printf("length check failed\n"); printf("reported length: %d\n", len + sizeof(uint16_t)*2); printf("UDP header len: %d\n", ntohs(get_16t(buf))); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ return; } buf += sizeof(uint16_t); len -= sizeof(uint16_t); } /* Checksum */ chksum = get_16t(buf); buf += sizeof(chksum); len -= sizeof(chksum); /* --- end of decompression --- */ /* Compute and check the IP header checksum. */ tmp_chksum = 0; /* IPv6 pseaudo header */ tmp_chksum = ipv6_chksum(&rx_pkt.ip_src_addr, &rx_pkt.ip_dst_addr, NEXT_HEADER_UDP, /* len is only app data, so add UDP header * length to get the length for chksum */ len + sizeof(struct udp_hdr), tmp_chksum); /* UDP header */ tmp_len = htons(len + sizeof(struct udp_hdr)); tmp_chksum = ip_chksum((void*) &src_port, sizeof(src_port), tmp_chksum); tmp_chksum = ip_chksum((void*) &dst_port, sizeof(src_port), tmp_chksum); tmp_chksum = ip_chksum((void*) &chksum, sizeof(chksum), tmp_chksum); tmp_chksum = ip_chksum((void*) &tmp_len, sizeof(len), tmp_chksum); /* UDP payload - application data */ tmp_chksum = ip_chksum(buf, len, tmp_chksum); if (tmp_chksum != 0xffff) { #ifdef ENABLE_PRINTF_DEBUG printf("udp_input_compressed(): checksum failed\n"); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ call Leds.led0Toggle(); return; } // printf("udp_input_compressed()\n"); // printf("src_port: 0x%X\n", src_port); // printf("dst_port: 0x%X\n", dst_port); // printf("len (app_data): %d\n", len); // call PrintfFlush.flush(); /* Scan the list of UDP sockets and look for one that is accepting this port */ for (c = 0, conn = udp_conns; c < COUNT_UDP_CONNS; c++, conn++) { /* printf("lport: 0x%X\n", conn->lport); printf("rport: 0x%X\n", conn->rport); printf("conn->ripaddr: "); dump_serial_packet(&(conn->ripaddr), sizeof(ip6_addr_t)); printf("src_addr: "); dump_serial_packet(&rx_pkt.ip_src_addr, sizeof(ip6_addr_t)); */ if ( (conn->lport != 0 && conn->lport == dst_port) && (conn->rport == 0 || conn->rport == src_port) && (ipv6_addr_is_zero(&(conn->ripaddr)) || (cmp_ipv6_addr(&conn->ripaddr, &rx_pkt.ip_src_addr) == 0)) ) goto udp_match_found; } #ifdef ENABLE_PRINTF_DEBUG printf("udp_input_compressed(): "\ "no connection matched - dropping UDP packet\n"); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ return; udp_match_found: if (len > 0) { signal UDPClient.receive[c](&rx_pkt.ip_src_addr, ntohs(src_port), buf, len); } } /* processed the IPv6 header (uncompressed) */ void ipv6_input_uncompressed(uint8_t* buf, uint16_t len) { struct ip6_hdr *hdr = (struct ip6_hdr *) buf; /* check the version */ if ((hdr->vtc & IPV6_VERSION_MASK) != 0x60) { #ifdef ENABLE_PRINTF_DEBUG printf("IP version check failed (%X)\n", hdr->vtc & IPV6_VERSION_MASK); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ return; } /* Hop Limit */ if (! hdr->hlim) { /* Hop Limit reached zero */ #ifdef ENABLE_PRINTF_DEBUG printf("Hop Limit reached zero\n"); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ return; } /* check dst IP address */ if (! ipv6_addr_is_for_me(&hdr->dst_addr)) { return; } /* Check the size of the packet. If the size reported to us in * uip_len doesn't match the size reported in the IP header, there * has been a transmission error and we drop the packet. */ if ( hdr->plen != htons(len - sizeof(struct ip6_hdr))) { #ifdef ENABLE_PRINTF_DEBUG printf("length check failed\n"); printf("l2 reported length: %d\n", len - sizeof(struct ip6_hdr)); printf("IPv6 header plen: %d (network byte order: 0x%X\n", ntohs(hdr->plen), hdr->plen); //((hdr->plen & 0xff00) >> 8) & ((hdr->plen & 0xff) << 8)); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ return; } /* copy IP addresses to rx_pkt */ memcpy(&rx_pkt.ip_src_addr, &(hdr->src_addr), sizeof(rx_pkt.ip_src_addr)); memcpy(&rx_pkt.ip_dst_addr, &(hdr->dst_addr), sizeof(rx_pkt.ip_dst_addr)); /* multipex on next header */ switch (hdr->nxt_hdr) { case NEXT_HEADER_ICMP6: icmpv6_input(buf + sizeof(struct ip6_hdr), len - sizeof(struct ip6_hdr)); break; case NEXT_HEADER_UDP: udp_input(buf + sizeof(struct ip6_hdr), len - sizeof(struct ip6_hdr)); break; /* case NEXT_HEADER_TCP: break; */ default: #ifdef ENABLE_PRINTF_DEBUG printf("unknown IPv6 next header: 0x%X\n", hdr->nxt_hdr); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ break; } } /* processed the IPv6 header (uncompressed) */ void ipv6_input_compressed(uint8_t* buf, uint16_t len) { struct ip6_hdr *ip_hdr = (struct ip6_hdr *) buf; uint8_t hc1_enc; uint8_t hc2_enc = 0; uint8_t next_header; /* printf("nxt_hdr: 0x%X\n", hdr->nxt_hdr); dump_serial_packet(buf, len); call PrintfFlush.flush(); */ hc1_enc = *buf; buf += sizeof(hc1_enc); len -= sizeof(hc1_enc); /* HC2 encoding follows HC1 encoding */ if ((hc1_enc & HC1_HC2_MASK) == HC1_HC2_PRESENT) { hc2_enc = *buf; buf += sizeof(hc2_enc); len -= sizeof(hc2_enc); } /* Hop Limit */ if (*buf) { buf += sizeof(ip_hdr->hlim); len -= sizeof(ip_hdr->hlim); } else { /* Hop Limit reached zero */ return; } /* source IP address */ if ((hc1_enc & HC1_SRC_PREFIX_MASK) == HC1_SRC_PREFIX_INLINE) { memcpy(&rx_pkt.ip_src_addr, buf, sizeof(rx_pkt.ip_src_addr)/2); buf += sizeof(rx_pkt.ip_src_addr)/2; len -= sizeof(rx_pkt.ip_src_addr)/2; } else { /* linl-local prefix */ memset(&rx_pkt.ip_src_addr, 0, sizeof(rx_pkt.ip_src_addr)/2); rx_pkt.ip_src_addr.addr[0] = 0xFE; rx_pkt.ip_src_addr.addr[1] = 0x80; } if ((hc1_enc & HC1_SRC_IFACEID_MASK) == HC1_SRC_IFACEID_INLINE) { memcpy(((void*)&rx_pkt.ip_src_addr) + sizeof(rx_pkt.ip_src_addr)/2, buf, sizeof(rx_pkt.ip_src_addr)/2); buf += sizeof(rx_pkt.ip_src_addr)/2; len -= sizeof(rx_pkt.ip_src_addr)/2; } /* destination IP address */ if ((hc1_enc & HC1_DST_PREFIX_MASK) == HC1_DST_PREFIX_INLINE) { memcpy(&rx_pkt.ip_dst_addr, buf, sizeof(rx_pkt.ip_dst_addr)/2); buf += sizeof(rx_pkt.ip_dst_addr)/2; len -= sizeof(rx_pkt.ip_dst_addr)/2; } else { /* linl-local prefix */ memset(&rx_pkt.ip_dst_addr, 0, sizeof(rx_pkt.ip_dst_addr)/2); rx_pkt.ip_dst_addr.addr[0] = 0xFE; rx_pkt.ip_dst_addr.addr[1] = 0x80; } if ((hc1_enc & HC1_DST_IFACEID_MASK) == HC1_DST_IFACEID_INLINE) { memcpy(((void*)&rx_pkt.ip_dst_addr) + sizeof(rx_pkt.ip_dst_addr)/2, buf, sizeof(rx_pkt.ip_dst_addr)/2); buf += sizeof(rx_pkt.ip_dst_addr)/2; len -= sizeof(rx_pkt.ip_dst_addr)/2; } /* check dst IP address */ if (! ipv6_addr_is_for_me(&rx_pkt.ip_dst_addr)) { /* printf("IP address check failed\n"); dump_serial_packet(hdr->dst_addr.addr, sizeof(hdr->dst_addr.addr)); call PrintfFlush.flush(); */ return; } /* Traffic Class and Flow Label */ if ((hc1_enc & HC1_TCFL_MASK) == HC1_TCFL_INLINE) { //TODO return; } /* Next Header */ switch (hc1_enc & HC1_NEXTHDR_MASK) { case HC1_NEXTHDR_INLINE: next_header = *buf; buf += sizeof(uint8_t); len -= sizeof(uint8_t); break; case HC1_NEXTHDR_UDP: next_header = NEXT_HEADER_UDP; break; case HC1_NEXTHDR_ICMP: next_header = NEXT_HEADER_ICMP6; break; case HC1_NEXTHDR_TCP: next_header = NEXT_HEADER_TCP; break; default: #ifdef ENABLE_PRINTF_DEBUG printf("unknown next header HC1 encoding\n"); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ return; } /* multipex on the next header */ switch (next_header) { case NEXT_HEADER_ICMP6: icmpv6_input(buf, len); break; case NEXT_HEADER_UDP: /* HC_UDP compression */ if ((hc1_enc & HC1_HC2_MASK) == HC1_HC2_PRESENT && (hc1_enc & HC1_NEXTHDR_MASK) == HC1_NEXTHDR_UDP) { udp_input_compressed(buf, len, hc2_enc); break; } else { udp_input(buf, len); break; } /* case NEXT_HEADER_TCP: break; */ default: #ifdef ENABLE_PRINTF_DEBUG printf("unknown IPv6 next header: 0x%X\n", next_header); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ break; } } /* call the right fct for processing the IPv6 header */ void layer3_input(uint8_t *buf, uint16_t len) { uint8_t *dispatch = buf; buf++; len--; /* uncompressed IPv6 */ if (*dispatch == DISPATCH_UNCOMPRESSED_IPV6) { ipv6_input_uncompressed(buf, len); } /* LOWPAN_HC1 compressed IPv6 */ else if (*dispatch == DISPATCH_COMPRESSED_IPV6) { //call Leds.led1Toggle(); return ipv6_input_compressed(buf, len); } /* unknown dispatch value if we got here */ else { //TODO: report an error } } /* process the optional 6lowpan headers */ void TRUSTEDBLOCK lowpan_input(uint8_t* buf, uint8_t len ) { uint8_t *dispatch; struct lowpan_broadcast_hdr *bc_hdr; struct lowpan_frag_hdr *frag_hdr; int i; frag_buf_t *frag; uint16_t dgram_tag; uint16_t dgram_size; uint8_t dgram_offset; frag_info_t *p; frag_info_t **q; uint8_t last_frag; dispatch = buf; /* --- 6lowpan optional headers --- */ /* Mesh Addressing header */ if ( (*dispatch & DISPATCH_MESH_MASK) == DISPATCH_MESH) { // check if we're the final recipient in the mesh addressing header buf++; len--; /* Hops Left */ if ((*dispatch & 0x0F) == 0) { goto discard_packet; } /* Final Destination Address */ if (*dispatch & DISPATCH_MESH_F_FLAG) { rx_pkt.hw_dst_addr.type = HW_ADDR_LONG; memcpy(&rx_pkt.hw_dst_addr.addr_long, buf, sizeof(rx_pkt.hw_dst_addr.addr_long)); buf += sizeof(rx_pkt.hw_dst_addr.addr_long); len -= sizeof(rx_pkt.hw_dst_addr.addr_long); } else { rx_pkt.hw_dst_addr.type = HW_ADDR_SHORT; memcpy(&rx_pkt.hw_dst_addr.addr_short, buf, sizeof(rx_pkt.hw_dst_addr.addr_short)); buf += sizeof(rx_pkt.hw_dst_addr.addr_short); len -= sizeof(rx_pkt.hw_dst_addr.addr_short); } /* check if we're the recipient */ if (! hw_addr_is_for_me(&rx_pkt.hw_dst_addr)) { // TODO: if mesh forwarding enabled, then forward goto discard_packet; } /* Originator Address */ if (*dispatch & DISPATCH_MESH_O_FLAG) { rx_pkt.hw_src_addr.type = HW_ADDR_LONG; memcpy(&rx_pkt.hw_src_addr.addr_long, buf, sizeof(rx_pkt.hw_src_addr.addr_long)); buf += sizeof(rx_pkt.hw_src_addr.addr_long); len -= sizeof(rx_pkt.hw_src_addr.addr_long); } else { rx_pkt.hw_src_addr.type = HW_ADDR_SHORT; memcpy(rx_pkt.hw_src_addr.addr_short, buf, sizeof(rx_pkt.hw_src_addr.addr_short)); buf += sizeof(rx_pkt.hw_src_addr.addr_short); len -= sizeof(rx_pkt.hw_src_addr.addr_short); } dispatch = buf; } if (*dispatch == DISPATCH_BC0) { /* Broadcast header */ bc_hdr = (struct lowpan_broadcast_hdr *) buf; // do something usefull with bc_hdr->seq_no... buf += (sizeof(struct lowpan_broadcast_hdr)); len -= (sizeof(struct lowpan_broadcast_hdr)); dispatch = buf; } /* fragment header */ if ((*dispatch & DISPATCH_FRAG_MASK) == DISPATCH_FIRST_FRAG || (*dispatch & DISPATCH_FRAG_MASK) == DISPATCH_SUBSEQ_FRAG ) { frag_hdr = (struct lowpan_frag_hdr *) buf; buf += sizeof(struct lowpan_frag_hdr); len -= sizeof(struct lowpan_frag_hdr); /* collect information about the fragment */ dgram_tag = get_16t(&frag_hdr->dgram_tag); //dgram_size = get_16t(&frag_hdr->dgram_size); //dgram_size &= htons(0x07FF); dgram_size = frag_hdr->dgram_size8[1]; dgram_size += (frag_hdr->dgram_size8[0] & 0x07) << 8; dgram_size = htons(dgram_size); if ((*dispatch & DISPATCH_FRAG_MASK) == DISPATCH_SUBSEQ_FRAG) { dgram_offset = *buf; buf += 1; len -= 1; } else { dgram_offset = 0; } #ifdef ENABLE_PRINTF_DEBUG printf("off: %d\n", dgram_offset); #endif /* ENABLE_PRINTF_DEBUG */ /* printf("off: %d, f_b[%d] %d\n", dgram_offset, 0, frag_bufs[0].frag_timeout); */ frag = find_fragment(&rx_pkt.hw_src_addr, &rx_pkt.hw_dst_addr, dgram_size, dgram_tag); /* if (frag) { printf("frag found\n"); } else { printf("frag NOT found\n"); } */ if (frag) { /* fragment reassembly buffer found */ /* check for overlap */ //TODO: ENABLE THIS PART !!! // for (p = frag->frag_list; p; p=p->next) { // if (dgram_offset == p->offset){ // if (len == p->len) { // /* same offset, same len => discard this duplicate */ // goto discard_packet; // } else { // /* same offset, but different len */ // goto frag_overlap; // } // } else if (dgram_offset > p->offset // && dgram_offset < p->offset + p->len/8 // ) { // /* offset inside another frag*/ // goto frag_overlap; // } // } /* no overlap found */ //printf("frag found: %d\n", frag->frag_timeout); goto frag_reassemble; } else { /* fragment reassembly buffer not found - set up a new one */ // no match found -- need a new frag_buf_t for (i = 0; i< FRAG_BUFS; i++) { if (frag_bufs[i].frag_timeout == FRAG_FREE && call AppDataPool.empty() == FALSE) { frag = &frag_bufs[i]; set_16t(&frag->dgram_tag, get_16t(&frag_hdr->dgram_tag)); set_16t(&frag->dgram_size, dgram_size); memcpy(&frag->hw_src_addr, &rx_pkt.hw_src_addr, sizeof(frag->hw_src_addr)); memcpy(&frag->hw_dst_addr, &rx_pkt.hw_dst_addr, sizeof(frag->hw_dst_addr)); frag->frag_timeout = FRAG_TIMEOUT; frag->buf = (uint8_t *) call AppDataPool.get(); frag->frag_list = NULL; /* printf("new frag_buf[%d] %d\n", i, frag_bufs[i].frag_timeout); printf("frag pool size: %d\n", call FragInfoPool.size()); call PrintfFlush.flush(); */ goto frag_reassemble; } } // no free slot for reassembling fragments #ifdef ENABLE_PRINTF_DEBUG printf("no free slot - discarding frag\n"); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ goto discard_packet; } frag_overlap: /* overlap - discard previous frags * and restart fragment reassembly */ free_frag_list(frag->frag_list); frag->frag_list = NULL; frag->frag_timeout = FRAG_TIMEOUT; goto frag_reassemble; frag_reassemble: /* printf("tag: 0x%04X, size: %d, off: %d, t: %d\n", get_16t(&frag->dgram_tag), ntohs(get_16t(&frag->dgram_size)), dgram_offset, frag->frag_timeout); //printf("f_b[%d] %d\n", 0, frag_bufs[0].frag_timeout); if (dgram_offset > 0) { call PrintfFlush.flush(); } */ /* copy buf data */ //if (dgram_offset*8 + len <= sizeof(frag->buf)) { if (dgram_offset*8 + len <= FRAG_BUF_SIZE) { memcpy(frag->buf + (dgram_offset*8), buf, len); } else { call Leds.led0Toggle(); } /* update frag_info */ p = call FragInfoPool.get(); if (!p) { //out of memory - fragment reassembly failing //TODO call Leds.led0Toggle(); #ifdef ENABLE_PRINTF_DEBUG printf("FAILED to alloc frag_info_t\n"); call PrintfFlush.flush(); #endif /* ENABLE_PRINTF_DEBUG */ } else { p->offset = dgram_offset; p->len = len; /* insert frag_info into the orderer list */ if (frag->frag_list) { for(q = &(frag->frag_list); (*q)->next; q=&((*q)->next)) { if (p->offset > (*q)->offset) { break; } } p->next = *q; *q = p; } else { p->next = frag->frag_list; frag->frag_list = p; } } #ifdef ENABLE_PRINTF_DEBUG if (dgram_offset > 20) { printf("frag_list:\n"); //ntohs(get_16t(&frag->dgram_tag)), //ntohs(get_16t(&frag->dgram_size))); for (p=frag->frag_list;p;p=p->next) { printf("off: %d, len: %d\n", p->offset, p->len); } call PrintfFlush.flush(); } #endif /* ENABLE_PRINTF_DEBUG */ /* check if this is not the last fragment */ if (!dgram_offset) { /* the first fragment cannot be the last one */ last_frag = 0; } else { last_frag=1; dgram_offset = ntohs(dgram_size)/8; for(p=frag->frag_list; p && dgram_offset; p=p->next) { //debug("dgram_offset: %d, p->offset: %d, p->len: %d\n", // dgram_offset, p->offset, p->len); if (p->offset + p->len/8 != dgram_offset) { //debug("offset mismatch - not the last fragment\n"); last_frag = 0; break; } dgram_offset = p->offset; } } if (last_frag) { call Leds.led1Toggle(); /* prepare the complete packet to be passed up*/ lowpan_pkt_clear(&rx_pkt); rx_pkt.app_data = frag->buf; rx_pkt.app_data_dealloc = APP_DATA_DEALLOC_TRUE; rx_pkt.header_begin = frag->buf; rx_pkt.header_len = ntohs(dgram_size); //debug("dumping reassembled datagram...\n"); //dump_serial_packet(pkt->buf_begin, pkt->len); /* pass up the packet */ layer3_input(rx_pkt.header_begin, rx_pkt.header_len); /* deallocate all fragment info */ free_frag_list(frag->frag_list); frag->frag_list = NULL; frag->frag_timeout = FRAG_FREE; if (rx_pkt.app_data_dealloc == APP_DATA_DEALLOC_TRUE && rx_pkt.app_data) { /* deallocate the frag_buf */ call AppDataPool.put((app_data_t *) rx_pkt.app_data); } } else { /* packet not yet complete */ return; } dispatch = buf; } else { /* no fragmentation */ /* pass up the complete packet */ lowpan_pkt_clear(&rx_pkt); rx_pkt.header_begin = buf; rx_pkt.header_len = len; layer3_input(buf, len); } discard_packet: // deallocate pkt // update stats } /* Receive an AM from the lower layer */ event TRUSTEDBLOCK message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) { am_addr_t am_addr; //call Leds.led0Toggle(); /* 802.15.4 source address */ rx_pkt.hw_src_addr.type = HW_ADDR_SHORT; am_addr = call AMPacket.source(msg); memcpy(&rx_pkt.hw_src_addr.addr_short, &am_addr, sizeof(am_addr_t)); /* 802.15.4 destination address */ rx_pkt.hw_dst_addr.type = HW_ADDR_SHORT; am_addr = call AMPacket.destination(msg); memcpy(&rx_pkt.hw_dst_addr.addr_short, &am_addr, sizeof(am_addr_t)); lowpan_input(payload, len); return msg; } /****************************************** * Interface StdControl ******************************************/ command error_t IPControl.start() { #ifdef ENABLE_PRINTF_DEBUG call PrintfControl.start(); #endif /* ENABLE_PRINTF_DEBUG */ ip_init(); linklocal_addr.addr[0] = 0xfe; linklocal_addr.addr[1] = 0x80; ipv6_iface_id_from_am_addr(call AMPacket.address(), &(linklocal_addr.addr[8])); //set_16t((uint16_t *)&(linklocal_addr.addr[14]), am_addr); call MessageControl.start(); return SUCCESS; } event void MessageControl.startDone(error_t err) { if (err == SUCCESS) { signal IPControl.startDone(err); call Timer.startPeriodic(1024); /* fire every second */ } else { call MessageControl.start(); } } command error_t IPControl.stop() { call MessageControl.stop(); call Timer.stop(); #ifdef ENABLE_PRINTF_DEBUG call PrintfControl.stop(); #endif /* ENABLE_PRINTF_DEBUG */ return SUCCESS; } event void MessageControl.stopDone(error_t err) { signal IPControl.stopDone(err); } /****************************************** * IP Interface ******************************************/ command void IP.getAddress(ip6_addr_t *addr) { addr = &global_addr; //uip_unpack_ipaddr( uip_global_addr, addr->addr ); } command void IP.setAddress(const ip6_addr_t *addr) { memcpy(&global_addr, addr, sizeof(*addr)); //uip_pack_ipaddr(uip_global_addr,octet1,octet2,octet3,octet4); } command void IP.setAddressAutoconf(const ip6_addr_t *addr) { memcpy(&global_addr, addr, sizeof(*addr)); ipv6_iface_id_from_am_addr(call AMPacket.address(), &(global_addr.addr[8])); //set_16t((uint16_t *)&(global_addr.addr[14]), am_addr); } /***************************** * UDP functions *****************************/ command error_t UDPClient.listen[uint8_t num](uint16_t port) { if (port) { memset(&udp_conns[num].ripaddr, 0, sizeof(udp_conns[num].ripaddr)); set_16t(&udp_conns[num].lport, htons(port)); } else { set_16t(&udp_conns[num].lport, 0); } return SUCCESS; } command error_t UDPClient.connect[uint8_t num](const ip6_addr_t *addr, const uint16_t port) { struct udp_conn *conn = &udp_conns[num]; if (addr && port) { memcpy(&conn->ripaddr, addr, sizeof(conn->ripaddr)); set_16t(&conn->rport, htons(port)); } else { memset(&conn->ripaddr, 0 , sizeof(conn->ripaddr)); set_16t(&conn->rport, 0); } return SUCCESS; } command error_t UDPClient.sendTo[uint8_t num](const ip6_addr_t *addr, uint16_t port, const uint8_t *buf, uint16_t len) { if (udp_conns[num].lport == 0) { set_16t(&udp_conns[num].lport, htons(udp_assign_port())); } return udp_compressed_output(buf, len, NULL, addr, udp_conns[num].lport, htons(port), num+1); } command error_t UDPClient.send[uint8_t num]( const uint8_t *buf, uint16_t len ) { if (udp_conns[num].rport == 0 || ipv6_addr_is_zero(&udp_conns[num].ripaddr)) return FAIL; return call UDPClient.sendTo[num](&(udp_conns[num].ripaddr), udp_conns[num].rport, buf, len); } default event void UDPClient.sendDone[uint8_t num](error_t result, void* buf) { } default event void UDPClient.receive[uint8_t num](const ip6_addr_t *addr, uint16_t port, uint8_t *buf, uint16_t len) { } /****************************************** * Printf Timer ******************************************/ #ifdef ENABLE_PRINTF_DEBUG event void PrintfFlush.flushDone(error_t error) {} event void PrintfControl.startDone(error_t error) {} event void PrintfControl.stopDone(error_t error) {} static void dump_serial_packet(const unsigned char *packet, const int len) { int i; printf("len: %d\n", len); //call PrintfFlush.flush(); if (!packet) { printf("packet is NULL"); } else { for (i = 0; i < len; i++) printf("%02x ", packet[i]); } printf("\n"); //call PrintfFlush.flush(); } #endif /* ENABLE_PRINTF_DEBUG */ #ifndef ENABLE_PRINTF_DEBUG static void dump_serial_packet(const unsigned char *packet, const int len) {} #endif /* ENABLE_PRINTF_DEBUG */ /****************************************** * Interface Timer ******************************************/ event void Timer.fired() { int i=0; /* heartbeat led */ //call Leds.led0Toggle(); /* discard timed-out and not yet assembled fragmented packet */ for (i=0;i 0) { frag_bufs[i].frag_timeout--; } else { /* fragment reassembly timed out */ frag_bufs[i].frag_timeout = FRAG_FREE; free_frag_list(frag_bufs[i].frag_list); if (frag_bufs[i].buf) { call AppDataPool.put((app_data_t *) frag_bufs[i].buf); } //call Leds.led0Toggle(); } } } //TODO: check for timed-out ND request and resend/give up and mark as such //TODO: check outgoing pkts queue and schedule ND or sending /* counter++; if (locked) { return; } else { //Packet.clear(&test_packet); uint8_t* data=(uint8_t*) call Packet.getPayload(&test_packet,NULL); if (call Packet.maxPayloadLength() < 1) { return; } data[0] = counter; call AMPacket.setSource(&test_packet, 0x14); if (call AMSend.send(3, &test_packet, 1) == SUCCESS) { // if (call AMSend.send(AM_BROADCAST_ADDR, &test_packet, sizeof(test_serial_msg_t)) == SUCCESS) { locked = TRUE; } } */ } } tinyos-2.1.2+dfsg/tos/lib/net/6lowpan/IP_internal.h000066400000000000000000000321221207233610700220650ustar00rootroot00000000000000/* * Copyright (c) 2007 Matus Harvan * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * The structures are based on the ones from FreeBSD header files * in /usr/include/netinet6/, which are distributed unred the following * copyright: * * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * Copyright (c) 1982, 1986, 1990, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * Header file for the 6lowpan/IPv6 stack. */ #ifndef __IP_INTERNAL_H__ #define __IP_INTERNAL_H__ enum { HW_ADDR_SHORT, HW_ADDR_LONG }; typedef struct hw_addr { uint8_t type; // HW_ADDR_SHORT | HW_ADDR_LONG union { uint8_t addr_short[2]; uint8_t addr_long[8]; }; } hw_addr_t; /* number of packets in SendPktPool */ #define SEND_PKTS 1 /* number of fragment reassembly buffers */ #define FRAG_BUFS 1 /* timeout for discarding a fragment reassembly buffer * 60 seconds max in 6lowpan draft */ #define FRAG_TIMEOUT 10 /* number of fragments per reassembled datagram */ #define FRAGS_PER_DATAGRAM 15 /* fragment reassembmly buffer size */ #define FRAG_BUF_SIZE 1280 /* default IPv6 Hop Limit for outgoing packets (except Neighbor Discovery) */ #define IP_HOP_LIMIT 64 #define LOWPAN_MTU 1280 #define LOWPAN_OVERHEAD 17 // 16 bytes opt. headers and 1 byte dispatch #define LINK_DATA_MTU 100 // 802.15.4 space left after the 802.15.4 header: 128 - xx = 102 bytes max /* size of app_data buffer */ #define LOWPAN_APP_DATA_LEN FRAG_BUF_SIZE /* maximum length of 6lowpan headers */ //#define LOWPAN_HEADER_LEN 49 #define LOWPAN_HEADER_LEN 102 /* flag marking an unused fragment reassembly buffer/structure */ #define FRAG_FREE 0xFF /* 6lowpan dispatch values */ #define DISPATCH_UNCOMPRESSED_IPV6 0x41 #define DISPATCH_COMPRESSED_IPV6 0x42 #define DISPATCH_FIRST_FRAG 0xC0 #define DISPATCH_SUBSEQ_FRAG 0xE0 #define DISPATCH_FRAG_MASK 0xF8 #define DISPATCH_BC0 0x50 #define DISPATCH_MESH 0x80 #define DISPATCH_MESH_MASK 0xC0 #define DISPATCH_MESH_O_FLAG 0x20 #define DISPATCH_MESH_F_FLAG 0x10 #define DISPATCH_MESH_HOPSLEFT_MASK 0x0F enum { /* lowpan_pkt_t.app_data_dealloc */ APP_DATA_DEALLOC_FALSE=0, APP_DATA_DEALLOC_TRUE=1, /* lowpan_pkt_t.notify_num */ LOWPAN_PKT_NO_NOTIFY = 0, /* HC1 encoding */ HC1_SRC_PREFIX_MASK = 0x80, HC1_SRC_PREFIX_LINKLOCAL = 0x80, HC1_SRC_PREFIX_INLINE = 0, HC1_SRC_IFACEID_MASK = 0x40, HC1_SRC_IFACEID_COMRP = 0x40, HC1_SRC_IFACEID_INLINE = 0, HC1_DST_PREFIX_MASK = 0x20, HC1_DST_PREFIX_LINKLOCAL = 0x20, HC1_DST_PREFIX_INLINE = 0, HC1_DST_IFACEID_MASK = 0x10, HC1_DST_IFACEID_COMRP = 0x10, HC1_DST_IFACEID_INLINE = 0, HC1_TCFL_MASK = 0x08, HC1_TCFL_ZERO = 0x08, HC1_TCFL_INLINE = 0, HC1_NEXTHDR_MASK = 0x06, HC1_NEXTHDR_INLINE = 0, HC1_NEXTHDR_UDP = 0x02, HC1_NEXTHDR_ICMP = 0x04, HC1_NEXTHDR_TCP = 0x06, HC1_HC2_MASK = 0x01, HC1_HC2_PRESENT = 0x01, HC1_HC2_NONE = 0, HC2_UDP_P_VALUE = 0x61616, HC2_UDP_SRC_PORT_MASK = 0x80, HC2_UDP_SRC_PORT_COMPR = 0x80, HC2_UDP_SRC_PORT_INLINE = 0, HC2_UDP_DST_PORT_MASK = 0x40, HC2_UDP_DST_PORT_COMPR = 0x40, HC2_UDP_DST_PORT_INLINE = 0, HC2_UDP_LEN_MASK = 0x20, HC2_UDP_LEN_COMPR = 0x20, HC2_UDP_LEN_INLINE = 0 }; /* used for fragment reassembly */ typedef struct _frag_info_t { uint8_t offset; uint8_t len; struct _frag_info_t *next; } frag_info_t; /* used for fragment reassembly */ typedef struct _app_data_t { uint8_t buf[LOWPAN_MTU]; } app_data_t; /* used for fragment reassembly */ typedef struct _frag_buf_t { uint8_t *buf; /* usually a pointer to app_data_t */ hw_addr_t hw_src_addr; hw_addr_t hw_dst_addr; uint16_t dgram_tag; /* network byte order */ uint16_t dgram_size; /* host byte order */ uint8_t frag_timeout; /* discarded when zero is reached * FRAG_FREE means not used at the moment */ frag_info_t *frag_list; /* sorted by offset in decreasing order */ } frag_buf_t; /* * sending - application provides app_data and clears app_data_dealloc * - a pointer to app_data is returned in sendDone to do deallocation * receiving with fragment reassembly * - IPP provides app_data and sets app_data_dealloc * - header_begin is set to point into app_data * and the received packet is put into app_data * receiving without fragment reassembly * - the complete 802.15.4 frame is put into header * (802.15.4 header is left out) and heade_begin points into header */ typedef struct _lowpan_pkt_t { /* buffers */ uint8_t *app_data; /* buffer for application data */ uint16_t app_data_len; /* how much data is in the buffer */ uint8_t *app_data_begin; /* start of the data in the buffer */ uint8_t app_data_dealloc; /* shall IPC deallocate the app_data buffer? /* APP_DATA_DEALLOC_FALSE | APP_DATA_DEALLOC_TRUE */ uint8_t header[LINK_DATA_MTU]; /* buffer for the header (tx) * or unfragmented 802.15.4 frame (rx) */ uint16_t header_len; /* how much data is in the buffer */ uint8_t *header_begin; /* start of the data in the buffer */ /* fragmentation */ uint16_t dgram_tag; /* network byte order */ uint16_t dgram_size; /* host byte order */ uint8_t dgram_offset; /* offset where next fragment starts (tx) * (in multiples of 8 bytes) */ /* IP addresses */ ip6_addr_t ip_src_addr; /* needed for ND and usefull elsewhere */ ip6_addr_t ip_dst_addr; /* both IP addresses filled in by ipv6*_input */ /* 802.15.4 addresses */ hw_addr_t hw_src_addr; hw_addr_t hw_dst_addr; /* 802.15.4 MAC addresses * needed for fragment identification * needed for 6lowpan IPv6 header decompression * contains mesh header entries if applicable */ /* to notify app with sendDone */ uint8_t notify_num; /* num of UDPClient + 1, 0 means o not notify */ struct _lowpan_pkt_t *next; } lowpan_pkt_t; enum { FRAG_NONE = 0, FRAG_6LOWPAN = 1, FRAG_IPV6 = 2, ND_DONE = 0, ND_TODO = 1, ND_SENT = 2, }; struct lowpan_mesh_hdr { uint8_t dispatch; // dispatch and flags // address length depends on flags in dispatch }; struct lowpan_broadcast_hdr { uint8_t dispatch; uint8_t seq_no; // sequence number }; struct lowpan_frag_hdr { union { uint8_t dispatch; uint16_t dgram_size; uint8_t dgram_size8[2]; }; uint16_t dgram_tag; }; /* * Definition for internet protocol version 6. * RFC 2460 */ struct ip6_hdr { union { uint8_t vtc; /* 4 bits version, 8 bits class label*/ uint32_t flow; /* 20 bits flow label at the end */ }; uint16_t plen; /* payload length */ uint8_t nxt_hdr; /* next header */ uint8_t hlim; /* hop limit */ ip6_addr_t src_addr; /* source address */ ip6_addr_t dst_addr; /* destination address */ } /* __attribute__((packed))*/; #define IPV6_VERSION 0x60 #define IPV6_VERSION_MASK 0xf0 /* * Extension Headers */ struct ip6_ext { uint8_t ip6e_nxt; uint8_t ip6e_len; }; struct icmp6_hdr { uint8_t type; /* type field */ uint8_t code; /* code field */ uint16_t cksum; /* checksum field */ }; enum { ICMP_TYPE_ECHO_DEST_UNREACH = 1, ICMP_TYPE_ECHO_PKT_TOO_BIG = 129, ICMP_TYPE_ECHO_TIME_EXCEEDED = 129, ICMP_TYPE_ECHO_PARAM_PROBLEM = 129, ICMP_TYPE_ECHO_REQUEST = 128, ICMP_TYPE_ECHO_REPLY = 129, ICMP_TYPE_NEIGHBOR_SOL = 135, ICMP_TYPE_NEIGHBOR_ADV = 136, ICMP_NEIGHBOR_HOPLIMIT = 255 }; /* * Udp protocol header. * Per RFC 768, September, 1981. */ struct udp_hdr { uint16_t srcport; /* source port */ uint16_t dstport; /* destination port */ uint16_t len; /* udp length */ uint16_t chksum; /* udp checksum */ }; enum { //NEXT_HEADER_ICMP = 1, NEXT_HEADER_TCP = 6, NEXT_HEADER_UDP = 17, NEXT_HEADER_ICMP6 = 58 }; struct udp_conn { ip6_addr_t ripaddr; /* IP address of the remote peer. */ uint16_t lport; /* local port number (network byte order) */ uint16_t rport; /* remote port number (network byte order) */ }; /* // from uip-1.0/uip/uip-neighbor.c */ /* #define NEIGHBOR_MAX_TIME 128 */ /* #ifndef NEIGHBOR_ENTRIES */ /* #define NEIGHBOR_ENTRIES 8 */ /* #endif */ /* struct neighbor_entry { */ /* ip6_addr_t ip_addr; */ /* struct hw_addr hw_addr; */ /* uint8_t time; */ /* }; */ /* struct neighbor_entry neighbor_entries[NEIGHBOR_ENTRIES]; */ #endif /* __IP_INTERNAL_H__ */ tinyos-2.1.2+dfsg/tos/lib/net/6lowpan/README000066400000000000000000000075441207233610700204020ustar00rootroot00000000000000 A 6lowpan implementation for TinyOS 2.x This is a 6lowpan implementation for TinyOS 2.x. Mesh Addressing and Broadcast headers are parsed, but no mesh-networking/multi-hopping is implemented. 6lowpan fragmentation and fragment reassembly is fully supported. The 6lowpan-specified HC1 compression of the IPv6 header and the HC_UDP compression of the UDP header are supported as well as handling of the uncompressed headers. The implementation can respond to ICMP echo requests and handles communication over the UDP protocol. It has been tested on the TelosB and MicaZ hardware platforms. In addition a 6lowpan-translating daemon has been implemented to allow a linux PC to use a mote as an 802.15.4 interface. Shortcomings and missing features: * 6lowpan payload is sent as Active Message payload. This means that the 802.15.4 payload is prefixed with the 1-byte AM Type field. * non-zero Traffic Class and Flow Label are not supported by the current HC1 implementation * UDP port numbers compression is not supported and port numbers are always sent in full by the current HC_UDP compression * Neighbor Discovery has not been implemented and link local broadcasts are used instead. * Not all fragments of a datagram seem to be always received by the mote. A workaround is to add a usleep(10000) before sending subsequent fragments in the serial_tun daemon on the PC. * The mspgcc compiler generates broken code using 16-bit values not aligned at 16-bit boundaries. See http://www.nabble.com/msp430-gcc-generating-unaligned-access.-t2261862.html and page 25 in http://www.eecs.harvard.edu/~konrad/projects/motetrack/ mspgcc-manual-20031127.pdf for details. This seems to only happen with packed structs, where some elements cannot be aligned. For example, a struct with an 8-bit, 16-bit, 8-bit and 16-bit value in the given order. As the struct is packed, one of the 16-bit values can be aligned at a 16-bit boundary. The current workaround is to force 8-bit operations for cases where this can happen. This is done by the set_16t(), get_16t() functions. In cases where unaligned accesses could happen, these functions have to be used. More details can be found in http://www.inf.ethz.ch/personal/mharvan/docs/msc-thesis.pdf or by reading the source code. USAGE - MOTE The 6lowpan/IPv6 stack is implemented in the IPP module. Applications should use the IPC component which takes care of wiring the necessary components. The stack offers the UDPClient interface to application wishing to exchange UDP datagrams. Replying to ICMP echo requests is done by the 6lowpan stack. The stack support two IPv6 addresses: * a global address * a link-local address The link-local address is assigned using an interface identifier computed from the Active Message address of the mote. This is almost like the stateless autoconfiguration, but Duplicate Address Detection or Router Solicitations are not implemented. The global address can be set manually with IPC.setAddress(). Alternatively, only the prefix of the global address can be set with IPC.setAddressAutoconf() and the suffix will be generated from the Active Message address of the mote. A sample application using the 6lowpan stack is in apps/6lowpancli. USAGE - PC To interact with a 6lowpan mote from a PC, a mote flashed with the BaseStation application (apps/BaseStation) has to be attached to the PC. Note that the application has to be built with CFLAGS += -D'TOSH_DATA_LENGTH=102'. Furthermore, the serial_tun daemon (support/sdk/c/6lowpan/serial_tun/) has to run on the PC. Afterwards, ping6 and nc6 should work for talking to the motes. Debugging output with printf over USB can be enabled with CFLAGS="-D'ENABLE_PRINTF_DEBUG=1' To minimize memory usage, i.e. disable everything (at the moment only the UDP cli) to determine minimum RAM/ROM requirements, use CFLAGS="-D'MINIMIZE_MEMORY=1'tinyos-2.1.2+dfsg/tos/lib/net/6lowpan/UDPClient.nc000066400000000000000000000115721207233610700216270ustar00rootroot00000000000000/* * Copyright (c) 2007 Matus Harvan * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * This file is based on Andrew Christian's UDPClient interface from * the uIP port to TinyOS 1.x, which is distributed under the * following licence: * * Copyright (c) 2005 Hewlett-Packard Company * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of the Hewlett-Packard Company nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Parameterized interface for creating a UDP client or server */ #include "IP.h" interface UDPClient { /** * 'Listening' to a socket binds the local port to a fixed number and allows * the socket to receive packets. If you call send or sendto on an unbound * socket, a dynamic local port is assigned. Pass 0 to unbind the port. */ command error_t listen( uint16_t port ); // Start listening to a port /** * 'Connecting' a UDP socket fixes the remote address and port. Once fixed, * you can send datagrams with the 'send' command. You can un-fix the socket * by passing NULL as the argument. */ command error_t connect(const ip6_addr_t *addr, const uint16_t port); /** * Send a datagram to a remote host. Call 'connect' on a socket before * calling 'send'. If a local port has not yet been assigned, a dynamic * one will be assigned by these commands. Both commands are asynchronous * and will generate the 'sendDone' event once the datagram has been sent. */ command error_t sendTo(const ip6_addr_t *addr, uint16_t port, const uint8_t *buf, uint16_t len ); command error_t send(const uint8_t *buf, uint16_t len ); /** * The previous send or sendTo command has completed. */ event void sendDone(error_t result, void* buf); /** * A datagram has been received. Datagrams are only received on sockets * that have had 'listen' called to assign a local port, or have used * the 'send' or 'sendTo' command. */ event void receive(const ip6_addr_t *addr, uint16_t port, uint8_t *buf, uint16_t len ); } tinyos-2.1.2+dfsg/tos/lib/net/CollectionDebug.nc000066400000000000000000000070701207233610700215120ustar00rootroot00000000000000/* $Id: CollectionDebug.nc,v 1.5 2010-06-29 22:07:47 scipio Exp $*/ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * The CollectionDebug is an interface for sending debugging events to * a logging infrastructure. An implementer can choose to send the event * information to different destinations. Primary examples can include: *

        *
      • logging to the UART, in case of a testbed of network-connected * nodes; *
      • logging to flash, if the logs are to be retrieved later *
      • logging to the standard output, in the case of TOSSIM. *
      * * The interface does not specify in what format the log is to be produced, * or if other information, like timestamps, should be added, and this is * up to the implementer. * * Some commands are generic, like Event, EventSimple, and EventDbg, while others * are for more specific events related to collection, like EventRoute and EventMsg. * * @author Rodrigo Fonseca * @author Kyle Jamieson * @date $Date: 2010-06-29 22:07:47 $ */ interface CollectionDebug { /* Log the occurrence of an event of type type */ command error_t logEvent(uint8_t type); /* Log the occurrence of an event and a single parameter */ command error_t logEventSimple(uint8_t type, uint16_t arg); /* Log the occurrence of an event and 3 16bit parameters */ command error_t logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3); /* Log the occurrence of an event related to forwarding a message. * This is intended to allow following the same message as it goes from one * hop to the next */ command error_t logEventMsg(uint8_t type, uint16_t msg, am_addr_t origin, am_addr_t node); /* Log the occurrence of an event related to a route update message, * such as a node receiving a route, updating its own route information, * or looking at a particular entry in its routing table. */ command error_t logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t metric); } tinyos-2.1.2+dfsg/tos/lib/net/CollectionDebugMsg.h000066400000000000000000000046571207233610700220200ustar00rootroot00000000000000#ifndef _COLLECTION_UART_MSG #define _COLLECTION_UART_MSG #include "AM.h" //Comment format -> :meaning:args enum { NET_C_DEBUG_STARTED = 0xDE, NET_C_FE_MSG_POOL_EMPTY = 0x10, //::no args NET_C_FE_SEND_QUEUE_FULL = 0x11, //::no args NET_C_FE_NO_ROUTE = 0x12, //::no args NET_C_FE_SUBSEND_OFF = 0x13, NET_C_FE_SUBSEND_BUSY = 0x14, NET_C_FE_BAD_SENDDONE = 0x15, NET_C_FE_QENTRY_POOL_EMPTY = 0x16, NET_C_FE_SUBSEND_SIZE = 0x17, NET_C_FE_LOOP_DETECTED = 0x18, NET_C_FE_SEND_BUSY = 0x19, NET_C_FE_SENDQUEUE_EMPTY = 0x50, NET_C_FE_PUT_MSGPOOL_ERR = 0x51, NET_C_FE_PUT_QEPOOL_ERR = 0x52, NET_C_FE_GET_MSGPOOL_ERR = 0x53, NET_C_FE_GET_QEPOOL_ERR = 0x54, NET_C_FE_SENT_MSG = 0x20, //:app. send :msg uid, origin, next_hop NET_C_FE_RCV_MSG = 0x21, //:next hop receive:msg uid, origin, last_hop NET_C_FE_FWD_MSG = 0x22, //:fwd msg :msg uid, origin, next_hop NET_C_FE_DST_MSG = 0x23, //:base app. recv :msg_uid, origin, last_hop NET_C_FE_SENDDONE_FAIL = 0x24, NET_C_FE_SENDDONE_WAITACK = 0x25, NET_C_FE_SENDDONE_FAIL_ACK_SEND = 0x26, NET_C_FE_SENDDONE_FAIL_ACK_FWD = 0x27, NET_C_FE_DUPLICATE_CACHE = 0x28, //dropped duplicate packet seen in cache NET_C_FE_DUPLICATE_QUEUE = 0x29, //dropped duplicate packet seen in queue NET_C_FE_DUPLICATE_CACHE_AT_SEND = 0x2A, //dropped duplicate packet seen in cache NET_C_TREE_NO_ROUTE = 0x30, //: :no args NET_C_TREE_NEW_PARENT = 0x31, //: :parent_id, hopcount, metric NET_C_TREE_ROUTE_INFO = 0x32, //:periodic:parent_id, hopcount, metric NET_C_TREE_SENT_BEACON = 0x33, NET_C_TREE_RCV_BEACON = 0x34, NET_C_DBG_1 = 0x40, //:any :uint16_t a NET_C_DBG_2 = 0x41, //:any :uint16_t a, b, c NET_C_DBG_3 = 0x42, //:any :uint16_t a, b, c }; typedef nx_struct CollectionDebugMsg { nx_uint8_t type; nx_union { nx_uint16_t arg; nx_struct { nx_uint16_t msg_uid; nx_am_addr_t origin; nx_am_addr_t other_node; } msg; nx_struct { nx_am_addr_t parent; nx_uint8_t hopcount; nx_uint16_t metric; } route_info; nx_struct { nx_uint16_t a; nx_uint16_t b; nx_uint16_t c; } dbg; } data; nx_uint16_t seqno; } CollectionDebugMsg; #endif tinyos-2.1.2+dfsg/tos/lib/net/CollectionId.nc000066400000000000000000000037121207233610700210170ustar00rootroot00000000000000/* $Id: CollectionId.nc,v 1.4 2006-12-12 18:23:28 vlahan Exp $ */ /* * Copyright (c) 2006 Massachusetts Institute of Technology (MIT). * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Massachusetts Institute of Technology nor * the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * MASSACHUSETTS INSITIUTE OF TECHNOLOGY OR ITS CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * Interface for fetching the collection ID associated with a * collection sender instance. * * @author Kyle Jamieson * @date $Date: 2006-12-12 18:23:28 $ */ #include "Collection.h" interface CollectionId { command collection_id_t fetch(); } tinyos-2.1.2+dfsg/tos/lib/net/CollectionIdP.nc000066400000000000000000000041131207233610700211330ustar00rootroot00000000000000/* $Id: CollectionIdP.nc,v 1.4 2006-12-12 18:23:28 vlahan Exp $ */ /* * Copyright (c) 2006 Massachusetts Institute of Technology (MIT). * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Massachusetts Institute of Technology nor * the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * MASSACHUSETTS INSITIUTE OF TECHNOLOGY OR ITS CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * Interface for fetching the collection ID associated with a * collection sender instance. * * @author Kyle Jamieson * @date $Date: 2006-12-12 18:23:28 $ */ #include "Collection.h" generic module CollectionIdP(collection_id_t collectid) { provides interface CollectionId; } implementation { command collection_id_t CollectionId.fetch() { return collectid; } } tinyos-2.1.2+dfsg/tos/lib/net/CollectionPacket.nc000066400000000000000000000042021207233610700216650ustar00rootroot00000000000000/* $Id: CollectionPacket.nc,v 1.4 2006-12-12 18:23:28 vlahan Exp $ */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Philip Levis * @author Kyle Jamieson * @date $Date: 2006-12-12 18:23:28 $ */ #include #include interface CollectionPacket { command am_addr_t getOrigin(message_t* msg); command void setOrigin(message_t* msg, am_addr_t addr); command collection_id_t getType(message_t* msg); command void setType(message_t* msg, collection_id_t id); command uint8_t getSequenceNumber(message_t* msg); command void setSequenceNumber(message_t* msg, uint8_t seqno); } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/000077500000000000000000000000001207233610700173275ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/AutoStarterC.nc000066400000000000000000000035341207233610700222360ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ configuration AutoStarterC { uses interface SplitControl; } implementation { components MainC, AutoStarterP; SplitControl = AutoStarterP; AutoStarterP.Boot -> MainC; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/AutoStarterP.nc000066400000000000000000000037041207233610700222520ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ module AutoStarterP { uses { interface Boot; interface SplitControl; } } implementation { event void Boot.booted() { call SplitControl.start(); } event void SplitControl.startDone(error_t error) { } event void SplitControl.stopDone(error_t error) { } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/BitVecUtils.h000066400000000000000000000041221207233610700216740ustar00rootroot00000000000000/* * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Provides generic methods for manipulating bit vectors. * * @author Jonathan Hui */ #ifndef __BITVEC_UTILS_H__ #define __BITVEC_UTILS_H__ #define BIT_GET(x, i) ((x) & (1 << (i))) #define BIT_SET(x, i) ((x) | (1 << (i))) #define BIT_CLEAR(x, i) ((x) & ~(1 << (i))) #define BITVEC_GET(x, i) (BIT_GET((x)[(i)/8], (i)%8)) #define BITVEC_SET(x, i) ((x)[(i)/8] = BIT_SET((x)[(i)/8], (i)%8)) #define BITVEC_CLEAR(x, i) ((x)[(i)/8] = BIT_CLEAR((x)[(i)/8], (i)%8)) #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/BitVecUtils.nc000066400000000000000000000057171207233610700220600ustar00rootroot00000000000000/* * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Provides generic methods for manipulating bit vectors. * * @author Jonathan Hui */ interface BitVecUtils { /** * Locates the index of the first '1' bit in a bit vector. * * @param result the location of the '1' bit * @param fromIndex the index to start search for '1' bit * @param bitVec the bit vector * @param length the length of the bit vector in bits * @return SUCCESS if a '1' bit was found; * FAIL otherwise. */ command error_t indexOf(uint16_t* pResult, uint16_t fromIndex, uint8_t* bitVec, uint16_t length); /** * Counts the number of '1' bits in a bit vector. * * @param result the number of '1' bits * @param bitVec the bit vector * @param length the length of the bit vector in bits * @return SUCCESS if the operation completed successfully; * FAIL otherwise. */ command error_t countOnes(uint16_t* pResult, uint8_t* bitVec, uint16_t length); /** * Generates an ASCII representation of the bit vector. * * @param buf the character array to place the ASCII string * @param bitVec the bit vector * @param length the length of the bit vector in bits */ command void printBitVec(char* buf, uint8_t* bitVec, uint16_t length); } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/BitVecUtilsC.nc000066400000000000000000000053331207233610700221550ustar00rootroot00000000000000/* * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Provides generic methods for manipulating bit vectors. * * @author Jonathan Hui */ #include "BitVecUtils.h" module BitVecUtilsC { provides interface BitVecUtils; } implementation { command error_t BitVecUtils.indexOf(uint16_t* pResult, uint16_t fromIndex, uint8_t* bitVec, uint16_t length) { uint16_t i = fromIndex; if (length == 0) return FAIL; do { if (BITVEC_GET(bitVec, i)) { *pResult = i; return SUCCESS; } i = (i+1) % length; } while (i != fromIndex); return FAIL; } command error_t BitVecUtils.countOnes(uint16_t* pResult, uint8_t* bitVec, uint16_t length) { int count = 0; int i; for ( i = 0; i < length; i++ ) { if (BITVEC_GET(bitVec, i)) count++; } *pResult = count; return SUCCESS; } command void BitVecUtils.printBitVec(char* buf, uint8_t* bitVec, uint16_t length) { #ifdef PLATFORM_PC uint16_t i; dbg(DBG_TEMP, ""); for ( i = 0; i < length; i++ ) { sprintf(buf++, "%d", !!BITVEC_GET(bitVec, i)); } #endif } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/BlockStorageManager/000077500000000000000000000000001207233610700232015ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/BlockStorageManager/BlockReaderC.nc000066400000000000000000000042571207233610700260130ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ #include "BlockStorageManager.h" #include "Storage.h" generic configuration BlockReaderC(volume_id_t id) { provides { interface BlockRead; interface Resource; } } implementation { enum { CLIENT_ID = unique(UQ_BSTORAGEM_CLIENT) }; components new VolumeIdC(id); components BlockStorageManagerC; components new BlockStorageLockClientC(); BlockRead = BlockStorageManagerC.BlockRead[CLIENT_ID]; Resource = BlockStorageLockClientC; BlockStorageManagerC.VolumeId[CLIENT_ID] -> VolumeIdC; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/BlockStorageManager/BlockStorageLockC.nc000066400000000000000000000036501207233610700270220ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ configuration BlockStorageLockC { provides { interface Resource[uint8_t client]; interface ArbiterInfo; } } implementation { components new SimpleFcfsArbiterC(UQ_BSTORAGEL_CLIENT) as Arbiter; Resource = Arbiter; ArbiterInfo = Arbiter; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/BlockStorageManager/BlockStorageLockClientC.nc000066400000000000000000000036361207233610700301650ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ generic configuration BlockStorageLockClientC() { provides interface Resource; } implementation { enum { CLIENT_ID = unique(UQ_BSTORAGEL_CLIENT) }; components BlockStorageLockC; Resource = BlockStorageLockC.Resource[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/BlockStorageManager/BlockStorageManager.h000066400000000000000000000035401207233610700272260ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ #ifndef BLOCK_STORAGE_MANAGER_H #define BLOCK_STORAGE_MANAGER_H #define UQ_BSTORAGEM_CLIENT "BlockStorageManager.client" #define UQ_BSTORAGEL_CLIENT "BlockStorageLock.client" #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/BlockStorageManager/BlockStorageManagerC.nc000066400000000000000000000072511207233610700275050ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ #include "BlockStorageManager.h" configuration BlockStorageManagerC { provides { interface BlockRead[uint8_t client]; interface BlockWrite[uint8_t client]; interface StorageMap[uint8_t volume_id]; } uses interface VolumeId[uint8_t client]; } implementation { enum { NUM_CLIENTS = uniqueCount(UQ_BSTORAGEM_CLIENT) }; components new BlockStorageManagerP(NUM_CLIENTS); BlockRead = BlockStorageManagerP; BlockWrite = BlockStorageManagerP; VolumeId = BlockStorageManagerP; StorageMap = BlockStorageManagerP; components new BlockStorageC(VOLUME_GOLDENIMAGE) as BlockStorageC_Golden; components new BlockStorageC(VOLUME_DELUGE1) as BlockStorageC_1; components new BlockStorageC(VOLUME_DELUGE2) as BlockStorageC_2; components new BlockStorageC(VOLUME_DELUGE3) as BlockStorageC_3; BlockStorageManagerP.SubBlockRead[VOLUME_GOLDENIMAGE] -> BlockStorageC_Golden; BlockStorageManagerP.SubBlockRead[VOLUME_DELUGE1] -> BlockStorageC_1; BlockStorageManagerP.SubBlockRead[VOLUME_DELUGE2] -> BlockStorageC_2; BlockStorageManagerP.SubBlockRead[VOLUME_DELUGE3] -> BlockStorageC_3; BlockStorageManagerP.SubBlockWrite[VOLUME_GOLDENIMAGE] -> BlockStorageC_Golden; BlockStorageManagerP.SubBlockWrite[VOLUME_DELUGE1] -> BlockStorageC_1; BlockStorageManagerP.SubBlockWrite[VOLUME_DELUGE2] -> BlockStorageC_2; BlockStorageManagerP.SubBlockWrite[VOLUME_DELUGE3] -> BlockStorageC_3; #if defined(PLATFORM_TELOSB) BlockStorageManagerP.SubStorageMap[VOLUME_GOLDENIMAGE] -> BlockStorageC_Golden; BlockStorageManagerP.SubStorageMap[VOLUME_DELUGE1] -> BlockStorageC_1; BlockStorageManagerP.SubStorageMap[VOLUME_DELUGE2] -> BlockStorageC_2; BlockStorageManagerP.SubStorageMap[VOLUME_DELUGE3] -> BlockStorageC_3; #elif defined(PLATFORM_MICAZ) || defined(PLATFORM_IRIS) || defined(PLATFORM_EPIC) || defined(PLATFORM_MULLE) || defined(PLATFORM_TINYNODE) components At45dbStorageManagerC; BlockStorageManagerP.At45dbVolume -> At45dbStorageManagerC; #endif } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/BlockStorageManager/BlockStorageManagerP.nc000066400000000000000000000167311207233610700275250ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ generic module BlockStorageManagerP(uint8_t clients) { provides { interface BlockRead[uint8_t client]; interface BlockWrite[uint8_t client]; interface StorageMap[uint8_t volume_id]; } uses { interface BlockRead as SubBlockRead[volume_id_t volume_id]; interface BlockWrite as SubBlockWrite[volume_id_t volume_id]; interface VolumeId[uint8_t client]; #if defined(PLATFORM_TELOSB) interface StorageMap as SubStorageMap[volume_id_t volume_id]; #elif defined(PLATFORM_MICAZ) || defined(PLATFORM_IRIS) || defined(PLATFORM_EPIC) || defined(PLATFORM_MULLE) || defined(PLATFORM_TINYNODE) interface At45dbVolume[volume_id_t volume_id]; #endif } } implementation { enum { S_READY, S_BUSY }; uint8_t state = S_READY; uint8_t current_client; /* BlockRead **************************/ command error_t BlockRead.read[uint8_t client](storage_addr_t addr, void* buf, storage_len_t len) { error_t error; if (state != S_READY) { return EBUSY; } error = call SubBlockRead.read[call VolumeId.get[client]()](addr, buf, len); if (error == SUCCESS) { state = S_BUSY; current_client = client; return SUCCESS; } return error; } command error_t BlockRead.computeCrc[uint8_t client](storage_addr_t addr, storage_len_t len, uint16_t crc) { error_t error; if (state != S_READY) { return EBUSY; } error = call SubBlockRead.computeCrc[call VolumeId.get[client]()](addr, len, crc); if (error == SUCCESS) { state = S_BUSY; current_client = client; return SUCCESS; } return error; } command storage_len_t BlockRead.getSize[uint8_t client]() { return call SubBlockRead.getSize[client](); } event void SubBlockRead.readDone[volume_id_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { state = S_READY; signal BlockRead.readDone[current_client](addr, buf, len, error); } event void SubBlockRead.computeCrcDone[volume_id_t volume_id](storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) { state = S_READY; signal BlockRead.computeCrcDone[current_client](addr, len, crc, error); } default command error_t SubBlockRead.read[uint8_t client](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t SubBlockRead.computeCrc[uint8_t client](storage_addr_t addr, storage_len_t len, uint16_t crc) { return FAIL; } default event void BlockRead.readDone[volume_id_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} default event void BlockRead.computeCrcDone[volume_id_t volume_id](storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) {} /* BlockWrite **************************/ command error_t BlockWrite.write[uint8_t client](storage_addr_t addr, void* buf, storage_len_t len) { error_t error; if (state != S_READY) { return EBUSY; } error = call SubBlockWrite.write[call VolumeId.get[client]()](addr, buf, len); if (error == SUCCESS) { state = S_BUSY; current_client = client; return SUCCESS; } return error; } command error_t BlockWrite.erase[uint8_t client]() { error_t error; if (state != S_READY) { return EBUSY; } error = call SubBlockWrite.erase[call VolumeId.get[client]()](); if (error == SUCCESS) { state = S_BUSY; current_client = client; return SUCCESS; } return error; } command error_t BlockWrite.sync[uint8_t client]() { error_t error; if (state != S_READY) { return EBUSY; } error = call SubBlockWrite.sync[call VolumeId.get[client]()](); if (error == SUCCESS) { state = S_BUSY; return SUCCESS; } return error; } event void SubBlockWrite.writeDone[volume_id_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { state = S_READY; signal BlockWrite.writeDone[current_client](addr, buf, len, error); } event void SubBlockWrite.eraseDone[volume_id_t volume_id](error_t error) { state = S_READY; signal BlockWrite.eraseDone[current_client](error); } event void SubBlockWrite.syncDone[volume_id_t volume_id](error_t error) { state = S_READY; signal BlockWrite.syncDone[current_client](error); } command storage_addr_t StorageMap.getPhysicalAddress[uint8_t volume_id](storage_addr_t addr) { storage_addr_t p_addr = 0xFFFFFFFF; #if defined(PLATFORM_TELOSB) p_addr = call SubStorageMap.getPhysicalAddress[volume_id](addr); #elif defined(PLATFORM_MICAZ) || defined(PLATFORM_IRIS) || defined(PLATFORM_EPIC) || defined(PLATFORM_MULLE) || defined(PLATFORM_TINYNODE) at45page_t page = call At45dbVolume.remap[volume_id]((addr >> AT45_PAGE_SIZE_LOG2)); at45pageoffset_t offset = addr & ((1 << AT45_PAGE_SIZE_LOG2) - 1); p_addr = page; p_addr = p_addr << AT45_PAGE_SIZE_LOG2; p_addr += offset; #endif return p_addr; } #if defined(PLATFORM_TELOSB) default command storage_addr_t SubStorageMap.getPhysicalAddress[uint8_t volume_id](storage_addr_t addr) { return 0xffffffff; } #endif default command error_t SubBlockWrite.write[uint8_t client](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t SubBlockWrite.erase[uint8_t client]() { return FAIL; } default command error_t SubBlockWrite.sync[uint8_t client]() { return FAIL; } default event void BlockWrite.writeDone[volume_id_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} default event void BlockWrite.eraseDone[volume_id_t volume_id](error_t error) {} default event void BlockWrite.syncDone[volume_id_t volume_id](error_t error) {} default command volume_id_t VolumeId.get[uint8_t client]() { return 0xFF; // This is an invalid volume at least for STM25P. } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/BlockStorageManager/BlockWriterC.nc000066400000000000000000000042621207233610700260610ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ #include "BlockStorageManager.h" #include "Storage.h" generic configuration BlockWriterC(volume_id_t id) { provides { interface BlockWrite; interface Resource; } } implementation { enum { CLIENT_ID = unique(UQ_BSTORAGEM_CLIENT) }; components new VolumeIdC(id); components BlockStorageManagerC; components new BlockStorageLockClientC(); BlockWrite = BlockStorageManagerC.BlockWrite[CLIENT_ID]; Resource = BlockStorageLockClientC; BlockStorageManagerC.VolumeId[CLIENT_ID] -> VolumeIdC; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/BlockStorageManager/VolumeId.nc000066400000000000000000000033341207233610700252520ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ interface VolumeId { command volume_id_t get(); } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/BlockStorageManager/VolumeIdC.nc000066400000000000000000000035041207233610700253540ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ generic module VolumeIdC(volume_id_t id) { provides interface VolumeId; } implementation { command volume_id_t VolumeId.get() { return id; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/Deluge.h000066400000000000000000000060611207233610700207100ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #ifndef __DELUGE_H__ #define __DELUGE_H__ typedef nx_struct DelugeIdent { nx_uint32_t uidhash; // unique id of the image nx_uint32_t size; // size of the whole image (ident + CRCs + binary) nx_uint8_t numPgs; // number of pages of complete image nx_uint8_t reserved; nx_uint16_t crc; // crc over the above 4 fields nx_uint8_t appname[16]; nx_uint8_t username[16]; nx_uint8_t hostname[16]; nx_uint8_t platform[16]; nx_uint32_t timestamp; nx_uint32_t userhash; } DelugeIdent; enum { DELUGE_INVALID_UID = 0xffffffff, DELUGE_NUM_VOLUMES = 4, DELUGE_KEY = 0xDE00, DELUGE_AM_FLASH_VOL_MANAGER = 0x53, DELUGE_AM_DELUGE_MANAGER = 0x54, }; enum { DELUGE_CMD_STOP = 1, DELUGE_CMD_LOCAL_STOP = 2, DELUGE_CMD_ONLY_DISSEMINATE = 3, DELUGE_CMD_DISSEMINATE_AND_REPROGRAM = 4, DELUGE_CMD_REPROGRAM = 5, // Reprogram the local mote DELUGE_CMD_REBOOT = 6, // Reboot the local mode }; #define UQ_DELUGE_METADATA "DelugeMetadata.client" #define UQ_DELUGE_VOLUME_MANAGER "DelugeVolumeManager.client" typedef nx_struct DelugeCmd { nx_uint8_t type; nx_uint32_t uidhash; // unique id of image nx_uint8_t imgNum; // image number nx_uint32_t size; // size of the image } DelugeCmd; typedef struct BootArgs { uint16_t address; uint32_t imageAddr; uint8_t gestureCount; bool noReprogram; } BootArgs; #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugeC.nc000066400000000000000000000076431207233610700211730ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #include "Deluge.h" #include "StorageVolumes.h" configuration DelugeC { uses interface Leds; } implementation { components ObjectTransferC; components new BlockReaderC(VOLUME_DELUGE1) as BlockReaderDeluge1; components new BlockReaderC(VOLUME_DELUGE2) as BlockReaderDeluge2; components new BlockReaderC(VOLUME_DELUGE3) as BlockReaderDeluge3; components new BlockWriterC(VOLUME_DELUGE1) as BlockWriterDeluge1; components new BlockWriterC(VOLUME_DELUGE2) as BlockWriterDeluge2; components new BlockWriterC(VOLUME_DELUGE3) as BlockWriterDeluge3; ObjectTransferC.BlockRead[VOLUME_DELUGE1] -> BlockReaderDeluge1; ObjectTransferC.BlockRead[VOLUME_DELUGE2] -> BlockReaderDeluge2; ObjectTransferC.BlockRead[VOLUME_DELUGE3] -> BlockReaderDeluge3; ObjectTransferC.BlockWrite[VOLUME_DELUGE1] -> BlockWriterDeluge1; ObjectTransferC.BlockWrite[VOLUME_DELUGE2] -> BlockWriterDeluge2; ObjectTransferC.BlockWrite[VOLUME_DELUGE3] -> BlockWriterDeluge3; ObjectTransferC.Leds = Leds; components new DisseminatorC(DelugeCmd, DELUGE_KEY); components DisseminationC; components ActiveMessageC; components NetProgC, DelugeP; components new TimerMilliC() as Timer; components BlockStorageManagerC; components DelugeMetadataC; components new DelugeMetadataClientC(); components new DelugeVolumeManagerClientC(); components new BlockStorageLockClientC(); components MainC; DelugeP.Boot -> MainC; DelugeP.Leds = Leds; #ifndef DELUGE_BASESTATION DelugeP.DisseminationValue -> DisseminatorC; #endif DelugeP.DisseminationStdControl -> DisseminationC; DelugeP.ObjectTransfer -> ObjectTransferC; DelugeP.NetProg -> NetProgC; DelugeP.RadioSplitControl -> ActiveMessageC; DelugeP.StorageMap -> BlockStorageManagerC; DelugeP.DelugeMetadata -> DelugeMetadataClientC; DelugeP.storageReady <- DelugeMetadataC; DelugeP.DelugeVolumeManager -> DelugeVolumeManagerClientC; DelugeP.Resource -> BlockStorageLockClientC; #if defined(DELUGE_BASESTATION) || defined(DELUGE_LIGHT_BASESTATION) components SerialStarterC; components new FlashVolumeManagerC(DELUGE_AM_FLASH_VOL_MANAGER); #endif #ifdef DELUGE_BASESTATION components new DelugeManagerC(DELUGE_AM_DELUGE_MANAGER); DelugeManagerC.DisseminationUpdate -> DisseminatorC; #endif } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugeManagerC.nc000066400000000000000000000055101207233610700224550ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ #include "StorageVolumes.h" generic configuration DelugeManagerC(am_id_t AMId) { uses interface DisseminationUpdate; } implementation { components new SerialAMSenderC(AMId); components new SerialAMReceiverC(AMId); components new TimerMilliC() as Timer; components NoLedsC, LedsC; components new DelugeManagerP(); components NetProgC; components BlockStorageManagerC; components ObjectTransferC; components new DelugeMetadataClientC(); components new DelugeVolumeManagerClientC(); components new BlockStorageLockClientC(); DelugeManagerP.DelayTimer -> Timer; DelugeManagerP.SerialAMSender -> SerialAMSenderC; DelugeManagerP.SerialAMReceiver -> SerialAMReceiverC; DelugeManagerP.Leds -> LedsC; DelugeManagerP.DisseminationUpdate = DisseminationUpdate; DelugeManagerP.NetProg -> NetProgC; DelugeManagerP.ObjectTransfer -> ObjectTransferC; DelugeManagerP.StorageMap -> BlockStorageManagerC; DelugeManagerP.DelugeMetadata -> DelugeMetadataClientC; DelugeManagerP.DelugeVolumeManager -> DelugeVolumeManagerClientC; DelugeManagerP.Resource -> BlockStorageLockClientC; components DelugeP; DelugeManagerP.stop -> DelugeP; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugeManagerP.nc000066400000000000000000000116561207233610700225020ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ #include "imgNum2volumeId.h" generic module DelugeManagerP() { uses { interface DisseminationUpdate; interface AMSend as SerialAMSender; interface Receive as SerialAMReceiver; interface Timer as DelayTimer; interface NetProg; interface Leds; interface StorageMap[uint8_t volumeId]; interface DelugeMetadata; interface ObjectTransfer; interface DelugeVolumeManager; interface Resource; command void stop(); } } implementation { typedef nx_struct SerialReqPacket { nx_uint8_t cmd; nx_uint8_t imgNum; } SerialReqPacket; typedef nx_struct SerialReplyPacket { nx_uint8_t error; } SerialReplyPacket; message_t serialMsg; DelugeCmd delugeCmd; void sendReply(error_t error) { uint8_t len = sizeof(SerialReplyPacket); SerialReplyPacket *reply = (SerialReplyPacket *)call SerialAMSender.getPayload(&serialMsg, len); if (reply == NULL) { return; } reply->error = error; call SerialAMSender.send(AM_BROADCAST_ADDR, &serialMsg, len); } event message_t* SerialAMReceiver.receive(message_t* msg, void* payload, uint8_t len) { SerialReqPacket *request = (SerialReqPacket *)payload; memset(&delugeCmd, 0, sizeof(DelugeCmd)); call stop(); delugeCmd.type = request->cmd; // Converts the image number that the user wants to the real image number request->imgNum = imgNum2volumeId(request->imgNum); switch (request->cmd) { case DELUGE_CMD_STOP: call DisseminationUpdate.change(&delugeCmd); case DELUGE_CMD_LOCAL_STOP: sendReply(SUCCESS); call Resource.release(); break; case DELUGE_CMD_ONLY_DISSEMINATE: case DELUGE_CMD_DISSEMINATE_AND_REPROGRAM: if (request->imgNum != NON_DELUGE_VOLUME && (call Resource.isOwner() || call Resource.immediateRequest() == SUCCESS)) { call DelugeMetadata.read(request->imgNum); } else { sendReply(FAIL); } break; case DELUGE_CMD_REPROGRAM: case DELUGE_CMD_REBOOT: if (request->imgNum == NON_DELUGE_VOLUME) { sendReply(FAIL); break; } delugeCmd.imgNum = request->imgNum; call DelayTimer.startOneShot(1024); sendReply(SUCCESS); break; } return msg; } event void DelayTimer.fired() { switch (delugeCmd.type) { case DELUGE_CMD_REPROGRAM: call NetProg.programImageAndReboot(call StorageMap.getPhysicalAddress[delugeCmd.imgNum](0)); break; case DELUGE_CMD_REBOOT: call NetProg.reboot(); break; } } event void DelugeMetadata.readDone(uint8_t imgNum, DelugeIdent* ident, error_t error) { delugeCmd.imgNum = imgNum; sendReply(error); if (error != SUCCESS) { return; } switch (delugeCmd.type) { case DELUGE_CMD_ONLY_DISSEMINATE: case DELUGE_CMD_DISSEMINATE_AND_REPROGRAM: delugeCmd.uidhash = ident->uidhash; delugeCmd.size = ident->size; call DisseminationUpdate.change(&delugeCmd); call ObjectTransfer.publish(delugeCmd.uidhash, delugeCmd.size, delugeCmd.imgNum); break; } } event void Resource.granted() {} event void ObjectTransfer.receiveDone(error_t error) {} event void SerialAMSender.sendDone(message_t* msg, error_t error) {} event void DelugeVolumeManager.eraseDone(uint8_t imgNum) {} } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugeMetadata.nc000066400000000000000000000006261207233610700225230ustar00rootroot00000000000000/** * An interface for obtaining the identification data of an * image. The pointer returned by readDone will be destroyed by the * next read. * * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ interface DelugeMetadata { command error_t read(uint8_t imgNum); event void readDone(uint8_t imgNum, DelugeIdent* ident, error_t error); } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugeMetadataC.nc000066400000000000000000000060671207233610700226330ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ configuration DelugeMetadataC { provides interface DelugeMetadata[uint8_t client]; uses event void storageReady(); } implementation { components MainC; components DelugeMetadataP; DelugeMetadata = DelugeMetadataP; storageReady = DelugeMetadataP; DelugeMetadataP.Boot -> MainC; components new BlockReaderC(VOLUME_GOLDENIMAGE) as BlockReaderGoldenImage; components new BlockReaderC(VOLUME_DELUGE1) as BlockReaderDeluge1; components new BlockReaderC(VOLUME_DELUGE2) as BlockReaderDeluge2; components new BlockReaderC(VOLUME_DELUGE3) as BlockReaderDeluge3; DelugeMetadataP.BlockRead[VOLUME_GOLDENIMAGE] -> BlockReaderGoldenImage; DelugeMetadataP.BlockRead[VOLUME_DELUGE1] -> BlockReaderDeluge1; DelugeMetadataP.BlockRead[VOLUME_DELUGE2] -> BlockReaderDeluge2; DelugeMetadataP.BlockRead[VOLUME_DELUGE3] -> BlockReaderDeluge3; components new BlockWriterC(VOLUME_GOLDENIMAGE) as BlockWriterGoldenImage; components new BlockWriterC(VOLUME_DELUGE1) as BlockWriterDeluge1; components new BlockWriterC(VOLUME_DELUGE2) as BlockWriterDeluge2; components new BlockWriterC(VOLUME_DELUGE3) as BlockWriterDeluge3; DelugeMetadataP.BlockWrite[VOLUME_GOLDENIMAGE] -> BlockWriterGoldenImage; DelugeMetadataP.BlockWrite[VOLUME_DELUGE1] -> BlockWriterDeluge1; DelugeMetadataP.BlockWrite[VOLUME_DELUGE2] -> BlockWriterDeluge2; DelugeMetadataP.BlockWrite[VOLUME_DELUGE3] -> BlockWriterDeluge3; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugeMetadataClientC.nc000066400000000000000000000036511207233610700237660ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ generic configuration DelugeMetadataClientC() { provides interface DelugeMetadata; } implementation { enum { CLIENT_ID = unique(UQ_DELUGE_METADATA) }; components DelugeMetadataC; DelugeMetadata = DelugeMetadataC.DelugeMetadata[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugeMetadataP.nc000066400000000000000000000136421207233610700226450ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ #include "imgNum2volumeId.h" module DelugeMetadataP { provides interface DelugeMetadata[uint8_t client]; uses { interface Boot; interface BlockRead[uint8_t volumeId]; interface BlockWrite[uint8_t volumeId]; interface StorageMap[uint8_t volumeId]; event void storageReady(); } } implementation { enum { S_READ_IDENT, S_READ_CRC, S_CRC, S_READY, S_BUSY }; DelugeIdent ident; uint8_t state; uint8_t currentVolume; uint8_t currentImageIdx; uint8_t currentPage; nx_uint16_t currentCrc; uint8_t currentClient; void nextImage() { if (currentImageIdx < DELUGE_NUM_VOLUMES) { state = S_READ_IDENT; call BlockRead.read[currentVolume](0, &ident, sizeof(ident)); } else { signal storageReady(); state = S_READY; } } uint32_t calcCrcAddr() { return DELUGE_IDENT_SIZE + currentPage * sizeof(uint16_t); } uint32_t calcPageAddr() { return DELUGE_IDENT_SIZE + DELUGE_CRC_BLOCK_SIZE + currentPage * (uint32_t)DELUGE_BYTES_PER_PAGE; } event void Boot.booted() { // We are going to iterate over all the images and verify their // integrity. For each image we first read the ident to find the // number of pages and then iterate over all of them, compute the // CRC and check it against the corresponding value from the CRCs // block. state = S_READ_IDENT; currentImageIdx = 0; currentVolume = _imgNum2volumeId[currentImageIdx]; nextImage(); } command error_t DelugeMetadata.read[uint8_t client](uint8_t imgNum) { error_t error; if (state != S_READY) { return FAIL; } currentClient = client; error = call BlockRead.read[imgNum](0, &ident, sizeof(ident)); state = error == SUCCESS ? S_BUSY : state; return error; } event void BlockRead.readDone[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { switch (state) { case S_BUSY: state = S_READY; signal DelugeMetadata.readDone[currentClient](imgNum, buf, error); break; case S_READ_IDENT: if (error == SUCCESS) { if (ident.uidhash != DELUGE_INVALID_UID) { currentPage = 0; state = S_READ_CRC; call BlockRead.read[currentVolume](calcCrcAddr(), ¤tCrc, sizeof(currentCrc)); } else { currentImageIdx++; currentVolume = _imgNum2volumeId[currentImageIdx]; nextImage(); } } break; case S_READ_CRC: state = S_CRC; call BlockRead.computeCrc[currentVolume](calcPageAddr(), DELUGE_BYTES_PER_PAGE, 0); break; } } event void BlockRead.computeCrcDone[uint8_t imgNum](storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) { switch (state) { case S_CRC: if (crc != currentCrc) { // printf("%04x %04x\n", crc, currentCrc); // invalidate the image by erasing it call BlockWrite.erase[currentVolume](); } else { currentPage++; if (currentPage < ident.numPgs) { state = S_READ_CRC; call BlockRead.read[currentVolume](calcCrcAddr(), ¤tCrc, sizeof(currentCrc)); } else { currentImageIdx++; currentVolume = _imgNum2volumeId[currentImageIdx]; nextImage(); } } break; } } default command error_t BlockRead.read[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t BlockRead.computeCrc[uint8_t imgNum](storage_addr_t addr, storage_len_t len, uint16_t crc) { return FAIL; } event void BlockWrite.writeDone[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} event void BlockWrite.eraseDone[uint8_t imgNum](error_t error) { switch (state) { case S_READY: signal BlockWrite.eraseDone[imgNum](error); break; case S_CRC: currentImageIdx++; currentVolume = _imgNum2volumeId[currentImageIdx]; nextImage(); break; } } event void BlockWrite.syncDone[uint8_t imgNum](error_t error) {} default command error_t BlockWrite.erase[uint8_t imgNum]() { return FAIL; } default event void DelugeMetadata.readDone[uint8_t client](uint8_t imgNum, DelugeIdent* i, error_t error) {} default event void storageReady() {} } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugeMsgs.h000066400000000000000000000051701207233610700215420ustar00rootroot00000000000000/* * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2007 Johns Hopkins University. * All rights reserved. */ /** * @author Jonathan Hui * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #ifndef __DELUGE_MSGS_H__ #define __DELUGE_MSGS_H__ #include "DelugePageTransfer.h" enum { DELUGE_ADV_NORMAL = 0, DELUGE_ADV_ERROR = 1, DELUGE_ADV_PC = 2, DELUGE_ADV_PING = 3, DELUGE_ADV_RESET = 4, }; typedef nx_struct DelugeAdvMsg { nx_uint16_t sourceAddr; nx_uint8_t version; // Deluge Version nx_uint8_t type; DelugeObjDesc objDesc; nx_uint8_t reserved; } DelugeAdvMsg; typedef nx_struct DelugeReqMsg { nx_uint16_t dest; nx_uint16_t sourceAddr; nx_object_id_t objid; nx_page_num_t pgNum; nx_uint8_t requestedPkts[DELUGET2_PKT_BITVEC_SIZE]; } DelugeReqMsg; typedef nx_struct DelugeDataMsg { nx_object_id_t objid; nx_page_num_t pgNum; nx_uint8_t pktNum; nx_uint8_t data[DELUGET2_PKT_PAYLOAD_SIZE]; } DelugeDataMsg; #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugeP.nc000066400000000000000000000127711207233610700212060ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ module DelugeP { uses { interface Boot; interface Leds; interface DisseminationValue; interface StdControl as DisseminationStdControl; interface ObjectTransfer; interface SplitControl as RadioSplitControl; interface NetProg; interface StorageMap[uint8_t volumeId]; interface DelugeMetadata; interface DelugeVolumeManager; interface Resource; } provides { event void storageReady(); command void stop(); } } implementation { enum { S_IDLE, S_PUB, S_RECV }; DelugeCmd lastCmd; uint8_t state = S_IDLE; event void storageReady() { call RadioSplitControl.start(); } event void Boot.booted() { lastCmd.uidhash = DELUGE_INVALID_UID; } event void RadioSplitControl.startDone(error_t error) { if (error == SUCCESS) { call DisseminationStdControl.start(); } } command void stop() { call Resource.release(); if (state == S_RECV) { // printf("erase %d\n", lastCmd.imgNum); call DelugeVolumeManager.erase(lastCmd.imgNum); } call ObjectTransfer.stop(); state = S_IDLE; } task void taskRequest() { signal Resource.granted(); } void request() { if (call Resource.isOwner()) { post taskRequest(); } else { call Resource.request(); } } event void DisseminationValue.changed() { const DelugeCmd *cmd = call DisseminationValue.get(); // printf("cmd: %d uidhash: 0x%lx imgNum: %d size: %u\n", cmd->type, cmd->uidhash, cmd->imgNum, cmd->size); switch (cmd->type) { case DELUGE_CMD_STOP: call stop(); break; case DELUGE_CMD_ONLY_DISSEMINATE: case DELUGE_CMD_DISSEMINATE_AND_REPROGRAM: if (state == S_RECV) { if (cmd->uidhash == lastCmd.uidhash) { if (cmd->imgNum == lastCmd.imgNum) { // Same uidhash, same imgNum, only cmd should be // different. That will be properly updated by the last // statement from this function. break; } } call stop(); } if (cmd->uidhash != IDENT_UIDHASH) { call DelugeMetadata.read(cmd->imgNum); } else { state = S_PUB; request(); } break; } lastCmd = *cmd; // printf("lastCmd: %d uidhash: 0x%lx\n", lastCmd.type, lastCmd.uidhash); } event void ObjectTransfer.receiveDone(error_t error) { call Leds.set(LEDS_LED1 | LEDS_LED2); state = S_IDLE; if (error == SUCCESS) { switch (lastCmd.type) { case DELUGE_CMD_ONLY_DISSEMINATE: state = S_PUB; request(); break; case DELUGE_CMD_DISSEMINATE_AND_REPROGRAM: call NetProg.programImageAndReboot(call StorageMap.getPhysicalAddress[lastCmd.imgNum](0)); break; } } else { call DelugeVolumeManager.erase(lastCmd.imgNum); } } event void DelugeMetadata.readDone(uint8_t imgNum, DelugeIdent* ident, error_t error) { // printf("readDone 0x%lx imgNum: %d size: %lu\n", lastCmd.uidhash, lastCmd.imgNum, lastCmd.size); if (ident->uidhash == lastCmd.uidhash) { if (lastCmd.type == DELUGE_CMD_DISSEMINATE_AND_REPROGRAM) { call NetProg.programImageAndReboot(call StorageMap.getPhysicalAddress[imgNum](0)); } else { // We already have the image so we'll go ahead and start publishing. state = S_PUB; request(); } } else { state = S_RECV; request(); } } event void Resource.granted() { switch (state) { case S_PUB: // printf("start pub 0x%lx imgNum: %d size: %u\n", lastCmd.uidhash, lastCmd.imgNum, lastCmd.size); call ObjectTransfer.publish(lastCmd.uidhash, lastCmd.size, lastCmd.imgNum); break; case S_RECV: call ObjectTransfer.receive(lastCmd.uidhash, lastCmd.size, lastCmd.imgNum); break; } } event void DelugeVolumeManager.eraseDone(uint8_t imgNum) {} event void RadioSplitControl.stopDone(error_t error) {} default async void command Leds.set(uint8_t val) {} } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugePageTransfer.h000066400000000000000000000111711207233610700232100ustar00rootroot00000000000000/* * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2007 Johns Hopkins University. * All rights reserved. */ /** * @author Jonathan Hui * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #ifndef DELUGEPAGETRANSFER_H #define DELUGEPAGETRANSFER_H #if defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) #include "extra/telosb/TOSBoot_platform.h" #elif defined(PLATFORM_MICAZ) || defined(PLATFORM_IRIS) #include "extra/micaz/TOSBoot_platform.h" #elif defined(PLATFORM_MULLE) #include "extra/mulle/TOSBoot_platform.h" #elif defined(PLATFORM_TINYNODE) #include "extra/tinynode/TOSBoot_platform.h" #else #error "Target platform is not currently supported by Deluge T2" #endif #include #define AM_DELUGEADVMSG 0x50 #define AM_DELUGEREQMSG 0x51 #define AM_DELUGEDATAMSG 0x52 typedef int32_t object_id_t; typedef nx_int32_t nx_object_id_t; typedef uint32_t object_size_t; typedef nx_uint32_t nx_object_size_t; typedef uint8_t page_num_t; typedef nx_uint8_t nx_page_num_t; enum { DELUGET2_PKT_PAYLOAD_SIZE = TOSH_DATA_LENGTH - sizeof(nx_object_id_t) - sizeof(nx_page_num_t) - sizeof(nx_uint8_t), DELUGET2_BYTES_PER_PAGE = 1024, DELUGET2_PKTS_PER_PAGE = ((DELUGET2_BYTES_PER_PAGE - 1) / DELUGET2_PKT_PAYLOAD_SIZE) + 1, DELUGET2_PKT_BITVEC_SIZE = (((DELUGET2_PKTS_PER_PAGE - 1) / 8) + 1), DELUGE_PKT_PAYLOAD_SIZE = 23, DELUGE_PKTS_PER_PAGE = 48, DELUGE_BYTES_PER_PAGE = (DELUGE_PKTS_PER_PAGE*DELUGE_PKT_PAYLOAD_SIZE), DELUGE_VERSION = 2, DELUGE_MAX_ADV_PERIOD_LOG2 = 22, DELUGE_NUM_NEWDATA_ADVS_REQUIRED = 2, DELUGE_NUM_MIN_ADV_PERIODS = 2, DELUGE_MAX_NUM_REQ_TRIES = 1, DELUGE_REBOOT_DELAY = 4, DELUGE_FAILED_SEND_DELAY = 16, DELUGE_MIN_DELAY = 16, // DELUGE_DATA_OFFSET = 128, DELUGE_IDENT_SIZE = 128, DELUGE_INVALID_ADDR = (0x7fffffffL), DELUGE_MIN_ADV_PERIOD_LOG2 = 9, DELUGE_MAX_REQ_DELAY = (0x1L << (DELUGE_MIN_ADV_PERIOD_LOG2 - 1)), DELUGE_NACK_TIMEOUT = (DELUGE_MAX_REQ_DELAY >> 0x1), DELUGE_MAX_IMAGE_SIZE = (128L * 1024L), DELUGE_MAX_PAGES = 128, DELUGE_CRC_SIZE = sizeof(uint16_t), DELUGE_CRC_BLOCK_SIZE = DELUGE_MAX_PAGES * DELUGE_CRC_SIZE, DELUGE_GOLDEN_IMAGE_NUM = 0x0, DELUGE_INVALID_OBJID = 0xff, DELUGE_INVALID_PKTNUM = 0xff, DELUGE_INVALID_PGNUM = 0xff, DELUGE_QSIZE = 2 }; typedef struct DelugeAdvTimer { uint32_t timer : 32; uint8_t periodLog2 : 8; bool overheard : 1; uint8_t newAdvs : 7; } DelugeAdvTimer; typedef nx_struct DelugeObjDesc { nx_object_id_t objid; nx_page_num_t numPgs; // num pages of complete image nx_uint16_t crc; // crc for vNum and numPgs nx_page_num_t numPgsComplete; // numPgsComplete in image nx_uint8_t reserved; } DelugeObjDesc; #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugePageTransfer.nc000066400000000000000000000043651207233610700233700ustar00rootroot00000000000000/* * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2007 Johns Hopkins University. * All rights reserved. */ /** * @author Jonathan Hui * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #include "DelugePageTransfer.h" interface DelugePageTransfer { command error_t setWorkingPage(object_id_t new_objid, page_num_t new_pgNum); command error_t dataAvailable(uint16_t sourceAddr); command bool isTransferring(); event void suppressMsgs(object_id_t new_objid); event void receivedPage(object_id_t new_objid, page_num_t new_pgNum); command void setImgNum(uint8_t new_img_num); command error_t stop(); } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugePageTransferC.nc000066400000000000000000000057061207233610700234730ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ configuration DelugePageTransferC { provides interface DelugePageTransfer; uses { interface BlockRead[uint8_t img_num]; interface BlockWrite[uint8_t img_num]; interface Receive as ReceiveDataMsg; interface Receive as ReceiveReqMsg; interface AMSend as SendDataMsg; interface AMSend as SendReqMsg; interface AMPacket; interface PacketAcknowledgements; interface Leds; } } implementation { components DelugePageTransferP; DelugePageTransfer = DelugePageTransferP; BlockRead = DelugePageTransferP.BlockRead; BlockWrite = DelugePageTransferP.BlockWrite; ReceiveDataMsg = DelugePageTransferP.ReceiveDataMsg; ReceiveReqMsg = DelugePageTransferP.ReceiveReqMsg; SendDataMsg = DelugePageTransferP.SendDataMsg; SendReqMsg = DelugePageTransferP.SendReqMsg; AMPacket = DelugePageTransferP.AMPacket; PacketAcknowledgements = DelugePageTransferP.PacketAcknowledgements; components RandomC, BitVecUtilsC, new TimerMilliC() as Timer; DelugePageTransferP.Random -> RandomC; DelugePageTransferP.Timer -> Timer; DelugePageTransferP.BitVecUtils -> BitVecUtilsC; DelugePageTransferP.Leds = Leds; // For collecting statistics //components StatsCollectorC; //DelugePageTransferP.StatsCollector -> StatsCollectorC.StatsCollector; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugePageTransferP.nc000066400000000000000000000334631207233610700235110ustar00rootroot00000000000000/* * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2007 Johns Hopkins University. * All rights reserved. */ /** * @author Jonathan Hui * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #include "DelugeMsgs.h" #include "BitVecUtils.h" module DelugePageTransferP { provides interface DelugePageTransfer; uses { interface BitVecUtils; interface BlockRead[uint8_t img_num]; interface BlockWrite[uint8_t img_num]; interface Receive as ReceiveDataMsg; interface Receive as ReceiveReqMsg; interface AMSend as SendDataMsg; interface AMSend as SendReqMsg; interface AMPacket; interface PacketAcknowledgements; interface Timer as Timer; interface Random; interface Leds; //interface StatsCollector; } } implementation { // send/receive page buffers, and state variables for buffers uint8_t pktsToSend[DELUGET2_PKT_BITVEC_SIZE]; // bit vec of packets to send uint8_t pktsToReceive[DELUGET2_PKT_BITVEC_SIZE]; // bit vec of packets to receive DelugeDataMsg rxQueue[DELUGE_QSIZE]; uint8_t head, size; enum { S_DISABLED, S_IDLE, S_TX_LOCKING, S_SENDING, S_RX_LOCKING, S_RECEIVING, }; // state variables uint8_t state = S_DISABLED; uint16_t nodeAddr; uint8_t remainingAttempts; bool suppressReq; object_id_t objToSend = DELUGE_INVALID_OBJID; page_num_t pageToSend = DELUGE_INVALID_PGNUM; object_id_t workingObjid = DELUGE_INVALID_OBJID; page_num_t workingPgNum = DELUGE_INVALID_PGNUM; uint8_t imgNum = 0; message_t pMsgBuf; bool isBusy_pMsgBuf = FALSE; uint8_t publisher_addr; // For collecting stats only void changeState(uint8_t newState); void startReqTimer(bool first) { uint32_t delay; if (first) { delay = DELUGE_MIN_DELAY + (call Random.rand32() % DELUGE_MAX_REQ_DELAY); } else { delay = DELUGE_NACK_TIMEOUT + (call Random.rand32() % DELUGE_NACK_TIMEOUT); } call Timer.startOneShot(delay); } void setupReqMsg() { DelugeReqMsg *pReqMsg = (DelugeReqMsg *)(call SendReqMsg.getPayload(&pMsgBuf, sizeof(DelugeReqMsg))); if (pReqMsg == NULL) { return; } if (state == S_RX_LOCKING) { if (isBusy_pMsgBuf) { return; } isBusy_pMsgBuf = TRUE; changeState(S_RECEIVING); pReqMsg->dest = nodeAddr; pReqMsg->sourceAddr = TOS_NODE_ID; pReqMsg->objid = workingObjid; pReqMsg->pgNum = workingPgNum; } if (state != S_RECEIVING) { return; } // suppress request if (suppressReq) { startReqTimer(FALSE); suppressReq = FALSE; } // tried too many times, give up else if (remainingAttempts == 0) { changeState(S_IDLE); } // send req message else { uint32_t i; for (i = 0; i < DELUGET2_PKT_BITVEC_SIZE; i++) { pReqMsg->requestedPkts[i] = pktsToReceive[i]; } //memcpy(pReqMsg->requestedPkts, pktsToReceive, DELUGE_PKT_BITVEC_SIZE); if (call SendReqMsg.send(pReqMsg->dest, &pMsgBuf, sizeof(DelugeReqMsg)) != SUCCESS) { startReqTimer(FALSE); } } } storage_addr_t calcOffset(page_num_t pgNum, uint8_t pktNum) { return (storage_addr_t)pgNum * (storage_addr_t)DELUGET2_BYTES_PER_PAGE + (uint16_t)pktNum * (uint16_t)DELUGET2_PKT_PAYLOAD_SIZE; } void setupDataMsg() { DelugeDataMsg *pDataMsg = (DelugeDataMsg *)(call SendDataMsg.getPayload(&pMsgBuf, sizeof(DelugeDataMsg))); uint16_t nextPkt; if (state != S_SENDING && state != S_TX_LOCKING) { return; } signal DelugePageTransfer.suppressMsgs(objToSend); if (state == S_TX_LOCKING) { if (isBusy_pMsgBuf) { return; } isBusy_pMsgBuf = TRUE; changeState(S_SENDING); pDataMsg->objid = objToSend; pDataMsg->pgNum = pageToSend; pDataMsg->pktNum = 0; } if (call BitVecUtils.indexOf(&nextPkt, pDataMsg->pktNum, pktsToSend, DELUGET2_PKTS_PER_PAGE) != SUCCESS) { // no more packets to send changeState(S_IDLE); } else { pDataMsg->pktNum = nextPkt; if (call BlockRead.read[imgNum](calcOffset(pageToSend, nextPkt), pDataMsg->data, DELUGET2_PKT_PAYLOAD_SIZE) != SUCCESS) { call Timer.startOneShot(DELUGE_FAILED_SEND_DELAY); } } } void unlockPMsgBuf() { isBusy_pMsgBuf = FALSE; switch(state) { case S_TX_LOCKING: setupDataMsg(); break; case S_RX_LOCKING: setupReqMsg(); break; } } void changeState(uint8_t newState) { if ((newState == S_DISABLED || newState == S_IDLE) && (state == S_SENDING || state == S_RECEIVING)) { unlockPMsgBuf(); } state = newState; } void suppressMsgs(object_id_t objid, page_num_t pgNum) { if (state == S_SENDING || state == S_TX_LOCKING) { if (objid < objToSend || (objid == objToSend && pgNum < pageToSend)) { uint32_t i; changeState(S_IDLE); for (i = 0; i < DELUGET2_PKT_BITVEC_SIZE; i++) { pktsToSend[i] = 0x00; } //memset(pktsToSend, 0x00, DELUGE_PKT_BITVEC_SIZE); } } else if (state == S_RECEIVING || state == S_RX_LOCKING) { if (objid < workingObjid || (objid == workingObjid && pgNum <= workingPgNum)) { // suppress next request since similar request has been overheard suppressReq = TRUE; } } } void writeData() { if(call BlockWrite.write[imgNum](calcOffset(rxQueue[head].pgNum, rxQueue[head].pktNum), rxQueue[head].data, DELUGET2_PKT_PAYLOAD_SIZE) != SUCCESS) { size = 0; } } command error_t DelugePageTransfer.stop() { uint32_t i; call Timer.stop(); changeState(S_DISABLED); workingObjid = DELUGE_INVALID_OBJID; workingPgNum = DELUGE_INVALID_PGNUM; for (i = 0; i < DELUGET2_PKT_BITVEC_SIZE; i++) { pktsToReceive[i] = 0x00; } for (i = 0; i < DELUGET2_PKT_BITVEC_SIZE; i++) { pktsToSend[i] = 0x00; } //memset(pktsToReceive, 0x00, DELUGE_PKT_BITVEC_SIZE); //memset(pktsToSend, 0x00, DELUGE_PKT_BITVEC_SIZE); return SUCCESS; } command error_t DelugePageTransfer.setWorkingPage(object_id_t new_objid, page_num_t new_pgNum) { uint32_t i; if (state == S_DISABLED) { changeState(S_IDLE); } workingObjid = new_objid; workingPgNum = new_pgNum; for (i = 0; i < DELUGET2_PKT_BITVEC_SIZE; i++) { pktsToReceive[i] = 0xFF; } //memset(pktsToReceive, (nx_uint8_t)0xff, DELUGE_PKT_BITVEC_SIZE); return SUCCESS; } command bool DelugePageTransfer.isTransferring() { return (state != S_IDLE && state != S_DISABLED); } command error_t DelugePageTransfer.dataAvailable(uint16_t sourceAddr) { if (state == S_IDLE) { // currently idle, so request data from source changeState(S_RX_LOCKING); nodeAddr = sourceAddr; remainingAttempts = DELUGE_MAX_NUM_REQ_TRIES; suppressReq = FALSE; // randomize request to prevent collision startReqTimer(TRUE); } return SUCCESS; } event void Timer.fired() { setupReqMsg(); setupDataMsg(); } event void SendReqMsg.sendDone(message_t* msg, error_t error) { if (state != S_RECEIVING) { return; } remainingAttempts--; // start timeout timer in case request is not serviced startReqTimer(FALSE); } event message_t* ReceiveReqMsg.receive(message_t* msg, void* payload, uint8_t len) { DelugeReqMsg *rxReqMsg = (DelugeReqMsg*)payload; object_id_t objid; page_num_t pgNum; int i; if (state == S_DISABLED) { return msg; } objid = rxReqMsg->objid; pgNum = rxReqMsg->pgNum; // check if need to suppress req or data msgs suppressMsgs(objid, pgNum); // if not for me, ignore request if (rxReqMsg->dest != TOS_NODE_ID || objid != workingObjid || pgNum >= workingPgNum) { return msg; } if (state == S_IDLE || ((state == S_SENDING || state == S_TX_LOCKING) && objid == objToSend && pgNum == pageToSend)) { // take union of packet bit vectors for (i = 0; i < DELUGET2_PKT_BITVEC_SIZE; i++) { pktsToSend[i] |= rxReqMsg->requestedPkts[i]; } } if (state == S_IDLE) { // not currently sending, so start sending data changeState(S_TX_LOCKING); objToSend = objid; pageToSend = pgNum; nodeAddr = AM_BROADCAST_ADDR; setupDataMsg(); } return msg; } event void SendDataMsg.sendDone(message_t* msg, error_t error) { DelugeDataMsg *pDataMsg = (DelugeDataMsg *)(call SendDataMsg.getPayload(&pMsgBuf, sizeof (DelugeDataMsg))); if (pDataMsg == NULL) { return; } BITVEC_CLEAR(pktsToSend, pDataMsg->pktNum); call Timer.startOneShot(2); // For collecting stats if (error == SUCCESS) { //call StatsCollector.endPubPktTransTime(); } } event message_t* ReceiveDataMsg.receive(message_t* msg, void* payload, uint8_t len) { DelugeDataMsg* rxDataMsg = (DelugeDataMsg*)payload; if (state == S_DISABLED) { return msg; } // check if need to suppress req or data messages suppressMsgs(rxDataMsg->objid, rxDataMsg->pgNum); if (rxDataMsg->objid == workingObjid && rxDataMsg->pgNum == workingPgNum && BITVEC_GET(pktsToReceive, rxDataMsg->pktNum) && size < DELUGE_QSIZE) { // got a packet we need // For collecting stats if (rxDataMsg->pktNum == 0) { //call StatsCollector.startRecvPageTransTime(0); } call Leds.led1Toggle(); //call Leds.set(rxDataMsg->pktNum); // copy data memcpy(&rxQueue[head^size], rxDataMsg, sizeof(DelugeDataMsg)); if (++size == 1) { publisher_addr = call AMPacket.source(msg); // For collecting stats writeData(); } } return msg; } event void BlockRead.readDone[uint8_t img_num](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { DelugeDataMsg *pDataMsg = (DelugeDataMsg *)(call SendDataMsg.getPayload(&pMsgBuf, sizeof(DelugeDataMsg))); // make sure this event for us if (buf != pDataMsg->data) { return; } if (state != S_SENDING) { return; } if (error != SUCCESS) { changeState(S_IDLE); return; } if (call SendDataMsg.send(nodeAddr, &pMsgBuf, sizeof(DelugeDataMsg)) != SUCCESS) { call Timer.startOneShot(DELUGE_FAILED_SEND_DELAY); } else { // For collecting stats //call StatsCollector.startPubPktTransTime(); //call Leds.led1Toggle(); } } event void BlockRead.computeCrcDone[uint8_t img_num](storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) { } event void BlockWrite.writeDone[uint8_t img_num](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { uint16_t tmp; // make sure this event for us if (buf != rxQueue[head].data) { return; } // failed to write if (error != SUCCESS) { uint32_t i; for (i = 0; i < DELUGET2_PKT_BITVEC_SIZE; i++) { pktsToReceive[i] = 0xFF; } size = 0; return; } // mark packet as received BITVEC_CLEAR(pktsToReceive, rxQueue[head].pktNum); head = (head + 1) % DELUGE_QSIZE; size--; if (call BitVecUtils.indexOf(&tmp, 0, pktsToReceive, DELUGET2_PKTS_PER_PAGE) != SUCCESS) { // For collecting stats //call StatsCollector.endRecvPageTransTime(publisher_addr); call Leds.led1Off(); signal DelugePageTransfer.receivedPage(workingObjid, workingPgNum); changeState(S_IDLE); size = 0; } else if (size) { writeData(); } } event void BlockWrite.eraseDone[uint8_t img_num](error_t error) {} event void BlockWrite.syncDone[uint8_t img_num](error_t error) {} command void DelugePageTransfer.setImgNum(uint8_t new_img_num) { imgNum = new_img_num; } default command error_t BlockRead.read[uint8_t img_num](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t BlockWrite.write[uint8_t img_num](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default async command void Leds.led1Toggle() {} default async command void Leds.led1Off() {} } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugeVolumeManager.nc000066400000000000000000000034331207233610700235440ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ interface DelugeVolumeManager { command error_t erase(uint8_t imgNum); event void eraseDone(uint8_t imgNum); } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugeVolumeManagerC.nc000066400000000000000000000047611207233610700236540ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ configuration DelugeVolumeManagerC { provides interface DelugeVolumeManager[uint8_t client]; } implementation { components DelugeVolumeManagerP; DelugeVolumeManager = DelugeVolumeManagerP; components new BlockWriterC(VOLUME_DELUGE1) as BlockWriterDeluge1; components new BlockWriterC(VOLUME_DELUGE2) as BlockWriterDeluge2; components new BlockWriterC(VOLUME_DELUGE3) as BlockWriterDeluge3; DelugeVolumeManagerP.BlockWrite[VOLUME_DELUGE1] -> BlockWriterDeluge1; DelugeVolumeManagerP.BlockWrite[VOLUME_DELUGE2] -> BlockWriterDeluge2; DelugeVolumeManagerP.BlockWrite[VOLUME_DELUGE3] -> BlockWriterDeluge3; DelugeVolumeManagerP.Resource[VOLUME_DELUGE1] -> BlockWriterDeluge1; DelugeVolumeManagerP.Resource[VOLUME_DELUGE2] -> BlockWriterDeluge2; DelugeVolumeManagerP.Resource[VOLUME_DELUGE3] -> BlockWriterDeluge3; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugeVolumeManagerClientC.nc000066400000000000000000000037151207233610700250110ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ generic configuration DelugeVolumeManagerClientC() { provides interface DelugeVolumeManager; } implementation { enum { CLIENT_ID = unique(UQ_DELUGE_VOLUME_MANAGER) }; components DelugeVolumeManagerC; DelugeVolumeManager = DelugeVolumeManagerC.DelugeVolumeManager[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/DelugeVolumeManagerP.nc000066400000000000000000000057251207233610700236720ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ module DelugeVolumeManagerP { provides interface DelugeVolumeManager[uint8_t client]; uses { interface BlockWrite[uint8_t volumeId]; interface Resource[uint8_t volumeId]; } } implementation { uint8_t currentClient; bool busy = FALSE; command error_t DelugeVolumeManager.erase[uint8_t client](uint8_t imgNum) { if (busy) return FAIL; busy = call Resource.request[imgNum]() == SUCCESS; if (busy) { currentClient = client; return SUCCESS; } return FAIL; } event void Resource.granted[uint8_t imgNum]() { call BlockWrite.erase[imgNum](); } event void BlockWrite.eraseDone[uint8_t imgNum](error_t error) { busy = FALSE; call Resource.release[imgNum](); signal DelugeVolumeManager.eraseDone[currentClient](error); } event void BlockWrite.writeDone[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} event void BlockWrite.syncDone[uint8_t imgNum](error_t error) {} default command error_t BlockWrite.erase[uint8_t imgNum]() { return FAIL; } default event void DelugeVolumeManager.eraseDone[uint8_t client](uint8_t imgNum) {} default async command error_t Resource.request[uint8_t imgNum]() { return FAIL; } default async command error_t Resource.release[uint8_t imgNum]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/FakeBlockReaderC.nc000066400000000000000000000054211207233610700227220ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ generic module FakeBlockReaderC(uint32_t size) { provides interface BlockRead; } implementation { enum { S_IDLE, S_BUSY }; storage_addr_t saddr; uint8_t *oribuf; uint8_t *sbuf; storage_len_t slen; uint8_t state = S_IDLE; task void task_read() { while (slen > 0) { *sbuf = saddr & 0xFF; saddr++; sbuf++; slen--; } signal BlockRead.readDone(saddr, oribuf, slen, SUCCESS); state = S_IDLE; } command error_t BlockRead.read(storage_addr_t addr, void* buf, storage_len_t len) { if (state != S_IDLE) { return FAIL; } state = S_BUSY; saddr = addr; sbuf = buf; oribuf = buf; slen = len; post task_read(); return SUCCESS; }; task void task_computeCRC() { signal BlockRead.computeCrcDone(saddr, slen, 0, SUCCESS); } command error_t BlockRead.computeCrc(storage_addr_t addr, storage_len_t len, uint16_t crc) { saddr = addr; slen = len; post task_computeCRC(); return SUCCESS; } command storage_len_t BlockRead.getSize() { return size; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/FakeBlockWriterC.nc000066400000000000000000000036451207233610700230020ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ generic configuration FakeBlockWriterC(uint32_t size) { provides interface BlockWrite; } implementation { components LedsC, NoLedsC, new FakeBlockWriterP(size); BlockWrite = FakeBlockWriterP; FakeBlockWriterP.Leds -> NoLedsC; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/FakeBlockWriterP.nc000066400000000000000000000055521207233610700230160ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ generic module FakeBlockWriterP(uint32_t size) { provides interface BlockWrite; uses interface Leds; } implementation { enum { S_IDLE, S_BUSY }; storage_addr_t saddr; uint8_t *oribuf; uint8_t *sbuf; storage_len_t slen; uint8_t state; task void task_write() { error_t error = SUCCESS; while (slen > 0) { if (*sbuf != (saddr & 0xFF)) { error = FAIL; call Leds.led2Toggle(); } saddr++; sbuf++; slen--; } signal BlockWrite.writeDone(saddr, oribuf, slen, error); state = S_IDLE; } command error_t BlockWrite.write(storage_addr_t addr, void* buf, storage_len_t len) { if (state != S_IDLE) { return FAIL; } state = S_BUSY; saddr = addr; sbuf = buf; oribuf = buf; slen = len; post task_write(); return SUCCESS; } task void task_erase() { signal BlockWrite.eraseDone(SUCCESS); } command error_t BlockWrite.erase() { post task_erase(); return SUCCESS; } task void task_sync() { signal BlockWrite.syncDone(SUCCESS); } command error_t BlockWrite.sync() { post task_sync(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/FlashVolumeManager/000077500000000000000000000000001207233610700230475ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/FlashVolumeManager/FlashVolumeManagerC.nc000066400000000000000000000070661207233610700272250ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #include "AM.h" #include "StorageVolumes.h" generic configuration FlashVolumeManagerC(am_id_t AMId) {} implementation { components new SerialAMSenderC(AMId); components new SerialAMReceiverC(AMId); components new FlashVolumeManagerP(); components new TimerMilliC() as TimeoutTimer; components NoLedsC, LedsC; components BlockStorageLockC; components new BlockStorageLockClientC(); components new BlockReaderC(VOLUME_GOLDENIMAGE) as BlockReaderGoldenImage; components new BlockReaderC(VOLUME_DELUGE1) as BlockReaderDeluge1; components new BlockReaderC(VOLUME_DELUGE2) as BlockReaderDeluge2; components new BlockReaderC(VOLUME_DELUGE3) as BlockReaderDeluge3; components new BlockWriterC(VOLUME_GOLDENIMAGE) as BlockWriterGoldenImage; components new BlockWriterC(VOLUME_DELUGE1) as BlockWriterDeluge1; components new BlockWriterC(VOLUME_DELUGE2) as BlockWriterDeluge2; components new BlockWriterC(VOLUME_DELUGE3) as BlockWriterDeluge3; FlashVolumeManagerP.BlockRead[VOLUME_GOLDENIMAGE] -> BlockReaderGoldenImage; FlashVolumeManagerP.BlockRead[VOLUME_DELUGE1] -> BlockReaderDeluge1; FlashVolumeManagerP.BlockRead[VOLUME_DELUGE2] -> BlockReaderDeluge2; FlashVolumeManagerP.BlockRead[VOLUME_DELUGE3] -> BlockReaderDeluge3; FlashVolumeManagerP.BlockWrite[VOLUME_GOLDENIMAGE] -> BlockWriterGoldenImage; FlashVolumeManagerP.BlockWrite[VOLUME_DELUGE1] -> BlockWriterDeluge1; FlashVolumeManagerP.BlockWrite[VOLUME_DELUGE2] -> BlockWriterDeluge2; FlashVolumeManagerP.BlockWrite[VOLUME_DELUGE3] -> BlockWriterDeluge3; FlashVolumeManagerP.Resource -> BlockStorageLockClientC; FlashVolumeManagerP.ArbiterInfo -> BlockStorageLockC; FlashVolumeManagerP.TimeoutTimer -> TimeoutTimer; FlashVolumeManagerP.SerialAMSender -> SerialAMSenderC; FlashVolumeManagerP.SerialAMReceiver -> SerialAMReceiverC; FlashVolumeManagerP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/FlashVolumeManager/FlashVolumeManagerP.nc000066400000000000000000000216421207233610700272360ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #include "imgNum2volumeId.h" generic module FlashVolumeManagerP() { uses { interface BlockRead[uint8_t imgNum]; interface BlockWrite[uint8_t imgNum]; interface Resource; interface ArbiterInfo; interface AMSend as SerialAMSender; interface Receive as SerialAMReceiver; interface Timer as TimeoutTimer; interface Leds; } } implementation { typedef nx_struct SerialReqPacket { nx_uint8_t cmd; nx_uint8_t imgNum; nx_uint32_t offset; nx_uint16_t len; nx_uint8_t data[0]; } SerialReqPacket; typedef nx_struct SerialReplyPacket { nx_uint8_t error; nx_uint8_t data[0]; } SerialReplyPacket; enum { CMD_ERASE = 0, CMD_WRITE = 1, CMD_READ = 2, CMD_CRC = 3, CMD_ADDR = 4, CMD_SYNC = 5, CMD_IDENT = 6 }; enum { S_IDLE, S_ERASE, S_WRITE, S_READ, S_CRC, S_REPROG, S_SYNC, }; message_t serialMsg; uint8_t buffer[TOSH_DATA_LENGTH]; // Temporary buffer for "write" operation uint8_t currentImgNum = 0xFF; // Image number to reprogram uint8_t state = S_IDLE; // Manager state for multiplexing "done" events nx_struct ShortIdent { nx_uint8_t name[16]; //nx_uint8_t username[16]; //nx_uint8_t hostname[16]; nx_uint32_t timestamp; nx_uint32_t uidhash; nx_uint16_t nodeid; }; void sendReply(error_t error, storage_len_t len) { SerialReplyPacket *reply = (SerialReplyPacket *)call SerialAMSender.getPayload(&serialMsg, sizeof(SerialReplyPacket)); if (reply == NULL) { return; } reply->error = error; call SerialAMSender.send(AM_BROADCAST_ADDR, &serialMsg, len); } event void BlockRead.readDone[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { if (state == S_READ) { SerialReplyPacket *reply = (SerialReplyPacket *)call SerialAMSender.getPayload(&serialMsg, sizeof(SerialReplyPacket)); if (reply == NULL) { return; } if (buf == reply->data) { state = S_IDLE; sendReply(error, len + sizeof(SerialReplyPacket)); } } } event void BlockRead.computeCrcDone[uint8_t imgNum](storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) { if (state == S_CRC) { state = S_IDLE; if (error == SUCCESS) { SerialReplyPacket *srpkt = (SerialReplyPacket *)call SerialAMSender.getPayload(&serialMsg, sizeof(SerialReplyPacket)); if (srpkt == NULL) { return; } srpkt->data[1] = crc & 0xFF; srpkt->data[0] = (crc >> 8) & 0xFF; } sendReply(error, 2 + sizeof(SerialReplyPacket)); } } event void BlockWrite.writeDone[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { if (state == S_WRITE && buf == buffer) { state = S_IDLE; sendReply(error, sizeof(SerialReplyPacket)); } } event void BlockWrite.eraseDone[uint8_t imgNum](error_t error) { if (state == S_ERASE) { call BlockWrite.sync[imgNum](); } } event void BlockWrite.syncDone[uint8_t imgNum](error_t error) { if (state == S_ERASE || state == S_SYNC) { state = S_IDLE; sendReply(error, sizeof(SerialReplyPacket)); } } event message_t* SerialAMReceiver.receive(message_t* msg, void* payload, uint8_t len) { error_t error = SUCCESS; SerialReqPacket *request = (SerialReqPacket *)payload; SerialReplyPacket *reply = (SerialReplyPacket *)call SerialAMSender.getPayload(&serialMsg, sizeof(SerialReplyPacket)); nx_struct ShortIdent *shortIdent; uint8_t imgNum = 0xFF; if (reply == NULL) { return msg; } if (state != S_IDLE) { return msg; } // Converts the image number that the user wants to the real image number imgNum = imgNum2volumeId(request->imgNum); if (imgNum != NON_DELUGE_VOLUME) { error = SUCCESS; // We ask for a reservation only for erase and write. switch (request->cmd) { case CMD_ERASE: case CMD_WRITE: if (!call Resource.isOwner()) { error = call Resource.immediateRequest(); } } if (error == SUCCESS) { call Leds.led1On(); call TimeoutTimer.startOneShot(2*1024); currentImgNum = imgNum; switch (request->cmd) { case CMD_ERASE: // === Erases a volume === state = S_ERASE; #if defined(PLATFORM_MICAZ) || defined(PLATFORM_IRIS) || defined(PLATFORM_EPIC) error = FAIL; #else error = call BlockWrite.erase[imgNum](); #endif break; case CMD_WRITE: // === Writes to a volume === state = S_WRITE; memcpy(buffer, request->data, request->len); error = call BlockWrite.write[imgNum](request->offset, buffer, request->len); break; case CMD_READ: // === Reads a portion of a volume === state = S_READ; error = call BlockRead.read[imgNum](request->offset, reply->data, request->len); break; case CMD_CRC: // === Computes CRC over a portion of a volume === state = S_CRC; error = call BlockRead.computeCrc[imgNum](request->offset, request->len, 0); break; case CMD_SYNC: // === Sync the flash === state = S_SYNC; error = call BlockWrite.sync[imgNum](); break; case CMD_IDENT: shortIdent = (nx_struct ShortIdent*)&reply->data; memset(shortIdent, 0, sizeof(nx_struct ShortIdent)); memcpy(shortIdent->name, IDENT_APPNAME, sizeof(IDENT_APPNAME)); //memcpy(shortIdent->username, IDENT_USER_ID, sizeof(IDENT_USER_ID)); //memcpy(shortIdent->hostname, IDENT_HOSTNAME, sizeof(IDENT_HOSTNAME)); shortIdent->timestamp = IDENT_TIMESTAMP; shortIdent->uidhash = IDENT_UIDHASH; shortIdent->nodeid = TOS_NODE_ID; sendReply(SUCCESS, sizeof(SerialReplyPacket) + sizeof(nx_struct ShortIdent)); break; } } } else { error = FAIL; } // If a split-phase operation fails when being requested, signals the failure now if (error != SUCCESS) { state = S_IDLE; sendReply(error, sizeof(SerialReplyPacket)); } return msg; } event void TimeoutTimer.fired() { // Release the resource. if (state == S_IDLE && call Resource.isOwner()) { call Resource.release(); } if (state == S_IDLE) { call Leds.led1Off(); } } event void SerialAMSender.sendDone(message_t* msg, error_t error) {} event void Resource.granted() {} default command error_t BlockWrite.write[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t BlockWrite.erase[uint8_t imgNum]() { return FAIL; } default command error_t BlockWrite.sync[uint8_t imgNum]() { return FAIL; } default command error_t BlockRead.read[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t BlockRead.computeCrc[uint8_t imgNum](storage_addr_t addr, storage_len_t len, uint16_t crc) { return FAIL; } default async command error_t Resource.immediateRequest() { return FAIL; } default async command error_t Resource.release() { return FAIL; } default async command bool Resource.isOwner() { return FALSE; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/Globals.nc000066400000000000000000000051121207233610700212330ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ interface Globals { command uint32_t getNumPubPktTrans(); command void setNumPubPktTrans(uint32_t val); command void incNumPubPktTrans(); command uint32_t getNumRecvPageTrans(); command void setNumRecvPageTrans(uint32_t val); command void incNumRecvPageTrans(); command uint32_t getAvgPubPktTransTime(); command void setAvgPubPktTransTime(uint32_t val); command uint32_t getAvgRecvPageTransTime(); command void setAvgRecvPageTransTime(uint32_t val); command uint32_t getNumPubPktRetrans(); command void setNumPubPktRetrans(uint32_t val); command void incNumPubPktRetrans(); command uint32_t getNumPubHSRetrans(); command void setNumPubHSRetrans(uint32_t val); command void incNumPubHSRetrans(); command uint32_t getNumRecvHSRetrans(); command void setNumRecvHSRetrans(uint32_t val); command void incNumRecvHSRetrans(); command void* _getStartAddr(); command uint32_t _getSize(); } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/GlobalsC.nc000066400000000000000000000071771207233610700213530ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ module GlobalsC { provides interface Globals; } implementation { struct { uint32_t NumPubPktTrans; uint32_t NumRecvPageTrans; uint32_t AvgPubPktTransTime; uint32_t AvgRecvPageTransTime; uint32_t NumPubPktRetrans; uint32_t NumPubHSRetrans; uint32_t NumRecvHSRetrans; } _g = {0, 0, 0, 0, 0, 0, 0}; command uint32_t Globals.getNumPubPktTrans() { return _g.NumPubPktTrans; } command void Globals.setNumPubPktTrans(uint32_t val) { _g.NumPubPktTrans = val; } command void Globals.incNumPubPktTrans() { _g.NumPubPktTrans++; } command uint32_t Globals.getNumRecvPageTrans() { return _g.NumRecvPageTrans; } command void Globals.setNumRecvPageTrans(uint32_t val) { _g.NumRecvPageTrans = val; } command void Globals.incNumRecvPageTrans() { _g.NumRecvPageTrans++; } command uint32_t Globals.getAvgPubPktTransTime() { return _g.AvgPubPktTransTime; } command void Globals.setAvgPubPktTransTime(uint32_t val) { _g.AvgPubPktTransTime = val; } command uint32_t Globals.getAvgRecvPageTransTime() { return _g.AvgRecvPageTransTime; } command void Globals.setAvgRecvPageTransTime(uint32_t val) { _g.AvgRecvPageTransTime = val; } command uint32_t Globals.getNumPubPktRetrans() { return _g.NumPubPktRetrans; } command void Globals.setNumPubPktRetrans(uint32_t val) { _g.NumPubPktRetrans = val; } command void Globals.incNumPubPktRetrans() { _g.NumPubPktRetrans++; } command uint32_t Globals.getNumPubHSRetrans() { return _g.NumPubHSRetrans; } command void Globals.setNumPubHSRetrans(uint32_t val) { _g.NumPubHSRetrans = val; } command void Globals.incNumPubHSRetrans() { _g.NumPubHSRetrans++; } command uint32_t Globals.getNumRecvHSRetrans() { return _g.NumRecvHSRetrans; } command void Globals.setNumRecvHSRetrans(uint32_t val) { _g.NumRecvHSRetrans = val; } command void Globals.incNumRecvHSRetrans() { _g.NumRecvHSRetrans++; } command void* Globals._getStartAddr() { return &_g; } command uint32_t Globals._getSize() { return sizeof(_g); } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/ObjectTransfer.nc000066400000000000000000000037401207233610700225700ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #include "DelugePageTransfer.h" interface ObjectTransfer { command error_t publish(object_id_t new_objid, object_size_t new_size, uint8_t img_num); command error_t receive(object_id_t new_objid, object_size_t new_size, uint8_t img_num); event void receiveDone(error_t error); command error_t stop(); } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/ObjectTransferC.nc000066400000000000000000000064421207233610700226750ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #include "DelugePageTransfer.h" #include "StorageVolumes.h" configuration ObjectTransferC { provides interface ObjectTransfer; uses { interface BlockRead[uint8_t img_num]; interface BlockWrite[uint8_t img_num]; interface Leds; } } implementation { components ObjectTransferP, DelugePageTransferC; components CrcC; ObjectTransfer = ObjectTransferP; DelugePageTransferC.BlockRead = BlockRead; DelugePageTransferC.BlockWrite = BlockWrite; ObjectTransferP.DelugePageTransfer -> DelugePageTransferC.DelugePageTransfer; ObjectTransferP.Crc -> CrcC.Crc; components new AMSenderC(AM_DELUGEADVMSG) as SendAdvMsg, new AMReceiverC(AM_DELUGEADVMSG) as ReceiveAdvMsg, new AMSenderC(AM_DELUGEREQMSG) as SendReqMsg, new AMReceiverC(AM_DELUGEREQMSG) as ReceiveReqMsg, new AMSenderC(AM_DELUGEDATAMSG) as SendDataMsg, new AMReceiverC(AM_DELUGEDATAMSG) as ReceiveDataMsg; ObjectTransferP.SendAdvMsg -> SendAdvMsg; ObjectTransferP.ReceiveAdvMsg -> ReceiveAdvMsg; DelugePageTransferC.SendReqMsg -> SendReqMsg; DelugePageTransferC.ReceiveReqMsg -> ReceiveReqMsg; DelugePageTransferC.SendDataMsg -> SendDataMsg; DelugePageTransferC.ReceiveDataMsg -> ReceiveDataMsg; DelugePageTransferC.AMPacket -> SendDataMsg; DelugePageTransferC.Leds = Leds; ObjectTransferP.BlockWrite = BlockWrite; components RandomC, new TimerMilliC() as Timer; ObjectTransferP.Random -> RandomC; ObjectTransferP.Timer -> Timer; // For collecting statistics // components StatsCollectorC; // ObjectTransferP.StatsCollector -> StatsCollectorC.StatsCollector; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/ObjectTransferP.nc000066400000000000000000000236031207233610700227100ustar00rootroot00000000000000/* * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2007 Johns Hopkins University. * All rights reserved. */ /** * @author Jonathan Hui * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #include "DelugePageTransfer.h" #include "DelugeMsgs.h" module ObjectTransferP { provides interface ObjectTransfer; uses { interface Random; interface Timer as Timer; interface DelugePageTransfer; interface Crc; interface AMSend as SendAdvMsg; interface Receive as ReceiveAdvMsg; interface BlockWrite[uint8_t img_num]; interface Leds; // interface StatsCollector; } } implementation { // States enum { S_ERASE, S_SYNC, S_INITIALIZING_PUB, S_INITIALIZING_RECV, S_STARTED, S_STOPPED, }; DelugeAdvTimer advTimers; uint8_t state = S_STOPPED; object_id_t cont_receive_new_objid; object_size_t cont_receive_new_size; uint8_t cont_receive_img_num; message_t pMsgBuf; bool isBusy_pMsgBuf = FALSE; DelugeObjDesc curObjDesc; void updateTimers() { //advTimers.timer = 0; } void setupAdvTimer() { advTimers.timer = (uint32_t)0x1 << (advTimers.periodLog2 - 1); advTimers.timer += call Random.rand16() & (advTimers.timer - 1); advTimers.overheard = 0; call Timer.stop(); call Timer.startOneShot(advTimers.timer); } void resetTimer() { if (advTimers.periodLog2 != DELUGE_MIN_ADV_PERIOD_LOG2) { advTimers.periodLog2 = DELUGE_MIN_ADV_PERIOD_LOG2; setupAdvTimer(); } } task void signalObjRecvDone() { signal ObjectTransfer.receiveDone(SUCCESS); } void setNextPage() { if (curObjDesc.numPgsComplete < curObjDesc.numPgs) { call DelugePageTransfer.setWorkingPage(curObjDesc.objid, curObjDesc.numPgsComplete); advTimers.newAdvs = DELUGE_NUM_NEWDATA_ADVS_REQUIRED; advTimers.overheard = 0; resetTimer(); } else { call DelugePageTransfer.setWorkingPage(DELUGE_INVALID_OBJID, DELUGE_INVALID_PGNUM); call ObjectTransfer.stop(); state = S_SYNC; call BlockWrite.sync[cont_receive_img_num](); } } bool isObjDescValid(DelugeObjDesc* tmpObjDesc) { return (tmpObjDesc->crc == call Crc.crc16(tmpObjDesc, sizeof(object_id_t) + sizeof(page_num_t)) && tmpObjDesc->crc != 0); } void sendAdvMsg(uint16_t addr) { DelugeAdvMsg *pMsg = (DelugeAdvMsg *)(call SendAdvMsg.getPayload(&pMsgBuf, sizeof(DelugeAdvMsg))); if (pMsg == NULL) { return; } if (isBusy_pMsgBuf == FALSE) { pMsg->sourceAddr = TOS_NODE_ID; pMsg->version = DELUGE_VERSION; pMsg->type = DELUGE_ADV_NORMAL; memcpy(&(pMsg->objDesc), &curObjDesc, sizeof(DelugeObjDesc)); if (call SendAdvMsg.send(addr, &pMsgBuf, sizeof(DelugeAdvMsg)) == SUCCESS) { //call StatsCollector.msg_bcastReq(); isBusy_pMsgBuf = TRUE; } } } /** * Starts publisher */ command error_t ObjectTransfer.publish(object_id_t new_objid, object_size_t new_size, uint8_t img_num) { call ObjectTransfer.stop(); //call StatsCollector.startStatsCollector(); state = S_INITIALIZING_PUB; curObjDesc.objid = new_objid; curObjDesc.numPgs = ((new_size - 1) / DELUGET2_BYTES_PER_PAGE) + 1; // Number of pages to transmit curObjDesc.numPgsComplete = curObjDesc.numPgs; // Publisher doesn't really care about this curObjDesc.crc = call Crc.crc16(&curObjDesc, sizeof(object_id_t) + sizeof(page_num_t)); if (state == S_INITIALIZING_PUB) { resetTimer(); } state = S_STARTED; call DelugePageTransfer.setImgNum(img_num); call DelugePageTransfer.setWorkingPage(curObjDesc.objid, curObjDesc.numPgs); return SUCCESS; } /** * Resumes the process of preparing the receiver after the target volume is erased */ void cont_receive() { state = S_INITIALIZING_RECV; curObjDesc.objid = cont_receive_new_objid; curObjDesc.numPgs = ((cont_receive_new_size - 1) / DELUGET2_BYTES_PER_PAGE) + 1; // Number of pages to receive curObjDesc.numPgsComplete = 0; curObjDesc.crc = call Crc.crc16(&curObjDesc, sizeof(object_id_t) + sizeof(page_num_t)); if (state == S_INITIALIZING_RECV) { resetTimer(); } state = S_STARTED; call DelugePageTransfer.setImgNum(cont_receive_img_num); setNextPage(); } /** * Starts receiver */ command error_t ObjectTransfer.receive(object_id_t new_objid, object_size_t new_size, uint8_t img_num) { error_t error; call ObjectTransfer.stop(); //call StatsCollector.startStatsCollector(); cont_receive_new_objid = new_objid; cont_receive_new_size = new_size; cont_receive_img_num = img_num; error = call BlockWrite.erase[cont_receive_img_num](); if (error == SUCCESS) { state = S_ERASE; } return error; } command error_t ObjectTransfer.stop() { call Timer.stop(); call DelugePageTransfer.stop(); state = S_STOPPED; //call StatsCollector.stopStatsCollector(); curObjDesc.objid = DELUGE_INVALID_OBJID; curObjDesc.numPgs = DELUGE_INVALID_PGNUM; curObjDesc.numPgsComplete = DELUGE_INVALID_PGNUM; advTimers.periodLog2 = 0; return SUCCESS; } event void DelugePageTransfer.receivedPage(object_id_t new_objid, page_num_t new_pgNum) { // printf("R: %08lx %d\n", new_objid, new_pgNum); if (new_objid == curObjDesc.objid && new_pgNum == curObjDesc.numPgsComplete) { curObjDesc.numPgsComplete++; curObjDesc.crc = call Crc.crc16(&curObjDesc, sizeof(object_id_t) + sizeof(page_num_t)); if (curObjDesc.numPgsComplete < curObjDesc.numPgs) { setNextPage(); } else { call DelugePageTransfer.setWorkingPage(curObjDesc.objid, curObjDesc.numPgsComplete); state = S_SYNC; if (call BlockWrite.sync[cont_receive_img_num]() != SUCCESS) { post signalObjRecvDone(); } } } } event void BlockWrite.syncDone[uint8_t img_num](error_t error) { if (state == S_SYNC) { post signalObjRecvDone(); } } event void DelugePageTransfer.suppressMsgs(object_id_t new_objid) { if (new_objid == curObjDesc.objid) { advTimers.overheard = 1; } } event void SendAdvMsg.sendDone(message_t* msg, error_t error) { isBusy_pMsgBuf = FALSE; } event message_t* ReceiveAdvMsg.receive(message_t* msg, void* payload, uint8_t len) { DelugeAdvMsg *rxAdvMsg = (DelugeAdvMsg*)payload; DelugeObjDesc *cmpObjDesc = &(rxAdvMsg->objDesc); bool isEqual = FALSE; if (cmpObjDesc->objid != curObjDesc.objid) { return msg; } if (rxAdvMsg->version != DELUGE_VERSION || state != S_STARTED) { return msg; } if (isObjDescValid(&(rxAdvMsg->objDesc)) && state == S_STARTED) { // Their image is larger (They have something we need) if (cmpObjDesc->numPgsComplete > curObjDesc.numPgsComplete) { if ( advTimers.newAdvs == 0 ) { call DelugePageTransfer.dataAvailable(rxAdvMsg->sourceAddr); } } // Their image is smaller (They need something we have) else if (cmpObjDesc->numPgsComplete < curObjDesc.numPgsComplete) { advTimers.newAdvs = DELUGE_NUM_NEWDATA_ADVS_REQUIRED; } // image is the same else { advTimers.overheard = 1; isEqual = TRUE; } if (!isEqual) { resetTimer(); } } return msg; } event void Timer.fired() { updateTimers(); if (advTimers.overheard == 0) { sendAdvMsg(AM_BROADCAST_ADDR); } if (call DelugePageTransfer.isTransferring()) advTimers.newAdvs = DELUGE_NUM_NEWDATA_ADVS_REQUIRED; else if (advTimers.newAdvs > 0) advTimers.newAdvs--; if (advTimers.newAdvs == 0 && advTimers.periodLog2 < DELUGE_MAX_ADV_PERIOD_LOG2) { advTimers.periodLog2++; } setupAdvTimer(); } default command error_t BlockWrite.erase[uint8_t img_num]() { return FAIL; } default command error_t BlockWrite.sync[uint8_t img_num]() { return FAIL; } event void BlockWrite.writeDone[uint8_t img_num](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} event void BlockWrite.eraseDone[uint8_t img_num](error_t error) { if (state == S_ERASE) { cont_receive(); } } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/ReprogramGuard.nc000066400000000000000000000001451207233610700225720ustar00rootroot00000000000000interface ReprogramGuard { command error_t okToProgram(); event void okToProgramDone(bool ok); } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/SerialStarterC.nc000066400000000000000000000035061207233610700225440ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ configuration SerialStarterC { } implementation { components SerialActiveMessageC, AutoStarterC; AutoStarterC.SplitControl -> SerialActiveMessageC; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/StatsCollector.nc000066400000000000000000000042541207233610700226230ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ interface StatsCollector { command void stopStatsCollector(); command void startStatsCollector(); command void startPubPktTransTime(); command void endPubPktTransTime(); command void startRecvPageTransTime(uint8_t channel); command void endRecvPageTransTime(uint8_t senderAddr); command void incPub_numPktRetrans(); command void incNumRecvHSRetrans(); command void startCCTime(); command void endCCTime(); command void sendVariableReport(uint32_t value); command void msg_bcastReq(); } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/StatsCollectorC.nc000066400000000000000000000047441207233610700227320ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ configuration StatsCollectorC { provides { interface StatsCollector; } } implementation { components GlobalsC, StatsCollectorP, new CounterToLocalTimeC(TMilli), #ifdef TOSSIM HilTimerMilliC, #else new TransformCounterC(TMilli, uint32_t, T32khz, uint16_t, 5, uint32_t) as Transform, Msp430Counter32khzC, #endif new TimerMilliC() as Timer; #ifdef TOSSIM StatsCollectorP.LocalTime -> HilTimerMilliC; #else CounterToLocalTimeC.Counter -> Transform; Transform.CounterFrom -> Msp430Counter32khzC; StatsCollectorP.LocalTime -> CounterToLocalTimeC; #endif StatsCollectorP.Globals -> GlobalsC.Globals; StatsCollector = StatsCollectorP.StatsCollector; StatsCollectorP.Timer -> Timer; components SerialStarterC, new SerialAMSenderC(0); StatsCollectorP.AMSend -> SerialAMSenderC; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/StatsCollectorP.nc000066400000000000000000000146761207233610700227540ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ module StatsCollectorP { provides { interface StatsCollector; } uses { interface LocalTime as LocalTime; interface Globals; interface Timer as Timer; interface AMSend; } } implementation { enum { TIMER = 0, FORCED_START = 1, FORCED_END = 2 }; enum { BROADCAST_REQ = 0, START_RECV_DATA = 1, END_RECV_DATA = 2 }; typedef nx_struct StatsReport { nx_uint8_t text[5]; nx_uint32_t NumPubPktTrans; nx_uint32_t NumRecvPageTrans; nx_uint32_t AvgPubPktTransTime; nx_uint32_t AvgRecvPageTransTime; nx_uint32_t NumPubPktRetrans; nx_uint32_t NumRecvHSRetrans; } StatsReport; typedef nx_struct StatusReport { nx_uint8_t text[5]; nx_uint8_t flag; nx_uint8_t channel; } StatusReport; typedef nx_struct VariableReport { nx_uint8_t text[5]; nx_uint32_t value; } VariableReport; uint32_t startPubTime = 0; uint32_t startRecvTime = 0; uint32_t startCCTime = 0; // Change channel message_t stats_msg; message_t status_msg; message_t variable_msg; void startTimer() { if(call Timer.isRunning() == FALSE || call Timer.isOneShot() == TRUE) { call Timer.startPeriodic(5000); } } void stopTimer() { if(call Timer.isRunning() == TRUE) { call Timer.stop(); } } void sendStatsReport() { StatsReport *report = (StatsReport *)call AMSend.getPayload(&stats_msg); report->text[0] = 's'; report->text[1] = 't'; report->text[2] = 'a'; report->text[3] = 't'; report->text[4] = 's'; report->NumPubPktTrans = call Globals.getNumPubPktTrans(); report->NumRecvPageTrans = call Globals.getNumRecvPageTrans(); report->AvgPubPktTransTime = call Globals.getAvgPubPktTransTime(); report->AvgRecvPageTransTime = call Globals.getAvgRecvPageTransTime(); report->NumPubPktRetrans = call Globals.getNumPubPktRetrans(); report->NumRecvHSRetrans = call Globals.getNumRecvHSRetrans(); call AMSend.send(AM_BROADCAST_ADDR, &stats_msg, sizeof(StatsReport)); } void sendStatusMsg(uint8_t flag, uint8_t channel) { StatusReport *report = (StatusReport *)call AMSend.getPayload(&status_msg); report->text[0] = 's'; report->text[1] = 't'; report->text[2] = 't'; report->text[3] = 'u'; report->text[4] = 's'; report->flag = flag; report->channel = channel; call AMSend.send(AM_BROADCAST_ADDR, &status_msg, sizeof(StatusReport)); } command void StatsCollector.sendVariableReport(uint32_t value) { VariableReport *report = (VariableReport *)call AMSend.getPayload(&variable_msg); report->text[0] = 'r'; report->text[1] = 'e'; report->text[2] = 'p'; report->text[3] = 'r'; report->text[4] = 't'; report->value = value; call AMSend.send(AM_BROADCAST_ADDR, &variable_msg, sizeof(VariableReport)); } command void StatsCollector.msg_bcastReq() { sendStatusMsg(BROADCAST_REQ, CC2420_DEF_CHANNEL); } event void Timer.fired() { sendStatsReport(); } event void AMSend.sendDone(message_t* pstats_msg, error_t error) { } command void StatsCollector.startStatsCollector() { startTimer(); } command void StatsCollector.stopStatsCollector() { stopTimer(); call Timer.startOneShot(500); //sendStatsReport(); // Just in case } command void StatsCollector.startPubPktTransTime() { startPubTime = call LocalTime.get(); } command void StatsCollector.endPubPktTransTime() { uint32_t diff = (call LocalTime.get()) - startPubTime; uint32_t temp = (call Globals.getAvgPubPktTransTime()) * (call Globals.getNumPubPktTrans()); call Globals.incNumPubPktTrans(); call Globals.setAvgPubPktTransTime((temp + diff) / (call Globals.getNumPubPktTrans())); } command void StatsCollector.startRecvPageTransTime(uint8_t channel) { startRecvTime = call LocalTime.get(); sendStatusMsg(START_RECV_DATA, channel); } command void StatsCollector.endRecvPageTransTime(uint8_t senderAddr) { uint32_t curTime = call LocalTime.get(); uint32_t temp = (call Globals.getAvgRecvPageTransTime()) * (call Globals.getNumRecvPageTrans()); call Globals.incNumRecvPageTrans(); call Globals.setAvgRecvPageTransTime((temp + (curTime - startRecvTime)) / (call Globals.getNumRecvPageTrans())); sendStatusMsg(END_RECV_DATA, senderAddr); } command void StatsCollector.incPub_numPktRetrans() { call Globals.incNumPubPktRetrans(); } command void StatsCollector.startCCTime() { startCCTime = call LocalTime.get(); } command void StatsCollector.endCCTime() { uint32_t diff = (call LocalTime.get()) - startCCTime; call StatsCollector.sendVariableReport(diff); } command void StatsCollector.incNumRecvHSRetrans() { call Globals.incNumRecvHSRetrans(); } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/StorageMap.nc000066400000000000000000000037331207233610700217210ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * An abstraction to map volume addresses to physical addresses. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2008-01-25 00:50:15 $ */ interface StorageMap { /** * Get the physical address of a volume address. * * @param addr the volume addres. * @return the physical address. */ command storage_addr_t getPhysicalAddress( storage_addr_t addr ); } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/000077500000000000000000000000001207233610700204525ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/NetProg.h000066400000000000000000000040151207233610700222010ustar00rootroot00000000000000// $Id: NetProg.h,v 1.4 2010-06-29 22:07:47 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ #ifndef __NETPROG_H__ #define __NETPROG_H__ #include "NetProg_platform.h" #ifndef IDENT_UID_HASH #define IDENT_UID_HASH 0 #endif static const uint32_t DELUGE_IMAGE_UID = IDENT_UID_HASH; /* typedef struct NetProg_TOSInfo { uint16_t addr; uint8_t groupId; uint16_t crc; } NetProg_TOSInfo; */ #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/NetProg.nc000066400000000000000000000045301207233610700223540ustar00rootroot00000000000000// $Id: NetProg.nc,v 1.4 2010-06-29 22:07:47 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Top level interface for network programming integration with * applications. * * @author Jonathan Hui */ interface NetProg { /** * Reboot the node. * * @return Does not return. */ command error_t reboot(); /** * Reboot into the image specified by imageAddr. This * assumes that an image is present into the external flash * at the imageAddr address. * * @param imageAddr Address in external flash * @return FAIL if the reboot command fails to * complete, does not return, otherwise. */ command error_t programImageAndReboot(uint32_t imageAddr); } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/NetProgC.nc000066400000000000000000000047341207233610700224650ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * */ /** * @author Jonathan Hui * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ includes NetProg; includes TOSBoot; configuration NetProgC { provides { interface NetProg; } } implementation { components MainC, InternalFlashC as IFlash, CrcC; components NetProgM, ReprogramGuardC; NetProg = NetProgM; MainC.SoftwareInit -> NetProgM.Init; NetProgM.IFlash -> IFlash; NetProgM.Crc -> CrcC; NetProgM.ReprogramGuard -> ReprogramGuardC; components LedsC; NetProgM.Leds -> LedsC; components ActiveMessageAddressC; NetProgM.setAmAddress -> ActiveMessageAddressC; #if !defined(PLATFORM_TINYNODE) && !defined(PLATFORM_MULLE) components CC2420ControlP; NetProgM.CC2420Config -> CC2420ControlP; #endif } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/NetProgM.nc000066400000000000000000000100271207233610700224670ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * */ /** * @author Jonathan Hui * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ #include "AM.h" module NetProgM { provides { interface NetProg; interface Init; } uses { interface InternalFlash as IFlash; interface Crc; interface Leds; #if !defined(PLATFORM_TINYNODE) && !defined(PLATFORM_MULLE) interface CC2420Config; #endif async command void setAmAddress(am_addr_t a); interface ReprogramGuard; } } implementation { uint32_t reprogramImgAddr; command error_t Init.init() { BootArgs bootArgs; call IFlash.read(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs)); // Update the local node ID if (bootArgs.address != 0xFFFF) { TOS_NODE_ID = bootArgs.address; call setAmAddress(bootArgs.address); } #if !defined(PLATFORM_TINYNODE) && !defined(PLATFORM_MULLE) call CC2420Config.setShortAddr(bootArgs.address); call CC2420Config.sync(); #endif return SUCCESS; } command error_t NetProg.reboot() { BootArgs bootArgs; atomic { call IFlash.read(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs)); if (bootArgs.address != TOS_NODE_ID) { bootArgs.address = TOS_NODE_ID; call IFlash.write(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs)); } netprog_reboot(); } return FAIL; } command error_t NetProg.programImageAndReboot(uint32_t imgAddr) { reprogramImgAddr = imgAddr; return call ReprogramGuard.okToProgram(); } event void ReprogramGuard.okToProgramDone(bool ok) { BootArgs bootArgs; if (!ok) { // The voltage is too low. Nothing to do. return; } atomic { call IFlash.read(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs)); bootArgs.imageAddr = reprogramImgAddr; bootArgs.gestureCount = 0xff; bootArgs.noReprogram = FALSE; bootArgs.address = TOS_NODE_ID; call IFlash.write(TCAST(uint8_t* COUNT(sizeof(bootArgs)),TOSBOOT_ARGS_ADDR), &bootArgs, sizeof(bootArgs)); // reboot netprog_reboot(); } } #if !defined(PLATFORM_TINYNODE) && !defined(PLATFORM_MULLE) event void CC2420Config.syncDone(error_t error) {} #endif } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/TOSBoot.h000066400000000000000000000036371207233610700221250ustar00rootroot00000000000000// $Id: TOSBoot.h,v 1.3 2010-06-29 22:07:47 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui */ #ifndef __TOSBOOT_H__ #define __TOSBOOT_H__ #include "TOSBoot_platform.h" typedef struct tosboot_args_t { uint32_t imageAddr; uint8_t gestureCount; bool noReprogram; } tosboot_args_t; #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/avr/000077500000000000000000000000001207233610700212425ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/avr/InternalFlashC.nc000066400000000000000000000045621207233610700244300ustar00rootroot00000000000000// $Id: InternalFlashC.nc,v 1.3 2010-06-29 22:07:47 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ #include "InternalFlash.h" module InternalFlashC { provides interface InternalFlash; } implementation { command error_t InternalFlash.write(void* addr, void* buf, uint16_t size) { uint8_t *addrPtr = (uint8_t*)addr; uint8_t *bufPtr = (uint8_t*)buf; for ( ; size; size-- ) eeprom_write_byte(addrPtr++, *bufPtr++); while(!eeprom_is_ready()); return SUCCESS; } command error_t InternalFlash.read(void* addr, void* buf, uint16_t size) { uint8_t *addrPtr = (uint8_t*)addr; uint8_t *bufPtr = (uint8_t*)buf; for ( ; size; size-- ) *bufPtr++ = eeprom_read_byte(addrPtr++); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/epic/000077500000000000000000000000001207233610700213725ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/epic/TOSBoot_platform.h000066400000000000000000000041501207233610700247400ustar00rootroot00000000000000// $Id: TOSBoot_platform.h,v 1.2 2010-06-29 22:07:47 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui */ #ifndef __TOSBOOT_PLATFORM_H__ #define __TOSBOOT_PLATFORM_H__ enum { TOSBOOT_ARGS_ADDR = 0x70, // address of TOSBoot args in internal flash TOSBOOT_GESTURE_MAX_COUNT = 3, // number of resets to force golden image TOSBOOT_GOLDEN_IMG_ADDR = 0x0L, // address of the golden image in external flash TOSBOOT_INT_PAGE_SIZE = 512L, // size of each internal program flash page }; #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/iris/000077500000000000000000000000001207233610700214205ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/iris/NetProgC.nc000066400000000000000000000043711207233610700234300ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * */ /** * @author Jonathan Hui * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ includes NetProg; includes TOSBoot; configuration NetProgC { provides { interface NetProg; } } implementation { components MainC, InternalFlashC as IFlash, CrcC, NetProgM; NetProg = NetProgM; MainC.SoftwareInit -> NetProgM.Init; NetProgM.IFlash -> IFlash; NetProgM.Crc -> CrcC; components LedsC; NetProgM.Leds -> LedsC; components ActiveMessageAddressC; NetProgM.setAmAddress -> ActiveMessageAddressC; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/iris/NetProgM.nc000066400000000000000000000064011207233610700234360ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * */ /** * @author Jonathan Hui * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ #include "AM.h" module NetProgM { provides { interface NetProg; interface Init; } uses { interface InternalFlash as IFlash; interface Crc; interface Leds; async command void setAmAddress(am_addr_t a); } } implementation { command error_t Init.init() { BootArgs bootArgs; call IFlash.read((uint8_t*)TOSBOOT_ARGS_ADDR, &bootArgs, sizeof(bootArgs)); // Update the local node ID if (bootArgs.address != 0xFFFF) { TOS_NODE_ID = bootArgs.address; call setAmAddress(bootArgs.address); } return SUCCESS; } command error_t NetProg.reboot() { BootArgs bootArgs; atomic { call IFlash.read((uint8_t*)TOSBOOT_ARGS_ADDR, &bootArgs, sizeof(bootArgs)); if (bootArgs.address != TOS_NODE_ID) { bootArgs.address = TOS_NODE_ID; call IFlash.write((uint8_t*)TOSBOOT_ARGS_ADDR, &bootArgs, sizeof(bootArgs)); } netprog_reboot(); } return FAIL; } command error_t NetProg.programImageAndReboot(uint32_t imgAddr) { BootArgs bootArgs; atomic { call IFlash.read((uint8_t*)TOSBOOT_ARGS_ADDR, &bootArgs, sizeof(bootArgs)); bootArgs.imageAddr = imgAddr; bootArgs.gestureCount = 0xff; bootArgs.noReprogram = FALSE; bootArgs.address = TOS_NODE_ID; call IFlash.write((uint8_t*)TOSBOOT_ARGS_ADDR, &bootArgs, sizeof(bootArgs)); // reboot netprog_reboot(); } // couldn't reboot return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/m16c60/000077500000000000000000000000001207233610700213665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/m16c60/62p/000077500000000000000000000000001207233610700217755ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/m16c60/62p/HplM16c60FlashC.nc000066400000000000000000000210041207233610700247150ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "M16c62pFlash.h" #include "iom16c62p.h" /** * Implementation of the HplM16c60Flash interface for M16c/62p. Note that this module * should be used with caution so that one doesn't erase the flash where the * executing program lies. * * @author Henrik Makitaavola * @author Renesas */ // TODO(henrik) This implementation expects a main clock speed <=10 MHz, fix it. module HplM16c60FlashC { provides interface HplM16c60Flash; } implementation { // Defines an array of highest even addresses for each block const unsigned long block_addresses[14] = {0xFFFFE,0xFEFFE,0xFDFFE,0xFBFFE,0xF9FFE,0xF7FFE,0xEFFFE,0xDFFFE,0xCFFFE, 0xBFFFE,0xAFFFE,0x9FFFE,0x8FFFE,0xFFFE }; unsigned char cm0_saved; // For saving the Clock Mode 0 register unsigned char cm1_saved; // For saving the Clock Mode 1 register unsigned char pm0_saved; // For saving the Processor Mode 0 register unsigned char pm1_saved; // For saving the Processor Mode 1 register unsigned char prcr_saved; // Save Protection register /** * Sets the processor mode for programming flash and saves current * settings to restore later. You cannot run the processor faster * than 10.0 MHz (with wait state) or 6.25MHz (without wait state) * when sending commands to the flash controller. */ void slowMCUClock(void) { // Unprotect registers CM0 and CM1 and PM0 registers by writting to protection register prcr_saved = *((char *)0xA); // Save Protection register *((char *)0xA) = 3; // Allow writting to protected system registers // Force to Single chip mode for processors that have memory expansion mode pm0_saved = *((char *)0x4); // Save pm0 register *((char *)0x4) = pm0_saved & 0xFC; // bit 0 and 1 to zero cm0_saved = *((char *)0x6); // Save cm0 register cm1_saved = *((char *)0x7); // Save cm1 register pm1_saved = *((char *)0x5); // Save pm1 register // Insert Wait state for all bus access (needed for talking to the // internal flash controller) asm("BSET 7,0x05"); // Set bit PM17 CM0.BYTE = 0; CM1.BYTE = 0; } /** * Restores the processor mode back to original settings. */ void restoreMCUClock(void) { *((char *)0x4) = pm0_saved; // Restore pm0 register /* Clock settings for R8C and M16C */ *((char *)0x7) = cm1_saved; // Restore cm1 register *((char *)0x6) = cm0_saved; // Restore cm0 register *((char *)0x5) = pm1_saved; // Restore pm1 register *((char *)0xA) = prcr_saved; // Protection back on } /** * Disable and enable interrups macros. A call to * disableInterrupt must be followed by a call to RestoreInterrupt. */ #define disableInterrupt() \ { \ __nesc_atomic_t flg_saved; \ asm volatile ("stc flg, %0": "=r"(flg_saved): : "%flg"); \ asm("fclr i"); \ asm volatile("" : : : "memory"); #define restoreInterrupt() \ asm volatile("" : : : "memory"); \ asm volatile ("ldc %0, flg": : "r"(flg_saved): "%flg"); \ } void clearStatus(unsigned long addr) { unsigned int low = (unsigned int) addr; unsigned int high = (unsigned int)( addr >> 16); asm volatile ( "mov.w #0x0050, r3\n\t" "ste.w r3, [a1a0]\n\t" : : "Ra0"(low), "Ra1"(high) : "memory", "r3"); } bool writeWord(unsigned long addr, unsigned int word) { unsigned int low = (unsigned int) addr; unsigned int high = (unsigned int)( addr >> 16); asm volatile ( "mov.w #0x0040, r3\n\t" // Send write command "ste.w r3, [a1a0]\n\t" "ste.w %[data], [a1a0]\n\t" : :"Ra0"(low), "Ra1" (high), [data] "r" (word) : "memory", "r3"); return !FMR0.BIT.FMR06; } command error_t HplM16c60Flash.erase( unsigned char block ) { unsigned int low = (unsigned int) block_addresses[ block ]; unsigned int high = (unsigned int)( block_addresses[ block ] >> 16); // Must change main clock speed to meet flash requirements disableInterrupt(); slowMCUClock(); FMR0.BIT.FMR01 = 0; FMR0.BIT.FMR01 = 1; FMR1.BIT.FMR11 = 0; FMR1.BIT.FMR11 = 1; FMR0.BIT.FMR02 = 0; FMR0.BIT.FMR02 = 1; asm volatile ( "mov.w #0x0050, r3\n\t" // Clear status register "ste.w r3, [a1a0]\n\t" "mov.w #0x0020, r3\n\t" // Block Erase 1(2) "ste.w r3, [a1a0]\n\t" "mov.w #0x00D0, r3\n\t" // Block Erase 2(2) "ste.w r3, [a1a0]\n\t" : : "Ra0"(low), "Ra1"(high) : "memory", "r3"); // Note: In EW1 Mode, the MCU is suspended until the operation is completed. while (!FMR0.BIT.FMR00); // Disable CPU rewriting commands by clearing EW entry bit. FMR0.BYTE = 0; restoreMCUClock(); // Restore clock back to original speed restoreInterrupt(); if( FMR0.BIT.FMR07) // Erasing error? { return FAIL; // Erase Fail } return SUCCESS; // Erase Pass } command uint8_t HplM16c60Flash.write( unsigned long flash_addr, unsigned int * buffer_addr, unsigned int bytes) { error_t ret_value = SUCCESS; unsigned int i; // Check for odd number of bytes &c heck for odd address if( bytes & 1 || (int)flash_addr & 1) return EINVAL; // ERROR!! You must always pass an even number of bytes. disableInterrupt(); // Must change main clock speed to meet flash requirements slowMCUClock(); FMR0.BIT.FMR01 = 0; FMR0.BIT.FMR01 = 1; FMR1.BIT.FMR11 = 0; FMR1.BIT.FMR11 = 1; FMR0.BIT.FMR02 = 0; FMR0.BIT.FMR02 = 1; // Clear status register clearStatus(flash_addr); for (i = 0; i < (bytes >> 1); ++i) { // Write to the flash sequencer by writing to that area of flash memory if (!writeWord(flash_addr, buffer_addr[i])) { uint8_t j; bool fail = 1; clearStatus(flash_addr); for (j = 0; j < 3; ++j) { if (writeWord(flash_addr, buffer_addr[i])) { fail = 0; break; } } if (fail) { ret_value = FAIL; // Signal that we had got an error break; // Break out of for loop } } flash_addr += 2; // Advance to next flash write address } // Disable CPU rewriting commands by clearing EW entry bit FMR0.BYTE = 0; restoreMCUClock(); // Restore clock back to original speed restoreInterrupt(); return ret_value; // Return Pass/Fail } command uint8_t HplM16c60Flash.read(unsigned long address) { unsigned int low = (unsigned int)(address); unsigned int high = (unsigned int)(address >> 16); unsigned int data; disableInterrupt(); asm volatile ( "mov.w #0x00FF, r3\n\t" // Read Array Command, once is enough but to be certain that // a Read Array Command has been executed do it before every // read for now. "ste.w r3, [a1a0]\n\t" "lde.w [a1a0], %[data]" :[data] "=r" (data) :"Ra0"(low), "Ra1"(high) : "memory", "r3"); restoreInterrupt(); return data; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/m16c60/62p/InternalFlashC.nc000066400000000000000000000040031207233610700251510ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Wiring so that the M16c/62p InternalFlashP module gets access to the * HplM16c60FlashC module. * * @author Henrik Makitaavola */ #include "M16c62pFlash.h" configuration InternalFlashC { provides interface InternalFlash; } implementation { components HplM16c60FlashC, new InternalFlashP(M16C62P_BLOCK_2, M16C62P_BLOCK_3); InternalFlashP.Flash -> HplM16c60FlashC; InternalFlash = InternalFlashP; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/m16c60/62p/InternalFlashP.nc000066400000000000000000000154751207233610700252050ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "M16c62pFlash.h" /** * Implementation of the InternalFlash interface for the * M16c/62p mcu to be used as the TOSBoot arguments storage. * * The implementation uses 2 flash blocks to store the arguments into. First one * block is filled up or written to until a error occurs. After that the second block * will be written to. Everytime the start address of one block is written to the * otherone will be erased. If a erase is not executed due to powerdown or some other * error a erase command will be executed on that block the next time. * * A argument writing is surrounded by two 0x1 bytes: * 0x1 [arguments data] 0x1. The first byte indicating a new TOSBoot argument entry * and the last one indicating a successfull write of a TOSBoot argument to the flash. * * @author Henrik Makitaavola */ generic module InternalFlashP(M16C62P_BLOCK block1, M16C62P_BLOCK block2) { provides interface InternalFlash; uses interface HplM16c60Flash as Flash; } implementation { #define INTERNAL_ADDRESS_1 m16c62p_block_start_addresses[block1] #define INTERNAL_ADDRESS_1_END m16c62p_block_end_addresses[block1] #define INTERNAL_ADDRESS_2 m16c62p_block_start_addresses[block2] #define INTERNAL_ADDRESS_2_END m16c62p_block_end_addresses[block2] #define INTERNAL_BLOCK_1 block1 #define INTERNAL_BLOCK_2 block2 error_t sanityCheck(uint16_t size) { if (call Flash.read(INTERNAL_ADDRESS_1) != 0xff && call Flash.read(INTERNAL_ADDRESS_2) != 0xff) { // Something happened last time we wrote with a erase command // that should have been executet or failed. if (call Flash.read(INTERNAL_ADDRESS_1+size+2) != 0x1) { if (call Flash.read(INTERNAL_ADDRESS_1+size+1) == 0x1) { return call Flash.erase(INTERNAL_BLOCK_2); } else { return call Flash.erase(INTERNAL_BLOCK_1); } } else { if (call Flash.read(INTERNAL_ADDRESS_2+size+1) == 0x1) { return call Flash.erase(INTERNAL_BLOCK_1); } else { return call Flash.erase(INTERNAL_BLOCK_2); } } } return SUCCESS; } error_t writableAddressInBlock(unsigned long start, unsigned long end, uint16_t size, unsigned long* address) { for(; (start < end) && (start+size < end); start += (unsigned long)size) { if (call Flash.read(start) == 0xFF) { if (call Flash.read(start-1) != 0x1) { return FAIL; } *address = start; return SUCCESS; } } return FAIL; } unsigned long writableAddress(uint16_t size) { if (call Flash.read(INTERNAL_ADDRESS_1) == 0xFF) { if (call Flash.read(INTERNAL_ADDRESS_2) == 0xFF) { return INTERNAL_ADDRESS_1; } else { unsigned long address; if (writableAddressInBlock(INTERNAL_ADDRESS_2, INTERNAL_ADDRESS_2_END, size+2, &address) == SUCCESS) { return address; } return INTERNAL_ADDRESS_1; } } else { unsigned long address; if (writableAddressInBlock(INTERNAL_ADDRESS_1, INTERNAL_ADDRESS_1_END, size+2, &address) == SUCCESS) { return address; } return INTERNAL_ADDRESS_2; } } command error_t InternalFlash.write(void* addr, void* buf, uint16_t size) { uint8_t wbuf[sizeof(BootArgs)+2]; unsigned long address; if (sanityCheck(size) != SUCCESS) { return FAIL; } wbuf[0] = 0x1; wbuf[size+1] = 0x1; memcpy(wbuf+1, buf, size); address = writableAddress(size); if (call Flash.write(address, (unsigned int*)wbuf, size+2) != 0) { return FAIL; } if (address == INTERNAL_ADDRESS_1) { return call Flash.erase(INTERNAL_BLOCK_2); } else if (address == INTERNAL_ADDRESS_2) { return call Flash.erase(INTERNAL_BLOCK_1); } return SUCCESS; } void readFromFlash(unsigned long address, uint8_t* buf, uint16_t size) { uint16_t i; for (i = 0; i < size; ++i, ++address) { buf[i] = call Flash.read(address); } } void readFromBlock(unsigned long start, unsigned long end, uint8_t *buffer, uint16_t size) { unsigned long address = start; for (; address < end; address += 2 + size) { if (call Flash.read(address) != 0x1) { break; } } for (; address > start; address -= size + 2) { if(call Flash.read(address+size+1) == 0x1) { break; } } if(call Flash.read(address+size+1) == 0x1) { address++; readFromFlash(address, buffer, size); } else { memset(buffer, 0xff, size); } } command error_t InternalFlash.read(void* addr, void* buf, uint16_t size) { uint8_t* buffer = (uint8_t*)buf; if (sanityCheck(size) != SUCCESS) { return FAIL; } if (call Flash.read(INTERNAL_ADDRESS_1) == 0xFF) { if (call Flash.read(INTERNAL_ADDRESS_2) == 0xFF) { memset(buf, 0xff, size); } else { readFromBlock(INTERNAL_ADDRESS_2, INTERNAL_ADDRESS_2_END, buffer, size); } } else { readFromBlock(INTERNAL_ADDRESS_1, INTERNAL_ADDRESS_1_END, buffer, size); } return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/m16c60/62p/M16c62pFlash.h000066400000000000000000000056021207233610700241650ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Defines for the program flash blocks on the M16c/62p. * * @author Henrik Makitaavola * @author Renesas */ #ifndef __M16C62PFLASH_H__ #define __M16C62PFLASH_H__ // User Block Area typedef enum { M16C62P_BLOCK_0 = 0, // 4KB: 0xFF000 - 0xFFFFF M16C62P_BLOCK_1 = 1, // 4KB: 0xFE000 - 0xFEFFF M16C62P_BLOCK_2 = 2, // 8KB: 0xFC000 - 0xFDFFF M16C62P_BLOCK_3 = 3, // 8KB: 0xFA000 - 0xFBFFF M16C62P_BLOCK_4 = 4, // 8KB: 0xF8000 - 0xF9FFF M16C62P_BLOCK_5 = 5, // 32KB: 0xF0000 - 0xF7FFF M16C62P_BLOCK_6 = 6, // 64KB: 0xE0000 - 0xEFFFF M16C62P_BLOCK_7 = 7, // 64KB: 0xD0000 - 0xDFFFF M16C62P_BLOCK_8 = 8, // 64KB: 0xC0000 - 0xCFFFF M16C62P_BLOCK_9 = 9, // 64KB: 0xB0000 - 0xBFFFF M16C62P_BLOCK_10 = 10, // 64KB: 0xA0000 - 0xAFFFF M16C62P_BLOCK_11 = 11, // 64KB: 0x90000 - 0x9FFFF M16C62P_BLOCK_12 = 12, // 64KB: 0x80000 - 0x8FFFF // Data Block Area M16C62P_BLOCK_A = 13 // 4KB: F000 - FFFF } M16C62P_BLOCK; const unsigned long m16c62p_block_start_addresses[14] = {0xFF000,0xFE000,0xFC000,0xFA000,0xF8000,0xF0000,0xE0000,0xD0000,0xC0000, 0xB0000,0xA0000,0x90000,0x80000,0xF000 }; const unsigned long m16c62p_block_end_addresses[14] = {0xFFFFF,0xFEFFF,0xFDFFF,0xFBFFF,0xF9FFF,0xF7FFF,0xEFFFF,0xDFFFF,0xCFFFF, 0xBFFFF,0xAFFFF,0x9FFFF,0x8FFFF,0xFFFF }; #endif // __M16C62PFLASH_H__ tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/m16c60/65/000077500000000000000000000000001207233610700216205ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/m16c60/65/HplM16c60FlashC.nc000066400000000000000000000216031207233610700245450ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the HplM16c60Flash interface. Note that this module * should be used with caution so that one doesn't erase the flash where the * executing program lies. * * @author Henrik Makitaavola * @author Renesas */ #include "M16c65Flash.h" #include "iom16c65.h" // TODO(henrik) This implementation expects a main clock speed <=10 MHz, fix it. module HplM16c60FlashC { provides interface HplM16c60Flash; } implementation { // Defines an array of highest even addresses for each block const unsigned long block_addresses[8] = {0xFFFFE,0xEFFFE,0xDFFFE,0xCFFFE,0xBFFFE,0xAFFFE,0x9FFFE,0x8FFFE}; unsigned char cm0_saved; // For saving the Clock Mode 0 register unsigned char cm1_saved; // For saving the Clock Mode 1 register unsigned char pm0_saved; // For saving the Processor Mode 0 register unsigned char pm1_saved; // For saving the Processor Mode 1 register unsigned char prcr_saved; // Save Protection register /** * Sets the processor mode for programming flash and saves current * settings to restore later. You cannot run the processor faster * than 10.0 MHz (with wait state) or 6.25MHz (without wait state) * when sending commands to the flash controller. */ void slowMCUClock(void) { // Unprotect registers CM0 and CM1 and PM0 registers by writting to protection register prcr_saved = PRCR.BYTE; // Save Protection register PRCR.BYTE = 3; // Allow writting to protected system registers // Force to Single chip mode for processors that have memory expansion mode pm0_saved = PM0.BYTE; // Save pm0 register PM0.BYTE = pm0_saved & 0xFC; // bit 0 and 1 to zero cm0_saved = CM0.BYTE; // Save cm0 register cm1_saved = CM1.BYTE; // Save cm1 register pm1_saved = PM1.BYTE; // Save pm1 register // Insert Wait state for all bus access (needed for talking to the // internal flash controller) PM1.BYTE = PM1.BYTE | 0x80; // Set bit PM17 //CM0.BYTE = 0; //CM1.BYTE = 0; } /** * Restores the processor mode back to original settings. */ void restoreMCUClock(void) { PM0.BYTE = pm0_saved; // Restore pm0 register /* Clock settings for R8C and M16C */ CM1.BYTE = cm1_saved; // Restore cm1 register CM0.BYTE = cm0_saved; // Restore cm0 register PM1.BYTE = pm1_saved; // Restore pm1 register PRCR.BYTE = prcr_saved; // Protection back on } /** * Disable and enable interrups macros. A call to * disableInterrupt must be followed by a call to RestoreInterrupt. */ #define disableInterrupt() \ { \ __nesc_atomic_t flg_saved; \ asm volatile ("stc flg, %0": "=r"(flg_saved): : "%flg"); \ asm("fclr i"); \ asm volatile("" : : : "memory"); #define restoreInterrupt() \ asm volatile("" : : : "memory"); \ asm volatile ("ldc %0, flg": : "r"(flg_saved): "%flg"); \ } void clearStatus(unsigned long addr) { unsigned int low = (unsigned int) addr; unsigned int high = (unsigned int)( addr >> 16); asm volatile ( "mov.w #0x0050, r3\n\t" "ste.w r3, [a1a0]\n\t" : : "Ra0"(low), "Ra1"(high) : "memory", "r3"); } bool writeWords(unsigned long addr, unsigned int word, unsigned int word2) { unsigned int low = (unsigned int) addr; unsigned int high = (unsigned int)( addr >> 16); unsigned int i = 0; for (i = 0; i < 3; ++i) { asm volatile ( "mov.w #0x0041, r3\n\t" // Send write command "ste.w r3, [a1a0]\n\t" "ste.w %[data], [a1a0]\n\t" "ste.w %[data2], [a1a0]\n\t" : :"Ra0"(low), "Ra1" (high), [data] "r" (word), [data2] "r" (word2) : "memory", "r3"); if (!FMR0.BIT.FMR06) { break; } clearStatus(addr); i++; } return !FMR0.BIT.FMR06; } command error_t HplM16c60Flash.erase( unsigned char block ) { unsigned int low = (unsigned int) block_addresses[ block ]; unsigned int high = (unsigned int)( block_addresses[ block ] >> 16); // Must change main clock speed to meet flash requirements disableInterrupt(); slowMCUClock(); FMR0.BIT.FMR01 = 0; FMR0.BIT.FMR01 = 1; FMR1.BIT.FMR11 = 0; FMR1.BIT.FMR11 = 1; FMR6.BYTE = 3; FMR1.BIT.FMR11 = 0; FMR0.BIT.FMR02 = 0; FMR0.BIT.FMR02 = 1; asm volatile ( "mov.w #0x0050, r3\n\t" // Clear status register "ste.w r3, [a1a0]\n\t" "mov.w #0x0020, r3\n\t" // Block Erase 1(2) "ste.w r3, [a1a0]\n\t" "mov.w #0x00D0, r3\n\t" // Block Erase 2(2) "ste.w r3, [a1a0]\n\t" : : "Ra0"(low), "Ra1"(high) : "memory", "r3"); // Note: In EW1 Mode, the MCU is suspended until the operation is completed. while (!FMR0.BIT.FMR00); // Disable CPU rewriting commands by clearing EW entry bit. FMR0.BYTE = 0; restoreMCUClock(); // Restore clock back to original speed restoreInterrupt(); if( FMR0.BIT.FMR07) // Erasing error? { return FAIL; // Erase Fail } return SUCCESS; // Erase Pass } command uint8_t HplM16c60Flash.write( unsigned long flash_addr, unsigned int * buffer_addr, unsigned int bytes) { error_t ret_value = SUCCESS; unsigned int i; unsigned long flash_addr_start = flash_addr; uint8_t* buf = (uint8_t*)buffer_addr; // Check for odd number of bytes & check for odd address if( bytes & 0x3 || (int)flash_addr & 0x3) return EINVAL; // ERROR!! You must always pass an even number of bytes. disableInterrupt(); // Must change main clock speed to meet flash requirements slowMCUClock(); FMR0.BIT.FMR01 = 0; FMR0.BIT.FMR01 = 1; FMR1.BIT.FMR11 = 0; FMR1.BIT.FMR11 = 1; FMR6.BYTE = 3; FMR1.BIT.FMR11 = 0; FMR0.BIT.FMR02 = 0; FMR0.BIT.FMR02 = 1; // Clear status register clearStatus(flash_addr); for (i = 0; i < (bytes >> 1); i += 2) { // Write to the flash sequencer by writing to that area of flash memory // The 65 series writes 4 bytes in each sequence. if (!writeWords(flash_addr, buffer_addr[i], buffer_addr[i+1])) { ret_value = FAIL; // Signal that we had got an error break; // Break out of for loop } flash_addr += 4; // Advance to next flash write address } // Disable CPU rewriting commands by clearing EW entry bit FMR0.BYTE = 0; restoreMCUClock(); // Restore clock back to original speed restoreInterrupt(); if (ret_value == SUCCESS) { // Do a readback to verify the content written for (i = 0; i < bytes; ++i) { if (call HplM16c60Flash.read(flash_addr_start + (unsigned long)i) != buf[i]) { return FAIL; } } } return ret_value; // Return Pass/Fail } command uint8_t HplM16c60Flash.read(unsigned long address) { unsigned int low = (unsigned int)(address); unsigned int high = (unsigned int)(address >> 16); unsigned int data; disableInterrupt(); asm volatile ( "mov.w #0x00FF, r3\n\t" // Read Array Command, once is enough but to be certain that // a Read Array Command has been executed do it before every // read for now. "ste.w r3, [a1a0]\n\t" "lde.w [a1a0], %[data]" :[data] "=r" (data) :"Ra0"(low), "Ra1"(high) : "memory", "r3"); restoreInterrupt(); return data; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/m16c60/65/InternalFlashC.nc000066400000000000000000000037771207233610700250150ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Wiring so that the M16c/65 InternalFlashP module gets access to the * HplM16c60FlashC module. * * @author Henrik Makitaavola */ #include "M16c65Flash.h" configuration InternalFlashC { provides interface InternalFlash; } implementation { components HplM16c60FlashC, new InternalFlashP(M16C65_BLOCK_1, M16C65_BLOCK_2); InternalFlashP.Flash -> HplM16c60FlashC; InternalFlash = InternalFlashP; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/m16c60/65/InternalFlashP.nc000066400000000000000000000164341207233610700250240ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the InternalFlash interface for the * M16c/65 mcu to be used as the TOSBoot arguments storage. * * The implementation uses 2 flash blocks to store the arguments into. First one * block is filled up or written to until a error occurs. After that the second block * will be written to. Everytime the start address of one block is written to the * otherone will be erased. If a erase is not executed due to powerdown or some other * error a erase command will be executed on that block the next time. * * A argument writing is surrounded by two 0x1 bytes: * 0x1 [arguments data] 0x1. The first byte indicating a new TOSBoot argument entry * and the last one indicating a successfull write of a TOSBoot argument to the flash. * * @author Henrik Makitaavola */ #include "M16c65Flash.h" generic module InternalFlashP(M16C65_BLOCK block1, M16C65_BLOCK block2) { provides interface InternalFlash; uses interface HplM16c60Flash as Flash; } implementation { #define INTERNAL_ADDRESS_1 m16c65_block_start_addresses[block1] #define INTERNAL_ADDRESS_1_END m16c65_block_end_addresses[block1] #define INTERNAL_ADDRESS_2 m16c65_block_start_addresses[block2] #define INTERNAL_ADDRESS_2_END m16c65_block_end_addresses[block2] #define INTERNAL_BLOCK_1 block1 #define INTERNAL_BLOCK_2 block2 error_t sanityCheck(uint16_t size) { if (call Flash.read(INTERNAL_ADDRESS_1) != 0xff && call Flash.read(INTERNAL_ADDRESS_2) != 0xff) { // Something happened last time we wrote with a erase command // that should have been executet or failed. if (call Flash.read(INTERNAL_ADDRESS_1+size+2) != 0x1) { if (call Flash.read(INTERNAL_ADDRESS_1+size+1) == 0x1) { return call Flash.erase(INTERNAL_BLOCK_2); } else { return call Flash.erase(INTERNAL_BLOCK_1); } } else { if (call Flash.read(INTERNAL_ADDRESS_2+size+1) == 0x1) { return call Flash.erase(INTERNAL_BLOCK_1); } else { return call Flash.erase(INTERNAL_BLOCK_2); } } } return SUCCESS; } error_t writableAddressInBlock(unsigned long start, unsigned long end, uint16_t size, unsigned long* address) { for(; (start < end) && (start+size < end); start += (unsigned long)size) { if (call Flash.read(start) == 0xFF) { if (call Flash.read(start-1) != 0x1) { return FAIL; } *address = start; return SUCCESS; } } return FAIL; } unsigned long writableAddress(uint16_t size) { if (call Flash.read(INTERNAL_ADDRESS_1) == 0xFF) { if (call Flash.read(INTERNAL_ADDRESS_2) == 0xFF) { return INTERNAL_ADDRESS_1; } else { unsigned long address; if (writableAddressInBlock(INTERNAL_ADDRESS_2, INTERNAL_ADDRESS_2_END, size+2, &address) == SUCCESS) { return address; } return INTERNAL_ADDRESS_1; } } else { unsigned long address; if (writableAddressInBlock(INTERNAL_ADDRESS_1, INTERNAL_ADDRESS_1_END, size+2, &address) == SUCCESS) { return address; } return INTERNAL_ADDRESS_2; } } command error_t InternalFlash.write(void* addr, void* buf, uint16_t size) { uint8_t wbuf[22+2]; unsigned long address; uint16_t write_size = size+2; memset(wbuf, 0x00, 24); // Pad the size to be dividable by 4. if (write_size & 0x3) { write_size += 4 - (write_size & 0x3); } write_size -= 2; if (sanityCheck(write_size) != SUCCESS) { return FAIL; } wbuf[0] = 0x1; wbuf[write_size+1] = 0x1; memcpy(wbuf+1, buf, size); address = writableAddress(write_size); if (call Flash.write(address, (unsigned int*)wbuf, write_size+2) != 0) { return FAIL; } if (address == INTERNAL_ADDRESS_1) { return call Flash.erase(INTERNAL_BLOCK_2); } else if (address == INTERNAL_ADDRESS_2) { return call Flash.erase(INTERNAL_BLOCK_1); } return SUCCESS; } void readFromFlash(unsigned long address, uint8_t* buf, uint16_t size) { uint16_t i; for (i = 0; i < size; ++i, ++address) { buf[i] = call Flash.read(address); } } void readFromBlock(unsigned long start, unsigned long end, uint8_t *buffer, uint16_t size, uint16_t section_size) { unsigned long address = start; for (; address < end; address += 2 + section_size) { if (call Flash.read(address) != 0x1) { break; } } for (; address > start; address -= section_size + 2) { if(call Flash.read(address+section_size+1) == 0x1) { break; } } if(call Flash.read(address+section_size+1) == 0x1) { address++; readFromFlash(address, buffer, size); } else { memset(buffer, 0xff, size); } } command error_t InternalFlash.read(void* addr, void* buf, uint16_t size) { uint8_t* buffer = (uint8_t*)buf; uint16_t read_size = size+2; // Pad the size to be dividable by 4. if (read_size & 0x3) { read_size += 4 - (read_size & 0x3); } read_size -= 2; if (sanityCheck(read_size) != SUCCESS) { return FAIL; } if (call Flash.read(INTERNAL_ADDRESS_1) == 0xFF) { if (call Flash.read(INTERNAL_ADDRESS_2) == 0xFF) { memset(buf, 0xff, size); } else { readFromBlock(INTERNAL_ADDRESS_2, INTERNAL_ADDRESS_2_END, buffer, size, read_size); } } else { readFromBlock(INTERNAL_ADDRESS_1, INTERNAL_ADDRESS_1_END, buffer, size, read_size); } return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/m16c60/65/M16c65Flash.h000066400000000000000000000050161207233610700236320ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Defines for the program flash blocks for M16c/65. * * @author Henrik Makitaavola * @author Renesas */ #ifndef __M16C65FLASH_H__ #define __M16C65FLASH_H__ // User Block Area typedef enum { M16C65_BLOCK_0 = 0, // 64KB: 0xF0000 - 0xFFFFF M16C65_BLOCK_1 = 1, // 64KB: 0xE0000 - 0xEFFFF M16C65_BLOCK_2 = 2, // 64KB: 0xD0000 - 0xDFFFF M16C65_BLOCK_3 = 3, // 64KB: 0xC0000 - 0xCFFFF M16C65_BLOCK_4 = 4, // 64KB: 0xB0000 - 0xBFFFF M16C65_BLOCK_5 = 5, // 64KB: 0xA0000 - 0xAFFFF M16C65_BLOCK_6 = 6, // 64KB: 0x90000 - 0x9FFFF M16C65_BLOCK_7 = 7, // 64KB: 0x80000 - 0x8FFFF // Data Block Area M16C65_BLOCK_A = 13 // 4KB: F000 - FFFF } M16C65_BLOCK; const unsigned long m16c65_block_start_addresses[8] = {0xF0000,0xE0000,0xD0000,0xC0000,0xB0000,0xA0000,0x90000,0x80000 }; const unsigned long m16c65_block_end_addresses[8] = {0xFFFFF,0xEFFFF,0xDFFFF,0xCFFFF,0xBFFFF,0xAFFFF,0x9FFFF,0x8FFFF }; #endif // __M16C65FLASH_H__ tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/m16c60/HplM16c60Flash.nc000066400000000000000000000055131207233610700242120ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to access the program flash of a M16c/60 mcu. * * @author Henrik Makitaavola */ interface HplM16c60Flash { /** * Erases a block in the program flash. * * @param block The block that should be erased. * @return SUCCESS if the erase succeeded without errors else FAIL. */ command error_t erase(unsigned char block); /** * Writes bytes into the program flash. * * @param flash_addr The program flash address where the write should begin. This MUST be an EVEN address. * @param buffer_addr The bytes that should be written to the address. * @param bytes The number of bytes that should be written. This MUST be an EVEN number. * @return FAIL if the flash control reported an error. EINVAL if the parameters that where passed contained an error * if everything went ok it returns SUCCESS. */ command error_t write(unsigned long flash_addr_in, unsigned int* buffer_addr, unsigned int bytes); /** * Reads the byte at am address using a LDE instruction. * * @param address The address that a byte should be read from. * @return Byte read. */ command uint8_t read(unsigned long flash_addr_in); } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/mica2/000077500000000000000000000000001207233610700214455ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/mica2/NetProg_platform.h000066400000000000000000000036471207233610700251120ustar00rootroot00000000000000// $Id: NetProg_platform.h,v 1.5 2010-06-29 22:07:47 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ #ifndef __NETPROG_PLATFORM_H__ #define __NETPROG_PLATFORM_H__ void netprog_reboot() { wdt_enable(1); while(1); } #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/micaz/000077500000000000000000000000001207233610700215555ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/micaz/InternalFlash.h000066400000000000000000000037721207233610700244710ustar00rootroot00000000000000// $Id: InternalFlash.h,v 1.3 2010-06-29 22:07:47 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * InternalFlash.h - Internal flash implementation for the avr * platform. * * Valid address range is 0x0 - 0xFFF. * * @author Jonathan Hui */ #ifndef __INTERNAL_FLASH_H__ #define __INTERNAL_FLASH_H__ #include #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/micaz/ReprogramGuardC.nc000066400000000000000000000003441207233610700251240ustar00rootroot00000000000000configuration ReprogramGuardC { provides interface ReprogramGuard; } implementation { components ReprogramGuardP; components new VoltageC(); ReprogramGuard = ReprogramGuardP; ReprogramGuardP.Voltage -> VoltageC; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/micaz/ReprogramGuardP.nc000066400000000000000000000006321207233610700251410ustar00rootroot00000000000000module ReprogramGuardP { provides interface ReprogramGuard; uses interface Read as Voltage; } implementation { enum { VTHRESH = 0x1CF, // 2.7V }; command error_t ReprogramGuard.okToProgram() { return call Voltage.read(); } event void Voltage.readDone(error_t result, uint16_t val) { signal ReprogramGuard.okToProgramDone(result == SUCCESS && val < VTHRESH); } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/micaz/TOSBoot_platform.h000066400000000000000000000042641207233610700251310ustar00rootroot00000000000000// $Id: TOSBoot_platform.h,v 1.4 2010-06-29 22:07:47 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui */ #ifndef __TOSBOOT_PLATFORM_H__ #define __TOSBOOT_PLATFORM_H__ enum { TOSBOOT_ARGS_ADDR = 0xff0, // address of TOSBoot args in internal flash TOSBOOT_GESTURE_MAX_COUNT = 3, // number of resets to force golden image TOSBOOT_GOLDEN_IMG_ADDR = 0x0L, // address of the golden image in external flash TOSBOOT_INT_PAGE_SIZE = SPM_PAGESIZE, // size of each internal program flash page }; #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/msp430/000077500000000000000000000000001207233610700215005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/msp430/InternalFlashC.nc000066400000000000000000000077071207233610700246720ustar00rootroot00000000000000// $Id: InternalFlashC.nc,v 1.4 2010-06-29 22:07:48 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * InternalFlashC.nc - Internal flash implementation for telos msp * platform. On the msp, the flash must first be erased before a value * can be written. However, the msp can only erase the flash at a * segment granularity (128 bytes for the information section). This * module allows transparent read/write of individual bytes to the * information section by dynamically switching between the two * provided segments in the information section. * * Valid address range is 0x1000 - 0x107E (0x107F is used to store the * version number of the information segment). * * @author Jonathan Hui */ module InternalFlashC { provides interface InternalFlash; } implementation { enum { IFLASH_OFFSET = 0x1000, IFLASH_SIZE = 128, IFLASH_SEG0_VNUM_ADDR = 0x107f, IFLASH_SEG1_VNUM_ADDR = 0x10ff, IFLASH_INVALID_VNUM = -1, }; uint8_t chooseSegment() { int8_t vnum0 = *(int8_t*)IFLASH_SEG0_VNUM_ADDR; int8_t vnum1 = *(int8_t*)IFLASH_SEG1_VNUM_ADDR; if (vnum0 == IFLASH_INVALID_VNUM) return 1; else if (vnum1 == IFLASH_INVALID_VNUM) return 0; return ( (int8_t)(vnum0 - vnum1) < 0 ); } command error_t InternalFlash.write(void* addr, void* buf, uint16_t size) { volatile int8_t *newPtr; int8_t *oldPtr; int8_t *bufPtr = (int8_t*)buf; int8_t version; uint16_t i; addr += IFLASH_OFFSET; newPtr = oldPtr = (int8_t*)IFLASH_OFFSET; if (chooseSegment()) { oldPtr += IFLASH_SIZE; } else { addr += IFLASH_SIZE; newPtr += IFLASH_SIZE; } FCTL2 = FWKEY + FSSEL1 + FN2; FCTL3 = FWKEY; FCTL1 = FWKEY + ERASE; *newPtr = 0; FCTL1 = FWKEY + WRT; for ( i = 0; i < IFLASH_SIZE-1; i++, newPtr++, oldPtr++ ) { if ((uint16_t)newPtr < (uint16_t)addr || (uint16_t)addr+size <= (uint16_t)newPtr) *newPtr = *oldPtr; else *newPtr = *bufPtr++; } version = *oldPtr + 1; if (version == IFLASH_INVALID_VNUM) version++; *newPtr = version; FCTL1 = FWKEY; FCTL3 = FWKEY + LOCK; return SUCCESS; } command error_t InternalFlash.read(void* addr, void* buf, uint16_t size) { addr += IFLASH_OFFSET; if (chooseSegment()) addr += IFLASH_SIZE; memcpy(buf, addr, size); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/mulle/000077500000000000000000000000001207233610700215705ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/mulle/NetProg_platform.h000066400000000000000000000036461207233610700252340ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This file contains the netprog_reboot function that * reboots the mcu. * * @author Henrik Makitaavola */ #ifndef __NETPROG_PLATFORM_H__ #define __NETPROG_PLATFORM_H__ void netprog_reboot() { PRCR.BIT.PRC1 = 1; // Turn off protection on PM registers. SET_BIT(PM0.BYTE, 3); } #endif // __NETPROG_PLATFORM_H__ tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/mulle/ReprogramGuardC.nc000066400000000000000000000033411207233610700251370ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ configuration ReprogramGuardC { provides interface ReprogramGuard; } implementation { components ReprogramGuardP; ReprogramGuard = ReprogramGuardP; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/mulle/ReprogramGuardP.nc000066400000000000000000000036041207233610700251560ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // TODO(henrik) implement. module ReprogramGuardP { provides interface ReprogramGuard; } implementation { enum { VTHRESH = 0x0, // 0V }; task void sendOk() { signal ReprogramGuard.okToProgramDone(true); } command error_t ReprogramGuard.okToProgram() { post sendOk(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/mulle/TOSBoot_platform.h000066400000000000000000000041751207233610700251450ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Henrik Makitaavola */ #ifndef __TOSBOOT_PLATFORM_H__ #define __TOSBOOT_PLATFORM_H__ enum { TOSBOOT_ARGS_ADDR = 0, // address of TOSBoot args in internal flash TOSBOOT_GESTURE_MAX_COUNT = 3, // number of resets to force golden image TOSBOOT_GOLDEN_IMG_ADDR = 0x0L, // address of the golden image in external flash TOSBOOT_INT_PAGE_SIZE = 512L, // size of each internal program flash page. Each page is 64Kbytes but it is better to split it into 128 parts (65536/512=128). }; #endif // __TOSBOOT_PLATFORM_H__ tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/telos/000077500000000000000000000000001207233610700216005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/telos/NetProg_platform.h000066400000000000000000000035521207233610700252400ustar00rootroot00000000000000// $Id: NetProg_platform.h,v 1.4 2010-06-29 22:07:48 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ #ifndef __NETPROG_PLATFORM_H__ #define __NETPROG_PLATFORM_H__ void netprog_reboot() { WDTCTL = WDT_ARST_1_9; while(1); } #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/telos/ReprogramGuardC.nc000066400000000000000000000005531207233610700251510ustar00rootroot00000000000000#include "Msp430Adc12.h" configuration ReprogramGuardC { provides interface ReprogramGuard; } implementation { components ReprogramGuardP; ReprogramGuard = ReprogramGuardP; components new Msp430Adc12ClientAutoRVGC() as Adc; Adc.AdcConfigure -> ReprogramGuardP.VoltageConfigure; ReprogramGuardP.Resource -> Adc; ReprogramGuardP.Sample -> Adc; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/telos/ReprogramGuardP.nc000066400000000000000000000026021207233610700251630ustar00rootroot00000000000000 #include module ReprogramGuardP { provides { interface ReprogramGuard; interface AdcConfigure as VoltageConfigure; } uses { interface Resource; interface Msp430Adc12SingleChannel as Sample; } } implementation { const msp430adc12_channel_config_t config = { inch: SUPPLY_VOLTAGE_HALF_CHANNEL, sref: REFERENCE_VREFplus_AVss, ref2_5v: REFVOLT_LEVEL_1_5, adc12ssel: SHT_SOURCE_ACLK, adc12div: SHT_CLOCK_DIV_1, sht: SAMPLE_HOLD_4_CYCLES, sampcon_ssel: SAMPCON_SOURCE_SMCLK, sampcon_id: SAMPCON_CLOCK_DIV_1 }; uint16_t voltage; enum { VTHRESH = 0xE66, // 2.7V }; task void sampleDone() { bool ok; atomic ok = (voltage > VTHRESH); signal ReprogramGuard.okToProgramDone(ok); } command error_t ReprogramGuard.okToProgram() { return call Resource.request(); } event void Resource.granted() { call Sample.configureSingle(&config); call Sample.getData(); } async event error_t Sample.singleDataReady(uint16_t data) { atomic voltage = data; call Resource.release(); post sampleDone(); return SUCCESS; } async event uint16_t * Sample.multipleDataReady(uint16_t *buffer, uint16_t numSamples) { return NULL; } async command const msp430adc12_channel_config_t* VoltageConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/telosb/000077500000000000000000000000001207233610700217425ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/telosb/ReprogramGuardC.nc000066400000000000000000000003441207233610700253110ustar00rootroot00000000000000configuration ReprogramGuardC { provides interface ReprogramGuard; } implementation { components ReprogramGuardP; components new VoltageC(); ReprogramGuard = ReprogramGuardP; ReprogramGuardP.Voltage -> VoltageC; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/telosb/ReprogramGuardP.nc000066400000000000000000000006321207233610700253260ustar00rootroot00000000000000module ReprogramGuardP { provides interface ReprogramGuard; uses interface Read as Voltage; } implementation { enum { VTHRESH = 0xE66, // 2.7V }; command error_t ReprogramGuard.okToProgram() { return call Voltage.read(); } event void Voltage.readDone(error_t result, uint16_t val) { signal ReprogramGuard.okToProgramDone(result == SUCCESS && val > VTHRESH); } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/telosb/TOSBoot_platform.h000066400000000000000000000041511207233610700253110ustar00rootroot00000000000000// $Id: TOSBoot_platform.h,v 1.4 2010-06-29 22:07:48 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui */ #ifndef __TOSBOOT_PLATFORM_H__ #define __TOSBOOT_PLATFORM_H__ enum { TOSBOOT_ARGS_ADDR = 0x70, // address of TOSBoot args in internal flash TOSBOOT_GESTURE_MAX_COUNT = 3, // number of resets to force golden image TOSBOOT_GOLDEN_IMG_ADDR = 0xf0000L, // address of the golden image in external flash TOSBOOT_INT_PAGE_SIZE = 512L, // size of each internal program flash page }; #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/tinynode/000077500000000000000000000000001207233610700223035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/tinynode/NetProg_platform.h000066400000000000000000000035521207233610700257430ustar00rootroot00000000000000// $Id: NetProg_platform.h,v 1.2 2010-06-29 22:07:48 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ #ifndef __NETPROG_PLATFORM_H__ #define __NETPROG_PLATFORM_H__ void netprog_reboot() { WDTCTL = WDT_ARST_1_9; while(1); } #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/tinynode/README000066400000000000000000000010371207233610700231640ustar00rootroot00000000000000Deluge T2 for TinyNode ---------------------------------- These files are needed by Deluge T2 to compile for the TinyNode platform. Note: Reprogramming fails if the voltage of the node is not above a given threshold. Currently, this is set to 2.7V, which may be too high if you run your mote on batteries. In this case, set the value of VTHRESH in the ReprogramGaurdP.nc file to a different value. In case you wish not to test the voltage at all, modify ReprogramGuardP.nc s.t. the command okToProgram() posts readDone with SUCCESS. tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/tinynode/ReprogramGuardC.nc000066400000000000000000000003441207233610700256520ustar00rootroot00000000000000configuration ReprogramGuardC { provides interface ReprogramGuard; } implementation { components ReprogramGuardP; components new VoltageC(); ReprogramGuard = ReprogramGuardP; ReprogramGuardP.Voltage -> VoltageC; } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/tinynode/ReprogramGuardP.nc000066400000000000000000000006231207233610700256670ustar00rootroot00000000000000module ReprogramGuardP { provides interface ReprogramGuard; uses interface Read as Voltage; } implementation { enum { VTHRESH = 0xE66, // 2.7V }; command error_t ReprogramGuard.okToProgram() { return call Voltage.read(); } event void Voltage.readDone(error_t result, uint16_t val) { signal ReprogramGuard.okToProgramDone(result == SUCCESS && val > VTHRESH); } } tinyos-2.1.2+dfsg/tos/lib/net/Deluge/extra/tinynode/TOSBoot_platform.h000066400000000000000000000041451207233610700256550ustar00rootroot00000000000000// $Id: TOSBoot_platform.h,v 1.2 2010-06-29 22:07:48 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui */ #ifndef __TOSBOOT_PLATFORM_H__ #define __TOSBOOT_PLATFORM_H__ enum { TOSBOOT_ARGS_ADDR = 0x70, // address of TOSBoot args in internal flash TOSBOOT_GESTURE_MAX_COUNT = 3, // number of resets to force golden image TOSBOOT_GOLDEN_IMG_ADDR = 0x0L, // address of the golden image in external flash TOSBOOT_INT_PAGE_SIZE = 512L, // size of each internal program flash page }; #endif tinyos-2.1.2+dfsg/tos/lib/net/Deluge/imgNum2volumeId.h000066400000000000000000000005321207233610700225230ustar00rootroot00000000000000#ifndef __IMGNUM2VOLUMEID_H__ #define __IMGNUM2VOLUMEID_H__ uint8_t _imgNum2volumeId[] = { VOLUME_GOLDENIMAGE, VOLUME_DELUGE1, VOLUME_DELUGE2, VOLUME_DELUGE3 }; enum { NON_DELUGE_VOLUME = 0xFF }; uint8_t imgNum2volumeId(uint8_t imgNum) { return imgNum < DELUGE_NUM_VOLUMES ? _imgNum2volumeId[imgNum] : NON_DELUGE_VOLUME; } #endif tinyos-2.1.2+dfsg/tos/lib/net/DisseminationUpdate.nc000066400000000000000000000052131207233610700224160ustar00rootroot00000000000000// $Id: DisseminationUpdate.nc,v 1.6 2010-06-29 22:07:47 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Update a network shared (disseminated) value. Updates are assured * to be eventually consistent across a connected network. If multiple * nodes update a value simultaneously, then nodes within the network * will see a series of one or more updates, the last update will * be the same for all nodes. Components that need to use the * variable should use the DisseminationValue interface. * * @author Philip Levis * @author Gilman Tolle * @date January 7 2006 */ interface DisseminationUpdate { /** * Update the variable to a new value. This changes the local copy * and begins to disseminate the new value throughout the network. * As other nodes may have also changed the variable, it is possible * that an update may not 'stick,' but will instead be overwritten by * a separate update. * * @param newVal A pointer to the new value. The memory pointed to * by newVal is copied out, so newVal can be reclaimed when * change returns. */ command void change(t* ONE newVal); } tinyos-2.1.2+dfsg/tos/lib/net/DisseminationValue.nc000066400000000000000000000051361207233610700222540ustar00rootroot00000000000000// $Id: DisseminationValue.nc,v 1.6 2010-06-29 22:07:47 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Read a network shared (disseminated) variable and be notified * of updates. * * @author Philip Levis * @author Gilman Tolle * * @date Jan 7 2006 */ interface DisseminationValue { /** * Obtain a pointer to the variable. The provider of this * interface only will change the memory the pointer references * in tasks. Therefore the memory region does not change during * the execution of any other task. A user of this interface * must not in any circumstance write to this memory location. * * @return A const pointer to the variable. */ command const t* get(); /** * Set the variable to a new value. The provider of this interface * will copy the value from the pointer. NOTE: This command does * not cause the new value to begin disseminating. It is intended to * be used for setting default values. */ command void set( const t* ); /** * Signalled whenever variable may have changed. */ event void changed(); } tinyos-2.1.2+dfsg/tos/lib/net/NeighborTableEviction.nc000066400000000000000000000036111207233610700226530ustar00rootroot00000000000000/* * "Copyright (c) 2006 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright. * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor * the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * REGENTS OF THE UNVERSITY OF CALIFORNIA OR ITS CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * Notify when a neighbor has been evicted from the neighbor table. * * @author Rodrigo Fonseca */ interface NeighborTableEviction { /** * Signals to users that the neighbor has been evicted from the table */ event void evicted(uint16_t neighbor) } tinyos-2.1.2+dfsg/tos/lib/net/README000066400000000000000000000005351207233610700170050ustar00rootroot00000000000000This directory contains network protocols that are part of the TinyOS core distribution. They are: ctp: Collection Tree Protocol (TEP 123), a collection (TEP 119) protocol drip: Drip, a dissemination (TEP 118) protocol le: Link Estimation Exchange Protocol (TEP 124) lqi: MultihopLQI, a collection (TEP 119) protocol, only works on CC2420 radio tinyos-2.1.2+dfsg/tos/lib/net/RootControl.nc000066400000000000000000000036701207233610700207360ustar00rootroot00000000000000/* $Id: RootControl.nc,v 1.4 2006-12-12 18:23:29 vlahan Exp $ */ /* * "Copyright (c) 2006 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright. * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor * the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * REGENTS OF THE UNVERSITY OF CALIFORNIA OR ITS CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** Controls whether the current node is a root of the tree * @author Rodrigo Fonseca * @date $Date: 2006-12-12 18:23:29 $ */ interface RootControl { command error_t setRoot(); command error_t unsetRoot(); command bool isRoot(); } tinyos-2.1.2+dfsg/tos/lib/net/SendVirtualizerP.nc000066400000000000000000000141261207233610700217220ustar00rootroot00000000000000// $Id: SendVirtualizerP.nc,v 1.3 2010-06-29 22:07:47 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A Send queue that provides a Service Instance pattern for formatted * packets and calls an underlying Send in a round-robin fashion. Used * to share L3 bandwidth between different communication clients. * * @author Philip Levis * @date April 6 2007 */ #include "AM.h" generic module SendVirtualizerP(int numClients) { provides interface Send[uint8_t client]; uses { interface Send as SubSend; interface Packet; } } implementation { typedef struct { message_t* msg; } queue_entry_t; uint8_t current = numClients; // mark as empty queue_entry_t queue[numClients]; uint8_t cancelMask[numClients/8 + 1]; void tryToSend(); void nextPacket() { uint8_t i; current = (current + 1) % numClients; for(i = 0; i < numClients; i++) { if((queue[current].msg == NULL) || (cancelMask[current/8] & (1 << current%8))) { current = (current + 1) % numClients; } else { break; } } if(i >= numClients) current = numClients; } /** * Accepts a properly formatted AM packet for later sending. * Assumes that someone has filled in the AM packet fields * (destination, AM type). * * @param msg - the message to send * @param len - the length of the payload * */ command error_t Send.send[uint8_t clientId](message_t* msg, uint8_t len) { if (clientId >= numClients) { return FAIL; } if (queue[clientId].msg != NULL) { return EBUSY; } dbg("AMQueue", "AMQueue: request to send from %hhu (%p): passed checks\n", clientId, msg); queue[clientId].msg = msg; call Packet.setPayloadLength(msg, len); if (current >= numClients) { // queue empty error_t err; current = clientId; err = call SubSend.send(msg, len); if (err != SUCCESS) { dbg("AMQueue", "%s: underlying send failed.\n", __FUNCTION__); current = numClients; queue[clientId].msg = NULL; } return err; } else { dbg("AMQueue", "AMQueue: request to send from %hhu (%p): queue not empty\n", clientId, msg); } return SUCCESS; } task void CancelTask() { uint8_t i,j,mask,last; message_t *msg; for(i = 0; i < numClients/8 + 1; i++) { if(cancelMask[i]) { for(mask = 1, j = 0; j < 8; j++) { if(cancelMask[i] & mask) { last = i*8 + j; msg = queue[last].msg; queue[last].msg = NULL; cancelMask[i] &= ~mask; signal Send.sendDone[last](msg, ECANCEL); } mask <<= 1; } } } } command error_t Send.cancel[uint8_t clientId](message_t* msg) { if (clientId >= numClients || // Not a valid client queue[clientId].msg == NULL || // No packet pending queue[clientId].msg != msg) { // Not the right packet return FAIL; } if(current == clientId) { error_t err = call SubSend.cancel(msg); return err; } else { cancelMask[clientId/8] |= 1 << clientId % 8; post CancelTask(); return SUCCESS; } } void sendDone(uint8_t last, message_t *msg, error_t err) { queue[last].msg = NULL; tryToSend(); signal Send.sendDone[last](msg, err); } task void errorTask() { sendDone(current, queue[current].msg, FAIL); } // NOTE: Increments current! void tryToSend() { nextPacket(); if (current < numClients) { // queue not empty error_t nextErr; message_t* nextMsg = queue[current].msg; uint8_t len = call Packet.payloadLength(nextMsg); nextErr = call SubSend.send(nextMsg, len); if(nextErr != SUCCESS) { post errorTask(); } } } event void SubSend.sendDone(message_t* msg, error_t err) { if(queue[current].msg == msg) { sendDone(current, msg, err); } else { dbg("PointerBug", "%s received send done for %p, signaling for %p.\n", __FUNCTION__, msg, queue[current].msg); } } command uint8_t Send.maxPayloadLength[uint8_t id]() { return call SubSend.maxPayloadLength(); } command void* Send.getPayload[uint8_t id](message_t* m, uint8_t len) { return call SubSend.getPayload(m, len); } default event void Send.sendDone[uint8_t id](message_t* msg, error_t err) { // Do nothing } } tinyos-2.1.2+dfsg/tos/lib/net/TrickleTimer.nc000066400000000000000000000070121207233610700210420ustar00rootroot00000000000000// $Id: TrickleTimer.nc,v 1.5 2010-06-29 22:07:47 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * A network trickle timer. A trickle timer has a period in the range * [L, H]. After firing, the period is doubled, up to H. If the period * is P, then the timer is scheduled to fire in the interval [0.5P, P] * (the second half of a period). The period can be reset to L (the * smallest period, and therefore the highest frequency). * * The timer may be suppressed. If a user of the interface has heard * enough packets from other nodes that indicate its transmitting a * packet would be unncessarily redundant, then the timer does not * fire. The timer has a constant K and a counter C. If C >e; K, then * the timer does not fire. When an interval ends, C is reset to 0. * Calling incrementCounter increments C by one. * * For details, refer to Levis et al., "A Self-Regulating Algorithm * for Code Maintenance and Propagation in Wireless Sensor Networks," * NSDI 2004. The component providing this interface defines the * constants L, H, and K. * * @author Philip Levis * @date Jan 7 2006 */ interface TrickleTimer { /** * Start the trickle timer. At boot, the timer period is its maximum * value (H). If a protocol requires starting at the minimum value * (e.g., fast start), then it should call reset before * start. * * @return error_t SUCCESS if the timer was started, EBUSY if it is already * running, and FAIL otherwise. */ command error_t start(); /** * Stop the trickle timer. This call sets the timer period to H and * C to 0. */ command void stop(); /** * Reset the timer period to L. If called while the timer is running, * then a new interval (of length L) begins immediately. */ command void reset(); /** * Increment the counter C. When an interval ends, C is set to 0. */ command void incrementCounter(); /** * The trickle timer has fired. Signaled if C > K. */ event void fired(); } tinyos-2.1.2+dfsg/tos/lib/net/TrickleTimerImplP.nc000066400000000000000000000205071207233610700220100ustar00rootroot00000000000000// $Id: TrickleTimerImplP.nc,v 1.8 2010-06-29 22:07:47 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Module that provides a service instance of trickle timers. For * details on the working of the parameters, please refer to Levis et * al., "A Self-Regulating Algorithm for Code Maintenance and * Propagation in Wireless Sensor Networks," NSDI 2004. * * @param l Lower bound of the time period in seconds. * @param h Upper bound of the time period in seconds. * @param k Redundancy constant. * @param count How many timers to provide. * * @author Philip Levis * @author Gilman Tolle * @date Jan 7 2006 */ #include generic module TrickleTimerImplP(uint16_t low, uint16_t high, uint8_t k, uint8_t count, uint8_t scale) { provides { interface Init; interface TrickleTimer[uint8_t id]; } uses { interface Timer; interface BitVector as Pending; interface BitVector as Changed; interface Random; interface Leds; } } implementation { typedef struct { uint16_t period; uint32_t time; uint32_t remainder; uint8_t count; } trickle_t; trickle_t trickles[count]; void adjustTimer(); void generateTime(uint8_t id); command error_t Init.init() { int i; for (i = 0; i < count; i++) { trickles[i].period = high; trickles[i].count = 0; trickles[i].time = 0; trickles[i].remainder = 0; } atomic { call Pending.clearAll(); call Changed.clearAll(); } return SUCCESS; } /** * Start a trickle timer. Reset the counter to 0. */ command error_t TrickleTimer.start[uint8_t id]() { if (trickles[id].time != 0) { return EBUSY; } trickles[id].time = 0; trickles[id].remainder = 0; trickles[id].count = 0; generateTime(id); atomic { call Changed.set(id); } adjustTimer(); dbg("Trickle", "Starting trickle timer %hhu @ %s\n", id, sim_time_string()); return SUCCESS; } /** * Stop the trickle timer. This call sets the timer period to H. */ command void TrickleTimer.stop[uint8_t id]() { trickles[id].time = 0; trickles[id].period = high; adjustTimer(); dbg("Trickle", "Stopping trickle timer %hhu @ %s\n", id, sim_time_string()); } /** * Reset the timer period to L. If called while the timer is running, * then a new interval (of length L) begins immediately. */ command void TrickleTimer.reset[uint8_t id]() { trickles[id].period = low; trickles[id].count = 0; if (trickles[id].time != 0) { dbg("Trickle", "Resetting running trickle timer %hhu @ %s\n", id, sim_time_string()); atomic { call Changed.set(id); } trickles[id].time = 0; trickles[id].remainder = 0; generateTime(id); adjustTimer(); } else { dbg("Trickle", "Resetting trickle timer %hhu @ %s\n", id, sim_time_string()); } } /** * Increment the counter C. When an interval ends, C is set to 0. */ command void TrickleTimer.incrementCounter[uint8_t id]() { trickles[id].count++; } task void timerTask() { uint8_t i; for (i = 0; i < count; i++) { bool fire = FALSE; atomic { if (call Pending.get(i)) { call Pending.clear(i); fire = TRUE; } } if (fire) { dbg("Trickle", "Firing trickle timer %hhu @ %s\n", i, sim_time_string()); signal TrickleTimer.fired[i](); post timerTask(); return; } } } /** * The trickle timer has fired. Signaled if C > K. */ event void Timer.fired() { uint8_t i; uint32_t dt = call Timer.getdt(); dbg("Trickle", "Trickle Sub-timer fired\n"); for (i = 0; i < count; i++) { uint32_t remaining = trickles[i].time; if (remaining != 0) { remaining -= dt; if (remaining == 0) { if (trickles[i].count < k) { atomic { dbg("Trickle", "Trickle: mark timer %hhi as pending\n", i); call Pending.set(i); } post timerTask(); } call Changed.set(i); generateTime(i); /* Note that this logic is not the exact trickle algorithm. * Rather than C being reset at the beginning of an interval, * it is being reset at a firing point. This means that the * listening period, rather than of length tau/2, is in the * range [tau/2, tau]. */ trickles[i].count = 0; } } } adjustTimer(); } // This is where all of the work is done! void adjustTimer() { uint8_t i; uint32_t lowest = 0; bool set = FALSE; // How much time has elapsed on the current timer // since it was scheduled? This value is needed because // the time remaining of a running timer is its time // value minus time elapsed. uint32_t elapsed = (call Timer.getNow() - call Timer.gett0()); for (i = 0; i < count; i++) { uint32_t timeRemaining = trickles[i].time; dbg("Trickle", "Adjusting: timer %hhi (%u)\n", i, timeRemaining); if (timeRemaining == 0) { // Not running, go to next timer continue; } atomic { if (!call Changed.get(i)) { if (timeRemaining > elapsed) { dbg("Trickle", " not changed, elapse time remaining to %u.\n", trickles[i].time - elapsed); timeRemaining -= elapsed; trickles[i].time -= elapsed; } else { // Time has already passed, so fire immediately dbg("Trickle", " not changed, ready to elapse, fire immediately\n"); timeRemaining = 1; trickles[i].time = 1; } } else { dbg("Trickle", " changed, fall through.\n"); call Changed.clear(i); } } if (!set) { lowest = timeRemaining; set = TRUE; } else if (timeRemaining < lowest) { lowest = timeRemaining; } } if (set) { uint32_t timerVal = lowest; dbg("Trickle", "Starting sub-timer with interval %u.\n", timerVal); call Timer.startOneShot(timerVal); } else { call Timer.stop(); } } /* Generate a new firing time for a timer. if the timer was already * running (time != 0), then double the period. */ void generateTime(uint8_t id) { uint32_t newTime; uint16_t rval; if (trickles[id].time != 0) { trickles[id].period *= 2; if (trickles[id].period > high) { trickles[id].period = high; } } trickles[id].time = trickles[id].remainder; newTime = trickles[id].period; newTime = newTime << (scale - 1); rval = call Random.rand16() % (trickles[id].period << (scale - 1)); newTime += rval; trickles[id].remainder = (((uint32_t)trickles[id].period) << scale) - newTime; trickles[id].time += newTime; dbg("Trickle,TrickleTimes", "Generated time for %hhu with period %hu (%u) is %u (%i + %hu)\n", id, trickles[id].period, (uint32_t)trickles[id].period << scale, trickles[id].time, (trickles[id].period << (scale - 1)), rval); } default event void TrickleTimer.fired[uint8_t id]() { return; } } tinyos-2.1.2+dfsg/tos/lib/net/TrickleTimerMilliC.nc000066400000000000000000000056001207233610700221350ustar00rootroot00000000000000// $Id: TrickleTimerMilliC.nc,v 1.5 2010-06-29 22:07:47 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Configuration that encapsulates the trickle timer implementation to * its needed services and initialization. For details on the working * of the parameters, please refer to Levis et al., "A Self-Regulating * Algorithm for Code Maintenance and Propagation in Wireless Sensor * Networks," NSDI 2004. * * @param l Lower bound of the time period in seconds. * @param h Upper bound of the time period in seconds. * @param k Redundancy constant. * @param count How many timers to provide. * * @author Philip Levis * @author Gilman Tolle * @date Jan 7 2006 */ generic configuration TrickleTimerMilliC(uint16_t low, uint16_t high, uint8_t k, uint8_t count) { provides interface TrickleTimer[uint8_t]; } implementation { components new TrickleTimerImplP(low, high, k, count, 10), MainC, RandomC; components new TimerMilliC(); components new BitVectorC(count) as PendingVector; components new BitVectorC(count) as ChangeVector; components LedsC; TrickleTimer = TrickleTimerImplP; TrickleTimerImplP.Timer -> TimerMilliC; TrickleTimerImplP.Random -> RandomC; TrickleTimerImplP.Changed -> ChangeVector; TrickleTimerImplP.Pending -> PendingVector; TrickleTimerImplP.Leds -> LedsC; MainC.SoftwareInit -> TrickleTimerImplP; } tinyos-2.1.2+dfsg/tos/lib/net/UARTDebugSenderP.nc000066400000000000000000000152561207233610700214600ustar00rootroot00000000000000#include module UARTDebugSenderP { provides { interface CollectionDebug; } uses { interface Boot; interface Pool as MessagePool; interface Queue as SendQueue; interface AMSend as UARTSend; } } implementation { message_t uartPacket; bool sending; uint8_t len; uint16_t statLogReceived = 0; uint16_t statEnqueueFail = 0; uint16_t statSendFail = 0; uint16_t statSendDoneFail = 0; uint16_t statSendDoneOk = 0; uint16_t statSendDoneBug = 0; event void Boot.booted() { sending = FALSE; len = sizeof(CollectionDebugMsg); statSendFail = 0; statLogReceived = 0; statEnqueueFail = 0; statSendDoneOk = 0; statSendDoneFail = 0; statSendDoneBug = 0; } task void sendTask() { if (sending) { return; } else if (call SendQueue.empty()) { return; } else { message_t* smsg = call SendQueue.head(); error_t eval = call UARTSend.send(AM_BROADCAST_ADDR, smsg, len); if (eval == SUCCESS) { sending = TRUE; return; } else { //Drop packet. Don't retry. statSendFail++; call SendQueue.dequeue(); call MessagePool.put(smsg); if (! call SendQueue.empty()) post sendTask(); } } } event void UARTSend.sendDone(message_t *msg, error_t error) { message_t* qh = call SendQueue.head(); if (qh == NULL || qh != msg) { //bad mojo statSendDoneBug++; } else { call SendQueue.dequeue(); call MessagePool.put(msg); if (error == SUCCESS) statSendDoneOk++; else statSendDoneFail++; } sending = FALSE; if (!call SendQueue.empty()) post sendTask(); } command error_t CollectionDebug.logEvent(uint8_t type) { statLogReceived++; if (call MessagePool.empty()) { return FAIL; } else { message_t* msg = call MessagePool.get(); CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg, sizeof(CollectionDebugMsg)); if (dbg_msg == NULL) { return FAIL; } memset(dbg_msg, 0, len); dbg_msg->type = type; dbg_msg->seqno = statLogReceived; if (call SendQueue.enqueue(msg) == SUCCESS) { post sendTask(); return SUCCESS; } else { statEnqueueFail++; call MessagePool.put(msg); return FAIL; } } } /* Used for FE_SENT_MSG, FE_RCV_MSG, FE_FWD_MSG, FE_DST_MSG */ command error_t TRUSTEDBLOCK CollectionDebug.logEventMsg(uint8_t type, uint16_t msg_id, am_addr_t origin, am_addr_t node) { statLogReceived++; if (call MessagePool.empty()) { return FAIL; } else { message_t* msg = call MessagePool.get(); CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg, sizeof(CollectionDebugMsg)); if (dbg_msg == NULL) { return FAIL; } memset(dbg_msg, 0, len); dbg_msg->type = type; dbg_msg->data.msg.msg_uid = msg_id; dbg_msg->data.msg.origin = origin; dbg_msg->data.msg.other_node = node; dbg_msg->seqno = statLogReceived; if (call SendQueue.enqueue(msg) == SUCCESS) { post sendTask(); return SUCCESS; } else { statEnqueueFail++; call MessagePool.put(msg); return FAIL; } } } /* Used for TREE_NEW_PARENT, TREE_ROUTE_INFO */ command error_t TRUSTEDBLOCK CollectionDebug.logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t metric) { statLogReceived++; if (call MessagePool.empty()) { return FAIL; } else { message_t* msg = call MessagePool.get(); CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg, sizeof(CollectionDebugMsg)); if (dbg_msg == NULL) { return FAIL; } memset(dbg_msg, 0, len); dbg_msg->type = type; dbg_msg->data.route_info.parent = parent; dbg_msg->data.route_info.hopcount = hopcount; dbg_msg->data.route_info.metric = metric; dbg_msg->seqno = statLogReceived; if (call SendQueue.enqueue(msg) == SUCCESS) { post sendTask(); return SUCCESS; } else { statEnqueueFail++; call MessagePool.put(msg); return FAIL; } } } /* Used for DBG_1 */ command error_t CollectionDebug.logEventSimple(uint8_t type, uint16_t arg) { statLogReceived++; if (call MessagePool.empty()) { return FAIL; } else { message_t* msg = call MessagePool.get(); CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg, sizeof(CollectionDebugMsg)); if (dbg_msg == NULL) { return FAIL; } memset(dbg_msg, 0, len); dbg_msg->type = type; dbg_msg->data.arg = arg; dbg_msg->seqno = statLogReceived; if (call SendQueue.enqueue(msg) == SUCCESS) { post sendTask(); return SUCCESS; } else { statEnqueueFail++; call MessagePool.put(msg); return FAIL; } } } /* Used for DBG_2, DBG_3 */ command TRUSTEDBLOCK error_t CollectionDebug.logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3) { statLogReceived++; if (call MessagePool.empty()) { return FAIL; } else { message_t* msg = call MessagePool.get(); CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg, sizeof(CollectionDebugMsg)); if (dbg_msg == NULL) { return FAIL; } memset(dbg_msg, 0, len); dbg_msg->type = type; dbg_msg->data.dbg.a = arg1; dbg_msg->data.dbg.b = arg2; dbg_msg->data.dbg.c = arg3; dbg_msg->seqno = statLogReceived; if (call SendQueue.enqueue(msg) == SUCCESS) { post sendTask(); return SUCCESS; } else { statEnqueueFail++; call MessagePool.put(msg); return FAIL; } } } } tinyos-2.1.2+dfsg/tos/lib/net/UnicastNameFreeRouting.nc000066400000000000000000000043051207233610700230270ustar00rootroot00000000000000/* $Id: UnicastNameFreeRouting.nc,v 1.4 2006-12-12 18:23:29 vlahan Exp $ */ /* * "Copyright (c) 2006 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright. * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor * the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * REGENTS OF THE UNVERSITY OF CALIFORNIA OR ITS CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * Provides a single next hop on a name-free protocol. * * @author Philip Levis * @date $Date: 2006-12-12 18:23:29 $ */ interface UnicastNameFreeRouting { /** * Get the address of the best next hop set to the destination. * If there is not best next hop, the address is the local address. * @return : The next best hop, or the local address if there is no route. */ command am_addr_t nextHop(); command bool hasRoute(); event void routeFound(); event void noRoute(); } tinyos-2.1.2+dfsg/tos/lib/net/blip/000077500000000000000000000000001207233610700170505ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/blip/BlipStatistics.h000066400000000000000000000060551207233610700221700ustar00rootroot00000000000000/* * "Copyright (c) 2008, 2009 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #ifndef _BLIP_STATISTICS_H_ #define _BLIP_STATISTICS_H_ /* Different IP components provide statistics about their operation. * * Structures with this information is available here. */ #ifdef BLIP_STATS // if we get rid of the increments the compiler can optimize out the // statistics data structures when we don't use them. #define BLIP_STATS_INCR(X) X++ #else #define BLIP_STATS_INCR(X) #endif /* Statistics from the core 6lowpan/IPv6 fragmentation and forwarding engine */ typedef nx_struct { nx_uint16_t sent; // total IP datagrams sent nx_uint16_t forwarded; // total IP datagrams forwarded nx_uint8_t rx_drop; // L2 frags dropped due to 6lowpan failure nx_uint8_t tx_drop; // L2 frags dropped due to link failures nx_uint8_t fw_drop; // L2 frags dropped when forwarding due to queue overflow nx_uint8_t rx_total; // L2 frags received nx_uint8_t encfail; // frags dropped due to send queue #ifdef BLIP_STATS_IP_MEM // statistics about free memory // mostly useful for looking for memory leaks, or looking at // forwarding queue depth. nx_uint8_t fragpool; // free fragments in pool nx_uint8_t sendinfo; // free sendinfo structures nx_uint8_t sendentry; // free send entryies nx_uint8_t sndqueue; // free send queue entries nx_uint16_t heapfree; // available free space in the heap #endif } ip_statistics_t; typedef nx_struct { nx_uint8_t hop_limit; nx_uint16_t parent; nx_uint16_t parent_metric; nx_uint16_t parent_etx; } route_statistics_t; typedef nx_struct { nx_uint8_t sol_rx; nx_uint8_t sol_tx; nx_uint8_t adv_rx; nx_uint8_t adv_tx; nx_uint8_t echo_rx; nx_uint8_t echo_tx; nx_uint8_t unk_rx; nx_uint16_t rx; } icmp_statistics_t; /* Statistics from the UDP transport protocol */ typedef nx_struct { nx_uint16_t sent; // UDP datagrams sent from app nx_uint16_t rcvd; // UDP datagrams delivered to apps nx_uint16_t cksum; // UDP datagrams dropped due to checksum error } udp_statistics_t; #endif tinyos-2.1.2+dfsg/tos/lib/net/blip/IPAddressC.nc000066400000000000000000000024151207233610700213150ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ configuration IPAddressC { provides interface IPAddress; } implementation { components IPAddressP, Ieee154AddressC; IPAddress = IPAddressP; IPAddressP.Ieee154Address -> Ieee154AddressC; } tinyos-2.1.2+dfsg/tos/lib/net/blip/IPAddressP.nc000066400000000000000000000124361207233610700213360ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #include #include module IPAddressP { provides { interface IPAddress; } uses { interface Ieee154Address; } } implementation { bool m_valid_addr = FALSE, m_short_addr = FALSE; struct in6_addr m_addr; command bool IPAddress.getLLAddr(struct in6_addr *addr) { ieee154_panid_t panid = letohs(call Ieee154Address.getPanId()); ieee154_saddr_t saddr = letohs(call Ieee154Address.getShortAddr()); ieee154_laddr_t laddr = call Ieee154Address.getExtAddr(); memclr(addr->s6_addr, 16); addr->s6_addr16[0] = htons(0xfe80); if (m_short_addr) { addr->s6_addr16[4] = htons(panid); addr->s6_addr16[5] = htons(0x00FF); addr->s6_addr16[6] = htons(0xFE00); addr->s6_addr16[7] = htons(saddr); addr->s6_addr[8] &= ~0x2; /* unset U bit */ } else { int i; for (i = 0; i < 8; i++) addr->s6_addr[8+i] = laddr.data[7-i]; addr->s6_addr[8] ^= 0x2; /* toggle U/L bit */ } return TRUE; } command bool IPAddress.getGlobalAddr(struct in6_addr *addr) { *addr = m_addr; return m_valid_addr; } command bool IPAddress.setSource(struct ip6_hdr *hdr) { enum { LOCAL, GLOBAL } type = GLOBAL; if (hdr->ip6_dst.s6_addr[0] == 0xff) { // link-local multicast sent from local address if ((hdr->ip6_dst.s6_addr[1] & 0x0f) <= 0x2) { type = LOCAL; } } else if (hdr->ip6_dst.s6_addr[0] == 0xfe) { // link-local destinations sent from link-local if ((hdr->ip6_dst.s6_addr[1] & 0xf0) <= 0x80) { type = LOCAL; } } if (type == LOCAL) { return call IPAddress.getLLAddr(&hdr->ip6_src); } else { return call IPAddress.getGlobalAddr(&hdr->ip6_src); } } command bool IPAddress.isLocalAddress(struct in6_addr *addr) { ieee154_panid_t panid = letohs(call Ieee154Address.getPanId()); ieee154_saddr_t saddr = letohs(call Ieee154Address.getShortAddr()); ieee154_laddr_t eui = call Ieee154Address.getExtAddr(); if (addr->s6_addr16[0] == htons(0xfe80)) { // link-local if (m_short_addr && addr->s6_addr16[5] == htons(0x00FF) && addr->s6_addr16[6] == htons(0xFE00)) { if (ntohs(addr->s6_addr16[4]) == (panid & ~0x200) && ntohs(addr->s6_addr16[7]) == saddr) { return TRUE; } else { return FALSE; } } return (addr->s6_addr[8] == (eui.data[7] ^ 0x2) && /* invert U/L bit */ addr->s6_addr[9] == eui.data[6] && addr->s6_addr[10] == eui.data[5] && addr->s6_addr[11] == eui.data[4] && addr->s6_addr[12] == eui.data[3] && addr->s6_addr[13] == eui.data[2] && addr->s6_addr[14] == eui.data[1] && addr->s6_addr[15] == eui.data[0]); } else if (addr->s6_addr[0] == 0xff) { // multicast if ((addr->s6_addr[1] & 0x0f) <= 2) { // accept all LL multicast messages return TRUE; } } else if (memcmp(addr->s6_addr, m_addr.s6_addr, 16) == 0) { return TRUE; } return FALSE; } /* Check if the address needs routing or of it's link local in scope */ command bool IPAddress.isLLAddress(struct in6_addr *addr) { if (addr->s6_addr16[0] == htons(0xfe80) || (addr->s6_addr[0] == 0xff && (addr->s6_addr[1] & 0x0f) <= 2)) return TRUE; return FALSE; } command error_t IPAddress.setAddress(struct in6_addr *addr) { m_addr = *addr; #ifdef BLIP_DERIVE_SHORTADDRS if (m_addr.s6_addr[8] == 0 && m_addr.s6_addr[9] == 0 && m_addr.s6_addr[10] == 0 && m_addr.s6_addr[11] == 0 && m_addr.s6_addr[12] == 0 && m_addr.s6_addr[13] == 0) { call Ieee154Address.setShortAddr(ntohs(m_addr.s6_addr16[7])); m_short_addr = TRUE; } else { call Ieee154Address.setShortAddr(0); m_short_addr = FALSE; } #endif m_valid_addr = TRUE; signal IPAddress.changed(TRUE); return SUCCESS; } command error_t IPAddress.removeAddress() { m_valid_addr = FALSE; m_short_addr = FALSE; call Ieee154Address.setShortAddr(0); signal IPAddress.changed(FALSE); return SUCCESS; } event void Ieee154Address.changed() {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/IPDispatch.h000066400000000000000000000037661207233610700212250ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #ifndef _IPDISPATCH_H_ #define _IPDISPATCH_H_ #include enum { N_RECONSTRUCTIONS = 3, /* number of concurrent reconstructions */ N_CONCURRENT_SENDS = 3, /* number of concurrent sends */ N_FRAGMENTS = 12, /* number of link-layer fragments to buffer */ }; struct send_info { void *upper_data; /* reference to the data field of IPLower.send */ uint8_t link_fragments; /* how many fragments the packet was split into */ uint8_t link_transmissions; /* how many total link transmissions were required */ uint8_t link_fragment_attempts; /* how many fragments we tried */ bool failed; /* weather the link reported that the transmission succeed*/ uint8_t _refcount; }; struct send_entry { struct send_info *info; message_t *msg; }; #ifndef BLIP_L2_RETRIES #define BLIP_L2_RETRIES 5 #endif #ifndef BLIP_L2_DELAY #define BLIP_L2_DELAY 103 #endif #endif tinyos-2.1.2+dfsg/tos/lib/net/blip/IPDispatchC.nc000066400000000000000000000066231207233610700214740ustar00rootroot00000000000000/* * "Copyright (c) 2008-2011 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ /** * * */ #include "IPDispatch.h" #include "BlipStatistics.h" configuration IPDispatchC { provides { interface SplitControl; interface IPLower; interface BlipStatistics; } } implementation { components MainC; components NoLedsC as LedsC; /* IPDispatchP wiring -- fragment rassembly and lib6lowpan bindings */ components IPDispatchP; components CC2420RadioC as MessageC; components ReadLqiC; components new TimerMilliC(); SplitControl = IPDispatchP.SplitControl; IPLower = IPDispatchP; BlipStatistics = IPDispatchP; IPDispatchP.Boot -> MainC; /* #else */ /* components ResourceSendP; */ /* ResourceSendP.SubSend -> MessageC; */ /* ResourceSendP.Resource -> MessageC.SendResource[unique("RADIO_SEND_RESOURCE")]; */ /* IPDispatchP.Ieee154Send -> ResourceSendP.Ieee154Send; */ /* #endif */ IPDispatchP.RadioControl -> MessageC; IPDispatchP.BarePacket -> MessageC.BarePacket; IPDispatchP.Ieee154Send -> MessageC.BareSend; IPDispatchP.Ieee154Receive -> MessageC.BareReceive; #ifdef LOW_POWER_LISTENING IPDispatchP.LowPowerListening -> MessageC; #endif MainC.SoftwareInit -> IPDispatchP.Init; IPDispatchP.PacketLink -> MessageC; IPDispatchP.ReadLqi -> ReadLqiC; IPDispatchP.Leds -> LedsC; IPDispatchP.ExpireTimer -> TimerMilliC; components new PoolC(message_t, N_FRAGMENTS) as FragPool; components new PoolC(struct send_entry, N_FRAGMENTS) as SendEntryPool; components new QueueC(struct send_entry *, N_FRAGMENTS); components new PoolC(struct send_info, N_CONCURRENT_SENDS) as SendInfoPool; IPDispatchP.FragPool -> FragPool; IPDispatchP.SendEntryPool -> SendEntryPool; IPDispatchP.SendInfoPool -> SendInfoPool; IPDispatchP.SendQueue -> QueueC; components IPNeighborDiscoveryP; IPDispatchP.NeighborDiscovery -> IPNeighborDiscoveryP; /* components ICMPResponderC; */ /* #ifdef BLIP_MULTICAST */ /* components MulticastP; */ /* components new TrickleTimerMilliC(2, 30, 2, 1); */ /* IP = MulticastP.IP; */ /* MainC.SoftwareInit -> MulticastP.Init; */ /* MulticastP.MulticastRx -> IPDispatchP.Multicast; */ /* MulticastP.HopHeader -> IPExtensionP.HopByHopExt[0]; */ /* MulticastP.TrickleTimer -> TrickleTimerMilliC.TrickleTimer[0]; */ /* MulticastP.IPExtensions -> IPDispatchP; */ /* #endif */ #ifdef DELUGE components NWProgC; #endif } tinyos-2.1.2+dfsg/tos/lib/net/blip/IPDispatchP.nc000066400000000000000000000473761207233610700215230ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #include #include #include #include #include #include #include "blip_printf.h" #include "IPDispatch.h" #include "BlipStatistics.h" #include "table.h" /* * Provides IP layer reception to applications on motes. * * @author Stephen Dawson-Haggerty */ module IPDispatchP { provides { interface SplitControl; // interface for protocols not requiring special hand-holding interface IPLower; interface BlipStatistics; } uses { interface Boot; /* link-layer wiring */ interface SplitControl as RadioControl; interface Packet as BarePacket; interface Send as Ieee154Send; interface Receive as Ieee154Receive; /* context lookup */ interface NeighborDiscovery; interface ReadLqi; interface PacketLink; interface LowPowerListening; /* buffers for outgoing fragments */ interface Pool as FragPool; interface Pool as SendInfoPool; interface Pool as SendEntryPool; interface Queue as SendQueue; /* expire reconstruction */ interface Timer as ExpireTimer; interface Leds; } provides interface Init; } implementation { #define HAVE_LOWPAN_EXTERN_MATCH_CONTEXT int lowpan_extern_read_context(struct in6_addr *addr, int context) { return call NeighborDiscovery.getContext(context, addr); } int lowpan_extern_match_context(struct in6_addr *addr, uint8_t *ctx_id) { return call NeighborDiscovery.matchContext(addr, ctx_id); } // generally including source files like this is a no-no. I'm doing // this in the hope that the optimizer will do a better job when // they're part of a component. #include #include #include #include enum { S_RUNNING, S_STOPPED, S_STOPPING, }; uint8_t state = S_STOPPED; bool radioBusy; uint8_t current_local_label = 0; ip_statistics_t stats; // this in theory could be arbitrarily large; however, it needs to // be large enough to hold all active reconstructions, and any tags // which we are dropping. It's important to keep dropped tags // around for a while, or else there are pathological situations // where you continually allocate buffers for packets which will // never complete. //////////////////////////////////////// // // table_t recon_cache; // table of packets we are currently receiving fragments from, that // are destined to us struct lowpan_reconstruct recon_data[N_RECONSTRUCTIONS]; // // //////////////////////////////////////// // task void sendTask(); void reconstruct_clear(void *ent) { struct lowpan_reconstruct *recon = (struct lowpan_reconstruct *)ent; memclr((uint8_t *)&recon->r_meta, sizeof(struct ip6_metadata)); recon->r_timeout = T_UNUSED; recon->r_buf = NULL; } struct send_info *getSendInfo() { struct send_info *ret = call SendInfoPool.get(); if (ret == NULL) return ret; ret->_refcount = 1; ret->upper_data = NULL; ret->failed = FALSE; ret->link_transmissions = 0; ret->link_fragments = 0; ret->link_fragment_attempts = 0; return ret; } #define SENDINFO_INCR(X) ((X)->_refcount)++ void SENDINFO_DECR(struct send_info *si) { if (--(si->_refcount) == 0) { call SendInfoPool.put(si); } } command error_t SplitControl.start() { return call RadioControl.start(); } command error_t SplitControl.stop() { if (!radioBusy) { state = S_STOPPED; return call RadioControl.stop(); } else { // if there's a packet in the radio, wait for it to exit before // stopping state = S_STOPPING; return SUCCESS; } } event void RadioControl.startDone(error_t error) { #ifdef LPL_SLEEP_INTERVAL call LowPowerListening.setLocalWakeupInterval(LPL_SLEEP_INTERVAL); #endif if (error == SUCCESS) { call Leds.led2Toggle(); call ExpireTimer.startPeriodic(FRAG_EXPIRE_TIME); state = S_RUNNING; radioBusy = FALSE; } signal SplitControl.startDone(error); } event void RadioControl.stopDone(error_t error) { signal SplitControl.stopDone(error); } command error_t Init.init() { // ip_malloc_init needs to be in init, not booted, because // context for coap is initialised in init ip_malloc_init(); return SUCCESS; } event void Boot.booted() { call BlipStatistics.clear(); /* set up our reconstruction cache */ table_init(&recon_cache, recon_data, sizeof(struct lowpan_reconstruct), N_RECONSTRUCTIONS); table_map(&recon_cache, reconstruct_clear); call SplitControl.start(); } /* * Receive-side code. */ void deliver(struct lowpan_reconstruct *recon) { struct ip6_hdr *iph = (struct ip6_hdr *)recon->r_buf; // printf("deliver [%i]: ", recon->r_bytes_rcvd); // printf_buf(recon->r_buf, recon->r_bytes_rcvd); /* the payload length field is always compressed, have to put it back here */ iph->ip6_plen = htons(recon->r_bytes_rcvd - sizeof(struct ip6_hdr)); signal IPLower.recv(iph, (void *)(iph + 1), &recon->r_meta); // printf("ip_free(%p)\n", recon->r_buf); ip_free(recon->r_buf); recon->r_timeout = T_UNUSED; recon->r_buf = NULL; } /* * Bulletproof recovery logic is very important to make sure we * don't get wedged with no free buffers. * * The table is managed as follows: * - unused entries are marked T_UNUSED * - entries which * o have a buffer allocated * o have had a fragment reception before we fired * are marked T_ACTIVE * - entries which have not had a fragment reception during the last timer period * and were active are marked T_ZOMBIE * - zombie receptions are deleted: their buffer is freed and table entry marked unused. * - when a fragment is dropped, it is entered into the table as T_FAILED1. * no buffer is allocated * - when the timer fires, T_FAILED1 entries are aged to T_FAILED2. * - T_FAILED2 entries are deleted. Incomming fragments with tags * that are marked either FAILED1 or FAILED2 are dropped; this * prevents us from allocating a buffer for a packet which we * have already dropped fragments from. * */ void reconstruct_age(void *elt) { struct lowpan_reconstruct *recon = (struct lowpan_reconstruct *)elt; if (recon->r_timeout != T_UNUSED) printf("recon src: 0x%x tag: 0x%x buf: %p recvd: %i/%i\n", recon->r_source_key, recon->r_tag, recon->r_buf, recon->r_bytes_rcvd, recon->r_size); switch (recon->r_timeout) { case T_ACTIVE: recon->r_timeout = T_ZOMBIE; break; // age existing receptions case T_FAILED1: recon->r_timeout = T_FAILED2; break; // age existing receptions case T_ZOMBIE: case T_FAILED2: // deallocate the space for reconstruction printf("timing out buffer: src: %i tag: %i\n", recon->r_source_key, recon->r_tag); if (recon->r_buf != NULL) { printf("ip_free(%p)\n", recon->r_buf); ip_free(recon->r_buf); } recon->r_timeout = T_UNUSED; recon->r_buf = NULL; break; } } void ip_print_heap() { #ifdef PRINTFUART_ENABLED bndrt_t *cur = (bndrt_t *)heap; while (((uint8_t *)cur) - heap < IP_MALLOC_HEAP_SIZE) { printf ("heap region start: %p length: %u used: %u\n", cur, (*cur & IP_MALLOC_LEN), (*cur & IP_MALLOC_INUSE) >> 15); cur = (bndrt_t *)(((uint8_t *)cur) + ((*cur) & IP_MALLOC_LEN)); } #endif } event void ExpireTimer.fired() { table_map(&recon_cache, reconstruct_age); printf("Frag pool size: %i\n", call FragPool.size()); printf("SendInfo pool size: %i\n", call SendInfoPool.size()); printf("SendEntry pool size: %i\n", call SendEntryPool.size()); printf("Forward queue length: %i\n", call SendQueue.size()); ip_print_heap(); printfflush(); } /* * allocate a structure for recording information about incomming fragments. */ struct lowpan_reconstruct *get_reconstruct(uint16_t key, uint16_t tag) { struct lowpan_reconstruct *ret = NULL; int i; // printf("get_reconstruct: %x %i\n", key, tag); for (i = 0; i < N_RECONSTRUCTIONS; i++) { struct lowpan_reconstruct *recon = (struct lowpan_reconstruct *)&recon_data[i]; if (recon->r_tag == tag && recon->r_source_key == key) { if (recon->r_timeout > T_UNUSED) { recon->r_timeout = T_ACTIVE; ret = recon; goto done; } else if (recon->r_timeout < T_UNUSED) { // if we have already tried and failed to get a buffer, we // need to drop remaining fragments. ret = NULL; goto done; } } if (recon->r_timeout == T_UNUSED) ret = recon; } done: // printf("got%p\n", ret); return ret; } event message_t *Ieee154Receive.receive(message_t *msg, void *msg_payload, uint8_t len) { struct packed_lowmsg lowmsg; struct ieee154_frame_addr frame_address; uint8_t *buf = msg_payload; // printf(" -- RECEIVE -- len : %i\n", len); BLIP_STATS_INCR(stats.rx_total); /* unpack the 802.15.4 address fields */ buf = unpack_ieee154_hdr(msg_payload, &frame_address); len -= buf - (uint8_t *)msg_payload; /* unpack and 6lowpan headers */ lowmsg.data = buf; lowmsg.len = len; lowmsg.headers = getHeaderBitmap(&lowmsg); if (lowmsg.headers == LOWMSG_NALP) { goto fail; } if (hasFrag1Header(&lowmsg) || hasFragNHeader(&lowmsg)) { // start reassembly int rv; struct lowpan_reconstruct *recon; uint16_t tag, source_key; source_key = ieee154_hashaddr(&frame_address.ieee_src); getFragDgramTag(&lowmsg, &tag); recon = get_reconstruct(source_key, tag); if (!recon) { goto fail; } /* fill in metadata: on fragmented packets, it applies to the first fragment only */ memcpy(&recon->r_meta.sender, &frame_address.ieee_src, sizeof(ieee154_addr_t)); recon->r_meta.lqi = call ReadLqi.readLqi(msg); recon->r_meta.rssi = call ReadLqi.readRssi(msg); if (hasFrag1Header(&lowmsg)) { if (recon->r_buf != NULL) goto fail; rv = lowpan_recon_start(&frame_address, recon, buf, len); } else { rv = lowpan_recon_add(recon, buf, len); } if (rv < 0) { recon->r_timeout = T_FAILED1; goto fail; } else { // printf("start recon buf: %p\n", recon->r_buf); recon->r_timeout = T_ACTIVE; recon->r_source_key = source_key; recon->r_tag = tag; } if (recon->r_size == recon->r_bytes_rcvd) { deliver(recon); } } else { /* no fragmentation, just deliver it */ int rv; struct lowpan_reconstruct recon; /* fill in metadata */ memcpy(&recon.r_meta.sender, &frame_address.ieee_src, sizeof(ieee154_addr_t)); recon.r_meta.lqi = call ReadLqi.readLqi(msg); recon.r_meta.rssi = call ReadLqi.readRssi(msg); buf = getLowpanPayload(&lowmsg); if ((rv = lowpan_recon_start(&frame_address, &recon, buf, len)) < 0) { goto fail; } if (recon.r_size == recon.r_bytes_rcvd) { deliver(&recon); } else { // printf("ip_free(%p)\n", recon.r_buf); ip_free(recon.r_buf); } } goto done; fail: BLIP_STATS_INCR(stats.rx_drop); done: return msg; } /* * Send-side functionality */ task void sendTask() { struct send_entry *s_entry; // printf("sendTask() - sending\n"); if (radioBusy || state != S_RUNNING) return; if (call SendQueue.empty()) return; // this does not dequeue s_entry = call SendQueue.head(); #ifdef LPL_SLEEP_INTERVAL call LowPowerListening.setRemoteWakeupInterval(s_entry->msg, call LowPowerListening.getLocalWakeupInterval()); #endif if (s_entry->info->failed) { dbg("Drops", "drops: sendTask: dropping failed fragment\n"); goto fail; } if ((call Ieee154Send.send(s_entry->msg, call BarePacket.payloadLength(s_entry->msg))) != SUCCESS) { dbg("Drops", "drops: sendTask: send failed\n"); goto fail; } else { radioBusy = TRUE; } return; fail: printf("SEND FAIL\n"); post sendTask(); BLIP_STATS_INCR(stats.tx_drop); // deallocate the memory associated with this request. // other fragments associated with this packet will get dropped. s_entry->info->failed = TRUE; SENDINFO_DECR(s_entry->info); call FragPool.put(s_entry->msg); call SendEntryPool.put(s_entry); call SendQueue.dequeue(); } /* * it will pack the message into the fragment pool and enqueue * those fragments for sending * * it will set * - payload length * - version, traffic class and flow label * * the source and destination IP addresses must be set by higher * layers. */ command error_t IPLower.send(struct ieee154_frame_addr *frame_addr, struct ip6_packet *msg, void *data) { struct lowpan_ctx ctx; struct send_info *s_info; struct send_entry *s_entry; message_t *outgoing; int frag_len = 1; error_t rc = SUCCESS; if (state != S_RUNNING) { return EOFF; } /* set version to 6 in case upper layers forgot */ msg->ip6_hdr.ip6_vfc &= ~IPV6_VERSION_MASK; msg->ip6_hdr.ip6_vfc |= IPV6_VERSION; ctx.tag = current_local_label++; ctx.offset = 0; s_info = getSendInfo(); if (s_info == NULL) { rc = ERETRY; goto cleanup_outer; } s_info->upper_data = data; while (frag_len > 0) { s_entry = call SendEntryPool.get(); outgoing = call FragPool.get(); if (s_entry == NULL || outgoing == NULL) { if (s_entry != NULL) call SendEntryPool.put(s_entry); if (outgoing != NULL) call FragPool.put(outgoing); // this will cause any fragments we have already enqueued to // be dropped by the send task. s_info->failed = TRUE; printf("drops: IP send: no fragments\n"); rc = ERETRY; goto done; } call BarePacket.clear(outgoing); frag_len = lowpan_frag_get(call Ieee154Send.getPayload(outgoing, 0), call BarePacket.maxPayloadLength(), msg, frame_addr, &ctx); if (frag_len < 0) { printf(" get frag error: %i\n", frag_len); } printf("fragment length: %i offset: %i\n", frag_len, ctx.offset); call BarePacket.setPayloadLength(outgoing, frag_len); if (frag_len <= 0) { call FragPool.put(outgoing); call SendEntryPool.put(s_entry); goto done; } if (call SendQueue.enqueue(s_entry) != SUCCESS) { BLIP_STATS_INCR(stats.encfail); s_info->failed = TRUE; printf("drops: IP send: enqueue failed\n"); goto done; } s_info->link_fragments++; s_entry->msg = outgoing; s_entry->info = s_info; /* configure the L2 */ if (frame_addr->ieee_dst.ieee_mode == IEEE154_ADDR_SHORT && frame_addr->ieee_dst.i_saddr == IEEE154_BROADCAST_ADDR) { call PacketLink.setRetries(s_entry->msg, 0); } else { call PacketLink.setRetries(s_entry->msg, BLIP_L2_RETRIES); } call PacketLink.setRetryDelay(s_entry->msg, BLIP_L2_DELAY); SENDINFO_INCR(s_info);} // printf("got %i frags\n", s_info->link_fragments); done: BLIP_STATS_INCR(stats.sent); SENDINFO_DECR(s_info); post sendTask(); cleanup_outer: return rc; } event void Ieee154Send.sendDone(message_t *msg, error_t error) { struct send_entry *s_entry = call SendQueue.head(); radioBusy = FALSE; // printf("sendDone: %p %i\n", msg, error); if (state == S_STOPPING) { call RadioControl.stop(); state = S_STOPPED; goto done; } s_entry->info->link_transmissions += (call PacketLink.getRetries(msg)); s_entry->info->link_fragment_attempts++; if (!call PacketLink.wasDelivered(msg)) { printf("sendDone: was not delivered! (%i tries)\n", call PacketLink.getRetries(msg)); s_entry->info->failed = TRUE; signal IPLower.sendDone(s_entry->info); /* if (s_entry->info->policy.dest[0] != 0xffff) */ /* dbg("Drops", "drops: sendDone: frag was not delivered\n"); */ // need to check for broadcast frames // BLIP_STATS_INCR(stats.tx_drop); } else if (s_entry->info->link_fragment_attempts == s_entry->info->link_fragments) { signal IPLower.sendDone(s_entry->info); } done: // kill off any pending fragments SENDINFO_DECR(s_entry->info); call FragPool.put(s_entry->msg); call SendEntryPool.put(s_entry); call SendQueue.dequeue(); post sendTask(); } #if 0 command struct tlv_hdr *IPExtensions.findTlv(struct ip6_ext *ext, uint8_t tlv_val) { int len = ext->len - sizeof(struct ip6_ext); struct tlv_hdr *tlv = (struct tlv_hdr *)(ext + 1); while (len > 0) { if (tlv->type == tlv_val) return tlv; if (tlv->len == 0) return NULL; tlv = (struct tlv_hdr *)(((uint8_t *)tlv) + tlv->len); len -= tlv->len; } return NULL; } #endif /* * BlipStatistics interface */ command void BlipStatistics.get(ip_statistics_t *statistics) { #ifdef BLIP_STATS_IP_MEM stats.fragpool = call FragPool.size(); stats.sendinfo = call SendInfoPool.size(); stats.sendentry= call SendEntryPool.size(); stats.sndqueue = call SendQueue.size(); stats.heapfree = ip_malloc_freespace(); printf("frag: %i sendinfo: %i sendentry: %i sendqueue: %i heap: %i\n", stats.fragpool, stats.sendinfo, stats.sendentry, stats.sndqueue, stats.heapfree); #endif memcpy(statistics, &stats, sizeof(ip_statistics_t)); } command void BlipStatistics.clear() { memclr((uint8_t *)&stats, sizeof(ip_statistics_t)); } /* default event void IP.recv[uint8_t nxt_hdr](struct ip6_hdr *iph, */ /* void *payload, */ /* struct ip_metadata *meta) { */ /* } */ /* default event void Multicast.recv[uint8_t scope](struct ip6_hdr *iph, */ /* void *payload, */ /* struct ip_metadata *meta) { */ /* } */ } tinyos-2.1.2+dfsg/tos/lib/net/blip/IPExtensionP.nc000066400000000000000000000104751207233610700217260ustar00rootroot00000000000000 /* * Provides various functions for dealing with IP extension header * processing * */ #include #include "blip_printf.h" module IPExtensionP { provides { // for inserting destination and hop-by-hop headers on outgoing packets. // routing headers are handled through the IPRouting interface interface Init; interface TLVHeader as HopByHopExt[uint8_t client]; interface TLVHeader as DestinationExt[uint8_t client]; interface InternalIPExtension; } } implementation { struct generic_header *ext_dest, *ext_hop; command error_t Init.init() { ext_hop = ext_dest = NULL; return SUCCESS; } struct tlv_hdr *destopt_get(int i, int nxt_hdr, struct ip6_hdr *iph) { return signal DestinationExt.getHeader[i](0, nxt_hdr, iph); } struct tlv_hdr *hopopt_get(struct ip6_hdr *iph, int i) { //, uint8_t nxt_hdr) { // return signal HopByHopExt.getHeader[i](label, iph, nxt_hdr); return NULL; } /* build up a sequence of TLV headers for hop-by-hop or destination only extension headers */ struct generic_header *buildTLVHdr(struct split_ip_msg *msg, int which, int n, int nxt_hdr) { // allocate generic headers for all the possible TLV-encoded // headers we might get int i; uint8_t *buf = ip_malloc(sizeof(struct ip6_ext) + (sizeof(struct generic_header) * (n + 1))); struct ip6_ext *real_hdr; struct generic_header *ghdrs; if (buf == NULL) return NULL; ghdrs = (struct generic_header *)buf; real_hdr = (struct ip6_ext *)(ghdrs + (n + 1)); real_hdr->len = sizeof(struct ip6_ext); ghdrs[0].len = sizeof(struct ip6_ext); ghdrs[0].hdr.data = (uint8_t *)real_hdr; ghdrs[0].next = msg->headers; for (i = 0; i < n; i++) { struct tlv_hdr *this_hdr; if (which == 0) { printf("adding destination idx %i\n", i); this_hdr = signal DestinationExt.getHeader[i](0, nxt_hdr, &msg->hdr); } else { this_hdr = signal HopByHopExt.getHeader[i](0, nxt_hdr, &msg->hdr); } printf("buildTLV: got %p\n", this_hdr); if (this_hdr == NULL) continue; real_hdr->len += this_hdr->len; ghdrs[i+1].len = this_hdr->len; ghdrs[i+1].hdr.data = (uint8_t *)this_hdr; ghdrs[i].next = &ghdrs[i+1]; ghdrs[i+1].next = msg->headers; } if (real_hdr->len == sizeof(struct ip6_ext)) { ip_free(buf); return NULL; } else { real_hdr->nxt_hdr = msg->hdr.nxt_hdr; msg->headers = ghdrs; return ghdrs; } } command void InternalIPExtension.addHeaders(struct split_ip_msg *msg, uint8_t nxt_hdr, uint16_t label) { ext_dest = ext_hop = NULL; msg->hdr.nxt_hdr = nxt_hdr; ext_dest = buildTLVHdr(msg, 0, 1, nxt_hdr); if (ext_dest != NULL) msg->hdr.nxt_hdr = IPV6_DEST; ext_hop = buildTLVHdr(msg, 1, 1, msg->hdr.nxt_hdr); if (ext_hop != NULL) msg->hdr.nxt_hdr = IPV6_HOP; } command void InternalIPExtension.free() { if (ext_dest != NULL) ip_free(ext_dest); if (ext_hop != NULL) ip_free(ext_hop); ext_dest = ext_hop = NULL; // signal HopByHopExt.free[0](); // signal DestinationExt.free[0](); } #if 0 void ip_dump_msg(struct split_ip_msg *msg) { struct generic_header *cur = msg->headers; int i; printf("DUMPING IP PACKET\n "); for (i = 0; i < sizeof(struct ip6_hdr); i++) printf("0x%x ", ((uint8_t *)&msg->hdr)[i]); printf("\n"); while (cur != NULL) { printf(" header [%i]: ", cur->len); for (i = 0; i < cur->len; i++) printf("0x%x ", cur->hdr.data[i]); printf("\n"); cur = cur->next; } printf("data [%i]: ", msg->data_len); for (i = 0; i < msg->data_len; i++) printf("0x%x ", ((uint8_t *)msg->data)[i]); printf("\n\n"); } #endif default event struct tlv_hdr *DestinationExt.getHeader[uint8_t i](int label,int nxt_hdr, struct ip6_hdr *msg) { printf("default dest handler?\n"); return NULL; } default event struct tlv_hdr *HopByHopExt.getHeader[uint8_t i](int label,int nxt_hdr, struct ip6_hdr *msg) { return NULL; } } tinyos-2.1.2+dfsg/tos/lib/net/blip/IPExtensionsP.nc000066400000000000000000000012431207233610700221020ustar00rootroot00000000000000 module IPExtensionsP { provides interface IPExtensions[uint8_t client]; uses interface IPExtensions; } implementation { command struct tlv_hdr *findTlv(struct ip6_ext *ext, uint8_t tlv) { } event void handleExtensions(uint8_t label, struct ip6_hdr *iph, struct ip6_ext *hop, struct ip6_ext *dst, struct ip6_route *route, uint8_t nxt_hdr) { } /* * will be called once for each fragment when sending or forwarding */ event void reportTransmission(uint8_t label, send_policy_t *send) { } } tinyos-2.1.2+dfsg/tos/lib/net/blip/IPForwardingEngineP.nc000066400000000000000000000314231207233610700231760ustar00rootroot00000000000000/** * Forwarding abstractions for blip IPv6 stack. * * Routing protocols can manipulate the forwarding state using the * ForwardingTable interface and receive notifications of forwarding * events using ForwardingEvents. In particular, the forwarding * events are useful for datapath validation and updating link * estimates. * * @author Stephen Dawson-Haggerty */ #include #include #include "blip_printf.h" module IPForwardingEngineP { provides { interface ForwardingTable; interface ForwardingTableEvents; interface ForwardingEvents[uint8_t ifindex]; interface IP; interface IP as IPRaw; interface Init; } uses { interface IPForward[uint8_t ifindex]; interface IPAddress; interface IPPacket; interface Pool; #ifdef PRINTFUART_ENABLED interface Timer as PrintTimer; #endif interface Leds; } } implementation { #define min(X,Y) (((X) < (Y)) ? (X) : (Y)) /* simple routing table for now */ /* we can optimize memory consumption later since most of these address will have known prefixes -- either LL or the shared global prefix. */ /* the routing table is sorted by prefix length, so that the entries with the longest prefix are at the top. */ /* if a route to the given prefix already exists, this updates it. */ struct route_entry routing_table[ROUTE_TABLE_SZ]; route_key_t last_key = 1; command error_t Init.init() { memset(routing_table, 0, sizeof(routing_table)); } int alloc_key() { int i; int key; retry: key = last_key++; for (i = 0; i < ROUTE_TABLE_SZ; i++) { if (routing_table[i].valid && routing_table[i].key == key) goto retry; } return key; } struct route_entry *alloc_entry(int pfxlen) { int i; /* full table */ if (routing_table[ROUTE_TABLE_SZ-1].valid) return NULL; for (i = 0; i < ROUTE_TABLE_SZ; i++) { /* if there's an invalid entry there are spare entries and we don't have to insert in the middle of the table. */ if (!routing_table[i].valid) goto init_entry; /* we keep the table sorted by prefix length so we skip all the entries with longer prefixes. */ else if (routing_table[i].prefixlen >= pfxlen) continue; /* we're pointing at a valid entry that is our new slot; we know there's at least one free entry in the table, too. */ /* shift the table down and return the current entry; */ memmove((void *)&routing_table[i+1], (void *)&routing_table[i], sizeof(struct route_entry) * (ROUTE_TABLE_SZ - i - 1)); goto init_entry; } return NULL; init_entry: routing_table[i].valid = 1; routing_table[i].key = alloc_key(); return &routing_table[i]; } task void defaultRouteAddedTask() { signal ForwardingTableEvents.defaultRouteAdded(); } command route_key_t ForwardingTable.addRoute(const uint8_t *prefix, int prefix_len_bits, struct in6_addr *next_hop, uint8_t ifindex) { struct route_entry *entry; /* no reason to support non-byte length prefixes for now... */ if (prefix_len_bits % 8 != 0 || prefix_len_bits > 128) return ROUTE_INVAL_KEY; entry = call ForwardingTable.lookupRoute(prefix, prefix_len_bits); if (entry == NULL || entry->prefixlen != prefix_len_bits) { /* if there's no entry, or there's another entry but it has a different prefix length, we allocate a new slot in the table. */ entry = alloc_entry(prefix_len_bits); /* got a default route and we didn't already have one */ if (prefix_len_bits == 0) { post defaultRouteAddedTask(); } } if (entry == NULL) return ROUTE_INVAL_KEY; entry->prefixlen = prefix_len_bits; entry->ifindex = ifindex; memcpy(&entry->prefix, prefix, prefix_len_bits / 8); if (next_hop) memcpy(&entry->next_hop, next_hop, sizeof(struct in6_addr)); return entry->key; } command error_t ForwardingTable.delRoute(route_key_t key) { int i; for (i = 0; i < ROUTE_TABLE_SZ; i++) { if (routing_table[i].key == key) { /* remove the default route? */ if (routing_table[i].prefixlen == 0) { signal ForwardingTableEvents.defaultRouteRemoved(); } memmove((void *)&routing_table[i], (void *)&routing_table[i+1], sizeof(struct route_entry) * (ROUTE_TABLE_SZ - i - 1)); routing_table[ROUTE_TABLE_SZ-1].valid = 0; return SUCCESS; } } return FAIL; } /** * Look up the route to a prefix. * * If next_hop is not NULL, the next hop will be written in there. * @return the route key associated with this route. */ command struct route_entry *ForwardingTable.lookupRoute(const uint8_t *prefix, int prefix_len_bits) { int i; for (i = 0; i < ROUTE_TABLE_SZ; i++) { if (routing_table[i].valid && ((routing_table[i].prefixlen == 0) || (memcmp(prefix, routing_table[i].prefix.s6_addr, min(prefix_len_bits, routing_table[i].prefixlen) / 8) == 0 && prefix_len_bits))) { /* match! */ return &routing_table[i]; } } return NULL; } command struct route_entry *ForwardingTable.lookupRouteKey(route_key_t key) { int i; for (i = 0; i < ROUTE_TABLE_SZ; i++) { if (routing_table[i].valid && routing_table[i].key == key) return &routing_table[i]; } return NULL; } command struct route_entry *ForwardingTable.getTable(int *n) { *n = ROUTE_TABLE_SZ; return routing_table; } error_t do_send(uint8_t ifindex, struct in6_addr *next, struct ip6_packet *pkt) { error_t rc; struct in6_iid *iid = call Pool.get(); if (iid != NULL) memcpy(iid->data, &next->s6_addr[8], 8); rc = call IPForward.send[ifindex](next, pkt, iid); if (rc != SUCCESS && iid != NULL) call Pool.put(iid); return rc; } command error_t IP.send(struct ip6_packet *pkt) { struct route_entry *next_hop_entry = call ForwardingTable.lookupRoute(pkt->ip6_hdr.ip6_dst.s6_addr, 128); #ifdef PRINTFUART_ENABLED if (!call PrintTimer.isRunning()) call PrintTimer.startPeriodic(10000); #endif if (call IPAddress.isLocalAddress(&pkt->ip6_hdr.ip6_dst) && pkt->ip6_hdr.ip6_dst.s6_addr[0] != 0xff) { printf("Forwarding -- send with local unicast address!\n"); return FAIL; } else if (call IPAddress.isLLAddress(&pkt->ip6_hdr.ip6_dst) && (!next_hop_entry || next_hop_entry->prefixlen < 128)) { /* in this case, we need to figure out which interface the source address is attached to, and send the packet out on that interface. */ /* with traditional ND we would check the cache for each interface and then start discover on all of them; however, since we're assuming that link-local addresses are on-link for the 15.4 side, we just send all LL addresses that way. */ /* this is probably the worst part about not doing ND -- LL addressed don't work on other links... we should probably do ND in this case, or at least keep a cache so we can reply to messages on the right interface. */ printf("Forwarding -- send to LL address:"); printf_in6addr(&pkt->ip6_hdr.ip6_dst); printf("\n"); pkt->ip6_hdr.ip6_hlim = 1; // only do this for unicast packets if (pkt->ip6_hdr.ip6_dst.s6_addr[0] != 0xff) { return do_send(ROUTE_IFACE_154, &pkt->ip6_hdr.ip6_dst, pkt); } else { return call IPForward.send[ROUTE_IFACE_154](&pkt->ip6_hdr.ip6_dst, pkt, NULL); } } else if (next_hop_entry) { printf("Forwarding -- got from routing table\n"); /* control messages do not need routing headers */ if (!(signal ForwardingEvents.initiate[next_hop_entry->ifindex](pkt, &next_hop_entry->next_hop))) return FAIL; return do_send(next_hop_entry->ifindex, &next_hop_entry->next_hop, pkt); } return FAIL; } command error_t IPRaw.send(struct ip6_packet *pkt) { return FAIL; } event void IPForward.recv[uint8_t ifindex](struct ip6_hdr *iph, void *payload, struct ip6_metadata *meta) { struct ip6_packet pkt; struct in6_addr *next_hop; size_t len = ntohs(iph->ip6_plen); route_key_t next_hop_key = ROUTE_INVAL_KEY; uint8_t next_hop_ifindex; struct ip_iovec v = { .iov_next = NULL, .iov_base = payload, .iov_len = len, }; /* signaled before *any* processing */ signal IPRaw.recv(iph, payload, len, meta); if (call IPAddress.isLocalAddress(&iph->ip6_dst)) { /* local delivery */ // printf("Local delivery\n"); signal IP.recv(iph, payload, len, meta); } else { /* forwarding */ uint8_t nxt_hdr = IPV6_ROUTING; int header_off = call IPPacket.findHeader(&v, iph->ip6_nxt, &nxt_hdr); if (!(--iph->ip6_hlim)) { /* ICMP may send time exceeded */ // call ForwardingEvents.drop(iph, payload, len, ROUTE_DROP_HLIM); return; } if (header_off >= 0) { // we found a routing header in the packet // look up the next hop in the header if we understand it (type 4) // TODO // next_hop_ifindex = ifindex; return; } else { /* look up the next hop in the routing table */ struct route_entry *next_hop_entry = call ForwardingTable.lookupRoute(iph->ip6_dst.s6_addr, 128); if (next_hop_entry == NULL) { /* oops, no route. */ /* RPL will reencapsulate the packet in some cases here */ // call ForwardingEvents.drop(iph, payload, len, ROUTE_DROP_NOROUTE); return; } next_hop = &next_hop_entry->next_hop; next_hop_key = next_hop_entry->key; next_hop_ifindex = next_hop_entry->ifindex; } memcpy(&pkt.ip6_hdr, iph, sizeof(struct ip6_hdr)); pkt.ip6_data = &v; pkt.ip6_inputif = ifindex; /* give the routing protocol a chance to do data-path validation on this packet. */ /* RPL uses this to update the flow label fields */ if (!(signal ForwardingEvents.approve[next_hop_ifindex](&pkt, next_hop))) return; do_send(next_hop_ifindex, next_hop, &pkt); } } event void IPForward.sendDone[uint8_t ifindex](struct send_info *status) { struct in6_addr next; struct in6_iid *iid = (struct in6_iid *)status->upper_data; memset(next.s6_addr, 0, 16); next.s6_addr16[0] = htons(0xfe80); printf("sendDone: iface: %i key: %p\n", ifindex, iid); if (iid != NULL) { memcpy(&next.s6_addr[8], iid->data, 8); signal ForwardingEvents.linkResult[ifindex](&next, status); call Pool.put(iid); } } #ifdef PRINTFUART_ENABLED event void PrintTimer.fired() { int i; printf("\ndestination gateway interface\n"); for (i = 0; i < ROUTE_TABLE_SZ; i++) { if (routing_table[i].valid) { printf_in6addr(&routing_table[i].prefix); printf("/%i\t\t", routing_table[i].prefixlen); printf_in6addr(&routing_table[i].next_hop); printf("\t\t%i\n", routing_table[i].ifindex); } } printf("\n"); printfflush(); } #endif default event bool ForwardingEvents.approve[uint8_t idx](struct ip6_packet *pkt, struct in6_addr *next_hop) { return TRUE; } default event bool ForwardingEvents.initiate[uint8_t idx](struct ip6_packet *pkt, struct in6_addr *next_hop) { return TRUE; } default event void ForwardingEvents.linkResult[uint8_t idx](struct in6_addr *host, struct send_info * info) {} default command error_t IPForward.send[uint8_t ifindex](struct in6_addr *next_hop, struct ip6_packet *pkt, void *data) { // if (ifindex == ROUTE_IFACE_ALL) { // call IPForward.send[ROUTE_IFACE_PPP](next_hop, pkt, data); // call IPForward.send[ROUTE_IFACE_154](next_hop, pkt, data); // } return SUCCESS; } default event void IPRaw.recv(struct ip6_hdr *iph, void *payload, size_t len, struct ip6_metadata *meta) {} default event void ForwardingTableEvents.defaultRouteAdded() {} default event void ForwardingTableEvents.defaultRouteRemoved() {} event void IPAddress.changed(bool global_valid) {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/IPNeighborDiscoveryC.nc000066400000000000000000000007211207233610700233530ustar00rootroot00000000000000 configuration IPNeighborDiscoveryC { provides { interface NeighborDiscovery; interface IPForward; } uses { interface IPLower; } } implementation { components IPNeighborDiscoveryP, IPAddressC, Ieee154AddressC; NeighborDiscovery = IPNeighborDiscoveryP; IPForward = IPNeighborDiscoveryP; IPNeighborDiscoveryP.IPLower = IPLower; IPNeighborDiscoveryP.IPAddress -> IPAddressC; IPNeighborDiscoveryP.Ieee154Address -> Ieee154AddressC; } tinyos-2.1.2+dfsg/tos/lib/net/blip/IPNeighborDiscoveryP.nc000066400000000000000000000104751207233610700233770ustar00rootroot00000000000000/** * Neighbor Discovery for blip * * In IPv6, neighbor discovery resolves IPv6 addresses which have been * determined to be on-link to their associated link-layer addresses. * This simple component follows the advice of 6lowpan-nd, which * states that link-local addresses are derived from the associated * link-layer addressed deterministically. Therefore, we can do a * very simple translation between the two types of addresses. * * In the future, implementors could consider adding more complicated * address resolution mechanisms here. * * @author Stephen Dawson-Haggerty */ #include #include "blip_printf.h" module IPNeighborDiscoveryP { provides { interface IPForward; interface NeighborDiscovery; } uses { interface IPLower; interface IPAddress; interface Ieee154Address; } } implementation { command int NeighborDiscovery.matchContext(struct in6_addr *addr, uint8_t *ctx) { struct in6_addr me; if (!(call IPAddress.getGlobalAddr(&me))) return 0; if (memcmp(me.s6_addr, addr->s6_addr, 8) == 0) { *ctx = 0; return 64; } else { return 0; } } command int NeighborDiscovery.getContext(uint8_t context, struct in6_addr *ctx) { struct in6_addr me; if (!(call IPAddress.getGlobalAddr(&me))) return 0; if (context == 0) { // memset(ctx->s6_addr, 0, 8); // ctx->s6_addr16[0] = htons(0xaaaa); memcpy(ctx->s6_addr, me.s6_addr, 8); return 64; } else { return 0; } } command error_t NeighborDiscovery.resolveAddress(struct in6_addr *addr, ieee154_addr_t *link_addr) { ieee154_panid_t panid = letohs(call Ieee154Address.getPanId()); if (addr->s6_addr16[0] == htons(0xfe80)) { if (addr->s6_addr16[5] == htons(0x00FF) && addr->s6_addr16[6] == htons(0xFE00)) { /* U bit must not be set if a short address is in use */ if (ntohs(addr->s6_addr16[4]) == (panid & ~0x0200)) { link_addr->ieee_mode = IEEE154_ADDR_SHORT; link_addr->i_saddr = htole16(ntohs(addr->s6_addr16[7])); } else { return FAIL; } } else { int i; link_addr->ieee_mode = IEEE154_ADDR_EXT; for (i = 0; i < 8; i++) link_addr->i_laddr.data[i] = addr->s6_addr[15 - i]; link_addr->i_laddr.data[7] ^= 0x2; /* toggle U/L */ } return SUCCESS; } else if (addr->s6_addr[0] == 0xff) { /* LL - multicast */ if ((addr->s6_addr[1] & 0x0f) == 0x02) { link_addr->ieee_mode = IEEE154_ADDR_SHORT; link_addr->i_saddr = IEEE154_BROADCAST_ADDR; return SUCCESS; } } /* only resolve Link-Local addresses */ return FAIL; } /**************** Send and Receive path of the stack ****************/ /* this is where the translation to L2 addresses take place */ command error_t IPForward.send(struct in6_addr *next, struct ip6_packet *msg, void *ptr) { struct ieee154_frame_addr fr_addr; struct in6_addr local_addr; fr_addr.ieee_dstpan = call Ieee154Address.getPanId(); call IPAddress.getLLAddr(&local_addr); printf("IPNeighborDiscovery - send - next: "); printf_in6addr(next); printf(" - ll source: "); printf_in6addr(&local_addr); printf("\n"); // iov_print(msg->ip6_data); if (call NeighborDiscovery.resolveAddress(&local_addr, &fr_addr.ieee_src) != SUCCESS) { printf("IPND - local address resolution failed\n"); return FAIL; } if (call NeighborDiscovery.resolveAddress(next, &fr_addr.ieee_dst) != SUCCESS) { printf("IPND - next-hop address resolution failed\n"); return FAIL; } printf("l2 source: "); printf_buf(fr_addr.ieee_src.i_laddr.data, 8); printf("l2 dest: "); printf_buf(fr_addr.ieee_dst.i_laddr.data, 8); printf("\n"); return call IPLower.send(&fr_addr, msg, ptr); } event void IPLower.recv(struct ip6_hdr *iph, void *payload, struct ip6_metadata *meta) { signal IPForward.recv(iph, payload, meta); } event void IPLower.sendDone(struct send_info *status) { signal IPForward.sendDone(status); } event void Ieee154Address.changed() {} event void IPAddress.changed(bool global_valid) {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/IPPacketC.nc000066400000000000000000000066731207233610700211510ustar00rootroot00000000000000 #include #include #include #include "blip_printf.h" module IPPacketC { provides interface IPPacket; } implementation { #define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) /* * @type the next header value to look for. valid choices are in * ip.h and can be any valid IANA next-header value. The special * value IP6PKT_TRANSPORT will return the offset of the transport * header (ie, the first header which is not an IPv6 extension * header). * @return the offset of the start of a given header within the * packet, or -1 if it was not found. */ command int IPPacket.findHeader(struct ip_iovec *payload, uint8_t first_type, uint8_t *search_type) { int off = 0; uint8_t nxt = first_type; struct ip6_ext ext; /* ignore extension headers until we find the desired header type or reach the transport-layer header. */ while ((*search_type == IP6PKT_TRANSPORT && (nxt == IPV6_HOP || nxt == IPV6_ROUTING || nxt == IPV6_FRAG || nxt == IPV6_DEST || nxt == IPV6_MOBILITY)) || // consider IPV6_IPV6 a transport type (*search_type != IP6PKT_TRANSPORT && *search_type != nxt)) { if (iov_read(payload, off, sizeof(ext), (void *)&ext) != sizeof(ext)) return -1; nxt = ext.ip6e_nxt; off += (ext.ip6e_len + 1) * 8; } if (*search_type == IP6PKT_TRANSPORT) *search_type = nxt; if (nxt == IPV6_NONEXT) return -1; else return off; } /** * Find a TLV-encoded suboption inside of an IPv6 extension header. * * @header iovec holding the packet data * @ext_offset the offset to the first byte of the extension header * @type the TLV type value we're looking for * * @return the offset to the first byte of the matching TLV header, or -1 */ command int IPPacket.findTLV(struct ip_iovec *header, int ext_offset, uint8_t type) { struct ip6_ext ext; struct tlv_hdr tlv; int off = ext_offset; if (iov_read(header, off, sizeof(ext), (void *)&ext) != sizeof(ext)) return -1; off += sizeof(ext); while (off - ext_offset < (ext.ip6e_len + 1) * 8) { if (iov_read(header, off, sizeof(tlv), (void *)&tlv) != sizeof(tlv)) return -1; if (tlv.type == type) return off; else off += sizeof(tlv) + tlv.len; } return -1; } command void IPPacket.delTLV(struct ip_iovec *data, int ext_offset, uint8_t type) { uint8_t buf[4]; struct tlv_hdr tlv; // find the TLV option inside the header ext_offset = call IPPacket.findTLV(data, ext_offset, type); if (ext_offset < 0) return; if (iov_read(data, ext_offset, sizeof(tlv), (void *)&tlv) != sizeof(tlv)) return; buf[0] = IPV6_TLV_PADN; // change the search TLV to a PadN option iov_update(data, ext_offset + offsetof(struct tlv_hdr, type), 1, &buf[0]); memclr(buf, sizeof(buf)); ext_offset += sizeof(struct tlv_hdr); #if 0 // RFC2460 tells us to PadN options have to be zero-filled // you can do that if you want, but I'm leaving this disabled // because it's useful for debugging to see what the RPL options // were -- SDH // and overwrite the contents with zeroes while (tlv.len > 0) { int write_amt = MIN(tlv.len, sizeof(buf)); iov_update(data, ext_offset, write_amt, buf); ext_offset += write_amt; tlv.len -= write_amt; } #endif } } tinyos-2.1.2+dfsg/tos/lib/net/blip/IPProtocolsP.nc000066400000000000000000000036771207233610700217440ustar00rootroot00000000000000 #include #include #include "blip_printf.h" module IPProtocolsP { provides { interface IP[uint8_t nxt_hdr]; } uses { interface IPAddress; interface IP as SubIP; interface IPPacket; } } implementation { event void SubIP.recv(struct ip6_hdr *iph, void *payload, size_t len, struct ip6_metadata *meta) { int payload_off; uint8_t nxt_hdr; struct ip_iovec v = { .iov_base = payload, .iov_len = len, .iov_next = NULL, }; // Check whether the packet has a fragment extension header indicating // actual fragmentation. If so, discard --- we don't handle fragmentation, // and delivering fragments as complete packets is not really a good idea... nxt_hdr=IPV6_FRAG; payload_off = call IPPacket.findHeader(&v, iph->ip6_nxt, &nxt_hdr); if (payload_off>=0 && ((uint16_t*)((uint8_t*)payload+payload_off))[1]!=0) return; // find the transport header and deliver -- nxt_hdr is updated by findHeader nxt_hdr=IP6PKT_TRANSPORT; payload_off = call IPPacket.findHeader(&v, iph->ip6_nxt, &nxt_hdr); printf("IPProtocols - deliver -- off: %i\n", payload_off); if (payload_off >= 0) { signal IP.recv[nxt_hdr](iph, ((uint8_t *)payload) + payload_off, len - payload_off, meta); } } command error_t IP.send[uint8_t nxt_hdr](struct ip6_packet *msg) { msg->ip6_hdr.ip6_vfc = IPV6_VERSION; msg->ip6_hdr.ip6_hops = 16; printf("IP Protocol send - nxt_hdr: %i iov_len: %i plen: %u\n", nxt_hdr, iov_len(msg->ip6_data), ntohs(msg->ip6_hdr.ip6_plen)); return call SubIP.send(msg); } default event void IP.recv[uint8_t nxt_hdr](struct ip6_hdr *iph, void *payload, size_t len, struct ip6_metadata *meta) {} event void IPAddress.changed(bool global_valid) {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/IPStackC.nc000066400000000000000000000060251207233610700207760ustar00rootroot00000000000000/** * Wire together the IP stack * * To make it somewhat flexible, the stack consists of four main * layers: Protocol, Routing, NeighborDiscovery, and Dispatch. This * component wires them together. * * Protocol: dispatch based on the final next header value in an * ipv6_packet. * * Routing: determine the next-hop for a packet as a link-local * address. This is accomplished by looking up the destination * address in the forwarding table. * * NeighborDiscovery: responsible for address resolution. Very * simple, since only link-local addresses are considered to be * on-link. * * Dispatch: okay, this one's badly named. It's the 6lowpan engine * which talks to a packet radio on the bottom and presents fully * reassembled and decompressed IPv6 packets on top. This means most * of the stack can ignore the fact that there's all this magic going * on. * * @author Stephen Dawson-Haggerty */ #include configuration IPStackC { provides { interface SplitControl; interface IP[uint8_t nxt_hdr]; interface IP as IPRaw; interface ForwardingTable; interface ForwardingTableEvents; interface ForwardingEvents[uint8_t ifindex]; } uses { /* provided to stack components to turn themselves on and off */ interface StdControl; interface StdControl as RoutingControl; } } implementation { components IPProtocolsP, IPForwardingEngineP as FwdP, IPNeighborDiscoveryC as NdC, IPDispatchC; components IPStackControlP; SplitControl = IPStackControlP; IPStackControlP.StdControl = StdControl; IPStackControlP.RoutingControl = RoutingControl; IPStackControlP.SubSplitControl -> IPDispatchC; ForwardingTable = FwdP; ForwardingTableEvents = FwdP; ForwardingEvents = FwdP; /* wiring up of the IP stack */ IP = IPProtocolsP; /* top layer - dispatch protocols */ IPProtocolsP.SubIP -> FwdP.IP; /* routing layer - provision next hops */ /* this wiring for an 802.15.4 stack */ FwdP.IPForward[ROUTE_IFACE_154] -> NdC; /* this layer translates L3->L2 addresses */ NdC.IPLower -> IPDispatchC.IPLower; /* wire to the 6lowpan engine */ IPRaw = FwdP.IPRaw; /* wire in core protocols -- this is only protocol included by default */ /* it pretty much just replies to pings... */ components ICMPCoreP, LedsC; components IPAddressC, IPPacketC; ICMPCoreP.IP -> IPProtocolsP.IP[IANA_ICMP]; ICMPCoreP.Leds -> LedsC; ICMPCoreP.IPAddress -> IPAddressC; FwdP.IPAddress -> IPAddressC; FwdP.IPPacket -> IPPacketC; IPProtocolsP.IPPacket -> IPPacketC; IPStackControlP.IPAddress -> IPAddressC; FwdP.Leds -> LedsC; components new PoolC(struct in6_iid, N_CONCURRENT_SENDS) as FwdAddrPoolC; FwdP.Pool -> FwdAddrPoolC; #if defined(IN6_PREFIX) components MainC, NoDhcpC; NoDhcpC.Boot -> MainC; NoDhcpC.IPAddress -> IPAddressC; #elif ! defined(IN6_NO_GLOBAL) components Dhcp6RelayC; components Dhcp6ClientC; #endif #ifdef PRINTFUART_ENABLED components new TimerMilliC(); FwdP.PrintTimer -> TimerMilliC; #endif } tinyos-2.1.2+dfsg/tos/lib/net/blip/IPStackControlP.nc000066400000000000000000000024771207233610700223630ustar00rootroot00000000000000 module IPStackControlP { provides interface SplitControl; uses { interface StdControl; interface StdControl as RoutingControl; interface SplitControl as SubSplitControl; interface IPAddress; } } implementation { command error_t SplitControl.start() { return call SubSplitControl.start(); } event void SubSplitControl.startDone(error_t error) { struct in6_addr addr; if (error == SUCCESS) { call StdControl.start(); } // if we have a global address, we can start any routing protocols now. if (call IPAddress.getGlobalAddr(&addr)) { call RoutingControl.start(); } signal SplitControl.startDone(error); } command error_t SplitControl.stop() { call StdControl.stop(); call RoutingControl.stop(); return call SubSplitControl.stop(); } event void SubSplitControl.stopDone(error_t error) { signal SplitControl.stopDone(error); } event void IPAddress.changed(bool valid) { if (valid) call RoutingControl.start(); else call RoutingControl.stop(); } default command error_t StdControl.start() { return SUCCESS; } default command error_t StdControl.stop() { return SUCCESS; } default command error_t RoutingControl.start() { return SUCCESS; } default command error_t RoutingControl.stop() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/net/blip/Ieee154AddressC.nc000066400000000000000000000006711207233610700221100ustar00rootroot00000000000000 configuration Ieee154AddressC { provides interface Ieee154Address; } implementation { components Ieee154AddressP; components LocalIeeeEui64C; components MainC; Ieee154Address = Ieee154AddressP; MainC.SoftwareInit -> Ieee154AddressP; Ieee154AddressP.LocalIeeeEui64 -> LocalIeeeEui64C; // workaround until the radio stack uses this interface components CC2420ControlC; Ieee154AddressP.CC2420Config -> CC2420ControlC; } tinyos-2.1.2+dfsg/tos/lib/net/blip/Ieee154AddressP.nc000066400000000000000000000022361207233610700221240ustar00rootroot00000000000000 module Ieee154AddressP { provides { interface Init; interface Ieee154Address; } uses { interface LocalIeeeEui64; interface CC2420Config; } } implementation { ieee154_saddr_t m_saddr; ieee154_panid_t m_panid; command error_t Init.init() { m_saddr = TOS_NODE_ID; m_panid = TOS_AM_GROUP; return SUCCESS; } command ieee154_panid_t Ieee154Address.getPanId() { return m_panid; } command ieee154_saddr_t Ieee154Address.getShortAddr() { return m_saddr; } command ieee154_laddr_t Ieee154Address.getExtAddr() { ieee154_laddr_t addr = call LocalIeeeEui64.getId(); int i; uint8_t tmp; /* the LocalIeeeEui is big endian */ /* however, Ieee 802.15.4 addresses are little endian */ for (i = 0; i < 4; i++) { tmp = addr.data[i]; addr.data[i] = addr.data[7 - i]; addr.data[7 - i] = tmp; } return addr; } command error_t Ieee154Address.setShortAddr(ieee154_saddr_t addr) { m_saddr = addr; call CC2420Config.setShortAddr(addr); call CC2420Config.sync(); signal Ieee154Address.changed(); return SUCCESS; } event void CC2420Config.syncDone(error_t err) {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/MulticastP.nc000066400000000000000000000144441207233610700214660ustar00rootroot00000000000000 #include #include #include "Statistics.h" #include "ipmulticast.h" #define MAX_MSG_COUNT 5 // only send multicast messages this many times module MulticastP { provides { interface Init; interface IP[uint8_t nxt_hdr]; interface Statistics; } uses { interface IP as MulticastRx[uint8_t nxt_hdr]; interface TLVHeader as HopHeader; interface TrickleTimer; interface IPExtensions; } } implementation { bool trickle_running; uint16_t last_seqno; uint8_t fw_hdr; struct split_ip_msg fw_msg; uint8_t fw_data[MCAST_FW_MAXLEN]; int fw_data_len; uint8_t msg_count; command error_t Init.init() { last_seqno = 0; return SUCCESS; } void startNewMsg(struct ip6_hdr *iph, uint8_t nxt_hdr) { // store a copy of the message for forwarding ip_memclr((void *)&fw_msg, sizeof(struct split_ip_msg)); ip_memcpy(&fw_msg.hdr, iph, sizeof(struct ip6_hdr)); fw_hdr = nxt_hdr; fw_msg.headers = NULL; fw_msg.data = fw_data; fw_msg.data_len = fw_data_len; msg_count = 0; // printfUART("MCAST: startNewMsg\n"); call TrickleTimer.stop(); call TrickleTimer.reset(); call TrickleTimer.start(); } /* * receive all IP datagrams. * we store and forward ones with scope 3 */ event void MulticastRx.recv[uint8_t nxt_hdr](struct ip6_hdr *iph, void *payload, struct ip_metadata *meta) { struct ip6_ext *hop; struct tlv_hdr *mcast_tlv; struct mcast_hdr *mcast; // no sequence number attached? // printfUART("MCAST: recv\n"); if (iph->nxt_hdr != IPV6_HOP) { goto deliver; } hop = (struct ip6_ext *)(iph + 1); mcast_tlv = call IPExtensions.findTlv(hop, TLV_TYPE_MCASTSEQ); mcast = (struct mcast_hdr *)mcast_tlv; // no mcast sequence number? if (mcast == NULL) { goto deliver; } if (ntohs(mcast->mcast_seqno) > last_seqno || (last_seqno > 0xfff0 && ntohs(mcast->mcast_seqno) < 0x0f)) { uint16_t length = ntohs(iph->plen); if (length < MCAST_FW_MAXLEN) { // printfUART("MCAST: seqno was: %i now: %i\n", last_seqno, ntohs(mcast->mcast_seqno)); last_seqno = ntohs(mcast->mcast_seqno); memcpy(fw_data, payload, length); fw_data_len = length; startNewMsg(iph, nxt_hdr); // printfUART("MCAST: starting new mcast message seqno: %i\n", last_seqno); } goto deliver; } else if (ntohs(mcast->mcast_seqno) == last_seqno && memcmp(iph->ip6_src.s6_addr, fw_msg.hdr.ip6_src.s6_addr, 16) == 0) { // received a retranmission. just update the trickle timer. // printfUART("MCAST: received consistent transmission, seqno: %d\n", ntohs(mcast->mcast_seqno)); call TrickleTimer.incrementCounter(); } return; deliver: signal IP.recv[nxt_hdr](iph, payload, meta); } /* * add sequence numbers to outgoing multicast packets so we can * detect when there are new ones. */ event struct tlv_hdr *HopHeader.getHeader(int label,int nxt_hdr, struct ip6_hdr *iph) { // only add sequence number headers to outgoing flood messages static struct mcast_hdr hdr; if (iph->ip6_dst.s6_addr16[0] != htons(0xff03)) return NULL; // printfUART("MCAST: adding multicast header, seqno: %d\n",last_seqno); hdr.tlv.type = TLV_TYPE_MCASTSEQ; hdr.tlv.len = sizeof(struct mcast_hdr); hdr.mcast_seqno = htons(last_seqno); return (struct tlv_hdr *)&hdr; } event void HopHeader.free() {} event void TrickleTimer.fired() { // it's that easy... the sequence number will get added when // outgoing headers are added. fw_msg.headers = NULL; fw_msg.hdr.nxt_hdr = fw_hdr; fw_msg.hdr.plen = htons(fw_data_len); fw_msg.data_len = fw_data_len; call MulticastRx.bareSend[fw_hdr](&fw_msg, NULL, IP_MCAST); msg_count = msg_count + 1; if (msg_count >= MAX_MSG_COUNT) { msg_count = 0; call TrickleTimer.stop(); } } command error_t IP.send[uint8_t nxt_hdr](struct split_ip_msg *msg) { if (msg->hdr.ip6_dst.s6_addr[0] == 0xff) { if ((msg->hdr.ip6_dst.s6_addr[1] & 0x0f) == 0x3) { int total_length = ntohs(msg->hdr.plen); unsigned char *cur = fw_data; struct generic_header *g_hdr; if (total_length > MCAST_FW_MAXLEN) return FAIL; last_seqno++; startNewMsg(&msg->hdr, nxt_hdr); fw_data_len = total_length; g_hdr = msg->headers; while (g_hdr != NULL) { total_length -= g_hdr->len; if (total_length < 0) goto fail; memcpy(cur, g_hdr->hdr.data, g_hdr->len); cur +=g_hdr->len; g_hdr = g_hdr->next; } if (msg->data_len > total_length) goto fail; memcpy(cur, msg->data, msg->data_len); return SUCCESS; fail: call TrickleTimer.stop(); return FAIL; } else { return call MulticastRx.bareSend[nxt_hdr](msg, NULL, IP_MCAST); } } return SUCCESS; } command error_t IP.bareSend[uint8_t prot](struct split_ip_msg *msg, struct ip6_route *route, int flags) { if (msg->hdr.ip6_dst.s6_addr[0] == 0xff) { return call MulticastRx.bareSend[prot](msg, route, flags | IP_MCAST); } else { return SUCCESS; } } event void IPExtensions.reportTransmission(uint8_t label, send_policy_t *policy) { } event void IPExtensions.handleExtensions(uint8_t label, struct ip6_hdr *iph, struct ip6_ext *hop, struct ip6_ext *dst, struct ip6_route *route, uint8_t nxt_hdr) { } default event void IP.recv[uint8_t nxt_hdr](struct ip6_hdr *iph, void *payload, struct ip_metadata *meta) { } command void Statistics.get(mcast_statistics_t *stats) { stats->lsn = last_seqno; } /* * Reset whatever statistics are being collected. */ command void Statistics.clear() {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/README000066400000000000000000000040431207233610700177310ustar00rootroot00000000000000# @author Stephen Dawson-Haggerty */ configuration ReadLqiC { provides interface ReadLqi; } implementation { #if defined(PLATFORM_MICAZ) || defined(PLATFORM_TELOSB) || \ defined(PLATFORM_EPIC) || defined(PLATFORM_SHIMMER) || \ defined(PLATFORM_SHIMMER2) || defined(PLATFORM_INTELMOTE2) || \ defined(PLATFORM_Z1) // cc2420 platforms components CC2420ReadLqiC, CC2420PacketC; ReadLqi = CC2420ReadLqiC; CC2420ReadLqiC.CC2420Packet -> CC2420PacketC; #elif defined(PLATFORM_IRIS) || defined(PLATFORM_MULLE) components RF230ReadLqiC, RF230Ieee154MessageC; ReadLqi = RF230ReadLqiC; RF230ReadLqiC.SubLqi -> RF230Ieee154MessageC.PacketLinkQuality; RF230ReadLqiC.SubRssi -> RF230Ieee154MessageC.PacketRSSI; #else #error "No radio support is available for your platform" #endif } tinyos-2.1.2+dfsg/tos/lib/net/blip/ResourceSendP.nc000066400000000000000000000025451207233610700221210ustar00rootroot00000000000000 #include module ResourceSendP { provides interface Ieee154Send; uses interface Resource; uses interface Ieee154Send as SubSend; } implementation { ieee154_saddr_t m_addr; message_t *m_msg = NULL; uint8_t m_len; command error_t Ieee154Send.send(ieee154_saddr_t addr, message_t* msg, uint8_t len) { if (m_msg != NULL) return EBUSY; m_addr = addr; m_msg = msg; m_len = len; call Resource.request(); return SUCCESS; } event void SubSend.sendDone(message_t* msg, error_t result) { call Resource.release(); signal Ieee154Send.sendDone(msg, result); m_msg = NULL; } event void Resource.granted() { error_t rc; if ((rc = (call SubSend.send(m_addr, m_msg, m_len))) != SUCCESS) { signal Ieee154Send.sendDone(m_msg, rc); m_msg = NULL; call Resource.release(); } } command error_t Ieee154Send.cancel(message_t* msg) { if (m_msg != NULL) { call Resource.release(); m_msg = NULL; return call SubSend.cancel(msg); } else { return FAIL; } } command uint8_t Ieee154Send.maxPayloadLength() { return call SubSend.maxPayloadLength(); } command void* Ieee154Send.getPayload(message_t* m, uint8_t len) { return call SubSend.getPayload(m, len); } } tinyos-2.1.2+dfsg/tos/lib/net/blip/TcpC.nc000066400000000000000000000005041207233610700202220ustar00rootroot00000000000000 configuration TcpC { provides interface Tcp[uint8_t client]; } implementation { components MainC, IPStackC, TcpP, IPAddressC; components new TimerMilliC(); Tcp = TcpP; MainC -> TcpP.Init; TcpP.Boot -> MainC; TcpP.IP -> IPStackC.IP[IANA_TCP]; TcpP.Timer -> TimerMilliC; TcpP.IPAddress -> IPAddressC; } tinyos-2.1.2+dfsg/tos/lib/net/blip/TcpP.nc000066400000000000000000000100341207233610700202360ustar00rootroot00000000000000 #ifdef PC #include #endif #include #include #include "blip_printf.h" module TcpP { provides interface Tcp[uint8_t client]; provides interface Init; uses { interface Boot; interface IP; interface Timer; interface IPAddress; } } implementation { enum { N_CLIENTS = uniqueCount("TCP_CLIENT"), }; #include struct tcplib_sock socks[N_CLIENTS]; int find_client(struct tcplib_sock *conn) { int i; for (i = 0; i < N_CLIENTS; i++) if (&socks[i] == conn) break; return i; } void tcplib_extern_connectdone(struct tcplib_sock *sock, int error) { int cid = find_client(sock); if (cid < N_CLIENTS) signal Tcp.connectDone[cid](error ? FAIL : SUCCESS); } void tcplib_extern_recv(struct tcplib_sock *sock, void *data, int len) { int cid = find_client(sock); if (cid < N_CLIENTS) signal Tcp.recv[cid](data, len); } void tcplib_extern_closed(struct tcplib_sock *sock) { tcplib_close(sock); } void tcplib_extern_closedone(struct tcplib_sock *sock) { int cid = find_client(sock); tcplib_init_sock(sock); if (cid < N_CLIENTS) signal Tcp.closed[cid](0); } void tcplib_extern_acked(struct tcplib_sock *sock) { int cid = find_client(sock); if (cid < N_CLIENTS) signal Tcp.acked[cid](); } #include "libtcp/circ.c" #include "libtcp/tcplib.c" struct tcplib_sock socks[uniqueCount("TCP_CLIENT")]; struct tcplib_sock *tcplib_accept(struct tcplib_sock *conn, struct sockaddr_in6 *from) { int cid = find_client(conn); printf("tcplib_accept: cid: %i\n", cid); if (cid == N_CLIENTS) return NULL; if (signal Tcp.accept[cid](from, &conn->tx_buf, &conn->tx_buf_len)) { if (conn->tx_buf == NULL) return NULL; return conn; } return NULL; } void tcplib_send_out(struct ip6_packet *msg, struct tcp_hdr *tcph) { printf("tcp output\n"); call IPAddress.setSource(&msg->ip6_hdr); tcph->chksum = htons(msg_cksum(&msg->ip6_hdr, msg->ip6_data, IANA_TCP)); call IP.send(msg); } command error_t Init.init() { int i; for (i = 0; i < uniqueCount("TCP_CLIENT"); i++) { tcplib_init_sock(&socks[i]); } return SUCCESS; } event void Boot.booted() { call Timer.startPeriodic(512); } event void Timer.fired() { tcplib_timer_process(); } event void IP.recv(struct ip6_hdr *iph, void *payload, size_t len, struct ip6_metadata *meta) { printf("tcp packet received\n"); tcplib_process(iph, payload); } command error_t Tcp.bind[uint8_t client](uint16_t port) { struct sockaddr_in6 addr; memclr(addr.sin6_addr.s6_addr, 16); addr.sin6_port = htons(port); tcplib_bind(&socks[client], &addr); return SUCCESS; } command error_t Tcp.connect[uint8_t client](struct sockaddr_in6 *dest, void *tx_buf, int tx_buf_len) { int rv; socks[client].tx_buf = tx_buf; socks[client].tx_buf_len = tx_buf_len; rv = tcplib_connect(&socks[client], dest); return rv ? FAIL : SUCCESS; } command error_t Tcp.send[uint8_t client](void *payload, uint16_t len) { if (tcplib_send(&socks[client], payload, len) < 0) return FAIL; return SUCCESS; } command error_t Tcp.close[uint8_t client]() { if (!tcplib_close(&socks[client])) return SUCCESS; return FAIL; } command error_t Tcp.abort[uint8_t client]() { if (tcplib_abort(&socks[client]) < 0) return FAIL; return SUCCESS; } event void IPAddress.changed(bool valid) { } default event bool Tcp.accept[uint8_t cid](struct sockaddr_in6 *from, void **tx_buf, int *tx_buf_len) { return FALSE; } default event void Tcp.connectDone[uint8_t cid](error_t e) {} default event void Tcp.recv[uint8_t cid](void *payload, uint16_t len) { } default event void Tcp.closed[uint8_t cid](error_t e) { } default event void Tcp.acked[uint8_t cid]() { } } tinyos-2.1.2+dfsg/tos/lib/net/blip/TcpSocketC.nc000066400000000000000000000002261207233610700213740ustar00rootroot00000000000000 generic configuration TcpSocketC() { provides interface Tcp; } implementation { components TcpC; Tcp = TcpC.Tcp[unique("TCP_CLIENT")]; } tinyos-2.1.2+dfsg/tos/lib/net/blip/TrackFlowsC.nc000066400000000000000000000005751207233610700215630ustar00rootroot00000000000000 configuration TrackFlowsC { } implementation { components MainC, TrackFlowsP, IPDispatchP; components SerialActiveMessageC as Serial; TrackFlowsP.Boot -> MainC; TrackFlowsP.SerialControl -> Serial; TrackFlowsP.IPExtensions -> IPDispatchP.IPExtensions; TrackFlowsP.Headers -> IPDispatchP.HopByHopExt; TrackFlowsP.FlowSend -> Serial.AMSend[AM_FLOW_ID_MSG]; } tinyos-2.1.2+dfsg/tos/lib/net/blip/TrackFlowsP.nc000066400000000000000000000102761207233610700215770ustar00rootroot00000000000000 #include "TrackFlows.h" module TrackFlowsP { uses { interface Boot; interface SplitControl as SerialControl; interface IPExtensions; interface TLVHeader as Headers; interface AMSend as FlowSend; } } implementation { bool flow_send_busy = FALSE; uint16_t current_flowid = 0; message_t flow_send; int send_flow_idx = -1, cur_idx = 0; nx_struct { nx_uint8_t flags; nx_uint8_t label; nx_struct flow_id_msg flow; } flow_cache[N_FORWARD_ENT * 3]; int get_entry() { cur_idx = (cur_idx + 1) % (N_FORWARD_ENT * 3); return cur_idx; } int lookup_entry(uint8_t label) { int i; for (i = 0; i < N_FORWARD_ENT * 3; i++) { if (flow_cache[i].flags == 1 && flow_cache[i].label == label) return i; } return -1; } event void Boot.booted() { call SerialControl.start(); flow_send_busy = FALSE; ip_memclr((void *)flow_cache, sizeof(flow_cache)); } event void FlowSend.sendDone(message_t *msg, error_t error) { flow_send_busy = FALSE; flow_cache[send_flow_idx].flags = 0; } void update_msg(struct ip6_hdr *iph, nx_struct flow_id *flow, uint8_t label, uint8_t nxt_hdr) { nx_struct flow_id_msg *payload; int i = get_entry(); if (i < 0) return; flow_cache[i].flags = 1; flow_cache[i].label = label; payload = &flow_cache[i].flow; memcpy(&payload->flow, flow, sizeof(nx_struct flow_id)); payload->src = ntohs(iph->ip6_src.s6_addr16[7]); payload->dst = ntohs(iph->ip6_dst.s6_addr16[7]); payload->local_address = TOS_NODE_ID; payload->nxt_hdr = nxt_hdr; } event void IPExtensions.handleExtensions(uint8_t label, struct ip6_hdr *iph, struct ip6_ext *hop, struct ip6_ext *dst, struct ip6_route *route, uint8_t nxt_hdr) { if (hop != NULL) { struct tlv_hdr *tlv = call IPExtensions.findTlv(hop, TLV_TYPE_FLOW); if (tlv != NULL && tlv->len == sizeof(struct tlv_hdr) + sizeof(nx_struct flow_id)) { update_msg(iph, (nx_struct flow_id *)(tlv + 1), label, nxt_hdr); } } } event void IPExtensions.reportTransmission(uint8_t label, send_policy_t *send) { int i, flow_idx = lookup_entry(label); nx_struct flow_id_msg *payload = (nx_struct flow_id_msg *)call FlowSend.getPayload(&flow_send, sizeof(nx_struct flow_id_msg)); if (flow_idx < 0) return; memcpy(payload, &flow_cache[flow_idx].flow, sizeof(nx_struct flow_id_msg)); payload->n_attempts = 0; for (i = 0; i < send->current && i < 3; i++) { // if (send->dest[i] == IEEE154_BROADCAST_ADDR) return; payload->attempts[i].next_hop = send->dest[i]; payload->attempts[i].tx = send->retries; } if (i < 3) { payload->attempts[i].next_hop = send->dest[i]; payload->attempts[i].tx = send->actRetries; i++; } payload->n_attempts = i; if (!flow_send_busy) { if (call FlowSend.send(0xffff, &flow_send, sizeof(nx_struct flow_id_msg)) == SUCCESS) { flow_send_busy = TRUE; send_flow_idx = flow_idx; return; } // otherwise fall through and invalidate the cache } flow_cache[flow_idx].flags = 0; } event struct tlv_hdr *Headers.getHeader(uint8_t label, struct ip6_hdr *msg, uint8_t nxt_hdr) { static uint8_t buf[sizeof(struct tlv_hdr) + sizeof(nx_struct flow_id)]; struct tlv_hdr *tlv; nx_struct flow_id *flow; tlv = (struct tlv_hdr *)buf; flow = (nx_struct flow_id *)(tlv + 1); tlv->type = TLV_TYPE_FLOW; tlv->len = sizeof(struct tlv_hdr) + sizeof(nx_struct flow_id); /* if (msg->ip6_dst.s6_addr[0] != 0xff || */ /* (msg->ip6_dst.s6_addr[0] == 0xff && */ /* (msg->ip6_dst.s6_addr[1] & 0x0f) > 2)) { */ flow->id = current_flowid++; update_msg(msg, flow, label, nxt_hdr); return tlv; /* } */ /* return NULL; */ } event void SerialControl.startDone(error_t e) { } event void SerialControl.stopDone(error_t e) { } } tinyos-2.1.2+dfsg/tos/lib/net/blip/UdpC.nc000066400000000000000000000005321207233610700202250ustar00rootroot00000000000000 #include configuration UdpC { provides interface UDP[uint8_t clnt]; provides interface BlipStatistics; } implementation { components MainC, IPStackC, UdpP, IPAddressC; UDP = UdpP; BlipStatistics = UdpP; MainC -> UdpP.Init; UdpP.IP -> IPStackC.IP[IANA_UDP]; UdpP.IPAddress -> IPAddressC; } tinyos-2.1.2+dfsg/tos/lib/net/blip/UdpP.nc000066400000000000000000000125401207233610700202440ustar00rootroot00000000000000 #include #include #include "blip_printf.h" module UdpP { provides interface UDP[uint8_t clnt]; provides interface Init; provides interface BlipStatistics; uses interface IP; uses interface IPAddress; } implementation { enum { N_CLIENTS = uniqueCount("UDP_CLIENT"), }; udp_statistics_t stats; uint16_t local_ports[N_CLIENTS]; enum { LOCAL_PORT_START = 51024U, LOCAL_PORT_STOP = 54999U, }; uint16_t last_localport = LOCAL_PORT_START; uint16_t alloc_lport(uint8_t clnt) { int i, done = 0; uint16_t compare = htons(last_localport); last_localport = (last_localport < LOCAL_PORT_STOP) ? last_localport + 1 : LOCAL_PORT_START; while (!done) { done = 1; for (i = 0; i < N_CLIENTS; i++) { if (local_ports[i] == compare) { last_localport = (last_localport < LOCAL_PORT_STOP) ? last_localport + 1 : LOCAL_PORT_START; compare = htons(last_localport); done = 0; break; } } } return last_localport; } command error_t Init.init() { call BlipStatistics.clear(); memclr((uint8_t *)local_ports, sizeof(uint16_t) * N_CLIENTS); return SUCCESS; } command error_t UDP.bind[uint8_t clnt](uint16_t port) { int i; port = htons(port); if (port > 0) { for (i = 0; i < N_CLIENTS; i++) if (i != clnt && local_ports[i] == port) return FAIL; } local_ports[clnt] = port; return SUCCESS; } event void IP.recv(struct ip6_hdr *iph, void *packet, size_t len, struct ip6_metadata *meta) { uint8_t i; struct sockaddr_in6 addr; struct udp_hdr *udph = (struct udp_hdr *)packet; uint16_t my_cksum, rx_cksum = ntohs(udph->chksum); struct ip_iovec v; printf("UDP - IP.recv: len: %i (%i, %i) srcport: %u dstport: %u\n", ntohs(iph->ip6_plen), len, ntohs(udph->len), ntohs(udph->srcport), ntohs(udph->dstport)); for (i = 0; i < N_CLIENTS; i++) if (local_ports[i] == udph->dstport) break; if (i == N_CLIENTS) { // TODO : send ICMP port closed message here. return; } memcpy(&addr.sin6_addr, &iph->ip6_src, 16); addr.sin6_port = udph->srcport; udph->chksum = 0; v.iov_base = packet; v.iov_len = len; v.iov_next = NULL; my_cksum = msg_cksum(iph, &v, IANA_UDP); printf("rx_cksum: 0x%x my_cksum: 0x%x\n", rx_cksum, my_cksum); if (rx_cksum != my_cksum) { BLIP_STATS_INCR(stats.cksum); printf("udp ckecksum computation failed: mine: 0x%x theirs: 0x%x [0x%x]\n", my_cksum, rx_cksum, len); printf_buf((void *)iph, sizeof(struct ip6_hdr)); // iov_print(&v); // drop return; } BLIP_STATS_INCR(stats.rcvd); signal UDP.recvfrom[i](&addr, (void *)(udph + 1), len - sizeof(struct udp_hdr), meta); } /** * Injection point of IP datagrams. This is only called for packets * being sent from this mote; packets which are being forwarded * never leave the stack and so never use this entry point. * * @msg an IP datagram with header fields (except for length) * @plen the length of the data payload added after the headers. */ command error_t UDP.sendto[uint8_t clnt](struct sockaddr_in6 *dest, void *payload, uint16_t len) { struct ip_iovec v[1]; v[0].iov_base = payload; v[0].iov_len = len; v[0].iov_next = NULL; return call UDP.sendtov[clnt](dest, &v[0]); } command error_t UDP.sendtov[uint8_t clnt](struct sockaddr_in6 *dest, struct ip_iovec *iov) { error_t rc; struct ip6_packet pkt; struct udp_hdr udp; struct ip_iovec v[1]; size_t len = iov_len(iov); // fill in all the packet fields memclr((uint8_t *)&pkt.ip6_hdr, sizeof(pkt.ip6_hdr)); memclr((uint8_t *)&udp, sizeof(udp)); memcpy(&pkt.ip6_hdr.ip6_dst, dest->sin6_addr.s6_addr, 16); call IPAddress.setSource(&pkt.ip6_hdr); if (local_ports[clnt] == 0 && (local_ports[clnt] = alloc_lport(clnt)) == 0) { return FAIL; } /* udp fields */ udp.srcport = local_ports[clnt]; udp.dstport = dest->sin6_port; udp.len = htons(len + sizeof(struct udp_hdr)); udp.chksum = 0; /* ip fields -- everything must be filled in now */ pkt.ip6_hdr.ip6_vfc = IPV6_VERSION; pkt.ip6_hdr.ip6_nxt = IANA_UDP; pkt.ip6_hdr.ip6_plen = udp.len; // set up the pointers v[0].iov_base = (uint8_t *)&udp; v[0].iov_len = sizeof(struct udp_hdr); v[0].iov_next = iov; pkt.ip6_data = &v[0]; udp.chksum = htons(msg_cksum(&pkt.ip6_hdr, v, IANA_UDP)); rc = call IP.send(&pkt); BLIP_STATS_INCR(stats.sent); return rc; } command void BlipStatistics.clear() { #ifdef BLIP_STATS memclr((uint8_t *)&stats, sizeof(udp_statistics_t)); #endif } command void BlipStatistics.get(udp_statistics_t *buf) { #ifdef BLIP_STATS ip_memcpy((uint8_t *)buf, (uint8_t *)&stats, sizeof(udp_statistics_t)); #endif } default event void UDP.recvfrom[uint8_t clnt](struct sockaddr_in6 *from, void *payload, uint16_t len, struct ip6_metadata *meta) {} event void IPAddress.changed(bool global_valid) {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/UdpSocketC.nc000066400000000000000000000002241207233610700213740ustar00rootroot00000000000000 generic configuration UdpSocketC() { provides interface UDP; } implementation { components UdpC; UDP = UdpC.UDP[unique("UDP_CLIENT")]; } tinyos-2.1.2+dfsg/tos/lib/net/blip/blip_printf.h000066400000000000000000000035301207233610700215320ustar00rootroot00000000000000#ifndef BLIP_PRINTF_H #define BLIP_PRINTF_H /* * Conditionally include printf functionality in an app. * * In the future we may allow more fine-grained control over weather * printf is enabled. * * Also include utility functions for dumping several blip structures. */ #ifdef PRINTFUART_ENABLED #include "printf.h" #include #include void printf_buf(uint8_t *buf, int len) { int i; for (i = 0; i < len; i++) { printf("%02x ", buf[i]); } printf("\n"); } /* printf a whole iovec */ void iov_print(struct ip_iovec *iov) { struct ip_iovec *cur = iov; while (cur != NULL) { int i; printf("iovec (%p, %i) ", cur, cur->iov_len); for (i = 0; i < cur->iov_len; i++) { printf("%02x ", (uint8_t)cur->iov_base[i]); } printf("\n"); cur = cur->iov_next; } } /* printf an internet address */ void printf_in6addr(struct in6_addr *a) { static char print_buf[64]; inet_ntop6(a, print_buf, 64); printf(print_buf); } int printf_ieee154addr(ieee154_addr_t *in) { int i; switch (in->ieee_mode) { case IEEE154_ADDR_SHORT: printf("IEEE154_ADDR_SHORT: 0x%x", in->i_saddr); break; case IEEE154_ADDR_EXT: printf("IEEE154_ADDR_EXT: "); for (i = 7; i >= 0; i--) { printf("%02x", in->i_laddr.data[i]); if (i > 0) printf(":"); } break; } return 0; } #else /* PRINTFUART_ENABLED */ #if defined (_H_msp430hardware_h) || defined (_H_atmega128hardware_H) #include #else #ifdef __M16C60HARDWARE_H__ #include "m16c60_printf.h" #else #include "generic_printf.h" #endif #endif #undef putchar /* disable all printfs by removing them in the preprocessor */ #define printf(fmt, args ...) ; #define printfflush() ; #define printf_in6addr(a) ; #define printf_buf(buf, len) ; #define iov_print(iov) ; #endif /* PRINTFUART_ENABLED */ #endif tinyos-2.1.2+dfsg/tos/lib/net/blip/dhcp/000077500000000000000000000000001207233610700177665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/blip/dhcp/Dhcp6ClientC.nc000066400000000000000000000054351207233610700225250ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * DHCP v6 Client implementation for TinyOS * * Implements a simple subset of RFC3315 DHCP for stateful address * configuration. This protocol engine solicits on-link DHCP servers * or relay agents, and then attempts to obtain permanent (IA_NA) * addresses from them. After an address is acquired, it will renew * it using the parameters contained in the Identity Association * binding; if the lease expires, it will revoke the address using the * IPAddress interface. At that point all components should stop * using that address as it is no longer valid. * * @author Stephen Dawson-Haggerty */ configuration Dhcp6ClientC { provides interface Dhcp6Info; } implementation { components Dhcp6ClientP; components IPStackControlP; components new UdpSocketC(); components new TimerMilliC(); components RandomC, Ieee154AddressC, IPAddressC; Dhcp6Info = Dhcp6ClientP; IPStackControlP.StdControl -> Dhcp6ClientP; Dhcp6ClientP.UDP -> UdpSocketC; Dhcp6ClientP.Timer -> TimerMilliC; Dhcp6ClientP.Ieee154Address -> Ieee154AddressC; Dhcp6ClientP.IPAddress -> IPAddressC; Dhcp6ClientP.Random -> RandomC; components LedsC; Dhcp6ClientP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/net/blip/dhcp/Dhcp6ClientP.nc000066400000000000000000000304441207233610700225400ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * DHCP v6 Client implementation for TinyOS * * Implements a simple subset of RFC3315 DHCP for stateful address * configuration. This protocol engine solicits on-link DHCP servers * or relay agents, and then attempts to obtain permanent (IA_NA) * addresses from them. After an address is acquired, it will renew * it using the parameters contained in the Identity Association * binding; if the lease expires, it will revoke the address using the * IPAddress interface. At that point all components should stop * using that address as it is no longer valid. * * @author Stephen Dawson-Haggerty */ #include "dhcp6.h" module Dhcp6ClientP { provides { interface Dhcp6Info; interface StdControl; } uses { interface UDP; interface Timer; interface Random; interface IPAddress; interface Ieee154Address; interface Leds; } } implementation { int m_state; // txid: current transaction id // t1: time after which to renew the current IA binding from the original server // t2: time after which to renew using any available server // m_time: timeout clock used for state machine transitions // valid_lifetime: valid life of address obtained uint32_t m_txid, t1, t2, m_time = 0, valid_lifetime = 0; // the dhcp6 server we are currently interacting with struct sockaddr_in6 m_srv_addr; // DUID of the server we're talking and have obtained the binding from bool m_serverid_valid = FALSE; char m_serverid[DH6_MAX_DUIDLEN]; // weather to send unicast messages once we've picked a server from // ADVERTIZE messages bool m_unicast = TRUE; enum { // my IAID for all transactions IAID = 1, VALID_WAIT = 0xff, // how long to send requests before hopping back to SOLICIT REQUEST_TIMEOUT = 120, TIMER_PERIOD = 15, }; command error_t StdControl.start() { m_state = DH6_SOLICIT; call UDP.bind(DH6PORT_DOWNSTREAM); // call Timer.startPeriodic(1024 * TIMER_PERIOD); call Timer.startOneShot((1024L * TIMER_PERIOD) % (call Random.rand16())); return SUCCESS; } command error_t StdControl.stop() { call Timer.stop(); valid_lifetime = 0; call UDP.bind(0); call IPAddress.removeAddress(); return SUCCESS; } void setup(struct dh6_request *req, int type) { ieee154_laddr_t eui64; m_txid = call Random.rand32() & 0xffffff; eui64 = call Ieee154Address.getExtAddr(); req->dh6_hdr.dh6_type_txid = htonl((((uint32_t)type << 24)) | m_txid); req->dh6_id.type = htons(DH6OPT_CLIENTID); req->dh6_id.len = htons(12); req->dh6_id.duid_ll.duid_type = htons(3); req->dh6_id.duid_ll.hw_type = htons(HWTYPE_EUI64); memcpy(req->dh6_id.duid_ll.eui64, eui64.data, 8); } void sendSolicit() { struct dh6_request sol; // create a solicit message setup(&sol, DH6_SOLICIT); // these always go to the ALLAGENT multicast group, so overwrite // whoever we might have been corresponding with. inet_pton6(DH6ADDR_ALLAGENT, &m_srv_addr.sin6_addr); m_srv_addr.sin6_port = htons(DH6PORT_UPSTREAM); call Leds.led0Toggle(); call UDP.sendto(&m_srv_addr, &sol, sizeof(struct dh6_solicit)); } void sendRequest() { char msg[sizeof(struct dh6_request) + sizeof(m_serverid)]; struct dh6_request *req = (struct dh6_request *)msg; int len = sizeof(struct dh6_request); struct dh6_opt_header *hdr = (struct dh6_opt_header *)m_serverid; setup(req, DH6_REQUEST); req->dh6_ia.type = ntohs(DH6OPT_IA_NA); req->dh6_ia.len = ntohs(12); req->dh6_ia.iaid = ntohl(IAID); req->dh6_ia.t1 = 0xffffffff; req->dh6_ia.t2 = 0xffffffff; memcpy(msg + sizeof(struct dh6_request), m_serverid, sizeof(m_serverid)); if (!m_serverid_valid) { return; } if (ntohs(hdr->len) > sizeof(m_serverid)) { return; } len += ntohs(hdr->len) + sizeof(struct dh6_opt_header); call UDP.sendto(&m_srv_addr, msg, len); } void sendRenew() { char msg[sizeof(struct dh6_request) + sizeof(m_serverid) + sizeof(struct dh6_iaaddr)]; struct dh6_request *req = (struct dh6_request *)msg; int len; struct dh6_opt_header *srvid = (struct dh6_opt_header *)m_serverid; struct dh6_iaaddr *iaaddr = (struct dh6_iaaddr *)(req + 1); void *msg_srvid = (iaaddr + 1); // request and server DUID len = sizeof(struct dh6_request) + sizeof(struct dh6_opt_header) + ntohs(srvid->len); setup(req, DH6_RENEW); req->dh6_ia.type = ntohs(DH6OPT_IA_NA); req->dh6_ia.len = ntohs(12 + sizeof(struct dh6_iaaddr)); req->dh6_ia.iaid = ntohl(IAID); req->dh6_ia.t1 = t1; req->dh6_ia.t2 = t2; len += sizeof(struct dh6_iaaddr); iaaddr->type = htons(5); iaaddr->len = htons(24); call IPAddress.getGlobalAddr(&iaaddr->addr); iaaddr->preferred_lifetime = htonl(3600); //preferred_lifetime); iaaddr->valid_lifetime = htonl(7200);//preferred_lifetime); memcpy(msg_srvid, m_serverid, sizeof(m_serverid)); call UDP.sendto(&m_srv_addr, msg, len); } event void Timer.fired() { // state machine transition timeouts if (!call Timer.isRunning()) call Timer.startPeriodic(1024L * TIMER_PERIOD); switch (m_state) { case DH6_SOLICIT: sendSolicit(); break; case DH6_REQUEST: if (m_time > REQUEST_TIMEOUT) { m_state = DH6_SOLICIT; m_time = 0; sendSolicit(); } else { sendRequest(); } break; case DH6_RENEW: if (m_time > 0 && m_time > ntohl(t2)) { // maybe pick a different server... m_state = DH6_SOLICIT; m_time = 0; sendSolicit(); } else { sendRenew(); } break; case VALID_WAIT: if (m_time > 0 && m_time > ntohl(t1)) { m_state = DH6_RENEW; } break; } if (m_time > 0) m_time += TIMER_PERIOD; // address expirations are separate from the state machine // transitions if (valid_lifetime > TIMER_PERIOD && valid_lifetime <= TIMER_PERIOD * 2) { // lease really expired m_state = DH6_SOLICIT; call IPAddress.removeAddress(); valid_lifetime = 0; } if (valid_lifetime > 0) valid_lifetime -= TIMER_PERIOD; } void *findOption(void *msg, int len, int type) { while (len >= sizeof(struct dh6_opt_header)) { struct dh6_opt_header *opt = msg; if (opt->type == htons(type)) { return msg; } else if (opt->len == 0) { break; } else { msg = ((char*)msg) + ntohs(opt->len) + sizeof(struct dh6_opt_header); len -= ntohs(opt->len) + sizeof(struct dh6_opt_header); } } return NULL; } event void UDP.recvfrom(struct sockaddr_in6 *src, void *payload, uint16_t len, struct ip6_metadata *meta) { struct dh6_header *hdr = payload; struct dh6_opt_header *opt; void *id; uint16_t type = ntohl(hdr->dh6_type_txid) >> 24; uint32_t txid = ntohl(hdr->dh6_type_txid) & 0xffffff; if (txid != m_txid) return; switch (m_state) { case DH6_SOLICIT: switch (type) { case DH6_ADVERTISE: opt = id = findOption(hdr + 1, len - sizeof(struct dh6_header), DH6OPT_SERVERID); if (id) { // save the server DUID for use in reply messages and start // requesting an address. if (ntohs(opt->len) + sizeof(struct dh6_opt_header) < sizeof(m_serverid)) { m_serverid_valid = TRUE; memcpy(m_serverid, id, ntohs(opt->len) + sizeof(struct dh6_opt_header)); // we can unicast to this guy now // memcpy(&m_srv_addr, src, sizeof(struct sockaddr_in6)); m_time = 1; m_state = DH6_REQUEST; if (m_unicast) memcpy(&m_srv_addr, src, sizeof(struct sockaddr_in6)); // don't wait a long while before we send our request if (!call Timer.isOneShot ()) call Timer.startOneShot(1024L); } } } break; case DH6_REQUEST: case DH6_RENEW: call Leds.led1Toggle(); if (type != DH6_REPLY) return; opt = id = findOption(hdr + 1, len - sizeof(struct dh6_header), DH6OPT_SERVERID); if (id) { // check that the serverid is the one we asked for if (memcmp(m_serverid, id, ntohs(opt->len) + sizeof(struct dh6_opt_header)) != 0) return; // TODO : check client id } opt = id = findOption(hdr + 1, len - sizeof(struct dh6_header), DH6OPT_IA_NA); if (id) { struct dh6_ia *ia = id; struct dh6_status *status; void *addr_opt; // we got an IA_NA block back if (ntohl(ia->iaid) != IAID) return; // see if there's an error code status = findOption(ia + 1, ntohs(ia->len) + sizeof(struct dh6_opt_header) - sizeof(struct dh6_ia), 13); if (status) { if (status->code != htons(0)) { if (m_state == DH6_RENEW) { m_state = DH6_REQUEST; m_time = 1; } else { m_state = DH6_SOLICIT; m_time = 0; } call IPAddress.removeAddress(); call Timer.startOneShot (0); // attempt immediate recovery return; } } // otherwise, hopefully there's an address addr_opt = findOption(ia + 1, ntohs(ia->len) + sizeof(struct dh6_opt_header) - sizeof(struct dh6_ia), 5); if (addr_opt) { // got an address... save it and wait for it to expire struct dh6_iaaddr *addr = addr_opt; if (m_state != DH6_RENEW) // only set it if it changed call IPAddress.setAddress(&addr->addr); t1 = ia->t1; t2 = ia->t2; m_time = 1; valid_lifetime = ntohl(addr->valid_lifetime); m_state = VALID_WAIT; call Leds.led2Toggle(); } } break; } } command int Dhcp6Info.getTimers(struct dh6_timers *t) { t->iaid = IAID; t->valid_lifetime = valid_lifetime; t->clock = m_time; t->t1 = ntohl(t1); t->t2 = ntohl(t2); return 0; } command int Dhcp6Info.getDuid(uint8_t *buf, int len) { if (m_serverid_valid) { struct dh6_opt_header *opt = (struct dh6_opt_header *)m_serverid; if (ntohs(opt->len) < len) { memcpy(buf, m_serverid + sizeof(struct dh6_opt_header), ntohs(opt->len)); return ntohs(opt->len); } } return -1; } command void Dhcp6Info.useUnicast(bool yes) { m_unicast = yes; } event void IPAddress.changed(bool global_valid) {} event void Ieee154Address.changed() {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/dhcp/Dhcp6Info.nc000066400000000000000000000046031207233610700220730ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface for getting information about a client's status. * * @author Stephen Dawson-Haggerty */ #include interface Dhcp6Info { /** * Get the DHCP Unique Identifier of the server the client is talking to. * * @buf return buffer * @len length of buf * @return number of bytes written, or -1 on error */ command int getDuid(uint8_t *buf, int len); /** * @t struct containing the current state of timers associated with our lease. */ command int getTimers(struct dh6_timers *t); /** * controls weather or not the client sends unicast messages to dhcp * servers. default is yes; if no, the client will always use the * link-local all dhcp agents multicast group (ff02::1:a) */ command void useUnicast(bool yes); } tinyos-2.1.2+dfsg/tos/lib/net/blip/dhcp/Dhcp6P.nc000066400000000000000000000046001207233610700213740ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "dhcp6.h" module Dhcp6P { provides interface StdControl; uses { interface UDP; interface Timer; interface Random; } } implementation { int m_state; uint32_t m_txid; command error_t StdControl.start() { m_state = DH6_SOLICIT; m_txid = call Random.rand32(); call UDP.bind(DH6PORT_DOWNSTREAM); } command error_t StdControl.stop() { } void sendSolicit() { struct dh6_solicit sol; sol.dh6_hdr.dh6_type_txid = htonl((DHCP_SOLICIT << 16) | m_txid); sol.dh6_id.type = htons(DH6OPT_CLIENTID); sol.dh6_id.len = htons(8); sol.dh6_id.duid_ll.duid_type = 3; sol.dh6_id.duid_ll.hw_type = HWTYPE_EUI64; } event void Timer.fired() { switch (m_state) { case DH6_SOLICIT: sendSolicit(); break; } } } tinyos-2.1.2+dfsg/tos/lib/net/blip/dhcp/Dhcp6RelayC.nc000066400000000000000000000051421207233610700223560ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * DHCP v6 relay agent for TinyOS * * DHCP allows relay agents to forward traffic to an external DHCP * server which is not on-link with the requesting client. To do * this, the relay agent reencapsulates the request message and * includes its own address and the address of the peer, before * sending the request on to the DCHP servers multicast group. In * blip, this group is routed to the edge of the network where the * dhcp server is presumably running. * * @author Stephen Dawson-Haggerty */ configuration Dhcp6RelayC { } implementation { components Dhcp6RelayP, Dhcp6ClientC; components IPAddressC, Ieee154AddressC; components new TimerMilliC(), new UdpSocketC(); components RandomC; components MainC; Dhcp6RelayP.UDP -> UdpSocketC; Dhcp6RelayP.IPAddress -> IPAddressC; Dhcp6RelayP.Ieee154Address -> Ieee154AddressC; Dhcp6RelayP.Random -> RandomC; Dhcp6RelayP.Boot -> MainC; Dhcp6RelayP.AdvTimer -> TimerMilliC; Dhcp6RelayP.Dhcp6Info -> Dhcp6ClientC; } tinyos-2.1.2+dfsg/tos/lib/net/blip/dhcp/Dhcp6RelayP.nc000066400000000000000000000143261207233610700223770ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * DHCP v6 Relay Agent * * This agent forwards requests to the edge of the network. It can * proxy the responses to SOLICIT messages so that there is less of a * reply implosion problem when bringing up a large network; doing so * is the default behavior. * * @author Stephen Dawson-Haggerty */ #include "blip_printf.h" #include "dhcp6.h" module Dhcp6RelayP { uses { interface UDP; interface Timer as AdvTimer; interface IPAddress; interface Ieee154Address; interface Boot; interface Random; interface Dhcp6Info; } } implementation { bool m_alive = FALSE; #define DHCP_PROXY_SOLICIT #ifdef DHCP_PROXY_SOLICIT void *m_msg; int m_len; #endif event void Boot.booted() { call UDP.bind(DH6PORT_UPSTREAM); } void *findOption(void *msg, int len, int type) { while (len >= sizeof(struct dh6_opt_header)) { struct dh6_opt_header *opt = msg; if (opt->type == htons(type)) { return msg; } else if (opt->len == 0) { break; } else { msg = ((char*)msg) + ntohs(opt->len) + sizeof(struct dh6_opt_header); len -= ntohs(opt->len) + sizeof(struct dh6_opt_header); } } return NULL; } #ifdef DHCP_PROXY_SOLICIT int setup(struct dh6_request *req, int type, uint32_t txid) { int len; req->dh6_hdr.dh6_type_txid = htonl((((uint32_t)type << 24)) | (txid & 0xffffff)); req->dh6_id.type = htons(DH6OPT_SERVERID); // we need to send back the DUID of our server len = call Dhcp6Info.getDuid((uint8_t *)&req->dh6_id.duid_ll, DH6_MAX_DUIDLEN); if (len < 0) return -1; req->dh6_id.len = htons(len); return len; } #endif event void UDP.recvfrom(struct sockaddr_in6 *src, void *payload, uint16_t len, struct ip6_metadata *meta) { struct dh6_header *hdr = payload; uint16_t type = ntohl(hdr->dh6_type_txid) >> 24; printf("relay agent RX!: %i\n", type); if (!m_alive) return; #ifdef DHCP_PROXY_SOLICIT if (type == DH6_SOLICIT) { // send ADVERTISE if (!call AdvTimer.isRunning()) { struct dh6_request *req; struct sockaddr_in6 *m_src; m_msg = malloc(sizeof(struct dh6_request) + sizeof(struct sockaddr_in6) + DH6_MAX_DUIDLEN); if (!m_msg) return; req = (struct dh6_request *)(((char *)m_msg) + sizeof(struct sockaddr_in6)); m_src = (struct sockaddr_in6 *)m_msg; if ((m_len = setup(req, DH6_ADVERTISE, ntohl(hdr->dh6_type_txid) & 0xffffff )) < 0) { printf("DHCP Message construction faild\n"); free(m_msg); return; } m_len += offsetof(struct dh6_request, dh6_id.duid_ll); memcpy(m_src, src, sizeof(struct sockaddr_in6)); call AdvTimer.startOneShot(call Random.rand16() & 0x7); } } else #endif // DHCP_PROXY_SOLICIT if (type == DH6_RELAY_REPLY) { struct dh6_relay_hdr *fw_hdr = payload; struct sockaddr_in6 peer; memcpy(&peer.sin6_addr, &fw_hdr->peer_addr, sizeof(struct in6_addr)); // inet_pton6(DH6ADDR_ALLSERVER, &peer.sin6_addr); peer.sin6_port = htons(DH6PORT_DOWNSTREAM); if (ntohs(fw_hdr->opt_type) != 9) return; // if (ntohs(fw_hdr->opt_len) > len - sizeof(struct dh6_relay_hdr)) return; call UDP.sendto(&peer, (void *)(fw_hdr + 1), len - sizeof(struct dh6_relay_hdr)); } else { // just forward it... struct dh6_relay_hdr fw_hdr; struct ip_iovec v[2]; struct sockaddr_in6 srv_addr; inet_pton6(DH6ADDR_ALLSERVER, &srv_addr.sin6_addr); srv_addr.sin6_port = htons(DH6PORT_UPSTREAM); fw_hdr.type = DH6_RELAY_FORW; fw_hdr.hopcount = 1; call IPAddress.getGlobalAddr(&fw_hdr.link_addr); memcpy(&fw_hdr.peer_addr, &src->sin6_addr, sizeof(struct in6_addr)); fw_hdr.opt_type = htons(9); fw_hdr.opt_len = htons(len); v[0].iov_base = (void *)&fw_hdr; v[0].iov_len = sizeof(fw_hdr); v[0].iov_next = &v[1]; v[1].iov_base = payload; v[1].iov_len = len; v[1].iov_next = NULL; call UDP.sendtov(&srv_addr, v); } } event void AdvTimer.fired() { struct dh6_request *req; struct sockaddr_in6 *m_src; req = (struct dh6_request *)(((char *)m_msg) + sizeof(struct sockaddr_in6)); m_src = (struct sockaddr_in6 *)m_msg; call UDP.sendto(m_src, req, m_len); free(m_msg); } event void Ieee154Address.changed() {} event void IPAddress.changed(bool global_valid) { m_alive = global_valid; } } tinyos-2.1.2+dfsg/tos/lib/net/blip/dhcp/DhcpCmdC.nc000066400000000000000000000035461207233610700217250ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ configuration DhcpCmdC { } implementation { components DhcpCmdP; components new ShellCommandC("leases"); components Dhcp6ClientC, IPAddressC; DhcpCmdP.ShellCommand -> ShellCommandC; DhcpCmdP.Dhcp6Info -> Dhcp6ClientC; DhcpCmdP.IPAddress -> IPAddressC; } tinyos-2.1.2+dfsg/tos/lib/net/blip/dhcp/DhcpCmdP.nc000066400000000000000000000055741207233610700217450ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ module DhcpCmdP { uses { interface ShellCommand; interface Dhcp6Info; interface IPAddress; } } implementation { #define TO_CHAR(X) (((X) < 10) ? ('0' + (X)) : ('a' + ((X) - 10))) event char *ShellCommand.eval(int argc, char **argv) { #define LEN (MAX_REPLY_LEN - (cur - buf)) char *cur, *buf = call ShellCommand.getBuffer(MAX_REPLY_LEN); struct in6_addr addr; struct dh6_timers timers; int duid_len; uint8_t duid[24]; if (!(call IPAddress.getGlobalAddr(&addr))) return "no valid lease\n"; call Dhcp6Info.getTimers(&timers); cur = buf; cur += snprintf(cur, LEN, "lease on "); cur += inet_ntop6(&addr, cur, LEN) - 1; *cur++ = '\n'; cur += snprintf(cur, LEN, "iaid: %i valid: %li t1: %li t2: %li\n", timers.iaid, timers.valid_lifetime, timers.t1, timers.t2); if ((duid_len = call Dhcp6Info.getDuid(duid, sizeof(duid))) > 0 && LEN > duid_len * 3 + 6) { int i; cur += snprintf(cur, LEN, "duid: "); for (i = 0; i < duid_len; i++) { *cur++ = TO_CHAR(duid[i] >> 4); *cur++ = TO_CHAR(duid[i] & 0x0f); if (i < duid_len - 1) *cur++ = ':'; } *cur++ = '\n'; } *cur++ = '\0'; return buf; } event void IPAddress.changed(bool valid) {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/dhcp/NoDhcpC.nc000066400000000000000000000043671207233610700216000ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Component for doing compile-time address allocation. Wired by the * stack, sets a static address based on IN6_PREFIX and TOS_NODE_ID on * boot. Useful for development or of you want to hard-code addresses. * * @author Stephen Dawson-Haggerty */ #include module NoDhcpC { uses { interface Boot; interface IPAddress; } } implementation { event void Boot.booted() { struct in6_addr addr; memset(&addr, 0, sizeof(addr)); inet_pton6(IN6_PREFIX, &addr); addr.s6_addr16[7] = htons(TOS_NODE_ID); call IPAddress.setAddress(&addr); } event void IPAddress.changed(bool valid) {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/dhcp/dhcp6.h000066400000000000000000000106371207233610700211520ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef _DHCP_H #define _DHCP_H #include /* Error Values */ #define DH6ERR_FAILURE 16 #define DH6ERR_AUTHFAIL 17 #define DH6ERR_POORLYFORMED 18 #define DH6ERR_UNAVAIL 19 #define DH6ERR_OPTUNAVAIL 20 /* Message type */ #define DH6_SOLICIT 1 #define DH6_ADVERTISE 2 #define DH6_REQUEST 3 #define DH6_CONFIRM 4 #define DH6_RENEW 5 #define DH6_REBIND 6 #define DH6_REPLY 7 #define DH6_RELEASE 8 #define DH6_DECLINE 9 #define DH6_RECONFIGURE 10 #define DH6_INFORM_REQ 11 #define DH6_RELAY_FORW 12 #define DH6_RELAY_REPLY 13 /* Predefined addresses */ #define DH6ADDR_ALLAGENT "ff02::1:2" #define DH6ADDR_ALLSERVER "ff05::1:3" #define DH6PORT_DOWNSTREAM 546 #define DH6PORT_UPSTREAM 547 /* Protocol constants */ /* timer parameters (msec, unless explicitly commented) */ #define SOL_MAX_DELAY 1000 #define SOL_TIMEOUT 1000 #define SOL_MAX_RT 120000 #define INF_TIMEOUT 1000 #define INF_MAX_RT 120000 #define REQ_TIMEOUT 1000 #define REQ_MAX_RT 30000 #define REQ_MAX_RC 10 /* Max Request retry attempts */ #define REN_TIMEOUT 10000 /* 10secs */ #define REN_MAX_RT 600000 /* 600secs */ #define REB_TIMEOUT 10000 /* 10secs */ #define REB_MAX_RT 600000 /* 600secs */ #define REL_TIMEOUT 1000 /* 1 sec */ #define REL_MAX_RC 5 #define DH6OPT_CLIENTID 1 #define DH6OPT_SERVERID 2 #define DH6OPT_IA_NA 3 #define DH6OPT_IA_TA 4 #define DH6OPT_IAADDR 5 #define DH6OPT_ORO 6 #define DH6OPT_PREFERENCE 7 #define HWTYPE_EUI64 27 #define DH6_MAX_DUIDLEN 24 struct dh6_header { uint32_t dh6_type_txid; }; struct dh6_opt_header { uint16_t type; uint16_t len; } __attribute__ ((__packed__)); struct dh6_clientid { uint16_t type; uint16_t len; struct { uint16_t duid_type; uint16_t hw_type; uint8_t eui64[8]; } duid_ll; } __attribute__ ((__packed__)); struct dh6_ia { uint16_t type; uint16_t len; uint32_t iaid; uint32_t t1; uint32_t t2; } __attribute__ ((__packed__));; struct dh6_iaaddr { uint16_t type; uint16_t len; struct in6_addr addr; uint32_t preferred_lifetime; uint32_t valid_lifetime; } __attribute__ ((__packed__));; struct dh6_status { uint16_t type; uint16_t len; uint16_t code; }; struct dh6_solicit { struct dh6_header dh6_hdr; struct dh6_clientid dh6_id; } __attribute__ ((__packed__)); struct dh6_request { struct dh6_header dh6_hdr; struct dh6_clientid dh6_id; struct dh6_ia dh6_ia; } __attribute__ ((__packed__)); struct dh6_relay_hdr { uint8_t type; uint8_t hopcount; struct in6_addr link_addr; struct in6_addr peer_addr; uint16_t opt_type; uint16_t opt_len; } __attribute__ ((__packed__)); struct dh6_timers { int iaid; uint32_t valid_lifetime; uint32_t clock; uint32_t t1; uint32_t t2; }; #endif tinyos-2.1.2+dfsg/tos/lib/net/blip/doc/000077500000000000000000000000001207233610700176155ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/blip/doc/README000066400000000000000000000075661207233610700205130ustar00rootroot00000000000000 @title blip documentation @author Stephen Dawson-Haggerty stevedh@eecs.berkeley.edu @release public --------------------------------------------------------------------- 1. Installation - This is only going to work on linux. - The recommended version of TinyOS is a recent CVS checkout. This is necessary for appropriate radio stack support. - Make sure the c serial tools are built in $TOSROOT/support/sdk/c/sf. You may need to run ./bootstrap, ./configure, and make in that folder to generate libmote.a. 2. Building - Build a test app: * cd to $TOSROOT/apps/UDPEcho/ and try typing `make blip` - Build the Ieee802.15.4 bridge to your computer * cd to $TOSROOT/apps/IPBaseStation/ and `make blip` - Build the driver * cd to $TOSROOT/support/sdk/c/blip * run ./bootstrap * run ./configure * run make 3. Running - Install IPBaseStation on a mote. This will be your computer's interface to the world of low-power radio. Setting the node id and channel is not important-- these settings will be overwritten. - Start the driver (once you've built it) * cd $TOSROOT/support/sdk/c/blip * edit the config file $TOSROOT/support/sdk/c/blip/serial_tun.conf * set 'addr' you would like your computer's interface to use on the PAN * leave 'proxy' set to 'lo' * sudo driver/ip-driver /dev/ttyUSB0 telosb (replace the device and baud with whatever you're using) The config file is assumed to be in the CWD when ip-driver starts; if this is not the case it may be specified using '-c ' - The driver registers itself on the fec0::/64 subnet (or whatever you have specified in the config file). - If you program a few motes with UDPEcho, their addresses are formed with octets 15 and 16 of the IPv6 address comming from the 802.15.4 short address you programmed them with. Octets 9-14 are zero, so the address formed is: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | network prefix | zero | id | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ ICMPv6 DAD is not performed. - For instance, if you program a mote with ID 101 (0x65), you can try ping6 fec0::65 tracert6 fec0::65 nc6 -u fec0::65 7 nc6 -u fec0::65 2000 UDPEcho runs an echo service on port 7, and a simple shell on port 2000; type 'help' for a list of commands. - The motes can also report back statistics every 15 seconds over UDP. They will send these reports to an address specified in the application make file; however these reports are disabled by default. You can observe these statistics using the Listener.py script in $TOSROOT/apps/UDPEcho/: `python Listener.py`. - The driver provides a simple console when running, which allows you to inspect and manipulates routes, and view statistics. The console runs as a telnet service on port 6106. - A good way of understanding what is happening is to start wireshark on tun0; you should be able to observe the neighbor discovery process as motes boot. You may also notice messages sent to ff05::1; these are routing updates. They are sent from a binary exponential timer with a maximum period of 5 minutes to inform the router of mote's presence; however, they are suppressed by data traffic since the routing updates will be piggybacked on it. - Further reading: doc/ contains a numbers of README's related to pieces of blip such as the socket interface, the shell, and network programming support. For more technical details on IPv6, please see any reference on the subject. Many of the documents produced by the IETF ROLL and 6lowpan working groups are relevent to this design space. tinyos-2.1.2+dfsg/tos/lib/net/blip/doc/README-IP000066400000000000000000000027541207233610700210130ustar00rootroot00000000000000 @title IP data-structure documentation @author Stephen Dawson-Haggerty @release public ---------------------------------------------------------------------- The ip-stack provides a bare IP datagram interface to the network layer; this is documented in comments in the code. For the purposes of socket programming, two data structures are most important. The 'struct sockaddr_in6' and the 'struct in6_addr'. They are substantially shared with the linux/bsd versions, and reproduced below. struct in6_addr { union { uint8_t u6_addr8[16]; uint16_t u6_addr16[8]; uint32_t u6_addr32[4]; } in6_u; #define s6_addr in6_u.u6_addr8 #define s6_addr16 in6_u.u6_addr16 #define s6_addr32 in6_u.u6_addr32 }; struct sockaddr_in6 { uint16_t sin6_port; struct in6_addr sin6_addr; }; void inet_pton6(char *addr, struct in6_addr *dest); Usage ---------------------------------------------------------------------- Example 1: Suppose we want to setup a sockaddr_in6 to point to ff02::5, port 10000: { struct sockaddr_in6 sa6; inet_pton6("ff02::5", &sa6.sin6_addr); sa6.sin6_port = htons(10000); } Example 2: Do the same thing, but without the overhead of storing and parsing the string address representation. { struct sockaddr_in6 sa6; memset(&sa6, 0, sizeof(struct sockaddr_in6)); sa6.sin6_addr.s6_addr16[0] = htons(0xff02); sa6.sin6_addr.s6_addr[15] = 5; sa6.sin6_port = htons(10000); } This code is very unix-y; the second example will work on *nix's. tinyos-2.1.2+dfsg/tos/lib/net/blip/doc/README-MERAKI000066400000000000000000000043301207233610700214430ustar00rootroot00000000000000 @title Meraki Documentation @author Stephen Dawson-Haggerty stevedh@eecs.berkeley.edu @release internal --------------------------------------------------------------------- This README explains how to use a Meraki Mini programmed with OpenWRT/kamikaze as a border router. This document and the code make the following assumptions: - The Meraki has a public IP address or is in a DMZ such that the 6over4 tunneling protocol will work. - The Meraki is the sole router for a prefix Background --------------------------------------------------------------------- To ease configuration, the important parameters are stored in a database. When the meraki waits up, it hits the database and downloads a few config files which it then uses. To grab new configuration, you can either log in and manually restart the router daemon, or just reboot. The parameters stored are: prefix : the one received from the hurricane electric tunnel broker short addr : the address of this device on the network channel : which channel to use Install --------------------------------------------------------------------- 1. Install the router daemon on the meraki using either the provided ipkg, or your own if you've built a version. Building the package is very easy but not covered here. 'ipkg update' 'ipkg install lowpan-bridge_1.2-855_mips.ipk' In order for the dependancies to be automatically installed, you must do the update first so that the package system downloads the directory with the necessary packages. 2. Set up the configuration parameters in the database. The key used is the hostname; precisely, whatever 'uname -n' prints. If no key is found in the database the meraki will just use defaults. 3. Start the daemon with '/etc/init.d/lowpan-bridge start' This will run automatically when the meraki boots. ... I think that's it. Pretty easy! Bugs/Notes --------------------------------------------------------------------- There seems to be an issue with the serial port on the meraki. The effect is that packets are dropped when you send too quickly. This mostly effects fragmentation. As a stopgap, I've inserted a timeout between fragments, but this means the performance is somewhat worse then on a PC and a micaz. tinyos-2.1.2+dfsg/tos/lib/net/blip/doc/README-NWPROG000066400000000000000000000057271207233610700215220ustar00rootroot00000000000000 @title Meraki Documentation @author Stephen Dawson-Haggerty stevedh@eecs.berkeley.edu @release public --------------------------------------------------------------------- What is it? --------------------------------------------------------------------- nwprog is a method of over-the-air programming. It uses much of the machinery Deluge has developed, like the boot loader and flash layout, but substitutes a simpler transport using UDP for Deluge's dissemination algorithm. This means that it is point-to-point, and not incredibly appropriate for reprogramming an entire network all at once. How do I get it? --------------------------------------------------------------------- It is included with the b6lowpan stack. It reuses much of the Deluge code directly from the TinyOS tree without shadowing the files. Differences from Deluge? --------------------------------------------------------------------- - no dissemination - no base station or serial port for injection The application is very simple: flash is formatted into several volumes (a golden image and three application volumes), which are used to store application images. Flash management, boot loading, and image formatting are all provided by Deluge. How to use it? --------------------------------------------------------------------- Build your application with support by include a line in your application Makefile, and include the IPDispatchC component. == application makefile == BOOTLOADER=tosboot == == Also, it is necessary to include a volumes xml file for your flash chip; examples for the stm25p and at45db are present in apps/UDPEcho. First built the tosboot bootloader for your platform by going to tinyos-2.x/tos/lib/tosboot and typing `make `. Then just build and install your application like usual. If networking is working, you should have no problem following the rest of the instructions. Interactions with the motes happen using the 'nwprog' tool in a shell. Connect the shell with `nc6 -u 2001:470:1f04:56d::65 2000`. It has three commands: `nwprog list`: examine the flash and print out information on volumes containing images believed to be valid `nwprog reboot`: reboot into the same image `nwprog boot N`: reboot, and flash the mote with the binary stored in volume N In order to upload new images, use the tos-nwprog tool, located in $LOWPAN_ROOT/tools/tinyos/misc. This tool provides minimal functionality; only erasing and uploading are supported. `./tos-nwprog 2001:470:1f04:56d::65 -e 0`: erase image 0 from the mote at the given IP address. `./tos-nwprog 2001:470:1f04:56d::65 -u 0 tos_image.xml`: upload the image in tos_image.xml to volume 0 on the mote at the IP address. This will erase the volume before uploading it. To integrate with your own application, there are several internal interfaces which can be used to examine the flash. Looking at the example code in UDPShellP component is the best way of finding out about these. tinyos-2.1.2+dfsg/tos/lib/net/blip/doc/README-SHELL000066400000000000000000000037071207233610700213510ustar00rootroot00000000000000 @title UDPShell Documentation @author Stephen Dawson-Haggerty @release public ---------------------------------------------------------------------- UDPShell is a simple text-based command processor which comes with the ip-stack. It is an optional, although convenient way of implementating debugging commands on a mote. Usage ---------------------------------------------------------------------- By default, the shell contains only a few simple commands: help, echo, uptime, ping, and ident. It is designed to be very easy to extend by adding your own commands. To include just the basic shell, include the UDPShellC component in your application. To augment the shell with a new shell command, use the generic component ShellCommandC. Example ---------------------------------------------------------------------- Suppose we want to implement `expr`, a simple arithmetic evaluator. First, bind the 'expr' command string in your application configuration. configuration App {} implementation { components AppImplP; components new ShellCommandC("expr") as Expr; AppImplP.Expr -> Expr; } Within AppImplP, you must implement the ShellCommand interface. The interface has only one event, 'eval' which has the same prototype as main() in a typical c program. event char *Expr.eval(int argc, char **argv) { static char ret[10]; return ret; } If expr returns a non-null value, it is assumed to be a null-terminated string which will be echoed back to a connected client. The buffer returned must obviously not be allocated on the stack. The shell does maintain a single buffer which components can use to print their reply to; it can be requested with a call to Expr.getBuffer(uint16_t len). More running code ---------------------------------------------------------------------- Fully fleshed out examples of code using this interface are available within the stack; see tos/lib/net/b6lowpan/shell/FlashShell[CP].nc and tos/lib/net/b6lowpan/nwprog/NWProg[CP].nctinyos-2.1.2+dfsg/tos/lib/net/blip/doc/README-SIM000066400000000000000000000037321207233610700211300ustar00rootroot00000000000000 @title blip + TOSSIM documentation @author Stephen Dawson-Haggerty stevedh@eecs.berkeley.edu @release internal --------------------------------------------------------------------- The state of blip + TOSSIM --------------------------------------------------------------------- TOSSIM and blip have worked reliably together in the not-so-distant past. However, blip makes several assumptions about the radio stack which are not (yet) reflected in TOSSIM-cvs. It expects a PacketLink and Unique layer a la the cc2420 stack in order to provide reliable transmissions with link duplicate suppression. Performance without these is very poor. There are also several other minor changes which deal with the deliver of serial packets. Ported versions of those components exist and are present in the blip distribution. However, they require patching an existing tinyos stack, so it is probably a good idea to do a sideways checkout of tinyos for experimenting on. Instructions for using TOSSIM with UDPEcho --------------------------------------------------------------------- This is completely unsupported right now. If you really want TOSSIM + blip, it ought to work, but there are definitly NO GUARANTEES and NO SUPPORT. It's just too much of a hack at the moment. - patch your tossim installation. The patch is in $LOWPAN_ROOT/tos/lib/tossim.patch, so apply that using * `cd $TOSDIR/tos/lib` * `patch -p0 < $LOWPAN_ROOT/tos/lib/tossim.patch` Then copy $LOWPAN_ROOT/tos/lib/tossim/Packet* to $TOSDIR/tos/lib/tossim - I think you should then be able to cd to apps/UDPEcho/sim and type `make` * make sure you have python2.5 and python2.5-dev installed - run `./Sim.py` (or `python2.5 ./Sim.py` if 2.4 is default) - build the driver in support/sdh/c/lib6lowpan/tunnel using `make sim` (probably doing make clean first) - you can then run the driver as usually, except using `./serial_tun localhost 9001` to point it at the serialforwarder running in the simulator. tinyos-2.1.2+dfsg/tos/lib/net/blip/doc/README-TCP000066400000000000000000000071151207233610700211250ustar00rootroot00000000000000 @title TCP Socket Documentation @author Stephen Dawson-Haggerty @release internal @target 2.1.1 ---------------------------------------------------------------------- TCP is the standard Internet protocol for reliable, in-order delivery of data across the network. Although inefficient, its ubiquity makes it impossible to ignore; thus, blip provides a very simple TCP stack. TCP is considerably more complicated then UDP, and requires careful use in the embedded setting to prevent resource exhaustion. It is essential that one understand the BSD sockets API; this brief README does not cover many details. For memory-constrained operation, blip's TCP does not do any receive-side buffering. Instead, it will immediately dispatch new, in-order data to the application and otherwise drop the segment. Blip does provide send-buffering so that it can automatically retransmit missing segments; this buffer may be of any size and is provided by the application. Important parameters: MSS: Maximum Segment Size: the maximum amount of data that a TCP packet will contain. Since blip immediately delivers new data, this is also greater then or equal to the maximum amount of data which will ever be delivered in a recv() call. Window: TCP keeps the other side informed about how much buffer is available for new data. Since blip does not have a receive buffer, this parameter is not adjusted by blip; only set to a reasonable value. Applications using TCP may wish to dynamically control this value for various reasons. Notes ---------------------------------------------------------------------- The TCP interface is located in $LOWPAN_ROOT/tos/lib/net/blip/interfaces/Tcp.nc. For the most part, it should be familier. Since the application is responsible for buffering, both accept() and connect() require the implementer to include a buffer for the stack's use. Once passed to the stack, the buffer is reserved until a closed() event is signaled on that socket. A few of the most important caveats/brokeness: - there is no listen(). calling bind() on a socket also begins to listen. - there is no way to accept() multiple sockets like you can in Unix. More precisely, all the code would support it but then there is dynamic allocation since you have to allocate a new socket struct on the fly. - (sort of) as a result of these, if the socket is closed, you have to call bind() if you want to continue listening. - you'll need to carefully manage buffer and window sized by hand if you want to be sure of correct operation. Make sure you check return codes from send() since it will fail if there is not enough local buffer for the entire request. Example ---------------------------------------------------------------------- configuration { components new TcpSocketC() as TcpEcho; TCPEchoP.TcpEcho -> TcpEcho; } module {} implementation { // allocate a send buffer char tcp_buf[150]; // accept connections from anyone. no need to save the endpoint, // but this is the only time its available (add an API call?) event bool TcpEcho.accept(struct sockaddr_in6 *from, void **tx_buf, int *tx_buf_len) { *tx_buf = tcp_buf; *tx_buf_len = 150; // indicates we are accepting the connection return TRUE; } // potentially useful? event void TcpEcho.connectDone(error_t e) {} // just echo the data back. event void TcpEcho.recv(void *payload, uint16_t len) { call TcpEcho.send(payload,len); } // rebind to accept other connections. event void TcpEcho.closed(error_t e) { call Leds.led0Toggle(); call TcpEcho.bind(7); } }tinyos-2.1.2+dfsg/tos/lib/net/blip/doc/README-UDP000066400000000000000000000043101207233610700211210ustar00rootroot00000000000000 @title UDP Socket Documentation @author Stephen Dawson-Haggerty @release public ---------------------------------------------------------------------- ip-stack provides a UDP sockets layer as a basic application transport service. The UDP interface is located in tos/lib/net/b6lowpan/interfaces/UDP.nc and is simple: interface UDP { /* * bind a local address. to cut down memory requirements and handle the * common case well, you can only bind a port; all local interfaces are * implicitly bound. the port should be passed in host byte-order (is * this confusing? */ command error_t bind(uint16_t port); /* * send a payload to the socket address indicated * once the call returns, the stack has no claim on the buffer pointed to */ command error_t sendto(struct sockaddr_in6 *dest, void *payload, uint16_t len); /* * indicate that the stack has finished writing data into the * receive buffer. if error is not SUCCESS, the payload does not * contain valid data and the src pointer should not be used. */ event void recvfrom(struct sockaddr_in6 *src, void *payload, uint16_t len, struct ip_metadata *meta); } Usage ---------------------------------------------------------------------- Each socket must be allocated using the generic component UdpSocketC. For clients, no initialization is necessary; they may send to a destination without calling bind. The stack will allocate a unique ephemeral port number and send out the datagram. Servers wishing to provide a service using a well-known port should call bind() on that port number before generating datagrams. Example ---------------------------------------------------------------------- The simplest server is an echo service running on port 7. Because of the buffer semantics, it is safe to call send directly from a receive event handler. event void Boot.booted() { call Echo.bind(7); } event void Echo.recvfrom(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip_metadata *meta) { call Echo.sendto(from, data, len); } The wiring is as follows. components new UdpSocketC(); UDPEchoP.Echo -> UdpSocketC; tinyos-2.1.2+dfsg/tos/lib/net/blip/icmp/000077500000000000000000000000001207233610700200005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/blip/icmp/ICMPCodeDispatchC.nc000066400000000000000000000035331207233610700234340ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ generic configuration ICMPCodeDispatchC(uint8_t type) { provides interface IP[uint8_t code]; } implementation { components ICMPCoreP; components new ICMPCodeDispatchP(); IP = ICMPCodeDispatchP; ICMPCodeDispatchP.RA -> ICMPCoreP.ICMP_IP[type]; } tinyos-2.1.2+dfsg/tos/lib/net/blip/icmp/ICMPCodeDispatchP.nc000066400000000000000000000044101207233610700234440ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ generic module ICMPCodeDispatchP() { provides interface IP[uint8_t code]; uses interface IP as RA; } implementation { event void RA.recv(struct ip6_hdr *iph, void *packet, size_t len, struct ip6_metadata *meta) { struct icmp6_hdr *icmph = packet; /* the ICMP component has already stripped off any extension headers. */ signal IP.recv[icmph->code](iph, packet, len, meta); } command error_t IP.send[uint8_t code](struct ip6_packet *msg) { return call RA.send(msg); } default event void IP.recv[uint8_t code](struct ip6_hdr *iph, void *packet, size_t len, struct ip6_metadata *meta) {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/icmp/ICMPCoreP.nc000066400000000000000000000101151207233610700220010ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * * This module implements core ICMP functionality, like replying to * echo requests and sending time exceeded messages. Other modules * which want to implement other functionality can wire to the IP * interface. * */ #include #include #include "icmp6.h" #include "blip_printf.h" module ICMPCoreP { provides { interface IP as ICMP_IP[uint8_t type]; } uses { interface IP; interface IPAddress; interface Leds; } } implementation { event void IP.recv(struct ip6_hdr *iph, void *packet, size_t len, struct ip6_metadata *meta) { struct ip6_hdr *hdr = iph; struct ip6_packet reply; struct ip_iovec v; struct icmp6_hdr *req = (struct icmp6_hdr *)packet; uint16_t my_cksum, rx_cksum = ntohs(req->cksum); // SDH : we can compute the checksum for all ICMP messages here // this, for instance, protects RPL and ND since they sits on top // of ICMP. req->cksum = 0; v.iov_base = packet; v.iov_len = len; v.iov_next = NULL; my_cksum = msg_cksum(iph, &v, IANA_ICMP); printf("ICMP: type: %i rx_cksum: 0x%x my_cksum: 0x%x\n", req->type, rx_cksum, my_cksum); if (my_cksum != rx_cksum) { printf("ICMP: invalid checksum\n"); return; } switch (req->type) { case ICMP_TYPE_ECHO_REQUEST: req->type = ICMP_TYPE_ECHO_REPLY; memset(&reply, 0, sizeof(reply)); memcpy(reply.ip6_hdr.ip6_dst.s6_addr, hdr->ip6_src.s6_addr, 16); call IPAddress.setSource(&reply.ip6_hdr); reply.ip6_hdr.ip6_vfc = IPV6_VERSION; reply.ip6_hdr.ip6_nxt = IANA_ICMP; reply.ip6_data = &v; reply.ip6_hdr.ip6_plen = htons(len); call ICMP_IP.send[ICMP_TYPE_ECHO_REPLY](&reply); break; default: signal ICMP_IP.recv[req->type](iph, packet, len, meta); } } command error_t ICMP_IP.send[uint8_t type](struct ip6_packet *pkt) { struct icmp6_hdr *req = (struct icmp6_hdr *)pkt->ip6_data->iov_base; if (pkt->ip6_data->iov_len >= sizeof(struct icmp6_hdr) && pkt->ip6_hdr.ip6_nxt == IANA_ICMP) { req->cksum = 0; req->cksum = htons(msg_cksum(&pkt->ip6_hdr, pkt->ip6_data, IANA_ICMP)); } return call IP.send(pkt); } event void IPAddress.changed(bool valid) {} default event void ICMP_IP.recv[uint8_t type](struct ip6_hdr *iph, void *payload, size_t len, struct ip6_metadata *meta) {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/icmp/ICMPPingC.nc000066400000000000000000000041571207233610700220020ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Provide an interface for pinging other motes. * * Replying to ICMP echos is built into all motes running blip; * sending requests requires a component like this one. * */ configuration ICMPPingC { provides interface ICMPPing[uint8_t client]; } implementation { components ICMPPingP, ICMPCoreP; components new TimerMilliC(); components IPAddressC; ICMPPing = ICMPPingP; ICMPPingP.IP_ECHO -> ICMPCoreP.ICMP_IP[ICMP_TYPE_ECHO_REPLY]; ICMPPingP.PingTimer -> TimerMilliC; ICMPPingP.IPAddress -> IPAddressC; } tinyos-2.1.2+dfsg/tos/lib/net/blip/icmp/ICMPPingP.nc000066400000000000000000000113021207233610700220050ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ module ICMPPingP { provides interface ICMPPing[uint8_t client]; uses { interface Timer as PingTimer; interface IP as IP_ECHO; interface IPAddress; } } implementation { uint16_t ping_seq, ping_n, ping_rcv, ping_ident; struct in6_addr ping_dest; void sendPing(struct in6_addr *dest, uint16_t seqno) { struct ip6_packet *ipmsg = (struct ip6_packet *)ip_malloc(sizeof(struct ip6_packet) + sizeof(icmp_echo_hdr_t) + sizeof(nx_uint32_t)); icmp_echo_hdr_t *e_hdr = (icmp_echo_hdr_t *)(ipmsg + 1); nx_uint32_t *sendTime = (nx_uint32_t *)(e_hdr + 1); struct ip_iovec v; if (ipmsg == NULL) return; // iovec v.iov_base = (void *)(ipmsg + 1); v.iov_len = sizeof(icmp_echo_hdr_t) + sizeof(nx_uint32_t); v.iov_next = NULL; ipmsg->ip6_data = &v; // icmp hdr e_hdr->type = ICMP_TYPE_ECHO_REQUEST; e_hdr->code = 0; e_hdr->cksum = 0; e_hdr->ident = ping_ident; e_hdr->seqno = seqno; *sendTime = call PingTimer.getNow(); // ip hdr memclr(&ipmsg->ip6_hdr, sizeof(struct ip6_hdr)); ipmsg->ip6_hdr.ip6_vfc = IPV6_VERSION; ipmsg->ip6_hdr.ip6_nxt = IANA_ICMP; ipmsg->ip6_hdr.ip6_plen = htons(v.iov_len); memcpy(&ipmsg->ip6_hdr.ip6_dst, dest->s6_addr, 16); call IPAddress.setSource(&ipmsg->ip6_hdr); e_hdr->cksum = msg_cksum(&ipmsg->ip6_hdr, ipmsg->ip6_data, IANA_ICMP); call IP_ECHO.send(ipmsg); ip_free(ipmsg); } command error_t ICMPPing.ping[uint8_t client](struct in6_addr *target, uint16_t period, uint16_t n) { if (call PingTimer.isRunning()) return ERETRY; call PingTimer.startPeriodic(period); memcpy(&ping_dest, target, 16); ping_n = n; ping_seq = 0; ping_rcv = 0; ping_ident = client; return SUCCESS; } event void PingTimer.fired() { // send a ping request if (ping_seq == ping_n) { signal ICMPPing.pingDone[ping_ident](ping_rcv, ping_n); call PingTimer.stop(); return; } sendPing(&ping_dest, ping_seq); ping_seq++; } // ping replies come here. event void IP_ECHO.recv(struct ip6_hdr *iph, void *packet, size_t len, struct ip6_metadata *meta) { icmp_echo_hdr_t *req = (icmp_echo_hdr_t *)packet; nx_uint32_t *sendTime = (nx_uint32_t *)(req + 1); struct icmp_stats p_stat; p_stat.seq = req->seqno; p_stat.ttl = iph->ip6_hlim; p_stat.rtt = (call PingTimer.getNow()) - (*sendTime); signal ICMPPing.pingReply[req->ident](&iph->ip6_src, &p_stat); ping_rcv++; // BLIP_STATS_INCR(stats.echo_rx); } default event void ICMPPing.pingReply[uint8_t client](struct in6_addr *source, struct icmp_stats *ping_stats) { } default event void ICMPPing.pingDone[uint8_t client](uint16_t n, uint16_t m) { } event void IPAddress.changed(bool global_valid) {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/icmp/icmp6.h000066400000000000000000000055231207233610700211740ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #ifndef _ICMP_H_ #define _ICMP_H_ enum { ICMP_EXT_TYPE_PREFIX = 3, ICMP_EXT_TYPE_BEACON = 17, }; #ifndef LOW_POWER_LISTENING /* parameters for CSMA MAC */ enum { // jitter start requests by 10 seconds TRICKLE_JITTER = 10240, // have a trickle timer with a period of 4 TRICKLE_PERIOD = 4096, // send a maximum of three trickle messages TRICKLE_MAX = (TRICKLE_PERIOD << 5), }; #else /* parameters for LPL */ enum { // have a trickle timer with a period of 4 TRICKLE_PERIOD = 16384L, // jitter start requests by 10 seconds TRICKLE_JITTER = TRICKLE_PERIOD, // send a maximum of three trickle messages TRICKLE_MAX = (TRICKLE_PERIOD << 5), }; #endif typedef nx_struct icmp6_echo_hdr { nx_uint8_t type; /* type field */ nx_uint8_t code; /* code field */ nx_uint16_t cksum; /* checksum field */ nx_uint16_t ident; nx_uint16_t seqno; } icmp_echo_hdr_t; typedef nx_struct radv { nx_uint8_t type; nx_uint8_t code; nx_uint16_t cksum; nx_uint8_t hlim; nx_uint8_t flags; nx_uint16_t lifetime; nx_uint32_t reachable_time; nx_uint32_t retrans_time; nx_uint8_t options[0]; } radv_t; typedef nx_struct rsol { nx_uint8_t type; nx_uint8_t code; nx_uint16_t cksum; nx_uint32_t reserved; } rsol_t; typedef nx_struct rpfx { nx_uint8_t type; nx_uint8_t length; nx_uint8_t pfx_len; nx_uint8_t flags; nx_uint32_t valid_lifetime; nx_uint32_t preferred_lifetime; nx_uint32_t reserved; nx_uint8_t prefix[16]; } pfx_t; typedef nx_struct { nx_uint8_t type; nx_uint8_t length; nx_uint16_t metric; nx_uint16_t seqno; nx_uint8_t pad[2]; } rqual_t; struct icmp_stats { uint16_t seq; uint8_t ttl; uint32_t rtt; }; #endif tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/000077500000000000000000000000001207233610700211735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/BlipStatistics.nc000066400000000000000000000024701207233610700244610ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ interface BlipStatistics { /* * Fills the given structure with the requested statistics. */ command void get(stat_str *stats); /* * Reset whatever statistics are being collected. */ command void clear(); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/ForwardingEvents.nc000066400000000000000000000024361207233610700250110ustar00rootroot00000000000000 #include #include #include interface ForwardingEvents { /** * Signaled when initiating a new flow (not forwarding). * * This allows higher-layer components to modify the payload or * insert new headers before the packet is sent. */ event bool initiate(struct ip6_packet *pkt, struct in6_addr *next_hop); /** * Signaled for each packet being forwarded. * * For datapath validation. Allows the routing protocol to look at * a packet as it flows through. If the event returns FALSE the * packet is dropped. The routing protocol may change fields in the * packet header such as the flow label. * * @pkt the packet being forwarded * @next_hop the ipv6 address of the next hop, as determined by the * forwarding engine. */ event bool approve(struct ip6_packet *pkt, struct in6_addr *next_hop); /** * Signaled once per packet. The send_info structure allows upper * layers to see how many fragments were attempted, and how many * transmissions were required. * * Allows a higher-level component to maintain * statistics on the link behavior of their routes. */ event void linkResult(struct in6_addr *dest, struct send_info *info); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/ForwardingTable.nc000066400000000000000000000012011207233610700245610ustar00rootroot00000000000000 #include interface ForwardingTable { /** * Insert a forwarding-table mapping for the given prefix, with the * given next-hop. */ command route_key_t addRoute(const uint8_t *prefix, int prefix_len_bits, struct in6_addr *next_hop, uint8_t ifindex); /** * Remove a routing table entry previously inserted using addRoute */ command error_t delRoute(route_key_t key); command struct route_entry *lookupRoute(const uint8_t *prefix, int prefix_len_bits); command struct route_entry *lookupRouteKey(route_key_t key); command struct route_entry *getTable(int *size); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/ForwardingTableEvents.nc000066400000000000000000000041531207233610700257570ustar00rootroot00000000000000/* * Copyright (c) 2008-2011 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ interface ForwardingTableEvents { /** * Signaled when a default route is added to the table; that is, * when the stack transitions from not having a default route to * having one. * * This event is not signaled again if the default route changes. */ event void defaultRouteAdded(); /** * Signaled when the default route is removed from the routing * table. If the route is removed, defaultRouteAdded() be signeled * when the route is re-added. */ event void defaultRouteRemoved(); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/ICMP.nc000066400000000000000000000024031207233610700222440ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ interface ICMP { command uint16_t cksum(struct split_ip_msg *msg, uint8_t nxt_hdr); command void sendTimeExceeded(struct ip6_hdr *hdr, unpack_info_t *u_info, uint16_t amount_here); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/ICMPPing.nc000066400000000000000000000004041207233610700230610ustar00rootroot00000000000000 #include interface ICMPPing { command error_t ping(struct in6_addr *target, uint16_t period, uint16_t n); event void pingReply(struct in6_addr *source, struct icmp_stats *stats); event void pingDone(uint16_t ping_rcv, uint16_t ping_n); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/IP.nc000066400000000000000000000013511207233610700220250ustar00rootroot00000000000000 #include interface IP { /* * sends the message with the headers and payload given. Things * which we know how to compress should be part of the data passed * in as headers; things which we cannot compress must be passed as * payload. * the interface is this way so that the stack may insert extra * (routing, snooping) headers between the two sections. * once the call returns, the stack has no claim on the buffer * pointed to */ command error_t send(struct ip6_packet *msg); /* * indicate that the stack has finished writing data into the * receive buffer. */ event void recv(struct ip6_hdr *hdr, void *packet, size_t len, struct ip6_metadata *meta); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/IPAddress.nc000066400000000000000000000036111207233610700233340ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #include interface IPAddress { /** * Get the preferred link-local interface for this node */ command bool getLLAddr(struct in6_addr *addr); /** * Get the preferred global IPv6 address for this node */ command bool getGlobalAddr(struct in6_addr *addr); /** * Choose a source address for a packet originating at this node. */ command bool setSource(struct ip6_hdr *hdr); /** * @return TRUE if the address is assigned to a local interface */ command bool isLocalAddress(struct in6_addr *addr); /** * @return TRUE of the address is a link local address not requiring * routing. */ command bool isLLAddress(struct in6_addr *addr); command error_t setAddress(struct in6_addr *addr); command error_t removeAddress(); event void changed(bool valid); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/IPExtensions.nc000066400000000000000000000010511207233610700241020ustar00rootroot00000000000000 interface IPExtensions { command struct tlv_hdr *findTlv(struct ip6_ext *ext, uint8_t tlv); event void handleExtensions(uint8_t label, struct ip6_hdr *iph, struct ip6_ext *hop, struct ip6_ext *dst, struct ip6_route *route, uint8_t nxt_hdr); /* * will be called once for each fragment when sending or forwarding */ event void reportTransmission(uint8_t label, send_policy_t *send); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/IPForward.nc000066400000000000000000000015621207233610700233560ustar00rootroot00000000000000 #include #include "IPDispatch.h" interface IPForward { /* * sends the message with the headers and payload given. Things * which we know how to compress should be part of the data passed * in as headers; things which we cannot compress must be passed as * payload. * the interface is this way so that the stack may insert extra * (routing, snooping) headers between the two sections. * once the call returns, the stack has no claim on the buffer * pointed to */ command error_t send(struct in6_addr *next_hop, struct ip6_packet *msg, void *data); event void sendDone(struct send_info *status); /* * indicate that the stack has finished writing data into the * receive buffer. */ event void recv(struct ip6_hdr *iph, void *payload, struct ip6_metadata *meta); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/IPLower.nc000066400000000000000000000015721207233610700230430ustar00rootroot00000000000000 #include #include "IPDispatch.h" interface IPLower { /* * sends the message with the headers and payload given. Things * which we know how to compress should be part of the data passed * in as headers; things which we cannot compress must be passed as * payload. * the interface is this way so that the stack may insert extra * (routing, snooping) headers between the two sections. * once the call returns, the stack has no claim on the buffer * pointed to */ command error_t send(struct ieee154_frame_addr *next_hop, struct ip6_packet *msg, void *data); event void sendDone(struct send_info *status); /* * indicate that the stack has finished writing data into the * receive buffer. */ event void recv(struct ip6_hdr *iph, void *payload, struct ip6_metadata *meta); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/IPMiddle.nc000066400000000000000000000015611207233610700231470ustar00rootroot00000000000000 #include #include "IPDispatch.h" interface IPForward { /* * sends the message with the headers and payload given. Things * which we know how to compress should be part of the data passed * in as headers; things which we cannot compress must be passed as * payload. * the interface is this way so that the stack may insert extra * (routing, snooping) headers between the two sections. * once the call returns, the stack has no claim on the buffer * pointed to */ command error_t send(struct ieee154_frame_addr *next_hop, struct ip6_packet *msg, void *data); event void sendDone(struct send_info *status); /* * indicate that the stack has finished writing data into the * receive buffer. */ event void recv(struct ip6_hdr *iph, void *payload, struct ip6_metadata *meta); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/IPPacket.nc000066400000000000000000000014411207233610700231550ustar00rootroot00000000000000 interface IPPacket { /* * @type the next header value to look for. valid choices are in * ip.h and can be any valid IANA next-header value. The special * value IP6PKT_TRANSPORT will return the offset of the transport * header (ie, the first header which is not an IPv6 extension * header). * @return the offset of the * start of a given header within the packet, or -1 if it was not * found. */ command int findHeader(struct ip_iovec *payload, uint8_t first_type, uint8_t *search_type); command int findTLV(struct ip_iovec *header, int ext_offset, uint8_t type); command void delTLV(struct ip_iovec *data, int ext_offset, uint8_t type); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/Ieee154Address.nc000066400000000000000000000003741207233610700241300ustar00rootroot00000000000000 #include interface Ieee154Address { command ieee154_panid_t getPanId(); command ieee154_saddr_t getShortAddr(); command ieee154_laddr_t getExtAddr(); command error_t setShortAddr(ieee154_saddr_t addr); event void changed(); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/InternalIPExtension.nc000066400000000000000000000002231207233610700254140ustar00rootroot00000000000000 interface InternalIPExtension { command void addHeaders(struct split_ip_msg *msg, uint8_t nxt_hdr, uint16_t label); command void free(); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/NeighborDiscovery.nc000066400000000000000000000007741207233610700251520ustar00rootroot00000000000000 #include interface NeighborDiscovery { /** * Map the IPv6 address to a link-layer address. * @return FAIL if the address cannot be resolved, either becasue * it is not known or because the given IPv6 address is not on the link. */ command error_t resolveAddress(struct in6_addr *addr, ieee154_addr_t *link_addr); /** * Match */ command int matchContext(struct in6_addr *addr, uint8_t *ctx); command int getContext(uint8_t context, struct in6_addr *ctx); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/ReadLqi.nc000066400000000000000000000004271207233610700230410ustar00rootroot00000000000000/* Platform-independent wrappers for commonly-provided link metrics. */ interface ReadLqi { /* Read the Link Quality Indicator */ command uint8_t readLqi(message_t *msg); /* Read the Received Signal Strength Indicator */ command uint8_t readRssi(message_t *msg); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/TLVHeader.nc000066400000000000000000000002611207233610700232720ustar00rootroot00000000000000 #include interface TLVHeader { event struct tlv_hdr *getHeader(int label,int nxt_hdr, struct ip6_hdr *msg); event void free(); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/Tcp.nc000066400000000000000000000023241207233610700222440ustar00rootroot00000000000000 interface Tcp { /* * Bind the socket to a local address * */ command error_t bind(uint16_t port); /* * Accept an incomming connection. * * the app should return FALSE to reject the connection attempt */ event bool accept(struct sockaddr_in6 *from, void **tx_buf, int *tx_buf_len); /* * Split-phase connect: connect to a remote endpoint. * * The socket should not be used until connectDone is signaled. */ command error_t connect(struct sockaddr_in6 *dest, void *tx_buf, int tx_buf_len); event void connectDone(error_t e); /* * Send and receive data on a socket. The socket must be CONNECTed * for these to succeed. */ command error_t send(void *payload, uint16_t len); event void recv(void *payload, uint16_t len); /* * terminate a connection. */ command error_t close(); command error_t abort(); /* * notify the app that the socket connection has been closed or * reset by the other end, or else a timeout has occured and the * local side has given up. */ event void closed(error_t e); /* * returns TRUE if all previously sent data has been ACKed */ event void acked(); } tinyos-2.1.2+dfsg/tos/lib/net/blip/interfaces/UDP.nc000066400000000000000000000020211207233610700221400ustar00rootroot00000000000000 #include interface UDP { /* * bind a local address. to cut down memory requirements and handle the * common case well, you can only bind a port; all local interfaces are * implicitly bound. the port should be passed in host byte-order (is * this confusing? */ command error_t bind(uint16_t port); /* * send a payload to the socket address indicated * once the call returns, the stack has no claim on the buffer pointed to */ command error_t sendto(struct sockaddr_in6 *dest, void *payload, uint16_t len); command error_t sendtov(struct sockaddr_in6 *dest, struct ip_iovec *iov); /* * indicate that the stack has finished writing data into the * receive buffer. if error is not SUCCESS, the payload does not * contain valid data and the src pointer should not be used. */ event void recvfrom(struct sockaddr_in6 *src, void *payload, uint16_t len, struct ip6_metadata *meta); } tinyos-2.1.2+dfsg/tos/lib/net/blip/ipmulticast.h000066400000000000000000000002571207233610700215630ustar00rootroot00000000000000#ifndef IPMULTICAST_H_ #define IPMULTICAST_H_ #include enum { MCAST_FW_MAXLEN = 50, }; struct mcast_hdr { struct tlv_hdr tlv; uint16_t mcast_seqno; }; #endif tinyos-2.1.2+dfsg/tos/lib/net/blip/iprouting.h000066400000000000000000000014101207233610700212350ustar00rootroot00000000000000#ifndef _IPROUTING_H_ #define _IPROUTING_H_ #include enum { ROUTE_INVAL_KEY = -1, }; #ifndef ROUTE_TABLE_SZ #define ROUTE_TABLE_SZ 20 #endif enum { ROUTE_IFACE_ALL = 0, ROUTE_IFACE_154 = 1, ROUTE_IFACE_PPP = 2, }; enum { ROUTE_DROP_NOROUTE, ROUTE_DROP_HLIM, }; typedef int route_key_t; struct route_entry { int valid:1; /* table entry is valid */ route_key_t key; /* a key used to identify this entry */ struct in6_addr prefix; /* destination */ uint8_t prefixlen; /* how many bits of the destination to match on */ struct in6_addr next_hop; /* next hop (must be an on-link address) */ uint8_t ifindex; /* interface index to send the packet out on */ }; #endif tinyos-2.1.2+dfsg/tos/lib/net/blip/nwprog/000077500000000000000000000000001207233610700203645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/blip/nwprog/At45dbStorageMapP.nc000066400000000000000000000034141207233610700240360ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written * agreement is hereby granted, provided that the above copyright * notice, the (updated) modification history and the author appear in * all copies of this source code. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, * OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ module At45dbStorageMapP { provides { interface StorageMap[uint8_t volume_id]; } uses { interface At45dbVolume[volume_id_t volume_id]; } } implementation { command storage_addr_t StorageMap.getPhysicalAddress[uint8_t volume_id](storage_addr_t addr) { storage_addr_t p_addr = 0xFFFFFFFF; at45page_t page = call At45dbVolume.remap[volume_id]((addr >> AT45_PAGE_SIZE_LOG2)); at45pageoffset_t offset = addr & ((1 << AT45_PAGE_SIZE_LOG2) - 1); p_addr = page; p_addr = p_addr << AT45_PAGE_SIZE_LOG2; p_addr += offset; return p_addr; } } tinyos-2.1.2+dfsg/tos/lib/net/blip/nwprog/BootImage.nc000066400000000000000000000002421207233610700225520ustar00rootroot00000000000000 interface BootImage { command void reboot(); command error_t boot(uint8_t img_num); // Added by Jaein Jeong command error_t erase(uint8_t img_num); } tinyos-2.1.2+dfsg/tos/lib/net/blip/nwprog/Deluge.h000066400000000000000000000072141207233610700217460ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written * agreement is hereby granted, provided that the above copyright * notice, the (updated) modification history and the author appear in * all copies of this source code. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, * OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #ifndef __DELUGE_H__ #define __DELUGE_H__ typedef nx_struct DelugeIdent { nx_uint32_t uidhash; // unique id of the image nx_uint32_t size; // size of the whole image (ident + CRCs + binary) nx_uint8_t numPgs; // number of pages of complete image nx_uint8_t reserved; nx_uint16_t crc; // crc over the above 4 fields nx_uint8_t appname[16]; nx_uint8_t username[16]; nx_uint8_t hostname[16]; nx_uint8_t platform[16]; nx_uint32_t timestamp; nx_uint32_t userhash; } DelugeIdent; typedef nx_struct DelugePatchCmd { nx_uint16_t linenum; // sequence number of patches, starting from 0 nx_uint8_t cmd; // patch cmd: 16 for upload, 17 for copy nx_uint16_t dst_offset; nx_uint16_t data_length; // byte length of the data nx_uint16_t src_offset; nx_uint8_t reserved[7]; nx_uint8_t data[0]; // data for the upload command } DelugePatchCmd; enum { DELUGE_INVALID_UID = 0xffffffff, DELUGE_NUM_VOLUMES = 2, DELUGE_IDENT_SIZE = 128, DELUGE_MAX_PAGES = 128, DELUGE_CRC_SIZE = sizeof(uint16_t), DELUGE_CRC_BLOCK_SIZE = DELUGE_MAX_PAGES * DELUGE_CRC_SIZE, DELUGE_BYTES_PER_PAGE = 23 * 48, }; enum { MAX_PATCH_DATA_SIZE = 512, PATCH_LINE_SIZE = 16, }; #define UQ_DELUGE_METADATA "DelugeMetadata.client" #define UQ_DELUGE_VOLUME_MANAGER "DelugeVolumeManager.client" #define UQ_DELUGE_VERIFY "DelugeVerify.client" #define UQ_DELUGE_PATCH "DelugePatch.client" #define UQ_DELUGE_READ_IDENT "DelugeReadIdent.client" typedef struct BootArgs { uint16_t address; uint32_t imageAddr; uint8_t gestureCount; bool noReprogram; } BootArgs; enum { NWPROG_CMD_ERASE = 1, NWPROG_CMD_WRITE = 2, NWPROG_CMD_READ = 3, NWPROG_CMD_LIST = 4, NWPROG_CMD_BOOT = 5, NWPROG_CMD_REBOOT= 6, NWPROG_CMD_READDONE = 7, NWPROG_CMD_IMAGEIFO = 8, }; enum { NWPROG_ERROR_OK = 0, }; enum{ PATCH_CMD_UPLOAD = 16, PATCH_CMD_COPY = 17, }; nx_struct ShortDelugeIdent { nx_uint8_t appname[16]; nx_uint8_t username[16]; nx_uint8_t hostname[16]; nx_uint32_t timestamp; }; typedef nx_struct prog_req { nx_uint8_t cmd; nx_uint8_t imgno; nx_union { nx_uint16_t offset; nx_uint16_t when; nx_uint16_t nimages; } cmd_data; nx_uint8_t data[0]; } prog_req_t; typedef nx_struct prog_reply { nx_uint8_t error; nx_uint8_t pad; nx_struct prog_req req; } prog_reply_t; #endif tinyos-2.1.2+dfsg/tos/lib/net/blip/nwprog/DelugeReadIdentP.nc000066400000000000000000000104631207233610700240170ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written * agreement is hereby granted, provided that the above copyright * notice, the (updated) modification history and the author appear in * all copies of this source code. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, * OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Razvan Musaloiu-E. * @author Chieh-Jan Mike Liang */ #include "imgNum2volumeId.h" module DelugeReadIdentP { provides interface DelugeMetadata; uses { interface Boot; interface BlockRead[uint8_t volumeId]; interface StorageMap[uint8_t volumeId]; event void storageReady(); } } implementation { enum { S_READY, S_READ_VOLUME, S_READ_NUM_VOLUMES, }; DelugeIdent ident; uint8_t state; uint8_t currentIdx; uint8_t currentVolume; uint8_t fields; uint8_t validVolumes; event void Boot.booted() { } command error_t DelugeReadIdent.readVolume(uint8_t imgNum) { if (state != S_READY) { return FAIL; } else { currentIdx = imgNum; currentVolume = _imgNum2volumeId[currentIdx]; if (imgNum < DELUGE_NUM_VOLUMES) { state = S_READ_VOLUME; return call BlockRead.read[currentVolume](0, &ident, sizeof(ident)); } else { return FAIL; } } } command error_t DelugeReadIdent.readNumVolumes() { if (state != S_READY) { return FAIL; } else { fields = 0; validVolumes = 0; currentIdx = 0; currentVolume = _imgNum2volumeId[currentIdx]; state = S_READ_NUM_VOLUMES; return call BlockRead.read[currentVolume](0, &ident, sizeof(ident)); } } event void BlockRead.readDone[uint8_t imgNum]( storage_addr_t addr, void* buf, storage_len_t len, error_t error) { switch (state) { case S_READ_VOLUME: if (error == SUCCESS && ident.uidhash != DELUGE_INVALID_UID) { signal DelugeReadIdent.readVolumeDone(currentIdx, buf, SUCCESS); } else { signal DelugeReadIdent.readVolumeDone(currentIdx, buf, FAIL); } state = S_READY; signal storageReady(); break; case S_READ_NUM_VOLUMES: if (error == SUCCESS && ident.uidhash != DELUGE_INVALID_UID) { // Increment valid volumes only when uidhash is valid. fields |= (1 << currentIdx); validVolumes++; } // Increment the number volumes read. currentIdx++; currentVolume = _imgNum2volumeId[currentIdx]; // Read the next volume when it didn't reach the end. if (currentIdx < DELUGE_NUM_VOLUMES) { call BlockRead.read[currentVolume](0, &ident, sizeof(ident)); } // Otherwise, notify the success. else { state = S_READY; signal storageReady(); signal DelugeReadIdent.readNumVolumesDone(validVolumes, fields, SUCCESS); } break; } } event void BlockRead.computeCrcDone[uint8_t imgNum]( storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) {} default command error_t BlockRead.read[uint8_t imgNum]( storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t BlockRead.computeCrc[uint8_t imgNum]( storage_addr_t addr, storage_len_t len, uint16_t crc) { return FAIL; } default event void storageReady() {} default event void DelugeReadIdent.readNumVolumesDone( uint8_t validVols, uint8_t volumeFields, error_t error) {} default event void DelugeReadIdent.readVolumeDone( uint8_t imgNum, DelugeIdent* id, error_t error) {} } tinyos-2.1.2+dfsg/tos/lib/net/blip/nwprog/NWProgC.nc000066400000000000000000000031011207233610700221600ustar00rootroot00000000000000 // #include #include #include "Deluge.h" configuration NWProgC { provides interface BootImage; } implementation { // send and receive pages components MainC, new UdpSocketC(); components NetProgC, NWProgP; BootImage = NWProgP; components new BlockStorageC(VOLUME_GOLDENIMAGE) as BlockDeluge0; components new BlockStorageC(VOLUME_DELUGE1) as BlockDeluge1; NWProgP.Boot -> MainC; NWProgP.NetProg -> NetProgC; // NWProgP.StorageMap -> BlockStorageManagerC; NWProgP.Recv -> UdpSocketC; NWProgP.BlockWrite[VOLUME_GOLDENIMAGE] -> BlockDeluge0; NWProgP.BlockWrite[VOLUME_DELUGE1] -> BlockDeluge1; NWProgP.BlockRead[VOLUME_GOLDENIMAGE] -> BlockDeluge0; NWProgP.BlockRead[VOLUME_DELUGE1] -> BlockDeluge1; #ifdef BINARY_SHELL components BinaryShellC; NWProgP.ShellCommand -> BinaryShellC.BinaryCommand[BSHELL_NWPROG]; #else components new ShellCommandC("nwprog"); NWProgP.ShellCommand -> ShellCommandC; #endif components new TimerMilliC(); NWProgP.RebootTimer -> TimerMilliC; // deluge metadata stuff components new DelugeMetadataClientC(); NWProgP.DelugeMetadata -> DelugeMetadataClientC; #if defined(PLATFORM_TELOSB) NWProgP.StorageMap[VOLUME_GOLDENIMAGE] -> BlockDeluge0; NWProgP.StorageMap[VOLUME_DELUGE1] -> BlockDeluge1; #elif defined(PLATFORM_MICAZ) || defined(PLATFORM_IRIS) || defined(PLATFORM_EPIC) || defined(PLATFORM_MULLE) components At45dbStorageMapP, At45dbStorageManagerC; At45dbStorageMapP.At45dbVolume -> At45dbStorageManagerC; NWProgP.StorageMap -> At45dbStorageMapP; #endif } tinyos-2.1.2+dfsg/tos/lib/net/blip/nwprog/NWProgP.nc000066400000000000000000000260231207233610700222050ustar00rootroot00000000000000 #include #include #include "imgNum2volumeId.h" #include "Deluge.h" #include "blip_printf.h" module NWProgP { provides interface BootImage; uses { interface Boot; interface UDP as Recv; interface StorageMap[uint8_t imag_num]; interface NetProg; interface BlockRead[uint8_t img_num]; interface BlockWrite[uint8_t img_num]; interface DelugeMetadata; interface Timer as RebootTimer; event void storageReady(); #ifdef BINARY_SHELL interface BinaryCommand as ShellCommand; #else interface ShellCommand; #endif } } implementation { enum { S_IDLE, S_BUSY, }; uint8_t state; struct sockaddr_in6 endpoint; prog_reply_t reply; prog_reply_t *read_buffer; // SDH : if this is defined, we read back each packet after we write // it and check that it matches. It turns out that this doesn't // actually guarantee you much, due to buffering. #undef PARANOID #ifdef PARANOID bool paranoid_read; uint16_t cmp_len; uint8_t cmp_img; uint32_t cmp_off; uint8_t cmp_buf[256]; #endif // Begin-added by Jaein Jeong command error_t BootImage.erase(uint8_t img_num) { error_t error = call BlockWrite.erase[img_num](); return error; } // End-added command void BootImage.reboot() { call NetProg.reboot(); } command error_t BootImage.boot(uint8_t img_num) { return call NetProg.programImageAndReboot(call StorageMap.getPhysicalAddress[img_num](0)); } event void Boot.booted() { #ifdef PARANOID paranoid_read = FALSE; #endif state = S_IDLE; call Recv.bind(5213); } void sendDone(error_t error) { reply.error = error; call Recv.sendto(&endpoint, &reply, sizeof(prog_reply_t)); } event void Recv.recvfrom(struct sockaddr_in6 *from, void *payload, uint16_t len, struct ip6_metadata *meta) { prog_req_t *req = (prog_req_t *)payload; uint8_t imgNum = imgNum2volumeId(req->imgno); error_t error = FAIL; void *buffer; // just copy the payload out and write it into flash // we'll send the ack from the write done event. if (state != S_IDLE) return; memcpy(&endpoint, from, sizeof(struct sockaddr_in6)); memcpy(&reply.req, req, sizeof(prog_req_t)); switch (req->cmd) { case NWPROG_CMD_ERASE: error = call BlockWrite.erase[imgNum](); break; case NWPROG_CMD_WRITE: len -= sizeof(prog_req_t); #ifdef PARANOID if (len > sizeof(cmp_buf)) { error = ENOMEM; break; } memcpy(cmp_buf, req->data, len); cmp_len = len; cmp_off = req->cmd_data.offset; cmp_img = imgNum; #endif buffer = ip_malloc(len); if (buffer == NULL) { error = ENOMEM; break; } memcpy(buffer, req->data, len); error = call BlockWrite.write[imgNum](req->cmd_data.offset, buffer, len); if (error != SUCCESS) ip_free(buffer); break; case NWPROG_CMD_READ: { read_buffer = (prog_reply_t *)ip_malloc(64 + sizeof(prog_reply_t)); if (read_buffer == NULL) { error = ENOMEM; break; } memcpy(&read_buffer->req, req, sizeof(prog_req_t)); error = call BlockRead.read[imgNum](req->cmd_data.offset, read_buffer->req.data, 64); if (error != SUCCESS) { ip_free(read_buffer); } break; } default: error = FAIL; } // } if (error != SUCCESS) { sendDone(error); // if (call Resource.isOwner()) { // call Resource.release(); // } } else { state = S_BUSY; } } event void BlockWrite.writeDone[uint8_t img_num](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { if (state != S_BUSY) return; #ifdef PARANOID if (len != cmp_len) { printf("WARNING: write length changed from %i to %lu!\n", cmp_len, len); } if (addr != cmp_off) { printf("WARNING: write address changed from %li to %li!\n", cmp_off, addr); } if (img_num != cmp_img) { printf("WARNING: write volume changed from %i to %i\n", cmp_img, img_num); } if (memcmp(buf, cmp_buf, cmp_len) != 0) { printf("WARNING: write data changed during call!\n"); } memset(buf, 0, cmp_len); if (call BlockRead.read[cmp_img](cmp_off, buf, cmp_len) == SUCCESS) { paranoid_read = TRUE; return; } #else ip_free(buf); #endif if (error == SUCCESS) { call BlockWrite.sync[img_num](); } else { state = S_IDLE; // call Resource.release(); sendDone(error); } } event void BlockRead.readDone[uint8_t img_num](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { #ifdef PARANOID if (paranoid_read) { if (len != cmp_len) { printf("WARNING: read length changed from %u to %lu!\n", cmp_len, len); } if (addr != cmp_off) { printf("WARNING: read address changed from %li to %li!\n", cmp_off, addr); } if (img_num != cmp_img) { printf("WARNING: read volume changed from %i to %i\n", cmp_img, img_num); } if (memcmp(buf, cmp_buf, cmp_len) != 0) { printf("WARNING: write data changed during call!\n"); } else { printf("SUCCESS: write verified!\n"); } paranoid_read = FALSE; ip_free(buf); if (error == SUCCESS) { call BlockWrite.sync[img_num](); } else { // call Resource.release(); state = S_IDLE; sendDone(error); } return; } #endif if (state != S_BUSY || buf != read_buffer->req.data) return; read_buffer->error = error; call Recv.sendto(&endpoint, read_buffer, sizeof(prog_reply_t) + 64); ip_free(read_buffer); state = S_IDLE; } event void BlockWrite.eraseDone[uint8_t img_num](error_t error) { if (state != S_BUSY) return; if (error == SUCCESS) call BlockWrite.sync[img_num](); else { sendDone(error); state = S_IDLE; } } event void BlockWrite.syncDone[uint8_t img_num](error_t error) { if (state != S_BUSY) return; sendDone(error); state = S_IDLE; } /* * Shell command implementation */ uint8_t nwprog_currentvol, nwprog_validvols; uint8_t boot_image; uint8_t volumeID2imgNum(uint8_t volumeID) { switch(volumeID) { case VOLUME_GOLDENIMAGE: return 0; case VOLUME_DELUGE1: return 1; // case VOLUME_DELUGE2: return 2; // case VOLUME_DELUGE3: return 3; } } event void DelugeMetadata.readDone(uint8_t imgNum, DelugeIdent* ident, error_t error) { char *reply_buf = call ShellCommand.getBuffer(MAX_REPLY_LEN); if (error == SUCCESS) { if (ident->uidhash != DELUGE_INVALID_UID) { #ifdef BINARY_SHELL nx_struct cmd_payload *payload = (nx_struct cmd_payload *)reply_buf; prog_req_t *rep = (prog_req_t *)payload->data; nx_struct ShortDelugeIdent *i = (nx_struct ShortDelugeIdent *)rep->data; rep->cmd = NWPROG_CMD_IMAGEIFO; rep->imgno = volumeID2imgNum(imgNum); memcpy(i->appname, ident->appname, 16); memcpy(i->username, ident->username, 16); memcpy(i->hostname, ident->hostname, 16); i->timestamp = ident->timestamp; nwprog_validvols++; call ShellCommand.write(payload, sizeof(nx_struct cmd_payload) + sizeof(prog_reply_t) + sizeof(nx_struct ShortDelugeIdent)); #else int len; len = snprintf(reply_buf, MAX_REPLY_LEN, "image: %i\n\t[size: %li]\n\t[app: %s]\n\t[user: %s]\n\t[host: %s]\n\t[arch: %s]\n\t[time: 0x%lx]\n", volumeID2imgNum(imgNum), ident->size, (char *)ident->appname, (char *) ident->username, (char *)ident->hostname, (char *)ident->platform, (uint32_t)ident->timestamp); nwprog_validvols++; call ShellCommand.write(reply_buf, len); #endif } } if (++nwprog_currentvol < DELUGE_NUM_VOLUMES) { call DelugeMetadata.read(imgNum2volumeId(nwprog_currentvol)); } else { #ifdef BINARY_SHELL nx_struct cmd_payload *payload = (nx_struct cmd_payload *)reply_buf; prog_req_t *rep = (prog_req_t *)payload->data; rep->cmd = NWPROG_CMD_READDONE; rep->cmd_data.nimages = nwprog_validvols; call ShellCommand.write(payload, sizeof(nx_struct cmd_payload) + sizeof(prog_req_t)); #else int len; len = snprintf(reply_buf, MAX_REPLY_LEN, "%i valid image(s)\n", nwprog_validvols); call ShellCommand.write(reply_buf, len); #endif } } event void RebootTimer.fired() { call BootImage.boot(boot_image); } #ifdef BINARY_SHELL event void ShellCommand.dispatch(nx_struct cmd_payload *data, int len) { nx_struct prog_req *req = (nx_struct prog_req *)data->data; switch (req->cmd) { case NWPROG_CMD_LIST: nwprog_currentvol = 0; nwprog_validvols = 0; call DelugeMetadata.read(imgNum2volumeId(nwprog_currentvol)); return; break; case NWPROG_CMD_BOOT: call ShellCommand.write(data, len); boot_image = imgNum2volumeId(req->imgno); call RebootTimer.startOneShot(req->cmd_data.when); break; case NWPROG_CMD_REBOOT: call BootImage.reboot(); break; } } #else event char *ShellCommand.eval(int argc, char **argv) { char *nwprog_help_str = "nwprog [list | boot [when] | reboot]\n"; if (state != S_IDLE) return NULL; if (argc >= 2) { if (memcmp(argv[1], "list", 4) == 0) { nwprog_currentvol = 0; nwprog_validvols = 0; call DelugeMetadata.read(imgNum2volumeId(nwprog_currentvol)); return NULL; } else if (memcmp(argv[1], "boot", 4) == 0 && (argc == 3 || argc == 4)) { uint32_t when = 15; boot_image = atoi(argv[2]), boot_image = imgNum2volumeId(boot_image); if (argc == 4) when = atoi(argv[3]); if (when == 0) call RebootTimer.stop(); else { char *ack = call ShellCommand.getBuffer(15); snprintf(ack, 15, "REBOOT %li %i\n", when, boot_image); call RebootTimer.startOneShot(when); return ack; } return NULL; } else if (memcmp(argv[1], "reboot", 6) == 0) { call BootImage.reboot(); return NULL; } } return nwprog_help_str; } #endif default command error_t BlockWrite.write[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t BlockWrite.erase[uint8_t imgNum]() { return FAIL; } default command error_t BlockWrite.sync[uint8_t imgNum]() { return FAIL; } default command error_t BlockRead.read[uint8_t imgNum](storage_addr_t addr, void* buf, storage_len_t len) {return FAIL;} event void BlockRead.computeCrcDone[uint8_t imgNum](storage_addr_t addr, storage_len_t len,uint16_t crc, error_t error) {} default command storage_addr_t StorageMap.getPhysicalAddress[uint8_t volume_id](storage_addr_t addr) { return 0xffffffff; } } tinyos-2.1.2+dfsg/tos/lib/net/blip/platform/000077500000000000000000000000001207233610700206745ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/blip/platform/CC2420ReadLqiC.nc000066400000000000000000000007431207233610700233640ustar00rootroot00000000000000 uint16_t adjustLQI(uint8_t val) { uint16_t result = (80 - (val - 50)); result = (((result * result) >> 3) * result) >> 3; // result = (result ^ 3) / 64 return result; } module CC2420ReadLqiC { provides interface ReadLqi; uses interface CC2420Packet; } implementation { command uint8_t ReadLqi.readLqi(message_t *msg) { return call CC2420Packet.getLqi(msg); } command uint8_t ReadLqi.readRssi(message_t *msg) { return call CC2420Packet.getRssi(msg); } } tinyos-2.1.2+dfsg/tos/lib/net/blip/platform/RF230ReadLqiC.nc000066400000000000000000000010211207233610700233110ustar00rootroot00000000000000 uint16_t adjustLQI(uint8_t val) { uint16_t result = 64 - (val / 4); result = (((result * result) >> 3) * result) >> 3; // result = (result ^ 3) / 64 return result; } module RF230ReadLqiC { provides interface ReadLqi; uses interface PacketField as SubLqi; uses interface PacketField as SubRssi; } implementation { command uint8_t ReadLqi.readLqi(message_t *msg) { return call SubLqi.get(msg); } command uint8_t ReadLqi.readRssi(message_t *msg) { return call SubRssi.get(msg); } } tinyos-2.1.2+dfsg/tos/lib/net/blip/serial/000077500000000000000000000000001207233610700203275ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/blip/serial/SerialDevConfC.nc000066400000000000000000000054561207233610700234520ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ //$Id: SerialDevConfC.nc,v 1.2 2009/08/09 23:36:06 sdhsdh Exp $ /* "Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /** * Implementation of communication 802.15.4 message_t packets over the * serial port. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 * */ #include "SerialDevConf.h" configuration SerialDevConfC { provides { interface Send; interface Receive; } uses interface Leds; } implementation { components SerialPacketInfoDevConfP as Info, SerialDispatcherC; Leds = SerialDispatcherC; Send = SerialDispatcherC.Send[TOS_SERIAL_DEVCONF]; Receive = SerialDispatcherC.Receive[TOS_SERIAL_DEVCONF]; SerialDispatcherC.SerialPacketInfo[TOS_SERIAL_DEVCONF] -> Info; } tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/000077500000000000000000000000001207233610700201575ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/BinaryCommand.nc000066400000000000000000000013371207233610700232300ustar00rootroot00000000000000 #include "BinaryShell.h" interface BinaryCommand { /* * evaluate the command that this command provides * @argc the number of arguments * @argv the arguments * @return a string to send back as the reply to the shell client. * if NULL, nothing is sent. */ event void dispatch(nx_struct cmd_payload *cmd, int len); /* * request a buffer. The result of this command may be returned * from 'eval', but otherwise the buffer may not be used outside of * the context it is called from. */ command char *getBuffer(int len); /* * write a string to the shell buffer; if no client is connected it * will fail silently */ command void write(nx_struct cmd_payload *data, int len); } tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/BinaryShell.h000066400000000000000000000043321207233610700225460ustar00rootroot00000000000000/* * "Copyright (c) 2008, 2009 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #ifndef BINARYSHELL_H_ #define BINARYSHELL_H_ #define BINARY_SHELL /* Struct definitions for builtin shell commands */ /* type ids for the builtin commands */ enum { BSHELL_ERROR = 0, BSHELL_ENUMERATE = 1, BSHELL_ECHO = 2, BSHELL_PING6 = 3, BSHELL_PING6_REPLY = 4, BSHELL_PING6_DONE = 5, BSHELL_UPTIME = 6, BSHELL_IDENT = 7, BSHELL_NWPROG = 8, }; nx_struct cmd_payload { nx_uint16_t id; nx_uint8_t forward; nx_uint8_t data[0]; }; enum { BSHELL_ERROR_NOTFOUND = 0, }; nx_struct bshell_error { nx_uint16_t code; }; nx_struct bshell_enumerate { nx_uint16_t cmdlist[0]; }; nx_struct bshell_echo { nx_uint8_t data[0]; }; nx_struct bshell_ping6 { nx_uint16_t cnt; nx_uint16_t dt; nx_uint8_t addr[16]; }; nx_struct bshell_ping6_reply { nx_uint8_t addr[16]; nx_uint16_t seqno; nx_uint16_t dt; nx_uint8_t ttl; }; nx_struct bshell_ping6_done { nx_uint16_t sent; nx_uint16_t received; }; nx_struct bshell_uptime { nx_uint32_t uptime_hi; nx_uint32_t uptime_lo; }; nx_struct bshell_ident { nx_uint8_t appname[16]; nx_uint8_t username[16]; nx_uint8_t hostname[16]; nx_uint32_t timestamp; }; #endif tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/BinaryShellC.nc000066400000000000000000000035651207233610700230310ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #include configuration BinaryShellC { provides interface BinaryCommand[uint16_t]; } implementation { components new UdpSocketC(); components BinaryShellP, LedsC; BinaryCommand = BinaryShellP; BinaryShellP.UDP -> UdpSocketC; components ICMPPingC; BinaryShellP.ICMPPing -> ICMPPingC.ICMPPing[unique("PING")]; #if defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) components CounterMilli32C; BinaryShellP.Uptime -> CounterMilli32C; #endif components MainC; BinaryShellP.Boot -> MainC; BinaryShellP.CmdEcho -> BinaryShellP.BinaryCommand[BSHELL_ECHO]; BinaryShellP.CmdPing6 -> BinaryShellP.BinaryCommand[BSHELL_PING6]; BinaryShellP.CmdIdent -> BinaryShellP.BinaryCommand[BSHELL_IDENT]; BinaryShellP.CmdUptime -> BinaryShellP.BinaryCommand[BSHELL_UPTIME]; } tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/BinaryShellP.nc000066400000000000000000000131321207233610700230350ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #include #include #include #include "Shell.h" #include "BinaryShell.h" module BinaryShellP { provides { interface BinaryCommand[uint16_t cmd_id]; } uses { interface Boot; interface UDP; interface Leds; interface ICMPPing; #if defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) interface Counter as Uptime; #endif // interface BinaryCommand as CmdEnumerate; interface BinaryCommand as CmdEcho; interface BinaryCommand as CmdPing6; interface BinaryCommand as CmdUptime; interface BinaryCommand as CmdIdent; } } implementation { bool session_active; struct sockaddr_in6 session_endpoint; uint32_t boot_time; uint64_t uptime; uint8_t reply_buf[MAX_REPLY_LEN]; event void Boot.booted() { atomic { uptime = 0; #if defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) boot_time = call Uptime.get(); #endif } call UDP.bind(2001); } command char *BinaryCommand.getBuffer[uint16_t cmd_id](int len) { if (len <= MAX_REPLY_LEN) return reply_buf; return NULL; } command void BinaryCommand.write[uint16_t cmd_id](nx_struct cmd_payload *data, int len) { data->id = cmd_id; call UDP.sendto(&session_endpoint, data, len); } event void CmdEcho.dispatch(nx_struct cmd_payload *cmd, int len) { call CmdEcho.write(cmd, len); } event void CmdPing6.dispatch(nx_struct cmd_payload *cmd, int len) { nx_struct bshell_ping6 *ping = (nx_struct bshell_ping6 *)(cmd->data); call ICMPPing.ping((struct in6_addr *)ping->addr, ping->dt, ping->cnt); } event void CmdUptime.dispatch(nx_struct cmd_payload *cmd, int len) { #if defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) nx_struct cmd_payload *p = (nx_struct cmd_payload *)reply_buf; nx_struct bshell_uptime *u = (nx_struct bshell_uptime *)p->data; uint64_t tval = call Uptime.get(); atomic { tval = (uptime + tval - boot_time) / 1024; } u->uptime_hi = tval >> 32; u->uptime_lo = tval & 0xffffffff; call CmdUptime.write(p, sizeof(nx_struct cmd_payload) + sizeof(nx_struct bshell_uptime)); #endif } event void CmdIdent.dispatch(nx_struct cmd_payload *cmd, int len) { nx_struct cmd_payload *p = (nx_struct cmd_payload *)reply_buf; nx_struct bshell_ident *i = (nx_struct bshell_ident *)p->data; memcpy(i->appname, IDENT_APPNAME, 16); memcpy(i->username, IDENT_USERNAME, 16); memcpy(i->hostname, IDENT_HOSTNAME, 16); i->timestamp = IDENT_TIMESTAMP; call CmdIdent.write(p,sizeof(nx_struct cmd_payload) + sizeof(nx_struct bshell_ident)); } event void UDP.recvfrom(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip6_metadata *meta) { nx_struct cmd_payload *payload = (nx_struct cmd_payload *)data; memcpy(&session_endpoint, from, sizeof(struct sockaddr_in6)); signal BinaryCommand.dispatch[payload->id](payload, len); } event void ICMPPing.pingReply(struct in6_addr *source, struct icmp_stats *stats) { nx_struct cmd_payload *p = (nx_struct cmd_payload *)reply_buf; nx_struct bshell_ping6_reply *r = (nx_struct bshell_ping6_reply *)p->data; memcpy(r->addr, source, 16); r->seqno = stats->seq; r->dt = stats->rtt; r->ttl = stats->ttl; call BinaryCommand.write[BSHELL_PING6_REPLY](p, sizeof(nx_struct cmd_payload) + sizeof(nx_struct bshell_ping6_reply)); } event void ICMPPing.pingDone(uint16_t ping_rcv, uint16_t ping_n) { nx_struct cmd_payload *p = (nx_struct cmd_payload *)reply_buf; nx_struct bshell_ping6_done *d = (nx_struct bshell_ping6_done *)p->data; d->sent = ping_n; d->received = ping_rcv; call BinaryCommand.write[BSHELL_PING6_DONE](p, sizeof(nx_struct cmd_payload) + sizeof(nx_struct bshell_ping6_done)); } #if defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) async event void Uptime.overflow() { atomic uptime += 0xffffffff; } #endif default event void BinaryCommand.dispatch[uint16_t cmd_id](nx_struct cmd_payload *cmd, int len) { nx_struct cmd_payload *p = (nx_struct cmd_payload *)reply_buf; nx_struct bshell_error *e = (nx_struct bshell_error *)p->data; e->code = BSHELL_ERROR_NOTFOUND; call BinaryCommand.write[BSHELL_ERROR](p, sizeof(nx_struct cmd_payload) + sizeof(nx_struct bshell_enumerate)); } } tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/FlashShellC.nc000066400000000000000000000004571207233610700226370ustar00rootroot00000000000000 #include "StorageVolumes.h" configuration FlashShellC { } implementation { components new ShellCommandC("flash"); FlashShellP.ShellCommand -> ShellCommandC; components new BlockStorageC(VOLUME_DELUGE1); FlashShellP.BlockRead -> BlockStorageC; FlashShellP.BlockWrite -> BlockStorageC; } tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/FlashShellP.nc000066400000000000000000000026071207233610700226530ustar00rootroot00000000000000module FlashShellP { uses { interface Boot; interface Leds; interface ShellCommand; interface BlockRead; interface BlockWrite; } } implementation { event void Boot.booted() { if (call BlockWrite.erase() != SUCCESS) call Leds.led1Toggle(); } event void BlockRead.readDone(storage_addr_t addr, void* buf, storage_len_t len, error_t error) { uint16_t r_len = snprintf(reply_buf, MAX_REPLY_LEN,"read done addr: 0x%x len: %i error: %i data: ", addr, len, error); if (len < MAX_REPLY_LEN - r_len - 1) memcpy(reply_buf + r_len, buf, len); reply_buf[r_len + len + 1] = '\n'; call UDP.sendto(&session_endpoint, reply_buf, r_len + len + 1); } event void BlockRead.computeCrcDone(storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) { } event void BlockWrite.writeDone(storage_addr_t addr, void* buf, storage_len_t len, error_t error) { uint16_t r_len = snprintf(reply_buf, MAX_REPLY_LEN,"write done addr: 0x%x len: %i error: %i\n", addr, len, error); call UDP.sendto(&session_endpoint, reply_buf, r_len); } event void BlockWrite.eraseDone(error_t error) { call Leds.led0Toggle(); } event void BlockWrite.syncDone(error_t error) { } } tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/RegisterShellCommand.nc000066400000000000000000000001041207233610700245470ustar00rootroot00000000000000 interface RegisterShellCommand { event char *getCommandName(); } tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/RouteCmdC.nc000066400000000000000000000035711207233610700223340ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ configuration RouteCmdC { } implementation { components RouteCmdP; components new ShellCommandC("route"); components IPStackC; RouteCmdP.ShellCommand -> ShellCommandC; RouteCmdP.ForwardingTable -> IPStackC; components new TimerMilliC(); RouteCmdP.Timer -> TimerMilliC; } tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/RouteCmdP.nc000066400000000000000000000107641207233610700223530ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include #include module RouteCmdP { uses interface ShellCommand; uses interface ForwardingTable; uses interface Timer; } implementation { char *header = "key\tdestination\t\tgateway\t\tiface\n"; struct { int ifindex; char *name; } ifaces[3] = {{0, "any"}, {1, "pan"}, {2, "ppp"}}; char *ifnam(int ifidx) { int i; for (i = 0; i < sizeof(ifaces) / sizeof(ifaces[0]); i++) { if (ifaces[i].ifindex == ifidx) return ifaces[i].name; } return NULL; } int cur_entry; event void Timer.fired() { #define LEN (MAX_REPLY_LEN - (cur - buf)) struct route_entry *entry; int n; char *cur, *buf = call ShellCommand.getBuffer(MAX_REPLY_LEN); cur = buf; entry = call ForwardingTable.getTable(&n); if (!buf || !entry) return; for (;cur_entry < n; cur_entry++) { if (entry[cur_entry].valid) { cur += snprintf(cur, LEN, "%2i\t", entry[cur_entry].key); cur += inet_ntop6(&entry[cur_entry].prefix, cur, LEN) - 1; cur += snprintf(cur, LEN, "/%i\t\t", entry[cur_entry].prefixlen); cur += inet_ntop6(&entry[cur_entry].next_hop, cur, LEN) - 1; if (LEN < 6) continue; *cur++ = '\t'; *cur++ = '\t'; strncpy(cur, ifnam(entry[cur_entry].ifindex), LEN); cur += 3; *cur++ = '\n'; if (LEN > (MAX_REPLY_LEN / 2)) { call ShellCommand.write(buf, cur - buf); call Timer.startOneShot(20); cur_entry++; return; } } } if (cur > buf) call ShellCommand.write(buf, cur - buf); } event char *ShellCommand.eval(int argc, char **argv) { char *cur, *buf = call ShellCommand.getBuffer(MAX_REPLY_LEN); if (argc == 1) { // send the routing table on a timer cur = buf; memcpy(cur, header, strlen(header)); cur += strlen(header); call ShellCommand.write(buf, cur - buf); cur_entry = 0; call Timer.startOneShot(20); } else if (strcmp(argv[1], "del") == 0 && argc == 3) { // delete a route based on the route key call ForwardingTable.delRoute(atoi(argv[2])); } else if (strcmp(argv[1], "add") == 0 && argc == 4) { // route add prefix[/len] nexthop // parse a new route from the arguments and add it // the forwarding table implementation currently only supports // prefixes in increments of 8 bits. struct in6_addr in_pfx, in_next; char *prefix = argv[2]; char *prefix_len = argv[2]; char *next = argv[3]; while (*prefix_len != '/' && *prefix_len != '\0') prefix_len++; if (*prefix_len == '/') *prefix_len++ = '\0'; else prefix_len = "128"; inet_pton6(prefix, &in_pfx); inet_pton6(next, &in_next); call ForwardingTable.addRoute(in_pfx.s6_addr, atoi(prefix_len), &in_next, ROUTE_IFACE_154); } return NULL; } } tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/Shell.h000066400000000000000000000022261207233610700214010ustar00rootroot00000000000000/* * "Copyright (c) 2008, 2009 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #ifndef _SHELL_H #define _SHELL_H enum { MAX_REPLY_LEN = 128, }; #endif tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/ShellCommand.nc000066400000000000000000000012461207233610700230520ustar00rootroot00000000000000 interface ShellCommand { /* * evaluate the command that this command provides * @argc the number of arguments * @argv the arguments * @return a string to send back as the reply to the shell client. * if NULL, nothing is sent. */ event char *eval(int argc, char **argv); /* * request a buffer. The result of this command may be returned * from 'eval', but otherwise the buffer may not be used outside of * the context it is called from. */ command char *getBuffer(uint16_t len); /* * write a string to the shell buffer; if no client is connected it * will fail silently */ command void write(char *str, int len); } tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/ShellCommandC.nc000066400000000000000000000005451207233610700231560ustar00rootroot00000000000000 generic configuration ShellCommandC(char cmd_name[]) { provides interface ShellCommand; } implementation { enum { CMD_ID = unique("UDPSHELL_CLIENTCOUNT"), }; components new ShellCommandP(cmd_name), UDPShellP; ShellCommandP.RegisterShellCommand -> UDPShellP.RegisterShellCommand[CMD_ID]; ShellCommand = UDPShellP.ShellCommand[CMD_ID]; } tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/ShellCommandP.nc000066400000000000000000000002741207233610700231720ustar00rootroot00000000000000 generic module ShellCommandP(char cmd_name[]) { uses interface RegisterShellCommand; } implementation { event char *RegisterShellCommand.getCommandName() { return cmd_name; } } tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/UDPShellC.nc000066400000000000000000000041121207233610700222220ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include configuration UDPShellC { } implementation { components new UdpSocketC(); components UDPShellP, LedsC; UDPShellP.UDP -> UdpSocketC; UDPShellP.Leds -> LedsC; components ICMPPingC; UDPShellP.ICMPPing -> ICMPPingC.ICMPPing[unique("PING")]; #if defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) || defined(PLATFORM_Z1) components CounterMilli32C; UDPShellP.Uptime -> CounterMilli32C; #endif components MainC; UDPShellP.Boot -> MainC; } tinyos-2.1.2+dfsg/tos/lib/net/blip/shell/UDPShellP.nc000066400000000000000000000222221207233610700222410ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "Shell.h" module UDPShellP { provides { interface ShellCommand[uint8_t cmd_id]; interface RegisterShellCommand[uint8_t cmd_id]; } uses { interface Boot; interface UDP; interface Leds; interface ICMPPing; #if defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) || defined(PLATFORM_Z1) interface Counter as Uptime; #endif } } implementation { bool session_active; struct sockaddr_in6 session_endpoint; uint32_t boot_time; uint64_t uptime; enum { N_EXTERNAL = uniqueCount("UDPSHELL_CLIENTCOUNT"), }; // and corresponding indeces enum { N_BUILTINS = 5, // the maximum number of arguments a command can take N_ARGS = 10, CMD_HELP = 0, CMD_ECHO = 1, CMD_PING6 = 2, CMD_TRACERT6 = 3, CMD_NO_CMD = 0xfe, CMDNAMSIZ = 10, }; struct cmd_name { uint8_t c_len; char c_name[CMDNAMSIZ]; }; struct cmd_builtin { void (*action)(int, char **); }; struct cmd_name externals[N_EXTERNAL]; event void Boot.booted() { int i; atomic { uptime = 0; #if defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) || defined(PLATFORM_Z1) boot_time = call Uptime.get(); #endif } for (i = 0; i < N_EXTERNAL; i++) { externals[i].c_name[CMDNAMSIZ-1] = '\0'; strncpy(externals[i].c_name, signal RegisterShellCommand.getCommandName[i](), CMDNAMSIZ); externals[i].c_len = strlen(externals[i].c_name); } call UDP.bind(2000); } #define DEREF(X) #X #define QUOTE(X) DEREF(X) char reply_buf[MAX_REPLY_LEN]; char *help_str = "sdsh-0.9\tbuiltins: [help, echo, ping6, uptime, ident]\n"; const char *ping_fmt = " icmp_seq=%i ttl=%i time=%i ms\n"; const char *ping_summary = "%i packets transmitted, %i received\n"; char *ident_string = "\t[app: " IDENT_APPNAME "]\n\t[user: " IDENT_USERNAME "]\n\t[host: " IDENT_HOSTNAME "]\n\t[time: " QUOTE(IDENT_TIMESTAMP) "]\n"; void action_help(int argc, char **argv) { int i = 0; char *pos = reply_buf; call UDP.sendto(&session_endpoint, help_str, strlen(help_str)); if (N_EXTERNAL > 0) { strcpy(pos, "\t\t["); pos += 3; for (i = 0; i < N_EXTERNAL; i++) { if (externals[i].c_len + 4 < MAX_REPLY_LEN - (pos - reply_buf)) { memcpy(pos, externals[i].c_name, externals[i].c_len); pos += externals[i].c_len; if (i < N_EXTERNAL-1) { pos[0] = ','; pos[1] = ' '; pos += 2; } } else { pos[0] = '.'; pos[1] = '.'; pos[2] = '.'; pos += 3; break; } } *pos++ = ']'; *pos++ = '\n'; call UDP.sendto(&session_endpoint, reply_buf, pos - reply_buf); } } command char *ShellCommand.getBuffer[uint8_t cmd_id](uint16_t len) { reply_buf[0] = '\0'; if (len <= MAX_REPLY_LEN) return reply_buf; return NULL; } command void ShellCommand.write[uint8_t cmd_id](char *str, int len) { call UDP.sendto(&session_endpoint, str, len); } void action_echo(int argc, char **argv) { int i, arg_len; char *payload = reply_buf; if (argc < 2) return; for (i = 1; i < argc; i++) { arg_len = strlen(argv[i]); if ((payload - reply_buf) + arg_len + 1 > MAX_REPLY_LEN) break; memcpy(payload, argv[i], arg_len); payload += arg_len; *payload = ' '; payload++; } *(payload - 1) = '\n'; call UDP.sendto(&session_endpoint, reply_buf, payload - reply_buf); } void action_ping6(int argc, char **argv) { struct in6_addr dest; if (argc < 2) return; inet_pton6(argv[1], &dest); call ICMPPing.ping(&dest, 1024, 10); } void action_uptime(int argc, char **argv) { #if defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) || defined(PLATFORM_Z1) int len; uint64_t tval = call Uptime.get(); atomic tval = (uptime + tval - boot_time) / 1024; len = snprintf(reply_buf, MAX_REPLY_LEN, "up %li seconds\n", (uint32_t)tval); call UDP.sendto(&session_endpoint, reply_buf, len); #endif } void action_ident(int argc, char **argv) { call UDP.sendto(&session_endpoint, ident_string, strlen(ident_string)); } // commands struct cmd_name builtins[N_BUILTINS] = {{4, "help"}, {4, "echo"}, {5, "ping6"}, {6, "uptime"}, {5, "ident"}}; struct cmd_builtin builtin_actions[N_BUILTINS] = {{action_help}, {action_echo}, {action_ping6}, {action_uptime}, {action_ident}}; // break up a command given as a string into a sequence of null terminated // strings, and initialize the argv array to point into it. void init_argv(char *cmd, uint16_t len, char **argv, int *argc) { int inArg = 0; *argc = 0; while (len > 0 && *argc < N_ARGS) { if (*cmd == ' ' || *cmd == '\n' || *cmd == '\t' || *cmd == '\0' || len == 1){ if (inArg) { *argc = *argc + 1; inArg = 0; *cmd = '\0'; } } else if (!inArg) { argv[*argc] = cmd; inArg = 1; } cmd ++; len --; } } int lookup_cmd(char *cmd, int dbsize, struct cmd_name *db) { int i; for (i = 0; i < dbsize; i++) { if (memcmp(cmd, db[i].c_name, db[i].c_len) == 0 && cmd[db[i].c_len] == '\0') return i; } return CMD_NO_CMD; } event void UDP.recvfrom(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip6_metadata *meta) { char *argv[N_ARGS]; int argc, cmd; memcpy(&session_endpoint, from, sizeof(struct sockaddr_in6)); init_argv((char *)data, len, argv, &argc); if (argc > 0) { cmd = lookup_cmd(argv[0], N_BUILTINS, builtins); if (cmd != CMD_NO_CMD) { builtin_actions[cmd].action(argc, argv); return; } cmd = lookup_cmd(argv[0], N_EXTERNAL, externals); if (cmd != CMD_NO_CMD) { char *reply = signal ShellCommand.eval[cmd](argc, argv); if (reply != NULL) call UDP.sendto(&session_endpoint, reply, strlen(reply)); return; } cmd = snprintf(reply_buf, MAX_REPLY_LEN, "sdsh: %s: command not found\n", argv[0]); call UDP.sendto(&session_endpoint, reply_buf, cmd); } } event void ICMPPing.pingReply(struct in6_addr *source, struct icmp_stats *stats) { int len; len = inet_ntop6(source, reply_buf, MAX_REPLY_LEN); if (len > 0) { len += snprintf(reply_buf + len - 1, MAX_REPLY_LEN - len + 1, ping_fmt, stats->seq, stats->ttl, stats->rtt); reply_buf[len] = '\0'; call UDP.sendto(&session_endpoint, reply_buf, len); } } event void ICMPPing.pingDone(uint16_t ping_rcv, uint16_t ping_n) { int len; len = snprintf(reply_buf, MAX_REPLY_LEN, ping_summary, ping_n, ping_rcv); call UDP.sendto(&session_endpoint, reply_buf, len); } #if defined(PLATFORM_TELOSB) || defined(PLATFORM_EPIC) || defined(PLATFORM_Z1) async event void Uptime.overflow() { atomic uptime += 0xffffffff; } #endif default event char *ShellCommand.eval[uint8_t cmd_id](int argc, char **argv) { return NULL; } default event char *RegisterShellCommand.getCommandName[uint8_t cmd_id]() { return NULL; } } tinyos-2.1.2+dfsg/tos/lib/net/blip/table.c000066400000000000000000000033341207233610700203060ustar00rootroot00000000000000/* * "Copyright (c) 2008, 2009 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #include #include "table.h" void table_init(table_t *table, void *data, uint16_t elt_len, uint16_t n_elts) { table->data = data; table->elt_len = elt_len; table->n_elts = n_elts; } void *table_search(table_t *table, int (*pred)(void *)) { int i; void *cur; for (i = 0; i < table->n_elts; i++) { cur = table->data + (i * table->elt_len); switch (pred(cur)) { case 1: return cur; case -1: return NULL; default: continue; } } return NULL; } void table_map(table_t *table, void(*fn)(void *)) { int i; for (i = 0; i < table->n_elts; i++) fn(table->data + (i * table->elt_len)); } tinyos-2.1.2+dfsg/tos/lib/net/blip/table.h000066400000000000000000000026301207233610700203110ustar00rootroot00000000000000/* * "Copyright (c) 2008, 2009 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ #ifndef TABLE_H_ #define TABLE_H_ #include typedef struct { void *data; uint16_t elt_len; uint16_t n_elts; } table_t; void table_init(table_t *table, void *data,uint16_t elt_len, uint16_t n_elts); void *table_search(table_t *table, int (*pred)(void *)); void table_map(table_t *table, void (*fn)(void *)); #endif tinyos-2.1.2+dfsg/tos/lib/net/coap/000077500000000000000000000000001207233610700170445ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapBufferHumTranslateC.nc000066400000000000000000000035161207233610700240420ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ generic configuration CoapBufferHumTranslateC() { provides interface Read as ReadHum; uses interface Read; } implementation { components new CoapBufferHumTranslateP(); ReadHum = CoapBufferHumTranslateP; CoapBufferHumTranslateP.Read = Read; } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapBufferHumTranslateP.nc000066400000000000000000000046441207233610700240620ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ generic module CoapBufferHumTranslateP() { provides interface Read as ReadHum; uses interface Read; } implementation { command error_t ReadHum.read() { call Read.read(); return SUCCESS; } event void Read.readDone(error_t result, uint16_t val) { /* The calculation of the relative humidity for TelosB nodes is done according to the datasheet SHT1x (www.sensirion.com/en/pdf/product_information/Datasheet-humidity-sensor-SHT1x.pdf). RH = c1 + c2 * val + c3 * val^2 To avoid floating point calculations and to achieve a precision of 0.01 %, the values c1 and c2 are multiplied with 100 to get fixed point values and value c3 is transformed by 1/x. */ val = (-204 + val*4 -((uint32_t)val*(uint32_t)val)*100/628931); printf("CoapRead.readDone: %hu\n", val); signal ReadHum.readDone(result, val); } } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapBufferTempTranslateC.nc000066400000000000000000000035251207233610700242160ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ generic configuration CoapBufferTempTranslateC() { provides interface Read as ReadTemp; uses interface Read; } implementation { components new CoapBufferTempTranslateP(); ReadTemp = CoapBufferTempTranslateP; CoapBufferTempTranslateP.Read = Read; } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapBufferTempTranslateP.nc000066400000000000000000000046561207233610700242410ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ generic module CoapBufferTempTranslateP() { provides interface Read as ReadTemp; uses interface Read; } implementation { command error_t ReadTemp.read() { call Read.read(); return SUCCESS; } event void Read.readDone(error_t result, uint16_t val) { /* The calculation of the temperature for TelosB nodes is done according to the datasheet SHT1x (www.sensirion.com/en/pdf/product_information/Datasheet-humidity-sensor-SHT1x.pdf). T = d1 + d2 * val All values are multiplied with 100 to get a fixed-point representation and the final result is in Kelvin (+ 273.15). In addition, an offset can be subtracted for battery or USB powered nodes */ val = 23355 + val -200; //Offset: 500 for USB, 200 for Battery printf( "CoapBufferTempTranslateP.readDone: %hu \n", val); signal ReadTemp.readDone(result, val); } } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapBufferVoltTranslateC.nc000066400000000000000000000035241207233610700242340ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ generic configuration CoapBufferVoltTranslateC() { provides interface Read as ReadVolt; uses interface Read; } implementation { components new CoapBufferVoltTranslateP(); ReadVolt = CoapBufferVoltTranslateP; CoapBufferVoltTranslateP.Read = Read; } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapBufferVoltTranslateP.nc000066400000000000000000000043211207233610700242450ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ generic module CoapBufferVoltTranslateP() { provides interface Read as ReadVolt; uses interface Read; } implementation { command error_t ReadVolt.read() { call Read.read(); return SUCCESS; } event void Read.readDone(error_t result, uint16_t val) { /* The calculation of the voltage for TelosB nodes is done according to the formula given in $TOSROOT/tos/chips/msp430/sensors/Msp430InternalVoltageC.nc To provide a precision of 0.01 Volt, the equation is multiplied by 100.*/ val = (uint32_t)val*300/4096; printf("CoapRead.readDoneVolt: %hu \n", val); signal ReadVolt.readDone(result, val); } } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapFlashResourceC.nc000066400000000000000000000036521207233610700230470ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ generic configuration CoapFlashResourceC(uint8_t uri_key) { provides interface ReadResource; provides interface WriteResource; uses interface ConfigStorage; } implementation { components new CoapFlashResourceP(uri_key) as CoapFlashResourceP; ReadResource = CoapFlashResourceP; WriteResource = CoapFlashResourceP; ConfigStorage = CoapFlashResourceP; } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapFlashResourceP.nc000066400000000000000000000075321207233610700230650ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "tinyos_coap_resources.h" generic module CoapFlashResourceP(uint8_t uri_key) { provides interface ReadResource; provides interface WriteResource; uses interface ConfigStorage; } implementation { bool lock = FALSE; coap_tid_t temp_id; config_t conf; enum { CONFIG_ADDR = 0 }; ///////////// //GET ///////////// event void ConfigStorage.readDone(storage_addr_t addr, void* buf, storage_len_t len, error_t err) { if (err == SUCCESS) { memcpy(&conf, buf, len); } else { //printf("Read flash not successful\n"); } signal ReadResource.getDone(err, temp_id, 0, buf, sizeof(conf)); lock = FALSE; } command int ReadResource.get(coap_tid_t id) { if (lock == FALSE) { lock = TRUE; temp_id = id; if (call ConfigStorage.valid() == TRUE) { if (call ConfigStorage.read(CONFIG_ADDR, &conf, sizeof(conf)) != SUCCESS) { //printf("Config.read not successful \n"); lock = FALSE; return COAP_RESPONSE_500; } else { return COAP_SPLITPHASE; } } else { lock = FALSE; return COAP_RESPONSE_500; } } else { lock = FALSE; return COAP_RESPONSE_503; } } ///////////// //PUT ///////////// #warning "FIXME: CoAP: PreAck not implemented for put" event void ConfigStorage.commitDone(error_t err) { lock = FALSE; signal WriteResource.putDone(err, temp_id, 0); } event void ConfigStorage.writeDone(storage_addr_t addr, void *buf, storage_len_t len, error_t err) { if (err == SUCCESS) { if (call ConfigStorage.commit() != SUCCESS) { signal WriteResource.putDone(err, temp_id, 0); lock = FALSE; } } else { signal WriteResource.putDone(err, temp_id, 0); lock = FALSE; } } command int WriteResource.put(uint8_t *val, size_t buflen, coap_tid_t id) { if (lock == FALSE) { if (uri_key == KEY_KEY && buflen < sizeof(conf)) { return COAP_RESPONSE_500; } lock = TRUE; temp_id = id; memcpy(&conf, val, buflen); if (call ConfigStorage.write(CONFIG_ADDR, &conf, sizeof(conf)) != SUCCESS) { //printf("Config.write not successful\n"); lock = FALSE; return COAP_RESPONSE_500; } else { return COAP_SPLITPHASE; } } else { lock = FALSE; return COAP_RESPONSE_503; } } } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapLedResourceC.nc000066400000000000000000000036161207233610700225160ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ generic configuration CoapLedResourceC(uint8_t uri_key) { provides interface ReadResource; provides interface WriteResource; uses interface Leds; } implementation { components new CoapLedResourceP(uri_key) as CoapLedResourceP; ReadResource = CoapLedResourceP; WriteResource = CoapLedResourceP; Leds = CoapLedResourceP; } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapLedResourceP.nc000066400000000000000000000051321207233610700225260ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include generic module CoapLedResourceP(uint8_t uri_key) { provides interface ReadResource; provides interface WriteResource; uses interface Leds; } implementation { bool lock = FALSE; coap_tid_t temp_id; void task getLed() { uint8_t val = call Leds.get(); lock = FALSE; signal ReadResource.getDone(SUCCESS, temp_id, 0, (uint8_t*)&val, sizeof(uint8_t)); }; command int ReadResource.get(coap_tid_t id) { if (lock == FALSE) { lock = TRUE; temp_id = id; post getLed(); return COAP_SPLITPHASE; } else { return COAP_RESPONSE_503; } } void task setLedDone() { lock = FALSE; signal WriteResource.putDone(SUCCESS, temp_id, 0); }; command int WriteResource.put(uint8_t *val, size_t buflen, coap_tid_t id) { if (*val < 8) { if (lock == FALSE) { lock = TRUE; temp_id = id; call Leds.set(*val); post setLedDone(); return COAP_SPLITPHASE; } else { return COAP_RESPONSE_503; } } else { return COAP_RESPONSE_500; } } } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapReadResourceC.nc000066400000000000000000000040021207233610700226530ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ generic configuration CoapReadResourceC(typedef val_t, uint8_t uri_key) { provides interface ReadResource; uses interface Read; } implementation { components LedsC; components new TimerMilliC() as PreAckTimer; components new CoapReadResourceP(val_t, uri_key) as CoapReadResourceP; ReadResource = CoapReadResourceP; CoapReadResourceP.Leds -> LedsC; CoapReadResourceP.PreAckTimer -> PreAckTimer; CoapReadResourceP.Read = Read; } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapReadResourceP.nc000066400000000000000000000051671207233610700227050ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include generic module CoapReadResourceP(typedef val_t, uint8_t uri_key) { provides interface ReadResource; uses interface Leds; uses interface Timer as PreAckTimer; uses interface Read; } implementation { bool lock = FALSE; coap_tid_t temp_id; command int ReadResource.get(coap_tid_t id) { // printf("ReadResource.get: %hu\n", uri_key); if (lock == FALSE) { lock = TRUE; temp_id = id; call PreAckTimer.startOneShot(COAP_PREACK_TIMEOUT); call Read.read(); return COAP_SPLITPHASE; } else { return COAP_RESPONSE_503; } } event void PreAckTimer.fired() { call Leds.led2Toggle(); signal ReadResource.getDoneDeferred(temp_id); } event void Read.readDone(error_t result, val_t val) { uint8_t asyn_message = 1; if (call PreAckTimer.isRunning()) { call PreAckTimer.stop(); asyn_message = 0; } //printf("ReadResource.readDone\n"); signal ReadResource.getDone(result, temp_id, asyn_message, (uint8_t*)&val, sizeof(val_t)); lock = FALSE; } } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapResourceCollectorC.nc000066400000000000000000000040031207233610700237270ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ configuration CoapResourceCollectorC { provides interface Read as ReadAll; uses interface Read as ReadTemp; uses interface Read as ReadHum; uses interface Read as ReadVolt; } implementation { components CoapResourceCollectorP; ReadAll = CoapResourceCollectorP; CoapResourceCollectorP.ReadTemp = ReadTemp; CoapResourceCollectorP.ReadHum = ReadHum; CoapResourceCollectorP.ReadVolt = ReadVolt; } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapResourceCollectorP.nc000066400000000000000000000064261207233610700237570ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "tinyos_coap_resources.h" module CoapResourceCollectorP { provides interface Read as ReadAll; uses interface Read as ReadTemp; uses interface Read as ReadHum; uses interface Read as ReadVolt; } implementation { bool temp_finished; bool hum_finished; bool volt_finished; val_all_t val_r; command error_t ReadAll.read() { val_r.id_t = KEY_TEMP; val_r.id_h = KEY_HUM; val_r.id_v = KEY_VOLT; val_r.temp = SENSOR_NOT_AVAILABLE; val_r.hum = SENSOR_NOT_AVAILABLE; val_r.volt = SENSOR_NOT_AVAILABLE; temp_finished = FALSE; hum_finished = FALSE; volt_finished = FALSE; call ReadHum.read(); call ReadTemp.read(); call ReadVolt.read(); return SUCCESS; } void areAllDone() { if ((temp_finished == TRUE) && (hum_finished == TRUE) && (volt_finished == TRUE) ) { signal ReadAll.readDone(SUCCESS, val_r); } } event void ReadTemp.readDone(error_t result, uint16_t val) { temp_finished = TRUE; if (result == SUCCESS) { val_r.length_t = sizeof(val); val_r.temp = ntohs(val); } else { val_r.temp = SENSOR_VALUE_INVALID; } areAllDone(); } event void ReadHum.readDone(error_t result, uint16_t val) { hum_finished = TRUE; if (result == SUCCESS) { val_r.length_h = sizeof(val); val_r.hum = ntohs(val); } else { val_r.hum = SENSOR_VALUE_INVALID; } areAllDone(); } event void ReadVolt.readDone(error_t result, uint16_t val) { volt_finished = TRUE; if (result == SUCCESS) { val_r.length_v = sizeof(val); val_r.volt = ntohs(val); } else { val_r.volt = SENSOR_VALUE_INVALID; } areAllDone(); } } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapRouteResourceC.nc000066400000000000000000000036251207233610700231100ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ generic configuration CoapRouteResourceC(typedef val_t, uint8_t uri_key) { provides interface ReadResource; uses interface ForwardingTable; } implementation { components new CoapRouteResourceP(val_t, uri_key) as CoapRouteResourceP; // components IPStackC; ReadResource = CoapRouteResourceP; ForwardingTable = CoapRouteResourceP; } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapRouteResourceP.nc000066400000000000000000000065671207233610700231350ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ generic module CoapRouteResourceP(typedef val_t, uint8_t uri_key) { provides interface ReadResource; uses interface ForwardingTable; } implementation { bool lock = FALSE; coap_tid_t temp_id; struct { int ifindex; char *name; } ifaces[3] = {{0, "any"}, {1, "pan"}, {2, "ppp"}}; char *ifnam(int ifidx) { int i; for (i = 0; i < sizeof(ifaces) / sizeof(ifaces[0]); i++) { if (ifaces[i].ifindex == ifidx) return ifaces[i].name; } return NULL; } void task getRoute() { #define LEN (COAP_MAX_PDU_SIZE - (cur - buf)) struct route_entry *entry; int n; int cur_entry; char *buf; char *cur; char buf2[COAP_MAX_PDU_SIZE]; buf = buf2; cur = buf; entry = call ForwardingTable.getTable(&n); if (!buf || !entry) { lock = FALSE; signal ReadResource.getDone(FAIL, temp_id, 0, (uint8_t*)buf, cur - buf); return; } for (;cur_entry < n; cur_entry++) { if (entry[cur_entry].valid) { cur += inet_ntop6(&entry[cur_entry].prefix, cur, LEN) - 1; cur += snprintf(cur, LEN, "/%i\t",entry[cur_entry].prefixlen); cur += inet_ntop6(&entry[cur_entry].next_hop, cur, LEN) - 1; if (LEN < 6) continue; *cur++ = '\t'; strncpy(cur, ifnam(entry[cur_entry].ifindex),LEN); cur += 3; *cur++ = '\n'; } } if (cur > buf) { lock = FALSE; signal ReadResource.getDone(SUCCESS, temp_id, 0, (uint8_t*)buf, cur - buf); } // } else { // // no route available? -> don't send a packet // signal ReadResource.getDone(SUCCESS, id_t, 0, (uint8_t*)"No Route", sizeof("No Route")); // } }; command int ReadResource.get(coap_tid_t id) { if (lock == FALSE) { lock = TRUE; temp_id = id; post getRoute(); return COAP_SPLITPHASE; } else { return COAP_RESPONSE_503; } } } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapUdpClientC.nc000066400000000000000000000036501207233610700221670ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ configuration CoapUdpClientC { provides interface CoAPClient; provides interface Init; uses interface LibCoAP as LibCoapClient; } implementation { components CoapUdpClientP, RandomC; CoAPClient = CoapUdpClientP.CoAPClient; LibCoapClient = CoapUdpClientP.LibCoapClient; Init = CoapUdpClientP.Init; CoapUdpClientP.Random -> RandomC; } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapUdpClientP.nc000066400000000000000000000127201207233610700222020ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include module CoapUdpClientP { provides interface CoAPClient; provides interface Init; uses interface Random; uses interface LibCoAP as LibCoapClient; } implementation { coap_context_t *ctx_client; coap_queue_t *nextpdu; unsigned short tid; //generate random transaction id unsigned short get_tid(){ if (!tid) tid = call Random.rand16(); tid++; return ntohs(tid); } coap_pdu_t * coap_new_ack(coap_pdu_t *pdu) { coap_pdu_t *ack = coap_new_pdu(); if (!ack) return NULL; ack->hdr->type = COAP_MESSAGE_ACK; ack->hdr->id = pdu->hdr->id; ack->hdr->code = 0; return ack; } coap_pdu_t * coap_new_request(method_t m, coap_list_t *options, uint16_t len, void *data) { coap_pdu_t *pdu; coap_list_t *opt; if ( ! ( pdu = coap_new_pdu() ) ) return NULL; pdu->hdr->type = COAP_MESSAGE_CON; pdu->hdr->id = get_tid(); pdu->hdr->code = m; for (opt = options; opt; opt = opt->next) { coap_add_option( pdu, COAP_OPTION_KEY(*(coap_option *)opt->data), COAP_OPTION_LENGTH(*(coap_option *)opt->data), COAP_OPTION_DATA(*(coap_option *)opt->data) ); } if (len && data) coap_add_data( pdu, len, data); return pdu; } void message_handler(coap_context_t *ctx, coap_queue_t *node, void *data); command error_t Init.init() { ctx_client = (coap_context_t*)coap_malloc( sizeof( coap_context_t ) ); if ( !ctx_client ) { return FAIL; } memset(ctx_client, 0, sizeof( coap_context_t ) ); ctx_client->tinyos_port = COAP_CLIENT_PORT; coap_register_message_handler( ctx_client, message_handler ); return SUCCESS; } command error_t CoAPClient.request(struct sockaddr_in6 *dest, method_t method, coap_list_t *optlist, uint16_t len, void * data) { coap_pdu_t *pdu; if (! (pdu = coap_new_request( method, optlist, len, data ) ) ) return FAIL; if (call LibCoapClient.send(ctx_client, dest, pdu, 1) == COAP_INVALID_TID) { coap_delete_pdu (pdu); return FAIL; } return SUCCESS; }; command error_t CoAPClient.streamed_request(struct sockaddr_in6 *dest, method_t method, coap_list_t *optlist) { // TODO: implement block'ed data transfer return FAIL; } void message_handler(coap_context_t *ctx, coap_queue_t *node, void *data) { unsigned int len = 0; unsigned char *payload = NULL; bool more = FALSE; uint8_t mediatype = COAP_MEDIATYPE_TEXT_PLAIN; if (node->pdu->hdr->version != COAP_DEFAULT_VERSION) return; if (node->pdu->hdr->type == COAP_MESSAGE_CON) { coap_pdu_t *ack = coap_new_ack(node->pdu); // TODO: maybe move this to a separate task? if (call LibCoapClient.send(ctx_client, &node->remote, ack, 1) == COAP_INVALID_TID) { coap_delete_pdu (ack); } } if (node->pdu->hdr->code == COAP_RESPONSE_200) { coap_opt_t *ct, *block; ct = coap_check_option (node->pdu, COAP_OPTION_CONTENT_TYPE); if (ct) mediatype = *COAP_OPT_VALUE(*ct); block = coap_check_option (node->pdu, COAP_OPTION_BLOCK); if (!block) { if (!coap_get_data (node->pdu, &len, &payload)) return; } else { // TODO: implement requesting of next response block return; } } if (node->pdu->hdr->code != 0) signal CoAPClient.request_done ( node->pdu->hdr->code, mediatype, (uint16_t)len, data, more); } event void LibCoapClient.read(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip6_metadata *meta) { coap_read(ctx_client, from, data, len, meta); coap_dispatch(ctx_client); } default event void CoAPClient.request_done ( uint8_t code, uint8_t mediatype, uint16_t len, void *data, bool more) { } } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapUdpServerC.nc000066400000000000000000000042061207233610700222150ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ configuration CoapUdpServerC { provides interface CoAPServer; provides interface Init; uses interface LibCoAP as LibCoapServer; uses interface ReadResource[uint8_t uri]; uses interface WriteResource[uint8_t uri]; } implementation { components CoapUdpServerP, LedsC, RandomC; CoAPServer = CoapUdpServerP.CoAPServer; LibCoapServer = CoapUdpServerP.LibCoapServer; ReadResource = CoapUdpServerP.ReadResource; WriteResource = CoapUdpServerP.WriteResource; Init = CoapUdpServerP.Init; CoapUdpServerP.Random -> RandomC; CoapUdpServerP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/net/coap/CoapUdpServerP.nc000066400000000000000000000663221207233610700222410ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include // for resource_t #include #include "tinyos_coap_resources.h" #include "blip_printf.h" #define INDEX "CoAPUdpServer: It works!!" #define GENERATE_PDU(var,t,c,i,copy_token) { \ var = coap_new_pdu(); \ if (var) { \ coap_opt_t *tok; \ var->hdr->type = (t); \ var->hdr->code = (c); \ var->hdr->id = (i); \ tok = coap_check_option(node->pdu, COAP_OPTION_TOKEN); \ if (tok && copy_token) \ coap_add_option( \ pdu, COAP_OPTION_TOKEN, COAP_OPT_LENGTH(*tok), COAP_OPT_VALUE(*tok));\ } \ } module CoapUdpServerP { provides interface CoAPServer; provides interface Init; uses interface LibCoAP as LibCoapServer; uses interface Random; uses interface Leds; uses interface ReadResource[uint8_t uri]; uses interface WriteResource[uint8_t uri]; } implementation { coap_context_t *ctx_server; unsigned short tid; //has to be static to ensure continuous increase for asyn responses // unlink a given node from the queue int coap_extract_node(coap_queue_t **queue, coap_queue_t *node) { coap_queue_t *q; if (!queue) return 0; q = *queue; if (q == node) { *queue = node->next; return 1; } for (;q; q = q->next) { if (q->next == node) { q->next = node->next; return 1; } } return 0; } //get uri (char) from key (int) //defined in tinyos_coap_ressources.h char* get_uri(uint8_t key) { if (key < NUM_URIS) { return uri_key_map[key].uri; } return ""; } //get key (int) from uri (char) //defined in tinyos_coap_ressources.h uint8_t get_key(uint8_t* uri, uint8_t len) { uint8_t i; for (i=0; i < NUM_URIS; i++) { if (strncmp(uri_key_map[i].uri, (const char*) uri, len) == 0) return uri_key_map[i].key; } return COAP_NO_SUCH_RESOURCE; } //generate new transaction id for async response unsigned short get_new_tid(){ if (!tid) tid = call Random.rand16(); tid++; return ntohs(tid); } int resource_splitphase(coap_uri_t *uri, coap_tid_t *id, unsigned char *mediatype, unsigned int offset, unsigned char *buf, unsigned int *buflen, int *finished, unsigned int method); int coap_save_splitphase(coap_context_t *ctx, coap_queue_t *node); void message_handler(coap_context_t *ctx, coap_queue_t *node, void *data); command error_t Init.init() { ctx_server = (coap_context_t*)coap_malloc( sizeof( coap_context_t ) ); if ( !ctx_server ) { return FAIL; } memset(ctx_server, 0, sizeof( coap_context_t ) ); ctx_server->tinyos_port = COAP_SERVER_PORT; printf("init: port %u\n", ctx_server->tinyos_port); coap_register_message_handler( ctx_server, message_handler ); return SUCCESS; } command error_t CoAPServer.bind(uint16_t port) { return call LibCoapServer.bind(port); } #ifdef INCLUDE_WELLKNOWN /////////////////// // wellknown resources int print_link(coap_resource_t *resource, unsigned char *buf, size_t buflen) { size_t n = 0; //assert(resource); //assert(buf); if (resource == NULL || buf == NULL) { return -1; } if (buflen < resource->uri->path.length + 3) return -1; /* FIXME: calculate maximum length and return if longer than buflen */ buf[n++] = '<'; buf[n++] = '/'; memcpy(buf + n, resource->uri->path.s, resource->uri->path.length); n += resource->uri->path.length; buf[n++] = '>'; if (resource->mediatype != COAP_MEDIATYPE_ANY) { if (buflen - n < 7) /* mediatype is at most 3 digits */ return -1; n += snprintf((char *)(buf + n), buflen - n, ";ct=%d", resource->mediatype); } if (resource->name) { if (buflen - n < resource->name->length + 5) /* include trailing quote */ return -1; memcpy(buf + n, ";n=\"", 4); n += 4; memcpy(buf + n, resource->name->s, resource->name->length); n += resource->name->length; if (!resource->writable) { if (buflen - n < 12) return -1; n += snprintf((char *)(buf + n), buflen - n, " (read-only)"); } buf[n++] = '"'; } return n; } int resource_wellknown(coap_uri_t *uri, coap_tid_t *id, unsigned char *mediatype, unsigned int offset, unsigned char *buf, unsigned int *buflen, int *finished, unsigned int method) { #define RESOURCE_BUFLEN 1000 static unsigned char resources[RESOURCE_BUFLEN]; size_t maxlen = 0; int n; coap_list_t *node; //assert(ctx_server); //assert(resource); if (ctx_server == NULL) { return COAP_RESPONSE_500; } /* first, update the link-set */ for (node = ctx_server->resources; node; node = node->next) { n = print_link(COAP_RESOURCE(node), resources + maxlen, RESOURCE_BUFLEN - maxlen); if (n <= 0) { /* error */ //debug("resource description too long, truncating\n"); resources[maxlen] = '\0'; break; } maxlen += n; if (node->next) /* check if another entry follows */ resources[maxlen++] = ','; else /* no next, terminate string */ resources[maxlen] = '\0'; } *finished = 1; switch (*mediatype) { case COAP_MEDIATYPE_ANY : case COAP_MEDIATYPE_APPLICATION_LINK_FORMAT : *mediatype = COAP_MEDIATYPE_APPLICATION_LINK_FORMAT; break; default : *buflen = 0; return COAP_RESPONSE_415; } if ( offset > maxlen ) { *buflen = 0; return COAP_RESPONSE_400; } else if ( offset + *buflen > maxlen ) *buflen = maxlen - offset; memcpy(buf, resources + offset, *buflen); *finished = offset + *buflen == maxlen; return COAP_RESPONSE_200; } #endif //register wellknown resource command error_t CoAPServer.registerWellknownCore() { #ifdef INCLUDE_WELLKNOWN coap_resource_t *r; if ( !(r = coap_malloc( sizeof(coap_resource_t) ))) { return FAIL; } r->uri = coap_new_uri((const unsigned char *) COAP_DEFAULT_URI_WELLKNOWN, sizeof(COAP_DEFAULT_URI_WELLKNOWN)); r->mediatype = COAP_MEDIATYPE_APPLICATION_LINK_FORMAT; r->dirty = 0; r->writable = 0; r->splitphase = 0; r->immediately = 1; r->data = resource_wellknown; coap_add_resource( ctx_server, r ); return SUCCESS; #else #warning "CoAP Resource .wellknown/core disabled. Add CFLAGS += -DINCLUDE_WELLKNOWN to Makefile, if you want it included." return FAIL; #endif } /////////////////// // register resources command error_t CoAPServer.registerResource(char uri[MAX_URI_LENGTH], unsigned int uri_length, unsigned char mediatype, unsigned int writable, unsigned int splitphase, unsigned int immediately) { coap_resource_t *r; coap_key_t k; if ( !(r = coap_malloc( sizeof(coap_resource_t) ))) return FAIL; r->uri = coap_new_uri((const unsigned char*) uri, uri_length); r->mediatype = mediatype; r->dirty = 0; // CHECK r->writable = writable; r->splitphase = splitphase; r->immediately = immediately; r->data = resource_splitphase; k = coap_add_resource( ctx_server, r ); if (k == COAP_INVALID_HASHKEY) { return FAIL; } return SUCCESS; } /////////////////// // splitphase resources int resource_splitphase(coap_uri_t *uri, coap_tid_t *id, unsigned char *mediatype, unsigned int offset, unsigned char *buf, unsigned int *buflen, int *finished, unsigned int method) { if ( method == COAP_REQUEST_GET) { return call ReadResource.get[get_key(uri->path.s, uri->path.length)](*id); } else if ( method == COAP_REQUEST_PUT) { return call WriteResource.put[get_key(uri->path.s, uri->path.length)](buf, *buflen, *id); } else { //when the method is neither GET nor PUT, i.e. POST & DELETE -> 405 return COAP_RESPONSE_405; } } event void LibCoapServer.read(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip6_metadata *meta) { printf("CoapUdpServer: LibCoapServer.read()\n"); coap_read(ctx_server, from, data, len, meta); coap_dispatch(ctx_server); } ////////////////////// // some standard PDU's coap_pdu_t *new_ack( coap_context_t *ctx, coap_queue_t *node ) { coap_pdu_t *pdu; //printf("** coap: new_ack\n"); GENERATE_PDU(pdu,COAP_MESSAGE_ACK,0,node->pdu->hdr->id,0); return pdu; } coap_pdu_t *new_rst( coap_context_t *ctx, coap_queue_t *node, unsigned int code ) { coap_pdu_t *pdu; GENERATE_PDU(pdu,COAP_MESSAGE_RST,code,node->pdu->hdr->id,1); return pdu; } coap_pdu_t *new_response( coap_context_t *ctx, coap_queue_t *node, unsigned int code ) { coap_pdu_t *pdu; //printf("** coap: new_response %i\n", code); GENERATE_PDU(pdu,COAP_MESSAGE_ACK,code,node->pdu->hdr->id,1); return pdu; } coap_pdu_t *new_asynresponse( coap_context_t *ctx, coap_queue_t *node) { coap_pdu_t *pdu; //printf("** coap: new_asynresponse\n"); GENERATE_PDU(pdu,COAP_MESSAGE_CON,COAP_RESPONSE_200,node->pdu->hdr->id,1); return pdu; } //add default data in case of empty uri path. (for testing purposes only) void add_contents( coap_pdu_t *pdu, unsigned char mediatype, unsigned int len, unsigned char *data ) { unsigned char ct = COAP_MEDIATYPE_APPLICATION_LINK_FORMAT; if (!pdu) return; /* add content-encoding */ coap_add_option(pdu, COAP_OPTION_CONTENT_TYPE, 1, &ct); coap_add_data(pdu, len, data); } coap_opt_t* coap_next_option(coap_pdu_t *pdu, coap_opt_t *opt) { coap_opt_t *next; if ( !pdu || !opt ) return NULL; next = (coap_opt_t *)( (unsigned char *)opt + COAP_OPT_SIZE(*opt) ); return (unsigned char *)next < pdu->data && COAP_OPT_DELTA(*next) == 0 ? next : NULL; } int mediatype_matches(coap_pdu_t *pdu, unsigned char mediatype) { coap_opt_t *ct; if ( mediatype == COAP_MEDIATYPE_ANY ) return 1; for (ct = coap_check_option(pdu, COAP_OPTION_CONTENT_TYPE); ct; ct = coap_next_option(pdu, ct)) { if ( *COAP_OPT_VALUE(*ct) == mediatype ) return 1; } return 0; } /////////////////// // GET method coap_pdu_t *handle_get(coap_context_t *ctx, coap_queue_t *node, void *data) { coap_pdu_t *pdu; coap_uri_t uri; coap_resource_t *resource; coap_opt_t *block, *ct; unsigned int blklen, blk; int code, finished = 1; unsigned char mediatype = COAP_MEDIATYPE_ANY; static unsigned char buf[COAP_MAX_PDU_SIZE]; if ( !coap_get_request_uri( node->pdu, &uri ) ) return NULL; //printf("** coap: handle_get: uri %s \n", uri.path.s); //send default test response if no URI is given if ( !uri.path.length ) { pdu = new_response(ctx, node, COAP_RESPONSE_200); if ( !pdu ) return NULL; add_contents( pdu, COAP_MEDIATYPE_TEXT_PLAIN, sizeof(INDEX) - 1, (unsigned char *)INDEX ); return pdu; } // any other resource if ( !(resource = coap_get_resource(ctx, &uri)) ) return new_response(ctx, node, COAP_RESPONSE_404); /* check if requested mediatypes match */ if ( coap_check_option(node->pdu, COAP_OPTION_CONTENT_TYPE) && !mediatype_matches(node->pdu, resource->mediatype) ) return new_response(ctx, node, COAP_RESPONSE_415); block = coap_check_option(node->pdu, COAP_OPTION_BLOCK); if ( block ) { blk = coap_decode_var_bytes(COAP_OPT_VALUE(*block), COAP_OPT_LENGTH(*block)); blklen = 16 << (blk & 0x07); } else { blklen = 512; // default block size blk = coap_fls(blklen >> 4) - 1; } /* invoke callback function to get data representation of requested resource */ if ( resource->data ) { if ( resource->mediatype == COAP_MEDIATYPE_ANY && (ct = coap_check_option(node->pdu, COAP_OPTION_CONTENT_TYPE)) ) { mediatype = *COAP_OPT_VALUE(*ct); } //printf("handle_get: data()\n"); code = resource->data(&uri, &(node->pdu->hdr->id), &mediatype, (blk & ~0x0f) << (blk & 0x07), buf, &blklen, &finished, COAP_REQUEST_GET); //printf("handle_get: data()~ %u %u\n", resource->splitphase, code); if (resource->splitphase) { if (code == COAP_SPLITPHASE) { //printf("handle_get: save()\n"); /* handle subscription */ #warning "FIXME: CoAP: subscriptions not yet implemented" //FIXME: SAVE before calling data()? coap_save_splitphase(ctx, node); // this is a split-phase resource, no PDU ready yet, created in getDone return NULL; } else { //printf("** handle_get: splitphase not successful\n"); return new_response(ctx, node, code); } } else { //not splitphase -> resource_wellknown pdu = new_response(ctx, node, code); if ( !pdu ) return NULL; // Add buffer value to the PDU if (!coap_add_data(pdu, blklen, buf)) { coap_delete_pdu(pdu); if ( !(pdu = new_response(ctx_server, node, COAP_RESPONSE_500)) ) { //printf("** coap: return PDU Null for 500 response\n"); } } return pdu; } } else { // no callback available return new_response(ctx, node, COAP_RESPONSE_500); } } default command int ReadResource.get[uint8_t uri_key](coap_tid_t id) { //printf("** coap: default (get not available for this resource)....... %i\n", uri_key); return FAIL; } event void ReadResource.getDone[uint8_t uri_key](error_t result, coap_tid_t id, uint8_t asyn_message, uint8_t* val_buf, size_t buflen) { coap_queue_t *node; coap_pdu_t *pdu; coap_opt_t *ct; //printf("** coap: getDone.... %i %u %u\n", uri_key, id, ntohs(id)); // assuming more than one entry is in splitphasequeue if (!(node = coap_find_transaction(ctx_server->splitphasequeue, id))) { //printf("** coap: getDone: node in splitphasequeue not found %u\n", id); return; } if (result != SUCCESS) { //printf("** coap: sensor retrival failed\n"); if ( !(pdu = new_response(ctx_server, node, COAP_RESPONSE_500)) ) { //printf("** coap: return PDU Null for COAP_RESPONSE_500 \n"); } //FIXME memcpy(val_buf, "Sensor not found", 16); buflen = 16; } else { //printf("** coap: sensor retrival successful\n"); if (asyn_message){ node->pdu->hdr->id = get_new_tid(); if ( !(pdu = new_asynresponse(ctx_server, node)) ) { //printf("** coap: return PDU Null for Asyn response\n"); } } else { //normal response if ( !(pdu = new_response(ctx_server, node, COAP_RESPONSE_200)) ) { //printf("** coap: return PDU Null for normal response\n"); } } } // Add content-encoding // TODO: this should come from the resource, not the request! ct = coap_check_option( node->pdu, COAP_OPTION_CONTENT_TYPE ); if ( ct ) { coap_add_option( pdu, COAP_OPTION_CONTENT_TYPE, COAP_OPT_LENGTH(*ct),COAP_OPT_VALUE(*ct) ); } // Add buffer value to the PDU if (!coap_add_data(pdu, buflen, val_buf)) { coap_delete_pdu(pdu); if ( !(pdu = new_response(ctx_server, node, COAP_RESPONSE_500)) ) { //printf("** coap: return PDU Null for 500 response\n"); } } // sending pdu printf("getDone(): send PDU %u\n", ntohs(node->pdu->hdr->id)); if (pdu && (call LibCoapServer.send(ctx_server, &node->remote, pdu, 1) == COAP_INVALID_TID )) { //printf("** coap:error sending response\n"); coap_delete_pdu(pdu); } /* remove node from splitphasequeue */ //printf("getDone(): remove %u\n", ntohs(id)); //coap_remove_transaction(&ctx_server->splitphasequeue, id); coap_extract_node (&ctx_server->splitphasequeue, node); node->next = NULL; coap_delete_node( node ); //printf("getDone(): delete node details kept for splitphase response\n"); } event void ReadResource.getDoneDeferred[uint8_t uri_key](coap_tid_t id) { coap_queue_t *node; coap_pdu_t *pdu; uint8_t reqtoken = 0; printf("getDoneDeferred ##\n"); // assuming more than one entry is in splitphasequeue if (!(node = coap_find_transaction(ctx_server->splitphasequeue, id))){ //printf("** coap: getPreACK: node in splitphasequeue not found, quit\n"); return; } //check for token if (!coap_check_option(node->pdu, COAP_OPTION_TOKEN)) { //printf("** coap: token required --> send COAP_RESPONSE_240\n"); reqtoken = 1; if ( !(pdu = new_response(ctx_server, node, COAP_RESPONSE_X_240)) ) { //printf("** coap: return PDU Null for COAP_RESPONSE_240 \n"); } } else { //printf("** coap: send PreACK\n"); if ( !(pdu = new_ack(ctx_server, node)) ) { //printf("** coap: return PDU Null for PreACK response\n"); } } // sending pdu if (pdu && (call LibCoapServer.send(ctx_server, &node->remote, pdu, 1) == COAP_INVALID_TID )) { //printf("** coap: error sending response\n"); } if (reqtoken) { /* remove node from splitphasequeue */ coap_extract_node (&ctx_server->splitphasequeue, node); node->next = NULL; coap_delete_node(node); printf("** coap: delete node deferred\n"); } else { printf("** coap: PreACK sent!\n"); } } /////////////////// // PUT method coap_pdu_t * handle_put(coap_context_t *ctx, coap_queue_t *node, void *data) { coap_pdu_t *pdu; coap_uri_t uri; coap_opt_t *tok; coap_resource_t *resource; unsigned char mediatype = COAP_MEDIATYPE_ANY; coap_opt_t *ct,*block; unsigned int blklen, blk; int code, finished = 1; unsigned int len; unsigned char *databuf; //printf("** coap: handle put\n"); if ( !coap_get_request_uri( node->pdu, &uri ) ) return NULL; //send default test response if ( !uri.path.length ) { pdu = new_response(ctx, node, COAP_RESPONSE_200); if ( !pdu ) return NULL; add_contents( pdu, COAP_MEDIATYPE_TEXT_PLAIN, sizeof(INDEX) - 1, (unsigned char *)INDEX ); return pdu; } /* we do not want to create the resource if not available */ if ( !(resource = coap_get_resource(ctx, &uri)) ) return new_response(ctx, node, COAP_RESPONSE_404); if (!resource->writable) return new_response(ctx, node, COAP_RESPONSE_400); //check and get payload length coap_get_data(node->pdu, &len, &databuf); if (len == 0) return new_response(ctx, node, COAP_RESPONSE_201); block = coap_check_option(node->pdu, COAP_OPTION_BLOCK); if ( block ) { blk = coap_decode_var_bytes(COAP_OPT_VALUE(*block), COAP_OPT_LENGTH(*block)); blklen = 16 << (blk & 0x07); } else { blklen = 512; /* default block size is set to 512 Bytes locally */ blk = coap_fls(blklen >> 4) - 1; } tok = coap_check_option(node->pdu, COAP_OPTION_CONTENT_TYPE); resource->mediatype = tok ? *COAP_OPT_VALUE(*tok) : COAP_MEDIATYPE_ANY; resource->dirty = 1; /* mark for notification of observers */ /* invoke callback function to put data representation of requested resource */ if ( resource->data ) { if ( resource->mediatype == COAP_MEDIATYPE_ANY && (ct = coap_check_option(node->pdu, COAP_OPTION_CONTENT_TYPE)) ) { mediatype = *COAP_OPT_VALUE(*ct); } code = resource->data(&uri, &(node->pdu->hdr->id), &mediatype, (blk & ~0x0f) << (blk & 0x07), node->pdu->data, &len, &finished, COAP_REQUEST_PUT); if (resource->splitphase) { if (code == COAP_SPLITPHASE) { //printf("** coap: splitphase resource, save context and node details, send async response \n"); coap_save_splitphase(ctx, node); return NULL; } else { return new_response(ctx, node, COAP_RESPONSE_400); } } else { //no splitphase, handle this case return new_response(ctx, node, COAP_RESPONSE_500); } } else { // no callback available return new_response(ctx, node, COAP_RESPONSE_500); } } default command int WriteResource.put[uint8_t uri_key](uint8_t* val, size_t buflen, coap_tid_t id) { //printf("** coap: default (put not available for this resource)....... %i\n", uri_key); return FAIL; } event void WriteResource.putDone[uint8_t uri_key](error_t result, coap_tid_t id, uint8_t asyn_message) { coap_queue_t *node; coap_pdu_t *pdu; coap_opt_t *ct; //printf("** coap: putDone.... %i\n", uri_key); // assuming more than one entry is in splitphasequeue if (!(node = coap_find_transaction(ctx_server->splitphasequeue, id))){ //printf("** coap: puttDone: node in splitphasequeue not found, quit\n"); return; } if (result){ //printf("** coap: sensor retrival failed\n"); if ( !(pdu = new_response(ctx_server, node, COAP_RESPONSE_500)) ) { // printf("** coap: return PDU Null for COAP_RESPONSE_500 \n"); } //FIXME //memcpy(val_buf, "Sensor not found", 16); //buflen = 16; } else { //printf("** coap: sensor retrival successful\n"); if (asyn_message){ node->pdu->hdr->id = get_new_tid(); if ( !(pdu = new_asynresponse(ctx_server, node)) ) { //printf("** coap: return PDU Null for Asyn response\n"); } } else { if ( !(pdu = new_response(ctx_server, node, COAP_RESPONSE_200)) ) { //printf("** coap: return PDU Null for normal response\n"); } } } // Add content-encoding ct = coap_check_option( node->pdu, COAP_OPTION_CONTENT_TYPE ); if ( ct ) { coap_add_option( pdu, COAP_OPTION_CONTENT_TYPE, COAP_OPT_LENGTH(*ct),COAP_OPT_VALUE(*ct) ); } // sending pdu if (pdu && (call LibCoapServer.send(ctx_server, &node->remote, pdu, 1) == COAP_INVALID_TID )) { //printf("** coap:asyn Res: error sending response\n"); coap_delete_pdu(pdu); } /* remove node from asynresqueue */ coap_extract_node (&ctx_server->splitphasequeue, node); node->next = NULL; coap_delete_node( node ); //printf("** coap: delete node details kept for Asyn response\n"); } event void WriteResource.putDoneDeferred[uint8_t uri_key](coap_tid_t id) { #warning "FIXME: CoAP: putDoneDeferred not yet implemented" } /////////////////// // POST method coap_pdu_t *handle_post(coap_context_t *ctx, coap_queue_t *node, void *data) { #warning "FIXME: CoAP: POST method not yet implemented" return NULL; } /////////////////// // DELETE method coap_pdu_t *handle_delete(coap_context_t *ctx, coap_queue_t *node, void *data) { #warning "FIXME: CoAP: DELETE method not yet implemented" return NULL; } ////////////// // message handler for incoming messages void message_handler(coap_context_t *ctx, coap_queue_t *node, void *data) { coap_pdu_t *pdu = NULL; coap_uri_t uri; coap_resource_t *resource; #ifndef NDEBUG coap_show_pdu( node->pdu ); #endif if ( node->pdu->hdr->version != COAP_DEFAULT_VERSION ) { //printf("dropped packet with unknown version %u\n", node->pdu->hdr->version); return; } //printf("message handler\n"); if ( !coap_get_request_uri( node->pdu, &uri ) ) return; resource = coap_get_resource(ctx, &uri); switch (node->pdu->hdr->code) { case COAP_REQUEST_GET: pdu = handle_get(ctx, node, data); if ( !pdu && node->pdu->hdr->type == COAP_MESSAGE_CON ){ if (resource && resource->splitphase) { break; } pdu = new_rst( ctx, node, COAP_RESPONSE_500 ); } break; case COAP_REQUEST_PUT: pdu = handle_put(ctx, node, data); if ( !pdu && node->pdu->hdr->type == COAP_MESSAGE_CON ){ if (resource && resource->splitphase) { break; } pdu = new_rst( ctx, node, COAP_RESPONSE_500 ); } break; case COAP_REQUEST_POST: pdu = handle_post(ctx, node, data); if ( !pdu && node->pdu->hdr->type == COAP_MESSAGE_CON ) pdu = new_response( ctx, node, COAP_RESPONSE_400 ); break; case COAP_REQUEST_DELETE: pdu = handle_delete(ctx, node, data); if ( !pdu && node->pdu->hdr->type == COAP_MESSAGE_CON ) pdu = new_response( ctx, node, COAP_RESPONSE_400 ); break; default: if ( node->pdu->hdr->type == COAP_MESSAGE_CON ) { if ( node->pdu->hdr->code >= COAP_RESPONSE_100 ) pdu = new_rst( ctx, node, COAP_RESPONSE_500 ); else { pdu = new_rst( ctx, node, COAP_RESPONSE_405 ); } } } if (pdu && (call LibCoapServer.send(ctx, &node->remote, pdu, 1) == COAP_INVALID_TID )) { //printf("message_handler: error sending response"); coap_delete_pdu(pdu); } } ////////////// // save details for splitphase operation for later int coap_save_splitphase(coap_context_t *ctx, coap_queue_t *node) { coap_queue_t *new_node; coap_opt_t *opt; printf("coap_save_split %u\n", ntohs(node->pdu->hdr->id)); new_node = coap_new_node(); if ( !new_node ) { printf("coap_split ret 1\n"); return -1; } new_node->pdu = coap_new_pdu(); if ( !new_node->pdu ) { printf("coap_split ret 2 del_node\n"); coap_delete_node( new_node ); return -1; } memcpy( &new_node->remote, &node->remote, sizeof( struct sockaddr_in6 ) ); printf("** coap: saving ctx and node details to send splitphase later\n"); /* "parse" received PDU by filling pdu structure */ memcpy(new_node->pdu->hdr, node->pdu->hdr, node->pdu->length ); new_node->pdu->length = node->pdu->length; /* finally calculate beginning of data block */ options_end( new_node->pdu, &opt ); if ( (unsigned char *)new_node->pdu->hdr + new_node->pdu->length < (unsigned char *)opt ) new_node->pdu->data = (unsigned char *)new_node->pdu->hdr + new_node->pdu->length; else new_node->pdu->data = (unsigned char *)opt; /* and add new node to splitphasequeue */ //printf("coap_split ins id %u\n", ntohs(new_node->pdu->hdr->id)); coap_insert_node( &ctx->splitphasequeue, new_node, order_transaction_id ); #ifndef NDEBUG coap_show_pdu( new_node->pdu ); #endif return 0; } } tinyos-2.1.2+dfsg/tos/lib/net/coap/LibCoapAdapterC.nc000066400000000000000000000041621207233610700223060ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ configuration LibCoapAdapterC { #ifdef COAP_SERVER_ENABLED provides interface LibCoAP as LibCoapServer; uses interface UDP as UDPServer; #endif #ifdef COAP_CLIENT_ENABLED provides interface LibCoAP as LibCoapClient; uses interface UDP as UDPClient; #endif } implementation { components LibCoapAdapterP; #ifdef COAP_SERVER_ENABLED LibCoapServer = LibCoapAdapterP.LibCoapServer; UDPServer = LibCoapAdapterP.UDPServer; #endif #ifdef COAP_CLIENT_ENABLED LibCoapClient = LibCoapAdapterP.LibCoapClient; UDPClient = LibCoapAdapterP.UDPClient; #endif } tinyos-2.1.2+dfsg/tos/lib/net/coap/LibCoapAdapterP.nc000066400000000000000000000101671207233610700223250ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "blip_printf.h" #include #include module LibCoapAdapterP { #ifdef COAP_SERVER_ENABLED provides interface LibCoAP as LibCoapServer; uses interface UDP as UDPServer; #endif #ifdef COAP_CLIENT_ENABLED provides interface LibCoAP as LibCoapClient; uses interface UDP as UDPClient; #endif } implementation { // might get called in error cases from libcoap's net.c -> spontaneous. coap_tid_t coap_send_impl(coap_context_t *context, struct sockaddr_in6 *dst, coap_pdu_t *pdu, int free_pdu ) @C() @spontaneous() { coap_tid_t tid; #ifndef COAP_SERVER_ENABLED #ifndef COAP_CLIENT_ENABLED #error "CoAP without server and client?" #endif #endif if ( !context || !dst || !pdu ) return COAP_INVALID_TID; #ifdef COAP_CLIENT_ENABLED if (context->tinyos_port == (int) COAP_CLIENT_PORT) call UDPClient.sendto(dst, pdu->hdr, pdu->length); #endif #ifdef COAP_SERVER_ENABLED if (context->tinyos_port == (int) COAP_SERVER_PORT) call UDPServer.sendto(dst, pdu->hdr, pdu->length); #endif tid = pdu->hdr->id; if ( free_pdu ) coap_delete_pdu( pdu ); return ntohs(tid); } #ifdef COAP_SERVER_ENABLED void libcoap_server_read(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip6_metadata *meta) { signal LibCoapServer.read(from, data, len, meta); } event void UDPServer.recvfrom(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip6_metadata *meta) { printf( "LibCoapAdapter UDPServer.recvfrom()\n"); libcoap_server_read(from, data, len, meta); } command coap_tid_t LibCoapServer.send(coap_context_t *context, struct sockaddr_in6 *dst, coap_pdu_t *pdu, int free_pdu) { return coap_send_impl(context, dst, pdu, free_pdu); } command error_t LibCoapServer.bind(uint16_t port) { return call UDPServer.bind(port); } #endif #ifdef COAP_CLIENT_ENABLED void libcoap_client_read(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip6_metadata *meta) { signal LibCoapClient.read(from, data, len, meta); } event void UDPClient.recvfrom(struct sockaddr_in6 *from, void *data, uint16_t len, struct ip6_metadata *meta) { //printf("LibCoapAdapter UDPClient.recvfrom()\n"); libcoap_client_read(from, data, len, meta); } command coap_tid_t LibCoapClient.send(coap_context_t *context, struct sockaddr_in6 *dst, coap_pdu_t *pdu, int free_pdu) { return coap_send_impl(context, dst, pdu, free_pdu); } command error_t LibCoapClient.bind(uint16_t port) { return call UDPClient.bind(port); } #endif } tinyos-2.1.2+dfsg/tos/lib/net/coap/tinyos_net.c000066400000000000000000000100431207233610700214010ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include int coap_read(coap_context_t *ctx, struct sockaddr_in6 *src, void *buf, uint16_t bytes_read, struct ip6_metadata *meta) { coap_queue_t *node; coap_opt_t *opt; if ( bytes_read < 0 || bytes_read>=COAP_MAX_PDU_SIZE) { return -1; } if ( bytes_read < sizeof(coap_hdr_t) || ((coap_hdr_t *)buf)->version != COAP_DEFAULT_VERSION ) { #ifndef NDEBUG //fprintf(stderr, "coap_read: discarded invalid frame\n" ); #endif return -1; } node = coap_new_node(); if ( !node ) return -1; node->pdu = coap_new_pdu(); if ( !node->pdu ) { coap_delete_node( node ); return -1; } /*printf("** coap: coap_read pointers %p %p, %p %p\n", &node->remote, node->remote, src, *src, sizeof(src), sizeof(*src));*/ memcpy( &node->remote, src, sizeof( *src ) ); /* "parse" received PDU by filling pdu structure */ memcpy( node->pdu->hdr, buf, bytes_read ); node->pdu->length = bytes_read; /* finally calculate beginning of data block */ options_end( node->pdu, &opt ); if ( (unsigned char *)node->pdu->hdr + node->pdu->length < (unsigned char *)opt ) node->pdu->data = (unsigned char *)node->pdu->hdr + node->pdu->length; else node->pdu->data = (unsigned char *)opt; /* and add new node to receive queue */ coap_insert_node( &ctx->recvqueue, node, order_transaction_id ); #ifndef NDEBUG if ( inet_ntop(src.sin6_family, &src.sin6_addr, addr, INET6_ADDRSTRLEN) == 0 ) { //perror("coap_read: inet_ntop"); } else { printf( "** received from [%s]:%d:\n ",addr,ntohs(src.sin6_port)); } coap_show_pdu( node->pdu ); #endif return 0; } //CLIENT: int order_opts(void *a, void *b) { if (!a || !b) return a < b ? -1 : 1; if (COAP_OPTION_KEY(*(coap_option *)a) < COAP_OPTION_KEY(*(coap_option *)b)) return -1; return COAP_OPTION_KEY(*(coap_option *)a) == COAP_OPTION_KEY(*(coap_option *)b); } //CLIENT: coap_list_t * new_option_node(unsigned short key, unsigned int length, char *data) { coap_option *option; coap_list_t *node; option = coap_malloc(sizeof(coap_option) + length); if ( !option ) goto error; COAP_OPTION_KEY(*option) = key; COAP_OPTION_LENGTH(*option) = length; memcpy(COAP_OPTION_DATA(*option), data, length); /* we can pass NULL here as delete function since option is released automatically */ node = coap_new_listnode(option, NULL); if ( node ) return node; error: //perror("new_option_node: malloc"); coap_free( option ); return NULL; } tinyos-2.1.2+dfsg/tos/lib/net/coap/tinyos_net.h000066400000000000000000000050441207233610700214130ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Bremen, TZI * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _COAP_NET_TINYOS_H_ #define _COAP_NET_TINYOS_H_ #include #include #define options_start(p) ((coap_opt_t *) ( (unsigned char *)p->hdr + sizeof ( coap_hdr_t ) )) #define options_end(p, opt) { \ unsigned char opt_code = 0, cnt; \ *opt = options_start( node->pdu ); \ for ( cnt = (p)->hdr->optcnt; cnt; --cnt ) { \ opt_code += COAP_OPT_DELTA(**opt); \ *opt = (coap_opt_t *)( (unsigned char *)(*opt) + COAP_OPT_SIZE(**opt)); \ } \ } //CLIENT: int order_opts(void *a, void *b); coap_list_t* new_option_node(unsigned short key, unsigned int length, char *data); /** * Reads data from the network and tries to parse as CoAP PDU. On * success, 0 is returned and a new node with the parsed PDU is added * to the receive queue in the specified context object. */ int coap_read(coap_context_t *ctx, struct sockaddr_in6 *src, void *buf, uint16_t bytes_read, struct ip6_metadata *meta); #endif tinyos-2.1.2+dfsg/tos/lib/net/ctp/000077500000000000000000000000001207233610700167105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/ctp/Collection.h000066400000000000000000000037101207233610700211550ustar00rootroot00000000000000/* $Id: Collection.h,v 1.5 2010-06-29 22:07:49 scipio Exp $ */ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * @author Rodrigo Fonseca * @date $Date: 2010-06-29 22:07:49 $ */ #ifndef COLLECTION_H #define COLLECTION_H enum { AM_COLLECTION_DATA = 20, AM_COLLECTION_CONTROL = 21, AM_COLLECTION_DEBUG = 22, }; typedef uint8_t collection_id_t; typedef nx_uint8_t nx_collection_id_t; #endif tinyos-2.1.2+dfsg/tos/lib/net/ctp/CollectionC.nc000066400000000000000000000051651207233610700214370ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Ctp.h" /** * A data collection service that uses a tree routing protocol * to deliver data to collection roots, following TEP 119. * * @author Rodrigo Fonseca * @author Omprakash Gnawali * @author Kyle Jamieson * @author Philip Levis */ configuration CollectionC { provides { interface StdControl; interface Send[uint8_t client]; interface Receive[collection_id_t id]; interface Receive as Snoop[collection_id_t]; interface Intercept[collection_id_t id]; interface Packet; interface CollectionPacket; interface CtpPacket; interface CtpInfo; interface CtpCongestion; interface RootControl; } uses { interface CollectionId[uint8_t client]; interface CollectionDebug; } } implementation { components CtpP; StdControl = CtpP; Send = CtpP; Receive = CtpP.Receive; Snoop = CtpP.Snoop; Intercept = CtpP; Packet = CtpP; CollectionPacket = CtpP; CtpPacket = CtpP; CtpInfo = CtpP; CtpCongestion = CtpP; RootControl = CtpP; CollectionId = CtpP; CollectionDebug = CtpP; } tinyos-2.1.2+dfsg/tos/lib/net/ctp/CollectionSenderC.nc000066400000000000000000000037771207233610700226070ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The virtualized collection sender abstraction. * * @author Kyle Jamieson * @author Philip Levis * @date April 25 2006 * @see TinyOS Net2-WG */ #include generic configuration CollectionSenderC(collection_id_t collectid) { provides { interface Send; interface Packet; } } implementation { components new CollectionSenderP(collectid, unique(UQ_CTP_CLIENT)); Send = CollectionSenderP; Packet = CollectionSenderP; } tinyos-2.1.2+dfsg/tos/lib/net/ctp/CollectionSenderP.nc000066400000000000000000000037071207233610700226150ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Collection.h" generic configuration CollectionSenderP(collection_id_t collectid, uint8_t clientid) { provides { interface Send; interface Packet; } } implementation { components CollectionC as Collector; components new CollectionIdP(collectid); Send = Collector.Send[clientid]; Packet = Collector.Packet; Collector.CollectionId[clientid] -> CollectionIdP; } tinyos-2.1.2+dfsg/tos/lib/net/ctp/CompareBit.nc000066400000000000000000000046531207233610700212670ustar00rootroot00000000000000/* $Id: CompareBit.nc,v 1.4 2010-06-29 22:07:49 scipio Exp $ */ /* * Copyright (c) 2006 University of Southern California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** Link estimator asks the routing engine if this entry * should be inserted into the neighbor table if the * white bit on a link is set but there is no room for the link * on the link table. The return value is the "pin bit" - if true * insert into the neighbor table. In the reference implementation * the router will return true if the path through the source * will be better than a path through at least one current neighbor. @ author Omprakash Gnawali @ Created: September 16, 2006 @date $Date: 2010-06-29 22:07:49 $ */ interface CompareBit { /* should the source of this message be inserted into the neighbor table? */ /* expect to be called only for links with the white bit set */ event bool shouldInsert(message_t * ONE msg, void* COUNT_NOK(len) payload, uint8_t len); } tinyos-2.1.2+dfsg/tos/lib/net/ctp/Ctp.h000066400000000000000000000055731207233610700176210ustar00rootroot00000000000000/* $Id: Ctp.h,v 1.7 2009-08-10 23:50:06 scipio Exp $ */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Header file that declares the AM types, message formats, and * constants for the TinyOS reference implementation of the * Collection Tree Protocol (CTP), as documented in TEP 123. * * @author Philip Levis * @date $Date: 2009-08-10 23:50:06 $ */ #ifndef CTP_H #define CTP_H #include #include #define UQ_CTP_CLIENT "CtpSenderC.CollectId" enum { // AM types: AM_CTP_ROUTING = 0x70, AM_CTP_DATA = 0x71, AM_CTP_DEBUG = 0x72, // CTP Options: CTP_OPT_PULL = 0x80, // TEP 123: P field CTP_OPT_ECN = 0x40, // TEP 123: C field CTP_OPT_ALL = 0xff }; typedef nx_uint8_t nx_ctp_options_t; typedef uint8_t ctp_options_t; typedef nx_struct { nx_ctp_options_t options; nx_uint8_t thl; nx_uint16_t etx; nx_am_addr_t origin; nx_uint8_t originSeqNo; nx_collection_id_t type; nx_uint8_t (COUNT(0) data)[0]; // Deputy place-holder, field will probably be removed when we Deputize Ctp } ctp_data_header_t; typedef nx_struct { nx_ctp_options_t options; nx_am_addr_t parent; nx_uint16_t etx; nx_uint8_t (COUNT(0) data)[0]; // Deputy place-holder, field will probably be removed when we Deputize Ctp } ctp_routing_header_t; #endif tinyos-2.1.2+dfsg/tos/lib/net/ctp/CtpCongestion.nc000066400000000000000000000012021207233610700220040ustar00rootroot00000000000000interface CtpCongestion { /* Returns the current state of congestion from the provider. Ctp may be * congested because its internal queue is congested or because the receive * client called isCongested with TRUE. */ command bool isCongested(); /* Idempotent call to let the provider know whether a client is congested. * If not previously congested, Ctp will take measures to slow down. * Ctp has an internal congested condition as well. The result of isCongested * is a logical OR with the parameter set here and the internal congestion. */ command void setClientCongested(bool congested); } tinyos-2.1.2+dfsg/tos/lib/net/ctp/CtpDebug.nc000066400000000000000000000070611207233610700207330ustar00rootroot00000000000000/* $Id: CtpDebug.nc,v 1.5 2010-06-29 22:07:49 scipio Exp $*/ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * The CollectionDebug is an interface for sending debugging events to * a logging infrastructure. An implementer can choose to send the event * information to different destinations. Primary examples can include: *
        *
      • logging to the UART, in case of a testbed of network-connected * nodes; *
      • logging to flash, if the logs are to be retrieved later *
      • logging to the standard output, in the case of TOSSIM. *
      * * The interface does not specify in what format the log is to be produced, * or if other information, like timestamps, should be added, and this is * up to the implementer. * * Some commands are generic, like Event, EventSimple, and EventDbg, while others * are for more specific events related to collection, like EventRoute and EventMsg. * * @author Rodrigo Fonseca * @author Kyle Jamieson * @date $Date: 2010-06-29 22:07:49 $ */ interface CollectionDebug { /* Log the occurrence of an event of type type */ command error_t logEvent(uint8_t type); /* Log the occurrence of an event and a single parameter */ command error_t logEventSimple(uint8_t type, uint16_t arg); /* Log the occurrence of an event and 3 16bit parameters */ command error_t logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3); /* Log the occurrence of an event related to forwarding a message. * This is intended to allow following the same message as it goes from one * hop to the next */ command error_t logEventMsg(uint8_t type, uint16_t msg, am_addr_t origin, am_addr_t node); /* Log the occurrence of an event related to a route update message, * such as a node receiving a route, updating its own route information, * or looking at a particular entry in its routing table. */ command error_t logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t metric); } tinyos-2.1.2+dfsg/tos/lib/net/ctp/CtpDebugMsg.h000066400000000000000000000055541207233610700212360ustar00rootroot00000000000000#ifndef _COLLECTION_UART_MSG #define _COLLECTION_UART_MSG #include "AM.h" //Comment format -> :meaning:args enum { NET_C_DEBUG_STARTED = 0xDE, NET_C_FE_MSG_POOL_EMPTY = 0x10, //::no args NET_C_FE_SEND_QUEUE_FULL = 0x11, //::no args NET_C_FE_NO_ROUTE = 0x12, //::no args NET_C_FE_SUBSEND_OFF = 0x13, NET_C_FE_SUBSEND_BUSY = 0x14, NET_C_FE_BAD_SENDDONE = 0x15, NET_C_FE_QENTRY_POOL_EMPTY = 0x16, NET_C_FE_SUBSEND_SIZE = 0x17, NET_C_FE_LOOP_DETECTED = 0x18, NET_C_FE_SEND_BUSY = 0x19, NET_C_FE_SENDQUEUE_EMPTY = 0x50, NET_C_FE_PUT_MSGPOOL_ERR = 0x51, NET_C_FE_PUT_QEPOOL_ERR = 0x52, NET_C_FE_GET_MSGPOOL_ERR = 0x53, NET_C_FE_GET_QEPOOL_ERR = 0x54, NET_C_FE_QUEUE_SIZE=0x55, NET_C_FE_SENT_MSG = 0x20, //:app. send :msg uid, origin, next_hop NET_C_FE_RCV_MSG = 0x21, //:next hop receive:msg uid, origin, last_hop NET_C_FE_FWD_MSG = 0x22, //:fwd msg :msg uid, origin, next_hop NET_C_FE_DST_MSG = 0x23, //:base app. recv :msg_uid, origin, last_hop NET_C_FE_SENDDONE_FAIL = 0x24, NET_C_FE_SENDDONE_WAITACK = 0x25, NET_C_FE_SENDDONE_FAIL_ACK_SEND = 0x26, NET_C_FE_SENDDONE_FAIL_ACK_FWD = 0x27, NET_C_FE_DUPLICATE_CACHE = 0x28, //dropped duplicate packet seen in cache NET_C_FE_DUPLICATE_QUEUE = 0x29, //dropped duplicate packet seen in queue NET_C_FE_DUPLICATE_CACHE_AT_SEND = 0x2A, //dropped duplicate packet seen in cache NET_C_FE_CONGESTION_SENDWAIT = 0x2B, // sendTask deferring for congested parent NET_C_FE_CONGESTION_BEGIN = 0x2C, // NET_C_FE_CONGESTION_END = 0x2D, // congestion over: reason is arg; // arg=1 => overheard parent's // ECN cleared. // arg=0 => timeout. NET_C_FE_CONGESTED = 0x2E, NET_C_TREE_NO_ROUTE = 0x30, //: :no args NET_C_TREE_NEW_PARENT = 0x31, //: :parent_id, hopcount, metric NET_C_TREE_ROUTE_INFO = 0x32, //:periodic:parent_id, hopcount, metric NET_C_TREE_SENT_BEACON = 0x33, NET_C_TREE_RCV_BEACON = 0x34, NET_C_DBG_1 = 0x40, //:any :uint16_t a NET_C_DBG_2 = 0x41, //:any :uint16_t a, b, c NET_C_DBG_3 = 0x42, //:any :uint16_t a, b, c }; typedef nx_struct CollectionDebugMsg { nx_uint8_t type; nx_union { nx_uint16_t arg; nx_struct { nx_uint16_t msg_uid; nx_am_addr_t origin; nx_am_addr_t other_node; } msg; nx_struct { nx_am_addr_t parent; nx_uint8_t hopcount; nx_uint16_t metric; } route_info; nx_struct { nx_uint16_t a; nx_uint16_t b; nx_uint16_t c; } dbg; } data; nx_uint16_t seqno; } CollectionDebugMsg; #endif tinyos-2.1.2+dfsg/tos/lib/net/ctp/CtpForwardingEngine.h000066400000000000000000000074511207233610700227670ustar00rootroot00000000000000#ifndef FORWARDING_ENGINE_H #define FORWARDING_ENGINE_H /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include /** * Author: Philip Levis * Author: Kyle Jamieson * Author: Omprakash Gnawali * Author: Rodrigo Fonseca */ /* * These timings are in milliseconds, and are used by * ForwardingEngineP. Each pair of values represents a range of * [OFFSET - (OFFSET + WINDOW)]. The ForwardingEngine uses these * values to determine when to send the next packet after an * event. FAIL refers to a send fail (an error from the radio below), * NOACK refers to the previous packet not being acknowledged, * OK refers to an acknowledged packet, and LOOPY refers to when * a loop is detected. * * These timings are defined in terms of packet times. Currently, * two values are defined: for CC2420-based platforms (4ms) and * all other platfoms (32ms). */ enum { #if PLATFORM_MICAZ || PLATFORM_TELOSA || PLATFORM_TELOSB || PLATFORM_TMOTE || PLATFORM_INTELMOTE2 || PLATFORM_SHIMMER || PLATFORM_IRIS FORWARD_PACKET_TIME = 7, #else FORWARD_PACKET_TIME = 32, #endif }; enum { SENDDONE_OK_OFFSET = FORWARD_PACKET_TIME, SENDDONE_OK_WINDOW = FORWARD_PACKET_TIME, SENDDONE_NOACK_OFFSET = FORWARD_PACKET_TIME, SENDDONE_NOACK_WINDOW = FORWARD_PACKET_TIME, SENDDONE_FAIL_OFFSET = FORWARD_PACKET_TIME << 2, SENDDONE_FAIL_WINDOW = SENDDONE_FAIL_OFFSET, LOOPY_OFFSET = FORWARD_PACKET_TIME << 2, LOOPY_WINDOW = LOOPY_OFFSET, CONGESTED_WAIT_OFFSET = FORWARD_PACKET_TIME << 2, CONGESTED_WAIT_WINDOW = CONGESTED_WAIT_OFFSET, NO_ROUTE_RETRY = 10000 }; /* * The number of times the ForwardingEngine will try to * transmit a packet before giving up if the link layer * supports acknowledgments. If the link layer does * not support acknowledgments it sends the packet once. */ enum { MAX_RETRIES = 30 }; /* * An element in the ForwardingEngine send queue. * The client field keeps track of which send client * submitted the packet or if the packet is being forwarded * from another node (client == 255). Retries keeps track * of how many times the packet has been transmitted. */ typedef struct { message_t * ONE_NOK msg; uint8_t client; uint8_t retries; } fe_queue_entry_t; #endif tinyos-2.1.2+dfsg/tos/lib/net/ctp/CtpForwardingEngineP.nc000066400000000000000000001047741207233610700232660ustar00rootroot00000000000000/* $Id: CtpForwardingEngineP.nc,v 1.24 2010-04-11 23:27:30 gnawali Exp $ */ /* * Copyright (c) 2008-9 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This component contains the forwarding path of CTP Noe, the * standard CTP implementation packaged with TinyOS 2.x. The CTP * specification can be found in TEP 123. The paper entitled * "Collection Tree Protocol," by Omprakash Gnawali et al., in SenSys * 2009, describes the implementation and provides detailed * performance results of CTP Noe.

      * *

      The CTP ForwardingEngine is responsible for queueing and * scheduling outgoing packets. It maintains a pool of forwarding * messages and a packet send queue. A ForwardingEngine with a * forwarding message pool of size F and C * CollectionSenderC clients has a send queue of size F + * C. This implementation several configuration constants, which * can be found in ForwardingEngine.h.

      * *

      Packets in the send queue are sent in FIFO order, with * head-of-line blocking. Because this is a tree collection protocol, * all packets are going to the same destination, and so the * ForwardingEngine does not distinguish packets from one * another. Packets from CollectionSenderC clients are sent * identically to forwarded packets: only their buffer handling is * different.

      * *

      If ForwardingEngine is on top of a link layer that supports * synchronous acknowledgments, it enables them and retransmits packets * when they are not acked. It transmits a packet up to MAX_RETRIES times * before giving up and dropping the packet. MAX_RETRIES is typically a * large number (e.g., >20), as this implementation assumes there is * link layer feedback on failed packets, such that link costs will go * up and cause the routing layer to pick a next hop. If the underlying * link layer does not support acknowledgments, ForwardingEngine sends * a packet only once.

      * *

      The ForwardingEngine detects routing loops and tries to correct * them. Routing is in terms of a cost gradient, where the collection * root has a cost of zero and a node's cost is the cost of its next * hop plus the cost of the link to that next hop. If there are no * loops, then this gradient value decreases monotonically along a * route. When the ForwardingEngine sends a packet to the next hop, * it puts the local gradient value in the packet header. If a node * receives a packet to forward whose gradient value is less than its * own, then the gradient is not monotonically decreasing and there * may be a routing loop. When the ForwardingEngine receives such a * packet, it tells the RoutingEngine to advertise its gradient value * soon, with the hope that the advertisement will update the node * who just sent a packet and break the loop. It also pauses the * before the next packet transmission, in hopes of giving the * routing layer's packet a priority.

      * *

      ForwardingEngine times its packet transmissions. It * differentiates between four transmission cases: forwarding, * success, ack failure, and loop detection. In each case, the * ForwardingEngine waits a randomized period of time before sending * the next packet. This approach assumes that the network is * operating at low utilization; its goal is to prevent correlated * traffic -- such as nodes along a route forwarding packets -- from * interfering with itself.

      * *

      While this implementation can work on top of a variety of link * estimators, it is designed to work with a 4-bit link estimator * (4B). Details on 4B can be found in the HotNets paper "Four Bit * Link Estimation" by Rodrigo Fonseca et al. The forwarder provides * the "ack" bit for each sent packet, telling the estimator whether * the packet was acknowledged.

      * * @author Philip Levis * @author Kyle Jamieson * @date $Date: 2010-04-11 23:27:30 $ */ #include #include generic module CtpForwardingEngineP() { provides { interface Init; interface StdControl; interface Send[uint8_t client]; interface Receive[collection_id_t id]; interface Receive as Snoop[collection_id_t id]; interface Intercept[collection_id_t id]; interface Packet; interface CollectionPacket; interface CtpPacket; interface CtpCongestion; } uses { // These five interfaces are used in the forwarding path // SubSend is for sending packets // PacketAcknowledgements is for enabling layer 2 acknowledgments // RetxmitTimer is for timing packet sends for improved performance // LinkEstimator is for providing the ack bit to a link estimator interface AMSend as SubSend; interface PacketAcknowledgements; interface Timer as RetxmitTimer; interface LinkEstimator; interface UnicastNameFreeRouting; interface Packet as SubPacket; // These four data structures are used to manage packets to forward. // SendQueue and QEntryPool are the forwarding queue. // MessagePool is the buffer pool for messages to forward. // SentCache is for suppressing duplicate packet transmissions. interface Queue as SendQueue; interface Pool as QEntryPool; interface Pool as MessagePool; interface Cache as SentCache; interface Receive as SubReceive; interface Receive as SubSnoop; interface CtpInfo; interface RootControl; interface CollectionId[uint8_t client]; interface AMPacket; interface Leds; interface Random; // This implementation has extensive debugging instrumentation. // Wiring up the CollectionDebug interface provides information // on important events, such as transmissions, receptions, // and cache checks. The TinyOS release includes scripts for // parsing these messages. interface CollectionDebug; // The ForwardingEngine monitors whether the underlying // radio is on or not in order to start/stop forwarding // as appropriate. interface SplitControl as RadioControl; } } implementation { /* Helper functions to start the given timer with a random number * masked by the given mask and added to the given offset. */ static void startRetxmitTimer(uint16_t mask, uint16_t offset); void clearState(uint8_t state); bool hasState(uint8_t state); void setState(uint8_t state); // CTP state variables. enum { QUEUE_CONGESTED = 0x1, // Need to set C bit? ROUTING_ON = 0x2, // Forwarding running? RADIO_ON = 0x4, // Radio is on? ACK_PENDING = 0x8, // Have an ACK pending? SENDING = 0x10 // Am sending a packet? }; // Start with all states false uint8_t forwardingState = 0; /* Network-level sequence number, so that receivers * can distinguish retransmissions from different packets. */ uint8_t seqno; enum { CLIENT_COUNT = uniqueCount(UQ_CTP_CLIENT) }; /* Each sending client has its own reserved queue entry. If the client has a packet pending, its queue entry is in the queue, and its clientPtr is NULL. If the client is idle, its queue entry is pointed to by clientPtrs. */ fe_queue_entry_t clientEntries[CLIENT_COUNT]; fe_queue_entry_t* ONE_NOK clientPtrs[CLIENT_COUNT]; /* The loopback message is for when a collection roots calls Send.send. Since Send passes a pointer but Receive allows buffer swaps, the forwarder copies the sent packet into the loopbackMsgPtr and performs a buffer swap with it. See sendTask(). */ message_t loopbackMsg; message_t* ONE_NOK loopbackMsgPtr; command error_t Init.init() { int i; for (i = 0; i < CLIENT_COUNT; i++) { clientPtrs[i] = clientEntries + i; dbg("Forwarder", "clientPtrs[%hhu] = %p\n", i, clientPtrs[i]); } loopbackMsgPtr = &loopbackMsg; seqno = 0; return SUCCESS; } command error_t StdControl.start() { setState(ROUTING_ON); return SUCCESS; } command error_t StdControl.stop() { clearState(ROUTING_ON); return SUCCESS; } /* sendTask is where the first phase of all send logic * exists (the second phase is in SubSend.sendDone()). */ task void sendTask(); /* ForwardingEngine keeps track of whether the underlying radio is powered on. If not, it enqueues packets; when it turns on, it then starts sending packets. */ event void RadioControl.startDone(error_t err) { if (err == SUCCESS) { setState(RADIO_ON); if (!call SendQueue.empty()) { dbg("FHangBug", "%s posted sendTask.\n", __FUNCTION__); post sendTask(); } } } static void startRetxmitTimer(uint16_t window, uint16_t offset) { uint16_t r = call Random.rand16(); r %= window; r += offset; call RetxmitTimer.startOneShot(r); dbg("Forwarder", "Rexmit timer will fire in %hu ms\n", r); } /* * If the ForwardingEngine has stopped sending packets because * these has been no route, then as soon as one is found, start * sending packets. */ event void UnicastNameFreeRouting.routeFound() { dbg("FHangBug", "%s posted sendTask.\n", __FUNCTION__); post sendTask(); } event void UnicastNameFreeRouting.noRoute() { // Depend on the sendTask to take care of this case; // if there is no route the component will just resume // operation on the routeFound event } event void RadioControl.stopDone(error_t err) { if (err == SUCCESS) { clearState(RADIO_ON); } } ctp_data_header_t* getHeader(message_t* m) { return (ctp_data_header_t*)call SubPacket.getPayload(m, sizeof(ctp_data_header_t)); } /* * The send call from a client. Return EBUSY if the client is busy * (clientPtrs is NULL), otherwise configure its queue entry * and put it in the send queue. If the ForwardingEngine is not * already sending packets (the RetxmitTimer isn't running), post * sendTask. It could be that the engine is running and sendTask * has already been posted, but the post-once semantics make this * not matter. What's important is that you don't post sendTask * if the retransmit timer is running; this would circumvent the * timer and send a packet before it fires. */ command error_t Send.send[uint8_t client](message_t* msg, uint8_t len) { ctp_data_header_t* hdr; fe_queue_entry_t *qe; dbg("Forwarder", "%s: sending packet from client %hhu: %x, len %hhu\n", __FUNCTION__, client, msg, len); if (!hasState(ROUTING_ON)) {return EOFF;} if (len > call Send.maxPayloadLength[client]()) {return ESIZE;} call Packet.setPayloadLength(msg, len); hdr = getHeader(msg); hdr->origin = TOS_NODE_ID; hdr->originSeqNo = seqno++; hdr->type = call CollectionId.fetch[client](); hdr->thl = 0; if (clientPtrs[client] == NULL) { dbg("Forwarder", "%s: send failed as client is busy.\n", __FUNCTION__); return EBUSY; } qe = clientPtrs[client]; qe->msg = msg; qe->client = client; qe->retries = MAX_RETRIES; dbg("Forwarder", "%s: queue entry for %hhu is %hhu deep\n", __FUNCTION__, client, call SendQueue.size()); if (call SendQueue.enqueue(qe) == SUCCESS) { if (hasState(RADIO_ON) && !hasState(SENDING)) { dbg("FHangBug", "%s posted sendTask.\n", __FUNCTION__); post sendTask(); } clientPtrs[client] = NULL; return SUCCESS; } else { dbg("Forwarder", "%s: send failed as packet could not be enqueued.\n", __FUNCTION__); // send a debug message to the uart call CollectionDebug.logEvent(NET_C_FE_SEND_QUEUE_FULL); // Return the pool entry, as it's not for me... return FAIL; } } command error_t Send.cancel[uint8_t client](message_t* msg) { // cancel not implemented. will require being able // to pull entries out of the queue. return FAIL; } command uint8_t Send.maxPayloadLength[uint8_t client]() { return call Packet.maxPayloadLength(); } command void* Send.getPayload[uint8_t client](message_t* msg, uint8_t len) { return call Packet.getPayload(msg, len); } /* * These is where all of the send logic is. When the ForwardingEngine * wants to send a packet, it posts this task. The send logic is * independent of whether it is a forwarded packet or a packet from * a send clientL the two cases differ in how memory is managed in * sendDone. * * The task first checks that there is a packet to send and that * there is a valid route. It then marshals the relevant arguments * and prepares the packet for sending. If the node is a collection * root, it signals Receive with the loopback message. Otherwise, * it sets the packet to be acknowledged and sends it. It does not * remove the packet from the send queue: while sending, the * packet being sent is at the head of the queue; a packet is dequeued * in the sendDone handler, either due to retransmission failure * or to a successful send. */ task void sendTask() { uint16_t gradient; dbg("Forwarder", "%s: Trying to send a packet. Queue size is %hhu.\n", __FUNCTION__, call SendQueue.size()); if (hasState(SENDING) || call SendQueue.empty()) { call CollectionDebug.logEvent(NET_C_FE_SENDQUEUE_EMPTY); return; } else if ((!call RootControl.isRoot() && !call UnicastNameFreeRouting.hasRoute()) || (call CtpInfo.getEtx(&gradient) != SUCCESS)) { /* This code path is for when we don't have a valid next * hop. We set a retry timer. * * Technically, this timer isn't necessary, as if a route * is found we'll get an event. But just in case such an event * is lost (e.g., a bug in the routing engine), we retry. * Otherwise the forwarder might hang indefinitely. As this test * doesn't require radio activity, the energy cost is minimal. */ dbg("Forwarder", "%s: no route, don't send, try again in %i.\n", __FUNCTION__, NO_ROUTE_RETRY); call RetxmitTimer.startOneShot(NO_ROUTE_RETRY); call CollectionDebug.logEvent(NET_C_FE_NO_ROUTE); return; } else { /* We can send a packet. First check if it's a duplicate; if not, try to send/forward. */ error_t subsendResult; fe_queue_entry_t* qe = call SendQueue.head(); uint8_t payloadLen = call SubPacket.payloadLength(qe->msg); am_addr_t dest = call UnicastNameFreeRouting.nextHop(); if (call SentCache.lookup(qe->msg)) { /* This packet is a duplicate, so suppress it: free memory and * send next packet. Duplicates are only possible for * forwarded packets, so we can circumvent the client or * forwarded branch for freeing the buffer. */ call CollectionDebug.logEvent(NET_C_FE_DUPLICATE_CACHE_AT_SEND); call SendQueue.dequeue(); if (call MessagePool.put(qe->msg) != SUCCESS) call CollectionDebug.logEvent(NET_C_FE_PUT_MSGPOOL_ERR); if (call QEntryPool.put(qe) != SUCCESS) call CollectionDebug.logEvent(NET_C_FE_PUT_QEPOOL_ERR); post sendTask(); return; } // Not a duplicate: we've decided we're going to send. dbg("Forwarder", "Sending queue entry %p\n", qe); if (call RootControl.isRoot()) { /* Code path for roots: copy the packet and signal receive. */ collection_id_t collectid = getHeader(qe->msg)->type; uint8_t* payload; uint8_t payloadLength; memcpy(loopbackMsgPtr, qe->msg, sizeof(message_t)); payload = call Packet.getPayload(loopbackMsgPtr, call Packet.payloadLength(loopbackMsgPtr)); payloadLength = call Packet.payloadLength(loopbackMsgPtr); dbg("Forwarder", "%s: I'm a root, so loopback and signal receive.\n", __FUNCTION__); loopbackMsgPtr = signal Receive.receive[collectid](loopbackMsgPtr, payload, payloadLength); signal SubSend.sendDone(qe->msg, SUCCESS); } else { /* The basic forwarding/sending case. */ call CtpPacket.setEtx(qe->msg, gradient); call CtpPacket.clearOption(qe->msg, CTP_OPT_ECN | CTP_OPT_PULL); if (call PacketAcknowledgements.requestAck(qe->msg) == SUCCESS) { setState(ACK_PENDING); } if (hasState(QUEUE_CONGESTED)) { call CtpPacket.setOption(qe->msg, CTP_OPT_ECN); clearState(QUEUE_CONGESTED); } subsendResult = call SubSend.send(dest, qe->msg, payloadLen); if (subsendResult == SUCCESS) { // Successfully submitted to the data-link layer. setState(SENDING); dbg("Forwarder", "%s: subsend succeeded with %p.\n", __FUNCTION__, qe->msg); return; } // The packet is too big: truncate it and retry. else if (subsendResult == ESIZE) { dbg("Forwarder", "%s: subsend failed from ESIZE: truncate packet.\n", __FUNCTION__); call Packet.setPayloadLength(qe->msg, call Packet.maxPayloadLength()); post sendTask(); call CollectionDebug.logEvent(NET_C_FE_SUBSEND_SIZE); } else { dbg("Forwarder", "%s: subsend failed from %i\n", __FUNCTION__, (int)subsendResult); } } } } /* * The second phase of a send operation; based on whether the transmission was * successful, the ForwardingEngine either stops sending or starts the * RetxmitTimer with an interval based on what has occured. If the send was * successful or the maximum number of retransmissions has been reached, then * the ForwardingEngine dequeues the current packet. If the packet is from a * client it signals Send.sendDone(); if it is a forwarded packet it returns * the packet and queue entry to their respective pools. * */ void packetComplete(fe_queue_entry_t* qe, message_t* msg, bool success) { // Four cases: // Local packet: success or failure // Forwarded packet: success or failure if (qe->client < CLIENT_COUNT) { clientPtrs[qe->client] = qe; signal Send.sendDone[qe->client](msg, SUCCESS); if (success) { dbg("CtpForwarder", "%s: packet %hu.%hhu for client %hhu acknowledged.\n", __FUNCTION__, call CollectionPacket.getOrigin(msg), call CollectionPacket.getSequenceNumber(msg), qe->client); call CollectionDebug.logEventMsg(NET_C_FE_SENT_MSG, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); } else { dbg("CtpForwarder", "%s: packet %hu.%hhu for client %hhu dropped.\n", __FUNCTION__, call CollectionPacket.getOrigin(msg), call CollectionPacket.getSequenceNumber(msg), qe->client); call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_FAIL_ACK_SEND, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); } } else { if (success) { call SentCache.insert(qe->msg); dbg("CtpForwarder", "%s: forwarded packet %hu.%hhu acknowledged: insert in transmit queue.\n", __FUNCTION__, call CollectionPacket.getOrigin(msg), call CollectionPacket.getSequenceNumber(msg)); call CollectionDebug.logEventMsg(NET_C_FE_FWD_MSG, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); } else { dbg("CtpForwarder", "%s: forwarded packet %hu.%hhu dropped.\n", __FUNCTION__, call CollectionPacket.getOrigin(msg), call CollectionPacket.getSequenceNumber(msg)); call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_FAIL_ACK_FWD, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); } if (call MessagePool.put(qe->msg) != SUCCESS) call CollectionDebug.logEvent(NET_C_FE_PUT_MSGPOOL_ERR); if (call QEntryPool.put(qe) != SUCCESS) call CollectionDebug.logEvent(NET_C_FE_PUT_QEPOOL_ERR); } } event void SubSend.sendDone(message_t* msg, error_t error) { fe_queue_entry_t *qe = call SendQueue.head(); dbg("Forwarder", "%s to %hu and %hhu\n", __FUNCTION__, call AMPacket.destination(msg), error); if (error != SUCCESS) { /* The radio wasn't able to send the packet: retransmit it. */ dbg("Forwarder", "%s: send failed\n", __FUNCTION__); call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_FAIL, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); startRetxmitTimer(SENDDONE_FAIL_WINDOW, SENDDONE_FAIL_OFFSET); } else if (hasState(ACK_PENDING) && !call PacketAcknowledgements.wasAcked(msg)) { /* No ack: if countdown is not 0, retransmit, else drop the packet. */ call LinkEstimator.txNoAck(call AMPacket.destination(msg)); call CtpInfo.recomputeRoutes(); if (--qe->retries) { dbg("Forwarder", "%s: not acked, retransmit\n", __FUNCTION__); call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_WAITACK, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); startRetxmitTimer(SENDDONE_NOACK_WINDOW, SENDDONE_NOACK_OFFSET); } else { /* Hit max retransmit threshold: drop the packet. */ call SendQueue.dequeue(); clearState(SENDING); startRetxmitTimer(SENDDONE_OK_WINDOW, SENDDONE_OK_OFFSET); packetComplete(qe, msg, FALSE); } } else { /* Packet was acknowledged. Updated the link estimator, free the buffer (pool or sendDone), start timer to send next packet. */ call SendQueue.dequeue(); clearState(SENDING); startRetxmitTimer(SENDDONE_OK_WINDOW, SENDDONE_OK_OFFSET); call LinkEstimator.txAck(call AMPacket.destination(msg)); packetComplete(qe, msg, TRUE); } } /* * Function for preparing a packet for forwarding. Performs * a buffer swap from the message pool. If there are no free * message in the pool, it returns the passed message and does not * put it on the send queue. */ message_t* ONE forward(message_t* ONE m) { if (call MessagePool.empty()) { dbg("Route", "%s cannot forward, message pool empty.\n", __FUNCTION__); // send a debug message to the uart call CollectionDebug.logEvent(NET_C_FE_MSG_POOL_EMPTY); } else if (call QEntryPool.empty()) { dbg("Route", "%s cannot forward, queue entry pool empty.\n", __FUNCTION__); // send a debug message to the uart call CollectionDebug.logEvent(NET_C_FE_QENTRY_POOL_EMPTY); } else { message_t* newMsg; fe_queue_entry_t *qe; uint16_t gradient; qe = call QEntryPool.get(); if (qe == NULL) { call CollectionDebug.logEvent(NET_C_FE_GET_MSGPOOL_ERR); return m; } newMsg = call MessagePool.get(); if (newMsg == NULL) { call CollectionDebug.logEvent(NET_C_FE_GET_QEPOOL_ERR); return m; } memset(newMsg, 0, sizeof(message_t)); memset(m->metadata, 0, sizeof(message_metadata_t)); qe->msg = m; qe->client = 0xff; qe->retries = MAX_RETRIES; if (call SendQueue.enqueue(qe) == SUCCESS) { dbg("Forwarder,Route", "%s forwarding packet %p with queue size %hhu\n", __FUNCTION__, m, call SendQueue.size()); // Loop-detection code: if (call CtpInfo.getEtx(&gradient) == SUCCESS) { // We only check for loops if we know our own metric if (call CtpPacket.getEtx(m) <= gradient) { // If our etx metric is less than or equal to the etx value // on the packet (etx of the previous hop node), then we believe // we are in a loop. // Trigger a route update and backoff. call CtpInfo.triggerImmediateRouteUpdate(); startRetxmitTimer(LOOPY_WINDOW, LOOPY_OFFSET); call CollectionDebug.logEventMsg(NET_C_FE_LOOP_DETECTED, call CollectionPacket.getSequenceNumber(m), call CollectionPacket.getOrigin(m), call AMPacket.destination(m)); } } if (!call RetxmitTimer.isRunning()) { // sendTask is only immediately posted if we don't detect a // loop. dbg("FHangBug", "%s: posted sendTask.\n", __FUNCTION__); post sendTask(); } // Successful function exit point: return newMsg; } else { // There was a problem enqueuing to the send queue. if (call MessagePool.put(newMsg) != SUCCESS) call CollectionDebug.logEvent(NET_C_FE_PUT_MSGPOOL_ERR); if (call QEntryPool.put(qe) != SUCCESS) call CollectionDebug.logEvent(NET_C_FE_PUT_QEPOOL_ERR); } } // NB: at this point, we have a resource acquistion problem. // Log the event, and drop the // packet on the floor. call CollectionDebug.logEvent(NET_C_FE_SEND_QUEUE_FULL); return m; } /* * Received a message to forward. Check whether it is a duplicate by * checking the packets currently in the queue as well as the * send history cache (in case we recently forwarded this packet). * The cache is important as nodes immediately forward packets * but wait a period before retransmitting after an ack failure. * If this node is a root, signal receive. */ event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { collection_id_t collectid; bool duplicate = FALSE; fe_queue_entry_t* qe; uint8_t i, thl; collectid = call CtpPacket.getType(msg); // Update the THL here, since it has lived another hop, and so // that the root sees the correct THL. thl = call CtpPacket.getThl(msg); thl++; call CtpPacket.setThl(msg, thl); call CollectionDebug.logEventMsg(NET_C_FE_RCV_MSG, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), thl--); if (len > call SubSend.maxPayloadLength()) { return msg; } //See if we remember having seen this packet //We look in the sent cache ... if (call SentCache.lookup(msg)) { call CollectionDebug.logEvent(NET_C_FE_DUPLICATE_CACHE); return msg; } //... and in the queue for duplicates if (call SendQueue.size() > 0) { for (i = call SendQueue.size(); i >0; i--) { qe = call SendQueue.element(i-1); if (call CtpPacket.matchInstance(qe->msg, msg)) { duplicate = TRUE; break; } } } if (duplicate) { call CollectionDebug.logEvent(NET_C_FE_DUPLICATE_QUEUE); return msg; } // If I'm the root, signal receive. else if (call RootControl.isRoot()) return signal Receive.receive[collectid](msg, call Packet.getPayload(msg, call Packet.payloadLength(msg)), call Packet.payloadLength(msg)); // I'm on the routing path and Intercept indicates that I // should not forward the packet. else if (!signal Intercept.forward[collectid](msg, call Packet.getPayload(msg, call Packet.payloadLength(msg)), call Packet.payloadLength(msg))) return msg; else { dbg("Route", "Forwarding packet from %hu.\n", getHeader(msg)->origin); return forward(msg); } } event message_t* SubSnoop.receive(message_t* msg, void *payload, uint8_t len) { // Check for the pull bit (P) [TEP123] and act accordingly. This // check is made for all packets, not just ones addressed to us. if (call CtpPacket.option(msg, CTP_OPT_PULL)) { call CtpInfo.triggerRouteUpdate(); } return signal Snoop.receive[call CtpPacket.getType(msg)] (msg, payload + sizeof(ctp_data_header_t), len - sizeof(ctp_data_header_t)); } event void RetxmitTimer.fired() { clearState(SENDING); dbg("FHangBug", "%s posted sendTask.\n", __FUNCTION__); post sendTask(); } command bool CtpCongestion.isCongested() { return FALSE; } command void CtpCongestion.setClientCongested(bool congested) { // Do not respond to congestion. } /* signalled when this neighbor is evicted from the neighbor table */ event void LinkEstimator.evicted(am_addr_t neighbor) {} // Packet ADT commands command void Packet.clear(message_t* msg) { call SubPacket.clear(msg); } command uint8_t Packet.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg) - sizeof(ctp_data_header_t); } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call SubPacket.setPayloadLength(msg, len + sizeof(ctp_data_header_t)); } command uint8_t Packet.maxPayloadLength() { return call SubPacket.maxPayloadLength() - sizeof(ctp_data_header_t); } command void* Packet.getPayload(message_t* msg, uint8_t len) { uint8_t* payload = call SubPacket.getPayload(msg, len + sizeof(ctp_data_header_t)); if (payload != NULL) { payload += sizeof(ctp_data_header_t); } return payload; } // CollectionPacket ADT commands command am_addr_t CollectionPacket.getOrigin(message_t* msg) {return getHeader(msg)->origin;} command collection_id_t CollectionPacket.getType(message_t* msg) {return getHeader(msg)->type;} command uint8_t CollectionPacket.getSequenceNumber(message_t* msg) {return getHeader(msg)->originSeqNo;} command void CollectionPacket.setOrigin(message_t* msg, am_addr_t addr) {getHeader(msg)->origin = addr;} command void CollectionPacket.setType(message_t* msg, collection_id_t id) {getHeader(msg)->type = id;} command void CollectionPacket.setSequenceNumber(message_t* msg, uint8_t _seqno) {getHeader(msg)->originSeqNo = _seqno;} // CtpPacket ADT commands command uint8_t CtpPacket.getType(message_t* msg) {return getHeader(msg)->type;} command am_addr_t CtpPacket.getOrigin(message_t* msg) {return getHeader(msg)->origin;} command uint16_t CtpPacket.getEtx(message_t* msg) {return getHeader(msg)->etx;} command uint8_t CtpPacket.getSequenceNumber(message_t* msg) {return getHeader(msg)->originSeqNo;} command uint8_t CtpPacket.getThl(message_t* msg) {return getHeader(msg)->thl;} command void CtpPacket.setThl(message_t* msg, uint8_t thl) {getHeader(msg)->thl = thl;} command void CtpPacket.setOrigin(message_t* msg, am_addr_t addr) {getHeader(msg)->origin = addr;} command void CtpPacket.setType(message_t* msg, uint8_t id) {getHeader(msg)->type = id;} command void CtpPacket.setEtx(message_t* msg, uint16_t e) {getHeader(msg)->etx = e;} command void CtpPacket.setSequenceNumber(message_t* msg, uint8_t _seqno) {getHeader(msg)->originSeqNo = _seqno;} command bool CtpPacket.option(message_t* msg, ctp_options_t opt) { return ((getHeader(msg)->options & opt) == opt) ? TRUE : FALSE; } command void CtpPacket.setOption(message_t* msg, ctp_options_t opt) { getHeader(msg)->options |= opt; } command void CtpPacket.clearOption(message_t* msg, ctp_options_t opt) { getHeader(msg)->options &= ~opt; } // A CTP packet ID is based on the origin and the THL field, to // implement duplicate suppression as described in TEP 123. command bool CtpPacket.matchInstance(message_t* m1, message_t* m2) { return (call CtpPacket.getOrigin(m1) == call CtpPacket.getOrigin(m2) && call CtpPacket.getSequenceNumber(m1) == call CtpPacket.getSequenceNumber(m2) && call CtpPacket.getThl(m1) == call CtpPacket.getThl(m2) && call CtpPacket.getType(m1) == call CtpPacket.getType(m2)); } command bool CtpPacket.matchPacket(message_t* m1, message_t* m2) { return (call CtpPacket.getOrigin(m1) == call CtpPacket.getOrigin(m2) && call CtpPacket.getSequenceNumber(m1) == call CtpPacket.getSequenceNumber(m2) && call CtpPacket.getType(m1) == call CtpPacket.getType(m2)); } void clearState(uint8_t state) { forwardingState = forwardingState & ~state; } bool hasState(uint8_t state) { return forwardingState & state; } void setState(uint8_t state) { forwardingState = forwardingState | state; } /******** Defaults. **************/ default event void Send.sendDone[uint8_t client](message_t *msg, error_t error) { } default event bool Intercept.forward[collection_id_t collectid](message_t* msg, void* payload, uint8_t len) { return TRUE; } default event message_t * Receive.receive[collection_id_t collectid](message_t *msg, void *payload, uint8_t len) { return msg; } default event message_t * Snoop.receive[collection_id_t collectid](message_t *msg, void *payload, uint8_t len) { return msg; } default command collection_id_t CollectionId.fetch[uint8_t client]() { return 0; } /* Default implementations for CollectionDebug calls. * These allow CollectionDebug not to be wired to anything if debugging * is not desired. */ default command error_t CollectionDebug.logEvent(uint8_t type) { return SUCCESS; } default command error_t CollectionDebug.logEventSimple(uint8_t type, uint16_t arg) { return SUCCESS; } default command error_t CollectionDebug.logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3) { return SUCCESS; } default command error_t CollectionDebug.logEventMsg(uint8_t type, uint16_t msg, am_addr_t origin, am_addr_t node) { return SUCCESS; } default command error_t CollectionDebug.logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t metric) { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/net/ctp/CtpInfo.nc000066400000000000000000000066631207233610700206070ustar00rootroot00000000000000/* $Id: CtpInfo.nc,v 1.8 2010-06-29 22:07:49 scipio Exp $ */ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * @author Rodrigo Fonseca * @author Philip Levis * @date $Date: 2010-06-29 22:07:49 $ * @see Net2-WG */ #include "AM.h" interface CtpInfo { /** * Get the parent of the node in the tree. The pointer is allocated * by the caller. If the parent is invalid, return FAIL. The * caller MUST NOT use the value in parent if the return is not * SUCCESS. */ command error_t getParent(am_addr_t* parent); /** * Get the ETX for the current path to the root through the current * parent. Sets etx argument to ETX*10. The pointer is allocated by * the caller. If the parent is invalid, return FAIL (no info). * The caller MUST NOT use the value in parent if the return is not * SUCCESS. Calling getEtx at the root will set the etx argument to * 0. */ command error_t getEtx(uint16_t* etx); /** * This informs the routing engine that sending a beacon soon is * advisable, e.g., in response to a pull bit. */ command void triggerRouteUpdate(); /** * This informs the routing engine that sending a beacon as soon * as possible is advisable, e.g., due to queue overflow or * a detected loop. */ command void triggerImmediateRouteUpdate(); /** * Tell the routing engine it might want to recompute its routes. */ command void recomputeRoutes(); /** * Informs the routing engine that a neighbor is congested */ command void setNeighborCongested(am_addr_t n, bool congested); /** * Returns the currently known state about a neighbor's congestion state */ command bool isNeighborCongested(am_addr_t n); command uint8_t numNeighbors(); command uint16_t getNeighborLinkQuality(uint8_t n); command uint16_t getNeighborRouteQuality(uint8_t n); command am_addr_t getNeighborAddr(uint8_t n); } tinyos-2.1.2+dfsg/tos/lib/net/ctp/CtpP.nc000066400000000000000000000176151207233610700201120ustar00rootroot00000000000000/* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Ctp.h" /** * A data collection service that uses a tree routing protocol * to deliver data to collection roots, following TEP 119. * * @author Rodrigo Fonseca * @author Omprakash Gnawali * @author Kyle Jamieson * @author Philip Levis */ configuration CtpP { provides { interface StdControl; interface Send[uint8_t client]; interface Receive[collection_id_t id]; interface Receive as Snoop[collection_id_t]; interface Intercept[collection_id_t id]; interface Packet; interface CollectionPacket; interface CtpPacket; interface CtpInfo; interface LinkEstimator; interface CtpCongestion; interface RootControl; } uses { interface CollectionId[uint8_t client]; interface CollectionDebug; } } implementation { enum { CLIENT_COUNT = uniqueCount(UQ_CTP_CLIENT), FORWARD_COUNT = 12, TREE_ROUTING_TABLE_SIZE = 10, QUEUE_SIZE = CLIENT_COUNT + FORWARD_COUNT, CACHE_SIZE = 4, }; components ActiveMessageC; components new CtpForwardingEngineP() as Forwarder; components MainC, LedsC; Send = Forwarder; StdControl = Forwarder; Receive = Forwarder.Receive; Snoop = Forwarder.Snoop; Intercept = Forwarder; Packet = Forwarder; CollectionId = Forwarder; CollectionPacket = Forwarder; CtpPacket = Forwarder; CtpCongestion = Forwarder; components new PoolC(message_t, FORWARD_COUNT) as MessagePoolP; components new PoolC(fe_queue_entry_t, FORWARD_COUNT) as QEntryPoolP; Forwarder.QEntryPool -> QEntryPoolP; Forwarder.MessagePool -> MessagePoolP; components new QueueC(fe_queue_entry_t*, QUEUE_SIZE) as SendQueueP; Forwarder.SendQueue -> SendQueueP; components new LruCtpMsgCacheC(CACHE_SIZE) as SentCacheP; Forwarder.SentCache -> SentCacheP; components new TimerMilliC() as RoutingBeaconTimer; components new TimerMilliC() as RouteUpdateTimer; components LinkEstimatorP as Estimator; Forwarder.LinkEstimator -> Estimator; components new AMSenderC(AM_CTP_DATA); components new AMReceiverC(AM_CTP_DATA); components new AMSnooperC(AM_CTP_DATA); components new CtpRoutingEngineP(TREE_ROUTING_TABLE_SIZE, 128, 512000) as Router; StdControl = Router; StdControl = Estimator; RootControl = Router; MainC.SoftwareInit -> Router; Router.BeaconSend -> Estimator.Send; Router.BeaconReceive -> Estimator.Receive; Router.LinkEstimator -> Estimator.LinkEstimator; Router.CompareBit -> Estimator.CompareBit; Router.AMPacket -> ActiveMessageC; Router.RadioControl -> ActiveMessageC; Router.BeaconTimer -> RoutingBeaconTimer; Router.RouteTimer -> RouteUpdateTimer; Router.CollectionDebug = CollectionDebug; Forwarder.CollectionDebug = CollectionDebug; Forwarder.CtpInfo -> Router; Router.CtpCongestion -> Forwarder; CtpInfo = Router; components new TimerMilliC() as RetxmitTimer; Forwarder.RetxmitTimer -> RetxmitTimer; components RandomC; Router.Random -> RandomC; Forwarder.Random -> RandomC; MainC.SoftwareInit -> Forwarder; Forwarder.SubSend -> AMSenderC; Forwarder.SubReceive -> AMReceiverC; Forwarder.SubSnoop -> AMSnooperC; Forwarder.SubPacket -> AMSenderC; Forwarder.RootControl -> Router; Forwarder.UnicastNameFreeRouting -> Router.Routing; Forwarder.RadioControl -> ActiveMessageC; Forwarder.PacketAcknowledgements -> AMSenderC.Acks; Forwarder.AMPacket -> AMSenderC; Forwarder.Leds -> LedsC; components new AMSenderC(AM_CTP_ROUTING) as SendControl; components new AMReceiverC(AM_CTP_ROUTING) as ReceiveControl; LinkEstimator = Estimator; Estimator.Random -> RandomC; Estimator.AMSend -> SendControl; Estimator.SubReceive -> ReceiveControl; Estimator.SubPacket -> SendControl; Estimator.SubAMPacket -> SendControl; #if defined(CC2420X) components CC2420XActiveMessageC as PlatformActiveMessageC; #elif defined(PLATFORM_TELOSB) || defined(PLATFORM_MICAZ) #ifndef TOSSIM components CC2420ActiveMessageC as PlatformActiveMessageC; #else components DummyActiveMessageP as PlatformActiveMessageC; #endif #elif defined (PLATFORM_MICA2) || defined (PLATFORM_MICA2DOT) components CC1000ActiveMessageC as PlatformActiveMessageC; #elif defined(PLATFORM_EYESIFXV1) || defined(PLATFORM_EYESIFXV2) components WhiteBitAccessorC as PlatformActiveMessageC; #elif defined(PLATFORM_IRIS) || defined(PLATFORM_MESHBEAN) components RF230ActiveMessageC as PlatformActiveMessageC; #elif defined(PLATFORM_MESHBEAN900) components RF212ActiveMessageC as PlatformActiveMessageC; #elif defined(PLATFORM_UCMINI) components RFA1ActiveMessageC as PlatformActiveMessageC; #else components DummyActiveMessageP as PlatformActiveMessageC; #endif Estimator.LinkPacketMetadata -> PlatformActiveMessageC; // eventually // Estimator.LinkPacketMetadata -> ActiveMessageC; MainC.SoftwareInit -> Estimator; } tinyos-2.1.2+dfsg/tos/lib/net/ctp/CtpPacket.nc000066400000000000000000000055501207233610700211150ustar00rootroot00000000000000/* $Id: CtpPacket.nc,v 1.5 2007-11-28 04:42:52 rincon Exp $ */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADT for CTP data frames. * * @author Philip Levis * @author Kyle Jamieson * @date $Date: 2007-11-28 04:42:52 $ */ #include #include "Ctp.h" interface CtpPacket { // Sets the given options bit. command void setOption(message_t* msg, ctp_options_t option); // Clears the given options bit. command void clearOption(message_t* msg, ctp_options_t option); // Returns TRUE iff all of the given options bits are set. command bool option(message_t* msg, ctp_options_t opt); command uint8_t getThl(message_t* msg); command void setThl(message_t* msg, uint8_t thl); command uint16_t getEtx(message_t* msg); command void setEtx(message_t* msg, uint16_t etx); command am_addr_t getOrigin(message_t* msg); command void setOrigin(message_t* msg, am_addr_t addr); command uint8_t getSequenceNumber(message_t* msg); command void setSequenceNumber(message_t* msg, uint8_t seqno); command uint8_t getType(message_t* msg); command void setType(message_t* msg, uint8_t id); command bool matchInstance(message_t* m1, message_t* m2); command bool matchPacket(message_t* m1, message_t* m2); } tinyos-2.1.2+dfsg/tos/lib/net/ctp/CtpRoutingEngineP.nc000066400000000000000000000737001207233610700226050ustar00rootroot00000000000000#include #include #include /* $Id: CtpRoutingEngineP.nc,v 1.25 2010-06-29 22:07:49 scipio Exp $ */ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * The TreeRoutingEngine is responsible for computing the routes for * collection. It builds a set of trees rooted at specific nodes (roots) and * maintains these trees using information provided by the link estimator on * the quality of one hop links. * *

      Each node is part of only one tree at any given time, but there is no * difference from the node's point of view of which tree it is part. In other * words, a message is sent towards a root, but which one is not * specified. It is assumed that the roots will work together to have all data * aggregated later if need be. The tree routing engine's responsibility is * for each node to find the path with the least number of transmissions to * any one root. * *

      The tree is proactively maintained by periodic beacons sent by each * node. These beacons are jittered in time to prevent synchronizations in the * network. All nodes maintain the same average beacon sending rate * (defined by BEACON_INTERVAL +- 50%). The beacon contains the node's parent, * the current hopcount, and the cumulative path quality metric. The metric is * defined as the parent's metric plus the bidirectional quality of the link * between the current node and its parent. The metric represents the * expected number of transmissions along the path to the root, and is 0 by * definition at the root. * *

      Every time a node receives an update from a neighbor it records the * information if the node is part of the neighbor table. The neighbor table * keeps the best candidates for being parents i.e., the nodes with the best * path metric. The neighbor table does not store the full path metric, * though. It stores the parent's path metric, and the link quality to the * parent is only added when the information is needed: (i) when choosing a * parent and (ii) when choosing a route. The nodes in the neighbor table are * a subset of the nodes in the link estimator table, as a node is not * admitted in the neighbor table with an estimate of infinity. * *

      There are two uses for the neighbor table, as mentioned above. The first * one is to select a parent. The parent is just the neighbor with the best * path metric. It serves to define the node's own path metric and hopcount, * and the set of child-parent links is what defines the tree. In a sense the * tree is defined to form a coherent propagation substrate for the path * metrics. The parent is (re)-selected periodically, immediately before a * node sends its own beacon, in the updateRouteTask. * *

      The second use is to actually choose a next hop towards any root at * message forwarding time. This need not be the current parent, even though * it is currently implemented as such. * *

      The operation of the routing engine has two main tasks and one main * event: updateRouteTask is called periodically and chooses a new parent; * sendBeaconTask broadcasts the current route information to the neighbors. * The main event is the receiving of a neighbor's beacon, which updates the * neighbor table. * *

      The interface with the ForwardingEngine occurs through the nextHop() * call. * *

      Any node can become a root, and routed messages from a subset of the * network will be routed towards it. The RootControl interface allows * setting, unsetting, and querying the root state of a node. By convention, * when a node is root its hopcount and metric are 0, and the parent is * itself. A root always has a valid route, to itself. * * @author Rodrigo Fonseca * @author Philip Levis (added trickle-like updates) * Acknowledgment: based on MintRoute, MultiHopLQI, BVR tree construction, Berkeley's MTree * * @date $Date: 2010-06-29 22:07:49 $ * @see Net2-WG */ generic module CtpRoutingEngineP(uint8_t routingTableSize, uint32_t minInterval, uint32_t maxInterval) { provides { interface UnicastNameFreeRouting as Routing; interface RootControl; interface CtpInfo; interface StdControl; interface CtpRoutingPacket; interface Init; } uses { interface AMSend as BeaconSend; interface Receive as BeaconReceive; interface LinkEstimator; interface AMPacket; interface SplitControl as RadioControl; interface Timer as BeaconTimer; interface Timer as RouteTimer; interface Random; interface CollectionDebug; interface CtpCongestion; interface CompareBit; } } implementation { bool ECNOff = TRUE; /* Keeps track of whether the radio is on. No sense updating or sending * beacons if radio is off */ bool radioOn = FALSE; /* Controls whether the node's periodic timer will fire. The node will not * send any beacon, and will not update the route. Start and stop control this. */ bool running = FALSE; /* Guards the beacon buffer: only one beacon being sent at a time */ bool sending = FALSE; /* Tells updateNeighbor that the parent was just evicted.*/ bool justEvicted = FALSE; route_info_t routeInfo; bool state_is_root; am_addr_t my_ll_addr; message_t beaconMsgBuffer; ctp_routing_header_t* beaconMsg; /* routing table -- routing info about neighbors */ routing_table_entry routingTable[routingTableSize]; uint8_t routingTableActive; /* statistics */ uint32_t parentChanges; /* end statistics */ // forward declarations void routingTableInit(); uint8_t routingTableFind(am_addr_t); error_t routingTableUpdateEntry(am_addr_t, am_addr_t , uint16_t); error_t routingTableEvict(am_addr_t neighbor); /* For each interval t, you set a timer to fire between t/2 and t (chooseAdvertiseTime), and you wait until t (remainingInterval). Once you are at t, you double the interval (decayInterval) if you haven't reached the max. For reasons such as topological inconsistency, you reset the timer to a small value (resetInterval). */ uint32_t currentInterval = minInterval; uint32_t t; bool tHasPassed; void chooseAdvertiseTime() { t = currentInterval; t /= 2; t += call Random.rand32() % t; tHasPassed = FALSE; call BeaconTimer.startOneShot(t); } void resetInterval() { currentInterval = minInterval; chooseAdvertiseTime(); } void decayInterval() { currentInterval *= 2; if (currentInterval > maxInterval) { currentInterval = maxInterval; } chooseAdvertiseTime(); } void remainingInterval() { uint32_t remaining = currentInterval; remaining -= t; tHasPassed = TRUE; call BeaconTimer.startOneShot(remaining); } command error_t Init.init() { uint8_t maxLength; radioOn = FALSE; running = FALSE; parentChanges = 0; state_is_root = 0; routeInfoInit(&routeInfo); routingTableInit(); beaconMsg = call BeaconSend.getPayload(&beaconMsgBuffer, call BeaconSend.maxPayloadLength()); maxLength = call BeaconSend.maxPayloadLength(); dbg("TreeRoutingCtl","TreeRouting initialized. (used payload:%d max payload:%d!\n", sizeof(beaconMsg), maxLength); return SUCCESS; } command error_t StdControl.start() { my_ll_addr = call AMPacket.address(); //start will (re)start the sending of messages if (!running) { running = TRUE; resetInterval(); call RouteTimer.startPeriodic(BEACON_INTERVAL); dbg("TreeRoutingCtl","%s running: %d radioOn: %d\n", __FUNCTION__, running, radioOn); } return SUCCESS; } command error_t StdControl.stop() { running = FALSE; dbg("TreeRoutingCtl","%s running: %d radioOn: %d\n", __FUNCTION__, running, radioOn); return SUCCESS; } event void RadioControl.startDone(error_t error) { radioOn = TRUE; dbg("TreeRoutingCtl","%s running: %d radioOn: %d\n", __FUNCTION__, running, radioOn); if (running) { uint16_t nextInt; nextInt = call Random.rand16() % BEACON_INTERVAL; nextInt += BEACON_INTERVAL >> 1; } } event void RadioControl.stopDone(error_t error) { radioOn = FALSE; dbg("TreeRoutingCtl","%s running: %d radioOn: %d\n", __FUNCTION__, running, radioOn); } /* Is this quality measure better than the minimum threshold? */ // Implemented assuming quality is EETX bool passLinkEtxThreshold(uint16_t etx) { return (etx < ETX_THRESHOLD); } /* updates the routing information, using the info that has been received * from neighbor beacons. Two things can cause this info to change: * neighbor beacons, changes in link estimates, including neighbor eviction */ task void updateRouteTask() { uint8_t i; routing_table_entry* entry; routing_table_entry* best; uint16_t minEtx; uint16_t currentEtx; uint16_t linkEtx, pathEtx; if (state_is_root) return; best = NULL; /* Minimum etx found among neighbors, initially infinity */ minEtx = MAX_METRIC; /* Metric through current parent, initially infinity */ currentEtx = MAX_METRIC; dbg("TreeRouting","%s\n",__FUNCTION__); /* Find best path in table, other than our current */ for (i = 0; i < routingTableActive; i++) { entry = &routingTable[i]; // Avoid bad entries and 1-hop loops if (entry->info.parent == INVALID_ADDR || entry->info.parent == my_ll_addr) { dbg("TreeRouting", "routingTable[%d]: neighbor: [id: %d parent: %d etx: NO ROUTE]\n", i, entry->neighbor, entry->info.parent); continue; } linkEtx = call LinkEstimator.getLinkQuality(entry->neighbor); dbg("TreeRouting", "routingTable[%d]: neighbor: [id: %d parent: %d etx: %d retx: %d]\n", i, entry->neighbor, entry->info.parent, linkEtx, entry->info.etx); pathEtx = linkEtx + entry->info.etx; /* Operations specific to the current parent */ if (entry->neighbor == routeInfo.parent) { dbg("TreeRouting", " already parent.\n"); currentEtx = pathEtx; /* update routeInfo with parent's current info */ routeInfo.etx = entry->info.etx; routeInfo.congested = entry->info.congested; continue; } /* Ignore links that are congested */ if (entry->info.congested) continue; /* Ignore links that are bad */ if (!passLinkEtxThreshold(linkEtx)) { dbg("TreeRouting", " did not pass threshold.\n"); continue; } if (pathEtx < minEtx) { dbg("TreeRouting", " best is %d, setting to %d\n", pathEtx, entry->neighbor); minEtx = pathEtx; best = entry; } } //call CollectionDebug.logEventDbg(NET_C_DBG_3, routeInfo.parent, currentEtx, minEtx); /* Now choose between the current parent and the best neighbor */ /* Requires that: 1. at least another neighbor was found with ok quality and not congested 2. the current parent is congested and the other best route is at least as good 3. or the current parent is not congested and the neighbor quality is better by the PARENT_SWITCH_THRESHOLD. Note: if our parent is congested, in order to avoid forming loops, we try to select a node which is not a descendent of our parent. routeInfo.ext is our parent's etx. Any descendent will be at least that + 10 (1 hop), so we restrict the selection to be less than that. */ if (minEtx != MAX_METRIC) { if (currentEtx == MAX_METRIC || (routeInfo.congested && (minEtx < (routeInfo.etx + 10))) || minEtx + PARENT_SWITCH_THRESHOLD < currentEtx) { // routeInfo.metric will not store the composed metric. // since the linkMetric may change, we will compose whenever // we need it: i. when choosing a parent (here); // ii. when choosing a next hop parentChanges++; dbg("TreeRouting","Changed parent. from %d to %d\n", routeInfo.parent, best->neighbor); call CollectionDebug.logEventDbg(NET_C_TREE_NEW_PARENT, best->neighbor, best->info.etx, minEtx); call LinkEstimator.unpinNeighbor(routeInfo.parent); call LinkEstimator.pinNeighbor(best->neighbor); call LinkEstimator.clearDLQ(best->neighbor); routeInfo.parent = best->neighbor; routeInfo.etx = best->info.etx; routeInfo.congested = best->info.congested; if (currentEtx - minEtx > 20) { call CtpInfo.triggerRouteUpdate(); } } } /* Finally, tell people what happened: */ /* We can only loose a route to a parent if it has been evicted. If it hasn't * been just evicted then we already did not have a route */ if (justEvicted && routeInfo.parent == INVALID_ADDR) signal Routing.noRoute(); /* On the other hand, if we didn't have a parent (no currentEtx) and now we * do, then we signal route found. The exception is if we just evicted the * parent and immediately found a replacement route: we don't signal in this * case */ else if (!justEvicted && currentEtx == MAX_METRIC && minEtx != MAX_METRIC) signal Routing.routeFound(); justEvicted = FALSE; } /* send a beacon advertising this node's routeInfo */ // only posted if running and radioOn task void sendBeaconTask() { error_t eval; if (sending) { return; } beaconMsg->options = 0; /* Congestion notification: am I congested? */ if (call CtpCongestion.isCongested()) { beaconMsg->options |= CTP_OPT_ECN; } beaconMsg->parent = routeInfo.parent; if (state_is_root) { beaconMsg->etx = routeInfo.etx; } else if (routeInfo.parent == INVALID_ADDR) { beaconMsg->etx = routeInfo.etx; beaconMsg->options |= CTP_OPT_PULL; } else { beaconMsg->etx = routeInfo.etx + call LinkEstimator.getLinkQuality(routeInfo.parent); } dbg("TreeRouting", "%s parent: %d etx: %d\n", __FUNCTION__, beaconMsg->parent, beaconMsg->etx); call CollectionDebug.logEventRoute(NET_C_TREE_SENT_BEACON, beaconMsg->parent, 0, beaconMsg->etx); eval = call BeaconSend.send(AM_BROADCAST_ADDR, &beaconMsgBuffer, sizeof(ctp_routing_header_t)); if (eval == SUCCESS) { sending = TRUE; } else if (eval == EOFF) { radioOn = FALSE; dbg("TreeRoutingCtl","%s running: %d radioOn: %d\n", __FUNCTION__, running, radioOn); } } event void BeaconSend.sendDone(message_t* msg, error_t error) { if ((msg != &beaconMsgBuffer) || !sending) { //something smells bad around here return; } sending = FALSE; } event void RouteTimer.fired() { if (radioOn && running) { post updateRouteTask(); } } event void BeaconTimer.fired() { if (radioOn && running) { if (!tHasPassed) { post updateRouteTask(); //always send the most up to date info post sendBeaconTask(); dbg("RoutingTimer", "Beacon timer fired at %s\n", sim_time_string()); remainingInterval(); } else { decayInterval(); } } } ctp_routing_header_t* getHeader(message_t* ONE m) { return (ctp_routing_header_t*)call BeaconSend.getPayload(m, call BeaconSend.maxPayloadLength()); } /* Handle the receiving of beacon messages from the neighbors. We update the * table, but wait for the next route update to choose a new parent */ event message_t* BeaconReceive.receive(message_t* msg, void* payload, uint8_t len) { am_addr_t from; ctp_routing_header_t* rcvBeacon; bool congested; // Received a beacon, but it's not from us. if (len != sizeof(ctp_routing_header_t)) { dbg("LITest", "%s, received beacon of size %hhu, expected %i\n", __FUNCTION__, len, (int)sizeof(ctp_routing_header_t)); return msg; } //need to get the am_addr_t of the source from = call AMPacket.source(msg); rcvBeacon = (ctp_routing_header_t*)payload; congested = call CtpRoutingPacket.getOption(msg, CTP_OPT_ECN); dbg("TreeRouting","%s from: %d [ parent: %d etx: %d]\n", __FUNCTION__, from, rcvBeacon->parent, rcvBeacon->etx); //update neighbor table if (rcvBeacon->parent != INVALID_ADDR) { /* If this node is a root, request a forced insert in the link * estimator table and pin the node. */ if (rcvBeacon->etx == 0) { dbg("TreeRouting","from a root, inserting if not in table\n"); call LinkEstimator.insertNeighbor(from); call LinkEstimator.pinNeighbor(from); } //TODO: also, if better than my current parent's path etx, insert routingTableUpdateEntry(from, rcvBeacon->parent, rcvBeacon->etx); call CtpInfo.setNeighborCongested(from, congested); } if (call CtpRoutingPacket.getOption(msg, CTP_OPT_PULL)) { resetInterval(); } return msg; } /* Signals that a neighbor is no longer reachable. need special care if * that neighbor is our parent */ event void LinkEstimator.evicted(am_addr_t neighbor) { routingTableEvict(neighbor); dbg("TreeRouting","%s\n",__FUNCTION__); if (routeInfo.parent == neighbor) { routeInfoInit(&routeInfo); justEvicted = TRUE; post updateRouteTask(); } } /* Interface UnicastNameFreeRouting */ /* Simple implementation: return the current routeInfo */ command am_addr_t Routing.nextHop() { return routeInfo.parent; } command bool Routing.hasRoute() { return (routeInfo.parent != INVALID_ADDR); } /* CtpInfo interface */ command error_t CtpInfo.getParent(am_addr_t* parent) { if (parent == NULL) return FAIL; if (routeInfo.parent == INVALID_ADDR) return FAIL; *parent = routeInfo.parent; return SUCCESS; } command error_t CtpInfo.getEtx(uint16_t* etx) { if (etx == NULL) return FAIL; if (routeInfo.parent == INVALID_ADDR) return FAIL; if (state_is_root == 1) { *etx = 0; } else { *etx = routeInfo.etx + call LinkEstimator.getLinkQuality(routeInfo.parent); } return SUCCESS; } command void CtpInfo.recomputeRoutes() { post updateRouteTask(); } command void CtpInfo.triggerRouteUpdate() { resetInterval(); } command void CtpInfo.triggerImmediateRouteUpdate() { resetInterval(); } command void CtpInfo.setNeighborCongested(am_addr_t n, bool congested) { uint8_t idx; if (ECNOff) return; idx = routingTableFind(n); if (idx < routingTableActive) { routingTable[idx].info.congested = congested; } if (routeInfo.congested && !congested) post updateRouteTask(); else if (routeInfo.parent == n && congested) post updateRouteTask(); } command bool CtpInfo.isNeighborCongested(am_addr_t n) { uint8_t idx; if (ECNOff) return FALSE; idx = routingTableFind(n); if (idx < routingTableActive) { return routingTable[idx].info.congested; } return FALSE; } /* RootControl interface */ /** sets the current node as a root, if not already a root */ /* returns FAIL if it's not possible for some reason */ command error_t RootControl.setRoot() { bool route_found = FALSE; route_found = (routeInfo.parent == INVALID_ADDR); state_is_root = 1; routeInfo.parent = my_ll_addr; //myself routeInfo.etx = 0; if (route_found) signal Routing.routeFound(); dbg("TreeRouting","%s I'm a root now!\n",__FUNCTION__); call CollectionDebug.logEventRoute(NET_C_TREE_NEW_PARENT, routeInfo.parent, 0, routeInfo.etx); return SUCCESS; } command error_t RootControl.unsetRoot() { state_is_root = 0; routeInfoInit(&routeInfo); dbg("TreeRouting","%s I'm not a root now!\n",__FUNCTION__); post updateRouteTask(); return SUCCESS; } command bool RootControl.isRoot() { return state_is_root; } default event void Routing.noRoute() { } default event void Routing.routeFound() { } /* The link will be recommended for insertion if it is better* than some * link in the routing table that is not our parent. * We are comparing the path quality up to the node, and ignoring the link * quality from us to the node. This is because of a couple of things: * 1. we expect this call only for links with white bit set * 2. we are being optimistic to the nodes in the table, by ignoring the * 1-hop quality to them (which means we are assuming it's 1 as well) * This actually sets the bar a little higher for replacement * 3. this is faster */ event bool CompareBit.shouldInsert(message_t *msg, void* payload, uint8_t len) { bool found = FALSE; uint16_t pathEtx; uint16_t neighEtx; int i; routing_table_entry* entry; ctp_routing_header_t* rcvBeacon; if ((call AMPacket.type(msg) != AM_CTP_ROUTING) || (len != sizeof(ctp_routing_header_t))) return FALSE; /* 1.determine this packet's path quality */ rcvBeacon = (ctp_routing_header_t*)payload; if (rcvBeacon->parent == INVALID_ADDR) return FALSE; /* the node is a root, recommend insertion! */ if (rcvBeacon->etx == 0) { return TRUE; } pathEtx = rcvBeacon->etx; // + linkEtx; /* 2. see if we find some neighbor that is worse */ for (i = 0; i < routingTableActive && !found; i++) { entry = &routingTable[i]; //ignore parent, since we can't replace it if (entry->neighbor == routeInfo.parent) continue; neighEtx = entry->info.etx; found |= (pathEtx < neighEtx); } return found; } /************************************************************/ /* Routing Table Functions */ /* The routing table keeps info about neighbor's route_info, * and is used when choosing a parent. * The table is simple: * - not fragmented (all entries in 0..routingTableActive) * - not ordered * - no replacement: eviction follows the LinkEstimator table */ void routingTableInit() { routingTableActive = 0; } /* Returns the index of parent in the table or * routingTableActive if not found */ uint8_t routingTableFind(am_addr_t neighbor) { uint8_t i; if (neighbor == INVALID_ADDR) return routingTableActive; for (i = 0; i < routingTableActive; i++) { if (routingTable[i].neighbor == neighbor) break; } return i; } error_t routingTableUpdateEntry(am_addr_t from, am_addr_t parent, uint16_t etx) { uint8_t idx; uint16_t linkEtx; linkEtx = call LinkEstimator.getLinkQuality(from); idx = routingTableFind(from); if (idx == routingTableSize) { //not found and table is full //if (passLinkEtxThreshold(linkEtx)) //TODO: add replacement here, replace the worst //} dbg("TreeRouting", "%s FAIL, table full\n", __FUNCTION__); return FAIL; } else if (idx == routingTableActive) { //not found and there is space if (passLinkEtxThreshold(linkEtx)) { routingTable[idx].neighbor = from; routingTable[idx].info.parent = parent; routingTable[idx].info.etx = etx; routingTable[idx].info.haveHeard = 1; routingTable[idx].info.congested = FALSE; routingTableActive++; dbg("TreeRouting", "%s OK, new entry\n", __FUNCTION__); } else { dbg("TreeRouting", "%s Fail, link quality (%hu) below threshold\n", __FUNCTION__, linkEtx); } } else { //found, just update routingTable[idx].neighbor = from; routingTable[idx].info.parent = parent; routingTable[idx].info.etx = etx; routingTable[idx].info.haveHeard = 1; dbg("TreeRouting", "%s OK, updated entry\n", __FUNCTION__); } return SUCCESS; } /* if this gets expensive, introduce indirection through an array of pointers */ error_t routingTableEvict(am_addr_t neighbor) { uint8_t idx,i; idx = routingTableFind(neighbor); if (idx == routingTableActive) return FAIL; routingTableActive--; for (i = idx; i < routingTableActive; i++) { routingTable[i] = routingTable[i+1]; } return SUCCESS; } /*********** end routing table functions ***************/ /* Default implementations for CollectionDebug calls. * These allow CollectionDebug not to be wired to anything if debugging * is not desired. */ default command error_t CollectionDebug.logEvent(uint8_t type) { return SUCCESS; } default command error_t CollectionDebug.logEventSimple(uint8_t type, uint16_t arg) { return SUCCESS; } default command error_t CollectionDebug.logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3) { return SUCCESS; } default command error_t CollectionDebug.logEventMsg(uint8_t type, uint16_t msg, am_addr_t origin, am_addr_t node) { return SUCCESS; } default command error_t CollectionDebug.logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t etx) { return SUCCESS; } command bool CtpRoutingPacket.getOption(message_t* msg, ctp_options_t opt) { return ((getHeader(msg)->options & opt) == opt) ? TRUE : FALSE; } command void CtpRoutingPacket.setOption(message_t* msg, ctp_options_t opt) { getHeader(msg)->options |= opt; } command void CtpRoutingPacket.clearOption(message_t* msg, ctp_options_t opt) { getHeader(msg)->options &= ~opt; } command void CtpRoutingPacket.clearOptions(message_t* msg) { getHeader(msg)->options = 0; } command am_addr_t CtpRoutingPacket.getParent(message_t* msg) { return getHeader(msg)->parent; } command void CtpRoutingPacket.setParent(message_t* msg, am_addr_t addr) { getHeader(msg)->parent = addr; } command uint16_t CtpRoutingPacket.getEtx(message_t* msg) { return getHeader(msg)->etx; } command void CtpRoutingPacket.setEtx(message_t* msg, uint16_t etx) { getHeader(msg)->etx = etx; } command uint8_t CtpInfo.numNeighbors() { return routingTableActive; } command uint16_t CtpInfo.getNeighborLinkQuality(uint8_t n) { return (n < routingTableActive)? call LinkEstimator.getLinkQuality(routingTable[n].neighbor):0xffff; } command uint16_t CtpInfo.getNeighborRouteQuality(uint8_t n) { return (n < routingTableActive)? call LinkEstimator.getLinkQuality(routingTable[n].neighbor) + routingTable[n].info.etx:0xfffff; } command am_addr_t CtpInfo.getNeighborAddr(uint8_t n) { return (n < routingTableActive)? routingTable[n].neighbor:AM_BROADCAST_ADDR; } } tinyos-2.1.2+dfsg/tos/lib/net/ctp/CtpRoutingPacket.nc000066400000000000000000000046651207233610700224730ustar00rootroot00000000000000/* $Id: CtpRoutingPacket.nc,v 1.6 2009-09-21 02:19:42 gnawali Exp $ */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * ADT for CTP routing frames. * * @author Philip Levis * @author Kyle Jamieson * @date $Date: 2009-09-21 02:19:42 $ */ #include interface CtpRoutingPacket { /* Allow individual options to be read, set, and reset independently */ command bool getOption(message_t* ONE msg, ctp_options_t opt); command void setOption(message_t* ONE msg, ctp_options_t opt); command void clearOption(message_t* ONE msg, ctp_options_t opt); /* Clear all options */ command void clearOptions(message_t* ONE msg); command am_addr_t getParent(message_t* ONE msg); command void setParent(message_t* ONE msg, am_addr_t addr); command uint16_t getEtx(message_t* ONE msg); command void setEtx(message_t* ONE msg, uint16_t etx); } tinyos-2.1.2+dfsg/tos/lib/net/ctp/CtpSenderC.nc000066400000000000000000000042041207233610700212240ustar00rootroot00000000000000/* $Id: CtpSenderC.nc,v 1.4 2006-12-12 18:23:29 vlahan Exp $ */ /* * Copyright (c) 2006 Massachusetts Institute of Technology (MIT). * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Massachusetts Institute of Technology nor * the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * MASSACHUSETTS INSITIUTE OF TECHNOLOGY OR ITS CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * The virtualized collection sender abstraction. * * @author Kyle Jamieson * @author Philip Levis * @date April 25 2006 * @see TinyOS Net2-WG */ #include "Collection.h" #include "Ctp.h" generic configuration CtpSenderC(collection_id_t collectid) { provides { interface Send; interface Packet; } } implementation { components new CtpSenderP(collectid, unique(UQ_CTP_CLIENT)); Send = CtpSenderP; Packet = CtpSenderP; } tinyos-2.1.2+dfsg/tos/lib/net/ctp/CtpSenderP.nc000066400000000000000000000041001207233610700212340ustar00rootroot00000000000000/* $Id: CtpSenderP.nc,v 1.4 2006-12-12 18:23:29 vlahan Exp $ */ /* * Copyright (c) 2006 Massachusetts Institute of Technology (MIT). * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Massachusetts Institute of Technology nor * the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * MASSACHUSETTS INSITIUTE OF TECHNOLOGY OR ITS CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ #include "Collection.h" generic configuration CtpSenderP(collection_id_t collectid, uint8_t clientid) { provides { interface Send; interface Packet; } } implementation { components CtpC as Collector; components new CollectionIdP(collectid); Send = Collector.Send[clientid]; Packet = Collector.Packet; Collector.CollectionId[clientid] -> CollectionIdP; } tinyos-2.1.2+dfsg/tos/lib/net/ctp/DummyActiveMessageP.nc000066400000000000000000000002751207233610700231120ustar00rootroot00000000000000module DummyActiveMessageP { provides interface LinkPacketMetadata; } implementation { async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) { return 0; } } tinyos-2.1.2+dfsg/tos/lib/net/ctp/LruCtpMsgCacheC.nc000066400000000000000000000037161207233610700221500ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * An LRU cache CTP packet instances, where insertion represents use. * * @author Philip Levis */ generic configuration LruCtpMsgCacheC(uint8_t CACHE_SIZE) { provides interface Cache; } implementation { components MainC, new LruCtpMsgCacheP(CACHE_SIZE) as CacheP; components CtpP; Cache = CacheP; CacheP.CtpPacket -> CtpP; MainC.SoftwareInit -> CacheP; } tinyos-2.1.2+dfsg/tos/lib/net/ctp/LruCtpMsgCacheP.nc000066400000000000000000000107171207233610700221640ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * An LRU cache that stores the signature of a CTP packet instance. * An insert operation indicates "use". Inserting an element not in * the cache will replace the oldest, and inserting an element already * in the cache will refresh its age. * * @author Philip Levis */ #include generic module LruCtpMsgCacheP(uint8_t size) { provides { interface Init; interface Cache; } uses { interface CtpPacket; } } implementation { typedef struct { am_addr_t origin; uint8_t seqno; collection_id_t type; uint8_t thl; } ctp_packet_sig_t; ctp_packet_sig_t cache[size]; uint8_t first; uint8_t count; command error_t Init.init() { first = 0; count = 0; return SUCCESS; } void printCache() { #ifdef TOSSIM int i; dbg("Cache","Cache:"); for (i = 0; i < count; i++) { dbg_clear("Cache", " %04x %02x %02x %02x", cache[i].origin, cache[i].seqno, cache[i].type, cache[i].thl); if (i == first) dbg_clear("Cache","*"); } dbg_clear("Cache","\n"); #endif } /* if key is in cache returns the index (offset by first), otherwise returns count */ uint8_t lookup(message_t* m) { uint8_t i; uint8_t idx; for (i = 0; i < count; i++) { idx = (i + first) % size; if (call CtpPacket.getOrigin(m) == cache[idx].origin && call CtpPacket.getSequenceNumber(m) == cache[idx].seqno && call CtpPacket.getThl(m) == cache[idx].thl && call CtpPacket.getType(m) == cache[idx].type) { break; } } return i; } /* remove the entry with index i (relative to first) */ void remove(uint8_t i) { uint8_t j; if (i >= count) return; if (i == 0) { //shift all by moving first first = (first + 1) % size; } else { //shift everyone down for (j = i; j < count; j++) { memcpy(&cache[(j + first) % size], &cache[(j + first + 1) % size], sizeof(ctp_packet_sig_t)); } } count--; } command void Cache.insert(message_t* m) { uint8_t i; if (count == size ) { //remove someone. If item not in //cache, remove the first item. //otherwise remove the item temporarily for //reinsertion. This moves the item up in the //LRU stack. i = lookup(m); remove(i % count); } //now count < size cache[(first + count) % size].origin = call CtpPacket.getOrigin(m); cache[(first + count) % size].seqno = call CtpPacket.getSequenceNumber(m); cache[(first + count) % size].thl = call CtpPacket.getThl(m); cache[(first + count) % size].type = call CtpPacket.getType(m); count++; } command bool Cache.lookup(message_t* m) { return (lookup(m) < count); } command void Cache.flush() { call Init.init(); } } tinyos-2.1.2+dfsg/tos/lib/net/ctp/TreeRouting.h000066400000000000000000000011771207233610700213360ustar00rootroot00000000000000#ifndef _TREE_ROUTING_H #define _TREE_ROUTING_H enum { AM_TREE_ROUTING_CONTROL = 0xCE, BEACON_INTERVAL = 8192, INVALID_ADDR = TOS_BCAST_ADDR, ETX_THRESHOLD = 50, // link quality=20% -> ETX=5 -> Metric=50 PARENT_SWITCH_THRESHOLD = 15, MAX_METRIC = 0xFFFF, }; typedef struct { am_addr_t parent; uint16_t etx; bool haveHeard; bool congested; } route_info_t; typedef struct { am_addr_t neighbor; route_info_t info; } routing_table_entry; inline void routeInfoInit(route_info_t *ri) { ri->parent = INVALID_ADDR; ri->etx = 0; ri->haveHeard = 0; ri->congested = FALSE; } #endif tinyos-2.1.2+dfsg/tos/lib/net/dhv/000077500000000000000000000000001207233610700167035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/dhv/AMDhvC.nc000077500000000000000000000021311207233610700202670ustar00rootroot00000000000000/** * Active Message Configuration. * * Define the interfaces and components. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Took the source code from Dip **/ #include configuration AMDhvC { provides interface DhvSend; provides interface DhvReceive as DataReceive; provides interface DhvReceive as VectorReceive; provides interface DhvReceive as SummaryReceive; provides interface DhvReceive as DhvVBitReceive; provides interface DhvReceive as DhvHSumReceive; } implementation { components AMDhvP; components new AMSenderC(AM_DHV) as SendC; components new AMReceiverC(AM_DHV) as ReceiveC; AMDhvP.NetAMSend -> SendC.AMSend; AMDhvP.NetReceive -> ReceiveC.Receive; components MainC; MainC.SoftwareInit -> AMDhvP.Init; AMDhvP.Boot -> MainC; DhvSend = AMDhvP.DhvSend; DataReceive = AMDhvP.DhvDataReceive; VectorReceive = AMDhvP.DhvVectorReceive; SummaryReceive = AMDhvP.DhvSummaryReceive; DhvVBitReceive = AMDhvP.DhvVBitReceive; DhvHSumReceive = AMDhvP.DhvHSumReceive; } tinyos-2.1.2+dfsg/tos/lib/net/dhv/AMDhvP.nc000077500000000000000000000103041207233610700203050ustar00rootroot00000000000000/** * Active Message Implementation. * * Define the interfaces and components. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV interfaces type and renamed the instances to distinguish from DIP. * @modified 8/28/2008 Took the source code from DIP. **/ module AMDhvP { provides interface Init; provides interface DhvSend; provides interface DhvReceive as DhvDataReceive; provides interface DhvReceive as DhvVectorReceive; provides interface DhvReceive as DhvSummaryReceive; provides interface DhvReceive as DhvHSumReceive; provides interface DhvReceive as DhvVBitReceive; uses interface AMSend as NetAMSend; uses interface Receive as NetReceive; uses interface Boot; } implementation { message_t am_msg; uint32_t send_count; bool busy; event void Boot.booted() { send_count = 0; } command error_t Init.init() { busy = FALSE; return SUCCESS; } command error_t DhvSend.send(uint8_t len) { error_t err; dhv_msg_t* dmsg; uint8_t type; dmsg = (dhv_msg_t *) (&am_msg)->data; type = dmsg->type; send_count = send_count + 1; switch(type){ case ID_DHV_SUMMARY: dbg("AMDhvP", "Sending SUMMARY : length %d count %d at %s \n", len, send_count, sim_time_string()); break; case ID_DHV_VBIT: dbg("AMDhvP", "Sending VBIT : length %d count %d at %s \n", len, send_count, sim_time_string()); break; case ID_DHV_HSUM: dbg("AMDhvP", "Sending HSUM : length %d count %d at %s \n", len, send_count, sim_time_string()); break; case ID_DHV_VECTOR: dbg("AMDhvP", "Sending VECTOR : length %d count %d at %s \n", len, send_count, sim_time_string()); break; case ID_DHV_VECTOR_REQ: dbg("AMDhvP", "Sending VECTOR_REQ : length %d count %d at %s \n", len, send_count, sim_time_string()); break; case ID_DHV_DATA: dbg("AMDhvP", "Sending DATA : length %d count %d at %s \n", len, send_count, sim_time_string()); break; default : dbg("AMDhvP", "Sending UNKNOWN : length %d count %d at %s \n", len, send_count, sim_time_string()); break; } err = call NetAMSend.send(AM_BROADCAST_ADDR, &am_msg, len); if(err == SUCCESS) { busy = TRUE; }else{ dbg("AMDhvP", "Send failed \n"); } return err; } command void* DhvSend.getPayloadPtr() { // returns NULL if message is busy if(busy) { return NULL; } return call NetAMSend.getPayload(&am_msg, 0); } command uint8_t DhvSend.maxPayloadLength() { return call NetAMSend.maxPayloadLength(); } event void NetAMSend.sendDone(message_t* msg, error_t err) { //dbg("AMDhvP", "Data send successfully in the air\n"); if(msg == &am_msg) { busy = FALSE; } } event message_t* NetReceive.receive(message_t* msg, void* payload, uint8_t len) { dhv_msg_t* dmsg; uint8_t type; dmsg = (dhv_msg_t*) payload; type = dmsg->type; switch(type) { case ID_DHV_DATA: dbg("AMDhvPReceive", "Receive DATA : length %d at %s \n",len, sim_time_string() ); signal DhvDataReceive.receive(dmsg->content, len); break; case ID_DHV_VECTOR: dbg("AMDhvPReceive", "Receive VECTOR : length %d at %s \n",len, sim_time_string() ); signal DhvVectorReceive.receive(dmsg, len); break; case ID_DHV_SUMMARY: dbg("AMDhvPReceive", "Receive SUMMARY : length %d at %s \n", len, sim_time_string() ); signal DhvSummaryReceive.receive(dmsg->content, len); break; case ID_DHV_HSUM: dbg("AMDhvPReceive", "Receive HSUM length %d at %s \n", len, sim_time_string()); signal DhvHSumReceive.receive(dmsg->content, len); break; case ID_DHV_VBIT: dbg("AMDhvPReceive", "Receive VBIT : length %d at %s \n", len, sim_time_string()); signal DhvVBitReceive.receive(dmsg->content, len); break; case ID_DHV_VECTOR_REQ: dbg("AMDhvPReceive", "Receive VECTOR_REQ : length %d at %s \n", len, sim_time_string()); signal DhvVectorReceive.receive(dmsg, len); break; } return msg; } } tinyos-2.1.2+dfsg/tos/lib/net/dhv/Dhv.h000077500000000000000000000047741207233610700176140ustar00rootroot00000000000000/** * DHV header file. * * Define the interfaces and components. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV packet type and renamed the variable * @modified 8/28/2008 Take the source code from Dip **/ #ifndef __DHV_H__ #define __DHV_H__ #define DHV_TAU_LOW (1024L) #define DHV_TAU_HIGH (65535L) #define UQ_DHV unique("DHV") #define UQCOUNT_DHV uniqueCount("DHV") #define DHV_UNKNOWN_VERSION 0xFFFFFFFF #define DHV_UNKNOWN_INDEX 0xFFFF #define DHV_VERSION_LENGTH 4 #define VBIT_LENGTH 8 #define INFO_THRESHOLD 1 enum { AM_DHV_TEST_MSG = 0xAB }; typedef enum { ID_DHV_INVALID = 0x0, ID_DHV_SUMMARY = 0x1, ID_DHV_VECTOR = 0x2, ID_DHV_DATA = 0x3, ID_DHV_HSUM = 0x4, ID_DHV_VBIT = 0x5, ID_DHV_VECTOR_REQ = 0x6 } dhv_msgid_t; //status indicator : no action, ads, request enum{ ID_DHV_NO = 0x0, ID_DHV_ADS = 0x1, ID_DHV_REQ = 0x2 }; enum { AM_DHV = 0x63, AM_DHV_DATA_MSG = 0x63, // For MIG tool AM_DHV_MSG = 0x63, // For MIG tool AM_DHV_DATA = 0x63 // For MIG tool }; typedef uint16_t dhv_key_t; typedef uint16_t dhv_index_t; typedef nx_uint16_t nx_dhv_key_t; typedef uint32_t dhv_version_t; typedef nx_uint32_t nx_dhv_version_t; typedef uint8_t dhv_estimate_t; typedef dhv_index_t dhv_hashlen_t; typedef nx_struct dhv_msg { nx_uint8_t type; nx_uint8_t content[0]; } dhv_msg_t; typedef nx_struct dhv_data_msg { nx_dhv_key_t key; nx_dhv_version_t version; nx_uint8_t size; nx_uint8_t data[0]; } dhv_data_msg_t; typedef nx_struct dhv_vector_msg { nx_uint8_t unitLen; nx_uint32_t vector[0]; } dhv_vector_msg_t; typedef nx_struct dhv_summary_msg { //nx_uint8_t unitLen; nx_uint32_t salt; nx_uint32_t info; } dhv_summary_msg_t; typedef nx_struct dhv_hsum_msg{ nx_uint32_t salt; nx_uint32_t info; nx_uint32_t checksum; } dhv_hsum_msg_t; typedef nx_struct dhv_vbit_msg{ nx_uint8_t numKey; nx_uint8_t bindex; nx_uint8_t vindex; nx_uint32_t salt; nx_uint32_t info; //include hash into vbit message nx_uint8_t vbit[0]; }dhv_vbit_msg_t; typedef nx_struct dhv_data { nx_uint8_t data[16]; } dhv_data_t; typedef nx_struct dhv_test_msg { nx_uint16_t id; nx_uint8_t count; nx_uint8_t isOk; } dhv_test_msg_t; /* TUNABLE PARAMETERS */ #define DHV_SUMMARY_VALUES_PER_PACKET 2 #define DHV_VECTOR_VALUES_PER_PACKET 2 #define DHV_SUMMARY_ENTRIES_PER_PACKET (DHV_SUMMARY_VALUES_PER_PACKET * 3) #define DHV_VECTOR_ENTRIES_PER_PACKET (DHV_VECTOR_VALUES_PER_PACKET * 2) #endif tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvDataC.nc000077500000000000000000000017621207233610700206540ustar00rootroot00000000000000/** * DHV header file. * * Define the interfaces and components. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV packet type and renamed the variable * @modified 8/28/2008 Take the source code from Dip **/ configuration DhvDataC { provides interface DhvDecision; uses interface DhvSend as DataSend; uses interface DhvReceive as DataReceive; uses interface DisseminationUpdate[dhv_key_t key]; uses interface DisseminationValue[dhv_key_t key]; uses interface DhvLogic as DataLogic; uses interface DhvLogic as VectorLogic; uses interface DhvHelp; } implementation { components DhvDataP; DhvDecision = DhvDataP; DataSend = DhvDataP; DataReceive = DhvDataP; DisseminationUpdate = DhvDataP; DisseminationValue = DhvDataP; DhvHelp = DhvDataP; DataLogic = DhvDataP.DataLogic; VectorLogic = DhvDataP.VectorLogic; components LedsC; DhvDataP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvDataP.nc000077500000000000000000000064501207233610700206700ustar00rootroot00000000000000/** * DHV DATA Implementation. * * Define the interfaces and components. * * @author Thanh Dang * @author Seungweon Park * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV interfaces type. * @modified 8/28/2008 Took the source code from DIP. **/ #include module DhvDataP { provides interface DhvDecision; uses interface DhvSend as DataSend; uses interface DhvReceive as DataReceive; uses interface DisseminationUpdate[dhv_key_t key]; uses interface DisseminationValue[dhv_key_t key]; uses interface DhvLogic as DataLogic; uses interface DhvLogic as VectorLogic; uses interface DhvHelp; uses interface Leds; } implementation { uint8_t commRate = 0; command uint8_t DhvDecision.getCommRate() { return commRate; } command void DhvDecision.resetCommRate() { commRate = 0; } command error_t DhvDecision.send() { dhv_key_t key; uint8_t i; dhv_version_t ver; dhv_msg_t* dmsg; dhv_data_msg_t* ddmsg; const dhv_data_t* data; error_t status; status = FAIL; //get the associated key of the data needed to send i = call DataLogic.nextItem(); if(i == UQCOUNT_DHV){ return FAIL; } key = call DhvHelp.indexToKey(i); ver = call DhvHelp.keyToVersion(key); data = call DisseminationValue.get[key](); dmsg = (dhv_msg_t*) call DataSend.getPayloadPtr(); if(dmsg == NULL) { return FAIL; } ddmsg = (dhv_data_msg_t*) dmsg->content; dmsg->type = ID_DHV_DATA; ddmsg->key = key; ddmsg->version = ver; ddmsg->size = sizeof(dhv_data_t); memcpy(ddmsg->data, data, sizeof(dhv_data_t)); dbg("DhvDataP", "Data sent with index %d key %x and version %08x\n",i, key, ver); status = call DataSend.send(sizeof(dhv_data_msg_t) + sizeof(dhv_msg_t) + sizeof(dhv_data_t)); if(status == SUCCESS){ call DataLogic.unsetItem(key); } return status; } event void DataReceive.receive(void* payload, uint8_t len) { dhv_key_t key; dhv_version_t myVer; dhv_version_t msgVer; dhv_data_msg_t* ddmsg; ddmsg = (dhv_data_msg_t*) payload; key = ddmsg->key; msgVer = ddmsg->version; myVer = call DhvHelp.keyToVersion(key); dbg("DhvDataP", "Data rcved with key %x and version %08x\n", key, msgVer); // TODO: handle the invalid versions if(myVer < msgVer) { dbg("DhvDataP", "new version\n"); call DisseminationUpdate.change[key]((dhv_data_t*)ddmsg->data); call DhvHelp.setVersion(key, msgVer); call DataLogic.setItem(key); call VectorLogic.setItem(key); //set bindex to 0 } else if (myVer > msgVer) { dbg("DhvDataP", "Old version\n"); //report older key to dhvlogic to set data item to send //reset timer call DataLogic.setItem(key); call VectorLogic.setItem(key); } else { dbg("DhvDataP", "Same version\n"); //keep quite call DataLogic.unsetItem(key); call VectorLogic.unsetItem(key); commRate = commRate + 1; //set bindex to 0 } } event void DisseminationValue.changed[dhv_key_t key]() { } default command const dhv_data_t* DisseminationValue.get[dhv_key_t key]() { return NULL; } default command void DisseminationUpdate.change[dhv_key_t key](dhv_data_t* val) { } } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvHSumC.nc000077500000000000000000000012541207233610700206530ustar00rootroot00000000000000/** * DHV Horizontal Summary Implementation. * * Define the interfaces and components. * * @author Thanh Dang * @author Seungweon Park * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV interfaces type. **/ configuration DhvHSumC{ provides interface DhvDecision; uses interface DhvSend as HSumSend; uses interface DhvReceive as HSumReceive; uses interface DhvStateLogic as VBitLogic; uses interface DhvHelp; } implementation{ components DhvHSumP, RandomC; DhvDecision = DhvHSumP; HSumSend = DhvHSumP; HSumReceive = DhvHSumP; VBitLogic = DhvHSumP; DhvHelp = DhvHSumP; DhvHSumP.Random -> RandomC; } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvHSumP.nc000077500000000000000000000045061207233610700206730ustar00rootroot00000000000000/** * DHV Horizontal Summary Implementation. * * Define the interfaces and components. * * @author Thanh Dang * @author Seungweon Park * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV interfaces type. **/ #include module DhvHSumP{ provides interface DhvDecision; uses interface DhvSend as HSumSend; uses interface DhvReceive as HSumReceive; uses interface DhvStateLogic as VBitLogic; uses interface DhvHelp; uses interface Random; } implementation{ uint8_t commRate; command uint8_t DhvDecision.getCommRate(){ return commRate; } command void DhvDecision.resetCommRate(){ commRate = 0; } command error_t DhvDecision.send(){ dhv_hsum_msg_t* dhsmsg; dhv_msg_t* dmsg; uint32_t salt; error_t sendResult; dmsg = call HSumSend.getPayloadPtr(); if(dmsg == NULL) return FAIL; dmsg->type = ID_DHV_HSUM; dhsmsg = (dhv_hsum_msg_t*) dmsg->content; //add the hash value salt = call Random.rand32(); dhsmsg->info = call DhvHelp.computeHash(0, UQCOUNT_DHV, salt); dhsmsg->salt = salt; dhsmsg->checksum = call DhvHelp.getHSum(); sendResult = call HSumSend.send(sizeof(dhv_msg_t) + sizeof(dhv_hsum_msg_t)); if(sendResult == SUCCESS){ call VBitLogic.unsetHSumStatus(); } return sendResult; } event void HSumReceive.receive(void* payload, uint8_t len){ dhv_hsum_msg_t * rcv_dhmsg; int32_t local_checksum; int32_t rcv_checksum; int32_t xor_checksum; int32_t salt; int32_t rcv_hash; int32_t local_hash; rcv_dhmsg = (dhv_hsum_msg_t*) payload; rcv_checksum = rcv_dhmsg->checksum; local_checksum = call DhvHelp.getHSum(); xor_checksum = rcv_checksum^local_checksum; dbg("DhvHSumP", " xor_checksum 0x%08x 0x%08x 0x%08x \n",rcv_checksum, local_checksum, xor_checksum); if(xor_checksum == 0){ //check for the hash rcv_hash = rcv_dhmsg->info; salt = rcv_dhmsg->salt; local_hash = call DhvHelp.computeHash(0, UQCOUNT_DHV, salt); if(rcv_hash == local_hash) { call VBitLogic.setSameSummary(); commRate = commRate + 1; }else{ call VBitLogic.setVBitState(1); } }else{ dbg("DhvHSumP"," detect a difference in checksum \n" ); call VBitLogic.setVBitState(xor_checksum); } } } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvLogicC.nc000077500000000000000000000047511207233610700210410ustar00rootroot00000000000000/** * DHV Logic Implementation. * * Define the interfaces and components. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV interfaces type. * @modified 8/28/2008 Took the source code from DIP. **/ #include configuration DhvLogicC { provides interface DisseminationUpdate[dhv_key_t key]; provides interface DhvLogic as DataLogic; provides interface DhvLogic as VectorLogic; provides interface DhvStateLogic; provides interface StdControl; } implementation { components DhvLogicP; DisseminationUpdate = DhvLogicP; StdControl = DhvLogicP; DataLogic = DhvLogicP.DataLogic; VectorLogic= DhvLogicP.VectorLogic; DhvStateLogic = DhvLogicP; components MainC; MainC.SoftwareInit -> DhvLogicP; DhvLogicP.Boot -> MainC; components DhvTrickleMilliC; DhvLogicP.DhvTrickleTimer -> DhvTrickleMilliC; components DhvVersionC; DhvLogicP.VersionUpdate -> DhvVersionC; DhvLogicP.DhvHelp -> DhvVersionC; DhvLogicP.DhvDataCache -> DhvVersionC.DataCache; DhvLogicP.DhvVectorCache -> DhvVersionC.VectorCache; components AMDhvC; components DhvDataC; DhvLogicP.DhvDataDecision -> DhvDataC; DhvDataC.DataSend -> AMDhvC.DhvSend; DhvDataC.DataReceive -> AMDhvC.DataReceive; DhvDataC.DhvHelp -> DhvVersionC; DhvDataC.DataLogic -> DhvLogicP.DataLogic; DhvDataC.VectorLogic -> DhvLogicP.VectorLogic; components DhvVectorC; DhvLogicP.DhvVectorDecision -> DhvVectorC; DhvVectorC.VectorSend -> AMDhvC.DhvSend; DhvVectorC.VectorReceive -> AMDhvC.VectorReceive; DhvVectorC.DhvHelp -> DhvVersionC; DhvVectorC.VectorLogic -> DhvLogicP.VectorLogic; DhvVectorC.DataLogic -> DhvLogicP.DataLogic; components DhvSummaryC; DhvLogicP.DhvSummaryDecision -> DhvSummaryC; DhvSummaryC.SummarySend -> AMDhvC.DhvSend; DhvSummaryC.SummaryReceive -> AMDhvC.SummaryReceive; DhvSummaryC.DhvHelp -> DhvVersionC; DhvSummaryC.StateLogic -> DhvLogicP.DhvStateLogic; components DhvVBitC; DhvLogicP.DhvVBitDecision -> DhvVBitC; DhvVBitC.VBitSend -> AMDhvC.DhvSend; DhvVBitC.VBitReceive -> AMDhvC.DhvVBitReceive; DhvVBitC.DhvHelp -> DhvVersionC; DhvVBitC.VectorLogic -> DhvLogicP.VectorLogic; DhvVBitC.VBitLogic -> DhvLogicP.DhvStateLogic; components DhvHSumC; DhvHSumC.VBitLogic -> DhvLogicP.DhvStateLogic; DhvHSumC.DhvHelp -> DhvVersionC; DhvHSumC.HSumSend -> AMDhvC.DhvSend; DhvHSumC.HSumReceive-> AMDhvC.DhvHSumReceive; DhvLogicP.DhvHSumDecision -> DhvHSumC; } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvLogicP.nc000077500000000000000000000207221207233610700210520ustar00rootroot00000000000000/** * DHV Logic Implementation. * * Define the interfaces and components. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV interfaces type. * @modified 8/28/2008 Took the source code from DIP. **/ #include module DhvLogicP { provides interface DisseminationUpdate[dhv_key_t key]; provides interface Init; provides interface StdControl; provides interface DhvLogic as VectorLogic; provides interface DhvLogic as DataLogic; provides interface DhvStateLogic; uses interface Boot; uses interface DhvTrickleTimer; uses interface DisseminationUpdate as VersionUpdate[dhv_key_t key]; uses interface DhvDecision as DhvDataDecision; uses interface DhvDecision as DhvVectorDecision; uses interface DhvDecision as DhvSummaryDecision; uses interface DhvDecision as DhvVBitDecision; uses interface DhvDecision as DhvHSumDecision; uses interface DhvCache as DhvDataCache; uses interface DhvCache as DhvVectorCache; uses interface DhvHelp; } implementation { uint32_t windowSize; uint8_t sendDecision(); uint32_t bitIndex; uint8_t hsum_status; uint32_t diffHash; command error_t Init.init() { windowSize = DHV_TAU_LOW; dbg("DhvLogicP","DHV ready\n"); return SUCCESS; } event void Boot.booted() { hsum_status = 0; bitIndex = 0; } command error_t StdControl.start() { return call DhvTrickleTimer.start(); } command error_t StdControl.stop() { call DhvTrickleTimer.stop(); return SUCCESS; } /*Logic operation on the vector */ command error_t VectorLogic.setItem(dhv_key_t key){ call DhvVectorCache.addItem(key); call DhvTrickleTimer.reset(); return SUCCESS; } command error_t VectorLogic.setReqItem(dhv_key_t key){ call DhvVectorCache.addReqItem(key); call DhvTrickleTimer.reset(); return SUCCESS; } command error_t VectorLogic.unsetItem(dhv_key_t key){ call DhvVectorCache.removeItem(key); call DhvStateLogic.setVBitState(0); return SUCCESS; } command uint8_t * VectorLogic.allItem(){ return call DhvVectorCache.allItem(); } command uint8_t VectorLogic.nextItem(){ return call DhvVectorCache.nextItem(); } /*logic operations on the data*/ command error_t DataLogic.setItem(dhv_key_t key){ call DhvDataCache.addItem( key); call DhvTrickleTimer.reset(); return SUCCESS; } command error_t DataLogic.setReqItem(dhv_key_t key){ call DhvDataCache.addReqItem( key); call DhvTrickleTimer.reset(); return SUCCESS; } command error_t DataLogic.unsetItem(dhv_key_t key){ call DhvDataCache.removeItem(key); call DhvStateLogic.setVBitState(0); return SUCCESS; } command uint8_t* DataLogic.allItem(){ return call DhvDataCache.allItem(); } command uint8_t DataLogic.nextItem(){ return call DhvDataCache.nextItem(); } /*logic operation for the summary and vbit*/ command void DhvStateLogic.setHSumStatus(){ hsum_status = 1; call DhvTrickleTimer.reset(); } command void DhvStateLogic.unsetHSumStatus(){ hsum_status = 0; } command uint8_t DhvStateLogic.getHSumStatus(){ return hsum_status; } command void DhvStateLogic.setDiffSummary(){ if(bitIndex == 0){ bitIndex=1; } call DhvTrickleTimer.reset(); } command void DhvStateLogic.setSameSummary(){ bitIndex = 0; hsum_status = 0; //reset all the vector and data status to avoid flooding call DhvDataCache.removeAll(); call DhvVectorCache.removeAll(); } command void DhvStateLogic.setVBitState(uint32_t state){ bitIndex = state; if(state != 0){ call DhvTrickleTimer.reset(); } } command uint32_t DhvStateLogic.getVBitState(){ return bitIndex; } //unset one bit at index location command void DhvStateLogic.unsetVBitIndex(uint8_t dindex){ uint32_t mask; mask = 1; mask = mask << (dindex-1); dbg("TempDebug", "TempDebug: Before mask dindex bitIndex %d %d %d\n", mask, dindex, bitIndex); if((bitIndex & mask) != 0){ bitIndex = bitIndex^mask; } dbg("TempDebug", "TempDebug: After bitIndex %d\n", bitIndex); } command void DhvStateLogic.setVBitIndex(uint8_t dindex){ uint32_t mask; mask = 1; mask = mask << (dindex-1); bitIndex = bitIndex | mask; call DhvTrickleTimer.reset(); } //get the non-zero bit index to extract the vertical bits. command uint8_t DhvStateLogic.getVBitIndex(){ uint32_t mask; uint8_t i; uint32_t xor; if(bitIndex == 0){ return 0; }else { mask = 1; for(i = 1; i <= 32; i++){ xor = bitIndex & mask; dbg("TempDebug", "TempDebug: %d %d %d %d \n", i, bitIndex, mask, xor); if(xor != 0){ return i; } mask = mask << 1; } return 0; } } command void DisseminationUpdate.change[dhv_key_t key](dhv_data_t* val) { dbg("DhvLogicP","App notified key %x is new\n", key); //update data: actual reprogramming job call VersionUpdate.change[key](val); //set data call DhvDataCache.addItem(key); //set to advertise its version call DhvVectorCache.addItem(key); //reset bindex call DhvStateLogic.setVBitState(0); dbg("DhvLogicP","Reset bindex to 0\n"); //reset timer call DhvTrickleTimer.reset(); } event uint32_t DhvTrickleTimer.requestWindowSize() { //TODO: consider if this is neccessary uint8_t decision; decision = sendDecision(); if(decision == ID_DHV_SUMMARY){ windowSize = windowSize << 1; if(windowSize > DHV_TAU_HIGH){ windowSize = DHV_TAU_HIGH; } }else{ if(decision != ID_DHV_INVALID){ windowSize = DHV_TAU_LOW; } } dbg("DhvLogicP", "Time window size requested, give %u : send decision %d \n", windowSize, decision); return windowSize; } event void DhvTrickleTimer.fired() { uint8_t decision; dbg("DhvLogicP","Trickle Timer fired!\n"); decision = sendDecision(); switch(decision) { case ID_DHV_INVALID: dbg("DhvLogicP", "Decision to SUPPRESS\n"); break; case ID_DHV_SUMMARY: dbg("DhvLogicP", "Decision to SUMMARY\n"); call DhvSummaryDecision.send(); break; case ID_DHV_VECTOR: dbg("DhvLogicP", "Decision to VECTOR\n"); call DhvVectorDecision.send(); break; case ID_DHV_DATA: dbg("DhvLogicP", "Decision to DATA\n"); call DhvDataDecision.send(); break; case ID_DHV_VBIT: dbg("DhvLogicP", "Decision to VSUM\n"); call DhvVBitDecision.send(); break; case ID_DHV_HSUM: dbg("DhvLogicP", "Decision to HSUM\n"); call DhvHSumDecision.send(); break; } call DhvDataDecision.resetCommRate(); call DhvVectorDecision.resetCommRate(); call DhvSummaryDecision.resetCommRate(); call DhvVBitDecision.resetCommRate(); call DhvHSumDecision.resetCommRate(); //set bitstate to zero call DhvStateLogic.setVBitState(0); } uint8_t sendDecision() { bool hasItemToSend; uint32_t bindex; uint8_t dataCommRate; uint8_t vectorCommRate; uint8_t summaryCommRate; uint8_t vbitCommRate; uint8_t hsumCommRate; dataCommRate = call DhvDataDecision.getCommRate(); vectorCommRate = call DhvVectorDecision.getCommRate(); summaryCommRate = call DhvSummaryDecision.getCommRate(); vbitCommRate = call DhvVBitDecision.getCommRate(); hsumCommRate = call DhvHSumDecision.getCommRate(); if(dataCommRate > INFO_THRESHOLD){ return ID_DHV_INVALID; } hasItemToSend = FALSE; hasItemToSend = call DhvDataCache.hasItemToSend(); if(hasItemToSend){ dbg("DhvLogicP", "has data to send? %u \n", hasItemToSend); return ID_DHV_DATA; } // didn't send or hear data at this point if(dataCommRate + vectorCommRate + summaryCommRate + vbitCommRate + hsumCommRate >= INFO_THRESHOLD) { dbg("DhvLogicP", "Heard an advertisement\n"); return ID_DHV_INVALID; } hasItemToSend = call DhvVectorCache.hasItemToSend(); dbg("DhvLogicP", "has vector to send? %u \n", hasItemToSend); if(hasItemToSend){ return ID_DHV_VECTOR; } bindex = call DhvStateLogic.getVBitState(); dbg("DhvLogicP", "send decision bindex %d \n", bindex); if(bindex != 0){ return ID_DHV_VBIT; } if(hsum_status != 0){ return ID_DHV_HSUM; } return ID_DHV_SUMMARY; } } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvSummaryC.nc000077500000000000000000000014121207233610700214300ustar00rootroot00000000000000/** * DHV Summary Message Configuration. * * Define the interfaces and components. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV interfaces type. * @modified 8/28/2008 Took the source code from DIP. **/ configuration DhvSummaryC { provides interface DhvDecision; uses interface DhvSend as SummarySend; uses interface DhvReceive as SummaryReceive; uses interface DhvStateLogic as StateLogic; uses interface DhvHelp; } implementation { components DhvSummaryP; DhvDecision = DhvSummaryP; SummarySend = DhvSummaryP; SummaryReceive = DhvSummaryP; StateLogic = DhvSummaryP; DhvHelp = DhvSummaryP; components RandomC; DhvSummaryP.Random -> RandomC; } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvSummaryP.nc000077500000000000000000000037061207233610700214550ustar00rootroot00000000000000/** * DHV Summary Message Implementation. * * Define the interfaces and components. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV interfaces type. * @modified 8/28/2008 Took the source code from DIP. **/ #include module DhvSummaryP { provides interface DhvDecision; uses interface DhvSend as SummarySend; uses interface DhvReceive as SummaryReceive; uses interface DhvHelp; uses interface Random; uses interface DhvStateLogic as StateLogic; } implementation { uint32_t computeHash(dhv_index_t left, dhv_index_t right, dhv_version_t* basedata, uint32_t salt); uint8_t commRate; command uint8_t DhvDecision.getCommRate() { return commRate; } command void DhvDecision.resetCommRate() { commRate = 0; } command error_t DhvDecision.send() { uint32_t salt; dhv_msg_t* dmsg; dhv_summary_msg_t* dsmsg; dmsg = (dhv_msg_t*) call SummarySend.getPayloadPtr(); if(dmsg == NULL) return FAIL; dmsg->type = ID_DHV_SUMMARY; dsmsg = (dhv_summary_msg_t*) dmsg->content; salt = call Random.rand32(); dsmsg->info = call DhvHelp.computeHash(0, UQCOUNT_DHV, salt); dsmsg->salt = salt; dbg("DhvSummaryP", "Hash Entry: %08x \n", dsmsg->info); return call SummarySend.send(sizeof(dhv_msg_t) + sizeof(dhv_summary_msg_t)); } event void SummaryReceive.receive(void* payload, uint8_t len) { dhv_summary_msg_t* dsmsg; uint32_t salt, myHash; dsmsg = (dhv_summary_msg_t*) payload; salt = dsmsg->salt; myHash = call DhvHelp.computeHash(0, UQCOUNT_DHV, salt); if(myHash != dsmsg->info) { //call StateLogic.setDiffSummary(); call StateLogic.setHSumStatus(); dbg("DhvSummaryP", "Hashes don't match\n"); } else { call StateLogic.setSameSummary(); commRate = commRate + 1; dbg("DhvSummaryP", "Hashes match\n"); } } } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvTrickleMilliC.nc000077500000000000000000000053271207233610700223700ustar00rootroot00000000000000// $Id: DhvTrickleMilliC.nc,v 1.2 2010-06-29 22:07:49 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Configuration that encapsulates the trickle timer implementation to * its needed services and initialization. For details on the working * of the parameters, please refer to Levis et al., "A Self-Regulating * Algorithm for Code Maintenance and Propagation in Wireless Sensor * Networks," NSDI 2004. * * @param l Lower bound of the time period in seconds. * @param h Upper bound of the time period in seconds. * @param k Redundancy constant. * @param count How many timers to provide. * * @author Philip Levis * @author Gilman Tolle * @date Jan 7 2006 */ configuration DhvTrickleMilliC { provides interface DhvTrickleTimer as TrickleTimer; } implementation { components DhvTrickleMilliP as TrickleP; components MainC, RandomC; components new TimerMilliC() as PeriodicIntervalTimer; components new TimerMilliC() as SingleEventTimer; components LedsC; TrickleTimer = TrickleP; TrickleP.PeriodicIntervalTimer -> PeriodicIntervalTimer; TrickleP.SingleEventTimer -> SingleEventTimer; TrickleP.Random -> RandomC; TrickleP.Leds -> LedsC; MainC.SoftwareInit -> TrickleP; } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvTrickleMilliP.nc000077500000000000000000000101251207233610700223750ustar00rootroot00000000000000// $Id: DhvTrickleMilliP.nc,v 1.2 2010-06-29 22:07:49 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Module that provides a service instance of trickle timers. For * details on the working of the parameters, please refer to Levis et * al., "A Self-Regulating Algorithm for Code Maintenance and * Propagation in Wireless Sensor Networks," NSDI 2004. * * @param l Lower bound of the time period in seconds. * @param h Upper bound of the time period in seconds. * @param k Redundancy constant. * @param count How many timers to provide. * * @author Philip Levis * @author Gilman Tolle * @date Jan 7 2006 */ #include #include module DhvTrickleMilliP { provides { interface Init; interface DhvTrickleTimer as TrickleTimer; } uses { interface Timer as PeriodicIntervalTimer; interface Timer as SingleEventTimer; interface Random; interface Leds; } } implementation { uint32_t period; command error_t Init.init() { period = DHV_TAU_HIGH; return SUCCESS; } /** * Start a trickle timer. Reset the counter to 0. */ command error_t TrickleTimer.start() { call PeriodicIntervalTimer.startOneShot(period); dbg("DhvTrickleMilliP", "Starting trickle timer @ %s\n", sim_time_string()); return SUCCESS; } /** * Stop the trickle timer. This call sets the timer period to H. */ command void TrickleTimer.stop() { call PeriodicIntervalTimer.stop(); dbg("DhvTrickleMilliP", "Stopping trickle timer @ %s\n", sim_time_string()); } /** * Reset the timer period to L. If called while the timer is running, * then a new interval (of length L) begins immediately. */ command void TrickleTimer.reset() { period = DHV_TAU_LOW; call PeriodicIntervalTimer.stop(); call PeriodicIntervalTimer.startOneShot(period); dbg("DhvTrickleMilliP", "Resetting trickle timer @ %s\n", sim_time_string()); } command void TrickleTimer.maxInterval() { period = DHV_TAU_HIGH; } /** * The trickle timer has fired. Signaled if C > K. */ event void PeriodicIntervalTimer.fired() { uint32_t dtfire; dtfire = (call Random.rand16() % (period / 2)) + (period / 2); dbg("DhvTrickleMilliP", "Scheduling Trickle event with %u\n", dtfire); call SingleEventTimer.startOneShot(dtfire); period = signal TrickleTimer.requestWindowSize(); call PeriodicIntervalTimer.startOneShot(period); //call Leds.led0Toggle(); } event void SingleEventTimer.fired() { dbg("Trickle", "Firing Trickle Event Timer\n"); signal TrickleTimer.fired(); } } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvVBitC.nc000077500000000000000000000013401207233610700206370ustar00rootroot00000000000000/** * DHV Virtual Bits Check Configuration * * Define interfaces and components. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV modules. **/ configuration DhvVBitC{ provides interface DhvDecision; uses interface DhvSend as VBitSend; uses interface DhvReceive as VBitReceive; uses interface DhvStateLogic as VBitLogic; uses interface DhvLogic as VectorLogic; uses interface DhvHelp; } implementation{ components DhvVBitP; DhvDecision = DhvVBitP; VBitSend = DhvVBitP; VBitReceive = DhvVBitP; VBitLogic = DhvVBitP; VectorLogic = DhvVBitP; DhvHelp = DhvVBitP; components RandomC; DhvVBitP.Random -> RandomC; } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvVBitP.nc000077500000000000000000000141301207233610700206550ustar00rootroot00000000000000/** * DHV Virtual Bits Check Configuration * * Define interfaces and components. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV modules. **/ #include module DhvVBitP{ provides interface DhvDecision; uses interface DhvSend as VBitSend; uses interface DhvReceive as VBitReceive; uses interface DhvStateLogic as VBitLogic; uses interface DhvLogic as VectorLogic; uses interface DhvHelp; uses interface Random; } implementation{ uint8_t commRate; command uint8_t DhvDecision.getCommRate() { return commRate; } command void DhvDecision.resetCommRate(){ commRate = 0; } /*construct a vector of bits and send it*/ command error_t DhvDecision.send(){ uint8_t bindex; uint8_t vbit_size; uint8_t msg_size; uint8_t numMsg; uint8_t maxDataLength; uint8_t i, j; dhv_msg_t* dmsg; dhv_vbit_msg_t* dvbmsg; uint8_t *versionPtr; error_t sendResult; uint32_t salt; maxDataLength = TOSH_DATA_LENGTH - sizeof(dhv_msg_t) - sizeof(dhv_vbit_msg_t); sendResult = FAIL; if(UQCOUNT_DHV != 0) { vbit_size = ((uint8_t)(UQCOUNT_DHV-1)/VBIT_LENGTH) + 1; numMsg = (vbit_size -1)/maxDataLength + 1; }else { vbit_size = 0; numMsg = 0; } bindex = call VBitLogic.getVBitIndex(); //return if 0 if(bindex == 0){ dbg("DhvVBitP", "Error: no vbit to send \n"); } dmsg = call VBitSend.getPayloadPtr(); if(dmsg == NULL) return FAIL; dmsg->type = ID_DHV_VBIT; dvbmsg = (dhv_vbit_msg_t*) dmsg->content; dvbmsg->bindex = bindex; //put the hash into the message salt = call Random.rand32(); dvbmsg->info = call DhvHelp.computeHash(0, UQCOUNT_DHV, salt); dvbmsg->salt = salt; //put the vbit into the message versionPtr = call DhvHelp.getVBits(bindex); for(j = 0; j < numMsg; j++){//number of tos message_t if(j == numMsg-1){ //last message msg_size = vbit_size - j*maxDataLength; }else{ msg_size = maxDataLength; } //TODO: need to get this right dvbmsg->numKey = msg_size*8; //number of keys for(i = 0; i < msg_size; i++){ dvbmsg->vindex = j; dvbmsg->vbit[i] = versionPtr[j*maxDataLength + i]; dbg("DhvVBitP", "bindex %d vbit %d: 0x%02x 0x%02x \n",bindex, i, dvbmsg->vbit[i], versionPtr[i]); } //dbg("DhvVBitP", "Sending vbit of index %d size %d \n", bindex, sizeof(dhv_msg_t) + sizeof(dhv_vbit_msg_t) + msg_size ); for(i = 0; i < msg_size; i++){ dbg("DhvVBitP", "vbit to send %d, 0x%02x \n", i, dvbmsg->vbit[i]); } //send the vbit out sendResult = call VBitSend.send(sizeof(dhv_msg_t) + sizeof(dhv_vbit_msg_t) + msg_size); if(sendResult == SUCCESS){ //call VBitLogic.unsetVBitIndex(bindex); call VBitLogic.setVBitState(0); call VBitLogic.unsetHSumStatus(); } } return sendResult; } event void VBitReceive.receive(void* payload, uint8_t len){ dhv_vbit_msg_t * rcv_dvbmsg; uint8_t bindex, vindex; int i,j; dhv_version_t version; dhv_version_t mask; uint8_t diffIndex; dhv_key_t diffKey; bool isDiff; uint8_t vbit_size; uint8_t* vbit; uint32_t salt, myHash; uint8_t maxDataLength; uint8_t msg_size; uint8_t numMsg; uint32_t bitIndexValue; isDiff = FALSE; maxDataLength = TOSH_DATA_LENGTH - sizeof(dhv_msg_t) - sizeof(dhv_vbit_msg_t); if(UQCOUNT_DHV != 0) { vbit_size = ((uint8_t)(UQCOUNT_DHV-1)/VBIT_LENGTH) + 1; numMsg = (vbit_size -1)/maxDataLength + 1; }else { vbit_size = 0; numMsg = 0; } rcv_dvbmsg = (dhv_vbit_msg_t*) payload; bindex = rcv_dvbmsg->bindex; vindex = rcv_dvbmsg->vindex; dbg("DhvVBitP", "Receive vbit of index %d numMsg %d vbit_size %d \n", bindex, numMsg, vbit_size ); //compare the hash first salt = rcv_dvbmsg->salt; myHash = call DhvHelp.computeHash(0, UQCOUNT_DHV, salt); if(myHash == rcv_dvbmsg->info){ //some duplicates dbg("DhvVBitP", "same summary\n"); call VBitLogic.setSameSummary(); commRate = commRate + 1; }else{ vbit = call DhvHelp.getVBits(bindex); if(vindex == numMsg-1){ msg_size = vbit_size - vindex*maxDataLength; //dbg("DhvVBitP", "Last message vindex %d numMsg %d msg_size %d \n", vindex, numMsg, msg_size ); }else{ msg_size = maxDataLength; //dbg("DhvVBitP", "Not last message %d\n", msg_size); } //compare with the rcv vbits for(i = 0; i < msg_size; i++){ dbg("DhvVBitP", "numMsg %d bindex %d vbit %d vindex %d: msg_size %d local 0x%02x - rcv 0x%02x \n",numMsg, bindex, i, vindex, msg_size ,vbit[vindex*maxDataLength+i],rcv_dvbmsg->vbit[i]); if(vbit[vindex*maxDataLength + i] != rcv_dvbmsg->vbit[i]){ version = rcv_dvbmsg->vbit[i]^vbit[vindex*maxDataLength + i]; mask = 1; if(version != 0){ dbg("DhvVBitP", "There is a difference \n"); isDiff = TRUE; for(j = 0; j < VBIT_LENGTH; j++){ if((version & mask) != 0){ diffIndex = (VBIT_LENGTH -j) + VBIT_LENGTH*i + vindex*maxDataLength - 1 ; dbg("DhvVBitP", "Detect difference at %d, %d %d %d %d \n", diffIndex, i, j, vindex, maxDataLength); diffKey = call DhvHelp.indexToKey(diffIndex); call VectorLogic.setItem(diffKey); } mask = mask << 1; } } } } //reset this bit call VBitLogic.unsetVBitIndex(bindex); if((isDiff == FALSE)){ bitIndexValue = call VBitLogic.getVBitState(); if(bitIndexValue == 0){ //tell DhvLogic to send the next bindex bindex++; dbg("DhvVBitP", "No Difference detected, move to bindex %d \n", bindex ); call VBitLogic.setVBitIndex(bindex); } }else{ dbg("DhvVBitP","difference detected, reset to 0 \n"); } } } } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvVectorC.nc000077500000000000000000000015071207233610700212420ustar00rootroot00000000000000/** * DHV Vector Message Configuration * * Define interfaces and components. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV modules. * @modified 8/28/2008 Took the source code from DIP. **/ configuration DhvVectorC { provides interface DhvDecision; uses interface DhvSend as VectorSend; uses interface DhvReceive as VectorReceive; uses interface DhvLogic as VectorLogic; uses interface DhvLogic as DataLogic; uses interface DhvHelp; } implementation { components DhvVectorP; DhvDecision = DhvVectorP; VectorSend = DhvVectorP; VectorReceive = DhvVectorP; DhvHelp = DhvVectorP; VectorLogic = DhvVectorP.VectorLogic; DataLogic = DhvVectorP.DataLogic; components RandomC; DhvVectorP.Random -> RandomC; } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvVectorP.nc000077500000000000000000000105201207233610700212520ustar00rootroot00000000000000/** * DHV Vector Message Configuration * * Define interfaces and components. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV modules. * @modified 8/28/2008 Took the source code from DIP. **/ #include module DhvVectorP { provides interface DhvDecision; uses interface DhvSend as VectorSend; uses interface DhvReceive as VectorReceive; uses interface DhvLogic as VectorLogic; uses interface DhvLogic as DataLogic; uses interface DhvHelp; uses interface Random; } implementation { uint8_t commRate = 0; int myComparator(const void* a, const void* b); command uint8_t DhvDecision.getCommRate() { return commRate; } command void DhvDecision.resetCommRate() { commRate = 0; } command error_t DhvDecision.send() { dhv_index_t i, j; dhv_key_t sendkey; bool* keyvector; dhv_msg_t* dmsg; dhv_vector_msg_t* dvmsg; error_t status; dbg("DhvVectorP", "prepare to send vector out \n"); dmsg = call VectorSend.getPayloadPtr(); if(dmsg == NULL) { return FAIL; } keyvector = call VectorLogic.allItem(); dmsg->type = ID_DHV_VECTOR; dvmsg = (dhv_vector_msg_t*) dmsg->content; //dvmsg->unitLen = DHV_VECTOR_ENTRIES_PER_PACKET; //TODO: need to check for concurrency in here i = 0; for(j = 0; j < UQCOUNT_DHV; j++){ if(keyvector[j] > ID_DHV_NO){ sendkey = call DhvHelp.indexToKey(j); /*if(keyvector[j] == ID_DHV_REQ){ dbg("DhvVectorP", " keyvector %d == %d \n", keyvector[j], ID_DHV_REQ); dmsg->type = ID_DHV_VECTOR_REQ; }*/ if(i < DHV_VECTOR_ENTRIES_PER_PACKET) { dvmsg->vector[i] = sendkey; dvmsg->vector[i+1] = call DhvHelp.keyToVersion(sendkey); dbg("DhvVectorP","diff vector 0x%08x 0x%08x %d %d \n",dvmsg->vector[i] , dvmsg->vector[i+1], j, keyvector[j]); i = i + 2; }else{ break; } } } dvmsg->unitLen = i; //TODO: need to fix // dbg("DhvVectorP", "Sending vector message out ...unitLen 0x%02x \n", dvmsg->unitLen); status = call VectorSend.send(sizeof(dhv_msg_t) + sizeof(dhv_vector_msg_t) + (i*sizeof(uint32_t))); i = 0; dbg("DhvVectorP","Send status %d vs FALSE %d \n", status, FALSE); if(status == SUCCESS){dbg("DhvVectorP","status == SUCCESS\n");} if(status == FAIL){dbg("DhvVectorP","status == FAIL\n");} //TODO: need to check for actual send status here if(TRUE) { dbg("DhvVectorP", "Send msg successfully \n"); for(j = 0; j < UQCOUNT_DHV; j++){ if(keyvector[j] > ID_DHV_NO){ sendkey = call DhvHelp.indexToKey(j); if(i < DHV_VECTOR_ENTRIES_PER_PACKET) { call VectorLogic.unsetItem(sendkey); i = i + 2; }else{ break; } } } } dbg("DhvVectorP", "Sent vector message out ...unitLen %d \n", dvmsg->unitLen); return SUCCESS; } /*TODO: a callback event to remove the sent vectors*/ event void VectorReceive.receive(void* payload, uint8_t len) { dhv_vector_msg_t* dvmsg; dhv_msg_t* dmsg; uint8_t unitlen; uint8_t i; uint8_t type; uint32_t vectorkey; uint32_t vectorver; uint32_t myver; commRate = commRate + 1; dmsg = (dhv_msg_t*) payload; type = dmsg->type; dvmsg = (dhv_vector_msg_t*) dmsg->content; unitlen = dvmsg->unitLen; dbg("DhvVectorP", "Receive vector msg len %u unitlen 0x%02x 0x%02x \n", len, unitlen, dvmsg->unitLen); for(i = 0; i < unitlen; i += 2) { vectorkey = dvmsg->vector[i]; vectorver = dvmsg->vector[i+1]; myver = call DhvHelp.keyToVersion(vectorkey); dbg("DhvVectorP", "key 0x%08x version 0x%08x myver 0x%08x \n", vectorkey, vectorver, myver); // TODO: handle the invalid versions if(myver < vectorver) { dbg("DhvVectorP", "I have an older version -> setItem \n"); call VectorLogic.setItem(vectorkey); } else if(myver > vectorver) { dbg("DhvVectorP", "I have a newer version -> Data.setItem \n"); call DataLogic.setItem(vectorkey); } else{ dbg("DhvVectorP", "Request msg and I have the same version -> keep quite \n"); call VectorLogic.unsetItem(vectorkey); } } } } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvVersionC.nc000077500000000000000000000013221207233610700214200ustar00rootroot00000000000000/** * DHV Vector Message Configuration * * Define interfaces and components. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV modules. * @modified 8/28/2008 Took the source code from DIP. **/ #include configuration DhvVersionC { provides interface DhvHelp; provides interface DisseminationUpdate[dhv_key_t key]; provides interface DhvCache as DataCache; provides interface DhvCache as VectorCache; } implementation { components DhvVersionP; DhvHelp = DhvVersionP; DisseminationUpdate = DhvVersionP; DataCache = DhvVersionP.DhvDataCache; VectorCache = DhvVersionP.DhvVectorCache; } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DhvVersionP.nc000077500000000000000000000165751207233610700214550ustar00rootroot00000000000000/** * DHV Version Check Module * * Module checks version of the data item. * details on the working of the parameters, please refer to Thanh Dang et al., * "DHV: A Code Consistency Maintenance Protocol for Multi-Hop Wireless Sensor * Networks" EWSN 09. * * @author Thanh Dang * @author Seungweon Park * * @modified 1/3/2009 Added meaningful documentation. * @modified 8/28/2008 Defined DHV modules. * @modified 8/28/2008 Took the source code from DIP. **/ module DhvVersionP { provides interface DhvHelp; provides interface DisseminationUpdate[dhv_key_t key]; provides interface DhvCache as DhvDataCache; provides interface DhvCache as DhvVectorCache; } implementation { // keys are ordered from smallest to largest. dhv_key_t keys[UQCOUNT_DHV]; dhv_version_t versions[UQCOUNT_DHV]; dhv_index_t count = 0; //keep track of task uint8_t data_to_send[UQCOUNT_DHV]; uint8_t vector_to_send[UQCOUNT_DHV]; uint8_t vbit[(UQCOUNT_DHV == 0)?0:((UQCOUNT_DHV-1)/VBIT_LENGTH +1)]; /*utility for debugging purposes */ void printDataStatus() { dhv_index_t i; for(i = 0; i < UQCOUNT_DHV; i++){ dbg("DhvVersionP", "Data Status %d: %u \n",i, data_to_send[i]); } } void printVectorStatus() { dhv_index_t i; for(i = 0; i < UQCOUNT_DHV; i++){ dbg("DhvVersionP", "T Vector Status %d: %u \n",i, vector_to_send[i]); } } void printVersionStatus() { dhv_index_t i; for(i = 0; i < UQCOUNT_DHV; i++){ dbg("DhvVersionP", "Version Status %d: 0x%08x \n",i, versions[i]); } } /*DhvDataCache interface implementation */ command void DhvDataCache.addItem(dhv_key_t key){ dhv_index_t i; dbg("DhvVersionP", "Add Item to data vector key %d\n", i); i = call DhvHelp.keyToIndex(key); data_to_send[i] = ID_DHV_ADS; printDataStatus(); } command void DhvDataCache.addReqItem(dhv_key_t key){ dhv_index_t i; dbg("DhvVersionP", "Add Req Item to data vector key %d\n", i); i = call DhvHelp.keyToIndex(key); data_to_send[i] = ID_DHV_REQ; printDataStatus(); } command void DhvDataCache.removeItem(dhv_key_t key){ dhv_index_t i; i = call DhvHelp.keyToIndex(key); data_to_send[i] = ID_DHV_NO; dbg("DhvVersionP", "Remove Item from data vector key %d\n", i); printDataStatus(); } command bool DhvDataCache.hasItemToSend(){ dhv_index_t i; for(i = 0; i < UQCOUNT_DHV; i++){ if(data_to_send[i] > ID_DHV_NO){return TRUE;} } return FALSE; } command uint8_t* DhvDataCache.allItem(){ return data_to_send; } command uint8_t DhvDataCache.nextItem(){ dhv_index_t i; for(i = 0; i < UQCOUNT_DHV; i++){ if(data_to_send[i] > ID_DHV_NO ){ return i; } } return UQCOUNT_DHV; } command void DhvDataCache.removeAll(){ dhv_index_t i; for(i=0; i < UQCOUNT_DHV; i++){ data_to_send[i] = ID_DHV_NO; } } /*vector cache */ command void DhvVectorCache.addItem(dhv_key_t key){ dhv_index_t i; i = call DhvHelp.keyToIndex(key); vector_to_send[i] = ID_DHV_ADS; dbg("DhvVersionP", "Add Item to vector_to_send index %d\n", i); printVectorStatus(); } command void DhvVectorCache.addReqItem(dhv_key_t key){ dhv_index_t i; i = call DhvHelp.keyToIndex(key); vector_to_send[i] = ID_DHV_ADS; dbg("DhvVersionP", "Add Item to vector_to_send index %d\n", i); printVectorStatus(); } command void DhvVectorCache.removeItem(dhv_key_t key){ dhv_index_t i; i = call DhvHelp.keyToIndex(key); vector_to_send[i] = ID_DHV_NO; dbg("DhvVersionP", "Remove Item from vector_to_send index %d\n", i); printVectorStatus(); } command bool DhvVectorCache.hasItemToSend(){ dhv_index_t i; for(i = 0; i < UQCOUNT_DHV; i++){ if(vector_to_send[i] > ID_DHV_NO){return TRUE;} } return FALSE; } command uint8_t* DhvVectorCache.allItem(){ return vector_to_send; } command uint8_t DhvVectorCache.nextItem(){ dhv_index_t i; for(i = 0; i < UQCOUNT_DHV; i++){ if(vector_to_send[i] > ID_DHV_NO){ return i; } } return UQCOUNT_DHV; } command void DhvVectorCache.removeAll(){ dhv_index_t i; for(i=0; i < UQCOUNT_DHV; i++){ vector_to_send[i] = ID_DHV_NO; } } command void DhvHelp.registerKey(dhv_key_t key) { keys[count] = key; count = count + 1; if(count == UQCOUNT_DHV) { dbg("DhvVersionP","Key registration complete!\n"); } //printVersionStatus(); } command void DisseminationUpdate.change[dhv_key_t key](dhv_data_t* val) { dhv_index_t i; dhv_version_t ver; dbg("DhvVersioP", "Updateing version for key %d \n", key); i = call DhvHelp.keyToIndex(key); ver = versions[i]; ver++; versions[i] = ver; printVersionStatus(); } command dhv_index_t DhvHelp.keyToIndex(dhv_key_t key) { dhv_index_t answer; dhv_index_t i; answer = DHV_UNKNOWN_INDEX; // linear search for now since it's easier for(i = 0; i < UQCOUNT_DHV; i++) { if(keys[i] == key) { answer = i; break; } } dbg("DhvVersionP", "Converting key %x to index %u\n", key, answer); return answer; } command dhv_key_t DhvHelp.indexToKey(dhv_index_t ind) { return keys[ind]; } command dhv_version_t DhvHelp.keyToVersion(dhv_key_t key) { dhv_index_t i; i = call DhvHelp.keyToIndex(key); return versions[i]; } command void DhvHelp.setVersion(dhv_key_t key, dhv_version_t ver) { dhv_index_t i; i = call DhvHelp.keyToIndex(key); versions[i] = ver; dbg("DhvVersionP","Setting key %x at index %u to version 0x%08x\n", key, i, ver); } command dhv_version_t* DhvHelp.getAllVersions() { return versions; } command uint32_t DhvHelp.computeHash(uint8_t left, uint8_t right, uint32_t salt) { dhv_index_t i; uint32_t hashValue = salt; uint8_t *sequence; if(right <= left) return 0; sequence = ((uint8_t*) (versions + left)); for(i = 0; i <= (right-left-1)*sizeof(dhv_version_t); i++) { hashValue += sequence[i]; hashValue += (hashValue << 10); hashValue ^= (hashValue >> 6); } hashValue += (hashValue << 3); hashValue ^= (hashValue >> 11); hashValue += (hashValue << 15); return hashValue; } command uint8_t* DhvHelp.getVBits(uint32_t bindex){ dhv_version_t version; uint8_t cur_byte; dhv_index_t i,j; j = 0; version = 0; cur_byte = 0; dbg("DhvVersionP", "getVBits at index %d \n", bindex); printVersionStatus(); for(i = 1; i <= UQCOUNT_DHV; i++){ version = versions[i-1]; //dbg("DhvVersionP", "version %d 0x%08x \n", i, version); version = (version >>(bindex-1)) << (DHV_VERSION_LENGTH*8-1) >> (j + 24); //get the bindex bit //dbg("DhvVersionP", "shifted version 1 by %d : 0x%08x -> 0x%08x : %d \n", VBIT_LENGTH-1, versions[i-1], version, j); cur_byte = cur_byte | version; //dbg("DhvVersionP", "shifted version 2 0x%08x -> 0x%08x : %d cur_byte 0x%08x \n\n\n", versions[i-1], version, j, cur_byte); j++; if(j == VBIT_LENGTH){ //reset j j = 0; vbit[(i-1)/VBIT_LENGTH] = cur_byte; dbg("DhvVersionP", "vertical bits %d 0x%02x 0x%02x \n", (i-1)/VBIT_LENGTH, cur_byte, vbit[(i-1)/VBIT_LENGTH]); cur_byte = 0; } } //debug for(i= 0; i < sizeof(vbit); i++){ dbg("DhvVersionP", "vbit %d -> 0x%02x \n", i, vbit[i]); } return vbit; } command dhv_version_t DhvHelp.getHSum(){ dhv_version_t hsum; dhv_index_t i; hsum = versions[0]; for(i =1 ; i < UQCOUNT_DHV; i++){ hsum = hsum^versions[i]; } return hsum; } } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DisseminationC.nc000077500000000000000000000002331207233610700221370ustar00rootroot00000000000000 #include configuration DisseminationC { provides interface StdControl; } implementation { components DhvLogicC; StdControl = DhvLogicC; } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DisseminatorC.nc000077500000000000000000000056031207233610700220000ustar00rootroot00000000000000#include /* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The DisseminatorC component holds and synchronizes a single value * of a chosen type, and identifies that value by a chosen 16-bit key. * Different nodes should use the same key for the same value. * * See TEP118 - Dissemination for details. * * @param t the type of the object that will be disseminated * @param key the 16-bit identifier of the disseminated object * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2009-08-22 08:24:06 $ */ generic configuration DisseminatorC(typedef t, dhv_key_t key) { provides interface DisseminationValue; provides interface DisseminationUpdate; } implementation { enum { JUST_NEED_COUNT = UQ_DHV }; components new DisseminatorP(t, key); DisseminationValue = DisseminatorP.AppDisseminationValue; DisseminationUpdate = DisseminatorP.AppDisseminationUpdate; components LedsC; DisseminatorP.Leds -> LedsC; components DhvLogicC; DisseminatorP.DhvDisseminationUpdate -> DhvLogicC.DisseminationUpdate[key]; components DhvVersionC; DisseminatorP.DhvHelp -> DhvVersionC; components MainC; MainC.SoftwareInit -> DisseminatorP; components DhvDataC; DhvDataC.DisseminationUpdate[key] -> DisseminatorP.DataDisseminationUpdate; DhvDataC.DisseminationValue[key] -> DisseminatorP.DataDisseminationValue; } tinyos-2.1.2+dfsg/tos/lib/net/dhv/DisseminatorP.nc000077500000000000000000000077011207233610700220160ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The DisseminatorP module holds and synchronizes a single value of a * chosen type. * * See TEP118 - Dissemination for details. * * @param t the type of the object that will be disseminated * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2009-08-22 08:24:06 $ */ generic module DisseminatorP(typedef t, dhv_key_t key) { provides interface DisseminationValue as AppDisseminationValue; provides interface DisseminationUpdate as AppDisseminationUpdate; provides interface DisseminationUpdate as DataDisseminationUpdate; provides interface DisseminationValue as DataDisseminationValue; provides interface Init; uses interface DisseminationUpdate as DhvDisseminationUpdate; uses interface DhvHelp; uses interface Leds; } implementation { dhv_data_t valueCache; task void signalNewData() { signal AppDisseminationValue.changed(); } command error_t Init.init() { call DhvHelp.registerKey(key); return SUCCESS; } // A sequence number is 32 bits. The top 16 bits are an incrementing // counter, while the bottom 16 bits are a unique node identifier. // But versions aren't stored here. command const t* AppDisseminationValue.get() { return (t*) &valueCache; } command void AppDisseminationValue.set( const t* val ) { memcpy( &valueCache, val, sizeof(t) ); // must signal here instead of posting task to prevent race condition signal AppDisseminationValue.changed(); } command void AppDisseminationUpdate.change( t* newVal ) { memcpy( &valueCache, newVal, sizeof(t) ); /* Increment the counter and append the local node ID later. */ /* DhvLogicC doesn't care what the data actually is, it just wants the key, so we cast it recklessly */ call DhvDisseminationUpdate.change((dhv_data_t*)newVal); post signalNewData(); } command const dhv_data_t* DataDisseminationValue.get() { return (dhv_data_t*) &valueCache; } command void DataDisseminationValue.set( const dhv_data_t* val ) { } command void DataDisseminationUpdate.change( dhv_data_t* newVal ) { memcpy( &valueCache, newVal, sizeof(dhv_data_t) ); // don't post the task, this came from the network signal AppDisseminationValue.changed(); } default event void AppDisseminationValue.changed() { } default event void DataDisseminationValue.changed() { } } tinyos-2.1.2+dfsg/tos/lib/net/dhv/README000077500000000000000000000017621207233610700175740ustar00rootroot00000000000000 Title: Dhv Author: Thanh Dang, Seungweon Park ------------------ DHV is a code consistency maintenance protocol to ensure that every node in a network will eventually have the same code. DHV is based on the simple observation that if two code versions are different, their corresponding version numbers often differ in only a few least significant bits of their binary representation. DHV allows nodes to carefully select and transmit only necessary bit level information to detect a newer code version in the network. Detail of the protocol can be found here Thanh Dang, Nirupama Bulusu, Wu-chi Feng, and Seungweon Park, "DHV: A Code Consistent Maintenance Protocol for Wireless Sensor Networks.", In Proceedings of EWSN 2009, Cork, Ireland, Feb 2009. Usage: ------ To use include the following in your Makefile: CFLAGS += -I$(TOSDIR)/lib/net CFLAGS += -I$(TOSDIR)/lib/net/dhv CFLAGS += -I$(TOSDIR)/lib/net/dhv/interfaces * add a following line when use BaseStation CFLAGS += -DTOSH_DATA_LENGTH=32 tinyos-2.1.2+dfsg/tos/lib/net/dhv/interfaces/000077500000000000000000000000001207233610700210265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/dhv/interfaces/DhvCache.nc000077500000000000000000000004241207233610700230200ustar00rootroot00000000000000#include interface DhvCache{ command void addItem(dhv_key_t key); command void addReqItem(dhv_key_t key); command void removeItem(dhv_key_t key); command bool hasItemToSend(); command uint8_t* allItem(); command uint8_t nextItem(); command void removeAll(); } tinyos-2.1.2+dfsg/tos/lib/net/dhv/interfaces/DhvDecision.nc000077500000000000000000000001661207233610700235550ustar00rootroot00000000000000 interface DhvDecision { command uint8_t getCommRate(); command void resetCommRate(); command error_t send(); } tinyos-2.1.2+dfsg/tos/lib/net/dhv/interfaces/DhvEstimates.nc000077500000000000000000000010411207233610700237470ustar00rootroot00000000000000 #include interface DhvEstimates { command dhv_estimate_t* getEstimates(); command void decEstimateByIndex(dhv_index_t i); command void decEstimateByKey(dhv_key_t key); command dhv_hashlen_t estimateToHashlength(dhv_estimate_t est); command dhv_estimate_t hashlengthToEstimate(dhv_hashlen_t len); // special event to reset trickle timer too command void setDataEstimate(dhv_key_t key); command void setVectorEstimate(dhv_key_t key); command void setSummaryEstimateByIndex(dhv_index_t ind, dhv_estimate_t est); } tinyos-2.1.2+dfsg/tos/lib/net/dhv/interfaces/DhvHelp.nc000077500000000000000000000007571207233610700227160ustar00rootroot00000000000000 #include interface DhvHelp { command void registerKey(dhv_key_t key); command dhv_index_t keyToIndex(dhv_key_t key); command dhv_key_t indexToKey(dhv_index_t ind); command dhv_version_t keyToVersion(dhv_key_t key); command void setVersion(dhv_key_t key, dhv_version_t ver); command dhv_version_t* getAllVersions(); command dhv_version_t getHSum(); command uint8_t* getVBits(uint32_t bindex); command uint32_t computeHash(uint8_t left, uint8_t right,uint32_t salt); } tinyos-2.1.2+dfsg/tos/lib/net/dhv/interfaces/DhvLogic.nc000077500000000000000000000003441207233610700230530ustar00rootroot00000000000000#include interface DhvLogic{ command error_t setItem(dhv_key_t key); command error_t setReqItem(dhv_key_t key); command error_t unsetItem(dhv_key_t key); command uint8_t nextItem(); command uint8_t * allItem(); } tinyos-2.1.2+dfsg/tos/lib/net/dhv/interfaces/DhvNeighbour.nc000077500000000000000000000001741207233610700237410ustar00rootroot00000000000000#include interface DhvNeighbour{ command uint8_t getNeighbourCount(); command void addNeighbour(uint8_t nodeId); } tinyos-2.1.2+dfsg/tos/lib/net/dhv/interfaces/DhvReceive.nc000077500000000000000000000001141207233610700233730ustar00rootroot00000000000000 interface DhvReceive { event void receive(void* payload, uint8_t len); } tinyos-2.1.2+dfsg/tos/lib/net/dhv/interfaces/DhvSend.nc000077500000000000000000000002031207233610700227010ustar00rootroot00000000000000 interface DhvSend { command error_t send(uint8_t len); command void* getPayloadPtr(); command uint8_t maxPayloadLength(); } tinyos-2.1.2+dfsg/tos/lib/net/dhv/interfaces/DhvStateLogic.nc000077500000000000000000000006141207233610700240540ustar00rootroot00000000000000interface DhvStateLogic{ command void setDiffSummary(); command void setSameSummary(); command uint32_t getVBitState(); command void setVBitState(uint32_t state); command void unsetVBitIndex(uint8_t dindex); command uint8_t getVBitIndex(); command void setVBitIndex(uint8_t dindex); command void setHSumStatus(); command void unsetHSumStatus(); command uint8_t getHSumStatus(); } tinyos-2.1.2+dfsg/tos/lib/net/dhv/interfaces/DhvTrickleTimer.nc000077500000000000000000000071751207233610700244250ustar00rootroot00000000000000// $Id: DhvTrickleTimer.nc,v 1.2 2010-06-29 22:07:49 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * A network trickle timer. A trickle timer has a period in the range * [L, H]. After firing, the period is doubled, up to H. If the period * is P, then the timer is scheduled to fire in the interval [0.5P, P] * (the second half of a period). The period can be reset to L (the * smallest period, and therefore the highest frequency). * * The timer may be suppressed. If a user of the interface has heard * enough packets from other nodes that indicate its transmitting a * packet would be unncessarily redundant, then the timer does not * fire. The timer has a constant K and a counter C. If C >e; K, then * the timer does not fire. When an interval ends, C is reset to 0. * Calling incrementCounter increments C by one. * * For details, refer to Levis et al., "A Self-Regulating Algorithm * for Code Maintenance and Propagation in Wireless Sensor Networks," * NSDI 2004. The component providing this interface defines the * constants L, H, and K. * * @author Philip Levis * @date Jan 7 2006 * @author Thanh Dang * @date Aug 5 2009 */ interface DhvTrickleTimer { /** * Start the trickle timer. At boot, the timer period is its maximum * value (H). If a protocol requires starting at the minimum value * (e.g., fast start), then it should call reset before * start. * * @return error_t SUCCESS if the timer was started, EBUSY if it is already * running, and FAIL otherwise. */ command error_t start(); /** * Stop the trickle timer. This call sets the timer period to H and * C to 0. */ command void stop(); /** * Reset the timer period to L. If called while the timer is * running, then a new interval (of length L) begins immediately. */ command void reset(); /** * The trickle timer has fired. Signaled if C > K. */ event void fired(); /** * Compute the window size based on Dip's estimates */ event uint32_t requestWindowSize(); /** * Resets the timer period to H. */ command void maxInterval(); } tinyos-2.1.2+dfsg/tos/lib/net/dhv/interfaces/DhvVersion.nc000077500000000000000000000001461207233610700234430ustar00rootroot00000000000000 #include interface DhvVersion { command void setVersion(); command void incVersion(); } tinyos-2.1.2+dfsg/tos/lib/net/dip/000077500000000000000000000000001207233610700166765ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/dip/AMDipC.nc000066400000000000000000000012121207233610700202510ustar00rootroot00000000000000#include configuration AMDipC { provides interface DipSend; provides interface DipReceive as DataReceive; provides interface DipReceive as VectorReceive; provides interface DipReceive as SummaryReceive; } implementation { components AMDipP; components new AMSenderC(AM_DIP) as SendC; components new AMReceiverC(AM_DIP) as ReceiveC; AMDipP.NetAMSend -> SendC.AMSend; AMDipP.NetReceive -> ReceiveC.Receive; components MainC; MainC.SoftwareInit -> AMDipP.Init; DipSend = AMDipP.DipSend; DataReceive = AMDipP.DipDataReceive; VectorReceive = AMDipP.DipVectorReceive; SummaryReceive = AMDipP.DipSummaryReceive; } tinyos-2.1.2+dfsg/tos/lib/net/dip/AMDipP.nc000066400000000000000000000032121207233610700202700ustar00rootroot00000000000000 module AMDipP { provides interface Init; provides interface DipSend; provides interface DipReceive as DipDataReceive; provides interface DipReceive as DipVectorReceive; provides interface DipReceive as DipSummaryReceive; uses interface AMSend as NetAMSend; uses interface Receive as NetReceive; } implementation { message_t am_msg; bool busy; command error_t Init.init() { busy = FALSE; return SUCCESS; } command error_t DipSend.send(uint8_t len) { error_t err; dbg("AMDipP", "Attempting to send data in the air\n"); err = call NetAMSend.send(AM_BROADCAST_ADDR, &am_msg, len); if(err == SUCCESS) { busy = TRUE; } return err; } command void* DipSend.getPayloadPtr() { // returns NULL if message is busy if(busy) { return NULL; } return call NetAMSend.getPayload(&am_msg, 0); } command uint8_t DipSend.maxPayloadLength() { return call NetAMSend.maxPayloadLength(); } event void NetAMSend.sendDone(message_t* msg, error_t err) { dbg("AMDipP", "Data send successfully in the air\n"); if(msg == &am_msg) { busy = FALSE; } } event message_t* NetReceive.receive(message_t* msg, void* payload, uint8_t len) { dip_msg_t* dmsg; uint8_t type; dmsg = (dip_msg_t*) payload; type = dmsg->type; switch(type) { case ID_DIP_DATA: signal DipDataReceive.receive(dmsg->content, len); break; case ID_DIP_VECTOR: signal DipVectorReceive.receive(dmsg->content, len); break; case ID_DIP_SUMMARY: signal DipSummaryReceive.receive(dmsg->content, len); break; } return msg; } } tinyos-2.1.2+dfsg/tos/lib/net/dip/Dip.h000066400000000000000000000032531207233610700175660ustar00rootroot00000000000000 #ifndef __DIP_H__ #define __DIP_H__ #define UQ_DIP unique("DIP") #define UQCOUNT_DIP uniqueCount("DIP") enum { DIP_TAU_LOW = 1024L, DIP_TAU_HIGH = 65535L, DIP_UNKNOWN_VERSION = 0xFFFFFFFF, DIP_UNKNOWN_INDEX = 0xFFFF, DIP_DATA_SUPPRESSION = 1, DIP_ADV_SUPPRESSION = 1 }; typedef enum { ID_DIP_INVALID = 0x0, ID_DIP_SUMMARY = 0x1, ID_DIP_VECTOR = 0x2, ID_DIP_DATA = 0x3 } dip_msgid_t; enum { AM_DIP = 0x62, AM_DIP_DATA_MSG = 0x62, // For MIG tool AM_DIP_MSG = 0x62, // For MIG tool AM_DIP_DATA = 0x62 // For MIG tool }; typedef uint16_t dip_index_t; typedef uint16_t dip_key_t; typedef nx_uint16_t nx_dip_key_t; typedef uint32_t dip_version_t; typedef nx_uint32_t nx_dip_version_t; typedef uint8_t dip_estimate_t; typedef dip_index_t dip_hashlen_t; typedef nx_struct dip_msg { nx_uint8_t type; // dip_msgid_t nx_uint8_t content[0]; } dip_msg_t; typedef nx_struct dip_data_msg { nx_dip_key_t key; nx_dip_version_t version; nx_uint8_t size; nx_uint8_t data[0]; } dip_data_msg_t; typedef nx_struct dip_vector_msg { nx_uint8_t unitLen; nx_uint32_t vector[0]; } dip_vector_msg_t; typedef nx_struct dip_summary_msg { nx_uint8_t unitLen; nx_uint32_t salt; nx_uint32_t info[0]; } dip_summary_msg_t; dip_estimate_t DIP_DATA_ESTIMATE; dip_estimate_t DIP_MAX_ESTIMATE; dip_estimate_t DIP_VECTOR_ESTIMATE; #define DIP_SUMMARY_ENTRIES_PER_PACKET (DIP_SUMMARY_VALUES_PER_PACKET * 3) #define DIP_VECTOR_ENTRIES_PER_PACKET (DIP_VECTOR_VALUES_PER_PACKET * 2) #include "qsort.c" /* TUNABLE PARAMETERS */ typedef nx_struct dip_data { nx_uint8_t data[16]; } dip_data_t; enum { DIP_SUMMARY_VALUES_PER_PACKET = 2, DIP_VECTOR_VALUES_PER_PACKET = 2 }; #endif tinyos-2.1.2+dfsg/tos/lib/net/dip/DipDataC.nc000066400000000000000000000011461207233610700206330ustar00rootroot00000000000000 configuration DipDataC { provides interface DipDecision; uses interface DipSend as DataSend; uses interface DipReceive as DataReceive; uses interface DisseminationUpdate[dip_key_t key]; uses interface DisseminationValue[dip_key_t key]; uses interface DipHelp; uses interface DipEstimates; } implementation { components DipDataP; DipDecision = DipDataP; DataSend = DipDataP; DataReceive = DipDataP; DisseminationUpdate = DipDataP; DisseminationValue = DipDataP; DipHelp = DipDataP; DipEstimates = DipDataP; components LedsC; DipDataP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/net/dip/DipDataP.nc000066400000000000000000000053531207233610700206540ustar00rootroot00000000000000 #include module DipDataP { provides interface DipDecision; uses interface DipSend as DataSend; uses interface DipReceive as DataReceive; uses interface DisseminationUpdate[dip_key_t key]; uses interface DisseminationValue[dip_key_t key]; uses interface DipHelp; uses interface DipEstimates; uses interface Leds; } implementation { uint8_t commRate = 0; command uint8_t DipDecision.getCommRate() { return commRate; } command void DipDecision.resetCommRate() { commRate = 0; } command error_t DipDecision.send() { // Scan all estimates and send the highest estimate in deterministic order dip_index_t i; dip_index_t high_i; dip_index_t high_est; dip_key_t key; dip_version_t ver; dip_estimate_t* ests; dip_msg_t* dmsg; dip_data_msg_t* ddmsg; const dip_data_t* data; ests = call DipEstimates.getEstimates(); high_i = 0; high_est = 0; for(i = 0; i < UQCOUNT_DIP; i++) { if(ests[i] > high_est) { high_i = i; high_est = ests[i]; } } key = call DipHelp.indexToKey(high_i); ver = call DipHelp.keyToVersion(key); data = call DisseminationValue.get[key](); dmsg = (dip_msg_t*) call DataSend.getPayloadPtr(); if(dmsg == NULL) { return FAIL; } ddmsg = (dip_data_msg_t*) dmsg->content; dmsg->type = ID_DIP_DATA; ddmsg->key = key; ddmsg->version = ver; ddmsg->size = sizeof(dip_data_t); memcpy(ddmsg->data, data, sizeof(dip_data_t)); call DipEstimates.decEstimateByKey(key); dbg("DipDataP", "Data sent with key %x and version %08x\n", key, ver); return call DataSend.send(sizeof(dip_data_msg_t) + sizeof(dip_msg_t) + sizeof(dip_data_t)); } event void DataReceive.receive(void* payload, uint8_t len) { dip_key_t key; dip_version_t myVer; dip_version_t msgVer; dip_data_msg_t* ddmsg; commRate = commRate + 1; ddmsg = (dip_data_msg_t*) payload; key = ddmsg->key; msgVer = ddmsg->version; myVer = call DipHelp.keyToVersion(key); dbg("DipDataP", "Data rcved with key %x and version %08x\n", key, msgVer); // TODO: handle the invalid versions if(myVer < msgVer) { call DisseminationUpdate.change[key]((dip_data_t*)ddmsg->data); call DipHelp.setVersion(key, msgVer); call DipEstimates.setDataEstimate(key); } else if (myVer > msgVer) { call DipEstimates.setDataEstimate(key); } else { call DipEstimates.decEstimateByKey(key); } } event void DisseminationValue.changed[dip_key_t key]() { } default command const dip_data_t* DisseminationValue.get[dip_key_t key]() { return NULL; } default command void DisseminationUpdate.change[dip_key_t key](dip_data_t* val) { } } tinyos-2.1.2+dfsg/tos/lib/net/dip/DipLogicC.nc000066400000000000000000000023611207233610700210170ustar00rootroot00000000000000 #include configuration DipLogicC { provides interface DisseminationUpdate[dip_key_t key]; provides interface StdControl; } implementation { components DipLogicP; DisseminationUpdate = DipLogicP; StdControl = DipLogicP; components MainC; MainC.SoftwareInit -> DipLogicP; DipLogicP.Boot -> MainC; components DipTrickleMilliC; DipLogicP.DipTrickleTimer -> DipTrickleMilliC; components DipVersionC; DipLogicP.VersionUpdate -> DipVersionC; DipLogicP.DipHelp -> DipVersionC; components AMDipC; components DipDataC; DipLogicP.DipDataDecision -> DipDataC; DipDataC.DataSend -> AMDipC.DipSend; DipDataC.DataReceive -> AMDipC.DataReceive; DipDataC.DipHelp -> DipVersionC; DipDataC.DipEstimates -> DipLogicP; components DipVectorC; DipLogicP.DipVectorDecision -> DipVectorC; DipVectorC.VectorSend -> AMDipC.DipSend; DipVectorC.VectorReceive -> AMDipC.VectorReceive; DipVectorC.DipHelp -> DipVersionC; DipVectorC.DipEstimates -> DipLogicP; components DipSummaryC; DipLogicP.DipSummaryDecision -> DipSummaryC; DipSummaryC.SummarySend -> AMDipC.DipSend; DipSummaryC.SummaryReceive -> AMDipC.SummaryReceive; DipSummaryC.DipHelp -> DipVersionC; DipSummaryC.DipEstimates -> DipLogicP; } tinyos-2.1.2+dfsg/tos/lib/net/dip/DipLogicP.nc000066400000000000000000000173611207233610700210420ustar00rootroot00000000000000 #include module DipLogicP { provides interface DisseminationUpdate[dip_key_t key]; provides interface DipEstimates; provides interface Init; provides interface StdControl; uses interface Boot; uses interface DipTrickleTimer; uses interface DisseminationUpdate as VersionUpdate[dip_key_t key]; uses interface DipDecision as DipDataDecision; uses interface DipDecision as DipVectorDecision; uses interface DipDecision as DipSummaryDecision; uses interface DipHelp; } implementation { uint32_t windowSize; dip_hashlen_t totalPossible; dip_estimate_t estimates[UQCOUNT_DIP]; uint16_t diplog(uint16_t base, uint16_t num); uint16_t dipexp(uint16_t base, uint16_t expt); dip_estimate_t getDataEstimate(dip_hashlen_t len); dip_estimate_t getMaxEstimate(dip_hashlen_t len); uint8_t sendDecision(); command error_t Init.init() { windowSize = DIP_TAU_HIGH; DIP_DATA_ESTIMATE = getDataEstimate(UQCOUNT_DIP); DIP_MAX_ESTIMATE = getMaxEstimate(UQCOUNT_DIP); DIP_VECTOR_ESTIMATE = DIP_DATA_ESTIMATE - 1; totalPossible = call DipEstimates.estimateToHashlength(0); dbg("DipLogicP", "Real Total: %u, Dip Total: %u\n", UQCOUNT_DIP, totalPossible); if(totalPossible < UQCOUNT_DIP) { DIP_DATA_ESTIMATE++; DIP_MAX_ESTIMATE++; DIP_VECTOR_ESTIMATE++; totalPossible = call DipEstimates.estimateToHashlength(0); } dbg("DipLogicP", "Real Total: %u, DIP New Total: %u\n", UQCOUNT_DIP, totalPossible); dbg("DipLogicP","DATA_ESTIMATE initialized to %u\n", DIP_DATA_ESTIMATE); dbg("DipLogicP","MAX_ESTIMATE initialized to %u\n", DIP_MAX_ESTIMATE); dbg("DipLogicP","VECT_ESTIMATE initialized to %u\n", DIP_VECTOR_ESTIMATE); dbg("DipLogicP","DIP ready\n"); return SUCCESS; } event void Boot.booted() { } command error_t StdControl.start() { return call DipTrickleTimer.start(); } command error_t StdControl.stop() { call DipTrickleTimer.stop(); return SUCCESS; } command void DisseminationUpdate.change[dip_key_t key](dip_data_t* val) { dip_index_t i; dbg("DipLogicP","App notified key %x is new\n", key); i = call DipHelp.keyToIndex(key); #ifndef DIP_JOINTEST estimates[i] = DIP_DATA_ESTIMATE; #endif call VersionUpdate.change[key](val); call DipTrickleTimer.reset(); } event uint32_t DipTrickleTimer.requestWindowSize() { dip_index_t i; dip_estimate_t max = 0; for(i = 0; i < UQCOUNT_DIP; i++) { if(estimates[i] > 0) { max = estimates[i]; windowSize = DIP_TAU_LOW; break; } } if(max == 0) { windowSize = windowSize << 1; if(windowSize > DIP_TAU_HIGH) { windowSize = DIP_TAU_HIGH; } } dbg("DipLogicP", "Window size requested, give %u\n", windowSize); return windowSize; } event void DipTrickleTimer.fired() { dip_index_t i; uint8_t decision; dbg("DipLogicP","Trickle Timer fired!\n"); for(i = 0; i < UQCOUNT_DIP; i++) { dbg("DipLogicP","Index-%u Estimate-%u\n", i, estimates[i]); } decision = sendDecision(); switch(decision) { case ID_DIP_INVALID: dbg("DipLogicP", "Decision to SUPPRESS\n"); break; case ID_DIP_SUMMARY: dbg("DipLogicP", "Decision to SUMMARY\n"); call DipSummaryDecision.send(); break; case ID_DIP_VECTOR: dbg("DipLogicP", "Decision to VECTOR\n"); call DipVectorDecision.send(); break; case ID_DIP_DATA: dbg("DipLogicP", "Decision to DATA\n"); call DipDataDecision.send(); break; } call DipDataDecision.resetCommRate(); call DipVectorDecision.resetCommRate(); call DipSummaryDecision.resetCommRate(); } command dip_estimate_t* DipEstimates.getEstimates() { return estimates; } command void DipEstimates.decEstimateByIndex(dip_index_t i) { if(estimates[i] != 0) { estimates[i] = estimates[i] - 1; } } command void DipEstimates.decEstimateByKey(dip_key_t key) { dip_index_t i; i = call DipHelp.keyToIndex(key); call DipEstimates.decEstimateByIndex(i); } command dip_estimate_t DipEstimates.hashlengthToEstimate(dip_hashlen_t len) { if(len == UQCOUNT_DIP) { len = totalPossible; } return DIP_MAX_ESTIMATE - diplog(DIP_SUMMARY_VALUES_PER_PACKET, len); } command dip_hashlen_t DipEstimates.estimateToHashlength(dip_estimate_t est) { uint8_t expt, base; uint16_t val; base = DIP_SUMMARY_VALUES_PER_PACKET; expt = DIP_MAX_ESTIMATE - est; val = dipexp(base, expt); if(val > UQCOUNT_DIP) { // bring length back down if over UQCOUNT_DIP val = UQCOUNT_DIP; } return val; } /* Calculation functions */ uint16_t diplog(uint16_t base, uint16_t num) { uint8_t counter; counter = 0; while(num != 0) { num = num / base; counter++; } return counter - 1; } command void DipEstimates.setDataEstimate(dip_key_t key) { dip_index_t i; i = call DipHelp.keyToIndex(key); estimates[i] = DIP_DATA_ESTIMATE; call DipTrickleTimer.reset(); } command void DipEstimates.setVectorEstimate(dip_key_t key) { dip_index_t i; i = call DipHelp.keyToIndex(key); if(estimates[i] < DIP_VECTOR_ESTIMATE) { estimates[i] = DIP_VECTOR_ESTIMATE; } call DipTrickleTimer.reset(); } command void DipEstimates.setSummaryEstimateByIndex(dip_index_t ind, dip_estimate_t est) { if(estimates[ind] < est) { estimates[ind] = est; } call DipTrickleTimer.reset(); } uint16_t dipexp(uint16_t base, uint16_t expt) { uint16_t ans; ans = 1; while(expt > 0) { if((expt & 1) == 0) { base = base * base; expt = expt >> 1; } else { ans = ans * base; expt = expt - 1; } } return ans; } dip_estimate_t getDataEstimate(dip_hashlen_t len) { dip_estimate_t h_total; dip_estimate_t v_total; h_total = diplog(DIP_SUMMARY_VALUES_PER_PACKET, len); v_total = diplog(DIP_SUMMARY_VALUES_PER_PACKET, DIP_VECTOR_VALUES_PER_PACKET); return h_total - v_total + 1; } dip_estimate_t getMaxEstimate(dip_hashlen_t len) { return diplog(DIP_SUMMARY_VALUES_PER_PACKET, len); } uint8_t sendDecision() { dip_estimate_t highEst; dip_estimate_t est; uint8_t dataCommRate; uint8_t vectorCommRate; uint8_t summaryCommRate; dip_estimate_t* allEsts; dip_index_t i; uint16_t E, D, L, V, C; allEsts = call DipEstimates.getEstimates(); highEst = 0; dataCommRate = call DipDataDecision.getCommRate(); vectorCommRate = call DipVectorDecision.getCommRate(); summaryCommRate = call DipSummaryDecision.getCommRate(); if(dataCommRate >= DIP_DATA_SUPPRESSION) { dbg("DipLogicP", "Heard data\n"); return ID_DIP_INVALID; } // if there is an estimate with highest estimate value, send for(i = 0; i < UQCOUNT_DIP; i++) { est = allEsts[i]; if(est >= DIP_DATA_ESTIMATE) { return ID_DIP_DATA; } if(est > highEst) { highEst = est; }; } // didn't send or hear data at this point if(vectorCommRate + summaryCommRate >= DIP_ADV_SUPPRESSION) { dbg("DipLogicP", "Heard an advertisement\n"); return ID_DIP_INVALID; } // corner case, if hash is too short if(call DipEstimates.estimateToHashlength(highEst) <= DIP_VECTOR_VALUES_PER_PACKET) { return ID_DIP_VECTOR; } // now we make the DIP decision C = dataCommRate + vectorCommRate + summaryCommRate; if(C == 0) C = 1; // don't want to divide by zero E = highEst; D = DIP_DATA_ESTIMATE; L = call DipEstimates.estimateToHashlength(E); V = DIP_VECTOR_VALUES_PER_PACKET; dbg("DipLogicP", "D=%u, E=%u, L=%u, V=%u, C=%u\n", D, E, L, V, C); if((D - E) < (L / (C * V))) { return ID_DIP_SUMMARY; } return ID_DIP_VECTOR; } } tinyos-2.1.2+dfsg/tos/lib/net/dip/DipSummaryC.nc000066400000000000000000000007141207233610700214170ustar00rootroot00000000000000 configuration DipSummaryC { provides interface DipDecision; uses interface DipSend as SummarySend; uses interface DipReceive as SummaryReceive; uses interface DipHelp; uses interface DipEstimates; } implementation { components DipSummaryP; DipDecision = DipSummaryP; SummarySend = DipSummaryP; SummaryReceive = DipSummaryP; DipHelp = DipSummaryP; DipEstimates = DipSummaryP; components RandomC; DipSummaryP.Random -> RandomC; } tinyos-2.1.2+dfsg/tos/lib/net/dip/DipSummaryP.nc000066400000000000000000000204111207233610700214300ustar00rootroot00000000000000 // Need to deal with non powers of base for the length of the hash #include module DipSummaryP { provides interface DipDecision; uses interface DipSend as SummarySend; uses interface DipReceive as SummaryReceive; uses interface DipHelp; uses interface DipEstimates; uses interface Random; } implementation { void findRangeShadow(dip_index_t* left, dip_index_t *right); uint32_t buildRange(dip_index_t left, dip_index_t right); uint32_t computeHash(dip_index_t left, dip_index_t right, dip_version_t* basedata, uint32_t salt); uint32_t computeBloomHash(dip_index_t left, dip_index_t right, dip_version_t* basedata, uint32_t salt); void splitRange(uint32_t info, dip_index_t* left, dip_index_t* right); void adjustEstimatesSame(dip_index_t left, dip_index_t right); void adjustEstimatesDiff(dip_index_t left, dip_index_t rightt, dip_version_t* data, uint32_t salt, uint32_t bHash); uint8_t commRate; // this can be combined with pairs_t in DIPVectorP maybe? dip_estimate_t shadowEstimates[UQCOUNT_DIP]; command uint8_t DipDecision.getCommRate() { return commRate; } command void DipDecision.resetCommRate() { commRate = 0; } command error_t DipDecision.send() { dip_index_t i, j, left, right; dip_version_t* allVers; dip_estimate_t* allEsts; uint32_t salt; dip_msg_t* dmsg; dip_summary_msg_t* dsmsg; dmsg = (dip_msg_t*) call SummarySend.getPayloadPtr(); if(dmsg == NULL) { return FAIL; } dmsg->type = ID_DIP_SUMMARY; dsmsg = (dip_summary_msg_t*) dmsg->content; allVers = call DipHelp.getAllVersions(); allEsts = call DipEstimates.getEstimates(); salt = call Random.rand32(); for(i = 0; i < UQCOUNT_DIP; i++) { shadowEstimates[i] = allEsts[i]; } for(i = 0; i < DIP_SUMMARY_ENTRIES_PER_PACKET; i += 3) { findRangeShadow(&left, &right); dbg("DipSummaryP", "Found range %u, %u\n", left, right); dsmsg->info[i] = buildRange(left, right); dsmsg->info[i+1] = computeHash(left, right, allVers, salt); dsmsg->info[i+2] = computeBloomHash(left, right, allVers, salt); for(j = left; j < right; j++) { shadowEstimates[j] = 0; } dbg("DipSummaryP", "Hash Entry: %08x %08x %08x\n", dsmsg->info[i], dsmsg->info[i+1], dsmsg->info[i+2]); } dsmsg->unitLen = DIP_SUMMARY_ENTRIES_PER_PACKET; dsmsg->salt = salt; for(i = 0; i < DIP_SUMMARY_ENTRIES_PER_PACKET; i += 3) { splitRange(dsmsg->info[i], &left, &right); adjustEstimatesSame(left, right); } return call SummarySend.send(sizeof(dip_msg_t) + sizeof(dip_summary_msg_t) + (sizeof(uint32_t) * DIP_SUMMARY_ENTRIES_PER_PACKET)); } event void SummaryReceive.receive(void* payload, uint8_t len) { dip_summary_msg_t* dsmsg; uint8_t unitlen; uint32_t salt, myHash; uint8_t i; dip_index_t left, right; dip_version_t* allVers; commRate = commRate + 1; dsmsg = (dip_summary_msg_t*) payload; unitlen = dsmsg->unitLen; salt = dsmsg->salt; allVers = call DipHelp.getAllVersions(); for(i = 0; i < unitlen; i += 3) { splitRange(dsmsg->info[i], &left, &right); myHash = computeHash(left, right, allVers, salt); //dbg("DipSummaryP", "Received Range: %u, %u\n", left, right); //dbg("DipSummaryP", "Received Hash: %08x\n", dsmsg->info[i+1]); //dbg("DipSummaryP", "My Hash: %08x\n", myHash); if(myHash != dsmsg->info[i+1]) { // hashes don't match adjustEstimatesDiff(left, right, allVers, salt, dsmsg->info[i+2]); } else { // hashes match adjustEstimatesSame(left, right); } } } void findRangeShadow(dip_index_t* left, dip_index_t *right) { dip_estimate_t est1; dip_estimate_t est2; dip_hashlen_t len; dip_index_t highIndex; dip_index_t i; dip_index_t LBound; dip_index_t RBound; uint16_t runEstSum; uint16_t highEstSum; // find highest estimate // initialize test highIndex = 0; est1 = shadowEstimates[0]; // Get the highest estimate key for(i = 0; i < UQCOUNT_DIP; i++) { est2 = shadowEstimates[i]; if(est2 > est1) { highIndex = i; est1 = est2; } } len = call DipEstimates.estimateToHashlength(est1); dbg("DipSummaryP","Highest key at %u with estimate %u and thus len %u\n", highIndex, est1, len); // initialize bounds on range if(highIndex < len - 1) { LBound = 0; } else { LBound = highIndex - len + 1; } if(highIndex + len > UQCOUNT_DIP) { RBound = UQCOUNT_DIP; } else { RBound = highIndex + len; } // adjust length if necessary if(RBound - LBound < len) { len = RBound - LBound; } // initialize first range highEstSum = 0; highIndex = LBound; for(i = LBound; i < LBound + len; i++) { est1 = shadowEstimates[i]; highEstSum += est1; } dbg("DipSummaryP", "First range: %u, %u = %u\n", LBound, LBound + len, highEstSum); // iterate through the range runEstSum = highEstSum; dbg("DipSummaryP", "Iterating from %u to %u with len %u\n", LBound, RBound, len); for(i = LBound ; i + len < RBound; i++) { est1 = shadowEstimates[i]; est2 = shadowEstimates[i + len]; //dbg("DipSummaryP", "i: %u\n", i); //dbg("DipSummaryP", "i+len: %u\n", i+len); runEstSum = runEstSum - est1 + est2; // dbg("Dissemination","Next sum: %u\n", runEstSum); if(runEstSum > highEstSum) { highEstSum = runEstSum; highIndex = i + 1; dbg("DipSummaryP", "Next range: %u, %u = %u\n", highIndex, highIndex + len, highEstSum); } } // and finish *left = highIndex; *right = highIndex + len; dbg("DipSummaryP","Final Range: %u, %u\n", *left, *right); } uint32_t buildRange(dip_index_t left, dip_index_t right) { uint32_t range; range = ((uint32_t) left << 16) | right; return range; } uint32_t computeHash(dip_index_t left, dip_index_t right, dip_version_t* basedata, uint32_t salt) { dip_index_t i; uint32_t hashValue = salt; //uint8_t *sequence; dip_version_t* sequence; uint32_t iterations; if(right <= left) return 0; //sequence = ((uint8_t*) (basedata + left)); sequence = (basedata + left); //iterations = (right - left - 1)*sizeof(dip_version_t); iterations = (right - left - 1); //dbg("DipSummaryP","Computing hash for %u, %u for %u iters\n", left, right, iterations); for(i = 0; i <= iterations; i++) { hashValue += sequence[i]; hashValue += (hashValue << 10); hashValue ^= (hashValue >> 6); } hashValue += (hashValue << 3); hashValue ^= (hashValue >> 11); hashValue += (hashValue << 15); return hashValue; } uint32_t computeBloomHash(dip_index_t left, dip_index_t right, dip_version_t* basedata, uint32_t salt) { dip_index_t i; uint32_t bit; uint32_t returnHash; uint32_t indexSeqPair[2]; returnHash = 0; for(i = left; i < right; i++) { indexSeqPair[0] = i; indexSeqPair[1] = basedata[i]; bit = computeHash(0, 2, indexSeqPair, salt) % 32; //dbg("DipSummaryP", "Bloom Hash: %u, %u, %u\n", indexSeqPair[0], indexSeqPair[1], bit); returnHash |= (1 << bit); } return returnHash; } void splitRange(uint32_t info, dip_index_t* left, dip_index_t* right) { *right = info & 0xFFFF; *left = (info >> 16) & 0xFFFF; } void adjustEstimatesSame(dip_index_t left, dip_index_t right) { dip_index_t i; for(i = left; i < right; i++) { call DipEstimates.decEstimateByIndex(i); } } void adjustEstimatesDiff(dip_index_t left, dip_index_t right, dip_version_t* data, uint32_t salt, uint32_t bHash) { dip_index_t i; dip_estimate_t est; dip_key_t key; uint32_t indexSeqPair[2]; uint32_t bit; est = call DipEstimates.hashlengthToEstimate(right - left) + 1; // + 1 to improve search for(i = left; i < right; i++) { indexSeqPair[0] = i; indexSeqPair[1] = data[i]; bit = computeHash(0, 2, indexSeqPair, salt) % 32; key = call DipHelp.indexToKey(i); if(bHash & (1 << bit)) { //set estimate only if better call DipEstimates.setSummaryEstimateByIndex(i, est); } else { dbg("DisseminationDebug", "Key %x definitely different\n", key); call DipEstimates.setVectorEstimate(key); } } } } tinyos-2.1.2+dfsg/tos/lib/net/dip/DipTrickleMilliC.nc000066400000000000000000000053271207233610700223530ustar00rootroot00000000000000// $Id: DipTrickleMilliC.nc,v 1.2 2010-06-29 22:07:49 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Configuration that encapsulates the trickle timer implementation to * its needed services and initialization. For details on the working * of the parameters, please refer to Levis et al., "A Self-Regulating * Algorithm for Code Maintenance and Propagation in Wireless Sensor * Networks," NSDI 2004. * * @param l Lower bound of the time period in seconds. * @param h Upper bound of the time period in seconds. * @param k Redundancy constant. * @param count How many timers to provide. * * @author Philip Levis * @author Gilman Tolle * @date Jan 7 2006 */ configuration DipTrickleMilliC { provides interface DipTrickleTimer as TrickleTimer; } implementation { components DipTrickleMilliP as TrickleP; components MainC, RandomC; components new TimerMilliC() as PeriodicIntervalTimer; components new TimerMilliC() as SingleEventTimer; components LedsC; TrickleTimer = TrickleP; TrickleP.PeriodicIntervalTimer -> PeriodicIntervalTimer; TrickleP.SingleEventTimer -> SingleEventTimer; TrickleP.Random -> RandomC; TrickleP.Leds -> LedsC; MainC.SoftwareInit -> TrickleP; } tinyos-2.1.2+dfsg/tos/lib/net/dip/DipTrickleMilliP.nc000066400000000000000000000101251207233610700223600ustar00rootroot00000000000000// $Id: DipTrickleMilliP.nc,v 1.2 2010-06-29 22:07:49 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Module that provides a service instance of trickle timers. For * details on the working of the parameters, please refer to Levis et * al., "A Self-Regulating Algorithm for Code Maintenance and * Propagation in Wireless Sensor Networks," NSDI 2004. * * @param l Lower bound of the time period in seconds. * @param h Upper bound of the time period in seconds. * @param k Redundancy constant. * @param count How many timers to provide. * * @author Philip Levis * @author Gilman Tolle * @date Jan 7 2006 */ #include #include module DipTrickleMilliP { provides { interface Init; interface DipTrickleTimer as TrickleTimer; } uses { interface Timer as PeriodicIntervalTimer; interface Timer as SingleEventTimer; interface Random; interface Leds; } } implementation { uint32_t period; command error_t Init.init() { period = DIP_TAU_HIGH; return SUCCESS; } /** * Start a trickle timer. Reset the counter to 0. */ command error_t TrickleTimer.start() { call PeriodicIntervalTimer.startOneShot(period); dbg("DipTrickleMilliP", "Starting trickle timer @ %s\n", sim_time_string()); return SUCCESS; } /** * Stop the trickle timer. This call sets the timer period to H. */ command void TrickleTimer.stop() { call PeriodicIntervalTimer.stop(); dbg("DipTrickleMilliP", "Stopping trickle timer @ %s\n", sim_time_string()); } /** * Reset the timer period to L. If called while the timer is running, * then a new interval (of length L) begins immediately. */ command void TrickleTimer.reset() { period = DIP_TAU_LOW; call PeriodicIntervalTimer.stop(); call PeriodicIntervalTimer.startOneShot(period); dbg("DipTrickleMilliP", "Resetting trickle timer @ %s\n", sim_time_string()); } command void TrickleTimer.maxInterval() { period = DIP_TAU_HIGH; } /** * The trickle timer has fired. Signaled if C > K. */ event void PeriodicIntervalTimer.fired() { uint32_t dtfire; dtfire = (call Random.rand16() % (period / 2)) + (period / 2); dbg("DipTrickleMilliP", "Scheduling Trickle event with %u\n", dtfire); call SingleEventTimer.startOneShot(dtfire); period = signal TrickleTimer.requestWindowSize(); call PeriodicIntervalTimer.startOneShot(period); //call Leds.led0Toggle(); } event void SingleEventTimer.fired() { dbg("Trickle", "Firing Trickle Event Timer\n"); signal TrickleTimer.fired(); } } tinyos-2.1.2+dfsg/tos/lib/net/dip/DipVectorC.nc000066400000000000000000000007001207233610700212170ustar00rootroot00000000000000 configuration DipVectorC { provides interface DipDecision; uses interface DipSend as VectorSend; uses interface DipReceive as VectorReceive; uses interface DipHelp; uses interface DipEstimates; } implementation { components DipVectorP; DipDecision = DipVectorP; VectorSend = DipVectorP; VectorReceive = DipVectorP; DipHelp = DipVectorP; DipEstimates = DipVectorP; components RandomC; DipVectorP.Random -> RandomC; } tinyos-2.1.2+dfsg/tos/lib/net/dip/DipVectorP.nc000066400000000000000000000071311207233610700212410ustar00rootroot00000000000000 #include module DipVectorP { provides interface DipDecision; uses interface DipSend as VectorSend; uses interface DipReceive as VectorReceive; uses interface DipHelp; uses interface DipEstimates; uses interface Random; } implementation { uint8_t commRate = 0; typedef struct pairs_t { dip_estimate_t estimate; dip_key_t key; } pairs_t; pairs_t pairs[UQCOUNT_DIP]; // This is large memory footprint int myComparator(const void* a, const void* b); void randomizeRun(pairs_t* localPairs, dip_index_t length); command uint8_t DipDecision.getCommRate() { return commRate; } command void DipDecision.resetCommRate() { commRate = 0; } command error_t DipDecision.send() { dip_index_t i, j, r; dip_key_t sendkey; dip_estimate_t* ests; dip_msg_t* dmsg; dip_vector_msg_t* dvmsg; dmsg = call VectorSend.getPayloadPtr(); if(dmsg == NULL) { return FAIL; } ests = call DipEstimates.getEstimates(); // get all estimates and sort for(i = 0; i < UQCOUNT_DIP; i++) { pairs[i].key = call DipHelp.indexToKey(i); pairs[i].estimate = ests[i]; } qsort(pairs, UQCOUNT_DIP, sizeof(pairs_t), myComparator); j = pairs[0].estimate; r = 0; for(i = 0; i < UQCOUNT_DIP; i++) { if(pairs[i].estimate < j) { randomizeRun(&pairs[r], i - r); j = pairs[i].estimate; r = i; } } // randomize the last set randomizeRun(&pairs[r], UQCOUNT_DIP - r); // fill up the packet dmsg->type = ID_DIP_VECTOR; dvmsg = (dip_vector_msg_t*) dmsg->content; dvmsg->unitLen = DIP_VECTOR_ENTRIES_PER_PACKET; for(i = 0, j = 0; i < DIP_VECTOR_ENTRIES_PER_PACKET; i += 2, j++) { sendkey = pairs[j].key; dvmsg->vector[i] = sendkey; dvmsg->vector[i+1] = call DipHelp.keyToVersion(sendkey); // adjust estimate call DipEstimates.decEstimateByKey(sendkey); } return call VectorSend.send(sizeof(dip_msg_t) + sizeof(dip_vector_msg_t) + (DIP_VECTOR_ENTRIES_PER_PACKET * sizeof(uint32_t))); } event void VectorReceive.receive(void* payload, uint8_t len) { dip_vector_msg_t* dvmsg; uint8_t unitlen; uint8_t i; dip_key_t vectorkey; dip_version_t vectorver; dip_version_t myver; commRate = commRate + 1; dvmsg = (dip_vector_msg_t*) payload; unitlen = dvmsg->unitLen; for(i = 0; i < unitlen; i += 2) { vectorkey = dvmsg->vector[i]; vectorver = dvmsg->vector[i+1]; myver = call DipHelp.keyToVersion(vectorkey); // TODO: handle the invalid versions if(myver < vectorver) { call DipEstimates.setVectorEstimate(vectorkey); } else if(myver > vectorver) { call DipEstimates.setDataEstimate(vectorkey); } else if(myver == vectorver) { call DipEstimates.decEstimateByKey(vectorkey); } } } int myComparator(const void* a, const void* b) { const pairs_t *x = (const pairs_t *) a; const pairs_t *y = (const pairs_t *) b; if( x->estimate < y->estimate ) { return 1; } if( x->estimate > y->estimate ) { return -1; } return 0; } void randomizeRun(pairs_t* localPairs, dip_index_t length) { dip_index_t i,j; dip_index_t rLength = length; pairs_t temp; // don't move the last one for(i = 0; i < length - 1; i++, rLength--) { j = i + (call Random.rand16() % rLength); temp.key = localPairs[i].key; temp.estimate = localPairs[i].estimate; localPairs[i].key = localPairs[j].key; localPairs[i].estimate = localPairs[j].estimate; localPairs[j].key = temp.key; localPairs[j].estimate = temp.estimate; } } } tinyos-2.1.2+dfsg/tos/lib/net/dip/DipVersionC.nc000066400000000000000000000004011207233610700214000ustar00rootroot00000000000000 #include configuration DipVersionC { provides interface DipHelp; provides interface DisseminationUpdate[dip_key_t key]; } implementation { components DipVersionP; DipHelp = DipVersionP; DisseminationUpdate = DipVersionP; } tinyos-2.1.2+dfsg/tos/lib/net/dip/DipVersionP.nc000066400000000000000000000050621207233610700214250ustar00rootroot00000000000000 module DipVersionP { provides interface DipHelp; provides interface DisseminationUpdate[dip_key_t key]; } implementation { int lessThan(const void* a, const void* b); // keys are ordered from smallest to largest. dip_key_t keys[UQCOUNT_DIP]; dip_version_t versions[UQCOUNT_DIP]; dip_index_t count = 0; command void DipHelp.registerKey(dip_key_t key) { dip_index_t i; keys[count] = key; count = count + 1; if(count == UQCOUNT_DIP) { qsort(keys, UQCOUNT_DIP, sizeof(dip_key_t), lessThan); dbg("DipVersionP","Key registration complete!\n"); for(i = 0; i < UQCOUNT_DIP; i++) { dbg("DipVersionP","Key %x\n", keys[i]); } } } command void DisseminationUpdate.change[dip_key_t key](dip_data_t* val) { dip_index_t i; dip_version_t ver; i = call DipHelp.keyToIndex(key); ver = versions[i]; // the version has node ID embedded in it, so need to do some shifts ver = ver >> 16; ver++; if ( ver == DIP_UNKNOWN_VERSION ) { ver++; } ver = ver << 16; ver += TOS_NODE_ID; versions[i] = ver; } command dip_index_t DipHelp.keyToIndex(dip_key_t key) { dip_index_t answer; dip_index_t i; answer = DIP_UNKNOWN_INDEX; // linear search for now since it's easier for(i = 0; i < UQCOUNT_DIP; i++) { if(keys[i] == key) { answer = i; break; } } dbg("DipVersionP", "Converting key %x to index %u\n", key, answer); return answer; } command dip_key_t DipHelp.indexToKey(dip_index_t ind) { return keys[ind]; } command dip_version_t DipHelp.keyToVersion(dip_key_t key) { dip_index_t i; i = call DipHelp.keyToIndex(key); if(i == DIP_UNKNOWN_INDEX) { return DIP_UNKNOWN_VERSION; } return versions[i]; } command void DipHelp.setVersion(dip_key_t key, dip_version_t ver) { dip_index_t i; i = call DipHelp.keyToIndex(key); versions[i] = ver; dbg("DipVersionP","Setting key %x at index %u to version %x\n", key, i, ver); } command dip_version_t* DipHelp.getAllVersions() { return versions; } int lessThan(const void* a, const void* b) { if ((*(dip_key_t*) a) < (*(dip_key_t*) b)) { return -1; } else if ((*(dip_key_t*) a) > (*(dip_key_t*) b)) { return 1; } return 0; } // binary search code which may be unstable /* dip_index_t answer; search_result = (dip_key_t*) bsearch(&key, &keys, UQCOUNT_DIP, sizeof(dip_key_t), lessThan); if(search_result == NULL) { return DIP_UNKNOWN_INDEX; } answer = search_result - keys; */ } tinyos-2.1.2+dfsg/tos/lib/net/dip/DisseminationC.nc000066400000000000000000000002331207233610700221270ustar00rootroot00000000000000 #include configuration DisseminationC { provides interface StdControl; } implementation { components DipLogicC; StdControl = DipLogicC; } tinyos-2.1.2+dfsg/tos/lib/net/dip/DisseminatorC.nc000066400000000000000000000056031207233610700217700ustar00rootroot00000000000000#include /* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The DisseminatorC component holds and synchronizes a single value * of a chosen type, and identifies that value by a chosen 16-bit key. * Different nodes should use the same key for the same value. * * See TEP118 - Dissemination for details. * * @param t the type of the object that will be disseminated * @param key the 16-bit identifier of the disseminated object * * @author Gilman Tolle * @version $Revision: 1.2 $ $Date: 2008-01-03 21:30:35 $ */ generic configuration DisseminatorC(typedef t, dip_key_t key) { provides interface DisseminationValue; provides interface DisseminationUpdate; } implementation { enum { JUST_NEED_COUNT = UQ_DIP }; components new DisseminatorP(t, key); DisseminationValue = DisseminatorP.AppDisseminationValue; DisseminationUpdate = DisseminatorP.AppDisseminationUpdate; components LedsC; DisseminatorP.Leds -> LedsC; components DipLogicC; DisseminatorP.DipDisseminationUpdate -> DipLogicC.DisseminationUpdate[key]; components DipVersionC; DisseminatorP.DipHelp -> DipVersionC; components MainC; MainC.SoftwareInit -> DisseminatorP; components DipDataC; DipDataC.DisseminationUpdate[key] -> DisseminatorP.DataDisseminationUpdate; DipDataC.DisseminationValue[key] -> DisseminatorP.DataDisseminationValue; } tinyos-2.1.2+dfsg/tos/lib/net/dip/DisseminatorP.nc000066400000000000000000000077021207233610700220070ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The DisseminatorP module holds and synchronizes a single value of a * chosen type. * * See TEP118 - Dissemination for details. * * @param t the type of the object that will be disseminated * * @author Gilman Tolle * @version $Revision: 1.3 $ $Date: 2008-02-16 10:56:07 $ */ generic module DisseminatorP(typedef t, dip_key_t key) { provides interface DisseminationValue as AppDisseminationValue; provides interface DisseminationUpdate as AppDisseminationUpdate; provides interface DisseminationUpdate as DataDisseminationUpdate; provides interface DisseminationValue as DataDisseminationValue; provides interface Init; uses interface DisseminationUpdate as DipDisseminationUpdate; uses interface DipHelp; uses interface Leds; } implementation { dip_data_t valueCache; task void signalNewData() { signal AppDisseminationValue.changed(); } command error_t Init.init() { call DipHelp.registerKey(key); return SUCCESS; } // A sequence number is 32 bits. The top 16 bits are an incrementing // counter, while the bottom 16 bits are a unique node identifier. // But versions aren't stored here. command const t* AppDisseminationValue.get() { return (t*) &valueCache; } command void AppDisseminationValue.set( const t* val ) { memcpy( &valueCache, val, sizeof(t) ); // must signal here instead of posting task to prevent race condition signal AppDisseminationValue.changed(); } command void AppDisseminationUpdate.change( t* newVal ) { memcpy( &valueCache, newVal, sizeof(t) ); /* Increment the counter and append the local node ID later. */ /* DipLogicC doesn't care what the data actually is, it just wants the key, so we cast it recklessly */ call DipDisseminationUpdate.change((dip_data_t*)newVal); post signalNewData(); } command const dip_data_t* DataDisseminationValue.get() { return (dip_data_t*) &valueCache; } command void DataDisseminationValue.set( const dip_data_t* val ) { } command void DataDisseminationUpdate.change( dip_data_t* newVal ) { memcpy( &valueCache, newVal, sizeof(dip_data_t) ); // don't post the task, this came from the network signal AppDisseminationValue.changed(); } default event void AppDisseminationValue.changed() { } default event void DataDisseminationValue.changed() { } } tinyos-2.1.2+dfsg/tos/lib/net/dip/README000066400000000000000000000017311207233610700175600ustar00rootroot00000000000000 Title: Dip Author: Kaisen Lin (kaisenl@cs.ucsd.edu) ------------------ Dip is a dissemination protocol for detecting and disseminating new items in a network. It uses the same interfaces as Drip. It improves node density and item scalability by sending only one packet per interval rather than many. If the network is small and with very few data items, Drip may be more efficient due to Dip's advertisement overhead. Notes: ------ Data disseminated under Dip cannot be larger than 16 bytes. It was not designed for large data items, but rather for many small data items. Ties, like Drip, are handled with higher node IDs serving as tiebreakers. Key 0 is reserved, do not use it. There is minimal error checking, don't try to intentionally break it. (e.g. illegal keys, weird and wacky version numbers) Usage: ------ To use include the following in your Makefile: CFLAGS += -I$(TOSDIR)/lib/net CFLAGS += -I$(TOSDIR)/lib/net/dip CFLAGS += -I$(TOSDIR)/lib/net/dip/interfaces tinyos-2.1.2+dfsg/tos/lib/net/dip/interfaces/000077500000000000000000000000001207233610700210215ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/dip/interfaces/DipDecision.nc000066400000000000000000000001661207233610700235400ustar00rootroot00000000000000 interface DipDecision { command uint8_t getCommRate(); command void resetCommRate(); command error_t send(); } tinyos-2.1.2+dfsg/tos/lib/net/dip/interfaces/DipEstimates.nc000066400000000000000000000010411207233610700237320ustar00rootroot00000000000000 #include interface DipEstimates { command dip_estimate_t* getEstimates(); command void decEstimateByIndex(dip_index_t i); command void decEstimateByKey(dip_key_t key); command dip_hashlen_t estimateToHashlength(dip_estimate_t est); command dip_estimate_t hashlengthToEstimate(dip_hashlen_t len); // special event to reset trickle timer too command void setDataEstimate(dip_key_t key); command void setVectorEstimate(dip_key_t key); command void setSummaryEstimateByIndex(dip_index_t ind, dip_estimate_t est); } tinyos-2.1.2+dfsg/tos/lib/net/dip/interfaces/DipHelp.nc000066400000000000000000000005251207233610700226720ustar00rootroot00000000000000 #include interface DipHelp { command void registerKey(dip_key_t key); command dip_index_t keyToIndex(dip_key_t key); command dip_key_t indexToKey(dip_index_t ind); command dip_version_t keyToVersion(dip_key_t key); command void setVersion(dip_key_t key, dip_version_t ver); command dip_version_t* getAllVersions(); } tinyos-2.1.2+dfsg/tos/lib/net/dip/interfaces/DipReceive.nc000066400000000000000000000001141207233610700233560ustar00rootroot00000000000000 interface DipReceive { event void receive(void* payload, uint8_t len); } tinyos-2.1.2+dfsg/tos/lib/net/dip/interfaces/DipSend.nc000066400000000000000000000002031207233610700226640ustar00rootroot00000000000000 interface DipSend { command error_t send(uint8_t len); command void* getPayloadPtr(); command uint8_t maxPayloadLength(); } tinyos-2.1.2+dfsg/tos/lib/net/dip/interfaces/DipTrickleTimer.nc000066400000000000000000000071211207233610700243770ustar00rootroot00000000000000// $Id: DipTrickleTimer.nc,v 1.2 2010-06-29 22:07:49 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * A network trickle timer. A trickle timer has a period in the range * [L, H]. After firing, the period is doubled, up to H. If the period * is P, then the timer is scheduled to fire in the interval [0.5P, P] * (the second half of a period). The period can be reset to L (the * smallest period, and therefore the highest frequency). * * The timer may be suppressed. If a user of the interface has heard * enough packets from other nodes that indicate its transmitting a * packet would be unncessarily redundant, then the timer does not * fire. The timer has a constant K and a counter C. If C >e; K, then * the timer does not fire. When an interval ends, C is reset to 0. * Calling incrementCounter increments C by one. * * For details, refer to Levis et al., "A Self-Regulating Algorithm * for Code Maintenance and Propagation in Wireless Sensor Networks," * NSDI 2004. The component providing this interface defines the * constants L, H, and K. * * @author Philip Levis * @date Jan 7 2006 */ interface DipTrickleTimer { /** * Start the trickle timer. At boot, the timer period is its maximum * value (H). If a protocol requires starting at the minimum value * (e.g., fast start), then it should call reset before * start. * * @return error_t SUCCESS if the timer was started, EBUSY if it is already * running, and FAIL otherwise. */ command error_t start(); /** * Stop the trickle timer. This call sets the timer period to H and * C to 0. */ command void stop(); /** * Reset the timer period to L. If called while the timer is * running, then a new interval (of length L) begins immediately. */ command void reset(); /** * The trickle timer has fired. Signaled if C > K. */ event void fired(); /** * Compute the window size based on Dip's estimates */ event uint32_t requestWindowSize(); /** * Resets the timer period to H. */ command void maxInterval(); } tinyos-2.1.2+dfsg/tos/lib/net/dip/interfaces/DipVersion.nc000066400000000000000000000001451207233610700234250ustar00rootroot00000000000000 #include interface DipVersion { command void setVersion(); command void incVersion(); }tinyos-2.1.2+dfsg/tos/lib/net/dip/qsort.c000066400000000000000000000105261207233610700202160ustar00rootroot00000000000000/*- * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ //#include typedef int cmp_t(const void *, const void *); static char *med3(char *, char *, char *, cmp_t *); static void swapfunc(char *, char *, int); #define min(a, b) ((a) < (b) ? (a) : (b)) /* * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". */ #define swapcode(TYPE, parmi, parmj, n) { \ int i = (n) / sizeof (TYPE); \ register TYPE *pi = (TYPE *) (parmi); \ register TYPE *pj = (TYPE *) (parmj); \ do { \ register TYPE t = *pi; \ *pi++ = *pj; \ *pj++ = t; \ } while (--i > 0); \ } static void swapfunc(char *a, char* b, int n) { swapcode(char, a, b, n) } #define swap(a, b) swapfunc(a, b, es) #define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n) static char * med3(char* a, char* b, char* c, cmp_t* cmp) { return cmp(a, b) < 0 ? (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a )) :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c )); } void qsort(void* a, size_t n, size_t es, cmp_t* cmp) { char *pa, *pb, *pc, *pd, *pl, *pm, *pn; int d, r, swap_cnt; loop: swap_cnt = 0; if (n < 7) { for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) for (pl = pm; pl > (char *)a && cmp(pl - es, pl) > 0; pl -= es) swap(pl, pl - es); return; } pm = (char *)a + (n / 2) * es; if (n > 7) { pl = a; pn = (char *)a + (n - 1) * es; if (n > 40) { d = (n / 8) * es; pl = med3(pl, pl + d, pl + 2 * d, cmp); pm = med3(pm - d, pm, pm + d, cmp); pn = med3(pn - 2 * d, pn - d, pn, cmp); } pm = med3(pl, pm, pn, cmp); } swap(a, pm); pa = pb = (char *)a + es; pc = pd = (char *)a + (n - 1) * es; for (;;) { while (pb <= pc && (r = cmp(pb, a)) <= 0) { if (r == 0) { swap_cnt = 1; swap(pa, pb); pa += es; } pb += es; } while (pb <= pc && (r = cmp(pc, a)) >= 0) { if (r == 0) { swap_cnt = 1; swap(pc, pd); pd -= es; } pc -= es; } if (pb > pc) break; swap(pb, pc); swap_cnt = 1; pb += es; pc -= es; } if (swap_cnt == 0) { /* Switch to insertion sort */ for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) for (pl = pm; pl > (char *)a && cmp(pl - es, pl) > 0; pl -= es) swap(pl, pl - es); return; } pn = (char *)a + n * es; r = min(pa - (char *)a, pb - pa); vecswap(a, pb - r, r); r = min(pd - pc, pn - pd - es); vecswap(pb, pn - r, r); if ((r = pb - pa) > es) qsort(a, r / es, es, cmp); if ((r = pd - pc) > es) { /* Iterate rather than recurse to save stack space */ a = pn - r; n = r / es; goto loop; } /* qsort(pn - r, r / es, es, cmp);*/ } tinyos-2.1.2+dfsg/tos/lib/net/drip/000077500000000000000000000000001207233610700170605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/drip/DisseminationC.nc000066400000000000000000000040521207233610700223140ustar00rootroot00000000000000#include /* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The DisseminationC component is the top-level interface to the * dissemination protocol. StdControl controls all of the trickle * timers used for all of the keys. * * See TEP118 - Dissemination for details. * * @author Gilman Tolle * @version $Revision: 1.1 $ */ configuration DisseminationC { provides interface StdControl; } implementation { components DisseminationEngineP; StdControl = DisseminationEngineP; } tinyos-2.1.2+dfsg/tos/lib/net/drip/DisseminationCache.nc000066400000000000000000000041411207233610700231340ustar00rootroot00000000000000 /* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The DisseminationCache interface connects each DisseminatorC * component to the DisseminationEngineC component. * * See TEP118 - Dissemination for details. * * @author Gilman Tolle * @version $Revision: 1.2 $ $Date: 2008-06-04 04:31:08 $ */ interface DisseminationCache { event error_t start(); event error_t stop(); command void* requestData( uint8_t* size ); command void storeData( void* COUNT(size) data, uint8_t size, uint32_t seqno ); command uint32_t requestSeqno(); event void newData(); } tinyos-2.1.2+dfsg/tos/lib/net/drip/DisseminationEngine.h000066400000000000000000000042121207233610700231640ustar00rootroot00000000000000#ifndef DISSEMINATION_ENGINE_H #define DISSEMINATION_ENGINE_H /* * Copyright (c) 2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /* * TODO: Add a tiebreaker and an application GUID to the header */ enum { AM_DISSEMINATION_MESSAGE = 0x60, AM_DISSEMINATION_PROBE_MESSAGE = 0x61, DISSEMINATION_SEQNO_UNKNOWN = 0, }; typedef nx_struct dissemination_message { nx_uint16_t key; nx_uint32_t seqno; nx_uint8_t (COUNT(0) data)[0]; // Deputy place-holder, field will probably be removed when we Deputize Drip } dissemination_message_t; typedef nx_struct dissemination_probe_message { nx_uint16_t key; } dissemination_probe_message_t; #endif tinyos-2.1.2+dfsg/tos/lib/net/drip/DisseminationEngineImplP.nc000066400000000000000000000176341207233610700243130ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The DisseminationEngineImplP component implements the dissemination * logic. * * See TEP118 - Dissemination for details. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2007-09-14 00:22:18 $ */ #include module DisseminationEngineImplP { provides interface StdControl; uses { interface DisseminationCache[uint16_t key]; interface TrickleTimer[uint16_t key]; interface StdControl as DisseminatorControl[uint16_t id]; interface AMSend; interface Receive; interface AMSend as ProbeAMSend; interface Receive as ProbeReceive; interface Leds; } } implementation { enum { NUM_DISSEMINATORS = uniqueCount("DisseminationTimerC.TrickleTimer") }; message_t m_buf; bool m_running; bool m_bufBusy; void sendProbe( uint16_t key ); void sendObject( uint16_t key ); command error_t StdControl.start() { uint8_t i; for ( i = 0; i < NUM_DISSEMINATORS; i++ ) { call DisseminatorControl.start[ i ](); } m_running = TRUE; return SUCCESS; } command error_t StdControl.stop() { uint8_t i; for ( i = 0; i < NUM_DISSEMINATORS; i++ ) { call DisseminatorControl.stop[ i ](); } m_running = FALSE; return SUCCESS; } event error_t DisseminationCache.start[ uint16_t key ]() { error_t result = call TrickleTimer.start[ key ](); call TrickleTimer.reset[ key ](); return result; } event error_t DisseminationCache.stop[ uint16_t key ]() { call TrickleTimer.stop[ key ](); return SUCCESS; } event void DisseminationCache.newData[ uint16_t key ]() { sendObject( key ); // Note we reset even if not running. This means that if Drip is // off and new data is received, it will reset the timer but not // send the object. This means that the timer continues properly, // but transmissions are suppressed. This is a better approach than // just leaving the timer in its prior state. call TrickleTimer.reset[ key ](); } event void TrickleTimer.fired[ uint16_t key ]() { sendObject( key ); } void sendProbe( uint16_t key ) { dissemination_probe_message_t* dpMsg = (dissemination_probe_message_t*) call ProbeAMSend.getPayload( &m_buf, sizeof(dissemination_probe_message_t)); if (dpMsg != NULL) { m_bufBusy = TRUE; dpMsg->key = key; call ProbeAMSend.send( AM_BROADCAST_ADDR, &m_buf, sizeof( dissemination_probe_message_t ) ); } } void sendObject( uint16_t key ) { void* object; uint8_t objectSize = 0; dissemination_message_t* dMsg; // If Drip is not running or if the Drip buffer // is busy, do not send. This fixes Issue #12 in the // Google code tracker. -pal if ( !m_running || m_bufBusy ) { return; } dMsg = (dissemination_message_t*) call AMSend.getPayload( &m_buf, sizeof(dissemination_message_t) ); if (dMsg != NULL) { m_bufBusy = TRUE; dMsg->key = key; dMsg->seqno = call DisseminationCache.requestSeqno[ key ](); if ( dMsg->seqno != DISSEMINATION_SEQNO_UNKNOWN ) { object = call DisseminationCache.requestData[ key ]( &objectSize ); if ((objectSize + sizeof(dissemination_message_t)) > call AMSend.maxPayloadLength()) { objectSize = call AMSend.maxPayloadLength() - sizeof(dissemination_message_t); } memcpy( dMsg->data, object, objectSize ); } call AMSend.send( AM_BROADCAST_ADDR, &m_buf, sizeof( dissemination_message_t ) + objectSize ); } } event void ProbeAMSend.sendDone( message_t* msg, error_t error ) { m_bufBusy = FALSE; } event void AMSend.sendDone( message_t* msg, error_t error ) { m_bufBusy = FALSE; } event message_t* Receive.receive( message_t* msg, void* payload, uint8_t len ) { dissemination_message_t* dMsg = (dissemination_message_t*) payload; uint16_t key = dMsg->key; uint32_t incomingSeqno = dMsg->seqno; uint32_t currentSeqno = call DisseminationCache.requestSeqno[ key ](); if ( !m_running ) { return msg; } if ( currentSeqno == DISSEMINATION_SEQNO_UNKNOWN && incomingSeqno != DISSEMINATION_SEQNO_UNKNOWN ) { call DisseminationCache.storeData[ key ] ( dMsg->data, len - sizeof( dissemination_message_t ), incomingSeqno ); call TrickleTimer.reset[ key ](); return msg; } if ( incomingSeqno == DISSEMINATION_SEQNO_UNKNOWN && currentSeqno != DISSEMINATION_SEQNO_UNKNOWN ) { call TrickleTimer.reset[ key ](); return msg; } if ( (int32_t)( incomingSeqno - currentSeqno ) > 0 ) { call DisseminationCache.storeData[key] ( dMsg->data, len - sizeof(dissemination_message_t), incomingSeqno ); dbg("Dissemination", "Received dissemination value 0x%08x,0x%08x @ %s\n", (int)key, (int)incomingSeqno, sim_time_string()); call TrickleTimer.reset[ key ](); } else if ( (int32_t)( incomingSeqno - currentSeqno ) == 0 ) { call TrickleTimer.incrementCounter[ key ](); } else { // Still not sure which of these is the best. Immediate send for now. sendObject( key ); // call TrickleTimer.reset[ key ](); } return msg; } event message_t* ProbeReceive.receive( message_t* msg, void* payload, uint8_t len) { dissemination_probe_message_t* dpMsg = (dissemination_probe_message_t*) payload; if ( !m_running ) { return msg; } if ( call DisseminationCache.requestSeqno[ dpMsg->key ]() != DISSEMINATION_SEQNO_UNKNOWN ) { sendObject( dpMsg->key ); } return msg; } default command void* DisseminationCache.requestData[uint16_t key]( uint8_t* size ) { return NULL; } default command void DisseminationCache.storeData[uint16_t key]( void* data, uint8_t size, uint32_t seqno ) {} default command uint32_t DisseminationCache.requestSeqno[uint16_t key]() { return DISSEMINATION_SEQNO_UNKNOWN; } default command error_t TrickleTimer.start[uint16_t key]() { return FAIL; } default command void TrickleTimer.stop[uint16_t key]() { } default command void TrickleTimer.reset[uint16_t key]() { } default command void TrickleTimer.incrementCounter[uint16_t key]() { } default command error_t DisseminatorControl.start[uint16_t id]() { return FAIL; } default command error_t DisseminatorControl.stop[uint16_t id]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/net/drip/DisseminationEngineP.nc000066400000000000000000000061471207233610700234660ustar00rootroot00000000000000#include /* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The DisseminationEngineP component retrieves values from the * DisseminatorP components and disseminates them over the radio. * * TODO: Hook DisseminationProbe up to the serial instead of the radio. * * See TEP118 - Dissemination for details. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2007-09-14 00:22:18 $ */ configuration DisseminationEngineP { provides interface StdControl; uses { interface DisseminationCache[uint16_t key]; interface TrickleTimer[uint16_t key]; interface StdControl as DisseminatorControl[uint16_t id]; } } implementation { components DisseminationEngineImplP; StdControl = DisseminationEngineImplP; DisseminationCache = DisseminationEngineImplP; TrickleTimer = DisseminationEngineImplP; DisseminatorControl = DisseminationEngineImplP; components new AMSenderC(AM_DISSEMINATION_MESSAGE) as DisseminationSendC; DisseminationEngineImplP.AMSend -> DisseminationSendC.AMSend; components new AMReceiverC(AM_DISSEMINATION_MESSAGE) as DisseminationReceiveC; DisseminationEngineImplP.Receive -> DisseminationReceiveC.Receive; components new AMSenderC(AM_DISSEMINATION_PROBE_MESSAGE) as DisseminationProbeSendC; DisseminationEngineImplP.ProbeAMSend -> DisseminationProbeSendC.AMSend; components new AMReceiverC(AM_DISSEMINATION_PROBE_MESSAGE) as DisseminationProbeReceiveC; DisseminationEngineImplP.ProbeReceive -> DisseminationProbeReceiveC.Receive; components NoLedsC; DisseminationEngineImplP.Leds -> NoLedsC; } tinyos-2.1.2+dfsg/tos/lib/net/drip/DisseminationTimerP.nc000066400000000000000000000041431207233610700233330ustar00rootroot00000000000000 /* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /* * The DisseminationTimerP component maintains a set of Trickle timers * and is wired to DisseminationEngineC once for each DisseminatorC. * * See TEP118 - Dissemination for details. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2007-09-14 00:22:18 $ */ configuration DisseminationTimerP { provides interface TrickleTimer[uint8_t id]; } implementation { components new TrickleTimerMilliC(1, 1024, 1, uniqueCount("DisseminationTimerC.TrickleTimer")); TrickleTimer = TrickleTimerMilliC; } tinyos-2.1.2+dfsg/tos/lib/net/drip/DisseminatorC.nc000066400000000000000000000054211207233610700221500ustar00rootroot00000000000000#include /* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The DisseminatorC component holds and synchronizes a single value * of a chosen type, and identifies that value by a chosen 16-bit key. * Different nodes should use the same key for the same value. * * See TEP118 - Dissemination for details. * * @param t the type of the object that will be disseminated * @param key the 16-bit identifier of the disseminated object * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2007-09-14 00:22:18 $ */ generic configuration DisseminatorC(typedef t, uint16_t key) { provides interface DisseminationValue; provides interface DisseminationUpdate; } implementation { enum { TIMER_ID = unique("DisseminationTimerC.TrickleTimer") }; components new DisseminatorP(t); DisseminationValue = DisseminatorP; DisseminationUpdate = DisseminatorP; components DisseminationEngineP; DisseminationEngineP.DisseminationCache[key] -> DisseminatorP; DisseminationEngineP.DisseminatorControl[TIMER_ID] -> DisseminatorP; components DisseminationTimerP; DisseminationEngineP.TrickleTimer[key] -> DisseminationTimerP.TrickleTimer[TIMER_ID]; components LedsC; DisseminatorP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/net/drip/DisseminatorP.nc000066400000000000000000000100641207233610700221640ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** * The DisseminatorP module holds and synchronizes a single value of a * chosen type. * * See TEP118 - Dissemination for details. * * @param t the type of the object that will be disseminated * * @author Gilman Tolle * @version $Revision: 1.3 $ $Date: 2008-02-16 01:31:50 $ */ generic module DisseminatorP(typedef t) { provides interface StdControl; provides interface DisseminationValue; provides interface DisseminationUpdate; provides interface DisseminationCache; uses interface Leds; } implementation { t valueCache; bool m_running; // A sequence number is 32 bits. The top 16 bits are an incrementing // counter, while the bottom 16 bits are a unique node identifier. uint32_t seqno = DISSEMINATION_SEQNO_UNKNOWN; task void changedTask() { signal DisseminationValue.changed(); } command error_t StdControl.start() { error_t result = signal DisseminationCache.start(); if ( result == SUCCESS ) { m_running = TRUE; } return result; } command error_t StdControl.stop() { if ( !m_running ) { return EOFF; } m_running = FALSE; return signal DisseminationCache.stop(); } command const t* DisseminationValue.get() { return &valueCache; } command void DisseminationValue.set( const t* val ) { if (seqno == DISSEMINATION_SEQNO_UNKNOWN) { valueCache = *val; } } command void DisseminationUpdate.change( t* newVal ) { if ( !m_running ) { return; } memcpy( &valueCache, newVal, sizeof(t) ); /* Increment the counter and append the local node ID. */ seqno = seqno >> 16; seqno++; if ( seqno == DISSEMINATION_SEQNO_UNKNOWN ) { seqno++; } seqno = seqno << 16; seqno += TOS_NODE_ID; signal DisseminationCache.newData(); post changedTask(); } command void* DisseminationCache.requestData( uint8_t* size ) { *size = sizeof(t); return &valueCache; } command void DisseminationCache.storeData( void* data, uint8_t size, uint32_t newSeqno ) { memcpy( &valueCache, data, size < sizeof(t) ? size : sizeof(t) ); seqno = newSeqno; // We need to signal here and can't go through a task to // ensure that the update and changed event are atomic. // Otherwise, it is possible that storeData is called, // but before the task runs, the client calls set(). -pal signal DisseminationValue.changed(); } command uint32_t DisseminationCache.requestSeqno() { return seqno; } default event void DisseminationValue.changed() { } } tinyos-2.1.2+dfsg/tos/lib/net/le/000077500000000000000000000000001207233610700165225ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/le/LinkEstimator.h000066400000000000000000000110121207233610700214530ustar00rootroot00000000000000/* $Id: LinkEstimator.h,v 1.5 2010-06-29 22:07:49 scipio Exp $ */ /* * Copyright (c) 2006 University of Southern California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef LINK_ESITIMATOR_H #define LINK_ESITIMATOR_H /* @ author Omprakash Gnawali @ Created: June 08, 2006 */ // Number of entries in the neighbor table #define NEIGHBOR_TABLE_SIZE 10 // Masks for the flag field in the link estimation header enum { // use last four bits to keep track of // how many footer entries there are NUM_ENTRIES_FLAG = 15, }; // The first byte of each outgoing packet is a control byte // Bits 4..7 reserved for routing and other protocols // Bits 0..3 is used by the link estimator to encode the // number of linkest entries in the packet // link estimator header added to // every message passing through the link estimator typedef nx_struct linkest_header { nx_uint8_t flags; nx_uint8_t seq; } linkest_header_t; // for outgoing link estimator message // so that we can compute bi-directional quality typedef nx_struct neighbor_stat_entry { nx_am_addr_t ll_addr; nx_uint8_t inquality; } neighbor_stat_entry_t; // we put the above neighbor entry in the footer typedef nx_struct linkest_footer { neighbor_stat_entry_t neighborList[1]; } linkest_footer_t; // Flags for the neighbor table entry enum { VALID_ENTRY = 0x1, // A link becomes mature after BLQ_PKT_WINDOW // packets are received and an estimate is computed MATURE_ENTRY = 0x2, // Flag to indicate that this link has received the // first sequence number INIT_ENTRY = 0x4, // The upper layer has requested that this link be pinned // Useful if we don't want to lose the root from the table PINNED_ENTRY = 0x8 }; // neighbor table entry typedef struct neighbor_table_entry { // link layer address of the neighbor am_addr_t ll_addr; // last beacon sequence number received from this neighbor uint8_t lastseq; // number of beacons received after last beacon estimator update // the update happens every BLQ_PKT_WINDOW beacon packets uint8_t rcvcnt; // number of beacon packets missed after last beacon estimator update uint8_t failcnt; // flags to describe the state of this entry uint8_t flags; // MAXAGE-inage gives the number of update rounds we haven't been able // update the inbound beacon estimator uint8_t inage; // MAXAGE-outage gives the number of update rounds we haven't received // the outbound link quality uint8_t outage; // inbound and outbound link qualities in the range [1..255] // 1 bad, 255 good uint8_t inquality; uint8_t outquality; // EETX for the link to this neighbor. This is the quality returned to // the users of the link estimator uint16_t eetx; // Number of data packets successfully sent (ack'd) to this neighbor // since the last data estimator update round. This update happens // every DLQ_PKT_WINDOW data packets uint8_t data_success; // The total number of data packets transmission attempt to this neighbor // since the last data estimator update round. uint8_t data_total; } neighbor_table_entry_t; #endif tinyos-2.1.2+dfsg/tos/lib/net/le/LinkEstimator.nc000066400000000000000000000064341207233610700216400ustar00rootroot00000000000000/* $Id: LinkEstimator.nc,v 1.6 2010-06-29 22:07:49 scipio Exp $ */ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** Provides an additive quality measure for a neighbor. The * provided quality increases when the true link quality increases. * @author Rodrigo Fonseca * @author Omprakash Gnawali * @date $Date: 2010-06-29 22:07:49 $ */ /* Quality of a link is defined by the implementor of this interface. * It could be ETX, PRR, etc. */ interface LinkEstimator { /* get bi-directional link quality for link to the neighbor */ command uint16_t getLinkQuality(uint16_t neighbor); /* get quality of the link from neighbor to this node */ command uint16_t getReverseQuality(uint16_t neighbor); /* get quality of the link from this node to the neighbor */ command uint16_t getForwardQuality(uint16_t neighbor); /* insert this neighbor into the neighbor table */ command error_t insertNeighbor(am_addr_t neighbor); /* pin a neighbor so that it does not get evicted */ command error_t pinNeighbor(am_addr_t neighbor); /* pin a neighbor so that it does not get evicted */ command error_t unpinNeighbor(am_addr_t neighbor); /* called when an acknowledgement is received; sign of a successful data transmission; to update forward link quality */ command error_t txAck(am_addr_t neighbor); /* called when an acknowledgement is not received; could be due to data pkt or acknowledgement loss; to update forward link quality */ command error_t txNoAck(am_addr_t neighbor); /* called when the parent changes; clear state about data-driven link quality */ command error_t clearDLQ(am_addr_t neighbor); /* signal when this neighbor is evicted from the neighbor table */ event void evicted(am_addr_t neighbor); } tinyos-2.1.2+dfsg/tos/lib/net/le/LinkEstimatorC.nc000066400000000000000000000036501207233610700217400ustar00rootroot00000000000000/* $Id: LinkEstimatorC.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ */ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** The public component of the link estimator that provides the * quality to and from a neighbor * * @author Rodrigo Fonseca * @date $Date: 2010-06-29 22:07:50 $ */ configuration LinkEstimatorC { provides { interface LinkEstimator; } } tinyos-2.1.2+dfsg/tos/lib/net/le/LinkEstimatorP.nc000066400000000000000000000575631207233610700217710ustar00rootroot00000000000000/* $Id: LinkEstimatorP.nc,v 1.17 2010-06-29 22:07:50 scipio Exp $ */ /* * Copyright (c) 2006 University of Southern California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* @ author Omprakash Gnawali @ Created: April 24, 2006 */ #include "LinkEstimator.h" module LinkEstimatorP { provides { interface StdControl; interface AMSend as Send; interface Receive; interface LinkEstimator; interface Init; interface Packet; interface CompareBit; } uses { interface AMSend; interface AMPacket as SubAMPacket; interface Packet as SubPacket; interface Receive as SubReceive; interface LinkPacketMetadata; interface Random; } } implementation { // configure the link estimator and some constants enum { // If the eetx estimate is below this threshold // do not evict a link EVICT_EETX_THRESHOLD = 55, // maximum link update rounds before we expire the link MAX_AGE = 6, // if received sequence number if larger than the last sequence // number by this gap, we reinitialize the link MAX_PKT_GAP = 10, BEST_EETX = 0, INVALID_RVAL = 0xff, INVALID_NEIGHBOR_ADDR = 0xff, // if we don't know the link quality, we need to return a value so // large that it will not be used to form paths VERY_LARGE_EETX_VALUE = 0xff, // decay the link estimate using this alpha // we use a denominator of 10, so this corresponds to 0.2 ALPHA = 9, // number of packets to wait before computing a new // DLQ (Data-driven Link Quality) DLQ_PKT_WINDOW = 5, // number of beacons to wait before computing a new // BLQ (Beacon-driven Link Quality) BLQ_PKT_WINDOW = 3, // largest EETX value that we feed into the link quality EWMA // a value of 60 corresponds to having to make six transmissions // to successfully receive one acknowledgement LARGE_EETX_VALUE = 60 }; // keep information about links from the neighbors neighbor_table_entry_t NeighborTable[NEIGHBOR_TABLE_SIZE]; // link estimation sequence, increment every time a beacon is sent uint8_t linkEstSeq = 0; // if there is not enough room in the packet to put all the neighbor table // entries, in order to do round robin we need to remember which entry // we sent in the last beacon uint8_t prevSentIdx = 0; // get the link estimation header in the packet linkest_header_t* getHeader(message_t* m) { return (linkest_header_t*)call SubPacket.getPayload(m, sizeof(linkest_header_t)); } // get the link estimation footer (neighbor entries) in the packet linkest_footer_t* getFooter(message_t* ONE m, uint8_t len) { // To get a footer at offset "len", the payload must be len + sizeof large. return (linkest_footer_t* ONE)(len + (uint8_t *)call Packet.getPayload(m,len + sizeof(linkest_footer_t))); } // add the link estimation header (seq no) and link estimation // footer (neighbor entries) in the packet. Call just before sending // the packet. uint8_t addLinkEstHeaderAndFooter(message_t * ONE msg, uint8_t len) { uint8_t newlen; linkest_header_t *hdr; linkest_footer_t *footer; uint8_t i, j, k; uint8_t maxEntries, newPrevSentIdx; dbg("LI", "newlen1 = %d\n", len); hdr = getHeader(msg); footer = getFooter(msg, len); maxEntries = ((call SubPacket.maxPayloadLength() - len - sizeof(linkest_header_t)) / sizeof(linkest_footer_t)); // Depending on the number of bits used to store the number // of entries, we can encode up to NUM_ENTRIES_FLAG using those bits if (maxEntries > NUM_ENTRIES_FLAG) { maxEntries = NUM_ENTRIES_FLAG; } dbg("LI", "Max payload is: %d, maxEntries is: %d\n", call SubPacket.maxPayloadLength(), maxEntries); j = 0; newPrevSentIdx = 0; for (i = 0; i < NEIGHBOR_TABLE_SIZE && j < maxEntries; i++) { uint8_t neighborCount; neighbor_stat_entry_t * COUNT(neighborCount) neighborLists; if(maxEntries <= NEIGHBOR_TABLE_SIZE) neighborCount = maxEntries; else neighborCount = NEIGHBOR_TABLE_SIZE; neighborLists = TCAST(neighbor_stat_entry_t * COUNT(neighborCount), footer->neighborList); k = (prevSentIdx + i + 1) % NEIGHBOR_TABLE_SIZE; if ((NeighborTable[k].flags & VALID_ENTRY) && (NeighborTable[k].flags & MATURE_ENTRY)) { neighborLists[j].ll_addr = NeighborTable[k].ll_addr; neighborLists[j].inquality = NeighborTable[k].inquality; newPrevSentIdx = k; dbg("LI", "Loaded on footer: %d %d %d\n", j, neighborLists[j].ll_addr, neighborLists[j].inquality); j++; } } prevSentIdx = newPrevSentIdx; hdr->seq = linkEstSeq++; hdr->flags = 0; hdr->flags |= (NUM_ENTRIES_FLAG & j); newlen = sizeof(linkest_header_t) + len + j*sizeof(linkest_footer_t); dbg("LI", "newlen2 = %d\n", newlen); return newlen; } // initialize the given entry in the table for neighbor ll_addr void initNeighborIdx(uint8_t i, am_addr_t ll_addr) { neighbor_table_entry_t *ne; ne = &NeighborTable[i]; ne->ll_addr = ll_addr; ne->lastseq = 0; ne->rcvcnt = 0; ne->failcnt = 0; ne->flags = (INIT_ENTRY | VALID_ENTRY); ne->inage = MAX_AGE; ne->outage = MAX_AGE; ne->inquality = 0; ne->outquality = 0; ne->eetx = 0; } // find the index to the entry for neighbor ll_addr uint8_t findIdx(am_addr_t ll_addr) { uint8_t i; for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { if (NeighborTable[i].flags & VALID_ENTRY) { if (NeighborTable[i].ll_addr == ll_addr) { return i; } } } return INVALID_RVAL; } // find an empty slot in the neighbor table uint8_t findEmptyNeighborIdx() { uint8_t i; for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { if (NeighborTable[i].flags & VALID_ENTRY) { } else { return i; } } return INVALID_RVAL; } // find the index to the worst neighbor if the eetx // estimate is greater than the given threshold uint8_t findWorstNeighborIdx(uint8_t thresholdEETX) { uint8_t i, worstNeighborIdx; uint16_t worstEETX, thisEETX; worstNeighborIdx = INVALID_RVAL; worstEETX = 0; for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { if (!(NeighborTable[i].flags & VALID_ENTRY)) { dbg("LI", "Invalid so continuing\n"); continue; } if (!(NeighborTable[i].flags & MATURE_ENTRY)) { dbg("LI", "Not mature, so continuing\n"); continue; } if (NeighborTable[i].flags & PINNED_ENTRY) { dbg("LI", "Pinned entry, so continuing\n"); continue; } thisEETX = NeighborTable[i].eetx; if (thisEETX >= worstEETX) { worstNeighborIdx = i; worstEETX = thisEETX; } } if (worstEETX >= thresholdEETX) { return worstNeighborIdx; } else { return INVALID_RVAL; } } // update the quality of the link link: self->neighbor // this is found in the entries in the footer of incoming message void updateReverseQuality(am_addr_t neighbor, uint8_t outquality) { uint8_t idx; idx = findIdx(neighbor); if (idx != INVALID_RVAL) { NeighborTable[idx].outquality = outquality; NeighborTable[idx].outage = MAX_AGE; } } // update the EETX estimator // called when new beacon estimate is done // also called when new DEETX estimate is done void updateEETX(neighbor_table_entry_t *ne, uint16_t newEst) { ne->eetx = (ALPHA * ne->eetx + (10 - ALPHA) * newEst + 5)/10; } // update data driven EETX void updateDEETX(neighbor_table_entry_t *ne) { uint16_t estETX; if (ne->data_success == 0) { // if there were no successful packet transmission in the // last window, our current estimate is the number of failed // transmissions estETX = (ne->data_total - 1)* 10; } else { estETX = (10 * ne->data_total) / ne->data_success - 10; ne->data_success = 0; ne->data_total = 0; } updateEETX(ne, estETX); } // EETX (Extra Expected number of Transmission) // EETX = ETX - 1 // computeEETX returns EETX*10 uint8_t computeEETX(uint8_t q1) { uint16_t q; if (q1 > 0) { q = 2550 / q1 - 10; if (q > 255) { q = VERY_LARGE_EETX_VALUE; } return (uint8_t)q; } else { return VERY_LARGE_EETX_VALUE; } } // BidirETX = 1 / (q1*q2) // BidirEETX = BidirETX - 1 // computeBidirEETX return BidirEETX*10 uint8_t computeBidirEETX(uint8_t q1, uint8_t q2) { uint16_t q; if ((q1 > 0) && (q2 > 0)) { q = 65025u / q1; q = (10*q) / q2 - 10; if (q > 255) { q = LARGE_EETX_VALUE; } return (uint8_t)q; } else { return LARGE_EETX_VALUE; } } // update the inbound link quality by // munging receive, fail count since last update void updateNeighborTableEst(am_addr_t n) { uint8_t i, totalPkt; neighbor_table_entry_t *ne; uint8_t newEst; uint8_t minPkt; minPkt = BLQ_PKT_WINDOW; dbg("LI", "%s\n", __FUNCTION__); for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { ne = &NeighborTable[i]; if (ne->ll_addr == n) { if (ne->flags & VALID_ENTRY) { if (ne->inage > 0) ne->inage--; if (ne->outage > 0) ne->outage--; if ((ne->inage == 0) && (ne->outage == 0)) { ne->flags ^= VALID_ENTRY; ne->inquality = ne->outquality = 0; } else { dbg("LI", "Making link: %d mature\n", i); ne->flags |= MATURE_ENTRY; totalPkt = ne->rcvcnt + ne->failcnt; dbg("LI", "MinPkt: %d, totalPkt: %d\n", minPkt, totalPkt); if (totalPkt < minPkt) { totalPkt = minPkt; } if (totalPkt == 0) { ne->inquality = (ALPHA * ne->inquality) / 10; } else { newEst = (255 * ne->rcvcnt) / totalPkt; dbg("LI,LITest", " %hu: %hhu -> %hhu", ne->ll_addr, ne->inquality, (ALPHA * ne->inquality + (10-ALPHA) * newEst + 5)/10); ne->inquality = (ALPHA * ne->inquality + (10-ALPHA) * newEst + 5)/10; } ne->rcvcnt = 0; ne->failcnt = 0; } updateEETX(ne, computeBidirEETX(ne->inquality, ne->outquality)); } else { dbg("LI", " - entry %i is invalid.\n", (int)i); } } } } // we received seq from the neighbor in idx // update the last seen seq, receive and fail count // refresh the age void updateNeighborEntryIdx(uint8_t idx, uint8_t seq) { uint8_t packetGap; if (NeighborTable[idx].flags & INIT_ENTRY) { dbg("LI", "Init entry update\n"); NeighborTable[idx].lastseq = seq; NeighborTable[idx].flags &= ~INIT_ENTRY; } packetGap = seq - NeighborTable[idx].lastseq; dbg("LI", "updateNeighborEntryIdx: prevseq %d, curseq %d, gap %d\n", NeighborTable[idx].lastseq, seq, packetGap); NeighborTable[idx].lastseq = seq; NeighborTable[idx].rcvcnt++; NeighborTable[idx].inage = MAX_AGE; if (packetGap > 0) { NeighborTable[idx].failcnt += packetGap - 1; } if (packetGap > MAX_PKT_GAP) { NeighborTable[idx].failcnt = 0; NeighborTable[idx].rcvcnt = 1; NeighborTable[idx].outage = 0; NeighborTable[idx].outquality = 0; NeighborTable[idx].inquality = 0; } if (NeighborTable[idx].rcvcnt >= BLQ_PKT_WINDOW) { updateNeighborTableEst(NeighborTable[idx].ll_addr); } } // print the neighbor table. for debugging. void print_neighbor_table() { uint8_t i; neighbor_table_entry_t *ne; for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { ne = &NeighborTable[i]; if (ne->flags & VALID_ENTRY) { dbg("LI,LITest", "%d:%d inQ=%d, inA=%d, outQ=%d, outA=%d, rcv=%d, fail=%d, biQ=%d\n", i, ne->ll_addr, ne->inquality, ne->inage, ne->outquality, ne->outage, ne->rcvcnt, ne->failcnt, computeBidirEETX(ne->inquality, ne->outquality)); } } } // print the packet. for debugging. void print_packet(message_t* msg, uint8_t len) { uint8_t i; uint8_t* b; b = (uint8_t *)msg->data; for(i=0; iself command uint16_t LinkEstimator.getReverseQuality(am_addr_t neighbor) { uint8_t idx; idx = findIdx(neighbor); if (idx == INVALID_RVAL) { return VERY_LARGE_EETX_VALUE; } else { if (NeighborTable[idx].flags & MATURE_ENTRY) { return computeEETX(NeighborTable[idx].inquality); } else { return VERY_LARGE_EETX_VALUE; } } } // return the quality of the link: self->neighbor command uint16_t LinkEstimator.getForwardQuality(am_addr_t neighbor) { uint8_t idx; idx = findIdx(neighbor); if (idx == INVALID_RVAL) { return VERY_LARGE_EETX_VALUE; } else { if (NeighborTable[idx].flags & MATURE_ENTRY) { return computeEETX(NeighborTable[idx].outquality); } else { return VERY_LARGE_EETX_VALUE; } } } // insert the neighbor at any cost (if there is a room for it) // even if eviction of a perfectly fine neighbor is called for command error_t LinkEstimator.insertNeighbor(am_addr_t neighbor) { uint8_t nidx; nidx = findIdx(neighbor); if (nidx != INVALID_RVAL) { dbg("LI", "insert: Found the entry, no need to insert\n"); return SUCCESS; } nidx = findEmptyNeighborIdx(); if (nidx != INVALID_RVAL) { dbg("LI", "insert: inserted into the empty slot\n"); initNeighborIdx(nidx, neighbor); return SUCCESS; } else { nidx = findWorstNeighborIdx(BEST_EETX); if (nidx != INVALID_RVAL) { dbg("LI", "insert: inserted by replacing an entry for neighbor: %d\n", NeighborTable[nidx].ll_addr); signal LinkEstimator.evicted(NeighborTable[nidx].ll_addr); initNeighborIdx(nidx, neighbor); return SUCCESS; } } return FAIL; } // pin a neighbor so that it does not get evicted command error_t LinkEstimator.pinNeighbor(am_addr_t neighbor) { uint8_t nidx = findIdx(neighbor); if (nidx == INVALID_RVAL) { return FAIL; } NeighborTable[nidx].flags |= PINNED_ENTRY; return SUCCESS; } // pin a neighbor so that it does not get evicted command error_t LinkEstimator.unpinNeighbor(am_addr_t neighbor) { uint8_t nidx = findIdx(neighbor); if (nidx == INVALID_RVAL) { return FAIL; } NeighborTable[nidx].flags &= ~PINNED_ENTRY; return SUCCESS; } // called when an acknowledgement is received; sign of a successful // data transmission; to update forward link quality command error_t LinkEstimator.txAck(am_addr_t neighbor) { neighbor_table_entry_t *ne; uint8_t nidx = findIdx(neighbor); if (nidx == INVALID_RVAL) { return FAIL; } ne = &NeighborTable[nidx]; ne->data_success++; ne->data_total++; if (ne->data_total >= DLQ_PKT_WINDOW) { updateDEETX(ne); } return SUCCESS; } // called when an acknowledgement is not received; could be due to // data pkt or acknowledgement loss; to update forward link quality command error_t LinkEstimator.txNoAck(am_addr_t neighbor) { neighbor_table_entry_t *ne; uint8_t nidx = findIdx(neighbor); if (nidx == INVALID_RVAL) { return FAIL; } ne = &NeighborTable[nidx]; ne->data_total++; if (ne->data_total >= DLQ_PKT_WINDOW) { updateDEETX(ne); } return SUCCESS; } // called when the parent changes; clear state about data-driven link quality command error_t LinkEstimator.clearDLQ(am_addr_t neighbor) { neighbor_table_entry_t *ne; uint8_t nidx = findIdx(neighbor); if (nidx == INVALID_RVAL) { return FAIL; } ne = &NeighborTable[nidx]; ne->data_total = 0; ne->data_success = 0; return SUCCESS; } // user of link estimator calls send here // slap the header and footer before sending the message command error_t Send.send(am_addr_t addr, message_t* msg, uint8_t len) { uint8_t newlen; newlen = addLinkEstHeaderAndFooter(msg, len); dbg("LITest", "%s packet of length %hhu became %hhu\n", __FUNCTION__, len, newlen); dbg("LI", "Sending seq: %d\n", linkEstSeq); print_packet(msg, newlen); return call AMSend.send(addr, msg, newlen); } // done sending the message that originated by // the user of this component event void AMSend.sendDone(message_t* msg, error_t error ) { return signal Send.sendDone(msg, error); } // cascade the calls down command uint8_t Send.cancel(message_t* msg) { return call AMSend.cancel(msg); } command uint8_t Send.maxPayloadLength() { return call Packet.maxPayloadLength(); } command void* Send.getPayload(message_t* msg, uint8_t len) { return call Packet.getPayload(msg, len); } // called when link estimator generator packet or // packets from upper layer that are wired to pass through // link estimator is received void processReceivedMessage(message_t* ONE msg, void* COUNT_NOK(len) payload, uint8_t len) { uint8_t nidx; uint8_t num_entries; dbg("LI", "LI receiving packet, buf addr: %x\n", payload); print_packet(msg, len); if (call SubAMPacket.destination(msg) == AM_BROADCAST_ADDR) { linkest_header_t* hdr = getHeader(msg); linkest_footer_t* ONE footer; am_addr_t ll_addr; ll_addr = call SubAMPacket.source(msg); dbg("LI", "Got seq: %d from link: %d\n", hdr->seq, ll_addr); num_entries = hdr->flags & NUM_ENTRIES_FLAG; print_neighbor_table(); // update neighbor table with this information // find the neighbor // if found // update the entry // else // find an empty entry // if found // initialize the entry // else // find a bad neighbor to be evicted // if found // evict the neighbor and init the entry // else // we can not accommodate this neighbor in the table nidx = findIdx(ll_addr); if (nidx != INVALID_RVAL) { dbg("LI", "Found the entry so updating\n"); updateNeighborEntryIdx(nidx, hdr->seq); } else { nidx = findEmptyNeighborIdx(); if (nidx != INVALID_RVAL) { dbg("LI", "Found an empty entry\n"); initNeighborIdx(nidx, ll_addr); updateNeighborEntryIdx(nidx, hdr->seq); } else { nidx = findWorstNeighborIdx(EVICT_EETX_THRESHOLD); if (nidx != INVALID_RVAL) { dbg("LI", "Evicted neighbor %d at idx %d\n", NeighborTable[nidx].ll_addr, nidx); signal LinkEstimator.evicted(NeighborTable[nidx].ll_addr); initNeighborIdx(nidx, ll_addr); } else { dbg("LI", "No room in the table\n"); } } } /* Graphical explanation of how we get to the head of the * footer in the following code * <---------------------- payloadLen -------------------> * ------------------------------------------------------- * linkest_header_t | payload | linkest_footer_t* ...| * ------------------------------------------------------- * ^ ^ ^ * | | | * subpayload | payloadEnd * | * payloadEnd - footersize*num footers */ if ((nidx != INVALID_RVAL) && (num_entries > 0)) { uint8_t payloadLen = call SubPacket.payloadLength(msg); void* COUNT_NOK(payloadLen) subPayload = call SubPacket.getPayload(msg, payloadLen); void* payloadEnd = subPayload + payloadLen; dbg("LI", "Number of footer entries: %d\n", num_entries); footer = TCAST(linkest_footer_t* COUNT(num_entries), (payloadEnd - (num_entries*sizeof(linkest_footer_t)))); { uint8_t i; am_addr_t my_ll_addr; neighbor_stat_entry_t * COUNT(num_entries) neighborLists; my_ll_addr = call SubAMPacket.address(); neighborLists = TCAST(neighbor_stat_entry_t * COUNT(num_entries), footer->neighborList); for (i = 0; i < num_entries; i++) { dbg("LI", "%d %d %d\n", i, neighborLists[i].ll_addr, neighborLists[i].inquality); if (neighborLists[i].ll_addr == my_ll_addr) { updateReverseQuality(ll_addr, neighborLists[i].inquality); } } } } print_neighbor_table(); } } // new messages are received here // update the neighbor table with the header // and footer in the message // then signal the user of this component event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { dbg("LI", "Received upper packet. Will signal up\n"); processReceivedMessage(msg, payload, len); return signal Receive.receive(msg, call Packet.getPayload(msg, call Packet.payloadLength(msg)), call Packet.payloadLength(msg)); } command void Packet.clear(message_t* msg) { call SubPacket.clear(msg); } // subtract the space occupied by the link estimation // header and footer from the incoming payload size command uint8_t Packet.payloadLength(message_t* msg) { linkest_header_t *hdr; hdr = getHeader(msg); return call SubPacket.payloadLength(msg) - sizeof(linkest_header_t) - sizeof(linkest_footer_t)*(NUM_ENTRIES_FLAG & hdr->flags); } // account for the space used by header and footer // while setting the payload length command void Packet.setPayloadLength(message_t* msg, uint8_t len) { linkest_header_t *hdr; hdr = getHeader(msg); call SubPacket.setPayloadLength(msg, len + sizeof(linkest_header_t) + sizeof(linkest_footer_t)*(NUM_ENTRIES_FLAG & hdr->flags)); } command uint8_t Packet.maxPayloadLength() { return call SubPacket.maxPayloadLength() - sizeof(linkest_header_t); } // application payload pointer is just past the link estimation header command void* Packet.getPayload(message_t* msg, uint8_t len) { void* payload = call SubPacket.getPayload(msg, len + sizeof(linkest_header_t)); if (payload != NULL) { payload += sizeof(linkest_header_t); } return payload; } } tinyos-2.1.2+dfsg/tos/lib/net/lqi/000077500000000000000000000000001207233610700167075ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/lqi/Collection.h000066400000000000000000000037101207233610700211540ustar00rootroot00000000000000/* $Id: Collection.h,v 1.3 2010-06-29 22:07:50 scipio Exp $ */ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * @author Rodrigo Fonseca * @date $Date: 2010-06-29 22:07:50 $ */ #ifndef COLLECTION_H #define COLLECTION_H enum { AM_COLLECTION_DATA = 20, AM_COLLECTION_CONTROL = 21, AM_COLLECTION_DEBUG = 22, }; typedef uint8_t collection_id_t; typedef nx_uint8_t nx_collection_id_t; #endif tinyos-2.1.2+dfsg/tos/lib/net/lqi/CollectionC.nc000066400000000000000000000047631207233610700214410ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Philip Levis */ #include "MultiHopLqi.h" configuration CollectionC { provides { interface StdControl; interface Send[uint8_t client]; interface Receive[collection_id_t id]; interface Receive as Snoop[collection_id_t]; interface Intercept[collection_id_t id]; interface Packet; interface CollectionPacket; interface RootControl; interface RouteControl; } uses interface CollectionDebug; } implementation { components MultiHopLqiP as Router; components new SendVirtualizerP(NUM_LQI_CLIENTS); RouteControl = Router; Send = SendVirtualizerP; SendVirtualizerP.SubSend -> Router.Send; SendVirtualizerP.Packet -> Router; StdControl = Router; Receive = Router.Receive; RootControl = Router; Packet = Router; Snoop = Router.Snoop; Intercept = Router.Intercept; CollectionPacket = Router; Router.CollectionDebug = CollectionDebug; } tinyos-2.1.2+dfsg/tos/lib/net/lqi/CollectionSenderC.nc000066400000000000000000000041631207233610700225740ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The virtualized collection sender abstraction. * * @author Kyle Jamieson * @author Philip Levis * @date April 25 2006 * @see TinyOS Net2-WG */ #include generic configuration CollectionSenderC(collection_id_t collectid) { provides { interface Send; interface Packet; } } implementation { components new CollectionSenderP(collectid), CollectionC; Send = CollectionSenderP; Packet = CollectionC; CollectionSenderP.SubSend -> CollectionC.Send[unique(UQ_LQI_CLIENT)]; CollectionSenderP.CollectionPacket -> CollectionC; } tinyos-2.1.2+dfsg/tos/lib/net/lqi/CollectionSenderP.nc000066400000000000000000000044531207233610700226130ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Collection.h" generic module CollectionSenderP(collection_id_t collectid) { provides interface Send; uses interface Send as SubSend; uses interface CollectionPacket; } implementation { command error_t Send.send(message_t* msg, uint8_t len) { call CollectionPacket.setType(msg, collectid); return call SubSend.send(msg, len); } command error_t Send.cancel(message_t* msg) { return call SubSend.cancel(msg); } command void* Send.getPayload(message_t* m, uint8_t len) { return call SubSend.getPayload(m, len); } command uint8_t Send.maxPayloadLength() { return call SubSend.maxPayloadLength(); } event void SubSend.sendDone(message_t* m, error_t err) { signal Send.sendDone(m, err); } } tinyos-2.1.2+dfsg/tos/lib/net/lqi/LqiForwardingEngineP.nc000066400000000000000000000447341207233610700232630ustar00rootroot00000000000000// $Id: LqiForwardingEngineP.nc,v 1.16 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * A simple module that handles multihop packet movement. It accepts * messages from both applications and the network and does the necessary * interception and forwarding. * It interfaces to an algorithmic componenet via RouteSelect. It also acts * as a front end for RouteControl */ /** * @author Philip Buonadonna * @auihor Alec Woo * @author Crossbow Inc. * @author Philip Levis (port from TinyOS 1.x) */ #include "AM.h" #include "MultiHopLqi.h" #include "CollectionDebugMsg.h" module LqiForwardingEngineP { provides { interface Init; interface Send; interface Receive[collection_id_t id]; interface Receive as Snoop[collection_id_t]; interface Intercept[collection_id_t id]; interface CollectionPacket; interface RouteControl; interface LqiRouteStats; interface Packet; } uses { interface SplitControl; interface Receive as SubReceive; interface AMSend as SubSend; interface AMSend as SubSendMine; interface RouteControl as RouteSelectCntl; interface RouteSelect; interface Leds; interface Packet as SubPacket; interface AMPacket; interface RootControl; interface Random; interface PacketAcknowledgements; interface CollectionDebug; } } implementation { enum { FWD_QUEUE_SIZE = MHOP_QUEUE_SIZE, // Forwarding Queue EMPTY = 0xff, MAX_RETRIES = 5 }; /* Internal storage and scheduling state */ message_t FwdBuffers[FWD_QUEUE_SIZE]; message_t *FwdBufList[FWD_QUEUE_SIZE]; uint8_t FwdBufBusy[FWD_QUEUE_SIZE]; uint8_t iFwdBufHead, iFwdBufTail; uint16_t sendFailures = 0; uint8_t fwd_fail_count = 0; uint8_t my_fail_count = 0; bool fwdbusy = FALSE; bool running = FALSE; lqi_header_t* getHeader(message_t* msg) { return (lqi_header_t*) call SubPacket.getPayload(msg, sizeof(lqi_header_t)); } /*********************************************************************** * Initialization ***********************************************************************/ static void initialize() { int n; for (n=0; n < FWD_QUEUE_SIZE; n++) { FwdBufList[n] = &FwdBuffers[n]; FwdBufBusy[n] = 0; } iFwdBufHead = iFwdBufTail = 0; sendFailures = 0; } command error_t Init.init() { initialize(); return SUCCESS; } message_t* nextMsg(); static void forward(message_t* msg); event void SplitControl.startDone(error_t err) { message_t* nextToSend; if (err != SUCCESS) {return;} nextToSend = nextMsg(); running = TRUE; fwdbusy = FALSE; if (nextToSend != NULL) { forward(nextToSend); } } event void SplitControl.stopDone(error_t err) { if (err != SUCCESS) {return;} running = FALSE; } /*********************************************************************** * Commands and events ***********************************************************************/ command error_t Send.send(message_t* pMsg, uint8_t len) { len += sizeof(lqi_header_t); if (len > call SubPacket.maxPayloadLength()) { return ESIZE; } if (call RootControl.isRoot()) { return FAIL; } if (running == FALSE) { return EOFF; } call RouteSelect.initializeFields(pMsg); if (call RouteSelect.selectRoute(pMsg, 0) != SUCCESS) { return FAIL; } call PacketAcknowledgements.requestAck(pMsg); if (call SubSendMine.send(call AMPacket.destination(pMsg), pMsg, len) != SUCCESS) { sendFailures++; return FAIL; } return SUCCESS; } int8_t get_buff(){ uint8_t n; for (n=0; n < FWD_QUEUE_SIZE; n++) { uint8_t done = 0; atomic{ if(FwdBufBusy[n] == 0){ FwdBufBusy[n] = 1; done = 1; } } if(done == 1) return n; } return -1; } int8_t is_ours(message_t* ptr){ uint8_t n; for (n=0; n < FWD_QUEUE_SIZE; n++) { if(FwdBufList[n] == ptr){ return n; } } return -1; } static char* fields(message_t* msg) { #ifdef TOSSIM static char mbuf[1024]; lqi_header_t* hdr = getHeader(msg); sprintf(mbuf, "origin = %hu, seqno = %hu, oseqno = %hu, hopcount =%hu", hdr->originaddr, hdr->seqno, hdr->originseqno, hdr->hopcount); return mbuf; #else return NULL; #endif } static void forward(message_t* msg); static message_t* mForward(message_t* msg) { int8_t buf = get_buff(); dbg("LQI", " Asked to forward packet @%s:\t%s\n", sim_time_string(), fields(msg)); if (buf == -1) { dbg("LQI", "%s Dropped packet due to no space in queue.\n", __FUNCTION__); call CollectionDebug.logEvent(NET_C_FE_SEND_QUEUE_FULL); return msg; } if ((call RouteSelect.selectRoute(msg, 0)) != SUCCESS) { FwdBufBusy[(uint8_t)buf] = 0; call CollectionDebug.logEvent(NET_C_FE_NO_ROUTE); dbg("LQI", "%s Dropped packet due to no route.\n", __FUNCTION__); return msg; } else { message_t* newMsg = FwdBufList[(uint8_t)buf]; FwdBufList[(uint8_t)buf] = msg; forward(msg); return newMsg; } } static void forward(message_t* msg) { // Failures at the send level do not cause the seq. number space to be // rolled back properly. This is somewhat broken. if (fwdbusy || running == FALSE) { dbg("LQI", "%s forwarding busy or off, wait for later.\n", __FUNCTION__); return; } else { call PacketAcknowledgements.requestAck(msg); if (call SubSend.send(call AMPacket.destination(msg), msg, call SubPacket.payloadLength(msg)) == SUCCESS) { call CollectionDebug.logEventMsg(NET_C_DBG_1, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); dbg("LQI", "%s: Send to %hu success.\n", __FUNCTION__, call AMPacket.destination(msg)); fwdbusy = TRUE; } } } event message_t* SubReceive.receive(message_t* ONE msg, void* COUNT_NOK(len) payload, uint8_t len) { collection_id_t id = call CollectionPacket.getType(msg); payload += sizeof(lqi_header_t); len -= sizeof(lqi_header_t); call CollectionDebug.logEventMsg(NET_C_FE_RCV_MSG, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); if (call RootControl.isRoot()) { dbg("LQI,LQIDeliver", "LQI Root is receiving packet from node %hu @%s\n", getHeader(msg)->originaddr, sim_time_string()); return signal Receive.receive[id](msg, payload, len); } else if (call AMPacket.destination(msg) != call AMPacket.address()) { return msg; } else if (signal Intercept.forward[id](msg, payload, len)) { dbg("LQI,LQIDeliver", "LQI fwd is forwarding packet from node %hu @%s\n", getHeader(msg)->originaddr, sim_time_string()); return mForward(msg); } else { return msg; } } message_t* nextMsg() { int i; uint16_t inc = call Random.rand16() & 0xfff; for (i = 0; i < FWD_QUEUE_SIZE; i++) { int pindex = (i + inc) % FWD_QUEUE_SIZE; if (FwdBufBusy[pindex]) { return FwdBufList[pindex]; } } return NULL; } event void SubSend.sendDone(message_t* msg, error_t success) { int8_t buf; message_t* nextToSend; if (!call PacketAcknowledgements.wasAcked(msg) && call AMPacket.destination(msg) != TOS_BCAST_ADDR && fwd_fail_count < MAX_RETRIES){ call RouteSelect.selectRoute(msg, 1); call PacketAcknowledgements.requestAck(msg); if (call SubSend.send(call AMPacket.destination(msg), msg, call SubPacket.payloadLength(msg)) == SUCCESS) { dbg("LQI", "Packet not acked, retransmit @%s:\n\t%s\n", sim_time_string(), fields(msg)); call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_WAITACK, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); fwd_fail_count ++; return; } else { call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_FAIL, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); dbg("LQI", "Packet not acked, retransmit fail @%s:\n\t%s\n", sim_time_string(), fields(msg)); sendFailures++; return; } } else if (fwd_fail_count >= MAX_RETRIES) { call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_FAIL_ACK_FWD, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); dbg("LQI", "Packet failed:\t%s\n", fields(msg)); } else if (call PacketAcknowledgements.wasAcked(msg)) { dbg("LQI", "Packet acked:\t%s\n", fields(msg)); call CollectionDebug.logEventMsg(NET_C_FE_FWD_MSG, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); } fwd_fail_count = 0; buf = is_ours(msg); if (buf != -1) { FwdBufBusy[(uint8_t)buf] = 0; } nextToSend = nextMsg(); fwdbusy = FALSE; if (nextToSend != NULL) { forward(nextToSend); } dbg("LQI", "Packet not longer busy:\t%s\n", fields(msg)); } event void SubSendMine.sendDone(message_t* msg, error_t success) { if (!call PacketAcknowledgements.wasAcked(msg) && call AMPacket.destination(msg) != TOS_BCAST_ADDR && my_fail_count < MAX_RETRIES){ call RouteSelect.selectRoute(msg, 1); call PacketAcknowledgements.requestAck(msg); if (call SubSendMine.send(call AMPacket.destination(msg), msg, call SubPacket.payloadLength(msg)) == SUCCESS) { dbg("LQI", "Local packet not acked, retransmit (%hhu) @%s:\n\t%s\n", my_fail_count, sim_time_string(), fields(msg)); call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_WAITACK, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); my_fail_count ++; return; } else { call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_FAIL, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); dbg("LQI", "Local packet not acked, retransmit fail @%s:\n\t%s\n", sim_time_string(), fields(msg)); sendFailures++; signal Send.sendDone(msg, FAIL); return; } } else if (my_fail_count >= MAX_RETRIES) { call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_FAIL_ACK_SEND, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); dbg("LQI", "Local packet failed:\t%s\n", fields(msg)); } else if (call PacketAcknowledgements.wasAcked(msg)) { dbg("LQI", "Local packet acked:\t%s\n", fields(msg)); call CollectionDebug.logEventMsg(NET_C_FE_SENT_MSG, call CollectionPacket.getSequenceNumber(msg), call CollectionPacket.getOrigin(msg), call AMPacket.destination(msg)); } my_fail_count = 0; dbg("LQI", "Local send done with success %d\n", success); signal Send.sendDone(msg, success); } command uint16_t RouteControl.getParent() { return call RouteSelectCntl.getParent(); } command uint8_t RouteControl.getQuality() { return call RouteSelectCntl.getQuality(); } command uint8_t RouteControl.getDepth() { return call RouteSelectCntl.getDepth(); } command uint8_t RouteControl.getOccupancy() { uint16_t uiOutstanding = (uint16_t)iFwdBufTail - (uint16_t)iFwdBufHead; uiOutstanding %= FWD_QUEUE_SIZE; return (uint8_t)uiOutstanding; } command error_t RouteControl.setUpdateInterval(uint16_t Interval) { return call RouteSelectCntl.setUpdateInterval(Interval); } command error_t RouteControl.manualUpdate() { return call RouteSelectCntl.manualUpdate(); } command uint16_t LqiRouteStats.getSendFailures() { return sendFailures; } command void Packet.clear(message_t* msg) { } command void* Send.getPayload(message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } command uint8_t Send.maxPayloadLength() { return call Packet.maxPayloadLength(); } command error_t Send.cancel(message_t* m) { return FAIL; } command uint8_t Packet.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg) - sizeof(lqi_header_t); } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call SubPacket.setPayloadLength(msg, len + sizeof(lqi_header_t)); } command uint8_t Packet.maxPayloadLength() { return (call SubPacket.maxPayloadLength() - sizeof(lqi_header_t)); } command void* Packet.getPayload(message_t* msg, uint8_t len) { void* rval = call SubPacket.getPayload(msg, len + sizeof(lqi_header_t)); if (rval != NULL) { rval += sizeof(lqi_header_t); } return rval; } command am_addr_t CollectionPacket.getOrigin(message_t* msg) { lqi_header_t* hdr = getHeader(msg); return hdr->originaddr; } command void CollectionPacket.setOrigin(message_t* msg, am_addr_t addr) { lqi_header_t* hdr = getHeader(msg); hdr->originaddr = addr; } command collection_id_t CollectionPacket.getType(message_t* msg) { return getHeader(msg)->collectId; } command void CollectionPacket.setType(message_t* msg, collection_id_t id) { getHeader(msg)->collectId = id; } command uint8_t CollectionPacket.getSequenceNumber(message_t* msg) { lqi_header_t* hdr = getHeader(msg); return hdr->originseqno; } command void CollectionPacket.setSequenceNumber(message_t* msg, uint8_t seqno) { lqi_header_t* hdr = getHeader(msg); hdr->originseqno = seqno; } default event void Send.sendDone(message_t* pMsg, error_t success) {} default event message_t* Snoop.receive[collection_id_t id](message_t* pMsg, void* payload, uint8_t len) {return pMsg;} default event message_t* Receive.receive[collection_id_t id](message_t* pMsg, void* payload, uint8_t len) { return pMsg; } default event bool Intercept.forward[collection_id_t id](message_t* pMsg, void* payload, uint8_t len) { return 1; } /* Default implementations for CollectionDebug calls. * These allow CollectionDebug not to be wired to anything if debugging * is not desired. */ default command error_t CollectionDebug.logEvent(uint8_t type) { return SUCCESS; } default command error_t CollectionDebug.logEventSimple(uint8_t type, uint16_t arg) { return SUCCESS; } default command error_t CollectionDebug.logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3) { return SUCCESS; } default command error_t CollectionDebug.logEventMsg(uint8_t type, uint16_t msg, am_addr_t origin, am_addr_t node) { return SUCCESS; } default command error_t CollectionDebug.logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t metric) { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/net/lqi/LqiRouteStats.nc000066400000000000000000000077661207233610700220340ustar00rootroot00000000000000 /* Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Provides information on how many send failures there have been. * @author Joe Polastre * @author Philip Levis (port from TinyOS 1.x) */ interface LqiRouteStats { command uint16_t getSendFailures(); } tinyos-2.1.2+dfsg/tos/lib/net/lqi/LqiRoutingEngineP.nc000066400000000000000000000302461207233610700226010ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * @author Gilman Tolle * @author Philip Levis (port to TinyOS 2.x) */ #include "MultiHopLqi.h" #include "CollectionDebugMsg.h" module LqiRoutingEngineP { provides { interface Init; interface StdControl; interface RouteSelect; interface RouteControl; interface RootControl; } uses { interface Timer; interface AMSend; interface Receive; interface Random; interface Packet; interface AMPacket; interface LqiRouteStats; interface CC2420Packet; interface Leds; interface CollectionDebug; } } implementation { enum { BASE_STATION_ADDRESS = 0, BEACON_PERIOD = 32, BEACON_TIMEOUT = 8, }; enum { ROUTE_INVALID = 0xff }; bool isRoot = FALSE; message_t msgBuf; bool msgBufBusy; uint16_t gbCurrentParent; uint16_t gbCurrentParentCost; uint16_t gbCurrentLinkEst; uint8_t gbCurrentHopCount; uint16_t gbCurrentCost; uint8_t gLastHeard; int16_t gCurrentSeqNo; int16_t gOriginSeqNo; uint16_t gUpdateInterval; uint8_t gRecentIndex; uint16_t gRecentPacketSender[MHOP_HISTORY_SIZE]; int16_t gRecentPacketSeqNo[MHOP_HISTORY_SIZE]; uint8_t gRecentOriginIndex; uint16_t gRecentOriginPacketSender[MHOP_HISTORY_SIZE]; int16_t gRecentOriginPacketSeqNo[MHOP_HISTORY_SIZE]; uint16_t adjustLQI(uint8_t val) { uint16_t result = (80 - (val - 50)); result = (((result * result) >> 3) * result) >> 3; return result; } lqi_header_t* getHeader(message_t* msg) { return (lqi_header_t*)call Packet.getPayload(msg, sizeof(lqi_header_t)); } lqi_beacon_msg_t* getBeacon(message_t* msg) { return (lqi_beacon_msg_t*)call Packet.getPayload(msg, sizeof(lqi_beacon_msg_t)); } task void SendRouteTask() { lqi_beacon_msg_t* bMsg = getBeacon(&msgBuf); uint8_t length = sizeof(lqi_beacon_msg_t); dbg("LQI","MultiHopRSSI Sending route update msg.\n"); if (gbCurrentParent != TOS_BCAST_ADDR) { dbg("LQI","MultiHopRSSI: Parent = %d\n", gbCurrentParent); } if (msgBufBusy) { post SendRouteTask(); return; } dbg("LQI","MultiHopRSSI: Current cost: %d.\n", gbCurrentParentCost + gbCurrentLinkEst); if (isRoot) { bMsg->parent = TOS_NODE_ID; bMsg->cost = 0; bMsg->originaddr = TOS_NODE_ID; bMsg->hopcount = 0; bMsg->seqno = gCurrentSeqNo++; } else { bMsg->parent = gbCurrentParent; bMsg->cost = gbCurrentParentCost + gbCurrentLinkEst; bMsg->originaddr = TOS_NODE_ID; bMsg->hopcount = gbCurrentHopCount; bMsg->seqno = gCurrentSeqNo++; } if (call AMSend.send(TOS_BCAST_ADDR, &msgBuf, length) == SUCCESS) { msgBufBusy = TRUE; call CollectionDebug.logEventRoute(NET_C_TREE_SENT_BEACON, bMsg->parent, 0, bMsg->cost); } } task void TimerTask() { uint8_t val; val = ++gLastHeard; if (!isRoot && (val > BEACON_TIMEOUT)) { gbCurrentParent = TOS_BCAST_ADDR; gbCurrentParentCost = 0x7fff; gbCurrentLinkEst = 0x7fff; gbCurrentHopCount = ROUTE_INVALID; gbCurrentCost = 0xfffe; } post SendRouteTask(); } command error_t Init.init() { int n; gRecentIndex = 0; for (n = 0; n < MHOP_HISTORY_SIZE; n++) { gRecentPacketSender[n] = TOS_BCAST_ADDR; gRecentPacketSeqNo[n] = 0; } gRecentOriginIndex = 0; for (n = 0; n < MHOP_HISTORY_SIZE; n++) { gRecentOriginPacketSender[n] = TOS_BCAST_ADDR; gRecentOriginPacketSeqNo[n] = 0; } gbCurrentParent = TOS_BCAST_ADDR; gbCurrentParentCost = 0x7fff; gbCurrentLinkEst = 0x7fff; gbCurrentHopCount = ROUTE_INVALID; gbCurrentCost = 0xfffe; gOriginSeqNo = 0; gCurrentSeqNo = 0; gUpdateInterval = BEACON_PERIOD; msgBufBusy = FALSE; return SUCCESS; } command error_t RootControl.setRoot() { call Leds.led2On(); call CollectionDebug.logEventRoute(NET_C_TREE_NEW_PARENT, TOS_NODE_ID, 0, 0); isRoot = TRUE; return SUCCESS; } command error_t RootControl.unsetRoot() { isRoot = FALSE; return SUCCESS; } command bool RootControl.isRoot() { return isRoot; } command error_t StdControl.start() { gLastHeard = 0; call Timer.startOneShot(call Random.rand32() % (1024 * gUpdateInterval)); return SUCCESS; } command error_t StdControl.stop() { call Timer.stop(); return SUCCESS; } command bool RouteSelect.isActive() { return TRUE; } command error_t RouteSelect.selectRoute(message_t* msg, uint8_t resend) { int i; lqi_header_t* hdr = getHeader(msg); if (isRoot) { return FAIL; } if (hdr->originaddr != TOS_NODE_ID && resend == 0) { // supress duplicate packets for (i = 0; i < MHOP_HISTORY_SIZE; i++) { if ((gRecentPacketSender[i] == call AMPacket.source(msg)) && (gRecentPacketSeqNo[i] == hdr->seqno)) { call CollectionDebug.logEvent(NET_C_FE_DUPLICATE_CACHE_AT_SEND); dbg("LQI", "%s no route as this is a duplicate!\n", __FUNCTION__); return FAIL; } } gRecentPacketSender[gRecentIndex] = call AMPacket.source(msg); gRecentPacketSeqNo[gRecentIndex] = hdr->seqno; gRecentIndex = (gRecentIndex + 1) % MHOP_HISTORY_SIZE; // supress multihop cycles and try to break out of it for (i = 0; i < MHOP_HISTORY_SIZE; i++) { if ((gRecentOriginPacketSender[i] == hdr->originaddr) && (gRecentOriginPacketSeqNo[i] == hdr->originseqno)) { gbCurrentParentCost = 0x7fff; gbCurrentLinkEst = 0x7fff; gbCurrentParent = TOS_BCAST_ADDR; gbCurrentHopCount = ROUTE_INVALID; dbg("LQI", "%s no route as we are in a cycle!\n", __FUNCTION__); return FAIL; } } gRecentOriginPacketSender[gRecentOriginIndex] = hdr->originaddr; gRecentOriginPacketSeqNo[gRecentOriginIndex] = hdr->originseqno; gRecentOriginIndex = (gRecentOriginIndex + 1) % MHOP_HISTORY_SIZE; } if (resend == 0) { hdr->seqno = gCurrentSeqNo++; } dbg("LQI", "LQI setting destination to %hu and link quality ?\n", gbCurrentParent); call AMPacket.setDestination(msg, gbCurrentParent); return SUCCESS; } command error_t RouteSelect.initializeFields(message_t* msg) { lqi_header_t* header = getHeader(msg); header->originaddr = TOS_NODE_ID; header->originseqno = gOriginSeqNo++; header->seqno = gCurrentSeqNo; if (isRoot) { header->hopcount = 0; } else { header->hopcount = gbCurrentHopCount; } dbg("LQI", "LQI setting hopcount to %hhu\n", gbCurrentHopCount); return SUCCESS; } command uint8_t* RouteSelect.getBuffer(message_t* Msg, uint16_t* Len) { } command uint16_t RouteControl.getParent() { return gbCurrentParent; } command uint8_t RouteControl.getQuality() { return gbCurrentLinkEst; } command uint8_t RouteControl.getDepth() { return gbCurrentHopCount; } command uint8_t RouteControl.getOccupancy() { return 0; } command error_t RouteControl.setUpdateInterval(uint16_t Interval) { gUpdateInterval = Interval; return SUCCESS; } command error_t RouteControl.manualUpdate() { post SendRouteTask(); return SUCCESS; } event void Timer.fired() { call Leds.led0Toggle(); post TimerTask(); call Timer.startOneShot((uint32_t)1024 * gUpdateInterval + 1); } event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) { lqi_beacon_msg_t* bMsg = (lqi_beacon_msg_t*)payload; am_addr_t source = call AMPacket.source(msg); uint8_t lqi = call CC2420Packet.getLqi(msg); call CollectionDebug.logEventRoute(NET_C_TREE_RCV_BEACON, source, 0, bMsg->cost); if (isRoot) { return msg; } else { dbg("LQI,LQIRoute", "LQI receiving routing beacon from %hu with LQI %hhu that advertises %hu.\n", source, lqi, bMsg->cost); if (source == gbCurrentParent) { // try to prevent cycles if (bMsg->parent != TOS_NODE_ID) { gLastHeard = 0; gbCurrentParentCost = bMsg->cost; gbCurrentLinkEst = adjustLQI(lqi); gbCurrentHopCount = bMsg->hopcount + 1; dbg("LQI,LQIRoute", " -- Not a loop\n"); } else { gLastHeard = 0; gbCurrentParentCost = 0x7fff; gbCurrentLinkEst = 0x7fff; gbCurrentParent = TOS_BCAST_ADDR; gbCurrentHopCount = ROUTE_INVALID; dbg("LQI,LQIRoute", " -- Detected a loop\n"); } } else { /* if the message is not from my parent, compare the message's cost + link estimate to my current cost, switch if necessary */ // make sure you don't pick a parent that creates a cycle if (((uint32_t) bMsg->cost + (uint32_t) adjustLQI(lqi) < ((uint32_t) gbCurrentParentCost + (uint32_t) gbCurrentLinkEst) - (((uint32_t) gbCurrentParentCost + (uint32_t) gbCurrentLinkEst) >> 2) ) && (bMsg->parent != TOS_NODE_ID)) { gLastHeard = 0; gbCurrentParent = call AMPacket.source(msg); gbCurrentParentCost = bMsg->cost; gbCurrentLinkEst = adjustLQI(lqi); gbCurrentHopCount = bMsg->hopcount + 1; call CollectionDebug.logEventRoute(NET_C_TREE_NEW_PARENT, gbCurrentParent, 0, gbCurrentParentCost + gbCurrentLinkEst); dbg("LQI,LQIRoute", " -- Not a cycle.\n"); } else { dbg("LQI,LQIRoute", " -- CYCLE.\n"); } } } dbg("LQI,LQIRoute", "Set my count to %hhu, my link to %hu and my cost to %hu.\n", gbCurrentHopCount, gbCurrentLinkEst, gbCurrentParentCost); return msg; } event void AMSend.sendDone(message_t* msg, error_t success) { msgBufBusy = FALSE; } /* Default implementations for CollectionDebug calls. * These allow CollectionDebug not to be wired to anything if debugging * is not desired. */ default command error_t CollectionDebug.logEvent(uint8_t type) { return SUCCESS; } default command error_t CollectionDebug.logEventSimple(uint8_t type, uint16_t arg) { return SUCCESS; } default command error_t CollectionDebug.logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3) { return SUCCESS; } default command error_t CollectionDebug.logEventMsg(uint8_t type, uint16_t msg, am_addr_t origin, am_addr_t node) { return SUCCESS; } default command error_t CollectionDebug.logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t etx) { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/net/lqi/MultiHopEngineM.nc000066400000000000000000000230411207233610700222350ustar00rootroot00000000000000// $Id: MultiHopEngineM.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * A simple module that handles multihop packet movement. It accepts * messages from both applications and the network and does the necessary * interception and forwarding. * It interfaces to an algorithmic componenet via RouteSelect. It also acts * as a front end for RouteControl */ /* * Authors: Philip Buonadonna, Alec Woo, Crossbow Inc. * */ #include "AM.h" #include "MultiHop.h" module MultiHopEngineM { provides { interface Init; interface Receive; interface Send; interface Packet; interface CollectionPacket; interface RouteControl; interface LqiRouteStats; } uses { interface Receive as SubReceive; interface AMSend as SubSend; interface RouteControl as RouteSelectCntl; interface RouteSelect; interface Leds; interface Packet as SubPacket; interface AMPacket; interface RootControl; interface PacketAcknowledgements; } } implementation { enum { FWD_QUEUE_SIZE = MHOP_QUEUE_SIZE, // Forwarding Queue EMPTY = 0xff }; /* Internal storage and scheduling state */ message_t FwdBuffers[FWD_QUEUE_SIZE]; message_t *FwdBufList[FWD_QUEUE_SIZE]; uint8_t FwdBufBusy[FWD_QUEUE_SIZE]; uint8_t iFwdBufHead, iFwdBufTail; uint16_t sendFailures = 0; uint8_t fail_count = 0; lqi_header_t* getHeader(message_t* msg) { return (lqi_header_t*) call SubPacket.getPayload(msg, NULL); } /*********************************************************************** * Initialization ***********************************************************************/ static void initialize() { int n; for (n=0; n < FWD_QUEUE_SIZE; n++) { FwdBufList[n] = &FwdBuffers[n]; FwdBufBusy[n] = 0; } iFwdBufHead = iFwdBufTail = 0; sendFailures = 0; } command error_t Init.init() { initialize(); return SUCCESS; } /*********************************************************************** * Commands and events ***********************************************************************/ command error_t Send.send(message_t* pMsg, uint8_t len) { len += sizeof(lqi_header_t); if (len > call SubPacket.maxPayloadLength()) { call Leds.led0On(); return ESIZE; } if (call RootControl.isRoot()) { call Leds.led1On(); return FAIL; } call RouteSelect.initializeFields(pMsg); if (call RouteSelect.selectRoute(pMsg, 0) != SUCCESS) { call Leds.led2On(); return FAIL; } call PacketAcknowledgements.requestAck(pMsg); if (call SubSend.send(call AMPacket.destination(pMsg), pMsg, len) != SUCCESS) { sendFailures++; return FAIL; } return SUCCESS; } int8_t get_buff(){ uint8_t n; for (n=0; n < FWD_QUEUE_SIZE; n++) { uint8_t done = 0; atomic{ if(FwdBufBusy[n] == 0){ FwdBufBusy[n] = 1; done = 1; } } if(done == 1) return n; } return -1; } int8_t is_ours(message_t* ptr){ uint8_t n; for (n=0; n < FWD_QUEUE_SIZE; n++) { if(FwdBufList[n] == ptr){ return n; } } return -1; } static message_t* mForward(message_t* msg) { message_t* newMsg = msg; int8_t buf = get_buff(); call Leds.led2Toggle(); if (call RootControl.isRoot()) { return signal Receive.receive(msg, call Packet.getPayload(msg, NULL), call Packet.payloadLength(msg)); } if (buf == -1) { dbg("LQI", "Dropped packet due to no space in queue.\n"); return msg; } if ((call RouteSelect.selectRoute(msg, 0)) != SUCCESS) { FwdBufBusy[(uint8_t)buf] = 0; return msg; } // Failures at the send level do not cause the seq. number space to be // rolled back properly. This is somewhat broken. call PacketAcknowledgements.requestAck(msg); if (call SubSend.send(call AMPacket.destination(msg), msg, call SubPacket.payloadLength(msg) == SUCCESS)) { newMsg = FwdBufList[(uint8_t)buf]; FwdBufList[(uint8_t)buf] = msg; } else{ FwdBufBusy[(uint8_t)buf] = 0; sendFailures++; } return newMsg; } event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { return mForward(msg); } event void SubSend.sendDone(message_t* msg, error_t success) { int8_t buf; if (!call PacketAcknowledgements.wasAcked(msg) && call AMPacket.destination(msg) != TOS_BCAST_ADDR && fail_count < 5){ call RouteSelect.selectRoute(msg, 1); if (call SubSend.send(call AMPacket.destination(msg), msg, call SubPacket.payloadLength(msg)) == SUCCESS) { fail_count ++; } else { sendFailures++; } } fail_count = 0; buf = is_ours(msg); if (buf != -1) { // Msg was from forwarding queue FwdBufBusy[(uint8_t)buf] = 0; } else { signal Send.sendDone(msg, success); } } command uint16_t RouteControl.getParent() { return call RouteSelectCntl.getParent(); } command uint8_t RouteControl.getQuality() { return call RouteSelectCntl.getQuality(); } command uint8_t RouteControl.getDepth() { return call RouteSelectCntl.getDepth(); } command uint8_t RouteControl.getOccupancy() { uint16_t uiOutstanding = (uint16_t)iFwdBufTail - (uint16_t)iFwdBufHead; uiOutstanding %= FWD_QUEUE_SIZE; return (uint8_t)uiOutstanding; } command error_t RouteControl.setUpdateInterval(uint16_t Interval) { return call RouteSelectCntl.setUpdateInterval(Interval); } command error_t RouteControl.manualUpdate() { return call RouteSelectCntl.manualUpdate(); } command uint16_t LqiRouteStats.getSendFailures() { return sendFailures; } command void Packet.clear(message_t* msg) { } command void* Send.getPayload(message_t* m) { return call Packet.getPayload(m, NULL); } command uint8_t Send.maxPayloadLength() { return call Packet.maxPayloadLength(); } command error_t Send.cancel(message_t* m) { return FAIL; } command void* Receive.getPayload(message_t* m, uint8_t* len) { return call Packet.getPayload(m, len); } command uint8_t Receive.payloadLength(message_t* m) { return call Packet.payloadLength(m); } command uint8_t Packet.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg) - sizeof(lqi_header_t); } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call SubPacket.setPayloadLength(msg, len + sizeof(lqi_header_t)); } command uint8_t Packet.maxPayloadLength() { return (call SubPacket.maxPayloadLength() - sizeof(lqi_header_t)); } command void* Packet.getPayload(message_t* msg, uint8_t* len) { void* rval = call SubPacket.getPayload(msg, len); *len -= sizeof(lqi_header_t); rval += sizeof(lqi_header_t); return rval; } command am_addr_t CollectionPacket.getOrigin(message_t* msg) { lqi_header_t* hdr = getHeader(msg); return hdr->originaddr; } command void CollectionPacket.setOrigin(message_t* msg, am_addr_t addr) { lqi_header_t* hdr = getHeader(msg); hdr->originaddr = addr; } command collection_id_t CollectionPacket.getType(message_t* msg) { return 0; } command void CollectionPacket.setType(message_t* msg, collection_id_t id) {} command uint8_t CollectionPacket.getSequenceNumber(message_t* msg) { lqi_header_t* hdr = getHeader(msg); return hdr->originseqno; } command void CollectionPacket.setSequenceNumber(message_t* msg, uint8_t seqno) { lqi_header_t* hdr = getHeader(msg); hdr->originseqno = seqno; } default event void Send.sendDone(message_t* pMsg, error_t success) {} } tinyos-2.1.2+dfsg/tos/lib/net/lqi/MultiHopLqi.h000066400000000000000000000121731207233610700212730ustar00rootroot00000000000000// $Id: MultiHopLqi.h,v 1.6 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Buonadonna, Crossbow, Gilman Tolle * Date last modified: 2/20/03 * */ /** * @author Philip Buonadonna * @author Philip Levis (port from TinyOS 1.x) */ #ifndef _TOS_MULTIHOP_H #define _TOS_MULTIHOP_H #ifndef MHOP_QUEUE_SIZE #define MHOP_QUEUE_SIZE 2 #endif #ifndef MHOP_HISTORY_SIZE #define MHOP_HISTORY_SIZE 4 #endif #include "AM.h" #include "Collection.h" #define UQ_LQI_CLIENT "LqiForwardingEngineP.Send" enum { AM_LQI_BEACON_MSG = 0x73, AM_LQI_DATA_MSG = 0x74, AM_LQI_DEBUG = 0x75, AM_LQI_DEBUG_PACKET = 3, NUM_LQI_CLIENTS = uniqueCount(UQ_LQI_CLIENT), }; /* Fields of neighbor table */ typedef struct TOS_MHopNeighbor { uint16_t addr; // state provided by nbr uint16_t recv_count; // since last goodness update uint16_t fail_count; // since last goodness, adjusted by TOs uint16_t hopcount; uint8_t goodness; uint8_t timeouts; // since last recv } TOS_MHopNeighbor; typedef nx_struct lqi_data_msg { nx_uint16_t originaddr; nx_int16_t seqno; nx_int16_t originseqno; nx_uint16_t hopcount; nx_collection_id_t collectId; } lqi_header_t; typedef nx_struct lqi_beacon_msg { nx_uint16_t originaddr; nx_int16_t seqno; nx_int16_t originseqno; nx_uint16_t parent; nx_uint16_t cost; nx_uint16_t hopcount; } lqi_beacon_msg_t; typedef struct DBGEstEntry { uint16_t id; uint8_t hopcount; uint8_t sendEst; } DBGEstEntry; typedef struct DebugPacket { // uint16_t seqno; uint16_t estEntries; DBGEstEntry estList[0]; } DebugPacket; #endif /* _TOS_MULTIHOP_H */ tinyos-2.1.2+dfsg/tos/lib/net/lqi/MultiHopLqiP.nc000066400000000000000000000134411207233610700215630ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * @author Joe Polastre * @author Philip Levis (port to TinyOS 2.x) */ #include "MultiHopLqi.h" configuration MultiHopLqiP { provides { interface StdControl; interface Send; interface Receive[collection_id_t id]; interface Receive as Snoop[collection_id_t]; interface Intercept[collection_id_t id]; interface RouteControl; interface LqiRouteStats; interface Packet; interface RootControl; interface CollectionPacket; } uses interface CollectionDebug; } implementation { components LqiForwardingEngineP as Forwarder, LqiRoutingEngineP as Router; components new AMSenderC(AM_LQI_BEACON_MSG) as BeaconSender, new AMReceiverC(AM_LQI_BEACON_MSG) as BeaconReceiver, new AMSenderC(AM_LQI_DATA_MSG) as DataSender, new AMSenderC(AM_LQI_DATA_MSG) as DataSenderMine, new AMReceiverC(AM_LQI_DATA_MSG) as DataReceiver, new TimerMilliC(), NoLedsC, LedsC, RandomC, ActiveMessageC, MainC; MainC.SoftwareInit -> Forwarder; MainC.SoftwareInit -> Router; components CC2420ActiveMessageC as CC2420; StdControl = Router.StdControl; Receive = Forwarder.Receive; Send = Forwarder; Intercept = Forwarder.Intercept; Snoop = Forwarder.Snoop; RouteControl = Forwarder; LqiRouteStats = Forwarder; Packet = Forwarder; CollectionPacket = Forwarder; RootControl = Router; //CC2420.SubPacket -> DataSender; Forwarder.SplitControl -> ActiveMessageC; Forwarder.RouteSelectCntl -> Router.RouteControl; Forwarder.RouteSelect -> Router; Forwarder.SubSend -> DataSender; Forwarder.SubSendMine -> DataSenderMine; Forwarder.SubReceive -> DataReceiver; Forwarder.Leds -> LedsC; Forwarder.AMPacket -> ActiveMessageC; Forwarder.SubPacket -> ActiveMessageC; Forwarder.PacketAcknowledgements -> ActiveMessageC; Forwarder.RootControl -> Router; Forwarder.Random -> RandomC; Forwarder.CollectionDebug = CollectionDebug; Router.AMSend -> BeaconSender; Router.Receive -> BeaconReceiver; Router.Random -> RandomC; Router.Timer -> TimerMilliC; Router.LqiRouteStats -> Forwarder; Router.CC2420Packet -> CC2420; Router.AMPacket -> ActiveMessageC; Router.Packet -> ActiveMessageC; Router.Leds -> NoLedsC; Router.CollectionDebug = CollectionDebug; } tinyos-2.1.2+dfsg/tos/lib/net/lqi/RouteControl.nc000066400000000000000000000116071207233610700216750ustar00rootroot00000000000000// $Id: RouteControl.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Authors: Phil Buonadonna * Rev: $Id: RouteControl.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ */ /** * Control/Monitor interface to a routing component * @author Phil Buonadonna * @author Philip Levis (port from TinyOS 1.x) */ interface RouteControl { /** * Get this node's present parent address. * * @return The address of the parent */ command uint16_t getParent(); /** * Get this node's depth in the network * * @return The network depth. */ command uint8_t getDepth(); /** * Return length of the routing forwarding queue * * @return The number of outstanding entries in the queue. */ command uint8_t getOccupancy(); /** * Get a measure of goodness for the current parent * * @return A value between 0-256 where 256 represent the best * goodness */ command uint8_t getQuality(); /** * Set the routing componenets internal update interval. * * @param The duration, in seconds, of successive routing * updates. * * @return SUCCESS if the operation succeeded. */ command error_t setUpdateInterval(uint16_t Interval); /** * Queue a manual update of the routing state. This may or may * not include the transmission of a message. * * @return SUCCESS if a route update was queued. */ command error_t manualUpdate(); } tinyos-2.1.2+dfsg/tos/lib/net/lqi/RouteSelect.nc000066400000000000000000000131601207233610700214700ustar00rootroot00000000000000// $Id: RouteSelect.nc,v 1.6 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Authors: Philip Levis * Date last modified: 8/12/02 * * The RouteSelect interface is part of the TinyOS ad-hoc routing * system architecture. The component that keeps track of routing * information and makes route selection decisions provides this * interface. When a Send component wants to send a packet, it passes * it to RouteSelect for its routing information to be filled in. This * way, the Send component is entirely unaware of the routing * header/footer structure. */ /** * Interface to a route selection component in the TinyOS ad-hoc * system architecture. * @author Philip Levis */ #include "AM.h" interface RouteSelect { /** * Whether there is currently a valid route. * * @return Whether there is a valid route. */ command bool isActive(); /** * Select a route and fill in all of the necessary routing * information to a packet. * * @param msg Message to select route for and fill in routing information. * * @return Whether a route was selected succesfully. On FAIL the * packet should not be sent. * */ command error_t selectRoute(message_t* ONE msg, uint8_t resend); /** * Given a TOS_MstPtr, initialize its routing fields to a known * state, specifying that the message is originating from this node. * This known state can then be used by selectRoute() to fill in * the necessary data. * * @param msg Message to select route for and fill in init data. * * @return Should always return SUCCESS. * */ command error_t initializeFields(message_t* msg); /** * Given a TinyOS message buffer, provide a pointer to the data * buffer within it that an application can use as well as its * length. Unlike the getBuffer of the Send interface, this can * be called freely and does not modify the buffer. * * @param msg The message to get the data region of. * * @param length Pointer to a field to store the length of the data region. * * @return A pointer to the data region. */ command uint8_t* getBuffer(message_t* msg, uint16_t* len); } tinyos-2.1.2+dfsg/tos/lib/net/rpl/000077500000000000000000000000001207233610700167175ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/rpl/README000066400000000000000000000000001207233610700175650ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPL.h000066400000000000000000000236401207233610700175320ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RPLRankC.nc * @ author JeongGil Ko (John) */ /* * Copyright (c) 2010 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Yiwei Yao */ #ifndef RPL_H #define RPL_H #include /* SDH : NB : make sure divideRank * BLIP_L2_RETRIES does not overflow a uint16_t */ /* SDH : Default eviction threshold set to an etx of "3" -- these are pretty bad links. */ /* SDH : the aging parameter \alpha for the link estimator is currently hard-coded in RPLRankP.nc. Last I checked, it was set to 0.8. */ #ifndef RPL_OF_MRHOF // Threshold at which to evict parent #define minHopRankIncrease 1 // Divisor for the metric (for fixed-point repr) #define divideRank 10 #define INIT_ETX divideRank #define ETX_THRESHOLD (3 * divideRank) #else // MRHOF #define minHopRankIncrease 128 #define divideRank 128 #define INIT_ETX divideRank //448 #define ETX_THRESHOLD (3 * divideRank) #endif // MRHOF #define MAX_PARENT 20 #define MAX_HOPCOUNT 30 #define RPL_QUEUE_SIZE 5 #define RPL_MAX_SOURCEROUTE 10 enum { RPL_DODAG_METRIC_CONTAINER_TYPE = 2, RPL_DST_PREFIX_TYPE = 3, RPL_DODAG_CONFIG_TYPE = 4, RPL_TARGET_TYPE = 5, RPL_TRANSIT_INFORMATION_TYPE = 6, RPL_MOP_No_Downward = 0, RPL_MOP_No_Storing = 1, RPL_MOP_Storing_No_Multicast = 2, RPL_MOP_Storing_With_Multicast = 3, RPL_DIO_TYPE_METRIC = 2, RPL_DIO_TYPE_ROUTING = 3, RPL_DIO_TYPE_DODAG = 4, RPL_DIO_TYPE_PREFIX = 8, RPL_ROUTE_METRIC_ETX = 7, RPLOF_OCP_OF0 = 0, RPLOF_OCP_MRHOF = 1, }; enum { RPL_IFACE = ROUTE_IFACE_154, RPL_HBH_RANK_TYPE = 0x6b, /* per draft-ietf-6man-rpl-option-02 */ }; struct icmpv6_header_t { uint8_t type; uint8_t code; nx_uint16_t checksum; }__attribute__((packed)); struct dis_base_t { struct icmpv6_header_t icmpv6; nx_uint16_t reserved; }; struct rpl_instance_id { /* Global RPLInstance ID */ uint8_t id; }__attribute__((packed)); struct transit_info_option_t { uint8_t type; uint8_t option_length; uint8_t path_sequence; uint8_t path_control; uint32_t path_lifetime; struct in6_addr parent_address; }; struct target_option_t { uint8_t type; uint8_t option_length; uint8_t reserved; uint8_t prefix_length; struct in6_addr target_prefix; }; struct dao_base_t { struct icmpv6_header_t icmpv6; struct rpl_instance_id instance_id; // used to be RPLinstanceID uint16_t k_bit : 1; uint16_t d_bit : 1; uint16_t flags : 6; uint16_t reserved : 8; uint8_t DAOsequence; struct in6_addr dodagID; struct target_option_t target_option; struct transit_info_option_t transit_info_option; }__attribute__((packed)); struct dio_base_t { struct icmpv6_header_t icmpv6; struct rpl_instance_id instance_id; // used to be instanceID nx_uint8_t version; //used to be sequence nx_uint16_t dagRank; uint8_t flags; uint8_t dtsn; nx_uint16_t reserved; struct in6_addr dodagID; // was dagID }__attribute__((packed)); struct dio_body_t{ // type 2 ; contains metrics uint8_t type; uint8_t container_len; //uint8_t *metric_data; }; struct dio_dodag_config_t{ // type 4 ; contains DODAG configuration nx_uint8_t type; nx_uint8_t length; uint8_t flags : 4; uint8_t A : 1; uint8_t PCS : 3; nx_uint8_t DIOIntDoubl; nx_uint8_t DIOIntMin; nx_uint8_t DIORedun; nx_uint16_t MaxRankInc; nx_uint16_t MinHopRankInc; nx_uint16_t ocp; nx_uint8_t reserved; nx_uint8_t default_lifetime; nx_uint16_t lifetime_unit; }; struct dio_metric_header_t{ uint8_t routing_obj_type; uint8_t reserved : 2; uint8_t R_flag : 1; uint8_t G_flag : 1; uint8_t A_flag : 2; uint8_t O_flag : 1; uint8_t C_flag : 1; nx_uint16_t object_len; }; struct dio_etx_t{ nx_uint16_t etx; }; struct dio_latency_t{ float latency; }; struct dio_prefix_t{ uint8_t type; nx_uint16_t suboption_len; uint8_t reserved : 3; uint8_t preference : 2; uint8_t reserved2 : 3; nx_uint32_t lifetime; uint8_t prefix_len; struct in6_addr prefix; }; struct rpl_route { uint8_t next_header; uint8_t hdr_ext_len; uint8_t routing_type; uint8_t segments_left; uint8_t compr : 4; uint8_t pad : 4; uint8_t reserved; uint16_t reserved1; struct in6_addr addr[RPL_MAX_SOURCEROUTE]; }; /* Necessary constants for RPL*/ uint16_t ROOT_RANK = 1; enum { BASE_RANK = 0, INFINITE_RANK = 0xFFFF, RPL_DEFAULT_INSTANCE = 0, NUMBER_OF_PARENTS = 10, DIS_INTERVAL = 3*1024U, DEFAULT_LIFETIME = 1024L * 60 * 20, // 20 mins }; /*RFC defined parameters*/ enum { ICMPV6_TYPE = 58, }; enum { ICMPV6_CODE_DIS = 0x00, ICMPV6_CODE_DIO = 0x01, ICMPV6_CODE_DAO = 0x02, }; enum { DIO_BASE_FLAG_GRD = 0, DIO_BASE_FLAG_DA_TRIGGER = 1, DIO_BASE_FLAG_DA_SUPPORT = 2, DIO_BASE_FLAG_PREF_5 = 5, DIO_BASE_FLAG_PREF_6 = 6, DIO_BASE_FLAG_PREF_7 = 7, }; enum { DIO_BASE_OPT_PAD1 = 0, DIO_BASE_OPT_PADN = 1, DIO_BASE_OPT_DAG_METRIC = 2, DIO_BASE_OPT_DST_PREFIX = 3, DIO_BASE_OPT_DAG_TIMER_CONFIG = 4, }; ///////////////////////// for forwarding engine ////////////////////////////// typedef struct { struct in6_addr next_hop; uint8_t* data; } rpl_data_packet_t; typedef struct { struct ip6_hdr iphdr; uint8_t retries; rpl_data_packet_t packet; } queue_entry_t; typedef struct { struct ip6_packet s_pkt; struct dao_base_t dao_base; struct ip_iovec v[1]; } dao_entry_t; typedef struct { struct in6_addr nodeID; uint8_t interfaceID; uint8_t DAOsequence; //uint16_t DAOrank; uint32_t DAOlifetime; uint8_t routeTag; uint8_t RRlength; uint8_t prefixLength; struct in6_addr prefix; uint8_t* RRStack; } dao_table_entry; typedef struct { struct in6_addr nodeID; uint16_t successTx; uint16_t totalTx; uint16_t etx; } parentTableEntryDAO; typedef struct { route_key_t key; uint32_t lifetime; } downwards_table_t; nx_struct nx_ip6_ext { nx_uint8_t ip6e_nxt; nx_uint8_t ip6e_len; }; /* draft-ietf-6man-rpl-option-01 */ typedef nx_struct { nx_struct nx_ip6_ext ip6_ext_outer; nx_struct nx_ip6_ext ip6_ext_inner; nx_uint8_t bitflag; // nx_struct rpl_instance_id instance_id; // used to be instanceID nx_uint8_t instance_id; nx_uint16_t senderRank; } __attribute__((packed)) rpl_data_hdr_t ; #define RPL_DATA_O_BIT_MASK 0x80 #define RPL_DATA_O_BIT_SHIFT 7 #define RPL_DATA_R_BIT_MASK 0x40 #define RPL_DATA_R_BIT_SHIFT 6 #define RPL_DATA_F_BIT_MASK 0x20 #define RPL_DATA_F_BIT_SHIFT 5 ////////////////////////////////////////////////////////////////////////////// /////////////////////// for rank component /////////////////////////////////// typedef struct { struct in6_addr parentIP; uint16_t rank; //uint16_t successNum; //uint16_t totalNum; uint16_t etx; uint16_t etx_hop; //float latency; bool valid; } parent_t; struct dio_dest_prefix_t { uint8_t type; uint16_t length; uint8_t* data; }; #define DIO_GROUNDED_MASK 0x80 #define DIO_MOP_MASK 0x3c #define DIO_MOP_SHIFT 3 #define DIO_PREF_MASK 0x07 #define DIO_PREF_SHIFT 0 #endif tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLDAORoutingEngine.nc000066400000000000000000000034311207233610700227210ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RPLDAORoutingEngine.nc * @ author JeongGil Ko (John) */ #include interface RPLDAORoutingEngine{ command error_t startDAO(); command bool getStoreState(); command void newParent(); } tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLDAORoutingEngineC.nc000066400000000000000000000060241207233610700230250ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RPLDAORoutingEngineC.nc * @ author JeongGil Ko (John) */ #include #include #include #include configuration RPLDAORoutingEngineC{ provides { interface StdControl; interface RPLDAORoutingEngine; } uses { interface IP as ICMP_RA[uint8_t code]; } } implementation{ components new RPLDAORoutingEngineP() as DAORouting; components MainC, RandomC; components new TimerMilliC() as DelayDAOTimer; components new TimerMilliC() as GenerateDAOTimer; components new TimerMilliC() as RemoveTimer; components IPAddressC; components RPLRankC; components RPLRoutingEngineC; components IPStackC; StdControl = DAORouting; RPLDAORoutingEngine = DAORouting; DAORouting.IP_DAO = ICMP_RA[ICMPV6_CODE_DAO]; DAORouting.DelayDAOTimer -> DelayDAOTimer; DAORouting.GenerateDAOTimer -> GenerateDAOTimer; DAORouting.RemoveTimer -> RemoveTimer; DAORouting.Random -> RandomC; DAORouting.IPAddress -> IPAddressC; DAORouting.RPLRouteInfo -> RPLRoutingEngineC; DAORouting.RootControl -> RPLRoutingEngineC; DAORouting.ForwardingTable -> IPStackC; components new QueueC(dao_entry_t*, RPL_QUEUE_SIZE) as SendQueueP; DAORouting.SendQueue -> SendQueueP; components new PoolC(dao_entry_t, RPL_QUEUE_SIZE) as SendPoolP; DAORouting.SendPool -> SendPoolP; components IPPacketC; DAORouting.IPPacket -> IPPacketC; components LedsC; DAORouting.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLDAORoutingEngineP.nc000066400000000000000000000333311207233610700230430ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RPLDAORoutingEngineP.nc * @ author JeongGil Ko (John) */ #include #include #include generic module RPLDAORoutingEngineP() { provides { interface RPLDAORoutingEngine as RPLDAORouteInfo; interface StdControl; } uses { interface Timer as DelayDAOTimer; interface Timer as RemoveTimer; interface Timer as GenerateDAOTimer; interface Random; interface IP as IP_DAO; interface IPAddress; interface Queue as SendQueue; interface Pool as SendPool; interface RPLRoutingEngine as RPLRouteInfo; interface RootControl; interface IPPacket; interface ForwardingTable; interface Leds; } } implementation { #define RPL_GLOBALADDR #define INIT_DAO 10000 uint8_t dao_double_count = 0; uint8_t dao_double_limit = 6; uint32_t dao_rate = INIT_DAO; // dao batches will be fired 256 ms after the first dao message is // scheduled every 100 ms, check if elememts in the entry should be // deleted -- only for storing nodes uint32_t delay_dao = 256; uint32_t remove_time = 120 * 1024U; uint8_t dao_table_pos = 0; uint16_t DTSN = 0; uint8_t daoseq = 0; uint16_t init_daorank = 1; uint8_t PATH_SEQUENCE = 0; uint8_t PATH_CONTROL = 0; downwards_table_t downwards_table[ROUTE_TABLE_SZ]; uint8_t downwards_table_count = 0; bool m_running = FALSE; bool memcmp_rpl(uint8_t* a, uint8_t* b, uint8_t len) { uint8_t i; for (i = 0 ; i < len ; i++) if (a[i] != b[i]) return FALSE; return TRUE; } command error_t StdControl.start() { call RPLDAORouteInfo.startDAO(); m_running = TRUE; return SUCCESS; } command error_t StdControl.stop() { m_running = FALSE; return SUCCESS; } uint32_t count = 0; task void sendDAO() { dao_entry_t* dao_msg; // struct ieee154_frame_addr addr_struct; // for now the next hop for the DAO is ONLY the desired parent on // the path to the DODAG root struct in6_addr next_hop; struct dao_base_t* dao; if (call RPLRouteInfo.getRank() == ROOT_RANK) { return; } if (call SendQueue.size() > 0 && call RPLRouteInfo.getMOP() != 0) { dao_msg = call SendQueue.dequeue(); // this should be my desired parent for now #if RPL_STORING_MODE /* in storing mode we unicast using LL addresses (9.2) */ call IPAddress.getLLAddr(&dao_msg->s_pkt.ip6_hdr.ip6_src); if (call RPLRouteInfo.getDefaultRoute(&next_hop) != SUCCESS) { call SendPool.put(dao_msg); printf("RPL: DAO: sendDAO: no default route\n"); return; } ip_memcpy((uint8_t*)&dao_msg->s_pkt.ip6_hdr.ip6_dst, (uint8_t*)&next_hop, sizeof(struct in6_addr)); #else /* in non-storing mode we must use global addresses */ call IPAddress.getGlobalAddr(&dao_msg->s_pkt.ip6_hdr.ip6_src); /* and unicast to the DODAG root */ call RPLRouteInfo.getDodagId(&dao_msg->s_pkt.ip6_hdr.ip6_dst); #endif dao = (struct dao_base_t *) dao_msg->s_pkt.ip6_data->iov_base; printf("RPL: >> sendDAO %d %lu \n", TOS_NODE_ID, ++count); printfflush(); call IP_DAO.send(&dao_msg->s_pkt); call SendPool.put(dao_msg); if (call SendQueue.size()) { // Once fired, shoot all the DAOs in the current sendqueue; // Assume that there is no aggregation on DAO messages. post sendDAO(); } } } command error_t RPLDAORouteInfo.startDAO() { #ifdef RPL_STORING_MODE call RemoveTimer.startPeriodic(remove_time); #else if (call RPLRouteInfo.getRank() != ROOT_RANK) { } else { call RemoveTimer.startPeriodic(remove_time); } #endif //call GenerateDAOTimer.startOneShot(dao_rate); // do we need this? call DelayDAOTimer.startOneShot(delay_dao + call Random.rand16()%100); if (call GenerateDAOTimer.isRunning()) { return SUCCESS; } else if (call RPLRouteInfo.getRank() == ROOT_RANK) { return SUCCESS; } else { call GenerateDAOTimer.startOneShot(dao_rate + ((call Random.rand16()) % (dao_rate / 10))); } return SUCCESS; } command bool RPLDAORouteInfo.getStoreState() { #if RPL_STORING_MODE return TRUE; #else return call RootControl.isRoot(); #endif } task void initDAO(); event void GenerateDAOTimer.fired() { // Initiate my own DAO messages uint32_t dao_next = dao_rate + ((call Random.rand16()) % (dao_rate / 10)); printf("RPL: DAO TIMER %lu %lu \n", dao_next, dao_rate); /* call GenerateDAOTimer.stop(); printfflush(); if (dao_double_count < dao_double_limit) { dao_rate = (dao_rate * 2) + call Random.rand16()%100; dao_double_count ++; } call GenerateDAOTimer.startOneShot(dao_rate + call Random.rand16()%50); */ post initDAO(); call GenerateDAOTimer.startOneShot(dao_next); } task void initDAO() { error_t error; dao_entry_t* dao_msg; uint16_t length = sizeof(struct dao_base_t); if (!call RPLRouteInfo.hasDODAG() || call RPLRouteInfo.getRank() == ROOT_RANK) { printf("RPL: DAO: no DODOG or rank\n"); return; } dao_msg = call SendPool.get(); if (dao_msg == NULL) { printf("RPL: DAO: no message\n"); return; } // call IPAddress.setSource(&dao_msg->s_pkt.ip6_hdr); dao_msg->dao_base.icmpv6.type = ICMP_TYPE_RPL_CONTROL; dao_msg->dao_base.icmpv6.code = ICMPV6_CODE_DAO; dao_msg->dao_base.icmpv6.checksum = 0; dao_msg->dao_base.DAOsequence = daoseq; // get instance ID from Rtg eng dao_msg->dao_base.instance_id.id = call RPLRouteInfo.getInstanceID(); dao_msg->dao_base.target_option.type = RPL_TARGET_TYPE; dao_msg->dao_base.target_option.option_length = 18; // length of my address dao_msg->dao_base.target_option.prefix_length = sizeof(struct in6_addr) * 8; #ifdef RPL_GLOBALADDR call IPAddress.getGlobalAddr(&dao_msg->dao_base.target_option.target_prefix); #else call IPAddress.getLLAddr(&dao_msg->dao_base.target_option.target_prefix); #endif dao_msg->dao_base.transit_info_option.type = RPL_TRANSIT_INFORMATION_TYPE; dao_msg->dao_base.transit_info_option.option_length = 22; dao_msg->dao_base.transit_info_option.path_sequence = PATH_SEQUENCE; dao_msg->dao_base.transit_info_option.path_control = PATH_CONTROL; dao_msg->dao_base.transit_info_option.path_lifetime = DEFAULT_LIFETIME; if (call RPLRouteInfo.getDefaultRoute(&dao_msg->dao_base.transit_info_option.parent_address) != SUCCESS) { printf("RPL: DAO: no default route\n"); call SendPool.put(dao_msg); return; } dao_msg->v[0].iov_base = (uint8_t *)&dao_msg->dao_base; dao_msg->v[0].iov_len = length; dao_msg->v[0].iov_next = NULL; dao_msg->s_pkt.ip6_hdr.ip6_vfc = IPV6_VERSION; dao_msg->s_pkt.ip6_hdr.ip6_nxt = IANA_ICMP; dao_msg->s_pkt.ip6_hdr.ip6_plen = htons(length); dao_msg->s_pkt.ip6_data = &dao_msg->v[0]; error = call SendQueue.enqueue(dao_msg); if (error != SUCCESS) { printf("RPL: DAO: can't enqueue\n"); call SendPool.put(dao_msg); return; } else { if (!call DelayDAOTimer.isRunning()) { call DelayDAOTimer.startOneShot(delay_dao); } } } event void DelayDAOTimer.fired() { post sendDAO(); } event void RemoveTimer.fired() { // check stored table's life-time uint8_t i, j; if (!call RPLDAORouteInfo.getStoreState()) return; for (i = 0; i < downwards_table_count; i++) { downwards_table[i].lifetime -= remove_time; if (downwards_table[i].lifetime <= remove_time) { /* SDH : expire the route to this destination */ call ForwardingTable.delRoute(downwards_table[i].key); for (j = i; j < downwards_table_count-1; j++) { downwards_table[j] = downwards_table[j+1]; } downwards_table[downwards_table_count-1].lifetime = 0; downwards_table_count --; } } } event void IP_DAO.recv(struct ip6_hdr *iph, void *payload, size_t len, struct ip6_metadata *meta) { dao_entry_t* dao_msg; error_t error; struct in6_addr MYADDR; // This is where the message is actually cast struct dao_base_t *dao = (struct dao_base_t *)payload; struct route_entry *entry; route_key_t new_key = ROUTE_INVAL_KEY; printf("RPL: receive DAO\n"); printfflush(); if (!m_running) return; #ifndef RPL_STORING_MODE if (!call RPLDAORouteInfo.getStoreState()) return; #endif // if (dao->target_option.prefix_length == 128) // call Leds.led1Toggle(); /* SDH : the two cases are the same... */ entry = call ForwardingTable.lookupRoute(dao->target_option.target_prefix.s6_addr, dao->target_option.prefix_length); if ((entry != NULL) && (entry->prefixlen == dao->target_option.prefix_length)) { /* exact match in the forwarding table */ if (memcmp_rpl((uint8_t*)entry->next_hop.s6_addr, (uint8_t*)iph->ip6_src.s6_addr, 16) == TRUE) { // same old destination with same DTSN } else { /* SDH : shouldn't we, like, save the new route? */ // new next hop for an existing downswards node //call ForwardingTable.delRoute(entry.key); call RPLRouteInfo.setDTSN((call RPLRouteInfo.getDTSN()) + 1); if (dao->target_option.prefix_length > 0) new_key = call ForwardingTable.addRoute(dao->target_option.target_prefix.s6_addr, dao->target_option.prefix_length, &iph->ip6_src, RPL_IFACE); } } else { /* new prefix */ call IPAddress.getGlobalAddr(&MYADDR); if (downwards_table_count == ROUTE_TABLE_SZ || memcmp_rpl((void*)&MYADDR, dao->target_option.target_prefix.s6_addr, 16)) { // printf("RPL: Downward table full -- not adding route\n"); // or this is my own address for some wierd reason return; } printf("RPL: DAO: Add new route\n"); printfflush(); if (dao->target_option.prefix_length > 0) { new_key = call ForwardingTable.addRoute(dao->target_option.target_prefix.s6_addr, dao->target_option.prefix_length, &iph->ip6_src, RPL_IFACE); } if (new_key != ROUTE_INVAL_KEY) { //downwards_table[downwards_table_count].lifetime = dao->transit_info_option.path_lifetime; downwards_table[downwards_table_count].key = new_key; // for next element downwards_table_count ++; } } if (new_key != ROUTE_INVAL_KEY) { uint8_t i; for (i=0;itransit_info_option.path_lifetime; } } } /***********************************************************************/ // FROM THIS POINT, ITS ABOUT FORWARDING THE DAO INFORMATION UPWARDS!!! /***********************************************************************/ if (call RPLRouteInfo.getRank() == ROOT_RANK) { // no need to futher process packets return; } /* else{ if (!call GenerateDAOTimer.isRunning()) call GenerateDAOTimer.startOneShot(dao_rate); } */ dao_msg = call SendPool.get(); if (dao_msg == NULL) { return; } // NO MODIFICATION TO DAO's RR-LIST NEEDED! -- just make sure I // keep what I have and the prefix ip_memcpy((uint8_t*)&dao_msg->s_pkt.ip6_hdr, (uint8_t*)iph, sizeof(struct ip6_hdr)); // copy new payload information ip_memcpy((uint8_t*)&dao_msg->dao_base, (uint8_t*)payload, sizeof(struct dao_base_t)); dao_msg->v[0].iov_base = (uint8_t *)&dao_msg->dao_base; dao_msg->v[0].iov_len = ntohs(iph->ip6_plen); dao_msg->v[0].iov_next = NULL; dao_msg->s_pkt.ip6_data = &dao_msg->v[0]; error = call SendQueue.enqueue(dao_msg); if (error != SUCCESS) { call SendPool.put(dao_msg); return; } else { if (!call DelayDAOTimer.isRunning()) call DelayDAOTimer.startOneShot(delay_dao); } } command void RPLDAORouteInfo.newParent() { /* dao_rate = INIT_DAO; dao_double_count = 0; call GenerateDAOTimer.stop(); call GenerateDAOTimer.startOneShot(dao_rate); */ post initDAO(); } event void IPAddress.changed(bool global_valid) {} } tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLMRHOFP.nc000066400000000000000000000204021207233610700206100ustar00rootroot00000000000000/* * Copyright (c) 2011 Johns Hopkins University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RPLMRHOFP.nc * @ author JeongGil Ko (John) */ /** * This file implements the IETF draft draft-ietf-roll-minrank-hysteresis-of-02 * This file uses the ETX metric container to compute the next hop and rank **/ #include "blip_printf.h" module RPLMRHOFP{ provides interface RPLOF; uses interface ForwardingTable; uses interface RPLRoutingEngine as RPLRoute; uses interface RPLParentTable as ParentTable; uses interface RPLDAORoutingEngine as RPLDAO; uses interface RPLRank as RPLRankInfo; } implementation{ #define STABILITY_BOUND 5 // this determines the stability bound for switching parents. // 0 is the min value to have nodes aggressively seek new parents // 5 or 10 is suggested uint16_t nodeRank = INFINITE_RANK; uint16_t minMetric = 0xFFFF; uint32_t parentChanges = 0; uint16_t nodeEtx = divideRank; uint16_t prevParent; bool newParent = FALSE; uint16_t desiredParent = MAX_PARENT - 1; uint16_t min_hop_rank_inc = 1; route_key_t route_key = ROUTE_INVAL_KEY; void setRoot() { nodeEtx = divideRank; nodeRank = ROOT_RANK; } /* OCP for MRHOF */ command bool RPLOF.OCP(uint16_t ocp) { if (ocp == RPLOF_OCP_MRHOF) return TRUE; return FALSE; } /* Which metrics does this implementation support */ command bool RPLOF.objectSupported(uint16_t objectType) { if (objectType == RPL_ROUTE_METRIC_ETX) { return TRUE; } return FALSE; } command uint16_t RPLOF.getObjectValue() { if (call RPLRankInfo.isRoot()) { setRoot(); } return nodeEtx; } command void RPLOF.setMinHopRankIncrease(uint16_t val) { min_hop_rank_inc = val; } /* Current parent */ command struct in6_addr* RPLOF.getParent() { parent_t* parentNode = call ParentTable.get(desiredParent); return &parentNode->parentIP; } /* Current rank */ command uint16_t RPLOF.getRank() { // minHopInc has to be added to this value return nodeRank; } command bool RPLOF.recalculateRank() { // return TRUE if this is the first time that the rank is computed // for this parent. uint16_t prevEtx, prevRank; parent_t* parentNode = call ParentTable.get(desiredParent); if (desiredParent == MAX_PARENT) { nodeRank = INFINITE_RANK; return FALSE; } prevEtx = nodeEtx; prevRank = nodeRank; nodeEtx = parentNode->etx_hop + parentNode -> etx; // -1 because the ext computation will add at least 1 nodeRank = (parentNode->etx_hop / divideRank * min_hop_rank_inc) + parentNode->rank; // printf("RPLOF: >>> %d %d %d %d %d %d %d\n", // desiredParent, parentNode->etx_hop, divideRank, // parentNode->rank, (min_hop_rank_inc - 1), nodeRank, prevRank); // printfflush(); if (nodeRank <= ROOT_RANK && prevRank > 1) { nodeRank = prevRank; nodeEtx = prevEtx; } if (newParent) { newParent = FALSE; return TRUE; } else { return FALSE; } } /* Recompute the routes, return TRUE if rank updated */ command bool RPLOF.recomputeRoutes() { uint8_t indexset; uint8_t min = 0; uint16_t minDesired; parent_t* parentNode, *previousParent; //choose the first valid parentNode = call ParentTable.get(min); while (!parentNode->valid && min < MAX_PARENT) { min++; parentNode = call ParentTable.get(min); } minDesired = parentNode->etx_hop + parentNode->etx; if (min == MAX_PARENT) { call RPLOF.resetRank(); call RPLRoute.inconsistency(); // call ForwardingTable.delRoute(route_key); route_key = ROUTE_INVAL_KEY; return FALSE; } // printf("RPLOF: %d %d %d %d \n", // parentNode->etx, parentNode->rank, parentNode->etx_hop, min); parentNode = call ParentTable.get(desiredParent); // update to most recent etx if (htons(parentNode->parentIP.s6_addr16[7]) != 0) minMetric = parentNode->etx_hop + parentNode->etx; for (indexset = min + 1; indexset < MAX_PARENT; indexset++) { parentNode = call ParentTable.get(indexset); if ((parentNode->valid) && (parentNode->etx >= divideRank) && (parentNode->etx_hop >= 0) && (parentNode->etx_hop + parentNode->etx < minDesired) && (parentNode->rank < nodeRank) && (parentNode->rank != INFINITE_RANK)) { min = indexset; // best aggregate end-to-end etx minDesired = parentNode->etx_hop + parentNode->etx; // printf("RPLOF: %d %d %d %d \n", // parentNode->etx, parentNode->rank, parentNode->etx_hop, min); if (min == desiredParent) minMetric = minDesired; } else if (min == desiredParent) { minMetric = minDesired; } } parentNode = call ParentTable.get(min); if (parentNode->rank > nodeRank || parentNode->rank == INFINITE_RANK) { printf("RPLOF: SELECTED PARENT is FFFF %d\n", TOS_NODE_ID); //call ForwardingTable.delRoute(route_key); route_key = ROUTE_INVAL_KEY; return FALSE; } previousParent = call ParentTable.get(desiredParent); if ((minDesired + ((divideRank * STABILITY_BOUND) / 10) >= minMetric) && (minMetric !=0) && (previousParent->valid)) { // if the min measurement (minDesired) is not significantly // better than the previous parent's (minMetric), stay with what // we have... min = desiredParent; minDesired = minMetric; } // printf("RPLOF: <> %d %d %d %d \n", // parentNode->etx, parentNode->rank, parentNode->etx_hop, min); minMetric = minDesired; desiredParent = min; parentNode = call ParentTable.get(desiredParent); // printf("RPLOF: MRHOF %d %d %u %u\n", // TOS_NODE_ID, htons(parentNode->parentIP.s6_addr16[7]), // parentNode->etx_hop, parentNode->etx); /* set the new default route */ /* set one of the below of maybe set both? */ // call ForwardingTable.addRoute((const uint8_t*)&DODAGID, // 128, &parentNode->parentIP, RPL_IFACE); route_key = call ForwardingTable.addRoute(NULL, 0, &parentNode->parentIP, RPL_IFACE); if (prevParent != parentNode->parentIP.s6_addr16[7]) { // printf("RPLOF: >> New Parent %d %d %lu \n", // TOS_NODE_ID, htons(parentNode->parentIP.s6_addr16[7]), // parentChanges++); printf("RPLOF: #L %u 0\n", (uint8_t)htons(prevParent)); printf("RPLOF: #L %u 1\n", (uint8_t)htons(parentNode->parentIP.s6_addr16[7])); newParent = TRUE; call RPLDAO.newParent(); } prevParent = parentNode->parentIP.s6_addr16[7]; return TRUE; } command void RPLOF.resetRank() { nodeRank = INFINITE_RANK; minMetric = 0xFFFF; } event void RPLRankInfo.parentRankChange() {} } tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLOF.nc000066400000000000000000000010471207233610700201250ustar00rootroot00000000000000interface RPLOF { /* OCP for this OF */ command bool OCP(uint16_t ocp); /* Which metrics does this implementation support */ command bool objectSupported(uint16_t objectType); command uint16_t getObjectValue(); /* Current parent */ command struct in6_addr* getParent(); /* Current rank */ command uint16_t getRank(); command void resetRank(); command bool recalculateRank(); /* Recompute the routes, return TRUE if rank updated */ command bool recomputeRoutes(); command void setMinHopRankIncrease(uint16_t val); } tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLOF0P.nc000066400000000000000000000204161207233610700203260ustar00rootroot00000000000000/* * Copyright (c) 2011 Johns Hopkins University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RPLOF0P.nc * @ author JeongGil Ko (John) */ #include "blip_printf.h" module RPLOF0P{ provides interface RPLOF; uses interface ForwardingTable; uses interface RPLRoutingEngine as RPLRoute; uses interface RPLParentTable as ParentTable; uses interface RPLDAORoutingEngine as RPLDAO; } implementation{ // this determines the stability bound for switching parents. #define STABILITY_BOUND 5 uint16_t nodeRank = INFINITE_RANK; uint16_t minMetric = 0xFFFF; uint16_t prevParent; uint32_t parentChanges = 0; uint16_t desiredParent = MAX_PARENT - 1; uint16_t nodeEtx = divideRank; bool newParent = FALSE; uint16_t min_hop_rank_inc = 1; route_key_t route_key = ROUTE_INVAL_KEY; /* OCP for OF0 */ command bool RPLOF.OCP(uint16_t ocp) { if (ocp == RPLOF_OCP_OF0) return TRUE; return FALSE; } /* Which metrics does this implementation support */ command bool RPLOF.objectSupported(uint16_t objectType) { // OF0 does not care about the metric return TRUE; /* if (objectType == RPL_ROUTE_METRIC_ETX) { return TRUE; } return FALSE; */ } command void RPLOF.setMinHopRankIncrease(uint16_t val) { min_hop_rank_inc = val; } command uint16_t RPLOF.getObjectValue() { return nodeEtx; } /* Current parent */ command struct in6_addr* RPLOF.getParent() { parent_t* parentNode = call ParentTable.get(desiredParent); return &parentNode->parentIP; } /* Current rank */ command uint16_t RPLOF.getRank() { return nodeRank; } command bool RPLOF.recalculateRank() { uint16_t prevEtx, prevRank; parent_t* parentNode = call ParentTable.get(desiredParent); if (desiredParent == MAX_PARENT) { nodeRank = INFINITE_RANK; return FALSE; } prevEtx = nodeEtx; prevRank = nodeRank; // printf("RPLOF: OF0 PARENT rank %d \n", parentSet[desiredParent].rank); nodeEtx = parentNode->etx_hop; nodeRank = parentNode->rank + min_hop_rank_inc; if (nodeRank < min_hop_rank_inc) nodeRank = INFINITE_RANK; if (newParent) { newParent = FALSE; return TRUE; }else{ return FALSE; } } /* Recompute the routes, return TRUE if rank updated */ command bool RPLOF.recomputeRoutes() { uint8_t indexset; uint8_t min = 0, count = 0; uint16_t minDesired; parent_t* parentNode, *previousParent; parentNode = call ParentTable.get(min); while ((!parentNode->valid) && (min < MAX_PARENT) && (parentNode->rank != INFINITE_RANK)) { min++; parentNode = call ParentTable.get(min); } minDesired = parentNode->etx_hop + (parentNode->rank * divideRank); if (min == MAX_PARENT) { call RPLOF.resetRank(); call RPLRoute.inconsistency(); call ForwardingTable.delRoute(route_key); route_key = ROUTE_INVAL_KEY; return FALSE; } // printf("RPLOF: Start Compare %d %d: %d %d %d \n", // htons(prevParent), htons(parentNode->parentIP.s6_addr16[7]), // minDesired, parentNode->etx_hop, parentNode->rank); parentNode = call ParentTable.get(desiredParent); if (htons(parentNode->parentIP.s6_addr16[7]) != 0) { minMetric = parentNode->etx_hop + parentNode->rank*divideRank; // printf("RPLOF: Compare %d: %d %d with %d %d\n", // htons(parentNode->parentIP.s6_addr16[7]), // parentNode->etx_hop, parentNode->rank, minDesired, minMetric); } if (min == desiredParent) minMetric = minDesired; for (indexset = min + 1; indexset < MAX_PARENT; indexset++) { parentNode = call ParentTable.get(indexset); // if (parentNode->valid) // printf("RPLOF: Compare %d: %d %d with %d %d\n", // htons(parentNode->parentIP.s6_addr16[7]), // parentNode->etx_hop, parentNode->rank, minDesired, indexset); if ((parentNode->valid) && (parentNode->etx_hop >= 0) && (parentNode->etx_hop + (parentNode->rank * divideRank) < minDesired) && (parentNode->rank < nodeRank) && (parentNode->rank != INFINITE_RANK)) { count ++; min = indexset; minDesired = parentNode->etx_hop + parentNode->rank * divideRank; // printf("RPLOF: Compare %d %d \n", // minDesired, parentNode->etx_hop/divideRank + parentNode->rank); if (min == desiredParent) { // printf("RPLOF: current parent Checking...\n"); minMetric = minDesired; } } else if (min == desiredParent) { minMetric = minDesired; } } parentNode = call ParentTable.get(min); /*parentNode->rank > nodeRank || */ if (parentNode->rank == INFINITE_RANK) { // printf("RPLOF: SELECTED PARENT is FFFF %d\n", TOS_NODE_ID); desiredParent = MAX_PARENT; call ForwardingTable.delRoute(route_key); route_key = ROUTE_INVAL_KEY; return FALSE; } previousParent = call ParentTable.get(desiredParent); if ((minDesired * divideRank + STABILITY_BOUND >= minMetric * divideRank) && (minMetric != 0) && (previousParent->valid)) { // if the min measurement (minDesired) is not significantly // better than the previous parent's (minMetric), stay with what // we have... // printf("RPLOF: SAFETYBOUND %d %d %d\n", // minDesired*divideRank, STABILITY_BOUND, minMetric*divideRank); min = desiredParent; minDesired = minMetric; } minMetric = minDesired; desiredParent = min; parentNode = call ParentTable.get(desiredParent); // printf("RPLOF: OF0 %d %d %u %u %d\n", TOS_NODE_ID, // htons(parentNode->parentIP.s6_addr16[7]), // parentNode->etx_hop, parentNode->rank, count); /* set the new default route */ /* set one of the below of maybe set both? */ // call ForwardingTable.addRoute((const uint8_t*)&DODAGID, 128, // l &parentNode->parentIP, RPL_IFACE); route_key = call ForwardingTable.addRoute(NULL, 0, &parentNode->parentIP, RPL_IFACE); if (prevParent != parentNode->parentIP.s6_addr16[7]) { // printf("RPLOF: >> New Parent %d %x %lu \n", TOS_NODE_ID, // htons(parentNode->parentIP.s6_addr16[7]), // parentChanges++); // printf("RPLOF: #L %u 0\n", (uint8_t)htons(prevParent)); // printf("RPLOF: #L %u 1 %d\n", // (uint8_t)htons(parentNode->parentIP.s6_addr16[7]), // TOS_NODE_ID); newParent = TRUE; call RPLDAO.newParent(); } prevParent = parentNode->parentIP.s6_addr16[7]; return TRUE; } command void RPLOF.resetRank() { nodeRank = INFINITE_RANK; minMetric = 0xFFFF; } } tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLParentTable.nc000066400000000000000000000001131207233610700220130ustar00rootroot00000000000000interface RPLParentTable{ command parent_t* get(uint8_t parent_index); } tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLRank.nc000066400000000000000000000105461207233610700205200ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RPLRank.nc * @ author JeongGil Ko (John) */ /* * Copyright (c) 2010 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @ author Yiwei Yao */ interface RPLRank { // declare the I am the root command void declareRoot(); // I am no longer a root command void cancelRoot(); // I am the root? command bool isRoot(); // return the rank of the specified IP addr command uint16_t getRank(struct in6_addr *node); // return if IP is in parent set command bool isParent(struct in6_addr *node); // new iteration has begun //command void notifyNewIteration(); // inconsistency is seen for the link with IP // record this as part of entry in table as well command void inconsistencyDetected(); /*new adding*/ // ping rank component if there are parents command uint8_t hasParent(); command bool isLeaf(); command uint16_t getEtx(); command bool compareAddr(struct in6_addr *node1, struct in6_addr *node2); command bool validInstance(uint8_t instanceID); event void parentRankChange(); //////Feel free to add events or commands below this line////// /////////////////////////////////////////////////////////////// command void setQueuingDelay(uint32_t delay); command error_t getDefaultRoute(struct in6_addr *next_hop); } tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLRankC.nc000066400000000000000000000107221207233610700206170ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RPLRankC.nc * @ author JeongGil Ko (John) */ /* * Copyright (c) 2010 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @ author Yiwei Yao */ configuration RPLRankC{ provides { interface IP as IP_DIO_Filter; interface RPLRank; interface StdControl; } uses { interface IP as ICMP_RA[uint8_t code]; } } implementation { components RPLRankP, IPAddressC; components RPLRoutingEngineC; components IPStackC, IPPacketC; components LedsC; RPLRank = RPLRankP; StdControl = RPLRankP; IP_DIO_Filter = RPLRankP.IP_DIO_Filter; RPLRankP.IP_DIO = ICMP_RA[ICMPV6_CODE_DIO]; RPLRankP.Leds -> LedsC; RPLRankP.RouteInfo -> RPLRoutingEngineC; RPLRankP.IPAddress -> IPAddressC; //RPLRankP.ForwardingTable -> IPStackC; RPLRankP.ForwardingEvents -> IPStackC.ForwardingEvents[RPL_IFACE]; RPLRankP.IPPacket -> IPPacketC; #ifdef RPL_OF_MRHOF components RPLMRHOFP, RPLDAORoutingEngineC; RPLRankP.RPLOF -> RPLMRHOFP; RPLMRHOFP.ForwardingTable -> IPStackC; RPLMRHOFP.RPLRoute -> RPLRoutingEngineC; RPLMRHOFP.ParentTable -> RPLRankP; RPLMRHOFP.RPLDAO -> RPLDAORoutingEngineC; RPLMRHOFP.RPLRankInfo -> RPLRankP; #else components RPLOF0P, RPLDAORoutingEngineC; RPLRankP.RPLOF -> RPLOF0P; RPLOF0P.ForwardingTable -> IPStackC; RPLOF0P.RPLRoute -> RPLRoutingEngineC; RPLOF0P.ParentTable -> RPLRankP; RPLOF0P.RPLDAO -> RPLDAORoutingEngineC; #endif } tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLRankP.nc000066400000000000000000000722051207233610700206400ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RPLRankP.nc * @ author JeongGil Ko (John) */ /* * Copyright (c) 2010 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @ author Yiwei Yao */ #include #include #include #include #include #include "blip_printf.h" #include "IPDispatch.h" module RPLRankP{ provides{ interface RPLRank as RPLRankInfo; interface StdControl; interface IP as IP_DIO_Filter; interface RPLParentTable; } uses { interface IP as IP_DIO; interface IPPacket; interface RPLRoutingEngine as RouteInfo; interface Leds; interface IPAddress; interface ForwardingTable; interface ForwardingEvents; interface RPLOF; } } implementation { uint16_t nodeRank = INFINITE_RANK; // 0 is the initialization state uint16_t minRank = INFINITE_RANK; bool leafState = FALSE; /* SDH : this is essentially the Default Route List */ struct in6_addr prevParent; uint32_t parentChanges = 0; uint8_t parentNum = 0; uint16_t VERSION = 0; uint16_t nodeEtx = divideRank; uint16_t MAX_RANK_INCREASE = 1; //uint16_t MIN_HOP_RANK_INCREASE = 1; uint8_t etxConstraint; uint32_t latencyConstraint; // hasConstraint[0] represents ETX, hasConstraint[1] represent Latency bool hasConstraint[2] = {FALSE,FALSE}; struct in6_addr DODAGID; struct in6_addr DODAG_MAX; uint8_t METRICID; //which metric uint16_t OCP; uint32_t myQDelay = 1.0; bool hasOF = FALSE; uint8_t Prf = 0xFF; uint8_t alpha; //configuration parameter uint8_t beta; bool ignore = FALSE; bool ROOT = FALSE; bool m_running = FALSE; parent_t parentSet[MAX_PARENT]; void resetValid(); void getNewRank(); #define RPL_GLOBALADDR #define compare_ipv6(node1, node2) \ (!memcmp((node1), (node2), sizeof(struct in6_addr))) command error_t StdControl.start() { //initialization uint8_t indexset; DODAG_MAX.s6_addr16[7] = htons(0); ip_memcpy((uint8_t*)&DODAGID, (uint8_t*)&DODAG_MAX, sizeof(struct in6_addr)); for (indexset = 0; indexset < MAX_PARENT; indexset++) { parentSet[indexset].valid = FALSE; } m_running = TRUE; return SUCCESS; } command error_t StdControl.stop() { m_running = FALSE; return SUCCESS; } command parent_t* RPLParentTable.get(uint8_t i) { return &parentSet[i]; } // declare the I am the root command void RPLRankInfo.declareRoot() { ROOT = TRUE; // minMetric = divideRank; nodeRank = ROOT_RANK; } command bool RPLRankInfo.isRoot() { return ROOT; } command bool RPLRankInfo.validInstance(uint8_t instanceID) { return TRUE; } // I am no longer a root command void RPLRankInfo.cancelRoot() { } uint8_t getParent(struct in6_addr *node); // return the rank of the specified IP addr command uint16_t RPLRankInfo.getRank(struct in6_addr *node) { uint8_t indexset; struct in6_addr my_addr; #ifdef RPL_GLOBALADDR call IPAddress.getGlobalAddr(&my_addr); #else call IPAddress.getLLAddr(&my_addr); #endif if (compare_ipv6(&my_addr, node)) { if (ROOT) { nodeRank = ROOT_RANK; } return nodeRank; } indexset = getParent(node); if (indexset != MAX_PARENT) { return parentSet[indexset].rank; } return 0x1234; } command error_t RPLRankInfo.getDefaultRoute(struct in6_addr *next) { // printf_in6addr(&parentSet[desiredParent].parentIP); // printf("\n"); if (parentNum) { ip_memcpy((uint8_t*)next, (uint8_t*)call RPLOF.getParent(), sizeof(struct in6_addr)); return SUCCESS; } return FAIL; } bool exceedThreshold(uint8_t indexset, uint8_t ID) { return parentSet[indexset].etx_hop > ETX_THRESHOLD; } command bool RPLRankInfo.compareAddr(struct in6_addr *node1, struct in6_addr *node2) { return compare_ipv6(node1, node2); } //return the index of parent uint8_t getParent(struct in6_addr *node) { uint8_t indexset; if (parentNum == 0) { return MAX_PARENT; } for (indexset = 0; indexset < MAX_PARENT; indexset++) { if (compare_ipv6(&(parentSet[indexset].parentIP),node) && parentSet[indexset].valid) { return indexset; } } return MAX_PARENT; } // return if IP is in parent set command bool RPLRankInfo.isParent(struct in6_addr *node) { return (getParent(node) != MAX_PARENT); } /* // new iteration has begun, all need to be cleared command void RPLRankInfo.notifyNewIteration() { parentNum = 0; resetValid(); } */ void resetValid() { uint8_t indexset; for (indexset = 0; indexset < MAX_PARENT; indexset++) { parentSet[indexset].valid = FALSE; } } // inconsistency is seen for the link with IP // record this as part of entry in table as well // Other layers will report this information command void RPLRankInfo.inconsistencyDetected() { parentNum = 0; call RPLOF.resetRank(); nodeRank = INFINITE_RANK; resetValid(); //memcpy(&DODAGID, 0, 16); //call RouteInfo.inconsistency(); } // ping rank component if there are parents command uint8_t RPLRankInfo.hasParent() { return parentNum; } command bool RPLRankInfo.isLeaf() { //return TRUE; return leafState; } uint8_t getPreExistingParent(struct in6_addr *node) { // just find if there are any pre existing information on this node... uint8_t indexset; if (parentNum == 0) { return MAX_PARENT; } for (indexset = 0; indexset < MAX_PARENT; indexset++) { if (compare_ipv6(&(parentSet[indexset].parentIP),node)) { return indexset; } } return MAX_PARENT; } command uint16_t RPLRankInfo.getEtx() { return call RPLOF.getObjectValue(); } void insertParent(parent_t parent) { uint8_t indexset; uint16_t tempEtx_hop; indexset = getPreExistingParent(&parent.parentIP); printf("RPL: Insert Node: %d \n", indexset); if (indexset != MAX_PARENT) { // we have previous information tempEtx_hop = parentSet[indexset].etx_hop; parentSet[indexset] = parent; if (tempEtx_hop > INIT_ETX && tempEtx_hop < BLIP_L2_RETRIES) { tempEtx_hop = tempEtx_hop-INIT_ETX; if (tempEtx_hop < divideRank) tempEtx_hop = INIT_ETX; } else{ tempEtx_hop = INIT_ETX; } parentSet[indexset].etx_hop = tempEtx_hop; parentNum++; // printf("Parent Added %d \n",parentNum); return; } for (indexset = 0; indexset < MAX_PARENT; indexset++) { if (!parentSet[indexset].valid) { parentSet[indexset] = parent; parentNum++; break; } } // printf("Parent Added 2 %d \n",parentNum); } void evictParent(uint8_t indexset) { parentSet[indexset].valid = FALSE; parentNum--; printf("RPL: Evict parent %d %u %u\n", parentNum, parentSet[indexset].etx_hop, parentSet[indexset].etx); if (parentNum == 0) { // should do something call RouteInfo.resetTrickle(); } } task void newParentSearch() { // only called when evictAll just cleared out my current desired parent call RPLOF.recomputeRoutes(); getNewRank(); } /* check and remove parents on rank change */ void evictAll() { uint8_t indexset, myParent; myParent = getParent(call RPLOF.getParent()); for (indexset = 0; indexset < MAX_PARENT; indexset++) { if (parentSet[indexset].valid && parentSet[indexset].rank >= nodeRank) { parentSet[indexset].valid = FALSE; parentNum--; printf("RPL: Evict all %d %d %d %d\n", parentNum, parentSet[indexset].rank, nodeRank, htons(parentSet[indexset].parentIP.s6_addr16[7])); if (indexset == myParent) { // i just cleared out my own parent... post newParentSearch(); return; } } } } command void RPLRankInfo.setQueuingDelay(uint32_t delay) { myQDelay = delay; } event bool ForwardingEvents.initiate(struct ip6_packet *pkt, struct in6_addr *next_hop) { uint16_t len; static struct ip_iovec v; static rpl_data_hdr_t data_hdr; #ifndef RPL_OF_MRHOF return TRUE; #endif if (pkt->ip6_hdr.ip6_nxt == IANA_ICMP) return TRUE; data_hdr.ip6_ext_outer.ip6e_nxt = pkt->ip6_hdr.ip6_nxt; data_hdr.ip6_ext_outer.ip6e_len = 0; /* well, this is actually the type */ data_hdr.ip6_ext_inner.ip6e_nxt = RPL_HBH_RANK_TYPE; data_hdr.ip6_ext_inner.ip6e_len = sizeof(rpl_data_hdr_t) - offsetof(rpl_data_hdr_t, bitflag); data_hdr.bitflag = 0; data_hdr.bitflag = 0 << RPL_DATA_O_BIT_SHIFT; data_hdr.bitflag |= 0 << RPL_DATA_R_BIT_SHIFT; data_hdr.bitflag |= 0 << RPL_DATA_F_BIT_SHIFT; data_hdr.instance_id = call RouteInfo.getInstanceID(); data_hdr.senderRank = nodeRank; pkt->ip6_hdr.ip6_nxt = IPV6_HOP; len = ntohs(pkt->ip6_hdr.ip6_plen); /* add the header */ v.iov_base = (uint8_t*) &data_hdr; v.iov_len = sizeof(rpl_data_hdr_t); v.iov_next = pkt->ip6_data; // original upper layer goes here! /* increase length in ipv6 header and relocate beginning */ pkt->ip6_data = &v; len = len + v.iov_len; pkt->ip6_hdr.ip6_plen = htons(len); return TRUE; } /** * Signaled by the forwarding engine for each packet being forwarded. * * If we return FALSE, the stack will drop the packet instead of * doing whatever was in the routing table. * */ event bool ForwardingEvents.approve(struct ip6_packet *pkt, struct in6_addr *next_hop) { #ifndef RPL_OF_MRHOF return TRUE; #else rpl_data_hdr_t data_hdr; bool inconsistent = FALSE; uint8_t o_bit; uint8_t nxt_hdr = IPV6_HOP; int off; /* is there a HBH header? */ off = call IPPacket.findHeader(pkt->ip6_data, pkt->ip6_hdr.ip6_nxt, &nxt_hdr); if (off < 0) return TRUE; /* if there is, is there a RPL TLV option in there? */ off = call IPPacket.findTLV(pkt->ip6_data, off, RPL_HBH_RANK_TYPE); if (off < 0) return TRUE; /* read out the rpl option */ if (iov_read(pkt->ip6_data, off + sizeof(struct tlv_hdr), sizeof(rpl_data_hdr_t) - offsetof(rpl_data_hdr_t, bitflag), (void *)&data_hdr.bitflag) != sizeof(rpl_data_hdr_t) - offsetof(rpl_data_hdr_t, bitflag)) return TRUE; o_bit = (data_hdr.bitflag & RPL_DATA_O_BIT_MASK) >> RPL_DATA_O_BIT_SHIFT; // printf("approve test: %d %d %d %d %d \n", // data_hdr.senderRank, data_hdr.instance_id, // nodeRank, o_bit, call RPLRankInfo.getRank(next_hop)); /* SDH : we'd want to dispatch on the instance id if there are multiple dags */ if (data_hdr.senderRank == ROOT_RANK) { o_bit = 1; goto approve; } if (o_bit && data_hdr.senderRank > nodeRank) { /* loop */ inconsistent = TRUE; } else if (!o_bit && data_hdr.senderRank < nodeRank) { inconsistent = TRUE; } if (call RPLRankInfo.getRank(next_hop) >= nodeRank) { /* Packet is heading down if the next_hop rank is not smaller than the current one (not in the parent set) */ /* By the time I am here, it means that there is a next hop but if this is not in my parent set, then it should be downward */ data_hdr.bitflag |= 1 << RPL_DATA_O_BIT_SHIFT; } if (inconsistent) { if ((data_hdr.bitflag & RPL_DATA_R_BIT_MASK) >> RPL_DATA_R_BIT_SHIFT) { /* this is not the first time */ /* ditch this packet! */ call RouteInfo.inconsistency(); // printf("NOT Approving: %d %d %d\n", // data_hdr.senderRank, data_hdr.instance_id, inconsistent); return FALSE; } else { /* just mark it */ data_hdr.bitflag |= 1 << RPL_DATA_R_BIT_SHIFT; goto approve; } } approve: // printf("Approving: %d %d %d\n", // data_hdr.senderRank, data_hdr.instance_id, inconsistent); data_hdr.senderRank = nodeRank; // write back the modified data header iov_update(pkt->ip6_data, off + sizeof(struct tlv_hdr), sizeof(rpl_data_hdr_t) - offsetof(rpl_data_hdr_t, bitflag), (void *)&data_hdr.bitflag); return TRUE; #endif } /* Compute ETX! */ event void ForwardingEvents.linkResult(struct in6_addr *node, struct send_info *info) { uint8_t indexset, myParent; uint16_t etx_now = (info->link_transmissions * divideRank) / info->link_fragment_attempts; printf("RPL: linkResult: "); printf_in6addr(node); printf(" %d [%i] %d \n", TOS_NODE_ID, etx_now, nodeRank); myParent = getParent(call RPLOF.getParent()); if (nodeRank == ROOT_RANK) { return; } for (indexset = 0; indexset < MAX_PARENT; indexset++) { if (parentSet[indexset].valid && compare_ipv6(&(parentSet[indexset].parentIP), node)) { break; } } if (indexset != MAX_PARENT) { // not empty... parentSet[indexset].etx_hop = (parentSet[indexset].etx_hop * 8 + (etx_now * 2)) / 10; if (exceedThreshold(indexset, METRICID)) { evictParent(indexset); if (indexset == myParent && parentNum > 0) call RPLOF.recomputeRoutes(); } getNewRank(); // printf(">> P_ETX UPDATE %d %d %d %d %d %d\n", // indexset, parentSet[indexset].etx_hop, // etx_now, ntohs(parentSet[indexset].parentIP.s6_addr16[7]), // nodeRank, parentNum); return; } // not contained in either parent set, do nothing } /* old <= new, return true; */ bool compareParent(parent_t oldP, parent_t newP) { return (oldP.etx_hop + oldP.etx) <= (newP.etx_hop + newP.etx); } void getNewRank() { uint16_t prevRank = nodeRank;//, myParent; bool newParent = FALSE; newParent = call RPLOF.recalculateRank(); nodeRank = call RPLOF.getRank(); // printf("GOT new rank %d %d %d\n", // TOS_NODE_ID, call RPLOF.getRank(), newParent); if (newParent) { minRank = nodeRank; return; } if (nodeRank < minRank) { minRank = nodeRank; return; } // did the node rank get worse than the limit? if ((nodeRank > prevRank) && (nodeRank - minRank > MAX_RANK_INCREASE) && (MAX_RANK_INCREASE != 0)) { // this is inconsistency! // printf("Inconsistent %d\n", TOS_NODE_ID); nodeRank = INFINITE_RANK; minRank = INFINITE_RANK; call RouteInfo.inconsistency(); return; } evictAll(); } /* * Extract information from a received DIO message */ void parseDIO(struct ip6_hdr *iph, uint8_t *buf, int len) { uint16_t pParentRank; struct in6_addr rDODAGID; uint16_t etx = 0xFFFF; parent_t tempParent; uint8_t parentIndex, myParent; uint16_t preRank; uint8_t tempPrf; bool newDodag = FALSE; struct dio_base_t *dio = (struct dio_base_t *)buf; struct dio_body_t* dio_body; struct dio_metric_header_t* dio_metric_header; struct dio_etx_t* dio_etx; struct dio_dodag_config_t* dio_dodag_config; // struct dio_prefix_t* dio_prefix; struct ip_iovec v[2]; struct ip6_ext dummy_ext; int hdr_off; buf += sizeof(struct dio_base_t); len -= sizeof(struct dio_base_t); dummy_ext.ip6e_len = (len - 8) / 8; v[0].iov_len = sizeof(dummy_ext); v[0].iov_base = (uint8_t *)&dummy_ext; v[0].iov_next = &v[1]; v[1].iov_len = len; v[1].iov_base = buf; v[1].iov_next = NULL; /* I am root */ if (nodeRank == ROOT_RANK) return; /* new iteration */ if (dio->version != VERSION && compare_ipv6(&dio->dodagID, &DODAGID)) { parentNum = 0; VERSION = dio->version; call RPLOF.resetRank(); nodeRank = INFINITE_RANK; minRank = INFINITE_RANK; resetValid(); } // if (dio->dagRank >= nodeRank && nodeRank != INFINITE_RANK) return; // printf("DIO in Rank %d %d %d %d\n", // ntohs(iph->ip6_src.s6_addr16[7]), // dio->dagRank, nodeRank, parentNum); // printf_in6addr(&iph->ip6_src); // printf("\n"); pParentRank = dio->dagRank; // DODAG ID in this DIO packet (received DODAGID) ip_memcpy((uint8_t *)&rDODAGID, (uint8_t *)&dio->dodagID, sizeof(struct in6_addr)); tempPrf = dio->flags & DIO_PREF_MASK; if (!compare_ipv6(&DODAGID, &DODAG_MAX) && !compare_ipv6(&DODAGID, &rDODAGID)) { // I have a DODAG but this packet is from a new DODAG if (Prf < tempPrf) { // ignore // printf("LESS PREFERENCE IGNORE \n"); ignore = TRUE; return; } else if (Prf > tempPrf) { // move // printf("MOVE TO NEW DODAG \n"); Prf = tempPrf; ip_memcpy((uint8_t *)&DODAGID, (uint8_t *)&rDODAGID, sizeof(struct in6_addr)); parentNum = 0; VERSION = dio->version; call RPLOF.resetRank(); nodeRank = INFINITE_RANK; minRank = INFINITE_RANK; // desiredParent = MAX_PARENT; resetValid(); newDodag = TRUE; } else { // it depends // printf("MOVE TO NEW DODAG %d %d\n", // compare_ipv6(&DODAGID, &DODAG_MAX), // compare_ipv6(&DODAGID, &rDODAGID)); newDodag = TRUE; } } else if (compare_ipv6(&DODAGID, &DODAG_MAX)) { // not belong to a DODAG yet // printf("TOTALLY NEW DODAG \n"); Prf = tempPrf; ip_memcpy((uint8_t *)&DODAGID, (uint8_t *)&rDODAGID, sizeof(struct in6_addr)); parentNum = 0; VERSION = dio->version; call RPLOF.resetRank(); nodeRank = INFINITE_RANK; minRank = INFINITE_RANK; //desiredParent = MAX_PARENT; newDodag = TRUE; resetValid(); } else { // same DODAG //printf("FROM SAME DODAG \n"); //Prf = tempPrf; // update prf } /////////////////////////////Collect data from DIOs///////////////////////////////// hdr_off = call IPPacket.findTLV(v, 0, RPL_DIO_TYPE_METRIC) - sizeof(struct ip6_ext); // printf("RPL: metric header off: %i\n", hdr_off); METRICID = 0; OCP = 0; // SDH : TODO : make some #defs for DODAG constants if (hdr_off >= 0) { // have a metric header dio_body = (struct dio_body_t *)(buf + hdr_off); dio_metric_header = (struct dio_metric_header_t *)(buf + hdr_off + 2); // printf("metric header %i %i %i\n", // dio_body->container_len, dio_metric_header->routing_obj_type, // dio_metric_header->object_len); if (dio_body->container_len >= sizeof(struct dio_metric_header_t) && dio_metric_header->routing_obj_type == RPL_ROUTE_METRIC_ETX && dio_metric_header->object_len == sizeof(struct dio_etx_t)) { // etx metric dio_etx = (struct dio_etx_t*)(dio_metric_header + 1); etx = dio_etx->etx; printf("RPL: ETX RECV %d \n", etx); METRICID = RPL_ROUTE_METRIC_ETX; } } else { etx = pParentRank * divideRank; //printf("No ETX %d \n", dio_body->type); } /* SDH : This is a routing header. apparently we don't look at this. */ // if (trackLength > 0 && dio_prefix->type == 3) { // trackLength -= sizeof(struct dio_prefix_t); // if (ignore == FALSE) { /* SDH : this will be a call to NeighborDiscovery */ /* although we might want to make a PrefixManager component... */ // New Prefix!!!! // TODO: Save prefix somewhere and make it a searchable command // } // } /* SDH : type 4 is a configuration header. */ hdr_off = call IPPacket.findTLV(v, 0, RPL_DIO_TYPE_DODAG) - sizeof(struct ip6_ext); // printf("RPL: dodag header off: %i\n", hdr_off); if (hdr_off >= 0 && !ignore) { dio_dodag_config = (struct dio_dodag_config_t *)(buf + hdr_off); // this is configuration header // printf("RPL: DODAG OPT > %d %d %d %d \n", METRICID, // dio_dodag_config->type, ignore, dio_dodag_config->ocp); OCP = dio_dodag_config->ocp; MAX_RANK_INCREASE = dio_dodag_config->MaxRankInc; // MIN_HOP_RANK_INCREASE = dio_dodag_config->MinHopRankInc; call RouteInfo.setDODAGConfig(dio_dodag_config->DIOIntDoubl, dio_dodag_config->DIOIntMin, dio_dodag_config->DIORedun, dio_dodag_config->MaxRankInc, dio_dodag_config->MinHopRankInc); call RPLOF.setMinHopRankIncrease(dio_dodag_config->MinHopRankInc); } ////////////////////////////////////////////////////////////////////////// // printf("PR %d NR %d OCP %d MID %d \n", // pParentRank, nodeRank, OCP, METRICID); // temporaily keep the parent information first ip_memcpy((uint8_t*)&tempParent.parentIP, (uint8_t*)&iph->ip6_src, sizeof(struct in6_addr)); tempParent.rank = pParentRank; tempParent.etx_hop = INIT_ETX; tempParent.valid = TRUE; tempParent.etx = etx; if ((!call RPLOF.objectSupported(METRICID) || !call RPLOF.OCP(OCP)) && parentNum == 0) { // either I dont know the metric object or I don't support the OF // printf("LEAF STATE! \n"); insertParent(tempParent); call RPLOF.recomputeRoutes(); //getNewRank(); no need to compute routes when I am going to stay as a leaf! nodeRank = INFINITE_RANK; leafState = TRUE; return; } if ((parentIndex = getParent(&iph->ip6_src)) != MAX_PARENT) { // parent already there and the rank is useful //printf("HOW many parents 1 ? %d %d \n", parentNum, newDodag); if (newDodag) { // old parent has to move to a new DODAG now if (parentNum != 0) { //chooseDesired(); // we do this to make sure that this parent is still the // best and it is worth moving call RPLOF.recomputeRoutes(); myParent = getParent(call RPLOF.getParent()); if (!compareParent(parentSet[myParent], tempParent)) { // the new dodag is not from my desired parent node Prf = tempPrf; ip_memcpy((uint8_t*)&DODAGID, (uint8_t*)&rDODAGID, sizeof(struct in6_addr)); parentNum = 0; VERSION = dio->version; resetValid(); insertParent(tempParent); call RPLOF.recomputeRoutes(); getNewRank(); } else { // I have a better node in the current DODAG so I am not moving! call RPLOF.recomputeRoutes(); getNewRank(); ignore = TRUE; } } else { // not likely to happen but this is a new DODAG... Prf = tempPrf; ip_memcpy((uint8_t*)&DODAGID, (uint8_t*)&rDODAGID, sizeof(struct in6_addr)); parentNum = 0; VERSION = dio->version; resetValid(); insertParent(tempParent); call RPLOF.recomputeRoutes(); getNewRank(); } } else { // this DIO is just from a parent that I know already, update // and re-evaluate // printf("known parent -- update\n"); parentSet[parentIndex].rank = pParentRank; // update rank parentSet[parentIndex].etx = etx; call RPLOF.recomputeRoutes(); getNewRank(); ignore = TRUE; } } else { // this parent is not in my routing table // printf("HOW many parents? %d \n", parentNum); if (parentNum > MAX_PARENT) // how do i share the parent count? return; // at this point know that its a meaningful packet from a new // node and we have space to store // printf("New parent %d %d %d\n", // ntohs(iph->ip6_src.s6_addr16[7]), tempParent.etx_hop, parentNum); if (newDodag) { // not only is this parent new but we have to move to a new DODAG now //printf("New DODAG \n"); if (parentNum != 0) { // make sure that I don't have an alternative path on this DODAG call RPLOF.recomputeRoutes(); myParent = getParent(call RPLOF.getParent()); if (!compareParent(parentSet[myParent], tempParent)) { // parentIndex == desiredParent, parentNum != 0, !compareParent // printf("changing DODAG\n"); Prf = tempPrf; ip_memcpy((uint8_t *)&DODAGID, (uint8_t *)&rDODAGID, sizeof(struct in6_addr)); parentNum = 0; VERSION = dio->version; resetValid(); insertParent(tempParent); call RPLOF.recomputeRoutes(); getNewRank(); } else { // do nothing ignore = TRUE; } } else { // This is the first DODAG I am registering ... or the once // before are all goners already // printf("First DODAG\n"); Prf = tempPrf; ip_memcpy((uint8_t *)&DODAGID, (uint8_t *)&rDODAGID, sizeof(struct in6_addr)); parentNum = 0; VERSION = dio->version; resetValid(); insertParent(tempParent); call RPLOF.recomputeRoutes(); getNewRank(); } } else { // its a new parent from the current DODAG .. so no need for // DODAG configuarion just insert // printf("Same DODAG %d \n", parentNum); insertParent(tempParent); call RPLOF.recomputeRoutes(); preRank = nodeRank; getNewRank(); } } } /* * Processing for incomming DIO, DAO, and DIS messages. * * SDH : we should not snoop on these from the forwarding engine; * instead we now go through the IPProtocols component to receive * them the normal way through the ICMP stack. Things like * verifying the checksum can go in there. * */ event void IP_DIO.recv(struct ip6_hdr *iph, void *payload, size_t len, struct ip6_metadata *meta) { struct dio_base_t *dio; dio = (struct dio_base_t *) payload; if (!m_running) return; if (nodeRank != ROOT_RANK && dio->dagRank != 0xFFFF) parseDIO(iph, payload, len); // evict parent if the node is advertizing 0xFFFF; if (dio->dagRank == 0xFFFF && getParent(&iph->ip6_src) != MAX_PARENT) evictParent(getParent(&iph->ip6_src)); // leafState = FALSE; if (nodeRank > dio->dagRank || dio->dagRank == INFINITE_RANK) { if (!ignore) { /* SDH : where did this go? */ signal IP_DIO_Filter.recv(iph, payload, len, meta); } ignore = FALSE; } } command error_t IP_DIO_Filter.send(struct ip6_packet *msg) { return call IP_DIO.send(msg); } event void IPAddress.changed(bool global_valid) {} } tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLRoutingC.nc000066400000000000000000000050251207233610700213530ustar00rootroot00000000000000/* * Copyright (c) 2011 Johns Hopkins University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RPLRoutingC.nc * @ author Stephen Dawson-Haggerty * @ author JeongGil Ko (John) */ /* Top-level component to wire together the RPL layers */ #include configuration RPLRoutingC { provides { interface StdControl; interface RootControl; } } implementation { components RPLRankC; components RPLRoutingEngineC; components RPLDAORoutingEngineC; /* we receive routing messages through the ICMP component, which recieves all packets with the ICMP */ components IPStackC; components new ICMPCodeDispatchC(ICMP_TYPE_RPL_CONTROL) as ICMP_RA; StdControl = RPLRoutingEngineC; StdControl = RPLRankC; /* Cancel below for no-downstream messages */ StdControl = RPLDAORoutingEngineC; RootControl = RPLRoutingEngineC; RPLRankC.ICMP_RA -> ICMP_RA; RPLDAORoutingEngineC.ICMP_RA -> ICMP_RA; IPStackC.RoutingControl -> RPLRoutingEngineC.StdControl; IPStackC.RoutingControl -> RPLDAORoutingEngineC.StdControl; } tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLRoutingEngine.nc000066400000000000000000000045351207233610700224030ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RPLRoutingEngine.nc * @ author JeongGil Ko (John) */ #include #include interface RPLRoutingEngine{ command void resetTrickle(); command bool hasDODAG(); command error_t getDefaultRoute(struct in6_addr *next_hop); command uint16_t getRank(); command uint8_t getInstanceID(); command bool validInstance(uint8_t instanceID); command struct in6_addr* getDodagId(); // returns the default dodagid // below is called when sub type 4 DIOs are received command void setDODAGConfig(uint8_t DIOIntDouble, uint8_t DIOIntMin, uint8_t DIORedun, uint8_t MaxRankInc, uint8_t MinHopRankInc); command uint8_t getMOP(); command void setDTSN(uint8_t dtsn); command uint8_t getDTSN(); command void inconsistency(); } tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLRoutingEngineC.nc000066400000000000000000000054741207233610700225110ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RPLRoutingEngineC.nc * @ author JeongGil Ko (John) */ #include #include configuration RPLRoutingEngineC{ provides { interface RootControl; interface StdControl; interface RPLRoutingEngine; // This is for the ForwardingEngine to use } } implementation{ components new RPLRoutingEngineP() as Routing; components MainC, RandomC; components new TimerMilliC() as TrickleTimer; components new TimerMilliC() as InitDISTimer; components new TimerMilliC() as VersionTimer; components IPAddressC; components LedsC, NoLedsC; components RPLRankC as RankC; components RPLDAORoutingEngineC; components new ICMPCodeDispatchC(ICMP_TYPE_RPL_CONTROL) as ICMP_RS; RootControl = Routing; StdControl = Routing; RPLRoutingEngine = Routing; Routing.IP_DIO -> RankC.IP_DIO_Filter; // This should be connected to RankC; Routing.IP_DIS -> ICMP_RS.IP[ICMPV6_CODE_DIS]; Routing.TrickleTimer -> TrickleTimer; Routing.InitDISTimer -> InitDISTimer; Routing.Random -> RandomC; Routing.RPLRankInfo -> RankC; Routing.IPAddress -> IPAddressC; Routing.Leds -> LedsC; Routing.RankControl -> RankC; Routing.RPLDAORoutingEngine -> RPLDAORoutingEngineC; Routing.IncreaseVersionTimer -> VersionTimer; } tinyos-2.1.2+dfsg/tos/lib/net/rpl/RPLRoutingEngineP.nc000066400000000000000000000502251207233610700225200ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RPLRoutingEngineP.nc * @ author JeongGil Ko (John) */ #include #include #include #include "blip_printf.h" #include "RPL.h" generic module RPLRoutingEngineP() { provides { interface RootControl; interface StdControl; interface RPLRoutingEngine as RPLRouteInfo; } uses { interface IP as IP_DIO; /* filtered DIO messages from the rank engine */ interface IP as IP_DIS; /* DIS messages from the ICMP driver */ interface Timer as TrickleTimer; interface Timer as InitDISTimer; interface Timer as IncreaseVersionTimer; interface Random; interface RPLRank as RPLRankInfo; interface IPAddress; interface Leds; interface StdControl as RankControl; interface RPLDAORoutingEngine; } } implementation{ #define RPL_GLOBALADDR /* Declare Global Variables */ uint32_t tricklePeriod; uint32_t randomTime; bool sentDIOFlag = FALSE; bool I_AM_ROOT = FALSE; bool I_AM_LEAF = FALSE; bool running = FALSE; bool hasDODAG = FALSE; bool riskHigh = FALSE; uint16_t node_rank = INFINITE_RANK; uint16_t LOWRANK = INFINITE_RANK; uint8_t GROUND_STATE = 1; uint8_t RPLInstanceID = 0; struct in6_addr DODAGID; uint8_t DODAGVersionNumber = 0; uint8_t MOP = RPL_MOP_Storing_No_Multicast; uint8_t DAG_PREF = 7; uint8_t redunCounter = 0xFF; uint8_t doubleCounter = 0; uint8_t DIOIntDouble = 10; uint8_t DIOIntMin = 8; uint8_t DIORedun = 0xFF; uint16_t MinHopRankInc = 1; uint16_t MaxRankInc = 3; uint8_t DTSN = 2; uint32_t countdio = 0; uint32_t countdis = 0; bool UNICAST_DIO = FALSE; struct in6_addr DEF_PREFIX; struct in6_addr ADDR_MY_IP; struct in6_addr ROOT_ADDR; struct in6_addr MULTICAST_ADDR; struct in6_addr UNICAST_DIO_ADDR; /* Define Functions and Tasks */ void resetTrickleTime(); void chooseAdvertiseTime(); void computeTrickleRemaining(); void nextTrickleTime(); void inconsistencyDetected(); void poison(); task void sendDIOTask(); task void sendDISTask(); task void init(); task void initDIO(); /* Start the routing with DIS message probing */ task void init() { #ifdef RPL_STORING_MODE MOP = RPL_MOP_Storing_No_Multicast; #else MOP = RPL_MOP_No_Storing; #endif #ifdef RPL_GLOBALADDR call IPAddress.getGlobalAddr(&ADDR_MY_IP); #else call IPAddress.getLLAddr(&ADDR_MY_IP); #endif ROOT_RANK = MinHopRankInc; /* SDH : FF02::2 -- link-local all-routers group? */ memset(MULTICAST_ADDR.s6_addr, 0, 16); MULTICAST_ADDR.s6_addr[0] = 0xFF; MULTICAST_ADDR.s6_addr[1] = 0x2; MULTICAST_ADDR.s6_addr[15] = 0x1A; if (I_AM_ROOT) { #ifdef RPL_GLOBALADDR call IPAddress.getGlobalAddr(&DODAGID); #else call IPAddress.getLLAddr(&DODAGID); #endif /* Global recovery every 60 mins */ //call IncreaseVersionTimer.startPeriodic(60*60*1024UL); post initDIO(); } else { call InitDISTimer.startPeriodic(DIS_INTERVAL); } } /* When finding a DODAG post initDIO()*/ task void initDIO() { if (I_AM_ROOT) { call RPLRouteInfo.resetTrickle(); } } task void computeRemaining() { computeTrickleRemaining(); } task void sendDIOTask() { struct ip6_packet pkt; struct ip_iovec v[1]; uint8_t data[60]; struct dio_base_t msg; struct dio_body_t body; struct dio_metric_header_t metric_header; struct dio_etx_t etx_value; struct dio_dodag_config_t dodag_config; uint16_t length; /* struct in6_addr next_hop; */ /* if ((call RPLRankInfo.nextHop(&DEF_PREFIX, &next_hop)) != SUCCESS) */ /* return; */ if ((!running) || (!hasDODAG) /* || ((redunCounter < DIORedun) && (DIORedun != 0xFF))*/ ) { // printf("RPL: NoTxDIO %d %d %d\n", redunCounter, DIORedun, hasDODAG); return; } //call RPLDAORoutingEngine.startDAO(); // call IPAddress.setSource(&pkt.ip6_hdr); msg.icmpv6.type = ICMP_TYPE_RPL_CONTROL; msg.icmpv6.code = ICMPV6_CODE_DIO; msg.icmpv6.checksum = 0; msg.flags = 0; msg.flags = GROUND_STATE << 7; msg.flags |= MOP << DIO_MOP_SHIFT; msg.flags |= DAG_PREF << 0; msg.version = DODAGVersionNumber; msg.instance_id.id = RPLInstanceID; msg.dtsn = DTSN; memcpy(&msg.dodagID, &DODAGID, sizeof(struct in6_addr)); if (I_AM_ROOT) { #ifdef RPL_GLOBALADDR call IPAddress.getGlobalAddr(&DODAGID); #else call IPAddress.getLLAddr(&DODAGID); #endif msg.dagRank = ROOT_RANK; } else { msg.dagRank = call RPLRankInfo.getRank(&ADDR_MY_IP); } if (!I_AM_LEAF) { dodag_config.type = RPL_DODAG_CONFIG_TYPE; dodag_config.length = 14; dodag_config.flags = 0; dodag_config.A = 0; // no auth dodag_config.PCS = 0; #ifdef RPL_OF_MRHOF dodag_config.ocp = 1; //MRHOF #else dodag_config.ocp = 0; //OF0 #endif dodag_config.default_lifetime = 0xFF;//6; // six dodag_config.lifetime_unit = 0xFFFF;//3600; // hours dodag_config.DIOIntDoubl = DIOIntDouble; dodag_config.DIOIntMin = DIOIntMin; dodag_config.DIORedun = DIORedun; dodag_config.MaxRankInc = MaxRankInc; dodag_config.MinHopRankInc = MinHopRankInc; dodag_config.reserved = 0; // For now just go with etx as the only metric etx_value.etx = call RPLRankInfo.getEtx(); metric_header.routing_obj_type = RPL_ROUTE_METRIC_ETX; // for etx metric_header.reserved = 0; metric_header.R_flag = 0; metric_header.G_flag = 1; metric_header.A_flag = 0; // aggregate additive! metric_header.O_flag = 0; metric_header.C_flag = 0; metric_header.object_len = 2; body.type = RPL_DODAG_METRIC_CONTAINER_TYPE; // metric container body.container_len = 6; { uint8_t *cur = (uint8_t *)&data; #define ADD_SECTION(SRC, LEN) ip_memcpy(cur, (uint8_t *)(SRC), LEN);\ cur += (LEN); #ifdef RPL_OF_MRHOF length = sizeof(struct dio_base_t) + sizeof(struct dio_body_t) + sizeof(struct dio_metric_header_t) + sizeof(struct dio_etx_t) + sizeof(struct dio_dodag_config_t); ADD_SECTION(&msg, sizeof(struct dio_base_t)); ADD_SECTION(&body, sizeof(struct dio_body_t)); ADD_SECTION(&metric_header, sizeof(struct dio_metric_header_t)); ADD_SECTION(&etx_value, sizeof(struct dio_etx_t)); ADD_SECTION(&dodag_config, sizeof(struct dio_dodag_config_t)); #else length = sizeof(struct dio_base_t) + sizeof(struct dio_dodag_config_t); ADD_SECTION(&msg, sizeof(struct dio_base_t)); ADD_SECTION(&dodag_config, sizeof(struct dio_dodag_config_t)); #endif #undef ADD_SECTION } // TODO: add prefix info (optional) v[0].iov_base = (uint8_t*)&data; v[0].iov_len = length; v[0].iov_next = NULL; pkt.ip6_hdr.ip6_nxt = IANA_ICMP; pkt.ip6_hdr.ip6_plen = htons(length); pkt.ip6_data = &v[0]; //iov_print(&v[0]); } else { length = sizeof(struct dio_base_t); pkt.ip6_hdr.ip6_nxt = IANA_ICMP; pkt.ip6_hdr.ip6_plen = htons(length); v[0].iov_base = (uint8_t *)&msg; v[0].iov_len = sizeof(struct dio_base_t); v[0].iov_next = NULL; pkt.ip6_data = &v[0]; } // printf("RPL: \n >>>>>> TxDIO etx %d %d %d %lu \n", // call RPLRankInfo.getEtx(), // ntohs(DODAGID.s6_addr16[7]), msg.dagRank, tricklePeriod); printf("RPL: TXDIO %d %lu \n", TOS_NODE_ID, ++countdio); // printf("RPL: RANK %d %d %d\n", // call RPLRankInfo.getRank(&ADDR_MY_IP), // call RPLRankInfo.getEtx(), // call RPLRankInfo.hasParent()); if (UNICAST_DIO) { UNICAST_DIO = FALSE; memcpy(&pkt.ip6_hdr.ip6_dst, &UNICAST_DIO_ADDR, 16); } else { memcpy(&pkt.ip6_hdr.ip6_dst, &MULTICAST_ADDR, 16); } call IPAddress.getLLAddr(&pkt.ip6_hdr.ip6_src); // call IPAddress.getGlobalAddr(&pkt.ip6_hdr.ip6_src); // memcpy(&pkt.ip6_hdr.ip6_src, &ADDR_MY_IP, 16); call IP_DIO.send(&pkt); } task void sendDISTask() { struct ip6_packet pkt; struct ip_iovec v[1]; struct dis_base_t msg; uint16_t length; if (!running) return; length = sizeof(struct dis_base_t); msg.icmpv6.type = ICMP_TYPE_RPL_CONTROL; msg.icmpv6.code = ICMPV6_CODE_DIS; msg.icmpv6.checksum = 0; // pkt.ip6_hdr.ip6_vfc = IPV6_VERSION; pkt.ip6_hdr.ip6_nxt = IANA_ICMP; pkt.ip6_hdr.ip6_plen = htons(length); v[0].iov_base = (uint8_t *)&msg; v[0].iov_len = sizeof(struct dis_base_t); v[0].iov_next = NULL; pkt.ip6_data = &v[0]; memcpy(&pkt.ip6_hdr.ip6_dst, &MULTICAST_ADDR, 16); call IPAddress.getLLAddr(&pkt.ip6_hdr.ip6_src); //call IPAddress.getGlobalAddr(&pkt.ip6_hdr.ip6_src); // printf("RPL: \n >>>>>> TxDIS\n"); // printf("RPL: >> sendDIS %d %lu \n", TOS_NODE_ID, ++countdis); call IP_DIS.send(&pkt); } uint16_t INCONSISTENCY_COUNT = 0; void inconsistencyDetected() { // when inconsistency detected, reset trickle INCONSISTENCY_COUNT ++; // inconsistency on my on node detected? call RPLRankInfo.inconsistencyDetected(/*&ADDR_MY_IP*/); /* JK: This reaction is TinyRPL specific -- to reduce the amount of DIO traffic -- helps when minmal leaf nodes exist */ call RPLRouteInfo.resetTrickle(); /* JK: Below is the Spec way of reacting to inconsistencies */ /* if (call RPLRankInfo.hasParent()) call RPLRouteInfo.resetTrickle(); else{ call TrickleTimer.stop(); call InitDISTimer.startPeriodic(1024); } */ } void poison() { node_rank = INFINITE_RANK; call RPLRouteInfo.resetTrickle(); } void resetTrickleTime() { call TrickleTimer.stop(); tricklePeriod = 2 << (DIOIntMin-1); redunCounter = 0; doubleCounter = 0; } void chooseAdvertiseTime() { if (!running) { return; } call TrickleTimer.stop(); randomTime = tricklePeriod; randomTime /= 2; randomTime += call Random.rand32() % randomTime; call TrickleTimer.startOneShot(randomTime); } void computeTrickleRemaining() { // start timer for the remainder time (TricklePeriod - randomTime) uint32_t remain; remain = tricklePeriod - randomTime; sentDIOFlag = TRUE; call TrickleTimer.startOneShot(remain); } void nextTrickleTime() { sentDIOFlag = FALSE; if (doubleCounter < DIOIntDouble) { doubleCounter ++; tricklePeriod *= 2; } if (!call TrickleTimer.isRunning()) chooseAdvertiseTime(); } /********************* RPLRouteInfo *********************/ command void RPLRouteInfo.inconsistency() { inconsistencyDetected(); } command bool RPLRouteInfo.hasDODAG() { return hasDODAG; } command uint8_t RPLRouteInfo.getMOP() { return MOP; } command error_t RPLRouteInfo.getDefaultRoute(struct in6_addr *next) { return call RPLRankInfo.getDefaultRoute(next); } command void RPLRouteInfo.setDODAGConfig(uint8_t IntDouble, uint8_t IntMin, uint8_t Redun, uint8_t RankInc, uint8_t HopRankInc) { DIOIntDouble = IntDouble; DIOIntMin = IntMin; DIORedun = Redun; MaxRankInc = RankInc; MinHopRankInc = HopRankInc; // printf("RPL: Config %d %d %d %d %d \n", // IntDouble, IntMin, Redun, RankInc, HopRankInc); } command struct in6_addr* RPLRouteInfo.getDodagId() { return &DODAGID; } command uint8_t RPLRouteInfo.getInstanceID() { return RPLInstanceID; } command bool RPLRouteInfo.validInstance(uint8_t instanceID) { return call RPLRankInfo.validInstance(instanceID); } command void RPLRouteInfo.resetTrickle() { resetTrickleTime(); if (!call TrickleTimer.isRunning()) chooseAdvertiseTime(); } command uint16_t RPLRouteInfo.getRank() { return call RPLRankInfo.getRank(&ADDR_MY_IP); } command void RPLRouteInfo.setDTSN(uint8_t dtsn) { DTSN = dtsn; } command uint8_t RPLRouteInfo.getDTSN() { return DTSN; } /********************* RootControl *********************/ command error_t RootControl.setRoot() { I_AM_ROOT = TRUE; hasDODAG = TRUE; call RPLRankInfo.declareRoot(); return SUCCESS; } command error_t RootControl.unsetRoot() { I_AM_ROOT = FALSE; hasDODAG = FALSE; call RPLRankInfo.cancelRoot(); return SUCCESS; } command bool RootControl.isRoot() { return I_AM_ROOT; } /********************* StdControl *********************/ command error_t StdControl.start() { // printf("RPL: STARTING\n"); if (!running) { post init(); call RankControl.start(); running = TRUE; } return SUCCESS; } command error_t StdControl.stop() { running = FALSE; call RankControl.stop(); call TrickleTimer.stop(); return SUCCESS; } event void InitDISTimer.fired() { post sendDISTask(); } event void IncreaseVersionTimer.fired() { // printf("RPL: >>>> Version Increase!! \n"); DODAGVersionNumber++; call RPLRouteInfo.resetTrickle(); } event void TrickleTimer.fired() { if (sentDIOFlag) { // DIO is already sent and trickle period has passed // increase tricklePeriod nextTrickleTime(); } else { // send DIO, randomly selected time has passed // compute the remaining time // Change back to DIO post sendDIOTask(); //post sendDISTask(); post computeRemaining(); } } bool compare_ip6_addr(struct in6_addr *node1, struct in6_addr *node2) { //done return !memcmp(node1, node2, sizeof(struct in6_addr)); } event void RPLRankInfo.parentRankChange() { // type 6 inconsistency inconsistencyDetected(); } /* SDH : * This is called to process new routing update messages, I think. */ event void IP_DIS.recv(struct ip6_hdr *iph, void *payload, size_t len, struct ip6_metadata *meta) { // printf("RPL: Receiving DIS %d\n", TOS_NODE_ID); if (!running) return; // I received a DIS if (I_AM_LEAF) { // I am a leaf so don't do anything return; } if (call IPAddress.isLocalAddress(&iph->ip6_dst)) { // This is a multicast message: reset Trickle if (iph->ip6_dst.s6_addr[0] == 0xff && ((iph->ip6_dst.s6_addr[1] & 0xf) <= 0x3)) { call RPLRouteInfo.resetTrickle(); } else { UNICAST_DIO = TRUE; memcpy(&UNICAST_DIO_ADDR, &(iph->ip6_src), sizeof(struct in6_addr)); post sendDIOTask(); } } } event void IP_DIO.recv(struct ip6_hdr *iph, void *payload, size_t len, struct ip6_metadata *meta) { struct dio_base_t *dio = (struct dio_base_t *)payload; if (!running) return; if (I_AM_ROOT) { return; } if (DIORedun != 0xFF) { redunCounter ++; } else { redunCounter = 0xFF; } /* JK: The if () statement below is TinyRPL specific and ties up with the inconsistencyDectect case above */ if (dio->dagRank == INFINITE_RANK) { if ((call RPLRankInfo.getRank(&ADDR_MY_IP) != INFINITE_RANK) && ((call InitDISTimer.getNow()%2) == 1)) { // send DIO if I can help! // printf("RPL: Infinite Rank RX %d\n", TOS_NODE_ID); post sendDIOTask(); } return; } if (call RPLRankInfo.hasParent() && call InitDISTimer.isRunning()) { call InitDISTimer.stop(); // no need for DIS messages anymore } // received DIO message I_AM_LEAF = call RPLRankInfo.isLeaf(); if ((I_AM_LEAF && !hasDODAG) || !compare_ip6_addr(&DODAGID,&dio->dodagID)) { // If I am leaf I do not send any DIO messages // assume that this DIO is from the DODAG with the // highest preference and is the preferred parent's DIO packet? // OR // If a new DODAGID is reported probably the Rank layer // already took care of all the operations and decided to switch to the // new DODAGID // printf("RPL: FOUND new dodag %d %d %d\n", // I_AM_LEAF, hasDODAG, compare_ip6_addr(&DODAGID,&dio->dodagID)); hasDODAG = TRUE; // assume that this DIO is from the DODAG with the // highest preference and is the preferred parent's DIO packet? goto accept_dodag; } if (RPLInstanceID == dio->instance_id.id && compare_ip6_addr(&DODAGID, &dio->dodagID) && DODAGVersionNumber != dio->version && hasDODAG) { // sequence number has changed - new iteration; restart the // trickle timer and configure DIO with new sequence number // printf("RPL: New iteration %d %d %d\n", // dio->instance_id.id, dio->version, I_AM_LEAF); DODAGVersionNumber = dio->version; call RPLRouteInfo.resetTrickle(); // type 3 inconsistency } else if (call RPLRankInfo.getRank(&ADDR_MY_IP) != node_rank && hasDODAG && node_rank != INFINITE_RANK) { /* inconsistency detected! because rank is not what I previously advertised */ // printf("RPL: ICD %d\n", node_rank); // DO I Still need this? if (call RPLRankInfo.getRank(&ADDR_MY_IP) > LOWRANK + MaxRankInc && node_rank != INFINITE_RANK) { hasDODAG = FALSE; node_rank = INFINITE_RANK; } else { if (LOWRANK > call RPLRankInfo.getRank(&ADDR_MY_IP)) { LOWRANK = call RPLRankInfo.getRank(&ADDR_MY_IP); } node_rank = call RPLRankInfo.getRank(&ADDR_MY_IP); } // type 2 inconsistency inconsistencyDetected(); return; } if (call RPLRankInfo.hasParent() && !hasDODAG) { goto accept_dodag; } else if (!call RPLRankInfo.hasParent() && !I_AM_ROOT) { /* this else if can lead to errors!! */ /* I have no parent at this point! */ // printf("RPL: noparent %d %d\n", node_rank, call RPLRankInfo.hasParent()); hasDODAG = FALSE; GROUND_STATE = dio->flags & DIO_GROUNDED_MASK; //GROUND_STATE = dio->flags.flags_element.grounded; call TrickleTimer.stop(); // new add call RPLRouteInfo.resetTrickle(); call RPLDAORoutingEngine.startDAO(); } return; accept_dodag: // printf("RPL: new dodag \n"); // assume that this DIO is from the DODAG with the // highest preference and is the preferred parent's DIO packet? hasDODAG = TRUE; MOP = (dio->flags & DIO_MOP_MASK) >> DIO_MOP_SHIFT; DAG_PREF = dio->flags & DIO_PREF_MASK; RPLInstanceID = dio->instance_id.id; memcpy(&DODAGID, &dio->dodagID, sizeof(struct in6_addr)); DODAGVersionNumber = dio->version; GROUND_STATE = dio->flags & DIO_GROUNDED_MASK; //GROUND_STATE = dio->flags.flags_element.grounded; call RPLRouteInfo.resetTrickle(); return; } event void IPAddress.changed(bool global_valid) {} } tinyos-2.1.2+dfsg/tos/lib/net/srp/000077500000000000000000000000001207233610700167265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/net/srp/SourceRouteEngine.h000066400000000000000000000034761207233610700225160ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SRCROUTEENGINE_H #define SRCROUTEENGINE_H //len == msg len including sr header. len is set to payload len + header on send, not altered during forwarding typedef struct { message_t* msg; uint8_t len; uint8_t client; } srf_queue_entry_t; #endif tinyos-2.1.2+dfsg/tos/lib/net/srp/SourceRouteEngineC.nc000066400000000000000000000055061207233610700227660ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Doug Carlson */ #include "SourceRouteEngine.h" generic configuration SourceRouteEngineC(am_id_t AMId) { provides { interface StdControl; interface SourceRouteSend[uint8_t client]; interface SourceRoutePacket; interface Receive[sourceroute_id_t id]; } uses { interface SourceRouteId[uint8_t client]; } } implementation { enum { CLIENT_COUNT = uniqueCount(UQ_SRP_CLIENT), FORWARD_COUNT = 12, QUEUE_SIZE = CLIENT_COUNT + FORWARD_COUNT, }; components MainC; components new AMSenderC(AMId) as SubSend; components new AMReceiverC(AMId) as SubReceive; components ActiveMessageC; components SourceRouteEngineP as Engine; components new QueueC(srf_queue_entry_t*, QUEUE_SIZE) as SendQueue; components new PoolC(srf_queue_entry_t, FORWARD_COUNT) as QEntryPool; components new PoolC(message_t, FORWARD_COUNT) as MessagePool; Engine.SubReceive -> SubReceive; Engine.SubSend -> SubSend; Engine.SubControl -> ActiveMessageC; Engine.SendQueue -> SendQueue; Engine.QEntryPool -> QEntryPool; Engine.MessagePool -> MessagePool; MainC.SoftwareInit -> Engine.Init; StdControl = Engine; SourceRouteSend = Engine; SourceRoutePacket = Engine; Receive = Engine; Engine.SourceRouteId = SourceRouteId; } tinyos-2.1.2+dfsg/tos/lib/net/srp/SourceRouteEngineP.nc000066400000000000000000000310411207233610700227740ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Doug Carlson */ #include "SourceRouteEngine.h" module SourceRouteEngineP { provides { interface StdControl; interface SourceRouteSend[uint8_t client]; interface SourceRoutePacket; interface Receive[sourceroute_id_t id]; interface Init; } uses { interface SourceRouteId[uint8_t client]; interface AMSend as SubSend; interface Receive as SubReceive; interface Queue as SendQueue; interface Pool as QEntryPool; interface Pool as MessagePool; interface SplitControl as SubControl; } } implementation { enum{ CLIENT_COUNT = uniqueCount(UQ_SRP_CLIENT), FORWARD_CLIENT = 0xff, }; //Forwarding engine states enum { S_OFF = 0, S_IDLE = 1, S_SENDING = 2, S_ERROR = 3, }; //client states enum{ SC_IDLE = 0, SC_SENDING = 1, }; //forwarding engine state var uint8_t state = S_OFF; uint8_t seqno; //client variables //static space for clients srf_queue_entry_t clientEntries[CLIENT_COUNT]; //client statuses uint8_t clientStatus[CLIENT_COUNT]; sr_header_t* getSRPHeader(message_t* msg); void printSRPHeader(sr_header_t* hdr) { dbg("SRPDebug", "header %p srlen %d hops_left %d seqno %d payload_id %d\n", hdr, hdr->sr_len, hdr->hops_left, hdr->seqno, hdr->payload_id); } void printQE(srf_queue_entry_t* qe) { dbg("SRPDebug", "QE: msg %p len %d client %d\n", qe->msg, qe->len, qe->client); } command error_t Init.init(){ uint8_t i; for (i=0; i < CLIENT_COUNT; i++) { clientEntries[i].client = i; } return SUCCESS; } void setState(uint8_t s) { if (state != S_ERROR) { dbg("SRPDebug", "setState %d -> %d\n", state, s); state = s; } else { dbg("SRPDebug", "setState Ignore %d -> %d\n", state, s); } } task void sendTask() { srf_queue_entry_t* qe; error_t err; dbg("SRPDebug", "sendTask\n"); if (state == S_IDLE) { dbg("SRPDebug", "state OK\n"); if (call SendQueue.size() == 0) { dbg("SRPDebug", "queue empty\n"); return; } else { dbg("SRPDebug", "queue not empty\n"); state = S_SENDING; qe = call SendQueue.head(); printQE(qe); dbg("SRPInfo", "Sending QE %p msg %p to %d. src %d dest %d seqno %d\n", qe, qe->msg, call SourceRoutePacket.getNextHop(qe->msg), (call SourceRoutePacket.getRoute(qe->msg))[0], call SourceRoutePacket.getDest(qe->msg), getSRPHeader(qe->msg)->seqno); err = call SubSend.send(call SourceRoutePacket.getNextHop(qe->msg), qe -> msg, qe->len); if ( err == SUCCESS ) { dbg("SRPDebug", "sendTask subsend OK\n"); } else { dbg("SRPError", "ERROR sendTask subsend failed\n"); //clean up from failed send. signal local clients or drop forwarding packets state = S_IDLE; if (qe->client != FORWARD_CLIENT) { clientStatus[qe->client] = SC_IDLE; signal SourceRouteSend.sendDone[qe->client](qe->msg, FAIL); } call SendQueue.dequeue(); } } } else { dbg("SRPDebug", "sendTask: skipping (in state %d)\n", state); } } /** * SourceRouteSend commands */ command error_t SourceRouteSend.send[uint8_t client](am_addr_t *path, uint8_t pathLen, message_t* msg, uint8_t len) { sr_header_t* hdr; //NOTE this is only here for the workaround required due to nx_am_addr v. am_addr in SourceRoutePacket nx_am_addr_t nxPath[SRP_MAX_PATHLEN]; uint8_t i; dbg("SRPDebug", "Send from %d %p\n", client, msg); if (state == S_OFF) { return EOFF; } //busy/fail if client is already sending or no space if (clientStatus[client] == SC_SENDING) { return EBUSY; } if ( call SendQueue.size() == call SendQueue.maxSize() ) { return FAIL; } //NOTE: setting route is unsafe with memcpy as-is (am_addr_t vs nx_am_addr_t) //would like to do: // call SourceRoutePacket.setRoute(msg, path, pathLen); //this is the workaround until SourceRoutePacket.setRoute signature changes for (i = 0; i < pathLen; i++) { nxPath[i] = path[i]; } call SourceRoutePacket.setRoute(msg, nxPath, pathLen); hdr = getSRPHeader(msg); hdr -> payload_id = call SourceRouteId.fetch[client](); hdr -> seqno = seqno++; //set hops_left to path length - 2 (NOTE e.g. one-hop path has S, D is of length 2. when a packet is received with hops_left = 0, it is at the destination) hdr -> hops_left = pathLen - 2; clientStatus[client] = SC_SENDING; if (call SendQueue.enqueue(&clientEntries[client]) == SUCCESS) { clientEntries[client].msg = msg; //NOTE: variable-length path will change this clientEntries[client].len = len + sizeof(sr_header_t); post sendTask(); printSRPHeader(hdr); return SUCCESS; } else { clientStatus[client] = SC_IDLE; return FAIL; } } command void* SourceRouteSend.getPayload[uint8_t client](message_t* msg, uint8_t len) { if (len > call SourceRouteSend.maxPayloadLength[client]()) { return NULL; } else { return call SubSend.getPayload(msg, len + sizeof(sr_header_t)) + sizeof(sr_header_t); } } command uint8_t SourceRouteSend.maxPayloadLength[uint8_t client]() { return call SubSend.maxPayloadLength() - sizeof(sr_header_t); } command error_t SourceRouteSend.cancel[uint8_t client](message_t* msg) { //TODO: SourceRouteSend.cancel: find msg in queue and remove it if possible return FAIL; } /** * SubSend */ event void SubSend.sendDone(message_t* msg, error_t err) { srf_queue_entry_t* qe; dbg("SRPDebug", "SubSend.sendDone %d %p\n",err, msg); if (state != S_SENDING) { dbg("SRPError", "ERROR bad state: %d\n", state); setState(S_ERROR); } else { state = S_IDLE; qe = call SendQueue.dequeue(); if (qe -> msg != msg ) { dbg("SRPError", "ERROR queue message != sent message %p != %p \n", msg, qe->msg); setState(S_ERROR); return; } if (! call SendQueue.empty()) { post sendTask(); } if (qe -> client == FORWARD_CLIENT) { dbg("SRPDebug", "Finished forwarding qe %p msg %p, put them back in pools\n", qe, msg); call MessagePool.put(msg); call QEntryPool.put(qe); } else { dbg("SRPDebug", "Finished sending for %d\n", qe->client); clientStatus[qe->client] = SC_IDLE; signal SourceRouteSend.sendDone[qe->client](msg, err); } } dbg("SRPInfo","After SendDone: state %d SendQueue len %d, QEPool size %d, MsgPool size %d\n", state, call SendQueue.size(), call QEntryPool.size(), call MessagePool.size()); } /** * SubReceive */ event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { sr_header_t* hdr; srf_queue_entry_t* qe; dbg("SRPDebug", "receive m %p p %p l %d\n", msg, payload, len); hdr = getSRPHeader(msg); printSRPHeader(hdr); //remove header/signal up if (hdr -> hops_left == 0) { return signal Receive.receive[hdr -> payload_id](msg, call SourceRouteSend.getPayload[0](msg, len - sizeof(sr_header_t)), len - sizeof(sr_header_t)); } else { dbg("SRPDebug", "forwarding %p\n", msg); if ( call SendQueue.size() < call SendQueue.maxSize() && ! call MessagePool.empty() && ! call QEntryPool.empty() ) { hdr-> hops_left--; qe = call QEntryPool.get(); qe -> client = FORWARD_CLIENT; qe -> len = len; qe -> msg = msg; call SendQueue.enqueue(qe); post sendTask(); return call MessagePool.get(); } else { dbg("SRPError", "ERROR queue full or message pool empty or queue entry pool empty\n"); return msg; } } } /** * SourceRoutePacket commands */ sr_header_t* getSRPHeader(message_t* msg) { sr_header_t* ret = (sr_header_t*)call SubSend.getPayload(msg, sizeof(sr_header_t)); return ret; } command error_t SourceRoutePacket.clearRoute(message_t *msg) { //NOTE that if the route goes in the footer or is variable-length, we can't safely overwrite the values in it (space might be used for payload). memset(getSRPHeader(msg)->route, 0, sizeof(nx_am_addr_t)*SRP_MAX_PATHLEN); getSRPHeader(msg)->sr_len = 0; return SUCCESS; } command error_t SourceRoutePacket.setRoute(message_t *msg, nx_am_addr_t *path, uint8_t len) { sr_header_t* hdr = getSRPHeader(msg); hdr -> sr_len = len; memcpy(hdr->route, path, len * sizeof(nx_am_addr_t)); return FAIL; } command nx_am_addr_t* SourceRoutePacket.getRoute(message_t *msg) { return getSRPHeader(msg) -> route; } command uint8_t SourceRoutePacket.getRouteLen(message_t *msg) { return getSRPHeader(msg) -> sr_len; } command error_t SourceRoutePacket.setRouteLen(message_t *msg, uint8_t len) { getSRPHeader(msg) -> sr_len = len; return SUCCESS; } //NOTE: The hops_left field is decremented when the packet is enqueued (i.e. at forward, not at sendTask) //NOTE: When a packet reaches the destination, hops_left is 0. //NOTE: So, getNextHop should return the destination addr when hops_left is 0. command am_addr_t SourceRoutePacket.getNextHop(message_t *msg) { sr_header_t* hdr = getSRPHeader(msg); return (call SourceRoutePacket.getRoute(msg))[hdr->sr_len - 1 - hdr->hops_left ]; } command am_addr_t SourceRoutePacket.getDest(message_t *msg) { sr_header_t* hdr = getSRPHeader(msg); return (call SourceRoutePacket.getRoute(msg))[hdr->sr_len - 1]; } command am_addr_t SourceRoutePacket.getSource(message_t *msg) { sr_header_t* hdr = getSRPHeader(msg); return (call SourceRoutePacket.getRoute(msg))[0]; } command uint8_t SourceRoutePacket.getHopsLeft(message_t *msg) { sr_header_t* hdr = getSRPHeader(msg); return hdr->hops_left ; } command error_t SourceRoutePacket.setHopsLeft(message_t *msg, uint8_t hopsLeft) { getSRPHeader(msg) -> hops_left = hopsLeft; return SUCCESS; } command uint8_t SourceRoutePacket.getSeqNo(message_t *msg) { return getSRPHeader(msg) -> seqno; } /** * StdControl commands. should it be splitcontrol? */ command error_t StdControl.start() { setState(S_IDLE); return SUCCESS; } command error_t StdControl.stop() { setState(S_OFF); return SUCCESS; } /** * SubControl events. */ event void SubControl.startDone(error_t error) { setState(S_IDLE); //OK to start forwarding. } event void SubControl.stopDone(error_t error) { setState(S_OFF); //stop forwarding: should tell clients that the radio is off? } /** * Defaults */ default event void SourceRouteSend.sendDone[uint8_t client](message_t *msg, error_t error) { } default event message_t * Receive.receive[sourceroute_id_t sourcerouteid](message_t *msg, void *payload, uint8_t len) { return msg; } default command sourceroute_id_t SourceRouteId.fetch[uint8_t client]() { return 0; } } tinyos-2.1.2+dfsg/tos/lib/net/srp/SourceRouteId.nc000066400000000000000000000032351207233610700220070ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Doug Carlson */ interface SourceRouteId { command sourceroute_id_t fetch(); } tinyos-2.1.2+dfsg/tos/lib/net/srp/SourceRouteIdP.nc000066400000000000000000000034341207233610700221300ustar00rootroot00000000000000/** * Copyright (c) 2010 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Doug Carlson */ generic module SourceRouteIdP(sourceroute_id_t id) { provides { interface SourceRouteId; } } implementation { command sourceroute_id_t SourceRouteId.fetch() { return id; } } tinyos-2.1.2+dfsg/tos/lib/net/srp/SourceRoutePacket.nc000066400000000000000000000047071207233610700226670ustar00rootroot00000000000000// $Id: LqiForwardingEngineP.nc,v 1.16 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2010 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Omprakash Gnawali */ /* applications use this interface to get/set metadata for source routing */ interface SourceRoutePacket { command error_t clearRoute(message_t *msg); //NOTE: mismatch with SourceRouteSend.send (nx_am_addr_t vs. am_addr_t) command error_t setRoute(message_t *msg, nx_am_addr_t *path, uint8_t len); command nx_am_addr_t* getRoute(message_t *msg); command uint8_t getRouteLen(message_t *msg); command error_t setRouteLen(message_t *msg, uint8_t len); command am_addr_t getNextHop(message_t *msg); command am_addr_t getDest(message_t *msg); command am_addr_t getSource(message_t *msg); command uint8_t getHopsLeft(message_t *msg); command error_t setHopsLeft(message_t *msg, uint8_t hopsLeft); command uint8_t getSeqNo(message_t *msg); } tinyos-2.1.2+dfsg/tos/lib/net/srp/SourceRouteReceiverC.nc000066400000000000000000000034471207233610700233270ustar00rootroot00000000000000/** * Copyright (c) 2010 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Doug Carlson */ generic configuration SourceRouteReceiverC(sourceroute_id_t srID) { provides { interface Receive; } } implementation { components SourceRoutingC; Receive = SourceRoutingC.Receive[srID]; } tinyos-2.1.2+dfsg/tos/lib/net/srp/SourceRouteSend.nc000066400000000000000000000041641207233610700223460ustar00rootroot00000000000000// $Id: LqiForwardingEngineP.nc,v 1.16 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2010 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Omprakash Gnawali */ /* applications use this interface to send packet using the interface */ #include "SourceRouting.h" interface SourceRouteSend { //TODO: Mismatch with SourceRoutePacket.getPath command error_t send(am_addr_t *path, uint8_t pathLen, message_t* msg, uint8_t len); command error_t cancel(message_t* msg); event void sendDone(message_t* msg, error_t error); command uint8_t maxPayloadLength(); command void* getPayload(message_t* msg, uint8_t len); } tinyos-2.1.2+dfsg/tos/lib/net/srp/SourceRouteSenderC.nc000066400000000000000000000040461207233610700227770ustar00rootroot00000000000000/** * Copyright (c) 2010 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Doug Carlson */ generic configuration SourceRouteSenderC(sourceroute_id_t srID) { provides { interface SourceRouteSend; interface SourceRoutePacket; } } implementation { enum { CLIENT_ID = unique(UQ_SRP_CLIENT), }; components SourceRoutingC; components new SourceRouteIdP(srID); SourceRoutingC.SourceRouteId[CLIENT_ID] -> SourceRouteIdP; SourceRouteSend = SourceRoutingC.SourceRouteSend[CLIENT_ID]; SourceRoutePacket = SourceRoutingC; } tinyos-2.1.2+dfsg/tos/lib/net/srp/SourceRouting.h000066400000000000000000000040501207233610700217060ustar00rootroot00000000000000/** * Copyright (c) 2010 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SOURCEROUTING_H #define SOURCEROUTING_H #include "AM.h" #include "message.h" #define UQ_SRP_CLIENT "SRP.client" enum { SRP_MAX_PATHLEN = 10, AM_SRP = 0x76, }; typedef uint8_t sourceroute_id_t; typedef nx_uint8_t nx_sourceroute_id_t; //TODO: for generic sub-layers, route should be a nx_uint8_t[] typedef nx_struct { nx_uint8_t sr_len; nx_uint8_t hops_left; nx_uint8_t seqno; nx_sourceroute_id_t payload_id; nx_am_addr_t route[SRP_MAX_PATHLEN]; } sr_header_t; #endif tinyos-2.1.2+dfsg/tos/lib/net/srp/SourceRoutingC.nc000066400000000000000000000042021207233610700221610ustar00rootroot00000000000000// $Id: LqiForwardingEngineP.nc,v 1.16 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2010 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Omprakash Gnawali */ configuration SourceRoutingC { provides { interface StdControl; interface SourceRouteSend[uint8_t client]; interface SourceRoutePacket; interface Receive[sourceroute_id_t id]; } uses { interface SourceRouteId[uint8_t client]; } } implementation{ components new SourceRouteEngineC(AM_SRP) as Engine; StdControl = Engine; SourceRouteSend = Engine; SourceRoutePacket = Engine; Receive = Engine; Engine.SourceRouteId = SourceRouteId; } tinyos-2.1.2+dfsg/tos/lib/power/000077500000000000000000000000001207233610700164705ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/power/AsyncDeferredPowerManagerP.nc000066400000000000000000000075641207233610700241740ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2010-06-29 22:07:50 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this component and its * intended use.

      * * This is the internal implementation of the deffered power management * policy for managing the power states of non-virtualized devices. * Non-virtualized devices are shared using a parameterized Resource * interface, and are powered down according to some policy whenever there * are no more pending requests to that Resource. The policy implemented * by this component is to delay the power down of a device by some contant * factor. Such a policy is useful whenever a device has a long wake-up * latency. The cost of waiting for the device to power up can be * avoided if the device is requested again before some predetermined * amount of time. * * @param delay -- The amount of time the power manager should wait * before shutting down the device once it is free. * * @author Kevin Klues (klueska@cs.wustl.edu) */ generic module AsyncDeferredPowerManagerP(uint32_t delay) { uses { interface AsyncStdControl; interface PowerDownCleanup; interface ResourceDefaultOwner; interface ArbiterInfo; interface Timer as TimerMilli; } } implementation { norace bool stopTimer = FALSE; task void stopTimerTask() { call TimerMilli.stop(); stopTimer = FALSE; } task void timerTask() { if(stopTimer == FALSE) call TimerMilli.startOneShot(delay); } async event void ResourceDefaultOwner.requested() { stopTimer = TRUE; post stopTimerTask(); call AsyncStdControl.start(); call ResourceDefaultOwner.release(); } async event void ResourceDefaultOwner.immediateRequested() { stopTimer = TRUE; post stopTimerTask(); call AsyncStdControl.start(); call ResourceDefaultOwner.release(); } async event void ResourceDefaultOwner.granted() { post timerTask(); } event void TimerMilli.fired() { if(stopTimer == FALSE) { call PowerDownCleanup.cleanup(); call AsyncStdControl.stop(); } } default async command void PowerDownCleanup.cleanup() { } } tinyos-2.1.2+dfsg/tos/lib/power/AsyncPowerManagerP.nc000066400000000000000000000063541207233610700225270ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.7 $ * $Date: 2010-06-29 22:07:50 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this component and its * intended use.

      * * This is the internal implementation of the standard power management * policy for managing the power states of non-virtualized devices. * Non-virtualized devices are shared using a parameterized Resource * interface, and are powered down according to some policy whenever there * are no more pending requests to that Resource. The policy implemented * by this component is to power down a device as soon as it becomes free. * Such a policy is useful whenever a device has a negligible wake-up * latency. There is no cost associated with waiting for the device to * power up, so it can be powered on and off as often as possible. * * @author Kevin Klues (klueska@cs.wustl.edu) */ generic module AsyncPowerManagerP() @safe() { uses { interface AsyncStdControl; interface PowerDownCleanup; interface ResourceDefaultOwner; interface ArbiterInfo; } } implementation { async event void ResourceDefaultOwner.requested() { call AsyncStdControl.start(); call ResourceDefaultOwner.release(); } async event void ResourceDefaultOwner.immediateRequested() { call AsyncStdControl.start(); call ResourceDefaultOwner.release(); } async event void ResourceDefaultOwner.granted() { call PowerDownCleanup.cleanup(); call AsyncStdControl.stop(); } default async command void PowerDownCleanup.cleanup() { } } tinyos-2.1.2+dfsg/tos/lib/power/AsyncStdControlDeferredPowerManagerC.nc000066400000000000000000000073651207233610700261720ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2010-06-29 22:07:50 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this component and its * intended use.

      * * This component povides a power management policy for managing the power * states of non-virtualized devices. Non-virtualized devices are shared * using a parameterized Resource interface, and are powered down according * to some policy whenever there are no more pending requests to that Resource. * The policy implemented by this component is to delay the power down of a * device by some contant factor. Such a policy is useful whenever a device * has a long wake-up latency. The cost of waiting for the device to power * up can be avoided if the device is requested again before some predetermined * amount of time.

      * * Powerdown of the device is done through the AsyncStdControl * interface, so this component can only be used with those devices that * provide that interface.

      * * For devices providing either the StdControl or * SplitControl interfaces, please use either the * StdControlDeferredPowerManagerC component or the * SplitControlDeferredPowerManagerC component respectively. * * @param delay -- The amount of time the power manager should wait * before shutting down the device once it is free. * * @author Kevin Klues (klueska@cs.wustl.edu) */ generic configuration AsyncStdControlDeferredPowerManagerC(uint32_t delay) { uses { interface AsyncStdControl; interface PowerDownCleanup; interface ResourceDefaultOwner; interface ArbiterInfo; } } implementation { components new TimerMilliC(), new AsyncDeferredPowerManagerP(delay) as PowerManager; PowerManager.AsyncStdControl = AsyncStdControl; PowerManager.PowerDownCleanup = PowerDownCleanup; PowerManager.ResourceDefaultOwner = ResourceDefaultOwner; PowerManager.ArbiterInfo = ArbiterInfo; PowerManager.TimerMilli -> TimerMilliC; } tinyos-2.1.2+dfsg/tos/lib/power/AsyncStdControlPowerManagerC.nc000066400000000000000000000067501207233610700245260ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2010-06-29 22:07:50 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this component and its * intended use.

      * * This is the internal implementation of the standard power management * policy for managing the power states of non-virtualized devices. * Non-virtualized devices are shared using a parameterized Resource * interface, and are powered down according to some policy whenever there * are no more pending requests to that Resource. The policy implemented * by this component is to power down a device as soon as it becomes free. * Such a policy is useful whenever a device has a negligible wake-up * latency. There is no cost associated with waiting for the device to * power up, so it can be powered on and off as often as possible.

      * * Powerdown of the device is done through the AsyncStdControl * interface, so this component can only be used with those devices that * provide that interface.

      * * For devices providing either the StdControl or * SplitControl interfaces, please use either the * StdControlPowerManagerC component or the * SplitControlPowerManagerC component respectively. * * @author Kevin Klues (klueska@cs.wustl.edu) */ generic configuration AsyncStdControlPowerManagerC() { uses { interface AsyncStdControl; interface PowerDownCleanup; interface ResourceDefaultOwner; interface ArbiterInfo; } } implementation { components new AsyncPowerManagerP() as PowerManager; PowerManager.AsyncStdControl = AsyncStdControl; PowerManager.PowerDownCleanup = PowerDownCleanup; PowerManager.ResourceDefaultOwner = ResourceDefaultOwner; PowerManager.ArbiterInfo = ArbiterInfo; } tinyos-2.1.2+dfsg/tos/lib/power/DeferredPowerManagerP.nc000066400000000000000000000113341207233610700231640ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.7 $ * $Date: 2010-06-29 22:07:50 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this component and its * intended use.

      * * This is the internal implementation of the deffered power management * policy for managing the power states of non-virtualized devices. * Non-virtualized devices are shared using a parameterized Resource * interface, and are powered down according to some policy whenever there * are no more pending requests to that Resource. The policy implemented * by this component is to delay the power down of a device by some contant * factor. Such a policy is useful whenever a device has a long wake-up * latency. The cost of waiting for the device to power up can be * avoided if the device is requested again before some predetermined * amount of time. * * @param delay -- The amount of time the power manager should wait * before shutting down the device once it is free. * * @author Kevin Klues (klueska@cs.wustl.edu) */ generic module DeferredPowerManagerP(uint32_t delay) { uses { interface StdControl; interface SplitControl; interface PowerDownCleanup; interface ResourceDefaultOwner; interface ArbiterInfo; interface Timer as TimerMilli; } } implementation { norace bool stopping = FALSE; norace bool requested = FALSE; norace bool stopTimer = FALSE; task void startTask() { call TimerMilli.stop(); stopTimer = FALSE; call StdControl.start(); if (call SplitControl.start()==EALREADY) call ResourceDefaultOwner.release(); } task void timerTask() { call TimerMilli.startOneShot(delay); } async event void ResourceDefaultOwner.requested() { if(stopping == FALSE) { stopTimer = TRUE; post startTask(); } else requested = TRUE; } async event void ResourceDefaultOwner.immediateRequested() { } default command error_t StdControl.start() { return SUCCESS; } default command error_t SplitControl.start() { signal SplitControl.startDone(SUCCESS); return SUCCESS; } event void SplitControl.startDone(error_t error) { call ResourceDefaultOwner.release(); } async event void ResourceDefaultOwner.granted() { post timerTask(); } event void TimerMilli.fired() { atomic { if(stopTimer == FALSE) { stopping = TRUE; call PowerDownCleanup.cleanup(); call StdControl.stop(); if (call SplitControl.stop()==EALREADY) signal SplitControl.stopDone(SUCCESS); } } } event void SplitControl.stopDone(error_t error) { if(requested == TRUE) { call StdControl.start(); call SplitControl.start(); } atomic { requested = FALSE; stopping = FALSE; } } default command error_t StdControl.stop() { return SUCCESS; } default command error_t SplitControl.stop() { signal SplitControl.stopDone(SUCCESS); return SUCCESS; } default async command void PowerDownCleanup.cleanup() { } } tinyos-2.1.2+dfsg/tos/lib/power/InfiniteRetryPowerManagerP.nc000066400000000000000000000106711207233610700242420ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.2 $ * $Date: 2010-06-29 22:07:50 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this component and its * intended use.

      * * This is the internal implementation of the standard power management * policy for managing the power states of non-virtualized devices. * Non-virtualized devices are shared using a parameterized Resource * interface, and are powered down according to some policy whenever there * are no more pending requests to that Resource. The policy implemented * by this component is to power down a device as soon as it becomes free. * Such a policy is useful whenever a device has a negligible wake-up * latency. There is no cost associated with waiting for the device to * power up, so it can be powered on and off as often as possible. * * @author Kevin Klues (klueska@cs.wustl.edu) */ generic module PowerManagerP() { uses { interface StdControl; interface SplitControl; interface PowerDownCleanup; interface ResourceDefaultOwner; interface ArbiterInfo; } } implementation { norace bool stopping = FALSE; norace bool requested = FALSE; task void startTask() { if(call StdControl.start() == SUCCESS) if(call SplitControl.start() == SUCCESS) return; post startTask(); } task void stopTask() { if(call StdControl.stop() == SUCCESS) if(call SplitControl.stop() == SUCCESS) return; post startTask(); } async event void ResourceDefaultOwner.requested() { if(stopping == FALSE) { post startTask(); } else requested = TRUE; } async event void ResourceDefaultOwner.immediateRequested() { } default command error_t StdControl.start() { return SUCCESS; } default command error_t SplitControl.start() { signal SplitControl.startDone(SUCCESS); return SUCCESS; } event void SplitControl.startDone(error_t error) { if(error != SUCCESS) { post startTask(); return; } if(call ResourceDefaultOwner.isOwner()) call ResourceDefaultOwner.release(); } async event void ResourceDefaultOwner.granted() { atomic stopping = TRUE; call PowerDownCleanup.cleanup(); post stopTask(); } event void SplitControl.stopDone(error_t error) { if(error != SUCCESS) { post stopTask(); return; } if(requested == TRUE) { call StdControl.start(); call SplitControl.start(); } atomic { requested = FALSE; stopping = FALSE; } } default command error_t StdControl.stop() { return SUCCESS; } default command error_t SplitControl.stop() { signal SplitControl.stopDone(SUCCESS); return SUCCESS; } default async command void PowerDownCleanup.cleanup() { } } tinyos-2.1.2+dfsg/tos/lib/power/PowerDownCleanup.nc000066400000000000000000000051311207233610700222460ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2010-06-29 22:07:50 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this interface and its * intended use.

      * * This interface exists to allow a Resource user to cleanup any state * information before a shared Resource is shutdown. It should be provided * by the user of a shared Resource, and used by the * power managment component for that Resource. The cleanup() * command will be called by the power manager just before powering down * the shared resource. * * @author Kevin Klues (klueska@cs.wustl.edu) */ interface PowerDownCleanup { /** * This command will be called by the power management component of * a shared Resource. The implementation of this command defines * what must be done just before that shared Resource is shut off. * */ async command void cleanup(); } tinyos-2.1.2+dfsg/tos/lib/power/PowerManagerP.nc000066400000000000000000000102501207233610700215170ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.7 $ * $Date: 2010-06-29 22:07:50 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this component and its * intended use.

      * * This is the internal implementation of the standard power management * policy for managing the power states of non-virtualized devices. * Non-virtualized devices are shared using a parameterized Resource * interface, and are powered down according to some policy whenever there * are no more pending requests to that Resource. The policy implemented * by this component is to power down a device as soon as it becomes free. * Such a policy is useful whenever a device has a negligible wake-up * latency. There is no cost associated with waiting for the device to * power up, so it can be powered on and off as often as possible. * * @author Kevin Klues (klueska@cs.wustl.edu) */ generic module PowerManagerP() { uses { interface StdControl; interface SplitControl; interface PowerDownCleanup; interface ResourceDefaultOwner; interface ArbiterInfo; } } implementation { norace bool stopping = FALSE; norace bool requested = FALSE; task void startTask() { call StdControl.start(); call SplitControl.start(); } task void stopTask() { call PowerDownCleanup.cleanup(); call StdControl.stop(); call SplitControl.stop(); } async event void ResourceDefaultOwner.requested() { if(stopping == FALSE) { post startTask(); } else requested = TRUE; } async event void ResourceDefaultOwner.immediateRequested() { } default command error_t StdControl.start() { return SUCCESS; } default command error_t SplitControl.start() { signal SplitControl.startDone(SUCCESS); return SUCCESS; } event void SplitControl.startDone(error_t error) { if(call ResourceDefaultOwner.isOwner()) call ResourceDefaultOwner.release(); } async event void ResourceDefaultOwner.granted() { atomic stopping = TRUE; post stopTask(); } event void SplitControl.stopDone(error_t error) { if(requested == TRUE) { call StdControl.start(); call SplitControl.start(); } atomic { requested = FALSE; stopping = FALSE; } } default command error_t StdControl.stop() { return SUCCESS; } default command error_t SplitControl.stop() { signal SplitControl.stopDone(SUCCESS); return SUCCESS; } default async command void PowerDownCleanup.cleanup() { } } tinyos-2.1.2+dfsg/tos/lib/power/SplitControlDeferredPowerManagerC.nc000066400000000000000000000073501207233610700255270ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2010-06-29 22:07:50 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this component and its * intended use.

      * * This component povides a power management policy for managing the power * states of non-virtualized devices. Non-virtualized devices are shared * using a parameterized Resource interface, and are powered down according * to some policy whenever there are no more pending requests to that Resource. * The policy implemented by this component is to delay the power down of a * device by some contant factor. Such a policy is useful whenever a device * has a long wake-up latency. The cost of waiting for the device to power * up can be avoided if the device is requested again before some predetermined * amount of time.

      * * Powerdown of the device is done through the SplitControl * interface, so this component can only be used with those devices that * provide that interface.

      * * For devices providing either the AsyncStdControl or * StdControl interfaces, please use either the * AsyncStdControlDeferredPowerManagerC component or the * StdControlDeferredPowerManagerC component respectively. * * @param delay -- The amount of time the power manager should wait * before shutting down the device once it is free. * * @author Kevin Klues (klueska@cs.wustl.edu) */ generic configuration SplitControlDeferredPowerManagerC(uint32_t delay) { uses { interface SplitControl; interface PowerDownCleanup; interface ResourceDefaultOwner; interface ArbiterInfo; } } implementation { components new TimerMilliC(), new DeferredPowerManagerP(delay) as PowerManager; PowerManager.SplitControl = SplitControl; PowerManager.PowerDownCleanup = PowerDownCleanup; PowerManager.ResourceDefaultOwner = ResourceDefaultOwner; PowerManager.ArbiterInfo = ArbiterInfo; PowerManager.TimerMilli -> TimerMilliC; } tinyos-2.1.2+dfsg/tos/lib/power/SplitControlPowerManagerC.nc000066400000000000000000000067221207233610700240700ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2010-06-29 22:07:50 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this component and its * intended use.

      * * This component povides a power management policy for managing the power * states of non-virtualized devices. Non-virtualized devices are shared * using a parameterized Resource interface, and are powered down according * to some policy whenever there are no more pending requests to that Resource. * The policy implemented by this component is to delay the power down of a * device by some contant factor. Such a policy is useful whenever a device * has a long wake-up latency. The cost of waiting for the device to power * up can be avoided if the device is requested again before some predetermined * amount of time.

      * * Powerdown of the device is done through the SplitControl * interface, so this component can only be used with those devices that * provide that interface.

      * * For devices providing either the AsyncStdControl or * StdControl interfaces, please use either the * AsyncStdControlPowerManagerC component or the * StdControlPowerManagerC component respectively. * * @author Kevin Klues (klueska@cs.wustl.edu) */ generic configuration SplitControlPowerManagerC() { uses { interface SplitControl; interface PowerDownCleanup; interface ResourceDefaultOwner; interface ArbiterInfo; } } implementation { components new PowerManagerP() as PowerManager; PowerManager.SplitControl = SplitControl; PowerManager.PowerDownCleanup = PowerDownCleanup; PowerManager.ResourceDefaultOwner = ResourceDefaultOwner; PowerManager.ArbiterInfo = ArbiterInfo; } tinyos-2.1.2+dfsg/tos/lib/power/StdControlDeferredPowerManagerC.nc000066400000000000000000000073421207233610700251670ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2010-06-29 22:07:50 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this component and its * intended use.

      * * This component povides a power management policy for managing the power * states of non-virtualized devices. Non-virtualized devices are shared * using a parameterized Resource interface, and are powered down according * to some policy whenever there are no more pending requests to that Resource. * The policy implemented by this component is to delay the power down of a * device by some contant factor. Such a policy is useful whenever a device * has a long wake-up latency. The cost of waiting for the device to power * up can be avoided if the device is requested again before some predetermined * amount of time.

      * * Powerdown of the device is done through the StdControl * interface, so this component can only be used with those devices that * provide that interface.

      * * For devices providing either the AsyncStdControl or * SplitControl interfaces, please use either the * AsyncStdControlDeferredPowerManagerC component or the * SplitControlDeferredPowerManagerC component respectively. * * @param delay -- The amount of time the power manager should wait * before shutting down the device once it is free. * * @author Kevin Klues (klueska@cs.wustl.edu) */ generic configuration StdControlDeferredPowerManagerC(uint32_t delay) { uses { interface StdControl; interface PowerDownCleanup; interface ResourceDefaultOwner; interface ArbiterInfo; } } implementation { components new TimerMilliC(), new DeferredPowerManagerP(delay) as PowerManager; PowerManager.StdControl = StdControl; PowerManager.PowerDownCleanup = PowerDownCleanup; PowerManager.ResourceDefaultOwner = ResourceDefaultOwner; PowerManager.ArbiterInfo = ArbiterInfo; PowerManager.TimerMilli -> TimerMilliC; } tinyos-2.1.2+dfsg/tos/lib/power/StdControlPowerManagerC.nc000066400000000000000000000067121207233610700235260ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2010-06-29 22:07:50 $ * ======================================================================== */ /** * Please refer to TEP 115 for more information about this component and its * intended use.

      * * This component povides a power management policy for managing the power * states of non-virtualized devices. Non-virtualized devices are shared * using a parameterized Resource interface, and are powered down according * to some policy whenever there are no more pending requests to that Resource. * The policy implemented by this component is to delay the power down of a * device by some contant factor. Such a policy is useful whenever a device * has a long wake-up latency. The cost of waiting for the device to power * up can be avoided if the device is requested again before some predetermined * amount of time.

      * * Powerdown of the device is done through the StdControl * interface, so this component can only be used with those devices that * provide that interface.

      * * For devices providing either the AsyncStdControl or * SplitControl interfaces, please use either the * AsyncStdControPowerManagerC component or the * SplitControlPowerManagerC component respectively. * * @author Kevin Klues (klueska@cs.wustl.edu) */ generic configuration StdControlPowerManagerC() { uses { interface StdControl; interface PowerDownCleanup; interface ResourceDefaultOwner; interface ArbiterInfo; } } implementation { components new PowerManagerP() as PowerManager; PowerManager.StdControl = StdControl; PowerManager.PowerDownCleanup = PowerDownCleanup; PowerManager.ResourceDefaultOwner = ResourceDefaultOwner; PowerManager.ArbiterInfo = ArbiterInfo; } tinyos-2.1.2+dfsg/tos/lib/ppp/000077500000000000000000000000001207233610700161335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/ppp/DebugDefaultHdlcUart.nc000066400000000000000000000042301207233610700224360ustar00rootroot00000000000000/* Copyright (c) 2011 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Whitebox interface for inspection of DefaultHdlcUart in unit tests. * * Enable with _DDEBUG_PLATFORM_SERIAL_HDLC_UART. * * @author Peter A. Bigot */ interface DebugDefaultHdlcUart { /** @return the length of the ring buffer in bytes */ async command unsigned int ringBufferLength (); /** @return the address of the ring buffer */ async command uint8_t* ringBuffer (); /** @return the value of the ringbuffer store pointer */ async command uint8_t* rbStore (); /** @return the value of the ringbuffer load pointer */ async command uint8_t* rbLoad (); } tinyos-2.1.2+dfsg/tos/lib/ppp/DebugHdlcFraming.nc000066400000000000000000000044641207233610700216120ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "HdlcFraming_.h" /** Whitebox interface for inspection of HdlcFraming in unit tests. * * Enable with -DDEBUG_HDLC_FRAMING at build time. * * @author Peter A. Bigot */ interface DebugHdlcFraming { /** @return an RXState_e value indicating the current receive frame * automaton state. */ async command unsigned int rxState (); /** @return a TXState_e value indicating the current transmit engine * state */ async command unsigned int txState (); /** @return the number of HDLC frames that can be received until * data will be dropped. */ async command unsigned int numRxFrames (); /** @return a pointer to the data for HDLC frames in reception */ async command const HdlcRxFrame_t* rxFrames (); } tinyos-2.1.2+dfsg/tos/lib/ppp/DefaultHdlcUartC.nc000066400000000000000000000044251207233610700216000ustar00rootroot00000000000000/* Copyright (c) 2011 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Component that uses PlatformSerialC to provide an HdlcUart * interface. * * @author Peter A. Bigot */ configuration DefaultHdlcUartC { provides { interface StdControl; interface HdlcUart; #if DEBUG_PLATFORM_SERIAL_HDLC_UART interface DebugDefaultHdlcUart; #endif /* DEBUG_PLATFORM_SERIAL_HDLC_UART */ } } implementation { components PlatformSerialC; components DefaultHdlcUartP; StdControl = DefaultHdlcUartP; HdlcUart = DefaultHdlcUartP; #if DEBUG_PLATFORM_SERIAL_HDLC_UART DebugDefaultHdlcUart = DefaultHdlcUartP; #endif /* DEBUG_PLATFORM_SERIAL_HDLC_UART */ DefaultHdlcUartP.SerialControl -> PlatformSerialC; DefaultHdlcUartP.UartStream -> PlatformSerialC; } tinyos-2.1.2+dfsg/tos/lib/ppp/DefaultHdlcUartP.nc000066400000000000000000000173431207233610700216200ustar00rootroot00000000000000/* Copyright (c) 2011 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ module DefaultHdlcUartP { provides { interface StdControl; interface HdlcUart; #if DEBUG_PLATFORM_SERIAL_HDLC_UART interface DebugDefaultHdlcUart; #endif /* DEBUG_PLATFORM_SERIAL_HDLC_UART */ } uses { interface StdControl as SerialControl; interface UartStream; #if PLATFORM_SURF interface Msp430UsciError; #endif } } implementation { #ifndef PLATFORM_SERIAL_RX_BUFFER_SIZE /** Number of bytes in the ring buffer of received but unprocessed * characters. */ #define PLATFORM_SERIAL_RX_BUFFER_SIZE 256 #endif /* PLATFORM_SERIAL_RX_BUFFER_SIZE */ /** Circular buffer holding received data not yet processed. * * To simplify management, the buffer is considered empty if the * rbStore_ and rbLoad_ pointers are equal. * * If reception of a character increments rbStore_ to be equal to * rbLoad_, a buffer overflow is assumed, and incoming data is * dropped until the feeder task catches up. */ uint8_t ringBuffer[PLATFORM_SERIAL_RX_BUFFER_SIZE]; /** Pointer to the ring buffer slot into which the next received * character will be written. * * When rbStore_ is null reception is administratively disabled. */ uint8_t *rbStore_; /** Pointer to the ring buffer slot containing oldest received * character not yet processed. * * The slot indicated by rbLoad_ contains an unprocessed character * only when the rbLoad_ pointer is non-null and unequal to * rbStore_. * * When rbLoad_ is null reception has been disabled due to ring * buffer overrun or an underlying UART error. Such errors inhibit * further reception, and are sticky until the streamFeeder task * clears them. */ uint8_t *rbLoad_; #if DEBUG_PLATFORM_SERIAL_HDLC_UART async command unsigned int DebugDefaultHdlcUart.ringBufferLength () { return sizeof(ringBuffer); } async command uint8_t* DebugDefaultHdlcUart.ringBuffer () { return ringBuffer; } async command uint8_t* DebugDefaultHdlcUart.rbStore () { atomic return rbStore_; } async command uint8_t* DebugDefaultHdlcUart.rbLoad () { atomic return rbLoad_; } #endif /* DEBUG_PLATFORM_SERIAL_HDLC_UART */ command error_t StdControl.start () { /* Ignore the return value; if SerialPrintfC is active, it might * fail but things are still good. */ (void)call SerialControl.start(); atomic rbStore_ = rbLoad_ = ringBuffer; return SUCCESS; } command error_t StdControl.stop () { atomic rbStore_ = rbLoad_ = 0; return call SerialControl.stop(); } command error_t HdlcUart.send (uint8_t* buf, uint16_t len) { return call UartStream.send(buf, len); } async event void UartStream.sendDone( uint8_t* buf, uint16_t len, error_t error ) { signal HdlcUart.sendDone(error); } task void streamFeeder_task () { uint8_t* loadable_endp; uint8_t* loadablep = 0; uint8_t* new_load = 0; bool signal_recovery = FALSE; atomic { if (! rbStore_) { /* Infrastructure disabled */ return; } if (! rbLoad_) { /* Buffer overrun or UART error. Throw away anything we * haven't processed and signal recovery. */ signal_recovery = TRUE; rbLoad_ = rbStore_; } else { /* Might have something. Grab whatever contiguous region of * unprocessed characters is available. Cache where we * stopped, to use to update rbLoad_ after we're done * processing. * * @TODO: Consider putting an upper bound on the number of * characters processed, to let the HDLC infrastructure post * other tasks that might relieve frame buffer memory * pressure. */ loadablep = rbLoad_; if (rbLoad_ <= rbStore_) { loadable_endp = rbStore_; new_load = rbStore_; } else { loadable_endp = ringBuffer + sizeof(ringBuffer); new_load = ringBuffer; } } } /* atomic */ if (loadablep && (loadablep < loadable_endp)) { /* There's characters to be processed, but we might not have * grabbed them all. Post the task again so any leftovers can * be processed. */ post streamFeeder_task(); /* Notify of each received character, in order */ while (loadablep < loadable_endp) { signal HdlcUart.receivedByte(*loadablep++); } atomic { /* Consume the characters we've just processed, unless the * ring buffer overran while we were working, in which case * keep the error marker and we'll resync on the next * invocation. */ if (rbLoad_) { rbLoad_ = new_load; } } } if (signal_recovery) { signal HdlcUart.uartError(SUCCESS); } } async event void UartStream.receivedByte (uint8_t rx_byte) { bool wake_feeder; bool signal_drop; atomic { /* Signal loss of data if we were supposed to store data but * couldn't because of an existing or new overflow or error * condition. (Here assume we'll fail to store; we'll clear the * signal if we do store the data.) * * Wake the feeder if we're supposed to store data. If we do * store, it'll have work to do; if we don't, there's an error * condition it needs to clean up. */ wake_feeder = signal_drop = !!rbStore_; if (rbStore_ && rbLoad_) { uint8_t* rb_dest = rbStore_; if (++rbStore_ >= (ringBuffer + sizeof(ringBuffer))) { rbStore_ = ringBuffer; } if (rbStore_ == rbLoad_) { /* Store would cause an overrun. Leave the old value in * place, in case it's being processed, but mark an * error. */ rbLoad_ = 0; } else { /* Store is valid. Do so, and clear the drop signal. */ *rb_dest = rx_byte; signal_drop = FALSE; } } } if (wake_feeder) { post streamFeeder_task(); } if (signal_drop) { signal HdlcUart.uartError(ENOMEM); } } async event void UartStream.receiveDone( uint8_t* buf, uint16_t len, error_t error ) { } #if PLATFORM_SURF async event void Msp430UsciError.condition (unsigned int errors) { /* On any underlying UART error, mark the error to inhibit * reception until we can do cleanup, notify the consumer, and * wake the stream feeder task to recover. */ atomic { rbLoad_ = 0; } signal HdlcUart.uartError(FAIL); post streamFeeder_task(); } #endif default async event void HdlcUart.uartError (error_t error) { } } tinyos-2.1.2+dfsg/tos/lib/ppp/GetSetOptions.nc000066400000000000000000000042331207233610700212260ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Interface to help with configuring the options associated with a * component. Rather like the GetSet interface, but slightly * different to handle options expressed as a structure. * * @author Peter A. Bigot */ interface GetSetOptions { /** Configure a subsystem. * * @param options The proposed options * @return SUCCESS if options are acceptable; EINVAL otherwise. */ command error_t set (const type_t* options); /** Get the current option configuration. * * @return A copy of the currently configured options. */ command type_t get (); } tinyos-2.1.2+dfsg/tos/lib/ppp/HdlcFraming.h000066400000000000000000000074201207233610700204650ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef PPP_HDLC_FRAMING_H #define PPP_HDLC_FRAMING_H /** Structure defining options that control HDLC framing. * * @note Implementation of the ACCM capability is not optional. The * initial value defined in RFC1661 is to escape all control * characters less than 0x20. During link negotiation, these * characters must be escaped or the peer is required to drop them, * which will result in FCS failure. */ typedef struct HdlcFramingOptions_t { /** If TRUE, the address and control field bytes are suppressed on * outgoing frames. */ bool txSuppressAddressControl; /** If TRUE, the address and control field bytes are expected to * be absent from incoming frames. */ bool rxSuppressAddressControl; /** Bit mask denoting those ASCII control characters that must be * escaped prior to transmission to the peer. */ uint32_t txAsyncControlCharacterMap; /** Bit mask denoting those ASCII control characters that the peer * will escape prior to transmission. Receipt of an unescaped * character in this set indicates a transmission error. */ uint32_t rxAsyncControlCharacterMap; } HdlcFramingOptions_t; /** Codes indicating the cause of an HDLC-level error. */ typedef enum HdlcError_e { /** No error detected */ HdlcError_None, /** The framing options require the address field be present, and * its content is not the required All-Stations address. */ HdlcError_InvalidAddressField, /** The framing options require a control field, and its value is * not recognized. */ HdlcError_InvalidControlField, /** A flag sequence was received without having sufficient data to * express the minimal packet content including CRC. */ HdlcError_ShortFrame, /** The CRC calculated over the received frame did not match the * expected value. */ HdlcError_BadCrc, /** We got data, but nobody's provided a buffer to store it in. */ HdlcError_NoBufferAvailable, /** More data was present in the frame (including CRC) than is * available in the currently configured receive buffer. */ HdlcError_BufferOverflow, /** The receive buffer was deconfigured while holding a partial * frame */ HdlcError_ReceptionCancelled, } HdlcError_e; #endif /* PPP_HDLC_FRAMING_H */ tinyos-2.1.2+dfsg/tos/lib/ppp/HdlcFraming.nc000066400000000000000000000130301207233610700206300ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "HdlcFraming.h" /** Interface to support RFC1662-conformant HDLC-like framing of * packets for the Point-to-Point Protocol. * * @author Peter A. Bigot */ interface HdlcFraming { /** Initiate transmission of a frame of data. * * This command starts the state machine and begins to transmit the * provided data. RFC1662-required delimeters, HDLC address and * control fields, the payload with transparency conversions, and * the 16-bit CRC are all added as the frame is transmitted. * * If this command returns SUCCESS, the sendDone event will be * signaled to indicate the ultimate success/failure of the * transmission. The pointer passed to this command will be * provided in the event, so components may more easily detect * completion of transmissions they initiated. * * @param data Pointer to a block of data that is to be transmitted. * * @param len Number of octets in the data block. * * @param inhibit_accomp If TRUE, send the address and control * fields even if the implementing component is configured to * suppress them. * * @return SUCCESS if the frame transmission has begun. EBUSY if * the system is already transmitting a frame. Other errors if the * underlying UART is unable to transmit data. */ command error_t sendFrame (const uint8_t* data, unsigned int len, bool inhibit_accomp); /** Notification that the attempt to transmit a frame of data has * completed. * * @note This event is raised by the HdlcFramingC task. * * @param data The original data pointer provided to sendFrame. * * @param len The original frame length provided to sendFrame. * * @param err The disposition of the transmission: SUCCESS if * succeeded, other values indicating failure in the state machine * or underlying serial transport. */ event void sendDone (const uint8_t* data, unsigned int len, error_t err); /** Indicate that a frame has been successfully received. * * This event is signalled by a task, not within the UART interrupt * handler. The signal is asynchronous to any receivedDelimiter() * and receptionError() events. Regardless of the number of frames * received, a subsequent receivedFrame() event shall not occur * until after the releaseReceivedFrame() command releases the * buffer. */ event void receivedFrame (const uint8_t* data, unsigned int len); /** Inform the framer that it can reclaim space used by the given * frame. * * Each received frame must be released before the next frame will * be signalled. * * It is guaranteed that the next receivedFrame() signal will not * occur during this call. This allows the caller to release state * after this command without having to worry that the state was * overwritten by the next frame. * * @param data Pointer to the start of a received frame, as provided * through the most recent receiveFrame() event. */ command error_t releaseReceivedFrame (const uint8_t* buffer); /** Notification that a flag sequence byte has been received. * * @warning This event is signalled while processing the UART * interrupt. Act quickly and return. * * It is guaranteed that this event will be signaled prior to the * receivedFrame event. */ async event void receivedDelimiter (); /** Notification that an error occurred during frame reception. * * Note that a reception error does not release the received buffer. * The system will resynchronize on the next frame delimiter. * * @warning This event is signalled while processing the UART * interrupt. Act quickly and return. * * It is guaranteed that this event will signaled prior to the * receivedDelimiter event if an unexpected delimiter is the cause * of the error. */ async event void receptionError (HdlcError_e code); } tinyos-2.1.2+dfsg/tos/lib/ppp/HdlcFramingC.nc000066400000000000000000000116411207233610700207410ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" #include "HdlcFraming.h" /** Implementation of HDLC-like framing as defined in RFC1662 for PPP. * * This implementation is optimized to receive data as efficiently as * possible. It does this by maintaining a FragmentPool that allows * multiple fragments to be collected in interrupt context while a * previous frame is being processed in task context. Extra bytes * inserted for transparency during transmission are stripped while * the data is being received, to * * @note When used in PPP, it is highly likely that the first frame * received after a Configure-Ack that completes the LCP negotiation * will fail with a BadCRC. That Configure-Ack will install a new * ACCM indicating that low-value octets are valid data, rather than * being corrupted control characters. The sender of the following * frame will assume this ACCM is installed, and will neglect to add * transparency escapes for those characters. Because this component * will have already begun processing the incoming data for the frame, * but the task that interprets the Configure-Ack and installs the * ACCM may not have completed, it is highly likely that some valid * data characters will be dropped, resulting in a checksum failure * and loss of the frame. The peer will subsequently retransmit the * frame, which will be correctly interpreted because by that point * the ACCM will have been updated. In other words, don't get your * knickers all in a twist because the LEDs indicate a BadCRC HDLC * error on startup. * * The implementation uses a local task to process transmission of * messages. Notification of frame transmission occurs in this * context. * * @note You must release all frames signaled by receivedFrame() when * you stop this component, including any frames signalled after you * began the stop process. * * @param RX_BUFFER_SIZE Size, in octets, to use for the fragment pool * used to hold incoming messages * * @param RX_FRAME_LIMIT Maximum number of fragments (individual * messages) supported by the fragment pool * * @author Peter A. Bigot */ generic configuration HdlcFramingC (unsigned int RX_BUFFER_SIZE, uint8_t RX_FRAME_LIMIT) { uses { interface HdlcUart; interface StdControl as UartControl; } provides { interface StdControl; interface HdlcFraming; #if DEBUG_HDLC_FRAMING interface DebugHdlcFraming; #endif /* DEBUG_HDLC_FRAMING */ interface GetSetOptions as HdlcFramingOptions; } } implementation { components new HdlcFramingP(RX_FRAME_LIMIT); HdlcUart = HdlcFramingP; HdlcFraming = HdlcFramingP; HdlcFramingOptions = HdlcFramingP; UartControl = HdlcFramingP.UartControl; StdControl = HdlcFramingP; #if DEBUG_HDLC_FRAMING DebugHdlcFraming = HdlcFramingP; #endif /* DEBUG_HDLC_FRAMING */ /* If the fragment pool doesn't have one more slot than the number * of active frames, then if we get into a situation where all the * frames are in use the freeze on the last one didn't reclaim any * memory, and even as earlier frames are released there may not be * enough contiguous space to get another one allocated. */ components new FragmentPoolC(RX_BUFFER_SIZE, 1+RX_FRAME_LIMIT) as InputFramePoolC; HdlcFramingP.InputFramePool -> InputFramePoolC; components MainC; MainC.SoftwareInit -> HdlcFramingP; } tinyos-2.1.2+dfsg/tos/lib/ppp/HdlcFramingP.nc000066400000000000000000000544001207233610700207560ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "HdlcFraming.h" /** Implement HDLC framing. * * @param RX_FRAME_LIMIT The maximum number of frames that can be held * waiting for the receiver to process them. */ generic module HdlcFramingP (uint8_t RX_FRAME_LIMIT) { uses { interface HdlcUart; interface StdControl as UartControl; interface FragmentPool as InputFramePool; } provides { interface Init; interface StdControl; interface HdlcFraming; interface GetSetOptions as HdlcFramingOptions; #if DEBUG_HDLC_FRAMING interface DebugHdlcFraming; #endif /* DEBUG_HDLC_FRAMING */ } } implementation { #include "HdlcFraming_.h" uint16_t txCount__; uint16_t rxCount__; command error_t Init.init () { return SUCCESS; } /** Options that control the behavior of the framing. Access must * be atomic; this is read within the receive interrupt routines, * but may be updated from synchronous context. */ HdlcFramingOptions_t options__ = { txSuppressAddressControl: FALSE, rxSuppressAddressControl: FALSE, txAsyncControlCharacterMap: ~0UL, rxAsyncControlCharacterMap: ~0UL }; /** The current state of the reception machine */ uint8_t rxState__; /** The state to which the reception machine should return upon * receipt of an escaped data byte. Only valid when state is * RX_escaped. */ uint8_t rxEscapedState_; /** Where the caller wants us to put the next frame. Set to null on * startup and upon completion of frame reception. Reset to a * non-null value by HdlcFraming.setReceiveBuffer. */ uint8_t* rxBuffer__; /** The number of octets available for an incoming frame */ int rxBufferLength__; /** An index into the current rxBuffer__ at which the next frame * character is to be written. */ int rxIndex__; uint8_t txState_; /** A buffer for outgoing data. This is used for escape sequence * constructed from control characters in an outgoing buffer, so * must be at least two octets in length. It also must be long enough to store: * - the flag sequence (1 octet) * - the address field (1 octet) * - the control field (2 octets, if escaped) * on transmission start, and: * - the CRC field (4 octets, if both bytes escaped) * - the flag sequence (1 octet) * on transmission end. We'll use twice the CRC length plus the flag sequence. */ uint8_t txTemporary_[2 * FCS_LENGTH + 1]; /** A pointer to the start of a frame being transmitted. Is null * when there is no active frame transmission. */ const uint8_t* txStart_; /** A pointer to the next character to transmit from in txStart_. * Valid only while txStart_ is not null. When equal to txEnd_, the * payload portion of the frame has been transmitted, though * transmission of the CRC may still be active. */ const uint8_t* txPtr_; /** A pointer to just past the end of the frame to be transmitted. * Valid only while txStart_ is not null. */ const uint8_t* txEnd_; /** Cached result from most recent HdlcUart.sendDone event, used * for task handoff. Access under mutex. */ error_t sendDoneError__; /** A set of reception frames permitting simultaneous reception of a * PPP frame and processing of a previously received frame. */ HdlcRxFrame_t rxFrames_[RX_FRAME_LIMIT]; static const HdlcRxFrame_t* rxFramesEnd_ = rxFrames_ + RX_FRAME_LIMIT; /** Points to the rxFrame_ that is currently being used to receive * data. Null if no input buffer is currently available. */ HdlcRxFrame_t* rxActiveFrame__; /** A queue of frames that have received data, in the order they are * to be worked off. */ HdlcRxFrame_t* readyFrame__[RX_FRAME_LIMIT]; uint8_t readyFrameIdx__; task void inputEngine_task (); /** Update a HDLC default CRC with a new data byte. * * Although both TinyOS and HDLC/PPP use the same CRC polynomial, * they shift from different ends or something; at any rate, the * standard implementation doesn't work. Found this one which does * at * http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html. */ uint16_t fcs16_update (uint16_t crc, uint8_t data) { data ^= 0xff & crc; data ^= data << 4; return ((((uint16_t)data << 8) | (0xff & (crc >> 8))) ^ (uint8_t)(data >> 4) ^ ((uint16_t)data << 3)); } enum { /** The initial value for the CRC algorithm */ FCS16_Initial = 0xFFFF, /** The expected value when calculating a CRC over a frame which * ends with an encoded CRC. */ FCS16_Good = 0xF0B8, }; /** The running CRC for a frame being received. */ uint16_t rxCrc__; /** The running CRC for a frame being transmitted. */ uint16_t txCrc_; /** Return TRUE iff character c must be escaped given this ACCM */ bool mustEscape (uint8_t c, uint32_t accm) { return ((HDLC_FlagSequence == c) || (HDLC_ControlEscape == c) || ((0x20 > c) && (accm & (1UL << c)))); } command error_t HdlcFramingOptions.set (const HdlcFramingOptions_t* new_options) { atomic { if (new_options) { options__ = *new_options; } else { options__.txSuppressAddressControl = options__.rxSuppressAddressControl = FALSE; options__.txAsyncControlCharacterMap = options__.rxAsyncControlCharacterMap = ~0UL; } } #if 0 printf("HDLC Opt: ACCOMP tx=%d rx=%d; ACCM tx=%08lx rx=%08lx\r\n", options__.txSuppressAddressControl, options__.rxSuppressAddressControl, options__.txAsyncControlCharacterMap, options__.rxAsyncControlCharacterMap); #endif return SUCCESS; } command HdlcFramingOptions_t HdlcFramingOptions.get () { atomic return options__; } command error_t HdlcFraming.sendFrame (const uint8_t* data, unsigned int len, bool inhibit_accomp) { error_t rc; uint8_t* tp; if (TX_idle != txState_) { return EBUSY; } txState_ = TX_active; txCrc_ = FCS16_Initial; txStart_ = txPtr_ = data; txEnd_ = txStart_ + len; tp = txTemporary_; *tp++ = HDLC_FlagSequence; if (inhibit_accomp || (! options__.txSuppressAddressControl)) { txCrc_ = fcs16_update(txCrc_, HDLC_AllStationsAddress); txCrc_ = fcs16_update(txCrc_, HDLC_ControlFieldValue); *tp++ = HDLC_AllStationsAddress; if (mustEscape(HDLC_ControlFieldValue, options__.txAsyncControlCharacterMap)) { *tp++ = HDLC_ControlEscape; *tp++ = HDLC_ControlFieldValue ^ HDLC_ControlModifier; } else { *tp++ = HDLC_ControlFieldValue; } } rc = call HdlcUart.send(txTemporary_, tp - txTemporary_); if (SUCCESS != rc) { txState_ = TX_idle; } return rc; } error_t startNewFrame_async__ () { error_t rc; HdlcRxFrame_t* fp; /* Find an open frame */ fp = rxFrames_; while ((fp < rxFramesEnd_) && (RFS_unused != fp->frame_state)) { ++fp; } if (rxFramesEnd_ <= fp) { return ENOMEM; } /* Get a fragment, if any */ rc = call InputFramePool.request(&fp->start, &fp->end, MinimumUsefulBufferLength); if (SUCCESS != rc) { return rc; } rxBuffer__ = fp->start; rxBufferLength__ = fp->end - fp->start; rxActiveFrame__ = fp; rxActiveFrame__->frame_state = RFS_receiving; return SUCCESS; } /* We don't need to do anything when space becomes available in the * input pool. Only inputEngine_task causes changes to the input * pool, and it knows that it's done so. */ async event void InputFramePool.available (unsigned int length) { atomic { if (! rxActiveFrame__) { startNewFrame_async__(); } } } void completeFrame_async__ () { HdlcRxFrame_t* fp = rxActiveFrame__; uint8_t* fpe; /* Graduate the frame to "received", set its length, and notify * the engine. */ fp->frame_state = RFS_received; fp->end = fp->start + rxIndex__ - FCS_LENGTH; post inputEngine_task(); /* Stuff the active frame on the ready queue */ readyFrame__[readyFrameIdx__++] = rxActiveFrame__; /* Mark that we have no active input buffer. */ rxActiveFrame__ = 0; rxBuffer__ = 0; /* Freeze the payload of the frame. Note that if the frame has no * data, we want to pretend it has at least one octet in it, * otherwise we're likely to get the same address for the next * frame confusing the bookkeeping. * * During the freeze call, the InputFramePool.available() event * will be signalled, which will cause us to be assigned a new * buffer if the pool has space for another frame. */ fpe = fp->end; if (fp->start == fpe) { ++fpe; } (void)call InputFramePool.freeze(fp->start, fpe); } command error_t HdlcFraming.releaseReceivedFrame (const uint8_t* buffer) { HdlcRxFrame_t* fp = rxFrames_; /* Find the frame data for the input buffer */ atomic { while ((fp < rxFramesEnd_) && (fp->start != buffer)) { ++fp; } if (fp >= rxFramesEnd_) { return EINVAL; } fp->frame_state = RFS_releasable; } post inputEngine_task(); return SUCCESS; } task void inputEngine_task () { bool did_something = FALSE; uint8_t* releasable_fragment = 0; const uint8_t* frame_start = 0; unsigned int frame_length = 0; atomic { HdlcRxFrame_t* fp; if (0 < readyFrameIdx__) { fp = readyFrame__[0]; if (0 < --readyFrameIdx__) { memmove(readyFrame__, readyFrame__ + 1, readyFrameIdx__ * sizeof(*readyFrame__)); } fp->frame_state = RFS_processing; frame_start = fp->start; frame_length = fp->end - fp->start; } else { fp = rxFrames_; while (fp < rxFramesEnd_) { if (RFS_releasable == fp->frame_state) { releasable_fragment = fp->start; fp->frame_state = RFS_unused; fp->start = fp->end = 0; break; } ++fp; } } } if (frame_start) { signal HdlcFraming.receivedFrame(frame_start, frame_length); did_something = TRUE; } if (releasable_fragment) { (void)call InputFramePool.release(releasable_fragment); did_something = TRUE; } if (did_something) { post inputEngine_task(); } } event void HdlcUart.receivedByte (uint8_t byte) { uint8_t in_byte = byte; int rx_error = HdlcError_None; bool post_rx_delim = FALSE; /* @note This event runs in interrupt context */ atomic { /* Characters in the ACCM are to be silently dropped. */ if ((0x20 > byte) && (options__.rxAsyncControlCharacterMap & (1UL << byte))) { return; } /* If we've been waiting for a byte that had to be modified for * transparency, convert it. */ if (RX_escaped == rxState__) { if ((HDLC_FlagSequence == byte) || (HDLC_ControlEscape == byte)) { /* These characters are not valid in escaped state. Go * unsynchronized, but process the byte in that state so we * can resync if necessary. */ rxState__ = RX_unsynchronized; } else { /* Unescape the byte and drop back to the unescaped state * for processing. */ byte ^= HDLC_ControlModifier; rxState__ = rxEscapedState_; } } if ((RX_unsynchronized != rxState__) && (HDLC_ControlEscape == in_byte)) { /* We're synchronized and the next byte had to be escaped, so * prepare for it, saving the current state so we can return * to it. */ rxEscapedState_ = rxState__; rxState__ = RX_escaped; } else { /* Process the byte. */ switch (rxState__) { default: reprocess_unsynchronized: rxState__ = RX_unsynchronized; /*FALLTHRU*/ case RX_unsynchronized: /* If we're not synchronized, we have no valid data. Clear the index * so we can safely update the receive buffer. */ rxIndex__ = 0; rxCrc__ = FCS16_Initial; /* The only way to get out of the unsynchronized state is to * receive a flag sequence, which starts a new receive * operation. Note we check the unconverted byte. */ if (HDLC_FlagSequence == in_byte) { rxState__ = RX_atAddress; post_rx_delim = TRUE; } break; case RX_atAddress: if (HDLC_FlagSequence == in_byte) { /* Never mind: not starting yet after all */ goto reprocess_unsynchronized; } if (HDLC_AllStationsAddress != byte) { /* If accomp is enabled, it's ok to not get the address; * in that case jump straight to receive. (It's also ok * to get the address, which is why we didn't skip over * this state. If we did, though, we must also get the * control field. */ #if 0 /* Technically, we shouldn't get here if the other side * hasn't agreed to compress address and control fields. * @TODO@ This is temporarily disabled since we don't set * the local options yet. */ if (! options__.rxSuppressAddressControl) { rx_error = HdlcError_InvalidAddressField; goto reprocess_unsynchronized; } #endif rxState__ = RX_receive; goto receive; } rxCrc__ = fcs16_update(rxCrc__, byte); rxState__ = RX_atControlField; break; case RX_atControlField: /* If we got to this state, we have to match the control * field, or resynchronize. */ if (HDLC_ControlFieldValue != byte) { if (HDLC_FlagSequence != in_byte) { rx_error = HdlcError_InvalidControlField; } goto reprocess_unsynchronized; } rxCrc__ = fcs16_update(rxCrc__, byte); rxState__ = RX_receive; break; case RX_receive: receive: if (HDLC_FlagSequence == in_byte) { /* Probable end of the frame. If the content is long enough to be valid, * check the CRC and push the frame upstream if it's valid */ if (FCS_LENGTH <= rxIndex__) { if (FCS16_Good == rxCrc__) { completeFrame_async__(); } else { rx_error = HdlcError_BadCrc; } } else { rx_error = HdlcError_ShortFrame; } /* Reprocess the character to resynchronize */ goto reprocess_unsynchronized; } /* Valid decoded character. If there's a buffer with * available room, update the CRC and store it. * Otherwise, abort the reception. */ if (rxBuffer__) { if (rxIndex__ < rxBufferLength__) { rxCrc__ = fcs16_update(rxCrc__, byte); rxBuffer__[rxIndex__++] = byte; } else { rx_error = HdlcError_BufferOverflow; } } else { rx_error = HdlcError_NoBufferAvailable; } if (HdlcError_None != rx_error) { rxState__ = RX_unsynchronized; } break; case RX_escaped: /*NOTREACHED*/ break; } } } // atomic /* Error notifications first */ if (HdlcError_None != rx_error) { signal HdlcFraming.receptionError(rx_error); } /* Delimiter reception after errors but before frame completion */ if (post_rx_delim) { signal HdlcFraming.receivedDelimiter(); } } /* To avoid loss of incoming data during full duplex communications, * we need to prepare for the next transmission block in a task that * does not run in the interrupt context in which we're notified of * completion of the previous transmission. */ task void uartStreamSendDone () { error_t error; const uint8_t* tp = txPtr_; const uint8_t* uart_tx_ptr = 0; uint8_t next_state; unsigned int uart_tx_len = 0; bool send_done = FALSE; uint32_t tx_accm; atomic { error = sendDoneError__; tx_accm = options__.txAsyncControlCharacterMap; } next_state = txState_; send_done = ((SUCCESS == error) && (TX_sendCrc == txState_)); if (! send_done) { if (SUCCESS == error) { /* The last operation succeeded, so start the next one. * Beginning where we left off, look for an outbound character * that needs to be escaped. */ while ((tp < txEnd_) && (! mustEscape(*tp, tx_accm))) { ++tp; } if ((tp == txPtr_) && (txPtr_ < txEnd_)) { /* There are characters to transmit, and the first one has to * be escaped. Add it to the CRC, escape it, and send it on * its way. */ uint8_t* bp = txTemporary_; txCrc_ = fcs16_update(txCrc_, *txPtr_); *bp++ = HDLC_ControlEscape; *bp++ = HDLC_ControlModifier ^ *txPtr_; uart_tx_ptr = txTemporary_; uart_tx_len = bp - txTemporary_; ++txPtr_; } else if (txPtr_ < txEnd_) { /* There are unescaped characters to be sent. Send them, then * add them to the CRC. Note need to remove const qualifier * from transmit buffer to satisfy the TinyOS interface * definition: one hopes nobody's implementation actually * mucks with the content. */ uart_tx_ptr = txPtr_; uart_tx_len = tp - txPtr_; while (txPtr_ < tp) { txCrc_ = fcs16_update(txCrc_, *txPtr_++); } } else { uint8_t shift = 0; uint8_t* bp = txTemporary_; /* All frame characters have been sent. Pack up the CRC to * follow: xor with initial, low byte first, escaping the * bytes as necessary. */ next_state = TX_sendCrc; txCrc_ = txCrc_ ^ FCS16_Initial; while (16 > shift) { uint8_t crcb = (txCrc_ >> shift) & 0xff; if (mustEscape(crcb, tx_accm)) { *bp++ = HDLC_ControlEscape; *bp++ = crcb ^ HDLC_ControlModifier; } else { *bp++ = crcb; } shift += 8; } /* Tack on the closing flag sequence. */ *bp++ = HDLC_FlagSequence; uart_tx_ptr = txTemporary_; uart_tx_len = bp - txTemporary_; } } } /* If we have more to send, try to send it. */ if (uart_tx_ptr) { error = call HdlcUart.send((uint8_t*)uart_tx_ptr, uart_tx_len); } /* If whatever we tried to send failed (delayed result from last * time, or immediate result from this time), forward the * error. */ if (SUCCESS != error) { send_done = TRUE; } /* If we finished, we'll update the state to be idle. */ if (send_done) { next_state = TX_idle; } /* Update the machine state. */ txState_ = next_state; /* Notify the user that the transfer has completed, whether it * succeeded or failed. */ if (send_done) { signal HdlcFraming.sendDone(txStart_, txEnd_ - txStart_, error); } } async event void HdlcUart.uartError (error_t error) { } async event void HdlcUart.sendDone (error_t error) { /* @note This event runs in interrupt context */ atomic { sendDoneError__ = error; } post uartStreamSendDone(); } default async event void HdlcFraming.receivedDelimiter () { } default async event void HdlcFraming.receptionError (HdlcError_e code) { } command error_t StdControl.start () { error_t rc = SUCCESS; /* NB: Ignore the return from this. It may fail if the UART is * being used by the SerialPrintfC component, and that's OK. */ (void)call UartControl.start(); if (SUCCESS == rc) { atomic rc = startNewFrame_async__(); } return rc; } command error_t StdControl.stop () { /* Need to inhibit any new transmissions. * Need to shut down any in-progress transmission. * Need to inhibit any new receptions * Need to wait for completed frames to be released. */ return call UartControl.stop(); } #if DEBUG_HDLC_FRAMING async command unsigned int DebugHdlcFraming.rxState () { atomic return rxState__; } async command unsigned int DebugHdlcFraming.txState () { return txState_; } async command unsigned int DebugHdlcFraming.numRxFrames () { return RX_FRAME_LIMIT; } async command const HdlcRxFrame_t* DebugHdlcFraming.rxFrames () { return rxFrames_; } #endif /* DEBUG_HDLC_FRAMING */ } tinyos-2.1.2+dfsg/tos/lib/ppp/HdlcFraming_.h000066400000000000000000000057471207233610700206360ustar00rootroot00000000000000/** Internal HDLC framing data structures, pulled out for white-box * testing. */ #ifndef PPP_HDLC_FRAMING_INTERNAL_H #define PPP_HDLC_FRAMING_INTERNAL_H enum { /** The sole address field value permitted by RFC1662 */ HDLC_AllStationsAddress = 0xff, /** The sole control field value permitted by RFC1662 */ HDLC_ControlFieldValue = 0x03, /** The value used to indicate a frame delimiter */ HDLC_FlagSequence = 0x7e, /** The prefix byte used to indicate an escaped byte */ HDLC_ControlEscape = 0x7d, /** The value used to escape a data byte */ HDLC_ControlModifier = 0x20, }; enum { /** The number of octets in a frame check sequence */ FCS_LENGTH = 2, /** If the size of the buffer provided by the fragment pool isn't * at least this big, just pretend there's no space at all. */ MinimumUsefulBufferLength = 16 + FCS_LENGTH, }; /** State of the HDLC automaton that processes incoming characters to * create frame data. */ typedef enum RXState_e { /** Waiting for a flag sequence delimiter. State is initial, and * is re-entered whenever synchronization is lost. */ RX_unsynchronized, /** Delimiter has been received, we are awaiting the address byte * (or, if address compression is enabled, whatever the first byte * is). */ RX_atAddress, /** Address has been received, we are awaiting the control field byte. */ RX_atControlField, /** Have received the delimiter and are at the point of receiving * data; all is good. */ RX_receive, /** Received a valid control escape, waiting for the following * data character. */ RX_escaped, } RXState_e; /** State of the task that generates framed data written to the UART */ typedef enum TXState_e { /** No transmission is in progress. txStart_ should be null. */ TX_idle, /** Actively transmitting the payload of a frame. */ TX_active, /** Actively transmitting the CRC of a frame. */ TX_sendCrc, } TXState_e; typedef enum ReceiveFrameState_e { /** Indicates that the frame is available for use. * inputEngine_task transitions into this state when a frame is * released; the UART interrupt transitions from this state when a * new buffer is installed. */ RFS_unused, /** The frame's fragment has been allocated and is being used to * store incoming data. */ RFS_receiving, /** The incoming frame has been completed, the length updated, the * remainder of the fragment released. inputEngine_task has the * responsibility for further transitions. */ RFS_received, /** inputEngine_task sets the frame to processing when it notifies * the client of frame availability. */ RFS_processing, /** Processing is complete and any hold has been released. * Handoff to inputEngine_task to reclaim the frame fragment. */ RFS_releasable, } ReceiveFrameState_e; /** A structure used to hold a fragment from the HDLC reception frame pool. */ typedef struct HdlcRxFrame_t { uint8_t* start; uint8_t* end; uint8_t frame_state; } HdlcRxFrame_t; #endif /* PPP_HDLC_FRAMING_INTERNAL_H */ tinyos-2.1.2+dfsg/tos/lib/ppp/HdlcUart.nc000066400000000000000000000062451207233610700201720ustar00rootroot00000000000000/* Copyright (c) 2011 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Provide basic UART-related functions required for the HdlcFramingC * infrastructure. * * The HDLC framing infrastructure needs the ability to send blocks of * characters, and to receive characters one-by-one as soon as they * arrive. The processing done on each received character is fairly * complex. * * The UartStream interface's send command and receiveByte interface * technically meet these needs. However, both are async operations. * At high serial data rates and when serving as a bridge for a * high-data-rate radio interface, interrupt-driven reception causes * dropped packets. DMA-based reception can work around this, but the * lack of an a-priori length for received messages makes the * translation to a per-byte reception event complex. * * @author Peter A. Bigot */ interface HdlcUart { /** Send len bytes from the given address over the UART. * * This command is essentially forwarded to UartStream.send. */ command error_t send (uint8_t* buf, uint16_t len); /** Notification of the result of the most recent send that returned * SUCCESS. */ async event void sendDone (error_t error); /** Notification of an error detected in serial processing. * * The event is raised once for each detected character drop, with * an error value of ENOMEM. It is raised with the error value * SUCCESS when the infrastructure recovers from dropped characters * and subsequent data is known to be good. */ async event void uartError (error_t error); /** Notification of a newly received byte. */ event void receivedByte (uint8_t byte); } tinyos-2.1.2+dfsg/tos/lib/ppp/LcpAutomaton.h000066400000000000000000000112761207233610700207210ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef PPP_LCP_AUTOMATON_H #define PPP_LCP_AUTOMATON_H #include "ppp.h" /** States of the LCP automaton as defined in RFC1661. */ typedef enum LcpAutomatonState_e { LAS_Initial = 0, LAS_Starting, LAS_Closed, LAS_Stopped, LAS_Closing, LAS_Stopping, LAS_RequestSent, LAS_AckReceived, LAS_AckSent, LAS_Opened, /** Special non-RFC state required when the actions taken during a * transition are split-phase. */ LAS_TRANSIENT = 0x0f } LcpAutomatonState_e ; /** Events that induce transitions among the states of the LCP * automaton. */ typedef enum LcpAutomatonEvent_e { LAE_Up, LAE_Down, LAE_Open, LAE_Close, LAE_Timeout, LAE_ReceiveConfigureRequest, LAE_ReceiveConfigureAck, LAE_ReceiveConfigureNakRej, LAE_ReceiveTerminateRequest, LAE_ReceiveTerminateAck, LAE_ReceveUnknownCode, LAE_ReceiveCodeProtocolReject, LAE_ReceiveEchoDiscardRequestReply, } LcpAutomatonEvent_e ; /** Options that control the behavior of the LCP automaton. * Generally, these have RFC-defined default values. Check the * automaton source to determine whether these are actually used. See * section 4.6 of RFC1661 for details. */ typedef struct LcpAutomatonOptions_t { uint32_t restartTimer_bms; uint16_t maxTerminate; uint16_t maxConfigure; uint16_t maxFailure; bool restartOption; } LcpAutomatonOptions_t; /** Structure holding parameters referenced by the LCP automaton when * processing a ConfigureRequest message. */ typedef struct LcpEventParams_rcr_t { /** The generic summary of the request: good (should be * acknowledged), or not (should be rejected or nak'd) */ bool good; /** The specific disposition of the request: one of * PppControlProtocolCode_{ConfigureAck,ConfigureNak,ConfigureReject}. */ uint8_t disposition; /** The start of the encoded block of options in the response * message. */ const uint8_t* options; /** Just past the end of the encoded block of options. */ const uint8_t* options_end; /** The key to be used when transmitting the message. */ frame_key_t scx_key; } LcpEventParams_rcr_t; /** Structure holding parameters referenced by the LCP automaton when * processing a message that contains a sequence of options, such as a * Configure-Ack, Configure-Nak, or Configure-Reject message. */ typedef struct LcpEventParams_opts_t { /** The start of the encoded block of options that were accepted by * the remote. */ const uint8_t* options; /** Just past the end of the encoded block of options. */ const uint8_t* options_end; /** Code for the type of message that was received */ uint8_t code; } LcpEventParams_opts_t; /** Structure holding parameters referenced by the LCP automaton when * processing a TerminateRequest or TerminateAck message */ typedef struct LcpEventParams_term_t { /** The start of the payload in the received message */ const uint8_t* data; /** The end of the payload in the received message */ const uint8_t* data_end; /** Code for the type of message that was received */ uint8_t code; /** The key for a prepared Terminate-Ack message to be transmitted */ frame_key_t sta_key; } LcpEventParams_term_t; #endif /* PPP_LCP_AUTOMATON_H */ tinyos-2.1.2+dfsg/tos/lib/ppp/LcpAutomaton.nc000066400000000000000000000122101207233610700210570ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "LcpAutomaton.h" /** Manage the Link Control Protocol automaton. * * This interface is subject to change, as it is unclear which actions * should be publicly available. * * @author Peter A. Bigot */ interface LcpAutomaton { /** Raised upon completion of the transition actions associated with * an automaton event. * * @param state The resulting state of the automaton. May be the * same as the previous state. */ event void transitionCompleted (LcpAutomatonState_e state); /** Obtain the current state of the automaton */ command LcpAutomatonState_e getState (); /** Externally indicate that the layer is ready. * * This command is normally invoked only by the Ppp daemon when * bringing up LCP, and by an LCP automaton when a lower layer is * ready to carry packets. */ command error_t up (); /** Externally indicate that the layer is ready. * * This command is normally invoked only by the Ppp daemon when * closing down the link, and by an LCP automaton when all upper * layers have closed. */ command error_t down (); /** Administratively enable the automaton. * * This is normally invoked during application initialization, to * indicate that the corresponding protocol should be enabled as * soon as enough of PPP is up to allow messages to get to it. * * @return SUCCESS if automaton transition succeeded. ERETRY if the * automaton is busy, and the attempt should repeated. */ command error_t open (); /** Administratively disable the automaton. * * @return SUCCESS if automaton transition succeeded. ERETRY if the * automaton is busy, and the attempt should repeated. */ command error_t close (); /** Notify the automaton of an event to be executed. * * @param evt The event that is inducing a state transition. * * @param params Pointer to an event-specific structure required to * complete the actions associated with the transition. Note that * the parameters may include resources, the responsibility for * which is normally transferred to the automaton. * * @note If this command returns ERETRY, any resource included in * the params was not accepted by the automaton, and the caller must * dispose of it. For SUCCESS and for all non-ERETRY error returns, * the automaton accepts resource parameters and is responsible for * releasing them. * * @return The result of the signal operation. If ERETRY, the * automaton is busy, but the event may be re-signaled later. For * all other returns, the event should not be re-signalled. */ command error_t signalEvent (LcpAutomatonEvent_e evt, void* params); /** Raised by the automaton to indicate to upper layers that the * automaton has entered the Opened state. * * Normally, upper layers should respond by invoking the up() * command on themselves. */ event void thisLayerUp (); /** Raised by the automaton to indicate to upper layers that the * automaton is leaving the Opened state. * * Normally, upper layers should respond by invoking the down() * command on themselves. */ event void thisLayerDown (); /** Raised by the automaton to indicate to lower layers that the * automaton is entering the Starting state and the lower layer is * needed. */ event void thisLayerStarted (); /** Raised by the automaton to indicate to lower layers that the * automaton is entering the Initial, Closed, or Stopped states, and * the lower layer is no longer needed for the link. */ event void thisLayerFinished (); } tinyos-2.1.2+dfsg/tos/lib/ppp/LcpAutomatonC.nc000066400000000000000000000061371207233610700211750ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Configuration to manage the state associated with a PPP Link * Control Protocol automaton as defined in RFC1661. * * Note that there is generally instance of this automaton for each * control protocol: the LCP instance associated with the PppDaemonC * configuration has one, but so will every other network protocol * that leverages LCP's option negotiation sequence for configuration. * Which is most of the interesting ones. * * @param Protocol The protocol type encoded in PPP packets * * @param InhibitCompression If TRUE, any options like PCOMP and * ACCOMP that might result in non-default encodings are to be * inhibited for this protocol. * * @author Peter A. Bigot */ generic configuration LcpAutomatonC (uint16_t Protocol, bool InhibitCompression) { provides { interface LcpAutomaton; interface GetSetOptions as LcpOptions; } uses { interface Ppp; interface PppConfigure; interface PppProtocolCodeSupport as ConfigureRequest; interface PppProtocolCodeSupport as TerminateAck; } } implementation { components new LcpAutomatonP(Protocol, InhibitCompression); LcpAutomaton = LcpAutomatonP; LcpOptions = LcpAutomatonP; Ppp = LcpAutomatonP; PppConfigure = LcpAutomatonP; ConfigureRequest = LcpAutomatonP.ConfigureRequest; TerminateAck = LcpAutomatonP.TerminateAck; components MainC; MainC.SoftwareInit -> LcpAutomatonP; components new MuxAlarmMilli32C(); LcpAutomatonP.RestartTimer -> MuxAlarmMilli32C; } tinyos-2.1.2+dfsg/tos/lib/ppp/LcpAutomatonP.nc000066400000000000000000000617441207233610700212170ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "LcpAutomaton.h" generic module LcpAutomatonP (uint16_t Protocol, bool InhibitCompression) { provides { interface Init; interface LcpAutomaton; interface GetSetOptions as LcpOptions; } uses { interface Ppp; interface PppConfigure; interface Alarm as RestartTimer; interface PppProtocolCodeSupport as ConfigureRequest; interface PppProtocolCodeSupport as TerminateAck; } } implementation { command error_t Init.init () { return SUCCESS; } /** Convert state values into bits so we can represent sets of * states more efficiently */ enum { ASB_Initial = (1 << LAS_Initial), ASB_Starting = (1 << LAS_Starting), ASB_Closed = (1 << LAS_Closed), ASB_Stopped = (1 << LAS_Stopped), ASB_Closing = (1 << LAS_Closing), ASB_Stopping = (1 << LAS_Stopping), ASB_RequestSent = (1 << LAS_RequestSent), ASB_AckReceived = (1 << LAS_AckReceived), ASB_AckSent = (1 << LAS_AckSent), ASB_Opened = (1 << LAS_Opened), }; /** Type adequate to store a complete set of LCP automaton states */ typedef uint16_t stateBitSet_t; /** The states in which the timer should not be running */ const stateBitSet_t ASB_TimerRunningStates = (ASB_Closing | ASB_Stopping | ASB_RequestSent | ASB_AckReceived | ASB_AckSent); /** Action bits for state transitions. * * The actions taken when transitioning between states sometimes * must be executed synchronously, and often are split-phase. * Consequently, the actions involved in a transition cannot be done * in place, and may in fact take several revisits to complete. We * support this by determining the set of actions in one operation * (calculateEventActions_), then working them off in order over in * potentially multiple task invocations (processEventActions_). * * This enumeration specifies actions to be performed during a * transition. The actions are executed as a secondary state * machine starting from the low bit of the action set. If any * action fails, the secondary machine stops and the primary state * is set to failState_. If all actions complete successfully, the * primary state is set to successState_. * * Execution of the transition is suspended if the action is split * phase. * * Most of these actions are defined in section 4.4 of RFC1661. * Consult processEventActions_ to determine which events might * require processing to be suspended. */ enum TransitionAction_b { TA_noop = 0, /** thisLayerFinished */ TA_tlf = 0x01, TA_tld = 0x02, TA_zrc = 0x04, TA_irc_scr = 0x10, TA_irc_str = 0x20, TA_resetLocalOptions = 0x40, TA_resetRemoteOptions = 0x80, TA_scr = 0x100, TA_sca = 0x200, TA_scn = 0x400, TA_str = 0x1000, /** send unsolicited Terminate-Ack */ TA_sta_uns = 0x2000, /** send Terminate-Ack in response to Terminate-Request */ TA_sta_rep = 0x4000, TA_scj = 0x10000, TA_ser = 0x20000, /** Extract and apply option values from the payload of a received * Configure-Ack message. Must not co-occur with * TA_setRemoteOptions. */ TA_setLocalOptions = 0x100000, /** Extract and apply option values from the payload of a transmitted * Configure-Ack message. Must not co-occur with TA_setLocalOptions. */ TA_setRemoteOptions = 0x200000, TA_tlu = 0x01000000, TA_tls = 0x02000000, /** Set of actions which can cause processing to be suspended. */ TA_SUSPENDABLE = TA_scr | TA_sca | TA_scn | TA_str | TA_sta_uns | TA_sta_rep | TA_scj | TA_ser, }; /** Type adequate to store an arbitrary set of transition actions */ typedef uint32_t transitionActions_t; transitionActions_t pendingActions_; transitionActions_t lastAction_; /** The state to which the automaton will transition if all pending * actions complete successfully. */ uint8_t successState_; /** The state to which the automaton will transition if any pending * action fails. Ideally, that failure will not have changed * visible state. */ uint8_t failState_; uint8_t currentState_; /** The code for the message that carried a given optionSet_. When * the system is to invoke setRemoteOptions, this should be a * Code_ConfigureAck. When the system is to invoke setLocalOptions, * this may be Code_ConfigureAck, Code_ConfigureNak, or * Code_ConfigureReject. The specific code controls what is done * with the options. */ uint8_t optionMessageCode_; /** Storage to communicate an encoded option set between the code * that processes the events and the code that executes the * actions. */ const uint8_t* optionSet_; /** Length of the option set in octets. Valid only when optionSet_ * is not null. */ const uint8_t* optionSetEnd_; /** Store to communicate fact-of a pending transmission between the * event and action code. Required when an event built a * Configure-Ack or Configure-Nak message, but correct functioning * requires that a Configure-Request message be transmitted * first. */ frame_key_t pendingSxxKey_; /* Forward declaration */ error_t calculateEventActions_ (LcpAutomatonEvent_e evt, void* arg); /* Forward declaration */ error_t processEventActions_ (); /** Options for the automaton. The default values are taken from * section 4.6 of RFC1661. */ LcpAutomatonOptions_t options_ = { restartTimer_bms: 3 * 1024, // 3 sec maxTerminate: 2, // 2 maxConfigure: 10, // 10 maxFailure: 5 }; // 5 bool changeState (LcpAutomatonState_e new_state) { return FALSE; } /** The number of retries available. */ int16_t restartCounter_; /** The action that causes the restart timer to be enabled */ transitionActions_t restartCounterAction_; void initializeRestartCounter (transitionActions_t action) { restartCounterAction_ = action; if (TA_scr == action) { restartCounter_ = options_.maxConfigure; } else if (TA_str == action) { restartCounter_ = options_.maxTerminate; } else if (TA_sta_rep == action) { restartCounter_ = 0; } else { restartCounterAction_ = TA_noop; } /* Timer is stopped now. It will be restarted when the frame * associated with this activity is transmitted. */ call RestartTimer.stop(); } task void resumeAutomaton_task () { processEventActions_(); } /** Key which, when the corresponding output frame is transmitted, * causes the restart timer to be reset. */ frame_key_t restartKey_; /** Key which, when the corresponding output frame is transmitted, * causes the automaton to resume processing. */ frame_key_t resumeKey_; /** Error code archived from most recent transmission completion * that causes action execution to resume. Must be SUCCESS at all * times that a split-phase transition is not in progress. */ error_t resumeResult_; void restartTimer_ () { call RestartTimer.start(options_.restartTimer_bms); } task void restartTimerFired_task () { error_t rc; bool have_retries = (0 < restartCounter_); rc = calculateEventActions_(LAE_Timeout, &have_retries); if (SUCCESS == rc) { post resumeAutomaton_task(); } else { /* Event processor is busy: try again soon */ call RestartTimer.start(1); } } async event void RestartTimer.fired () { post restartTimerFired_task(); } event void Ppp.outputFrameTransmitted (frame_key_t key, error_t result) { if (restartKey_ == key) { restartKey_ = 0; restartTimer_(); } if (resumeKey_ == key) { resumeResult_ = result; resumeKey_ = 0; post resumeAutomaton_task(); } //printf("OFT %p: res %d rT %d auto %d\r\n", key, result, do_restart_timer, do_resume); } command LcpAutomatonState_e LcpAutomaton.getState () { return currentState_; } /** Determine the set of actions that must be performed upon receipt * of this event. * * @return ERETRY if the automaton is already processing a set of * actions. Return SUCCESS in all other cases. */ error_t calculateEventActions_ (LcpAutomatonEvent_e evt, void* arg) { stateBitSet_t sb = (1 << currentState_); /* If there's already something happening, presumably we're in * transient state. Retry the packet later. * * @TODO@ We can be in TRANSIENT without any pendingActions_. * Clean up the state. */ if (pendingActions_ || (LAS_TRANSIENT == currentState_)) { return ERETRY; } failState_ = successState_ = currentState_; switch (evt) { case LAE_Up: if ((ASB_Initial) & sb) { successState_ = LAS_Closed; } else if ((ASB_Starting) & sb) { /* For protocols not supporting Configure: tlu/9 */ pendingActions_ |= TA_irc_scr | TA_scr; successState_ = LAS_RequestSent; } else { /* Invalid: Closed, Stopped, Closing, Stopping, Req-Sent, Ack-Rcvd, Ack-Sent, Opened */ } break; case LAE_Down: if ((ASB_Closed | ASB_Closing) & sb) { successState_ = LAS_Initial; } else if ((ASB_Initial | ASB_Starting) & sb) { /* illegal */ } else { if (ASB_Stopped & sb) { pendingActions_ |= TA_tls; } else if (ASB_Opened & sb) { pendingActions_ |= TA_tld; } else { /* Stopping, Req-Sent, Ack-Rcvd, Ack-Sent */ } successState_ = LAS_Starting; } break; case LAE_Open: if (ASB_Initial & sb) { pendingActions_ |= TA_tls; successState_ = LAS_Starting; } else if (ASB_Closed & sb) { /* For protocols not supporting configure: 9 */ pendingActions_ |= TA_irc_scr | TA_scr; successState_ = LAS_RequestSent; } else if ((ASB_Stopped | ASB_Closing | ASB_Stopping | ASB_Opened) & sb) { if (options_.restartOption) { /* @TODO@ Figure out how to execute nested events */ /* evt down */ /* evt up */ } else { if (ASB_Closing & sb) { successState_ = LAS_Stopping; } else { /* No change: Stopped, Stopping, Opened */ } } } else { /* No change: Starting, RequestSent, AckReceived, AckSent */ } break; case LAE_Close: if ((ASB_Initial | ASB_Closed | ASB_Closing) & sb) { /* No change */ } else if ((ASB_Starting) & sb) { pendingActions_ |= TA_tlf; successState_ = LAS_Initial; } else if ((ASB_Stopped) & sb) { successState_ = LAS_Closed; } else { if ((ASB_Opened) & sb) { pendingActions_ |= TA_tld; } if ((ASB_RequestSent | ASB_AckReceived | ASB_AckSent | ASB_Opened) & sb) { pendingActions_ |= TA_irc_str | TA_str; } successState_ = LAS_Closing; } break; case LAE_Timeout: { bool have_retries = FALSE; if (arg) { have_retries = *(bool*)arg; } if ((ASB_Closing | ASB_Stopping) & sb) { if (have_retries) { pendingActions_ |= TA_str; } else { pendingActions_ |= TA_tlf; if ((ASB_Closing) & sb) { successState_ = LAS_Closed; } else { successState_ = LAS_Stopped; } } } else if ((ASB_RequestSent | ASB_AckReceived | ASB_AckSent) & sb) { if (have_retries) { pendingActions_ |= TA_scr; if ((ASB_AckReceived) & sb) { successState_ = LAS_RequestSent; } } else { pendingActions_ |= TA_tlf; successState_ = LAS_Stopped; /* passive option? */ } } break; } case LAE_ReceiveConfigureRequest: { LcpEventParams_rcr_t* params = (LcpEventParams_rcr_t*)arg; //printf("RCR good %d disp %d\r\n", params->good, params->disposition); if ((ASB_Initial | ASB_Starting) & sb) { /* Invalid */ } else if ((ASB_Closing | ASB_Stopping) & sb) { /* No change */ } else if ((ASB_Closed) & sb) { pendingActions_ |= TA_sta_uns; } else if ((ASB_Stopped) & sb) { pendingActions_ |= TA_irc_scr | TA_scr; if (params->good) { pendingActions_ |= TA_sca; successState_ = LAS_AckSent; } else { pendingActions_ |= TA_scn; successState_ = LAS_RequestSent; } } else if ((ASB_RequestSent | ASB_AckSent) & sb) { if (params->good) { pendingActions_ |= TA_sca; successState_ = LAS_AckSent; } else { pendingActions_ |= TA_scn; successState_ = LAS_RequestSent; } } else if ((ASB_AckReceived) & sb) { if (params->good) { pendingActions_ |= TA_sca | TA_tlu; successState_ = LAS_Opened; } else { pendingActions_ |= TA_scn; successState_ = LAS_AckReceived; } } else if ((ASB_Opened) & sb) { pendingActions_ |= TA_tld | TA_scr; if (params->good) { pendingActions_ |= TA_sca; successState_ = LAS_AckSent; } else { pendingActions_ |= TA_scn; successState_ = LAS_RequestSent; } } /* On a new Configure-Request, reset all the remote options. * We may immediately set them after transmitting a * Configure-Ack, but let's leave them in their reset state * between those two phases. */ pendingActions_ |= TA_resetRemoteOptions; if (pendingActions_ & TA_sca) { /* Length of the option set is the entire payload minus the * code, identifier, and length fields. */ pendingActions_ |= TA_setRemoteOptions; optionMessageCode_ = PppControlProtocolCode_ConfigureAck; optionSet_ = params->options; optionSetEnd_ = params->options_end; } pendingSxxKey_ = params->scx_key; break; } case LAE_ReceiveConfigureAck: { LcpEventParams_opts_t* params = (LcpEventParams_opts_t*)arg; if ((ASB_Closed | ASB_Stopped) & sb) { pendingActions_ |= TA_sta_uns; } else if ((ASB_Closing | ASB_Stopping) & sb) { /* No change */ } else if ((ASB_RequestSent) & sb) { pendingActions_ |= TA_irc_scr; successState_ = LAS_AckReceived; } else if ((ASB_AckReceived) & sb) { pendingActions_ |= TA_scr; successState_ = LAS_RequestSent; } else if ((ASB_AckSent) & sb) { pendingActions_ |= TA_irc_scr | TA_tlu; successState_ = LAS_Opened; } else if ((ASB_Opened) & sb) { pendingActions_ |= TA_tld | TA_scr; } else { /* Invalid: Initial, Starting */ } /* We apply local options upon receipt of a Configure-Ack (we * reset them on transmission of a Configure-Request). */ pendingActions_ |= TA_setLocalOptions; optionMessageCode_ = params->code; optionSet_ = params->options; optionSetEnd_ = params->options_end; break; } case LAE_ReceiveConfigureNakRej: { LcpEventParams_opts_t* params = (LcpEventParams_opts_t*)arg; if ((ASB_Closed | ASB_Stopped) & sb) { pendingActions_ |= TA_sta_uns; } else if ((ASB_Closing | ASB_Stopping) & sb) { /* No change */ } else if ((ASB_RequestSent) & sb) { pendingActions_ |= TA_irc_scr | TA_scr; } else if ((ASB_AckReceived) & sb) { pendingActions_ |= TA_scr; successState_ = LAS_RequestSent; } else if ((ASB_AckSent) & sb) { pendingActions_ |= TA_irc_scr | TA_scr; } else if ((ASB_Opened) & sb) { pendingActions_ |= TA_tld | TA_scr; } else { /* Invalid: Initial, Starting */ } /* We apply local options upon receipt of a Configure-Ack (we * reset them on transmission of a Configure-Request). */ pendingActions_ |= TA_setLocalOptions; optionMessageCode_ = params->code; optionSet_ = params->options; optionSetEnd_ = params->options_end; break; } case LAE_ReceiveTerminateRequest: { LcpEventParams_term_t* params = (LcpEventParams_term_t*)arg; if ((ASB_Closed | ASB_Stopped | ASB_Closing | ASB_Stopping | ASB_RequestSent | ASB_AckReceived | ASB_AckSent | ASB_Opened) & sb) { if (ASB_Opened & sb) { pendingActions_ |= TA_tld | TA_zrc | TA_sta_rep; successState_ = LAS_Stopping; } else { pendingActions_ |= TA_sta_rep; if ((ASB_AckReceived | ASB_AckSent) & sb) { successState_ = LAS_RequestSent; } } pendingSxxKey_ = params->sta_key; } break; } case LAE_ReceiveTerminateAck: { break; } case LAE_ReceveUnknownCode: case LAE_ReceiveCodeProtocolReject: case LAE_ReceiveEchoDiscardRequestReply: break; } return SUCCESS; } error_t processEventActions_ () { frame_key_t key = 0; error_t rc = SUCCESS; transitionActions_t action; bool suspended = FALSE; transitionActions_t in_actions; in_actions = pendingActions_; rc = resumeResult_; resumeResult_ = SUCCESS; do { action = 0; if (pendingActions_) { action = 1; while (action && (! (pendingActions_ & action))) { action <<= 1; } } //printf("pAE %lx %lx %d %d %d : %d\r\n", action, pendingActions_, currentState_, successState_, failState_, rc); pendingActions_ &= ~action; lastAction_ = action; /* @TODO@ is this needed? */ /* If the action is one that restarts the timer and decrements * the restart counter, do the decrement now. We'll schedule * the timer once the disposition of the corresponding send is * known. */ if (restartCounterAction_ == action) { --restartCounter_; } switch (action) { case TA_noop: break; case TA_tlf: signal LcpAutomaton.thisLayerFinished(); break; case TA_tld: signal LcpAutomaton.thisLayerDown(); break; case TA_zrc: initializeRestartCounter(TA_sta_rep); restartKey_ = pendingSxxKey_; break; case TA_irc_scr: initializeRestartCounter(TA_scr); break; case TA_irc_str: { initializeRestartCounter(TA_str); break; } case TA_resetRemoteOptions: call PppConfigure.setRemoteOptions(0, 0); break; #if 0 /* Only and always done in TA_scr. */ case TA_resetLocalOptions: call PppConfigure.setLocalOptions(0, 0); break; #endif case TA_scr: if (SUCCESS == rc) { call PppConfigure.setLocalOptions(PppControlProtocolCode_ConfigureAck, 0, 0); } if (SUCCESS == rc) { rc = call ConfigureRequest.invoke(0, &key); } if ((SUCCESS == rc) && key) { restartKey_ = key; resumeKey_ = key; suspended = TRUE; } else { restartTimer_(); } break; case TA_sta_uns: if (SUCCESS == rc) { rc = call TerminateAck.invoke(0, &key); } if ((SUCCESS == rc) && key) { resumeKey_ = key; suspended = TRUE; } break; case TA_sta_rep: /*FALLTHRU*/ case TA_sca: /*FALLTHRU*/ case TA_scn: { if (SUCCESS == rc) { rc = call Ppp.sendOutputFrame(pendingSxxKey_); } if (SUCCESS == rc) { resumeKey_ = pendingSxxKey_; suspended = TRUE; } else { resumeKey_ = restartKey_ = 0; (void)call Ppp.releaseOutputFrame(pendingSxxKey_); } pendingSxxKey_ = 0; break; } case TA_str: case TA_scj: case TA_ser: /* @TODO@ */ break; case TA_setLocalOptions: /*FALLTHRU*/ case TA_setRemoteOptions: if (TA_setLocalOptions == action) { call PppConfigure.setLocalOptions(optionMessageCode_, optionSet_, optionSetEnd_); } else { call PppConfigure.setRemoteOptions(optionSet_, optionSetEnd_); } break; case TA_tlu: signal LcpAutomaton.thisLayerUp(); break; case TA_tls: signal LcpAutomaton.thisLayerStarted(); break; } } while (action && (SUCCESS == rc) && (! suspended)); if (suspended) { currentState_ = LAS_TRANSIENT; } else { bool disable_restart_timer; LcpAutomatonState_e end_state; //printf("FSA %lx %d rc=%d succ=%d fail=%d\r\n", in_actions, currentState_, rc, successState_, failState_); if (SUCCESS == rc) { currentState_ = successState_; } else { currentState_ = failState_; } disable_restart_timer = ! (ASB_TimerRunningStates & (1 << currentState_)); if (disable_restart_timer) { restartKey_ = 0; } end_state = currentState_; optionSet_ = optionSetEnd_ = 0; if (pendingSxxKey_) { (void)call Ppp.releaseOutputFrame(pendingSxxKey_); } pendingSxxKey_ = 0; signal LcpAutomaton.transitionCompleted(end_state); if (disable_restart_timer) { call RestartTimer.stop(); } } return rc; } error_t processEvent_ (LcpAutomatonEvent_e evt, void* arg) { error_t rc; rc = calculateEventActions_(evt, arg); if (ERETRY == rc) { return rc; } /* In all other cases, we're responsible for resources. * processEventActions_ handles them. */ return processEventActions_(); } command error_t LcpAutomaton.signalEvent (LcpAutomatonEvent_e evt, void* params) { return processEvent_(evt, params); } default event void LcpAutomaton.transitionCompleted (LcpAutomatonState_e state) { } command error_t LcpOptions.set (const LcpAutomatonOptions_t* new_options) { return FAIL; } command LcpAutomatonOptions_t LcpOptions.get () { return options_; } command error_t LcpAutomaton.up () { return processEvent_(LAE_Up, 0); } command error_t LcpAutomaton.down () { return processEvent_(LAE_Down, 0); } command error_t LcpAutomaton.open () { return processEvent_(LAE_Open, 0); } command error_t LcpAutomaton.close () { return processEvent_(LAE_Close, 0); } default event void LcpAutomaton.thisLayerUp () { } default event void LcpAutomaton.thisLayerDown () { } default event void LcpAutomaton.thisLayerStarted () { } default event void LcpAutomaton.thisLayerFinished () { } } tinyos-2.1.2+dfsg/tos/lib/ppp/LinkControlProtocolC.nc000066400000000000000000000113771207233610700225510ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" #include "lcp.h" #include "HdlcFraming.h" /** The component that supports the Link Control Protocol of RFC1661. * * @author Peter A. Bigot */ configuration LinkControlProtocolC { provides { interface PppProtocol; interface LcpAutomaton; interface PppProtocolCodeSupport as ProtocolReject; interface PppProtocolCodeSupport as ConfigureRequest; } uses { interface Ppp; interface PppRejectedProtocol; interface GetSetOptions as HdlcFramingOptions; interface GetSetOptions as PppOptions; } enum { /** Publish the protocol number to which this component should be * wired in the PppC component */ Protocol = PppProtocol_LinkControlProtocol, }; } implementation { components LinkControlProtocolP as ProtocolC; PppProtocol = ProtocolC; ProtocolReject = ProtocolC; PppRejectedProtocol = ProtocolC; HdlcFramingOptions = ProtocolC; PppOptions = ProtocolC; /* LCP inhibits compression, and has four supported options */ components new PppConfigureEngineC(Protocol, TRUE, 4) as PppConfigureEngineC; ConfigureRequest = PppConfigureEngineC.ConfigureRequest; PppConfigureEngineC.PppProtocolOption[LCPOpt_AddressControlFieldCompression] -> ProtocolC.AddressControlFieldCompressionOption; #if PPP_LCP_ENABLE_PCOMP PppConfigureEngineC.PppProtocolOption[LCPOpt_ProtocolFieldCompression] -> ProtocolC.ProtocolFieldCompressionOption; #endif /* PPP_LCP_ENABLE_PCOMP */ PppConfigureEngineC.PppProtocolOption[LCPOpt_MaximumReceiveUnit] -> ProtocolC.MaximumReceiveUnitOption; PppConfigureEngineC.PppProtocolOption[LCPOpt_AsyncControlCharacterMap] -> ProtocolC.AsyncControlCharacterMapOption; /* Allocate a coordinator, and link in the supported codes */ components new PppProtocolCodeCoordinatorC(Protocol) as CoordinatorC; ProtocolC.PppProtocolCodeCoordinator -> CoordinatorC; CoordinatorC.CodeHandler[PppConfigureEngineC.Code_ConfigureRequest] -> PppConfigureEngineC.ConfigureRequest; CoordinatorC.CodeHandler[PppConfigureEngineC.Code_ConfigureAck] -> PppConfigureEngineC.ConfigureAck; CoordinatorC.CodeHandler[PppConfigureEngineC.Code_ConfigureNak] -> PppConfigureEngineC.ConfigureNak; CoordinatorC.CodeHandler[PppConfigureEngineC.Code_ConfigureReject] -> PppConfigureEngineC.ConfigureReject; CoordinatorC.CodeHandler[PppConfigureEngineC.Code_TerminateRequest] -> PppConfigureEngineC.TerminateRequest; CoordinatorC.CodeHandler[PppConfigureEngineC.Code_TerminateAck] -> PppConfigureEngineC.TerminateAck; CoordinatorC.CodeHandler[PppControlProtocolCode_ProtocolReject] -> ProtocolC.ProtocolReject; /* Hook in the LCP automaton. Inhibit protocol compression. */ components new LcpAutomatonC(Protocol, TRUE); ProtocolC.LcpAutomaton -> LcpAutomatonC; PppConfigureEngineC.LcpAutomaton -> LcpAutomatonC; LcpAutomatonC.ConfigureRequest -> PppConfigureEngineC.ConfigureRequest; LcpAutomatonC.TerminateAck -> PppConfigureEngineC.TerminateAck; LcpAutomatonC.PppConfigure -> PppConfigureEngineC; LcpAutomaton = LcpAutomatonC; /* Whatever provides Ppp needs to go to all these components */ Ppp = ProtocolC; Ppp = CoordinatorC; Ppp = PppConfigureEngineC; Ppp = LcpAutomatonC; } tinyos-2.1.2+dfsg/tos/lib/ppp/LinkControlProtocolP.nc000066400000000000000000000432661207233610700225700ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" #include "lcp.h" #include "LcpAutomaton.h" module LinkControlProtocolP { provides { interface PppProtocol; interface PppProtocolCodeSupport as ProtocolReject; interface PppProtocolOption as AddressControlFieldCompressionOption; #if PPP_LCP_ENABLE_PCOMP interface PppProtocolOption as ProtocolFieldCompressionOption; #endif /* PPP_LCP_ENABLE_PCOMP */ interface PppProtocolOption as MaximumReceiveUnitOption; interface PppProtocolOption as AsyncControlCharacterMapOption; } uses { interface Ppp; interface PppProtocolCodeCoordinator; interface GetSetOptions as HdlcFramingOptions; interface GetSetOptions as PppOptions; interface PppRejectedProtocol; interface LcpAutomaton; } enum { Protocol = PppProtocol_LinkControlProtocol, }; } implementation { /** Compressed booleans to identify those options for which * negotiation is permitted. */ struct { uint8_t accomp:1; uint8_t pcomp:1; uint8_t mru:1; uint8_t accm:1; } isNegotiable = { accomp : TRUE, pcomp : TRUE, mru : TRUE, accm : TRUE }; event void Ppp.outputFrameTransmitted (frame_key_t key, error_t err) { } command unsigned int PppProtocol.getProtocol () { return Protocol; } command error_t PppProtocol.rejectedByPeer (const uint8_t* data, const uint8_t* data_end) { /* Not sure what to do about this, since the peer could only send * a Protocol-Reject message if it actually implemented the * Link-Control-Protocol. */ return SUCCESS; } event void LcpAutomaton.transitionCompleted (LcpAutomatonState_e state) { } event void LcpAutomaton.thisLayerUp () { } event void LcpAutomaton.thisLayerDown () { } event void LcpAutomaton.thisLayerStarted () { } event void LcpAutomaton.thisLayerFinished () { } /* ============================== */ /* AddressControlFieldCompression */ /* ACCOMP is sent in a request to indicate that local can receive * frames without adddress and control fields. Ack transmission * (remote) acknowledges permission to suppress ACF in transmitted * packets. Ack reception (local) has no meaning, as we need to be * able to interpret packets with and without compression. */ command uint8_t AddressControlFieldCompressionOption.getType () { return LCPOpt_AddressControlFieldCompression; } command bool AddressControlFieldCompressionOption.isNegotiable () { return isNegotiable.accomp; } command void AddressControlFieldCompressionOption.setNegotiable (bool is_negotiable) { isNegotiable.accomp = is_negotiable; } command uint8_t AddressControlFieldCompressionOption.considerRequest (const uint8_t* dp, const uint8_t* dpe) { return PppControlProtocolCode_ConfigureAck; } command uint8_t* AddressControlFieldCompressionOption.appendRequest (uint8_t* dp, const uint8_t* dpe) { return dp; } command uint8_t* AddressControlFieldCompressionOption.appendNakValue (const uint8_t* sp, const uint8_t* spe, uint8_t* dp, const uint8_t* dpe) { return dp; } command void AddressControlFieldCompressionOption.setRemote (const uint8_t* dp, const uint8_t* dpe) { HdlcFramingOptions_t hdlcopt; /* We have accepted that the remote can receive frames with * address and control fields compressed. Suppress them on * transmission. */ hdlcopt = call HdlcFramingOptions.get(); hdlcopt.txSuppressAddressControl = (0 != dp); call HdlcFramingOptions.set(&hdlcopt); } command void AddressControlFieldCompressionOption.setLocal (const uint8_t* dp, const uint8_t* dpe) { HdlcFramingOptions_t hdlcopt; /* The peer has accepted that we can receive frames with address * and control fields compressed. Suppress them on reception. */ hdlcopt = call HdlcFramingOptions.get(); hdlcopt.rxSuppressAddressControl = (0 != dp); call HdlcFramingOptions.set(&hdlcopt); } command void AddressControlFieldCompressionOption.processNakValue (const uint8_t* dp, const uint8_t* dpe) { call AddressControlFieldCompressionOption.setNegotiable(FALSE); } command void AddressControlFieldCompressionOption.reset () { call AddressControlFieldCompressionOption.setNegotiable(TRUE); } #if PPP_LCP_ENABLE_PCOMP /* ======================== */ /* ProtocolFieldCompression */ /* PCOMP is sent in a request to indicate that local can receive * frames without adddress and control fields. Ack transmission * (remote) acknowledges permission to compress protocols in * transmitted packets. Ack reception (local) has no meaning, as we * need to be able to interpret packets with and without * compression. */ command uint8_t ProtocolFieldCompressionOption.getType () { return LCPOpt_ProtocolFieldCompression; } command bool ProtocolFieldCompressionOption.isNegotiable () { return isNegotiable.pcomp; } command void ProtocolFieldCompressionOption.setNegotiable (bool is_negotiable) { isNegotiable.pcomp = is_negotiable; } command uint8_t ProtocolFieldCompressionOption.considerRequest (const uint8_t* dp, const uint8_t* dpe) { return PppControlProtocolCode_ConfigureAck; } command uint8_t* ProtocolFieldCompressionOption.appendRequest (uint8_t* dp, const uint8_t* dpe) { return dp; } command uint8_t* ProtocolFieldCompressionOption.appendNakValue (const uint8_t* sp, const uint8_t* spe, uint8_t* dp, const uint8_t* dpe) { return dp; } command void ProtocolFieldCompressionOption.setRemote (const uint8_t* dp, const uint8_t* dpe) { PppOptions_t opt; /* We have accepted that the remote can receive frames with the * protocol field compressed. Compress it on transmission. */ opt = call PppOptions.get(); opt.txProtocolFieldCompression = (0 != dp); call PppOptions.set(&opt); } command void ProtocolFieldCompressionOption.setLocal (const uint8_t* dp, const uint8_t* dpe) { PppOptions_t opt; /* The peer has accepted that we can receive frames with the * protocol field compressed. Try reading them that way on * reception. */ opt = call PppOptions.get(); opt.rxProtocolFieldCompression = (0 != dp); call PppOptions.set(&opt); } command void ProtocolFieldCompressionOption.processNakValue (const uint8_t* dp, const uint8_t* dpe) { call ProtocolFieldCompressionOption.setNegotiable(FALSE); } command void ProtocolFieldCompressionOption.reset () { call ProtocolFieldCompressionOption.setNegotiable(TRUE); } #endif /* PPP_LCP_ENABLE_PCOMP */ /* ================== */ /* MaximumReceiveUnit */ enum { PPP_DefaultMRU = 1500, }; uint16_t proposedMRU_ = PPP_PREFERRED_MRU; /* MRU is sent in a request to indicate that local can receive * frames with information fields that exceed the PPP default, or to * request that the remote transmit shorter frames. Ack * transmission (remote) indicates a promise to transmit no more * than the MRU in each frame. Ack reception (local) indicates we * might not receive messages larger than the MRU. */ command uint8_t MaximumReceiveUnitOption.getType () { return LCPOpt_MaximumReceiveUnit; } command bool MaximumReceiveUnitOption.isNegotiable () { PppOptions_t opt = call PppOptions.get(); return isNegotiable.mru && (PPP_DefaultMRU != opt.rxMaximumReceiveUnit); } command void MaximumReceiveUnitOption.setNegotiable (bool is_negotiable) { isNegotiable.mru = is_negotiable; } command uint8_t MaximumReceiveUnitOption.considerRequest (const uint8_t* dp, const uint8_t* dpe) { /* Although we may not be able to support the default MRU on * reception, there's no facility to force the remote to negotiate * the MRU option. Best we can do is, if they sent it, make sure * it's acceptable: i.e., doesn't exceed the maximum, or is what * we proposed. */ uint16_t tx_mru = (dp[0] << 8) | dp[1]; if ((tx_mru > PPP_MAXIMUM_MRU) && (proposedMRU_ != tx_mru)) { return PppControlProtocolCode_ConfigureNak; } return PppControlProtocolCode_ConfigureAck; } command uint8_t* MaximumReceiveUnitOption.appendRequest (uint8_t* dp, const uint8_t* dpe) { if (dpe < (dp+2)) { return 0; } *dp++ = (proposedMRU_ >> 8); *dp++ = (proposedMRU_ & 0x0FF); return dp; } command uint8_t* MaximumReceiveUnitOption.appendNakValue (const uint8_t* sp, const uint8_t* spe, uint8_t* dp, const uint8_t* dpe) { if (dpe < (dp+2)) { return 0; } *dp++ = (PPP_PREFERRED_MRU >> 8); *dp++ = (PPP_PREFERRED_MRU & 0x0FF); return dp; } command void MaximumReceiveUnitOption.setRemote (const uint8_t* dp, const uint8_t* dpe) { PppOptions_t opt; uint16_t value; /* We have accepted the size requested by the remote. Limit * transmissions to that size. */ opt = call PppOptions.get(); if (dp) { value = (dp[0] << 8) | dp[1]; } else { value = PPP_PREFERRED_MRU; } opt.txMaximumReceiveUnit = value; call PppOptions.set(&opt); } command void MaximumReceiveUnitOption.setLocal (const uint8_t* dp, const uint8_t* dpe) { PppOptions_t opt; uint16_t value; /* The peer has accepted our preferred size. Configure receptions * to expect it. */ opt = call PppOptions.get(); if (dp) { value = (dp[0] << 8) | dp[1]; } else { value = PPP_PREFERRED_MRU; } opt.rxMaximumReceiveUnit = value; call PppOptions.set(&opt); } command void MaximumReceiveUnitOption.processNakValue (const uint8_t* dp, const uint8_t* dpe) { proposedMRU_ = (dp[0] << 8) | dp[1]; } command void MaximumReceiveUnitOption.reset () { call MaximumReceiveUnitOption.setNegotiable(TRUE); proposedMRU_ = PPP_PREFERRED_MRU; } /* ================== */ /* AsyncControlCharacterMap */ enum { HDLC_DefaultACCM = ~0UL, HDLC_PreferredACCM = 0UL, }; uint32_t proposedACCM_; /* ACCM is sent in a request to indicate that local does not require * certain control characters to be mapped for transparency. Ack * transmission (remote) indicates a promise to escape the characters * specified in the ACCM. Ack reception (local) indicates that we * can expect the characters not marked in the map to be received * unescaped. * * Local is reset prior to SCR. On local reset, restore both rxSCCM * and txSCCM to defaults. * * Local is set on CA reception. On local set, set rxACCM. * * Remote is set after CA transmission. On remote set, set txACCM. * * When is remote reset? */ command uint8_t AsyncControlCharacterMapOption.getType () { return LCPOpt_AsyncControlCharacterMap; } command bool AsyncControlCharacterMapOption.isNegotiable () { return isNegotiable.accm; } command void AsyncControlCharacterMapOption.setNegotiable (bool is_negotiable) { isNegotiable.accm = is_negotiable; } command uint8_t AsyncControlCharacterMapOption.considerRequest (const uint8_t* dp, const uint8_t* dpe) { return PppControlProtocolCode_ConfigureAck; } command uint8_t* AsyncControlCharacterMapOption.appendRequest (uint8_t* dp, const uint8_t* dpe) { nx_uint32_t* np = (nx_uint32_t*)dp; if (dpe < (dp+1)) { return 0; } *np = proposedACCM_; return (uint8_t*)(np+1); } command uint8_t* AsyncControlCharacterMapOption.appendNakValue (const uint8_t* sp, const uint8_t* spe, uint8_t* dp, const uint8_t* dpe) { nx_uint32_t* np = (nx_uint32_t*)dp; if (dpe < (dp+1)) { return 0; } *np = HDLC_PreferredACCM; return (uint8_t*)(np+1); } command void AsyncControlCharacterMapOption.setRemote (const uint8_t* dp, const uint8_t* dpe) { HdlcFramingOptions_t opt; uint32_t value; /* We have accepted the map requested by the remote. Perform * transparency operations on characters in that map. */ opt = call HdlcFramingOptions.get(); if (dp) { value = *(nx_uint32_t*)dp; } else { value = HDLC_DefaultACCM; } opt.txAsyncControlCharacterMap = value; call HdlcFramingOptions.set(&opt); } command void AsyncControlCharacterMapOption.setLocal (const uint8_t* dp, const uint8_t* dpe) { HdlcFramingOptions_t opt; uint32_t value; /* The peer has accepted our proposed map. This has no effect on * our behavior. */ opt = call HdlcFramingOptions.get(); if (dp) { value = *(nx_uint32_t*)dp; } else { value = HDLC_DefaultACCM; } opt.rxAsyncControlCharacterMap = value; call HdlcFramingOptions.set(&opt); } command void AsyncControlCharacterMapOption.processNakValue (const uint8_t* dp, const uint8_t* dpe) { proposedACCM_ = *(nx_uint32_t*)dp; } command void AsyncControlCharacterMapOption.reset () { call AsyncControlCharacterMapOption.setNegotiable(TRUE); proposedACCM_ = HDLC_PreferredACCM; } /* ======================================== */ command uint8_t ProtocolReject.getCode () { return PppControlProtocolCode_ProtocolReject; } command error_t ProtocolReject.process (uint8_t identifier, const uint8_t* data, const uint8_t* data_end) { uint16_t protocol = 0; protocol = (data[0] << 8) + data[1]; return call PppRejectedProtocol.rejected(protocol, data, data_end); } /** Invoke some code-specific operation */ command error_t ProtocolReject.invoke (void* param_, frame_key_t* keyp) { error_t rc = EINVAL; protocolReject_param_t* param = (protocolReject_param_t*)param_; if (LAS_Opened == call LcpAutomaton.getState()) { /* Due to implementation choice, we can't reject a protocol value * of zero, which is fine since that's an illegal protocol value. * Just drop those on the floor. */ if (0 != param->protocol) { rc = call PppProtocolCodeCoordinator.rejectPacket(param->protocol, param->information, param->information + param->information_length, keyp); } } return rc; } command error_t PppProtocol.process (const uint8_t* information, unsigned int information_length) { return call PppProtocolCodeCoordinator.dispatch(information, information_length); } } tinyos-2.1.2+dfsg/tos/lib/ppp/Ppp.nc000066400000000000000000000116661207233610700172260ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" /** Core functions provided by the PPP infrastructure: specifically, * management of the internal buffers used for outgoing and incoming * messages. * * @author Peter A. Bigot */ interface Ppp { /** Obtain storage for an outbound message. * * The frame is initialized to hold a message associated with the * given protocol. It is the callers responsibility to fill in the * remainder of the message, then to invoke either sendOutputFrame * if the message is to be transmitted or releaseOutputFrame if the * message is to be dropped. * * It is implementation-defined whether multiple output frames are * available for use. If no output frames are available, this * command will return a null pointer. * * @return A pointer to the information field of the output message, * or a null pointer if no output buffers are available. * * @param protocol The protocol to which the message will belong. * * @param frame_endp Secondary output value specyfing the address at * which the frame ends. Attempts to store at or beyond this * address result in undefined behavior. * * @param inhibit_compression Indicate that, for this protocol, all * non-default compression should be inhibited: in particular this * means the protocol will always require two octets, and the * address and control fields will be present. Required for LCP. * * @param keyp Where to store the key that must be used to identify * this output frame to the other output-related commands. Assigned * only if this command returns a non-null pointer. */ command uint8_t* getOutputFrame (unsigned int protocol, const uint8_t** frame_endp, bool inhibit_compression, frame_key_t* keyp); /** Mark the maximum length of the frame. * * frame_end must lie within the frame identified by the given key. * * This may release memory for use in other output frames. */ command error_t fixOutputFrameLength (frame_key_t, const uint8_t* frame_end); /** Transmit an output frame. * * @TODO@ Auto-fix length of buffer * * The frame will be submitted for transmission. If this command * returns SUCCESS, transmission will continue in the background and * its completion will be indicated by the outputFrameTransmitted * event. With any other return value the transmission failed. * * The caller is not permitted to modify the memory of this frame * after invoking this command. If this command returns SUCCESS, * the caller may hold on to the frame_end value until the * subsequent outputFrameTransmitted event is signalled. */ command error_t sendOutputFrame (frame_key_t key); /** Cancel transmission of an output frame. * * The caller is not permitted to access the memory of this frame * after invoking this command. */ command error_t releaseOutputFrame (frame_key_t key); /** Indication that transmission of an output message has been * resolved. The caller may read the message contents until the * event returns. * * @param key The key that identifies the frame that was transmitted * @param result The disposition of the transmission */ event void outputFrameTransmitted (frame_key_t key, error_t result); } tinyos-2.1.2+dfsg/tos/lib/ppp/PppC.nc000066400000000000000000000060771207233610700173310ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" #include "HdlcFraming.h" /** Top-level configuration for a PPP instance, not including LCP support. * @author Peter A. Bigot */ configuration PppC { uses { interface PppProtocol[ uint16_t protocol ]; interface PppProtocolReject; interface HdlcUart; interface StdControl as UartControl; } provides { interface SplitControl; interface Ppp; interface PppRejectedProtocol; interface GetSetOptions as PppOptions; interface GetSetOptions as HdlcFramingOptions; } } implementation { components PppP; PppProtocol = PppP; PppProtocolReject = PppP; PppRejectedProtocol = PppP; SplitControl = PppP; Ppp = PppP; PppOptions = PppP; /** Maximum output frame comprises two octects for the protocol, and * the maximum supported MRU. CRC octets are not stored in the * outgoing frame. */ components new FragmentPoolC(2 + PPP_MAXIMUM_MRU, PPP_HDLC_TX_FRAME_LIMIT) as TransmitFramePoolC; PppP.TransmitFramePool -> TransmitFramePoolC; /* Maximum input frame comprises two octets for the protocol, the * maximum supported MRU, and two octets for the CRC. * Address/control field bytes are not stored. */ components new HdlcFramingC(2 + PPP_MAXIMUM_MRU + 2, PPP_HDLC_RX_FRAME_LIMIT); PppP.HdlcFraming -> HdlcFramingC; PppP.HdlcControl -> HdlcFramingC; HdlcFramingOptions = HdlcFramingC; UartControl = HdlcFramingC; HdlcUart = HdlcFramingC; components LedC; PppP.MultiLed -> LedC; } tinyos-2.1.2+dfsg/tos/lib/ppp/PppConfigure.nc000066400000000000000000000067771207233610700210770ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Provide facility to set a complete set of options for a given * protocol. * * @author Peter A. Bigot */ interface PppConfigure { /** Completely reset all options prior to a new negotiation sequence. * * This brings things back to their power-up default, and is * executed when the link goes down. This includes default proposed * local and remote values, as well as resetting whether the option * is negotiable. */ command void resetOptions (); /** Set (reset) the local value for a protocol's options. * * This is invoked to set options by passing an encoded option set * extracted from a received Configure-Ack; to convey proposed * alternatives from a Configure-Nak; and to disable negotiation * from a Configure-Reject. If the code is for Configure-Ack, the * content of this set must match the previously transmitted * Configure-Request. * * This is invoked with null pointers to reset the local values * prior to transmission of a Configure-Request. * * @param code The message type from which the options were received. * @param dp Start of the encoded option sequence; null for reset * @param dpe End of the encoded option sequence; null for reset */ command void setLocalOptions (uint8_t code, const uint8_t* dp, const uint8_t* dpe); /** Set (reset) the remote value for a protocol's options. * * This is invoked to set options by passing an encoded option set * extracted from a transmitted Configure-Ack (equivalently, an * accepted received Configure-Request). * * This is invoked with null pointers to reset the remote values * upon receipt of a Configure-Request. * * @param dp Start of the encoded option sequence * @param dpe End of the encoded option sequence */ command void setRemoteOptions (const uint8_t* dp, const uint8_t* dpe); } tinyos-2.1.2+dfsg/tos/lib/ppp/PppConfigureEngineC.nc000066400000000000000000000102601207233610700223060ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" /** Implement the four messages used by the Link Control Protocol to * negotiate mutually acceptable options for a PPP session. * * @param Protocol_ the 16-bit protocol value * * @param InhibitCompression If true, this protocol requires that * optional frame compression be inhibited for its packets. * * @param NumOptions An upper bound on the number of options that will * be linked into this engine. * * @author Peter A. Bigot */ generic configuration PppConfigureEngineC (uint16_t Protocol, bool InhibitCompression, uint8_t NumOptions) { uses { interface Ppp; interface PppProtocolOption[ uint8_t type ]; interface LcpAutomaton; } provides { interface PppConfigure; interface PppProtocolCodeSupport as ConfigureRequest; interface PppProtocolCodeSupport as ConfigureAck; interface PppProtocolCodeSupport as ConfigureNak; interface PppProtocolCodeSupport as ConfigureReject; interface PppProtocolCodeSupport as TerminateRequest; interface PppProtocolCodeSupport as TerminateAck; } enum { /** RFC 1661 section 5.1. Data field contains a sequence of options. */ Code_ConfigureRequest = PppControlProtocolCode_ConfigureRequest, /** RFC 1661 section 5.2. Data field contains a sequence of options. */ Code_ConfigureAck = PppControlProtocolCode_ConfigureAck, /** RFC 1661 section 5.3. Data field contains a sequence of options. */ Code_ConfigureNak = PppControlProtocolCode_ConfigureNak, /** RFC 1661 section 5.4. Data field contains a sequence of options. */ Code_ConfigureReject = PppControlProtocolCode_ConfigureReject, /** RFC 1661 section 5.5. Data field contains a sequence of options. */ Code_TerminateRequest = PppControlProtocolCode_TerminateRequest, /** RFC 1661 section 5.5. Data field contains a sequence of options. */ Code_TerminateAck = PppControlProtocolCode_TerminateAck, }; } implementation { components new PppConfigureEngineP(Protocol, InhibitCompression, NumOptions); Ppp = PppConfigureEngineP; PppProtocolOption = PppConfigureEngineP; LcpAutomaton = PppConfigureEngineP; PppConfigure = PppConfigureEngineP; ConfigureRequest = PppConfigureEngineP.ConfigureRequest; ConfigureAck = PppConfigureEngineP.ConfigureAck; ConfigureNak = PppConfigureEngineP.ConfigureNak; ConfigureReject = PppConfigureEngineP.ConfigureReject; TerminateRequest = PppConfigureEngineP.TerminateRequest; TerminateAck = PppConfigureEngineP.TerminateAck; components MainC; MainC.SoftwareInit -> PppConfigureEngineP; } tinyos-2.1.2+dfsg/tos/lib/ppp/PppConfigureEngineP.nc000066400000000000000000000434761207233610700223420ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" generic module PppConfigureEngineP (uint16_t Protocol, bool InhibitCompression, uint8_t NumOptions) { uses { interface Ppp; interface PppProtocolOption[ uint8_t type ]; interface LcpAutomaton; } provides { interface Init; interface PppConfigure; interface PppProtocolCodeSupport as ConfigureRequest; interface PppProtocolCodeSupport as ConfigureAck; interface PppProtocolCodeSupport as ConfigureNak; interface PppProtocolCodeSupport as ConfigureReject; interface PppProtocolCodeSupport as TerminateRequest; interface PppProtocolCodeSupport as TerminateAck; } } implementation { enum { /** RFC 1661 section 5.1. Data field contains a sequence of options. */ Code_ConfigureRequest = PppControlProtocolCode_ConfigureRequest, /** RFC 1661 section 5.2. Data field contains a sequence of options. */ Code_ConfigureAck = PppControlProtocolCode_ConfigureAck, /** RFC 1661 section 5.3. Data field contains a sequence of options. */ Code_ConfigureNak = PppControlProtocolCode_ConfigureNak, /** RFC 1661 section 5.4. Data field contains a sequence of options. */ Code_ConfigureReject = PppControlProtocolCode_ConfigureReject, /** RFC 1661 section 5.5. Data field contains a sequence of options. */ Code_TerminateRequest = PppControlProtocolCode_TerminateRequest, /** RFC 1661 section 5.5. Data field contains a sequence of options. */ Code_TerminateAck = PppControlProtocolCode_TerminateAck, }; event void Ppp.outputFrameTransmitted (frame_key_t key, error_t err) { } event void LcpAutomaton.transitionCompleted (LcpAutomatonState_e state) { } event void LcpAutomaton.thisLayerUp () { } event void LcpAutomaton.thisLayerDown () { } event void LcpAutomaton.thisLayerStarted () { } event void LcpAutomaton.thisLayerFinished () { call PppConfigure.resetOptions(); } /** List of linked option types, as determined on startup. Reserve * one space for 0 which marks end of list. */ uint8_t optionTypes_[NumOptions+1]; command error_t Init.init () { uint8_t* otp = optionTypes_; uint8_t* otpe = otp + sizeof(optionTypes_) / sizeof(*otp) - 1; uint8_t type = 0; while ((0 != ++type) && (otp < otpe)) { if (0 != call PppProtocolOption.getType[type]()) { *otp++ = type; } } *otp = 0; return SUCCESS; } void setOptions (const uint8_t* sp, const uint8_t* spe, uint8_t code, bool use_local) { //printf("OPTIONS %s %s\r\n", (sp ? "set" : "reset"), (use_local ? "local" : "remote")); if (! sp) { uint8_t* otp = optionTypes_; while (*otp) { uint8_t type = *otp++; if (use_local) { call PppProtocolOption.setLocal[type](0, 0); } else { call PppProtocolOption.setRemote[type](0, 0); } } } else { while ((sp+2) <= spe) { uint8_t type = *sp++; uint8_t length = *sp++ - 2; /* Subtract to account for type and length */ if (0 == call PppProtocolOption.getType[type]()) { /* This shouldn't happen: the options should have been * validated. */ } else { if (use_local) { switch (code) { case Code_ConfigureAck: (void)call PppProtocolOption.setLocal[type](sp, sp + length); break; case Code_ConfigureNak: (void)call PppProtocolOption.processNakValue[type](sp, sp + length); break; case Code_ConfigureReject: (void)call PppProtocolOption.setNegotiable[type](FALSE); break; default: break; } } else { (void)call PppProtocolOption.setRemote[type](sp, sp + length); } //printf("OPT %d set %d len %u rc %d\r\n", type, use_local, length, rc); } sp += length; } } } command void PppConfigure.resetOptions () { uint8_t* otp = optionTypes_; while (*otp) { uint8_t type = *otp++; call PppProtocolOption.reset[type](); } } command void PppConfigure.setLocalOptions (uint8_t code, const uint8_t* dp, const uint8_t* dpe) { setOptions(dp, dpe, code, TRUE); } command void PppConfigure.setRemoteOptions (const uint8_t* dp, const uint8_t* dpe) { setOptions(dp, dpe, Code_ConfigureAck, FALSE); } error_t completeInvoke_ (frame_key_t key, const uint8_t* frame_end, frame_key_t* keyp) { error_t rc = call Ppp.fixOutputFrameLength(key, frame_end); if (SUCCESS == rc) { rc = call Ppp.sendOutputFrame(key); } if (SUCCESS != rc) { (void) call Ppp.releaseOutputFrame(key); } else { if (keyp) { *keyp = key; } } return rc; } uint8_t idConfigureRequest; command uint8_t ConfigureRequest.getCode () { return Code_ConfigureRequest; } command error_t ConfigureRequest.invoke (void* param, frame_key_t* keyp) { const uint8_t* fpe; frame_key_t key; uint8_t* fp = call Ppp.getOutputFrame(Protocol, &fpe, InhibitCompression, &key); const uint8_t* frame_start = fp; uint8_t* flp; uint8_t type = 1; uint8_t* otp = optionTypes_; if (0 == fp) { return EBUSY; } *fp++ = Code_ConfigureRequest; *fp++ = ++idConfigureRequest; flp = fp; fp += 2; /* Walk all the types in order */ while (*otp) { type = *otp++; if (call PppProtocolOption.isNegotiable[type]()) { uint8_t* ofp = fp; uint8_t* lfp; /* Store the option type, reserve space for then length, * then store the proposed value. If something goes wrong, * drop the option, otherwise record the length and move * on. */ *fp++ = type; lfp = fp++; fp = call PppProtocolOption.appendRequest[type](fp, fpe); if (0 == fp) { fp = ofp; } else { *lfp = (fp - ofp); } } } { uint16_t frame_len = (fp - frame_start); *flp++ = (frame_len >> 8); *flp++ = (frame_len & 0x0FF); } return completeInvoke_(key, fp, keyp); } command error_t ConfigureRequest.process (uint8_t identifier, const uint8_t* sp, const uint8_t* spe) { error_t rc; uint8_t overall_disposition = Code_ConfigureRequest; // initial value forces reset in loop const uint8_t* fpe; frame_key_t key; uint8_t* fp = call Ppp.getOutputFrame(Protocol, &fpe, InhibitCompression, &key); uint8_t* dp = 0; LcpEventParams_rcr_t evt_params; if (0 == fp) { return EBUSY; } rc = SUCCESS; while ((SUCCESS == rc) && ((sp+2) <= spe)) { uint8_t type = *sp++; uint8_t length = *sp++ - 2; /* Subtract to account for type and length */ uint8_t disposition; if (0 == call PppProtocolOption.getType[type]()) { disposition = Code_ConfigureReject; } else { disposition = call PppProtocolOption.considerRequest[type](sp, sp + length); } /* If we've downgraded to a new disposition, reset the pointers * to start constructing a new message. */ if (disposition > overall_disposition) { evt_params.options = dp = fp + 4; /* Offset by code, identifier, and length (to be written before transmission) */ overall_disposition = disposition; } /* If the disposition of the option matches the disposition of * the message we're building, tack the option value onto the * message. */ if (disposition == overall_disposition) { if (fpe < (dp+2)) { rc = ENOMEM; } else { /* @TODO@ Verify there is enough room to store the option */ *dp++ = type; if (Code_ConfigureNak == disposition) { uint8_t* lp = dp++; /* Paste on the proposed alternative. */ dp = call PppProtocolOption.appendNakValue[type](sp, sp + length, dp, fpe); if (0 == dp) { /* @TODO@ Now what? This might occur if there is a * proposed alternative option, but the outgoing frame * doesn't have room to hold it. Couldn't have checked * above, because we didn't know the option length. */ rc = ENOMEM; } /* Length is type byte plus distance from length field to end of option */ *lp = (dp - lp) + 1; } else { /* Copy from the incoming message */ *dp++ = length + 2; /* Add to account for type and length */ if (fpe < (dp + length)) { rc = ENOMEM; } else { memmove(dp, sp, length); dp += length; } } } } sp += length; } if (SUCCESS == rc) { unsigned int frame_len = dp - fp; *fp++ = overall_disposition; *fp++ = identifier; *fp++ = (frame_len >> 8); *fp++ = (frame_len & 0x0ff); rc = call Ppp.fixOutputFrameLength(key, dp); } if (SUCCESS == rc) { evt_params.good = (Code_ConfigureAck == overall_disposition); evt_params.disposition = overall_disposition; evt_params.options_end = dp; evt_params.scx_key = key; /* Signal the event. If the automaton is busy, release the output * frame and try again later. For success and all other errors, * the automaton is responsible for releasing the frame */ rc = call LcpAutomaton.signalEvent(LAE_ReceiveConfigureRequest, &evt_params); if (ERETRY == rc) { call Ppp.releaseOutputFrame(key); } } else { (void) call Ppp.releaseOutputFrame(key); } return rc; } command uint8_t ConfigureAck.getCode () { return Code_ConfigureAck; } command error_t ConfigureAck.process (uint8_t identifier, const uint8_t* data, const uint8_t* data_end) { LcpEventParams_opts_t evt_params; /* Silently drop responses to outdated requests */ if (idConfigureRequest != identifier) { return SUCCESS; } evt_params.code = Code_ConfigureAck; evt_params.options = data; evt_params.options_end = data_end; return call LcpAutomaton.signalEvent(LAE_ReceiveConfigureAck, &evt_params); } command error_t ConfigureAck.invoke (void* param, frame_key_t* keyp) { return FAIL; } error_t processNakReject (uint8_t code, uint8_t identifier, const uint8_t* data, const uint8_t* data_end) { LcpEventParams_opts_t evt_params; /* Silently drop responses to outdated requests */ if (idConfigureRequest != identifier) { return SUCCESS; } evt_params.code = code; evt_params.options = data; evt_params.options_end = data_end; return call LcpAutomaton.signalEvent(LAE_ReceiveConfigureNakRej, &evt_params); } command uint8_t ConfigureNak.getCode () { return Code_ConfigureNak; } command error_t ConfigureNak.process (uint8_t identifier, const uint8_t* data, const uint8_t* data_end) { return processNakReject(Code_ConfigureNak, identifier, data, data_end); } command error_t ConfigureNak.invoke (void* param, frame_key_t* keyp) { return FAIL; } command uint8_t ConfigureReject.getCode () { return Code_ConfigureReject; } command error_t ConfigureReject.process (uint8_t identifier, const uint8_t* data, const uint8_t* data_end) { return processNakReject(Code_ConfigureReject, identifier, data, data_end); } command error_t ConfigureReject.invoke (void* param, frame_key_t* keyp) { return FAIL; } error_t processTerminate_ (uint8_t code, const uint8_t* data, const uint8_t* data_end, frame_key_t sta_key) { LcpEventParams_term_t evt_params; evt_params.code = Code_TerminateRequest; evt_params.data = data; evt_params.data_end = data_end; evt_params.sta_key = sta_key; return call LcpAutomaton.signalEvent(LAE_ReceiveTerminateRequest, &evt_params); } uint8_t idTerminateRequest; command uint8_t TerminateRequest.getCode () { return Code_TerminateRequest; } command error_t TerminateRequest.process (uint8_t identifier, const uint8_t* data, const uint8_t* data_end) { frame_key_t key; const uint8_t* fpe; uint8_t* fp = call Ppp.getOutputFrame(Protocol, &fpe, InhibitCompression, &key); unsigned int frame_len; error_t rc; if (0 == fp) { return EBUSY; } fp[0] = Code_TerminateAck; fp[1] = identifier; frame_len = 4 + (data_end - data); if ((fp + frame_len) > fpe) { frame_len = (fpe - fp); } memcpy(fp+4, data, frame_len - 4); fp[2] = (frame_len >> 8); fp[3] = (frame_len & 0x0ff); rc = call Ppp.fixOutputFrameLength(key, fp+frame_len); if (SUCCESS != rc) { return rc; } rc = processTerminate_(Code_TerminateRequest, data, data_end, key); if (ERETRY == rc) { call Ppp.releaseOutputFrame(key); } return rc; } command error_t TerminateRequest.invoke (void* param, frame_key_t* keyp) { return FAIL; } command uint8_t TerminateAck.getCode () { return Code_TerminateAck; } command error_t TerminateAck.process (uint8_t identifier, const uint8_t* data, const uint8_t* data_end) { /* Silently drop responses to outdated requests */ if (idTerminateRequest != identifier) { return SUCCESS; } return processTerminate_(Code_TerminateAck, data, data_end, 0); } uint8_t idTerminateAck; command error_t TerminateAck.invoke (void* param, frame_key_t* keyp) { const uint8_t* fpe; frame_key_t key; uint8_t* fp = call Ppp.getOutputFrame(Protocol, &fpe, InhibitCompression, &key); if (0 == fp) { return EBUSY; } *fp++ = Code_TerminateAck; *fp++ = ++idTerminateAck; *fp++ = 0; *fp++ = 2; return completeInvoke_(key, fp, keyp); } default command uint8_t PppProtocolOption.getType[ uint8_t type ] (){ return 0; } default command bool PppProtocolOption.isNegotiable[ uint8_t type ] (){ return FALSE; } default command uint8_t PppProtocolOption.considerRequest[ uint8_t type ] (const uint8_t* dp, const uint8_t* dpe) { return Code_ConfigureReject; } default command void PppProtocolOption.setNegotiable[ uint8_t type ] (bool is_negotiable) { } default command void PppProtocolOption.reset[ uint8_t type ] () { } default command void PppProtocolOption.setLocal[ uint8_t type ] (const uint8_t* dp, const uint8_t* dpe) { } default command void PppProtocolOption.setRemote[ uint8_t type ] (const uint8_t* dp, const uint8_t* dpe) { } default command void PppProtocolOption.processNakValue[ uint8_t type ] (const uint8_t* dp, const uint8_t* dpe) { } default command uint8_t* PppProtocolOption.appendRequest[ uint8_t type ] (uint8_t* dp, const uint8_t* dpe) { return 0; } default command uint8_t* PppProtocolOption.appendNakValue[ uint8_t type ] (const uint8_t* sp, const uint8_t* spe, uint8_t* dp, const uint8_t* dpe) { return 0; } } tinyos-2.1.2+dfsg/tos/lib/ppp/PppDaemonC.nc000066400000000000000000000056171207233610700204540ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" #include "HdlcFraming.h" /** A complete PPP daemon: the basic PPP infrastructure with an * instance of Link Control Protocol already linked in. * * @author Peter A. Bigot */ configuration PppDaemonC { uses { interface PppProtocol[ uint16_t protocol ]; interface HdlcUart; interface StdControl as UartControl; } provides { interface SplitControl; interface LcpAutomaton; interface Ppp; interface GetSetOptions as PppOptions; interface GetSetOptions as HdlcFramingOptions; } } implementation { components PppDaemonP; SplitControl = PppDaemonP; components PppC; PppProtocol = PppC; HdlcUart = PppC; UartControl = PppC; PppOptions = PppC; Ppp = PppC; HdlcFramingOptions = PppC; PppDaemonP.PppControl -> PppC; components LinkControlProtocolC; PppC.PppProtocol[LinkControlProtocolC.Protocol] -> LinkControlProtocolC; LinkControlProtocolC.Ppp -> PppC; LinkControlProtocolC.HdlcFramingOptions -> PppC; LinkControlProtocolC.PppOptions -> PppC; LcpAutomaton = LinkControlProtocolC; PppDaemonP.ProtocolReject -> LinkControlProtocolC.ProtocolReject; PppDaemonP.LcpAutomaton -> LinkControlProtocolC; PppC.PppProtocolReject -> PppDaemonP; LinkControlProtocolC.PppRejectedProtocol -> PppC.PppRejectedProtocol; } tinyos-2.1.2+dfsg/tos/lib/ppp/PppDaemonP.nc000066400000000000000000000062361207233610700204670ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "lcp.h" module PppDaemonP { uses { interface LcpAutomaton; interface SplitControl as PppControl; interface PppProtocolCodeSupport as ProtocolReject; } provides { interface SplitControl; interface PppProtocolReject; } } implementation { command error_t SplitControl.start () { error_t rc; rc = call LcpAutomaton.open(); if (SUCCESS != rc) { return rc; } return call PppControl.start(); } event void PppControl.startDone (error_t rc) { if (SUCCESS == rc) { call LcpAutomaton.up(); } } default event void SplitControl.startDone (error_t error) { } event void PppControl.stopDone (error_t rc) { if (SUCCESS == rc) { call LcpAutomaton.down(); } } command error_t SplitControl.stop () { error_t rc; rc = call LcpAutomaton.close(); return call PppControl.stop(); } default event void SplitControl.stopDone (error_t error) { } command error_t PppProtocolReject.process (unsigned int protocol, const uint8_t* information, unsigned int length) { protocolReject_param_t args; args.protocol = protocol; args.information = information; args.information_length = length; return call ProtocolReject.invoke(&args, 0); } event void LcpAutomaton.transitionCompleted (LcpAutomatonState_e state) { } event void LcpAutomaton.thisLayerUp () { } event void LcpAutomaton.thisLayerDown () { } event void LcpAutomaton.thisLayerStarted () { } event void LcpAutomaton.thisLayerFinished () { } } tinyos-2.1.2+dfsg/tos/lib/ppp/PppIpv6.nc000066400000000000000000000065731207233610700177740ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "pppipv6.h" /** Interface supporting RFC5072 IPv6-over-PPP using the OSIAN/TinyOS * PPP daemon. * * This interface is intended as a bridge between the PPP daemon and a * specific implementation of IPv6, such as blip or OIP. * * @author Peter A. Bigot */ interface PppIpv6 { /** Return the negotiated IID for the local (TinyOS) end of the PPP * link. * * @return Pointer to configured IID; null pointer if the link is * not up. */ command const ppp_ipv6cp_iid_t* localIid (); /** Return the negotiated IID for the remote (PC) end of the PPP * link. * * @return Pointer to configured remote IID; null pointer if the * link is not up. */ command const ppp_ipv6cp_iid_t* remoteIid (); /** Transmit data to the remote end. * * @param message Pointer to a sequence of octets to be transmitted. * * @param len The number of bytes to transmit. * * @return SUCCESS iff a frame could be allocated and the message * transmitted. */ command error_t transmit (const uint8_t* message, unsigned int len); /** @return TRUE iff the LCP automaton is in a link-up state. */ command bool linkIsUp (); /** Signal that the PPP link has come up */ event void linkUp (); /** Signal that the PPP link has gone down */ event void linkDown (); /** Signal that a message has been received over the PPP link. * * @param message Sequence of octets received, after all * PPP-relevant framing has been removed. * * @param len Number of octets received. * * @return SUCCESS if the recipient has successfully processed the * message. Non-SUCCESS values may be used for purposes as defined * by PppProtocol.process(). */ event error_t receive (const uint8_t* message, unsigned int len); } tinyos-2.1.2+dfsg/tos/lib/ppp/PppIpv6C.nc000066400000000000000000000100001207233610700200530ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" #include "pppipv6.h" /** TinyOS PPP Network Control Protocol for IPv6 per RFC5072. * * @author Peter A. Bigot */ configuration PppIpv6C { provides { interface PppIpv6; interface PppProtocol as PppControlProtocol; interface PppProtocol; interface LcpAutomaton; } uses { interface Ppp; interface LcpAutomaton as LowerLcpAutomaton; } enum { ControlProtocol = PppProtocol_Ipv6Cp, Protocol = PppProtocol_Ipv6, }; } implementation { components PppIpv6P as ProtocolC; PppIpv6 = ProtocolC.PppIpv6; PppControlProtocol = ProtocolC.PppControlProtocol; PppProtocol = ProtocolC.PppProtocol; LowerLcpAutomaton = ProtocolC.LowerLcpAutomaton; components MainC; MainC.SoftwareInit -> ProtocolC; /* The configuration engine allows compression, and supports one option */ components new PppConfigureEngineC(ControlProtocol, FALSE, 1); PppConfigureEngineC.PppProtocolOption[Ipv6CpOpt_InterfaceIdentifier] -> ProtocolC.InterfaceIdentifierOption; ProtocolC.PppConfigure -> PppConfigureEngineC; /* Allocate a coordinator and link in the supported codes */ components new PppProtocolCodeCoordinatorC(ControlProtocol) as CoordinatorC; ProtocolC.PppProtocolCodeCoordinator -> CoordinatorC; CoordinatorC.CodeHandler[PppConfigureEngineC.Code_ConfigureRequest] -> PppConfigureEngineC.ConfigureRequest; CoordinatorC.CodeHandler[PppConfigureEngineC.Code_ConfigureAck] -> PppConfigureEngineC.ConfigureAck; CoordinatorC.CodeHandler[PppConfigureEngineC.Code_ConfigureNak] -> PppConfigureEngineC.ConfigureNak; CoordinatorC.CodeHandler[PppConfigureEngineC.Code_ConfigureReject] -> PppConfigureEngineC.ConfigureReject; CoordinatorC.CodeHandler[PppConfigureEngineC.Code_TerminateRequest] -> PppConfigureEngineC.TerminateRequest; CoordinatorC.CodeHandler[PppConfigureEngineC.Code_TerminateAck] -> PppConfigureEngineC.TerminateAck; /* Hook in the LCP automaton. */ components new LcpAutomatonC(ControlProtocol, FALSE); LcpAutomaton = LcpAutomatonC; PppConfigureEngineC.LcpAutomaton -> LcpAutomatonC; LcpAutomatonC.ConfigureRequest -> PppConfigureEngineC.ConfigureRequest; LcpAutomatonC.TerminateAck -> PppConfigureEngineC.TerminateAck; LcpAutomatonC.PppConfigure -> PppConfigureEngineC; ProtocolC.LcpAutomaton -> LcpAutomatonC; /* Whatever provides Ppp needs to go to all these components */ Ppp = ProtocolC; Ppp = CoordinatorC; Ppp = PppConfigureEngineC; Ppp = LcpAutomatonC; } tinyos-2.1.2+dfsg/tos/lib/ppp/PppIpv6P.nc000066400000000000000000000172641207233610700201130ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "pppipv6.h" module PppIpv6P { provides { interface Init; interface PppIpv6; interface PppProtocol as PppControlProtocol; interface PppProtocolOption as InterfaceIdentifierOption; interface PppProtocol; } uses { interface Ppp; interface PppConfigure; interface PppProtocolCodeCoordinator; interface LcpAutomaton; interface LcpAutomaton as LowerLcpAutomaton; } } implementation { enum { ControlProtocol = PppProtocol_Ipv6Cp, Protocol = PppProtocol_Ipv6, }; /* ============================== */ /* InterfaceIdentifier */ bool negotiateIID_ = TRUE; bool linkIsUp_; ppp_ipv6cp_iid_t localIID_; ppp_ipv6cp_iid_t proposedLocalIID_; ppp_ipv6cp_iid_t remoteIID_; command const ppp_ipv6cp_iid_t* PppIpv6.localIid () { return linkIsUp_ ? &localIID_ : 0; } command const ppp_ipv6cp_iid_t* PppIpv6.remoteIid () { return linkIsUp_ ? &remoteIID_ : 0; } command bool PppIpv6.linkIsUp () { return linkIsUp_; } default event void PppIpv6.linkUp () { } default event void PppIpv6.linkDown () { } command error_t Init.init () { return SUCCESS; } /* Interface-Identifier is sent in a request to indicate the IID * that the sender wishes to use for its link-local IPv6 address. * Transmission of a value of zero indicates a request that the peer * provide a preferred IID via a Configure-Nak response. */ command uint8_t InterfaceIdentifierOption.getType () { return Ipv6CpOpt_InterfaceIdentifier; } command bool InterfaceIdentifierOption.isNegotiable () { return negotiateIID_; } command void InterfaceIdentifierOption.setNegotiable (bool is_negotiable) { negotiateIID_ = is_negotiable; } command uint8_t InterfaceIdentifierOption.considerRequest (const uint8_t* dp, const uint8_t* dpe) { return PppControlProtocolCode_ConfigureAck; } command uint8_t* InterfaceIdentifierOption.appendRequest (uint8_t* dp, const uint8_t* dpe) { if (dpe < (dp+sizeof(proposedLocalIID_))) { return 0; } memcpy(dp, &proposedLocalIID_, sizeof(proposedLocalIID_)); dp += sizeof(proposedLocalIID_); return dp; } command uint8_t* InterfaceIdentifierOption.appendNakValue (const uint8_t* sp, const uint8_t* spe, uint8_t* dp, const uint8_t* dpe) { return dp; } command void InterfaceIdentifierOption.setRemote (const uint8_t* dp, const uint8_t* dpe) { memcpy(&remoteIID_, dp, sizeof(remoteIID_)); } command void InterfaceIdentifierOption.setLocal (const uint8_t* dp, const uint8_t* dpe) { if (dp) { memcpy(&localIID_, dp, sizeof(localIID_)); } else { memset(&localIID_, 0, sizeof(localIID_)); } } command void InterfaceIdentifierOption.processNakValue (const uint8_t* dp, const uint8_t* dpe) { memcpy(&proposedLocalIID_, dp, sizeof(proposedLocalIID_)); } command void InterfaceIdentifierOption.reset () { call InterfaceIdentifierOption.setNegotiable(TRUE); memset(&proposedLocalIID_, 0, sizeof(proposedLocalIID_)); } event void Ppp.outputFrameTransmitted (frame_key_t key, error_t err) { } command unsigned int PppControlProtocol.getProtocol () { return ControlProtocol; } command unsigned int PppProtocol.getProtocol () { return Protocol; } command error_t PppControlProtocol.process (const uint8_t* information, unsigned int information_length) { return call PppProtocolCodeCoordinator.dispatch(information, information_length); } command error_t PppProtocol.process (const uint8_t* information, unsigned int information_length) { return signal PppIpv6.receive(information, information_length); } command error_t PppProtocol.rejectedByPeer (const uint8_t* data, const uint8_t* data_end) { /* Not sure what to do about this, since the peer could only send * a Protocol-Reject message if it actually implemented the * Link-Control-Protocol. */ return SUCCESS; } command error_t PppControlProtocol.rejectedByPeer (const uint8_t* data, const uint8_t* data_end) { /* Not sure what to do about this, since the peer could only send * a Protocol-Reject message if it actually implemented the * Link-Control-Protocol. */ return SUCCESS; } event void LcpAutomaton.transitionCompleted (LcpAutomatonState_e state) { } event void LcpAutomaton.thisLayerUp () { linkIsUp_ = TRUE; signal PppIpv6.linkUp(); } event void LcpAutomaton.thisLayerDown () { linkIsUp_ = FALSE; signal PppIpv6.linkDown(); } event void LcpAutomaton.thisLayerStarted () { } event void LcpAutomaton.thisLayerFinished () { } event void LowerLcpAutomaton.transitionCompleted (LcpAutomatonState_e state) { } event void LowerLcpAutomaton.thisLayerUp () { call LcpAutomaton.up(); } event void LowerLcpAutomaton.thisLayerDown () { call LcpAutomaton.down(); call PppConfigure.resetOptions(); } event void LowerLcpAutomaton.thisLayerStarted () { } event void LowerLcpAutomaton.thisLayerFinished () { } command error_t PppIpv6.transmit (const uint8_t* message, unsigned int len) { error_t rc; frame_key_t key; const uint8_t* fpe; uint8_t* fp = call Ppp.getOutputFrame(PppProtocol_Ipv6, &fpe, FALSE, &key); if ((! fp) || ((fpe - fp) < len)) { if (fp) { call Ppp.releaseOutputFrame(key); } return ENOMEM; } memcpy(fp, message, len); rc = call Ppp.fixOutputFrameLength(key, fp + len); if (SUCCESS == rc) { rc = call Ppp.sendOutputFrame(key); } return rc; } } tinyos-2.1.2+dfsg/tos/lib/ppp/PppP.nc000066400000000000000000000342011207233610700173340ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" module PppP { uses { interface HdlcFraming; interface FragmentPool as TransmitFramePool; interface PppProtocol[ uint16_t protocol ]; interface PppProtocolCodeSupport as ProtocolReject; interface PppProtocolReject; interface StdControl as HdlcControl; interface MultiLed; } provides { interface SplitControl; interface GetSetOptions as PppOptions; interface Ppp; interface PppRejectedProtocol; } } implementation { /* Options that control how Ppp manages things */ PppOptions_t options = { txProtocolFieldCompression: FALSE, rxProtocolFieldCompression: FALSE, txMaximumReceiveUnit: PPP_MAXIMUM_MRU, rxMaximumReceiveUnit: PPP_MAXIMUM_MRU }; command error_t PppOptions.set (const PppOptions_t* new_options) { if (new_options) { options = *new_options; } else { options.txProtocolFieldCompression = options.rxProtocolFieldCompression = FALSE; options.txMaximumReceiveUnit = options.rxMaximumReceiveUnit = PPP_MAXIMUM_MRU; } #if 0 printf("PPP Opt: PCOMP tx=%d rx=%d; MRU tx=%u rx=%u\r\n", options.txProtocolFieldCompression, options.rxProtocolFieldCompression, options.txMaximumReceiveUnit, options.rxMaximumReceiveUnit); #endif return SUCCESS; } command PppOptions_t PppOptions.get () { return options; } command error_t PppRejectedProtocol.rejected (uint16_t protocol, const uint8_t* data, const uint8_t* data_end) { return call PppProtocol.rejectedByPeer[protocol](data, data_end); } enum { CS_stopped, CS_starting, CS_started, CS_stopping, }; error_t controlResult_; uint8_t controlState_; task void controlEngine_task () { if (CS_started == controlState_) { signal SplitControl.startDone(controlResult_); } else if (CS_stopped == controlState_) { /* @TODO@ Notify upper levels of shutdown, await their signal */ call HdlcControl.stop(); signal SplitControl.stopDone(controlResult_); } } enum { /** Frame is unused */ TFS_unused, /** A fragment has been allocated and somebody's filling it with * data. TFS_INHIBIT_COMPRESSION may be set. */ TFS_filling, /** The fragment has been frozen at its maximum length. The * content may or may not be complete, but cannot extend beyond * the recorded end. TFS_INHIBIT_COMPRESSION may be set. */ TFS_fixed, /** Ppp.sendOutputFrame() has been invoked. The fragment has been * frozen to its final length and placed on the transmission * queue. TFS_INHIBIT_COMPRESSION may be set. */ TFS_queued, /** The frame has been given to HdlcFraming.sendFrame for * processing. */ TFS_transmitting, /** The frame has been transmitted, or the user cancelled it. The * fragment will be released and the frame marked unused by * transmitEngine_task. */ TFS_releasable, /** A mask used to extract the bits that represent a frame state */ TFS_STATE_MASK = 0x0f, /** Auxiliary state indicating that the system indicated on * allocation that compression of frame protocol/address fields * should be suppressed. */ TFS_INHIBIT_COMPRESSION = 0x80, }; typedef struct HdlcTxFrame_t { uint8_t* start; uint8_t* end; uint8_t frame_state; } HdlcTxFrame_t; /** A set of transmission frames permitting queued transmission of * multiple PPP frame and processing in order. */ HdlcTxFrame_t txFrames_[PPP_HDLC_TX_FRAME_LIMIT]; static const HdlcTxFrame_t* txFramesEnd_ = txFrames_ + PPP_HDLC_TX_FRAME_LIMIT; HdlcTxFrame_t* queuedTxFrame_[PPP_HDLC_TX_FRAME_LIMIT]; uint8_t queuedTxFrameIdx_; HdlcTxFrame_t* activeTxFrame_; /** Buffer used to communicate frame errors from the task that * discovered them to one that can safely deal with them. */ HdlcError_e inFrameError__; /** The number of frames that were dropped by the lower level */ unsigned int inFrameDropped__; #if 0 void dumpFrame (const uint8_t* fp, const uint8_t* fpe) { while (fp < fpe) { printf(" %02x", *fp++); } printf("\r\n"); } #endif async event void TransmitFramePool.available (unsigned int length) { } default event void Ppp.outputFrameTransmitted (frame_key_t key, error_t result) { } default command error_t PppProtocolReject.process (unsigned int protocol, const uint8_t* information, unsigned int length) { return SUCCESS; } task void transmitEngine_task (); void releaseTxFrame_ (HdlcTxFrame_t* fp, error_t rc, bool post_done) { if (post_done) { signal Ppp.outputFrameTransmitted(fp->start, rc); } rc = call TransmitFramePool.release(fp->start); if (SUCCESS != rc) { // @INSTRUMENT@ } fp->frame_state = TFS_unused; fp->start = fp->end = 0; } task void transmitEngine_task () { HdlcTxFrame_t* tfp; error_t rc; /* If there's nothing to transmit, or we're already transmitting, * done. */ if ((0 == queuedTxFrameIdx_) || activeTxFrame_) { return; } tfp = queuedTxFrame_[0]; if (0 < --queuedTxFrameIdx_) { memmove(queuedTxFrame_, queuedTxFrame_ + 1, queuedTxFrameIdx_ * sizeof(*queuedTxFrame_)); } rc = call HdlcFraming.sendFrame(tfp->start, tfp->end- tfp->start, !!(tfp->frame_state & TFS_INHIBIT_COMPRESSION)); if (SUCCESS == rc) { tfp->frame_state = TFS_transmitting; activeTxFrame_ = tfp; } else { releaseTxFrame_(tfp, rc, TRUE); } } command uint8_t* Ppp.getOutputFrame (unsigned int protocol, const uint8_t** frame_endp, bool inhibit_compression, frame_key_t* keyp) { error_t rc; uint8_t* fp; bool pcomp; HdlcTxFrame_t* tfp = txFrames_; while (tfp < txFramesEnd_) { if (TFS_unused == tfp->frame_state) { break; } ++tfp; } if (txFramesEnd_ <= tfp) { // @INSTRUMENT@ return 0; } rc = call TransmitFramePool.request(&tfp->start, &tfp->end, PPP_MINIMUM_TX_FRAME_SIZE); if (SUCCESS != rc) { // @INSTRUMENT@ return 0; } tfp->frame_state = TFS_filling; if (inhibit_compression) { tfp->frame_state |= TFS_INHIBIT_COMPRESSION; } pcomp = options.txProtocolFieldCompression && (! inhibit_compression); if (keyp) { *keyp = tfp->start; } fp = tfp->start; if (frame_endp) { *frame_endp = tfp->end; } if ((0x100 > protocol) && pcomp) { *fp++ = protocol; } else { *fp++ = (protocol >> 8); *fp++ = (protocol & 0x0FF); } return fp; } HdlcTxFrame_t* findTxFrame_ (frame_key_t key) { HdlcTxFrame_t* tfp = txFrames_; while (tfp < txFramesEnd_) { if (tfp->start == key) { return tfp; } ++tfp; } return 0; } command error_t Ppp.fixOutputFrameLength (frame_key_t key, const uint8_t* frame_end) { HdlcTxFrame_t* tfp = findTxFrame_(key); error_t rc; if (! tfp) { // @INSTRUMENT@ return EINVAL; } if (frame_end == tfp->end) { // @INSTRUMENT@ } rc = call TransmitFramePool.freeze(tfp->start, frame_end); if (SUCCESS == rc) { tfp->end = (uint8_t*)frame_end; tfp->frame_state = TFS_fixed | (tfp->frame_state & ~TFS_STATE_MASK); } else { releaseTxFrame_(tfp, rc, FALSE); } return rc; } command error_t Ppp.sendOutputFrame (frame_key_t key) { HdlcTxFrame_t* tfp = findTxFrame_(key); if (! tfp) { // @INSTRUMENT@ return EINVAL; } if (TFS_fixed != (tfp->frame_state & TFS_STATE_MASK)) { // @INSTRUMENT@ } tfp->frame_state = TFS_queued | (tfp->frame_state & ~TFS_STATE_MASK); queuedTxFrame_[queuedTxFrameIdx_++] = tfp; post transmitEngine_task(); return SUCCESS; } command error_t Ppp.releaseOutputFrame (frame_key_t key) { HdlcTxFrame_t* tfp = findTxFrame_(key); if (! tfp) { // @INSTRUMENT@ return EINVAL; } releaseTxFrame_(tfp, SUCCESS, FALSE); return SUCCESS; } event void HdlcFraming.sendDone (const uint8_t* data, unsigned int len, error_t err) { if (activeTxFrame_) { releaseTxFrame_(activeTxFrame_, err, TRUE); activeTxFrame_ = 0; post transmitEngine_task(); } } typedef struct Frame_t { const uint8_t* start; const uint8_t* end; } Frame_t; Frame_t readyFrame__[PPP_HDLC_RX_FRAME_LIMIT]; uint8_t readyFrameIdx__; task void processFrame_task () { unsigned int protocol; error_t rc; Frame_t* apf; const uint8_t* dp; atomic { if (0 == readyFrameIdx__) { return; } apf = readyFrame__; } dp = apf->start; #if 0 { printf("Got frame length %u:", apf->end - apf->start); dumpFrame(apf->start, apf->end); } #endif /* Decode the protocol */ protocol = *dp++; if (! (protocol & 1)) { protocol = (protocol << 8) + *dp++; } /* If the protocol is registered, process the message; otherwise, * tell LCP to bounce it. */ if (0 != call PppProtocol.getProtocol[protocol]()) { //printf("Good protocol %04x\r\n", protocol); rc = call PppProtocol.process[protocol](dp, apf->end - dp); } else { rc = call PppProtocolReject.process(protocol, dp, apf->end - dp); } if (ERETRY == rc) { /* Put the frame back into received mode and leave it at the * head of the ready queue. Reprocess the ready queue. */ // @INSTRUMENT@ post processFrame_task(); } else { call HdlcFraming.releaseReceivedFrame(apf->start); atomic { /* Consume the frame; shift any remaining ready frames down in * the queue. */ if (0 < --readyFrameIdx__) { // @INSTRUMENT@ memmove(readyFrame__, readyFrame__+1, readyFrameIdx__ * sizeof(*readyFrame__)); post processFrame_task(); } } } } task void processError_task () { HdlcError_e in_frame_error; unsigned int ifd; atomic { in_frame_error = inFrameError__; ifd = inFrameDropped__; inFrameError__ = 0; inFrameDropped__ = 0; } //printf("Frame error %d\r\n", in_frame_error); } void initializeOptions_ () { options.txProtocolFieldCompression = FALSE; options.rxProtocolFieldCompression = FALSE; options.txMaximumReceiveUnit = PPP_MAXIMUM_MRU; options.rxMaximumReceiveUnit = PPP_MAXIMUM_MRU; } command error_t SplitControl.start () { error_t rc; rc = call HdlcControl.start(); if (SUCCESS != rc) { return rc; } initializeOptions_(); controlState_ = CS_started; controlResult_ = SUCCESS; post controlEngine_task(); return rc; } command error_t SplitControl.stop () { controlState_ = CS_stopping; post controlEngine_task(); return SUCCESS; } async event void HdlcFraming.receivedDelimiter () { } event void HdlcFraming.receivedFrame (const uint8_t* data, unsigned int len) { atomic { Frame_t* fp = readyFrame__ + readyFrameIdx__++; fp->start = data; fp->end = data + len; } post processFrame_task(); } async event void HdlcFraming.receptionError (HdlcError_e code) { atomic { inFrameError__ = code; ++inFrameDropped__; } post processError_task(); } /* Code a default implementation that returns an invalid protocol * code, so we can detect unrecognized protocols. */ default command unsigned int PppProtocol.getProtocol[ uint16_t protocol ] () { return 0; } /* Default implementation of unrecognized protocols should never be * invoked. */ default command error_t PppProtocol.process[ uint16_t protocol ] (const uint8_t* information, unsigned int information_length) { return FAIL; } default command error_t PppProtocol.rejectedByPeer[ uint16_t protocol ] (const uint8_t* data, const uint8_t* data_end) { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/ppp/PppPrintf.h000066400000000000000000000037531207233610700202360ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef PPP_PPPPRINTF_H #define PPP_PPPPRINTF_H enum { /** The completely unofficial protocol number rudely stolen for * OSIAN PPP print support. * * @TODO@ Convert this to RFC3772-conformant vendor-specific * protocol */ PppProtocol_Printf = 0x404F, }; #ifndef PPP_PRINTF_MAX_BUFFER /** Maximum number of characters in the printf buffer. */ #define PPP_PRINTF_MAX_BUFFER 255 #endif #endif /* PPP_PPPPRINTF_H */ tinyos-2.1.2+dfsg/tos/lib/ppp/PppPrintfC.nc000066400000000000000000000063751207233610700205150ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "PppPrintf.h" /** Support printf(3) within applications that use PPP. * * printf is too useful as a debugging capability to be lost simply * because the serial interface is shuttling packets back and forth. * Wiring this protocol allows console output to be passed to the peer * in a special protocol message, where it can be displayed. * * Applications that do this should use the following wiring: components PppPrintfC; PppC.PppProtocol[PppPrintfC.Protocol] -> PppPrintfC; PppPrintfC.Ppp -> PppC; * where PppC is alternatively PppDaemonC. Simply using this * component without wiring in its protocol will work, in that the * messages will be sent to the peer, but standard PPP implementations * that do not recognize the TinyOS-specific PPP protocol will send a * Protocol-Reject message, which the TinyOS PPP implementation will be * unable to process. Wiring in the protocol allows TinyOS PPP to * disable it when the peer is unable to process the messages, * avoiding log clutter. * * A variant PPP implementation that recognizes TinyOS packets can be * obtained by reading the instructions in the patch file in * ${TOSDIR}/lib/ppp/tos-pppd.patch. * * @note For cross-platform compatibility, this module uses the PutcharP * component from ${TOSDIR}/lib/printf. That directory must be in * your component search path. * * @author Peter A. Bigot */ configuration PppPrintfC { provides { interface PppProtocol; } uses { interface Ppp; } enum { Protocol = PppProtocol_Printf, }; } implementation { components PppPrintfP; PppProtocol = PppPrintfP; Ppp = PppPrintfP; components PutcharC; PutcharC.Putchar -> PppPrintfP; } tinyos-2.1.2+dfsg/tos/lib/ppp/PppPrintfP.nc000066400000000000000000000077761207233610700205400ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "PppPrintf.h" #include /** Implement putchar() in a way that transfers the data in packets * over PPP. */ module PppPrintfP { provides { interface PppProtocol; interface Putchar; } uses { interface Ppp; } } implementation { bool disabled__; enum { Protocol = PppProtocol_Printf, }; #if 255 >= PPP_PRINTF_MAX_BUFFER typedef uint8_t bufferIndex_t; #else /* PPP_PRINTF_MAX_BUFFER */ typedef uint16_t bufferIndex_t; #endif /* PPP_PRINTF_MAX_BUFFER */ char buffer_[PPP_PRINTF_MAX_BUFFER]; bufferIndex_t bufferIndex_; frame_key_t activeKey_; task void sendBuffer_task () { const uint8_t* fpe; frame_key_t key; uint8_t* fp; unsigned int tx_length; error_t rc; if (activeKey_) { return; } fp = call Ppp.getOutputFrame(Protocol, &fpe, FALSE, &key); if (fp == 0) { post sendBuffer_task(); return; } atomic { tx_length = fpe - fp - 1; if (bufferIndex_ < tx_length) { tx_length = bufferIndex_; } *fp++ = tx_length; memmove(fp, buffer_, tx_length); fp += tx_length; bufferIndex_ -= tx_length; if (0 < bufferIndex_) { memcpy(buffer_, buffer_ + tx_length, bufferIndex_); } } rc = call Ppp.fixOutputFrameLength(key, fp); if (SUCCESS == rc) { rc = call Ppp.sendOutputFrame(key); } if (SUCCESS == rc) { activeKey_ = key; } } command unsigned int PppProtocol.getProtocol () { return Protocol; } command error_t PppProtocol.process (const uint8_t* information, unsigned int information_length) { return FAIL; } command error_t PppProtocol.rejectedByPeer (const uint8_t* data, const uint8_t* data_end) { /* If we've been fed a rejected message, disable this protocol. */ atomic disabled__ = (0 != data); return SUCCESS; } event void Ppp.outputFrameTransmitted (frame_key_t key, error_t err) { atomic { if (activeKey_ == key) { activeKey_ = 0; if ((! disabled__) && (0 < bufferIndex_)) { post sendBuffer_task(); } } } } #undef putchar command int Putchar.putchar (int c) { atomic { if ((! disabled__) && (bufferIndex_ < sizeof(buffer_))) { buffer_[bufferIndex_++] = c; post sendBuffer_task(); } } return c; } } tinyos-2.1.2+dfsg/tos/lib/ppp/PppProtocol.nc000066400000000000000000000105151207233610700207400ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Basic interface used by the PPP infrastructure to connect to an * arbitrary protocol. * * Components that provide this interface should generally define an * enumeration value named Protocol in their specification, so that * applications can wire the interface into the PppC Protocols * subsystem using the correct protocol value. See * LinkControlProtocolC for a canonical example. * * @author Peter A. Bigot */ interface PppProtocol { /** Return the protocol code for this protocol. * * This is primarily used to detect unrecognized protocols: a * default implementation is defined that returns protocol 0, which * is an illegal protocol value. Upon detection of this situation, * the PppC component delegates handling to a module that implements * PppProtocolReject. * * @return A non-zero value for a registered protocol; zero if the * protocol is unknown to the system. */ command unsigned int getProtocol (); /** Process an incoming packet with the given information payload. * * The packet memory is owned by the PppC component to which this * protocol has been wired. Normally, that memory is released for * re-use upon return of this command. There are cases where the * protocol requires continued access to the data after this command * completes (for example, to await completion of a PPP * transmission). The called component must invoke the * Ppp.holdInputFrame() command during this command if it requires * continued access to the input buffer. * * @param information A pointer to the start of the information * field for the message. * * @param information_length The number of octets in the information * field. This may incorporate padding; the protocol must determine * this. * * @return SUCCESS if packet was processed. ERETRY if the system is * busy but the packet might be processable again later. Other errors * indicate the packet should not be re-processed. */ command error_t process (const uint8_t* information, unsigned int information_length); /** Invoked to inform protocol that the peer rejected it. * * Poor, sad, lonely protocol. * * @param data If not null, this begins the start of the information * field from the message that caused the peer to reject the * protocol. If null, this is being invoked by the engine after the * link has been reset, indicating that the protocol may re-enable * itself. * * @param data_end Points past the end of whatever portion of the * rejected message was returned by the peer. Null if data is null. * * @return SUCCESS, please. */ command error_t rejectedByPeer (const uint8_t* data, const uint8_t* data_end); } tinyos-2.1.2+dfsg/tos/lib/ppp/PppProtocolCodeCoordinator.nc000066400000000000000000000072061207233610700237420ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Common support for all protocols that use code-based handlers. * * The set of codes recognized by each protocol is different, but the * process of identifying the code and dispatching to the appropriate * handler is the same. Similarly, most such protocols produce an * error response via a Code-Reject packet when an unrecognized code * is encountered. * * @author Peter A. Bigot */ interface PppProtocolCodeCoordinator { /** Extract the code information from an information field and * dispatch it to the appropriate handler. * * If the code is not recognized, this produces a Code-Reject packet * in the given protocol. * * @param information the information section of a PPP packet * * @param information_length the number of octets in the information section * * @return The result of invoking the * PppProtocolCodeSupport.process() command for the appropriate * handler (or of submitting the Code-Reject packet) */ command error_t dispatch (const uint8_t* information, unsigned int information_length); /** Generate the appropriate reject packet for an unrecognized input. * * @param rejected_protocol Normally zero, indicating a Code-Reject * packet should be produced. If non-zero, represents an * unrecognized protocol, and generates a Protocol-Reject packet. * This should only be non-zero when invoked from * LinkControlProtocol. * * @param ip pointer to the start of the rejected packet information field * * @param ipe pointer to the first octet following the rejected * packet's information field * * @param keyp where to store the HDLC transmission frame key for * the transmitted packet. Passing a null pointer indicates the * frame key is not saved (meaning nobody needs to know when the * transmission completes). */ command error_t rejectPacket (unsigned int rejected_protocol, const uint8_t* ip, const uint8_t* ipe, frame_key_t* keyp); } tinyos-2.1.2+dfsg/tos/lib/ppp/PppProtocolCodeCoordinatorC.nc000066400000000000000000000043311207233610700240410ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Provides common support for a protocol that uses LCP-style code-based handlers. * * @param Protocol the Protocol code for which this component coordinates * * @author Peter A. Bigot */ generic configuration PppProtocolCodeCoordinatorC (uint16_t Protocol) { provides { interface PppProtocolCodeCoordinator; } uses { interface Ppp; interface PppProtocolCodeSupport as CodeHandler[ uint8_t code ]; } } implementation { components new PppProtocolCodeCoordinatorP(Protocol); Ppp = PppProtocolCodeCoordinatorP; PppProtocolCodeCoordinator = PppProtocolCodeCoordinatorP; CodeHandler = PppProtocolCodeCoordinatorP; } tinyos-2.1.2+dfsg/tos/lib/ppp/PppProtocolCodeCoordinatorP.nc000066400000000000000000000120511207233610700240540ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" /** Provides common support for a protocol that uses LCP-style code-based handlers. * * @param Protocol the Protocol code for which this component coordinates * * @author Peter A. Bigot */ generic module PppProtocolCodeCoordinatorP (uint16_t Protocol) { provides { interface PppProtocolCodeCoordinator; } uses { interface Ppp; interface PppProtocolCodeSupport as CodeHandler[ uint8_t code ]; } } implementation { event void Ppp.outputFrameTransmitted (frame_key_t key, error_t result) { } /** The unique identifier to be used in the next Protocol-Reject * packet generated. */ uint8_t id_protocolReject; /** The unique identifier to be used in the next Code-Reject packet * generated. */ uint8_t id_codeReject; command error_t PppProtocolCodeCoordinator.rejectPacket (unsigned int rejected_protocol, const uint8_t* ip, const uint8_t* ipe, frame_key_t* keyp) { const uint8_t* fpe = 0; frame_key_t key; uint8_t* fp = call Ppp.getOutputFrame(Protocol, &fpe, TRUE, &key); const uint8_t* frame_start = fp; uint8_t* lp; error_t rc; if (0 == fp) { return EBUSY; } /** TODO: Test this with rejected frames around MRU limit */ if (0 != rejected_protocol) { *fp++ = PppControlProtocolCode_ProtocolReject; *fp++ = id_protocolReject++; } else { *fp++ = PppControlProtocolCode_CodeReject; *fp++ = id_codeReject++; } /* Skip over the length field for now */ lp = fp; fp += 2; if (0 != rejected_protocol) { /* Store the rejected protocol in two octets */ *fp++ = (rejected_protocol >> 8); *fp++ = (rejected_protocol & 0x0FF); } /* Fill out as much of the frame as necessary with as much of the * information field as will fit. */ while ((fp < fpe) && (ip < ipe)) { *fp++ = *ip++; } /* Go back and store the length field */ { unsigned int len = (fp - frame_start); *lp++ = (len >> 8); *lp++ = (len & 0x0FF); } rc = call Ppp.fixOutputFrameLength(key, fp); if (SUCCESS == rc) { rc = call Ppp.sendOutputFrame(key); } if ((SUCCESS == rc) && keyp) { *keyp = key; } return rc; } command error_t PppProtocolCodeCoordinator.dispatch (const uint8_t* information, unsigned int information_length) { const uint8_t* ip = information; const uint8_t* ipe = ip + information_length; uint8_t code = *ip++; uint8_t identifier = *ip++; uint16_t length = ((ip[0] << 8) + ip[1]); ip += 2; /* Decrease the length by space used by the fixed header we've * already consumed. */ length -= 4; if (0 == call CodeHandler.getCode[code]()) { return call PppProtocolCodeCoordinator.rejectPacket(0, information, ipe, 0); } return call CodeHandler.process[code](identifier, ip, ipe); } default command uint8_t CodeHandler.getCode[ uint8_t code ] () { return 0; } default command error_t CodeHandler.process[ uint8_t code ] (uint8_t identifier, const uint8_t* data, const uint8_t* data_end) { return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/ppp/PppProtocolCodeSupport.nc000066400000000000000000000063451207233610700231360ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" /** Most PPP control protocols are modeled on RFC1661's Link Control * Protocol, and use a packet format comprising: * - A one-octet Code field * - A one-octet Identifier field * - A two-octet Length field * - A data field of varying length. * * The code determines the specific format of the data field and how * it should be interpreted. This interface allows an application to * determine which codes will be supported by only wiring in the ones * that are necessary. * * @author Peter A. Bigot */ interface PppProtocolCodeSupport { /** Return the code for this handler. * * This is primarily used to detect unrecognized codes: a default * implementation is defined that returns code 0, which is an * illegal code value. Upon detection of this situation, the * control protocol will generate a Code-Reject message. */ command uint8_t getCode (); /** Process an incoming packet with the given identifer and data * region. */ command error_t process (uint8_t identifier, const uint8_t* data, const uint8_t* data_end); /** Invoke some code-specific operation. * * Generally it involves building and transmitting a message. If * so, the key for detection completion of that message should be * returned. * * @param param A code-specific structure, if needed to pass external information * * @param keyp A destination into which the output frame key should * be provided if invocation of this handler results in the * transmission of a message. */ command error_t invoke (void* param, frame_key_t* keyp); } tinyos-2.1.2+dfsg/tos/lib/ppp/PppProtocolOption.nc000066400000000000000000000150671207233610700221400ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Operations that should be supported for each option that can be * configured through an LCP-style automaton negotiation. * * @note We currently do not support options that can appear multiple * times in a single request. * * @author Peter A. Bigot */ interface PppProtocolOption { /** Return the option type code for this option within its protocol. * * This is primarily used to detect unrecognized options: a default * implementation is defined that returns option 0, which is an * illegal option value. Upon detection of this situation, the * configuration processing implementation will generate a * Configure-Reject message. */ command uint8_t getType (); /** Return TRUE iff the option should be added to outgoing * Configure-Request messages. * * If the option is negotiable, appendRequest will invoked to append * the proposed local value to the outgoing request message. * * @note Negotiability of remote values for options is indicated by * the return value of considerRequest. */ command bool isNegotiable (); /** Set whether the local value of the option should be negotiated, * based on protocol activity. * * Option negotiation is set to FALSE upon receipt of a * Configure-Reject message identifying the option, and upon a * Reject return from considerRequest. It is set to TRUE upon * receipt of a non-Reject return from considerRequest. */ command void setNegotiable (bool is_negotiable); /** Determine whether the proposed remote value is acceptable to the * protocol. * @return PppControlProtocolCode_Configure{Ack,Nak,Reject}, * depending on whether the option value specified at dp is * acceptable to this end of the link. */ command uint8_t considerRequest (const uint8_t* dp, const uint8_t* dpe); /** Add a proposed local value to a message. The option type and * length fields are already incorporated; only the data portion is * to be stored. */ command uint8_t* appendRequest (uint8_t* dp, const uint8_t* dpe); /** Add an alternative suggestion to a Nak message. The option type * and length fields are already reserved; only the data portion is * to be stored. * * If the option cannot express an acceptable alternative within the * buffer indicated by dp to dpe, the command should return a null * pointer. Otherwise, the command should return a pointer just * past the last octet of its proposed alternative. * * @param sp The value in the Configure-Request message, in case * that's useful when proposing an alternative * * @param spe Indidates the end of the requested option value * * @param dp Where the proposed alternative should be stored * * @param dpe The limit up to which the proposed alternative may be * written. */ command uint8_t* appendNakValue (const uint8_t* sp, const uint8_t* spe, uint8_t* dp, const uint8_t* dpe); /** Completely reset the option prior to a new negotiation sequence. * * This brings things back to their power-up default, and is * executed when the link goes down. It re-enables options for * negotiation, and restores default proposed local and remote * values. */ command void reset (); /** Set (reset) the option's local value. * * The set operation is invoked on each option present in a received * Configure-Ack message (i.e., this node requested the value). The * reset operation is invoked prior to transmission of a * Configure-Request (need permission for value). * * @param dp Start of the option value. If passed as a null * pointer, option is reset to its default. * * @param dpe First octet past option value. */ command void setLocal (const uint8_t* dp, const uint8_t* dpe); /** Process a proposed alternative local value. * * This operation is invoked when the remote sends a Configure-Nak * in response to local's Configure-Request. Generally, the * response should be to replace the original local value with the * value proposed by the peer, or to mark the option non-negotiable. * * @param dp Start of the option value. * * @param dpe First octet past option value. */ command void processNakValue (const uint8_t* dp, const uint8_t* dpe); /** Set (reset) the option's remote value. * * The set operation is invoked on each option present in a * transmitted Configure-Ack message (i.e., the remote node * requested the value). This is done after transmission. The * reset operation is invoked upon receipt of a Configure-Request. * * @param dp Start of the option value. If passed as a null * pointer, option is reset to its default. * * @param dpe First octet past option value. */ command void setRemote (const uint8_t* dp, const uint8_t* dpe); } tinyos-2.1.2+dfsg/tos/lib/ppp/PppProtocolReject.nc000066400000000000000000000046331207233610700221010ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Allow custom reaction to unrecognized protocols. * * If a Link Control Protocol component is available, its * Protocol-Reject message can be used to inform the remote that a * protocol is unrecognized. Other PPP components may chose to just * drop the message. * * @author Peter A. Bigot */ interface PppProtocolReject { /** Do something when a message with an unrecognized protocol has been received. * * @param protocol The protocol value from the PPP message * * @param information The start of the information field from the * message * * @param length The number of octets in the information field, * including any subsequent padding */ command error_t process (unsigned int protocol, const uint8_t* information, unsigned int length); } tinyos-2.1.2+dfsg/tos/lib/ppp/PppRejectedProtocol.nc000066400000000000000000000045351207233610700224130ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Support to inform the PPP primary engine that one of the * registered protocols was rejected by the peer. * * @author Peter A. Bigot */ interface PppRejectedProtocol { /** Inform main engine that a ProtocolReject message was received. * * @param protocol The protocol value from the rejected message * * @param data The information field of the rejected message * * @param data_end First byte past the end of whatever portion of * the original message could be returned. * * @return The result of informing the protocol that it has been * rejected (see PppProtocol.rejectedByPeer). */ command error_t rejected (uint16_t protocol, const uint8_t* data, const uint8_t* data_end); } tinyos-2.1.2+dfsg/tos/lib/ppp/README000066400000000000000000000065241207233610700170220ustar00rootroot00000000000000This directory contains an implementation of the Point-to-Point Protocol (RFC 1661) in TinyOS. It is suitable for sharing the serial port among multiple packet-oriented communications paths. The goal is a system that allows a TinyOS application that is connected to a PC using a serial port to talk directly to a vendor-supplied PPP daemon and provide the standard IPCP or IPV6CP protocols to forward network packets to a wireless sensor network without any need to install support software on the PC. The architecture permits protocols to be independently developed and wired in, in classic TinyOS fashion. Similarly, protocol options may be included or excluded, and for LCP-style protocols that use messages with codes, lengths, and data fields the set of recognized codes is determined by wiring. In its current form, the PppDaemonC component will successfully negotiate an open connection with the Linux PPP daemon. By linking in the PppIpv6C component, and connecting its PppIpv6 interface to a component that supports some sort of IPv6 API, you can communicate with TinyOS applications over IPv6. The tests/Ipv6 example shows the basic configuration required. Currently there is no IPv4 (RFC1332) module. ---------------------------------------- The tosppd script can be used to start the PPP daemon with the required arguments. Use: sudo ${TOSDIR}/lib/ppp/tospppd See the script for arguments that select serial device, baud rate, and other parameters. ---------------------------------------- The PppPrintfC component can be linked to an application to allow printf(3c) messages to be carried over the PPP link and displayed by the PPP daemon. See the instructions at the top of tos-pppd.patch. Invoke it thusly: sudo TOS_PPPD=/usr/local/tos-pppd/sbin/pppd ${TOSDIR}/lib/ppp/tospppd The Ipv6 demonstration prints the length of received packets, and produces messages like: rcvd [IPV6CP ConfReq id=0x6 ] sent [IPV6CP ConfAck id=0x6 ] local LL address fe80::fd41:4242:0e88:0002 remote LL address fe80::fd41:4242:0e88:0003 Script /etc/ppp/ipv6-up started (pid 11337) rcvd [TOS RX 48 octets] Script /etc/ppp/ipv6-up finished (pid 11337), status = 0x1 rcvd [TOS RX 48 octets] rcvd [TOS RX 48 octets] rcvd [TOS RX 104 octets] rcvd [TOS RX 104 octets] rcvd [TOS RX 104 octets] ======================================== Many of the tests require use of the PPP4Py package, which provides Point-to-Point Protocol support for Python. This package is not necessary for using the daemon, only for running the tests. Get a copy at: git://ppp4py.git.sourceforge.net/gitroot/ppp4py/ppp4py Remember to add it to your PYTHONPATH: PPP4PY_ROOT=${PPP4PY_ROOT:-/home/pab/ppp4py/dev} PYTHONPATH=${PPP4PY_ROOT}:${PYTHONPATH:+:${PYTHONPATH}} PATH="${PPP4PY_ROOT}/scripts:${PPP4PY_ROOT}/bin:${PATH}" export PPP4PY_ROOT PYTHONPATH PATH Most tests have a test.sh script that builds the application, installs it on the default board, and runs the ppp4py test program. Trusted tests, in order of complexity, are: HdlcFraming -- a unit test for HdlcFramingC HdlcRead -- verifies the application correctly decodes HDLC frames HdlcEcho -- verifies HDLC transmission of received frames HdlcSpeed -- round-trip full(half) duplex performance tests Lcp -- Basic Link-Control-Protocol negotiation Ipv6 -- Basic IPV6CP on top of LCP tinyos-2.1.2+dfsg/tos/lib/ppp/lcp.h000066400000000000000000000073331207233610700170700ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef PPP_LCP_H #define PPP_LCP_H /** Link Control Protocol constants and structures */ #ifndef PPP_LCP_ENABLE_PCOMP /** Control whether protocol compression is supported. * * By default, we disable this option. When enabled, it allows the * protocol field to be represented in a single octet, which cuts down * on transmitted data, but leaves the information field of the packet * aligned on an odd byte boundary, which is really inconvenient when * decoding network packets. */ #define PPP_LCP_ENABLE_PCOMP (0) #endif /* PPP_LCP_ENABLE_PCOMP */ enum { /** RFC 1661 section 6.1. Payload is a uint16_t. @note The MRU * comprises the length of the PPP packet information field * including padding. The protocol field, and any space for HDLC * address/control/FCS data is not accounted for by the MRU. @TODO * support */ LCPOpt_MaximumReceiveUnit = 1, /** RFC 1662 section 7.1. Payload is a uint32_t representing a set * of ASCII control characters. @note Not currently supported */ LCPOpt_AsyncControlCharacterMap = 2, /** RFC 1661 section 6.2. Payload is a uint16_t denoting an * authentication protocol, followed by protocol-specific data. * @note Not currently supported. */ LCPOpt_AuthenticationProtocol = 3, /** RFC 1661 section 6.3. Payload is a uint16_t denoting a quality * protocol, followed by protocol-specific data. @note Not * currently supported. */ LCPOpt_QualityProtocol = 4, /** RFC 1661 section 6.4. Payload is a uint32_t. @TODO support */ LCPOpt_MagicNumber = 5, // 6 deprecated /** RFC 1661 section 6.5. No payload; presence of option is * sufficient. @TODO support */ LCPOpt_ProtocolFieldCompression = 7, /** RFC 1661 section 6.6. No payload; presence of option is * sufficient. @TODO support */ LCPOpt_AddressControlFieldCompression = 8, /* No other LCP options are currently proposed for support */ }; /** Information required by the Protocol-Reject.invoke() method * provided by the LCP component. */ typedef struct protocolReject_param_t { unsigned int protocol; const uint8_t* information; unsigned int information_length; } protocolReject_param_t; #endif /* PPP_LCP_H */ tinyos-2.1.2+dfsg/tos/lib/ppp/ppp.h000066400000000000000000000154371207233610700171150ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef PPP_PPP_H #define PPP_PPP_H #ifndef PPP_PREFERRED_MRU /** The preferred MRU for packets. This is negotiated, unless it is * the PPP default of 1500 octets. The value reflects the size of the * information field of a PPP packet. Also note that RFC1661 mandates * the implemention must support frames with information fields up to * 1500 octets regardless of the negotiated MRU. We don't necessarily * do that; see PPP_MAXIMUM_MRU. * * It is the developers responsibility to ensure PPP_PREFERRED_MRU <= * PPP_MAXIMUM_MRU, or to intentionally violate this requirement. * * @note Linux PPP requires that the negotiated MRU be at least 1280 * bytes, or it will fail to assign an IPV6 address to the link. * Since the whole point of doing PPP is to enable IPv6, by default * we'll lie during negotation and pretend we can handle 1280 bytes. */ #define PPP_PREFERRED_MRU 1280 #endif /* PPP_PREFERRED_MRU */ #ifndef PPP_MAXIMUM_MRU /** The hard maximum on the length of an information field for a * received PPP frame. Frames that exceed this limit will be dropped * at the HDLC layer. * * It is the developers responsibility to ensure PPP_PREFERRED_MRU <= * PPP_MAXIMUM_MRU, or to intentionally violate this requirement. */ #define PPP_MAXIMUM_MRU PPP_PREFERRED_MRU #endif /* PPP_MAXIMUM_MRU */ #ifndef PPP_HDLC_RX_FRAME_LIMIT /** The maximum number of frames supported by the fragment pool used * for HDLC reception buffers. */ #define PPP_HDLC_RX_FRAME_LIMIT 4 #endif /* PPP_HDLC_RX_FRAME_LIMIT */ #ifndef PPP_HDLC_TX_FRAME_LIMIT /** The maximum number of frames supported by the fragment pool used * for HDLC transmission buffers. */ #define PPP_HDLC_TX_FRAME_LIMIT 4 #endif /* PPP_HDLC_TX_FRAME_LIMIT */ #ifndef PPP_MINIMUM_TX_FRAME_SIZE /** The minimum size, in octets, for an acceptable transmission buffer * to be returned by Ppp.getOutputFrame(). */ #define PPP_MINIMUM_TX_FRAME_SIZE 16 #endif /* PPP_MINIMUM_TX_FRAME_SIZE */ enum { /** The Link Control Protocol is defined in RFC 1661. */ PppProtocol_LinkControlProtocol = 0xc021, /** The IPv6 Protocol is defined in RFC 5072. */ PppProtocol_Ipv6 = 0x57, /** The IPv6 Control Protocol is defined in RFC 5072. */ PppProtocol_Ipv6Cp = 0x8057, }; /** Type holding a key that identifies a particular message frame. * For output frames, the key is the pointer value passed to * Ppp.sendOutputFrame. This key is provided in the subsequent * outputFrameTransmitted event. * * For input frames, the key is the value returned by * Ppp.holdInputFrame. This key must be provided to the subsequent * releaseInputFrame command. * * @note Although the key should be opaque to callers, various parts * of the implementation do rely on its value. */ typedef const uint8_t* frame_key_t; /** Enumerations for control protocol code values. Nominally defined * for the Link-Control-Protocol, in fact these codes are generally * re-used for network control protocols as well. */ enum { /** RFC 1661 section 5.1. Data field contains a sequence of options. */ PppControlProtocolCode_ConfigureRequest = 1, /** RFC 1661 section 5.2. Data field contains a sequence of options. */ PppControlProtocolCode_ConfigureAck = 2, /** RFC 1661 section 5.3. Data field contains a sequence of options. */ PppControlProtocolCode_ConfigureNak = 3, /** RFC 1661 section 5.4. Data field contains a sequence of options. */ PppControlProtocolCode_ConfigureReject = 4, /** RFC 1661 section 5.5. Data field contains uninterpreted data * for use by sender. */ PppControlProtocolCode_TerminateRequest = 5, /** RFC 1661 section 5.5. Data field contains uninterpreted data * for use by sender. */ PppControlProtocolCode_TerminateAck = 6, /** RFC 1661 section 5.6. Data field contains rejected packet, * beginning with information field, truncated to peer's MRU. */ PppControlProtocolCode_CodeReject = 7, /** RFC 1661 section 5.7. Data field contains rejected protocol as * a uint16_t, followed by a copy of the rejected packet, beginning * with the information field, truncated to peer's MRU. */ PppControlProtocolCode_ProtocolReject = 8, /** RFC 1661 section 5.8. Data field contains the magic number * followed by uninterpreted data for use by sender. */ PppControlProtocolCode_EchoRequest = 9, /** RFC 1661 section 5.8. Data field contains the replier's magic * number, with the remainder matching the EchoRequest payload. */ PppControlProtocolCode_EchoReply = 10, /** RFC 1661 section 5.9. Data field contains the magic number * followed by uninterpreted data for use by sender. */ PppControlProtocolCode_DiscardRequest = 11, }; typedef struct PppOptions_t { /** If TRUE, a PPP protocol value that fits in one octet may be * stored that way when messages are transmitted. */ bool txProtocolFieldCompression; /** If TRUE, a PPP protocol value that fits in one octet may be * extracted that way when messages are received. */ bool rxProtocolFieldCompression; /** Records the information field size that the remote has * indicated it prefers to receive. */ uint16_t txMaximumReceiveUnit; /** Records the information field size that the remote has agreed * not to exceed */ uint16_t rxMaximumReceiveUnit; } PppOptions_t; #endif /* PPP_PPP_H */ tinyos-2.1.2+dfsg/tos/lib/ppp/pppipv6.h000066400000000000000000000043131207233610700177110ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Material supporting RFC5072 IPv6-over-PPP, without being bound to * a particular TinyOS implementation of IP. * * @author Peter A. Bigot */ #ifndef PPP_IPV6CP_H #define PPP_IPV6CP_H enum { /** RFC 5072 section 4.1. Payload is a 64-bit interface identifier. * A payload value of all zeros indicates a request that the peer * assign one via a Configure-Nak message. */ Ipv6CpOpt_InterfaceIdentifier = 1, }; /** An RFC5072 interface identifier is a 64-bit integer, suitable for * use as a link-local IPV6 IID. */ typedef struct ppp_ipv6cp_iid_t { uint8_t iid[8]; } ppp_ipv6cp_iid_t; #endif /* PPP_IPV6CP_H */ tinyos-2.1.2+dfsg/tos/lib/ppp/tests/000077500000000000000000000000001207233610700172755ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcEcho/000077500000000000000000000000001207233610700207465ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcEcho/Makefile000066400000000000000000000002601207233610700224040ustar00rootroot00000000000000COMPONENT=TestAppC TOSMAKE_PATH += .. TOSMAKE_PATH += . PFLAGS += -I$(TOSDIR)/lib/printf PFLAGS += -I$(TOSDIR)/lib/fragpool PFLAGS += -I$(TOSDIR)/lib/ppp include $(MAKERULES) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcEcho/README.txt000066400000000000000000000013761207233610700224530ustar00rootroot00000000000000The HdlcEcho application receives HDLC-encoded frames and echoes them back, with the number of octets in the received frame inserted at the start (resulting in a returned frame that is one octet longer than was sent). This test requires the PPP4Py package. See $(OSIANROOT)/tinyos/tos/lib/ppp/README for further details. Build and install for your platform. If your device is not available on /dev/ttyUSB0 at 115200 baud, you will have to edit the gendata.py script. Then run the test.sh script. Test this with these build combinations: # Defaults make osian surf # Enable mote-side compression of the address/control fields make accomp osian surf # Enable both mote-side and pc-side compression of address/control fields make accomp inhibit_accomp osian surf tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcEcho/TestAppC.nc000066400000000000000000000042511207233610700227550ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Receive HDLC-encoded frames and return them with a length octet * inserted at the front. * * @author Peter A. Bigot */ configuration TestAppC { } implementation { components TestP; components MainC; TestP.Boot -> MainC; TestP.HdlcFraming -> HdlcFramingC; TestP.HdlcFramingOptions -> HdlcFramingC; components LedC; TestP.MultiLed -> LedC; components new HdlcFramingC(1024, 2); HdlcFramingC.HdlcUart -> DefaultHdlcUartC; HdlcFramingC.UartControl -> DefaultHdlcUartC; TestP.HdlcControl -> HdlcFramingC; components DefaultHdlcUartC; components SerialPrintfC; } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcEcho/TestP.nc000066400000000000000000000064561207233610700223420ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include module TestP { uses { interface Boot; interface MultiLed; interface HdlcFraming; interface StdControl as HdlcControl; interface GetSetOptions as HdlcFramingOptions; } } implementation { #ifndef ACCOMP #define ACCOMP 0 #endif #ifndef INHIBIT_ACCOMP #define INHIBIT_ACCOMP 0 #endif uint8_t echo_buffer[1025]; unsigned int echo_len; event void Boot.booted() { error_t rc; HdlcFramingOptions_t options; memset(&options, 0, sizeof(options)); #if ACCOMP options.txSuppressAddressControl = options.rxSuppressAddressControl = 1; #endif; call HdlcFramingOptions.set(&options); options = call HdlcFramingOptions.get(); printf("\r\n\r\n! compress_ac %d\r\n", (options.txSuppressAddressControl << 1) | options.rxSuppressAddressControl); printf("! inhibit_accomp %d\r\n", INHIBIT_ACCOMP); printf("# Boot configuration ready\r\n"); rc = call HdlcControl.start(); if (SUCCESS != rc) { printf("@@@ ERROR: HDLC start got %d\r\n", rc); } } event void HdlcFraming.sendDone (const uint8_t* data, unsigned int len, error_t err) { } task void sendFrame () { call HdlcFraming.sendFrame(echo_buffer, echo_len, INHIBIT_ACCOMP); } event void HdlcFraming.receivedFrame (const uint8_t* data, unsigned int len) { call MultiLed.toggle(0); memcpy(echo_buffer+1, data, len); call HdlcFraming.releaseReceivedFrame(data); echo_buffer[0] = len; echo_len = 1 + len; post sendFrame(); } async event void HdlcFraming.receivedDelimiter () { } async event void HdlcFraming.receptionError (HdlcError_e error) { } } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcEcho/gendata.py000066400000000000000000000063051207233610700227270ustar00rootroot00000000000000import time import ppp4py.hdlc import sys import serial import select import binascii import struct surf_dev = '/dev/ttyUSB0' surf = serial.Serial(surf_dev, baudrate=115200, timeout=5) poller = select.poll() poller.register(surf.fileno()) compress_ac = False inhibit_accomp = False print 'Reading boot status (one line):' while True: t = surf.readline().strip() while t.startswith('\0'): t = t[1:] print t if t.startswith('#'): break if t.startswith('!'): (flag, value) = t[1:].split() value = int(value) print 'flag "%s" value "%d"' % (flag, value) if 'compress_ac' == flag: compress_ac = (0 != value) elif 'inhibit_accomp' == flag: inhibit_accomp = (0 != value) else: print 'Unrecognized flag %s' % (flag,) print 'Address/control compression: %s' % (compress_ac,) framer = ppp4py.hdlc.HDLCforPPP(compress_ac=(compress_ac and not inhibit_accomp)) framer.updateReceivingACCM(0) tests = [ 'a', 'a', 'b', "a\nb", "1\x7e2", "\x7e\x7d\x7d\x72", '123456\x7d89a\x7eABC' * 50 ] def ProcessResponse_Text (framer, test): response = '' while True: if poller.poll(None): c = surf.read() if "\n" == c: print response response = '' return else: response += c num_errors = 0 def ProcessResponse (framer, tx_text): global num_errors timeout = 5000 frame = '' while poller.poll(timeout): c = surf.read() #print 'RX %s' % (binascii.hexlify(c),) framer.putBytes(c) frame += c pkt = framer.getPacket() if (pkt is not None) and (0 < len(pkt)): print 'FRAME: %s' % (binascii.hexlify(frame),) # The address and control frame prefix should be present # iff compress_ac is false or inhibit_accomp is true. fi = 0 if '\x7e' == frame[fi]: fi += 1 if (not compress_ac) or inhibit_accomp: if '\xff\x03' != frame[fi:fi+2]: print 'ERROR: Missing address/control fields' num_errors += 1 else: if '\xff\x03' == frame[fi:fi+2]: print 'ERROR: Unexpected address/control fields' num_errors += 1 (rx_len,) = struct.unpack('B', pkt[0]) rx_text = pkt[1:] if rx_len == (0xff & len(tx_text)): if rx_text == tx_text: print 'PASS rx echoed %d bytes correctly' % (len(tx_text),) else: print 'FAIL tx %s rx %s content error' % (binascii.hexlify(tx_text), binascii.hexlify(rx_text)) num_errors += 1 else: print 'FAIL tx len %d text %s, rx len %d text %s' % (len(tx_text), binascii.hexlify(tx_text), rx_len, binascii.hexlify(rx_text)) num_errors += 1 return for t in tests: framed = framer.framePacket(t) print '\nTest: %s' % (binascii.hexlify(t),) print 'Frame: %s' % (binascii.hexlify(framed),) rv = surf.write(framed) ProcessResponse(framer, t) print 'Total errors: %d' % (num_errors,) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcEcho/inhibit_accomp.extra000066400000000000000000000002631207233610700247640ustar00rootroot00000000000000# Control the flag that requests the remote to inhibit adress/control # compression. ifeq ($(INHIBIT_ACCOMP),) INHIBIT_ACCOMP=1 endif PFLAGS += -DINHIBIT_ACCOMP=$(INHIBIT_ACCOMP) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcEcho/test.sh000077500000000000000000000005701207233610700222660ustar00rootroot00000000000000#!/bin/sh # # Standard test configuration and loop loopcond=true breakloop () { loopcond=false } trap breakloop 1 2 cat < */ configuration TestAppC { } implementation { components TestP; components MainC; components PseudoSerialC; components new HdlcFramingC(256, 4); HdlcFramingC.HdlcUart -> PseudoSerialC; HdlcFramingC.UartControl -> PseudoSerialC; TestP.HdlcControl -> HdlcFramingC; TestP.PseudoSerial -> PseudoSerialC; TestP.HdlcFraming -> HdlcFramingC; TestP.DebugHdlcFraming -> HdlcFramingC; components new MuxAlarmMilli32C(); TestP.KickMe -> MuxAlarmMilli32C; TestP.Boot -> MainC; #include } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcFraming/TestP.nc000066400000000000000000000111571207233610700230410ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include module TestP { uses { interface Boot; interface PseudoSerial; interface StdControl as HdlcControl; interface HdlcFraming; interface DebugHdlcFraming; interface Alarm as KickMe; } #include } implementation { #include const HdlcRxFrame_t* rxFrames_; const HdlcRxFrame_t* rxFrameEnd_; const uint8_t* frames[8]; unsigned int frameLengths[8]; uint8_t frameIdx; uint8_t testCase_; task void kickTestCase_task (); void dumpRxFrame (const HdlcRxFrame_t* fp) { printf("RX %d: %p %p state %d\r\n", fp-rxFrames_, fp->start, fp->end, fp->frame_state); } void dumpRxFrames () { const HdlcRxFrame_t* fp = rxFrames_; while (fp < rxFrameEnd_) { dumpRxFrame(fp++); } } task void kickTestCase_task(); event void HdlcFraming.sendDone (const uint8_t* data, unsigned int len, error_t err) { } event void HdlcFraming.receivedFrame (const uint8_t* data, unsigned int len) { frames[frameIdx] = data; frameLengths[frameIdx] = len; ++frameIdx; post kickTestCase_task(); } async event void KickMe.fired () { post kickTestCase_task(); } async event void HdlcFraming.receivedDelimiter () { } async event void HdlcFraming.receptionError (HdlcError_e code) { } unsigned int stage_; task void testCase0_task () { switch (stage_++) { case 0: ASSERT_EQUAL(RFS_receiving, rxFrames_[0].frame_state); call PseudoSerial.feedUartStream("\x7e\xff\x7d\x23\x61\xd8\x58\x7e", 8); break; case 1: ASSERT_EQUAL(RFS_processing, rxFrames_[0].frame_state); ASSERT_EQUAL(RFS_receiving, rxFrames_[1].frame_state); call PseudoSerial.feedUartStream("\xff\x7d\x23\x61\xd8\x58\x7e", 7); break; case 2: ASSERT_EQUAL(RFS_processing, rxFrames_[0].frame_state); call HdlcFraming.releaseReceivedFrame(frames[0]); ASSERT_EQUAL(RFS_releasable, rxFrames_[0].frame_state); post kickTestCase_task(); break; case 3: ASSERT_EQUAL(RFS_unused, rxFrames_[0].frame_state); call HdlcFraming.releaseReceivedFrame(frames[1]); post kickTestCase_task(); break; default: ++testCase_; post kickTestCase_task(); break; } } task void kickTestCase_task () { printf("TC %d S %d\r\n", testCase_, stage_); dumpRxFrames(); switch (testCase_) { case 0: post testCase0_task(); break; default: ALL_TESTS_PASSED(); //NOTREACHED break; } } void startTestCase (int test_case) { stage_ = 0; testCase_ = test_case; post kickTestCase_task(); } event void Boot.booted () { printf("Booted\r\n"); rxFrames_ = call DebugHdlcFraming.rxFrames(); rxFrameEnd_ = rxFrames_ + call DebugHdlcFraming.numRxFrames(); call HdlcControl.start(); dumpRxFrames(); startTestCase(0); } } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcRead/000077500000000000000000000000001207233610700207435ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcRead/Makefile000066400000000000000000000002361207233610700224040ustar00rootroot00000000000000COMPONENT=TestAppC TOSMAKE_PATH += .. PFLAGS += -I$(TOSDIR)/lib/printf PFLAGS += -I$(TOSDIR)/lib/fragpool PFLAGS += -I$(TOSDIR)/lib/ppp include $(MAKERULES) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcRead/README.txt000066400000000000000000000006131207233610700224410ustar00rootroot00000000000000The HdlcRead application receives HDLC-encoded frames over the serial port, and prints a summary of what it got. This test requires the PPP4Py package. See $(OSIANROOT)/tinyos/tos/lib/ppp/README for further details. Build and install for your platform. If your device is not available on /dev/ttyUSB0 at 115200 baud, you will have to edit the gendata.py script. Then run the test.sh script. tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcRead/TestAppC.nc000066400000000000000000000041761207233610700227600ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Test mote-side decoding of HDLC-encoded frames. * * @author Peter A. Bigot */ configuration TestAppC { } implementation { components TestP; components LedC; components MainC; TestP.Boot -> MainC; TestP.HdlcFraming -> HdlcFramingC; TestP.HdlcFramingOptions -> HdlcFramingC; TestP.MultiLed -> LedC; components new HdlcFramingC(256, 3); HdlcFramingC.HdlcUart -> DefaultHdlcUartC; HdlcFramingC.UartControl -> DefaultHdlcUartC; TestP.HdlcControl -> HdlcFramingC; components DefaultHdlcUartC; components SerialPrintfC; } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcRead/TestP.nc000066400000000000000000000066451207233610700223370ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include "HdlcFraming.h" module TestP { uses { interface Boot; interface MultiLed; interface StdControl as HdlcControl; interface HdlcFraming; interface GetSetOptions as HdlcFramingOptions; } } implementation { #ifndef ACCOMP #define ACCOMP 0 #endif const uint8_t* rx_buffer; int frame_length; task void showFrame () { const uint8_t* fp = rx_buffer; const uint8_t* fe = fp + frame_length; if (fp) { printf("Frame of %d chars:", fe - fp); while (fp < fe) { printf(" %02x", *fp++); } printf("\r\n"); call HdlcFraming.releaseReceivedFrame(rx_buffer); rx_buffer = 0; } else { printf("ERROR: showFrame() with no frame available\r\n"); } } event void Boot.booted() { error_t rc; HdlcFramingOptions_t options; memset(&options, 0, sizeof(options)); #if ACCOMP options.txSuppressAddressControl = options.rxSuppressAddressControl = 1; #endif; rc = call HdlcFramingOptions.set(&options); if (SUCCESS != rc) { printf("*** ERROR configuring HDLC options\r\n"); return; } options = call HdlcFramingOptions.get(); printf("\r\n\r\n! compress_ac %d\r\n", (options.txSuppressAddressControl << 1) | options.rxSuppressAddressControl); printf("# Boot configuration ready\r\n"); rc = call HdlcControl.start(); if (SUCCESS != rc) { printf("# HDLC start got %d\r\n", rc); } } event void HdlcFraming.sendDone (const uint8_t* data, unsigned int len, error_t err) { } event void HdlcFraming.receivedFrame (const uint8_t* data, unsigned int len) { rx_buffer = data; frame_length = len; post showFrame(); } async event void HdlcFraming.receivedDelimiter () { } async event void HdlcFraming.receptionError (HdlcError_e error) { call MultiLed.set(0x10 + error); } } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcRead/gendata.py000066400000000000000000000046551207233610700227320ustar00rootroot00000000000000import time import ppp4py.hdlc import sys import serial import select import binascii import struct surf_dev = '/dev/ttyUSB0' surf = serial.Serial(surf_dev, baudrate=115200, timeout=5) poller = select.poll() poller.register(surf.fileno()) compress_ac = True print 'Reading boot status (one line):' while True: t = surf.readline().strip() while t.startswith('\0'): t = t[1:] print t if t.startswith('#'): break if t.startswith('!'): (flag, value) = t[1:].split() value = int(value) print 'flag "%s" value "%d"' % (flag, value) if 'compress_ac' == flag: compress_ac = (0 != value) else: print 'Unrecognized flag %s' % (flag,) print 'Address/control compression: %s' % (compress_ac,) framer = ppp4py.hdlc.HDLCforPPP(compress_ac=compress_ac) #framer.setFrameCheckSequenceHelper(ppp4py.hdlc.FrameCheckSequenceNull) framer.setFrameCheckSequenceHelper(ppp4py.hdlc.FrameCheckSequence16) framer.updateReceivingACCM(0) tests = [ 'a', 'a', 'b', "a\nb", "1\x7e2", "\x7e\x7d\x7d\x72", '12345678', '', '123' ] def ProcessResponse_Text (framer, test): response = '' while True: if poller.poll(None): c = surf.read() if "\n" == c: print response response = '' return else: response += c def ProcessResponse (framer, tx_text): return ProcessResponse_Text(framer, tx_text) timeout = 5000 while poller.poll(timeout): c = surf.read() print 'RX %s' % (binascii.hexlify(c),) framer.putBytes(c) pkt = framer.getPacket() if (pkt is not None) and (0 < len(pkt)): (rx_len,) = struct.unpack('B', pkt[0]) rx_text = pkt[1:] if rx_len == len(tx_text): if rx_text == tx_text: print 'PASS rx echoed %d bytes correctly' % (rx_len) else: print 'FAIL tx %s rx %s content error' % (binascii.hexlify(tx_text), binascii.hexlify(rx_text)) else: print 'FAIL tx len %d text %s, rx len %d text %s' % (len(tx_text), binascii.hexlify(tx_text), rx_len, binascii.hexlify(rx_text)) return for t in tests: framed = framer.framePacket(t) print '\nTest: %s' % (binascii.hexlify(t),) print 'Frame: %s' % (binascii.hexlify(framed),) rv = surf.write(framed) ProcessResponse(framer, t) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcRead/test.sh000077500000000000000000000005701207233610700222630ustar00rootroot00000000000000#!/bin/sh # # Standard test configuration and loop loopcond=true breakloop () { loopcond=false } trap breakloop 1 2 cat < */ configuration TestAppC { } implementation { components TestP; components MainC; TestP.Boot -> MainC; TestP.HdlcFraming -> HdlcFramingC; TestP.HdlcControl -> HdlcFramingC; TestP.HdlcFramingOptions -> HdlcFramingC; components LedC; TestP.ReceiveLed -> LedC.Green; TestP.SendLed -> LedC.Blue; TestP.ErrorLed -> LedC.Red; #if WITH_DISPLAYCODE components DisplayCodeC; TestP.DisplayCodeHdlc -> DisplayCodeC.DisplayCode[2]; TestP.DisplayCodeHdlcCount -> DisplayCodeC.DisplayCode[3]; #endif /* WITH_DISPLAYCODE */ components new HdlcFramingC(2400, 8); HdlcFramingC.HdlcUart -> DefaultHdlcUartC; HdlcFramingC.UartControl -> DefaultHdlcUartC; components CounterMicro32C; components new CounterToLocalTimeC(TMicro) as CounterToLocalTimeMicroC; CounterToLocalTimeMicroC.Counter -> CounterMicro32C; TestP.LocalTimeMicro -> CounterToLocalTimeMicroC; components DefaultHdlcUartC; components SerialPrintfC; } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcSpeed/TestP.nc000066400000000000000000000141441207233610700225150ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include #include "config.h" module TestP { uses { interface Boot; interface Led as SendLed; interface Led as ReceiveLed; interface Led as ErrorLed; interface HdlcFraming; interface StdControl as HdlcControl; interface GetSetOptions as HdlcFramingOptions; interface LocalTime as LocalTimeMicro; #if PLATFORM_SURF interface Msp430UsciError; #endif /* PLATFORM_SURF */ #if WITH_DISPLAYCODE interface DisplayCode as DisplayCodeHdlc; interface DisplayCode as DisplayCodeHdlcCount; #endif /* WITH_DISPLAYCODE */ } } implementation { typedef nx_struct payload_t { nx_uint16_t tx_id; nx_uint16_t rx_length; nx_uint16_t rx_id; nx_uint32_t rx_duration_us; nx_uint32_t tx_duration_us; nx_uint32_t hdlc_errors; nx_uint16_t usci_error_count; nx_uint16_t usci_error_bits; } payload_t; uint8_t tx_frame[FRAME_SIZE]; unsigned int rx_length; payload_t* tx_payload = (payload_t*)tx_frame; unsigned int tx_id; unsigned int rx_last_id; uint32_t hdlc_errors; uint16_t hdlc_error_count; uint16_t usci_error_count; uint16_t usci_error_bits; uint32_t rx_start_us; uint32_t rx_duration_us; uint32_t tx_start_us; uint32_t tx_duration_us; bool send_on_rx; void startReceive () { atomic { rx_start_us = call LocalTimeMicro.get(); } } task void startSend () { error_t rc; if (tx_id >= REPETITIONS) { return; } atomic { tx_payload->tx_id = ++tx_id; tx_payload->rx_length = rx_length; tx_payload->rx_id = rx_last_id; tx_payload->rx_duration_us = rx_duration_us; tx_payload->tx_duration_us = tx_duration_us; tx_payload->hdlc_errors = hdlc_errors; tx_payload->usci_error_count = usci_error_count; tx_payload->usci_error_bits = usci_error_bits; hdlc_errors = 0; usci_error_bits = 0; } tx_start_us = call LocalTimeMicro.get(); rc = call HdlcFraming.sendFrame(tx_frame, sizeof(tx_frame), FALSE); if (SUCCESS == rc) { call SendLed.on(); } } event void Boot.booted() { error_t rc; HdlcFramingOptions_t options; // options = call HdlcFramingOptions.get(); memset(&options, 0, sizeof(options)); #if ACCOMP options.txSuppressAddressControl = options.rxSuppressAddressControl = 1; #endif; rc = call HdlcFramingOptions.set(&options); if (SUCCESS != rc) { printf("*** ERROR: Attempt to configure options failed\r\n"); return; } #if WITH_DISPLAYCODE call DisplayCodeHdlc.setValueWidth(1); call DisplayCodeHdlcCount.setValueWidth(2); #endif /* WITH_DISPLAYCODE */ options = call HdlcFramingOptions.get(); printf("\r\n\r\n! compress_ac %d\r\n", (options.txSuppressAddressControl << 1) | options.rxSuppressAddressControl); printf("! frame_size %d\r\n", FRAME_SIZE); printf("! repetitions %d\r\n", REPETITIONS); printf("! full_duplex %d\r\n", FULL_DUPLEX); call HdlcControl.start(); printf("# Boot configuration ready\r\n"); atomic { send_on_rx = TRUE; } startReceive(); } async event void HdlcFraming.receivedDelimiter () { } async event void HdlcFraming.receptionError (HdlcError_e error) { atomic { hdlc_errors = error; // (hdlc_errors * 10) | error; ++hdlc_error_count; } #if WITH_DISPLAYCODE call DisplayCodeHdlc.setValue(error); call DisplayCodeHdlc.enable(TRUE); call DisplayCodeHdlcCount.setValue(hdlc_error_count); call DisplayCodeHdlcCount.enable(TRUE); #else /* WITH_DISPLAYCODE */ call ErrorLed.on(); #endif /* WITH_DISPLAYCODE */ } event void HdlcFraming.sendDone (const uint8_t* data, unsigned int len, error_t err) { uint32_t now = call LocalTimeMicro.get(); tx_duration_us = now - tx_start_us; call SendLed.off(); #if FULL_DUPLEX post startSend(); #endif } event void HdlcFraming.receivedFrame (const uint8_t* data, unsigned int len) { uint32_t now = call LocalTimeMicro.get(); call ReceiveLed.toggle(); rx_duration_us = now - rx_start_us; rx_length = len; rx_last_id = ((payload_t*)data)->tx_id; call HdlcFraming.releaseReceivedFrame(data); startReceive(); if (send_on_rx) { post startSend(); #if FULL_DUPLEX send_on_rx = FALSE; #endif } } #if PLATFORM_SURF async event void Msp430UsciError.condition (unsigned int errors) { atomic { ++usci_error_count; usci_error_bits |= errors; } } #endif /* PLATFORM_SURF */ } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcSpeed/config.h000066400000000000000000000004531207233610700225500ustar00rootroot00000000000000#ifndef TEST_CONFIG_H_ #define TEST_CONFIG_H_ #ifndef ACCOMP #define ACCOMP 1 #endif #ifndef FRAME_SIZE #define FRAME_SIZE 32 #endif /* FRAME_SIZE */ #ifndef REPETITIONS #define REPETITIONS 1 #endif /* REPETITIONS */ #ifndef FULL_DUPLEX #define FULL_DUPLEX 0 #endif #endif /* TEST_CONFIG_H_ */ tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcSpeed/gendata.py000066400000000000000000000061271207233610700231130ustar00rootroot00000000000000import time import ppp4py.hdlc import sys import serial import select import binascii import struct import fcntl import os from payload import Payload baudrate = 115200 #baudrate = 19200 surf_dev = '/dev/ttyUSB0' surf = serial.Serial(surf_dev, baudrate=baudrate, timeout=5) compress_ac = True frame_size = 16 repetitions = 10 full_duplex = 0 print 'Reading boot status (one line):' finished_header = False while not finished_header: t = surf.readline().strip() while t.startswith('\0'): t = t[1:] print t if t.startswith('#'): finished_header = True break if t.startswith('!'): try: (flag, value) = t[1:].split() value = int(value) print 'flag "%s" value "%d"' % (flag, value) if 'compress_ac' == flag: compress_ac = (0 != value) elif 'frame_size' == flag: frame_size = value elif 'repetitions' == flag: repetitions = value elif 'full_duplex' == flag: full_duplex = value else: print 'Unrecognized flag %s' % (flag,) except Exception, e: print e print 'Address/control compression: %s' % (compress_ac,) framer = ppp4py.hdlc.HDLCforPPP(compress_ac=compress_ac) framer.updateReceivingACCM(0) framer.updateSendingACCM(0) tests = [ 'a', 'a', 'b', "a\nb", "1\x7e2", "\x7e\x7d\x7d\x72" ] tests.append('123456\x7d89a\x7eABC' * 50) poller = select.poll() try: flags = fcntl.fcntl(surf.fileno(), fcntl.F_GETFL) flags += os.O_NONBLOCK #fcntl.fcntl(surf.fileno(), fcntl.F_SETFL, flags) except IOError, e: print e # Keep from out-running the cc430 by only allowing transmission to be # this many frames ahead of reception. Need at least one to kick off # the session; for full duplex, add another couple to keep this end # busy while we're receiving more. tx_allowed = 1 if full_duplex: tx_allowed += 2 tx_payload = Payload() outgoing = '' timeout_ms = None rx_count = 0 while True: if timeout_ms is None: timeout_ms = 10000 events = select.POLLIN if (0 == len(outgoing)) and (tx_payload is not None): if tx_allowed and (tx_payload.tx_id < repetitions): tx_payload.tx_id += 1 outgoing += framer.framePacket(tx_payload.pack(frame_size)) tx_allowed -= 1 #print 'Outgoing len %d after queuing %s' % (len(outgoing), tx_payload) if 0 < len(outgoing): events |= select.POLLOUT poller.register(surf.fileno(), events) for (_, events) in poller.poll(timeout_ms): if events & (select.POLLHUP + select.POLLERR): print 'Serial error' break; if events & select.POLLIN: framer.putBytes(surf.read()) if events & select.POLLOUT: oglen = min(1, len(outgoing)) #oglen = len(outgoing) rv = surf.write(outgoing[:oglen]) outgoing = outgoing[oglen:] pkt = framer.getPacket() while pkt is not None: print Payload(pkt) rx_count += 1 tx_allowed += 1 pkt = framer.getPacket() tinyos-2.1.2+dfsg/tos/lib/ppp/tests/HdlcSpeed/payload.py000066400000000000000000000022471207233610700231400ustar00rootroot00000000000000import struct class Payload (object): __FORMAT = '!HHHIIIHH' __LENGTH = struct.calcsize(__FORMAT) __FIELDS = ( 'tx_id', 'rx_length', 'rx_id', 'rx_dur_us', 'tx_dur_us', 'hdlc_errs', 'uec', 'ueb') tx_id = 0 rx_length = 0 rx_id = 0 rx_dur_us = 0 tx_dur_us = 0 hdlc_errors = 0 uec = 0 ueb = 0 def __init__ (self, packed=None): for f in self.__FIELDS: self.__dict__.setdefault(f, 0) if packed is not None: self.setFromPacked(packed) def setFromPacked (self, packed): self.__dict__.update(zip(self.__FIELDS, struct.unpack(self.__FORMAT, packed[:self.__LENGTH]))) def pack (self, total_length=None): field_values = [ self.__dict__[_f] for _f in self.__FIELDS ] packed = struct.pack(self.__FORMAT, *field_values) if total_length is not None: remainder = total_length - len(packed) if (0 < remainder): packed += struct.pack('%dB' % (remainder,), *[(_v & 0xff) for _v in xrange(remainder) ]) return packed def __str__ (self): return ' '.join(['%s=%d' % (_f, self.__dict__[_f]) for _f in self.__FIELDS]) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Ipv6/000077500000000000000000000000001207233610700201215ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Ipv6/Makefile000066400000000000000000000003261207233610700215620ustar00rootroot00000000000000COMPONENT=TestAppC TOSMAKE_PATH += . PFLAGS += -I$(TOSDIR)/lib/ppp PFLAGS += -I$(TOSDIR)/lib/fragpool PFLAGS += -I$(TOSDIR)/lib/printf PFLAGS += -I$(TOSDIR)/platforms/$(PLATFORM)/chips/msp430 include $(MAKERULES) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Ipv6/README.txt000066400000000000000000000014701207233610700216210ustar00rootroot00000000000000Basic demonstration of a PPP application negotiating support for RFC5072 IPv6 over PPP. The red LED indicates that the PPP link is down; the green LED indicates that it is up. Upon receipt of an IPv6 packet, the blue LED toggles, and the number of octets in the packet is printed over the PPP link. Use a standard Linux PPP daemon, or the osianpppd script, to form the connection. pppd \ 115200 \ debug \ passive \ noauth \ nodetach \ noccp \ ipv6 ::23,::24 \ noip \ /dev/ttyUSB0 You can only see the printf data if your ppp daemon has the necessary patch to add that protocol. Ping the remote interface to verify packets are being received over the NCP: ping6 fe80::24%ppp0 For a basic check using PPP4Py, run these commands: make surf osian dco,16 install \ && python pppd.py tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Ipv6/TestAppC.nc000066400000000000000000000063171207233610700221350ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" /** Demonstration of a PPP daemon application that negotiates and * maintains an RFC5072 IPv6 over PPP connection. * * The red LED indicates that the PPP link is down; the green LED * indicates that it is up. Upon receipt of an IPv6 packet, the blue * LED toggles, and the number of octets in the packet is printed over * the PPP link. * * Use a standard Linux PPP daemon, or the osianpppd script, to form * the connection. You can only see the printf data if your ppp * daemon has the necessary patch to add that protocol. * * @author Peter A. Bigot */ configuration TestAppC { } implementation { components TestP; components MainC; TestP.Boot -> MainC; components LedC; TestP.LinkUpLed -> LedC.Green; TestP.LinkDownLed -> LedC.Red; TestP.PacketRxLed -> LedC.Blue; /* The basic daemon, No network control protocols. */ components PppDaemonC; TestP.Ppp -> PppDaemonC; /* Hook up the serial infrastructure. */ components DefaultHdlcUartC; PppDaemonC.HdlcUart -> DefaultHdlcUartC; PppDaemonC.UartControl -> DefaultHdlcUartC; /* Link in RFC5072 support for both the control and network protocols */ components PppIpv6C; PppDaemonC.PppProtocol[PppIpv6C.ControlProtocol] -> PppIpv6C.PppControlProtocol; PppDaemonC.PppProtocol[PppIpv6C.Protocol] -> PppIpv6C.PppProtocol; PppIpv6C.Ppp -> PppDaemonC; PppIpv6C.LowerLcpAutomaton -> PppDaemonC; TestP.Ipv6LcpAutomaton -> PppIpv6C; TestP.PppIpv6 -> PppIpv6C; /* Link in the custom protocol for printf support */ components PppPrintfC; PppPrintfC.Ppp -> PppDaemonC; PppDaemonC.PppProtocol[PppPrintfC.Protocol] -> PppPrintfC; } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Ipv6/TestP.nc000066400000000000000000000023021207233610700214770ustar00rootroot00000000000000#include module TestP { uses { interface Boot; interface Led as LinkUpLed; interface Led as LinkDownLed; interface Led as PacketRxLed; interface SplitControl as Ppp; interface LcpAutomaton as Ipv6LcpAutomaton; interface PppIpv6; } } implementation { event void Ipv6LcpAutomaton.transitionCompleted (LcpAutomatonState_e state) { } event void Ipv6LcpAutomaton.thisLayerUp () { } event void Ipv6LcpAutomaton.thisLayerDown () { } event void Ipv6LcpAutomaton.thisLayerStarted () { } event void Ipv6LcpAutomaton.thisLayerFinished () { } event void Ppp.startDone (error_t error) { } event void Ppp.stopDone (error_t error) { } event void PppIpv6.linkUp () { call LinkDownLed.off(); call LinkUpLed.on(); } event void PppIpv6.linkDown () { call LinkUpLed.off(); call LinkDownLed.on(); } event error_t PppIpv6.receive (const uint8_t* message, unsigned int len) { call PacketRxLed.toggle(); printf("RX %u octets\n", len); return SUCCESS; } event void Boot.booted() { error_t rc; call LinkDownLed.on(); rc = call Ipv6LcpAutomaton.open(); rc = call Ppp.start(); } } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Ipv6/connection.py000077700000000000000000000000001207233610700262672../Lcp/connection.pyustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Ipv6/pppd.py000066400000000000000000000037311207233610700214420ustar00rootroot00000000000000import binascii from connection import pppd, framer, surf, poller import struct import sys import select import pppprint pppprint.Protocol(pppd) #import ppp4py.protocol.ccp #ccp = ppp4py.protocol.ccp.CompressionControlProtocol(pppd) #ccp.open() import ppp4py.protocol.ipv6cp ipv6cp = ppp4py.protocol.ipv6cp.Register(pppd) ipv6cp.setProposedRemoteInterface('::24') ipv6cp.setPreferredLocalInterface('::23') pppd.bringLinkUp() poller.register(surf.fileno(), select.POLLIN) stripped = [] while poller.poll(0): stripped.append(surf.read()) print 'Stripped: %s' % (binascii.hexlify(''.join(stripped)),) first_time_up = True stop = False print "ENTERING PPP LOOP" text = '' timeout_sec = None while not stop: if timeout_sec is None: timeout_sec = 1 events = select.POLLIN if pppd.hasPackets(): events |= select.POLLOUT poller.register(surf.fileno(), events) #print 'Poll timeout %s' % (timeout_sec,) for (_, events) in poller.poll(timeout_sec / 1000.0): if events & (select.POLLHUP + select.POLLERR): stop = True break if events & select.POLLIN: c = surf.read() if '\n' == c: print text #print binascii.hexlify(text) text = '' elif '\x7e' == c: #print 'DELIMITED: %s' % (binascii.hexlify(text),) text = '' else: text += c pppd.sendToFramer(c) timeout_sec = pppd.execute() for packet in pppd.getPackets(): print 'STX: %s' % (binascii.hexlify(packet),) surf.write(packet) surf.flush() if pppd._lcp.ST_opened == pppd._lcp._state: if first_time_up: first_time_up = False print 'UP AND RUNNING' #ccp.open() # Bounce the circuit once, to verify that things are renegotiated #pppd._lcp._evt_open() #pppd._lcp.echoRequest('hi!') #pppd._lcp.discardRequest('hi!') tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Ipv6/pppd.sh000066400000000000000000000002041207233610700214140ustar00rootroot00000000000000#!/bin/sh pppd \ debug \ passive \ noauth \ nodetach \ noccp \ ipv6 ::23,::24 \ noip \ /dev/ttyUSB0 tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Ipv6/pppprint.py000077700000000000000000000000001207233610700255212../Lcp/pppprint.pyustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Ipv6/test.sh000077500000000000000000000000641207233610700214370ustar00rootroot00000000000000make surf osian dco,16 install \ && python pppd.py tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/000077500000000000000000000000001207233610700200135ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/Makefile000066400000000000000000000003511207233610700214520ustar00rootroot00000000000000COMPONENT=TestAppC TOSMAKE_PATH += . TOSMAKE_PATH += .. PFLAGS += -I$(TOSDIR)/lib/ppp PFLAGS += -I$(TOSDIR)/lib/fragpool PFLAGS += -I$(TOSDIR)/lib/printf PFLAGS += -I$(TOSDIR)/platforms/$(PLATFORM)/chips/msp430 include $(MAKERULES) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/README.txt000066400000000000000000000024321207233610700215120ustar00rootroot00000000000000Lcp tests the basic link control protocol negotiation. This test is really an environment for manual experimentation. For a basic check run these commands: make surf osian dco,16 install \ && python pppd.py Ideally, a series of exchanges will be printed culminating in something like: 1349 PPP INFO Link up STX: ff7d23c0217d227d237d207d307d217d247d257d207d227d267d207d207d207d207d287d2239bc7e UP AND RUNNING You can also verify your vendor PPP daemon against this application, though no network control protocols are linked in so the comnnection may not form. pppd \ 115200 \ debug \ passive \ noauth \ nodetach \ noccp \ ipv6 ::23,::24 \ noip \ /dev/ttyUSB0 A successful execution in that case might produce: sent [LCP ConfReq id=0x1 ] rcvd [LCP ConfReq id=0x4 ] sent [LCP ConfAck id=0x4 ] rcvd [LCP ConfRej id=0x1 ] sent [LCP ConfReq id=0x2 ] rcvd [LCP ConfAck id=0x2 ] sent [IPV6CP ConfReq id=0x1 ] rcvd [LCP ProtRej id=0x0 80 57 01 01 00 0e 01 0a fd 41 42 42 0e 88 00 02] Protocol-Reject for 'IPv6 Control Protocol' (0x8057) received tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/TestAppC.nc000066400000000000000000000047131207233610700220250ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "ppp.h" /** Bring up the basic Link Control Protocol automaton. * * @author Peter A. Bigot */ configuration TestAppC { } implementation { components TestP; components MainC; TestP.Boot -> MainC; components LedC; TestP.MultiLed -> LedC; components PppDaemonC; TestP.Ppp -> PppDaemonC; TestP.LcpAutomaton -> PppDaemonC; components DefaultHdlcUartC; PppDaemonC.HdlcUart -> DefaultHdlcUartC; PppDaemonC.UartControl -> DefaultHdlcUartC; #if WITH_DISPLAYCODE #if PPP_DISPLAY_CODES components DisplayCodeC; #else /* PPP_DISPLAY_CODES */ components DummyDisplayCodeC as DisplayCodeC; #endif /* PPP_DISPLAY_CODES */ PppDaemonC.DisplayCodeLcpState -> DisplayCodeC.DisplayCode[DISPLAYCODE_LCP]; #endif /* WITH_DISPLAYCODE */ components PppPrintfC; PppPrintfC.Ppp -> PppDaemonC; PppDaemonC.PppProtocol[PppPrintfC.Protocol] -> PppPrintfC; } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/TestP.nc000066400000000000000000000043711207233610700214010ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "LcpAutomaton.h" #include module TestP { uses { interface Boot; interface MultiLed; interface SplitControl as Ppp; interface LcpAutomaton; } } implementation { event void LcpAutomaton.transitionCompleted (LcpAutomatonState_e state) { } event void LcpAutomaton.thisLayerUp () { } event void LcpAutomaton.thisLayerDown () { } event void LcpAutomaton.thisLayerStarted () { } event void LcpAutomaton.thisLayerFinished () { } event void Ppp.startDone (error_t error) { } event void Ppp.stopDone (error_t error) { } event void Boot.booted() { error_t rc; rc = call Ppp.start(); // printf("\r\n# PPP start got %d\r\n", rc); } } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/connection.py000066400000000000000000000032241207233610700225250ustar00rootroot00000000000000import time import ppp4py import ppp4py.hdlc import sys import serial import select import binascii import struct surf_dev = '/dev/ttyUSB0' surf = serial.Serial(surf_dev, baudrate=115200, timeout=5) poller = select.poll() poller.register(surf.fileno()) compress_ac = False def waitForSync (): print 'Reading boot status (one line):' finished_header = False while not finished_header: t = surf.readline().strip() while t.startswith('\0'): t = t[1:] print t if t.startswith('#'): finished_header = True break if t.startswith('!'): try: (flag, value) = t[1:].split() value = int(value) print 'flag "%s" value "%d"' % (flag, value) if 'compress_ac' == flag: compress_ac = (0 != value) elif 'frame_size' == flag: frame_size = value elif 'repetitions' == flag: repetitions = value elif 'full_duplex' == flag: full_duplex = value else: print 'Unrecognized flag %s' % (flag,) except Exception, e: print e print 'Address/control compression: %s' % (compress_ac,) framer=ppp4py.hdlc.HDLCforPPP(compress_ac=compress_ac) pppd = ppp4py.PPP(framer=framer) def GetPacket (): timeout = 5000 while poller.poll(timeout): c = surf.read() #print 'RX %s' % (binascii.hexlify(c),) framer.putBytes(c) pkt = framer.getPacket() if (pkt is not None) and (0 < len(pkt)): return pkt tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/gendata.py000066400000000000000000000003231207233610700217660ustar00rootroot00000000000000import binascii from connection import pppd, framer, surf, poller import struct import sys pkt = pppd.getPacket(); print binascii.hexlify(pkt) rv = surf.write(pkt) while True: sys.stdout.write(surf.read()) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/pppd.py000066400000000000000000000034671207233610700213420ustar00rootroot00000000000000import binascii from connection import pppd, framer, surf, poller import struct import sys import select import pppprint pppprint.Protocol(pppd) import ppp4py.protocol.ccp #ccp = ppp4py.protocol.ccp.CompressionControlProtocol(pppd) #ccp.open() poller.register(surf.fileno(), select.POLLIN) stripped = [] while poller.poll(0): stripped.append(surf.read()) print 'Stripped: %s' % (binascii.hexlify(''.join(stripped)),) pppd.bringLinkUp() first_time_up = True stop = False print "ENTERING PPP LOOP" text = '' timeout_sec = None while not stop: if timeout_sec is None: timeout_sec = 1 events = select.POLLIN if pppd.hasPackets(): events |= select.POLLOUT poller.register(surf.fileno(), events) #print 'Poll timeout %s' % (timeout_sec,) for (_, events) in poller.poll(timeout_sec / 1000.0): if events & (select.POLLHUP + select.POLLERR): stop = True break if events & select.POLLIN: c = surf.read() if '\n' == c: print text #print binascii.hexlify(text) text = '' elif '\x7e' == c: #print 'DELIMITED: %s' % (binascii.hexlify(text),) text = '' else: text += c pppd.sendToFramer(c) timeout_sec = pppd.execute() for packet in pppd.getPackets(): print 'STX: %s' % (binascii.hexlify(packet),) surf.write(packet) surf.flush() if pppd._lcp.ST_opened == pppd._lcp._state: if first_time_up: first_time_up = False print 'UP AND RUNNING' #ccp.open() # Bounce the circuit once, to verify that things are renegotiated #pppd._lcp._evt_open() #pppd._lcp.echoRequest('hi!') #pppd._lcp.discardRequest('hi!') tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/pppd.sh000066400000000000000000000001741207233610700213140ustar00rootroot00000000000000#!/bin/sh pppd \ debug \ noccp \ passive \ noauth \ 10.0.0.1:10.0.0.2 \ nodetach \ /dev/ttyUSB0 tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/pppprint.py000066400000000000000000000006201207233610700222370ustar00rootroot00000000000000import sys import ppp4py.protocol.base class Protocol (ppp4py.protocol.base.Protocol): Protocol = 0x404F ProtocolID = 'P4' ProtocolName = 'PppPrintf' def process (cls, information): sys.stdout.write(cls.Decode(information)) @classmethod def Decode (cls, information): return 'LOG: ' + information[1:] ppp4py.protocol.Registry[Protocol.Protocol] = Protocol tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/test-reject.py000066400000000000000000000026441207233610700226240ustar00rootroot00000000000000import sys import binascii import struct import surf import ppp4py.hdlc import ppp4py.protocol.base surf = surf.Device() framer = ppp4py.hdlc.HDLCforPPP() pppd = ppp4py.PPP(framer=framer) import pppprint pppprint.PppPrintProtocol(pppd) bad_protocol = 5 bad_information = 0x12345678 pkt = framer.framePacket(struct.pack('!HI', bad_protocol, bad_information)) rv = surf.write(pkt) # Expect to receive a Protocol-Reject message while True: pkt = surf.getPacket(framer) (protocol, information) = pppd.decodePacket(pkt, is_framed=False) print type(protocol) if isinstance(protocol, ppp4py.protocol.lcp.LinkControlProtocol): (handler, identifier, data) = protocol.extract(information) if isinstance(handler, ppp4py.protocol.lcp.ProtocolReject): print 'data: %s' % (binascii.hexlify(data),) (rej_protocol, rej_information) = handler.extract(data) print '%d %d %x %s' % (bad_protocol, rej_protocol, bad_information, struct.unpack('!I', rej_information)[0]) if (bad_protocol == rej_protocol) and (bad_information == struct.unpack('!I', rej_information)[0]): print "Got correct rejection" break print protocol.decode(information) elif isinstance(protocol, ppp4py.protocol.base.Protocol): print protocol.decode(information) else: print 'Protocol %04x: %s' % (protocol, binascii.hexlify(information)) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/test-startup.py000066400000000000000000000017551207233610700230540ustar00rootroot00000000000000import surf import sys import binascii import struct import ppp4py.hdlc import ppp4py.protocol.base surf = surf.Device() framer = ppp4py.hdlc.HDLCforPPP() pppd = ppp4py.PPP(framer=framer) import pppprint pppprint.PppPrintProtocol(pppd) lcp = pppd._lcp lcp._configureRequest.clear() for opt in lcp.options(): if opt.isNegotiable(): lcp._configureRequest.appendOption(opt, opt.proposedLocalValue()) cr_frame = lcp.pack(lcp._configureRequest.pack()) #info = framer.framePacket(cr_frame) #print binascii.hexlify(info) #print pppd.decode(info, is_framed=False) frame = framer.framePacket(cr_frame, compress_ac=False) print 'TX: %s' % (binascii.hexlify(frame),) surf.write(frame) while True: pkt = surf.getPacket(framer) (protocol, information) = pppd.decodePacket(pkt, is_framed=False) if isinstance(protocol, ppp4py.protocol.base.Protocol): print protocol.decode(information) else: print 'Protocol %04x: %s' % (protocol, binascii.hexlify(information)) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/test.sh000077500000000000000000000000641207233610700213310ustar00rootroot00000000000000make surf osian dco,16 install \ && python pppd.py tinyos-2.1.2+dfsg/tos/lib/ppp/tests/Lcp/trace.py000066400000000000000000000032161207233610700214650ustar00rootroot00000000000000import time import ppp4py import ppp4py.protocol.lcp import ppp4py.hdlc import sys import serial import select import binascii import struct import pppprint surf_dev = '/dev/ttyUSB0' surf = serial.Serial(surf_dev, baudrate=115200, timeout=5) poller = select.poll() poller.register(surf.fileno()) framer=ppp4py.hdlc.HDLCforPPP() timeout = 5000 while poller.poll(timeout): c = surf.read() #print 'RX %s' % (binascii.hexlify(c),) framer.putBytes(c) pkt = framer.getPacket() if (pkt is None) or (0 == len(pkt)): continue (protocol_code, information) = ppp4py.protocol.UnpackProtocolPacket(pkt) protocol_class = ppp4py.protocol.Registry.get(protocol_code) if protocol_class is not None: if issubclass(protocol_class, ppp4py.protocol.base.HandlerBasedProtocol): ( code, id, data ) = protocol_class.Unpack(information) ph = protocol_class.HandlerForCode(code) if ph is not None: desc = binascii.hexlify(data) if issubclass(ph, ppp4py.options.OptionList_mixin): desc = " ".join([ protocol_class.OptionForType(_t).ToString(data=_d) for (_t, _d) in ph.UnpackOptions(data) ]) print '%s %s %d : %s' % (protocol_class.ProtocolID, ph.Name, id, desc) else: print '%02x %d %s' % (code, id, binascii.hexlify(data)) elif issubclass(protocol_class, pppprint.Protocol): print protocol_class.Decode(information) else: print '%s %s' % (protocol_class.ProtocolID, binascii.hexlify(information)) else: print '%04x %s' % (protocol_code, binascii.hexlify(information)) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/PSHdlcUart/000077500000000000000000000000001207233610700212465ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/ppp/tests/PSHdlcUart/Makefile000066400000000000000000000003011207233610700227000ustar00rootroot00000000000000COMPONENT=TestAppC PFLAGS += -I$(TOSDIR)/lib/ppp PFLAGS += -I$(TOSDIR)/lib/printf PFLAGS += -DPLATFORM_SERIAL_RX_BUFFER_SIZE=16 PFLAGS += -DDEBUG_PLATFORM_SERIAL_HDLC_UART include $(MAKERULES) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/PSHdlcUart/TestAppC.nc000066400000000000000000000043421207233610700232560ustar00rootroot00000000000000/* Copyright (c) 2011 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Whitebox unit test for the DefaultHdlcUartP implementation. * * This code has tricky buffer management which is a lot easier to * validate when it's not embedded deep inside an HDLC client. * * @author Peter A. Bigot */ configuration TestAppC { } implementation { components TestP; components MainC; TestP.Boot -> MainC; components DefaultHdlcUartP; TestP.HdlcUart -> DefaultHdlcUartP; TestP.UartControl -> DefaultHdlcUartP; TestP.DebugDefaultHdlcUart -> DefaultHdlcUartP; DefaultHdlcUartP.SerialControl -> TestP.StubSerialControl; DefaultHdlcUartP.UartStream -> TestP.StubUartStream; #include } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/PSHdlcUart/TestP.nc000066400000000000000000000166431207233610700226410ustar00rootroot00000000000000/* Copyright (c) 2011 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include module TestP { uses { interface Boot; interface HdlcUart; interface StdControl as UartControl; interface DebugDefaultHdlcUart; } provides { interface StdControl as StubSerialControl; interface UartStream as StubUartStream; } #include } implementation { #include enum { RingBufferLength = PLATFORM_SERIAL_RX_BUFFER_SIZE, LocalBufferLength = 2 * RingBufferLength, }; task void run_tests (); int ssc_start_count; command error_t StubSerialControl.start () { ++ssc_start_count; return SUCCESS; } int ssc_stop_count; command error_t StubSerialControl.stop () { ++ssc_stop_count; return SUCCESS; } int hu_sendDone_count; int hu_sendDone_error; async event void HdlcUart.sendDone (error_t error) { hu_sendDone_error = error; ++hu_sendDone_count; } int postOnEvent; int eventCount; void checkPostEvent () { if (++eventCount == postOnEvent) { post run_tests(); } printf("evt %d of %d\n", eventCount, postOnEvent); } int hu_uartError_count; int hu_uartError_error; async event void HdlcUart.uartError (error_t error) { printf("HdlcUart.uartError %d\r\n", error); hu_uartError_error = error; ++hu_uartError_count; checkPostEvent(); } uint8_t rxBuffer[LocalBufferLength]; uint8_t* rxp; event void HdlcUart.receivedByte (uint8_t byte) { printf("HdlcUart.receivedByte 0x%02x\r\n", byte); *rxp++ = byte; checkPostEvent(); } void hu_resetRxBuffer () { eventCount = 0; hu_uartError_count = 0; rxp = rxBuffer; } async command error_t StubUartStream.send (uint8_t* buf, uint16_t len) { return FAIL; } async command error_t StubUartStream.receive (uint8_t* buf, uint16_t len) { return FAIL; } async command error_t StubUartStream.enableReceiveInterrupt () { return FAIL; } async command error_t StubUartStream.disableReceiveInterrupt () { return FAIL; } void testStartup () { error_t rc; uint8_t* ring_buffer; ASSERT_EQUAL(RingBufferLength, call DebugDefaultHdlcUart.ringBufferLength()); ring_buffer = call DebugDefaultHdlcUart.ringBuffer(); ASSERT_TRUE(!! ring_buffer); ASSERT_EQUAL_PTR(0, call DebugDefaultHdlcUart.rbStore()); ASSERT_EQUAL_PTR(0, call DebugDefaultHdlcUart.rbLoad()); ASSERT_EQUAL(0, ssc_start_count); rc = call UartControl.start(); ASSERT_EQUAL(1, ssc_start_count); ASSERT_EQUAL(SUCCESS, rc); ASSERT_EQUAL_PTR(ring_buffer, call DebugDefaultHdlcUart.rbStore()); ASSERT_EQUAL_PTR(ring_buffer, call DebugDefaultHdlcUart.rbLoad()); } void testFillBuffer_pre (int size) { uint8_t* ring_buffer = call DebugDefaultHdlcUart.ringBuffer(); int ring_buffer_length = call DebugDefaultHdlcUart.ringBufferLength(); int ring_buffer_capacity = ring_buffer_length - 1; uint8_t* rb_start; uint8_t* rbs; uint8_t* rbl; int pending; int i; hu_resetRxBuffer(); ASSERT_EQUAL_PTR(rxp, rxBuffer); ASSERT_EQUAL(0, hu_uartError_count); /* Resume testing once all the data has been fed in. Can't just * post here, since it may take two invocations of the feeder task * to process everything if the loaded data wraps around the ring * buffer. NOTE: Set this now; error events occur in this * call. */ postOnEvent = size; rb_start = call DebugDefaultHdlcUart.rbStore(); ASSERT_EQUAL_PTR(rb_start, call DebugDefaultHdlcUart.rbLoad()); printf("Fill buffer with %d elements\n", size); for (i = 0; i < size; ++i) { signal StubUartStream.receivedByte('A' + i); } rbs = call DebugDefaultHdlcUart.rbStore(); ASSERT_TRUE(ring_buffer <= rbs); ASSERT_TRUE(rbs < ring_buffer + ring_buffer_length); if (rbs >= rb_start) { pending = rbs - rb_start; } else { pending = (ring_buffer + ring_buffer_length - rb_start) + (rbs - ring_buffer); } if (size <= ring_buffer_capacity) { ASSERT_EQUAL(0, hu_uartError_count); ASSERT_EQUAL_PTR(rb_start, call DebugDefaultHdlcUart.rbLoad()); } else { /* On error for each character over the capacity */ ASSERT_EQUAL(size - ring_buffer_capacity, hu_uartError_count); /* Make sure those errors were counted as events */ ASSERT_EQUAL(eventCount, hu_uartError_count); /* Make sure the system is in an error state */ ASSERT_EQUAL_PTR(0, call DebugDefaultHdlcUart.rbLoad()); /* Fake events for the data that got thrown away */ eventCount += ring_buffer_capacity; /* Wake up on the event that indicates resynchronization. */ ASSERT_EQUAL(eventCount, postOnEvent); ++postOnEvent; } } void testFillBuffer_post (int size) { int ring_buffer_length = call DebugDefaultHdlcUart.ringBufferLength(); int ring_buffer_capacity = ring_buffer_length - 1; printf("Validating fill %d\r\n", size); if (size <= ring_buffer_capacity) { ASSERT_EQUAL(size, rxp - rxBuffer); } else { ASSERT_EQUAL(0, rxp - rxBuffer); } } int test_stage; task void run_tests () { switch (++test_stage) { default: ASSERT_TRUE(! "Unrecognized test stage"); break; case 1: testStartup(); testFillBuffer_pre(1); break; case 2: testFillBuffer_post(1); testFillBuffer_pre(RingBufferLength / 2); break; case 3: testFillBuffer_post(RingBufferLength / 2); testFillBuffer_pre(RingBufferLength - 1); break; case 4: testFillBuffer_post(RingBufferLength - 1); testFillBuffer_pre(RingBufferLength); break; case 5: testFillBuffer_post(RingBufferLength); testFillBuffer_pre(2 * RingBufferLength); break; case 6: testFillBuffer_post(2 * RingBufferLength); //FALLTHRU ALL_TESTS_PASSED(); break; } } event void Boot.booted () { post run_tests(); } } tinyos-2.1.2+dfsg/tos/lib/ppp/tests/accomp.extra000066400000000000000000000002401207233610700216000ustar00rootroot00000000000000# Control the flag that enables tx/rx suppression of the address control # octets in HDLC frames. ifeq ($(ACCOMP),) ACCOMP=1 endif PFLAGS += -DACCOMP=$(ACCOMP) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/dco.extra000066400000000000000000000004161207233610700211100ustar00rootroot00000000000000ifeq ($(DCO),) DCO=8 endif ifeq (2,$(DCO)) SEL=2MHz_RSEL2 endif ifeq (4,$(DCO)) SEL=4MHz_RSEL3 endif ifeq (8,$(DCO)) SEL=8MHz_RSEL3 endif ifeq (16,$(DCO)) SEL=16MHz_RSEL4 endif ifeq (32,$(DCO)) SEL=32MHz_RSEL6 endif PFLAGS += -DMSP430XV2_DCO_CONFIG=MSP430XV2_DCO_$(SEL) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/fdx.extra000066400000000000000000000000721207233610700211220ustar00rootroot00000000000000ifeq ($(FDX),) FDX=1 endif PFLAGS += -DFULL_DUPLEX=$(FDX) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/frame.extra000066400000000000000000000000761207233610700214370ustar00rootroot00000000000000ifeq ($(FRAME),) FRAME=32 endif PFLAGS+=-DFRAME_SIZE=$(FRAME) tinyos-2.1.2+dfsg/tos/lib/ppp/tests/reps.extra000066400000000000000000000000741207233610700213140ustar00rootroot00000000000000ifeq ($(REPS),) REPS=10 endif PFLAGS+=-DREPETITIONS=$(REPS) tinyos-2.1.2+dfsg/tos/lib/ppp/tos-pppd.patch000066400000000000000000000117531207233610700207310ustar00rootroot00000000000000The TinyOS PPP daemon defines a custom protocol which enables applications to use printf(3c) with the messages carried over PPP and displayed in the host computer logs. This patch adds support for that protocol to the standard Linux PPP daemon. The patch has been developed against the latest PPP source head. Retrieve the source with: git clone git://ozlabs.org/~paulus/ppp.git Apply the patch with: cd ppp patch -p1 < ${TOSDIR}/lib/ppp/tos-pppd.patch Configure and install the updated daemon for local use: ./configure make DESTDIR=/usr/local/tos-pppd all install You can then use this version to see messages from the application: sudo TOS_PPPD=/usr/local/tos-pppd/sbin/pppd ${TOSDIR}/lib/ppp/tospppd diff --git a/pppd/Makefile.linux b/pppd/Makefile.linux index 060db6a..db82a9c 100644 --- a/pppd/Makefile.linux +++ b/pppd/Makefile.linux @@ -60,9 +60,12 @@ HAVE_MULTILINK=y # Linux distributions: Please leave TDB ENABLED in your builds. USE_TDB=y +# Uncomment to enable the TinyOS printf protocol +HAVE_TINYOS=y + HAS_SHADOW=y -#USE_PAM=y -#HAVE_INET6=y +USE_PAM=y +HAVE_INET6=y # Enable plugins PLUGIN=y @@ -189,6 +192,13 @@ ifdef CBCP HEADERS += cbcp.h endif +ifdef HAVE_TINYOS + PPPDSRCS += tinyos.c + HEADERS += tinyos.h + PPPDOBJS += tinyos.o + CFLAGS += -DTINYOS=1 +endif + ifdef MAXOCTETS CFLAGS += -DMAXOCTETS endif diff --git a/pppd/main.c b/pppd/main.c index 014d614..56887bb 100644 --- a/pppd/main.c +++ b/pppd/main.c @@ -105,6 +105,9 @@ #include "ccp.h" #include "ecp.h" #include "pathnames.h" +#ifdef TINYOS +#include "tinyos.h" +#endif #ifdef USE_TDB #include "tdb.h" @@ -295,6 +298,9 @@ struct protent *protocols[] = { &atcp_protent, #endif &eap_protent, +#ifdef TINYOS + &tinyos_protent, +#endif NULL }; diff --git a/pppd/oshan.sh b/pppd/oshan.sh new file mode 100755 index 0000000..a99baa7 --- /dev/null +++ b/pppd/oshan.sh @@ -0,0 +1,10 @@ +#!/bin/sh +./pppd \ + debug \ + passive \ + noauth \ + nodetach \ + noccp \ + ipv6 ::ff41:4442:e88:2,::ff41:4442:e88:3 \ + noip \ + /dev/ttyUSB0 diff --git a/pppd/tinyos.c b/pppd/tinyos.c new file mode 100644 index 0000000..688c542 --- /dev/null +++ b/pppd/tinyos.c @@ -0,0 +1,97 @@ +#include "pppd.h" +#include "tinyos.h" + +/* + * Protocol entry points. + */ +static void tinyos_init __P((int unit)); +static void tinyos_input __P((int unit, u_char *inp, int inlen)); +static void tinyos_protrej __P((int unit)); +static void tinyos_lowerup __P((int unit)); +static void tinyos_lowerdown __P((int unit)); +static int tinyos_printpkt __P((u_char *inp, int inlen, + void (*)(void *arg, char *fmt, ...), void *arg)); + +static option_t tinyos_option_list[] = { + { NULL } +}; + +struct protent tinyos_protent = { + PPP_TINYOS, /* protocol number */ + tinyos_init, /* initialization procedure */ + tinyos_input, /* process a received packet */ + tinyos_protrej, /* process a received protocol-reject */ + tinyos_lowerup, /* lower layer has gone up */ + tinyos_lowerdown, /* lower layer has gone down */ + NULL, /* open the protocol */ + NULL, /* close the protocol */ + tinyos_printpkt, /* print a packet in readable form */ + NULL, /* process a received data packet */ + 1, /* protocol enabled */ + "TOS", /* text name of protocol */ + NULL, /* text name of corresponding data protocol */ + tinyos_option_list, /* list of command-line options */ + NULL, /* check requested options; assign defaults */ + NULL, /* configure interface for demand-dial */ + NULL /* say whether to bring up link for this pkt */ +}; + + +static void +tinyos_init (unit) +int unit; +{ } + +static void +tinyos_input (unit, inp, inlen) +int unit; +u_char *inp; +int inlen; +{ +#if 0 + u_char nb; + u_char sv; + nb = *inp++; + sv = inp[nb]; + inp[nb] = 0; + printf("TINYOS: %s", inp); + putchar(sv); +#endif +} + +static void +tinyos_protrej (unit) +int unit; +{ +} + +static void +tinyos_lowerup (unit) +int unit; +{ +} + +static void +tinyos_lowerdown (unit) +int unit; +{ +} + +static int +tinyos_printpkt (inp, inlen, printer, arg) +u_char *inp; +int inlen; +void (*printer) __P((void *, char *, ...)); +void *arg; +{ + u_char nb; + u_char sv; + nb = *inp++; + sv = inp[nb-1]; + inp[nb-1] = 0; + printer(arg, " %s", inp); + if ('\n' != sv) { + printer(arg, "%c", sv); + } + return nb + 1; +} diff --git a/pppd/tinyos.h b/pppd/tinyos.h new file mode 100644 index 0000000..9e99050 --- /dev/null +++ b/pppd/tinyos.h @@ -0,0 +1,16 @@ +#ifndef PPP_TINYOS_H +#define PPP_TINYOS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define PPP_TINYOS 0x404f + +extern struct protent tinyos_protent; + +#ifdef __cplusplus +} +#endif + +#endif /* PPP_TINYOS_H */ tinyos-2.1.2+dfsg/tos/lib/ppp/tospppd000077500000000000000000000141061207233610700175540ustar00rootroot00000000000000#!/usr/bin/python # # Copyright (c) 2010 People Power Co. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of the People Power Corporation nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE # Invoke the PPP daemon on a serial port to provide an IPv6 link for an # TinyOS device. # # Put the following in your /etc/hosts (excluding the # comment characters): # fe80::fd41:4242:e88:2 host.ppp.tinyos # fe80::fd41:4242:e88:3 device.ppp.tinyos # # By default this uses /usr/sbin/pppd. Depending on your application, # you may want to use the modified PPP daemon that supports diagnostic # information from TinyOS. See ${TOSDIR}/lib/ppp/tos-pppd.patch for # details. Set the TOS_PPPD environment variable to the full path to # your PPP daemon, if it is not /usr/sbin/pppd. For sudo, you # probably want something like: # # sudo TOS_PPPD=/usr/local/tos-pppd/sbin/pppd ./tospppd # import socket import sys import getopt import select import pty import os import fcntl # Force use of IPv6 UDP sockets socket_params = (socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # The host (local) side of the PPP link host_ppp_fqdn = 'host.ppp.tinyos' # The device (peer/remote) side of the PPPlink device_ppp_fqdn = 'device.ppp.tinyos' # The device over which PPP will run tinyos_device = os.environ.get('TOS_PPP_DEVICE', '/dev/ttyUSB0') # Where the PPP daemon lives. You may prefer to use /usr/sbin/pppd pppd_path = os.environ.get('TOS_PPPD', '/usr/sbin/pppd') # The baud rate for the serial connection pppd_baud = os.environ.get('TOS_PPP_BAUD', '115200') # Generally, pppd must run as root. If this variable is True, the # program will abort with a descriptive error message if the effective # UID is not privileged, pppd_requires_root = True try: opts, args = getopt.getopt(sys.argv[1:], 'H:D:P:', ('host-ppp-fqdn=', 'device-ppp-fqdn=', 'tty=', 'pppd-path=')) except getopt.GetoptError, e: print e sys.exit(1) for opt, arg in opts: if opt in ('-H', '--host-ppp-fqdn'): host_ppp_fqdn = arg elif opt in ('-D', '--device-ppp-fqdn'): device_ppp_fqdn = arg elif opt in ('-P', '--pppd-path'): pppd_path = arg elif opt in ('-B', '--baud-rate'): pppd_baud = arg elif opt in ('--tty',): tinyos_device = arg if args: tinyos_device = args.pop(0) print "# %s -H %s -D %s -P %s -B %s %s\n" % (sys.argv[0], host_ppp_fqdn, device_ppp_fqdn, pppd_path, pppd_baud, tinyos_device) def fqdnToIpv6Addr (fqdn): """Convert a host name to an IPv6 address @param fqdn : A CIDR or fully-qualified domain name""" global socket_params rv = socket.getaddrinfo(fqdn, 0, *socket_params) rv = rv[0] addr = rv[4] return addr def fqdnToIID (fqdn): """Convert a host name to the IID portion of its IPv6 address.""" addrstr = fqdnToIpv6Addr(fqdn)[0] if addrstr.startswith('fe80::'): return addrstr[4:] return None host_ppp_iid = fqdnToIID(host_ppp_fqdn) device_ppp_iid = fqdnToIID(device_ppp_fqdn) if pppd_requires_root and (0 != os.geteuid()): print "ERROR: Running pppd requires root, and you aren't." sys.exit(1) pppd_args = [ # Log control packets so we see what happens 'debug', # Wait for connection if TinyOS device not responding 'passive', # TinyOS PPP does not support authentication 'noauth', # Keep running in foreground. Inconvenient, but the daemon will go away # if you unplug the board, and this makes it a bit more obvious when # that happens. 'nodetach', # defaults to this baud rate. If the baud rate is wrong, you # won't connect. pppd_baud, # What to connect tinyos_device, # Some distributions apparently default hardware flow control on. # Chances are, you don't really have either form. 'nocrtscts', 'nocdtrcts', # Some distributions expect LCP echo to be implemented, and will shut # down the connection if no response is received (pppd doesn't seem to # recognize the Code-Reject that implies the remote is present even when # echo isn't working). TinyOS PPP doesn't currently support LCP echo. 'lcp-echo-interval', '0', # TinyOS PPP doesn't support any of the IP compression protocols that # run over PPP 'noccp', # TinyOS PPP doesn't support IPv4 (though it could...) 'noip', # Configure the IPv6 endpoints 'ipv6', '%s,%s' % (host_ppp_iid, device_ppp_iid), ] pppd_cmd = '%s %s' % (pppd_path, ' '.join(pppd_args)) print '# %s' % (pppd_cmd,) pppd_fd = os.popen(pppd_cmd) fcntl.fcntl(pppd_fd, fcntl.F_SETFL, os.O_NONBLOCK | fcntl.fcntl(pppd_fd, fcntl.F_GETFL)) poller = select.poll() poller.register(pppd_fd.fileno(), select.POLLIN) timeout_ms = 1000 while True: for (_, events) in poller.poll(timeout_ms): sys.stdout.write(pppd_fd.read()) tinyos-2.1.2+dfsg/tos/lib/printf/000077500000000000000000000000001207233610700166365ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/printf/2_0_2/000077500000000000000000000000001207233610700174375ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/printf/2_0_2/PrintfC.nc000066400000000000000000000057761207233610700213450ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This is the PrintfC component. It provides the printf service for printing * data over the serial interface using the standard c-style printf command. * It must be started via the SplitControl interface it provides. Data * printed using printf are buffered and only sent over the serial line after * making a call to PrintfFlush.flush(). This buffer has a maximum size of * 250 bytes at present. After calling start on this component, printf * statements can be made anywhere throughout your code, so long as you include * the "printf.h" header file in every file you wish to use it. Standard * practice is to start the printf service in the main application, and set up * a timer to periodically flush the printf buffer (500ms should do). In future * versions, user defined buffer sizes as well as well as automatic flushing at * user defined intervals will be supported. * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.2 $ * @date $Date: 2010-06-29 22:07:50 $ */ #include "printf.h" configuration PrintfC { provides { interface SplitControl as PrintfControl; interface PrintfFlush; } } implementation { components SerialActiveMessageC; components new SerialAMSenderC(AM_PRINTF_MSG); components PrintfP; PrintfControl = PrintfP; PrintfFlush = PrintfP; PrintfP.SerialControl -> SerialActiveMessageC; PrintfP.AMSend -> SerialAMSenderC; PrintfP.Packet -> SerialAMSenderC; } tinyos-2.1.2+dfsg/tos/lib/printf/2_0_2/PrintfFlush.nc000066400000000000000000000034661207233610700222360ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.2 $ * @date $Date: 2010-06-29 22:07:50 $ */ #include "printf.h" interface PrintfFlush { command error_t flush(); event void flushDone(error_t error); } tinyos-2.1.2+dfsg/tos/lib/printf/2_0_2/PrintfP.nc000066400000000000000000000141061207233610700213450ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This is the PrintfP component. It provides the printf service for printing * data over the serial interface using the standard c-style printf command. * It must be started via the SplitControl interface it provides. Data * printed using printf are buffered and only sent over the serial line after * making a call to PrintfFlush.flush(). This buffer has a maximum size of * 250 bytes at present. After calling start on this component, printf * statements can be made anywhere throughout your code, so long as you include * the "printf.h" header file in every file you wish to use it. Standard * practice is to start the printf service in the main application, and set up * a timer to periodically flush the printf buffer (500ms should do). In future * versions, user defined buffer sizes as well as well as automatic flushing at * user defined intervals will be supported. * * The printf service is currently only available for msp430 based motes * (i.e. telos, eyes) and atmega128 based motes (i.e. mica2, micaz). On the * atmega platforms, avr-libc version 1.4 or above mus tbe used. * * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.2 $ * @date $Date: 2010-06-29 22:07:50 $ */ #include "printf.h" #ifdef _H_atmega128hardware_H static int uart_putchar(char c, FILE *stream); static FILE atm128_stdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); #endif module PrintfP { provides { interface SplitControl as PrintfControl; interface PrintfFlush; } uses { interface SplitControl as SerialControl; interface AMSend; interface Packet; } } implementation { enum { S_STARTED, S_STOPPED, S_FLUSHING, }; message_t printfMsg; nx_uint8_t buffer[PRINTF_BUFFER_SIZE]; norace nx_uint8_t* next_byte; uint8_t state = S_STOPPED; uint32_t bytes_left_to_flush; uint8_t length_to_send; task void retrySend() { if(call AMSend.send(AM_BROADCAST_ADDR, &printfMsg, sizeof(printf_msg_t)) != SUCCESS) post retrySend(); } void sendNext() { printf_msg_t* m = (printf_msg_t*)call Packet.getPayload(&printfMsg, sizeof(printf_msg_t)); length_to_send = (bytes_left_to_flush < sizeof(printf_msg_t)) ? bytes_left_to_flush : sizeof(printf_msg_t); memset(m->buffer, 0, sizeof(printf_msg_t)); memcpy(m->buffer, (nx_uint8_t*)next_byte, length_to_send); if(call AMSend.send(AM_BROADCAST_ADDR, &printfMsg, sizeof(printf_msg_t)) != SUCCESS) post retrySend(); else { bytes_left_to_flush -= length_to_send; next_byte += length_to_send; } } command error_t PrintfControl.start() { if(state == S_STOPPED) return call SerialControl.start(); return FAIL; } command error_t PrintfControl.stop() { if(state == S_STARTED) return call SerialControl.stop(); return FAIL; } event void SerialControl.startDone(error_t error) { if(error != SUCCESS) { signal PrintfControl.startDone(error); return; } #ifdef _H_atmega128hardware_H stdout = &atm128_stdout; #endif atomic { memset(buffer, 0, sizeof(buffer)); next_byte = buffer; bytes_left_to_flush = 0; length_to_send = 0; state = S_STARTED; } signal PrintfControl.startDone(error); } event void SerialControl.stopDone(error_t error) { if(error != SUCCESS) { signal PrintfControl.stopDone(error); return; } atomic state = S_STOPPED; signal PrintfControl.stopDone(error); } command error_t PrintfFlush.flush() { atomic { if(state == S_STARTED && (next_byte > buffer)) { state = S_FLUSHING; bytes_left_to_flush = next_byte - buffer; next_byte = buffer; } else return FAIL; } sendNext(); return SUCCESS; } event void AMSend.sendDone(message_t* msg, error_t error) { if(error == SUCCESS) { if(bytes_left_to_flush > 0) sendNext(); else { next_byte = buffer; bytes_left_to_flush = 0; length_to_send = 0; atomic state = S_STARTED; signal PrintfFlush.flushDone(error); } } else post retrySend(); } #ifdef _H_msp430hardware_h int putchar(int c) __attribute__((noinline)) @C() @spontaneous() { #endif #ifdef _H_atmega128hardware_H int uart_putchar(char c, FILE *stream) __attribute__((noinline)) @C() @spontaneous() { #endif atomic { if(state == S_STARTED && ((next_byte-buffer) < PRINTF_BUFFER_SIZE)) { *(next_byte++) = c; return 0; } else return -1; } } } tinyos-2.1.2+dfsg/tos/lib/printf/2_0_2/avr_stdio.h000066400000000000000000001225471207233610700216150ustar00rootroot00000000000000/* Copyright (c) 2002, 2005, Joerg Wunsch All rights reserved. Portions of documentation Copyright (c) 1990, 1991, 1993 The Regents of the University of California. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. $Id: avr_stdio.h,v 1.1 2008-06-12 12:33:47 klueska Exp $ */ #ifndef _STDIO_H_ #define _STDIO_H_ 1 #ifndef __ASSEMBLER__ #include #include #define __need_NULL #define __need_size_t #include /** \defgroup avr_stdio : Standard IO facilities \code #include \endcode

      Introduction to the Standard IO facilities

      This file declares the standard IO facilities that are implemented in \c avr-libc. Due to the nature of the underlying hardware, only a limited subset of standard IO is implemented. There is no actual file implementation available, so only device IO can be performed. Since there's no operating system, the application needs to provide enough details about their devices in order to make them usable by the standard IO facilities. Due to space constraints, some functionality has not been implemented at all (like some of the \c printf conversions that have been left out). Nevertheless, potential users of this implementation should be warned: the \c printf and \c scanf families of functions, although usually associated with presumably simple things like the famous "Hello, world!" program, are actually fairly complex which causes their inclusion to eat up a fair amount of code space. Also, they are not fast due to the nature of interpreting the format string at run-time. Whenever possible, resorting to the (sometimes non-standard) predetermined conversion facilities that are offered by avr-libc will usually cost much less in terms of speed and code size.

      Tunable options for code size vs. feature set

      In order to allow programmers a code size vs. functionality tradeoff, the function vfprintf() which is the heart of the printf family can be selected in different flavours using linker options. See the documentation of vfprintf() for a detailed description. The same applies to vfscanf() and the \c scanf family of functions.

      Outline of the chosen API

      The standard streams \c stdin, \c stdout, and \c stderr are provided, but contrary to the C standard, since avr-libc has no knowledge about applicable devices, these streams are not already pre-initialized at application startup. Also, since there is no notion of "file" whatsoever to avr-libc, there is no function \c fopen() that could be used to associate a stream to some device. (See \ref stdio_note1 "note 1".) Instead, the function \c fdevopen() is provided to associate a stream to a device, where the device needs to provide a function to send a character, to receive a character, or both. There is no differentiation between "text" and "binary" streams inside avr-libc. Character \c \\n is sent literally down to the device's \c put() function. If the device requires a carriage return (\c \\r) character to be sent before the linefeed, its \c put() routine must implement this (see \ref stdio_note2 "note 2"). As an alternative method to fdevopen(), the macro fdev_setup_stream() might be used to setup a user-supplied FILE structure. It should be noted that the automatic conversion of a newline character into a carriage return - newline sequence breaks binary transfers. If binary transfers are desired, no automatic conversion should be performed, but instead any string that aims to issue a CR-LF sequence must use "\r\n" explicitly. For convenience, the first call to \c fdevopen() that opens a stream for reading will cause the resulting stream to be aliased to \c stdin. Likewise, the first call to \c fdevopen() that opens a stream for writing will cause the resulting stream to be aliased to both, \c stdout, and \c stderr. Thus, if the open was done with both, read and write intent, all three standard streams will be identical. Note that these aliases are indistinguishable from each other, thus calling \c fclose() on such a stream will also effectively close all of its aliases (\ref stdio_note3 "note 3"). It is possible to tie additional user data to a stream, using fdev_set_udata(). The backend put and get functions can then extract this user data using fdev_get_udata(), and act appropriately. For example, a single put function could be used to talk to two different UARTs that way, or the put and get functions could keep internal state between calls there.

      Format strings in flash ROM

      All the \c printf and \c scanf family functions come in two flavours: the standard name, where the format string is expected to be in SRAM, as well as a version with the suffix "_P" where the format string is expected to reside in the flash ROM. The macro \c PSTR (explained in \ref avr_pgmspace) becomes very handy for declaring these format strings. \anchor stdio_without_malloc

      Running stdio without malloc()

      By default, fdevopen() as well as the floating-point versions of the printf and scanf family require malloc(). As this is often not desired in the limited environment of a microcontroller, an alternative option is provided to run completely without malloc(). The macro fdev_setup_stream() is provided to prepare a user-supplied FILE buffer for operation with stdio. If floating-point operation is desired, a user-supplied buffer can as well be passed for the internal buffering for the floating-point numbers (and processing of \%[ scanf data).

      Example

      \code #include static int uart_putchar(char c, FILE *stream); static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); static int uart_putchar(char c, FILE *stream) { if (c == '\n') uart_putchar('\r', stream); loop_until_bit_is_set(UCSRA, UDRE); UDR = c; return 0; } int main(void) { init_uart(); stdout = &mystdout; printf("Hello, world!\n"); return 0; } \endcode This example uses the initializer form FDEV_SETUP_STREAM() rather than the function-like fdev_setup_stream(), so all data initialization happens during C start-up. If streams initialized that way are no longer needed, they can be destroyed by first calling the macro fdev_close(), and then destroying the object itself. No call to fclose() should be issued for these streams. While calling fclose() itself is harmless, it will cause an undefined reference to free() and thus cause the linker to link the malloc module into the application.

      Notes

      \anchor stdio_note1 \par Note 1: It might have been possible to implement a device abstraction that is compatible with \c fopen() but since this would have required to parse a string, and to take all the information needed either out of this string, or out of an additional table that would need to be provided by the application, this approach was not taken. \anchor stdio_note2 \par Note 2: This basically follows the Unix approach: if a device such as a terminal needs special handling, it is in the domain of the terminal device driver to provide this functionality. Thus, a simple function suitable as \c put() for \c fdevopen() that talks to a UART interface might look like this: \code int uart_putchar(char c, FILE *stream) { if (c == '\n') uart_putchar('\r'); loop_until_bit_is_set(UCSRA, UDRE); UDR = c; return 0; } \endcode \anchor stdio_note3 \par Note 3: This implementation has been chosen because the cost of maintaining an alias is considerably smaller than the cost of maintaining full copies of each stream. Yet, providing an implementation that offers the complete set of standard streams was deemed to be useful. Not only that writing \c printf() instead of fprintf(mystream, ...) saves typing work, but since avr-gcc needs to resort to pass all arguments of variadic functions on the stack (as opposed to passing them in registers for functions that take a fixed number of parameters), the ability to pass one parameter less by implying \c stdin will also save some execution time. */ #if !defined(__DOXYGEN__) /* * This is an internal structure of the library that is subject to be * changed without warnings at any time. Please do *never* reference * elements of it beyond by using the official interfaces provided. */ struct __file { char *buf; /* buffer pointer */ unsigned char unget; /* ungetc() buffer */ uint8_t flags; /* flags, see below */ #define __SRD 0x0001 /* OK to read */ #define __SWR 0x0002 /* OK to write */ #define __SSTR 0x0004 /* this is an sprintf/snprintf string */ #define __SPGM 0x0008 /* fmt string is in progmem */ #define __SERR 0x0010 /* found error */ #define __SEOF 0x0020 /* found EOF */ #define __SUNGET 0x040 /* ungetc() happened */ #define __SMALLOC 0x80 /* handle is malloc()ed */ #if 0 /* possible future extensions, will require uint16_t flags */ #define __SRW 0x0100 /* open for reading & writing */ #define __SLBF 0x0200 /* line buffered */ #define __SNBF 0x0400 /* unbuffered */ #define __SMBF 0x0800 /* buf is from malloc */ #endif int size; /* size of buffer */ int len; /* characters read or written so far */ int (*put)(char, struct __file *); /* function to write one char to device */ int (*get)(struct __file *); /* function to read one char from device */ void *udata; /* User defined and accessible data. */ }; #endif /* not __DOXYGEN__ */ /*@{*/ /** \c FILE is the opaque structure that is passed around between the various standard IO functions. */ #define FILE struct __file /** Stream that will be used as an input stream by the simplified functions that don't take a \c stream argument. The first stream opened with read intent using \c fdevopen() will be assigned to \c stdin. */ #define stdin (__iob[0]) /** Stream that will be used as an output stream by the simplified functions that don't take a \c stream argument. The first stream opened with write intent using \c fdevopen() will be assigned to both, \c stdin, and \c stderr. */ #define stdout (__iob[1]) /** Stream destined for error output. Unless specifically assigned, identical to \c stdout. If \c stderr should point to another stream, the result of another \c fdevopen() must be explicitly assigned to it without closing the previous \c stderr (since this would also close \c stdout). */ #define stderr (__iob[2]) /** \c EOF declares the value that is returned by various standard IO functions in case of an error. Since the AVR platform (currently) doesn't contain an abstraction for actual files, its origin as "end of file" is somewhat meaningless here. */ #define EOF (-1) /** This macro inserts a pointer to user defined data into a FILE stream object. The user data can be useful for tracking state in the put and get functions supplied to the fdevopen() function. */ #define fdev_set_udata(stream, u) do { (stream)->udata = u; } while(0) /** This macro retrieves a pointer to user defined data from a FILE stream object. */ #define fdev_get_udata(stream) ((stream)->udata) #if defined(__DOXYGEN__) /** \brief Setup a user-supplied buffer as an stdio stream This macro takes a user-supplied buffer \c stream, and sets it up as a stream that is valid for stdio operations, similar to one that has been obtained dynamically from fdevopen(). The buffer to setup must be of type FILE. The arguments \c put and \c get are identical to those that need to be passed to fdevopen(). The \c rwflag argument can take one of the values _FDEV_SETUP_READ, _FDEV_SETUP_WRITE, or _FDEV_SETUP_RW, for read, write, or read/write intent, respectively. \note No assignments to the standard streams will be performed by fdev_setup_stream(). If standard streams are to be used, these need to be assigned by the user. See also under \ref stdio_without_malloc "Running stdio without malloc()". */ #define fdev_setup_stream(stream, put, get, rwflag) #else /* !DOXYGEN */ #define fdev_setup_stream(stream, p, g, f) \ do { \ (stream)->put = p; \ (stream)->get = g; \ (stream)->flags = f; \ (stream)->udata = 0; \ } while(0) #endif /* DOXYGEN */ #define _FDEV_SETUP_READ __SRD /**< fdev_setup_stream() with read intent */ #define _FDEV_SETUP_WRITE __SWR /**< fdev_setup_stream() with write intent */ #define _FDEV_SETUP_RW (__SRD|__SWR) /**< fdev_setup_stream() with read/write intent */ /** * Return code for an error condition during device read. * * To be used in the get function of fdevopen(). */ #define _FDEV_ERR (-1) /** * Return code for an end-of-file condition during device read. * * To be used in the get function of fdevopen(). */ #define _FDEV_EOF (-2) #if defined(__DOXYGEN__) /** \brief Initializer for a user-supplied stdio stream This macro acts similar to fdev_setup_stream(), but it is to be used as the initializer of a variable of type FILE. The remaining arguments are to be used as explained in fdev_setup_stream(). */ #define FDEV_SETUP_STREAM(put, get, rwflag) #else /* !DOXYGEN */ #define FDEV_SETUP_STREAM(p, g, f) \ { \ .put = p, \ .get = g, \ .flags = f, \ .udata = 0, \ } #endif /* DOXYGEN */ #ifdef __cplusplus extern "C" { #endif #if !defined(__DOXYGEN__) /* * Doxygen documentation can be found in fdevopen.c. */ extern struct __file *__iob[]; #if defined(__STDIO_FDEVOPEN_COMPAT_12) /* * Declare prototype for the discontinued version of fdevopen() that * has been in use up to avr-libc 1.2.x. The new implementation has * some backwards compatibility with the old version. */ extern FILE *fdevopen(int (*__put)(char), int (*__get)(void), int __opts __attribute__((unused))); #else /* !defined(__STDIO_FDEVOPEN_COMPAT_12) */ /* New prototype for avr-libc 1.4 and above. */ extern FILE *fdevopen(int (*__put)(char, FILE*), int (*__get)(FILE*)); #endif /* defined(__STDIO_FDEVOPEN_COMPAT_12) */ #endif /* not __DOXYGEN__ */ /** This function closes \c stream, and disallows and further IO to and from it. When using fdevopen() to setup the stream, a call to fclose() is needed in order to free the internal resources allocated. If the stream has been set up using fdev_setup_stream() or FDEV_SETUP_STREAM(), use fdev_close() instead. It currently always returns 0 (for success). */ extern int fclose(FILE *__stream); /** This macro frees up any library resources that might be associated with \c stream. It should be called if \c stream is no longer needed, right before the application is going to destroy the \c stream object itself. (Currently, this macro evaluates to nothing, but this might change in future versions of the library.) */ #if defined(__DOXYGEN__) # define fdev_close() #else # define fdev_close() ((void)0) #endif /** \c vfprintf is the central facility of the \c printf family of functions. It outputs values to \c stream under control of a format string passed in \c fmt. The actual values to print are passed as a variable argument list \c ap. \c vfprintf returns the number of characters written to \c stream, or \c EOF in case of an error. Currently, this will only happen if \c stream has not been opened with write intent. The format string is composed of zero or more directives: ordinary characters (not \c %), which are copied unchanged to the output stream; and conversion specifications, each of which results in fetching zero or more subsequent arguments. Each conversion specification is introduced by the \c % character. The arguments must properly correspond (after type promotion) with the conversion specifier. After the \c %, the following appear in sequence: - Zero or more of the following flags:
      • \c # The value should be converted to an "alternate form". For c, d, i, s, and u conversions, this option has no effect. For o conversions, the precision of the number is increased to force the first character of the output string to a zero (except if a zero value is printed with an explicit precision of zero). For x and X conversions, a non-zero result has the string `0x' (or `0X' for X conversions) prepended to it.
      • \c 0 (zero) Zero padding. For all conversions, the converted value is padded on the left with zeros rather than blanks. If a precision is given with a numeric conversion (d, i, o, u, i, x, and X), the 0 flag is ignored.
      • \c - A negative field width flag; the converted value is to be left adjusted on the field boundary. The converted value is padded on the right with blanks, rather than on the left with blanks or zeros. A - overrides a 0 if both are given.
      • ' ' (space) A blank should be left before a positive number produced by a signed conversion (d, or i).
      • \c + A sign must always be placed before a number produced by a signed conversion. A + overrides a space if both are used.
      - An optional decimal digit string specifying a minimum field width. If the converted value has fewer characters than the field width, it will be padded with spaces on the left (or right, if the left-adjust ment flag has been given) to fill out the field width. - An optional precision, in the form of a period . followed by an optional digit string. If the digit string is omitted, the precision is taken as zero. This gives the minimum number of digits to appear for d, i, o, u, x, and X conversions, or the maximum number of characters to be printed from a string for \c s conversions. - An optional \c l length modifier, that specifies that the argument for the d, i, o, u, x, or X conversion is a \c "long int" rather than \c int. - A character that specifies the type of conversion to be applied. The conversion specifiers and their meanings are: - \c diouxX The int (or appropriate variant) argument is converted to signed decimal (d and i), unsigned octal (o), unsigned decimal (u), or unsigned hexadecimal (x and X) notation. The letters "abcdef" are used for x conversions; the letters "ABCDEF" are used for X conversions. The precision, if any, gives the minimum number of digits that must appear; if the converted value requires fewer digits, it is padded on the left with zeros. - \c p The void * argument is taken as an unsigned integer, and converted similarly as a %\#x command would do. - \c c The \c int argument is converted to an \c "unsigned char", and the resulting character is written. - \c s The \c "char *" argument is expected to be a pointer to an array of character type (pointer to a string). Characters from the array are written up to (but not including) a terminating NUL character; if a precision is specified, no more than the number specified are written. If a precision is given, no null character need be present; if the precision is not specified, or is greater than the size of the array, the array must contain a terminating NUL character. - \c % A \c % is written. No argument is converted. The complete conversion specification is "%%". - \c eE The double argument is rounded and converted in the format \c "[-]d.dddedd" where there is one digit before the decimal-point character and the number of digits after it is equal to the precision; if the precision is missing, it is taken as 6; if the precision is zero, no decimal-point character appears. An \e E conversion uses the letter \c 'E' (rather than \c 'e') to introduce the exponent. The exponent always contains two digits; if the value is zero, the exponent is 00. - \c fF The double argument is rounded and converted to decimal notation in the format \c "[-]ddd.ddd", where the number of digits after the decimal-point character is equal to the precision specification. If the precision is missing, it is taken as 6; if the precision is explicitly zero, no decimal-point character appears. If a decimal point appears, at least one digit appears before it. - \c gG The double argument is converted in style \c f or \c e (or \c F or \c E for \c G conversions). The precision specifies the number of significant digits. If the precision is missing, 6 digits are given; if the precision is zero, it is treated as 1. Style \c e is used if the exponent from its conversion is less than -4 or greater than or equal to the precision. Trailing zeros are removed from the fractional part of the result; a decimal point appears only if it is followed by at least one digit. - \c S Similar to the \c s format, except the pointer is expected to point to a program-memory (ROM) string instead of a RAM string. In no case does a non-existent or small field width cause truncation of a numeric field; if the result of a conversion is wider than the field width, the field is expanded to contain the conversion result. Since the full implementation of all the mentioned features becomes fairly large, three different flavours of vfprintf() can be selected using linker options. The default vfprintf() implements all the mentioned functionality except floating point conversions. A minimized version of vfprintf() is available that only implements the very basic integer and string conversion facilities, but none of the additional options that can be specified using conversion flags (these flags are parsed correctly from the format specification, but then simply ignored). This version can be requested using the following \ref gcc_minusW "compiler options": \code -Wl,-u,vfprintf -lprintf_min \endcode If the full functionality including the floating point conversions is required, the following options should be used: \code -Wl,-u,vfprintf -lprintf_flt -lm \endcode \par Limitations: - The specified width and precision can be at most 127. - For floating-point conversions, trailing digits will be lost if a number close to DBL_MAX is converted with a precision > 0. */ extern int vfprintf(FILE *__stream, const char *__fmt, va_list __ap); /** Variant of \c vfprintf() that uses a \c fmt string that resides in program memory. */ extern int vfprintf_P(FILE *__stream, const char *__fmt, va_list __ap); /** The function \c fputc sends the character \c c (though given as type \c int) to \c stream. It returns the character, or \c EOF in case an error occurred. */ extern int fputc(int __c, FILE *__stream); #if !defined(__DOXYGEN__) /* putc() function implementation, required by standard */ extern int putc(int __c, FILE *__stream); /* putchar() function implementation, required by standard */ extern int putchar(int __c); #endif /* not __DOXYGEN__ */ /** The macro \c putc used to be a "fast" macro implementation with a functionality identical to fputc(). For space constraints, in \c avr-libc, it is just an alias for \c fputc. */ #define putc(__c, __stream) fputc(__c, __stream) /** The macro \c putchar sends character \c c to \c stdout. */ #define putchar(__c) fputc(__c, stdout) /** The function \c printf performs formatted output to stream \c stderr. See \c vfprintf() for details. */ extern int printf(const char *__fmt, ...); /** Variant of \c printf() that uses a \c fmt string that resides in program memory. */ extern int printf_P(const char *__fmt, ...); /** The function \c vprintf performs formatted output to stream \c stdout, taking a variable argument list as in vfprintf(). See vfprintf() for details. */ extern int vprintf(const char *__fmt, va_list __ap); /** Variant of \c printf() that sends the formatted characters to string \c s. */ extern int sprintf(char *__s, const char *__fmt, ...); /** Variant of \c sprintf() that uses a \c fmt string that resides in program memory. */ extern int sprintf_P(char *__s, const char *__fmt, ...); /** Like \c sprintf(), but instead of assuming \c s to be of infinite size, no more than \c n characters (including the trailing NUL character) will be converted to \c s. Returns the number of characters that would have been written to \c s if there were enough space. */ extern int snprintf(char *__s, size_t __n, const char *__fmt, ...); /** Variant of \c snprintf() that uses a \c fmt string that resides in program memory. */ extern int snprintf_P(char *__s, size_t __n, const char *__fmt, ...); /** Like \c sprintf() but takes a variable argument list for the arguments. */ extern int vsprintf(char *__s, const char *__fmt, va_list ap); /** Variant of \c vsprintf() that uses a \c fmt string that resides in program memory. */ extern int vsprintf_P(char *__s, const char *__fmt, va_list ap); /** Like \c vsprintf(), but instead of assuming \c s to be of infinite size, no more than \c n characters (including the trailing NUL character) will be converted to \c s. Returns the number of characters that would have been written to \c s if there were enough space. */ extern int vsnprintf(char *__s, size_t __n, const char *__fmt, va_list ap); /** Variant of \c vsnprintf() that uses a \c fmt string that resides in program memory. */ extern int vsnprintf_P(char *__s, size_t __n, const char *__fmt, va_list ap); /** The function \c fprintf performs formatted output to \c stream. See \c vfprintf() for details. */ extern int fprintf(FILE *__stream, const char *__fmt, ...); /** Variant of \c fprintf() that uses a \c fmt string that resides in program memory. */ extern int fprintf_P(FILE *__stream, const char *__fmt, ...); /** Write the string pointed to by \c str to stream \c stream. Returns 0 on success and EOF on error. */ extern int fputs(const char *__str, FILE *__stream); /** Variant of fputs() where \c str resides in program memory. */ extern int fputs_P(const char *__str, FILE *__stream); /** Write the string pointed to by \c str, and a trailing newline character, to \c stdout. */ extern int puts(const char *__str); /** Variant of puts() where \c str resides in program memory. */ extern int puts_P(const char *__str); /** Write \c nmemb objects, \c size bytes each, to \c stream. The first byte of the first object is referenced by \c ptr. Returns the number of objects successfully written, i. e. \c nmemb unless an output error occured. */ extern size_t fwrite(const void *__ptr, size_t __size, size_t __nmemb, FILE *__stream); /** The function \c fgetc reads a character from \c stream. It returns the character, or \c EOF in case end-of-file was encountered or an error occurred. The routines feof() or ferror() must be used to distinguish between both situations. */ extern int fgetc(FILE *__stream); #if !defined(__DOXYGEN__) /* getc() function implementation, required by standard */ extern int getc(FILE *__stream); /* getchar() function implementation, required by standard */ extern int getchar(void); #endif /* not __DOXYGEN__ */ /** The macro \c getc used to be a "fast" macro implementation with a functionality identical to fgetc(). For space constraints, in \c avr-libc, it is just an alias for \c fgetc. */ #define getc(__stream) fgetc(__stream) /** The macro \c getchar reads a character from \c stdin. Return values and error handling is identical to fgetc(). */ #define getchar() fgetc(stdin) /** The ungetc() function pushes the character \c c (converted to an unsigned char) back onto the input stream pointed to by \c stream. The pushed-back character will be returned by a subsequent read on the stream. Currently, only a single character can be pushed back onto the stream. The ungetc() function returns the character pushed back after the conversion, or \c EOF if the operation fails. If the value of the argument \c c character equals \c EOF, the operation will fail and the stream will remain unchanged. */ extern int ungetc(int __c, FILE *__stream); /** Read at most size - 1 bytes from \c stream, until a newline character was encountered, and store the characters in the buffer pointed to by \c str. Unless an error was encountered while reading, the string will then be terminated with a \c NUL character. If an error was encountered, the function returns NULL and sets the error flag of \c stream, which can be tested using ferror(). Otherwise, a pointer to the string will be returned. */ extern char *fgets(char *__str, int __size, FILE *__stream); /** Similar to fgets() except that it will operate on stream \c stdin, and the trailing newline (if any) will not be stored in the string. It is the caller's responsibility to provide enough storage to hold the characters read. */ extern char *gets(char *__str); /** Read \c nmemb objects, \c size bytes each, from \c stream, to the buffer pointed to by \c ptr. Returns the number of objects successfully read, i. e. \c nmemb unless an input error occured or end-of-file was encountered. feof() and ferror() must be used to distinguish between these two conditions. */ extern size_t fread(void *__ptr, size_t __size, size_t __nmemb, FILE *__stream); /** Clear the error and end-of-file flags of \c stream. */ extern void clearerr(FILE *__stream); #if !defined(__DOXYGEN__) /* fast inlined version of clearerr() */ #define clearerror(s) do { (s)->flags &= ~(__SERR | __SEOF); } while(0) #endif /* !defined(__DOXYGEN__) */ /** Test the end-of-file flag of \c stream. This flag can only be cleared by a call to clearerr(). */ extern int feof(FILE *__stream); #if !defined(__DOXYGEN__) /* fast inlined version of feof() */ #define feof(s) ((s)->flags & __SEOF) #endif /* !defined(__DOXYGEN__) */ /** Test the error flag of \c stream. This flag can only be cleared by a call to clearerr(). */ extern int ferror(FILE *__stream); #if !defined(__DOXYGEN__) /* fast inlined version of ferror() */ #define ferror(s) ((s)->flags & __SERR) #endif /* !defined(__DOXYGEN__) */ /** Formatted input. This function is the heart of the \c scanf family of functions. Characters are read from \c stream and processed in a way described by \c fmt. Conversion results will be assigned to the parameters passed via \c ap. The format string \c fmt is scanned for conversion specifications. Anything that doesn't comprise a conversion specification is taken as text that is matched literally against the input. White space in the format string will match any white space in the data (including none), all other characters match only itself. Processing is aborted as soon as the data and format string no longer match, or there is an error or end-of-file condition on \c stream. Most conversions skip leading white space before starting the actual conversion. Conversions are introduced with the character \b %. Possible options can follow the \b %: - a \c * indicating that the conversion should be performed but the conversion result is to be discarded; no parameters will be processed from \c ap, - the character \c h indicating that the argument is a pointer to short int (rather than int), - the character \c l indicating that the argument is a pointer to long int (rather than int, for integer type conversions), or a pointer to \c double (for floating point conversions). In addition, a maximal field width may be specified as a nonzero positive decimal integer, which will restrict the conversion to at most this many characters from the input stream. This field width is limited to at most 127 characters which is also the default value (except for the %c conversion that defaults to 1). The following conversion flags are supported: - \c % Matches a literal \c % character. This is not a conversion. - \c d Matches an optionally signed decimal integer; the next pointer must be a pointer to \c int. - \c i Matches an optionally signed integer; the next pointer must be a pointer to \c int. The integer is read in base 16 if it begins with \b 0x or \b 0X, in base 8 if it begins with \b 0, and in base 10 otherwise. Only characters that correspond to the base are used. - \c o Matches an octal integer; the next pointer must be a pointer to unsigned int. - \c u Matches an optionally signed decimal integer; the next pointer must be a pointer to unsigned int. - \c x Matches an optionally signed hexadecimal integer; the next pointer must be a pointer to unsigned int. - \c f Matches an optionally signed floating-point number; the next pointer must be a pointer to \c float. - e, g, E, G Equivalent to \c f. - \c s Matches a sequence of non-white-space characters; the next pointer must be a pointer to \c char, and the array must be large enough to accept all the sequence and the terminating \c NUL character. The input string stops at white space or at the maximum field width, whichever occurs first. - \c c Matches a sequence of width count characters (default 1); the next pointer must be a pointer to \c char, and there must be enough room for all the characters (no terminating \c NUL is added). The usual skip of leading white space is suppressed. To skip white space first, use an explicit space in the format. - \c [ Matches a nonempty sequence of characters from the specified set of accepted characters; the next pointer must be a pointer to \c char, and there must be enough room for all the characters in the string, plus a terminating \c NUL character. The usual skip of leading white space is suppressed. The string is to be made up of characters in (or not in) a particular set; the set is defined by the characters between the open bracket \c [ character and a close bracket \c ] character. The set excludes those characters if the first character after the open bracket is a circumflex \c ^. To include a close bracket in the set, make it the first character after the open bracket or the circumflex; any other position will end the set. The hyphen character \c - is also special; when placed between two other characters, it adds all intervening characters to the set. To include a hyphen, make it the last character before the final close bracket. For instance, [^]0-9-] means the set of everything except close bracket, zero through nine, and hyphen. The string ends with the appearance of a character not in the (or, with a circumflex, in) set or when the field width runs out. - \c p Matches a pointer value (as printed by %p in printf()); the next pointer must be a pointer to \c void. - \c n Nothing is expected; instead, the number of characters consumed thus far from the input is stored through the next pointer, which must be a pointer to \c int. This is not a conversion, although it can be suppressed with the \c * flag. These functions return the number of input items assigned, which can be fewer than provided for, or even zero, in the event of a matching failure. Zero indicates that, while there was input available, no conversions were assigned; typically this is due to an invalid input character, such as an alphabetic character for a %d conversion. The value \c EOF is returned if an input failure occurs before any conversion such as an end-of-file occurs. If an error or end-of-file occurs after conversion has begun, the number of conversions which were successfully completed is returned. By default, all the conversions described above are available except the floating-point conversions, and the \%[ conversion. These conversions will be available in the extended version provided by the library \c libscanf_flt.a. Note that either of these conversions requires the availability of a buffer that needs to be obtained at run-time using malloc(). If this buffer cannot be obtained, the operation is aborted, returning the value \c EOF. To link a program against the extended version, use the following compiler flags in the link stage: \code -Wl,-u,vfscanf -lscanf_flt -lm \endcode A third version is available for environments that are tight on space. This version is provided in the library \c libscanf_min.a, and can be requested using the following options in the link stage: \code -Wl,-u,vfscanf -lscanf_min -lm \endcode In addition to the restrictions of the standard version, this version implements no field width specification, no conversion assignment suppression flag (\c *), no %n specification, and no general format character matching at all. All characters in \c fmt that do not comprise a conversion specification will simply be ignored, including white space (that is normally used to consume \e any amount of white space in the input stream). However, the usual skip of initial white space in the formats that support it is implemented. */ extern int vfscanf(FILE *__stream, const char *__fmt, va_list __ap); /** Variant of vfscanf() using a \c fmt string in program memory. */ extern int vfscanf_P(FILE *__stream, const char *__fmt, va_list __ap); /** The function \c fscanf performs formatted input, reading the input data from \c stream. See vfscanf() for details. */ extern int fscanf(FILE *__stream, const char *__fmt, ...); /** Variant of fscanf() using a \c fmt string in program memory. */ extern int fscanf_P(FILE *__stream, const char *__fmt, ...); /** The function \c scanf performs formatted input from stream \c stdin. See vfscanf() for details. */ extern int scanf(const char *__fmt, ...); /** Variant of scanf() where \c fmt resides in program memory. */ extern int scanf_P(const char *__fmt, ...); /** The function \c vscanf performs formatted input from stream \c stdin, taking a variable argument list as in vfscanf(). See vfscanf() for details. */ extern int vscanf(const char *__fmt, va_list __ap); /** The function \c sscanf performs formatted input, reading the input data from the buffer pointed to by \c buf. See vfscanf() for details. */ extern int sscanf(const char *__buf, const char *__fmt, ...); /** Variant of sscanf() using a \c fmt string in program memory. */ extern int sscanf_P(const char *__buf, const char *__fmt, ...); #if defined(__DOXYGEN__) /** Flush \c stream. This is a null operation provided for source-code compatibility only, as the standard IO implementation currently does not perform any buffering. */ extern int fflush(FILE *stream); #else static __inline__ int fflush(FILE *stream __attribute__((unused))) { return 0; } #endif #ifdef __cplusplus } #endif /*@}*/ /* * The following constants are currently not used by avr-libc's * stdio subsystem. They are defined here since the gcc build * environment expects them to be here. */ #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #endif /* __ASSEMBLER */ #endif /* _STDLIB_H_ */ tinyos-2.1.2+dfsg/tos/lib/printf/2_0_2/printf.h000066400000000000000000000041001207233610700211050ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.2 $ * @date $Date: 2010-06-29 22:07:50 $ */ #ifndef PRINTF_H #define PRINTF_H #ifndef PRINTF_BUFFER_SIZE #define PRINTF_BUFFER_SIZE 250 #endif #ifdef _H_msp430hardware_h #include #endif #ifdef _H_atmega128hardware_H #include "avr_stdio.h" #endif #include "message.h" typedef nx_struct printf_msg { nx_uint8_t buffer[TOSH_DATA_LENGTH]; } printf_msg_t; enum { AM_PRINTF_MSG = 100, }; #endif //PRINTF_H tinyos-2.1.2+dfsg/tos/lib/printf/PrintfC.nc000066400000000000000000000057271207233610700205400ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This is the PrintfC component. It provides the printf service for printing * data over the serial interface using the standard c-style printf command. * Data printed using printf are buffered and only sent over the serial line after * the buffer is half full or an explicit call to printfflush() is made. This * buffer has a maximum size of 250 bytes at present. This component is wired * to a shadowed MainC component so that printf statements can be made anywhere * throughout your code, so long as you include the "printf.h" header file in * every file you wish to use it. Take a look at the printf tutorial (lesson 15) * for more details. * * The printf service is currently only available for msp430 based motes * (i.e. telos, eyes) and atmega128x based motes (i.e. mica2, micaz, iris). On the * atmega platforms, avr-libc version 1.4 or above must be used. */ /** * @author Kevin Klues * @date September 18, 2007 */ #include "printf.h" configuration PrintfC { } implementation { components MainC; components new SerialAMSenderC(AM_PRINTF_MSG); components new PrintfQueueC(uint8_t, PRINTF_BUFFER_SIZE) as QueueC; components PrintfP; components LedsC; MainC.SoftwareInit -> PrintfP; PrintfP.Queue -> QueueC; PrintfP.AMSend -> SerialAMSenderC; PrintfP.Packet -> SerialAMSenderC; components PutcharC; PutcharC.Putchar -> PrintfP; } tinyos-2.1.2+dfsg/tos/lib/printf/PrintfP.nc000066400000000000000000000136001207233610700205420ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This is the PrintfP component. It provides the printf service for printing * data over the serial interface using the standard c-style printf command. * Data printed using printf are buffered and only sent over the serial line after * the buffer is half full or an explicit call to printfflush() is made. This * buffer has a maximum size of 250 bytes at present. This component is wired * to a shadowed MainC component so that printf statements can be made anywhere * throughout your code, so long as you include the "printf.h" header file in * every file you wish to use it. Take a look at the printf tutorial (lesson 15) * for more details. * * The printf service is currently only available for msp430 based motes * (i.e. telos, eyes) and atmega128x based motes (i.e. mica2, micaz, iris). On the * atmega platforms, avr-libc version 1.4 or above must be used. */ /** * @author Kevin Klues * @date September 18, 2007 */ #include "printf.h" module PrintfP @safe() { provides { interface Init; interface Putchar; } uses { interface PrintfQueue as Queue; interface AMSend; interface Packet; interface Leds; } } implementation { enum { S_STARTED, S_FLUSHING, }; message_t printfMsg; uint8_t state = S_STARTED; command error_t Init.init() { atomic state = S_STARTED; return SUCCESS; } task void retrySend() { if(call AMSend.send(AM_BROADCAST_ADDR, &printfMsg, sizeof(printf_msg_t)) != SUCCESS) post retrySend(); } void sendNext() { int i; printf_msg_t* m = (printf_msg_t*)call Packet.getPayload(&printfMsg, sizeof(printf_msg_t)); uint16_t length_to_send = (call Queue.size() < sizeof(printf_msg_t)) ? call Queue.size() : sizeof(printf_msg_t); memset(m->buffer, 0, sizeof(printf_msg_t)); for(i=0; ibuffer[i] = call Queue.dequeue(); if(call AMSend.send(AM_BROADCAST_ADDR, &printfMsg, sizeof(printf_msg_t)) != SUCCESS) post retrySend(); } int printfflush() @C() @spontaneous() { atomic { if(state == S_FLUSHING) return SUCCESS; if(call Queue.empty()) return FAIL; state = S_FLUSHING; } sendNext(); return SUCCESS; } event void AMSend.sendDone(message_t* msg, error_t error) { if(error == SUCCESS) { if(call Queue.size() > 0) sendNext(); else state = S_STARTED; } else post retrySend(); } #undef putchar command int Putchar.putchar (int c) { if((state == S_STARTED) && (call Queue.size() >= ((PRINTF_BUFFER_SIZE)/2))) { state = S_FLUSHING; sendNext(); } atomic { if(call Queue.enqueue(c) == SUCCESS) return 0; else return -1; } } } tinyos-2.1.2+dfsg/tos/lib/printf/Putchar.nc000066400000000000000000000043761207233610700206000ustar00rootroot00000000000000/* * Copyright (c) 2011 Peter A. Bigot * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** Interface to be implemented by any low-level component that * provides character output for libc-based printf in TinyOS. The * component providing this interface should be wired to PutcharC from * $(TOSDIR)/lib/printf. * * @note On some platforms inclusion of may define putchar * as a macro. Any need for this should be eliminated by the * implementation in PutcharP.nc, so "#undef putchar" prior to your * use of this identifier when implementing this interface. * * @author Peter A. Bigot */ interface Putchar { /** Send the unsigned char represented by c to the output. Return * -1 on error, and c if successful. */ #undef putchar command int putchar (int c); } tinyos-2.1.2+dfsg/tos/lib/printf/PutcharC.nc000066400000000000000000000041331207233610700206720ustar00rootroot00000000000000/* * Copyright (c) 2011 Peter A. Bigot * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This component provides a TinyOS-compatible bridge to the * system-specific mechanism of providing single-character output to * the environment's printf(3c) infrastructure. Components that * provide a libc-based printf facility in TinyOS should implement the * Putchar interface and connect it to this module. * * @author Peter A. Bigot */ configuration PutcharC { uses interface Putchar; } implementation { components MainC; components PutcharP; MainC.SoftwareInit -> PutcharP; Putchar = PutcharP.Putchar; } tinyos-2.1.2+dfsg/tos/lib/printf/PutcharP.nc000066400000000000000000000112651207233610700207130ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This component provides a TinyOS-compatible bridge to the * system-specific mechanism of providing single-character output to * the environment's printf(3c) infrastructure. Components that * provide a libc-based printf facility in TinyOS should implement the * Putchar interface and connect it to this module. * * @author Kevin Klues * @author Peter A. Bigot */ #if defined (_H_msp430hardware_h) || defined (_H_atmega128hardware_H) #include #else #ifdef __M16C60HARDWARE_H__ #include "m16c60_printf.h" #else #include "generic_printf.h" #endif #endif #undef putchar #ifdef _H_atmega128hardware_H static int uart_putchar(char c, FILE *stream); static FILE atm128_stdout = FDEV_SETUP_STREAM(TCAST(int (*)(char c, FILE *stream), uart_putchar), NULL, _FDEV_SETUP_WRITE); #endif module PutcharP { provides interface Init; uses interface Putchar; } implementation { command error_t Init.init() { error_t rv = SUCCESS; #ifdef _H_atmega128hardware_H stdout = &atm128_stdout; #endif return rv; } #ifdef _H_msp430hardware_h int putchar(int c) __attribute__((noinline)) @C() @spontaneous() { #else #ifdef _H_atmega128hardware_H int uart_putchar(char c, FILE *stream) __attribute__((noinline)) @C() @spontaneous() { #else #ifdef __M16C60HARDWARE_H__ int lowlevel_putc(int c) __attribute__((noinline)) @C() @spontaneous() { #else int lowlevel_putc(int c) __attribute__((noinline)) @C() @spontaneous() { #endif #endif #endif return call Putchar.putchar (c); } } tinyos-2.1.2+dfsg/tos/lib/printf/SerialPrintf.txt000066400000000000000000000025261207233610700220060ustar00rootroot00000000000000Add a bare-serial printf component. The SerialPrintfC component, when incorporated into an application, links the platform-specific UartByte implementation into a global putchar function where it will be used by the C runtime system as the destination for printf(3c). It allows easy access to a read-only stream of information from the application without the overhead of using SerialActiveMessage. You should include in your application code, but no other wiring or include files are required. In lineage, it is a horribly emasculated derivative of tos/lib/printf/PrintfP, removing the buffering capability along with active message support. Use hyperterminal, minicom, or on Linux just cat /dev/ttyUSB0 to see the output. For the latter to work, you may need to run the following stty command: stty 115200 min 1 time 5 -icrnl -parenb cs8 < /dev/ttyUSB0 Replace the first argument with the appropriate baud rate for your application. For compatibility with serial-focused terminal programs, the end-of-line sequence in your code should be "\r\n". Using just "\n" in these environments causes the next line to be indented to the end of the previous line. When cat'ing /dev/serial, this often results in double-spaced output. Depending on your default tty configuration, the -icrnl option in the stty command above will prevent this behavior. tinyos-2.1.2+dfsg/tos/lib/printf/SerialPrintfC.nc000066400000000000000000000040351207233610700216670ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author David Moss * @author Kevin Klues */ configuration SerialPrintfC { provides { interface StdControl; } } implementation { components SerialPrintfP; StdControl = SerialPrintfP.StdControl; components MainC; MainC.SoftwareInit -> SerialPrintfP; components PlatformSerialC; SerialPrintfP.UartControl -> PlatformSerialC; SerialPrintfP.UartByte -> PlatformSerialC; components PutcharC; PutcharC.Putchar -> SerialPrintfP; } tinyos-2.1.2+dfsg/tos/lib/printf/SerialPrintfP.nc000066400000000000000000000044011207233610700217010ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author David Moss * @author Kevin Klues */ module SerialPrintfP { uses { interface StdControl as UartControl; interface UartByte; } provides { interface StdControl; interface Init; interface Putchar; } } implementation { command error_t Init.init () { return call StdControl.start(); } command error_t StdControl.start () { return call UartControl.start(); } command error_t StdControl.stop () { return call UartControl.stop(); } int printfflush() @C() @spontaneous() { return SUCCESS; } #undef putchar command int Putchar.putchar (int c) { return (SUCCESS == call UartByte.send(c)) ? c : -1; } } tinyos-2.1.2+dfsg/tos/lib/printf/SerialStartC.nc000066400000000000000000000036721207233610700215300ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Including this configuration will start the Serial port at boot time. This * is very useful if you use the serial port for debug only. * * @author Thomas Schmid */ configuration SerialStartC {} implementation { components MainC, SerialStartP; SerialStartP.Boot -> MainC; components SerialActiveMessageC; SerialStartP.SerialControl -> SerialActiveMessageC; } tinyos-2.1.2+dfsg/tos/lib/printf/SerialStartP.nc000066400000000000000000000036101207233610700215350ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ module SerialStartP { uses { interface Boot; interface SplitControl as SerialControl; } } implementation { event void Boot.booted() { call SerialControl.start(); } event void SerialControl.startDone(error_t error) {} event void SerialControl.stopDone(error_t error) {} } tinyos-2.1.2+dfsg/tos/lib/printf/generic_printf.h000066400000000000000000000204351207233610700220110ustar00rootroot00000000000000/**************************************************************** KPIT Cummins Infosystems Ltd, Pune, India. 1-April-2006. 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. *****************************************************************/ /* Written By: Shrirang Khishti . This is a smaller version of printf Positive points about this function 1. Reduces code size considerably ,very useful in embedded applications 2. No malloc calls are used 3. Supports almost all the functionalities of GNU std printf routine. 4. If user dont want float_support in this customized printf just undef macro float_support */ #ifndef __M16C62P_PRINTF_H__ #define __M16C62P_PRINTF_H__ #include #include #define printf _printf extern int lowlevel_putc(int c); int left_val,right_val; #define condition *format!='f'&&*format!='d'&&*format!='c'&&*format!='s'&&*format!='l'&&*format!='u'&&*format!='\0'&&*format!=' '&&*format!='i'&&*format!='x'&&*format!='X'&&*format!='o'&&*format!='%'&&*format!='p' #define float_support long temp_arr[]={100000,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000}; /** * @fn * @brief * * @param c */ int _putchar(int c) { /* Convert CR to CR/LF */ if (c == '\n') lowlevel_putc('\r'); lowlevel_putc(c); return c; } /** * @fn void _puts(const char *tempStr) * @brief Prints a NULL-erminated string on UART 1 * * @param s The string to output * */ int _puts(const char *s) { while( *s != '\0' ) _putchar(*s++); return 0; } /** * @fn void strrev(char *str) * @brief Reverses a string * * @param str The string to reverse */ void strrev(char *str) { char *temp, c; int len=strlen(str) ; temp = str + len -1; while(str < temp ) { c = *str; *str = *temp; *temp = c; str++; temp--; } } static void print_hex_oct( long int temp_var,int _div,int corr_factor,int ret_val,int sign,int *cntr_val) { unsigned long int i1,temp=temp_var; int cntr=0,neg_flag=0; char s1[40]; if(sign==1&&temp_var<0) { temp=-temp_var; neg_flag=1; } if(temp==0) s1[cntr++]='0'; while(temp>0) { i1=temp%_div; temp=temp/_div; if(i1<=9) s1[cntr]=i1+'0'; else s1[cntr]=i1+corr_factor-9; cntr++; } while((left_val-(right_val>cntr?right_val:cntr+neg_flag))>0) { _putchar(' '); left_val--; (*cntr_val)++; } while(right_val-cntr>0) { s1[cntr++]='0'; } if(neg_flag==1) s1[cntr++]='-'; s1[cntr]='\0'; strrev(s1); _puts(s1); (*cntr_val)+=strlen(s1); } #ifdef float_support static void float_print(long double f1,long double f2,int multi,int *cntr_val) { int temp,cntr=0,i1,neg_flag=0; char s1[10]; if(f1<0) { f1=f1*-1; neg_flag=1; f2=f1; } temp=(int)f1; f1=f1-temp; f1=f1*multi; temp=f1; if(temp==0) s1[cntr++]='0'; while(temp>0) { i1=temp%10; temp=temp/10; s1[cntr]=i1+0x30; cntr++; } while(right_val<9&&(right_val -cntr)>0) s1[cntr++]='0'; s1[cntr]='.'; cntr++; temp=(int)f2; if(temp==0) s1[cntr++]='0'; while(temp>0) { i1=temp%10; temp=temp/10; s1[cntr]=i1+0x30; cntr++; } while(left_val-- -cntr>0) { _putchar(' '); (*cntr_val)++; } if(neg_flag==1) s1[cntr++]='-'; s1[cntr]='\0'; cntr--; strrev(s1); _puts(s1); (*cntr_val)+=strlen(s1); neg_flag=0; } #endif // float_support static int format_val(char *temp,long float_flag,int *cntr_val,int flag) { left_val=0; right_val=0; if(*temp=='\0'&&flag==1) { right_val=3; return 0; } while(*temp!='.'&&*temp!='\0') { if(*temp<'0'||*temp>'9') { while(*temp) { _putchar(*temp++); (*cntr_val)++; } return -1; } else left_val=left_val*10+*temp-'0'; temp++; } if(*temp) temp++; else return left_val; while(*temp) { if(*temp<'0'||*temp>'9') { while(*temp) { _putchar(*temp++); (*cntr_val)++; } return -1; } else right_val=right_val*10+*temp-'0'; temp++; } return 0; } /** * @fn int _printf(const char *format, ...) * @brief Prints a formatted string on UART1 * * @param format The string */ int _printf(const char *format, ...) { int format_cntr=0; char temp_str[20]; int return_flag=0,cntr_val; long double f1,f2; char *str_temp; int *cntr=&cntr_val; va_list ap; va_start(ap, format); *cntr=0; while(*format) { temp_str[format_cntr]='\0'; if(*format=='%') { *format++; while(*format==' ') { format++; _putchar(' '); } while(condition) { temp_str[format_cntr++]=*format++; } temp_str[format_cntr]='\0'; if(*format=='%') { _putchar('%'); (*cntr)++; format_cntr=0; format++; continue; } /************** print unsigned ****************/ else if(*format=='u') { return_flag=format_val(temp_str,0,cntr,0); if(return_flag!=-1) print_hex_oct(va_arg(ap,unsigned int),10,0,return_flag,0,cntr); else { _putchar(*format); (*cntr)++; } format++; format_cntr=0; continue; } /*********** Print Integer Values **************/ else if(*format=='d'||*format=='i') { return_flag=format_val(temp_str,0,cntr,0); if(return_flag!=-1) print_hex_oct(va_arg(ap,int),10,0,return_flag,1,cntr); else { _putchar(*format); (*cntr)++; } format++; format_cntr=0; continue; } /*********** Print hex,Octal values ******************/ else if(*format=='x'||*format=='X'||*format=='o'||*format=='p') { return_flag=format_val(temp_str,0,cntr,0); if(return_flag!=-1) { if(*format=='x'||*format=='p') print_hex_oct(va_arg(ap,unsigned int),16,0x60,return_flag,0,cntr); else if(*format=='X') print_hex_oct(va_arg(ap,unsigned int),16,0x40,return_flag,0,cntr); else print_hex_oct(va_arg(ap,unsigned int),8,0,return_flag,0,cntr); } else { _putchar(*format); (*cntr)++; } format++; format_cntr=0; continue; } /************ Character printing ****************88*/ else if(*format=='c') { return_flag=format_val(temp_str,0,cntr,0); if(return_flag!=-1) { while(return_flag-->1) { _putchar(' '); (*cntr)++; } _putchar(va_arg(ap,int)); (*cntr)+=2; } else { _putchar(*format); (*cntr)++; } format++; format_cntr=0; continue; } /*************** Print String *****************/ else if(*format=='s') { return_flag=format_val(temp_str,0,cntr,0); if(return_flag!=-1) { str_temp=va_arg(ap,char*); while((return_flag-- -(int) strlen(str_temp))>0) { _putchar(' '); (*cntr)++; } _puts(str_temp); (*cntr)+=strlen(str_temp); } else { _putchar(*format); (*cntr)++; } format++; format_cntr=0; continue; } /*************** Print floating point number *****************/ else if(*format=='f'||(*format=='l'&&*(format+1)=='f')) { return_flag=format_val(temp_str,1,cntr,1); if(return_flag!=-1) { if(*format=='l') { f1=va_arg(ap,long double); format+=2; } else { f1=va_arg(ap,double); format++; } f2=f1; #ifdef float_support right_val++; float_print(f1,f2,temp_arr[right_val%10],cntr); #endif } else { _putchar(*format++); (*cntr)++; } format_cntr=0; continue; } else if(*format=='l'&&((*(format+1)=='d')||(*(format+1)=='u'))) { return_flag=format_val(temp_str,0,cntr,0); if((return_flag=-1)&&(*(format+1)=='d')) { print_hex_oct(va_arg(ap,long int),10,0x00,return_flag,1,cntr); } else if((return_flag=-1)&&(*(format+1)=='u')) { print_hex_oct(va_arg(ap,unsigned long int),10,0x00,return_flag,0,cntr); } else { _putchar(*format); _putchar(*(format+1)); (*cntr)+=2; } format+=2; format_cntr=0; continue; } else { _puts(temp_str); format_cntr=0; continue; } } _putchar(*format++); (*cntr)++; } va_end(ap); return cntr_val; } #endif // __M16C62P_PRINTF_H__ tinyos-2.1.2+dfsg/tos/lib/printf/printf.h000066400000000000000000000057251207233610700203220ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.17 $ * @date $Date: 2010-06-29 22:07:50 $ */ #ifndef PRINTF_H #define PRINTF_H #ifndef NEW_PRINTF_SEMANTICS #warning \ " *************************** PRINTF SEMANTICS HAVE CHANGED! ********************************************* Make sure you now include the following two components in your top level application file: PrintfC and SerialStartC. To supress this warning in the future, #define the variable NEW_PRINTF_SEMANTICS. Take a look at the updated tutorial application under apps/tutorials/printf for an example. ************************************************************************************" #endif #ifndef PRINTF_BUFFER_SIZE #define PRINTF_BUFFER_SIZE 250 #endif #if PRINTF_BUFFER_SIZE > 255 #define PrintfQueueC BigQueueC #define PrintfQueue BigQueue #else #define PrintfQueueC QueueC #define PrintfQueue Queue #endif #if defined (_H_msp430hardware_h) || defined (_H_atmega128hardware_H) #include #else #ifdef __M16C60HARDWARE_H__ #include "m16c60_printf.h" #else #include "generic_printf.h" #endif #endif #undef putchar #include "message.h" int printfflush(); #ifndef PRINTF_MSG_LENGTH #define PRINTF_MSG_LENGTH 28 #endif typedef nx_struct printf_msg { nx_uint8_t buffer[PRINTF_MSG_LENGTH]; } printf_msg_t; enum { AM_PRINTF_MSG = 100, }; #endif //PRINTF_H tinyos-2.1.2+dfsg/tos/lib/rfxlink/000077500000000000000000000000001207233610700170115ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/rfxlink/README000066400000000000000000000064231207233610700176760ustar00rootroot00000000000000 The radio driver interfaces have a set of generic configuration options. Some of these are set in the platforms/xxx/chips/yyy/RadioConfig.h header file (see the platforms/iris/chips/rf230/RadioConfig.h for example), others can be set in your Makefile. TFRAMES_ENABLED: If enabled, then tinyos frames are enabled, so 6lowpan will not work. See TEP125 for the details. LOW_POWER_LISTENING: If enabled, then the radio will duty cycle the radio (turn it off and on). See TEP105 for the details. SLOTTED_MAC: There are two CA (collision avoidance) algorithms: one is the simple random backoff just like the one used in the CC2420 driver. The other one is a slotted time sync based version where each node makes a guarantee that only at a given time within a time slot (e.g. 1 ms) they will ever start to transmit. This value is monitored by nearby motes (no payload overhead) and they preemptively avoid these time instances. This greatly reduces the chance that two motes will start to transmit within 50-100 microsecs to each other, so the CCA (clear channel assessment) will become much more efficient. This slotted behavior can enabled by defining SLOTTED_MAC. RADIO_DEBUG: If enabled, then every component in the radio stack will make sure that everything goes as intended via asserts. For example, we check that certain calls are not made in certain states, the radio hardware responds according to the datasheet, etc. Use the RADIO_ASSERT macro defined in the RadioAssert.h and make sure that the AssertC from lib/diagmsg is included in your application. All assert violations are reported over the serial interface. You can use the net.tinyos.util.DiagMsg java application to display diagnostic messages. RADIO_DEBUG_MESSAGES: If enabled, then the radio driver will print out all received and transmitted messages via the DiagMsg interface. This feature is used in the RF230Sniffer appliaction. TRAFFIC_MONITOR: If enabled, the TrafficMonitorLayer is included in the stack which keeps track of the number of send end received bytes, the amount of time when the radio driver was turned on, and other statistics. If RADIO_DEBUG is enabled then this information is also printed periodically with DisgMsg. PACKET_LINK: If defined, then the PacketLinkLayer is included in the stack. It provides standard functionality: retransmits messages when needed. typedef TRadio: The radio stack uses a single hardware alarm/counter. The resolution of this counter is platform specific and should be set just like the T32khz or TMilli time resolution types. All time stamps and time related information are recorded in this resolution within the driver. RADIO_ALARM_MICROSEC: This should be set to the number of radio alarm ticks per one microsecond. RADIO_ALARM_MILLI_EXP: The base two logarithm of the number of radio alarm ticks per one millisecond. SOFTWAREACK_TIMEOUT: The number of microseconds the driver should wait for a software acknowledgement on the sender side. If your SPI bus is slow, then it will take more time to download and upload the message from/to the radio chip, so you need to increase this wait period. For example, for IRIS->IRIS communication 800 microsec is enough, but for IRIS->TELOS we need 1600 because the TELOS in software ack mode is slow to reply with an ack packet. tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/000077500000000000000000000000001207233610700203105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/ActiveMessageConfig.nc000077500000000000000000000047011207233610700245050ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include interface ActiveMessageConfig { /** Same as AMPacket.destination */ command am_addr_t destination(message_t* msg); /** Same as AMPacket.setDestination */ command void setDestination(message_t* msg, am_addr_t addr); /** Same as AMPacket.source */ command am_addr_t source(message_t* msg); /** Same as AMPacket.setSource */ command void setSource(message_t* msg, am_addr_t addr); /** Same as AMPacket.group */ command am_group_t group(message_t* msg); /** Same as AMPacket.setGroup */ command void setGroup(message_t* msg, am_group_t grp); /** * Check if the packet is properly formatted, and if the user * forgot to call Packet.clear then format it properly. * Return SUCCESS if the frame is now properly set up, * or FAIL of the send operation should be aborted. */ command error_t checkFrame(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/ActiveMessageLayer.h000066400000000000000000000034411207233610700242000ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __ACTIVEMESSAGELAYER_H__ #define __ACTIVEMESSAGELAYER_H__ #include "AM.h" typedef nx_struct activemessage_header_t { nx_am_id_t type; } activemessage_header_t; #endif//__ACTIVEMESSAGELAYER_H__ tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/ActiveMessageLayerC.nc000077500000000000000000000053041207233610700244570ustar00rootroot00000000000000/* * Copyright (c) 2009, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration ActiveMessageLayerC() { provides { interface AMPacket; interface Packet; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface SendNotifier[am_id_t id]; // for TOSThreads interface Receive as ReceiveDefault[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; } uses { interface RadioPacket as SubPacket; interface BareSend as SubSend; interface BareReceive as SubReceive; interface ActiveMessageConfig as Config; } } implementation { components new ActiveMessageLayerP(), ActiveMessageAddressC; ActiveMessageLayerP.ActiveMessageAddress -> ActiveMessageAddressC; AMPacket = ActiveMessageLayerP; Packet = ActiveMessageLayerP; AMSend = ActiveMessageLayerP; Receive = ActiveMessageLayerP.Receive; Snoop = ActiveMessageLayerP.Snoop; SendNotifier = ActiveMessageLayerP; ReceiveDefault = ActiveMessageLayerP.ReceiveDefault; SnoopDefault = ActiveMessageLayerP.SnoopDefault; SubPacket = ActiveMessageLayerP; SubSend = ActiveMessageLayerP; SubReceive = ActiveMessageLayerP; Config = ActiveMessageLayerP; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/ActiveMessageLayerP.nc000066400000000000000000000167341207233610700245020ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti * Author: Chieh-Jan Mike Liang (default interfaces for TOSThreads) */ #include generic module ActiveMessageLayerP() { provides { interface RadioPacket; interface AMPacket; interface Packet; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface SendNotifier[am_id_t id]; // for TOSThreads interface Receive as ReceiveDefault[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; } uses { interface RadioPacket as SubPacket; interface BareSend as SubSend; interface BareReceive as SubReceive; interface ActiveMessageConfig as Config; interface ActiveMessageAddress; } } implementation { activemessage_header_t* getHeader(message_t* msg) { return ((void*)msg) + call SubPacket.headerLength(msg); } void* getPayload(message_t* msg) { return ((void*)msg) + call RadioPacket.headerLength(msg); } /*----------------- Send -----------------*/ command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len) { if( len > call Packet.maxPayloadLength() ) return EINVAL; if( call Config.checkFrame(msg) != SUCCESS ) return FAIL; call Packet.setPayloadLength(msg, len); call AMPacket.setSource(msg, call AMPacket.address()); call AMPacket.setGroup(msg, call AMPacket.localGroup()); call AMPacket.setType(msg, id); call AMPacket.setDestination(msg, addr); signal SendNotifier.aboutToSend[id](addr, msg); return call SubSend.send(msg); } inline event void SubSend.sendDone(message_t* msg, error_t error) { signal AMSend.sendDone[call AMPacket.type(msg)](msg, error); } inline command error_t AMSend.cancel[am_id_t id](message_t* msg) { return call SubSend.cancel(msg); } default event void AMSend.sendDone[am_id_t id](message_t* msg, error_t error) { } inline command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } inline command void* AMSend.getPayload[am_id_t id](message_t* msg, uint8_t len) { return call Packet.getPayload(msg, len); } default event void SendNotifier.aboutToSend[am_id_t id](am_addr_t addr, message_t* msg) { } /*----------------- Receive -----------------*/ event message_t* SubReceive.receive(message_t* msg) { am_id_t id = call AMPacket.type(msg); void* payload = getPayload(msg); uint8_t len = call Packet.payloadLength(msg); msg = call AMPacket.isForMe(msg) ? signal Receive.receive[id](msg, payload, len) : signal Snoop.receive[id](msg, payload, len); return msg; } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal ReceiveDefault.receive[id](msg, payload, len);; } default event message_t* ReceiveDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal SnoopDefault.receive[id](msg, payload, len);; } default event message_t* SnoopDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } /*----------------- AMPacket -----------------*/ inline command am_addr_t AMPacket.address() { return call ActiveMessageAddress.amAddress(); } inline command am_group_t AMPacket.localGroup() { return call ActiveMessageAddress.amGroup(); } inline command bool AMPacket.isForMe(message_t* msg) { am_addr_t addr = call AMPacket.destination(msg); return addr == call AMPacket.address() || addr == AM_BROADCAST_ADDR; } inline command am_addr_t AMPacket.destination(message_t* msg) { return call Config.destination(msg); } inline command void AMPacket.setDestination(message_t* msg, am_addr_t addr) { call Config.setDestination(msg, addr); } inline command am_addr_t AMPacket.source(message_t* msg) { return call Config.source(msg); } inline command void AMPacket.setSource(message_t* msg, am_addr_t addr) { call Config.setSource(msg, addr); } inline command am_id_t AMPacket.type(message_t* msg) { return getHeader(msg)->type; } inline command void AMPacket.setType(message_t* msg, am_id_t type) { getHeader(msg)->type = type; } inline command am_group_t AMPacket.group(message_t* msg) { return call Config.group(msg); } inline command void AMPacket.setGroup(message_t* msg, am_group_t grp) { call Config.setGroup(msg, grp); } inline async event void ActiveMessageAddress.changed() { } /*----------------- RadioPacket -----------------*/ async command uint8_t RadioPacket.headerLength(message_t* msg) { return call SubPacket.headerLength(msg) + sizeof(activemessage_header_t); } async command uint8_t RadioPacket.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg) - sizeof(activemessage_header_t); } async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length) { call SubPacket.setPayloadLength(msg, length + sizeof(activemessage_header_t)); } async command uint8_t RadioPacket.maxPayloadLength() { return call SubPacket.maxPayloadLength() - sizeof(activemessage_header_t); } async command uint8_t RadioPacket.metadataLength(message_t* msg) { return call SubPacket.metadataLength(msg); } async command void RadioPacket.clear(message_t* msg) { call SubPacket.clear(msg); } /*----------------- Packet -----------------*/ command void Packet.clear(message_t* msg) { call RadioPacket.clear(msg); } command uint8_t Packet.payloadLength(message_t* msg) { return call RadioPacket.payloadLength(msg); } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call RadioPacket.setPayloadLength(msg, len); } command uint8_t Packet.maxPayloadLength() { return call RadioPacket.maxPayloadLength(); } command void* Packet.getPayload(message_t* msg, uint8_t len) { if( len > call RadioPacket.maxPayloadLength() ) return NULL; return ((void*)msg) + call RadioPacket.headerLength(msg); } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/AutoResourceAcquireLayerC.nc000066400000000000000000000047271207233610700256760ustar00rootroot00000000000000/* * Copyright (c) 2009, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic module AutoResourceAcquireLayerC() { provides { interface BareSend; } uses { interface BareSend as SubSend; interface Resource; } } implementation { message_t *pending; command error_t BareSend.send(message_t* msg) { if( call Resource.immediateRequest() == SUCCESS ) { error_t result = call SubSend.send(msg); if( result != SUCCESS ) call Resource.release(); return result; } pending = msg; return call Resource.request(); } event void Resource.granted() { error_t result = call SubSend.send(pending); if( result != SUCCESS ) { call Resource.release(); signal BareSend.sendDone(pending, result); } } event void SubSend.sendDone(message_t* msg, error_t result) { call Resource.release(); signal BareSend.sendDone(msg, result); } command error_t BareSend.cancel(message_t* msg) { return call SubSend.cancel(msg); } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/CsmaConfig.nc000077500000000000000000000034461207233610700226550ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface CsmaConfig { /** * This command is called when the message is transmitted to * check if it needs software clear channel assesment. */ async command bool requiresSoftwareCCA(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/CsmaLayerC.nc000077500000000000000000000040001207233610700226120ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration CsmaLayerC() { provides { interface RadioSend; interface RadioReceive; } uses { interface RadioSend as SubSend; interface RadioReceive as SubReceive; interface RadioCCA as SubCCA; interface CsmaConfig as Config; } } implementation { components new CsmaLayerP(); RadioSend = CsmaLayerP; SubSend = CsmaLayerP; RadioReceive = SubReceive; SubCCA = CsmaLayerP; Config = CsmaLayerP; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/CsmaLayerP.nc000077500000000000000000000056221207233610700226420ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include generic module CsmaLayerP() { provides { interface RadioSend; } uses { interface CsmaConfig as Config; interface RadioSend as SubSend; interface RadioCCA as SubCCA; } } implementation { tasklet_norace message_t *txMsg; tasklet_norace uint8_t state; enum { STATE_READY = 0, STATE_CCA_WAIT = 1, STATE_SEND = 2, }; tasklet_async event void SubSend.ready() { if( state == STATE_READY ) signal RadioSend.ready(); } tasklet_async command error_t RadioSend.send(message_t* msg) { error_t error; if( state == STATE_READY ) { if( call Config.requiresSoftwareCCA(msg) ) { txMsg = msg; if( (error = call SubCCA.request()) == SUCCESS ) state = STATE_CCA_WAIT; } else if( (error = call SubSend.send(msg)) == SUCCESS ) state = STATE_SEND; } else error = EBUSY; return error; } tasklet_async event void SubCCA.done(error_t error) { RADIO_ASSERT( state == STATE_CCA_WAIT ); if( error == SUCCESS && (error = call SubSend.send(txMsg)) == SUCCESS ) state = STATE_SEND; else { state = STATE_READY; signal RadioSend.sendDone(EBUSY); } } tasklet_async event void SubSend.sendDone(error_t error) { RADIO_ASSERT( state == STATE_SEND ); state = STATE_READY; signal RadioSend.sendDone(error); } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/DebugLayerC.nc000066400000000000000000000041421207233610700227610ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration DebugLayerC(char prefix[]) { provides { interface RadioState; interface RadioSend; interface RadioReceive; } uses { interface RadioState as SubState; interface RadioSend as SubSend; interface RadioReceive as SubReceive; } } implementation { components new DebugLayerP(prefix), DiagMsgC; RadioState = DebugLayerP; RadioSend = DebugLayerP; RadioReceive = DebugLayerP; SubState = DebugLayerP; SubSend = DebugLayerP; SubReceive = DebugLayerP; DebugLayerP.DiagMsg -> DiagMsgC; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/DebugLayerP.nc000066400000000000000000000110711207233610700227750ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "Tasklet.h" generic module DebugLayerP(char prefix[]) { provides { interface RadioState; interface RadioSend; interface RadioReceive; } uses { interface RadioState as SubState; interface RadioSend as SubSend; interface RadioReceive as SubReceive; interface DiagMsg; } } implementation { // ------- RadioState tasklet_async command error_t RadioState.turnOff() { error_t error = call SubState.turnOff(); if( call DiagMsg.record() ) { call DiagMsg.str(prefix); call DiagMsg.str("turnOff"); call DiagMsg.uint8(error); call DiagMsg.send(); } return error; } tasklet_async command error_t RadioState.standby() { error_t error = call SubState.standby(); if( call DiagMsg.record() ) { call DiagMsg.str(prefix); call DiagMsg.str("standby"); call DiagMsg.uint8(error); call DiagMsg.send(); } return error; } tasklet_async command error_t RadioState.turnOn() { error_t error = call SubState.turnOn(); if( call DiagMsg.record() ) { call DiagMsg.str(prefix); call DiagMsg.str("turnOn"); call DiagMsg.uint8(error); call DiagMsg.send(); } return error; } tasklet_async command error_t RadioState.setChannel(uint8_t channel) { error_t error = call SubState.setChannel(channel); if( call DiagMsg.record() ) { call DiagMsg.str(prefix); call DiagMsg.str("setChannel"); call DiagMsg.uint8(channel); call DiagMsg.uint8(error); call DiagMsg.send(); } return error; } tasklet_async event void SubState.done() { if( call DiagMsg.record() ) { call DiagMsg.str(prefix); call DiagMsg.str("done"); call DiagMsg.send(); } signal RadioState.done(); } tasklet_async command uint8_t RadioState.getChannel() { return call SubState.getChannel(); } // ------- RadioSend tasklet_async command error_t RadioSend.send(message_t* msg) { error_t error = call SubSend.send(msg); if( call DiagMsg.record() ) { call DiagMsg.str(prefix); call DiagMsg.str("send"); call DiagMsg.hex16((uint16_t)msg); call DiagMsg.uint8(error); call DiagMsg.send(); } return error; } tasklet_async event void SubSend.sendDone(error_t error) { if( call DiagMsg.record() ) { call DiagMsg.str(prefix); call DiagMsg.str("sendDone"); call DiagMsg.uint8(error); call DiagMsg.send(); } signal RadioSend.sendDone(error); } tasklet_async event void SubSend.ready() { if( call DiagMsg.record() ) { call DiagMsg.str(prefix); call DiagMsg.str("ready"); call DiagMsg.send(); } signal RadioSend.ready(); } // ------- RadioReceive tasklet_async event bool SubReceive.header(message_t* msg) { signal RadioReceive.header(msg); } tasklet_async event message_t* SubReceive.receive(message_t* msg) { message_t* msg2 = signal RadioReceive.receive(msg); if( call DiagMsg.record() ) { call DiagMsg.str(prefix); call DiagMsg.str("receive"); call DiagMsg.hex16((uint16_t)msg); call DiagMsg.hex16((uint16_t)msg2); call DiagMsg.send(); } } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/DummyConfig.nc000077500000000000000000000033361207233610700230630ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface DummyConfig { /** * We need to put something here, but this is not going to get called */ async command void nothing(); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/DummyLayerC.nc000066400000000000000000000047451207233610700230370ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration DummyLayerC() { provides { interface SplitControl; interface BareSend; interface BareReceive; interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface DummyConfig as UnconnectedConfig; } uses { interface SplitControl as SubControl; interface BareSend as SubBareSend; interface BareReceive as SubBareReceive; interface RadioState as SubState; interface RadioSend as SubSend; interface RadioReceive as SubReceive; interface RadioCCA as SubRadioCCA; interface RadioPacket as SubPacket; interface DummyConfig as Config; } } implementation { RadioState = SubState; RadioSend = SubSend; RadioReceive = SubReceive; RadioCCA = SubRadioCCA; RadioPacket = SubPacket; SplitControl = SubControl; BareSend = SubBareSend; BareReceive = SubBareReceive; Config = UnconnectedConfig; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/Ieee154MessageLayerC.nc000066400000000000000000000104271207233610700243440ustar00rootroot00000000000000/* * Copyright (c) 2007-2009, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic module Ieee154MessageLayerC() { provides { interface Packet; interface Ieee154Send; interface Receive as Ieee154Receive; interface SendNotifier; } uses { interface Ieee154PacketLayer; interface RadioPacket; interface BareSend as SubSend; interface BareReceive as SubReceive; } } implementation { void* getPayload(message_t* msg) { return ((void*)msg) + call RadioPacket.headerLength(msg); } /*----------------- Packet -----------------*/ command void Packet.clear(message_t* msg) { call RadioPacket.clear(msg); } command uint8_t Packet.payloadLength(message_t* msg) { return call RadioPacket.payloadLength(msg); } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call RadioPacket.setPayloadLength(msg, len); } command uint8_t Packet.maxPayloadLength() { return call RadioPacket.maxPayloadLength(); } command void* Packet.getPayload(message_t* msg, uint8_t len) { if( len > call RadioPacket.maxPayloadLength() ) return NULL; return getPayload(msg); } /*----------------- Ieee154Send -----------------*/ command void * Ieee154Send.getPayload(message_t* msg, uint8_t len) { return call Packet.getPayload(msg, len); } command uint8_t Ieee154Send.maxPayloadLength() { return call Packet.maxPayloadLength(); } command error_t Ieee154Send.cancel(message_t* msg) { return call SubSend.cancel(msg); } command error_t Ieee154Send.send(ieee154_saddr_t addr, message_t* msg, uint8_t len) { if( len > call Packet.maxPayloadLength() ) return EINVAL; // user forgot to call Packet.clear(), maybe we should return FAIL if( ! call Ieee154PacketLayer.isDataFrame(msg) ) call Ieee154PacketLayer.createDataFrame(msg); call Packet.setPayloadLength(msg, len); call Ieee154PacketLayer.setSrcAddr(msg, call Ieee154PacketLayer.localAddr()); call Ieee154PacketLayer.setDestAddr(msg, addr); call Ieee154PacketLayer.setDestPan(msg, call Ieee154PacketLayer.localPan()); signal SendNotifier.aboutToSend(addr, msg); return call SubSend.send(msg); } event void SubSend.sendDone(message_t* msg, error_t error) { signal Ieee154Send.sendDone(msg, error); } default event void Ieee154Send.sendDone(message_t* msg, error_t error) { } default event void SendNotifier.aboutToSend(am_addr_t addr, message_t* msg) { } /*----------------- Receive -----------------*/ event message_t* SubReceive.receive(message_t* msg) { if( call Ieee154PacketLayer.isForMe(msg) ) return signal Ieee154Receive.receive(msg, getPayload(msg), call Packet.payloadLength(msg)); else return msg; } default event message_t* Ieee154Receive.receive(message_t* msg, void* payload, uint8_t len) { return msg; } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/Ieee154PacketLayer.h000066400000000000000000000035761207233610700237220ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __IEEE154PACKETLAYER_H__ #define __IEEE154PACKETLAYER_H__ #include "Ieee154.h" typedef nx_struct ieee154_simple_header_t { nxle_uint16_t fcf; nxle_uint8_t dsn; nxle_uint16_t destpan; nxle_uint16_t dest; nxle_uint16_t src; } ieee154_simple_header_t; #endif//__IEEE154PACKETLAYER_H__ tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/Ieee154PacketLayer.nc000066400000000000000000000135471207233610700240720ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "Ieee154.h" #include "message.h" /** * This interface encapsulates IEEE 802.15.4 intrapan data frames with * 16-bit destination pan, source and destination addresses. It also * supports 6LowPan interoperability mode, and acknowledgement frames. * Note, that this interface does not support the CRC-16 value, which * should be verified before the data can be trusted. */ interface Ieee154PacketLayer { /** * Returns the frame control field. This method should not be used, * isDataFrame and isAckFrame should be used instead. */ async command uint16_t getFCF(message_t* msg); /** * Sets the frame control field. This method should not be used, * createDataFrame and createAckFrame should be used instead. */ async command void setFCF(message_t* msg, uint16_t fcf); /** * Returns TRUE if the message is a data frame supported by * this interface (based on the value of the FCF). */ async command bool isDataFrame(message_t* msg); /** * Sets the FCF to create a data frame supported by this interface. * You may call setAckRequired and setFramePending commands after this. */ async command void createDataFrame(message_t* msg); /** * Returns TRUE if the message is an acknowledgement frame supported * by this interface (based on the value of the FCF). */ async command bool isAckFrame(message_t* msg); /** * Sets the FCF to create an acknowledgement frame supported by * this interface. You may call setFramePending after this. */ async command void createAckFrame(message_t* msg); /** * Creates an acknowledgement packet for the given data packet. * This also sets the DSN value. The data message must be a * data frame, the ack message will be overwritten. */ async command void createAckReply(message_t* data, message_t* ack); /** * Returns TRUE if the acknowledgement packet corresponds to the * data packet. The data message must be a data packet. */ async command bool verifyAckReply(message_t* data, message_t* ack); /** * Returns TRUE if the ACK required field is set in the FCF. */ async command bool getAckRequired(message_t* msg); /** * Sets the ACK required field in the FCF, should never be set * for acknowledgement frames. */ async command void setAckRequired(message_t* msg, bool ack); /** * Returns TRUE if the frame pending field is set in the FCF. */ async command bool getFramePending(message_t* msg); /** * Sets the frame pending field in the FCF. */ async command void setFramePending(message_t* msg, bool pending); /** * Returns the data sequence number */ async command uint8_t getDSN(message_t* msg); /** * Sets the data sequence number */ async command void setDSN(message_t* msg, uint8_t dsn); /** * returns the destination PAN id, values <= 255 are tinyos groups, * valid only for data frames */ async command uint16_t getDestPan(message_t* msg); /** * Sets the destination PAN id, valid only for data frames */ async command void setDestPan(message_t* msg, uint16_t pan); /** * Returns the destination address, valid only for data frames */ async command uint16_t getDestAddr(message_t* msg); /** * Sets the destination address, valid only for data frames */ async command void setDestAddr(message_t* msg, uint16_t addr); /** * Returns the source address, valid only for data frames */ async command uint16_t getSrcAddr(message_t* msg); /** * Sets the source address, valid only for data frames */ async command void setSrcAddr(message_t* msg, uint16_t addr); /** * Returns TRUE if the packet is a data packet, the ACK_REQ field * is set and the destination address is not the broadcast address. */ async command bool requiresAckWait(message_t* msg); /** * Returns TRUE if the packet is a data packet, the ACK_REQ field * is set and the destionation address is this node. */ async command bool requiresAckReply(message_t* msg); /** * Returns the local pan id (AM group) */ async command ieee154_panid_t localPan(); /** * Returns the local address of the node (AM address) */ async command ieee154_saddr_t localAddr(); /** * Returns TRUE if the destionation of this message is either 0xFFFF * or is the local address of the node, and the pan address is the * local one. */ async command bool isForMe(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/Ieee154PacketLayerC.nc000066400000000000000000000041111207233610700241600ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration Ieee154PacketLayerC() { provides { interface Ieee154PacketLayer; interface Ieee154Packet; interface RadioPacket; } uses { interface RadioPacket as SubPacket; } } implementation { components new Ieee154PacketLayerP(), ActiveMessageAddressC; Ieee154PacketLayerP.ActiveMessageAddress -> ActiveMessageAddressC; Ieee154PacketLayer = Ieee154PacketLayerP; Ieee154Packet = Ieee154PacketLayerP; RadioPacket = Ieee154PacketLayerP; SubPacket = Ieee154PacketLayerP; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/Ieee154PacketLayerP.nc000066400000000000000000000217261207233610700242100ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include generic module Ieee154PacketLayerP() { provides { interface Ieee154PacketLayer; interface Ieee154Packet; interface RadioPacket; } uses { interface ActiveMessageAddress; interface RadioPacket as SubPacket; } } implementation { /*----------------- Ieee154Packet -----------------*/ enum { IEEE154_DATA_FRAME_MASK = (IEEE154_TYPE_MASK << IEEE154_FCF_FRAME_TYPE) | (1 << IEEE154_FCF_INTRAPAN) | (IEEE154_ADDR_MASK << IEEE154_FCF_DEST_ADDR_MODE) | (IEEE154_ADDR_MASK << IEEE154_FCF_SRC_ADDR_MODE), IEEE154_DATA_FRAME_VALUE = (IEEE154_TYPE_DATA << IEEE154_FCF_FRAME_TYPE) | (1 << IEEE154_FCF_INTRAPAN) | (IEEE154_ADDR_SHORT << IEEE154_FCF_DEST_ADDR_MODE) | (IEEE154_ADDR_SHORT << IEEE154_FCF_SRC_ADDR_MODE), IEEE154_DATA_FRAME_PRESERVE = (1 << IEEE154_FCF_ACK_REQ) | (1 << IEEE154_FCF_FRAME_PENDING), IEEE154_ACK_FRAME_LENGTH = 3, // includes the FCF, DSN IEEE154_ACK_FRAME_MASK = (IEEE154_TYPE_MASK << IEEE154_FCF_FRAME_TYPE), IEEE154_ACK_FRAME_VALUE = (IEEE154_TYPE_ACK << IEEE154_FCF_FRAME_TYPE), }; ieee154_simple_header_t* getHeader(message_t* msg) { return ((void*)msg) + call SubPacket.headerLength(msg); } async command uint16_t Ieee154PacketLayer.getFCF(message_t* msg) { return getHeader(msg)->fcf; } async command void Ieee154PacketLayer.setFCF(message_t* msg, uint16_t fcf) { getHeader(msg)->fcf = fcf; } async command bool Ieee154PacketLayer.isDataFrame(message_t* msg) { return (getHeader(msg)->fcf & IEEE154_DATA_FRAME_MASK) == IEEE154_DATA_FRAME_VALUE; } async command void Ieee154PacketLayer.createDataFrame(message_t* msg) { // keep the ack requested and frame pending bits getHeader(msg)->fcf = (getHeader(msg)->fcf & IEEE154_DATA_FRAME_PRESERVE) | IEEE154_DATA_FRAME_VALUE; } async command bool Ieee154PacketLayer.isAckFrame(message_t* msg) { return (getHeader(msg)->fcf & IEEE154_ACK_FRAME_MASK) == IEEE154_ACK_FRAME_VALUE; } async command void Ieee154PacketLayer.createAckFrame(message_t* msg) { call SubPacket.setPayloadLength(msg, IEEE154_ACK_FRAME_LENGTH); getHeader(msg)->fcf = IEEE154_ACK_FRAME_VALUE; } async command void Ieee154PacketLayer.createAckReply(message_t* data, message_t* ack) { ieee154_simple_header_t* header = getHeader(ack); call SubPacket.setPayloadLength(ack, IEEE154_ACK_FRAME_LENGTH); header->fcf = IEEE154_ACK_FRAME_VALUE; header->dsn = getHeader(data)->dsn; } async command bool Ieee154PacketLayer.verifyAckReply(message_t* data, message_t* ack) { ieee154_simple_header_t* header = getHeader(ack); return header->dsn == getHeader(data)->dsn && (header->fcf & IEEE154_ACK_FRAME_MASK) == IEEE154_ACK_FRAME_VALUE; } async command bool Ieee154PacketLayer.getAckRequired(message_t* msg) { return getHeader(msg)->fcf & (1 << IEEE154_FCF_ACK_REQ) ? TRUE : FALSE; } async command void Ieee154PacketLayer.setAckRequired(message_t* msg, bool ack) { if( ack ) getHeader(msg)->fcf |= (1 << IEEE154_FCF_ACK_REQ); else getHeader(msg)->fcf &= ~(uint16_t)(1 << IEEE154_FCF_ACK_REQ); } async command bool Ieee154PacketLayer.getFramePending(message_t* msg) { return getHeader(msg)->fcf & (1 << IEEE154_FCF_FRAME_PENDING) ? TRUE : FALSE; } async command void Ieee154PacketLayer.setFramePending(message_t* msg, bool pending) { if( pending ) getHeader(msg)->fcf |= (1 << IEEE154_FCF_FRAME_PENDING); else getHeader(msg)->fcf &= ~(uint16_t)(1 << IEEE154_FCF_FRAME_PENDING); } async command uint8_t Ieee154PacketLayer.getDSN(message_t* msg) { return getHeader(msg)->dsn; } async command void Ieee154PacketLayer.setDSN(message_t* msg, uint8_t dsn) { getHeader(msg)->dsn = dsn; } async command uint16_t Ieee154PacketLayer.getDestPan(message_t* msg) { return getHeader(msg)->destpan; } async command void Ieee154PacketLayer.setDestPan(message_t* msg, uint16_t pan) { getHeader(msg)->destpan = pan; } async command uint16_t Ieee154PacketLayer.getDestAddr(message_t* msg) { return getHeader(msg)->dest; } async command void Ieee154PacketLayer.setDestAddr(message_t* msg, uint16_t addr) { getHeader(msg)->dest = addr; } async command uint16_t Ieee154PacketLayer.getSrcAddr(message_t* msg) { return getHeader(msg)->src; } async command void Ieee154PacketLayer.setSrcAddr(message_t* msg, uint16_t addr) { getHeader(msg)->src = addr; } async command bool Ieee154PacketLayer.requiresAckWait(message_t* msg) { return call Ieee154PacketLayer.getAckRequired(msg) && call Ieee154PacketLayer.isDataFrame(msg) && call Ieee154PacketLayer.getDestAddr(msg) != 0xFFFF; } async command bool Ieee154PacketLayer.requiresAckReply(message_t* msg) { return call Ieee154PacketLayer.getAckRequired(msg) && call Ieee154PacketLayer.isDataFrame(msg) && call Ieee154PacketLayer.getDestAddr(msg) == call ActiveMessageAddress.amAddress(); } async command ieee154_saddr_t Ieee154PacketLayer.localAddr() { return call ActiveMessageAddress.amAddress(); } async command ieee154_panid_t Ieee154PacketLayer.localPan() { return call ActiveMessageAddress.amGroup(); } async command bool Ieee154PacketLayer.isForMe(message_t* msg) { ieee154_saddr_t addr = call Ieee154PacketLayer.getDestAddr(msg); return (addr == call Ieee154PacketLayer.localAddr() || addr == IEEE154_BROADCAST_ADDR) && call Ieee154PacketLayer.getDestPan(msg) == call Ieee154PacketLayer.localPan(); } async event void ActiveMessageAddress.changed() { } /*----------------- Ieee154Packet -----------------*/ command ieee154_saddr_t Ieee154Packet.address() { return call Ieee154PacketLayer.localAddr(); } command ieee154_saddr_t Ieee154Packet.destination(message_t* msg) { return call Ieee154PacketLayer.getDestAddr(msg); } command ieee154_saddr_t Ieee154Packet.source(message_t* msg) { return call Ieee154PacketLayer.getSrcAddr(msg); } command void Ieee154Packet.setDestination(message_t* msg, ieee154_saddr_t addr) { call Ieee154PacketLayer.setDestAddr(msg, addr); } command void Ieee154Packet.setSource(message_t* msg, ieee154_saddr_t addr) { call Ieee154PacketLayer.setSrcAddr(msg, addr); } command bool Ieee154Packet.isForMe(message_t* msg) { return call Ieee154PacketLayer.isForMe(msg); } command ieee154_panid_t Ieee154Packet.pan(message_t* msg) { return call Ieee154PacketLayer.getDestPan(msg); } command void Ieee154Packet.setPan(message_t* msg, ieee154_panid_t grp) { call Ieee154PacketLayer.setDestPan(msg, grp); } command ieee154_panid_t Ieee154Packet.localPan() { return call Ieee154PacketLayer.localPan(); } /*----------------- RadioPacket -----------------*/ async command uint8_t RadioPacket.headerLength(message_t* msg) { return call SubPacket.headerLength(msg) + sizeof(ieee154_simple_header_t); } async command uint8_t RadioPacket.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg) - sizeof(ieee154_simple_header_t); } async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length) { call SubPacket.setPayloadLength(msg, length + sizeof(ieee154_simple_header_t)); } async command uint8_t RadioPacket.maxPayloadLength() { return call SubPacket.maxPayloadLength() - sizeof(ieee154_simple_header_t); } async command uint8_t RadioPacket.metadataLength(message_t* msg) { return call SubPacket.metadataLength(msg); } async command void RadioPacket.clear(message_t* msg) { call Ieee154PacketLayer.createDataFrame(msg); call SubPacket.clear(msg); } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/LowPowerListeningConfig.nc000066400000000000000000000043561207233610700254230ustar00rootroot00000000000000/* * Copyright (c) 2009, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface LowPowerListeningConfig { /** * Returns TRUE if an acknowledgement should be requested * for the message automatically by the LPL code (this should * normally happen for all non-broadcast messages). */ command bool needsAutoAckRequest(message_t* msg); /** * Returns TRUE if an acknowledgement has been requested for * this message via the PacketAcknowledgements interface. */ command bool ackRequested(message_t* msg); /** * Returns the number of milliseconds the mote should turn on * its radio to check for incoming messages. This check is * performed at every localWakeInterval. */ command uint16_t getListenLength(); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/LowPowerListeningDummyC.nc000066400000000000000000000042331207233610700254060ustar00rootroot00000000000000/* * Copyright (c) 2009, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration LowPowerListeningDummyC() { provides { interface SplitControl; interface BareSend as Send; interface BareReceive as Receive; interface RadioPacket; interface LowPowerListening; } uses { interface SplitControl as SubControl; interface BareSend as SubSend; interface BareReceive as SubReceive; interface RadioPacket as SubPacket; } } implementation { SplitControl = SubControl; Send = SubSend; Receive = SubReceive; RadioPacket = SubPacket; components new LowPowerListeningDummyP(); LowPowerListening = LowPowerListeningDummyP; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/LowPowerListeningDummyP.nc000066400000000000000000000040311207233610700254170ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic module LowPowerListeningDummyP() { provides interface LowPowerListening; } implementation { command void LowPowerListening.setLocalWakeupInterval(uint16_t intervalMs) { } command uint16_t LowPowerListening.getLocalWakeupInterval() { return 0; } command void LowPowerListening.setRemoteWakeupInterval(message_t *msg, uint16_t intervalMs) { } command uint16_t LowPowerListening.getRemoteWakeupInterval(message_t *msg) { return 0; } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/LowPowerListeningLayer.h000066400000000000000000000034131207233610700251120ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __LOWPOWERLISTENINGLAYER_H__ #define __LOWPOWERLISTENINGLAYER_H__ typedef struct lpl_metadata_t { uint16_t sleepint; } lpl_metadata_t; #endif//__LOWPOWERLISTENINGLAYER_H__ tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/LowPowerListeningLayerC.nc000066400000000000000000000054251207233610700253730ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration LowPowerListeningLayerC() { provides { interface SplitControl; interface BareSend as Send; interface BareReceive as Receive; interface RadioPacket; interface LowPowerListening; } uses { interface SplitControl as SubControl; interface BareSend as SubSend; interface BareReceive as SubReceive; interface RadioPacket as SubPacket; interface LowPowerListeningConfig as Config; interface PacketAcknowledgements; } } implementation { components new LowPowerListeningLayerP(), new TimerMilliC(); components SystemLowPowerListeningC; SplitControl = LowPowerListeningLayerP; Send = LowPowerListeningLayerP; Receive = LowPowerListeningLayerP; RadioPacket = LowPowerListeningLayerP; LowPowerListening = LowPowerListeningLayerP; SubControl = LowPowerListeningLayerP; SubSend = LowPowerListeningLayerP; SubReceive = LowPowerListeningLayerP; SubPacket = LowPowerListeningLayerP; Config = LowPowerListeningLayerP; PacketAcknowledgements = LowPowerListeningLayerP; LowPowerListeningLayerP.Timer -> TimerMilliC; LowPowerListeningLayerP.SystemLowPowerListening -> SystemLowPowerListeningC; components NoLedsC as LedsC; LowPowerListeningLayerP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/LowPowerListeningLayerP.nc000066400000000000000000000253271207233610700254130ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include #include generic module LowPowerListeningLayerP() { provides { interface SplitControl; interface BareSend as Send; interface BareReceive as Receive; interface RadioPacket; interface LowPowerListening; } uses { interface SplitControl as SubControl; interface BareSend as SubSend; interface BareReceive as SubReceive; interface RadioPacket as SubPacket; interface PacketAcknowledgements; interface LowPowerListeningConfig as Config; interface Timer; interface SystemLowPowerListening; interface Leds; } } implementation { enum { MIN_SLEEP = 2, // the minimum sleep interval in milliseconds }; uint16_t sleepInterval = LPL_DEF_LOCAL_WAKEUP; message_t* txMsg; error_t txError; /*----------------- state machine -----------------*/ enum { OFF = 0, OFF_SUBSTOP = 1, // must have consecutive indices OFF_SUBSTOP_DONE = 2, // must have consecutive indices OFF_STOP_END = 3, // must have consecutive indices OFF_START_END = 4, LISTEN_SUBSTART = 10, // must have consecutive indices LISTEN_SUBSTART_DONE = 11, // must have consecutive indices LISTEN_TIMER = 12, // must have consecutive indices LISTEN_WAIT = 13, // must have consecutive indices SLEEP_SUBSTOP = 20, // must have consecutive indices SLEEP_SUBSTOP_DONE = 21, // must have consecutive indices SLEEP_TIMER = 22, // must have consecutive indices SLEEP_WAIT = 23, // must have consecutive indices SLEEP_SUBSTOP_DONE_TOSEND = 29, // must have consecutive indices SEND_SUBSTART = 30, // must have consecutive indices SEND_SUBSTART_DONE = 31, // must have consecutive indices SEND_TIMER = 32, // must have consecutive indices SEND_SUBSEND= 33, SEND_SUBSEND_DONE = 34, SEND_SUBSEND_DONE_LAST = 35, SEND_DONE = 36, }; uint8_t state; task void transition() { error_t error; uint16_t transmitInterval; if( state == LISTEN_SUBSTART || state == SEND_SUBSTART ) { error = call SubControl.start(); RADIO_ASSERT( error == SUCCESS || error == EBUSY ); if( error == SUCCESS ) { call Leds.led2On(); ++state; } else post transition(); } else if( state == SLEEP_SUBSTOP || state == OFF_SUBSTOP ) { error = call SubControl.stop(); RADIO_ASSERT( error == SUCCESS || error == EBUSY ); if( error == SUCCESS ) { ++state; call Leds.led2Off(); } else post transition(); } else if( state == OFF_START_END ) { state = LISTEN_SUBSTART; post transition(); signal SplitControl.startDone(SUCCESS); } else if( state == OFF_STOP_END ) { state = OFF; signal SplitControl.stopDone(SUCCESS); } else if( state == LISTEN_TIMER ) { state = LISTEN_WAIT; if( sleepInterval > 0 ) call Timer.startOneShot(call Config.getListenLength()); } else if( state == SLEEP_TIMER ) { if( sleepInterval > 0 ) { state = SLEEP_WAIT; call Timer.startOneShot(sleepInterval); } else { state = LISTEN_SUBSTART; post transition(); } } else if( state == SEND_TIMER ) { transmitInterval = call LowPowerListening.getRemoteWakeupInterval(txMsg); if( transmitInterval > 0 ) call Timer.startOneShot(transmitInterval + 2 * call Config.getListenLength()); state = SEND_SUBSEND; post transition(); } else if( state == SEND_SUBSEND) { txError = call SubSend.send(txMsg); if( txError == SUCCESS ) state = SEND_SUBSEND_DONE; else { state = SEND_DONE; post transition(); } } else if( state == SEND_DONE ) { state = LISTEN_WAIT; if( sleepInterval > 0 ) call Timer.startOneShot(call SystemLowPowerListening.getDelayAfterReceive()); signal Send.sendDone(txMsg, txError); } } command error_t SplitControl.start() { if( state == OFF_START_END ) return EBUSY; else if( state != OFF ) return EALREADY; state = OFF_START_END; post transition(); return SUCCESS; } event void SubControl.startDone(error_t error) { RADIO_ASSERT( error == SUCCESS || error == EBUSY ); RADIO_ASSERT( state == LISTEN_SUBSTART_DONE || state == SEND_SUBSTART_DONE ); if( error == SUCCESS ) ++state; else --state; post transition(); } command error_t SplitControl.stop() { if( state == SLEEP_WAIT || state == LISTEN_WAIT ) { call Timer.stop(); post transition(); } if( state == LISTEN_TIMER || state == LISTEN_WAIT || state == SLEEP_SUBSTOP ) state = OFF_SUBSTOP; else if( state == SLEEP_SUBSTOP_DONE ) state = OFF_SUBSTOP_DONE; else if( state == LISTEN_SUBSTART || state == SLEEP_TIMER || state == SLEEP_WAIT ) state = OFF_STOP_END; else if( state == OFF ) return EALREADY; else return EBUSY; return SUCCESS; } event void SubControl.stopDone(error_t error) { RADIO_ASSERT( error == SUCCESS || error == EBUSY ); RADIO_ASSERT( state == SLEEP_SUBSTOP_DONE || state == OFF_SUBSTOP_DONE || state == SLEEP_SUBSTOP_DONE_TOSEND ); if( error == SUCCESS ) ++state; else if( state != SLEEP_SUBSTOP_DONE_TOSEND ) --state; else state = SEND_TIMER; post transition(); } event void Timer.fired() { if( state == LISTEN_WAIT ) state = SLEEP_SUBSTOP; else if( state == SLEEP_WAIT ) state = LISTEN_SUBSTART; else if( state == SEND_SUBSEND_DONE ) state = SEND_SUBSEND_DONE_LAST; else if( state == SEND_SUBSEND) state = SEND_DONE; else RADIO_ASSERT(FALSE); post transition(); } event message_t* SubReceive.receive(message_t* msg) { call Leds.led0Toggle(); if( state == SLEEP_SUBSTOP ) state = LISTEN_WAIT; if( state == LISTEN_WAIT && sleepInterval > 0 ) call Timer.startOneShot(call SystemLowPowerListening.getDelayAfterReceive()); return signal Receive.receive(msg); } command error_t Send.send(message_t* msg) { if( state == LISTEN_WAIT || state == SLEEP_WAIT ) { call Timer.stop(); post transition(); } if( state == LISTEN_SUBSTART || state == SLEEP_TIMER || state == SLEEP_WAIT ) state = SEND_SUBSTART; else if( state == LISTEN_SUBSTART_DONE ) state = SEND_SUBSTART_DONE; else if( state == LISTEN_TIMER || state == SLEEP_SUBSTOP || state == LISTEN_WAIT ) state = SEND_TIMER; else if( state == SLEEP_SUBSTOP_DONE ) state = SLEEP_SUBSTOP_DONE_TOSEND; else return EBUSY; if( call Config.needsAutoAckRequest(msg) ) call PacketAcknowledgements.requestAck(msg); txMsg = msg; txError = FAIL; return SUCCESS; } command error_t Send.cancel(message_t* msg) { if( state == SEND_SUBSEND ) { call Timer.stop(); state = SEND_DONE; txError = ECANCEL; post transition(); return SUCCESS; } else if( state == SEND_SUBSEND_DONE ) { // we stop sending the message even if SubSend.cancel was not succesfull state = SEND_SUBSEND_DONE_LAST; return call SubSend.cancel(txMsg); } else return FAIL; } event void SubSend.sendDone(message_t* msg, error_t error) { RADIO_ASSERT( state == SEND_SUBSEND_DONE || state == SEND_SUBSEND_DONE_LAST ); RADIO_ASSERT( msg == txMsg ); txError = error; // TODO: extend the PacketAcknowledgements interface with getAckRequired if( error != SUCCESS || call LowPowerListening.getRemoteWakeupInterval(msg) == 0 || state == SEND_SUBSEND_DONE_LAST || (call Config.ackRequested(msg) && call PacketAcknowledgements.wasAcked(msg)) ) { call Timer.stop(); state = SEND_DONE; } else state = SEND_SUBSEND; post transition(); if( error == SUCCESS ) call Leds.led1Toggle(); } /*----------------- LowPowerListening -----------------*/ lpl_metadata_t* getMeta(message_t* msg) { return ((void*)msg) + sizeof(message_t) - call RadioPacket.metadataLength(msg); } command void LowPowerListening.setLocalWakeupInterval(uint16_t interval) { if( interval < MIN_SLEEP ) interval = 0; sleepInterval = interval; if( state == LISTEN_WAIT || state == SLEEP_WAIT ) { call Timer.stop(); --state; post transition(); } } command uint16_t LowPowerListening.getLocalWakeupInterval() { return sleepInterval; } command void LowPowerListening.setRemoteWakeupInterval(message_t *msg, uint16_t interval) { if( interval < MIN_SLEEP ) interval = 0; getMeta(msg)->sleepint = interval; } command uint16_t LowPowerListening.getRemoteWakeupInterval(message_t *msg) { return getMeta(msg)->sleepint; } default event void SplitControl.startDone(error_t error) { } default event void SplitControl.stopDone(error_t error) { } /*----------------- RadioPacket -----------------*/ async command uint8_t RadioPacket.headerLength(message_t* msg) { return call SubPacket.headerLength(msg); } async command uint8_t RadioPacket.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg); } async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length) { call SubPacket.setPayloadLength(msg, length); } async command uint8_t RadioPacket.maxPayloadLength() { return call SubPacket.maxPayloadLength(); } async command uint8_t RadioPacket.metadataLength(message_t* msg) { return call SubPacket.metadataLength(msg) + sizeof(lpl_metadata_t); } async command void RadioPacket.clear(message_t* msg) { getMeta(msg)->sleepint = 0; call SubPacket.clear(msg); } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/MessageBufferLayerC.nc000066400000000000000000000043651207233610700244600ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration MessageBufferLayerC() { provides { interface SplitControl; interface BareSend as Send; interface BareReceive as Receive; interface RadioChannel; } uses { interface RadioState; interface RadioSend; interface RadioReceive; } } implementation { components new MessageBufferLayerP(), MainC, TaskletC; MainC.SoftwareInit -> MessageBufferLayerP; SplitControl = MessageBufferLayerP; Send = MessageBufferLayerP; Receive = MessageBufferLayerP; RadioChannel = MessageBufferLayerP; RadioState = MessageBufferLayerP; MessageBufferLayerP.Tasklet -> TaskletC; RadioSend = MessageBufferLayerP; RadioReceive = MessageBufferLayerP; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/MessageBufferLayerP.nc000066400000000000000000000161651207233610700244760ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti * Andreas Huber */ #include #include generic module MessageBufferLayerP() { provides { interface SplitControl; interface Init as SoftwareInit; interface BareSend as Send; interface BareReceive as Receive; interface RadioChannel; } uses { interface RadioState; interface Tasklet; interface RadioSend; interface RadioReceive; } } implementation { /*----------------- State -----------------*/ tasklet_norace uint8_t state; enum { STATE_READY = 0, STATE_TX_PENDING = 1, STATE_TX_RETRY = 2, STATE_TX_SEND = 3, STATE_TX_DONE = 4, STATE_TURN_ON = 5, STATE_TURN_OFF = 6, STATE_CHANNEL = 7, }; command error_t SplitControl.start() { error_t error; call Tasklet.suspend(); if( state != STATE_READY ) error = EBUSY; else { error = call RadioState.turnOn(); if( error == SUCCESS ) state = STATE_TURN_ON; } call Tasklet.resume(); return error; } command error_t SplitControl.stop() { error_t error; call Tasklet.suspend(); if( state != STATE_READY ) error = EBUSY; else { error = call RadioState.turnOff(); if( error == SUCCESS ) state = STATE_TURN_OFF; } call Tasklet.resume(); return error; } command error_t RadioChannel.setChannel(uint8_t channel) { error_t error; call Tasklet.suspend(); if( state != STATE_READY ) error = EBUSY; else { error = call RadioState.setChannel(channel); if( error == SUCCESS ) state = STATE_CHANNEL; } call Tasklet.resume(); return error; } command uint8_t RadioChannel.getChannel() { return call RadioState.getChannel(); } task void stateDoneTask() { uint8_t s; s = state; // change the state before so we can be reentered from the event state = STATE_READY; if( s == STATE_TURN_ON ) signal SplitControl.startDone(SUCCESS); else if( s == STATE_TURN_OFF ) signal SplitControl.stopDone(SUCCESS); else if( s == STATE_CHANNEL ) signal RadioChannel.setChannelDone(); else // not our event, ignore it state = s; } tasklet_async event void RadioState.done() { post stateDoneTask(); } default event void SplitControl.startDone(error_t error) { } default event void SplitControl.stopDone(error_t error) { } default event void RadioChannel.setChannelDone() { } /*----------------- Send -----------------*/ message_t* txMsg; tasklet_norace error_t txError; uint8_t retries; // Many EBUSY replies from RadioSend are normal if the channel is cognested enum { MAX_RETRIES = 5 }; task void sendTask() { bool done = FALSE; call Tasklet.suspend(); RADIO_ASSERT( state == STATE_TX_PENDING || state == STATE_TX_DONE ); if( state == STATE_TX_PENDING && ++retries <= MAX_RETRIES ) { txError = call RadioSend.send(txMsg); if( txError == SUCCESS ) state = STATE_TX_SEND; else state = STATE_TX_RETRY; } else { state = STATE_READY; done = TRUE; } call Tasklet.resume(); if( done ) signal Send.sendDone(txMsg, txError); } tasklet_async event void RadioSend.sendDone(error_t error) { RADIO_ASSERT( state == STATE_TX_SEND ); txError = error; if( error == SUCCESS ) state = STATE_TX_DONE; else state = STATE_TX_PENDING; post sendTask(); } command error_t Send.send(message_t* msg) { error_t result; call Tasklet.suspend(); if( state != STATE_READY ) result = EBUSY; else { txMsg = msg; state = STATE_TX_PENDING; retries = 0; post sendTask(); result = SUCCESS; } call Tasklet.resume(); return result; } tasklet_async event void RadioSend.ready() { if( state == STATE_TX_RETRY ) { state = STATE_TX_PENDING; post sendTask(); } } tasklet_async event void Tasklet.run() { } command error_t Send.cancel(message_t* msg) { error_t result; call Tasklet.suspend(); RADIO_ASSERT( msg == txMsg ); if( state == STATE_TX_PENDING || state == STATE_TX_RETRY ) { state = STATE_TX_DONE; txError = ECANCEL; result = SUCCESS; post sendTask(); } else result = EBUSY; call Tasklet.resume(); return result; } /*----------------- Receive -----------------*/ enum { RECEIVE_QUEUE_SIZE = 3, }; message_t receiveQueueData[RECEIVE_QUEUE_SIZE]; message_t* receiveQueue[RECEIVE_QUEUE_SIZE]; uint8_t receiveQueueHead; uint8_t receiveQueueSize; command error_t SoftwareInit.init() { uint8_t i; for(i = 0; i < RECEIVE_QUEUE_SIZE; ++i) receiveQueue[i] = receiveQueueData + i; return SUCCESS; } tasklet_async event bool RadioReceive.header(message_t* msg) { bool notFull; // this prevents undeliverable messages to be acknowledged atomic notFull = receiveQueueSize < RECEIVE_QUEUE_SIZE; return notFull; } task void deliverTask() { // get rid of as many messages as possible without interveining tasks for(;;) { message_t* msg; atomic { if( receiveQueueSize == 0 ) return; msg = receiveQueue[receiveQueueHead]; } msg = signal Receive.receive(msg); atomic { receiveQueue[receiveQueueHead] = msg; if( ++receiveQueueHead >= RECEIVE_QUEUE_SIZE ) receiveQueueHead = 0; --receiveQueueSize; } } } tasklet_async event message_t* RadioReceive.receive(message_t* msg) { message_t *m; atomic { if( receiveQueueSize >= RECEIVE_QUEUE_SIZE ) m = msg; else { uint8_t idx = receiveQueueHead + receiveQueueSize; if( idx >= RECEIVE_QUEUE_SIZE ) idx -= RECEIVE_QUEUE_SIZE; m = receiveQueue[idx]; receiveQueue[idx] = msg; ++receiveQueueSize; post deliverTask(); } } return m; } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/MetadataFlagsLayer.h000066400000000000000000000034651207233610700241630ustar00rootroot00000000000000/* * Copyright (c) 2009, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __METADATAFLAGSLAYER_H__ #define __METADATAFLAGSLAYER_H__ typedef struct flags_metadata_t { // TODO: make sure that we have no more than 8 flags uint8_t flags; } flags_metadata_t; #endif//__METADATAFLAGSLAYER_H__ tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/MetadataFlagsLayerC.nc000066400000000000000000000065141207233610700244350ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include generic module MetadataFlagsLayerC() { provides { interface PacketFlag[uint8_t bit]; interface RadioPacket; } uses { interface RadioPacket as SubPacket; } } implementation { flags_metadata_t* getMeta(message_t* msg) { return ((void*)msg) + sizeof(message_t) - call RadioPacket.metadataLength(msg); } /*----------------- RadioPacket -----------------*/ async command bool PacketFlag.get[uint8_t bit](message_t* msg) { return getMeta(msg)->flags & (1<flags |= (1<flags &= ~(1<flags = 0; call SubPacket.clear(msg); } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/PacketLinkLayer.h000066400000000000000000000034201207233610700235020ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __PACKETLINKLAYER_H__ #define __PACKETLINKLAYER_H__ typedef struct link_metadata_t { uint16_t maxRetries; uint16_t retryDelay; } link_metadata_t; #endif//__PACKETLINKLAYER_H__ tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/PacketLinkLayerC.nc000066400000000000000000000104701207233610700237610ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Reliable Packet Link Functionality * @author David Moss * @author Jon Wyant * @author Miklos Maroti */ #include generic configuration PacketLinkLayerC() { provides { interface BareSend as Send; interface BareReceive as Receive; interface PacketLink; interface RadioPacket; } uses { interface BareSend as SubSend; interface BareReceive as SubReceive; interface RadioPacket as SubPacket; interface PacketAcknowledgements; } #ifndef PACKET_LINK uses interface PacketLink as UnconnectedPacketLink; provides interface PacketAcknowledgements as UnconnectedPacketAcks; #endif } implementation { #ifdef PACKET_LINK components new PacketLinkLayerP(), new TimerMilliC() as DelayTimerC; PacketLink = PacketLinkLayerP; Send = PacketLinkLayerP; SubSend = PacketLinkLayerP; PacketAcknowledgements = PacketLinkLayerP; RadioPacket = PacketLinkLayerP; SubPacket = PacketLinkLayerP; PacketLinkLayerP.DelayTimer -> DelayTimerC; Receive = SubReceive; #else Send = SubSend; Receive = SubReceive; RadioPacket = SubPacket; PacketLink = UnconnectedPacketLink; PacketAcknowledgements = UnconnectedPacketAcks; #endif } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/PacketLinkLayerP.nc000066400000000000000000000134271207233610700240030ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * Copyright (c) 2010, Aarhus Universitet * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti, * Author: Morten Tranberg Hansen */ #include #include generic module PacketLinkLayerP() { provides { interface BareSend as Send; interface PacketLink; interface RadioPacket; } uses { interface BareSend as SubSend; interface PacketAcknowledgements; interface Timer as DelayTimer; interface RadioPacket as SubPacket; } } implementation { enum { STATE_READY = 0, STATE_SENDING = 1, STATE_SENDDONE = 2, STATE_SIGNAL = 4, // add error code }; uint8_t state = STATE_READY; message_t *currentMsg; uint16_t totalRetries; /** * We do everything from a single task in order to call SubSend.send * and Send.sendDone only once. This helps inlining the code and * reduces the code size. */ task void send() { uint16_t retries; RADIO_ASSERT( state != STATE_READY ); retries = call PacketLink.getRetries(currentMsg); if( state == STATE_SENDDONE ) { if( retries == 0 || call PacketAcknowledgements.wasAcked(currentMsg) ) state = STATE_SIGNAL + SUCCESS; else if( ++totalRetries < retries ) { uint16_t delay; state = STATE_SENDING; delay = call PacketLink.getRetryDelay(currentMsg); if( delay > 0 ) { call DelayTimer.startOneShot(delay); return; } } else state = STATE_SIGNAL + FAIL; } if( state == STATE_SENDING ) { state = STATE_SENDDONE; if( call SubSend.send(currentMsg) != SUCCESS ) post send(); return; } if( state >= STATE_SIGNAL ) { error_t error = state - STATE_SIGNAL; // do not update the retries count for non packet link messages if( retries > 0 ) call PacketLink.setRetries(currentMsg, totalRetries); state = STATE_READY; signal Send.sendDone(currentMsg, error); } } event void SubSend.sendDone(message_t* msg, error_t error) { RADIO_ASSERT( state == STATE_SENDDONE || state == STATE_SIGNAL + ECANCEL ); RADIO_ASSERT( msg == currentMsg ); if( error != SUCCESS ) state = STATE_SIGNAL + error; post send(); } event void DelayTimer.fired() { RADIO_ASSERT( state == STATE_SENDING ); post send(); } command error_t Send.send(message_t *msg) { if( state != STATE_READY ) return EBUSY; // it is enough to set it only once if( call PacketLink.getRetries(msg) > 0 ) call PacketAcknowledgements.requestAck(msg); currentMsg = msg; totalRetries = 0; state = STATE_SENDING; post send(); return SUCCESS; } command error_t Send.cancel(message_t *msg) { if( currentMsg != msg || state == STATE_READY ) return FAIL; // if a send is in progress if( state == STATE_SENDDONE ) call SubSend.cancel(msg); else post send(); call DelayTimer.stop(); state = STATE_SIGNAL + ECANCEL; return SUCCESS; } // ------- PacketLink link_metadata_t* getMeta(message_t* msg) { return ((void*)msg) + sizeof(message_t) - call RadioPacket.metadataLength(msg); } command void PacketLink.setRetries(message_t *msg, uint16_t maxRetries) { getMeta(msg)->maxRetries = maxRetries; } command void PacketLink.setRetryDelay(message_t *msg, uint16_t retryDelay) { getMeta(msg)->retryDelay = retryDelay; } command uint16_t PacketLink.getRetries(message_t *msg) { return getMeta(msg)->maxRetries; } command uint16_t PacketLink.getRetryDelay(message_t *msg) { return getMeta(msg)->retryDelay; } command bool PacketLink.wasDelivered(message_t *msg) { return call PacketAcknowledgements.wasAcked(msg); } // ------- RadioPacket async command uint8_t RadioPacket.headerLength(message_t* msg) { return call SubPacket.headerLength(msg); } async command uint8_t RadioPacket.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg); } async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length) { call SubPacket.setPayloadLength(msg, length); } async command uint8_t RadioPacket.maxPayloadLength() { return call SubPacket.maxPayloadLength(); } async command uint8_t RadioPacket.metadataLength(message_t* msg) { return call SubPacket.metadataLength(msg) + sizeof(link_metadata_t); } async command void RadioPacket.clear(message_t* msg) { getMeta(msg)->maxRetries = 0; call SubPacket.clear(msg); } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/RandomCollisionConfig.nc000077500000000000000000000043741207233610700250670ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface RandomCollisionConfig { /** * Returns the initial amount of maximum backoff for this message. */ async command uint16_t getInitialBackoff(message_t* msg); /** * Returns the amount of maximum backoff when there is congestion * (the channel was busy for the first try) */ async command uint16_t getCongestionBackoff(message_t* msg); /** * Returns the minimum ticks before the message could be sent. */ async command uint16_t getMinimumBackoff(); /** * The provided message was just received, and this command should return * the time till no transmission should be initiated. */ async command uint16_t getTransmitBarrier(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/RandomCollisionLayerC.nc000077500000000000000000000042551207233610700250370ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration RandomCollisionLayerC() { provides { interface RadioSend; interface RadioReceive; } uses { interface RadioSend as SubSend; interface RadioReceive as SubReceive; interface RadioAlarm; interface RandomCollisionConfig as Config; } } implementation { components new RandomCollisionLayerP(), RandomC; RadioSend = RandomCollisionLayerP; SubSend = RandomCollisionLayerP; Config = RandomCollisionLayerP; RadioReceive = RandomCollisionLayerP; SubReceive = RandomCollisionLayerP; RadioAlarm = RandomCollisionLayerP; RandomCollisionLayerP.Random -> RandomC; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/RandomCollisionLayerP.nc000077500000000000000000000110551207233610700250500ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include generic module RandomCollisionLayerP() { provides { interface RadioSend; interface RadioReceive; } uses { interface RadioSend as SubSend; interface RadioReceive as SubReceive; interface RadioAlarm; interface Random; interface RandomCollisionConfig as Config; } } implementation { tasklet_norace uint8_t state; enum { STATE_READY = 0, STATE_TX_PENDING_FIRST = 1, STATE_TX_PENDING_SECOND = 2, STATE_TX_SENDING = 3, STATE_BARRIER = 0x80, }; tasklet_norace message_t *txMsg; tasklet_norace uint16_t txBarrier; tasklet_async event void SubSend.ready() { if( state == STATE_READY && call RadioAlarm.isFree() ) signal RadioSend.ready(); } uint16_t nextRandom; task void calcNextRandom() { uint16_t a = call Random.rand16(); atomic nextRandom = a; } uint16_t getBackoff(uint16_t maxBackoff) { uint16_t a; atomic { a = nextRandom; nextRandom += 273; } post calcNextRandom(); return (a % maxBackoff) + call Config.getMinimumBackoff(); } tasklet_async command error_t RadioSend.send(message_t* msg) { if( state != STATE_READY || ! call RadioAlarm.isFree() ) return EBUSY; txMsg = msg; state = STATE_TX_PENDING_FIRST; call RadioAlarm.wait(getBackoff(call Config.getInitialBackoff(msg))); return SUCCESS; } tasklet_async event void RadioAlarm.fired() { error_t error; int16_t delay; RADIO_ASSERT( state != STATE_READY ); delay = (int16_t)txBarrier - call RadioAlarm.getNow(); if( state == STATE_BARRIER ) { state = STATE_READY; signal RadioSend.ready(); return; } else if( (state & STATE_BARRIER) && delay > 0 ) error = EBUSY; else error = call SubSend.send(txMsg); if( error != SUCCESS ) { if( (state & ~STATE_BARRIER) == STATE_TX_PENDING_FIRST ) { state = (state & STATE_BARRIER) | STATE_TX_PENDING_SECOND; call RadioAlarm.wait(getBackoff(call Config.getCongestionBackoff(txMsg))); } else { if( (state & STATE_BARRIER) && delay > 0 ) { state = STATE_BARRIER; call RadioAlarm.wait(delay); } else state = STATE_READY; signal RadioSend.sendDone(error); } } else state = STATE_TX_SENDING; } tasklet_async event void SubSend.sendDone(error_t error) { RADIO_ASSERT( state == STATE_TX_SENDING ); state = STATE_READY; signal RadioSend.sendDone(error); } tasklet_async event bool SubReceive.header(message_t* msg) { return signal RadioReceive.header(msg); } tasklet_async event message_t* SubReceive.receive(message_t* msg) { int16_t delay; txBarrier = call Config.getTransmitBarrier(msg); delay = txBarrier - call RadioAlarm.getNow(); if( delay > 0 ) { if( state == STATE_READY ) { // disregard the barrier for now, this needs a better solution if( call RadioAlarm.isFree() ) { call RadioAlarm.wait(delay); state = STATE_BARRIER; } } else state |= STATE_BARRIER; } return signal RadioReceive.receive(msg); } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/SlottedCollisionConfig.nc000077500000000000000000000051121207233610700252540ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface SlottedCollisionConfig { /** * This command should return the approximate transmit delay between * setting an alarm, waiting for the fire event, calling send and * obtaining the timestamp for the transmitted message. */ async command uint16_t getInitialDelay(); /** * Must return a binary exponent so that the collision avoidance layer * can assign slots in the range of [0, 1 << exponent) of size collision * window. */ async command uint8_t getScheduleExponent(); /** * This command must return the time when the message was transmitted. */ async command uint16_t getTransmitTime(message_t* msg); /** * Returns the start of the collision window for this received message, * so transmit times in this range would be considered possible collisions. */ async command uint16_t getCollisionWindowStart(message_t* msg); /** * Returns the size of the collision window for this received message. */ async command uint16_t getCollisionWindowLength(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/SlottedCollisionLayerC.nc000066400000000000000000000045141207233610700252300ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration SlottedCollisionLayerC() { provides { interface RadioSend; interface RadioReceive; } uses { interface RadioSend as SubSend; interface RadioReceive as SubReceive; interface RadioAlarm; interface SlottedCollisionConfig as Config; } } implementation { components new SlottedCollisionLayerP(), MainC, RandomC; RadioSend = SlottedCollisionLayerP; RadioReceive = SlottedCollisionLayerP; SubSend = SlottedCollisionLayerP; SubReceive = SlottedCollisionLayerP; Config = SlottedCollisionLayerP; RadioAlarm = SlottedCollisionLayerP; SlottedCollisionLayerP.Random -> RandomC; MainC.SoftwareInit -> SlottedCollisionLayerP; #ifdef RADIO_DEBUG components DiagMsgC; SlottedCollisionLayerP.DiagMsg -> DiagMsgC; #endif } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/SlottedCollisionLayerP.nc000066400000000000000000000154411207233610700252460ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include generic module SlottedCollisionLayerP() { provides { interface RadioSend; interface RadioReceive; interface Init; } uses { interface RadioSend as SubSend; interface RadioReceive as SubReceive; interface RadioAlarm; interface Random; interface SlottedCollisionConfig as Config; #ifdef RADIO_DEBUG interface DiagMsg; #endif } } implementation { /* ----- random ----- */ uint16_t nextRandom; task void calcNextRandom() { uint16_t a = call Random.rand16(); atomic nextRandom = a; } uint16_t getNextRandom() { uint16_t a; atomic { a = nextRandom; nextRandom += 273; } post calcNextRandom(); return a; } /* ----- schedule selection ----- */ void printStats(); tasklet_async event bool SubReceive.header(message_t* msg) { return signal RadioReceive.header(msg); } // WARNING!!! Do not change these values, the error values can overflow enum { ERROR_DECAY = 3, ERROR_SWITCH = 30, // should be a multiple of (1 << decay) ERROR_COLLISION = 20, // must be less than (255 - switch) >> decay ERROR_BUSY = 1, // must be less than collision ERROR_INITIAL = 80, // must be less than giveup ERROR_GIVEUP = 120, // must be less than collision * (1 << decay) ERROR_REPRESS = 40, // must be more than switch ERROR_MAX = 255, }; /** * Returns TRUE if time is between start and start + window * modulo the schedule size of (1 << exponent) */ inline bool isBetween(uint8_t exponent, uint16_t time, uint16_t start, uint16_t length) { return (uint16_t)((time - start) & ((1 << exponent) - 1)) < length; } tasklet_norace uint16_t schedule1; tasklet_norace uint16_t schedule2; tasklet_norace uint8_t error1; tasklet_norace uint8_t error2; tasklet_async event message_t* SubReceive.receive(message_t* msg) { uint8_t exponent = call Config.getScheduleExponent(); uint16_t start = call Config.getCollisionWindowStart(msg); uint16_t length = call Config.getCollisionWindowLength(msg); error1 -= (error1 + (1<> ERROR_DECAY; if( isBetween(exponent, schedule1, start, length) ) error1 += ERROR_COLLISION; error2 -= (error1 + (1<> ERROR_DECAY; if( isBetween(exponent, schedule2, start, length) ) error2 += ERROR_COLLISION; if( error2 + ERROR_SWITCH <= error1 ) { error1 = error2; schedule1 = schedule2; error2 = ERROR_GIVEUP; } if( error2 >= ERROR_GIVEUP ) { error2 = ERROR_INITIAL; schedule2 = getNextRandom(); } printStats(); return signal RadioReceive.receive(msg); } /* ------ transmit ------ */ tasklet_norace uint8_t state; enum { STATE_READY = 0, STATE_PENDING = 1, STATE_SENDING = 2, }; enum { DELAY_DECAY = 2 }; tasklet_norace message_t *txMsg; tasklet_norace uint16_t txDelay; // the averaged delay between schedule and timestamp tasklet_norace uint16_t txTime; // the schedule time of transmission tasklet_async event void SubSend.ready() { if( state == STATE_READY && call RadioAlarm.isFree() ) signal RadioSend.ready(); } tasklet_async command error_t RadioSend.send(message_t* msg) { uint16_t backoff; uint16_t time; // TODO: we could supress transmission while error is large if( state != STATE_READY || ! call RadioAlarm.isFree() || error1 >= ERROR_REPRESS ) return EBUSY; txMsg = msg; state = STATE_PENDING; time = call RadioAlarm.getNow(); backoff = 1 + ((schedule1 - time - (txDelay >> DELAY_DECAY)) & ((1 << call Config.getScheduleExponent()) - 1)); backoff += getNextRandom() & (3 << call Config.getScheduleExponent()); call RadioAlarm.wait(backoff); txTime = time + backoff; printStats(); return SUCCESS; } tasklet_async event void RadioAlarm.fired() { error_t error; RADIO_ASSERT( state == STATE_PENDING ); error = call SubSend.send(txMsg); if( error == SUCCESS ) state = STATE_SENDING; else { if( error2 + ERROR_SWITCH <= error1 ) { error1 = error2; schedule1 = schedule2; error2 = ERROR_INITIAL; schedule2 = getNextRandom(); } else if( error1 < ERROR_MAX - ERROR_BUSY ) error1 = error1 + ERROR_BUSY; state = STATE_READY; signal RadioSend.sendDone(error); } } tasklet_async event void SubSend.sendDone(error_t error) { RADIO_ASSERT( state == STATE_SENDING ); if( error == SUCCESS ) { txDelay += (call Config.getTransmitTime(txMsg) - txTime) - (txDelay >> DELAY_DECAY); RADIO_ASSERT( (txDelay >> DELAY_DECAY) < (1 << call Config.getScheduleExponent()) ); } state = STATE_READY; signal RadioSend.sendDone(error); } /* ------ init ------ */ command error_t Init.init() { // do not use Random here because it might not be initialized schedule1 = (uint16_t)(TOS_NODE_ID * 1973); schedule2 = schedule1 + 0117; txDelay = call Config.getInitialDelay() << DELAY_DECAY; return SUCCESS; } #ifdef RADIO_DEBUG tasklet_norace uint8_t count; void printStats() { if( ++count > 50 && call DiagMsg.record() ) { count = 0; call DiagMsg.str("slotted"); call DiagMsg.uint16(txDelay >> DELAY_DECAY); call DiagMsg.uint16(schedule1); call DiagMsg.uint8(error1); call DiagMsg.uint16(schedule2); call DiagMsg.uint8(error2); call DiagMsg.send(); } } #else void printStats() { } #endif } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/SoftwareAckConfig.nc000077500000000000000000000062411207233610700241770ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include interface SoftwareAckConfig { /** * Returns the acknowledgement timeout (in the radio clock units), * in which a sent packet must be acknowledged. */ async command uint16_t getAckTimeout(); /** * Sets the flag in the message indicating to the receiver whether * the message should be acknowledged. */ async command void setAckRequired(message_t* msg, bool ack); /** * Returns TRUE if the layer should wait for a software acknowledgement * to be received after this packet was transmitted. */ async command bool requiresAckWait(message_t* msg); /** * Returns TRUE if the received packet is an acknowledgement packet. * The AckedSend layer will filter out all received acknowledgement * packets and uses only the matching one for the acknowledgement. */ async command bool isAckPacket(message_t* msg); /** * Returns TRUE if the acknowledgement packet corresponds to the * data packet. The acknowledgement packect was already verified * to be a valid acknowledgement packet via the isAckPacket command. */ async command bool verifyAckPacket(message_t* data, message_t* ack); /** * Returns TRUE if the received packet needs software acknowledgements * to be sent back to the sender. */ async command bool requiresAckReply(message_t* msg); /** * Creates an acknowledgement packet for the given data packet. */ async command void createAckPacket(message_t* data, message_t* ack); /** * This command is called when a sent packet did not receive an * acknowledgement. */ tasklet_async command void reportChannelError(); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/SoftwareAckLayerC.nc000066400000000000000000000116261207233610700241510ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include generic module SoftwareAckLayerC() { provides { interface RadioSend; interface RadioReceive; interface PacketAcknowledgements; } uses { interface RadioSend as SubSend; interface RadioReceive as SubReceive; interface RadioAlarm; interface SoftwareAckConfig as Config; interface PacketFlag as AckReceivedFlag; } } implementation { tasklet_norace uint8_t state; enum { STATE_READY = 0, STATE_DATA_SEND = 1, STATE_ACK_WAIT = 2, STATE_ACK_SEND = 3, }; tasklet_norace message_t *txMsg; tasklet_norace message_t ackMsg; tasklet_async event void SubSend.ready() { if( state == STATE_READY ) signal RadioSend.ready(); } tasklet_async command error_t RadioSend.send(message_t* msg) { error_t error; if( state == STATE_READY ) { if( (error = call SubSend.send(msg)) == SUCCESS ) { call AckReceivedFlag.clear(msg); state = STATE_DATA_SEND; txMsg = msg; } } else error = EBUSY; return error; } tasklet_async event void SubSend.sendDone(error_t error) { if( state == STATE_ACK_SEND ) { // TODO: what if error != SUCCESS RADIO_ASSERT( error == SUCCESS ); state = STATE_READY; } else { RADIO_ASSERT( state == STATE_DATA_SEND ); RADIO_ASSERT( call RadioAlarm.isFree() ); if( error == SUCCESS && call Config.requiresAckWait(txMsg) && call RadioAlarm.isFree() ) { call RadioAlarm.wait(call Config.getAckTimeout()); state = STATE_ACK_WAIT; } else { state = STATE_READY; signal RadioSend.sendDone(error); } } } tasklet_async event void RadioAlarm.fired() { RADIO_ASSERT( state == STATE_ACK_WAIT ); call Config.reportChannelError(); state = STATE_READY; signal RadioSend.sendDone(SUCCESS); // we have sent it, but not acked } tasklet_async event bool SubReceive.header(message_t* msg) { // drop unexpected ACKs if( call Config.isAckPacket(msg) ) return state == STATE_ACK_WAIT; // drop packets that need ACKs while waiting for our ACK // if( state == STATE_ACK_WAIT && call Config.requiresAckWait(msg) ) // return FALSE; return signal RadioReceive.header(msg); } tasklet_async event message_t* SubReceive.receive(message_t* msg) { RADIO_ASSERT( state == STATE_ACK_WAIT || state == STATE_READY ); if( call Config.isAckPacket(msg) ) { if( state == STATE_ACK_WAIT && call Config.verifyAckPacket(txMsg, msg) ) { call RadioAlarm.cancel(); call AckReceivedFlag.set(txMsg); state = STATE_READY; signal RadioSend.sendDone(SUCCESS); } return msg; } if( state == STATE_READY && call Config.requiresAckReply(msg) ) { call Config.createAckPacket(msg, &ackMsg); // TODO: what to do if we are busy and cannot send an ack if( call SubSend.send(&ackMsg) == SUCCESS ) state = STATE_ACK_SEND; else RADIO_ASSERT(FALSE); } return signal RadioReceive.receive(msg); } /*----------------- PacketAcknowledgements -----------------*/ async command error_t PacketAcknowledgements.requestAck(message_t* msg) { call Config.setAckRequired(msg, TRUE); return SUCCESS; } async command error_t PacketAcknowledgements.noAck(message_t* msg) { call Config.setAckRequired(msg, FALSE); return SUCCESS; } async command bool PacketAcknowledgements.wasAcked(message_t* msg) { return call AckReceivedFlag.get(msg); } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/TimeConverterLayerC.nc000066400000000000000000000117701207233610700245260ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ // Shift is positive, if TOther has less precision (is slower) than TRadio generic module TimeConverterLayerC(typedef TOther, int8_t shift) { provides { interface TimeSyncAMSend as TimeSyncAMSendOther[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketOther; interface PacketTimeStamp as PacketTimeStampOther; } uses { interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampRadio; interface LocalTime as LocalTimeRadio; interface LocalTime as LocalTimeOther; } } implementation { // Converts TRadio time to TOther time uint32_t convertRadioToOther(uint32_t radioTime) { uint32_t localTimeRadio, localTimeOther; int32_t elapsedTime; atomic { localTimeRadio = call LocalTimeRadio.get(); localTimeOther = call LocalTimeOther.get(); } elapsedTime = radioTime - localTimeRadio; if( shift > 0 ) elapsedTime >>= shift; else if( shift < 0 ) elapsedTime <<= -shift; return elapsedTime + localTimeOther; } // Converts TOther time to TRadio time uint32_t convertOtherToRadio(uint32_t otherTime) { uint32_t localTimeRadio, localTimeOther; int32_t elapsedTime; atomic { localTimeRadio = call LocalTimeRadio.get(); localTimeOther = call LocalTimeOther.get(); } elapsedTime = otherTime - localTimeOther; if( shift > 0 ) elapsedTime <<= shift; else if( shift < 0 ) elapsedTime >>= -shift; return elapsedTime + localTimeRadio; } /*----------------- PacketTimeStampOther -----------------*/ async command bool PacketTimeStampOther.isValid(message_t* msg) { return call PacketTimeStampRadio.isValid(msg); } async command uint32_t PacketTimeStampOther.timestamp(message_t* msg) { return convertRadioToOther(call PacketTimeStampRadio.timestamp(msg)); } async command void PacketTimeStampOther.clear(message_t* msg) { call PacketTimeStampRadio.clear(msg); } async command void PacketTimeStampOther.set(message_t* msg, uint32_t value) { call PacketTimeStampRadio.set(msg, convertOtherToRadio(value)); } /*----------------- TimeSyncAMSendOther -----------------*/ command error_t TimeSyncAMSendOther.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len, uint32_t eventTime) { return call TimeSyncAMSendRadio.send[id](addr, msg, len, convertOtherToRadio(eventTime)); } event void TimeSyncAMSendRadio.sendDone[am_id_t id](message_t* msg, error_t error) { signal TimeSyncAMSendOther.sendDone[id](msg, error); } command error_t TimeSyncAMSendOther.cancel[am_id_t id](message_t* msg) { return call TimeSyncAMSendRadio.cancel[id](msg); } default event void TimeSyncAMSendOther.sendDone[am_id_t id](message_t* msg, error_t error) { } command uint8_t TimeSyncAMSendOther.maxPayloadLength[am_id_t id]() { return call TimeSyncAMSendRadio.maxPayloadLength[id](); } command void* TimeSyncAMSendOther.getPayload[am_id_t id](message_t* msg, uint8_t len) { return call TimeSyncAMSendRadio.getPayload[id](msg, len); } /*----------------- TimeSyncPacketOther -----------------*/ command bool TimeSyncPacketOther.isValid(message_t* msg) { return call TimeSyncPacketRadio.isValid(msg); } command uint32_t TimeSyncPacketOther.eventTime(message_t* msg) { return convertRadioToOther(call TimeSyncPacketRadio.eventTime(msg)); } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/TimeStampingLayer.h000066400000000000000000000034111207233610700240560ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __TIMESTAMPINGLAYER_H__ #define __TIMESTAMPINGLAYER_H__ typedef struct timestamp_metadata_t { uint32_t timestamp; } timestamp_metadata_t; #endif//__TIMESTAMPINGLAYER_H__ tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/TimeStampingLayerC.nc000066400000000000000000000045611207233610700243410ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "RadioConfig.h" generic configuration TimeStampingLayerC() { provides { interface PacketTimeStamp as PacketTimeStampMilli; interface PacketTimeStamp as PacketTimeStampRadio; interface RadioPacket; } uses { interface LocalTime as LocalTimeRadio; interface RadioPacket as SubPacket; interface PacketFlag as TimeStampFlag; } } implementation { components new TimeStampingLayerP(), LocalTimeMilliC; PacketTimeStampMilli = TimeStampingLayerP; PacketTimeStampRadio = TimeStampingLayerP; RadioPacket = TimeStampingLayerP.RadioPacket; SubPacket = TimeStampingLayerP.SubPacket; LocalTimeRadio = TimeStampingLayerP; TimeStampingLayerP.LocalTimeMilli -> LocalTimeMilliC; TimeStampFlag = TimeStampingLayerP.TimeStampFlag; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/TimeStampingLayerP.nc000066400000000000000000000104141207233610700243500ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include generic module TimeStampingLayerP() { provides { interface PacketTimeStamp as PacketTimeStampMilli; interface PacketTimeStamp as PacketTimeStampRadio; interface RadioPacket; } uses { interface PacketFlag as TimeStampFlag; interface LocalTime as LocalTimeRadio; interface LocalTime as LocalTimeMilli; interface RadioPacket as SubPacket; } } implementation { timestamp_metadata_t* getMeta(message_t* msg) { return ((void*)msg) + sizeof(message_t) - call RadioPacket.metadataLength(msg); } /*----------------- PacketTimeStampRadio -----------------*/ async command bool PacketTimeStampRadio.isValid(message_t* msg) { return call TimeStampFlag.get(msg); } async command uint32_t PacketTimeStampRadio.timestamp(message_t* msg) { return getMeta(msg)->timestamp; } async command void PacketTimeStampRadio.clear(message_t* msg) { call TimeStampFlag.clear(msg); } async command void PacketTimeStampRadio.set(message_t* msg, uint32_t value) { call TimeStampFlag.set(msg); getMeta(msg)->timestamp = value; } /*----------------- PacketTimeStampMilli -----------------*/ async command bool PacketTimeStampMilli.isValid(message_t* msg) { return call PacketTimeStampRadio.isValid(msg); } async command uint32_t PacketTimeStampMilli.timestamp(message_t* msg) { int32_t offset = call PacketTimeStampRadio.timestamp(msg) - call LocalTimeRadio.get(); return (offset >> RADIO_ALARM_MILLI_EXP) + call LocalTimeMilli.get(); } async command void PacketTimeStampMilli.clear(message_t* msg) { call PacketTimeStampRadio.clear(msg); } async command void PacketTimeStampMilli.set(message_t* msg, uint32_t value) { int32_t offset = (value - call LocalTimeMilli.get()) << RADIO_ALARM_MILLI_EXP; call PacketTimeStampRadio.set(msg, offset + call LocalTimeRadio.get()); } /*----------------- RadioPacket -----------------*/ async command uint8_t RadioPacket.headerLength(message_t* msg) { return call SubPacket.headerLength(msg); } async command uint8_t RadioPacket.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg); } async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length) { call SubPacket.setPayloadLength(msg, length); } async command uint8_t RadioPacket.maxPayloadLength() { return call SubPacket.maxPayloadLength(); } async command uint8_t RadioPacket.metadataLength(message_t* msg) { return call SubPacket.metadataLength(msg) + sizeof(timestamp_metadata_t); } async command void RadioPacket.clear(message_t* msg) { // all flags are automatically cleared call SubPacket.clear(msg); } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/TimeSyncMessageLayer.h000066400000000000000000000041151207233610700245170ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __TIMESYNCMESSAGELAYER_H__ #define __TIMESYNCMESSAGELAYER_H__ #include #ifndef AM_TIMESYNCMSG #define AM_TIMESYNCMSG 0x3D #endif // this is sent over the air typedef nx_int32_t timesync_relative_t; // this is stored in memory typedef nx_uint32_t timesync_absolute_t; typedef nx_struct timesync_footer_t { nx_am_id_t type; nx_union timestamp_t { timesync_relative_t relative; timesync_absolute_t absolute; } timestamp; } timesync_footer_t; #endif//__TIMESYNCMESSAGELAYER_H__ tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/TimeSyncMessageLayerC.nc000066400000000000000000000067541207233610700250060ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include #include #include generic configuration TimeSyncMessageLayerC() { provides { interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface AMPacket; interface Packet; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } uses { interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface LocalTime as LocalTimeRadio; interface PacketField as PacketTimeSyncOffset; } } implementation { components new TimeSyncMessageLayerP(), LocalTimeMilliC; AMPacket = TimeSyncMessageLayerP; Packet = TimeSyncMessageLayerP; Receive = TimeSyncMessageLayerP.Receive; Snoop = TimeSyncMessageLayerP.Snoop; TimeSyncAMSendRadio = TimeSyncMessageLayerP; TimeSyncPacketRadio = TimeSyncMessageLayerP; TimeSyncAMSendMilli = TimeSyncMessageLayerP; TimeSyncPacketMilli = TimeSyncMessageLayerP; // Ok, we use the AMSenderC infrastructure to avoid concurrent send clashes components new AMSenderC(AM_TIMESYNCMSG); TimeSyncMessageLayerP.SubAMSend -> AMSenderC; TimeSyncMessageLayerP.SubAMPacket -> AMSenderC; TimeSyncMessageLayerP.SubPacket -> AMSenderC; components ActiveMessageC; TimeSyncMessageLayerP.SubReceive -> ActiveMessageC.Receive[AM_TIMESYNCMSG]; TimeSyncMessageLayerP.SubSnoop -> ActiveMessageC.Snoop[AM_TIMESYNCMSG];; PacketTimeStampRadio = TimeSyncMessageLayerP; PacketTimeStampMilli = TimeSyncMessageLayerP; TimeSyncMessageLayerP.LocalTimeMilli -> LocalTimeMilliC; LocalTimeRadio = TimeSyncMessageLayerP; PacketTimeSyncOffset = TimeSyncMessageLayerP; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/TimeSyncMessageLayerP.nc000066400000000000000000000206041207233610700250110ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include generic module TimeSyncMessageLayerP() { provides { interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface AMPacket; interface Packet; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface TimeSyncPacket as TimeSyncPacketMilli; } uses { interface AMSend as SubAMSend; interface Receive as SubReceive; interface Receive as SubSnoop; interface AMPacket as SubAMPacket; interface Packet as SubPacket; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface LocalTime as LocalTimeRadio; interface LocalTime as LocalTimeMilli; interface PacketField as PacketTimeSyncOffset; } } implementation { inline timesync_footer_t* getFooter(message_t* msg) { // we use the payload length that we export (the smaller one) return (timesync_footer_t*)(msg->data + call Packet.payloadLength(msg)); } /*----------------- Packet -----------------*/ command void Packet.clear(message_t* msg) { call SubPacket.clear(msg); } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call SubPacket.setPayloadLength(msg, len + sizeof(timesync_footer_t)); } command uint8_t Packet.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg) - sizeof(timesync_footer_t); } command uint8_t Packet.maxPayloadLength() { return call SubPacket.maxPayloadLength() - sizeof(timesync_footer_t); } command void* Packet.getPayload(message_t* msg, uint8_t len) { return call SubPacket.getPayload(msg, len + sizeof(timesync_footer_t)); } /*----------------- AMPacket -----------------*/ inline command am_addr_t AMPacket.address() { return call SubAMPacket.address(); } inline command am_group_t AMPacket.localGroup() { return call SubAMPacket.localGroup(); } inline command bool AMPacket.isForMe(message_t* msg) { return call SubAMPacket.isForMe(msg) && call SubAMPacket.type(msg) == AM_TIMESYNCMSG; } inline command am_addr_t AMPacket.destination(message_t* msg) { return call SubAMPacket.destination(msg); } inline command void AMPacket.setDestination(message_t* msg, am_addr_t addr) { call SubAMPacket.setDestination(msg, addr); } inline command am_addr_t AMPacket.source(message_t* msg) { return call SubAMPacket.source(msg); } inline command void AMPacket.setSource(message_t* msg, am_addr_t addr) { call SubAMPacket.setSource(msg, addr); } inline command am_id_t AMPacket.type(message_t* msg) { return getFooter(msg)->type; } inline command void AMPacket.setType(message_t* msg, am_id_t type) { getFooter(msg)->type = type; } inline command am_group_t AMPacket.group(message_t* msg) { return call SubAMPacket.group(msg); } inline command void AMPacket.setGroup(message_t* msg, am_group_t grp) { call SubAMPacket.setGroup(msg, grp); } /*----------------- TimeSyncAMSendRadio -----------------*/ command error_t TimeSyncAMSendRadio.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len, uint32_t event_time) { timesync_footer_t* footer = (timesync_footer_t*)(msg->data + len); footer->type = id; footer->timestamp.absolute = event_time; call PacketTimeSyncOffset.set(msg, offsetof(message_t, data) + len + offsetof(timesync_footer_t, timestamp.absolute)); return call SubAMSend.send(addr, msg, len + sizeof(timesync_footer_t)); } command error_t TimeSyncAMSendRadio.cancel[am_id_t id](message_t* msg) { return call SubAMSend.cancel(msg); } default event void TimeSyncAMSendRadio.sendDone[am_id_t id](message_t* msg, error_t error) { } command uint8_t TimeSyncAMSendRadio.maxPayloadLength[am_id_t id]() { return call SubAMSend.maxPayloadLength() - sizeof(timesync_footer_t); } command void* TimeSyncAMSendRadio.getPayload[am_id_t id](message_t* msg, uint8_t len) { return call SubAMSend.getPayload(msg, len + sizeof(timesync_footer_t)); } /*----------------- TimeSyncAMSendMilli -----------------*/ command error_t TimeSyncAMSendMilli.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len, uint32_t event_time) { // compute elapsed time in millisecond event_time = ((int32_t)(event_time - call LocalTimeMilli.get()) << RADIO_ALARM_MILLI_EXP) + call LocalTimeRadio.get(); return call TimeSyncAMSendRadio.send[id](addr, msg, len, event_time); } command error_t TimeSyncAMSendMilli.cancel[am_id_t id](message_t* msg) { return call TimeSyncAMSendRadio.cancel[id](msg); } default event void TimeSyncAMSendMilli.sendDone[am_id_t id](message_t* msg, error_t error) { } command uint8_t TimeSyncAMSendMilli.maxPayloadLength[am_id_t id]() { return call TimeSyncAMSendRadio.maxPayloadLength[id](); } command void* TimeSyncAMSendMilli.getPayload[am_id_t id](message_t* msg, uint8_t len) { return call TimeSyncAMSendRadio.getPayload[id](msg, len); } /*----------------- SubSend.sendDone -------------------*/ event void SubAMSend.sendDone(message_t* msg, error_t error) { am_id_t id = call AMPacket.type(msg); signal TimeSyncAMSendRadio.sendDone[id](msg, error); signal TimeSyncAMSendMilli.sendDone[id](msg, error); } /*----------------- SubReceive and SubSnoop -------------------*/ event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { am_id_t id = call AMPacket.type(msg); return signal Receive.receive[id](msg, payload, len - sizeof(timesync_footer_t)); } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } event message_t* SubSnoop.receive(message_t* msg, void* payload, uint8_t len) { am_id_t id = call AMPacket.type(msg); return signal Snoop.receive[id](msg, payload, len - sizeof(timesync_footer_t)); } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } /*----------------- TimeSyncPacketRadio -----------------*/ command bool TimeSyncPacketRadio.isValid(message_t* msg) { return call PacketTimeStampRadio.isValid(msg) && getFooter(msg)->timestamp.relative != 0x80000000L; } command uint32_t TimeSyncPacketRadio.eventTime(message_t* msg) { return getFooter(msg)->timestamp.relative + call PacketTimeStampRadio.timestamp(msg); } /*----------------- TimeSyncPacketMilli -----------------*/ command bool TimeSyncPacketMilli.isValid(message_t* msg) { return call PacketTimeStampMilli.isValid(msg) && getFooter(msg)->timestamp.relative != 0x80000000L; } command uint32_t TimeSyncPacketMilli.eventTime(message_t* msg) { return ((int32_t)(getFooter(msg)->timestamp.relative) >> RADIO_ALARM_MILLI_EXP) + call PacketTimeStampMilli.timestamp(msg); } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/TinyosNetworkLayer.h000066400000000000000000000035321207233610700243200ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __TINYOSNETWORKLAYER_H__ #define __TINYOSNETWORKLAYER_H__ #ifndef TINYOS_6LOWPAN_NETWORK_ID #define TINYOS_6LOWPAN_NETWORK_ID 0x3f #endif typedef nx_struct network_header_t { nxle_uint8_t network; } network_header_t; #endif//__TINYOSNETWORKLAYER_H__ tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/TinyosNetworkLayerC.nc000066400000000000000000000136461207233610700246030ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include /* If TFRAMES_ENABLED is defined, then only TinyOS frames will be supported (with no network byte). If IEEE154FRAMES_ENABLED, then only IEEE 802.15.4 frames will be supported (the network byte is part of the payload). If neither is defined, then both TinyOS frames and IEEE 802.15.4 frames will be supported where TinyOS frames are the ones whose network byte is TINYOS_6LOWPAN_NETWORK_ID. */ #if defined(TFRAMES_ENABLED) && defined(IEEE154FRAMES_ENABLED) #error You cannot specify both TFRAMES_ENABLED and IEEE154FRAMES_ENABLED at the same time #endif generic module TinyosNetworkLayerC() { provides { #ifndef TFRAMES_ENABLED interface BareSend as Ieee154Send; interface BareReceive as Ieee154Receive; interface RadioPacket as Ieee154Packet; #endif #ifndef IEEE154FRAMES_ENABLED interface BareSend as TinyosSend; interface BareReceive as TinyosReceive; interface RadioPacket as TinyosPacket; #endif } uses { interface BareSend as SubSend; interface BareReceive as SubReceive; interface RadioPacket as SubPacket; } } implementation { /*----------------- Ieee154MessageC -----------------*/ #ifndef TFRAMES_ENABLED command error_t Ieee154Send.send(message_t* msg) { return call SubSend.send(msg); } command error_t Ieee154Send.cancel(message_t* msg) { return call SubSend.cancel(msg); } async command uint8_t Ieee154Packet.headerLength(message_t* msg) { return call SubPacket.headerLength(msg); } async command uint8_t Ieee154Packet.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg); } async command void Ieee154Packet.setPayloadLength(message_t* msg, uint8_t length) { call SubPacket.setPayloadLength(msg, length); } async command uint8_t Ieee154Packet.maxPayloadLength() { return call SubPacket.maxPayloadLength(); } async command uint8_t Ieee154Packet.metadataLength(message_t* msg) { return call SubPacket.metadataLength(msg); } async command void Ieee154Packet.clear(message_t* msg) { call SubPacket.clear(msg); } #endif /*----------------- ActiveMessageC -----------------*/ #ifndef IEEE154FRAMES_ENABLED network_header_t* getHeader(message_t* msg) { return ((void*)msg) + call SubPacket.headerLength(msg); } command error_t TinyosSend.send(message_t* msg) { #ifndef TFRAMES_ENABLED getHeader(msg)->network = TINYOS_6LOWPAN_NETWORK_ID; #endif return call SubSend.send(msg); } command error_t TinyosSend.cancel(message_t* msg) { return call SubSend.cancel(msg); } enum { #ifndef TFRAMES_ENABLED PAYLOAD_OFFSET = sizeof(network_header_t), #else PAYLOAD_OFFSET = 0, #endif }; async command uint8_t TinyosPacket.headerLength(message_t* msg) { return call SubPacket.headerLength(msg) + PAYLOAD_OFFSET; } async command uint8_t TinyosPacket.payloadLength(message_t* msg) { return call SubPacket.payloadLength(msg) - PAYLOAD_OFFSET; } async command void TinyosPacket.setPayloadLength(message_t* msg, uint8_t length) { call SubPacket.setPayloadLength(msg, length + PAYLOAD_OFFSET); } async command uint8_t TinyosPacket.maxPayloadLength() { return call SubPacket.maxPayloadLength() - PAYLOAD_OFFSET; } async command uint8_t TinyosPacket.metadataLength(message_t* msg) { return call SubPacket.metadataLength(msg); } async command void TinyosPacket.clear(message_t* msg) { call SubPacket.clear(msg); } #endif /*----------------- Events -----------------*/ #if defined(TFRAMES_ENABLED) event void SubSend.sendDone(message_t* msg, error_t result) { signal TinyosSend.sendDone(msg, result); } event message_t* SubReceive.receive(message_t* msg) { return signal TinyosReceive.receive(msg); } #elif defined(IEEE154FRAMES_ENABLED) event void SubSend.sendDone(message_t* msg, error_t result) { signal Ieee154Send.sendDone(msg, result); } event message_t* SubReceive.receive(message_t* msg) { return signal Ieee154Receive.receive(msg); } #else event void SubSend.sendDone(message_t* msg, error_t result) { if( getHeader(msg)->network == TINYOS_6LOWPAN_NETWORK_ID ) signal TinyosSend.sendDone(msg, result); else signal Ieee154Send.sendDone(msg, result); } event message_t* SubReceive.receive(message_t* msg) { if( getHeader(msg)->network == TINYOS_6LOWPAN_NETWORK_ID ) return signal TinyosReceive.receive(msg); else return signal Ieee154Receive.receive(msg); } #endif } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/TrafficMonitor.nc000066400000000000000000000056551207233610700235730ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface TrafficMonitor { /** * Returns the number of times the radio driver was started. */ async command uint32_t getStartCount(); /** * Returns the current time (same as LocalTime.get) */ async command uint32_t getCurrentTime(); /** * Returns the total number of milliseconds the radio driver * was operating (between start() and stopDone()). */ async command uint32_t getActiveTime(); /** * Returns the number of messages the radio driver has * transmitted (those for which send() returned with SUCCESS, * even though sendDone() might have returned with an error). */ async command uint32_t getTxMessages(); /** * Returns the number of messages the radio driver has * received. */ async command uint32_t getRxMessages(); /** * Returns the sum of the lengths of all transmitted * messages (those for which send() returned with SUCCESS, * even though sendDone() might have returned with an error). * This count includes all preamble, STD and CRC bytes. */ async command uint32_t getTxBytes(); /** * Returns the sum of the lengths of all received * messages. This count includes all preamble, STD * and CRC bytes. */ async command uint32_t getRxBytes(); /** * Returns the number of times send() or sendDone() * returned with an error. */ async command uint32_t getTxErrors(); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/TrafficMonitorConfig.nc000077500000000000000000000033441207233610700247150ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface TrafficMonitorConfig { /** * Returns the number of bytes in this message. */ async command uint16_t getBytes(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/TrafficMonitorLayerC.nc000066400000000000000000000050111207233610700246550ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration TrafficMonitorLayerC() { provides { interface RadioSend; interface RadioReceive; interface RadioState; interface TrafficMonitor; } uses { interface RadioSend as SubSend; interface RadioReceive as SubReceive; interface RadioState as SubState; interface TrafficMonitorConfig as Config; } } implementation { components new TrafficMonitorLayerP(), LocalTimeMilliC; RadioSend = TrafficMonitorLayerP; RadioReceive = TrafficMonitorLayerP; RadioState = TrafficMonitorLayerP; TrafficMonitor = TrafficMonitorLayerP; SubSend = TrafficMonitorLayerP; SubReceive = TrafficMonitorLayerP; SubState = TrafficMonitorLayerP; Config = TrafficMonitorLayerP; TrafficMonitorLayerP.LocalTime -> LocalTimeMilliC; #ifdef RADIO_DEBUG components DiagMsgC, new TimerMilliC(), MainC; TrafficMonitorLayerP.DiagMsg -> DiagMsgC; TrafficMonitorLayerP.Timer -> TimerMilliC; TrafficMonitorLayerP.Boot -> MainC; #endif } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/TrafficMonitorLayerP.nc000066400000000000000000000140061207233610700246760ustar00rootroot00000000000000/* * Copyright (c) 2007-2011, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "Tasklet.h" generic module TrafficMonitorLayerP() { provides { interface RadioSend; interface RadioReceive; interface RadioState; interface TrafficMonitor; } uses { interface TrafficMonitorConfig; interface RadioSend as SubSend; interface RadioReceive as SubReceive; interface RadioState as SubState; interface LocalTime; #ifdef RADIO_DEBUG interface Boot; interface Timer as Timer; interface DiagMsg; #endif } } implementation { // ------- Send tasklet_async event void SubSend.ready() { signal RadioSend.ready(); } uint32_t txMessages; uint32_t txBytes; uint32_t txErrors; tasklet_async command error_t RadioSend.send(message_t* msg) { error_t error; error = call SubSend.send(msg); if( error == SUCCESS ) { uint16_t bytes = call TrafficMonitorConfig.getBytes(msg); atomic { txMessages += 1; txBytes += bytes; } } else atomic txErrors += 1; return error; } tasklet_async event void SubSend.sendDone(error_t error) { if( error != SUCCESS ) atomic txErrors += 1; signal RadioSend.sendDone(error); } async command uint32_t TrafficMonitor.getTxMessages() { atomic return txMessages; } async command uint32_t TrafficMonitor.getTxBytes() { atomic return txBytes; } async command uint32_t TrafficMonitor.getTxErrors() { atomic return txErrors; } // ------- Receive uint32_t rxMessages; uint32_t rxBytes; tasklet_async event bool SubReceive.header(message_t* msg) { return signal RadioReceive.header(msg); } tasklet_async event message_t* SubReceive.receive(message_t* msg) { uint16_t bytes = call TrafficMonitorConfig.getBytes(msg); atomic { rxMessages += 1; rxBytes += bytes; } return signal RadioReceive.receive(msg); } async command uint32_t TrafficMonitor.getRxMessages() { atomic return rxMessages; } async command uint32_t TrafficMonitor.getRxBytes() { atomic return rxBytes; } // ------- Start/Stop enum { RADIO_OFF = 0, RADIO_ON = 1, RADIO_ON_2_OFF = 2, }; uint8_t radioState; uint32_t radioStart; uint32_t activeTime; uint32_t startCount; tasklet_async command error_t RadioState.turnOn() { uint32_t localTime = call LocalTime.get(); error_t error = call SubState.turnOn(); atomic { if( radioState == RADIO_OFF && error == SUCCESS ) { radioStart = localTime; radioState = RADIO_ON; startCount++; } } return error; } tasklet_async command error_t RadioState.turnOff() { error_t error = call SubState.turnOff(); atomic { if( radioState == RADIO_ON && error == SUCCESS ) radioState = RADIO_ON_2_OFF; } return error; } tasklet_async command error_t RadioState.standby() { error_t error = call SubState.standby(); atomic { if( radioState == RADIO_ON && error == SUCCESS ) radioState = RADIO_ON_2_OFF; } return error; } tasklet_async event void SubState.done() { uint32_t localTime = call LocalTime.get(); atomic { if( radioState == RADIO_ON_2_OFF ) { activeTime += localTime - radioStart; radioState = RADIO_OFF; } } signal RadioState.done(); } tasklet_async command error_t RadioState.setChannel(uint8_t channel) { return call SubState.setChannel(channel); } tasklet_async command uint8_t RadioState.getChannel() { return call SubState.getChannel(); } async command uint32_t TrafficMonitor.getStartCount() { atomic return startCount; } async command uint32_t TrafficMonitor.getActiveTime() { uint32_t atime, localTime; localTime = call LocalTime.get(); atomic { atime = activeTime; if( radioState != RADIO_OFF ) atime += localTime - radioStart; } return atime; } async command uint32_t TrafficMonitor.getCurrentTime() { return call LocalTime.get(); } // ------- Debug #ifdef RADIO_DEBUG event void Boot.booted() { // print out statistics every second call Timer.startPeriodic(1024); } event void Timer.fired() { if( call DiagMsg.record() ) { call DiagMsg.str("rfx"); call DiagMsg.uint16(call TrafficMonitor.getStartCount()); call DiagMsg.uint32(call TrafficMonitor.getActiveTime()); call DiagMsg.uint16(call TrafficMonitor.getTxMessages()); call DiagMsg.uint16(call TrafficMonitor.getRxMessages()); call DiagMsg.uint16(call TrafficMonitor.getTxBytes()); call DiagMsg.uint16(call TrafficMonitor.getRxBytes()); call DiagMsg.uint16(call TrafficMonitor.getTxErrors()); call DiagMsg.send(); } } #endif } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/UniqueConfig.nc000077500000000000000000000042321207233610700232320ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include interface UniqueConfig { /** * Returns the sequence number of the packet. */ async command uint8_t getSequenceNumber(message_t* msg); /** * Returns the sender of the packet. */ async command am_addr_t getSender(message_t* msg); /** * Sets the sequence number of the packet. */ async command void setSequenceNumber(message_t*msg, uint8_t number); /** * This command is called when the unqiue layer detects a missing (jump * in the data sequence number) or a duplicate packet. */ tasklet_async command void reportChannelError(); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/UniqueLayerC.nc000077500000000000000000000043641207233610700232120ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration UniqueLayerC() { provides { // NOTE, this is a combined layer, should be hooked up at two places interface BareSend as Send; interface RadioReceive; } uses { interface BareSend as SubSend; interface RadioReceive as SubReceive; interface UniqueConfig as Config; } } implementation { components new UniqueLayerP(), MainC, NeighborhoodC, new NeighborhoodFlagC(); MainC.SoftwareInit -> UniqueLayerP; UniqueLayerP.Neighborhood -> NeighborhoodC; UniqueLayerP.NeighborhoodFlag -> NeighborhoodFlagC; Send = UniqueLayerP; SubSend = UniqueLayerP; RadioReceive = UniqueLayerP; SubReceive = UniqueLayerP; Config = UniqueLayerP; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/layers/UniqueLayerP.nc000077500000000000000000000062311207233610700232220ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include generic module UniqueLayerP() { provides { interface BareSend as Send; interface RadioReceive; interface Init; } uses { interface BareSend as SubSend; interface RadioReceive as SubReceive; interface UniqueConfig; interface Neighborhood; interface NeighborhoodFlag; } } implementation { uint8_t sequenceNumber; command error_t Init.init() { sequenceNumber = TOS_NODE_ID << 4; return SUCCESS; } command error_t Send.send(message_t* msg) { call UniqueConfig.setSequenceNumber(msg, ++sequenceNumber); return call SubSend.send(msg); } command error_t Send.cancel(message_t* msg) { return call SubSend.cancel(msg); } event void SubSend.sendDone(message_t* msg, error_t error) { signal Send.sendDone(msg, error); } tasklet_async event bool SubReceive.header(message_t* msg) { // we could scan here, but better be lazy return signal RadioReceive.header(msg); } tasklet_norace uint8_t receivedNumbers[NEIGHBORHOOD_SIZE]; tasklet_async event message_t* SubReceive.receive(message_t* msg) { uint8_t idx = call Neighborhood.insertNode(call UniqueConfig.getSender(msg)); uint8_t dsn = call UniqueConfig.getSequenceNumber(msg); if( call NeighborhoodFlag.get(idx) ) { uint8_t diff = dsn - receivedNumbers[idx]; if( diff == 0 ) { call UniqueConfig.reportChannelError(); return msg; } } else call NeighborhoodFlag.set(idx); receivedNumbers[idx] = dsn; return signal RadioReceive.receive(msg); } tasklet_async event void Neighborhood.evicted(uint8_t idx) { } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/000077500000000000000000000000001207233610700177665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/BareReceive.nc000066400000000000000000000035311207233610700224660ustar00rootroot00000000000000/* * Copyright (c) 2009, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface BareReceive { /** * Signals the reception of a message, but only for those messages for * which SUCCESS was returned in the header event. The usual owner rules * apply to the message pointers. */ event message_t* receive(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/BareSend.nc000066400000000000000000000055561207233610700220060ustar00rootroot00000000000000/* * Copyright (c) 2009, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface BareSend { /** * Starts the transmission of the given message. This command must not * be called while another send is in progress (so one must wait for the * sendDone event). Returns EBUSY if a reception is in progress or for * some other reason the request cannot be temporarily satisfied (e.g. * the SPI bus access could not be acquired). In this case the send * command could be retried from a task. Returns SUCCESS if the * transmission could be started. In this case sendDone will be fired. */ command error_t send(message_t* msg); /** * Signals the completion of the send command, exactly once for each * successfull send command. If the returned error code is SUCCESS, then * the message was sent (may not have been acknowledged), otherwise * the message was not transmitted over the air. */ event void sendDone(message_t* msg, error_t error); /** * Cancel a requested transmission. Returns SUCCESS if the * transmission was cancelled properly (not sent in its * entirety). Note that the component may not know * if the send was successfully cancelled, if the radio is * handling much of the logic; in this case, a component * should be conservative and return an appropriate error code. */ command error_t cancel(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/Neighborhood.h000077500000000000000000000033441207233610700225550ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __NEIGHBORHOOD_H__ #define __NEIGHBORHOOD_H__ #ifndef NEIGHBORHOOD_SIZE #define NEIGHBORHOOD_SIZE 5 #endif #endif//__NEIGHBORHOOD_H__ tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/Neighborhood.nc000066400000000000000000000064771207233610700227350ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include /** * Every component maintains its own neighborhood data. The Neighboorhood * component maintains only the nodeids and ages of the neighbors, and * evicts old entries from the table when necessary. */ interface Neighborhood { /** * Returns the index of the neighbor in the table. If the node was not * found in the table, then the value NEIGHBORHOOD is returned, * otherwise an index in the range [0, NEIGHBORHOOD-1] is returned. */ tasklet_async command uint8_t getIndex(am_addr_t id); /** * Returns the age of the given entry. The age is incremented by one * every time a new node is inserted into the neighborhood table that * is not already at the very end. If the age would get too large to * fit into a byte, then it is periodically reset to a smaller value. */ tasklet_async command uint8_t getAge(uint8_t idx); /** * Returns the node address for the given entry. */ tasklet_async command am_addr_t getNode(uint8_t idx); /** * Adds a new node into the neighborhood table. If this node was already * in the table, then it is just brought to the front (its age is reset * to zero). If the node was not in the table, then the oldest is evicted * and its entry is replaced with this node. The index of the entry * is returned in the range [0, NEIGHBORHOOD-1]. */ tasklet_async command uint8_t insertNode(am_addr_t id); /** * This event is fired when the oldest entry is replaced with a new * node. The same interface is used by many users, so all of them * will receive this event and can clear the corresponding entry. * After this event is fired, all flags for this entry are cleared * (see the NeighborhoodFlag interface) */ tasklet_async event void evicted(uint8_t idx); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/NeighborhoodC.nc000077500000000000000000000034221207233610700230260ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ configuration NeighborhoodC { provides interface Neighborhood; } implementation { components NeighborhoodP, MainC; Neighborhood = NeighborhoodP; MainC.SoftwareInit -> NeighborhoodP; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/NeighborhoodFlag.nc000077500000000000000000000043641207233610700235230ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include /** * This interface provides one bit storage for each neighbor in a very * fast and conveint way (without using shifts for example). */ interface NeighborhoodFlag { /** * Returns the value of the flag for the given index */ tasklet_async command bool get(uint8_t idx); /** * Sets the flag for the given index */ tasklet_async command void set(uint8_t idx); /** * Clears the flag for the given index. The flag is automatically * cleared after the Neighborhood.evicted event is fired. */ tasklet_async command void clear(uint8_t idx); /** * Clears the flag for all indices */ tasklet_async command void clearAll(); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/NeighborhoodFlagC.nc000077500000000000000000000035511207233610700236230ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ generic configuration NeighborhoodFlagC() { provides interface NeighborhoodFlag; } implementation { components NeighborhoodP; // TODO: make sure that no more than 8 flags are used at a time NeighborhoodFlag = NeighborhoodP.NeighborhoodFlag[unique("NeighborhoodFlag")]; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/NeighborhoodP.nc000077500000000000000000000100351207233610700230410ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include module NeighborhoodP { provides { interface Init; interface Neighborhood; interface NeighborhoodFlag[uint8_t bit]; } } implementation { tasklet_norace am_addr_t nodes[NEIGHBORHOOD_SIZE]; tasklet_norace uint8_t ages[NEIGHBORHOOD_SIZE]; tasklet_norace uint8_t flags[NEIGHBORHOOD_SIZE]; tasklet_norace uint8_t time; tasklet_norace uint8_t last; command error_t Init.init() { uint8_t i; for(i = 0; i < NEIGHBORHOOD_SIZE; ++i) nodes[i] = AM_BROADCAST_ADDR; return SUCCESS; } inline tasklet_async command am_addr_t Neighborhood.getNode(uint8_t idx) { return nodes[idx]; } inline tasklet_async command uint8_t Neighborhood.getAge(uint8_t idx) { return time - ages[idx]; } tasklet_async uint8_t command Neighborhood.getIndex(am_addr_t node) { uint8_t i; if( nodes[last] == node ) return last; for(i = 0; i < NEIGHBORHOOD_SIZE; ++i) { if( nodes[i] == node ) { last = i; break; } } return i; } tasklet_async uint8_t command Neighborhood.insertNode(am_addr_t node) { uint8_t i; uint8_t maxAge; if( nodes[last] == node ) { if( ages[last] == time ) return last; ages[last] = ++time; maxAge = 0x80; } else { uint8_t oldest = 0; maxAge = 0; for(i = 0; i < NEIGHBORHOOD_SIZE; ++i) { uint8_t age; if( nodes[i] == node ) { last = i; if( ages[i] == time ) return i; ages[i] = ++time; maxAge = 0x80; break; } age = time - ages[i]; if( age > maxAge ) { maxAge = age; oldest = i; } } if( i == NEIGHBORHOOD_SIZE ) { signal Neighborhood.evicted(oldest); last = oldest; nodes[oldest] = node; ages[oldest] = ++time; flags[oldest] = 0; } } if( (time & 0x7F) == 0x7F && maxAge >= 0x7F ) { for(i = 0; i < NEIGHBORHOOD_SIZE; ++i) { if( (ages[i] | 0x7F) != time ) ages[i] = time & 0x80; } } return last; } inline tasklet_async command bool NeighborhoodFlag.get[uint8_t bit](uint8_t idx) { return flags[idx] & (1 << bit); } inline tasklet_async command void NeighborhoodFlag.set[uint8_t bit](uint8_t idx) { flags[idx] |= (1 << bit); } inline tasklet_async command void NeighborhoodFlag.clear[uint8_t bit](uint8_t idx) { flags[idx] &= ~(1 << bit); } tasklet_async command void NeighborhoodFlag.clearAll[uint8_t bit]() { uint8_t i; bit = ~(1 << bit); for(i = 0; i < NEIGHBORHOOD_SIZE; ++i) flags[i] &= bit; } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/PacketField.nc000066400000000000000000000042141207233610700224640ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface PacketField { /** * Returns TRUE if the value is set for this message. */ async command bool isSet(message_t* msg); /** * Returns the stored value of this field in the message. If the * value is not set, then the returned value is undefined. */ async command value_type get(message_t* msg); /** * Clears the isSet flag. */ async command void clear(message_t* msg); /** * Sets the isSet false to TRUE and the time stamp value to the * specified value. */ async command void set(message_t* msg, value_type value); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/PacketFlag.nc000066400000000000000000000040201207233610700223050ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface PacketFlag { /** * Returns if the flag is set for this message. */ async command bool get(message_t* msg); /** * Sets the flag in this message to the specified value. */ async command void setValue(message_t* msg, bool value); /** * Sets the flag in this message to TRUE */ async command void set(message_t* msg); /** * Sets the flag in this message to FALSE */ async command void clear(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/RadioAlarm.nc000077500000000000000000000046051207233610700223330ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include "RadioConfig.h" interface RadioAlarm { /** * Returns TRUE if the alarm is free and ready to be used. Once the alarm * is free, it cannot become nonfree in the same tasklet block. Note, * if the alarm is currently set (even if for ourselves) then it is not free. */ tasklet_async command bool isFree(); /** * Waits till the specified timeout period expires. The alarm must be free. */ tasklet_async command void wait(tradio_size timeout); /** * Cancels the running alarm. The alarm must be pending. */ tasklet_async command void cancel(); /** * This event is fired when the specified timeout period expires. */ tasklet_async event void fired(); /** * Returns the current time as measured by the radio stack. */ async command tradio_size getNow(); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/RadioAlarmC.nc000066400000000000000000000036551207233610700224370ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "RadioConfig.h" generic configuration RadioAlarmC() { provides { interface RadioAlarm[uint8_t id]; // use unique } uses { interface Alarm @exactlyonce(); } } implementation { components new RadioAlarmP(), TaskletC; RadioAlarm = RadioAlarmP; Alarm = RadioAlarmP; RadioAlarmP.Tasklet -> TaskletC; } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/RadioAlarmP.nc000066400000000000000000000055631207233610700224540ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include #include "RadioConfig.h" generic module RadioAlarmP() { provides { interface RadioAlarm[uint8_t id]; } uses { interface Alarm; interface Tasklet; } } implementation { norace uint8_t state; enum { STATE_READY = 0, STATE_WAIT = 1, STATE_FIRED = 2, }; tasklet_norace uint8_t alarm; async event void Alarm.fired() { atomic { if( state == STATE_WAIT ) state = STATE_FIRED; } call Tasklet.schedule(); } inline async command tradio_size RadioAlarm.getNow[uint8_t id]() { return call Alarm.getNow(); } tasklet_async event void Tasklet.run() { if( state == STATE_FIRED ) { state = STATE_READY; signal RadioAlarm.fired[alarm](); } } default tasklet_async event void RadioAlarm.fired[uint8_t id]() { } inline tasklet_async command bool RadioAlarm.isFree[uint8_t id]() { return state == STATE_READY; } tasklet_async command void RadioAlarm.wait[uint8_t id](tradio_size timeout) { RADIO_ASSERT( state == STATE_READY ); alarm = id; state = STATE_WAIT; call Alarm.start(timeout); } tasklet_async command void RadioAlarm.cancel[uint8_t id]() { RADIO_ASSERT( alarm == id ); RADIO_ASSERT( state != STATE_READY ); call Alarm.stop(); state = STATE_READY; } } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/RadioAssert.h000066400000000000000000000035511207233610700223630ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __RADIOASSERT_H__ #define __RADIOASSERT_H__ #ifdef RADIO_DEBUG void assert(bool condition, const char* file, uint16_t line); #define RADIO_ASSERT(COND) assert(COND, __FILE__, __LINE__) #else #define RADIO_ASSERT(COND) for(;0;) #endif #endif//__RADIOASSERT_H__ tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/RadioCCA.nc000077500000000000000000000043111207233610700216570ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include interface RadioCCA { /** * Starts the clear channel assesment procedure. Returns EBUSY if the radio * is currently servicing a clear channel assesment, and SUCCESS otherwise. * The check will be performed only in the RX_READY state. */ tasklet_async command error_t request(); /** * Signals the completion of the clear channel assesment send command. * SUCCESS means the channel is clear, EBUSY means the channel is not * clear, and FAIL means that the clear channel assesment could not * be finished or the operation was cancelled. */ tasklet_async event void done(error_t error); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/RadioChannel.nc000066400000000000000000000041641207233610700226440ustar00rootroot00000000000000/* * Copyright (c) 2009, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface RadioChannel { /** * Sets the current channel. Returns EBUSY if the stack is unable * to change the channel this time (some other operation is in progress), * EALREADY if the selected channel is already set, SUCCESS otherwise. */ command error_t setChannel(uint8_t channel); /** * This event is signaled exactly once for each sucessfully posted state * setChannel command when it is completed. */ event void setChannelDone(); /** * Returns the currently selected channel. */ command uint8_t getChannel(); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/RadioPacket.nc000066400000000000000000000051111207233610700224740ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ interface RadioPacket { /** * This command returns the length of the header. The header * starts at the first byte of the message_t structure * (some layers may add dummy bytes to allign the payload to * the msg->data section). */ async command uint8_t headerLength(message_t* msg); /** * Returns the length of the payload. The payload starts right * after the header. */ async command uint8_t payloadLength(message_t* msg); /** * Sets the length of the payload. */ async command void setPayloadLength(message_t* msg, uint8_t length); /** * Returns the maximum length that can be set for this message. */ async command uint8_t maxPayloadLength(); /** * Returns the length of the metadata section. The metadata section * is at the very end of the message_t structure and grows downwards. */ async command uint8_t metadataLength(message_t* msg); /** * Clears all metadata and sets all default values in the headers. */ async command void clear(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/RadioReceive.nc000077500000000000000000000044431207233610700226610ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include interface RadioReceive { /** * This event is fired when the header is received/downloaded and the * higher layers are consulted whether it needs to be downloaded and * further processed. Return FALSE if the message should be discarded. * In particular, the message buffer layer returns FALSE if there is * no space for a new message, so this message will not get acknowledged. */ tasklet_async event bool header(message_t* msg); /** * Signals the reception of a message, but only for those messages for * which SUCCESS was returned in the header event. The usual owner rules * apply to the message pointers. */ tasklet_async event message_t* receive(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/RadioSend.nc000077500000000000000000000054011207233610700221630ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include interface RadioSend { /** * Starts the transmission of the given message. This command must not * be called while another send is in progress (so one must wait for the * sendDone event). Returns EBUSY if a reception is in progress or for * some other reason the request cannot be temporarily satisfied (e.g. * the SPI bus access could not be acquired). In this case the send * command could be retried from a tasklet. Returns SUCCESS if the * transmission could be started. In this case sendDone will be fired. */ tasklet_async command error_t send(message_t* msg); /** * Signals the completion of the send command, exactly once for each * successfull send command. If the returned error code is SUCCESS, then * the message was sent (may not have been acknowledged), otherwise * the message was not transmitted over the air. */ tasklet_async event void sendDone(error_t error); /** * This event is fired when the component is most likely able to accept * a send request. If the send command has returned with a failure, then * this event will be called at least once in the near future. */ tasklet_async event void ready(); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/RadioState.nc000066400000000000000000000053171207233610700223550ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include interface RadioState { /** * Moves to radio into sleep state with the lowest power consumption but * highest wakeup time. The radio cannot send or receive in this state * and releases all access to shared resources (e.g. SPI bus). */ tasklet_async command error_t turnOff(); /** * The same as the turnOff command, except it is not as deep sleep, and * it is quicker to recover from this state. */ tasklet_async command error_t standby(); /** * Goes into receive state. The radio continuously receive messages * and able to transmit. */ tasklet_async command error_t turnOn(); /** * Sets the current channel. Returns EBUSY if the stack is unable * to change the channel this time (some other operation is in progress) * SUCCESS otherwise. */ tasklet_async command error_t setChannel(uint8_t channel); /** * This event is signaled exactly once for each sucessfully posted state * transition and setChannel command when it is completed. */ tasklet_async event void done(); /** * Returns the currently selected channel. */ tasklet_async command uint8_t getChannel(); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/Tasklet.h000066400000000000000000000034541207233610700215540ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __TASKLET_H__ #define __TASKLET_H__ #ifdef TASKLET_IS_TASK #define tasklet_async #define tasklet_norace #else #define tasklet_async async #define tasklet_norace norace #endif #endif//__TASKLET_H__ tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/Tasklet.nc000077500000000000000000000065341207233610700217320ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include /** * This interface is useful in building state machines when the state * transitions should be executed atomically but with interrupts enabled. * All state transitions should take place in the run event handler or * in blocks protected by the suspend and resume commands. */ interface Tasklet { /** * This method is executed atomically. */ tasklet_async event void run(); /** * Makes sure that the run event is called at least once more. If the * run event is currently not executing, then it is called immediately * and this command returns only after the completion of the run event. * If the run event is currently executed, then this method returns at * once, and makes sure that the run event is called once more when * it is finished. If this method is called from a task, then by the * above rules, the run event will be called from a task as well. */ async command void schedule(); /** * Enters a critical section of the code and meakes sure that the * run event is not called while in this section. No long running * computation should be called from the critical session, and * in particular no user event should be fired. This call is only * possible from task context, otherwise we cannot guarantee that * the run event is not currently running. The suspend calls * can be nested. It is very important that the same number of * resume commands must be called in all control paths, e.g. be very * careful with the return and break commands. */ command void suspend(); /** * Leaves the critical section. This call is conly possible from * task context. If there were scheduled executions of the run * event, then those will be called before this command returns. */ command void resume(); } tinyos-2.1.2+dfsg/tos/lib/rfxlink/util/TaskletC.nc000077500000000000000000000053221207233610700220270ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include module TaskletC { provides interface Tasklet; } implementation { #ifdef TASKLET_IS_TASK task void tasklet() { signal Tasklet.run(); } inline async command void Tasklet.schedule() { post tasklet(); } inline command void Tasklet.suspend() { } inline command void Tasklet.resume() { } #else /** * The lower 7 bits contain the number of suspends plus one if the run * event is currently beeing executed. The highest bit is set if the run * event needs to be called again when the suspend count goes down to zero. */ uint8_t state; void doit() { for(;;) { signal Tasklet.run(); atomic { if( state == 1 ) { state = 0; return; } RADIO_ASSERT( state == 0x81 ); state = 1; } } } inline command void Tasklet.suspend() { atomic ++state; } command void Tasklet.resume() { atomic { if( --state != 0x80 ) return; state = 1; } doit(); } async command void Tasklet.schedule() { atomic { if( state != 0 ) { state |= 0x80; return; } state = 1; } doit(); } #endif } tinyos-2.1.2+dfsg/tos/lib/safe/000077500000000000000000000000001207233610700162525ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/safe/SafeFailureHandlerC.nc000066400000000000000000000003671207233610700223710ustar00rootroot00000000000000 #include "Timer.h" configuration SafeFailureHandlerC { } implementation { components LedsC; components SafeFailureHandlerP; components BusyWaitMicroC as Wait; SafeFailureHandlerP.Leds -> LedsC; SafeFailureHandlerP.BusyWait -> Wait; } tinyos-2.1.2+dfsg/tos/lib/safe/SafeFailureHandlerP.nc000066400000000000000000000045621207233610700224070ustar00rootroot00000000000000 #include "Timer.h" module SafeFailureHandlerP { uses { interface Leds; interface BusyWait; } } implementation { #ifndef asmlinkage #define asmlinkage #endif #ifndef noreturn #define noreturn __attribute__((noreturn)) #endif void delay (int len) { volatile int x; for (x=0; x> i)); i -= 2; } while (i >= 0); } void display_int_flid (const unsigned int x) { roll (); display_int (x); roll (); } asmlinkage noreturn void deputy_fail_noreturn_fast (int flid) @C() @spontaneous() { atomic { #if defined(__AVR_ARCH__) asm volatile ("break"); #endif while(1) { display_int_flid(flid); } } } asmlinkage void deputy_fail_mayreturn(int flid) @C() @spontaneous() { deputy_fail_noreturn_fast(flid); } asmlinkage noreturn void deputy_fail_noreturn(int flid) @C() @spontaneous() { deputy_fail_noreturn_fast(flid); } } tinyos-2.1.2+dfsg/tos/lib/safe/include/000077500000000000000000000000001207233610700176755ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/safe/include/annots_stage1.h000066400000000000000000000017611207233610700226210ustar00rootroot00000000000000/* Keep TinyOS happy with pre 1.3.0 nesC's */ #ifndef ANNOTS_STAGE1_INCLUDED #define ANNOTS_STAGE1_INCLUDED // JDR temporary code: define away two obsolete annotations #define BOUND(x,y) #define SINGLE // JDR temporary code: define away NTS in unsafe mode #ifndef SAFE_TINYOS #ifndef NTS #define NTS #endif #endif #if NESC < 130 #define __DEPUTY_UNUSED__ __attribute__((unused)) #define NONNULL #define BND(x,y) #define BND_NOK(x,y) #define COUNT(x) #define COUNT_NOK(x) #define ONE #define ONE_NOK #define DMEMSET(x,y,z) #define DMEMCPY(x,y,z) #define TRUSTEDBLOCK #define NTS #define TCAST(__type,__expr) ((__type)(__expr)) #ifdef SAFE_TINYOS #warning Safe TinyOS requires nesC >= 1.3.0 #endif #ifdef NESC struct @safe { }; struct @unsafe { }; #endif #endif // NESC version check #endif tinyos-2.1.2+dfsg/tos/lib/safe/include/deputy/000077500000000000000000000000001207233610700212075ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/safe/include/deputy/checks.h000066400000000000000000000177131207233610700226310ustar00rootroot00000000000000// Runtime checks for Deputy programs. // This file is included in deputy_lib and also at the start of every // Deputy output file. Before this file is included you must define // DEPUTY_ALWAYS_STOP_ON_ERROR if you want to optimize the checks. // Note "volatile": We currently use volatile everywhere so that these // checks work on any kind of pointer. In the future, we may want to // investigate the performance impact of this annotation in the common // (non-volatile) case. // Use inline even when not optimizing for speed, since it prevents // warnings that would occur due to unused static functions. #ifdef DEPUTY_ALWAYS_STOP_ON_ERROR #define INLINE inline __attribute__((always_inline)) #else #define INLINE inline #endif #define __LOCATION__ 0 #define __LOCATION__FORMALS int flid #define __LOCATION__ACTUALS flid #ifndef asmlinkage #define asmlinkage #endif #ifndef noreturn #define noreturn __attribute__((noreturn)) #endif #if defined(__KERNEL__) && defined(DEPUTY_KERNEL_COVERAGE) INLINE static unsigned int read_pc() TRUSTED { unsigned int pc; asm("movl %%ebp, %0" : "=r"(pc)); return *((unsigned int *)pc + 1); } extern void checkBitArrayAdd(unsigned int addr); #endif extern asmlinkage void deputy_fail_mayreturn(__LOCATION__FORMALS); extern asmlinkage noreturn void deputy_fail_noreturn(__LOCATION__FORMALS); extern asmlinkage noreturn void deputy_fail_noreturn_fast(__LOCATION__FORMALS); /* Search for a NULL starting at e and return its index */ extern asmlinkage int deputy_findnull(const void *e1, unsigned int sz); #define __deputy_memset memset #if defined(DEPUTY_FAST_CHECKS) #define deputy_fail deputy_fail_noreturn_fast #elif defined(DEPUTY_ALWAYS_STOP_ON_ERROR) #define deputy_fail deputy_fail_noreturn #else #define deputy_fail deputy_fail_mayreturn #endif /* Check that there is no NULL between e .. e+len-1. "bytes" is the size of * an element */ INLINE static asmlinkage int deputy_nullcheck(const volatile void *e, unsigned int len, unsigned int bytes) { #define NULLCHECK(type) \ do { \ type *p1 = (type*) e; \ type *p2 = ((type*) e) + len; \ while (p1 < p2 && *p1 != 0) { \ p1++; \ } \ success = (p1 >= p2); \ } while (0) int success = 0; switch (bytes) { case 1: NULLCHECK(char); break; case 2: NULLCHECK(short); break; case 4: NULLCHECK(long); break; default: deputy_fail(__LOCATION__); } return success; #undef NULLCHECK } #if defined(__KERNEL__) && defined(KRECOVER) && !defined(NO_INJECTION) extern int kr_failure_injected(void); #define INJECTED_FAILURE() (kr_failure_injected()) #else #define INJECTED_FAILURE() 0 #endif // what : a boolean that ought to be true // checkName: the name of the check // checkWhat: a string that explains what goes wrong #if defined(__KERNEL__) && defined(DEPUTY_KERNEL_COVERAGE) #define DEPUTY_ASSERT_TEXT(what,text,checkName)\ checkBitArrayAdd(read_pc());\ if (!(what) || INJECTED_FAILURE()) { \ deputy_fail(__LOCATION__ACTUALS); \ } #define DEPUTY_ASSERT(what, checkName) \ checkBitArrayAdd(read_pc());\ DEPUTY_ASSERT_TEXT(what, text, checkName) #else #define DEPUTY_ASSERT_TEXT(what, text, checkName) \ if (!(what) || INJECTED_FAILURE()) { \ deputy_fail(__LOCATION__ACTUALS); \ } #define DEPUTY_ASSERT(what, checkName) \ DEPUTY_ASSERT_TEXT(what, text, checkName) #endif INLINE static void CNonNull(const volatile void* p, __LOCATION__FORMALS) { DEPUTY_ASSERT(p != 0, "non-null check"); } INLINE static void CEq(const volatile void* e1, const volatile void* e2, __LOCATION__FORMALS) { DEPUTY_ASSERT(e1 == e2, why); } INLINE static void CMult(int i1, int i2, __LOCATION__FORMALS) { DEPUTY_ASSERT((i2 % i1) == 0, "alignment check"); } /* Check that p + sz * e does not overflow that remains within [lo..hi). It * is guaranteed on input that lo <= p <= hi, with p and h aligned w.r.t. lo * and size sz. */ INLINE static void CPtrArith(const volatile void* lo, const volatile void* hi, const volatile void* p, int e, unsigned int sz, __LOCATION__FORMALS) { if (e >= 0) { DEPUTY_ASSERT_TEXT(e <= (hi - p) / sz, texthi, "upper bound check"); } else { DEPUTY_ASSERT_TEXT(-e <= (p - lo) / sz, textlo, "lower bound check"); } } INLINE static void CPtrArithNT(const volatile void* lo, const volatile void* hi, const volatile void* p, int e, unsigned int sz, __LOCATION__FORMALS) { if (e >= 0) { unsigned int len = (hi - p) / sz; if (e > len) { DEPUTY_ASSERT_TEXT(deputy_nullcheck(hi, e - len, sz), texthi, "nullterm upper bound check"); } } else { DEPUTY_ASSERT_TEXT(-e <= (p - lo) / sz, textlo, "lower bound check"); } } INLINE static void CPtrArithAccess(const volatile void* lo, const volatile void* hi, const volatile void* p, int e, unsigned int sz, __LOCATION__FORMALS) { if (e >= 0) { DEPUTY_ASSERT_TEXT(e + 1 <= (hi - p) / sz, texthi, "upper bound check"); } else { DEPUTY_ASSERT_TEXT(-e <= (p - lo) / sz, textlo, "lower bound check"); } } INLINE static void CLeqInt(unsigned int e1, unsigned int e2, __LOCATION__FORMALS) { DEPUTY_ASSERT(e1 <= e2, why); } INLINE static void CLeq(const volatile void* e1, const volatile void* e2, __LOCATION__FORMALS) { DEPUTY_ASSERT(e1 <= e2, why); } /* Used to set the upped bounds of an NT string to e1, when we know that e2 * is a safe upper bound. Test that e1 <= e2 OR there is no NULL between * e2...e1-1. */ INLINE static void CLeqNT(const volatile void* e1, const volatile void* e2, unsigned int sz, __LOCATION__FORMALS) { if (e1 > e2) { DEPUTY_ASSERT(deputy_nullcheck(e2, (e1 - e2) / sz, sz), why); } } INLINE static void CNullOrLeq(const volatile void* e, const volatile void* e1, const volatile void* e2, __LOCATION__FORMALS) { if (e) { DEPUTY_ASSERT(e1 <= e2, why); } } /* Check that e is NULL, or e1 <= e2, or there is no NULL from e2 to e1 */ INLINE static void CNullOrLeqNT(const volatile void* e, const volatile void* e1, const volatile void* e2, unsigned int sz, __LOCATION__FORMALS) { if (e && e1 > e2) { DEPUTY_ASSERT(deputy_nullcheck(e2, (e1 - e2) / sz, sz), why); } } INLINE static void CWriteNT(const volatile void* p, const volatile void* hi, int what, unsigned int sz, __LOCATION__FORMALS) { if (p == hi) { int isNull = 0; switch (sz) { case 1: isNull = (*((const volatile char *) p) == 0); break; case 2: isNull = (*((const volatile short *) p) == 0); break; case 4: isNull = (*((const volatile int *) p) == 0); break; } DEPUTY_ASSERT(!isNull || what == 0, "nullterm write check"); } } INLINE static void CNullUnionOrSelected(const volatile void* p, unsigned int size, int sameFieldSelected, __LOCATION__FORMALS) { if (!sameFieldSelected) { const volatile char* pp = (const volatile char*)p; const volatile char* pend = pp + size; while (pp < pend) { DEPUTY_ASSERT(0 == *pp++, "null union check"); } } } INLINE static void CSelected(int what, __LOCATION__FORMALS) { if (!(what)) { deputy_fail(__LOCATION__ACTUALS); } } INLINE static void CNotSelected(int what, __LOCATION__FORMALS) { if ((what)) { deputy_fail(__LOCATION__ACTUALS); } } #define deputy_max(x, y) ((x) > (y) ? (x) : (y)) #undef DEPUTY_ASSERT tinyos-2.1.2+dfsg/tos/lib/serial/000077500000000000000000000000001207233610700166135ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/serial/HdlcTranslateC.nc000066400000000000000000000100451207233610700217700ustar00rootroot00000000000000//$Id: HdlcTranslateC.nc,v 1.6 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * Copyright (c) 2010 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This is an implementation of HDLC serial encoding, supporting framing * through frame delimiter bytes and escape bytes. * * @author Philip Levis * @author Ben Greenstein * @date September 30 2010 * */ #include "Serial.h" module HdlcTranslateC { provides interface SerialFrameComm; uses { interface UartStream; interface Leds; } } implementation { typedef struct { uint8_t sendEscape:1; uint8_t receiveEscape:1; } HdlcState; //norace uint8_t debugCnt = 0; HdlcState state = {0,0}; uint8_t txTemp; uint8_t m_data; // TODO: add reset for when SerialM goes no-sync. async command void SerialFrameComm.resetReceive(){ state.receiveEscape = 0; } async command void SerialFrameComm.resetSend(){ state.sendEscape = 0; } async event void UartStream.receivedByte(uint8_t data) { //debugCnt++; // 7E 41 0E 05 04 03 02 01 00 01 8F 7E /* if (debugCnt == 1 && data == 0x7E) call Leds.led0On(); */ /* if (debugCnt == 2 && data == 0x41) call Leds.led1On(); */ /* if (debugCnt == 3 && data == 0x0E) call Leds.led2On(); */ if (data == HDLC_FLAG_BYTE) { //call Leds.led1On(); signal SerialFrameComm.delimiterReceived(); return; } else if (data == HDLC_CTLESC_BYTE) { //call Leds.led1On(); state.receiveEscape = 1; return; } else if (state.receiveEscape) { //call Leds.led1On(); state.receiveEscape = 0; data = data ^ 0x20; } signal SerialFrameComm.dataReceived(data); } async command error_t SerialFrameComm.putDelimiter() { atomic { state.sendEscape = 0; m_data = HDLC_FLAG_BYTE; } return call UartStream.send(&m_data, 1); } async command error_t SerialFrameComm.putData(uint8_t data) { if (data == HDLC_CTLESC_BYTE || data == HDLC_FLAG_BYTE) { state.sendEscape = 1; txTemp = data ^ 0x20; m_data = HDLC_CTLESC_BYTE; } else { m_data = data; } return call UartStream.send(&m_data, 1); } async event void UartStream.sendDone( uint8_t* buf, uint16_t len, error_t error ) { atomic { if (state.sendEscape) { state.sendEscape = 0; m_data = txTemp; call UartStream.send(&m_data, 1); } else { signal SerialFrameComm.putDone(); } } } async event void UartStream.receiveDone( uint8_t* buf, uint16_t len, error_t error ) {} } tinyos-2.1.2+dfsg/tos/lib/serial/README.txt000066400000000000000000000065211207233610700203150ustar00rootroot00000000000000The purpose of this UART stack is to allow arbitary packet formats to be encapsulated within a UART frame. The basic problem is that TinyOS needs to support two mote classes. The first are mote end points, which receive and process packets, possibly moving data between link layers. The second are mote bridges, which transparently forward data packets between media. The first class is simple: the UART can support its own active messages implementation, which is platform independent. An application that wants to send data to a mote generates a AM formatted for the UART and sends it to the mote over the serial connection. The UART implementation then provides standard 2.x accessors for the AM fields, such as destination. In this case, the UART is another packet format written into message_t. The second class is more difficult. The goal for this class is that you can communicate with a TinyOS network through data link layer packets, rather than at AM layer packets. So, for example, you can snoop on all of the 802.15.4 packets being sent and see all of the 802.15.4 specific headers. Or, you can send an 802.15.4 packet to a mote over a serial port and it will just forward it over the radio. This functionality allows a PC to directly interact with the network, which has been shown to be an important requirement, especially when monitoring or testing deployed networks. The problem is more difficult due to how message_t works. As all data link layers are justified on the data payload of the C structure, data link headers can start at offsets within the structure (as packets must be contiguous in memory). Therefore, to be able to read in an 802.15.4 packet over the serial port, the UART subsystem needs to know *where* in message_t the packet begins. Assuming what comes in over the serial port is correctly formatted, then if it knows the offset, the UART stack can just spool the bytes directly into the message_t at that offset. The send direction has a similar issue: the UART layer has to know where in the message_t the actual packet begins, and how long the entire packet is. Given that it might need to receive a wide range of packet formats encapsulated in a UART frame, the UART frame needs an identifier to dispatch on what type of data is within the frame. The basic case -- a platform independent AM packet -- is just one of these identifiers. This means that the UART provides a parameterized send and receive interface, where the parameter is the type of data encapsulated in the frame. The receive and send interfaces need to be able to map one of these identifiers to a message_t offset as well as calculate the packet length in terms of a data link layer (e.g., if the length only pertains to the data payload of the encapsulated packet, then the UART system needs to subtract the header and footer length from the frame length). The solution is that every encapsulated packet type has a component that implements the SerialPacketInfo interface, which provides three commands. offset(), which returns the offset at which a packet begins in the message_t dataLinkLen(), which returns the length of a data link packet given a data payload length upperLen(), which returns the length of a payload given a packet length The offset of a given data link packet in a message_t is known at compile time: there is no need to store it in RAM. Therefore, whe tinyos-2.1.2+dfsg/tos/lib/serial/ReceiveBytePacket.nc000066400000000000000000000071631207233610700225020ustar00rootroot00000000000000//$Id: ReceiveBytePacket.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This is the data interface that a serial protocol provides and * a serial dispatcher uses. The dispatcher expects the following pattern * of calls: ((startPacket)+ (byteReceived)* (endPacket)+)* * It should ignore any signals that do not follow this pattern. * The interface is used to separate the state machine of the wire protocol * from the complexities of dispatch. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 * */ interface ReceiveBytePacket { /** * Signals the upper layer to indicate that reception of a frame has begun. * Used by the upper layer to prepare for packet reception. If the upper * layer does not want to receive a packet (or isn't ready) it may * return a non-SUCCESS code such as EBUSY to the lower layer to discard * the frame. The underlying layer may signal endPacket in response to * such a discard request. * @return Returns an error_t code indicating whether the * dispatcher would like to receive a packet (SUCCESS), or not * perhaps because it isn't ready (EBUSY). */ async event error_t startPacket(); /** * Signals the upper layer that a byte of the encapsulated packet has been * received. Passes this byte as a parameter to the function. * @param data A byte of the encapsulated packet that has been received. */ async event void byteReceived(uint8_t data); /** * Signalled to indicate that a packet encapsulated withing a serial * frame has been received. SUCCESS should be passed by the lower layer * following verification that the packet has been received correctly. * A value of error_t indicating an error should be passed when the lower * layer's verification test fails or when the lower layer loses sync. * @param result An error_t code indicating whether the framer has * passed all bytes of an encapsulated packet it receives from * serial to the dispatcher (SUCCESS) or not (FAIL). */ async event void endPacket(error_t result); } tinyos-2.1.2+dfsg/tos/lib/serial/SendBytePacket.nc000066400000000000000000000077251207233610700220150ustar00rootroot00000000000000//$Id: SendBytePacket.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This is an interface that a serial framing protocol provides and a serial * dispatcher uses. The call sequence should be as follows: * The dispatcher should call startSend, specifying the first byte to * send. The framing protocol can then signal as many nextBytes as it * wants/needs, to spool in the bytes. It continues to do so until it receives * a sendComplete call, which will almost certainly happen within a nextByte * signal (i.e., re-entrant to the framing protocol). * This allows the framing protocol to buffer as many bytes as it needs to to meet * timing requirements, jitter, etc. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 * */ interface SendBytePacket { /** * The dispatcher may initiate a serial transmission by calling this function * and passing the first byte to be transmitted. * @param first_byte The first byte to be transmitted. * @return Returns an error_t code indicating either that the framer * has the resources available to transmit the frame (SUCCESS) or * not (EBUSY). */ async command error_t startSend(uint8_t first_byte); /** * The dispatcher must indicate when the end-of-packet has been reached and does * so by calling completeSend. The function may be called from within the * implementation of a nextByte event. * @return Returns an error_t code indicating whether the framer accepts * this notification (SUCCESS) or not (FAIL). */ async command error_t completeSend(); /** * Used by the framer to request the next byte to transmit. The * framer may allocate a buffer to pre-spool some or all of a * packet; or it may request and transmit a byte at a time. If there * are no more bytes to send, the dispatcher must call completeSend * before returning from this function. * @return The dispatcher must return the next byte to transmit */ async event uint8_t nextByte(); /** * The framer signals sendCompleted to indicate that it is done transmitting a * packet on the dispatcher's behalf. A non-SUCCESS error_t code indicates that * there was a problem in transmission. * @param error The framer indicates whether it has successfully * accepted the entirety of the packet from the dispatcher (SUCCESS) * or not (FAIL). */ async event void sendCompleted(error_t error); } tinyos-2.1.2+dfsg/tos/lib/serial/Serial.h000066400000000000000000000114651207233610700202120ustar00rootroot00000000000000//$Id: Serial.h,v 1.8 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Phil Buonadonna * */ /** * @author Phil Buonadonna * @author Lewis Girod * @author Ben Greenstein * @author Philip Levis * @date August 7 2005 */ #ifndef SERIAL_H #define SERIAL_H #include "AM.h" typedef uint8_t uart_id_t; #define UQ_SERIALQUEUE_SEND "SerialQueueP.Send" enum { HDLC_FLAG_BYTE = 0x7e, HDLC_CTLESC_BYTE = 0x7d, }; // message_t type dispatch enum { TOS_SERIAL_ACTIVE_MESSAGE_ID = 0, TOS_SERIAL_CC1000_ID = 1, TOS_SERIAL_802_15_4_ID = 2, TOS_SERIAL_UNKNOWN_ID = 255, }; // Framer-level dispatch enum { SERIAL_PROTO_ACK = 67, SERIAL_PROTO_PACKET_ACK = 68, SERIAL_PROTO_PACKET_NOACK = 69, SERIAL_PROTO_PACKET_UNKNOWN = 255 }; typedef struct radio_stats { uint8_t version; uint8_t flags; uint8_t reserved; uint8_t platform; uint16_t MTU; uint16_t radio_crc_fail; uint16_t radio_queue_drops; uint16_t serial_crc_fail; uint16_t serial_tx_fail; uint16_t serial_short_packets; uint16_t serial_proto_drops; } radio_stats_t; typedef nx_struct serial_header { nx_am_addr_t dest; nx_am_addr_t src; nx_uint8_t length; nx_am_group_t group; nx_am_id_t type; } serial_header_t; typedef nx_struct serial_packet { serial_header_t header; nx_uint8_t data[]; } serial_packet_t; typedef nx_struct serial_metadata { nx_uint8_t ack; } serial_metadata_t; #endif tinyos-2.1.2+dfsg/tos/lib/serial/Serial802_15_4C.nc000066400000000000000000000046031207233610700214440ustar00rootroot00000000000000//$Id: Serial802_15_4C.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of communication 802.15.4 message_t packets over the * serial port. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 * */ #include "Serial.h" configuration Serial802_15_4C { provides { interface SplitControl; interface Send; interface Receive; } uses interface Leds; } implementation { components MainC, SerialPacketInfo802_15_4P, SerialDispatcherC; MainC.SoftwareInit -> SerialDispatcherC; SplitControl = SerialDispatcherC; Leds = SerialDispatcherC; Send = SerialDispatcherC.Send[TOS_SERIAL_802_15_4_ID]; Receive = SerialDispatcherC.Receive[TOS_SERIAL_802_15_4_ID]; SerialDispatcherC.SerialPacketInfo[TOS_SERIAL_802_15_4_ID] -> SerialPacketInfo802_15_4P.Info; } tinyos-2.1.2+dfsg/tos/lib/serial/SerialAMQueueP.nc000066400000000000000000000042071207233610700217220ustar00rootroot00000000000000// $Id: SerialAMQueueP.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The fair-share AM send queue. * * @author Philip Levis * @date Jan 16 2006 */ #include "AM.h" #include "Serial.h" configuration SerialAMQueueP { provides interface Send[uint8_t client]; } implementation { enum { NUM_CLIENTS = uniqueCount(UQ_SERIALQUEUE_SEND) }; components new AMQueueImplP(NUM_CLIENTS), SerialActiveMessageC; Send = AMQueueImplP; AMQueueImplP.AMSend -> SerialActiveMessageC; AMQueueImplP.AMPacket -> SerialActiveMessageC; AMQueueImplP.Packet -> SerialActiveMessageC; } tinyos-2.1.2+dfsg/tos/lib/serial/SerialAMReceiverC.nc000066400000000000000000000040421207233610700223620ustar00rootroot00000000000000// $Id: SerialAMReceiverC.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The virtualized AM reception abstraction. * * @author Philip Levis * @date Jan 16 2006 * @see TEP 116: Packet Protocols */ #include "AM.h" generic configuration SerialAMReceiverC(am_id_t amId) { provides { interface Receive; interface Packet; interface AMPacket; } } implementation { components SerialActiveMessageC as AM; Receive = AM.Receive[amId]; Packet = AM; AMPacket = AM; } tinyos-2.1.2+dfsg/tos/lib/serial/SerialAMSenderC.nc000066400000000000000000000050471207233610700220440ustar00rootroot00000000000000// $Id: SerialAMSenderC.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The virtualized active message send abstraction. Each instantiation * of AMSenderC has its own queue of depth one. Therefore, it does not * have to contend with other AMSenderC instantiations for queue space. * The underlying implementation schedules the packets in these queues * using some form of fair-share queueing. * * @author Philip Levis * @date Jan 16 2006 * @see TEP 116: Packet Protocols */ #include "Serial.h" generic configuration SerialAMSenderC(am_id_t AMId) { provides { interface AMSend; interface Packet; interface AMPacket; interface PacketAcknowledgements as Acks; } } implementation { components new AMQueueEntryP(AMId) as AMQueueEntryP; components SerialAMQueueP, SerialActiveMessageC as AM; AMQueueEntryP.Send -> SerialAMQueueP.Send[unique(UQ_SERIALQUEUE_SEND)]; AMQueueEntryP.AMPacket -> AM; AMSend = AMQueueEntryP; Packet = AM; AMPacket = AM; Acks = AM; } tinyos-2.1.2+dfsg/tos/lib/serial/SerialActiveMessageC.nc000066400000000000000000000051741207233610700231270ustar00rootroot00000000000000//$Id: SerialActiveMessageC.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Sending active messages over the serial port. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 * */ #include "Serial.h" configuration SerialActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; } uses interface Leds; } implementation { components new SerialActiveMessageP() as AM, SerialDispatcherC; components SerialPacketInfoActiveMessageP as Info, MainC; MainC.SoftwareInit -> SerialDispatcherC; Leds = SerialDispatcherC; SplitControl = SerialDispatcherC; AMSend = AM; Receive = AM; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; AM.SubSend -> SerialDispatcherC.Send[TOS_SERIAL_ACTIVE_MESSAGE_ID]; AM.SubReceive -> SerialDispatcherC.Receive[TOS_SERIAL_ACTIVE_MESSAGE_ID]; SerialDispatcherC.SerialPacketInfo[TOS_SERIAL_ACTIVE_MESSAGE_ID] -> Info; } tinyos-2.1.2+dfsg/tos/lib/serial/SerialActiveMessageP.nc000066400000000000000000000137761207233610700231530ustar00rootroot00000000000000//$Id: SerialActiveMessageP.nc,v 1.11 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Sending active messages over the serial port. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 * */ #include generic module SerialActiveMessageP () { provides { interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface AMPacket; interface Packet; interface PacketAcknowledgements; } uses { interface Send as SubSend; interface Receive as SubReceive; } } implementation { serial_header_t* ONE getHeader(message_t* ONE msg) { return TCAST(serial_header_t* ONE, (uint8_t*)msg + offsetof(message_t, data) - sizeof(serial_header_t)); } serial_metadata_t* getMetadata(message_t* msg) { return (serial_metadata_t*)(msg->metadata); } command error_t AMSend.send[am_id_t id](am_addr_t dest, message_t* msg, uint8_t len) { serial_header_t* header = getHeader(msg); if (len > call Packet.maxPayloadLength()) { return ESIZE; } header->dest = dest; // Do not set the source address or group, as doing so // prevents transparent bridging. Need a better long-term // solution for this. //header->src = call AMPacket.address(); //header->group = TOS_AM_GROUP; header->type = id; header->length = len; return call SubSend.send(msg, len); } command error_t AMSend.cancel[am_id_t id](message_t* msg) { return call SubSend.cancel(msg); } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } event void SubSend.sendDone(message_t* msg, error_t result) { signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t result) { return; } default event message_t* Receive.receive[uint8_t id](message_t* msg, void* payload, uint8_t len) { return msg; } event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { return signal Receive.receive[call AMPacket.type(msg)](msg, msg->data, len); } command void Packet.clear(message_t* msg) { memset(getHeader(msg), 0, sizeof(serial_header_t)); return; } command uint8_t Packet.payloadLength(message_t* msg) { serial_header_t* header = getHeader(msg); return header->length; } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { getHeader(msg)->length = len; } command uint8_t Packet.maxPayloadLength() { return TOSH_DATA_LENGTH; } command void* Packet.getPayload(message_t* msg, uint8_t len) { if (len > call Packet.maxPayloadLength()) { return NULL; } else { return (void * COUNT_NOK(len))msg->data; } } command am_addr_t AMPacket.address() { return 0; } command am_addr_t AMPacket.destination(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->dest; } command am_addr_t AMPacket.source(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->src; } command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { serial_header_t* header = getHeader(amsg); header->dest = addr; } command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { serial_header_t* header = getHeader(amsg); header->src = addr; } command bool AMPacket.isForMe(message_t* amsg) { return TRUE; } command am_id_t AMPacket.type(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->type; } command void AMPacket.setType(message_t* amsg, am_id_t type) { serial_header_t* header = getHeader(amsg); header->type = type; } async command error_t PacketAcknowledgements.requestAck( message_t* msg ) { return FAIL; } async command error_t PacketAcknowledgements.noAck( message_t* msg ) { return SUCCESS; } command void AMPacket.setGroup(message_t* msg, am_group_t group) { serial_header_t* header = getHeader(msg); header->group = group; } command am_group_t AMPacket.group(message_t* msg) { serial_header_t* header = getHeader(msg); return header->group; } command am_group_t AMPacket.localGroup() { return TOS_AM_GROUP; } async command bool PacketAcknowledgements.wasAcked(message_t* msg) { return FALSE; } } tinyos-2.1.2+dfsg/tos/lib/serial/SerialByteComm.nc000066400000000000000000000046071207233610700220230ustar00rootroot00000000000000//$Id: SerialByteComm.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A basic byte-level interface to a serial port. * * @author David Gay * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 * */ interface SerialByteComm { /** * Put a single byte to the serial port. * @param data The byte to send to the serial port. * @return Returns an error_t code indicating whether this byte was * successfully put (SUCCESS) or not (FAIL). */ async command error_t put(uint8_t data); /** * Receive a single byte from the serial port. * @param data The byte that has been received from the serial port. */ async event void get(uint8_t data); /** * Split phase event to indicate that the last put request * has completed. */ async event void putDone(); } tinyos-2.1.2+dfsg/tos/lib/serial/SerialDispatcherC.nc000066400000000000000000000055131207233610700224720ustar00rootroot00000000000000//$Id: SerialDispatcherC.nc,v 1.6 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This component provides functionality to send many different kinds * of serial packets on top of a general packet sending component. It * achieves this by knowing where the different packets in a message_t * exist through the SerialPacketInfo interface. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 * */ configuration SerialDispatcherC { provides { interface Init; interface SplitControl; interface Receive[uart_id_t]; interface Send[uart_id_t]; } uses { interface SerialPacketInfo[uart_id_t]; interface Leds; } } implementation { components SerialP, new SerialDispatcherP(), HdlcTranslateC, PlatformSerialC; Send = SerialDispatcherP; Receive = SerialDispatcherP; SerialPacketInfo = SerialDispatcherP.PacketInfo; SplitControl = SerialP; Init = SerialP; Leds = SerialP; Leds = SerialDispatcherP; Leds = HdlcTranslateC; SerialDispatcherP.ReceiveBytePacket -> SerialP; SerialDispatcherP.SendBytePacket -> SerialP; SerialP.SerialFrameComm -> HdlcTranslateC; SerialP.SerialControl -> PlatformSerialC; // SerialP.SerialFlush -> PlatformSerialC; HdlcTranslateC.UartStream -> PlatformSerialC; } tinyos-2.1.2+dfsg/tos/lib/serial/SerialDispatcherP.nc000066400000000000000000000263431207233610700225130ustar00rootroot00000000000000//$Id: SerialDispatcherP.nc,v 1.10 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This component provides functionality to send many different kinds * of serial packets on top of a general packet sending component. It * achieves this by knowing where the different packets in a message_t * exist through the SerialPacketInfo interface. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 * */ #include "Serial.h" generic module SerialDispatcherP() { provides { interface Receive[uart_id_t id]; interface Send[uart_id_t id]; } uses { interface SerialPacketInfo as PacketInfo[uart_id_t id]; interface ReceiveBytePacket; interface SendBytePacket; interface Leds; } } implementation { typedef enum { SEND_STATE_IDLE = 0, SEND_STATE_BEGIN = 1, SEND_STATE_DATA = 2 } send_state_t; enum { RECV_STATE_IDLE = 0, RECV_STATE_BEGIN = 1, RECV_STATE_DATA = 2, }; typedef struct { uint8_t which:1; uint8_t bufZeroLocked:1; uint8_t bufOneLocked:1; uint8_t state:2; } recv_state_t; // We are not busy, the current buffer to use is zero, // neither buffer is locked, and we are idle recv_state_t receiveState = {0, 0, 0, RECV_STATE_IDLE}; uint8_t recvType = TOS_SERIAL_UNKNOWN_ID; uint8_t recvIndex = 0; /* This component provides double buffering. */ message_t messages[2]; // buffer allocation message_t* ONE messagePtrs[2] = { &messages[0], &messages[1]}; // We store a separate receiveBuffer variable because indexing // into a pointer array can be costly, and handling interrupts // is time critical. uint8_t* COUNT_NOK(sizeof(message_t)) receiveBuffer = (uint8_t* COUNT_NOK(sizeof(message_t)))(&messages[0]); uint8_t *COUNT_NOK(sizeof(message_t)) sendBuffer = NULL; send_state_t sendState = SEND_STATE_IDLE; uint8_t sendLen = 0; uint8_t sendIndex = 0; norace error_t sendError = SUCCESS; bool sendCancelled = FALSE; uint8_t sendId = 0; uint8_t receiveTaskPending = FALSE; uart_id_t receiveTaskType = 0; uint8_t receiveTaskWhich; message_t * ONE_NOK receiveTaskBuf = NULL; uint8_t receiveTaskSize = 0; command error_t Send.send[uint8_t id](message_t* msg, uint8_t len) { if (sendState != SEND_STATE_IDLE) { return EBUSY; } atomic { sendIndex = call PacketInfo.offset[id](); if (sendIndex > sizeof(message_header_t)) { return ESIZE; } sendError = SUCCESS; sendBuffer = (uint8_t*)msg; sendState = SEND_STATE_DATA; sendId = id; sendCancelled = FALSE; // If something we're starting past the header, something is wrong // Bug fix from John Regehr // sendLen is where in the buffer the packet stops. // This is the length of the packet, plus its start point sendLen = call PacketInfo.dataLinkLength[id](msg, len) + sendIndex; } if (call SendBytePacket.startSend(id) == SUCCESS) { return SUCCESS; } else { sendState = SEND_STATE_IDLE; return FAIL; } } command uint8_t Send.maxPayloadLength[uint8_t id]() { return (sizeof(message_t)); } command void* Send.getPayload[uint8_t id](message_t* m, uint8_t len) { if (len > sizeof(message_t)) { return NULL; } else { return m; } } task void signalSendDone(){ error_t error; sendState = SEND_STATE_IDLE; atomic error = sendError; if (sendCancelled) error = ECANCEL; signal Send.sendDone[sendId]((message_t *)sendBuffer, error); } command error_t Send.cancel[uint8_t id](message_t *msg){ if (sendState == SEND_STATE_DATA && sendBuffer == ((uint8_t *)msg) && id == sendId){ call SendBytePacket.completeSend(); sendCancelled = TRUE; return SUCCESS; } return FAIL; } async event uint8_t SendBytePacket.nextByte() { uint8_t b; uint8_t indx; atomic { b = sendBuffer[sendIndex]; sendIndex++; indx = sendIndex; } if (indx > sendLen) { call SendBytePacket.completeSend(); return 0; } else { return b; } } async event void SendBytePacket.sendCompleted(error_t error){ atomic sendError = error; post signalSendDone(); } bool isCurrentBufferLocked() { return (receiveState.which)? receiveState.bufOneLocked : receiveState.bufZeroLocked; } void lockCurrentBuffer() { if (receiveState.which) { receiveState.bufOneLocked = 1; } else { receiveState.bufZeroLocked = 1; } } void unlockBuffer(uint8_t which) { if (which) { receiveState.bufOneLocked = 0; } else { receiveState.bufZeroLocked = 0; } } void receiveBufferSwap() { receiveState.which = (receiveState.which)? 0: 1; receiveBuffer = (uint8_t*)(messagePtrs[receiveState.which]); } async event error_t ReceiveBytePacket.startPacket() { error_t result = SUCCESS; atomic { if (!isCurrentBufferLocked()) { // We are implicitly in RECV_STATE_IDLE, as it is the only // way our current buffer could be unlocked. lockCurrentBuffer(); receiveState.state = RECV_STATE_BEGIN; recvIndex = 0; recvType = TOS_SERIAL_UNKNOWN_ID; } else { result = EBUSY; } } return result; } async event void ReceiveBytePacket.byteReceived(uint8_t b) { atomic { switch (receiveState.state) { case RECV_STATE_BEGIN: receiveState.state = RECV_STATE_DATA; recvIndex = call PacketInfo.offset[b](); recvType = b; break; case RECV_STATE_DATA: if (recvIndex < sizeof(message_t)) { receiveBuffer[recvIndex] = b; recvIndex++; } else { // Drop extra bytes that do not fit in a message_t. // We assume that either the higher layer knows what to // do with partial packets, or performs sanity checks (e.g., // CRC). } break; case RECV_STATE_IDLE: default: // Do nothing. This case can be reached if the component // does not have free buffers: it will ignore a packet start // and stay in the IDLE state. } } } task void receiveTask(){ uart_id_t myType; message_t *myBuf; uint8_t mySize; uint8_t myWhich; atomic { myType = receiveTaskType; myBuf = receiveTaskBuf; mySize = receiveTaskSize; myWhich = receiveTaskWhich; } mySize -= call PacketInfo.offset[myType](); mySize = call PacketInfo.upperLength[myType](myBuf, mySize); myBuf = signal Receive.receive[myType](myBuf, myBuf, mySize); atomic { messagePtrs[myWhich] = myBuf; unlockBuffer(myWhich); receiveTaskPending = FALSE; } } async event void ReceiveBytePacket.endPacket(error_t result) { uint8_t postsignalreceive = FALSE; atomic { if (!receiveTaskPending && result == SUCCESS){ postsignalreceive = TRUE; receiveTaskPending = TRUE; receiveTaskType = recvType; receiveTaskWhich = receiveState.which; receiveTaskBuf = (message_t *)receiveBuffer; receiveTaskSize = recvIndex; receiveBufferSwap(); receiveState.state = RECV_STATE_IDLE; } else { // we can't deliver the packet, better free the current buffer. unlockBuffer(receiveState.which); } } if (postsignalreceive){ post receiveTask(); } // These are all local variables to release component state that // will allow the component to start receiving serial packets // ASAP. // // We need myWhich in case we happen to receive a whole new packet // before the signal returns, at which point receiveState.which // might revert back to us (via receiveBufferSwap()). /* uart_id_t myType; // What is the type of the packet in flight? */ /* uint8_t myWhich; // Which buffer ptr entry is it? */ /* uint8_t mySize; // How large is it? */ /* message_t* myBuf; // A pointer, for buffer swapping */ // First, copy out all of the important state so we can receive // the next packet. Then do a receiveBufferSwap, which will // tell the component to use the other available buffer. // If the buffer is /* atomic { */ /* myType = recvType; */ /* myWhich = receiveState.which; */ /* myBuf = (message_t*)receiveBuffer; */ /* mySize = recvIndex; */ /* receiveBufferSwap(); */ /* receiveState.state = RECV_STATE_IDLE; */ /* } */ /* mySize -= call PacketInfo.offset[myType](); */ /* mySize = call PacketInfo.upperLength[myType](myBuf, mySize); */ /* if (result == SUCCESS){ */ /* // TODO is the payload the same as the message? */ /* myBuf = signal Receive.receive[myType](myBuf, myBuf, mySize); */ /* } */ /* atomic { */ /* messagePtrs[myWhich] = myBuf; */ /* if (myWhich) { */ /* unlockBuffer(myWhich); */ /* } */ /* } */ } default async command uint8_t PacketInfo.offset[uart_id_t id](){ return 0; } default async command uint8_t PacketInfo.dataLinkLength[uart_id_t id](message_t *msg, uint8_t upperLen){ return 0; } default async command uint8_t PacketInfo.upperLength[uart_id_t id](message_t *msg, uint8_t dataLinkLen){ return 0; } default event message_t *Receive.receive[uart_id_t idxxx](message_t *msg, void *payload, uint8_t len){ return msg; } default event void Send.sendDone[uart_id_t idxxx](message_t *msg, error_t error){ return; } } tinyos-2.1.2+dfsg/tos/lib/serial/SerialFlush.nc000066400000000000000000000041041207233610700213550ustar00rootroot00000000000000//$Id: SerialFlush.nc,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A basic interface to flush the serial port. * * @author Ben Greenstein * @author Philip Levis * @date January 23 2006 * */ interface SerialFlush { /** * Request that the serial device signal when no more transmissions * are pending (i.e., when the device is idle) */ command void flush(); /** * Split phase event to indicate that the serial hardware is now idle. */ event void flushDone(); } tinyos-2.1.2+dfsg/tos/lib/serial/SerialFrameComm.nc000066400000000000000000000076521207233610700221550ustar00rootroot00000000000000//$Id: SerialFrameComm.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * This interface sits between a serial byte encoding component and a * framing/packetizing component. It is to be used with framing protocols * that place delimiters between frames. This interface separates the tasks * of interpreting and coding delimiters and escape bytes from the rest of * the wire protocol. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 */ interface SerialFrameComm { /** * Used by the upper layer to request that an interframe delimiter * be sent. The lower layer is responsible for the determining the * actual byte(s) that must be sent to delimit the frame. * @return Returns a error_t code that indicates if the lower layer * was able to put an interframe delimiter to serial (SUCCESS) or * not (FAIL). */ async command error_t putDelimiter(); /** * Used by the upper layer to request that a byte of data be sent * over serial. * @param data The byte to be sent * @return Returns an error_t code that indicates if the lower layer * has accepted the byte for sending (SUCCESS) or not (FAIL). */ async command error_t putData(uint8_t data); /** * Requests that any underlying state associated with send-side frame * delimiting or escaping be reset. Used to initialize the lower * layer's send path and/or cancel a frame mid-transmission. */ async command void resetSend(); /** * Requests that any underlying state associated with receive-side * frame or escaping be reset. Used to initialize the lower layer's * receive path and/or cancel a frame mid-reception when sync is lost. */ async command void resetReceive(); /** * Signals the upper layer that an inter-frame delimiter has been * received from the serial connection. */ async event void delimiterReceived(); /** * Signals the upper layer that a byte of data has been received * from the serial connection. It passes this byte as a function * parameter. * @param data The byte of data that has been received * from the serial connection */ async event void dataReceived(uint8_t data); /** * Split-phase event to signal when the lower layer has finished writing * the last request (either putDelimiter or putData) to serial. */ async event void putDone(); } tinyos-2.1.2+dfsg/tos/lib/serial/SerialP.nc000066400000000000000000000413641207233610700205040ustar00rootroot00000000000000/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation. * Copyright (c) 2010 Stanford University. * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Revision: $Revision: 1.5 $ * */ /* * * This modules provides framing for TOS_Msgs using PPP-HDLC-like * framing (see RFC 1662). When sending, a TOS_Msg is encapsulated in * an HDLC frame. Receiving is similar EXCEPT that the component * expects a special token byte be received before the data * payload. The purpose of the token is to feed back an * acknowledgement to the sender which serves as a crude form of * flow-control. * * @author Phil Buonadonna * @author Lewis Girod * @author Ben Greenstein * @author Philip Levis * @date September 30 2010 */ #include "AM.h" #include "crc.h" module SerialP { provides { interface Init; interface SplitControl; interface SendBytePacket; interface ReceiveBytePacket; } uses { interface SerialFrameComm; interface Leds; interface StdControl as SerialControl; interface SerialFlush; } } implementation { #define NO_TX_SEQNO enum { RX_DATA_BUFFER_SIZE = 2, TX_DATA_BUFFER_SIZE = 4, SERIAL_MTU = 255, SERIAL_VERSION = 1, ACK_QUEUE_SIZE = 5, }; enum { RXSTATE_NOSYNC, RXSTATE_PROTO, RXSTATE_TOKEN, RXSTATE_INFO, RXSTATE_INACTIVE }; enum { TXSTATE_IDLE, TXSTATE_PROTO, TXSTATE_SEQNO, TXSTATE_INFO, TXSTATE_FCS1, TXSTATE_FCS2, TXSTATE_ENDFLAG, TXSTATE_ENDWAIT, TXSTATE_FINISH, TXSTATE_ERROR, TXSTATE_INACTIVE }; typedef enum { BUFFER_AVAILABLE, BUFFER_FILLING, BUFFER_COMPLETE, } tx_data_buffer_states_t; enum { TX_ACK_INDEX = 0, TX_DATA_INDEX = 1, TX_BUFFER_COUNT = 2, }; typedef struct { uint8_t writePtr; uint8_t readPtr; uint8_t buf[RX_DATA_BUFFER_SIZE+1]; // one wasted byte: writePtr == readPtr means empty } rx_buf_t; typedef struct { uint8_t state; uint8_t buf; } tx_buf_t; typedef struct { uint8_t writePtr; uint8_t readPtr; uint8_t buf[ACK_QUEUE_SIZE+1]; // one wasted byte: writePtr == readPtr means empty } ack_queue_t; /* Buffers */ rx_buf_t rxBuf; tx_buf_t txBuf[TX_BUFFER_COUNT]; /* Receive State */ uint8_t rxState; uint8_t rxByteCnt; uint8_t rxProto; uint8_t rxSeqno; uint16_t rxCRC; /* Transmit State */ uint8_t txState; uint8_t txByteCnt; uint8_t txProto; uint8_t txSeqno; uint16_t txCRC; uint8_t txPending; uint8_t txIndex; /* Ack Queue */ ack_queue_t ackQ; bool offPending = FALSE; // Prototypes inline void txInit(); inline void rxInit(); inline void ackInit(); inline bool ack_queue_is_full(); inline bool ack_queue_is_empty(); inline void ack_queue_push(uint8_t token); inline uint8_t ack_queue_top(); uint8_t ack_queue_pop(); inline void rx_buffer_init(); inline bool rx_buffer_is_full(); inline bool rx_buffer_is_empty(); inline void rx_buffer_push(uint8_t data); inline uint8_t rx_buffer_top(); inline uint8_t rx_buffer_pop(); inline uint16_t rx_current_crc(); void rx_state_machine(bool isDelimeter, uint8_t data); void MaybeScheduleTx(); task void RunTx(); inline void txInit(){ uint8_t i; atomic for (i = 0; i < TX_BUFFER_COUNT; i++) txBuf[i].state = BUFFER_AVAILABLE; txState = TXSTATE_INACTIVE; txByteCnt = 0; txProto = 0; txSeqno = 0; txCRC = 0; txPending = FALSE; txIndex = 0; } inline void rxInit(){ rxBuf.writePtr = rxBuf.readPtr = 0; rxState = RXSTATE_INACTIVE; rxByteCnt = 0; rxProto = 0; rxSeqno = 0; rxCRC = 0; } inline void ackInit(){ ackQ.writePtr = ackQ.readPtr = 0; } command error_t Init.init() { txInit(); rxInit(); ackInit(); return SUCCESS; } /* * buffer and queue manipulation */ inline bool ack_queue_is_full(){ uint8_t tmp, tmp2; atomic { tmp = ackQ.writePtr; tmp2 = ackQ.readPtr; } if (++tmp > ACK_QUEUE_SIZE) tmp = 0; return (tmp == tmp2); } inline bool ack_queue_is_empty(){ bool ret; atomic ret = (ackQ.writePtr == ackQ.readPtr); return ret; } inline void ack_queue_push(uint8_t token) { if (!ack_queue_is_full()){ atomic { ackQ.buf[ackQ.writePtr] = token; if (++ackQ.writePtr > ACK_QUEUE_SIZE) ackQ.writePtr = 0; } MaybeScheduleTx(); } } inline uint8_t ack_queue_top() { uint8_t tmp = 0; atomic { if (!ack_queue_is_empty()){ tmp = ackQ.buf[ackQ.readPtr]; } } return tmp; } uint8_t ack_queue_pop() { uint8_t retval = 0; atomic { if (ackQ.writePtr != ackQ.readPtr){ retval = ackQ.buf[ackQ.readPtr]; if (++(ackQ.readPtr) > ACK_QUEUE_SIZE) ackQ.readPtr = 0; } } return retval; } /* * Buffer Manipulation */ inline void rx_buffer_init(){ rxBuf.writePtr = rxBuf.readPtr = 0; } inline bool rx_buffer_is_full() { uint8_t tmp = rxBuf.writePtr; if (++tmp > RX_DATA_BUFFER_SIZE) tmp = 0; return (tmp == rxBuf.readPtr); } inline bool rx_buffer_is_empty(){ return (rxBuf.readPtr == rxBuf.writePtr); } inline void rx_buffer_push(uint8_t data){ rxBuf.buf[rxBuf.writePtr] = data; if (++(rxBuf.writePtr) > RX_DATA_BUFFER_SIZE) rxBuf.writePtr = 0; } inline uint8_t rx_buffer_top(){ uint8_t tmp = rxBuf.buf[rxBuf.readPtr]; return tmp; } inline uint8_t rx_buffer_pop(){ uint8_t tmp = rxBuf.buf[rxBuf.readPtr]; if (++(rxBuf.readPtr) > RX_DATA_BUFFER_SIZE) rxBuf.readPtr = 0; return tmp; } inline uint16_t rx_current_crc(){ uint16_t crc; uint8_t tmp = rxBuf.writePtr; tmp = (tmp == 0 ? RX_DATA_BUFFER_SIZE : tmp - 1); crc = rxBuf.buf[tmp] & 0x00ff; crc = (crc << 8) & 0xFF00; tmp = (tmp == 0 ? RX_DATA_BUFFER_SIZE : tmp - 1); crc |= (rxBuf.buf[tmp] & 0x00FF); return crc; } task void startDoneTask() { call SerialControl.start(); atomic { txState = TXSTATE_IDLE; rxState = RXSTATE_NOSYNC; } signal SplitControl.startDone(SUCCESS); } task void stopDoneTask() { call SerialFlush.flush(); } event void SerialFlush.flushDone(){ call SerialControl.stop(); signal SplitControl.stopDone(SUCCESS); } task void defaultSerialFlushTask(){ signal SerialFlush.flushDone(); } default command void SerialFlush.flush(){ post defaultSerialFlushTask(); } command error_t SplitControl.start() { atomic { if(txState != TXSTATE_INACTIVE && rxState != RXSTATE_INACTIVE ) return EALREADY; } post startDoneTask(); return SUCCESS; } void testOff() { bool turnOff = FALSE; atomic { if (txState == TXSTATE_INACTIVE && rxState == RXSTATE_INACTIVE) { turnOff = TRUE; } } if (turnOff) { post stopDoneTask(); atomic offPending = FALSE; } else { atomic offPending = TRUE; } } command error_t SplitControl.stop() { atomic { if (rxState == RXSTATE_NOSYNC) { rxState = RXSTATE_INACTIVE; } } atomic { if (txState == TXSTATE_IDLE) { txState = TXSTATE_INACTIVE; } } testOff(); return SUCCESS; } /* * Receive Path */ async event void SerialFrameComm.delimiterReceived(){ rx_state_machine(TRUE,0); } async event void SerialFrameComm.dataReceived(uint8_t data){ rx_state_machine(FALSE,data); } bool valid_rx_proto(uint8_t proto){ switch (proto){ case SERIAL_PROTO_PACKET_ACK: return TRUE; case SERIAL_PROTO_ACK: case SERIAL_PROTO_PACKET_NOACK: default: return FALSE; } } void rx_state_machine(bool isDelimeter, uint8_t data){ switch (rxState) { case RXSTATE_NOSYNC: if (isDelimeter) { rxInit(); rxState = RXSTATE_PROTO; } break; case RXSTATE_PROTO: if (!isDelimeter){ rxCRC = crcByte(rxCRC,data); rxState = RXSTATE_TOKEN; rxProto = data; if (!valid_rx_proto(rxProto)) goto nosync; // only supports serial proto packet ack if (rxProto != SERIAL_PROTO_PACKET_ACK){ goto nosync; } if (signal ReceiveBytePacket.startPacket() != SUCCESS){ goto nosync; } } break; case RXSTATE_TOKEN: if (isDelimeter) { goto nosync; } else { rxSeqno = data; rxCRC = crcByte(rxCRC,rxSeqno); rxState = RXSTATE_INFO; } break; case RXSTATE_INFO: if (rxByteCnt < SERIAL_MTU){ if (isDelimeter) { /* handle end of frame */ if (rxByteCnt >= 2) { if (rx_current_crc() == rxCRC) { signal ReceiveBytePacket.endPacket(SUCCESS); ack_queue_push(rxSeqno); rxInit(); call SerialFrameComm.resetReceive(); if (offPending) { rxState = RXSTATE_INACTIVE; testOff(); } goto done; } else { goto nosync; } } else { goto nosync; } } else { /* handle new bytes to save */ if (rxByteCnt >= 2){ signal ReceiveBytePacket.byteReceived(rx_buffer_top()); rxCRC = crcByte(rxCRC,rx_buffer_pop()); } rx_buffer_push(data); rxByteCnt++; } } /* no valid message.. */ else { goto nosync; } break; default: goto nosync; } goto done; nosync: /* reset all counters, etc */ rxInit(); call SerialFrameComm.resetReceive(); signal ReceiveBytePacket.endPacket(FAIL); if (offPending) { rxState = RXSTATE_INACTIVE; testOff(); } /* if this was a flag, start in proto state.. */ else if (isDelimeter) { rxState = RXSTATE_PROTO; } done: } /* * Send Path */ void MaybeScheduleTx() { atomic { if (txPending == 0) { if (post RunTx() == SUCCESS) { txPending = 1; } } } } async command error_t SendBytePacket.completeSend(){ bool ret = FAIL; atomic { txBuf[TX_DATA_INDEX].state = BUFFER_COMPLETE; ret = SUCCESS; } return ret; } async command error_t SendBytePacket.startSend(uint8_t b){ bool not_busy = FALSE; atomic { if(txState == TXSTATE_INACTIVE) return EOFF; } atomic { if (txBuf[TX_DATA_INDEX].state == BUFFER_AVAILABLE){ txBuf[TX_DATA_INDEX].state = BUFFER_FILLING; txBuf[TX_DATA_INDEX].buf = b; not_busy = TRUE; } } if (not_busy) { MaybeScheduleTx(); return SUCCESS; } return EBUSY; } task void RunTx() { uint8_t idle; uint8_t done; uint8_t fail; /* the following trigger MaybeScheduleTx, which starts at most one RunTx: 1) adding an ack to the ack queue (ack_queue_push()) 2) starting to send a packet (SendBytePacket.startSend()) 3) failure to send start delimiter in RunTx 4) putDone: */ error_t result = SUCCESS; bool send_completed = FALSE; bool start_it = FALSE; atomic { txPending = 0; idle = (txState == TXSTATE_IDLE); done = (txState == TXSTATE_FINISH); fail = (txState == TXSTATE_ERROR); if (done || fail){ txState = TXSTATE_IDLE; txBuf[txIndex].state = BUFFER_AVAILABLE; } } /* if done, call the send done */ if (done || fail) { atomic { txSeqno++; if (txProto == SERIAL_PROTO_ACK){ ack_queue_pop(); } else { result = done ? SUCCESS : FAIL; send_completed = TRUE; } } idle = TRUE; } /* if idle, set up next packet to TX */ if (idle) { bool goInactive; atomic goInactive = offPending; if (goInactive) { atomic txState = TXSTATE_INACTIVE; } else { /* acks are top priority */ uint8_t myAckState; uint8_t myDataState; atomic { myAckState = txBuf[TX_ACK_INDEX].state; myDataState = txBuf[TX_DATA_INDEX].state; } if (!ack_queue_is_empty() && myAckState == BUFFER_AVAILABLE) { atomic { txBuf[TX_ACK_INDEX].state = BUFFER_COMPLETE; txBuf[TX_ACK_INDEX].buf = ack_queue_top(); txProto = SERIAL_PROTO_ACK; txIndex = TX_ACK_INDEX; start_it = TRUE; } } else if (myDataState == BUFFER_FILLING || myDataState == BUFFER_COMPLETE){ atomic { txProto = SERIAL_PROTO_PACKET_NOACK; txIndex = TX_DATA_INDEX; start_it = TRUE; } } else { /* nothing to send now.. */ } } } else { /* we're in the middle of transmitting */ } if (send_completed){ signal SendBytePacket.sendCompleted(result); } atomic { if (txState == TXSTATE_INACTIVE) { testOff(); return; } } if (start_it){ /* OK, start transmitting ! */ atomic { txCRC = 0; txByteCnt = 0; txState = TXSTATE_PROTO; } if (call SerialFrameComm.putDelimiter() != SUCCESS) { atomic txState = TXSTATE_ERROR; MaybeScheduleTx(); } } } async event void SerialFrameComm.putDone() { { error_t txResult = SUCCESS; atomic { switch (txState) { case TXSTATE_PROTO: txResult = call SerialFrameComm.putData(txProto); #ifdef NO_TX_SEQNO txState = TXSTATE_INFO; #else txState = TXSTATE_SEQNO; #endif txCRC = crcByte(txCRC,txProto); break; case TXSTATE_SEQNO: txResult = call SerialFrameComm.putData(txSeqno); txState = TXSTATE_INFO; txCRC = crcByte(txCRC,txSeqno); break; case TXSTATE_INFO: atomic { txResult = call SerialFrameComm.putData(txBuf[txIndex].buf); txCRC = crcByte(txCRC,txBuf[txIndex].buf); ++txByteCnt; if (txIndex == TX_DATA_INDEX){ uint8_t nextByte; nextByte = signal SendBytePacket.nextByte(); if (txBuf[txIndex].state == BUFFER_COMPLETE || txByteCnt >= SERIAL_MTU){ txState = TXSTATE_FCS1; } else { /* never called on ack b/c ack is BUFFER_COMPLETE initially */ txBuf[txIndex].buf = nextByte; } } else { // TX_ACK_INDEX txState = TXSTATE_FCS1; } } break; case TXSTATE_FCS1: txResult = call SerialFrameComm.putData(txCRC & 0xff); txState = TXSTATE_FCS2; break; case TXSTATE_FCS2: txResult = call SerialFrameComm.putData((txCRC >> 8) & 0xff); txState = TXSTATE_ENDFLAG; break; case TXSTATE_ENDFLAG: txResult = call SerialFrameComm.putDelimiter(); txState = TXSTATE_ENDWAIT; break; case TXSTATE_ENDWAIT: txState = TXSTATE_FINISH; case TXSTATE_FINISH: MaybeScheduleTx(); break; case TXSTATE_ERROR: default: txResult = FAIL; break; } if (txResult != SUCCESS) { txState = TXSTATE_ERROR; MaybeScheduleTx(); } } } } default event void SplitControl.startDone(error_t err) {} default event void SplitControl.stopDone(error_t err) {} } tinyos-2.1.2+dfsg/tos/lib/serial/SerialPacketInfo.nc000066400000000000000000000022501207233610700223170ustar00rootroot00000000000000/** * Accessor methods used by a serial dispatcher to communicate with various * message_t link formats over a serial port. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 */ interface SerialPacketInfo { /** * Get the offset into a message_t where the header information begins. * @return Returns the offset. */ async command uint8_t offset(); /** * Get the size of the datalink packet embedded in the message_t, in bytes. * This is the sum of the payload (upperLen) and the size of the link header. * @param msg A pointer to the message_t to interrogate. (unused) * @param upperLen The size of the payload. * @return Returns the size of the datalink packet. */ async command uint8_t dataLinkLength(message_t* msg, uint8_t upperLen); /** * Get the size of the payload (in bytes) given the size of the datalink * packet (dataLinkLen) embedded in the message_t. * @param msg A pointer to the message_t to interrogate. (unused) * @param dataLinkLength The size of the datalink packet. * @return Returns the size of the payload. */ async command uint8_t upperLength(message_t* msg, uint8_t dataLinkLen); } tinyos-2.1.2+dfsg/tos/lib/serial/SerialPacketInfo802_15_4P.nc000066400000000000000000000053471207233610700234330ustar00rootroot00000000000000//$Id: SerialPacketInfo802_15_4P.nc,v 1.8 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the metdata necessary for a dispatcher to * communicate 802.15.4 message_t packets over a serial port. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 * */ module SerialPacketInfo802_15_4P { provides interface SerialPacketInfo as Info; } implementation { #if defined(PLATFORM_IRIS) || defined(PLATFORM_MULLE) enum { HEADER_SIZE = sizeof(rf230packet_header_t), FOOTER_SIZE = sizeof(rf230packet_footer_t), }; #elif defined(PLATFORM_UCMINI) enum { HEADER_SIZE = sizeof(rfa1packet_header_t), FOOTER_SIZE = sizeof(rfa1packet_footer_t), }; #else enum { HEADER_SIZE = sizeof(cc2420_header_t), FOOTER_SIZE = sizeof(cc2420_footer_t), }; #endif async command uint8_t Info.offset() { return sizeof(message_header_t)-HEADER_SIZE; } async command uint8_t Info.dataLinkLength(message_t* msg, uint8_t upperLen) { return upperLen + HEADER_SIZE + FOOTER_SIZE; } async command uint8_t Info.upperLength(message_t* msg, uint8_t dataLinkLen) { return dataLinkLen - (HEADER_SIZE + FOOTER_SIZE); } } tinyos-2.1.2+dfsg/tos/lib/serial/SerialPacketInfoActiveMessageP.nc000066400000000000000000000046041207233610700251050ustar00rootroot00000000000000//$Id: SerialPacketInfoActiveMessageP.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the metadata neccessary for a dispatcher to * communicate with basic active messages packets over a serial port. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 * */ #include "Serial.h" module SerialPacketInfoActiveMessageP { provides interface SerialPacketInfo as Info; } implementation { async command uint8_t Info.offset() { return (uint8_t)(sizeof(message_header_t) - sizeof(serial_header_t)); } async command uint8_t Info.dataLinkLength(message_t* msg, uint8_t upperLen) { return upperLen + sizeof(serial_header_t); } async command uint8_t Info.upperLength(message_t* msg, uint8_t dataLinkLen) { return dataLinkLen - sizeof(serial_header_t); } } tinyos-2.1.2+dfsg/tos/lib/serial/SerialQueueP.nc000066400000000000000000000041631207233610700215050ustar00rootroot00000000000000// $Id: SerialQueueP.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The fair-share AM send queue. * * @author Philip Levis * @date Jan 16 2006 */ #include "Serial.h" configuration SerialQueueP { provides interface Send[uint8_t client]; } implementation { enum { NUM_CLIENTS = uniqueCount(UQ_SERIALQUEUE_SEND) }; components new AMQueueImplP(NUM_CLIENTS), SerialActiveMessageC; Send = AMQueueImplP; AMQueueImplP.AMSend -> SerialActiveMessageC; AMQueueImplP.AMPacket -> SerialActiveMessageC; AMQueueImplP.Packet -> SerialActiveMessageC; } tinyos-2.1.2+dfsg/tos/lib/serial/SerialStartC.nc000066400000000000000000000036721207233610700215050ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Including this configuration will start the Serial port at boot time. This * is very useful if you use the serial port for debug only. * * @author Thomas Schmid */ configuration SerialStartC {} implementation { components MainC, SerialStartP; SerialStartP.Boot -> MainC; components SerialActiveMessageC; SerialStartP.SerialControl -> SerialActiveMessageC; } tinyos-2.1.2+dfsg/tos/lib/serial/SerialStartP.nc000066400000000000000000000036101207233610700215120ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Thomas Schmid */ module SerialStartP { uses { interface Boot; interface SplitControl as SerialControl; } } implementation { event void Boot.booted() { call SerialControl.start(); } event void SerialControl.startDone(error_t error) {} event void SerialControl.stopDone(error_t error) {} } tinyos-2.1.2+dfsg/tos/lib/timer/000077500000000000000000000000001207233610700164545ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/timer/Alarm.nc000066400000000000000000000104571207233610700200410ustar00rootroot00000000000000//$Id: Alarm.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * An Alarm is a low-level interface intended for precise timing. * *

      An Alarm is parameterised by its "precision" (milliseconds, * microseconds, etc), identified by a type. This prevents, e.g., * unintentionally mixing components expecting milliseconds with those * expecting microseconds as those interfaces have a different type. * *

      An Alarm's second parameter is its "width", i.e., the number of * bits used to represent time values. Width is indicated by including * the appropriate size integer type as an Alarm parameter. * *

      See TEP102 for more details. * * @param precision_tag A type indicating the precision of this Alarm. * @param size_type An integer type representing time values for this Alarm. * * @author Cory Sharp */ interface Alarm { // basic interface /** * Set a single-short alarm to some time units in the future. Replaces * any current alarm time. Equivalent to start(getNow(), dt). The * fired will be signaled when the alarm expires. * * @param dt Time until the alarm fires. */ async command void start(size_type dt); /** * Cancel an alarm. Note that the fired event may have * already been signaled (even if your code has not yet started * executing). */ async command void stop(); /** * Signaled when the alarm expires. */ async event void fired(); // extended interface /** * Check if alarm is running. Note that a FALSE return does not indicate * that the fired event will not be signaled (it may have * already started executing, but not reached your code yet). * * @return TRUE if the alarm is still running. */ async command bool isRunning(); /** * Set a single-short alarm to time t0+dt. Replaces any current alarm * time. The fired will be signaled when the alarm expires. * Alarms set in the past will fire "soon". * *

      Because the current time may wrap around, it is possible to use * values of t0 greater than the getNow's result. These * values represent times in the past, i.e., the time at which getNow() * would last of returned that value. * * @param t0 Base time for alarm. * @param dt Alarm time as offset from t0. */ async command void startAt(size_type t0, size_type dt); /** * Return the current time. * @return Current time. */ async command size_type getNow(); /** * Return the time the currently running alarm will fire or the time that * the previously running alarm was set to fire. * @return Alarm time. */ async command size_type getAlarm(); } tinyos-2.1.2+dfsg/tos/lib/timer/AlarmToTimerC.nc000066400000000000000000000064101207233610700214420ustar00rootroot00000000000000//$Id: AlarmToTimerC.nc,v 1.7 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * AlarmToTimerC converts a 32-bit Alarm to a Timer. * *

      See TEP102 for more details. * @param precision_tag A type indicating the precision of the Alarm and * Timer being converted. * * @author Cory Sharp */ generic module AlarmToTimerC(typedef precision_tag) @safe() { provides interface Timer; uses interface Alarm; } implementation { // there might be ways to save bytes here, but I'll do it in the obviously // right way for now uint32_t m_dt; bool m_oneshot; void start(uint32_t t0, uint32_t dt, bool oneshot) { m_dt = dt; m_oneshot = oneshot; call Alarm.startAt(t0, dt); } command void Timer.startPeriodic(uint32_t dt) { start(call Alarm.getNow(), dt, FALSE); } command void Timer.startOneShot(uint32_t dt) { start(call Alarm.getNow(), dt, TRUE); } command void Timer.stop() { call Alarm.stop(); } task void fired() { if(m_oneshot == FALSE) start(call Alarm.getAlarm(), m_dt, FALSE); signal Timer.fired(); } async event void Alarm.fired() { post fired(); } command bool Timer.isRunning() { return call Alarm.isRunning(); } command bool Timer.isOneShot() { return m_oneshot; } command void Timer.startPeriodicAt(uint32_t t0, uint32_t dt) { start(t0, dt, FALSE); } command void Timer.startOneShotAt(uint32_t t0, uint32_t dt) { start(t0, dt, TRUE); } command uint32_t Timer.getNow() { return call Alarm.getNow(); } command uint32_t Timer.gett0() { return call Alarm.getAlarm() - m_dt; } command uint32_t Timer.getdt() { return m_dt; } } tinyos-2.1.2+dfsg/tos/lib/timer/BusyWait.nc000066400000000000000000000054031207233610700205470ustar00rootroot00000000000000//$Id: BusyWait.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * BusyWait is a low-level interface intended for busy waiting for short * durations. * *

      BusyWait is parameterised by its "precision" (milliseconds, * microseconds, etc), identified by a type. This prevents, e.g., * unintentionally mixing components expecting milliseconds with those * expecting microseconds as those interfaces have a different type. * *

      BusyWait's second parameter is its "width", i.e., the number of bits * used to represent time values. Width is indicated by including the * appropriate size integer type as a BusyWait parameter. * *

      See TEP102 for more details. * * @param precision_tag A type indicating the precision of this BusyWait * interface. * @param size_type An integer type representing time values for this * BusyWait interface. * * @author Cory Sharp */ interface BusyWait { /** * Busy wait for (at least) dt time units. Use sparingly, when the * cost of using an Alarm or Timer would be too high. * @param dt Time to busy wait for. */ async command void wait(size_type dt); } tinyos-2.1.2+dfsg/tos/lib/timer/BusyWaitCounterC.nc000066400000000000000000000055451207233610700222210ustar00rootroot00000000000000//$Id: BusyWaitCounterC.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * BusyWaitCounterC uses a Counter to implement the BusyWait interface * (block until a specified amount of time elapses). See TEP102 for more * details. * *

      See TEP102 for more details. * * @param precision_tag A type indicating the precision of the BusyWait * interface. * @param size_type An integer type representing time values for the * BusyWait interface. * * @author Cory Sharp */ generic module BusyWaitCounterC(typedef precision_tag, typedef size_type @integer()) { provides interface BusyWait; uses interface Counter; } implementation { enum { HALF_MAX_SIZE_TYPE = ((size_type)1) << (8*sizeof(size_type)-1), }; async command void BusyWait.wait(size_type dt) { atomic { // comparisons are <= to guarantee a wait at least as long as dt size_type t0 = call Counter.get(); if(dt > HALF_MAX_SIZE_TYPE) { dt -= HALF_MAX_SIZE_TYPE; while((call Counter.get() - t0) <= dt); t0 += dt; dt = HALF_MAX_SIZE_TYPE; } while((call Counter.get() - t0) <= dt); } } async event void Counter.overflow() { } } tinyos-2.1.2+dfsg/tos/lib/timer/Counter.nc000066400000000000000000000063051207233610700204210ustar00rootroot00000000000000//$Id: Counter.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * A Counter counts time in some units and in some width, signaling * overflow. * *

      A Counter is parameterised by its "precision" (milliseconds, * microseconds, etc), identified by a type. This prevents, e.g., * unintentionally mixing components expecting milliseconds with those * expecting microseconds as those interfaces have a different type. * *

      A Counter's second parameter is its "width", i.e., the number of * bits used to represent time values. Width is indicated by including * the appropriate size integer type as a Counter parameter. * *

      See TEP102 for more details. * * @param precision_tag A type indicating the precision of this Counter. * @param size_type An integer type representing time values for this Counter. * * @author Cory Sharp */ interface Counter { /** * Return counter value. Counters start at boot - some time sources may * stop counting while the processor is in low-power mode. * @return Current counter value. */ async command size_type get(); /** * Return TRUE if an overflow event will occur after the outermost atomic * block is exits. FALSE otherwise. * @return Counter pending overflow status. */ async command bool isOverflowPending(); /** * Cancel a pending overflow interrupt. */ async command void clearOverflow(); /** * Signals that the current time has overflowed. That is, the current * time has wrapped around from its maximum value to zero. */ async event void overflow(); } tinyos-2.1.2+dfsg/tos/lib/timer/CounterToLocalTimeC.nc000066400000000000000000000043661207233610700226260ustar00rootroot00000000000000//$Id: CounterToLocalTimeC.nc,v 1.6 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * CounterToLocalTimeC converts a 32-bit LocalTime to a Counter. * *

      See TEP102 for more details. * @param precision_tag A type indicating the precision of the LocalTime and * Counter being converted. * * @author Cory Sharp */ generic module CounterToLocalTimeC(typedef precision_tag) @safe() { provides interface LocalTime; uses interface Counter; } implementation { async command uint32_t LocalTime.get() { return call Counter.get(); } async event void Counter.overflow() { } } tinyos-2.1.2+dfsg/tos/lib/timer/LocalTime.nc000066400000000000000000000050171207233610700206520ustar00rootroot00000000000000//$Id: LocalTime.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * A LocalTime interface counts time in some units. If you need to detect * time overflow, you should use a component offering the Counter * interface. * *

      The LocalTime interface is parameterised by its "precision" * (milliseconds, microseconds, etc), identified by a type. This prevents, * e.g., unintentionally mixing components expecting milliseconds with * those expecting microseconds as those interfaces have a different type. * *

      See TEP102 for more details. * * @param precision_tag A type indicating the precision of this Counter. * * @author Cory Sharp */ interface LocalTime { /** * Return current time. Time starts counting at boot - some time sources * may stop counting while the processor is in low-power mode. * * @return Current time. */ async command uint32_t get(); } tinyos-2.1.2+dfsg/tos/lib/timer/LocalTime32khzC.nc000066400000000000000000000037311207233610700216400ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "Timer.h" /** Provide the current time in 32KHz ticks. * * @author Peter A. Bigot */ configuration LocalTime32khzC { provides interface LocalTime; } implementation { components Counter32khz32C; components new CounterToLocalTimeC(T32khz) as CounterToLocalTime32khzC; CounterToLocalTime32khzC.Counter -> Counter32khz32C; LocalTime = CounterToLocalTime32khzC; } tinyos-2.1.2+dfsg/tos/lib/timer/LocalTimeMicroC.nc000066400000000000000000000037321207233610700217510ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "Timer.h" /** Provide the current time in microseconds. * * @author Peter A. Bigot */ configuration LocalTimeMicroC { provides interface LocalTime; } implementation { components CounterMicro32C; components new CounterToLocalTimeC(TMicro) as CounterToLocalTimeMicroC; CounterToLocalTimeMicroC.Counter -> CounterMicro32C; LocalTime = CounterToLocalTimeMicroC; } tinyos-2.1.2+dfsg/tos/lib/timer/LocalTimeSecondC.nc000066400000000000000000000037431207233610700221150ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "Timer.h" /** Provide the current time in whole seconds. * * @author Peter A. Bigot */ configuration LocalTimeSecondC { provides interface LocalTime; } implementation { components CounterSecond32C; components new CounterToLocalTimeC(TSecond) as CounterToLocalTimeSecondC; CounterToLocalTimeSecondC.Counter -> CounterSecond32C; LocalTime = CounterToLocalTimeSecondC; } tinyos-2.1.2+dfsg/tos/lib/timer/MultiplexAlarm.h000066400000000000000000000044501207233610700215700ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef MULTIPLEX_ALARM_H_ #define MULTIPLEX_ALARM_H_ /** Unique marker for multiplexed 16-bit whole-second alarms */ #define UQ_MuxAlarmSecond16 "UQ_MuxAlarmSecond16" /** Unique marker for multiplexed 32-bit whole-second alarms */ #define UQ_MuxAlarmSecond32 "UQ_MuxAlarmSecond32" /** Unique marker for multiplexed 16-bit millisecond alarms */ #define UQ_MuxAlarmMilli16 "UQ_MuxAlarmMilli16" /** Unique marker for multiplexed 32-bit millisecond alarms */ #define UQ_MuxAlarmMilli32 "UQ_MuxAlarmMilli32" /** Unique marker for multiplexed 16-bit 32KHz alarms */ #define UQ_MuxAlarm32khz16 "UQ_MuxAlarm32khz16" /** Unique marker for multiplexed 32-bit 32KHz alarms */ #define UQ_MuxAlarm32khz32 "UQ_MuxAlarm32khz32" #endif /* MULTIPLEX_ALARM_H_ */ tinyos-2.1.2+dfsg/tos/lib/timer/MuxAlarm32khz16C.nc000066400000000000000000000041551207233610700216650ustar00rootroot00000000000000/* DO NOT MODIFY * This file cloned from MuxAlarmMilli32C.nc for PRECISION_TAG=32khz and SIZE_TYPE=16 */ /* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "MultiplexAlarm.h" /** Provide a client-specific instance of a multiplexed alarm with * precision T32khz and size uint16_t. * * @author Peter A. Bigot */ generic configuration MuxAlarm32khz16C () { provides { interface Alarm; } } implementation { enum { CLIENT_ID = unique(UQ_MuxAlarm32khz16), }; components MuxAlarm32khz16C_; Alarm = MuxAlarm32khz16C_.ClientAlarm[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/lib/timer/MuxAlarm32khz16C_.nc000066400000000000000000000052221207233610700220200ustar00rootroot00000000000000/* DO NOT MODIFY * This file cloned from MuxAlarmMilli32C_.nc for PRECISION_TAG=32khz and SIZE_TYPE=16 */ /* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "MultiplexAlarm.h" #include /** The base component used for multiplexing client alarms onto a * single hardware alarm with precision T32khz and size uint16_t. * * For debugging purposes, the DEBUG_MULTIPLEX_ALARM preprocessor * simple will export an interface that allows inspection of the * internal details of the multiplex structures. When it is used, the * underlying Alarm interface that is multiplexed is also published to * allow more controlled testing using a controlled alarm * implementation. * * @author Peter A. Bigot */ configuration MuxAlarm32khz16C_ { provides interface Alarm as ClientAlarm[ uint8_t client_id ]; } implementation { components new VirtualizeAlarmC(T32khz, uint16_t, uniqueCount(UQ_MuxAlarm32khz16)); ClientAlarm = VirtualizeAlarmC.Alarm; components MainC; MainC.SoftwareInit -> VirtualizeAlarmC.Init; components new Alarm32khz16C(); VirtualizeAlarmC.AlarmFrom -> Alarm32khz16C; } tinyos-2.1.2+dfsg/tos/lib/timer/MuxAlarm32khz32C.nc000066400000000000000000000041551207233610700216630ustar00rootroot00000000000000/* DO NOT MODIFY * This file cloned from MuxAlarmMilli32C.nc for PRECISION_TAG=32khz and SIZE_TYPE=32 */ /* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "MultiplexAlarm.h" /** Provide a client-specific instance of a multiplexed alarm with * precision T32khz and size uint32_t. * * @author Peter A. Bigot */ generic configuration MuxAlarm32khz32C () { provides { interface Alarm; } } implementation { enum { CLIENT_ID = unique(UQ_MuxAlarm32khz32), }; components MuxAlarm32khz32C_; Alarm = MuxAlarm32khz32C_.ClientAlarm[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/lib/timer/MuxAlarm32khz32C_.nc000066400000000000000000000052221207233610700220160ustar00rootroot00000000000000/* DO NOT MODIFY * This file cloned from MuxAlarmMilli32C_.nc for PRECISION_TAG=32khz and SIZE_TYPE=32 */ /* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "MultiplexAlarm.h" #include /** The base component used for multiplexing client alarms onto a * single hardware alarm with precision T32khz and size uint32_t. * * For debugging purposes, the DEBUG_MULTIPLEX_ALARM preprocessor * simple will export an interface that allows inspection of the * internal details of the multiplex structures. When it is used, the * underlying Alarm interface that is multiplexed is also published to * allow more controlled testing using a controlled alarm * implementation. * * @author Peter A. Bigot */ configuration MuxAlarm32khz32C_ { provides interface Alarm as ClientAlarm[ uint8_t client_id ]; } implementation { components new VirtualizeAlarmC(T32khz, uint32_t, uniqueCount(UQ_MuxAlarm32khz32)); ClientAlarm = VirtualizeAlarmC.Alarm; components MainC; MainC.SoftwareInit -> VirtualizeAlarmC.Init; components new Alarm32khz32C(); VirtualizeAlarmC.AlarmFrom -> Alarm32khz32C; } tinyos-2.1.2+dfsg/tos/lib/timer/MuxAlarmMilli16C.nc000066400000000000000000000041551207233610700217720ustar00rootroot00000000000000/* DO NOT MODIFY * This file cloned from MuxAlarmMilli32C.nc for PRECISION_TAG=Milli and SIZE_TYPE=16 */ /* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "MultiplexAlarm.h" /** Provide a client-specific instance of a multiplexed alarm with * precision TMilli and size uint16_t. * * @author Peter A. Bigot */ generic configuration MuxAlarmMilli16C () { provides { interface Alarm; } } implementation { enum { CLIENT_ID = unique(UQ_MuxAlarmMilli16), }; components MuxAlarmMilli16C_; Alarm = MuxAlarmMilli16C_.ClientAlarm[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/lib/timer/MuxAlarmMilli16C_.nc000066400000000000000000000052221207233610700221250ustar00rootroot00000000000000/* DO NOT MODIFY * This file cloned from MuxAlarmMilli32C_.nc for PRECISION_TAG=Milli and SIZE_TYPE=16 */ /* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "MultiplexAlarm.h" #include /** The base component used for multiplexing client alarms onto a * single hardware alarm with precision TMilli and size uint16_t. * * For debugging purposes, the DEBUG_MULTIPLEX_ALARM preprocessor * simple will export an interface that allows inspection of the * internal details of the multiplex structures. When it is used, the * underlying Alarm interface that is multiplexed is also published to * allow more controlled testing using a controlled alarm * implementation. * * @author Peter A. Bigot */ configuration MuxAlarmMilli16C_ { provides interface Alarm as ClientAlarm[ uint8_t client_id ]; } implementation { components new VirtualizeAlarmC(TMilli, uint16_t, uniqueCount(UQ_MuxAlarmMilli16)); ClientAlarm = VirtualizeAlarmC.Alarm; components MainC; MainC.SoftwareInit -> VirtualizeAlarmC.Init; components new AlarmMilli16C(); VirtualizeAlarmC.AlarmFrom -> AlarmMilli16C; } tinyos-2.1.2+dfsg/tos/lib/timer/MuxAlarmMilli32C.nc000066400000000000000000000040031207233610700217600ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "MultiplexAlarm.h" /** Provide a client-specific instance of a multiplexed alarm with * precision TMilli and size uint32_t. * * @author Peter A. Bigot */ generic configuration MuxAlarmMilli32C () { provides { interface Alarm; } } implementation { enum { CLIENT_ID = unique(UQ_MuxAlarmMilli32), }; components MuxAlarmMilli32C_; Alarm = MuxAlarmMilli32C_.ClientAlarm[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/lib/timer/MuxAlarmMilli32C_.nc000066400000000000000000000050471207233610700221300ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "MultiplexAlarm.h" #include /** The base component used for multiplexing client alarms onto a * single hardware alarm with precision TMilli and size uint32_t. * * For debugging purposes, the DEBUG_MULTIPLEX_ALARM preprocessor * simple will export an interface that allows inspection of the * internal details of the multiplex structures. When it is used, the * underlying Alarm interface that is multiplexed is also published to * allow more controlled testing using a controlled alarm * implementation. * * @author Peter A. Bigot */ configuration MuxAlarmMilli32C_ { provides interface Alarm as ClientAlarm[ uint8_t client_id ]; } implementation { components new VirtualizeAlarmC(TMilli, uint32_t, uniqueCount(UQ_MuxAlarmMilli32)); ClientAlarm = VirtualizeAlarmC.Alarm; components MainC; MainC.SoftwareInit -> VirtualizeAlarmC.Init; components new AlarmMilli32C(); VirtualizeAlarmC.AlarmFrom -> AlarmMilli32C; } tinyos-2.1.2+dfsg/tos/lib/timer/MuxAlarmSecond16C.nc000066400000000000000000000041641207233610700221370ustar00rootroot00000000000000/* DO NOT MODIFY * This file cloned from MuxAlarmMilli32C.nc for PRECISION_TAG=Second and SIZE_TYPE=16 */ /* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "MultiplexAlarm.h" /** Provide a client-specific instance of a multiplexed alarm with * precision TSecond and size uint16_t. * * @author Peter A. Bigot */ generic configuration MuxAlarmSecond16C () { provides { interface Alarm; } } implementation { enum { CLIENT_ID = unique(UQ_MuxAlarmSecond16), }; components MuxAlarmSecond16C_; Alarm = MuxAlarmSecond16C_.ClientAlarm[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/lib/timer/MuxAlarmSecond16C_.nc000066400000000000000000000052321207233610700222730ustar00rootroot00000000000000/* DO NOT MODIFY * This file cloned from MuxAlarmMilli32C_.nc for PRECISION_TAG=Second and SIZE_TYPE=16 */ /* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "MultiplexAlarm.h" #include /** The base component used for multiplexing client alarms onto a * single hardware alarm with precision TSecond and size uint16_t. * * For debugging purposes, the DEBUG_MULTIPLEX_ALARM preprocessor * simple will export an interface that allows inspection of the * internal details of the multiplex structures. When it is used, the * underlying Alarm interface that is multiplexed is also published to * allow more controlled testing using a controlled alarm * implementation. * * @author Peter A. Bigot */ configuration MuxAlarmSecond16C_ { provides interface Alarm as ClientAlarm[ uint8_t client_id ]; } implementation { components new VirtualizeAlarmC(TSecond, uint16_t, uniqueCount(UQ_MuxAlarmSecond16)); ClientAlarm = VirtualizeAlarmC.Alarm; components MainC; MainC.SoftwareInit -> VirtualizeAlarmC.Init; components new AlarmSecond16C(); VirtualizeAlarmC.AlarmFrom -> AlarmSecond16C; } tinyos-2.1.2+dfsg/tos/lib/timer/MuxAlarmSecond32C.nc000066400000000000000000000041641207233610700221350ustar00rootroot00000000000000/* DO NOT MODIFY * This file cloned from MuxAlarmMilli32C.nc for PRECISION_TAG=Second and SIZE_TYPE=32 */ /* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "MultiplexAlarm.h" /** Provide a client-specific instance of a multiplexed alarm with * precision TSecond and size uint32_t. * * @author Peter A. Bigot */ generic configuration MuxAlarmSecond32C () { provides { interface Alarm; } } implementation { enum { CLIENT_ID = unique(UQ_MuxAlarmSecond32), }; components MuxAlarmSecond32C_; Alarm = MuxAlarmSecond32C_.ClientAlarm[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/lib/timer/MuxAlarmSecond32C_.nc000066400000000000000000000052321207233610700222710ustar00rootroot00000000000000/* DO NOT MODIFY * This file cloned from MuxAlarmMilli32C_.nc for PRECISION_TAG=Second and SIZE_TYPE=32 */ /* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "MultiplexAlarm.h" #include /** The base component used for multiplexing client alarms onto a * single hardware alarm with precision TSecond and size uint32_t. * * For debugging purposes, the DEBUG_MULTIPLEX_ALARM preprocessor * simple will export an interface that allows inspection of the * internal details of the multiplex structures. When it is used, the * underlying Alarm interface that is multiplexed is also published to * allow more controlled testing using a controlled alarm * implementation. * * @author Peter A. Bigot */ configuration MuxAlarmSecond32C_ { provides interface Alarm as ClientAlarm[ uint8_t client_id ]; } implementation { components new VirtualizeAlarmC(TSecond, uint32_t, uniqueCount(UQ_MuxAlarmSecond32)); ClientAlarm = VirtualizeAlarmC.Alarm; components MainC; MainC.SoftwareInit -> VirtualizeAlarmC.Init; components new AlarmSecond32C(); VirtualizeAlarmC.AlarmFrom -> AlarmSecond32C; } tinyos-2.1.2+dfsg/tos/lib/timer/README.txt000066400000000000000000000015711207233610700201560ustar00rootroot00000000000000This directory contains support for components that allow up to 256 individually managed alarms to be multiplexed onto a single hardware alarm. The bulk of the implementation uses the TinyOS VirtualizeAlarmC component, which is a generic that takes the alarm precision and size as parameters. User code must instantiate new instances of a component where the precision and size are coded into the compnent name. To ease maintenance, only the MuxAlarmMilli32* files are maintained: all other precision/size combinations are derived from those by running the script generate.sh. The list of files that are derived are maintained in the file generated.lst, which itself is generated as a side effect of running generate.sh. When attempting to understand the system and do basic maintainance, it may be worth running: cat generated.lst | xargs rm to clear the clutter out of the way. tinyos-2.1.2+dfsg/tos/lib/timer/Timer.h000066400000000000000000000043001207233610700177020ustar00rootroot00000000000000//$Id: Timer.h,v 1.6 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ //@author Cory Sharp // The TinyOS Timer structures are discussed in TEP 102. #ifndef TIMER_H #define TIMER_H // @note TSecond is an extension to be added in a successor to TEP 102 typedef struct { int notUsed; } TSecond; typedef struct { int notUsed; } TMilli; typedef struct { int notUsed; } T32khz; typedef struct { int notUsed; } TMicro; #define UQ_TIMER_SECOND "HilTimerMicroC.Timer" #define UQ_TIMER_MILLI "HilTimerMilliC.Timer" #define UQ_TIMER_32KHZ "HilTimer32khzC.Timer" #define UQ_TIMER_MICRO "HilTimerMicroC.Timer" #endif tinyos-2.1.2+dfsg/tos/lib/timer/Timer.nc000066400000000000000000000125371207233610700200660ustar00rootroot00000000000000//$Id: Timer.nc,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * A Timer is TinyOS's general purpose timing interface. For more precise * timing, you may wish to use a (platform-specific) component offering * an Alarm interface. * *

      A Timer is parameterised by its "precision" (milliseconds, * microseconds, etc), identified by a type. This prevents, e.g., * unintentionally mixing components expecting milliseconds with those * expecting microseconds as those interfaces have a different type. * *

      See TEP102 for more details. * * @param precision_tag A type indicating the precision of this Alarm. * * @author Cory Sharp */ interface Timer { // basic interface /** * Set a periodic timer to repeat every dt time units. Replaces any * current timer settings. Equivalent to startPeriodicAt(getNow(), * dt). The fired will be signaled every dt units (first * event in dt units). * * @param dt Time until the timer fires. */ command void startPeriodic(uint32_t dt); /** * Set a single-short timer to some time units in the future. Replaces * any current timer settings. Equivalent to startOneShotAt(getNow(), * dt). The fired will be signaled when the timer expires. * * @param dt Time until the timer fires. */ command void startOneShot(uint32_t dt); /** * Cancel a timer. */ command void stop(); /** * Signaled when the timer expires (one-shot) or repeats (periodic). */ event void fired(); // extended interface /** * Check if timer is running. Periodic timers run until stopped or * replaced, one-shot timers run until their deadline expires. * * @return TRUE if the timer is still running. */ command bool isRunning(); /** * Check if this is a one-shot timer. * @return TRUE for one-shot timers, FALSE for periodic timers. */ command bool isOneShot(); /** * Set a periodic timer to repeat every dt time units. Replaces any * current timer settings. The fired will be signaled every * dt units (first event at t0+dt units). Periodic timers set in the past * will get a bunch of events in succession, until the timer "catches up". * *

      Because the current time may wrap around, it is possible to use * values of t0 greater than the getNow's result. These * values represent times in the past, i.e., the time at which getNow() * would last of returned that value. * * @param t0 Base time for timer. * @param dt Time until the timer fires. */ command void startPeriodicAt(uint32_t t0, uint32_t dt); /** * Set a single-short timer to time t0+dt. Replaces any current timer * settings. The fired will be signaled when the timer * expires. Timers set in the past will fire "soon". * *

      Because the current time may wrap around, it is possible to use * values of t0 greater than the getNow's result. These * values represent times in the past, i.e., the time at which getNow() * would last of returned that value. * * @param t0 Base time for timer. * @param dt Time until the timer fires. */ command void startOneShotAt(uint32_t t0, uint32_t dt); /** * Return the current time. * @return Current time. */ command uint32_t getNow(); /** * Return the time anchor for the previously started timer or the time of * the previous event for periodic timers. The next fired event will occur * at gett0() + getdt(). * @return Timer's base time. */ command uint32_t gett0(); /** * Return the delay or period for the previously started timer. The next * fired event will occur at gett0() + getdt(). * @return Timer's interval. */ command uint32_t getdt(); } tinyos-2.1.2+dfsg/tos/lib/timer/TransformAlarmC.nc000066400000000000000000000117151207233610700220360ustar00rootroot00000000000000//$Id: TransformAlarmC.nc,v 1.6 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * TransformAlarmC decreases precision and/or widens an Alarm. An already * widened Counter component is used to help. * *

      See TEP102 for more details. * @param to_precision_tag A type indicating the precision of the transformed * Alarm. * @param to_size_type The type for the width of the transformed Alarm. * @param from_precision_tag A type indicating the precision of the original * Alarm. * @param from_size_type The type for the width of the original Alarm. * @param bit_shift_right Original time units will be 2 to the power * bit_shift_right larger than transformed time units. * * @author Cory Sharp */ generic module TransformAlarmC( typedef to_precision_tag, typedef to_size_type @integer(), typedef from_precision_tag, typedef from_size_type @integer(), uint8_t bit_shift_right) @safe() { /** * The transformed Alarm. */ provides interface Alarm; /** * Users of this component must wire Counter to an already-widened * Counter (with the same precision as the new Alarm). See * TransformCounterC for one possible implementation. */ uses interface Counter; /** * The original Alarm. */ uses interface Alarm as AlarmFrom; } implementation { to_size_type m_t0; to_size_type m_dt; enum { MAX_DELAY_LOG2 = 8 * sizeof(from_size_type) - 1 - bit_shift_right, MAX_DELAY = ((to_size_type)1) << MAX_DELAY_LOG2, }; async command to_size_type Alarm.getNow() { return call Counter.get(); } async command to_size_type Alarm.getAlarm() { atomic return m_t0 + m_dt; //return m_t0 + m_dt; } async command bool Alarm.isRunning() { return call AlarmFrom.isRunning(); } async command void Alarm.stop() { call AlarmFrom.stop(); } void set_alarm() { to_size_type now = call Counter.get(), expires, remaining; /* m_t0 is assumed to be in the past. If it's > now, we assume that time has wrapped around */ expires = m_t0 + m_dt; /* The cast is necessary to get correct wrap-around arithmetic */ remaining = (to_size_type)(expires - now); /* if (expires <= now) remaining = 0; in wrap-around arithmetic */ if (m_t0 <= now) { if (expires >= m_t0 && // if it wraps, it's > now expires <= now) remaining = 0; } else { if (expires >= m_t0 || // didn't wrap so < now expires <= now) remaining = 0; } if (remaining > MAX_DELAY) { m_t0 = now + MAX_DELAY; m_dt = remaining - MAX_DELAY; remaining = MAX_DELAY; } else { m_t0 += m_dt; m_dt = 0; } call AlarmFrom.startAt((from_size_type)now << bit_shift_right, (from_size_type)remaining << bit_shift_right); } async command void Alarm.startAt(to_size_type t0, to_size_type dt) { atomic { m_t0 = t0; m_dt = dt; set_alarm(); } } async command void Alarm.start(to_size_type dt) { call Alarm.startAt(call Alarm.getNow(), dt); } async event void AlarmFrom.fired() { atomic { if(m_dt == 0) { signal Alarm.fired(); } else { set_alarm(); } } } async event void Counter.overflow() { } default async event void Alarm.fired() { } } tinyos-2.1.2+dfsg/tos/lib/timer/TransformAlarmCounterC.nc000066400000000000000000000175531207233610700234040ustar00rootroot00000000000000//$Id: TransformAlarmCounterC.nc,v 1.7 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * TransformAlarmCounterC decreases precision and/or widens an Alarm/Counter * pair. This component has a reduced interrupt overhead compared to using * TransformAlarmC and TransformCounterC separately. However, it is not as * useful for hardware timers with multiple compare registers. * * @param to_precision_tag A type indicating the precision of the transformed * interfaces. * @param to_size_type The type for the width of the transformed interfaces. * @param from_precision_tag A type indicating the precision of the original * interfaces. * @param from_size_type The type for the width of the original interfaces. * @param bit_shift_right Original time units will be 2 to the power * bit_shift_right larger than transformed time units. * @param upper_count_type A type large enough to store the upper bits -- * those needed above from_size_type after its shift right to fill * to_size_type. * * @author Cory Sharp * @author David Gay */ generic module TransformAlarmCounterC( typedef to_precision_tag, typedef to_size_type @integer(), typedef from_precision_tag, typedef from_size_type @integer(), uint8_t bit_shift_right, typedef upper_count_type @integer() ) { provides interface Alarm as Alarm; provides interface Counter as Counter; uses interface Counter as CounterFrom; uses interface Alarm as AlarmFrom; } implementation { upper_count_type m_upper; to_size_type m_t0; to_size_type m_dt; uint8_t m_skip_overflows; enum { MAX_DELAY_LOG2 = 8 * sizeof(from_size_type) - 1 - bit_shift_right, MAX_DELAY = ((to_size_type)1) << MAX_DELAY_LOG2, }; enum { LOW_SHIFT_RIGHT = bit_shift_right, HIGH_SHIFT_LEFT = 8*sizeof(from_size_type) - LOW_SHIFT_RIGHT, NUM_UPPER_BITS = 8*sizeof(to_size_type) - 8*sizeof(from_size_type) + bit_shift_right, // 1. hack to remove warning when NUM_UPPER_BITS == 8*sizeof(upper_count_type) // 2. still provide warning if NUM_UPPER_BITS > 8*sizeof(upper_count_type) // 3. and allow for the strange case of NUM_UPPER_BITS == 0 OVERFLOW_MASK = NUM_UPPER_BITS ? ((((upper_count_type)2) << (NUM_UPPER_BITS-1)) - 1) : 0, }; void set_alarm(); async command to_size_type Counter.get() { to_size_type rv = 0; atomic { upper_count_type high = m_upper; from_size_type low = call CounterFrom.get(); if (call CounterFrom.isOverflowPending()) { // If we signalled CounterFrom.overflow, that might trigger a // Counter.overflow, which breaks atomicity. The right thing to do // increment a cached version of high without overflow signals. // m_upper will be handled normally as soon as the out-most atomic // block is left unless Clear.clearOverflow is called in the interim. // This is all together the expected behavior. high++; low = call CounterFrom.get(); } { to_size_type high_to = high; to_size_type low_to = low >> LOW_SHIFT_RIGHT; rv = (high_to << HIGH_SHIFT_LEFT) | low_to; } } return rv; } // isOverflowPending only makes sense when it's already part of a larger // async block, so there's no async inside the command itself, where it // wouldn't do anything useful. async command bool Counter.isOverflowPending() { return ((m_upper & OVERFLOW_MASK) == OVERFLOW_MASK) && call CounterFrom.isOverflowPending(); } // clearOverflow also only makes sense inside a larger atomic block, but we // include the inner atomic block to ensure consistent internal state just in // case someone calls it non-atomically. async command void Counter.clearOverflow() { atomic { if (call Counter.isOverflowPending()) { m_upper++; call CounterFrom.clearOverflow(); } } } async event void CounterFrom.overflow() { atomic { m_upper++; if ((m_upper & OVERFLOW_MASK) == 0) signal Counter.overflow(); if (m_skip_overflows && !--m_skip_overflows) set_alarm(); } } async command to_size_type Alarm.getNow() { return call Counter.get(); } async command to_size_type Alarm.getAlarm() { atomic return m_t0 + m_dt; } async command bool Alarm.isRunning() { atomic return call AlarmFrom.isRunning() || m_skip_overflows; } async command void Alarm.stop() { call AlarmFrom.stop(); } void set_alarm() { to_size_type now = call Counter.get(), elapsed = now - m_t0, remaining; m_skip_overflows = 0; if (elapsed >= m_dt) { remaining = 0; m_t0 += m_dt; m_dt = 0; } else { remaining = m_dt - elapsed; /* MAX_DELAY is 1/2 an underlying counter overflow time. Just count overflows if the timer is far in the future, and we'll set an alarm once we're close to the deadline. */ if (remaining > MAX_DELAY * 2) { if (remaining >= MAX_DELAY * 2 * (to_size_type)256) m_skip_overflows = 255; else m_skip_overflows = remaining / (MAX_DELAY * 2); return; } if (remaining > MAX_DELAY) { m_t0 = now + MAX_DELAY; m_dt = remaining - MAX_DELAY; remaining = MAX_DELAY; } else { m_t0 += m_dt; m_dt = 0; } } call AlarmFrom.startAt((from_size_type)now << bit_shift_right, (from_size_type)remaining << bit_shift_right); } async command void Alarm.startAt(to_size_type t0, to_size_type dt) { atomic { m_t0 = t0; m_dt = dt; set_alarm(); } } async command void Alarm.start(to_size_type dt) { call Alarm.startAt(call Alarm.getNow(), dt); } async event void AlarmFrom.fired() { atomic { if (m_dt == 0) { signal Alarm.fired(); } else { set_alarm(); } } } default async event void Alarm.fired() { } default async event void Counter.overflow() { } } tinyos-2.1.2+dfsg/tos/lib/timer/TransformCounterC.nc000066400000000000000000000120731207233610700224170ustar00rootroot00000000000000//$Id: TransformCounterC.nc,v 1.6 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * TransformCounterC decreases precision and/or widens an Counter. * *

      See TEP102 for more details. * * @param to_precision_tag A type indicating the precision of the transformed * Counter. * @param to_size_type The type for the width of the transformed Counter. * @param from_precision_tag A type indicating the precision of the original * Counter. * @param from_size_type The type for the width of the original Counter. * @param bit_shift_right Original time units will be 2 to the power * bit_shift_right larger than transformed time units. * @param upper_count_type A type large enough to store the upper bits -- * those needed above from_size_type after its shift right to fill * to_size_type. * * @author Cory Sharp */ generic module TransformCounterC( typedef to_precision_tag, typedef to_size_type @integer(), typedef from_precision_tag, typedef from_size_type @integer(), uint8_t bit_shift_right, typedef upper_count_type @integer()) @safe() { provides interface Counter as Counter; uses interface Counter as CounterFrom; } implementation { upper_count_type m_upper; enum { LOW_SHIFT_RIGHT = bit_shift_right, HIGH_SHIFT_LEFT = 8*sizeof(from_size_type) - LOW_SHIFT_RIGHT, NUM_UPPER_BITS = 8*sizeof(to_size_type) - 8*sizeof(from_size_type) + bit_shift_right, // 1. hack to remove warning when NUM_UPPER_BITS == 8*sizeof(upper_count_type) // 2. still provide warning if NUM_UPPER_BITS > 8*sizeof(upper_count_type) // 3. and allow for the strange case of NUM_UPPER_BITS == 0 OVERFLOW_MASK = NUM_UPPER_BITS ? ((((upper_count_type)2) << (NUM_UPPER_BITS-1)) - 1) : 0, }; async command to_size_type Counter.get() { to_size_type rv = 0; atomic { upper_count_type high = m_upper; from_size_type low = call CounterFrom.get(); if (call CounterFrom.isOverflowPending()) { // If we signalled CounterFrom.overflow, that might trigger a // Counter.overflow, which breaks atomicity. The right thing to do // increment a cached version of high without overflow signals. // m_upper will be handled normally as soon as the out-most atomic // block is left unless Clear.clearOverflow is called in the interim. // This is all together the expected behavior. high++; low = call CounterFrom.get(); } { to_size_type high_to = high; to_size_type low_to = low >> LOW_SHIFT_RIGHT; rv = (high_to << HIGH_SHIFT_LEFT) | low_to; } } return rv; } // isOverflowPending only makes sense when it's already part of a larger // async block, so there's no async inside the command itself, where it // wouldn't do anything useful. async command bool Counter.isOverflowPending() { return ((m_upper & OVERFLOW_MASK) == OVERFLOW_MASK) && call CounterFrom.isOverflowPending(); } // clearOverflow also only makes sense inside a larger atomic block, but we // include the inner atomic block to ensure consistent internal state just in // case someone calls it non-atomically. async command void Counter.clearOverflow() { atomic { if (call Counter.isOverflowPending()) { m_upper++; call CounterFrom.clearOverflow(); } } } async event void CounterFrom.overflow() { atomic { m_upper++; if ((m_upper & OVERFLOW_MASK) == 0) signal Counter.overflow(); } } } tinyos-2.1.2+dfsg/tos/lib/timer/VirtualizeAlarmC.nc000066400000000000000000000150071207233610700222170ustar00rootroot00000000000000//$Id: VirtualizeAlarmC.nc,v 1.8 2010-06-29 22:07:50 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * VirtualizeAlarmC uses a single Alarm to create up to 255 virtual alarms. * Note that a virtualized Alarm will have significantly more overhead than * an Alarm built on a hardware compare register. * * @param precision_tag A type indicating the precision of the Alarm being * virtualized. * @param num_alarms Number of virtual alarms to create. * * @author Cory Sharp */ generic module VirtualizeAlarmC(typedef precision_tag, typedef size_type @integer(), int num_alarms) { provides interface Init; provides interface Alarm as Alarm[uint8_t id]; uses interface Alarm as AlarmFrom; } implementation { enum { NUM_ALARMS = num_alarms, }; typedef struct { size_type t0; size_type dt; } alarm_t; // css 26 jul 2006: All computations with respect to the current time ("now") // require that "now" is (non-strictly) monotonically increasing. Calling // setNextAlarm within Alarm.start within Alarm.fired within signalAlarms // breaks this monotonicity requirements when "now" is cached at the start of // the function. Two ways around this: 1) refresh "now" each time it is // used, or 2) use the is_signaling flag to prevent setNextAlarm from being // called inside signalAlarms. The latter is generally more efficient by // preventing redundant calls to setNextAlarm at the expense of an extra byte // of RAM, so that's what the code does now. Update: option 2 is // unacceptable because an Alarm.start could be called within some other // Alarm.fired, which can break monotonicity in now. // A struct of member variables so only one memset is called for init. struct { alarm_t alarm[NUM_ALARMS]; bool isset[NUM_ALARMS]; bool is_signaling; } m; command error_t Init.init() { memset( &m, 0, sizeof(m) ); return SUCCESS; } void setNextAlarm() { if( !m.is_signaling ) { // css 25 jul 2006: To help prevent various problems with overflow, the // elapsed time from t0 for a particular alarm is calculated as // elapsed=now-t0 then dt-=elapsed and t0=now. However, this means that // now must be a monotonically increasing value with each call to // setNextAlarm -- overflow in now is okay, but passing in older values of // now=t0 for some arbitrary t0 is not okay, which is what the previous // version of setAlarm did. const size_type now = call AlarmFrom.getNow(); const alarm_t* pEnd = m.alarm+NUM_ALARMS; bool isset = FALSE; alarm_t* p = m.alarm; bool* pset = m.isset; size_type dt = ((size_type)0)-((size_type)1); for( ; p!=pEnd; p++,pset++ ) { if( *pset ) { size_type elapsed = now - p->t0; if( p->dt <= elapsed ) { p->t0 += p->dt; p->dt = 0; } else { p->t0 = now; p->dt -= elapsed; } if( p->dt <= dt ) { dt = p->dt; isset = TRUE; } } } if( isset ) { // css 25 jul 2006: If dt is big, then wait half of dt. This helps // significantly reduce the chance of overflow in the elapsed calculation // for the alarm. "big" is if the most signficant bit in dt is set. if( dt & (((size_type)1) << (8*sizeof(size_type)-1)) ) dt >>= 1; call AlarmFrom.startAt( now, dt ); } else { call AlarmFrom.stop(); } } } void signalAlarms() { uint8_t id; m.is_signaling = TRUE; for( id=0; idSee TEP102 for more details. * * @param precision_tag A type indicating the precision of the Timer being * virtualized. * @param max_timers Number of virtual timers to create. * * @author Cory Sharp */ generic module VirtualizeTimerC(typedef precision_tag, int max_timers) @safe() { provides interface Timer as Timer[uint8_t num]; uses interface Timer as TimerFrom; } implementation { enum { NUM_TIMERS = max_timers, END_OF_LIST = 255, }; typedef struct { uint32_t t0; uint32_t dt; bool isoneshot : 1; bool isrunning : 1; bool _reserved : 6; } Timer_t; Timer_t m_timers[NUM_TIMERS]; bool m_timers_changed; task void updateFromTimer(); void fireTimers(uint32_t now) { uint16_t num; for (num=0; numisrunning) { uint32_t elapsed = now - timer->t0; if (elapsed >= timer->dt) { if (timer->isoneshot) timer->isrunning = FALSE; else // Update timer for next event timer->t0 += timer->dt; signal Timer.fired[num](); break; } } } post updateFromTimer(); } task void updateFromTimer() { /* This code supports a maximum dt of MAXINT. If min_remaining and remaining were switched to uint32_t, and the logic changed a little, dt's up to 2^32-1 should work (but at a slightly higher runtime cost). */ uint32_t now = call TimerFrom.getNow(); int32_t min_remaining = (1UL << 31) - 1; /* max int32_t */ bool min_remaining_isset = FALSE; uint16_t num; call TimerFrom.stop(); for (num=0; numisrunning) { uint32_t elapsed = now - timer->t0; int32_t remaining = timer->dt - elapsed; if (remaining < min_remaining) { min_remaining = remaining; min_remaining_isset = TRUE; } } } if (min_remaining_isset) { if (min_remaining <= 0) fireTimers(now); else call TimerFrom.startOneShotAt(now, min_remaining); } } event void TimerFrom.fired() { fireTimers(call TimerFrom.getNow()); } void startTimer(uint8_t num, uint32_t t0, uint32_t dt, bool isoneshot) { Timer_t* timer = &m_timers[num]; timer->t0 = t0; timer->dt = dt; timer->isoneshot = isoneshot; timer->isrunning = TRUE; post updateFromTimer(); } command void Timer.startPeriodic[uint8_t num](uint32_t dt) { startTimer(num, call TimerFrom.getNow(), dt, FALSE); } command void Timer.startOneShot[uint8_t num](uint32_t dt) { startTimer(num, call TimerFrom.getNow(), dt, TRUE); } command void Timer.stop[uint8_t num]() { m_timers[num].isrunning = FALSE; } command bool Timer.isRunning[uint8_t num]() { return m_timers[num].isrunning; } command bool Timer.isOneShot[uint8_t num]() { return m_timers[num].isoneshot; } command void Timer.startPeriodicAt[uint8_t num](uint32_t t0, uint32_t dt) { startTimer(num, t0, dt, FALSE); } command void Timer.startOneShotAt[uint8_t num](uint32_t t0, uint32_t dt) { startTimer(num, t0, dt, TRUE); } command uint32_t Timer.getNow[uint8_t num]() { return call TimerFrom.getNow(); } command uint32_t Timer.gett0[uint8_t num]() { return m_timers[num].t0; } command uint32_t Timer.getdt[uint8_t num]() { return m_timers[num].dt; } default event void Timer.fired[uint8_t num]() { } } tinyos-2.1.2+dfsg/tos/lib/timer/generate.sh000066400000000000000000000030331207233610700206010ustar00rootroot00000000000000#!/bin/sh # # Given implementations for USCI_A0 and USCI_B0, generate equivalent # configurations for the higher-numbered module instances. # # Much of the USCI implementation is identical except for varying # based on the instance number of the module to which a component # belongs. To avoid implementation divergence, we maintain and evolve # only one of each type of component, and generate the remainder from # that template. # # @author Peter A. Bigot # List of precision tags PREC_TAGS="Second Milli 32khz" # List of size tags SIZE_TAGS="16 32" # Initialize a file that will contain a list of all generated files, # so we can remove them during basic maintenance. Their presence # clutters the directory and makes it difficult to see what's really # important. rm -f generated.lst BASIS_PREC=Milli BASIS_SIZE=32 clone_module () { source="$1" ; shift prec="$1" ; shift size="$1" ; shift sed_args="-e s@${BASIS_SIZE}@${size}@g -e s@${BASIS_PREC}@${prec}@g" target=$(echo ${source} | sed ${sed_args}) ( cat< ${target} echo ${target} >> generated.lst } for p in ${PREC_TAGS} ; do for s in ${SIZE_TAGS} ; do if [ "${BASIS_PREC}" = "${p}" -a "${BASIS_SIZE}" = "${s}" ] ; then continue fi clone_module MuxAlarm${BASIS_PREC}${BASIS_SIZE}C.nc ${p} ${s} clone_module MuxAlarm${BASIS_PREC}${BASIS_SIZE}C_.nc ${p} ${s} done done tinyos-2.1.2+dfsg/tos/lib/timer/generated.lst000066400000000000000000000003211207233610700211320ustar00rootroot00000000000000MuxAlarmSecond16C.nc MuxAlarmSecond16C_.nc MuxAlarmSecond32C.nc MuxAlarmSecond32C_.nc MuxAlarmMilli16C.nc MuxAlarmMilli16C_.nc MuxAlarm32khz16C.nc MuxAlarm32khz16C_.nc MuxAlarm32khz32C.nc MuxAlarm32khz32C_.nc tinyos-2.1.2+dfsg/tos/lib/timer/tests/000077500000000000000000000000001207233610700176165ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/timer/tests/AlarmUse/000077500000000000000000000000001207233610700213275ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/timer/tests/AlarmUse/Makefile000066400000000000000000000001331207233610700227640ustar00rootroot00000000000000COMPONENT=TestAppC TOSMAKE_PATH += . PFLAGS += -I$(TOSDIR)/lib/printf include $(MAKERULES) tinyos-2.1.2+dfsg/tos/lib/timer/tests/AlarmUse/README000066400000000000000000000011271207233610700222100ustar00rootroot00000000000000For full tests, do: 1) Test builds of all variants for different alarm counts: sh buildset.sh This verifies the builds, shows that only a limited number of alarms are available when usemux is off, and displays the size in ROM and RAM for each configuration to help assess the cost of using different types of timers/alarms. 2) Test multiple millisecond timers: make tmote usemux,1 install Led N should toggle at 8/(2^N) times per second 3) Test multiple whole-second timers make surf osian usemux,1 useprec,Second install Led N should toggle at 2^N second intervals tinyos-2.1.2+dfsg/tos/lib/timer/tests/AlarmUse/TestAppC.nc000066400000000000000000000035741207233610700233450ustar00rootroot00000000000000#include "config.h" configuration TestAppC { } implementation { components TestP; components MainC; TestP.Boot -> MainC; #if USE_MUX #define MaybeMuxAlarmC MuxAlarmPrecC #endif /* USE_MUX */ #if USE_TIMER #define MaybeMuxAlarmC TimerPrecC #endif /* USE_TIMER */ #ifndef MaybeMuxAlarmC #define MaybeMuxAlarmC AlarmPrecC #endif /* MaybeMuxAlarmC */ #include "PlatformLed.h" #if USE_LEDS components LedC; TestP.Led0 -> LedC.Led0; TestP.Led1 -> LedC.Led1; TestP.Led2 -> LedC.Led2; #if 3 < PLATFORM_LED_COUNT TestP.Led3 -> LedC.Led3; #if 4 < PLATFORM_LED_COUNT TestP.Led4 -> LedC.Led4; #if 5 < PLATFORM_LED_COUNT TestP.Led5 -> LedC.Led4; #if 6 < PLATFORM_LED_COUNT TestP.Led6 -> LedC.Led4; #if 7 < PLATFORM_LED_COUNT TestP.Led7 -> LedC.Led4; #endif /* 7 < PLATFORM_LED_COUNT */ #endif /* 6 < PLATFORM_LED_COUNT */ #endif /* 5 < PLATFORM_LED_COUNT */ #endif /* 4 < PLATFORM_LED_COUNT */ #endif /* 3 < PLATFORM_LED_COUNT */ #endif /* USE_LEDS */ components new MaybeMuxAlarmC() as Alarm0C; TestP.Alarm0 -> Alarm0C; #if 1 < ALARM_COUNT components new MaybeMuxAlarmC() as Alarm1C; TestP.Alarm1 -> Alarm1C; #if 2 < ALARM_COUNT components new MaybeMuxAlarmC() as Alarm2C; TestP.Alarm2 -> Alarm2C; #if 3 < ALARM_COUNT components new MaybeMuxAlarmC() as Alarm3C; TestP.Alarm3 -> Alarm3C; #if 4 < ALARM_COUNT components new MaybeMuxAlarmC() as Alarm4C; TestP.Alarm4 -> Alarm4C; #if 5 < ALARM_COUNT components new MaybeMuxAlarmC() as Alarm5C; TestP.Alarm5 -> Alarm5C; #if 6 < ALARM_COUNT components new MaybeMuxAlarmC() as Alarm6C; TestP.Alarm6 -> Alarm6C; #if 7 < ALARM_COUNT components new MaybeMuxAlarmC() as Alarm7C; TestP.Alarm7 -> Alarm7C; #endif /* ALARM_COUNT 7 */ #endif /* ALARM_COUNT 6 */ #endif /* ALARM_COUNT 5 */ #endif /* ALARM_COUNT 4 */ #endif /* ALARM_COUNT 3 */ #endif /* ALARM_COUNT 2 */ #endif /* ALARM_COUNT 1 */ components SerialPrintfC; } tinyos-2.1.2+dfsg/tos/lib/timer/tests/AlarmUse/TestP.nc000066400000000000000000000062431207233610700227150ustar00rootroot00000000000000#include "config.h" #include #if USE_LEDS #define TOGGLE(_n) call Led##_n.toggle() #else #define TOGGLE(_n) do { ; } while(0) #endif #if USE_TIMER #define DECL_INTERFACE(_n) interface Timer as Alarm##_n #define DEFN_FIRED(_n) \ event void Alarm##_n.fired () \ { \ TOGGLE(_n); \ call Alarm##_n.startOneShot(1UL << (_n + BASE_SHIFT)); \ } #define CALL_START(_n) call Alarm##_n.startOneShot(0) #else #define DECL_INTERFACE(_n) interface Alarm as Alarm##_n #define DEFN_FIRED(_n) \ async event void Alarm##_n.fired () \ { \ TOGGLE(_n); \ call Alarm##_n.start(1UL << (_n + BASE_SHIFT)); \ } #define CALL_START(_n) call Alarm##_n.start(0) #endif module TestP { uses { interface Boot; #if USE_LEDS interface Led as Led0; interface Led as Led1; interface Led as Led2; interface Led as Led3; interface Led as Led4; interface Led as Led5; interface Led as Led6; interface Led as Led7; #endif /* USE_LEDS */ DECL_INTERFACE(0); #if 1 < ALARM_COUNT DECL_INTERFACE(1); #if 2 < ALARM_COUNT DECL_INTERFACE(2); #if 3 < ALARM_COUNT DECL_INTERFACE(3); #if 4 < ALARM_COUNT DECL_INTERFACE(4); #if 5 < ALARM_COUNT DECL_INTERFACE(5); #if 6 < ALARM_COUNT DECL_INTERFACE(6); #if 7 < ALARM_COUNT DECL_INTERFACE(7); #endif /* ALARM_COUNT 7 */ #endif /* ALARM_COUNT 6 */ #endif /* ALARM_COUNT 5 */ #endif /* ALARM_COUNT 4 */ #endif /* ALARM_COUNT 3 */ #endif /* ALARM_COUNT 2 */ #endif /* ALARM_COUNT 1 */ } } implementation { DEFN_FIRED(0) #if 1 < ALARM_COUNT DEFN_FIRED(1) #if 2 < ALARM_COUNT DEFN_FIRED(2) #if 3 < ALARM_COUNT DEFN_FIRED(3) #if 4 < ALARM_COUNT DEFN_FIRED(4) #if 5 < ALARM_COUNT DEFN_FIRED(5) #if 6 < ALARM_COUNT DEFN_FIRED(6) #if 7 < ALARM_COUNT DEFN_FIRED(7) #endif /* ALARM_COUNT 7 */ #endif /* ALARM_COUNT 6 */ #endif /* ALARM_COUNT 5 */ #endif /* ALARM_COUNT 4 */ #endif /* ALARM_COUNT 3 */ #endif /* ALARM_COUNT 2 */ #endif /* ALARM_COUNT 1 */ #if USE_LEDS default async command void Led0.toggle() { } default async command void Led1.toggle() { } default async command void Led2.toggle() { } default async command void Led3.toggle() { } default async command void Led4.toggle() { } default async command void Led5.toggle() { } default async command void Led6.toggle() { } default async command void Led7.toggle() { } #endif event void Boot.booted () { printf("Starting with %u %s alarms\r\n", ALARM_COUNT, #if USE_TIMER "timer" #else /* USE_TIMER */ #if USE_MUX "multiplex" #else /* USE_MUX */ "standard " #endif /* USE_MUX */ #endif /* USE_TIMER */ ); CALL_START(0); #if 1 < ALARM_COUNT CALL_START(1); #if 2 < ALARM_COUNT CALL_START(2); #if 3 < ALARM_COUNT CALL_START(3); #if 4 < ALARM_COUNT CALL_START(4); #if 5 < ALARM_COUNT CALL_START(5); #if 6 < ALARM_COUNT CALL_START(6); #if 7 < ALARM_COUNT CALL_START(7); #endif /* ALARM_COUNT 7 */ #endif /* ALARM_COUNT 6 */ #endif /* ALARM_COUNT 5 */ #endif /* ALARM_COUNT 4 */ #endif /* ALARM_COUNT 3 */ #endif /* ALARM_COUNT 2 */ #endif /* ALARM_COUNT 1 */ } } tinyos-2.1.2+dfsg/tos/lib/timer/tests/AlarmUse/alarms.extra000066400000000000000000000001031207233610700236450ustar00rootroot00000000000000ifeq ($(ALARMS),) ALARMS=4 endif PFLAGS += -DALARM_COUNT=$(ALARMS) tinyos-2.1.2+dfsg/tos/lib/timer/tests/AlarmUse/buildset.sh000066400000000000000000000017531207233610700235040ustar00rootroot00000000000000PLATFORM=${PLATFORM:-tmote} echo "ROM and RAM sizes:" for prec in Second Milli 32khz ; do for mux in 0 1 ; do for alarms in 1 2 3 4 5 6 7 8; do echo -n "prec=${prec} mux=${mux} alarms=${alarms}" make ${PLATFORM} usemux,${mux} alarms,${alarms} useleds,0 useprec,${prec} \ 2>&1 | sed \ -e '1,/compiled TestAppC to/d' \ -e '/^msp430-objcopy/,$d' \ -e 's@bytes in.*$@@' \ | paste -s - mv -f build/${PLATFORM}/app.c build/${PLATFORM}/app-m${mux}-a${alarms}.c >/dev/null 2>&1 done done if [ Milli = "${prec}" ] ; then for alarms in 1 2 3 4 5 6 7 8; do echo -n "prec=${prec} timers=${alarms}" make ${PLATFORM} usetimer,1 alarms,${alarms} useleds,0 useprec,${prec} \ 2>&1 | sed \ -e '1,/compiled TestAppC to/d' \ -e '/^msp430-objcopy/,$d' \ -e 's@bytes in.*$@@' \ | paste -s - mv -f build/${PLATFORM}/app.c build/${PLATFORM}/app-timer-a${alarms}.c >/dev/null 2>&1 done fi done tinyos-2.1.2+dfsg/tos/lib/timer/tests/AlarmUse/config.h000066400000000000000000000012351207233610700227460ustar00rootroot00000000000000#ifndef _CONFIG_H_ #define _CONFIG_H_ #ifndef ALARM_COUNT #define ALARM_COUNT (5) #endif /* ALARM_COUNT */ #ifndef USE_MUX #define USE_MUX 0 #endif /* USE_MUX */ #ifndef USE_TIMER #define USE_TIMER 0 #endif /* USE_TIMER */ #ifndef USE_LEDS #define USE_LEDS 1 #endif /* USE_LEDS */ #ifndef TPrec #define TPrec TMilli #endif /* TPrec */ #ifndef AlarmPrecC #define AlarmPrecC AlarmMilli32C #endif /* AlarmPrecC */ #ifndef MuxAlarmPrecC #define MuxAlarmPrecC MuxAlarmMilli32C #endif /* AlarmPrecC */ #ifndef TimerPrecC #define TimerPrecC TimerMilliC #endif /* TimerPrecC */ #ifndef BASE_SHIFT #define BASE_SHIFT 7 #endif /* BASE_SHIFT */ #endif /* _CONFIG_H_ */ tinyos-2.1.2+dfsg/tos/lib/timer/tests/AlarmUse/useleds.extra000066400000000000000000000001031207233610700240320ustar00rootroot00000000000000ifeq ($(USELEDS),) USELEDS=1 endif PFLAGS += -DUSE_LEDS=$(USELEDS) tinyos-2.1.2+dfsg/tos/lib/timer/tests/AlarmUse/usemux.extra000066400000000000000000000000771207233610700237260ustar00rootroot00000000000000ifeq ($(USEMUX),) USEMUX=1 endif PFLAGS += -DUSE_MUX=$(USEMUX) tinyos-2.1.2+dfsg/tos/lib/timer/tests/AlarmUse/useprec.extra000066400000000000000000000003411207233610700240400ustar00rootroot00000000000000ifeq ($(USEPREC),) USEPREC=Milli endif ifeq ($(USEPREC),Second) PFLAGS += -DBASE_SHIFT=0 endif PFLAGS += -DTPrec=T$(USEPREC) -DAlarmPrecC=Alarm$(USEPREC)32C -DMuxAlarmPrecC=MuxAlarm$(USEPREC)32C -DTimerPrecC=Timer$(USEPREC)C tinyos-2.1.2+dfsg/tos/lib/timer/tests/AlarmUse/usetimer.extra000066400000000000000000000001071207233610700242270ustar00rootroot00000000000000ifeq ($(USETIMER),) USETIMER=1 endif PFLAGS += -DUSE_TIMER=$(USETIMER) tinyos-2.1.2+dfsg/tos/lib/tosboot/000077500000000000000000000000001207233610700170255ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/Exec.nc000066400000000000000000000000531207233610700202310ustar00rootroot00000000000000 interface Exec { command void exec(); } tinyos-2.1.2+dfsg/tos/lib/tosboot/ExtFlash.nc000066400000000000000000000035171207233610700210730ustar00rootroot00000000000000// $Id: ExtFlash.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ interface ExtFlash { command void startRead(uint32_t addr); command uint8_t readByte(); command void stopRead(); } tinyos-2.1.2+dfsg/tos/lib/tosboot/Hardware.nc000066400000000000000000000034341207233610700211100ustar00rootroot00000000000000// $Id: Hardware.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ interface Hardware { command void init(); command void reboot(); } tinyos-2.1.2+dfsg/tos/lib/tosboot/Leds.nc000066400000000000000000000035241207233610700202420ustar00rootroot00000000000000// $Id: Leds.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ interface Leds { command void set(uint8_t ledsOn); command void flash(uint8_t a); command void glow(uint8_t a, uint8_t b); } tinyos-2.1.2+dfsg/tos/lib/tosboot/Makefile000066400000000000000000000074671207233610700205030ustar00rootroot00000000000000# $Id: Makefile,v 1.8 2010-06-29 22:07:50 scipio Exp $ # # # # Copyright (c) 2000-2005 The Regents of the University of California. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of the copyright holders nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL # THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # # # # @author Jonathan Hui # COMPONENT=TosBootC TINYOS_NP= PFLAGS += -DNESC_BUILD_BINARY # ifeq ($(MAKECMDGOALS),mica2) # CFLAGS += -DTOSBOOT_START=0x1f000 -DTOSBOOT_END=0x20000 # CFLAGS += -Wl,--section-start=.text=0x1f000 # CFLAGS += -Iat45db -Iavr -Imica2 -Ilib # endif # ifeq ($(MAKECMDGOALS),mica2dot) # CFLAGS += -DTOSBOOT_START=0x1f000 -DTOSBOOT_END=0x20000 # CFLAGS += -Wl,--section-start=.text=0x1f000 # CFLAGS += -Iat45db -Iavr -Imica2dot -Ilib # endif ifeq ($(MAKECMDGOALS),micaz) CFLAGS += -DTOSBOOT_START=0x1f000 -DTOSBOOT_END=0x20000 CFLAGS += -Wl,--section-start=.text=0x1f000 CFLAGS += -Iat45db -Iavr -Imicaz -Ilib CFLAGS += -I../net/Deluge endif ifeq ($(MAKECMDGOALS),iris) CFLAGS += -DTOSBOOT_START=0x1f000 -DTOSBOOT_END=0x20000 CFLAGS += -Wl,--section-start=.text=0x1f000 CFLAGS += -Iiris -Iat45db -Iavr -Imicaz -Ilib CFLAGS += -I../net/Deluge endif # ifeq ($(MAKECMDGOALS),telosa) # CFLAGS += -DTOSBOOT_START=0x1100 -DTOSBOOT_END=0x1a00 # CFLAGS += -Iat45db -Imsp430 -Itelos -Ilib # POST_BUILD_EXTRA_DEPS += strip_iv # endif ifeq ($(MAKECMDGOALS),telosb) CFLAGS += -DTOSBOOT_START=0x4000 -DTOSBOOT_END=0x4a00 CFLAGS += -Imsp430 -Imsp430f1611 -Istm25p -Itelosb -Ilib CFLAGS += -I../net/Deluge POST_BUILD_EXTRA_DEPS += strip_iv endif ifeq ($(MAKECMDGOALS),epic) CFLAGS += -DTOSBOOT_START=0x4000 -DTOSBOOT_END=0x4a00 CFLAGS += -Imsp430 -Imsp430f1611 -Iepic -Ilib CFLAGS += -I../net/Deluge POST_BUILD_EXTRA_DEPS += strip_iv endif ifeq ($(MAKECMDGOALS),mulle) CFLAGS += -DTOSBOOT_START=0xe0000 -DTOSBOOT_END=0xeffff CFLAGS += -Iat45db -Imulle -Im16c60 -Im16c60/62p -Ilib CFLAGS += -I../net/Deluge -I../net/Deluge/extra/mulle CFLAGS += -I../net/Deluge/extra/m16c60 CFLAGS += -I../net/Deluge/extra/m16c60/62p endif ifeq ($(MAKECMDGOALS),tinynode) CFLAGS += -DTOSBOOT_START=0x4000 -DTOSBOOT_END=0x4a00 CFLAGS += -Itinynode -Imsp430 -Imsp430f1611 -Iat45db -Ilib CFLAGS += -I../net/Deluge POST_BUILD_EXTRA_DEPS += strip_iv endif strip_iv: FORCE @echo " removing interrupt vector from binary" msp430-objcopy -j .text -j .data -O ihex $(BUILDDIR)/main.exe $(BUILDDIR)/main.ihex include $(MAKERULES) tinyos-2.1.2+dfsg/tos/lib/tosboot/ProgFlash.nc000066400000000000000000000035001207233610700212320ustar00rootroot00000000000000// $Id: ProgFlash.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ interface ProgFlash { command error_t write(in_flash_addr_t addr, uint8_t* buf, in_flash_addr_t len); } tinyos-2.1.2+dfsg/tos/lib/tosboot/TosBoot.h000066400000000000000000000034361207233610700205750ustar00rootroot00000000000000// $Id: TosBoot.h,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui */ #ifndef __TOSBOOT_H__ #define __TOSBOOT_H__ #include "TOSBoot_platform.h" #endif tinyos-2.1.2+dfsg/tos/lib/tosboot/TosBootC.nc000066400000000000000000000045061207233610700210500ustar00rootroot00000000000000// $Id: TosBootC.nc,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ #include #include #include "TosBoot.h" configuration TosBootC { } implementation { components TosBootP, ExecC, ExtFlashC, HardwareC, InternalFlashC as IntFlash, LedsC, PluginC, ProgFlashC as ProgFlash, VoltageC; TosBootP.SubInit -> ExtFlashC; TosBootP.SubControl -> ExtFlashC.StdControl; TosBootP.SubControl -> PluginC; TosBootP.Exec -> ExecC; TosBootP.ExtFlash -> ExtFlashC; TosBootP.Hardware -> HardwareC; TosBootP.IntFlash -> IntFlash; TosBootP.Leds -> LedsC; TosBootP.ProgFlash -> ProgFlash; TosBootP.Voltage -> VoltageC; } tinyos-2.1.2+dfsg/tos/lib/tosboot/TosBootP.nc000066400000000000000000000173661207233610700210750ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * */ /** * @author Jonathan Hui * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #include "crc.h" #include module TosBootP { uses { interface Exec; interface ExtFlash; interface Hardware; interface InternalFlash as IntFlash; interface Leds; interface ProgFlash; interface StdControl as SubControl; interface Init as SubInit; interface Voltage; } } implementation { enum { LEDS_LOWBATT = 1, LEDS_GESTURE = 7, }; enum { R_SUCCESS, R_INVALID_IMAGE_ERROR, R_PROGRAMMING_ERROR, }; void startupLeds() { uint8_t output = 0x7; uint8_t i; for (i = 3; i; i--, output >>= 1 ) call Leds.glow(output, output >> 1); } in_flash_addr_t extFlashReadAddr() { in_flash_addr_t result = 0; int8_t i; for ( i = 3; i >= 0; i-- ) result |= ((in_flash_addr_t)call ExtFlash.readByte() & 0xff) << (i*8); return result; } bool verifyBlock(ex_flash_addr_t crcAddr, ex_flash_addr_t startAddr, uint16_t len) { uint16_t crcTarget, crcTmp; // read crc call ExtFlash.startRead(crcAddr); crcTarget = (uint16_t)(call ExtFlash.readByte() & 0xff) << 8; crcTarget |= (uint16_t)(call ExtFlash.readByte() & 0xff); call ExtFlash.stopRead(); // compute crc call ExtFlash.startRead(startAddr); for ( crcTmp = 0; len; len-- ) crcTmp = crcByte(crcTmp, call ExtFlash.readByte()); call ExtFlash.stopRead(); return crcTarget == crcTmp; } bool verifyImage(ex_flash_addr_t startAddr) { uint32_t addr; uint8_t numPgs; uint8_t i; if (!verifyBlock(startAddr + offsetof(DelugeIdent,crc), startAddr, offsetof(DelugeIdent,crc))) return FALSE; // read size of image call ExtFlash.startRead(startAddr + offsetof(DelugeIdent,numPgs)); numPgs = call ExtFlash.readByte(); call ExtFlash.stopRead(); if (numPgs == 0 || numPgs == 0xff) return FALSE; startAddr += DELUGE_IDENT_SIZE; addr = DELUGE_CRC_BLOCK_SIZE; for ( i = 0; i < numPgs; i++ ) { if (!verifyBlock(startAddr + i*sizeof(uint16_t), startAddr + addr, DELUGE_BYTES_PER_PAGE)) { return FALSE; } addr += DELUGE_BYTES_PER_PAGE; } return TRUE; } error_t programImage(ex_flash_addr_t startAddr) { uint8_t buf[TOSBOOT_INT_PAGE_SIZE]; uint32_t pageAddr, newPageAddr; in_flash_addr_t intAddr; in_flash_addr_t secLength; ex_flash_addr_t curAddr; if (!verifyImage(startAddr)) return R_INVALID_IMAGE_ERROR; curAddr = startAddr + DELUGE_IDENT_SIZE + DELUGE_CRC_BLOCK_SIZE; call ExtFlash.startRead(curAddr); intAddr = extFlashReadAddr(); secLength = extFlashReadAddr(); curAddr = curAddr + 8; #if defined(PLATFORM_TELOSB) || defined (PLATFORM_EPIC) || defined (PLATFORM_TINYNODE) if (intAddr != TOSBOOT_END) { #elif defined(PLATFORM_MICAZ) || defined(PLATFORM_IRIS) if (intAddr != 0) { #elif defined(PLATFORM_MULLE) if (intAddr != 0xA0000) { #else #error "Target platform is not currently supported by Deluge T2" #endif call ExtFlash.stopRead(); return R_INVALID_IMAGE_ERROR; } call ExtFlash.stopRead(); while ( secLength ) { pageAddr = newPageAddr = intAddr / TOSBOOT_INT_PAGE_SIZE; call ExtFlash.startRead(curAddr); // fill in ram buffer for internal program flash sector do { // check if secLength is all ones if ( secLength == 0xffffffff ) { call ExtFlash.stopRead(); return FAIL; } buf[(uint16_t)intAddr % TOSBOOT_INT_PAGE_SIZE] = call ExtFlash.readByte(); intAddr++; curAddr++; if ( --secLength == 0 ) { intAddr = extFlashReadAddr(); secLength = extFlashReadAddr(); curAddr = curAddr + 8; } newPageAddr = intAddr / TOSBOOT_INT_PAGE_SIZE; } while ( pageAddr == newPageAddr && secLength ); call ExtFlash.stopRead(); call Leds.set(pageAddr); // write out page if (call ProgFlash.write(pageAddr*TOSBOOT_INT_PAGE_SIZE, buf, TOSBOOT_INT_PAGE_SIZE) == FAIL) { return R_PROGRAMMING_ERROR; } } return R_SUCCESS; } void runApp() { call SubControl.stop(); call Exec.exec(); } void startupSequence() { BootArgs args; // check voltage and make sure flash can be programmed // if not, just run the app, can't check for gestures // if we can't write to the internal flash anyway if ( !call Voltage.okToProgram() ) { // give user some time and count down LEDs call Leds.flash(LEDS_LOWBATT); startupLeds(); runApp(); } // get current value of counter call IntFlash.read((uint8_t*)TOSBOOT_ARGS_ADDR, &args, sizeof(args)); // increment gesture counter, see if it exceeds threshold if ( ++args.gestureCount >= TOSBOOT_GESTURE_MAX_COUNT - 1 ) { // gesture has been detected, display receipt of gesture on LEDs call Leds.flash(LEDS_GESTURE); // load golden image from flash // if the golden image is invalid, forget about reprogramming // if an error happened during reprogramming, reboot and try again // not much else we can do :-/ if (programImage(TOSBOOT_GOLDEN_IMG_ADDR) == R_PROGRAMMING_ERROR) { call Hardware.reboot(); } } else { // update gesture counter call IntFlash.write((uint8_t*)TOSBOOT_ARGS_ADDR, &args, sizeof(args)); if ( !args.noReprogram ) { // if an error happened during reprogramming, reboot and try again // after two tries, try programming the golden image if (programImage(args.imageAddr) == R_PROGRAMMING_ERROR) { call Hardware.reboot(); } } } // give user some time and count down LEDs startupLeds(); // reset counter and reprogramming flag args.gestureCount = 0xff; args.noReprogram = TRUE; call IntFlash.write((uint8_t*)TOSBOOT_ARGS_ADDR, &args, sizeof(args)); runApp(); } int main() @C() @spontaneous() { __nesc_disable_interrupt(); TOSH_SET_PIN_DIRECTIONS(); call Hardware.init(); call SubInit.init(); call SubControl.start(); startupSequence(); return 0; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/Voltage.nc000066400000000000000000000034101207233610700207460ustar00rootroot00000000000000// $Id: Voltage.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ interface Voltage { command bool okToProgram(); } tinyos-2.1.2+dfsg/tos/lib/tosboot/at45db/000077500000000000000000000000001207233610700201105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/at45db/ExtFlashC.nc000066400000000000000000000072271207233610700222630ustar00rootroot00000000000000// $Id: ExtFlashC.nc,v 1.4 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ module ExtFlashC { provides { interface Init; interface StdControl; interface ExtFlash; } } implementation { uint32_t addr; command error_t Init.init() { TOSH_MAKE_FLASH_CS_OUTPUT(); TOSH_SET_FLASH_CS_PIN(); TOSH_MAKE_FLASH_CLK_OUTPUT(); TOSH_CLR_FLASH_CLK_PIN(); TOSH_MAKE_FLASH_OUT_OUTPUT(); TOSH_SET_FLASH_OUT_PIN(); TOSH_MAKE_FLASH_IN_INPUT(); TOSH_CLR_FLASH_IN_PIN(); return SUCCESS; } command error_t StdControl.start() { return SUCCESS; } command error_t StdControl.stop() { return SUCCESS; } uint8_t SPIByte(uint8_t out) { uint8_t in = 0; uint8_t i; for ( i = 0; i < 8; i++, out <<= 1 ) { // write bit if (out & 0x80) TOSH_SET_FLASH_OUT_PIN(); else TOSH_CLR_FLASH_OUT_PIN(); // clock TOSH_SET_FLASH_CLK_PIN(); // read bit in <<= 1; if (TOSH_READ_FLASH_IN_PIN()) in |= 1; // clock TOSH_CLR_FLASH_CLK_PIN(); } return in; } command void ExtFlash.startRead(uint32_t newAddr) { uint8_t cmdBuf[4]; uint8_t i; addr = newAddr; #if defined(PLATFORM_MULLE) cmdBuf[0] = 0x68; cmdBuf[1] = (addr >> 15); cmdBuf[2] = ((addr >> 7) & 0xFC) + ((addr >> 8) & 0x1); cmdBuf[3] = addr & 0xff; #else cmdBuf[0] = 0x68; cmdBuf[1] = (addr >> 15) & 0xff; cmdBuf[2] = (addr >> 7) & 0xfe; cmdBuf[3] = addr & 0xff; #endif TOSH_CLR_FLASH_CLK_PIN(); TOSH_CLR_FLASH_CS_PIN(); for(i = 0; i < 4; i++) SPIByte(cmdBuf[i]); for(i = 0; i < 4; i++) SPIByte(0x0); TOSH_SET_FLASH_CLK_PIN(); TOSH_CLR_FLASH_CLK_PIN(); } command uint8_t ExtFlash.readByte() { #if defined(PLATFORM_MULLE) if (!(addr & 0x1ff)) { #else if (!(addr & 0xff)) { #endif call ExtFlash.stopRead(); call ExtFlash.startRead(addr); } addr++; return SPIByte(0); } command void ExtFlash.stopRead() { TOSH_SET_FLASH_CS_PIN(); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/avr/000077500000000000000000000000001207233610700176155ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/avr/HardwareC.nc000066400000000000000000000036271207233610700220070ustar00rootroot00000000000000// $Id: HardwareC.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ module HardwareC { provides { interface Hardware; } } implementation { command void Hardware.init() {} command void Hardware.reboot() { wdt_enable(1); while(1); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/avr/InternalFlashC.nc000066400000000000000000000045531207233610700230030ustar00rootroot00000000000000// $Id: InternalFlashC.nc,v 1.4 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ #include module InternalFlashC { provides interface InternalFlash; } implementation { command error_t InternalFlash.write(void* addr, void* buf, uint16_t size) { uint8_t *addrPtr = (uint8_t*)addr; uint8_t *bufPtr = (uint8_t*)buf; for ( ; size; size-- ) eeprom_write_byte(addrPtr++, *bufPtr++); while(!eeprom_is_ready()); return SUCCESS; } command error_t InternalFlash.read(void* addr, void* buf, uint16_t size) { uint8_t *addrPtr = (uint8_t*)addr; uint8_t *bufPtr = (uint8_t*)buf; for ( ; size; size-- ) *bufPtr++ = eeprom_read_byte(addrPtr++); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/avr/ProgFlashC.nc000066400000000000000000000045271207233610700221370ustar00rootroot00000000000000// $Id: ProgFlashC.nc,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ module ProgFlashC { provides { interface ProgFlash; } } implementation { #include command error_t ProgFlash.write(in_flash_addr_t addr, uint8_t* buf, in_flash_addr_t len) { uint16_t* wordBuf = (uint16_t*)buf; uint32_t i; if ( addr + len > TOSBOOT_START ) return FAIL; boot_page_erase_safe( addr ); while( boot_rww_busy() ) boot_rww_enable_safe(); for ( i = 0; i < len; i += 2 ) boot_page_fill_safe( addr + i, *wordBuf++ ); boot_page_write_safe( addr ); while ( boot_rww_busy() ) boot_rww_enable_safe(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/crc.h000066400000000000000000000046731207233610700177570ustar00rootroot00000000000000// $Id: crc.h,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Default CRC function. Note that avrmote has a much more efficient one. * * This CRC-16 function produces a 16-bit running CRC that adheres to the * ITU-T CRC standard. * * The ITU-T polynomial is: G_16(x) = x^16 + x^12 + x^5 + 1 * */ uint16_t crcByte(uint16_t crc, uint8_t b) { uint8_t i; crc = crc ^ b << 8; i = 8; do if (crc & 0x8000) crc = crc << 1 ^ 0x1021; else crc = crc << 1; while (--i); return crc; } tinyos-2.1.2+dfsg/tos/lib/tosboot/epic/000077500000000000000000000000001207233610700177455ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/epic/ExtFlashC.nc000066400000000000000000000037741207233610700221230ustar00rootroot00000000000000// $Id: ExtFlashC.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ configuration ExtFlashC { provides { interface Init; interface StdControl; interface ExtFlash; } } implementation { components ExtFlashP, HplUsart0C; Init = ExtFlashP; StdControl = ExtFlashP; ExtFlash = ExtFlashP; ExtFlashP.UsartControl -> HplUsart0C; } tinyos-2.1.2+dfsg/tos/lib/tosboot/epic/ExtFlashP.nc000066400000000000000000000061371207233610700221340ustar00rootroot00000000000000// $Id: ExtFlashP.nc,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui * @author Razvan Musaloiu-E. */ module ExtFlashP { provides { interface StdControl; interface Init; interface ExtFlash; } uses { interface HplUsartControl as UsartControl; } } implementation { uint32_t addr; command error_t Init.init() { TOSH_MAKE_FLASH_CS_OUTPUT(); TOSH_SET_FLASH_CS_PIN(); call UsartControl.setModeSPI(); return SUCCESS; } command error_t StdControl.start() { return SUCCESS; } command error_t StdControl.stop() { call UsartControl.disableSPI(); return SUCCESS; } command void ExtFlash.startRead(uint32_t newAddr) { uint8_t cmd[4]; uint8_t i; uint32_t page = newAddr / 512; uint32_t offset = newAddr % 512; addr = newAddr; cmd[0] = 0x03; cmd[1] = page >> 6; cmd[2] = (page << 2) | (offset >> 8); cmd[3] = offset; TOSH_CLR_FLASH_CS_PIN(); for ( i = 0; i < sizeof(cmd); i++ ) { call UsartControl.tx(cmd[i]); while(call UsartControl.isTxEmpty() != SUCCESS); } } command uint8_t ExtFlash.readByte() { if (!(addr & 0x1ff)) { call ExtFlash.stopRead(); call ExtFlash.startRead(addr); } addr++; call UsartControl.rx(); call UsartControl.tx(0); while(call UsartControl.isRxIntrPending() != SUCCESS); return call UsartControl.rx(); } command void ExtFlash.stopRead() { TOSH_SET_FLASH_CS_PIN(); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/epic/hardware.h000066400000000000000000000052071207233610700217170ustar00rootroot00000000000000// $Id: hardware.h,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ #ifndef __HARDWARE_H__ #define __HARDWARE_H__ #include "msp430hardware.h" // internal flash is 16 bits in width typedef uint16_t in_flash_addr_t; // external flash is 32 bits in width typedef uint32_t ex_flash_addr_t; void wait(uint16_t t) { for ( ; t > 0; t-- ); } // LEDs TOSH_ASSIGN_PIN(RED_LED, 4, 0); TOSH_ASSIGN_PIN(GREEN_LED, 4, 3); TOSH_ASSIGN_PIN(YELLOW_LED, 4, 7); // UART pins TOSH_ASSIGN_PIN(SOMI0, 3, 2); TOSH_ASSIGN_PIN(SIMO0, 3, 1); TOSH_ASSIGN_PIN(UCLK0, 3, 3); TOSH_ASSIGN_PIN(UTXD0, 3, 4); TOSH_ASSIGN_PIN(URXD0, 3, 5); // User Interupt Pin TOSH_ASSIGN_PIN(USERINT, 2, 7); // FLASH TOSH_ASSIGN_PIN(FLASH_CS, 4, 4); void TOSH_SET_PIN_DIRECTIONS(void) { P3SEL = 0x0E; // set SPI and I2C to mod func P1DIR = 0xe0; P1OUT = 0x00; P2DIR = 0x7b; P2OUT = 0x10; P3DIR = 0xf1; P3OUT = 0x00; P4DIR = 0xfd; P4OUT = 0xdd; P5DIR = 0xff; P5OUT = 0xff; P6DIR = 0xff; P6OUT = 0x00; } #endif tinyos-2.1.2+dfsg/tos/lib/tosboot/iris/000077500000000000000000000000001207233610700177735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/iris/HardwareC.nc000066400000000000000000000072521207233610700221630ustar00rootroot00000000000000// $Id: HardwareC.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui * @author Janos Sallai */ #include module HardwareC { provides { interface Hardware; } } implementation { command void Hardware.init() { // disable watchdog (if accidentally left on) MCUSR = 0; wdt_disable(); } command void Hardware.reboot() { // enable watchdog wdt_enable(WDTO_1S); // enter infinite loop while(1); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/iris/ProgFlashC.nc000066400000000000000000000044501207233610700223100ustar00rootroot00000000000000// $Id: ProgFlashC.nc,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ #include module ProgFlashC { provides { interface ProgFlash; } } implementation { command error_t ProgFlash.write(in_flash_addr_t addr, uint8_t* buf, in_flash_addr_t len) { uint16_t* wordBuf = (uint16_t*)buf; uint32_t i; if ( addr + len > TOSBOOT_START ) return FAIL; boot_page_erase( addr ); while( boot_rww_busy() ) boot_rww_enable(); for ( i = 0; i < len; i += 2 ) boot_page_fill( addr + i, *wordBuf++ ); boot_page_write( addr ); while ( boot_rww_busy() ) boot_rww_enable(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/iris/VoltageC.nc000066400000000000000000000075311207233610700220270ustar00rootroot00000000000000// $Id: VoltageC.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui * @author Janos Sallai */ module VoltageC { provides { interface Voltage; } } implementation { command bool Voltage.okToProgram() { // 250 KHz ADC clock (4MHz/16) outp( 0x04, ADCSRA ); // clear interrupt flag by writing a 1 sbi( ADCSRA, ADIF ); // setup input channel outp( VOLTAGE_PORT, ADMUX ); // adc enable sbi( ADCSRA, ADEN ); // adc start conversion sbi( ADCSRA, ADSC ); // wait for conversion to complete while ( !bit_is_set( ADCSRA, ADIF ) ); return ( __inw(ADCL) < VTHRESH ); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/lib/000077500000000000000000000000001207233610700175735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/lib/ExecC.nc000066400000000000000000000036731207233610700211150ustar00rootroot00000000000000// $Id: ExecC.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Jonathan Hui */ module ExecC { provides { interface Exec; } } implementation { command void Exec.exec() { //goto *(void*)(TOSBOOT_END); typedef void __attribute__((noreturn)) (*tosboot_exec)(); ((tosboot_exec)TOSBOOT_END)(); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/lib/LedsC.nc000066400000000000000000000051361207233610700211140ustar00rootroot00000000000000// $Id: LedsC.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ module LedsC { provides interface Leds; } implementation { enum { RED_BIT = 1, GREEN_BIT = 2, YELLOW_BIT = 4 }; command void Leds.set(uint8_t ledsOn) { if (ledsOn & GREEN_BIT) TOSH_CLR_GREEN_LED_PIN(); else TOSH_SET_GREEN_LED_PIN(); if (ledsOn & YELLOW_BIT ) TOSH_CLR_YELLOW_LED_PIN(); else TOSH_SET_YELLOW_LED_PIN(); if (ledsOn & RED_BIT) TOSH_CLR_RED_LED_PIN(); else TOSH_SET_RED_LED_PIN(); } command void Leds.flash(uint8_t a) { uint8_t i, j; for ( i = 3; i; i-- ) { call Leds.set(a); for ( j = 4; j; j-- ) wait(0xffff); call Leds.set(0); for ( j = 4; j; j-- ) wait(0xffff); } } command void Leds.glow(uint8_t a, uint8_t b) { int i; for (i = 1536; i > 0; i -= 4) { call Leds.set(a); wait(i); call Leds.set(b); wait(1536-i); } } } tinyos-2.1.2+dfsg/tos/lib/tosboot/m16c60/000077500000000000000000000000001207233610700177415ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/m16c60/62p/000077500000000000000000000000001207233610700203505ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/m16c60/62p/ProgFlashP.nc000066400000000000000000000057111207233610700227030ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the ProgFlash interface for M16c/62p. * The interface is responsible of reprogramming of the mcus * program flash. * * @author Henrik Makitaavola */ #include "M16c62pFlash.h" module ProgFlashP { provides interface ProgFlash; uses interface HplM16c60Flash as Flash; } implementation { command error_t ProgFlash.write(in_flash_addr_t addr, uint8_t* buf, in_flash_addr_t len) { // We dont need to rewrite the hw interrupt vector if (addr >= 0xFFE00L) { return SUCCESS; } if (addr + len >= TOSBOOT_START) { return FAIL; } if (addr == 0xA0000L) { // Erase Block 10 if (call Flash.erase(M16C62P_BLOCK_10) != SUCCESS ) { return FAIL; } } else if ( addr == 0xB0000L ) { // Erase Block 9 if (call Flash.erase(M16C62P_BLOCK_9) != SUCCESS ) { return FAIL; } } else if ( addr == 0xC0000L ) { // Erase Block 8 if (call Flash.erase(M16C62P_BLOCK_8) != SUCCESS ) { return FAIL; } } else if ( addr == 0xD0000L ) { // Erase Block 7 if (call Flash.erase(M16C62P_BLOCK_7) != SUCCESS ) { return FAIL; } } if (call Flash.write(addr, (unsigned int*) buf, len) != SUCCESS) { return FAIL; } return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/m16c60/65/000077500000000000000000000000001207233610700201735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/m16c60/65/ProgFlashP.nc000066400000000000000000000056741207233610700225360ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the ProgFlash interface for M16c/65. * The interface is responsible of reprogramming of the mcus * program flash. * * @author Henrik Makitaavola */ #include "M16c65Flash.h" module ProgFlashP { provides interface ProgFlash; uses interface HplM16c60Flash as Flash; } implementation { command error_t ProgFlash.write(in_flash_addr_t addr, uint8_t* buf, in_flash_addr_t len) { // We dont need to rewrite the hw interrupt vector if (addr >= 0xFFE00L) { return SUCCESS; } if (addr + len >= TOSBOOT_START) { return FAIL; } if (addr == 0x80000L) { // Erase Block 7 if (call Flash.erase(M16C65_BLOCK_7) != SUCCESS ) { return FAIL; } } else if ( addr == 0x90000L ) { // Erase Block 6 if (call Flash.erase(M16C65_BLOCK_6) != SUCCESS ) { return FAIL; } } else if ( addr == 0xA0000L ) { // Erase Block 5 if (call Flash.erase(M16C65_BLOCK_5) != SUCCESS ) { return FAIL; } } else if ( addr == 0xB0000L ) { // Erase Block 4 if (call Flash.erase(M16C65_BLOCK_4) != SUCCESS ) { return FAIL; } } if (call Flash.write(addr, (unsigned int*) buf, len) != SUCCESS) { return FAIL; } return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/m16c60/HardwareC.nc000066400000000000000000000046361207233610700221340ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Hardware interface implementation for the M16c/60 MCU. * The interface is responsible of initializing the mcu * and rebooting it on request. * * @author Henrik Makitaavola */ #include "NetProg_platform.h" module HardwareC { provides interface Hardware; } implementation { command void Hardware.init() { PRCR.BYTE = BIT1 | BIT0; // Turn off protection for the cpu and clock register PM0.BYTE = BIT7; // Single Chip mode. No BCLK output. PM1.BYTE = BIT3; // Expand internal memory, no global wait state. CM0.BYTE = 0x0; // No sub-clock (Xc) generation CM1.BYTE = 0x0; // CPU_CLOCK = MAIN_CLOCK, low drive on Xin PRCR.BYTE = 0; // Turn on protection on all registers. } command void Hardware.reboot() { netprog_reboot(); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/m16c60/ProgFlashC.nc000066400000000000000000000036371207233610700222640ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Wiring so that the ProgFlashP module gets access to the HplM16c60FlashC * module. * * @author Henrik Makitaavola */ configuration ProgFlashC { provides interface ProgFlash; } implementation { components ProgFlashP, HplM16c60FlashC; ProgFlashP.Flash -> HplM16c60FlashC; ProgFlash = ProgFlashP; } tinyos-2.1.2+dfsg/tos/lib/tosboot/micaz/000077500000000000000000000000001207233610700201305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/micaz/ExecC.nc000066400000000000000000000035471207233610700214520ustar00rootroot00000000000000// $Id: ExecC.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Jonathan Hui */ module ExecC { provides { interface Exec; } } implementation { command void Exec.exec() { __asm__ __volatile__ ("jmp 0x0000\n\t" ::); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/micaz/InternalFlash.h000066400000000000000000000036551207233610700230440ustar00rootroot00000000000000// $Id: InternalFlash.h,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * InternalFlash.h - Internal flash implementation for the avr * platform. * * Valid address range is 0x0 - 0xFFF. * * @author Jonathan Hui */ #ifndef __INTERNAL_FLASH_H__ #define __INTERNAL_FLASH_H__ #include #endif tinyos-2.1.2+dfsg/tos/lib/tosboot/micaz/PluginC.nc000066400000000000000000000003061207233610700220120ustar00rootroot00000000000000 module PluginC { provides { interface StdControl; } } implementation { command error_t StdControl.start() { return SUCCESS; } command error_t StdControl.stop() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/micaz/TOSBoot_platform.h000066400000000000000000000042501207233610700234770ustar00rootroot00000000000000// $Id: TOSBoot_platform.h,v 1.4 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui */ #ifndef __TOSBOOT_PLATFORM_H__ #define __TOSBOOT_PLATFORM_H__ enum { TOSBOOT_ARGS_ADDR = 0xff0, // address of TOSBoot args in internal flash TOSBOOT_GESTURE_MAX_COUNT = 3, // number of resets to force golden image TOSBOOT_GOLDEN_IMG_ADDR = 0x0L, // address of the golden image in external flash TOSBOOT_INT_PAGE_SIZE = SPM_PAGESIZE, // size of each internal program flash page }; enum { DELUGE_MIN_ADV_PERIOD_LOG2 = 9, DELUGE_QSIZE = 2, }; #endif tinyos-2.1.2+dfsg/tos/lib/tosboot/micaz/VoltageC.nc000066400000000000000000000043461207233610700221650ustar00rootroot00000000000000// $Id: VoltageC.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ module VoltageC { provides { interface Voltage; } } implementation { command bool Voltage.okToProgram() { // 250 KHz ADC clock (4MHz/16) outp( 0x04, ADCSR ); // clear interrupt flag by writing a 1 sbi( ADCSR, ADIF ); // setup input channel outp( VOLTAGE_PORT, ADMUX ); // adc enable sbi( ADCSR, ADEN ); // adc start conversion sbi( ADCSR, ADSC ); // wait for conversion to complete while ( !bit_is_set( ADCSR, ADIF ) ); return ( __inw(ADCL) < VTHRESH ); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/micaz/avrhardware.h000066400000000000000000000147641207233610700226230ustar00rootroot00000000000000// $Id: avrhardware.h,v 1.4 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Jason Hill, Philip Levis, Nelson Lee * * */ /** * @author Jason Hill * @author Philip Levis * @author Nelson Lee */ #ifndef TOSH_AVRHARDWARE_H #define TOSH_AVRHARDWARE_H // check for a new-look avr-libc #if defined(DTOSTR_ALWAYS_SIGN) && !defined(TOSH_NEW_AVRLIBC) #define TOSH_NEW_AVRLIBC #endif #ifdef TOSH_NEW_AVRLIBC #include #if __AVR_LIBC_VERSION__ >= 10400UL #include #else #include #include #endif #include #include #include #ifndef sbi /* avr-libc 1.2.3 doesn't include these anymore. */ #define sbi(port, bit) ((port) |= _BV(bit)) #define cbi(port, bit) ((port) &= ~_BV(bit)) #define inp(port) (port) #define inb(port) (port) #define outp(value, port) ((port) = (value)) #define outb(port, value) ((port) = (value)) #define inw(port) (*(volatile uint16_t *)&(port)) #define outw(port, value) ((*(volatile uint16_t *)&(port)) = (value)) #define PRG_RDB(addr) pgm_read_byte(addr) #endif #else #include #include #include #include #include #endif /* TOSH_NEW_AVRLIBC */ // check for version 3.3 of GNU gcc or later #if ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) #define __outw(val, port) outw(port, val); #endif #ifndef __inw #ifndef __SFR_OFFSET #define __SFR_OFFSET 0 #endif /* !__SFR_OFFSET */ #define __inw(_port) inw(_port) #define __inw_atomic(__sfrport) ({ \ uint16_t __t; \ bool bStatus; \ bStatus = bit_is_set(SREG,7); \ cli(); \ __t = inw(__sfrport); \ if (bStatus) sei(); \ __t; \ }) #endif /* __inw */ #define TOSH_ASSIGN_PIN(name, port, bit) \ static inline void TOSH_SET_##name##_PIN() {sbi(PORT##port , bit);} \ static inline void TOSH_CLR_##name##_PIN() {cbi(PORT##port , bit);} \ static inline int TOSH_READ_##name##_PIN() \ {return (inp(PIN##port) & (1 << bit)) != 0;} \ static inline void TOSH_MAKE_##name##_OUTPUT() {sbi(DDR##port , bit);} \ static inline void TOSH_MAKE_##name##_INPUT() {cbi(DDR##port , bit);} #define TOSH_ASSIGN_OUTPUT_ONLY_PIN(name, port, bit) \ static inline void TOSH_SET_##name##_PIN() {sbi(PORT##port , bit);} \ static inline void TOSH_CLR_##name##_PIN() {cbi(PORT##port , bit);} \ static inline void TOSH_MAKE_##name##_OUTPUT() {;} #define TOSH_ALIAS_OUTPUT_ONLY_PIN(alias, connector)\ static inline void TOSH_SET_##alias##_PIN() {TOSH_SET_##connector##_PIN();} \ static inline void TOSH_CLR_##alias##_PIN() {TOSH_CLR_##connector##_PIN();} \ static inline void TOSH_MAKE_##alias##_OUTPUT() {} \ #define TOSH_ALIAS_PIN(alias, connector) \ static inline void TOSH_SET_##alias##_PIN() {TOSH_SET_##connector##_PIN();} \ static inline void TOSH_CLR_##alias##_PIN() {TOSH_CLR_##connector##_PIN();} \ static inline char TOSH_READ_##alias##_PIN() {return TOSH_READ_##connector##_PIN();} \ static inline void TOSH_MAKE_##alias##_OUTPUT() {TOSH_MAKE_##connector##_OUTPUT();} \ static inline void TOSH_MAKE_##alias##_INPUT() {TOSH_MAKE_##connector##_INPUT();} // We need slightly different defs than SIGNAL, INTERRUPT #define TOSH_SIGNAL(signame) \ void signame() __attribute__ ((signal)) @spontaneous() @C() #define TOSH_INTERRUPT(signame) \ void signame() __attribute__ ((interrupt)) @spontaneous() @C() /* Watchdog Prescaler */ enum { TOSH_period16 = 0x00, // 47ms TOSH_period32 = 0x01, // 94ms TOSH_period64 = 0x02, // 0.19s TOSH_period128 = 0x03, // 0.38s TOSH_period256 = 0x04, // 0.75s TOSH_period512 = 0x05, // 1.5s TOSH_period1024 = 0x06, // 3.0s TOSH_period2048 = 0x07 // 6.0s }; void TOSH_wait() { asm volatile("nop"); asm volatile("nop"); } // atomic statement runtime support /* typedef uint8_t __nesc_atomic_t; */ /* __nesc_atomic_t __nesc_atomic_start(void); */ /* void __nesc_atomic_end(__nesc_atomic_t oldSreg); */ /* #ifndef NESC_BUILD_BINARY */ /* inline __nesc_atomic_t __nesc_atomic_start(void) @spontaneous() */ /* { */ /* __nesc_atomic_t result = inp(SREG); */ /* cli(); */ /* return result; */ /* } */ /* inline void __nesc_atomic_end(__nesc_atomic_t oldSreg) @spontaneous() */ /* { */ /* outp(oldSreg, SREG); */ /* } */ /* #endif */ /* inline void __nesc_atomic_sleep() */ /* { */ /* /\* Atomically enable interrupts and sleep *\/ */ /* sei(); // Make sure interrupts are on, so we can wake up! */ /* asm volatile ("sleep"); */ /* TOSH_wait(); */ /* } */ /* inline void __nesc_enable_interrupt() { */ /* sei(); */ /* } */ /* inline void __nesc_disable_interrupt() { */ /* cli(); */ /* } */ #endif //TOSH_AVRHARDWARE_H tinyos-2.1.2+dfsg/tos/lib/tosboot/micaz/hardware.h000066400000000000000000000134461207233610700221060ustar00rootroot00000000000000// $Id: hardware.h,v 1.5 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * * $Id: hardware.h,v 1.5 2010-06-29 22:07:50 scipio Exp $ * */ #ifndef __HARDWARE_H__ #define __HARDWARE_H__ #include #include #ifndef MHZ /* Clock rate is ~8MHz except if specified by user (this value must be a power of 2, see MicaTimer.h and MeasureClockC.nc) */ #define MHZ 8 #endif typedef uint32_t in_flash_addr_t; typedef uint32_t ex_flash_addr_t; static inline void wait( uint16_t dt ) { /* In most cases (constant arg), the test is elided at compile-time */ if (dt) /* loop takes 8 cycles. this is 1uS if running on an internal 8MHz clock, and 1.09uS if running on the external crystal. */ asm volatile ( "1: sbiw %0,1\n" " adiw %0,1\n" " sbiw %0,1\n" " brne 1b" : "+w" (dt)); } // LED assignments TOSH_ASSIGN_PIN(RED_LED, A, 2); TOSH_ASSIGN_PIN(GREEN_LED, A, 1); TOSH_ASSIGN_PIN(YELLOW_LED, A, 0); TOSH_ASSIGN_PIN(SERIAL_ID, A, 4); // Flash assignments TOSH_ASSIGN_PIN(FLASH_CS, A, 3); TOSH_ASSIGN_PIN(FLASH_CLK, D, 5); TOSH_ASSIGN_PIN(FLASH_OUT, D, 3); TOSH_ASSIGN_PIN(FLASH_IN, D, 2); // power control assignments TOSH_ASSIGN_PIN(PW0, C, 0); TOSH_ASSIGN_PIN(PW1, C, 1); TOSH_ASSIGN_PIN(PW2, C, 2); TOSH_ASSIGN_PIN(PW3, C, 3); TOSH_ASSIGN_PIN(PW4, C, 4); TOSH_ASSIGN_PIN(PW5, C, 5); TOSH_ASSIGN_PIN(PW6, C, 6); TOSH_ASSIGN_PIN(PW7, C, 7); void TOSH_SET_PIN_DIRECTIONS(void) { TOSH_MAKE_RED_LED_OUTPUT(); TOSH_MAKE_YELLOW_LED_OUTPUT(); TOSH_MAKE_GREEN_LED_OUTPUT(); TOSH_MAKE_PW7_OUTPUT(); TOSH_MAKE_PW6_OUTPUT(); TOSH_MAKE_PW5_OUTPUT(); TOSH_MAKE_PW4_OUTPUT(); TOSH_MAKE_PW3_OUTPUT(); TOSH_MAKE_PW2_OUTPUT(); TOSH_MAKE_PW1_OUTPUT(); TOSH_MAKE_PW0_OUTPUT(); TOSH_MAKE_SERIAL_ID_INPUT(); TOSH_CLR_SERIAL_ID_PIN(); // Prevent sourcing current TOSH_MAKE_FLASH_CS_OUTPUT(); TOSH_MAKE_FLASH_OUT_OUTPUT(); TOSH_MAKE_FLASH_CLK_OUTPUT(); TOSH_SET_FLASH_CS_PIN(); } enum { VOLTAGE_PORT = 30, VTHRESH = 0x1cf, // 2.7V }; #endif tinyos-2.1.2+dfsg/tos/lib/tosboot/msp430/000077500000000000000000000000001207233610700200535ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/msp430/ExecC.nc000066400000000000000000000040231207233610700213630ustar00rootroot00000000000000// $Id: ExecC.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Jonathan Hui */ module ExecC { provides { interface Exec; } } implementation { command void Exec.exec() { typedef void __attribute__((noreturn)) (*tosboot_exec)(); // Restore the watchdog state produced by the __watchdog_support // from GCC 4.6. WDTCTL = WDTPW + WDTCNTCL; ((tosboot_exec)TOSBOOT_END)(); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/msp430/HardwareC.nc000066400000000000000000000037661207233610700222510ustar00rootroot00000000000000// $Id: HardwareC.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ module HardwareC { provides { interface Hardware; } } implementation { command void Hardware.init() { WDTCTL = WDTPW + WDTHOLD; BCSCTL1 = RSEL0 | RSEL1 | RSEL2 | XT2OFF; DCOCTL = DCO0 | DCO1 | DCO2; } command void Hardware.reboot() { WDTCTL = 0; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/msp430/HplUsart0C.nc000066400000000000000000000065751207233610700223370ustar00rootroot00000000000000// $Id: HplUsart0C.nc,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ module HplUsart0C { provides interface HplUsartControl; } implementation { command void HplUsartControl.disableSPI() { // USART0 SPI module disable //ME1 &= ~USPIE0; // set to PUC values ME1 = 0; U0CTL = 1; U0TCTL = 1; U0RCTL = 0; } command void HplUsartControl.setModeSPI() { //U0CTL = SWRST; // 8-bit char, SPI-mode, USART as master U0CTL = SWRST | CHAR | SYNC | MM; // 3-pin + half-cycle delayed UCLK U0TCTL |= STC + CKPH + SSEL1; // as fast as possible U0BR0 = 0x02; U0BR1 = 0; // enable SPI ME1 |= USPIE0; U0CTL &= ~SWRST; // clear interrupts IFG1 = 0; } command void HplUsartControl.disableI2C() { /* U0CTL = 1; U0TCTL = 1; I2CTCTL = 0; */ U0CTL &= ~I2CEN; U0CTL &= ~I2C; I2CTCTL = 0; call HplUsartControl.disableSPI(); } command void HplUsartControl.setModeI2C() { // Recommended init procedure U0CTL = I2C + SYNC + MST; // use 1MHz SMCLK as the I2C reference I2CTCTL |= I2CSSEL_2 | I2CTRX; // Enable I2C U0CTL |= I2CEN; return; } command error_t HplUsartControl.isTxEmpty(){ if (U0TCTL & TXEPT) { return SUCCESS; } return FAIL; } command error_t HplUsartControl.isTxIntrPending(){ if (IFG1 & UTXIFG0){ IFG1 &= ~UTXIFG0; return SUCCESS; } return FAIL; } command error_t HplUsartControl.isRxIntrPending(){ if (IFG1 & URXIFG0){ IFG1 &= ~URXIFG0; return SUCCESS; } return FAIL; } command void HplUsartControl.tx(uint8_t data){ U0TXBUF = data; } command uint8_t HplUsartControl.rx(){ return U0RXBUF; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/msp430/HplUsartControl.nc000066400000000000000000000040561207233610700235050ustar00rootroot00000000000000// $Id: HplUsartControl.nc,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ #include interface HplUsartControl { command void disableSPI(); command void setModeSPI(); command void disableI2C(); command void setModeI2C(); command error_t isTxEmpty(); command error_t isTxIntrPending(); command error_t isRxIntrPending(); command void tx(uint8_t data); command uint8_t rx(); } tinyos-2.1.2+dfsg/tos/lib/tosboot/msp430/InternalFlashC.nc000066400000000000000000000077001207233610700232360ustar00rootroot00000000000000// $Id: InternalFlashC.nc,v 1.4 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * InternalFlashC.nc - Internal flash implementation for telos msp * platform. On the msp, the flash must first be erased before a value * can be written. However, the msp can only erase the flash at a * segment granularity (128 bytes for the information section). This * module allows transparent read/write of individual bytes to the * information section by dynamically switching between the two * provided segments in the information section. * * Valid address range is 0x1000 - 0x107E (0x107F is used to store the * version number of the information segment). * * @author Jonathan Hui */ module InternalFlashC { provides interface InternalFlash; } implementation { enum { IFLASH_OFFSET = 0x1000, IFLASH_SIZE = 128, IFLASH_SEG0_VNUM_ADDR = 0x107f, IFLASH_SEG1_VNUM_ADDR = 0x10ff, IFLASH_INVALID_VNUM = -1, }; uint8_t chooseSegment() { int8_t vnum0 = *(int8_t*)IFLASH_SEG0_VNUM_ADDR; int8_t vnum1 = *(int8_t*)IFLASH_SEG1_VNUM_ADDR; if (vnum0 == IFLASH_INVALID_VNUM) return 1; else if (vnum1 == IFLASH_INVALID_VNUM) return 0; return ( (int8_t)(vnum0 - vnum1) < 0 ); } command error_t InternalFlash.write(void* addr, void* buf, uint16_t size) { volatile int8_t *newPtr; int8_t *oldPtr; int8_t *bufPtr = (int8_t*)buf; int8_t version; uint16_t i; addr += IFLASH_OFFSET; newPtr = oldPtr = (int8_t*)IFLASH_OFFSET; if (chooseSegment()) { oldPtr += IFLASH_SIZE; } else { addr += IFLASH_SIZE; newPtr += IFLASH_SIZE; } FCTL2 = FWKEY + FSSEL1 + FN2; FCTL3 = FWKEY; FCTL1 = FWKEY + ERASE; *newPtr = 0; FCTL1 = FWKEY + WRT; for ( i = 0; i < IFLASH_SIZE-1; i++, newPtr++, oldPtr++ ) { if ((uint16_t)newPtr < (uint16_t)addr || (uint16_t)addr+size <= (uint16_t)newPtr) *newPtr = *oldPtr; else *newPtr = *bufPtr++; } version = *oldPtr + 1; if (version == IFLASH_INVALID_VNUM) version++; *newPtr = version; FCTL1 = FWKEY; FCTL3 = FWKEY + LOCK; return SUCCESS; } command error_t InternalFlash.read(void* addr, void* buf, uint16_t size) { addr += IFLASH_OFFSET; if (chooseSegment()) addr += IFLASH_SIZE; memcpy(buf, addr, size); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/msp430/ProgFlashC.nc000066400000000000000000000050751207233610700223740ustar00rootroot00000000000000// $Id: ProgFlashC.nc,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ module ProgFlashC { provides { interface ProgFlash; } } implementation { enum { RESET_ADDR = 0xfffe, }; command error_t ProgFlash.write(in_flash_addr_t addr, uint8_t* buf, uint16_t len) { volatile uint16_t *flashAddr = (uint16_t*)(uint16_t)addr; uint16_t *wordBuf = (uint16_t*)buf; uint16_t i = 0; // len is 16 bits so it can't be larger than 0xffff // make sure we can't wrap around if (addr < (0xffff - (len >> 1))) { FCTL2 = FWKEY + FSSEL1 + FN2; FCTL3 = FWKEY; FCTL1 = FWKEY + ERASE; *flashAddr = 0; FCTL1 = FWKEY + WRT; for (i = 0; i < (len >> 1); i++, flashAddr++) { if ((uint16_t)flashAddr != RESET_ADDR) *flashAddr = wordBuf[i]; else *flashAddr = TOSBOOT_START; } FCTL1 = FWKEY; FCTL3 = FWKEY + LOCK; return SUCCESS; } return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/msp430/VoltageC.nc000066400000000000000000000047251207233610700221110ustar00rootroot00000000000000// $Id: VoltageC.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ module VoltageC { provides { interface Voltage; } } implementation { enum { VTHRESH = 0xE66, // 2.7V }; command bool Voltage.okToProgram() { int i; // Turn on and set up ADC12 with REF_1_5V ADC12CTL0 = ADC12ON | SHT0_2 | REFON; // Use sampling timer ADC12CTL1 = SHP; // Set up to sample voltage ADC12MCTL0 = EOS | SREF_1 | INCH_11; // Delay for reference start-up for ( i=0; i<0x3600; i++ ); // Enable conversions ADC12CTL0 |= ENC; // Start conversion ADC12CTL0 |= ADC12SC; // Wait for completion while ((ADC12IFG & BIT0) == 0); // Turn off ADC12 ADC12CTL0 &= ~ENC; ADC12CTL0 = 0; // Check if voltage is greater than 2.7V return ( ADC12MEM0 > VTHRESH ); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/msp430f1611/000077500000000000000000000000001207233610700205325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/msp430f1611/PluginC.nc000066400000000000000000000036651207233610700224270ustar00rootroot00000000000000// $Id: PluginC.nc,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ configuration PluginC { provides { interface StdControl; } } implementation { components ExtFlashC, LedsC, PowerOffC; StdControl = PowerOffC; PowerOffC.Leds -> LedsC; PowerOffC.SubControl -> ExtFlashC; } tinyos-2.1.2+dfsg/tos/lib/tosboot/msp430f1611/PowerOffC.nc000066400000000000000000000050401207233610700227050ustar00rootroot00000000000000// $Id: PowerOffC.nc,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ module PowerOffC { provides { interface Init; interface StdControl; } uses { interface Leds; interface StdControl as SubControl; } } implementation { void haltsystem() { uint16_t _lpmreg; TOSH_SET_PIN_DIRECTIONS(); call SubControl.stop(); call Leds.glow(0x7, 0x0); _lpmreg = LPM4_bits; _lpmreg |= SR_GIE; __asm__ __volatile__( "bis %0, r2" : : "m" ((uint16_t)_lpmreg) ); } command error_t Init.init() { return SUCCESS; } command error_t StdControl.start() { int i; // wait a short period for things to stabilize for ( i = 0; i < 4; i++ ) wait(0xffff); // if user button is pressed, power down if (!TOSH_READ_USERINT_PIN()) haltsystem(); return SUCCESS; } command error_t StdControl.stop() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/msp430f1611/TOSBoot_platform.h000066400000000000000000000042431207233610700241030ustar00rootroot00000000000000// $Id: TOSBoot_platform.h,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui */ #ifndef __TOSBOOT_PLATFORM_H__ #define __TOSBOOT_PLATFORM_H__ enum { TOSBOOT_ARGS_ADDR = 0x70, // address of TOSBoot args in internal flash TOSBOOT_GESTURE_MAX_COUNT = 3, // number of resets to force golden image TOSBOOT_GOLDEN_IMG_ADDR = 0xf0000L, // address of the golden image in external flash TOSBOOT_INT_PAGE_SIZE = 512L, // size of each internal program flash page }; enum { DELUGE_MIN_ADV_PERIOD_LOG2 = 9, DELUGE_QSIZE = 1, }; #endif tinyos-2.1.2+dfsg/tos/lib/tosboot/mulle/000077500000000000000000000000001207233610700201435ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/mulle/ExecC.nc000066400000000000000000000040241207233610700214540ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the Exec interface for the Mulle platform. * The interface is responsible for starting the execution of * the user program which is located with a starting address * of 0xa0000 in the program flash. * * @author Henrik Makitaavola */ #include "hardware.h" module ExecC { provides { interface Exec; } } implementation { command void Exec.exec() { asm volatile ("jmp.a 0xa0000"); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/mulle/PluginC.nc000066400000000000000000000036141207233610700220320ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * No extra plugins are required to be started for tosboot. * * @author Henrik Makitaavola */ module PluginC { provides { interface StdControl; } } implementation { command error_t StdControl.start() { return SUCCESS; } command error_t StdControl.stop() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/mulle/VoltageC.nc000066400000000000000000000035711207233610700221770ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * VoltageC provides a implementation of the Voltage interface. * * @author Henrik Makitaavola */ module VoltageC { provides { interface Voltage; } } implementation { command bool Voltage.okToProgram() { // TODO(henrik) Implement return true; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/mulle/hardware.h000066400000000000000000000050071207233610700221130ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Henrik Makitaavola */ #ifndef __HARDWARE_H__ #define __HARDWARE_H__ #include #include typedef uint32_t in_flash_addr_t; typedef uint32_t ex_flash_addr_t; static inline void wait( uint16_t dt ) { uint16_t i; for (i = 0; i < dt; ++i) { TOSH_wait(); } } // LED assignments TOSH_ASSIGN_PIN(RED_LED, 3, 6); TOSH_ASSIGN_PIN(GREEN_LED, 3, 7); TOSH_ASSIGN_PIN(YELLOW_LED, 3, 4); // Flash assignments TOSH_ASSIGN_PIN(FLASH_IN, 4, 0); TOSH_ASSIGN_PIN(FLASH_OUT, 4, 1); TOSH_ASSIGN_PIN(FLASH_CLK, 4, 2); TOSH_ASSIGN_PIN(FLASH_CS, 4, 5); TOSH_ASSIGN_PIN(FLASH_VCC, 3, 2); void TOSH_SET_PIN_DIRECTIONS(void) { TOSH_MAKE_RED_LED_OUTPUT(); TOSH_MAKE_YELLOW_LED_OUTPUT(); TOSH_MAKE_GREEN_LED_OUTPUT(); TOSH_MAKE_FLASH_VCC_OUTPUT(); TOSH_CLR_FLASH_VCC_PIN(); } // TODO(henrik) Insert correct value enum { VTHRESH = 0x0, // 0V }; #endif // __HARDWARE_H__ tinyos-2.1.2+dfsg/tos/lib/tosboot/mulle/m16chardware.h000066400000000000000000000126431207233610700226060ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * @author Henrik Makitaavola * @author Jason Hill * @author Philip Levis * @author Nelson Lee */ #ifndef __M16CHARDWARE_H__ #define __M16CHARDWARE_H__ #define sbi(port, bit) SET_BIT(port, bit) #define cbi(port, bit) CLR_BIT(port, bit) #define TOSH_ASSIGN_PIN(name, port, bit) \ static inline void TOSH_SET_##name##_PIN() {sbi(P##port.BYTE , bit);} \ static inline void TOSH_CLR_##name##_PIN() {cbi(P##port.BYTE , bit);} \ static inline int TOSH_READ_##name##_PIN() \ {return ((P##port.BYTE) & (1 << bit)) != 0;} \ static inline void TOSH_MAKE_##name##_OUTPUT() {sbi(PD##port.BYTE , bit);} \ static inline void TOSH_MAKE_##name##_INPUT() {cbi(PD##port.BYTE , bit);} #define TOSH_ASSIGN_OUTPUT_ONLY_PIN(name, port, bit) \ static inline void TOSH_SET_##name##_PIN() {sbi(P##port , bit);} \ static inline void TOSH_CLR_##name##_PIN() {cbi(P##port , bit);} \ static inline void TOSH_MAKE_##name##_OUTPUT() {;} #define TOSH_ALIAS_OUTPUT_ONLY_PIN(alias, connector)\ static inline void TOSH_SET_##alias##_PIN() {TOSH_SET_##connector##_PIN();} \ static inline void TOSH_CLR_##alias##_PIN() {TOSH_CLR_##connector##_PIN();} \ static inline void TOSH_MAKE_##alias##_OUTPUT() {} \ #define TOSH_ALIAS_PIN(alias, connector) \ static inline void TOSH_SET_##alias##_PIN() {TOSH_SET_##connector##_PIN();} \ static inline void TOSH_CLR_##alias##_PIN() {TOSH_CLR_##connector##_PIN();} \ static inline char TOSH_READ_##alias##_PIN() {return TOSH_READ_##connector##_PIN();} \ static inline void TOSH_MAKE_##alias##_OUTPUT() {TOSH_MAKE_##connector##_OUTPUT();} \ static inline void TOSH_MAKE_##alias##_INPUT() {TOSH_MAKE_##connector##_INPUT();} void TOSH_wait() { asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); } #endif // __M16CHARDWARE_H__ tinyos-2.1.2+dfsg/tos/lib/tosboot/stm25p/000077500000000000000000000000001207233610700201575ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/stm25p/ExtFlashC.nc000066400000000000000000000037741207233610700223350ustar00rootroot00000000000000// $Id: ExtFlashC.nc,v 1.4 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ configuration ExtFlashC { provides { interface Init; interface StdControl; interface ExtFlash; } } implementation { components ExtFlashP, HplUsart0C; Init = ExtFlashP; StdControl = ExtFlashP; ExtFlash = ExtFlashP; ExtFlashP.UsartControl -> HplUsart0C; } tinyos-2.1.2+dfsg/tos/lib/tosboot/stm25p/ExtFlashP.nc000066400000000000000000000064631207233610700223500ustar00rootroot00000000000000// $Id: ExtFlashP.nc,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui */ module ExtFlashP { provides { interface StdControl; interface Init; interface ExtFlash; } uses { interface HplUsartControl as UsartControl; } } implementation { command error_t Init.init() { TOSH_MAKE_FLASH_HOLD_OUTPUT(); TOSH_MAKE_FLASH_CS_OUTPUT(); TOSH_SET_FLASH_HOLD_PIN(); call UsartControl.setModeSPI(); return SUCCESS; } command error_t StdControl.start() { return SUCCESS; } command error_t StdControl.stop() { TOSH_CLR_FLASH_CS_PIN(); call UsartControl.tx(0xb9); while(call UsartControl.isTxEmpty() != SUCCESS); TOSH_SET_FLASH_CS_PIN(); call UsartControl.disableSPI(); return SUCCESS; } void powerOnFlash() { uint8_t i; TOSH_CLR_FLASH_CS_PIN(); // command byte + 3 dummy bytes + signature for ( i = 0; i < 5; i++ ) { call UsartControl.tx(0xab); while(call UsartControl.isTxIntrPending() != SUCCESS); } TOSH_SET_FLASH_CS_PIN(); } command void ExtFlash.startRead(uint32_t addr) { uint8_t i; powerOnFlash(); TOSH_CLR_FLASH_CS_PIN(); // add command byte to address addr |= (uint32_t)0x3 << 24; // address for ( i = 4; i > 0; i-- ) { call UsartControl.tx((addr >> (i-1)*8) & 0xff); while(call UsartControl.isTxIntrPending() != SUCCESS); } } command uint8_t ExtFlash.readByte() { call UsartControl.rx(); call UsartControl.tx(0); while(call UsartControl.isRxIntrPending() != SUCCESS); return call UsartControl.rx(); } command void ExtFlash.stopRead() { TOSH_SET_FLASH_CS_PIN(); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/telosb/000077500000000000000000000000001207233610700203155ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/telosb/hardware.h000066400000000000000000000053501207233610700222660ustar00rootroot00000000000000// $Id: hardware.h,v 1.3 2010-06-29 22:07:50 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ #ifndef __HARDWARE_H__ #define __HARDWARE_H__ #include "msp430hardware.h" // internal flash is 16 bits in width typedef uint16_t in_flash_addr_t; // external flash is 32 bits in width typedef uint32_t ex_flash_addr_t; void wait(uint16_t t) { for ( ; t > 0; t-- ) { __delay_cycles(0); } } // LEDs TOSH_ASSIGN_PIN(RED_LED, 5, 4); TOSH_ASSIGN_PIN(GREEN_LED, 5, 5); TOSH_ASSIGN_PIN(YELLOW_LED, 5, 6); // UART pins TOSH_ASSIGN_PIN(SOMI0, 3, 2); TOSH_ASSIGN_PIN(SIMO0, 3, 1); TOSH_ASSIGN_PIN(UCLK0, 3, 3); TOSH_ASSIGN_PIN(UTXD0, 3, 4); TOSH_ASSIGN_PIN(URXD0, 3, 5); // User Interupt Pin TOSH_ASSIGN_PIN(USERINT, 2, 7); // FLASH TOSH_ASSIGN_PIN(FLASH_PWR, 4, 3); TOSH_ASSIGN_PIN(FLASH_CS, 4, 4); TOSH_ASSIGN_PIN(FLASH_HOLD, 4, 7); void TOSH_SET_PIN_DIRECTIONS(void) { P3SEL = 0x0E; // set SPI and I2C to mod func P1DIR = 0xe0; P1OUT = 0x00; P2DIR = 0x7b; P2OUT = 0x10; P3DIR = 0xf1; P3OUT = 0x00; P4DIR = 0xfd; P4OUT = 0xdd; P5DIR = 0xff; P5OUT = 0xff; P6DIR = 0xff; P6OUT = 0x00; } #endif tinyos-2.1.2+dfsg/tos/lib/tosboot/tinynode/000077500000000000000000000000001207233610700206565ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosboot/tinynode/ExecC.nc000066400000000000000000000036731207233610700222000ustar00rootroot00000000000000// $Id: ExecC.nc,v 1.2 2010-06-29 22:07:50 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Jonathan Hui */ module ExecC { provides { interface Exec; } } implementation { command void Exec.exec() { //goto *(void*)(TOSBOOT_END); typedef void __attribute__((noreturn)) (*tosboot_exec)(); ((tosboot_exec)TOSBOOT_END)(); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/tinynode/ExtFlashC.nc000066400000000000000000000112471207233610700230260ustar00rootroot00000000000000// $Id: ExtFlashC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui * @author Roland Flury */ module ExtFlashC { provides { interface Init; interface StdControl; interface ExtFlash; } } /** * Simple reader module to access the Atmel at45db041 flash chip */ implementation { uint32_t addr; command error_t Init.init() { TOSH_SET_FLASH_CS_PIN(); // inverted, deselect by default TOSH_MAKE_FLASH_CS_OUTPUT(); TOSH_CLR_FLASH_CLK_PIN(); TOSH_MAKE_FLASH_CLK_OUTPUT(); TOSH_SET_FLASH_OUT_PIN(); TOSH_MAKE_FLASH_OUT_OUTPUT(); TOSH_MAKE_FLASH_IN_INPUT(); TOSH_SET_FLASH_RESET_PIN(); // inverted TOSH_MAKE_FLASH_RESET_OUTPUT(); return SUCCESS; } command error_t StdControl.start() { return SUCCESS; } command error_t StdControl.stop() { return SUCCESS; } /** * Write a Byte over the SPI bus and receive a Byte * * upon calling this function, /CS must be CLR */ uint8_t SPIByte(uint8_t out) { uint8_t in = 0; uint8_t i; for ( i = 0; i < 8; i++, out <<= 1 ) { // write bit if (out & 0x80) { TOSH_SET_FLASH_OUT_PIN(); } else { TOSH_CLR_FLASH_OUT_PIN(); } // clock TOSH_SET_FLASH_CLK_PIN(); // read bit in <<= 1; if (TOSH_READ_FLASH_IN_PIN()) { in |= 1; } // clock TOSH_CLR_FLASH_CLK_PIN(); } return in; } /** * Initializes the flash to read Byte after Byte starting * from the given address. * * Subsequent calls to readByte() will return the Bytes * starting from the specified address. * * stopRead() terminates this process and disables the Flash. */ command void ExtFlash.startRead(uint32_t newAddr) { uint8_t cmdBuf[4]; uint8_t i; // we're using "Waveform 1 - Inactive Clock Polarity Low" // see p.7 of data sheet TOSH_CLR_FLASH_CLK_PIN(); TOSH_CLR_FLASH_CS_PIN(); // select the flash addr = newAddr; // we only use 256 Bytes per block (of 264 Bytes) cmdBuf[0] = 0x52; // command for reading data starting at the following address cmdBuf[1] = (addr >> 15) & 0xff; // 4 LSbits cmdBuf[2] = (addr >> 7) & 0xfe; // 7 MSbits with the above 4 bits describe page to read cmdBuf[3] = addr & 0xff; // Offset to Byte in page to read // transmit read command for(i = 0; i < 4; i++) { SPIByte(cmdBuf[i]); } // transmit 4 Bytes "don't care" as to spec for(i = 0; i < 4; i++) { SPIByte(0x0); } // need to do one additional clock transition before reading TOSH_SET_FLASH_CLK_PIN(); TOSH_CLR_FLASH_CLK_PIN(); } command uint8_t ExtFlash.readByte() { uint8_t b = SPIByte(0); // write anything, read Byte addr++; if(0 == (addr & 0xFF)) { // we've just read the last Byte from a page // initialize the Flash to continue reading on the new page call ExtFlash.stopRead(); call ExtFlash.startRead(addr); } return b; } command void ExtFlash.stopRead() { TOSH_SET_FLASH_CS_PIN(); // disble Flash & tri-state the OUT-pin } } tinyos-2.1.2+dfsg/tos/lib/tosboot/tinynode/PowerOffC.nc000066400000000000000000000051331207233610700230340ustar00rootroot00000000000000// $Id: PowerOffC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ module PowerOffC { provides { interface Init; interface StdControl; } uses { interface Leds; interface StdControl as SubControl; } } implementation { void haltsystem() { uint16_t _lpmreg; TOSH_SET_PIN_DIRECTIONS(); call SubControl.stop(); call Leds.glow(0x7, 0x0); _lpmreg = LPM4_bits; _lpmreg |= SR_GIE; __asm__ __volatile__( "bis %0, r2" : : "m" ((uint16_t)_lpmreg) ); } command error_t Init.init() { return SUCCESS; } command error_t StdControl.start() { int i; // wait a short period for things to stabilize for ( i = 0; i < 4; i++ ) { wait(0xffff); } // TinyNode: we don't have a user button // if user button is pressed, power down //if (!TOSH_READ_USERINT_PIN()) { //haltsystem(); //} return SUCCESS; } command error_t StdControl.stop() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/tosboot/tinynode/README000066400000000000000000000010201207233610700215270ustar00rootroot00000000000000Deluge T2 for TinyNode ---------------------------------- These files are needed by Deluge T2 to compile for the TinyNode platform. Note: Reprogramming fails if the voltage of the node is not above a given threshold. Currently, this is set to 2.7V, which may be too high if you run your mote on batteries. In this case, set the value of VTHRESH in the hardware.h file to a different value. In case you wish not to test the voltage at all, modify VoltageC.nc s.t. the command Voltage.okToProgram() returns always TRUE. tinyos-2.1.2+dfsg/tos/lib/tosboot/tinynode/TOSBoot_platform.h000066400000000000000000000042371207233610700242320ustar00rootroot00000000000000// $Id: TOSBoot_platform.h,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui */ #ifndef __TOSBOOT_PLATFORM_H__ #define __TOSBOOT_PLATFORM_H__ enum { TOSBOOT_ARGS_ADDR = 0x70, // address of TOSBoot args in internal flash TOSBOOT_GESTURE_MAX_COUNT = 3, // number of resets to force golden image TOSBOOT_GOLDEN_IMG_ADDR = 0x0L, // address of the golden image in external flash TOSBOOT_INT_PAGE_SIZE = 512L, // size of each internal program flash page }; enum { DELUGE_MIN_ADV_PERIOD_LOG2 = 9, DELUGE_QSIZE = 1, }; #endif tinyos-2.1.2+dfsg/tos/lib/tosboot/tinynode/VoltageC.nc000066400000000000000000000047261207233610700227150ustar00rootroot00000000000000// $Id: VoltageC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * * * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui */ module VoltageC { provides { interface Voltage; } } implementation { command bool Voltage.okToProgram() { /** original code form the msp430 folder */ int i; // Turn on and set up ADC12 with REF_1_5V ADC12CTL0 = ADC12ON | SHT0_2 | REFON; // Use sampling timer ADC12CTL1 = SHP; // Set up to sample voltage ADC12MCTL0 = EOS | SREF_1 | INCH_11; // Delay for reference start-up for ( i=0; i<0x3600; i++ ); // Enable conversions ADC12CTL0 |= ENC; // Start conversion ADC12CTL0 |= ADC12SC; // Wait for completion while ((ADC12IFG & BIT0) == 0); // Turn off ADC12 ADC12CTL0 &= ~ENC; ADC12CTL0 = 0; // Check if voltage is greater than 2.7V return ( ADC12MEM0 > VTHRESH ); } } tinyos-2.1.2+dfsg/tos/lib/tosboot/tinynode/hardware.h000066400000000000000000000061561207233610700226340ustar00rootroot00000000000000// $Id: hardware.h,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * * * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * @author Jonathan Hui * @author Roland Flury */ #ifndef __HARDWARE_H__ #define __HARDWARE_H__ #include "msp430hardware.h" // internal flash is 16 bits in width typedef uint16_t in_flash_addr_t; // external flash is 32 bits in width typedef uint32_t ex_flash_addr_t; void wait(uint16_t t) { for(; t > 0; t--); } enum { VTHRESH = 0xE66, // 2.7V - threshold for reprogramming the node, if voltage is below, don't reprogram }; // LEDs TOSH_ASSIGN_PIN(RED_LED2, 1, 5); // on tinynode TOSH_ASSIGN_PIN(RED_LED, 1, 6); // external TOSH_ASSIGN_PIN(GREEN_LED, 2, 3); TOSH_ASSIGN_PIN(YELLOW_LED, 2, 4); // FLASH at45db041 TOSH_ASSIGN_PIN(FLASH_CS, 4, 7); // inverted TOSH_ASSIGN_PIN(FLASH_RESET, 4, 6); // inverted TOSH_ASSIGN_PIN(FLASH_CLK, 3, 3); TOSH_ASSIGN_PIN(FLASH_OUT, 3, 1); // MOSI - master OUT slave IN TOSH_ASSIGN_PIN(FLASH_IN, 3, 2); // MISO - master IN slave OUT void TOSH_SET_PIN_DIRECTIONS(void) { // FLASH at45db041 TOSH_SET_FLASH_CS_PIN(); // inverted TOSH_MAKE_FLASH_CS_OUTPUT(); TOSH_MAKE_FLASH_OUT_OUTPUT(); TOSH_MAKE_FLASH_CLK_OUTPUT(); TOSH_MAKE_FLASH_IN_INPUT(); TOSH_SET_FLASH_RESET_PIN(); // inverted TOSH_MAKE_FLASH_RESET_OUTPUT(); // LEDs TOSH_CLR_RED_LED2_PIN(); TOSH_CLR_RED_LED_PIN(); TOSH_CLR_YELLOW_LED_PIN(); TOSH_CLR_GREEN_LED_PIN(); TOSH_MAKE_RED_LED2_OUTPUT(); TOSH_MAKE_RED_LED_OUTPUT(); TOSH_MAKE_YELLOW_LED_OUTPUT(); TOSH_MAKE_GREEN_LED_OUTPUT(); } #endif tinyos-2.1.2+dfsg/tos/lib/tossim/000077500000000000000000000000001207233610700166525ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tossim/ActiveMessageAddressC.nc000066400000000000000000000064041207233610700233310ustar00rootroot00000000000000// $Id: ActiveMessageAddressC.nc,v 1.6 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageAddressC.nc,v 1.6 2010-06-29 22:07:51 scipio Exp $ * */ /** * Accessor methods for Active Messages. * * @author Philip Levis * @author Morten Tranberg Hansen (added ActiveMessageAddress) * @date June 19 2005 */ module ActiveMessageAddressC { provides { interface ActiveMessageAddress; async command am_addr_t amAddress(); async command void setAmAddress(am_addr_t a); } } implementation { bool set = FALSE; am_addr_t addr; am_group_t group = TOS_AM_GROUP; async command void ActiveMessageAddress.setAddress(am_group_t myGroup, am_addr_t myAddr) { addr = myAddr; group = myGroup; set = TRUE; signal ActiveMessageAddress.changed(); } async command am_addr_t ActiveMessageAddress.amAddress() { if(!set) { addr = TOS_NODE_ID; set = TRUE; } return addr; } async command am_group_t ActiveMessageAddress.amGroup() { return group; } async command am_addr_t amAddress() { return call ActiveMessageAddress.amAddress(); } async command void setAmAddress(am_addr_t a) { addr = a; set = TRUE; signal ActiveMessageAddress.changed(); } default async event void ActiveMessageAddress.changed() {} } tinyos-2.1.2+dfsg/tos/lib/tossim/ActiveMessageC.nc000066400000000000000000000051061207233610700220210ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.7 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * The basic chip-independent TOSSIM Active Message layer for radio chips * that do not have simulation support. * * @author Philip Levis * @date December 2 2005 */ configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; } } implementation { components TossimActiveMessageC as AM; components TossimPacketModelC as Network; components CpmModelC as Model; components ActiveMessageAddressC as Address; components MainC; MainC.SoftwareInit -> Network; SplitControl = Network; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = Network; AM.Model -> Network.Packet; AM.amAddress -> Address; Network.GainRadioModel -> Model; } tinyos-2.1.2+dfsg/tos/lib/tossim/BinaryInterferenceModelC.nc000066400000000000000000000130251207233610700240370ustar00rootroot00000000000000// $Id: BinaryInterferenceModelC.nc,v 1.5 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A binary interference model with length-independent packet error * rates (the old TOSSIM-packet story). * * @author Philip Levis * @date December 2 2005 */ #include module BinaryInterferenceModelC { provides interface SimpleRadioModel as Model; } implementation { message_t* outgoing; bool requestAck; void sim_binary_ack_handle(sim_event_t* evt) { if (outgoing != NULL && requestAck) { signal Model.acked(outgoing); } } sim_event_t receiveEvent; sim_time_t clearTime = 0; bool collision = FALSE; message_t* incoming = NULL; int incomingSource; command bool Model.clearChannel() { dbg("Binary", "Checking clear channel @ %s: %i\n", sim_time_string(), (clearTime < sim_time())); return clearTime < sim_time(); } void sim_schedule_ack(int source, sim_time_t time) { sim_event_t* ackEvent = (sim_event_t*)malloc(sizeof(sim_event_t)); ackEvent->mote = source; ackEvent->force = 0; ackEvent->cancelled = 0; ackEvent->time = time; ackEvent->handle = sim_binary_ack_handle; ackEvent->cleanup = sim_queue_cleanup_event; sim_queue_insert(ackEvent); } void sim_binary_receive_handle(sim_event_t* evt) { // If there was no collision, and we pass the loss // rate... if (!collision) { double loss = sim_binary_loss(incomingSource, sim_node()); int randVal = sim_random() % 1000000; dbg("Binary", "Handling receive event for %i.\n", sim_node()); loss *= 1000000.0; if (randVal < (int)loss) { signal Model.receive(incoming); loss = sim_binary_loss(sim_node(), incomingSource); randVal = sim_random() % 1000000; loss *= 1000000.0; if (randVal < (int)loss) { sim_schedule_ack(incomingSource, sim_time()); } } else { dbg("Binary", "Packet lost.\n"); } } else { dbg("Binary", "Receive event for %i was a collision.\n", sim_node()); } incoming = NULL; } void enqueue_receive_event(int source, sim_time_t endTime, message_t* msg) { if (incoming == NULL) { dbg("Binary", "Formatting reception event for %i.\n", sim_node()); receiveEvent.time = endTime; receiveEvent.mote = sim_node(); receiveEvent.cancelled = 0; receiveEvent.force = 0; receiveEvent.handle = sim_binary_receive_handle; receiveEvent.cleanup = sim_queue_cleanup_none; incoming = msg; sim_queue_insert(&receiveEvent); incoming = msg; incomingSource = source; } } void sim_binary_put(int dest, message_t* msg, sim_time_t endTime, bool receive) { int prevNode = sim_node(); sim_set_node(dest); if (clearTime < sim_time() && receive) { dbg("Binary", "Enqueing reception event for %i.\n", dest); enqueue_receive_event(prevNode, endTime - 1, msg); collision = FALSE; } else { collision = TRUE; } if (endTime > clearTime) { clearTime = endTime; } sim_set_node(prevNode); } command void Model.putOnAirToAll(message_t* msg, bool ack, sim_time_t endTime) { link_t* link = sim_binary_first(sim_node()); requestAck = FALSE; outgoing = msg; dbg("Binary", "Node %i broadcasting, first link is 0x%p.\n", sim_node(), sim_binary_first(sim_node())); while (link != NULL) { int other = link->mote; dbg("Binary", "Node %i transmitting to %i.\n", sim_node(), other); sim_binary_put(other, msg, endTime, TRUE); link = sim_binary_next(link); } } command void Model.putOnAirTo(int dest, message_t* msg, bool ack, sim_time_t endTime) { link_t* link = sim_binary_first(sim_node()); requestAck = ack; outgoing = msg; while (link != NULL) { int other = link->mote; sim_binary_put(other, msg, endTime, other == dest); dbg("Binary", "Node %i transmitting to %i.\n", sim_node(), dest); link = sim_binary_next(link); } } default event void Model.receive(message_t* msg) {} } tinyos-2.1.2+dfsg/tos/lib/tossim/CpmModelC.nc000066400000000000000000000405701207233610700210050ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * CPM (closest-pattern matching) is a wireless noise simulation model * based on statistical extraction from empirical noise data. This * model provides far more precise software simulation environment by * exploiting time-correlated noise characteristics. For details, * please refer to the paper * * "Improving Wireless Simulation through Noise Modeling." HyungJune * Lee and Philip Levis, IPSN 2007. You can find a copy at * http://sing.stanford.edu. * * @author Hyungjune Lee, Philip Levis * @date Oct 12 2006 */ #include #include #include module CpmModelC { provides interface GainRadioModel as Model; } implementation { message_t* outgoing; // If I'm sending, this is my outgoing packet bool requestAck; bool receiving = 0; // Whether or not I think I'm receiving a packet bool transmitting = 0; // Whether or not I think I'm tranmitting a packet sim_time_t transmissionEndTime; // to check pending transmission struct receive_message; typedef struct receive_message receive_message_t; struct receive_message { int source; sim_time_t start; sim_time_t end; double power; double reversePower; int8_t strength; bool lost; bool ack; message_t* msg; receive_message_t* next; }; receive_message_t* outstandingReceptionHead = NULL; receive_message_t* allocate_receive_message(); void free_receive_message(receive_message_t* msg); sim_event_t* allocate_receive_event(sim_time_t t, receive_message_t* m); bool shouldReceive(double SNR); bool checkReceive(receive_message_t* msg); double packetNoise(receive_message_t* msg); double checkPrr(receive_message_t* msg); double timeInMs() { sim_time_t ftime = sim_time(); int hours, minutes, seconds; sim_time_t secondBillionths; int temp_time; double ms_time; secondBillionths = (ftime % sim_ticks_per_sec()); if (sim_ticks_per_sec() > (sim_time_t)1000000000) { secondBillionths /= (sim_ticks_per_sec() / (sim_time_t)1000000000); } else { secondBillionths *= ((sim_time_t)1000000000 / sim_ticks_per_sec()); } temp_time = (int)(secondBillionths/10000); if (temp_time % 10 >= 5) { temp_time += (10-(temp_time%10)); } else { temp_time -= (temp_time%10); } ms_time = (float)(temp_time/100.0); seconds = (int)(ftime / sim_ticks_per_sec()); minutes = seconds / 60; hours = minutes / 60; seconds %= 60; minutes %= 60; ms_time += (hours*3600+minutes*60+seconds)*1000; return ms_time; } //Generate a CPM noise reading double noise_hash_generation() { double CT = timeInMs(); uint32_t quotient = ((sim_time_t)(CT*10))/10; uint8_t remain = (uint8_t)(((sim_time_t)(CT*10))%10); double noise_val; uint16_t node_id = sim_node(); dbg("CpmModelC", "IN: noise_hash_generation()\n"); if (5 <= remain && remain < 10) { noise_val = (double)sim_noise_generate(node_id, quotient+1); } else { noise_val = (double)sim_noise_generate(node_id, quotient); } dbg("CpmModelC,Tal", "%s: OUT: noise_hash_generation(): %lf\n", sim_time_string(), noise_val); return noise_val; } double packetSnr(receive_message_t* msg) { double signalStr = msg->power; double noise = noise_hash_generation(); return (signalStr - noise); } double arr_estimate_from_snr(double SNR) { double beta1 = 0.9794; double beta2 = 2.3851; double X = SNR-beta2; double PSE = 0.5*erfc(beta1*X/sqrt(2)); double prr_hat = pow(1-PSE, 23*2); dbg("CpmModelC,SNRLoss", "SNR is %lf, ARR is %lf\n", SNR, prr_hat); if (prr_hat > 1) prr_hat = 1.1; else if (prr_hat < 0) prr_hat = -0.1; return prr_hat; } int shouldAckReceive(double snr) { double prr = arr_estimate_from_snr(snr); double coin = RandomUniform(); if ( (prr >= 0) && (prr <= 1) ) { if (coin < prr) prr = 1.0; else prr = 0.0; } return (int)prr; } void sim_gain_ack_handle(sim_event_t* evt) { // Four conditions must hold for an ack to be issued: // 1) Transmitter is still sending a packet (i.e., not cancelled) // 2) The packet requested an acknowledgment // 3) The transmitter is on // 4) The packet passes the SNR/ARR curve if (requestAck && // This outgoing != NULL && sim_mote_is_on(sim_node())) { receive_message_t* rcv = (receive_message_t*)evt->data; double power = rcv->reversePower; double noise = packetNoise(rcv); double snr = power - noise; if (shouldAckReceive(snr)) { signal Model.acked(outgoing); } } free_receive_message((receive_message_t*)evt->data); } sim_event_t receiveEvent; // This clear threshold comes from the CC2420 data sheet double clearThreshold = -72.0; bool collision = FALSE; message_t* incoming = NULL; int incomingSource; command void Model.setClearValue(double value) { clearThreshold = value; dbg("CpmModelC", "Setting clear threshold to %f\n", clearThreshold); } command bool Model.clearChannel() { dbg("CpmModelC", "Checking clear channel @ %s: %f <= %f \n", sim_time_string(), (double)packetNoise(NULL), clearThreshold); return packetNoise(NULL) < clearThreshold; } void sim_gain_schedule_ack(int source, sim_time_t t, receive_message_t* r) { sim_event_t* ackEvent = (sim_event_t*)malloc(sizeof(sim_event_t)); ackEvent->mote = source; ackEvent->force = 1; ackEvent->cancelled = 0; ackEvent->time = t; ackEvent->handle = sim_gain_ack_handle; ackEvent->cleanup = sim_queue_cleanup_event; ackEvent->data = r; sim_queue_insert(ackEvent); } double prr_estimate_from_snr(double SNR) { // Based on CC2420 measurement by Kannan. // The updated function below fixes the problem of non-zero PRR // at very low SNR. With this function PRR is 0 for SNR <= 3. double beta1 = 0.9794; double beta2 = 2.3851; double X = SNR-beta2; double PSE = 0.5*erfc(beta1*X/sqrt(2)); double prr_hat = pow(1-PSE, 23*2); dbg("CpmModelC,SNR", "SNR is %lf, PRR is %lf\n", SNR, prr_hat); if (prr_hat > 1) prr_hat = 1.1; else if (prr_hat < 0) prr_hat = -0.1; return prr_hat; } bool shouldReceive(double SNR) { double prr = prr_estimate_from_snr(SNR); double coin = RandomUniform(); if ( (prr >= 0) && (prr <= 1) ) { if (coin < prr) prr = 1.0; else prr = 0.0; } return prr; } bool checkReceive(receive_message_t* msg) { double noise = noise_hash_generation(); receive_message_t* list = outstandingReceptionHead; noise = pow(10.0, noise / 10.0); while (list != NULL) { if (list != msg) { noise += pow(10.0, list->power / 10.0); } list = list->next; } noise = 10.0 * log(noise) / log(10.0); return shouldReceive(msg->power - noise); } double packetNoise(receive_message_t* msg) { double noise = noise_hash_generation(); receive_message_t* list = outstandingReceptionHead; noise = pow(10.0, noise / 10.0); while (list != NULL) { if (list != msg) { noise += pow(10.0, list->power / 10.0); } list = list->next; } noise = 10.0 * log(noise) / log(10.0); return noise; } double checkPrr(receive_message_t* msg) { return prr_estimate_from_snr(msg->power / packetNoise(msg)); } /* Handle a packet reception. If the packet is being acked, pass the corresponding receive_message_t* to the ack handler, otherwise free it. */ void sim_gain_receive_handle(sim_event_t* evt) { receive_message_t* mine = (receive_message_t*)evt->data; receive_message_t* predecessor = NULL; receive_message_t* list = outstandingReceptionHead; dbg("CpmModelC", "Handling reception event @ %s.\n", sim_time_string()); while (list != NULL) { if (list->next == mine) { predecessor = list; } list = list->next; } if (predecessor) { predecessor->next = mine->next; } else if (mine == outstandingReceptionHead) { // must be head outstandingReceptionHead = mine->next; } else { dbgerror("CpmModelC", "Incoming packet list structure is corrupted: entry is not the head and no entry points to it.\n"); } dbg("CpmModelC,SNRLoss", "Packet from %i to %i\n", (int)mine->source, (int)sim_node()); if (!checkReceive(mine)) { dbg("CpmModelC,SNRLoss", " - lost packet from %i as SNR was too low.\n", (int)mine->source); mine->lost = 1; } if (!mine->lost) { // Copy this receiver's packet signal strength to the metadata region // of the packet. Note that this packet is actually shared across all // receivers: a higher layer performs the copy. tossim_metadata_t* meta = (tossim_metadata_t*)(&mine->msg->metadata); meta->strength = mine->strength; dbg_clear("CpmModelC,SNRLoss", " -signaling reception\n"); signal Model.receive(mine->msg); if (mine->ack) { dbg_clear("CpmModelC", " acknowledgment requested, "); } else { dbg_clear("CpmModelC", " no acknowledgment requested.\n"); } // If we scheduled an ack, receiving = 0 when it completes if (mine->ack && signal Model.shouldAck(mine->msg)) { dbg_clear("CpmModelC", " scheduling ack.\n"); sim_gain_schedule_ack(mine->source, sim_time() + 1, mine); } else { // Otherwise free the receive_message_t* free_receive_message(mine); } // We're searching for new packets again receiving = 0; } // If the packet was lost, then we're searching for new packets again else { if (RandomUniform() < 0.001) { dbg("CpmModelC,SNRLoss", "Packet was technically lost, but TOSSIM introduces an ack false positive rate.\n"); if (mine->ack && signal Model.shouldAck(mine->msg)) { dbg_clear("CpmModelC", " scheduling ack.\n"); sim_gain_schedule_ack(mine->source, sim_time() + 1, mine); } else { // Otherwise free the receive_message_t* free_receive_message(mine); } } else { free_receive_message(mine); } receiving = 0; dbg_clear("CpmModelC,SNRLoss", " -packet was lost.\n"); } } // Create a record that a node is receiving a packet, // enqueue a receive event to figure out what happens. void enqueue_receive_event(int source, sim_time_t endTime, message_t* msg, bool receive, double power, double reversePower) { sim_event_t* evt; receive_message_t* list; receive_message_t* rcv = allocate_receive_message(); double noiseStr = packetNoise(rcv); rcv->source = source; rcv->start = sim_time(); rcv->end = endTime; rcv->power = power; rcv->reversePower = reversePower; // The strength of a packet is the sum of the signal and noise. In most cases, this means // the signal. By sampling this here, it assumes that the packet RSSI is sampled at // the beginning of the packet. This is true for the CC2420, but is not true for all // radios. But generalizing seems like complexity for minimal gain at this point. rcv->strength = (int8_t)(floor(10.0 * log(pow(10.0, power/10.0) + pow(10.0, noiseStr/10.0)) / log(10.0))); rcv->msg = msg; rcv->lost = 0; rcv->ack = receive; // If I'm off, I never receive the packet, but I need to keep track of // it in case I turn on and someone else starts sending me a weaker // packet. So I don't set receiving to 1, but I keep track of // the signal strength. if (!sim_mote_is_on(sim_node())) { dbg("CpmModelC", "Lost packet from %i due to %i being off\n", source, sim_node()); rcv->lost = 1; } else if (!shouldReceive(power - noiseStr)) { dbg("CpmModelC,SNRLoss", "Lost packet from %i to %i due to SNR being too low (%i)\n", source, sim_node(), (int)(power - noiseStr)); rcv->lost = 1; } else if (receiving) { dbg("CpmModelC,SNRLoss", "Lost packet from %i due to %i being mid-reception\n", source, sim_node()); rcv->lost = 1; } else if (transmitting && (rcv->start < transmissionEndTime) && (transmissionEndTime <= rcv->end)) { dbg("CpmModelC,SNRLoss", "Lost packet from %i due to %i being mid-transmission, transmissionEndTime %llu\n", source, sim_node(), transmissionEndTime); rcv->lost = 1; } else { receiving = 1; } list = outstandingReceptionHead; while (list != NULL) { if (!shouldReceive(list->power - rcv->power)) { dbg("Gain,SNRLoss", "Going to lose packet from %i with signal %lf as am receiving a packet from %i with signal %lf\n", list->source, list->power, source, rcv->power); list->lost = 1; } list = list->next; } rcv->next = outstandingReceptionHead; outstandingReceptionHead = rcv; evt = allocate_receive_event(endTime, rcv); sim_queue_insert(evt); } void sim_gain_put(int dest, message_t* msg, sim_time_t endTime, bool receive, double power, double reversePower) { int prevNode = sim_node(); dbg("CpmModelC", "Enqueing reception event for %i at %llu with power %lf.\n", dest, endTime, power); sim_set_node(dest); enqueue_receive_event(prevNode, endTime, msg, receive, power, reversePower); sim_set_node(prevNode); } command void Model.putOnAirTo(int dest, message_t* msg, bool ack, sim_time_t endTime, double power, double reversePower) { receive_message_t* list; gain_entry_t* neighborEntry = sim_gain_first(sim_node()); requestAck = ack; outgoing = msg; transmissionEndTime = endTime; dbg("CpmModelC", "Node %i transmitting to %i, finishes at %llu.\n", sim_node(), dest, endTime); while (neighborEntry != NULL) { int other = neighborEntry->mote; sim_gain_put(other, msg, endTime, ack, power + sim_gain_value(sim_node(), other), reversePower + sim_gain_value(other, sim_node())); neighborEntry = sim_gain_next(neighborEntry); } list = outstandingReceptionHead; while (list != NULL) { list->lost = 1; dbg("CpmModelC,SNRLoss", "Lost packet from %i because %i has outstanding reception, startTime %llu endTime %llu\n", list->source, sim_node(), list->start, list->end); list = list->next; } } command void Model.setPendingTransmission() { transmitting = TRUE; dbg("CpmModelC", "setPendingTransmission: transmitting %i @ %s\n", transmitting, sim_time_string()); } default event void Model.receive(message_t* msg) {} sim_event_t* allocate_receive_event(sim_time_t endTime, receive_message_t* msg) { sim_event_t* evt = (sim_event_t*)malloc(sizeof(sim_event_t)); evt->mote = sim_node(); evt->time = endTime; evt->handle = sim_gain_receive_handle; evt->cleanup = sim_queue_cleanup_event; evt->cancelled = 0; evt->force = 1; // Need to keep track of air even when node is off evt->data = msg; return evt; } receive_message_t* allocate_receive_message() { return (receive_message_t*)malloc(sizeof(receive_message_t)); } void free_receive_message(receive_message_t* msg) { free(msg); } } tinyos-2.1.2+dfsg/tos/lib/tossim/DemoSensorC.nc000066400000000000000000000033401207233610700213550ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ generic configuration DemoSensorC(){ provides interface Read; } implementation { components new ConstantSensorC(uint16_t, 0xbeef); Read = ConstantSensorC; } tinyos-2.1.2+dfsg/tos/lib/tossim/Driver.c000066400000000000000000000012001207233610700202420ustar00rootroot00000000000000#include int main() { Tossim* t = new Tossim(NULL); t->init(); //t->addChannel("Scheduler", fdopen(1, "w")); //t->addChannel("TossimPacketModelC", fdopen(1, "w")); t->addChannel("LedsC", fdopen(1, "w")); t->addChannel("AM", fdopen(1, "w")); Radio* r = t->radio(); for (int i = 0; i < 2; i++) { printf("Mote %i at %i\n", i, 15000000 * i + 1); Mote* m = t->getNode(i); m->bootAtTime(15000000 * i + 1); r->setNoise(i, -77.0, 3); for (int j = 0; j < 2; j++) { if (i != j) { r->add(i, j, -50.0); } } } for (int i = 0; i < 60; i++) { t->runNextEvent(); } } tinyos-2.1.2+dfsg/tos/lib/tossim/GainRadioModel.nc000066400000000000000000000045441207233610700220210ustar00rootroot00000000000000// $Id: GainRadioModel.nc,v 1.8 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The interface to a gain-based radio model, which considers * signal strength of transmission and propagation. It also * includes a clear channel estimate. The actual implementation * of the model (e.g., noise, signal collision) is generally * C-based. * * @author Philip Levis * @date December 2 2005 */ #include "TinyError.h" interface GainRadioModel { command void putOnAirTo(int dest, message_t* msg, bool ack, sim_time_t endTime, double gain, double reverseGain); command void setClearValue(double value); command bool clearChannel(); command void setPendingTransmission(); event void acked(message_t* msg); event void receive(message_t* msg); event bool shouldAck(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/tossim/MainC.nc000066400000000000000000000057241207233610700201730ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This version of Main is the system interface the TinyOS boot * sequence in TOSSIM. It wires the boot sequence implementation to * the scheduler and hardware resources. Unlike the standard Main, * it does not actually define the main function, as a * TOSSIM simulation is triggered from Python. * * @author Philip Levis * @date August 6 2005 */ // $Id: MainC.nc,v 1.6 2010-06-29 22:07:51 scipio Exp $ #include "hardware.h" configuration MainC { provides interface Boot; uses interface Init as SoftwareInit; } implementation { components PlatformC, SimMainP, TinySchedulerC; // SimMoteP is not referred to by any component here. // It is included to make sure nesC loads it, as it // includes functionality many other systems depend on. components SimMoteP; SimMainP.Scheduler -> TinySchedulerC; SimMainP.PlatformInit -> PlatformC; // Export the SoftwareInit and Booted for applications SoftwareInit = SimMainP.SoftwareInit; Boot = SimMainP; // This component may not be used by the application, but it must // be included. This is because there are Python calls that deliver // packets, and those python calls must terminate somewhere. If // the application does not wire this up to, e.g., ActiveMessageC, // the default handlers make sure nothing happens when a script // tries to deliver a packet to a node that has no radio stack. components ActiveMessageC; } tinyos-2.1.2+dfsg/tos/lib/tossim/PlatformC.nc000066400000000000000000000036201207233610700210640ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The default simulation platform, which does nothing. * * @author Phil Levis * @date November 22 2005 */ // $Id: PlatformC.nc,v 1.6 2010-06-29 22:07:51 scipio Exp $ module PlatformC { provides interface Init; } implementation { command error_t Init.init() { dbg("PlatformC", "Initialized mote.\n"); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/tossim/README000066400000000000000000000016311207233610700175330ustar00rootroot00000000000000README for tinyos-2.x/tos/lib/tossim This directory contains the core code for the TOSSIM TinyOS simulator. One characteristic of TOSSIM is that it can controlled through a Python script. Building simple yet efficient support for this requires presenting most TOSSIM abstractions in a C++ interface, which is then transformed into a Python interface with the SWIG tool. This leads most TOSSIM abstractions to have three levels: C, nesC, and C++. Because nesC cannot call C++ and vice versa, TOSSIM exports its important call points as C functions. It links simple C++ wrapper classes against the simulation binary. Python can then call through the C++ interface. The files tossim.h and tossim.c, for example, are the basic TOSSIM C++ classes of Mote, Tossim, and Variable. These call functions in sim_tossim.c, which other parts of TOSSIM also call. The examples/ directory contains some sample Python scripts. tinyos-2.1.2+dfsg/tos/lib/tossim/SerialActiveMessageC.nc000066400000000000000000000132611207233610700231620ustar00rootroot00000000000000// $Id: SerialActiveMessageC.nc,v 1.8 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * The basic chip-independent TOSSIM Active Message layer for radio chips * that do not have simulation support. * * @author Philip Levis * @date December 2 2005 */ #include #include module SerialActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements as Acks; } uses { command am_addr_t amAddress(); } } implementation { serial_header_t* getHeader(message_t* amsg) { return (serial_header_t*)(amsg->data - sizeof(serial_header_t)); } task void startDone() { signal SplitControl.startDone(SUCCESS); } task void stopDone() { signal SplitControl.stopDone(SUCCESS); } command error_t SplitControl.start() { post startDone(); return SUCCESS; } command error_t SplitControl.stop() { post stopDone(); return SUCCESS; } command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* amsg, uint8_t len) { dbg("Serial", "Serial: sending a packet of size %d\n", len); return FAIL; } command error_t AMSend.cancel[am_id_t id](message_t* msg) { dbg("Serial", "Serial: cancelled a packet\n"); return FAIL; } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } command am_addr_t AMPacket.address() { return call amAddress(); } command am_addr_t AMPacket.destination(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->dest; } command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { serial_header_t* header = getHeader(amsg); header->dest = addr; } command am_addr_t AMPacket.source(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->src; } command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { serial_header_t* header = getHeader(amsg); header->src = addr; } command bool AMPacket.isForMe(message_t* amsg) { return (call AMPacket.destination(amsg) == call AMPacket.address() || call AMPacket.destination(amsg) == AM_BROADCAST_ADDR); } command am_id_t AMPacket.type(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->type; } command void AMPacket.setType(message_t* amsg, am_id_t t) { serial_header_t* header = getHeader(amsg); header->type = t; } command am_group_t AMPacket.group(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->group; } command void AMPacket.setGroup(message_t* msg, am_group_t group) { serial_header_t* header = getHeader(msg); header->group = group; } command am_group_t AMPacket.localGroup() { return TOS_AM_GROUP; } command void Packet.clear(message_t* msg) {} command uint8_t Packet.payloadLength(message_t* msg) { return getHeader(msg)->length; } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { getHeader(msg)->length = len; } command uint8_t Packet.maxPayloadLength() { return TOSH_DATA_LENGTH; } command void* Packet.getPayload(message_t* msg, uint8_t len) { if (len <= TOSH_DATA_LENGTH) { return msg->data; } else { return NULL; } } async command error_t Acks.requestAck(message_t* msg) { return FAIL; } async command error_t Acks.noAck(message_t* msg) { return SUCCESS; } async command bool Acks.wasAcked(message_t* msg) { return FALSE; } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { return; } default command am_addr_t amAddress() { return 0; } } tinyos-2.1.2+dfsg/tos/lib/tossim/SimMainP.nc000066400000000000000000000072631207233610700206610ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SimMainP implements the TOSSIM TinyOS boot sequence, as documented * in TEP 107. It differs from RealMainP (its mote counterpart) in that * it does not actually define a main function. * * @author Philip Levis * @date August 17 2005 */ static void __nesc_nido_initialise(int node); module SimMainP { provides interface Boot; uses interface Scheduler; uses interface Init as PlatformInit; uses interface Init as SoftwareInit; } implementation { int sim_main_start_mote() @C() @spontaneous() { char timeBuf[128]; atomic { /* First, initialize the Scheduler so components can post tasks. Initialize all of the very hardware specific stuff, such as CPU settings, counters, etc. After the hardware is ready, initialize the requisite software components and start execution.*/ call Scheduler.init(); /* Initialize the platform. Then spin on the Scheduler, passing * FALSE so it will not put the system to sleep if there are no * more tasks; if no tasks remain, continue on to software * initialization */ call PlatformInit.init(); while (call Scheduler.runNextTask()); /* Initialize software components.Then spin on the Scheduler, * passing FALSE so it will not put the system to sleep if there * are no more tasks; if no tasks remain, the system has booted * successfully.*/ call SoftwareInit.init(); while (call Scheduler.runNextTask()); } /* Enable interrupts now that system is ready. */ __nesc_enable_interrupt(); sim_print_now(timeBuf, 128); dbg("SimMainP", "Mote %li signaling boot at time %s.\n", sim_node(), timeBuf); signal Boot.booted(); /* Normally, at this point a mote enters a while(1) loop to * execute tasks. In TOSSIM, this call completes: posted tasks * are part of the global TOSSIM event loop. Look at * SimSchedulerBasicP for more details. */ return 0; } default command error_t PlatformInit.init() { return SUCCESS; } default command error_t SoftwareInit.init() { return SUCCESS; } default event void Boot.booted() { } } tinyos-2.1.2+dfsg/tos/lib/tossim/SimMote.nc000066400000000000000000000041231207233610700205510ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * TOSSIM-specific interface to access a mote's state. TinyOS programs * should never use this interface. * * @author Philip Levis * @date Nov 22 2005 */ // $Id: SimMote.nc,v 1.5 2010-06-29 22:07:51 scipio Exp $ interface SimMote { async command long long int getEuid(); async command void setEuid(long long int euid); async command long long int getStartTime(); async command bool isOn(); async command int getVariableInfo(char* name, void** ptr, size_t* len); command void turnOn(); async command void turnOff(); } tinyos-2.1.2+dfsg/tos/lib/tossim/SimMoteP.nc000066400000000000000000000130661207233610700206770ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM abstraction of a mote. By putting simulation state into * a component, we can scale and reference this state automatically * using nesC's rewriting, rather than managing and indexing into * arrays manually. * * @author Phil Levis * @date August 19 2005 */ // $Id: SimMoteP.nc,v 1.6 2010-06-29 22:07:51 scipio Exp $ module SimMoteP { provides interface SimMote; } implementation { long long int euid; long long int startTime; bool isOn; sim_event_t* bootEvent; async command long long int SimMote.getEuid() { return euid; } async command void SimMote.setEuid(long long int e) { euid = e; } async command long long int SimMote.getStartTime() { return startTime; } async command bool SimMote.isOn() { return isOn; } async command int SimMote.getVariableInfo(char* name, void** addr, size_t* size) { return __nesc_nido_resolve(sim_node(), name, (uintptr_t*)addr, (size_t*)size); } command void SimMote.turnOn() { if (!isOn) { if (bootEvent != NULL) { bootEvent->cancelled = TRUE; } __nesc_nido_initialise(sim_node()); startTime = sim_time(); dbg("SimMoteP", "Setting start time to %llu\n", startTime); isOn = TRUE; sim_main_start_mote(); } } async command void SimMote.turnOff() { isOn = FALSE; } long long int sim_mote_euid(int mote) @C() @spontaneous() { long long int result; int tmp = sim_node(); sim_set_node(mote); result = call SimMote.getEuid(); sim_set_node(tmp); return result; } void sim_mote_set_euid(int mote, long long int id) @C() @spontaneous() { int tmp = sim_node(); sim_set_node(mote); call SimMote.setEuid(id); sim_set_node(tmp); } long long int sim_mote_start_time(int mote) @C() @spontaneous() { long long int result; int tmp = sim_node(); sim_set_node(mote); result = call SimMote.getStartTime(); sim_set_node(tmp); return result; } int sim_mote_get_variable_info(int mote, char* name, void** ptr, size_t* len) @C() @spontaneous() { int result; int tmpID = sim_node(); sim_set_node(mote); result = call SimMote.getVariableInfo(name, ptr, len); dbg("SimMoteP", "Fetched %s of %i to be %p with len %i (result %i)\n", name, mote, *ptr, *len, result); sim_set_node(tmpID); return result; } void sim_mote_set_start_time(int mote, long long int t) @C() @spontaneous() { int tmpID = sim_node(); sim_set_node(mote); startTime = t; dbg("SimMoteP", "Setting start time to %llu\n", startTime); sim_set_node(tmpID); return; } bool sim_mote_is_on(int mote) @C() @spontaneous() { bool result; int tmp = sim_node(); sim_set_node(mote); result = call SimMote.isOn(); sim_set_node(tmp); return result; } void sim_mote_turn_on(int mote) @C() @spontaneous() { int tmp = sim_node(); sim_set_node(mote); call SimMote.turnOn(); sim_set_node(tmp); } void sim_mote_turn_off(int mote) @C() @spontaneous() { int tmp = sim_node(); sim_set_node(mote); call SimMote.turnOff(); sim_set_node(tmp); } void sim_mote_boot_handle(sim_event_t* e) { char buf[128]; sim_print_now(buf, 128); bootEvent = (sim_event_t*)NULL; dbg("SimMoteP", "Turning on mote %i at time %s.\n", (int)sim_node(), buf); call SimMote.turnOn(); } void sim_mote_enqueue_boot_event(int mote) @C() @spontaneous() { int tmp = sim_node(); sim_set_node(mote); if (bootEvent != NULL) { if (bootEvent->time == startTime) { // In case we have a cancelled boot event. bootEvent->cancelled = FALSE; return; } else { bootEvent->cancelled = TRUE; } } bootEvent = (sim_event_t*) malloc(sizeof(sim_event_t)); bootEvent->time = startTime; bootEvent->mote = mote; bootEvent->force = TRUE; bootEvent->data = NULL; bootEvent->handle = sim_mote_boot_handle; bootEvent->cleanup = sim_queue_cleanup_event; sim_queue_insert(bootEvent); sim_set_node(tmp); } } tinyos-2.1.2+dfsg/tos/lib/tossim/SimSchedulerBasicP.nc000066400000000000000000000140221207233610700226440ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * SimSchedulerBasic implements the default TinyOS scheduler sequence * (documented in TEP 106) for the TOSSIM platform. Its major departure * from the standard TinyOS scheduler is that tasks are executed * within TOSSIM events. This introduces task latency. * * @author Philip Levis * @author Cory Sharp * @date August 19 2005 */ #include module SimSchedulerBasicP { provides interface Scheduler; provides interface TaskBasic[uint8_t id]; } implementation { enum { NUM_TASKS = uniqueCount("TinySchedulerC.TaskBasic"), NO_TASK = 255, }; uint8_t m_head; uint8_t m_tail; uint8_t m_next[NUM_TASKS]; /* This simulation state is kept on a per-node basis. Better to take advantage of nesC's automatic state replication than try to do it ourselves. */ bool sim_scheduler_event_pending = FALSE; sim_event_t sim_scheduler_event; int sim_config_task_latency() {return 100;} /* Only enqueue the event for execution if it is not already enqueued. If there are more tasks in the queue, the event will re-enqueue itself (see the handle function). */ void sim_scheduler_submit_event() { if (sim_scheduler_event_pending == FALSE) { sim_scheduler_event.time = sim_time() + sim_config_task_latency(); sim_queue_insert(&sim_scheduler_event); sim_scheduler_event_pending = TRUE; } } void sim_scheduler_event_handle(sim_event_t* e) { sim_scheduler_event_pending = FALSE; // If we successfully executed a task, re-enqueue the event. This // will always succeed, as sim_scheduler_event_pending was just // set to be false. Note that this means there will be an extra // execution (on an empty task queue). We could optimize this // away, but this code is cleaner, and more accurately reflects // the real TinyOS main loop. if (call Scheduler.runNextTask()) { sim_scheduler_submit_event(); } } /* Initialize a scheduler event. This should only be done * once, when the scheduler is initialized. */ void sim_scheduler_event_init(sim_event_t* e) { e->mote = sim_node(); e->force = 0; e->data = NULL; e->handle = sim_scheduler_event_handle; e->cleanup = sim_queue_cleanup_none; } // Helper functions (internal functions) intentionally do not have atomic // sections. It is left as the duty of the exported interface functions to // manage atomicity to minimize chances for binary code bloat. // move the head forward // if the head is at the end, mark the tail at the end, too // mark the task as not in the queue uint8_t popTask() { if( m_head != NO_TASK ) { uint8_t id = m_head; m_head = m_next[m_head]; if( m_head == NO_TASK ) { m_tail = NO_TASK; } m_next[id] = NO_TASK; return id; } else { return NO_TASK; } } bool isWaiting( uint8_t id ) { return (m_next[id] != NO_TASK) || (m_tail == id); } bool pushTask( uint8_t id ) { if( !isWaiting(id) ) { if( m_head == NO_TASK ) { m_head = id; m_tail = id; } else { m_next[m_tail] = id; m_tail = id; } return TRUE; } else { return FALSE; } } command void Scheduler.init() { dbg("Scheduler", "Initializing scheduler.\n"); atomic { memset( m_next, NO_TASK, sizeof(m_next) ); m_head = NO_TASK; m_tail = NO_TASK; sim_scheduler_event_pending = FALSE; sim_scheduler_event_init(&sim_scheduler_event); } } command bool Scheduler.runNextTask() { uint8_t nextTask; atomic { nextTask = popTask(); if( nextTask == NO_TASK ) { dbg("Scheduler", "Told to run next task, but no task to run.\n"); return FALSE; } } dbg("Scheduler", "Running task %hhu.\n", nextTask); signal TaskBasic.runTask[nextTask](); return TRUE; } command void Scheduler.taskLoop() { // This should never run. } /** * Return SUCCESS if the post succeeded, EBUSY if it was already posted. */ async command error_t TaskBasic.postTask[uint8_t id]() { error_t result; atomic { result = pushTask(id) ? SUCCESS : EBUSY; } if (result == SUCCESS) { dbg("Scheduler", "Posting task %hhu.\n", id); sim_scheduler_submit_event(); } else { dbg("Scheduler", "Posting task %hhu, but already posted.\n", id); } return result; } default event void TaskBasic.runTask[uint8_t id]() { } } tinyos-2.1.2+dfsg/tos/lib/tossim/SimpleRadioModel.nc000066400000000000000000000042221207233610700223650ustar00rootroot00000000000000// $Id: SimpleRadioModel.nc,v 1.5 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The interface to a simple radio model, which has per-link bit error * probabilities and assumes complete interferences (the old TOSSIM * story). * * @author Philip Levis * @date December 2 2005 */ #include "TinyError.h" interface SimpleRadioModel { command void putOnAirTo(int dest, message_t* msg, bool ack, sim_time_t endTime); command void putOnAirToAll(message_t* msg, bool ack, sim_time_t endTime); command bool clearChannel(); event void acked(message_t* msg); event void receive(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/tossim/TOSSIM.py000066400000000000000000000312161207233610700202450ustar00rootroot00000000000000# This file was automatically generated by SWIG (http://www.swig.org). # Version 1.3.33 # # Don't modify this file, modify the SWIG interface instead. # This file is compatible with both classic and new-style classes. import _TOSSIM import new new_instancemethod = new.instancemethod try: _swig_property = property except NameError: pass # Python < 2.2 doesn't have 'property'. def _swig_setattr_nondynamic(self,class_type,name,value,static=1): if (name == "thisown"): return self.this.own(value) if (name == "this"): if type(value).__name__ == 'PySwigObject': self.__dict__[name] = value return method = class_type.__swig_setmethods__.get(name,None) if method: return method(self,value) if (not static) or hasattr(self,name): self.__dict__[name] = value else: raise AttributeError("You cannot add attributes to %s" % self) def _swig_setattr(self,class_type,name,value): return _swig_setattr_nondynamic(self,class_type,name,value,0) def _swig_getattr(self,class_type,name): if (name == "thisown"): return self.this.own() method = class_type.__swig_getmethods__.get(name,None) if method: return method(self) raise AttributeError,name def _swig_repr(self): try: strthis = "proxy of " + self.this.__repr__() except: strthis = "" return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) import types try: _object = types.ObjectType _newclass = 1 except AttributeError: class _object : pass _newclass = 0 del types class MAC(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, MAC, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, MAC, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_MAC(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_MAC __del__ = lambda self : None; def initHigh(*args): return _TOSSIM.MAC_initHigh(*args) def initLow(*args): return _TOSSIM.MAC_initLow(*args) def high(*args): return _TOSSIM.MAC_high(*args) def low(*args): return _TOSSIM.MAC_low(*args) def symbolsPerSec(*args): return _TOSSIM.MAC_symbolsPerSec(*args) def bitsPerSymbol(*args): return _TOSSIM.MAC_bitsPerSymbol(*args) def preambleLength(*args): return _TOSSIM.MAC_preambleLength(*args) def exponentBase(*args): return _TOSSIM.MAC_exponentBase(*args) def maxIterations(*args): return _TOSSIM.MAC_maxIterations(*args) def minFreeSamples(*args): return _TOSSIM.MAC_minFreeSamples(*args) def rxtxDelay(*args): return _TOSSIM.MAC_rxtxDelay(*args) def ackTime(*args): return _TOSSIM.MAC_ackTime(*args) def setInitHigh(*args): return _TOSSIM.MAC_setInitHigh(*args) def setInitLow(*args): return _TOSSIM.MAC_setInitLow(*args) def setHigh(*args): return _TOSSIM.MAC_setHigh(*args) def setLow(*args): return _TOSSIM.MAC_setLow(*args) def setSymbolsPerSec(*args): return _TOSSIM.MAC_setSymbolsPerSec(*args) def setBitsBerSymbol(*args): return _TOSSIM.MAC_setBitsBerSymbol(*args) def setPreambleLength(*args): return _TOSSIM.MAC_setPreambleLength(*args) def setExponentBase(*args): return _TOSSIM.MAC_setExponentBase(*args) def setMaxIterations(*args): return _TOSSIM.MAC_setMaxIterations(*args) def setMinFreeSamples(*args): return _TOSSIM.MAC_setMinFreeSamples(*args) def setRxtxDelay(*args): return _TOSSIM.MAC_setRxtxDelay(*args) def setAckTime(*args): return _TOSSIM.MAC_setAckTime(*args) MAC_swigregister = _TOSSIM.MAC_swigregister MAC_swigregister(MAC) class Radio(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, Radio, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, Radio, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_Radio(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_Radio __del__ = lambda self : None; def add(*args): return _TOSSIM.Radio_add(*args) def gain(*args): return _TOSSIM.Radio_gain(*args) def connected(*args): return _TOSSIM.Radio_connected(*args) def remove(*args): return _TOSSIM.Radio_remove(*args) def setNoise(*args): return _TOSSIM.Radio_setNoise(*args) def setSensitivity(*args): return _TOSSIM.Radio_setSensitivity(*args) Radio_swigregister = _TOSSIM.Radio_swigregister Radio_swigregister(Radio) class Packet(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, Packet, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, Packet, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_Packet(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_Packet __del__ = lambda self : None; def setSource(*args): return _TOSSIM.Packet_setSource(*args) def source(*args): return _TOSSIM.Packet_source(*args) def setDestination(*args): return _TOSSIM.Packet_setDestination(*args) def destination(*args): return _TOSSIM.Packet_destination(*args) def setLength(*args): return _TOSSIM.Packet_setLength(*args) def length(*args): return _TOSSIM.Packet_length(*args) def setType(*args): return _TOSSIM.Packet_setType(*args) def type(*args): return _TOSSIM.Packet_type(*args) def data(*args): return _TOSSIM.Packet_data(*args) def setData(*args): return _TOSSIM.Packet_setData(*args) def maxLength(*args): return _TOSSIM.Packet_maxLength(*args) def setStrength(*args): return _TOSSIM.Packet_setStrength(*args) def deliver(*args): return _TOSSIM.Packet_deliver(*args) def deliverNow(*args): return _TOSSIM.Packet_deliverNow(*args) Packet_swigregister = _TOSSIM.Packet_swigregister Packet_swigregister(Packet) class variable_string_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, variable_string_t, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, variable_string_t, name) __repr__ = _swig_repr __swig_setmethods__["type"] = _TOSSIM.variable_string_t_type_set __swig_getmethods__["type"] = _TOSSIM.variable_string_t_type_get if _newclass:type = _swig_property(_TOSSIM.variable_string_t_type_get, _TOSSIM.variable_string_t_type_set) __swig_setmethods__["ptr"] = _TOSSIM.variable_string_t_ptr_set __swig_getmethods__["ptr"] = _TOSSIM.variable_string_t_ptr_get if _newclass:ptr = _swig_property(_TOSSIM.variable_string_t_ptr_get, _TOSSIM.variable_string_t_ptr_set) __swig_setmethods__["len"] = _TOSSIM.variable_string_t_len_set __swig_getmethods__["len"] = _TOSSIM.variable_string_t_len_get if _newclass:len = _swig_property(_TOSSIM.variable_string_t_len_get, _TOSSIM.variable_string_t_len_set) __swig_setmethods__["isArray"] = _TOSSIM.variable_string_t_isArray_set __swig_getmethods__["isArray"] = _TOSSIM.variable_string_t_isArray_get if _newclass:isArray = _swig_property(_TOSSIM.variable_string_t_isArray_get, _TOSSIM.variable_string_t_isArray_set) def __init__(self, *args): this = _TOSSIM.new_variable_string_t(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_variable_string_t __del__ = lambda self : None; variable_string_t_swigregister = _TOSSIM.variable_string_t_swigregister variable_string_t_swigregister(variable_string_t) class nesc_app_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, nesc_app_t, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, nesc_app_t, name) __repr__ = _swig_repr __swig_setmethods__["numVariables"] = _TOSSIM.nesc_app_t_numVariables_set __swig_getmethods__["numVariables"] = _TOSSIM.nesc_app_t_numVariables_get if _newclass:numVariables = _swig_property(_TOSSIM.nesc_app_t_numVariables_get, _TOSSIM.nesc_app_t_numVariables_set) __swig_setmethods__["variableNames"] = _TOSSIM.nesc_app_t_variableNames_set __swig_getmethods__["variableNames"] = _TOSSIM.nesc_app_t_variableNames_get if _newclass:variableNames = _swig_property(_TOSSIM.nesc_app_t_variableNames_get, _TOSSIM.nesc_app_t_variableNames_set) __swig_setmethods__["variableTypes"] = _TOSSIM.nesc_app_t_variableTypes_set __swig_getmethods__["variableTypes"] = _TOSSIM.nesc_app_t_variableTypes_get if _newclass:variableTypes = _swig_property(_TOSSIM.nesc_app_t_variableTypes_get, _TOSSIM.nesc_app_t_variableTypes_set) __swig_setmethods__["variableArray"] = _TOSSIM.nesc_app_t_variableArray_set __swig_getmethods__["variableArray"] = _TOSSIM.nesc_app_t_variableArray_get if _newclass:variableArray = _swig_property(_TOSSIM.nesc_app_t_variableArray_get, _TOSSIM.nesc_app_t_variableArray_set) def __init__(self, *args): this = _TOSSIM.new_nesc_app_t(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_nesc_app_t __del__ = lambda self : None; nesc_app_t_swigregister = _TOSSIM.nesc_app_t_swigregister nesc_app_t_swigregister(nesc_app_t) class Variable(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, Variable, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, Variable, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_Variable(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_Variable __del__ = lambda self : None; def getData(*args): return _TOSSIM.Variable_getData(*args) Variable_swigregister = _TOSSIM.Variable_swigregister Variable_swigregister(Variable) class Mote(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, Mote, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, Mote, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_Mote(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_Mote __del__ = lambda self : None; def id(*args): return _TOSSIM.Mote_id(*args) def euid(*args): return _TOSSIM.Mote_euid(*args) def setEuid(*args): return _TOSSIM.Mote_setEuid(*args) def bootTime(*args): return _TOSSIM.Mote_bootTime(*args) def bootAtTime(*args): return _TOSSIM.Mote_bootAtTime(*args) def isOn(*args): return _TOSSIM.Mote_isOn(*args) def turnOff(*args): return _TOSSIM.Mote_turnOff(*args) def turnOn(*args): return _TOSSIM.Mote_turnOn(*args) def getVariable(*args): return _TOSSIM.Mote_getVariable(*args) def addNoiseTraceReading(*args): return _TOSSIM.Mote_addNoiseTraceReading(*args) def createNoiseModel(*args): return _TOSSIM.Mote_createNoiseModel(*args) def generateNoise(*args): return _TOSSIM.Mote_generateNoise(*args) Mote_swigregister = _TOSSIM.Mote_swigregister Mote_swigregister(Mote) class Tossim(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, Tossim, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, Tossim, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_Tossim(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_Tossim __del__ = lambda self : None; def init(*args): return _TOSSIM.Tossim_init(*args) def time(*args): return _TOSSIM.Tossim_time(*args) def ticksPerSecond(*args): return _TOSSIM.Tossim_ticksPerSecond(*args) def setTime(*args): return _TOSSIM.Tossim_setTime(*args) def timeStr(*args): return _TOSSIM.Tossim_timeStr(*args) def currentNode(*args): return _TOSSIM.Tossim_currentNode(*args) def getNode(*args): return _TOSSIM.Tossim_getNode(*args) def setCurrentNode(*args): return _TOSSIM.Tossim_setCurrentNode(*args) def addChannel(*args): return _TOSSIM.Tossim_addChannel(*args) def removeChannel(*args): return _TOSSIM.Tossim_removeChannel(*args) def randomSeed(*args): return _TOSSIM.Tossim_randomSeed(*args) def runNextEvent(*args): return _TOSSIM.Tossim_runNextEvent(*args) def mac(*args): return _TOSSIM.Tossim_mac(*args) def radio(*args): return _TOSSIM.Tossim_radio(*args) def newPacket(*args): return _TOSSIM.Tossim_newPacket(*args) Tossim_swigregister = _TOSSIM.Tossim_swigregister Tossim_swigregister(Tossim) tinyos-2.1.2+dfsg/tos/lib/tossim/TinySchedulerC.nc000066400000000000000000000037721207233610700220720ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * TOSSIM-specific scheduler implementation, which models * tasks as simulation events (in order to capture delay). * * @author Philip Levis * @date Nov 22 2005 */ // $Id: TinySchedulerC.nc,v 1.5 2010-06-29 22:07:51 scipio Exp $ configuration TinySchedulerC { provides interface Scheduler; provides interface TaskBasic[uint8_t id]; } implementation { components SimSchedulerBasicP as Sched; Scheduler = Sched; TaskBasic = Sched; } tinyos-2.1.2+dfsg/tos/lib/tossim/TossimActiveMessageC.nc000066400000000000000000000175531207233610700232310ustar00rootroot00000000000000// $Id: TossimActiveMessageC.nc,v 1.7 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * The basic chip-independent TOSSIM Active Message layer for radio chips * that do not have simulation support. * * @author Philip Levis * @date December 2 2005 */ #include module TossimActiveMessageC { provides { interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface TossimPacket; } uses { interface TossimPacketModel as Model; command am_addr_t amAddress(); } } implementation { message_t buffer; message_t* bufferPointer = &buffer; tossim_header_t* getHeader(message_t* amsg) { return (tossim_header_t*)(amsg->data - sizeof(tossim_header_t)); } tossim_metadata_t* getMetadata(message_t* amsg) { return (tossim_metadata_t*)(&amsg->metadata); } command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* amsg, uint8_t len) { error_t err; tossim_header_t* header = getHeader(amsg); dbg("AM", "AM: Sending packet (id=%hhu, len=%hhu) to %hu\n", id, len, addr); header->type = id; header->dest = addr; header->src = call AMPacket.address(); header->length = len; err = call Model.send((int)addr, amsg, len + sizeof(tossim_header_t) + sizeof(tossim_footer_t)); return err; } command error_t AMSend.cancel[am_id_t id](message_t* msg) { return call Model.cancel(msg); } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } command int8_t TossimPacket.strength(message_t* msg) { return getMetadata(msg)->strength; } event void Model.sendDone(message_t* msg, error_t result) { signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); } /* Receiving a packet */ event void Model.receive(message_t* msg) { uint8_t len; void* payload; memcpy(bufferPointer, msg, sizeof(message_t)); len = call Packet.payloadLength(bufferPointer); payload = call Packet.getPayload(bufferPointer, call Packet.maxPayloadLength()); if (call AMPacket.isForMe(msg)) { dbg("AM", "Received active message (%p) of type %hhu and length %hhu for me @ %s.\n", bufferPointer, call AMPacket.type(bufferPointer), len, sim_time_string()); bufferPointer = signal Receive.receive[call AMPacket.type(bufferPointer)](bufferPointer, payload, len); } else { dbg("AM", "Snooped on active message of type %hhu and length %hhu for %hu @ %s.\n", call AMPacket.type(bufferPointer), len, call AMPacket.destination(bufferPointer), sim_time_string()); bufferPointer = signal Snoop.receive[call AMPacket.type(bufferPointer)](bufferPointer, payload, len); } } event bool Model.shouldAck(message_t* msg) { tossim_header_t* header = getHeader(msg); if (header->dest == call amAddress()) { dbg("Acks", "Received packet addressed to me so ack it\n"); return TRUE; } return FALSE; } command am_addr_t AMPacket.address() { return call amAddress(); } command am_addr_t AMPacket.destination(message_t* amsg) { tossim_header_t* header = getHeader(amsg); return header->dest; } command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { tossim_header_t* header = getHeader(amsg); header->dest = addr; } command am_addr_t AMPacket.source(message_t* amsg) { tossim_header_t* header = getHeader(amsg); return header->src; } command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { tossim_header_t* header = getHeader(amsg); header->src = addr; } command bool AMPacket.isForMe(message_t* amsg) { return (call AMPacket.destination(amsg) == call AMPacket.address() || call AMPacket.destination(amsg) == AM_BROADCAST_ADDR); } command am_id_t AMPacket.type(message_t* amsg) { tossim_header_t* header = getHeader(amsg); return header->type; } command void AMPacket.setType(message_t* amsg, am_id_t t) { tossim_header_t* header = getHeader(amsg); header->type = t; } command void Packet.clear(message_t* msg) {} command uint8_t Packet.payloadLength(message_t* msg) { return getHeader(msg)->length; } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { getHeader(msg)->length = len; } command uint8_t Packet.maxPayloadLength() { return TOSH_DATA_LENGTH; } command void* Packet.getPayload(message_t* msg, uint8_t len) { if (len <= TOSH_DATA_LENGTH) { return msg->data; } else { return NULL; } } command am_group_t AMPacket.group(message_t* amsg) { tossim_header_t* header = getHeader(amsg); return header->group; } command void AMPacket.setGroup(message_t* msg, am_group_t group) { tossim_header_t* header = getHeader(msg); header->group = group; } command am_group_t AMPacket.localGroup() { return TOS_AM_GROUP; } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { return; } default command error_t Model.send(int node, message_t* msg, uint8_t len) { return FAIL; } default command error_t Model.cancel(message_t* msg) { return FAIL; } default command am_addr_t amAddress() { return 0; } void active_message_deliver_handle(sim_event_t* evt) { message_t* m = (message_t*)evt->data; dbg("Packet", "Delivering packet to %i at %s\n", (int)sim_node(), sim_time_string()); signal Model.receive(m); } sim_event_t* allocate_deliver_event(int node, message_t* msg, sim_time_t t) { sim_event_t* evt = (sim_event_t*)malloc(sizeof(sim_event_t)); evt->mote = node; evt->time = t; evt->handle = active_message_deliver_handle; evt->cleanup = sim_queue_cleanup_event; evt->cancelled = 0; evt->force = 0; evt->data = msg; return evt; } void active_message_deliver(int node, message_t* msg, sim_time_t t) @C() @spontaneous() { sim_event_t* evt = allocate_deliver_event(node, msg, t); sim_queue_insert(evt); } } tinyos-2.1.2+dfsg/tos/lib/tossim/TossimPacket.nc000066400000000000000000000035311207233610700216040ustar00rootroot00000000000000// $Id: TossimPacket.nc,v 1.1 2007-09-04 17:19:23 scipio Exp $ /* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Metadata interface for TOSSIM packets. * * @author Philip Levis * @date September 4 2007 */ #include #include interface TossimPacket { command int8_t strength(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/tossim/TossimPacketModel.nc000066400000000000000000000067351207233610700225760ustar00rootroot00000000000000// $Id: TossimPacketModel.nc,v 1.5 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The interface to a packet-level radio simulation, which may sit * on top of higher fidelity simulators. * * @author Philip Levis * @date December 2 2005 */ #include #include interface TossimPacketModel { /** * Send a packet with a data payload of len. To determine * the maximum available size, use the Packet interface of the * component providing Send. If send returns SUCCESS, then the * component will signal the sendDone event in the future; if send * returns an error, it will not signal sendDone. Note that a * component may accept a send request which it later finds it * cannot satisfy; in this case, it will signal sendDone with an * appropriate error code. */ command error_t send(int node, message_t* msg, uint8_t len); /** * Cancel a requested transmission. Returns SUCCESS if the * transmission was cancelled properly (not sent in its * entirety). Note that the component may not know * if the send was successfully cancelled, if the radio is * handling much of the logic; in this case, a component * should be conservative and return an appropriate error code. * A successful call to cancel must always result in a * sendFailed event, and never a sendSucceeded event. */ command error_t cancel(message_t* msg); /** * Signaled in response to an accepted send request. msg * is the sent buffer, and error indicates whether the * send was succesful, and if not, the cause of the failure. */ event void sendDone(message_t* msg, error_t error); /** * Signal that a packet was received. Note that there is no buffer * swap: a component using this interface must copy out the message * if it needs it. */ event void receive(message_t* msg); event bool shouldAck(message_t* msg); } tinyos-2.1.2+dfsg/tos/lib/tossim/TossimPacketModelC.nc000066400000000000000000000232241207233610700226710ustar00rootroot00000000000000// $Id: TossimPacketModelC.nc,v 1.12 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * This packet-level radio component implements a basic CSMA * algorithm. It derives its constants from sim_csma.c. The algorithm * is as follows: * * Transmit iff you measure a clear channel min_free_samples() in a row. * Sample up to max_iterations() times. If you do not detect a free * channel in this time, signal sendDone with an error of EBUSY. * If max_iterations() is zero, then sample indefinitely. * * On a send request, use an initial backoff in the range of * init_low() to init_high(). * Subsequent backoffs are in the range

      (low, high) * exponent_base() ^ iterations
      * * The default exponent_base is 1 (constant backoff). * * * @author Philip Levis * @date Dec 16 2005 * */ #include #include module TossimPacketModelC { provides { interface Init; interface SplitControl as Control; interface PacketAcknowledgements; interface TossimPacketModel as Packet; } uses interface GainRadioModel; } implementation { bool initialized = FALSE; bool running = FALSE; uint8_t backoffCount; uint8_t neededFreeSamples; message_t* sending = NULL; bool transmitting = FALSE; uint8_t sendingLength = 0; int destNode; sim_event_t sendEvent; message_t receiveBuffer; tossim_metadata_t* getMetadata(message_t* msg) { return (tossim_metadata_t*)(&msg->metadata); } command error_t Init.init() { dbg("TossimPacketModelC", "TossimPacketModelC: Init.init() called\n"); initialized = TRUE; // We need to cancel in case an event is still lying around in the queue from // before a reboot. Otherwise, the event will be executed normally (node is on), // but its memory has been zeroed out. sendEvent.cancelled = 1; return SUCCESS; } task void startDoneTask() { running = TRUE; signal Control.startDone(SUCCESS); } task void stopDoneTask() { running = FALSE; signal Control.stopDone(SUCCESS); } command error_t Control.start() { if (!initialized) { dbgerror("TossimPacketModelC", "TossimPacketModelC: Control.start() called before initialization!\n"); return FAIL; } dbg("TossimPacketModelC", "TossimPacketModelC: Control.start() called.\n"); post startDoneTask(); return SUCCESS; } command error_t Control.stop() { if (!initialized) { dbgerror("TossimPacketModelC", "TossimPacketModelC: Control.stop() called before initialization!\n"); return FAIL; } running = FALSE; dbg("TossimPacketModelC", "TossimPacketModelC: Control.stop() called.\n"); post stopDoneTask(); return SUCCESS; } async command error_t PacketAcknowledgements.requestAck(message_t* msg) { tossim_metadata_t* meta = getMetadata(msg); meta->ack = TRUE; return SUCCESS; } async command error_t PacketAcknowledgements.noAck(message_t* ack) { tossim_metadata_t* meta = getMetadata(ack); meta->ack = FALSE; return SUCCESS; } async command error_t PacketAcknowledgements.wasAcked(message_t* ack) { tossim_metadata_t* meta = getMetadata(ack); return meta->ack; } task void sendDoneTask() { message_t* msg = sending; tossim_metadata_t* meta = getMetadata(msg); meta->ack = 0; meta->strength = 0; meta->time = 0; sending = FALSE; signal Packet.sendDone(msg, running? SUCCESS:EOFF); } command error_t Packet.cancel(message_t* msg) { return FAIL; } void start_csma(); command error_t Packet.send(int dest, message_t* msg, uint8_t len) { if (!initialized) { dbgerror("TossimPacketModelC", "TossimPacketModelC: Send.send() called, but not initialized!\n"); return EOFF; } if (!running) { dbgerror("TossimPacketModelC", "TossimPacketModelC: Send.send() called, but not running!\n"); return EOFF; } if (sending != NULL) { return EBUSY; } sendingLength = len; sending = msg; destNode = dest; backoffCount = 0; neededFreeSamples = sim_csma_min_free_samples(); start_csma(); return SUCCESS; } void send_backoff(sim_event_t* evt); void send_transmit(sim_event_t* evt); void send_transmit_done(sim_event_t* evt); void start_csma() { sim_time_t first_sample; // The backoff is in terms of symbols. So take a random number // in the range of backoff times, and multiply it by the // sim_time per symbol. sim_time_t backoff = sim_random(); backoff %= (sim_csma_init_high() - sim_csma_init_low()); backoff += sim_csma_init_low(); backoff *= (sim_ticks_per_sec() / sim_csma_symbols_per_sec()); dbg("TossimPacketModelC", "Starting CMSA with %lli.\n", backoff); first_sample = sim_time() + backoff; sendEvent.mote = sim_node(); sendEvent.time = first_sample; sendEvent.force = 0; sendEvent.cancelled = 0; sendEvent.handle = send_backoff; sendEvent.cleanup = sim_queue_cleanup_none; sim_queue_insert(&sendEvent); } void send_backoff(sim_event_t* evt) { backoffCount++; if (call GainRadioModel.clearChannel()) { neededFreeSamples--; } else { neededFreeSamples = sim_csma_min_free_samples(); } if (neededFreeSamples == 0) { sim_time_t delay; delay = sim_csma_rxtx_delay(); delay *= (sim_ticks_per_sec() / sim_csma_symbols_per_sec()); evt->time += delay; transmitting = TRUE; call GainRadioModel.setPendingTransmission(); evt->handle = send_transmit; sim_queue_insert(evt); } else if (sim_csma_max_iterations() == 0 || backoffCount <= sim_csma_max_iterations()) { sim_time_t backoff = sim_random(); sim_time_t modulo = sim_csma_high() - sim_csma_low(); modulo *= pow(sim_csma_exponent_base(), backoffCount); backoff %= modulo; backoff += sim_csma_init_low(); backoff *= (sim_ticks_per_sec() / sim_csma_symbols_per_sec()); evt->time += backoff; sim_queue_insert(evt); } else { message_t* rval = sending; sending = NULL; dbg("TossimPacketModelC", "PACKET: Failed to send packet due to busy channel.\n"); signal Packet.sendDone(rval, EBUSY); } } int sim_packet_header_length() { return sizeof(tossim_header_t); } void send_transmit(sim_event_t* evt) { sim_time_t duration; tossim_metadata_t* metadata = getMetadata(sending); duration = 8 * sendingLength; duration /= sim_csma_bits_per_symbol(); duration += sim_csma_preamble_length(); if (metadata->ack) { duration += sim_csma_ack_time(); } duration *= (sim_ticks_per_sec() / sim_csma_symbols_per_sec()); evt->time += duration; evt->handle = send_transmit_done; dbg("TossimPacketModelC", "PACKET: Broadcasting packet to everyone.\n"); call GainRadioModel.putOnAirTo(destNode, sending, metadata->ack, evt->time, 0.0, 0.0); metadata->ack = 0; evt->time += (sim_csma_rxtx_delay() * (sim_ticks_per_sec() / sim_csma_symbols_per_sec())); dbg("TossimPacketModelC", "PACKET: Send done at %llu.\n", evt->time); sim_queue_insert(evt); } void send_transmit_done(sim_event_t* evt) { message_t* rval = sending; sending = NULL; transmitting = FALSE; dbg("TossimPacketModelC", "PACKET: Signaling send done at %llu.\n", sim_time()); signal Packet.sendDone(rval, running? SUCCESS:EOFF); } event void GainRadioModel.receive(message_t* msg) { if (running && !transmitting) { signal Packet.receive(msg); } } uint8_t error = 0; event void GainRadioModel.acked(message_t* msg) { if (running) { tossim_metadata_t* metadata = getMetadata(sending); metadata->ack = 1; if (msg != sending) { error = 1; dbg("TossimPacketModelC", "Requested ack for 0x%x, but outgoing packet is 0x%x.\n", msg, sending); } } } event bool GainRadioModel.shouldAck(message_t* msg) { if (running && !transmitting) { return signal Packet.shouldAck(msg); } else { return FALSE; } } default event void Control.startDone(error_t err) { return; } default event void Control.stopDone(error_t err) { return; } } tinyos-2.1.2+dfsg/tos/lib/tossim/TossimRadioMsg.h000066400000000000000000000006601207233610700217310ustar00rootroot00000000000000#ifndef TOSSIM_RADIO_MSG_H #define TOSSIM_RADIO_MSG_H #include "AM.h" typedef nx_struct tossim_header { nx_am_addr_t dest; nx_am_addr_t src; nx_uint8_t length; nx_am_group_t group; nx_am_id_t type; } tossim_header_t; typedef nx_struct tossim_footer { nxle_uint16_t crc; } tossim_footer_t; typedef nx_struct tossim_metadata { nx_int8_t strength; nx_uint8_t ack; nx_uint16_t time; } tossim_metadata_t; #endif tinyos-2.1.2+dfsg/tos/lib/tossim/UscGainInterferenceModelC.nc000066400000000000000000000251541207233610700241520ustar00rootroot00000000000000// $Id: UscGainInterferenceModelC.nc,v 1.6 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * This interference model is based off experimental data gathered * from mica2 nodes by Dongjin Son and Bhaskar Krishnamachari at USC. * It simplifies their observations in two ways. First, rather than * a smooth curve, this model makes a binary interference assumption * when the packets are within 3dBm of each other (their curve is very * sharp, so this seems like an OK simplification for now). Second, * it uses an additive signal strength model for interference. Their * results (as one might expect from colliding sinusoids) show that * interference signal strength is more complex than this. * * @author Philip Levis * @date Jun 1 2006 */ #include module UscGainInterferenceModelC { provides interface GainRadioModel as Model; } implementation { message_t* outgoing; // If I'm sending, this is my outgoing packet bool requestAck; bool receiving = 0; // Whether or not I think I'm receiving a packet struct receive_message; typedef struct receive_message receive_message_t; struct receive_message { int source; sim_time_t start; sim_time_t end; double power; bool lost; bool ack; message_t* msg; receive_message_t* next; }; receive_message_t* outstandingReceptionHead = NULL; receive_message_t* allocate_receive_message(); sim_event_t* allocate_receive_event(sim_time_t t, receive_message_t* m); /** * Heard signal is equal to the signal strength of ambient noise * plus the signal strength of all transmissions. The pow() and * log() calls transform dBm into energy and back. */ double heardSignal() { receive_message_t* current = outstandingReceptionHead; double localNoise = sim_gain_sample_noise(sim_node()); double sig = pow(10.0, localNoise / 10.0); dbg("Gain", "Computing noise @ %s: %0.2f", sim_time_string(), localNoise); while (current != NULL) { sig += pow(10.0, current->power / 10.0); dbg_clear("Gain", " "); if (current->power >= 0.0) { dbg_clear("Gain", "+"); } dbg_clear("Gain", "%0.2f ", current->power); current = current->next; } dbg_clear("Gain", " = %0.2f\n", 10.0 * log(sig) / log(10.0)); return 10.0 * log(sig) / log(10.0); } void sim_gain_ack_handle(sim_event_t* evt) { if (outgoing != NULL && requestAck && sim_mote_is_on(sim_node())) { signal Model.acked(outgoing); } } sim_event_t receiveEvent; // This clear threshold comes from the CC2420 data sheet double clearThreshold = -95.0; bool collision = FALSE; message_t* incoming = NULL; int incomingSource; command void Model.setClearValue(double value) { clearThreshold = value; dbg("Gain", "Setting clear threshold to %f\n", clearThreshold); } command bool Model.clearChannel() { double channel = heardSignal(); dbg("Gain", "Checking clear channel @ %s: %f <= %f \n", sim_time_string(), channel, clearThreshold); return channel < clearThreshold; } void sim_gain_schedule_ack(int source, sim_time_t t) { sim_event_t* ackEvent = (sim_event_t*)malloc(sizeof(sim_event_t)); ackEvent->mote = source; ackEvent->force = 1; ackEvent->cancelled = 0; ackEvent->time = t; ackEvent->handle = sim_gain_ack_handle; ackEvent->cleanup = sim_queue_cleanup_event; sim_queue_insert(ackEvent); } void sim_gain_receive_handle(sim_event_t* evt) { receive_message_t* mine = (receive_message_t*)evt->data; receive_message_t* predecessor = NULL; receive_message_t* list = outstandingReceptionHead; dbg("Gain", "Handling reception event @ %s.\n", sim_time_string()); // Scan the list for the node which precedes the one pointing // to the received packet. while (list != NULL) { if (list->next == mine) { predecessor = list; } if (list != mine) { if ((list->power - sim_gain_sensitivity()) < mine->power) { dbg("Gain", "Lost packet from %i as I concurrently received a packet stronger than %lf\n", list->source, list->power); list->lost = 1; } } list = list->next; } // Remove the received packet from the oustanding list by updating // the list pointers: A->B->C becomes A->C. If the received packet // is the head of the queue, then update the head pointer. if (predecessor) { predecessor->next = mine->next; } else if (mine == outstandingReceptionHead) { // must be head outstandingReceptionHead = mine->next; } else { dbgerror("Gain", "Incoming packet list structure is corrupted: entry is not the head and no entry points to it.\n"); } // Because the packet has been removed from the queue, it is not // included in heardSignal(): this line tests if the Signal of the // packet is above the threshold over the Noise of all other RF // energy sources (local noise, other packets, etc.). if ((mine->power - sim_gain_sensitivity()) < heardSignal()) { dbg("Gain", "Lost packet from %i as its power %lf was below sensitivity threshold\n", mine->source, mine->power); mine->lost = 1; } if (!mine->lost) { dbg_clear("Gain", " -signaling reception, "); signal Model.receive(mine->msg); if (mine->ack) { dbg_clear("Gain", " acknowledgment requested, "); } else { dbg_clear("Gain", " no acknowledgment requested.\n"); } // If we scheduled an ack, receiving = 0 when it completes if (mine->ack && signal Model.shouldAck(mine->msg)) { dbg_clear("Gain", " scheduling ack.\n"); sim_gain_schedule_ack(mine->source, sim_time() + 1); } // We're searching for new packets again receiving = 0; } // If the packet was lost, then we're searching for new packets again else { receiving = 0; dbg_clear("Gain", " -packet was lost.\n"); } free(mine); } // Create a record that a node is receiving a packet, // enqueue a receive event to figure out what happens. void enqueue_receive_event(int source, sim_time_t endTime, message_t* msg, bool receive, double power) { sim_event_t* evt; receive_message_t* list; receive_message_t* rcv = allocate_receive_message(); double sigStr = heardSignal(); rcv->source = source; rcv->start = sim_time(); rcv->end = endTime; rcv->power = power; rcv->msg = msg; rcv->lost = 0; rcv->ack = receive; // If I'm off, I never receive the packet, but I need to keep track of // it in case I turn on and someone else starts sending me a weaker // packet. So I don't set receiving to 1, but I keep track of // the signal strength. if (!sim_mote_is_on(sim_node())) { dbg("Gain", "Lost packet from %i due to %i being off\n", source, sim_node()); rcv->lost = 1; } else if ((sigStr + sim_gain_sensitivity()) >= power) { dbg("Gain", "Lost packet from %i due to power being below reception threshold (%f >= %f)\n", source, sigStr, power); rcv->lost = 1; } else if (receiving) { dbg("Gain", "Lost packet from %i due to being in the midst of a reception.\n", source); rcv->lost = 1; } else { // We are on, are not receiving a packet, and the packet is above the noise floor receiving = 1; } list = outstandingReceptionHead; while (list != NULL) { if ((list->power - sim_gain_sensitivity()) < power) { dbg("Gain", "Lost packet from %i as I concurrently received a packet from %i stronger than %lf\n", list->source, source, list->power); list->lost = 1; } list = list->next; } rcv->next = outstandingReceptionHead; outstandingReceptionHead = rcv; evt = allocate_receive_event(endTime, rcv); sim_queue_insert(evt); } void sim_gain_put(int dest, message_t* msg, sim_time_t endTime, bool receive, double power) { int prevNode = sim_node(); dbg("Gain", "Enqueing reception event for %i at %llu.\n", dest, endTime); sim_set_node(dest); enqueue_receive_event(prevNode, endTime, msg, receive, power); sim_set_node(prevNode); } command void Model.putOnAirTo(int dest, message_t* msg, bool ack, sim_time_t endTime, double power) { gain_entry_t* link = sim_gain_first(sim_node()); requestAck = ack; outgoing = msg; dbg("Gain", "Node %i transmitting to %i, finishes at %llu.\n", sim_node(), dest, endTime); while (link != NULL) { int other = link->mote; sim_gain_put(other, msg, endTime, ack && (other == dest), power + link->gain); link = sim_gain_next(link); } } default event void Model.receive(message_t* msg) {} sim_event_t* allocate_receive_event(sim_time_t endTime, receive_message_t* msg) { sim_event_t* evt = (sim_event_t*)malloc(sizeof(sim_event_t)); evt->mote = sim_node(); evt->time = endTime; evt->handle = sim_gain_receive_handle; evt->cleanup = sim_queue_cleanup_event; evt->cancelled = 0; evt->force = 1; // Need to keep track of air even when node is off evt->data = msg; return evt; } receive_message_t* allocate_receive_message() { return (receive_message_t*)malloc(sizeof(receive_message_t)); } } tinyos-2.1.2+dfsg/tos/lib/tossim/csma.c000066400000000000000000000062421207233610700177450ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * C++ implementation of the default TOSSIM CSMA model. * * @author Philip Levis * @date Dec 10 2005 */ #include Csma::Csma() {} Csma::~Csma() {} int Csma::initHigh() {return sim_csma_init_high();} int Csma::initLow() {return sim_csma_init_low();} int Csma::high() {return sim_csma_high();} int Csma::low() {return sim_csma_low();} int Csma::symbolsPerSec() {return sim_csma_symbols_per_sec();} int Csma::bitsPerSymbol() {return sim_csma_bits_per_symbol();} int Csma::preambleLength() {return sim_csma_preamble_length();} int Csma::exponentBase() {return sim_csma_exponent_base();} int Csma::maxIterations() {return sim_csma_max_iterations();} int Csma::minFreeSamples() {return sim_csma_min_free_samples();} int Csma::rxtxDelay() {return sim_csma_rxtx_delay();} int Csma::ackTime() {return sim_csma_ack_time();} void Csma::setInitHigh(int val) {sim_csma_set_init_high(val);} void Csma::setInitLow(int val) {sim_csma_set_init_low(val);} void Csma::setHigh(int val) {sim_csma_set_high(val);} void Csma::setLow(int val) {sim_csma_set_low(val);} void Csma::setSymbolsPerSec(int val) {sim_csma_set_symbols_per_sec(val);} void Csma::setBitsBerSymbol(int val) {sim_csma_set_bits_per_symbol(val);} void Csma::setPreambleLength(int val) {sim_csma_set_preamble_length(val);} void Csma::setExponentBase(int val) {sim_csma_set_exponent_base(val);} void Csma::setMaxIterations(int val) {sim_csma_set_max_iterations(val);} void Csma::setMinFreeSamples(int val) {sim_csma_set_min_free_samples(val);} void Csma::setRxtxDelay(int val) {sim_csma_set_rxtx_delay(val);} void Csma::setAckTime(int val); {sim_csma_set_ack_time(val);} #endif tinyos-2.1.2+dfsg/tos/lib/tossim/csma.h000066400000000000000000000046431207233610700177550ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Configuration parameters for a CSMA link. * * @author Philip Levis * @date Dec 10 2005 */ #ifndef CSMA_H_INCLUDED #define CSMA_H_INCLUDED class Csma { public: Csma(); ~Csma(); int initHigh(); int initLow(); int high(); int low(); int symbolsPerSec(); int bitsPerSymbol(); int preambleLength(); // in symbols int exponentBase(); int maxIterations(); int minFreeSamples(); int rxtxDelay(); int ackTime(); // in symbols void setInitHigh(int val); void setInitLow(int val); void setHigh(int val); void setLow(int val); void setSymbolsPerSec(int val); void setBitsBerSymbol(int val); void setPreambleLength(int val); // in symbols void setExponentBase(int val); void setMaxIterations(int val); void setMinFreeSamples(int val); void setRxtxDelay(int val); void setAckTime(int val); // in symbols int } #endif tinyos-2.1.2+dfsg/tos/lib/tossim/examples/000077500000000000000000000000001207233610700204705ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tossim/examples/packets.py000066400000000000000000000021461207233610700224770ustar00rootroot00000000000000# This file is an example Python script from the TOSSIM tutorial. # It is intended to be used with the RadioCountToLeds application. import sys from TOSSIM import * from RadioCountMsg import * t = Tossim([]) m = t.mac(); r = t.radio(); t.addChannel("RadioCountToLedsC", sys.stdout); t.addChannel("LedsC", sys.stdout); for i in range(0, 2): m = t.getNode(i); m.bootAtTime((31 + t.ticksPerSecond() / 10) * i + 1); f = open("topo.txt", "r") lines = f.readlines() for line in lines: s = line.split() if (len(s) > 0): if (s[0] == "gain"): r.add(int(s[1]), int(s[2]), float(s[3])) noise = open("meyer-heavy.txt", "r") lines = noise.readlines() for line in lines: str = line.strip() if (str != ""): val = int(str) for i in range(0, 2): t.getNode(i).addNoiseTraceReading(val) for i in range(0, 60): t.runNextEvent(); msg = RadioCountMsg() msg.set_counter(7); pkt = t.newPacket(); pkt.setData(msg.data) pkt.setType(msg.get_amType()) pkt.setDestination(0) print "Delivering ", msg, " to 0 at ", str(t.time() + 3); pkt.deliver(0, t.time() + 3) for i in range(0, 20): t.runNextEvent(); tinyos-2.1.2+dfsg/tos/lib/tossim/examples/variables.py000066400000000000000000000013361207233610700230150ustar00rootroot00000000000000# This is an example script from the TOSSIM tutorials. # It can be used with any TinyOS application. from tinyos.tossim.TossimApp import * from TOSSIM import * n = NescApp() t = Tossim(n.variables.variables()) m = t.getNode(0) for i in range(0, 1): m = t.getNode(i); time = ((79 + t.ticksPerSecond() / 100) * i + 1) m.bootAtTime(time); print "Mote " + str(i) + " set to boot at " + str(time); for i in range(0, 500): t.runNextEvent(); v = m.getVariable("SimMoteP.startTime") v2 = m.getVariable("SimSchedulerBasicP.m_head"); print "start time: <", v.getData(), ">\nnext task: <", v2.getData(), ">" for i in range(0, 500): t.runNextEvent(); print "start time: <", v.getData(), ">\nnext task: <", v2.getData(), ">" tinyos-2.1.2+dfsg/tos/lib/tossim/gain/000077500000000000000000000000001207233610700175705ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tossim/gain/line70nodes.txt000066400000000000000000000012341207233610700224600ustar00rootroot00000000000000% This is the sample topology file (chain topology), the node id should start with 0 % The format is % nodeid x y 0 0 0 1 1 0 2 2 0 3 3 0 4 4 0 5 5 0 6 6 0 7 7 0 8 8 0 9 9 0 10 10 0 11 11 0 12 12 0 13 13 0 14 14 0 15 15 0 16 16 0 17 17 0 18 18 0 19 19 0 20 20 0 21 21 0 22 22 0 23 23 0 24 24 0 25 25 0 26 26 0 27 27 0 28 28 0 29 29 0 30 30 0 31 31 0 32 32 0 33 33 0 34 34 0 35 35 0 36 36 0 37 37 0 38 38 0 39 39 0 40 40 0 41 41 0 42 42 0 43 43 0 44 44 0 45 45 0 46 46 0 47 47 0 48 48 0 49 49 0 50 50 0 51 51 0 52 52 0 53 53 0 54 54 0 55 55 0 56 56 0 57 57 0 58 58 0 59 59 0 60 60 0 61 61 0 62 62 0 63 63 0 64 64 0 65 65 0 66 66 0 67 67 0 68 68 0 69 69 0 70 70 0 tinyos-2.1.2+dfsg/tos/lib/tossim/gain/mica2grid.txt000066400000000000000000000131361207233610700221760ustar00rootroot00000000000000%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Copyright (c) 2004 The University of Southern California" % All rights reserved. % % Redistribution and use in source and binary forms, with or without % modification, are permitted provided that the following conditions % are met: % % - Redistributions of source code must retain the above copyright % notice, this list of conditions and the following disclaimer. % - Redistributions in binary form must reproduce the above copyright % notice, this list of conditions and the following disclaimer in the % documentation and/or other materials provided with the % distribution. % - Neither the name of the copyright holders nor the names of % its contributors may be used to endorse or promote products derived % from this software without specific prior written permission. % % THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS % "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT % LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS % FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL % THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, % INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES % (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR % SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) % HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, % STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) % ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED % OF THE POSSIBILITY OF SUCH DAMAGE.. % % Author: Marco Zuniga % Director: Prof. Bhaskar Krishnamachari % Autonomous Networks Research Group, University of Southern California % http://ceng.usc.edu/~anrg/ % Contact: marcozun@usc.edu % % Date last modified: 2004/06/23 marcozun % % Description: configuration file for link gain model % % This example configuration file will produce a network topology for TOSSIM % that represents a mica2 network deployed in a tight (1m spacing) 15x15 grid. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%% % % Channel Parameters % %%%%%%%%%%%%%%%%%%%%%% % % The channel model is based on the Log-Normal Shadowing Path Loss Model. % It defines the gain at which other nodes receive a signal when a node % transmits. All values must be positive. Parameters: % PATH_LOSS_EXPONENT an adimensional constant % SHADOWING_STANDARD_DEVIATION in dB % PL_D0 close-in reference pathloss, in dB % D0 close-in reference distance, in meters PATH_LOSS_EXPONENT = 3.0; SHADOWING_STANDARD_DEVIATION = 4.0; PL_D0 = 55.0; D0 = 1.0; %%%%%%%%%%%%%%%%%%%% % % Radio Parameters % %%%%%%%%%%%%%%%%%%%% % % The radio parameters provide a mechanism to incorporate node variations. % These variations introduce link asymmetry. The variations have a static % and a dynamic component. WHITE_GAUSSIAN_NOISE encodes the dynamic % variation of a node's noise floor readings at runtime, while the % covariance matrix encodes the static differences in noise floor and % output strength across nodes. % % Parameters: % NOISE_FLOOR the baseline noise floor in dBm % WHITE_GAUSSIAN_NOISE the standard deviation of noise measurements % S11, S12, S21, S22 the values of the covariance matrix that % represents hardware variations. % S11 the per-node variance of the noise floor % S12 covariance between noise floor and output power % S21 must be equal to S12 % S22 the per-node variance of output power NOISE_FLOOR = -105.0; WHITE_GAUSSIAN_NOISE = 4; % These values are for MICA2 radios. S11 = 3.7; S12 = -3.3; S21 = -3.3; S22 = 6.0; %%%%%%%%%%%%%%%%%%%%%%% % % Topology Parameters % %%%%%%%%%%%%%%%%%%%%%%% % % Terrain dimensions and node positions are in meters. % Parameters: % TOPOLOGY the basic topology to use, whose valid values are: % 1 for a GRID % 2 for a UNIFORM distribution % 3 for a RANDOM distribution % 4 for positions read from a FILE % details: % o GRID: Node placement starts at (0, 0). You must % specify the GRID_UNIT variable (spacing in meters). % The number of nodes has to be square of an integer. % o UNIFORM: Based on the number of nodes, the physical % terrain is divided into a number of cells. Within % each cell, a node is placed randomly. % o RANDOM: Nodes are placed randomly within the physical % terrain. % o FILE: Position of nodes is read from TOPOLOGY_FILE % (user-defined). The format of the file is: % nodeid Xcoordinate Ycoordinate % The nodeid values must start with 0. % TERRAIN_DIMENSIONS_X the width of the terrain area (meters) % TERRAIN_DIMENSIONS_Y the depth of the terrain area (meters) % TOPOLOGY = 1; GRID_UNIT = 5.0; NUMBER_OF_NODES = 225; % topology file provided by user %TOPOLOGY_FILE = topologyFile.m; % Physical terrain (meters), not required when user provides topology file % nor in GRID topologies. % The density (NUMBER_OF_NODES / area) can not be higher than % 0.5 nodes / D0^2. %TERRAIN_DIMENSIONS_X = 50.0; %TERRAIN_DIMENSIONS_Y = 50.0; tinyos-2.1.2+dfsg/tos/lib/tossim/generate-swig.bash000066400000000000000000000033721207233610700222570ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 2005 Stanford University. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of the copyright holders nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL # THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # # Simple script that generates the Python interfaces to TOSSIM. # # Author: Philip Levis # # $Id: generate-swig.bash,v 1.5 2010-06-29 22:07:51 scipio Exp $ swig -shadow -python -c++ tossim.i tinyos-2.1.2+dfsg/tos/lib/tossim/hardware.h000066400000000000000000000000371207233610700206200ustar00rootroot00000000000000#include tinyos-2.1.2+dfsg/tos/lib/tossim/hashtable.c000066400000000000000000000215431207233610700207560ustar00rootroot00000000000000/* Copyright (C) 2004 Christopher Clark */ #include "hashtable.h" #include "hashtable_private.h" #include #include #include #include /* Credit for primes table: Aaron Krowne http://br.endernet.org/~akrowne/ http://planetmath.org/encyclopedia/GoodHashTablePrimes.html */ static const unsigned int primes[] = { 53, 97, 193, 389, 769, 1543, 3079, 6151, 12289, 24593, 49157, 98317, 196613, 393241, 786433, 1572869, 3145739, 6291469, 12582917, 25165843, 50331653, 100663319, 201326611, 402653189, 805306457, 1610612741 }; const unsigned int prime_table_length = sizeof(primes)/sizeof(primes[0]); const float max_load_factor = 0.65; /*****************************************************************************/ struct hashtable * create_hashtable(unsigned int minsize, unsigned int (*hashf) (void*), int (*eqf) (void*,void*)) { struct hashtable *h; unsigned int pindex, size = primes[0]; /* Check requested hashtable isn't too large */ if (minsize > (1u << 30)) return NULL; /* Enforce size as prime */ for (pindex=0; pindex < prime_table_length; pindex++) { if (primes[pindex] > minsize) { size = primes[pindex]; break; } } h = (struct hashtable *)malloc(sizeof(struct hashtable)); if (NULL == h) return NULL; /*oom*/ h->table = (struct entry **)malloc(sizeof(struct entry*) * size); if (NULL == h->table) { free(h); return NULL; } /*oom*/ memset(h->table, 0, size * sizeof(struct entry *)); h->tablelength = size; h->primeindex = pindex; h->entrycount = 0; h->hashfn = hashf; h->eqfn = eqf; h->loadlimit = (unsigned int) ceil(size * max_load_factor); return h; } /*****************************************************************************/ unsigned int hash(struct hashtable *h, void *k) { /* Aim to protect against poor hash functions by adding logic here * - logic taken from java 1.4 hashtable source */ unsigned int i = h->hashfn(k); i += ~(i << 9); i ^= ((i >> 14) | (i << 18)); /* >>> */ i += (i << 4); i ^= ((i >> 10) | (i << 22)); /* >>> */ return i; } /*****************************************************************************/ static int hashtable_expand(struct hashtable *h) { /* Double the size of the table to accomodate more entries */ struct entry **newtable; struct entry *e; struct entry **pE; unsigned int newsize, i, tindex; /* Check we're not hitting max capacity */ if (h->primeindex == (prime_table_length - 1)) return 0; newsize = primes[++(h->primeindex)]; newtable = (struct entry **)malloc(sizeof(struct entry*) * newsize); if (NULL != newtable) { memset(newtable, 0, newsize * sizeof(struct entry *)); /* This algorithm is not 'stable'. ie. it reverses the list * when it transfers entries between the tables */ for (i = 0; i < h->tablelength; i++) { while (NULL != (e = h->table[i])) { h->table[i] = e->next; tindex = indexFor(newsize,e->h); e->next = newtable[tindex]; newtable[tindex] = e; } } free(h->table); h->table = newtable; } /* Plan B: realloc instead */ else { newtable = (struct entry **) realloc(h->table, newsize * sizeof(struct entry *)); if (NULL == newtable) { (h->primeindex)--; return 0; } h->table = newtable; memset(newtable[h->tablelength], 0, newsize - h->tablelength); for (i = 0; i < h->tablelength; i++) { for (pE = &(newtable[i]), e = *pE; e != NULL; e = *pE) { tindex = indexFor(newsize,e->h); if (tindex == i) { pE = &(e->next); } else { *pE = e->next; e->next = newtable[tindex]; newtable[tindex] = e; } } } } h->tablelength = newsize; h->loadlimit = (unsigned int) ceil(newsize * max_load_factor); return -1; } /*****************************************************************************/ unsigned int hashtable_count(struct hashtable *h) { return h->entrycount; } /*****************************************************************************/ int hashtable_insert(struct hashtable *h, void *k, void *v) { /* This method allows duplicate keys - but they shouldn't be used */ unsigned int tindex; struct entry *e; if (++(h->entrycount) > h->loadlimit) { /* Ignore the return value. If expand fails, we should * still try cramming just this value into the existing table * -- we may not have memory for a larger table, but one more * element may be ok. Next time we insert, we'll try expanding again.*/ hashtable_expand(h); } e = (struct entry *)malloc(sizeof(struct entry)); if (NULL == e) { --(h->entrycount); return 0; } /*oom*/ e->h = hash(h,k); tindex = indexFor(h->tablelength,e->h); e->k = k; e->v = v; e->next = h->table[tindex]; h->table[tindex] = e; return -1; } /*****************************************************************************/ void * /* returns value associated with key */ hashtable_search(struct hashtable *h, void *k) { struct entry *e; unsigned int hashvalue, tindex; hashvalue = hash(h,k); tindex = indexFor(h->tablelength,hashvalue); e = h->table[tindex]; while (NULL != e) { /* Check hash value to short circuit heavier comparison */ if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { return e->v; } e = e->next; } return NULL; } /*****************************************************************************/ void * /* returns value associated with key */ hashtable_remove(struct hashtable *h, void *k) { /* TODO: consider compacting the table when the load factor drops enough, * or provide a 'compact' method. */ struct entry *e; struct entry **pE; void *v; unsigned int hashvalue, tindex; hashvalue = hash(h,k); tindex = indexFor(h->tablelength,hash(h,k)); pE = &(h->table[tindex]); e = *pE; while (NULL != e) { /* Check hash value to short circuit heavier comparison */ if ((hashvalue == e->h) && (h->eqfn(k, e->k))) { *pE = e->next; h->entrycount--; v = e->v; freekey(e->k); free(e); return v; } pE = &(e->next); e = e->next; } return NULL; } /*****************************************************************************/ /* destroy */ void hashtable_destroy(struct hashtable *h, int free_values) { unsigned int i; struct entry *e, *f; struct entry **table = h->table; if (free_values) { for (i = 0; i < h->tablelength; i++) { e = table[i]; while (NULL != e) { f = e; e = e->next; freekey(f->k); free(f->v); free(f); } } } else { for (i = 0; i < h->tablelength; i++) { e = table[i]; while (NULL != e) { f = e; e = e->next; freekey(f->k); free(f); } } } free(h->table); free(h); } /* * Copyright (c) 2002, Christopher Clark * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of the original author; nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ tinyos-2.1.2+dfsg/tos/lib/tossim/hashtable.h000066400000000000000000000165251207233610700207670ustar00rootroot00000000000000/* Copyright (C) 2002 Christopher Clark */ #ifndef __HASHTABLE_CWC22_H__ #define __HASHTABLE_CWC22_H__ #ifdef __cplusplus extern "C" { #endif struct hashtable; typedef struct hashtable hashtable_t; /* Example of use: * * struct hashtable *h; * struct some_key *k; * struct some_value *v; * * static unsigned int hash_from_key_fn( void *k ); * static int keys_equal_fn ( void *key1, void *key2 ); * * h = create_hashtable(16, hash_from_key_fn, keys_equal_fn); * k = (struct some_key *) malloc(sizeof(struct some_key)); * v = (struct some_value *) malloc(sizeof(struct some_value)); * * (initialise k and v to suitable values) * * if (! hashtable_insert(h,k,v) ) * { exit(-1); } * * if (NULL == (found = hashtable_search(h,k) )) * { printf("not found!"); } * * if (NULL == (found = hashtable_remove(h,k) )) * { printf("Not found\n"); } * */ /* Macros may be used to define type-safe(r) hashtable access functions, with * methods specialized to take known key and value types as parameters. * * Example: * * Insert this at the start of your file: * * DEFINE_HASHTABLE_INSERT(insert_some, struct some_key, struct some_value); * DEFINE_HASHTABLE_SEARCH(search_some, struct some_key, struct some_value); * DEFINE_HASHTABLE_REMOVE(remove_some, struct some_key, struct some_value); * * This defines the functions 'insert_some', 'search_some' and 'remove_some'. * These operate just like hashtable_insert etc., with the same parameters, * but their function signatures have 'struct some_key *' rather than * 'void *', and hence can generate compile time errors if your program is * supplying incorrect data as a key (and similarly for value). * * Note that the hash and key equality functions passed to create_hashtable * still take 'void *' parameters instead of 'some key *'. This shouldn't be * a difficult issue as they're only defined and passed once, and the other * functions will ensure that only valid keys are supplied to them. * * The cost for this checking is increased code size and runtime overhead * - if performance is important, it may be worth switching back to the * unsafe methods once your program has been debugged with the safe methods. * This just requires switching to some simple alternative defines - eg: * #define insert_some hashtable_insert * */ /***************************************************************************** * create_hashtable * @name create_hashtable * @param minsize minimum initial size of hashtable * @param hashfunction function for hashing keys * @param key_eq_fn function for determining key equality * @return newly created hashtable or NULL on failure */ struct hashtable * create_hashtable(unsigned int minsize, unsigned int (*hashfunction) (void*), int (*key_eq_fn) (void*,void*)); /***************************************************************************** * hashtable_insert * @name hashtable_insert * @param h the hashtable to insert into * @param k the key - hashtable claims ownership and will free on removal * @param v the value - does not claim ownership * @return non-zero for successful insertion * * This function will cause the table to expand if the insertion would take * the ratio of entries to table size over the maximum load factor. * * This function does not check for repeated insertions with a duplicate key. * The value returned when using a duplicate key is undefined -- when * the hashtable changes size, the order of retrieval of duplicate key * entries is reversed. * If in doubt, remove before insert. */ int hashtable_insert(struct hashtable *h, void *k, void *v); #define DEFINE_HASHTABLE_INSERT(fnname, keytype, valuetype) \ int fnname (struct hashtable *h, keytype *k, valuetype *v) \ { \ return hashtable_insert(h,k,v); \ } /***************************************************************************** * hashtable_search * @name hashtable_search * @param h the hashtable to search * @param k the key to search for - does not claim ownership * @return the value associated with the key, or NULL if none found */ void * hashtable_search(struct hashtable *h, void *k); #define DEFINE_HASHTABLE_SEARCH(fnname, keytype, valuetype) \ valuetype * fnname (struct hashtable *h, keytype *k) \ { \ return (valuetype *) (hashtable_search(h,k)); \ } /***************************************************************************** * hashtable_remove * @name hashtable_remove * @param h the hashtable to remove the item from * @param k the key to search for - does not claim ownership * @return the value associated with the key, or NULL if none found */ void * /* returns value */ hashtable_remove(struct hashtable *h, void *k); #define DEFINE_HASHTABLE_REMOVE(fnname, keytype, valuetype) \ valuetype * fnname (struct hashtable *h, keytype *k) \ { \ return (valuetype *) (hashtable_remove(h,k)); \ } /***************************************************************************** * hashtable_count * @name hashtable_count * @param h the hashtable * @return the number of items stored in the hashtable */ unsigned int hashtable_count(struct hashtable *h); /***************************************************************************** * hashtable_destroy * @name hashtable_destroy * @param h the hashtable * @param free_values whether to call 'free' on the remaining values */ void hashtable_destroy(struct hashtable *h, int free_values); #ifdef __cplusplus } #endif #endif /* __HASHTABLE_CWC22_H__ */ /* * Copyright (c) 2002, Christopher Clark * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of the original author; nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ tinyos-2.1.2+dfsg/tos/lib/tossim/hashtable_private.h000066400000000000000000000056211207233610700225140ustar00rootroot00000000000000/* Copyright (C) 2002, 2004 Christopher Clark */ #ifndef __HASHTABLE_PRIVATE_CWC22_H__ #define __HASHTABLE_PRIVATE_CWC22_H__ #include "hashtable.h" /*****************************************************************************/ struct entry { void *k, *v; unsigned int h; struct entry *next; }; struct hashtable { unsigned int tablelength; struct entry **table; unsigned int entrycount; unsigned int loadlimit; unsigned int primeindex; unsigned int (*hashfn) (void *k); int (*eqfn) (void *k1, void *k2); }; /*****************************************************************************/ unsigned int hash(struct hashtable *h, void *k); /*****************************************************************************/ /* indexFor */ static inline unsigned int indexFor(unsigned int tablelength, unsigned int hashvalue) { return (hashvalue % tablelength); }; /* Only works if tablelength == 2^N */ /*static inline unsigned int indexFor(unsigned int tablelength, unsigned int hashvalue) { return (hashvalue & (tablelength - 1u)); } */ /*****************************************************************************/ #define freekey(X) free(X) /*define freekey(X) ; */ /*****************************************************************************/ #endif /* __HASHTABLE_PRIVATE_CWC22_H__*/ /* * Copyright (c) 2002, Christopher Clark * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of the original author; nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ tinyos-2.1.2+dfsg/tos/lib/tossim/heap.c000066400000000000000000000133451207233610700177410ustar00rootroot00000000000000// $Id: heap.c,v 1.6 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* Authors: Philip Levis * */ /* * FILE: heap.h * AUTHOR: Philip Levis * DESC: Simple array-based priority heap for discrete event simulation. */ #include #include // For memcpy(3) #include // for rand(3) #include // For printf(3) const int STARTING_SIZE = 511; #define HEAP_NODE(heap, index) (((node_t*)(heap->data))[index]) typedef struct node { void* data; long long int key; } node_t; void down_heap(heap_t* heap, int findex); void up_heap(heap_t* heap, int findex); void swap(node_t* first, node_t* second); node_t* prev(node_t* node); node_t* next(node_t* next); void init_node(node_t* node) { node->data = NULL; node->key = -1; } void init_heap(heap_t* heap) { heap->size = 0; heap->private_size = STARTING_SIZE; heap->data = malloc(sizeof(node_t) * heap->private_size); } int heap_size(heap_t* heap) { return heap->size; } int is_empty(heap_t* heap) { return heap->size == 0; } int heap_is_empty(heap_t* heap) { return is_empty(heap); } long long int heap_get_min_key(heap_t* heap) { if (is_empty(heap)) { return -1; } else { return HEAP_NODE(heap, 0).key; } } void* heap_peek_min_data(heap_t* heap) { if (is_empty(heap)) { return NULL; } else { return HEAP_NODE(heap, 0).data; } } void* heap_pop_min_data(heap_t* heap, long long int* key) { int last_index = heap->size - 1; void* data = HEAP_NODE(heap, 0).data; if (key != NULL) { *key = HEAP_NODE(heap, 0).key; } HEAP_NODE(heap, 0).data = HEAP_NODE(heap, last_index).data; HEAP_NODE(heap, 0).key = HEAP_NODE(heap, last_index).key; heap->size--; down_heap(heap, 0); return data; } void expand_heap(heap_t* heap) { int new_size = (heap->private_size * 2) + 1; void* new_data = malloc(sizeof(node_t) * new_size); //dbg(DBG_SIM, "Resized heap from %i to %i.\n", heap->private_size, new_size); memcpy(new_data, heap->data, (sizeof(node_t) * heap->private_size)); free(heap->data); heap->data = new_data; heap->private_size = new_size; } void heap_insert(heap_t* heap, void* data, long long int key) { int findex = heap->size; if (findex == heap->private_size) { expand_heap(heap); } findex = heap->size; HEAP_NODE(heap, findex).key = key; HEAP_NODE(heap, findex).data = data; up_heap(heap, findex); heap->size++; } void swap(node_t* first, node_t* second) { long long int key; void* data; key = first->key; first->key = second->key; second->key = key; data = first->data; first->data = second->data; second->data = data; } void down_heap(heap_t* heap, int findex) { int right_index = ((findex + 1) * 2); int left_index = (findex * 2) + 1; if (right_index < heap->size) { // Two children long long int left_key = HEAP_NODE(heap, left_index).key; long long int right_key = HEAP_NODE(heap, right_index).key; int min_key_index = (left_key < right_key)? left_index : right_index; if (HEAP_NODE(heap, min_key_index).key < HEAP_NODE(heap, findex).key) { swap(&(HEAP_NODE(heap, findex)), &(HEAP_NODE(heap, min_key_index))); down_heap(heap, min_key_index); } } else if (left_index >= heap->size) { // No children return; } else { // Only left child long long int left_key = HEAP_NODE(heap, left_index).key; if (left_key < HEAP_NODE(heap, findex).key) { swap(&(HEAP_NODE(heap, findex)), &(HEAP_NODE(heap, left_index))); return; } } } void up_heap(heap_t* heap, int findex) { int parent_index; if (findex == 0) { return; } parent_index = (findex - 1) / 2; if (HEAP_NODE(heap, parent_index).key > HEAP_NODE(heap, findex).key) { swap(&(HEAP_NODE(heap, findex)), &(HEAP_NODE(heap, parent_index))); up_heap(heap, parent_index); } } tinyos-2.1.2+dfsg/tos/lib/tossim/heap.h000066400000000000000000000052021207233610700177370ustar00rootroot00000000000000// $Id: heap.h,v 1.6 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* Authors: Philip Levis * */ /* * FILE: heap.h * AUTHOR: pal * DESC: Simple array-based priority heap for discrete event simulation. */ /** * @author Philip Levis */ #ifndef HEAP_H_INCLUDED #define HEAP_H_INCLUDED typedef struct heap { int size; void* data; int private_size; } heap_t; void init_heap(heap_t* heap); int heap_size(heap_t* heap); int heap_is_empty(heap_t* heap); long long int heap_get_min_key(heap_t* heap); void* heap_peek_min_data(heap_t* heap); void* heap_pop_min_data(heap_t* heap, long long int* key); void heap_insert(heap_t * heap, void* data, long long int key); #endif // HEAP_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tossim/mac.c000066400000000000000000000062101207233610700175550ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Configuration parameters for a CSMA link. * * @author Philip Levis * @date Dec 10 2005 */ #include #include MAC::MAC() {} MAC::~MAC() {} int MAC::initHigh() {return sim_csma_init_high();} int MAC::initLow() {return sim_csma_init_low();} int MAC::high() {return sim_csma_high();} int MAC::low() {return sim_csma_low();} int MAC::symbolsPerSec() {return sim_csma_symbols_per_sec();} int MAC::bitsPerSymbol() {return sim_csma_bits_per_symbol();} int MAC::preambleLength() {return sim_csma_preamble_length();} int MAC::exponentBase() {return sim_csma_exponent_base();} int MAC::maxIterations() {return sim_csma_max_iterations();} int MAC::minFreeSamples() {return sim_csma_min_free_samples();} int MAC::rxtxDelay() {return sim_csma_rxtx_delay();} int MAC::ackTime() {return sim_csma_ack_time();} void MAC::setInitHigh(int val) {sim_csma_set_init_high(val);} void MAC::setInitLow(int val) {sim_csma_set_init_low(val);} void MAC::setHigh(int val) {sim_csma_set_high(val);} void MAC::setLow(int val) {sim_csma_set_low(val);} void MAC::setSymbolsPerSec(int val) {sim_csma_set_symbols_per_sec(val);} void MAC::setBitsBerSymbol(int val) {sim_csma_set_bits_per_symbol(val);} void MAC::setPreambleLength(int val) {sim_csma_set_preamble_length(val);} void MAC::setExponentBase(int val) {sim_csma_set_exponent_base(val);} void MAC::setMaxIterations(int val) {sim_csma_set_max_iterations(val);} void MAC::setMinFreeSamples(int val) {sim_csma_set_min_free_samples(val);} void MAC::setRxtxDelay(int val) {sim_csma_set_rxtx_delay(val);} void MAC::setAckTime(int val) {sim_csma_set_ack_time(val);} tinyos-2.1.2+dfsg/tos/lib/tossim/mac.h000066400000000000000000000046371207233610700175750ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Configuration parameters for a CSMA link. * * @author Philip Levis * @date Dec 10 2005 */ #ifndef MAC_H_INCLUDED #define MAC_H_INCLUDED class MAC { public: MAC(); ~MAC(); int initHigh(); int initLow(); int high(); int low(); int symbolsPerSec(); int bitsPerSymbol(); int preambleLength(); // in symbols int exponentBase(); int maxIterations(); int minFreeSamples(); int rxtxDelay(); int ackTime(); // in symbols void setInitHigh(int val); void setInitLow(int val); void setHigh(int val); void setLow(int val); void setSymbolsPerSec(int val); void setBitsBerSymbol(int val); void setPreambleLength(int val); // in symbols void setExponentBase(int val); void setMaxIterations(int val); void setMinFreeSamples(int val); void setRxtxDelay(int val); void setAckTime(int val); // in symbols int }; #endif tinyos-2.1.2+dfsg/tos/lib/tossim/mac.i000066400000000000000000000063751207233610700175770ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SWIG interface specification for a media access control algorithm * and physical data rate in TOSSIM. This file defines the MAC object * which is exported to * the python scripting interface. This particular MAC is CSMA. * Changing the MAC abstraction requires changing or replacing this * file and rerunning generate-swig.bash in lib/tossim. Note that * this abstraction does not represent an actual MAC implementation, * instead merely a set of configuration constants that a CSMA MAC * implementation might use. The default values model the standard * TinyOS CC2420 stack. Most times (rxtxDelay, etc.) are in terms * of symbols. E.g., an rxTxDelay of 32 means 32 symbol times. This * value can be translated into real time with the symbolsPerSec() * call. * * Note that changing this file only changes the Python interface: * you must also change the underlying TOSSIM code so Python * has the proper functions to call. Look at mac.h, mac.c, and * sim_mac.c. * * @author Philip Levis * @date Dec 10 2005 */ %module TOSSIMMAC %{ #include %} class MAC { public: MAC(); ~MAC(); int initHigh(); int initLow(); int high(); int low(); int symbolsPerSec(); int bitsPerSymbol(); int preambleLength(); int exponentBase(); int maxIterations(); int minFreeSamples(); int rxtxDelay(); int ackTime(); void setInitHigh(int val); void setInitLow(int val); void setHigh(int val); void setLow(int val); void setSymbolsPerSec(int val); void setBitsBerSymbol(int val); void setPreambleLength(int val); void setExponentBase(int val); void setMaxIterations(int val); void setMinFreeSamples(int val); void setRxtxDelay(int val); void setAckTime(int val); }; tinyos-2.1.2+dfsg/tos/lib/tossim/noise/000077500000000000000000000000001207233610700177675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tossim/noise/TTX4-DemoNoiseTrace.txt000066400000000000000000044000141207233610700241350ustar00rootroot00000000000000-96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -91.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -82.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -83.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -83.0 -71.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -87.0 -83.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -81.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -94.0 -92.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -93.0 -95.0 -93.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -93.0 -92.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -80.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -79.0 -79.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -89.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -81.0 -80.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -87.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -80.0 -72.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -71.0 -96.0 -70.0 -89.0 -83.0 -70.0 -96.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -95.0 -94.0 -79.0 -70.0 -96.0 -69.0 -95.0 -69.0 -69.0 -77.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -82.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -93.0 -93.0 -94.0 -93.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -93.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -85.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -94.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -86.0 -87.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -74.0 -75.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -76.0 -88.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -94.0 -94.0 -93.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -75.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -81.0 -81.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -79.0 -80.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -94.0 -94.0 -93.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -78.0 -78.0 -95.0 -95.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -83.0 -80.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -89.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -87.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -87.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -92.0 -92.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -80.0 -84.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -91.0 -92.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -91.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -92.0 -85.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -80.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -82.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -92.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -93.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -89.0 -90.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -67.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -82.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -93.0 -93.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -92.0 -96.0 -93.0 -93.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -94.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -78.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -94.0 -93.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -81.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -92.0 -93.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -76.0 -84.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -93.0 -93.0 -94.0 -94.0 -94.0 -94.0 -92.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -84.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -83.0 -83.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -84.0 -81.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -80.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -94.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -87.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -98.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -94.0 -94.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -93.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -93.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -81.0 -81.0 -94.0 -93.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -92.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -92.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -83.0 -83.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -94.0 -95.0 -94.0 -94.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -92.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -81.0 -86.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -77.0 -77.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -88.0 -88.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -79.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -79.0 -79.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -86.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -80.0 -75.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -83.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -65.0 -96.0 -70.0 -65.0 -91.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -64.0 -65.0 -91.0 -65.0 -95.0 -65.0 -65.0 -64.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -82.0 -86.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -95.0 -97.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -91.0 -91.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -75.0 -75.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -79.0 -90.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -79.0 -67.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -90.0 -90.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -78.0 -78.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -93.0 -97.0 -94.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -97.0 -95.0 -92.0 -94.0 -94.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -89.0 -74.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -94.0 -94.0 -94.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -79.0 -68.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -80.0 -80.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -72.0 -73.0 -72.0 -73.0 -72.0 -73.0 -96.0 -72.0 -86.0 -92.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -72.0 -72.0 -72.0 -81.0 -72.0 -93.0 -73.0 -73.0 -96.0 -71.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -97.0 -74.0 -75.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -72.0 -72.0 -72.0 -89.0 -72.0 -87.0 -71.0 -70.0 -96.0 -72.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -66.0 -66.0 -66.0 -96.0 -66.0 -89.0 -84.0 -66.0 -96.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -96.0 -85.0 -66.0 -70.0 -89.0 -65.0 -96.0 -66.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -66.0 -65.0 -66.0 -96.0 -66.0 -89.0 -81.0 -66.0 -96.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -96.0 -66.0 -96.0 -66.0 -97.0 -66.0 -89.0 -80.0 -67.0 -95.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -68.0 -95.0 -68.0 -68.0 -84.0 -68.0 -87.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -67.0 -67.0 -66.0 -75.0 -67.0 -96.0 -67.0 -75.0 -66.0 -91.0 -67.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -79.0 -79.0 -79.0 -79.0 -84.0 -79.0 -92.0 -78.0 -78.0 -96.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -91.0 -78.0 -77.0 -78.0 -96.0 -77.0 -82.0 -93.0 -77.0 -96.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -93.0 -72.0 -72.0 -71.0 -96.0 -71.0 -94.0 -79.0 -70.0 -95.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -96.0 -70.0 -90.0 -70.0 -96.0 -70.0 -96.0 -73.0 -70.0 -89.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -77.0 -77.0 -86.0 -78.0 -96.0 -77.0 -78.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -76.0 -90.0 -76.0 -96.0 -76.0 -76.0 -92.0 -77.0 -82.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -95.0 -96.0 -95.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -73.0 -96.0 -66.0 -95.0 -69.0 -67.0 -91.0 -67.0 -72.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -94.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -65.0 -96.0 -64.0 -90.0 -81.0 -65.0 -96.0 -65.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -84.0 -96.0 -64.0 -89.0 -81.0 -65.0 -96.0 -64.0 -64.0 -65.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -64.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -73.0 -67.0 -67.0 -66.0 -96.0 -67.0 -94.0 -79.0 -67.0 -96.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -96.0 -66.0 -92.0 -66.0 -97.0 -66.0 -66.0 -66.0 -66.0 -96.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -70.0 -71.0 -71.0 -70.0 -86.0 -70.0 -88.0 -70.0 -70.0 -96.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -83.0 -70.0 -89.0 -70.0 -87.0 -70.0 -70.0 -96.0 -70.0 -97.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -89.0 -89.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -80.0 -79.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -84.0 -84.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -83.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -77.0 -77.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -81.0 -77.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -81.0 -89.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -83.0 -97.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -79.0 -86.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -78.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -93.0 -93.0 -92.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -93.0 -93.0 -94.0 -95.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -82.0 -82.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -85.0 -88.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -93.0 -96.0 -93.0 -92.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -93.0 -91.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -88.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -83.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -86.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -92.0 -93.0 -93.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -93.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -95.0 -96.0 -88.0 -67.0 -67.0 -67.0 -95.0 -67.0 -91.0 -80.0 -67.0 -96.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -96.0 -68.0 -94.0 -68.0 -96.0 -68.0 -94.0 -78.0 -68.0 -96.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -74.0 -96.0 -96.0 -96.0 -78.0 -78.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -74.0 -74.0 -74.0 -96.0 -74.0 -82.0 -92.0 -75.0 -96.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -97.0 -75.0 -81.0 -75.0 -76.0 -74.0 -75.0 -94.0 -75.0 -81.0 -92.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -76.0 -64.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -64.0 -64.0 -85.0 -65.0 -96.0 -64.0 -64.0 -65.0 -64.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -85.0 -66.0 -96.0 -66.0 -66.0 -66.0 -65.0 -97.0 -66.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -66.0 -66.0 -66.0 -66.0 -81.0 -66.0 -86.0 -66.0 -66.0 -96.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -95.0 -66.0 -66.0 -66.0 -96.0 -66.0 -89.0 -80.0 -66.0 -96.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -65.0 -65.0 -65.0 -97.0 -65.0 -85.0 -84.0 -65.0 -96.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -96.0 -65.0 -87.0 -65.0 -96.0 -65.0 -96.0 -72.0 -65.0 -94.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -74.0 -93.0 -82.0 -75.0 -96.0 -75.0 -96.0 -73.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -96.0 -75.0 -77.0 -74.0 -95.0 -75.0 -97.0 -74.0 -74.0 -80.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -96.0 -96.0 -96.0 -96.0 -78.0 -70.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -74.0 -96.0 -68.0 -92.0 -81.0 -68.0 -92.0 -92.0 -85.0 -68.0 -96.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -75.0 -74.0 -74.0 -96.0 -74.0 -90.0 -87.0 -74.0 -96.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -96.0 -73.0 -90.0 -73.0 -96.0 -73.0 -96.0 -76.0 -73.0 -90.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -74.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -66.0 -65.0 -65.0 -96.0 -65.0 -85.0 -83.0 -65.0 -96.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -95.0 -65.0 -90.0 -64.0 -96.0 -65.0 -95.0 -75.0 -65.0 -92.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -92.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -93.0 -93.0 -95.0 -93.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -80.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -85.0 -70.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -92.0 -76.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -73.0 -73.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -92.0 -94.0 -93.0 -96.0 -96.0 -93.0 -96.0 -91.0 -95.0 -96.0 -92.0 -96.0 -92.0 -96.0 -96.0 -93.0 -94.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -78.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -93.0 -96.0 -95.0 -94.0 -95.0 -92.0 -92.0 -95.0 -95.0 -94.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -76.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -89.0 -83.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -94.0 -94.0 -96.0 -94.0 -94.0 -94.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -94.0 -93.0 -95.0 -96.0 -93.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -91.0 -90.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -90.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -74.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -93.0 -94.0 -95.0 -94.0 -95.0 -95.0 -92.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -92.0 -94.0 -94.0 -94.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -93.0 -95.0 -93.0 -94.0 -94.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -73.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -89.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -94.0 -96.0 -95.0 -95.0 -94.0 -93.0 -96.0 -96.0 -94.0 -94.0 -93.0 -96.0 -93.0 -96.0 -93.0 -96.0 -94.0 -95.0 -96.0 -93.0 -94.0 -93.0 -93.0 -93.0 -93.0 -96.0 -98.0 -95.0 -96.0 -92.0 -93.0 -93.0 -94.0 -96.0 -93.0 -93.0 -97.0 -96.0 -92.0 -93.0 -93.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -92.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -81.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -85.0 -75.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -93.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -93.0 -94.0 -94.0 -94.0 -96.0 -94.0 -93.0 -93.0 -93.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -93.0 -93.0 -93.0 -93.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -94.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -86.0 -67.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -67.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -93.0 -93.0 -96.0 -93.0 -96.0 -94.0 -96.0 -93.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -85.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -87.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -83.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -94.0 -96.0 -94.0 -94.0 -96.0 -96.0 -95.0 -94.0 -94.0 -94.0 -94.0 -96.0 -94.0 -94.0 -95.0 -95.0 -94.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -67.0 -86.0 -84.0 -67.0 -96.0 -67.0 -96.0 -69.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -68.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -94.0 -70.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -93.0 -95.0 -94.0 -94.0 -95.0 -95.0 -94.0 -94.0 -94.0 -94.0 -95.0 -95.0 -96.0 -95.0 -94.0 -96.0 -94.0 -95.0 -95.0 -96.0 -94.0 -96.0 -94.0 -95.0 -95.0 -96.0 -96.0 -94.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -66.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -94.0 -93.0 -95.0 -94.0 -96.0 -93.0 -95.0 -94.0 -95.0 -94.0 -96.0 -96.0 -94.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -80.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -79.0 -90.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -69.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -85.0 -84.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -95.0 -93.0 -95.0 -94.0 -93.0 -96.0 -94.0 -94.0 -96.0 -93.0 -96.0 -95.0 -93.0 -96.0 -94.0 -95.0 -94.0 -95.0 -94.0 -94.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -91.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -77.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -90.0 -91.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -86.0 -84.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -98.0 -96.0 -96.0 -96.0 -96.0 -85.0 -86.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -94.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -94.0 -94.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -78.0 -77.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -70.0 -70.0 -70.0 -71.0 -73.0 -70.0 -96.0 -70.0 -77.0 -96.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -69.0 -69.0 -69.0 -75.0 -69.0 -89.0 -69.0 -69.0 -96.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -69.0 -68.0 -68.0 -96.0 -68.0 -87.0 -86.0 -68.0 -96.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -96.0 -68.0 -89.0 -68.0 -96.0 -68.0 -97.0 -71.0 -68.0 -96.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -87.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -66.0 -66.0 -66.0 -96.0 -91.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -88.0 -66.0 -95.0 -65.0 -66.0 -66.0 -66.0 -69.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -66.0 -66.0 -65.0 -66.0 -96.0 -65.0 -93.0 -81.0 -66.0 -96.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -96.0 -93.0 -77.0 -67.0 -95.0 -67.0 -97.0 -66.0 -66.0 -78.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -88.0 -67.0 -96.0 -67.0 -96.0 -69.0 -66.0 -88.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -73.0 -96.0 -66.0 -93.0 -72.0 -66.0 -89.0 -66.0 -66.0 -66.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -65.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -71.0 -96.0 -76.0 -70.0 -93.0 -70.0 -96.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -96.0 -70.0 -89.0 -69.0 -96.0 -69.0 -97.0 -72.0 -69.0 -91.0 -69.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -65.0 -89.0 -77.0 -66.0 -66.0 -85.0 -66.0 -66.0 -95.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -84.0 -66.0 -65.0 -66.0 -97.0 -67.0 -89.0 -87.0 -66.0 -96.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -91.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -70.0 -96.0 -70.0 -70.0 -85.0 -70.0 -78.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -77.0 -70.0 -98.0 -70.0 -74.0 -96.0 -70.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -68.0 -68.0 -68.0 -68.0 -81.0 -68.0 -90.0 -69.0 -68.0 -96.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -92.0 -68.0 -68.0 -68.0 -96.0 -69.0 -87.0 -85.0 -69.0 -96.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -94.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -93.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -88.0 -87.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -90.0 -90.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -72.0 -72.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -94.0 -94.0 -94.0 -95.0 -95.0 -94.0 -95.0 -94.0 -95.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -94.0 -96.0 -95.0 -96.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -88.0 -79.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -92.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -72.0 -72.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -82.0 -93.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -87.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -94.0 -95.0 -95.0 -94.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -78.0 -70.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -88.0 -88.0 -95.0 -95.0 -94.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -92.0 -83.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -92.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -76.0 -76.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -87.0 -87.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -80.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -81.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -89.0 -98.0 -88.0 -96.0 -90.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -85.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -98.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -85.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -81.0 -77.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -86.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -91.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -75.0 -74.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -80.0 -80.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -84.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -82.0 -71.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -77.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -74.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -94.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -82.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -85.0 -85.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -91.0 -80.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -88.0 -94.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -88.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -75.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -90.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -93.0 -94.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -88.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -79.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -82.0 -68.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -88.0 -97.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -94.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -81.0 -81.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -86.0 -96.0 -96.0 -92.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -69.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -87.0 -95.0 -87.0 -96.0 -96.0 -96.0 -94.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -72.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -94.0 -95.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -76.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -84.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -81.0 -81.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -90.0 -85.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -77.0 -69.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -72.0 -72.0 -72.0 -72.0 -86.0 -71.0 -91.0 -72.0 -72.0 -96.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -70.0 -70.0 -70.0 -77.0 -70.0 -94.0 -70.0 -70.0 -96.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -91.0 -92.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -70.0 -83.0 -96.0 -94.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -78.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -94.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -68.0 -96.0 -68.0 -96.0 -68.0 -94.0 -77.0 -68.0 -96.0 -68.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -71.0 -66.0 -67.0 -66.0 -66.0 -84.0 -67.0 -78.0 -66.0 -66.0 -96.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -78.0 -79.0 -86.0 -77.0 -96.0 -77.0 -96.0 -79.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -74.0 -75.0 -74.0 -75.0 -83.0 -70.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -70.0 -71.0 -70.0 -70.0 -86.0 -70.0 -81.0 -71.0 -70.0 -96.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -85.0 -70.0 -70.0 -70.0 -96.0 -70.0 -87.0 -86.0 -70.0 -96.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -66.0 -67.0 -66.0 -66.0 -75.0 -66.0 -96.0 -66.0 -71.0 -96.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -69.0 -66.0 -97.0 -66.0 -74.0 -95.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -68.0 -68.0 -67.0 -68.0 -81.0 -68.0 -91.0 -68.0 -68.0 -96.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -67.0 -67.0 -67.0 -73.0 -67.0 -97.0 -67.0 -68.0 -96.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -77.0 -77.0 -77.0 -77.0 -82.0 -77.0 -94.0 -77.0 -77.0 -90.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -78.0 -76.0 -83.0 -76.0 -93.0 -76.0 -76.0 -96.0 -76.0 -96.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -67.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -83.0 -96.0 -95.0 -94.0 -94.0 -95.0 -94.0 -94.0 -96.0 -94.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -66.0 -67.0 -66.0 -67.0 -82.0 -66.0 -90.0 -66.0 -66.0 -96.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -89.0 -66.0 -66.0 -66.0 -96.0 -66.0 -88.0 -80.0 -66.0 -96.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -74.0 -93.0 -84.0 -74.0 -96.0 -75.0 -96.0 -76.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -96.0 -76.0 -96.0 -76.0 -96.0 -76.0 -94.0 -85.0 -76.0 -96.0 -77.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -96.0 -96.0 -96.0 -96.0 -90.0 -89.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -67.0 -67.0 -66.0 -67.0 -96.0 -67.0 -89.0 -80.0 -67.0 -96.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -66.0 -66.0 -66.0 -81.0 -66.0 -96.0 -67.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -90.0 -93.0 -96.0 -96.0 -96.0 -88.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -69.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -97.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -94.0 -90.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -73.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -95.0 -96.0 -95.0 -82.0 -82.0 -96.0 -96.0 -94.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -93.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -79.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -89.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -72.0 -68.0 -68.0 -68.0 -96.0 -68.0 -98.0 -76.0 -68.0 -96.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -67.0 -67.0 -73.0 -67.0 -96.0 -68.0 -74.0 -96.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -70.0 -70.0 -70.0 -70.0 -71.0 -70.0 -96.0 -71.0 -75.0 -96.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -72.0 -70.0 -70.0 -70.0 -71.0 -96.0 -70.0 -70.0 -92.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -96.0 -96.0 -81.0 -76.0 -95.0 -95.0 -96.0 -96.0 -69.0 -66.0 -89.0 -66.0 -96.0 -66.0 -66.0 -70.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -96.0 -67.0 -96.0 -66.0 -66.0 -83.0 -67.0 -88.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -95.0 -93.0 -78.0 -69.0 -96.0 -69.0 -96.0 -68.0 -70.0 -75.0 -69.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -81.0 -68.0 -92.0 -68.0 -68.0 -96.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -93.0 -96.0 -95.0 -96.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -88.0 -66.0 -66.0 -66.0 -66.0 -72.0 -66.0 -93.0 -67.0 -66.0 -91.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -68.0 -68.0 -68.0 -68.0 -76.0 -68.0 -92.0 -68.0 -68.0 -95.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -85.0 -68.0 -68.0 -68.0 -96.0 -68.0 -86.0 -85.0 -68.0 -95.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -73.0 -66.0 -66.0 -66.0 -96.0 -67.0 -90.0 -77.0 -66.0 -96.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -96.0 -71.0 -81.0 -66.0 -96.0 -66.0 -96.0 -66.0 -66.0 -86.0 -67.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -70.0 -96.0 -70.0 -96.0 -70.0 -96.0 -77.0 -70.0 -95.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -74.0 -70.0 -70.0 -70.0 -70.0 -79.0 -70.0 -93.0 -70.0 -70.0 -96.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -70.0 -70.0 -70.0 -96.0 -70.0 -80.0 -89.0 -70.0 -96.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -84.0 -70.0 -88.0 -72.0 -96.0 -71.0 -88.0 -87.0 -71.0 -96.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -78.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -94.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -92.0 -87.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -81.0 -86.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -93.0 -95.0 -96.0 -95.0 -95.0 -94.0 -94.0 -92.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -92.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -88.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -75.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -94.0 -89.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -78.0 -76.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -82.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -85.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -94.0 -96.0 -94.0 -96.0 -94.0 -96.0 -94.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -91.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -94.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -94.0 -95.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -90.0 -96.0 -96.0 -96.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -96.0 -97.0 -96.0 -95.0 -93.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -68.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -94.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -85.0 -90.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -94.0 -95.0 -96.0 -95.0 -96.0 -94.0 -96.0 -96.0 -95.0 -94.0 -95.0 -94.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -93.0 -93.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -70.0 -71.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -85.0 -68.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -90.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -84.0 -73.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -92.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -90.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -93.0 -94.0 -94.0 -94.0 -96.0 -96.0 -93.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -87.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -83.0 -75.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -85.0 -85.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -82.0 -82.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -90.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -90.0 -89.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -91.0 -91.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -73.0 -91.0 -72.0 -72.0 -72.0 -72.0 -96.0 -71.0 -90.0 -85.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -72.0 -79.0 -71.0 -96.0 -71.0 -75.0 -93.0 -70.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -74.0 -96.0 -74.0 -74.0 -85.0 -74.0 -89.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -70.0 -70.0 -70.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -68.0 -68.0 -67.0 -68.0 -81.0 -68.0 -88.0 -68.0 -68.0 -96.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -68.0 -68.0 -68.0 -66.0 -67.0 -96.0 -68.0 -74.0 -92.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -77.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -71.0 -70.0 -70.0 -96.0 -70.0 -90.0 -86.0 -70.0 -96.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -98.0 -70.0 -88.0 -71.0 -71.0 -71.0 -70.0 -96.0 -71.0 -85.0 -89.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -68.0 -68.0 -66.0 -68.0 -83.0 -68.0 -90.0 -68.0 -68.0 -96.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -84.0 -67.0 -66.0 -66.0 -95.0 -67.0 -88.0 -84.0 -67.0 -96.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -66.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -78.0 -73.0 -72.0 -73.0 -96.0 -73.0 -90.0 -86.0 -72.0 -96.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -96.0 -97.0 -78.0 -75.0 -92.0 -72.0 -96.0 -71.0 -71.0 -80.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -94.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -94.0 -95.0 -95.0 -95.0 -95.0 -94.0 -95.0 -95.0 -94.0 -96.0 -95.0 -95.0 -95.0 -97.0 -94.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -76.0 -76.0 -80.0 -76.0 -95.0 -76.0 -78.0 -94.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -80.0 -74.0 -74.0 -73.0 -74.0 -86.0 -73.0 -88.0 -74.0 -73.0 -96.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -71.0 -70.0 -70.0 -70.0 -96.0 -70.0 -94.0 -84.0 -71.0 -97.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -97.0 -71.0 -96.0 -70.0 -97.0 -70.0 -96.0 -76.0 -71.0 -92.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -76.0 -72.0 -96.0 -69.0 -96.0 -69.0 -96.0 -74.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -96.0 -68.0 -96.0 -68.0 -71.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -94.0 -93.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -77.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -84.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -76.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -95.0 -94.0 -96.0 -95.0 -94.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -95.0 -94.0 -96.0 -95.0 -95.0 -95.0 -96.0 -93.0 -96.0 -95.0 -95.0 -95.0 -94.0 -95.0 -94.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -86.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -90.0 -75.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -74.0 -74.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -76.0 -83.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -72.0 -72.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -87.0 -82.0 -96.0 -95.0 -90.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -74.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -91.0 -83.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -93.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -85.0 -86.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -91.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -84.0 -85.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -86.0 -87.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -95.0 -95.0 -94.0 -94.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -74.0 -96.0 -76.0 -80.0 -91.0 -74.0 -96.0 -74.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -87.0 -96.0 -73.0 -80.0 -80.0 -75.0 -96.0 -74.0 -75.0 -77.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -94.0 -95.0 -95.0 -95.0 -94.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -94.0 -94.0 -94.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -90.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -72.0 -96.0 -76.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -89.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -94.0 -94.0 -94.0 -96.0 -94.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -94.0 -95.0 -94.0 -95.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -78.0 -85.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -86.0 -84.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -90.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -70.0 -70.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -83.0 -75.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -94.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -95.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -79.0 -87.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -88.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -92.0 -69.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -79.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -94.0 -95.0 -94.0 -94.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -82.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -84.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -94.0 -96.0 -95.0 -96.0 -94.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -94.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -94.0 -95.0 -93.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -94.0 -96.0 -94.0 -94.0 -96.0 -94.0 -95.0 -94.0 -95.0 -95.0 -95.0 -95.0 -93.0 -95.0 -94.0 -95.0 -94.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -94.0 -95.0 -94.0 -94.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -90.0 -93.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -78.0 -69.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -94.0 -93.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -94.0 -94.0 -95.0 -94.0 -96.0 -95.0 -94.0 -94.0 -95.0 -95.0 -94.0 -95.0 -95.0 -95.0 -94.0 -94.0 -95.0 -94.0 -95.0 -95.0 -95.0 -94.0 -96.0 -94.0 -97.0 -95.0 -95.0 -95.0 -96.0 -93.0 -96.0 -95.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -94.0 -95.0 -93.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -95.0 -95.0 -95.0 -96.0 -94.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -82.0 -81.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -94.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -87.0 -80.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -75.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -75.0 -75.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -85.0 -86.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -94.0 -97.0 -96.0 -93.0 -95.0 -96.0 -96.0 -94.0 -95.0 -93.0 -95.0 -95.0 -94.0 -92.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -92.0 -96.0 -93.0 -93.0 -93.0 -92.0 -93.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -80.0 -77.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -87.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -73.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -93.0 -95.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -94.0 -96.0 -94.0 -95.0 -96.0 -96.0 -95.0 -92.0 -92.0 -96.0 -93.0 -93.0 -93.0 -96.0 -96.0 -94.0 -84.0 -93.0 -93.0 -96.0 -95.0 -96.0 -93.0 -92.0 -97.0 -92.0 -93.0 -93.0 -96.0 -93.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -94.0 -92.0 -93.0 -92.0 -94.0 -92.0 -93.0 -93.0 -94.0 -96.0 -96.0 -96.0 -97.0 -95.0 -94.0 -93.0 -92.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -94.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -82.0 -77.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -94.0 -89.0 -78.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -94.0 -95.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -95.0 -94.0 -93.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -76.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -91.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -80.0 -80.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -93.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -94.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -94.0 -96.0 -96.0 -95.0 -94.0 -95.0 -94.0 -94.0 -94.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -95.0 -94.0 -96.0 -95.0 -96.0 -95.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -94.0 -97.0 -94.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -94.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -83.0 -89.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -93.0 -96.0 -93.0 -94.0 -94.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -93.0 -93.0 -95.0 -92.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -83.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -89.0 -90.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -72.0 -76.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -94.0 -77.0 -92.0 -95.0 -96.0 -95.0 -94.0 -94.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -78.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -91.0 -83.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -93.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -95.0 -95.0 -94.0 -95.0 -95.0 -95.0 -95.0 -94.0 -95.0 -95.0 -95.0 -96.0 -95.0 -94.0 -94.0 -94.0 -95.0 -95.0 -95.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -89.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -94.0 -96.0 -93.0 -95.0 -96.0 -95.0 -93.0 -95.0 -94.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -93.0 -93.0 -97.0 -93.0 -94.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -82.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -82.0 -74.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -93.0 -93.0 -92.0 -96.0 -95.0 -93.0 -95.0 -93.0 -94.0 -96.0 -92.0 -96.0 -94.0 -93.0 -93.0 -94.0 -93.0 -95.0 -93.0 -94.0 -94.0 -95.0 -94.0 -93.0 -95.0 -93.0 -93.0 -94.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -78.0 -81.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -92.0 -84.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -95.0 -95.0 -95.0 -94.0 -96.0 -93.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -93.0 -95.0 -93.0 -94.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -94.0 -81.0 -80.0 -96.0 -77.0 -96.0 -76.0 -91.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -96.0 -75.0 -95.0 -76.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -95.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -86.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -93.0 -95.0 -94.0 -95.0 -94.0 -96.0 -94.0 -94.0 -94.0 -94.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -82.0 -69.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -94.0 -93.0 -95.0 -94.0 -95.0 -93.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -93.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -82.0 -82.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -94.0 -83.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -70.0 -80.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -94.0 -93.0 -93.0 -93.0 -94.0 -94.0 -95.0 -96.0 -97.0 -95.0 -96.0 -94.0 -94.0 -94.0 -93.0 -96.0 -93.0 -94.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -75.0 -76.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -94.0 -94.0 -95.0 -94.0 -94.0 -93.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -80.0 -94.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -85.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -94.0 -94.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -79.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -95.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -93.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -84.0 -84.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -78.0 -77.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -94.0 -96.0 -95.0 -95.0 -94.0 -94.0 -94.0 -95.0 -95.0 -94.0 -95.0 -95.0 -94.0 -95.0 -95.0 -94.0 -96.0 -94.0 -95.0 -95.0 -94.0 -95.0 -94.0 -94.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -79.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -78.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -94.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -82.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -79.0 -78.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -74.0 -74.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -84.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -76.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -76.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -85.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -98.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -94.0 -95.0 -94.0 -95.0 -96.0 -97.0 -97.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -88.0 -88.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -95.0 -94.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -93.0 -93.0 -96.0 -95.0 -95.0 -95.0 -92.0 -95.0 -93.0 -95.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -85.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -77.0 -77.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -78.0 -93.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -90.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -94.0 -94.0 -95.0 -96.0 -96.0 -96.0 -95.0 -93.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -94.0 -96.0 -93.0 -94.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -84.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -87.0 -82.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -94.0 -96.0 -94.0 -96.0 -94.0 -94.0 -93.0 -96.0 -94.0 -95.0 -94.0 -95.0 -94.0 -96.0 -94.0 -94.0 -95.0 -94.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -92.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -94.0 -94.0 -92.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -76.0 -72.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -78.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -75.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -76.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -80.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -85.0 -85.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -93.0 -94.0 -94.0 -93.0 -96.0 -93.0 -94.0 -96.0 -94.0 -96.0 -94.0 -94.0 -96.0 -96.0 -94.0 -96.0 -94.0 -95.0 -93.0 -95.0 -94.0 -94.0 -94.0 -94.0 -93.0 -95.0 -95.0 -94.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -77.0 -91.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -76.0 -76.0 -76.0 -95.0 -76.0 -89.0 -86.0 -77.0 -96.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -77.0 -96.0 -76.0 -96.0 -76.0 -97.0 -76.0 -94.0 -81.0 -76.0 -96.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -77.0 -77.0 -77.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -79.0 -79.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -91.0 -77.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -80.0 -76.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -79.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -95.0 -97.0 -95.0 -95.0 -94.0 -94.0 -96.0 -94.0 -93.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -90.0 -78.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -85.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -77.0 -72.0 -94.0 -70.0 -96.0 -70.0 -71.0 -81.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -73.0 -73.0 -73.0 -81.0 -73.0 -93.0 -73.0 -74.0 -93.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -79.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -90.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -76.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -84.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -79.0 -79.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -85.0 -80.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -82.0 -79.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -92.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -82.0 -77.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -84.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -74.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -82.0 -76.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -98.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -80.0 -79.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -98.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -86.0 -68.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -94.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -97.0 -95.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -95.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -94.0 -96.0 -96.0 -94.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -94.0 -94.0 -94.0 -95.0 -93.0 -95.0 -96.0 -94.0 -94.0 -95.0 -94.0 -95.0 -94.0 -93.0 -96.0 -96.0 -95.0 -94.0 -95.0 -94.0 -93.0 -96.0 -80.0 -86.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -85.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -67.0 -96.0 -66.0 -92.0 -77.0 -67.0 -96.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -67.0 -95.0 -83.0 -84.0 -68.0 -96.0 -68.0 -96.0 -70.0 -68.0 -89.0 -69.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -82.0 -77.0 -96.0 -76.0 -96.0 -76.0 -77.0 -82.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -83.0 -76.0 -92.0 -76.0 -76.0 -96.0 -76.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -94.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -93.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -89.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -82.0 -82.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -82.0 -86.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -84.0 -79.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -94.0 -93.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -81.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -88.0 -87.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -92.0 -92.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -77.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -75.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -87.0 -87.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -92.0 -72.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -82.0 -73.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -81.0 -81.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -95.0 -96.0 -95.0 -95.0 -96.0 -94.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -94.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -94.0 -94.0 -95.0 -94.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -98.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -89.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -93.0 -93.0 -96.0 -93.0 -96.0 -96.0 -93.0 -94.0 -93.0 -94.0 -96.0 -94.0 -94.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -91.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -94.0 -95.0 -96.0 -94.0 -94.0 -95.0 -95.0 -94.0 -95.0 -94.0 -96.0 -95.0 -94.0 -94.0 -94.0 -94.0 -94.0 -95.0 -95.0 -95.0 -94.0 -94.0 -95.0 -94.0 -93.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -86.0 -80.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -99.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -78.0 -78.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -87.0 -78.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -80.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -85.0 -76.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -94.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -80.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -82.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -90.0 -76.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -85.0 -86.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -87.0 -74.0 -74.0 -74.0 -96.0 -75.0 -91.0 -90.0 -74.0 -96.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -96.0 -75.0 -96.0 -75.0 -96.0 -75.0 -78.0 -96.0 -75.0 -96.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -91.0 -78.0 -95.0 -95.0 -95.0 -95.0 -96.0 -97.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -94.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -94.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -92.0 -94.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -91.0 -91.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -84.0 -87.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -90.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -82.0 -82.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -86.0 -87.0 -87.0 -96.0 -87.0 -95.0 -91.0 -86.0 -96.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -92.0 -86.0 -93.0 -86.0 -87.0 -96.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -86.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -79.0 -80.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -89.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -90.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -83.0 -83.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -81.0 -93.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -87.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -85.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -82.0 -76.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -89.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -98.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -94.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -85.0 -85.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -83.0 -72.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -87.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -85.0 -86.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -94.0 -95.0 -96.0 -94.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -88.0 -87.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -88.0 -78.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -87.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -88.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -94.0 -96.0 -95.0 -94.0 -94.0 -96.0 -97.0 -94.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -73.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -93.0 -96.0 -96.0 -93.0 -95.0 -94.0 -90.0 -95.0 -95.0 -96.0 -94.0 -96.0 -94.0 -94.0 -94.0 -97.0 -92.0 -97.0 -92.0 -96.0 -93.0 -96.0 -96.0 -93.0 -96.0 -93.0 -93.0 -92.0 -96.0 -93.0 -94.0 -93.0 -92.0 -96.0 -92.0 -92.0 -93.0 -96.0 -96.0 -96.0 -91.0 -96.0 -92.0 -94.0 -96.0 -96.0 -94.0 -95.0 -93.0 -91.0 -94.0 -92.0 -94.0 -94.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -93.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -85.0 -85.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -93.0 -79.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -93.0 -92.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -92.0 -95.0 -93.0 -93.0 -96.0 -91.0 -92.0 -95.0 -94.0 -96.0 -96.0 -92.0 -94.0 -92.0 -93.0 -96.0 -95.0 -93.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -93.0 -96.0 -95.0 -93.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -91.0 -95.0 -92.0 -95.0 -97.0 -96.0 -91.0 -96.0 -96.0 -94.0 -91.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -94.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -91.0 -92.0 -92.0 -93.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -93.0 -94.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -86.0 -86.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -93.0 -95.0 -94.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -89.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -89.0 -89.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -77.0 -72.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -92.0 -94.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -88.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -89.0 -84.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -83.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -85.0 -85.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -92.0 -83.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -94.0 -94.0 -95.0 -95.0 -95.0 -94.0 -96.0 -94.0 -95.0 -95.0 -95.0 -95.0 -95.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -94.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -86.0 -85.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -95.0 -94.0 -94.0 -94.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -94.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -94.0 -94.0 -95.0 -95.0 -95.0 -95.0 -94.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -94.0 -94.0 -94.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -94.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -92.0 -76.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -86.0 -96.0 -96.0 -88.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -92.0 -78.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -89.0 -89.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -91.0 -76.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -98.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -88.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -88.0 -89.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -93.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -93.0 -96.0 -97.0 -93.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -89.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -91.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -98.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -77.0 -88.0 -89.0 -76.0 -96.0 -76.0 -96.0 -81.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -94.0 -76.0 -89.0 -76.0 -75.0 -74.0 -75.0 -96.0 -75.0 -91.0 -88.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -80.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -87.0 -92.0 -95.0 -97.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -94.0 -95.0 -95.0 -95.0 -94.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -95.0 -94.0 -94.0 -96.0 -95.0 -93.0 -96.0 -94.0 -96.0 -95.0 -95.0 -96.0 -94.0 -96.0 -94.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -91.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -93.0 -80.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -91.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -95.0 -94.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -94.0 -95.0 -93.0 -94.0 -95.0 -95.0 -93.0 -94.0 -93.0 -94.0 -96.0 -96.0 -96.0 -93.0 -95.0 -96.0 -96.0 -96.0 -94.0 -94.0 -94.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -93.0 -95.0 -95.0 -96.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -94.0 -94.0 -96.0 -96.0 -96.0 -95.0 -93.0 -95.0 -93.0 -93.0 -94.0 -92.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -87.0 -76.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -93.0 -97.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -94.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -93.0 -97.0 -96.0 -95.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -93.0 -93.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -94.0 -92.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -92.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -68.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -86.0 -67.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -82.0 -82.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -89.0 -89.0 -96.0 -96.0 -94.0 -96.0 -95.0 -95.0 -94.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -84.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -76.0 -73.0 -94.0 -94.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -85.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -85.0 -95.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -94.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -78.0 -77.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -92.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -81.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -94.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -84.0 -91.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -84.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -89.0 -90.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -86.0 -87.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -96.0 -94.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -82.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -83.0 -82.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -77.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -77.0 -80.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -77.0 -85.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -78.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -85.0 -74.0 -96.0 -74.0 -96.0 -76.0 -74.0 -85.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -74.0 -93.0 -75.0 -96.0 -75.0 -74.0 -96.0 -75.0 -86.0 -86.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -94.0 -81.0 -75.0 -96.0 -74.0 -96.0 -74.0 -88.0 -78.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -94.0 -73.0 -73.0 -73.0 -72.0 -79.0 -72.0 -97.0 -73.0 -75.0 -96.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -75.0 -96.0 -74.0 -93.0 -83.0 -74.0 -96.0 -75.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -88.0 -96.0 -74.0 -93.0 -83.0 -74.0 -96.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -89.0 -90.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -92.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -74.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -85.0 -85.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -89.0 -96.0 -76.0 -81.0 -95.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -91.0 -91.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -89.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -88.0 -75.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -74.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -83.0 -83.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -92.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -76.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -97.0 -89.0 -89.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -86.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -76.0 -76.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -94.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -81.0 -85.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -97.0 -94.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -93.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -85.0 -87.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -85.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -82.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -91.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -73.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -95.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -85.0 -84.0 -84.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -83.0 -74.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -93.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -91.0 -92.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -78.0 -72.0 -93.0 -70.0 -96.0 -71.0 -71.0 -77.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -70.0 -96.0 -70.0 -96.0 -71.0 -71.0 -87.0 -71.0 -77.0 -70.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -95.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -90.0 -91.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -91.0 -91.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -72.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -91.0 -89.0 -95.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -72.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -93.0 -95.0 -95.0 -94.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -91.0 -84.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -78.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -97.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -82.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -76.0 -76.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -94.0 -94.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -77.0 -67.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -78.0 -79.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -93.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -88.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -89.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -91.0 -85.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -93.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -87.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -94.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -94.0 -94.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -88.0 -75.0 -75.0 -75.0 -96.0 -75.0 -93.0 -85.0 -76.0 -96.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -76.0 -96.0 -74.0 -90.0 -75.0 -96.0 -74.0 -96.0 -76.0 -74.0 -93.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -75.0 -74.0 -74.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -86.0 -78.0 -78.0 -78.0 -97.0 -78.0 -83.0 -92.0 -78.0 -96.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -96.0 -79.0 -85.0 -79.0 -79.0 -81.0 -79.0 -96.0 -79.0 -88.0 -91.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -89.0 -89.0 -96.0 -96.0 -96.0 -96.0 -93.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -80.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -93.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -68.0 -90.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -92.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -88.0 -70.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -95.0 -94.0 -95.0 -95.0 -94.0 -96.0 -94.0 -96.0 -95.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -93.0 -92.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -83.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -87.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -95.0 -94.0 -95.0 -95.0 -96.0 -94.0 -97.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -94.0 -96.0 -95.0 -95.0 -94.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -89.0 -95.0 -95.0 -95.0 -94.0 -96.0 -94.0 -94.0 -95.0 -95.0 -94.0 -94.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -91.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -87.0 -79.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -90.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -85.0 -85.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -89.0 -80.0 -95.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -83.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -94.0 -94.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -94.0 -96.0 -95.0 -94.0 -95.0 -96.0 -95.0 -97.0 -95.0 -95.0 -94.0 -97.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -86.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -93.0 -94.0 -95.0 -94.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -96.0 -89.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -88.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -94.0 -95.0 -94.0 -96.0 -95.0 -94.0 -93.0 -95.0 -92.0 -94.0 -96.0 -95.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -81.0 -75.0 -96.0 -75.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -70.0 -70.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -85.0 -85.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -92.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -87.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -94.0 -96.0 -95.0 -94.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -92.0 -87.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -92.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -94.0 -94.0 -93.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -66.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -94.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -86.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -93.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -93.0 -93.0 -92.0 -92.0 -93.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -93.0 -91.0 -92.0 -95.0 -92.0 -91.0 -96.0 -93.0 -95.0 -96.0 -93.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -93.0 -97.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -93.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -93.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -87.0 -70.0 -95.0 -96.0 -71.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -84.0 -69.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -95.0 -95.0 -96.0 -96.0 -94.0 -96.0 -94.0 -95.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -94.0 -95.0 -94.0 -82.0 -73.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -91.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -93.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -89.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -70.0 -96.0 -75.0 -96.0 -74.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -80.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -82.0 -71.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -78.0 -79.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -87.0 -93.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -88.0 -68.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -93.0 -69.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -69.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -94.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -92.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -83.0 -72.0 -85.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -80.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -69.0 -66.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -78.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -86.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -82.0 -80.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -89.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -82.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -95.0 -95.0 -95.0 -94.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -94.0 -95.0 -97.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -81.0 -94.0 -80.0 -96.0 -81.0 -94.0 -86.0 -81.0 -96.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -81.0 -84.0 -85.0 -83.0 -83.0 -95.0 -96.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -85.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -93.0 -94.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -83.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -94.0 -95.0 -96.0 -95.0 -94.0 -96.0 -94.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -94.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -87.0 -67.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -93.0 -93.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -80.0 -80.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -90.0 -90.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -79.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -72.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -88.0 -88.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -92.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -88.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -77.0 -77.0 -96.0 -96.0 -96.0 -96.0 -96.0 -83.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -91.0 -91.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -80.0 -73.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -95.0 -94.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -94.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -92.0 -96.0 -89.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -72.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -90.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -94.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -81.0 -80.0 -95.0 -95.0 -96.0 -94.0 -94.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -94.0 -95.0 -94.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -98.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -85.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -86.0 -86.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -82.0 -79.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -92.0 -78.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -90.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -74.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -91.0 -85.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -88.0 -77.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -79.0 -79.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -79.0 -71.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -88.0 -70.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -83.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -94.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -95.0 -96.0 -96.0 -94.0 -94.0 -96.0 -95.0 -95.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -94.0 -96.0 -96.0 -95.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -97.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -92.0 -91.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -94.0 -94.0 -95.0 -94.0 -96.0 -94.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -94.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -93.0 -95.0 -94.0 -94.0 -94.0 -95.0 -96.0 -97.0 -95.0 -94.0 -94.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -85.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -81.0 -90.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -98.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -87.0 -86.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -89.0 -93.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -89.0 -95.0 -97.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -68.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -94.0 -95.0 -95.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -93.0 -93.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -82.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -76.0 -77.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -94.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -93.0 -96.0 -95.0 -96.0 -95.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -83.0 -83.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -90.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -89.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -72.0 -72.0 -72.0 -71.0 -80.0 -72.0 -94.0 -72.0 -72.0 -96.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -97.0 -72.0 -70.0 -71.0 -97.0 -71.0 -89.0 -86.0 -72.0 -96.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -80.0 -73.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -80.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -97.0 -97.0 -96.0 -92.0 -94.0 -93.0 -95.0 -93.0 -95.0 -94.0 -94.0 -96.0 -94.0 -94.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -88.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -87.0 -67.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -94.0 -93.0 -95.0 -94.0 -95.0 -93.0 -95.0 -93.0 -92.0 -96.0 -95.0 -94.0 -96.0 -94.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -93.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -95.0 -96.0 -92.0 -94.0 -94.0 -95.0 -93.0 -93.0 -93.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -92.0 -91.0 -96.0 -92.0 -92.0 -95.0 -94.0 -94.0 -95.0 -91.0 -95.0 -92.0 -92.0 -92.0 -96.0 -92.0 -92.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -88.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -78.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -97.0 -93.0 -91.0 -91.0 -92.0 -92.0 -93.0 -94.0 -93.0 -92.0 -90.0 -92.0 -92.0 -92.0 -93.0 -93.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -93.0 -94.0 -93.0 -96.0 -96.0 -96.0 -91.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -85.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -97.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -91.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -81.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -92.0 -92.0 -92.0 -93.0 -92.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -94.0 -94.0 -96.0 -94.0 -93.0 -94.0 -94.0 -96.0 -93.0 -93.0 -97.0 -95.0 -94.0 -95.0 -96.0 -95.0 -93.0 -95.0 -94.0 -95.0 -97.0 -95.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -94.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -95.0 -93.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -89.0 -87.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -77.0 -72.0 -72.0 -72.0 -96.0 -73.0 -78.0 -92.0 -72.0 -96.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -96.0 -72.0 -78.0 -72.0 -72.0 -75.0 -73.0 -96.0 -73.0 -77.0 -93.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -73.0 -74.0 -74.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -72.0 -78.0 -72.0 -96.0 -72.0 -72.0 -96.0 -72.0 -96.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -72.0 -96.0 -74.0 -97.0 -74.0 -96.0 -74.0 -94.0 -82.0 -74.0 -95.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -75.0 -74.0 -74.0 -74.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -87.0 -96.0 -96.0 -96.0 -96.0 -78.0 -78.0 -77.0 -78.0 -89.0 -78.0 -82.0 -78.0 -78.0 -96.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -96.0 -78.0 -78.0 -78.0 -95.0 -79.0 -90.0 -89.0 -78.0 -96.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -79.0 -80.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -78.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -89.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -80.0 -80.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -98.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -89.0 -89.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -93.0 -75.0 -74.0 -74.0 -96.0 -75.0 -75.0 -92.0 -75.0 -95.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -96.0 -74.0 -96.0 -75.0 -96.0 -74.0 -89.0 -87.0 -75.0 -96.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -91.0 -95.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -97.0 -78.0 -92.0 -78.0 -78.0 -78.0 -78.0 -96.0 -78.0 -87.0 -91.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -78.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -91.0 -71.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -94.0 -94.0 -96.0 -95.0 -95.0 -96.0 -95.0 -94.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -93.0 -97.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -94.0 -96.0 -94.0 -95.0 -96.0 -95.0 -94.0 -95.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -84.0 -98.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -88.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -85.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -91.0 -91.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -76.0 -79.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -94.0 -95.0 -95.0 -95.0 -96.0 -94.0 -95.0 -95.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -94.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -85.0 -86.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -93.0 -90.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -92.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -73.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -91.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -90.0 -90.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -85.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -87.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -94.0 -94.0 -95.0 -94.0 -94.0 -93.0 -95.0 -94.0 -94.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -80.0 -72.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -94.0 -94.0 -96.0 -94.0 -95.0 -94.0 -94.0 -93.0 -95.0 -94.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -88.0 -88.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -84.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -91.0 -75.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -87.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -96.0 -96.0 -94.0 -95.0 -94.0 -94.0 -95.0 -95.0 -94.0 -95.0 -96.0 -95.0 -94.0 -94.0 -94.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -94.0 -94.0 -95.0 -95.0 -97.0 -94.0 -94.0 -95.0 -95.0 -95.0 -95.0 -95.0 -94.0 -94.0 -94.0 -96.0 -95.0 -95.0 -95.0 -96.0 -94.0 -95.0 -96.0 -95.0 -96.0 -85.0 -70.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -94.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -94.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -94.0 -95.0 -95.0 -94.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -95.0 -95.0 -95.0 -94.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -94.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -82.0 -95.0 -95.0 -96.0 -96.0 -94.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -94.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -92.0 -76.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -94.0 -96.0 -95.0 -95.0 -95.0 -96.0 -94.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -94.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -87.0 -79.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -96.0 -88.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -91.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -92.0 -84.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -92.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -83.0 -85.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -74.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -76.0 -84.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -67.0 -90.0 -82.0 -68.0 -96.0 -67.0 -97.0 -75.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -96.0 -68.0 -96.0 -68.0 -96.0 -69.0 -90.0 -85.0 -68.0 -96.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -68.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -82.0 -70.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -88.0 -87.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -94.0 -95.0 -94.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -88.0 -88.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -84.0 -81.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -91.0 -85.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -91.0 -93.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -82.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -92.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -95.0 -94.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -80.0 -64.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -95.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -81.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -86.0 -71.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -84.0 -84.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -93.0 -79.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -80.0 -75.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -83.0 -67.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -90.0 -85.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -93.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -95.0 -95.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -90.0 -82.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -79.0 -79.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -85.0 -87.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -92.0 -68.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -85.0 -84.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -81.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -83.0 -79.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -94.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -94.0 -93.0 -94.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -79.0 -79.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -91.0 -74.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -80.0 -80.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -94.0 -95.0 -94.0 -96.0 -96.0 -94.0 -95.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -73.0 -73.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -91.0 -91.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -84.0 -87.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -91.0 -91.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -94.0 -95.0 -93.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -94.0 -89.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -98.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -84.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -76.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -86.0 -83.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -90.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -94.0 -95.0 -94.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -83.0 -75.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -91.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -76.0 -76.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -81.0 -81.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -74.0 -96.0 -74.0 -96.0 -75.0 -94.0 -81.0 -75.0 -96.0 -75.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -81.0 -74.0 -74.0 -73.0 -74.0 -87.0 -74.0 -80.0 -74.0 -74.0 -96.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -74.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -86.0 -76.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -94.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -88.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -97.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -97.0 -95.0 -96.0 -95.0 -95.0 -95.0 -69.0 -83.0 -69.0 -96.0 -69.0 -97.0 -68.0 -92.0 -85.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -69.0 -94.0 -70.0 -73.0 -70.0 -71.0 -73.0 -72.0 -96.0 -72.0 -72.0 -92.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -71.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -88.0 -92.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -79.0 -79.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -86.0 -76.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -90.0 -96.0 -96.0 -96.0 -96.0 -89.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -97.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -97.0 -95.0 -97.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -94.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -94.0 -92.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -94.0 -96.0 -96.0 -95.0 -96.0 -95.0 -94.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -95.0 -96.0 -95.0 -95.0 -95.0 -95.0 -94.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -95.0 -95.0 -95.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -97.0 -96.0 -97.0 -97.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -97.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -95.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 -97.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -95.0 -96.0 -96.0 -96.0 -96.0 -96.0 -96.0 tinyos-2.1.2+dfsg/tos/lib/tossim/noise/casino-lab.txt000066400000000000000000030000601207233610700225370ustar00rootroot00000000000000-98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -96 -99 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -96 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -93 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -96 -96 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -99 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -89 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -99 -97 -96 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -99 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -54 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -96 -96 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -99 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -99 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -96 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -97 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -99 -97 -97 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -91 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -77 -98 -97 -98 -97 -99 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -97 -80 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -96 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -81 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -92 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -93 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -55 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -97 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -97 -99 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -99 -98 -99 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -96 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -83 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -97 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -96 -96 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -96 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -100 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -99 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -95 -97 -98 -98 -98 -98 -97 -98 -96 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -96 -96 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -96 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -96 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -88 -97 -97 -98 -97 -98 -98 -98 -97 -99 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -96 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -96 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -91 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -96 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -96 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -85 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -96 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -77 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -99 -99 -99 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -99 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -96 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -90 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -99 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -55 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -96 -97 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -100 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -99 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -97 -98 -97 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -93 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -96 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -76 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -99 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -99 -97 -97 -98 -97 -98 -97 -98 -96 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -96 -97 -97 -91 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -54 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -99 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -96 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -99 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -96 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -96 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -93 -98 -99 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -97 -98 -97 -99 -97 -97 -97 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -96 -98 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -99 -97 -98 -97 -98 -98 -98 -97 -99 -98 -97 -98 -98 -75 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -96 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -76 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -99 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -54 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -99 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -99 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -99 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -93 -98 -93 -98 -97 -97 -94 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -93 -98 -98 -97 -96 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -96 -98 -96 -99 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -93 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -96 -96 -97 -96 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -94 -98 -98 -98 -97 -98 -98 -97 -99 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -99 -98 -98 -84 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -91 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -96 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -78 -98 -98 -97 -99 -96 -98 -97 -97 -96 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -96 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -96 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -96 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -94 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -92 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -56 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -99 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -90 -98 -97 -91 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -96 -97 -98 -96 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -99 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -99 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -83 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -92 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -58 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -96 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -99 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -99 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -99 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -96 -97 -98 -97 -98 -97 -98 -97 -96 -96 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -99 -97 -97 -96 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -99 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -99 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -82 -97 -97 -97 -98 -97 -98 -97 -97 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -99 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -100 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -96 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -56 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -100 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -92 -98 -96 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -99 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -95 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -99 -97 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -99 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -99 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -58 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -97 -97 -97 -98 -99 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -99 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -99 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -90 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -90 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -89 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -58 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -99 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -84 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -99 -98 -97 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -99 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -99 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -99 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -95 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -101 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -99 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -99 -92 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -99 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -99 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -90 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -99 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -58 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -99 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -99 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -99 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -99 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -99 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -76 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -99 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -100 -97 -97 -98 -98 -97 -97 -58 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -89 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -99 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -90 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -99 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -99 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -54 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -99 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -95 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -99 -97 -98 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -88 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -99 -97 -99 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -99 -98 -97 -98 -97 -98 -98 -90 -98 -97 -99 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -99 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -99 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -99 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -94 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -54 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -99 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -95 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -97 -99 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -96 -98 -97 -96 -87 -98 -98 -98 -90 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -96 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -96 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -97 -96 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -96 -96 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -54 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -96 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -97 -96 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -96 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -96 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -96 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -96 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -96 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -96 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -99 -97 -98 -98 -98 -98 -99 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -89 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -54 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -97 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -76 -97 -98 -99 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -96 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -96 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -99 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -96 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -97 -96 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -83 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -89 -99 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -84 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -97 -96 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -83 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -97 -97 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -55 -98 -97 -98 -98 -98 -97 -98 -98 -97 -96 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -98 -97 -99 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -97 -98 -96 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -96 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -99 -98 -97 -98 -98 -97 -98 -97 -96 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -96 -97 -97 -97 -97 -98 -99 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -97 -98 -97 -97 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -99 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -92 -92 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -99 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -99 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -73 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -97 -99 -98 -98 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -96 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -96 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -96 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -99 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -96 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -99 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -96 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -96 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -99 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -99 -98 -98 -98 -97 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -95 -97 -98 -98 -98 -98 -98 -98 -97 -54 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -96 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -96 -97 -98 -99 -97 -97 -99 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -97 -98 -97 -97 -98 -97 -98 -98 -99 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -99 -97 -97 -98 -98 -98 -98 -98 -96 -98 -98 -97 -97 -99 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -96 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -76 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -99 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -90 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -99 -98 -97 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -99 -98 -97 -99 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -99 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -98 -96 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -96 -98 -98 -98 -97 -96 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -96 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -99 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -97 -98 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -96 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -54 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -95 -96 -97 -91 -97 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -97 -99 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -90 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -97 -98 -98 -98 -97 -98 -97 -96 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -100 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -96 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -96 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -96 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -99 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -96 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -89 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -99 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -96 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -96 -97 -98 -97 -98 -98 -98 -97 -80 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -54 -98 -98 -98 -98 -98 -99 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -96 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -100 -96 -98 -98 -97 -98 -98 -99 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -96 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -99 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -99 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -97 -97 -98 -98 -98 -97 -99 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -99 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -90 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -96 -96 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -96 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -99 -97 -97 -99 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -91 -97 -98 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -96 -98 -98 -97 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -98 -98 -98 -98 -54 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -97 -97 -98 -98 -98 -97 -97 -96 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -96 -96 -97 -97 -99 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -91 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -99 -97 -97 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -99 -98 -96 -98 -98 -99 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -96 -99 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -94 -97 -98 -98 -98 -97 -98 -98 -98 -97 -96 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -99 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -96 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -99 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -59 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -96 -97 -98 -99 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -99 -98 -92 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -96 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -97 -98 -97 -97 -96 -98 -98 -98 -98 -98 -97 -96 -97 -98 -97 -98 -98 -97 -98 -96 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -99 -97 -97 -90 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -90 -98 -98 -97 -99 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -96 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -99 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -96 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -99 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -95 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -89 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -96 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -58 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -99 -98 -97 -98 -98 -98 -99 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -96 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -99 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -96 -99 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -99 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -99 -98 -97 -98 -98 -97 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -97 -98 -98 -98 -96 -96 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -96 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -96 -97 -98 -97 -97 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -96 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -97 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -99 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -99 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -99 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -86 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -58 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -96 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -99 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -82 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -96 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -96 -98 -98 -97 -98 -98 -99 -97 -98 -97 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -99 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -96 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -97 -97 -98 -90 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -99 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -99 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -96 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -96 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -99 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -99 -98 -98 -98 -97 -55 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -96 -96 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -97 -99 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -99 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -77 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -96 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -77 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -99 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -96 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -99 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -94 -97 -97 -97 -98 -98 -97 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -96 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -97 -99 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -99 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -90 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -99 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -96 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -96 -96 -98 -98 -98 -97 -98 -97 -99 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -96 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -97 -98 -98 -98 -97 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -96 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -97 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -55 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -97 -97 -98 -99 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -96 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -96 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -96 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -80 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -76 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -96 -98 -97 -98 -97 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -96 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -96 -97 -96 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -99 -98 -98 -99 -97 -89 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -97 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -97 -97 -98 -98 -96 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -87 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -54 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -99 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -96 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -99 -98 -96 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -96 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -97 -97 -92 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -97 -97 -75 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -82 -98 -98 -97 -98 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -93 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -96 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -96 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -99 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -98 -97 -96 -98 -98 -97 -98 -97 -98 -98 -99 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -96 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -99 -98 -99 -96 -96 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -97 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -54 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -96 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -97 -98 -99 -97 -97 -96 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -99 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -99 -81 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -76 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -99 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -96 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -99 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -54 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -94 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -78 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -89 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -99 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -99 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -99 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -99 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -94 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -99 -97 -99 -99 -98 -99 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -99 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -99 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -97 -98 -98 -97 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -99 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -99 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -96 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -96 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -96 -97 -98 -97 -98 -97 -97 -98 -98 -99 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -96 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -96 -96 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -96 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -99 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -91 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -90 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -96 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -96 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -97 -100 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -96 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -96 -98 -96 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -99 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -96 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -97 -99 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -97 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -96 -96 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -76 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -59 -96 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -98 -97 -96 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -96 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -96 -96 -98 -97 -98 -98 -97 -97 -97 -97 -98 -99 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -99 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -96 -96 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -96 -96 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -96 -97 -98 -99 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -99 -98 -99 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -97 -97 -99 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -96 -98 -98 -99 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -97 -98 -97 -97 -98 -98 -96 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -96 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -96 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -91 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -76 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -76 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -96 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -54 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -96 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -96 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -96 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -96 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -99 -97 -98 -98 -96 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -82 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -96 -98 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -97 -98 -98 -98 -88 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -94 -96 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -96 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -96 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -97 -98 -97 -98 -96 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -99 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -99 -98 -97 -99 -97 -97 -96 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -98 -98 -99 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -96 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -91 -97 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -96 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -97 -98 -98 -97 -99 -98 -97 -98 -99 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -94 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -96 -96 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -99 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -98 -98 -98 -97 -98 -96 -96 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -54 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -96 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -96 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -96 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -97 -96 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -96 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -97 -91 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -97 -98 -97 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -97 -91 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -91 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -99 -97 -98 -99 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -96 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -99 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -90 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -97 -98 -98 -98 -96 -97 -92 -96 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -97 -99 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -96 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -76 -98 -98 -98 -97 -98 -98 -97 -96 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -96 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -76 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -96 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -96 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -89 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -99 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -89 -98 -99 -97 -97 -98 -98 -98 -97 -98 -92 -93 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -99 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -96 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -96 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -54 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -96 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -99 -97 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -96 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -90 -98 -98 -98 -98 -96 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -92 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -95 -98 -98 -98 -98 -97 -98 -98 -97 -98 -96 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -97 -97 -97 -96 -97 -98 -99 -97 -97 -98 -97 -98 -97 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -97 -98 -97 -96 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -96 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -93 -98 -97 -97 -98 -97 -98 -99 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -96 -96 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -99 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -96 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -96 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -99 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -94 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -54 -98 -97 -98 -97 -98 -98 -98 -99 -97 -97 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -99 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -96 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -97 -94 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -99 -98 -98 -98 -98 -97 -99 -80 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -81 -96 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -99 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -96 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -99 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -96 -97 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -55 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -97 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -76 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -97 -97 -98 -97 -98 -98 -97 -99 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -89 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -99 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -99 -98 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -92 -97 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -96 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -96 -97 -98 -98 -97 -98 -99 -98 -97 -98 -97 -98 -98 -98 -97 -98 -99 -97 -98 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -90 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -75 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -96 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -99 -98 -97 -98 -97 -97 -54 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -94 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -96 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -96 -96 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -96 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -99 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -96 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -99 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -96 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -96 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -96 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -96 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -99 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -88 -97 -98 -82 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -97 -97 -96 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -99 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -96 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -96 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -99 -98 -97 -98 -97 -98 -96 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -96 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -96 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -99 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -99 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -97 -98 -98 -97 -89 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -99 -97 -97 -97 -97 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -99 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -96 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -99 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -101 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -96 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -96 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -96 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -55 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -96 -98 -98 -98 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -96 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -99 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -96 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -96 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -96 -96 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -99 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -96 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -99 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -89 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -96 -98 -98 -98 -98 -90 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -99 -97 -99 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -99 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -54 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -96 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -99 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -86 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -97 -97 -76 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -96 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -97 -96 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -99 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -78 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -96 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -95 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -94 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -96 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -99 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -96 -93 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -96 -98 -98 -97 -98 -97 -98 -97 -96 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -59 -98 -97 -98 -98 -98 -99 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -96 -96 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -96 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -96 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -97 -98 -99 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -89 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -96 -96 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -81 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -95 -97 -98 -98 -96 -96 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -99 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -99 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -99 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -93 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -99 -98 -98 -76 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -84 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -59 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -99 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -96 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -96 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -88 -98 -97 -96 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -89 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -96 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -91 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -96 -98 -97 -98 -98 -98 -99 -98 -98 -97 -97 -98 -99 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -96 -97 -97 -99 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -96 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -96 -98 -97 -98 -97 -97 -78 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -89 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -97 -88 -97 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -96 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -96 -89 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -99 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -96 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -97 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -54 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -96 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -79 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -96 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -96 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -96 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -99 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -93 -98 -98 -96 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -89 -90 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -96 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -99 -96 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -88 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -99 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -96 -98 -98 -97 -98 -98 -54 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -96 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -96 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -89 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -96 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -99 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -96 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -72 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -96 -98 -98 -98 -97 -98 -98 -97 -98 -97 -91 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -97 -98 -97 -97 -97 -98 -101 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -99 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -99 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -88 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -55 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -99 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -99 -98 -96 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -96 -96 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -99 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -97 -98 -96 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -97 -97 -96 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -99 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -83 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -99 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -99 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -94 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -99 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -99 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -97 -98 -98 -97 -97 -98 -89 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -99 -97 -98 -98 -98 -97 -98 -98 -98 -95 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -99 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -92 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -100 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -96 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -59 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -99 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -75 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -92 -99 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -99 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -99 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -99 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -94 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -90 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -99 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -58 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -96 -96 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -99 -96 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -96 -96 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -97 -97 -97 -97 -98 -97 -98 -99 -98 -97 -96 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -96 -96 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -96 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -96 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -99 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -57 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -91 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -96 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -99 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -91 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -99 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -90 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -58 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -99 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -96 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -99 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -59 -98 -99 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -92 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -99 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -88 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -96 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -96 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -96 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -54 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -99 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -76 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -89 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -101 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -100 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -58 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -75 -98 -98 -99 -98 -97 -99 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -99 -97 -97 -98 -97 -98 -97 -98 -98 -97 -99 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -99 -97 -97 -98 -97 -96 -96 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -93 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -91 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -97 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -99 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -88 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -99 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -54 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -99 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -100 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -97 -91 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -99 -94 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -96 -99 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -96 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -99 -97 -98 -97 -97 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -96 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -99 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -100 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -58 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -96 -98 -98 -97 -98 -98 -98 -98 -98 -99 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -96 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -89 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -99 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -99 -97 -98 -98 -96 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -99 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -87 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -99 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -99 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -54 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -88 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -99 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -99 -97 -98 -98 -96 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -99 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -75 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -99 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -55 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -99 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -99 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -88 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -99 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -83 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -89 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -96 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -89 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -92 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -99 -98 -97 -97 -98 -98 -98 -99 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -89 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -82 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -100 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -99 -99 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -76 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -55 -99 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -88 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -99 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -79 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -99 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -99 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -99 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -54 -98 -99 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -99 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -99 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -88 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -76 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -99 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -99 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -90 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -99 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -55 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -83 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -76 -98 -98 -97 -99 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -99 -99 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -89 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -99 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -99 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -97 -98 -90 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -99 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -96 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -99 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -99 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -96 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -93 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -99 -99 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -76 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -99 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -76 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -99 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -96 -98 -98 -97 -97 -97 -97 -98 -97 -97 -99 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -88 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -99 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -97 -92 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -83 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -99 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -99 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -88 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -76 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -99 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -96 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -99 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -93 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -99 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -77 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -96 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -77 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -100 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -99 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -90 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -60 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -99 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -99 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -75 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -89 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -89 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -89 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -99 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -55 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -99 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -93 -94 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -99 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -89 -98 -98 -98 -98 -97 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -99 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -99 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -76 -97 -97 -97 -98 -97 -99 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -99 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -97 -97 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -99 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -100 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -97 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -82 -98 -96 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -83 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -89 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -99 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -99 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -77 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -75 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -99 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -100 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -80 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -76 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -93 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -99 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -89 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -88 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -87 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -96 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -99 -97 -98 -96 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -96 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -97 -96 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -96 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -54 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -96 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -96 -96 -98 -97 -99 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -96 -98 -98 -98 -98 -99 -98 -97 -98 -97 -98 -96 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -96 -97 -97 -98 -97 -96 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -96 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -97 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -96 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -96 -96 -97 -98 -97 -98 -97 -97 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -97 -97 -97 -97 -97 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -96 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -96 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -96 -96 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -96 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -99 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -96 -96 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -96 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -96 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -96 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -96 -98 -98 -97 -97 -96 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -99 -98 -98 -96 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -99 -98 -96 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -96 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -99 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -96 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -96 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -96 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -96 -97 -98 -98 -97 -98 -98 -98 -97 -97 -99 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -99 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -99 -96 -98 -97 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -97 -98 -86 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -96 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -96 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -96 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -96 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -99 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -99 -98 -97 -97 -99 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -99 -97 -98 -97 -97 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -96 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -96 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -96 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -99 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -99 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -96 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -99 -98 -98 -98 -97 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -55 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -99 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -96 -97 -97 -96 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -99 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -96 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -96 -97 -96 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -99 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -92 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -96 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -96 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -88 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -75 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -96 -97 -98 -99 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -100 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -96 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -96 -96 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -96 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -96 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -96 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -97 -97 -97 -96 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -55 -98 -98 -98 -98 -98 -99 -96 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -96 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -93 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -96 -97 -98 -98 -97 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -96 -98 -97 -97 -98 -98 -98 -97 -98 -99 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -97 -98 -97 -98 -98 -98 -99 -97 -98 -97 -97 -97 -96 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -96 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -96 -97 -98 -99 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -96 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -96 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -96 -98 -97 -98 -98 -98 -97 -97 -98 -98 -92 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -96 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -96 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -96 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -96 -96 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -99 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -96 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -96 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -94 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -99 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -99 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -96 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -96 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -99 -98 -98 -97 -98 -98 -97 -96 -97 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -59 -98 -97 -97 -98 -90 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -101 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -76 -98 -97 -98 -98 -97 -98 -98 -98 -96 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -96 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -99 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -96 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -96 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -99 -98 -99 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -96 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -99 -98 -98 -97 -98 -97 -98 -96 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -92 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -99 -97 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -96 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -99 -96 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -96 -96 -99 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -96 -96 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -96 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -100 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -91 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -98 -97 -98 -97 -98 -99 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -82 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -96 -96 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -96 -98 -98 -98 -97 -98 -94 -97 -98 -99 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -96 -96 -98 -98 -98 -97 -99 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -96 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -99 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -96 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -99 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -99 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -96 -97 -98 -98 -97 -97 -98 -98 -98 -54 -98 -97 -98 -97 -98 -99 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -99 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -91 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -99 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -99 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -96 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -96 -96 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -96 -97 -97 -97 -97 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -99 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -99 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -97 -97 -98 -98 -97 -97 -97 -90 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -96 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -92 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -91 -96 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -75 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -96 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -99 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -99 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -98 -92 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -89 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -99 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -96 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -99 -98 -91 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -96 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -96 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -99 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -96 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -96 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -96 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -96 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -95 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -96 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -96 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -99 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -99 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -96 -98 -97 -98 -98 -97 -99 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -96 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -96 -96 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -96 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -96 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -75 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -96 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -77 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -90 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -96 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -96 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -96 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -99 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -92 -96 -94 -98 -93 -96 -94 -97 -97 -93 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -96 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -99 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -96 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -96 -98 -97 -96 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -96 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -96 -98 -98 -98 -98 -96 -97 -97 -97 -97 -96 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -91 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -100 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -90 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -83 -98 -97 -97 -97 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -99 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -76 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -97 -98 -97 -97 -99 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -92 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -99 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -95 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -90 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -99 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -99 -97 -98 -98 -98 -98 -99 -98 -97 -98 -91 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -99 -97 -98 -98 -98 -97 -97 -98 -97 -99 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -95 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -55 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -100 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -99 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -99 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -99 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -99 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -90 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -94 -98 -99 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -99 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -96 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -86 -97 -98 -97 -98 -98 -100 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -96 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -101 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -99 -98 -97 -98 -96 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -89 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -96 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -96 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -96 -97 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -96 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -100 -96 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -78 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -96 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -96 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -96 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -96 -98 -97 -97 -97 -96 -84 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -99 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -55 -97 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -96 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -94 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -97 -96 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -96 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -99 -96 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -96 -97 -99 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -96 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -97 -97 -96 -96 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -96 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -96 -97 -97 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -96 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -99 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -96 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -99 -98 -97 -97 -97 -98 -98 -98 -97 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -100 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -96 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -58 -98 -98 -98 -98 -98 -97 -98 -97 -96 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -96 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -96 -96 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -96 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -77 -98 -98 -97 -96 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -96 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -96 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -96 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -99 -98 -97 -97 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -99 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -93 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -96 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -96 -96 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -99 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -99 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -96 -98 -97 -97 -98 -98 -79 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -99 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -58 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -96 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -99 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -96 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -96 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -80 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -90 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -96 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -99 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -99 -98 -97 -98 -96 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -89 -98 -97 -97 -98 -97 -98 -97 -99 -97 -96 -98 -98 -98 -97 -98 -98 -98 -97 -96 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -99 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -89 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -99 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -99 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -91 -97 -98 -97 -98 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -99 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -99 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -58 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -83 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -99 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -100 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -76 -98 -98 -97 -97 -97 -97 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -99 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -96 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -99 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -97 -98 -58 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -95 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -77 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -99 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -89 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -99 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -92 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -99 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -99 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -58 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -99 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -96 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -91 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -90 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -87 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -99 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -58 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -99 -97 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -96 -98 -97 -97 -98 -99 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -99 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -99 -98 -97 -97 -98 -98 -98 -97 -98 -99 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -99 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -96 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -89 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -96 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -98 -99 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -99 -97 -97 -98 -97 -98 -98 -98 -97 -98 -96 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -91 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -58 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -92 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -99 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -99 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -96 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -90 -97 -98 -97 -96 -97 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -99 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -75 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -99 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -96 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -99 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -99 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -99 -97 -96 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -97 -98 -97 -96 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -99 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -91 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -96 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -96 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -99 -96 -96 -98 -98 -97 -99 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -56 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -96 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -77 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -96 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -99 -97 -97 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -99 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -96 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -96 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -99 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -96 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -89 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -96 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -99 -98 -98 -98 -97 -97 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -99 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -96 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -96 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -99 -97 -99 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -87 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -99 -98 -98 -98 -97 -97 -99 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -96 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -96 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -96 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -77 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -58 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -99 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -96 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -96 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -96 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -99 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -77 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -96 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -90 -98 -98 -98 -97 -97 -97 -97 -99 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -96 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -99 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -99 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -99 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -96 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -94 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -93 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -96 -96 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -96 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -81 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -58 -97 -97 -96 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -96 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -97 -98 -97 -96 -97 -97 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -96 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -96 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -99 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -87 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -96 -97 -98 -97 -98 -98 -98 -98 -97 -99 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -96 -98 -97 -98 -98 -98 -83 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -96 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -96 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -96 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -96 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -99 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -58 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -96 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -96 -96 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -99 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -94 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -98 -98 -99 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -96 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -96 -98 -90 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -76 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -97 -96 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -97 -98 -98 -97 -98 -99 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -96 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -58 -97 -97 -98 -96 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -96 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -99 -98 -97 -97 -90 -97 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -99 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -96 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -99 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -99 -97 -97 -98 -98 -98 -97 -97 -98 -99 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -90 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -99 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -58 -97 -98 -98 -98 -96 -97 -96 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -90 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -89 -97 -97 -99 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -96 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -82 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -96 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -99 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -99 -98 -97 -97 -97 -98 -97 -98 -97 -98 -96 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -99 -97 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -99 -98 -98 -97 -97 -99 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -76 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -99 -97 -98 -97 -98 -97 -99 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -56 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -92 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -99 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -75 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -94 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -96 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -99 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -90 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -99 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -99 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -99 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -78 -97 -98 -98 -97 -97 -97 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -99 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -91 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -90 -98 -98 -98 -93 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -99 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -94 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -99 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -99 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -90 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -56 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -99 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -99 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -99 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -99 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -92 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -96 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -93 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -99 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -77 -98 -97 -98 -98 -98 -97 -97 -97 -99 -98 -98 -97 -97 -97 -99 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -99 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -99 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -91 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -101 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -91 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -92 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -76 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -99 -97 -98 -99 -99 -99 -98 -98 -98 -99 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -100 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -78 -98 -98 -98 -97 -97 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -99 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -99 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -96 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -89 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -99 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -77 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -97 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -100 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -96 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -96 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -96 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -99 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -96 -83 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -79 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -96 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -96 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -99 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -99 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -91 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -90 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -96 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -97 -97 -98 -99 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -99 -98 -83 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -55 -98 -98 -98 -97 -97 -98 -97 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -96 -96 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -96 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -99 -98 -96 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -94 -97 -99 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -98 -97 -98 -97 -98 -76 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -96 -97 -97 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -96 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -86 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -99 -98 -98 -97 -98 -96 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -99 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -96 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -96 -96 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -89 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -55 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -96 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -90 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -99 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -92 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -96 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -91 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -81 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -96 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -96 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -96 -97 -98 -97 -99 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -58 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -99 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -96 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -99 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -96 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -96 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -76 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -96 -97 -99 -98 -98 -97 -97 -96 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -99 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -95 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -96 -97 -96 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -96 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -96 -96 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -96 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -96 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -54 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -92 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -96 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -99 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -96 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -99 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -99 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -96 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -99 -97 -96 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -96 -97 -96 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -99 -97 -97 -97 -97 -98 -98 -97 -98 -98 -96 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -96 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -97 -98 -97 -98 -97 -92 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -99 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -55 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -96 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -89 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -96 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -99 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -96 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -98 -96 -98 -98 -97 -98 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -99 -97 -97 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -96 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -91 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -96 -96 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -99 -98 -97 -98 -99 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -91 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -96 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -96 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -96 -97 -58 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -99 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -98 -98 -97 -98 -97 -99 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -96 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -96 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -96 -98 -98 -97 -97 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -96 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -80 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -99 -97 -97 -98 -98 -96 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -87 -98 -92 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -96 -97 -98 -96 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -100 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -99 -98 -96 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -96 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -96 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -96 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -89 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -96 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -96 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -96 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -77 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -96 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -96 -96 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -96 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -99 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -95 -96 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -99 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -96 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -55 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -96 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -99 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -96 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -96 -96 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -96 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -99 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -96 -97 -98 -98 -98 -97 -97 -98 -98 -98 -96 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -96 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -89 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -97 -98 -97 -98 -97 -97 -99 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -96 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -96 -97 -98 -98 -97 -97 -97 -99 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -99 -98 -98 -97 -98 -98 -96 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -96 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -96 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -99 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -90 -97 -99 -98 -98 -98 -98 -98 -97 -98 -90 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -96 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -96 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -99 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -96 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -55 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -92 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -99 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -99 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -89 -98 -96 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -99 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -99 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -99 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -96 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -96 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -99 -99 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -96 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -96 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -96 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -96 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -99 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -96 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -96 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -99 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -99 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -99 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -96 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -99 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -76 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -96 -98 -97 -98 -98 -97 -97 -97 -97 -59 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -76 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -99 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -96 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -85 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -99 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -96 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -88 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -99 -96 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -81 -98 -98 -97 -98 -97 -98 -97 -98 -96 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -92 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -96 -97 -98 -98 -97 -97 -98 -98 -98 -98 -62 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -96 -96 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -96 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -99 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -96 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -96 -97 -97 -98 -98 -99 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -96 -97 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -96 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -96 -96 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -93 -97 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -99 -98 -99 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -96 -97 -60 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -96 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -99 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -83 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -86 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -96 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -99 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -96 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -99 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -96 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -99 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -96 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -96 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -99 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -94 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -96 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -96 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -96 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -96 -98 -98 -98 -98 -90 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -96 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -97 -93 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -96 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -60 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -96 -98 -97 -97 -98 -97 -98 -97 -97 -97 -96 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -96 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -96 -98 -99 -98 -97 -99 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -96 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -96 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -91 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -97 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -89 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -86 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -89 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -87 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -58 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -76 -98 -98 -98 -98 -98 -97 -98 -99 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -99 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -96 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -96 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -99 -97 -97 -99 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -92 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -99 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -99 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -99 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -76 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -99 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -74 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -93 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -96 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -99 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -100 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -96 -97 -99 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -76 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -99 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -59 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -99 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -94 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -99 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -99 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -99 -97 -98 -97 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -88 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -99 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -82 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -55 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -87 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -99 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -99 -98 -98 -98 -97 -97 -96 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -60 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -99 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -87 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -99 -98 -98 -99 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -99 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -87 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -88 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -99 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -99 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -76 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -95 -97 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -99 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -88 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -96 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -94 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -96 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -99 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -95 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -75 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -99 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -97 -97 -97 -99 -98 -97 -98 -99 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -96 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -91 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -96 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -99 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -97 -98 -81 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -59 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -96 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -76 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -99 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -100 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -91 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -93 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -76 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -96 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -99 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -99 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -97 -98 -97 -96 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -95 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -99 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -88 -97 -98 -97 -98 -98 -97 -98 -97 -99 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -59 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -99 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -99 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -99 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -96 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -95 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -96 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -96 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -59 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -96 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -99 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -96 -97 -97 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -96 -96 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -99 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -96 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -92 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -99 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -99 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -99 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -60 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -99 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -87 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -99 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -96 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -99 -99 -87 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -96 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -99 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -101 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -80 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -99 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -92 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -96 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -96 -96 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -90 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -99 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -96 -99 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -90 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -99 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -60 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -90 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -87 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -99 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -85 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -96 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -96 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -88 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -76 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -96 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -87 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -97 -88 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -96 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -96 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -99 -98 -98 -98 -97 -98 -97 -98 -97 -97 -99 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -99 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -80 -98 -98 -97 -97 -98 -98 -98 -99 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -65 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -76 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -79 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -87 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -96 -98 -99 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -88 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -91 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -99 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -101 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -93 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -99 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -58 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -97 -97 -98 -98 -98 -98 -81 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -99 -98 -98 -98 -97 -98 -98 -99 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -97 -94 -97 -98 -98 -97 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -99 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -94 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -88 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -99 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -94 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -101 -98 -97 -98 -97 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -87 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -95 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -99 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -99 -97 -98 -98 -99 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -99 -97 -99 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -80 -97 -98 -91 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -99 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -96 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -96 -97 -96 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -76 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -96 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -96 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -96 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -99 -97 -78 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -96 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -96 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -99 -98 -97 -98 -97 -98 -97 -98 -97 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -56 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -99 -98 -97 -97 -98 -97 -98 -97 -98 -92 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -96 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -96 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -94 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -99 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -96 -96 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -94 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -96 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -99 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -96 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -97 -98 -97 -98 -98 -98 -96 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -96 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -96 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -99 -96 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -93 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -96 -98 -98 -98 -98 -98 -60 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -96 -97 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -97 -98 -97 -98 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -96 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -86 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -99 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -96 -97 -97 -99 -97 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -99 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -88 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -96 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -96 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -99 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -96 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -96 -97 -97 -98 -97 -99 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -59 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -96 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -96 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -96 -98 -98 -97 -98 -97 -98 -98 -97 -96 -97 -97 -98 -98 -96 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -96 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -96 -98 -98 -97 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -96 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -99 -97 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -99 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -99 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -96 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -99 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -96 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -97 -94 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -96 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -96 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -99 -98 -98 -98 -98 -98 -97 -97 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -96 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -96 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -96 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -96 -97 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -97 -97 -59 -97 -97 -97 -98 -96 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -96 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -91 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -99 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -99 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -96 -99 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -96 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -96 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -99 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -99 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -99 -98 -96 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -96 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -78 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -96 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -88 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -55 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -96 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -96 -97 -96 -91 -98 -97 -98 -97 -93 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -99 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -78 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -89 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -96 -97 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -99 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -100 -97 -97 -97 -97 -97 -98 -98 -97 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -95 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -96 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -96 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -93 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -99 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -96 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -99 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -96 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -85 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -96 -98 -98 -98 -98 -98 -97 -97 -98 -59 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -96 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -96 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -99 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -96 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -96 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -96 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -96 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -91 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -96 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -96 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -96 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -99 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -99 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -96 -98 -97 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -59 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -96 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -99 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -96 -96 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -97 -99 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -96 -97 -96 -98 -98 -98 -98 -97 -97 -97 -98 -99 -97 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -99 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -76 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -99 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -96 -98 -99 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -99 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -99 -98 -98 -97 -96 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -88 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -99 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -99 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -77 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -94 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -96 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -99 -98 -97 -98 -97 -98 -98 -96 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -96 -97 -98 -97 -98 -98 -98 -97 -98 -97 -99 -97 -97 -98 -97 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -96 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -59 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -96 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -99 -98 -97 -98 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -97 -98 -99 -98 -98 -97 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -99 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -97 -97 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -99 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -99 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -88 -98 -97 -97 -98 -97 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -99 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -97 -98 -97 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -94 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -97 -60 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -99 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -80 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -96 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -99 -97 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -99 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -99 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -97 -98 -97 -97 -97 -97 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -90 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -99 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -90 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -99 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -99 -98 -97 -97 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -99 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -94 -97 -97 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -96 -97 -98 -97 -97 -60 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -99 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -99 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -77 -97 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -96 -98 -97 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -97 -99 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -99 -98 -99 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -89 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -96 -97 -97 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -97 -98 -97 -99 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -97 -97 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -60 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -99 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -97 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -83 -97 -98 -98 -97 -98 -97 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -99 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -97 -98 -98 -97 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -97 -97 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -99 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -97 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -97 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -97 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -98 -98 -98 -97 -98 -97 -97 -97 -98 -97 -97 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -99 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -98 -97 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -97 -97 -98 -98 -97 -97 -97 -99 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -98 -97 -97 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -98 -98 -97 -98 -98 -99 -98 -76 -97 -98 -98 -98 -97 -97 -98 -98 -97 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -97 -92 -97 -98 -98 -97 -98 -97 -97 -97 -98 -98 -97 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -98 tinyos-2.1.2+dfsg/tos/lib/tossim/noise/meyer-heavy.txt000066400000000000000000030000531207233610700227640ustar00rootroot00000000000000-39 -98 -98 -98 -99 -98 -94 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -91 -98 -96 -96 -98 -98 -98 -98 -98 -99 -86 -97 -98 -98 -86 -90 -91 -87 -87 -98 -98 -98 -98 -98 -98 -78 -94 -90 -96 -98 -98 -98 -86 -98 -98 -98 -99 -98 -98 -98 -97 -99 -98 -98 -99 -98 -93 -98 -98 -82 -82 -81 -82 -82 -49 -98 -81 -82 -64 -81 -81 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -94 -96 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -93 -95 -99 -98 -96 -98 -99 -98 -98 -98 -98 -81 -80 -81 -81 -96 -84 -85 -98 -85 -84 -84 -78 -84 -83 -90 -90 -94 -98 -81 -81 -81 -85 -81 -81 -98 -81 -81 -98 -98 -82 -81 -82 -81 -81 -98 -82 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -87 -98 -99 -99 -98 -98 -98 -98 -98 -93 -98 -96 -98 -98 -98 -97 -97 -98 -96 -97 -98 -98 -99 -98 -99 -98 -98 -98 -96 -95 -95 -96 -98 -98 -95 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -97 -96 -98 -96 -97 -86 -84 -85 -85 -98 -98 -98 -98 -98 -98 -78 -97 -91 -91 -82 -81 -82 -81 -81 -81 -81 -79 -82 -82 -94 -97 -98 -98 -98 -98 -98 -94 -96 -98 -82 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -99 -98 -98 -86 -98 -98 -98 -98 -98 -97 -98 -99 -99 -98 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -100 -98 -98 -81 -81 -98 -81 -81 -98 -98 -98 -98 -98 -98 -98 -81 -81 -81 -96 -82 -81 -82 -81 -81 -86 -87 -98 -98 -94 -95 -81 -81 -64 -82 -80 -81 -93 -91 -92 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -95 -98 -98 -98 -98 -98 -98 -98 -97 -99 -99 -98 -99 -98 -98 -98 -98 -98 -93 -99 -98 -98 -98 -98 -94 -94 -96 -96 -94 -94 -97 -98 -96 -99 -98 -98 -99 -99 -99 -99 -99 -97 -98 -82 -81 -76 -81 -81 -42 -98 -84 -84 -96 -82 -83 -84 -81 -84 -98 -98 -80 -81 -96 -78 -95 -90 -90 -95 -97 -96 -93 -93 -96 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -95 -97 -82 -89 -98 -98 -98 -98 -99 -98 -99 -98 -97 -98 -98 -92 -98 -87 -98 -98 -98 -98 -81 -81 -77 -81 -81 -61 -99 -99 -94 -99 -81 -81 -98 -81 -82 -87 -85 -85 -63 -84 -84 -72 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -78 -96 -90 -91 -89 -90 -90 -91 -99 -96 -96 -96 -96 -96 -99 -98 -98 -98 -98 -96 -98 -94 -98 -89 -99 -98 -97 -98 -98 -96 -98 -98 -99 -96 -97 -92 -98 -98 -87 -98 -98 -98 -98 -99 -97 -98 -98 -96 -96 -98 -98 -98 -99 -93 -98 -84 -84 -98 -80 -81 -81 -81 -81 -91 -81 -80 -80 -81 -80 -81 -92 -98 -98 -97 -98 -98 -97 -98 -99 -98 -97 -98 -98 -96 -98 -98 -98 -98 -86 -94 -85 -84 -85 -86 -85 -96 -87 -96 -98 -78 -96 -91 -95 -98 -98 -98 -95 -94 -95 -98 -87 -98 -98 -98 -99 -98 -97 -80 -81 -98 -81 -80 -90 -87 -87 -96 -98 -98 -81 -81 -81 -81 -60 -91 -81 -81 -81 -81 -81 -88 -88 -88 -80 -80 -99 -98 -80 -80 -98 -84 -84 -98 -97 -98 -99 -98 -98 -97 -98 -98 -94 -95 -98 -97 -96 -98 -98 -99 -98 -98 -98 -98 -99 -97 -98 -97 -98 -98 -98 -98 -96 -98 -99 -97 -98 -98 -96 -87 -98 -97 -98 -98 -98 -98 -98 -93 -98 -78 -96 -91 -91 -91 -90 -90 -93 -91 -96 -98 -95 -95 -98 -96 -96 -96 -96 -98 -96 -98 -98 -84 -86 -98 -98 -86 -99 -98 -98 -98 -98 -98 -97 -95 -91 -83 -83 -50 -83 -83 -55 -83 -83 -87 -81 -81 -81 -88 -80 -79 -98 -98 -98 -92 -96 -96 -97 -98 -98 -98 -98 -98 -86 -84 -88 -99 -85 -98 -98 -98 -98 -98 -98 -96 -96 -98 -95 -98 -98 -98 -96 -85 -86 -98 -85 -97 -98 -98 -87 -87 -88 -87 -86 -98 -81 -81 -81 -81 -75 -98 -91 -94 -95 -98 -81 -81 -97 -81 -81 -48 -82 -81 -81 -96 -98 -81 -80 -81 -81 -58 -95 -84 -81 -99 -98 -99 -98 -99 -99 -98 -99 -98 -98 -90 -98 -98 -87 -98 -98 -98 -98 -97 -97 -97 -96 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -96 -96 -98 -98 -96 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -96 -98 -98 -97 -98 -98 -98 -96 -86 -86 -98 -98 -98 -98 -98 -99 -98 -99 -98 -79 -99 -91 -91 -91 -91 -91 -98 -95 -98 -97 -81 -81 -81 -81 -80 -52 -81 -81 -83 -81 -81 -81 -63 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -93 -84 -97 -97 -99 -98 -96 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -96 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -98 -81 -80 -81 -81 -81 -68 -98 -97 -91 -81 -81 -81 -81 -67 -81 -81 -98 -98 -97 -84 -86 -80 -80 -79 -84 -84 -98 -84 -84 -47 -95 -90 -90 -97 -99 -98 -98 -98 -98 -84 -97 -92 -87 -98 -98 -98 -98 -98 -98 -98 -99 -99 -99 -98 -98 -98 -98 -98 -96 -98 -99 -98 -98 -98 -91 -98 -97 -99 -98 -98 -99 -98 -98 -95 -97 -90 -98 -96 -98 -98 -98 -98 -97 -98 -98 -96 -98 -99 -98 -99 -98 -84 -84 -72 -81 -84 -98 -81 -81 -99 -81 -81 -75 -81 -76 -64 -91 -93 -90 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -94 -98 -98 -98 -98 -98 -98 -99 -84 -98 -98 -98 -91 -98 -98 -98 -87 -98 -87 -99 -98 -99 -98 -81 -81 -98 -81 -81 -44 -98 -99 -81 -81 -98 -81 -81 -81 -81 -81 -55 -98 -98 -98 -98 -98 -81 -81 -98 -81 -81 -43 -96 -98 -99 -98 -98 -98 -98 -96 -99 -95 -99 -98 -84 -98 -98 -86 -92 -96 -87 -98 -98 -98 -98 -98 -98 -98 -78 -97 -91 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -94 -81 -82 -82 -96 -96 -98 -99 -99 -98 -99 -98 -98 -93 -98 -97 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -97 -96 -96 -93 -99 -98 -84 -81 -81 -81 -81 -40 -98 -98 -98 -98 -98 -98 -81 -81 -98 -81 -81 -99 -94 -98 -98 -96 -98 -96 -98 -98 -98 -99 -99 -97 -86 -93 -98 -99 -98 -98 -98 -98 -98 -98 -78 -98 -94 -91 -88 -91 -91 -91 -98 -98 -96 -96 -98 -98 -98 -99 -98 -98 -98 -80 -81 -96 -98 -90 -88 -81 -81 -99 -98 -98 -98 -98 -81 -80 -92 -80 -81 -54 -80 -81 -98 -81 -81 -81 -81 -74 -98 -96 -97 -98 -98 -98 -98 -96 -97 -95 -99 -98 -98 -98 -99 -98 -96 -96 -97 -97 -95 -95 -95 -95 -97 -97 -96 -97 -95 -98 -97 -99 -98 -99 -95 -98 -97 -98 -98 -98 -98 -98 -98 -86 -86 -87 -88 -88 -91 -98 -98 -98 -98 -96 -98 -91 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -96 -95 -98 -98 -99 -98 -93 -81 -99 -81 -98 -98 -98 -90 -88 -88 -98 -98 -98 -80 -81 -40 -82 -80 -81 -98 -98 -98 -99 -98 -93 -97 -81 -81 -99 -84 -84 -68 -84 -84 -95 -96 -72 -93 -94 -99 -98 -98 -98 -98 -98 -98 -98 -96 -98 -99 -98 -98 -98 -98 -98 -95 -97 -98 -93 -93 -93 -95 -93 -93 -98 -95 -94 -86 -88 -96 -95 -96 -84 -83 -83 -84 -67 -98 -80 -98 -91 -90 -91 -91 -92 -93 -96 -98 -94 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -92 -93 -98 -84 -84 -94 -80 -81 -81 -80 -69 -81 -81 -93 -80 -81 -70 -81 -81 -99 -98 -98 -97 -95 -98 -97 -95 -96 -94 -98 -99 -98 -98 -95 -96 -98 -96 -98 -86 -98 -98 -98 -85 -87 -88 -88 -84 -90 -97 -95 -95 -98 -96 -78 -88 -91 -98 -93 -98 -98 -81 -81 -43 -98 -85 -80 -81 -71 -96 -98 -98 -91 -88 -96 -96 -95 -81 -98 -81 -98 -99 -81 -81 -81 -81 -81 -95 -92 -98 -99 -98 -86 -98 -98 -98 -99 -94 -94 -97 -97 -93 -98 -99 -97 -95 -97 -92 -97 -95 -96 -97 -98 -97 -98 -98 -93 -96 -98 -98 -96 -98 -81 -81 -98 -81 -81 -40 -99 -98 -98 -98 -98 -98 -96 -97 -98 -97 -98 -99 -98 -98 -86 -98 -98 -98 -98 -98 -98 -95 -98 -98 -86 -96 -87 -86 -91 -81 -81 -92 -91 -91 -84 -84 -98 -83 -83 -35 -84 -84 -85 -84 -81 -84 -85 -84 -84 -84 -80 -98 -54 -85 -66 -98 -99 -96 -96 -98 -98 -91 -93 -97 -97 -98 -86 -84 -84 -96 -87 -98 -98 -98 -99 -98 -98 -98 -93 -96 -96 -93 -97 -88 -84 -84 -96 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -99 -97 -98 -98 -84 -94 -85 -95 -96 -84 -98 -83 -51 -93 -85 -85 -85 -90 -99 -98 -99 -98 -98 -98 -78 -98 -92 -88 -83 -84 -84 -99 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -98 -93 -99 -98 -99 -98 -98 -98 -98 -96 -96 -96 -96 -91 -98 -87 -98 -98 -97 -98 -98 -84 -66 -84 -98 -98 -99 -98 -99 -98 -92 -94 -96 -98 -97 -93 -98 -98 -98 -98 -98 -98 -99 -94 -98 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -96 -98 -96 -87 -87 -84 -49 -84 -93 -98 -99 -84 -84 -84 -77 -88 -91 -91 -91 -91 -93 -81 -98 -98 -98 -93 -98 -96 -93 -96 -99 -98 -98 -98 -98 -91 -81 -93 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -92 -97 -98 -87 -86 -99 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -96 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -83 -98 -98 -89 -97 -98 -99 -95 -96 -81 -38 -81 -87 -81 -49 -81 -81 -88 -89 -85 -85 -98 -98 -98 -96 -96 -87 -96 -94 -91 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -81 -80 -56 -98 -93 -81 -84 -96 -98 -98 -98 -98 -98 -96 -98 -96 -96 -91 -98 -98 -98 -98 -97 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -99 -98 -98 -96 -98 -98 -99 -98 -98 -99 -98 -97 -98 -81 -92 -81 -81 -70 -98 -96 -81 -71 -82 -81 -98 -84 -98 -99 -99 -94 -97 -98 -98 -98 -98 -98 -98 -97 -85 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -96 -98 -93 -98 -98 -98 -98 -98 -93 -97 -98 -97 -87 -98 -98 -97 -98 -98 -97 -97 -98 -97 -98 -99 -97 -98 -98 -97 -84 -84 -98 -98 -81 -96 -81 -82 -81 -97 -98 -98 -99 -96 -90 -88 -96 -93 -87 -98 -93 -85 -95 -86 -84 -84 -95 -85 -96 -96 -96 -96 -96 -97 -95 -80 -86 -82 -96 -84 -85 -85 -84 -84 -85 -85 -78 -86 -87 -86 -88 -87 -87 -83 -88 -88 -89 -88 -87 -88 -91 -93 -96 -83 -83 -53 -83 -92 -84 -99 -89 -98 -99 -98 -83 -96 -96 -98 -98 -89 -98 -98 -96 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -92 -99 -96 -98 -88 -84 -98 -84 -84 -75 -83 -54 -84 -84 -84 -95 -98 -99 -98 -98 -98 -98 -98 -98 -97 -97 -91 -94 -98 -98 -99 -98 -98 -93 -96 -86 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -96 -92 -91 -91 -91 -91 -91 -91 -92 -91 -91 -92 -91 -90 -91 -91 -92 -92 -91 -92 -91 -91 -91 -91 -92 -95 -84 -97 -83 -89 -83 -90 -96 -84 -73 -98 -84 -96 -99 -98 -98 -98 -98 -97 -99 -98 -98 -96 -96 -96 -94 -96 -98 -90 -96 -87 -96 -98 -93 -95 -87 -95 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -95 -98 -98 -84 -93 -98 -97 -84 -84 -85 -85 -86 -85 -84 -81 -87 -79 -78 -98 -91 -91 -85 -82 -83 -74 -97 -98 -98 -95 -99 -96 -96 -96 -98 -96 -98 -98 -98 -94 -98 -94 -99 -91 -99 -91 -84 -99 -98 -94 -98 -98 -84 -95 -84 -98 -80 -78 -81 -94 -81 -70 -98 -88 -84 -98 -84 -75 -98 -98 -97 -96 -98 -97 -96 -96 -97 -95 -96 -95 -98 -96 -96 -98 -95 -95 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -98 -92 -98 -96 -86 -96 -97 -97 -98 -95 -85 -96 -97 -96 -77 -96 -98 -85 -84 -67 -67 -83 -58 -83 -76 -91 -91 -50 -93 -91 -91 -98 -84 -96 -98 -95 -91 -95 -96 -98 -98 -98 -98 -98 -98 -98 -98 -97 -93 -97 -97 -98 -87 -97 -97 -97 -97 -96 -97 -98 -97 -97 -97 -97 -98 -97 -95 -92 -96 -96 -97 -99 -98 -97 -98 -97 -98 -97 -92 -95 -91 -95 -97 -98 -95 -98 -97 -97 -98 -98 -98 -84 -84 -55 -87 -87 -86 -98 -76 -91 -92 -98 -79 -90 -87 -87 -98 -88 -96 -98 -95 -90 -97 -94 -96 -96 -91 -91 -94 -95 -91 -92 -98 -96 -84 -84 -98 -98 -98 -99 -84 -84 -98 -84 -89 -84 -98 -86 -84 -98 -94 -92 -98 -94 -96 -98 -98 -93 -98 -97 -98 -99 -98 -93 -96 -96 -98 -98 -97 -98 -99 -98 -98 -99 -96 -98 -98 -83 -84 -96 -95 -98 -98 -96 -97 -98 -97 -85 -98 -98 -98 -98 -98 -95 -95 -97 -97 -77 -81 -80 -85 -91 -84 -86 -87 -90 -83 -88 -84 -96 -98 -98 -99 -88 -98 -98 -98 -98 -86 -84 -84 -97 -97 -97 -92 -98 -98 -96 -96 -98 -98 -92 -98 -98 -98 -87 -96 -97 -84 -85 -88 -96 -84 -98 -88 -96 -98 -84 -100 -84 -45 -96 -98 -98 -81 -98 -99 -96 -84 -85 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -97 -96 -98 -84 -98 -84 -35 -98 -98 -86 -82 -93 -89 -81 -84 -78 -84 -84 -66 -93 -81 -96 -91 -97 -81 -42 -98 -98 -96 -92 -93 -94 -94 -96 -94 -96 -97 -96 -96 -96 -96 -92 -89 -81 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -90 -98 -98 -98 -93 -86 -93 -95 -96 -95 -98 -98 -98 -98 -99 -98 -98 -81 -82 -93 -81 -98 -95 -99 -99 -98 -98 -93 -93 -98 -99 -97 -99 -96 -98 -98 -98 -98 -98 -98 -97 -98 -96 -98 -98 -98 -96 -81 -98 -80 -71 -99 -98 -97 -87 -92 -98 -97 -98 -98 -98 -98 -98 -98 -78 -98 -91 -91 -90 -93 -91 -91 -92 -97 -92 -93 -95 -97 -96 -96 -98 -98 -98 -98 -98 -93 -98 -82 -98 -98 -98 -92 -99 -81 -91 -84 -71 -83 -92 -91 -98 -98 -87 -93 -98 -98 -95 -95 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -92 -99 -84 -98 -82 -81 -80 -70 -98 -87 -97 -92 -93 -98 -89 -81 -81 -70 -98 -84 -98 -89 -84 -80 -67 -80 -76 -96 -98 -96 -99 -99 -98 -97 -97 -85 -86 -96 -87 -87 -88 -93 -88 -86 -98 -87 -87 -95 -78 -95 -95 -95 -94 -97 -94 -97 -95 -96 -97 -98 -96 -95 -95 -97 -98 -95 -94 -99 -98 -88 -98 -82 -87 -81 -92 -81 -47 -93 -81 -98 -99 -91 -98 -87 -98 -98 -98 -99 -99 -98 -98 -98 -99 -98 -98 -98 -98 -92 -92 -97 -81 -95 -96 -99 -84 -84 -44 -98 -98 -99 -98 -98 -93 -93 -98 -96 -98 -98 -98 -98 -98 -97 -99 -98 -96 -96 -98 -97 -96 -92 -99 -95 -95 -86 -88 -98 -98 -99 -98 -99 -98 -98 -97 -78 -96 -95 -91 -91 -91 -91 -91 -93 -91 -85 -84 -48 -96 -97 -96 -98 -97 -98 -98 -98 -99 -93 -85 -98 -98 -98 -99 -98 -98 -98 -98 -85 -89 -97 -92 -92 -92 -89 -97 -98 -98 -85 -83 -85 -98 -98 -92 -97 -93 -84 -85 -98 -98 -93 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -96 -96 -101 -90 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -96 -95 -93 -97 -86 -92 -98 -98 -96 -99 -93 -95 -96 -85 -96 -84 -94 -98 -98 -87 -99 -98 -99 -98 -98 -98 -97 -96 -96 -98 -98 -98 -98 -98 -96 -87 -99 -98 -98 -98 -98 -97 -98 -98 -98 -93 -93 -95 -97 -96 -99 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -96 -85 -86 -85 -98 -97 -97 -93 -86 -87 -98 -98 -98 -98 -98 -99 -99 -98 -98 -96 -96 -91 -91 -91 -92 -91 -98 -85 -85 -81 -98 -98 -98 -98 -85 -95 -84 -90 -98 -98 -94 -87 -93 -85 -98 -81 -98 -81 -98 -98 -98 -98 -98 -91 -98 -98 -98 -95 -98 -98 -98 -99 -97 -98 -98 -98 -97 -99 -99 -98 -99 -98 -93 -98 -98 -98 -98 -99 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -85 -81 -81 -90 -93 -87 -87 -88 -95 -98 -96 -98 -87 -86 -87 -87 -88 -86 -91 -88 -97 -98 -78 -97 -91 -87 -88 -89 -81 -99 -81 -98 -98 -98 -98 -98 -98 -99 -98 -98 -95 -97 -98 -96 -96 -81 -82 -85 -84 -89 -96 -98 -98 -98 -98 -98 -99 -91 -98 -97 -90 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -82 -81 -81 -98 -85 -98 -98 -99 -98 -98 -98 -98 -99 -99 -98 -92 -96 -98 -98 -97 -98 -98 -98 -96 -96 -96 -85 -98 -96 -96 -96 -98 -98 -85 -63 -96 -95 -96 -85 -95 -96 -97 -98 -98 -77 -94 -84 -37 -95 -92 -92 -91 -94 -96 -81 -92 -98 -97 -92 -99 -85 -47 -96 -96 -96 -97 -94 -85 -98 -98 -99 -97 -98 -96 -98 -98 -97 -98 -93 -99 -97 -98 -86 -95 -98 -99 -98 -98 -98 -98 -99 -97 -99 -98 -84 -85 -96 -89 -88 -95 -83 -97 -87 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -88 -91 -87 -98 -98 -85 -54 -85 -93 -92 -92 -98 -98 -98 -98 -93 -86 -86 -88 -87 -96 -89 -98 -98 -97 -98 -96 -83 -96 -90 -98 -98 -97 -96 -96 -96 -98 -96 -95 -94 -95 -96 -96 -96 -97 -96 -97 -98 -94 -87 -87 -93 -98 -92 -92 -92 -92 -93 -98 -95 -95 -95 -95 -95 -91 -88 -98 -99 -98 -98 -97 -98 -97 -98 -82 -87 -95 -98 -80 -87 -97 -86 -98 -98 -98 -81 -59 -81 -90 -81 -82 -79 -81 -98 -99 -90 -87 -85 -99 -87 -81 -84 -84 -94 -81 -96 -81 -86 -85 -95 -97 -99 -98 -91 -98 -86 -97 -84 -90 -85 -85 -98 -97 -98 -95 -82 -94 -94 -92 -92 -93 -92 -92 -91 -90 -85 -98 -85 -97 -98 -93 -95 -98 -98 -98 -98 -97 -93 -87 -86 -85 -85 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -96 -95 -90 -97 -98 -98 -98 -96 -98 -98 -99 -97 -94 -96 -96 -98 -92 -87 -84 -90 -85 -85 -98 -96 -99 -98 -78 -96 -91 -95 -96 -97 -96 -98 -98 -98 -98 -98 -98 -98 -95 -96 -98 -98 -98 -98 -98 -99 -93 -92 -98 -87 -87 -98 -98 -98 -98 -98 -85 -85 -45 -98 -98 -85 -86 -95 -86 -75 -97 -81 -97 -86 -61 -81 -82 -87 -98 -98 -98 -82 -73 -82 -98 -87 -87 -98 -98 -82 -98 -98 -98 -98 -96 -95 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -98 -98 -97 -88 -88 -99 -98 -99 -98 -98 -98 -81 -70 -85 -81 -96 -91 -91 -91 -92 -91 -91 -92 -89 -98 -86 -99 -99 -98 -98 -98 -98 -98 -98 -98 -92 -86 -86 -98 -90 -81 -82 -92 -98 -98 -98 -98 -96 -95 -91 -98 -98 -96 -98 -98 -98 -98 -97 -95 -98 -98 -98 -98 -98 -98 -98 -96 -96 -96 -92 -99 -98 -98 -98 -98 -97 -99 -97 -98 -99 -98 -98 -98 -96 -96 -95 -96 -98 -98 -98 -97 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -97 -88 -87 -88 -87 -95 -99 -98 -98 -98 -98 -83 -97 -91 -91 -98 -95 -98 -98 -98 -98 -98 -81 -59 -85 -81 -87 -85 -99 -98 -98 -98 -91 -94 -81 -88 -98 -83 -72 -81 -81 -82 -38 -82 -96 -81 -90 -82 -98 -81 -53 -97 -99 -98 -98 -97 -98 -99 -99 -98 -98 -98 -96 -98 -95 -96 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -81 -96 -82 -80 -98 -99 -98 -97 -98 -98 -98 -95 -98 -98 -98 -98 -99 -98 -98 -97 -86 -98 -98 -98 -98 -98 -98 -98 -98 -82 -77 -81 -91 -94 -92 -90 -98 -96 -91 -85 -96 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -93 -89 -98 -98 -98 -99 -98 -98 -96 -98 -95 -100 -98 -92 -99 -98 -98 -86 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -99 -98 -99 -98 -98 -98 -97 -98 -98 -96 -94 -97 -84 -95 -85 -95 -96 -81 -85 -92 -85 -85 -97 -98 -97 -98 -98 -98 -99 -94 -94 -81 -92 -98 -84 -90 -84 -99 -84 -98 -85 -85 -35 -99 -99 -99 -98 -99 -98 -98 -94 -85 -98 -98 -96 -95 -97 -96 -97 -94 -95 -96 -96 -90 -97 -99 -98 -91 -98 -96 -95 -98 -84 -98 -88 -81 -95 -81 -92 -99 -95 -98 -96 -98 -98 -96 -98 -95 -95 -98 -98 -98 -96 -99 -98 -95 -96 -99 -98 -98 -98 -99 -78 -98 -96 -91 -91 -95 -95 -99 -98 -95 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -99 -98 -98 -99 -97 -99 -98 -98 -98 -99 -98 -98 -98 -98 -86 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -92 -81 -81 -98 -93 -92 -93 -91 -88 -92 -93 -93 -85 -92 -84 -98 -85 -57 -95 -95 -95 -95 -95 -91 -95 -84 -76 -84 -95 -95 -84 -65 -84 -53 -98 -99 -85 -93 -98 -98 -98 -96 -94 -95 -98 -99 -85 -96 -91 -91 -98 -99 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -99 -99 -85 -98 -85 -74 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -94 -97 -98 -98 -87 -95 -95 -98 -99 -98 -97 -99 -98 -98 -99 -98 -98 -98 -98 -92 -86 -85 -93 -92 -95 -81 -82 -81 -98 -99 -98 -99 -98 -98 -98 -98 -93 -96 -98 -99 -98 -99 -98 -98 -98 -98 -99 -96 -99 -98 -97 -95 -98 -95 -86 -89 -98 -98 -98 -99 -98 -94 -94 -95 -98 -97 -96 -90 -90 -98 -91 -91 -98 -97 -98 -99 -98 -97 -97 -98 -91 -98 -98 -97 -98 -95 -92 -84 -97 -98 -98 -99 -98 -99 -98 -99 -98 -98 -98 -98 -88 -96 -98 -82 -86 -85 -85 -84 -98 -81 -82 -96 -81 -98 -98 -87 -98 -98 -81 -98 -81 -94 -82 -92 -85 -98 -98 -98 -85 -98 -85 -98 -92 -88 -81 -98 -98 -98 -98 -98 -94 -94 -96 -97 -98 -96 -98 -99 -96 -98 -98 -98 -96 -80 -86 -83 -88 -98 -98 -95 -97 -98 -96 -80 -98 -91 -90 -96 -97 -91 -96 -97 -96 -96 -98 -96 -98 -98 -96 -97 -96 -96 -97 -99 -94 -98 -85 -86 -86 -98 -98 -98 -86 -85 -85 -85 -85 -84 -92 -98 -84 -86 -81 -99 -96 -84 -85 -97 -98 -80 -36 -81 -99 -98 -99 -98 -97 -99 -98 -98 -84 -98 -87 -99 -98 -98 -98 -98 -99 -95 -95 -98 -98 -99 -98 -98 -98 -98 -98 -86 -89 -98 -85 -85 -98 -98 -98 -97 -99 -98 -99 -98 -84 -99 -98 -98 -99 -98 -98 -96 -96 -98 -78 -95 -90 -91 -90 -90 -91 -91 -91 -90 -91 -90 -91 -91 -90 -90 -92 -81 -81 -82 -80 -98 -84 -84 -99 -70 -81 -81 -98 -85 -84 -69 -84 -98 -91 -98 -85 -85 -75 -99 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -99 -98 -99 -96 -98 -98 -98 -98 -98 -95 -93 -95 -93 -98 -94 -96 -94 -95 -93 -94 -95 -99 -98 -98 -97 -98 -97 -97 -97 -98 -95 -98 -93 -98 -95 -98 -98 -96 -85 -86 -85 -85 -85 -85 -86 -86 -88 -86 -92 -94 -86 -84 -92 -98 -91 -92 -96 -96 -98 -85 -99 -81 -83 -82 -99 -98 -92 -94 -94 -98 -99 -98 -98 -98 -98 -98 -99 -84 -84 -63 -85 -98 -81 -98 -98 -94 -95 -96 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -96 -98 -99 -98 -98 -98 -97 -98 -97 -99 -96 -81 -98 -85 -84 -51 -98 -98 -99 -78 -97 -83 -90 -91 -90 -90 -91 -96 -81 -98 -80 -82 -86 -98 -85 -98 -97 -98 -98 -98 -92 -99 -98 -85 -98 -98 -98 -76 -84 -84 -85 -50 -84 -98 -84 -95 -98 -86 -96 -94 -93 -94 -98 -97 -98 -98 -98 -95 -95 -95 -98 -99 -94 -98 -99 -98 -94 -93 -98 -98 -95 -95 -98 -93 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -93 -98 -98 -95 -95 -94 -97 -93 -98 -98 -98 -97 -94 -86 -87 -87 -86 -86 -88 -87 -98 -98 -98 -96 -96 -91 -96 -96 -98 -84 -97 -81 -99 -84 -98 -84 -94 -81 -98 -87 -98 -98 -84 -98 -93 -84 -98 -78 -85 -99 -92 -98 -98 -85 -84 -67 -98 -91 -98 -94 -95 -87 -98 -98 -99 -99 -87 -98 -99 -98 -98 -85 -97 -98 -98 -98 -93 -98 -98 -98 -99 -96 -94 -98 -98 -96 -98 -95 -96 -95 -97 -84 -84 -88 -85 -85 -94 -88 -81 -82 -53 -95 -93 -95 -94 -95 -81 -82 -39 -94 -98 -86 -93 -95 -98 -95 -97 -95 -99 -98 -98 -97 -95 -94 -90 -90 -91 -91 -91 -91 -91 -98 -81 -81 -63 -81 -82 -98 -82 -81 -81 -82 -81 -94 -82 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -98 -99 -98 -98 -99 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -93 -98 -98 -98 -99 -99 -84 -81 -98 -97 -98 -98 -98 -98 -98 -98 -86 -98 -99 -98 -98 -99 -98 -98 -98 -98 -96 -97 -93 -95 -98 -96 -94 -95 -95 -87 -93 -87 -87 -87 -88 -99 -80 -81 -87 -90 -80 -84 -89 -96 -96 -98 -84 -96 -54 -84 -84 -81 -82 -84 -85 -83 -98 -92 -98 -85 -84 -41 -86 -83 -81 -84 -81 -84 -85 -94 -80 -81 -95 -94 -83 -98 -98 -82 -81 -60 -97 -95 -96 -96 -96 -84 -84 -92 -81 -81 -85 -84 -86 -93 -85 -97 -99 -99 -98 -98 -98 -98 -98 -86 -98 -98 -90 -96 -97 -98 -98 -98 -43 -82 -82 -82 -82 -82 -82 -81 -81 -82 -85 -82 -77 -98 -84 -84 -86 -85 -85 -85 -84 -77 -46 -85 -85 -98 -77 -84 -84 -92 -91 -92 -93 -92 -81 -81 -98 -98 -98 -98 -98 -98 -97 -98 -98 -88 -99 -93 -82 -98 -98 -91 -91 -98 -98 -98 -98 -97 -93 -98 -87 -87 -95 -98 -86 -99 -98 -98 -98 -99 -98 -98 -98 -97 -98 -88 -98 -98 -98 -93 -93 -94 -98 -98 -82 -81 -81 -98 -82 -82 -80 -97 -85 -85 -80 -80 -81 -83 -82 -39 -93 -95 -77 -84 -94 -94 -44 -98 -95 -94 -92 -93 -98 -94 -94 -96 -96 -94 -93 -96 -98 -93 -84 -87 -85 -97 -96 -97 -98 -96 -95 -95 -96 -93 -93 -92 -92 -92 -92 -94 -90 -94 -95 -93 -93 -94 -94 -92 -98 -94 -98 -91 -96 -96 -94 -84 -84 -50 -96 -84 -84 -85 -84 -97 -95 -98 -84 -85 -95 -81 -81 -88 -95 -84 -84 -97 -84 -84 -86 -84 -84 -81 -81 -97 -95 -87 -96 -96 -97 -84 -97 -84 -94 -96 -96 -96 -96 -96 -96 -78 -96 -90 -87 -91 -91 -91 -91 -91 -91 -91 -91 -91 -86 -84 -84 -84 -84 -84 -84 -83 -83 -93 -85 -91 -95 -93 -84 -43 -96 -96 -84 -96 -98 -98 -91 -96 -96 -87 -98 -96 -95 -97 -95 -96 -96 -95 -96 -95 -97 -97 -96 -97 -96 -95 -94 -96 -84 -84 -96 -91 -81 -81 -87 -95 -94 -97 -98 -83 -82 -82 -82 -81 -81 -92 -92 -85 -84 -84 -84 -43 -85 -84 -97 -99 -81 -81 -79 -96 -86 -96 -86 -86 -86 -94 -89 -96 -92 -96 -78 -96 -91 -96 -99 -97 -97 -96 -96 -97 -87 -96 -98 -97 -98 -98 -96 -85 -86 -85 -98 -92 -96 -97 -89 -82 -82 -98 -81 -81 -96 -82 -81 -35 -81 -79 -84 -81 -80 -84 -92 -95 -99 -85 -94 -96 -96 -96 -96 -96 -98 -97 -98 -95 -97 -80 -81 -92 -85 -81 -82 -37 -84 -84 -62 -96 -80 -81 -41 -97 -98 -97 -99 -98 -94 -93 -94 -95 -86 -85 -94 -95 -97 -94 -98 -97 -96 -94 -85 -95 -96 -97 -98 -98 -98 -97 -96 -81 -80 -43 -81 -82 -91 -94 -91 -91 -91 -90 -91 -91 -90 -91 -96 -95 -84 -84 -98 -96 -98 -96 -92 -84 -98 -99 -97 -99 -95 -97 -97 -98 -98 -96 -96 -91 -97 -92 -96 -94 -96 -96 -93 -95 -96 -95 -86 -97 -96 -96 -96 -84 -82 -75 -93 -84 -84 -96 -97 -84 -84 -34 -84 -84 -96 -96 -95 -98 -96 -94 -96 -96 -96 -96 -98 -97 -96 -96 -96 -98 -94 -98 -97 -96 -95 -97 -94 -98 -94 -85 -93 -85 -86 -86 -87 -96 -86 -86 -87 -78 -87 -91 -90 -96 -97 -96 -96 -98 -97 -83 -84 -98 -84 -84 -93 -84 -84 -34 -96 -98 -94 -98 -84 -91 -96 -96 -96 -98 -96 -96 -96 -96 -99 -97 -90 -84 -84 -82 -84 -84 -94 -99 -96 -95 -96 -96 -96 -95 -97 -98 -96 -96 -92 -96 -96 -95 -95 -98 -96 -96 -97 -98 -97 -98 -98 -97 -96 -96 -96 -96 -98 -98 -93 -96 -93 -95 -97 -91 -95 -93 -96 -97 -97 -94 -96 -96 -96 -83 -82 -73 -92 -93 -84 -84 -66 -96 -96 -96 -98 -96 -81 -66 -81 -81 -94 -81 -81 -66 -81 -81 -82 -96 -86 -96 -96 -94 -93 -95 -96 -97 -95 -94 -97 -95 -98 -96 -96 -92 -96 -96 -96 -97 -96 -94 -96 -98 -88 -95 -92 -96 -96 -96 -97 -96 -98 -96 -96 -96 -96 -96 -96 -99 -97 -96 -93 -95 -98 -97 -96 -92 -81 -81 -80 -81 -82 -81 -82 -96 -82 -81 -52 -92 -78 -92 -92 -91 -99 -94 -95 -94 -93 -96 -98 -95 -81 -81 -81 -82 -81 -95 -98 -96 -96 -97 -93 -81 -98 -96 -96 -96 -96 -99 -98 -98 -96 -96 -94 -95 -91 -98 -96 -96 -94 -96 -95 -86 -96 -96 -98 -96 -96 -96 -96 -95 -94 -96 -92 -93 -96 -94 -96 -96 -98 -98 -95 -96 -96 -96 -94 -81 -81 -81 -81 -67 -96 -96 -98 -98 -97 -98 -96 -96 -94 -98 -98 -93 -94 -96 -97 -98 -94 -86 -96 -96 -96 -96 -96 -97 -99 -98 -97 -78 -97 -91 -91 -91 -81 -81 -61 -92 -81 -81 -81 -81 -81 -81 -81 -82 -88 -96 -96 -96 -92 -96 -81 -96 -96 -98 -97 -96 -95 -96 -95 -98 -98 -95 -93 -96 -98 -87 -96 -96 -96 -98 -98 -95 -96 -96 -96 -96 -96 -95 -96 -96 -95 -98 -98 -98 -96 -96 -95 -98 -96 -96 -96 -81 -81 -81 -81 -64 -81 -81 -96 -81 -81 -36 -96 -95 -96 -96 -99 -94 -96 -96 -96 -96 -84 -82 -81 -92 -80 -81 -80 -85 -92 -86 -92 -95 -93 -93 -78 -96 -90 -98 -98 -96 -96 -96 -98 -96 -98 -99 -98 -99 -98 -99 -98 -96 -96 -96 -98 -98 -96 -92 -98 -98 -98 -91 -97 -95 -98 -94 -98 -98 -87 -99 -84 -97 -84 -98 -98 -98 -81 -80 -81 -81 -43 -98 -98 -98 -98 -98 -98 -96 -99 -97 -99 -98 -98 -96 -98 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -97 -98 -99 -97 -95 -95 -93 -81 -81 -35 -81 -81 -80 -81 -84 -86 -85 -85 -98 -81 -84 -91 -81 -79 -91 -90 -90 -90 -91 -93 -98 -83 -87 -99 -98 -98 -84 -93 -93 -93 -98 -94 -94 -95 -95 -98 -92 -98 -98 -82 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -81 -81 -51 -99 -98 -95 -82 -82 -81 -81 -81 -83 -98 -98 -99 -96 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -82 -81 -82 -81 -81 -91 -96 -95 -95 -98 -98 -98 -96 -98 -95 -96 -95 -95 -95 -95 -95 -99 -97 -87 -87 -87 -87 -97 -98 -98 -98 -98 -98 -78 -96 -91 -91 -96 -96 -96 -96 -98 -97 -96 -99 -98 -85 -98 -98 -99 -81 -81 -81 -81 -81 -81 -99 -82 -93 -95 -89 -98 -99 -98 -98 -98 -98 -97 -91 -98 -98 -86 -98 -98 -98 -98 -98 -98 -98 -81 -81 -98 -98 -98 -98 -98 -97 -88 -87 -88 -98 -78 -91 -98 -98 -98 -98 -86 -87 -98 -99 -98 -98 -98 -98 -99 -99 -96 -77 -92 -90 -90 -91 -94 -97 -96 -98 -98 -98 -88 -82 -81 -81 -82 -40 -98 -98 -96 -96 -81 -81 -95 -82 -96 -81 -81 -97 -95 -97 -98 -99 -99 -91 -99 -91 -96 -86 -98 -97 -96 -81 -81 -81 -81 -48 -98 -98 -98 -98 -98 -98 -94 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -93 -95 -98 -98 -98 -98 -98 -96 -98 -98 -84 -86 -87 -97 -96 -95 -96 -98 -97 -85 -86 -86 -95 -98 -97 -82 -82 -98 -81 -81 -80 -78 -90 -98 -98 -98 -97 -96 -96 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -85 -85 -98 -85 -98 -85 -97 -98 -98 -98 -98 -98 -98 -98 -82 -81 -66 -81 -81 -96 -89 -86 -96 -85 -81 -80 -96 -86 -84 -84 -98 -98 -89 -98 -93 -81 -81 -54 -98 -81 -81 -66 -97 -98 -97 -98 -98 -98 -98 -98 -99 -93 -98 -95 -98 -98 -98 -99 -98 -98 -98 -95 -99 -98 -98 -99 -81 -81 -77 -86 -98 -95 -96 -96 -97 -81 -81 -82 -81 -76 -95 -91 -91 -90 -90 -94 -96 -94 -94 -95 -96 -94 -94 -95 -94 -96 -99 -81 -82 -82 -81 -81 -92 -92 -98 -90 -99 -98 -98 -98 -97 -98 -95 -98 -89 -96 -97 -86 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -99 -96 -94 -96 -96 -98 -99 -95 -81 -81 -82 -81 -81 -46 -98 -95 -98 -98 -98 -98 -98 -98 -98 -84 -85 -86 -98 -98 -98 -96 -98 -99 -95 -98 -78 -97 -91 -98 -98 -97 -97 -98 -98 -98 -98 -98 -81 -81 -82 -82 -81 -98 -98 -94 -95 -93 -98 -96 -94 -82 -87 -98 -81 -81 -98 -81 -81 -98 -91 -98 -84 -85 -82 -84 -84 -75 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -96 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -84 -84 -98 -84 -84 -95 -97 -99 -99 -98 -94 -99 -99 -98 -92 -95 -97 -96 -85 -98 -99 -98 -98 -93 -95 -98 -84 -84 -84 -84 -64 -90 -90 -90 -94 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -94 -94 -96 -93 -85 -98 -99 -98 -99 -98 -98 -98 -99 -98 -98 -98 -92 -99 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -84 -84 -82 -84 -84 -54 -98 -99 -94 -98 -94 -99 -98 -98 -98 -98 -99 -98 -95 -98 -98 -99 -98 -98 -92 -93 -97 -94 -94 -98 -98 -95 -98 -86 -94 -98 -98 -78 -96 -81 -82 -81 -98 -99 -98 -98 -98 -98 -90 -93 -98 -98 -98 -97 -98 -98 -98 -94 -97 -98 -92 -98 -97 -98 -86 -98 -98 -98 -98 -98 -97 -98 -93 -82 -82 -81 -93 -98 -98 -96 -98 -98 -98 -95 -95 -97 -96 -97 -96 -98 -99 -98 -99 -98 -98 -97 -98 -98 -97 -98 -99 -82 -97 -82 -98 -98 -95 -98 -98 -98 -98 -98 -99 -98 -84 -85 -98 -98 -98 -98 -99 -98 -99 -99 -98 -78 -96 -90 -90 -91 -98 -96 -96 -98 -92 -96 -96 -96 -95 -95 -96 -96 -96 -98 -85 -86 -92 -82 -98 -98 -93 -82 -81 -70 -98 -98 -98 -98 -94 -90 -98 -95 -99 -93 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -99 -98 -93 -99 -96 -95 -95 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -82 -99 -95 -96 -81 -97 -98 -98 -96 -95 -96 -98 -98 -96 -81 -83 -81 -98 -98 -82 -96 -84 -84 -92 -84 -85 -87 -91 -87 -93 -95 -78 -98 -90 -90 -99 -97 -98 -98 -98 -98 -98 -97 -98 -86 -98 -98 -98 -98 -98 -98 -98 -82 -55 -82 -92 -57 -82 -82 -96 -98 -99 -97 -98 -98 -99 -92 -92 -93 -98 -86 -95 -87 -96 -85 -97 -91 -95 -95 -97 -81 -97 -84 -88 -84 -96 -99 -98 -99 -98 -98 -97 -98 -97 -98 -86 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -89 -97 -98 -98 -98 -95 -98 -88 -88 -98 -98 -98 -98 -96 -85 -98 -98 -99 -99 -78 -99 -99 -99 -96 -77 -85 -86 -82 -90 -85 -90 -90 -90 -92 -90 -90 -91 -91 -91 -90 -90 -91 -91 -94 -95 -81 -91 -93 -99 -84 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -86 -92 -84 -88 -84 -99 -98 -98 -98 -95 -98 -96 -98 -98 -98 -93 -98 -95 -83 -98 -81 -98 -98 -92 -98 -98 -98 -81 -92 -81 -81 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -87 -96 -77 -98 -98 -90 -98 -99 -98 -84 -85 -85 -89 -99 -98 -81 -81 -85 -83 -85 -97 -86 -78 -93 -86 -86 -91 -95 -95 -96 -96 -99 -96 -98 -98 -98 -98 -81 -81 -82 -55 -93 -98 -98 -82 -99 -82 -98 -82 -98 -82 -82 -81 -98 -90 -82 -98 -98 -86 -98 -98 -98 -97 -96 -98 -99 -98 -98 -93 -99 -95 -98 -99 -93 -98 -98 -98 -91 -96 -89 -78 -92 -96 -98 -98 -98 -98 -97 -98 -96 -98 -99 -98 -99 -99 -98 -98 -89 -89 -94 -95 -95 -98 -99 -98 -86 -99 -96 -86 -98 -98 -98 -98 -98 -98 -98 -98 -95 -82 -96 -91 -91 -90 -90 -90 -90 -94 -97 -98 -98 -98 -98 -97 -98 -96 -97 -97 -96 -98 -98 -94 -82 -98 -98 -98 -98 -98 -99 -99 -96 -83 -98 -83 -86 -87 -97 -98 -97 -98 -88 -83 -84 -59 -85 -84 -84 -95 -83 -84 -85 -86 -95 -99 -98 -96 -98 -98 -98 -98 -99 -98 -96 -86 -97 -82 -88 -82 -88 -88 -80 -84 -88 -87 -87 -98 -84 -86 -98 -85 -83 -84 -71 -84 -75 -84 -91 -98 -84 -98 -87 -88 -85 -87 -96 -97 -93 -84 -100 -89 -98 -95 -85 -99 -98 -96 -96 -97 -98 -91 -98 -99 -86 -96 -98 -98 -97 -96 -98 -98 -99 -98 -98 -99 -98 -98 -98 -93 -97 -97 -98 -99 -98 -98 -98 -98 -98 -93 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -96 -96 -96 -98 -95 -98 -98 -99 -98 -98 -98 -95 -84 -95 -98 -98 -98 -98 -98 -98 -98 -98 -93 -97 -91 -90 -90 -90 -93 -91 -92 -91 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -87 -89 -96 -98 -97 -96 -96 -94 -97 -84 -84 -57 -98 -98 -97 -90 -94 -96 -97 -96 -97 -84 -96 -84 -81 -98 -98 -84 -98 -81 -98 -98 -96 -83 -86 -84 -81 -99 -98 -87 -98 -96 -96 -98 -96 -96 -49 -98 -98 -98 -57 -84 -84 -61 -84 -85 -86 -97 -84 -97 -97 -84 -96 -84 -78 -98 -96 -95 -85 -85 -85 -85 -85 -97 -97 -98 -98 -98 -78 -98 -91 -91 -98 -98 -97 -98 -98 -99 -98 -98 -98 -96 -98 -98 -98 -98 -98 -97 -98 -93 -84 -99 -96 -86 -98 -98 -98 -98 -98 -98 -98 -98 -96 -95 -97 -98 -87 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -94 -98 -99 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -93 -94 -98 -99 -95 -96 -98 -98 -98 -98 -92 -98 -94 -94 -93 -95 -95 -98 -95 -95 -94 -96 -84 -85 -84 -97 -94 -98 -98 -99 -98 -98 -88 -94 -93 -90 -91 -83 -91 -91 -84 -91 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -84 -84 -43 -95 -94 -98 -97 -97 -97 -98 -99 -99 -98 -98 -98 -94 -83 -84 -66 -87 -98 -98 -98 -98 -97 -84 -95 -98 -98 -84 -65 -84 -61 -98 -92 -84 -98 -84 -98 -81 -91 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -96 -98 -98 -99 -97 -95 -95 -95 -98 -98 -98 -98 -98 -96 -85 -85 -92 -98 -96 -99 -98 -98 -98 -98 -78 -96 -91 -91 -98 -98 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -95 -98 -99 -98 -98 -95 -93 -97 -93 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -92 -95 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -95 -98 -90 -91 -91 -90 -91 -98 -98 -82 -99 -95 -82 -75 -98 -98 -98 -81 -82 -84 -98 -98 -92 -98 -95 -81 -82 -70 -98 -97 -98 -98 -82 -85 -51 -82 -98 -82 -75 -92 -97 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -96 -98 -98 -99 -97 -97 -98 -93 -98 -98 -97 -99 -98 -98 -98 -97 -96 -97 -96 -95 -98 -95 -95 -97 -98 -98 -96 -95 -98 -98 -99 -99 -98 -98 -96 -84 -85 -86 -86 -87 -93 -99 -97 -98 -98 -98 -98 -91 -91 -97 -98 -94 -98 -98 -98 -98 -96 -96 -96 -96 -98 -99 -98 -98 -99 -98 -97 -82 -99 -95 -92 -89 -97 -82 -82 -93 -92 -96 -96 -99 -96 -95 -97 -91 -98 -98 -93 -93 -98 -95 -95 -98 -98 -98 -98 -98 -98 -89 -97 -97 -98 -98 -88 -88 -88 -98 -98 -98 -98 -82 -88 -98 -99 -84 -48 -84 -93 -89 -84 -97 -84 -92 -98 -98 -93 -95 -95 -80 -84 -96 -84 -87 -97 -87 -82 -98 -99 -98 -98 -97 -97 -84 -60 -85 -74 -96 -91 -92 -91 -91 -91 -93 -91 -91 -95 -84 -90 -90 -96 -81 -90 -91 -91 -91 -43 -92 -91 -91 -91 -86 -92 -84 -99 -83 -97 -84 -98 -98 -91 -98 -98 -87 -86 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -99 -97 -93 -94 -95 -98 -97 -94 -98 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -95 -98 -97 -98 -98 -98 -98 -98 -85 -86 -85 -85 -85 -85 -85 -84 -85 -85 -86 -86 -86 -89 -85 -85 -87 -78 -86 -86 -86 -86 -86 -94 -89 -87 -86 -86 -86 -87 -97 -88 -87 -85 -99 -84 -98 -84 -61 -98 -98 -98 -97 -88 -88 -88 -91 -97 -98 -87 -96 -98 -84 -98 -84 -37 -98 -84 -48 -84 -99 -94 -94 -88 -88 -89 -98 -84 -97 -81 -47 -81 -81 -87 -98 -98 -98 -98 -94 -81 -81 -92 -99 -96 -93 -96 -98 -97 -98 -98 -98 -95 -98 -98 -94 -95 -98 -98 -98 -84 -98 -98 -96 -99 -98 -99 -98 -98 -81 -76 -77 -84 -90 -90 -91 -91 -90 -91 -91 -91 -91 -91 -91 -91 -91 -96 -97 -98 -96 -98 -97 -94 -84 -98 -99 -98 -96 -96 -98 -98 -99 -98 -96 -87 -97 -87 -91 -86 -85 -87 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -84 -98 -86 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -85 -98 -98 -85 -85 -88 -86 -78 -97 -99 -98 -94 -96 -96 -99 -85 -98 -98 -98 -85 -94 -87 -91 -87 -85 -85 -98 -88 -88 -83 -78 -81 -91 -92 -96 -98 -96 -98 -96 -85 -96 -80 -99 -98 -97 -84 -84 -86 -84 -81 -81 -98 -98 -48 -99 -89 -99 -98 -99 -94 -98 -98 -94 -99 -95 -88 -98 -99 -98 -98 -98 -98 -98 -97 -97 -99 -81 -84 -60 -84 -98 -81 -35 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -99 -85 -99 -98 -98 -98 -97 -98 -98 -98 -98 -78 -97 -91 -91 -91 -91 -91 -91 -91 -93 -94 -95 -98 -97 -97 -96 -99 -98 -96 -96 -97 -95 -98 -99 -98 -85 -98 -99 -98 -98 -98 -98 -98 -99 -98 -91 -98 -98 -86 -98 -99 -98 -98 -99 -97 -98 -98 -99 -95 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -95 -98 -97 -98 -92 -98 -98 -98 -97 -85 -86 -80 -82 -83 -86 -98 -48 -81 -81 -48 -81 -57 -95 -84 -98 -84 -58 -84 -84 -46 -96 -96 -96 -96 -95 -95 -96 -96 -97 -96 -97 -84 -86 -97 -84 -97 -98 -98 -92 -99 -84 -54 -84 -83 -99 -81 -81 -80 -98 -74 -98 -98 -98 -97 -98 -98 -98 -81 -81 -44 -99 -98 -96 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -87 -98 -98 -99 -98 -98 -99 -98 -98 -98 -94 -96 -90 -90 -91 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -92 -81 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -91 -99 -98 -98 -93 -96 -95 -94 -98 -97 -98 -99 -98 -99 -98 -98 -98 -98 -98 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -81 -48 -81 -89 -86 -85 -98 -98 -98 -97 -97 -98 -98 -95 -98 -98 -96 -87 -88 -88 -99 -98 -98 -98 -99 -98 -98 -98 -97 -91 -91 -96 -84 -96 -80 -95 -98 -98 -81 -84 -81 -81 -84 -98 -84 -43 -85 -98 -84 -99 -85 -97 -95 -85 -97 -84 -98 -84 -76 -84 -97 -97 -91 -94 -93 -96 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -99 -93 -93 -94 -96 -95 -97 -98 -98 -98 -98 -98 -98 -93 -93 -94 -98 -96 -95 -98 -98 -98 -98 -99 -98 -98 -94 -94 -96 -94 -95 -95 -98 -95 -97 -96 -97 -85 -98 -98 -98 -98 -98 -98 -98 -97 -98 -78 -96 -91 -93 -91 -96 -96 -96 -92 -98 -96 -96 -98 -91 -90 -98 -98 -99 -84 -94 -95 -93 -91 -97 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -92 -92 -94 -98 -98 -96 -97 -84 -95 -95 -95 -99 -81 -98 -81 -92 -98 -98 -98 -93 -95 -98 -98 -98 -94 -85 -84 -87 -87 -86 -87 -88 -88 -98 -98 -98 -78 -96 -91 -90 -96 -98 -97 -99 -99 -98 -99 -86 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -92 -86 -99 -99 -85 -99 -84 -84 -99 -84 -98 -84 -88 -84 -88 -83 -88 -81 -98 -84 -99 -85 -84 -71 -84 -48 -85 -70 -98 -90 -98 -98 -93 -98 -98 -98 -98 -98 -98 -98 -99 -96 -98 -98 -95 -94 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -99 -98 -99 -93 -85 -98 -99 -98 -98 -96 -98 -98 -98 -98 -78 -98 -96 -96 -84 -50 -98 -95 -80 -95 -98 -98 -98 -98 -99 -98 -52 -98 -98 -98 -97 -92 -84 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -81 -93 -84 -34 -93 -93 -98 -96 -90 -98 -99 -95 -95 -95 -95 -95 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -99 -96 -99 -98 -97 -98 -97 -97 -95 -92 -85 -85 -82 -85 -98 -98 -99 -91 -96 -99 -87 -84 -91 -98 -84 -99 -88 -81 -81 -81 -81 -91 -81 -98 -93 -89 -81 -98 -84 -84 -97 -93 -81 -98 -98 -98 -81 -94 -63 -84 -84 -84 -84 -89 -91 -98 -98 -98 -86 -98 -98 -98 -98 -98 -98 -98 -98 -95 -94 -98 -98 -99 -97 -97 -98 -98 -98 -96 -98 -95 -98 -98 -98 -97 -98 -93 -96 -99 -98 -99 -98 -99 -98 -99 -94 -83 -76 -84 -98 -81 -96 -98 -93 -94 -93 -93 -94 -94 -93 -86 -93 -94 -94 -93 -95 -96 -95 -96 -96 -94 -93 -90 -94 -94 -95 -96 -88 -96 -85 -88 -96 -81 -84 -80 -84 -96 -98 -96 -95 -95 -96 -84 -87 -95 -92 -90 -85 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -91 -102 -98 -87 -97 -84 -95 -98 -88 -98 -97 -98 -98 -98 -93 -96 -97 -98 -95 -99 -98 -98 -97 -98 -86 -98 -98 -98 -98 -98 -98 -85 -98 -87 -85 -98 -98 -98 -98 -98 -96 -82 -95 -84 -85 -81 -97 -88 -96 -86 -86 -96 -85 -86 -86 -85 -99 -98 -62 -77 -83 -82 -91 -98 -98 -98 -98 -83 -83 -99 -84 -84 -45 -81 -61 -98 -98 -98 -98 -98 -93 -98 -94 -90 -81 -98 -84 -84 -84 -84 -84 -84 -99 -98 -92 -84 -36 -81 -83 -93 -90 -95 -95 -81 -70 -78 -81 -98 -85 -98 -98 -99 -83 -98 -96 -95 -98 -98 -83 -81 -81 -84 -81 -98 -85 -85 -84 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -99 -98 -96 -98 -98 -98 -98 -98 -98 -85 -86 -85 -61 -95 -82 -81 -95 -96 -98 -90 -99 -77 -91 -92 -91 -91 -91 -99 -98 -98 -92 -93 -98 -98 -98 -85 -98 -98 -98 -98 -97 -99 -98 -98 -97 -95 -97 -97 -96 -97 -93 -98 -98 -98 -98 -82 -98 -81 -76 -98 -98 -98 -98 -96 -86 -98 -81 -68 -92 -99 -96 -99 -93 -92 -96 -98 -98 -97 -96 -81 -98 -86 -96 -85 -97 -80 -91 -87 -85 -85 -85 -85 -86 -85 -86 -86 -96 -91 -91 -96 -98 -96 -96 -96 -98 -99 -98 -98 -98 -98 -98 -97 -81 -99 -99 -98 -98 -98 -90 -97 -91 -93 -98 -93 -86 -94 -99 -86 -86 -98 -81 -98 -82 -99 -87 -99 -98 -82 -71 -98 -92 -98 -99 -98 -86 -85 -85 -85 -98 -86 -86 -65 -72 -98 -98 -98 -98 -85 -98 -80 -98 -98 -98 -92 -98 -81 -98 -81 -61 -92 -98 -95 -94 -98 -92 -91 -97 -97 -92 -99 -96 -99 -98 -98 -84 -99 -98 -98 -98 -98 -98 -97 -98 -98 -77 -96 -91 -90 -90 -91 -91 -90 -97 -92 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -99 -98 -98 -98 -98 -81 -81 -98 -86 -98 -92 -98 -89 -80 -82 -81 -98 -98 -86 -97 -98 -98 -81 -99 -99 -98 -98 -97 -93 -89 -98 -88 -81 -98 -88 -86 -97 -98 -98 -98 -93 -98 -98 -98 -85 -93 -92 -93 -85 -96 -95 -81 -98 -98 -98 -96 -99 -99 -98 -98 -98 -98 -98 -88 -88 -87 -87 -87 -88 -86 -87 -87 -87 -87 -95 -78 -91 -98 -98 -98 -98 -98 -98 -98 -99 -81 -95 -98 -98 -99 -98 -98 -98 -89 -86 -92 -85 -90 -86 -86 -86 -86 -98 -81 -98 -81 -48 -81 -93 -99 -81 -82 -85 -99 -98 -98 -97 -81 -81 -92 -86 -98 -98 -92 -96 -91 -85 -37 -85 -98 -98 -80 -96 -83 -98 -93 -95 -97 -98 -98 -98 -45 -85 -85 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -98 -98 -96 -85 -82 -98 -93 -92 -98 -95 -95 -97 -99 -78 -95 -94 -90 -90 -91 -91 -91 -91 -90 -97 -97 -98 -98 -97 -97 -96 -98 -98 -99 -98 -97 -91 -98 -85 -98 -98 -81 -95 -81 -82 -97 -98 -98 -98 -98 -92 -97 -94 -98 -95 -98 -81 -96 -86 -98 -98 -98 -98 -97 -98 -98 -98 -99 -92 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -97 -98 -98 -98 -98 -97 -97 -95 -98 -98 -98 -99 -98 -98 -98 -96 -86 -87 -87 -87 -98 -99 -98 -99 -97 -98 -77 -86 -80 -92 -96 -98 -85 -65 -85 -97 -97 -98 -98 -99 -98 -98 -98 -99 -99 -98 -98 -92 -81 -87 -99 -98 -99 -94 -96 -98 -86 -89 -98 -98 -98 -93 -98 -98 -85 -98 -87 -86 -86 -85 -85 -85 -96 -82 -98 -98 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -95 -98 -98 -97 -86 -86 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -96 -91 -91 -91 -91 -94 -94 -91 -94 -91 -91 -93 -92 -96 -85 -98 -80 -98 -70 -86 -92 -86 -87 -46 -86 -98 -99 -98 -99 -98 -98 -98 -98 -92 -98 -98 -98 -85 -99 -98 -98 -98 -97 -98 -99 -98 -98 -99 -99 -99 -98 -98 -93 -93 -93 -95 -98 -99 -98 -98 -98 -98 -92 -92 -92 -92 -95 -95 -95 -95 -96 -98 -92 -98 -97 -97 -97 -87 -52 -85 -96 -81 -97 -98 -80 -99 -97 -87 -86 -92 -87 -80 -87 -88 -88 -98 -88 -77 -96 -92 -86 -95 -96 -96 -96 -98 -98 -96 -95 -96 -96 -96 -99 -97 -98 -90 -81 -97 -97 -85 -97 -89 -98 -98 -98 -96 -98 -88 -68 -98 -86 -99 -92 -99 -86 -86 -51 -98 -98 -98 -86 -97 -86 -87 -86 -98 -85 -81 -98 -98 -86 -97 -85 -97 -64 -66 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -89 -87 -87 -99 -98 -98 -98 -98 -98 -85 -98 -99 -98 -99 -98 -87 -90 -83 -95 -76 -96 -91 -90 -90 -91 -90 -91 -91 -92 -92 -96 -98 -92 -99 -81 -97 -92 -82 -98 -82 -81 -59 -94 -81 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -91 -98 -99 -85 -99 -99 -98 -98 -99 -98 -98 -98 -98 -98 -90 -96 -85 -86 -86 -85 -92 -86 -88 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -99 -82 -81 -81 -87 -96 -98 -77 -92 -88 -95 -98 -92 -92 -93 -87 -85 -85 -86 -86 -87 -87 -86 -87 -91 -88 -98 -92 -95 -96 -91 -98 -96 -96 -96 -96 -96 -99 -86 -86 -98 -81 -81 -98 -98 -98 -98 -98 -65 -85 -85 -88 -89 -98 -98 -92 -99 -88 -98 -87 -86 -87 -85 -73 -89 -86 -82 -89 -86 -86 -92 -87 -86 -86 -92 -81 -81 -48 -81 -81 -93 -92 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -96 -96 -92 -96 -93 -97 -98 -98 -98 -95 -96 -96 -98 -98 -98 -98 -96 -86 -99 -92 -99 -98 -98 -81 -81 -88 -86 -43 -85 -85 -91 -90 -90 -96 -92 -96 -81 -81 -98 -99 -98 -98 -34 -98 -98 -98 -98 -99 -99 -93 -82 -98 -99 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -92 -98 -98 -96 -97 -98 -97 -97 -98 -81 -81 -98 -82 -81 -57 -92 -98 -95 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -92 -93 -92 -92 -92 -92 -92 -92 -92 -92 -92 -85 -81 -81 -98 -81 -81 -92 -81 -81 -81 -98 -94 -94 -95 -81 -81 -96 -81 -81 -95 -93 -98 -98 -98 -85 -98 -98 -98 -98 -98 -97 -99 -98 -99 -97 -97 -97 -98 -98 -92 -98 -98 -99 -98 -98 -97 -95 -98 -99 -98 -98 -98 -96 -98 -97 -98 -96 -98 -98 -96 -99 -98 -97 -96 -98 -98 -94 -98 -98 -98 -81 -81 -98 -98 -86 -86 -99 -98 -98 -98 -98 -99 -99 -98 -99 -96 -95 -91 -91 -93 -91 -91 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -97 -99 -81 -81 -81 -93 -82 -81 -82 -64 -98 -98 -98 -98 -98 -92 -98 -98 -99 -87 -98 -99 -98 -99 -97 -99 -98 -98 -98 -98 -98 -97 -95 -98 -88 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -86 -98 -85 -99 -81 -81 -76 -81 -81 -97 -98 -94 -97 -81 -81 -96 -79 -80 -85 -86 -82 -82 -85 -88 -82 -58 -78 -84 -92 -92 -58 -81 -81 -82 -81 -81 -88 -81 -81 -81 -81 -48 -98 -98 -98 -98 -85 -84 -58 -85 -95 -86 -86 -89 -98 -98 -84 -85 -93 -84 -84 -80 -97 -95 -91 -92 -92 -95 -96 -92 -96 -96 -98 -92 -98 -95 -96 -86 -92 -93 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -97 -97 -99 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -95 -98 -98 -98 -97 -98 -98 -97 -96 -86 -99 -98 -98 -98 -98 -98 -97 -95 -85 -77 -84 -84 -84 -84 -91 -42 -91 -91 -94 -91 -91 -98 -81 -81 -98 -99 -98 -98 -98 -98 -93 -81 -99 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -93 -99 -85 -98 -98 -98 -99 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -93 -98 -98 -81 -81 -98 -87 -86 -50 -90 -86 -85 -98 -85 -85 -86 -86 -70 -98 -98 -98 -98 -98 -98 -98 -98 -85 -85 -45 -86 -85 -98 -81 -81 -46 -80 -80 -85 -80 -79 -90 -98 -98 -98 -98 -97 -95 -96 -91 -81 -81 -71 -98 -98 -90 -88 -89 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -81 -94 -94 -98 -93 -98 -95 -97 -98 -97 -97 -98 -93 -95 -98 -93 -85 -99 -99 -99 -93 -98 -94 -98 -93 -93 -95 -99 -98 -93 -95 -96 -97 -98 -97 -98 -95 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -84 -98 -98 -98 -99 -96 -88 -98 -98 -98 -98 -98 -98 -97 -97 -98 -80 -96 -96 -95 -97 -90 -91 -90 -90 -94 -95 -95 -95 -95 -95 -90 -90 -98 -82 -82 -82 -81 -81 -98 -87 -93 -85 -98 -95 -95 -98 -98 -98 -81 -98 -98 -81 -81 -81 -81 -81 -45 -82 -82 -99 -82 -82 -98 -98 -98 -98 -98 -96 -81 -81 -88 -87 -87 -86 -86 -60 -98 -99 -98 -98 -84 -85 -85 -85 -86 -86 -98 -98 -98 -95 -77 -95 -90 -96 -96 -98 -98 -98 -98 -98 -98 -99 -98 -99 -95 -97 -96 -97 -97 -98 -98 -93 -98 -98 -96 -88 -98 -98 -98 -98 -98 -99 -98 -98 -93 -98 -98 -98 -84 -98 -98 -98 -98 -98 -97 -98 -98 -90 -99 -98 -98 -96 -93 -97 -98 -99 -98 -98 -98 -86 -99 -95 -98 -97 -84 -86 -88 -85 -98 -98 -98 -98 -98 -92 -97 -98 -97 -98 -98 -86 -85 -99 -98 -99 -99 -99 -98 -96 -86 -86 -98 -98 -97 -97 -97 -87 -86 -74 -82 -83 -77 -84 -42 -84 -88 -90 -91 -91 -86 -86 -98 -86 -86 -98 -98 -98 -98 -86 -86 -94 -83 -86 -85 -98 -98 -98 -95 -98 -98 -98 -99 -98 -98 -92 -98 -87 -85 -46 -86 -86 -53 -86 -86 -98 -87 -86 -98 -98 -98 -98 -98 -95 -93 -86 -86 -63 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -95 -99 -97 -97 -97 -97 -98 -96 -86 -87 -86 -87 -87 -98 -99 -98 -98 -98 -78 -98 -90 -90 -98 -95 -98 -99 -98 -99 -97 -99 -98 -99 -98 -98 -99 -98 -99 -98 -98 -95 -96 -98 -86 -98 -87 -98 -98 -98 -98 -99 -96 -99 -98 -92 -98 -97 -91 -98 -97 -97 -98 -97 -93 -94 -96 -93 -95 -98 -98 -98 -98 -95 -85 -85 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -93 -96 -98 -98 -98 -98 -95 -98 -98 -98 -98 -98 -98 -98 -96 -88 -98 -98 -98 -99 -99 -98 -99 -98 -98 -76 -96 -91 -92 -90 -92 -92 -85 -86 -86 -85 -98 -86 -85 -99 -85 -86 -98 -99 -81 -81 -93 -99 -90 -86 -87 -98 -81 -81 -80 -81 -81 -45 -87 -85 -54 -85 -85 -84 -85 -85 -98 -86 -85 -97 -86 -86 -67 -86 -82 -81 -81 -81 -94 -98 -98 -98 -98 -81 -81 -58 -98 -97 -98 -98 -98 -98 -98 -97 -94 -97 -96 -98 -85 -99 -89 -97 -98 -98 -99 -96 -98 -98 -98 -98 -98 -98 -96 -87 -88 -88 -88 -88 -98 -98 -99 -98 -88 -98 -96 -95 -91 -98 -95 -95 -97 -95 -98 -97 -98 -98 -98 -99 -97 -98 -98 -98 -98 -97 -98 -92 -92 -98 -82 -98 -98 -81 -81 -82 -81 -81 -98 -98 -94 -98 -97 -98 -84 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -99 -97 -93 -97 -99 -98 -98 -98 -97 -98 -97 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -88 -99 -93 -97 -81 -81 -99 -98 -98 -81 -81 -98 -87 -86 -72 -87 -86 -44 -86 -86 -99 -88 -86 -86 -42 -88 -86 -98 -81 -80 -98 -98 -96 -93 -86 -85 -86 -86 -87 -48 -97 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -94 -94 -94 -95 -95 -97 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -94 -96 -96 -98 -99 -98 -98 -98 -98 -98 -85 -85 -92 -99 -98 -98 -98 -98 -98 -98 -76 -95 -91 -86 -85 -86 -85 -86 -98 -94 -98 -95 -97 -98 -94 -95 -98 -98 -99 -97 -99 -94 -87 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -85 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -97 -95 -98 -98 -93 -98 -98 -98 -99 -98 -98 -98 -85 -85 -85 -85 -51 -98 -99 -98 -98 -98 -98 -94 -97 -96 -94 -96 -96 -84 -85 -86 -86 -85 -84 -94 -97 -98 -97 -86 -89 -93 -93 -94 -98 -97 -85 -85 -78 -85 -85 -95 -90 -90 -90 -97 -85 -85 -81 -81 -50 -97 -81 -81 -91 -85 -80 -85 -84 -98 -85 -84 -99 -93 -98 -96 -87 -98 -95 -85 -98 -85 -98 -98 -98 -95 -97 -99 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -90 -98 -98 -35 -98 -98 -98 -98 -99 -98 -98 -99 -98 -99 -98 -98 -89 -89 -98 -98 -98 -98 -98 -98 -98 -86 -85 -97 -85 -85 -69 -90 -90 -98 -96 -85 -85 -89 -89 -96 -88 -85 -86 -86 -85 -85 -85 -85 -87 -85 -97 -82 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -94 -87 -98 -98 -98 -98 -87 -98 -99 -98 -93 -98 -98 -96 -93 -92 -94 -87 -99 -98 -98 -92 -98 -86 -86 -98 -87 -86 -87 -98 -98 -98 -97 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -96 -98 -99 -98 -86 -85 -89 -81 -81 -80 -89 -96 -96 -92 -96 -98 -95 -98 -54 -81 -81 -88 -85 -85 -77 -92 -82 -85 -94 -90 -81 -81 -98 -96 -99 -76 -98 -91 -93 -91 -91 -92 -91 -95 -91 -91 -91 -91 -91 -91 -91 -99 -98 -98 -98 -98 -94 -82 -98 -81 -81 -45 -81 -81 -49 -81 -81 -97 -82 -81 -98 -92 -85 -82 -98 -84 -84 -84 -86 -88 -98 -98 -99 -98 -98 -98 -87 -86 -82 -91 -93 -86 -86 -88 -81 -81 -81 -98 -98 -92 -98 -98 -98 -98 -98 -98 -97 -98 -98 -95 -94 -94 -96 -97 -97 -96 -98 -98 -98 -98 -93 -93 -93 -92 -97 -85 -85 -97 -98 -98 -98 -98 -99 -99 -95 -95 -90 -96 -97 -97 -98 -98 -95 -95 -97 -95 -98 -99 -99 -98 -88 -81 -81 -81 -98 -94 -98 -98 -98 -95 -87 -99 -85 -96 -88 -85 -97 -96 -81 -82 -97 -82 -81 -98 -98 -98 -98 -98 -97 -98 -85 -98 -98 -86 -85 -85 -96 -96 -99 -95 -98 -96 -97 -96 -98 -97 -99 -96 -87 -98 -98 -98 -87 -84 -85 -99 -98 -86 -76 -81 -55 -97 -90 -90 -80 -82 -80 -81 -81 -98 -86 -86 -86 -85 -85 -97 -92 -97 -81 -81 -93 -82 -35 -81 -81 -82 -81 -82 -84 -82 -82 -96 -96 -96 -95 -93 -85 -97 -97 -98 -98 -96 -97 -97 -98 -97 -98 -96 -98 -95 -98 -92 -98 -97 -97 -99 -98 -97 -98 -96 -98 -97 -98 -98 -96 -96 -98 -97 -97 -96 -98 -97 -98 -96 -97 -98 -98 -98 -96 -97 -97 -98 -98 -96 -97 -99 -96 -92 -87 -88 -98 -99 -81 -81 -99 -81 -81 -60 -95 -91 -95 -95 -97 -98 -96 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -82 -98 -97 -96 -95 -98 -98 -98 -98 -98 -98 -98 -81 -81 -82 -81 -83 -95 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -93 -95 -96 -93 -98 -98 -98 -94 -93 -98 -95 -95 -98 -98 -99 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -81 -81 -98 -81 -81 -79 -95 -98 -96 -95 -98 -81 -81 -85 -81 -81 -98 -86 -86 -66 -86 -86 -87 -98 -98 -85 -85 -34 -91 -91 -86 -86 -98 -98 -98 -98 -98 -98 -97 -95 -98 -98 -98 -98 -98 -96 -96 -98 -93 -98 -98 -98 -98 -99 -98 -98 -99 -98 -96 -99 -97 -89 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -87 -86 -77 -98 -86 -86 -97 -98 -98 -97 -99 -98 -99 -96 -99 -98 -99 -97 -99 -98 -98 -98 -86 -85 -94 -86 -86 -98 -98 -98 -99 -97 -78 -98 -91 -94 -99 -98 -99 -99 -99 -98 -97 -86 -85 -71 -97 -94 -95 -96 -85 -86 -99 -94 -98 -87 -90 -98 -98 -98 -78 -98 -98 -98 -98 -99 -91 -91 -90 -91 -82 -81 -94 -98 -98 -99 -98 -98 -99 -99 -98 -86 -87 -86 -85 -86 -91 -91 -91 -91 -98 -98 -98 -99 -87 -86 -76 -93 -92 -96 -86 -86 -97 -86 -86 -98 -91 -91 -90 -90 -86 -94 -98 -94 -93 -86 -99 -86 -87 -96 -83 -83 -98 -98 -87 -98 -98 -98 -98 -98 -98 -78 -95 -91 -90 -91 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -88 -99 -98 -98 -98 -98 -94 -87 -98 -97 -97 -97 -97 -98 -98 -98 -98 -97 -94 -91 -90 -91 -94 -85 -96 -86 -86 -73 -86 -87 -98 -98 -99 -98 -98 -98 -87 -98 -92 -98 -98 -98 -98 -97 -98 -89 -98 -98 -98 -98 -87 -88 -98 -99 -98 -98 -98 -98 -98 -78 -97 -98 -90 -98 -98 -98 -95 -95 -97 -97 -95 -95 -97 -97 -96 -95 -98 -98 -98 -99 -94 -87 -97 -91 -97 -86 -86 -98 -86 -85 -60 -97 -96 -88 -93 -86 -86 -43 -98 -86 -86 -99 -98 -98 -97 -87 -86 -50 -92 -86 -86 -98 -95 -92 -98 -98 -98 -98 -98 -98 -86 -86 -97 -86 -86 -98 -98 -98 -98 -98 -98 -93 -93 -95 -95 -97 -99 -98 -99 -95 -96 -99 -98 -98 -98 -98 -96 -98 -85 -98 -99 -98 -97 -97 -98 -98 -99 -99 -78 -98 -91 -90 -90 -90 -98 -95 -98 -98 -98 -98 -98 -87 -98 -97 -98 -86 -86 -99 -81 -81 -48 -82 -81 -81 -96 -97 -86 -86 -89 -90 -98 -97 -97 -97 -99 -96 -85 -97 -97 -98 -98 -97 -98 -98 -89 -89 -98 -98 -98 -83 -99 -92 -98 -98 -99 -98 -88 -86 -82 -87 -86 -86 -81 -81 -82 -98 -98 -98 -98 -97 -98 -98 -98 -95 -94 -95 -98 -98 -95 -95 -98 -98 -98 -98 -98 -96 -86 -96 -86 -86 -87 -88 -87 -98 -98 -99 -78 -97 -90 -91 -81 -81 -97 -98 -87 -86 -86 -86 -69 -98 -87 -86 -80 -88 -86 -86 -87 -86 -93 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -93 -99 -97 -99 -98 -98 -98 -98 -98 -97 -86 -86 -58 -86 -86 -93 -96 -97 -93 -92 -98 -95 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -95 -99 -99 -98 -98 -88 -98 -98 -96 -86 -98 -98 -98 -98 -98 -98 -98 -86 -86 -87 -87 -85 -57 -91 -90 -90 -97 -97 -90 -90 -90 -95 -92 -92 -95 -95 -97 -99 -95 -97 -93 -98 -87 -98 -97 -98 -96 -96 -97 -98 -90 -86 -86 -85 -85 -98 -90 -85 -96 -96 -97 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -92 -92 -98 -93 -95 -98 -97 -98 -98 -96 -98 -98 -98 -99 -98 -97 -98 -98 -99 -98 -98 -98 -97 -97 -98 -98 -98 -95 -98 -98 -86 -85 -53 -86 -86 -85 -83 -83 -86 -80 -81 -81 -94 -93 -86 -85 -59 -86 -85 -80 -86 -86 -97 -86 -86 -97 -98 -93 -96 -98 -98 -99 -98 -86 -92 -86 -97 -86 -86 -94 -96 -93 -85 -85 -98 -81 -81 -44 -99 -98 -86 -88 -87 -98 -85 -80 -98 -98 -98 -91 -98 -99 -99 -98 -98 -98 -96 -97 -96 -86 -96 -91 -85 -92 -92 -99 -93 -98 -98 -85 -99 -98 -98 -98 -98 -95 -95 -98 -85 -99 -87 -82 -81 -44 -86 -84 -95 -81 -82 -94 -81 -82 -65 -96 -86 -98 -98 -89 -85 -87 -88 -85 -98 -87 -93 -98 -90 -91 -90 -91 -91 -98 -98 -93 -95 -98 -98 -98 -85 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -97 -97 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -81 -81 -86 -81 -81 -98 -98 -99 -98 -98 -98 -81 -81 -98 -81 -81 -81 -82 -60 -79 -81 -98 -99 -98 -85 -86 -93 -86 -98 -98 -98 -98 -98 -96 -77 -98 -91 -91 -82 -82 -78 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -96 -93 -98 -81 -98 -98 -98 -92 -96 -97 -98 -98 -98 -98 -95 -99 -98 -98 -85 -98 -98 -98 -98 -98 -92 -98 -99 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -81 -98 -88 -96 -86 -80 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -90 -98 -90 -98 -96 -98 -98 -87 -48 -86 -99 -98 -86 -86 -98 -98 -98 -98 -98 -98 -98 -98 -96 -86 -98 -91 -90 -91 -99 -95 -95 -99 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -94 -98 -93 -99 -96 -98 -98 -99 -98 -98 -99 -98 -85 -95 -99 -98 -99 -85 -99 -87 -50 -87 -97 -98 -99 -97 -98 -98 -99 -98 -98 -98 -93 -86 -92 -86 -98 -80 -94 -81 -98 -81 -96 -98 -98 -98 -98 -98 -98 -92 -96 -98 -98 -98 -98 -92 -95 -95 -95 -95 -81 -98 -81 -97 -96 -96 -98 -86 -86 -90 -86 -87 -87 -98 -98 -98 -98 -96 -98 -92 -92 -98 -99 -98 -95 -96 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -96 -98 -94 -99 -98 -79 -96 -96 -98 -98 -98 -98 -98 -81 -83 -94 -81 -92 -98 -98 -92 -92 -98 -96 -98 -96 -96 -93 -93 -94 -98 -98 -98 -97 -96 -98 -98 -98 -81 -98 -81 -96 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -99 -99 -99 -89 -98 -98 -98 -98 -96 -98 -98 -85 -98 -98 -98 -98 -96 -86 -98 -98 -98 -98 -85 -98 -98 -98 -98 -80 -98 -90 -93 -91 -90 -84 -90 -90 -98 -98 -98 -98 -98 -98 -81 -98 -81 -98 -98 -98 -96 -95 -81 -97 -98 -98 -76 -81 -98 -99 -98 -81 -98 -81 -98 -98 -98 -85 -98 -98 -98 -98 -99 -85 -95 -99 -99 -99 -98 -98 -98 -99 -93 -98 -81 -88 -86 -90 -85 -98 -98 -98 -98 -98 -98 -92 -95 -98 -97 -98 -98 -98 -98 -98 -99 -97 -98 -98 -99 -95 -98 -98 -99 -98 -98 -99 -98 -84 -85 -85 -85 -85 -85 -99 -98 -98 -89 -99 -96 -98 -90 -98 -99 -85 -90 -85 -99 -97 -99 -96 -86 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -87 -94 -98 -98 -98 -97 -97 -98 -85 -95 -85 -90 -98 -98 -98 -85 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -99 -99 -98 -98 -97 -96 -98 -98 -98 -98 -98 -99 -98 -86 -86 -86 -87 -88 -98 -98 -98 -98 -99 -98 -80 -98 -90 -90 -90 -97 -86 -86 -76 -92 -90 -91 -57 -98 -95 -94 -96 -97 -98 -99 -98 -95 -89 -89 -89 -98 -98 -98 -98 -98 -95 -86 -89 -85 -98 -94 -99 -89 -86 -87 -98 -95 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -86 -98 -86 -99 -98 -96 -98 -95 -98 -98 -98 -97 -87 -88 -86 -97 -98 -98 -98 -98 -98 -98 -94 -96 -90 -98 -97 -96 -96 -96 -97 -98 -95 -95 -98 -99 -98 -98 -98 -99 -98 -98 -88 -94 -87 -87 -85 -87 -86 -99 -97 -97 -98 -95 -95 -97 -97 -95 -95 -98 -85 -99 -99 -98 -98 -98 -97 -98 -99 -99 -98 -98 -98 -98 -98 -92 -98 -98 -98 -98 -97 -84 -98 -98 -98 -86 -87 -85 -86 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -97 -98 -98 -95 -96 -85 -61 -92 -81 -81 -98 -86 -87 -98 -98 -98 -99 -98 -98 -89 -77 -89 -90 -86 -90 -90 -81 -81 -57 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -89 -93 -97 -97 -98 -94 -81 -98 -98 -98 -98 -98 -97 -98 -98 -94 -98 -97 -98 -96 -91 -85 -98 -92 -98 -96 -97 -97 -97 -98 -86 -99 -98 -81 -96 -80 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -97 -98 -98 -99 -98 -98 -95 -98 -98 -98 -99 -96 -85 -99 -95 -99 -98 -98 -98 -81 -83 -81 -98 -70 -85 -90 -95 -95 -81 -87 -99 -97 -87 -86 -98 -81 -98 -98 -98 -98 -98 -99 -98 -92 -92 -98 -94 -97 -96 -82 -97 -85 -96 -85 -93 -92 -85 -94 -98 -81 -91 -77 -85 -77 -86 -78 -86 -81 -83 -98 -99 -96 -98 -85 -88 -97 -96 -95 -81 -93 -92 -98 -86 -98 -86 -98 -93 -95 -81 -95 -84 -77 -94 -89 -89 -97 -96 -96 -81 -98 -98 -98 -89 -86 -98 -86 -87 -98 -81 -53 -98 -87 -98 -88 -99 -98 -98 -98 -98 -98 -98 -86 -96 -91 -93 -90 -90 -91 -91 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -82 -81 -88 -93 -98 -86 -86 -47 -70 -97 -98 -98 -97 -98 -97 -94 -86 -98 -98 -97 -95 -98 -98 -99 -98 -98 -99 -98 -98 -97 -98 -95 -92 -98 -98 -98 -91 -91 -99 -96 -93 -96 -98 -98 -98 -98 -98 -98 -87 -96 -86 -94 -97 -98 -92 -95 -93 -95 -96 -95 -98 -98 -98 -99 -98 -96 -93 -85 -86 -85 -87 -95 -96 -98 -88 -99 -94 -98 -99 -92 -98 -87 -99 -98 -86 -98 -98 -94 -98 -98 -98 -87 -98 -86 -98 -86 -58 -98 -98 -98 -98 -99 -84 -92 -92 -98 -95 -95 -95 -97 -86 -88 -85 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -91 -96 -96 -98 -98 -98 -96 -98 -99 -98 -99 -98 -98 -97 -98 -89 -98 -97 -98 -98 -98 -98 -98 -98 -97 -78 -85 -90 -90 -90 -90 -90 -93 -90 -90 -91 -95 -86 -99 -99 -98 -98 -98 -98 -98 -98 -95 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -94 -98 -98 -86 -98 -98 -99 -98 -98 -86 -88 -57 -96 -98 -99 -98 -98 -98 -92 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -82 -98 -98 -98 -95 -98 -98 -98 -93 -98 -98 -98 -98 -87 -83 -87 -80 -94 -86 -98 -86 -55 -86 -87 -85 -90 -89 -95 -92 -94 -94 -94 -94 -97 -94 -95 -85 -95 -86 -97 -97 -99 -98 -99 -93 -88 -88 -87 -95 -98 -98 -98 -99 -99 -86 -85 -81 -94 -99 -98 -99 -85 -98 -99 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -99 -91 -91 -98 -95 -95 -98 -98 -86 -97 -81 -82 -82 -99 -98 -98 -98 -98 -87 -88 -98 -98 -85 -98 -98 -90 -98 -99 -78 -95 -98 -90 -93 -90 -99 -98 -99 -99 -98 -97 -98 -98 -98 -98 -99 -81 -59 -81 -74 -98 -92 -85 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -95 -97 -98 -98 -94 -98 -98 -98 -97 -97 -98 -98 -99 -98 -90 -90 -98 -97 -98 -90 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -82 -97 -87 -98 -97 -92 -82 -82 -81 -65 -81 -82 -81 -87 -93 -86 -86 -80 -87 -87 -93 -86 -96 -99 -98 -98 -78 -97 -91 -90 -90 -92 -81 -86 -82 -88 -86 -98 -98 -81 -98 -98 -98 -98 -98 -98 -98 -94 -91 -88 -99 -82 -98 -98 -98 -98 -98 -99 -98 -98 -99 -95 -98 -91 -91 -99 -99 -95 -98 -98 -97 -99 -98 -98 -99 -98 -90 -98 -95 -91 -81 -98 -98 -99 -98 -98 -98 -98 -86 -99 -87 -87 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -91 -94 -96 -96 -96 -98 -98 -98 -98 -98 -97 -86 -87 -81 -92 -98 -98 -98 -98 -93 -86 -87 -43 -89 -87 -91 -90 -90 -92 -97 -98 -95 -98 -95 -98 -98 -97 -89 -89 -91 -97 -98 -98 -94 -97 -98 -98 -98 -97 -96 -98 -94 -95 -97 -98 -98 -98 -95 -94 -98 -96 -98 -98 -81 -99 -98 -98 -98 -99 -98 -82 -98 -99 -97 -97 -82 -82 -46 -95 -95 -98 -91 -98 -86 -96 -91 -90 -99 -86 -86 -92 -91 -98 -88 -99 -88 -91 -76 -91 -90 -97 -97 -95 -96 -98 -99 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -94 -97 -82 -95 -98 -98 -99 -97 -97 -97 -98 -98 -98 -82 -96 -82 -93 -98 -98 -98 -87 -63 -98 -90 -98 -98 -94 -98 -91 -98 -97 -98 -96 -96 -99 -96 -99 -95 -95 -97 -91 -88 -88 -89 -94 -88 -85 -89 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -91 -96 -98 -89 -89 -89 -96 -88 -98 -98 -98 -98 -99 -99 -99 -98 -93 -77 -96 -90 -90 -90 -90 -97 -96 -96 -98 -98 -98 -98 -98 -98 -85 -93 -98 -95 -99 -98 -94 -98 -98 -99 -96 -98 -86 -98 -82 -99 -86 -75 -87 -98 -93 -82 -98 -78 -87 -35 -87 -98 -82 -82 -99 -71 -83 -82 -82 -98 -87 -98 -93 -94 -99 -95 -94 -98 -98 -98 -98 -98 -93 -95 -98 -88 -88 -83 -82 -87 -87 -97 -98 -98 -99 -97 -98 -87 -88 -65 -88 -98 -81 -87 -98 -55 -88 -82 -86 -87 -88 -98 -98 -97 -98 -89 -96 -88 -94 -97 -84 -86 -88 -97 -98 -99 -96 -98 -98 -98 -98 -98 -87 -99 -87 -84 -99 -89 -95 -94 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -83 -87 -89 -98 -82 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -93 -98 -93 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -99 -98 -98 -98 -98 -99 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -98 -97 -98 -96 -86 -86 -85 -91 -92 -88 -98 -98 -98 -98 -78 -93 -95 -92 -91 -98 -98 -98 -93 -98 -98 -83 -98 -98 -83 -98 -98 -86 -98 -85 -86 -70 -94 -98 -98 -91 -85 -83 -98 -87 -85 -98 -85 -86 -98 -92 -98 -98 -98 -94 -98 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -93 -98 -99 -98 -99 -84 -99 -84 -94 -99 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -92 -96 -95 -98 -98 -97 -98 -99 -98 -84 -93 -82 -86 -82 -82 -98 -98 -98 -98 -98 -78 -94 -83 -70 -98 -99 -85 -84 -98 -98 -98 -98 -98 -84 -97 -99 -85 -80 -98 -98 -98 -94 -98 -88 -98 -85 -98 -98 -98 -97 -98 -99 -98 -98 -98 -92 -98 -98 -91 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -99 -98 -99 -98 -98 -98 -99 -99 -97 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -84 -97 -86 -84 -99 -84 -84 -85 -84 -98 -82 -80 -83 -98 -90 -95 -83 -98 -98 -98 -98 -99 -98 -98 -98 -98 -84 -83 -91 -98 -83 -99 -88 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -94 -98 -91 -98 -98 -99 -98 -98 -98 -83 -98 -93 -83 -94 -95 -93 -85 -65 -84 -83 -84 -85 -81 -86 -88 -84 -98 -98 -98 -98 -92 -89 -89 -98 -98 -91 -92 -92 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -94 -85 -98 -98 -99 -87 -98 -89 -99 -99 -98 -99 -96 -91 -98 -98 -99 -98 -98 -99 -98 -98 -84 -99 -98 -98 -97 -94 -94 -93 -92 -98 -94 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -85 -64 -94 -94 -90 -92 -92 -98 -98 -99 -98 -98 -98 -91 -85 -86 -88 -82 -62 -98 -81 -98 -86 -90 -83 -82 -81 -83 -97 -98 -98 -92 -79 -92 -93 -91 -91 -91 -91 -91 -98 -98 -86 -82 -83 -82 -98 -99 -98 -98 -98 -97 -88 -95 -94 -98 -92 -92 -98 -99 -97 -98 -98 -99 -98 -98 -98 -98 -90 -98 -88 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -82 -85 -82 -95 -98 -98 -98 -98 -98 -94 -83 -82 -95 -98 -82 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -95 -95 -92 -95 -92 -95 -98 -92 -98 -98 -99 -93 -85 -86 -98 -98 -99 -98 -99 -98 -98 -98 -80 -99 -90 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -97 -97 -91 -92 -98 -98 -92 -98 -84 -98 -98 -98 -98 -99 -94 -91 -98 -98 -98 -90 -98 -98 -98 -88 -82 -40 -99 -82 -95 -86 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -84 -98 -85 -98 -98 -98 -98 -84 -85 -85 -98 -98 -99 -98 -98 -98 -91 -91 -93 -98 -98 -98 -98 -92 -98 -98 -84 -44 -98 -98 -85 -84 -98 -82 -98 -99 -96 -83 -92 -98 -98 -92 -90 -89 -89 -90 -90 -92 -98 -92 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -99 -99 -95 -95 -96 -98 -82 -84 -82 -98 -98 -82 -98 -98 -98 -98 -91 -82 -82 -71 -40 -98 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -97 -95 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -95 -95 -91 -92 -98 -98 -98 -98 -98 -98 -99 -98 -98 -86 -95 -94 -91 -95 -94 -94 -95 -95 -95 -94 -90 -94 -90 -87 -85 -94 -91 -91 -91 -91 -79 -90 -92 -90 -92 -91 -98 -90 -92 -98 -98 -82 -98 -99 -98 -96 -95 -91 -98 -97 -99 -94 -99 -98 -92 -82 -89 -89 -89 -94 -95 -94 -97 -93 -93 -82 -93 -93 -93 -98 -82 -94 -94 -99 -98 -98 -95 -90 -97 -98 -98 -99 -94 -94 -94 -92 -92 -94 -88 -93 -92 -93 -93 -94 -94 -93 -89 -93 -94 -94 -94 -93 -94 -94 -92 -91 -95 -90 -97 -82 -82 -55 -91 -91 -98 -98 -82 -80 -82 -98 -82 -57 -98 -98 -98 -98 -92 -88 -98 -99 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -94 -98 -98 -88 -92 -97 -92 -98 -98 -98 -96 -97 -99 -98 -98 -98 -98 -99 -93 -99 -98 -91 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -98 -86 -98 -95 -85 -89 -83 -85 -90 -98 -98 -98 -98 -91 -98 -99 -98 -99 -89 -98 -89 -90 -90 -90 -90 -85 -98 -86 -85 -87 -86 -88 -78 -97 -90 -98 -98 -82 -81 -82 -82 -89 -84 -86 -83 -89 -82 -98 -98 -99 -98 -92 -92 -93 -82 -99 -85 -97 -98 -88 -92 -98 -82 -82 -83 -97 -91 -98 -98 -82 -82 -51 -98 -98 -98 -98 -98 -98 -94 -98 -91 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -92 -82 -82 -70 -91 -99 -82 -73 -98 -82 -82 -93 -96 -82 -83 -85 -98 -98 -98 -99 -98 -99 -98 -78 -98 -90 -91 -93 -91 -91 -94 -91 -98 -98 -99 -98 -99 -98 -98 -98 -95 -91 -98 -99 -93 -98 -84 -98 -98 -98 -97 -98 -91 -94 -98 -98 -91 -98 -91 -97 -98 -88 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -95 -97 -98 -99 -99 -94 -98 -98 -98 -98 -98 -99 -98 -95 -97 -95 -92 -98 -98 -98 -99 -98 -98 -98 -98 -92 -98 -97 -83 -83 -96 -83 -83 -73 -86 -86 -86 -86 -86 -87 -98 -92 -92 -94 -92 -89 -89 -90 -96 -96 -96 -90 -96 -96 -96 -83 -83 -96 -96 -96 -96 -96 -90 -91 -91 -90 -82 -91 -90 -83 -85 -91 -91 -91 -97 -98 -94 -98 -91 -98 -92 -92 -88 -95 -99 -99 -98 -98 -98 -91 -88 -99 -98 -95 -93 -98 -83 -94 -83 -90 -98 -87 -83 -83 -98 -98 -86 -83 -83 -82 -93 -98 -98 -98 -98 -98 -99 -98 -99 -98 -97 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -98 -85 -96 -98 -98 -98 -98 -98 -98 -98 -99 -98 -93 -90 -89 -89 -90 -91 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -93 -98 -98 -98 -86 -94 -87 -97 -98 -94 -86 -83 -98 -94 -98 -97 -98 -99 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -91 -91 -91 -98 -97 -83 -95 -83 -83 -69 -83 -63 -98 -96 -90 -98 -97 -99 -98 -98 -98 -79 -93 -89 -90 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -99 -99 -98 -98 -98 -92 -89 -94 -97 -98 -98 -98 -90 -90 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -89 -99 -99 -99 -98 -96 -98 -82 -82 -81 -82 -81 -56 -98 -82 -96 -99 -82 -82 -91 -85 -86 -88 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -95 -90 -98 -98 -98 -97 -98 -99 -98 -92 -98 -99 -99 -98 -98 -98 -98 -84 -86 -98 -98 -98 -98 -92 -98 -98 -98 -98 -93 -93 -90 -89 -91 -91 -98 -97 -98 -85 -87 -98 -93 -98 -98 -98 -98 -98 -97 -98 -98 -94 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -83 -84 -49 -95 -89 -88 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -94 -94 -98 -92 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -84 -52 -84 -94 -84 -46 -83 -99 -81 -98 -98 -98 -98 -94 -91 -90 -90 -95 -98 -99 -98 -87 -97 -87 -89 -88 -99 -98 -94 -98 -91 -80 -95 -91 -89 -94 -98 -98 -98 -98 -98 -98 -99 -90 -89 -90 -98 -98 -88 -94 -98 -99 -82 -81 -82 -88 -82 -99 -99 -98 -86 -97 -82 -84 -94 -82 -60 -82 -77 -82 -81 -59 -98 -98 -98 -98 -98 -98 -94 -82 -89 -93 -98 -96 -98 -94 -94 -95 -94 -94 -97 -92 -92 -88 -92 -84 -99 -89 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -87 -97 -98 -92 -99 -98 -98 -97 -94 -91 -98 -94 -91 -98 -86 -87 -98 -98 -98 -98 -99 -98 -78 -86 -84 -86 -90 -93 -91 -91 -91 -91 -99 -91 -91 -82 -81 -65 -91 -91 -97 -84 -72 -93 -84 -93 -98 -96 -88 -97 -96 -98 -98 -98 -98 -97 -87 -95 -97 -91 -91 -88 -98 -85 -93 -98 -98 -99 -98 -98 -98 -91 -98 -92 -98 -97 -98 -98 -97 -98 -92 -92 -92 -92 -92 -96 -97 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -91 -98 -98 -92 -84 -83 -88 -84 -90 -82 -80 -88 -89 -90 -83 -80 -82 -85 -87 -84 -86 -86 -79 -87 -79 -84 -87 -97 -86 -98 -98 -98 -98 -98 -98 -98 -84 -92 -84 -90 -78 -87 -93 -82 -98 -84 -81 -84 -84 -84 -84 -98 -82 -83 -62 -93 -83 -85 -84 -98 -93 -82 -95 -97 -98 -98 -98 -96 -82 -96 -90 -84 -97 -85 -98 -81 -95 -95 -84 -98 -98 -98 -98 -84 -81 -98 -98 -98 -98 -88 -93 -96 -98 -85 -81 -95 -92 -98 -98 -91 -98 -98 -91 -85 -73 -92 -83 -82 -81 -98 -99 -84 -99 -98 -97 -92 -99 -98 -93 -91 -90 -90 -90 -91 -90 -91 -90 -98 -97 -96 -85 -96 -98 -98 -98 -98 -99 -97 -98 -99 -98 -98 -86 -98 -88 -95 -91 -87 -98 -97 -84 -99 -98 -81 -93 -93 -88 -93 -93 -93 -93 -93 -93 -93 -92 -93 -93 -93 -99 -98 -98 -98 -99 -90 -98 -98 -86 -97 -88 -98 -86 -87 -88 -87 -96 -95 -88 -87 -87 -88 -87 -92 -92 -87 -84 -88 -87 -88 -95 -87 -88 -88 -88 -88 -88 -98 -84 -84 -84 -84 -84 -83 -64 -92 -84 -84 -84 -84 -97 -82 -86 -83 -93 -98 -98 -98 -95 -83 -73 -84 -62 -84 -78 -84 -98 -84 -84 -77 -98 -98 -81 -98 -82 -82 -82 -95 -89 -98 -82 -84 -57 -98 -98 -99 -90 -89 -84 -79 -98 -80 -85 -93 -89 -83 -98 -84 -82 -98 -98 -87 -90 -93 -92 -98 -98 -98 -92 -83 -83 -89 -87 -88 -98 -98 -98 -99 -98 -98 -98 -98 -91 -90 -96 -91 -92 -91 -91 -92 -92 -90 -92 -91 -92 -92 -92 -92 -93 -98 -92 -92 -92 -92 -91 -92 -93 -91 -91 -91 -92 -91 -93 -94 -96 -96 -92 -92 -98 -95 -91 -88 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -99 -98 -95 -99 -98 -98 -98 -98 -96 -98 -98 -98 -98 -99 -98 -95 -97 -98 -92 -92 -98 -98 -95 -97 -92 -98 -95 -95 -95 -95 -95 -95 -95 -95 -86 -95 -94 -85 -86 -95 -95 -87 -88 -87 -86 -86 -87 -88 -86 -87 -87 -86 -87 -79 -81 -88 -81 -96 -98 -82 -87 -88 -83 -88 -83 -93 -87 -92 -98 -93 -98 -84 -98 -91 -98 -98 -84 -98 -98 -98 -98 -83 -95 -84 -83 -76 -98 -83 -98 -98 -65 -82 -52 -92 -81 -82 -91 -86 -82 -82 -96 -99 -98 -98 -97 -98 -90 -82 -84 -53 -81 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -95 -92 -98 -99 -92 -98 -98 -98 -98 -98 -92 -98 -98 -86 -97 -98 -98 -98 -98 -99 -98 -95 -98 -85 -98 -91 -93 -92 -91 -86 -98 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -94 -98 -97 -84 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -86 -98 -88 -98 -98 -98 -91 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -95 -99 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -99 -99 -98 -98 -98 -98 -98 -91 -98 -98 -98 -98 -88 -98 -97 -85 -81 -96 -98 -82 -83 -53 -98 -98 -99 -98 -81 -98 -92 -98 -90 -90 -93 -98 -98 -98 -98 -82 -98 -82 -82 -52 -82 -73 -98 -99 -82 -94 -84 -98 -98 -83 -84 -79 -83 -98 -82 -98 -98 -98 -94 -96 -83 -98 -88 -82 -99 -84 -84 -82 -82 -83 -81 -89 -99 -78 -83 -83 -98 -98 -98 -98 -98 -84 -83 -83 -83 -83 -83 -83 -88 -83 -41 -82 -98 -98 -98 -98 -98 -98 -93 -93 -91 -90 -88 -92 -91 -92 -99 -98 -98 -98 -99 -93 -92 -98 -99 -98 -98 -98 -99 -93 -82 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -92 -92 -94 -94 -93 -89 -92 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -93 -98 -99 -98 -99 -98 -98 -98 -98 -98 -92 -98 -82 -81 -98 -97 -83 -96 -83 -98 -97 -99 -98 -97 -98 -99 -98 -92 -98 -98 -93 -98 -92 -99 -83 -81 -83 -86 -81 -98 -88 -88 -89 -79 -81 -98 -77 -82 -86 -97 -82 -82 -71 -82 -98 -82 -85 -82 -83 -82 -82 -98 -98 -98 -83 -98 -98 -94 -94 -98 -91 -84 -88 -84 -99 -98 -99 -98 -98 -98 -95 -98 -98 -98 -89 -90 -90 -90 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -97 -95 -95 -83 -91 -82 -71 -82 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -91 -98 -99 -98 -98 -98 -98 -97 -88 -98 -98 -98 -97 -99 -98 -98 -98 -98 -79 -97 -92 -90 -90 -92 -91 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -94 -82 -98 -98 -97 -98 -98 -98 -97 -98 -98 -98 -97 -95 -98 -97 -98 -82 -86 -82 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -97 -95 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -82 -98 -82 -98 -98 -99 -98 -98 -98 -82 -98 -82 -82 -82 -99 -83 -58 -98 -83 -83 -52 -85 -98 -98 -98 -99 -99 -98 -99 -98 -79 -93 -91 -91 -93 -93 -89 -93 -94 -98 -93 -93 -98 -98 -99 -99 -98 -98 -98 -98 -93 -90 -98 -91 -97 -99 -98 -98 -98 -98 -98 -98 -98 -96 -94 -98 -98 -84 -82 -83 -82 -83 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -95 -98 -98 -98 -94 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -98 -97 -86 -86 -99 -98 -98 -98 -98 -99 -98 -98 -98 -79 -87 -89 -91 -88 -84 -86 -98 -86 -86 -98 -98 -82 -83 -93 -83 -83 -81 -88 -98 -98 -84 -84 -87 -88 -86 -98 -98 -98 -99 -98 -98 -98 -98 -91 -99 -98 -87 -88 -86 -94 -98 -83 -83 -83 -82 -64 -98 -98 -98 -98 -82 -83 -94 -83 -83 -68 -83 -81 -82 -82 -54 -82 -82 -74 -82 -82 -97 -82 -82 -98 -98 -98 -98 -99 -97 -95 -98 -97 -98 -91 -96 -98 -98 -99 -97 -94 -97 -84 -85 -86 -92 -98 -98 -98 -98 -98 -93 -98 -91 -99 -98 -98 -99 -98 -99 -98 -98 -98 -91 -98 -98 -94 -98 -89 -99 -98 -99 -98 -98 -98 -98 -98 -98 -96 -98 -98 -90 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -99 -98 -98 -98 -99 -98 -93 -94 -92 -97 -98 -98 -98 -98 -93 -98 -94 -93 -99 -99 -82 -83 -88 -82 -82 -47 -91 -84 -83 -98 -98 -99 -93 -98 -91 -91 -91 -87 -92 -98 -97 -97 -92 -96 -98 -98 -98 -98 -99 -99 -83 -83 -59 -83 -83 -98 -83 -83 -83 -98 -82 -82 -96 -98 -99 -98 -94 -82 -82 -82 -82 -82 -67 -82 -82 -82 -91 -82 -82 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -76 -98 -99 -98 -89 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -91 -98 -98 -98 -98 -99 -98 -82 -80 -84 -86 -81 -81 -87 -86 -86 -87 -87 -92 -93 -93 -88 -91 -93 -93 -81 -82 -76 -82 -82 -82 -89 -98 -98 -98 -98 -98 -98 -98 -99 -94 -87 -82 -98 -90 -98 -98 -99 -98 -98 -98 -98 -99 -92 -99 -98 -98 -89 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -82 -82 -82 -82 -69 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -93 -98 -98 -98 -97 -98 -98 -97 -88 -82 -82 -85 -83 -84 -83 -83 -47 -83 -82 -79 -90 -89 -89 -91 -91 -93 -91 -91 -91 -91 -91 -99 -98 -83 -83 -83 -83 -59 -83 -83 -97 -82 -98 -82 -83 -82 -83 -48 -91 -99 -98 -98 -99 -91 -98 -98 -98 -97 -98 -98 -99 -98 -98 -99 -98 -99 -98 -98 -98 -98 -99 -96 -98 -98 -98 -98 -98 -97 -97 -98 -98 -99 -98 -98 -98 -98 -98 -99 -97 -99 -98 -98 -98 -97 -98 -98 -98 -99 -92 -82 -82 -99 -83 -83 -83 -90 -84 -82 -86 -85 -87 -87 -85 -86 -86 -85 -85 -86 -79 -90 -93 -93 -94 -93 -93 -98 -99 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -93 -94 -99 -84 -97 -98 -89 -98 -98 -98 -98 -98 -98 -94 -99 -98 -98 -89 -83 -83 -98 -84 -84 -97 -98 -97 -92 -99 -99 -89 -90 -99 -98 -98 -99 -98 -99 -92 -98 -98 -98 -98 -98 -98 -99 -98 -83 -83 -78 -83 -83 -82 -83 -83 -83 -98 -82 -82 -98 -91 -98 -98 -98 -98 -98 -98 -98 -86 -87 -97 -99 -98 -98 -98 -98 -98 -98 -98 -83 -82 -90 -56 -90 -89 -90 -90 -91 -91 -91 -91 -91 -83 -83 -97 -83 -83 -81 -66 -82 -82 -47 -96 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -92 -98 -98 -98 -89 -98 -97 -99 -98 -96 -98 -98 -98 -97 -89 -98 -98 -98 -98 -98 -97 -95 -96 -98 -98 -98 -98 -98 -98 -96 -86 -98 -86 -86 -86 -87 -87 -87 -88 -87 -88 -88 -93 -78 -90 -91 -92 -98 -98 -97 -98 -98 -87 -82 -83 -82 -82 -63 -83 -83 -98 -82 -83 -99 -82 -83 -99 -89 -98 -98 -94 -92 -98 -98 -63 -91 -98 -98 -94 -98 -98 -83 -83 -98 -84 -82 -82 -82 -82 -82 -98 -82 -82 -68 -99 -83 -82 -98 -82 -82 -57 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -99 -97 -98 -97 -99 -98 -98 -97 -86 -91 -98 -98 -98 -98 -98 -98 -99 -98 -94 -94 -90 -91 -90 -90 -90 -82 -82 -61 -90 -76 -82 -82 -90 -91 -90 -90 -98 -98 -98 -82 -82 -98 -98 -89 -98 -90 -99 -98 -98 -98 -99 -83 -82 -82 -82 -82 -81 -98 -99 -99 -98 -89 -83 -83 -83 -83 -82 -82 -82 -82 -82 -94 -98 -83 -82 -99 -82 -82 -99 -98 -82 -82 -98 -82 -83 -50 -82 -82 -71 -90 -97 -90 -97 -98 -98 -98 -98 -97 -90 -98 -98 -98 -98 -98 -98 -98 -87 -84 -84 -82 -87 -88 -86 -87 -86 -86 -86 -86 -85 -85 -85 -80 -78 -95 -87 -82 -82 -93 -95 -98 -98 -98 -98 -97 -83 -82 -82 -84 -93 -97 -83 -97 -91 -91 -86 -97 -88 -83 -82 -83 -82 -82 -82 -83 -98 -89 -82 -82 -92 -82 -82 -98 -82 -82 -82 -82 -83 -98 -83 -83 -94 -92 -95 -94 -98 -98 -94 -96 -92 -98 -98 -98 -99 -98 -98 -98 -99 -98 -87 -98 -85 -91 -94 -93 -98 -98 -98 -94 -98 -99 -98 -98 -98 -88 -84 -85 -91 -82 -98 -99 -99 -98 -41 -82 -82 -78 -82 -82 -82 -82 -82 -82 -83 -82 -81 -92 -85 -92 -92 -92 -92 -82 -82 -68 -83 -82 -96 -82 -82 -82 -82 -82 -81 -99 -87 -79 -98 -83 -82 -82 -92 -82 -82 -98 -98 -88 -55 -81 -82 -98 -83 -82 -66 -97 -87 -86 -99 -98 -95 -99 -98 -99 -98 -98 -82 -82 -63 -82 -82 -53 -98 -99 -98 -98 -98 -98 -98 -98 -94 -98 -98 -93 -98 -98 -99 -92 -99 -86 -98 -98 -99 -95 -99 -97 -86 -81 -81 -81 -80 -84 -99 -82 -82 -98 -77 -82 -59 -82 -82 -98 -98 -99 -66 -83 -82 -97 -98 -98 -98 -98 -99 -98 -99 -98 -98 -82 -83 -94 -83 -93 -83 -82 -59 -93 -98 -98 -98 -98 -95 -98 -98 -98 -89 -98 -99 -98 -97 -98 -97 -96 -85 -98 -98 -98 -94 -94 -99 -92 -95 -98 -94 -92 -98 -98 -98 -94 -98 -92 -94 -93 -91 -98 -98 -94 -94 -92 -91 -99 -93 -99 -97 -98 -98 -98 -91 -99 -99 -98 -98 -99 -98 -90 -82 -82 -82 -91 -95 -95 -82 -83 -93 -82 -82 -82 -67 -82 -82 -98 -98 -83 -82 -98 -56 -82 -83 -47 -93 -82 -83 -92 -82 -82 -97 -98 -98 -97 -89 -97 -71 -77 -82 -82 -94 -95 -82 -82 -98 -82 -82 -79 -98 -98 -82 -83 -94 -98 -58 -83 -82 -83 -82 -82 -83 -83 -83 -87 -92 -98 -82 -82 -82 -82 -82 -82 -98 -82 -82 -87 -88 -81 -81 -83 -88 -98 -99 -98 -98 -79 -98 -92 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -99 -98 -94 -97 -82 -98 -95 -99 -48 -98 -98 -98 -98 -82 -82 -82 -82 -82 -82 -90 -82 -82 -86 -82 -82 -97 -98 -98 -98 -98 -98 -85 -82 -82 -82 -82 -83 -82 -82 -82 -82 -100 -99 -82 -82 -98 -82 -82 -98 -98 -95 -82 -82 -79 -82 -82 -98 -98 -82 -83 -56 -92 -98 -98 -98 -98 -98 -98 -93 -98 -81 -82 -99 -81 -82 -98 -98 -99 -98 -99 -94 -82 -82 -91 -91 -91 -91 -91 -83 -83 -82 -82 -82 -82 -43 -98 -98 -98 -99 -98 -82 -82 -71 -90 -82 -82 -82 -82 -82 -82 -82 -82 -98 -94 -82 -82 -98 -43 -81 -82 -78 -98 -98 -98 -98 -82 -82 -82 -99 -98 -98 -98 -98 -94 -98 -98 -99 -98 -97 -98 -98 -98 -87 -98 -98 -98 -95 -90 -98 -97 -98 -99 -98 -98 -98 -98 -97 -98 -98 -99 -90 -98 -99 -98 -98 -98 -98 -98 -86 -91 -87 -86 -91 -87 -98 -98 -98 -98 -78 -94 -92 -89 -96 -94 -98 -98 -98 -98 -98 -98 -82 -82 -98 -82 -82 -99 -99 -98 -98 -98 -93 -93 -92 -97 -97 -98 -99 -99 -98 -98 -82 -82 -92 -82 -82 -89 -98 -93 -99 -98 -98 -82 -82 -82 -98 -82 -82 -56 -99 -99 -82 -82 -95 -88 -83 -82 -98 -98 -99 -98 -98 -86 -81 -82 -98 -98 -94 -98 -91 -98 -98 -98 -99 -99 -98 -98 -98 -98 -95 -96 -91 -96 -94 -91 -94 -91 -97 -88 -98 -98 -98 -99 -98 -98 -98 -98 -82 -78 -45 -82 -81 -90 -82 -82 -98 -82 -82 -85 -82 -81 -78 -98 -98 -98 -90 -98 -98 -99 -94 -82 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -91 -98 -99 -95 -98 -98 -98 -98 -98 -98 -94 -92 -98 -98 -98 -98 -98 -98 -95 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -91 -98 -98 -98 -97 -99 -99 -98 -98 -98 -99 -97 -91 -98 -98 -98 -98 -98 -81 -81 -90 -81 -81 -89 -98 -81 -81 -81 -81 -81 -98 -90 -94 -90 -98 -95 -98 -98 -81 -81 -98 -98 -98 -81 -81 -97 -98 -81 -81 -99 -98 -83 -83 -83 -82 -94 -82 -82 -99 -98 -95 -94 -94 -94 -98 -92 -92 -92 -92 -92 -95 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -91 -98 -83 -83 -63 -82 -83 -62 -81 -82 -98 -92 -83 -83 -86 -98 -98 -98 -78 -96 -91 -90 -90 -90 -90 -90 -91 -93 -94 -98 -93 -94 -98 -98 -99 -99 -98 -98 -98 -91 -94 -97 -88 -99 -98 -98 -97 -98 -98 -98 -98 -98 -99 -97 -91 -98 -90 -90 -90 -90 -92 -97 -98 -95 -98 -99 -98 -98 -99 -97 -98 -99 -94 -97 -89 -98 -98 -90 -97 -97 -82 -83 -83 -98 -82 -83 -98 -98 -92 -98 -98 -98 -98 -99 -98 -98 -97 -97 -88 -83 -83 -83 -83 -82 -83 -88 -81 -80 -80 -81 -80 -83 -86 -86 -81 -86 -88 -86 -78 -92 -91 -94 -94 -91 -94 -98 -97 -98 -95 -98 -98 -98 -93 -98 -99 -98 -98 -99 -93 -98 -99 -94 -80 -98 -99 -99 -98 -83 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -98 -81 -81 -81 -81 -81 -81 -98 -83 -83 -83 -83 -83 -83 -99 -97 -81 -81 -81 -81 -81 -80 -98 -88 -98 -98 -83 -83 -83 -82 -83 -82 -89 -83 -83 -83 -81 -81 -82 -98 -80 -81 -81 -81 -81 -81 -87 -83 -82 -81 -82 -82 -82 -97 -99 -91 -78 -82 -83 -82 -83 -85 -90 -91 -92 -91 -91 -80 -81 -81 -81 -79 -81 -88 -98 -86 -88 -92 -98 -80 -86 -88 -83 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -48 -81 -81 -81 -80 -81 -81 -97 -97 -83 -83 -83 -83 -83 -83 -45 -41 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -99 -98 -83 -83 -83 -83 -82 -83 -81 -81 -80 -79 -80 -80 -88 -98 -98 -97 -98 -99 -98 -78 -81 -81 -81 -81 -81 -81 -90 -81 -81 -81 -81 -81 -76 -91 -92 -83 -83 -83 -83 -83 -83 -92 -98 -91 -82 -82 -83 -82 -82 -83 -82 -61 -91 -82 -82 -82 -82 -83 -82 -98 -98 -98 -94 -94 -92 -82 -83 -83 -82 -83 -83 -93 -83 -83 -83 -83 -83 -85 -98 -95 -91 -91 -94 -98 -98 -98 -98 -98 -91 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -94 -98 -98 -98 -99 -99 -98 -98 -98 -86 -99 -98 -99 -98 -98 -92 -98 -98 -98 -79 -93 -91 -91 -90 -90 -98 -91 -93 -99 -98 -98 -83 -83 -83 -82 -82 -82 -83 -82 -83 -82 -82 -83 -41 -83 -81 -83 -82 -82 -82 -82 -83 -92 -92 -95 -98 -98 -93 -92 -98 -98 -99 -98 -98 -98 -98 -83 -83 -83 -83 -83 -83 -95 -82 -83 -83 -83 -83 -83 -99 -91 -81 -80 -81 -81 -81 -81 -64 -98 -80 -81 -83 -83 -77 -82 -82 -82 -82 -83 -83 -83 -83 -82 -83 -98 -98 -98 -80 -80 -80 -81 -80 -81 -90 -81 -81 -81 -81 -81 -81 -80 -49 -98 -80 -81 -79 -81 -81 -80 -81 -91 -83 -82 -83 -82 -83 -82 -92 -82 -83 -82 -81 -82 -82 -98 -98 -98 -95 -93 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -96 -94 -94 -94 -92 -91 -91 -95 -96 -99 -98 -98 -98 -96 -85 -98 -98 -98 -98 -98 -99 -98 -92 -98 -92 -97 -92 -90 -90 -91 -82 -82 -82 -82 -82 -82 -83 -77 -82 -83 -82 -82 -93 -96 -98 -81 -80 -81 -81 -81 -81 -92 -81 -80 -80 -81 -81 -80 -98 -94 -89 -81 -81 -81 -81 -81 -74 -98 -81 -81 -81 -81 -81 -81 -99 -82 -82 -83 -82 -82 -82 -89 -82 -82 -82 -82 -82 -71 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -82 -82 -82 -82 -82 -83 -98 -83 -83 -81 -81 -81 -80 -79 -80 -80 -79 -80 -80 -86 -84 -78 -82 -95 -92 -92 -95 -91 -98 -95 -98 -93 -98 -98 -98 -98 -98 -98 -92 -98 -93 -98 -98 -83 -81 -89 -83 -98 -92 -80 -92 -82 -82 -82 -82 -82 -82 -81 -82 -82 -81 -82 -82 -41 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -87 -81 -80 -81 -81 -81 -71 -80 -81 -80 -81 -81 -81 -92 -81 -81 -81 -81 -81 -77 -98 -98 -91 -98 -98 -99 -92 -98 -98 -98 -91 -79 -81 -81 -81 -81 -81 -92 -83 -83 -83 -82 -82 -83 -90 -90 -91 -92 -90 -92 -90 -92 -98 -82 -82 -82 -82 -82 -82 -81 -80 -81 -81 -81 -81 -41 -89 -81 -81 -80 -81 -81 -81 -82 -81 -80 -81 -81 -81 -88 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -51 -82 -82 -82 -82 -82 -82 -98 -99 -98 -98 -98 -90 -91 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -92 -97 -98 -95 -98 -91 -99 -98 -98 -98 -98 -98 -97 -86 -96 -98 -87 -87 -86 -88 -87 -87 -98 -78 -95 -90 -90 -97 -96 -91 -98 -92 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -92 -98 -99 -92 -82 -91 -92 -98 -98 -86 -98 -83 -82 -82 -82 -82 -82 -99 -82 -82 -80 -82 -80 -81 -98 -97 -98 -98 -98 -98 -99 -96 -98 -92 -98 -94 -98 -98 -98 -99 -98 -82 -82 -82 -82 -82 -82 -91 -98 -91 -98 -88 -81 -81 -81 -81 -81 -89 -98 -98 -92 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -80 -81 -82 -92 -98 -82 -82 -83 -82 -78 -82 -93 -92 -91 -80 -91 -99 -98 -99 -82 -82 -83 -82 -98 -99 -82 -82 -82 -82 -83 -82 -90 -83 -82 -83 -82 -82 -69 -82 -82 -82 -82 -82 -82 -89 -82 -83 -82 -82 -83 -77 -79 -83 -83 -83 -82 -82 -83 -48 -98 -96 -96 -98 -98 -96 -91 -98 -92 -98 -91 -99 -98 -96 -85 -86 -89 -98 -98 -98 -99 -98 -99 -97 -99 -87 -93 -91 -93 -98 -99 -97 -99 -93 -98 -98 -98 -98 -98 -82 -82 -83 -82 -82 -82 -82 -82 -81 -81 -81 -82 -99 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -91 -91 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -94 -98 -94 -82 -81 -82 -82 -83 -81 -83 -81 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -80 -82 -81 -81 -82 -82 -82 -91 -80 -80 -80 -80 -80 -80 -79 -79 -80 -80 -80 -80 -85 -91 -80 -80 -80 -80 -80 -76 -81 -80 -81 -81 -81 -80 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -84 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -57 -98 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -81 -80 -98 -96 -95 -92 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -41 -98 -82 -82 -82 -82 -78 -82 -82 -82 -82 -82 -82 -82 -48 -92 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -94 -93 -83 -59 -92 -82 -82 -82 -82 -83 -83 -83 -82 -82 -82 -83 -82 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -53 -81 -80 -80 -81 -81 -81 -80 -80 -80 -81 -80 -80 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -82 -82 -83 -82 -82 -82 -82 -82 -82 -80 -81 -82 -92 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -92 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -51 -84 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -82 -82 -82 -83 -82 -82 -82 -83 -82 -82 -82 -82 -82 -99 -41 -98 -98 -99 -53 -82 -82 -82 -82 -83 -82 -83 -82 -83 -82 -81 -82 -58 -80 -82 -82 -82 -82 -82 -83 -81 -82 -83 -80 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -79 -86 -80 -80 -81 -81 -81 -81 -78 -81 -81 -80 -81 -81 -93 -83 -83 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -41 -98 -82 -82 -82 -82 -82 -82 -83 -83 -82 -82 -82 -82 -99 -80 -94 -99 -95 -98 -80 -80 -80 -79 -81 -81 -81 -81 -81 -81 -81 -81 -41 -98 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -81 -48 -80 -80 -80 -80 -80 -80 -80 -77 -81 -81 -81 -81 -76 -83 -82 -83 -82 -82 -82 -83 -82 -83 -82 -83 -83 -77 -98 -98 -90 -94 -98 -93 -91 -93 -93 -93 -94 -93 -69 -86 -93 -90 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -93 -93 -81 -80 -80 -81 -81 -80 -81 -81 -81 -81 -81 -80 -98 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -80 -80 -95 -83 -82 -82 -83 -83 -83 -82 -82 -83 -83 -83 -82 -82 -83 -82 -81 -81 -82 -81 -81 -81 -82 -81 -81 -41 -81 -81 -81 -81 -78 -81 -80 -81 -81 -81 -81 -81 -85 -79 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -81 -98 -83 -90 -82 -92 -82 -88 -81 -96 -95 -94 -94 -82 -89 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -68 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -41 -82 -82 -82 -82 -80 -82 -82 -82 -82 -82 -83 -82 -93 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -84 -91 -93 -91 -91 -93 -92 -91 -92 -91 -91 -91 -91 -91 -91 -92 -88 -92 -92 -91 -92 -92 -79 -92 -94 -92 -89 -92 -93 -92 -92 -92 -92 -94 -92 -90 -82 -98 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -83 -83 -93 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -83 -95 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -95 -92 -94 -85 -85 -86 -86 -89 -86 -86 -85 -85 -86 -84 -84 -84 -84 -79 -98 -92 -92 -98 -93 -93 -98 -92 -92 -93 -98 -98 -93 -89 -92 -92 -92 -83 -82 -92 -90 -87 -91 -97 -67 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -97 -94 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -91 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -52 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -41 -81 -81 -80 -80 -80 -81 -81 -81 -80 -81 -81 -80 -94 -95 -92 -82 -82 -82 -81 -81 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -84 -89 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -89 -82 -82 -82 -82 -82 -82 -81 -82 -81 -81 -81 -76 -85 -79 -80 -80 -80 -80 -76 -82 -82 -98 -97 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -81 -83 -44 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -96 -86 -82 -82 -81 -82 -82 -83 -82 -82 -82 -82 -82 -82 -98 -80 -80 -80 -80 -80 -80 -78 -80 -80 -80 -80 -80 -98 -98 -68 -82 -83 -83 -81 -81 -82 -82 -82 -82 -83 -82 -76 -70 -82 -81 -82 -82 -83 -82 -82 -82 -82 -82 -79 -83 -94 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -83 -82 -91 -91 -68 -82 -91 -91 -82 -82 -82 -82 -82 -82 -83 -83 -82 -82 -83 -82 -98 -82 -83 -83 -82 -83 -82 -82 -83 -82 -82 -82 -82 -83 -82 -82 -82 -80 -82 -82 -82 -82 -82 -82 -83 -60 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -57 -41 -95 -95 -99 -97 -95 -92 -79 -81 -80 -80 -81 -81 -79 -80 -80 -81 -80 -80 -91 -85 -90 -93 -82 -82 -83 -83 -82 -82 -82 -83 -83 -82 -83 -83 -98 -86 -85 -97 -91 -98 -95 -82 -98 -94 -43 -82 -83 -82 -82 -82 -82 -82 -82 -83 -82 -83 -82 -92 -82 -82 -82 -82 -82 -83 -82 -82 -82 -83 -82 -85 -94 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -90 -81 -80 -81 -81 -81 -81 -80 -81 -80 -80 -80 -80 -92 -83 -83 -83 -83 -83 -77 -82 -83 -82 -83 -83 -83 -92 -91 -91 -92 -93 -91 -82 -81 -82 -82 -82 -82 -83 -82 -82 -82 -83 -82 -56 -83 -83 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -41 -98 -83 -82 -83 -82 -82 -82 -82 -83 -82 -82 -82 -83 -72 -88 -83 -83 -82 -82 -83 -83 -83 -82 -82 -83 -83 -76 -93 -83 -80 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -91 -82 -82 -82 -83 -83 -83 -83 -83 -81 -81 -81 -81 -48 -81 -82 -81 -81 -82 -82 -83 -82 -82 -82 -82 -83 -98 -82 -82 -82 -82 -83 -82 -82 -83 -82 -82 -82 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -94 -98 -98 -83 -90 -99 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -80 -81 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -98 -98 -82 -82 -83 -83 -82 -83 -82 -82 -82 -83 -82 -82 -98 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -81 -95 -98 -82 -82 -83 -82 -82 -83 -82 -78 -83 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -91 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -83 -82 -41 -93 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -94 -83 -82 -82 -82 -82 -82 -83 -83 -82 -82 -83 -83 -85 -92 -80 -80 -80 -79 -80 -80 -79 -80 -80 -80 -80 -81 -43 -78 -98 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -81 -80 -80 -80 -80 -81 -81 -81 -81 -80 -98 -41 -98 -98 -80 -80 -98 -81 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -80 -80 -91 -98 -80 -80 -80 -81 -80 -80 -80 -80 -80 -81 -81 -80 -98 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -99 -98 -98 -98 -98 -92 -98 -98 -98 -98 -99 -98 -82 -82 -82 -83 -83 -82 -82 -82 -82 -82 -82 -82 -78 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -48 -88 -89 -92 -92 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -80 -80 -81 -80 -80 -80 -80 -80 -81 -80 -53 -74 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -93 -98 -80 -80 -81 -80 -79 -80 -80 -81 -80 -80 -81 -81 -81 -77 -81 -80 -81 -81 -81 -80 -80 -81 -81 -81 -44 -91 -80 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -98 -83 -87 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -99 -83 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -77 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -98 -83 -82 -82 -82 -83 -80 -83 -83 -83 -83 -82 -82 -82 -99 -82 -77 -83 -82 -82 -83 -82 -82 -81 -82 -82 -82 -98 -84 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -63 -97 -94 -94 -98 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -85 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -86 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -82 -83 -82 -83 -83 -83 -79 -82 -82 -82 -80 -83 -84 -95 -92 -99 -97 -83 -82 -83 -82 -83 -82 -83 -82 -83 -82 -81 -83 -83 -98 -91 -89 -87 -81 -82 -82 -83 -82 -82 -82 -82 -81 -83 -82 -82 -44 -81 -82 -82 -83 -82 -82 -83 -83 -82 -82 -82 -83 -94 -99 -98 -98 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -77 -72 -93 -80 -76 -80 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -93 -99 -41 -40 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -94 -40 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -41 -80 -80 -80 -80 -80 -80 -81 -81 -81 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -98 -82 -82 -82 -82 -81 -80 -81 -81 -82 -83 -83 -82 -98 -99 -94 -80 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -92 -91 -99 -81 -80 -80 -80 -80 -81 -80 -80 -80 -81 -80 -80 -49 -80 -90 -99 -85 -81 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -84 -93 -81 -76 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -76 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -63 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -77 -80 -84 -80 -80 -80 -76 -90 -92 -91 -91 -91 -91 -80 -98 -81 -99 -98 -97 -98 -98 -99 -93 -89 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -92 -80 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -93 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -82 -83 -82 -82 -83 -83 -80 -81 -82 -81 -41 -98 -82 -82 -83 -82 -78 -82 -83 -82 -82 -83 -83 -83 -98 -98 -86 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -89 -85 -98 -83 -62 -81 -80 -81 -80 -80 -81 -81 -80 -80 -80 -81 -83 -98 -80 -81 -79 -80 -80 -81 -79 -81 -79 -80 -80 -81 -89 -80 -80 -80 -80 -80 -80 -80 -81 -80 -81 -80 -80 -70 -98 -91 -98 -98 -99 -98 -98 -98 -98 -98 -98 -93 -91 -92 -91 -98 -98 -98 -98 -99 -88 -85 -91 -91 -95 -92 -91 -95 -98 -98 -98 -79 -90 -92 -95 -93 -93 -93 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -96 -56 -98 -93 -80 -80 -99 -95 -94 -93 -82 -87 -83 -83 -82 -82 -83 -82 -83 -82 -82 -83 -82 -83 -80 -83 -83 -83 -83 -83 -81 -82 -83 -82 -82 -83 -82 -98 -82 -82 -82 -83 -82 -83 -82 -82 -83 -82 -82 -82 -93 -82 -82 -83 -82 -83 -82 -83 -82 -83 -82 -83 -83 -98 -98 -93 -93 -91 -93 -94 -86 -87 -87 -85 -80 -79 -80 -80 -80 -77 -80 -80 -80 -80 -80 -81 -91 -83 -82 -83 -82 -82 -82 -82 -82 -82 -83 -82 -83 -82 -88 -82 -82 -82 -82 -82 -82 -82 -82 -82 -80 -80 -81 -81 -80 -80 -80 -80 -57 -98 -92 -98 -98 -91 -98 -98 -98 -98 -96 -85 -89 -94 -91 -80 -80 -80 -81 -81 -80 -80 -80 -80 -81 -80 -77 -80 -80 -80 -80 -80 -81 -81 -81 -81 -77 -80 -80 -40 -91 -91 -91 -91 -91 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -95 -97 -94 -82 -82 -82 -77 -82 -83 -82 -82 -83 -82 -83 -84 -82 -83 -82 -83 -82 -82 -82 -82 -82 -83 -82 -82 -41 -83 -82 -82 -82 -82 -82 -83 -83 -82 -83 -82 -82 -41 -92 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -83 -92 -98 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -41 -81 -81 -82 -81 -81 -82 -83 -82 -82 -80 -83 -82 -95 -91 -80 -99 -88 -80 -81 -80 -80 -80 -81 -80 -80 -81 -81 -81 -80 -93 -94 -83 -91 -92 -94 -64 -82 -83 -83 -83 -83 -83 -82 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -83 -83 -82 -82 -51 -90 -82 -83 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -72 -83 -81 -81 -80 -80 -81 -80 -80 -81 -80 -80 -81 -80 -98 -82 -82 -83 -83 -83 -82 -82 -82 -81 -82 -82 -83 -41 -82 -83 -83 -83 -83 -78 -83 -83 -83 -83 -82 -83 -91 -91 -90 -93 -90 -90 -92 -94 -91 -98 -94 -84 -86 -91 -84 -91 -98 -82 -92 -98 -83 -83 -82 -83 -82 -82 -83 -83 -83 -83 -83 -82 -92 -82 -82 -82 -83 -82 -83 -83 -83 -83 -82 -83 -83 -41 -85 -82 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -66 -83 -83 -82 -82 -82 -83 -82 -81 -81 -83 -82 -82 -41 -98 -83 -82 -82 -82 -80 -83 -83 -83 -83 -82 -81 -82 -83 -82 -82 -81 -82 -82 -83 -78 -81 -82 -82 -83 -41 -98 -98 -99 -81 -80 -80 -81 -80 -81 -81 -81 -80 -81 -81 -80 -93 -98 -83 -42 -82 -83 -83 -83 -83 -82 -82 -82 -82 -82 -82 -82 -94 -96 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -65 -80 -80 -80 -80 -80 -80 -80 -81 -80 -81 -81 -81 -98 -80 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -81 -98 -85 -98 -84 -91 -93 -82 -82 -82 -83 -83 -81 -83 -83 -83 -83 -83 -83 -64 -83 -83 -78 -82 -82 -82 -83 -82 -82 -82 -82 -82 -91 -91 -61 -98 -96 -82 -82 -82 -82 -82 -82 -82 -82 -83 -83 -83 -82 -82 -83 -82 -82 -83 -82 -82 -83 -83 -82 -82 -81 -82 -41 -83 -99 -83 -83 -83 -83 -83 -83 -82 -83 -82 -82 -83 -83 -96 -83 -82 -83 -83 -83 -83 -83 -82 -82 -82 -82 -82 -40 -80 -80 -80 -80 -80 -80 -82 -82 -83 -83 -83 -83 -83 -83 -98 -98 -98 -98 -98 -98 -98 -99 -46 -99 -81 -80 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -42 -80 -98 -80 -91 -95 -98 -98 -95 -98 -80 -80 -80 -80 -80 -81 -80 -80 -81 -81 -80 -80 -85 -80 -80 -80 -81 -81 -81 -80 -80 -80 -81 -80 -80 -98 -92 -83 -98 -83 -83 -83 -83 -81 -83 -83 -80 -82 -83 -83 -82 -98 -90 -83 -83 -83 -82 -82 -81 -83 -83 -83 -83 -83 -77 -82 -82 -83 -78 -83 -82 -82 -83 -83 -82 -82 -82 -98 -99 -93 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -80 -86 -98 -80 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -44 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -93 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -65 -44 -51 -89 -94 -53 -52 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -60 -87 -88 -88 -80 -91 -93 -82 -98 -77 -80 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -69 -91 -97 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -81 -80 -98 -98 -98 -98 -99 -98 -83 -88 -82 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -95 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -98 -99 -83 -83 -83 -82 -82 -82 -83 -83 -79 -83 -83 -83 -83 -82 -82 -82 -83 -83 -82 -83 -82 -82 -82 -83 -99 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -95 -94 -93 -90 -91 -98 -91 -91 -91 -91 -99 -82 -83 -82 -83 -83 -82 -83 -83 -83 -83 -82 -83 -92 -82 -83 -82 -82 -83 -83 -82 -82 -82 -83 -83 -82 -98 -83 -98 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -97 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -41 -82 -83 -83 -83 -83 -83 -82 -82 -83 -82 -82 -82 -87 -88 -87 -83 -82 -83 -83 -78 -83 -83 -82 -82 -83 -83 -83 -41 -88 -40 -83 -82 -82 -82 -83 -83 -83 -83 -83 -83 -82 -83 -42 -83 -83 -88 -83 -83 -82 -83 -83 -83 -83 -83 -82 -82 -82 -82 -83 -94 -93 -83 -83 -83 -83 -83 -83 -83 -82 -81 -82 -82 -81 -68 -99 -83 -83 -82 -83 -82 -83 -83 -83 -83 -83 -82 -82 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -84 -98 -98 -91 -98 -93 -87 -92 -99 -80 -81 -81 -81 -81 -81 -81 -76 -81 -81 -81 -81 -81 -92 -92 -80 -80 -80 -80 -80 -80 -80 -80 -81 -83 -83 -83 -83 -82 -83 -83 -83 -83 -41 -83 -82 -83 -82 -83 -83 -83 -82 -83 -83 -83 -83 -41 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -82 -83 -79 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -63 -82 -69 -80 -98 -80 -68 -98 -98 -73 -61 -92 -90 -91 -93 -93 -93 -93 -98 -98 -98 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -92 -81 -98 -90 -85 -85 -80 -96 -90 -98 -80 -80 -80 -80 -80 -81 -80 -80 -81 -81 -80 -80 -98 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -71 -84 -82 -83 -82 -82 -82 -83 -83 -82 -83 -83 -83 -82 -98 -82 -83 -82 -83 -82 -82 -82 -83 -82 -83 -82 -82 -95 -98 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -77 -57 -89 -90 -93 -93 -93 -99 -99 -98 -98 -96 -98 -98 -98 -99 -98 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -81 -80 -52 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -86 -98 -85 -81 -99 -86 -98 -82 -75 -82 -83 -83 -83 -83 -83 -83 -99 -99 -83 -82 -82 -81 -83 -81 -82 -82 -83 -83 -83 -83 -80 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -48 -83 -83 -82 -82 -82 -81 -83 -82 -83 -83 -82 -83 -40 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -47 -88 -98 -82 -83 -83 -83 -83 -82 -82 -82 -83 -83 -83 -82 -98 -87 -95 -90 -98 -95 -83 -82 -83 -83 -81 -83 -82 -82 -83 -82 -82 -82 -67 -99 -91 -82 -99 -83 -62 -53 -40 -83 -83 -82 -83 -82 -83 -82 -82 -83 -82 -83 -83 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -81 -81 -81 -80 -79 -81 -80 -80 -40 -98 -83 -83 -83 -83 -80 -83 -82 -82 -82 -83 -83 -83 -41 -98 -83 -83 -82 -82 -83 -83 -83 -82 -83 -83 -82 -83 -54 -98 -95 -83 -82 -83 -83 -82 -83 -83 -83 -82 -83 -82 -82 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -50 -83 -82 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -88 -98 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -83 -83 -83 -82 -83 -60 -93 -92 -94 -98 -88 -82 -57 -81 -80 -83 -81 -81 -80 -81 -81 -82 -82 -79 -81 -94 -93 -98 -80 -80 -80 -80 -81 -80 -80 -81 -80 -80 -80 -81 -71 -80 -80 -80 -77 -81 -81 -81 -81 -81 -81 -81 -80 -92 -98 -98 -84 -98 -94 -83 -81 -93 -91 -81 -82 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -95 -97 -98 -94 -98 -83 -83 -99 -91 -83 -81 -81 -83 -83 -82 -82 -83 -82 -83 -83 -83 -81 -80 -93 -84 -93 -82 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -80 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -95 -83 -83 -83 -83 -83 -83 -82 -83 -82 -83 -83 -83 -83 -82 -83 -83 -82 -83 -83 -83 -83 -81 -83 -83 -73 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -67 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -98 -83 -83 -83 -83 -83 -82 -81 -82 -82 -82 -82 -83 -98 -98 -80 -77 -80 -81 -81 -81 -81 -81 -81 -81 -80 -80 -91 -91 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -93 -92 -83 -83 -83 -83 -84 -83 -83 -82 -82 -82 -83 -85 -90 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -99 -98 -98 -81 -82 -83 -81 -83 -82 -83 -83 -83 -83 -83 -83 -69 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -98 -80 -80 -81 -80 -80 -79 -80 -80 -80 -80 -80 -80 -61 -98 -98 -81 -81 -80 -81 -81 -80 -80 -80 -80 -80 -81 -80 -91 -81 -81 -81 -80 -80 -81 -80 -80 -80 -81 -81 -81 -46 -91 -98 -80 -80 -80 -81 -81 -81 -81 -80 -81 -80 -81 -80 -80 -92 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -72 -83 -83 -83 -84 -83 -83 -83 -83 -84 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -81 -81 -81 -81 -80 -80 -80 -80 -80 -80 -85 -98 -99 -83 -84 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -45 -94 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -96 -83 -83 -99 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -82 -82 -62 -98 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -94 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -56 -98 -98 -83 -83 -82 -83 -83 -83 -83 -82 -83 -82 -83 -82 -98 -98 -98 -98 -91 -98 -98 -88 -98 -98 -98 -98 -94 -85 -80 -80 -80 -77 -80 -80 -80 -80 -80 -81 -80 -76 -92 -95 -92 -93 -93 -92 -98 -99 -98 -98 -92 -98 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -62 -98 -46 -80 -93 -80 -81 -81 -80 -81 -80 -81 -81 -81 -81 -80 -80 -98 -80 -80 -80 -80 -81 -80 -80 -80 -81 -80 -80 -81 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -80 -80 -94 -83 -83 -83 -82 -83 -83 -83 -83 -82 -83 -83 -83 -88 -86 -81 -81 -81 -81 -81 -80 -82 -82 -82 -83 -78 -82 -94 -80 -80 -83 -98 -98 -85 -92 -96 -95 -98 -80 -81 -81 -80 -81 -80 -80 -80 -80 -80 -80 -80 -45 -98 -80 -81 -80 -80 -80 -80 -80 -81 -81 -81 -81 -81 -98 -80 -80 -81 -80 -81 -80 -81 -81 -80 -80 -80 -81 -100 -81 -81 -80 -80 -80 -80 -81 -81 -81 -81 -80 -80 -81 -81 -80 -80 -80 -80 -80 -80 -77 -81 -80 -80 -41 -84 -93 -93 -93 -95 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -52 -84 -85 -91 -88 -99 -95 -93 -83 -83 -82 -83 -82 -82 -82 -82 -82 -82 -80 -83 -41 -85 -92 -98 -40 -98 -98 -88 -99 -98 -98 -98 -95 -98 -98 -98 -98 -92 -88 -95 -99 -85 -98 -97 -98 -98 -98 -98 -99 -97 -98 -83 -83 -82 -82 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -81 -82 -81 -81 -82 -82 -82 -83 -41 -83 -77 -82 -83 -83 -82 -82 -83 -83 -83 -83 -82 -41 -83 -82 -82 -83 -83 -83 -83 -82 -82 -82 -83 -83 -94 -98 -98 -83 -98 -92 -98 -98 -98 -83 -82 -83 -83 -83 -82 -83 -83 -83 -83 -83 -82 -83 -83 -81 -83 -83 -83 -83 -82 -83 -82 -83 -83 -63 -79 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -80 -80 -80 -81 -80 -80 -80 -80 -80 -81 -80 -80 -98 -84 -98 -83 -83 -83 -82 -83 -82 -82 -83 -83 -83 -83 -83 -83 -94 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -98 -82 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -67 -97 -98 -83 -81 -81 -80 -81 -81 -81 -80 -81 -81 -81 -81 -81 -91 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -98 -94 -92 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -81 -80 -41 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -40 -80 -85 -79 -83 -85 -87 -95 -99 -41 -56 -80 -81 -81 -80 -80 -81 -81 -54 -92 -81 -81 -81 -81 -80 -81 -81 -80 -81 -80 -81 -81 -41 -80 -81 -80 -80 -80 -81 -81 -81 -81 -80 -81 -80 -99 -79 -91 -77 -98 -98 -87 -98 -95 -80 -80 -80 -81 -80 -80 -80 -80 -80 -81 -80 -82 -96 -97 -80 -81 -81 -81 -80 -80 -81 -81 -81 -81 -81 -80 -98 -98 -98 -92 -91 -98 -98 -98 -84 -84 -83 -84 -84 -83 -84 -83 -84 -83 -83 -83 -96 -85 -83 -83 -83 -83 -83 -83 -83 -83 -83 -78 -83 -85 -92 -90 -92 -92 -92 -97 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -93 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -57 -87 -80 -81 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -62 -80 -81 -80 -80 -80 -80 -80 -81 -80 -80 -79 -80 -87 -83 -82 -83 -83 -83 -83 -80 -83 -83 -83 -83 -83 -41 -92 -98 -87 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -90 -97 -96 -80 -94 -81 -80 -80 -80 -81 -80 -80 -80 -80 -81 -81 -80 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -93 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -95 -98 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -54 -83 -83 -83 -83 -83 -83 -83 -81 -83 -83 -83 -83 -66 -95 -98 -83 -83 -78 -83 -82 -82 -83 -82 -82 -82 -82 -82 -83 -83 -83 -84 -83 -82 -83 -83 -82 -83 -83 -83 -97 -80 -98 -80 -80 -81 -81 -80 -80 -80 -81 -81 -81 -81 -81 -81 -40 -81 -80 -80 -80 -81 -81 -80 -80 -80 -81 -80 -80 -98 -83 -83 -84 -83 -84 -84 -84 -83 -83 -83 -83 -83 -96 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -83 -82 -98 -83 -83 -83 -82 -82 -83 -83 -82 -82 -82 -83 -80 -87 -83 -81 -80 -81 -83 -81 -81 -82 -83 -83 -80 -80 -84 -83 -79 -79 -79 -77 -80 -80 -80 -80 -80 -80 -80 -80 -63 -98 -98 -94 -86 -98 -98 -98 -98 -84 -89 -98 -98 -87 -98 -83 -95 -98 -94 -90 -90 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -81 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -98 -98 -84 -83 -83 -83 -83 -83 -81 -83 -83 -83 -83 -82 -83 -91 -41 -90 -92 -67 -92 -92 -79 -92 -93 -92 -92 -92 -92 -91 -98 -92 -90 -93 -92 -92 -93 -98 -92 -92 -92 -99 -92 -83 -83 -83 -82 -83 -83 -83 -83 -82 -83 -83 -83 -83 -87 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -81 -90 -98 -91 -97 -94 -95 -95 -89 -96 -41 -83 -83 -82 -83 -83 -83 -83 -82 -82 -83 -83 -83 -88 -83 -83 -83 -83 -81 -82 -82 -83 -82 -82 -82 -83 -41 -82 -81 -82 -81 -81 -82 -77 -83 -83 -83 -83 -83 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -97 -95 -87 -98 -98 -83 -96 -98 -91 -98 -98 -81 -92 -93 -60 -83 -83 -83 -83 -82 -82 -83 -83 -82 -83 -83 -83 -86 -83 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -98 -98 -98 -98 -98 -92 -99 -98 -98 -80 -85 -88 -91 -88 -86 -92 -93 -98 -98 -98 -94 -94 -98 -98 -83 -83 -81 -83 -82 -83 -81 -81 -82 -81 -82 -81 -97 -98 -90 -98 -99 -98 -98 -98 -98 -97 -98 -96 -97 -97 -98 -53 -83 -83 -83 -82 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -82 -83 -82 -83 -82 -83 -83 -82 -81 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -41 -92 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -85 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -86 -80 -95 -99 -98 -98 -98 -98 -99 -97 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -80 -80 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -98 -41 -99 -44 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -98 -98 -97 -86 -99 -80 -80 -80 -81 -81 -81 -80 -80 -80 -77 -80 -80 -98 -92 -92 -92 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -93 -92 -91 -92 -83 -93 -92 -97 -83 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -83 -83 -82 -83 -82 -83 -82 -95 -98 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -99 -99 -95 -83 -83 -82 -82 -82 -82 -82 -82 -83 -82 -83 -82 -98 -98 -97 -82 -82 -82 -82 -82 -82 -82 -81 -80 -81 -81 -82 -81 -85 -78 -97 -76 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -69 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -63 -98 -98 -91 -94 -89 -80 -85 -90 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -59 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -69 -80 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -80 -80 -76 -80 -81 -80 -80 -80 -87 -93 -92 -92 -92 -95 -90 -91 -93 -93 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -91 -96 -98 -75 -82 -83 -83 -83 -95 -42 -83 -82 -83 -82 -82 -83 -82 -82 -83 -83 -83 -83 -94 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -87 -98 -80 -81 -80 -81 -80 -81 -80 -80 -80 -80 -80 -79 -88 -82 -82 -82 -83 -81 -81 -82 -83 -82 -81 -83 -82 -48 -88 -98 -80 -72 -98 -98 -98 -55 -83 -83 -83 -83 -83 -82 -83 -82 -83 -82 -82 -83 -98 -98 -83 -83 -83 -83 -83 -82 -82 -82 -83 -83 -82 -82 -82 -83 -99 -83 -98 -98 -99 -99 -98 -99 -99 -98 -98 -98 -98 -98 -99 -94 -92 -98 -98 -98 -96 -98 -85 -96 -88 -95 -91 -95 -91 -95 -97 -98 -97 -98 -78 -87 -87 -92 -92 -92 -92 -93 -93 -92 -92 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -93 -82 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -91 -95 -97 -97 -98 -91 -91 -98 -98 -98 -98 -83 -98 -80 -98 -98 -98 -94 -98 -93 -98 -92 -98 -98 -98 -98 -98 -92 -94 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -81 -80 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -86 -82 -82 -83 -83 -83 -83 -83 -83 -83 -77 -82 -83 -92 -92 -80 -81 -81 -81 -81 -81 -81 -80 -81 -80 -81 -81 -81 -98 -80 -81 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -94 -90 -92 -94 -95 -95 -91 -90 -98 -81 -81 -80 -80 -80 -80 -81 -80 -80 -81 -80 -80 -65 -94 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -91 -94 -86 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -87 -92 -99 -81 -80 -80 -80 -81 -81 -81 -81 -81 -81 -80 -81 -98 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -55 -90 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -77 -92 -93 -96 -92 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -80 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -82 -83 -41 -90 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -99 -88 -80 -81 -81 -80 -80 -79 -80 -80 -80 -80 -80 -80 -94 -85 -81 -82 -81 -81 -78 -83 -82 -83 -82 -83 -83 -83 -88 -92 -84 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -98 -99 -83 -98 -99 -94 -41 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -95 -84 -83 -83 -84 -84 -83 -83 -83 -83 -83 -83 -83 -45 -90 -92 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -81 -85 -82 -83 -83 -82 -82 -82 -82 -83 -83 -83 -83 -83 -98 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -80 -80 -74 -86 -87 -84 -84 -84 -84 -84 -84 -83 -83 -83 -84 -83 -83 -67 -80 -65 -80 -80 -80 -80 -81 -81 -81 -80 -81 -81 -80 -81 -98 -81 -81 -80 -81 -81 -80 -81 -81 -81 -80 -81 -81 -99 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -99 -80 -81 -81 -81 -81 -80 -81 -81 -81 -80 -83 -84 -84 -84 -84 -83 -84 -93 -96 -98 -98 -99 -96 -92 -92 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -92 -95 -83 -93 -85 -89 -87 -94 -83 -86 -83 -98 -83 -98 -84 -83 -78 -82 -83 -82 -83 -83 -83 -83 -84 -83 -84 -76 -95 -99 -81 -81 -81 -77 -79 -81 -81 -81 -80 -81 -81 -81 -85 -94 -89 -82 -90 -90 -93 -98 -98 -98 -97 -98 -96 -81 -98 -98 -98 -98 -98 -98 -91 -85 -73 -90 -89 -76 -51 -82 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -84 -60 -84 -83 -89 -63 -81 -88 -85 -84 -83 -84 -84 -82 -83 -83 -84 -84 -84 -84 -83 -77 -86 -88 -37 -78 -82 -82 -82 -80 -81 -81 -81 -81 -81 -81 -82 -81 -50 -84 -82 -87 -89 -38 -86 -91 -85 -67 -78 -86 -79 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -54 -78 -92 -87 -91 -80 -84 -86 -93 -92 -92 -54 -54 -80 -81 -80 -81 -81 -80 -76 -80 -80 -81 -81 -80 -80 -49 -84 -90 -84 -85 -85 -85 -85 -85 -85 -85 -85 -86 -92 -87 -92 -98 -93 -98 -84 -98 -91 -98 -98 -98 -99 -98 -98 -98 -98 -97 -93 -98 -98 -88 -93 -83 -94 -84 -95 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -92 -84 -84 -84 -84 -84 -84 -84 -84 -79 -82 -84 -77 -91 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -84 -83 -98 -84 -84 -84 -84 -82 -83 -83 -84 -84 -84 -84 -84 -41 -89 -93 -91 -85 -98 -80 -84 -84 -84 -84 -84 -84 -84 -85 -85 -84 -84 -85 -98 -98 -98 -88 -97 -97 -98 -97 -81 -98 -94 -98 -99 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -91 -98 -98 -99 -93 -95 -98 -99 -98 -84 -84 -85 -84 -83 -84 -84 -84 -84 -84 -84 -84 -98 -99 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -80 -81 -92 -92 -91 -98 -98 -98 -84 -84 -84 -84 -84 -82 -82 -82 -82 -83 -82 -82 -86 -87 -92 -88 -91 -91 -91 -41 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -96 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -80 -94 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -49 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -54 -84 -98 -93 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -67 -81 -92 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -93 -92 -93 -93 -93 -97 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -82 -81 -81 -81 -81 -81 -82 -82 -81 -81 -81 -81 -81 -81 -81 -41 -93 -81 -81 -82 -81 -82 -81 -80 -81 -81 -82 -81 -81 -98 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -82 -82 -86 -86 -87 -87 -87 -87 -87 -86 -87 -87 -93 -51 -93 -93 -93 -98 -90 -69 -98 -78 -98 -97 -86 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -91 -93 -93 -93 -95 -99 -88 -84 -98 -92 -98 -97 -83 -93 -95 -84 -94 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -55 -84 -98 -98 -99 -98 -98 -84 -88 -94 -41 -40 -45 -70 -98 -98 -98 -98 -98 -98 -84 -98 -98 -99 -99 -92 -98 -98 -98 -98 -84 -99 -96 -82 -58 -93 -98 -98 -98 -98 -84 -98 -99 -88 -93 -91 -90 -93 -86 -91 -91 -91 -95 -94 -92 -93 -98 -98 -97 -98 -97 -98 -99 -99 -98 -83 -93 -91 -95 -98 -98 -97 -90 -96 -91 -96 -97 -98 -94 -99 -98 -98 -99 -98 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -99 -84 -48 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -96 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -90 -84 -85 -84 -84 -84 -84 -84 -82 -83 -83 -82 -83 -86 -83 -84 -84 -82 -82 -82 -82 -83 -82 -82 -82 -82 -41 -93 -76 -84 -84 -84 -84 -85 -84 -84 -84 -84 -84 -84 -84 -94 -86 -84 -92 -97 -86 -98 -84 -85 -84 -85 -85 -85 -85 -84 -84 -84 -84 -84 -54 -95 -83 -86 -89 -98 -86 -99 -95 -78 -40 -84 -98 -89 -85 -84 -84 -84 -85 -84 -84 -83 -85 -82 -83 -83 -76 -85 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -90 -99 -85 -88 -87 -41 -48 -82 -82 -84 -85 -84 -84 -83 -84 -84 -85 -85 -83 -93 -90 -97 -84 -91 -86 -84 -82 -82 -84 -84 -84 -84 -82 -84 -84 -84 -84 -48 -82 -92 -92 -92 -86 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -58 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -84 -84 -41 -84 -84 -84 -84 -84 -84 -84 -85 -84 -84 -84 -84 -92 -54 -98 -83 -81 -99 -97 -89 -84 -97 -84 -82 -82 -82 -83 -82 -84 -83 -82 -82 -82 -83 -85 -81 -80 -81 -80 -80 -80 -80 -81 -81 -81 -81 -86 -92 -92 -99 -89 -92 -98 -53 -81 -81 -82 -82 -82 -81 -81 -82 -82 -81 -82 -81 -98 -98 -97 -97 -84 -84 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -92 -92 -81 -81 -82 -81 -81 -81 -81 -80 -81 -81 -81 -82 -71 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -84 -84 -41 -92 -92 -85 -84 -84 -84 -84 -98 -98 -84 -84 -84 -84 -58 -68 -97 -86 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -59 -95 -84 -82 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -87 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -93 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -87 -98 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -80 -86 -98 -87 -41 -84 -84 -84 -84 -84 -84 -82 -84 -84 -84 -84 -84 -92 -55 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -52 -92 -98 -99 -98 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -99 -84 -98 -98 -98 -98 -92 -98 -98 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -84 -84 -41 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -96 -87 -81 -81 -81 -76 -81 -81 -81 -81 -80 -81 -81 -81 -90 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -99 -84 -84 -83 -84 -84 -84 -84 -83 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -53 -98 -84 -98 -57 -99 -84 -84 -84 -84 -84 -84 -84 -84 -82 -83 -83 -84 -40 -98 -84 -84 -82 -84 -84 -84 -84 -83 -84 -84 -84 -81 -41 -85 -83 -83 -83 -83 -84 -83 -83 -81 -83 -83 -84 -83 -92 -95 -98 -98 -80 -80 -80 -80 -81 -81 -80 -81 -81 -81 -80 -81 -91 -98 -97 -90 -92 -92 -89 -95 -81 -86 -81 -89 -81 -94 -86 -84 -84 -83 -84 -82 -83 -83 -83 -83 -83 -83 -83 -82 -87 -83 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -72 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -81 -81 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -45 -96 -97 -83 -88 -89 -98 -41 -81 -82 -81 -81 -81 -81 -81 -81 -81 -82 -81 -82 -92 -96 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -84 -84 -84 -84 -84 -84 -84 -83 -83 -83 -83 -83 -83 -98 -93 -83 -84 -83 -84 -84 -83 -84 -83 -83 -84 -83 -83 -84 -72 -99 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -95 -84 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -92 -84 -84 -83 -84 -84 -83 -84 -84 -84 -83 -81 -83 -51 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -83 -81 -54 -92 -90 -99 -93 -81 -81 -81 -81 -80 -81 -81 -81 -92 -98 -98 -98 -98 -98 -98 -95 -95 -91 -92 -92 -95 -94 -95 -95 -98 -98 -98 -98 -98 -98 -93 -98 -98 -97 -98 -98 -99 -88 -98 -99 -91 -97 -94 -98 -98 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -98 -96 -84 -84 -83 -84 -81 -82 -84 -84 -84 -83 -84 -83 -84 -90 -85 -95 -80 -98 -98 -54 -84 -84 -84 -81 -84 -82 -84 -84 -84 -83 -83 -84 -81 -88 -98 -98 -98 -98 -92 -88 -97 -98 -84 -82 -83 -83 -83 -83 -83 -83 -83 -84 -84 -84 -83 -96 -88 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -75 -99 -81 -81 -81 -81 -61 -95 -94 -91 -92 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -98 -85 -87 -83 -82 -83 -82 -83 -84 -84 -83 -83 -80 -82 -84 -90 -93 -94 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -56 -86 -86 -84 -80 -86 -94 -83 -87 -98 -98 -98 -83 -81 -88 -92 -86 -81 -81 -80 -80 -81 -80 -81 -81 -81 -81 -81 -81 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -92 -98 -97 -96 -98 -99 -94 -99 -68 -83 -84 -84 -84 -84 -84 -84 -83 -83 -83 -83 -83 -98 -94 -84 -84 -84 -84 -84 -82 -83 -84 -83 -84 -84 -86 -98 -84 -83 -82 -83 -83 -83 -83 -81 -83 -83 -84 -83 -99 -92 -97 -81 -81 -80 -81 -81 -80 -81 -80 -80 -80 -80 -80 -98 -98 -88 -97 -98 -84 -84 -84 -84 -83 -83 -83 -84 -84 -83 -83 -84 -83 -99 -97 -98 -98 -50 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -98 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -81 -80 -80 -80 -80 -81 -81 -80 -98 -98 -87 -87 -88 -95 -86 -86 -94 -99 -79 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -93 -92 -92 -81 -81 -81 -81 -81 -81 -81 -80 -80 -81 -81 -80 -90 -92 -98 -96 -92 -99 -98 -86 -81 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -71 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -98 -81 -81 -81 -80 -81 -81 -81 -81 -82 -81 -81 -82 -41 -98 -98 -98 -99 -98 -98 -91 -98 -99 -98 -98 -98 -98 -85 -86 -98 -86 -98 -98 -96 -91 -99 -97 -93 -98 -84 -93 -86 -97 -96 -99 -81 -80 -81 -81 -81 -81 -81 -80 -81 -81 -81 -80 -82 -82 -84 -83 -83 -84 -82 -84 -83 -84 -84 -84 -98 -91 -81 -82 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -87 -81 -81 -81 -81 -82 -84 -83 -81 -83 -83 -81 -83 -83 -84 -98 -80 -81 -80 -81 -80 -80 -81 -81 -80 -81 -81 -81 -86 -82 -82 -80 -82 -81 -84 -82 -83 -83 -83 -83 -82 -99 -84 -85 -87 -78 -90 -98 -98 -93 -93 -99 -90 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -80 -89 -41 -83 -81 -82 -83 -83 -80 -68 -81 -83 -80 -81 -72 -86 -80 -80 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -92 -81 -81 -80 -81 -80 -80 -81 -80 -81 -81 -81 -81 -95 -92 -81 -81 -81 -81 -81 -81 -81 -68 -81 -81 -80 -81 -81 -81 -81 -81 -81 -68 -78 -81 -80 -81 -81 -81 -68 -92 -96 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -80 -80 -86 -92 -86 -82 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -61 -82 -83 -81 -82 -83 -83 -83 -83 -83 -83 -83 -84 -63 -80 -80 -80 -80 -81 -81 -81 -80 -81 -81 -81 -81 -98 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -98 -80 -81 -81 -80 -81 -81 -80 -81 -80 -81 -80 -80 -48 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -99 -83 -98 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -98 -83 -83 -83 -84 -84 -83 -83 -83 -83 -83 -84 -83 -85 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -80 -80 -80 -81 -80 -80 -81 -81 -80 -80 -80 -80 -98 -49 -98 -98 -41 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -93 -88 -92 -92 -84 -89 -86 -83 -83 -83 -83 -84 -83 -83 -82 -83 -83 -83 -82 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -55 -96 -90 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -82 -58 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -98 -99 -84 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -98 -80 -81 -81 -80 -80 -81 -81 -80 -81 -81 -81 -81 -86 -80 -80 -80 -81 -80 -80 -80 -81 -81 -80 -81 -81 -92 -93 -83 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -91 -83 -84 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -41 -83 -90 -96 -90 -83 -96 -87 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -95 -90 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -92 -83 -83 -83 -82 -82 -82 -82 -83 -82 -83 -83 -86 -98 -80 -80 -81 -80 -80 -80 -80 -80 -81 -81 -80 -80 -74 -83 -83 -90 -90 -83 -83 -57 -96 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -47 -89 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -84 -83 -83 -71 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -98 -93 -83 -84 -83 -83 -84 -82 -82 -82 -82 -83 -83 -83 -83 -81 -82 -82 -83 -82 -83 -81 -82 -82 -80 -81 -41 -82 -83 -82 -83 -82 -83 -83 -83 -83 -84 -83 -83 -98 -81 -80 -81 -81 -81 -81 -75 -81 -80 -81 -80 -81 -98 -92 -98 -97 -83 -94 -83 -84 -83 -83 -83 -83 -83 -83 -82 -83 -82 -82 -57 -82 -83 -83 -83 -83 -81 -83 -83 -84 -83 -83 -83 -86 -80 -81 -80 -81 -81 -80 -80 -81 -81 -80 -81 -74 -77 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -98 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -90 -92 -90 -84 -84 -83 -84 -84 -83 -84 -84 -84 -84 -84 -84 -99 -84 -83 -83 -83 -83 -84 -84 -83 -83 -83 -84 -84 -98 -48 -83 -83 -82 -83 -83 -83 -82 -83 -84 -84 -83 -84 -97 -83 -83 -83 -84 -84 -83 -83 -83 -83 -83 -83 -84 -98 -84 -84 -83 -83 -83 -84 -83 -84 -83 -83 -83 -84 -98 -98 -84 -83 -84 -84 -83 -84 -83 -84 -83 -83 -83 -84 -41 -98 -84 -83 -82 -82 -81 -83 -83 -83 -84 -83 -84 -84 -98 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -52 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -90 -92 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -84 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -84 -83 -84 -83 -82 -82 -81 -83 -84 -84 -84 -84 -63 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -95 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -83 -83 -98 -98 -83 -83 -83 -81 -83 -83 -83 -83 -83 -82 -83 -80 -86 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -85 -96 -83 -83 -83 -84 -83 -84 -84 -84 -83 -83 -83 -83 -84 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -91 -80 -80 -81 -80 -81 -81 -80 -80 -81 -81 -81 -81 -96 -81 -81 -79 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -84 -83 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -96 -83 -81 -81 -81 -81 -80 -83 -83 -83 -83 -83 -81 -53 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -95 -80 -80 -80 -81 -80 -80 -81 -81 -80 -80 -81 -81 -92 -99 -84 -92 -98 -98 -98 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -56 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -99 -98 -81 -80 -81 -81 -81 -80 -81 -80 -80 -81 -81 -80 -99 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -76 -93 -94 -92 -92 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -96 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -91 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -53 -83 -83 -83 -83 -81 -81 -82 -83 -83 -83 -83 -82 -62 -83 -81 -83 -83 -83 -82 -83 -83 -83 -83 -82 -83 -59 -92 -93 -84 -83 -83 -83 -84 -83 -82 -83 -83 -83 -83 -83 -98 -84 -89 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -41 -74 -86 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -66 -98 -87 -83 -83 -84 -83 -83 -83 -83 -83 -84 -83 -83 -70 -93 -83 -82 -83 -82 -82 -82 -83 -82 -83 -82 -83 -83 -89 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -99 -80 -81 -81 -80 -80 -81 -81 -81 -81 -81 -80 -81 -92 -92 -93 -92 -90 -90 -81 -95 -91 -94 -92 -92 -92 -92 -92 -92 -92 -92 -93 -92 -96 -98 -90 -94 -90 -89 -83 -55 -82 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -92 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -41 -87 -83 -83 -83 -83 -83 -83 -83 -84 -83 -84 -83 -67 -89 -83 -83 -83 -83 -83 -83 -83 -83 -81 -82 -82 -82 -82 -87 -87 -80 -86 -86 -96 -43 -87 -86 -87 -82 -86 -87 -86 -88 -84 -90 -86 -86 -86 -86 -87 -97 -98 -93 -99 -99 -91 -93 -83 -98 -98 -85 -81 -99 -85 -78 -98 -81 -81 -82 -99 -98 -81 -80 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -80 -80 -79 -81 -81 -81 -94 -81 -98 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -53 -50 -81 -81 -81 -80 -81 -81 -80 -80 -80 -81 -80 -81 -93 -92 -98 -83 -81 -83 -82 -83 -83 -83 -84 -83 -83 -83 -83 -41 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -88 -84 -83 -83 -83 -83 -82 -82 -83 -83 -82 -83 -83 -44 -83 -82 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -98 -83 -73 -98 -83 -83 -83 -83 -83 -83 -82 -83 -82 -42 -82 -83 -83 -81 -83 -81 -83 -83 -82 -83 -83 -82 -51 -83 -83 -80 -80 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -97 -83 -90 -96 -93 -90 -82 -82 -82 -82 -83 -83 -83 -82 -83 -83 -81 -82 -82 -87 -98 -80 -80 -81 -81 -81 -80 -80 -80 -80 -81 -81 -81 -97 -98 -99 -98 -41 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -98 -92 -82 -83 -81 -83 -83 -82 -83 -83 -83 -83 -83 -83 -81 -41 -83 -82 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -92 -92 -92 -41 -94 -92 -95 -92 -92 -85 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -40 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -40 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -57 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -54 -83 -82 -83 -83 -83 -83 -75 -82 -83 -83 -83 -81 -84 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -82 -93 -96 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -50 -98 -98 -92 -98 -98 -82 -93 -82 -87 -86 -83 -83 -83 -83 -83 -83 -82 -83 -82 -82 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -98 -90 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -87 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -98 -81 -80 -80 -81 -80 -81 -80 -80 -81 -81 -81 -81 -99 -82 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -58 -92 -92 -92 -92 -93 -97 -81 -80 -81 -81 -81 -81 -80 -80 -81 -81 -81 -81 -81 -80 -41 -83 -81 -80 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -80 -81 -80 -81 -81 -87 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -82 -81 -82 -81 -82 -82 -98 -92 -98 -81 -80 -81 -81 -81 -78 -81 -81 -81 -82 -81 -81 -60 -93 -99 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -98 -81 -99 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -92 -81 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -53 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -41 -80 -79 -94 -40 -95 -93 -97 -98 -94 -91 -97 -98 -94 -94 -98 -98 -94 -92 -92 -98 -97 -92 -98 -80 -97 -98 -98 -98 -88 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -99 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -73 -81 -80 -81 -81 -81 -81 -81 -81 -81 -80 -80 -80 -86 -81 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -97 -41 -98 -93 -92 -91 -90 -95 -49 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -97 -83 -83 -83 -88 -98 -98 -92 -51 -82 -83 -82 -83 -83 -83 -83 -83 -83 -81 -83 -83 -99 -83 -83 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -57 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -98 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -40 -83 -83 -83 -83 -82 -81 -83 -83 -83 -82 -81 -83 -93 -90 -91 -93 -92 -92 -92 -92 -92 -83 -83 -83 -83 -82 -82 -82 -83 -83 -83 -83 -83 -41 -92 -83 -98 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -91 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -94 -95 -91 -96 -83 -83 -83 -83 -82 -83 -83 -80 -81 -82 -82 -82 -93 -81 -81 -83 -82 -81 -82 -80 -83 -82 -83 -83 -83 -92 -93 -98 -81 -80 -80 -80 -80 -81 -81 -80 -81 -80 -81 -81 -81 -97 -90 -98 -98 -91 -99 -98 -81 -90 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -43 -94 -85 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -90 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -95 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -60 -98 -96 -88 -99 -99 -96 -98 -98 -98 -98 -98 -98 -87 -93 -92 -90 -92 -91 -90 -90 -98 -93 -94 -98 -98 -93 -95 -94 -92 -93 -97 -92 -91 -92 -90 -92 -92 -92 -83 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -97 -98 -94 -92 -97 -98 -98 -98 -86 -98 -88 -98 -85 -82 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -82 -82 -82 -83 -82 -83 -83 -83 -83 -83 -41 -97 -48 -84 -82 -82 -83 -82 -82 -83 -83 -83 -82 -81 -81 -82 -80 -80 -81 -81 -80 -80 -80 -80 -80 -80 -80 -80 -86 -90 -88 -98 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -86 -98 -98 -98 -98 -83 -98 -89 -99 -85 -98 -87 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -76 -87 -89 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -77 -83 -84 -84 -83 -83 -83 -83 -83 -81 -81 -81 -81 -81 -80 -95 -82 -82 -81 -82 -81 -81 -81 -82 -81 -82 -82 -81 -42 -93 -92 -93 -92 -98 -98 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -82 -81 -92 -92 -91 -98 -83 -92 -88 -92 -94 -92 -94 -98 -84 -83 -83 -84 -83 -84 -83 -83 -83 -83 -83 -83 -84 -84 -82 -83 -83 -83 -83 -83 -83 -84 -83 -82 -93 -83 -83 -83 -84 -83 -83 -84 -83 -83 -83 -83 -83 -91 -83 -84 -83 -84 -83 -84 -81 -82 -83 -83 -82 -77 -86 -82 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -40 -71 -92 -84 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -90 -93 -98 -96 -83 -98 -84 -49 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -98 -98 -84 -83 -84 -83 -84 -83 -83 -83 -83 -84 -83 -84 -41 -98 -84 -84 -82 -83 -83 -83 -83 -83 -83 -84 -83 -83 -84 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -93 -92 -92 -92 -90 -93 -92 -92 -91 -82 -92 -53 -81 -81 -81 -82 -77 -82 -81 -81 -82 -82 -82 -81 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -45 -83 -92 -98 -98 -98 -74 -81 -92 -82 -81 -82 -82 -82 -82 -82 -81 -82 -81 -81 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -82 -82 -81 -98 -84 -83 -81 -81 -82 -82 -82 -84 -84 -84 -83 -84 -91 -81 -98 -41 -98 -91 -84 -84 -84 -84 -82 -84 -84 -83 -84 -84 -84 -84 -77 -98 -98 -84 -93 -84 -88 -86 -84 -98 -98 -84 -84 -84 -84 -84 -84 -83 -83 -84 -83 -83 -84 -41 -84 -84 -84 -84 -84 -83 -83 -84 -81 -84 -83 -83 -41 -97 -83 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -98 -99 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -82 -82 -81 -81 -81 -81 -80 -81 -81 -82 -81 -99 -84 -84 -84 -84 -82 -83 -83 -83 -83 -83 -83 -83 -52 -41 -99 -99 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -97 -82 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -98 -81 -81 -82 -82 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -82 -81 -81 -81 -82 -81 -81 -81 -82 -81 -41 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -98 -98 -84 -84 -84 -83 -83 -82 -82 -82 -83 -81 -81 -84 -84 -84 -83 -81 -83 -83 -83 -83 -83 -83 -84 -83 -67 -93 -72 -84 -83 -83 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -82 -81 -82 -82 -81 -81 -82 -82 -82 -98 -98 -82 -82 -81 -81 -82 -82 -81 -81 -81 -82 -82 -80 -81 -82 -82 -82 -81 -82 -82 -81 -81 -80 -81 -81 -92 -90 -87 -91 -92 -91 -93 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -84 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -85 -84 -83 -83 -84 -84 -84 -83 -84 -84 -84 -84 -62 -41 -98 -98 -98 -94 -91 -98 -94 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -92 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -77 -41 -84 -84 -83 -84 -81 -83 -83 -81 -82 -83 -82 -82 -96 -98 -81 -81 -81 -81 -81 -81 -80 -81 -81 -80 -81 -81 -53 -92 -84 -82 -82 -82 -81 -82 -81 -81 -82 -82 -82 -81 -64 -81 -84 -82 -98 -92 -82 -81 -82 -81 -81 -82 -82 -82 -82 -82 -82 -81 -88 -81 -81 -81 -81 -82 -82 -82 -82 -82 -81 -82 -82 -88 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -75 -98 -81 -82 -82 -82 -82 -82 -82 -82 -81 -81 -82 -82 -98 -98 -98 -98 -97 -98 -86 -99 -98 -98 -82 -82 -82 -81 -81 -81 -80 -81 -81 -81 -81 -82 -92 -86 -86 -86 -92 -92 -92 -92 -82 -81 -81 -81 -82 -82 -82 -81 -82 -81 -81 -81 -92 -41 -98 -97 -88 -84 -84 -84 -83 -84 -84 -84 -83 -83 -84 -84 -67 -83 -81 -81 -81 -83 -84 -84 -84 -84 -84 -84 -84 -98 -84 -83 -83 -84 -84 -84 -84 -83 -84 -84 -84 -84 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -88 -83 -83 -84 -83 -83 -81 -81 -82 -82 -82 -82 -82 -79 -83 -82 -82 -82 -81 -82 -84 -83 -83 -83 -83 -84 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -82 -93 -82 -98 -98 -98 -88 -98 -98 -82 -82 -93 -81 -82 -82 -81 -81 -81 -82 -82 -82 -82 -82 -82 -87 -94 -82 -82 -82 -82 -81 -82 -81 -81 -81 -81 -81 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -49 -98 -82 -81 -82 -82 -81 -81 -81 -81 -82 -81 -82 -81 -80 -81 -82 -81 -82 -81 -82 -81 -81 -81 -80 -81 -91 -91 -90 -91 -91 -90 -92 -92 -90 -99 -92 -92 -92 -92 -92 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -67 -84 -86 -77 -84 -83 -83 -84 -84 -84 -82 -84 -84 -84 -66 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -57 -84 -84 -82 -84 -84 -84 -84 -82 -81 -82 -82 -81 -81 -81 -81 -81 -84 -81 -82 -81 -81 -83 -83 -84 -84 -65 -92 -95 -98 -98 -98 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -43 -84 -98 -98 -99 -98 -92 -99 -82 -98 -88 -82 -86 -99 -82 -81 -82 -81 -82 -81 -81 -82 -82 -81 -81 -80 -98 -82 -81 -82 -82 -81 -82 -81 -82 -81 -82 -82 -82 -94 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -83 -84 -83 -83 -84 -83 -81 -81 -83 -83 -72 -84 -84 -84 -84 -84 -81 -84 -84 -83 -84 -83 -84 -41 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -47 -98 -97 -98 -92 -95 -98 -41 -99 -82 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -82 -82 -81 -81 -81 -82 -82 -81 -81 -41 -82 -81 -81 -81 -82 -81 -81 -82 -81 -82 -82 -82 -41 -82 -82 -81 -82 -81 -82 -81 -81 -81 -81 -81 -81 -69 -84 -81 -81 -81 -81 -82 -81 -81 -80 -80 -81 -81 -84 -84 -82 -84 -84 -84 -80 -83 -83 -84 -84 -84 -84 -92 -92 -98 -98 -98 -98 -98 -98 -78 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -68 -81 -93 -98 -41 -95 -99 -81 -81 -81 -81 -82 -81 -82 -81 -81 -81 -81 -82 -96 -82 -82 -82 -81 -82 -81 -81 -81 -81 -81 -82 -82 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -86 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -99 -82 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -41 -83 -81 -81 -82 -81 -82 -82 -81 -82 -82 -81 -81 -82 -92 -92 -56 -98 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -98 -83 -81 -81 -81 -81 -81 -80 -82 -81 -81 -81 -81 -61 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -82 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -98 -99 -98 -85 -86 -86 -87 -86 -98 -98 -98 -98 -98 -98 -95 -83 -83 -83 -84 -83 -83 -83 -84 -84 -84 -84 -83 -41 -83 -83 -83 -83 -84 -83 -84 -83 -83 -83 -83 -84 -83 -84 -83 -98 -84 -84 -83 -84 -84 -84 -84 -84 -82 -84 -83 -84 -83 -98 -84 -84 -83 -84 -83 -84 -84 -84 -84 -83 -84 -84 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -82 -81 -81 -81 -81 -82 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -41 -92 -92 -94 -84 -84 -84 -84 -84 -84 -84 -98 -83 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -54 -98 -98 -84 -83 -83 -83 -84 -83 -83 -83 -83 -84 -83 -83 -83 -83 -84 -83 -83 -84 -83 -83 -83 -83 -83 -84 -56 -84 -83 -83 -83 -83 -83 -84 -83 -83 -83 -82 -83 -48 -96 -82 -83 -82 -82 -82 -82 -77 -81 -83 -82 -83 -83 -82 -81 -83 -83 -82 -83 -83 -83 -83 -83 -82 -83 -80 -65 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -85 -41 -82 -83 -91 -87 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -82 -83 -83 -83 -83 -82 -83 -82 -82 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -41 -93 -82 -83 -82 -81 -82 -83 -82 -83 -83 -83 -83 -85 -41 -99 -83 -99 -93 -91 -90 -91 -93 -87 -84 -85 -83 -83 -81 -81 -83 -83 -81 -83 -83 -83 -82 -83 -87 -81 -89 -81 -81 -80 -80 -81 -81 -81 -81 -81 -81 -81 -86 -98 -64 -82 -83 -83 -83 -83 -83 -82 -83 -82 -82 -83 -85 -82 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -41 -83 -82 -82 -83 -83 -82 -82 -82 -83 -83 -83 -83 -56 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -87 -88 -80 -81 -80 -81 -81 -81 -80 -80 -79 -81 -80 -81 -83 -83 -82 -82 -82 -83 -83 -83 -82 -83 -83 -83 -82 -98 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -92 -82 -62 -95 -92 -95 -89 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -70 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -76 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -88 -83 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -84 -81 -81 -80 -81 -80 -80 -81 -81 -80 -79 -80 -82 -93 -92 -92 -91 -84 -83 -83 -82 -83 -83 -82 -83 -82 -83 -83 -83 -83 -92 -41 -87 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -62 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -86 -83 -83 -83 -83 -84 -84 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -92 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -92 -90 -80 -80 -81 -80 -80 -80 -81 -81 -81 -79 -80 -81 -92 -98 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -58 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -95 -88 -72 -95 -95 -80 -86 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -83 -84 -98 -97 -79 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -92 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -93 -98 -97 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -84 -84 -83 -84 -84 -83 -84 -84 -83 -83 -83 -84 -97 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -84 -83 -84 -83 -83 -83 -83 -83 -83 -83 -49 -59 -83 -83 -82 -82 -82 -83 -83 -83 -83 -83 -83 -83 -80 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -55 -45 -45 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -75 -98 -86 -83 -83 -83 -83 -83 -83 -84 -82 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -92 -91 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -98 -97 -98 -98 -98 -98 -98 -98 -98 -92 -91 -98 -99 -91 -88 -92 -91 -91 -87 -86 -92 -98 -95 -98 -98 -98 -95 -98 -83 -96 -91 -91 -92 -92 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -94 -99 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -98 -98 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -92 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -85 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -82 -90 -80 -80 -81 -80 -80 -81 -81 -81 -81 -81 -79 -80 -92 -92 -98 -98 -84 -82 -82 -82 -83 -83 -83 -83 -82 -83 -83 -82 -41 -97 -98 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -92 -41 -95 -98 -94 -99 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -41 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -41 -92 -98 -88 -93 -81 -81 -81 -79 -81 -81 -81 -81 -81 -81 -81 -81 -93 -99 -98 -98 -97 -98 -99 -82 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -45 -44 -95 -95 -95 -92 -92 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -85 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -67 -41 -89 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -97 -81 -81 -81 -81 -80 -80 -81 -81 -83 -83 -83 -83 -83 -83 -83 -83 -41 -93 -98 -93 -83 -83 -93 -98 -98 -83 -96 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -98 -84 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -99 -94 -98 -87 -90 -99 -98 -99 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -41 -73 -83 -83 -83 -83 -83 -79 -82 -83 -83 -83 -83 -63 -93 -99 -81 -81 -81 -80 -81 -81 -81 -81 -80 -81 -81 -80 -89 -86 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -85 -83 -83 -83 -83 -82 -83 -84 -84 -84 -84 -84 -57 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -90 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -46 -82 -83 -81 -82 -82 -82 -82 -83 -83 -83 -80 -83 -67 -91 -93 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -82 -83 -83 -41 -83 -91 -91 -92 -96 -96 -97 -89 -91 -82 -82 -83 -83 -83 -81 -82 -83 -81 -83 -82 -83 -92 -91 -92 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -98 -98 -98 -98 -98 -84 -81 -80 -81 -81 -80 -81 -81 -81 -81 -80 -81 -69 -92 -85 -93 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -91 -90 -92 -95 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -96 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -98 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -98 -98 -98 -98 -97 -98 -96 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -84 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -67 -83 -83 -83 -82 -83 -83 -96 -87 -88 -88 -79 -80 -80 -81 -81 -80 -98 -81 -82 -82 -82 -82 -82 -86 -82 -82 -83 -83 -83 -68 -83 -83 -83 -83 -83 -83 -82 -83 -83 -81 -81 -82 -83 -92 -81 -98 -81 -90 -81 -99 -99 -98 -95 -92 -85 -97 -98 -80 -81 -80 -81 -80 -81 -88 -84 -83 -82 -82 -82 -81 -82 -69 -83 -83 -83 -83 -83 -84 -98 -83 -83 -83 -83 -83 -82 -48 -99 -95 -96 -96 -98 -83 -83 -83 -83 -83 -83 -90 -81 -81 -81 -80 -81 -80 -96 -93 -86 -81 -81 -81 -81 -81 -81 -99 -83 -82 -83 -83 -83 -83 -50 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -98 -98 -98 -92 -98 -99 -97 -97 -98 -91 -91 -83 -83 -83 -83 -99 -83 -83 -83 -83 -83 -83 -41 -93 -98 -98 -99 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -97 -91 -98 -98 -98 -100 -98 -98 -95 -82 -82 -81 -81 -82 -81 -97 -94 -98 -98 -95 -91 -83 -92 -94 -97 -96 -80 -81 -81 -81 -81 -81 -98 -98 -83 -83 -83 -83 -83 -83 -67 -83 -83 -82 -83 -83 -83 -92 -98 -98 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -86 -81 -81 -81 -81 -81 -91 -98 -98 -98 -83 -83 -83 -83 -83 -83 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -41 -73 -83 -83 -82 -83 -83 -83 -98 -96 -98 -84 -83 -81 -83 -83 -83 -89 -98 -92 -85 -80 -81 -79 -80 -81 -63 -80 -41 -81 -81 -81 -81 -81 -81 -49 -98 -98 -99 -98 -95 -97 -93 -91 -91 -91 -85 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -81 -81 -80 -81 -81 -81 -91 -83 -83 -84 -83 -83 -83 -59 -83 -83 -83 -83 -83 -83 -82 -98 -98 -98 -89 -89 -88 -85 -98 -98 -96 -93 -93 -93 -93 -92 -88 -87 -93 -84 -93 -84 -88 -93 -85 -85 -90 -86 -93 -92 -85 -88 -87 -87 -88 -86 -86 -86 -87 -87 -87 -81 -82 -81 -81 -82 -82 -87 -86 -90 -82 -82 -81 -82 -83 -81 -99 -97 -79 -80 -80 -79 -80 -81 -92 -98 -83 -98 -90 -82 -82 -98 -98 -87 -97 -92 -89 -95 -82 -94 -82 -88 -98 -83 -96 -98 -87 -83 -83 -83 -82 -83 -83 -83 -44 -98 -95 -83 -83 -83 -83 -83 -83 -99 -83 -83 -83 -82 -83 -83 -81 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -69 -83 -83 -83 -83 -83 -83 -68 -82 -83 -82 -83 -82 -83 -99 -84 -81 -80 -80 -80 -81 -67 -84 -41 -81 -80 -81 -81 -81 -81 -41 -98 -83 -83 -83 -84 -83 -83 -98 -98 -92 -92 -93 -92 -98 -98 -98 -98 -83 -83 -82 -82 -82 -82 -82 -96 -88 -79 -81 -81 -81 -81 -87 -97 -97 -83 -83 -82 -82 -81 -83 -91 -83 -83 -83 -82 -83 -83 -93 -98 -80 -81 -80 -80 -80 -80 -98 -98 -98 -96 -98 -95 -98 -91 -98 -95 -95 -95 -91 -98 -92 -91 -91 -91 -98 -96 -98 -87 -88 -88 -87 -80 -80 -81 -80 -80 -66 -80 -79 -80 -80 -80 -80 -90 -82 -82 -83 -83 -83 -83 -98 -97 -98 -98 -98 -98 -99 -99 -93 -97 -98 -98 -98 -97 -83 -99 -98 -98 -98 -98 -98 -98 -92 -98 -98 -96 -98 -99 -98 -98 -96 -95 -95 -95 -90 -91 -91 -85 -98 -99 -97 -87 -93 -98 -99 -98 -98 -99 -83 -82 -82 -82 -82 -82 -77 -83 -83 -81 -81 -81 -81 -79 -80 -80 -86 -92 -83 -88 -98 -98 -99 -86 -88 -98 -81 -80 -81 -81 -81 -81 -95 -95 -91 -82 -83 -83 -83 -83 -83 -95 -41 -95 -98 -41 -93 -83 -83 -83 -83 -82 -82 -95 -94 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -92 -99 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -83 -82 -82 -83 -83 -82 -99 -93 -81 -81 -80 -80 -81 -80 -87 -98 -91 -88 -88 -88 -88 -98 -99 -99 -85 -98 -93 -92 -98 -81 -81 -81 -81 -81 -81 -93 -99 -98 -98 -74 -83 -83 -83 -83 -83 -61 -91 -93 -88 -93 -82 -98 -82 -98 -86 -92 -83 -83 -83 -82 -83 -82 -47 -79 -98 -92 -86 -98 -98 -98 -82 -82 -82 -83 -81 -82 -81 -80 -80 -81 -80 -81 -87 -94 -92 -92 -83 -83 -82 -83 -82 -83 -98 -91 -99 -83 -82 -83 -83 -83 -82 -83 -83 -83 -81 -82 -83 -44 -82 -82 -83 -82 -82 -81 -93 -98 -98 -99 -98 -98 -98 -98 -99 -87 -98 -93 -82 -83 -82 -83 -82 -83 -91 -93 -83 -82 -83 -83 -83 -83 -81 -81 -80 -80 -81 -80 -90 -99 -83 -95 -83 -83 -83 -82 -83 -82 -83 -82 -82 -83 -83 -82 -63 -73 -93 -93 -74 -93 -83 -83 -82 -83 -83 -83 -88 -83 -82 -83 -82 -82 -72 -83 -83 -83 -83 -82 -83 -71 -81 -80 -81 -81 -81 -88 -98 -98 -92 -98 -98 -98 -81 -81 -82 -81 -81 -81 -92 -87 -98 -81 -96 -87 -93 -88 -88 -88 -88 -88 -96 -98 -88 -89 -89 -88 -88 -88 -89 -88 -88 -88 -92 -84 -80 -80 -80 -81 -81 -80 -81 -81 -81 -80 -80 -80 -88 -91 -91 -93 -93 -93 -92 -89 -93 -83 -83 -98 -92 -82 -98 -82 -82 -99 -98 -98 -91 -83 -82 -82 -82 -82 -83 -83 -82 -83 -82 -83 -83 -55 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -83 -82 -47 -96 -83 -83 -82 -82 -82 -83 -82 -82 -81 -81 -83 -82 -84 -80 -80 -79 -80 -80 -79 -80 -80 -80 -80 -81 -83 -65 -83 -83 -81 -82 -83 -82 -82 -83 -82 -82 -82 -83 -83 -83 -83 -83 -83 -82 -83 -82 -82 -82 -82 -83 -62 -83 -96 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -98 -99 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -87 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -73 -81 -81 -80 -80 -80 -81 -81 -81 -81 -81 -80 -81 -54 -74 -98 -95 -84 -92 -92 -92 -98 -97 -96 -97 -87 -87 -87 -88 -86 -87 -87 -88 -92 -88 -86 -98 -85 -87 -88 -88 -88 -93 -88 -90 -86 -99 -98 -98 -98 -99 -97 -87 -93 -98 -87 -98 -98 -98 -96 -94 -95 -84 -91 -96 -95 -98 -98 -91 -99 -98 -87 -95 -91 -91 -98 -98 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -86 -90 -92 -97 -97 -98 -98 -98 -87 -98 -98 -98 -98 -98 -98 -98 -99 -95 -87 -92 -92 -92 -98 -98 -99 -98 -98 -89 -81 -81 -80 -80 -80 -80 -80 -80 -80 -81 -80 -76 -96 -93 -81 -80 -81 -81 -81 -81 -80 -80 -80 -81 -81 -81 -52 -98 -81 -80 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -47 -81 -81 -80 -80 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -80 -41 -89 -80 -81 -81 -80 -80 -80 -80 -81 -81 -81 -80 -80 -87 -86 -80 -80 -80 -80 -79 -80 -80 -81 -80 -81 -81 -80 -98 -93 -99 -83 -81 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -92 -86 -82 -83 -83 -82 -82 -83 -83 -82 -83 -83 -82 -71 -82 -93 -99 -98 -82 -89 -99 -83 -81 -82 -82 -83 -83 -83 -81 -83 -83 -83 -82 -83 -83 -83 -83 -82 -83 -83 -83 -82 -83 -82 -82 -57 -80 -83 -83 -83 -83 -83 -83 -82 -83 -82 -83 -82 -42 -94 -88 -92 -98 -98 -98 -98 -98 -99 -96 -98 -86 -98 -98 -88 -86 -85 -92 -98 -98 -87 -94 -96 -91 -98 -98 -96 -97 -82 -82 -82 -82 -82 -81 -83 -82 -82 -81 -83 -83 -74 -40 -83 -83 -82 -82 -81 -82 -81 -81 -81 -82 -83 -82 -92 -92 -91 -92 -92 -81 -83 -82 -82 -82 -82 -83 -83 -82 -83 -82 -82 -82 -88 -83 -83 -83 -83 -82 -83 -82 -81 -82 -82 -83 -82 -83 -83 -82 -82 -83 -83 -83 -83 -82 -83 -82 -83 -41 -97 -82 -83 -83 -82 -82 -82 -82 -83 -83 -83 -82 -82 -82 -81 -82 -82 -83 -83 -82 -83 -81 -82 -82 -83 -68 -91 -83 -82 -82 -82 -82 -82 -82 -82 -83 -83 -83 -83 -41 -98 -86 -98 -94 -83 -83 -91 -81 -99 -81 -97 -97 -92 -92 -97 -97 -82 -82 -81 -83 -82 -83 -82 -82 -82 -83 -83 -83 -98 -98 -98 -98 -99 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -89 -87 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -86 -81 -83 -81 -83 -83 -83 -83 -83 -83 -81 -83 -83 -98 -98 -98 -98 -98 -98 -98 -85 -85 -92 -86 -93 -93 -59 -83 -83 -81 -81 -82 -82 -83 -82 -83 -83 -82 -82 -88 -83 -83 -83 -82 -83 -83 -83 -83 -83 -82 -83 -66 -88 -94 -95 -95 -95 -96 -91 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -82 -92 -83 -82 -82 -83 -81 -81 -98 -98 -98 -98 -96 -85 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -81 -81 -91 -90 -93 -92 -92 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -93 -99 -82 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -58 -83 -98 -97 -88 -94 -83 -98 -83 -83 -83 -83 -83 -82 -83 -83 -83 -82 -83 -83 -89 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -71 -97 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -95 -83 -83 -83 -83 -82 -82 -83 -82 -83 -83 -83 -83 -98 -93 -83 -83 -83 -81 -83 -82 -83 -83 -83 -82 -83 -84 -93 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -93 -97 -40 -97 -98 -83 -83 -82 -82 -81 -82 -82 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -96 -95 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -94 -94 -41 -41 -80 -81 -80 -81 -81 -81 -81 -80 -81 -80 -81 -80 -98 -92 -98 -98 -84 -83 -82 -82 -82 -82 -82 -82 -83 -83 -82 -83 -81 -93 -92 -93 -93 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -48 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -42 -83 -93 -98 -92 -88 -92 -98 -88 -92 -93 -92 -94 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -92 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -81 -81 -81 -81 -81 -79 -80 -81 -81 -81 -81 -41 -98 -81 -81 -81 -80 -80 -81 -81 -80 -81 -81 -81 -81 -91 -91 -94 -83 -83 -83 -83 -84 -83 -83 -83 -84 -83 -84 -83 -83 -98 -97 -98 -97 -98 -97 -98 -97 -97 -69 -94 -98 -98 -88 -98 -83 -82 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -87 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -67 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -81 -41 -81 -81 -82 -82 -82 -82 -81 -81 -81 -82 -82 -82 -98 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -93 -95 -98 -92 -97 -94 -98 -98 -95 -93 -87 -67 -95 -92 -91 -72 -92 -98 -93 -98 -98 -98 -97 -98 -98 -98 -82 -89 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -99 -94 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -69 -92 -92 -98 -99 -86 -97 -99 -98 -98 -99 -98 -98 -92 -92 -85 -97 -98 -97 -98 -98 -98 -98 -96 -91 -93 -98 -98 -99 -89 -98 -95 -98 -98 -98 -97 -98 -86 -98 -94 -95 -98 -98 -99 -95 -98 -98 -98 -96 -87 -98 -97 -98 -98 -99 -98 -98 -98 -97 -98 -98 -99 -41 -98 -98 -99 -95 -86 -98 -98 -88 -95 -95 -91 -90 -91 -98 -98 -96 -86 -88 -86 -87 -87 -87 -86 -87 -87 -99 -86 -90 -92 -90 -81 -81 -80 -81 -81 -80 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -54 -81 -81 -81 -98 -98 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -84 -83 -98 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -89 -86 -83 -82 -83 -83 -77 -82 -77 -83 -83 -82 -83 -83 -41 -98 -98 -98 -83 -81 -81 -80 -81 -80 -81 -80 -80 -81 -80 -81 -80 -98 -94 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -83 -83 -41 -88 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -93 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -64 -81 -80 -81 -81 -81 -80 -81 -80 -81 -81 -80 -81 -65 -96 -75 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -85 -86 -80 -81 -81 -80 -81 -81 -81 -80 -80 -81 -81 -81 -91 -91 -85 -83 -83 -83 -83 -83 -81 -83 -83 -81 -81 -81 -82 -83 -82 -81 -83 -83 -83 -83 -83 -83 -83 -83 -81 -89 -98 -97 -94 -98 -92 -86 -85 -94 -92 -80 -81 -81 -81 -81 -79 -81 -81 -80 -80 -81 -80 -80 -87 -81 -81 -81 -81 -81 -81 -80 -80 -81 -81 -80 -80 -97 -81 -83 -82 -84 -84 -84 -83 -84 -83 -83 -83 -83 -82 -82 -83 -82 -83 -82 -82 -81 -81 -83 -83 -83 -41 -82 -90 -92 -89 -82 -83 -83 -83 -83 -83 -81 -81 -82 -83 -83 -83 -72 -83 -91 -84 -98 -61 -80 -80 -81 -80 -81 -80 -80 -80 -80 -80 -80 -80 -98 -92 -75 -83 -84 -83 -83 -82 -83 -81 -82 -83 -83 -83 -83 -83 -55 -83 -83 -83 -82 -82 -83 -83 -82 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -98 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -82 -82 -82 -83 -82 -82 -82 -83 -57 -84 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -99 -98 -98 -83 -83 -98 -99 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -41 -98 -98 -98 -97 -87 -85 -87 -93 -94 -83 -83 -83 -83 -83 -83 -81 -83 -83 -83 -83 -85 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -93 -98 -41 -83 -83 -83 -83 -82 -82 -83 -81 -81 -82 -83 -82 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -90 -62 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -72 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -70 -41 -83 -83 -82 -83 -81 -83 -83 -83 -83 -83 -83 -82 -97 -90 -83 -83 -83 -83 -83 -83 -81 -81 -83 -83 -83 -82 -41 -83 -83 -83 -81 -83 -82 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -82 -82 -64 -98 -87 -41 -98 -83 -83 -83 -83 -83 -83 -81 -82 -82 -83 -82 -82 -95 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -86 -95 -91 -87 -87 -98 -98 -90 -86 -98 -83 -98 -98 -98 -98 -97 -87 -97 -98 -98 -94 -91 -76 -86 -97 -92 -87 -94 -91 -91 -91 -91 -92 -95 -98 -96 -98 -85 -87 -98 -92 -98 -98 -98 -98 -53 -80 -80 -90 -85 -85 -90 -98 -98 -97 -96 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -87 -82 -83 -82 -93 -84 -78 -91 -93 -92 -98 -97 -98 -90 -98 -97 -98 -89 -97 -98 -98 -98 -97 -85 -80 -88 -99 -81 -81 -81 -81 -80 -81 -80 -81 -81 -81 -80 -81 -98 -83 -81 -81 -80 -80 -80 -80 -81 -81 -81 -80 -80 -81 -81 -49 -97 -41 -72 -80 -87 -80 -80 -81 -81 -81 -80 -81 -79 -80 -80 -81 -80 -91 -41 -82 -82 -82 -78 -82 -82 -82 -83 -83 -82 -82 -82 -41 -92 -62 -87 -80 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -77 -92 -97 -98 -41 -81 -81 -81 -80 -81 -81 -80 -81 -81 -80 -81 -81 -87 -80 -81 -81 -81 -81 -81 -80 -80 -80 -81 -81 -73 -41 -80 -81 -80 -81 -81 -81 -81 -81 -80 -81 -81 -81 -99 -98 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -82 -83 -98 -98 -80 -81 -81 -81 -81 -80 -81 -80 -81 -81 -81 -81 -81 -98 -41 -41 -77 -81 -80 -81 -81 -81 -81 -81 -81 -81 -80 -81 -41 -41 -70 -92 -91 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -41 -97 -93 -73 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -92 -99 -97 -98 -98 -99 -83 -82 -82 -82 -83 -83 -83 -83 -82 -82 -83 -82 -82 -89 -83 -83 -82 -83 -83 -83 -82 -82 -83 -82 -82 -89 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -81 -81 -83 -41 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -98 -85 -89 -82 -63 -83 -82 -82 -83 -82 -82 -83 -83 -83 -83 -82 -83 -41 -83 -83 -83 -82 -83 -82 -82 -82 -82 -83 -82 -82 -41 -93 -98 -82 -82 -82 -82 -82 -82 -80 -82 -82 -82 -82 -82 -69 -92 -41 -41 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -89 -99 -99 -95 -96 -93 -78 -93 -92 -92 -92 -93 -93 -98 -98 -96 -95 -98 -99 -98 -98 -93 -99 -98 -98 -98 -98 -98 -94 -83 -98 -97 -98 -98 -96 -98 -98 -98 -98 -92 -98 -94 -92 -95 -97 -91 -99 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -98 -95 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -87 -88 -88 -98 -96 -98 -95 -93 -98 -98 -97 -91 -97 -98 -99 -98 -98 -99 -88 -98 -86 -88 -87 -88 -88 -87 -87 -88 -88 -88 -84 -93 -91 -97 -98 -86 -82 -82 -82 -81 -81 -81 -82 -82 -82 -82 -82 -82 -98 -93 -92 -41 -93 -91 -92 -57 -81 -90 -98 -92 -82 -85 -81 -98 -97 -82 -80 -86 -99 -98 -93 -98 -98 -99 -97 -98 -98 -98 -96 -98 -98 -98 -98 -95 -98 -98 -98 -99 -98 -98 -98 -80 -93 -80 -98 -99 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -92 -92 -98 -98 -98 -98 -97 -87 -86 -98 -98 -90 -99 -98 -98 -96 -93 -78 -93 -93 -91 -98 -93 -93 -93 -93 -98 -92 -93 -94 -98 -98 -98 -98 -98 -98 -98 -98 -67 -93 -87 -99 -98 -97 -97 -86 -88 -88 -99 -99 -98 -98 -92 -98 -98 -98 -89 -98 -99 -98 -98 -98 -93 -98 -97 -97 -99 -96 -88 -92 -97 -96 -92 -92 -95 -91 -97 -97 -98 -99 -98 -99 -99 -98 -98 -98 -98 -98 -95 -95 -95 -85 -91 -89 -85 -87 -96 -98 -91 -94 -96 -97 -99 -84 -90 -85 -97 -86 -87 -86 -88 -90 -94 -87 -87 -86 -90 -87 -86 -90 -74 -97 -86 -86 -87 -88 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -82 -83 -98 -86 -99 -56 -99 -99 -98 -98 -98 -97 -98 -92 -92 -92 -92 -88 -98 -98 -98 -99 -98 -98 -98 -98 -93 -98 -98 -98 -98 -98 -95 -97 -98 -98 -98 -98 -94 -98 -92 -92 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -92 -98 -98 -98 -99 -99 -98 -99 -97 -87 -98 -98 -83 -82 -82 -82 -82 -82 -82 -77 -82 -82 -83 -82 -90 -91 -82 -82 -83 -83 -83 -83 -82 -83 -83 -83 -82 -81 -45 -78 -92 -80 -81 -80 -80 -81 -81 -80 -81 -81 -81 -81 -80 -81 -81 -80 -81 -80 -80 -80 -80 -81 -81 -81 -71 -98 -98 -98 -98 -98 -98 -41 -98 -98 -98 -91 -98 -98 -99 -98 -98 -99 -96 -85 -86 -88 -88 -86 -87 -88 -88 -87 -88 -98 -86 -82 -88 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -92 -81 -80 -80 -99 -98 -56 -86 -98 -92 -82 -94 -98 -95 -98 -98 -98 -89 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -28 -80 -76 -91 -92 -98 -94 -77 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -86 -87 -98 -98 -99 -83 -98 -98 -98 -98 -98 -98 -96 -87 -99 -98 -99 -98 -98 -98 -98 -98 -97 -78 -92 -98 -92 -92 -98 -95 -41 -80 -98 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -96 -98 -98 -98 -92 -98 -98 -97 -80 -98 -98 -99 -98 -98 -92 -98 -94 -98 -98 -82 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -95 -97 -95 -95 -98 -94 -98 -98 -98 -97 -98 -98 -98 -98 -80 -93 -84 -98 -97 -98 -98 -94 -95 -92 -92 -92 -92 -92 -92 -92 -91 -86 -86 -92 -91 -98 -98 -99 -99 -98 -98 -78 -98 -92 -97 -99 -98 -98 -97 -98 -99 -99 -98 -99 -98 -99 -98 -98 -98 -93 -93 -91 -93 -81 -96 -92 -98 -93 -81 -98 -98 -99 -81 -80 -80 -80 -80 -81 -81 -80 -80 -80 -80 -81 -99 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -82 -83 -83 -83 -83 -83 -83 -82 -83 -83 -82 -97 -97 -98 -90 -90 -98 -99 -94 -98 -99 -98 -91 -98 -97 -98 -94 -98 -96 -94 -93 -86 -97 -98 -99 -98 -95 -97 -98 -95 -98 -93 -93 -91 -92 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -99 -83 -89 -97 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -91 -98 -97 -98 -89 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -99 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -93 -93 -99 -93 -93 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -92 -92 -92 -92 -92 -91 -92 -92 -87 -98 -88 -88 -88 -88 -83 -82 -83 -83 -79 -83 -83 -83 -83 -83 -83 -83 -99 -80 -80 -81 -80 -80 -80 -80 -81 -80 -80 -80 -80 -41 -81 -98 -98 -99 -99 -81 -96 -80 -81 -81 -81 -80 -81 -81 -80 -80 -80 -80 -80 -41 -98 -80 -80 -80 -81 -80 -81 -80 -81 -81 -80 -80 -80 -41 -81 -81 -80 -80 -81 -80 -80 -81 -81 -81 -80 -80 -98 -83 -83 -83 -83 -83 -83 -83 -92 -92 -93 -92 -97 -98 -92 -92 -93 -98 -98 -98 -98 -98 -98 -98 -90 -93 -92 -93 -96 -92 -98 -85 -98 -91 -93 -99 -98 -92 -99 -99 -98 -96 -98 -98 -98 -89 -98 -99 -98 -99 -98 -98 -99 -98 -93 -93 -98 -86 -98 -88 -95 -99 -98 -98 -98 -98 -93 -98 -98 -98 -86 -98 -96 -88 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -99 -99 -98 -91 -92 -92 -85 -92 -96 -88 -86 -96 -85 -86 -86 -95 -91 -87 -87 -88 -95 -98 -87 -78 -92 -95 -98 -86 -96 -84 -87 -98 -99 -99 -98 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -94 -83 -95 -98 -92 -83 -87 -93 -98 -83 -82 -82 -82 -82 -82 -83 -83 -82 -83 -83 -83 -98 -98 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -99 -82 -82 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -98 -83 -83 -82 -83 -82 -83 -82 -82 -83 -82 -81 -82 -98 -80 -80 -80 -80 -80 -80 -80 -77 -81 -81 -81 -81 -92 -76 -92 -92 -41 -41 -93 -93 -92 -93 -93 -93 -93 -93 -93 -92 -93 -92 -93 -92 -92 -97 -98 -96 -81 -80 -81 -81 -81 -80 -81 -80 -81 -81 -81 -81 -98 -98 -98 -97 -97 -99 -98 -98 -98 -98 -98 -93 -97 -97 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -99 -98 -98 -98 -98 -98 -92 -92 -94 -92 -92 -96 -93 -98 -98 -86 -86 -88 -88 -87 -87 -88 -88 -98 -79 -80 -80 -80 -79 -79 -80 -80 -81 -77 -81 -81 -92 -92 -83 -84 -83 -83 -84 -84 -83 -83 -83 -83 -83 -84 -41 -98 -85 -99 -98 -41 -83 -83 -98 -83 -83 -82 -83 -82 -83 -83 -83 -83 -83 -82 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -86 -83 -86 -97 -92 -85 -98 -98 -92 -98 -98 -98 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -92 -92 -92 -92 -92 -92 -93 -78 -90 -92 -92 -83 -60 -89 -83 -83 -83 -83 -82 -83 -83 -83 -82 -83 -82 -82 -98 -80 -80 -80 -81 -81 -80 -81 -81 -80 -80 -80 -80 -98 -97 -98 -98 -83 -98 -98 -98 -41 -81 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -80 -80 -80 -81 -81 -80 -81 -81 -80 -41 -82 -86 -92 -87 -86 -87 -87 -86 -87 -82 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -87 -92 -99 -83 -83 -84 -83 -83 -98 -98 -50 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -82 -83 -98 -98 -63 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -81 -80 -93 -98 -86 -83 -81 -83 -83 -83 -83 -83 -83 -83 -83 -79 -82 -88 -90 -79 -90 -90 -91 -92 -60 -91 -91 -90 -91 -90 -79 -90 -90 -41 -90 -90 -90 -90 -92 -92 -93 -92 -92 -92 -91 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -77 -98 -93 -96 -98 -98 -99 -90 -98 -99 -98 -97 -98 -97 -98 -99 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -82 -91 -91 -41 -92 -85 -85 -89 -96 -86 -87 -87 -87 -87 -87 -88 -87 -85 -78 -87 -87 -87 -88 -87 -87 -87 -88 -88 -88 -41 -86 -86 -98 -95 -98 -98 -98 -84 -85 -83 -41 -98 -98 -98 -98 -98 -98 -90 -83 -82 -82 -84 -91 -99 -88 -99 -98 -98 -83 -83 -83 -83 -82 -83 -83 -82 -83 -83 -83 -83 -78 -83 -83 -84 -84 -83 -83 -83 -82 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -95 -81 -92 -92 -95 -92 -92 -92 -98 -86 -98 -41 -81 -81 -81 -81 -81 -81 -77 -81 -81 -81 -81 -81 -52 -94 -99 -41 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -48 -98 -87 -98 -91 -98 -98 -98 -98 -98 -98 -92 -93 -92 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -93 -92 -92 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -92 -91 -92 -91 -91 -91 -98 -99 -98 -86 -87 -87 -80 -80 -80 -80 -80 -80 -80 -80 -77 -80 -80 -80 -82 -82 -82 -82 -78 -81 -83 -84 -84 -84 -84 -84 -95 -98 -41 -98 -87 -98 -98 -98 -98 -98 -90 -97 -99 -84 -94 -83 -87 -83 -90 -99 -97 -82 -86 -98 -91 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -41 -96 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -98 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -81 -83 -83 -83 -83 -83 -41 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -83 -60 -95 -82 -95 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -87 -91 -41 -98 -86 -98 -91 -83 -83 -83 -83 -83 -82 -82 -83 -83 -82 -81 -82 -84 -81 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -78 -89 -81 -83 -92 -85 -86 -87 -95 -88 -81 -82 -83 -83 -83 -83 -77 -83 -83 -83 -83 -82 -98 -97 -95 -94 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -41 -81 -96 -92 -97 -81 -98 -81 -81 -81 -80 -81 -81 -81 -80 -81 -80 -81 -81 -95 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -95 -92 -92 -92 -95 -83 -83 -84 -83 -84 -83 -83 -83 -83 -83 -83 -83 -96 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -92 -96 -98 -85 -86 -81 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -41 -41 -93 -41 -87 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -74 -95 -92 -96 -93 -91 -80 -81 -81 -81 -81 -81 -81 -81 -80 -80 -81 -81 -96 -88 -83 -84 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -41 -41 -94 -45 -98 -96 -95 -97 -98 -93 -98 -98 -41 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -82 -83 -83 -83 -82 -82 -82 -83 -83 -81 -83 -81 -82 -84 -85 -79 -79 -80 -79 -80 -80 -80 -80 -80 -80 -77 -80 -89 -84 -92 -79 -82 -83 -82 -83 -83 -82 -82 -83 -83 -83 -83 -66 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -82 -92 -41 -99 -91 -98 -87 -83 -82 -92 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -80 -83 -41 -98 -83 -83 -83 -83 -83 -82 -83 -83 -83 -82 -83 -83 -95 -83 -92 -93 -98 -95 -93 -97 -98 -97 -93 -96 -98 -96 -99 -83 -83 -82 -83 -83 -83 -83 -82 -83 -83 -83 -83 -41 -98 -83 -83 -83 -77 -83 -83 -83 -83 -83 -83 -83 -81 -99 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -82 -92 -92 -97 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -99 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -71 -95 -98 -99 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -92 -92 -92 -92 -90 -98 -98 -96 -90 -86 -86 -87 -88 -86 -93 -93 -98 -98 -98 -82 -93 -91 -94 -83 -83 -82 -83 -83 -83 -83 -81 -83 -82 -83 -83 -41 -98 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -99 -95 -41 -98 -92 -98 -98 -98 -88 -98 -99 -98 -98 -98 -98 -98 -85 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -82 -82 -81 -83 -83 -83 -82 -83 -83 -98 -41 -99 -98 -83 -82 -83 -83 -83 -83 -83 -83 -83 -81 -82 -82 -41 -83 -83 -83 -83 -82 -83 -77 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -42 -92 -49 -98 -41 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -97 -98 -98 -97 -92 -92 -92 -92 -92 -92 -82 -83 -83 -81 -81 -82 -82 -83 -82 -83 -83 -83 -55 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -44 -41 -96 -82 -82 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -84 -98 -84 -83 -98 -98 -98 -92 -98 -98 -98 -89 -98 -98 -98 -98 -98 -98 -98 -97 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -41 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -99 -41 -95 -83 -83 -83 -83 -82 -83 -82 -83 -83 -83 -83 -83 -53 -81 -83 -83 -83 -83 -82 -83 -83 -83 -78 -83 -83 -91 -98 -81 -81 -81 -80 -80 -80 -80 -81 -80 -81 -80 -81 -41 -41 -98 -51 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -95 -95 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -50 -81 -95 -97 -86 -98 -86 -98 -98 -98 -94 -98 -98 -96 -90 -90 -96 -98 -94 -96 -95 -92 -92 -80 -80 -81 -81 -81 -79 -79 -80 -80 -80 -80 -80 -85 -41 -95 -79 -94 -91 -92 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -93 -92 -92 -98 -98 -96 -97 -98 -81 -81 -81 -98 -93 -98 -98 -94 -99 -98 -98 -95 -98 -98 -98 -98 -99 -98 -99 -98 -81 -81 -81 -81 -81 -81 -81 -79 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -98 -98 -98 -81 -80 -81 -81 -81 -80 -80 -81 -81 -81 -81 -80 -83 -79 -83 -83 -81 -83 -83 -83 -83 -83 -83 -81 -41 -87 -83 -81 -82 -81 -82 -82 -83 -83 -82 -83 -82 -83 -63 -92 -81 -81 -81 -81 -81 -80 -80 -80 -79 -80 -81 -81 -99 -98 -94 -95 -85 -83 -82 -82 -83 -82 -83 -82 -83 -82 -82 -82 -83 -88 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -41 -96 -83 -82 -83 -82 -82 -83 -82 -83 -83 -82 -83 -82 -82 -83 -83 -83 -83 -82 -83 -83 -83 -83 -82 -82 -92 -44 -83 -82 -82 -82 -81 -83 -81 -82 -83 -82 -81 -81 -84 -83 -78 -83 -83 -82 -83 -83 -83 -83 -83 -83 -82 -99 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -80 -81 -82 -96 -41 -90 -98 -82 -98 -97 -98 -98 -98 -92 -98 -97 -98 -89 -98 -98 -98 -99 -91 -81 -81 -81 -81 -81 -92 -97 -98 -98 -86 -92 -87 -95 -85 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -70 -93 -98 -98 -99 -78 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -97 -41 -95 -94 -95 -99 -98 -98 -94 -81 -98 -98 -99 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -88 -41 -98 -58 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -82 -84 -83 -83 -84 -84 -83 -83 -84 -84 -84 -84 -83 -41 -82 -83 -83 -83 -82 -82 -82 -83 -82 -82 -81 -81 -86 -82 -86 -81 -81 -81 -80 -80 -76 -80 -81 -81 -80 -80 -80 -47 -94 -92 -92 -98 -98 -83 -83 -83 -83 -83 -83 -82 -83 -82 -83 -82 -83 -82 -95 -94 -83 -83 -96 -91 -91 -86 -95 -98 -82 -83 -82 -82 -82 -82 -82 -82 -83 -83 -83 -83 -41 -41 -98 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -41 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -81 -83 -83 -82 -83 -82 -81 -82 -83 -41 -83 -83 -82 -83 -83 -79 -83 -83 -83 -83 -83 -83 -41 -41 -98 -82 -82 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -92 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -44 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -52 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -41 -98 -41 -98 -98 -98 -83 -83 -83 -83 -84 -83 -84 -84 -84 -84 -82 -83 -98 -41 -98 -99 -98 -98 -99 -96 -85 -85 -90 -91 -85 -85 -86 -86 -87 -98 -78 -90 -93 -90 -93 -93 -98 -97 -98 -92 -98 -98 -98 -98 -99 -92 -98 -98 -98 -98 -98 -77 -99 -83 -90 -98 -83 -95 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -41 -91 -98 -98 -86 -88 -98 -95 -98 -94 -90 -83 -83 -83 -83 -83 -82 -83 -83 -83 -82 -83 -83 -83 -82 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -96 -86 -80 -81 -80 -81 -81 -80 -81 -81 -81 -81 -81 -80 -91 -41 -93 -91 -94 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -87 -98 -90 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -49 -41 -98 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -83 -83 -81 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -78 -83 -98 -98 -41 -85 -83 -83 -83 -83 -82 -83 -83 -82 -83 -83 -83 -83 -92 -83 -64 -95 -98 -93 -91 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -89 -83 -83 -83 -83 -83 -61 -68 -83 -83 -83 -83 -83 -82 -60 -85 -98 -98 -86 -98 -95 -98 -97 -83 -83 -83 -83 -83 -83 -91 -81 -81 -81 -81 -80 -81 -96 -81 -81 -81 -81 -81 -81 -41 -43 -86 -98 -81 -81 -81 -81 -81 -82 -91 -91 -91 -91 -91 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -99 -92 -98 -81 -98 -98 -82 -81 -81 -82 -81 -81 -45 -41 -82 -81 -81 -82 -81 -81 -98 -84 -83 -84 -83 -83 -84 -42 -93 -99 -95 -98 -98 -94 -99 -98 -98 -98 -98 -83 -83 -83 -83 -83 -78 -83 -83 -83 -81 -83 -83 -64 -83 -98 -99 -98 -97 -98 -98 -87 -87 -98 -98 -92 -91 -92 -92 -92 -85 -86 -87 -89 -91 -95 -90 -98 -98 -98 -99 -98 -95 -90 -93 -83 -83 -83 -83 -82 -83 -93 -97 -81 -81 -76 -81 -81 -81 -82 -82 -82 -81 -81 -81 -91 -82 -41 -92 -98 -83 -93 -97 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -72 -83 -83 -83 -83 -83 -83 -83 -98 -41 -83 -83 -83 -83 -83 -83 -47 -99 -98 -87 -98 -86 -82 -82 -83 -83 -81 -83 -81 -81 -80 -81 -81 -80 -81 -81 -80 -81 -81 -81 -41 -98 -97 -83 -82 -81 -82 -83 -83 -87 -92 -98 -98 -86 -94 -79 -86 -84 -87 -83 -83 -82 -83 -82 -83 -41 -98 -82 -83 -83 -83 -83 -83 -96 -81 -81 -81 -81 -80 -81 -70 -81 -98 -98 -98 -98 -98 -98 -98 -92 -98 -96 -98 -95 -98 -98 -98 -81 -80 -81 -81 -81 -80 -86 -83 -83 -83 -83 -83 -83 -98 -64 -83 -83 -83 -83 -82 -83 -98 -98 -85 -86 -94 -86 -95 -94 -87 -95 -94 -92 -98 -98 -96 -98 -90 -90 -92 -92 -93 -93 -90 -92 -92 -85 -85 -86 -87 -98 -85 -85 -93 -91 -82 -82 -82 -78 -83 -83 -91 -80 -80 -80 -81 -81 -81 -70 -82 -83 -83 -83 -81 -81 -83 -82 -82 -83 -83 -83 -98 -90 -98 -67 -81 -98 -94 -98 -91 -82 -95 -81 -81 -80 -81 -81 -81 -77 -41 -92 -81 -81 -81 -80 -81 -81 -99 -84 -83 -83 -79 -83 -83 -95 -99 -47 -82 -82 -81 -81 -81 -82 -84 -83 -83 -83 -83 -83 -43 -84 -83 -83 -83 -83 -83 -91 -81 -81 -81 -81 -81 -79 -94 -82 -86 -98 -98 -97 -98 -98 -98 -98 -98 -83 -83 -83 -83 -83 -83 -98 -84 -82 -83 -83 -83 -83 -83 -80 -81 -80 -81 -81 -80 -52 -81 -81 -80 -80 -81 -81 -98 -98 -81 -81 -81 -81 -81 -81 -83 -83 -98 -98 -98 -98 -98 -99 -99 -98 -92 -92 -98 -94 -98 -81 -82 -81 -82 -83 -82 -83 -83 -82 -83 -81 -82 -92 -68 -81 -80 -79 -79 -79 -79 -80 -80 -81 -81 -81 -73 -84 -81 -81 -81 -81 -81 -59 -41 -98 -41 -81 -81 -80 -81 -81 -81 -98 -76 -81 -80 -80 -81 -81 -81 -98 -83 -85 -84 -95 -83 -83 -83 -83 -83 -83 -87 -41 -83 -83 -83 -81 -83 -83 -44 -83 -83 -83 -83 -83 -83 -41 -88 -83 -83 -83 -83 -83 -72 -98 -98 -98 -98 -98 -99 -99 -99 -98 -98 -98 -98 -98 -86 -85 -96 -98 -83 -83 -83 -83 -83 -83 -96 -85 -81 -81 -80 -81 -80 -79 -90 -91 -80 -82 -81 -83 -83 -83 -83 -78 -83 -82 -83 -83 -83 -89 -98 -41 -98 -98 -93 -41 -93 -98 -98 -86 -98 -98 -98 -98 -92 -98 -98 -97 -98 -98 -98 -98 -98 -80 -81 -80 -79 -81 -81 -98 -98 -82 -82 -83 -83 -83 -83 -96 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -99 -98 -83 -41 -98 -98 -99 -99 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -83 -83 -82 -82 -82 -83 -49 -83 -82 -82 -82 -80 -82 -93 -86 -86 -86 -86 -80 -80 -80 -80 -80 -80 -41 -98 -98 -98 -87 -93 -92 -92 -74 -83 -83 -83 -83 -83 -82 -98 -91 -83 -83 -83 -82 -83 -78 -58 -41 -41 -95 -83 -84 -84 -94 -98 -98 -97 -86 -83 -83 -83 -83 -82 -75 -83 -83 -83 -82 -83 -83 -91 -83 -83 -83 -83 -83 -85 -52 -83 -82 -83 -83 -83 -83 -98 -83 -92 -98 -98 -98 -98 -98 -92 -97 -94 -94 -98 -98 -95 -96 -98 -98 -98 -94 -94 -88 -92 -86 -98 -94 -97 -91 -92 -98 -98 -98 -98 -90 -93 -92 -90 -93 -96 -93 -93 -94 -99 -98 -98 -98 -97 -98 -97 -99 -98 -99 -95 -97 -97 -98 -98 -94 -94 -98 -98 -98 -98 -98 -98 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -41 -97 -98 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -41 -98 -99 -99 -90 -89 -94 -98 -98 -98 -98 -98 -98 -98 -83 -83 -83 -83 -83 -82 -83 -83 -82 -83 -83 -83 -92 -83 -85 -86 -86 -86 -85 -90 -94 -91 -86 -86 -85 -82 -82 -82 -83 -82 -83 -83 -82 -83 -82 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -92 -93 -84 -83 -98 -83 -84 -82 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -60 -83 -83 -83 -81 -82 -82 -83 -83 -83 -82 -83 -83 -93 -48 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -46 -83 -82 -83 -83 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -76 -81 -98 -41 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -41 -97 -81 -81 -81 -81 -80 -80 -81 -80 -81 -80 -79 -80 -81 -90 -41 -98 -80 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -84 -83 -83 -83 -81 -83 -83 -83 -83 -83 -82 -83 -48 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -90 -82 -82 -82 -80 -81 -82 -81 -83 -81 -81 -82 -84 -41 -78 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -77 -83 -83 -83 -83 -81 -83 -83 -83 -82 -83 -83 -83 -83 -92 -93 -83 -90 -98 -83 -91 -82 -95 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -98 -41 -98 -91 -98 -98 -98 -99 -98 -83 -83 -83 -83 -83 -80 -83 -83 -81 -83 -80 -83 -83 -82 -83 -83 -83 -83 -81 -83 -81 -83 -83 -83 -57 -41 -83 -81 -78 -82 -80 -81 -81 -83 -83 -82 -83 -83 -41 -41 -80 -80 -80 -81 -81 -80 -80 -81 -81 -81 -81 -81 -56 -81 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -98 -91 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -85 -41 -87 -94 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -85 -41 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -81 -80 -81 -80 -79 -80 -80 -80 -80 -80 -80 -80 -88 -86 -87 -86 -86 -86 -80 -87 -41 -78 -98 -98 -98 -98 -98 -99 -98 -98 -94 -92 -49 -83 -83 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -92 -94 -92 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -89 -83 -83 -83 -84 -83 -83 -84 -83 -83 -83 -83 -84 -81 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -41 -63 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -84 -78 -82 -83 -82 -83 -82 -82 -82 -83 -83 -82 -82 -99 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -42 -83 -83 -83 -83 -81 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -95 -99 -89 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -77 -81 -81 -80 -79 -80 -81 -81 -80 -79 -81 -80 -79 -86 -76 -81 -80 -81 -81 -79 -81 -81 -80 -80 -80 -81 -80 -41 -90 -89 -92 -94 -94 -73 -82 -83 -83 -83 -83 -82 -83 -83 -83 -82 -83 -82 -83 -83 -83 -82 -83 -83 -83 -72 -41 -83 -82 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -49 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -79 -81 -80 -81 -81 -80 -81 -81 -80 -81 -81 -80 -84 -91 -90 -90 -93 -92 -93 -98 -98 -63 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -81 -81 -91 -81 -41 -85 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -81 -81 -84 -82 -84 -83 -84 -83 -83 -84 -83 -83 -84 -81 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -84 -83 -83 -83 -83 -82 -83 -83 -83 -84 -83 -41 -97 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -82 -81 -82 -83 -84 -82 -82 -82 -81 -82 -82 -41 -87 -88 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -98 -98 -98 -95 -84 -83 -98 -84 -85 -94 -84 -83 -83 -83 -83 -83 -81 -82 -83 -83 -83 -82 -83 -82 -98 -94 -98 -98 -95 -93 -92 -94 -91 -41 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -65 -83 -82 -83 -82 -82 -83 -82 -83 -82 -82 -81 -82 -94 -81 -81 -80 -81 -79 -81 -81 -81 -82 -81 -82 -81 -55 -98 -98 -89 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -82 -81 -69 -92 -98 -98 -98 -82 -83 -83 -83 -82 -83 -82 -82 -83 -83 -81 -82 -88 -96 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -55 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -84 -82 -83 -83 -83 -83 -83 -83 -82 -82 -82 -82 -54 -87 -82 -81 -81 -82 -82 -82 -82 -83 -82 -82 -82 -82 -41 -98 -81 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -92 -92 -81 -80 -80 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -85 -41 -41 -90 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -80 -81 -98 -99 -84 -83 -83 -83 -83 -81 -83 -83 -83 -83 -83 -84 -98 -83 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -83 -83 -83 -83 -83 -41 -94 -90 -98 -81 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -88 -90 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -94 -41 -98 -41 -86 -92 -92 -92 -92 -80 -81 -80 -81 -80 -81 -81 -80 -81 -80 -81 -80 -98 -83 -83 -84 -84 -83 -84 -83 -83 -83 -84 -83 -84 -98 -73 -81 -80 -80 -82 -82 -82 -82 -83 -82 -83 -83 -78 -83 -83 -82 -98 -92 -98 -41 -98 -98 -98 -98 -98 -99 -85 -87 -95 -99 -98 -98 -98 -88 -92 -98 -98 -98 -85 -98 -92 -99 -83 -99 -83 -83 -83 -82 -83 -82 -83 -82 -83 -82 -83 -83 -41 -98 -84 -83 -83 -83 -83 -81 -83 -83 -81 -82 -83 -83 -41 -98 -80 -80 -79 -80 -80 -80 -79 -80 -80 -80 -80 -80 -51 -83 -83 -83 -82 -83 -83 -83 -82 -83 -83 -83 -83 -84 -84 -84 -83 -82 -81 -83 -83 -83 -84 -83 -83 -98 -99 -83 -76 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -83 -98 -98 -86 -99 -99 -98 -98 -98 -98 -91 -97 -98 -92 -93 -95 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -96 -93 -84 -91 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -80 -85 -88 -98 -98 -84 -98 -94 -91 -92 -92 -87 -98 -92 -93 -93 -94 -90 -98 -93 -98 -98 -97 -96 -97 -98 -92 -99 -97 -97 -98 -93 -92 -97 -97 -85 -86 -86 -87 -86 -86 -92 -86 -87 -96 -79 -93 -93 -92 -94 -93 -99 -98 -98 -98 -97 -91 -93 -91 -97 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -98 -96 -83 -83 -98 -93 -98 -69 -84 -84 -84 -83 -83 -83 -83 -84 -83 -84 -83 -78 -90 -83 -83 -83 -83 -83 -83 -83 -82 -84 -83 -83 -85 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -84 -84 -84 -84 -83 -83 -84 -83 -83 -83 -83 -83 -81 -98 -84 -84 -82 -82 -84 -76 -84 -84 -84 -84 -83 -84 -85 -95 -84 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -98 -85 -83 -84 -84 -83 -84 -83 -84 -84 -84 -84 -83 -53 -98 -72 -85 -92 -81 -81 -81 -80 -81 -81 -81 -80 -81 -81 -80 -80 -41 -94 -80 -81 -81 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -80 -81 -81 -41 -96 -81 -97 -84 -84 -84 -83 -82 -84 -84 -84 -83 -84 -84 -82 -89 -95 -81 -82 -82 -83 -81 -83 -84 -83 -78 -83 -84 -81 -96 -90 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -98 -94 -93 -84 -93 -98 -93 -96 -85 -86 -98 -98 -98 -98 -98 -95 -98 -98 -98 -85 -85 -85 -98 -90 -98 -97 -82 -82 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -92 -83 -97 -98 -93 -49 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -80 -80 -81 -80 -81 -98 -86 -84 -81 -84 -84 -78 -82 -84 -84 -84 -77 -84 -83 -91 -94 -99 -81 -81 -83 -82 -78 -83 -83 -81 -83 -83 -83 -83 -83 -84 -83 -63 -93 -89 -93 -93 -93 -93 -93 -87 -83 -83 -84 -84 -84 -84 -84 -84 -83 -83 -84 -63 -84 -81 -81 -78 -81 -81 -80 -79 -80 -81 -80 -79 -80 -98 -81 -98 -86 -98 -98 -98 -98 -84 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -84 -56 -84 -83 -84 -84 -83 -83 -82 -83 -84 -83 -83 -83 -93 -91 -93 -91 -93 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -81 -81 -41 -98 -91 -91 -92 -82 -92 -95 -86 -94 -98 -98 -41 -83 -83 -84 -83 -83 -83 -84 -83 -84 -83 -84 -83 -83 -84 -81 -83 -83 -83 -83 -83 -83 -83 -84 -83 -90 -80 -81 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -41 -41 -80 -80 -81 -80 -80 -81 -79 -80 -81 -81 -80 -81 -41 -94 -94 -93 -81 -81 -77 -81 -81 -81 -80 -81 -81 -81 -81 -81 -93 -95 -84 -84 -84 -83 -83 -83 -85 -84 -83 -84 -84 -84 -98 -94 -94 -81 -94 -96 -41 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -80 -81 -98 -98 -86 -94 -89 -83 -90 -89 -84 -96 -97 -94 -92 -90 -92 -97 -98 -94 -98 -89 -91 -91 -95 -98 -96 -93 -93 -92 -92 -92 -95 -92 -92 -92 -92 -92 -92 -93 -93 -92 -98 -85 -98 -97 -86 -86 -85 -87 -89 -97 -95 -87 -98 -86 -80 -85 -84 -88 -87 -84 -86 -94 -93 -85 -84 -84 -85 -85 -93 -87 -86 -88 -94 -99 -98 -85 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -94 -87 -83 -84 -92 -98 -92 -99 -98 -98 -98 -81 -93 -83 -83 -88 -88 -41 -83 -83 -83 -83 -83 -83 -83 -83 -81 -81 -82 -83 -92 -41 -87 -82 -81 -83 -83 -83 -83 -82 -83 -83 -83 -83 -71 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -85 -98 -41 -83 -83 -83 -83 -83 -83 -78 -82 -83 -82 -83 -82 -41 -85 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -77 -83 -85 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -97 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -80 -80 -93 -99 -81 -81 -81 -80 -81 -81 -81 -80 -81 -80 -81 -81 -81 -98 -83 -84 -83 -84 -84 -83 -84 -84 -84 -84 -83 -84 -63 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -81 -64 -41 -48 -83 -82 -82 -83 -83 -83 -77 -83 -82 -83 -83 -81 -83 -93 -93 -98 -80 -80 -80 -80 -80 -80 -80 -80 -81 -79 -80 -80 -85 -80 -87 -93 -93 -81 -99 -98 -99 -86 -90 -98 -81 -80 -81 -80 -81 -79 -80 -80 -80 -80 -80 -79 -87 -94 -81 -81 -80 -83 -83 -83 -82 -82 -83 -83 -83 -83 -82 -82 -41 -98 -92 -86 -80 -80 -80 -80 -80 -80 -80 -81 -81 -81 -79 -80 -41 -81 -81 -81 -81 -81 -81 -81 -80 -81 -80 -81 -80 -93 -41 -97 -81 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -81 -93 -56 -41 -92 -41 -97 -98 -91 -98 -98 -81 -81 -81 -81 -81 -80 -81 -80 -81 -81 -81 -80 -94 -85 -81 -80 -81 -81 -80 -80 -81 -80 -81 -80 -80 -70 -93 -98 -98 -98 -99 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -41 -82 -83 -82 -83 -83 -82 -82 -83 -81 -83 -83 -83 -43 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -82 -81 -83 -83 -96 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -69 -84 -41 -98 -83 -83 -81 -81 -83 -83 -83 -83 -83 -84 -84 -83 -83 -98 -83 -83 -83 -83 -83 -83 -84 -84 -84 -84 -84 -83 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -49 -49 -98 -98 -98 -97 -86 -98 -99 -98 -99 -98 -91 -94 -98 -98 -90 -98 -92 -93 -99 -80 -81 -80 -81 -80 -81 -81 -80 -81 -81 -81 -81 -99 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -41 -83 -84 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -94 -41 -83 -83 -83 -83 -83 -83 -82 -82 -83 -81 -83 -84 -40 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -84 -97 -97 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -80 -81 -81 -80 -80 -80 -81 -80 -80 -81 -81 -80 -85 -77 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -79 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -98 -93 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -98 -80 -80 -80 -80 -80 -80 -80 -81 -80 -76 -81 -81 -48 -98 -98 -98 -98 -99 -97 -98 -81 -81 -81 -81 -80 -81 -80 -80 -80 -80 -81 -81 -99 -84 -84 -84 -84 -83 -84 -84 -83 -84 -84 -84 -84 -85 -81 -83 -83 -83 -83 -83 -82 -83 -82 -78 -82 -82 -41 -92 -51 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -80 -81 -80 -80 -91 -91 -91 -41 -91 -91 -89 -41 -88 -84 -92 -81 -83 -82 -81 -83 -83 -83 -83 -83 -83 -83 -83 -59 -83 -94 -41 -98 -98 -41 -83 -83 -83 -83 -83 -82 -83 -83 -83 -81 -83 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -74 -83 -83 -83 -80 -81 -81 -81 -81 -82 -78 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -61 -80 -67 -99 -93 -96 -80 -85 -81 -98 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -94 -98 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -98 -82 -83 -83 -84 -81 -84 -84 -81 -84 -84 -84 -83 -99 -98 -72 -81 -81 -81 -80 -81 -81 -80 -79 -81 -81 -79 -90 -92 -93 -78 -84 -84 -83 -83 -83 -83 -82 -83 -82 -83 -84 -82 -83 -84 -84 -83 -84 -83 -84 -84 -83 -82 -82 -83 -98 -97 -87 -81 -81 -81 -81 -81 -79 -81 -81 -81 -80 -81 -81 -48 -84 -92 -93 -98 -84 -95 -85 -80 -81 -81 -81 -81 -81 -80 -81 -79 -79 -81 -81 -81 -95 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -80 -80 -86 -95 -84 -84 -83 -81 -83 -83 -81 -84 -82 -84 -84 -84 -86 -83 -82 -81 -81 -81 -83 -82 -81 -83 -83 -77 -81 -70 -93 -98 -81 -81 -81 -80 -81 -81 -81 -81 -80 -81 -81 -81 -49 -94 -76 -81 -81 -81 -81 -81 -81 -80 -80 -81 -81 -81 -56 -99 -81 -81 -95 -81 -98 -95 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -89 -55 -89 -81 -84 -95 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -55 -89 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -97 -41 -93 -92 -89 -84 -92 -91 -85 -94 -97 -97 -97 -85 -98 -94 -91 -94 -91 -92 -90 -92 -84 -99 -99 -92 -98 -98 -96 -98 -98 -93 -91 -98 -98 -98 -93 -84 -83 -81 -84 -98 -81 -89 -81 -81 -80 -80 -80 -81 -81 -80 -80 -80 -81 -80 -46 -98 -98 -96 -96 -99 -98 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -85 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -67 -41 -85 -83 -84 -83 -83 -84 -83 -84 -84 -84 -84 -82 -81 -87 -88 -79 -85 -98 -88 -85 -55 -82 -82 -81 -81 -80 -83 -83 -83 -83 -81 -82 -83 -86 -98 -86 -98 -97 -44 -84 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -75 -83 -88 -95 -82 -98 -83 -81 -83 -83 -83 -83 -83 -83 -83 -83 -81 -83 -83 -84 -83 -84 -84 -84 -83 -83 -83 -83 -83 -84 -83 -41 -73 -84 -81 -83 -82 -83 -84 -84 -84 -83 -83 -83 -83 -41 -41 -87 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -84 -91 -97 -79 -80 -81 -80 -81 -81 -81 -81 -81 -81 -77 -81 -91 -84 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -95 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -91 -83 -84 -83 -84 -83 -83 -83 -84 -84 -84 -84 -83 -84 -41 -97 -98 -96 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -99 -81 -81 -80 -80 -79 -80 -81 -81 -81 -81 -81 -77 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -92 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -84 -98 -86 -99 -83 -84 -83 -83 -82 -83 -83 -83 -83 -84 -83 -83 -97 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -64 -41 -95 -83 -83 -84 -83 -83 -83 -83 -83 -83 -84 -83 -84 -84 -83 -82 -84 -83 -83 -83 -84 -83 -84 -83 -84 -88 -41 -41 -83 -82 -82 -83 -84 -84 -84 -84 -84 -84 -83 -41 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -95 -41 -92 -82 -82 -81 -82 -81 -81 -81 -82 -81 -82 -81 -81 -82 -98 -91 -92 -99 -84 -83 -84 -83 -84 -83 -84 -83 -83 -83 -83 -84 -83 -98 -83 -83 -83 -83 -83 -83 -83 -84 -84 -83 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -61 -41 -84 -84 -84 -84 -84 -84 -83 -83 -84 -83 -83 -83 -41 -87 -59 -93 -84 -81 -81 -81 -81 -81 -81 -80 -81 -81 -77 -81 -83 -81 -98 -98 -99 -94 -97 -97 -83 -82 -81 -82 -82 -81 -82 -82 -81 -82 -81 -82 -82 -98 -98 -99 -94 -83 -41 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -84 -84 -84 -84 -84 -84 -84 -82 -81 -82 -84 -82 -84 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -99 -84 -84 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -84 -84 -84 -84 -84 -84 -84 -83 -81 -83 -83 -84 -68 -83 -84 -84 -84 -77 -83 -83 -83 -84 -84 -84 -84 -84 -41 -41 -84 -84 -84 -84 -84 -83 -83 -84 -84 -84 -83 -83 -41 -96 -84 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -98 -41 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -94 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -84 -84 -84 -84 -84 -84 -84 -83 -84 -82 -82 -83 -99 -84 -84 -83 -82 -83 -84 -83 -83 -84 -83 -84 -83 -82 -87 -89 -88 -86 -89 -41 -98 -93 -93 -78 -98 -92 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -95 -85 -98 -99 -87 -98 -99 -98 -99 -98 -98 -99 -98 -98 -91 -98 -98 -98 -83 -83 -83 -83 -83 -84 -84 -83 -83 -83 -84 -83 -82 -83 -76 -83 -81 -83 -82 -82 -83 -83 -83 -80 -49 -88 -86 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -81 -81 -83 -83 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -41 -99 -99 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -95 -92 -92 -86 -81 -81 -81 -82 -81 -80 -81 -81 -81 -81 -81 -81 -90 -97 -90 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -88 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -41 -83 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -80 -84 -99 -84 -83 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -89 -92 -94 -93 -97 -82 -81 -81 -81 -81 -79 -81 -81 -81 -81 -81 -81 -55 -81 -98 -98 -82 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -55 -41 -41 -82 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -82 -41 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -89 -41 -91 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -41 -97 -41 -91 -57 -81 -81 -81 -81 -81 -81 -81 -76 -81 -81 -81 -81 -68 -93 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -41 -83 -82 -84 -82 -83 -82 -83 -84 -84 -84 -83 -83 -41 -92 -81 -83 -95 -73 -91 -52 -83 -83 -83 -83 -83 -81 -83 -83 -83 -83 -83 -81 -83 -81 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -82 -83 -83 -83 -83 -82 -83 -81 -82 -83 -83 -83 -82 -83 -83 -83 -83 -83 -81 -83 -83 -81 -51 -82 -82 -82 -82 -83 -82 -82 -82 -82 -77 -82 -82 -47 -81 -81 -80 -81 -81 -81 -81 -80 -80 -81 -81 -81 -92 -81 -98 -99 -93 -98 -84 -94 -99 -98 -97 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -69 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -82 -83 -98 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -81 -83 -83 -82 -83 -83 -83 -83 -99 -98 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -92 -98 -98 -98 -85 -92 -93 -98 -77 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -94 -83 -57 -83 -84 -83 -83 -81 -81 -83 -83 -83 -83 -83 -82 -91 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -89 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -71 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -93 -98 -81 -80 -80 -80 -81 -80 -81 -81 -81 -81 -81 -76 -93 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -92 -92 -92 -98 -98 -83 -83 -83 -83 -83 -82 -81 -92 -92 -82 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -92 -81 -81 -81 -82 -81 -81 -82 -81 -81 -81 -81 -82 -92 -83 -84 -84 -84 -84 -84 -84 -84 -84 -82 -84 -84 -98 -79 -83 -83 -83 -83 -83 -77 -83 -83 -83 -82 -83 -83 -85 -92 -92 -98 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -57 -92 -91 -81 -80 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -49 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -98 -81 -81 -81 -81 -81 -81 -81 -82 -82 -81 -81 -81 -92 -84 -83 -83 -83 -84 -84 -83 -83 -83 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -83 -83 -82 -82 -82 -83 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -57 -98 -90 -84 -83 -83 -83 -84 -83 -84 -83 -83 -83 -83 -83 -72 -87 -91 -98 -97 -98 -91 -84 -83 -83 -83 -81 -83 -83 -83 -83 -83 -83 -83 -70 -98 -81 -81 -82 -81 -81 -81 -81 -81 -82 -81 -81 -81 -98 -82 -82 -82 -82 -81 -81 -82 -82 -82 -82 -82 -82 -93 -92 -92 -92 -99 -81 -82 -82 -82 -82 -80 -82 -82 -82 -82 -82 -82 -85 -84 -83 -80 -83 -83 -80 -83 -83 -81 -83 -83 -83 -78 -91 -91 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -88 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -84 -83 -92 -82 -81 -81 -82 -82 -82 -81 -82 -81 -81 -81 -84 -52 -70 -95 -83 -83 -83 -84 -83 -83 -84 -84 -84 -84 -84 -84 -84 -90 -83 -84 -84 -84 -84 -84 -84 -84 -82 -82 -82 -82 -80 -80 -80 -81 -81 -81 -78 -81 -81 -81 -81 -81 -41 -58 -94 -90 -92 -96 -91 -98 -99 -97 -99 -98 -98 -99 -98 -94 -93 -91 -95 -84 -75 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -82 -84 -80 -41 -91 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -88 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -96 -98 -84 -84 -84 -84 -84 -83 -84 -84 -83 -82 -84 -83 -97 -81 -81 -82 -81 -81 -76 -81 -81 -81 -81 -81 -81 -81 -91 -92 -92 -98 -98 -98 -98 -99 -98 -97 -98 -92 -99 -98 -93 -98 -81 -98 -98 -98 -98 -98 -98 -98 -97 -93 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -100 -95 -84 -84 -84 -84 -84 -83 -84 -83 -84 -84 -84 -84 -77 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -92 -99 -78 -83 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -81 -81 -98 -89 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -84 -98 -50 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -41 -91 -84 -84 -83 -83 -84 -82 -84 -84 -84 -84 -84 -84 -99 -81 -80 -80 -81 -81 -79 -79 -80 -80 -81 -80 -80 -77 -83 -91 -92 -96 -46 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -80 -86 -82 -84 -82 -81 -84 -84 -84 -84 -84 -84 -84 -84 -98 -82 -99 -82 -80 -80 -79 -82 -82 -82 -81 -81 -82 -82 -82 -52 -81 -82 -81 -81 -81 -81 -82 -82 -81 -80 -81 -80 -92 -84 -98 -98 -98 -99 -98 -98 -85 -85 -85 -85 -85 -85 -84 -85 -83 -85 -83 -85 -97 -84 -85 -84 -85 -85 -84 -84 -84 -83 -82 -83 -83 -81 -87 -88 -85 -82 -82 -77 -84 -84 -83 -84 -84 -84 -84 -84 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -99 -94 -84 -98 -92 -91 -98 -99 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -83 -84 -85 -84 -84 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -92 -92 -91 -98 -94 -99 -98 -98 -98 -84 -84 -83 -84 -84 -84 -84 -83 -84 -84 -82 -83 -41 -95 -95 -91 -83 -83 -84 -84 -78 -84 -83 -84 -84 -84 -84 -84 -98 -81 -82 -81 -82 -82 -82 -81 -82 -81 -81 -82 -81 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -92 -97 -85 -85 -84 -84 -84 -84 -85 -84 -84 -84 -84 -84 -98 -92 -97 -98 -91 -90 -97 -90 -90 -98 -98 -89 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -88 -94 -94 -91 -91 -99 -98 -97 -98 -90 -98 -98 -98 -92 -94 -84 -97 -97 -88 -88 -89 -88 -88 -87 -99 -97 -98 -98 -78 -93 -92 -95 -93 -93 -93 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -93 -84 -92 -84 -91 -98 -60 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -95 -66 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -69 -89 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -85 -98 -98 -98 -84 -84 -84 -84 -84 -84 -84 -83 -84 -83 -83 -84 -41 -99 -91 -84 -84 -83 -81 -83 -84 -84 -84 -84 -84 -84 -83 -80 -83 -83 -83 -84 -84 -84 -84 -84 -84 -83 -82 -98 -92 -81 -95 -95 -98 -82 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -83 -81 -81 -82 -82 -81 -81 -81 -82 -82 -81 -81 -80 -97 -96 -98 -84 -84 -84 -85 -84 -82 -85 -84 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -82 -82 -84 -83 -84 -41 -98 -84 -84 -84 -77 -84 -83 -84 -84 -84 -84 -82 -84 -75 -98 -98 -99 -90 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -85 -91 -92 -98 -84 -98 -85 -81 -82 -82 -81 -82 -81 -82 -81 -82 -82 -82 -82 -90 -92 -47 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -85 -84 -84 -84 -84 -84 -84 -84 -84 -85 -53 -98 -82 -81 -81 -82 -81 -82 -81 -81 -81 -81 -81 -81 -99 -98 -53 -82 -84 -84 -84 -84 -84 -84 -84 -84 -84 -77 -84 -92 -92 -98 -84 -84 -85 -84 -82 -84 -84 -84 -84 -85 -84 -85 -85 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -84 -92 -84 -92 -81 -95 -87 -96 -92 -89 -94 -90 -81 -81 -81 -82 -81 -81 -82 -82 -81 -81 -81 -82 -81 -98 -99 -99 -98 -98 -41 -82 -81 -82 -82 -81 -82 -82 -82 -82 -82 -82 -81 -98 -92 -86 -86 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -74 -82 -83 -82 -82 -82 -82 -83 -84 -83 -82 -83 -84 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -92 -92 -92 -98 -41 -84 -84 -84 -84 -84 -85 -84 -84 -84 -84 -84 -84 -81 -98 -94 -91 -98 -90 -99 -98 -83 -41 -81 -82 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -98 -92 -92 -84 -84 -81 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -99 -84 -84 -84 -84 -84 -84 -82 -84 -82 -84 -83 -84 -98 -80 -80 -80 -80 -80 -81 -81 -81 -81 -81 -81 -80 -99 -77 -93 -92 -90 -93 -94 -95 -92 -91 -98 -99 -41 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -97 -84 -84 -52 -81 -81 -80 -81 -81 -80 -81 -81 -80 -80 -81 -80 -88 -80 -81 -81 -81 -81 -80 -81 -81 -81 -81 -80 -74 -77 -81 -81 -80 -81 -81 -80 -80 -81 -81 -81 -81 -80 -40 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -92 -92 -84 -84 -84 -84 -83 -84 -84 -84 -80 -81 -81 -81 -85 -80 -80 -80 -81 -80 -80 -81 -80 -81 -80 -81 -81 -92 -93 -98 -98 -96 -98 -99 -98 -98 -41 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -78 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -98 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -84 -83 -84 -84 -84 -98 -98 -80 -81 -81 -81 -81 -81 -80 -80 -81 -81 -81 -81 -81 -85 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -82 -82 -84 -84 -84 -84 -85 -97 -95 -87 -84 -84 -84 -81 -84 -84 -84 -84 -83 -84 -85 -84 -85 -84 -84 -84 -84 -84 -84 -84 -84 -83 -81 -84 -41 -91 -83 -82 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -83 -81 -80 -81 -81 -81 -81 -81 -81 -80 -81 -81 -94 -97 -97 -41 -84 -84 -84 -81 -81 -81 -81 -83 -84 -84 -84 -84 -92 -78 -83 -83 -83 -83 -84 -84 -84 -84 -84 -84 -84 -83 -99 -99 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -98 -81 -98 -98 -87 -83 -80 -80 -80 -80 -80 -80 -81 -80 -81 -81 -81 -67 -93 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -81 -51 -80 -81 -80 -80 -80 -81 -81 -80 -81 -80 -80 -80 -95 -98 -80 -80 -80 -80 -81 -81 -81 -80 -80 -81 -81 -80 -89 -84 -83 -84 -84 -84 -85 -85 -85 -85 -84 -85 -70 -97 -84 -82 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -83 -86 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -85 -91 -95 -86 -84 -84 -85 -85 -85 -84 -84 -84 -84 -84 -85 -49 -93 -85 -85 -85 -85 -85 -85 -84 -84 -85 -85 -85 -85 -95 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -85 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -90 -86 -85 -85 -84 -84 -82 -82 -82 -82 -82 -83 -85 -98 -41 -80 -81 -79 -81 -81 -81 -81 -81 -81 -82 -81 -81 -92 -93 -90 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -92 -92 -86 -98 -92 -85 -41 -84 -99 -95 -89 -85 -83 -84 -83 -84 -85 -84 -85 -84 -84 -85 -65 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -98 -90 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -89 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -98 -79 -81 -81 -81 -81 -81 -81 -81 -81 -76 -81 -81 -90 -90 -99 -84 -84 -85 -85 -85 -84 -84 -85 -85 -84 -85 -85 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -99 -50 -97 -90 -84 -85 -84 -84 -84 -83 -84 -84 -84 -85 -84 -84 -88 -98 -84 -84 -84 -84 -84 -85 -84 -84 -84 -84 -85 -85 -90 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -86 -99 -98 -98 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -98 -84 -89 -83 -94 -89 -89 -89 -99 -98 -98 -92 -84 -98 -90 -92 -92 -92 -92 -92 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -92 -95 -92 -86 -84 -84 -84 -84 -84 -84 -85 -84 -84 -84 -84 -41 -92 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -79 -81 -81 -81 -81 -81 -81 -81 -81 -77 -81 -81 -92 -92 -45 -55 -97 -95 -91 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -91 -93 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -86 -86 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -90 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -64 -41 -96 -98 -98 -98 -99 -98 -86 -98 -98 -98 -98 -97 -98 -98 -98 -84 -99 -98 -99 -98 -99 -98 -97 -89 -88 -89 -90 -90 -89 -89 -89 -89 -90 -89 -77 -90 -98 -92 -98 -98 -98 -95 -85 -96 -91 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -80 -97 -82 -90 -41 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -92 -93 -95 -92 -92 -93 -92 -98 -95 -98 -91 -99 -99 -98 -98 -98 -99 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -98 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -99 -82 -81 -78 -81 -81 -81 -81 -81 -79 -81 -81 -81 -75 -92 -99 -99 -89 -93 -99 -98 -98 -98 -98 -94 -98 -84 -98 -89 -81 -82 -81 -80 -81 -81 -82 -81 -81 -81 -82 -82 -70 -81 -82 -82 -82 -81 -81 -82 -81 -81 -82 -82 -81 -93 -98 -82 -81 -81 -81 -82 -81 -81 -82 -81 -82 -82 -82 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -91 -91 -98 -81 -81 -81 -81 -81 -81 -80 -81 -80 -81 -80 -81 -41 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -93 -92 -94 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -90 -84 -98 -96 -99 -90 -94 -84 -84 -84 -83 -84 -83 -83 -83 -83 -83 -84 -74 -43 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -99 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -92 -98 -85 -84 -84 -84 -84 -84 -84 -84 -84 -83 -82 -83 -62 -85 -89 -84 -84 -83 -84 -82 -84 -81 -84 -84 -84 -84 -69 -76 -83 -83 -81 -81 -84 -84 -83 -84 -84 -84 -84 -85 -86 -98 -80 -80 -80 -80 -80 -81 -80 -81 -80 -80 -80 -81 -67 -84 -97 -91 -85 -41 -79 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -84 -83 -84 -84 -84 -84 -84 -83 -81 -84 -83 -84 -92 -80 -98 -84 -85 -88 -86 -89 -89 -90 -97 -98 -98 -98 -90 -97 -90 -93 -98 -84 -83 -83 -83 -83 -84 -83 -84 -83 -83 -83 -83 -83 -98 -96 -98 -93 -97 -98 -84 -89 -91 -98 -98 -83 -83 -83 -83 -83 -83 -83 -84 -84 -83 -83 -83 -83 -96 -89 -84 -84 -83 -84 -83 -83 -83 -83 -83 -83 -83 -87 -97 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -91 -98 -98 -41 -84 -83 -84 -83 -82 -83 -83 -83 -83 -83 -83 -83 -93 -83 -76 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -98 -98 -93 -95 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -81 -89 -93 -89 -95 -83 -55 -80 -81 -79 -80 -80 -80 -79 -81 -81 -81 -81 -81 -92 -92 -93 -98 -43 -83 -83 -83 -83 -82 -82 -83 -82 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -95 -99 -81 -80 -80 -80 -80 -81 -80 -80 -81 -81 -80 -80 -84 -87 -85 -98 -98 -80 -81 -81 -81 -80 -80 -80 -80 -80 -80 -80 -80 -88 -86 -92 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -99 -81 -98 -99 -89 -98 -84 -81 -81 -98 -94 -95 -96 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -82 -83 -83 -83 -82 -84 -97 -93 -93 -81 -81 -80 -80 -81 -80 -80 -80 -81 -80 -81 -81 -41 -94 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -80 -81 -81 -81 -80 -81 -81 -81 -81 -75 -81 -81 -81 -81 -99 -92 -91 -93 -84 -83 -84 -84 -84 -84 -84 -84 -83 -83 -83 -83 -92 -96 -98 -88 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -82 -69 -93 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -51 -83 -77 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -84 -83 -83 -83 -84 -83 -83 -83 -84 -84 -84 -84 -94 -79 -80 -80 -79 -80 -80 -80 -79 -80 -80 -76 -81 -85 -90 -89 -85 -99 -98 -98 -98 -83 -81 -81 -81 -80 -80 -80 -80 -80 -81 -81 -81 -81 -91 -98 -97 -89 -94 -98 -97 -88 -91 -80 -81 -81 -80 -81 -81 -81 -80 -81 -81 -80 -81 -93 -40 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -80 -81 -81 -80 -81 -81 -81 -81 -89 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -87 -82 -98 -93 -93 -90 -91 -98 -99 -98 -75 -94 -98 -91 -83 -98 -98 -98 -98 -98 -97 -98 -97 -91 -92 -92 -92 -95 -98 -98 -90 -98 -98 -98 -98 -98 -97 -84 -84 -84 -84 -84 -83 -83 -83 -83 -83 -84 -83 -99 -98 -80 -80 -81 -81 -81 -81 -81 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -90 -89 -84 -84 -82 -83 -83 -84 -83 -84 -84 -85 -84 -84 -41 -84 -93 -93 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -98 -80 -80 -80 -80 -81 -80 -80 -80 -81 -81 -80 -81 -92 -98 -94 -95 -92 -73 -77 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -79 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -80 -81 -81 -67 -93 -81 -81 -81 -80 -81 -81 -80 -81 -81 -81 -81 -79 -57 -80 -79 -81 -79 -81 -81 -81 -79 -81 -81 -81 -81 -46 -92 -90 -91 -99 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -83 -83 -83 -83 -84 -83 -42 -84 -95 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -83 -41 -69 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -84 -84 -94 -98 -98 -98 -97 -93 -98 -84 -84 -84 -84 -84 -84 -83 -82 -84 -84 -84 -83 -98 -84 -84 -84 -84 -84 -84 -84 -81 -82 -82 -81 -82 -84 -80 -79 -81 -79 -81 -81 -81 -81 -81 -80 -80 -80 -41 -93 -93 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -80 -81 -48 -81 -98 -98 -58 -98 -92 -81 -81 -81 -81 -81 -80 -81 -81 -80 -81 -81 -81 -95 -99 -98 -99 -98 -98 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -81 -41 -85 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -85 -84 -98 -80 -80 -81 -81 -80 -81 -81 -80 -80 -80 -76 -80 -99 -92 -93 -84 -84 -84 -84 -84 -84 -84 -83 -82 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -98 -41 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -41 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -83 -81 -82 -84 -84 -84 -84 -84 -84 -84 -91 -87 -94 -93 -92 -93 -93 -64 -98 -88 -93 -98 -92 -98 -41 -84 -84 -84 -84 -83 -84 -84 -83 -84 -83 -83 -84 -41 -84 -90 -84 -84 -84 -84 -84 -81 -84 -83 -95 -92 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -82 -83 -84 -84 -84 -84 -84 -77 -84 -84 -69 -97 -41 -92 -94 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -98 -41 -97 -98 -68 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -99 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -90 -80 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -97 -41 -93 -93 -98 -46 -81 -81 -80 -81 -81 -81 -80 -80 -81 -81 -81 -81 -96 -87 -41 -85 -80 -86 -84 -85 -85 -85 -78 -85 -59 -85 -86 -85 -85 -85 -84 -86 -85 -98 -41 -98 -98 -99 -92 -84 -95 -85 -90 -87 -53 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -41 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -97 -98 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -41 -41 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -41 -98 -80 -80 -81 -80 -80 -80 -76 -81 -81 -81 -81 -80 -86 -81 -79 -80 -81 -80 -81 -81 -81 -81 -81 -80 -67 -41 -99 -41 -80 -81 -80 -80 -81 -80 -80 -80 -80 -81 -81 -80 -41 -96 -90 -98 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -81 -80 -81 -80 -80 -81 -92 -81 -81 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -41 -93 -93 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -99 -93 -80 -80 -81 -81 -79 -80 -80 -80 -80 -80 -81 -80 -81 -98 -48 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -93 -93 -81 -81 -81 -80 -81 -81 -80 -81 -81 -81 -81 -81 -99 -41 -99 -98 -98 -90 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -60 -41 -84 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -58 -41 -92 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -92 -84 -80 -81 -81 -81 -81 -81 -81 -81 -81 -77 -80 -81 -81 -94 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -91 -84 -84 -84 -84 -83 -84 -83 -83 -82 -84 -83 -78 -41 -94 -83 -95 -98 -95 -98 -98 -92 -88 -84 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -84 -83 -83 -84 -84 -84 -83 -84 -83 -84 -84 -45 -90 -98 -98 -98 -98 -96 -97 -98 -83 -78 -83 -84 -83 -84 -84 -84 -84 -84 -84 -83 -83 -98 -92 -98 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -97 -83 -81 -96 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -85 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -75 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -41 -96 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -41 -84 -84 -84 -84 -84 -84 -81 -83 -83 -81 -83 -83 -91 -84 -84 -84 -83 -83 -82 -83 -83 -83 -83 -83 -71 -41 -84 -83 -83 -83 -84 -83 -83 -82 -83 -83 -83 -83 -98 -98 -48 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -80 -80 -80 -80 -81 -80 -81 -81 -80 -81 -81 -80 -98 -98 -97 -94 -93 -91 -91 -97 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -82 -83 -83 -84 -83 -83 -83 -84 -82 -84 -84 -84 -98 -81 -76 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -53 -92 -41 -99 -80 -80 -81 -80 -81 -80 -81 -80 -80 -81 -80 -80 -98 -94 -98 -81 -80 -80 -80 -81 -80 -80 -80 -80 -80 -81 -81 -44 -80 -80 -81 -79 -81 -81 -81 -80 -79 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -83 -82 -83 -81 -82 -83 -83 -83 -83 -83 -83 -83 -83 -41 -98 -99 -54 -81 -83 -83 -81 -83 -82 -82 -81 -83 -81 -83 -83 -83 -83 -76 -83 -83 -83 -83 -83 -81 -83 -81 -81 -62 -92 -52 -92 -85 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -84 -77 -98 -84 -84 -83 -84 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -58 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -41 -44 -80 -81 -81 -80 -81 -80 -80 -79 -79 -80 -80 -80 -97 -97 -98 -83 -76 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -84 -78 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -41 -98 -99 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -53 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -45 -41 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -98 -98 -92 -92 -92 -98 -93 -96 -98 -98 -92 -98 -98 -98 -98 -98 -98 -98 -89 -91 -98 -98 -98 -98 -98 -98 -98 -99 -77 -93 -93 -92 -90 -93 -92 -93 -92 -92 -95 -94 -98 -98 -98 -90 -96 -82 -83 -83 -83 -83 -83 -83 -83 -83 -79 -83 -83 -82 -83 -83 -82 -82 -83 -82 -82 -83 -82 -98 -99 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -98 -82 -82 -82 -82 -82 -82 -82 -83 -83 -83 -81 -82 -41 -86 -81 -81 -82 -81 -81 -81 -82 -81 -81 -81 -77 -83 -93 -90 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -76 -80 -80 -80 -80 -80 -80 -80 -76 -80 -81 -80 -80 -41 -79 -97 -96 -99 -96 -88 -80 -91 -95 -96 -98 -99 -93 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -95 -97 -81 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -78 -80 -81 -80 -80 -81 -81 -80 -80 -56 -84 -93 -92 -93 -92 -92 -92 -93 -93 -93 -93 -94 -93 -88 -93 -92 -95 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -97 -82 -83 -83 -83 -82 -82 -83 -83 -83 -82 -83 -82 -98 -97 -63 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -74 -98 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -94 -95 -83 -83 -83 -83 -83 -84 -84 -83 -83 -83 -84 -83 -81 -80 -80 -80 -79 -79 -79 -79 -79 -81 -79 -79 -79 -82 -80 -77 -80 -80 -80 -79 -80 -80 -80 -81 -80 -72 -84 -83 -84 -81 -83 -83 -83 -84 -83 -83 -83 -83 -97 -87 -92 -85 -84 -87 -82 -90 -83 -83 -82 -83 -83 -83 -83 -82 -83 -82 -83 -83 -90 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -81 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -98 -98 -84 -83 -83 -82 -83 -83 -83 -84 -83 -83 -84 -83 -98 -97 -98 -91 -91 -92 -90 -92 -92 -92 -92 -93 -94 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -81 -80 -80 -81 -80 -81 -80 -80 -80 -80 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -89 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -78 -83 -83 -82 -82 -83 -82 -82 -82 -82 -83 -82 -82 -41 -82 -83 -83 -82 -82 -82 -83 -78 -83 -83 -83 -83 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -61 -93 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -85 -81 -80 -96 -84 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -81 -81 -84 -84 -83 -83 -83 -83 -82 -82 -51 -84 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -93 -90 -82 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -81 -93 -93 -94 -98 -80 -97 -81 -80 -80 -80 -81 -81 -80 -80 -80 -80 -80 -81 -98 -96 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -82 -82 -83 -83 -83 -82 -83 -83 -41 -79 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -81 -99 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -89 -80 -80 -80 -81 -80 -80 -80 -76 -80 -80 -80 -80 -91 -91 -93 -83 -83 -82 -82 -82 -83 -83 -83 -83 -83 -83 -83 -98 -80 -81 -80 -80 -81 -80 -80 -80 -81 -81 -81 -81 -81 -84 -95 -94 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -86 -83 -84 -83 -84 -83 -83 -83 -83 -78 -83 -83 -83 -63 -98 -85 -99 -89 -94 -88 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -72 -81 -80 -80 -81 -81 -81 -81 -80 -81 -81 -81 -81 -92 -99 -83 -83 -83 -77 -83 -82 -83 -83 -83 -83 -83 -83 -92 -82 -83 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -95 -83 -98 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -96 -80 -80 -80 -78 -80 -80 -80 -80 -80 -80 -80 -80 -65 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -99 -80 -80 -81 -81 -80 -80 -80 -81 -81 -81 -81 -80 -81 -80 -80 -81 -80 -80 -81 -81 -80 -80 -81 -81 -41 -89 -80 -80 -80 -80 -80 -80 -81 -80 -76 -81 -81 -81 -93 -98 -84 -84 -84 -84 -84 -84 -83 -83 -83 -83 -84 -83 -88 -82 -82 -82 -82 -82 -82 -82 -83 -83 -82 -82 -82 -98 -80 -98 -80 -80 -98 -80 -81 -81 -80 -81 -80 -80 -80 -80 -80 -80 -81 -41 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -96 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -84 -84 -83 -83 -84 -84 -84 -84 -83 -84 -84 -82 -48 -83 -83 -83 -83 -83 -83 -83 -83 -76 -83 -83 -82 -45 -92 -93 -95 -90 -93 -93 -93 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -53 -98 -98 -98 -83 -83 -83 -83 -82 -83 -83 -83 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -82 -83 -41 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -71 -82 -82 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -84 -85 -86 -82 -85 -98 -90 -86 -84 -84 -98 -98 -80 -81 -80 -80 -75 -98 -81 -75 -85 -99 -98 -95 -98 -81 -81 -80 -81 -80 -81 -81 -80 -80 -80 -81 -80 -95 -94 -92 -80 -81 -80 -80 -80 -81 -81 -80 -80 -80 -81 -80 -84 -84 -84 -84 -83 -82 -83 -83 -83 -83 -84 -83 -84 -83 -82 -82 -83 -83 -83 -83 -83 -82 -82 -83 -62 -87 -83 -84 -84 -84 -76 -83 -84 -83 -83 -83 -83 -89 -93 -93 -93 -98 -93 -94 -98 -80 -80 -80 -80 -81 -80 -81 -80 -81 -81 -81 -81 -78 -87 -98 -81 -80 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -52 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -98 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -82 -82 -83 -83 -41 -83 -83 -83 -77 -82 -83 -83 -83 -83 -83 -83 -83 -78 -93 -95 -95 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -95 -84 -95 -95 -83 -83 -83 -84 -83 -83 -84 -84 -84 -82 -84 -83 -83 -98 -83 -84 -84 -83 -84 -83 -83 -83 -83 -84 -83 -84 -98 -87 -41 -98 -98 -91 -97 -98 -83 -84 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -95 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -83 -89 -81 -81 -81 -81 -81 -81 -81 -81 -81 -78 -80 -81 -93 -95 -98 -98 -84 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -92 -83 -83 -83 -84 -83 -83 -82 -83 -82 -83 -83 -83 -69 -85 -92 -83 -83 -84 -83 -83 -83 -83 -84 -83 -83 -84 -85 -83 -83 -84 -83 -84 -83 -84 -84 -84 -84 -83 -83 -65 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -68 -98 -95 -97 -97 -84 -84 -83 -84 -84 -84 -84 -84 -84 -83 -84 -82 -84 -81 -84 -84 -84 -84 -84 -84 -84 -75 -83 -83 -86 -80 -81 -81 -81 -80 -80 -80 -81 -81 -81 -80 -81 -66 -99 -98 -98 -99 -93 -98 -83 -93 -81 -81 -81 -81 -81 -81 -76 -81 -81 -81 -81 -81 -48 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -99 -98 -97 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -80 -81 -81 -81 -98 -84 -83 -83 -83 -83 -81 -81 -83 -83 -82 -82 -84 -41 -99 -98 -98 -98 -98 -98 -78 -94 -91 -91 -90 -90 -90 -90 -95 -83 -84 -83 -84 -84 -84 -84 -84 -84 -83 -83 -83 -53 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -98 -41 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -86 -84 -84 -84 -84 -84 -83 -83 -84 -83 -83 -83 -84 -97 -98 -79 -80 -80 -80 -80 -80 -79 -80 -80 -80 -76 -81 -94 -93 -93 -98 -83 -83 -82 -82 -83 -81 -82 -83 -81 -83 -83 -83 -41 -40 -92 -92 -85 -98 -86 -85 -85 -83 -84 -84 -84 -84 -84 -84 -83 -84 -83 -83 -67 -84 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -99 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -98 -98 -85 -80 -81 -77 -80 -81 -80 -81 -80 -81 -81 -80 -89 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -82 -84 -99 -83 -83 -83 -83 -83 -83 -83 -78 -83 -83 -83 -83 -41 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -99 -80 -80 -81 -80 -81 -81 -81 -81 -81 -81 -80 -80 -82 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -41 -81 -80 -80 -81 -81 -81 -80 -81 -80 -80 -80 -80 -50 -83 -82 -83 -83 -83 -84 -83 -83 -83 -83 -84 -84 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -84 -84 -81 -81 -83 -84 -83 -83 -83 -83 -83 -86 -76 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -90 -99 -98 -98 -95 -94 -98 -95 -94 -83 -98 -91 -91 -91 -91 -98 -98 -90 -84 -86 -85 -84 -84 -84 -84 -84 -83 -84 -83 -84 -84 -98 -84 -84 -84 -84 -83 -83 -84 -84 -84 -84 -84 -84 -99 -97 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -80 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -56 -61 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -80 -81 -81 -81 -81 -41 -91 -92 -91 -93 -91 -43 -93 -91 -92 -91 -90 -95 -93 -93 -96 -93 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -82 -95 -81 -81 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -90 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -85 -98 -98 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -84 -98 -91 -80 -81 -80 -80 -81 -81 -81 -81 -79 -80 -80 -80 -80 -87 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -77 -80 -85 -85 -81 -81 -81 -81 -81 -81 -81 -81 -84 -84 -84 -84 -98 -98 -87 -81 -80 -96 -81 -81 -98 -81 -81 -81 -81 -80 -80 -81 -81 -81 -81 -81 -80 -81 -96 -98 -82 -80 -81 -81 -80 -80 -80 -81 -80 -80 -80 -81 -81 -98 -81 -80 -81 -81 -80 -81 -80 -80 -80 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -94 -84 -98 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -84 -84 -98 -80 -98 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -80 -81 -94 -81 -81 -81 -80 -80 -81 -81 -81 -81 -81 -81 -81 -95 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -98 -98 -83 -83 -83 -83 -83 -83 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -83 -83 -83 -83 -82 -83 -82 -84 -41 -83 -82 -83 -83 -82 -82 -77 -82 -84 -83 -84 -83 -41 -93 -99 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -87 -82 -98 -87 -98 -98 -81 -81 -81 -80 -81 -81 -80 -80 -80 -81 -81 -81 -81 -41 -58 -80 -80 -81 -79 -80 -80 -80 -81 -81 -81 -80 -81 -82 -80 -81 -81 -80 -81 -81 -81 -81 -81 -81 -80 -90 -95 -95 -99 -83 -83 -83 -84 -84 -84 -84 -84 -84 -83 -84 -84 -88 -84 -84 -84 -83 -83 -81 -83 -83 -83 -83 -84 -65 -98 -84 -84 -83 -84 -83 -83 -83 -83 -83 -83 -84 -83 -83 -93 -93 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -41 -80 -81 -80 -81 -80 -80 -80 -80 -81 -80 -80 -80 -41 -98 -81 -81 -80 -80 -81 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -80 -80 -98 -41 -92 -84 -84 -84 -84 -84 -84 -84 -83 -83 -83 -83 -83 -90 -82 -82 -82 -83 -82 -82 -82 -80 -83 -83 -83 -83 -91 -91 -94 -94 -99 -98 -98 -98 -98 -99 -98 -98 -97 -98 -92 -98 -99 -98 -97 -99 -91 -91 -98 -98 -98 -98 -98 -99 -95 -98 -98 -90 -98 -98 -98 -98 -97 -98 -98 -97 -81 -97 -97 -80 -80 -81 -80 -81 -80 -81 -80 -80 -80 -81 -81 -41 -90 -80 -81 -80 -80 -80 -80 -81 -80 -80 -81 -81 -81 -84 -84 -84 -83 -84 -84 -84 -84 -83 -84 -83 -84 -41 -83 -82 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -91 -91 -93 -93 -93 -93 -93 -93 -93 -93 -92 -92 -93 -98 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -41 -98 -81 -81 -80 -80 -81 -80 -81 -81 -80 -81 -81 -81 -97 -80 -80 -80 -80 -81 -81 -81 -80 -81 -81 -81 -81 -81 -80 -80 -80 -81 -81 -81 -81 -81 -81 -81 -80 -41 -95 -41 -81 -80 -80 -80 -80 -81 -81 -80 -80 -81 -81 -81 -41 -99 -98 -93 -81 -80 -79 -79 -79 -79 -79 -79 -79 -80 -79 -79 -80 -80 -77 -80 -76 -80 -80 -79 -81 -80 -81 -80 -91 -92 -84 -92 -89 -98 -98 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -83 -83 -83 -84 -83 -84 -97 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -81 -41 -84 -84 -83 -84 -84 -84 -84 -83 -83 -82 -83 -81 -85 -98 -98 -98 -99 -92 -98 -98 -98 -79 -83 -83 -84 -83 -83 -84 -84 -84 -84 -84 -84 -84 -76 -93 -92 -93 -93 -92 -93 -92 -93 -93 -93 -93 -93 -93 -93 -91 -95 -84 -84 -83 -83 -84 -83 -83 -84 -83 -83 -83 -83 -83 -90 -92 -83 -83 -81 -83 -83 -83 -83 -83 -83 -83 -84 -84 -98 -98 -84 -83 -84 -83 -83 -83 -84 -84 -84 -84 -84 -84 -41 -84 -83 -83 -84 -82 -84 -83 -83 -83 -83 -84 -84 -41 -84 -84 -84 -81 -82 -82 -81 -81 -82 -81 -82 -82 -89 -88 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -93 -93 -98 -94 -99 -98 -98 -83 -83 -83 -83 -84 -83 -84 -84 -84 -84 -84 -84 -98 -80 -81 -80 -81 -41 -80 -80 -81 -80 -80 -81 -81 -81 -81 -81 -80 -81 -93 -98 -98 -87 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -83 -96 -80 -81 -80 -80 -80 -80 -81 -81 -80 -81 -81 -81 -92 -83 -84 -84 -84 -82 -84 -84 -83 -80 -81 -84 -84 -84 -83 -82 -83 -83 -83 -76 -83 -83 -82 -83 -83 -83 -93 -89 -90 -41 -92 -41 -93 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -98 -98 -81 -81 -81 -81 -80 -81 -81 -80 -81 -81 -81 -80 -86 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -63 -99 -86 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -84 -83 -84 -84 -84 -84 -81 -83 -83 -83 -82 -83 -92 -80 -80 -81 -80 -81 -80 -80 -81 -80 -80 -80 -80 -41 -94 -86 -96 -85 -84 -84 -78 -93 -95 -41 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -80 -81 -80 -80 -80 -80 -81 -81 -81 -81 -81 -81 -81 -92 -81 -85 -98 -82 -81 -91 -41 -59 -85 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -80 -81 -90 -95 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -83 -83 -83 -81 -83 -83 -83 -81 -83 -83 -83 -83 -92 -96 -97 -98 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -81 -93 -98 -78 -86 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -93 -98 -81 -80 -81 -80 -81 -81 -80 -81 -81 -81 -80 -81 -81 -98 -84 -92 -96 -92 -97 -88 -83 -83 -83 -80 -82 -83 -81 -82 -83 -81 -81 -82 -71 -90 -84 -83 -83 -83 -82 -83 -83 -84 -83 -83 -84 -84 -98 -93 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -81 -80 -83 -83 -83 -82 -83 -81 -83 -83 -83 -83 -93 -89 -91 -97 -92 -98 -97 -84 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -65 -83 -84 -83 -95 -95 -83 -98 -83 -82 -84 -84 -83 -83 -81 -83 -84 -83 -83 -83 -41 -84 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -41 -93 -93 -93 -83 -83 -82 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -81 -83 -83 -41 -99 -96 -96 -96 -93 -88 -91 -96 -93 -92 -94 -95 -92 -83 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -83 -87 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -64 -83 -83 -84 -83 -83 -83 -83 -83 -82 -82 -83 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -41 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -81 -88 -85 -80 -80 -80 -79 -80 -80 -80 -80 -81 -81 -76 -80 -98 -82 -80 -82 -83 -83 -83 -83 -82 -83 -81 -80 -83 -41 -98 -96 -98 -98 -99 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -84 -83 -83 -94 -86 -91 -90 -98 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -41 -98 -98 -83 -84 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -98 -81 -80 -76 -81 -81 -81 -81 -80 -81 -81 -81 -81 -45 -41 -92 -80 -81 -81 -80 -81 -81 -81 -81 -80 -80 -81 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -89 -80 -81 -81 -81 -81 -80 -81 -80 -81 -80 -81 -81 -98 -84 -84 -84 -84 -84 -84 -84 -81 -84 -81 -83 -84 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -87 -81 -81 -83 -83 -83 -80 -83 -83 -83 -83 -82 -82 -83 -88 -88 -88 -88 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -81 -96 -84 -84 -86 -98 -99 -98 -98 -97 -98 -98 -95 -98 -98 -84 -98 -88 -93 -91 -95 -98 -40 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -96 -94 -94 -92 -83 -83 -83 -83 -83 -82 -82 -83 -82 -83 -83 -83 -80 -80 -81 -80 -80 -80 -80 -80 -81 -80 -81 -80 -41 -57 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -93 -92 -84 -84 -82 -83 -82 -83 -83 -83 -83 -83 -83 -77 -82 -48 -91 -90 -91 -89 -91 -88 -91 -91 -91 -93 -93 -82 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -61 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -62 -96 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -99 -83 -83 -83 -83 -82 -83 -83 -81 -82 -82 -81 -82 -87 -87 -80 -80 -80 -80 -76 -79 -79 -79 -79 -79 -80 -79 -85 -87 -88 -84 -85 -84 -85 -85 -85 -85 -87 -84 -90 -79 -84 -84 -85 -83 -80 -84 -85 -85 -79 -89 -92 -84 -84 -89 -84 -84 -83 -84 -82 -83 -85 -85 -85 -79 -82 -87 -90 -95 -81 -98 -89 -91 -89 -92 -85 -86 -91 -96 -93 -83 -97 -97 -91 -99 -98 -87 -96 -99 -81 -90 -99 -92 -98 -98 -81 -81 -98 -73 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -78 -83 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -82 -93 -90 -90 -92 -88 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -98 -83 -83 -83 -82 -82 -83 -83 -82 -82 -83 -83 -83 -48 -98 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -41 -90 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -77 -41 -80 -82 -83 -83 -83 -83 -83 -83 -83 -82 -82 -82 -82 -88 -82 -82 -82 -82 -82 -82 -82 -82 -82 -77 -82 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -89 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -75 -41 -83 -41 -83 -98 -83 -82 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -81 -81 -80 -80 -81 -81 -81 -81 -81 -80 -80 -81 -84 -41 -81 -81 -81 -81 -81 -81 -81 -81 -77 -81 -81 -81 -41 -93 -74 -98 -98 -93 -98 -98 -99 -99 -93 -98 -98 -98 -96 -98 -98 -93 -98 -81 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -81 -81 -80 -81 -81 -81 -81 -81 -81 -80 -80 -81 -93 -98 -81 -80 -80 -81 -81 -81 -81 -81 -80 -80 -81 -80 -98 -84 -85 -80 -82 -83 -84 -84 -83 -83 -83 -83 -84 -83 -84 -98 -41 -80 -80 -80 -81 -81 -81 -81 -81 -81 -81 -80 -80 -80 -80 -80 -80 -81 -81 -81 -80 -80 -81 -81 -81 -98 -93 -84 -83 -84 -84 -84 -84 -83 -84 -84 -84 -84 -82 -41 -80 -83 -83 -81 -81 -83 -83 -83 -83 -83 -83 -83 -58 -98 -98 -93 -79 -84 -98 -93 -98 -81 -79 -79 -81 -80 -80 -80 -80 -81 -81 -81 -81 -92 -94 -81 -81 -81 -80 -81 -80 -80 -80 -79 -81 -84 -83 -84 -84 -84 -84 -98 -46 -81 -80 -80 -76 -81 -81 -81 -81 -81 -81 -81 -81 -93 -93 -86 -84 -83 -84 -83 -84 -83 -83 -83 -80 -83 -81 -80 -85 -82 -82 -81 -80 -82 -84 -81 -83 -83 -83 -83 -83 -83 -88 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -98 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -69 -93 -98 -81 -81 -81 -80 -81 -81 -80 -81 -80 -80 -81 -80 -99 -98 -83 -83 -82 -83 -83 -83 -82 -83 -82 -82 -82 -82 -80 -93 -83 -83 -78 -82 -83 -83 -83 -83 -83 -83 -83 -83 -41 -97 -98 -98 -87 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -79 -81 -85 -82 -89 -84 -99 -90 -98 -81 -83 -83 -81 -82 -84 -81 -81 -81 -84 -83 -80 -93 -99 -83 -83 -84 -82 -84 -83 -84 -84 -84 -84 -84 -84 -84 -80 -81 -81 -81 -81 -80 -81 -81 -80 -80 -81 -81 -81 -98 -79 -79 -79 -81 -81 -81 -81 -81 -80 -81 -81 -81 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -94 -87 -93 -93 -94 -81 -80 -81 -80 -80 -81 -81 -81 -81 -81 -81 -83 -41 -93 -98 -81 -80 -79 -81 -80 -79 -80 -81 -81 -81 -81 -81 -91 -81 -98 -80 -79 -79 -80 -80 -80 -81 -81 -81 -81 -81 -81 -41 -84 -82 -84 -84 -84 -84 -84 -84 -82 -83 -84 -83 -88 -93 -91 -82 -80 -82 -83 -83 -83 -80 -83 -81 -83 -83 -83 -68 -99 -98 -80 -80 -80 -80 -80 -81 -81 -80 -80 -79 -80 -81 -89 -82 -97 -89 -89 -88 -88 -88 -94 -92 -78 -90 -41 -91 -93 -93 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -96 -84 -98 -93 -98 -83 -98 -98 -98 -95 -84 -84 -84 -84 -84 -84 -84 -82 -84 -83 -84 -84 -41 -98 -80 -80 -80 -80 -81 -81 -81 -80 -81 -81 -81 -81 -96 -81 -80 -81 -81 -81 -81 -80 -80 -81 -81 -81 -81 -97 -88 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -61 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -57 -88 -77 -83 -83 -83 -84 -84 -84 -83 -83 -84 -84 -84 -93 -99 -98 -98 -98 -98 -98 -98 -98 -96 -99 -98 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -81 -81 -81 -81 -81 -80 -81 -80 -43 -98 -81 -80 -80 -80 -81 -81 -80 -80 -81 -81 -80 -80 -83 -83 -84 -84 -83 -83 -83 -84 -83 -83 -81 -84 -84 -92 -79 -85 -85 -86 -84 -99 -41 -84 -84 -84 -78 -83 -84 -84 -84 -84 -84 -80 -81 -81 -81 -81 -81 -81 -80 -98 -98 -98 -98 -80 -80 -80 -81 -80 -81 -80 -80 -81 -81 -81 -79 -80 -84 -90 -41 -84 -84 -84 -84 -84 -83 -83 -84 -84 -84 -83 -83 -98 -98 -99 -41 -84 -84 -84 -83 -84 -83 -84 -84 -83 -83 -83 -84 -81 -89 -98 -98 -41 -84 -84 -84 -84 -83 -84 -83 -83 -83 -82 -83 -83 -90 -80 -98 -86 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -92 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -90 -41 -84 -84 -83 -83 -83 -84 -84 -84 -84 -84 -84 -84 -99 -95 -45 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -64 -98 -98 -68 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -83 -81 -84 -99 -84 -84 -81 -80 -81 -82 -81 -82 -84 -84 -84 -84 -79 -88 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -81 -89 -99 -99 -99 -98 -69 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -73 -84 -89 -95 -84 -84 -84 -84 -84 -84 -82 -83 -84 -83 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -42 -41 -86 -84 -83 -84 -82 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -41 -41 -84 -84 -83 -83 -84 -84 -84 -78 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -98 -98 -84 -84 -83 -84 -84 -84 -84 -84 -83 -84 -83 -84 -90 -41 -99 -94 -98 -98 -98 -89 -99 -93 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -99 -98 -99 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -91 -98 -98 -98 -98 -98 -98 -84 -84 -84 -81 -82 -82 -82 -82 -83 -81 -81 -81 -84 -88 -77 -93 -91 -91 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -97 -91 -98 -98 -92 -90 -93 -91 -94 -86 -99 -94 -94 -94 -91 -92 -98 -95 -97 -94 -94 -88 -91 -98 -97 -98 -95 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -96 -96 -97 -98 -98 -98 -99 -98 -99 -99 -98 -98 -94 -93 -92 -92 -97 -99 -98 -98 -92 -99 -99 -91 -98 -98 -98 -98 -98 -99 -98 -93 -96 -98 -91 -88 -99 -98 -98 -99 -98 -98 -84 -94 -91 -92 -98 -94 -93 -98 -99 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -96 -98 -85 -98 -98 -98 -98 -98 -97 -98 -91 -98 -98 -97 -97 -98 -97 -97 -93 -95 -99 -92 -94 -98 -97 -91 -98 -98 -98 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -66 -98 -99 -98 -98 -89 -88 -89 -89 -97 -89 -91 -98 -99 -77 -94 -92 -91 -93 -89 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -84 -98 -98 -95 -98 -98 -98 -94 -91 -91 -91 -95 -94 -94 -94 -91 -90 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -94 -99 -98 -97 -97 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -99 -98 -92 -98 -87 -98 -98 -65 -99 -98 -98 -98 -98 -87 -89 -88 -91 -89 -94 -97 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -84 -99 -89 -99 -99 -99 -83 -97 -97 -97 -98 -92 -92 -91 -98 -98 -98 -98 -84 -93 -85 -98 -97 -89 -90 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -95 -99 -97 -93 -93 -93 -99 -98 -98 -98 -98 -98 -98 -99 -90 -92 -93 -96 -97 -98 -98 -98 -98 -93 -90 -93 -98 -91 -97 -98 -97 -93 -98 -89 -93 -86 -89 -89 -89 -89 -89 -89 -88 -89 -89 -89 -88 -86 -88 -88 -89 -88 -88 -93 -93 -93 -93 -93 -93 -96 -93 -93 -93 -98 -99 -98 -93 -84 -98 -99 -89 -98 -98 -98 -98 -98 -98 -97 -98 -84 -95 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -97 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -98 -91 -98 -98 -98 -91 -98 -98 -98 -97 -98 -92 -92 -96 -87 -94 -92 -92 -98 -97 -98 -98 -98 -95 -97 -93 -91 -93 -94 -92 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -94 -84 -98 -98 -98 -97 -98 -98 -93 -98 -98 -98 -98 -95 -99 -98 -98 -92 -98 -98 -98 -98 -88 -98 -98 -98 -91 -99 -98 -99 -98 -98 -95 -99 -99 -98 -99 -98 -99 -99 -98 -98 -88 -98 -98 -98 -98 -98 -94 -91 -98 -98 -98 -98 -99 -98 -98 -98 -98 -91 -99 -98 -99 -98 -88 -95 -88 -84 -85 -98 -99 -98 -98 -99 -98 -98 -98 -80 -93 -91 -91 -98 -98 -98 -98 -98 -98 -98 -98 -91 -91 -99 -99 -98 -98 -98 -98 -98 -98 -92 -86 -83 -98 -98 -98 -98 -98 -98 -99 -94 -91 -98 -94 -98 -96 -98 -91 -99 -98 -98 -98 -97 -98 -98 -99 -98 -98 -94 -98 -98 -98 -94 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -99 -98 -98 -98 -88 -98 -98 -98 -98 -98 -91 -92 -94 -91 -98 -98 -98 -98 -98 -88 -98 -98 -99 -98 -98 -92 -97 -84 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -94 -90 -98 -98 -98 -98 -99 -98 -98 -98 -94 -97 -91 -98 -98 -98 -94 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -84 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -92 -98 -99 -98 -98 -97 -94 -85 -85 -99 -98 -98 -98 -99 -99 -99 -78 -93 -91 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -86 -88 -98 -98 -99 -98 -99 -98 -98 -99 -98 -98 -93 -98 -98 -97 -90 -98 -98 -98 -98 -98 -98 -92 -92 -99 -98 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -99 -98 -97 -94 -98 -92 -94 -99 -98 -98 -92 -98 -98 -94 -93 -98 -92 -99 -99 -98 -93 -98 -98 -98 -98 -98 -98 -94 -84 -98 -98 -98 -98 -98 -88 -94 -98 -98 -77 -93 -91 -89 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -84 -97 -99 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -95 -98 -99 -98 -90 -98 -98 -98 -74 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -99 -99 -98 -95 -92 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -99 -99 -98 -98 -94 -94 -98 -92 -92 -98 -91 -99 -98 -98 -98 -98 -99 -98 -99 -84 -84 -85 -85 -98 -91 -96 -98 -98 -94 -94 -90 -89 -89 -98 -94 -89 -98 -95 -98 -94 -95 -97 -99 -98 -96 -91 -91 -97 -98 -98 -93 -89 -84 -87 -84 -98 -99 -94 -98 -98 -96 -98 -95 -93 -99 -98 -97 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -99 -98 -99 -96 -95 -95 -99 -95 -99 -93 -98 -92 -98 -98 -99 -98 -99 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -92 -94 -98 -98 -99 -98 -98 -98 -88 -89 -93 -98 -98 -98 -99 -98 -98 -98 -98 -96 -95 -93 -98 -98 -98 -98 -99 -77 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -97 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -92 -98 -98 -98 -91 -98 -98 -99 -98 -98 -89 -98 -98 -99 -98 -98 -98 -97 -93 -94 -98 -98 -97 -97 -97 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -99 -77 -93 -91 -77 -89 -98 -97 -98 -98 -91 -98 -98 -98 -98 -98 -98 -98 -84 -85 -84 -84 -84 -85 -98 -98 -99 -98 -77 -94 -91 -93 -99 -99 -98 -98 -98 -98 -98 -98 -96 -97 -96 -98 -98 -99 -98 -98 -98 -99 -93 -84 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -92 -98 -98 -98 -93 -93 -99 -92 -94 -95 -93 -98 -90 -93 -84 -96 -89 -83 -95 -96 -91 -93 -93 -96 -98 -92 -98 -92 -93 -89 -93 -90 -92 -92 -92 -93 -93 -93 -97 -77 -95 -91 -84 -96 -85 -95 -84 -88 -98 -98 -98 -99 -98 -98 -98 -97 -99 -98 -93 -93 -95 -96 -83 -81 -93 -89 -90 -98 -98 -98 -98 -99 -98 -91 -99 -99 -98 -96 -98 -98 -98 -97 -97 -97 -98 -97 -98 -98 -98 -98 -99 -99 -91 -93 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -92 -92 -93 -92 -92 -98 -98 -98 -91 -97 -92 -86 -86 -85 -86 -86 -86 -86 -99 -85 -86 -98 -78 -93 -92 -91 -93 -98 -98 -98 -91 -99 -98 -98 -84 -90 -98 -82 -83 -96 -99 -99 -98 -98 -88 -98 -96 -94 -93 -91 -91 -95 -98 -99 -98 -98 -92 -92 -98 -97 -98 -91 -98 -98 -98 -98 -83 -90 -99 -92 -84 -99 -98 -89 -95 -82 -83 -83 -83 -83 -84 -98 -81 -80 -80 -80 -81 -81 -99 -98 -93 -98 -84 -84 -84 -84 -84 -84 -98 -98 -84 -98 -94 -92 -99 -93 -90 -92 -93 -97 -97 -88 -90 -98 -98 -98 -97 -98 -99 -98 -88 -78 -93 -92 -91 -93 -98 -96 -95 -98 -98 -98 -98 -98 -98 -98 -88 -98 -98 -98 -98 -98 -98 -95 -84 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -99 -95 -98 -97 -99 -90 -98 -98 -99 -98 -98 -98 -92 -98 -99 -99 -99 -90 -98 -95 -94 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -94 -98 -99 -87 -85 -94 -98 -92 -98 -98 -92 -98 -85 -96 -90 -88 -96 -86 -98 -98 -84 -85 -85 -85 -85 -86 -86 -86 -85 -85 -84 -91 -84 -87 -94 -95 -94 -98 -92 -92 -91 -98 -98 -98 -99 -92 -96 -95 -91 -98 -90 -98 -82 -91 -94 -95 -82 -95 -94 -88 -98 -91 -99 -92 -98 -98 -98 -98 -98 -94 -95 -97 -91 -92 -98 -98 -93 -98 -99 -98 -98 -98 -95 -98 -98 -96 -99 -98 -98 -98 -98 -54 -98 -92 -98 -98 -98 -89 -98 -97 -98 -99 -85 -94 -98 -98 -99 -88 -98 -92 -92 -85 -98 -90 -98 -98 -98 -98 -97 -94 -99 -91 -98 -98 -92 -98 -98 -81 -84 -84 -91 -91 -94 -99 -92 -92 -90 -98 -98 -84 -87 -98 -87 -93 -89 -94 -98 -99 -84 -82 -98 -85 -96 -92 -92 -98 -98 -97 -98 -91 -98 -98 -98 -92 -98 -86 -92 -93 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -93 -99 -98 -99 -98 -98 -98 -95 -98 -98 -92 -91 -93 -98 -99 -94 -87 -96 -85 -92 -99 -98 -94 -98 -85 -84 -91 -87 -88 -87 -88 -87 -86 -88 -88 -89 -90 -91 -84 -84 -84 -84 -84 -84 -85 -88 -86 -94 -98 -83 -91 -94 -94 -83 -83 -93 -83 -98 -98 -83 -93 -99 -83 -98 -93 -82 -82 -99 -98 -83 -83 -83 -82 -82 -82 -82 -92 -92 -86 -93 -89 -81 -80 -81 -81 -81 -81 -98 -98 -83 -84 -83 -83 -83 -82 -86 -98 -97 -84 -83 -84 -83 -84 -83 -85 -90 -89 -90 -98 -98 -87 -85 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -91 -85 -90 -85 -90 -84 -82 -83 -83 -84 -84 -82 -83 -84 -83 -84 -84 -82 -90 -80 -41 -80 -81 -81 -81 -81 -81 -82 -82 -82 -81 -81 -81 -81 -81 -81 -81 -82 -82 -91 -83 -85 -81 -82 -83 -85 -84 -86 -96 -87 -95 -95 -86 -98 -91 -91 -92 -87 -95 -93 -86 -98 -98 -91 -87 -86 -86 -84 -84 -83 -83 -84 -82 -84 -82 -83 -82 -55 -92 -85 -97 -98 -98 -91 -89 -89 -89 -88 -88 -90 -93 -98 -86 -88 -86 -86 -86 -78 -91 -90 -93 -94 -94 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -99 -97 -98 -92 -89 -83 -99 -97 -98 -96 -98 -98 -98 -98 -98 -98 -92 -86 -98 -97 -91 -94 -86 -98 -87 -98 -90 -95 -93 -86 -93 -88 -86 -98 -89 -90 -98 -91 -90 -96 -90 -98 -98 -98 -85 -91 -84 -87 -97 -89 -89 -93 -90 -98 -98 -98 -91 -85 -86 -98 -98 -95 -96 -98 -92 -92 -98 -88 -89 -98 -89 -98 -98 -98 -99 -98 -89 -95 -95 -94 -78 -93 -89 -93 -92 -99 -92 -92 -98 -94 -94 -98 -98 -98 -98 -91 -99 -95 -98 -98 -98 -98 -81 -99 -98 -93 -98 -98 -91 -98 -91 -98 -98 -98 -98 -84 -92 -93 -98 -90 -99 -99 -98 -98 -94 -98 -97 -99 -95 -98 -96 -92 -99 -94 -95 -98 -85 -84 -84 -85 -85 -83 -91 -91 -81 -82 -81 -82 -81 -82 -99 -93 -98 -98 -98 -98 -82 -81 -81 -81 -81 -81 -98 -86 -83 -84 -84 -84 -84 -82 -84 -84 -84 -81 -81 -81 -86 -80 -80 -76 -80 -80 -80 -98 -96 -83 -83 -83 -83 -83 -83 -98 -83 -83 -84 -83 -84 -82 -90 -91 -81 -82 -82 -81 -82 -81 -90 -84 -97 -91 -98 -69 -84 -84 -80 -82 -82 -65 -90 -84 -99 -86 -84 -86 -97 -85 -86 -92 -85 -96 -91 -85 -94 -90 -86 -98 -84 -90 -99 -98 -90 -98 -86 -84 -86 -97 -87 -94 -98 -90 -87 -99 -98 -90 -95 -98 -94 -98 -92 -92 -92 -83 -84 -86 -98 -98 -89 -98 -93 -84 -99 -99 -98 -86 -98 -98 -84 -91 -77 -85 -92 -98 -98 -98 -87 -98 -85 -98 -87 -91 -87 -86 -85 -86 -98 -98 -90 -99 -90 -92 -97 -99 -98 -87 -95 -97 -93 -98 -94 -92 -92 -94 -87 -98 -98 -99 -98 -98 -98 -98 -88 -94 -94 -98 -94 -95 -98 -98 -92 -98 -98 -98 -98 -91 -98 -98 -90 -89 -91 -84 -85 -85 -88 -84 -84 -84 -85 -86 -83 -81 -81 -81 -81 -80 -82 -77 -91 -98 -93 -98 -84 -82 -82 -83 -83 -82 -86 -84 -98 -92 -90 -98 -84 -84 -92 -84 -84 -89 -92 -98 -83 -92 -97 -83 -84 -83 -83 -83 -83 -95 -83 -83 -83 -83 -83 -83 -98 -84 -84 -84 -84 -84 -84 -99 -99 -93 -99 -97 -98 -94 -99 -93 -92 -88 -90 -90 -98 -90 -98 -88 -90 -88 -89 -92 -90 -99 -93 -98 -98 -98 -98 -90 -86 -98 -99 -98 -98 -98 -97 -97 -83 -84 -99 -98 -96 -96 -98 -99 -98 -84 -78 -97 -91 -93 -94 -88 -91 -93 -93 -94 -95 -97 -98 -84 -92 -92 -98 -98 -98 -97 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -98 -98 -83 -81 -81 -81 -80 -80 -80 -80 -81 -79 -80 -80 -65 -80 -81 -80 -80 -79 -80 -80 -80 -81 -80 -81 -80 -98 -88 -84 -84 -85 -83 -83 -85 -85 -83 -84 -84 -84 -74 -52 -90 -97 -98 -98 -98 -99 -94 -92 -99 -98 -98 -98 -92 -96 -98 -92 -97 -88 -89 -88 -89 -88 -95 -90 -88 -86 -92 -85 -85 -92 -99 -99 -99 -83 -82 -83 -83 -82 -82 -82 -83 -83 -83 -83 -83 -85 -84 -93 -83 -83 -85 -84 -79 -84 -91 -81 -81 -81 -81 -80 -80 -80 -81 -81 -80 -81 -83 -67 -92 -80 -80 -81 -81 -80 -80 -80 -80 -81 -81 -81 -80 -98 -81 -81 -81 -81 -82 -81 -82 -82 -81 -82 -82 -79 -84 -86 -84 -86 -84 -86 -85 -86 -87 -86 -86 -87 -98 -98 -81 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -98 -99 -94 -93 -93 -91 -93 -98 -98 -98 -98 -92 -98 -98 -94 -84 -86 -98 -92 -98 -98 -88 -98 -98 -92 -97 -89 -97 -98 -85 -98 -98 -98 -84 -98 -98 -98 -94 -98 -98 -98 -99 -98 -97 -92 -92 -99 -83 -92 -98 -98 -95 -98 -98 -92 -90 -93 -83 -94 -92 -92 -92 -94 -98 -94 -94 -94 -94 -98 -92 -98 -98 -97 -99 -98 -98 -98 -99 -99 -98 -98 -98 -99 -92 -92 -92 -98 -98 -98 -98 -95 -83 -85 -91 -96 -98 -92 -92 -98 -98 -99 -78 -95 -95 -93 -98 -99 -91 -93 -93 -90 -93 -84 -93 -94 -92 -88 -92 -94 -94 -90 -93 -91 -93 -90 -81 -93 -85 -81 -92 -84 -79 -84 -84 -84 -84 -93 -93 -93 -92 -88 -88 -80 -89 -88 -80 -88 -92 -93 -93 -94 -81 -99 -80 -80 -80 -80 -81 -81 -81 -80 -80 -80 -81 -80 -81 -81 -64 -82 -82 -98 -82 -82 -82 -82 -78 -82 -82 -81 -81 -81 -81 -81 -70 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -91 -91 -93 -84 -81 -82 -81 -81 -81 -81 -84 -83 -83 -82 -82 -83 -88 -92 -93 -89 -90 -91 -92 -94 -91 -82 -85 -82 -83 -85 -93 -98 -82 -94 -98 -87 -99 -81 -80 -80 -81 -81 -81 -79 -81 -81 -80 -80 -78 -92 -83 -83 -83 -82 -83 -82 -82 -83 -80 -83 -82 -83 -82 -89 -83 -83 -83 -83 -82 -81 -81 -81 -81 -81 -81 -81 -85 -79 -79 -78 -79 -80 -79 -79 -79 -79 -79 -79 -76 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -99 -65 -89 -89 -85 -84 -98 -98 -98 -94 -98 -98 -88 -91 -94 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -83 -83 -83 -83 -83 -83 -83 -84 -83 -84 -83 -84 -92 -84 -84 -84 -84 -82 -84 -83 -84 -84 -83 -83 -85 -84 -84 -84 -84 -83 -83 -84 -83 -84 -83 -83 -83 -68 -81 -83 -83 -84 -84 -81 -82 -83 -82 -83 -78 -84 -91 -83 -89 -80 -80 -80 -80 -79 -80 -80 -80 -80 -79 -80 -80 -84 -84 -83 -83 -84 -83 -83 -81 -83 -83 -83 -84 -83 -93 -93 -94 -94 -86 -84 -83 -83 -82 -83 -83 -83 -82 -82 -83 -83 -80 -82 -92 -53 -99 -99 -98 -98 -98 -98 -92 -92 -92 -95 -98 -92 -91 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -99 -97 -98 -98 -86 -86 -88 -94 -92 -98 -98 -98 -98 -97 -88 -91 -91 -85 -91 -85 -90 -85 -80 -80 -81 -81 -76 -82 -81 -81 -81 -81 -81 -81 -79 -79 -79 -78 -79 -79 -79 -79 -79 -80 -79 -78 -85 -85 -86 -82 -84 -87 -83 -82 -81 -83 -81 -83 -83 -83 -83 -83 -83 -84 -83 -95 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -82 -69 -84 -84 -98 -85 -98 -84 -85 -82 -82 -83 -83 -83 -83 -83 -83 -83 -84 -87 -84 -84 -84 -81 -81 -81 -81 -80 -81 -83 -83 -83 -98 -79 -79 -79 -78 -79 -79 -79 -78 -79 -79 -79 -78 -98 -84 -98 -91 -84 -85 -85 -85 -85 -85 -89 -93 -89 -89 -89 -88 -81 -89 -77 -98 -98 -98 -85 -82 -79 -83 -86 -86 -84 -98 -98 -82 -81 -82 -80 -80 -80 -81 -81 -82 -81 -81 -80 -81 -96 -97 -82 -82 -82 -82 -82 -82 -81 -82 -81 -82 -80 -82 -60 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -83 -70 -99 -98 -98 -99 -97 -98 -99 -98 -98 -98 -98 -98 -98 -99 -87 -91 -87 -78 -94 -93 -94 -98 -98 -85 -84 -84 -83 -84 -84 -84 -84 -83 -84 -84 -83 -83 -83 -84 -83 -83 -66 -98 -98 -95 -99 -98 -98 -98 -98 -84 -98 -98 -98 -98 -85 -98 -95 -87 -98 -87 -86 -98 -86 -96 -97 -98 -98 -86 -90 -98 -92 -99 -98 -98 -98 -98 -98 -98 -98 -88 -98 -98 -98 -99 -99 -98 -98 -98 -78 -93 -93 -91 -92 -91 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -99 -98 -98 -94 -90 -93 -98 -98 -98 -98 -80 -80 -81 -81 -81 -81 -81 -82 -82 -82 -81 -81 -41 -83 -81 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -90 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -98 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -80 -58 -82 -83 -83 -82 -83 -82 -83 -83 -81 -82 -83 -83 -86 -80 -80 -81 -81 -80 -77 -80 -81 -81 -80 -74 -80 -91 -99 -84 -83 -84 -83 -83 -84 -83 -83 -83 -83 -83 -83 -63 -94 -82 -82 -98 -82 -85 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -81 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -89 -82 -82 -82 -82 -82 -82 -82 -83 -83 -83 -83 -82 -84 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -84 -89 -92 -41 -84 -84 -83 -83 -83 -83 -83 -83 -83 -81 -84 -81 -85 -81 -81 -81 -81 -83 -81 -82 -83 -83 -83 -83 -83 -88 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -83 -42 -82 -82 -82 -82 -82 -82 -83 -82 -82 -78 -82 -85 -93 -89 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -51 -98 -98 -98 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -82 -83 -94 -91 -98 -98 -98 -98 -99 -98 -97 -98 -87 -88 -88 -89 -98 -88 -89 -88 -89 -88 -88 -78 -90 -91 -98 -99 -98 -98 -98 -98 -92 -90 -90 -98 -93 -99 -84 -91 -98 -99 -94 -87 -81 -98 -98 -98 -98 -82 -84 -97 -82 -98 -92 -98 -92 -92 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -80 -98 -87 -98 -98 -98 -98 -99 -98 -86 -98 -98 -98 -98 -98 -98 -99 -88 -98 -92 -98 -98 -98 -99 -98 -89 -97 -92 -85 -98 -98 -87 -98 -98 -99 -98 -98 -80 -94 -92 -90 -90 -92 -92 -98 -98 -82 -82 -82 -82 -83 -83 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -81 -83 -82 -82 -83 -82 -43 -82 -88 -98 -83 -83 -82 -83 -82 -82 -83 -82 -82 -82 -82 -81 -98 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -81 -89 -88 -89 -90 -98 -85 -86 -86 -93 -89 -89 -84 -86 -98 -88 -93 -94 -86 -92 -97 -92 -84 -93 -98 -98 -99 -98 -98 -98 -75 -98 -91 -82 -98 -99 -92 -93 -98 -98 -98 -98 -99 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -67 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -99 -87 -90 -90 -97 -85 -91 -98 -98 -98 -98 -98 -98 -98 -98 -78 -94 -93 -93 -92 -95 -84 -84 -83 -83 -83 -83 -82 -83 -83 -82 -84 -83 -86 -82 -81 -84 -82 -83 -82 -84 -82 -83 -82 -84 -65 -83 -83 -84 -84 -84 -83 -84 -83 -82 -83 -84 -84 -84 -50 -95 -79 -79 -79 -79 -79 -80 -79 -79 -79 -79 -80 -79 -41 -78 -79 -79 -80 -79 -80 -80 -80 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -98 -82 -79 -82 -82 -83 -81 -81 -81 -82 -82 -82 -82 -88 -93 -98 -76 -79 -79 -79 -78 -79 -78 -79 -79 -79 -79 -79 -54 -93 -86 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -41 -78 -84 -85 -82 -85 -71 -79 -79 -79 -80 -79 -79 -79 -78 -79 -79 -80 -78 -86 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -73 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -63 -47 -98 -96 -84 -97 -98 -84 -91 -99 -90 -96 -91 -98 -98 -97 -98 -88 -98 -98 -98 -98 -99 -98 -98 -98 -98 -78 -93 -91 -92 -87 -88 -87 -88 -86 -86 -88 -98 -98 -98 -81 -81 -82 -81 -82 -81 -81 -81 -82 -81 -82 -81 -98 -84 -90 -84 -81 -83 -83 -80 -81 -83 -83 -83 -83 -82 -83 -97 -83 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -99 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -83 -87 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -80 -81 -80 -80 -80 -80 -80 -80 -80 -81 -81 -81 -77 -98 -80 -80 -79 -80 -81 -80 -81 -81 -80 -80 -81 -80 -81 -82 -81 -82 -82 -81 -81 -82 -82 -81 -82 -83 -84 -88 -81 -98 -87 -98 -99 -80 -98 -41 -80 -80 -80 -80 -80 -78 -79 -79 -80 -79 -79 -79 -49 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -82 -98 -41 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -80 -80 -98 -41 -83 -83 -83 -83 -83 -83 -84 -83 -84 -84 -84 -84 -84 -85 -84 -84 -83 -84 -84 -84 -85 -84 -85 -85 -98 -98 -98 -84 -84 -83 -84 -83 -83 -83 -83 -82 -83 -82 -83 -82 -78 -98 -91 -81 -82 -82 -83 -83 -83 -83 -83 -83 -84 -84 -83 -98 -80 -80 -80 -80 -80 -81 -81 -81 -81 -81 -81 -81 -98 -98 -98 -67 -86 -87 -86 -85 -86 -85 -86 -86 -85 -85 -84 -85 -98 -85 -85 -84 -85 -84 -84 -82 -83 -84 -84 -84 -83 -88 -79 -79 -79 -80 -79 -79 -79 -79 -79 -79 -79 -79 -98 -98 -41 -82 -83 -83 -83 -83 -84 -84 -84 -85 -85 -85 -85 -87 -97 -91 -98 -86 -87 -98 -87 -87 -87 -86 -85 -85 -85 -84 -85 -84 -84 -85 -47 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -83 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -81 -98 -78 -78 -78 -78 -78 -78 -78 -78 -78 -77 -78 -78 -98 -94 -98 -95 -98 -99 -76 -78 -93 -87 -93 -93 -95 -93 -93 -93 -98 -98 -98 -98 -93 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -83 -83 -82 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -82 -81 -41 -81 -81 -81 -81 -80 -80 -79 -80 -80 -80 -80 -80 -79 -79 -79 -79 -79 -79 -79 -79 -80 -80 -79 -79 -98 -92 -98 -99 -41 -80 -80 -80 -79 -80 -79 -80 -80 -80 -80 -80 -80 -94 -99 -98 -77 -98 -93 -84 -79 -98 -93 -95 -95 -92 -95 -97 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -84 -98 -80 -80 -80 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -80 -98 -78 -78 -78 -78 -78 -78 -78 -78 -78 -78 -78 -78 -50 -79 -79 -78 -78 -78 -79 -79 -78 -78 -79 -78 -79 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -83 -99 -98 -98 -98 -98 -80 -98 -98 -90 -89 -93 -98 -95 -92 -92 -98 -98 -98 -82 -82 -82 -82 -82 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -92 -93 -81 -81 -81 -81 -81 -81 -82 -82 -81 -82 -81 -81 -92 -82 -81 -80 -81 -82 -82 -81 -82 -82 -82 -82 -82 -48 -82 -82 -82 -81 -82 -82 -82 -81 -81 -82 -82 -82 -83 -90 -86 -92 -89 -61 -83 -83 -82 -81 -82 -80 -81 -81 -82 -84 -84 -84 -83 -78 -84 -84 -85 -84 -85 -85 -85 -84 -85 -85 -46 -84 -81 -81 -81 -81 -81 -81 -80 -80 -80 -80 -80 -86 -85 -98 -91 -83 -83 -82 -82 -83 -83 -82 -82 -83 -82 -82 -79 -79 -56 -83 -84 -84 -84 -84 -84 -84 -84 -84 -82 -81 -82 -82 -84 -85 -85 -98 -99 -93 -93 -41 -86 -83 -85 -84 -87 -87 -87 -88 -88 -87 -86 -81 -88 -88 -87 -86 -85 -86 -86 -86 -86 -86 -86 -86 -93 -86 -85 -85 -85 -85 -84 -81 -82 -82 -82 -82 -82 -85 -93 -93 -95 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -90 -93 -94 -90 -98 -94 -93 -94 -94 -41 -82 -81 -82 -82 -81 -81 -81 -81 -82 -82 -82 -82 -84 -84 -84 -81 -81 -81 -83 -83 -83 -83 -83 -83 -83 -82 -84 -83 -86 -80 -80 -80 -80 -80 -80 -80 -80 -79 -78 -80 -82 -84 -93 -94 -94 -93 -94 -91 -98 -96 -92 -94 -94 -94 -87 -94 -97 -84 -94 -84 -99 -97 -98 -97 -96 -92 -90 -93 -97 -92 -79 -80 -94 -58 -79 -79 -78 -78 -79 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -45 -87 -82 -83 -82 -83 -84 -84 -85 -84 -85 -84 -85 -85 -94 -95 -99 -94 -94 -86 -94 -94 -98 -99 -94 -96 -83 -82 -81 -82 -82 -81 -81 -82 -82 -81 -81 -81 -52 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -78 -80 -94 -92 -92 -92 -93 -92 -94 -91 -83 -84 -84 -83 -84 -84 -84 -83 -84 -84 -84 -83 -84 -83 -83 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -99 -81 -81 -81 -81 -81 -82 -82 -82 -82 -82 -82 -82 -92 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -96 -98 -98 -98 -84 -82 -82 -82 -82 -81 -82 -82 -83 -83 -82 -83 -98 -99 -81 -80 -81 -81 -81 -80 -80 -80 -80 -80 -80 -81 -59 -80 -79 -81 -81 -81 -81 -81 -81 -82 -81 -81 -82 -94 -94 -93 -94 -98 -96 -93 -94 -94 -94 -83 -83 -83 -84 -83 -80 -81 -81 -80 -83 -83 -83 -82 -82 -82 -82 -82 -80 -93 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -93 -94 -98 -98 -93 -94 -91 -94 -98 -89 -93 -94 -93 -93 -88 -79 -93 -95 -98 -99 -97 -93 -94 -93 -85 -94 -94 -93 -93 -92 -90 -94 -86 -91 -94 -84 -85 -84 -85 -85 -85 -98 -99 -94 -93 -93 -92 -80 -80 -87 -80 -93 -93 -98 -98 -99 -94 -93 -80 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -82 -82 -94 -83 -93 -93 -84 -85 -86 -85 -86 -85 -91 -94 -81 -98 -92 -86 -93 -93 -93 -93 -97 -91 -87 -92 -93 -94 -93 -86 -83 -94 -93 -93 -97 -95 -92 -86 -89 -94 -98 -95 -84 -83 -84 -84 -83 -84 -83 -83 -83 -83 -82 -83 -81 -92 -88 -93 -86 -87 -94 -96 -87 -95 -89 -93 -98 -95 -93 -94 -93 -70 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -72 -98 -88 -99 -75 -84 -84 -84 -85 -84 -85 -84 -85 -85 -85 -86 -79 -94 -81 -81 -81 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -90 -93 -98 -98 -86 -87 -94 -90 -90 -90 -89 -89 -89 -89 -88 -89 -81 -87 -88 -88 -85 -93 -91 -92 -91 -90 -93 -91 -91 -92 -91 -93 -88 -88 -87 -87 -86 -84 -88 -87 -88 -88 -88 -88 -41 -87 -65 -88 -87 -88 -87 -88 -90 -88 -89 -89 -90 -90 -84 -90 -90 -90 -91 -90 -90 -82 -93 -93 -91 -92 -84 -93 -96 -95 -93 -93 -83 -94 -93 -95 -96 -91 -91 -93 -93 -94 -95 -94 -92 -92 -88 -92 -93 -92 -92 -90 -91 -92 -97 -48 -84 -83 -84 -82 -82 -82 -82 -82 -83 -80 -81 -83 -93 -78 -93 -88 -89 -95 -94 -93 -84 -83 -81 -84 -81 -84 -82 -84 -84 -84 -84 -84 -93 -93 -94 -84 -88 -96 -89 -89 -92 -89 -41 -90 -89 -89 -89 -89 -90 -89 -90 -89 -84 -87 -89 -94 -89 -88 -89 -90 -83 -88 -88 -84 -85 -88 -87 -84 -49 -86 -86 -86 -86 -85 -83 -83 -85 -83 -84 -84 -84 -82 -82 -82 -81 -81 -81 -81 -82 -82 -82 -81 -82 -84 -85 -86 -96 -90 -90 -94 -67 -82 -82 -82 -82 -82 -80 -82 -81 -82 -80 -82 -80 -94 -92 -90 -91 -92 -91 -91 -92 -91 -91 -93 -93 -94 -94 -94 -94 -94 -98 -97 -94 -92 -83 -94 -98 -94 -94 -94 -98 -94 -95 -95 -87 -96 -94 -95 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -99 -99 -98 -98 -98 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -41 -85 -83 -92 -98 -98 -98 -99 -95 -96 -83 -85 -95 -85 -88 -95 -91 -91 -91 -98 -90 -97 -97 -88 -98 -97 -98 -98 -83 -93 -84 -98 -89 -94 -76 -86 -83 -85 -91 -94 -99 -84 -98 -84 -85 -85 -85 -84 -85 -99 -98 -89 -89 -90 -89 -90 -89 -98 -98 -92 -98 -98 -99 -99 -98 -98 -98 -95 -98 -98 -85 -84 -85 -84 -84 -82 -82 -82 -82 -82 -83 -83 -99 -82 -82 -82 -82 -82 -82 -82 -83 -82 -83 -83 -83 -91 -84 -84 -85 -85 -85 -85 -85 -98 -99 -99 -98 -99 -93 -96 -92 -99 -99 -91 -98 -98 -98 -98 -98 -98 -98 -98 -85 -92 -98 -98 -102 -98 -95 -96 -96 -78 -86 -86 -86 -86 -86 -86 -86 -92 -92 -86 -86 -88 -89 -88 -88 -89 -99 -99 -98 -98 -98 -95 -86 -98 -98 -82 -84 -84 -84 -85 -90 -90 -86 -88 -88 -89 -90 -94 -91 -56 -84 -85 -84 -84 -84 -85 -84 -82 -84 -84 -81 -84 -99 -84 -85 -84 -84 -84 -84 -84 -84 -84 -85 -81 -81 -81 -97 -90 -86 -83 -83 -83 -89 -83 -84 -84 -86 -83 -89 -90 -94 -94 -85 -85 -83 -81 -84 -85 -85 -85 -84 -85 -85 -85 -98 -94 -98 -95 -88 -89 -87 -83 -90 -90 -69 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -94 -99 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -83 -98 -99 -88 -91 -84 -84 -84 -85 -85 -84 -91 -98 -98 -99 -99 -98 -99 -94 -95 -94 -94 -94 -94 -94 -94 -91 -95 -99 -87 -89 -89 -88 -88 -89 -92 -87 -92 -91 -91 -91 -91 -91 -90 -91 -92 -92 -91 -91 -92 -92 -88 -89 -89 -90 -89 -89 -98 -98 -91 -98 -98 -98 -98 -98 -84 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -86 -86 -88 -88 -89 -89 -89 -98 -98 -98 -99 -98 -91 -98 -98 -94 -98 -98 -98 -98 -87 -87 -88 -89 -89 -90 -98 -98 -83 -85 -85 -85 -84 -85 -85 -64 -98 -91 -91 -91 -91 -98 -98 -91 -98 -98 -88 -98 -98 -97 -97 -89 -87 -99 -88 -98 -87 -98 -98 -93 -91 -93 -96 -90 -94 -93 -93 -93 -99 -94 -93 -99 -89 -98 -92 -85 -85 -85 -85 -85 -85 -92 -84 -86 -84 -85 -86 -86 -89 -90 -90 -90 -90 -90 -92 -92 -98 -97 -98 -98 -98 -98 -98 -85 -85 -85 -85 -85 -85 -98 -98 -99 -98 -98 -98 -99 -98 -98 -97 -85 -85 -85 -85 -86 -86 -98 -98 -98 -99 -98 -95 -94 -98 -98 -98 -92 -92 -92 -92 -92 -88 -87 -88 -87 -89 -89 -98 -89 -89 -89 -88 -89 -88 -84 -92 -85 -86 -86 -85 -85 -85 -78 -87 -83 -84 -84 -85 -84 -85 -98 -99 -85 -85 -85 -86 -85 -85 -92 -86 -86 -86 -92 -81 -89 -89 -98 -98 -98 -97 -98 -99 -99 -85 -85 -85 -96 -86 -85 -86 -86 -86 -85 -90 -97 -98 -81 -80 -80 -80 -80 -80 -80 -81 -80 -81 -81 -80 -84 -82 -81 -81 -81 -82 -84 -84 -84 -84 -84 -84 -84 -87 -89 -89 -90 -83 -89 -88 -80 -81 -81 -81 -81 -81 -80 -80 -81 -81 -81 -81 -80 -94 -98 -89 -89 -88 -87 -98 -98 -79 -93 -92 -93 -98 -97 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -82 -82 -95 -95 -90 -98 -99 -98 -98 -98 -98 -98 -93 -98 -98 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -95 -99 -98 -98 -99 -95 -98 -99 -98 -98 -99 -98 -99 -99 -99 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -86 -95 -93 -92 -90 -85 -86 -86 -88 -89 -89 -89 -98 -98 -98 -97 -98 -98 -98 -97 -99 -99 -99 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -88 -98 -98 -98 -96 -98 -98 -92 -91 -98 -92 -94 -98 -95 -98 -98 -98 -86 -86 -88 -88 -89 -89 -98 -95 -95 -98 -98 -98 -98 -96 -99 -98 -98 -98 -98 -98 -98 -98 -98 -94 -86 -89 -89 -89 -87 -88 -89 -95 -97 -92 -96 -98 -85 -98 -88 -88 -88 -87 -89 -89 -97 -85 -84 -88 -85 -84 -86 -87 -94 -90 -90 -94 -89 -91 -99 -92 -90 -90 -91 -86 -88 -87 -86 -88 -94 -94 -95 -90 -91 -98 -91 -90 -98 -90 -90 -98 -97 -98 -92 -98 -99 -91 -88 -98 -98 -98 -98 -97 -98 -98 -99 -83 -85 -86 -86 -87 -90 -97 -95 -99 -86 -88 -91 -98 -98 -98 -98 -98 -98 -98 -87 -94 -98 -98 -98 -86 -87 -98 -94 -98 -98 -98 -98 -93 -98 -96 -94 -98 -98 -90 -97 -98 -89 -99 -92 -99 -98 -98 -98 -87 -84 -84 -85 -85 -88 -90 -93 -85 -85 -85 -93 -87 -84 -87 -87 -94 -84 -87 -87 -93 -97 -98 -98 -89 -90 -79 -98 -98 -98 -98 -99 -98 -98 -99 -97 -87 -86 -98 -93 -97 -98 -90 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -83 -85 -85 -85 -85 -85 -95 -85 -98 -98 -91 -91 -91 -90 -93 -87 -87 -99 -97 -98 -97 -98 -97 -96 -98 -94 -87 -93 -98 -86 -98 -98 -96 -87 -87 -97 -96 -87 -88 -93 -89 -89 -98 -98 -89 -97 -94 -92 -88 -97 -84 -84 -84 -84 -84 -85 -85 -87 -87 -98 -88 -91 -95 -98 -98 -90 -87 -88 -89 -87 -80 -98 -81 -98 -96 -88 -89 -97 -81 -98 -90 -96 -93 -98 -98 -98 -98 -97 -86 -87 -97 -98 -97 -98 -98 -96 -91 -82 -87 -88 -97 -98 -98 -96 -99 -89 -87 -88 -91 -85 -87 -89 -87 -87 -98 -90 -87 -87 -96 -87 -87 -99 -99 -90 -90 -99 -98 -84 -85 -88 -98 -87 -88 -99 -98 -95 -90 -90 -90 -88 -88 -99 -88 -87 -91 -99 -87 -86 -86 -78 -85 -86 -98 -98 -84 -87 -87 -90 -87 -88 -89 -91 -90 -98 -99 -98 -86 -87 -86 -82 -97 -98 -90 -90 -97 -98 -99 -98 -98 -98 -99 -94 -91 -90 -98 -90 -98 -92 -92 -98 -98 -99 -98 -84 -85 -85 -85 -85 -85 -85 -94 -99 -88 -88 -98 -99 -87 -88 -98 -98 -98 -87 -88 -98 -95 -87 -95 -90 -91 -99 -96 -98 -91 -90 -91 -98 -83 -86 -88 -91 -85 -87 -88 -98 -89 -89 -89 -96 -88 -94 -89 -89 -91 -91 -92 -78 -94 -91 -92 -91 -91 -95 -87 -87 -97 -91 -98 -98 -99 -85 -98 -98 -98 -98 -98 -84 -87 -87 -87 -98 -98 -97 -98 -98 -84 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -91 -98 -98 -88 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -92 -92 -98 -98 -98 -99 -98 -95 -89 -96 -95 -96 -97 -88 -86 -87 -89 -89 -88 -94 -91 -91 -92 -91 -91 -96 -91 -91 -91 -91 -92 -91 -92 -86 -93 -91 -93 -91 -91 -92 -98 -95 -97 -98 -94 -84 -98 -93 -84 -91 -97 -97 -90 -96 -96 -98 -89 -99 -98 -98 -98 -98 -98 -94 -98 -98 -98 -98 -84 -89 -97 -87 -89 -88 -88 -89 -90 -89 -98 -84 -98 -98 -98 -98 -94 -98 -99 -98 -99 -99 -99 -98 -98 -98 -98 -98 -98 -94 -92 -97 -92 -98 -84 -89 -92 -98 -98 -98 -84 -89 -89 -89 -89 -89 -89 -89 -88 -90 -89 -78 -84 -84 -85 -85 -85 -84 -84 -98 -89 -89 -89 -98 -98 -98 -98 -98 -98 -98 -91 -80 -80 -85 -85 -84 -84 -88 -99 -93 -93 -93 -90 -89 -96 -87 -88 -98 -95 -98 -98 -98 -91 -90 -98 -98 -99 -98 -98 -86 -86 -98 -98 -86 -87 -88 -98 -90 -90 -99 -90 -91 -97 -87 -98 -98 -90 -90 -91 -91 -98 -91 -86 -93 -98 -84 -98 -99 -91 -98 -98 -98 -98 -98 -98 -95 -98 -89 -94 -98 -98 -98 -98 -84 -98 -85 -98 -78 -94 -93 -94 -93 -93 -93 -93 -98 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -95 -82 -98 -97 -97 -97 -98 -98 -97 -98 -92 -92 -97 -97 -98 -98 -98 -93 -98 -97 -98 -92 -97 -99 -99 -84 -84 -84 -84 -85 -84 -84 -98 -98 -94 -98 -99 -98 -99 -98 -98 -96 -98 -90 -89 -89 -89 -88 -89 -88 -91 -98 -98 -98 -98 -98 -98 -98 -90 -98 -98 -98 -96 -99 -98 -97 -97 -98 -84 -83 -84 -84 -98 -98 -98 -99 -78 -99 -94 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -84 -93 -83 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -93 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -97 -92 -97 -97 -97 -92 -92 -98 -97 -92 -98 -92 -98 -98 -98 -98 -98 -98 -84 -85 -85 -85 -85 -85 -99 -89 -89 -90 -91 -77 -89 -87 -87 -98 -98 -88 -88 -98 -87 -88 -98 -88 -89 -98 -98 -87 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -93 -93 -92 -97 -98 -98 -98 -88 -96 -91 -97 -99 -90 -94 -94 -91 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -95 -91 -98 -99 -88 -88 -95 -98 -92 -90 -96 -84 -88 -86 -92 -92 -98 -98 -86 -87 -90 -95 -99 -92 -98 -98 -98 -98 -98 -97 -93 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -95 -95 -96 -91 -90 -81 -81 -91 -91 -99 -98 -99 -96 -98 -93 -96 -98 -99 -91 -98 -98 -93 -99 -99 -98 -98 -98 -98 -98 -98 -92 -95 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -92 -99 -98 -98 -98 -98 -98 -97 -84 -84 -98 -99 -98 -98 -98 -99 -98 -98 -77 -94 -93 -93 -98 -98 -98 -98 -98 -99 -99 -99 -98 -99 -98 -98 -98 -98 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -97 -97 -99 -98 -95 -98 -97 -98 -91 -98 -97 -98 -98 -98 -98 -98 -98 -99 -99 -99 -98 -92 -85 -96 -97 -97 -90 -91 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -93 -98 -99 -98 -97 -93 -97 -98 -97 -98 -98 -97 -97 -88 -96 -84 -84 -84 -98 -98 -85 -98 -89 -92 -90 -84 -84 -93 -96 -96 -98 -99 -95 -98 -89 -98 -99 -92 -95 -99 -98 -99 -98 -99 -91 -96 -96 -98 -92 -98 -98 -89 -86 -98 -98 -98 -99 -98 -96 -99 -98 -98 -90 -95 -93 -98 -97 -97 -96 -98 -98 -99 -99 -98 -98 -98 -96 -98 -98 -97 -97 -98 -98 -99 -97 -98 -98 -98 -98 -99 -98 -89 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -95 -94 -93 -93 -93 -93 -98 -97 -99 -85 -98 -99 -98 -98 -99 -99 -92 -98 -98 -77 -95 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -97 -91 -98 -91 -97 -98 -98 -98 -81 -90 -84 -97 -96 -97 -98 -97 -98 -98 -98 -98 -98 -91 -94 -98 -98 -98 -92 -90 -95 -89 -99 -86 -85 -86 -98 -98 -98 -98 -98 -93 -99 -98 -98 -98 -98 -98 -98 -85 -98 -91 -85 -94 -95 -90 -93 -90 -89 -99 -94 -94 -96 -90 -98 -98 -98 -98 -91 -98 -98 -98 -98 -99 -98 -97 -84 -84 -85 -85 -91 -85 -89 -85 -87 -85 -84 -76 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -81 -99 -98 -81 -81 -98 -98 -99 -96 -98 -98 -99 -90 -98 -99 -96 -98 -98 -98 -94 -94 -94 -91 -91 -98 -96 -98 -95 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -91 -98 -98 -97 -97 -91 -97 -97 -85 -85 -84 -98 -98 -98 -92 -98 -98 -98 -94 -87 -98 -98 -98 -98 -98 -97 -98 -97 -98 -96 -98 -98 -96 -97 -98 -89 -98 -99 -97 -99 -99 -98 -97 -98 -98 -98 -98 -89 -95 -98 -98 -98 -99 -97 -98 -98 -98 -98 -88 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -91 -98 -98 -98 -98 -98 -98 -97 -94 -89 -89 -98 -91 -98 -98 -98 -98 -80 -76 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -87 -79 -98 -87 -90 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -56 -96 -98 -98 -97 -97 -98 -98 -98 -98 -98 -95 -96 -92 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -94 -92 -98 -98 -98 -99 -99 -98 -91 -99 -93 -98 -98 -98 -98 -94 -87 -94 -98 -99 -99 -98 -98 -99 -98 -98 -77 -93 -93 -91 -93 -98 -99 -99 -98 -98 -93 -99 -98 -98 -99 -98 -98 -97 -91 -98 -98 -98 -93 -81 -82 -98 -98 -98 -99 -98 -98 -98 -99 -99 -98 -98 -96 -92 -92 -91 -94 -95 -92 -98 -98 -99 -95 -95 -93 -98 -98 -98 -99 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -90 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -93 -98 -98 -98 -98 -98 -98 -93 -93 -84 -85 -86 -91 -85 -81 -80 -80 -81 -80 -81 -81 -81 -81 -82 -81 -82 -99 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -40 -84 -83 -92 -98 -97 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -83 -83 -57 -82 -82 -83 -81 -82 -83 -83 -82 -82 -82 -82 -46 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -81 -80 -93 -95 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -83 -83 -41 -82 -82 -82 -82 -82 -76 -82 -82 -82 -82 -82 -82 -97 -80 -80 -80 -80 -80 -80 -79 -81 -80 -80 -80 -80 -81 -81 -80 -81 -81 -80 -81 -80 -80 -80 -80 -80 -85 -93 -97 -97 -82 -94 -95 -81 -82 -82 -81 -81 -81 -81 -82 -81 -81 -81 -81 -97 -98 -71 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -80 -72 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -92 -98 -98 -98 -98 -98 -98 -99 -88 -90 -89 -90 -90 -89 -99 -98 -98 -98 -77 -94 -92 -91 -93 -93 -95 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -92 -90 -91 -94 -87 -98 -94 -99 -99 -98 -98 -98 -93 -99 -93 -96 -94 -97 -98 -99 -91 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -94 -98 -98 -92 -99 -98 -98 -98 -98 -98 -97 -98 -85 -98 -98 -98 -93 -98 -92 -98 -99 -92 -91 -91 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -55 -67 -54 -98 -92 -98 -81 -81 -80 -80 -81 -80 -81 -80 -81 -81 -81 -81 -98 -92 -95 -92 -86 -81 -80 -81 -81 -81 -80 -81 -81 -81 -81 -81 -79 -92 -99 -92 -93 -98 -92 -92 -97 -91 -96 -92 -97 -92 -99 -98 -98 -98 -98 -98 -98 -97 -92 -94 -98 -92 -97 -96 -98 -99 -98 -98 -98 -93 -98 -98 -98 -99 -98 -86 -89 -87 -88 -88 -98 -88 -89 -89 -94 -98 -97 -94 -91 -91 -90 -94 -93 -98 -97 -98 -93 -97 -91 -97 -96 -97 -92 -97 -96 -92 -93 -92 -94 -82 -98 -87 -82 -92 -98 -98 -98 -98 -98 -98 -98 -94 -98 -97 -97 -90 -98 -98 -98 -98 -98 -97 -98 -92 -88 -94 -96 -96 -98 -92 -97 -98 -98 -98 -99 -96 -93 -98 -98 -97 -99 -93 -98 -97 -99 -98 -99 -98 -98 -98 -98 -99 -92 -93 -99 -92 -98 -92 -92 -98 -98 -88 -95 -85 -98 -89 -98 -93 -85 -86 -98 -97 -98 -98 -97 -77 -91 -92 -92 -92 -99 -89 -92 -84 -43 -84 -96 -92 -97 -99 -41 -99 -98 -99 -98 -93 -99 -93 -99 -98 -98 -88 -97 -85 -98 -97 -81 -82 -82 -82 -81 -81 -82 -82 -82 -82 -82 -82 -93 -86 -86 -82 -83 -84 -86 -86 -86 -86 -85 -85 -85 -99 -98 -43 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -98 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -95 -84 -83 -84 -83 -82 -82 -82 -83 -82 -83 -83 -82 -82 -82 -82 -82 -82 -81 -77 -82 -82 -83 -82 -82 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -98 -90 -98 -80 -68 -96 -80 -99 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -90 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -93 -95 -93 -85 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -98 -98 -98 -98 -98 -91 -92 -98 -98 -93 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -40 -99 -96 -99 -90 -97 -97 -97 -93 -92 -99 -98 -98 -93 -92 -93 -95 -99 -92 -92 -92 -98 -97 -91 -96 -98 -98 -97 -98 -98 -98 -98 -98 -98 -94 -96 -97 -90 -98 -98 -92 -98 -98 -98 -98 -98 -97 -94 -93 -98 -98 -98 -98 -98 -98 -94 -96 -98 -92 -98 -98 -93 -99 -99 -98 -98 -99 -92 -93 -92 -92 -98 -99 -93 -92 -98 -98 -98 -97 -93 -95 -98 -92 -98 -98 -99 -99 -85 -85 -97 -91 -99 -90 -89 -97 -97 -98 -93 -92 -96 -92 -98 -96 -84 -84 -98 -98 -98 -86 -99 -98 -92 -98 -93 -99 -90 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -98 -99 -98 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -99 -94 -82 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -96 -93 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -65 -84 -83 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -93 -50 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -81 -83 -82 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -83 -82 -95 -93 -98 -83 -83 -84 -84 -83 -83 -84 -83 -84 -83 -82 -84 -55 -99 -91 -91 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -80 -90 -94 -81 -81 -82 -81 -80 -80 -81 -80 -81 -80 -81 -81 -40 -83 -82 -80 -84 -83 -83 -84 -82 -82 -82 -83 -82 -88 -81 -81 -81 -81 -81 -81 -80 -81 -81 -80 -80 -81 -81 -92 -86 -88 -41 -82 -81 -81 -80 -82 -81 -82 -81 -81 -81 -81 -81 -81 -92 -94 -92 -93 -94 -98 -98 -99 -92 -98 -98 -94 -89 -98 -99 -98 -94 -94 -92 -96 -98 -98 -98 -98 -98 -92 -99 -96 -84 -94 -96 -98 -98 -98 -99 -98 -91 -96 -96 -98 -98 -98 -99 -98 -99 -98 -99 -98 -98 -96 -93 -93 -98 -98 -98 -98 -98 -91 -91 -88 -98 -97 -89 -93 -98 -98 -98 -98 -99 -93 -93 -93 -78 -91 -92 -92 -98 -98 -98 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -40 -98 -92 -83 -83 -83 -82 -83 -83 -82 -82 -83 -83 -82 -83 -54 -98 -98 -92 -98 -82 -83 -83 -83 -82 -82 -82 -82 -83 -83 -82 -82 -98 -83 -83 -82 -82 -83 -82 -83 -82 -83 -82 -83 -82 -98 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -99 -88 -98 -98 -98 -94 -55 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -80 -81 -91 -89 -91 -91 -80 -85 -85 -93 -87 -88 -98 -93 -96 -41 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -98 -93 -86 -92 -47 -92 -92 -99 -98 -98 -98 -97 -88 -97 -98 -98 -86 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -41 -94 -82 -84 -85 -84 -84 -85 -84 -84 -84 -84 -83 -84 -98 -93 -81 -80 -80 -81 -80 -80 -81 -81 -81 -81 -80 -81 -86 -81 -98 -91 -93 -92 -94 -91 -98 -93 -93 -96 -89 -92 -92 -91 -91 -93 -93 -93 -93 -94 -92 -98 -93 -98 -97 -94 -93 -95 -93 -95 -98 -97 -97 -98 -84 -84 -84 -77 -84 -83 -84 -83 -85 -81 -84 -85 -85 -81 -93 -92 -92 -85 -92 -93 -93 -92 -93 -89 -92 -98 -98 -97 -98 -98 -94 -98 -93 -89 -89 -89 -79 -93 -88 -84 -85 -94 -77 -91 -91 -98 -83 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -41 -93 -84 -83 -84 -83 -83 -83 -82 -83 -84 -83 -84 -86 -83 -98 -96 -99 -95 -86 -83 -84 -83 -83 -83 -83 -83 -83 -83 -84 -84 -83 -41 -84 -84 -84 -84 -83 -83 -81 -82 -82 -83 -82 -83 -87 -80 -81 -79 -79 -81 -80 -81 -80 -81 -80 -81 -80 -91 -41 -82 -82 -83 -83 -83 -83 -82 -82 -83 -82 -82 -83 -85 -98 -98 -98 -99 -88 -98 -85 -98 -86 -78 -97 -91 -91 -91 -91 -91 -87 -82 -92 -87 -87 -92 -86 -88 -97 -92 -93 -88 -88 -88 -85 -87 -86 -88 -98 -79 -99 -98 -98 -85 -87 -91 -85 -86 -97 -97 -89 -98 -91 -98 -98 -98 -80 -81 -81 -81 -81 -81 -80 -81 -80 -80 -80 -81 -48 -98 -92 -92 -92 -92 -92 -92 -92 -92 -99 -94 -98 -96 -41 -81 -81 -81 -80 -81 -81 -80 -81 -81 -81 -81 -81 -98 -86 -98 -99 -89 -97 -90 -84 -85 -85 -84 -81 -89 -87 -85 -92 -77 -84 -84 -84 -85 -85 -84 -85 -85 -84 -85 -84 -84 -84 -84 -84 -87 -85 -84 -84 -85 -84 -84 -85 -84 -84 -82 -85 -83 -85 -85 -84 -91 -85 -88 -83 -86 -86 -84 -87 -88 -91 -91 -91 -84 -81 -82 -85 -85 -81 -84 -93 -41 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -99 -94 -93 -98 -62 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -85 -81 -98 -98 -95 -98 -83 -83 -83 -81 -81 -83 -83 -83 -83 -83 -83 -83 -41 -93 -93 -82 -98 -95 -99 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -84 -84 -84 -83 -83 -84 -84 -83 -83 -83 -84 -83 -84 -98 -89 -83 -83 -84 -82 -82 -83 -83 -83 -83 -82 -83 -83 -98 -80 -80 -81 -80 -80 -80 -80 -80 -81 -80 -80 -79 -92 -97 -98 -98 -98 -98 -92 -98 -98 -88 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -67 -80 -80 -81 -80 -81 -80 -81 -80 -80 -80 -81 -81 -98 -98 -84 -77 -84 -83 -82 -83 -83 -83 -83 -83 -83 -84 -41 -91 -98 -99 -93 -83 -83 -83 -83 -84 -83 -82 -83 -83 -82 -83 -83 -56 -99 -48 -85 -94 -97 -83 -83 -83 -83 -83 -83 -83 -82 -82 -82 -82 -82 -91 -93 -80 -80 -80 -80 -80 -81 -81 -81 -81 -81 -81 -80 -98 -95 -92 -99 -94 -98 -93 -98 -93 -93 -93 -94 -93 -98 -94 -82 -41 -92 -98 -98 -98 -98 -98 -92 -92 -92 -92 -92 -80 -92 -92 -92 -98 -98 -98 -98 -98 -96 -82 -98 -98 -89 -97 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -90 -98 -93 -96 -98 -98 -98 -99 -98 -98 -93 -98 -91 -92 -92 -91 -91 -92 -92 -92 -98 -95 -98 -95 -98 -98 -98 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -80 -77 -96 -62 -98 -98 -81 -80 -80 -80 -81 -81 -80 -79 -80 -80 -80 -80 -85 -82 -82 -81 -81 -77 -83 -83 -84 -84 -83 -84 -83 -98 -98 -98 -98 -97 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -49 -81 -51 -98 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -82 -81 -82 -77 -98 -98 -98 -94 -94 -98 -95 -93 -98 -95 -94 -92 -98 -94 -98 -98 -98 -94 -98 -98 -98 -92 -96 -98 -98 -98 -98 -92 -98 -90 -98 -93 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -98 -96 -99 -89 -92 -97 -96 -93 -98 -99 -97 -98 -98 -92 -93 -93 -93 -98 -97 -98 -99 -98 -92 -97 -98 -99 -92 -98 -98 -98 -98 -98 -93 -98 -94 -98 -100 -99 -93 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -92 -88 -81 -80 -80 -81 -80 -81 -80 -80 -81 -80 -81 -76 -77 -92 -98 -98 -98 -98 -99 -91 -91 -99 -98 -99 -98 -98 -98 -98 -93 -98 -98 -98 -99 -98 -96 -84 -84 -85 -85 -86 -97 -98 -93 -99 -98 -98 -78 -91 -92 -91 -98 -98 -89 -91 -98 -98 -98 -88 -96 -99 -93 -96 -98 -98 -96 -99 -98 -98 -95 -98 -97 -98 -84 -84 -85 -85 -98 -99 -98 -94 -98 -94 -98 -98 -98 -90 -98 -98 -88 -98 -98 -98 -99 -98 -93 -98 -99 -99 -98 -98 -94 -98 -96 -92 -98 -98 -93 -94 -93 -93 -98 -94 -98 -99 -98 -98 -98 -98 -98 -98 -92 -95 -92 -99 -98 -98 -92 -96 -98 -98 -96 -98 -98 -93 -98 -84 -98 -95 -93 -92 -92 -93 -93 -94 -98 -82 -91 -99 -92 -98 -90 -93 -99 -98 -98 -99 -99 -98 -99 -98 -93 -99 -98 -98 -98 -98 -99 -95 -81 -97 -97 -98 -98 -78 -98 -98 -93 -98 -93 -98 -94 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -92 -91 -97 -97 -98 -94 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -94 -93 -98 -95 -96 -90 -97 -97 -97 -99 -98 -97 -97 -98 -96 -98 -96 -87 -98 -98 -98 -94 -86 -92 -98 -88 -89 -89 -89 -88 -90 -89 -89 -89 -89 -89 -77 -91 -97 -98 -98 -97 -98 -94 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -89 -98 -98 -98 -91 -98 -94 -98 -98 -98 -98 -89 -84 -84 -99 -97 -84 -98 -98 -92 -93 -92 -96 -93 -92 -93 -99 -93 -99 -98 -92 -86 -97 -88 -85 -98 -89 -98 -98 -98 -96 -96 -85 -98 -95 -92 -99 -98 -93 -92 -85 -92 -85 -93 -85 -98 -92 -98 -97 -98 -98 -98 -98 -92 -92 -98 -98 -98 -98 -98 -97 -97 -98 -81 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -94 -98 -99 -98 -90 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -88 -95 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -99 -98 -98 -95 -96 -98 -96 -91 -95 -95 -97 -90 -92 -98 -92 -92 -98 -98 -98 -98 -99 -96 -97 -97 -89 -89 -89 -89 -89 -90 -89 -90 -89 -98 -79 -94 -91 -97 -93 -91 -94 -93 -94 -98 -92 -91 -93 -91 -94 -98 -98 -93 -94 -93 -94 -96 -98 -93 -98 -88 -98 -98 -85 -98 -98 -98 -98 -98 -98 -96 -99 -98 -98 -90 -98 -91 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -90 -95 -98 -98 -98 -98 -98 -97 -98 -88 -98 -98 -99 -98 -96 -98 -98 -97 -99 -94 -98 -92 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -96 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -93 -97 -98 -98 -95 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -88 -98 -84 -98 -98 -98 -97 -98 -92 -98 -98 -98 -98 -99 -99 -97 -88 -89 -94 -89 -89 -89 -86 -97 -98 -98 -79 -93 -91 -93 -93 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -96 -98 -98 -98 -98 -98 -81 -99 -81 -98 -98 -98 -98 -95 -92 -92 -98 -90 -98 -98 -98 -90 -97 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -99 -98 -98 -94 -92 -89 -89 -92 -92 -92 -91 -89 -88 -88 -89 -92 -89 -92 -78 -91 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -93 -92 -92 -92 -92 -98 -98 -98 -91 -95 -81 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -92 -95 -92 -91 -99 -90 -98 -98 -94 -92 -98 -98 -99 -98 -99 -98 -98 -98 -98 -94 -87 -92 -91 -91 -98 -92 -92 -92 -88 -92 -85 -84 -89 -84 -88 -84 -85 -85 -85 -85 -84 -85 -78 -84 -84 -84 -99 -89 -90 -90 -92 -89 -89 -90 -90 -88 -90 -89 -90 -89 -89 -87 -88 -90 -92 -95 -97 -87 -83 -82 -98 -90 -98 -98 -94 -96 -82 -86 -82 -94 -97 -82 -81 -98 -82 -98 -81 -90 -84 -90 -87 -99 -98 -98 -85 -85 -84 -85 -85 -85 -85 -85 -85 -85 -85 -85 -86 -85 -85 -85 -98 -99 -98 -99 -89 -89 -89 -88 -88 -88 -89 -88 -90 -88 -86 -87 -88 -88 -88 -85 -85 -85 -84 -84 -85 -85 -85 -86 -85 -84 -84 -84 -85 -78 -94 -87 -87 -92 -83 -83 -84 -84 -84 -84 -85 -85 -87 -85 -98 -98 -99 -85 -85 -81 -92 -84 -92 -92 -98 -98 -98 -99 -90 -94 -94 -98 -98 -98 -89 -98 -98 -98 -99 -90 -92 -88 -92 -92 -99 -98 -98 -99 -98 -94 -91 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -97 -98 -95 -98 -98 -98 -98 -92 -92 -91 -92 -92 -90 -88 -89 -89 -98 -94 -91 -91 -92 -92 -92 -88 -87 -89 -88 -89 -89 -89 -90 -93 -89 -91 -85 -87 -84 -84 -83 -98 -85 -86 -85 -86 -86 -95 -98 -88 -96 -89 -89 -96 -98 -84 -84 -86 -80 -83 -80 -98 -80 -80 -85 -80 -81 -81 -97 -95 -94 -98 -92 -95 -91 -81 -98 -98 -89 -81 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -83 -80 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -97 -91 -96 -99 -98 -98 -91 -98 -91 -99 -98 -98 -98 -99 -97 -96 -97 -84 -91 -99 -99 -99 -98 -98 -98 -98 -98 -97 -98 -91 -93 -93 -93 -93 -89 -89 -94 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -96 -80 -92 -92 -98 -90 -90 -98 -98 -91 -98 -97 -98 -96 -98 -98 -86 -98 -98 -99 -98 -96 -98 -98 -98 -95 -95 -98 -97 -99 -98 -94 -92 -98 -98 -98 -92 -89 -97 -98 -98 -98 -94 -99 -98 -98 -98 -92 -98 -99 -98 -98 -99 -98 -98 -99 -98 -98 -92 -98 -98 -98 -98 -98 -98 -92 -92 -95 -89 -89 -88 -92 -89 -89 -94 -96 -88 -87 -78 -92 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -93 -98 -81 -91 -90 -98 -97 -81 -84 -82 -82 -82 -81 -81 -82 -83 -92 -83 -84 -84 -84 -84 -84 -83 -85 -79 -82 -80 -82 -82 -82 -99 -94 -85 -84 -84 -84 -84 -84 -99 -98 -82 -81 -81 -81 -81 -81 -98 -98 -98 -98 -98 -99 -98 -97 -97 -97 -97 -84 -87 -95 -95 -96 -92 -98 -97 -98 -85 -96 -95 -98 -92 -92 -98 -99 -98 -98 -77 -93 -91 -97 -99 -93 -92 -90 -91 -91 -95 -92 -98 -99 -90 -98 -98 -98 -98 -98 -99 -98 -91 -92 -93 -92 -98 -98 -98 -95 -98 -97 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -94 -98 -99 -98 -98 -99 -98 -97 -88 -91 -88 -88 -91 -98 -83 -83 -97 -97 -77 -91 -90 -91 -92 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -92 -98 -98 -98 -81 -98 -98 -86 -98 -99 -98 -98 -91 -99 -98 -98 -98 -95 -98 -98 -98 -90 -81 -81 -80 -81 -81 -81 -99 -81 -81 -81 -81 -81 -81 -95 -83 -83 -83 -83 -83 -83 -98 -81 -81 -81 -80 -81 -81 -93 -93 -98 -98 -98 -99 -98 -99 -99 -98 -98 -98 -99 -92 -98 -98 -95 -92 -99 -99 -98 -98 -88 -98 -99 -98 -98 -98 -98 -98 -98 -87 -94 -97 -90 -94 -98 -99 -98 -98 -98 -98 -98 -98 -92 -98 -88 -91 -99 -98 -98 -98 -98 -92 -81 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -92 -95 -95 -98 -98 -89 -95 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -95 -91 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -92 -98 -91 -98 -99 -98 -98 -98 -98 -97 -87 -89 -89 -91 -88 -88 -89 -88 -88 -89 -88 -88 -84 -90 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -93 -81 -82 -92 -99 -99 -88 -98 -99 -98 -98 -98 -98 -96 -98 -98 -99 -90 -81 -81 -82 -80 -82 -81 -92 -99 -84 -81 -84 -84 -84 -84 -95 -98 -83 -84 -84 -84 -84 -84 -95 -87 -81 -82 -81 -82 -81 -88 -92 -96 -84 -84 -83 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -98 -82 -81 -82 -82 -80 -80 -57 -98 -98 -99 -99 -98 -98 -78 -94 -92 -92 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -96 -88 -99 -97 -98 -99 -98 -98 -98 -98 -98 -99 -98 -95 -98 -98 -98 -90 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -99 -98 -98 -92 -96 -97 -91 -92 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -98 -95 -93 -95 -98 -92 -98 -99 -98 -98 -98 -98 -98 -98 -84 -85 -84 -85 -84 -84 -98 -98 -98 -98 -77 -99 -93 -98 -89 -99 -98 -98 -98 -98 -98 -98 -99 -101 -98 -92 -98 -94 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -99 -98 -98 -98 -98 -92 -92 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -92 -95 -94 -95 -92 -97 -94 -97 -86 -98 -98 -99 -91 -99 -98 -99 -81 -81 -77 -81 -81 -81 -90 -93 -82 -82 -81 -82 -81 -78 -98 -98 -98 -84 -84 -83 -84 -84 -84 -98 -84 -84 -83 -83 -83 -84 -81 -82 -82 -82 -82 -82 -82 -89 -99 -92 -81 -80 -81 -82 -81 -81 -40 -92 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -92 -98 -98 -99 -98 -89 -98 -99 -98 -85 -83 -84 -93 -88 -88 -86 -87 -88 -88 -78 -92 -90 -98 -98 -98 -98 -98 -98 -99 -98 -98 -92 -98 -92 -95 -98 -98 -98 -98 -98 -92 -98 -81 -98 -98 -82 -98 -98 -98 -98 -98 -99 -98 -96 -97 -98 -96 -93 -99 -98 -98 -89 -98 -97 -98 -99 -98 -98 -98 -98 -98 -87 -89 -92 -92 -95 -92 -91 -90 -93 -92 -92 -92 -92 -92 -92 -92 -92 -98 -98 -98 -98 -98 -98 -99 -97 -99 -98 -91 -92 -95 -98 -99 -93 -93 -98 -97 -87 -84 -99 -98 -98 -98 -90 -98 -98 -98 -84 -94 -94 -93 -94 -98 -81 -81 -81 -81 -81 -81 -75 -92 -95 -81 -81 -81 -81 -81 -81 -86 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -95 -83 -83 -84 -83 -83 -84 -63 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -95 -99 -98 -88 -95 -88 -98 -98 -98 -91 -96 -92 -98 -98 -98 -98 -97 -84 -94 -86 -85 -85 -93 -85 -98 -97 -84 -93 -89 -88 -87 -88 -88 -89 -77 -84 -84 -85 -85 -85 -85 -84 -85 -94 -84 -98 -98 -88 -89 -83 -83 -88 -98 -84 -86 -98 -95 -98 -84 -98 -95 -98 -95 -98 -96 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -84 -80 -92 -98 -81 -92 -94 -98 -94 -91 -98 -98 -98 -92 -99 -98 -98 -98 -92 -98 -98 -98 -98 -98 -78 -92 -94 -88 -92 -86 -92 -92 -91 -98 -98 -98 -84 -84 -83 -84 -84 -84 -84 -84 -84 -77 -84 -84 -83 -98 -88 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -72 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -98 -98 -98 -93 -99 -81 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -42 -82 -81 -82 -82 -82 -82 -81 -82 -82 -82 -82 -81 -41 -99 -95 -95 -96 -95 -92 -92 -92 -92 -98 -98 -98 -98 -86 -99 -97 -91 -89 -92 -98 -99 -98 -98 -93 -93 -91 -98 -94 -84 -93 -81 -85 -98 -98 -98 -99 -98 -95 -98 -98 -98 -90 -99 -99 -98 -99 -88 -98 -99 -94 -99 -84 -92 -98 -98 -95 -93 -98 -99 -98 -98 -98 -97 -92 -98 -98 -98 -98 -99 -98 -98 -98 -99 -99 -98 -98 -97 -98 -98 -98 -98 -98 -92 -98 -99 -98 -98 -98 -99 -99 -84 -86 -86 -88 -95 -92 -98 -89 -99 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -82 -93 -92 -98 -83 -83 -83 -83 -83 -83 -84 -84 -84 -84 -84 -84 -86 -84 -84 -83 -83 -84 -84 -84 -83 -83 -83 -84 -83 -42 -84 -80 -81 -84 -84 -83 -83 -84 -82 -83 -84 -84 -81 -51 -81 -80 -80 -80 -81 -80 -81 -81 -81 -81 -80 -80 -98 -98 -98 -89 -84 -84 -84 -83 -84 -84 -83 -83 -83 -83 -83 -84 -91 -94 -83 -84 -84 -84 -81 -81 -81 -84 -82 -81 -81 -84 -84 -77 -83 -83 -83 -84 -84 -84 -84 -84 -84 -83 -41 -99 -98 -98 -98 -99 -92 -98 -97 -98 -98 -96 -98 -84 -85 -98 -98 -98 -98 -98 -98 -99 -97 -98 -96 -98 -98 -95 -94 -94 -92 -94 -95 -93 -92 -98 -93 -98 -98 -99 -95 -94 -93 -92 -95 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -92 -98 -98 -99 -98 -98 -98 -98 -98 -98 -94 -98 -93 -92 -98 -98 -93 -98 -99 -98 -98 -94 -84 -98 -98 -98 -98 -98 -99 -99 -99 -79 -99 -93 -93 -98 -98 -98 -99 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -84 -97 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -83 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -98 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -80 -81 -40 -98 -98 -98 -98 -98 -98 -92 -91 -99 -92 -98 -98 -99 -98 -99 -94 -98 -81 -80 -81 -81 -81 -81 -80 -80 -80 -81 -80 -80 -83 -83 -83 -84 -84 -78 -84 -83 -84 -84 -83 -84 -98 -48 -80 -81 -80 -81 -80 -81 -80 -81 -80 -80 -80 -80 -81 -80 -80 -80 -81 -80 -80 -80 -81 -80 -80 -80 -97 -84 -90 -93 -98 -99 -90 -83 -92 -83 -83 -83 -84 -83 -84 -83 -83 -83 -83 -83 -83 -98 -98 -94 -98 -94 -99 -98 -98 -98 -99 -99 -98 -99 -99 -98 -98 -92 -92 -98 -98 -99 -98 -98 -98 -99 -98 -92 -99 -99 -98 -92 -93 -97 -98 -98 -88 -98 -84 -84 -84 -84 -84 -84 -84 -77 -83 -83 -83 -83 -92 -92 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -99 -98 -89 -91 -91 -98 -98 -98 -98 -97 -98 -98 -98 -92 -84 -83 -84 -98 -99 -99 -98 -99 -98 -98 -98 -98 -99 -99 -98 -88 -98 -98 -92 -98 -98 -98 -99 -93 -98 -98 -98 -98 -98 -98 -98 -84 -90 -94 -98 -88 -88 -93 -98 -88 -93 -88 -77 -91 -92 -98 -98 -98 -98 -99 -93 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -92 -90 -99 -97 -90 -95 -94 -85 -93 -98 -83 -83 -83 -83 -82 -82 -82 -82 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -83 -98 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -64 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -92 -98 -89 -97 -98 -98 -98 -98 -89 -79 -80 -80 -81 -81 -81 -80 -81 -81 -81 -76 -75 -90 -90 -80 -81 -81 -80 -81 -80 -81 -81 -81 -80 -80 -80 -87 -93 -72 -99 -97 -98 -98 -98 -96 -98 -98 -98 -98 -98 -99 -99 -98 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -70 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -98 -98 -88 -98 -84 -98 -87 -88 -88 -90 -89 -88 -88 -91 -88 -98 -77 -99 -84 -93 -97 -86 -92 -87 -98 -87 -98 -98 -98 -98 -98 -98 -98 -84 -96 -85 -94 -95 -92 -91 -99 -80 -85 -98 -98 -98 -99 -98 -98 -98 -93 -98 -97 -98 -99 -98 -81 -81 -81 -80 -81 -81 -81 -81 -80 -81 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -52 -95 -93 -93 -92 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -92 -92 -99 -98 -98 -98 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -76 -81 -81 -81 -81 -80 -81 -81 -81 -80 -81 -81 -81 -46 -98 -84 -83 -84 -83 -84 -84 -83 -83 -83 -84 -84 -83 -99 -91 -83 -83 -83 -82 -83 -83 -83 -83 -82 -83 -82 -83 -95 -95 -82 -82 -82 -82 -82 -82 -83 -83 -82 -82 -82 -82 -99 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -61 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -90 -98 -98 -98 -88 -88 -88 -88 -89 -88 -84 -90 -98 -98 -91 -94 -91 -96 -99 -96 -99 -92 -99 -98 -96 -98 -99 -98 -98 -98 -98 -98 -99 -99 -98 -96 -95 -80 -98 -99 -98 -98 -98 -99 -99 -98 -96 -84 -98 -92 -80 -80 -80 -80 -81 -81 -81 -81 -81 -81 -80 -81 -95 -93 -98 -98 -98 -95 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -78 -81 -81 -81 -81 -81 -88 -95 -94 -93 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -88 -80 -47 -81 -81 -80 -81 -81 -81 -80 -81 -81 -80 -81 -80 -98 -80 -81 -80 -81 -80 -80 -80 -80 -81 -80 -81 -81 -90 -95 -92 -83 -83 -83 -84 -84 -83 -83 -83 -84 -84 -84 -83 -84 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -41 -98 -58 -91 -84 -83 -83 -82 -83 -83 -83 -81 -83 -81 -81 -82 -85 -85 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -91 -89 -96 -99 -83 -83 -83 -83 -83 -83 -82 -83 -83 -82 -82 -82 -41 -90 -98 -46 -98 -89 -83 -98 -99 -99 -98 -98 -98 -98 -98 -98 -94 -98 -76 -98 -98 -98 -98 -94 -92 -98 -98 -99 -98 -98 -98 -94 -94 -92 -92 -98 -98 -98 -98 -98 -98 -97 -92 -99 -99 -98 -98 -98 -98 -98 -99 -88 -98 -98 -98 -87 -99 -98 -99 -98 -79 -93 -96 -90 -90 -93 -98 -97 -98 -85 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -82 -59 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -96 -95 -92 -99 -92 -99 -98 -84 -98 -88 -98 -98 -98 -98 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -82 -83 -83 -83 -83 -82 -83 -82 -83 -83 -94 -80 -78 -80 -80 -80 -80 -80 -80 -80 -80 -77 -80 -99 -91 -94 -98 -98 -41 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -92 -99 -96 -93 -94 -92 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -53 -84 -90 -98 -92 -94 -84 -98 -98 -98 -98 -98 -84 -89 -88 -98 -98 -98 -98 -98 -95 -97 -84 -94 -92 -92 -94 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -80 -81 -80 -80 -81 -80 -80 -98 -98 -98 -92 -83 -83 -82 -82 -83 -83 -82 -83 -83 -83 -83 -83 -98 -98 -92 -98 -98 -98 -98 -98 -98 -93 -98 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -41 -44 -98 -99 -98 -98 -98 -87 -97 -87 -88 -88 -91 -91 -98 -98 -98 -78 -93 -90 -92 -98 -93 -90 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -81 -98 -79 -81 -94 -92 -81 -81 -81 -81 -81 -80 -80 -80 -80 -81 -81 -80 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -99 -98 -98 -98 -99 -92 -98 -99 -98 -99 -98 -98 -98 -99 -88 -89 -98 -99 -97 -98 -98 -98 -98 -78 -93 -95 -92 -98 -99 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -80 -81 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -93 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -84 -84 -84 -84 -83 -84 -81 -82 -83 -84 -84 -84 -61 -82 -83 -84 -83 -83 -84 -83 -84 -84 -83 -83 -84 -82 -83 -82 -84 -84 -84 -84 -84 -84 -84 -83 -84 -63 -98 -81 -81 -81 -81 -80 -80 -80 -80 -81 -80 -81 -79 -98 -83 -78 -83 -83 -83 -84 -83 -84 -84 -84 -84 -83 -41 -40 -98 -96 -98 -98 -99 -99 -98 -88 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -83 -73 -84 -98 -93 -88 -84 -84 -83 -84 -84 -84 -83 -84 -84 -84 -84 -67 -93 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -56 -94 -95 -95 -93 -95 -95 -92 -94 -99 -98 -98 -98 -98 -98 -87 -97 -92 -98 -99 -98 -99 -92 -98 -93 -87 -94 -91 -90 -93 -94 -95 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -83 -98 -98 -98 -98 -92 -98 -97 -97 -98 -98 -98 -98 -95 -98 -98 -98 -90 -98 -98 -98 -98 -97 -97 -93 -98 -98 -99 -98 -99 -98 -94 -92 -84 -84 -83 -84 -84 -83 -84 -84 -84 -84 -84 -80 -83 -84 -84 -84 -84 -83 -84 -83 -84 -83 -84 -84 -57 -58 -83 -83 -84 -84 -84 -84 -83 -83 -82 -82 -83 -82 -92 -83 -84 -84 -83 -84 -83 -83 -82 -84 -83 -84 -84 -41 -84 -84 -84 -82 -83 -83 -84 -83 -84 -83 -83 -84 -87 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -63 -93 -85 -96 -96 -98 -94 -98 -99 -98 -98 -98 -92 -98 -99 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -63 -92 -87 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -69 -98 -84 -97 -98 -98 -99 -93 -98 -99 -92 -99 -98 -98 -98 -88 -89 -98 -97 -98 -98 -97 -98 -97 -98 -84 -94 -92 -90 -98 -98 -98 -98 -98 -98 -97 -99 -98 -84 -98 -98 -98 -98 -97 -93 -98 -84 -91 -84 -97 -97 -84 -97 -98 -97 -94 -99 -98 -84 -98 -92 -98 -98 -97 -90 -97 -97 -97 -98 -98 -98 -98 -97 -99 -99 -97 -97 -84 -84 -84 -83 -84 -83 -84 -83 -84 -83 -84 -83 -83 -82 -81 -82 -85 -79 -79 -79 -80 -80 -78 -80 -81 -80 -80 -81 -80 -87 -91 -98 -98 -99 -98 -41 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -98 -97 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -99 -98 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -92 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -81 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -48 -90 -92 -92 -76 -93 -83 -83 -81 -81 -83 -83 -83 -83 -84 -84 -83 -83 -97 -69 -98 -90 -92 -91 -97 -96 -81 -93 -95 -97 -97 -98 -86 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -98 -96 -98 -98 -98 -98 -98 -98 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -51 -80 -80 -81 -81 -80 -81 -81 -81 -80 -80 -81 -81 -92 -80 -99 -92 -99 -93 -98 -98 -98 -99 -98 -98 -97 -83 -86 -87 -89 -89 -88 -98 -98 -98 -98 -76 -94 -92 -92 -98 -99 -99 -80 -99 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -85 -73 -89 -87 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -87 -98 -80 -80 -80 -80 -81 -80 -80 -80 -80 -81 -80 -81 -83 -96 -99 -98 -98 -97 -94 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -99 -95 -96 -98 -98 -94 -98 -98 -98 -92 -99 -92 -98 -81 -80 -81 -81 -80 -80 -80 -80 -80 -80 -81 -81 -42 -80 -81 -80 -81 -81 -81 -80 -81 -81 -80 -80 -81 -92 -92 -87 -80 -81 -80 -80 -81 -80 -81 -81 -81 -80 -80 -70 -80 -80 -80 -80 -81 -81 -81 -81 -81 -80 -80 -81 -81 -93 -90 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -47 -87 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -81 -81 -45 -92 -92 -98 -98 -98 -97 -98 -99 -98 -92 -92 -92 -93 -98 -98 -98 -98 -99 -99 -99 -92 -87 -87 -88 -88 -80 -80 -80 -81 -80 -80 -80 -81 -80 -76 -81 -81 -98 -92 -98 -84 -83 -83 -82 -83 -84 -81 -82 -82 -83 -83 -83 -94 -97 -92 -92 -99 -98 -98 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -82 -82 -99 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -97 -99 -99 -98 -89 -98 -99 -98 -98 -92 -98 -87 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -76 -83 -83 -83 -83 -83 -76 -83 -83 -83 -83 -83 -83 -82 -83 -84 -83 -83 -94 -94 -98 -80 -80 -80 -81 -80 -80 -79 -80 -80 -79 -79 -81 -92 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -80 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -92 -80 -80 -80 -81 -80 -80 -79 -80 -80 -80 -79 -79 -41 -81 -81 -79 -78 -81 -79 -77 -81 -80 -80 -81 -81 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -81 -83 -83 -83 -80 -83 -82 -82 -83 -57 -93 -98 -96 -84 -82 -90 -83 -82 -82 -83 -82 -83 -83 -83 -82 -83 -83 -82 -41 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -41 -98 -98 -98 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -79 -98 -99 -82 -83 -82 -82 -83 -83 -83 -82 -82 -82 -83 -83 -97 -83 -82 -82 -82 -80 -82 -83 -83 -83 -83 -82 -82 -77 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -84 -83 -84 -83 -83 -83 -99 -84 -95 -89 -84 -84 -82 -83 -84 -84 -84 -83 -83 -84 -83 -62 -97 -99 -98 -99 -98 -95 -92 -92 -82 -93 -98 -89 -98 -98 -98 -95 -98 -92 -98 -98 -98 -98 -98 -99 -97 -98 -83 -83 -84 -83 -83 -83 -56 -83 -83 -83 -83 -83 -83 -94 -93 -88 -91 -89 -88 -89 -99 -98 -98 -99 -93 -80 -91 -92 -83 -83 -83 -83 -81 -83 -98 -98 -98 -80 -80 -81 -81 -80 -81 -92 -98 -81 -81 -81 -81 -81 -80 -80 -99 -81 -98 -98 -98 -98 -98 -88 -81 -81 -81 -80 -81 -81 -98 -84 -84 -85 -84 -82 -82 -98 -84 -84 -84 -84 -84 -84 -98 -99 -99 -98 -98 -99 -99 -92 -92 -92 -84 -84 -84 -84 -84 -83 -95 -99 -99 -98 -98 -98 -98 -98 -91 -99 -99 -98 -97 -99 -98 -99 -98 -85 -98 -96 -98 -98 -98 -98 -91 -98 -80 -94 -94 -91 -92 -83 -83 -83 -83 -83 -82 -84 -83 -83 -84 -84 -83 -75 -98 -98 -98 -98 -93 -98 -83 -98 -83 -83 -84 -83 -83 -83 -92 -92 -93 -92 -99 -95 -81 -80 -81 -80 -80 -81 -98 -81 -81 -81 -81 -81 -81 -93 -98 -98 -95 -99 -98 -98 -98 -81 -81 -80 -81 -81 -81 -98 -98 -93 -93 -94 -88 -88 -93 -83 -92 -93 -93 -93 -93 -92 -84 -81 -81 -81 -81 -81 -63 -98 -98 -89 -89 -89 -90 -95 -94 -90 -87 -81 -80 -80 -80 -80 -80 -87 -86 -86 -87 -82 -82 -75 -82 -82 -83 -80 -87 -94 -91 -93 -94 -86 -94 -90 -98 -86 -98 -84 -81 -81 -80 -81 -98 -98 -81 -93 -81 -81 -80 -81 -81 -80 -81 -80 -81 -81 -81 -80 -47 -81 -81 -83 -85 -80 -81 -81 -83 -83 -84 -84 -84 -83 -83 -92 -63 -81 -80 -81 -81 -81 -81 -81 -81 -81 -80 -80 -80 -90 -92 -93 -84 -98 -84 -84 -84 -81 -84 -84 -88 -84 -84 -84 -84 -84 -67 -98 -84 -84 -83 -83 -83 -83 -98 -98 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -82 -56 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -84 -83 -75 -98 -99 -92 -84 -84 -84 -84 -84 -84 -56 -98 -84 -84 -84 -84 -84 -84 -98 -81 -80 -81 -81 -81 -81 -40 -97 -92 -98 -98 -98 -98 -96 -93 -99 -84 -98 -85 -85 -85 -85 -85 -98 -99 -98 -99 -96 -99 -93 -95 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -95 -98 -80 -80 -95 -97 -92 -93 -81 -81 -81 -81 -81 -72 -95 -92 -95 -92 -92 -98 -97 -97 -94 -97 -98 -90 -98 -97 -91 -97 -95 -98 -95 -89 -92 -92 -92 -94 -91 -98 -98 -98 -98 -88 -92 -88 -88 -98 -98 -98 -96 -98 -81 -81 -81 -80 -81 -79 -83 -83 -83 -84 -82 -84 -90 -96 -83 -83 -77 -83 -83 -83 -80 -81 -81 -81 -81 -77 -93 -54 -92 -92 -91 -98 -98 -96 -98 -96 -95 -99 -86 -98 -98 -98 -98 -87 -83 -83 -83 -83 -83 -83 -83 -83 -78 -83 -83 -83 -99 -89 -91 -83 -83 -83 -83 -83 -73 -99 -84 -83 -84 -83 -84 -84 -83 -83 -84 -84 -84 -84 -81 -81 -80 -80 -80 -81 -98 -98 -88 -84 -84 -84 -84 -82 -83 -44 -84 -84 -84 -83 -84 -84 -98 -81 -81 -81 -81 -81 -81 -91 -90 -82 -83 -83 -83 -83 -82 -82 -81 -82 -83 -82 -81 -81 -88 -98 -78 -80 -80 -81 -80 -81 -87 -92 -95 -98 -82 -82 -83 -82 -83 -82 -98 -80 -80 -80 -79 -80 -80 -90 -80 -80 -98 -77 -91 -80 -80 -81 -80 -80 -80 -95 -96 -80 -80 -80 -81 -81 -80 -80 -81 -80 -80 -80 -80 -91 -82 -80 -81 -80 -81 -81 -81 -84 -84 -84 -84 -84 -85 -85 -83 -84 -84 -84 -84 -84 -98 -92 -81 -81 -81 -81 -81 -81 -50 -91 -92 -98 -94 -87 -88 -98 -98 -98 -98 -86 -98 -95 -98 -99 -98 -99 -99 -98 -81 -96 -98 -91 -80 -80 -80 -81 -81 -81 -98 -83 -83 -83 -83 -83 -82 -75 -83 -83 -83 -82 -83 -83 -89 -84 -85 -99 -98 -85 -83 -82 -83 -83 -83 -83 -95 -95 -98 -80 -80 -80 -80 -80 -80 -84 -88 -88 -97 -97 -81 -99 -99 -98 -96 -98 -98 -98 -98 -97 -95 -98 -98 -97 -97 -97 -98 -98 -87 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -81 -83 -83 -83 -83 -83 -98 -79 -79 -80 -80 -92 -83 -92 -93 -88 -92 -90 -92 -82 -82 -83 -83 -83 -82 -92 -98 -92 -96 -84 -79 -81 -80 -81 -81 -81 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -96 -87 -83 -83 -84 -83 -83 -62 -82 -83 -83 -83 -83 -83 -93 -83 -83 -82 -83 -83 -84 -95 -98 -98 -98 -98 -88 -98 -93 -94 -92 -92 -83 -83 -83 -83 -81 -83 -91 -93 -86 -80 -80 -80 -80 -80 -67 -98 -81 -81 -81 -81 -81 -81 -73 -98 -97 -94 -80 -98 -98 -98 -93 -88 -98 -98 -98 -98 -98 -98 -98 -87 -88 -99 -98 -87 -98 -86 -98 -97 -90 -98 -98 -97 -98 -95 -98 -98 -84 -95 -93 -98 -98 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -55 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -90 -98 -98 -98 -98 -98 -78 -79 -79 -79 -79 -79 -79 -79 -79 -80 -76 -80 -95 -92 -92 -91 -84 -82 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -98 -84 -83 -83 -83 -83 -84 -83 -84 -83 -83 -83 -83 -41 -83 -94 -92 -92 -85 -94 -95 -85 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -92 -92 -93 -98 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -98 -83 -83 -83 -84 -84 -83 -83 -83 -84 -83 -83 -83 -93 -90 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -81 -76 -81 -77 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -68 -93 -92 -93 -81 -81 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -43 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -52 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -98 -98 -82 -83 -83 -82 -83 -83 -82 -82 -83 -83 -83 -83 -70 -83 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -73 -84 -84 -84 -84 -83 -83 -83 -82 -82 -82 -83 -83 -70 -82 -82 -84 -83 -84 -82 -83 -83 -84 -83 -83 -83 -62 -93 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -83 -98 -85 -99 -83 -47 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -45 -57 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -98 -94 -98 -93 -98 -98 -97 -84 -98 -98 -98 -98 -85 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -86 -91 -92 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -84 -84 -83 -83 -62 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -53 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -82 -41 -88 -82 -82 -82 -82 -82 -83 -83 -83 -82 -83 -83 -83 -92 -93 -80 -80 -80 -81 -79 -80 -80 -80 -81 -80 -81 -81 -80 -81 -80 -81 -81 -80 -80 -81 -80 -80 -81 -80 -99 -80 -52 -98 -98 -98 -98 -94 -80 -81 -80 -80 -81 -80 -81 -80 -80 -81 -80 -81 -92 -95 -98 -80 -80 -80 -81 -80 -81 -80 -80 -80 -80 -80 -80 -84 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -80 -57 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -63 -98 -82 -82 -83 -82 -80 -83 -83 -82 -83 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -98 -94 -98 -98 -96 -93 -95 -98 -98 -98 -99 -92 -92 -96 -98 -95 -91 -82 -83 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -82 -82 -83 -82 -83 -83 -83 -82 -83 -83 -83 -82 -40 -82 -82 -82 -82 -83 -82 -82 -82 -82 -83 -82 -82 -98 -86 -83 -83 -82 -82 -83 -82 -82 -83 -83 -83 -83 -82 -96 -89 -89 -89 -88 -99 -98 -98 -98 -94 -98 -92 -92 -96 -83 -82 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -85 -92 -96 -81 -80 -81 -81 -81 -81 -81 -80 -80 -81 -80 -81 -48 -80 -80 -80 -80 -80 -80 -81 -80 -81 -80 -80 -81 -40 -93 -98 -98 -80 -80 -80 -80 -80 -80 -78 -80 -79 -80 -80 -80 -65 -95 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -85 -67 -87 -93 -99 -99 -98 -98 -98 -99 -95 -97 -93 -98 -98 -89 -99 -90 -80 -79 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -80 -80 -81 -80 -80 -81 -81 -80 -81 -81 -80 -81 -88 -81 -92 -92 -92 -95 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -95 -92 -92 -92 -93 -92 -98 -98 -83 -83 -83 -82 -82 -82 -83 -83 -83 -83 -83 -83 -54 -83 -83 -81 -83 -83 -83 -82 -83 -82 -83 -83 -83 -86 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -65 -87 -89 -86 -86 -81 -81 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -84 -93 -97 -98 -96 -94 -98 -99 -94 -98 -98 -98 -98 -94 -90 -98 -99 -92 -84 -99 -83 -97 -91 -88 -84 -85 -99 -82 -83 -83 -83 -82 -83 -83 -82 -82 -82 -82 -82 -83 -83 -82 -80 -83 -83 -83 -83 -83 -83 -82 -82 -83 -41 -92 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -48 -93 -92 -92 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -47 -94 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -85 -83 -83 -83 -83 -82 -83 -82 -83 -83 -83 -81 -69 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -75 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -56 -89 -59 -98 -98 -99 -83 -83 -83 -81 -80 -81 -81 -81 -81 -81 -82 -81 -85 -85 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -92 -92 -92 -92 -93 -92 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -83 -93 -93 -88 -97 -94 -87 -83 -94 -93 -85 -98 -75 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -66 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -93 -99 -93 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -80 -81 -79 -80 -80 -80 -80 -80 -80 -81 -80 -79 -41 -93 -90 -88 -94 -95 -85 -97 -97 -98 -98 -85 -93 -87 -98 -99 -98 -90 -95 -93 -99 -99 -80 -93 -96 -88 -92 -97 -98 -99 -98 -98 -99 -98 -98 -93 -98 -97 -92 -90 -98 -98 -99 -98 -97 -98 -98 -98 -99 -98 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -59 -92 -80 -80 -80 -80 -81 -81 -80 -81 -80 -80 -80 -81 -41 -88 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -80 -80 -88 -89 -87 -76 -84 -84 -83 -83 -84 -83 -83 -83 -83 -83 -83 -47 -87 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -85 -80 -80 -92 -80 -91 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -93 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -85 -79 -83 -83 -83 -83 -82 -82 -83 -83 -82 -83 -82 -83 -98 -83 -80 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -54 -98 -82 -83 -82 -83 -83 -77 -82 -82 -82 -82 -82 -83 -87 -82 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -70 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -67 -97 -98 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -82 -85 -41 -98 -98 -95 -94 -98 -93 -92 -95 -98 -98 -82 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -41 -83 -83 -83 -83 -83 -82 -83 -83 -83 -82 -82 -82 -98 -93 -82 -98 -82 -80 -81 -82 -80 -81 -83 -81 -83 -83 -83 -77 -93 -82 -82 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -79 -95 -94 -99 -98 -86 -98 -98 -95 -83 -82 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -65 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -80 -96 -93 -91 -93 -93 -97 -98 -97 -99 -98 -98 -98 -98 -99 -98 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -84 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -66 -83 -76 -80 -82 -81 -83 -83 -83 -83 -83 -83 -83 -77 -97 -83 -83 -83 -83 -83 -83 -82 -83 -82 -83 -83 -83 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -76 -82 -83 -82 -82 -82 -82 -81 -81 -82 -81 -82 -82 -83 -83 -82 -82 -76 -82 -82 -82 -82 -83 -83 -82 -50 -99 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -94 -93 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -83 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -44 -82 -82 -82 -82 -83 -82 -82 -82 -83 -82 -82 -83 -41 -83 -83 -82 -80 -81 -83 -83 -83 -83 -83 -83 -83 -89 -83 -83 -83 -83 -82 -83 -81 -83 -81 -83 -83 -66 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -84 -88 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -47 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -84 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -96 -87 -93 -98 -98 -98 -98 -98 -84 -84 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -82 -98 -99 -83 -83 -83 -83 -83 -83 -83 -82 -81 -81 -82 -82 -58 -84 -81 -80 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -98 -79 -99 -80 -92 -80 -81 -80 -80 -80 -80 -80 -80 -81 -80 -81 -81 -80 -80 -81 -79 -81 -80 -81 -81 -80 -81 -81 -80 -98 -98 -98 -84 -84 -85 -84 -84 -84 -83 -84 -83 -84 -84 -84 -61 -90 -92 -89 -89 -88 -88 -92 -92 -94 -93 -93 -85 -92 -92 -94 -93 -92 -92 -93 -93 -93 -92 -93 -93 -85 -93 -93 -93 -78 -84 -93 -90 -91 -91 -91 -91 -91 -90 -91 -88 -91 -91 -92 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -92 -41 -83 -82 -82 -82 -81 -81 -82 -82 -83 -82 -82 -82 -92 -94 -93 -98 -83 -83 -83 -83 -84 -84 -83 -84 -84 -81 -79 -80 -81 -80 -81 -88 -88 -86 -89 -88 -89 -82 -82 -82 -82 -83 -82 -83 -83 -83 -78 -82 -83 -98 -98 -97 -98 -84 -83 -82 -82 -83 -83 -83 -80 -82 -82 -83 -82 -83 -83 -92 -95 -98 -98 -82 -82 -83 -98 -94 -84 -94 -95 -98 -83 -98 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -81 -85 -95 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -83 -83 -82 -82 -83 -77 -82 -82 -83 -82 -82 -82 -99 -92 -94 -92 -93 -41 -80 -80 -81 -80 -80 -80 -81 -80 -80 -80 -80 -81 -81 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -56 -92 -80 -81 -81 -80 -80 -80 -81 -81 -81 -81 -81 -80 -94 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -85 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -41 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -80 -80 -87 -88 -88 -89 -77 -83 -82 -83 -84 -84 -84 -84 -84 -84 -84 -84 -98 -98 -41 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -81 -81 -79 -72 -85 -81 -89 -81 -81 -81 -81 -80 -80 -80 -81 -80 -80 -81 -81 -81 -51 -95 -80 -80 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -95 -98 -83 -84 -83 -84 -84 -84 -84 -83 -83 -83 -84 -84 -94 -83 -83 -83 -77 -83 -82 -83 -81 -83 -83 -83 -84 -93 -98 -83 -83 -83 -78 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -41 -93 -98 -98 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -84 -93 -83 -81 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -65 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -96 -81 -80 -80 -81 -80 -80 -79 -80 -80 -81 -81 -81 -80 -80 -81 -81 -80 -80 -80 -79 -81 -81 -80 -80 -60 -80 -79 -80 -81 -80 -80 -80 -81 -80 -81 -81 -80 -74 -85 -99 -83 -83 -83 -83 -83 -84 -83 -83 -81 -84 -84 -84 -67 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -99 -98 -83 -83 -83 -81 -82 -82 -81 -83 -83 -83 -83 -83 -83 -41 -95 -89 -94 -98 -83 -83 -83 -83 -83 -83 -83 -82 -82 -81 -83 -83 -99 -83 -83 -84 -84 -84 -83 -83 -83 -83 -83 -83 -84 -41 -99 -98 -92 -99 -97 -98 -98 -98 -98 -97 -88 -89 -98 -98 -99 -98 -99 -99 -96 -98 -92 -94 -93 -93 -93 -93 -94 -93 -93 -98 -82 -81 -82 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -94 -94 -93 -91 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -93 -77 -89 -97 -80 -85 -82 -83 -83 -83 -83 -83 -83 -82 -83 -82 -83 -93 -92 -92 -94 -98 -41 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -79 -80 -80 -98 -97 -82 -89 -83 -91 -96 -83 -83 -82 -83 -83 -83 -82 -83 -83 -83 -83 -83 -87 -82 -83 -83 -83 -83 -83 -83 -82 -83 -83 -82 -83 -80 -81 -81 -83 -82 -82 -83 -82 -82 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -63 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -82 -83 -82 -83 -83 -82 -83 -96 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -83 -83 -82 -82 -82 -83 -83 -52 -83 -83 -83 -82 -83 -82 -83 -82 -83 -82 -82 -83 -98 -88 -99 -88 -88 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -92 -82 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -84 -82 -83 -83 -83 -82 -82 -82 -82 -82 -82 -82 -83 -94 -91 -91 -91 -90 -92 -92 -90 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -99 -98 -93 -92 -83 -83 -82 -83 -82 -83 -81 -83 -83 -83 -83 -82 -96 -83 -98 -86 -94 -98 -83 -82 -83 -83 -83 -83 -83 -83 -83 -81 -83 -83 -98 -98 -98 -98 -94 -98 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -85 -91 -94 -92 -89 -97 -84 -87 -98 -80 -80 -80 -80 -80 -80 -78 -80 -80 -80 -80 -81 -79 -93 -91 -93 -87 -86 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -90 -93 -83 -82 -82 -82 -83 -81 -83 -83 -83 -82 -83 -82 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -68 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -70 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -82 -83 -76 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -82 -89 -80 -80 -79 -79 -80 -80 -80 -81 -80 -80 -80 -80 -91 -92 -99 -67 -83 -83 -83 -82 -83 -83 -83 -82 -83 -82 -83 -77 -94 -99 -86 -97 -98 -82 -92 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -94 -94 -93 -94 -82 -83 -82 -83 -83 -82 -82 -83 -82 -82 -82 -83 -92 -83 -82 -82 -83 -82 -83 -83 -83 -81 -83 -83 -83 -83 -69 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -82 -83 -41 -93 -87 -88 -98 -98 -98 -88 -98 -98 -98 -98 -92 -94 -83 -81 -83 -82 -83 -82 -83 -83 -83 -83 -80 -83 -83 -95 -95 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -80 -80 -80 -80 -80 -80 -78 -80 -80 -80 -81 -80 -41 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -85 -82 -83 -83 -81 -82 -84 -84 -84 -82 -83 -83 -83 -93 -92 -99 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -98 -80 -81 -81 -80 -96 -96 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -83 -83 -82 -81 -82 -83 -83 -84 -83 -83 -83 -81 -98 -92 -80 -98 -86 -89 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -56 -83 -83 -83 -83 -83 -83 -82 -83 -83 -82 -82 -83 -83 -83 -83 -81 -83 -82 -82 -83 -82 -82 -83 -83 -76 -92 -93 -93 -92 -94 -93 -98 -94 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -90 -90 -79 -81 -79 -80 -80 -81 -80 -80 -80 -80 -80 -80 -73 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -85 -84 -83 -84 -84 -84 -84 -84 -84 -83 -83 -82 -83 -98 -82 -82 -82 -83 -83 -83 -82 -82 -83 -82 -83 -83 -41 -82 -82 -82 -82 -83 -81 -83 -82 -83 -81 -82 -83 -45 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -89 -92 -92 -89 -90 -86 -80 -93 -94 -83 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -81 -41 -88 -80 -80 -80 -80 -80 -80 -80 -79 -81 -80 -80 -70 -80 -80 -80 -80 -81 -80 -80 -81 -80 -80 -80 -80 -98 -84 -83 -84 -84 -84 -84 -84 -84 -82 -83 -83 -83 -41 -90 -83 -83 -83 -82 -82 -82 -81 -83 -81 -82 -82 -83 -87 -81 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -95 -90 -92 -93 -92 -88 -91 -91 -83 -81 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -80 -58 -80 -81 -80 -80 -80 -81 -80 -80 -81 -80 -80 -80 -81 -80 -80 -80 -81 -80 -80 -80 -80 -81 -81 -81 -50 -81 -80 -80 -81 -81 -79 -81 -81 -81 -81 -81 -80 -92 -81 -81 -81 -81 -81 -80 -81 -80 -81 -81 -80 -80 -41 -94 -81 -81 -80 -80 -80 -80 -80 -80 -81 -84 -84 -80 -80 -80 -87 -96 -85 -81 -80 -98 -84 -87 -81 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -98 -81 -80 -80 -81 -81 -80 -80 -81 -80 -81 -80 -81 -98 -82 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -82 -94 -82 -83 -83 -83 -83 -83 -83 -83 -82 -81 -83 -84 -82 -82 -83 -82 -83 -81 -84 -84 -83 -83 -82 -83 -41 -83 -81 -83 -83 -83 -83 -83 -84 -84 -84 -83 -83 -87 -84 -83 -83 -83 -84 -84 -84 -84 -84 -84 -84 -83 -41 -90 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -88 -98 -98 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -82 -84 -82 -83 -84 -84 -84 -88 -93 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -80 -40 -81 -81 -81 -81 -81 -80 -80 -81 -80 -81 -80 -81 -99 -79 -80 -80 -80 -81 -81 -80 -80 -81 -80 -81 -80 -95 -93 -98 -84 -82 -83 -84 -84 -84 -84 -82 -84 -84 -84 -84 -97 -95 -85 -94 -89 -95 -84 -84 -84 -84 -84 -84 -84 -84 -82 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -82 -85 -81 -80 -80 -80 -80 -80 -81 -80 -79 -81 -80 -81 -86 -96 -99 -84 -84 -83 -84 -83 -84 -84 -83 -84 -83 -83 -84 -41 -98 -83 -84 -84 -84 -84 -82 -83 -83 -83 -84 -84 -83 -80 -80 -76 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -92 -92 -93 -92 -81 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -81 -41 -85 -80 -81 -81 -81 -80 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -80 -80 -81 -81 -80 -80 -81 -81 -81 -41 -94 -94 -98 -80 -81 -81 -81 -81 -81 -81 -80 -80 -79 -80 -80 -98 -98 -87 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -66 -83 -83 -83 -83 -84 -82 -82 -82 -83 -82 -83 -84 -98 -83 -83 -77 -83 -83 -83 -82 -83 -82 -83 -83 -83 -98 -84 -83 -81 -83 -81 -83 -83 -83 -83 -83 -82 -83 -94 -90 -92 -94 -90 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -94 -81 -80 -80 -81 -81 -81 -80 -81 -80 -80 -81 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -81 -80 -46 -92 -99 -98 -98 -98 -98 -99 -98 -98 -89 -98 -98 -94 -98 -98 -98 -98 -98 -98 -77 -94 -91 -94 -93 -94 -93 -92 -93 -92 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -99 -80 -94 -86 -89 -98 -98 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -41 -79 -81 -81 -80 -81 -80 -80 -80 -80 -80 -80 -80 -89 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -87 -87 -82 -82 -82 -82 -81 -82 -81 -82 -77 -83 -82 -82 -91 -80 -80 -98 -80 -79 -81 -98 -92 -80 -99 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -54 -98 -84 -80 -82 -84 -82 -83 -83 -84 -84 -84 -84 -84 -83 -82 -83 -77 -80 -83 -82 -83 -83 -83 -82 -82 -41 -83 -82 -83 -83 -82 -83 -83 -83 -81 -81 -82 -83 -93 -50 -93 -94 -92 -92 -87 -88 -93 -92 -93 -86 -96 -83 -82 -83 -83 -82 -83 -83 -83 -82 -83 -82 -83 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -81 -80 -81 -81 -80 -81 -98 -84 -83 -84 -84 -82 -84 -83 -84 -82 -84 -84 -84 -83 -82 -80 -80 -81 -80 -81 -80 -80 -81 -80 -82 -46 -47 -90 -82 -81 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -98 -98 -98 -94 -88 -92 -96 -81 -98 -97 -80 -82 -98 -98 -98 -91 -98 -93 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -81 -80 -80 -80 -80 -81 -80 -94 -93 -94 -93 -92 -94 -90 -84 -84 -83 -82 -83 -81 -83 -83 -83 -82 -82 -82 -87 -82 -83 -83 -83 -83 -83 -83 -83 -80 -83 -83 -83 -99 -80 -80 -80 -80 -76 -80 -80 -80 -80 -80 -80 -80 -48 -92 -95 -92 -92 -92 -92 -94 -92 -92 -91 -92 -93 -93 -93 -93 -78 -92 -82 -94 -95 -94 -80 -80 -80 -80 -81 -80 -80 -80 -81 -80 -81 -81 -98 -92 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -98 -89 -84 -84 -84 -84 -83 -83 -84 -84 -84 -83 -83 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -41 -84 -83 -83 -83 -83 -83 -82 -83 -83 -83 -81 -82 -41 -98 -83 -82 -77 -80 -82 -81 -82 -83 -83 -83 -83 -83 -56 -83 -83 -83 -83 -81 -83 -81 -83 -83 -83 -83 -83 -75 -87 -88 -84 -83 -80 -83 -83 -83 -84 -83 -83 -83 -83 -81 -83 -83 -41 -96 -82 -83 -83 -82 -83 -83 -81 -82 -81 -83 -83 -83 -95 -97 -80 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -80 -80 -80 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -90 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -41 -92 -98 -98 -98 -99 -98 -99 -98 -98 -94 -98 -97 -98 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -62 -80 -80 -81 -80 -81 -80 -80 -81 -81 -80 -79 -79 -85 -80 -80 -81 -81 -81 -81 -80 -77 -80 -80 -81 -80 -54 -93 -92 -84 -82 -83 -83 -83 -83 -83 -82 -83 -81 -83 -83 -98 -83 -82 -83 -83 -83 -83 -82 -82 -83 -83 -83 -82 -83 -98 -93 -97 -85 -85 -83 -83 -84 -84 -83 -83 -83 -82 -83 -84 -83 -65 -84 -83 -83 -83 -81 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -81 -83 -82 -83 -82 -82 -83 -82 -83 -41 -82 -83 -83 -83 -82 -83 -83 -83 -83 -83 -82 -83 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -76 -80 -94 -92 -92 -93 -94 -92 -94 -98 -98 -98 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -81 -98 -83 -41 -83 -83 -83 -83 -83 -82 -83 -83 -81 -83 -83 -82 -53 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -74 -85 -81 -80 -80 -80 -80 -80 -80 -81 -81 -80 -81 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -79 -85 -86 -94 -87 -83 -83 -83 -83 -83 -82 -82 -82 -83 -83 -83 -70 -91 -83 -83 -83 -83 -83 -82 -82 -82 -83 -83 -83 -83 -92 -93 -96 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -90 -83 -82 -82 -83 -83 -82 -81 -83 -82 -83 -83 -83 -56 -83 -83 -82 -83 -82 -83 -83 -82 -83 -83 -83 -83 -48 -98 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -82 -41 -83 -83 -83 -83 -83 -83 -83 -83 -77 -82 -83 -83 -44 -93 -92 -92 -92 -98 -98 -83 -83 -83 -83 -82 -83 -82 -82 -83 -83 -83 -82 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -95 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -95 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -69 -99 -98 -97 -88 -98 -98 -98 -98 -98 -98 -94 -92 -94 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -82 -80 -80 -80 -80 -80 -80 -80 -80 -76 -80 -80 -81 -91 -94 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -81 -81 -81 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -71 -98 -80 -80 -81 -80 -81 -80 -81 -81 -81 -80 -76 -80 -80 -80 -81 -80 -81 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -92 -96 -98 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -93 -98 -83 -82 -83 -82 -82 -82 -82 -82 -83 -82 -82 -82 -83 -82 -83 -83 -82 -83 -83 -83 -83 -82 -83 -83 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -65 -82 -82 -82 -82 -82 -82 -81 -82 -80 -82 -82 -82 -81 -83 -82 -76 -82 -83 -82 -83 -82 -83 -82 -82 -91 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -84 -95 -81 -80 -80 -81 -80 -80 -80 -80 -80 -80 -81 -80 -55 -92 -95 -80 -80 -81 -80 -80 -80 -80 -81 -76 -80 -80 -81 -98 -98 -98 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -42 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -79 -81 -80 -80 -80 -80 -80 -81 -80 -80 -67 -93 -93 -92 -93 -95 -92 -93 -93 -93 -92 -98 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -82 -82 -83 -82 -82 -82 -82 -83 -83 -83 -54 -78 -83 -82 -82 -82 -82 -82 -82 -83 -82 -83 -82 -82 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -64 -80 -80 -81 -80 -80 -80 -80 -80 -80 -81 -80 -80 -82 -83 -83 -82 -82 -81 -81 -81 -82 -82 -83 -81 -88 -91 -89 -89 -82 -83 -83 -83 -83 -82 -82 -82 -82 -83 -83 -82 -82 -98 -83 -82 -83 -82 -82 -82 -82 -83 -83 -82 -82 -83 -41 -96 -97 -99 -92 -100 -94 -98 -83 -83 -83 -83 -82 -82 -82 -82 -82 -82 -83 -83 -82 -99 -83 -83 -82 -83 -82 -82 -83 -82 -83 -83 -83 -83 -92 -82 -83 -83 -82 -82 -82 -82 -82 -83 -83 -83 -82 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -90 -80 -80 -80 -81 -81 -81 -81 -81 -79 -81 -80 -81 -91 -91 -92 -91 -91 -91 -93 -93 -84 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -46 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -82 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -72 -83 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -98 -98 -83 -83 -83 -83 -83 -82 -80 -81 -80 -81 -80 -80 -81 -81 -93 -93 -41 -83 -83 -83 -83 -83 -82 -82 -82 -82 -83 -83 -83 -98 -89 -83 -84 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -97 -97 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -84 -83 -83 -84 -83 -84 -83 -84 -83 -83 -84 -83 -84 -84 -83 -84 -84 -84 -83 -62 -45 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -84 -83 -77 -83 -54 -54 -93 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -98 -98 -98 -93 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -80 -80 -81 -81 -80 -80 -80 -80 -80 -80 -41 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -94 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -92 -82 -83 -81 -82 -81 -81 -82 -83 -83 -78 -84 -84 -40 -93 -93 -81 -80 -80 -81 -81 -80 -80 -81 -80 -80 -80 -80 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -98 -100 -98 -96 -94 -92 -98 -90 -98 -98 -98 -98 -98 -98 -81 -80 -81 -81 -81 -81 -81 -81 -81 -80 -80 -81 -78 -81 -80 -81 -81 -81 -81 -81 -80 -81 -81 -81 -80 -84 -80 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -73 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -63 -81 -81 -77 -81 -81 -81 -81 -81 -81 -81 -81 -81 -68 -92 -70 -92 -92 -92 -98 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -98 -99 -98 -80 -81 -81 -81 -81 -81 -81 -81 -80 -80 -81 -81 -84 -81 -80 -80 -81 -81 -81 -81 -80 -81 -81 -81 -81 -98 -98 -92 -98 -95 -98 -94 -98 -92 -89 -90 -96 -85 -57 -98 -81 -76 -80 -81 -81 -81 -81 -81 -80 -81 -81 -81 -77 -93 -81 -81 -80 -80 -81 -81 -80 -80 -81 -80 -81 -83 -78 -83 -83 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -90 -83 -89 -99 -86 -80 -81 -81 -81 -81 -80 -80 -81 -81 -80 -81 -85 -97 -93 -83 -84 -84 -84 -84 -83 -83 -83 -83 -82 -83 -84 -98 -83 -83 -83 -83 -83 -83 -79 -83 -83 -83 -82 -82 -58 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -95 -80 -80 -77 -81 -80 -80 -80 -80 -80 -80 -80 -80 -98 -93 -92 -92 -83 -83 -83 -83 -93 -98 -98 -84 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -99 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -41 -81 -81 -80 -81 -80 -81 -81 -81 -81 -80 -80 -81 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -58 -80 -80 -77 -80 -80 -80 -80 -81 -80 -80 -80 -80 -61 -92 -92 -92 -83 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -83 -94 -95 -83 -90 -90 -83 -98 -87 -83 -83 -83 -83 -78 -83 -83 -82 -83 -83 -83 -83 -40 -92 -83 -83 -83 -83 -82 -83 -83 -83 -83 -84 -84 -84 -62 -84 -84 -83 -84 -83 -83 -83 -84 -83 -83 -83 -84 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -98 -81 -81 -79 -80 -81 -81 -80 -81 -81 -81 -81 -81 -78 -83 -83 -83 -83 -83 -83 -83 -84 -84 -83 -83 -84 -93 -92 -84 -89 -98 -83 -83 -84 -84 -84 -83 -84 -83 -83 -84 -84 -83 -98 -98 -84 -84 -84 -83 -83 -83 -82 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -84 -83 -81 -82 -82 -83 -82 -83 -40 -98 -98 -98 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -81 -81 -81 -81 -81 -80 -81 -81 -81 -56 -98 -84 -84 -83 -83 -83 -82 -83 -74 -83 -82 -83 -82 -82 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -42 -81 -98 -81 -87 -80 -81 -81 -81 -80 -80 -80 -81 -81 -80 -81 -81 -55 -80 -80 -81 -80 -81 -80 -81 -81 -81 -81 -81 -80 -93 -83 -83 -83 -84 -84 -83 -83 -83 -84 -84 -83 -83 -98 -98 -41 -80 -80 -80 -80 -81 -81 -80 -81 -81 -80 -81 -81 -91 -81 -80 -81 -80 -80 -80 -81 -80 -80 -81 -81 -83 -98 -83 -84 -79 -83 -83 -83 -82 -82 -83 -83 -82 -83 -89 -92 -92 -99 -83 -82 -83 -83 -83 -83 -83 -82 -82 -83 -83 -83 -87 -95 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -84 -84 -84 -46 -83 -84 -84 -83 -83 -83 -83 -84 -84 -84 -84 -84 -99 -84 -83 -83 -83 -83 -83 -83 -83 -83 -81 -81 -81 -84 -81 -81 -82 -83 -83 -83 -79 -83 -83 -83 -83 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -41 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -94 -98 -80 -98 -96 -81 -90 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -99 -84 -84 -84 -84 -84 -84 -83 -84 -84 -83 -83 -84 -83 -82 -83 -82 -87 -98 -98 -98 -99 -98 -91 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -78 -87 -92 -84 -84 -84 -83 -84 -84 -84 -84 -83 -83 -83 -83 -98 -84 -98 -98 -94 -94 -93 -98 -99 -98 -96 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -86 -41 -82 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -93 -93 -96 -84 -80 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -67 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -86 -83 -82 -82 -82 -82 -82 -82 -83 -82 -82 -79 -82 -41 -83 -83 -84 -84 -83 -84 -84 -84 -83 -84 -84 -84 -48 -84 -83 -83 -83 -83 -83 -84 -83 -84 -84 -84 -84 -99 -83 -98 -99 -87 -98 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -84 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -41 -80 -81 -81 -81 -81 -81 -80 -81 -81 -77 -81 -81 -62 -93 -93 -92 -93 -92 -93 -84 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -95 -98 -98 -95 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -97 -52 -83 -83 -83 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -88 -98 -80 -80 -80 -81 -81 -81 -81 -81 -80 -80 -81 -81 -98 -98 -98 -83 -83 -83 -83 -83 -84 -83 -83 -83 -82 -83 -83 -52 -84 -84 -83 -84 -84 -78 -83 -83 -83 -84 -84 -84 -98 -81 -81 -80 -81 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -89 -46 -92 -95 -93 -81 -80 -81 -81 -81 -80 -80 -80 -80 -81 -81 -81 -95 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -41 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -90 -46 -81 -80 -81 -81 -81 -81 -81 -81 -78 -81 -80 -81 -98 -81 -81 -81 -81 -81 -81 -81 -82 -81 -82 -81 -81 -58 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -96 -80 -81 -81 -81 -79 -81 -81 -81 -81 -80 -81 -81 -91 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -96 -99 -81 -81 -81 -81 -81 -81 -82 -82 -82 -81 -81 -82 -41 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -80 -86 -84 -81 -82 -81 -80 -81 -82 -82 -82 -82 -81 -89 -79 -86 -86 -84 -82 -82 -81 -82 -86 -82 -80 -85 -84 -85 -80 -84 -85 -84 -85 -84 -85 -85 -85 -88 -89 -87 -89 -90 -94 -97 -93 -98 -98 -98 -55 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -99 -84 -84 -84 -84 -84 -81 -83 -84 -83 -83 -83 -84 -41 -84 -84 -84 -84 -82 -83 -81 -83 -83 -84 -83 -84 -92 -92 -92 -92 -92 -92 -93 -88 -93 -84 -93 -92 -93 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -89 -87 -92 -84 -92 -92 -92 -92 -90 -98 -90 -91 -80 -81 -81 -81 -81 -81 -81 -79 -81 -81 -81 -81 -94 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -92 -93 -92 -95 -81 -81 -81 -81 -81 -81 -81 -82 -81 -79 -80 -80 -80 -80 -81 -81 -81 -81 -77 -81 -81 -81 -81 -81 -58 -92 -94 -96 -83 -83 -84 -83 -83 -84 -83 -84 -84 -84 -84 -84 -95 -81 -98 -84 -89 -96 -98 -60 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -87 -93 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -50 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -85 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -60 -81 -81 -78 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -92 -92 -92 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -82 -91 -80 -80 -81 -80 -80 -81 -81 -81 -80 -80 -80 -74 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -95 -95 -94 -93 -98 -98 -99 -98 -98 -98 -98 -99 -98 -98 -98 -95 -91 -91 -98 -91 -93 -95 -95 -95 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -78 -41 -93 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -85 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -74 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -63 -84 -84 -84 -84 -84 -84 -84 -83 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -84 -84 -84 -84 -84 -84 -82 -84 -84 -84 -84 -84 -41 -99 -84 -78 -84 -84 -83 -84 -84 -83 -84 -84 -84 -84 -94 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -80 -81 -80 -81 -81 -80 -80 -80 -81 -81 -81 -80 -81 -98 -84 -81 -81 -81 -81 -81 -98 -98 -81 -81 -80 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -80 -80 -80 -81 -80 -80 -81 -41 -99 -98 -77 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -89 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -71 -93 -89 -81 -92 -98 -98 -81 -81 -81 -81 -80 -81 -81 -81 -80 -81 -81 -81 -93 -98 -94 -94 -93 -93 -98 -98 -98 -98 -92 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -87 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -42 -80 -81 -80 -80 -81 -80 -78 -81 -81 -80 -80 -81 -94 -92 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -98 -94 -98 -80 -98 -41 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -92 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -84 -86 -85 -84 -84 -84 -84 -84 -84 -85 -84 -84 -84 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -77 -94 -98 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -88 -84 -84 -84 -84 -84 -84 -84 -81 -84 -84 -84 -84 -92 -90 -80 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -60 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -86 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -96 -81 -80 -80 -80 -80 -80 -81 -80 -81 -81 -81 -81 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -80 -80 -80 -81 -80 -80 -81 -81 -80 -81 -80 -81 -98 -98 -79 -91 -95 -93 -92 -91 -91 -98 -94 -97 -89 -98 -93 -87 -98 -98 -98 -74 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -73 -81 -93 -98 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -63 -84 -84 -84 -84 -84 -84 -83 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -64 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -81 -98 -98 -85 -83 -84 -84 -83 -83 -84 -82 -83 -82 -84 -84 -84 -98 -81 -84 -82 -83 -84 -84 -84 -84 -84 -81 -84 -84 -41 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -93 -86 -98 -95 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -95 -96 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -48 -58 -94 -93 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -84 -97 -93 -80 -80 -81 -80 -80 -81 -81 -80 -80 -80 -80 -81 -80 -97 -84 -53 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -93 -87 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -60 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -93 -84 -84 -84 -84 -84 -84 -84 -83 -83 -83 -83 -84 -41 -92 -84 -84 -84 -78 -84 -84 -84 -84 -84 -84 -84 -84 -98 -70 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -96 -84 -85 -98 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -94 -84 -84 -84 -82 -84 -84 -84 -84 -84 -84 -84 -87 -94 -94 -94 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -81 -81 -81 -80 -81 -80 -81 -80 -81 -81 -81 -81 -98 -81 -81 -80 -81 -79 -81 -81 -81 -82 -80 -81 -81 -41 -93 -93 -55 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -94 -81 -80 -80 -81 -81 -80 -81 -81 -80 -81 -81 -81 -98 -89 -84 -84 -84 -84 -84 -84 -85 -84 -84 -84 -84 -85 -99 -84 -84 -84 -84 -83 -84 -84 -83 -83 -84 -84 -84 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -90 -80 -80 -80 -80 -80 -80 -80 -77 -80 -81 -81 -81 -93 -93 -98 -84 -84 -84 -84 -85 -84 -85 -85 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -80 -81 -81 -80 -81 -80 -81 -79 -80 -81 -80 -80 -80 -41 -81 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -71 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -87 -84 -84 -84 -82 -82 -84 -83 -84 -84 -83 -84 -70 -80 -78 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -93 -93 -93 -95 -93 -93 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -97 -51 -94 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -81 -80 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -92 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -99 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -86 -97 -88 -94 -89 -90 -89 -89 -89 -89 -98 -99 -98 -98 -93 -93 -90 -98 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -99 -81 -80 -84 -83 -98 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -51 -98 -84 -84 -82 -81 -83 -84 -84 -84 -84 -84 -84 -83 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -92 -92 -94 -94 -95 -98 -98 -67 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -77 -80 -99 -96 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -80 -80 -44 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -94 -83 -83 -83 -82 -84 -84 -83 -84 -84 -84 -82 -83 -93 -90 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -84 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -84 -81 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -92 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -83 -84 -83 -84 -83 -84 -84 -84 -84 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -71 -81 -81 -80 -80 -80 -80 -81 -81 -80 -80 -81 -80 -76 -92 -93 -92 -92 -92 -92 -88 -92 -94 -97 -92 -93 -92 -92 -92 -92 -92 -94 -66 -92 -92 -92 -87 -90 -92 -96 -87 -97 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -94 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -79 -80 -79 -80 -80 -80 -80 -80 -93 -83 -84 -84 -83 -83 -84 -83 -83 -81 -83 -82 -82 -89 -95 -88 -92 -92 -89 -88 -90 -79 -93 -85 -85 -86 -86 -86 -87 -78 -87 -86 -86 -94 -88 -87 -86 -86 -86 -87 -92 -82 -95 -98 -80 -80 -98 -96 -80 -97 -95 -82 -87 -80 -94 -96 -98 -97 -98 -98 -98 -92 -99 -80 -95 -97 -96 -87 -98 -83 -82 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -41 -80 -81 -83 -82 -83 -83 -83 -83 -83 -83 -83 -84 -56 -83 -83 -82 -83 -83 -81 -83 -83 -83 -83 -83 -83 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -77 -80 -80 -93 -91 -92 -93 -92 -93 -92 -99 -99 -46 -83 -83 -83 -81 -83 -82 -83 -83 -83 -83 -83 -84 -98 -98 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -89 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -96 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -84 -84 -83 -83 -83 -83 -83 -82 -82 -83 -83 -84 -83 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -83 -83 -83 -98 -89 -90 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -62 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -82 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -78 -94 -92 -93 -92 -98 -98 -99 -82 -93 -91 -91 -92 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -98 -98 -99 -94 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -89 -80 -80 -80 -80 -80 -80 -80 -80 -77 -81 -80 -80 -83 -83 -83 -83 -83 -84 -83 -83 -84 -83 -84 -83 -48 -98 -98 -98 -99 -98 -97 -88 -82 -83 -98 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -47 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -80 -80 -80 -80 -80 -78 -80 -80 -80 -80 -80 -81 -94 -98 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -87 -92 -92 -92 -92 -92 -94 -91 -92 -97 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -93 -94 -93 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -53 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -87 -84 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -79 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -61 -92 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -83 -84 -83 -83 -84 -83 -83 -41 -84 -83 -84 -84 -83 -82 -83 -83 -84 -83 -83 -83 -99 -84 -84 -82 -83 -83 -83 -83 -83 -83 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -78 -86 -84 -83 -83 -83 -83 -82 -83 -84 -83 -84 -84 -62 -84 -84 -84 -78 -83 -84 -84 -84 -84 -84 -84 -84 -61 -92 -92 -92 -84 -84 -82 -83 -80 -80 -97 -98 -98 -94 -98 -98 -98 -98 -98 -98 -94 -98 -99 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -84 -84 -84 -83 -83 -84 -84 -84 -84 -84 -84 -84 -98 -83 -83 -81 -83 -83 -82 -82 -83 -83 -82 -83 -83 -90 -86 -80 -77 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -93 -71 -83 -83 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -98 -80 -80 -98 -80 -93 -97 -98 -99 -48 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -95 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -84 -84 -83 -82 -84 -84 -84 -84 -84 -84 -84 -84 -40 -84 -83 -83 -84 -84 -83 -84 -84 -84 -84 -84 -84 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -91 -91 -90 -92 -91 -91 -91 -91 -86 -84 -83 -83 -83 -84 -83 -84 -84 -84 -83 -83 -83 -88 -98 -84 -83 -83 -83 -84 -83 -83 -83 -83 -82 -78 -82 -52 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -84 -82 -82 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -87 -98 -97 -98 -92 -98 -70 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -40 -89 -84 -84 -84 -78 -83 -83 -84 -84 -84 -83 -84 -84 -92 -91 -98 -94 -98 -80 -54 -83 -82 -82 -83 -82 -83 -83 -83 -82 -83 -82 -83 -88 -83 -98 -99 -98 -91 -98 -92 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -83 -82 -82 -40 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -95 -98 -79 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -99 -84 -85 -98 -98 -80 -80 -80 -79 -79 -80 -80 -81 -81 -81 -81 -81 -81 -92 -91 -92 -91 -85 -87 -91 -94 -94 -92 -93 -93 -87 -93 -93 -98 -98 -95 -77 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -90 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -85 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -98 -98 -98 -89 -84 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -83 -89 -83 -83 -83 -83 -82 -83 -83 -82 -83 -82 -82 -83 -90 -89 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -94 -92 -92 -93 -99 -97 -99 -98 -89 -93 -98 -99 -98 -98 -98 -98 -84 -96 -90 -83 -98 -53 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -84 -83 -84 -84 -83 -84 -84 -84 -83 -83 -84 -84 -83 -83 -40 -98 -98 -84 -84 -82 -84 -84 -83 -83 -83 -83 -83 -84 -83 -83 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -93 -92 -92 -93 -93 -93 -92 -95 -94 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -84 -84 -84 -96 -94 -84 -83 -83 -83 -84 -84 -84 -83 -83 -83 -83 -83 -84 -83 -83 -84 -83 -83 -83 -84 -83 -84 -84 -83 -41 -98 -83 -83 -84 -83 -84 -84 -84 -83 -84 -83 -84 -83 -98 -83 -84 -83 -83 -83 -83 -84 -83 -83 -84 -82 -82 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -98 -92 -98 -98 -84 -84 -83 -84 -78 -83 -83 -84 -83 -83 -83 -83 -49 -93 -98 -98 -84 -84 -83 -85 -98 -83 -84 -84 -83 -84 -83 -84 -83 -84 -82 -83 -83 -40 -87 -83 -83 -83 -83 -84 -84 -84 -84 -84 -83 -83 -67 -98 -84 -83 -84 -83 -84 -84 -83 -84 -83 -84 -83 -84 -41 -83 -84 -84 -83 -83 -83 -83 -83 -84 -84 -83 -84 -57 -84 -84 -82 -83 -83 -83 -80 -84 -84 -84 -84 -84 -84 -84 -84 -84 -81 -84 -84 -83 -83 -83 -84 -84 -41 -93 -93 -93 -93 -93 -93 -93 -93 -93 -84 -84 -83 -84 -83 -84 -83 -84 -83 -84 -83 -84 -93 -97 -97 -97 -84 -84 -84 -84 -84 -83 -84 -84 -83 -83 -83 -83 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -96 -84 -84 -84 -83 -84 -83 -84 -83 -84 -83 -83 -83 -98 -80 -81 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -79 -93 -91 -93 -98 -98 -94 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -58 -65 -94 -89 -93 -96 -83 -99 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -97 -98 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -85 -81 -81 -81 -81 -80 -81 -80 -81 -81 -81 -81 -80 -71 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -81 -81 -98 -92 -93 -98 -98 -98 -80 -93 -93 -93 -92 -93 -92 -93 -93 -93 -93 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -80 -98 -97 -98 -98 -94 -94 -94 -98 -98 -98 -92 -95 -98 -90 -90 -89 -92 -98 -98 -96 -97 -98 -98 -99 -98 -98 -98 -91 -90 -93 -97 -98 -92 -98 -98 -98 -98 -99 -98 -98 -98 -98 -95 -96 -95 -94 -93 -94 -94 -81 -80 -80 -81 -80 -80 -81 -81 -80 -81 -81 -80 -98 -80 -81 -80 -80 -81 -80 -80 -81 -80 -80 -81 -80 -84 -81 -80 -80 -78 -83 -82 -83 -94 -98 -98 -83 -99 -98 -97 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -84 -84 -82 -83 -83 -83 -83 -83 -83 -99 -83 -83 -83 -84 -84 -83 -83 -84 -84 -83 -83 -84 -61 -84 -84 -84 -84 -83 -83 -83 -83 -83 -83 -83 -84 -93 -80 -80 -80 -80 -80 -80 -80 -81 -80 -77 -80 -80 -91 -91 -94 -91 -91 -88 -79 -86 -93 -90 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -95 -80 -80 -80 -81 -81 -80 -81 -81 -80 -81 -80 -80 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -41 -93 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -81 -81 -81 -81 -81 -80 -81 -80 -81 -81 -80 -81 -98 -92 -98 -98 -98 -80 -81 -81 -81 -80 -80 -80 -80 -80 -80 -80 -80 -97 -81 -77 -81 -81 -81 -79 -80 -81 -81 -81 -81 -81 -93 -93 -98 -84 -84 -84 -84 -83 -82 -81 -82 -82 -84 -84 -81 -85 -99 -84 -84 -83 -84 -83 -83 -83 -83 -83 -83 -83 -82 -89 -86 -90 -98 -91 -88 -87 -94 -94 -96 -95 -97 -98 -83 -83 -83 -84 -83 -83 -84 -82 -83 -83 -84 -84 -41 -84 -84 -83 -83 -84 -83 -83 -83 -84 -84 -84 -83 -41 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -89 -98 -98 -98 -92 -98 -98 -98 -98 -87 -92 -95 -92 -93 -93 -97 -99 -99 -98 -98 -98 -98 -98 -94 -98 -98 -93 -94 -98 -98 -94 -97 -95 -85 -99 -98 -97 -98 -97 -98 -98 -98 -98 -92 -98 -91 -98 -98 -98 -89 -98 -98 -91 -98 -98 -99 -98 -98 -92 -98 -93 -92 -98 -99 -98 -99 -98 -92 -98 -99 -98 -98 -98 -98 -98 -98 -97 -92 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -97 -84 -98 -95 -98 -88 -98 -98 -97 -98 -86 -86 -87 -98 -98 -99 -98 -98 -98 -80 -99 -98 -92 -98 -99 -98 -98 -98 -92 -98 -98 -97 -92 -98 -97 -98 -84 -84 -84 -83 -84 -84 -84 -84 -83 -84 -83 -84 -82 -84 -98 -84 -84 -84 -84 -82 -84 -84 -84 -83 -84 -84 -84 -85 -77 -88 -98 -84 -84 -84 -84 -84 -84 -84 -84 -94 -53 -80 -98 -99 -95 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -94 -94 -88 -86 -99 -98 -98 -98 -98 -98 -98 -94 -80 -91 -92 -92 -92 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -94 -98 -87 -98 -98 -98 -98 -97 -98 -97 -97 -98 -98 -94 -98 -98 -98 -89 -98 -98 -99 -98 -97 -98 -91 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -92 -98 -99 -88 -98 -88 -98 -98 -89 -89 -89 -88 -89 -89 -89 -98 -97 -98 -95 -86 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -90 -91 -98 -80 -98 -98 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -78 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -98 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -48 -78 -80 -80 -80 -81 -80 -80 -80 -81 -81 -80 -80 -41 -92 -92 -92 -93 -92 -92 -92 -92 -93 -92 -91 -92 -92 -92 -93 -97 -80 -96 -80 -80 -81 -80 -80 -80 -80 -81 -80 -80 -80 -80 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -57 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -89 -80 -80 -79 -79 -79 -79 -77 -79 -79 -79 -81 -80 -85 -99 -92 -84 -84 -83 -83 -83 -83 -83 -83 -84 -83 -83 -84 -98 -98 -86 -82 -89 -40 -98 -89 -82 -97 -82 -92 -83 -83 -83 -82 -83 -83 -83 -83 -83 -82 -83 -83 -88 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -62 -98 -98 -98 -98 -98 -98 -98 -98 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -63 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -98 -98 -98 -80 -93 -93 -92 -92 -92 -92 -92 -93 -92 -91 -92 -95 -91 -90 -88 -98 -99 -98 -98 -98 -98 -96 -97 -91 -98 -98 -98 -96 -91 -91 -98 -98 -98 -95 -98 -95 -98 -98 -98 -89 -98 -98 -97 -97 -97 -98 -99 -98 -98 -98 -98 -99 -92 -92 -98 -93 -92 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -99 -97 -98 -98 -98 -93 -98 -98 -98 -99 -98 -98 -97 -98 -86 -87 -87 -87 -99 -98 -83 -83 -83 -78 -83 -83 -83 -83 -83 -83 -83 -83 -92 -92 -83 -84 -83 -84 -83 -83 -84 -84 -84 -84 -83 -83 -99 -83 -94 -98 -83 -83 -83 -84 -84 -83 -84 -83 -83 -84 -84 -84 -93 -84 -84 -84 -83 -84 -84 -84 -83 -83 -83 -83 -83 -41 -84 -84 -84 -84 -83 -83 -84 -84 -84 -84 -84 -84 -44 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -98 -80 -80 -80 -80 -80 -80 -80 -81 -78 -80 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -41 -92 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -93 -84 -83 -84 -84 -83 -84 -84 -84 -84 -81 -81 -84 -41 -89 -84 -83 -82 -84 -83 -83 -83 -84 -83 -83 -81 -81 -84 -92 -90 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -88 -81 -90 -93 -83 -89 -80 -81 -81 -81 -80 -81 -81 -80 -80 -80 -80 -80 -99 -81 -81 -81 -79 -81 -81 -81 -81 -81 -81 -80 -81 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -92 -83 -83 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -98 -98 -98 -98 -98 -92 -95 -86 -90 -98 -98 -98 -99 -92 -92 -92 -91 -93 -95 -42 -91 -92 -93 -93 -92 -92 -93 -92 -93 -92 -93 -98 -98 -99 -99 -98 -98 -99 -94 -84 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -97 -98 -98 -84 -68 -67 -64 -98 -98 -93 -98 -98 -98 -99 -97 -98 -98 -92 -96 -92 -93 -92 -93 -92 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -90 -93 -93 -96 -89 -89 -88 -89 -90 -90 -90 -90 -90 -88 -88 -87 -91 -98 -98 -99 -98 -98 -92 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -97 -92 -84 -98 -98 -89 -99 -84 -99 -98 -91 -98 -96 -98 -90 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -91 -98 -98 -98 -98 -40 -98 -98 -91 -99 -98 -98 -98 -98 -98 -97 -98 -85 -98 -98 -98 -98 -98 -98 -98 -98 -91 -94 -98 -92 -92 -93 -96 -92 -96 -98 -99 -98 -98 -84 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -84 -96 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -82 -83 -84 -84 -84 -83 -84 -83 -83 -84 -83 -56 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -84 -50 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -93 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -81 -82 -81 -81 -83 -83 -83 -84 -79 -82 -84 -83 -55 -93 -93 -92 -96 -99 -81 -80 -80 -81 -81 -81 -81 -81 -80 -80 -80 -80 -95 -81 -80 -81 -81 -81 -80 -80 -80 -80 -81 -80 -84 -84 -82 -53 -84 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -88 -84 -84 -83 -84 -84 -83 -84 -84 -84 -84 -84 -84 -41 -96 -83 -84 -84 -84 -84 -84 -98 -94 -92 -87 -81 -80 -80 -80 -81 -81 -70 -78 -93 -93 -94 -93 -98 -98 -98 -98 -98 -98 -98 -98 -80 -81 -81 -81 -81 -81 -86 -98 -81 -81 -81 -81 -81 -81 -94 -55 -98 -93 -89 -99 -98 -98 -98 -92 -98 -98 -81 -81 -81 -80 -81 -81 -81 -81 -81 -80 -81 -81 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -87 -81 -81 -81 -81 -81 -81 -93 -84 -84 -85 -84 -84 -77 -81 -84 -83 -82 -83 -83 -98 -80 -80 -80 -81 -81 -79 -43 -98 -93 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -82 -98 -94 -98 -99 -98 -98 -99 -99 -98 -98 -98 -98 -81 -81 -81 -81 -81 -81 -85 -80 -81 -81 -81 -81 -92 -89 -84 -84 -84 -84 -84 -72 -84 -83 -83 -84 -83 -84 -85 -84 -84 -84 -84 -84 -57 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -99 -98 -92 -98 -98 -98 -99 -90 -84 -83 -84 -81 -83 -72 -98 -84 -84 -83 -83 -83 -79 -93 -93 -93 -93 -93 -95 -90 -84 -83 -83 -84 -84 -84 -97 -98 -84 -84 -83 -84 -84 -83 -95 -97 -94 -92 -97 -98 -96 -93 -97 -84 -84 -83 -84 -83 -84 -40 -84 -84 -84 -84 -84 -84 -98 -98 -98 -98 -98 -98 -99 -96 -92 -98 -92 -98 -93 -95 -93 -98 -98 -98 -94 -95 -92 -98 -98 -98 -94 -90 -98 -84 -83 -84 -84 -84 -84 -92 -84 -84 -84 -84 -83 -84 -92 -81 -80 -81 -81 -80 -81 -89 -50 -89 -89 -89 -89 -89 -89 -88 -98 -90 -93 -92 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -86 -81 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -91 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -99 -81 -81 -81 -81 -81 -81 -52 -98 -98 -98 -98 -89 -80 -89 -80 -81 -81 -81 -81 -81 -91 -81 -81 -81 -81 -81 -86 -98 -98 -84 -84 -83 -84 -84 -84 -98 -98 -77 -81 -81 -81 -80 -81 -62 -81 -81 -81 -81 -81 -78 -87 -81 -81 -81 -81 -81 -81 -98 -93 -93 -93 -93 -93 -93 -93 -93 -92 -92 -97 -81 -81 -81 -81 -81 -81 -80 -90 -81 -81 -81 -81 -81 -81 -99 -98 -94 -98 -98 -98 -89 -98 -99 -98 -98 -97 -98 -98 -92 -80 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -51 -89 -81 -80 -80 -80 -81 -81 -98 -84 -83 -84 -84 -84 -84 -80 -70 -86 -97 -98 -92 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -94 -87 -86 -81 -83 -83 -83 -83 -83 -89 -81 -91 -81 -81 -94 -81 -81 -80 -81 -81 -81 -88 -89 -88 -98 -99 -98 -99 -87 -83 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -90 -84 -83 -83 -83 -84 -84 -55 -98 -84 -84 -83 -84 -84 -84 -92 -84 -84 -84 -84 -84 -84 -92 -84 -83 -83 -83 -83 -84 -64 -83 -83 -83 -84 -83 -83 -80 -84 -84 -84 -83 -83 -83 -48 -91 -91 -91 -91 -92 -91 -91 -93 -91 -91 -90 -91 -90 -91 -93 -93 -95 -91 -80 -80 -80 -81 -81 -79 -81 -80 -80 -81 -81 -81 -81 -96 -40 -92 -80 -80 -81 -81 -81 -81 -96 -80 -81 -81 -81 -81 -81 -96 -98 -96 -98 -98 -98 -98 -99 -99 -99 -98 -98 -91 -98 -98 -99 -97 -81 -81 -80 -81 -81 -81 -51 -80 -81 -81 -80 -81 -81 -98 -98 -98 -94 -98 -86 -98 -89 -98 -98 -85 -86 -86 -86 -87 -99 -89 -89 -89 -89 -88 -88 -89 -89 -89 -89 -89 -99 -88 -98 -85 -98 -98 -98 -98 -98 -99 -98 -98 -94 -80 -97 -81 -99 -83 -99 -90 -98 -99 -99 -98 -98 -97 -98 -98 -98 -99 -89 -98 -98 -99 -98 -98 -80 -81 -80 -80 -81 -80 -98 -84 -83 -84 -84 -84 -84 -84 -83 -78 -80 -84 -84 -40 -84 -84 -84 -84 -84 -84 -99 -84 -84 -84 -84 -84 -84 -98 -84 -80 -80 -80 -78 -81 -58 -81 -81 -80 -81 -80 -80 -46 -81 -81 -80 -80 -80 -80 -84 -83 -84 -83 -83 -84 -84 -98 -93 -81 -80 -81 -81 -81 -80 -77 -80 -81 -81 -81 -80 -93 -95 -84 -83 -83 -83 -83 -83 -76 -84 -79 -83 -83 -83 -84 -92 -98 -84 -83 -83 -83 -84 -84 -90 -84 -84 -84 -84 -83 -84 -84 -78 -82 -82 -81 -84 -70 -80 -80 -80 -80 -80 -81 -98 -84 -84 -83 -83 -83 -83 -98 -72 -67 -68 -93 -92 -89 -98 -94 -91 -98 -98 -99 -98 -98 -98 -97 -66 -92 -88 -89 -89 -89 -91 -86 -92 -97 -84 -88 -93 -91 -91 -90 -90 -97 -98 -98 -99 -88 -78 -80 -91 -88 -85 -99 -99 -98 -98 -98 -93 -85 -86 -90 -84 -97 -98 -98 -98 -98 -78 -94 -90 -93 -84 -84 -83 -83 -84 -84 -98 -80 -80 -81 -80 -81 -81 -99 -81 -81 -80 -81 -81 -80 -98 -91 -90 -84 -81 -81 -81 -81 -81 -81 -98 -98 -84 -83 -84 -84 -84 -84 -54 -83 -84 -83 -83 -83 -83 -97 -78 -87 -79 -89 -84 -84 -84 -82 -84 -84 -98 -98 -98 -81 -80 -80 -81 -77 -81 -94 -90 -92 -92 -92 -93 -96 -93 -98 -98 -84 -83 -84 -84 -84 -83 -98 -98 -80 -80 -84 -84 -84 -84 -84 -84 -84 -87 -98 -98 -98 -99 -84 -84 -83 -84 -84 -84 -88 -80 -81 -80 -81 -80 -80 -81 -81 -81 -81 -81 -81 -80 -81 -81 -80 -80 -81 -44 -81 -81 -81 -81 -80 -80 -88 -89 -88 -92 -99 -97 -98 -95 -81 -93 -93 -91 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -95 -80 -98 -98 -98 -98 -81 -81 -80 -81 -80 -81 -62 -80 -81 -81 -81 -81 -54 -84 -84 -84 -84 -84 -84 -98 -99 -98 -85 -98 -83 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -57 -99 -99 -98 -98 -99 -99 -99 -99 -98 -98 -98 -98 -98 -99 -98 -97 -94 -99 -94 -90 -94 -91 -97 -98 -82 -83 -84 -84 -84 -84 -74 -84 -84 -84 -79 -83 -83 -91 -93 -93 -80 -80 -80 -80 -81 -80 -99 -99 -98 -98 -94 -92 -99 -99 -98 -98 -95 -83 -80 -81 -81 -81 -81 -80 -91 -80 -80 -80 -80 -80 -81 -95 -98 -90 -98 -98 -84 -84 -83 -84 -84 -84 -45 -98 -98 -98 -98 -94 -98 -83 -83 -83 -83 -83 -83 -40 -84 -83 -83 -83 -83 -83 -83 -84 -84 -84 -84 -83 -78 -99 -98 -98 -98 -98 -92 -98 -95 -98 -98 -99 -98 -97 -98 -89 -89 -97 -85 -86 -97 -85 -85 -98 -86 -85 -85 -79 -87 -90 -89 -88 -94 -94 -89 -89 -89 -82 -83 -84 -84 -84 -84 -98 -81 -80 -80 -80 -80 -80 -94 -94 -98 -81 -81 -92 -87 -85 -90 -94 -96 -92 -84 -93 -89 -98 -99 -98 -98 -80 -90 -98 -81 -81 -81 -79 -79 -80 -94 -94 -85 -84 -83 -83 -84 -83 -83 -71 -84 -84 -83 -83 -84 -83 -60 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -83 -80 -81 -81 -80 -80 -80 -80 -80 -41 -98 -79 -94 -90 -93 -91 -92 -94 -92 -92 -92 -92 -93 -94 -92 -92 -93 -93 -93 -93 -91 -93 -92 -93 -92 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -80 -98 -85 -84 -83 -83 -84 -84 -98 -84 -83 -83 -83 -82 -83 -86 -83 -83 -83 -83 -84 -88 -80 -80 -80 -80 -80 -80 -85 -98 -95 -86 -98 -99 -98 -99 -65 -84 -83 -84 -84 -84 -77 -83 -83 -83 -83 -82 -83 -64 -83 -83 -84 -83 -84 -83 -90 -89 -91 -92 -89 -98 -93 -81 -86 -88 -88 -93 -98 -98 -98 -98 -98 -99 -98 -91 -98 -98 -98 -98 -98 -98 -98 -96 -97 -95 -84 -97 -98 -86 -99 -88 -98 -98 -98 -98 -88 -84 -84 -84 -84 -84 -83 -97 -98 -84 -84 -83 -84 -84 -83 -53 -84 -84 -83 -84 -83 -83 -98 -93 -83 -83 -83 -84 -83 -83 -83 -83 -98 -98 -98 -98 -98 -98 -98 -98 -97 -80 -93 -95 -92 -90 -92 -93 -93 -92 -98 -97 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -84 -83 -83 -79 -83 -84 -56 -84 -84 -83 -83 -84 -84 -84 -46 -96 -98 -98 -99 -98 -94 -94 -91 -97 -98 -91 -94 -99 -98 -98 -99 -99 -98 -94 -91 -84 -83 -84 -84 -84 -90 -98 -80 -80 -80 -80 -80 -80 -46 -81 -80 -81 -80 -81 -80 -40 -81 -81 -80 -80 -81 -81 -98 -98 -98 -98 -97 -98 -86 -91 -99 -99 -95 -99 -99 -99 -99 -98 -80 -93 -92 -90 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -80 -81 -80 -80 -80 -80 -81 -69 -81 -80 -80 -80 -81 -81 -99 -81 -81 -81 -81 -80 -80 -80 -81 -80 -80 -81 -80 -50 -81 -81 -81 -81 -81 -80 -43 -94 -80 -80 -80 -81 -81 -81 -92 -84 -84 -84 -84 -84 -84 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -94 -97 -98 -99 -98 -98 -98 -97 -98 -89 -98 -98 -98 -98 -98 -98 -94 -91 -78 -83 -83 -83 -83 -83 -81 -81 -80 -81 -81 -81 -98 -81 -81 -81 -81 -81 -81 -99 -98 -98 -95 -97 -81 -98 -98 -98 -99 -98 -98 -98 -98 -91 -99 -98 -92 -98 -98 -99 -81 -81 -80 -81 -81 -81 -98 -98 -99 -98 -98 -98 -99 -98 -94 -99 -84 -84 -84 -84 -84 -84 -58 -84 -83 -84 -84 -83 -84 -84 -84 -84 -84 -84 -83 -64 -98 -98 -98 -99 -98 -92 -98 -98 -98 -98 -97 -98 -97 -98 -89 -89 -89 -89 -89 -89 -89 -89 -82 -82 -83 -81 -81 -81 -86 -85 -84 -80 -80 -80 -80 -80 -87 -93 -92 -83 -83 -83 -84 -84 -83 -94 -83 -98 -98 -98 -98 -98 -98 -98 -98 -99 -83 -89 -92 -98 -83 -98 -89 -84 -84 -84 -83 -84 -70 -84 -84 -83 -83 -84 -84 -86 -80 -81 -80 -80 -80 -61 -86 -81 -80 -80 -80 -81 -92 -84 -84 -83 -84 -84 -84 -98 -84 -83 -84 -83 -83 -83 -91 -80 -80 -80 -80 -80 -80 -54 -81 -81 -80 -80 -81 -81 -87 -84 -84 -84 -84 -84 -84 -93 -83 -83 -83 -81 -80 -82 -84 -91 -93 -93 -92 -92 -92 -90 -92 -94 -93 -93 -93 -92 -94 -80 -81 -80 -81 -81 -81 -81 -97 -79 -80 -80 -80 -80 -80 -98 -83 -82 -84 -84 -84 -84 -83 -83 -83 -83 -83 -83 -80 -80 -80 -80 -80 -80 -97 -80 -80 -79 -79 -80 -80 -99 -84 -84 -84 -84 -84 -84 -95 -90 -83 -84 -84 -84 -84 -84 -80 -80 -80 -80 -80 -80 -98 -98 -73 -84 -83 -83 -82 -83 -84 -84 -80 -77 -86 -98 -41 -78 -82 -82 -83 -78 -84 -84 -88 -89 -83 -84 -83 -84 -84 -84 -84 -84 -84 -82 -84 -57 -83 -81 -83 -82 -83 -83 -80 -80 -80 -80 -80 -81 -73 -84 -44 -44 -85 -91 -79 -84 -89 -90 -76 -96 -98 -87 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -83 -98 -84 -84 -84 -84 -82 -83 -98 -79 -80 -41 -88 -83 -88 -84 -92 -80 -80 -80 -80 -79 -81 -98 -79 -87 -92 -92 -93 -93 -92 -93 -92 -93 -56 -85 -56 -90 -84 -90 -88 -85 -93 -90 -98 -98 -98 -98 -80 -84 -84 -84 -84 -84 -84 -88 -84 -83 -83 -84 -84 -84 -80 -98 -89 -85 -94 -98 -97 -98 -93 -84 -84 -84 -85 -84 -84 -80 -82 -84 -84 -84 -84 -84 -99 -80 -80 -80 -80 -81 -80 -84 -84 -84 -84 -84 -83 -41 -84 -84 -84 -84 -82 -84 -90 -80 -80 -80 -80 -80 -80 -97 -82 -96 -93 -85 -85 -84 -86 -93 -93 -94 -92 -81 -81 -80 -80 -81 -81 -74 -80 -81 -81 -81 -81 -81 -99 -95 -98 -99 -92 -98 -81 -81 -80 -80 -81 -81 -81 -85 -80 -81 -81 -81 -80 -62 -46 -98 -97 -98 -98 -90 -92 -90 -85 -58 -80 -84 -93 -98 -80 -80 -80 -81 -80 -80 -81 -81 -81 -81 -80 -80 -83 -84 -84 -84 -84 -84 -98 -98 -42 -81 -81 -80 -81 -80 -81 -81 -81 -81 -80 -81 -80 -40 -82 -84 -84 -84 -84 -84 -97 -90 -94 -80 -91 -98 -92 -92 -93 -98 -98 -80 -80 -80 -81 -80 -80 -81 -81 -80 -80 -80 -81 -80 -98 -80 -81 -81 -81 -81 -81 -57 -87 -86 -82 -82 -83 -83 -83 -83 -52 -81 -81 -81 -81 -81 -81 -41 -80 -80 -81 -81 -81 -80 -98 -84 -84 -84 -84 -84 -84 -80 -80 -81 -81 -81 -81 -80 -95 -86 -86 -99 -97 -98 -98 -98 -97 -86 -84 -84 -84 -84 -84 -84 -84 -84 -81 -84 -83 -86 -84 -84 -82 -83 -82 -87 -85 -80 -80 -80 -81 -80 -80 -79 -93 -91 -92 -93 -97 -93 -93 -94 -67 -80 -81 -81 -81 -81 -68 -81 -81 -81 -81 -81 -80 -80 -40 -80 -83 -90 -80 -81 -80 -80 -81 -75 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -49 -89 -81 -80 -80 -77 -81 -87 -88 -99 -99 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -75 -87 -84 -84 -84 -84 -84 -93 -80 -80 -80 -80 -80 -80 -98 -98 -83 -83 -82 -83 -81 -83 -98 -98 -98 -98 -99 -99 -98 -98 -93 -93 -90 -94 -92 -93 -92 -93 -93 -92 -92 -92 -84 -84 -84 -84 -84 -84 -80 -80 -81 -81 -80 -80 -41 -86 -81 -81 -81 -80 -81 -81 -98 -98 -99 -96 -98 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -94 -98 -78 -84 -84 -84 -84 -84 -98 -83 -84 -83 -83 -83 -83 -80 -80 -80 -80 -80 -80 -90 -89 -47 -83 -83 -84 -83 -83 -84 -84 -84 -84 -84 -84 -84 -41 -84 -84 -84 -84 -84 -84 -88 -98 -80 -80 -80 -80 -80 -81 -98 -83 -92 -96 -98 -95 -81 -81 -80 -81 -81 -81 -98 -81 -81 -81 -80 -81 -81 -50 -81 -80 -80 -81 -80 -81 -98 -94 -85 -81 -81 -81 -81 -81 -92 -85 -84 -84 -84 -84 -84 -67 -90 -84 -84 -84 -84 -84 -70 -84 -84 -84 -84 -84 -84 -99 -98 -80 -80 -81 -80 -80 -80 -87 -94 -92 -83 -83 -83 -84 -83 -83 -68 -94 -91 -91 -92 -89 -92 -92 -96 -94 -98 -98 -83 -84 -84 -83 -84 -84 -99 -84 -84 -84 -84 -84 -84 -84 -64 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -89 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -95 -98 -96 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -92 -84 -84 -84 -84 -83 -84 -84 -84 -82 -82 -84 -82 -89 -83 -83 -84 -84 -84 -79 -83 -83 -84 -83 -84 -84 -47 -90 -98 -93 -83 -83 -83 -84 -84 -84 -84 -84 -84 -84 -83 -83 -81 -98 -85 -81 -84 -94 -92 -97 -81 -81 -81 -80 -80 -80 -81 -80 -80 -81 -80 -81 -80 -80 -80 -80 -81 -81 -80 -81 -81 -80 -81 -81 -58 -45 -98 -93 -81 -80 -81 -81 -81 -80 -81 -81 -80 -80 -81 -81 -41 -92 -81 -80 -81 -81 -81 -81 -81 -80 -81 -80 -81 -81 -80 -80 -81 -81 -80 -80 -80 -80 -81 -80 -81 -81 -98 -81 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -92 -40 -92 -90 -93 -93 -92 -93 -94 -98 -96 -98 -84 -96 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -84 -83 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -93 -98 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -82 -83 -96 -84 -83 -83 -83 -83 -82 -84 -79 -84 -83 -83 -84 -98 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -98 -80 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -93 -80 -81 -93 -92 -90 -90 -80 -80 -81 -81 -81 -80 -81 -80 -81 -81 -81 -80 -80 -67 -80 -81 -80 -81 -81 -81 -81 -81 -81 -80 -80 -81 -77 -74 -62 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -85 -84 -84 -84 -84 -83 -84 -84 -84 -83 -84 -84 -84 -98 -98 -96 -98 -84 -96 -98 -98 -98 -98 -92 -97 -98 -93 -92 -96 -98 -95 -98 -99 -97 -90 -98 -93 -95 -98 -91 -91 -99 -98 -92 -99 -98 -99 -76 -94 -98 -98 -98 -98 -92 -98 -99 -98 -94 -98 -92 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -97 -98 -93 -98 -98 -98 -97 -98 -82 -90 -98 -83 -85 -87 -98 -90 -98 -99 -98 -99 -80 -94 -98 -92 -98 -99 -98 -90 -90 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -99 -95 -95 -95 -97 -98 -98 -98 -98 -93 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -87 -84 -84 -84 -84 -83 -84 -84 -84 -83 -84 -84 -67 -92 -84 -83 -84 -84 -84 -83 -84 -84 -84 -83 -84 -83 -94 -84 -85 -83 -80 -80 -80 -80 -80 -80 -80 -78 -81 -80 -81 -85 -88 -87 -85 -91 -91 -92 -94 -93 -93 -96 -98 -85 -84 -84 -82 -84 -84 -84 -83 -84 -84 -83 -84 -84 -97 -83 -80 -81 -80 -81 -80 -80 -81 -81 -80 -81 -81 -80 -80 -80 -80 -79 -81 -80 -81 -81 -80 -81 -81 -81 -81 -98 -85 -84 -84 -84 -84 -82 -83 -82 -84 -84 -84 -84 -94 -98 -97 -55 -81 -80 -80 -81 -80 -80 -80 -80 -81 -80 -81 -80 -80 -80 -81 -81 -80 -80 -80 -80 -80 -80 -79 -79 -87 -85 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -99 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -83 -98 -98 -84 -63 -99 -84 -90 -98 -98 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -98 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -46 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -83 -80 -84 -84 -83 -84 -98 -81 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -93 -93 -96 -85 -84 -84 -84 -82 -79 -82 -82 -84 -84 -84 -84 -83 -80 -80 -80 -80 -80 -78 -81 -80 -80 -79 -80 -80 -80 -80 -92 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -62 -84 -97 -80 -82 -80 -80 -81 -81 -80 -81 -81 -81 -80 -80 -80 -61 -72 -85 -89 -91 -80 -81 -80 -80 -81 -81 -80 -80 -81 -80 -81 -80 -80 -41 -84 -91 -80 -97 -93 -85 -92 -84 -63 -88 -91 -85 -89 -87 -93 -86 -94 -98 -99 -85 -80 -89 -93 -85 -82 -98 -80 -81 -80 -80 -81 -80 -80 -80 -80 -80 -81 -81 -80 -41 -41 -86 -80 -81 -90 -96 -84 -84 -84 -83 -84 -84 -84 -84 -85 -98 -41 -96 -84 -84 -84 -84 -83 -80 -81 -84 -84 -84 -84 -84 -97 -84 -83 -83 -84 -84 -84 -84 -84 -84 -84 -82 -84 -93 -84 -84 -84 -83 -84 -84 -84 -83 -83 -83 -84 -84 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -80 -84 -98 -97 -80 -94 -80 -78 -81 -81 -81 -81 -81 -80 -81 -80 -80 -80 -80 -41 -84 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -96 -95 -99 -96 -97 -84 -84 -84 -84 -83 -84 -84 -83 -84 -83 -84 -83 -98 -95 -98 -91 -99 -97 -98 -91 -80 -80 -80 -80 -79 -80 -80 -80 -79 -80 -80 -80 -90 -84 -83 -83 -83 -83 -84 -83 -83 -83 -83 -84 -84 -81 -84 -84 -83 -83 -84 -84 -84 -84 -84 -84 -84 -82 -93 -80 -90 -98 -81 -81 -80 -80 -81 -81 -81 -81 -81 -80 -80 -80 -41 -47 -80 -81 -80 -80 -80 -80 -81 -81 -81 -80 -81 -80 -96 -84 -82 -84 -84 -84 -84 -84 -84 -84 -85 -84 -84 -98 -80 -80 -80 -81 -81 -80 -80 -81 -80 -81 -80 -80 -92 -98 -41 -84 -84 -84 -84 -83 -82 -83 -83 -83 -83 -84 -84 -64 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -92 -92 -93 -92 -80 -80 -80 -81 -80 -80 -80 -80 -80 -81 -80 -80 -98 -98 -98 -84 -84 -84 -83 -83 -84 -84 -83 -83 -83 -83 -84 -96 -42 -94 -84 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -82 -40 -48 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -96 -84 -84 -84 -83 -84 -81 -81 -81 -81 -81 -84 -84 -83 -84 -82 -83 -83 -84 -84 -84 -84 -84 -84 -84 -41 -92 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -98 -98 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -69 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -95 -81 -80 -80 -80 -80 -81 -80 -81 -80 -80 -80 -80 -93 -80 -81 -80 -80 -80 -80 -80 -81 -80 -81 -80 -80 -41 -80 -81 -80 -80 -80 -81 -80 -80 -80 -80 -81 -80 -41 -90 -98 -99 -98 -87 -93 -95 -92 -90 -90 -91 -80 -41 -98 -98 -99 -98 -98 -81 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -81 -41 -80 -84 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -64 -41 -99 -80 -80 -80 -81 -81 -81 -80 -80 -80 -81 -80 -80 -98 -80 -81 -80 -80 -81 -80 -80 -80 -80 -80 -81 -81 -92 -97 -86 -84 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -80 -95 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -99 -87 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -97 -98 -98 -99 -92 -98 -93 -98 -98 -98 -99 -84 -84 -84 -84 -84 -83 -84 -84 -84 -85 -85 -84 -41 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -93 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -81 -84 -83 -84 -84 -82 -83 -81 -84 -83 -84 -84 -90 -92 -87 -93 -93 -93 -98 -98 -80 -79 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -95 -80 -80 -81 -80 -80 -80 -80 -80 -79 -81 -79 -80 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -99 -98 -89 -98 -83 -83 -83 -83 -82 -83 -84 -83 -83 -83 -83 -84 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -88 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -91 -95 -83 -83 -83 -83 -84 -84 -84 -84 -84 -84 -82 -84 -81 -98 -98 -95 -84 -94 -97 -98 -93 -84 -98 -94 -94 -93 -93 -82 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -98 -93 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -97 -81 -81 -81 -80 -81 -81 -81 -80 -81 -81 -81 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -98 -84 -82 -83 -83 -84 -84 -84 -84 -84 -84 -84 -82 -97 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -99 -98 -98 -98 -98 -94 -98 -98 -95 -84 -98 -98 -98 -98 -95 -95 -98 -97 -84 -83 -84 -83 -84 -84 -84 -82 -84 -83 -84 -84 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -81 -80 -81 -81 -81 -80 -81 -81 -80 -81 -81 -81 -51 -45 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -84 -84 -84 -84 -84 -84 -82 -81 -82 -84 -83 -83 -41 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -93 -85 -87 -84 -84 -84 -83 -84 -84 -84 -84 -84 -83 -84 -68 -84 -99 -88 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -41 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -83 -84 -83 -83 -83 -83 -83 -83 -83 -84 -83 -41 -83 -83 -83 -83 -84 -83 -83 -84 -83 -84 -83 -83 -57 -84 -84 -83 -84 -84 -84 -84 -83 -84 -84 -84 -83 -98 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -92 -93 -93 -92 -92 -93 -92 -98 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -84 -84 -84 -84 -84 -41 -51 -88 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -84 -41 -80 -81 -81 -80 -80 -80 -81 -81 -81 -81 -81 -81 -94 -81 -81 -81 -80 -81 -80 -81 -80 -80 -80 -80 -79 -81 -80 -81 -81 -80 -81 -82 -83 -84 -83 -84 -84 -67 -81 -80 -80 -81 -81 -80 -80 -80 -80 -80 -80 -80 -80 -93 -93 -96 -98 -80 -98 -83 -98 -98 -98 -99 -98 -98 -89 -91 -98 -98 -99 -88 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -99 -98 -99 -98 -97 -99 -98 -97 -93 -99 -87 -99 -99 -98 -98 -98 -91 -98 -98 -98 -98 -98 -92 -92 -98 -80 -80 -80 -80 -80 -80 -81 -79 -81 -81 -81 -81 -50 -88 -80 -80 -80 -81 -81 -80 -80 -81 -81 -81 -80 -80 -92 -92 -92 -92 -92 -92 -92 -92 -98 -97 -98 -98 -95 -80 -98 -80 -80 -80 -80 -80 -81 -81 -80 -81 -81 -80 -81 -51 -80 -81 -80 -80 -81 -80 -80 -80 -80 -80 -81 -81 -86 -80 -80 -80 -80 -81 -80 -81 -80 -81 -80 -81 -81 -99 -80 -81 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -61 -80 -80 -81 -80 -80 -80 -80 -80 -80 -81 -81 -81 -87 -80 -78 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -82 -82 -83 -83 -82 -82 -83 -82 -83 -83 -84 -82 -90 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -76 -91 -94 -83 -83 -83 -83 -82 -83 -83 -83 -82 -83 -82 -82 -80 -99 -99 -98 -98 -98 -98 -98 -99 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -88 -98 -72 -83 -83 -83 -82 -83 -83 -82 -83 -82 -83 -83 -83 -92 -91 -92 -92 -92 -86 -82 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -93 -80 -98 -80 -80 -80 -80 -78 -81 -81 -81 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -90 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -83 -82 -83 -82 -82 -82 -82 -82 -94 -93 -99 -92 -98 -98 -98 -98 -98 -98 -98 -99 -98 -69 -85 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -90 -92 -98 -80 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -98 -94 -98 -87 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -82 -79 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -91 -77 -88 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -80 -81 -79 -93 -82 -83 -83 -83 -81 -82 -82 -82 -83 -82 -83 -81 -83 -86 -92 -69 -94 -80 -92 -69 -94 -83 -82 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -60 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -82 -41 -82 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -99 -83 -83 -82 -83 -79 -83 -82 -83 -83 -83 -82 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -82 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -93 -98 -99 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -90 -80 -98 -89 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -92 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -80 -80 -80 -80 -80 -92 -92 -98 -92 -94 -92 -99 -92 -96 -92 -91 -90 -91 -98 -98 -98 -98 -99 -98 -98 -99 -98 -99 -98 -98 -99 -98 -98 -96 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -92 -98 -98 -98 -98 -89 -99 -98 -98 -92 -95 -97 -98 -98 -99 -97 -93 -96 -98 -94 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -94 -98 -92 -95 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -59 -93 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -81 -76 -96 -94 -80 -80 -81 -80 -80 -80 -81 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -81 -81 -80 -80 -80 -81 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -85 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -60 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -86 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -81 -80 -96 -93 -92 -93 -92 -93 -97 -98 -84 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -90 -83 -83 -83 -83 -82 -83 -83 -83 -82 -83 -82 -83 -98 -83 -82 -82 -83 -83 -83 -83 -83 -83 -82 -83 -83 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -41 -98 -98 -98 -80 -92 -93 -93 -97 -98 -93 -92 -98 -94 -88 -80 -80 -79 -79 -79 -79 -80 -80 -79 -80 -80 -80 -94 -93 -99 -98 -98 -83 -84 -82 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -82 -41 -97 -97 -93 -94 -93 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -82 -83 -94 -94 -94 -96 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -81 -83 -83 -83 -83 -82 -83 -83 -51 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -61 -92 -93 -92 -92 -93 -98 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -82 -84 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -81 -80 -80 -81 -80 -80 -80 -80 -80 -64 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -98 -75 -40 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -93 -86 -87 -88 -89 -99 -98 -98 -99 -98 -90 -94 -94 -92 -97 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -81 -80 -80 -80 -41 -80 -96 -94 -85 -80 -87 -90 -95 -98 -87 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -82 -83 -50 -82 -82 -83 -82 -82 -82 -82 -82 -83 -83 -82 -83 -71 -83 -83 -82 -83 -83 -82 -82 -83 -82 -83 -82 -82 -98 -93 -98 -98 -98 -98 -98 -98 -86 -93 -93 -91 -91 -91 -91 -91 -91 -90 -91 -92 -91 -92 -91 -91 -91 -89 -89 -88 -89 -97 -90 -94 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -93 -99 -98 -98 -98 -90 -98 -97 -96 -83 -83 -83 -83 -83 -82 -83 -82 -83 -83 -83 -82 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -82 -83 -99 -98 -98 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -68 -80 -83 -82 -83 -81 -80 -81 -80 -81 -81 -81 -66 -81 -82 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -86 -86 -85 -97 -95 -86 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -94 -98 -80 -92 -98 -96 -96 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -85 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -84 -83 -98 -98 -54 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -83 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -41 -92 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -87 -93 -92 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -82 -88 -81 -82 -83 -83 -82 -82 -83 -81 -83 -83 -83 -83 -92 -92 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -64 -99 -98 -95 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -93 -93 -91 -93 -93 -93 -94 -93 -91 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -83 -83 -41 -83 -82 -83 -83 -81 -83 -83 -83 -82 -82 -82 -82 -56 -82 -83 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -69 -83 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -92 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -97 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -93 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -97 -98 -99 -99 -99 -98 -93 -98 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -56 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -98 -98 -97 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -59 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -71 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -40 -94 -92 -93 -98 -98 -87 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -72 -81 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -70 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -85 -80 -80 -80 -80 -80 -80 -79 -81 -80 -80 -80 -80 -85 -84 -83 -83 -83 -83 -83 -83 -83 -83 -81 -81 -82 -41 -85 -86 -86 -89 -97 -98 -86 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -85 -93 -82 -96 -84 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -52 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -83 -83 -93 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -95 -98 -92 -92 -80 -98 -97 -90 -82 -90 -95 -95 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -99 -97 -98 -94 -98 -98 -89 -93 -98 -98 -82 -82 -82 -82 -82 -82 -82 -83 -81 -81 -81 -80 -41 -88 -88 -82 -82 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -95 -89 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -91 -87 -89 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -82 -55 -93 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -78 -81 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -83 -83 -63 -98 -89 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -78 -92 -94 -93 -98 -85 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -94 -85 -84 -83 -83 -83 -83 -83 -84 -83 -83 -83 -82 -83 -57 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -93 -97 -94 -88 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -76 -92 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -40 -83 -83 -83 -83 -82 -82 -82 -83 -83 -83 -83 -83 -98 -98 -84 -98 -93 -92 -98 -97 -98 -98 -98 -98 -99 -98 -98 -82 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -98 -89 -84 -83 -81 -84 -83 -83 -83 -81 -82 -83 -83 -83 -83 -93 -98 -90 -98 -98 -96 -86 -98 -92 -86 -97 -97 -99 -99 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -81 -83 -82 -81 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -81 -83 -82 -58 -79 -78 -80 -80 -80 -80 -80 -80 -80 -79 -81 -81 -93 -91 -92 -93 -92 -98 -98 -84 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -96 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -53 -90 -88 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -84 -82 -82 -82 -82 -83 -83 -83 -83 -82 -83 -83 -83 -94 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -81 -67 -98 -80 -98 -95 -80 -81 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -61 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -93 -87 -86 -81 -83 -98 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -81 -93 -93 -92 -92 -97 -94 -93 -98 -98 -98 -99 -98 -98 -98 -95 -94 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -56 -98 -98 -98 -93 -99 -98 -98 -98 -98 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -99 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -83 -83 -83 -82 -83 -82 -83 -82 -82 -82 -82 -82 -66 -93 -94 -90 -92 -93 -93 -93 -94 -99 -93 -93 -99 -98 -97 -98 -83 -82 -82 -82 -83 -83 -83 -82 -83 -83 -82 -82 -41 -83 -98 -95 -94 -94 -98 -83 -92 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -84 -83 -83 -84 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -98 -81 -83 -82 -82 -83 -82 -83 -83 -83 -81 -83 -83 -93 -92 -92 -92 -92 -92 -90 -92 -92 -92 -92 -92 -92 -41 -98 -94 -98 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -93 -96 -96 -82 -94 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -41 -97 -80 -80 -80 -81 -81 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -58 -98 -80 -80 -80 -80 -81 -80 -80 -80 -81 -79 -79 -79 -86 -91 -80 -80 -81 -80 -80 -79 -81 -81 -80 -80 -80 -80 -92 -92 -98 -83 -84 -83 -83 -83 -84 -83 -84 -83 -83 -84 -84 -95 -98 -83 -85 -98 -89 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -95 -97 -83 -83 -83 -83 -84 -83 -84 -83 -83 -84 -83 -83 -93 -88 -83 -83 -83 -83 -83 -83 -83 -83 -84 -84 -83 -91 -98 -98 -93 -83 -84 -83 -84 -84 -83 -84 -83 -84 -83 -83 -83 -84 -98 -84 -83 -84 -84 -82 -83 -84 -83 -84 -84 -84 -83 -99 -84 -80 -83 -83 -83 -84 -84 -84 -83 -83 -83 -84 -92 -95 -92 -93 -92 -94 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -85 -94 -97 -80 -80 -81 -80 -80 -81 -80 -80 -81 -81 -81 -80 -80 -50 -80 -81 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -81 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -76 -93 -92 -98 -99 -93 -94 -92 -84 -84 -84 -84 -83 -84 -84 -83 -84 -84 -84 -84 -53 -84 -84 -83 -84 -83 -83 -84 -83 -83 -83 -83 -84 -83 -41 -93 -93 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -84 -85 -84 -98 -97 -96 -98 -98 -98 -98 -98 -90 -83 -83 -83 -84 -84 -83 -83 -83 -81 -83 -83 -73 -82 -83 -83 -83 -83 -84 -83 -83 -82 -81 -83 -83 -49 -98 -92 -80 -80 -80 -79 -81 -81 -81 -80 -80 -81 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -92 -92 -90 -93 -92 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -81 -80 -80 -97 -80 -80 -80 -80 -80 -81 -81 -81 -81 -81 -81 -81 -98 -98 -93 -97 -98 -99 -83 -83 -83 -84 -84 -84 -84 -84 -83 -83 -84 -84 -98 -82 -83 -84 -83 -84 -82 -82 -81 -83 -83 -83 -83 -98 -89 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -83 -92 -84 -52 -81 -81 -81 -79 -80 -81 -80 -81 -81 -81 -81 -80 -92 -92 -98 -84 -98 -84 -81 -81 -84 -84 -84 -84 -83 -84 -84 -84 -84 -41 -84 -84 -84 -84 -84 -84 -84 -82 -84 -82 -83 -83 -83 -92 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -98 -84 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -79 -83 -83 -83 -83 -84 -83 -83 -82 -80 -82 -83 -83 -68 -83 -84 -83 -84 -81 -83 -84 -83 -84 -84 -83 -84 -84 -84 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -84 -83 -84 -84 -83 -83 -83 -98 -81 -98 -98 -98 -98 -85 -80 -80 -80 -80 -80 -81 -80 -81 -81 -80 -80 -81 -80 -97 -80 -80 -81 -81 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -81 -80 -80 -81 -81 -81 -81 -81 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -67 -80 -80 -81 -80 -81 -78 -79 -79 -81 -81 -79 -79 -50 -83 -97 -90 -91 -86 -94 -90 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -81 -94 -82 -99 -98 -98 -97 -99 -80 -80 -80 -80 -81 -81 -80 -80 -80 -80 -81 -81 -92 -80 -80 -81 -81 -80 -80 -80 -80 -81 -81 -80 -80 -56 -80 -81 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -63 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -93 -98 -98 -98 -98 -98 -97 -98 -85 -98 -98 -98 -99 -98 -98 -80 -80 -80 -79 -80 -81 -81 -81 -80 -80 -81 -80 -92 -92 -92 -92 -93 -97 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -79 -98 -83 -83 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -92 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -82 -75 -88 -84 -84 -84 -84 -84 -84 -80 -84 -84 -84 -83 -84 -44 -92 -84 -83 -83 -84 -84 -83 -84 -84 -84 -84 -84 -84 -77 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -90 -97 -80 -98 -93 -98 -80 -80 -80 -81 -80 -80 -80 -81 -80 -80 -80 -81 -81 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -58 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -91 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -83 -88 -98 -85 -83 -83 -83 -83 -83 -83 -80 -83 -83 -83 -83 -84 -93 -92 -91 -91 -92 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -61 -84 -84 -84 -83 -84 -84 -84 -84 -83 -84 -84 -84 -84 -81 -92 -83 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -86 -84 -84 -83 -84 -83 -84 -84 -83 -84 -83 -84 -83 -69 -84 -84 -84 -84 -84 -84 -83 -84 -84 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -87 -88 -87 -89 -88 -88 -98 -98 -84 -83 -80 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -98 -84 -84 -84 -83 -84 -83 -84 -84 -84 -84 -83 -84 -84 -98 -84 -84 -83 -84 -83 -83 -83 -83 -84 -84 -83 -83 -84 -89 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -93 -83 -84 -83 -83 -83 -83 -84 -83 -84 -83 -84 -84 -98 -83 -83 -84 -84 -84 -83 -84 -84 -84 -84 -83 -84 -98 -84 -83 -82 -82 -83 -83 -83 -83 -83 -83 -82 -83 -99 -98 -98 -98 -99 -98 -93 -84 -93 -93 -89 -88 -89 -92 -93 -93 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -92 -99 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -98 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -93 -98 -98 -98 -98 -80 -81 -80 -81 -80 -81 -80 -80 -79 -80 -80 -80 -98 -81 -81 -80 -80 -80 -79 -80 -81 -81 -81 -81 -81 -41 -88 -92 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -94 -80 -98 -91 -81 -81 -80 -81 -80 -80 -80 -80 -81 -81 -80 -80 -81 -48 -80 -81 -80 -81 -80 -80 -81 -80 -80 -81 -81 -80 -41 -98 -93 -98 -98 -94 -97 -91 -96 -90 -90 -99 -98 -98 -98 -98 -80 -80 -80 -81 -83 -84 -83 -83 -83 -83 -83 -83 -84 -84 -98 -83 -84 -84 -84 -83 -83 -83 -83 -83 -84 -83 -83 -85 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -40 -93 -83 -83 -84 -83 -82 -83 -83 -83 -83 -83 -83 -83 -40 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -85 -98 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -84 -83 -83 -84 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -79 -95 -90 -94 -41 -83 -82 -83 -81 -83 -81 -83 -83 -83 -83 -83 -82 -84 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -85 -83 -93 -96 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -52 -84 -83 -83 -83 -83 -83 -83 -84 -84 -83 -83 -83 -99 -84 -84 -84 -84 -83 -83 -83 -83 -84 -84 -84 -83 -98 -98 -98 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -67 -83 -83 -83 -83 -83 -84 -84 -84 -84 -80 -83 -82 -91 -92 -90 -91 -90 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -76 -80 -80 -81 -81 -81 -81 -80 -80 -81 -80 -81 -80 -70 -80 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -97 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -81 -80 -41 -99 -98 -98 -99 -98 -98 -99 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -41 -98 -98 -97 -84 -97 -90 -91 -80 -80 -80 -81 -80 -80 -80 -81 -80 -80 -81 -80 -80 -81 -81 -80 -81 -80 -80 -80 -80 -81 -80 -80 -63 -90 -98 -94 -99 -98 -98 -92 -98 -98 -98 -89 -98 -99 -96 -84 -80 -81 -80 -80 -81 -80 -81 -81 -80 -81 -80 -80 -40 -81 -81 -80 -81 -80 -80 -81 -81 -81 -81 -80 -80 -56 -98 -80 -81 -81 -81 -81 -80 -80 -81 -81 -80 -80 -81 -41 -88 -80 -80 -80 -80 -80 -81 -81 -81 -81 -81 -81 -81 -98 -82 -93 -98 -92 -91 -92 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -98 -98 -99 -80 -81 -81 -81 -81 -80 -81 -81 -81 -81 -80 -81 -87 -93 -96 -97 -80 -80 -80 -81 -81 -80 -80 -80 -80 -81 -80 -80 -56 -93 -93 -93 -93 -93 -93 -93 -93 -93 -93 -93 -97 -98 -99 -98 -98 -87 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -75 -81 -80 -80 -81 -80 -81 -80 -81 -81 -80 -80 -80 -41 -87 -87 -86 -86 -98 -98 -98 -82 -80 -80 -81 -80 -81 -80 -80 -81 -80 -81 -81 -80 -99 -94 -93 -83 -84 -72 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -83 -83 -83 -84 -84 -83 -84 -83 -83 -83 -83 -61 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -86 -80 -80 -80 -80 -80 -80 -80 -79 -79 -80 -80 -73 -91 -99 -93 -98 -79 -80 -80 -81 -80 -80 -81 -81 -80 -80 -80 -81 -91 -60 -91 -91 -92 -92 -81 -80 -80 -81 -80 -80 -81 -80 -80 -81 -81 -80 -98 -83 -83 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -92 -82 -83 -82 -82 -82 -82 -83 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -91 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -80 -80 -80 -81 -80 -80 -80 -79 -80 -79 -81 -78 -81 -81 -80 -81 -79 -81 -81 -81 -81 -81 -81 -81 -98 -91 -99 -83 -83 -82 -82 -82 -83 -83 -82 -83 -83 -83 -82 -99 -98 -89 -82 -82 -83 -82 -82 -82 -82 -83 -82 -82 -83 -70 -95 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -83 -82 -43 -67 -82 -82 -82 -83 -82 -82 -83 -82 -82 -82 -82 -82 -99 -82 -82 -82 -83 -82 -83 -83 -83 -82 -81 -81 -83 -93 -82 -82 -82 -82 -83 -82 -83 -82 -82 -82 -80 -80 -85 -80 -80 -80 -80 -80 -81 -81 -79 -80 -81 -80 -81 -91 -91 -93 -91 -98 -84 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -82 -97 -89 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -99 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -40 -98 -98 -94 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -83 -83 -83 -83 -83 -83 -98 -98 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -53 -77 -86 -88 -87 -86 -92 -98 -98 -98 -88 -98 -92 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -99 -99 -98 -98 -98 -96 -94 -83 -98 -98 -98 -98 -84 -84 -84 -83 -84 -83 -83 -83 -83 -82 -83 -81 -85 -80 -80 -81 -80 -80 -81 -92 -82 -83 -83 -83 -83 -83 -94 -82 -82 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -81 -81 -94 -95 -68 -43 -83 -83 -83 -83 -83 -83 -94 -92 -83 -83 -83 -81 -83 -82 -83 -83 -83 -83 -83 -83 -47 -98 -71 -91 -92 -91 -91 -95 -90 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -98 -95 -97 -91 -83 -83 -83 -84 -83 -83 -98 -83 -83 -84 -83 -83 -83 -98 -83 -83 -83 -83 -83 -84 -99 -98 -93 -98 -99 -93 -98 -98 -98 -93 -98 -99 -98 -98 -97 -98 -97 -83 -83 -82 -83 -82 -82 -83 -77 -83 -84 -84 -84 -84 -81 -81 -80 -80 -80 -80 -80 -99 -91 -98 -88 -91 -94 -92 -98 -98 -91 -95 -99 -81 -81 -80 -80 -80 -81 -97 -98 -86 -92 -93 -99 -85 -84 -84 -84 -84 -84 -48 -94 -82 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -62 -84 -84 -84 -84 -83 -84 -95 -84 -84 -84 -84 -84 -84 -98 -98 -98 -98 -85 -84 -84 -84 -84 -84 -54 -96 -84 -84 -84 -83 -83 -83 -98 -92 -98 -96 -98 -86 -98 -98 -99 -98 -94 -92 -98 -95 -99 -89 -94 -92 -91 -92 -91 -92 -92 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -93 -99 -98 -80 -80 -80 -80 -80 -80 -98 -85 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -71 -98 -98 -98 -98 -98 -93 -91 -95 -94 -96 -91 -92 -98 -93 -93 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -83 -84 -83 -83 -83 -83 -98 -80 -80 -80 -80 -81 -80 -81 -80 -80 -80 -80 -80 -85 -84 -86 -97 -86 -86 -90 -88 -85 -85 -85 -86 -92 -96 -98 -91 -91 -91 -90 -93 -95 -91 -93 -92 -96 -98 -80 -80 -81 -81 -81 -80 -98 -80 -50 -82 -83 -80 -81 -81 -80 -80 -80 -80 -80 -81 -80 -80 -81 -98 -81 -80 -80 -81 -81 -81 -56 -83 -84 -84 -83 -83 -83 -93 -96 -83 -83 -83 -82 -82 -82 -99 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -98 -91 -83 -83 -83 -83 -82 -78 -98 -98 -98 -98 -96 -92 -89 -89 -91 -92 -82 -82 -82 -82 -83 -82 -85 -98 -82 -82 -83 -82 -83 -83 -93 -96 -98 -98 -98 -99 -98 -83 -83 -83 -83 -83 -83 -77 -93 -83 -99 -88 -98 -99 -98 -98 -99 -93 -91 -98 -99 -95 -93 -93 -98 -88 -98 -98 -93 -98 -98 -99 -99 -99 -94 -93 -99 -99 -91 -91 -91 -98 -93 -98 -93 -98 -98 -83 -83 -83 -82 -83 -83 -97 -80 -80 -80 -80 -81 -81 -87 -80 -81 -81 -81 -81 -80 -98 -98 -98 -98 -88 -98 -88 -89 -89 -86 -85 -86 -98 -81 -81 -81 -81 -80 -81 -92 -81 -80 -81 -81 -81 -81 -83 -91 -84 -84 -84 -84 -83 -84 -92 -98 -83 -83 -83 -83 -83 -83 -98 -85 -99 -83 -83 -98 -96 -83 -83 -83 -83 -83 -83 -93 -98 -88 -98 -98 -98 -98 -98 -97 -83 -83 -83 -83 -83 -83 -76 -83 -83 -83 -83 -83 -83 -99 -98 -92 -91 -93 -98 -86 -99 -98 -98 -98 -83 -83 -83 -82 -83 -83 -98 -81 -81 -80 -80 -80 -80 -81 -81 -80 -81 -81 -81 -52 -83 -84 -84 -83 -83 -83 -98 -98 -84 -90 -90 -94 -71 -83 -83 -83 -83 -83 -82 -82 -93 -84 -83 -83 -83 -83 -82 -59 -98 -98 -83 -83 -83 -83 -83 -82 -93 -82 -83 -83 -83 -83 -83 -78 -91 -90 -98 -98 -98 -98 -98 -98 -98 -86 -98 -88 -94 -87 -98 -98 -93 -98 -83 -83 -83 -83 -83 -83 -99 -83 -81 -81 -82 -81 -82 -87 -88 -95 -87 -88 -82 -83 -82 -82 -82 -82 -87 -80 -80 -80 -80 -79 -79 -87 -87 -89 -98 -98 -83 -80 -81 -81 -81 -81 -81 -87 -83 -83 -93 -80 -84 -90 -94 -81 -98 -81 -81 -81 -81 -81 -81 -81 -80 -81 -80 -80 -81 -92 -81 -81 -81 -81 -81 -81 -95 -95 -96 -97 -98 -84 -84 -84 -84 -84 -84 -99 -98 -97 -98 -98 -99 -84 -84 -84 -84 -84 -84 -98 -88 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -83 -81 -84 -84 -84 -85 -84 -98 -98 -98 -94 -94 -85 -86 -89 -88 -88 -94 -93 -93 -93 -93 -93 -95 -92 -98 -88 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -99 -84 -83 -84 -84 -84 -84 -84 -84 -82 -84 -84 -84 -96 -98 -84 -84 -84 -84 -83 -83 -83 -83 -82 -84 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -79 -89 -87 -88 -87 -84 -91 -98 -88 -85 -84 -84 -84 -85 -85 -86 -85 -85 -97 -95 -86 -98 -96 -97 -98 -92 -82 -88 -97 -86 -90 -92 -92 -97 -98 -98 -98 -98 -98 -94 -90 -84 -84 -82 -89 -98 -87 -88 -88 -98 -98 -93 -98 -88 -92 -98 -97 -88 -80 -83 -85 -83 -80 -82 -88 -85 -84 -89 -84 -85 -85 -82 -79 -85 -80 -85 -80 -80 -79 -84 -85 -86 -85 -85 -86 -94 -98 -98 -98 -50 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -82 -83 -83 -83 -84 -83 -83 -80 -89 -87 -98 -98 -98 -86 -84 -83 -84 -83 -83 -81 -79 -80 -81 -84 -82 -41 -82 -89 -83 -87 -87 -86 -91 -90 -91 -90 -94 -89 -93 -84 -84 -83 -83 -83 -82 -83 -82 -80 -82 -83 -84 -83 -93 -83 -90 -90 -93 -83 -82 -83 -83 -83 -82 -83 -81 -83 -83 -83 -82 -91 -86 -90 -90 -87 -86 -87 -89 -82 -91 -87 -90 -91 -90 -91 -91 -89 -90 -88 -92 -91 -92 -92 -83 -92 -91 -88 -84 -84 -85 -84 -83 -84 -84 -84 -84 -81 -82 -84 -96 -80 -81 -80 -79 -80 -79 -79 -81 -81 -80 -80 -81 -85 -84 -98 -54 -84 -83 -85 -84 -84 -84 -84 -84 -81 -81 -81 -84 -98 -99 -84 -84 -84 -83 -83 -84 -84 -84 -84 -84 -84 -84 -80 -84 -83 -90 -98 -95 -85 -92 -90 -99 -98 -84 -90 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -80 -81 -98 -98 -41 -84 -84 -83 -84 -84 -84 -84 -84 -82 -83 -84 -84 -41 -80 -83 -83 -83 -83 -83 -83 -83 -83 -80 -83 -83 -91 -91 -84 -83 -82 -82 -82 -81 -81 -82 -81 -82 -81 -83 -41 -79 -98 -80 -80 -81 -80 -80 -81 -81 -80 -80 -80 -80 -80 -98 -99 -72 -80 -80 -80 -80 -80 -80 -80 -81 -80 -81 -80 -87 -98 -82 -82 -82 -83 -83 -81 -82 -83 -83 -83 -81 -81 -41 -82 -83 -82 -82 -82 -82 -83 -81 -83 -82 -80 -82 -94 -80 -80 -80 -80 -81 -80 -79 -79 -79 -80 -79 -79 -98 -95 -89 -80 -89 -91 -98 -92 -93 -91 -84 -86 -91 -99 -94 -89 -92 -94 -83 -84 -96 -98 -83 -98 -98 -94 -82 -99 -81 -86 -78 -79 -82 -81 -81 -80 -81 -81 -81 -81 -80 -80 -55 -84 -79 -80 -80 -80 -80 -80 -80 -81 -81 -80 -81 -80 -86 -86 -96 -95 -94 -97 -88 -84 -86 -83 -83 -84 -81 -84 -84 -84 -84 -81 -83 -81 -82 -88 -88 -99 -41 -80 -81 -81 -81 -81 -81 -81 -81 -80 -79 -80 -79 -84 -84 -83 -82 -83 -82 -83 -82 -82 -81 -82 -82 -82 -59 -75 -90 -90 -93 -94 -92 -93 -92 -98 -84 -99 -99 -93 -98 -83 -83 -82 -83 -83 -83 -83 -82 -83 -82 -83 -83 -46 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -91 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -83 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -91 -98 -98 -95 -90 -91 -98 -91 -88 -88 -86 -88 -88 -88 -88 -88 -98 -97 -87 -87 -82 -91 -93 -93 -93 -93 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -99 -90 -98 -99 -94 -97 -98 -98 -98 -85 -98 -99 -98 -92 -83 -98 -98 -93 -97 -98 -98 -95 -95 -97 -97 -96 -99 -88 -91 -98 -91 -91 -91 -97 -98 -99 -92 -99 -98 -99 -98 -98 -98 -98 -98 -99 -98 -93 -98 -99 -98 -97 -99 -98 -98 -98 -98 -98 -98 -92 -99 -93 -85 -97 -98 -98 -98 -91 -92 -96 -98 -84 -98 -98 -98 -98 -99 -91 -98 -92 -91 -89 -96 -91 -92 -91 -92 -93 -90 -93 -98 -98 -98 -99 -98 -97 -98 -99 -98 -98 -98 -98 -99 -95 -89 -98 -98 -98 -70 -98 -90 -86 -98 -98 -98 -97 -97 -95 -97 -98 -89 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -82 -81 -86 -99 -98 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -35 -91 -35 -91 -77 -91 -98 -35 -98 -91 -98 -99 -98 -98 -86 -98 -99 -98 -98 -98 -98 -65 -98 -95 -85 -98 -98 -98 -99 -98 -94 -98 -98 -91 -98 -98 -96 -98 -97 -98 -97 -98 -98 -98 -99 -98 -98 -98 -91 -97 -99 -99 -98 -99 -99 -94 -91 -91 -92 -98 -98 -98 -99 -98 -98 -98 -98 -99 -93 -98 -98 -98 -99 -99 -98 -98 -98 -98 -91 -98 -98 -93 -97 -98 -99 -98 -98 -98 -97 -98 -98 -86 -98 -98 -91 -98 -98 -98 -99 -85 -94 -97 -91 -92 -92 -90 -93 -98 -99 -98 -98 -95 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -93 -84 -68 -97 -98 -99 -98 -76 -98 -98 -98 -98 -99 -94 -97 -98 -99 -89 -98 -98 -98 -99 -98 -99 -98 -96 -97 -68 -81 -91 -96 -84 -94 -98 -98 -99 -98 -98 -98 -98 -89 -97 -89 -97 -90 -86 -98 -85 -98 -98 -88 -98 -96 -94 -98 -98 -91 -98 -91 -98 -91 -98 -90 -97 -98 -97 -97 -88 -88 -98 -87 -88 -88 -92 -87 -98 -87 -93 -98 -90 -93 -97 -93 -93 -98 -98 -99 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -49 -89 -97 -93 -98 -82 -96 -81 -81 -80 -80 -81 -82 -81 -81 -81 -81 -81 -81 -89 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -83 -85 -98 -93 -99 -94 -98 -92 -98 -98 -98 -98 -87 -98 -86 -97 -88 -85 -99 -81 -98 -98 -98 -98 -99 -98 -98 -99 -81 -86 -86 -87 -81 -98 -97 -99 -97 -84 -85 -98 -98 -98 -98 -98 -98 -98 -75 -81 -89 -86 -90 -86 -84 -88 -85 -91 -96 -98 -96 -99 -99 -98 -98 -98 -98 -98 -84 -85 -86 -91 -91 -89 -101 -86 -99 -98 -98 -87 -84 -86 -84 -84 -92 -96 -98 -96 -86 -86 -95 -87 -98 -98 -98 -35 -92 -65 -91 -98 -80 -35 -98 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -36 -84 -86 -93 -87 -92 -81 -83 -98 -98 -98 -98 -97 -92 -98 -98 -99 -98 -81 -79 -82 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -86 -88 -85 -86 -89 -45 -80 -98 -83 -98 -97 -98 -93 -98 -98 -98 -98 -98 -97 -98 -98 -98 -93 -82 -98 -92 -84 -41 -82 -82 -83 -83 -83 -82 -82 -83 -83 -82 -83 -82 -64 -98 -41 -82 -82 -83 -82 -82 -82 -82 -83 -83 -82 -83 -82 -83 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -98 -99 -98 -97 -98 -99 -94 -92 -98 -98 -92 -98 -97 -98 -98 -98 -98 -96 -98 -88 -98 -99 -97 -98 -98 -99 -99 -98 -98 -94 -98 -90 -91 -92 -91 -92 -98 -91 -98 -98 -92 -93 -98 -98 -98 -98 -98 -98 -99 -99 -96 -98 -81 -99 -92 -99 -98 -98 -98 -98 -98 -92 -93 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -91 -99 -98 -98 -98 -98 -97 -98 -88 -89 -89 -89 -89 -98 -96 -91 -83 -77 -80 -90 -82 -82 -92 -91 -98 -97 -97 -97 -97 -96 -82 -97 -97 -80 -81 -70 -96 -81 -96 -63 -92 -89 -83 -83 -96 -97 -87 -96 -83 -96 -82 -82 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -85 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -58 -98 -98 -85 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -59 -83 -82 -83 -83 -82 -82 -83 -83 -82 -82 -82 -83 -98 -90 -81 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -73 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -91 -91 -91 -91 -91 -92 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -84 -41 -83 -84 -83 -82 -83 -83 -83 -82 -82 -82 -83 -83 -82 -47 -96 -88 -83 -82 -82 -83 -83 -83 -82 -82 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -81 -81 -81 -80 -80 -80 -80 -81 -80 -80 -81 -81 -62 -80 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -91 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -82 -98 -72 -94 -94 -91 -81 -81 -81 -81 -81 -82 -81 -82 -81 -81 -81 -82 -94 -93 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -99 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -82 -81 -80 -81 -81 -80 -80 -81 -81 -80 -81 -81 -41 -91 -91 -91 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -61 -81 -94 -99 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -92 -99 -93 -99 -98 -98 -98 -81 -81 -80 -80 -80 -80 -81 -81 -81 -81 -81 -81 -92 -89 -91 -86 -86 -96 -90 -41 -82 -82 -82 -81 -82 -82 -82 -81 -82 -81 -82 -81 -98 -83 -82 -82 -83 -82 -83 -83 -83 -82 -83 -82 -82 -55 -83 -96 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -82 -83 -89 -82 -82 -83 -83 -83 -82 -83 -83 -83 -83 -82 -83 -96 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -89 -91 -90 -90 -90 -92 -91 -98 -91 -91 -98 -98 -98 -98 -94 -91 -98 -98 -98 -98 -98 -98 -93 -95 -98 -92 -98 -68 -98 -98 -90 -96 -98 -91 -93 -99 -98 -97 -98 -99 -94 -91 -98 -98 -90 -86 -90 -81 -88 -81 -98 -93 -93 -94 -99 -98 -98 -99 -91 -90 -94 -93 -98 -95 -91 -92 -98 -97 -97 -98 -90 -98 -95 -92 -84 -81 -92 -95 -89 -92 -91 -98 -99 -95 -95 -96 -97 -98 -86 -89 -93 -91 -98 -98 -98 -90 -98 -98 -94 -94 -95 -91 -91 -97 -98 -98 -98 -98 -98 -98 -99 -98 -99 -99 -98 -95 -98 -86 -84 -84 -84 -84 -85 -84 -84 -84 -84 -84 -84 -45 -85 -98 -86 -93 -94 -98 -98 -90 -98 -98 -98 -98 -93 -98 -98 -98 -98 -99 -99 -99 -99 -90 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -99 -85 -99 -85 -98 -97 -98 -91 -90 -90 -98 -98 -98 -98 -98 -98 -85 -98 -86 -86 -97 -85 -98 -99 -98 -86 -98 -98 -98 -93 -93 -88 -86 -93 -93 -93 -98 -89 -85 -87 -92 -93 -98 -98 -98 -92 -98 -99 -99 -98 -98 -95 -99 -98 -90 -96 -89 -93 -82 -92 -98 -98 -90 -98 -98 -93 -98 -98 -98 -99 -94 -98 -98 -98 -89 -98 -99 -91 -98 -98 -98 -98 -99 -98 -92 -99 -99 -98 -95 -99 -96 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -99 -91 -95 -99 -91 -95 -91 -98 -98 -98 -91 -98 -98 -91 -98 -98 -98 -96 -98 -85 -85 -86 -86 -96 -98 -97 -98 -97 -84 -94 -92 -94 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -99 -82 -82 -82 -81 -82 -82 -82 -81 -82 -82 -82 -82 -81 -83 -90 -98 -98 -98 -93 -98 -97 -98 -98 -97 -98 -98 -98 -94 -97 -98 -98 -98 -98 -99 -99 -98 -94 -91 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -99 -98 -91 -98 -99 -98 -97 -91 -91 -95 -89 -90 -91 -95 -98 -99 -98 -98 -98 -84 -93 -91 -93 -93 -94 -94 -94 -98 -94 -98 -94 -98 -98 -98 -90 -98 -98 -98 -98 -98 -98 -92 -82 -98 -98 -98 -99 -98 -98 -98 -98 -97 -99 -99 -96 -98 -98 -98 -92 -90 -90 -98 -98 -97 -98 -97 -98 -90 -91 -99 -98 -98 -98 -93 -94 -94 -91 -91 -98 -99 -98 -90 -98 -98 -99 -99 -98 -99 -98 -98 -98 -99 -98 -98 -91 -98 -98 -98 -98 -91 -98 -98 -99 -98 -99 -99 -97 -97 -87 -88 -89 -88 -86 -87 -88 -86 -98 -97 -81 -82 -81 -82 -82 -81 -82 -82 -82 -82 -81 -81 -90 -93 -98 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -48 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -81 -95 -98 -98 -91 -99 -98 -98 -98 -98 -98 -98 -91 -88 -98 -97 -98 -99 -98 -99 -98 -99 -86 -94 -98 -90 -90 -90 -90 -90 -90 -95 -98 -92 -95 -98 -95 -93 -98 -98 -98 -99 -98 -98 -98 -98 -99 -93 -99 -98 -98 -97 -98 -98 -98 -98 -94 -96 -93 -98 -91 -98 -98 -99 -98 -98 -98 -97 -99 -97 -98 -97 -98 -99 -98 -98 -93 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -93 -93 -81 -82 -82 -82 -82 -82 -82 -94 -98 -94 -91 -91 -98 -98 -98 -98 -89 -89 -97 -86 -85 -85 -85 -87 -98 -93 -86 -93 -90 -89 -93 -93 -93 -98 -94 -94 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -94 -82 -98 -90 -83 -99 -98 -98 -99 -92 -98 -91 -98 -95 -98 -98 -98 -89 -98 -98 -98 -98 -98 -98 -98 -98 -82 -82 -82 -82 -82 -81 -81 -81 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -98 -98 -91 -98 -98 -99 -91 -98 -98 -98 -98 -98 -50 -97 -99 -86 -99 -93 -91 -98 -98 -97 -97 -98 -92 -94 -99 -91 -93 -93 -93 -93 -98 -98 -98 -97 -93 -97 -97 -95 -90 -98 -95 -93 -90 -98 -91 -98 -98 -97 -94 -98 -98 -97 -98 -91 -98 -98 -98 -97 -95 -98 -98 -98 -89 -99 -98 -99 -98 -93 -98 -95 -91 -98 -89 -89 -89 -98 -99 -98 -98 -97 -98 -98 -81 -81 -82 -81 -82 -82 -80 -82 -82 -82 -82 -82 -98 -98 -93 -91 -98 -97 -98 -98 -98 -94 -91 -95 -91 -98 -95 -86 -97 -90 -89 -89 -89 -99 -91 -98 -98 -86 -98 -86 -93 -98 -93 -99 -99 -97 -99 -98 -97 -98 -98 -98 -98 -98 -93 -90 -98 -91 -98 -98 -99 -94 -89 -81 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -96 -91 -91 -93 -93 -99 -93 -94 -91 -96 -81 -80 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -98 -91 -98 -99 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -99 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -86 -92 -98 -91 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -66 -91 -93 -90 -90 -90 -90 -92 -90 -90 -90 -90 -90 -80 -81 -80 -78 -81 -81 -81 -81 -81 -81 -81 -81 -54 -92 -89 -89 -94 -98 -97 -98 -89 -90 -84 -86 -97 -97 -98 -98 -98 -97 -98 -98 -99 -98 -97 -94 -98 -98 -98 -98 -97 -98 -98 -97 -98 -88 -89 -89 -89 -89 -89 -88 -89 -89 -90 -90 -92 -88 -86 -87 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -85 -90 -99 -96 -85 -87 -80 -92 -98 -98 -99 -93 -92 -95 -98 -98 -94 -93 -90 -99 -96 -97 -98 -91 -98 -98 -98 -99 -98 -84 -86 -98 -85 -92 -85 -98 -98 -95 -90 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -82 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -41 -98 -97 -85 -86 -97 -86 -89 -98 -93 -98 -98 -98 -86 -93 -97 -89 -93 -93 -93 -93 -99 -98 -93 -99 -99 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -90 -90 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -93 -89 -84 -84 -84 -84 -83 -84 -83 -84 -84 -84 -84 -84 -98 -98 -42 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -91 -93 -99 -98 -98 -98 -98 -99 -90 -98 -98 -98 -93 -99 -93 -92 -98 -98 -98 -98 -98 -98 -85 -97 -92 -88 -89 -86 -98 -98 -99 -98 -84 -93 -90 -91 -99 -98 -98 -98 -93 -98 -95 -99 -98 -98 -92 -98 -97 -98 -98 -98 -98 -98 -94 -86 -81 -98 -99 -97 -95 -98 -92 -98 -98 -93 -93 -96 -92 -92 -98 -89 -93 -88 -98 -94 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -48 -88 -98 -98 -97 -98 -98 -98 -98 -98 -92 -98 -98 -98 -95 -98 -98 -95 -98 -88 -88 -92 -98 -90 -98 -98 -99 -99 -98 -88 -98 -91 -90 -98 -98 -98 -90 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -98 -95 -98 -98 -98 -89 -98 -98 -98 -98 -98 -98 -90 -91 -93 -98 -91 -98 -98 -99 -93 -98 -98 -99 -99 -98 -98 -98 -95 -98 -98 -93 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -92 -98 -96 -96 -95 -96 -98 -97 -98 -97 -91 -88 -88 -90 -98 -98 -94 -94 -98 -92 -86 -93 -93 -93 -98 -99 -98 -98 -96 -96 -86 -98 -96 -98 -98 -94 -98 -93 -99 -90 -91 -98 -80 -98 -98 -91 -96 -99 -98 -99 -99 -98 -98 -96 -90 -90 -95 -98 -98 -96 -98 -98 -98 -89 -99 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -41 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -98 -98 -84 -81 -82 -84 -83 -84 -82 -83 -83 -82 -83 -84 -78 -98 -93 -97 -99 -98 -98 -98 -89 -98 -98 -98 -98 -95 -85 -94 -91 -91 -88 -87 -98 -98 -98 -98 -94 -97 -96 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -95 -98 -98 -98 -93 -99 -99 -98 -98 -98 -99 -99 -98 -96 -98 -87 -97 -98 -99 -85 -84 -98 -88 -98 -94 -98 -98 -84 -93 -98 -98 -87 -97 -84 -98 -98 -87 -88 -88 -96 -88 -86 -88 -88 -88 -93 -87 -88 -86 -87 -89 -98 -93 -95 -98 -98 -98 -98 -98 -98 -95 -98 -97 -98 -99 -98 -95 -97 -84 -92 -98 -92 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -98 -97 -79 -88 -97 -87 -93 -98 -98 -98 -93 -96 -90 -88 -99 -98 -98 -96 -95 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -93 -99 -97 -98 -98 -98 -99 -97 -86 -87 -97 -91 -93 -83 -83 -83 -83 -83 -82 -83 -82 -83 -83 -82 -83 -90 -92 -90 -81 -80 -80 -81 -81 -81 -81 -78 -81 -81 -81 -81 -92 -84 -94 -86 -98 -82 -83 -83 -83 -82 -83 -82 -82 -82 -82 -82 -82 -41 -94 -94 -96 -83 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -71 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -83 -87 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -81 -91 -99 -86 -98 -91 -98 -94 -98 -93 -98 -99 -98 -98 -83 -98 -98 -88 -98 -96 -83 -85 -98 -99 -84 -83 -82 -82 -83 -82 -83 -82 -83 -82 -83 -83 -48 -98 -98 -98 -98 -98 -83 -83 -83 -83 -83 -83 -98 -81 -81 -80 -81 -81 -69 -98 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -80 -81 -86 -91 -85 -80 -81 -81 -81 -81 -81 -80 -81 -81 -80 -80 -80 -82 -81 -81 -81 -81 -81 -81 -80 -81 -80 -80 -80 -49 -40 -88 -93 -93 -93 -94 -64 -93 -86 -84 -84 -84 -84 -84 -84 -84 -84 -82 -84 -83 -84 -98 -81 -85 -98 -95 -92 -66 -84 -84 -84 -84 -84 -84 -82 -84 -84 -84 -84 -84 -96 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -84 -87 -84 -84 -84 -84 -81 -82 -83 -84 -84 -84 -84 -84 -81 -79 -80 -79 -80 -81 -80 -80 -81 -80 -80 -80 -46 -81 -81 -80 -80 -81 -81 -80 -81 -80 -81 -79 -79 -41 -80 -80 -80 -80 -80 -80 -81 -81 -80 -81 -81 -81 -85 -84 -84 -85 -83 -84 -82 -83 -81 -82 -85 -85 -93 -91 -96 -95 -81 -92 -98 -81 -96 -77 -81 -80 -81 -80 -81 -81 -80 -81 -81 -81 -81 -64 -99 -82 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -82 -84 -41 -91 -91 -92 -92 -91 -93 -92 -95 -90 -92 -93 -93 -95 -84 -84 -84 -83 -83 -83 -84 -83 -84 -83 -83 -84 -99 -58 -84 -83 -83 -84 -83 -84 -83 -83 -83 -84 -83 -83 -96 -84 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -54 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -97 -98 -98 -91 -98 -93 -84 -84 -85 -85 -85 -85 -83 -83 -82 -82 -83 -83 -89 -88 -89 -88 -90 -89 -86 -89 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -94 -92 -93 -94 -80 -98 -98 -98 -80 -81 -98 -93 -98 -81 -98 -41 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -83 -84 -84 -83 -84 -83 -84 -84 -79 -83 -83 -84 -84 -83 -45 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -78 -84 -99 -94 -82 -94 -95 -95 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -80 -48 -80 -80 -81 -81 -80 -81 -81 -80 -80 -81 -81 -80 -91 -91 -84 -91 -91 -82 -91 -91 -91 -87 -88 -91 -91 -91 -91 -90 -40 -81 -80 -80 -81 -79 -80 -80 -80 -80 -91 -98 -83 -80 -80 -80 -81 -80 -81 -80 -81 -81 -81 -80 -81 -52 -80 -80 -80 -81 -81 -81 -81 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -97 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -80 -98 -97 -88 -98 -85 -82 -81 -81 -82 -81 -83 -83 -83 -83 -82 -91 -92 -91 -81 -80 -80 -81 -80 -80 -80 -81 -80 -81 -98 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -50 -84 -99 -92 -99 -84 -84 -84 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -41 -84 -83 -83 -84 -84 -83 -84 -83 -83 -84 -81 -84 -70 -83 -84 -84 -84 -83 -83 -84 -83 -83 -84 -84 -83 -91 -47 -75 -40 -99 -91 -98 -98 -83 -74 -40 -84 -84 -84 -84 -84 -82 -84 -83 -83 -84 -84 -83 -76 -84 -84 -84 -84 -83 -83 -83 -83 -84 -84 -84 -84 -93 -52 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -98 -82 -82 -82 -82 -81 -81 -81 -81 -81 -95 -97 -98 -98 -88 -81 -92 -41 -92 -81 -81 -92 -95 -93 -99 -98 -98 -98 -95 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -40 -98 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -83 -61 -83 -84 -84 -83 -83 -83 -82 -83 -83 -98 -98 -98 -98 -95 -95 -98 -98 -98 -97 -98 -99 -94 -98 -81 -98 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -41 -75 -98 -81 -81 -81 -81 -81 -81 -81 -81 -40 -81 -81 -81 -80 -80 -81 -81 -81 -80 -80 -81 -81 -44 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -41 -81 -80 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -72 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -80 -81 -41 -91 -91 -66 -91 -98 -75 -98 -99 -98 -95 -94 -97 -97 -98 -98 -91 -98 -98 -98 -97 -85 -98 -98 -98 -98 -98 -96 -98 -88 -99 -97 -98 -96 -98 -98 -98 -97 -93 -91 -98 -97 -93 -95 -88 -94 -93 -95 -98 -98 -98 -99 -97 -98 -98 -94 -98 -98 -98 -99 -97 -85 -99 -98 -92 -95 -95 -98 -98 -98 -98 -98 -93 -98 -98 -95 -81 -81 -81 -80 -81 -79 -80 -80 -80 -80 -80 -81 -92 -84 -81 -83 -83 -83 -83 -83 -83 -83 -84 -83 -84 -90 -91 -99 -41 -80 -81 -81 -80 -81 -80 -81 -80 -80 -80 -81 -80 -98 -81 -98 -90 -99 -83 -80 -80 -80 -81 -80 -80 -81 -81 -80 -81 -81 -80 -41 -99 -98 -96 -96 -97 -99 -98 -99 -98 -97 -99 -98 -98 -98 -98 -93 -93 -88 -96 -93 -89 -96 -90 -99 -99 -78 -99 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -90 -81 -81 -81 -79 -79 -81 -81 -80 -80 -81 -80 -81 -99 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -98 -82 -82 -83 -83 -83 -83 -82 -83 -82 -83 -83 -83 -96 -92 -80 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -40 -98 -94 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -59 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -82 -82 -83 -83 -81 -82 -81 -81 -83 -83 -82 -81 -96 -88 -98 -91 -86 -88 -97 -85 -87 -98 -86 -86 -86 -98 -98 -98 -98 -98 -89 -87 -94 -85 -85 -99 -98 -98 -94 -93 -98 -98 -98 -94 -92 -98 -99 -98 -98 -98 -86 -95 -97 -81 -86 -96 -97 -99 -98 -94 -94 -87 -83 -83 -82 -83 -83 -83 -82 -83 -83 -83 -83 -76 -78 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -82 -83 -83 -83 -81 -83 -83 -45 -86 -98 -94 -92 -98 -98 -99 -98 -90 -98 -98 -98 -94 -93 -99 -94 -93 -98 -86 -93 -99 -98 -98 -98 -98 -98 -99 -91 -88 -97 -91 -94 -87 -91 -91 -91 -93 -97 -98 -83 -83 -83 -82 -81 -82 -83 -81 -83 -83 -83 -83 -83 -98 -99 -95 -98 -98 -98 -98 -98 -98 -99 -98 -83 -83 -83 -83 -83 -99 -83 -82 -84 -83 -82 -83 -83 -83 -83 -83 -83 -83 -99 -91 -91 -92 -93 -98 -98 -98 -98 -98 -82 -87 -84 -91 -98 -98 -89 -98 -96 -98 -98 -92 -99 -90 -93 -90 -89 -93 -90 -89 -90 -93 -92 -92 -93 -93 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -95 -98 -96 -91 -98 -98 -98 -99 -98 -92 -94 -93 -93 -88 -98 -95 -98 -99 -98 -99 -99 -99 -98 -99 -98 -99 -97 -93 -98 -98 -98 -98 -98 -97 -98 -88 -82 -98 -98 -82 -83 -82 -83 -83 -83 -82 -83 -83 -83 -83 -82 -93 -81 -80 -80 -80 -80 -80 -81 -80 -81 -80 -81 -80 -83 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -79 -80 -77 -81 -81 -77 -82 -82 -81 -88 -86 -85 -91 -98 -83 -83 -83 -83 -83 -82 -83 -83 -81 -82 -83 -83 -83 -89 -98 -97 -88 -98 -83 -90 -91 -92 -93 -83 -83 -82 -83 -82 -83 -83 -82 -82 -82 -83 -83 -41 -86 -88 -83 -81 -83 -83 -82 -83 -83 -81 -83 -83 -83 -83 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -87 -82 -80 -81 -81 -81 -81 -80 -80 -81 -80 -78 -81 -85 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -98 -84 -84 -83 -84 -84 -84 -83 -83 -83 -81 -83 -78 -70 -90 -81 -94 -94 -85 -85 -94 -83 -82 -92 -98 -97 -90 -83 -83 -83 -83 -83 -83 -73 -82 -73 -82 -82 -82 -42 -92 -94 -89 -88 -89 -83 -90 -74 -93 -89 -98 -89 -89 -98 -98 -98 -98 -98 -83 -74 -80 -85 -83 -83 -77 -83 -82 -78 -83 -83 -83 -83 -84 -70 -84 -82 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -91 -90 -90 -89 -94 -63 -90 -78 -84 -94 -93 -93 -85 -93 -93 -93 -97 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -84 -83 -90 -91 -76 -83 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -82 -72 -92 -90 -98 -85 -78 -98 -98 -94 -99 -92 -99 -87 -98 -99 -99 -98 -99 -97 -94 -98 -98 -98 -94 -94 -98 -91 -95 -98 -98 -98 -85 -91 -98 -95 -84 -98 -85 -99 -96 -98 -98 -97 -85 -80 -80 -81 -80 -80 -80 -81 -80 -81 -80 -80 -81 -87 -86 -88 -83 -82 -83 -81 -83 -83 -84 -84 -84 -84 -83 -83 -98 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -91 -87 -85 -98 -92 -98 -90 -85 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -48 -93 -58 -81 -81 -81 -81 -81 -81 -81 -81 -83 -82 -83 -82 -65 -93 -78 -93 -94 -93 -98 -80 -80 -80 -80 -80 -80 -79 -79 -80 -80 -81 -80 -41 -98 -98 -98 -98 -81 -81 -81 -80 -81 -81 -81 -81 -81 -80 -80 -81 -97 -84 -83 -83 -84 -84 -83 -84 -82 -83 -83 -83 -84 -98 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -99 -98 -98 -90 -98 -98 -98 -98 -92 -98 -83 -98 -99 -93 -98 -95 -98 -98 -98 -88 -88 -99 -94 -88 -98 -98 -98 -98 -91 -100 -98 -92 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -98 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -84 -84 -83 -83 -93 -83 -83 -99 -95 -99 -97 -99 -86 -85 -82 -83 -83 -84 -83 -83 -83 -83 -84 -83 -84 -64 -80 -99 -83 -82 -83 -84 -83 -83 -83 -84 -84 -84 -84 -84 -98 -98 -98 -99 -99 -98 -98 -98 -99 -98 -98 -94 -94 -93 -90 -87 -88 -97 -98 -98 -97 -90 -89 -98 -99 -98 -92 -98 -98 -98 -84 -83 -83 -83 -83 -84 -84 -84 -84 -83 -84 -83 -92 -92 -92 -92 -61 -92 -98 -98 -98 -98 -98 -94 -94 -97 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -96 -98 -98 -98 -93 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -83 -84 -84 -82 -84 -84 -82 -83 -84 -84 -84 -93 -92 -92 -92 -92 -90 -99 -98 -92 -90 -98 -96 -98 -93 -87 -89 -91 -98 -98 -99 -85 -83 -83 -83 -82 -83 -82 -82 -82 -82 -84 -84 -83 -95 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -49 -93 -82 -82 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -45 -81 -98 -98 -98 -98 -98 -98 -86 -98 -82 -82 -80 -81 -81 -81 -81 -81 -82 -81 -80 -81 -81 -41 -82 -81 -81 -81 -81 -81 -81 -81 -81 -82 -82 -81 -41 -98 -99 -98 -98 -98 -98 -92 -96 -98 -98 -98 -99 -98 -98 -98 -98 -92 -98 -98 -98 -81 -81 -80 -82 -81 -80 -82 -81 -81 -81 -81 -81 -93 -98 -83 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -84 -83 -84 -83 -84 -83 -83 -41 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -83 -48 -98 -84 -83 -83 -84 -84 -84 -83 -83 -83 -83 -83 -84 -98 -98 -99 -98 -98 -98 -98 -99 -98 -98 -91 -92 -94 -92 -98 -99 -98 -92 -98 -98 -97 -98 -90 -98 -97 -98 -85 -89 -87 -86 -98 -98 -98 -98 -92 -82 -81 -83 -83 -83 -83 -83 -83 -83 -84 -83 -82 -92 -91 -98 -81 -81 -81 -81 -81 -81 -82 -82 -84 -84 -84 -84 -84 -84 -84 -86 -98 -99 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -84 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -95 -82 -81 -82 -82 -81 -82 -82 -80 -81 -81 -81 -82 -41 -91 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -84 -98 -83 -83 -83 -83 -84 -84 -83 -84 -84 -84 -84 -84 -93 -98 -81 -92 -99 -92 -81 -82 -82 -82 -82 -81 -82 -81 -82 -82 -81 -81 -82 -98 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -81 -82 -82 -81 -82 -82 -81 -81 -81 -82 -82 -82 -81 -81 -96 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -95 -84 -84 -84 -84 -83 -83 -84 -82 -83 -82 -82 -82 -84 -83 -83 -83 -84 -84 -83 -83 -84 -84 -83 -83 -40 -93 -81 -81 -82 -82 -81 -81 -81 -81 -81 -81 -82 -81 -98 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -98 -93 -96 -93 -95 -90 -92 -86 -96 -85 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -98 -98 -98 -98 -99 -98 -98 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -97 -81 -80 -81 -81 -81 -82 -81 -81 -81 -81 -80 -81 -90 -92 -94 -92 -91 -92 -99 -98 -98 -98 -99 -98 -98 -98 -92 -98 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -97 -92 -93 -98 -98 -85 -84 -84 -84 -82 -84 -84 -84 -84 -84 -84 -84 -92 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -77 -98 -98 -93 -98 -92 -99 -98 -92 -92 -99 -98 -98 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -84 -84 -84 -83 -82 -84 -84 -84 -84 -84 -84 -83 -90 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -40 -98 -81 -98 -87 -98 -98 -99 -97 -84 -95 -95 -98 -98 -98 -99 -99 -98 -98 -98 -99 -91 -98 -98 -83 -82 -84 -84 -85 -84 -82 -84 -84 -84 -85 -84 -98 -84 -84 -84 -84 -85 -84 -84 -84 -85 -84 -84 -84 -62 -85 -85 -85 -85 -84 -85 -84 -84 -84 -85 -84 -85 -98 -40 -98 -98 -98 -98 -98 -98 -99 -98 -92 -99 -98 -85 -98 -99 -98 -98 -99 -98 -98 -98 -92 -93 -85 -84 -85 -85 -85 -84 -84 -85 -85 -85 -85 -84 -41 -92 -93 -92 -41 -93 -95 -85 -85 -85 -85 -84 -84 -84 -84 -85 -85 -84 -82 -85 -86 -85 -85 -85 -85 -85 -83 -85 -85 -84 -85 -85 -41 -50 -98 -85 -85 -85 -85 -84 -85 -85 -84 -85 -85 -84 -85 -98 -98 -98 -98 -98 -84 -83 -84 -85 -85 -84 -85 -85 -85 -84 -84 -85 -84 -85 -85 -84 -84 -84 -41 -98 -89 -83 -81 -82 -82 -82 -78 -83 -85 -85 -85 -84 -85 -41 -86 -41 -93 -98 -97 -91 -97 -98 -98 -98 -96 -98 -97 -98 -98 -92 -98 -98 -92 -98 -92 -98 -99 -85 -84 -85 -84 -84 -84 -84 -85 -85 -84 -85 -85 -92 -93 -91 -82 -82 -82 -80 -82 -81 -81 -81 -80 -80 -82 -81 -98 -87 -86 -86 -86 -86 -84 -84 -84 -85 -84 -84 -84 -84 -86 -84 -84 -85 -84 -84 -85 -84 -85 -84 -84 -84 -85 -92 -92 -94 -93 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -81 -87 -88 -86 -85 -81 -86 -98 -97 -92 -90 -82 -82 -80 -82 -81 -82 -82 -82 -82 -82 -81 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -81 -81 -82 -81 -82 -86 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -78 -85 -85 -82 -83 -83 -85 -84 -85 -85 -84 -85 -85 -61 -81 -82 -82 -82 -82 -82 -82 -80 -82 -81 -82 -81 -98 -58 -84 -83 -84 -83 -84 -84 -83 -84 -83 -84 -84 -85 -86 -84 -84 -84 -84 -84 -84 -85 -84 -84 -84 -85 -48 -94 -96 -97 -86 -87 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -84 -84 -88 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -93 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -82 -82 -81 -82 -82 -81 -82 -81 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -82 -45 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -81 -82 -41 -45 -93 -93 -93 -97 -99 -82 -82 -81 -82 -81 -81 -82 -82 -81 -82 -82 -82 -98 -98 -52 -98 -98 -98 -98 -91 -98 -95 -99 -98 -97 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -99 -91 -97 -93 -99 -88 -98 -92 -88 -88 -97 -88 -89 -89 -89 -88 -88 -98 -81 -82 -82 -81 -82 -81 -82 -82 -82 -82 -82 -82 -51 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -93 -91 -90 -91 -98 -94 -91 -86 -82 -82 -82 -81 -82 -82 -82 -82 -81 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -91 -98 -98 -98 -94 -93 -90 -91 -98 -98 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -93 -93 -94 -92 -88 -92 -85 -96 -92 -94 -96 -93 -85 -94 -98 -98 -98 -98 -91 -98 -82 -80 -81 -81 -81 -82 -82 -82 -82 -94 -94 -82 -81 -43 -81 -82 -81 -81 -81 -81 -82 -82 -81 -82 -82 -82 -81 -90 -81 -81 -81 -81 -82 -82 -82 -82 -81 -81 -81 -84 -98 -98 -98 -81 -81 -81 -82 -81 -81 -81 -82 -81 -81 -81 -80 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -80 -58 -85 -80 -81 -81 -81 -80 -80 -81 -80 -81 -80 -81 -81 -92 -97 -98 -84 -84 -84 -84 -85 -84 -84 -84 -84 -84 -84 -84 -93 -93 -92 -84 -94 -94 -93 -94 -86 -94 -98 -84 -90 -97 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -83 -84 -95 -94 -98 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -83 -87 -94 -94 -92 -97 -98 -98 -94 -98 -98 -40 -95 -100 -98 -97 -98 -87 -98 -98 -98 -92 -98 -99 -98 -93 -91 -97 -91 -94 -93 -93 -98 -96 -92 -92 -98 -98 -92 -91 -97 -91 -99 -98 -98 -98 -98 -98 -100 -93 -84 -98 -97 -97 -98 -98 -98 -94 -87 -89 -97 -94 -92 -92 -98 -98 -89 -98 -98 -98 -99 -92 -99 -98 -98 -99 -98 -93 -98 -97 -95 -98 -98 -99 -98 -98 -96 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -92 -94 -96 -98 -93 -98 -98 -98 -93 -98 -98 -95 -98 -87 -87 -92 -92 -95 -98 -94 -95 -98 -86 -88 -95 -95 -90 -98 -98 -92 -98 -98 -98 -97 -98 -98 -90 -89 -93 -97 -99 -98 -98 -98 -98 -89 -98 -92 -93 -98 -98 -90 -99 -98 -94 -98 -98 -95 -99 -98 -97 -98 -88 -98 -98 -98 -93 -95 -99 -98 -98 -98 -92 -98 -98 -99 -94 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -98 -99 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -92 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -41 -82 -81 -82 -82 -81 -81 -82 -82 -81 -81 -82 -82 -56 -93 -92 -98 -98 -82 -81 -81 -81 -82 -82 -82 -82 -80 -81 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -95 -82 -82 -82 -79 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -42 -84 -84 -84 -84 -84 -84 -84 -85 -85 -84 -85 -57 -98 -98 -82 -82 -81 -82 -82 -81 -82 -82 -82 -82 -80 -82 -41 -81 -82 -81 -80 -81 -80 -82 -81 -82 -82 -82 -81 -88 -91 -84 -85 -84 -84 -85 -85 -84 -84 -85 -85 -85 -85 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -41 -94 -94 -85 -96 -86 -98 -95 -83 -84 -84 -85 -84 -84 -84 -84 -84 -84 -83 -84 -42 -69 -85 -85 -84 -84 -84 -84 -84 -82 -84 -82 -83 -85 -83 -82 -84 -84 -84 -84 -84 -84 -85 -83 -84 -84 -84 -81 -64 -86 -91 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -91 -84 -86 -82 -84 -81 -85 -85 -85 -85 -84 -85 -84 -84 -84 -97 -96 -98 -82 -81 -82 -80 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -92 -97 -97 -85 -85 -85 -83 -85 -85 -84 -85 -85 -85 -85 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -84 -41 -85 -47 -85 -84 -85 -85 -85 -84 -85 -85 -85 -84 -84 -66 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -40 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -99 -82 -82 -82 -82 -81 -80 -82 -82 -82 -82 -82 -82 -98 -86 -85 -85 -84 -84 -84 -85 -85 -85 -85 -85 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -88 -66 -95 -98 -97 -98 -86 -98 -86 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -61 -85 -85 -84 -85 -84 -84 -84 -85 -84 -84 -84 -84 -55 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -98 -98 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -83 -84 -84 -83 -84 -84 -84 -84 -84 -91 -90 -92 -90 -91 -91 -98 -98 -93 -98 -98 -98 -99 -98 -94 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -54 -85 -91 -91 -84 -99 -84 -84 -84 -84 -84 -84 -83 -84 -82 -84 -84 -83 -97 -85 -98 -84 -81 -84 -84 -84 -83 -83 -84 -84 -82 -84 -81 -98 -84 -83 -84 -84 -83 -84 -84 -84 -84 -83 -84 -83 -48 -86 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -64 -84 -82 -83 -84 -84 -84 -84 -84 -83 -84 -84 -82 -45 -92 -90 -91 -97 -91 -92 -94 -92 -92 -92 -83 -82 -83 -97 -82 -82 -95 -84 -83 -41 -95 -87 -92 -84 -83 -84 -84 -83 -84 -84 -84 -83 -83 -84 -84 -83 -84 -83 -42 -83 -84 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -98 -93 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -71 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -82 -82 -82 -97 -93 -81 -81 -82 -81 -81 -81 -81 -94 -85 -92 -99 -99 -98 -98 -98 -91 -98 -97 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -80 -81 -90 -82 -82 -82 -82 -82 -82 -80 -81 -82 -81 -82 -84 -65 -98 -96 -81 -82 -83 -81 -83 -83 -82 -83 -82 -82 -82 -82 -83 -81 -82 -83 -83 -83 -82 -83 -83 -82 -83 -83 -96 -92 -98 -83 -83 -83 -82 -83 -82 -83 -83 -83 -83 -82 -83 -91 -93 -94 -83 -81 -81 -82 -81 -81 -81 -81 -81 -82 -81 -81 -66 -82 -82 -81 -82 -81 -81 -81 -81 -82 -81 -81 -81 -82 -98 -94 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -96 -94 -86 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -98 -98 -99 -98 -98 -83 -82 -82 -82 -82 -82 -81 -82 -82 -81 -81 -82 -82 -100 -84 -83 -80 -80 -80 -81 -81 -82 -82 -82 -81 -82 -81 -82 -93 -91 -94 -83 -82 -83 -82 -83 -83 -83 -83 -83 -82 -83 -83 -98 -98 -83 -82 -81 -82 -82 -82 -82 -82 -81 -81 -81 -81 -82 -95 -85 -82 -96 -93 -99 -92 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -81 -93 -83 -87 -93 -88 -91 -82 -82 -82 -80 -82 -81 -82 -80 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -80 -81 -82 -82 -82 -82 -82 -46 -75 -98 -91 -81 -82 -82 -82 -82 -82 -82 -80 -80 -80 -81 -81 -92 -93 -92 -93 -95 -91 -93 -92 -98 -98 -98 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -85 -84 -93 -75 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -41 -84 -84 -84 -84 -83 -83 -84 -84 -84 -84 -83 -84 -56 -98 -82 -84 -82 -83 -84 -84 -82 -83 -77 -83 -84 -83 -98 -84 -84 -83 -84 -84 -84 -83 -84 -84 -84 -82 -83 -71 -91 -98 -93 -98 -97 -96 -84 -85 -86 -88 -88 -88 -88 -93 -82 -80 -81 -81 -81 -81 -79 -81 -80 -81 -81 -81 -96 -92 -92 -91 -96 -84 -98 -68 -83 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -81 -98 -84 -98 -98 -81 -95 -84 -91 -93 -88 -98 -98 -96 -84 -83 -83 -83 -83 -83 -83 -83 -84 -84 -83 -83 -50 -98 -83 -84 -83 -82 -83 -82 -84 -84 -81 -84 -83 -83 -93 -81 -81 -81 -81 -81 -81 -81 -79 -81 -81 -81 -80 -99 -87 -80 -80 -82 -82 -81 -81 -82 -82 -82 -82 -80 -81 -89 -84 -81 -84 -83 -83 -84 -84 -83 -84 -84 -84 -84 -92 -92 -81 -93 -99 -97 -41 -82 -82 -82 -82 -81 -81 -82 -82 -82 -82 -81 -81 -85 -85 -79 -81 -81 -81 -81 -81 -82 -83 -83 -83 -83 -83 -83 -85 -52 -83 -83 -84 -83 -83 -83 -83 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -81 -83 -82 -83 -83 -82 -41 -83 -83 -82 -80 -83 -82 -83 -83 -83 -83 -83 -83 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -40 -99 -98 -99 -81 -94 -84 -84 -83 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -41 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -82 -96 -87 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -70 -75 -83 -83 -83 -84 -83 -83 -83 -77 -83 -83 -83 -84 -83 -84 -83 -84 -84 -83 -84 -81 -83 -83 -83 -83 -48 -88 -83 -82 -81 -83 -83 -83 -83 -83 -83 -83 -83 -83 -93 -93 -93 -93 -93 -94 -99 -99 -98 -99 -98 -98 -93 -84 -98 -98 -98 -98 -84 -83 -84 -84 -84 -84 -83 -84 -83 -83 -83 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -50 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -81 -82 -83 -84 -84 -84 -84 -84 -84 -82 -82 -82 -84 -83 -92 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -79 -79 -49 -88 -86 -81 -80 -80 -80 -80 -80 -80 -81 -81 -81 -82 -81 -97 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -87 -93 -95 -84 -98 -99 -97 -98 -98 -98 -91 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -91 -86 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -59 -84 -83 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -41 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -83 -84 -98 -84 -84 -85 -84 -84 -84 -83 -84 -83 -84 -83 -84 -98 -98 -81 -79 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -78 -94 -92 -92 -92 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -97 -45 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -81 -86 -84 -84 -85 -84 -84 -85 -85 -84 -84 -85 -85 -86 -81 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -81 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -62 -84 -85 -85 -84 -84 -85 -84 -81 -82 -82 -81 -83 -86 -80 -81 -81 -81 -81 -81 -80 -80 -81 -81 -82 -81 -92 -89 -90 -95 -99 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -95 -95 -84 -91 -95 -91 -90 -87 -86 -93 -92 -90 -97 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -76 -84 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -95 -84 -84 -84 -84 -91 -86 -92 -92 -92 -92 -85 -84 -84 -84 -84 -84 -84 -85 -85 -84 -84 -85 -82 -92 -88 -85 -85 -85 -85 -84 -84 -85 -83 -85 -84 -84 -66 -98 -85 -84 -84 -85 -84 -85 -85 -84 -84 -84 -84 -85 -93 -85 -84 -84 -84 -85 -85 -85 -84 -84 -85 -85 -85 -49 -94 -92 -84 -85 -84 -84 -85 -85 -85 -84 -85 -85 -85 -85 -82 -82 -82 -82 -82 -82 -82 -81 -81 -80 -80 -82 -98 -93 -41 -86 -84 -85 -85 -85 -84 -85 -85 -85 -85 -85 -84 -86 -85 -85 -85 -85 -85 -85 -85 -85 -85 -85 -85 -91 -98 -98 -98 -80 -98 -98 -82 -82 -82 -81 -82 -82 -82 -82 -82 -81 -81 -81 -96 -98 -98 -98 -97 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -59 -86 -85 -85 -85 -85 -85 -85 -85 -84 -85 -85 -85 -77 -83 -84 -84 -84 -84 -83 -84 -83 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -92 -99 -88 -94 -91 -91 -91 -91 -94 -92 -92 -92 -99 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -77 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -98 -98 -51 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -89 -81 -82 -82 -82 -82 -84 -82 -83 -83 -84 -83 -83 -92 -94 -98 -98 -96 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -66 -91 -83 -87 -88 -98 -97 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -61 -99 -78 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -99 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -99 -98 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -81 -82 -81 -80 -82 -82 -81 -80 -80 -96 -98 -82 -83 -84 -84 -83 -83 -84 -83 -81 -83 -82 -83 -71 -83 -84 -84 -84 -84 -83 -84 -83 -83 -83 -84 -84 -97 -98 -84 -83 -84 -84 -83 -83 -84 -84 -84 -84 -84 -84 -83 -83 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -91 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -81 -81 -82 -82 -82 -82 -82 -82 -80 -81 -82 -82 -91 -92 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -59 -93 -99 -98 -98 -98 -98 -98 -92 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -91 -86 -84 -84 -84 -84 -84 -84 -83 -84 -83 -83 -84 -46 -98 -98 -84 -84 -84 -94 -98 -98 -98 -98 -96 -96 -92 -87 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -95 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -84 -98 -41 -98 -98 -92 -98 -84 -98 -42 -98 -98 -91 -98 -88 -82 -82 -83 -89 -81 -80 -53 -81 -89 -89 -89 -89 -81 -81 -81 -81 -81 -80 -81 -81 -82 -82 -81 -81 -96 -95 -84 -83 -84 -84 -84 -81 -84 -85 -84 -83 -84 -85 -82 -85 -99 -84 -84 -95 -85 -97 -86 -82 -62 -81 -81 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -95 -81 -82 -81 -82 -81 -81 -82 -82 -82 -82 -81 -81 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -99 -84 -84 -84 -84 -84 -84 -84 -84 -83 -82 -84 -84 -84 -84 -84 -84 -84 -84 -82 -83 -83 -83 -83 -83 -41 -89 -89 -90 -92 -91 -92 -91 -90 -92 -92 -92 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -96 -83 -84 -84 -84 -84 -84 -84 -84 -84 -80 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -57 -81 -81 -81 -81 -81 -82 -80 -80 -81 -82 -80 -81 -86 -98 -82 -81 -81 -81 -81 -81 -81 -81 -82 -81 -82 -81 -58 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -84 -85 -84 -84 -84 -84 -83 -84 -84 -84 -84 -82 -84 -46 -95 -89 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -83 -84 -84 -84 -84 -84 -84 -84 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -85 -85 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -85 -84 -84 -84 -84 -82 -83 -83 -83 -83 -84 -83 -83 -99 -83 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -96 -92 -85 -84 -83 -83 -83 -83 -84 -84 -84 -84 -83 -84 -84 -41 -95 -84 -84 -83 -83 -83 -83 -84 -84 -83 -84 -83 -83 -83 -84 -83 -82 -83 -84 -84 -84 -84 -84 -84 -84 -68 -82 -80 -81 -81 -81 -81 -81 -80 -80 -80 -80 -80 -80 -81 -98 -93 -90 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -41 -95 -98 -98 -100 -92 -84 -97 -96 -99 -92 -93 -84 -84 -83 -83 -84 -84 -84 -84 -83 -84 -83 -84 -64 -83 -84 -80 -83 -84 -84 -84 -84 -84 -84 -84 -84 -53 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -97 -80 -80 -81 -81 -80 -81 -80 -81 -81 -80 -81 -80 -88 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -96 -81 -81 -81 -81 -80 -81 -81 -82 -81 -80 -81 -81 -41 -93 -94 -94 -94 -94 -93 -93 -80 -81 -81 -81 -81 -75 -80 -80 -75 -81 -81 -80 -41 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -97 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -41 -98 -96 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -99 -84 -84 -84 -84 -84 -83 -83 -83 -84 -84 -84 -84 -68 -83 -82 -83 -83 -83 -83 -83 -83 -84 -84 -84 -84 -98 -94 -58 -84 -84 -84 -84 -83 -84 -83 -83 -83 -84 -84 -83 -99 -98 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -81 -83 -95 -89 -94 -90 -98 -98 -98 -98 -98 -87 -87 -84 -87 -87 -98 -88 -87 -87 -99 -84 -86 -86 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -60 -84 -88 -97 -98 -98 -98 -98 -98 -99 -98 -87 -94 -91 -91 -93 -93 -93 -93 -94 -93 -93 -94 -93 -93 -99 -98 -98 -96 -94 -98 -97 -98 -91 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -92 -98 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -42 -94 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -86 -67 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -94 -84 -84 -84 -84 -82 -84 -84 -83 -84 -84 -84 -84 -98 -81 -81 -80 -80 -81 -81 -81 -81 -81 -81 -81 -80 -82 -80 -80 -80 -81 -80 -81 -81 -81 -81 -81 -80 -57 -81 -88 -91 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -81 -86 -87 -84 -82 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -73 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -73 -79 -81 -81 -81 -81 -81 -95 -84 -84 -82 -84 -84 -84 -41 -84 -84 -84 -84 -85 -84 -81 -85 -41 -81 -81 -82 -81 -81 -82 -81 -56 -97 -98 -98 -98 -99 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -82 -81 -63 -99 -98 -98 -98 -99 -98 -98 -99 -99 -98 -99 -98 -98 -98 -98 -98 -98 -93 -98 -98 -98 -91 -98 -88 -88 -90 -94 -90 -89 -89 -88 -92 -98 -84 -98 -93 -98 -89 -93 -81 -81 -81 -81 -81 -81 -98 -85 -85 -85 -84 -84 -85 -98 -84 -84 -84 -84 -84 -84 -55 -84 -84 -92 -97 -98 -98 -98 -99 -98 -95 -90 -98 -87 -88 -87 -88 -99 -99 -87 -87 -91 -82 -82 -82 -82 -84 -84 -80 -81 -80 -80 -80 -80 -87 -87 -92 -96 -81 -81 -81 -81 -81 -82 -80 -82 -82 -82 -81 -81 -82 -88 -98 -98 -95 -97 -81 -82 -82 -81 -81 -82 -98 -85 -85 -82 -85 -84 -85 -56 -84 -84 -84 -84 -82 -84 -94 -92 -92 -92 -92 -93 -94 -92 -92 -93 -94 -92 -92 -92 -91 -89 -92 -93 -81 -81 -81 -81 -81 -81 -91 -98 -82 -82 -81 -82 -81 -82 -97 -96 -95 -84 -84 -84 -84 -84 -84 -84 -84 -84 -81 -84 -84 -76 -94 -84 -84 -84 -84 -84 -85 -84 -85 -84 -84 -84 -85 -98 -81 -81 -81 -81 -81 -81 -81 -82 -82 -82 -82 -82 -62 -91 -91 -95 -91 -91 -95 -98 -98 -98 -98 -98 -82 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -88 -88 -86 -84 -85 -85 -85 -85 -84 -79 -97 -98 -99 -98 -98 -98 -98 -98 -98 -82 -82 -81 -82 -81 -82 -81 -81 -97 -99 -85 -98 -99 -99 -95 -91 -94 -91 -95 -82 -81 -81 -82 -82 -82 -98 -85 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -53 -81 -81 -81 -81 -81 -80 -87 -87 -85 -92 -89 -93 -89 -98 -95 -92 -98 -94 -94 -98 -83 -99 -88 -94 -86 -87 -98 -92 -92 -98 -88 -89 -98 -90 -91 -48 -84 -82 -84 -83 -83 -83 -84 -83 -81 -83 -83 -83 -89 -91 -95 -91 -87 -91 -91 -81 -81 -81 -81 -81 -81 -90 -90 -95 -98 -92 -90 -86 -86 -62 -82 -80 -80 -81 -80 -74 -81 -80 -81 -81 -81 -82 -88 -84 -82 -84 -83 -84 -84 -49 -83 -84 -84 -83 -83 -84 -84 -80 -81 -81 -81 -81 -81 -98 -99 -98 -98 -98 -84 -84 -84 -84 -84 -84 -85 -84 -84 -85 -84 -84 -84 -91 -82 -82 -81 -82 -82 -81 -46 -81 -81 -81 -82 -82 -82 -98 -85 -85 -85 -83 -85 -82 -98 -99 -84 -84 -84 -84 -84 -85 -85 -85 -84 -84 -85 -84 -41 -84 -84 -84 -84 -84 -82 -84 -82 -83 -84 -81 -82 -81 -82 -81 -81 -84 -85 -84 -84 -93 -79 -82 -82 -82 -81 -82 -87 -84 -84 -84 -84 -84 -84 -90 -89 -96 -82 -83 -85 -81 -81 -81 -82 -81 -81 -80 -89 -98 -97 -95 -84 -88 -89 -89 -89 -93 -86 -91 -91 -91 -91 -92 -90 -89 -85 -85 -84 -84 -84 -84 -84 -84 -84 -85 -85 -85 -41 -92 -85 -85 -85 -84 -84 -84 -84 -91 -85 -85 -85 -85 -84 -79 -90 -84 -84 -85 -85 -84 -84 -97 -96 -96 -95 -97 -98 -98 -98 -97 -84 -84 -85 -84 -84 -84 -85 -84 -85 -84 -84 -84 -61 -97 -98 -98 -97 -97 -98 -97 -85 -84 -85 -84 -84 -85 -91 -84 -82 -83 -84 -84 -84 -88 -90 -90 -89 -89 -90 -99 -90 -89 -90 -89 -90 -98 -88 -88 -89 -88 -89 -89 -89 -89 -85 -82 -82 -82 -82 -82 -84 -80 -81 -80 -79 -79 -79 -85 -96 -84 -85 -83 -83 -83 -83 -83 -84 -98 -82 -81 -82 -81 -81 -81 -48 -80 -81 -81 -81 -81 -81 -89 -84 -83 -84 -85 -85 -85 -98 -88 -89 -89 -87 -89 -90 -85 -84 -85 -85 -85 -85 -84 -86 -85 -85 -85 -84 -83 -81 -80 -81 -80 -81 -81 -80 -89 -81 -81 -81 -82 -82 -82 -89 -85 -84 -83 -85 -85 -84 -90 -80 -81 -81 -81 -81 -80 -87 -87 -88 -87 -87 -52 -87 -93 -82 -81 -81 -81 -82 -81 -81 -93 -88 -84 -84 -84 -84 -84 -83 -87 -89 -83 -84 -85 -85 -80 -81 -85 -85 -81 -81 -81 -79 -81 -81 -98 -97 -72 -86 -86 -84 -84 -84 -84 -85 -85 -85 -85 -85 -85 -85 -85 -84 -85 -85 -85 -85 -41 -85 -85 -85 -85 -85 -85 -85 -84 -84 -85 -85 -84 -99 -86 -85 -85 -84 -84 -85 -99 -85 -84 -84 -84 -84 -83 -89 -88 -90 -90 -90 -90 -90 -95 -99 -87 -88 -92 -89 -88 -90 -90 -90 -90 -96 -86 -85 -86 -85 -85 -85 -85 -84 -85 -84 -85 -85 -84 -98 -98 -90 -84 -83 -83 -84 -83 -85 -84 -84 -84 -84 -84 -84 -84 -81 -84 -85 -85 -79 -79 -81 -79 -80 -80 -80 -80 -80 -81 -80 -80 -85 -85 -85 -84 -84 -84 -84 -84 -82 -81 -82 -76 -82 -83 -82 -84 -98 -84 -84 -83 -84 -84 -83 -84 -83 -84 -83 -84 -83 -85 -84 -84 -85 -82 -82 -82 -82 -82 -82 -84 -84 -59 -81 -79 -80 -79 -79 -79 -82 -80 -80 -80 -80 -80 -84 -86 -87 -92 -87 -87 -89 -88 -88 -88 -88 -90 -89 -83 -90 -80 -98 -98 -98 -98 -90 -84 -96 -90 -81 -81 -81 -82 -82 -81 -80 -82 -82 -82 -82 -81 -82 -98 -82 -82 -82 -82 -82 -81 -81 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -55 -82 -82 -82 -80 -82 -81 -82 -82 -81 -81 -81 -81 -98 -82 -81 -82 -80 -80 -81 -81 -81 -81 -80 -83 -83 -81 -81 -81 -81 -80 -91 -92 -96 -98 -88 -97 -99 -94 -98 -41 -84 -83 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -85 -84 -40 -85 -84 -85 -84 -84 -84 -85 -84 -84 -84 -84 -84 -50 -93 -86 -85 -99 -86 -83 -84 -84 -81 -84 -84 -83 -83 -83 -84 -84 -83 -85 -81 -84 -84 -84 -82 -84 -84 -83 -83 -83 -84 -41 -89 -54 -91 -83 -84 -84 -84 -84 -84 -84 -85 -84 -84 -84 -83 -84 -47 -84 -85 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -97 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -98 -82 -81 -80 -82 -81 -81 -82 -81 -82 -82 -82 -82 -54 -98 -81 -98 -85 -98 -80 -81 -81 -81 -81 -81 -81 -80 -80 -81 -80 -80 -57 -89 -89 -81 -80 -81 -81 -81 -81 -82 -82 -81 -81 -82 -81 -89 -84 -85 -85 -84 -84 -84 -84 -84 -85 -84 -84 -85 -84 -98 -98 -85 -93 -98 -98 -85 -84 -84 -84 -84 -83 -84 -84 -83 -84 -84 -84 -99 -98 -98 -84 -84 -84 -83 -83 -85 -83 -84 -84 -84 -84 -84 -98 -98 -92 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -82 -82 -82 -81 -81 -81 -81 -80 -81 -81 -82 -81 -41 -91 -96 -91 -91 -89 -91 -98 -98 -81 -82 -81 -82 -80 -81 -81 -81 -81 -81 -81 -81 -89 -89 -94 -92 -48 -92 -95 -82 -81 -81 -81 -81 -81 -82 -81 -81 -81 -82 -81 -73 -96 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -82 -41 -81 -82 -82 -82 -81 -81 -81 -81 -81 -81 -82 -81 -99 -82 -82 -81 -82 -81 -82 -82 -81 -82 -80 -81 -82 -85 -84 -84 -84 -84 -84 -84 -84 -85 -84 -85 -84 -98 -83 -84 -84 -84 -84 -84 -84 -84 -83 -83 -83 -83 -89 -84 -84 -84 -84 -84 -82 -84 -84 -84 -83 -83 -84 -89 -84 -84 -84 -84 -85 -84 -84 -83 -83 -84 -83 -84 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -85 -97 -99 -83 -84 -84 -84 -84 -85 -84 -84 -84 -84 -82 -82 -84 -87 -83 -85 -80 -85 -85 -84 -84 -84 -84 -84 -84 -84 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -97 -81 -81 -81 -80 -81 -81 -81 -82 -81 -81 -82 -81 -88 -84 -83 -83 -83 -83 -83 -82 -82 -80 -83 -84 -84 -89 -88 -92 -89 -89 -90 -98 -81 -81 -81 -80 -81 -81 -81 -82 -81 -81 -81 -82 -82 -96 -81 -81 -82 -82 -81 -81 -81 -81 -80 -82 -81 -82 -81 -82 -80 -81 -81 -81 -81 -81 -82 -82 -81 -81 -81 -81 -82 -82 -82 -98 -85 -84 -85 -83 -81 -84 -85 -84 -85 -85 -84 -84 -86 -81 -81 -81 -81 -81 -83 -81 -84 -84 -82 -80 -82 -82 -89 -83 -84 -84 -83 -83 -83 -83 -83 -84 -84 -83 -84 -98 -81 -81 -81 -81 -81 -79 -81 -81 -81 -81 -81 -81 -98 -96 -84 -85 -84 -84 -84 -84 -81 -84 -83 -84 -82 -85 -83 -80 -41 -84 -83 -84 -83 -84 -84 -84 -84 -85 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -70 -83 -83 -83 -83 -84 -84 -84 -84 -83 -83 -85 -83 -87 -84 -84 -82 -85 -84 -84 -83 -84 -84 -84 -84 -84 -98 -98 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -90 -90 -88 -90 -93 -94 -96 -96 -85 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -99 -84 -84 -85 -85 -84 -84 -84 -84 -85 -84 -84 -85 -95 -97 -98 -84 -84 -84 -84 -84 -84 -84 -85 -84 -84 -84 -84 -97 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -84 -85 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -56 -47 -81 -82 -83 -84 -83 -83 -84 -84 -84 -84 -83 -84 -84 -84 -83 -83 -84 -83 -84 -84 -82 -84 -84 -84 -57 -99 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -94 -98 -98 -97 -93 -95 -98 -96 -94 -89 -98 -84 -84 -84 -84 -82 -83 -84 -84 -84 -84 -84 -84 -41 -82 -83 -83 -83 -82 -84 -84 -84 -84 -84 -82 -84 -90 -81 -79 -80 -80 -80 -80 -80 -81 -80 -81 -81 -80 -99 -86 -98 -98 -90 -89 -91 -93 -96 -98 -89 -98 -91 -91 -98 -91 -91 -89 -98 -85 -89 -89 -91 -88 -88 -88 -90 -88 -86 -89 -89 -96 -99 -86 -88 -92 -86 -99 -85 -92 -98 -84 -84 -84 -84 -84 -84 -80 -84 -84 -84 -83 -84 -41 -84 -82 -84 -82 -82 -82 -83 -84 -84 -84 -84 -82 -83 -91 -83 -82 -84 -82 -83 -84 -83 -81 -81 -83 -84 -84 -82 -97 -98 -80 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -99 -98 -79 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -80 -80 -84 -81 -81 -82 -82 -82 -82 -82 -81 -81 -82 -83 -83 -84 -80 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -90 -91 -84 -85 -91 -86 -88 -84 -89 -88 -81 -94 -98 -97 -53 -84 -84 -82 -82 -83 -84 -84 -83 -83 -83 -83 -83 -90 -88 -97 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -82 -84 -81 -82 -81 -81 -82 -83 -84 -84 -82 -81 -81 -81 -85 -57 -94 -81 -81 -81 -81 -81 -81 -81 -80 -89 -89 -89 -87 -93 -93 -93 -56 -83 -81 -82 -83 -83 -84 -82 -82 -84 -83 -83 -83 -86 -84 -88 -88 -88 -88 -83 -83 -82 -83 -83 -81 -82 -83 -82 -82 -84 -84 -86 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -80 -98 -99 -98 -98 -98 -97 -98 -98 -85 -84 -84 -84 -83 -84 -84 -83 -84 -83 -84 -83 -60 -84 -84 -83 -83 -83 -84 -84 -81 -81 -83 -81 -82 -53 -93 -98 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -54 -98 -91 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -41 -82 -79 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -61 -92 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -84 -99 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -85 -84 -83 -83 -83 -84 -83 -83 -84 -83 -83 -83 -41 -80 -84 -84 -82 -82 -83 -83 -83 -84 -84 -83 -84 -41 -69 -84 -83 -83 -83 -84 -83 -84 -84 -83 -83 -84 -83 -64 -93 -84 -87 -84 -84 -84 -84 -84 -84 -83 -83 -83 -82 -82 -83 -80 -80 -80 -80 -81 -79 -80 -80 -81 -80 -81 -81 -83 -82 -83 -83 -83 -83 -83 -84 -83 -84 -83 -83 -84 -98 -87 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -71 -83 -84 -84 -84 -83 -83 -82 -84 -83 -83 -84 -84 -99 -83 -83 -82 -83 -83 -84 -83 -83 -84 -83 -84 -84 -98 -91 -99 -81 -81 -81 -81 -81 -81 -81 -79 -80 -80 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -98 -98 -98 -95 -85 -91 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -41 -98 -84 -83 -84 -84 -84 -83 -84 -84 -84 -83 -84 -84 -84 -84 -84 -83 -80 -83 -83 -84 -79 -84 -84 -84 -99 -84 -84 -84 -84 -84 -84 -84 -84 -82 -82 -82 -84 -84 -82 -83 -83 -81 -83 -81 -82 -83 -82 -83 -82 -41 -83 -82 -83 -83 -83 -83 -83 -83 -83 -81 -82 -83 -87 -86 -91 -86 -86 -92 -92 -95 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -78 -83 -91 -83 -84 -83 -82 -84 -82 -82 -84 -82 -84 -84 -84 -99 -99 -80 -80 -81 -81 -81 -80 -80 -81 -80 -80 -80 -80 -68 -99 -87 -87 -98 -87 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -83 -98 -84 -81 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -41 -82 -82 -82 -83 -81 -81 -82 -82 -82 -82 -82 -81 -85 -85 -82 -83 -82 -84 -82 -82 -84 -84 -84 -82 -81 -82 -95 -98 -91 -85 -82 -81 -81 -81 -81 -81 -80 -81 -83 -89 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -98 -98 -41 -80 -80 -80 -81 -81 -80 -81 -81 -80 -80 -80 -81 -82 -89 -99 -90 -91 -85 -99 -99 -79 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -87 -89 -89 -92 -86 -87 -92 -88 -92 -90 -86 -86 -84 -86 -86 -92 -92 -93 -92 -92 -92 -94 -92 -92 -92 -94 -80 -84 -88 -82 -98 -89 -91 -98 -81 -89 -91 -93 -98 -97 -99 -98 -98 -96 -98 -98 -98 -98 -99 -99 -73 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -73 -83 -84 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -85 -84 -84 -84 -80 -81 -81 -81 -82 -81 -81 -82 -52 -81 -82 -82 -82 -82 -82 -81 -82 -83 -83 -83 -83 -89 -92 -98 -98 -97 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -98 -91 -95 -94 -81 -81 -81 -81 -81 -81 -81 -82 -81 -82 -81 -81 -96 -97 -91 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -45 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -98 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -80 -81 -89 -80 -81 -80 -81 -80 -81 -81 -80 -80 -81 -81 -81 -84 -83 -83 -83 -83 -84 -84 -84 -84 -84 -84 -84 -61 -83 -82 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -98 -48 -82 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -84 -41 -86 -82 -83 -82 -82 -84 -83 -83 -83 -83 -84 -84 -83 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -87 -87 -88 -64 -82 -82 -83 -83 -83 -83 -84 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -80 -81 -82 -82 -81 -84 -84 -41 -99 -83 -83 -84 -83 -83 -83 -83 -83 -83 -84 -83 -83 -78 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -96 -98 -96 -84 -82 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -82 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -92 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -98 -94 -91 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -98 -84 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -41 -83 -82 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -88 -99 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -82 -83 -83 -83 -83 -83 -83 -84 -84 -84 -83 -83 -84 -84 -84 -83 -83 -83 -84 -83 -84 -84 -83 -84 -41 -83 -83 -83 -83 -83 -83 -83 -82 -82 -81 -81 -81 -81 -82 -69 -85 -86 -86 -86 -81 -80 -80 -81 -81 -80 -81 -81 -81 -80 -81 -81 -92 -83 -84 -90 -94 -93 -87 -85 -86 -88 -95 -86 -99 -98 -90 -85 -98 -71 -83 -80 -82 -82 -83 -83 -83 -83 -82 -83 -83 -81 -89 -83 -83 -84 -82 -82 -83 -83 -83 -84 -82 -83 -83 -94 -83 -84 -84 -80 -83 -83 -83 -83 -84 -80 -82 -82 -58 -84 -83 -82 -83 -83 -83 -83 -81 -82 -83 -83 -83 -44 -84 -83 -83 -83 -83 -83 -84 -82 -83 -84 -83 -81 -82 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -80 -91 -98 -98 -81 -81 -81 -81 -80 -81 -81 -80 -81 -81 -81 -81 -81 -90 -81 -81 -80 -81 -80 -81 -81 -81 -81 -81 -81 -88 -98 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -80 -81 -80 -81 -81 -81 -81 -80 -81 -81 -93 -84 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -85 -85 -83 -82 -82 -81 -83 -81 -81 -81 -81 -82 -81 -82 -85 -84 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -84 -85 -85 -88 -98 -96 -90 -90 -97 -91 -83 -84 -85 -85 -85 -86 -84 -98 -98 -98 -98 -97 -84 -99 -95 -83 -84 -99 -96 -98 -98 -98 -93 -97 -98 -98 -87 -98 -83 -98 -95 -83 -98 -98 -83 -92 -83 -96 -83 -89 -98 -90 -98 -99 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -56 -83 -83 -83 -83 -83 -83 -82 -83 -82 -83 -83 -83 -89 -92 -91 -91 -92 -92 -91 -92 -92 -92 -91 -92 -91 -91 -91 -91 -91 -92 -91 -91 -91 -92 -91 -91 -92 -91 -92 -88 -87 -88 -89 -91 -92 -92 -91 -91 -91 -91 -91 -91 -90 -91 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -97 -92 -93 -84 -92 -84 -80 -97 -84 -71 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -82 -83 -83 -81 -83 -83 -83 -83 -82 -41 -83 -83 -83 -83 -83 -83 -83 -83 -81 -83 -83 -83 -92 -80 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -99 -92 -84 -84 -84 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -85 -84 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -66 -92 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -51 -94 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -82 -83 -91 -92 -83 -93 -93 -91 -83 -98 -90 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -96 -95 -98 -92 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -56 -82 -81 -81 -81 -82 -82 -82 -82 -82 -81 -81 -82 -51 -81 -81 -81 -81 -81 -80 -81 -81 -80 -81 -80 -79 -85 -97 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -94 -98 -62 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -83 -93 -94 -81 -94 -82 -81 -81 -81 -82 -81 -82 -81 -81 -81 -81 -82 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -73 -82 -82 -81 -82 -82 -82 -80 -81 -81 -82 -82 -82 -99 -99 -98 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -80 -98 -83 -83 -83 -83 -83 -83 -83 -84 -84 -83 -84 -84 -98 -97 -87 -98 -98 -98 -96 -98 -93 -84 -41 -84 -84 -83 -83 -84 -83 -83 -84 -83 -83 -83 -83 -91 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -82 -82 -82 -82 -81 -82 -81 -81 -82 -81 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -80 -81 -80 -85 -85 -85 -97 -83 -98 -97 -89 -94 -81 -81 -81 -81 -81 -82 -82 -81 -82 -81 -81 -82 -56 -81 -82 -81 -81 -82 -81 -81 -81 -81 -81 -82 -82 -81 -81 -73 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -50 -95 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -98 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -71 -83 -83 -83 -84 -84 -83 -84 -83 -83 -83 -83 -84 -94 -94 -94 -94 -94 -94 -94 -95 -94 -94 -94 -94 -94 -94 -94 -95 -93 -99 -82 -81 -81 -81 -81 -81 -82 -81 -81 -82 -81 -81 -50 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -91 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -82 -82 -82 -82 -82 -82 -82 -81 -82 -81 -81 -82 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -86 -82 -82 -82 -82 -82 -82 -83 -83 -83 -83 -82 -85 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -99 -82 -82 -82 -82 -82 -82 -82 -82 -80 -82 -82 -82 -98 -92 -85 -83 -91 -85 -89 -82 -83 -84 -84 -84 -84 -83 -84 -84 -83 -83 -84 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -82 -84 -84 -81 -41 -94 -84 -83 -84 -84 -83 -84 -84 -82 -83 -83 -83 -83 -94 -81 -81 -82 -82 -81 -82 -82 -82 -82 -81 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -70 -82 -98 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -50 -88 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -83 -83 -82 -81 -81 -84 -83 -83 -83 -83 -83 -91 -93 -96 -93 -97 -96 -90 -94 -98 -78 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -93 -92 -84 -83 -83 -83 -83 -84 -84 -84 -83 -84 -83 -83 -53 -94 -84 -83 -82 -83 -83 -84 -84 -83 -84 -84 -84 -84 -41 -99 -82 -83 -83 -84 -84 -84 -83 -84 -83 -83 -83 -83 -91 -83 -83 -84 -83 -84 -83 -83 -83 -84 -83 -83 -81 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -50 -85 -98 -98 -98 -98 -98 -98 -98 -98 -93 -93 -94 -94 -94 -87 -82 -83 -81 -84 -84 -83 -83 -83 -84 -84 -84 -84 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -95 -95 -98 -82 -81 -82 -82 -81 -80 -82 -81 -82 -83 -83 -83 -82 -97 -87 -84 -84 -84 -83 -83 -83 -84 -83 -83 -83 -84 -82 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -41 -91 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -78 -80 -83 -82 -82 -82 -82 -82 -83 -82 -83 -83 -84 -83 -93 -91 -91 -99 -98 -98 -83 -84 -84 -83 -84 -83 -83 -84 -84 -84 -83 -83 -85 -98 -98 -84 -98 -84 -98 -83 -83 -84 -84 -84 -84 -84 -84 -83 -82 -83 -83 -95 -89 -83 -84 -83 -84 -84 -84 -83 -83 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -83 -84 -83 -84 -83 -84 -41 -98 -84 -83 -84 -84 -83 -83 -83 -83 -84 -83 -83 -83 -93 -82 -83 -83 -83 -83 -84 -83 -83 -84 -83 -80 -81 -98 -98 -98 -95 -98 -98 -98 -85 -94 -83 -83 -82 -83 -83 -83 -83 -83 -83 -82 -83 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -98 -98 -77 -97 -99 -99 -98 -92 -97 -97 -97 -98 -98 -89 -98 -98 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -98 -98 -98 -82 -81 -81 -81 -80 -81 -81 -82 -82 -82 -82 -81 -82 -82 -82 -81 -80 -43 -82 -99 -85 -82 -97 -97 -81 -82 -82 -82 -82 -82 -82 -82 -82 -80 -81 -81 -98 -83 -84 -83 -83 -83 -83 -84 -84 -84 -84 -83 -84 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -81 -82 -82 -82 -82 -82 -81 -82 -81 -87 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -91 -82 -81 -82 -81 -82 -81 -82 -81 -82 -82 -82 -82 -41 -93 -93 -93 -94 -94 -93 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -79 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -94 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -81 -81 -82 -81 -82 -81 -81 -81 -81 -41 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -90 -82 -82 -82 -82 -83 -82 -80 -81 -82 -81 -81 -81 -83 -78 -84 -84 -83 -89 -93 -87 -91 -98 -84 -84 -84 -91 -90 -92 -99 -73 -41 -82 -82 -80 -81 -81 -81 -80 -82 -79 -81 -79 -82 -93 -84 -94 -87 -85 -84 -84 -87 -98 -87 -99 -98 -84 -84 -84 -98 -90 -92 -96 -92 -96 -98 -83 -84 -83 -85 -95 -80 -88 -98 -84 -98 -98 -84 -98 -98 -86 -98 -98 -98 -83 -98 -84 -84 -83 -98 -83 -86 -83 -85 -82 -91 -81 -86 -97 -81 -85 -98 -85 -91 -98 -86 -83 -83 -98 -83 -93 -90 -91 -90 -90 -90 -89 -91 -91 -91 -89 -91 -91 -91 -91 -89 -83 -89 -91 -91 -91 -91 -93 -92 -91 -91 -91 -91 -96 -91 -92 -92 -91 -91 -95 -96 -41 -82 -83 -82 -83 -83 -83 -83 -83 -83 -82 -82 -82 -80 -99 -83 -82 -82 -83 -83 -83 -83 -82 -83 -83 -82 -82 -89 -82 -82 -83 -83 -83 -83 -83 -82 -83 -83 -82 -90 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -80 -82 -81 -81 -81 -81 -80 -81 -79 -80 -79 -81 -81 -93 -92 -99 -98 -98 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -93 -98 -98 -96 -95 -82 -85 -91 -82 -98 -82 -82 -82 -82 -82 -83 -82 -82 -82 -83 -82 -82 -41 -63 -82 -83 -83 -82 -82 -82 -83 -82 -82 -82 -83 -83 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -77 -91 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -83 -83 -90 -83 -83 -83 -83 -83 -83 -83 -83 -80 -83 -83 -74 -83 -82 -82 -82 -81 -82 -82 -82 -82 -83 -83 -83 -68 -92 -91 -94 -94 -93 -98 -83 -82 -82 -83 -82 -82 -83 -82 -83 -83 -82 -83 -41 -82 -83 -82 -83 -82 -82 -83 -82 -83 -83 -82 -82 -82 -41 -77 -92 -48 -98 -95 -98 -98 -98 -98 -91 -83 -97 -78 -95 -95 -91 -95 -98 -98 -82 -82 -82 -82 -81 -82 -81 -82 -81 -81 -81 -81 -41 -83 -81 -82 -82 -82 -83 -83 -83 -83 -82 -83 -82 -93 -92 -97 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -82 -81 -81 -94 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -89 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -84 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -98 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -82 -82 -98 -73 -81 -82 -82 -82 -82 -82 -80 -82 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -50 -84 -59 -84 -92 -92 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -46 -84 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -50 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -68 -82 -83 -83 -83 -83 -83 -83 -82 -83 -83 -82 -83 -98 -82 -82 -83 -83 -83 -83 -81 -81 -81 -81 -82 -82 -41 -98 -83 -80 -83 -82 -83 -82 -83 -83 -82 -82 -82 -82 -41 -82 -82 -82 -82 -83 -83 -83 -82 -82 -82 -82 -82 -99 -98 -98 -81 -98 -96 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -72 -81 -81 -81 -81 -82 -81 -81 -81 -81 -82 -82 -82 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -99 -82 -82 -82 -83 -82 -83 -82 -82 -83 -82 -83 -82 -41 -98 -98 -98 -98 -97 -97 -82 -84 -98 -98 -98 -98 -97 -91 -98 -98 -93 -90 -91 -91 -91 -92 -93 -98 -99 -99 -98 -98 -98 -98 -91 -98 -98 -99 -94 -98 -98 -98 -95 -82 -98 -98 -92 -97 -98 -97 -97 -97 -96 -97 -98 -98 -97 -97 -97 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -45 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -56 -82 -82 -82 -82 -82 -82 -83 -83 -83 -83 -82 -80 -85 -79 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -91 -91 -98 -83 -82 -82 -82 -82 -82 -83 -82 -83 -82 -82 -82 -82 -88 -82 -82 -82 -83 -82 -82 -83 -82 -82 -82 -82 -76 -82 -89 -95 -83 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -95 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -83 -82 -82 -83 -82 -82 -82 -82 -83 -83 -99 -80 -80 -81 -80 -80 -81 -80 -81 -80 -80 -81 -79 -83 -83 -83 -83 -83 -91 -82 -81 -82 -82 -82 -82 -82 -80 -82 -82 -82 -82 -87 -82 -82 -81 -82 -82 -82 -82 -81 -82 -82 -82 -82 -67 -92 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -49 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -81 -81 -81 -81 -80 -81 -80 -81 -80 -79 -79 -79 -84 -84 -66 -92 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -99 -98 -96 -96 -90 -91 -91 -97 -95 -82 -94 -99 -82 -82 -82 -96 -96 -98 -92 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -100 -82 -82 -82 -83 -82 -82 -82 -83 -82 -82 -83 -82 -87 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -47 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -91 -92 -92 -93 -91 -92 -92 -92 -92 -92 -92 -94 -92 -92 -83 -91 -91 -82 -83 -85 -84 -80 -85 -80 -82 -82 -82 -82 -83 -82 -83 -82 -82 -82 -92 -81 -81 -80 -81 -81 -81 -81 -81 -80 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -99 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -88 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -74 -85 -80 -80 -81 -81 -81 -81 -81 -81 -80 -80 -80 -81 -89 -87 -90 -82 -82 -82 -81 -81 -82 -82 -83 -83 -82 -82 -82 -97 -98 -98 -98 -41 -81 -81 -81 -81 -81 -76 -82 -81 -81 -82 -81 -82 -81 -91 -98 -88 -90 -81 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -90 -98 -81 -81 -82 -82 -81 -81 -81 -82 -81 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -56 -82 -82 -82 -82 -82 -82 -82 -82 -81 -80 -82 -82 -82 -41 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -45 -40 -93 -40 -93 -40 -94 -98 -98 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -80 -41 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -79 -81 -80 -81 -76 -81 -81 -81 -98 -98 -40 -93 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -96 -82 -82 -82 -82 -81 -81 -81 -82 -82 -83 -82 -83 -96 -96 -91 -81 -81 -81 -81 -81 -81 -81 -79 -81 -81 -81 -81 -91 -91 -93 -94 -81 -81 -81 -82 -81 -81 -82 -81 -81 -82 -81 -82 -90 -82 -82 -82 -82 -82 -81 -81 -98 -81 -79 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -99 -82 -81 -80 -82 -82 -82 -83 -82 -83 -82 -82 -82 -98 -81 -82 -82 -82 -82 -82 -80 -81 -81 -82 -81 -83 -70 -83 -94 -98 -98 -98 -98 -98 -98 -98 -99 -98 -84 -98 -86 -84 -98 -96 -98 -98 -94 -82 -98 -98 -98 -99 -98 -99 -98 -91 -98 -95 -96 -94 -82 -82 -82 -72 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -40 -82 -82 -82 -83 -82 -82 -83 -82 -82 -82 -82 -82 -90 -83 -83 -82 -82 -82 -82 -82 -82 -83 -82 -82 -78 -71 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -86 -82 -82 -82 -83 -81 -82 -82 -82 -82 -82 -82 -82 -91 -90 -93 -98 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -94 -82 -98 -98 -99 -92 -81 -82 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -96 -82 -81 -82 -82 -82 -82 -81 -82 -82 -82 -81 -82 -77 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -63 -98 -82 -83 -83 -82 -82 -83 -83 -82 -82 -83 -83 -82 -76 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -68 -90 -81 -82 -82 -82 -82 -82 -82 -82 -83 -83 -83 -82 -91 -92 -91 -91 -92 -91 -92 -95 -83 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -47 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -95 -82 -82 -82 -82 -82 -80 -80 -80 -80 -80 -82 -82 -41 -55 -81 -83 -82 -82 -82 -82 -83 -82 -82 -82 -83 -70 -91 -92 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -88 -92 -97 -96 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -79 -81 -81 -79 -81 -84 -82 -81 -82 -82 -81 -82 -82 -82 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -79 -82 -81 -81 -81 -81 -79 -84 -98 -81 -83 -83 -82 -83 -82 -82 -82 -83 -83 -83 -83 -98 -98 -98 -98 -82 -81 -82 -81 -81 -82 -81 -81 -82 -82 -82 -82 -41 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -41 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -72 -82 -83 -83 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -68 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -94 -98 -82 -82 -82 -83 -82 -82 -82 -82 -83 -82 -82 -83 -61 -96 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -97 -99 -98 -98 -98 -98 -90 -95 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -56 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -91 -91 -92 -91 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -99 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -85 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -66 -74 -81 -82 -82 -81 -82 -82 -82 -81 -81 -81 -81 -81 -92 -68 -81 -81 -81 -81 -81 -81 -79 -79 -80 -81 -81 -81 -96 -99 -82 -80 -83 -82 -83 -83 -82 -82 -82 -82 -82 -82 -98 -83 -82 -83 -82 -83 -83 -82 -82 -82 -82 -82 -82 -99 -86 -98 -83 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -95 -90 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -61 -83 -82 -60 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -92 -82 -82 -83 -82 -82 -82 -83 -83 -82 -83 -82 -82 -40 -90 -82 -82 -82 -82 -81 -81 -82 -82 -82 -82 -82 -77 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -77 -80 -81 -81 -81 -81 -81 -81 -80 -80 -81 -81 -81 -98 -94 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -93 -83 -82 -83 -82 -82 -83 -83 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -44 -98 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -41 -81 -81 -81 -81 -80 -80 -81 -81 -81 -80 -81 -81 -43 -81 -96 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -98 -83 -83 -82 -83 -83 -83 -83 -83 -83 -82 -82 -82 -91 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -81 -79 -80 -47 -98 -88 -89 -82 -82 -98 -81 -81 -98 -94 -98 -81 -81 -81 -80 -80 -81 -80 -81 -81 -81 -81 -80 -57 -70 -94 -81 -83 -80 -83 -83 -81 -82 -81 -82 -82 -82 -82 -90 -82 -82 -83 -82 -82 -82 -82 -82 -81 -81 -82 -84 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -81 -63 -40 -93 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -98 -91 -82 -82 -82 -82 -82 -83 -82 -82 -82 -83 -82 -82 -82 -98 -98 -88 -82 -82 -83 -82 -82 -83 -83 -82 -82 -83 -82 -75 -82 -83 -83 -82 -82 -82 -82 -82 -82 -83 -82 -80 -99 -81 -81 -82 -81 -81 -82 -82 -83 -83 -83 -81 -82 -93 -93 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -98 -97 -91 -91 -97 -98 -95 -92 -97 -96 -81 -86 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -50 -98 -82 -81 -81 -81 -81 -81 -82 -81 -82 -81 -81 -81 -83 -82 -83 -83 -82 -82 -82 -82 -83 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -81 -83 -83 -82 -48 -66 -83 -83 -83 -82 -83 -83 -82 -82 -82 -83 -82 -82 -41 -99 -82 -82 -82 -83 -82 -83 -82 -82 -82 -83 -83 -82 -95 -82 -83 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -73 -82 -98 -81 -81 -82 -82 -81 -81 -82 -82 -81 -81 -81 -81 -53 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -73 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -53 -81 -82 -82 -82 -82 -82 -82 -82 -81 -83 -83 -82 -47 -83 -98 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -81 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -88 -83 -98 -96 -91 -96 -94 -98 -90 -98 -97 -83 -91 -92 -98 -98 -98 -98 -99 -97 -98 -98 -96 -98 -86 -81 -83 -98 -99 -92 -98 -99 -98 -98 -83 -83 -83 -83 -83 -83 -82 -81 -81 -81 -81 -81 -53 -82 -82 -81 -82 -81 -82 -98 -96 -82 -81 -79 -80 -81 -81 -98 -83 -83 -83 -82 -83 -82 -89 -83 -82 -82 -83 -83 -74 -98 -81 -81 -81 -81 -81 -81 -83 -82 -82 -82 -82 -82 -82 -93 -82 -83 -83 -83 -83 -83 -83 -98 -98 -99 -99 -98 -92 -81 -81 -81 -81 -81 -83 -98 -98 -82 -82 -82 -83 -82 -82 -45 -99 -83 -83 -82 -82 -83 -83 -41 -83 -83 -83 -82 -83 -83 -52 -83 -83 -83 -83 -83 -82 -46 -81 -81 -81 -81 -81 -81 -96 -94 -58 -82 -82 -82 -83 -82 -82 -87 -87 -82 -82 -82 -82 -82 -83 -98 -98 -80 -81 -81 -81 -81 -82 -93 -93 -98 -82 -81 -82 -82 -82 -82 -55 -99 -98 -98 -82 -82 -81 -82 -81 -81 -82 -82 -94 -82 -82 -98 -83 -98 -83 -82 -83 -83 -83 -82 -96 -91 -84 -80 -95 -91 -51 -82 -82 -82 -82 -82 -82 -96 -95 -91 -91 -98 -98 -98 -98 -98 -82 -81 -98 -98 -84 -97 -90 -94 -96 -98 -98 -82 -82 -82 -80 -81 -82 -91 -81 -81 -81 -81 -81 -81 -94 -90 -90 -90 -92 -90 -90 -91 -40 -90 -90 -91 -91 -90 -90 -90 -87 -90 -90 -88 -86 -82 -82 -83 -82 -82 -82 -82 -41 -81 -80 -82 -82 -82 -82 -96 -97 -91 -91 -98 -82 -82 -82 -82 -81 -82 -82 -81 -82 -82 -81 -82 -98 -83 -83 -83 -82 -83 -83 -97 -97 -98 -98 -87 -98 -98 -98 -98 -98 -98 -98 -92 -94 -98 -97 -98 -98 -99 -98 -84 -84 -85 -85 -84 -84 -84 -85 -81 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -85 -98 -98 -92 -99 -98 -83 -99 -98 -99 -98 -98 -98 -98 -99 -98 -98 -98 -98 -91 -98 -90 -82 -83 -82 -82 -82 -82 -88 -83 -83 -83 -83 -83 -89 -98 -80 -81 -81 -81 -81 -81 -98 -99 -98 -82 -82 -82 -81 -82 -80 -99 -83 -98 -81 -81 -82 -81 -81 -82 -79 -99 -94 -98 -91 -81 -81 -81 -81 -81 -82 -82 -81 -80 -81 -81 -81 -85 -82 -82 -83 -83 -81 -82 -97 -92 -92 -92 -92 -92 -92 -92 -99 -98 -87 -81 -81 -81 -80 -75 -82 -81 -81 -82 -81 -81 -81 -92 -97 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -81 -81 -89 -98 -83 -83 -83 -83 -82 -83 -97 -82 -82 -82 -82 -82 -82 -91 -83 -83 -83 -81 -83 -75 -83 -83 -82 -82 -83 -83 -62 -81 -81 -81 -81 -81 -81 -99 -85 -91 -52 -96 -91 -92 -81 -81 -81 -81 -81 -81 -82 -81 -80 -81 -80 -81 -83 -82 -81 -82 -82 -81 -81 -92 -94 -90 -94 -81 -81 -82 -81 -81 -81 -81 -81 -81 -82 -81 -81 -87 -83 -83 -83 -83 -83 -83 -77 -99 -98 -98 -98 -89 -98 -82 -98 -98 -90 -98 -98 -99 -98 -82 -98 -91 -96 -91 -98 -98 -83 -92 -84 -84 -84 -88 -98 -98 -98 -98 -96 -98 -99 -99 -96 -99 -90 -82 -83 -80 -83 -83 -82 -96 -96 -96 -96 -98 -96 -96 -92 -91 -91 -98 -91 -91 -96 -91 -91 -83 -90 -84 -96 -83 -84 -98 -85 -87 -98 -99 -98 -98 -88 -94 -92 -92 -92 -94 -94 -94 -95 -94 -94 -94 -98 -99 -98 -87 -81 -80 -81 -81 -81 -90 -93 -83 -82 -82 -82 -83 -82 -82 -98 -98 -98 -98 -98 -91 -98 -98 -97 -98 -98 -93 -97 -95 -97 -97 -97 -97 -98 -98 -91 -98 -67 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -76 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -92 -91 -83 -82 -83 -82 -82 -83 -98 -97 -82 -80 -79 -81 -79 -79 -88 -85 -82 -90 -84 -84 -84 -83 -84 -94 -94 -98 -98 -82 -92 -95 -98 -98 -97 -98 -90 -82 -98 -52 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -96 -82 -83 -82 -83 -82 -82 -99 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -83 -83 -82 -83 -83 -82 -99 -82 -82 -82 -82 -82 -82 -86 -81 -82 -82 -82 -82 -82 -98 -98 -98 -85 -93 -80 -81 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -52 -91 -91 -91 -91 -91 -91 -91 -89 -91 -91 -91 -90 -91 -54 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -98 -94 -91 -98 -91 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -52 -81 -81 -81 -81 -81 -81 -99 -98 -98 -95 -93 -94 -95 -92 -92 -94 -99 -98 -98 -96 -61 -88 -89 -89 -88 -89 -98 -89 -99 -98 -98 -98 -94 -89 -93 -80 -91 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -93 -81 -99 -81 -98 -98 -98 -98 -96 -91 -99 -99 -96 -89 -98 -90 -88 -93 -93 -98 -90 -98 -87 -99 -98 -98 -98 -98 -99 -90 -89 -96 -99 -98 -98 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -70 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -97 -83 -82 -83 -83 -82 -82 -83 -82 -82 -83 -82 -82 -91 -90 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -80 -81 -80 -80 -81 -81 -80 -80 -81 -81 -95 -91 -91 -91 -91 -91 -85 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -42 -41 -99 -99 -98 -98 -99 -98 -98 -98 -96 -99 -87 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -88 -97 -82 -83 -83 -83 -82 -83 -82 -83 -83 -83 -82 -83 -98 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -81 -82 -88 -82 -82 -82 -81 -82 -82 -82 -82 -82 -83 -82 -82 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -80 -81 -95 -81 -98 -98 -98 -99 -98 -98 -98 -98 -98 -81 -82 -81 -82 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -70 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -48 -97 -98 -99 -99 -87 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -93 -98 -98 -98 -92 -98 -97 -99 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -86 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -97 -86 -81 -80 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -83 -97 -82 -98 -96 -96 -90 -98 -95 -98 -96 -89 -91 -98 -83 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -81 -81 -81 -81 -73 -98 -81 -81 -81 -81 -81 -81 -81 -80 -81 -80 -81 -79 -84 -84 -80 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -88 -41 -98 -98 -82 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -98 -80 -81 -88 -98 -81 -98 -97 -83 -96 -98 -98 -98 -88 -89 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -96 -83 -97 -97 -97 -48 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -80 -81 -81 -81 -80 -81 -81 -81 -81 -82 -81 -81 -81 -41 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -69 -84 -97 -94 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -91 -92 -92 -91 -94 -91 -91 -93 -91 -87 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -91 -98 -81 -81 -82 -81 -82 -82 -82 -81 -81 -81 -82 -81 -96 -90 -98 -81 -82 -81 -82 -82 -82 -81 -82 -81 -82 -81 -82 -98 -82 -81 -81 -81 -81 -81 -79 -81 -80 -81 -81 -82 -41 -98 -92 -98 -98 -98 -81 -81 -81 -81 -81 -80 -80 -80 -80 -81 -81 -80 -88 -88 -81 -81 -81 -83 -83 -83 -83 -83 -82 -82 -83 -83 -98 -87 -95 -99 -80 -83 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -51 -82 -98 -98 -82 -83 -82 -82 -82 -82 -83 -83 -82 -82 -82 -83 -97 -96 -97 -99 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -82 -82 -82 -82 -81 -82 -81 -82 -82 -81 -81 -81 -82 -82 -83 -82 -82 -82 -83 -82 -82 -82 -82 -82 -41 -82 -82 -83 -82 -82 -83 -82 -82 -83 -82 -80 -82 -90 -87 -91 -91 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -83 -98 -98 -98 -98 -94 -98 -99 -81 -82 -82 -81 -81 -82 -82 -82 -81 -82 -81 -81 -82 -81 -81 -81 -82 -82 -81 -81 -82 -82 -81 -81 -48 -92 -82 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -85 -81 -81 -81 -82 -82 -81 -81 -81 -81 -81 -81 -61 -98 -88 -92 -89 -80 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -92 -92 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -83 -99 -82 -82 -83 -82 -83 -82 -82 -83 -82 -82 -82 -82 -41 -83 -82 -82 -83 -82 -83 -82 -83 -82 -82 -83 -82 -99 -98 -98 -98 -99 -98 -98 -99 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -82 -82 -81 -82 -81 -82 -41 -82 -81 -56 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -91 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -40 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -47 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -82 -82 -82 -80 -81 -80 -83 -80 -83 -82 -83 -66 -98 -84 -94 -90 -92 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -99 -98 -92 -98 -82 -98 -98 -99 -93 -98 -80 -98 -81 -96 -82 -82 -82 -82 -81 -82 -82 -81 -81 -81 -81 -81 -49 -98 -98 -98 -98 -90 -98 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -96 -82 -82 -82 -81 -81 -82 -82 -81 -82 -81 -81 -81 -99 -82 -98 -98 -98 -88 -99 -98 -82 -81 -81 -82 -81 -82 -80 -81 -81 -81 -81 -82 -41 -91 -91 -92 -92 -92 -92 -92 -92 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -97 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -44 -95 -82 -82 -82 -82 -82 -83 -82 -83 -82 -82 -83 -82 -98 -83 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -53 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -93 -99 -91 -98 -98 -97 -98 -44 -79 -80 -80 -80 -80 -81 -80 -81 -81 -81 -79 -81 -88 -98 -81 -81 -82 -81 -81 -82 -82 -82 -81 -81 -81 -81 -98 -81 -82 -81 -81 -81 -81 -81 -81 -81 -82 -82 -81 -98 -95 -83 -82 -83 -82 -82 -83 -83 -82 -82 -82 -82 -82 -82 -82 -42 -95 -82 -82 -83 -82 -82 -82 -83 -83 -82 -82 -83 -82 -98 -83 -85 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -60 -91 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -83 -99 -94 -89 -95 -98 -98 -98 -98 -98 -98 -98 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -40 -91 -89 -91 -91 -93 -98 -61 -83 -82 -82 -83 -82 -82 -82 -82 -82 -82 -83 -82 -97 -83 -83 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -62 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -97 -82 -82 -82 -82 -83 -82 -83 -82 -82 -82 -82 -82 -96 -40 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -40 -90 -82 -82 -80 -81 -80 -80 -80 -81 -81 -82 -81 -79 -85 -82 -81 -81 -81 -81 -81 -81 -81 -82 -82 -82 -82 -48 -92 -96 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -98 -90 -98 -96 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -72 -85 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -90 -83 -82 -83 -82 -82 -81 -81 -83 -80 -81 -81 -80 -41 -82 -81 -87 -84 -84 -92 -91 -84 -93 -93 -93 -83 -93 -94 -81 -49 -81 -81 -82 -81 -81 -82 -84 -82 -74 -98 -81 -97 -98 -99 -81 -99 -98 -97 -96 -96 -98 -94 -98 -91 -91 -98 -91 -98 -98 -98 -98 -97 -81 -96 -96 -96 -91 -40 -98 -97 -96 -98 -81 -81 -81 -82 -81 -82 -82 -81 -81 -81 -81 -81 -98 -98 -83 -82 -83 -83 -82 -83 -83 -82 -81 -83 -82 -83 -92 -82 -83 -82 -83 -82 -83 -81 -81 -81 -81 -81 -82 -89 -82 -82 -81 -82 -81 -82 -82 -82 -83 -82 -83 -83 -92 -92 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -96 -81 -82 -99 -98 -83 -98 -98 -81 -81 -79 -81 -81 -81 -81 -82 -82 -81 -81 -82 -86 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -63 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -83 -82 -82 -82 -82 -82 -80 -83 -83 -83 -83 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -83 -83 -83 -82 -83 -83 -83 -41 -94 -83 -83 -82 -82 -83 -83 -82 -82 -82 -82 -82 -83 -41 -95 -82 -82 -82 -83 -82 -82 -83 -83 -82 -83 -83 -82 -82 -61 -97 -98 -82 -45 -97 -71 -92 -81 -47 -99 -97 -78 -97 -98 -98 -100 -98 -98 -98 -98 -99 -98 -98 -97 -91 -97 -98 -81 -81 -81 -81 -81 -81 -81 -82 -82 -81 -81 -80 -80 -81 -81 -81 -81 -81 -81 -82 -80 -81 -81 -82 -96 -91 -83 -82 -82 -82 -82 -82 -83 -82 -83 -83 -82 -83 -44 -91 -82 -82 -82 -82 -82 -83 -82 -82 -83 -82 -83 -82 -83 -83 -83 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -93 -98 -98 -94 -98 -99 -98 -99 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -83 -82 -92 -83 -83 -82 -82 -82 -82 -82 -83 -83 -82 -82 -82 -92 -82 -82 -83 -82 -83 -83 -82 -82 -83 -83 -80 -80 -41 -83 -82 -82 -82 -82 -82 -83 -81 -83 -83 -82 -82 -41 -92 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -99 -83 -83 -82 -82 -83 -82 -83 -82 -83 -82 -82 -83 -82 -52 -82 -95 -92 -82 -82 -82 -83 -83 -82 -82 -82 -82 -98 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -83 -83 -83 -83 -82 -82 -82 -82 -82 -82 -83 -83 -48 -83 -96 -80 -81 -91 -92 -94 -94 -94 -99 -98 -98 -94 -98 -41 -81 -81 -82 -81 -81 -81 -81 -82 -82 -81 -81 -81 -91 -91 -96 -96 -92 -88 -82 -82 -82 -82 -81 -82 -81 -82 -82 -81 -82 -82 -98 -81 -81 -96 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -82 -83 -83 -83 -82 -82 -83 -82 -82 -83 -83 -83 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -80 -41 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -41 -84 -93 -95 -94 -94 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -95 -97 -82 -83 -82 -82 -83 -82 -82 -82 -82 -83 -83 -83 -96 -83 -83 -82 -82 -82 -83 -83 -82 -82 -83 -82 -82 -90 -82 -82 -82 -82 -83 -82 -82 -82 -82 -83 -82 -83 -96 -82 -82 -82 -82 -83 -83 -82 -83 -82 -82 -82 -82 -82 -84 -81 -80 -80 -80 -80 -80 -81 -79 -79 -79 -79 -81 -63 -92 -93 -94 -41 -52 -91 -82 -82 -83 -82 -83 -82 -82 -82 -82 -82 -82 -83 -41 -41 -95 -83 -88 -97 -82 -98 -82 -82 -82 -82 -82 -83 -83 -82 -82 -82 -82 -83 -90 -83 -81 -81 -80 -82 -82 -82 -82 -82 -81 -82 -82 -41 -63 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -79 -81 -81 -99 -81 -81 -81 -80 -81 -80 -81 -80 -80 -81 -81 -81 -83 -93 -93 -41 -93 -98 -98 -81 -81 -81 -81 -82 -82 -81 -81 -81 -82 -81 -81 -82 -85 -98 -82 -84 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -67 -96 -41 -41 -82 -83 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -41 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -82 -82 -82 -82 -82 -82 -83 -83 -82 -83 -82 -82 -82 -83 -82 -81 -82 -82 -82 -82 -82 -82 -82 -80 -58 -96 -82 -82 -82 -82 -82 -82 -82 -82 -81 -83 -83 -82 -82 -82 -83 -82 -82 -81 -82 -82 -82 -82 -82 -82 -41 -90 -95 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -64 -83 -82 -82 -83 -82 -82 -82 -82 -83 -82 -82 -82 -58 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -94 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -63 -81 -81 -81 -81 -81 -81 -80 -80 -81 -81 -81 -81 -92 -82 -82 -83 -83 -83 -82 -82 -82 -83 -82 -83 -83 -45 -93 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -80 -79 -83 -79 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -72 -90 -82 -82 -80 -81 -80 -82 -83 -82 -82 -83 -83 -82 -98 -88 -41 -41 -90 -49 -81 -81 -81 -81 -81 -81 -81 -79 -80 -80 -81 -81 -95 -90 -94 -81 -82 -82 -82 -81 -82 -81 -81 -81 -81 -82 -81 -82 -94 -74 -95 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -63 -88 -81 -81 -81 -81 -81 -59 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -94 -75 -81 -81 -82 -82 -81 -81 -81 -81 -81 -82 -81 -81 -82 -82 -82 -82 -83 -82 -82 -83 -82 -82 -82 -82 -41 -83 -82 -82 -82 -83 -82 -82 -82 -83 -83 -82 -83 -65 -40 -82 -82 -82 -82 -82 -82 -82 -83 -82 -80 -82 -83 -60 -93 -94 -92 -94 -91 -91 -93 -93 -92 -92 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -86 -94 -94 -94 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -56 -40 -82 -82 -83 -82 -82 -82 -82 -83 -82 -83 -82 -82 -55 -82 -83 -82 -83 -83 -82 -82 -83 -82 -82 -83 -83 -41 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -90 -82 -82 -82 -82 -80 -81 -81 -81 -81 -82 -82 -81 -92 -98 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -92 -97 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -82 -82 -83 -82 -80 -82 -82 -82 -82 -82 -81 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -80 -82 -82 -48 -82 -80 -82 -82 -82 -82 -82 -82 -83 -84 -81 -80 -81 -81 -80 -81 -81 -80 -75 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -61 -67 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -93 -93 -93 -82 -83 -82 -82 -83 -82 -82 -82 -83 -83 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -83 -83 -82 -82 -83 -82 -57 -85 -83 -82 -83 -83 -82 -82 -82 -82 -82 -80 -83 -81 -85 -81 -80 -81 -81 -81 -80 -79 -81 -81 -81 -81 -85 -90 -90 -82 -82 -82 -82 -83 -83 -82 -82 -82 -82 -80 -82 -63 -82 -82 -82 -84 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -92 -93 -93 -81 -81 -81 -80 -80 -81 -80 -79 -80 -79 -80 -79 -82 -98 -83 -91 -84 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -48 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -89 -81 -81 -81 -81 -81 -81 -81 -83 -83 -41 -83 -83 -82 -82 -82 -82 -81 -83 -82 -83 -83 -82 -82 -41 -41 -40 -86 -41 -92 -92 -82 -83 -82 -83 -83 -82 -83 -78 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -42 -92 -83 -82 -83 -83 -82 -83 -82 -83 -82 -82 -83 -82 -99 -94 -90 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -98 -98 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -94 -40 -82 -82 -82 -83 -82 -82 -82 -82 -82 -81 -82 -82 -82 -85 -83 -81 -83 -82 -82 -83 -83 -83 -76 -83 -82 -76 -83 -89 -86 -81 -81 -81 -81 -81 -79 -81 -81 -79 -79 -78 -78 -82 -82 -79 -94 -94 -56 -83 -82 -83 -83 -83 -82 -82 -82 -82 -82 -82 -82 -95 -94 -82 -82 -82 -82 -83 -82 -81 -83 -80 -82 -82 -83 -63 -82 -82 -82 -82 -83 -82 -82 -82 -82 -83 -82 -81 -90 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -83 -82 -94 -82 -80 -83 -82 -83 -82 -83 -82 -82 -82 -82 -82 -89 -83 -81 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -73 -62 -83 -82 -82 -83 -82 -82 -83 -82 -82 -83 -82 -83 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -90 -94 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -94 -94 -82 -82 -83 -83 -82 -82 -83 -82 -83 -82 -82 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -70 -90 -81 -81 -81 -81 -81 -81 -81 -80 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -96 -72 -91 -97 -82 -82 -83 -82 -83 -82 -83 -82 -82 -82 -83 -83 -83 -93 -82 -82 -82 -83 -83 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -82 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -96 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -77 -82 -80 -82 -82 -83 -83 -83 -83 -83 -83 -82 -82 -82 -73 -90 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -97 -98 -81 -81 -81 -41 -81 -81 -81 -80 -41 -81 -81 -81 -80 -80 -81 -80 -81 -80 -81 -81 -81 -41 -99 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -92 -95 -83 -83 -82 -82 -82 -82 -83 -83 -83 -83 -83 -83 -41 -83 -84 -74 -79 -45 -87 -82 -83 -89 -86 -84 -98 -98 -98 -98 -84 -94 -57 -82 -90 -53 -90 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -99 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -96 -83 -82 -81 -82 -83 -82 -82 -83 -82 -82 -83 -82 -41 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -79 -83 -83 -82 -83 -82 -82 -82 -83 -82 -82 -82 -82 -97 -85 -83 -82 -82 -83 -82 -82 -83 -82 -82 -82 -82 -82 -56 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -97 -82 -82 -82 -82 -82 -83 -83 -83 -82 -82 -83 -83 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -82 -82 -82 -82 -82 -82 -82 -81 -81 -80 -82 -82 -88 -82 -83 -82 -81 -82 -82 -82 -82 -82 -83 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -71 -83 -91 -90 -82 -82 -82 -83 -82 -83 -83 -83 -83 -83 -82 -82 -64 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -92 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -80 -81 -81 -81 -81 -80 -81 -80 -81 -80 -81 -81 -98 -81 -82 -81 -82 -81 -82 -81 -81 -81 -80 -81 -81 -78 -92 -95 -92 -92 -93 -86 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -68 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -85 -94 -98 -82 -82 -82 -82 -82 -83 -83 -82 -82 -82 -82 -82 -98 -83 -83 -82 -83 -82 -83 -82 -83 -83 -82 -82 -83 -51 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -40 -40 -79 -80 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -91 -91 -81 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -52 -81 -84 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -89 -81 -92 -91 -83 -98 -43 -83 -82 -83 -82 -82 -83 -82 -83 -82 -83 -83 -82 -41 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -42 -82 -83 -82 -82 -82 -83 -82 -83 -83 -83 -83 -83 -40 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -83 -80 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -56 -91 -91 -92 -92 -91 -78 -91 -90 -91 -91 -91 -91 -91 -92 -93 -92 -92 -82 -82 -82 -83 -83 -82 -82 -82 -82 -83 -82 -82 -91 -92 -95 -82 -82 -82 -82 -83 -82 -82 -83 -82 -82 -82 -82 -93 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -83 -84 -65 -81 -80 -80 -81 -80 -81 -82 -81 -80 -80 -80 -81 -84 -85 -82 -81 -81 -82 -81 -81 -82 -81 -81 -82 -82 -82 -98 -81 -81 -80 -81 -81 -81 -81 -81 -82 -81 -81 -81 -98 -81 -98 -85 -87 -91 -88 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -70 -82 -81 -81 -81 -81 -95 -95 -92 -82 -83 -83 -82 -95 -98 -74 -81 -81 -81 -81 -79 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -56 -40 -81 -81 -82 -81 -82 -81 -79 -81 -81 -81 -82 -81 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -91 -94 -92 -92 -92 -81 -80 -80 -81 -81 -81 -80 -80 -81 -81 -81 -81 -98 -45 -81 -81 -82 -82 -81 -82 -81 -81 -82 -82 -81 -81 -91 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -41 -83 -83 -83 -82 -82 -82 -83 -82 -82 -83 -82 -82 -96 -83 -82 -83 -82 -82 -82 -82 -83 -83 -83 -82 -98 -80 -80 -80 -81 -81 -81 -80 -81 -81 -81 -84 -85 -98 -85 -85 -84 -84 -85 -85 -79 -84 -85 -84 -87 -82 -93 -88 -89 -86 -90 -89 -89 -89 -99 -98 -99 -98 -98 -99 -92 -93 -94 -97 -98 -94 -98 -98 -99 -97 -99 -82 -99 -99 -98 -98 -41 -98 -67 -96 -92 -83 -88 -99 -84 -82 -98 -88 -41 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -42 -83 -83 -83 -83 -83 -83 -98 -82 -83 -81 -83 -80 -83 -83 -83 -83 -83 -83 -83 -53 -81 -81 -81 -81 -82 -81 -81 -81 -79 -80 -79 -80 -85 -98 -81 -81 -81 -81 -81 -80 -81 -81 -80 -81 -81 -81 -90 -93 -94 -94 -93 -93 -93 -95 -94 -93 -94 -93 -93 -95 -93 -93 -94 -93 -93 -93 -93 -90 -82 -94 -92 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -96 -79 -82 -83 -98 -82 -82 -88 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -82 -81 -82 -81 -82 -81 -82 -81 -81 -81 -82 -81 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -81 -81 -41 -41 -81 -81 -82 -81 -80 -81 -83 -83 -82 -82 -82 -82 -80 -73 -94 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -92 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -83 -73 -93 -94 -81 -90 -98 -88 -83 -98 -90 -85 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -81 -81 -81 -83 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -96 -98 -83 -83 -82 -83 -83 -83 -83 -82 -83 -83 -82 -83 -46 -92 -92 -82 -83 -83 -82 -83 -83 -86 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -83 -66 -82 -41 -40 -98 -82 -83 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -98 -82 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -99 -81 -81 -81 -61 -82 -41 -81 -82 -81 -82 -82 -82 -81 -44 -97 -81 -80 -80 -80 -81 -81 -81 -81 -81 -81 -81 -80 -41 -81 -82 -82 -82 -82 -81 -81 -82 -81 -82 -82 -82 -93 -94 -81 -92 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -76 -81 -93 -81 -79 -92 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -83 -98 -99 -83 -92 -88 -96 -83 -83 -83 -82 -82 -82 -83 -82 -83 -83 -83 -83 -83 -83 -41 -90 -83 -83 -83 -80 -83 -83 -83 -83 -83 -83 -83 -83 -97 -81 -83 -83 -83 -83 -83 -83 -82 -83 -83 -82 -82 -93 -95 -93 -60 -61 -83 -83 -83 -83 -83 -82 -82 -83 -82 -83 -83 -83 -83 -84 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -65 -93 -83 -82 -82 -82 -82 -82 -82 -82 -82 -83 -83 -82 -41 -83 -82 -82 -99 -81 -81 -81 -81 -96 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -82 -41 -40 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -98 -40 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -40 -92 -57 -40 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -85 -87 -82 -82 -82 -82 -82 -82 -83 -83 -82 -83 -82 -82 -41 -89 -82 -82 -82 -82 -83 -82 -82 -82 -97 -83 -99 -87 -41 -96 -82 -82 -60 -98 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -82 -83 -82 -82 -83 -83 -82 -82 -82 -44 -82 -82 -82 -82 -82 -80 -80 -83 -83 -83 -83 -83 -41 -99 -88 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -83 -82 -83 -82 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -89 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -84 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -83 -82 -81 -87 -82 -81 -82 -82 -82 -82 -82 -81 -82 -82 -83 -82 -98 -99 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -82 -82 -81 -81 -81 -81 -81 -81 -81 -81 -65 -87 -96 -92 -92 -97 -81 -82 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -41 -81 -80 -81 -81 -81 -80 -80 -81 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -93 -93 -41 -95 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -92 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -41 -96 -81 -80 -81 -81 -81 -80 -81 -80 -81 -81 -81 -81 -98 -98 -82 -82 -83 -82 -83 -83 -82 -83 -83 -83 -82 -82 -97 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -93 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -95 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -82 -82 -82 -81 -82 -82 -41 -88 -84 -41 -82 -40 -41 -95 -83 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -99 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -45 -83 -82 -83 -83 -82 -82 -83 -82 -83 -82 -82 -82 -82 -82 -80 -82 -82 -82 -82 -82 -81 -82 -82 -82 -41 -82 -82 -82 -83 -80 -80 -82 -40 -84 -91 -84 -82 -83 -82 -82 -82 -82 -82 -82 -82 -57 -99 -75 -99 -82 -79 -81 -80 -82 -79 -81 -81 -82 -82 -98 -98 -98 -41 -94 -40 -97 -97 -98 -98 -90 -96 -91 -84 -96 -89 -98 -98 -93 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -96 -97 -82 -82 -83 -83 -83 -83 -83 -83 -82 -81 -82 -82 -41 -98 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -83 -41 -94 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -93 -84 -99 -82 -82 -83 -83 -83 -41 -82 -82 -82 -83 -82 -82 -82 -83 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -92 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -83 -83 -81 -82 -62 -41 -84 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -92 -62 -94 -98 -72 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -83 -83 -83 -82 -82 -83 -83 -83 -83 -82 -41 -82 -92 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -69 -98 -83 -82 -82 -83 -82 -82 -83 -82 -82 -82 -82 -82 -40 -97 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -83 -98 -81 -81 -81 -81 -80 -82 -82 -83 -83 -83 -83 -83 -82 -85 -57 -83 -83 -82 -83 -82 -83 -82 -82 -82 -83 -82 -72 -98 -82 -82 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -97 -82 -81 -81 -81 -81 -81 -81 -81 -41 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -54 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -88 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -93 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -40 -81 -92 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -96 -81 -92 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -83 -81 -81 -81 -81 -81 -81 -81 -81 -42 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -63 -82 -81 -81 -82 -81 -81 -82 -81 -81 -81 -81 -81 -45 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -83 -82 -83 -82 -82 -83 -83 -82 -83 -82 -82 -83 -80 -82 -82 -82 -82 -82 -82 -82 -72 -40 -85 -82 -83 -82 -82 -82 -82 -82 -83 -82 -83 -82 -82 -90 -84 -84 -84 -98 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -93 -82 -83 -83 -83 -83 -83 -83 -83 -83 -41 -92 -83 -83 -82 -82 -82 -81 -81 -81 -82 -82 -81 -81 -98 -81 -82 -81 -82 -81 -81 -98 -82 -82 -82 -81 -81 -82 -93 -95 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -54 -83 -83 -83 -83 -83 -83 -85 -81 -81 -81 -81 -81 -81 -93 -99 -98 -83 -82 -82 -82 -82 -82 -85 -83 -83 -83 -82 -82 -57 -98 -98 -90 -82 -83 -83 -83 -83 -78 -98 -82 -82 -82 -82 -82 -82 -82 -81 -81 -82 -82 -81 -87 -98 -98 -92 -92 -93 -98 -98 -98 -96 -98 -96 -98 -93 -89 -92 -90 -98 -98 -98 -98 -98 -99 -96 -98 -98 -96 -98 -97 -96 -98 -81 -81 -98 -98 -94 -98 -91 -40 -64 -83 -82 -99 -98 -86 -85 -85 -85 -96 -85 -97 -98 -99 -98 -93 -94 -91 -93 -41 -52 -98 -98 -99 -99 -98 -99 -98 -98 -99 -98 -98 -70 -82 -82 -65 -82 -82 -81 -81 -82 -81 -96 -78 -40 -82 -58 -87 -90 -82 -81 -82 -81 -82 -82 -94 -82 -84 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -42 -42 -40 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -98 -91 -82 -82 -82 -82 -82 -82 -98 -97 -96 -98 -89 -99 -98 -95 -97 -64 -98 -98 -98 -98 -97 -83 -82 -82 -82 -82 -82 -93 -93 -90 -92 -93 -92 -81 -81 -81 -82 -82 -81 -98 -82 -82 -82 -82 -98 -82 -98 -99 -84 -82 -82 -82 -82 -82 -82 -82 -96 -82 -82 -82 -82 -82 -82 -98 -78 -82 -82 -82 -82 -82 -82 -83 -83 -83 -83 -82 -81 -51 -89 -95 -98 -98 -98 -96 -98 -88 -89 -93 -89 -89 -89 -93 -84 -96 -88 -94 -93 -93 -98 -93 -95 -93 -94 -99 -98 -98 -98 -98 -98 -98 -98 -55 -98 -98 -51 -98 -83 -83 -82 -82 -82 -82 -41 -83 -82 -98 -92 -83 -83 -83 -82 -83 -56 -83 -83 -80 -82 -81 -83 -81 -83 -40 -40 -82 -82 -82 -82 -82 -82 -62 -82 -82 -82 -82 -81 -81 -98 -82 -81 -81 -82 -83 -83 -98 -98 -82 -82 -82 -82 -82 -82 -98 -83 -83 -83 -82 -82 -83 -50 -83 -82 -83 -83 -81 -81 -82 -83 -83 -83 -83 -83 -79 -98 -85 -81 -82 -82 -82 -82 -82 -83 -83 -82 -82 -82 -82 -48 -99 -98 -96 -98 -98 -82 -83 -83 -82 -83 -83 -83 -83 -65 -90 -40 -99 -83 -83 -83 -83 -83 -83 -83 -83 -91 -82 -82 -83 -82 -83 -83 -99 -84 -83 -83 -83 -83 -83 -82 -47 -83 -83 -83 -83 -83 -83 -98 -81 -81 -82 -81 -82 -82 -93 -82 -82 -82 -82 -82 -82 -98 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -98 -81 -80 -80 -81 -81 -83 -98 -82 -81 -81 -82 -81 -82 -90 -92 -82 -82 -82 -82 -82 -56 -98 -98 -82 -82 -82 -82 -82 -82 -84 -82 -82 -82 -82 -82 -62 -97 -81 -96 -97 -94 -93 -97 -96 -83 -82 -82 -81 -82 -81 -58 -82 -81 -82 -81 -81 -81 -81 -82 -81 -81 -81 -81 -71 -98 -90 -95 -99 -99 -82 -82 -98 -98 -98 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -98 -83 -83 -83 -82 -83 -83 -98 -83 -83 -83 -83 -82 -83 -83 -78 -83 -93 -83 -99 -98 -87 -94 -96 -91 -90 -94 -94 -82 -84 -96 -98 -98 -90 -89 -98 -98 -98 -98 -98 -82 -83 -83 -82 -83 -83 -86 -98 -83 -83 -83 -83 -83 -83 -97 -93 -81 -81 -82 -82 -81 -82 -98 -81 -82 -81 -82 -82 -82 -96 -82 -82 -82 -82 -82 -82 -84 -98 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -99 -98 -99 -87 -96 -98 -98 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -88 -89 -98 -99 -98 -98 -98 -91 -81 -82 -81 -81 -82 -83 -91 -84 -82 -82 -82 -82 -82 -60 -84 -98 -40 -40 -98 -40 -41 -98 -98 -98 -81 -98 -82 -82 -82 -82 -82 -82 -99 -82 -78 -82 -82 -82 -82 -99 -98 -99 -95 -81 -82 -81 -81 -81 -81 -92 -88 -81 -81 -81 -81 -81 -71 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -82 -82 -83 -83 -99 -98 -99 -98 -98 -85 -94 -98 -91 -90 -91 -91 -94 -94 -94 -98 -92 -94 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -93 -83 -83 -83 -82 -83 -83 -64 -83 -83 -83 -83 -83 -82 -89 -99 -98 -98 -99 -41 -83 -83 -83 -83 -83 -83 -83 -83 -97 -99 -98 -99 -98 -98 -51 -98 -98 -95 -90 -99 -64 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -83 -82 -77 -83 -82 -83 -83 -82 -82 -83 -82 -82 -82 -82 -81 -69 -96 -82 -98 -47 -82 -83 -83 -83 -83 -83 -40 -40 -94 -82 -82 -82 -82 -82 -85 -99 -98 -93 -98 -98 -96 -94 -90 -98 -98 -99 -83 -83 -82 -83 -83 -83 -91 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -82 -98 -98 -83 -82 -83 -82 -83 -82 -83 -83 -82 -83 -83 -83 -56 -82 -82 -83 -82 -82 -83 -99 -99 -81 -81 -81 -81 -81 -81 -83 -81 -81 -82 -81 -82 -82 -88 -81 -83 -43 -82 -82 -82 -83 -83 -82 -59 -40 -83 -82 -82 -82 -83 -82 -82 -98 -92 -83 -83 -83 -83 -82 -83 -83 -83 -82 -83 -83 -83 -89 -83 -83 -83 -83 -83 -83 -90 -83 -83 -83 -83 -83 -84 -83 -83 -83 -82 -83 -82 -88 -82 -82 -83 -82 -82 -69 -83 -83 -83 -83 -83 -83 -92 -83 -83 -82 -82 -83 -83 -98 -83 -83 -83 -83 -82 -83 -62 -83 -83 -83 -82 -83 -83 -58 -81 -81 -81 -81 -81 -81 -41 -81 -98 -83 -82 -82 -93 -98 -40 -82 -83 -40 -82 -82 -82 -81 -81 -82 -83 -92 -98 -82 -81 -82 -81 -82 -82 -97 -82 -82 -82 -98 -98 -40 -98 -99 -98 -93 -82 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -99 -92 -98 -98 -84 -92 -98 -93 -98 -99 -97 -99 -98 -98 -96 -91 -98 -98 -97 -96 -97 -96 -91 -91 -96 -91 -98 -98 -98 -99 -99 -98 -99 -98 -98 -98 -82 -82 -82 -82 -82 -82 -94 -83 -83 -83 -83 -83 -83 -83 -82 -61 -98 -83 -83 -80 -83 -83 -83 -40 -41 -98 -97 -99 -84 -94 -92 -92 -92 -91 -91 -98 -98 -98 -96 -98 -99 -90 -97 -98 -96 -98 -91 -97 -98 -99 -94 -97 -82 -97 -97 -97 -97 -98 -98 -83 -82 -82 -82 -82 -83 -90 -83 -83 -83 -83 -82 -83 -98 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -82 -83 -41 -82 -83 -82 -83 -82 -83 -96 -98 -92 -81 -81 -81 -82 -81 -81 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -81 -47 -79 -97 -81 -81 -81 -80 -81 -81 -81 -82 -83 -50 -94 -81 -86 -92 -82 -82 -81 -82 -82 -82 -53 -83 -83 -95 -67 -82 -83 -82 -82 -83 -81 -89 -93 -81 -80 -81 -81 -81 -86 -58 -82 -83 -83 -83 -83 -83 -83 -83 -83 -80 -82 -83 -83 -98 -62 -98 -83 -83 -83 -83 -83 -83 -98 -98 -81 -81 -81 -82 -81 -80 -84 -98 -83 -82 -82 -80 -83 -83 -65 -83 -83 -83 -83 -83 -83 -54 -97 -91 -90 -82 -82 -83 -83 -83 -83 -82 -82 -83 -83 -64 -88 -81 -81 -81 -81 -81 -81 -97 -82 -98 -81 -81 -81 -81 -81 -81 -82 -82 -98 -83 -98 -95 -82 -82 -82 -82 -82 -82 -83 -82 -83 -83 -83 -82 -73 -83 -82 -75 -83 -83 -82 -87 -83 -83 -83 -83 -83 -67 -83 -83 -83 -83 -83 -83 -80 -83 -83 -83 -83 -83 -83 -40 -98 -81 -81 -81 -82 -81 -81 -68 -86 -81 -81 -81 -80 -80 -80 -81 -82 -82 -82 -82 -82 -90 -80 -81 -81 -81 -81 -80 -98 -93 -92 -92 -89 -96 -98 -82 -82 -83 -83 -82 -83 -98 -98 -68 -96 -97 -95 -95 -92 -86 -94 -83 -82 -83 -83 -83 -83 -42 -83 -83 -83 -82 -83 -83 -85 -82 -83 -83 -83 -83 -83 -89 -83 -83 -83 -82 -82 -77 -45 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -92 -82 -83 -83 -83 -83 -83 -81 -80 -80 -80 -81 -79 -81 -81 -82 -82 -82 -80 -89 -82 -82 -82 -82 -82 -82 -81 -81 -81 -81 -91 -83 -73 -90 -90 -91 -82 -81 -80 -82 -82 -82 -98 -98 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -82 -83 -83 -83 -97 -97 -81 -81 -81 -81 -81 -81 -48 -91 -81 -82 -82 -82 -82 -82 -81 -81 -81 -82 -81 -81 -99 -82 -82 -82 -82 -82 -82 -79 -81 -81 -65 -82 -82 -82 -82 -82 -82 -82 -81 -81 -98 -82 -82 -82 -82 -82 -82 -83 -82 -83 -82 -83 -83 -99 -83 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -96 -85 -81 -81 -81 -82 -82 -82 -62 -92 -40 -80 -98 -63 -84 -83 -83 -83 -83 -83 -83 -50 -83 -82 -83 -82 -83 -83 -98 -99 -85 -83 -83 -83 -83 -83 -83 -41 -41 -88 -82 -82 -82 -83 -82 -83 -98 -83 -83 -83 -83 -83 -83 -98 -97 -96 -90 -83 -83 -83 -83 -83 -72 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -93 -98 -81 -81 -81 -81 -82 -82 -82 -82 -82 -82 -82 -82 -89 -81 -81 -81 -81 -81 -82 -98 -98 -85 -94 -90 -92 -92 -92 -92 -92 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -81 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -91 -99 -97 -98 -98 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -82 -53 -83 -79 -82 -82 -82 -40 -83 -81 -82 -98 -82 -83 -80 -83 -85 -83 -83 -98 -81 -80 -94 -73 -86 -81 -81 -98 -98 -81 -81 -75 -98 -81 -82 -58 -81 -81 -85 -82 -81 -94 -82 -47 -81 -81 -96 -84 -82 -83 -82 -82 -82 -83 -55 -82 -83 -98 -82 -82 -81 -83 -83 -94 -84 -82 -82 -82 -82 -82 -97 -98 -92 -98 -98 -98 -98 -91 -91 -98 -98 -98 -98 -99 -98 -82 -82 -99 -98 -98 -99 -99 -98 -98 -99 -98 -98 -98 -98 -91 -99 -98 -98 -98 -98 -98 -98 -98 -89 -98 -94 -82 -82 -96 -92 -98 -98 -85 -94 -94 -92 -91 -94 -98 -98 -98 -94 -90 -91 -96 -96 -97 -98 -90 -81 -82 -84 -98 -98 -92 -82 -92 -96 -95 -98 -98 -98 -98 -99 -98 -98 -98 -98 -93 -98 -99 -82 -82 -49 -87 -82 -82 -73 -82 -82 -98 -81 -81 -62 -95 -93 -84 -98 -98 -93 -81 -79 -57 -82 -82 -81 -82 -56 -82 -81 -82 -82 -82 -82 -82 -97 -82 -82 -40 -41 -96 -98 -81 -80 -46 -81 -81 -96 -81 -81 -64 -81 -80 -80 -85 -86 -94 -85 -85 -82 -81 -79 -81 -80 -81 -82 -82 -49 -82 -82 -84 -82 -81 -82 -82 -82 -98 -82 -82 -98 -82 -82 -82 -82 -90 -98 -98 -98 -98 -98 -98 -82 -88 -93 -82 -82 -96 -91 -91 -82 -82 -92 -82 -82 -83 -82 -82 -61 -82 -82 -98 -82 -82 -98 -98 -99 -98 -98 -98 -82 -98 -92 -95 -98 -95 -97 -98 -98 -99 -95 -96 -98 -98 -97 -99 -92 -98 -88 -98 -98 -90 -90 -91 -97 -98 -98 -99 -99 -97 -98 -84 -88 -98 -98 -98 -98 -99 -98 -98 -86 -96 -97 -90 -91 -92 -92 -92 -92 -92 -98 -98 -98 -98 -98 -98 -97 -97 -99 -98 -82 -82 -83 -82 -82 -83 -69 -98 -97 -98 -97 -98 -97 -82 -82 -84 -92 -82 -82 -98 -83 -82 -98 -96 -82 -82 -64 -83 -83 -98 -98 -82 -99 -82 -82 -40 -82 -82 -96 -82 -81 -90 -82 -81 -81 -81 -84 -86 -89 -41 -98 -98 -98 -98 -98 -98 -98 -90 -95 -98 -82 -81 -79 -83 -83 -84 -84 -98 -81 -80 -81 -83 -82 -82 -80 -82 -84 -81 -80 -84 -84 -82 -81 -57 -81 -81 -81 -98 -80 -84 -82 -83 -83 -82 -82 -82 -90 -98 -80 -80 -98 -88 -96 -83 -98 -83 -82 -83 -83 -82 -82 -82 -88 -83 -83 -88 -83 -82 -98 -80 -81 -98 -51 -82 -82 -88 -95 -98 -84 -80 -82 -86 -82 -81 -81 -80 -82 -82 -98 -84 -84 -83 -83 -81 -81 -84 -95 -77 -98 -40 -88 -88 -77 -89 -97 -88 -98 -97 -98 -98 -90 -98 -82 -82 -83 -83 -83 -83 -95 -81 -83 -98 -98 -98 -83 -83 -98 -98 -81 -81 -86 -81 -92 -98 -83 -98 -98 -40 -98 -91 -98 -98 -98 -98 -91 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -98 -84 -90 -89 -91 -98 -98 -98 -96 -99 -96 -87 -89 -90 -81 -81 -82 -98 -81 -81 -95 -88 -81 -81 -91 -91 -97 -95 -95 -91 -84 -96 -85 -84 -84 -84 -91 -91 -99 -91 -96 -98 -91 -84 -85 -96 -90 -90 -86 -78 -98 -98 -96 -87 -91 -85 -98 -98 -98 -98 -98 -98 -93 -81 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -96 -97 -97 -94 -80 -80 -81 -85 -82 -81 -81 -88 -83 -82 -81 -82 -98 -80 -83 -41 -98 -81 -81 -81 -81 -56 -81 -81 -81 -99 -82 -81 -41 -81 -81 -98 -82 -82 -98 -60 -81 -81 -81 -81 -81 -81 -63 -99 -96 -98 -88 -81 -81 -98 -98 -98 -98 -82 -82 -89 -82 -81 -89 -90 -90 -92 -90 -90 -90 -94 -98 -98 -98 -99 -98 -98 -81 -80 -81 -81 -81 -98 -98 -93 -97 -98 -81 -81 -77 -81 -81 -81 -81 -81 -81 -81 -59 -97 -82 -82 -82 -82 -82 -99 -82 -81 -86 -81 -81 -71 -81 -81 -98 -98 -81 -81 -81 -81 -81 -78 -81 -81 -98 -98 -98 -81 -81 -81 -81 -55 -81 -81 -50 -81 -81 -84 -82 -83 -98 -82 -82 -98 -82 -82 -96 -83 -82 -97 -40 -84 -80 -79 -84 -85 -84 -85 -85 -99 -78 -40 -92 -92 -58 -81 -81 -87 -81 -81 -82 -81 -58 -98 -98 -98 -98 -98 -98 -98 -98 -99 -96 -82 -84 -98 -98 -83 -96 -98 -98 -97 -90 -98 -98 -94 -99 -98 -98 -98 -90 -99 -98 -98 -98 -97 -98 -92 -92 -92 -98 -98 -98 -92 -96 -91 -98 -98 -98 -98 -99 -98 -99 -98 -94 -89 -96 -99 -89 -98 -98 -98 -99 -98 -98 -99 -88 -88 -84 -98 -81 -81 -49 -81 -81 -98 -82 -83 -91 -88 -95 -98 -98 -98 -98 -98 -82 -83 -81 -82 -98 -91 -91 -90 -91 -92 -91 -88 -91 -84 -92 -92 -92 -92 -83 -82 -82 -82 -98 -81 -80 -48 -98 -89 -81 -81 -83 -82 -82 -89 -82 -82 -82 -82 -82 -91 -82 -82 -82 -83 -82 -72 -98 -98 -98 -98 -91 -98 -40 -98 -98 -99 -98 -97 -96 -96 -91 -91 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -82 -82 -98 -82 -82 -98 -98 -81 -81 -81 -81 -81 -98 -81 -81 -98 -81 -81 -81 -89 -80 -80 -88 -86 -82 -82 -91 -89 -88 -88 -90 -88 -89 -99 -89 -96 -82 -82 -71 -83 -82 -87 -83 -82 -90 -82 -82 -88 -82 -82 -96 -98 -96 -96 -83 -82 -95 -82 -82 -82 -78 -98 -82 -82 -41 -82 -82 -85 -90 -96 -98 -97 -98 -98 -90 -82 -82 -82 -82 -82 -98 -81 -81 -81 -90 -91 -98 -98 -99 -98 -99 -97 -98 -88 -89 -81 -81 -98 -98 -94 -90 -98 -98 -92 -81 -80 -92 -90 -90 -90 -91 -92 -92 -91 -95 -90 -82 -82 -55 -96 -81 -82 -94 -80 -80 -81 -96 -81 -81 -71 -81 -81 -98 -82 -82 -82 -83 -98 -94 -40 -84 -73 -98 -95 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -82 -82 -96 -96 -82 -82 -82 -98 -98 -98 -98 -99 -98 -81 -81 -84 -81 -81 -99 -98 -99 -98 -81 -81 -98 -99 -82 -82 -95 -55 -98 -98 -98 -98 -98 -40 -98 -84 -84 -90 -84 -85 -85 -86 -85 -88 -86 -87 -97 -90 -94 -94 -94 -82 -82 -57 -81 -82 -83 -99 -98 -93 -81 -81 -81 -85 -90 -98 -99 -92 -88 -91 -83 -98 -82 -99 -98 -90 -99 -98 -98 -98 -91 -98 -98 -98 -93 -98 -98 -98 -98 -98 -98 -98 -82 -96 -98 -90 -97 -99 -98 -98 -99 -98 -98 -88 -92 -82 -84 -83 -82 -83 -82 -82 -82 -82 -81 -82 -82 -82 -81 -82 -82 -98 -81 -80 -81 -90 -81 -81 -88 -81 -81 -98 -81 -81 -89 -41 -81 -81 -95 -98 -97 -98 -98 -77 -81 -93 -90 -91 -90 -91 -90 -90 -90 -81 -81 -54 -91 -81 -92 -91 -40 -91 -40 -91 -88 -79 -91 -91 -91 -91 -40 -87 -91 -91 -40 -93 -98 -91 -91 -91 -98 -98 -98 -90 -97 -98 -92 -98 -98 -98 -98 -98 -98 -40 -98 -98 -98 -95 -98 -98 -93 -99 -69 -98 -98 -89 -91 -98 -84 -98 -98 -98 -98 -98 -98 -98 -40 -98 -98 -99 -98 -98 -98 -98 -81 -81 -80 -98 -98 -80 -81 -98 -92 -98 -84 -85 -85 -86 -86 -85 -85 -90 -87 -85 -84 -84 -84 -85 -85 -78 -85 -85 -85 -85 -85 -85 -99 -98 -85 -90 -85 -85 -85 -86 -93 -90 -80 -89 -91 -88 -98 -88 -98 -98 -91 -98 -98 -90 -98 -96 -91 -98 -91 -97 -84 -87 -89 -99 -98 -98 -98 -98 -98 -98 -98 -98 -96 -94 -80 -81 -82 -82 -78 -82 -81 -81 -82 -82 -82 -81 -84 -81 -82 -70 -82 -82 -99 -81 -80 -98 -98 -82 -82 -94 -81 -82 -68 -82 -82 -86 -82 -80 -49 -98 -99 -98 -98 -99 -99 -99 -78 -97 -94 -91 -93 -91 -91 -93 -91 -91 -91 -91 -91 -91 -99 -98 -98 -98 -99 -98 -99 -91 -91 -91 -91 -93 -94 -82 -82 -82 -94 -81 -82 -81 -82 -84 -94 -82 -82 -63 -82 -82 -98 -82 -82 -55 -82 -89 -81 -52 -98 -98 -99 -99 -95 -91 -81 -82 -96 -91 -92 -81 -81 -63 -81 -81 -76 -81 -81 -98 -96 -96 -96 -98 -96 -96 -96 -91 -91 -91 -92 -91 -92 -94 -85 -91 -98 -98 -98 -98 -83 -98 -98 -98 -98 -98 -91 -95 -98 -81 -81 -98 -98 -98 -99 -98 -98 -81 -81 -82 -80 -81 -98 -98 -81 -81 -76 -81 -81 -41 -98 -98 -98 -98 -91 -91 -81 -81 -99 -96 -82 -81 -82 -89 -82 -81 -81 -82 -51 -82 -81 -54 -81 -81 -98 -98 -98 -99 -98 -97 -89 -91 -98 -98 -98 -98 -90 -98 -98 -98 -98 -98 -97 -98 -88 -91 -98 -99 -98 -98 -98 -99 -98 -98 -99 -99 -90 -90 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -95 -82 -97 -98 -87 -98 -98 -98 -98 -97 -98 -98 -98 -98 -81 -81 -93 -81 -81 -62 -98 -98 -97 -99 -98 -96 -91 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -93 -97 -98 -98 -99 -98 -98 -97 -98 -84 -85 -85 -85 -86 -85 -85 -85 -40 -94 -40 -96 -91 -98 -99 -99 -99 -82 -82 -88 -82 -82 -66 -99 -93 -82 -82 -82 -81 -53 -98 -82 -96 -98 -98 -99 -98 -98 -81 -82 -77 -82 -82 -40 -98 -91 -82 -81 -49 -82 -82 -69 -81 -82 -85 -83 -82 -82 -95 -98 -98 -98 -98 -96 -98 -98 -97 -96 -91 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -90 -99 -98 -98 -99 -98 -98 -97 -98 -85 -98 -98 -98 -98 -98 -99 -98 -100 -78 -94 -90 -90 -90 -93 -90 -94 -98 -94 -94 -94 -82 -82 -64 -86 -82 -82 -99 -98 -98 -98 -96 -83 -98 -98 -92 -98 -98 -91 -98 -98 -98 -98 -98 -91 -98 -98 -98 -98 -90 -98 -99 -98 -98 -98 -98 -83 -98 -40 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -82 -99 -98 -82 -40 -98 -88 -78 -99 -98 -98 -99 -96 -91 -91 -83 -83 -98 -82 -82 -41 -98 -84 -81 -80 -82 -85 -79 -81 -81 -83 -79 -82 -83 -82 -55 -91 -82 -83 -98 -94 -99 -99 -98 -83 -82 -99 -98 -98 -82 -83 -53 -82 -83 -92 -98 -93 -83 -83 -98 -98 -91 -91 -98 -98 -98 -98 -91 -98 -98 -98 -97 -98 -99 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -91 -98 -98 -98 -99 -98 -98 -97 -95 -98 -98 -98 -96 -95 -91 -91 -91 -91 -96 -98 -98 -98 -90 -98 -98 -99 -83 -82 -91 -82 -83 -89 -98 -89 -99 -99 -94 -99 -98 -98 -95 -95 -98 -91 -91 -94 -91 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -88 -98 -85 -95 -98 -82 -82 -92 -97 -82 -98 -97 -81 -81 -98 -98 -98 -82 -81 -64 -82 -82 -98 -82 -82 -78 -82 -82 -98 -85 -82 -82 -98 -98 -98 -98 -99 -90 -80 -80 -81 -81 -81 -40 -40 -88 -81 -81 -87 -88 -82 -81 -94 -98 -76 -81 -81 -90 -91 -80 -81 -95 -81 -81 -99 -81 -81 -98 -81 -81 -51 -98 -97 -98 -99 -91 -90 -84 -80 -89 -98 -98 -98 -98 -96 -90 -98 -92 -89 -95 -91 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -97 -97 -95 -93 -87 -89 -85 -98 -99 -98 -81 -81 -64 -81 -81 -81 -91 -98 -97 -98 -99 -97 -98 -96 -92 -98 -98 -98 -98 -80 -87 -85 -83 -85 -98 -98 -98 -97 -98 -84 -99 -99 -99 -98 -98 -98 -98 -98 -78 -98 -98 -91 -91 -92 -91 -91 -96 -92 -98 -94 -98 -98 -88 -98 -88 -98 -99 -99 -98 -98 -99 -95 -92 -98 -98 -98 -97 -98 -98 -94 -89 -85 -97 -89 -91 -85 -98 -98 -81 -81 -81 -46 -81 -81 -90 -82 -82 -89 -98 -84 -98 -86 -96 -98 -99 -98 -98 -98 -98 -82 -82 -98 -98 -98 -81 -81 -98 -80 -81 -85 -82 -82 -97 -98 -92 -82 -82 -81 -81 -81 -98 -81 -80 -81 -98 -82 -82 -82 -82 -81 -82 -89 -81 -81 -81 -99 -82 -77 -82 -82 -81 -96 -43 -40 -81 -82 -49 -82 -82 -98 -82 -82 -82 -82 -82 -82 -58 -82 -82 -93 -82 -98 -82 -82 -68 -81 -81 -76 -40 -82 -81 -63 -81 -82 -98 -81 -81 -90 -98 -98 -98 -98 -95 -99 -98 -98 -98 -98 -97 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -90 -99 -98 -99 -98 -98 -98 -98 -98 -98 -91 -98 -99 -98 -98 -98 -97 -98 -88 -90 -98 -98 -98 -98 -98 -98 -98 -99 -94 -95 -90 -90 -90 -97 -99 -98 -98 -98 -98 -98 -98 -82 -81 -98 -81 -81 -50 -98 -98 -98 -95 -81 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -92 -97 -96 -91 -91 -91 -90 -98 -98 -91 -92 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -99 -99 -98 -99 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -99 -99 -98 -98 -98 -81 -81 -82 -81 -81 -81 -81 -67 -82 -81 -82 -88 -81 -81 -81 -80 -89 -82 -82 -98 -98 -99 -98 -79 -94 -98 -90 -90 -96 -98 -82 -81 -98 -82 -82 -71 -41 -82 -82 -87 -99 -99 -82 -82 -98 -99 -97 -96 -96 -82 -82 -90 -82 -82 -82 -82 -83 -82 -82 -82 -98 -82 -82 -82 -63 -82 -82 -82 -82 -84 -97 -82 -82 -69 -98 -82 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -89 -94 -94 -91 -91 -90 -91 -91 -91 -92 -48 -91 -91 -98 -97 -98 -98 -97 -98 -98 -98 -98 -98 -97 -93 -95 -99 -98 -98 -99 -98 -98 -98 -98 -97 -96 -98 -99 -94 -98 -98 -98 -91 -97 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -99 -82 -82 -82 -82 -74 -98 -80 -81 -98 -98 -98 -98 -96 -97 -96 -98 -91 -90 -98 -98 -97 -97 -91 -91 -97 -96 -91 -81 -81 -100 -97 -97 -81 -81 -99 -84 -79 -80 -81 -85 -80 -80 -83 -91 -98 -59 -82 -82 -82 -92 -41 -82 -98 -80 -80 -98 -81 -81 -41 -81 -81 -97 -81 -81 -81 -81 -81 -61 -85 -81 -81 -81 -81 -80 -81 -98 -98 -98 -98 -98 -92 -98 -98 -99 -99 -98 -98 -98 -98 -97 -98 -98 -96 -97 -97 -97 -97 -91 -91 -98 -98 -91 -99 -98 -98 -98 -81 -81 -98 -81 -81 -98 -98 -98 -98 -98 -98 -98 -98 -98 -82 -98 -92 -98 -98 -91 -98 -92 -98 -98 -98 -98 -97 -98 -84 -98 -98 -98 -99 -98 -99 -98 -96 -91 -94 -98 -91 -91 -91 -98 -98 -99 -98 -98 -98 -96 -96 -92 -92 -98 -98 -98 -98 -98 -98 -99 -92 -81 -99 -97 -98 -98 -81 -81 -50 -81 -80 -80 -98 -91 -98 -98 -98 -91 -98 -98 -99 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -97 -92 -98 -91 -97 -98 -96 -96 -91 -98 -98 -98 -96 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -91 -81 -81 -98 -81 -81 -82 -82 -97 -89 -81 -81 -98 -98 -81 -81 -99 -98 -76 -81 -81 -40 -83 -82 -82 -98 -81 -82 -82 -82 -75 -84 -82 -82 -82 -82 -71 -82 -82 -98 -98 -95 -82 -82 -98 -82 -82 -50 -96 -99 -98 -98 -98 -94 -99 -98 -82 -81 -82 -98 -82 -82 -68 -97 -98 -82 -81 -58 -82 -82 -84 -98 -96 -98 -98 -97 -98 -98 -99 -96 -97 -89 -89 -92 -98 -98 -98 -97 -99 -96 -91 -92 -98 -98 -98 -99 -96 -96 -96 -92 -91 -98 -98 -98 -98 -97 -98 -88 -89 -98 -98 -98 -98 -98 -98 -98 -98 -94 -94 -40 -40 -90 -81 -81 -61 -82 -81 -86 -93 -90 -93 -94 -96 -98 -93 -91 -98 -98 -98 -82 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -98 -97 -97 -99 -98 -98 -98 -99 -98 -98 -98 -98 -91 -99 -98 -97 -98 -99 -98 -98 -98 -91 -91 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -82 -82 -81 -98 -80 -81 -81 -82 -81 -73 -98 -81 -82 -44 -81 -81 -78 -84 -91 -84 -84 -85 -84 -80 -81 -81 -82 -82 -83 -90 -98 -82 -81 -82 -82 -82 -82 -82 -82 -98 -93 -99 -98 -98 -98 -96 -98 -98 -98 -98 -98 -96 -90 -99 -98 -98 -96 -99 -99 -98 -98 -96 -99 -97 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -86 -82 -82 -82 -82 -91 -82 -82 -82 -82 -47 -82 -82 -82 -89 -86 -99 -98 -98 -98 -96 -98 -98 -77 -98 -91 -91 -91 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -40 -40 -84 -98 -82 -89 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -98 -98 -90 -99 -99 -98 -84 -96 -89 -90 -84 -98 -85 -99 -98 -96 -82 -82 -98 -82 -82 -99 -80 -82 -82 -81 -46 -89 -85 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -84 -84 -91 -90 -97 -89 -82 -80 -86 -81 -80 -89 -97 -99 -98 -98 -81 -81 -96 -98 -80 -97 -90 -90 -93 -81 -80 -81 -81 -71 -81 -81 -87 -81 -81 -41 -98 -98 -98 -98 -98 -98 -92 -98 -90 -90 -96 -97 -98 -98 -98 -98 -98 -99 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -96 -98 -94 -98 -98 -98 -99 -81 -81 -98 -96 -81 -81 -91 -91 -98 -94 -98 -99 -98 -98 -98 -98 -98 -98 -97 -92 -98 -98 -98 -98 -98 -98 -97 -98 -96 -88 -98 -81 -81 -98 -81 -81 -81 -76 -51 -81 -81 -72 -90 -92 -97 -89 -93 -98 -98 -98 -96 -96 -91 -98 -96 -97 -96 -96 -90 -91 -91 -91 -98 -94 -98 -98 -96 -97 -96 -96 -92 -92 -81 -81 -51 -81 -81 -80 -81 -71 -59 -81 -81 -98 -98 -97 -82 -98 -99 -98 -97 -97 -98 -97 -91 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -81 -81 -81 -81 -83 -98 -99 -98 -98 -98 -98 -98 -91 -81 -81 -53 -82 -81 -81 -97 -96 -81 -80 -88 -82 -82 -95 -84 -81 -82 -59 -81 -81 -92 -98 -99 -83 -82 -52 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -94 -92 -98 -99 -98 -98 -98 -98 -99 -99 -98 -98 -82 -81 -61 -91 -96 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -98 -98 -98 -99 -98 -84 -85 -98 -98 -99 -96 -90 -98 -99 -90 -91 -99 -90 -91 -93 -91 -94 -92 -91 -98 -98 -98 -98 -82 -81 -83 -82 -82 -88 -82 -82 -82 -87 -74 -98 -82 -82 -98 -92 -92 -98 -98 -92 -98 -98 -91 -98 -98 -96 -99 -91 -98 -98 -98 -98 -91 -82 -81 -91 -97 -93 -82 -82 -98 -96 -82 -82 -96 -81 -98 -98 -98 -97 -98 -97 -88 -86 -89 -90 -89 -99 -89 -89 -89 -88 -93 -88 -89 -93 -93 -92 -91 -93 -96 -98 -98 -98 -98 -99 -98 -99 -97 -96 -91 -91 -98 -95 -98 -99 -98 -96 -96 -82 -91 -93 -94 -98 -99 -99 -97 -97 -41 -84 -98 -91 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -96 -91 -98 -98 -99 -98 -99 -91 -98 -98 -98 -98 -98 -98 -82 -81 -68 -83 -82 -99 -82 -81 -68 -82 -82 -43 -93 -91 -91 -91 -92 -92 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -82 -82 -95 -98 -98 -98 -98 -98 -99 -98 -91 -98 -98 -98 -98 -88 -97 -82 -82 -76 -91 -97 -98 -97 -98 -98 -91 -96 -82 -97 -82 -73 -98 -83 -82 -98 -98 -97 -82 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -92 -98 -99 -98 -98 -91 -98 -98 -98 -98 -99 -87 -90 -84 -98 -85 -85 -98 -98 -98 -98 -84 -99 -76 -98 -90 -96 -98 -99 -88 -82 -81 -93 -82 -91 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -82 -98 -96 -98 -97 -98 -91 -91 -98 -99 -98 -99 -98 -94 -99 -98 -98 -98 -99 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -99 -98 -82 -78 -83 -99 -98 -98 -97 -82 -83 -82 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -94 -97 -98 -98 -98 -85 -98 -98 -99 -82 -69 -82 -99 -99 -81 -94 -98 -91 -91 -90 -91 -92 -93 -98 -98 -82 -98 -82 -98 -98 -40 -77 -98 -98 -98 -97 -95 -98 -96 -98 -82 -94 -82 -82 -82 -98 -95 -98 -98 -98 -93 -98 -99 -98 -91 -98 -98 -97 -98 -97 -98 -99 -98 -98 -99 -99 -98 -98 -98 -99 -98 -98 -91 -91 -93 -92 -91 -96 -95 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -91 -96 -98 -98 -98 -98 -98 -97 -98 -85 -84 -84 -85 -85 -92 -99 -97 -98 -76 -93 -91 -91 -98 -98 -98 -97 -91 -91 -98 -98 -98 -98 -96 -98 -98 -98 -95 -98 -98 -98 -95 -83 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -94 -98 -82 -90 -83 -91 -81 -83 -86 -82 -81 -48 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -89 -94 -85 -89 -98 -99 -84 -98 -81 -98 -81 -98 -93 -99 -98 -98 -98 -98 -98 -98 -98 -98 -80 -79 -84 -82 -98 -99 -82 -97 -80 -88 -82 -98 -80 -83 -55 -80 -97 -85 -80 -96 -84 -98 -99 -99 -98 -98 -98 -98 -97 -91 -97 -97 -98 -96 -98 -99 -98 -98 -98 -99 -99 -98 -98 -98 -98 -99 -99 -96 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -97 -92 -98 -99 -98 -98 -96 -98 -99 -99 -98 -92 -98 -98 -99 -99 -99 -49 -98 -96 -89 -89 -89 -98 -97 -92 -92 -92 -79 -76 -93 -93 -90 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -81 -81 -57 -82 -81 -81 -98 -99 -93 -98 -82 -98 -98 -96 -96 -95 -99 -91 -91 -91 -96 -98 -94 -91 -98 -81 -81 -81 -85 -98 -89 -98 -93 -97 -98 -98 -98 -98 -99 -98 -96 -92 -91 -96 -96 -98 -98 -81 -98 -81 -98 -98 -98 -98 -98 -98 -99 -98 -78 -98 -98 -98 -92 -99 -98 -98 -99 -92 -81 -47 -81 -96 -81 -91 -95 -98 -86 -99 -97 -98 -98 -97 -98 -98 -98 -83 -93 -90 -91 -91 -90 -93 -98 -99 -98 -98 -98 -95 -92 -98 -98 -98 -99 -99 -98 -98 -99 -81 -97 -95 -97 -98 -97 -92 -87 -98 -98 -98 -98 -98 -93 -99 -98 -98 -98 -90 -98 -97 -90 -98 -99 -98 -98 -97 -98 -99 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -95 -95 -98 -97 -97 -92 -92 -92 -99 -97 -98 -98 -98 -98 -98 -96 -94 -98 -98 -98 -98 -98 -81 -67 -80 -81 -89 -84 -82 -98 -98 -99 -57 -76 -81 -98 -92 -92 -98 -98 -98 -99 -99 -98 -98 -98 -81 -81 -81 -98 -98 -98 -99 -98 -99 -98 -96 -81 -82 -98 -98 -98 -98 -98 -98 -99 -98 -99 -81 -94 -98 -82 -82 -61 -98 -97 -99 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -82 -93 -82 -98 -80 -49 -84 -81 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -90 -90 -97 -98 -98 -98 -98 -98 -93 -99 -98 -99 -99 -99 -99 -98 -98 -89 -98 -98 -98 -98 -98 -98 -98 -99 -77 -94 -99 -91 -92 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -82 -98 -98 -94 -98 -97 -98 -98 -98 -97 -98 -98 -94 -95 -96 -98 -98 -98 -90 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -96 -98 -99 -99 -98 -98 -98 -81 -72 -81 -82 -81 -98 -98 -98 -99 -97 -81 -68 -82 -98 -98 -98 -97 -99 -99 -97 -90 -98 -98 -88 -81 -84 -82 -82 -92 -84 -84 -84 -85 -98 -95 -98 -98 -98 -85 -94 -90 -90 -93 -93 -94 -96 -93 -94 -94 -82 -94 -82 -89 -93 -98 -98 -98 -99 -98 -98 -95 -82 -97 -82 -98 -98 -98 -96 -82 -96 -83 -89 -99 -82 -98 -82 -95 -82 -90 -96 -99 -50 -97 -97 -98 -93 -98 -94 -98 -99 -97 -94 -98 -98 -91 -94 -98 -98 -98 -98 -98 -96 -98 -89 -98 -92 -98 -98 -98 -98 -98 -98 -96 -94 -99 -91 -92 -93 -92 -92 -93 -92 -95 -92 -96 -92 -96 -97 -98 -98 -98 -98 -99 -98 -94 -96 -98 -98 -97 -98 -99 -97 -98 -98 -98 -82 -99 -83 -63 -83 -76 -83 -87 -99 -98 -98 -98 -87 -82 -83 -66 -98 -98 -98 -99 -97 -96 -98 -98 -98 -99 -99 -98 -85 -82 -83 -84 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -99 -98 -98 -98 -98 -98 -92 -98 -98 -82 -93 -83 -93 -96 -98 -89 -85 -90 -85 -85 -85 -85 -91 -99 -76 -94 -91 -92 -98 -98 -98 -90 -96 -91 -91 -82 -96 -82 -64 -98 -98 -98 -95 -98 -98 -98 -82 -98 -92 -83 -82 -53 -98 -59 -99 -98 -96 -96 -99 -91 -98 -98 -98 -98 -90 -97 -98 -98 -98 -98 -99 -98 -94 -99 -98 -99 -98 -98 -96 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -97 -99 -98 -98 -92 -98 -98 -99 -98 -98 -96 -98 -88 -89 -99 -99 -98 -98 -99 -98 -99 -98 -94 -94 -91 -91 -90 -91 -92 -92 -91 -82 -98 -81 -91 -81 -82 -81 -99 -81 -98 -98 -81 -91 -98 -81 -81 -95 -83 -62 -98 -99 -98 -98 -98 -92 -98 -82 -41 -82 -98 -98 -92 -98 -98 -99 -98 -99 -98 -98 -99 -98 -99 -98 -98 -98 -97 -98 -97 -97 -82 -83 -82 -98 -98 -99 -98 -99 -98 -98 -98 -98 -99 -92 -93 -97 -98 -96 -94 -90 -98 -95 -89 -91 -98 -98 -99 -96 -98 -96 -95 -98 -96 -82 -92 -98 -89 -97 -88 -88 -89 -89 -89 -86 -87 -89 -89 -89 -77 -88 -88 -89 -89 -89 -88 -88 -89 -89 -92 -94 -94 -94 -94 -92 -98 -94 -92 -98 -82 -98 -98 -90 -98 -98 -96 -98 -94 -83 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -95 -98 -98 -95 -94 -93 -98 -98 -98 -87 -92 -91 -84 -95 -96 -98 -98 -91 -98 -87 -82 -83 -64 -82 -60 -82 -89 -98 -82 -81 -85 -81 -41 -98 -51 -77 -94 -97 -92 -91 -91 -92 -92 -92 -92 -87 -87 -91 -86 -92 -93 -92 -83 -92 -92 -92 -92 -91 -82 -82 -82 -97 -90 -97 -98 -98 -94 -82 -82 -42 -82 -83 -98 -98 -98 -90 -98 -97 -84 -98 -88 -89 -84 -98 -89 -98 -98 -98 -98 -96 -98 -96 -96 -97 -97 -52 -93 -92 -92 -92 -99 -92 -91 -92 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -91 -97 -93 -94 -99 -95 -98 -98 -98 -98 -93 -98 -98 -98 -95 -82 -83 -82 -99 -98 -99 -98 -99 -98 -98 -98 -98 -94 -98 -98 -98 -98 -93 -98 -98 -98 -98 -95 -99 -98 -98 -98 -98 -98 -99 -92 -93 -98 -88 -82 -90 -82 -82 -53 -82 -94 -98 -94 -82 -98 -83 -82 -98 -98 -98 -98 -98 -99 -95 -99 -98 -99 -91 -98 -98 -98 -91 -98 -94 -97 -91 -88 -82 -99 -81 -81 -77 -98 -98 -91 -94 -94 -98 -92 -91 -93 -91 -92 -93 -81 -80 -81 -81 -73 -67 -93 -91 -98 -97 -91 -91 -98 -98 -94 -81 -98 -98 -98 -98 -98 -98 -81 -81 -55 -81 -81 -81 -66 -82 -97 -91 -98 -98 -98 -98 -97 -92 -91 -91 -98 -94 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -97 -97 -91 -98 -98 -98 -99 -93 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -91 -98 -99 -99 -92 -98 -91 -96 -96 -96 -91 -91 -88 -88 -90 -90 -89 -89 -89 -89 -97 -98 -90 -91 -91 -91 -91 -91 -97 -98 -98 -97 -98 -98 -98 -98 -98 -82 -98 -98 -95 -82 -82 -82 -98 -98 -98 -98 -98 -98 -82 -55 -83 -98 -90 -82 -82 -70 -90 -82 -82 -98 -80 -88 -98 -97 -97 -99 -91 -98 -98 -83 -98 -97 -98 -98 -98 -99 -99 -98 -98 -98 -98 -82 -81 -99 -94 -82 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -92 -98 -82 -44 -82 -98 -82 -98 -88 -89 -98 -98 -99 -98 -98 -98 -98 -95 -95 -97 -93 -94 -94 -94 -93 -94 -93 -94 -98 -98 -99 -99 -98 -99 -98 -99 -99 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -90 -91 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -87 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -90 -99 -98 -98 -98 -98 -97 -97 -98 -89 -98 -98 -98 -90 -99 -98 -99 -99 -77 -98 -98 -89 -98 -94 -98 -83 -98 -98 -81 -98 -84 -81 -98 -98 -98 -98 -99 -86 -81 -98 -90 -93 -98 -98 -96 -98 -98 -94 -98 -98 -94 -98 -82 -83 -83 -92 -94 -90 -90 -86 -98 -83 -90 -88 -98 -82 -99 -98 -98 -82 -83 -82 -98 -99 -80 -98 -98 -95 -73 -82 -81 -41 -82 -88 -80 -93 -98 -98 -84 -98 -99 -99 -92 -80 -81 -84 -82 -82 -82 -52 -81 -99 -96 -91 -82 -98 -83 -78 -82 -89 -81 -98 -98 -83 -82 -82 -82 -76 -94 -93 -93 -91 -91 -92 -82 -94 -94 -93 -94 -90 -94 -93 -94 -94 -41 -94 -94 -94 -94 -81 -52 -81 -95 -95 -94 -91 -81 -93 -89 -81 -81 -82 -98 -98 -98 -93 -90 -94 -98 -96 -98 -98 -97 -98 -98 -95 -96 -99 -99 -98 -98 -98 -95 -98 -97 -98 -98 -98 -87 -82 -91 -81 -62 -80 -88 -81 -81 -87 -89 -89 -89 -89 -89 -89 -90 -86 -88 -85 -89 -89 -77 -89 -89 -89 -89 -90 -89 -89 -89 -97 -90 -89 -94 -89 -84 -97 -91 -82 -95 -90 -89 -98 -98 -98 -99 -96 -83 -85 -86 -85 -82 -85 -86 -84 -85 -98 -98 -90 -89 -91 -99 -98 -99 -99 -88 -98 -98 -81 -87 -98 -98 -98 -98 -98 -98 -83 -70 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -94 -98 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -88 -98 -98 -98 -99 -98 -99 -96 -94 -90 -92 -95 -94 -92 -92 -90 -92 -87 -92 -93 -89 -92 -88 -89 -91 -92 -89 -91 -96 -95 -83 -82 -83 -96 -81 -63 -98 -82 -82 -69 -82 -91 -82 -41 -98 -95 -98 -99 -98 -90 -98 -99 -98 -98 -98 -98 -99 -98 -97 -96 -99 -90 -96 -96 -98 -98 -99 -98 -98 -98 -98 -98 -96 -98 -97 -91 -98 -82 -57 -82 -41 -98 -98 -97 -82 -40 -98 -40 -41 -98 -81 -81 -81 -98 -91 -96 -96 -97 -91 -84 -85 -86 -85 -85 -86 -89 -89 -89 -89 -88 -89 -78 -97 -90 -88 -85 -93 -98 -94 -93 -90 -93 -94 -94 -98 -99 -93 -93 -93 -93 -92 -81 -93 -93 -94 -81 -98 -89 -91 -95 -94 -89 -87 -81 -94 -94 -88 -81 -90 -81 -41 -98 -91 -94 -94 -94 -93 -94 -84 -84 -94 -99 -96 -98 -92 -98 -98 -91 -98 -98 -96 -98 -98 -99 -98 -98 -99 -96 -93 -89 -98 -99 -98 -98 -98 -96 -96 -97 -97 -96 -95 -95 -96 -96 -96 -96 -97 -86 -87 -96 -89 -91 -91 -91 -80 -91 -82 -65 -82 -89 -88 -72 -89 -89 -90 -90 -89 -91 -80 -89 -52 -90 -90 -90 -92 -92 -63 -81 -82 -81 -96 -81 -94 -94 -81 -81 -50 -80 -93 -93 -97 -96 -93 -93 -93 -93 -93 -93 -80 -90 -98 -80 -98 -81 -98 -81 -53 -98 -98 -97 -98 -81 -81 -63 -83 -98 -98 -93 -98 -52 -82 -98 -98 -98 -97 -98 -90 -91 -98 -91 -91 -91 -91 -98 -98 -98 -98 -91 -88 -91 -97 -84 -98 -92 -93 -94 -89 -89 -89 -90 -89 -89 -99 -98 -98 -94 -94 -98 -92 -98 -98 -98 -98 -94 -93 -96 -98 -94 -82 -93 -82 -93 -94 -99 -95 -99 -94 -93 -91 -82 -95 -98 -98 -93 -94 -94 -96 -93 -98 -96 -90 -94 -91 -93 -94 -88 -91 -94 -94 -90 -93 -94 -97 -98 -98 -98 -94 -94 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -96 -91 -94 -98 -84 -96 -98 -85 -98 -65 -97 -51 -94 -94 -98 -99 -81 -99 -82 -98 -69 -98 -98 -81 -98 -98 -81 -52 -98 -99 -98 -99 -95 -81 -98 -97 -98 -83 -81 -98 -82 -96 -82 -85 -98 -91 -99 -98 -98 -98 -93 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -40 -73 -85 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -93 -99 -98 -98 -99 -84 -82 -82 -94 -83 -93 -85 -85 -86 -98 -98 -99 -98 -97 -98 -98 -94 -98 -98 -99 -98 -98 -99 -98 -96 -92 -98 -91 -91 -98 -98 -98 -98 -98 -98 -90 -93 -83 -99 -98 -98 -98 -98 -98 -91 -98 -99 -98 -98 -91 -98 -99 -99 -97 -96 -91 -98 -96 -91 -98 -98 -98 -98 -98 -98 -99 -98 -96 -97 -82 -99 -81 -81 -82 -99 -98 -98 -98 -98 -98 -98 -96 -96 -98 -91 -92 -98 -98 -98 -99 -98 -95 -93 -97 -81 -81 -53 -81 -81 -96 -81 -96 -81 -84 -46 -80 -91 -83 -76 -98 -98 -98 -78 -98 -97 -94 -94 -93 -94 -90 -82 -85 -83 -97 -99 -98 -98 -98 -98 -98 -99 -98 -99 -98 -94 -99 -82 -98 -87 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -90 -96 -95 -73 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -95 -99 -94 -98 -98 -82 -82 -65 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -91 -94 -94 -89 -89 -89 -89 -89 -98 -93 -93 -98 -94 -98 -94 -93 -98 -92 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -82 -98 -98 -98 -98 -98 -98 -99 -98 -98 -82 -98 -82 -75 -99 -96 -91 -98 -90 -98 -98 -97 -98 -96 -91 -98 -98 -98 -98 -96 -90 -98 -97 -98 -98 -98 -82 -98 -82 -54 -82 -83 -82 -98 -83 -42 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -82 -95 -83 -41 -98 -98 -98 -96 -99 -84 -88 -93 -99 -98 -98 -98 -98 -98 -98 -98 -99 -93 -94 -94 -94 -98 -98 -93 -98 -96 -98 -98 -91 -98 -98 -98 -98 -41 -86 -91 -91 -81 -98 -99 -98 -98 -40 -98 -97 -98 -97 -98 -81 -80 -80 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -99 -98 -97 -99 -98 -91 -98 -91 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -94 -88 -97 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -96 -98 -90 -89 -89 -89 -89 -89 -90 -94 -90 -88 -99 -98 -89 -96 -76 -98 -81 -98 -98 -98 -98 -84 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -81 -81 -98 -98 -83 -98 -88 -99 -98 -90 -99 -94 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -97 -93 -94 -94 -99 -93 -98 -98 -92 -89 -98 -89 -91 -89 -89 -98 -40 -98 -85 -83 -40 -80 -82 -91 -93 -94 -89 -94 -94 -40 -92 -92 -93 -94 -96 -89 -98 -40 -89 -83 -89 -83 -40 -91 -94 -97 -98 -97 -89 -41 -77 -98 -99 -99 -95 -98 -89 -89 -97 -91 -99 -93 -89 -90 -95 -98 -94 -88 -89 -98 -98 -95 -95 -98 -94 -94 -91 -99 -93 -89 -95 -98 -89 -97 -91 -92 -95 -89 -94 -84 -98 -98 -99 -91 -98 -94 -87 -41 -53 -82 -98 -82 -81 -81 -89 -98 -58 -82 -95 -98 -98 -91 -90 -89 -98 -90 -41 -95 -90 -92 -95 -97 -94 -90 -96 -95 -89 -98 -82 -87 -98 -80 -96 -99 -82 -93 -98 -91 -85 -83 -82 -96 -84 -84 -98 -81 -81 -91 -82 -73 -82 -41 -81 -86 -82 -93 -82 -83 -80 -59 -81 -96 -41 -87 -91 -86 -98 -96 -93 -98 -51 -41 -41 -80 -98 -98 -98 -89 -98 -98 -84 -98 -98 -98 -98 -80 -98 -96 -98 -98 -94 -98 -99 -99 -98 -87 -96 -98 -88 -98 -90 -84 -98 -98 -96 -98 -88 -97 -98 -89 -88 -98 -98 -85 -89 -98 -89 -97 -91 -89 -90 -93 -92 -95 -98 -99 -99 -96 -90 -98 -98 -93 -80 -80 -80 -97 -97 -98 -98 -97 -94 -81 -97 -94 -98 -96 -95 -98 -98 -85 -85 -98 -97 -94 -98 -98 -98 -98 -92 -81 -94 -98 -95 -96 -91 -90 -98 -98 -94 -98 -94 -98 -96 -98 -95 -98 -98 -94 -96 -98 -84 -98 -98 -88 -82 -95 -81 -61 -81 -96 -82 -94 -89 -79 -94 -96 -90 -79 -81 -81 -80 -80 -98 -91 -97 -98 -81 -82 -94 -85 -88 -94 -82 -85 -81 -98 -80 -80 -85 -90 -91 -78 -94 -84 -88 -83 -82 -82 -73 -69 -79 -81 -89 -90 -94 -99 -98 -87 -83 -82 -82 -82 -83 -82 -94 -87 -86 -99 -82 -52 -98 -82 -91 -82 -80 -82 -87 -81 -89 -91 -82 -81 -40 -96 -85 -98 -81 -98 -87 -96 -88 -98 -94 -98 -95 -93 -95 -98 -97 -92 -93 -96 -88 -92 -84 -99 -98 -96 -99 -99 -98 -92 -97 -89 -98 -98 -99 -89 -99 -92 -98 -97 -98 -80 -80 -82 -82 -90 -91 -93 -98 -97 -95 -94 -97 -94 -80 -61 -81 -81 -90 -87 -92 -91 -94 -87 -92 -91 -89 -89 -89 -97 -94 -94 -98 -92 -90 -92 -96 -84 -97 -89 -97 -94 -94 -98 -93 -89 -96 -95 -95 -90 -97 -98 -98 -97 -92 -98 -86 -98 -95 -82 -81 -82 -82 -82 -82 -98 -88 -81 -81 -79 -81 -81 -81 -98 -86 -80 -87 -67 -80 -81 -80 -88 -81 -92 -91 -87 -88 -89 -88 -94 -93 -90 -86 -94 -91 -88 -90 -82 -93 -82 -82 -99 -81 -98 -80 -99 -95 -98 -99 -89 -88 -94 -96 -82 -82 -90 -81 -99 -82 -82 -98 -82 -84 -82 -98 -43 -89 -97 -92 -98 -98 -93 -98 -98 -99 -98 -95 -95 -98 -98 -90 -92 -89 -95 -98 -96 -97 -84 -98 -98 -93 -91 -98 -99 -98 -98 -82 -90 -82 -98 -91 -97 -92 -92 -87 -95 -98 -92 -90 -91 -98 -97 -98 -95 -96 -96 -91 -89 -96 -93 -91 -99 -98 -92 -98 -98 -88 -88 -92 -91 -94 -93 -92 -94 -99 -89 -98 -98 -89 -98 -94 -89 -96 -89 -95 -86 -96 -94 -90 -89 -82 -94 -84 -96 -89 -94 -98 -98 -87 -92 -91 -98 -98 -97 -98 -84 -98 -98 -85 -99 -92 -98 -84 -92 -97 -92 -98 -84 -91 -95 -96 -95 -92 -90 -95 -98 -92 -98 -98 -87 -83 -98 -99 -82 -99 -81 -98 -81 -96 -89 -98 -97 -98 -98 -99 -96 -92 -91 -99 -98 -98 -80 -98 -98 -99 -98 -84 -85 -84 -85 -84 -83 -84 -88 -98 -77 -87 -51 -94 -81 -82 -99 -92 -98 -95 -40 -41 -98 -98 -98 -81 -98 -99 -98 -98 -98 -92 -99 -93 -98 -94 -95 -94 -98 -89 -97 -90 -82 -86 -82 -56 -96 -82 -98 -82 -89 -64 -92 -72 -93 -98 -98 -80 -83 -98 -82 -82 -54 -84 -96 -98 -98 -82 -78 -98 -99 -93 -94 -98 -92 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -92 -98 -99 -95 -91 -91 -99 -98 -95 -90 -98 -98 -98 -98 -98 -98 -98 -98 -79 -94 -81 -92 -93 -93 -93 -94 -94 -94 -94 -94 -98 -98 -98 -98 -98 -98 -98 -98 -96 -87 -80 -98 -81 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -99 -90 -82 -44 -82 -84 -82 -98 -98 -98 -98 -99 -99 -99 -98 -98 -96 -90 -90 -96 -96 -98 -98 -99 -98 -82 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -92 -82 -82 -41 -96 -91 -99 -98 -97 -98 -85 -84 -92 -84 -99 -85 -87 -84 -84 -90 -85 -84 -78 -94 -94 -94 -95 -96 -98 -94 -94 -94 -94 -94 -94 -94 -94 -98 -94 -98 -94 -92 -94 -82 -94 -94 -85 -82 -91 -94 -41 -82 -94 -82 -89 -81 -85 -82 -90 -82 -98 -98 -98 -97 -97 -97 -94 -99 -99 -95 -98 -98 -92 -98 -98 -98 -98 -98 -91 -98 -97 -99 -98 -95 -95 -94 -94 -95 -94 -94 -95 -94 -95 -94 -97 -97 -98 -98 -98 -90 -98 -99 -98 -98 -99 -98 -98 -98 -84 -99 -98 -98 -98 -98 -98 -99 -98 -78 -99 -98 -93 -94 -98 -99 -98 -99 -98 -97 -94 -92 -94 -94 -94 -93 -98 -98 -98 -98 -98 -98 -98 -96 -98 -99 -98 -98 -97 -81 -99 -81 -98 -99 -82 -77 -90 -98 -89 -99 -98 -98 -98 -98 -98 -95 -91 -91 -91 -91 -98 -95 -95 -96 -98 -99 -91 -98 -98 -98 -98 -98 -88 -94 -94 -89 -90 -96 -90 -90 -90 -90 -90 -90 -89 -90 -82 -80 -84 -80 -85 -85 -85 -85 -96 -98 -85 -98 -90 -98 -81 -64 -81 -98 -81 -99 -81 -98 -98 -81 -98 -81 -63 -80 -66 -98 -82 -98 -82 -75 -41 -97 -98 -98 -93 -98 -98 -98 -98 -99 -98 -98 -98 -98 -94 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -94 -97 -97 -97 -97 -98 -96 -98 -84 -98 -99 -98 -98 -82 -83 -99 -98 -77 -82 -98 -82 -90 -89 -40 -94 -90 -95 -93 -93 -94 -93 -93 -94 -93 -98 -95 -95 -95 -98 -80 -92 -97 -83 -82 -73 -98 -97 -98 -82 -92 -98 -94 -83 -70 -98 -97 -98 -98 -92 -91 -90 -98 -90 -98 -98 -98 -94 -91 -98 -99 -98 -95 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -95 -92 -98 -98 -98 -98 -90 -98 -98 -98 -98 -96 -95 -90 -91 -89 -89 -81 -81 -90 -98 -81 -81 -81 -77 -81 -81 -94 -95 -83 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -98 -95 -81 -82 -98 -98 -95 -92 -82 -98 -83 -98 -98 -98 -98 -98 -98 -98 -98 -94 -96 -97 -98 -98 -92 -98 -99 -95 -95 -91 -91 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -90 -91 -88 -82 -82 -40 -82 -82 -98 -98 -99 -98 -98 -98 -86 -91 -99 -98 -98 -98 -99 -98 -98 -94 -89 -96 -98 -98 -99 -98 -99 -98 -98 -95 -98 -94 -94 -82 -82 -56 -82 -82 -62 -82 -82 -70 -98 -98 -98 -99 -98 -98 -98 -98 -98 -91 -93 -98 -98 -99 -95 -98 -90 -98 -97 -98 -97 -98 -98 -97 -98 -98 -98 -92 -95 -90 -91 -98 -97 -98 -98 -98 -98 -98 -98 -98 -99 -95 -98 -98 -91 -98 -99 -91 -91 -99 -99 -98 -98 -98 -98 -98 -98 -98 -82 -82 -84 -82 -82 -81 -81 -50 -98 -98 -90 -80 -80 -64 -81 -81 -97 -81 -80 -94 -80 -81 -86 -80 -80 -98 -81 -82 -82 -82 -82 -97 -80 -80 -61 -98 -98 -98 -98 -99 -98 -98 -98 -97 -99 -98 -99 -98 -98 -98 -95 -88 -98 -98 -98 -99 -98 -95 -96 -96 -96 -95 -95 -96 -95 -96 -96 -95 -96 -95 -100 -80 -80 -85 -80 -93 -91 -97 -97 -98 -97 -98 -97 -98 -98 -81 -80 -81 -80 -80 -97 -97 -97 -90 -97 -90 -82 -82 -77 -91 -92 -98 -76 -94 -97 -94 -94 -94 -94 -94 -94 -94 -95 -92 -97 -95 -98 -98 -98 -98 -98 -98 -99 -98 -92 -99 -92 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -91 -98 -97 -98 -92 -97 -98 -98 -98 -82 -82 -58 -86 -82 -82 -95 -98 -82 -81 -97 -91 -80 -81 -41 -81 -81 -50 -98 -98 -98 -98 -98 -98 -81 -81 -98 -98 -82 -82 -82 -82 -60 -97 -98 -98 -98 -86 -98 -98 -98 -98 -84 -85 -85 -85 -98 -97 -98 -98 -76 -97 -92 -92 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -99 -98 -98 -98 -98 -98 -98 -85 -82 -82 -89 -78 -90 -91 -98 -82 -82 -95 -97 -81 -82 -68 -99 -53 -98 -98 -92 -98 -99 -98 -98 -98 -90 -98 -98 -99 -98 -97 -98 -97 -96 -98 -98 -82 -82 -88 -82 -83 -79 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -99 -99 -92 -98 -98 -99 -98 -99 -98 -96 -98 -84 -98 -98 -98 -99 -98 -98 -98 -98 -76 -94 -96 -94 -94 -94 -94 -95 -98 -98 -98 -90 -90 -98 -98 -98 -98 -95 -98 -99 -99 -98 -85 -98 -82 -82 -98 -80 -80 -98 -98 -82 -82 -77 -82 -82 -95 -98 -82 -82 -95 -82 -82 -98 -80 -81 -98 -98 -98 -98 -98 -98 -98 -81 -81 -82 -82 -99 -82 -82 -81 -81 -81 -92 -96 -96 -92 -98 -96 -98 -98 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -98 -89 -98 -97 -97 -98 -89 -89 -90 -90 -90 -90 -81 -81 -77 -76 -81 -94 -93 -94 -94 -94 -95 -81 -81 -48 -94 -94 -94 -80 -81 -41 -94 -98 -94 -94 -99 -92 -98 -94 -81 -98 -98 -98 -98 -98 -98 -98 -80 -81 -52 -81 -80 -76 -98 -92 -98 -98 -95 -96 -91 -91 -88 -98 -98 -98 -98 -98 -98 -96 -99 -98 -99 -98 -95 -90 -98 -96 -98 -98 -98 -98 -99 -95 -98 -98 -96 -91 -99 -98 -93 -95 -98 -91 -95 -97 -91 -95 -92 -98 -92 -98 -98 -99 -86 -84 -98 -98 -98 -98 -95 -91 -99 -99 -94 -95 -94 -94 -94 -94 -94 -80 -81 -98 -80 -81 -67 -95 -91 -98 -98 -81 -81 -98 -82 -82 -93 -97 -98 -82 -82 -97 -99 -99 -98 -96 -98 -92 -82 -82 -87 -82 -82 -85 -92 -98 -99 -95 -91 -98 -98 -98 -98 -97 -98 -98 -99 -98 -95 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -82 -82 -98 -89 -81 -81 -84 -85 -82 -80 -85 -82 -82 -96 -82 -81 -98 -99 -98 -84 -90 -84 -87 -85 -82 -88 -98 -98 -98 -98 -95 -91 -98 -98 -98 -98 -95 -84 -97 -90 -96 -98 -84 -99 -84 -93 -40 -98 -40 -98 -99 -98 -40 -96 -95 -98 -96 -95 -90 -96 -84 -40 -92 -84 -98 -90 -85 -94 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -99 -91 -96 -81 -81 -81 -81 -81 -86 -97 -89 -98 -98 -98 -98 -98 -98 -81 -81 -76 -81 -81 -92 -81 -64 -94 -41 -98 -82 -82 -83 -82 -81 -82 -82 -98 -98 -98 -98 -98 -98 -89 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -91 -98 -98 -98 -98 -92 -98 -96 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -96 -98 -98 -97 -98 -98 -99 -98 -98 -97 -98 -82 -82 -82 -82 -72 -83 -82 -82 -85 -82 -82 -89 -81 -81 -97 -95 -95 -91 -81 -81 -81 -80 -81 -46 -88 -89 -89 -89 -87 -98 -98 -98 -98 -76 -96 -98 -92 -92 -98 -98 -97 -98 -97 -98 -80 -81 -62 -81 -81 -83 -81 -81 -98 -96 -81 -81 -93 -95 -98 -91 -81 -81 -98 -81 -81 -98 -82 -82 -82 -82 -82 -41 -82 -82 -94 -98 -81 -81 -41 -81 -79 -98 -82 -82 -98 -98 -81 -81 -54 -40 -81 -81 -98 -40 -82 -82 -52 -82 -82 -99 -81 -82 -66 -83 -99 -81 -82 -82 -82 -99 -97 -81 -81 -98 -81 -81 -41 -81 -81 -99 -81 -81 -98 -79 -81 -98 -98 -82 -82 -99 -98 -98 -76 -94 -98 -94 -90 -90 -98 -96 -98 -96 -96 -96 -96 -96 -96 -95 -95 -96 -96 -95 -96 -95 -96 -96 -96 -99 -93 -95 -83 -95 -96 -95 -95 -95 -95 -96 -96 -95 -98 -95 -93 -82 -83 -94 -83 -83 -83 -83 -82 -73 -97 -98 -98 -98 -95 -98 -98 -98 -97 -83 -82 -83 -83 -83 -63 -97 -97 -98 -99 -94 -91 -91 -83 -91 -91 -91 -91 -91 -91 -91 -91 -83 -83 -83 -82 -82 -82 -87 -82 -82 -85 -80 -82 -89 -40 -81 -81 -80 -80 -80 -76 -81 -81 -41 -57 -91 -82 -82 -98 -98 -91 -91 -98 -98 -57 -98 -98 -97 -96 -99 -96 -83 -98 -99 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -91 -99 -97 -99 -90 -92 -98 -96 -96 -98 -91 -91 -82 -82 -82 -69 -82 -82 -98 -83 -82 -98 -98 -82 -83 -99 -60 -81 -81 -82 -81 -81 -81 -81 -87 -81 -81 -75 -81 -82 -89 -83 -83 -72 -85 -82 -82 -84 -83 -83 -98 -98 -97 -98 -88 -89 -98 -98 -97 -98 -98 -98 -98 -91 -94 -97 -92 -94 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -82 -83 -98 -83 -83 -78 -83 -83 -89 -74 -98 -98 -98 -98 -98 -98 -98 -90 -99 -98 -99 -95 -91 -99 -98 -98 -98 -99 -98 -98 -98 -98 -86 -83 -82 -98 -98 -81 -80 -80 -81 -67 -98 -98 -98 -99 -98 -95 -91 -89 -98 -96 -98 -99 -98 -98 -98 -98 -77 -93 -95 -93 -94 -94 -95 -91 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -80 -81 -66 -81 -98 -80 -81 -81 -80 -70 -81 -98 -80 -80 -97 -95 -81 -81 -98 -80 -81 -49 -81 -81 -64 -81 -81 -90 -80 -80 -98 -99 -98 -96 -98 -99 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -92 -95 -99 -98 -91 -98 -98 -98 -96 -91 -97 -98 -94 -79 -81 -99 -82 -82 -96 -82 -80 -81 -81 -81 -81 -92 -84 -92 -94 -98 -98 -82 -81 -81 -81 -81 -99 -81 -81 -81 -81 -84 -98 -98 -91 -98 -82 -97 -97 -98 -98 -98 -98 -97 -94 -98 -98 -91 -98 -98 -99 -98 -92 -98 -98 -98 -97 -92 -98 -98 -99 -98 -98 -98 -94 -99 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -92 -98 -98 -91 -96 -96 -97 -98 -98 -56 -94 -88 -88 -89 -88 -89 -98 -98 -99 -98 -98 -81 -81 -95 -87 -81 -81 -83 -90 -98 -90 -98 -99 -99 -98 -98 -98 -98 -98 -82 -82 -96 -81 -81 -89 -96 -82 -98 -95 -81 -81 -40 -98 -82 -82 -40 -95 -98 -57 -98 -99 -92 -98 -98 -96 -91 -93 -97 -98 -98 -98 -95 -98 -98 -98 -95 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -82 -82 -98 -94 -82 -82 -82 -82 -82 -72 -82 -81 -85 -97 -78 -81 -81 -82 -82 -81 -93 -91 -91 -98 -77 -90 -99 -93 -98 -94 -99 -98 -98 -98 -94 -98 -99 -98 -96 -91 -98 -98 -98 -91 -98 -98 -84 -93 -91 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -93 -91 -98 -98 -88 -89 -93 -88 -94 -84 -98 -84 -98 -98 -98 -96 -99 -99 -98 -96 -98 -98 -95 -96 -96 -98 -84 -98 -89 -97 -48 -90 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -82 -82 -82 -82 -52 -98 -98 -98 -96 -89 -98 -97 -98 -88 -99 -98 -98 -98 -99 -98 -82 -82 -93 -82 -82 -57 -40 -81 -81 -99 -81 -81 -98 -81 -81 -81 -81 -60 -87 -81 -81 -81 -81 -98 -81 -81 -98 -81 -81 -81 -81 -81 -81 -90 -81 -81 -81 -80 -41 -81 -81 -99 -80 -81 -92 -98 -41 -98 -95 -99 -98 -98 -98 -98 -98 -98 -96 -81 -81 -99 -82 -83 -98 -82 -82 -82 -82 -51 -98 -80 -81 -52 -81 -81 -98 -81 -81 -99 -82 -89 -98 -97 -98 -92 -98 -98 -98 -98 -95 -96 -98 -91 -92 -98 -98 -81 -81 -82 -82 -84 -96 -82 -91 -99 -98 -98 -98 -99 -82 -82 -81 -82 -100 -90 -95 -91 -91 -95 -91 -95 -91 -95 -98 -94 -98 -98 -98 -98 -98 -81 -82 -82 -98 -98 -98 -95 -99 -98 -98 -91 -95 -99 -96 -98 -98 -95 -98 -98 -98 -98 -98 -98 -98 -98 -81 -98 -82 -52 -99 -98 -91 -99 -95 -91 -99 -98 -89 -88 -98 -91 -98 -99 -98 -98 -98 -87 -94 -98 -92 -98 -98 -92 -93 -99 -98 -98 -98 -98 -96 -81 -98 -86 -81 -81 -72 -81 -82 -97 -96 -82 -91 -81 -51 -98 -81 -41 -90 -81 -98 -62 -98 -90 -98 -98 -98 -81 -76 -82 -84 -81 -95 -81 -96 -98 -98 -98 -98 -81 -99 -81 -73 -98 -98 -98 -98 -99 -98 -98 -98 -97 -98 -98 -98 -98 -88 -93 -94 -98 -98 -98 -99 -97 -98 -99 -93 -98 -91 -98 -98 -98 -98 -92 -97 -98 -98 -81 -98 -81 -98 -81 -78 -98 -98 -98 -77 -84 -81 -92 -92 -92 -92 -92 -82 -82 -41 -40 -99 -98 -98 -92 -98 -99 -99 -99 -99 -99 -94 -82 -87 -98 -98 -82 -86 -82 -98 -98 -98 -98 -98 -94 -98 -98 -98 -98 -91 -98 -93 -98 -98 -97 -98 -98 -98 -98 -98 -91 -81 -82 -80 -98 -98 -98 -96 -92 -98 -95 -95 -88 -98 -84 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -99 -91 -98 -98 -95 -99 -91 -97 -97 -84 -84 -85 -87 -85 -98 -98 -98 -98 -78 -81 -52 -91 -93 -82 -99 -98 -98 -98 -96 -98 -91 -98 -98 -82 -98 -98 -80 -96 -81 -85 -81 -92 -81 -85 -81 -76 -81 -95 -91 -81 -82 -63 -98 -98 -91 -98 -98 -98 -97 -99 -98 -41 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -99 -98 -98 -99 -98 -98 -99 -98 -98 -82 -98 -81 -86 -77 -81 -81 -95 -81 -90 -81 -98 -81 -98 -88 -81 -95 -80 -98 -81 -58 -80 -81 -76 -80 -59 -93 -94 -92 -80 -90 -95 -84 -52 -82 -98 -80 -82 -82 -76 -95 -91 -98 -92 -94 -40 -93 -81 -72 -98 -81 -72 -81 -69 -98 -97 -99 -99 -98 -91 -98 -98 -98 -91 -99 -99 -98 -98 -98 -99 -98 -98 -98 -98 -99 -99 -99 -99 -96 -99 -98 -98 -98 -98 -98 -94 -98 -97 -97 -90 -95 -96 -98 -97 -91 -81 -98 -98 -98 -89 -82 -98 -97 -98 -91 -91 -98 -98 -98 -98 -96 -78 -81 -84 -83 -85 -85 -91 -85 -85 -89 -84 -85 -84 -83 -84 -83 -84 -84 -84 -84 -84 -84 -87 -84 -83 -84 -84 -77 -90 -90 -93 -93 -82 -82 -81 -86 -80 -99 -56 -99 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -90 -90 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -51 -41 -90 -91 -98 -98 -99 -98 -98 -97 -81 -80 -98 -98 -98 -98 -98 -98 -41 -98 -77 -85 -81 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -92 -94 -92 -92 -90 -97 -95 -92 -92 -92 -92 -92 -92 -92 -88 -85 -81 -81 -58 -61 -41 -81 -85 -81 -74 -99 -82 -83 -81 -81 -45 -99 -81 -51 -81 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -99 -98 -98 -91 -98 -98 -98 -98 -96 -98 -96 -97 -84 -84 -84 -84 -84 -84 -84 -84 -85 -84 -84 -85 -87 -94 -80 -92 -91 -94 -94 -94 -94 -81 -82 -81 -94 -94 -94 -81 -95 -99 -99 -94 -98 -98 -81 -91 -99 -98 -82 -88 -81 -98 -81 -98 -81 -81 -81 -97 -81 -88 -89 -98 -97 -97 -97 -90 -98 -98 -99 -91 -98 -94 -82 -95 -83 -82 -81 -99 -98 -90 -90 -96 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -99 -99 -98 -98 -98 -98 -99 -81 -90 -82 -96 -98 -98 -91 -81 -81 -56 -79 -92 -81 -98 -98 -97 -98 -41 -98 -76 -93 -92 -91 -92 -92 -92 -93 -92 -92 -92 -92 -92 -94 -98 -98 -81 -81 -47 -81 -98 -81 -83 -94 -81 -98 -81 -98 -81 -91 -81 -82 -73 -81 -82 -98 -92 -80 -82 -82 -81 -99 -98 -82 -82 -58 -82 -82 -81 -90 -81 -96 -82 -79 -86 -98 -81 -94 -82 -82 -65 -84 -80 -98 -81 -80 -98 -89 -98 -88 -98 -98 -81 -98 -98 -99 -98 -98 -98 -98 -99 -86 -93 -89 -84 -92 -85 -85 -99 -97 -80 -80 -84 -85 -85 -84 -85 -98 -95 -95 -92 -93 -83 -94 -84 -98 -98 -95 -94 -98 -98 -82 -81 -99 -81 -98 -82 -47 -81 -97 -85 -82 -84 -82 -81 -89 -81 -98 -81 -59 -82 -93 -81 -81 -54 -98 -81 -98 -99 -96 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -95 -92 -97 -98 -98 -99 -99 -98 -92 -95 -98 -98 -99 -98 -87 -84 -91 -98 -81 -92 -81 -97 -82 -91 -82 -81 -97 -98 -98 -92 -98 -98 -98 -51 -68 -98 -98 -98 -85 -93 -99 -98 -81 -61 -98 -81 -98 -78 -94 -94 -94 -92 -93 -94 -81 -81 -94 -85 -98 -98 -98 -92 -98 -98 -92 -95 -92 -96 -92 -82 -95 -98 -98 -98 -98 -98 -98 -98 -99 -98 -92 -98 -98 -94 -98 -98 -99 -92 -98 -98 -99 -98 -98 -91 -98 -98 -98 -98 -98 -98 -81 -41 -81 -95 -81 -55 -81 -98 -95 -91 -98 -98 -98 -81 -83 -81 -94 -85 -98 -63 -99 -78 -98 -98 -92 -92 -94 -94 -99 -98 -81 -81 -99 -93 -98 -98 -99 -98 -94 -99 -98 -98 -99 -98 -93 -82 -98 -99 -98 -99 -99 -95 -98 -98 -98 -98 -98 -93 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -98 -98 -85 -98 -98 -98 -98 -98 -97 -98 -99 -96 -91 -92 -98 -98 -98 -99 -98 -98 -98 -98 -81 -78 -81 -85 -98 -98 -98 -98 -96 -98 -76 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -87 -99 -98 -98 -90 -98 -98 -98 -98 -94 -98 -99 -92 -92 -92 -92 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -99 -98 -98 -99 -98 -93 -81 -81 -98 -81 -61 -98 -98 -81 -89 -98 -98 -81 -91 -99 -82 -91 -94 -97 -97 -98 -98 -99 -98 -93 -95 -91 -98 -92 -98 -98 -96 -98 -98 -98 -41 -99 -98 -92 -88 -98 -82 -82 -57 -98 -98 -82 -82 -67 -98 -99 -98 -98 -98 -98 -98 -98 -97 -81 -72 -82 -98 -98 -98 -98 -99 -98 -84 -84 -99 -98 -98 -98 -99 -98 -98 -78 -99 -92 -92 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -92 -98 -98 -96 -82 -82 -98 -98 -99 -98 -92 -98 -98 -98 -98 -98 -92 -99 -97 -98 -98 -91 -98 -82 -98 -82 -77 -98 -99 -98 -98 -98 -92 -99 -98 -95 -98 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -99 -99 -94 -98 -99 -93 -92 -91 -95 -98 -92 -92 -82 -82 -98 -88 -88 -98 -98 -98 -98 -96 -99 -82 -99 -97 -81 -53 -91 -92 -82 -81 -82 -67 -92 -81 -48 -90 -81 -92 -95 -98 -93 -96 -75 -98 -98 -82 -98 -92 -98 -92 -98 -95 -98 -81 -98 -82 -98 -98 -81 -90 -82 -90 -82 -84 -41 -82 -50 -82 -71 -81 -81 -98 -82 -82 -78 -82 -70 -84 -82 -63 -81 -80 -84 -98 -83 -98 -97 -98 -99 -98 -92 -98 -82 -98 -84 -82 -99 -87 -99 -98 -99 -97 -97 -89 -88 -92 -98 -94 -98 -98 -97 -98 -84 -85 -88 -85 -85 -85 -98 -98 -92 -77 -94 -90 -90 -97 -99 -98 -98 -99 -98 -98 -98 -99 -99 -95 -99 -82 -98 -81 -97 -98 -98 -99 -89 -98 -81 -99 -90 -98 -99 -99 -98 -98 -98 -98 -98 -91 -98 -98 -98 -93 -98 -99 -99 -98 -98 -99 -99 -99 -98 -98 -95 -91 -95 -96 -98 -96 -98 -99 -98 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -99 -98 -96 -91 -98 -91 -98 -99 -98 -98 -98 -99 -98 -94 -88 -96 -96 -90 -83 -98 -89 -98 -79 -77 -95 -92 -92 -98 -98 -93 -84 -82 -98 -90 -82 -84 -82 -82 -98 -81 -91 -88 -98 -98 -98 -82 -82 -56 -82 -81 -98 -98 -42 -95 -98 -98 -92 -92 -98 -98 -90 -90 -98 -90 -92 -97 -91 -98 -98 -93 -98 -96 -88 -94 -97 -98 -89 -91 -91 -98 -98 -90 -98 -95 -97 -97 -97 -85 -81 -93 -80 -72 -81 -96 -84 -98 -85 -92 -94 -91 -91 -94 -94 -94 -94 -94 -94 -94 -98 -98 -99 -98 -95 -98 -98 -97 -98 -98 -98 -98 -97 -96 -98 -99 -99 -98 -98 -98 -99 -99 -98 -98 -98 -90 -98 -98 -98 -94 -98 -99 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -76 -91 -91 -95 -87 -98 -98 -94 -89 -98 -80 -92 -82 -83 -98 -98 -74 -98 -98 -98 -88 -81 -82 -98 -96 -90 -81 -98 -82 -88 -58 -82 -82 -56 -97 -82 -81 -98 -81 -88 -81 -82 -83 -98 -77 -94 -56 -81 -93 -93 -98 -82 -72 -81 -83 -53 -98 -97 -83 -98 -88 -83 -98 -98 -81 -66 -94 -99 -81 -93 -66 -82 -92 -94 -98 -82 -81 -84 -98 -81 -81 -98 -83 -58 -92 -82 -82 -82 -82 -99 -82 -89 -82 -81 -88 -98 -98 -62 -81 -68 -82 -98 -81 -98 -68 -82 -82 -81 -53 -82 -64 -81 -41 -82 -73 -82 -99 -98 -68 -92 -98 -98 -95 -98 -98 -91 -98 -98 -99 -92 -98 -97 -98 -88 -85 -98 -85 -88 -88 -98 -98 -98 -99 -76 -96 -92 -93 -92 -95 -98 -91 -98 -98 -91 -91 -99 -98 -98 -98 -98 -91 -98 -96 -97 -98 -84 -97 -94 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -91 -92 -93 -98 -98 -98 -98 -99 -98 -98 -99 -98 -94 -98 -98 -95 -98 -99 -98 -99 -99 -99 -98 -92 -96 -98 -98 -98 -98 -98 -92 -98 -98 -98 -99 -99 -98 -96 -98 -94 -98 -98 -98 -92 -98 -68 -99 -98 -97 -98 -88 -96 -82 -74 -82 -92 -81 -86 -82 -77 -95 -98 -94 -92 -92 -81 -54 -91 -92 -82 -98 -72 -58 -99 -95 -95 -92 -98 -98 -98 -98 -82 -93 -82 -82 -98 -82 -79 -81 -92 -98 -98 -98 -98 -81 -63 -92 -81 -53 -98 -81 -91 -81 -81 -84 -81 -63 -81 -81 -67 -82 -41 -86 -82 -82 -98 -98 -41 -41 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -99 -90 -97 -96 -91 -96 -97 -98 -90 -95 -98 -91 -98 -96 -95 -98 -98 -92 -98 -97 -87 -89 -88 -98 -98 -98 -99 -98 -98 -76 -95 -98 -94 -98 -98 -95 -98 -92 -98 -94 -98 -98 -97 -98 -98 -98 -94 -98 -98 -99 -92 -98 -93 -82 -99 -94 -98 -98 -98 -98 -99 -98 -98 -98 -96 -95 -92 -98 -97 -91 -98 -97 -97 -97 -97 -97 -97 -97 -97 -81 -96 -96 -82 -86 -82 -82 -82 -98 -98 -98 -97 -98 -62 -92 -82 -84 -92 -92 -92 -92 -92 -92 -92 -81 -83 -82 -81 -64 -48 -98 -82 -81 -89 -81 -89 -99 -99 -94 -99 -92 -98 -81 -82 -81 -87 -92 -92 -92 -81 -40 -92 -81 -92 -95 -98 -81 -98 -81 -98 -82 -40 -81 -81 -81 -81 -90 -99 -84 -98 -92 -99 -92 -98 -98 -98 -98 -98 -98 -98 -98 -99 -41 -95 -93 -93 -93 -98 -98 -99 -98 -98 -98 -98 -98 -98 -95 -96 -92 -92 -98 -97 -98 -97 -98 -94 -97 -98 -98 -98 -97 -97 -90 -97 -98 -84 -85 -85 -98 -98 -98 -98 -98 -85 -93 -96 -98 -92 -95 -97 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -82 -98 -82 -82 -54 -98 -92 -89 -98 -98 -99 -97 -99 -98 -99 -94 -91 -98 -93 -95 -92 -92 -98 -97 -81 -92 -81 -63 -81 -91 -92 -93 -93 -99 -92 -91 -98 -96 -81 -78 -82 -82 -76 -92 -98 -98 -98 -98 -92 -98 -92 -91 -98 -89 -99 -98 -98 -92 -98 -95 -98 -81 -98 -81 -91 -81 -78 -81 -98 -98 -98 -97 -98 -88 -98 -82 -65 -82 -62 -98 -82 -82 -83 -94 -94 -92 -90 -90 -91 -91 -96 -99 -98 -98 -81 -82 -61 -81 -71 -98 -91 -81 -98 -92 -96 -91 -82 -94 -97 -97 -97 -97 -97 -98 -97 -98 -97 -94 -97 -98 -97 -82 -89 -98 -98 -97 -97 -90 -95 -92 -91 -92 -92 -90 -97 -92 -95 -98 -98 -41 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -92 -98 -96 -81 -65 -82 -84 -93 -89 -87 -89 -89 -98 -97 -88 -97 -98 -98 -95 -95 -91 -92 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -91 -88 -98 -92 -81 -95 -93 -82 -56 -76 -98 -82 -81 -82 -98 -98 -90 -98 -95 -98 -98 -98 -98 -93 -99 -95 -94 -98 -98 -98 -98 -97 -95 -95 -81 -82 -83 -98 -82 -99 -99 -82 -81 -85 -98 -99 -81 -82 -82 -56 -81 -98 -82 -99 -82 -48 -98 -95 -92 -98 -98 -98 -98 -97 -93 -98 -97 -97 -98 -82 -81 -99 -87 -99 -98 -84 -98 -98 -98 -98 -40 -77 -94 -98 -92 -90 -93 -98 -98 -92 -92 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -97 -98 -95 -93 -98 -82 -98 -98 -41 -99 -98 -98 -98 -98 -97 -98 -90 -91 -96 -91 -99 -98 -98 -98 -98 -98 -98 -98 -91 -92 -98 -98 -91 -98 -96 -99 -98 -99 -98 -94 -98 -53 -98 -98 -98 -99 -98 -40 -97 -94 -98 -98 -98 -91 -92 -91 -95 -95 -96 -98 -98 -92 -90 -93 -90 -97 -90 -97 -95 -95 -87 -96 -42 -91 -85 -82 -82 -88 -98 -94 -95 -98 -89 -82 -91 -82 -92 -82 -82 -45 -82 -96 -94 -97 -98 -92 -98 -98 -82 -76 -88 -82 -96 -98 -91 -91 -96 -99 -98 -96 -98 -98 -98 -98 -98 -82 -92 -82 -97 -98 -99 -99 -98 -98 -98 -98 -98 -94 -82 -70 -99 -98 -98 -98 -98 -90 -83 -88 -99 -99 -98 -98 -97 -98 -86 -87 -98 -98 -98 -98 -98 -98 -86 -87 -76 -87 -91 -93 -96 -98 -98 -50 -98 -98 -98 -95 -98 -98 -99 -98 -98 -99 -88 -86 -98 -87 -90 -81 -98 -83 -98 -98 -98 -98 -40 -98 -98 -97 -98 -98 -98 -98 -87 -97 -82 -87 -98 -98 -97 -98 -98 -99 -98 -98 -98 -94 -97 -98 -95 -97 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -97 -98 -81 -93 -99 -82 -82 -98 -82 -99 -98 -98 -84 -92 -89 -88 -95 -99 -98 -99 -98 -82 -94 -98 -82 -85 -89 -82 -93 -81 -93 -98 -98 -82 -78 -82 -99 -98 -98 -82 -99 -82 -54 -98 -92 -82 -82 -97 -98 -98 -98 -99 -98 -98 -98 -82 -58 -94 -82 -98 -81 -98 -98 -92 -98 -98 -98 -88 -94 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -97 -91 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -91 -91 -98 -91 -98 -82 -98 -95 -41 -99 -95 -90 -90 -95 -98 -99 -98 -98 -98 -84 -99 -97 -98 -98 -94 -93 -91 -92 -78 -81 -99 -90 -91 -90 -92 -92 -92 -92 -92 -98 -93 -98 -98 -92 -99 -98 -98 -98 -98 -40 -95 -98 -89 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -95 -99 -98 -93 -97 -89 -94 -94 -92 -93 -97 -98 -98 -98 -94 -99 -92 -92 -98 -96 -82 -61 -82 -98 -82 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -82 -98 -82 -82 -54 -98 -81 -81 -95 -98 -87 -99 -98 -97 -81 -81 -89 -81 -84 -88 -89 -98 -82 -63 -95 -97 -92 -92 -97 -98 -98 -98 -98 -98 -98 -98 -94 -81 -59 -92 -82 -85 -81 -95 -96 -96 -96 -95 -96 -83 -82 -82 -55 -96 -97 -92 -92 -92 -92 -92 -92 -91 -92 -92 -90 -91 -92 -91 -96 -96 -96 -95 -97 -92 -92 -92 -93 -82 -56 -86 -96 -96 -95 -67 -96 -96 -96 -96 -96 -98 -96 -95 -96 -99 -91 -92 -91 -91 -91 -91 -91 -91 -91 -91 -91 -91 -92 -92 -92 -92 -92 -97 -98 -83 -98 -98 -98 -98 -98 -98 -99 -98 -96 -98 -98 -92 -92 -99 -92 -98 -98 -98 -99 -98 -98 -98 -98 -99 -99 -97 -99 -98 -98 -98 -98 -95 -97 -97 -98 -98 -95 -90 -97 -98 -94 -96 -82 -63 -82 -61 -81 -82 -98 -97 -41 -40 -99 -98 -86 -81 -82 -89 -98 -98 -98 -98 -98 -98 -98 -91 -90 -98 -97 -96 -98 -82 -82 -56 -88 -98 -96 -92 -99 -98 -98 -98 -98 -77 -94 -81 -60 -94 -98 -82 -96 -96 -41 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -95 -98 -89 -93 -98 -98 -98 -93 -98 -98 -99 -98 -98 -93 -98 -92 -98 -99 -91 -98 -92 -98 -99 -98 -98 -97 -98 -95 -99 -98 -98 -98 -98 -98 -97 -98 -93 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -95 -94 -91 -95 -98 -98 -98 -99 -98 -98 -98 -98 -98 -91 -91 -96 -98 -99 -98 -98 -88 -88 -98 -97 -91 -94 -98 -98 -98 -98 -85 -98 -92 -90 -92 -92 -92 -87 -82 -82 -61 -94 -94 -99 -98 -98 -94 -98 -98 -93 -99 -94 -93 -95 -99 -82 -81 -98 -91 -90 -90 -82 -94 -82 -87 -92 -98 -82 -94 -98 -93 -98 -97 -81 -52 -83 -81 -67 -84 -81 -91 -82 -82 -47 -97 -98 -93 -98 -98 -98 -98 -98 -82 -97 -82 -99 -98 -98 -95 -98 -99 -98 -95 -90 -98 -96 -95 -72 -83 -69 -82 -82 -99 -82 -82 -98 -98 -97 -98 -87 -88 -88 -91 -88 -89 -89 -98 -98 -92 -94 -98 -92 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -82 -86 -93 -92 -92 -88 -86 -95 -95 -97 -91 -98 -98 -94 -99 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -88 -98 -98 -95 -91 -95 -95 -95 -95 -95 -52 -88 -91 -47 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -98 -98 -92 -92 -98 -98 -97 -98 -82 -57 -81 -99 -98 -94 -98 -98 -98 -87 -98 -98 -99 -98 -98 -98 -98 -82 -76 -71 -92 -92 -90 -84 -81 -80 -82 -98 -78 -98 -98 -98 -98 -98 -98 -99 -99 -82 -82 -82 -82 -98 -90 -91 -90 -98 -98 -98 -98 -98 -98 -94 -98 -91 -81 -94 -98 -98 -90 -92 -98 -98 -95 -95 -98 -98 -98 -98 -98 -82 -82 -72 -94 -98 -98 -98 -92 -98 -98 -98 -98 -97 -94 -98 -98 -98 -98 -98 -99 -97 -99 -99 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -98 -92 -98 -98 -84 -83 -84 -84 -85 -98 -94 -98 -98 -92 -94 -94 -98 -94 -92 -91 -98 -98 -98 -98 -92 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -82 -95 -98 -89 -98 -80 -91 -99 -81 -73 -98 -90 -98 -59 -40 -91 -98 -90 -94 -99 -98 -91 -90 -88 -98 -89 -84 -84 -98 -99 -82 -57 -81 -98 -99 -99 -99 -98 -98 -98 -98 -99 -83 -93 -84 -99 -99 -98 -81 -96 -81 -91 -98 -92 -98 -98 -98 -81 -98 -81 -96 -95 -98 -98 -93 -98 -99 -99 -98 -98 -97 -92 -98 -93 -92 -98 -98 -81 -96 -82 -90 -92 -99 -98 -99 -92 -98 -98 -89 -98 -98 -98 -93 -98 -92 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -97 -95 -99 -98 -98 -98 -98 -98 -97 -98 -96 -98 -92 -98 -98 -98 -95 -91 -98 -98 -92 -98 -98 -98 -98 -97 -98 -91 -98 -98 -98 -96 -98 -99 -96 -97 -88 -98 -98 -98 -98 -99 -98 -98 -98 -94 -95 -91 -92 -69 -98 -82 -98 -98 -98 -95 -91 -99 -95 -91 -99 -99 -94 -98 -98 -98 -98 -92 -82 -98 -98 -98 -98 -82 -99 -82 -99 -98 -98 -98 -90 -98 -98 -98 -98 -94 -98 -98 -81 -98 -95 -82 -62 -91 -92 -98 -82 -84 -82 -79 -98 -92 -98 -98 -99 -95 -95 -91 -98 -98 -98 -99 -93 -82 -82 -98 -82 -56 -81 -84 -88 -98 -92 -98 -98 -98 -90 -98 -98 -98 -98 -92 -98 -98 -87 -88 -98 -98 -98 -93 -98 -98 -81 -95 -84 -82 -92 -92 -98 -95 -93 -82 -71 -99 -98 -98 -98 -92 -98 -98 -98 -98 -98 -98 -98 -93 -82 -92 -98 -98 -97 -98 -99 -92 -99 -98 -98 -98 -98 -92 -98 -99 -93 -93 -96 -93 -98 -99 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -95 -98 -99 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -82 -56 -92 -82 -98 -91 -98 -98 -98 -99 -99 -82 -82 -84 -80 -98 -97 -83 -99 -92 -98 -98 -77 -94 -82 -52 -94 -82 -98 -98 -99 -98 -98 -99 -99 -52 -98 -98 -98 -59 -98 -82 -81 -98 -82 -94 -83 -82 -82 -93 -82 -98 -82 -81 -70 -99 -98 -99 -95 -98 -98 -98 -97 -98 -98 -81 -90 -82 -78 -82 -62 -82 -52 -82 -80 -81 -95 -98 -93 -98 -98 -98 -98 -82 -98 -82 -43 -95 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -99 -96 -97 -98 -81 -91 -82 -71 -81 -41 -98 -98 -98 -98 -89 -98 -99 -96 -98 -98 -98 -98 -99 -93 -93 -90 -90 -92 -98 -94 -92 -98 -99 -98 -98 -98 -98 -95 -98 -98 -98 -98 -98 -98 -95 -82 -94 -98 -95 -98 -99 -99 -91 -95 -91 -98 -93 -98 -95 -98 -98 -98 -98 -93 -99 -98 -99 -94 -91 -99 -98 -99 -96 -99 -98 -99 -98 -95 -94 -98 -98 -98 -98 -93 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -99 -99 -98 -98 -82 -69 -81 -96 -98 -80 -91 -98 -98 -88 -92 -81 -98 -88 -88 -89 -88 -94 -94 -92 -98 -81 -53 -98 -99 -92 -92 -81 -99 -81 -98 -98 -98 -98 -96 -91 -98 -98 -98 -98 -99 -98 -81 -82 -91 -81 -98 -81 -98 -98 -98 -98 -95 -98 -81 -98 -87 -82 -81 -88 -98 -99 -96 -98 -98 -98 -98 -95 -98 -91 -98 -95 -95 -92 -94 -91 -95 -95 -99 -95 -91 -98 -92 -92 -91 -98 -97 -99 -84 -98 -98 -99 -98 -98 -98 -99 -98 -79 -93 -93 -92 -92 -92 -92 -97 -98 -98 -98 -98 -99 -94 -96 -98 -98 -98 -98 -98 -96 -98 -95 -82 -98 -97 -98 -98 -98 -98 -91 -98 -97 -98 -98 -98 -92 -98 -98 -98 -92 -98 -98 -98 -98 -98 -95 -94 -93 -98 -98 -82 -82 -52 -90 -93 -98 -94 -99 -97 -88 -97 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -90 -98 -81 -96 -82 -82 -82 -90 -82 -92 -65 -94 -98 -96 -98 -95 -97 -88 -88 -81 -89 -81 -85 -89 -98 -82 -68 -83 -80 -91 -98 -82 -83 -81 -82 -81 -82 -94 -99 -98 -99 -98 -98 -98 -84 -82 -82 -99 -93 -98 -98 -98 -82 -82 -93 -40 -98 -94 -81 -91 -82 -68 -81 -98 -98 -98 -92 -98 -98 -98 -98 -97 -98 -98 -97 -99 -98 -98 -98 -99 -93 -99 -98 -99 -99 -98 -98 -98 -98 -98 -98 -94 -92 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -98 -97 -97 -91 -94 -98 -98 -98 -99 -97 -98 -98 -84 -98 -98 -98 -98 -98 -98 -98 -98 -82 -99 -92 -93 -92 -92 -93 -92 -93 -97 -97 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -89 -82 -63 -83 -77 -97 -98 -97 -98 -97 -98 -98 -90 -99 -98 -98 -94 -97 -99 -98 -90 -94 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -83 -82 -82 -56 -82 -62 -82 -98 -99 -54 -98 -84 -82 -82 -97 -82 -40 -82 -98 -97 -92 -82 -93 -82 -98 -98 -98 -98 -97 -97 -84 -85 -98 -99 -98 -98 -98 -99 -98 -78 -95 -98 -92 -90 -90 -82 -68 -82 -70 -83 -95 -95 -97 -95 -98 -98 -47 -98 -98 -99 -98 -81 -95 -85 -88 -94 -89 -96 -98 -91 -98 -95 -91 -99 -98 -93 -99 -94 -91 -88 -92 -84 -98 -98 -96 -98 -98 -98 -99 -98 -98 -98 -98 -97 -84 -99 -84 -97 -89 -98 -97 -97 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -83 -84 -89 -95 -95 -92 -90 -98 -99 -98 -98 -90 -98 -98 -99 -88 -99 -98 -96 -96 -98 -82 -98 -83 -86 -94 -91 -91 -91 -90 -94 -94 -98 -90 -98 -98 -93 -94 -95 -94 -95 -94 -90 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -82 -83 -83 -91 -98 -99 -92 -98 -83 -79 -94 -83 -88 -82 -98 -82 -70 -84 -82 -98 -82 -92 -92 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -90 -90 -98 -87 -93 -98 -78 -40 -83 -92 -92 -99 -84 -98 -98 -99 -98 -93 -98 -98 -98 -98 -98 -98 -98 -99 -99 -97 -97 -94 -82 -97 -84 -97 -97 -98 -96 -92 -97 -98 -99 -98 -94 -98 -99 -98 -98 -93 -99 -98 -98 -98 -98 -97 -98 -98 -98 -92 -98 -98 -96 -98 -98 -98 -95 -92 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -82 -98 -83 -74 -98 -98 -83 -98 -98 -83 -93 -91 -99 -99 -98 -98 -98 -99 -97 -98 -88 -99 -97 -98 -98 -98 -99 -92 -98 -78 -95 -94 -92 -91 -91 -92 -96 -82 -83 -99 -98 -95 -95 -94 -92 -98 -98 -98 -83 -95 -83 -94 -83 -94 -98 -98 -99 -98 -83 -98 -83 -83 -82 -98 -82 -70 -98 -98 -98 -92 -98 -98 -98 -99 -97 -98 -97 -98 -98 -98 -97 -98 -92 -92 -95 -98 -93 -82 -82 -82 -97 -40 -98 -99 -98 -98 -97 -82 -91 -98 -91 -99 -98 -98 -99 -98 -98 -99 -98 -98 -92 -95 -91 -99 -98 -98 -97 -98 -98 -88 -88 -89 -88 -88 -98 -98 -98 -98 -82 -94 -92 -92 -98 -98 -98 -99 -98 -98 -98 -95 -98 -98 -94 -98 -98 -99 -98 -98 -98 -98 -82 -98 -99 -93 -98 -98 -99 -98 -98 -98 -98 -98 -98 -94 -98 -98 -93 -99 -94 -98 -98 -98 -82 -97 -83 -72 -82 -96 -95 -91 -92 -98 -95 -98 -99 -93 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -94 -98 -94 -99 -98 -98 -99 -98 -82 -84 -86 -82 -83 -63 -98 -98 -98 -98 -89 -92 -98 -98 -98 -97 -98 -99 -99 -78 -94 -92 -93 -95 -94 -82 -62 -82 -98 -91 -95 -82 -87 -82 -82 -62 -98 -98 -99 -98 -98 -99 -93 -82 -98 -98 -95 -98 -98 -98 -98 -81 -82 -82 -82 -90 -98 -98 -95 -98 -98 -98 -96 -92 -92 -98 -98 -98 -98 -98 -98 -98 -98 -97 -96 -90 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -88 -98 -98 -94 -94 -98 -98 -98 -92 -98 -92 -92 -95 -98 -95 -92 -98 -84 -85 -83 -94 -90 -92 -89 -98 -98 -77 -94 -92 -92 -94 -91 -94 -97 -98 -98 -96 -98 -98 -98 -98 -94 -98 -98 -99 -98 -82 -82 -82 -82 -60 -100 -98 -98 -74 -98 -98 -98 -98 -98 -98 -98 -90 -99 -98 -98 -93 -98 -98 -98 -97 -91 -95 -98 -98 -92 -98 -98 -82 -76 -81 -91 -92 -95 -98 -98 -99 -93 -95 -98 -95 -95 -92 -92 -91 -95 -95 -92 -91 -98 -98 -90 -92 -96 -95 -82 -88 -82 -98 -82 -92 -82 -70 -81 -99 -98 -89 -94 -98 -97 -98 -99 -98 -98 -94 -94 -98 -94 -93 -92 -91 -92 -96 -82 -95 -82 -93 -98 -98 -98 -93 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -97 -97 -98 -94 -92 -92 -99 -98 -98 -98 -98 -97 -92 -98 -98 -98 -92 -98 -98 -98 -98 -96 -92 -98 -95 -92 -92 -92 -98 -95 -92 -98 -97 -98 -93 -94 -92 -98 -83 -98 -98 -87 -88 -93 -95 -98 -81 -79 -82 -96 -93 -91 -91 -92 -93 -99 -93 -93 -94 -94 -94 -99 -98 -93 -92 -90 -93 -98 -98 -97 -93 -82 -93 -81 -99 -81 -93 -93 -93 -96 -98 -94 -93 -92 -94 -98 -93 -91 -93 -93 -93 -93 -93 -93 -91 -91 -90 -90 -92 -94 -81 -90 -81 -55 -82 -94 -99 -82 -83 -81 -83 -68 -93 -91 -98 -97 -98 -98 -99 -97 -92 -98 -98 -92 -98 -98 -98 -94 -83 -95 -83 -96 -81 -49 -98 -83 -98 -89 -98 -99 -83 -97 -98 -98 -98 -98 -79 -98 -97 -93 -93 -93 -94 -95 -94 -93 -94 -93 -98 -98 -98 -98 -98 -98 -99 -98 -96 -98 -95 -96 -98 -98 -98 -98 -98 -98 -98 -99 -98 -92 -92 -93 -90 -98 -99 -94 -91 -97 -98 -92 -98 -98 -98 -98 -97 -98 -98 -98 -98 -94 -92 -95 -97 -94 -95 -91 -98 -95 -98 -98 -92 -87 -99 -98 -98 -98 -80 -99 -81 -50 -51 -84 -98 -98 -98 -98 -82 -92 -85 -98 -89 -94 -89 -93 -92 -93 -84 -85 -90 -90 -92 -92 -85 -86 -86 -87 -89 -88 -88 -82 -82 -76 -82 -93 -82 -82 -48 -91 -98 -98 -98 -98 -94 -98 -98 -98 -99 -84 -95 -98 -98 -97 -98 -87 -98 -99 -98 -82 -82 -82 -77 -98 -94 -82 -82 -90 -89 -82 -89 -82 -83 -79 -98 -98 -97 -98 -98 -98 -99 -95 -93 -98 -82 -99 -82 -84 -82 -99 -98 -95 -98 -98 -98 -97 -96 -98 -88 -91 -99 -98 -94 -98 -98 -92 -98 -98 -93 -98 -91 -98 -98 -92 -98 -98 -88 -95 -98 -93 -98 -98 -98 -98 -92 -79 -92 -98 -92 -98 -93 -92 -92 -92 -92 -95 -92 -92 -95 -95 -98 -98 -99 -98 -99 -98 -98 -98 -99 -98 -94 -41 -96 -98 -98 -98 -98 -94 -98 -98 -98 -99 -95 -98 -98 -99 -99 -98 -98 -98 -82 -98 -82 -84 -90 -98 -98 -98 -93 -97 -97 -98 -99 -99 -93 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -92 -92 -98 -98 -98 -99 -81 -98 -82 -68 -98 -93 -98 -93 -96 -84 -84 -85 -85 -85 -85 -88 -88 -93 -82 -82 -78 -81 -92 -93 -98 -82 -82 -98 -82 -74 -98 -98 -82 -52 -99 -98 -95 -98 -91 -82 -95 -82 -61 -82 -81 -98 -82 -99 -82 -42 -98 -98 -89 -82 -94 -88 -98 -90 -91 -80 -88 -98 -98 -97 -98 -82 -87 -98 -81 -62 -92 -83 -92 -99 -92 -92 -94 -98 -98 -99 -97 -97 -98 -89 -95 -96 -98 -98 -98 -99 -93 -92 -98 -83 -99 -94 -41 -92 -92 -94 -98 -64 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -83 -82 -99 -94 -82 -98 -92 -93 -95 -94 -97 -98 -98 -98 -92 -92 -94 -98 -98 -98 -98 -98 -96 -73 -93 -98 -92 -98 -99 -98 -98 -95 -94 -94 -97 -98 -82 -82 -98 -98 -83 -66 -98 -98 -99 -82 -94 -98 -98 -82 -98 -98 -98 -99 -98 -92 -92 -98 -97 -98 -98 -82 -84 -83 -95 -98 -92 -92 -98 -94 -87 -89 -90 -89 -82 -90 -83 -92 -90 -78 -94 -99 -92 -94 -97 -97 -94 -99 -98 -83 -83 -49 -82 -56 -94 -82 -87 -83 -94 -98 -99 -83 -96 -83 -82 -83 -82 -53 -98 -99 -98 -98 -99 -98 -98 -95 -98 -98 -98 -91 -98 -98 -94 -98 -98 -99 -99 -98 -91 -98 -92 -98 -90 -92 -98 -98 -98 -98 -99 -99 -98 -99 -98 -95 -98 -99 -98 -93 -98 -99 -98 -99 -98 -98 -98 -98 -91 -94 -92 -92 -91 -98 -99 -98 -92 -93 -92 -98 -92 -83 -98 -92 -98 -91 -89 -93 -98 -98 -86 -98 -94 -94 -94 -93 -94 -94 -95 -95 -95 -94 -82 -82 -41 -82 -82 -98 -95 -92 -98 -98 -82 -98 -99 -98 -98 -98 -98 -98 -98 -82 -90 -82 -97 -92 -92 -94 -92 -99 -92 -98 -98 -98 -99 -98 -99 -97 -97 -95 -95 -98 -98 -98 -83 -59 -82 -98 -83 -82 -98 -99 -98 -95 -92 -98 -98 -99 -98 -95 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -98 -92 -98 -99 -82 -95 -82 -82 -54 -80 -80 -85 -80 -84 -84 -84 -84 -85 -85 -84 -86 -92 -95 -94 -98 -98 -98 -98 -98 -82 -82 -50 -82 -93 -82 -87 -81 -98 -96 -98 -90 -88 -82 -92 -92 -89 -98 -98 -98 -98 -98 -98 -98 -96 -92 -92 -96 -98 -98 -98 -98 -99 -98 -97 -98 -98 -99 -98 -94 -92 -86 -98 -98 -94 -98 -94 -92 -92 -95 -97 -98 -98 -98 -98 -98 -98 -95 -92 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -92 -98 -98 -95 -95 -91 -97 -82 -58 -89 -81 -99 -96 -83 -76 -92 -95 -98 -78 -97 -98 -92 -92 -92 -90 -92 -82 -82 -45 -98 -98 -98 -98 -95 -96 -92 -94 -94 -98 -96 -97 -90 -91 -89 -98 -98 -98 -84 -99 -98 -98 -98 -98 -97 -91 -97 -96 -98 -91 -99 -92 -92 -98 -97 -97 -97 -92 -92 -93 -98 -98 -98 -97 -98 -98 -98 -98 -97 -92 -98 -98 -83 -82 -98 -98 -91 -90 -94 -98 -98 -93 -98 -83 -97 -98 -83 -83 -83 -96 -93 -98 -91 -83 -98 -83 -58 -83 -83 -87 -90 -91 -83 -90 -58 -83 -83 -98 -88 -96 -96 -99 -98 -98 -98 -98 -99 -98 -98 -96 -91 -90 -93 -94 -92 -92 -93 -97 -92 -99 -92 -99 -92 -99 -98 -98 -98 -99 -97 -98 -99 -97 -98 -90 -83 -82 -60 -96 -92 -92 -98 -98 -99 -98 -98 -98 -89 -97 -93 -89 -97 -97 -97 -83 -92 -83 -98 -98 -98 -97 -97 -97 -98 -84 -98 -97 -90 -90 -98 -97 -98 -99 -77 -98 -97 -92 -91 -92 -92 -92 -92 -92 -91 -92 -92 -99 -82 -99 -98 -84 -92 -82 -99 -98 -95 -83 -98 -97 -97 -94 -97 -97 -97 -97 -98 -98 -97 -98 -91 -98 -98 -98 -92 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -83 -94 -82 -83 -98 -98 -98 -98 -83 -83 -99 -82 -99 -99 -98 -99 -98 -98 -98 -98 -98 -98 -93 -89 -99 -83 -90 -90 -82 -85 -92 -83 -82 -43 -98 -98 -98 -98 -93 -98 -99 -96 -97 -92 -83 -98 -83 -83 -93 -90 -89 -78 -89 -90 -98 -97 -97 -91 -90 -98 -89 -97 -97 -83 -98 -98 -98 -98 -99 -98 -95 -94 -82 -99 -95 -83 -91 -83 -92 -97 -98 -98 -92 -93 -82 -61 -81 -92 -87 -99 -82 -98 -92 -97 -92 -92 -92 -96 -98 -82 -98 -89 -81 -82 -97 -74 -88 -83 -83 -88 -87 -84 -98 -98 -99 -92 -92 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -92 -98 -95 -96 -93 -91 -92 -82 -48 -88 -92 -99 -98 -95 -92 -98 -99 -98 -99 -98 -92 -93 -92 -92 -92 -99 -93 -99 -99 -98 -92 -92 -92 -98 -98 -94 -98 -98 -98 -98 -92 -82 -98 -83 -82 -89 -82 -97 -98 -97 -95 -98 -82 -94 -82 -98 -99 -98 -95 -98 -98 -99 -95 -99 -98 -98 -99 -98 -98 -92 -92 -98 -96 -82 -97 -83 -99 -99 -98 -98 -96 -98 -94 -94 -94 -94 -94 -93 -94 -97 -97 -91 -97 -91 -94 -95 -95 -98 -92 -98 -97 -98 -98 -96 -92 -97 -98 -83 -84 -84 -84 -84 -85 -97 -85 -99 -79 -98 -98 -94 -97 -98 -91 -97 -91 -99 -98 -83 -83 -53 -83 -82 -98 -98 -98 -96 -92 -98 -92 -93 -98 -82 -96 -83 -83 -67 -83 -99 -98 -98 -98 -82 -92 -98 -98 -98 -94 -98 -98 -98 -98 -98 -97 -98 -99 -96 -98 -98 -96 -98 -96 -98 -98 -97 -98 -98 -96 -98 -98 -98 -98 -91 -94 -98 -98 -98 -91 -98 -94 -98 -91 -97 -98 -93 -98 -92 -98 -90 -99 -98 -96 -98 -98 -92 -95 -98 -98 -84 -91 -91 -94 -92 -98 -82 -95 -79 -95 -95 -95 -95 -92 -92 -92 -94 -93 -91 -94 -94 -92 -96 -94 -93 -87 -92 -92 -92 -85 -93 -92 -92 -91 -92 -91 -91 -93 -93 -82 -91 -92 -91 -92 -92 -91 -92 -91 -88 -93 -92 -90 -82 -93 -79 -81 -94 -93 -82 -62 -82 -98 -84 -83 -82 -92 -99 -82 -83 -98 -82 -97 -95 -95 -88 -84 -85 -85 -85 -85 -84 -85 -85 -85 -85 -84 -85 -85 -85 -85 -85 -85 -85 -85 -85 -76 -85 -85 -93 -85 -85 -85 -84 -85 -85 -84 -84 -81 -85 -85 -85 -85 -85 -85 -84 -85 -85 -88 -84 -85 -85 -86 -84 -85 -85 -90 -60 -98 -86 -84 -99 -98 -98 -98 -99 -98 -97 -98 -92 -98 -83 -84 -83 -99 -87 -98 -83 -96 -98 -82 -98 -89 -83 -98 -87 -88 -83 -84 -83 -83 -83 -83 -99 -82 -98 -83 -98 -99 -83 -91 -83 -84 -67 -98 -94 -98 -98 -98 -84 -98 -98 -78 -94 -94 -91 -91 -92 -92 -93 -93 -93 -92 -93 -92 -99 -98 -98 -93 -93 -98 -98 -98 -98 -84 -98 -98 -98 -98 -92 -98 -94 -93 -95 -98 -98 -98 -98 -93 -93 -93 -98 -82 -83 -98 -99 -98 -95 -93 -93 -83 -53 -83 -99 -98 -98 -94 -93 -97 -83 -82 -52 -82 -86 -98 -97 -98 -97 -93 -98 -98 -93 -98 -98 -98 -96 -93 -93 -98 -93 -99 -97 -98 -91 -98 -98 -93 -93 -93 -98 -98 -98 -82 -85 -87 -84 -84 -85 -84 -84 -92 -88 -87 -86 -92 -81 -93 -94 -98 -99 -98 -94 -98 -98 -98 -98 -98 -98 -96 -99 -98 -98 -93 -88 -89 -98 -84 -95 -93 -93 -83 -84 -98 -99 -99 -98 -95 -90 -89 -98 -98 -90 -98 -98 -99 -98 -98 -98 -99 -98 -91 -99 -91 -91 -86 -95 -83 -98 -86 -84 -84 -87 -84 -98 -94 -94 -99 -98 -83 -93 -83 -83 -57 -93 -87 -99 -83 -81 -98 -99 -99 -98 -93 -98 -94 -94 -98 -99 -98 -98 -84 -87 -93 -93 -98 -98 -98 -98 -98 -87 -94 -99 -91 -92 -91 -91 -91 -91 -93 -92 -93 -93 -93 -98 -98 -83 -78 -83 -48 -98 -96 -97 -91 -88 -98 -83 -78 -83 -57 -98 -98 -94 -83 -98 -83 -91 -98 -99 -98 -98 -97 -99 -93 -98 -97 -98 -98 -98 -98 -98 -96 -98 -98 -98 -96 -98 -98 -93 -99 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -97 -98 -99 -98 -93 -98 -98 -98 -98 -98 -99 -99 -86 -87 -87 -85 -87 -88 -88 -98 -98 -79 -93 -99 -90 -98 -99 -98 -98 -89 -89 -98 -98 -98 -95 -98 -98 -98 -98 -99 -98 -98 -98 -98 -94 -98 -91 -83 -86 -87 -83 -95 -88 -88 -98 -84 -83 -82 -83 -83 -98 -92 -97 -84 -82 -98 -83 -68 -98 -95 -83 -82 -98 -84 -83 -82 -98 -82 -98 -83 -83 -84 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -99 -98 -98 -98 -96 -98 -99 -98 -97 -91 -99 -98 -58 -99 -83 -54 -98 -98 -98 -98 -83 -99 -98 -98 -84 -59 -89 -84 -84 -95 -84 -98 -98 -95 -82 -89 -84 -83 -92 -58 -84 -83 -99 -91 -98 -98 -84 -97 -84 -93 -98 -99 -98 -98 -98 -98 -98 -95 -99 -94 -91 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -94 -98 -94 -99 -98 -94 -93 -94 -94 -93 -95 -98 -98 -97 -87 -94 -87 -88 -87 -89 -88 -92 -96 -96 -90 -99 -93 -97 -98 -99 -99 -98 -99 -84 -83 -70 -94 -98 -98 -98 -98 -98 -83 -93 -93 -93 -98 -93 -97 -99 -84 -84 -98 -98 -98 -82 -44 -83 -98 -96 -99 -98 -94 -92 -94 -98 -98 -98 -97 -99 -93 -87 -92 -98 -98 -98 -98 -96 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -92 -92 -92 -82 -88 -83 -97 -83 -98 -82 -91 -81 -85 -82 -98 -98 -82 -89 -81 -98 -97 -96 -84 -98 -98 -93 -92 -95 -98 -98 -98 -78 -94 -93 -94 -93 -91 -90 -92 -98 -98 -98 -98 -99 -94 -92 -93 -98 -98 -98 -99 -98 -98 -99 -94 -94 -97 -98 -86 -94 -98 -98 -98 -98 -99 -99 -98 -97 -98 -98 -98 -90 -98 -98 -98 -97 -94 -91 -92 -97 -97 -97 -96 -98 -98 -92 -94 -92 -99 -99 -92 -92 -97 -95 -94 -92 -92 -98 -98 -99 -94 -94 -94 -98 -98 -98 -98 -99 -95 -94 -99 -98 -83 -82 -94 -82 -83 -82 -81 -41 -98 -84 -84 -85 -99 -95 -93 -94 -99 -98 -78 -93 -92 -93 -82 -84 -83 -94 -94 -98 -98 -98 -98 -98 -93 -93 -98 -98 -99 -98 -92 -92 -94 -85 -96 -98 -98 -99 -98 -98 -98 -98 -98 -98 -93 -93 -96 -98 -98 -98 -91 -98 -99 -98 -98 -92 -93 -98 -83 -98 -83 -93 -93 -75 -42 -82 -98 -99 -82 -83 -82 -82 -88 -82 -71 -98 -99 -98 -92 -98 -98 -98 -99 -98 -99 -98 -93 -92 -91 -92 -95 -94 -94 -94 -98 -90 -98 -90 -95 -85 -89 -89 -98 -98 -99 -92 -90 -96 -93 -83 -98 -92 -91 -94 -95 -93 -98 -95 -94 -98 -99 -99 -97 -98 -98 -98 -98 -92 -93 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -96 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -82 -61 -82 -91 -98 -98 -81 -95 -95 -82 -95 -82 -95 -82 -97 -99 -82 -75 -82 -99 -98 -93 -80 -82 -62 -82 -94 -82 -82 -98 -95 -99 -98 -98 -95 -97 -88 -89 -89 -98 -98 -98 -98 -98 -98 -78 -94 -98 -93 -98 -98 -98 -98 -99 -98 -94 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -82 -99 -98 -97 -63 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -99 -96 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -93 -98 -98 -98 -98 -82 -98 -99 -92 -88 -99 -98 -98 -96 -98 -98 -99 -98 -78 -94 -92 -92 -94 -95 -94 -99 -98 -91 -91 -95 -95 -98 -98 -96 -99 -99 -98 -98 -98 -95 -93 -94 -82 -99 -92 -99 -98 -98 -98 -98 -93 -92 -93 -98 -91 -98 -98 -82 -90 -81 -99 -81 -91 -98 -98 -98 -98 -81 -82 -73 -98 -95 -95 -95 -92 -92 -96 -98 -93 -92 -76 -90 -41 -98 -98 -99 -98 -98 -99 -98 -97 -98 -99 -98 -98 -95 -92 -92 -98 -92 -97 -98 -93 -94 -94 -97 -98 -84 -96 -98 -99 -84 -98 -92 -92 -99 -77 -82 -67 -94 -91 -91 -94 -94 -94 -98 -98 -81 -82 -83 -98 -92 -98 -98 -99 -98 -81 -95 -96 -98 -82 -98 -97 -95 -98 -89 -82 -71 -96 -90 -61 -93 -92 -92 -62 -97 -99 -99 -99 -99 -98 -97 -98 -98 -98 -97 -98 -99 -98 -99 -96 -98 -98 -98 -98 -92 -88 -90 -89 -92 -98 -98 -98 -98 -93 -98 -96 -94 -94 -93 -93 -90 -90 -90 -98 -91 -98 -93 -98 -98 -98 -99 -97 -93 -94 -98 -88 -95 -95 -99 -98 -95 -93 -92 -98 -78 -94 -98 -93 -93 -94 -94 -94 -98 -95 -98 -95 -98 -98 -93 -93 -93 -87 -61 -95 -98 -98 -95 -93 -98 -99 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -92 -99 -99 -91 -98 -98 -98 -98 -98 -98 -99 -93 -93 -93 -98 -94 -99 -97 -92 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -81 -98 -98 -93 -85 -94 -95 -94 -51 -91 -91 -98 -93 -98 -99 -98 -98 -98 -95 -96 -95 -87 -88 -88 -88 -89 -69 -98 -98 -92 -94 -95 -93 -94 -98 -98 -97 -98 -95 -98 -98 -98 -94 -98 -97 -96 -41 -61 -41 -98 -98 -96 -82 -98 -99 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -93 -98 -92 -91 -98 -87 -98 -99 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -89 -82 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -94 -98 -98 -98 -95 -97 -97 -93 -94 -92 -91 -93 -99 -98 -98 -94 -96 -98 -86 -92 -99 -98 -91 -98 -93 -95 -98 -83 -93 -87 -78 -89 -93 -94 -98 -95 -98 -98 -98 -99 -98 -101 -98 -98 -94 -99 -98 -98 -93 -98 -93 -82 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -87 -88 -86 -93 -99 -58 -98 -98 -97 -82 -96 -83 -68 -82 -95 -82 -82 -82 -97 -82 -98 -81 -80 -88 -83 -98 -88 -99 -99 -98 -83 -90 -84 -98 -82 -46 -82 -77 -94 -82 -66 -90 -96 -98 -81 -84 -97 -89 -98 -84 -98 -82 -69 -81 -82 -99 -98 -98 -81 -49 -81 -98 -81 -98 -82 -55 -82 -98 -46 -98 -98 -98 -98 -95 -98 -98 -98 -98 -90 -98 -98 -98 -99 -97 -98 -99 -83 -94 -93 -93 -99 -98 -94 -98 -98 -98 -40 -98 -98 -98 -98 -98 -98 -98 -98 -93 -93 -93 -98 -96 -81 -98 -98 -99 -98 -98 -99 -98 -98 -93 -94 -94 -92 -92 -98 -98 -93 -88 -88 -98 -98 -94 -94 -91 -94 -98 -93 -78 -82 -91 -93 -95 -92 -92 -91 -94 -97 -97 -98 -99 -98 -98 -93 -98 -98 -99 -98 -97 -98 -92 -98 -98 -97 -81 -82 -78 -99 -81 -81 -51 -93 -93 -92 -98 -98 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -96 -93 -98 -98 -93 -93 -81 -98 -80 -84 -99 -99 -98 -98 -98 -98 -98 -98 -81 -81 -91 -81 -98 -83 -62 -94 -95 -95 -98 -98 -90 -98 -98 -98 -98 -87 -83 -88 -80 -80 -83 -83 -83 -46 -77 -83 -60 -93 -93 -93 -94 -98 -94 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -92 -83 -99 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -94 -98 -98 -98 -98 -94 -92 -94 -98 -98 -98 -98 -99 -98 -92 -94 -99 -99 -97 -90 -92 -98 -99 -98 -94 -98 -98 -95 -40 -79 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -94 -98 -93 -98 -98 -93 -98 -98 -98 -98 -99 -99 -93 -98 -99 -84 -98 -98 -98 -98 -98 -98 -94 -76 -94 -85 -81 -89 -93 -93 -80 -85 -80 -69 -91 -98 -99 -99 -98 -99 -98 -98 -98 -98 -98 -89 -98 -91 -93 -90 -90 -98 -98 -99 -98 -98 -80 -81 -66 -92 -98 -98 -96 -90 -93 -91 -90 -97 -80 -42 -80 -99 -98 -98 -98 -98 -99 -94 -99 -98 -98 -98 -98 -87 -98 -98 -98 -99 -98 -99 -98 -83 -80 -94 -80 -98 -81 -98 -98 -99 -81 -76 -81 -72 -80 -73 -98 -99 -98 -98 -98 -98 -91 -87 -88 -88 -88 -88 -98 -98 -98 -99 -95 -97 -92 -92 -97 -99 -98 -98 -98 -98 -92 -92 -98 -94 -92 -98 -98 -98 -98 -98 -98 -98 -94 -82 -94 -99 -98 -99 -98 -98 -95 -98 -94 -98 -98 -90 -96 -98 -98 -98 -91 -98 -91 -91 -92 -91 -99 -90 -98 -91 -96 -96 -98 -98 -94 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -81 -93 -99 -82 -82 -41 -79 -81 -52 -81 -76 -99 -98 -98 -97 -98 -84 -82 -41 -41 -96 -98 -98 -98 -98 -95 -97 -98 -92 -92 -93 -90 -81 -81 -71 -98 -91 -98 -98 -98 -44 -98 -93 -92 -98 -82 -97 -96 -94 -94 -83 -82 -89 -91 -91 -94 -91 -92 -90 -98 -82 -98 -91 -83 -58 -83 -98 -99 -95 -89 -94 -98 -98 -93 -93 -93 -98 -98 -97 -98 -99 -98 -92 -98 -84 -98 -94 -94 -98 -98 -98 -84 -84 -98 -98 -97 -97 -93 -93 -83 -78 -93 -96 -93 -97 -98 -99 -98 -98 -95 -98 -98 -97 -92 -97 -97 -93 -98 -98 -98 -98 -98 -82 -98 -99 -98 -98 -98 -99 -98 -97 -97 -94 -98 -98 -92 -98 -98 -98 -99 -90 -98 -98 -99 -98 -97 -99 -98 -97 -97 -82 -95 -82 -97 -68 -93 -82 -99 -98 -81 -80 -65 -93 -89 -81 -80 -96 -89 -92 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -81 -42 -81 -80 -90 -83 -98 -41 -98 -85 -85 -98 -98 -99 -98 -98 -93 -98 -78 -97 -94 -82 -41 -92 -41 -94 -82 -98 -41 -40 -82 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -82 -94 -81 -93 -81 -52 -99 -97 -98 -94 -98 -81 -58 -92 -81 -81 -83 -88 -91 -99 -98 -94 -99 -93 -98 -98 -98 -98 -98 -98 -99 -98 -95 -98 -98 -98 -98 -98 -98 -99 -98 -93 -99 -92 -83 -96 -99 -98 -98 -98 -99 -99 -98 -98 -96 -96 -99 -99 -92 -98 -99 -98 -98 -98 -98 -97 -87 -98 -87 -95 -99 -97 -98 -98 -98 -78 -90 -98 -93 -93 -100 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -94 -84 -93 -92 -98 -99 -98 -98 -98 -98 -98 -96 -99 -91 -98 -98 -84 -98 -84 -98 -86 -84 -84 -98 -98 -82 -96 -82 -98 -98 -81 -87 -82 -84 -80 -97 -89 -83 -94 -97 -98 -70 -84 -94 -94 -98 -83 -82 -83 -98 -97 -84 -84 -84 -61 -88 -99 -40 -90 -85 -98 -94 -81 -82 -82 -94 -92 -87 -94 -98 -98 -98 -84 -86 -88 -99 -78 -91 -96 -94 -94 -92 -98 -98 -97 -97 -99 -97 -98 -99 -99 -98 -97 -93 -93 -83 -90 -82 -93 -93 -82 -93 -82 -99 -98 -98 -98 -97 -97 -98 -98 -98 -92 -96 -97 -98 -90 -98 -93 -98 -98 -94 -91 -94 -98 -98 -98 -96 -93 -93 -94 -99 -99 -98 -99 -97 -99 -98 -97 -97 -97 -97 -97 -97 -97 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -98 -99 -98 -98 -98 -91 -88 -95 -93 -98 -98 -98 -98 -99 -99 -78 -98 -92 -91 -93 -94 -93 -93 -98 -93 -91 -98 -98 -99 -98 -98 -94 -82 -98 -84 -83 -75 -98 -83 -98 -84 -52 -98 -83 -87 -98 -98 -83 -98 -99 -95 -98 -98 -98 -98 -89 -93 -93 -98 -98 -98 -98 -98 -98 -96 -98 -99 -94 -99 -97 -97 -93 -95 -98 -91 -98 -98 -98 -99 -98 -84 -98 -82 -98 -94 -83 -55 -83 -99 -77 -82 -83 -93 -92 -93 -83 -92 -92 -93 -92 -98 -93 -92 -98 -93 -92 -93 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -98 -98 -97 -98 -98 -97 -98 -98 -92 -93 -98 -93 -92 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -98 -98 -92 -92 -97 -98 -98 -98 -97 -98 -92 -99 -91 -98 -97 -97 -96 -97 -91 -91 -98 -98 -98 -94 -97 -93 -97 -92 -98 -92 -97 -90 -92 -96 -98 -89 -87 -89 -89 -83 -83 -99 -83 -96 -77 -82 -90 -90 -97 -82 -82 -46 -82 -79 -98 -97 -95 -95 -98 -98 -98 -98 -98 -98 -98 -98 -97 -83 -98 -98 -94 -87 -92 -97 -92 -98 -82 -94 -82 -93 -83 -94 -97 -93 -92 -98 -83 -83 -80 -98 -98 -98 -98 -92 -98 -98 -98 -92 -93 -97 -98 -90 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -84 -82 -83 -69 -98 -82 -93 -82 -96 -92 -82 -53 -98 -97 -90 -98 -95 -91 -92 -97 -98 -83 -85 -98 -99 -98 -98 -98 -94 -98 -82 -98 -98 -92 -92 -93 -93 -97 -97 -98 -95 -92 -93 -98 -99 -98 -98 -98 -98 -98 -99 -98 -93 -93 -96 -98 -99 -98 -98 -98 -98 -98 -98 -96 -93 -93 -95 -98 -98 -99 -98 -91 -98 -98 -93 -98 -98 -98 -98 -98 -94 -98 -99 -98 -98 -92 -98 -99 -98 -98 -99 -98 -99 -98 -98 -98 -98 -82 -98 -82 -89 -98 -98 -98 -98 -98 -98 -98 -98 -93 -99 -95 -98 -98 -98 -81 -98 -84 -83 -82 -81 -52 -99 -82 -82 -82 -84 -81 -85 -92 -85 -62 -82 -47 -70 -98 -83 -99 -83 -93 -99 -82 -96 -98 -82 -98 -99 -98 -99 -98 -98 -98 -93 -93 -85 -99 -84 -98 -93 -92 -94 -98 -98 -98 -98 -91 -98 -98 -98 -98 -98 -90 -91 -95 -81 -82 -95 -93 -83 -98 -98 -92 -98 -94 -99 -98 -98 -58 -83 -71 -83 -83 -77 -99 -98 -98 -98 -93 -98 -93 -93 -98 -98 -98 -98 -98 -98 -98 -95 -99 -92 -98 -99 -94 -92 -98 -97 -99 -98 -84 -98 -96 -98 -98 -98 -99 -98 -98 -78 -98 -94 -93 -93 -93 -92 -90 -93 -93 -98 -99 -99 -98 -98 -92 -98 -94 -93 -95 -92 -92 -82 -98 -98 -98 -98 -99 -98 -98 -97 -98 -97 -98 -97 -93 -98 -97 -98 -97 -82 -93 -82 -98 -98 -98 -98 -93 -93 -92 -98 -97 -98 -93 -92 -93 -98 -98 -98 -98 -99 -98 -97 -98 -98 -99 -98 -99 -99 -99 -98 -98 -98 -98 -97 -92 -83 -55 -83 -82 -64 -82 -87 -98 -81 -95 -98 -98 -98 -82 -66 -81 -88 -82 -82 -97 -98 -82 -60 -80 -98 -98 -95 -90 -82 -99 -82 -68 -82 -67 -82 -93 -82 -64 -82 -74 -98 -98 -98 -97 -98 -93 -93 -98 -93 -91 -91 -93 -95 -98 -98 -91 -93 -82 -98 -99 -98 -99 -99 -93 -98 -98 -99 -99 -98 -99 -98 -99 -98 -98 -98 -93 -98 -98 -98 -93 -98 -98 -98 -98 -98 -99 -99 -98 -84 -98 -99 -98 -97 -98 -98 -98 -98 -88 -94 -93 -91 -91 -95 -98 -92 -98 -97 -90 -98 -93 -92 -92 -94 -82 -82 -98 -82 -55 -93 -93 -82 -94 -80 -82 -98 -98 -97 -98 -97 -96 -98 -98 -98 -91 -97 -98 -98 -98 -92 -98 -98 -99 -98 -98 -98 -95 -94 -93 -99 -82 -82 -93 -99 -81 -98 -91 -92 -92 -98 -98 -98 -98 -85 -82 -82 -52 -84 -82 -99 -82 -89 -81 -98 -88 -82 -82 -52 -98 -90 -98 -98 -98 -96 -98 -98 -98 -99 -89 -88 -89 -88 -98 -98 -98 -99 -98 -80 -98 -92 -93 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -95 -95 -98 -99 -99 -98 -98 -82 -94 -84 -65 -98 -94 -98 -98 -84 -82 -99 -82 -98 -82 -82 -99 -92 -83 -98 -81 -71 -98 -99 -98 -97 -98 -99 -98 -98 -97 -98 -91 -99 -93 -98 -94 -91 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -84 -88 -88 -93 -98 -98 -92 -98 -98 -99 -99 -98 -83 -98 -88 -88 -98 -99 -87 -95 -84 -99 -89 -46 -40 -78 -41 -48 -93 -40 -93 -93 -93 -40 -93 -40 -40 -88 -97 -89 -87 -91 -98 -84 -97 -93 -92 -98 -94 -98 -98 -98 -83 -98 -82 -88 -98 -98 -89 -92 -88 -89 -98 -82 -90 -83 -98 -99 -82 -94 -82 -93 -96 -83 -96 -81 -65 -80 -88 -98 -82 -94 -82 -96 -98 -41 -97 -98 -98 -98 -98 -93 -98 -98 -99 -91 -98 -98 -98 -95 -92 -98 -98 -98 -97 -96 -98 -98 -98 -96 -98 -97 -98 -84 -83 -93 -85 -81 -84 -84 -81 -98 -78 -88 -82 -93 -79 -99 -82 -62 -82 -94 -82 -99 -97 -96 -90 -98 -98 -98 -99 -83 -83 -93 -98 -92 -98 -90 -95 -98 -98 -98 -96 -98 -98 -97 -90 -98 -94 -98 -98 -98 -97 -99 -98 -99 -92 -93 -98 -98 -98 -94 -93 -98 -98 -98 -93 -96 -98 -98 -98 -98 -99 -98 -93 -91 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -97 -82 -93 -92 -96 -92 -98 -92 -97 -97 -98 -98 -93 -93 -93 -97 -88 -98 -93 -98 -98 -98 -98 -93 -98 -78 -94 -82 -92 -93 -93 -93 -92 -93 -95 -93 -93 -83 -82 -97 -91 -82 -98 -82 -89 -82 -98 -83 -98 -98 -98 -97 -98 -82 -78 -82 -98 -82 -99 -82 -93 -91 -98 -99 -95 -83 -82 -99 -93 -82 -82 -98 -98 -98 -83 -83 -99 -82 -82 -82 -98 -82 -93 -82 -92 -82 -40 -93 -97 -97 -88 -81 -89 -99 -81 -82 -93 -90 -82 -78 -94 -94 -93 -92 -94 -95 -95 -96 -98 -87 -98 -98 -93 -51 -82 -82 -78 -98 -99 -99 -98 -97 -86 -94 -82 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -90 -98 -98 -98 -92 -98 -98 -98 -98 -96 -93 -90 -98 -99 -98 -98 -99 -98 -93 -92 -98 -97 -98 -98 -98 -98 -93 -92 -97 -99 -98 -93 -92 -94 -93 -93 -93 -92 -93 -98 -98 -98 -99 -98 -98 -90 -98 -98 -98 -98 -98 -97 -82 -83 -81 -91 -98 -82 -83 -82 -99 -98 -98 -82 -90 -98 -93 -92 -93 -82 -51 -82 -87 -82 -99 -99 -82 -70 -98 -83 -98 -98 -82 -82 -71 -82 -48 -83 -63 -82 -98 -98 -81 -92 -82 -84 -82 -82 -58 -82 -54 -99 -99 -90 -97 -97 -99 -98 -97 -98 -96 -98 -98 -98 -82 -82 -98 -94 -98 -82 -93 -97 -93 -98 -82 -92 -82 -91 -98 -92 -98 -94 -98 -94 -94 -94 -92 -92 -92 -91 -98 -99 -98 -99 -90 -99 -98 -98 -98 -98 -82 -56 -81 -89 -89 -91 -97 -98 -99 -98 -99 -95 -97 -98 -91 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -98 -98 -98 -99 -98 -98 -94 -82 -95 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -95 -98 -98 -98 -98 -90 -98 -98 -94 -89 -99 -98 -98 -98 -98 -98 -98 -98 -98 -94 -99 -99 -92 -98 -99 -98 -98 -98 -82 -98 -81 -98 -82 -83 -87 -41 -98 -82 -82 -98 -98 -95 -98 -98 -98 -93 -99 -93 -83 -56 -82 -98 -96 -98 -87 -98 -98 -98 -99 -97 -98 -98 -98 -78 -95 -92 -92 -91 -88 -98 -98 -98 -99 -89 -89 -91 -93 -93 -98 -98 -94 -94 -92 -92 -98 -93 -93 -98 -89 -83 -81 -98 -96 -98 -82 -82 -66 -98 -82 -82 -82 -98 -82 -96 -95 -95 -98 -99 -97 -92 -92 -92 -98 -98 -98 -93 -99 -94 -99 -98 -99 -99 -99 -93 -93 -92 -83 -83 -80 -87 -86 -84 -98 -93 -98 -82 -77 -99 -98 -93 -92 -92 -98 -98 -91 -98 -98 -98 -94 -98 -96 -98 -98 -84 -84 -84 -98 -98 -98 -98 -98 -98 -89 -94 -92 -91 -96 -98 -91 -91 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -99 -98 -99 -98 -82 -91 -89 -93 -98 -99 -99 -98 -98 -98 -98 -98 -98 -91 -98 -98 -98 -98 -91 -98 -98 -98 -82 -82 -78 -98 -82 -82 -82 -98 -98 -99 -97 -98 -97 -88 -82 -58 -82 -97 -82 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -96 -89 -84 -97 -89 -99 -91 -98 -99 -98 -95 -98 -98 -91 -82 -82 -94 -94 -94 -94 -91 -91 -92 -93 -98 -98 -98 -94 -98 -98 -97 -96 -97 -98 -98 -91 -82 -91 -82 -48 -99 -92 -98 -97 -95 -92 -98 -98 -92 -95 -91 -98 -91 -92 -91 -98 -98 -98 -91 -97 -90 -92 -89 -95 -92 -98 -99 -99 -98 -98 -98 -98 -98 -99 -99 -89 -90 -89 -93 -92 -99 -91 -99 -98 -98 -98 -98 -98 -96 -84 -84 -98 -98 -92 -98 -93 -82 -84 -79 -88 -94 -93 -94 -94 -92 -92 -92 -98 -98 -99 -98 -98 -98 -98 -87 -81 -96 -80 -85 -98 -82 -98 -82 -82 -96 -98 -82 -98 -82 -67 -82 -98 -82 -57 -84 -82 -86 -81 -89 -82 -40 -40 -66 -82 -41 -40 -45 -40 -40 -98 -40 -40 -93 -96 -84 -95 -85 -98 -98 -98 -98 -98 -98 -94 -94 -91 -91 -98 -98 -98 -93 -98 -98 -99 -99 -98 -82 -82 -99 -96 -92 -92 -91 -82 -82 -63 -98 -94 -84 -91 -99 -98 -92 -98 -98 -99 -98 -80 -96 -92 -90 -93 -90 -93 -99 -98 -99 -94 -98 -82 -82 -68 -92 -92 -97 -95 -95 -97 -92 -97 -92 -98 -98 -98 -98 -98 -98 -97 -98 -98 -90 -92 -98 -98 -96 -98 -98 -91 -98 -92 -98 -99 -98 -93 -93 -91 -91 -97 -98 -94 -99 -91 -94 -98 -92 -98 -98 -99 -98 -98 -94 -98 -91 -98 -98 -98 -98 -98 -97 -98 -98 -93 -98 -98 -98 -91 -98 -98 -92 -98 -98 -98 -88 -97 -97 -96 -88 -92 -91 -88 -86 -89 -90 -90 -89 -89 -89 -83 -91 -97 -82 -83 -82 -85 -82 -89 -94 -94 -99 -93 -93 -93 -94 -98 -93 -93 -94 -94 -92 -98 -99 -91 -98 -98 -82 -82 -82 -84 -98 -82 -82 -88 -82 -98 -82 -63 -82 -67 -82 -64 -82 -99 -82 -74 -82 -99 -82 -82 -94 -94 -94 -82 -94 -81 -94 -91 -81 -98 -82 -93 -82 -67 -98 -99 -98 -98 -98 -94 -94 -94 -91 -91 -91 -98 -93 -94 -91 -92 -98 -84 -82 -82 -68 -91 -99 -88 -98 -98 -99 -97 -99 -99 -98 -97 -80 -90 -92 -92 -90 -92 -92 -91 -91 -93 -92 -93 -93 -93 -93 -94 -93 -93 -93 -93 -93 -93 -92 -92 -82 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -91 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -99 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -99 -98 -99 -82 -70 -82 -41 -94 -90 -91 -99 -93 -94 -91 -96 -97 -84 -85 -85 -85 -85 -85 -86 -85 -84 -88 -84 -56 -91 -93 -99 -98 -94 -85 -85 -98 -92 -98 -98 -94 -94 -81 -98 -82 -71 -91 -82 -94 -92 -86 -98 -91 -99 -98 -98 -81 -98 -98 -82 -98 -98 -82 -69 -82 -57 -98 -98 -97 -99 -98 -91 -91 -98 -98 -98 -98 -93 -98 -98 -98 -98 -99 -98 -98 -93 -98 -98 -98 -97 -97 -86 -98 -98 -98 -98 -98 -98 -98 -98 -79 -94 -99 -93 -93 -94 -93 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -93 -92 -98 -98 -82 -93 -98 -99 -99 -98 -99 -98 -98 -92 -92 -97 -96 -91 -98 -98 -98 -98 -92 -92 -91 -99 -97 -98 -98 -98 -98 -98 -94 -82 -95 -81 -84 -98 -85 -98 -98 -98 -40 -40 -92 -41 -40 -40 -40 -86 -40 -40 -99 -98 -98 -93 -92 -94 -98 -95 -84 -98 -98 -87 -98 -93 -93 -88 -89 -97 -92 -81 -88 -81 -81 -98 -89 -92 -89 -98 -79 -82 -56 -93 -97 -86 -82 -82 -64 -82 -82 -82 -82 -98 -88 -82 -90 -82 -82 -91 -94 -98 -90 -93 -98 -99 -84 -98 -98 -98 -98 -82 -98 -82 -94 -82 -53 -98 -82 -98 -90 -92 -98 -98 -98 -97 -98 -98 -97 -98 -98 -99 -98 -90 -98 -95 -97 -98 -98 -98 -93 -98 -98 -98 -98 -98 -99 -98 -98 -98 -94 -99 -98 -98 -94 -98 -98 -98 -90 -98 -98 -92 -98 -99 -99 -98 -99 -96 -89 -94 -89 -99 -98 -98 -98 -93 -98 -98 -90 -96 -99 -92 -92 -92 -92 -92 -92 -92 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -94 -94 -97 -98 -98 -98 -83 -72 -93 -82 -98 -98 -98 -92 -99 -95 -98 -82 -81 -89 -82 -81 -87 -91 -98 -98 -99 -99 -99 -99 -92 -82 -98 -82 -95 -98 -82 -82 -85 -82 -40 -40 -90 -82 -40 -40 -73 -82 -92 -93 -98 -82 -65 -82 -82 -81 -96 -82 -82 -50 -81 -66 -83 -79 -82 -92 -86 -82 -77 -91 -81 -90 -88 -99 -98 -82 -82 -47 -82 -91 -82 -78 -41 -82 -95 -40 -98 -82 -40 -91 -82 -82 -82 -82 -98 -78 -94 -90 -98 -82 -94 -82 -99 -82 -99 -99 -82 -77 -99 -98 -91 -94 -91 -91 -98 -98 -98 -99 -95 -91 -98 -99 -96 -99 -87 -94 -98 -98 -98 -98 -95 -96 -98 -98 -98 -98 -92 -98 -98 -98 -98 -99 -98 -98 -94 -91 -98 -98 -92 -98 -99 -98 -98 -96 -97 -98 -92 -98 -93 -98 -90 -98 -99 -98 -91 -96 -92 -88 -92 -99 -91 -93 -91 -92 -94 -91 -94 -81 -78 -92 -89 -88 -83 -81 -92 -90 -86 -91 -98 -98 -91 -92 -90 -99 -90 -90 -92 -92 -82 -92 -91 -89 -91 -98 -88 -93 -91 -90 -88 -89 -98 -82 -89 -81 -81 -89 -86 -94 -82 -89 -87 -82 -81 -66 -82 -72 -82 -82 -63 -91 -90 -87 -88 -92 -56 -92 -92 -97 -92 -99 -92 -91 -92 -98 -40 -40 -73 -92 -92 -98 -82 -53 -82 -91 -85 -82 -59 -83 -82 -98 -82 -99 -90 -97 -98 -97 -91 -82 -90 -91 -81 -98 -97 -89 -98 -92 -86 -79 -98 -82 -82 -52 -82 -91 -82 -98 -81 -89 -82 -98 -98 -92 -98 -99 -92 -93 -98 -99 -91 -98 -99 -97 -98 -98 -98 -96 -98 -88 -88 -85 -98 -98 -93 -92 -91 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -89 -82 -89 -82 -82 -83 -84 -84 -90 -84 -91 -98 -96 -84 -98 -98 -98 -98 -98 -84 -99 -88 -91 -93 -92 -90 -91 -94 -90 -90 -82 -92 -93 -96 -93 -98 -98 -91 -96 -93 -98 -97 -98 -99 -98 -90 -89 -95 -97 -94 -98 -98 -98 -93 -98 -90 -97 -98 -90 -90 -96 -99 -92 -98 -98 -91 -90 -90 -96 -91 -93 -82 -83 -91 -98 -91 -94 -82 -81 -81 -83 -89 -95 -82 -91 -82 -91 -93 -91 -91 -91 -91 -98 -98 -90 -91 -99 -91 -98 -91 -92 -92 -91 -93 -91 -98 -97 -90 -98 -99 -97 -96 -88 -88 -88 -87 -88 -88 -89 -92 -93 -90 -78 -92 -91 -82 -98 -82 -98 -82 -98 -82 -82 -82 -82 -50 -98 -98 -98 -99 -98 -98 -98 -82 -98 -99 -98 -99 -98 -98 -87 -98 -98 -98 -99 -92 -98 -91 -97 -92 -92 -92 -92 -98 -98 -98 -98 -98 -98 -84 -97 -92 -92 -92 -82 -95 -85 -80 -88 -80 -85 -96 -82 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -92 -95 -97 -93 -98 -97 -95 -98 -41 -46 -41 -83 -98 -40 -83 -40 -58 -41 -98 -40 -79 -99 -91 -93 -94 -99 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -93 -94 -98 -95 -98 -83 -98 -98 -98 -98 -94 -97 -98 -96 -96 -83 -83 -85 -98 -83 -92 -83 -82 -91 -98 -98 -93 -98 -98 -98 -98 -92 -93 -98 -99 -93 -98 -97 -98 -92 -92 -92 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -92 -98 -99 -92 -98 -98 -98 -98 -98 -88 -82 -99 -82 -76 -82 -93 -82 -98 -83 -58 -84 -95 -96 -85 -98 -83 -70 -98 -82 -83 -65 -84 -82 -94 -94 -94 -98 -98 -98 -97 -91 -95 -92 -98 -98 -98 -98 -92 -92 -98 -98 -98 -90 -94 -98 -98 -98 -93 -98 -98 -98 -95 -98 -82 -80 -86 -92 -97 -98 -82 -55 -98 -99 -98 -94 -95 -99 -96 -93 -95 -93 -93 -98 -97 -99 -98 -91 -85 -85 -86 -91 -93 -88 -90 -88 -84 -84 -98 -67 -61 -98 -99 -98 -98 -98 -98 -98 -67 -40 -40 -41 -47 -40 -98 -98 -99 -98 -97 -98 -89 -98 -98 -99 -98 -99 -98 -98 -98 -79 -94 -97 -89 -92 -92 -92 -92 -92 -82 -83 -83 -83 -72 -98 -98 -98 -98 -98 -98 -98 -99 -98 -41 -95 -40 -40 -87 -98 -98 -93 -82 -85 -83 -99 -82 -83 -98 -98 -99 -98 -98 -98 -98 -98 -98 -93 -83 -82 -98 -98 -92 -98 -98 -98 -99 -98 -91 -99 -98 -98 -98 -98 -98 -97 -86 -88 -89 -89 -89 -89 -87 -97 -97 -95 -40 -94 -92 -92 -92 -98 -83 -98 -82 -98 -98 -99 -99 -98 -98 -98 -98 -92 -98 -98 -98 -98 -90 -91 -99 -98 -93 -98 -90 -98 -98 -98 -98 -98 -88 -86 -98 -98 -98 -98 -90 -99 -98 -98 -92 -84 -84 -98 -97 -92 -83 -84 -98 -40 -85 -82 -81 -84 -82 -82 -85 -41 -41 -91 -98 -83 -98 -67 -82 -82 -63 -53 -91 -99 -98 -98 -40 -98 -41 -99 -94 -82 -84 -82 -98 -82 -95 -82 -96 -89 -88 -98 -94 -93 -99 -98 -98 -98 -85 -94 -95 -92 -92 -91 -92 -97 -82 -41 -98 -98 -98 -98 -98 -98 -98 -98 -92 -92 -92 -98 -92 -85 -98 -98 -82 -57 -82 -82 -65 -84 -83 -98 -83 -98 -91 -99 -83 -98 -82 -84 -82 -82 -54 -84 -83 -99 -82 -99 -83 -83 -55 -98 -98 -94 -98 -99 -80 -82 -90 -98 -96 -98 -79 -99 -98 -98 -96 -93 -91 -96 -96 -93 -98 -99 -99 -98 -98 -98 -83 -82 -66 -96 -61 -92 -80 -96 -96 -93 -87 -71 -84 -85 -84 -98 -88 -98 -98 -78 -84 -85 -91 -98 -98 -98 -97 -98 -98 -94 -84 -93 -90 -84 -98 -94 -98 -98 -90 -97 -97 -98 -83 -92 -98 -98 -98 -98 -93 -93 -98 -98 -97 -93 -82 -91 -40 -93 -40 -89 -98 -98 -98 -98 -98 -98 -94 -98 -98 -92 -98 -64 -88 -90 -40 -87 -40 -43 -41 -82 -59 -40 -82 -75 -98 -82 -98 -98 -98 -98 -98 -94 -98 -92 -98 -98 -98 -98 -98 -98 -91 -98 -97 -98 -92 -92 -97 -97 -91 -88 -96 -97 -93 -98 -99 -98 -98 -93 -87 -95 -92 -91 -94 -98 -98 -98 -95 -98 -98 -98 -98 -98 -98 -82 -82 -62 -83 -98 -82 -82 -70 -83 -91 -82 -98 -82 -98 -97 -94 -99 -98 -98 -92 -92 -98 -95 -98 -98 -89 -98 -94 -96 -99 -98 -98 -98 -99 -91 -98 -66 -82 -95 -93 -80 -87 -80 -82 -94 -96 -59 -83 -67 -98 -98 -98 -97 -87 -98 -84 -84 -85 -98 -96 -98 -98 -98 -98 -98 -94 -90 -98 -99 -98 -98 -94 -89 -89 -84 -89 -94 -92 -93 -93 -89 -88 -89 -89 -88 -88 -86 -88 -89 -78 -99 -92 -96 -85 -83 -83 -81 -82 -87 -98 -82 -98 -58 -98 -92 -98 -94 -85 -82 -98 -92 -98 -93 -40 -99 -40 -98 -51 -79 -83 -82 -82 -82 -97 -98 -82 -56 -82 -99 -82 -93 -99 -98 -40 -81 -51 -40 -84 -95 -99 -95 -41 -98 -98 -98 -84 -98 -98 -84 -98 -84 -85 -89 -88 -89 -98 -98 -97 -82 -82 -70 -92 -92 -93 -93 -93 -92 -93 -94 -96 -97 -98 -98 -98 -98 -91 -98 -99 -98 -98 -98 -82 -74 -69 -82 -98 -92 -92 -88 -83 -95 -82 -98 -82 -96 -98 -82 -99 -82 -78 -82 -48 -41 -97 -83 -83 -84 -77 -49 -98 -98 -98 -93 -98 -97 -98 -98 -98 -99 -99 -98 -97 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -91 -98 -98 -98 -98 -99 -93 -98 -98 -84 -100 -84 -85 -88 -98 -84 -98 -88 -89 -89 -89 -98 -98 -79 -96 -98 -95 -91 -99 -49 -90 -91 -85 -97 -83 -41 -41 -40 -98 -92 -41 -82 -99 -98 -96 -40 -95 -82 -40 -91 -91 -93 -98 -98 -98 -94 -93 -98 -91 -82 -62 -96 -82 -43 -92 -98 -97 -97 -98 -40 -40 -97 -97 -98 -40 -40 -40 -40 -86 -98 -98 -99 -98 -98 -98 -98 -94 -98 -98 -98 -97 -96 -84 -98 -99 -83 -82 -87 -93 -82 -97 -98 -82 -82 -96 -92 -99 -98 -99 -99 -98 -96 -98 -84 -94 -92 -93 -83 -82 -83 -83 -89 -80 -94 -94 -93 -92 -92 -92 -92 -98 -82 -70 -82 -56 -93 -81 -82 -99 -82 -98 -98 -98 -98 -98 -91 -98 -97 -98 -92 -93 -98 -98 -98 -97 -98 -82 -92 -82 -98 -82 -41 -82 -41 -82 -98 -82 -84 -81 -98 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -95 -98 -98 -99 -98 -82 -92 -91 -98 -98 -99 -92 -97 -97 -88 -89 -88 -88 -93 -98 -98 -82 -82 -73 -93 -91 -91 -98 -99 -99 -98 -94 -98 -90 -99 -98 -98 -98 -98 -98 -98 -98 -98 -94 -99 -82 -88 -98 -98 -98 -98 -40 -39 -64 -40 -40 -98 -98 -92 -98 -98 -40 -40 -89 -40 -40 -99 -99 -98 -82 -98 -82 -41 -98 -98 -98 -98 -93 -94 -91 -98 -98 -97 -92 -98 -98 -98 -98 -98 -98 -98 -98 -82 -98 -81 -65 -92 -98 -98 -95 -94 -93 -93 -93 -93 -81 -91 -82 -98 -98 -96 -98 -80 -81 -98 -82 -53 -98 -98 -98 -98 -99 -97 -98 -92 -91 -92 -93 -98 -98 -98 -98 -98 -98 -82 -98 -82 -83 -92 -99 -94 -82 -82 -86 -91 -98 -82 -82 -100 -87 -41 -99 -98 -98 -98 -98 -98 -95 -99 -98 -98 -98 -93 -99 -98 -94 -98 -98 -98 -98 -98 -98 -98 -92 -92 -98 -94 -99 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -94 -98 -82 -94 -93 -81 -98 -97 -98 -61 -40 -40 -40 -40 -40 -40 -93 -98 -98 -81 -40 -40 -87 -95 -90 -89 -88 -40 -40 -40 -40 -91 -40 -40 -40 -40 -68 -41 -98 -98 -98 -98 -95 -99 -98 -98 -98 -99 -97 -91 -82 -66 -94 -82 -64 -98 -98 -98 -98 -98 -98 -93 -97 -98 -82 -83 -82 -98 -98 -50 -82 -82 -58 -82 -91 -82 -57 -98 -98 -98 -98 -98 -98 -98 -98 -93 -91 -98 -91 -95 -40 -98 -40 -98 -92 -82 -98 -80 -71 -98 -98 -83 -99 -98 -98 -98 -95 -94 -91 -93 -91 -94 -94 -94 -99 -98 -98 -99 -89 -97 -92 -98 -98 -98 -99 -98 -98 -98 -91 -82 -98 -98 -98 -99 -98 -98 -98 -98 -98 -91 -99 -96 -92 -97 -98 -98 -93 -94 -82 -98 -98 -82 -65 -40 -91 -92 -98 -98 -75 -99 -94 -98 -98 -90 -94 -98 -98 -98 -98 -98 -40 -99 -98 -98 -98 -98 -98 -94 -67 -93 -92 -93 -99 -98 -99 -98 -92 -94 -98 -81 -82 -81 -82 -81 -98 -81 -81 -88 -82 -88 -82 -94 -98 -81 -82 -80 -82 -92 -92 -81 -42 -94 -82 -82 -84 -94 -82 -71 -82 -82 -74 -95 -82 -61 -51 -82 -74 -94 -97 -96 -82 -48 -98 -82 -99 -82 -40 -98 -82 -46 -40 -40 -90 -82 -82 -91 -40 -65 -82 -99 -82 -77 -40 -67 -98 -41 -98 -98 -98 -95 -98 -98 -99 -98 -98 -99 -82 -70 -90 -82 -98 -82 -82 -82 -98 -98 -98 -98 -94 -98 -98 -98 -99 -98 -98 -97 -87 -96 -89 -98 -91 -98 -98 -98 -99 -84 -98 -99 -98 -98 -98 -99 -98 -79 -92 -98 -89 -89 -96 -93 -98 -99 -98 -98 -98 -98 -99 -95 -98 -95 -98 -98 -98 -96 -98 -82 -94 -94 -98 -98 -93 -98 -97 -97 -82 -82 -98 -98 -91 -97 -97 -89 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -94 -98 -98 -59 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -42 -98 -94 -92 -92 -99 -97 -97 -91 -91 -89 -98 -84 -91 -89 -98 -98 -94 -87 -93 -98 -98 -84 -98 -94 -98 -99 -98 -82 -82 -82 -82 -78 -91 -82 -92 -98 -82 -55 -98 -82 -93 -93 -91 -90 -83 -68 -84 -99 -99 -99 -98 -92 -86 -81 -84 -82 -82 -98 -84 -83 -40 -40 -98 -87 -82 -87 -82 -98 -97 -98 -82 -40 -62 -83 -40 -99 -40 -40 -97 -40 -98 -82 -82 -60 -94 -82 -95 -83 -82 -99 -82 -66 -83 -82 -82 -92 -81 -82 -99 -83 -98 -98 -99 -99 -98 -99 -98 -98 -98 -98 -98 -90 -98 -93 -98 -98 -95 -98 -92 -85 -87 -98 -93 -63 -92 -96 -97 -90 -90 -97 -98 -92 -92 -92 -92 -92 -92 -95 -98 -99 -96 -96 -92 -98 -92 -98 -97 -98 -94 -99 -61 -94 -82 -40 -98 -98 -98 -98 -98 -98 -98 -94 -93 -96 -98 -92 -97 -98 -92 -90 -91 -90 -98 -75 -98 -98 -98 -98 -99 -83 -70 -98 -98 -98 -98 -94 -93 -92 -98 -99 -98 -98 -99 -98 -98 -84 -86 -86 -84 -84 -85 -84 -84 -77 -84 -96 -90 -94 -81 -84 -88 -94 -98 -98 -94 -92 -98 -98 -98 -98 -98 -98 -86 -92 -82 -82 -49 -93 -82 -92 -98 -84 -98 -98 -98 -98 -98 -98 -98 -91 -98 -99 -82 -82 -92 -41 -40 -86 -82 -82 -56 -82 -98 -82 -99 -82 -84 -82 -94 -40 -98 -41 -89 -40 -83 -82 -52 -91 -82 -83 -72 -82 -78 -82 -75 -98 -82 -85 -82 -98 -82 -99 -56 -41 -82 -98 -93 -82 -86 -99 -88 -98 -98 -84 -77 -99 -99 -98 -98 -99 -99 -98 -78 -94 -91 -90 -91 -92 -91 -91 -90 -91 -91 -92 -90 -91 -91 -91 -91 -92 -91 -91 -91 -91 -92 -82 -93 -92 -92 -84 -98 -40 -97 -40 -92 -92 -94 -90 -94 -98 -98 -98 -97 -98 -98 -98 -98 -94 -98 -92 -82 -87 -80 -82 -66 -99 -93 -97 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -94 -90 -99 -98 -97 -99 -98 -84 -88 -98 -90 -98 -98 -98 -98 -99 -98 -98 -87 -88 -89 -89 -89 -89 -82 -85 -82 -89 -91 -89 -86 -85 -88 -88 -88 -89 -88 -67 -82 -82 -77 -60 -88 -58 -98 -98 -98 -98 -98 -94 -99 -91 -98 -98 -92 -98 -98 -98 -99 -98 -98 -99 -98 -92 -99 -98 -98 -98 -93 -98 -98 -72 -83 -98 -84 -98 -92 -83 -83 -83 -82 -41 -93 -98 -98 -83 -83 -70 -83 -82 -55 -82 -87 -52 -83 -91 -82 -40 -86 -82 -83 -98 -82 -98 -40 -40 -98 -83 -93 -82 -90 -99 -82 -82 -87 -82 -98 -88 -41 -90 -95 -98 -92 -82 -82 -58 -78 -93 -94 -92 -90 -90 -90 -92 -92 -94 -90 -99 -98 -97 -94 -98 -98 -93 -98 -98 -98 -83 -84 -90 -98 -98 -83 -97 -40 -99 -82 -93 -93 -94 -98 -92 -90 -91 -93 -93 -92 -93 -98 -92 -99 -98 -98 -98 -94 -92 -93 -92 -92 -94 -94 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -93 -96 -91 -95 -98 -93 -98 -98 -99 -82 -98 -82 -98 -99 -88 -89 -89 -99 -98 -98 -99 -98 -98 -78 -93 -92 -92 -93 -90 -97 -90 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -88 -98 -99 -92 -92 -91 -93 -90 -78 -82 -98 -82 -53 -82 -73 -98 -93 -99 -83 -96 -92 -90 -82 -82 -98 -98 -97 -99 -99 -98 -91 -93 -82 -98 -98 -93 -98 -98 -98 -97 -92 -91 -98 -91 -98 -98 -98 -98 -98 -99 -98 -94 -98 -93 -98 -98 -98 -98 -98 -96 -92 -92 -83 -83 -88 -82 -82 -54 -82 -95 -80 -40 -82 -98 -40 -70 -82 -72 -94 -97 -98 -88 -82 -57 -82 -44 -45 -98 -96 -92 -98 -98 -97 -97 -92 -98 -94 -97 -96 -98 -97 -99 -92 -92 -98 -92 -92 -92 -98 -97 -96 -98 -82 -98 -82 -84 -99 -82 -94 -90 -90 -98 -98 -98 -98 -98 -94 -92 -96 -92 -92 -99 -99 -94 -99 -91 -91 -95 -90 -93 -91 -94 -98 -97 -98 -87 -88 -99 -79 -98 -98 -98 -98 -98 -77 -88 -94 -92 -97 -98 -98 -94 -92 -92 -98 -99 -98 -82 -98 -99 -99 -98 -98 -95 -94 -98 -82 -98 -91 -98 -98 -98 -99 -98 -98 -98 -98 -94 -98 -98 -98 -92 -94 -98 -96 -95 -97 -94 -99 -94 -97 -98 -98 -98 -98 -98 -99 -98 -96 -98 -99 -98 -98 -98 -98 -83 -87 -82 -68 -82 -98 -82 -99 -82 -40 -98 -82 -40 -97 -99 -98 -83 -81 -98 -98 -98 -93 -97 -98 -94 -98 -98 -96 -98 -89 -98 -41 -98 -89 -98 -90 -85 -89 -94 -92 -84 -92 -92 -92 -92 -93 -92 -92 -89 -92 -92 -92 -92 -87 -92 -76 -41 -41 -40 -96 -82 -98 -99 -40 -86 -82 -41 -64 -82 -88 -81 -93 -98 -81 -79 -80 -97 -82 -90 -99 -92 -93 -93 -92 -82 -91 -98 -82 -83 -82 -98 -81 -89 -80 -82 -88 -92 -84 -82 -82 -89 -98 -93 -40 -98 -98 -98 -98 -98 -98 -98 -99 -93 -94 -89 -98 -98 -98 -84 -92 -98 -82 -98 -82 -54 -97 -96 -89 -90 -90 -92 -90 -91 -85 -86 -86 -85 -85 -85 -84 -88 -82 -85 -85 -85 -85 -78 -98 -98 -98 -97 -96 -98 -98 -97 -98 -98 -98 -98 -95 -98 -82 -98 -98 -82 -99 -95 -98 -98 -98 -86 -99 -96 -94 -98 -82 -82 -57 -99 -79 -98 -98 -98 -82 -57 -82 -86 -98 -98 -91 -94 -94 -98 -99 -98 -98 -99 -98 -99 -82 -98 -98 -98 -40 -40 -58 -40 -98 -40 -98 -98 -95 -99 -98 -98 -97 -94 -82 -50 -82 -74 -82 -59 -98 -97 -98 -84 -98 -98 -54 -98 -96 -56 -53 -40 -78 -41 -46 -92 -92 -91 -93 -87 -82 -98 -81 -82 -57 -82 -75 -82 -82 -82 -98 -83 -98 -94 -82 -92 -82 -82 -98 -98 -98 -51 -98 -82 -82 -98 -98 -98 -91 -98 -92 -92 -60 -98 -98 -98 -90 -98 -98 -98 -98 -98 -98 -92 -92 -98 -90 -90 -93 -94 -82 -87 -82 -89 -82 -82 -67 -82 -96 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -98 -93 -92 -98 -93 -99 -99 -97 -96 -96 -93 -97 -98 -89 -89 -89 -89 -88 -93 -98 -98 -93 -89 -94 -91 -92 -98 -98 -97 -95 -98 -98 -99 -93 -98 -98 -98 -98 -82 -82 -98 -82 -99 -82 -91 -98 -82 -94 -93 -98 -82 -98 -82 -98 -83 -83 -41 -41 -82 -99 -53 -92 -98 -98 -92 -99 -94 -92 -90 -90 -91 -90 -94 -94 -98 -98 -98 -80 -90 -82 -88 -82 -98 -98 -92 -91 -82 -84 -83 -93 -94 -82 -82 -98 -82 -82 -79 -94 -94 -93 -93 -89 -96 -88 -82 -82 -94 -82 -59 -82 -91 -82 -82 -82 -78 -81 -82 -96 -82 -91 -82 -98 -97 -51 -98 -97 -97 -98 -98 -98 -94 -93 -92 -92 -86 -82 -92 -98 -95 -82 -82 -82 -98 -98 -81 -69 -98 -98 -98 -82 -94 -98 -99 -98 -99 -97 -98 -98 -99 -99 -88 -98 -98 -98 -98 -98 -99 -99 -99 -98 -99 -99 -98 -99 -99 -99 -98 -90 -98 -98 -98 -98 -92 -97 -90 -82 -87 -81 -89 -89 -84 -93 -89 -98 -99 -94 -79 -82 -47 -98 -82 -56 -82 -82 -82 -98 -82 -92 -85 -99 -98 -98 -98 -98 -98 -98 -98 -92 -98 -98 -98 -92 -98 -75 -92 -92 -98 -69 -99 -40 -65 -40 -98 -98 -91 -88 -98 -89 -98 -96 -92 -98 -98 -93 -99 -95 -98 -92 -99 -94 -98 -98 -98 -99 -93 -98 -92 -98 -98 -98 -98 -98 -98 -93 -94 -94 -91 -92 -92 -82 -82 -82 -81 -65 -82 -87 -82 -94 -98 -81 -82 -84 -97 -89 -80 -85 -98 -83 -82 -69 -82 -52 -82 -93 -82 -54 -93 -92 -98 -94 -98 -81 -52 -98 -91 -98 -98 -98 -98 -98 -89 -89 -80 -96 -98 -98 -95 -83 -93 -82 -71 -82 -98 -82 -94 -99 -98 -98 -98 -91 -97 -97 -96 -98 -91 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -92 -98 -98 -93 -98 -98 -98 -99 -98 -99 -98 -98 -90 -84 -99 -99 -92 -98 -98 -98 -98 -82 -85 -83 -87 -81 -97 -98 -82 -92 -82 -95 -93 -94 -95 -100 -95 -92 -84 -85 -86 -98 -99 -99 -98 -98 -98 -78 -94 -98 -92 -98 -99 -98 -98 -98 -98 -99 -98 -98 -93 -97 -82 -98 -98 -98 -96 -95 -40 -95 -89 -82 -40 -54 -41 -65 -40 -99 -98 -40 -98 -98 -98 -92 -98 -98 -99 -98 -99 -98 -98 -98 -97 -99 -98 -98 -98 -98 -82 -89 -82 -94 -98 -98 -40 -80 -98 -94 -94 -90 -91 -94 -97 -99 -82 -78 -82 -98 -81 -92 -82 -43 -82 -98 -97 -82 -54 -92 -91 -99 -98 -90 -98 -98 -98 -98 -98 -89 -94 -94 -94 -93 -91 -81 -82 -92 -77 -94 -82 -63 -93 -98 -82 -78 -89 -88 -87 -98 -98 -97 -90 -96 -98 -94 -99 -99 -99 -99 -82 -98 -93 -98 -99 -98 -97 -41 -40 -40 -62 -98 -98 -92 -98 -92 -95 -93 -88 -92 -40 -40 -67 -41 -57 -82 -89 -82 -43 -99 -82 -99 -82 -98 -99 -92 -94 -98 -98 -99 -99 -98 -98 -98 -98 -98 -88 -98 -98 -99 -98 -97 -98 -98 -99 -98 -89 -40 -40 -98 -98 -97 -98 -96 -96 -98 -91 -91 -98 -98 -99 -98 -98 -97 -86 -94 -82 -82 -98 -83 -88 -99 -98 -83 -98 -98 -98 -99 -84 -82 -82 -68 -82 -86 -83 -98 -82 -98 -98 -81 -80 -98 -84 -82 -98 -82 -94 -94 -82 -89 -81 -98 -98 -98 -98 -98 -94 -98 -99 -98 -99 -90 -99 -97 -98 -98 -93 -95 -95 -95 -98 -98 -98 -90 -82 -98 -82 -67 -82 -82 -82 -82 -66 -62 -98 -98 -93 -70 -98 -93 -98 -78 -94 -92 -92 -92 -92 -93 -99 -98 -99 -92 -92 -98 -95 -94 -95 -95 -54 -97 -98 -83 -93 -93 -93 -92 -98 -96 -94 -92 -92 -98 -83 -85 -82 -83 -41 -62 -40 -92 -57 -82 -83 -82 -92 -94 -97 -83 -71 -98 -40 -93 -94 -91 -40 -69 -40 -98 -98 -60 -98 -96 -98 -98 -98 -99 -98 -98 -91 -85 -98 -98 -97 -84 -98 -97 -98 -81 -98 -98 -40 -99 -41 -91 -96 -40 -97 -94 -41 -52 -86 -86 -90 -89 -89 -89 -90 -90 -98 -93 -77 -98 -82 -92 -98 -83 -82 -82 -81 -98 -83 -99 -98 -94 -98 -98 -83 -62 -83 -48 -94 -82 -82 -97 -83 -98 -94 -85 -88 -82 -98 -87 -77 -83 -90 -82 -99 -91 -97 -82 -89 -81 -98 -82 -98 -98 -98 -98 -98 -98 -96 -99 -97 -98 -81 -82 -98 -49 -98 -82 -98 -82 -82 -64 -86 -82 -93 -98 -98 -98 -98 -99 -98 -99 -98 -95 -98 -98 -98 -98 -93 -98 -98 -99 -98 -98 -98 -96 -94 -84 -98 -95 -98 -94 -98 -98 -98 -98 -79 -97 -53 -93 -92 -93 -95 -98 -98 -98 -93 -83 -83 -40 -98 -96 -82 -82 -85 -95 -99 -98 -98 -91 -82 -82 -94 -98 -98 -98 -98 -88 -98 -90 -97 -96 -92 -91 -96 -89 -95 -99 -98 -98 -98 -82 -99 -82 -92 -83 -98 -90 -82 -92 -97 -95 -98 -82 -82 -79 -85 -82 -98 -95 -92 -98 -98 -40 -40 -97 -98 -88 -98 -92 -92 -92 -83 -84 -98 -83 -85 -82 -72 -96 -90 -98 -98 -98 -98 -97 -89 -89 -89 -89 -90 -99 -98 -98 -98 -92 -93 -92 -91 -98 -98 -95 -82 -87 -82 -98 -82 -99 -82 -82 -82 -97 -98 -99 -98 -99 -96 -95 -99 -83 -98 -98 -95 -58 -82 -82 -68 -98 -82 -82 -68 -98 -82 -98 -82 -90 -82 -98 -98 -81 -95 -85 -96 -82 -98 -99 -98 -98 -99 -97 -99 -98 -99 -98 -98 -98 -98 -99 -98 -98 -94 -92 -92 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -96 -82 -92 -83 -92 -90 -82 -82 -74 -82 -98 -99 -98 -98 -98 -98 -98 -98 -92 -92 -92 -91 -94 -93 -98 -98 -94 -98 -98 -98 -93 -98 -98 -98 -99 -97 -93 -98 -98 -98 -98 -98 -98 -86 -81 -82 -83 -82 -81 -98 -82 -94 -93 -98 -98 -98 -94 -94 -99 -98 -94 -94 -99 -93 -98 -98 -99 -98 -98 -82 -76 -94 -93 -82 -92 -92 -82 -82 -64 -98 -99 -84 -85 -86 -85 -84 -86 -85 -85 -85 -95 -78 -90 -90 -94 -93 -82 -90 -82 -98 -92 -98 -82 -82 -85 -83 -84 -98 -98 -98 -98 -98 -98 -94 -97 -98 -98 -89 -98 -82 -82 -83 -40 -99 -98 -99 -95 -98 -97 -99 -98 -98 -99 -98 -93 -97 -99 -93 -99 -98 -98 -98 -98 -99 -94 -98 -98 -98 -99 -98 -82 -98 -82 -94 -82 -82 -65 -97 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -99 -98 -84 -84 -99 -98 -98 -94 -98 -98 -98 -98 -89 -97 -99 -93 -98 -98 -98 -99 -98 -78 -92 -91 -93 -94 -93 -90 -90 -90 -93 -95 -93 -96 -98 -99 -98 -82 -99 -94 -98 -95 -40 -90 -98 -99 -40 -98 -83 -64 -82 -56 -82 -97 -98 -98 -93 -98 -98 -93 -91 -93 -98 -98 -98 -99 -97 -98 -99 -90 -98 -82 -89 -82 -98 -93 -99 -98 -82 -84 -82 -99 -99 -98 -90 -99 -98 -98 -98 -99 -98 -98 -94 -94 -93 -93 -91 -91 -91 -95 -98 -98 -92 -99 -94 -84 -82 -98 -82 -62 -81 -88 -81 -93 -90 -89 -90 -98 -98 -98 -98 -98 -93 -92 -82 -98 -82 -98 -74 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -99 -99 -98 -88 -98 -82 -98 -98 -99 -40 -98 -40 -98 -98 -82 -92 -82 -45 -82 -89 -81 -79 -88 -98 -82 -99 -82 -53 -98 -98 -98 -98 -89 -89 -94 -98 -98 -99 -99 -98 -98 -99 -98 -98 -92 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -93 -98 -98 -98 -98 -93 -93 -90 -97 -98 -98 -98 -98 -84 -93 -93 -93 -99 -98 -93 -82 -98 -40 -82 -40 -40 -41 -81 -84 -82 -81 -63 -40 -98 -77 -98 -98 -98 -98 -99 -90 -90 -90 -97 -93 -82 -91 -98 -96 -82 -82 -82 -92 -82 -62 -82 -98 -98 -93 -93 -99 -91 -99 -98 -99 -98 -98 -93 -93 -98 -98 -98 -98 -98 -98 -98 -94 -98 -93 -93 -93 -95 -96 -98 -98 -98 -98 -99 -97 -98 -98 -99 -98 -99 -98 -98 -96 -98 -98 -94 -95 -93 -92 -92 -97 -92 -98 -98 -98 -99 -98 -98 -84 -85 -98 -99 -98 -99 -98 -98 -94 -78 -94 -93 -93 -95 -97 -89 -98 -40 -87 -82 -41 -89 -82 -90 -82 -93 -82 -82 -56 -92 -84 -89 -98 -87 -83 -92 -93 -93 -95 -98 -98 -98 -99 -99 -92 -98 -94 -98 -92 -92 -92 -99 -98 -83 -85 -89 -99 -85 -89 -99 -85 -98 -89 -96 -88 -89 -84 -97 -85 -99 -98 -98 -97 -97 -92 -81 -98 -84 -91 -84 -85 -98 -98 -78 -93 -92 -82 -93 -98 -83 -83 -82 -98 -82 -98 -82 -86 -98 -93 -98 -99 -98 -98 -98 -98 -99 -94 -98 -98 -98 -98 -97 -98 -97 -92 -98 -98 -98 -98 -93 -98 -96 -96 -92 -90 -97 -96 -93 -97 -93 -98 -98 -98 -99 -98 -98 -98 -97 -96 -99 -98 -98 -98 -98 -98 -90 -98 -94 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -99 -98 -92 -92 -98 -98 -40 -99 -82 -82 -41 -40 -81 -94 -80 -85 -40 -84 -84 -85 -78 -94 -98 -41 -47 -96 -96 -75 -82 -82 -98 -40 -40 -98 -82 -81 -98 -98 -98 -98 -92 -59 -40 -40 -82 -40 -40 -82 -96 -98 -86 -86 -98 -98 -98 -99 -95 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -96 -99 -98 -98 -92 -98 -98 -82 -40 -40 -99 -82 -40 -40 -74 -82 -73 -82 -83 -92 -94 -96 -92 -96 -98 -89 -82 -82 -59 -82 -99 -83 -98 -82 -46 -98 -89 -99 -98 -98 -98 -98 -98 -98 -92 -78 -96 -90 -91 -91 -90 -91 -91 -92 -92 -92 -95 -92 -94 -98 -98 -97 -98 -94 -91 -95 -99 -82 -97 -98 -99 -98 -88 -84 -91 -98 -98 -98 -97 -98 -98 -95 -98 -91 -97 -89 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -98 -98 -93 -91 -91 -98 -98 -98 -99 -99 -99 -98 -98 -98 -94 -94 -99 -98 -98 -92 -98 -98 -98 -98 -98 -97 -98 -98 -98 -92 -98 -98 -98 -98 -98 -92 -94 -84 -84 -93 -86 -85 -85 -82 -85 -98 -77 -72 -82 -90 -93 -82 -80 -92 -94 -81 -86 -98 -98 -99 -94 -98 -82 -82 -78 -82 -73 -82 -98 -92 -82 -67 -97 -83 -98 -98 -98 -98 -98 -99 -98 -98 -94 -98 -94 -93 -92 -94 -82 -82 -92 -82 -99 -82 -82 -62 -40 -81 -82 -62 -40 -73 -91 -82 -98 -83 -82 -82 -98 -82 -97 -94 -82 -90 -82 -97 -95 -91 -98 -92 -98 -98 -98 -98 -92 -98 -98 -92 -98 -98 -98 -99 -98 -94 -98 -98 -84 -92 -98 -99 -98 -99 -98 -97 -98 -78 -94 -91 -85 -92 -92 -92 -93 -98 -98 -98 -98 -92 -92 -92 -99 -98 -98 -98 -98 -99 -98 -98 -93 -98 -98 -98 -84 -99 -98 -98 -98 -97 -98 -92 -98 -94 -98 -98 -93 -92 -92 -98 -99 -98 -98 -99 -98 -98 -96 -99 -98 -98 -98 -94 -98 -98 -98 -98 -82 -98 -88 -99 -93 -98 -98 -99 -98 -98 -94 -98 -98 -96 -98 -98 -99 -94 -83 -98 -98 -98 -92 -99 -98 -98 -98 -98 -98 -98 -82 -84 -81 -85 -84 -82 -92 -83 -82 -82 -78 -82 -93 -92 -99 -98 -99 -98 -99 -96 -55 -98 -82 -94 -62 -82 -86 -82 -89 -82 -97 -82 -82 -98 -82 -88 -81 -99 -82 -99 -82 -97 -84 -82 -98 -82 -55 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -93 -91 -94 -91 -97 -84 -98 -98 -98 -98 -93 -98 -98 -98 -98 -92 -98 -98 -84 -93 -94 -98 -92 -94 -92 -93 -93 -79 -91 -93 -91 -92 -93 -90 -90 -91 -92 -92 -93 -93 -94 -92 -94 -98 -93 -92 -93 -90 -96 -98 -94 -83 -98 -97 -97 -97 -98 -94 -99 -98 -98 -97 -98 -94 -91 -97 -98 -98 -94 -97 -98 -98 -92 -99 -98 -99 -98 -98 -98 -98 -92 -95 -99 -95 -99 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -97 -98 -98 -91 -100 -96 -83 -82 -83 -99 -83 -83 -98 -98 -80 -40 -98 -40 -41 -98 -40 -85 -85 -85 -85 -85 -85 -85 -85 -41 -66 -94 -93 -40 -99 -98 -98 -93 -98 -40 -99 -91 -89 -99 -99 -98 -98 -99 -98 -93 -97 -96 -97 -83 -99 -92 -85 -95 -82 -81 -82 -71 -82 -94 -82 -94 -90 -82 -91 -81 -98 -82 -97 -95 -97 -93 -84 -99 -93 -92 -95 -98 -98 -94 -99 -98 -98 -94 -92 -94 -91 -98 -97 -98 -98 -98 -97 -97 -98 -90 -97 -92 -98 -93 -98 -92 -92 -92 -98 -97 -98 -92 -96 -92 -93 -98 -98 -98 -96 -88 -98 -98 -98 -98 -98 -97 -97 -91 -78 -94 -97 -96 -92 -92 -92 -98 -93 -96 -98 -98 -99 -98 -91 -98 -98 -92 -92 -98 -97 -98 -82 -92 -97 -98 -98 -98 -98 -98 -98 -99 -92 -82 -82 -91 -88 -98 -98 -99 -90 -98 -98 -98 -93 -97 -92 -97 -98 -99 -98 -98 -98 -98 -93 -98 -98 -98 -82 -96 -92 -92 -83 -93 -82 -99 -99 -93 -96 -82 -92 -64 -64 -82 -98 -82 -95 -90 -81 -86 -80 -91 -41 -40 -92 -94 -82 -93 -40 -88 -89 -89 -82 -88 -82 -88 -99 -88 -90 -86 -98 -40 -40 -97 -94 -41 -46 -89 -91 -97 -41 -40 -98 -83 -83 -83 -83 -81 -89 -98 -81 -98 -92 -88 -82 -86 -81 -97 -82 -67 -82 -98 -82 -82 -53 -82 -62 -92 -82 -92 -97 -97 -97 -96 -97 -97 -98 -97 -97 -97 -97 -91 -82 -91 -82 -92 -91 -92 -89 -91 -92 -92 -91 -93 -93 -93 -92 -91 -90 -91 -98 -98 -97 -91 -98 -93 -98 -97 -97 -83 -82 -82 -94 -93 -96 -98 -83 -83 -82 -66 -91 -98 -98 -41 -97 -97 -93 -86 -84 -98 -78 -93 -94 -94 -94 -93 -93 -94 -82 -71 -96 -96 -98 -88 -82 -93 -97 -83 -98 -84 -84 -99 -98 -82 -84 -85 -91 -91 -91 -91 -91 -91 -91 -91 -95 -98 -98 -92 -93 -84 -88 -89 -93 -98 -92 -92 -92 -93 -88 -89 -92 -94 -82 -82 -82 -81 -82 -99 -52 -90 -98 -85 -88 -92 -88 -96 -40 -40 -40 -98 -41 -40 -78 -84 -87 -88 -91 -91 -97 -98 -82 -98 -82 -82 -78 -82 -93 -82 -88 -82 -65 -82 -82 -82 -93 -98 -98 -82 -82 -73 -83 -83 -40 -40 -82 -88 -83 -40 -40 -93 -98 -92 -90 -92 -98 -94 -92 -97 -94 -98 -99 -98 -95 -98 -99 -98 -88 -98 -98 -99 -98 -98 -92 -98 -98 -98 -95 -83 -56 -98 -99 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -99 -97 -96 -98 -99 -98 -93 -86 -90 -82 -80 -97 -98 -99 -99 -98 -98 -98 -98 -82 -95 -95 -93 -91 -92 -93 -92 -93 -93 -93 -93 -98 -98 -98 -98 -92 -84 -98 -92 -99 -98 -98 -93 -98 -98 -98 -93 -98 -98 -99 -98 -98 -98 -98 -92 -92 -92 -97 -97 -96 -92 -92 -98 -78 -86 -90 -84 -93 -93 -99 -98 -98 -98 -94 -98 -96 -88 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -90 -98 -82 -84 -83 -84 -84 -93 -89 -98 -89 -98 -99 -92 -98 -98 -98 -99 -81 -88 -85 -40 -40 -83 -80 -80 -80 -40 -40 -85 -98 -95 -93 -90 -78 -40 -40 -99 -88 -89 -80 -83 -87 -91 -68 -40 -40 -94 -82 -83 -82 -89 -40 -40 -93 -98 -87 -99 -82 -82 -82 -82 -91 -82 -98 -82 -82 -47 -80 -68 -89 -90 -78 -92 -90 -97 -97 -83 -98 -78 -89 -89 -82 -90 -86 -84 -81 -93 -52 -96 -93 -82 -74 -82 -48 -89 -86 -83 -88 -93 -82 -90 -98 -92 -83 -62 -98 -82 -49 -92 -93 -85 -89 -80 -93 -93 -82 -50 -97 -95 -97 -75 -84 -89 -82 -82 -72 -88 -90 -95 -78 -82 -82 -82 -93 -91 -92 -94 -93 -99 -90 -90 -94 -94 -94 -82 -90 -82 -82 -98 -81 -81 -93 -98 -99 -98 -98 -94 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -96 -97 -80 -41 -41 -92 -92 -99 -98 -99 -98 -98 -97 -97 -97 -96 -91 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -80 -78 -78 -98 -87 -98 -94 -98 -98 -95 -98 -94 -87 -89 -84 -97 -76 -82 -85 -85 -85 -86 -85 -85 -98 -84 -92 -78 -98 -89 -88 -83 -81 -96 -98 -94 -54 -98 -82 -82 -98 -83 -50 -99 -98 -96 -98 -82 -71 -93 -83 -98 -86 -98 -40 -98 -41 -47 -83 -71 -97 -87 -90 -98 -97 -94 -94 -87 -82 -83 -61 -88 -94 -98 -81 -84 -84 -99 -83 -95 -91 -82 -98 -98 -98 -98 -98 -98 -99 -97 -84 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -92 -98 -84 -98 -96 -94 -93 -98 -92 -98 -98 -98 -98 -98 -98 -86 -89 -88 -98 -98 -97 -68 -98 -90 -82 -82 -98 -96 -82 -83 -82 -81 -81 -97 -82 -82 -84 -90 -99 -98 -91 -98 -97 -91 -98 -98 -98 -92 -92 -90 -99 -98 -99 -89 -94 -98 -99 -99 -98 -98 -98 -97 -95 -98 -40 -62 -40 -98 -98 -98 -93 -99 -98 -94 -94 -98 -96 -97 -98 -98 -98 -92 -98 -96 -96 -82 -97 -82 -98 -88 -84 -98 -98 -98 -99 -98 -98 -98 -99 -95 -99 -92 -92 -82 -99 -83 -98 -57 -82 -98 -83 -98 -93 -40 -41 -61 -83 -90 -82 -41 -98 -82 -96 -97 -97 -98 -99 -93 -82 -98 -92 -92 -99 -98 -93 -99 -91 -91 -86 -90 -94 -94 -98 -98 -96 -96 -96 -94 -91 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -90 -89 -88 -98 -89 -97 -92 -94 -97 -92 -98 -91 -93 -98 -92 -98 -97 -94 -97 -98 -89 -90 -90 -94 -97 -98 -98 -98 -99 -83 -83 -82 -98 -82 -99 -98 -98 -98 -79 -82 -97 -93 -82 -75 -98 -99 -81 -82 -62 -98 -57 -99 -91 -95 -99 -93 -98 -97 -98 -98 -93 -98 -98 -98 -93 -97 -95 -93 -96 -98 -98 -96 -96 -83 -59 -82 -84 -82 -58 -96 -96 -96 -96 -96 -96 -96 -95 -96 -96 -96 -94 -94 -94 -93 -93 -41 -82 -82 -40 -94 -97 -98 -95 -82 -94 -97 -98 -83 -82 -98 -98 -91 -92 -98 -92 -93 -93 -93 -93 -92 -93 -80 -89 -81 -93 -86 -82 -81 -83 -82 -84 -92 -44 -92 -49 -82 -92 -78 -91 -64 -86 -88 -81 -81 -49 -82 -82 -82 -98 -98 -98 -98 -67 -82 -84 -99 -82 -97 -82 -93 -98 -81 -78 -82 -97 -99 -98 -81 -98 -98 -40 -40 -94 -48 -80 -89 -93 -90 -82 -98 -83 -82 -99 -98 -97 -98 -98 -98 -98 -99 -98 -96 -98 -94 -98 -98 -93 -98 -98 -98 -82 -82 -82 -83 -80 -82 -88 -98 -88 -89 -99 -99 -98 -98 -98 -82 -82 -84 -82 -50 -82 -98 -82 -82 -85 -98 -82 -94 -92 -89 -98 -98 -98 -94 -98 -98 -94 -98 -92 -93 -93 -93 -93 -94 -93 -98 -99 -92 -98 -98 -98 -99 -98 -93 -98 -98 -98 -98 -93 -98 -88 -98 -98 -98 -98 -93 -92 -98 -98 -98 -98 -92 -86 -88 -82 -82 -91 -98 -91 -99 -97 -99 -98 -98 -98 -98 -93 -98 -98 -98 -92 -98 -98 -98 -40 -98 -40 -98 -98 -98 -99 -98 -98 -98 -99 -98 -95 -91 -95 -95 -95 -98 -91 -91 -98 -95 -81 -99 -82 -98 -93 -98 -93 -95 -92 -88 -95 -90 -90 -100 -82 -55 -82 -78 -84 -98 -98 -93 -78 -96 -82 -55 -71 -99 -99 -98 -99 -99 -98 -98 -91 -92 -95 -93 -98 -40 -87 -82 -40 -98 -40 -98 -87 -40 -40 -98 -98 -98 -40 -99 -92 -98 -92 -98 -82 -60 -92 -92 -83 -82 -82 -94 -91 -82 -94 -99 -93 -98 -52 -82 -82 -90 -82 -98 -82 -83 -98 -98 -97 -98 -88 -98 -98 -91 -95 -96 -98 -97 -96 -79 -93 -91 -92 -91 -89 -98 -94 -92 -98 -99 -98 -98 -98 -98 -99 -98 -98 -90 -95 -98 -91 -85 -91 -98 -99 -94 -95 -95 -98 -84 -96 -83 -96 -96 -93 -96 -96 -98 -98 -88 -95 -98 -96 -91 -98 -90 -94 -98 -91 -91 -40 -92 -40 -98 -90 -82 -91 -84 -82 -82 -97 -98 -98 -98 -98 -98 -93 -81 -94 -97 -82 -94 -98 -98 -99 -82 -82 -82 -99 -98 -90 -95 -91 -98 -91 -97 -98 -98 -87 -88 -89 -99 -98 -95 -93 -89 -94 -88 -88 -89 -87 -88 -94 -82 -99 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -93 -82 -98 -98 -89 -95 -82 -82 -92 -81 -99 -98 -81 -81 -40 -82 -82 -83 -81 -82 -86 -80 -81 -40 -72 -40 -52 -98 -82 -82 -82 -72 -94 -82 -82 -98 -81 -81 -52 -81 -81 -50 -82 -81 -81 -81 -81 -98 -81 -81 -81 -81 -98 -41 -98 -98 -93 -98 -91 -98 -95 -98 -98 -98 -98 -95 -98 -84 -98 -98 -98 -93 -98 -98 -98 -99 -79 -98 -98 -93 -92 -93 -93 -91 -93 -93 -94 -93 -93 -92 -96 -95 -98 -99 -97 -98 -91 -98 -98 -91 -81 -98 -82 -98 -93 -99 -98 -98 -82 -82 -82 -82 -81 -97 -81 -81 -99 -99 -98 -98 -98 -93 -93 -40 -98 -40 -40 -99 -98 -98 -96 -98 -81 -81 -99 -82 -82 -91 -82 -82 -47 -99 -94 -99 -93 -94 -98 -99 -98 -98 -98 -94 -98 -98 -94 -94 -98 -93 -96 -96 -92 -98 -94 -98 -98 -98 -88 -89 -97 -95 -84 -98 -98 -94 -98 -79 -99 -94 -94 -97 -99 -94 -98 -99 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -82 -98 -93 -83 -98 -98 -98 -82 -82 -60 -82 -83 -91 -98 -98 -81 -82 -93 -82 -82 -88 -81 -81 -45 -98 -98 -91 -80 -81 -98 -82 -82 -98 -82 -82 -98 -82 -82 -98 -81 -81 -82 -81 -81 -97 -98 -99 -98 -98 -98 -90 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -93 -95 -99 -98 -96 -98 -92 -98 -87 -89 -98 -98 -99 -98 -98 -98 -98 -80 -95 -98 -93 -94 -94 -94 -91 -91 -91 -90 -91 -90 -81 -80 -99 -98 -40 -89 -97 -98 -90 -81 -81 -92 -98 -81 -98 -81 -81 -40 -65 -40 -56 -82 -82 -73 -86 -82 -82 -85 -81 -82 -82 -82 -40 -68 -90 -82 -82 -99 -40 -97 -99 -98 -94 -99 -98 -99 -98 -99 -98 -99 -98 -98 -98 -98 -90 -98 -99 -98 -99 -98 -99 -98 -79 -98 -94 -99 -99 -98 -88 -89 -80 -90 -89 -88 -89 -89 -89 -93 -94 -94 -81 -81 -68 -95 -81 -80 -81 -84 -81 -81 -99 -82 -98 -95 -95 -81 -81 -80 -95 -81 -81 -66 -98 -81 -81 -92 -80 -81 -99 -81 -81 -71 -98 -98 -98 -82 -96 -97 -97 -98 -98 -98 -98 -98 -98 -92 -92 -98 -98 -98 -98 -98 -96 -92 -99 -96 -98 -91 -99 -98 -95 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -89 -98 -98 -98 -98 -98 -98 -98 -98 -77 -96 -94 -94 -94 -94 -95 -94 -94 -95 -94 -95 -94 -92 -93 -95 -94 -94 -94 -94 -95 -94 -91 -95 -95 -94 -81 -97 -96 -91 -97 -98 -96 -48 -81 -81 -88 -81 -81 -80 -81 -53 -81 -81 -81 -89 -81 -82 -98 -98 -99 -81 -81 -84 -96 -81 -80 -81 -40 -40 -95 -97 -82 -82 -62 -81 -82 -41 -98 -81 -80 -97 -81 -81 -98 -81 -81 -81 -81 -64 -80 -81 -89 -81 -81 -81 -99 -81 -81 -88 -80 -81 -89 -82 -81 -98 -81 -81 -91 -80 -81 -40 -61 -81 -98 -82 -82 -81 -81 -54 -81 -81 -98 -40 -69 -40 -85 -61 -81 -81 -82 -81 -81 -82 -85 -99 -82 -98 -81 -81 -98 -99 -97 -98 -91 -95 -96 -90 -90 -92 -98 -98 -99 -98 -99 -88 -98 -98 -99 -98 -98 -98 -99 -95 -98 -98 -98 -98 -98 -98 -94 -84 -90 -89 -98 -98 -98 -98 -98 -89 -84 -98 -98 -99 -98 -98 -97 -98 -98 -90 -97 -89 -84 -98 -89 -96 -92 -94 -84 -98 -98 -99 -98 -98 -91 -96 -98 -77 -94 -93 -87 -83 -89 -91 -92 -92 -91 -92 -98 -98 -98 -98 -99 -98 -98 -98 -94 -98 -95 -80 -86 -89 -97 -85 -89 -97 -98 -77 -76 -81 -60 -81 -81 -83 -91 -80 -81 -98 -95 -95 -96 -81 -82 -44 -81 -81 -91 -98 -41 -40 -85 -95 -98 -95 -91 -99 -93 -93 -100 -98 -81 -82 -98 -82 -82 -82 -81 -70 -81 -81 -69 -99 -98 -98 -98 -98 -98 -98 -92 -95 -97 -98 -87 -98 -97 -89 -82 -89 -81 -81 -89 -91 -98 -84 -81 -81 -76 -81 -81 -93 -92 -82 -82 -94 -96 -81 -81 -81 -81 -98 -81 -81 -62 -98 -81 -81 -94 -96 -95 -95 -95 -91 -95 -98 -95 -82 -96 -92 -91 -84 -81 -91 -80 -81 -81 -95 -91 -81 -81 -65 -81 -81 -98 -96 -96 -91 -90 -91 -90 -91 -91 -96 -96 -96 -96 -96 -98 -98 -98 -98 -97 -98 -96 -94 -98 -98 -91 -99 -98 -98 -98 -99 -98 -98 -98 -99 -98 -91 -93 -98 -98 -98 -99 -97 -99 -89 -89 -98 -95 -95 -97 -92 -92 -98 -77 -94 -94 -91 -93 -92 -93 -92 -93 -93 -93 -93 -96 -96 -96 -93 -93 -92 -95 -91 -90 -90 -97 -82 -97 -92 -81 -62 -98 -96 -97 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -98 -99 -81 -81 -41 -62 -81 -81 -40 -76 -98 -41 -82 -81 -80 -82 -82 -89 -80 -80 -80 -80 -80 -88 -79 -88 -93 -92 -85 -92 -92 -93 -95 -94 -94 -98 -81 -82 -49 -96 -81 -81 -98 -81 -81 -81 -95 -98 -81 -81 -98 -82 -98 -82 -82 -82 -82 -99 -98 -98 -98 -98 -91 -98 -97 -98 -98 -92 -97 -98 -98 -98 -98 -98 -98 -98 -84 -98 -99 -99 -99 -99 -97 -97 -97 -96 -90 -98 -91 -98 -98 -98 -99 -98 -98 -98 -99 -99 -97 -95 -98 -92 -93 -96 -95 -97 -96 -98 -95 -98 -96 -96 -96 -93 -92 -92 -83 -84 -93 -92 -96 -96 -97 -92 -94 -89 -93 -96 -92 -90 -94 -94 -94 -95 -96 -92 -92 -92 -92 -92 -96 -92 -98 -98 -82 -82 -99 -81 -81 -60 -96 -81 -95 -81 -81 -92 -84 -82 -82 -82 -81 -73 -98 -81 -82 -57 -92 -98 -99 -97 -92 -98 -94 -98 -92 -98 -98 -98 -96 -98 -95 -98 -98 -81 -82 -93 -81 -81 -94 -98 -78 -81 -82 -98 -81 -82 -82 -82 -98 -82 -82 -74 -81 -82 -91 -81 -81 -82 -82 -81 -81 -82 -96 -93 -81 -81 -81 -81 -89 -92 -98 -81 -81 -40 -77 -81 -81 -40 -97 -82 -82 -98 -91 -82 -82 -98 -98 -82 -82 -40 -40 -76 -80 -98 -41 -96 -97 -95 -86 -91 -56 -98 -81 -81 -98 -98 -98 -98 -99 -98 -95 -98 -98 -99 -90 -97 -96 -93 -98 -97 -98 -98 -98 -98 -98 -98 -94 -98 -81 -81 -48 -81 -81 -98 -82 -81 -84 -92 -96 -96 -92 -82 -98 -82 -82 -65 -82 -85 -98 -98 -98 -98 -98 -93 -92 -92 -98 -97 -92 -92 -92 -98 -63 -41 -89 -40 -85 -99 -98 -99 -82 -82 -82 -76 -81 -86 -79 -93 -94 -97 -98 -94 -98 -81 -82 -99 -82 -82 -86 -81 -81 -82 -99 -92 -92 -98 -82 -98 -98 -91 -98 -96 -98 -98 -98 -92 -97 -97 -92 -81 -81 -83 -82 -82 -98 -82 -82 -90 -90 -98 -98 -98 -97 -92 -92 -99 -98 -97 -99 -97 -99 -99 -98 -98 -98 -98 -99 -99 -81 -81 -82 -81 -98 -81 -80 -97 -85 -99 -98 -98 -98 -95 -90 -81 -92 -92 -98 -93 -92 -92 -83 -81 -84 -83 -85 -85 -95 -80 -81 -98 -82 -77 -81 -82 -80 -91 -98 -81 -80 -97 -82 -82 -72 -89 -82 -82 -82 -82 -50 -95 -82 -83 -95 -86 -81 -82 -94 -84 -82 -81 -90 -81 -82 -98 -98 -98 -98 -96 -98 -97 -98 -99 -92 -98 -99 -98 -97 -93 -90 -88 -98 -98 -96 -98 -98 -99 -96 -98 -97 -97 -92 -97 -97 -92 -84 -92 -99 -82 -81 -84 -81 -98 -98 -81 -81 -92 -76 -81 -81 -94 -94 -98 -99 -82 -82 -92 -81 -82 -97 -81 -80 -80 -98 -86 -81 -81 -98 -81 -81 -98 -81 -98 -91 -89 -89 -98 -92 -94 -98 -98 -41 -88 -98 -40 -92 -98 -94 -81 -81 -94 -81 -81 -97 -98 -98 -96 -84 -89 -95 -98 -90 -98 -94 -98 -94 -98 -98 -98 -98 -99 -81 -81 -89 -96 -84 -97 -84 -78 -98 -98 -98 -98 -94 -98 -98 -98 -98 -92 -98 -98 -98 -98 -84 -84 -89 -93 -84 -88 -89 -89 -84 -85 -98 -98 -98 -98 -99 -82 -82 -94 -94 -91 -81 -81 -40 -84 -45 -40 -41 -98 -99 -98 -98 -85 -82 -82 -82 -81 -82 -98 -99 -99 -86 -82 -82 -74 -56 -98 -98 -98 -91 -98 -98 -98 -98 -91 -98 -98 -98 -97 -98 -98 -82 -98 -94 -57 -98 -98 -98 -94 -98 -99 -41 -98 -41 -71 -98 -41 -79 -41 -98 -98 -98 -98 -98 -98 -98 -98 -86 -82 -82 -94 -82 -82 -81 -81 -80 -94 -98 -99 -98 -98 -81 -80 -82 -81 -82 -98 -94 -98 -98 -98 -81 -77 -81 -81 -81 -62 -91 -89 -94 -98 -82 -82 -81 -82 -82 -98 -97 -82 -81 -81 -72 -82 -82 -98 -94 -41 -40 -40 -98 -98 -99 -99 -98 -98 -97 -82 -81 -73 -95 -94 -81 -82 -50 -98 -94 -99 -98 -98 -98 -98 -96 -92 -93 -98 -98 -97 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -95 -92 -98 -91 -98 -98 -98 -98 -98 -98 -98 -99 -88 -97 -84 -90 -87 -84 -80 -80 -85 -79 -80 -93 -92 -90 -81 -81 -98 -82 -82 -53 -81 -82 -98 -80 -81 -96 -81 -82 -74 -81 -61 -81 -81 -81 -41 -98 -97 -81 -81 -98 -98 -82 -81 -81 -41 -92 -81 -81 -50 -88 -81 -81 -81 -81 -49 -81 -81 -81 -81 -81 -82 -82 -83 -79 -82 -82 -84 -81 -82 -82 -98 -91 -86 -82 -82 -53 -81 -98 -82 -81 -52 -81 -82 -98 -99 -93 -82 -81 -82 -92 -81 -82 -47 -95 -95 -97 -95 -91 -82 -81 -91 -82 -82 -97 -95 -81 -82 -69 -76 -83 -92 -92 -92 -96 -94 -90 -95 -94 -94 -92 -90 -96 -95 -81 -81 -41 -98 -81 -81 -81 -81 -96 -82 -98 -97 -40 -88 -85 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -91 -89 -41 -98 -92 -40 -41 -92 -97 -99 -96 -98 -98 -99 -97 -97 -98 -99 -99 -98 -99 -98 -99 -98 -98 -98 -98 -98 -97 -98 -94 -94 -94 -98 -91 -95 -98 -97 -98 -81 -81 -53 -81 -81 -70 -96 -98 -96 -82 -87 -89 -81 -92 -89 -91 -91 -89 -89 -88 -64 -89 -89 -88 -88 -86 -95 -41 -82 -82 -57 -82 -98 -98 -94 -92 -90 -91 -98 -98 -98 -81 -81 -82 -82 -82 -99 -99 -99 -96 -82 -81 -78 -82 -82 -98 -90 -91 -98 -99 -99 -98 -98 -98 -81 -82 -82 -82 -82 -98 -98 -99 -98 -98 -98 -99 -91 -98 -98 -98 -98 -98 -99 -98 -99 -84 -99 -98 -98 -94 -98 -96 -98 -99 -77 -94 -41 -80 -40 -87 -92 -93 -92 -93 -94 -92 -93 -98 -99 -98 -98 -98 -98 -98 -93 -92 -98 -92 -91 -82 -82 -90 -82 -82 -82 -95 -82 -82 -86 -97 -71 -98 -98 -99 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -95 -98 -81 -82 -92 -82 -82 -72 -97 -97 -98 -98 -99 -98 -98 -98 -97 -97 -99 -99 -97 -98 -98 -98 -98 -92 -95 -92 -92 -98 -82 -82 -82 -82 -82 -41 -88 -96 -89 -89 -91 -95 -92 -98 -96 -98 -98 -91 -93 -98 -98 -98 -98 -92 -97 -90 -98 -98 -98 -98 -98 -98 -98 -99 -99 -82 -82 -84 -97 -82 -91 -82 -82 -92 -94 -79 -82 -80 -82 -82 -96 -98 -98 -98 -92 -90 -95 -92 -88 -82 -82 -82 -82 -82 -82 -82 -81 -98 -98 -95 -98 -98 -99 -98 -97 -98 -95 -92 -98 -99 -98 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -94 -93 -98 -96 -94 -98 -98 -98 -97 -98 -97 -98 -83 -94 -98 -98 -99 -98 -98 -98 -98 -78 -95 -98 -94 -94 -94 -82 -82 -82 -50 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -93 -90 -84 -93 -98 -98 -98 -98 -98 -98 -82 -82 -82 -82 -82 -98 -94 -98 -98 -98 -98 -94 -98 -99 -98 -90 -98 -98 -97 -94 -98 -90 -96 -98 -94 -99 -98 -98 -98 -98 -96 -82 -82 -82 -82 -49 -98 -98 -98 -98 -98 -98 -99 -92 -94 -98 -98 -98 -98 -95 -98 -90 -98 -98 -98 -40 -40 -40 -41 -40 -40 -88 -88 -88 -88 -98 -40 -40 -82 -76 -82 -83 -82 -97 -98 -40 -40 -86 -83 -82 -40 -39 -59 -99 -97 -98 -98 -94 -98 -82 -82 -94 -97 -82 -82 -88 -82 -82 -82 -82 -41 -81 -82 -98 -98 -97 -98 -98 -98 -95 -97 -98 -99 -98 -97 -97 -97 -98 -93 -98 -98 -94 -97 -96 -98 -96 -90 -91 -98 -98 -98 -98 -98 -92 -98 -98 -98 -95 -96 -98 -91 -98 -98 -98 -93 -97 -97 -93 -98 -98 -91 -98 -98 -98 -98 -98 -92 -98 -97 -87 -98 -93 -92 -92 -90 -96 -90 -96 -94 -91 -94 -93 -91 -92 -92 -94 -94 -98 -83 -82 -98 -82 -82 -66 -91 -92 -91 -96 -92 -98 -82 -98 -98 -99 -92 -93 -98 -98 -98 -99 -98 -98 -98 -91 -99 -93 -89 -89 -90 -94 -83 -82 -82 -82 -82 -67 -40 -40 -40 -41 -40 -92 -98 -99 -98 -98 -98 -92 -98 -98 -98 -98 -98 -81 -82 -88 -96 -84 -83 -85 -98 -84 -78 -61 -94 -92 -81 -77 -86 -84 -90 -54 -40 -40 -41 -40 -89 -94 -82 -40 -40 -83 -80 -81 -82 -82 -96 -93 -99 -85 -81 -81 -98 -51 -82 -81 -96 -81 -81 -47 -82 -81 -82 -82 -81 -90 -98 -81 -81 -82 -82 -81 -90 -82 -82 -99 -82 -81 -98 -80 -81 -88 -94 -84 -80 -81 -98 -98 -98 -99 -98 -94 -98 -90 -91 -98 -90 -98 -97 -96 -98 -92 -98 -92 -98 -96 -98 -81 -81 -98 -82 -81 -85 -98 -82 -82 -98 -98 -98 -98 -99 -77 -94 -93 -92 -92 -92 -92 -93 -93 -95 -92 -92 -93 -98 -98 -98 -92 -97 -98 -90 -94 -96 -82 -98 -98 -97 -96 -98 -96 -94 -97 -97 -92 -98 -99 -92 -98 -98 -98 -96 -86 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -92 -98 -95 -96 -90 -98 -98 -99 -98 -94 -98 -82 -96 -84 -89 -81 -81 -81 -81 -81 -98 -98 -90 -99 -46 -98 -88 -63 -92 -95 -82 -98 -98 -81 -80 -100 -81 -81 -53 -81 -82 -86 -86 -83 -84 -84 -84 -84 -86 -92 -87 -85 -84 -92 -47 -82 -82 -82 -82 -82 -82 -81 -82 -98 -86 -81 -81 -94 -85 -98 -93 -68 -98 -99 -82 -98 -82 -89 -98 -98 -98 -86 -81 -81 -98 -82 -81 -82 -81 -81 -66 -81 -82 -81 -81 -81 -90 -81 -81 -82 -90 -80 -81 -71 -97 -93 -96 -96 -96 -81 -81 -96 -81 -81 -78 -99 -93 -92 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -99 -96 -96 -92 -92 -93 -92 -98 -88 -99 -94 -94 -98 -92 -99 -92 -92 -77 -94 -94 -93 -92 -94 -94 -91 -94 -94 -94 -94 -94 -97 -98 -98 -98 -98 -98 -98 -98 -98 -99 -89 -99 -98 -98 -98 -96 -93 -92 -64 -97 -94 -98 -81 -76 -81 -81 -98 -98 -90 -81 -81 -81 -94 -98 -82 -83 -98 -82 -81 -82 -85 -95 -96 -98 -95 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -41 -40 -40 -40 -40 -98 -99 -98 -40 -40 -98 -40 -40 -98 -94 -98 -98 -98 -98 -94 -98 -99 -88 -87 -88 -88 -86 -89 -87 -96 -99 -78 -94 -94 -91 -98 -98 -98 -84 -82 -83 -98 -98 -98 -94 -82 -99 -82 -98 -99 -94 -91 -94 -93 -97 -93 -92 -82 -99 -95 -93 -82 -79 -83 -98 -82 -92 -98 -82 -82 -82 -81 -98 -99 -90 -94 -90 -99 -99 -93 -98 -98 -98 -98 -92 -97 -99 -96 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -88 -84 -98 -94 -92 -98 -99 -98 -95 -92 -95 -90 -90 -98 -98 -98 -95 -98 -95 -89 -98 -98 -99 -98 -99 -98 -92 -99 -98 -81 -98 -98 -99 -98 -82 -96 -82 -84 -98 -99 -98 -96 -93 -97 -90 -98 -98 -98 -92 -40 -40 -98 -40 -40 -84 -82 -98 -98 -95 -40 -40 -40 -40 -73 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -97 -98 -93 -98 -98 -82 -93 -82 -72 -96 -95 -80 -84 -81 -79 -89 -85 -84 -85 -98 -77 -81 -94 -93 -81 -50 -83 -81 -81 -73 -99 -99 -81 -98 -82 -59 -81 -44 -81 -70 -95 -98 -82 -82 -89 -98 -93 -97 -98 -94 -95 -91 -90 -98 -98 -98 -96 -98 -97 -91 -99 -95 -98 -91 -98 -98 -99 -99 -98 -98 -98 -99 -98 -98 -96 -98 -98 -99 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -95 -99 -99 -98 -98 -99 -98 -98 -92 -92 -93 -98 -98 -93 -92 -97 -98 -98 -98 -84 -99 -98 -99 -98 -98 -99 -99 -95 -91 -91 -84 -93 -95 -92 -93 -94 -94 -81 -98 -89 -82 -83 -85 -99 -98 -98 -98 -86 -98 -99 -98 -82 -40 -40 -91 -40 -40 -52 -90 -82 -98 -98 -40 -40 -63 -40 -40 -98 -92 -98 -98 -96 -90 -96 -97 -94 -98 -91 -97 -96 -98 -98 -88 -98 -83 -97 -97 -98 -90 -82 -85 -79 -43 -80 -93 -98 -83 -82 -98 -98 -94 -98 -98 -83 -40 -82 -82 -82 -90 -88 -97 -89 -82 -98 -82 -88 -80 -88 -89 -90 -89 -81 -90 -82 -98 -81 -82 -82 -90 -81 -83 -82 -98 -83 -90 -92 -96 -98 -98 -93 -98 -98 -98 -97 -98 -98 -98 -98 -99 -89 -96 -99 -95 -95 -95 -98 -90 -90 -90 -98 -95 -91 -93 -92 -92 -91 -95 -91 -91 -83 -87 -96 -99 -89 -98 -99 -99 -84 -95 -93 -99 -95 -90 -94 -98 -98 -98 -98 -98 -98 -96 -99 -92 -98 -99 -95 -98 -92 -95 -96 -92 -91 -98 -84 -98 -89 -92 -80 -88 -90 -82 -99 -82 -68 -82 -71 -88 -99 -98 -99 -96 -98 -88 -89 -92 -88 -76 -94 -94 -93 -94 -95 -96 -98 -96 -97 -98 -96 -92 -98 -92 -98 -98 -83 -87 -82 -84 -89 -80 -98 -81 -93 -53 -82 -98 -98 -98 -98 -98 -98 -93 -91 -81 -98 -82 -63 -82 -98 -98 -98 -98 -98 -93 -98 -82 -82 -59 -95 -82 -69 -98 -82 -81 -77 -98 -81 -61 -40 -40 -81 -81 -40 -41 -98 -40 -40 -40 -40 -83 -98 -98 -98 -91 -97 -98 -98 -83 -98 -89 -95 -88 -92 -98 -96 -99 -84 -83 -84 -84 -85 -98 -98 -98 -96 -76 -64 -44 -81 -81 -94 -83 -91 -83 -68 -98 -98 -99 -98 -98 -95 -91 -92 -98 -97 -99 -95 -92 -93 -95 -95 -93 -83 -98 -92 -97 -98 -92 -98 -98 -98 -90 -95 -98 -98 -90 -95 -98 -95 -98 -98 -92 -99 -98 -98 -98 -90 -98 -98 -98 -93 -98 -92 -98 -98 -98 -98 -98 -96 -95 -83 -84 -98 -98 -99 -98 -98 -98 -98 -77 -94 -99 -94 -94 -94 -94 -96 -91 -94 -98 -82 -98 -82 -98 -98 -98 -99 -98 -99 -98 -98 -98 -93 -82 -54 -98 -82 -65 -96 -81 -96 -98 -97 -97 -98 -83 -98 -73 -90 -90 -40 -40 -97 -40 -40 -58 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -95 -93 -98 -82 -90 -96 -90 -98 -82 -99 -82 -78 -82 -81 -82 -99 -40 -40 -99 -40 -40 -84 -83 -98 -92 -88 -88 -89 -95 -97 -89 -91 -87 -79 -98 -88 -92 -94 -98 -98 -99 -89 -98 -98 -97 -98 -99 -96 -96 -90 -90 -84 -98 -98 -98 -91 -82 -99 -98 -82 -98 -98 -98 -98 -98 -98 -98 -90 -92 -91 -88 -98 -84 -88 -99 -95 -94 -98 -90 -90 -98 -99 -98 -95 -98 -98 -97 -98 -98 -88 -84 -87 -96 -98 -98 -99 -98 -98 -98 -99 -98 -98 -93 -93 -92 -98 -99 -98 -98 -97 -99 -98 -72 -98 -84 -87 -98 -99 -99 -96 -98 -92 -88 -98 -96 -98 -98 -94 -98 -97 -98 -85 -96 -91 -90 -91 -91 -93 -92 -53 -84 -83 -81 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -98 -82 -95 -98 -98 -94 -98 -92 -98 -35 -77 -85 -96 -99 -92 -95 -90 -92 -89 -98 -90 -95 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -95 -31 -83 -98 -85 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -95 -93 -95 -92 -98 -99 -98 -97 -95 -77 -98 -92 -98 -98 -98 -98 -98 -93 -97 -88 -89 -94 -97 -97 -98 -98 -98 -94 -76 -40 -82 -88 -91 -94 -85 -82 -82 -66 -82 -56 -87 -83 -77 -83 -98 -82 -98 -83 -82 -98 -82 -90 -83 -91 -95 -95 -84 -95 -89 -94 -82 -86 -82 -92 -96 -82 -96 -98 -99 -88 -99 -98 -99 -94 -98 -99 -98 -98 -93 -97 -84 -98 -98 -96 -98 -98 -98 -96 -98 -98 -98 -98 -99 -96 -98 -98 -98 -98 -98 -98 -87 -89 -98 -88 -98 -99 -98 -98 -98 -88 -98 -98 -98 -98 -99 -98 -96 -98 -89 -98 -98 -98 -98 -98 -99 -98 -98 -76 -99 -98 -82 -86 -94 -90 -94 -94 -98 -97 -40 -40 -93 -98 -40 -40 -98 -98 -98 -98 -98 -90 -94 -98 -98 -84 -69 -82 -93 -98 -98 -98 -96 -98 -92 -91 -98 -98 -94 -98 -98 -98 -98 -91 -98 -93 -93 -92 -98 -80 -98 -90 -82 -96 -95 -98 -96 -88 -98 -86 -99 -98 -98 -98 -98 -98 -98 -98 -84 -98 -98 -98 -84 -98 -97 -98 -98 -82 -82 -98 -86 -87 -98 -85 -91 -87 -89 -92 -94 -98 -93 -98 -99 -98 -95 -82 -81 -94 -82 -82 -98 -90 -99 -85 -98 -85 -98 -84 -99 -85 -89 -97 -98 -98 -90 -97 -98 -98 -98 -97 -98 -98 -95 -99 -98 -98 -99 -98 -96 -90 -83 -93 -93 -84 -90 -98 -98 -98 -84 -98 -99 -98 -99 -98 -92 -98 -91 -99 -98 -99 -98 -98 -98 -90 -98 -90 -99 -98 -94 -99 -98 -97 -98 -84 -84 -98 -98 -98 -98 -99 -98 -98 -91 -76 -95 -88 -74 -92 -92 -89 -92 -93 -94 -93 -92 -93 -93 -92 -98 -93 -92 -92 -93 -95 -95 -90 -89 -90 -53 -85 -90 -90 -98 -90 -98 -98 -98 -94 -98 -95 -92 -87 -98 -90 -96 -88 -98 -98 -99 -98 -95 -41 -76 -90 -82 -87 -96 -95 -98 -92 -92 -99 -98 -88 -98 -98 -98 -95 -96 -98 -90 -89 -81 -98 -98 -98 -85 -84 -84 -98 -98 -98 -98 -92 -97 -98 -97 -97 -98 -82 -97 -95 -84 -84 -84 -99 -92 -41 -81 -89 -99 -75 -82 -82 -82 -82 -82 -93 -96 -91 -99 -98 -95 -92 -65 -82 -82 -82 -82 -82 -83 -98 -82 -82 -82 -82 -82 -81 -89 -99 -91 -94 -98 -91 -97 -90 -92 -81 -84 -63 -82 -83 -77 -96 -82 -98 -81 -98 -81 -88 -91 -61 -81 -81 -63 -95 -57 -88 -82 -77 -81 -93 -95 -95 -81 -82 -99 -98 -81 -83 -91 -82 -82 -82 -95 -81 -82 -82 -40 -40 -76 -81 -81 -79 -40 -40 -97 -41 -94 -98 -98 -84 -98 -94 -98 -98 -98 -98 -98 -97 -90 -98 -91 -93 -93 -92 -95 -84 -98 -99 -96 -92 -92 -98 -98 -98 -98 -99 -98 -98 -94 -92 -93 -98 -98 -92 -98 -84 -86 -97 -96 -98 -98 -98 -98 -98 -90 -94 -91 -98 -91 -91 -91 -98 -94 -94 -94 -99 -96 -98 -98 -98 -88 -89 -91 -87 -86 -98 -86 -85 -84 -98 -85 -97 -86 -85 -86 -97 -98 -97 -84 -98 -99 -98 -98 -83 -98 -97 -94 -96 -98 -91 -98 -98 -98 -98 -90 -97 -88 -95 -84 -82 -84 -84 -87 -87 -98 -89 -94 -94 -94 -95 -85 -97 -98 -98 -99 -99 -86 -86 -84 -86 -85 -98 -89 -90 -91 -97 -98 -97 -84 -88 -90 -97 -93 -89 -84 -98 -95 -98 -92 -88 -97 -97 -88 -89 -92 -90 -88 -80 -81 -95 -90 -82 -82 -94 -89 -90 -88 -89 -84 -94 -98 -97 -95 -86 -85 -89 -86 -97 -86 -99 -98 -98 -98 -93 -85 -82 -93 -92 -86 -68 -86 -97 -86 -98 -86 -85 -97 -92 -99 -84 -97 -98 -99 -85 -97 -86 -83 -86 -86 -88 -85 -90 -86 -99 -86 -77 -94 -85 -86 -92 -85 -87 -85 -91 -92 -92 -92 -92 -94 -99 -85 -93 -98 -98 -97 -92 -92 -98 -90 -42 -82 -94 -68 -98 -92 -82 -98 -99 -97 -99 -98 -96 -98 -82 -94 -98 -98 -98 -98 -95 -97 -98 -94 -90 -97 -91 -98 -98 -97 -92 -94 -98 -93 -99 -94 -92 -95 -97 -86 -96 -97 -84 -84 -85 -85 -85 -85 -85 -86 -90 -85 -55 -90 -77 -85 -91 -86 -98 -98 -92 -98 -95 -90 -98 -41 -81 -46 -93 -94 -85 -95 -82 -82 -40 -84 -40 -83 -94 -95 -78 -41 -59 -41 -92 -96 -82 -67 -98 -97 -98 -90 -84 -98 -98 -97 -98 -86 -85 -96 -97 -97 -97 -98 -95 -94 -93 -97 -92 -97 -98 -99 -98 -93 -98 -99 -98 -98 -88 -97 -89 -92 -95 -99 -96 -98 -98 -98 -98 -98 -98 -98 -89 -98 -89 -99 -98 -98 -98 -98 -84 -87 -98 -98 -98 -94 -98 -99 -98 -94 -94 -95 -92 -91 -92 -92 -92 -92 -92 -94 -98 -92 -91 -98 -88 -89 -90 -88 -85 -84 -86 -92 -93 -97 -97 -98 -98 -98 -98 -94 -94 -97 -98 -98 -98 -90 -93 -98 -98 -98 -91 -92 -98 -98 -97 -98 -98 -98 -90 -90 -93 -85 -93 -95 -94 -94 -98 -89 -89 -91 -87 -98 -83 -98 -95 -98 -98 -98 -98 -98 -98 -98 -99 -91 -98 -91 -97 -98 -94 -92 -91 -96 -98 -98 -98 -98 -97 -99 -97 -89 -89 -88 -89 -89 -89 -88 -94 -97 -77 -94 -96 -91 -89 -56 -94 -94 -41 -98 -40 -56 -97 -94 -86 -99 -97 -97 -98 -98 -88 -98 -82 -90 -94 -82 -93 -97 -98 -99 -98 -98 -98 -98 -99 -94 -88 -98 -89 -98 -89 -88 -89 -98 -93 -98 -90 -92 -90 -93 -90 -98 -97 -98 -91 -98 -98 -98 -88 -98 -99 -98 -99 -98 -98 -94 -98 -94 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -94 -94 -99 -91 -92 -99 -98 -98 -98 -93 -98 -98 -88 -76 -98 -98 -98 -98 -99 -98 -98 -98 -98 -94 -94 -94 -98 -87 -98 -98 -89 -97 -98 -90 -98 -98 -97 -89 -98 -98 -84 -98 -88 -93 -82 -94 -90 -98 -99 -98 -97 -97 -90 -99 -98 -89 -95 -98 -98 -83 -90 -88 -91 -97 -98 -92 -92 -98 -88 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -90 -92 -98 -98 -98 -98 -98 -95 -91 -95 -96 -96 -95 -98 -92 -97 -98 -98 -84 -94 -82 -99 -98 -90 -40 -94 -40 -86 -98 -97 -99 -90 -88 -89 -88 -85 -90 -92 -98 -96 -92 -77 -92 -96 -97 -94 -95 -91 -95 -98 -91 -96 -95 -98 -98 -98 -94 -98 -98 -92 -98 -98 -98 -91 -86 -98 -98 -98 -95 -98 -98 -98 -98 -97 -98 -98 -95 -98 -98 -99 -98 -90 -98 -98 -98 -98 -89 -97 -97 -98 -92 -98 -98 -94 -98 -98 -98 -98 -97 -95 -89 -94 -98 -92 -92 -92 -98 -98 -98 -99 -98 -92 -92 -90 -86 -77 -88 -96 -83 -91 -92 -92 -91 -98 -98 -94 -98 -85 -86 -99 -84 -91 -93 -92 -96 -97 -94 -82 -98 -90 -93 -92 -88 -89 -96 -98 -96 -97 -97 -88 -89 -94 -95 -92 -89 -88 -95 -84 -91 -91 -90 -89 -92 -92 -98 -98 -92 -97 -98 -87 -75 -98 -98 -94 -94 -94 -82 -40 -41 -75 -98 -82 -81 -93 -98 -82 -83 -98 -97 -97 -91 -97 -92 -98 -97 -92 -92 -89 -98 -86 -99 -98 -97 -98 -93 -88 -89 -89 -94 -98 -98 -99 -92 -92 -77 -95 -89 -94 -98 -98 -98 -99 -90 -90 -90 -98 -98 -92 -96 -98 -98 -98 -98 -98 -98 -90 -92 -87 -98 -84 -98 -86 -88 -96 -83 -94 -93 -90 -82 -94 -84 -96 -97 -97 -88 -98 -99 -98 -98 -98 -98 -98 -98 -88 -98 -84 -99 -91 -90 -90 -98 -92 -97 -88 -91 -87 -90 -91 -98 -96 -94 -96 -96 -98 -84 -84 -85 -85 -84 -85 -85 -84 -93 -98 -97 -84 -98 -98 -89 -84 -98 -89 -94 -84 -85 -84 -84 -96 -93 -74 -84 -98 -94 -97 -77 -92 -95 -94 -91 -85 -99 -84 -95 -95 -41 -94 -51 -88 -90 -95 -98 -84 -86 -85 -96 -82 -96 -96 -96 -84 -87 -94 -98 -98 -86 -97 -83 -93 -98 -89 -81 -81 -97 -82 -72 -92 -90 -96 -91 -40 -90 -93 -51 -83 -83 -98 -96 -98 -98 -41 -41 -41 -51 -97 -97 -98 -98 -98 -90 -98 -98 -98 -98 -98 -96 -98 -98 -98 -99 -95 -98 -98 -98 -91 -95 -90 -98 -95 -98 -92 -97 -98 -99 -96 -77 -87 -87 -98 -89 -98 -88 -79 -85 -88 -88 -88 -85 -93 -88 -89 -93 -89 -89 -89 -96 -84 -83 -84 -85 -87 -88 -89 -89 -83 -83 -84 -82 -81 -81 -81 -85 -85 -86 -98 -94 -92 -87 -88 -78 -92 -78 -98 -84 -98 -98 -98 -97 -99 -98 -98 -99 -98 -88 -98 -98 -90 -86 -97 -86 -93 -98 -88 -98 -98 -98 -98 -99 -98 -96 -98 -85 -82 -82 -98 -92 -98 -93 -94 -93 -98 -84 -86 -88 -93 -77 -84 -85 -96 -89 -86 -92 -89 -95 -98 -94 -98 -98 -98 -98 -98 -76 -98 -93 -92 -93 -94 -94 -93 -94 -94 -94 -94 -92 -95 -94 -91 -94 -94 -92 -90 -92 -97 -93 -82 -82 -82 -82 -83 -83 -83 -83 -98 -41 -41 -84 -40 -95 -92 -82 -82 -81 -81 -81 -82 -81 -83 -81 -82 -83 -83 -85 -83 -83 -82 -83 -83 -82 -99 -82 -82 -81 -82 -82 -82 -47 -82 -98 -88 -96 -97 -82 -91 -97 -99 -92 -90 -98 -98 -98 -95 -92 -90 -98 -92 -91 -95 -95 -97 -96 -83 -87 -88 -85 -85 -84 -85 -84 -85 -84 -84 -85 -84 -84 -86 -85 -85 -85 -51 -98 -83 -99 -98 -97 -83 -94 -97 -99 -82 -82 -98 -98 -87 -98 -83 -98 -99 -98 -98 -96 -98 -93 -93 -93 -83 -98 -98 -98 -97 -98 -98 -98 -98 -98 -95 -98 -97 -98 -93 -98 -98 -98 -97 -99 -99 -96 -98 -92 -92 -98 -98 -98 -88 -99 -98 -89 -98 -98 -98 -98 -98 -99 -89 -98 -92 -98 -94 -92 -92 -92 -95 -94 -96 -95 -94 -94 -95 -98 -85 -98 -99 -89 -99 -98 -98 -99 -82 -98 -98 -98 -98 -98 -98 -98 -98 -89 -91 -84 -97 -91 -99 -83 -83 -83 -82 -80 -80 -82 -83 -83 -83 -83 -83 -50 -82 -82 -83 -82 -82 -82 -58 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -99 -98 -98 -98 -98 -98 -96 -99 -98 -98 -91 -98 -98 -98 -98 -92 -94 -97 -96 -87 -84 -84 -84 -85 -85 -85 -84 -84 -84 -85 -84 -94 -93 -94 -90 -94 -92 -98 -98 -98 -95 -98 -89 -98 -98 -98 -97 -76 -98 -98 -92 -98 -97 -97 -90 -89 -99 -99 -82 -85 -82 -98 -98 -91 -98 -98 -98 -98 -95 -99 -98 -98 -98 -99 -98 -99 -90 -98 -98 -94 -98 -97 -98 -98 -98 -98 -98 -94 -98 -94 -97 -93 -93 -96 -93 -99 -99 -99 -98 -98 -98 -98 -98 -98 -92 -92 -99 -98 -92 -92 -96 -89 -82 -82 -82 -82 -81 -78 -80 -95 -92 -83 -83 -97 -82 -87 -94 -84 -91 -91 -94 -93 -92 -90 -88 -92 -88 -94 -90 -95 -90 -93 -90 -95 -91 -91 -91 -82 -81 -82 -82 -82 -82 -91 -95 -90 -90 -82 -81 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -41 -94 -82 -82 -81 -82 -82 -82 -91 -81 -82 -82 -82 -82 -82 -78 -99 -89 -91 -96 -93 -98 -98 -95 -97 -95 -99 -98 -92 -97 -91 -98 -96 -93 -98 -92 -98 -98 -90 -98 -96 -98 -98 -98 -96 -97 -98 -89 -88 -90 -89 -89 -89 -89 -90 -88 -85 -98 -94 -94 -99 -95 -94 -98 -94 -97 -90 -91 -98 -91 -91 -96 -92 -91 -91 -98 -92 -98 -81 -92 -92 -81 -92 -90 -90 -96 -98 -98 -97 -99 -98 -92 -99 -98 -99 -98 -92 -96 -90 -90 -98 -97 -98 -98 -98 -97 -97 -98 -98 -96 -96 -98 -96 -88 -91 -98 -89 -98 -99 -98 -98 -99 -98 -98 -98 -91 -91 -95 -98 -99 -98 -98 -98 -97 -98 -98 -82 -90 -99 -98 -96 -98 -90 -98 -98 -84 -84 -98 -98 -98 -98 -98 -92 -98 -78 -98 -98 -94 -96 -94 -95 -94 -95 -98 -98 -98 -99 -94 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -73 -82 -81 -82 -82 -81 -82 -55 -86 -82 -82 -82 -81 -82 -82 -92 -82 -82 -82 -82 -82 -81 -86 -82 -82 -82 -82 -82 -61 -94 -92 -98 -98 -98 -96 -97 -98 -89 -88 -89 -89 -90 -99 -98 -96 -90 -78 -97 -94 -92 -98 -90 -98 -98 -98 -96 -98 -98 -91 -91 -92 -98 -98 -91 -88 -90 -91 -96 -82 -96 -88 -89 -98 -89 -99 -91 -98 -91 -98 -91 -91 -95 -99 -95 -95 -95 -91 -91 -98 -98 -92 -98 -98 -91 -97 -92 -98 -91 -98 -92 -91 -97 -92 -91 -91 -98 -91 -91 -99 -98 -98 -98 -99 -91 -98 -91 -98 -91 -99 -91 -93 -91 -91 -92 -90 -92 -90 -88 -94 -98 -98 -98 -98 -98 -98 -88 -88 -98 -98 -98 -98 -98 -98 -98 -93 -90 -84 -92 -84 -93 -93 -95 -92 -92 -92 -93 -92 -92 -89 -92 -92 -92 -94 -92 -90 -81 -82 -81 -82 -81 -82 -82 -80 -81 -81 -81 -82 -82 -48 -82 -82 -82 -82 -82 -82 -81 -79 -80 -80 -81 -81 -96 -82 -82 -82 -82 -82 -82 -98 -97 -94 -82 -82 -82 -81 -83 -82 -84 -82 -82 -82 -82 -81 -81 -98 -84 -82 -82 -83 -82 -82 -83 -83 -82 -82 -82 -83 -83 -58 -60 -97 -82 -82 -82 -82 -81 -82 -82 -82 -81 -81 -81 -81 -88 -80 -81 -81 -81 -81 -78 -90 -88 -89 -89 -99 -98 -98 -98 -98 -98 -92 -90 -82 -82 -82 -82 -82 -82 -82 -94 -82 -46 -92 -81 -82 -98 -88 -82 -82 -81 -82 -82 -82 -50 -93 -98 -98 -98 -97 -98 -98 -96 -98 -99 -98 -98 -98 -96 -98 -98 -98 -98 -96 -92 -98 -98 -94 -99 -98 -99 -98 -94 -95 -95 -91 -98 -91 -98 -99 -98 -98 -96 -98 -98 -90 -98 -98 -98 -98 -98 -91 -93 -98 -87 -91 -98 -98 -97 -91 -95 -99 -79 -77 -98 -92 -92 -92 -95 -92 -92 -93 -92 -93 -94 -92 -98 -98 -98 -99 -98 -99 -99 -92 -98 -93 -98 -95 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -81 -82 -71 -99 -94 -92 -98 -92 -99 -93 -95 -92 -98 -98 -92 -98 -98 -98 -97 -96 -98 -82 -82 -82 -82 -82 -82 -87 -83 -83 -83 -83 -83 -63 -82 -82 -82 -82 -82 -83 -94 -99 -98 -98 -98 -98 -90 -96 -96 -98 -99 -89 -96 -96 -87 -88 -89 -91 -92 -89 -88 -89 -82 -82 -81 -77 -82 -82 -70 -82 -83 -82 -83 -82 -82 -81 -97 -91 -98 -92 -99 -98 -99 -99 -98 -98 -92 -93 -82 -82 -89 -82 -98 -99 -98 -98 -98 -98 -98 -92 -98 -98 -98 -96 -91 -99 -87 -97 -96 -99 -98 -92 -98 -99 -95 -82 -96 -97 -88 -92 -98 -98 -98 -98 -98 -98 -98 -98 -92 -97 -98 -98 -78 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -93 -97 -96 -98 -90 -90 -98 -98 -98 -98 -89 -98 -98 -98 -97 -92 -92 -98 -98 -77 -94 -82 -82 -96 -98 -98 -98 -98 -96 -84 -84 -92 -91 -98 -98 -97 -97 -84 -99 -98 -98 -82 -76 -82 -82 -82 -82 -98 -83 -82 -83 -83 -83 -83 -91 -82 -82 -82 -82 -82 -82 -94 -95 -84 -99 -98 -98 -99 -96 -99 -99 -92 -96 -98 -98 -98 -92 -98 -99 -98 -94 -98 -98 -98 -98 -98 -84 -84 -81 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -81 -82 -94 -94 -99 -82 -82 -82 -82 -82 -82 -62 -82 -82 -82 -82 -82 -82 -98 -93 -82 -82 -82 -82 -82 -82 -82 -98 -98 -92 -91 -96 -98 -96 -96 -89 -99 -90 -96 -91 -91 -83 -83 -98 -97 -99 -98 -98 -98 -98 -98 -96 -98 -92 -97 -98 -98 -98 -92 -92 -92 -98 -92 -98 -98 -98 -99 -94 -98 -98 -99 -98 -99 -98 -99 -98 -92 -98 -98 -95 -95 -92 -90 -95 -87 -81 -82 -82 -82 -82 -83 -81 -82 -76 -82 -82 -81 -88 -82 -82 -82 -82 -82 -66 -92 -94 -92 -98 -96 -99 -98 -92 -96 -96 -92 -92 -84 -96 -98 -92 -98 -97 -94 -81 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -81 -82 -50 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -97 -96 -98 -95 -94 -95 -98 -98 -96 -98 -95 -98 -98 -99 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -92 -92 -98 -98 -98 -83 -82 -81 -82 -82 -81 -80 -88 -82 -82 -82 -82 -82 -82 -78 -82 -82 -83 -83 -83 -82 -82 -82 -82 -82 -83 -82 -94 -72 -98 -99 -82 -82 -82 -82 -82 -82 -95 -91 -98 -92 -89 -82 -98 -96 -98 -98 -98 -95 -98 -91 -95 -97 -90 -95 -95 -91 -96 -95 -91 -90 -97 -98 -93 -98 -98 -98 -97 -95 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -90 -90 -90 -90 -98 -99 -98 -98 -98 -98 -98 -98 -82 -82 -82 -82 -82 -82 -99 -96 -90 -90 -84 -98 -98 -97 -94 -94 -98 -99 -98 -78 -98 -91 -91 -91 -96 -88 -82 -82 -82 -82 -82 -63 -83 -83 -83 -83 -83 -82 -51 -98 -99 -82 -99 -98 -97 -96 -98 -98 -98 -99 -97 -98 -98 -98 -96 -95 -98 -98 -98 -91 -99 -98 -98 -98 -97 -98 -99 -99 -99 -98 -98 -98 -98 -95 -98 -98 -98 -99 -95 -99 -91 -98 -98 -98 -98 -98 -98 -98 -81 -82 -82 -80 -82 -83 -82 -83 -82 -82 -82 -83 -88 -98 -99 -93 -84 -97 -84 -96 -96 -98 -84 -84 -86 -95 -98 -85 -80 -80 -80 -80 -80 -76 -83 -79 -80 -82 -82 -80 -82 -86 -90 -82 -83 -82 -82 -82 -82 -41 -84 -93 -81 -94 -88 -82 -41 -82 -98 -98 -62 -82 -82 -82 -82 -81 -82 -82 -82 -82 -81 -82 -82 -87 -99 -98 -83 -83 -83 -82 -82 -82 -82 -82 -82 -82 -40 -82 -82 -82 -82 -82 -82 -46 -82 -81 -82 -82 -82 -82 -77 -82 -83 -82 -77 -82 -82 -80 -94 -93 -93 -93 -94 -94 -95 -95 -95 -95 -95 -94 -95 -94 -98 -99 -95 -62 -95 -97 -98 -98 -98 -98 -98 -98 -98 -99 -95 -92 -92 -99 -96 -97 -98 -99 -96 -98 -94 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -86 -82 -82 -82 -82 -83 -67 -98 -99 -98 -98 -94 -91 -98 -93 -98 -98 -96 -92 -92 -92 -92 -92 -97 -96 -92 -98 -92 -96 -98 -98 -84 -84 -98 -98 -81 -80 -81 -81 -77 -83 -98 -94 -94 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -92 -83 -83 -83 -83 -83 -83 -56 -98 -98 -82 -82 -94 -83 -83 -83 -82 -83 -85 -96 -82 -82 -82 -82 -82 -82 -98 -98 -98 -98 -98 -98 -98 -98 -90 -97 -92 -95 -96 -98 -98 -99 -96 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -91 -96 -97 -92 -98 -87 -82 -82 -82 -83 -82 -89 -82 -82 -82 -82 -82 -82 -70 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -76 -81 -88 -82 -81 -82 -82 -82 -79 -94 -77 -94 -95 -94 -94 -98 -98 -94 -98 -98 -98 -98 -94 -82 -92 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -97 -98 -98 -91 -91 -95 -99 -97 -98 -99 -98 -98 -98 -92 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -92 -95 -98 -99 -99 -82 -82 -82 -82 -81 -81 -85 -83 -82 -82 -82 -83 -93 -76 -83 -82 -82 -82 -82 -82 -57 -92 -70 -82 -82 -82 -82 -82 -82 -98 -98 -98 -98 -98 -98 -82 -94 -85 -82 -99 -82 -92 -98 -99 -98 -98 -98 -98 -98 -95 -97 -98 -98 -98 -99 -98 -98 -98 -98 -82 -82 -81 -78 -82 -82 -93 -82 -82 -82 -81 -82 -82 -91 -91 -96 -96 -91 -87 -82 -82 -82 -82 -82 -67 -82 -82 -82 -82 -82 -82 -67 -98 -92 -91 -98 -91 -98 -99 -82 -82 -82 -82 -82 -80 -82 -82 -82 -82 -82 -82 -98 -98 -80 -82 -82 -82 -82 -82 -47 -69 -79 -51 -94 -98 -98 -81 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -97 -98 -98 -98 -98 -98 -98 -44 -92 -92 -98 -91 -98 -98 -94 -98 -98 -98 -98 -66 -98 -98 -98 -98 -99 -98 -99 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -94 -98 -96 -98 -92 -98 -97 -98 -94 -98 -98 -98 -98 -90 -96 -98 -98 -81 -82 -82 -82 -98 -98 -98 -98 -98 -98 -98 -90 -96 -91 -81 -82 -82 -82 -81 -81 -83 -82 -82 -82 -82 -81 -96 -83 -83 -82 -82 -82 -83 -67 -91 -97 -98 -83 -82 -82 -82 -83 -82 -96 -98 -82 -82 -82 -82 -82 -83 -98 -81 -81 -82 -82 -81 -81 -82 -82 -82 -82 -82 -82 -63 -98 -97 -98 -96 -96 -90 -93 -98 -95 -98 -98 -98 -98 -98 -89 -96 -91 -83 -91 -97 -94 -98 -96 -76 -93 -92 -94 -94 -94 -95 -94 -94 -98 -98 -98 -98 -98 -98 -98 -82 -82 -82 -82 -82 -82 -96 -98 -99 -96 -82 -82 -82 -82 -82 -82 -98 -98 -98 -98 -93 -95 -99 -98 -94 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -99 -98 -40 -96 -99 -98 -97 -98 -92 -98 -99 -98 -98 -99 -98 -98 -97 -97 -81 -81 -81 -82 -81 -82 -64 -82 -82 -82 -82 -80 -81 -89 -71 -89 -83 -98 -98 -79 -96 -98 -89 -40 -40 -53 -40 -40 -41 -40 -91 -40 -40 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -55 -98 -56 -41 -41 -41 -41 -41 -82 -96 -98 -41 -41 -41 -41 -41 -41 -82 -98 -81 -81 -82 -81 -82 -82 -98 -82 -83 -82 -83 -83 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -83 -82 -98 -82 -82 -82 -82 -82 -82 -98 -98 -97 -94 -99 -94 -98 -99 -90 -96 -98 -98 -98 -99 -41 -41 -41 -41 -41 -41 -76 -82 -82 -82 -82 -82 -98 -98 -92 -93 -84 -96 -98 -93 -98 -98 -98 -99 -96 -98 -97 -90 -98 -98 -93 -99 -98 -98 -41 -41 -41 -41 -41 -41 -92 -92 -92 -98 -98 -98 -98 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -87 -92 -97 -98 -99 -95 -97 -89 -92 -83 -83 -95 -82 -82 -82 -82 -79 -85 -94 -82 -82 -82 -83 -82 -83 -54 -82 -82 -82 -82 -82 -82 -81 -81 -82 -81 -81 -80 -41 -84 -98 -88 -98 -88 -93 -88 -89 -88 -81 -89 -89 -85 -94 -94 -61 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -82 -41 -82 -41 -98 -41 -85 -41 -86 -99 -84 -41 -82 -72 -82 -41 -95 -88 -88 -99 -82 -83 -82 -82 -82 -82 -82 -57 -83 -82 -82 -82 -83 -82 -41 -98 -82 -82 -82 -82 -82 -82 -81 -82 -82 -80 -81 -82 -97 -82 -82 -80 -82 -82 -82 -98 -82 -97 -96 -82 -82 -80 -81 -82 -82 -98 -82 -81 -82 -81 -81 -82 -82 -82 -82 -82 -82 -82 -50 -80 -80 -81 -41 -92 -91 -92 -98 -92 -91 -92 -94 -96 -92 -92 -90 -92 -88 -92 -92 -92 -88 -88 -90 -91 -86 -85 -83 -93 -93 -92 -99 -89 -92 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -89 -97 -94 -98 -98 -98 -96 -94 -98 -96 -92 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -81 -80 -81 -81 -81 -80 -89 -83 -82 -83 -83 -82 -83 -57 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -61 -41 -92 -80 -91 -99 -92 -83 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -98 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -98 -82 -82 -82 -82 -82 -82 -41 -99 -81 -82 -81 -80 -81 -82 -41 -82 -41 -83 -80 -83 -81 -82 -82 -59 -90 -91 -41 -53 -91 -95 -96 -98 -41 -98 -98 -98 -99 -98 -98 -95 -95 -99 -94 -88 -47 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -96 -80 -98 -83 -83 -83 -83 -83 -83 -94 -83 -83 -82 -83 -82 -83 -84 -82 -83 -82 -82 -83 -82 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -97 -83 -82 -82 -82 -81 -82 -82 -80 -81 -83 -82 -81 -47 -98 -90 -83 -95 -88 -81 -96 -84 -85 -81 -80 -85 -51 -82 -99 -88 -92 -94 -94 -94 -85 -41 -43 -88 -97 -41 -41 -99 -82 -41 -98 -82 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -99 -98 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -81 -41 -96 -83 -41 -82 -97 -98 -93 -96 -92 -91 -91 -98 -82 -96 -41 -97 -82 -41 -41 -41 -41 -41 -41 -82 -82 -41 -41 -41 -41 -41 -41 -41 -92 -92 -86 -41 -41 -41 -41 -41 -41 -89 -94 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -95 -41 -41 -41 -41 -41 -41 -96 -96 -40 -40 -99 -98 -98 -40 -40 -83 -41 -41 -41 -41 -41 -41 -94 -80 -40 -40 -40 -96 -85 -96 -98 -93 -97 -90 -99 -98 -93 -98 -98 -98 -98 -99 -96 -90 -98 -99 -99 -98 -98 -93 -98 -98 -98 -98 -98 -98 -98 -92 -82 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -92 -98 -82 -82 -80 -82 -82 -82 -89 -83 -83 -83 -82 -83 -81 -82 -82 -82 -82 -82 -82 -77 -82 -82 -79 -82 -82 -80 -98 -83 -83 -83 -82 -82 -82 -96 -90 -94 -95 -80 -83 -82 -82 -80 -82 -87 -91 -82 -82 -83 -83 -83 -82 -82 -82 -83 -82 -82 -82 -69 -82 -82 -82 -82 -81 -82 -51 -82 -82 -82 -82 -80 -81 -82 -82 -81 -81 -81 -82 -88 -82 -81 -81 -82 -82 -82 -86 -81 -81 -82 -81 -83 -82 -99 -82 -82 -82 -80 -82 -82 -82 -82 -61 -94 -94 -98 -82 -83 -83 -80 -82 -83 -81 -83 -83 -82 -81 -82 -93 -98 -81 -82 -82 -80 -81 -81 -82 -98 -83 -82 -82 -82 -82 -83 -46 -80 -41 -86 -82 -82 -51 -41 -88 -40 -98 -91 -82 -82 -94 -81 -82 -82 -82 -82 -80 -74 -40 -82 -82 -82 -82 -83 -82 -95 -40 -92 -99 -40 -66 -57 -98 -41 -98 -40 -95 -40 -93 -98 -98 -88 -90 -89 -98 -97 -98 -89 -89 -90 -89 -90 -90 -89 -90 -98 -76 -85 -96 -90 -85 -94 -95 -86 -95 -84 -85 -98 -86 -83 -85 -90 -86 -93 -86 -98 -98 -98 -82 -85 -88 -88 -90 -95 -81 -81 -82 -82 -81 -81 -43 -81 -81 -82 -81 -81 -82 -99 -82 -82 -82 -82 -81 -82 -92 -82 -82 -82 -82 -82 -82 -98 -84 -83 -83 -83 -83 -83 -99 -98 -82 -82 -82 -82 -82 -82 -64 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -42 -82 -82 -82 -82 -82 -82 -47 -82 -82 -82 -82 -82 -82 -92 -94 -77 -82 -82 -82 -82 -82 -95 -95 -82 -81 -82 -82 -82 -82 -66 -98 -83 -83 -83 -83 -83 -83 -82 -98 -82 -82 -83 -82 -83 -82 -82 -82 -82 -83 -83 -83 -97 -83 -56 -94 -87 -88 -90 -87 -91 -98 -40 -98 -82 -82 -82 -82 -82 -66 -92 -83 -97 -83 -82 -83 -81 -82 -82 -86 -80 -80 -82 -82 -82 -82 -81 -95 -41 -41 -98 -40 -40 -97 -40 -40 -97 -55 -40 -40 -40 -98 -86 -96 -73 -80 -81 -81 -82 -81 -81 -85 -85 -81 -85 -84 -77 -94 -95 -98 -95 -99 -91 -90 -98 -98 -87 -98 -81 -81 -82 -83 -80 -82 -98 -98 -82 -82 -82 -82 -81 -82 -83 -86 -98 -94 -85 -94 -93 -98 -98 -92 -82 -98 -87 -82 -82 -82 -83 -82 -83 -96 -90 -82 -82 -83 -81 -82 -82 -91 -88 -82 -79 -82 -82 -80 -82 -40 -40 -98 -40 -40 -89 -98 -89 -82 -82 -82 -81 -82 -82 -97 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -81 -98 -82 -82 -82 -82 -82 -82 -82 -76 -82 -82 -82 -82 -51 -94 -99 -80 -82 -82 -82 -82 -82 -41 -98 -98 -82 -83 -82 -83 -83 -83 -82 -92 -98 -82 -82 -82 -82 -82 -82 -66 -98 -98 -98 -91 -98 -99 -93 -98 -95 -99 -98 -98 -97 -98 -99 -98 -98 -82 -82 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -98 -98 -79 -80 -81 -82 -82 -81 -98 -82 -82 -82 -82 -81 -82 -86 -98 -97 -82 -81 -82 -82 -82 -82 -97 -82 -82 -80 -80 -80 -81 -96 -89 -82 -82 -81 -81 -80 -76 -81 -82 -81 -82 -82 -82 -51 -94 -94 -98 -82 -82 -82 -82 -81 -82 -97 -82 -82 -82 -86 -95 -82 -82 -82 -81 -85 -93 -96 -97 -97 -98 -85 -98 -98 -98 -86 -86 -98 -99 -82 -82 -41 -82 -82 -82 -82 -82 -98 -81 -83 -83 -82 -84 -40 -40 -98 -82 -82 -81 -83 -83 -83 -81 -82 -81 -82 -82 -82 -40 -40 -82 -76 -81 -82 -81 -82 -82 -82 -82 -82 -82 -41 -40 -90 -81 -81 -81 -80 -81 -80 -82 -82 -81 -82 -81 -80 -98 -86 -82 -96 -82 -82 -79 -82 -82 -82 -81 -82 -82 -81 -80 -81 -53 -82 -83 -81 -80 -82 -83 -82 -82 -83 -83 -82 -83 -91 -81 -82 -82 -82 -82 -82 -81 -82 -82 -83 -82 -81 -88 -83 -80 -81 -82 -82 -82 -82 -80 -81 -83 -82 -70 -98 -81 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -40 -40 -40 -82 -81 -82 -77 -82 -82 -82 -82 -82 -82 -83 -82 -83 -40 -40 -95 -40 -40 -98 -83 -85 -74 -82 -81 -83 -83 -82 -82 -81 -82 -82 -82 -82 -74 -82 -65 -40 -40 -40 -40 -40 -98 -87 -92 -82 -82 -82 -83 -79 -81 -83 -83 -82 -81 -83 -85 -82 -83 -81 -82 -81 -81 -82 -82 -82 -81 -81 -83 -40 -40 -40 -82 -82 -81 -82 -82 -81 -81 -80 -80 -82 -82 -82 -83 -40 -98 -55 -80 -82 -82 -82 -82 -81 -82 -80 -82 -80 -81 -82 -83 -82 -81 -82 -77 -82 -82 -82 -82 -82 -81 -81 -82 -85 -68 -83 -83 -82 -83 -83 -82 -81 -81 -82 -83 -81 -82 -41 -94 -82 -86 -81 -83 -82 -83 -82 -82 -82 -82 -82 -82 -81 -82 -41 -82 -80 -83 -82 -81 -82 -82 -82 -82 -82 -82 -83 -87 -82 -80 -83 -82 -83 -82 -82 -82 -82 -82 -82 -82 -56 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -42 -82 -92 -82 -81 -82 -82 -82 -96 -97 -83 -84 -84 -84 -84 -84 -84 -84 -40 -40 -40 -40 -51 -40 -40 -98 -98 -40 -40 -98 -98 -98 -98 -99 -98 -98 -84 -92 -96 -95 -98 -98 -97 -83 -93 -92 -99 -98 -98 -98 -99 -94 -99 -98 -98 -91 -82 -98 -99 -99 -90 -99 -95 -90 -98 -88 -93 -95 -82 -82 -81 -82 -89 -82 -82 -82 -82 -56 -79 -82 -82 -82 -83 -82 -82 -82 -83 -83 -83 -82 -51 -40 -41 -82 -81 -81 -81 -82 -82 -81 -81 -80 -81 -81 -80 -89 -40 -40 -82 -80 -80 -81 -82 -82 -81 -82 -82 -82 -77 -80 -86 -45 -90 -82 -82 -83 -82 -81 -81 -81 -82 -82 -82 -83 -82 -98 -82 -82 -81 -80 -83 -80 -82 -82 -83 -80 -82 -83 -92 -98 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -80 -95 -82 -82 -80 -83 -82 -83 -82 -81 -82 -82 -83 -82 -41 -82 -80 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -41 -82 -81 -82 -81 -82 -82 -82 -81 -82 -82 -82 -82 -94 -94 -98 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -81 -81 -41 -98 -82 -98 -82 -82 -82 -82 -82 -82 -81 -82 -82 -81 -82 -82 -92 -87 -82 -82 -82 -82 -82 -82 -83 -82 -82 -83 -82 -71 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -95 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -90 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -83 -78 -82 -85 -81 -82 -81 -82 -81 -82 -80 -82 -82 -81 -82 -85 -93 -86 -82 -82 -81 -82 -82 -80 -82 -80 -82 -81 -81 -98 -92 -90 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -85 -90 -82 -89 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -40 -40 -83 -40 -40 -90 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -86 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -70 -88 -88 -88 -89 -85 -81 -82 -76 -82 -81 -81 -82 -82 -79 -82 -81 -87 -40 -40 -88 -88 -40 -40 -90 -40 -40 -62 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -56 -82 -93 -58 -88 -95 -90 -92 -96 -82 -98 -82 -82 -82 -82 -82 -82 -79 -82 -82 -82 -80 -82 -43 -82 -81 -82 -82 -80 -80 -80 -82 -82 -80 -82 -81 -97 -82 -80 -80 -82 -81 -81 -81 -82 -82 -82 -82 -82 -90 -90 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -81 -82 -81 -91 -82 -82 -76 -82 -82 -82 -82 -82 -81 -82 -82 -82 -74 -96 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -95 -94 -94 -94 -95 -68 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -71 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -97 -96 -94 -82 -82 -82 -82 -82 -82 -81 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -63 -98 -85 -78 -82 -82 -82 -82 -79 -81 -82 -41 -40 -40 -89 -64 -81 -96 -41 -41 -91 -88 -82 -82 -82 -82 -64 -41 -40 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -94 -94 -41 -91 -98 -90 -86 -53 -40 -40 -99 -40 -40 -88 -90 -82 -82 -82 -81 -82 -82 -82 -82 -81 -82 -82 -82 -41 -40 -40 -86 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -75 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -80 -82 -82 -82 -98 -98 -98 -83 -82 -79 -82 -82 -80 -81 -82 -82 -82 -80 -82 -82 -82 -82 -84 -97 -91 -81 -82 -82 -82 -82 -82 -82 -82 -80 -82 -82 -81 -50 -81 -82 -81 -82 -82 -81 -81 -82 -82 -82 -81 -82 -98 -82 -82 -80 -82 -82 -82 -82 -82 -83 -82 -82 -81 -46 -82 -82 -82 -82 -82 -82 -82 -79 -82 -82 -81 -80 -81 -89 -81 -80 -80 -81 -82 -76 -81 -82 -82 -82 -82 -81 -83 -89 -94 -93 -94 -94 -85 -67 -82 -82 -82 -82 -82 -82 -80 -81 -82 -82 -82 -83 -94 -82 -93 -98 -82 -82 -52 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -79 -82 -82 -82 -82 -82 -81 -82 -94 -83 -97 -98 -83 -83 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -92 -82 -82 -82 -83 -91 -99 -85 -80 -82 -82 -82 -82 -82 -80 -82 -82 -82 -82 -82 -82 -98 -82 -82 -76 -82 -82 -82 -83 -83 -82 -82 -83 -82 -82 -82 -41 -94 -82 -82 -98 -82 -82 -80 -82 -82 -82 -82 -80 -81 -82 -82 -82 -83 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -40 -40 -98 -81 -82 -82 -80 -80 -82 -82 -83 -83 -83 -82 -82 -40 -40 -78 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -55 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -83 -81 -81 -81 -81 -81 -81 -81 -80 -81 -79 -80 -82 -68 -94 -88 -82 -82 -83 -83 -83 -82 -82 -82 -82 -82 -83 -83 -94 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -98 -91 -98 -82 -82 -82 -81 -81 -81 -82 -82 -81 -82 -80 -81 -99 -81 -82 -82 -83 -82 -82 -82 -82 -82 -83 -83 -83 -45 -82 -82 -82 -82 -82 -82 -82 -83 -83 -83 -83 -83 -86 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -72 -61 -97 -98 -87 -89 -98 -98 -97 -98 -99 -94 -98 -92 -94 -76 -92 -92 -99 -94 -94 -94 -94 -98 -98 -98 -95 -98 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -89 -97 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -89 -88 -91 -95 -92 -82 -81 -96 -93 -82 -82 -82 -82 -82 -86 -82 -82 -82 -82 -82 -82 -82 -82 -80 -82 -81 -69 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -91 -82 -82 -83 -82 -83 -82 -82 -82 -81 -82 -82 -81 -84 -82 -76 -82 -82 -82 -82 -82 -81 -82 -82 -82 -73 -92 -94 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -93 -98 -85 -86 -97 -99 -96 -82 -82 -82 -82 -79 -82 -80 -82 -82 -82 -82 -82 -42 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -83 -82 -82 -82 -80 -80 -83 -82 -82 -82 -82 -82 -61 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -94 -84 -82 -82 -80 -81 -80 -81 -81 -82 -82 -82 -81 -81 -41 -83 -81 -83 -82 -81 -82 -81 -82 -80 -82 -81 -80 -81 -88 -89 -82 -82 -81 -82 -81 -81 -81 -82 -82 -82 -82 -82 -90 -93 -86 -86 -86 -49 -83 -85 -98 -81 -90 -98 -99 -81 -99 -90 -99 -94 -98 -99 -88 -90 -98 -91 -96 -99 -85 -85 -83 -86 -98 -90 -86 -89 -82 -90 -90 -84 -84 -84 -89 -85 -98 -98 -89 -98 -90 -93 -98 -94 -86 -85 -98 -41 -82 -82 -82 -80 -83 -80 -82 -80 -82 -82 -81 -82 -86 -85 -82 -98 -82 -86 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -80 -81 -89 -82 -80 -82 -81 -80 -82 -81 -81 -80 -81 -82 -82 -81 -98 -94 -90 -82 -81 -82 -82 -81 -82 -82 -82 -82 -83 -82 -82 -82 -98 -93 -81 -91 -86 -85 -81 -85 -98 -98 -41 -82 -81 -82 -82 -82 -82 -82 -82 -82 -81 -82 -83 -94 -81 -82 -82 -82 -76 -82 -82 -82 -82 -82 -82 -82 -87 -82 -82 -82 -82 -81 -82 -82 -82 -82 -81 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -89 -94 -94 -94 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -95 -94 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -90 -82 -82 -82 -82 -82 -81 -82 -82 -81 -82 -82 -79 -88 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -93 -94 -92 -94 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -92 -82 -92 -84 -93 -82 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -68 -82 -82 -82 -82 -82 -82 -81 -81 -82 -82 -82 -82 -82 -82 -82 -76 -82 -82 -82 -82 -82 -82 -82 -82 -41 -94 -97 -93 -98 -95 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -91 -82 -97 -95 -98 -97 -98 -98 -98 -98 -92 -97 -91 -98 -90 -98 -98 -98 -90 -98 -98 -84 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -84 -99 -95 -98 -83 -82 -82 -83 -82 -82 -83 -83 -82 -82 -82 -82 -48 -82 -82 -82 -82 -82 -82 -82 -82 -82 -79 -83 -82 -70 -81 -94 -85 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -85 -94 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -95 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -76 -73 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -94 -87 -82 -82 -81 -82 -82 -82 -82 -83 -82 -82 -82 -76 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -51 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -97 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -41 -96 -91 -98 -98 -98 -99 -99 -98 -99 -98 -98 -98 -98 -97 -99 -99 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -94 -94 -95 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -57 -97 -84 -92 -84 -85 -85 -88 -98 -98 -98 -92 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -42 -66 -98 -98 -98 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -95 -98 -97 -85 -82 -82 -81 -82 -81 -82 -82 -82 -82 -83 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -52 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -94 -82 -82 -81 -81 -82 -82 -82 -82 -82 -82 -82 -82 -68 -82 -83 -82 -82 -82 -81 -82 -82 -76 -82 -82 -82 -91 -93 -82 -81 -81 -82 -81 -81 -82 -82 -82 -81 -81 -82 -96 -98 -67 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -93 -98 -82 -82 -82 -82 -82 -80 -82 -82 -82 -82 -81 -82 -96 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -84 -92 -81 -82 -82 -82 -82 -82 -81 -82 -81 -82 -82 -83 -94 -99 -92 -98 -82 -81 -82 -82 -82 -80 -82 -82 -82 -82 -82 -82 -87 -88 -89 -82 -80 -82 -81 -81 -81 -80 -79 -80 -82 -82 -82 -92 -98 -82 -82 -83 -83 -83 -83 -82 -82 -83 -82 -80 -83 -62 -41 -82 -98 -83 -84 -87 -92 -88 -78 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -67 -92 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -64 -82 -82 -82 -82 -81 -82 -82 -81 -82 -82 -82 -81 -90 -94 -94 -76 -93 -94 -94 -93 -94 -94 -94 -90 -90 -91 -96 -90 -94 -99 -98 -97 -98 -84 -83 -82 -82 -83 -82 -82 -82 -82 -76 -83 -82 -82 -82 -91 -91 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -63 -94 -94 -92 -92 -94 -94 -82 -92 -99 -82 -82 -82 -82 -82 -82 -92 -98 -82 -82 -78 -94 -91 -94 -76 -92 -98 -94 -94 -94 -82 -82 -98 -98 -94 -95 -83 -93 -82 -84 -98 -82 -82 -82 -82 -83 -82 -82 -80 -83 -83 -82 -81 -84 -85 -84 -84 -83 -81 -80 -79 -79 -79 -79 -79 -79 -79 -81 -79 -80 -91 -87 -83 -84 -83 -84 -85 -41 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -96 -95 -98 -91 -98 -82 -83 -98 -90 -85 -95 -98 -82 -82 -82 -82 -82 -81 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -48 -88 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -99 -82 -82 -82 -82 -81 -80 -82 -82 -82 -82 -82 -82 -99 -90 -81 -81 -81 -81 -81 -81 -82 -82 -82 -82 -82 -81 -96 -94 -94 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -94 -94 -94 -86 -98 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -71 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -97 -93 -94 -97 -94 -82 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -41 -81 -81 -81 -80 -81 -76 -82 -82 -82 -82 -82 -82 -94 -94 -94 -98 -98 -82 -83 -83 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -97 -98 -97 -92 -88 -98 -98 -91 -82 -83 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -45 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -98 -98 -83 -82 -82 -82 -82 -83 -80 -81 -82 -82 -82 -82 -41 -82 -82 -77 -82 -83 -82 -82 -82 -82 -82 -82 -82 -94 -74 -94 -94 -95 -98 -98 -98 -98 -99 -98 -98 -82 -99 -98 -98 -96 -92 -82 -82 -83 -82 -83 -83 -83 -83 -83 -83 -82 -83 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -89 -97 -98 -99 -98 -99 -98 -99 -91 -98 -48 -50 -96 -95 -95 -98 -98 -99 -98 -99 -98 -98 -98 -98 -99 -98 -98 -98 -91 -98 -98 -98 -98 -98 -98 -98 -96 -85 -85 -85 -84 -88 -92 -85 -86 -85 -78 -98 -93 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -82 -98 -97 -98 -90 -98 -99 -98 -98 -98 -97 -98 -99 -89 -98 -89 -93 -93 -90 -98 -98 -97 -98 -97 -98 -98 -98 -96 -97 -93 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -97 -98 -99 -98 -98 -99 -99 -98 -85 -98 -95 -98 -98 -98 -99 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -89 -98 -81 -94 -99 -98 -98 -97 -98 -98 -98 -98 -98 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -80 -81 -82 -82 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -88 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -81 -76 -82 -82 -82 -80 -82 -82 -82 -81 -81 -80 -80 -81 -41 -81 -82 -81 -82 -80 -77 -81 -81 -82 -82 -82 -82 -99 -82 -82 -82 -82 -81 -82 -82 -81 -82 -82 -81 -82 -94 -86 -68 -96 -87 -91 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -56 -99 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -96 -96 -93 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -80 -81 -82 -82 -82 -81 -42 -81 -82 -81 -77 -82 -81 -82 -82 -82 -82 -82 -82 -41 -98 -81 -81 -82 -81 -81 -81 -82 -82 -82 -82 -82 -82 -84 -98 -97 -93 -95 -92 -97 -98 -98 -91 -98 -98 -98 -95 -96 -94 -93 -81 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -81 -82 -82 -81 -82 -82 -82 -82 -82 -82 -81 -54 -98 -90 -99 -97 -98 -98 -98 -98 -99 -98 -98 -98 -98 -82 -81 -81 -82 -81 -82 -82 -82 -82 -81 -81 -81 -87 -81 -80 -79 -82 -82 -81 -82 -77 -82 -81 -82 -81 -94 -90 -93 -81 -81 -81 -82 -82 -81 -81 -81 -81 -80 -81 -81 -99 -98 -80 -80 -81 -82 -80 -81 -81 -82 -81 -81 -81 -81 -41 -81 -88 -88 -85 -81 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -49 -81 -80 -82 -82 -82 -81 -81 -82 -81 -82 -82 -82 -98 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -74 -79 -81 -82 -80 -80 -81 -81 -81 -79 -77 -81 -81 -95 -91 -92 -92 -81 -80 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -85 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -85 -95 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -96 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -77 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -52 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -95 -82 -82 -81 -80 -81 -81 -81 -81 -82 -81 -81 -82 -80 -81 -81 -80 -81 -81 -81 -81 -81 -81 -82 -82 -98 -92 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -99 -82 -82 -82 -80 -81 -82 -82 -82 -82 -81 -81 -81 -78 -90 -93 -91 -91 -91 -85 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -86 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -92 -92 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -85 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -98 -82 -82 -83 -82 -82 -82 -83 -82 -83 -82 -82 -82 -83 -84 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -81 -65 -82 -82 -82 -82 -82 -81 -81 -81 -81 -81 -81 -82 -48 -82 -77 -82 -81 -82 -82 -81 -82 -82 -81 -81 -81 -57 -91 -98 -94 -98 -81 -82 -82 -81 -81 -81 -81 -82 -81 -82 -81 -82 -82 -82 -96 -95 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -82 -82 -81 -81 -81 -82 -81 -81 -82 -82 -82 -99 -83 -83 -82 -83 -82 -82 -82 -82 -82 -83 -83 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -73 -94 -81 -81 -81 -81 -80 -80 -81 -81 -81 -81 -81 -81 -99 -77 -93 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -91 -91 -91 -91 -92 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -94 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -96 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -57 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -86 -82 -81 -82 -81 -82 -82 -82 -81 -82 -82 -82 -65 -82 -81 -82 -82 -82 -82 -82 -81 -82 -81 -81 -82 -87 -82 -76 -82 -82 -81 -82 -82 -82 -81 -82 -82 -80 -99 -98 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -81 -92 -82 -82 -82 -82 -82 -81 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -81 -82 -81 -81 -82 -81 -82 -82 -82 -41 -81 -81 -82 -82 -81 -81 -81 -81 -81 -82 -81 -82 -86 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -51 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -96 -91 -91 -91 -97 -77 -97 -91 -91 -91 -91 -91 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -98 -82 -82 -82 -80 -83 -82 -82 -81 -82 -82 -82 -82 -82 -99 -98 -95 -99 -95 -98 -98 -93 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -80 -82 -96 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -92 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -79 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -85 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -84 -99 -98 -82 -82 -82 -82 -82 -81 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -99 -95 -80 -82 -82 -82 -82 -82 -82 -82 -82 -77 -82 -82 -98 -91 -91 -81 -82 -82 -82 -82 -81 -82 -81 -81 -81 -82 -82 -82 -81 -82 -82 -81 -82 -82 -82 -81 -82 -81 -82 -82 -56 -81 -90 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -96 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -82 -82 -81 -82 -81 -82 -82 -82 -82 -81 -82 -81 -52 -81 -82 -82 -81 -81 -82 -81 -82 -81 -82 -82 -82 -96 -99 -94 -91 -82 -81 -81 -81 -81 -81 -82 -81 -82 -82 -76 -81 -87 -81 -81 -81 -81 -82 -82 -82 -82 -82 -82 -82 -82 -91 -91 -81 -81 -81 -81 -80 -80 -81 -81 -81 -81 -81 -81 -86 -91 -82 -97 -82 -95 -96 -89 -97 -81 -82 -81 -81 -81 -82 -81 -82 -82 -82 -82 -82 -91 -82 -82 -82 -81 -81 -82 -82 -82 -81 -82 -81 -81 -73 -96 -96 -81 -81 -82 -82 -82 -82 -82 -82 -81 -82 -81 -82 -99 -99 -98 -90 -98 -98 -98 -99 -98 -96 -98 -84 -84 -98 -98 -98 -98 -91 -94 -97 -78 -94 -95 -87 -88 -80 -82 -81 -81 -82 -82 -82 -82 -82 -81 -81 -84 -82 -82 -82 -82 -82 -82 -80 -80 -82 -82 -80 -81 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -88 -80 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -89 -91 -99 -98 -41 -82 -79 -81 -81 -81 -79 -82 -81 -76 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -49 -81 -82 -82 -82 -80 -80 -81 -81 -81 -81 -82 -82 -82 -78 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -43 -82 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -92 -81 -98 -85 -86 -81 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -71 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -40 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -40 -98 -81 -81 -81 -81 -81 -81 -81 -81 -82 -82 -81 -82 -91 -81 -82 -81 -82 -82 -82 -82 -81 -80 -81 -82 -81 -41 -41 -81 -82 -82 -77 -82 -81 -81 -81 -82 -82 -82 -82 -88 -95 -99 -97 -98 -98 -98 -90 -98 -99 -93 -98 -98 -90 -90 -94 -98 -98 -98 -90 -98 -96 -99 -98 -90 -91 -99 -98 -98 -97 -99 -98 -92 -98 -98 -98 -98 -98 -98 -99 -99 -83 -98 -98 -98 -96 -98 -81 -81 -82 -82 -81 -82 -81 -81 -81 -81 -81 -81 -92 -82 -80 -80 -82 -81 -82 -76 -82 -82 -82 -82 -82 -81 -82 -81 -82 -81 -82 -81 -81 -81 -82 -81 -82 -81 -91 -81 -82 -81 -81 -82 -82 -82 -82 -82 -82 -82 -81 -98 -94 -99 -95 -98 -98 -88 -98 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -86 -82 -81 -82 -81 -81 -82 -82 -82 -82 -82 -82 -86 -81 -81 -80 -81 -81 -81 -81 -81 -82 -81 -81 -81 -97 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -92 -91 -82 -82 -82 -77 -82 -82 -82 -82 -82 -82 -82 -82 -91 -91 -82 -81 -82 -82 -82 -81 -82 -81 -82 -82 -81 -81 -92 -87 -81 -96 -96 -96 -96 -98 -81 -82 -82 -81 -82 -81 -81 -81 -81 -81 -82 -81 -97 -89 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -95 -81 -81 -81 -81 -81 -82 -81 -81 -81 -82 -81 -81 -82 -82 -82 -81 -82 -82 -81 -82 -82 -81 -81 -81 -41 -81 -81 -81 -81 -82 -77 -81 -82 -81 -82 -82 -82 -90 -91 -90 -91 -91 -91 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -94 -90 -83 -82 -88 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -54 -89 -98 -82 -81 -82 -82 -81 -82 -81 -82 -82 -82 -82 -82 -41 -82 -82 -82 -80 -80 -82 -82 -82 -82 -82 -82 -82 -77 -92 -94 -91 -94 -94 -98 -99 -99 -91 -91 -98 -98 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -83 -98 -98 -98 -97 -91 -98 -98 -98 -96 -91 -85 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -77 -84 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -67 -98 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -79 -81 -81 -80 -80 -82 -82 -41 -81 -82 -81 -82 -81 -82 -82 -82 -81 -81 -82 -82 -91 -91 -91 -98 -92 -81 -91 -93 -94 -95 -82 -97 -96 -92 -81 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -81 -89 -82 -82 -82 -81 -82 -82 -81 -81 -81 -82 -81 -81 -81 -91 -98 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -41 -73 -82 -82 -82 -82 -82 -81 -81 -81 -82 -82 -82 -82 -41 -91 -82 -82 -82 -82 -82 -82 -81 -82 -81 -82 -82 -82 -99 -90 -90 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -52 -86 -88 -95 -98 -91 -91 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -99 -84 -95 -90 -84 -98 -90 -98 -99 -99 -84 -82 -80 -82 -82 -82 -82 -81 -81 -82 -81 -82 -92 -91 -95 -98 -80 -81 -82 -80 -82 -80 -81 -83 -82 -77 -82 -80 -91 -89 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -91 -82 -81 -82 -79 -81 -80 -82 -82 -82 -82 -82 -81 -43 -82 -97 -91 -82 -98 -96 -98 -98 -98 -94 -90 -96 -96 -98 -97 -98 -98 -97 -98 -98 -99 -98 -93 -96 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -82 -82 -82 -82 -81 -81 -81 -81 -81 -81 -51 -96 -97 -82 -82 -82 -79 -76 -79 -81 -79 -80 -81 -80 -83 -91 -74 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -95 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -89 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -76 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -93 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -91 -96 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -90 -81 -81 -82 -81 -82 -82 -82 -82 -76 -82 -82 -81 -47 -67 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -82 -81 -81 -92 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -75 -98 -97 -95 -92 -58 -73 -88 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -98 -98 -99 -98 -98 -82 -82 -82 -82 -82 -82 -81 -82 -81 -81 -81 -82 -41 -82 -82 -81 -82 -81 -81 -82 -81 -82 -81 -82 -82 -96 -87 -91 -92 -88 -91 -93 -93 -96 -94 -93 -93 -91 -95 -94 -98 -99 -98 -97 -99 -98 -98 -91 -98 -98 -98 -99 -98 -98 -92 -89 -98 -86 -98 -98 -96 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -94 -92 -91 -90 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -91 -91 -91 -97 -79 -97 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -81 -81 -82 -81 -81 -82 -81 -81 -81 -81 -81 -82 -71 -81 -81 -82 -81 -80 -81 -80 -82 -82 -81 -82 -82 -82 -81 -41 -82 -82 -97 -98 -82 -82 -82 -82 -82 -82 -81 -82 -82 -81 -82 -82 -41 -87 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -73 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -81 -98 -82 -82 -82 -82 -82 -82 -81 -81 -82 -82 -82 -82 -82 -82 -82 -76 -82 -82 -82 -82 -81 -82 -81 -82 -41 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -93 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -99 -98 -96 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -97 -98 -99 -96 -92 -98 -96 -98 -90 -99 -98 -98 -91 -98 -98 -97 -98 -84 -83 -84 -89 -88 -88 -95 -82 -82 -76 -81 -82 -81 -50 -92 -91 -94 -91 -96 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -86 -66 -98 -84 -82 -82 -82 -82 -82 -82 -75 -98 -98 -98 -95 -98 -98 -98 -89 -81 -82 -82 -82 -82 -82 -98 -80 -82 -82 -82 -82 -82 -97 -98 -99 -98 -84 -81 -81 -81 -79 -81 -95 -77 -82 -82 -82 -82 -82 -63 -91 -99 -98 -98 -99 -98 -82 -82 -82 -81 -82 -82 -77 -82 -81 -82 -82 -82 -81 -98 -98 -98 -98 -82 -82 -82 -82 -77 -82 -73 -97 -87 -82 -82 -82 -82 -82 -61 -98 -91 -98 -92 -92 -92 -92 -96 -96 -94 -99 -81 -98 -82 -82 -82 -82 -82 -82 -97 -82 -82 -82 -82 -82 -82 -54 -98 -98 -94 -98 -98 -99 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -96 -98 -99 -96 -96 -90 -90 -98 -98 -98 -91 -98 -98 -99 -99 -98 -96 -92 -99 -99 -99 -98 -98 -98 -99 -91 -91 -89 -98 -98 -98 -99 -98 -97 -96 -97 -84 -85 -83 -80 -80 -80 -79 -82 -86 -86 -81 -81 -81 -81 -81 -81 -81 -81 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -46 -78 -98 -81 -83 -91 -82 -98 -98 -96 -95 -90 -81 -81 -81 -81 -81 -81 -96 -90 -98 -90 -94 -93 -88 -81 -82 -81 -81 -82 -73 -82 -81 -82 -82 -82 -82 -52 -99 -99 -98 -98 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -98 -98 -98 -99 -98 -81 -82 -82 -82 -82 -82 -43 -82 -82 -81 -82 -82 -96 -82 -82 -83 -82 -82 -76 -96 -98 -91 -98 -98 -98 -99 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -98 -96 -93 -98 -91 -91 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -95 -95 -94 -98 -98 -98 -96 -98 -98 -92 -92 -91 -96 -92 -92 -99 -91 -98 -98 -99 -90 -97 -98 -98 -98 -98 -97 -98 -84 -80 -81 -81 -81 -80 -82 -98 -99 -81 -81 -81 -81 -81 -81 -85 -99 -82 -81 -81 -82 -81 -82 -98 -82 -82 -82 -82 -82 -82 -98 -42 -85 -86 -95 -98 -98 -82 -82 -82 -81 -82 -82 -82 -81 -81 -82 -82 -81 -91 -91 -98 -99 -98 -82 -81 -82 -81 -82 -82 -98 -98 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -81 -81 -99 -98 -98 -98 -97 -98 -81 -82 -80 -82 -81 -82 -84 -80 -80 -81 -80 -81 -78 -84 -98 -98 -98 -98 -92 -98 -88 -89 -89 -84 -95 -98 -85 -85 -76 -97 -95 -97 -90 -85 -98 -98 -98 -91 -98 -98 -89 -99 -88 -98 -98 -92 -99 -90 -98 -98 -83 -98 -92 -82 -45 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -80 -82 -82 -80 -82 -82 -82 -82 -83 -82 -79 -94 -81 -81 -81 -81 -82 -83 -98 -97 -96 -91 -91 -97 -98 -99 -98 -96 -98 -86 -89 -96 -90 -98 -98 -98 -98 -98 -98 -83 -93 -83 -88 -91 -82 -91 -55 -91 -81 -80 -80 -81 -81 -80 -42 -40 -83 -80 -80 -81 -81 -82 -68 -40 -40 -82 -82 -82 -82 -82 -82 -98 -40 -57 -96 -94 -98 -98 -82 -81 -82 -82 -82 -82 -82 -98 -82 -98 -90 -86 -99 -84 -82 -82 -82 -82 -82 -55 -82 -82 -82 -82 -82 -82 -88 -82 -82 -82 -82 -82 -82 -58 -81 -81 -80 -81 -82 -80 -98 -81 -81 -81 -81 -81 -81 -98 -91 -97 -94 -98 -94 -98 -88 -98 -97 -97 -94 -91 -91 -94 -82 -98 -99 -97 -98 -98 -93 -89 -98 -98 -98 -97 -98 -90 -98 -78 -92 -92 -92 -94 -94 -81 -98 -98 -98 -82 -81 -81 -81 -80 -81 -81 -82 -81 -82 -82 -81 -96 -92 -82 -83 -82 -82 -82 -82 -82 -63 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -98 -82 -97 -97 -91 -91 -81 -81 -81 -81 -81 -81 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -94 -96 -81 -97 -91 -91 -92 -94 -94 -94 -84 -81 -81 -81 -82 -79 -79 -91 -82 -81 -80 -80 -80 -82 -93 -88 -98 -94 -82 -82 -82 -82 -82 -81 -67 -81 -82 -82 -82 -82 -82 -88 -92 -82 -82 -98 -84 -97 -87 -88 -96 -89 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -74 -82 -82 -82 -82 -82 -82 -98 -82 -82 -79 -82 -82 -82 -83 -83 -82 -82 -82 -82 -50 -82 -82 -82 -82 -82 -82 -84 -40 -81 -81 -81 -82 -81 -82 -41 -88 -82 -81 -80 -81 -81 -81 -81 -41 -98 -98 -97 -97 -68 -81 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -97 -82 -81 -81 -81 -82 -81 -91 -82 -82 -82 -82 -82 -83 -96 -82 -82 -81 -82 -82 -82 -95 -82 -82 -82 -81 -82 -78 -98 -82 -82 -82 -81 -81 -82 -86 -82 -82 -82 -82 -82 -82 -94 -81 -81 -81 -82 -82 -81 -98 -82 -82 -80 -82 -82 -82 -80 -80 -80 -80 -79 -80 -85 -84 -84 -84 -84 -84 -85 -83 -77 -84 -84 -91 -94 -84 -84 -85 -84 -84 -84 -81 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -84 -87 -89 -98 -98 -98 -98 -94 -98 -98 -98 -99 -90 -96 -82 -99 -92 -98 -83 -84 -82 -99 -93 -97 -93 -99 -94 -98 -98 -85 -98 -95 -98 -98 -98 -98 -98 -95 -83 -83 -98 -94 -99 -95 -98 -98 -88 -98 -92 -98 -97 -90 -82 -82 -81 -82 -81 -94 -93 -92 -90 -87 -94 -82 -80 -81 -82 -81 -82 -48 -83 -46 -81 -81 -81 -79 -80 -81 -94 -94 -94 -94 -94 -97 -98 -98 -96 -96 -98 -82 -82 -82 -82 -82 -82 -98 -98 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -40 -41 -41 -41 -40 -82 -82 -79 -82 -82 -82 -41 -98 -82 -82 -82 -82 -82 -82 -98 -51 -82 -82 -82 -82 -82 -82 -98 -85 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -81 -81 -54 -93 -94 -92 -94 -98 -82 -82 -82 -80 -80 -80 -84 -88 -82 -79 -81 -80 -80 -80 -82 -79 -81 -77 -80 -79 -81 -84 -84 -84 -84 -85 -85 -84 -85 -84 -84 -87 -91 -93 -84 -84 -90 -84 -84 -81 -84 -83 -85 -85 -88 -87 -85 -85 -86 -84 -84 -84 -83 -81 -92 -90 -92 -81 -86 -94 -98 -81 -81 -82 -86 -82 -96 -98 -92 -98 -91 -94 -82 -98 -81 -98 -92 -98 -83 -98 -89 -99 -84 -98 -97 -98 -98 -98 -84 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -81 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -41 -94 -82 -82 -81 -83 -81 -82 -82 -82 -82 -82 -82 -82 -94 -94 -94 -93 -84 -82 -82 -82 -82 -82 -82 -96 -82 -82 -82 -82 -82 -82 -93 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -88 -82 -40 -40 -55 -41 -41 -95 -85 -41 -40 -40 -82 -82 -82 -99 -59 -40 -40 -90 -82 -81 -82 -81 -81 -88 -40 -40 -82 -83 -82 -82 -82 -82 -72 -40 -40 -94 -40 -40 -81 -81 -81 -81 -86 -80 -81 -81 -80 -80 -76 -65 -40 -40 -84 -90 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -70 -41 -82 -82 -82 -82 -40 -93 -82 -82 -97 -41 -92 -96 -73 -90 -82 -82 -82 -82 -82 -82 -98 -83 -83 -83 -83 -83 -83 -99 -82 -82 -82 -82 -82 -82 -98 -82 -81 -81 -81 -82 -82 -82 -82 -82 -82 -80 -82 -98 -94 -83 -83 -83 -83 -81 -83 -81 -82 -82 -82 -82 -82 -58 -82 -82 -82 -82 -82 -82 -78 -98 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -83 -87 -46 -98 -96 -96 -81 -81 -82 -82 -82 -56 -68 -98 -99 -92 -98 -97 -98 -90 -64 -90 -99 -91 -90 -98 -96 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -99 -98 -99 -98 -98 -82 -82 -83 -83 -82 -82 -98 -94 -82 -81 -82 -82 -82 -82 -81 -82 -82 -79 -80 -80 -84 -87 -81 -81 -80 -80 -80 -80 -83 -54 -96 -85 -82 -82 -82 -82 -82 -82 -98 -98 -98 -84 -82 -82 -82 -82 -82 -64 -58 -97 -96 -98 -82 -82 -82 -98 -82 -82 -97 -94 -82 -82 -82 -82 -82 -82 -82 -82 -82 -60 -41 -41 -98 -89 -82 -82 -82 -82 -82 -82 -98 -83 -83 -84 -83 -83 -83 -99 -82 -82 -83 -82 -83 -82 -91 -83 -83 -83 -82 -83 -83 -99 -83 -82 -83 -83 -83 -83 -82 -82 -82 -83 -83 -83 -90 -85 -80 -82 -82 -82 -82 -97 -98 -99 -83 -76 -82 -83 -82 -82 -91 -91 -84 -83 -83 -83 -83 -83 -88 -83 -82 -83 -82 -83 -71 -83 -83 -83 -82 -83 -83 -99 -83 -83 -83 -83 -83 -83 -83 -55 -83 -83 -83 -83 -83 -83 -94 -93 -98 -92 -82 -82 -82 -82 -82 -76 -82 -97 -40 -66 -41 -98 -41 -73 -97 -97 -90 -90 -90 -90 -98 -98 -98 -98 -98 -99 -99 -99 -99 -98 -98 -98 -98 -94 -98 -98 -89 -90 -94 -93 -94 -94 -96 -97 -98 -84 -85 -85 -84 -97 -87 -85 -85 -85 -81 -85 -84 -88 -84 -84 -94 -98 -98 -98 -98 -98 -98 -98 -82 -99 -98 -94 -82 -82 -82 -82 -82 -85 -95 -98 -82 -85 -88 -88 -82 -82 -82 -82 -82 -82 -98 -82 -83 -82 -81 -82 -83 -94 -98 -85 -84 -84 -84 -84 -84 -84 -84 -90 -97 -98 -94 -83 -41 -88 -40 -87 -98 -96 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -99 -96 -82 -82 -82 -81 -82 -82 -82 -82 -82 -83 -82 -81 -82 -82 -82 -82 -82 -82 -45 -95 -76 -82 -82 -82 -82 -82 -81 -52 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -96 -94 -98 -91 -82 -82 -82 -82 -82 -82 -99 -98 -92 -88 -82 -82 -82 -82 -82 -67 -90 -99 -98 -98 -96 -91 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -91 -91 -82 -82 -81 -82 -81 -76 -84 -89 -83 -93 -84 -84 -84 -83 -84 -84 -98 -84 -84 -84 -84 -83 -84 -50 -98 -98 -41 -96 -95 -97 -83 -98 -83 -83 -98 -95 -98 -98 -98 -98 -98 -95 -98 -98 -98 -99 -98 -84 -83 -84 -84 -83 -84 -98 -84 -96 -84 -83 -83 -84 -84 -85 -98 -84 -84 -84 -84 -84 -84 -98 -98 -98 -98 -98 -84 -83 -84 -84 -84 -84 -50 -84 -84 -84 -83 -84 -84 -55 -96 -92 -92 -83 -94 -98 -98 -87 -97 -91 -98 -98 -98 -90 -95 -77 -92 -98 -94 -92 -83 -83 -83 -83 -83 -84 -84 -84 -83 -83 -83 -84 -98 -83 -84 -84 -84 -83 -83 -83 -79 -96 -83 -83 -83 -82 -83 -82 -83 -83 -83 -82 -83 -83 -53 -83 -82 -82 -83 -83 -83 -98 -83 -83 -83 -83 -82 -86 -98 -99 -98 -99 -98 -98 -92 -98 -98 -98 -40 -72 -40 -41 -40 -98 -41 -41 -97 -98 -90 -98 -98 -98 -98 -98 -98 -98 -97 -92 -98 -97 -98 -98 -98 -98 -98 -87 -81 -82 -82 -81 -82 -82 -98 -98 -77 -93 -83 -83 -83 -83 -83 -83 -99 -84 -84 -84 -83 -83 -84 -95 -97 -98 -98 -99 -98 -99 -98 -94 -98 -83 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -83 -83 -83 -83 -83 -83 -95 -98 -83 -83 -83 -83 -83 -83 -82 -82 -83 -82 -82 -82 -48 -83 -82 -82 -82 -82 -82 -56 -82 -82 -82 -82 -82 -82 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -92 -98 -98 -97 -97 -98 -98 -98 -98 -88 -92 -97 -98 -82 -82 -82 -82 -82 -77 -86 -82 -77 -82 -82 -80 -70 -98 -82 -82 -82 -82 -82 -82 -61 -92 -82 -82 -82 -82 -80 -82 -93 -87 -83 -82 -82 -82 -82 -82 -86 -82 -82 -81 -82 -82 -82 -91 -82 -82 -81 -82 -82 -82 -82 -98 -79 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -40 -77 -40 -98 -40 -62 -41 -62 -98 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -95 -98 -98 -81 -82 -82 -82 -80 -81 -81 -81 -82 -81 -81 -81 -98 -87 -82 -81 -82 -82 -82 -82 -95 -95 -99 -82 -82 -81 -81 -82 -82 -98 -98 -99 -98 -98 -98 -94 -97 -81 -98 -98 -93 -82 -98 -97 -81 -81 -81 -81 -81 -81 -88 -87 -98 -81 -81 -81 -82 -81 -81 -98 -81 -81 -81 -80 -81 -80 -97 -95 -83 -82 -82 -82 -82 -82 -97 -97 -97 -96 -92 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -98 -82 -81 -82 -81 -82 -82 -81 -80 -81 -80 -80 -81 -51 -81 -81 -81 -81 -81 -76 -41 -93 -81 -81 -81 -81 -81 -81 -90 -81 -81 -81 -81 -98 -98 -85 -86 -97 -81 -81 -68 -81 -81 -98 -98 -98 -98 -40 -71 -40 -41 -98 -98 -98 -96 -98 -40 -41 -97 -92 -98 -98 -98 -98 -98 -99 -98 -98 -99 -99 -98 -98 -98 -98 -98 -96 -92 -99 -95 -90 -98 -82 -82 -82 -82 -80 -80 -85 -81 -81 -81 -81 -81 -82 -92 -81 -81 -81 -81 -80 -80 -82 -81 -80 -82 -81 -82 -82 -99 -99 -99 -98 -98 -99 -98 -98 -96 -98 -90 -98 -82 -95 -92 -89 -89 -95 -97 -82 -89 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -72 -98 -97 -98 -98 -98 -97 -99 -99 -98 -98 -99 -98 -98 -98 -82 -82 -82 -82 -82 -82 -48 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -80 -68 -82 -82 -82 -82 -82 -82 -95 -80 -82 -82 -82 -82 -82 -84 -82 -75 -82 -82 -82 -82 -92 -92 -92 -81 -81 -81 -81 -81 -81 -93 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -81 -81 -97 -82 -82 -98 -82 -98 -82 -82 -89 -82 -82 -41 -99 -98 -90 -97 -98 -98 -98 -98 -41 -51 -40 -44 -40 -41 -98 -95 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -82 -82 -82 -82 -82 -82 -96 -82 -82 -82 -82 -82 -82 -42 -82 -81 -81 -81 -82 -81 -96 -83 -91 -87 -82 -83 -83 -83 -98 -95 -76 -93 -94 -94 -97 -96 -98 -94 -99 -98 -98 -98 -95 -98 -99 -98 -98 -99 -98 -98 -81 -81 -81 -81 -81 -81 -78 -98 -94 -98 -97 -97 -98 -83 -90 -87 -81 -81 -81 -81 -81 -78 -95 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -81 -81 -81 -81 -81 -81 -96 -81 -81 -81 -81 -81 -81 -98 -81 -81 -81 -81 -81 -81 -57 -81 -81 -81 -81 -81 -81 -94 -94 -80 -80 -80 -80 -80 -80 -83 -98 -87 -98 -96 -92 -98 -98 -98 -80 -81 -76 -81 -81 -80 -94 -94 -81 -81 -81 -81 -81 -81 -98 -98 -84 -81 -81 -81 -80 -81 -81 -50 -81 -81 -81 -81 -81 -81 -98 -98 -98 -51 -81 -80 -81 -81 -93 -81 -81 -40 -77 -41 -98 -99 -41 -40 -99 -99 -98 -98 -99 -98 -99 -98 -94 -95 -94 -98 -99 -81 -81 -81 -82 -81 -81 -98 -81 -81 -81 -82 -81 -81 -98 -99 -96 -90 -92 -93 -98 -98 -98 -90 -95 -98 -98 -95 -98 -89 -97 -97 -87 -88 -88 -89 -89 -88 -88 -88 -89 -77 -99 -94 -92 -93 -93 -98 -98 -99 -98 -98 -98 -81 -81 -98 -81 -80 -61 -98 -98 -98 -98 -91 -98 -86 -98 -99 -82 -98 -98 -99 -97 -91 -98 -99 -98 -92 -98 -81 -81 -90 -81 -81 -99 -98 -98 -98 -98 -98 -98 -99 -84 -83 -98 -98 -99 -84 -99 -80 -80 -81 -95 -98 -84 -84 -82 -99 -84 -84 -70 -84 -84 -98 -97 -78 -94 -94 -94 -95 -94 -99 -98 -98 -98 -98 -97 -85 -98 -99 -41 -98 -98 -98 -98 -98 -95 -90 -92 -40 -98 -98 -61 -83 -98 -98 -98 -98 -41 -64 -41 -93 -41 -41 -41 -95 -90 -41 -84 -82 -83 -83 -83 -61 -41 -98 -98 -98 -99 -97 -99 -93 -92 -93 -98 -98 -98 -98 -97 -98 -98 -90 -94 -97 -97 -97 -91 -98 -99 -99 -98 -97 -98 -98 -98 -96 -90 -99 -99 -82 -81 -47 -94 -98 -80 -78 -78 -81 -84 -85 -98 -96 -97 -98 -79 -97 -95 -94 -98 -99 -98 -98 -97 -79 -80 -64 -98 -79 -79 -99 -79 -80 -47 -80 -80 -97 -97 -98 -80 -90 -91 -91 -97 -95 -98 -92 -80 -80 -79 -79 -50 -79 -80 -99 -98 -98 -98 -97 -98 -97 -98 -90 -98 -99 -98 -98 -98 -98 -97 -98 -99 -98 -88 -88 -84 -99 -98 -98 -79 -79 -70 -79 -79 -75 -98 -99 -98 -98 -98 -98 -99 -84 -98 -99 -98 -91 -99 -98 -99 -98 -98 -95 -98 -90 -84 -98 -98 -97 -98 -97 -87 -88 -94 -83 -93 -87 -94 -84 -83 -82 -96 -98 -99 -98 -98 -97 -99 -40 -41 -68 -87 -82 -84 -98 -50 -82 -91 -81 -81 -82 -81 -82 -81 -98 -40 -41 -40 -98 -96 -99 -99 -98 -98 -90 -99 -98 -98 -98 -98 -95 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -99 -98 -98 -98 -96 -90 -98 -92 -99 -98 -99 -98 -99 -96 -98 -98 -81 -81 -81 -81 -97 -99 -99 -98 -95 -98 -96 -80 -81 -81 -80 -81 -78 -78 -94 -81 -81 -64 -93 -93 -95 -98 -98 -98 -80 -81 -68 -81 -81 -57 -81 -81 -70 -81 -81 -63 -40 -98 -40 -90 -92 -95 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -93 -98 -98 -98 -98 -81 -81 -81 -81 -49 -92 -98 -98 -98 -98 -99 -98 -96 -98 -95 -99 -96 -96 -98 -96 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -99 -90 -98 -98 -98 -97 -92 -94 -96 -59 -80 -98 -51 -98 -98 -98 -98 -98 -41 -40 -40 -94 -92 -93 -98 -94 -98 -98 -98 -98 -98 -98 -98 -99 -91 -98 -98 -99 -98 -98 -98 -78 -97 -98 -97 -98 -98 -98 -98 -98 -99 -99 -98 -98 -95 -97 -98 -98 -98 -96 -98 -98 -99 -94 -98 -98 -88 -41 -96 -78 -78 -78 -78 -84 -95 -98 -78 -78 -98 -82 -81 -69 -98 -92 -81 -80 -71 -98 -49 -81 -81 -91 -81 -81 -98 -41 -79 -40 -78 -78 -91 -71 -98 -78 -78 -79 -78 -78 -61 -77 -80 -85 -83 -98 -98 -98 -98 -97 -98 -98 -84 -91 -95 -91 -81 -81 -99 -97 -98 -90 -95 -98 -97 -90 -90 -98 -98 -98 -98 -98 -98 -98 -97 -98 -94 -99 -98 -98 -97 -98 -98 -98 -98 -97 -91 -98 -98 -98 -98 -99 -99 -99 -99 -98 -97 -98 -92 -97 -91 -66 -98 -41 -63 -40 -90 -98 -98 -98 -98 -98 -94 -98 -98 -84 -98 -95 -98 -98 -98 -96 -98 -98 -79 -93 -93 -92 -88 -93 -94 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -99 -82 -95 -98 -98 -98 -97 -98 -90 -81 -81 -81 -81 -75 -97 -98 -95 -81 -82 -98 -81 -82 -66 -99 -98 -99 -83 -98 -98 -82 -98 -98 -98 -97 -88 -81 -81 -40 -77 -88 -98 -41 -41 -40 -89 -88 -82 -82 -98 -82 -82 -74 -82 -81 -89 -77 -78 -78 -78 -72 -80 -78 -78 -78 -78 -61 -98 -98 -97 -84 -85 -85 -84 -84 -84 -84 -84 -84 -84 -79 -94 -94 -78 -78 -48 -78 -78 -86 -98 -97 -98 -97 -92 -98 -98 -99 -98 -98 -98 -98 -94 -87 -98 -80 -98 -98 -98 -99 -99 -98 -98 -98 -99 -92 -99 -98 -98 -98 -95 -98 -98 -98 -98 -97 -98 -99 -98 -76 -78 -97 -98 -99 -96 -98 -98 -98 -40 -83 -41 -87 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -92 -98 -98 -99 -98 -98 -96 -98 -98 -84 -98 -98 -98 -98 -99 -99 -98 -94 -93 -96 -94 -95 -78 -78 -77 -78 -78 -60 -98 -98 -98 -78 -78 -53 -78 -78 -98 -98 -98 -98 -80 -98 -98 -98 -98 -99 -98 -98 -92 -98 -98 -99 -77 -91 -89 -41 -98 -85 -40 -41 -74 -98 -90 -77 -78 -78 -78 -78 -77 -78 -51 -98 -96 -98 -78 -78 -77 -97 -78 -78 -98 -83 -98 -89 -98 -99 -98 -98 -99 -98 -88 -83 -89 -98 -98 -99 -77 -78 -92 -78 -78 -99 -98 -98 -98 -97 -98 -98 -99 -89 -89 -88 -98 -98 -98 -98 -78 -93 -93 -94 -98 -95 -98 -98 -96 -98 -91 -99 -98 -98 -99 -99 -98 -98 -98 -98 -98 -99 -78 -93 -98 -98 -98 -98 -99 -99 -54 -55 -40 -78 -98 -40 -41 -53 -41 -75 -93 -90 -99 -98 -98 -97 -99 -98 -98 -98 -98 -98 -97 -94 -94 -96 -89 -89 -90 -90 -95 -95 -95 -94 -95 -95 -95 -94 -96 -94 -94 -94 -94 -98 -98 -98 -99 -98 -98 -78 -98 -89 -80 -90 -98 -81 -98 -96 -98 -98 -80 -88 -80 -98 -80 -80 -67 -98 -98 -78 -93 -91 -92 -88 -93 -93 -98 -93 -93 -93 -93 -93 -93 -93 -92 -93 -92 -92 -93 -80 -98 -78 -81 -79 -95 -99 -77 -41 -40 -70 -79 -78 -78 -98 -95 -98 -81 -81 -96 -96 -96 -96 -98 -98 -97 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -91 -98 -98 -98 -99 -98 -99 -97 -83 -84 -87 -84 -84 -84 -84 -84 -84 -83 -78 -84 -84 -83 -84 -84 -84 -84 -84 -84 -83 -84 -83 -84 -77 -83 -98 -91 -78 -98 -96 -98 -97 -83 -92 -96 -82 -82 -82 -98 -98 -83 -96 -98 -98 -95 -98 -99 -97 -90 -89 -98 -90 -98 -97 -98 -97 -91 -98 -99 -98 -97 -98 -97 -97 -98 -98 -97 -96 -98 -90 -90 -96 -83 -94 -89 -92 -91 -93 -94 -93 -93 -78 -94 -98 -94 -94 -94 -94 -85 -90 -98 -97 -98 -84 -84 -52 -83 -93 -78 -97 -92 -91 -84 -98 -93 -83 -98 -77 -80 -93 -84 -92 -78 -79 -60 -95 -68 -78 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -94 -98 -92 -78 -79 -82 -78 -79 -83 -98 -98 -85 -85 -61 -84 -53 -98 -98 -95 -98 -97 -90 -91 -98 -98 -98 -98 -98 -98 -97 -97 -90 -96 -90 -98 -99 -98 -99 -98 -98 -99 -97 -98 -98 -97 -98 -97 -98 -98 -98 -87 -90 -82 -99 -98 -98 -98 -98 -91 -99 -99 -98 -97 -90 -94 -89 -94 -89 -89 -83 -92 -82 -90 -98 -83 -83 -92 -88 -83 -83 -77 -83 -83 -83 -83 -88 -93 -83 -84 -83 -98 -90 -83 -83 -84 -83 -86 -84 -89 -85 -80 -95 -89 -94 -88 -96 -90 -88 -90 -81 -98 -94 -96 -97 -96 -95 -88 -90 -84 -86 -98 -98 -92 -88 -99 -98 -98 -98 -88 -94 -94 -91 -96 -98 -98 -98 -98 -98 -83 -92 -94 -94 -80 -51 -52 -80 -91 -80 -99 -80 -91 -85 -98 -81 -60 -98 -89 -87 -90 -47 -81 -95 -94 -97 -98 -82 -83 -98 -98 -98 -98 -98 -80 -89 -91 -91 -82 -88 -95 -80 -97 -97 -98 -84 -98 -98 -90 -94 -96 -98 -80 -80 -80 -95 -80 -90 -94 -98 -84 -92 -84 -81 -84 -98 -83 -97 -94 -94 -91 -84 -83 -98 -98 -98 -98 -91 -98 -97 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -94 -95 -90 -95 -99 -98 -98 -98 -91 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -90 -98 -98 -97 -91 -90 -93 -92 -90 -90 -90 -97 -90 -89 -90 -90 -96 -90 -90 -89 -89 -90 -89 -76 -89 -88 -91 -90 -90 -87 -89 -88 -93 -90 -89 -90 -91 -93 -89 -90 -90 -84 -84 -84 -83 -98 -99 -84 -98 -94 -83 -93 -97 -98 -84 -84 -91 -98 -99 -93 -98 -83 -98 -84 -47 -97 -96 -98 -94 -88 -97 -97 -94 -98 -83 -79 -99 -98 -84 -63 -83 -98 -98 -90 -94 -98 -98 -98 -98 -98 -98 -98 -96 -91 -96 -98 -98 -98 -97 -89 -87 -94 -79 -83 -98 -92 -93 -94 -94 -91 -98 -98 -98 -99 -99 -80 -98 -97 -98 -97 -98 -98 -98 -98 -97 -97 -98 -97 -98 -92 -95 -91 -98 -90 -98 -91 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -99 -98 -99 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -91 -99 -94 -94 -98 -98 -98 -89 -99 -97 -98 -89 -94 -98 -90 -90 -90 -90 -89 -90 -89 -89 -88 -89 -88 -90 -77 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -80 -80 -98 -99 -99 -98 -92 -80 -98 -90 -91 -85 -98 -98 -85 -99 -82 -80 -99 -94 -85 -79 -98 -80 -69 -99 -98 -98 -97 -98 -98 -98 -98 -98 -97 -94 -94 -95 -98 -94 -95 -80 -94 -98 -98 -79 -61 -98 -98 -98 -80 -98 -79 -79 -98 -98 -99 -98 -99 -98 -79 -84 -79 -98 -92 -79 -53 -99 -83 -66 -83 -77 -95 -99 -89 -99 -98 -98 -98 -98 -98 -98 -93 -96 -91 -94 -98 -96 -98 -97 -99 -98 -98 -98 -98 -99 -99 -96 -90 -99 -94 -98 -89 -93 -83 -97 -98 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -92 -98 -94 -91 -98 -96 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -98 -98 -96 -99 -98 -98 -97 -97 -90 -98 -97 -97 -97 -98 -96 -98 -98 -94 -98 -98 -91 -97 -98 -98 -98 -98 -98 -98 -98 -91 -97 -83 -96 -91 -91 -96 -97 -86 -80 -79 -97 -95 -87 -92 -96 -91 -89 -80 -80 -71 -89 -84 -85 -85 -85 -85 -85 -88 -82 -82 -83 -79 -83 -98 -83 -52 -91 -98 -98 -92 -98 -90 -99 -98 -90 -95 -98 -84 -99 -98 -98 -98 -94 -98 -98 -98 -98 -90 -93 -83 -83 -98 -98 -98 -84 -98 -89 -98 -98 -83 -91 -83 -96 -98 -79 -90 -83 -97 -83 -85 -83 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -92 -83 -85 -84 -92 -90 -95 -98 -98 -97 -97 -92 -98 -83 -88 -98 -98 -98 -98 -97 -90 -92 -77 -93 -93 -94 -97 -93 -98 -98 -98 -98 -99 -99 -99 -98 -98 -98 -90 -89 -96 -98 -96 -98 -98 -91 -99 -98 -97 -97 -89 -98 -98 -92 -95 -90 -96 -88 -98 -84 -83 -94 -90 -89 -91 -98 -98 -98 -98 -98 -98 -92 -98 -99 -98 -94 -94 -94 -84 -98 -98 -80 -77 -80 -99 -97 -97 -97 -98 -99 -97 -98 -98 -96 -87 -98 -98 -98 -91 -98 -98 -98 -98 -91 -99 -98 -98 -98 -80 -80 -56 -80 -79 -80 -61 -91 -96 -97 -84 -84 -84 -83 -84 -77 -91 -93 -93 -94 -93 -99 -93 -99 -98 -83 -96 -98 -90 -79 -99 -84 -84 -68 -97 -93 -95 -84 -98 -98 -84 -95 -94 -98 -97 -98 -98 -98 -98 -98 -89 -84 -94 -90 -94 -94 -93 -95 -92 -98 -98 -94 -98 -98 -99 -98 -98 -98 -99 -98 -91 -98 -98 -98 -98 -89 -97 -98 -90 -90 -98 -98 -98 -98 -98 -98 -99 -77 -93 -93 -95 -93 -98 -98 -98 -98 -98 -98 -98 -91 -91 -99 -98 -98 -97 -98 -98 -98 -98 -98 -80 -98 -98 -98 -98 -99 -98 -98 -98 -99 -80 -99 -80 -99 -91 -98 -99 -98 -88 -94 -89 -90 -90 -98 -96 -97 -98 -97 -98 -98 -98 -99 -89 -94 -98 -98 -80 -80 -81 -86 -99 -80 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -99 -98 -98 -91 -98 -98 -98 -92 -96 -90 -96 -84 -86 -85 -79 -85 -85 -82 -86 -85 -85 -85 -85 -84 -84 -85 -81 -84 -95 -83 -84 -84 -97 -97 -98 -92 -97 -98 -99 -99 -98 -98 -80 -92 -80 -80 -98 -98 -80 -80 -98 -98 -52 -80 -80 -80 -80 -80 -80 -98 -80 -80 -98 -80 -63 -80 -96 -80 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -94 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -99 -98 -99 -98 -99 -98 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -90 -98 -89 -99 -98 -98 -94 -99 -98 -92 -90 -92 -91 -95 -98 -80 -90 -92 -86 -84 -98 -83 -98 -98 -95 -98 -98 -98 -98 -98 -98 -84 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -84 -90 -82 -63 -84 -98 -98 -92 -98 -98 -98 -98 -98 -98 -98 -99 -98 -89 -98 -99 -98 -96 -99 -98 -98 -98 -98 -93 -90 -98 -98 -98 -98 -89 -90 -98 -98 -90 -98 -98 -91 -90 -99 -98 -98 -98 -98 -98 -90 -98 -99 -99 -98 -98 -99 -98 -83 -84 -84 -84 -95 -85 -84 -84 -84 -84 -85 -84 -84 -84 -85 -84 -96 -99 -98 -83 -84 -70 -96 -84 -98 -90 -83 -98 -84 -41 -83 -98 -84 -99 -86 -93 -98 -98 -85 -98 -95 -93 -98 -98 -98 -94 -98 -98 -99 -98 -90 -89 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -90 -98 -98 -98 -98 -98 -99 -99 -98 -99 -99 -98 -98 -98 -99 -93 -98 -99 -98 -99 -98 -84 -63 -85 -83 -98 -98 -98 -98 -98 -98 -98 -98 -91 -99 -99 -98 -98 -98 -98 -98 -98 -76 -92 -92 -91 -92 -84 -90 -96 -83 -93 -84 -98 -98 -98 -98 -98 -98 -98 -99 -94 -99 -98 -99 -96 -84 -98 -98 -97 -98 -98 -99 -97 -98 -98 -98 -98 -98 -91 -98 -98 -98 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -96 -98 -98 -98 -98 -98 -99 -98 -98 -99 -97 -98 -98 -98 -99 -98 -99 -98 -98 -76 -84 -83 -97 -93 -93 -84 -99 -84 -98 -98 -99 -98 -97 -98 -99 -99 -98 -99 -98 -98 -98 -97 -98 -97 -96 -83 -90 -83 -85 -98 -97 -98 -98 -98 -98 -98 -90 -98 -98 -98 -98 -90 -98 -98 -98 -97 -97 -99 -98 -98 -98 -84 -98 -83 -99 -98 -98 -90 -98 -97 -98 -98 -98 -98 -99 -99 -90 -90 -99 -98 -99 -99 -98 -98 -98 -99 -98 -98 -98 -84 -84 -53 -84 -41 -98 -98 -99 -98 -98 -97 -84 -85 -89 -89 -98 -93 -98 -98 -98 -78 -98 -98 -93 -98 -98 -98 -90 -99 -98 -93 -98 -98 -92 -93 -99 -98 -98 -98 -98 -98 -98 -97 -98 -98 -96 -92 -98 -98 -99 -98 -98 -98 -98 -98 -89 -89 -89 -89 -88 -94 -90 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -98 -98 -98 -98 -98 -84 -84 -62 -98 -98 -98 -98 -98 -84 -62 -88 -98 -80 -89 -80 -81 -80 -80 -90 -83 -98 -98 -98 -99 -97 -98 -89 -97 -89 -90 -99 -84 -97 -98 -98 -76 -93 -93 -93 -96 -93 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -95 -97 -93 -99 -84 -85 -64 -98 -98 -98 -92 -93 -93 -91 -96 -98 -98 -99 -96 -98 -98 -98 -97 -98 -92 -94 -98 -93 -85 -84 -83 -99 -88 -79 -98 -93 -84 -77 -85 -98 -71 -96 -97 -97 -98 -97 -96 -99 -98 -98 -98 -98 -98 -97 -97 -99 -98 -98 -91 -98 -98 -98 -98 -98 -97 -98 -96 -84 -98 -98 -90 -98 -89 -98 -84 -98 -89 -98 -91 -91 -92 -98 -99 -99 -99 -98 -99 -97 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -85 -97 -95 -98 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -84 -69 -84 -98 -92 -99 -98 -98 -99 -96 -98 -98 -84 -84 -76 -84 -99 -84 -65 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -89 -90 -90 -90 -89 -90 -86 -90 -90 -90 -82 -83 -83 -89 -88 -90 -89 -82 -87 -85 -80 -94 -76 -89 -84 -96 -85 -75 -98 -98 -98 -98 -98 -98 -97 -93 -98 -93 -98 -99 -92 -92 -88 -86 -96 -84 -84 -51 -90 -80 -47 -97 -93 -93 -94 -89 -94 -89 -88 -93 -93 -89 -94 -94 -94 -89 -94 -94 -94 -91 -95 -94 -93 -92 -96 -97 -93 -91 -94 -93 -93 -88 -94 -94 -95 -94 -94 -93 -93 -93 -94 -94 -98 -98 -98 -98 -98 -98 -91 -98 -98 -98 -98 -98 -98 -96 -97 -85 -81 -95 -80 -80 -98 -80 -41 -98 -76 -84 -93 -91 -84 -61 -93 -93 -93 -89 -93 -84 -84 -68 -93 -92 -80 -93 -92 -93 -98 -90 -89 -89 -89 -84 -93 -99 -96 -95 -93 -96 -94 -98 -98 -98 -98 -98 -96 -98 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -85 -97 -90 -95 -84 -52 -83 -92 -99 -91 -90 -91 -97 -97 -97 -84 -85 -85 -86 -86 -85 -85 -85 -86 -84 -89 -84 -85 -92 -84 -86 -86 -85 -79 -85 -85 -76 -86 -86 -84 -85 -85 -84 -85 -85 -86 -82 -86 -83 -86 -84 -82 -82 -82 -85 -85 -82 -82 -86 -85 -91 -95 -97 -98 -81 -83 -94 -92 -84 -85 -97 -99 -97 -98 -90 -85 -90 -98 -80 -80 -81 -80 -80 -80 -80 -80 -97 -98 -98 -93 -45 -99 -98 -63 -94 -94 -94 -93 -93 -92 -91 -94 -94 -94 -94 -80 -96 -84 -97 -80 -64 -80 -94 -78 -85 -84 -94 -94 -94 -95 -77 -80 -75 -49 -80 -89 -91 -91 -80 -58 -80 -93 -93 -93 -94 -92 -93 -93 -93 -94 -93 -93 -93 -97 -80 -98 -98 -97 -87 -93 -98 -98 -98 -80 -98 -98 -98 -98 -90 -98 -97 -98 -94 -90 -95 -98 -98 -98 -99 -98 -98 -99 -98 -93 -82 -94 -81 -55 -80 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -93 -98 -99 -98 -98 -98 -99 -99 -98 -98 -98 -97 -90 -91 -94 -91 -91 -90 -90 -90 -94 -84 -84 -91 -90 -80 -86 -85 -85 -97 -84 -88 -90 -89 -89 -90 -91 -90 -91 -90 -93 -89 -89 -90 -90 -90 -88 -84 -98 -84 -85 -98 -80 -94 -98 -96 -95 -98 -95 -98 -98 -99 -98 -99 -99 -99 -95 -80 -80 -80 -80 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -94 -98 -93 -97 -98 -98 -99 -99 -98 -96 -98 -98 -98 -98 -80 -98 -84 -53 -91 -84 -98 -80 -74 -84 -87 -84 -84 -92 -94 -93 -80 -80 -80 -82 -85 -61 -89 -96 -96 -98 -96 -96 -97 -98 -77 -96 -98 -85 -94 -97 -97 -91 -98 -98 -98 -84 -98 -98 -96 -97 -96 -98 -98 -89 -98 -98 -98 -91 -97 -89 -80 -83 -99 -98 -85 -98 -84 -90 -99 -98 -98 -98 -97 -98 -98 -92 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -88 -98 -96 -99 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -96 -98 -99 -98 -98 -99 -98 -90 -88 -87 -91 -90 -90 -91 -90 -90 -87 -88 -87 -83 -90 -89 -88 -97 -77 -93 -93 -91 -93 -93 -98 -97 -97 -98 -86 -83 -98 -84 -99 -85 -58 -98 -98 -91 -97 -99 -98 -95 -98 -99 -98 -98 -98 -98 -98 -99 -99 -98 -99 -99 -92 -99 -98 -97 -99 -90 -98 -88 -82 -80 -81 -84 -57 -84 -90 -98 -98 -95 -92 -92 -98 -89 -83 -40 -96 -98 -90 -95 -98 -98 -84 -84 -99 -98 -96 -98 -99 -84 -99 -79 -94 -91 -91 -93 -93 -93 -97 -98 -99 -98 -98 -98 -87 -98 -99 -97 -98 -98 -98 -98 -98 -85 -95 -97 -99 -86 -84 -98 -98 -99 -98 -94 -98 -98 -98 -98 -91 -98 -98 -98 -98 -97 -98 -98 -98 -98 -99 -97 -99 -98 -98 -98 -98 -95 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -99 -98 -98 -98 -97 -98 -96 -98 -98 -98 -98 -98 -98 -96 -95 -96 -84 -91 -84 -87 -83 -92 -85 -80 -86 -78 -84 -84 -83 -97 -91 -78 -83 -98 -77 -98 -80 -92 -91 -93 -98 -98 -98 -99 -98 -99 -98 -98 -97 -97 -99 -98 -97 -98 -80 -98 -94 -98 -80 -80 -98 -98 -99 -98 -99 -98 -98 -98 -94 -92 -91 -95 -92 -84 -94 -99 -80 -98 -80 -97 -80 -85 -85 -84 -98 -98 -98 -99 -92 -93 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -84 -98 -84 -63 -99 -98 -98 -98 -99 -99 -89 -98 -98 -98 -98 -98 -98 -98 -84 -84 -97 -97 -99 -98 -98 -98 -98 -76 -93 -93 -94 -97 -93 -93 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -96 -94 -97 -98 -98 -98 -84 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -89 -98 -99 -98 -95 -99 -99 -98 -98 -98 -95 -98 -98 -84 -97 -81 -98 -80 -86 -80 -99 -98 -98 -98 -79 -96 -85 -93 -84 -98 -98 -99 -98 -98 -99 -98 -98 -98 -99 -98 -91 -90 -91 -98 -84 -95 -96 -89 -84 -86 -97 -90 -90 -97 -98 -80 -98 -80 -46 -93 -93 -91 -96 -96 -97 -84 -93 -89 -90 -96 -93 -93 -93 -80 -80 -80 -98 -90 -93 -80 -92 -91 -84 -93 -80 -80 -93 -66 -93 -98 -98 -87 -93 -92 -94 -91 -90 -98 -96 -96 -89 -93 -92 -93 -92 -91 -94 -98 -94 -97 -93 -93 -92 -93 -80 -98 -84 -83 -81 -92 -94 -98 -94 -93 -93 -93 -93 -98 -97 -97 -93 -93 -93 -92 -99 -98 -93 -93 -93 -90 -98 -94 -93 -93 -93 -93 -92 -93 -84 -87 -98 -98 -98 -93 -93 -93 -94 -95 -93 -94 -93 -92 -91 -91 -93 -96 -99 -93 -93 -93 -94 -92 -95 -95 -94 -93 -93 -93 -89 -83 -98 -93 -93 -93 -93 -98 -95 -96 -83 -80 -86 -84 -70 -94 -84 -83 -63 -83 -93 -93 -96 -97 -98 -93 -93 -93 -93 -93 -93 -93 -93 -93 -92 -98 -93 -93 -96 -98 -93 -91 -97 -92 -93 -93 -93 -98 -98 -84 -86 -93 -93 -83 -94 -82 -79 -93 -87 -97 -85 -89 -92 -89 -89 -84 -90 -98 -89 -80 -87 -82 -87 -87 -88 -89 -83 -76 -83 -98 -93 -93 -98 -93 -80 -62 -80 -80 -84 -90 -93 -93 -93 -94 -89 -98 -98 -96 -96 -92 -93 -90 -93 -96 -93 -98 -96 -93 -93 -93 -93 -98 -99 -93 -93 -95 -93 -93 -98 -98 -93 -92 -92 -93 -93 -98 -99 -93 -93 -93 -93 -98 -93 -94 -88 -93 -99 -99 -97 -93 -93 -92 -93 -84 -93 -95 -98 -98 -98 -93 -93 -93 -77 -93 -91 -93 -94 -90 -95 -92 -91 -93 -80 -94 -93 -80 -72 -80 -55 -80 -94 -84 -92 -92 -91 -93 -96 -98 -99 -93 -92 -93 -94 -98 -93 -93 -93 -93 -98 -94 -90 -93 -93 -93 -93 -93 -93 -97 -94 -98 -99 -84 -84 -86 -93 -80 -93 -94 -98 -98 -93 -93 -96 -95 -93 -93 -93 -93 -91 -98 -95 -97 -93 -93 -93 -93 -96 -80 -84 -84 -93 -78 -93 -83 -90 -83 -47 -89 -78 -91 -89 -89 -86 -87 -90 -89 -89 -88 -88 -91 -78 -95 -92 -90 -90 -83 -82 -93 -84 -84 -94 -93 -84 -80 -80 -99 -80 -52 -93 -93 -93 -98 -98 -92 -87 -93 -90 -90 -88 -98 -93 -93 -93 -94 -98 -94 -92 -93 -93 -96 -95 -89 -99 -93 -93 -93 -93 -94 -92 -93 -94 -95 -98 -95 -93 -92 -93 -93 -98 -97 -93 -93 -94 -92 -93 -98 -99 -94 -93 -93 -93 -93 -93 -98 -93 -94 -93 -93 -98 -97 -99 -93 -89 -80 -96 -98 -92 -94 -80 -87 -78 -84 -84 -92 -93 -98 -93 -94 -93 -78 -93 -93 -91 -93 -93 -91 -91 -91 -93 -95 -98 -93 -93 -93 -93 -93 -94 -98 -93 -94 -93 -94 -84 -84 -74 -83 -63 -93 -94 -93 -98 -98 -93 -93 -93 -93 -97 -96 -93 -93 -89 -93 -93 -93 -93 -97 -95 -98 -98 -99 -94 -93 -93 -93 -89 -83 -84 -96 -79 -92 -98 -84 -83 -93 -93 -93 -93 -80 -94 -98 -93 -93 -94 -93 -94 -88 -98 -94 -84 -84 -82 -90 -79 -79 -80 -89 -84 -50 -82 -86 -86 -87 -86 -89 -82 -94 -93 -95 -93 -93 -94 -94 -94 -92 -93 -93 -93 -85 -94 -93 -92 -93 -93 -92 -98 -98 -94 -93 -93 -88 -93 -93 -84 -93 -83 -94 -97 -96 -99 -94 -88 -93 -91 -92 -88 -93 -93 -93 -93 -93 -93 -94 -94 -98 -84 -96 -98 -98 -96 -98 -93 -93 -93 -84 -94 -98 -93 -93 -93 -98 -92 -95 -98 -98 -92 -94 -93 -95 -95 -96 -99 -93 -94 -94 -92 -98 -92 -94 -93 -86 -96 -97 -93 -93 -91 -93 -93 -93 -84 -89 -98 -89 -96 -88 -93 -93 -86 -83 -94 -91 -91 -90 -90 -92 -83 -83 -92 -93 -93 -87 -93 -93 -95 -98 -95 -92 -93 -93 -93 -84 -98 -93 -93 -93 -93 -98 -97 -98 -93 -93 -93 -94 -90 -99 -93 -93 -94 -91 -90 -91 -96 -98 -93 -90 -92 -91 -93 -97 -94 -93 -99 -93 -94 -91 -92 -98 -91 -90 -90 -88 -89 -88 -87 -87 -83 -96 -83 -84 -84 -90 -84 -78 -89 -88 -89 -98 -94 -94 -93 -93 -93 -96 -96 -94 -93 -90 -93 -94 -98 -98 -94 -93 -93 -93 -91 -98 -95 -84 -93 -93 -96 -95 -99 -93 -93 -98 -97 -89 -93 -93 -93 -89 -89 -94 -98 -93 -94 -93 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -98 -99 -98 -98 -88 -98 -98 -98 -98 -98 -98 -96 -98 -98 -99 -98 -85 -99 -97 -96 -98 -98 -99 -98 -98 -84 -98 -85 -98 -85 -86 -98 -99 -96 -78 -96 -90 -87 -88 -86 -98 -98 -98 -84 -98 -92 -98 -98 -98 -98 -97 -98 -98 -88 -98 -99 -84 -95 -98 -98 -98 -99 -98 -98 -98 -98 -98 -96 -98 -95 -96 -97 -98 -97 -98 -98 -98 -98 -98 -97 -98 -99 -98 -99 -95 -98 -98 -97 -96 -97 -98 -98 -97 -99 -99 -98 -98 -99 -98 -98 -98 -99 -98 -97 -98 -99 -88 -92 -94 -98 -85 -92 -99 -98 -98 -88 -86 -86 -90 -89 -99 -90 -83 -90 -92 -88 -93 -96 -83 -86 -84 -98 -82 -86 -91 -93 -93 -98 -99 -98 -98 -84 -98 -93 -84 -98 -98 -83 -83 -93 -84 -83 -97 -99 -98 -95 -95 -84 -98 -98 -98 -98 -98 -99 -99 -98 -98 -89 -93 -83 -84 -93 -93 -89 -93 -93 -93 -93 -93 -98 -99 -99 -99 -98 -98 -95 -98 -96 -84 -87 -80 -98 -80 -84 -84 -81 -83 -96 -78 -98 -96 -96 -98 -89 -86 -91 -80 -98 -98 -98 -80 -80 -97 -82 -82 -83 -83 -82 -83 -85 -79 -79 -80 -79 -79 -79 -84 -84 -79 -82 -81 -84 -77 -81 -84 -93 -80 -80 -78 -79 -80 -80 -98 -93 -48 -84 -83 -84 -81 -83 -83 -93 -93 -87 -88 -89 -82 -91 -85 -83 -84 -84 -83 -84 -98 -90 -83 -90 -96 -98 -57 -80 -80 -80 -80 -80 -77 -98 -96 -84 -65 -84 -76 -84 -86 -84 -98 -93 -89 -96 -88 -98 -98 -88 -47 -82 -84 -98 -98 -90 -98 -84 -83 -78 -57 -84 -98 -92 -71 -80 -77 -76 -78 -78 -93 -82 -84 -90 -83 -91 -96 -83 -95 -80 -80 -96 -96 -82 -84 -79 -78 -84 -83 -91 -64 -94 -80 -82 -98 -65 -83 -98 -98 -91 -90 -91 -95 -91 -98 -84 -84 -84 -83 -84 -84 -98 -83 -90 -82 -66 -78 -93 -91 -84 -98 -98 -92 -99 -83 -94 -85 -98 -84 -84 -96 -96 -98 -84 -81 -89 -99 -80 -93 -89 -84 -84 -78 -98 -98 -98 -98 -97 -94 -98 -95 -94 -97 -83 -84 -69 -99 -93 -98 -92 -93 -83 -92 -95 -79 -80 -94 -90 -98 -95 -96 -93 -95 -78 -91 -98 -98 -99 -98 -98 -99 -99 -98 -84 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -90 -98 -97 -98 -92 -98 -98 -98 -97 -85 -85 -90 -99 -98 -98 -98 -85 -98 -96 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -84 -78 -88 -98 -98 -98 -84 -98 -87 -98 -98 -98 -91 -94 -96 -90 -91 -91 -91 -90 -90 -96 -90 -90 -89 -98 -99 -98 -98 -85 -82 -77 -88 -93 -88 -98 -86 -86 -98 -98 -98 -83 -83 -91 -91 -95 -83 -84 -88 -79 -80 -99 -98 -80 -90 -94 -81 -80 -81 -99 -98 -93 -98 -98 -98 -98 -99 -85 -98 -85 -98 -98 -91 -98 -98 -98 -98 -98 -98 -98 -92 -89 -89 -90 -96 -95 -98 -98 -99 -98 -99 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -99 -98 -91 -98 -99 -98 -98 -99 -98 -91 -98 -98 -98 -98 -95 -97 -99 -99 -98 -99 -90 -99 -98 -98 -98 -87 -98 -78 -89 -90 -90 -93 -98 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -99 -80 -93 -98 -98 -98 -98 -98 -98 -98 -99 -93 -95 -98 -94 -96 -98 -98 -98 -98 -88 -98 -98 -90 -98 -98 -99 -98 -98 -98 -99 -99 -98 -96 -98 -99 -98 -99 -98 -98 -92 -90 -95 -84 -92 -98 -98 -91 -91 -98 -91 -91 -99 -99 -97 -98 -98 -99 -92 -96 -91 -91 -79 -80 -80 -80 -80 -93 -80 -79 -90 -90 -98 -89 -98 -98 -98 -95 -93 -98 -92 -83 -84 -91 -87 -98 -98 -98 -91 -98 -98 -98 -98 -98 -97 -98 -95 -95 -93 -92 -89 -80 -83 -80 -98 -92 -98 -98 -98 -96 -98 -98 -98 -90 -98 -98 -98 -90 -91 -98 -92 -99 -97 -98 -92 -98 -99 -88 -89 -98 -98 -88 -96 -98 -90 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -98 -92 -96 -93 -97 -98 -98 -98 -92 -96 -99 -95 -84 -98 -97 -98 -99 -98 -98 -98 -77 -83 -80 -80 -81 -90 -84 -98 -99 -98 -84 -84 -98 -98 -84 -84 -98 -98 -99 -98 -99 -96 -92 -93 -99 -99 -98 -98 -98 -98 -98 -99 -99 -99 -98 -98 -98 -88 -97 -97 -93 -91 -92 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -98 -98 -84 -84 -86 -84 -84 -84 -83 -79 -98 -97 -92 -94 -97 -98 -92 -97 -98 -98 -98 -98 -98 -98 -91 -90 -90 -90 -90 -87 -87 -90 -83 -90 -87 -88 -87 -90 -90 -98 -97 -97 -78 -93 -91 -91 -93 -93 -93 -98 -98 -98 -98 -97 -96 -98 -98 -96 -98 -98 -99 -98 -99 -98 -84 -95 -98 -98 -86 -96 -97 -98 -98 -98 -96 -98 -98 -97 -89 -98 -90 -98 -99 -98 -98 -98 -99 -97 -96 -98 -98 -84 -84 -97 -98 -80 -80 -98 -80 -80 -85 -84 -84 -90 -83 -84 -86 -84 -81 -98 -79 -80 -90 -85 -98 -98 -78 -94 -94 -91 -91 -94 -93 -94 -91 -93 -93 -89 -89 -98 -98 -90 -98 -90 -98 -84 -98 -98 -98 -94 -80 -98 -98 -91 -98 -99 -98 -90 -98 -97 -80 -80 -62 -95 -97 -80 -80 -92 -80 -80 -98 -84 -84 -90 -90 -82 -84 -93 -92 -91 -98 -97 -98 -98 -98 -99 -98 -98 -90 -98 -98 -98 -98 -99 -98 -98 -98 -98 -91 -98 -97 -96 -98 -96 -96 -91 -98 -92 -95 -90 -91 -91 -91 -91 -91 -91 -84 -91 -84 -85 -85 -85 -85 -85 -85 -88 -90 -93 -51 -98 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -85 -90 -94 -86 -91 -94 -98 -98 -97 -98 -98 -98 -98 -97 -91 -91 -98 -98 -99 -91 -98 -98 -98 -97 -99 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -83 -84 -98 -80 -80 -98 -80 -80 -98 -80 -80 -98 -80 -80 -60 -98 -99 -98 -98 -98 -89 -90 -98 -98 -92 -98 -98 -98 -98 -98 -97 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -90 -90 -98 -98 -99 -98 -98 -98 -98 -89 -80 -80 -80 -80 -44 -98 -98 -98 -98 -98 -80 -98 -98 -98 -98 -99 -99 -98 -98 -99 -98 -92 -98 -92 -99 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -99 -98 -98 -98 -98 -99 -98 -97 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -88 -91 -98 -98 -98 -98 -99 -98 -91 -98 -98 -98 -93 -98 -90 -98 -93 -90 -90 -90 -91 -90 -90 -98 -94 -90 -93 -78 -92 -90 -98 -98 -98 -94 -91 -92 -98 -99 -98 -98 -98 -98 -83 -98 -98 -99 -98 -98 -87 -96 -98 -80 -94 -98 -99 -81 -96 -83 -98 -98 -99 -90 -80 -80 -99 -80 -80 -54 -98 -80 -80 -81 -80 -80 -92 -80 -80 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -96 -96 -97 -92 -91 -91 -91 -96 -96 -98 -99 -94 -97 -98 -98 -96 -80 -80 -82 -89 -80 -80 -98 -98 -98 -98 -98 -98 -98 -78 -93 -93 -90 -98 -98 -94 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -92 -98 -98 -98 -98 -98 -91 -98 -98 -98 -97 -98 -98 -90 -98 -98 -98 -98 -91 -98 -98 -98 -98 -97 -98 -99 -98 -99 -98 -98 -98 -96 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -54 -76 -92 -90 -93 -99 -98 -98 -98 -98 -98 -98 -99 -80 -99 -80 -67 -97 -98 -98 -80 -81 -76 -80 -98 -91 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -90 -98 -98 -98 -99 -91 -99 -98 -98 -98 -97 -98 -99 -98 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -80 -99 -80 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -90 -98 -98 -98 -98 -98 -99 -98 -98 -85 -86 -98 -98 -98 -99 -99 -99 -77 -93 -93 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -99 -98 -98 -98 -98 -98 -90 -98 -99 -99 -98 -93 -96 -96 -98 -98 -98 -99 -99 -90 -98 -98 -98 -98 -92 -99 -96 -99 -97 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -96 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -97 -98 -98 -98 -98 -98 -98 -98 -98 -90 -91 -93 -91 -97 -84 -97 -91 -93 -91 -96 -84 -84 -84 -85 -85 -98 -99 -88 -88 -90 -89 -82 -90 -90 -90 -89 -90 -95 -90 -90 -90 -90 -90 -97 -98 -92 -98 -98 -98 -98 -94 -86 -92 -93 -80 -98 -85 -98 -80 -92 -80 -80 -80 -95 -98 -98 -93 -93 -84 -84 -98 -84 -94 -84 -84 -57 -84 -84 -55 -84 -51 -84 -93 -98 -91 -99 -95 -99 -99 -98 -98 -93 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -92 -98 -98 -89 -99 -98 -97 -98 -98 -84 -85 -93 -98 -98 -98 -93 -99 -98 -78 -98 -92 -91 -92 -92 -92 -92 -92 -91 -93 -92 -92 -92 -92 -93 -92 -92 -92 -92 -92 -92 -92 -89 -98 -93 -91 -92 -92 -98 -92 -92 -92 -92 -92 -92 -92 -90 -97 -97 -92 -98 -98 -97 -95 -92 -92 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -94 -96 -97 -98 -96 -97 -97 -98 -90 -97 -98 -98 -98 -95 -98 -96 -90 -93 -98 -92 -99 -98 -91 -95 -91 -91 -96 -90 -91 -90 -88 -88 -88 -90 -90 -92 -90 -90 -90 -90 -90 -90 -88 -93 -93 -98 -99 -98 -98 -93 -99 -89 -92 -98 -98 -83 -98 -84 -98 -83 -54 -83 -94 -98 -90 -96 -96 -85 -87 -84 -85 -73 -98 -84 -63 -84 -58 -84 -98 -84 -41 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -96 -98 -94 -96 -93 -98 -98 -97 -96 -98 -98 -90 -94 -93 -92 -92 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -90 -93 -98 -98 -97 -97 -97 -98 -89 -99 -98 -98 -98 -92 -98 -96 -95 -78 -92 -92 -91 -98 -92 -90 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -92 -98 -98 -97 -98 -98 -98 -98 -96 -98 -99 -98 -98 -97 -98 -99 -96 -98 -98 -99 -97 -98 -98 -99 -98 -98 -97 -98 -98 -96 -96 -98 -98 -98 -96 -98 -97 -98 -99 -98 -90 -95 -92 -90 -95 -90 -90 -83 -83 -78 -84 -84 -90 -90 -71 -79 -80 -50 -80 -88 -79 -90 -98 -84 -90 -82 -82 -52 -82 -90 -84 -71 -84 -91 -84 -80 -51 -91 -95 -89 -80 -97 -85 -98 -98 -98 -98 -99 -99 -98 -97 -96 -97 -94 -89 -98 -96 -97 -91 -98 -98 -89 -97 -98 -98 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -84 -99 -90 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -97 -98 -99 -90 -98 -98 -98 -98 -98 -98 -98 -98 -89 -98 -98 -98 -98 -98 -93 -93 -98 -78 -98 -98 -91 -91 -92 -91 -96 -96 -98 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -99 -80 -91 -97 -97 -98 -98 -98 -97 -97 -98 -97 -98 -98 -98 -90 -97 -98 -98 -98 -91 -98 -98 -98 -96 -99 -93 -98 -98 -98 -98 -98 -99 -97 -98 -90 -94 -98 -98 -99 -98 -98 -98 -98 -98 -92 -98 -90 -96 -98 -80 -80 -51 -80 -80 -95 -98 -84 -98 -84 -91 -80 -86 -83 -92 -80 -79 -80 -80 -79 -79 -87 -80 -89 -84 -48 -80 -53 -80 -83 -84 -91 -91 -92 -99 -99 -98 -89 -98 -92 -96 -84 -98 -98 -99 -98 -92 -98 -96 -91 -84 -84 -98 -93 -84 -98 -96 -96 -92 -97 -98 -98 -91 -88 -93 -98 -98 -98 -93 -95 -93 -99 -98 -90 -97 -94 -98 -98 -84 -98 -83 -97 -98 -99 -91 -98 -84 -92 -96 -97 -92 -96 -98 -89 -99 -98 -98 -98 -98 -84 -89 -94 -88 -89 -98 -98 -98 -98 -98 -91 -98 -97 -93 -92 -95 -98 -91 -93 -89 -98 -98 -98 -91 -98 -89 -94 -78 -98 -92 -91 -91 -92 -91 -92 -91 -91 -92 -91 -91 -92 -91 -93 -97 -97 -96 -97 -98 -97 -97 -92 -97 -96 -97 -90 -98 -98 -93 -98 -97 -97 -98 -98 -97 -98 -90 -98 -97 -91 -97 -98 -97 -93 -98 -97 -93 -98 -84 -84 -44 -98 -84 -58 -84 -96 -89 -98 -92 -91 -92 -92 -91 -97 -97 -86 -83 -95 -83 -89 -84 -94 -96 -97 -84 -80 -80 -80 -80 -67 -93 -92 -92 -90 -92 -92 -91 -98 -88 -91 -89 -90 -98 -92 -92 -91 -98 -78 -91 -92 -93 -96 -91 -91 -97 -98 -90 -90 -90 -90 -94 -97 -96 -97 -90 -90 -90 -98 -98 -80 -92 -80 -96 -91 -90 -98 -92 -80 -92 -91 -91 -92 -98 -97 -97 -90 -89 -90 -88 -90 -98 -90 -90 -89 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -98 -99 -98 -98 -98 -90 -92 -90 -92 -90 -98 -92 -98 -98 -78 -91 -98 -90 -90 -90 -93 -92 -97 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -80 -79 -95 -86 -86 -84 -90 -98 -84 -93 -84 -98 -98 -98 -98 -98 -97 -98 -98 -91 -85 -98 -84 -84 -98 -98 -79 -80 -80 -81 -80 -80 -96 -98 -96 -92 -98 -97 -98 -98 -98 -98 -98 -95 -92 -92 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -97 -98 -98 -92 -91 -91 -98 -92 -92 -97 -98 -89 -90 -90 -90 -98 -98 -98 -98 -98 -78 -92 -93 -91 -96 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -97 -95 -98 -98 -98 -98 -99 -98 -98 -98 -98 -99 -90 -92 -96 -97 -98 -91 -98 -98 -98 -97 -97 -97 -96 -96 -99 -98 -99 -99 -98 -96 -98 -98 -98 -98 -99 -97 -80 -91 -98 -98 -99 -98 -98 -96 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -91 -98 -90 -89 -96 -90 -90 -90 -96 -94 -86 -98 -96 -99 -99 -97 -98 -82 -92 -80 -63 -91 -91 -84 -97 -84 -98 -84 -98 -84 -99 -98 -79 -92 -96 -80 -79 -52 -96 -86 -94 -96 -98 -79 -80 -60 -79 -51 -80 -97 -97 -97 -98 -92 -98 -98 -97 -97 -92 -98 -96 -98 -90 -98 -98 -98 -99 -98 -91 -96 -98 -96 -95 -96 -96 -99 -98 -98 -97 -97 -98 -98 -98 -99 -98 -98 -98 -98 -98 -91 -99 -91 -91 -90 -98 -91 -90 -98 -90 -98 -92 -98 -98 -98 -97 -91 -98 -87 -89 -88 -88 -90 -87 -90 -98 -98 -97 -89 -90 -90 -98 -95 -89 -93 -90 -89 -92 -93 -89 -98 -98 -98 -98 -98 -98 -98 -96 -99 -80 -93 -87 -96 -97 -98 -98 -97 -98 -98 -90 -98 -98 -92 -95 -89 -96 -88 -86 -89 -92 -89 -98 -98 -98 -98 -99 -98 -98 -98 -98 -96 -96 -98 -89 -84 -98 -85 -98 -96 -84 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -80 -99 -79 -76 -83 -84 -96 -86 -83 -70 -84 -91 -84 -40 -98 -83 -83 -80 -80 -80 -62 -97 -97 -80 -76 -80 -93 -91 -94 -91 -95 -92 -85 -63 -84 -84 -98 -90 -98 -99 -99 -98 -98 -98 -98 -98 -98 -84 -98 -98 -98 -99 -98 -98 -98 -97 -97 -97 -98 -98 -99 -98 -90 -98 -99 -93 -98 -98 -90 -90 -90 -90 -98 -98 -98 -97 -98 -99 -98 -95 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -91 -97 -98 -98 -97 -98 -90 -98 -98 -98 -98 -96 -98 -97 -92 -84 -88 -86 -98 -98 -98 -99 -98 -98 -78 -93 -93 -90 -94 -91 -91 -98 -99 -98 -98 -90 -98 -98 -97 -98 -98 -98 -99 -98 -98 -96 -98 -99 -98 -99 -83 -84 -64 -98 -98 -96 -84 -99 -80 -98 -80 -98 -80 -66 -80 -98 -98 -98 -80 -81 -98 -98 -98 -98 -98 -97 -98 -98 -98 -99 -98 -79 -80 -80 -93 -80 -80 -58 -98 -98 -91 -98 -98 -98 -98 -98 -99 -98 -98 -93 -98 -90 -90 -89 -91 -92 -93 -92 -98 -98 -98 -98 -98 -99 -98 -99 -98 -98 -99 -98 -98 -80 -97 -98 -98 -98 -97 -98 -98 -98 -98 -98 -99 -98 -90 -98 -98 -98 -99 -94 -98 -98 -98 -98 -92 -99 -98 -98 -98 -99 -98 -98 -99 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -98 -98 -99 -98 -98 -99 -98 -98 -92 -95 -98 -99 -93 -98 -97 -98 -98 -90 -91 -98 -98 -98 -99 -98 -98 -93 -93 -93 -91 -98 -93 -99 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -93 -98 -80 -96 -96 -97 -99 -80 -85 -80 -87 -80 -80 -90 -98 -84 -99 -83 -92 -84 -83 -92 -83 -98 -98 -98 -90 -90 -96 -90 -90 -90 -96 -90 -83 -98 -80 -98 -96 -80 -81 -86 -80 -80 -98 -98 -98 -99 -99 -98 -98 -99 -98 -98 -98 -98 -95 -98 -91 -97 -95 -95 -97 -98 -98 -98 -98 -90 -99 -98 -98 -98 -98 -98 -98 -98 -78 -93 -92 -90 -90 -90 -91 -91 -96 -96 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -98 -91 -97 -96 -98 -92 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -91 -98 -98 -98 -95 -98 -98 -99 -98 -98 -99 -99 -98 -98 -98 -98 -98 -96 -96 -98 -90 -97 -95 -98 -98 -98 -98 -98 -96 -98 -98 -99 -97 -98 -98 -98 -98 -83 -99 -98 -98 -98 -98 -99 -91 -91 -91 -91 -91 -91 -91 -91 -91 -82 -84 -90 -88 -83 -90 -89 -98 -98 -94 -98 -93 -91 -80 -83 -84 -95 -80 -89 -79 -87 -83 -95 -98 -95 -98 -99 -99 -98 -98 -97 -84 -86 -83 -98 -83 -86 -81 -98 -80 -82 -96 -98 -80 -79 -71 -95 -78 -98 -80 -98 -95 -99 -80 -97 -80 -74 -83 -92 -84 -96 -83 -98 -83 -90 -98 -47 -90 -89 -87 -83 -90 -96 -84 -80 -97 -98 -98 -97 -98 -99 -99 -98 -91 -91 -92 -98 -98 -98 -98 -91 -98 -95 -98 -94 -98 -97 -94 -95 -89 -98 -98 -98 -96 -91 -98 -99 -78 -93 -90 -91 -97 -98 -98 -91 -98 -98 -99 -98 -86 -90 -92 -90 -95 -98 -98 -98 -98 -98 -99 -80 -98 -89 -92 -99 -98 -98 -98 -98 -98 -93 -98 -89 -98 -96 -93 -98 -98 -93 -99 -98 -98 -98 -98 -98 -98 -98 -96 -95 -98 -98 -83 -84 -86 -83 -90 -90 -93 -91 -90 -83 -82 -89 -98 -84 -84 -84 -99 -98 -98 -98 -98 -79 -80 -80 -92 -85 -80 -62 -98 -98 -79 -80 -80 -98 -97 -98 -91 -98 -96 -80 -88 -79 -95 -96 -79 -94 -98 -90 -80 -84 -83 -82 -92 -83 -84 -83 -94 -92 -98 -97 -98 -98 -99 -96 -98 -98 -97 -98 -98 -98 -98 -96 -98 -98 -98 -96 -98 -98 -98 -91 -97 -96 -98 -99 -98 -98 -95 -90 -90 -98 -98 -98 -96 -98 -99 -91 -91 -91 -98 -95 -98 -92 -91 -97 -93 -98 -98 -98 -83 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -95 -93 -93 -90 -89 -90 -91 -91 -91 -98 -92 -98 -95 -99 -98 -98 -98 -97 -97 -98 -98 -98 -99 -88 -98 -98 -98 -97 -98 -97 -98 -98 -98 -97 -98 -98 -97 -98 -94 -83 -98 -93 -98 -98 -98 -98 -98 -90 -90 -90 -98 -98 -99 -98 -98 -95 -93 -98 -98 -98 -98 -98 -98 -97 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -83 -63 -83 -83 -98 -84 -53 -83 -99 -98 -99 -98 -98 -98 -83 -82 -79 -83 -85 -84 -61 -84 -88 -77 -93 -82 -74 -98 -83 -83 -85 -98 -83 -82 -98 -98 -98 -98 -98 -99 -98 -99 -98 -99 -98 -98 -94 -84 -99 -99 -98 -98 -93 -98 -98 -95 -98 -90 -98 -94 -98 -98 -98 -98 -93 -98 -98 -99 -98 -98 -95 -98 -91 -92 -98 -98 -98 -98 -98 -83 -97 -92 -84 -89 -89 -95 -98 -99 -90 -90 -98 -98 -98 -98 -98 -98 -98 -99 -98 -92 -93 -92 -98 -95 -91 -98 -95 -98 -98 -98 -97 -98 -98 -84 -90 -99 -98 -98 -98 -97 -96 -95 -94 -94 -91 -91 -91 -93 -95 -98 -90 -90 -98 -83 -98 -83 -80 -73 -67 -97 -98 -98 -99 -98 -80 -94 -93 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -99 -91 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -97 -80 -41 -98 -98 -98 -98 -80 -80 -80 -98 -84 -78 -99 -98 -98 -99 -99 -99 -99 -99 -98 -83 -83 -99 -98 -83 -98 -98 -83 -83 -83 -80 -92 -78 -98 -82 -83 -85 -97 -93 -98 -98 -82 -89 -91 -95 -90 -88 -90 -99 -81 -79 -79 -81 -77 -84 -84 -82 -83 -90 -80 -80 -80 -80 -80 -80 -93 -98 -98 -83 -96 -90 -98 -79 -98 -98 -80 -92 -99 -83 -80 -98 -80 -80 -80 -80 -80 -80 -94 -96 -97 -94 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -96 -98 -95 -91 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -98 -98 -98 -99 -98 -98 -98 -99 -92 -98 -91 -98 -98 -98 -80 -54 -80 -49 -89 -90 -90 -98 -88 -80 -80 -85 -92 -98 -98 -84 -77 -99 -98 -98 -84 -83 -83 -88 -97 -94 -91 -97 -96 -99 -90 -91 -84 -85 -98 -83 -98 -99 -84 -90 -83 -98 -98 -94 -98 -98 -98 -98 -99 -98 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -99 -98 -95 -98 -99 -92 -94 -90 -98 -98 -98 -98 -98 -90 -90 -90 -93 -89 -99 -98 -84 -83 -86 -85 -83 -78 -91 -89 -91 -82 -93 -92 -83 -84 -83 -97 -97 -98 -91 -98 -98 -98 -98 -98 -96 -84 -91 -98 -94 -96 -91 -98 -90 -95 -98 -98 -98 -95 -96 -95 -95 -91 -91 -98 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -96 -89 -95 -98 -99 -95 -91 -82 -85 -84 -83 -98 -90 -96 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -91 -91 -98 -99 -98 -98 -99 -97 -98 -99 -89 -96 -98 -98 -83 -78 -98 -98 -93 -94 -97 -91 -90 -91 -90 -83 -92 -91 -91 -91 -91 -91 -91 -80 -78 -80 -66 -80 -80 -95 -80 -84 -98 -83 -83 -97 -84 -98 -98 -95 -98 -90 -97 -98 -97 -98 -97 -98 -97 -92 -97 -97 -97 -98 -92 -90 -95 -98 -98 -90 -98 -97 -96 -99 -96 -91 -91 -91 -93 -91 -98 -98 -91 -98 -98 -98 -98 -91 -93 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -83 -81 -83 -98 -98 -97 -98 -84 -88 -91 -95 -88 -88 -89 -90 -90 -89 -91 -89 -78 -90 -90 -93 -98 -99 -99 -98 -98 -99 -98 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -92 -84 -98 -99 -98 -90 -86 -98 -98 -97 -85 -83 -91 -96 -83 -57 -83 -93 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -98 -98 -98 -98 -98 -90 -97 -98 -98 -98 -98 -98 -98 -99 -98 -99 -99 -98 -98 -99 -99 -98 -98 -98 -91 -98 -98 -98 -99 -98 -84 -84 -88 -82 -98 -85 -84 -84 -98 -94 -92 -83 -78 -93 -84 -82 -93 -93 -98 -98 -98 -98 -99 -98 -92 -92 -92 -98 -98 -98 -98 -98 -98 -98 -84 -93 -98 -98 -98 -96 -97 -98 -98 -98 -98 -98 -99 -98 -92 -90 -97 -98 -98 -98 -98 -99 -98 -99 -99 -98 -91 -98 -99 -98 -98 -91 -84 -98 -98 -84 -62 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -99 -91 -91 -98 -99 -97 -99 -98 -98 -98 -84 -84 -85 -83 -84 -85 -90 -98 -96 -93 -99 -91 -90 -93 -98 -98 -84 -98 -84 -98 -84 -80 -64 -98 -98 -98 -98 -98 -98 -98 -98 -80 -98 -92 -96 -86 -80 -98 -98 -98 -98 -95 -96 -98 -97 -80 -61 -98 -92 -98 -92 -97 -98 -80 -80 -63 -80 -80 -80 -98 -99 -83 -98 -98 -98 -91 -93 -95 -92 -97 -98 -96 -98 -98 -85 -98 -98 -98 -98 -99 -98 -91 -98 -84 -93 -91 -91 -93 -94 -91 -90 -96 -95 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -97 -99 -84 -98 -98 -97 -97 -98 -83 -83 -64 -98 -98 -97 -97 -98 -98 -90 -92 -98 -91 -93 -97 -92 -99 -91 -98 -98 -97 -91 -98 -99 -98 -98 -95 -99 -98 -98 -98 -98 -99 -98 -98 -90 -98 -90 -95 -99 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -86 -83 -83 -64 -84 -83 -98 -78 -90 -70 -83 -84 -83 -58 -98 -98 -98 -98 -98 -85 -98 -98 -89 -90 -88 -84 -98 -98 -99 -98 -98 -98 -98 -99 -99 -98 -98 -98 -97 -84 -90 -91 -84 -98 -98 -91 -99 -99 -91 -98 -98 -98 -98 -83 -98 -83 -88 -95 -84 -84 -96 -98 -83 -83 -90 -80 -88 -80 -80 -98 -98 -98 -98 -99 -97 -98 -99 -92 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -97 -98 -97 -99 -91 -91 -91 -98 -98 -99 -98 -98 -90 -98 -98 -98 -98 -98 -98 -99 -98 -98 -90 -98 -99 -98 -98 -98 -92 -93 -93 -98 -90 -91 -98 -98 -98 -98 -97 -98 -91 -98 -98 -99 -98 -80 -50 -80 -52 -94 -96 -94 -98 -87 -92 -97 -95 -97 -91 -99 -98 -98 -98 -90 -98 -95 -99 -98 -99 -98 -94 -98 -99 -95 -91 -97 -98 -98 -98 -98 -98 -98 -98 -95 -95 -91 -80 -98 -98 -96 -98 -92 -95 -97 -91 -91 -95 -98 -98 -98 -98 -99 -99 -98 -95 -91 -98 -98 -98 -98 -96 -98 -99 -98 -98 -98 -98 -98 -98 -83 -91 -90 -93 -90 -89 -98 -99 -79 -76 -80 -80 -78 -94 -84 -83 -66 -84 -98 -83 -83 -77 -99 -98 -98 -98 -98 -98 -98 -83 -56 -83 -90 -84 -98 -85 -83 -98 -80 -99 -80 -91 -98 -98 -98 -90 -98 -98 -98 -91 -92 -98 -98 -98 -97 -99 -98 -98 -98 -99 -98 -98 -98 -91 -95 -99 -98 -98 -98 -98 -98 -97 -95 -91 -98 -98 -98 -98 -98 -98 -99 -98 -99 -94 -91 -98 -98 -99 -95 -91 -95 -95 -99 -98 -98 -98 -99 -80 -99 -79 -92 -98 -84 -54 -98 -98 -98 -98 -78 -98 -92 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -91 -97 -97 -84 -96 -98 -98 -93 -90 -98 -98 -98 -91 -97 -97 -98 -99 -90 -98 -98 -98 -98 -96 -99 -98 -98 -97 -91 -98 -99 -98 -98 -91 -98 -98 -95 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -83 -97 -83 -95 -90 -89 -85 -80 -98 -79 -91 -84 -83 -71 -95 -90 -83 -73 -98 -98 -98 -98 -98 -99 -92 -98 -90 -84 -84 -91 -98 -98 -89 -98 -98 -98 -98 -91 -99 -98 -98 -98 -92 -98 -98 -98 -98 -99 -98 -98 -95 -98 -85 -90 -86 -89 -89 -98 -98 -93 -98 -98 -93 -96 -93 -83 -83 -86 -98 -98 -98 -98 -99 -98 -98 -99 -98 -98 -98 -99 -86 -86 -91 -98 -91 -98 -98 -93 -93 -98 -98 -88 -90 -98 -98 -99 -98 -98 -98 -98 -78 -93 -93 -92 -94 -94 -98 -98 -98 -98 -98 -98 -97 -90 -98 -99 -98 -98 -98 -91 -98 -98 -84 -98 -93 -98 -98 -98 -98 -98 -97 -98 -97 -98 -98 -97 -94 -98 -97 -98 -98 -91 -98 -98 -91 -90 -89 -92 -93 -83 -98 -84 -70 -98 -95 -98 -95 -83 -98 -80 -84 -80 -98 -84 -83 -83 -79 -78 -99 -84 -78 -98 -98 -98 -98 -98 -83 -70 -84 -87 -84 -85 -83 -98 -91 -98 -89 -98 -98 -99 -90 -90 -93 -90 -93 -93 -90 -99 -88 -97 -98 -91 -91 -97 -99 -98 -99 -99 -98 -98 -99 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -83 -98 -86 -85 -97 -98 -98 -91 -99 -98 -98 -98 -98 -96 -98 -98 -97 -84 -98 -98 -98 -84 -98 -98 -98 -98 -98 -98 -98 -98 -81 -98 -97 -98 -98 -99 -98 -93 -98 -98 -90 -98 -98 -98 -94 -98 -91 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -98 -98 -90 -98 -90 -96 -94 -93 -97 -98 -88 -84 -98 -98 -98 -98 -98 -98 -98 -78 -93 -93 -94 -93 -98 -98 -98 -98 -97 -98 -98 -98 -98 -91 -99 -98 -98 -98 -98 -98 -84 -56 -83 -98 -83 -98 -83 -98 -98 -98 -99 -98 -98 -98 -98 -91 -98 -83 -98 -83 -56 -80 -55 -93 -98 -98 -97 -98 -98 -98 -80 -80 -80 -95 -97 -95 -80 -91 -98 -83 -99 -83 -98 -80 -99 -98 -99 -98 -98 -97 -91 -99 -95 -95 -91 -98 -98 -93 -93 -98 -92 -99 -99 -98 -98 -98 -98 -98 -98 -89 -94 -92 -89 -90 -89 -91 -93 -90 -89 -78 -93 -93 -93 -92 -90 -98 -98 -99 -98 -98 -98 -80 -98 -80 -98 -98 -98 -98 -98 -98 -80 -95 -94 -87 -80 -99 -98 -95 -91 -99 -93 -93 -94 -98 -94 -98 -98 -98 -98 -93 -96 -91 -93 -98 -98 -95 -93 -99 -98 -98 -98 -98 -96 -94 -98 -98 -94 -98 -98 -98 -98 -98 -97 -98 -98 -99 -98 -99 -99 -98 -98 -99 -98 -98 -98 -98 -95 -93 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -80 -70 -80 -96 -91 -80 -98 -98 -91 -90 -93 -93 -98 -98 -98 -97 -93 -96 -98 -99 -80 -95 -80 -62 -95 -91 -92 -98 -80 -98 -98 -99 -98 -99 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -93 -93 -99 -98 -98 -98 -97 -91 -98 -80 -80 -80 -98 -98 -99 -88 -90 -90 -90 -90 -89 -90 -90 -98 -93 -94 -98 -90 -93 -91 -91 -93 -97 -98 -98 -97 -98 -91 -98 -98 -98 -98 -98 -98 -98 -99 -94 -91 -97 -91 -99 -97 -96 -98 -98 -98 -94 -80 -89 -94 -91 -94 -93 -94 -80 -91 -94 -80 -95 -95 -80 -91 -87 -81 -92 -98 -99 -98 -98 -98 -97 -93 -98 -97 -97 -98 -98 -98 -98 -98 -80 -80 -89 -98 -80 -49 -98 -84 -99 -83 -98 -79 -98 -98 -98 -90 -98 -98 -98 -99 -98 -98 -97 -99 -89 -98 -80 -90 -80 -71 -98 -94 -80 -78 -80 -93 -91 -90 -93 -84 -93 -88 -80 -83 -68 -82 -89 -93 -80 -99 -96 -98 -98 -98 -98 -80 -94 -95 -98 -97 -89 -98 -84 -98 -97 -98 -92 -98 -98 -94 -91 -98 -90 -97 -88 -98 -84 -84 -95 -96 -98 -98 -98 -99 -98 -98 -99 -95 -98 -91 -98 -80 -98 -81 -97 -90 -80 -68 -80 -89 -98 -94 -94 -99 -99 -98 -98 -98 -98 -98 -98 -96 -92 -93 -90 -97 -98 -98 -95 -98 -97 -98 -97 -84 -83 -85 -84 -85 -86 -86 -84 -84 -84 -84 -84 -84 -92 -85 -86 -78 -98 -97 -98 -98 -84 -84 -85 -97 -98 -97 -98 -95 -98 -99 -80 -98 -85 -82 -94 -98 -84 -98 -95 -93 -90 -98 -98 -92 -98 -98 -98 -98 -92 -96 -99 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -79 -77 -94 -80 -94 -98 -94 -84 -99 -83 -98 -83 -41 -83 -98 -79 -98 -94 -80 -58 -80 -83 -80 -91 -80 -90 -91 -88 -88 -91 -91 -98 -96 -83 -96 -96 -90 -93 -92 -96 -91 -91 -92 -95 -95 -95 -91 -98 -90 -98 -98 -99 -98 -98 -98 -98 -99 -98 -96 -93 -84 -98 -98 -91 -92 -98 -98 -98 -98 -98 -98 -98 -98 -98 -83 -94 -83 -74 -99 -90 -98 -91 -98 -98 -91 -91 -91 -98 -91 -98 -97 -95 -95 -95 -95 -97 -95 -95 -90 -88 -89 -96 -90 -98 -99 -98 -98 -98 -97 -98 -90 -98 -96 -90 -84 -98 -83 -92 -99 -98 -98 -99 -97 -98 -97 -97 -89 -91 -90 -90 -90 -89 -89 -89 -88 -90 -90 -84 -84 -83 -98 -98 -98 -98 -98 -97 -90 -98 -98 -98 -98 -97 -90 -98 -99 -98 -98 -98 -97 -84 -92 -92 -97 -98 -97 -93 -99 -91 -91 -91 -91 -91 -83 -91 -83 -98 -93 -98 -83 -98 -97 -83 -83 -63 -98 -98 -98 -98 -95 -83 -83 -79 -98 -97 -97 -90 -83 -83 -95 -98 -98 -98 -98 -99 -98 -99 -98 -91 -90 -81 -93 -94 -91 -91 -91 -93 -93 -93 -96 -80 -93 -80 -90 -96 -95 -90 -96 -95 -90 -98 -95 -95 -93 -80 -99 -98 -90 -99 -98 -97 -90 -98 -98 -98 -98 -91 -91 -97 -91 -95 -92 -95 -90 -98 -97 -98 -98 -98 -98 -98 -99 -98 -98 -98 -95 -98 -98 -92 -97 -91 -96 -98 -97 -98 -98 -98 -98 -98 -98 -98 -97 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -91 -91 -89 -95 -97 -99 -89 -93 -99 -90 -98 -98 -99 -98 -98 -78 -89 -93 -89 -98 -98 -97 -90 -90 -90 -97 -80 -80 -80 -98 -80 -76 -98 -98 -98 -98 -98 -80 -92 -80 -80 -80 -90 -89 -91 -84 -82 -90 -80 -93 -95 -90 -90 -91 -89 -95 -89 -91 -91 -90 -90 -90 -83 -96 -83 -89 -89 -82 -84 -90 -97 -91 -89 -83 -92 -83 -93 -83 -76 -83 -98 -96 -96 -95 -95 -95 -99 -92 -92 -90 -98 -90 -90 -98 -98 -98 -92 -83 -98 -83 -80 -98 -95 -95 -98 -84 -98 -98 -98 -98 -98 -98 -96 -90 -98 -98 -91 -91 -97 -98 -98 -98 -98 -98 -98 -98 -98 -90 -98 -98 -99 -98 -91 -96 -98 -99 -84 -98 -90 -97 -97 -97 -97 -97 -97 -98 -97 -98 -98 -98 -98 -97 -98 -92 -98 -98 -98 -95 -98 -96 -92 -92 -98 -99 -97 -94 -91 -99 -96 -93 -98 -98 -99 -98 -98 -93 -98 -98 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -99 -98 -98 -99 -98 -95 -95 -89 -82 -90 -80 -51 -80 -81 -80 -80 -89 -89 -83 -82 -88 -98 -91 -68 -89 -89 -80 -86 -87 -91 -94 -84 -94 -89 -98 -98 -90 -84 -98 -89 -89 -84 -97 -92 -97 -98 -95 -80 -80 -80 -80 -80 -80 -41 -80 -58 -80 -98 -80 -97 -92 -83 -83 -67 -82 -97 -83 -95 -99 -98 -98 -98 -98 -98 -91 -98 -91 -94 -92 -97 -92 -93 -91 -94 -83 -76 -44 -98 -83 -91 -91 -93 -93 -95 -93 -87 -95 -96 -92 -83 -95 -99 -98 -93 -96 -95 -98 -98 -99 -94 -98 -98 -99 -84 -85 -98 -98 -94 -95 -98 -98 -98 -78 -93 -93 -93 -93 -98 -98 -97 -98 -83 -98 -84 -76 -80 -93 -66 -78 -95 -97 -98 -98 -98 -98 -98 -96 -97 -84 -97 -92 -98 -92 -91 -95 -91 -94 -98 -90 -93 -97 -93 -84 -89 -83 -84 -98 -92 -92 -98 -97 -98 -98 -91 -98 -90 -90 -90 -90 -91 -84 -84 -81 -96 -95 -80 -92 -80 -90 -95 -84 -95 -98 -82 -89 -91 -83 -95 -79 -83 -90 -84 -95 -95 -94 -91 -98 -88 -99 -92 -95 -89 -88 -83 -83 -84 -88 -87 -78 -82 -81 -53 -91 -91 -82 -91 -91 -83 -65 -92 -80 -80 -94 -98 -95 -95 -92 -88 -91 -96 -98 -98 -98 -92 -80 -72 -80 -97 -97 -98 -98 -96 -90 -96 -98 -98 -98 -98 -98 -98 -99 -99 -98 -98 -98 -98 -98 -97 -98 -98 -95 -90 -95 -97 -90 -89 -93 -93 -94 -96 -93 -93 -88 -92 -93 -99 -93 -88 -90 -95 -98 -66 -98 -78 -89 -77 -91 -93 -94 -93 -91 -88 -89 -91 -98 -94 -92 -98 -94 -98 -97 -97 -97 -98 -98 -90 -90 -78 -86 -86 -85 -97 -98 -97 -99 -97 -98 -98 -80 -98 -91 -97 -80 -65 -80 -92 -87 -98 -98 -98 -98 -98 -97 -98 -97 -98 -97 -98 -95 -95 -98 -98 -98 -98 -97 -99 -97 -98 -98 -98 -98 -98 -98 -97 -98 -80 -79 -80 -86 -98 -98 -97 -80 -79 -79 -58 -90 -98 -91 -98 -80 -65 -80 -98 -98 -80 -80 -80 -99 -89 -88 -86 -88 -90 -87 -88 -93 -88 -92 -96 -98 -98 -92 -98 -98 -95 -98 -98 -98 -92 -98 -99 -99 -98 -99 -98 -80 -95 -85 -80 -80 -98 -99 -97 -98 -98 -95 -95 -90 -90 -90 -91 -80 -80 -80 -91 -98 -98 -99 -97 -98 -98 -96 -91 -98 -95 -91 -99 -98 -98 -92 -95 -93 -98 -98 -98 -94 -98 -98 -98 -98 -91 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -91 -98 -98 -93 -98 -91 -98 -98 -91 -84 -93 -92 -94 -98 -95 -96 -98 -95 -93 -84 -93 -93 -98 -98 -98 -98 -98 -96 -95 -80 -80 -70 -98 -83 -98 -98 -91 -97 -98 -98 -83 -98 -98 -91 -91 -98 -97 -98 -99 -98 -98 -98 -96 -98 -98 -91 -98 -90 -87 -90 -98 -83 -54 -83 -83 -99 -91 -93 -87 -82 -87 -82 -96 -92 -93 -96 -92 -92 -96 -83 -95 -94 -98 -80 -72 -98 -58 -83 -91 -91 -91 -93 -97 -83 -83 -83 -74 -83 -92 -96 -98 -95 -91 -91 -91 -91 -92 -98 -84 -85 -85 -85 -85 -85 -85 -85 -85 -85 -93 -90 -97 -99 -98 -90 -91 -90 -91 -90 -91 -90 -91 -98 -83 -89 -99 -95 -95 -95 -91 -91 -91 -96 -93 -99 -93 -91 -91 -91 -91 -91 -91 -91 -91 -91 -91 -89 -96 -86 -97 -84 -97 -82 -97 -97 -96 -97 -96 -97 -98 -97 -96 -97 -98 -97 -97 -98 -90 -97 -95 -96 -95 -91 -90 -90 -90 -96 -97 -98 -97 -99 -98 -97 -98 -98 -98 -96 -98 -91 -98 -83 -96 -98 -98 -88 -92 -84 -98 -99 -98 -98 -85 -85 -98 -90 -98 -83 -95 -91 -89 -93 -98 -99 -96 -96 -96 -91 -90 -90 -91 -98 -98 -98 -82 -82 -91 -91 -98 -98 -94 -97 -83 -83 -64 -83 -89 -91 -97 -97 -97 -97 -97 -98 -90 -89 -98 -83 -95 -97 -83 -92 -96 -96 -96 -89 -92 -82 -97 -98 -94 -87 -97 -90 -90 -90 -91 -97 -96 -96 -83 -74 -80 -84 -79 -85 -84 -84 -84 -82 -84 -84 -93 -98 -80 -89 -97 -98 -91 -98 -91 -98 -83 -83 -82 -96 -95 -95 -95 -94 -91 -91 -98 -86 -99 -88 -95 -83 -94 -87 -97 -97 -97 -96 -97 -97 -97 -91 -98 -97 -99 -97 -88 -95 -90 -90 -97 -98 -98 -98 -98 -97 -90 -91 -90 -91 -83 -66 -90 -83 -95 -98 -98 -98 -98 -95 -98 -95 -95 -98 -98 -96 -92 -98 -92 -91 -91 -98 -98 -98 -98 -98 -95 -90 -90 -90 -99 -98 -97 -99 -83 -78 -99 -81 -98 -80 -97 -97 -97 -98 -82 -79 -84 -82 -91 -92 -83 -98 -93 -93 -98 -98 -93 -95 -94 -93 -82 -86 -83 -98 -94 -96 -93 -93 -90 -98 -83 -49 -82 -92 -98 -98 -98 -98 -91 -52 -98 -97 -98 -98 -98 -88 -90 -94 -89 -97 -99 -98 -98 -98 -98 -98 -91 -92 -93 -92 -92 -98 -96 -98 -91 -95 -90 -99 -97 -98 -98 -99 -98 -98 -98 -98 -98 -98 -83 -97 -98 -80 -80 -62 -98 -92 -98 -99 -98 -98 -92 -98 -91 -97 -84 -84 -85 -85 -85 -91 -98 -98 -97 -89 -92 -99 -91 -97 -99 -98 -97 -86 -92 -92 -98 -94 -98 -98 -98 -98 -98 -99 -98 -98 -98 -80 -96 -93 -91 -98 -80 -54 -99 -98 -99 -98 -98 -98 -91 -99 -98 -97 -98 -98 -98 -99 -98 -98 -96 -98 -98 -99 -98 -98 -98 -98 -98 -91 -98 -98 -91 -85 -98 -98 -80 -80 -64 -98 -98 -98 -98 -98 -98 -99 -98 -91 -80 -75 -79 -80 -89 -83 -95 -98 -91 -93 -93 -98 -95 -91 -91 -82 -100 -82 -90 -98 -98 -90 -91 -99 -97 -84 -82 -93 -90 -92 -80 -56 -80 -95 -83 -82 -95 -95 -91 -90 -90 -97 -98 -98 -98 -90 -90 -98 -94 -97 -94 -98 -98 -98 -97 -98 -97 -98 -91 -99 -98 -98 -99 -92 -94 -99 -88 -98 -98 -98 -98 -94 -98 -97 -98 -83 -69 -83 -99 -83 -96 -98 -69 -98 -99 -98 -98 -98 -96 -92 -86 -97 -96 -97 -98 -98 -98 -98 -98 -98 -93 -93 -91 -91 -95 -98 -96 -95 -92 -89 -90 -90 -91 -91 -98 -85 -99 -90 -90 -90 -83 -85 -94 -93 -83 -88 -92 -92 -90 -96 -99 -90 -98 -98 -98 -90 -83 -90 -99 -98 -98 -98 -98 -91 -94 -98 -96 -85 -98 -93 -98 -60 -98 -91 -91 -91 -94 -89 -93 -98 -90 -98 -95 -98 -98 -86 -91 -98 -90 -98 -91 -90 -98 -91 -99 -98 -83 -83 -95 -98 -99 -93 -83 -83 -98 -82 -95 -88 -90 -89 -89 -99 -94 -98 -99 -98 -99 -82 -54 -98 -82 -98 -89 -80 -41 -82 -59 -83 -84 -84 -79 -94 -98 -91 -84 -84 -98 -90 -84 -84 -98 -80 -98 -80 -80 -97 -97 -94 -83 -93 -98 -93 -89 -93 -90 -95 -92 -97 -88 -91 -98 -98 -98 -61 -83 -78 -82 -98 -80 -80 -80 -84 -83 -95 -88 -82 -80 -98 -95 -98 -98 -97 -98 -98 -99 -98 -98 -98 -99 -98 -99 -98 -99 -99 -98 -98 -99 -97 -98 -98 -90 -96 -98 -98 -98 -98 -92 -95 -83 -84 -88 -85 -84 -85 -86 -85 -86 -84 -85 -90 -88 -88 -88 -85 -90 -93 -88 -92 -93 -97 -98 -95 -90 -98 -99 -98 -72 -91 -98 -98 -91 -94 -96 -98 -95 -95 -80 -90 -99 -98 -98 -80 -79 -58 -82 -62 -98 -98 -88 -98 -99 -98 -97 -98 -98 -98 -98 -98 -98 -83 -98 -95 -80 -99 -85 -83 -59 -83 -97 -80 -84 -98 -98 -96 -96 -70 -80 -79 -80 -87 -95 -90 -98 -83 -74 -83 -96 -99 -83 -91 -83 -98 -98 -98 -98 -96 -96 -84 -91 -98 -99 -98 -98 -98 -99 -97 -92 -94 -93 -88 -93 -93 -93 -89 -91 -99 -98 -99 -98 -93 -93 -98 -98 -83 -76 -98 -94 -80 -96 -94 -92 -83 -61 -82 -88 -84 -93 -93 -97 -98 -98 -93 -93 -98 -90 -98 -98 -89 -98 -93 -91 -97 -98 -99 -98 -98 -98 -96 -99 -98 -96 -99 -98 -98 -98 -99 -93 -98 -98 -94 -92 -98 -98 -98 -98 -98 -99 -98 -99 -97 -98 -98 -98 -94 -95 -98 -98 -93 -93 -98 -98 -96 -96 -98 -97 -95 -90 -90 -90 -98 -96 -83 -85 -85 -84 -90 -84 -89 -87 -93 -93 -93 -82 -90 -90 -98 -91 -91 -96 -80 -98 -99 -68 -83 -98 -98 -98 -83 -99 -95 -98 -83 -99 -98 -85 -98 -82 -83 -85 -83 -83 -88 -94 -98 -98 -98 -94 -98 -82 -82 -82 -98 -98 -98 -98 -91 -98 -98 -99 -82 -83 -98 -80 -98 -96 -98 -83 -85 -83 -91 -98 -97 -90 -98 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -90 -90 -97 -90 -91 -99 -96 -89 -82 -84 -93 -90 -90 -98 -83 -90 -82 -87 -93 -89 -90 -88 -80 -80 -49 -98 -98 -98 -98 -97 -98 -99 -98 -97 -98 -98 -99 -98 -98 -98 -95 -98 -98 -93 -98 -98 -96 -90 -98 -98 -98 -99 -99 -98 -88 -97 -98 -93 -88 -98 -98 -98 -97 -99 -98 -91 -98 -99 -98 -96 -98 -99 -95 -98 -98 -93 -95 -94 -97 -97 -98 -98 -98 -98 -95 -98 -98 -98 -99 -98 -98 -94 -93 -93 -98 -98 -90 -98 -80 -94 -90 -82 -96 -99 -82 -97 -97 -84 -92 -91 -85 -85 -85 -84 -98 -98 -89 -93 -94 -89 -91 -93 -98 -82 -82 -83 -98 -92 -90 -93 -98 -97 -98 -82 -74 -98 -83 -95 -97 -86 -98 -89 -82 -90 -96 -99 -98 -98 -97 -98 -98 -82 -82 -94 -98 -98 -94 -93 -94 -98 -98 -95 -83 -50 -99 -83 -98 -54 -82 -73 -96 -98 -98 -91 -98 -94 -98 -98 -99 -97 -99 -98 -91 -99 -98 -98 -98 -99 -90 -96 -84 -92 -90 -91 -91 -93 -99 -93 -93 -93 -93 -89 -98 -98 -94 -93 -95 -91 -97 -91 -98 -89 -98 -98 -98 -98 -98 -98 -98 -99 -97 -98 -99 -93 -97 -98 -98 -98 -90 -98 -98 -87 -98 -98 -98 -98 -94 -97 -97 -98 -98 -99 -98 -92 -83 -87 -98 -98 -82 -99 -98 -93 -97 -98 -92 -98 -91 -96 -98 -98 -98 -99 -98 -98 -98 -98 -89 -98 -99 -99 -82 -82 -48 -98 -98 -98 -89 -98 -97 -80 -87 -90 -80 -88 -90 -90 -89 -90 -90 -89 -89 -90 -87 -95 -93 -98 -97 -82 -81 -78 -89 -82 -98 -83 -47 -82 -80 -98 -90 -98 -99 -98 -92 -98 -98 -98 -98 -99 -98 -99 -82 -98 -98 -98 -98 -94 -98 -98 -98 -98 -89 -98 -98 -94 -98 -93 -82 -99 -82 -83 -64 -69 -98 -98 -98 -99 -98 -98 -98 -98 -93 -96 -98 -84 -89 -88 -95 -90 -90 -98 -98 -98 -95 -94 -98 -98 -90 -98 -98 -84 -88 -98 -98 -98 -98 -97 -95 -94 -96 -83 -90 -90 -98 -98 -97 -94 -84 -99 -84 -89 -89 -89 -89 -91 -90 -95 -93 -98 -97 -90 -93 -91 -96 -98 -98 -88 -84 -87 -99 -92 -96 -85 -98 -82 -56 -82 -97 -98 -98 -98 -90 -98 -98 -98 -94 -96 -84 -98 -89 -91 -90 -84 -92 -98 -95 -98 -91 -98 -99 -99 -99 -82 -82 -98 -98 -82 -56 -98 -80 -80 -98 -98 -98 -98 -98 -98 -98 -98 -99 -97 -89 -98 -98 -98 -97 -98 -90 -98 -79 -90 -77 -75 -96 -79 -98 -83 -54 -82 -63 -82 -90 -90 -80 -51 -90 -82 -96 -93 -98 -93 -93 -98 -99 -98 -98 -91 -98 -95 -90 -97 -96 -97 -91 -98 -98 -99 -99 -97 -95 -83 -98 -89 -86 -83 -83 -71 -82 -78 -98 -99 -98 -98 -94 -98 -97 -99 -99 -95 -99 -98 -90 -67 -79 -98 -88 -99 -98 -92 -98 -98 -99 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -97 -93 -43 -97 -98 -98 -98 -90 -98 -99 -98 -98 -98 -97 -97 -89 -90 -99 -98 -98 -98 -98 -98 -82 -49 -93 -96 -98 -89 -90 -83 -84 -99 -98 -98 -99 -98 -98 -99 -90 -93 -98 -98 -93 -98 -90 -98 -94 -82 -98 -97 -97 -98 -82 -66 -82 -95 -97 -91 -95 -94 -98 -98 -98 -98 -89 -98 -95 -96 -95 -99 -91 -91 -91 -98 -98 -98 -98 -91 -95 -98 -99 -82 -98 -80 -83 -80 -83 -96 -98 -98 -83 -98 -99 -82 -98 -93 -98 -94 -98 -98 -97 -98 -98 -98 -98 -98 -98 -96 -91 -97 -95 -82 -81 -93 -99 -98 -80 -80 -58 -98 -84 -96 -88 -82 -93 -98 -90 -99 -99 -99 -96 -91 -98 -90 -94 -92 -95 -99 -98 -91 -77 -97 -96 -95 -90 -89 -91 -98 -97 -95 -98 -99 -96 -98 -98 -98 -97 -98 -98 -98 -98 -97 -98 -97 -98 -98 -98 -98 -90 -92 -92 -98 -98 -98 -92 -83 -94 -94 -82 -95 -90 -95 -91 -79 -93 -96 -93 -90 -86 -94 -79 -91 -98 -98 -98 -99 -84 -93 -96 -91 -89 -80 -76 -80 -51 -99 -91 -91 -94 -98 -93 -98 -92 -89 -93 -90 -92 -96 -98 -80 -93 -98 -98 -99 -98 -97 -98 -98 -98 -97 -98 -98 -91 -98 -80 -80 -98 -89 -80 -80 -80 -97 -96 -98 -91 -91 -91 -98 -98 -98 -98 -97 -99 -98 -99 -98 -99 -98 -97 -93 -98 -94 -98 -98 -98 -98 -97 -98 -99 -94 -98 -95 -96 -98 -91 -92 -91 -80 -80 -53 -98 -90 -90 -99 -98 -96 -89 -80 -88 -88 -81 -92 -96 -89 -87 -86 -86 -86 -90 -83 -83 -87 -83 -84 -83 -83 -83 -83 -90 -89 -89 -88 -83 -87 -91 -83 -91 -94 -80 -98 -93 -89 -99 -98 -99 -99 -95 -96 -80 -98 -98 -91 -98 -98 -67 -80 -81 -80 -98 -82 -97 -98 -98 -91 -98 -91 -98 -97 -96 -90 -96 -98 -91 -83 -82 -80 -80 -95 -52 -95 -95 -91 -90 -91 -97 -97 -98 -98 -98 -91 -91 -91 -80 -98 -80 -98 -90 -98 -98 -94 -98 -98 -97 -99 -99 -98 -89 -94 -91 -98 -91 -90 -95 -96 -91 -88 -90 -90 -92 -96 -91 -91 -94 -93 -98 -91 -91 -91 -91 -92 -91 -91 -91 -93 -80 -95 -91 -97 -97 -98 -98 -80 -80 -85 -80 -62 -98 -98 -98 -98 -96 -98 -98 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -94 -98 -99 -80 -95 -80 -99 -83 -62 -41 -97 -96 -98 -98 -90 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -90 -98 -98 -99 -98 -98 -97 -96 -97 -97 -94 -84 -85 -85 -85 -85 -85 -85 -85 -93 -85 -90 -93 -93 -92 -93 -92 -98 -98 -97 -91 -91 -91 -98 -82 -62 -84 -82 -91 -98 -92 -87 -83 -98 -98 -96 -99 -98 -98 -98 -98 -82 -98 -95 -98 -95 -95 -82 -88 -95 -98 -97 -99 -98 -98 -98 -98 -98 -98 -82 -86 -80 -80 -80 -98 -95 -82 -91 -97 -94 -95 -95 -95 -95 -95 -95 -96 -95 -95 -97 -95 -92 -91 -99 -95 -95 -96 -96 -98 -90 -90 -90 -91 -91 -91 -92 -91 -91 -89 -91 -90 -90 -98 -91 -91 -96 -86 -81 -91 -97 -82 -63 -94 -92 -81 -74 -82 -92 -96 -97 -98 -98 -98 -91 -91 -99 -98 -91 -98 -83 -94 -97 -92 -92 -93 -96 -99 -98 -98 -89 -98 -99 -97 -98 -98 -98 -97 -98 -97 -97 -98 -98 -98 -98 -98 -98 -92 -99 -98 -98 -99 -98 -98 -90 -98 -98 -98 -97 -98 -97 -97 -98 -82 -90 -80 -90 -90 -89 -96 -97 -97 -98 -85 -94 -91 -92 -94 -91 -97 -98 -98 -93 -98 -98 -98 -98 -82 -80 -96 -80 -80 -54 -80 -80 -40 -97 -71 -95 -98 -87 -90 -99 -98 -98 -80 -87 -80 -67 -80 -54 -96 -80 -86 -82 -98 -98 -98 -94 -98 -98 -95 -90 -97 -91 -95 -95 -95 -91 -96 -98 -95 -99 -99 -98 -83 -98 -98 -93 -98 -96 -90 -95 -98 -80 -80 -99 -82 -98 -98 -94 -82 -82 -90 -98 -98 -88 -98 -90 -84 -90 -87 -84 -93 -99 -98 -99 -99 -98 -85 -92 -83 -93 -80 -89 -80 -68 -89 -93 -94 -98 -98 -98 -89 -95 -84 -92 -97 -93 -98 -95 -90 -98 -80 -98 -97 -98 -98 -98 -92 -91 -90 -89 -92 -93 -98 -96 -98 -98 -98 -91 -89 -98 -98 -98 -98 -95 -92 -90 -98 -96 -92 -97 -97 -97 -95 -91 -98 -99 -98 -99 -98 -92 -93 -98 -84 -96 -90 -98 -93 -98 -96 -98 -97 -98 -97 -98 -98 -98 -91 -98 -95 -98 -90 -98 -98 -98 -99 -98 -98 -87 -95 -88 -83 -89 -89 -89 -93 -99 -85 -79 -89 -89 -97 -83 -91 -83 -83 -96 -82 -70 -82 -87 -99 -85 -80 -80 -80 -80 -98 -91 -98 -82 -94 -97 -82 -89 -99 -88 -80 -97 -98 -96 -91 -99 -95 -98 -98 -98 -99 -89 -98 -98 -99 -98 -95 -92 -95 -90 -80 -88 -82 -84 -96 -98 -83 -99 -98 -91 -87 -91 -98 -98 -98 -98 -98 -98 -97 -97 -80 -80 -95 -98 -80 -90 -83 -98 -99 -98 -80 -91 -84 -85 -89 -90 -84 -91 -79 -99 -81 -98 -98 -82 -81 -80 -54 -80 -55 -98 -69 -90 -89 -93 -93 -96 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -93 -99 -98 -96 -96 -98 -98 -98 -98 -91 -91 -98 -98 -97 -98 -98 -98 -96 -98 -99 -98 -96 -99 -96 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -92 -98 -80 -98 -80 -91 -96 -91 -93 -80 -94 -80 -97 -94 -79 -84 -85 -92 -87 -88 -84 -85 -89 -84 -83 -84 -83 -85 -86 -84 -93 -93 -99 -93 -99 -80 -80 -56 -80 -66 -80 -78 -99 -98 -90 -87 -96 -98 -96 -90 -97 -85 -99 -99 -89 -82 -98 -51 -79 -99 -98 -98 -98 -89 -99 -98 -81 -98 -80 -98 -98 -98 -98 -98 -98 -98 -98 -98 -91 -98 -98 -93 -98 -98 -91 -98 -98 -99 -99 -98 -99 -91 -98 -98 -98 -99 -90 -94 -93 -93 -90 -93 -93 -96 -98 -93 -93 -99 -98 -98 -98 -91 -92 -92 -92 -98 -98 -98 -99 -84 -98 -98 -95 -98 -99 -98 -98 -98 -98 -97 -98 -98 -98 -90 -98 -88 -98 -98 -90 -98 -99 -98 -98 -96 -98 -98 -98 -83 -98 -80 -82 -80 -96 -96 -90 -90 -99 -98 -98 -99 -98 -98 -89 -98 -99 -98 -98 -98 -98 -92 -98 -98 -90 -91 -98 -98 -98 -98 -90 -98 -98 -91 -80 -80 -53 -97 -91 -80 -79 -85 -81 -82 -84 -85 -85 -85 -86 -82 -91 -90 -93 -83 -82 -82 -80 -80 -98 -98 -98 -98 -98 -90 -98 -80 -57 -98 -80 -94 -80 -94 -98 -98 -80 -98 -98 -95 -80 -91 -98 -96 -98 -90 -95 -98 -91 -98 -80 -65 -80 -98 -80 -62 -99 -99 -96 -98 -94 -99 -98 -98 -96 -98 -97 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -91 -98 -99 -98 -98 -98 -98 -98 -87 -85 -98 -98 -98 -98 -96 -98 -98 -84 -93 -99 -90 -92 -93 -94 -93 -93 -98 -93 -99 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -80 -98 -80 -80 -89 -80 -95 -83 -83 -85 -98 -98 -98 -80 -96 -92 -98 -99 -89 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -98 -99 -98 -98 -80 -80 -80 -98 -98 -80 -65 -80 -40 -95 -98 -92 -96 -97 -98 -98 -98 -98 -98 -98 -98 -95 -90 -90 -99 -97 -98 -96 -80 -98 -83 -92 -94 -97 -98 -81 -80 -80 -60 -91 -93 -93 -89 -98 -98 -98 -98 -98 -90 -99 -99 -98 -98 -99 -98 -98 -80 -98 -80 -80 -67 -96 -96 -95 -80 -98 -92 -80 -98 -98 -98 -90 -98 -95 -91 -98 -92 -98 -91 -98 -89 -98 -98 -88 -98 -98 -97 -97 -95 -91 -99 -98 -91 -95 -91 -96 -98 -98 -98 -98 -98 -98 -99 -99 -99 -97 -96 -91 -98 -98 -98 -98 -98 -98 -98 -98 -98 -95 -91 -98 -90 -98 -99 -98 -98 -99 -98 -94 -91 -90 -95 -95 -90 -91 -99 -99 -98 -98 -85 -98 -93 -93 -98 -90 -91 -89 -94 -80 -80 -57 -58 -92 -98 -98 -98 -99 -89 -99 -98 -98 -80 -98 -98 -98 -98 -98 -94 -92 -98 -99 -95 -97 -98 -81 -58 -90 -97 -80 -98 -80 -98 -94 -95 -93 -80 -98 -98 -91 -97 -98 -98 -98 -98 -95 -91 -91 -98 -96 -97 -97 -97 -96 -94 -96 -98 -98 -98 -80 -98 -83 -63 -83 -98 -99 -99 -98 -98 -99 -98 -91 -98 -98 -98 -98 -98 -97 -98 -94 -90 -82 -83 -98 -80 -81 -80 -80 -77 -80 -80 -90 -86 -83 -81 -93 -88 -90 -85 -98 -84 -85 -98 -92 -89 -98 -95 -98 -91 -97 -84 -98 -90 -98 -84 -95 -90 -95 -98 -96 -98 -98 -98 -98 -94 -98 -98 -90 -99 -90 -98 -97 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -91 -82 -82 -97 -84 -80 -80 -98 -80 -80 -94 -99 -98 -83 -83 -95 -97 -91 -83 -89 -94 -91 -93 -94 -98 -98 -98 -98 -83 -83 -89 -81 -83 -89 -78 -79 -89 -98 -92 -93 -89 -93 -80 -92 -98 -98 -83 -84 -84 -84 -84 -84 -99 -83 -83 -45 -90 -83 -83 -89 -98 -98 -83 -82 -82 -86 -83 -83 -80 -79 -54 -98 -96 -98 -97 -98 -89 -99 -98 -85 -80 -80 -98 -97 -97 -98 -98 -98 -98 -98 -96 -96 -91 -98 -99 -98 -99 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -93 -98 -90 -96 -99 -84 -85 -97 -92 -91 -89 -90 -86 -88 -90 -91 -90 -87 -91 -91 -99 -98 -97 -98 -93 -98 -98 -98 -98 -95 -98 -98 -80 -99 -94 -80 -98 -98 -89 -91 -94 -81 -98 -98 -89 -90 -98 -98 -88 -98 -98 -99 -98 -98 -98 -98 -97 -97 -98 -98 -97 -98 -99 -98 -97 -98 -98 -93 -99 -80 -80 -98 -83 -83 -83 -82 -83 -98 -80 -80 -80 -98 -98 -95 -98 -98 -96 -98 -97 -98 -98 -90 -99 -98 -98 -98 -98 -80 -80 -79 -80 -80 -49 -98 -83 -83 -99 -98 -84 -93 -99 -91 -92 -91 -94 -94 -94 -95 -91 -94 -93 -94 -94 -95 -94 -94 -93 -94 -94 -94 -94 -94 -94 -83 -94 -91 -83 -83 -83 -83 -46 -82 -82 -98 -83 -82 -83 -98 -98 -89 -92 -98 -98 -97 -98 -99 -98 -98 -99 -98 -98 -97 -98 -96 -98 -83 -82 -80 -79 -81 -80 -80 -57 -99 -80 -80 -98 -99 -91 -96 -96 -99 -91 -90 -97 -96 -90 -98 -98 -98 -90 -97 -98 -97 -98 -97 -98 -99 -90 -95 -88 -90 -98 -89 -90 -98 -90 -93 -89 -89 -84 -88 -87 -85 -85 -94 -98 -93 -98 -93 -99 -98 -98 -89 -98 -98 -98 -98 -98 -90 -85 -93 -98 -80 -93 -80 -84 -98 -95 -91 -97 -98 -98 -90 -98 -80 -80 -96 -79 -79 -99 -98 -96 -96 -98 -92 -94 -98 -98 -90 -98 -97 -98 -98 -97 -84 -98 -99 -96 -96 -80 -80 -80 -91 -80 -81 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -90 -99 -98 -98 -98 -98 -97 -98 -98 -90 -98 -99 -98 -98 -98 -98 -98 -96 -94 -95 -78 -80 -92 -85 -83 -90 -90 -91 -91 -91 -90 -91 -91 -91 -91 -95 -83 -82 -83 -83 -95 -97 -84 -89 -99 -82 -83 -94 -98 -80 -80 -98 -90 -84 -82 -82 -84 -83 -83 -83 -83 -41 -82 -83 -58 -91 -83 -83 -98 -91 -98 -96 -99 -98 -91 -91 -98 -98 -95 -95 -96 -92 -88 -83 -91 -84 -85 -85 -85 -90 -87 -99 -85 -87 -84 -83 -86 -90 -83 -98 -98 -98 -98 -83 -82 -84 -83 -84 -90 -96 -90 -90 -96 -99 -83 -98 -94 -85 -99 -83 -98 -98 -98 -98 -98 -99 -98 -99 -91 -82 -83 -91 -83 -82 -90 -99 -98 -98 -95 -98 -99 -100 -99 -98 -98 -98 -96 -98 -97 -99 -97 -99 -98 -98 -98 -98 -99 -98 -94 -99 -99 -94 -98 -98 -99 -99 -98 -98 -96 -91 -98 -92 -98 -98 -90 -89 -98 -99 -98 -97 -99 -98 -91 -98 -96 -98 -98 -99 -98 -83 -83 -84 -83 -82 -78 -90 -91 -91 -93 -99 -82 -82 -98 -99 -98 -83 -83 -98 -83 -83 -69 -91 -95 -96 -85 -89 -82 -83 -82 -82 -91 -79 -79 -95 -96 -96 -97 -97 -97 -83 -82 -72 -42 -89 -82 -83 -61 -98 -98 -91 -91 -98 -91 -91 -98 -93 -96 -91 -98 -99 -98 -98 -98 -98 -98 -98 -98 -99 -98 -96 -98 -98 -95 -98 -98 -98 -98 -96 -98 -98 -98 -98 -90 -98 -96 -93 -82 -83 -90 -84 -83 -84 -78 -79 -98 -92 -82 -83 -82 -88 -84 -81 -81 -81 -85 -80 -79 -81 -80 -79 -81 -90 -83 -83 -83 -83 -83 -83 -90 -91 -81 -80 -81 -81 -81 -80 -63 -80 -84 -99 -94 -80 -94 -98 -80 -87 -90 -80 -80 -98 -80 -99 -98 -80 -80 -80 -80 -81 -70 -98 -98 -98 -98 -98 -98 -98 -98 -89 -98 -91 -99 -98 -98 -98 -98 -98 -98 -98 -88 -98 -98 -99 -80 -80 -99 -84 -84 -85 -84 -83 -83 -91 -98 -98 -98 -98 -98 -98 -96 -84 -85 -98 -98 -98 -83 -83 -98 -99 -83 -83 -82 -89 -89 -92 -86 -90 -89 -88 -89 -94 -93 -92 -94 -89 -92 -90 -93 -94 -94 -94 -93 -91 -80 -97 -80 -81 -80 -80 -96 -93 -80 -80 -80 -80 -62 -98 -98 -98 -99 -94 -98 -98 -98 -98 -99 -91 -91 -90 -91 -91 -91 -91 -91 -97 -94 -91 -91 -91 -91 -92 -98 -99 -80 -80 -99 -80 -80 -80 -80 -80 -81 -96 -91 -98 -98 -98 -98 -98 -96 -90 -90 -98 -98 -99 -89 -98 -98 -98 -89 -90 -90 -90 -90 -90 -90 -90 -90 -85 -91 -88 -88 -91 -91 -91 -89 -91 -91 -99 -98 -91 -98 -98 -98 -98 -99 -98 -80 -80 -80 -80 -80 -80 -59 -98 -98 -88 -82 -98 -80 -98 -99 -93 -92 -94 -92 -80 -80 -80 -80 -80 -83 -98 -98 -98 -98 -98 -80 -80 -80 -81 -80 -80 -99 -80 -80 -80 -80 -80 -80 -98 -92 -92 -97 -98 -92 -80 -80 -80 -80 -80 -80 -90 -80 -80 -80 -80 -80 -80 -99 -99 -97 -92 -90 -99 -99 -97 -95 -90 -88 -91 -99 -99 -99 -98 -80 -80 -98 -80 -98 -95 -97 -97 -98 -98 -93 -98 -98 -91 -97 -98 -98 -98 -92 -89 -98 -98 -97 -99 -98 -98 -98 -98 -98 -90 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -90 -84 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -90 -98 -98 -84 -98 -91 -99 -84 -98 -90 -99 -84 -84 -84 -94 -94 -80 -80 -79 -80 -80 -80 -92 -81 -80 -78 -81 -78 -79 -82 -91 -91 -91 -94 -98 -94 -98 -84 -84 -84 -84 -84 -82 -83 -84 -89 -89 -90 -92 -99 -83 -83 -83 -80 -80 -83 -91 -82 -84 -83 -83 -84 -84 -97 -80 -80 -80 -80 -80 -80 -98 -98 -96 -98 -98 -96 -98 -90 -89 -80 -80 -80 -81 -80 -80 -85 -96 -96 -92 -94 -92 -80 -81 -80 -81 -81 -81 -98 -98 -89 -81 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -97 -80 -80 -80 -79 -80 -80 -98 -91 -98 -80 -80 -80 -80 -81 -79 -62 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -85 -98 -98 -98 -92 -80 -80 -80 -80 -80 -82 -80 -80 -80 -80 -80 -80 -91 -88 -96 -98 -91 -98 -99 -98 -98 -98 -98 -98 -96 -98 -98 -98 -99 -98 -99 -98 -98 -99 -98 -98 -98 -92 -98 -98 -93 -98 -98 -98 -80 -81 -80 -80 -80 -80 -83 -83 -83 -83 -84 -83 -91 -45 -84 -83 -81 -82 -82 -82 -86 -79 -79 -79 -79 -79 -80 -84 -81 -82 -85 -85 -89 -98 -98 -98 -98 -98 -98 -41 -83 -84 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -97 -80 -99 -80 -90 -98 -80 -80 -96 -95 -81 -80 -98 -90 -85 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -98 -98 -92 -82 -83 -83 -83 -83 -83 -68 -84 -83 -83 -83 -83 -83 -49 -83 -82 -83 -82 -83 -83 -84 -84 -83 -84 -83 -83 -72 -83 -83 -83 -83 -83 -81 -83 -80 -80 -80 -80 -80 -60 -81 -81 -81 -81 -81 -81 -91 -91 -90 -90 -80 -80 -80 -80 -80 -80 -91 -98 -80 -80 -80 -80 -80 -80 -87 -80 -80 -80 -80 -80 -80 -98 -84 -84 -84 -84 -83 -83 -97 -98 -92 -98 -89 -98 -98 -98 -97 -99 -99 -98 -98 -98 -98 -98 -99 -96 -98 -98 -98 -83 -83 -83 -83 -83 -83 -98 -84 -83 -83 -84 -84 -84 -68 -98 -98 -98 -98 -98 -98 -98 -99 -98 -90 -98 -98 -99 -98 -98 -97 -97 -98 -84 -84 -85 -85 -85 -85 -85 -85 -85 -84 -84 -91 -91 -98 -97 -91 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -99 -98 -98 -98 -92 -99 -98 -98 -98 -91 -98 -83 -82 -83 -83 -83 -83 -95 -84 -85 -91 -91 -98 -96 -96 -86 -82 -83 -83 -83 -83 -70 -83 -83 -83 -83 -83 -83 -98 -81 -82 -83 -83 -83 -83 -86 -80 -80 -79 -80 -80 -65 -90 -96 -80 -80 -80 -80 -80 -80 -90 -80 -80 -80 -80 -80 -80 -96 -96 -49 -90 -80 -80 -80 -80 -80 -80 -81 -77 -98 -97 -97 -98 -98 -98 -94 -98 -98 -98 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -72 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -97 -99 -98 -98 -97 -98 -99 -99 -99 -98 -98 -98 -98 -98 -90 -99 -99 -99 -98 -98 -97 -98 -98 -84 -90 -98 -98 -99 -98 -98 -98 -98 -86 -98 -90 -91 -98 -91 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -98 -98 -98 -80 -80 -80 -80 -80 -80 -74 -93 -80 -80 -80 -80 -80 -81 -98 -90 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -98 -98 -98 -96 -98 -98 -96 -93 -98 -86 -78 -98 -98 -98 -98 -81 -81 -80 -81 -81 -81 -98 -94 -80 -80 -80 -80 -81 -83 -97 -83 -84 -83 -83 -84 -84 -98 -96 -83 -82 -82 -83 -83 -83 -91 -97 -96 -89 -94 -98 -97 -91 -98 -98 -98 -98 -98 -98 -98 -99 -98 -96 -91 -97 -99 -98 -98 -95 -96 -98 -91 -98 -98 -86 -98 -83 -83 -83 -83 -83 -84 -98 -80 -80 -79 -79 -80 -80 -91 -80 -80 -80 -80 -80 -80 -60 -99 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -50 -81 -83 -84 -80 -83 -82 -97 -94 -83 -80 -80 -81 -80 -80 -80 -98 -91 -90 -89 -90 -90 -96 -84 -98 -98 -97 -98 -93 -98 -88 -92 -89 -90 -90 -96 -90 -88 -87 -96 -85 -91 -89 -80 -80 -80 -80 -80 -80 -97 -90 -91 -80 -80 -80 -80 -81 -80 -62 -88 -90 -80 -94 -94 -94 -91 -93 -92 -94 -94 -94 -84 -99 -80 -79 -95 -81 -98 -82 -80 -80 -80 -80 -80 -80 -99 -98 -80 -81 -81 -81 -81 -81 -94 -97 -97 -94 -98 -95 -97 -95 -91 -96 -83 -84 -83 -84 -84 -84 -96 -92 -91 -83 -82 -82 -83 -83 -83 -96 -93 -96 -80 -80 -80 -80 -80 -80 -82 -81 -80 -81 -80 -81 -88 -90 -92 -85 -91 -91 -91 -91 -90 -94 -94 -93 -95 -96 -84 -83 -83 -83 -83 -83 -97 -94 -94 -90 -92 -94 -94 -94 -95 -96 -98 -91 -98 -80 -80 -81 -80 -80 -80 -91 -83 -84 -84 -84 -83 -84 -97 -84 -84 -84 -83 -83 -83 -93 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -53 -98 -98 -98 -90 -83 -83 -78 -76 -98 -98 -98 -98 -67 -83 -83 -83 -82 -82 -83 -95 -82 -98 -98 -91 -97 -96 -91 -92 -82 -98 -98 -83 -82 -83 -81 -83 -82 -83 -88 -82 -82 -82 -82 -83 -83 -96 -90 -98 -89 -98 -89 -90 -89 -89 -99 -98 -98 -90 -98 -98 -98 -96 -97 -90 -83 -83 -83 -83 -82 -83 -83 -83 -83 -84 -83 -83 -64 -94 -96 -99 -98 -98 -98 -98 -98 -98 -91 -95 -98 -98 -98 -98 -98 -98 -98 -85 -93 -99 -89 -93 -93 -99 -98 -98 -98 -91 -99 -90 -98 -98 -98 -98 -98 -91 -98 -83 -83 -83 -83 -83 -83 -98 -83 -96 -98 -98 -98 -98 -98 -83 -83 -83 -83 -83 -83 -94 -80 -80 -80 -80 -80 -80 -62 -98 -80 -81 -80 -81 -81 -81 -97 -98 -56 -97 -96 -80 -80 -81 -80 -80 -80 -98 -84 -84 -84 -83 -84 -84 -98 -98 -99 -84 -83 -83 -83 -83 -82 -83 -82 -83 -83 -83 -83 -98 -97 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -93 -89 -91 -98 -99 -82 -83 -83 -84 -83 -83 -90 -84 -83 -83 -83 -83 -83 -99 -84 -45 -98 -98 -96 -93 -98 -98 -98 -99 -83 -83 -84 -83 -83 -83 -95 -83 -83 -83 -83 -83 -83 -98 -96 -90 -95 -79 -80 -80 -80 -80 -80 -98 -98 -98 -98 -83 -83 -84 -84 -84 -84 -98 -84 -83 -83 -83 -83 -83 -85 -83 -83 -83 -83 -83 -83 -98 -98 -90 -98 -98 -98 -98 -98 -96 -99 -98 -90 -98 -98 -98 -98 -98 -98 -83 -83 -83 -82 -83 -82 -69 -83 -82 -83 -83 -83 -82 -91 -92 -91 -91 -98 -98 -98 -96 -89 -99 -98 -82 -98 -90 -99 -98 -98 -98 -83 -83 -83 -83 -83 -83 -85 -81 -80 -80 -80 -80 -65 -91 -81 -81 -81 -80 -80 -77 -90 -98 -98 -98 -98 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -99 -98 -99 -85 -80 -80 -80 -81 -80 -63 -81 -80 -80 -81 -80 -80 -95 -98 -97 -97 -84 -84 -84 -79 -80 -80 -81 -81 -81 -84 -83 -83 -83 -84 -84 -83 -98 -83 -83 -83 -83 -83 -83 -99 -98 -99 -98 -97 -99 -98 -98 -98 -84 -98 -95 -96 -90 -90 -98 -98 -98 -98 -98 -99 -99 -91 -98 -84 -83 -83 -82 -84 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -82 -99 -83 -83 -83 -83 -83 -83 -71 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -92 -82 -83 -82 -82 -83 -77 -55 -94 -76 -84 -84 -92 -84 -88 -78 -97 -64 -98 -97 -98 -89 -93 -93 -90 -93 -91 -97 -91 -98 -99 -98 -83 -81 -83 -83 -83 -83 -95 -89 -89 -80 -81 -81 -81 -81 -81 -89 -98 -98 -90 -80 -80 -81 -80 -81 -80 -81 -90 -83 -83 -83 -83 -83 -83 -94 -87 -83 -83 -83 -83 -82 -65 -85 -83 -82 -82 -80 -81 -83 -75 -98 -91 -80 -79 -79 -80 -79 -81 -98 -98 -87 -98 -93 -93 -94 -81 -80 -80 -79 -80 -80 -92 -89 -96 -94 -82 -83 -83 -82 -83 -83 -85 -83 -83 -83 -82 -83 -66 -91 -77 -77 -82 -80 -94 -87 -80 -80 -80 -80 -80 -80 -82 -89 -89 -91 -81 -80 -80 -80 -80 -79 -89 -80 -80 -80 -80 -80 -80 -89 -83 -83 -83 -83 -83 -85 -91 -98 -98 -96 -99 -98 -81 -81 -81 -81 -81 -81 -99 -94 -98 -83 -98 -98 -90 -57 -82 -82 -82 -83 -83 -83 -92 -82 -83 -83 -83 -82 -83 -98 -94 -82 -81 -83 -83 -83 -84 -64 -64 -83 -82 -65 -77 -83 -83 -99 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -40 -79 -98 -80 -80 -80 -80 -80 -80 -62 -84 -90 -93 -93 -41 -85 -98 -89 -90 -98 -98 -98 -98 -98 -98 -85 -99 -96 -98 -98 -98 -98 -92 -99 -99 -76 -98 -98 -98 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -48 -90 -92 -98 -98 -98 -94 -94 -98 -97 -84 -97 -90 -90 -90 -98 -98 -97 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -94 -91 -87 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -65 -80 -79 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -41 -94 -80 -80 -80 -80 -81 -81 -81 -81 -81 -81 -80 -81 -96 -92 -94 -83 -83 -83 -83 -83 -84 -83 -83 -83 -84 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -76 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -57 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -82 -92 -83 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -96 -79 -80 -80 -79 -80 -81 -80 -81 -80 -80 -81 -81 -98 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -83 -82 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -41 -84 -83 -83 -82 -83 -83 -83 -83 -84 -83 -83 -83 -88 -90 -88 -80 -80 -79 -80 -80 -79 -79 -79 -76 -81 -81 -80 -94 -98 -41 -83 -83 -84 -84 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -77 -83 -98 -94 -84 -98 -88 -93 -82 -85 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -90 -93 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -94 -94 -83 -83 -76 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -68 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -60 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -94 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -54 -94 -97 -86 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -84 -55 -82 -82 -83 -82 -83 -80 -80 -80 -81 -81 -80 -82 -84 -84 -76 -79 -80 -79 -79 -81 -80 -80 -80 -80 -80 -80 -95 -95 -93 -84 -84 -84 -83 -83 -83 -83 -84 -83 -84 -84 -83 -63 -84 -95 -92 -99 -98 -96 -98 -90 -89 -83 -91 -97 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -82 -83 -95 -95 -94 -98 -82 -83 -82 -82 -83 -82 -83 -82 -82 -82 -83 -83 -99 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -82 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -84 -84 -78 -83 -83 -84 -84 -84 -84 -82 -83 -82 -92 -99 -82 -83 -83 -83 -83 -82 -83 -82 -83 -83 -83 -83 -41 -94 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -91 -91 -89 -90 -93 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -82 -82 -91 -80 -80 -80 -79 -78 -80 -80 -79 -80 -78 -81 -80 -96 -87 -91 -98 -91 -98 -98 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -89 -90 -90 -89 -90 -91 -90 -90 -90 -89 -91 -86 -78 -98 -99 -99 -98 -98 -99 -98 -99 -98 -98 -98 -98 -98 -56 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -80 -82 -95 -97 -96 -91 -82 -90 -98 -87 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -43 -80 -80 -81 -80 -80 -79 -81 -81 -81 -81 -81 -81 -75 -98 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -88 -88 -91 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -68 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -90 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -88 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -83 -90 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -88 -90 -96 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -67 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -90 -99 -98 -98 -98 -98 -98 -98 -96 -98 -92 -98 -98 -98 -98 -91 -98 -99 -98 -97 -98 -98 -99 -98 -89 -98 -98 -83 -82 -83 -83 -83 -80 -82 -82 -82 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -80 -82 -82 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -84 -93 -97 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -72 -82 -83 -83 -82 -82 -82 -82 -82 -81 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -48 -83 -83 -83 -80 -82 -83 -82 -83 -82 -83 -82 -83 -84 -83 -83 -83 -83 -83 -82 -82 -81 -82 -82 -83 -83 -81 -83 -77 -83 -83 -83 -82 -83 -83 -83 -83 -83 -51 -98 -98 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -56 -93 -80 -80 -90 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -91 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -91 -41 -98 -98 -98 -98 -99 -89 -98 -98 -98 -98 -98 -98 -98 -98 -78 -97 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -91 -80 -99 -98 -98 -98 -98 -98 -94 -98 -98 -98 -99 -93 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -90 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -47 -92 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -81 -41 -84 -83 -83 -83 -84 -83 -84 -84 -84 -83 -83 -84 -98 -83 -83 -83 -82 -83 -82 -82 -82 -82 -82 -82 -82 -96 -83 -55 -90 -90 -82 -83 -82 -83 -82 -82 -83 -83 -83 -83 -83 -82 -98 -98 -95 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -81 -85 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -90 -98 -83 -83 -84 -84 -83 -84 -84 -83 -84 -83 -84 -84 -50 -83 -83 -83 -83 -83 -83 -83 -80 -82 -83 -83 -83 -84 -83 -83 -83 -78 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -58 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -84 -83 -83 -83 -83 -83 -83 -83 -83 -84 -83 -83 -83 -99 -84 -84 -83 -84 -83 -84 -83 -83 -83 -80 -80 -80 -80 -80 -98 -84 -83 -81 -81 -80 -81 -82 -81 -81 -83 -83 -84 -83 -83 -82 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -95 -94 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -94 -99 -89 -92 -98 -98 -95 -96 -95 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -94 -94 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -94 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -81 -98 -80 -80 -80 -80 -80 -77 -80 -80 -80 -80 -80 -80 -93 -94 -81 -98 -98 -83 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -89 -92 -43 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -65 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -71 -83 -83 -83 -84 -83 -83 -83 -83 -83 -82 -81 -83 -40 -98 -93 -81 -80 -80 -80 -78 -79 -79 -80 -80 -80 -80 -80 -42 -92 -80 -80 -79 -79 -80 -79 -78 -79 -79 -81 -80 -80 -84 -84 -78 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -94 -94 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -82 -82 -41 -88 -88 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -89 -69 -98 -99 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -97 -89 -89 -90 -96 -96 -96 -97 -98 -98 -98 -98 -98 -98 -96 -99 -90 -98 -96 -90 -91 -96 -98 -98 -97 -90 -90 -92 -90 -99 -98 -98 -98 -98 -98 -84 -98 -84 -98 -90 -99 -98 -98 -97 -78 -93 -92 -92 -93 -98 -98 -98 -98 -97 -98 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -83 -83 -47 -83 -83 -82 -82 -83 -83 -83 -83 -82 -83 -83 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -47 -92 -94 -93 -98 -98 -80 -99 -83 -82 -83 -84 -83 -83 -83 -82 -83 -82 -82 -82 -60 -94 -91 -46 -91 -90 -92 -91 -82 -83 -83 -92 -89 -88 -91 -92 -92 -95 -89 -92 -91 -92 -91 -66 -96 -93 -82 -92 -93 -41 -90 -93 -93 -93 -84 -98 -92 -83 -95 -83 -83 -82 -98 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -99 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -41 -83 -92 -99 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -82 -77 -99 -98 -99 -98 -77 -83 -83 -83 -98 -83 -83 -83 -83 -84 -83 -84 -84 -83 -83 -83 -83 -83 -41 -83 -83 -80 -80 -83 -80 -80 -82 -83 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -81 -83 -83 -83 -83 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -61 -95 -89 -83 -79 -79 -80 -78 -80 -79 -79 -79 -80 -79 -79 -79 -40 -89 -88 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -83 -82 -79 -78 -84 -85 -85 -85 -85 -84 -88 -83 -90 -90 -83 -84 -83 -95 -91 -41 -83 -83 -83 -84 -84 -83 -83 -83 -81 -80 -83 -83 -83 -90 -83 -82 -83 -83 -82 -83 -83 -84 -83 -81 -83 -83 -41 -83 -82 -82 -80 -83 -81 -83 -80 -80 -81 -81 -83 -90 -58 -95 -47 -96 -52 -53 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -98 -84 -98 -86 -80 -80 -80 -80 -80 -80 -76 -80 -80 -80 -80 -80 -81 -94 -93 -93 -80 -80 -81 -80 -81 -80 -80 -78 -79 -79 -79 -80 -92 -94 -83 -92 -96 -98 -83 -83 -82 -83 -83 -83 -83 -83 -82 -83 -82 -83 -46 -84 -83 -83 -83 -83 -83 -83 -83 -83 -81 -83 -83 -95 -83 -94 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -96 -85 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -99 -83 -83 -83 -83 -83 -83 -83 -82 -83 -81 -81 -82 -82 -82 -81 -83 -82 -83 -84 -84 -83 -84 -84 -83 -73 -91 -98 -98 -98 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -40 -81 -99 -82 -81 -81 -80 -80 -80 -80 -80 -81 -80 -81 -80 -80 -78 -93 -98 -83 -84 -84 -84 -84 -84 -83 -84 -83 -84 -84 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -97 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -64 -97 -99 -98 -84 -98 -98 -98 -98 -80 -80 -81 -80 -81 -81 -81 -81 -81 -80 -80 -80 -60 -93 -83 -81 -81 -81 -81 -80 -80 -80 -81 -81 -81 -81 -64 -96 -81 -83 -81 -80 -80 -80 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -80 -81 -81 -81 -81 -99 -95 -93 -93 -93 -96 -98 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -97 -80 -80 -80 -81 -80 -80 -80 -80 -81 -81 -81 -81 -80 -96 -92 -98 -86 -83 -82 -83 -82 -83 -82 -83 -82 -82 -82 -82 -82 -93 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -94 -93 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -85 -89 -91 -98 -84 -83 -83 -84 -83 -83 -84 -83 -83 -83 -83 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -84 -83 -84 -97 -84 -83 -84 -84 -81 -84 -83 -83 -83 -84 -84 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -84 -84 -84 -64 -93 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -55 -96 -84 -84 -84 -84 -84 -84 -83 -83 -84 -84 -84 -84 -41 -98 -91 -97 -98 -98 -98 -98 -91 -98 -98 -98 -96 -98 -99 -99 -98 -98 -98 -98 -97 -98 -98 -99 -98 -93 -99 -98 -84 -84 -84 -84 -84 -84 -84 -84 -83 -84 -84 -83 -92 -84 -84 -84 -83 -81 -81 -82 -83 -83 -83 -83 -83 -90 -98 -98 -85 -83 -84 -84 -84 -84 -83 -84 -84 -84 -84 -83 -53 -92 -98 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -96 -98 -97 -92 -98 -81 -83 -81 -99 -98 -81 -81 -80 -81 -80 -80 -81 -80 -81 -81 -80 -81 -41 -92 -98 -99 -98 -98 -97 -98 -98 -98 -98 -99 -98 -99 -98 -96 -91 -91 -98 -96 -92 -91 -91 -98 -95 -98 -92 -98 -99 -94 -99 -99 -98 -93 -99 -98 -98 -98 -99 -99 -98 -84 -84 -98 -99 -99 -93 -98 -98 -98 -80 -98 -98 -91 -98 -98 -98 -91 -98 -98 -98 -97 -98 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -87 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -91 -97 -98 -83 -83 -83 -83 -84 -83 -84 -83 -83 -84 -84 -84 -41 -83 -83 -83 -83 -82 -83 -83 -83 -83 -84 -84 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -79 -79 -78 -78 -64 -96 -90 -90 -91 -95 -91 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -78 -81 -91 -98 -84 -84 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -98 -83 -82 -83 -83 -82 -82 -82 -83 -83 -82 -80 -83 -55 -88 -89 -99 -95 -88 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -92 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -84 -83 -83 -83 -83 -84 -83 -84 -83 -83 -46 -96 -83 -83 -83 -83 -82 -83 -81 -83 -83 -83 -83 -83 -83 -83 -81 -83 -83 -83 -83 -83 -83 -83 -83 -78 -89 -82 -81 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -85 -94 -96 -98 -98 -91 -91 -91 -91 -90 -83 -82 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -41 -83 -83 -82 -83 -83 -82 -83 -83 -83 -83 -82 -83 -86 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -85 -98 -80 -85 -98 -87 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -54 -80 -80 -80 -80 -81 -81 -81 -80 -80 -80 -81 -81 -98 -80 -80 -81 -80 -81 -80 -81 -80 -80 -81 -80 -80 -98 -96 -95 -98 -92 -90 -93 -96 -89 -98 -81 -80 -81 -81 -80 -80 -80 -80 -80 -80 -80 -80 -98 -81 -83 -83 -82 -83 -83 -83 -83 -83 -82 -82 -82 -41 -96 -91 -95 -92 -91 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -99 -97 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -93 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -98 -98 -97 -96 -96 -90 -90 -90 -99 -98 -98 -98 -98 -99 -96 -98 -98 -98 -99 -99 -98 -98 -98 -98 -90 -99 -98 -98 -98 -98 -96 -91 -88 -88 -88 -86 -87 -89 -90 -97 -89 -87 -88 -89 -94 -81 -93 -93 -97 -84 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -83 -82 -79 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -89 -82 -98 -96 -98 -99 -93 -99 -98 -98 -98 -82 -98 -98 -93 -82 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -78 -80 -80 -81 -80 -80 -81 -80 -80 -78 -81 -81 -81 -93 -91 -95 -83 -82 -83 -82 -83 -82 -83 -83 -82 -83 -82 -83 -91 -91 -91 -91 -91 -94 -98 -87 -91 -91 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -48 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -90 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -78 -80 -81 -80 -80 -80 -80 -80 -77 -81 -80 -80 -80 -93 -91 -83 -82 -82 -82 -83 -82 -83 -82 -83 -82 -82 -82 -65 -99 -98 -98 -90 -97 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -94 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -83 -82 -83 -96 -96 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -89 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -83 -80 -78 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -57 -91 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -75 -91 -80 -91 -98 -97 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -76 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -85 -90 -98 -91 -98 -98 -97 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -96 -93 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -94 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -96 -91 -83 -95 -94 -91 -94 -98 -93 -93 -98 -98 -94 -98 -98 -98 -98 -98 -98 -98 -98 -98 -96 -94 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -96 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -81 -80 -80 -80 -41 -93 -98 -73 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -83 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -40 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -81 -41 -82 -82 -82 -82 -82 -82 -82 -79 -82 -81 -82 -82 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -57 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -55 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -59 -98 -99 -98 -98 -98 -91 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -98 -91 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -90 -97 -81 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -41 -94 -90 -88 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -92 -89 -95 -98 -98 -98 -96 -96 -80 -91 -80 -80 -81 -80 -81 -80 -80 -80 -80 -80 -80 -82 -80 -80 -80 -81 -80 -80 -80 -81 -80 -81 -81 -81 -63 -98 -95 -95 -96 -93 -93 -96 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -96 -98 -92 -81 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -81 -74 -81 -81 -80 -80 -79 -79 -80 -81 -81 -81 -81 -79 -93 -98 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -83 -91 -91 -98 -97 -96 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -95 -82 -82 -82 -81 -82 -82 -82 -83 -82 -83 -82 -82 -91 -94 -82 -82 -82 -82 -83 -81 -82 -82 -81 -80 -82 -82 -50 -97 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -80 -99 -80 -80 -81 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -41 -95 -97 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -83 -83 -82 -82 -93 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -98 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -96 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -79 -79 -86 -98 -89 -82 -83 -83 -83 -82 -83 -82 -83 -83 -83 -82 -82 -70 -94 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -95 -94 -97 -87 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -83 -83 -83 -83 -83 -83 -82 -82 -95 -94 -94 -98 -92 -99 -98 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -79 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -78 -82 -41 -90 -90 -88 -90 -90 -89 -90 -90 -90 -91 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -96 -85 -80 -81 -80 -81 -81 -81 -80 -81 -80 -81 -81 -60 -81 -81 -80 -80 -80 -80 -81 -81 -80 -81 -80 -81 -57 -80 -80 -81 -81 -81 -80 -80 -81 -80 -80 -80 -80 -98 -98 -85 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -81 -70 -80 -80 -80 -80 -80 -81 -80 -81 -80 -81 -80 -81 -91 -91 -90 -90 -80 -80 -80 -79 -79 -80 -80 -80 -80 -79 -80 -80 -86 -85 -84 -85 -81 -83 -83 -83 -83 -84 -83 -84 -83 -83 -83 -84 -61 -97 -98 -89 -98 -98 -67 -83 -82 -82 -83 -98 -93 -99 -83 -82 -83 -98 -82 -82 -82 -82 -83 -83 -82 -82 -82 -82 -82 -82 -83 -82 -83 -82 -82 -82 -82 -82 -82 -82 -83 -83 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -78 -80 -80 -80 -80 -80 -80 -41 -94 -94 -94 -95 -92 -95 -86 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -86 -94 -68 -80 -73 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -67 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -64 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -98 -90 -93 -98 -89 -80 -80 -80 -80 -81 -79 -80 -80 -81 -80 -81 -80 -91 -96 -78 -76 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -98 -82 -82 -82 -82 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -75 -98 -50 -90 -94 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -99 -81 -80 -80 -80 -80 -80 -80 -80 -80 -79 -81 -80 -98 -82 -82 -82 -82 -80 -80 -82 -83 -82 -82 -80 -81 -91 -78 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -87 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -94 -94 -94 -80 -81 -81 -80 -81 -81 -81 -81 -81 -80 -80 -80 -80 -48 -95 -92 -80 -80 -80 -81 -80 -81 -81 -80 -80 -81 -80 -80 -84 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -97 -99 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -78 -79 -80 -80 -80 -79 -79 -79 -79 -79 -80 -85 -83 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -80 -80 -82 -81 -82 -82 -82 -82 -40 -82 -86 -88 -99 -80 -82 -82 -83 -82 -82 -82 -81 -82 -82 -82 -80 -81 -85 -80 -80 -80 -79 -80 -80 -80 -79 -80 -80 -80 -80 -90 -82 -98 -98 -74 -82 -82 -81 -82 -80 -82 -83 -80 -80 -82 -82 -68 -82 -83 -82 -80 -82 -82 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -81 -81 -82 -80 -82 -82 -82 -92 -78 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -80 -90 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -77 -82 -67 -82 -82 -82 -81 -82 -81 -82 -82 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -82 -80 -80 -80 -80 -80 -80 -80 -77 -80 -80 -80 -62 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -85 -84 -91 -85 -84 -84 -84 -79 -89 -92 -90 -96 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -90 -63 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -93 -82 -94 -88 -82 -98 -86 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -67 -96 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -84 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -68 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -98 -82 -82 -82 -82 -82 -82 -82 -82 -83 -81 -82 -82 -41 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -85 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -55 -80 -80 -80 -80 -80 -80 -79 -79 -79 -80 -80 -79 -79 -85 -81 -82 -82 -83 -82 -82 -82 -83 -82 -82 -83 -82 -90 -88 -98 -98 -67 -80 -80 -80 -80 -81 -80 -81 -80 -80 -80 -80 -79 -80 -83 -98 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -82 -80 -80 -80 -80 -81 -81 -80 -80 -80 -80 -80 -80 -80 -97 -90 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -81 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -96 -94 -94 -94 -94 -80 -80 -80 -80 -80 -80 -78 -80 -80 -80 -80 -80 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -81 -80 -80 -80 -80 -80 -80 -98 -98 -98 -98 -97 -98 -99 -98 -99 -98 -47 -96 -96 -97 -92 -92 -98 -98 -91 -98 -99 -96 -98 -99 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -90 -80 -80 -80 -80 -80 -80 -77 -81 -80 -81 -80 -80 -93 -89 -89 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -77 -83 -83 -83 -83 -83 -82 -82 -82 -83 -83 -82 -83 -94 -88 -83 -94 -98 -98 -99 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -83 -83 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -83 -83 -82 -83 -82 -83 -83 -82 -83 -82 -82 -82 -89 -92 -80 -80 -80 -80 -80 -80 -77 -80 -80 -80 -80 -80 -94 -94 -95 -94 -94 -94 -94 -94 -98 -98 -99 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -93 -87 -98 -99 -98 -98 -92 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -98 -83 -82 -83 -83 -82 -82 -83 -82 -82 -82 -82 -83 -94 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -80 -82 -82 -81 -81 -82 -82 -82 -82 -82 -82 -82 -78 -51 -92 -94 -97 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -51 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -98 -98 -87 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -97 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -42 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -87 -98 -98 -84 -98 -98 -99 -98 -99 -97 -98 -99 -91 -80 -80 -80 -80 -80 -80 -91 -98 -98 -99 -98 -99 -93 -98 -98 -98 -95 -98 -98 -98 -97 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -56 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -55 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -95 -94 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -78 -83 -83 -83 -82 -82 -82 -82 -83 -83 -83 -82 -97 -90 -93 -96 -90 -41 -80 -80 -80 -80 -80 -80 -80 -80 -81 -79 -80 -80 -101 -83 -98 -82 -98 -83 -83 -81 -82 -82 -82 -81 -82 -82 -82 -82 -82 -41 -81 -81 -82 -82 -82 -82 -82 -82 -82 -82 -83 -81 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -89 -92 -80 -80 -80 -80 -80 -80 -78 -80 -80 -80 -80 -80 -95 -83 -97 -84 -92 -98 -96 -87 -96 -90 -89 -80 -79 -77 -80 -80 -80 -80 -80 -80 -80 -80 -80 -84 -85 -93 -91 -91 -91 -91 -91 -91 -97 -80 -97 -82 -95 -41 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -92 -82 -82 -82 -82 -82 -82 -83 -83 -82 -83 -83 -85 -87 -82 -82 -82 -83 -82 -83 -83 -82 -83 -82 -83 -83 -93 -82 -82 -82 -82 -83 -82 -82 -82 -82 -83 -82 -82 -41 -83 -82 -82 -82 -82 -82 -82 -82 -83 -82 -83 -83 -90 -82 -82 -82 -82 -79 -80 -81 -81 -81 -81 -82 -82 -93 -91 -94 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -79 -80 -77 -82 -78 -98 -80 -97 -91 -99 -87 -55 -82 -82 -82 -82 -81 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -49 -97 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -44 -82 -82 -82 -82 -82 -82 -82 -80 -82 -82 -82 -82 -98 -98 -91 -78 -93 -98 -91 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -92 -91 -91 -96 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -98 -94 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -63 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -70 -98 -97 -82 -81 -81 -81 -82 -82 -82 -81 -82 -82 -81 -81 -82 -88 -84 -87 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -71 -87 -98 -98 -98 -99 -95 -99 -98 -99 -98 -98 -83 -98 -95 -98 -98 -98 -98 -97 -94 -98 -82 -82 -82 -82 -82 -82 -83 -82 -83 -80 -80 -82 -82 -79 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -90 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -91 -66 -66 -76 -83 -94 -94 -95 -94 -94 -95 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -82 -80 -79 -79 -80 -80 -80 -80 -80 -80 -80 -80 -93 -83 -82 -82 -83 -83 -83 -83 -83 -83 -82 -82 -82 -41 -98 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -41 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -88 -90 -90 -80 -93 -84 -81 -81 -82 -81 -77 -82 -82 -82 -82 -83 -82 -82 -98 -98 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -91 -91 -78 -80 -98 -83 -91 -82 -98 -99 -82 -86 -85 -98 -83 -83 -83 -83 -82 -82 -82 -82 -83 -82 -83 -82 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -92 -85 -81 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -77 -83 -80 -80 -80 -80 -78 -80 -81 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -94 -94 -96 -94 -94 -94 -94 -94 -83 -82 -82 -82 -82 -83 -83 -83 -82 -83 -82 -82 -41 -83 -96 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -98 -98 -98 -87 -97 -83 -82 -82 -82 -83 -82 -83 -83 -82 -83 -83 -82 -99 -82 -82 -83 -82 -83 -83 -82 -83 -82 -82 -82 -82 -97 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -89 -65 -85 -79 -84 -79 -79 -78 -81 -81 -80 -80 -80 -80 -80 -80 -80 -96 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -94 -98 -95 -84 -77 -84 -89 -84 -84 -83 -83 -82 -83 -83 -82 -83 -82 -82 -82 -83 -61 -85 -98 -82 -83 -83 -83 -83 -83 -82 -82 -82 -82 -82 -83 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -85 -80 -80 -80 -81 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -41 -78 -81 -81 -80 -81 -80 -80 -80 -80 -80 -81 -80 -80 -73 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -91 -88 -91 -91 -65 -81 -80 -80 -80 -81 -80 -80 -80 -80 -81 -80 -80 -80 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -78 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -82 -83 -83 -81 -83 -82 -82 -83 -80 -80 -80 -80 -80 -80 -80 -80 -94 -80 -80 -82 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -98 -98 -94 -98 -98 -96 -98 -98 -93 -99 -98 -85 -80 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -68 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -93 -98 -98 -98 -98 -78 -94 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -91 -95 -95 -95 -97 -92 -94 -82 -96 -94 -95 -99 -87 -83 -82 -83 -82 -83 -82 -82 -82 -82 -82 -82 -82 -41 -98 -82 -83 -82 -83 -83 -82 -83 -83 -82 -83 -82 -82 -99 -82 -82 -82 -83 -82 -82 -83 -82 -82 -82 -82 -82 -83 -83 -83 -82 -83 -82 -82 -82 -82 -82 -82 -82 -63 -82 -82 -82 -82 -82 -82 -82 -82 -83 -83 -83 -81 -90 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -81 -78 -98 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -81 -81 -41 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -94 -83 -94 -98 -81 -90 -98 -98 -94 -98 -90 -90 -89 -80 -80 -81 -81 -80 -81 -81 -80 -80 -80 -80 -80 -81 -96 -83 -83 -83 -83 -84 -84 -83 -84 -84 -83 -83 -83 -98 -98 -48 -80 -81 -81 -80 -81 -80 -80 -81 -80 -80 -81 -81 -94 -80 -80 -80 -81 -79 -80 -80 -80 -80 -80 -81 -80 -95 -78 -83 -83 -83 -83 -82 -83 -83 -82 -83 -83 -83 -83 -82 -82 -82 -82 -83 -82 -82 -82 -83 -82 -83 -41 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -85 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -98 -98 -41 -83 -82 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -57 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -40 -90 -82 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -85 -90 -90 -91 -90 -90 -79 -86 -84 -85 -84 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -45 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -45 -94 -89 -94 -85 -94 -80 -99 -98 -98 -98 -80 -96 -96 -90 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -71 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -79 -80 -80 -80 -80 -80 -41 -80 -77 -81 -80 -81 -81 -81 -80 -81 -81 -80 -80 -95 -94 -46 -95 -95 -95 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -44 -95 -94 -94 -94 -80 -47 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -97 -96 -98 -90 -90 -89 -90 -82 -90 -90 -90 -92 -90 -89 -89 -88 -77 -80 -80 -81 -81 -81 -81 -81 -81 -81 -80 -80 -56 -61 -59 -98 -98 -98 -98 -98 -94 -99 -98 -98 -99 -98 -83 -88 -87 -83 -83 -83 -83 -82 -83 -83 -83 -82 -83 -83 -83 -90 -99 -98 -98 -98 -83 -83 -83 -83 -82 -82 -82 -83 -82 -83 -82 -82 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -76 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -98 -98 -81 -82 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -97 -94 -94 -96 -94 -94 -95 -95 -94 -94 -94 -94 -95 -95 -95 -94 -94 -94 -94 -95 -94 -94 -95 -94 -92 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -90 -98 -90 -97 -41 -83 -83 -83 -83 -82 -83 -83 -83 -83 -82 -83 -82 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -82 -80 -80 -80 -80 -80 -78 -78 -79 -79 -79 -79 -84 -82 -82 -77 -82 -83 -80 -81 -82 -81 -82 -81 -81 -85 -85 -90 -91 -86 -86 -86 -83 -98 -98 -98 -98 -88 -80 -94 -80 -98 -97 -80 -89 -98 -96 -91 -80 -99 -98 -91 -97 -93 -86 -75 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -94 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -66 -80 -80 -80 -80 -80 -80 -80 -77 -80 -80 -80 -80 -97 -49 -94 -94 -94 -96 -96 -95 -96 -95 -95 -95 -95 -94 -98 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -82 -88 -94 -98 -96 -96 -90 -89 -90 -82 -82 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -56 -95 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -85 -84 -85 -87 -86 -85 -85 -84 -85 -82 -85 -91 -91 -98 -98 -98 -93 -93 -93 -93 -93 -99 -67 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -97 -55 -98 -85 -93 -83 -83 -83 -83 -83 -82 -82 -83 -82 -83 -82 -83 -83 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -79 -80 -83 -83 -83 -83 -84 -84 -84 -98 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -98 -94 -83 -89 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -99 -94 -80 -80 -79 -80 -79 -81 -79 -80 -80 -80 -80 -81 -98 -98 -98 -83 -83 -84 -84 -83 -83 -82 -83 -83 -83 -83 -83 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -85 -90 -85 -80 -80 -80 -79 -80 -79 -80 -80 -80 -80 -80 -80 -79 -98 -90 -90 -67 -83 -82 -83 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -58 -83 -98 -98 -83 -97 -97 -94 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -99 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -94 -89 -99 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -98 -84 -82 -82 -82 -82 -82 -82 -82 -83 -82 -83 -82 -83 -80 -80 -80 -80 -80 -80 -77 -80 -80 -80 -80 -80 -80 -94 -94 -94 -92 -95 -94 -95 -94 -94 -94 -96 -94 -94 -94 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -64 -95 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -94 -42 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -63 -99 -82 -83 -82 -82 -82 -83 -82 -83 -82 -83 -82 -82 -98 -80 -79 -79 -79 -79 -79 -80 -79 -79 -80 -79 -79 -96 -90 -94 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -97 -97 -95 -80 -94 -99 -80 -85 -80 -91 -97 -89 -85 -98 -93 -98 -87 -98 -98 -80 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -80 -88 -82 -82 -82 -82 -82 -82 -83 -78 -82 -82 -82 -70 -91 -90 -90 -91 -91 -90 -92 -89 -90 -83 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -92 -98 -94 -80 -87 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -77 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -94 -98 -93 -98 -96 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -96 -82 -80 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -85 -91 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -81 -81 -80 -98 -97 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -99 -81 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -98 -81 -81 -80 -81 -79 -81 -81 -81 -81 -81 -81 -81 -77 -91 -81 -81 -81 -81 -82 -81 -81 -81 -81 -81 -81 -81 -59 -93 -94 -94 -94 -94 -94 -94 -94 -94 -94 -94 -94 -94 -94 -99 -82 -81 -82 -81 -82 -82 -82 -81 -81 -82 -82 -82 -81 -99 -82 -81 -82 -82 -81 -81 -81 -81 -82 -82 -82 -82 -85 -81 -82 -82 -81 -82 -82 -80 -81 -81 -81 -82 -74 -98 -82 -83 -83 -83 -83 -83 -83 -82 -83 -83 -82 -82 -91 -85 -92 -96 -99 -85 -86 -85 -85 -86 -86 -92 -91 -91 -91 -91 -91 -92 -89 -89 -88 -89 -95 -94 -95 -81 -82 -81 -81 -81 -82 -82 -82 -82 -80 -81 -82 -60 -65 -82 -82 -82 -82 -79 -82 -82 -82 -82 -82 -82 -82 -98 -98 -91 -92 -98 -85 -98 -89 -85 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -83 -80 -98 -95 -95 -83 -83 -83 -83 -83 -84 -84 -83 -84 -84 -84 -84 -84 -83 -84 -84 -84 -81 -83 -83 -83 -81 -82 -82 -84 -60 -84 -84 -83 -82 -83 -84 -83 -83 -84 -84 -84 -83 -57 -89 -80 -79 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -93 -93 -93 -93 -89 -91 -90 -87 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -97 -81 -81 -81 -81 -81 -80 -80 -80 -80 -81 -80 -81 -81 -95 -95 -89 -83 -84 -84 -84 -83 -84 -84 -84 -84 -84 -84 -84 -83 -83 -83 -83 -83 -83 -83 -82 -83 -82 -82 -83 -92 -81 -80 -81 -81 -81 -81 -80 -81 -80 -81 -81 -81 -98 -93 -81 -84 -84 -85 -84 -85 -85 -84 -84 -84 -98 -80 -95 -92 -92 -90 -96 -90 -89 -93 -98 -93 -89 -89 -93 -93 -99 -83 -82 -82 -83 -83 -82 -83 -82 -82 -82 -83 -82 -82 -90 -82 -83 -98 -83 -82 -82 -82 -83 -83 -83 -83 -82 -83 -83 -83 -98 -83 -83 -83 -83 -83 -83 -83 -83 -82 -82 -83 -83 -99 -82 -83 -83 -83 -83 -83 -82 -82 -83 -83 -82 -83 -98 -83 -83 -82 -82 -82 -82 -83 -82 -83 -82 -82 -82 -99 -83 -82 -83 -82 -83 -81 -83 -83 -82 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -82 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -63 -89 -83 -83 -83 -83 -83 -83 -84 -83 -83 -84 -83 -83 -91 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -41 -83 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -82 -40 -90 -91 -86 -85 -86 -87 -85 -86 -86 -99 -80 -91 -96 -91 -91 -91 -94 -97 -92 -97 -93 -98 -99 -92 -97 -92 -98 -98 -98 -98 -93 -98 -98 -98 -95 -84 -98 -99 -99 -88 -98 -86 -62 -82 -82 -83 -82 -82 -82 -82 -82 -81 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -88 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -78 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -41 -82 -82 -82 -82 -82 -80 -82 -82 -82 -82 -82 -41 -82 -82 -77 -82 -82 -82 -82 -81 -81 -81 -82 -81 -41 -93 -93 -93 -95 -93 -93 -67 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -90 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -71 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -85 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -81 -82 -82 -41 -89 -81 -77 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -93 -58 -97 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -70 -82 -96 -82 -98 -95 -94 -96 -98 -98 -98 -99 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -95 -99 -99 -82 -82 -82 -82 -83 -82 -82 -83 -83 -83 -83 -82 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -93 -81 -82 -81 -81 -82 -81 -80 -80 -81 -82 -81 -82 -41 -85 -81 -77 -82 -81 -81 -82 -81 -81 -81 -82 -81 -70 -92 -93 -92 -92 -92 -92 -92 -92 -92 -81 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -96 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -94 -98 -98 -98 -99 -98 -98 -98 -99 -99 -94 -94 -82 -83 -82 -82 -83 -83 -82 -82 -83 -82 -81 -81 -87 -79 -79 -80 -77 -80 -80 -80 -80 -80 -80 -80 -80 -94 -98 -99 -98 -97 -99 -98 -43 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -83 -98 -98 -98 -87 -99 -98 -92 -82 -83 -83 -82 -82 -82 -83 -83 -82 -83 -82 -82 -40 -82 -82 -83 -82 -83 -82 -83 -83 -83 -83 -83 -83 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -79 -80 -80 -80 -80 -79 -79 -79 -79 -79 -80 -59 -98 -83 -83 -82 -83 -82 -82 -82 -82 -83 -82 -79 -82 -46 -94 -93 -93 -94 -94 -89 -82 -91 -87 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -77 -82 -82 -82 -83 -82 -82 -82 -82 -82 -82 -82 -82 -63 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -71 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -99 -80 -79 -79 -80 -79 -79 -80 -80 -80 -80 -77 -80 -79 -79 -79 -79 -80 -79 -79 -80 -79 -79 -79 -79 -41 -90 -98 -98 -98 -99 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -97 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -76 -96 -96 -98 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -93 -67 -80 -80 -80 -79 -79 -80 -80 -80 -80 -79 -79 -80 -88 -98 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -46 -64 -94 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -56 -83 -93 -80 -94 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -71 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -40 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -98 -83 -83 -83 -83 -83 -83 -82 -83 -83 -83 -83 -83 -85 -84 -83 -83 -83 -83 -83 -83 -83 -83 -83 -82 -84 -41 -82 -83 -82 -82 -82 -83 -83 -82 -83 -82 -83 -82 -91 -80 -81 -80 -80 -80 -81 -80 -80 -81 -80 -80 -80 -99 -98 -98 -99 -98 -97 -80 -95 -98 -99 -96 -95 -80 -80 -80 -81 -80 -80 -80 -80 -81 -80 -81 -80 -91 -87 -81 -80 -81 -81 -80 -81 -80 -80 -81 -81 -80 -72 -80 -81 -80 -80 -81 -81 -81 -80 -80 -81 -80 -80 -83 -90 -83 -82 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -85 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -53 -83 -83 -79 -82 -83 -83 -83 -83 -83 -83 -83 -83 -88 -93 -89 -93 -89 -98 -81 -83 -83 -83 -83 -82 -83 -83 -82 -83 -83 -83 -98 -98 -97 -81 -81 -81 -81 -80 -80 -81 -81 -81 -81 -80 -81 -41 -87 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -41 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -79 -81 -80 -80 -80 -67 -89 -80 -85 -85 -86 -85 -79 -97 -98 -98 -41 -45 -90 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -83 -77 -83 -83 -83 -83 -83 -82 -83 -83 -82 -82 -82 -83 -83 -40 -40 -82 -82 -98 -98 -86 -84 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -85 -81 -81 -81 -81 -81 -81 -81 -80 -81 -81 -81 -66 -81 -80 -80 -78 -81 -81 -80 -81 -81 -80 -80 -81 -53 -92 -54 -92 -93 -92 -81 -80 -81 -80 -81 -81 -80 -80 -81 -81 -81 -81 -98 -95 -98 -85 -81 -81 -80 -81 -80 -81 -81 -80 -81 -81 -80 -71 -80 -81 -81 -80 -80 -81 -80 -80 -80 -80 -81 -81 -41 -98 -98 -99 -98 -98 -52 -98 -98 -99 -98 -98 -98 -99 -98 -98 -98 -98 -83 -80 -80 -81 -81 -81 -80 -81 -80 -80 -81 -80 -64 -77 -96 -81 -80 -80 -80 -80 -81 -80 -80 -80 -80 -79 -80 -41 -85 -85 -96 -98 -80 -82 -70 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -98 -83 -57 -90 -98 -93 -92 -82 -98 -98 -93 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -83 -82 -82 -82 -96 -86 -96 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -53 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -41 -97 -98 -98 -98 -89 -95 -93 -97 -96 -98 -99 -98 -98 -79 -98 -98 -93 -93 -93 -93 -93 -94 -93 -94 -98 -98 -99 -98 -98 -98 -90 -98 -99 -98 -98 -91 -98 -95 -98 -98 -97 -98 -98 -99 -98 -98 -98 -93 -92 -94 -99 -93 -99 -97 -91 -98 -98 -93 -96 -98 -92 -92 -92 -91 -98 -98 -98 -95 -96 -90 -98 -91 -97 -98 -99 -98 -89 -98 -98 -97 -89 -98 -98 -95 -99 -98 -91 -93 -98 -98 -97 -97 -85 -99 -91 -91 -98 -98 -98 -98 -97 -98 -98 -90 -90 -90 -90 -90 -90 -94 -98 -79 -91 -94 -91 -90 -98 -99 -98 -98 -98 -91 -98 -95 -90 -98 -99 -98 -97 -98 -99 -97 -98 -98 -82 -88 -98 -98 -99 -98 -98 -98 -99 -99 -98 -98 -98 -86 -91 -82 -98 -82 -97 -91 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -96 -99 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -81 -50 -81 -82 -82 -78 -81 -82 -82 -81 -82 -82 -81 -81 -55 -40 -92 -91 -91 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -40 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -82 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -59 -80 -79 -80 -81 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -41 -95 -81 -62 -98 -94 -90 -90 -98 -96 -93 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -98 -98 -98 -96 -82 -81 -81 -82 -82 -81 -81 -80 -82 -81 -82 -82 -98 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -81 -80 -90 -79 -81 -81 -80 -80 -81 -81 -81 -81 -79 -81 -83 -81 -81 -81 -81 -81 -78 -81 -80 -81 -81 -81 -81 -41 -91 -99 -81 -82 -82 -80 -81 -82 -81 -81 -82 -82 -81 -81 -95 -98 -82 -82 -80 -82 -82 -81 -82 -81 -82 -82 -81 -80 -71 -81 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -55 -81 -81 -82 -82 -82 -81 -82 -81 -82 -82 -82 -82 -97 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -81 -82 -82 -81 -82 -82 -82 -82 -82 -62 -47 -93 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -98 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -82 -99 -99 -61 -96 -98 -98 -98 -98 -92 -98 -98 -99 -97 -99 -98 -98 -98 -98 -98 -98 -98 -96 -99 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -98 -99 -98 -98 -86 -82 -82 -82 -81 -82 -82 -82 -82 -82 -82 -82 -64 -80 -82 -82 -82 -82 -82 -82 -82 -78 -82 -82 -82 -94 -90 -90 -92 -92 -91 -91 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -82 -71 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -82 -94 -87 -82 -82 -82 -82 -82 -82 -94 -82 -82 -82 -82 -82 -84 -99 -82 -82 -82 -82 -82 -82 -82 -83 -82 -83 -82 -82 -83 -82 -82 -82 -82 -82 -78 -87 -80 -80 -80 -80 -80 -90 -98 -47 -82 -82 -82 -82 -82 -82 -99 -80 -78 -79 -79 -79 -80 -92 -86 -85 -86 -85 -85 -86 -84 -86 -86 -86 -86 -80 -80 -86 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -79 -98 -97 -98 -98 -98 -98 -95 -98 -98 -86 -82 -95 -99 -95 -82 -82 -81 -82 -82 -81 -82 -80 -79 -82 -82 -81 -99 -80 -80 -80 -80 -80 -80 -71 -89 -80 -80 -80 -80 -80 -80 -75 -80 -80 -78 -79 -80 -91 -75 -79 -79 -82 -82 -82 -98 -98 -83 -80 -80 -80 -80 -80 -80 -80 -80 -70 -81 -58 -79 -84 -80 -97 -80 -78 -78 -82 -82 -82 -91 -95 -92 -92 -92 -92 -92 -92 -92 -92 -98 -52 -80 -80 -80 -80 -80 -80 -66 -80 -95 -41 -90 -41 -92 -65 -89 -94 -93 -91 -80 -80 -80 -80 -39 -79 -82 -82 -82 -82 -82 -43 -83 -82 -82 -82 -82 -82 -58 -82 -82 -82 -82 -82 -82 -83 -97 -98 -98 -93 -82 -82 -81 -81 -81 -84 -80 -80 -80 -80 -80 -79 -84 -54 -87 -85 -84 -66 -91 -88 -98 -86 -98 -73 -91 -56 -81 -79 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -62 -96 -96 -90 -91 -84 -80 -90 -94 -82 -97 -82 -82 -82 -82 -82 -82 -98 -82 -82 -82 -82 -82 -82 -91 -97 -82 -82 -82 -83 -82 -82 -87 -82 -93 -98 -99 -98 -80 -98 -96 -82 -82 -82 -83 -82 -82 -98 -99 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -81 -81 -98 -83 -80 -83 -83 -83 -83 -82 -98 -80 -80 -80 -80 -80 -80 -92 -92 -94 -92 -92 -92 -92 -80 -80 -80 -80 -80 -80 -89 -82 -82 -82 -82 -82 -82 -91 -82 -82 -82 -82 -82 -82 -51 -98 -82 -82 -82 -82 -82 -82 -97 -89 -80 -80 -80 -80 -80 -80 -76 -98 -98 -98 -98 -92 -80 -80 -80 -80 -80 -80 -98 -83 -83 -82 -82 -80 -83 -98 -82 -82 -82 -82 -82 -82 -41 -85 -84 -97 -98 -98 -98 -90 -98 -90 -98 -89 -98 -96 -97 -98 -90 -90 -90 -90 -91 -94 -98 -98 -95 -81 -82 -82 -82 -82 -82 -93 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -54 -90 -91 -80 -85 -96 -99 -98 -93 -80 -80 -80 -81 -80 -81 -41 -41 -41 -41 -41 -41 -81 -80 -81 -80 -80 -80 -77 -41 -41 -41 -41 -41 -52 -41 -66 -86 -89 -41 -81 -96 -98 -98 -98 -98 -98 -98 -98 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -80 -98 -91 -98 -98 -98 -98 -98 -97 -98 -96 -90 -89 -98 -94 -98 -93 -98 -97 -92 -91 -93 -91 -94 -91 -80 -80 -80 -80 -80 -80 -98 -92 -80 -80 -81 -80 -80 -80 -71 -80 -80 -80 -81 -80 -80 -41 -80 -98 -98 -97 -98 -98 -98 -98 -97 -91 -98 -98 -99 -94 -98 -98 -98 -80 -80 -80 -80 -80 -80 -50 -83 -80 -80 -80 -80 -80 -80 -98 -98 -98 -98 -90 -88 -96 -96 -98 -96 -92 -98 -98 -95 -98 -98 -98 -99 -98 -95 -96 -98 -91 -99 -98 -99 -98 -98 -96 -96 -80 -79 -80 -79 -79 -80 -90 -84 -84 -84 -81 -84 -84 -90 -92 -83 -84 -84 -84 -84 -84 -98 -97 -98 -96 -96 -89 -90 -80 -80 -98 -98 -80 -80 -96 -98 -87 -98 -99 -98 -80 -80 -80 -80 -80 -80 -41 -57 -80 -80 -80 -80 -80 -80 -98 -98 -98 -99 -98 -98 -99 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -98 -80 -41 -98 -80 -80 -80 -80 -98 -99 -98 -98 -98 -98 -98 -98 -98 -80 -80 -41 -41 -41 -41 -98 -83 -83 -83 -83 -83 -82 -83 -80 -79 -80 -80 -80 -80 -94 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -41 -91 -41 -41 -41 -41 -41 -48 -41 -41 -41 -83 -98 -80 -80 -79 -79 -79 -79 -98 -79 -80 -79 -80 -80 -80 -83 -83 -83 -83 -82 -82 -41 -82 -82 -82 -82 -82 -82 -41 -94 -93 -93 -87 -89 -90 -45 -92 -85 -98 -80 -80 -79 -78 -79 -79 -79 -97 -94 -83 -81 -80 -82 -81 -81 -84 -84 -86 -98 -89 -79 -79 -79 -79 -79 -79 -57 -79 -79 -79 -79 -79 -79 -79 -41 -84 -96 -97 -79 -90 -98 -79 -79 -79 -79 -79 -79 -92 -83 -83 -82 -81 -83 -80 -85 -82 -81 -82 -82 -82 -82 -41 -82 -82 -82 -82 -82 -82 -83 -82 -82 -82 -82 -82 -98 -98 -79 -79 -79 -79 -79 -78 -97 -91 -96 -91 -82 -82 -82 -82 -82 -82 -77 -82 -82 -82 -82 -82 -82 -98 -79 -79 -79 -79 -79 -79 -94 -98 -96 -81 -82 -82 -82 -82 -82 -91 -91 -93 -91 -91 -91 -91 -93 -91 -91 -91 -91 -91 -92 -91 -91 -87 -84 -79 -79 -79 -79 -79 -78 -94 -79 -79 -79 -79 -80 -79 -94 -98 -82 -83 -82 -82 -83 -83 -82 -41 -81 -98 -98 -98 -86 -82 -99 -82 -82 -82 -82 -82 -82 -82 -82 -82 -81 -82 -82 -90 -79 -79 -79 -78 -78 -79 -79 -79 -78 -79 -79 -79 -98 -82 -81 -82 -82 -82 -82 -82 -82 -82 -82 -81 -81 -81 -90 -82 -81 -82 -82 -81 -81 -82 -82 -82 -80 -82 -81 -81 -81 -42 -61 -96 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -98 -98 -98 -98 -98 -41 -41 -98 -99 -84 -98 -41 -98 -98 -98 -85 -98 -96 -96 -91 -87 -98 -96 -99 -98 -90 -88 -86 -88 -96 -91 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 -84 -93 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -80 -80 -80 -79 -80 -80 -80 -80 -79 -79 -80 -80 -73 -80 -80 -80 -79 -78 -80 -80 -80 -80 -80 -79 -80 -74 -40 -40 -91 -40 -40 -79 -79 -79 -79 -79 -79 -79 -79 -79 -79 -91 -91 -90 -97 -40 -40 -91 -91 -40 -40 -82 -82 -82 -82 -82 -82 -82 -82 -82 -83 -82 -96 -79 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -41 -40 -40 -40 -98 -80 -79 -79 -79 -79 -80 -80 -80 -80 -79 -80 -79 -40 -40 -40 -79 -79 -79 -79 -79 -79 -79 -79 -80 -80 -80 -79 -92 -83 -82 -83 -82 -82 -82 -83 -82 -81 -82 -82 -82 -90 -92 -82 -82 -83 -83 -83 -83 -83 -82 -82 -83 -83 -82 -42 -40 -40 -70 -82 -68 -80 -79 -80 -79 -80 -78 -80 -80 -80 -96 -80 -79 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -60 -79 -80 -80 -80 -80 -80 -80 -80 -80 -79 -80 -80 -99 -80 -80 -80 -80 -80 -79 -80 -80 -80 -79 -80 -80 -99 -84 -83 -83 -83 -84 -83 -83 -83 -84 -84 -84 -84 -84 -48 -79 -80 -80 -80 -80 -79 -80 -79 -80 -80 -79 -80 -91 -91 -91 -92 -91 -92 -94 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -58 -99 -98 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -84 -83 -98 -80 -92 -92 -87 -98 -98 -86 -98 -98 -95 -98 -97 -99 -97 -41 -72 -87 -84 -84 -83 -82 -84 -78 -78 -79 -79 -79 -83 -85 -94 -83 -86 -87 -96 -84 -86 -88 -98 -96 -95 -85 -90 -98 -98 -98 -80 -80 -95 -98 -98 -96 -98 -98 -80 -99 -96 -80 -98 -96 -94 -98 -96 -99 -80 -80 -80 -80 -80 -45 -80 -91 -80 -80 -80 -82 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -40 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -91 -40 -97 -84 -84 -84 -84 -84 -84 -84 -85 -84 -81 -84 -85 -97 -85 -85 -86 -85 -85 -82 -85 -85 -85 -85 -85 -85 -87 -86 -85 -86 -86 -85 -84 -86 -84 -85 -86 -86 -70 -86 -86 -86 -86 -86 -86 -86 -86 -86 -86 -86 -86 -41 -94 -41 -40 -97 -80 -40 -91 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -93 -40 -93 -93 -40 -40 -93 -93 -98 -80 -80 -80 -80 -80 -80 -80 -81 -80 -80 -80 -80 -80 -80 -79 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -40 -40 -93 -85 -85 -82 -82 -83 -86 -85 -86 -84 -85 -82 -83 -84 -85 -40 -40 -78 -40 -98 -98 -98 -99 -41 -80 -80 -78 -81 -79 -81 -81 -79 -81 -81 -81 -81 -96 -98 -80 -93 -80 -96 -98 -98 -80 -80 -80 -80 -80 -80 -80 -81 -81 -80 -80 -80 -98 -80 -80 -81 -80 -80 -80 -80 -80 -80 -81 -80 -80 -99 -90 -84 -82 -86 -85 -85 -85 -85 -86 -86 -85 -86 -86 -98 -96 -96 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -79 -81 -80 -48 -90 -89 -79 -93 -91 -95 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -98 -95 -98 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -41 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -96 -98 -98 -99 -71 -98 -98 -99 -98 -98 -98 -98 -98 tinyos-2.1.2+dfsg/tos/lib/tossim/packet.c000066400000000000000000000062621207233610700202730ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Injecting packets into TOSSIM. * * @author Philip Levis * @date Dec 10 2005 */ #include #include Packet::Packet() { msgPtr = sim_packet_allocate(); allocated = 1; } Packet::Packet(sim_packet_t* m) { if (m != NULL) { msgPtr = m; allocated = 0; } else { msgPtr = sim_packet_allocate(); allocated = 1; } } Packet::~Packet() { if (allocated) { sim_packet_free(msgPtr); } } void Packet::setSource(int src) { sim_packet_set_source(msgPtr, (uint16_t)src); } int Packet::source() { return sim_packet_source(msgPtr); } void Packet::setDestination(int dest) { sim_packet_set_destination(msgPtr, (uint16_t)dest); } int Packet::destination() { return sim_packet_destination(msgPtr); } void Packet::setLength(int len) { sim_packet_set_length(msgPtr, (uint8_t)len); } int Packet::length() { return sim_packet_length(msgPtr); } void Packet::setType(int type) { sim_packet_set_type(msgPtr, (uint8_t)type); } int Packet::type() { return sim_packet_type(msgPtr); } char* Packet::data() { char* val = (char*)sim_packet_data(msgPtr); return val; } void Packet::setData(char* data, int len) { len = (len > maxLength())? maxLength():len; memcpy(sim_packet_data(msgPtr), data, len); setLength(len); } int Packet::maxLength() { return (int)sim_packet_max_length(msgPtr); } void Packet::setStrength(int str) { sim_packet_set_strength(msgPtr, (uint16_t)str); } sim_packet_t* Packet::getPacket() { return msgPtr; } void Packet::deliver(int node, long long int t) { sim_packet_deliver(node, msgPtr, t); } void Packet::deliverNow(int node) { deliver(node, 0); } tinyos-2.1.2+dfsg/tos/lib/tossim/packet.h000066400000000000000000000044451207233610700203010ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Injecting packets into TOSSIM. * * @author Philip Levis * @date Dec 10 2005 */ #ifndef PACKET_H_INCLUDED #define PACKET_H_INCLUDED #include class Packet { public: Packet(); Packet(sim_packet_t* msg); ~Packet(); void setSource(int src); int source(); void setDestination(int dest); int destination(); void setLength(int len); int length(); void setType(int type); int type(); char* data(); void setData(char* data, int len); int maxLength(); void setStrength(int str); sim_packet_t* getPacket(); void deliver(int node, long long int t); void deliverNow(int node); private: int allocated; sim_packet_t* msgPtr; }; #endif tinyos-2.1.2+dfsg/tos/lib/tossim/packet.i000066400000000000000000000046721207233610700203040ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SWIG interface specification for delivering packets to a node * (injecting traffic). * * Note that changing this file only changes the Python interface: * you must also change the underlying TOSSIM code so Python * has the proper functions to call. Look at mac.h, mac.c, and * sim_mac.c. * * @author Philip Levis * @date Jan 2 2006 */ %{ #include %} %apply (char *STRING, int LENGTH) { (char *data, int len) }; class Packet { public: Packet(); ~Packet(); void setSource(int src); int source(); void setDestination(int dest); int destination(); void setLength(int len); int length(); void setType(int type); int type(); char* data(); void setData(char* data, int len); int maxLength(); void setStrength(int str); void deliver(int node, long long int time); void deliverNow(int node); }; tinyos-2.1.2+dfsg/tos/lib/tossim/platform_message.h000066400000000000000000000042541207233610700223600ustar00rootroot00000000000000// $Id: platform_message.h,v 1.5 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Defining the platform-independently named packet structures to be the * tossim structures. * * @author Philip Levis * @date Dec 2 2005 * Revision: $Revision: 1.5 $ */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include #include typedef union message_header { tossim_header_t tossim; serial_header_t serial; } message_header_t; typedef union message_footer { tossim_footer_t tossim; } message_footer_t; typedef union message_metadata { tossim_metadata_t tossim; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/lib/tossim/radio.c000066400000000000000000000044141207233610700201170ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * C++ implementation of the gain-based TOSSIM radio model. * * @author Philip Levis * @date Dec 10 2005 */ #include #include Radio::Radio() {} Radio::~Radio() {} void Radio::add(int src, int dest, double gain) { sim_gain_add(src, dest, gain); } double Radio::gain(int src, int dest) { return sim_gain_value(src, dest); } bool Radio::connected(int src, int dest) { return sim_gain_connected(src, dest); } void Radio::remove(int src, int dest) { sim_gain_remove(src, dest); } void Radio::setNoise(int node, double mean, double range) { sim_gain_set_noise_floor(node, mean, range); } void Radio::setSensitivity(double sensitivity) { sim_gain_set_sensitivity(sensitivity); } tinyos-2.1.2+dfsg/tos/lib/tossim/radio.h000066400000000000000000000040021207233610700201150ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Configuration parameters for a CSMA link. * * @author Philip Levis * @date Dec 10 2005 */ #ifndef RADIO_H_INCLUDED #define RADIO_H_INCLUDED class Radio { public: Radio(); ~Radio(); void add(int src, int dest, double value); double gain(int src, int dest); bool connected(int src, int dest); void remove(int src, int dest); void setNoise(int node, double mean, double range); void setSensitivity(double sensitivity); }; #endif tinyos-2.1.2+dfsg/tos/lib/tossim/radio.i000066400000000000000000000047071207233610700201320ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Stanfoard SWIG interface specification for the TOSSIM radio * propagation model. This file defines the Radio object that * is exported to Python. * This particular radio model is gain-based. If you want to change * the radio model (and the scripting interface), then you must * replace or modify this file and re-run the SWIG interface generation * script generate-swig.bash in lib/tossim. Basic TOSSIM includes * another model, the binary model, which stores packet loss rates * rather than gains. * * @author Philip Levis * @date Dec 10 2005 */ %module TOSSIMRadio %{ #include %} class Radio { public: Radio(); ~Radio(); void add(int src, int dest, double gain); double gain(int src, int dest); bool connected(int src, int dest); void remove(int src, int dest); void setNoise(int node, double mean, double range); void setSensitivity(double sensitivity); }; tinyos-2.1.2+dfsg/tos/lib/tossim/randomlib.c000066400000000000000000000140621207233610700207700ustar00rootroot00000000000000/* This Random Number Generator is based on the algorithm in a FORTRAN version published by George Marsaglia and Arif Zaman, Florida State University; ref.: see original comments below. At the fhw (Fachhochschule Wiesbaden, W.Germany), Dept. of Computer Science, we have written sources in further languages (C, Modula-2 Turbo-Pascal(3.0, 5.0), Basic and Ada) to get exactly the same test results compared with the original FORTRAN version. April 1989 Karl-L. Noell and Helmut Weber This random number generator originally appeared in "Toward a Universal Random Number Generator" by George Marsaglia and Arif Zaman. Florida State University Report: FSU-SCRI-87-50 (1987) It was later modified by F. James and published in "A Review of Pseudo- random Number Generators" THIS IS THE BEST KNOWN RANDOM NUMBER GENERATOR AVAILABLE. (However, a newly discovered technique can yield a period of 10^600. But that is still in the development stage.) It passes ALL of the tests for random number generators and has a period of 2^144, is completely portable (gives bit identical results on all machines with at least 24-bit mantissas in the floating point representation). The algorithm is a combination of a Fibonacci sequence (with lags of 97 and 33, and operation "subtraction plus one, modulo one") and an "arithmetic sequence" (using subtraction). Use IJ = 1802 & KL = 9373 to test the random number generator. The subroutine RANMAR should be used to generate 20000 random numbers. Then display the next six random numbers generated multiplied by 4096*4096 If the random number generator is working properly, the random numbers should be: 6533892.0 14220222.0 7275067.0 6172232.0 8354498.0 10633180.0 */ /* Globals */ static double randU[97], randC, randCD, randCM; static int i97,j97; static int test = FALSE; /* This is the initialization routine for the random number generator. NOTE: The seed variables can have values between: 0 <= IJ <= 31328 0 <= KL <= 30081 The random number sequences created by these two seeds are of sufficient length to complete an entire calculation with. For example, if sveral different groups are working on different parts of the same calculation, each group could be assigned its own IJ seed. This would leave each group with 30000 choices for the second seed. That is to say, this random number generator can create 900 million different subsequences -- with each subsequence having a length of approximately 10^30. */ void RandomInitialise(int ij,int kl) { double s,t; int ii,i,j,k,l,jj,m; /* Handle the seed range errors First random number seed must be between 0 and 31328 Second seed must have a value between 0 and 30081 */ if (ij < 0 || ij > 31328 || kl < 0 || kl > 30081) { ij = 1802; kl = 9373; } i = (ij / 177) % 177 + 2; j = (ij % 177) + 2; k = (kl / 169) % 178 + 1; l = (kl % 169); for (ii=0; ii<97; ii++) { s = 0.0; t = 0.5; for (jj=0; jj<24; jj++) { m = (((i * j) % 179) * k) % 179; i = j; j = k; k = m; l = (53 * l + 1) % 169; if (((l * m % 64)) >= 32) s += t; t *= 0.5; } randU[ii] = s; } randC = 362436.0 / 16777216.0; randCD = 7654321.0 / 16777216.0; randCM = 16777213.0 / 16777216.0; i97 = 97; j97 = 33; test = TRUE; } /* This is the random number generator proposed by George Marsaglia in Florida State University Report: FSU-SCRI-87-50 */ double RandomUniform(void) { double uni; int seed1, seed2; /* Make sure the initialisation routine has been called */ if (!test) { #if 0 RandomInitialise(1802,9373); #else seed1 = sim_random() % 31329; seed2 = sim_random() % 30082; RandomInitialise(seed1,seed2); #endif } uni = randU[i97-1] - randU[j97-1]; if (uni <= 0.0) uni++; randU[i97-1] = uni; i97--; if (i97 == 0) i97 = 97; j97--; if (j97 == 0) j97 = 97; randC -= randCD; if (randC < 0.0) randC += randCM; uni -= randC; if (uni < 0.0) uni++; return(uni); } /* ALGORITHM 712, COLLECTED ALGORITHMS FROM ACM. THIS WORK PUBLISHED IN TRANSACTIONS ON MATHEMATICAL SOFTWARE, VOL. 18, NO. 4, DECEMBER, 1992, PP. 434-435. The function returns a normally distributed pseudo-random number with a given mean and standard devaiation. Calls are made to a function subprogram which must return independent random numbers uniform in the interval (0,1). The algorithm uses the ratio of uniforms method of A.J. Kinderman and J.F. Monahan augmented with quadratic bounding curves. */ double RandomGaussian(double mean,double stddev) { double q,z,v,x,y; /* Generate P = (u,v) uniform in rect. enclosing acceptance region Make sure that any random numbers <= 0 are rejected, since gaussian() requires uniforms > 0, but RandomUniform() delivers >= 0. */ do { z = RandomUniform(); v = RandomUniform(); if (z <= 0.0 || v <= 0.0) { z = 1.0; v = 1.0; } v = 1.7156 * (v - 0.5); /* Evaluate the quadratic form */ x = z - 0.449871; y = fabs(v) + 0.386595; q = x * x + y * (0.19600 * y - 0.25472 * x); /* Accept P if inside inner ellipse */ if (q < 0.27597) break; /* Reject P if outside outer ellipse, or outside acceptance region */ } while ((q > 0.27846) || (v * v > -4.0 * log(z) * z * z)); /* Return ratio of P's coordinates as the normal deviate */ return (mean + stddev * v / z); } /* Return random integer within a range, lower -> upper INCLUSIVE */ int RandomInt(int lower,int upper) { return((int)(RandomUniform() * (upper - lower + 1)) + lower); } /* Return random float within a range, lower -> upper */ double RandomDouble(double lower,double upper) { return((upper - lower) * RandomUniform() + lower); } tinyos-2.1.2+dfsg/tos/lib/tossim/randomlib.h000066400000000000000000000041521207233610700207740ustar00rootroot00000000000000/* This Random Number Generator is based on the algorithm in a FORTRAN version published by George Marsaglia and Arif Zaman, Florida State University; ref.: see original comments below. At the fhw (Fachhochschule Wiesbaden, W.Germany), Dept. of Computer Science, we have written sources in further languages (C, Modula-2 Turbo-Pascal(3.0, 5.0), Basic and Ada) to get exactly the same test results compared with the original FORTRAN version. April 1989 Karl-L. Noell and Helmut Weber This random number generator originally appeared in "Toward a Universal Random Number Generator" by George Marsaglia and Arif Zaman. Florida State University Report: FSU-SCRI-87-50 (1987) It was later modified by F. James and published in "A Review of Pseudo- random Number Generators" THIS IS THE BEST KNOWN RANDOM NUMBER GENERATOR AVAILABLE. (However, a newly discovered technique can yield a period of 10^600. But that is still in the development stage.) It passes ALL of the tests for random number generators and has a period of 2^144, is completely portable (gives bit identical results on all machines with at least 24-bit mantissas in the floating point representation). The algorithm is a combination of a Fibonacci sequence (with lags of 97 and 33, and operation "subtraction plus one, modulo one") and an "arithmetic sequence" (using subtraction). Use IJ = 1802 & KL = 9373 to test the random number generator. The subroutine RANMAR should be used to generate 20000 random numbers. Then display the next six random numbers generated multiplied by 4096*4096 If the random number generator is working properly, the random numbers should be: 6533892.0 14220222.0 7275067.0 6172232.0 8354498.0 10633180.0 */ #ifndef _RANDOMLIB_H_ #define _RANDOMLIB_H_ #ifdef __cplusplus extern "C" { #endif void RandomInitialise(int,int); double RandomUniform(void); double RandomGaussian(double,double); int RandomInt(int,int); double RandomDouble(double,double); #ifdef __cplusplus } #endif #endif tinyos-2.1.2+dfsg/tos/lib/tossim/sf/000077500000000000000000000000001207233610700172625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tossim/sf/SerialForwarder.c000066400000000000000000000044721207233610700225300ustar00rootroot00000000000000/* * Copyright (c) 2007 Toilers Research Group - Colorado School of Mines * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Toilers Research Group - Colorado School of * Mines nor the names of its contributors may be used to endorse * or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Author: Chad Metcalf * Date: July 9, 2007 * * A simple C++ wrapper around the serial forwarder for TOSSIM * */ #include "SerialForwarder.h" #include "sim_serial_forwarder.h" SerialForwarder::SerialForwarder(const int port) { openServerSocket(port); } SerialForwarder::~SerialForwarder() { } void SerialForwarder::openServerSocket(const int port) { sim_sf_open_server_socket(port); } void SerialForwarder::dispatchPacket(const void *packet, const int len) { sim_sf_dispatch_packet(packet, len); } void SerialForwarder::forwardPacket(const void *packet, const int len) { sim_sf_forward_packet(packet, len); } void SerialForwarder::process () { sim_sf_process(); } tinyos-2.1.2+dfsg/tos/lib/tossim/sf/SerialForwarder.h000066400000000000000000000042121207233610700225250ustar00rootroot00000000000000/* * Copyright (c) 2007 Toilers Research Group - Colorado School of Mines * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Toilers Research Group - Colorado School of * Mines nor the names of its contributors may be used to endorse * or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Author: Chad Metcalf * Date: July 9, 2007 * * A simple C++ wrapper around the serial forwarder for TOSSIM * */ #ifndef _SERIALFORWARDER_H_ #define _SERIALFORWARDER_H_ class SerialForwarder { public: SerialForwarder(const int port); ~SerialForwarder(); void process (); void dispatchPacket(const void *packet, const int len); void forwardPacket(const void *packet, const int len); void openServerSocket(const int port); }; #endif // ----- #ifndef _SERIALFORWARDER_H_ ----- tinyos-2.1.2+dfsg/tos/lib/tossim/sf/SerialForwarder.i000066400000000000000000000041311207233610700225260ustar00rootroot00000000000000/* * Copyright (c) 2007 Toilers Research Group - Colorado School of Mines * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Toilers Research Group - Colorado School of * Mines nor the names of its contributors may be used to endorse * or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SWIG interface specification for the serial forwarder. * * @author Chad Metcalf * @date July 9, 2007 */ %{ #include %} %apply (char *STRING, int LENGTH) { (char *data, int len) }; class SerialForwarder { public: SerialForwarder(const int port); ~SerialForwarder(); void process (); void dispatchPacket(const void *packet, const int len); void forwardPacket(const void *packet, const int len); }; tinyos-2.1.2+dfsg/tos/lib/tossim/sf/SerialPacket.c000066400000000000000000000063021207233610700217760ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Injecting packets into TOSSIM. * * @author Philip Levis * @author Chad Metcalf * @date July 15 2007 */ #include #include SerialPacket::SerialPacket() { msgPtr = sim_serial_packet_allocate(); allocated = 1; } SerialPacket::SerialPacket(sim_serial_packet_t* m) { if (m != NULL) { msgPtr = m; allocated = 0; } else { msgPtr = sim_serial_packet_allocate(); allocated = 1; } } SerialPacket::~SerialPacket() { if (allocated) { sim_serial_packet_free(msgPtr); } } void SerialPacket::setDestination(int dest) { sim_serial_packet_set_destination(msgPtr, (uint16_t)dest); } int SerialPacket::destination() { return sim_serial_packet_destination(msgPtr); } void SerialPacket::setLength(int len) { sim_serial_packet_set_length(msgPtr, (uint8_t)len); } int SerialPacket::length() { return sim_serial_packet_length(msgPtr); } void SerialPacket::setType(int type) { sim_serial_packet_set_type(msgPtr, (uint8_t)type); } int SerialPacket::type() { return sim_serial_packet_type(msgPtr); } char* SerialPacket::data() { char* val = (char*)sim_serial_packet_data(msgPtr); return val; } void SerialPacket::setData(char* data, int len) { len = (len > maxLength())? maxLength():len; memcpy(sim_serial_packet_data(msgPtr), data, len); setLength(len); } int SerialPacket::maxLength() { return (int)sim_serial_packet_max_length(msgPtr); } sim_serial_packet_t* SerialPacket::getPacket() { return msgPtr; } void SerialPacket::deliver(int node, long long int t) { sim_serial_packet_deliver(node, msgPtr, t); } void SerialPacket::deliverNow(int node) { deliver(node, 0); } tinyos-2.1.2+dfsg/tos/lib/tossim/sf/SerialPacket.h000066400000000000000000000044541207233610700220110ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Injecting packets into TOSSIM. * * @author Philip Levis * @author Chad Metcalf * @date July 15 2007 */ #ifndef SERIAL_PACKET_H_INCLUDED #define SERIAL_PACKET_H_INCLUDED #include class SerialPacket { public: SerialPacket(); SerialPacket(sim_serial_packet_t* msg); ~SerialPacket(); void setDestination(int dest); int destination(); void setLength(int len); int length(); void setType(int type); int type(); char* data(); void setData(char* data, int len); int maxLength(); sim_serial_packet_t* getPacket(); void deliver(int node, long long int t); void deliverNow(int node); private: int allocated; sim_serial_packet_t* msgPtr; }; #endif tinyos-2.1.2+dfsg/tos/lib/tossim/sf/SerialPacket.i000066400000000000000000000046271207233610700220140ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SWIG interface specification for delivering packets to a node * (injecting traffic). * * Note that changing this file only changes the Python interface: * you must also change the underlying TOSSIM code so Python * has the proper functions to call. Look at mac.h, mac.c, and * sim_mac.c. * * @author Philip Levis * @author Chad Metcalf * @date July 17 2007 */ %{ #include %} %apply (char *STRING, int LENGTH) { (char *data, int len) }; class SerialPacket { public: SerialPacket(); ~SerialPacket(); void setDestination(int dest); int destination(); void setLength(int len); int length(); void setType(int type); int type(); char* data(); void setData(char* data, int len); int maxLength(); void deliver(int node, long long int time); void deliverNow(int node); }; tinyos-2.1.2+dfsg/tos/lib/tossim/sf/TOSSIM.py000066400000000000000000000374201207233610700206600ustar00rootroot00000000000000# This file was automatically generated by SWIG (http://www.swig.org). # Version 1.3.31 # # Don't modify this file, modify the SWIG interface instead. # This file is compatible with both classic and new-style classes. import _TOSSIM import new new_instancemethod = new.instancemethod try: _swig_property = property except NameError: pass # Python < 2.2 doesn't have 'property'. def _swig_setattr_nondynamic(self,class_type,name,value,static=1): if (name == "thisown"): return self.this.own(value) if (name == "this"): if type(value).__name__ == 'PySwigObject': self.__dict__[name] = value return method = class_type.__swig_setmethods__.get(name,None) if method: return method(self,value) if (not static) or hasattr(self,name): self.__dict__[name] = value else: raise AttributeError("You cannot add attributes to %s" % self) def _swig_setattr(self,class_type,name,value): return _swig_setattr_nondynamic(self,class_type,name,value,0) def _swig_getattr(self,class_type,name): if (name == "thisown"): return self.this.own() method = class_type.__swig_getmethods__.get(name,None) if method: return method(self) raise AttributeError,name def _swig_repr(self): try: strthis = "proxy of " + self.this.__repr__() except: strthis = "" return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) import types try: _object = types.ObjectType _newclass = 1 except AttributeError: class _object : pass _newclass = 0 del types class MAC(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, MAC, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, MAC, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_MAC(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_MAC __del__ = lambda self : None; def initHigh(*args): return _TOSSIM.MAC_initHigh(*args) def initLow(*args): return _TOSSIM.MAC_initLow(*args) def high(*args): return _TOSSIM.MAC_high(*args) def low(*args): return _TOSSIM.MAC_low(*args) def symbolsPerSec(*args): return _TOSSIM.MAC_symbolsPerSec(*args) def bitsPerSymbol(*args): return _TOSSIM.MAC_bitsPerSymbol(*args) def preambleLength(*args): return _TOSSIM.MAC_preambleLength(*args) def exponentBase(*args): return _TOSSIM.MAC_exponentBase(*args) def maxIterations(*args): return _TOSSIM.MAC_maxIterations(*args) def minFreeSamples(*args): return _TOSSIM.MAC_minFreeSamples(*args) def rxtxDelay(*args): return _TOSSIM.MAC_rxtxDelay(*args) def ackTime(*args): return _TOSSIM.MAC_ackTime(*args) def setInitHigh(*args): return _TOSSIM.MAC_setInitHigh(*args) def setInitLow(*args): return _TOSSIM.MAC_setInitLow(*args) def setHigh(*args): return _TOSSIM.MAC_setHigh(*args) def setLow(*args): return _TOSSIM.MAC_setLow(*args) def setSymbolsPerSec(*args): return _TOSSIM.MAC_setSymbolsPerSec(*args) def setBitsBerSymbol(*args): return _TOSSIM.MAC_setBitsBerSymbol(*args) def setPreambleLength(*args): return _TOSSIM.MAC_setPreambleLength(*args) def setExponentBase(*args): return _TOSSIM.MAC_setExponentBase(*args) def setMaxIterations(*args): return _TOSSIM.MAC_setMaxIterations(*args) def setMinFreeSamples(*args): return _TOSSIM.MAC_setMinFreeSamples(*args) def setRxtxDelay(*args): return _TOSSIM.MAC_setRxtxDelay(*args) def setAckTime(*args): return _TOSSIM.MAC_setAckTime(*args) MAC_swigregister = _TOSSIM.MAC_swigregister MAC_swigregister(MAC) class Radio(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, Radio, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, Radio, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_Radio(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_Radio __del__ = lambda self : None; def add(*args): return _TOSSIM.Radio_add(*args) def gain(*args): return _TOSSIM.Radio_gain(*args) def connected(*args): return _TOSSIM.Radio_connected(*args) def remove(*args): return _TOSSIM.Radio_remove(*args) def setNoise(*args): return _TOSSIM.Radio_setNoise(*args) def setSensitivity(*args): return _TOSSIM.Radio_setSensitivity(*args) Radio_swigregister = _TOSSIM.Radio_swigregister Radio_swigregister(Radio) class Packet(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, Packet, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, Packet, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_Packet(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_Packet __del__ = lambda self : None; def setSource(*args): return _TOSSIM.Packet_setSource(*args) def source(*args): return _TOSSIM.Packet_source(*args) def setDestination(*args): return _TOSSIM.Packet_setDestination(*args) def destination(*args): return _TOSSIM.Packet_destination(*args) def setLength(*args): return _TOSSIM.Packet_setLength(*args) def length(*args): return _TOSSIM.Packet_length(*args) def setType(*args): return _TOSSIM.Packet_setType(*args) def type(*args): return _TOSSIM.Packet_type(*args) def data(*args): return _TOSSIM.Packet_data(*args) def setData(*args): return _TOSSIM.Packet_setData(*args) def maxLength(*args): return _TOSSIM.Packet_maxLength(*args) def setStrength(*args): return _TOSSIM.Packet_setStrength(*args) def deliver(*args): return _TOSSIM.Packet_deliver(*args) def deliverNow(*args): return _TOSSIM.Packet_deliverNow(*args) Packet_swigregister = _TOSSIM.Packet_swigregister Packet_swigregister(Packet) class SerialPacket(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, SerialPacket, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, SerialPacket, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_SerialPacket(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_SerialPacket __del__ = lambda self : None; def setDestination(*args): return _TOSSIM.SerialPacket_setDestination(*args) def destination(*args): return _TOSSIM.SerialPacket_destination(*args) def setLength(*args): return _TOSSIM.SerialPacket_setLength(*args) def length(*args): return _TOSSIM.SerialPacket_length(*args) def setType(*args): return _TOSSIM.SerialPacket_setType(*args) def type(*args): return _TOSSIM.SerialPacket_type(*args) def data(*args): return _TOSSIM.SerialPacket_data(*args) def setData(*args): return _TOSSIM.SerialPacket_setData(*args) def maxLength(*args): return _TOSSIM.SerialPacket_maxLength(*args) def deliver(*args): return _TOSSIM.SerialPacket_deliver(*args) def deliverNow(*args): return _TOSSIM.SerialPacket_deliverNow(*args) SerialPacket_swigregister = _TOSSIM.SerialPacket_swigregister SerialPacket_swigregister(SerialPacket) class SerialForwarder(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, SerialForwarder, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, SerialForwarder, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_SerialForwarder(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_SerialForwarder __del__ = lambda self : None; def process(*args): return _TOSSIM.SerialForwarder_process(*args) def dispatchPacket(*args): return _TOSSIM.SerialForwarder_dispatchPacket(*args) def forwardPacket(*args): return _TOSSIM.SerialForwarder_forwardPacket(*args) SerialForwarder_swigregister = _TOSSIM.SerialForwarder_swigregister SerialForwarder_swigregister(SerialForwarder) class Throttle(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, Throttle, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, Throttle, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_Throttle(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_Throttle __del__ = lambda self : None; def initialize(*args): return _TOSSIM.Throttle_initialize(*args) def finalize(*args): return _TOSSIM.Throttle_finalize(*args) def checkThrottle(*args): return _TOSSIM.Throttle_checkThrottle(*args) def printStatistics(*args): return _TOSSIM.Throttle_printStatistics(*args) Throttle_swigregister = _TOSSIM.Throttle_swigregister Throttle_swigregister(Throttle) class variable_string_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, variable_string_t, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, variable_string_t, name) __repr__ = _swig_repr __swig_setmethods__["type"] = _TOSSIM.variable_string_t_type_set __swig_getmethods__["type"] = _TOSSIM.variable_string_t_type_get if _newclass:type = _swig_property(_TOSSIM.variable_string_t_type_get, _TOSSIM.variable_string_t_type_set) __swig_setmethods__["ptr"] = _TOSSIM.variable_string_t_ptr_set __swig_getmethods__["ptr"] = _TOSSIM.variable_string_t_ptr_get if _newclass:ptr = _swig_property(_TOSSIM.variable_string_t_ptr_get, _TOSSIM.variable_string_t_ptr_set) __swig_setmethods__["len"] = _TOSSIM.variable_string_t_len_set __swig_getmethods__["len"] = _TOSSIM.variable_string_t_len_get if _newclass:len = _swig_property(_TOSSIM.variable_string_t_len_get, _TOSSIM.variable_string_t_len_set) __swig_setmethods__["isArray"] = _TOSSIM.variable_string_t_isArray_set __swig_getmethods__["isArray"] = _TOSSIM.variable_string_t_isArray_get if _newclass:isArray = _swig_property(_TOSSIM.variable_string_t_isArray_get, _TOSSIM.variable_string_t_isArray_set) def __init__(self, *args): this = _TOSSIM.new_variable_string_t(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_variable_string_t __del__ = lambda self : None; variable_string_t_swigregister = _TOSSIM.variable_string_t_swigregister variable_string_t_swigregister(variable_string_t) class nesc_app_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, nesc_app_t, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, nesc_app_t, name) __repr__ = _swig_repr __swig_setmethods__["numVariables"] = _TOSSIM.nesc_app_t_numVariables_set __swig_getmethods__["numVariables"] = _TOSSIM.nesc_app_t_numVariables_get if _newclass:numVariables = _swig_property(_TOSSIM.nesc_app_t_numVariables_get, _TOSSIM.nesc_app_t_numVariables_set) __swig_setmethods__["variableNames"] = _TOSSIM.nesc_app_t_variableNames_set __swig_getmethods__["variableNames"] = _TOSSIM.nesc_app_t_variableNames_get if _newclass:variableNames = _swig_property(_TOSSIM.nesc_app_t_variableNames_get, _TOSSIM.nesc_app_t_variableNames_set) __swig_setmethods__["variableTypes"] = _TOSSIM.nesc_app_t_variableTypes_set __swig_getmethods__["variableTypes"] = _TOSSIM.nesc_app_t_variableTypes_get if _newclass:variableTypes = _swig_property(_TOSSIM.nesc_app_t_variableTypes_get, _TOSSIM.nesc_app_t_variableTypes_set) __swig_setmethods__["variableArray"] = _TOSSIM.nesc_app_t_variableArray_set __swig_getmethods__["variableArray"] = _TOSSIM.nesc_app_t_variableArray_get if _newclass:variableArray = _swig_property(_TOSSIM.nesc_app_t_variableArray_get, _TOSSIM.nesc_app_t_variableArray_set) def __init__(self, *args): this = _TOSSIM.new_nesc_app_t(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_nesc_app_t __del__ = lambda self : None; nesc_app_t_swigregister = _TOSSIM.nesc_app_t_swigregister nesc_app_t_swigregister(nesc_app_t) class Variable(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, Variable, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, Variable, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_Variable(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_Variable __del__ = lambda self : None; def getData(*args): return _TOSSIM.Variable_getData(*args) Variable_swigregister = _TOSSIM.Variable_swigregister Variable_swigregister(Variable) class Mote(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, Mote, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, Mote, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_Mote(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_Mote __del__ = lambda self : None; def id(*args): return _TOSSIM.Mote_id(*args) def euid(*args): return _TOSSIM.Mote_euid(*args) def setEuid(*args): return _TOSSIM.Mote_setEuid(*args) def bootTime(*args): return _TOSSIM.Mote_bootTime(*args) def bootAtTime(*args): return _TOSSIM.Mote_bootAtTime(*args) def isOn(*args): return _TOSSIM.Mote_isOn(*args) def turnOff(*args): return _TOSSIM.Mote_turnOff(*args) def turnOn(*args): return _TOSSIM.Mote_turnOn(*args) def getVariable(*args): return _TOSSIM.Mote_getVariable(*args) def addNoiseTraceReading(*args): return _TOSSIM.Mote_addNoiseTraceReading(*args) def createNoiseModel(*args): return _TOSSIM.Mote_createNoiseModel(*args) def generateNoise(*args): return _TOSSIM.Mote_generateNoise(*args) Mote_swigregister = _TOSSIM.Mote_swigregister Mote_swigregister(Mote) class Tossim(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, Tossim, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, Tossim, name) __repr__ = _swig_repr def __init__(self, *args): this = _TOSSIM.new_Tossim(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _TOSSIM.delete_Tossim __del__ = lambda self : None; def init(*args): return _TOSSIM.Tossim_init(*args) def time(*args): return _TOSSIM.Tossim_time(*args) def ticksPerSecond(*args): return _TOSSIM.Tossim_ticksPerSecond(*args) def setTime(*args): return _TOSSIM.Tossim_setTime(*args) def timeStr(*args): return _TOSSIM.Tossim_timeStr(*args) def currentNode(*args): return _TOSSIM.Tossim_currentNode(*args) def getNode(*args): return _TOSSIM.Tossim_getNode(*args) def setCurrentNode(*args): return _TOSSIM.Tossim_setCurrentNode(*args) def addChannel(*args): return _TOSSIM.Tossim_addChannel(*args) def removeChannel(*args): return _TOSSIM.Tossim_removeChannel(*args) def randomSeed(*args): return _TOSSIM.Tossim_randomSeed(*args) def runNextEvent(*args): return _TOSSIM.Tossim_runNextEvent(*args) def mac(*args): return _TOSSIM.Tossim_mac(*args) def radio(*args): return _TOSSIM.Tossim_radio(*args) def newPacket(*args): return _TOSSIM.Tossim_newPacket(*args) def newSerialPacket(*args): return _TOSSIM.Tossim_newSerialPacket(*args) Tossim_swigregister = _TOSSIM.Tossim_swigregister Tossim_swigregister(Tossim) tinyos-2.1.2+dfsg/tos/lib/tossim/sf/Throttle.cpp000066400000000000000000000073631207233610700216040ustar00rootroot00000000000000/* * Copyright (c) 2007 Toilers Research Group - Colorado School of Mines * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Toilers Research Group - Colorado School of * Mines nor the names of its contributors may be used to endorse * or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Author: Chad Metcalf * Date: July 9, 2007 * * A simple Throttle to slow a simulation to near real time. * */ #include "Throttle.h" Throttle::Throttle(Tossim* tossim, const int ms = 10) : sim(tossim), simStartTime(0.0), simEndTime(0.0), simPace(0), throttleCount(0) { // Convert milliseconds to sim_time_t simPace = ms * 10000000ULL; } Throttle::~Throttle() {} void Throttle::initialize() { simStartTime = getTime(); } void Throttle::finalize() { simEndTime = getTime(); } void Throttle::checkThrottle() { double secondsElasped = getTime() - simStartTime; sim_time_t ticksElasped = (sim_time_t) secondsElasped*sim->ticksPerSecond(); sim_time_t difference = sim->time() - ticksElasped; if (difference > simPace) { throttleCount++; double sleepDifference = (double) difference / sim->ticksPerSecond(); simSleep(sleepDifference); } } inline double Throttle::toDouble(struct timeval* tv) { return tv->tv_sec + tv->tv_usec/1e6; } double Throttle::getTime() { struct timeval tv; gettimeofday (&tv, NULL); return toDouble(&tv); } int Throttle::simSleep(double seconds) { struct timespec tv; /* Construct the timespec from the number of whole seconds... */ tv.tv_sec = (time_t) seconds; /* ... and the remainder in nanoseconds. */ tv.tv_nsec = (long) ((seconds - tv.tv_sec) * 1e+9); while (1) { /* Sleep for the time specified in tv. If interrupted by a signal, place the remaining time left to sleep back into tv. */ int rval = nanosleep (&tv, &tv); if (rval == 0) /* Completed the entire sleep time; all done. */ return 0; else if (errno == EINTR) /* Interrupted by a signal. Try again. */ continue; else /* Some other error; bail out. */ return rval; } return 0; } void Throttle::printStatistics() { printf("Number of throttle events %lu\n", throttleCount); if (simEndTime > 0.0) { printf("Total Sim Time: %.6f\n", simEndTime - simStartTime); } } tinyos-2.1.2+dfsg/tos/lib/tossim/sf/Throttle.h000066400000000000000000000046071207233610700212470ustar00rootroot00000000000000/* * Copyright (c) 2007 Toilers Research Group - Colorado School of Mines * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Toilers Research Group - Colorado School of * Mines nor the names of its contributors may be used to endorse * or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Author: Chad Metcalf * Date: July 9, 2007 * * A simple Throttle to slow a simulation to near real time. * */ #ifndef _THROTTLE_H_ #define _THROTTLE_H_ #include #include #include #include "tossim.h" class Throttle { public: Throttle(Tossim* tossim, const int ms); ~Throttle(); void initialize(); void finalize(); void checkThrottle(); void printStatistics(); private: double simStartTime; double simEndTime; sim_time_t simPace; Tossim* sim; unsigned long throttleCount; double getTime(); double toDouble(struct timeval* tv); int simSleep(double seconds); }; #endif // ----- #ifndef _THROTTLE_H_ ----- tinyos-2.1.2+dfsg/tos/lib/tossim/sf/Throttle.i000066400000000000000000000040451207233610700212440ustar00rootroot00000000000000/* * Copyright (c) 2007 Toilers Research Group - Colorado School of Mines * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Toilers Research Group - Colorado School of * Mines nor the names of its contributors may be used to endorse * or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Author: Chad Metcalf * Date: July 9, 2007 * * SWIG interface specification for the Throttle object. */ %{ #include %} %apply (char *STRING, int LENGTH) { (char *data, int len) }; class Throttle { public: Throttle(Tossim* tossim, const int ms); ~Throttle(); void initialize(); void finalize(); void checkThrottle(); void printStatistics(); }; tinyos-2.1.2+dfsg/tos/lib/tossim/sf/examples/000077500000000000000000000000001207233610700211005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tossim/sf/examples/Makefile.Driver000066400000000000000000000042141207233610700237730ustar00rootroot00000000000000# # Copyright (c) 2007 Toilers Research Group - Colorado School of Mines # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of Toilers Research Group - Colorado School of # Mines nor the names of its contributors may be used to endorse # or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD # UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. #* # Author: Chad Metcalf # Date: July 9, 2007 # DRIVER_OBJS=build/micaz/c-sf.o build/micaz/sf.o build/micaz/tossim.o build/micaz/c-support.o build/micaz/sim.o build/micaz/throttle.o SFDIR=$(TOSDIR)/lib/tossim/sf all: make micaz sim-sf g++ -g -c -o TestSerial.o TestSerial.c -I$(TOSDIR)/lib/tossim -I$(SFDIR) g++ -o TestSerial $(DRIVER_OBJS) TestSerial.o -lpython2.5 mig python -target=null -python-classname=TestSerialMsg TestSerial.h test_serial_msg -o TestSerialMsg.py clean: make clean rm -f TestSerial TestSerial.o TestSerialMsg.py *.pyc app.xml tinyos-2.1.2+dfsg/tos/lib/tossim/sf/examples/TestSerial.c000066400000000000000000000052011207233610700233210ustar00rootroot00000000000000/* * Copyright (c) 2007 Toilers Research Group - Colorado School of Mines * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Toilers Research Group - Colorado School of * Mines nor the names of its contributors may be used to endorse * or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Author: Chad Metcalf * Date: Oct 1, 2007 * * A simple TOSSIM driver for the TestSerial application that utilizes * TOSSIM Live extensions. * */ #include #include #include #include #include #include #include int main() { Tossim* t = new Tossim(NULL); t-> init(); Throttle throttle(t, 10); SerialForwarder sf(9001); for (int i = 0; i < 1; i++) { Mote* m = t->getNode(i); m->bootAtTime(rand() % t->ticksPerSecond()); } t->addChannel("Serial", stdout); t->addChannel("TestSerialC", stdout); t->addChannel("Atm128AlarmC", stdout); Radio* r = t->radio(); for (int i = 0; i < 1; i++) { r->setNoise(i, -105.0, 1.0); for (int j = 0; j < 1; j++) { r->add(i, j, -96.0 - (double)abs(i - j)); r->add(j, i, -96.0 - (double)abs(i - j)); } } sf.process(); throttle.initialize(); while(t->time() < 600 * t->ticksPerSecond()) { throttle.checkThrottle(); sf.process(); t->runNextEvent(); } } tinyos-2.1.2+dfsg/tos/lib/tossim/sf/examples/TestSerial.py000066400000000000000000000052051207233610700235330ustar00rootroot00000000000000 # # Copyright (c) 2007 Toilers Research Group - Colorado School of Mines # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of Toilers Research Group - Colorado School of # Mines nor the names of its contributors may be used to endorse # or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD # UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. #* # Author: Chad Metcalf # Date: July 9, 2007 # # A simple TOSSIM driver for the TestSerial application that utilizes # TOSSIM Live extensions. # import sys import time from TOSSIM import * from TestSerialMsg import * t = Tossim([]) m = t.mac() r = t.radio() sf = SerialForwarder(9001) throttle = Throttle(t, 10) t.addChannel("Serial", sys.stdout); t.addChannel("TestSerialC", sys.stdout); for i in range(0, 2): m = t.getNode(i); m.bootAtTime((31 + t.ticksPerSecond() / 10) * i + 1); sf.process(); throttle.initialize(); for i in range(0, 60): throttle.checkThrottle(); t.runNextEvent(); sf.process(); msg = TestSerialMsg() msg.set_counter(7); serialpkt = t.newSerialPacket(); serialpkt.setData(msg.data) serialpkt.setType(msg.get_amType()) serialpkt.setDestination(0) serialpkt.deliver(0, t.time() + 3) pkt = t.newPacket(); pkt.setData(msg.data) pkt.setType(msg.get_amType()) pkt.setDestination(0) pkt.deliver(0, t.time() + 10) for i in range(0, 20): throttle.checkThrottle(); t.runNextEvent(); sf.process(); throttle.printStatistics() tinyos-2.1.2+dfsg/tos/lib/tossim/sf/examples/TestSerialSFClient.py000066400000000000000000000044401207233610700251230ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright (c) 2007 Toilers Research Group - Colorado School of Mines # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of Toilers Research Group - Colorado School of # Mines nor the names of its contributors may be used to endorse # or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD # UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. #* # Author: Chad Metcalf # Date: July 9, 2007 # # A simple Python script that listens on a SF for TestSerial messages. from TestSerialMsg import * from tinyos.message import MoteIF class MyClass: def __init__(self): # Create a MoteIF self.mif = MoteIF.MoteIF() # Attach a source to it self.source = self.mif.addSource("sf@localhost:9001") # SomeMessageClass.py would be generated by MIG self.mif.addListener(self, TestSerialMsg) # Called by the MoteIF's receive thread when a new message # is received def receive(self, src, msg): print "Received message: "+ str(msg) if __name__ == "__main__": m = MyClass() tinyos-2.1.2+dfsg/tos/lib/tossim/sf/generate-swig.bash000066400000000000000000000034521207233610700226660ustar00rootroot00000000000000#!/bin/bash # Copyright (c) 2005 Stanford University. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of the copyright holders nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL # THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE. # # Simple script that generates the Python interfaces to TOSSIM. # # Author: Philip Levis # Author: Chad Metcalf # # $Id: generate-swig.bash,v 1.2 2010-06-29 22:07:51 scipio Exp $ swig -shadow -python -c++ -I$TOSROOT/tos/lib/tossim tossim.i tinyos-2.1.2+dfsg/tos/lib/tossim/sf/sim/000077500000000000000000000000001207233610700200525ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tossim/sf/sim/MainC.nc000066400000000000000000000060141207233610700213640ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This version of Main is the system interface the TinyOS boot * sequence in TOSSIM. It wires the boot sequence implementation to * the scheduler and hardware resources. Unlike the standard Main, * it does not actually define the main function, as a * TOSSIM simulation is triggered from Python. * * @author Philip Levis * @author Chad Metcalf * @date Sep 14 2007 */ // $Id: MainC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ #include "hardware.h" configuration MainC { provides interface Boot; uses interface Init as SoftwareInit; } implementation { components PlatformC, SimMainP, TinySchedulerC; // SimMoteP is not referred to by any component here. // It is included to make sure nesC loads it, as it // includes functionality many other systems depend on. components SimMoteP; SimMainP.Scheduler -> TinySchedulerC; SimMainP.PlatformInit -> PlatformC; // Export the SoftwareInit and Booted for applications SoftwareInit = SimMainP.SoftwareInit; Boot = SimMainP; // These components may not be used by the application, but must // be included. This is because there are Python calls that deliver // packets, and those python calls must terminate somewhere. If // the application does not wire this up to, e.g., ActiveMessageC, // the default handlers make sure nothing happens when a script // tries to deliver a packet to a node that has no radio stack. components ActiveMessageC; components SerialActiveMessageC; } tinyos-2.1.2+dfsg/tos/lib/tossim/sf/sim/SerialActiveMessageC.nc000066400000000000000000000223111207233610700243560ustar00rootroot00000000000000// $Id: SerialActiveMessageC.nc,v 1.3 2010-06-22 20:50:43 scipio Exp $ /* * Copyright (c) 2007 Toilers Research Group - Colorado School of Mines * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Toilers Research Group - Colorado School of * Mines nor the names of its contributors may be used to endorse * or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Author: Chad Metcalf * Date: July 9, 2007 * * The Serial Active Message implementation for use with the TOSSIM Live * extensions. * */ #include #include #include "sim_serial_forwarder.h" module SerialActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements as Acks; } uses { interface TossimPacketModel as Model; command am_addr_t amAddress(); } } implementation { message_t buffer; message_t* bufferPointer = &buffer; message_t* sendMsgPtr = NULL; serial_header_t* getHeader(message_t* amsg) { return (serial_header_t*)(amsg->data - sizeof(serial_header_t)); } task void startDone() { signal SplitControl.startDone(SUCCESS); } task void stopDone() { signal SplitControl.stopDone(SUCCESS); } command error_t SplitControl.start() { post startDone(); return SUCCESS; } command error_t SplitControl.stop() { post stopDone(); return SUCCESS; } command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* amsg, uint8_t len) { error_t err; serial_header_t* header = getHeader(amsg); header->type = id; header->dest = addr; // For out going serial messages we'll use the real TOS_NODE_ID header->src = TOS_NODE_ID; header->length = len; err = call Model.send((int)addr, amsg, len + sizeof(serial_header_t)); return err; } command error_t AMSend.cancel[am_id_t id](message_t* msg) { dbg("Serial", "SerialAM: cancelled a packet\n"); return call Model.cancel(msg); } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } event void Model.sendDone(message_t* msg, error_t result) { signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); } task void modelSendDone () { signal Model.sendDone(sendMsgPtr, SUCCESS); } default command error_t Model.send(int node, message_t* msg, uint8_t len) { sendMsgPtr = msg; dbg("Serial", "Sending serial message (%p) of type %hhu and length %hhu @ %s.\n", msg, call AMPacket.type(msg), len, sim_time_string()); sim_sf_dispatch_packet((void*)msg, len); post modelSendDone (); return SUCCESS; } /* Receiving a packet */ event void Model.receive(message_t* msg) { uint8_t len; void* payload; memcpy(bufferPointer, msg, sizeof(message_t)); if (msg != NULL) { free(msg); } payload = call Packet.getPayload(bufferPointer, call Packet.maxPayloadLength()); len = call Packet.payloadLength(bufferPointer); dbg("Serial", "Received serial message (%p) of type %hhu and length %hhu @ %s.\n", bufferPointer, call AMPacket.type(bufferPointer), len, sim_time_string()); bufferPointer = signal Receive.receive[call AMPacket.type(bufferPointer)] (bufferPointer, payload, len); } event bool Model.shouldAck(message_t* msg) { serial_header_t* header = getHeader(msg); if (header->dest == call amAddress()) { dbg("Acks", "Received packet addressed to me so ack it\n"); return TRUE; } return FALSE; } command am_addr_t AMPacket.address() { return call amAddress(); } command am_addr_t AMPacket.destination(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->dest; } command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { serial_header_t* header = getHeader(amsg); header->dest = addr; } command am_addr_t AMPacket.source(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->src; } command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { serial_header_t* header = getHeader(amsg); header->src = addr; } command bool AMPacket.isForMe(message_t* amsg) { return (call AMPacket.destination(amsg) == call AMPacket.address() || call AMPacket.destination(amsg) == AM_BROADCAST_ADDR); } command am_id_t AMPacket.type(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->type; } command void AMPacket.setType(message_t* amsg, am_id_t t) { serial_header_t* header = getHeader(amsg); header->type = t; } command am_group_t AMPacket.group(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->group; } command void AMPacket.setGroup(message_t* msg, am_group_t group) { serial_header_t* header = getHeader(msg); header->group = group; } command am_group_t AMPacket.localGroup() { return TOS_AM_GROUP; } command void Packet.clear(message_t* msg) {} command void* Packet.getPayload(message_t* msg, uint8_t len) { if (len <= TOSH_DATA_LENGTH) { return msg->data; } else { return NULL; } } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { getHeader(msg)->length = len; } command uint8_t Packet.maxPayloadLength() { return TOSH_DATA_LENGTH; } command uint8_t Packet.payloadLength(message_t* msg) { return getHeader(msg)->length; } async command error_t Acks.requestAck(message_t* msg) { return FAIL; } async command error_t Acks.noAck(message_t* msg) { return SUCCESS; } async command bool Acks.wasAcked(message_t* msg) { return FALSE; } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { return; } default command error_t Model.cancel(message_t* msg) { return FAIL; } default command am_addr_t amAddress() { return 0; } void serial_active_message_deliver_handle(sim_event_t* evt) { message_t* m = (message_t*)evt->data; signal Model.receive(m); } sim_event_t* allocate_serial_deliver_event(int node, message_t* msg, sim_time_t t) { sim_event_t* evt = (sim_event_t*)malloc(sizeof(sim_event_t)); message_t* newMsg = (message_t*)malloc(sizeof(message_t)); uint8_t payloadLength = ((serial_header_t*)msg->header)->length; memcpy(getHeader(newMsg), msg, sizeof(serial_header_t) + payloadLength); evt->mote = node; evt->time = t; evt->handle = serial_active_message_deliver_handle; evt->cleanup = sim_queue_cleanup_event; evt->cancelled = 0; evt->force = 0; evt->data = newMsg; return evt; } void serial_active_message_deliver(int node, message_t* msg, sim_time_t t) @C() @spontaneous() { sim_event_t* evt = allocate_serial_deliver_event(node, msg, t); sim_queue_insert(evt); } } tinyos-2.1.2+dfsg/tos/lib/tossim/sf/sim/tos.h000066400000000000000000000062301207233610700210310ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of all of the basic TOSSIM primitives and utility * functions. * * @author Philip Levis * @author Chad Metcalf * @date July 15 2007 */ // $Id: tos.h,v 1.3 2010-06-29 22:07:51 scipio Exp $ #ifndef TOS_H_INCLUDED #define TOS_H_INCLUDED #if !defined(__CYGWIN__) #if defined(__MSP430__) #include #else #include #endif #else //cygwin #include #include #include #endif #include #include #include #include #include #include /* * TEMPORARY: include the Safe TinyOS macros so that annotations get * defined away for non-safe users -- this will no longer be necessary * after we require users to use the ncc that has Safe TinyOS * support */ #include "../../lib/safe/include/annots_stage1.h" #ifndef __cplusplus typedef uint8_t bool; #endif enum { FALSE = 0, TRUE = 1 }; extern uint16_t TOS_NODE_ID; #define PROGMEM #ifndef TOSSIM_MAX_NODES #define TOSSIM_MAX_NODES 1000 #endif #include #include #include #include // We only want to include these files if we are compiling TOSSIM proper, // that is, the C file representing the TinyOS application. The TinyOS // build process means that this is the only really good place to put // them. #ifdef TOSSIM struct @atmostonce { }; struct @atleastonce { }; struct @exactlyonce { }; #include #include #include #include #include #include #include #endif #endif tinyos-2.1.2+dfsg/tos/lib/tossim/sf/sim_serial_forwarder.c000066400000000000000000000224521207233610700236350ustar00rootroot00000000000000/* * Copyright (c) 2007 Toilers Research Group - Colorado School of Mines * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Toilers Research Group - Colorado School of * Mines nor the names of its contributors may be used to endorse * or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Author: Chad Metcalf * Date: July 9, 2007 * * The serial forwarder for TOSSIM * */ #include #include #include #include #include #include #include #include #include #include #include #include "sim_serial_forwarder.h" #include "sim_serial_packet.h" #include "sim_tossim.h" struct sim_sf_client_list *sim_sf_clients; int sim_sf_server_socket; int sim_sf_packets_read, sim_sf_packets_written, sim_sf_num_clients; int sim_sf_unix_check(const char *msg, int result) { if (result < 0) { perror(msg); exit(2); } return result; } void *sim_sf_xmalloc(size_t s) { void *p = malloc(s); if (!p) { fprintf(stderr, "out of memory\n"); exit(2); } return p; } void sim_sf_fd_wait(fd_set *fds, int *maxfd, int fd) { if (fd > *maxfd) *maxfd = fd; FD_SET(fd, fds); } void sim_sf_pstatus(void) { printf("clients %d, read %d, wrote %d\n", sim_sf_num_clients, sim_sf_packets_read, sim_sf_packets_written); } void sim_sf_add_client(int fd) { struct sim_sf_client_list *c = (struct sim_sf_client_list*)sim_sf_xmalloc(sizeof *c); c->next = sim_sf_clients; sim_sf_clients = c; sim_sf_num_clients++; sim_sf_pstatus(); c->fd = fd; } void sim_sf_rem_client(struct sim_sf_client_list **c) { struct sim_sf_client_list *dead = *c; *c = dead->next; sim_sf_num_clients--; sim_sf_pstatus(); close(dead->fd); free(dead); } void sim_sf_new_client(int fd) { fcntl(fd, F_SETFL, 0); if (sim_sf_init_source(fd) < 0) close(fd); else sim_sf_add_client(fd); } void sim_sf_check_clients(fd_set *fds) { struct sim_sf_client_list **c; for (c = &sim_sf_clients; *c; ) { int isNext = 1; if (FD_ISSET((*c)->fd, fds)) { int len; const void *packet = sim_sf_read_packet((*c)->fd, &len); if (packet) { sim_sf_forward_packet(packet, len); free((void *)packet); } else { sim_sf_rem_client(c); isNext = 0; } } if (isNext) c = &(*c)->next; } } void sim_sf_wait_clients(fd_set *fds, int *maxfd) { struct sim_sf_client_list *c; for (c = sim_sf_clients; c; c = c->next) sim_sf_fd_wait(fds, maxfd, c->fd); } void sim_sf_dispatch_packet(const void *packet, int len) { struct sim_sf_client_list **c; char* dispatchPacket = (char*) sim_sf_xmalloc(len+1); memset(dispatchPacket, 0, len+1); memcpy(dispatchPacket+1, packet, len); for (c = &sim_sf_clients; *c; ) if (sim_sf_write_packet((*c)->fd, dispatchPacket, len+1) >= 0) { sim_sf_packets_written++; c = &(*c)->next; } else sim_sf_rem_client(c); free(dispatchPacket); } void sim_sf_open_server_socket(int port) { struct sockaddr_in me; int opt; sim_sf_server_socket = sim_sf_unix_check("socket", socket(AF_INET, SOCK_STREAM, 0)); sim_sf_unix_check("socket", fcntl(sim_sf_server_socket, F_SETFL, O_NONBLOCK)); memset(&me, 0, sizeof me); me.sin_family = AF_INET; me.sin_port = htons(port); opt = 1; sim_sf_unix_check("setsockopt", setsockopt(sim_sf_server_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt))); sim_sf_unix_check("bind", bind(sim_sf_server_socket, (struct sockaddr *)&me, sizeof me)); sim_sf_unix_check("listen", listen(sim_sf_server_socket, 5)); } void sim_sf_check_new_client(void) { int clientfd = accept(sim_sf_server_socket, NULL, NULL); if (clientfd >= 0) sim_sf_new_client(clientfd); } void sim_sf_forward_packet(const void *packet, int len) { char* forwardPacket = (char*)packet + 1; uint16_t addr = sim_serial_packet_destination((struct sim_serial_packet*)forwardPacket); sim_serial_packet_deliver(addr, (struct sim_serial_packet*)forwardPacket, sim_time()); sim_sf_packets_read++; } void sim_sf_process () { fd_set rfds; int maxfd = -1; struct timeval zero; int ret; zero.tv_sec = zero.tv_usec = 0; FD_ZERO(&rfds); sim_sf_fd_wait(&rfds, &maxfd, sim_sf_server_socket); sim_sf_wait_clients(&rfds, &maxfd); ret = select(maxfd + 1, &rfds, NULL, NULL, &zero); if (ret >= 0) { if (FD_ISSET(sim_sf_server_socket, &rfds)) sim_sf_check_new_client(); sim_sf_check_clients(&rfds); } } int sim_sf_saferead(int fd, void *buffer, int count) { int actual = 0; while (count > 0) { int n = read(fd, buffer, count); if (n == -1 && errno == EINTR) continue; if (n == -1) return -1; if (n == 0) return actual; count -= n; actual += n; buffer = (char*)buffer + n; } return actual; } int sim_sf_safewrite(int fd, const void *buffer, int count) { int actual = 0; while (count > 0) { int n = write(fd, buffer, count); if (n == -1 && errno == EINTR) continue; if (n == -1) return -1; count -= n; actual += n; buffer = (char*)buffer + n; } return actual; } int sim_sf_open_source(const char *host, int port) /* Returns: file descriptor for serial forwarder at host:port */ { int fd = socket(AF_INET, SOCK_STREAM, 0); struct hostent *entry; struct sockaddr_in addr; if (fd < 0) return fd; entry = gethostbyname(host); if (!entry) { close(fd); return -1; } addr.sin_family = entry->h_addrtype; memcpy(&addr.sin_addr, entry->h_addr, entry->h_length); addr.sin_port = htons(port); if (connect(fd, (struct sockaddr *)&addr, sizeof addr) < 0) { close(fd); return -1; } if (sim_sf_init_source(fd) < 0) { close(fd); return -1; } return fd; } int sim_sf_init_source(int fd) /* Effects: Checks that fd is following the TinyOS 2.0 serial forwarder protocol. Use this if you obtain your file descriptor from some other source than open_sf_source (e.g., you're a server) Returns: 0 if it is, -1 otherwise */ { char check[2], us[2]; int version; /* Indicate version and check if a TinyOS 2.0 serial forwarder on the other end */ us[0] = 'U'; us[1] = ' '; if (sim_sf_safewrite(fd, us, 2) != 2 || sim_sf_saferead(fd, check, 2) != 2 || check[0] != 'U') return -1; version = check[1]; if (us[1] < version) version = us[1]; /* Add other cases here for later protocol versions */ switch (version) { case ' ': break; default: return -1; /* not a valid version */ } return 0; } void *sim_sf_read_packet(int fd, int *len) /* Effects: reads packet from serial forwarder on file descriptor fd Returns: the packet read (in newly allocated memory), and *len is set to the packet length, or NULL for failure */ { unsigned char l; void *packet; if (sim_sf_saferead(fd, &l, 1) != 1) return NULL; packet = malloc(l); if (!packet) return NULL; if (sim_sf_saferead(fd, packet, l) != l) { free(packet); return NULL; } *len = l; return packet; } int sim_sf_write_packet(int fd, const void *packet, int len) /* Effects: writes len byte packet to serial forwarder on file descriptor fd Returns: 0 if packet successfully written, -1 otherwise */ { unsigned char l = len; if (sim_sf_safewrite(fd, &l, 1) != 1 || sim_sf_safewrite(fd, packet, l) != l) return -1; return 0; } tinyos-2.1.2+dfsg/tos/lib/tossim/sf/sim_serial_forwarder.h000066400000000000000000000057021207233610700236410ustar00rootroot00000000000000/* * Copyright (c) 2007 Toilers Research Group - Colorado School of Mines * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Toilers Research Group - Colorado School of * Mines nor the names of its contributors may be used to endorse * or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Author: Chad Metcalf * Date: July 9, 2007 * * The serial forwarder for TOSSIM * */ #ifndef _SIM_SERIAL_FORWARDER_H_ #define _SIM_SERIAL_FORWARDER_H_ #include #ifdef __cplusplus extern "C" { #endif struct sim_sf_client_list { struct sim_sf_client_list *next; int fd; }; void sim_sf_forward_packet(const void *packet, int len); void sim_sf_dispatch_packet(const void *packet, int len); void sim_sf_open_server_socket(int port); void sim_sf_process (); int sim_sf_unix_check(const char *msg, int result); void *sim_sf_xmalloc(size_t s); void sim_sf_fd_wait(fd_set *fds, int *maxfd, int fd); void sim_sf_pstatus(void); void sim_sf_add_client(int fd); void sim_sf_rem_client(struct sim_sf_client_list **c); void sim_sf_new_client(int fd); void sim_sf_check_clients(fd_set *fds); void sim_sf_wait_clients(fd_set *fds, int *maxfd); void sim_sf_check_new_client(void); void sim_sf_forward_packet(const void *packet, int len); int sim_sf_saferead(int fd, void *buffer, int count); int sim_sf_safewrite(int fd, const void *buffer, int count); int sim_sf_open_source(const char *host, int port); int sim_sf_init_source(int fd); void *sim_sf_read_packet(int fd, int *len); int sim_sf_write_packet(int fd, const void *packet, int len); #ifdef __cplusplus } #endif #endif // ----- #ifndef _SIM_SERIAL_FORWARDER_H_ ----- tinyos-2.1.2+dfsg/tos/lib/tossim/sf/sim_serial_packet.c000066400000000000000000000112741207233610700231110ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * TOSSIM packet abstract data type, so C++ code can call into nesC * code that does the native-to-network type translation. * * @author Philip Levis * @author Chad Metcalf * @date July 15 2007 */ // $Id: sim_serial_packet.c,v 1.2 2010-06-29 22:07:51 scipio Exp $ #include #include #include // NOTE: This function is defined in lib/tossim/ActiveMessageC. It // has to be predeclared here because it is defined within that component. void serial_active_message_deliver(int node, message_t* m, sim_time_t t); static serial_header_t* getSerialHeader(message_t* msg) { return (serial_header_t*)(msg->data - sizeof(serial_header_t)); } void sim_serial_packet_set_destination(sim_serial_packet_t* msg, uint16_t dest)__attribute__ ((C, spontaneous)) { serial_header_t* hdr = getSerialHeader((message_t*)msg); hdr->dest = dest; }__attribute__ ((C, spontaneous)) uint16_t sim_serial_packet_destination(sim_serial_packet_t* msg)__attribute__ ((C, spontaneous)) { serial_header_t* hdr = getSerialHeader((message_t*)msg); return hdr->dest; } void sim_serial_packet_set_source(sim_serial_packet_t* msg, uint16_t src)__attribute__ ((C, spontaneous)) { serial_header_t* hdr = getSerialHeader((message_t*)msg); hdr->src = src; }__attribute__ ((C, spontaneous)) uint16_t sim_serial_packet_source(sim_serial_packet_t* msg)__attribute__ ((C, spontaneous)) { serial_header_t* hdr = getSerialHeader((message_t*)msg); return hdr->src; } void sim_serial_packet_set_length(sim_serial_packet_t* msg, uint8_t length)__attribute__ ((C, spontaneous)) { serial_header_t* hdr = getSerialHeader((message_t*)msg); hdr->length = length; } uint16_t sim_serial_packet_length(sim_serial_packet_t* msg)__attribute__ ((C, spontaneous)) { serial_header_t* hdr = getSerialHeader((message_t*)msg); return hdr->length; } void sim_serial_packet_set_type(sim_serial_packet_t* msg, uint8_t type) __attribute__ ((C, spontaneous)){ serial_header_t* hdr = getSerialHeader((message_t*)msg); hdr->type = type; } uint8_t sim_serial_packet_type(sim_serial_packet_t* msg) __attribute__ ((C, spontaneous)){ serial_header_t* hdr = getSerialHeader((message_t*)msg); return hdr->type; } uint8_t* sim_serial_packet_data(sim_serial_packet_t* p) __attribute__ ((C, spontaneous)){ message_t* msg = (message_t*)p; return (uint8_t*)&msg->data; } void sim_serial_packet_deliver(int node, sim_serial_packet_t* msg, sim_time_t t) __attribute__ ((C, spontaneous)){ if (t < sim_time()) { t = sim_time(); } dbg("Packet", "sim_serial_packet.c: Delivering packet %p to %i at %llu\n", msg, node, t); serial_active_message_deliver(node, (message_t*)msg, t); } uint8_t sim_serial_packet_max_length(sim_serial_packet_t* msg) __attribute__ ((C, spontaneous)){ return TOSH_DATA_LENGTH; } sim_serial_packet_t* sim_serial_packet_allocate () __attribute__ ((C, spontaneous)){ return (sim_serial_packet_t*)malloc(sizeof(message_t)); } void sim_serial_packet_free(sim_serial_packet_t* p) __attribute__ ((C, spontaneous)) { printf("sim_serial_packet.c: Freeing packet %p\n", p); free(p); } tinyos-2.1.2+dfsg/tos/lib/tossim/sf/sim_serial_packet.h000066400000000000000000000067761207233610700231310ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * TOSSIM packet abstract data type, so C++ code can call into nesC * code that does the native-to-network type translation. * * @author Philip Levis * @author Chad Metcalf * @date July 15 2007 */ // $Id: sim_serial_packet.h,v 1.2 2010-06-29 22:07:51 scipio Exp $ #ifndef SIM_SERIAL_PACKET_H_INCLUDED #define SIM_SERIAL_PACKET_H_INCLUDED #include "sim_tossim.h" #include #ifdef __cplusplus extern "C" { #endif /* * sim_serial_packet_t is a weird beast. It's a dummy type that can stand * in for message_t. We need to use sim_serial_packet_t because gcc can't * understand message_t, due to its network types (nx). So the shim * code between Python and TOSSIM can't mention message_t. Rather * than use a void*, the shim uses sim_serial_packet_t in order to provide * some type checking. A sim_serial_packet_t* is essentially a Python * friendly pointer to a message_t. */ typedef struct sim_serial_packet {} sim_serial_packet_t; void sim_serial_packet_set_destination(sim_serial_packet_t* msg, uint16_t dest); uint16_t sim_serial_packet_destination(sim_serial_packet_t* msg); void sim_serial_packet_set_source(sim_serial_packet_t* msg, uint16_t src); uint16_t sim_serial_packet_source(sim_serial_packet_t* msg); void sim_serial_packet_set_length(sim_serial_packet_t* msg, uint8_t len); uint16_t sim_serial_packet_length(sim_serial_packet_t* msg); void sim_serial_packet_set_type(sim_serial_packet_t* msg, uint8_t type); uint8_t sim_serial_packet_type(sim_serial_packet_t* msg); uint8_t* sim_serial_packet_data(sim_serial_packet_t* msg); void sim_serial_packet_deliver(int node, sim_serial_packet_t* msg, sim_time_t t); uint8_t sim_serial_packet_max_length(sim_serial_packet_t* msg); sim_serial_packet_t* sim_serial_packet_allocate(); void sim_serial_packet_free(sim_serial_packet_t* m); #ifdef __cplusplus } #endif #endif // SIM_SERIAL_PACKET_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tossim/sf/tossim.c000066400000000000000000000160441207233610700207510ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of TOSSIM C++ classes. Generally just directly * call their C analogues. * * @author Philip Levis * @author Chad Metcalf * @date July 15 2007 */ // $Id: tossim.c,v 1.2 2010-06-29 22:07:51 scipio Exp $ #include #include #include #include #include #include #include #include #include #include #include #include #include uint16_t TOS_NODE_ID = 1; Variable::Variable(char* str, char* formatStr, int array, int which) { name = str; format = formatStr; isArray = array; mote = which; int sLen = strlen(name); realName = (char*)malloc(sLen + 1); memcpy(realName, name, sLen + 1); realName[sLen] = 0; for (int i = 0; i < sLen; i++) { if (realName[i] == '.') { realName[i] = '$'; } } // printf("Creating %s realName: %s format: %s %s\n", name, realName, formatStr, array? "[]":""); if (sim_mote_get_variable_info(mote, realName, &ptr, &len) == 0) { data = (char*)malloc(len + 1); data[len] = 0; } else { printf("Could not find variable %s\n", realName); data = NULL; ptr = NULL; } printf("Allocated variable %s\n", realName); } Variable::~Variable() { printf("Freeing variable %s\n", realName); free(data); free(realName); } /* This is the sdbm algorithm, taken from http://www.cs.yorku.ca/~oz/hash.html -pal */ static unsigned int tossim_hash(void* key) { char* str = (char*)key; unsigned int hashVal = 0; int c; while ((c = *str++)) hashVal = c + (hashVal << 6) + (hashVal << 16) - hashVal; return hashVal; } static int tossim_hash_eq(void* key1, void* key2) { return strcmp((char*)key1, (char*)key2) == 0; } variable_string_t Variable::getData() { if (data != NULL && ptr != NULL) { str.ptr = data; str.type = format; str.len = len; str.isArray = isArray; // printf("Getting %s %s %s\n", format, isArray? "[]":"", name); memcpy(data, ptr, len); } else { str.ptr = (char*)""; str.type = (char*)""; str.len = strlen(""); str.isArray = 0; } return str; } Mote::Mote(nesc_app_t* n) { app = n; varTable = create_hashtable(128, tossim_hash, tossim_hash_eq); } Mote::~Mote(){} unsigned long Mote::id() { return nodeID; } long long int Mote::euid() { return sim_mote_euid(nodeID); } void Mote::setEuid(long long int val) { sim_mote_set_euid(nodeID, val); } long long int Mote::bootTime() { return sim_mote_start_time(nodeID); } void Mote::bootAtTime(long long int time) { sim_mote_set_start_time(nodeID, time); sim_mote_enqueue_boot_event(nodeID); } bool Mote::isOn() { return sim_mote_is_on(nodeID); } void Mote::turnOff() { sim_mote_turn_off(nodeID); } void Mote::turnOn() { sim_mote_turn_on(nodeID); } void Mote::setID(unsigned long val) { nodeID = val; } Variable* Mote::getVariable(char* name) { char* typeStr = (char*)""; int isArray; Variable* var; var = (Variable*)hashtable_search(varTable, name); if (var == NULL) { // Could hash this for greater efficiency, // but that would either require transformation // in Tossim class or a more complex typemap. if (app != NULL) { for (int i = 0; i < app->numVariables; i++) { if(strcmp(name, app->variableNames[i]) == 0) { typeStr = app->variableTypes[i]; isArray = app->variableArray[i]; break; } } } // printf("Getting variable %s of type %s %s\n", name, typeStr, isArray? "[]" : ""); var = new Variable(name, typeStr, isArray, nodeID); hashtable_insert(varTable, name, var); } return var; } void Mote::addNoiseTraceReading(int val) { sim_noise_trace_add(id(), (char)val); } void Mote::createNoiseModel() { sim_noise_create_model(id()); } int Mote::generateNoise(int when) { return (int)sim_noise_generate(id(), when); } Tossim::Tossim(nesc_app_t* n) { app = n; init(); } Tossim::~Tossim() { sim_end(); } void Tossim::init() { sim_init(); motes = (Mote**)malloc(sizeof(Mote*) * (TOSSIM_MAX_NODES + 1)); memset(motes, 0, sizeof(Mote*) * TOSSIM_MAX_NODES); } long long int Tossim::time() { return sim_time(); } long long int Tossim::ticksPerSecond() { return sim_ticks_per_sec(); } char* Tossim::timeStr() { sim_print_now(timeBuf, 256); return timeBuf; } void Tossim::setTime(long long int val) { sim_set_time(val); } Mote* Tossim::currentNode() { return getNode(sim_node()); } Mote* Tossim::getNode(unsigned long nodeID) { if (nodeID > TOSSIM_MAX_NODES) { nodeID = TOSSIM_MAX_NODES; // log an error, asked for an invalid node } else { if (motes[nodeID] == NULL) { motes[nodeID] = new Mote(app); if (nodeID == TOSSIM_MAX_NODES) { motes[nodeID]->setID(0xffff); } else { motes[nodeID]->setID(nodeID); } } return motes[nodeID]; } } void Tossim::setCurrentNode(unsigned long nodeID) { sim_set_node(nodeID); } void Tossim::addChannel(char* channel, FILE* file) { sim_add_channel(channel, file); } bool Tossim::removeChannel(char* channel, FILE* file) { return sim_remove_channel(channel, file); } void Tossim::randomSeed(int seed) { return sim_random_seed(seed); } bool Tossim::runNextEvent() { return sim_run_next_event(); } MAC* Tossim::mac() { return new MAC(); } Radio* Tossim::radio() { return new Radio(); } Packet* Tossim::newPacket() { return new Packet(); } SerialPacket* Tossim::newSerialPacket() { return new SerialPacket(); } tinyos-2.1.2+dfsg/tos/lib/tossim/sf/tossim.h000066400000000000000000000072431207233610700207570ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Declaration of C++ objects representing TOSSIM abstractions. * Used to generate Python objects. * * @author Philip Levis * @author Chad Metcalf * @date July 15 2007 */ // $Id: tossim.h,v 1.2 2010-06-29 22:07:51 scipio Exp $ #ifndef TOSSIM_H_INCLUDED #define TOSSIM_H_INCLUDED //#include #include #include #include #include #include #include #include typedef struct variable_string { char* type; char* ptr; int len; int isArray; } variable_string_t; typedef struct nesc_app { int numVariables; char** variableNames; char** variableTypes; int* variableArray; } nesc_app_t; class Variable { public: Variable(char* name, char* format, int array, int mote); ~Variable(); variable_string_t getData(); private: char* name; char* realName; char* format; int mote; void* ptr; char* data; size_t len; int isArray; variable_string_t str; }; class Mote { public: Mote(nesc_app_t* app); ~Mote(); unsigned long id(); long long int euid(); void setEuid(long long int id); long long int bootTime(); void bootAtTime(long long int time); bool isOn(); void turnOff(); void turnOn(); void setID(unsigned long id); void addNoiseTraceReading(int val); void createNoiseModel(); int generateNoise(int when); Variable* getVariable(char* name); private: unsigned long nodeID; nesc_app_t* app; struct hashtable* varTable; }; class Tossim { public: Tossim(nesc_app_t* app); ~Tossim(); void init(); long long int time(); long long int ticksPerSecond(); char* timeStr(); void setTime(long long int time); Mote* currentNode(); Mote* getNode(unsigned long nodeID); void setCurrentNode(unsigned long nodeID); void addChannel(char* channel, FILE* file); bool removeChannel(char* channel, FILE* file); void randomSeed(int seed); bool runNextEvent(); MAC* mac(); Radio* radio(); Packet* newPacket(); SerialPacket* newSerialPacket(); private: char timeBuf[256]; nesc_app_t* app; Mote** motes; }; #endif // TOSSIM_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tossim/sf/tossim.i000066400000000000000000000246741207233610700207670ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SWIG interface specification for TOSSIM. This file defines * the top-level TOSSIM and Mote objects which are exported to * Python. The typemap at the beginning allows a script to * use Python files as a parameter to a function that takes a * FILE* as a parameter (e.g., the logging system in sim_log.h). * * With updates to include SerialForwarder and Throttle * * @author Philip Levis * @author Chad Metcalf * @date July 9, 2007 */ %module TOSSIM %{ #include #include enum { PRIMITIVE_INTEGER = 0, PRIMITIVE_FLOAT = 1, PRIMITIVE_UNKNOWN = 2 }; int lengthOfType(char* type) { if (strcmp(type, "uint8_t") == 0) { return sizeof(uint8_t); } else if (strcmp(type, "uint16_t") == 0) { return sizeof(uint16_t); } else if (strcmp(type, "uint32_t") == 0) { return sizeof(uint32_t); } else if (strcmp(type, "int8_t") == 0) { return sizeof(int8_t); } else if (strcmp(type, "int16_t") == 0) { return sizeof(int16_t); } else if (strcmp(type, "int32_t") == 0) { return sizeof(int32_t); } else if (strcmp(type, "char") == 0) { return sizeof(char); } else if (strcmp(type, "short") == 0) { return sizeof(short); } else if (strcmp(type, "int") == 0) { return sizeof(int); } else if (strcmp(type, "long") == 0) { return sizeof(long); } else if (strcmp(type, "unsigned char") == 0) { return sizeof(unsigned char); } else if (strcmp(type, "unsigned short") == 0) { return sizeof(unsigned short); } else if (strcmp(type, "unsigned int") == 0) { return sizeof(unsigned int); } else if (strcmp(type, "unsigned long") == 0) { return sizeof(unsigned long); } else if (strcmp(type, "float") == 0) { return sizeof(float); } else if (strcmp(type, "double") == 0) { return sizeof(double); } else { return 1; } } int memoryToPrimitive(char* type, char* ptr, long* lval, double* dval) { if (strcmp(type, "uint8_t") == 0) { uint8_t val; memcpy(&val, ptr, sizeof(uint8_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "uint16_t") == 0) { uint16_t val; memcpy(&val, ptr, sizeof(uint16_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "uint32_t") == 0) { uint32_t val; memcpy(&val, ptr, sizeof(uint32_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int8_t") == 0) { int8_t val; memcpy(&val, ptr, sizeof(int8_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int16_t") == 0) { int16_t val; memcpy(&val, ptr, sizeof(int16_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int32_t") == 0) { int32_t val; memcpy(&val, ptr, sizeof(int32_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "char") == 0) { long val; memcpy(&val, ptr, sizeof(char)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "short") == 0) { short val; memcpy(&val, ptr, sizeof(short)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int") == 0) { int val; memcpy(&val, ptr, sizeof(int)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "long") == 0) { long val; memcpy(&val, ptr, sizeof(long)); *lval = val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned char") == 0) { unsigned char val; memcpy(&val, ptr, sizeof(unsigned char)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned short") == 0) { unsigned short val; memcpy(&val, ptr, sizeof(unsigned short)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned int") == 0) { unsigned int val; memcpy(&val, ptr, sizeof(unsigned int)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned long") == 0) { unsigned long val; memcpy(&val, ptr, sizeof(unsigned long)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "float") == 0) { float val; memcpy(&val, ptr, sizeof(float)); *dval = (double)val; return PRIMITIVE_FLOAT; } else if (strcmp(type, "double") == 0) { double val; memcpy(&val, ptr, sizeof(double)); *dval = val; return PRIMITIVE_FLOAT; } else { return PRIMITIVE_UNKNOWN; } } PyObject* valueFromScalar(char* type, char* ptr, int len) { long lval; double dval; int rval = memoryToPrimitive(type, ptr, &lval, &dval); switch(rval) { case PRIMITIVE_INTEGER: return PyInt_FromLong(lval); case PRIMITIVE_FLOAT: return PyFloat_FromDouble(dval); case PRIMITIVE_UNKNOWN: default: return PyString_FromStringAndSize(ptr, len); } } PyObject* listFromArray(char* type, char* ptr, int len) { long lval; double dval; int elementLen = lengthOfType(type); PyObject* list = PyList_New(0); //printf("Generating list of %s\n", type); for (char* tmpPtr = ptr; tmpPtr < ptr + len; tmpPtr += elementLen) { PyList_Append(list, valueFromScalar(type, tmpPtr, elementLen)); } return list; } %} %include mac.i %include radio.i %include packet.i %include SerialPacket.i %include SerialForwarder.i %include Throttle.i #if defined(SWIGPYTHON) %typemap(in) FILE * { if (!PyFile_Check($input)) { PyErr_SetString(PyExc_TypeError, "Requires a file as a parameter."); return NULL; } $1 = PyFile_AsFile($input); } %typemap(out) variable_string_t { if ($1.isArray) { //printf("Generating array %s\n", $1.type); $result = listFromArray ($1.type, $1.ptr, $1.len); } else { //printf("Generating scalar %s\n", $1.type); $result = valueFromScalar($1.type, $1.ptr, $1.len); } if ($result == NULL) { PyErr_SetString(PyExc_RuntimeError, "Error generating Python type from TinyOS variable."); } } %typemap(in) nesc_app_t* { if (!PyList_Check($input)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size($input); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem($input, 3 * i); PyObject* array = PyList_GetItem($input, (3 * i) + 1); PyObject* format = PyList_GetItem($input, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = (char*)""; app->variableTypes[i] = (char*)""; } } $1 = app; } } #endif typedef struct var_string { char* type; char* ptr; int len; int isArray; } variable_string_t; typedef struct nesc_app { int numVariables; char** variableNames; char** variableTypes; int* variableArray; } nesc_app_t; class Variable { public: Variable(char* name, char* format, int array, int mote); ~Variable(); variable_string_t getData(); }; class Mote { public: Mote(nesc_app_t* app); ~Mote(); unsigned long id(); long long int euid(); void setEuid(long long int id); long long int bootTime(); void bootAtTime(long long int time); bool isOn(); void turnOff(); void turnOn(); Variable* getVariable(char* name); void addNoiseTraceReading(int val); void createNoiseModel(); int generateNoise(int when); }; class Tossim { public: Tossim(nesc_app_t* app); ~Tossim(); void init(); long long int time(); long long int ticksPerSecond(); void setTime(long long int time); char* timeStr(); Mote* currentNode(); Mote* getNode(unsigned long nodeID); void setCurrentNode(unsigned long nodeID); void addChannel(char* channel, FILE* file); bool removeChannel(char* channel, FILE* file); void randomSeed(int seed); bool runNextEvent(); MAC* mac(); Radio* radio(); Packet* newPacket(); SerialPacket* newSerialPacket(); }; tinyos-2.1.2+dfsg/tos/lib/tossim/sf/tossim_wrap.cxx000066400000000000000000007526211207233610700223720ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 1.3.31 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGPYTHON #define SWIG_PYTHON_DIRECTOR_NO_VTABLE #ifdef __cplusplus template class SwigValueWrapper { T *tt; public: SwigValueWrapper() : tt(0) { } SwigValueWrapper(const SwigValueWrapper& rhs) : tt(new T(*rhs.tt)) { } SwigValueWrapper(const T& t) : tt(new T(t)) { } ~SwigValueWrapper() { delete tt; } SwigValueWrapper& operator=(const T& t) { delete tt; tt = new T(t); return *this; } operator T&() const { return *tt; } T *operator&() { return tt; } private: SwigValueWrapper& operator=(const SwigValueWrapper& rhs); }; #endif /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) # if (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Python.h has to appear first */ #include /* ----------------------------------------------------------------------------- * swigrun.swg * * This file contains generic CAPI SWIG runtime support for pointer * type checking. * ----------------------------------------------------------------------------- */ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "3" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE # define SWIG_QUOTE_STRING(x) #x # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else # define SWIG_TYPE_TABLE_NAME #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the swig runtime code. In 99.9% of the cases, swig just needs to declare them as 'static'. But only do this if is strictly necessary, ie, if you have problems with your compiler or so. */ #ifndef SWIGRUNTIME # define SWIGRUNTIME SWIGINTERN #endif #ifndef SWIGRUNTIMEINLINE # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif /* Generic buffer size */ #ifndef SWIG_BUFFER_SIZE # define SWIG_BUFFER_SIZE 1024 #endif /* Flags for pointer conversions */ #define SWIG_POINTER_DISOWN 0x1 /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 /* Flags/methods for returning states. The swig conversion methods, as ConvertPtr, return and integer that tells if the conversion was successful or not. And if not, an error code can be returned (see swigerrors.swg for the codes). Use the following macros/flags to set or process the returning states. In old swig versions, you usually write code as: if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { // success code } else { //fail code } Now you can be more explicit as: int res = SWIG_ConvertPtr(obj,vptr,ty.flags); if (SWIG_IsOK(res)) { // success code } else { // fail code } that seems to be the same, but now you can also do Type *ptr; int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); if (SWIG_IsOK(res)) { // success code if (SWIG_IsNewObj(res) { ... delete *ptr; } else { ... } } else { // fail code } I.e., now SWIG_ConvertPtr can return new objects and you can identify the case and take care of the deallocation. Of course that requires also to SWIG_ConvertPtr to return new result values, as int SWIG_ConvertPtr(obj, ptr,...) { if () { if () { *ptr = ; return SWIG_NEWOBJ; } else { *ptr = ; return SWIG_OLDOBJ; } } else { return SWIG_BADOBJ; } } Of course, returning the plain '0(success)/-1(fail)' still works, but you can be more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the swig errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code allows to return the 'cast rank', for example, if you have this int food(double) int fooi(int); and you call food(1) // cast rank '1' (1 -> 1.0) fooi(1) // cast rank '0' just use the SWIG_AddCast()/SWIG_CheckState() */ #define SWIG_OK (0) #define SWIG_ERROR (-1) #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) /* The CastRankLimit says how many bits are used for the cast rank */ #define SWIG_CASTRANKLIMIT (1 << 8) /* The NewMask denotes the object was created (using new/malloc) */ #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) /* The TmpMask is for in/out typemaps that use temporal objects */ #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) /* Simple returning values */ #define SWIG_BADOBJ (SWIG_ERROR) #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) /* Check, add and del mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) #define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) #define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) #define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) /* Cast-Rank Mode */ #if defined(SWIG_CASTRANK_MODE) # ifndef SWIG_TypeRank # define SWIG_TypeRank unsigned long # endif # ifndef SWIG_MAXCASTRANK /* Default cast allowed */ # define SWIG_MAXCASTRANK (2) # endif # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) SWIGINTERNINLINE int SWIG_AddCast(int r) { return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; } SWIGINTERNINLINE int SWIG_CheckState(int r) { return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; } #else /* no cast-rank mode */ # define SWIG_AddCast # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) #endif #include #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *); typedef struct swig_type_info *(*swig_dycast_func)(void **); /* Structure to store inforomation on one type */ typedef struct swig_type_info { const char *name; /* mangled name of this type */ const char *str; /* human readable name of this type */ swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ struct swig_cast_info *cast; /* linked list of types that can cast into this type */ void *clientdata; /* language specific type data */ int owndata; /* flag if the structure owns the clientdata */ } swig_type_info; /* Structure to store a type and conversion function used for casting */ typedef struct swig_cast_info { swig_type_info *type; /* pointer to type that is equivalent to this type */ swig_converter_func converter; /* function to cast the void pointers */ struct swig_cast_info *next; /* pointer to next cast in linked list */ struct swig_cast_info *prev; /* pointer to the previous cast */ } swig_cast_info; /* Structure used to store module information * Each module generates one structure like this, and the runtime collects * all of these structures and stores them in a circularly linked list.*/ typedef struct swig_module_info { swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ size_t size; /* Number of types in this module */ struct swig_module_info *next; /* Pointer to next element in circularly linked list */ swig_type_info **type_initial; /* Array of initially generated type structures */ swig_cast_info **cast_initial; /* Array of initially generated casting structures */ void *clientdata; /* Language specific module data */ } swig_module_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; } return (l1 - f1) - (l2 - f2); } /* Check type equivalence in a name list like ||... Return 0 if not equal, 1 if equal */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { int equiv = 0; const char* te = tb + strlen(tb); const char* ne = nb; while (!equiv && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; if (*ne) ++ne; } return equiv; } /* Check type equivalence in a name list like ||... Return 0 if equal, -1 if nb < tb, 1 if nb > tb */ SWIGRUNTIME int SWIG_TypeCompare(const char *nb, const char *tb) { int equiv = 0; const char* te = tb + strlen(tb); const char* ne = nb; while (!equiv && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; if (*ne) ++ne; } return equiv; } /* think of this as a c++ template<> or a scheme macro */ #define SWIG_TypeCheck_Template(comparison, ty) \ if (ty) { \ swig_cast_info *iter = ty->cast; \ while (iter) { \ if (comparison) { \ if (iter == ty->cast) return iter; \ /* Move iter to the top of the linked list */ \ iter->prev->next = iter->next; \ if (iter->next) \ iter->next->prev = iter->prev; \ iter->next = ty->cast; \ iter->prev = 0; \ if (ty->cast) ty->cast->prev = iter; \ ty->cast = iter; \ return iter; \ } \ iter = iter->next; \ } \ } \ return 0 /* Check the typename */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { SWIG_TypeCheck_Template(strcmp(iter->type->name, c) == 0, ty); } /* Same as previous function, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *into) { SWIG_TypeCheck_Template(iter->type == from, into); } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_cast_info *ty, void *ptr) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { swig_cast_info *cast = ti->cast; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; while (cast) { if (!cast->converter) { swig_type_info *tc = cast->type; if (!tc->clientdata) { SWIG_TypeClientData(tc, clientdata); } } cast = cast->next; } } SWIGRUNTIME void SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientData(ti, clientdata); ti->owndata = 1; } /* Search for a swig_type_info structure only by mangled name Search is a O(log #types) We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_MangledTypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { swig_module_info *iter = start; do { if (iter->size) { register size_t l = 0; register size_t r = iter->size - 1; do { /* since l+r >= 0, we can (>> 1) instead (/ 2) */ register size_t i = (l + r) >> 1; const char *iname = iter->types[i]->name; if (iname) { register int compare = strcmp(name, iname); if (compare == 0) { return iter->types[i]; } else if (compare < 0) { if (i) { r = i - 1; } else { break; } } else if (compare > 0) { l = i + 1; } } else { break; /* should never happen */ } } while (l <= r); } iter = iter->next; } while (iter != end); return 0; } /* Search for a swig_type_info structure for either a mangled name or a human readable name. It first searches the mangled names of the types, which is a O(log #types) If a type is not found it then searches the human readable names, which is O(#types). We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { /* STEP 1: Search the name field using binary search */ swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); if (ret) { return ret; } else { /* STEP 2: If the type hasn't been found, do a complete search of the str field (the human readable name) */ swig_module_info *iter = start; do { register size_t i = 0; for (; i < iter->size; ++i) { if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) return iter->types[i]; } iter = iter->next; } while (iter != end); } /* neither found a match */ return 0; } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; register const unsigned char *u = (unsigned char *) ptr; register const unsigned char *eu = u + sz; for (; u != eu; ++u) { register unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { register unsigned char *u = (unsigned char *) ptr; register const unsigned char *eu = u + sz; for (; u != eu; ++u) { register char d = *(c++); register unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /* Errors in SWIG */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 #define SWIG_IndexError -4 #define SWIG_TypeError -5 #define SWIG_DivisionByZero -6 #define SWIG_OverflowError -7 #define SWIG_SyntaxError -8 #define SWIG_ValueError -9 #define SWIG_SystemError -10 #define SWIG_AttributeError -11 #define SWIG_MemoryError -12 #define SWIG_NullReferenceError -13 /* Add PyOS_snprintf for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) # define PyOS_snprintf _snprintf # else # define PyOS_snprintf snprintf # endif #endif /* A crude PyString_FromFormat implementation for old Pythons */ #if PY_VERSION_HEX < 0x02020000 #ifndef SWIG_PYBUFFER_SIZE # define SWIG_PYBUFFER_SIZE 1024 #endif static PyObject * PyString_FromFormat(const char *fmt, ...) { va_list ap; char buf[SWIG_PYBUFFER_SIZE * 2]; int res; va_start(ap, fmt); res = vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf); } #endif /* Add PyObject_Del for old Pythons */ #if PY_VERSION_HEX < 0x01060000 # define PyObject_Del(op) PyMem_DEL((op)) #endif #ifndef PyObject_DEL # define PyObject_DEL PyObject_Del #endif /* A crude PyExc_StopIteration exception for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # ifndef PyExc_StopIteration # define PyExc_StopIteration PyExc_RuntimeError # endif # ifndef PyObject_GenericGetAttr # define PyObject_GenericGetAttr 0 # endif #endif /* Py_NotImplemented is defined in 2.1 and up. */ #if PY_VERSION_HEX < 0x02010000 # ifndef Py_NotImplemented # define Py_NotImplemented PyExc_RuntimeError # endif #endif /* A crude PyString_AsStringAndSize implementation for old Pythons */ #if PY_VERSION_HEX < 0x02010000 # ifndef PyString_AsStringAndSize # define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;} # endif #endif /* PySequence_Size for old Pythons */ #if PY_VERSION_HEX < 0x02000000 # ifndef PySequence_Size # define PySequence_Size PySequence_Length # endif #endif /* PyBool_FromLong for old Pythons */ #if PY_VERSION_HEX < 0x02030000 static PyObject *PyBool_FromLong(long ok) { PyObject *result = ok ? Py_True : Py_False; Py_INCREF(result); return result; } #endif /* Py_ssize_t for old Pythons */ /* This code is as recommended by: */ /* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */ #if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) typedef int Py_ssize_t; # define PY_SSIZE_T_MAX INT_MAX # define PY_SSIZE_T_MIN INT_MIN #endif /* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME PyObject* SWIG_Python_ErrorType(int code) { PyObject* type = 0; switch(code) { case SWIG_MemoryError: type = PyExc_MemoryError; break; case SWIG_IOError: type = PyExc_IOError; break; case SWIG_RuntimeError: type = PyExc_RuntimeError; break; case SWIG_IndexError: type = PyExc_IndexError; break; case SWIG_TypeError: type = PyExc_TypeError; break; case SWIG_DivisionByZero: type = PyExc_ZeroDivisionError; break; case SWIG_OverflowError: type = PyExc_OverflowError; break; case SWIG_SyntaxError: type = PyExc_SyntaxError; break; case SWIG_ValueError: type = PyExc_ValueError; break; case SWIG_SystemError: type = PyExc_SystemError; break; case SWIG_AttributeError: type = PyExc_AttributeError; break; default: type = PyExc_RuntimeError; } return type; } SWIGRUNTIME void SWIG_Python_AddErrorMsg(const char* mesg) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); PyErr_Clear(); Py_XINCREF(type); PyErr_Format(type, "%s %s", PyString_AsString(old_str), mesg); Py_DECREF(old_str); Py_DECREF(value); } else { PyErr_Format(PyExc_RuntimeError, mesg); } } #if defined(SWIG_PYTHON_NO_THREADS) # if defined(SWIG_PYTHON_THREADS) # undef SWIG_PYTHON_THREADS # endif #endif #if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ # if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) # if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */ # define SWIG_PYTHON_USE_GIL # endif # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ # ifndef SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() # endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { bool status; PyGILState_STATE state; public: void end() { if (status) { PyGILState_Release(state); status = false;} } SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} ~SWIG_Python_Thread_Block() { end(); } }; class SWIG_Python_Thread_Allow { bool status; PyThreadState *save; public: void end() { if (status) { PyEval_RestoreThread(save); status = false; }} SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} ~SWIG_Python_Thread_Allow() { end(); } }; # define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block # define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() # define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow # define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() # else /* C code */ # define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() # define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() # define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) # endif # else /* Old thread way, not implemented, user must provide it */ # if !defined(SWIG_PYTHON_INITIALIZE_THREADS) # define SWIG_PYTHON_INITIALIZE_THREADS # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_END_BLOCK) # define SWIG_PYTHON_THREAD_END_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # endif # if !defined(SWIG_PYTHON_THREAD_END_ALLOW) # define SWIG_PYTHON_THREAD_END_ALLOW # endif # endif #else /* No thread support */ # define SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # define SWIG_PYTHON_THREAD_END_BLOCK # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # define SWIG_PYTHON_THREAD_END_ALLOW #endif /* ----------------------------------------------------------------------------- * Python API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* cc-mode */ #endif #endif /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; #ifdef __cplusplus #if 0 { /* cc-mode */ #endif } #endif /* ----------------------------------------------------------------------------- * See the LICENSE file for information on copyright, usage and redistribution * of SWIG, and the README file for authors - http://www.swig.org/release.html. * * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * ----------------------------------------------------------------------------- */ /* Common SWIG API */ /* for raw pointers */ #define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(ptr, type, flags) #define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) #define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) #define swig_owntype int /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Python_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) #define SWIG_NewClientData(obj) PySwigClientData_New(obj) #define SWIG_SetErrorObj SWIG_Python_SetErrorObj #define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg #define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) #define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) #define SWIG_fail goto fail /* Runtime API implementation */ /* Error manipulation */ SWIGINTERN void SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetObject(errtype, obj); Py_DECREF(obj); SWIG_PYTHON_THREAD_END_BLOCK; } SWIGINTERN void SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(errtype, (char *) msg); SWIG_PYTHON_THREAD_END_BLOCK; } #define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) /* Set a constant value */ SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { PyDict_SetItemString(d, (char*) name, obj); Py_DECREF(obj); } /* Append a value to the result obj */ SWIGINTERN PyObject* SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { #if !defined(SWIG_PYTHON_OUTPUT_TUPLE) if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyList_Check(result)) { PyObject *o2 = result; result = PyList_New(1); PyList_SetItem(result, 0, o2); } PyList_Append(result,obj); Py_DECREF(obj); } return result; #else PyObject* o2; PyObject* o3; if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyTuple_Check(result)) { o2 = result; result = PyTuple_New(1); PyTuple_SET_ITEM(result, 0, o2); } o3 = PyTuple_New(1); PyTuple_SET_ITEM(o3, 0, obj); o2 = result; result = PySequence_Concat(o2, o3); Py_DECREF(o2); Py_DECREF(o3); } return result; #endif } /* Unpack the argument tuple */ SWIGINTERN int SWIG_Python_UnpackTuple(PyObject *args, const char *name, int min, int max, PyObject **objs) { if (!args) { if (!min && !max) { return 1; } else { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", name, (min == max ? "" : "at least "), min); return 0; } } if (!PyTuple_Check(args)) { PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); return 0; } else { register int l = PyTuple_GET_SIZE(args); if (l < min) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at least "), min, l); return 0; } else if (l > max) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at most "), max, l); return 0; } else { register int i; for (i = 0; i < l; ++i) { objs[i] = PyTuple_GET_ITEM(args, i); } for (; l < max; ++l) { objs[l] = 0; } return i + 1; } } } /* A functor is a function object with one single object argument */ #if PY_VERSION_HEX >= 0x02020000 #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); #else #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj); #endif /* Helper for static pointer initialization for both C and C++ code, for example static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); */ #ifdef __cplusplus #define SWIG_STATIC_POINTER(var) var #else #define SWIG_STATIC_POINTER(var) var = 0; if (!var) var #endif /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Flags for new pointer objects */ #define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) #define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) #define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) #ifdef __cplusplus extern "C" { #if 0 } /* cc-mode */ #endif #endif /* How to access Py_None */ #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # ifndef SWIG_PYTHON_NO_BUILD_NONE # ifndef SWIG_PYTHON_BUILD_NONE # define SWIG_PYTHON_BUILD_NONE # endif # endif #endif #ifdef SWIG_PYTHON_BUILD_NONE # ifdef Py_None # undef Py_None # define Py_None SWIG_Py_None() # endif SWIGRUNTIMEINLINE PyObject * _SWIG_Py_None(void) { PyObject *none = Py_BuildValue((char*)""); Py_DECREF(none); return none; } SWIGRUNTIME PyObject * SWIG_Py_None(void) { static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None(); return none; } #endif /* The python void return value */ SWIGRUNTIMEINLINE PyObject * SWIG_Py_Void(void) { PyObject *none = Py_None; Py_INCREF(none); return none; } /* PySwigClientData */ typedef struct { PyObject *klass; PyObject *newraw; PyObject *newargs; PyObject *destroy; int delargs; int implicitconv; } PySwigClientData; SWIGRUNTIMEINLINE int SWIG_Python_CheckImplicit(swig_type_info *ty) { PySwigClientData *data = (PySwigClientData *)ty->clientdata; return data ? data->implicitconv : 0; } SWIGRUNTIMEINLINE PyObject * SWIG_Python_ExceptionType(swig_type_info *desc) { PySwigClientData *data = desc ? (PySwigClientData *) desc->clientdata : 0; PyObject *klass = data ? data->klass : 0; return (klass ? klass : PyExc_RuntimeError); } SWIGRUNTIME PySwigClientData * PySwigClientData_New(PyObject* obj) { if (!obj) { return 0; } else { PySwigClientData *data = (PySwigClientData *)malloc(sizeof(PySwigClientData)); /* the klass element */ data->klass = obj; Py_INCREF(data->klass); /* the newraw method and newargs arguments used to create a new raw instance */ if (PyClass_Check(obj)) { data->newraw = 0; data->newargs = obj; Py_INCREF(obj); } else { #if (PY_VERSION_HEX < 0x02020000) data->newraw = 0; #else data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__"); #endif if (data->newraw) { Py_INCREF(data->newraw); data->newargs = PyTuple_New(1); PyTuple_SetItem(data->newargs, 0, obj); } else { data->newargs = obj; } Py_INCREF(data->newargs); } /* the destroy method, aka as the C++ delete method */ data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__"); if (PyErr_Occurred()) { PyErr_Clear(); data->destroy = 0; } if (data->destroy) { int flags; Py_INCREF(data->destroy); flags = PyCFunction_GET_FLAGS(data->destroy); #ifdef METH_O data->delargs = !(flags & (METH_O)); #else data->delargs = 0; #endif } else { data->delargs = 0; } data->implicitconv = 0; return data; } } SWIGRUNTIME void PySwigClientData_Del(PySwigClientData* data) { Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); } /* =============== PySwigObject =====================*/ typedef struct { PyObject_HEAD void *ptr; swig_type_info *ty; int own; PyObject *next; } PySwigObject; SWIGRUNTIME PyObject * PySwigObject_long(PySwigObject *v) { return PyLong_FromVoidPtr(v->ptr); } SWIGRUNTIME PyObject * PySwigObject_format(const char* fmt, PySwigObject *v) { PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { if (PyTuple_SetItem(args, 0, PySwigObject_long(v)) == 0) { PyObject *ofmt = PyString_FromString(fmt); if (ofmt) { res = PyString_Format(ofmt,args); Py_DECREF(ofmt); } Py_DECREF(args); } } return res; } SWIGRUNTIME PyObject * PySwigObject_oct(PySwigObject *v) { return PySwigObject_format("%o",v); } SWIGRUNTIME PyObject * PySwigObject_hex(PySwigObject *v) { return PySwigObject_format("%x",v); } SWIGRUNTIME PyObject * #ifdef METH_NOARGS PySwigObject_repr(PySwigObject *v) #else PySwigObject_repr(PySwigObject *v, PyObject *args) #endif { const char *name = SWIG_TypePrettyName(v->ty); PyObject *hex = PySwigObject_hex(v); PyObject *repr = PyString_FromFormat("", name, PyString_AsString(hex)); Py_DECREF(hex); if (v->next) { #ifdef METH_NOARGS PyObject *nrep = PySwigObject_repr((PySwigObject *)v->next); #else PyObject *nrep = PySwigObject_repr((PySwigObject *)v->next, args); #endif PyString_ConcatAndDel(&repr,nrep); } return repr; } SWIGRUNTIME int PySwigObject_print(PySwigObject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { #ifdef METH_NOARGS PyObject *repr = PySwigObject_repr(v); #else PyObject *repr = PySwigObject_repr(v, NULL); #endif if (repr) { fputs(PyString_AsString(repr), fp); Py_DECREF(repr); return 0; } else { return 1; } } SWIGRUNTIME PyObject * PySwigObject_str(PySwigObject *v) { char result[SWIG_BUFFER_SIZE]; return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ? PyString_FromString(result) : 0; } SWIGRUNTIME int PySwigObject_compare(PySwigObject *v, PySwigObject *w) { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : ((i > j) ? 1 : 0); } SWIGRUNTIME PyTypeObject* _PySwigObject_type(void); SWIGRUNTIME PyTypeObject* PySwigObject_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = _PySwigObject_type(); return type; } SWIGRUNTIMEINLINE int PySwigObject_Check(PyObject *op) { return ((op)->ob_type == PySwigObject_type()) || (strcmp((op)->ob_type->tp_name,"PySwigObject") == 0); } SWIGRUNTIME PyObject * PySwigObject_New(void *ptr, swig_type_info *ty, int own); SWIGRUNTIME void PySwigObject_dealloc(PyObject *v) { PySwigObject *sobj = (PySwigObject *) v; PyObject *next = sobj->next; if (sobj->own) { swig_type_info *ty = sobj->ty; PySwigClientData *data = ty ? (PySwigClientData *) ty->clientdata : 0; PyObject *destroy = data ? data->destroy : 0; if (destroy) { /* destroy is always a VARARGS method */ PyObject *res; if (data->delargs) { /* we need to create a temporal object to carry the destroy operation */ PyObject *tmp = PySwigObject_New(sobj->ptr, ty, 0); res = SWIG_Python_CallFunctor(destroy, tmp); Py_DECREF(tmp); } else { PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy); res = ((*meth)(mself, v)); } Py_XDECREF(res); } else { const char *name = SWIG_TypePrettyName(ty); #if !defined(SWIG_PYTHON_SILENT_MEMLEAK) printf("swig/python detected a memory leak of type '%s', no destructor found.\n", name); #endif } } Py_XDECREF(next); PyObject_DEL(v); } SWIGRUNTIME PyObject* PySwigObject_append(PyObject* v, PyObject* next) { PySwigObject *sobj = (PySwigObject *) v; #ifndef METH_O PyObject *tmp = 0; if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; next = tmp; #endif if (!PySwigObject_Check(next)) { return NULL; } sobj->next = next; Py_INCREF(next); return SWIG_Py_Void(); } SWIGRUNTIME PyObject* #ifdef METH_NOARGS PySwigObject_next(PyObject* v) #else PySwigObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { PySwigObject *sobj = (PySwigObject *) v; if (sobj->next) { Py_INCREF(sobj->next); return sobj->next; } else { return SWIG_Py_Void(); } } SWIGINTERN PyObject* #ifdef METH_NOARGS PySwigObject_disown(PyObject *v) #else PySwigObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { PySwigObject *sobj = (PySwigObject *)v; sobj->own = 0; return SWIG_Py_Void(); } SWIGINTERN PyObject* #ifdef METH_NOARGS PySwigObject_acquire(PyObject *v) #else PySwigObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { PySwigObject *sobj = (PySwigObject *)v; sobj->own = SWIG_POINTER_OWN; return SWIG_Py_Void(); } SWIGINTERN PyObject* PySwigObject_own(PyObject *v, PyObject *args) { PyObject *val = 0; #if (PY_VERSION_HEX < 0x02020000) if (!PyArg_ParseTuple(args,(char *)"|O:own",&val)) #else if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) #endif { return NULL; } else { PySwigObject *sobj = (PySwigObject *)v; PyObject *obj = PyBool_FromLong(sobj->own); if (val) { #ifdef METH_NOARGS if (PyObject_IsTrue(val)) { PySwigObject_acquire(v); } else { PySwigObject_disown(v); } #else if (PyObject_IsTrue(val)) { PySwigObject_acquire(v,args); } else { PySwigObject_disown(v,args); } #endif } return obj; } } #ifdef METH_O static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)PySwigObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)PySwigObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"}, {(char *)"own", (PyCFunction)PySwigObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)PySwigObject_append, METH_O, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)PySwigObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)PySwigObject_repr, METH_NOARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #else static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)PySwigObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)PySwigObject_acquire, METH_VARARGS, (char *)"aquires ownership of the pointer"}, {(char *)"own", (PyCFunction)PySwigObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)PySwigObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)PySwigObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)PySwigObject_repr, METH_VARARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #endif #if PY_VERSION_HEX < 0x02020000 SWIGINTERN PyObject * PySwigObject_getattr(PySwigObject *sobj,char *name) { return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name); } #endif SWIGRUNTIME PyTypeObject* _PySwigObject_type(void) { static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods PySwigObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ (binaryfunc)0, /*nb_divide*/ (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ (coercion)0, /*nb_coerce*/ (unaryfunc)PySwigObject_long, /*nb_int*/ (unaryfunc)PySwigObject_long, /*nb_long*/ (unaryfunc)0, /*nb_float*/ (unaryfunc)PySwigObject_oct, /*nb_oct*/ (unaryfunc)PySwigObject_hex, /*nb_hex*/ #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ #elif PY_VERSION_HEX >= 0x02000000 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */ #endif }; static PyTypeObject pyswigobject_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ (char *)"PySwigObject", /* tp_name */ sizeof(PySwigObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)PySwigObject_dealloc, /* tp_dealloc */ (printfunc)PySwigObject_print, /* tp_print */ #if PY_VERSION_HEX < 0x02020000 (getattrfunc)PySwigObject_getattr, /* tp_getattr */ #else (getattrfunc)0, /* tp_getattr */ #endif (setattrfunc)0, /* tp_setattr */ (cmpfunc)PySwigObject_compare, /* tp_compare */ (reprfunc)PySwigObject_repr, /* tp_repr */ &PySwigObject_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ (reprfunc)PySwigObject_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigobject_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ swigobject_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; pyswigobject_type = tmp; pyswigobject_type.ob_type = &PyType_Type; type_init = 1; } return &pyswigobject_type; } SWIGRUNTIME PyObject * PySwigObject_New(void *ptr, swig_type_info *ty, int own) { PySwigObject *sobj = PyObject_NEW(PySwigObject, PySwigObject_type()); if (sobj) { sobj->ptr = ptr; sobj->ty = ty; sobj->own = own; sobj->next = 0; } return (PyObject *)sobj; } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; swig_type_info *ty; size_t size; } PySwigPacked; SWIGRUNTIME int PySwigPacked_print(PySwigPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { char result[SWIG_BUFFER_SIZE]; fputs("pack, v->size, 0, sizeof(result))) { fputs("at ", fp); fputs(result, fp); } fputs(v->ty->name,fp); fputs(">", fp); return 0; } SWIGRUNTIME PyObject * PySwigPacked_repr(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return PyString_FromFormat("", result, v->ty->name); } else { return PyString_FromFormat("", v->ty->name); } } SWIGRUNTIME PyObject * PySwigPacked_str(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return PyString_FromFormat("%s%s", result, v->ty->name); } else { return PyString_FromString(v->ty->name); } } SWIGRUNTIME int PySwigPacked_compare(PySwigPacked *v, PySwigPacked *w) { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : ((i > j) ? 1 : 0); return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); } SWIGRUNTIME PyTypeObject* _PySwigPacked_type(void); SWIGRUNTIME PyTypeObject* PySwigPacked_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = _PySwigPacked_type(); return type; } SWIGRUNTIMEINLINE int PySwigPacked_Check(PyObject *op) { return ((op)->ob_type == _PySwigPacked_type()) || (strcmp((op)->ob_type->tp_name,"PySwigPacked") == 0); } SWIGRUNTIME void PySwigPacked_dealloc(PyObject *v) { if (PySwigPacked_Check(v)) { PySwigPacked *sobj = (PySwigPacked *) v; free(sobj->pack); } PyObject_DEL(v); } SWIGRUNTIME PyTypeObject* _PySwigPacked_type(void) { static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; static PyTypeObject pyswigpacked_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ (char *)"PySwigPacked", /* tp_name */ sizeof(PySwigPacked), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)PySwigPacked_dealloc, /* tp_dealloc */ (printfunc)PySwigPacked_print, /* tp_print */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ (cmpfunc)PySwigPacked_compare, /* tp_compare */ (reprfunc)PySwigPacked_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ (reprfunc)PySwigPacked_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigpacked_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; pyswigpacked_type = tmp; pyswigpacked_type.ob_type = &PyType_Type; type_init = 1; } return &pyswigpacked_type; } SWIGRUNTIME PyObject * PySwigPacked_New(void *ptr, size_t size, swig_type_info *ty) { PySwigPacked *sobj = PyObject_NEW(PySwigPacked, PySwigPacked_type()); if (sobj) { void *pack = malloc(size); if (pack) { memcpy(pack, ptr, size); sobj->pack = pack; sobj->ty = ty; sobj->size = size; } else { PyObject_DEL((PyObject *) sobj); sobj = 0; } } return (PyObject *) sobj; } SWIGRUNTIME swig_type_info * PySwigPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { if (PySwigPacked_Check(obj)) { PySwigPacked *sobj = (PySwigPacked *)obj; if (sobj->size != size) return 0; memcpy(ptr, sobj->pack, size); return sobj->ty; } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIMEINLINE PyObject * _SWIG_This(void) { return PyString_FromString("this"); } SWIGRUNTIME PyObject * SWIG_This(void) { static PyObject *SWIG_STATIC_POINTER(swig_this) = _SWIG_This(); return swig_this; } /* #define SWIG_PYTHON_SLOW_GETSET_THIS */ SWIGRUNTIME PySwigObject * SWIG_Python_GetSwigThis(PyObject *pyobj) { if (PySwigObject_Check(pyobj)) { return (PySwigObject *) pyobj; } else { PyObject *obj = 0; #if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000)) if (PyInstance_Check(pyobj)) { obj = _PyInstance_Lookup(pyobj, SWIG_This()); } else { PyObject **dictptr = _PyObject_GetDictPtr(pyobj); if (dictptr != NULL) { PyObject *dict = *dictptr; obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; } else { #ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; } #endif obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } } } #else obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } #endif if (obj && !PySwigObject_Check(obj)) { /* a PyObject is called 'this', try to get the 'real this' PySwigObject from it */ return SWIG_Python_GetSwigThis(obj); } return (PySwigObject *)obj; } } /* Acquire a pointer value */ SWIGRUNTIME int SWIG_Python_AcquirePtr(PyObject *obj, int own) { if (own) { PySwigObject *sobj = SWIG_Python_GetSwigThis(obj); if (sobj) { int oldown = sobj->own; sobj->own = own; return oldown; } } return 0; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { if (!obj) return SWIG_ERROR; if (obj == Py_None) { if (ptr) *ptr = 0; return SWIG_OK; } else { PySwigObject *sobj = SWIG_Python_GetSwigThis(obj); while (sobj) { void *vptr = sobj->ptr; if (ty) { swig_type_info *to = sobj->ty; if (to == ty) { /* no type cast needed */ if (ptr) *ptr = vptr; break; } else { swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) { sobj = (PySwigObject *)sobj->next; } else { if (ptr) *ptr = SWIG_TypeCast(tc,vptr); break; } } } else { if (ptr) *ptr = vptr; break; } } if (sobj) { if (own) *own = sobj->own; if (flags & SWIG_POINTER_DISOWN) { sobj->own = 0; } return SWIG_OK; } else { int res = SWIG_ERROR; if (flags & SWIG_POINTER_IMPLICIT_CONV) { PySwigClientData *data = ty ? (PySwigClientData *) ty->clientdata : 0; if (data && !data->implicitconv) { PyObject *klass = data->klass; if (klass) { PyObject *impconv; data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ impconv = SWIG_Python_CallFunctor(klass, obj); data->implicitconv = 0; if (PyErr_Occurred()) { PyErr_Clear(); impconv = 0; } if (impconv) { PySwigObject *iobj = SWIG_Python_GetSwigThis(impconv); if (iobj) { void *vptr; res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); if (SWIG_IsOK(res)) { if (ptr) { *ptr = vptr; /* transfer the ownership to 'ptr' */ iobj->own = 0; res = SWIG_AddCast(res); res = SWIG_AddNewMask(res); } else { res = SWIG_AddCast(res); } } } Py_DECREF(impconv); } } } } return res; } } } /* Convert a function ptr value */ SWIGRUNTIME int SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { if (!PyCFunction_Check(obj)) { return SWIG_ConvertPtr(obj, ptr, ty, 0); } else { void *vptr = 0; /* here we get the method pointer for callbacks */ const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; if (desc) { desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; if (!desc) return SWIG_ERROR; } if (ty) { swig_cast_info *tc = SWIG_TypeCheck(desc,ty); if (!tc) return SWIG_ERROR; *ptr = SWIG_TypeCast(tc,vptr); } else { *ptr = vptr; } return SWIG_OK; } } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = PySwigPacked_UnpackData(obj, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } /* ----------------------------------------------------------------------------- * Create a new pointer object * ----------------------------------------------------------------------------- */ /* Create a new instance object, whitout calling __init__, and set the 'this' attribute. */ SWIGRUNTIME PyObject* SWIG_Python_NewShadowInstance(PySwigClientData *data, PyObject *swig_this) { #if (PY_VERSION_HEX >= 0x02020000) PyObject *inst = 0; PyObject *newraw = data->newraw; if (newraw) { inst = PyObject_Call(newraw, data->newargs, NULL); if (inst) { #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { PyObject *dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; PyDict_SetItem(dict, SWIG_This(), swig_this); } } #else PyObject *key = SWIG_This(); PyObject_SetAttr(inst, key, swig_this); #endif } } else { PyObject *dict = PyDict_New(); PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } return inst; #else #if (PY_VERSION_HEX >= 0x02010000) PyObject *inst; PyObject *dict = PyDict_New(); PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); return (PyObject *) inst; #else PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); if (inst == NULL) { return NULL; } inst->in_class = (PyClassObject *)data->newargs; Py_INCREF(inst->in_class); inst->in_dict = PyDict_New(); if (inst->in_dict == NULL) { Py_DECREF(inst); return NULL; } #ifdef Py_TPFLAGS_HAVE_WEAKREFS inst->in_weakreflist = NULL; #endif #ifdef Py_TPFLAGS_GC PyObject_GC_Init(inst); #endif PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this); return (PyObject *) inst; #endif #endif } SWIGRUNTIME void SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) { PyObject *dict; #if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; } PyDict_SetItem(dict, SWIG_This(), swig_this); return; } #endif dict = PyObject_GetAttrString(inst, (char*)"__dict__"); PyDict_SetItem(dict, SWIG_This(), swig_this); Py_DECREF(dict); } SWIGINTERN PyObject * SWIG_Python_InitShadowInstance(PyObject *args) { PyObject *obj[2]; if (!SWIG_Python_UnpackTuple(args,(char*)"swiginit", 2, 2, obj)) { return NULL; } else { PySwigObject *sthis = SWIG_Python_GetSwigThis(obj[0]); if (sthis) { PySwigObject_append((PyObject*) sthis, obj[1]); } else { SWIG_Python_SetSwigThis(obj[0], obj[1]); } return SWIG_Py_Void(); } } /* Create a new pointer object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int flags) { if (!ptr) { return SWIG_Py_Void(); } else { int own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; PyObject *robj = PySwigObject_New(ptr, type, own); PySwigClientData *clientdata = type ? (PySwigClientData *)(type->clientdata) : 0; if (clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); if (inst) { Py_DECREF(robj); robj = inst; } } return robj; } } /* Create a new packed object */ SWIGRUNTIMEINLINE PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return ptr ? PySwigPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_module_info * SWIG_Python_GetModule(void) { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } #endif } return (swig_module_info *) type_pointer; } #if PY_MAJOR_VERSION < 2 /* PyModule_AddObject function was introduced in Python 2.0. The following function is copied out of Python/modsupport.c in python version 2.3.4 */ SWIGINTERN int PyModule_AddObject(PyObject *m, char *name, PyObject *o) { PyObject *dict; if (!PyModule_Check(m)) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); return SWIG_ERROR; } if (!o) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); return SWIG_ERROR; } dict = PyModule_GetDict(m); if (dict == NULL) { /* Internal error -- modules must have a dict! */ PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", PyModule_GetName(m)); return SWIG_ERROR; } if (PyDict_SetItemString(dict, name, o)) return SWIG_ERROR; Py_DECREF(o); return SWIG_OK; } #endif SWIGRUNTIME void SWIG_Python_DestroyModule(void *vptr) { swig_module_info *swig_module = (swig_module_info *) vptr; swig_type_info **types = swig_module->types; size_t i; for (i =0; i < swig_module->size; ++i) { swig_type_info *ty = types[i]; if (ty->owndata) { PySwigClientData *data = (PySwigClientData *) ty->clientdata; if (data) PySwigClientData_Del(data); } } Py_DECREF(SWIG_This()); } SWIGRUNTIME void SWIG_Python_SetModule(swig_module_info *swig_module) { static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} };/* Sentinel */ PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } } /* The python cached type query */ SWIGRUNTIME PyObject * SWIG_Python_TypeCache(void) { static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); return cache; } SWIGRUNTIME swig_type_info * SWIG_Python_TypeQuery(const char *type) { PyObject *cache = SWIG_Python_TypeCache(); PyObject *key = PyString_FromString(type); PyObject *obj = PyDict_GetItem(cache, key); swig_type_info *descriptor; if (obj) { descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj); } else { swig_module_info *swig_module = SWIG_Python_GetModule(); descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); if (descriptor) { obj = PyCObject_FromVoidPtr(descriptor, NULL); PyDict_SetItem(cache, key, obj); Py_DECREF(obj); } } Py_DECREF(key); return descriptor; } /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, PyString_AsString(old_str)); } else { PyErr_Format(type, "%s %s", PyString_AsString(old_str), mesg); } Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } SWIGRUNTIMEINLINE const char * PySwigObject_GetDesc(PyObject *self) { PySwigObject *v = (PySwigObject *)self; swig_type_info *ty = v ? v->ty : 0; return ty ? ty->str : (char*)""; } SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (obj && PySwigObject_Check(obj)) { const char *otype = (const char *) PySwigObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'PySwigObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? PyString_AsString(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_XDECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); if (flags & SWIG_POINTER_EXCEPTION) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } } return result; } #ifdef __cplusplus #if 0 { /* cc-mode */ #endif } #endif #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) #define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_FILE swig_types[0] #define SWIGTYPE_p_MAC swig_types[1] #define SWIGTYPE_p_Mote swig_types[2] #define SWIGTYPE_p_Packet swig_types[3] #define SWIGTYPE_p_Radio swig_types[4] #define SWIGTYPE_p_SerialForwarder swig_types[5] #define SWIGTYPE_p_SerialPacket swig_types[6] #define SWIGTYPE_p_Throttle swig_types[7] #define SWIGTYPE_p_Tossim swig_types[8] #define SWIGTYPE_p_Variable swig_types[9] #define SWIGTYPE_p_char swig_types[10] #define SWIGTYPE_p_int swig_types[11] #define SWIGTYPE_p_nesc_app swig_types[12] #define SWIGTYPE_p_p_char swig_types[13] #define SWIGTYPE_p_var_string swig_types[14] static swig_type_info *swig_types[16]; static swig_module_info swig_module = {swig_types, 15, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) /* -------- TYPES TABLE (END) -------- */ #if (PY_VERSION_HEX <= 0x02000000) # if !defined(SWIG_PYTHON_CLASSIC) # error "This python version requires swig to be run with the '-classic' option" # endif #endif /*----------------------------------------------- @(target):= _TOSSIM.so ------------------------------------------------*/ #define SWIG_init init_TOSSIM #define SWIG_name "_TOSSIM" #define SWIGVERSION 0x010331 #define SWIG_VERSION SWIGVERSION #define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) #define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) #include namespace swig { class PyObject_ptr { protected: PyObject *_obj; public: PyObject_ptr() :_obj(0) { } PyObject_ptr(const PyObject_ptr& item) : _obj(item._obj) { Py_XINCREF(_obj); } PyObject_ptr(PyObject *obj, bool initial_ref = true) :_obj(obj) { if (initial_ref) Py_XINCREF(_obj); } PyObject_ptr & operator=(const PyObject_ptr& item) { Py_XINCREF(item._obj); Py_XDECREF(_obj); _obj = item._obj; return *this; } ~PyObject_ptr() { Py_XDECREF(_obj); } operator PyObject *() const { return _obj; } PyObject *operator->() const { return _obj; } }; } namespace swig { struct PyObject_var : PyObject_ptr { PyObject_var(PyObject* obj = 0) : PyObject_ptr(obj, false) { } PyObject_var & operator = (PyObject* obj) { Py_XDECREF(_obj); _obj = obj; return *this; } }; } #include #include enum { PRIMITIVE_INTEGER = 0, PRIMITIVE_FLOAT = 1, PRIMITIVE_UNKNOWN = 2 }; int lengthOfType(char* type) { if (strcmp(type, "uint8_t") == 0) { return sizeof(uint8_t); } else if (strcmp(type, "uint16_t") == 0) { return sizeof(uint16_t); } else if (strcmp(type, "uint32_t") == 0) { return sizeof(uint32_t); } else if (strcmp(type, "int8_t") == 0) { return sizeof(int8_t); } else if (strcmp(type, "int16_t") == 0) { return sizeof(int16_t); } else if (strcmp(type, "int32_t") == 0) { return sizeof(int32_t); } else if (strcmp(type, "char") == 0) { return sizeof(char); } else if (strcmp(type, "short") == 0) { return sizeof(short); } else if (strcmp(type, "int") == 0) { return sizeof(int); } else if (strcmp(type, "long") == 0) { return sizeof(long); } else if (strcmp(type, "unsigned char") == 0) { return sizeof(unsigned char); } else if (strcmp(type, "unsigned short") == 0) { return sizeof(unsigned short); } else if (strcmp(type, "unsigned int") == 0) { return sizeof(unsigned int); } else if (strcmp(type, "unsigned long") == 0) { return sizeof(unsigned long); } else if (strcmp(type, "float") == 0) { return sizeof(float); } else if (strcmp(type, "double") == 0) { return sizeof(double); } else { return 1; } } int memoryToPrimitive(char* type, char* ptr, long* lval, double* dval) { if (strcmp(type, "uint8_t") == 0) { uint8_t val; memcpy(&val, ptr, sizeof(uint8_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "uint16_t") == 0) { uint16_t val; memcpy(&val, ptr, sizeof(uint16_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "uint32_t") == 0) { uint32_t val; memcpy(&val, ptr, sizeof(uint32_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int8_t") == 0) { int8_t val; memcpy(&val, ptr, sizeof(int8_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int16_t") == 0) { int16_t val; memcpy(&val, ptr, sizeof(int16_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int32_t") == 0) { int32_t val; memcpy(&val, ptr, sizeof(int32_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "char") == 0) { long val; memcpy(&val, ptr, sizeof(char)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "short") == 0) { short val; memcpy(&val, ptr, sizeof(short)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int") == 0) { int val; memcpy(&val, ptr, sizeof(int)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "long") == 0) { long val; memcpy(&val, ptr, sizeof(long)); *lval = val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned char") == 0) { unsigned char val; memcpy(&val, ptr, sizeof(unsigned char)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned short") == 0) { unsigned short val; memcpy(&val, ptr, sizeof(unsigned short)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned int") == 0) { unsigned int val; memcpy(&val, ptr, sizeof(unsigned int)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned long") == 0) { unsigned long val; memcpy(&val, ptr, sizeof(unsigned long)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "float") == 0) { float val; memcpy(&val, ptr, sizeof(float)); *dval = (double)val; return PRIMITIVE_FLOAT; } else if (strcmp(type, "double") == 0) { double val; memcpy(&val, ptr, sizeof(double)); *dval = val; return PRIMITIVE_FLOAT; } else { return PRIMITIVE_UNKNOWN; } } PyObject* valueFromScalar(char* type, char* ptr, int len) { long lval; double dval; int rval = memoryToPrimitive(type, ptr, &lval, &dval); switch(rval) { case PRIMITIVE_INTEGER: return PyInt_FromLong(lval); case PRIMITIVE_FLOAT: return PyFloat_FromDouble(dval); case PRIMITIVE_UNKNOWN: default: return PyString_FromStringAndSize(ptr, len); } } PyObject* listFromArray(char* type, char* ptr, int len) { long lval; double dval; int elementLen = lengthOfType(type); PyObject* list = PyList_New(0); //printf("Generating list of %s\n", type); for (char* tmpPtr = ptr; tmpPtr < ptr + len; tmpPtr += elementLen) { PyList_Append(list, valueFromScalar(type, tmpPtr, elementLen)); } return list; } #include #define SWIG_From_long PyInt_FromLong SWIGINTERNINLINE PyObject * SWIG_From_int (int value) { return SWIG_From_long (value); } #include #ifndef LLONG_MIN # define LLONG_MIN LONG_LONG_MIN #endif #ifndef LLONG_MAX # define LLONG_MAX LONG_LONG_MAX #endif #ifndef ULLONG_MAX # define ULLONG_MAX ULONG_LONG_MAX #endif SWIGINTERN int SWIG_AsVal_double (PyObject *obj, double *val) { int res = SWIG_TypeError; if (PyFloat_Check(obj)) { if (val) *val = PyFloat_AsDouble(obj); return SWIG_OK; } else if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else if (PyLong_Check(obj)) { double v = PyLong_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; double d = PyFloat_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = d; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); } else { PyErr_Clear(); } } } #endif return res; } #include #include SWIGINTERNINLINE int SWIG_CanCastAsInteger(double *d, double min, double max) { double x = *d; if ((min <= x && x <= max)) { double fx = floor(x); double cx = ceil(x); double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ if ((errno == EDOM) || (errno == ERANGE)) { errno = 0; } else { double summ, reps, diff; if (rd < x) { diff = x - rd; } else if (rd > x) { diff = rd - x; } else { return 1; } summ = rd + x; reps = diff/summ; if (reps < 8*DBL_EPSILON) { *d = rd; return 1; } } } return 0; } SWIGINTERN int SWIG_AsVal_long (PyObject *obj, long* val) { if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else if (PyLong_Check(obj)) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; long v = PyInt_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } #endif return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_int (PyObject * obj, int *val) { long v; int res = SWIG_AsVal_long (obj, &v); if (SWIG_IsOK(res)) { if ((v < INT_MIN || v > INT_MAX)) { return SWIG_OverflowError; } else { if (val) *val = static_cast< int >(v); } } return res; } #include #define SWIG_From_double PyFloat_FromDouble SWIGINTERNINLINE PyObject* SWIG_From_bool (bool value) { return PyBool_FromLong(value ? 1 : 0); } #include SWIGINTERN swig_type_info* SWIG_pchar_descriptor(void) { static int init = 0; static swig_type_info* info = 0; if (!init) { info = SWIG_TypeQuery("_p_char"); init = 1; } return info; } SWIGINTERNINLINE PyObject * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); return pchar_descriptor ? SWIG_NewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void(); } else { return PyString_FromStringAndSize(carray, static_cast< int >(size)); } } else { return SWIG_Py_Void(); } } SWIGINTERNINLINE PyObject * SWIG_FromCharPtr(const char *cptr) { return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); } SWIGINTERN int SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) { if (PyString_Check(obj)) { char *cstr; Py_ssize_t len; PyString_AsStringAndSize(obj, &cstr, &len); if (cptr) { if (alloc) { /* In python the user should not be able to modify the inner string representation. To warranty that, if you define SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string buffer is always returned. The default behavior is just to return the pointer value, so, be careful. */ #if defined(SWIG_PYTHON_SAFE_CSTRINGS) if (*alloc != SWIG_OLDOBJ) #else if (*alloc == SWIG_NEWOBJ) #endif { *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1))); *alloc = SWIG_NEWOBJ; } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } else { *cptr = PyString_AsString(obj); } } if (psize) *psize = len + 1; return SWIG_OK; } else { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_long_SS_long (PyObject *obj, long long *val) { int res = SWIG_TypeError; if (PyLong_Check(obj)) { long long v = PyLong_AsLongLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } else { long v; res = SWIG_AsVal_long (obj,&v); if (SWIG_IsOK(res)) { if (val) *val = v; return res; } } #ifdef SWIG_PYTHON_CAST_MODE { const double mant_max = 1LL << DBL_MANT_DIG; const double mant_min = -mant_max; double d; res = SWIG_AsVal_double (obj,&d); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) { if (val) *val = (long long)(d); return SWIG_AddCast(res); } res = SWIG_TypeError; } #endif return res; } #include #include #include SWIGINTERNINLINE PyObject* SWIG_From_unsigned_SS_long (unsigned long value) { return (value > LONG_MAX) ? PyLong_FromUnsignedLong(value) : PyInt_FromLong(static_cast< long >(value)); } SWIGINTERNINLINE PyObject* SWIG_From_long_SS_long (long long value) { return ((value < LONG_MIN) || (value > LONG_MAX)) ? PyLong_FromLongLong(value) : PyInt_FromLong(static_cast< long >(value)); } SWIGINTERN int SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) { if (PyInt_Check(obj)) { long v = PyInt_AsLong(obj); if (v >= 0) { if (val) *val = v; return SWIG_OK; } else { return SWIG_OverflowError; } } else if (PyLong_Check(obj)) { unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { if (val) *val = (unsigned long)(d); return res; } } } #endif return SWIG_TypeError; } #ifdef __cplusplus extern "C" { #endif SWIGINTERN PyObject *_wrap_new_MAC(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_MAC")) SWIG_fail; result = (MAC *)new MAC(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MAC, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_MAC(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_MAC",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MAC" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_initHigh(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_initHigh",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_initHigh" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->initHigh(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_initLow(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_initLow",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_initLow" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->initLow(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_high(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_high",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_high" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->high(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_low(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_low",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_low" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->low(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_symbolsPerSec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_symbolsPerSec",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_symbolsPerSec" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->symbolsPerSec(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_bitsPerSymbol(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_bitsPerSymbol",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_bitsPerSymbol" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->bitsPerSymbol(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_preambleLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_preambleLength",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_preambleLength" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->preambleLength(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_exponentBase(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_exponentBase",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_exponentBase" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->exponentBase(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_maxIterations(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_maxIterations",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_maxIterations" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->maxIterations(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_minFreeSamples(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_minFreeSamples",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_minFreeSamples" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->minFreeSamples(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_rxtxDelay(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_rxtxDelay",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_rxtxDelay" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->rxtxDelay(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_ackTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_ackTime",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_ackTime" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->ackTime(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setInitHigh(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setInitHigh",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setInitHigh" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setInitHigh" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setInitHigh(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setInitLow(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setInitLow",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setInitLow" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setInitLow" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setInitLow(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setHigh(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setHigh",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setHigh" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setHigh" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setHigh(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setLow(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setLow",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setLow" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setLow" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setLow(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setSymbolsPerSec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setSymbolsPerSec",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setSymbolsPerSec" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setSymbolsPerSec" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setSymbolsPerSec(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setBitsBerSymbol(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setBitsBerSymbol",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setBitsBerSymbol" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setBitsBerSymbol" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setBitsBerSymbol(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setPreambleLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setPreambleLength",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setPreambleLength" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setPreambleLength" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setPreambleLength(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setExponentBase(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setExponentBase",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setExponentBase" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setExponentBase" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setExponentBase(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setMaxIterations(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setMaxIterations",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setMaxIterations" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setMaxIterations" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setMaxIterations(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setMinFreeSamples(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setMinFreeSamples",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setMinFreeSamples" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setMinFreeSamples" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setMinFreeSamples(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setRxtxDelay(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setRxtxDelay",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setRxtxDelay" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setRxtxDelay" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setRxtxDelay(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setAckTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setAckTime",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setAckTime" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setAckTime" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setAckTime(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *MAC_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_MAC, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_new_Radio(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_Radio")) SWIG_fail; result = (Radio *)new Radio(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Radio, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_Radio(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_Radio",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Radio" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Radio_add(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; int arg2 ; int arg3 ; double arg4 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:Radio_add",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Radio_add" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Radio_add" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Radio_add" "', argument " "3"" of type '" "int""'"); } arg3 = static_cast< int >(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Radio_add" "', argument " "4"" of type '" "double""'"); } arg4 = static_cast< double >(val4); (arg1)->add(arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Radio_gain(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; int arg2 ; int arg3 ; double result; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:Radio_gain",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Radio_gain" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Radio_gain" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Radio_gain" "', argument " "3"" of type '" "int""'"); } arg3 = static_cast< int >(val3); result = (double)(arg1)->gain(arg2,arg3); resultobj = SWIG_From_double(static_cast< double >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Radio_connected(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; int arg2 ; int arg3 ; bool result; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:Radio_connected",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Radio_connected" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Radio_connected" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Radio_connected" "', argument " "3"" of type '" "int""'"); } arg3 = static_cast< int >(val3); result = (bool)(arg1)->connected(arg2,arg3); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Radio_remove(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; int arg2 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:Radio_remove",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Radio_remove" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Radio_remove" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Radio_remove" "', argument " "3"" of type '" "int""'"); } arg3 = static_cast< int >(val3); (arg1)->remove(arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Radio_setNoise(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; int arg2 ; double arg3 ; double arg4 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:Radio_setNoise",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Radio_setNoise" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Radio_setNoise" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Radio_setNoise" "', argument " "3"" of type '" "double""'"); } arg3 = static_cast< double >(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Radio_setNoise" "', argument " "4"" of type '" "double""'"); } arg4 = static_cast< double >(val4); (arg1)->setNoise(arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Radio_setSensitivity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Radio_setSensitivity",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Radio_setSensitivity" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Radio_setSensitivity" "', argument " "2"" of type '" "double""'"); } arg2 = static_cast< double >(val2); (arg1)->setSensitivity(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *Radio_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_Radio, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_new_Packet(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_Packet")) SWIG_fail; result = (Packet *)new Packet(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Packet, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_Packet(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_Packet",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Packet" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_setSource(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_setSource",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_setSource" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_setSource" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setSource(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_source(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Packet_source",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_source" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); result = (int)(arg1)->source(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_setDestination(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_setDestination",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_setDestination" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_setDestination" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setDestination(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_destination(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Packet_destination",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_destination" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); result = (int)(arg1)->destination(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_setLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_setLength",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_setLength" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_setLength" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setLength(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_length(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Packet_length",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_length" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); result = (int)(arg1)->length(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_setType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_setType",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_setType" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_setType" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setType(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_type(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Packet_type",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_type" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); result = (int)(arg1)->type(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_data(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; char *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Packet_data",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_data" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); result = (char *)(arg1)->data(); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_setData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; size_t size2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_setData",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_setData" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, &size2, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Packet_setData" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); arg3 = static_cast< int >(size2 - 1); (arg1)->setData(arg2,arg3); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_Packet_maxLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Packet_maxLength",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_maxLength" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); result = (int)(arg1)->maxLength(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_setStrength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_setStrength",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_setStrength" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_setStrength" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setStrength(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_deliver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; long long arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; long long val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:Packet_deliver",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_deliver" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_deliver" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_long_SS_long(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Packet_deliver" "', argument " "3"" of type '" "long long""'"); } arg3 = static_cast< long long >(val3); (arg1)->deliver(arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_deliverNow(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_deliverNow",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_deliverNow" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_deliverNow" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->deliverNow(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *Packet_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_Packet, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_new_SerialPacket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialPacket *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_SerialPacket")) SWIG_fail; result = (SerialPacket *)new SerialPacket(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SerialPacket, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_SerialPacket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialPacket *arg1 = (SerialPacket *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_SerialPacket",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialPacket, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SerialPacket" "', argument " "1"" of type '" "SerialPacket *""'"); } arg1 = reinterpret_cast< SerialPacket * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SerialPacket_setDestination(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialPacket *arg1 = (SerialPacket *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:SerialPacket_setDestination",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialPacket, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPacket_setDestination" "', argument " "1"" of type '" "SerialPacket *""'"); } arg1 = reinterpret_cast< SerialPacket * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPacket_setDestination" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setDestination(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SerialPacket_destination(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialPacket *arg1 = (SerialPacket *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:SerialPacket_destination",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialPacket, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPacket_destination" "', argument " "1"" of type '" "SerialPacket *""'"); } arg1 = reinterpret_cast< SerialPacket * >(argp1); result = (int)(arg1)->destination(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SerialPacket_setLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialPacket *arg1 = (SerialPacket *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:SerialPacket_setLength",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialPacket, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPacket_setLength" "', argument " "1"" of type '" "SerialPacket *""'"); } arg1 = reinterpret_cast< SerialPacket * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPacket_setLength" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setLength(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SerialPacket_length(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialPacket *arg1 = (SerialPacket *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:SerialPacket_length",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialPacket, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPacket_length" "', argument " "1"" of type '" "SerialPacket *""'"); } arg1 = reinterpret_cast< SerialPacket * >(argp1); result = (int)(arg1)->length(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SerialPacket_setType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialPacket *arg1 = (SerialPacket *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:SerialPacket_setType",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialPacket, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPacket_setType" "', argument " "1"" of type '" "SerialPacket *""'"); } arg1 = reinterpret_cast< SerialPacket * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPacket_setType" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setType(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SerialPacket_type(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialPacket *arg1 = (SerialPacket *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:SerialPacket_type",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialPacket, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPacket_type" "', argument " "1"" of type '" "SerialPacket *""'"); } arg1 = reinterpret_cast< SerialPacket * >(argp1); result = (int)(arg1)->type(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SerialPacket_data(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialPacket *arg1 = (SerialPacket *) 0 ; char *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:SerialPacket_data",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialPacket, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPacket_data" "', argument " "1"" of type '" "SerialPacket *""'"); } arg1 = reinterpret_cast< SerialPacket * >(argp1); result = (char *)(arg1)->data(); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SerialPacket_setData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialPacket *arg1 = (SerialPacket *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; size_t size2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:SerialPacket_setData",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialPacket, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPacket_setData" "', argument " "1"" of type '" "SerialPacket *""'"); } arg1 = reinterpret_cast< SerialPacket * >(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, &size2, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SerialPacket_setData" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); arg3 = static_cast< int >(size2 - 1); (arg1)->setData(arg2,arg3); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_SerialPacket_maxLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialPacket *arg1 = (SerialPacket *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:SerialPacket_maxLength",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialPacket, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPacket_maxLength" "', argument " "1"" of type '" "SerialPacket *""'"); } arg1 = reinterpret_cast< SerialPacket * >(argp1); result = (int)(arg1)->maxLength(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SerialPacket_deliver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialPacket *arg1 = (SerialPacket *) 0 ; int arg2 ; long long arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; long long val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:SerialPacket_deliver",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialPacket, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPacket_deliver" "', argument " "1"" of type '" "SerialPacket *""'"); } arg1 = reinterpret_cast< SerialPacket * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPacket_deliver" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_long_SS_long(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SerialPacket_deliver" "', argument " "3"" of type '" "long long""'"); } arg3 = static_cast< long long >(val3); (arg1)->deliver(arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SerialPacket_deliverNow(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialPacket *arg1 = (SerialPacket *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:SerialPacket_deliverNow",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialPacket, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialPacket_deliverNow" "', argument " "1"" of type '" "SerialPacket *""'"); } arg1 = reinterpret_cast< SerialPacket * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SerialPacket_deliverNow" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->deliverNow(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *SerialPacket_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_SerialPacket, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_new_SerialForwarder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; SerialForwarder *result = 0 ; int val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:new_SerialForwarder",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SerialForwarder" "', argument " "1"" of type '" "int""'"); } arg1 = static_cast< int >(val1); result = (SerialForwarder *)new SerialForwarder(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SerialForwarder, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_SerialForwarder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialForwarder *arg1 = (SerialForwarder *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_SerialForwarder",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialForwarder, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SerialForwarder" "', argument " "1"" of type '" "SerialForwarder *""'"); } arg1 = reinterpret_cast< SerialForwarder * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SerialForwarder_process(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialForwarder *arg1 = (SerialForwarder *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:SerialForwarder_process",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialForwarder, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialForwarder_process" "', argument " "1"" of type '" "SerialForwarder *""'"); } arg1 = reinterpret_cast< SerialForwarder * >(argp1); (arg1)->process(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SerialForwarder_dispatchPacket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialForwarder *arg1 = (SerialForwarder *) 0 ; void *arg2 = (void *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:SerialForwarder_dispatchPacket",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialForwarder, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialForwarder_dispatchPacket" "', argument " "1"" of type '" "SerialForwarder *""'"); } arg1 = reinterpret_cast< SerialForwarder * >(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SerialForwarder_dispatchPacket" "', argument " "2"" of type '" "void const *""'"); } ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SerialForwarder_dispatchPacket" "', argument " "3"" of type '" "int""'"); } arg3 = static_cast< int >(val3); (arg1)->dispatchPacket((void const *)arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SerialForwarder_forwardPacket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; SerialForwarder *arg1 = (SerialForwarder *) 0 ; void *arg2 = (void *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:SerialForwarder_forwardPacket",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SerialForwarder, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SerialForwarder_forwardPacket" "', argument " "1"" of type '" "SerialForwarder *""'"); } arg1 = reinterpret_cast< SerialForwarder * >(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SerialForwarder_forwardPacket" "', argument " "2"" of type '" "void const *""'"); } ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SerialForwarder_forwardPacket" "', argument " "3"" of type '" "int""'"); } arg3 = static_cast< int >(val3); (arg1)->forwardPacket((void const *)arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *SerialForwarder_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_SerialForwarder, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_new_Throttle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; int arg2 ; Throttle *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:new_Throttle",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Throttle" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_Throttle" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); result = (Throttle *)new Throttle(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Throttle, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_Throttle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Throttle *arg1 = (Throttle *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_Throttle",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Throttle, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Throttle" "', argument " "1"" of type '" "Throttle *""'"); } arg1 = reinterpret_cast< Throttle * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Throttle_initialize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Throttle *arg1 = (Throttle *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Throttle_initialize",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Throttle, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Throttle_initialize" "', argument " "1"" of type '" "Throttle *""'"); } arg1 = reinterpret_cast< Throttle * >(argp1); (arg1)->initialize(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Throttle_finalize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Throttle *arg1 = (Throttle *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Throttle_finalize",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Throttle, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Throttle_finalize" "', argument " "1"" of type '" "Throttle *""'"); } arg1 = reinterpret_cast< Throttle * >(argp1); (arg1)->finalize(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Throttle_checkThrottle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Throttle *arg1 = (Throttle *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Throttle_checkThrottle",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Throttle, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Throttle_checkThrottle" "', argument " "1"" of type '" "Throttle *""'"); } arg1 = reinterpret_cast< Throttle * >(argp1); (arg1)->checkThrottle(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Throttle_printStatistics(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Throttle *arg1 = (Throttle *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Throttle_printStatistics",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Throttle, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Throttle_printStatistics" "', argument " "1"" of type '" "Throttle *""'"); } arg1 = reinterpret_cast< Throttle * >(argp1); (arg1)->printStatistics(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *Throttle_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_Throttle, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_variable_string_t_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:variable_string_t_type_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_type_set" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "variable_string_t_type_set" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); if (arg1->type) delete[] arg1->type; if (arg2) { size_t size = strlen(reinterpret_cast< const char * >(arg2)) + 1; arg1->type = (char *)reinterpret_cast< char* >(memcpy((new char[size]), reinterpret_cast< const char * >(arg2), sizeof(char)*(size))); } else { arg1->type = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; char *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:variable_string_t_type_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_type_get" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); result = (char *) ((arg1)->type); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_ptr_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:variable_string_t_ptr_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_ptr_set" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "variable_string_t_ptr_set" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); if (arg1->ptr) delete[] arg1->ptr; if (arg2) { size_t size = strlen(reinterpret_cast< const char * >(arg2)) + 1; arg1->ptr = (char *)reinterpret_cast< char* >(memcpy((new char[size]), reinterpret_cast< const char * >(arg2), sizeof(char)*(size))); } else { arg1->ptr = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_ptr_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; char *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:variable_string_t_ptr_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_ptr_get" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); result = (char *) ((arg1)->ptr); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_len_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:variable_string_t_len_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_len_set" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "variable_string_t_len_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->len = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_len_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:variable_string_t_len_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_len_get" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); result = (int) ((arg1)->len); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_isArray_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:variable_string_t_isArray_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_isArray_set" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "variable_string_t_isArray_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->isArray = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_isArray_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:variable_string_t_isArray_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_isArray_get" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); result = (int) ((arg1)->isArray); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_variable_string_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_variable_string_t")) SWIG_fail; result = (variable_string_t *)new variable_string_t(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_var_string, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_variable_string_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_variable_string_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_variable_string_t" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *variable_string_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_var_string, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_nesc_app_t_numVariables_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; int arg2 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:nesc_app_t_numVariables_set",&obj0,&obj1)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = ""; app->variableTypes[i] = ""; } } arg1 = app; } } ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "nesc_app_t_numVariables_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->numVariables = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_numVariables_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; int result; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:nesc_app_t_numVariables_get",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = ""; app->variableTypes[i] = ""; } } arg1 = app; } } result = (int) ((arg1)->numVariables); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_variableNames_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; char **arg2 = (char **) 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:nesc_app_t_variableNames_set",&obj0,&obj1)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = ""; app->variableTypes[i] = ""; } } arg1 = app; } } res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_p_char, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "nesc_app_t_variableNames_set" "', argument " "2"" of type '" "char **""'"); } arg2 = reinterpret_cast< char ** >(argp2); if (arg1) (arg1)->variableNames = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_variableNames_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; char **result = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:nesc_app_t_variableNames_get",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = ""; app->variableTypes[i] = ""; } } arg1 = app; } } result = (char **) ((arg1)->variableNames); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_p_char, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_variableTypes_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; char **arg2 = (char **) 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:nesc_app_t_variableTypes_set",&obj0,&obj1)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = ""; app->variableTypes[i] = ""; } } arg1 = app; } } res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_p_char, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "nesc_app_t_variableTypes_set" "', argument " "2"" of type '" "char **""'"); } arg2 = reinterpret_cast< char ** >(argp2); if (arg1) (arg1)->variableTypes = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_variableTypes_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; char **result = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:nesc_app_t_variableTypes_get",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = ""; app->variableTypes[i] = ""; } } arg1 = app; } } result = (char **) ((arg1)->variableTypes); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_p_char, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_variableArray_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; int *arg2 = (int *) 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:nesc_app_t_variableArray_set",&obj0,&obj1)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = ""; app->variableTypes[i] = ""; } } arg1 = app; } } res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "nesc_app_t_variableArray_set" "', argument " "2"" of type '" "int *""'"); } arg2 = reinterpret_cast< int * >(argp2); if (arg1) (arg1)->variableArray = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_variableArray_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; int *result = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:nesc_app_t_variableArray_get",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = ""; app->variableTypes[i] = ""; } } arg1 = app; } } result = (int *) ((arg1)->variableArray); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_int, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_nesc_app_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_nesc_app_t")) SWIG_fail; result = (nesc_app_t *)new nesc_app_t(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_nesc_app, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_nesc_app_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_nesc_app_t",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = ""; app->variableTypes[i] = ""; } } arg1 = app; } } delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *nesc_app_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_nesc_app, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_new_Variable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; int arg4 ; Variable *result = 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:new_Variable",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Variable" "', argument " "1"" of type '" "char *""'"); } arg1 = reinterpret_cast< char * >(buf1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Variable" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_Variable" "', argument " "3"" of type '" "int""'"); } arg3 = static_cast< int >(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_Variable" "', argument " "4"" of type '" "int""'"); } arg4 = static_cast< int >(val4); result = (Variable *)new Variable(arg1,arg2,arg3,arg4); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Variable, SWIG_POINTER_NEW | 0 ); if (alloc1 == SWIG_NEWOBJ) delete[] buf1; if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) delete[] buf1; if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_delete_Variable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Variable *arg1 = (Variable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_Variable",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Variable, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Variable" "', argument " "1"" of type '" "Variable *""'"); } arg1 = reinterpret_cast< Variable * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Variable_getData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Variable *arg1 = (Variable *) 0 ; variable_string_t result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Variable_getData",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Variable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Variable_getData" "', argument " "1"" of type '" "Variable *""'"); } arg1 = reinterpret_cast< Variable * >(argp1); result = (arg1)->getData(); { if ((&result)->isArray) { //printf("Generating array %s\n", (&result)->type); resultobj = listFromArray ((&result)->type, (&result)->ptr, (&result)->len); } else { //printf("Generating scalar %s\n", (&result)->type); resultobj = valueFromScalar((&result)->type, (&result)->ptr, (&result)->len); } if (resultobj == NULL) { PyErr_SetString(PyExc_RuntimeError, "Error generating Python type from TinyOS variable."); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *Variable_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_Variable, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_new_Mote(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; Mote *result = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:new_Mote",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = ""; app->variableTypes[i] = ""; } } arg1 = app; } } result = (Mote *)new Mote(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Mote, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_Mote(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_Mote",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Mote" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_id(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; unsigned long result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_id",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_id" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); result = (unsigned long)(arg1)->id(); resultobj = SWIG_From_unsigned_SS_long(static_cast< unsigned long >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_euid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; long long result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_euid",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_euid" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); result = (long long)(arg1)->euid(); resultobj = SWIG_From_long_SS_long(static_cast< long long >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_setEuid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; long long arg2 ; void *argp1 = 0 ; int res1 = 0 ; long long val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Mote_setEuid",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_setEuid" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); ecode2 = SWIG_AsVal_long_SS_long(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Mote_setEuid" "', argument " "2"" of type '" "long long""'"); } arg2 = static_cast< long long >(val2); (arg1)->setEuid(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_bootTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; long long result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_bootTime",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_bootTime" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); result = (long long)(arg1)->bootTime(); resultobj = SWIG_From_long_SS_long(static_cast< long long >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_bootAtTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; long long arg2 ; void *argp1 = 0 ; int res1 = 0 ; long long val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Mote_bootAtTime",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_bootAtTime" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); ecode2 = SWIG_AsVal_long_SS_long(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Mote_bootAtTime" "', argument " "2"" of type '" "long long""'"); } arg2 = static_cast< long long >(val2); (arg1)->bootAtTime(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_isOn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; bool result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_isOn",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_isOn" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); result = (bool)(arg1)->isOn(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_turnOff(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_turnOff",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_turnOff" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); (arg1)->turnOff(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_turnOn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_turnOn",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_turnOn" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); (arg1)->turnOn(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_getVariable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; char *arg2 = (char *) 0 ; Variable *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Mote_getVariable",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_getVariable" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Mote_getVariable" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); result = (Variable *)(arg1)->getVariable(arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Variable, 0 | 0 ); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_Mote_addNoiseTraceReading(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Mote_addNoiseTraceReading",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_addNoiseTraceReading" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Mote_addNoiseTraceReading" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->addNoiseTraceReading(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_createNoiseModel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_createNoiseModel",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_createNoiseModel" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); (arg1)->createNoiseModel(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_generateNoise(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; int arg2 ; int result; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Mote_generateNoise",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_generateNoise" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Mote_generateNoise" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); result = (int)(arg1)->generateNoise(arg2); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *Mote_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_Mote, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_new_Tossim(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; Tossim *result = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:new_Tossim",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = ""; app->variableTypes[i] = ""; } } arg1 = app; } } result = (Tossim *)new Tossim(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Tossim, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_Tossim(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_Tossim",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Tossim" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_init",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_init" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); (arg1)->init(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_time(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; long long result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_time",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_time" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (long long)(arg1)->time(); resultobj = SWIG_From_long_SS_long(static_cast< long long >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_ticksPerSecond(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; long long result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_ticksPerSecond",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_ticksPerSecond" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (long long)(arg1)->ticksPerSecond(); resultobj = SWIG_From_long_SS_long(static_cast< long long >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_setTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; long long arg2 ; void *argp1 = 0 ; int res1 = 0 ; long long val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Tossim_setTime",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_setTime" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); ecode2 = SWIG_AsVal_long_SS_long(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Tossim_setTime" "', argument " "2"" of type '" "long long""'"); } arg2 = static_cast< long long >(val2); (arg1)->setTime(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_timeStr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; char *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_timeStr",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_timeStr" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (char *)(arg1)->timeStr(); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_currentNode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; Mote *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_currentNode",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_currentNode" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (Mote *)(arg1)->currentNode(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Mote, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_getNode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; unsigned long arg2 ; Mote *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; unsigned long val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Tossim_getNode",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_getNode" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); ecode2 = SWIG_AsVal_unsigned_SS_long(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Tossim_getNode" "', argument " "2"" of type '" "unsigned long""'"); } arg2 = static_cast< unsigned long >(val2); result = (Mote *)(arg1)->getNode(arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Mote, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_setCurrentNode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; unsigned long arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned long val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Tossim_setCurrentNode",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_setCurrentNode" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); ecode2 = SWIG_AsVal_unsigned_SS_long(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Tossim_setCurrentNode" "', argument " "2"" of type '" "unsigned long""'"); } arg2 = static_cast< unsigned long >(val2); (arg1)->setCurrentNode(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_addChannel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; char *arg2 = (char *) 0 ; FILE *arg3 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:Tossim_addChannel",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_addChannel" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Tossim_addChannel" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); { if (!PyFile_Check(obj2)) { PyErr_SetString(PyExc_TypeError, "Requires a file as a parameter."); return NULL; } arg3 = PyFile_AsFile(obj2); } (arg1)->addChannel(arg2,arg3); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_Tossim_removeChannel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; char *arg2 = (char *) 0 ; FILE *arg3 = (FILE *) 0 ; bool result; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:Tossim_removeChannel",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_removeChannel" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Tossim_removeChannel" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); { if (!PyFile_Check(obj2)) { PyErr_SetString(PyExc_TypeError, "Requires a file as a parameter."); return NULL; } arg3 = PyFile_AsFile(obj2); } result = (bool)(arg1)->removeChannel(arg2,arg3); resultobj = SWIG_From_bool(static_cast< bool >(result)); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_Tossim_randomSeed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Tossim_randomSeed",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_randomSeed" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Tossim_randomSeed" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->randomSeed(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_runNextEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; bool result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_runNextEvent",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_runNextEvent" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (bool)(arg1)->runNextEvent(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_mac(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; MAC *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_mac",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_mac" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (MAC *)(arg1)->mac(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MAC, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_radio(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; Radio *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_radio",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_radio" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (Radio *)(arg1)->radio(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Radio, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_newPacket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; Packet *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_newPacket",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_newPacket" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (Packet *)(arg1)->newPacket(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Packet, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_newSerialPacket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; SerialPacket *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_newSerialPacket",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_newSerialPacket" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (SerialPacket *)(arg1)->newSerialPacket(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SerialPacket, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *Tossim_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_Tossim, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } static PyMethodDef SwigMethods[] = { { (char *)"new_MAC", _wrap_new_MAC, METH_VARARGS, NULL}, { (char *)"delete_MAC", _wrap_delete_MAC, METH_VARARGS, NULL}, { (char *)"MAC_initHigh", _wrap_MAC_initHigh, METH_VARARGS, NULL}, { (char *)"MAC_initLow", _wrap_MAC_initLow, METH_VARARGS, NULL}, { (char *)"MAC_high", _wrap_MAC_high, METH_VARARGS, NULL}, { (char *)"MAC_low", _wrap_MAC_low, METH_VARARGS, NULL}, { (char *)"MAC_symbolsPerSec", _wrap_MAC_symbolsPerSec, METH_VARARGS, NULL}, { (char *)"MAC_bitsPerSymbol", _wrap_MAC_bitsPerSymbol, METH_VARARGS, NULL}, { (char *)"MAC_preambleLength", _wrap_MAC_preambleLength, METH_VARARGS, NULL}, { (char *)"MAC_exponentBase", _wrap_MAC_exponentBase, METH_VARARGS, NULL}, { (char *)"MAC_maxIterations", _wrap_MAC_maxIterations, METH_VARARGS, NULL}, { (char *)"MAC_minFreeSamples", _wrap_MAC_minFreeSamples, METH_VARARGS, NULL}, { (char *)"MAC_rxtxDelay", _wrap_MAC_rxtxDelay, METH_VARARGS, NULL}, { (char *)"MAC_ackTime", _wrap_MAC_ackTime, METH_VARARGS, NULL}, { (char *)"MAC_setInitHigh", _wrap_MAC_setInitHigh, METH_VARARGS, NULL}, { (char *)"MAC_setInitLow", _wrap_MAC_setInitLow, METH_VARARGS, NULL}, { (char *)"MAC_setHigh", _wrap_MAC_setHigh, METH_VARARGS, NULL}, { (char *)"MAC_setLow", _wrap_MAC_setLow, METH_VARARGS, NULL}, { (char *)"MAC_setSymbolsPerSec", _wrap_MAC_setSymbolsPerSec, METH_VARARGS, NULL}, { (char *)"MAC_setBitsBerSymbol", _wrap_MAC_setBitsBerSymbol, METH_VARARGS, NULL}, { (char *)"MAC_setPreambleLength", _wrap_MAC_setPreambleLength, METH_VARARGS, NULL}, { (char *)"MAC_setExponentBase", _wrap_MAC_setExponentBase, METH_VARARGS, NULL}, { (char *)"MAC_setMaxIterations", _wrap_MAC_setMaxIterations, METH_VARARGS, NULL}, { (char *)"MAC_setMinFreeSamples", _wrap_MAC_setMinFreeSamples, METH_VARARGS, NULL}, { (char *)"MAC_setRxtxDelay", _wrap_MAC_setRxtxDelay, METH_VARARGS, NULL}, { (char *)"MAC_setAckTime", _wrap_MAC_setAckTime, METH_VARARGS, NULL}, { (char *)"MAC_swigregister", MAC_swigregister, METH_VARARGS, NULL}, { (char *)"new_Radio", _wrap_new_Radio, METH_VARARGS, NULL}, { (char *)"delete_Radio", _wrap_delete_Radio, METH_VARARGS, NULL}, { (char *)"Radio_add", _wrap_Radio_add, METH_VARARGS, NULL}, { (char *)"Radio_gain", _wrap_Radio_gain, METH_VARARGS, NULL}, { (char *)"Radio_connected", _wrap_Radio_connected, METH_VARARGS, NULL}, { (char *)"Radio_remove", _wrap_Radio_remove, METH_VARARGS, NULL}, { (char *)"Radio_setNoise", _wrap_Radio_setNoise, METH_VARARGS, NULL}, { (char *)"Radio_setSensitivity", _wrap_Radio_setSensitivity, METH_VARARGS, NULL}, { (char *)"Radio_swigregister", Radio_swigregister, METH_VARARGS, NULL}, { (char *)"new_Packet", _wrap_new_Packet, METH_VARARGS, NULL}, { (char *)"delete_Packet", _wrap_delete_Packet, METH_VARARGS, NULL}, { (char *)"Packet_setSource", _wrap_Packet_setSource, METH_VARARGS, NULL}, { (char *)"Packet_source", _wrap_Packet_source, METH_VARARGS, NULL}, { (char *)"Packet_setDestination", _wrap_Packet_setDestination, METH_VARARGS, NULL}, { (char *)"Packet_destination", _wrap_Packet_destination, METH_VARARGS, NULL}, { (char *)"Packet_setLength", _wrap_Packet_setLength, METH_VARARGS, NULL}, { (char *)"Packet_length", _wrap_Packet_length, METH_VARARGS, NULL}, { (char *)"Packet_setType", _wrap_Packet_setType, METH_VARARGS, NULL}, { (char *)"Packet_type", _wrap_Packet_type, METH_VARARGS, NULL}, { (char *)"Packet_data", _wrap_Packet_data, METH_VARARGS, NULL}, { (char *)"Packet_setData", _wrap_Packet_setData, METH_VARARGS, NULL}, { (char *)"Packet_maxLength", _wrap_Packet_maxLength, METH_VARARGS, NULL}, { (char *)"Packet_setStrength", _wrap_Packet_setStrength, METH_VARARGS, NULL}, { (char *)"Packet_deliver", _wrap_Packet_deliver, METH_VARARGS, NULL}, { (char *)"Packet_deliverNow", _wrap_Packet_deliverNow, METH_VARARGS, NULL}, { (char *)"Packet_swigregister", Packet_swigregister, METH_VARARGS, NULL}, { (char *)"new_SerialPacket", _wrap_new_SerialPacket, METH_VARARGS, NULL}, { (char *)"delete_SerialPacket", _wrap_delete_SerialPacket, METH_VARARGS, NULL}, { (char *)"SerialPacket_setDestination", _wrap_SerialPacket_setDestination, METH_VARARGS, NULL}, { (char *)"SerialPacket_destination", _wrap_SerialPacket_destination, METH_VARARGS, NULL}, { (char *)"SerialPacket_setLength", _wrap_SerialPacket_setLength, METH_VARARGS, NULL}, { (char *)"SerialPacket_length", _wrap_SerialPacket_length, METH_VARARGS, NULL}, { (char *)"SerialPacket_setType", _wrap_SerialPacket_setType, METH_VARARGS, NULL}, { (char *)"SerialPacket_type", _wrap_SerialPacket_type, METH_VARARGS, NULL}, { (char *)"SerialPacket_data", _wrap_SerialPacket_data, METH_VARARGS, NULL}, { (char *)"SerialPacket_setData", _wrap_SerialPacket_setData, METH_VARARGS, NULL}, { (char *)"SerialPacket_maxLength", _wrap_SerialPacket_maxLength, METH_VARARGS, NULL}, { (char *)"SerialPacket_deliver", _wrap_SerialPacket_deliver, METH_VARARGS, NULL}, { (char *)"SerialPacket_deliverNow", _wrap_SerialPacket_deliverNow, METH_VARARGS, NULL}, { (char *)"SerialPacket_swigregister", SerialPacket_swigregister, METH_VARARGS, NULL}, { (char *)"new_SerialForwarder", _wrap_new_SerialForwarder, METH_VARARGS, NULL}, { (char *)"delete_SerialForwarder", _wrap_delete_SerialForwarder, METH_VARARGS, NULL}, { (char *)"SerialForwarder_process", _wrap_SerialForwarder_process, METH_VARARGS, NULL}, { (char *)"SerialForwarder_dispatchPacket", _wrap_SerialForwarder_dispatchPacket, METH_VARARGS, NULL}, { (char *)"SerialForwarder_forwardPacket", _wrap_SerialForwarder_forwardPacket, METH_VARARGS, NULL}, { (char *)"SerialForwarder_swigregister", SerialForwarder_swigregister, METH_VARARGS, NULL}, { (char *)"new_Throttle", _wrap_new_Throttle, METH_VARARGS, NULL}, { (char *)"delete_Throttle", _wrap_delete_Throttle, METH_VARARGS, NULL}, { (char *)"Throttle_initialize", _wrap_Throttle_initialize, METH_VARARGS, NULL}, { (char *)"Throttle_finalize", _wrap_Throttle_finalize, METH_VARARGS, NULL}, { (char *)"Throttle_checkThrottle", _wrap_Throttle_checkThrottle, METH_VARARGS, NULL}, { (char *)"Throttle_printStatistics", _wrap_Throttle_printStatistics, METH_VARARGS, NULL}, { (char *)"Throttle_swigregister", Throttle_swigregister, METH_VARARGS, NULL}, { (char *)"variable_string_t_type_set", _wrap_variable_string_t_type_set, METH_VARARGS, NULL}, { (char *)"variable_string_t_type_get", _wrap_variable_string_t_type_get, METH_VARARGS, NULL}, { (char *)"variable_string_t_ptr_set", _wrap_variable_string_t_ptr_set, METH_VARARGS, NULL}, { (char *)"variable_string_t_ptr_get", _wrap_variable_string_t_ptr_get, METH_VARARGS, NULL}, { (char *)"variable_string_t_len_set", _wrap_variable_string_t_len_set, METH_VARARGS, NULL}, { (char *)"variable_string_t_len_get", _wrap_variable_string_t_len_get, METH_VARARGS, NULL}, { (char *)"variable_string_t_isArray_set", _wrap_variable_string_t_isArray_set, METH_VARARGS, NULL}, { (char *)"variable_string_t_isArray_get", _wrap_variable_string_t_isArray_get, METH_VARARGS, NULL}, { (char *)"new_variable_string_t", _wrap_new_variable_string_t, METH_VARARGS, NULL}, { (char *)"delete_variable_string_t", _wrap_delete_variable_string_t, METH_VARARGS, NULL}, { (char *)"variable_string_t_swigregister", variable_string_t_swigregister, METH_VARARGS, NULL}, { (char *)"nesc_app_t_numVariables_set", _wrap_nesc_app_t_numVariables_set, METH_VARARGS, NULL}, { (char *)"nesc_app_t_numVariables_get", _wrap_nesc_app_t_numVariables_get, METH_VARARGS, NULL}, { (char *)"nesc_app_t_variableNames_set", _wrap_nesc_app_t_variableNames_set, METH_VARARGS, NULL}, { (char *)"nesc_app_t_variableNames_get", _wrap_nesc_app_t_variableNames_get, METH_VARARGS, NULL}, { (char *)"nesc_app_t_variableTypes_set", _wrap_nesc_app_t_variableTypes_set, METH_VARARGS, NULL}, { (char *)"nesc_app_t_variableTypes_get", _wrap_nesc_app_t_variableTypes_get, METH_VARARGS, NULL}, { (char *)"nesc_app_t_variableArray_set", _wrap_nesc_app_t_variableArray_set, METH_VARARGS, NULL}, { (char *)"nesc_app_t_variableArray_get", _wrap_nesc_app_t_variableArray_get, METH_VARARGS, NULL}, { (char *)"new_nesc_app_t", _wrap_new_nesc_app_t, METH_VARARGS, NULL}, { (char *)"delete_nesc_app_t", _wrap_delete_nesc_app_t, METH_VARARGS, NULL}, { (char *)"nesc_app_t_swigregister", nesc_app_t_swigregister, METH_VARARGS, NULL}, { (char *)"new_Variable", _wrap_new_Variable, METH_VARARGS, NULL}, { (char *)"delete_Variable", _wrap_delete_Variable, METH_VARARGS, NULL}, { (char *)"Variable_getData", _wrap_Variable_getData, METH_VARARGS, NULL}, { (char *)"Variable_swigregister", Variable_swigregister, METH_VARARGS, NULL}, { (char *)"new_Mote", _wrap_new_Mote, METH_VARARGS, NULL}, { (char *)"delete_Mote", _wrap_delete_Mote, METH_VARARGS, NULL}, { (char *)"Mote_id", _wrap_Mote_id, METH_VARARGS, NULL}, { (char *)"Mote_euid", _wrap_Mote_euid, METH_VARARGS, NULL}, { (char *)"Mote_setEuid", _wrap_Mote_setEuid, METH_VARARGS, NULL}, { (char *)"Mote_bootTime", _wrap_Mote_bootTime, METH_VARARGS, NULL}, { (char *)"Mote_bootAtTime", _wrap_Mote_bootAtTime, METH_VARARGS, NULL}, { (char *)"Mote_isOn", _wrap_Mote_isOn, METH_VARARGS, NULL}, { (char *)"Mote_turnOff", _wrap_Mote_turnOff, METH_VARARGS, NULL}, { (char *)"Mote_turnOn", _wrap_Mote_turnOn, METH_VARARGS, NULL}, { (char *)"Mote_getVariable", _wrap_Mote_getVariable, METH_VARARGS, NULL}, { (char *)"Mote_addNoiseTraceReading", _wrap_Mote_addNoiseTraceReading, METH_VARARGS, NULL}, { (char *)"Mote_createNoiseModel", _wrap_Mote_createNoiseModel, METH_VARARGS, NULL}, { (char *)"Mote_generateNoise", _wrap_Mote_generateNoise, METH_VARARGS, NULL}, { (char *)"Mote_swigregister", Mote_swigregister, METH_VARARGS, NULL}, { (char *)"new_Tossim", _wrap_new_Tossim, METH_VARARGS, NULL}, { (char *)"delete_Tossim", _wrap_delete_Tossim, METH_VARARGS, NULL}, { (char *)"Tossim_init", _wrap_Tossim_init, METH_VARARGS, NULL}, { (char *)"Tossim_time", _wrap_Tossim_time, METH_VARARGS, NULL}, { (char *)"Tossim_ticksPerSecond", _wrap_Tossim_ticksPerSecond, METH_VARARGS, NULL}, { (char *)"Tossim_setTime", _wrap_Tossim_setTime, METH_VARARGS, NULL}, { (char *)"Tossim_timeStr", _wrap_Tossim_timeStr, METH_VARARGS, NULL}, { (char *)"Tossim_currentNode", _wrap_Tossim_currentNode, METH_VARARGS, NULL}, { (char *)"Tossim_getNode", _wrap_Tossim_getNode, METH_VARARGS, NULL}, { (char *)"Tossim_setCurrentNode", _wrap_Tossim_setCurrentNode, METH_VARARGS, NULL}, { (char *)"Tossim_addChannel", _wrap_Tossim_addChannel, METH_VARARGS, NULL}, { (char *)"Tossim_removeChannel", _wrap_Tossim_removeChannel, METH_VARARGS, NULL}, { (char *)"Tossim_randomSeed", _wrap_Tossim_randomSeed, METH_VARARGS, NULL}, { (char *)"Tossim_runNextEvent", _wrap_Tossim_runNextEvent, METH_VARARGS, NULL}, { (char *)"Tossim_mac", _wrap_Tossim_mac, METH_VARARGS, NULL}, { (char *)"Tossim_radio", _wrap_Tossim_radio, METH_VARARGS, NULL}, { (char *)"Tossim_newPacket", _wrap_Tossim_newPacket, METH_VARARGS, NULL}, { (char *)"Tossim_newSerialPacket", _wrap_Tossim_newSerialPacket, METH_VARARGS, NULL}, { (char *)"Tossim_swigregister", Tossim_swigregister, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_FILE = {"_p_FILE", "FILE *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_MAC = {"_p_MAC", "MAC *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_Mote = {"_p_Mote", "Mote *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_Packet = {"_p_Packet", "Packet *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_Radio = {"_p_Radio", "Radio *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_SerialForwarder = {"_p_SerialForwarder", "SerialForwarder *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_SerialPacket = {"_p_SerialPacket", "SerialPacket *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_Throttle = {"_p_Throttle", "Throttle *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_Tossim = {"_p_Tossim", "Tossim *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_Variable = {"_p_Variable", "Variable *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_int = {"_p_int", "int *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_nesc_app = {"_p_nesc_app", "nesc_app *|nesc_app_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_p_char = {"_p_p_char", "char **", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_var_string = {"_p_var_string", "var_string *|variable_string_t *", 0, 0, (void*)0, 0}; static swig_type_info *swig_type_initial[] = { &_swigt__p_FILE, &_swigt__p_MAC, &_swigt__p_Mote, &_swigt__p_Packet, &_swigt__p_Radio, &_swigt__p_SerialForwarder, &_swigt__p_SerialPacket, &_swigt__p_Throttle, &_swigt__p_Tossim, &_swigt__p_Variable, &_swigt__p_char, &_swigt__p_int, &_swigt__p_nesc_app, &_swigt__p_p_char, &_swigt__p_var_string, }; static swig_cast_info _swigc__p_FILE[] = { {&_swigt__p_FILE, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_MAC[] = { {&_swigt__p_MAC, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_Mote[] = { {&_swigt__p_Mote, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_Packet[] = { {&_swigt__p_Packet, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_Radio[] = { {&_swigt__p_Radio, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_SerialForwarder[] = { {&_swigt__p_SerialForwarder, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_SerialPacket[] = { {&_swigt__p_SerialPacket, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_Throttle[] = { {&_swigt__p_Throttle, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_Tossim[] = { {&_swigt__p_Tossim, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_Variable[] = { {&_swigt__p_Variable, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_nesc_app[] = { {&_swigt__p_nesc_app, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_p_char[] = { {&_swigt__p_p_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_var_string[] = { {&_swigt__p_var_string, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info *swig_cast_initial[] = { _swigc__p_FILE, _swigc__p_MAC, _swigc__p_Mote, _swigc__p_Packet, _swigc__p_Radio, _swigc__p_SerialForwarder, _swigc__p_SerialPacket, _swigc__p_Throttle, _swigc__p_Tossim, _swigc__p_Variable, _swigc__p_char, _swigc__p_int, _swigc__p_nesc_app, _swigc__p_p_char, _swigc__p_var_string, }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_const_info swig_const_table[] = { {0, 0, 0, 0.0, 0, 0}}; #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * Type initialization: * This problem is tough by the requirement that no dynamic * memory is used. Also, since swig_type_info structures store pointers to * swig_cast_info structures and swig_cast_info structures store pointers back * to swig_type_info structures, we need some lookup code at initialization. * The idea is that swig generates all the structures that are needed. * The runtime then collects these partially filled structures. * The SWIG_InitializeModule function takes these initial arrays out of * swig_module, and does all the lookup, filling in the swig_module.types * array with the correct data and linking the correct swig_cast_info * structures together. * * The generated swig_type_info structures are assigned staticly to an initial * array. We just loop through that array, and handle each type individually. * First we lookup if this type has been already loaded, and if so, use the * loaded structure instead of the generated one. Then we have to fill in the * cast linked list. The cast data is initially stored in something like a * two-dimensional array. Each row corresponds to a type (there are the same * number of rows as there are in the swig_type_initial array). Each entry in * a column is one of the swig_cast_info structures for that type. * The cast_initial array is actually an array of arrays, because each row has * a variable number of columns. So to actually build the cast linked list, * we find the array of casts associated with the type, and loop through it * adding the casts to the list. The one last trick we need to do is making * sure the type pointer in the swig_cast_info struct is correct. * * First off, we lookup the cast->type name to see if it is already loaded. * There are three cases to handle: * 1) If the cast->type has already been loaded AND the type we are adding * casting info to has not been loaded (it is in this module), THEN we * replace the cast->type pointer with the type pointer that has already * been loaded. * 2) If BOTH types (the one we are adding casting info to, and the * cast->type) are loaded, THEN the cast info has already been loaded by * the previous module so we just ignore it. * 3) Finally, if cast->type has not already been loaded, then we add that * swig_cast_info to the linked list (because the cast->type) pointer will * be correct. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* c-mode */ #endif #endif #if 0 #define SWIGRUNTIME_DEBUG #endif SWIGRUNTIME void SWIG_InitializeModule(void *clientdata) { size_t i; swig_module_info *module_head, *iter; int found; clientdata = clientdata; /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { /* Initialize the swig_module */ swig_module.type_initial = swig_type_initial; swig_module.cast_initial = swig_cast_initial; swig_module.next = &swig_module; } /* Try and load any already created modules */ module_head = SWIG_GetModule(clientdata); if (!module_head) { /* This is the first module loaded for this interpreter */ /* so set the swig module into the interpreter */ SWIG_SetModule(clientdata, &swig_module); module_head = &swig_module; } else { /* the interpreter has loaded a SWIG module, but has it loaded this one? */ found=0; iter=module_head; do { if (iter==&swig_module) { found=1; break; } iter=iter->next; } while (iter!= module_head); /* if the is found in the list, then all is done and we may leave */ if (found) return; /* otherwise we must add out module into the list */ swig_module.next = module_head->next; module_head->next = &swig_module; } /* Now work on filling in swig_module.types */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: size %d\n", swig_module.size); #endif for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = 0; swig_type_info *ret; swig_cast_info *cast; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); #endif /* if there is another module already loaded */ if (swig_module.next != &swig_module) { type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); } if (type) { /* Overwrite clientdata field */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found type %s\n", type->name); #endif if (swig_module.type_initial[i]->clientdata) { type->clientdata = swig_module.type_initial[i]->clientdata; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); #endif } } else { type = swig_module.type_initial[i]; } /* Insert casting types */ cast = swig_module.cast_initial[i]; while (cast->type) { /* Don't need to add information already in the list */ ret = 0; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); #endif if (swig_module.next != &swig_module) { ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); #ifdef SWIGRUNTIME_DEBUG if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); #endif } if (ret) { if (type == swig_module.type_initial[i]) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: skip old type %s\n", ret->name); #endif cast->type = ret; ret = 0; } else { /* Check for casting already in the list */ swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); #ifdef SWIGRUNTIME_DEBUG if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); #endif if (!ocast) ret = 0; } } if (!ret) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); #endif if (type->cast) { type->cast->prev = cast; cast->next = type->cast; } type->cast = cast; } cast++; } /* Set entry in modules->types array equal to the type */ swig_module.types[i] = type; } swig_module.types[i] = 0; #ifdef SWIGRUNTIME_DEBUG printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { int j = 0; swig_cast_info *cast = swig_module.cast_initial[i]; printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); while (cast->type) { printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); cast++; ++j; } printf("---- Total casts: %d\n",j); } printf("**** SWIG_InitializeModule: Cast List ******\n"); #endif } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientData(void) { size_t i; swig_cast_info *equiv; static int init_run = 0; if (init_run) return; init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { if (equiv->type && !equiv->type->clientdata) SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); } equiv = equiv->next; } } } } #ifdef __cplusplus #if 0 { /* c-mode */ #endif } #endif #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(void); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; SWIGINTERN PyObject * swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { return PyString_FromString(""); } SWIGINTERN PyObject * swig_varlink_str(swig_varlinkobject *v) { PyObject *str = PyString_FromString("("); swig_globalvar *var; for (var = v->vars; var; var=var->next) { PyString_ConcatAndDel(&str,PyString_FromString(var->name)); if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); } PyString_ConcatAndDel(&str,PyString_FromString(")")); return str; } SWIGINTERN int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { PyObject *str = swig_varlink_str(v); fprintf(fp,"Swig global variables "); fprintf(fp,"%s\n", PyString_AsString(str)); Py_DECREF(str); return 0; } SWIGINTERN void swig_varlink_dealloc(swig_varlinkobject *v) { swig_globalvar *var = v->vars; while (var) { swig_globalvar *n = var->next; free(var->name); free(var); var = n; } } SWIGINTERN PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { PyObject *res = NULL; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->get_attr)(); break; } var = var->next; } if (res == NULL && !PyErr_Occurred()) { PyErr_SetString(PyExc_NameError,"Unknown C global variable"); } return res; } SWIGINTERN int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { int res = 1; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->set_attr)(p); break; } var = var->next; } if (res == 1 && !PyErr_Occurred()) { PyErr_SetString(PyExc_NameError,"Unknown C global variable"); } return res; } SWIGINTERN PyTypeObject* swig_varlink_type(void) { static char varlink__doc__[] = "Swig var link object"; static PyTypeObject varlink_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { PyObject_HEAD_INIT(NULL) 0, /* Number of items in variable part (ob_size) */ (char *)"swigvarlink", /* Type name (tp_name) */ sizeof(swig_varlinkobject), /* Basic size (tp_basicsize) */ 0, /* Itemsize (tp_itemsize) */ (destructor) swig_varlink_dealloc, /* Deallocator (tp_dealloc) */ (printfunc) swig_varlink_print, /* Print (tp_print) */ (getattrfunc) swig_varlink_getattr, /* get attr (tp_getattr) */ (setattrfunc) swig_varlink_setattr, /* Set attr (tp_setattr) */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ (reprfunc)swig_varlink_str, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ varlink__doc__, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; varlink_type = tmp; varlink_type.ob_type = &PyType_Type; type_init = 1; } return &varlink_type; } /* Create a variable linking object for use later */ SWIGINTERN PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); if (result) { result->vars = 0; } return ((PyObject*) result); } SWIGINTERN void SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v = (swig_varlinkobject *) p; swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); if (gv) { size_t size = strlen(name)+1; gv->name = (char *)malloc(size); if (gv->name) { strncpy(gv->name,name,size); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; } } v->vars = gv; } SWIGINTERN PyObject * SWIG_globals(void) { static PyObject *_SWIG_globals = 0; if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink(); return _SWIG_globals; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ SWIGINTERN void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; ++i) { switch(constants[i].type) { case SWIG_PY_POINTER: obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d, constants[i].name, obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ SWIGINTERN void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { const char *c = methods[i].ml_doc; if (c && (c = strstr(c, "swig_ptr: "))) { int j; swig_const_info *ci = 0; const char *name = c + 10; for (j = 0; const_table[j].type; ++j) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); if (ndoc) { char *buff = ndoc; void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; if (ptr) { strncpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; strncpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIG_init(void) { PyObject *m, *d; /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); m = Py_InitModule((char *) SWIG_name, SwigMethods); d = PyModule_GetDict(m); SWIG_InitializeModule(0); SWIG_InstallConstants(d,swig_const_table); } tinyos-2.1.2+dfsg/tos/lib/tossim/sim_binary.c000066400000000000000000000047101207233610700211540ustar00rootroot00000000000000#include link_t* connectivity[TOSSIM_MAX_NODES]; link_t* allocate_link(int mote); void deallocate_link(link_t* link); link_t* sim_binary_first(int src) __attribute__ ((C, spontaneous)) { return connectivity[src]; } link_t* sim_binary_next(link_t* link) __attribute__ ((C, spontaneous)) { return link->next; } void sim_binary_add(int src, int dest, double packetLoss) __attribute__ ((C, spontaneous)) { link_t* current; int temp = sim_node(); sim_set_node(src); current = connectivity[src]; while (current != NULL) { if (current->mote == dest) { sim_set_node(temp); break; } current = current->next; } if (current == NULL) { current = allocate_link(dest); } current->mote = dest; current->loss = packetLoss; current->next = connectivity[src]; connectivity[src] = current; dbg("Binary", "Adding link from %i to %i with loss %llf\n", src, dest, packetLoss); sim_set_node(temp); } double sim_binary_loss(int src, int dest) __attribute__ ((C, spontaneous)) { link_t* current; int temp = sim_node(); sim_set_node(src); current = connectivity[src]; while (current != NULL) { if (current->mote == dest) { sim_set_node(temp); return current->loss; } current = current->next; } sim_set_node(temp); return 1.0; } bool sim_binary_connected(int src, int dest) __attribute__ ((C, spontaneous)) { link_t* current; int temp = sim_node(); sim_set_node(src); current = connectivity[src]; while (current != NULL) { if (current->mote == dest) { sim_set_node(temp); return TRUE; } current = current->next; } sim_set_node(temp); return FALSE; } void sim_binary_remove(int src, int dest) __attribute__ ((C, spontaneous)) { link_t* current; link_t* prevLink; int temp = sim_node(); sim_set_node(src); current = connectivity[src]; prevLink = NULL; while (current != NULL) { if (current->mote == dest) { if (prevLink == NULL) { connectivity[src] = current->next; } else { prevLink->next = current->next; } deallocate_link(current); current = prevLink->next; } else { prevLink = current; current = current->next; } } sim_set_node(temp); } link_t* allocate_link(int mote) { link_t* link = (link_t*)malloc(sizeof(link_t)); link->next = NULL; link->mote = mote; link->loss = 1.0; return link; } void deallocate_link(link_t* link) { free(link); } tinyos-2.1.2+dfsg/tos/lib/tossim/sim_binary.h000066400000000000000000000044241207233610700211630ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The C functions representing the TOSSIM binary interference * model. * * @author Philip Levis * @date Nov 22 2005 */ // $Id: sim_binary.h,v 1.5 2010-06-29 22:07:51 scipio Exp $ #ifndef SIM_BINARY_H_INCLUDED #define SIM_BINARY_H_INCLUDED #ifdef __cplusplus extern "C" { #endif typedef struct link { int mote; double loss; struct link* next; } link_t; void sim_binary_add(int src, int dest, double packetLoss); double sim_binary_loss(int src, int dest); bool sim_binary_connected(int src, int dest); void sim_binary_remove(int src, int dest); link_t* sim_binary_first(int src); link_t* sim_binary_next(link_t* link); #ifdef __cplusplus } #endif #endif // SIM_BINARY_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tossim/sim_csma.c000066400000000000000000000107331207233610700206150ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * C implementation of configuration parameters for a CSMA link. * * @author Philip Levis * @date Dec 10 2005 */ // $Id: sim_csma.c,v 1.5 2010-06-29 22:07:51 scipio Exp $ #include int csmaInitHigh = SIM_CSMA_INIT_HIGH; int csmaInitLow = SIM_CSMA_INIT_LOW; int csmaHigh = SIM_CSMA_HIGH; int csmaLow = SIM_CSMA_LOW; int csmaSymbolsPerSec = SIM_CSMA_SYMBOLS_PER_SEC; int csmaBitsPerSymbol = SIM_CSMA_BITS_PER_SYMBOL; int csmaPreambleLength = SIM_CSMA_PREAMBLE_LENGTH; int csmaExponentBase = SIM_CSMA_EXPONENT_BASE; int csmaMaxIterations = SIM_CSMA_MAX_ITERATIONS; int csmaMinFreeSamples = SIM_CSMA_MIN_FREE_SAMPLES; int csmaRxTxDelay = SIM_CSMA_RXTX_DELAY; int csmaAckTime = SIM_CSMA_ACK_TIME; int sim_csma_init_high() __attribute__ ((C, spontaneous)) { return csmaInitHigh; } int sim_csma_init_low() __attribute__ ((C, spontaneous)) { return csmaInitLow; } int sim_csma_high() __attribute__ ((C, spontaneous)) { return csmaHigh; } int sim_csma_low() __attribute__ ((C, spontaneous)) { return csmaLow; } int sim_csma_symbols_per_sec() __attribute__ ((C, spontaneous)) { return csmaSymbolsPerSec; } int sim_csma_bits_per_symbol() __attribute__ ((C, spontaneous)) { return csmaBitsPerSymbol; } int sim_csma_preamble_length() __attribute__ ((C, spontaneous)) { return csmaPreambleLength; } int sim_csma_exponent_base() __attribute__ ((C, spontaneous)) { return csmaExponentBase;; } int sim_csma_max_iterations() __attribute__ ((C, spontaneous)) { return csmaMaxIterations; } int sim_csma_min_free_samples() __attribute__ ((C, spontaneous)) { return csmaMinFreeSamples; } int sim_csma_rxtx_delay() __attribute__ ((C, spontaneous)) { return csmaRxTxDelay; } int sim_csma_ack_time() __attribute__ ((C, spontaneous)) { return csmaAckTime; } void sim_csma_set_init_high(int val) __attribute__ ((C, spontaneous)) { csmaInitHigh = val; } void sim_csma_set_init_low(int val) __attribute__ ((C, spontaneous)) { csmaInitLow = val; } void sim_csma_set_high(int val) __attribute__ ((C, spontaneous)) { csmaHigh = val; } void sim_csma_set_low(int val) __attribute__ ((C, spontaneous)) { csmaLow = val; } void sim_csma_set_symbols_per_sec(int val) __attribute__ ((C, spontaneous)) { csmaSymbolsPerSec = val; } void sim_csma_set_bits_per_symbol(int val) __attribute__ ((C, spontaneous)) { csmaBitsPerSymbol = val; } void sim_csma_set_preamble_length(int val) __attribute__ ((C, spontaneous)) { csmaPreambleLength = val; } void sim_csma_set_exponent_base(int val) __attribute__ ((C, spontaneous)) { csmaExponentBase = val; } void sim_csma_set_max_iterations(int val) __attribute__ ((C, spontaneous)) { csmaMaxIterations = val; } void sim_csma_set_min_free_samples(int val) __attribute__ ((C, spontaneous)) { csmaMinFreeSamples = val; } void sim_csma_set_rxtx_delay(int val) __attribute__ ((C, spontaneous)) { csmaRxTxDelay = val; } void sim_csma_set_ack_time(int val) __attribute__ ((C, spontaneous)) { csmaAckTime = val; } tinyos-2.1.2+dfsg/tos/lib/tossim/sim_csma.h000066400000000000000000000072531207233610700206250ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * Configuration parameters for a CSMA link. * * @author Philip Levis * @date Dec 10 2005 */ // $Id: sim_csma.h,v 1.6 2010-06-29 22:07:51 scipio Exp $ #ifndef SIM_CSMA_H_INCLUDED #define SIM_CSMA_H_INCLUDED #ifndef SIM_CSMA_INIT_HIGH #define SIM_CSMA_INIT_HIGH 640 #endif #ifndef SIM_CSMA_INIT_LOW #define SIM_CSMA_INIT_LOW 20 #endif #ifndef SIM_CSMA_HIGH #define SIM_CSMA_HIGH 160 #endif #ifndef SIM_CSMA_LOW #define SIM_CSMA_LOW 20 #endif #ifndef SIM_CSMA_SYMBOLS_PER_SEC #define SIM_CSMA_SYMBOLS_PER_SEC 65536 #endif #ifndef SIM_CSMA_BITS_PER_SYMBOL #define SIM_CSMA_BITS_PER_SYMBOL 4 #endif #ifndef SIM_CSMA_PREAMBLE_LENGTH #define SIM_CSMA_PREAMBLE_LENGTH 12 #endif #ifndef SIM_CSMA_MAX_ITERATIONS #define SIM_CSMA_MAX_ITERATIONS 0 #endif #ifndef SIM_CSMA_EXPONENT_BASE #define SIM_CSMA_EXPONENT_BASE 1 #endif #ifndef SIM_CSMA_MIN_FREE_SAMPLES #define SIM_CSMA_MIN_FREE_SAMPLES 1 #endif // 500 us ~= 32 symbols #ifndef SIM_CSMA_RXTX_DELAY #define SIM_CSMA_RXTX_DELAY 11 #endif // 12 symbol delay + 11 bytes length * (2 bytes/symbol) = 34 symbols #ifndef SIM_CSMA_ACK_TIME #define SIM_CSMA_ACK_TIME 34 #endif #ifdef __cplusplus extern "C" { #endif int sim_csma_init_high(); int sim_csma_init_low(); int sim_csma_high(); int sim_csma_low(); int sim_csma_symbols_per_sec(); int sim_csma_bits_per_symbol(); int sim_csma_preamble_length(); // in symbols int sim_csma_exponent_base(); int sim_csma_max_iterations(); int sim_csma_min_free_samples(); int sim_csma_rxtx_delay(); int sim_csma_ack_time(); // in symbols void sim_csma_set_init_high(int val); void sim_csma_set_init_low(int val); void sim_csma_set_high(int val); void sim_csma_set_low(int val); void sim_csma_set_symbols_per_sec(int val); void sim_csma_set_bits_per_symbol(int val); void sim_csma_set_preamble_length(int val); // in symbols void sim_csma_set_exponent_base(int val); void sim_csma_set_max_iterations(int val); void sim_csma_set_min_free_samples(int val); void sim_csma_set_rxtx_delay(int val); void sim_csma_set_ack_time(int val); // in symbols #ifdef __cplusplus } #endif #endif // SIM_TOSSIM_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tossim/sim_event_queue.c000066400000000000000000000065551207233610700222260ustar00rootroot00000000000000// $Id: sim_event_queue.c,v 1.6 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The simple TOSSIM wrapper around the underlying heap. * * @author Phil Levis * @date November 22 2005 */ #include #include static heap_t eventHeap; void sim_queue_init() __attribute__ ((C, spontaneous)) { init_heap(&eventHeap); } void sim_queue_insert(sim_event_t* event) __attribute__ ((C, spontaneous)) { dbg("Queue", "Inserting 0x%p\n", event); heap_insert(&eventHeap, event, event->time); } sim_event_t* sim_queue_pop() __attribute__ ((C, spontaneous)) { long long int key; return (sim_event_t*)(heap_pop_min_data(&eventHeap, &key)); } bool sim_queue_is_empty() __attribute__ ((C, spontaneous)) { return heap_is_empty(&eventHeap); } long long int sim_queue_peek_time() __attribute__ ((C, spontaneous)) { if (heap_is_empty(&eventHeap)) { return -1; } else { return heap_get_min_key(&eventHeap); } } void sim_queue_cleanup_none(sim_event_t* event) __attribute__ ((C, spontaneous)) { dbg("Queue", "cleanup_none: 0x%p\n", event); // Do nothing. Useful for statically allocated events. } void sim_queue_cleanup_event(sim_event_t* event) __attribute__ ((C, spontaneous)) { dbg("Queue", "cleanup_event: 0x%p\n", event); free(event); } void sim_queue_cleanup_data(sim_event_t* event) __attribute__ ((C, spontaneous)) { dbg("Queue", "cleanup_data: 0x%p\n", event); free (event->data); event->data = NULL; } void sim_queue_cleanup_total(sim_event_t* event) __attribute__ ((C, spontaneous)) { dbg("Queue", "cleanup_total: 0x%p\n", event); free (event->data); event->data = NULL; free (event); } sim_event_t* sim_queue_allocate_event() { sim_event_t* evt = (sim_event_t*)malloc(sizeof(sim_event_t)); memset(evt, 0, sizeof(sim_event_t)); evt->mote = sim_node(); return evt; } tinyos-2.1.2+dfsg/tos/lib/tossim/sim_event_queue.h000066400000000000000000000055371207233610700222320ustar00rootroot00000000000000// $Id: sim_event_queue.h,v 1.6 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The event queue is the core of the mote side of TOSSIM. It is a * wrapper around the underlying heap. Unlike the 1.x version, it is * not re-entrant: merging the Python console and TOSSIM means that * functionality like packet injection/reception from external tools * is on the Python side. * * @author Phil Levis * @date November 22 2005 */ #ifndef SIM_EVENT_QUEUE_H_INCLUDED #define SIM_EVENT_QUEUE_H_INCLUDED #include struct sim_event; typedef struct sim_event sim_event_t; struct sim_event { sim_time_t time; unsigned long mote; bool force; // Whether this event type should always be executed // even if a mote is "turned off" bool cancelled; // Whether this event has been cancelled void* data; void (*handle)(sim_event_t* e); void (*cleanup)(sim_event_t* e); }; sim_event_t* sim_queue_allocate_event(); void sim_queue_init(); void sim_queue_insert(sim_event_t* event); bool sim_queue_is_empty(); long long int sim_queue_peek_time(); sim_event_t* sim_queue_pop(); void sim_queue_cleanup_none(sim_event_t* e); void sim_queue_cleanup_event(sim_event_t* e); void sim_queue_cleanup_data(sim_event_t* e) ; void sim_queue_cleanup_total(sim_event_t* e); #endif // EVENT_QUEUE_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tossim/sim_gain.c000066400000000000000000000105231207233610700206050ustar00rootroot00000000000000#include typedef struct sim_gain_noise { double mean; double range; } sim_gain_noise_t; gain_entry_t* connectivity[TOSSIM_MAX_NODES + 1]; sim_gain_noise_t localNoise[TOSSIM_MAX_NODES + 1]; double sensitivity = 4.0; gain_entry_t* sim_gain_allocate_link(int mote); void sim_gain_deallocate_link(gain_entry_t* linkToDelete); gain_entry_t* sim_gain_first(int src) __attribute__ ((C, spontaneous)) { if (src > TOSSIM_MAX_NODES) { return connectivity[TOSSIM_MAX_NODES]; } return connectivity[src]; } gain_entry_t* sim_gain_next(gain_entry_t* currentLink) __attribute__ ((C, spontaneous)) { return currentLink->next; } void sim_gain_add(int src, int dest, double gain) __attribute__ ((C, spontaneous)) { gain_entry_t* current; int temp = sim_node(); if (src > TOSSIM_MAX_NODES) { src = TOSSIM_MAX_NODES; } sim_set_node(src); current = sim_gain_first(src); while (current != NULL) { if (current->mote == dest) { sim_set_node(temp); break; } current = current->next; } if (current == NULL) { current = sim_gain_allocate_link(dest); current->next = connectivity[src]; connectivity[src] = current; } current->mote = dest; current->gain = gain; dbg("Gain", "Adding link from %i to %i with gain %f\n", src, dest, gain); sim_set_node(temp); } double sim_gain_value(int src, int dest) __attribute__ ((C, spontaneous)) { gain_entry_t* current; int temp = sim_node(); sim_set_node(src); current = sim_gain_first(src); while (current != NULL) { if (current->mote == dest) { sim_set_node(temp); dbg("Gain", "Getting link from %i to %i with gain %f\n", src, dest, current->gain); return current->gain; } current = current->next; } sim_set_node(temp); dbg("Gain", "Getting default link from %i to %i with gain %f\n", src, dest, 1.0); return 1.0; } bool sim_gain_connected(int src, int dest) __attribute__ ((C, spontaneous)) { gain_entry_t* current; int temp = sim_node(); sim_set_node(src); current = sim_gain_first(src); while (current != NULL) { if (current->mote == dest) { sim_set_node(temp); return TRUE; } current = current->next; } sim_set_node(temp); return FALSE; } void sim_gain_remove(int src, int dest) __attribute__ ((C, spontaneous)) { gain_entry_t* current; gain_entry_t* prevLink; int temp = sim_node(); if (src > TOSSIM_MAX_NODES) { src = TOSSIM_MAX_NODES; } sim_set_node(src); current = sim_gain_first(src); prevLink = NULL; while (current != NULL) { gain_entry_t* tmp; if (current->mote == dest) { if (prevLink == NULL) { connectivity[src] = current->next; } else { prevLink->next = current->next; } tmp = current->next; sim_gain_deallocate_link(current); current = tmp; } else { prevLink = current; current = current->next; } } sim_set_node(temp); } void sim_gain_set_noise_floor(int node, double mean, double range) __attribute__ ((C, spontaneous)) { if (node > TOSSIM_MAX_NODES) { node = TOSSIM_MAX_NODES; } localNoise[node].mean = mean; localNoise[node].range = range; } double sim_gain_noise_mean(int node) { if (node > TOSSIM_MAX_NODES) { node = TOSSIM_MAX_NODES; } return localNoise[node].mean; } double sim_gain_noise_range(int node) { if (node > TOSSIM_MAX_NODES) { node = TOSSIM_MAX_NODES; } return localNoise[node].range; } // Pick a number a number from the uniform distribution of // [mean-range, mean+range]. double sim_gain_sample_noise(int node) __attribute__ ((C, spontaneous)) { double val, adjust; if (node > TOSSIM_MAX_NODES) { node = TOSSIM_MAX_NODES; } val = localNoise[node].mean; adjust = (sim_random() % 2000000); adjust /= 1000000.0; adjust -= 1.0; adjust *= localNoise[node].range; return val + adjust; } gain_entry_t* sim_gain_allocate_link(int mote) { gain_entry_t* newLink = (gain_entry_t*)malloc(sizeof(gain_entry_t)); newLink->next = NULL; newLink->mote = mote; newLink->gain = -10000000.0; return newLink; } void sim_gain_deallocate_link(gain_entry_t* linkToDelete) __attribute__ ((C, spontaneous)) { free(linkToDelete); } void sim_gain_set_sensitivity(double s) __attribute__ ((C, spontaneous)) { sensitivity = s; } double sim_gain_sensitivity() __attribute__ ((C, spontaneous)) { return sensitivity; } tinyos-2.1.2+dfsg/tos/lib/tossim/sim_gain.h000066400000000000000000000050311207233610700206100ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The C functions that allow TOSSIM-side code to access the SimMoteP * component. * * @author Philip Levis * @date Nov 22 2005 */ // $Id: sim_gain.h,v 1.5 2010-06-29 22:07:51 scipio Exp $ #ifndef SIM_GAIN_H_INCLUDED #define SIM_GAIN_H_INCLUDED #ifdef __cplusplus extern "C" { #endif typedef struct gain_entry { int mote; double gain; struct gain_entry* next; } gain_entry_t; void sim_gain_add(int src, int dest, double gain); double sim_gain_value(int src, int dest); bool sim_gain_connected(int src, int dest); void sim_gain_remove(int src, int dest); void sim_gain_set_noise_floor(int node, double mean, double range); double sim_gain_sample_noise(int node); double sim_gain_noise_mean(int node); double sim_gain_noise_range(int node); void sim_gain_set_sensitivity(double value); double sim_gain_sensitivity(); gain_entry_t* sim_gain_first(int src); gain_entry_t* sim_gain_next(gain_entry_t* e); #ifdef __cplusplus } #endif #endif // SIM_GAIN_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tossim/sim_log.c000066400000000000000000000215161207233610700204540ustar00rootroot00000000000000// $Id: sim_log.c,v 1.7 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM logging system. * * @author Phil Levis * @date November 9 2005 */ #include #include #include #include #include enum { DEFAULT_CHANNEL_SIZE = 8 }; typedef struct sim_log_output { int num; FILE** files; } sim_log_output_t; typedef struct sim_log_channel { const char* name; int numOutputs; int size; FILE** outputs; } sim_log_channel_t; enum { SIM_LOG_OUTPUT_COUNT = uniqueCount("TOSSIM.debug") }; sim_log_output_t outputs[SIM_LOG_OUTPUT_COUNT]; struct hashtable* channelTable = NULL; static unsigned int sim_log_hash(void* key); static int sim_log_eq(void* key1, void* key2); // First we count how many outputs there are, // then allocate a FILE** large enough and fill it in. // This FILE** might be larger than needed, because // the outputs of the channels might have redundancies. // E.g., if two channels A and B are both to stdout, then // you don't want a channel of "A,B" to be doubly printed // to stdout. So when the channel's FILE*s are copied // into the debug point output array, this checks // for redundancies by checking file descriptors. static void fillInOutput(int id, char* name) { char* termination = name; char* namePos = name; int count = 0; char* newName = (char*)malloc(strlen(name) + 1); memset(newName, 0, strlen(name) + 1); // Count the outputs while (termination != NULL) { sim_log_channel_t* channel; termination = strrchr(namePos, ','); // If we've reached the end, just copy to the end if (termination == NULL) { strcpy(newName, namePos); } // Otherwise, memcpy over and null terminate else { memcpy(newName, namePos, (termination - namePos)); newName[termination - namePos] = 0; } channel = hashtable_search(channelTable, newName); if (channel != NULL) { count += channel->numOutputs; } namePos = termination + 1; } termination = name; namePos = name; // Allocate outputs[id].files = (FILE**)malloc(sizeof(FILE*) * count); outputs[id].num = 0; // Fill it in while (termination != NULL) { sim_log_channel_t* channel; termination = strrchr(namePos, ','); // If we've reached the end, just copy to the end if (termination == NULL) { strcpy(newName, namePos); } // Otherwise, memcpy over and null terminate else { memcpy(newName, namePos, (termination - namePos)); newName[termination - namePos] = 0; } channel = hashtable_search(channelTable, newName); if (channel != NULL) { int i, j; for (i = 0; i < channel->numOutputs; i++) { int duplicate = 0; int outputCount = outputs[id].num; // Check if we already have this file descriptor in the output // set, and if so, ignore it. for (j = 0; j < outputCount; j++) { if (fileno(outputs[id].files[j]) == fileno(channel->outputs[i])) { duplicate = 1; j = outputCount; } } if (!duplicate) { outputs[id].files[outputCount] = channel->outputs[i]; outputs[id].num++; } } } namePos = termination + 1; } } void sim_log_init() { int i; channelTable = create_hashtable(128, sim_log_hash, sim_log_eq); for (i = 0; i < SIM_LOG_OUTPUT_COUNT; i++) { outputs[i].num = 1; outputs[i].files = (FILE**)malloc(sizeof(FILE*)); outputs[i].files[0] = fdopen(1, "w"); // STDOUT } } void sim_log_add_channel(char* name, FILE* file) { sim_log_channel_t* channel; channel = (sim_log_channel_t*)hashtable_search(channelTable, name); // If there's no current entry, allocate one, initialize it, // and insert it. if (channel == NULL) { char* newName = (char*)malloc(strlen(name) + 1); strcpy(newName, name); newName[strlen(name)] = 0; channel = (sim_log_channel_t*)malloc(sizeof(sim_log_channel_t)); channel->name = newName; channel->numOutputs = 0; channel->size = DEFAULT_CHANNEL_SIZE; channel->outputs = (FILE**)malloc(sizeof(FILE*) * channel->size); memset(channel->outputs, 0, sizeof(FILE*) * channel->size); hashtable_insert(channelTable, newName, channel); } // If the channel output table is full, double the size of // channel->outputs. if (channel->numOutputs == channel->size) { FILE** newOutputs; int newSize = channel->size * 2; newOutputs = (FILE**)malloc(sizeof(FILE*) * newSize); memcpy(newOutputs, channel->outputs, channel->size * sizeof(FILE**)); free(channel->outputs); channel->outputs = newOutputs; channel->size = newSize; } channel->outputs[channel->numOutputs] = file; channel->numOutputs++; sim_log_commit_change(); } bool sim_log_remove_channel(char* output, FILE* file) { sim_log_channel_t* channel; int i; channel = (sim_log_channel_t*)hashtable_search(channelTable, output); if (channel == NULL) { return FALSE; } // Note: if a FILE* has duplicates, this removes all of them for (i = 0; i < channel->numOutputs; i++) { FILE* f = channel->outputs[i]; if (file == f) { memcpy(&channel->outputs[i], &channel->outputs[i + 1], (channel->numOutputs) - (i + 1)); channel->outputs[channel->numOutputs - 1] = NULL; channel->numOutputs--; } } return TRUE; } void sim_log_commit_change() { int i; for (i = 0; i < SIM_LOG_OUTPUT_COUNT; i++) { if (outputs[i].files != NULL) { outputs[i].num = 0; free(outputs[i].files); outputs[i].files = NULL; } } } void sim_log_debug(uint16_t id, char* string, const char* format, ...) { va_list args; int i; if (outputs[id].files == NULL) { fillInOutput(id, string); } for (i = 0; i < outputs[id].num; i++) { FILE* file = outputs[id].files[i]; va_start(args, format); fprintf(file, "DEBUG (%i): ", (int)sim_node()); vfprintf(file, format, args); fflush(file); } } void sim_log_error(uint16_t id, char* string, const char* format, ...) { va_list args; int i; if (outputs[id].files == NULL) { fillInOutput(id, string); } for (i = 0; i < outputs[id].num; i++) { FILE* file = outputs[id].files[i]; va_start(args, format); fprintf(file, "ERROR (%i): ", (int)sim_node()); vfprintf(file, format, args); fflush(file); } } void sim_log_debug_clear(uint16_t id, char* string, const char* format, ...) { va_list args; int i; if (outputs[id].files == NULL) { fillInOutput(id, string); } for (i = 0; i < outputs[id].num; i++) { FILE* file = outputs[id].files[i]; va_start(args, format); vfprintf(file, format, args); fflush(file); } } void sim_log_error_clear(uint16_t id, char* string, const char* format, ...) { va_list args; int i; if (outputs[id].files == NULL) { fillInOutput(id, string); } for (i = 0; i < outputs[id].num; i++) { FILE* file = outputs[id].files[i]; va_start(args, format); vfprintf(file, format, args); fflush(file); } } /* This is the sdbm algorithm, taken from http://www.cs.yorku.ca/~oz/hash.html -pal */ static unsigned int sim_log_hash(void* key) { char* str = (char*)key; unsigned int hashVal = 0; int hashChar; while ((hashChar = *str++)) hashVal = hashChar + (hashVal << 6) + (hashVal << 16) - hashVal; return hashVal; } static int sim_log_eq(void* key1, void* key2) { return strcmp((char*)key1, (char*)key2) == 0; } tinyos-2.1.2+dfsg/tos/lib/tossim/sim_log.h000066400000000000000000000057761207233610700204730ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM logging system. Unlike in TinyOS 1.x, this logging * system supports an arbitrary number of channels, denoted by * a string identifier. A channel can be connected to any number * of outputs, and a debug statement can be associated with any * number of channels. * * @author Philip Levis * @date Nov 22 2005 */ // $Id: sim_log.h,v 1.5 2010-06-29 22:07:51 scipio Exp $ #ifndef SIM_LOG_H_INCLUDED #define SIM_LOG_H_INCLUDED #ifndef TOSSIM_NO_DEBUG #define dbg(s, ...) sim_log_debug(unique("TOSSIM.debug"), s, __VA_ARGS__) #define dbg_clear(s, ...) sim_log_debug_clear(unique("TOSSIM.debug"), s, __VA_ARGS__) #define dbgerror(s, ...) sim_log_error(unique("TOSSIM.debug"), s, __VA_ARGS__) #define dbgerror_clear(s, ...) sim_log_error_clear(unique("TOSSIM.debug"), s, __VA_ARGS__) #else #define dbg(s, ...) #define dbg_clear(s, ...) #define dbgerror(s, ...) #define dbgerror_clear(s, ...) #endif #ifdef __cplusplus extern "C" { #endif void sim_log_init(); void sim_log_add_channel(char* output, FILE* file); bool sim_log_remove_channel(char* output, FILE* file); void sim_log_commit_change(); void sim_log_debug(uint16_t id, char* string, const char* format, ...); void sim_log_error(uint16_t id, char* string, const char* format, ...); void sim_log_debug_clear(uint16_t id, char* string, const char* format, ...); void sim_log_error_clear(uint16_t id, char* string, const char* format, ...); #ifdef __cplusplus } #endif #endif // SIM_LOG_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tossim/sim_mac.c000066400000000000000000000034721207233610700204340ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * This file is where you change which MAC and radio models TOSSIM * incorporates. * * @author Philip Levis * @date Dec 10 2005 */ #include #include //Added by HyungJune Lee #include #include tinyos-2.1.2+dfsg/tos/lib/tossim/sim_mote.h000066400000000000000000000045031207233610700206410ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The C functions that allow TOSSIM-side code to access the SimMoteP * component. * * @author Philip Levis * @date Nov 22 2005 */ // $Id: sim_mote.h,v 1.5 2010-06-29 22:07:51 scipio Exp $ #ifndef SIM_MOTE_H_INCLUDED #define SIM_MOTE_H_INCLUDED #ifdef __cplusplus extern "C" { #endif long long int sim_mote_euid(int mote); void sim_mote_set_euid(int mote, long long int euid); long long int sim_mote_start_time(int mote); void sim_mote_set_start_time(int mote, long long int t); bool sim_mote_is_on(int mote); void sim_mote_turn_on(int mote); void sim_mote_turn_off(int mote); int sim_mote_get_variable_info(int mote, char* name, void** addr, size_t* len); void sim_mote_enqueue_boot_event(int mote); #ifdef __cplusplus } #endif #endif // SIM_MOTE_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tossim/sim_noise.c000066400000000000000000000322271207233610700210110ustar00rootroot00000000000000/* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of all of the Hash-Based Learning primitives and utility * functions. * * @author Hyungjune Lee * @date Oct 13 2006 */ #include #include #include #include #include #include #include "randomlib.h" #include "hashtable.h" #include "sim_noise.h" //Tal Debug, to count how often simulation hits the one match case int numCase1 = 0; int numCase2 = 0; int numTotal = 0; //End Tal Debug uint32_t FreqKeyNum = 0; sim_noise_node_t noiseData[TOSSIM_MAX_NODES]; static unsigned int sim_noise_hash(void *key); static int sim_noise_eq(void *key1, void *key2); void makeNoiseModel(uint16_t node_id); void makePmfDistr(uint16_t node_id); uint8_t search_bin_num(char noise); void sim_noise_init()__attribute__ ((C, spontaneous)) { int j; //printf("Starting\n"); for (j=0; j< TOSSIM_MAX_NODES; j++) { noiseData[j].noiseTable = create_hashtable(NOISE_HASHTABLE_SIZE, sim_noise_hash, sim_noise_eq); noiseData[j].noiseGenTime = 0; noiseData[j].noiseTrace = (char*)(malloc(sizeof(char) * NOISE_MIN_TRACE)); noiseData[j].noiseTraceLen = NOISE_MIN_TRACE; noiseData[j].noiseTraceIndex = 0; } //printf("Done with sim_noise_init()\n"); } void sim_noise_create_model(uint16_t node_id)__attribute__ ((C, spontaneous)) { makeNoiseModel(node_id); makePmfDistr(node_id); } char sim_real_noise(uint16_t node_id, uint32_t cur_t) { if (cur_t > noiseData[node_id].noiseTraceLen) { dbg("Noise", "Asked for noise element %u when there are only %u.\n", cur_t, noiseData[node_id].noiseTraceIndex); return 0; } return noiseData[node_id].noiseTrace[cur_t]; } void sim_noise_trace_add(uint16_t node_id, char noiseVal)__attribute__ ((C, spontaneous)) { // Need to double size of trace arra if (noiseData[node_id].noiseTraceIndex == noiseData[node_id].noiseTraceLen) { char* data = (char*)(malloc(sizeof(char) * noiseData[node_id].noiseTraceLen * 2)); memcpy(data, noiseData[node_id].noiseTrace, noiseData[node_id].noiseTraceLen); free(noiseData[node_id].noiseTrace); noiseData[node_id].noiseTraceLen *= 2; noiseData[node_id].noiseTrace = data; } noiseData[node_id].noiseTrace[noiseData[node_id].noiseTraceIndex] = noiseVal; noiseData[node_id].noiseTraceIndex++; dbg("Insert", "Adding noise value %i for %i of %i\n", (int)noiseData[node_id].noiseTraceIndex, (int)node_id, (int)noiseVal); } uint8_t search_bin_num(char noise)__attribute__ ((C, spontaneous)) { uint8_t bin; if (noise > NOISE_MAX || noise < NOISE_MIN) { noise = NOISE_MIN; } bin = (noise-NOISE_MIN)/NOISE_QUANTIZE_INTERVAL + 1; return bin; } char search_noise_from_bin_num(int i)__attribute__ ((C, spontaneous)) { char noise; noise = NOISE_MIN + (i-1)*NOISE_QUANTIZE_INTERVAL; return noise; } static unsigned int sim_noise_hash(void *key) { char *pt = (char *)key; unsigned int hashVal = 0; int i; for (i=0; i< NOISE_HISTORY; i++) { hashVal = pt[i] + (hashVal << 6) + (hashVal << 16) - hashVal; } return hashVal; } static int sim_noise_eq(void *key1, void *key2) { return (memcmp((void *)key1, (void *)key2, NOISE_HISTORY) == 0); } void sim_noise_add(uint16_t node_id, char noise)__attribute__ ((C, spontaneous)) { int i; struct hashtable *pnoiseTable = noiseData[node_id].noiseTable; char *key = noiseData[node_id].key; sim_noise_hash_t *noise_hash; noise_hash = (sim_noise_hash_t *)hashtable_search(pnoiseTable, key); dbg("Insert", "Adding noise value %hhi\n", noise); if (noise_hash == NULL) { noise_hash = (sim_noise_hash_t *)malloc(sizeof(sim_noise_hash_t)); memcpy((void *)(noise_hash->key), (void *)key, NOISE_HISTORY); noise_hash->numElements = 0; noise_hash->size = NOISE_DEFAULT_ELEMENT_SIZE; noise_hash->elements = (char *)malloc(sizeof(char)*noise_hash->size); memset((void *)noise_hash->elements, 0, sizeof(char)*noise_hash->size); noise_hash->flag = 0; for(i=0; idist[i] = 0; } hashtable_insert(pnoiseTable, key, noise_hash); dbg("Insert", "Inserting %p into table %p with key ", noise_hash, pnoiseTable); { int ctr; for(ctr = 0; ctr < NOISE_HISTORY; ctr++) dbg_clear("Insert", "%0.3hhi ", key[ctr]); } dbg_clear("Insert", "\n"); } if (noise_hash->numElements == noise_hash->size) { char *newElements; int newSize = (noise_hash->size)*2; newElements = (char *)malloc(sizeof(char)*newSize); memcpy(newElements, noise_hash->elements, noise_hash->size); free(noise_hash->elements); noise_hash->elements = newElements; noise_hash->size = newSize; } noise_hash->elements[noise_hash->numElements] = noise; // printf("I hear noise %i\n", noise); noise_hash->numElements++; } void sim_noise_dist(uint16_t node_id)__attribute__ ((C, spontaneous)) { int i; uint8_t bin; float cmf = 0; struct hashtable *pnoiseTable = noiseData[node_id].noiseTable; char *key = noiseData[node_id].key; char *freqKey = noiseData[node_id].freqKey; sim_noise_hash_t *noise_hash; noise_hash = (sim_noise_hash_t *)hashtable_search(pnoiseTable, key); // noise_hash->flag; if (noise_hash->flag == 1) return; for (i=0; i < NOISE_NUM_VALUES; i++) { noise_hash->dist[i] = 0.0; } for (i=0; i< noise_hash->numElements; i++) { float val; dbg("Noise_output", "Noise is found to be %i\n", noise_hash->elements[i]); bin = noise_hash->elements[i] - NOISE_MIN_QUANTIZE; //search_bin_num(noise_hash->elements[i]) - 1; // printf("Bin %i, Noise %i\n", bin, (NOISE_MIN_QUANTIZE + bin)); val = noise_hash->dist[bin]; val += (float)1.0; noise_hash->dist[bin] = val; } for (i=0; i < NOISE_NUM_VALUES ; i++) { noise_hash->dist[i] = (noise_hash->dist[i])/(noise_hash->numElements); cmf += noise_hash->dist[i]; noise_hash->dist[i] = cmf; } noise_hash->flag = 1; //Find the most frequent key and store it in noiseData[node_id].freqKey[]. if (noise_hash->numElements > FreqKeyNum) { int j; FreqKeyNum = noise_hash->numElements; memcpy((void *)freqKey, (void *)key, NOISE_HISTORY); dbg("HashZeroDebug", "Setting most frequent key (%i): ", (int) FreqKeyNum); for (j = 0; j < NOISE_HISTORY; j++) { dbg_clear("HashZeroDebug", "[%hhu] ", key[j]); } dbg_clear("HashZeroDebug", "\n"); } } void arrangeKey(uint16_t node_id)__attribute__ ((C, spontaneous)) { char *pKey = noiseData[node_id].key; memcpy(pKey, pKey+1, NOISE_HISTORY-1); } /* * After makeNoiseModel() is done, make PMF distribution for each bin. */ void makePmfDistr(uint16_t node_id)__attribute__ ((C, spontaneous)) { int i; char *pKey = noiseData[node_id].key; char *fKey = noiseData[node_id].freqKey; FreqKeyNum = 0; for(i=0; inumElements=%d\n", noise_hash->numElements); //Tal Debug numTotal++; //End Tal Debug if (noise_hash->numElements == 1) { noise = noise_hash->elements[0]; dbg_clear("HASH", "(E)Noise = %d\n", noise); //Tal Debug numCase1++; dbg("Noise_c", "In case 1: %i of %i\n", numCase1, numTotal); //End Tal Debug dbg("NoiseAudit", "Noise: %i\n", noise); return noise; } //Tal Debug numCase2++; dbg("Noise_c", "In case 2: %i of %i\n", numCase2, numTotal); //End Tal Debug for (i = 0; i < NOISE_NUM_VALUES - 1; i++) { dbg("HASH", "IN:for i=%d\n", i); if (i == 0) { if (ranNum <= noise_hash->dist[i]) { noiseIndex = i; dbg_clear("HASH", "Selected Bin = %d -> ", i+1); break; } } else if ( (noise_hash->dist[i-1] < ranNum) && (ranNum <= noise_hash->dist[i]) ) { noiseIndex = i; dbg_clear("HASH", "Selected Bin = %d -> ", i+1); break; } } dbg("HASH", "OUT:for i=%d\n", i); noise = NOISE_MIN_QUANTIZE + i; //TODO search_noise_from_bin_num(i+1); dbg("NoiseAudit", "Noise: %i\n", noise); return noise; } char sim_noise_generate(uint16_t node_id, uint32_t cur_t)__attribute__ ((C, spontaneous)) { uint32_t i; uint32_t prev_t; uint32_t delta_t; char *noiseG; char noise; prev_t = noiseData[node_id].noiseGenTime; if (noiseData[node_id].generated == 0) { dbgerror("TOSSIM", "Tried to generate noise from an uninitialized radio model of node %hu.\n", node_id); return 127; } if ( (0<= cur_t) && (cur_t < NOISE_HISTORY) ) { noiseData[node_id].noiseGenTime = cur_t; noiseData[node_id].key[cur_t] = search_bin_num(noiseData[node_id].noiseTrace[cur_t]); noiseData[node_id].lastNoiseVal = noiseData[node_id].noiseTrace[cur_t]; return noiseData[node_id].noiseTrace[cur_t]; } if (prev_t == 0) delta_t = cur_t - (NOISE_HISTORY-1); else delta_t = cur_t - prev_t; dbg_clear("HASH", "delta_t = %d\n", delta_t); if (delta_t == 0) noise = noiseData[node_id].lastNoiseVal; else { noiseG = (char *)malloc(sizeof(char)*delta_t); for(i=0; i< delta_t; i++) { noiseG[i] = sim_noise_gen(node_id); arrangeKey(node_id); noiseData[node_id].key[NOISE_HISTORY-1] = search_bin_num(noiseG[i]); } noise = noiseG[delta_t-1]; noiseData[node_id].lastNoiseVal = noise; free(noiseG); } noiseData[node_id].noiseGenTime = cur_t; if (noise == 0) { dbg("HashZeroDebug", "Generated noise of zero.\n"); } // printf("%i\n", noise); return noise; } /* * When initialization process is going on, make noise model by putting * experimental noise values. */ void makeNoiseModel(uint16_t node_id)__attribute__ ((C, spontaneous)) { int i; for(i=0; i #ifdef __cplusplus extern "C" { #endif enum { NOISE_MIN = -115, NOISE_MAX = -5, NOISE_MIN_QUANTIZE = -115, NOISE_QUANTIZE_INTERVAL = 5, NOISE_BIN_SIZE = ((NOISE_MAX - NOISE_MIN) / NOISE_QUANTIZE_INTERVAL) + 1, NOISE_HISTORY = 20, NOISE_DEFAULT_ELEMENT_SIZE = 8, NOISE_HASHTABLE_SIZE = 128, NOISE_MIN_TRACE = 128, NOISE_NUM_VALUES = NOISE_MAX - NOISE_MIN + 1, //TODO check the + 1, also in NOISE_BIN_SIZE above in the inner parens }; typedef struct sim_noise_hash_t { char key[NOISE_HISTORY]; int numElements; int size; char *elements; char flag; float dist[NOISE_NUM_VALUES]; } sim_noise_hash_t; typedef struct sim_noise_node_t { char key[NOISE_HISTORY]; char freqKey[NOISE_HISTORY]; char lastNoiseVal; uint32_t noiseGenTime; struct hashtable *noiseTable; char* noiseTrace; uint32_t noiseTraceLen; uint32_t noiseTraceIndex; bool generated; } sim_noise_node_t; void sim_noise_init(); char sim_real_noise(uint16_t node_id, uint32_t cur_t); char sim_noise_generate(uint16_t node_id, uint32_t cur_t); void sim_noise_trace_add(uint16_t node_id, char val); void sim_noise_create_model(uint16_t node_id); #ifdef __cplusplus } #endif #endif // _SIM_NOISE_HASH_H_ tinyos-2.1.2+dfsg/tos/lib/tossim/sim_packet.c000066400000000000000000000107101207233610700211340ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * TOSSIM packet abstract data type, so C++ code can call into nesC * code that does the native-to-network type translation. * * @author Philip Levis * @date Jan 2 2006 */ // $Id: sim_packet.c,v 1.6 2010-06-29 22:07:51 scipio Exp $ #include #include // NOTE: This function is defined in lib/tossim/ActiveMessageC. It // has to be predeclared here because it is defined within that component. void active_message_deliver(int node, message_t* m, sim_time_t t); static tossim_header_t* getHeader(message_t* msg) { return (tossim_header_t*)(msg->data - sizeof(tossim_header_t)); } void sim_packet_set_source(sim_packet_t* msg, uint16_t src)__attribute__ ((C, spontaneous)) { tossim_header_t* hdr = getHeader((message_t*)msg); hdr->src = src; } uint16_t sim_packet_source(sim_packet_t* msg)__attribute__ ((C, spontaneous)) { tossim_header_t* hdr = getHeader((message_t*)msg); return hdr->src; } void sim_packet_set_destination(sim_packet_t* msg, uint16_t dest)__attribute__ ((C, spontaneous)) { tossim_header_t* hdr = getHeader((message_t*)msg); hdr->dest = dest; } uint16_t sim_packet_destination(sim_packet_t* msg)__attribute__ ((C, spontaneous)) { tossim_header_t* hdr = getHeader((message_t*)msg); return hdr->dest; } void sim_packet_set_length(sim_packet_t* msg, uint8_t length)__attribute__ ((C, spontaneous)) { tossim_header_t* hdr = getHeader((message_t*)msg); hdr->length = length; } uint16_t sim_packet_length(sim_packet_t* msg)__attribute__ ((C, spontaneous)) { tossim_header_t* hdr = getHeader((message_t*)msg); return hdr->length; } void sim_packet_set_type(sim_packet_t* msg, uint8_t type) __attribute__ ((C, spontaneous)){ tossim_header_t* hdr = getHeader((message_t*)msg); hdr->type = type; } uint8_t sim_packet_type(sim_packet_t* msg) __attribute__ ((C, spontaneous)){ tossim_header_t* hdr = getHeader((message_t*)msg); return hdr->type; } uint8_t* sim_packet_data(sim_packet_t* p) __attribute__ ((C, spontaneous)){ message_t* msg = (message_t*)p; return (uint8_t*)&msg->data; } void sim_packet_set_strength(sim_packet_t* p, uint16_t str) __attribute__ ((C, spontaneous)){ message_t* msg = (message_t*)p; tossim_metadata_t* md = (tossim_metadata_t*)(&msg->metadata); md->strength = str; } void sim_packet_deliver(int node, sim_packet_t* msg, sim_time_t t) __attribute__ ((C, spontaneous)){ if (t < sim_time()) { t = sim_time(); } dbg("Packet", "sim_packet.c: Delivering packet %p to %i at %llu\n", msg, node, t); active_message_deliver(node, (message_t*)msg, t); } uint8_t sim_packet_max_length(sim_packet_t* msg) __attribute__ ((C, spontaneous)){ return TOSH_DATA_LENGTH; } sim_packet_t* sim_packet_allocate () __attribute__ ((C, spontaneous)){ return (sim_packet_t*)malloc(sizeof(message_t)); } void sim_packet_free(sim_packet_t* p) __attribute__ ((C, spontaneous)) { printf("sim_packet.c: Freeing packet %p\n", p); free(p); } tinyos-2.1.2+dfsg/tos/lib/tossim/sim_packet.h000066400000000000000000000063261207233610700211510ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * TOSSIM packet abstract data type, so C++ code can call into nesC * code that does the native-to-network type translation. * * @author Philip Levis * @date Jan 2 2006 */ // $Id: sim_packet.h,v 1.6 2010-06-29 22:07:51 scipio Exp $ #ifndef SIM_PACKET_H_INCLUDED #define SIM_PACKET_H_INCLUDED #ifdef __cplusplus extern "C" { #endif /* * sim_packet_t is a weird beast. It's a dummy type that can stand * in for message_t. We need to use sim_packet_t because gcc can't * understand message_t, due to its network types (nx). So the shim * code between Python and TOSSIM can't mention message_t. Rather * than use a void*, the shim uses sim_packet_t in order to provide * some type checking. A sim_packet_t* is essentially a Python * friendly pointer to a message_t. */ typedef struct sim_packet {} sim_packet_t; void sim_packet_set_source(sim_packet_t* msg, uint16_t src); uint16_t sim_packet_source(sim_packet_t* msg); void sim_packet_set_destination(sim_packet_t* msg, uint16_t dest); uint16_t sim_packet_destination(sim_packet_t* msg); void sim_packet_set_length(sim_packet_t* msg, uint8_t len); uint16_t sim_packet_length(sim_packet_t* msg); void sim_packet_set_type(sim_packet_t* msg, uint8_t type); uint8_t sim_packet_type(sim_packet_t* msg); uint8_t* sim_packet_data(sim_packet_t* msg); void sim_packet_set_strength(sim_packet_t* msg, uint16_t str); void sim_packet_deliver(int node, sim_packet_t* msg, sim_time_t t); uint8_t sim_packet_max_length(sim_packet_t* msg); sim_packet_t* sim_packet_allocate(); void sim_packet_free(sim_packet_t* m); #ifdef __cplusplus } #endif #endif // SIM_PACKET_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tossim/sim_tossim.c000066400000000000000000000133561207233610700212140ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of all of the basic TOSSIM primitives and utility * functions. * * @author Philip Levis * @date Nov 22 2005 */ // $Id: sim_tossim.c,v 1.8 2010-06-29 22:07:51 scipio Exp $ #include #include #include #include #include #include //added by HyungJune Lee static sim_time_t sim_ticks; static unsigned long current_node; static int sim_seed; static int __nesc_nido_resolve(int mote, char* varname, uintptr_t* addr, size_t* size); void sim_init() __attribute__ ((C, spontaneous)) { sim_queue_init(); sim_log_init(); sim_log_commit_change(); sim_noise_init(); //added by HyungJune Lee { struct timeval tv; gettimeofday(&tv, NULL); // Need to make sure we don't pass zero to seed simulation. // But in case some weird timing factor causes usec to always // be zero, default to tv_sec. Note that the explicit // seeding call also has a check for zero. Thanks to Konrad // Iwanicki for finding this. -pal if (tv.tv_usec != 0) { sim_random_seed(tv.tv_usec); } else { sim_random_seed(tv.tv_sec); } } } void sim_end() __attribute__ ((C, spontaneous)) { sim_queue_init(); } int sim_random() __attribute__ ((C, spontaneous)) { uint32_t mlcg,p,q; uint64_t tmpseed; tmpseed = (uint64_t)33614U * (uint64_t)sim_seed; q = tmpseed; /* low */ q = q >> 1; p = tmpseed >> 32 ; /* hi */ mlcg = p + q; if (mlcg & 0x80000000) { mlcg = mlcg & 0x7FFFFFFF; mlcg++; } sim_seed = mlcg; return mlcg; } void sim_random_seed(int seed) __attribute__ ((C, spontaneous)) { // A seed of zero wedges on zero, so use 1 instead. if (seed == 0) { seed = 1; } sim_seed = seed; } sim_time_t sim_time() __attribute__ ((C, spontaneous)) { return sim_ticks; } void sim_set_time(sim_time_t t) __attribute__ ((C, spontaneous)) { sim_ticks = t; } sim_time_t sim_ticks_per_sec() __attribute__ ((C, spontaneous)) { return 10000000000ULL; } unsigned long sim_node() __attribute__ ((C, spontaneous)) { return current_node; } void sim_set_node(unsigned long node) __attribute__ ((C, spontaneous)) { current_node = node; TOS_NODE_ID = node; } bool sim_run_next_event() __attribute__ ((C, spontaneous)) { bool result = FALSE; if (!sim_queue_is_empty()) { sim_event_t* event = sim_queue_pop(); sim_set_time(event->time); sim_set_node(event->mote); // Need to test whether function pointers are for statically // allocted events that are zeroed out on reboot dbg("Tossim", "CORE: popping event 0x%p for %i at %llu with handler %p... ", event, sim_node(), sim_time(), event->handle); if ((sim_mote_is_on(event->mote) || event->force) && event->handle != NULL) { result = TRUE; dbg_clear("Tossim", " mote is on (or forced event), run it.\n"); event->handle(event); } else { dbg_clear("Tossim", "\n"); } if (event->cleanup != NULL) { event->cleanup(event); } } return result; } int sim_print_time(char* buf, int len, sim_time_t ftime) __attribute__ ((C, spontaneous)) { int hours; int minutes; int seconds; sim_time_t secondBillionths; secondBillionths = (ftime % sim_ticks_per_sec()); if (sim_ticks_per_sec() > (sim_time_t)1000000000) { secondBillionths /= (sim_ticks_per_sec() / (sim_time_t)1000000000); } else { secondBillionths *= ((sim_time_t)1000000000 / sim_ticks_per_sec()); } seconds = (int)(ftime / sim_ticks_per_sec()); minutes = seconds / 60; hours = minutes / 60; seconds %= 60; minutes %= 60; buf[len-1] = 0; return snprintf(buf, len - 1, "%i:%i:%i.%09llu", hours, minutes, seconds, secondBillionths); } int sim_print_now(char* buf, int len) __attribute__ ((C, spontaneous)) { return sim_print_time(buf, len, sim_time()); } char simTimeBuf[128]; char* sim_time_string() __attribute__ ((C, spontaneous)) { sim_print_now(simTimeBuf, 128); return simTimeBuf; } void sim_add_channel(char* channel, FILE* file) __attribute__ ((C, spontaneous)) { sim_log_add_channel(channel, file); } bool sim_remove_channel(char* channel, FILE* file) __attribute__ ((C, spontaneous)) { return sim_log_remove_channel(channel, file); } tinyos-2.1.2+dfsg/tos/lib/tossim/sim_tossim.h000066400000000000000000000047521207233610700212210ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of all of the basic TOSSIM primitives and utility * functions. * * @author Philip Levis * @date Nov 22 2005 */ // $Id: sim_tossim.h,v 1.5 2010-06-29 22:07:51 scipio Exp $ #ifndef SIM_TOSSIM_H_INCLUDED #define SIM_TOSSIM_H_INCLUDED #include #ifdef __cplusplus extern "C" { #endif typedef long long int sim_time_t; void sim_init(); void sim_start(); void sim_end(); void sim_random_seed(int seed); int sim_random(); sim_time_t sim_time(); void sim_set_time(sim_time_t time); sim_time_t sim_ticks_per_sec(); unsigned long sim_node(); void sim_set_node(unsigned long node); int sim_print_time(char* buf, int bufLen, sim_time_t time); int sim_print_now(char* buf, int bufLen); char* sim_time_string(); void sim_add_channel(char* channel, FILE* file); bool sim_remove_channel(char* channel, FILE* file); bool sim_run_next_event(); #ifdef __cplusplus } #endif #endif // SIM_TOSSIM_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tossim/topologies/000077500000000000000000000000001207233610700210365ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tossim/topologies/15-15-medium-mica2-grid.txt000066400000000000000000036576021207233610700254640ustar00rootroot00000000000000gain 0 1 -87.04 gain 1 0 -88.02 gain 0 2 -89.58 gain 2 0 -90.40 gain 0 3 -96.56 gain 3 0 -98.69 gain 0 4 -108.45 gain 4 0 -112.72 gain 0 5 -99.72 gain 5 0 -104.43 gain 0 6 -107.02 gain 6 0 -108.16 gain 0 7 -112.03 gain 7 0 -110.56 gain 0 8 -106.75 gain 8 0 -111.25 gain 0 9 -107.25 gain 9 0 -107.24 gain 0 10 -115.74 gain 10 0 -118.04 gain 0 11 -117.77 gain 11 0 -121.51 gain 0 12 -112.05 gain 12 0 -113.75 gain 0 13 -118.28 gain 13 0 -116.20 gain 0 14 -116.72 gain 14 0 -117.27 gain 0 15 -77.28 gain 15 0 -73.96 gain 0 16 -87.97 gain 16 0 -85.90 gain 0 17 -93.46 gain 17 0 -94.17 gain 0 18 -100.62 gain 18 0 -102.33 gain 0 19 -96.70 gain 19 0 -99.46 gain 0 20 -102.53 gain 20 0 -103.39 gain 0 21 -107.64 gain 21 0 -108.75 gain 0 22 -107.87 gain 22 0 -112.21 gain 0 23 -107.76 gain 23 0 -111.42 gain 0 24 -108.33 gain 24 0 -114.86 gain 0 25 -112.34 gain 25 0 -114.67 gain 0 26 -117.18 gain 26 0 -118.87 gain 0 27 -110.74 gain 27 0 -112.92 gain 0 28 -112.29 gain 28 0 -112.19 gain 0 29 -114.82 gain 29 0 -120.37 gain 0 30 -92.53 gain 30 0 -95.74 gain 0 31 -99.21 gain 31 0 -100.79 gain 0 32 -102.31 gain 32 0 -103.64 gain 0 33 -103.22 gain 33 0 -104.73 gain 0 34 -105.83 gain 34 0 -105.22 gain 0 35 -114.75 gain 35 0 -116.53 gain 0 36 -100.94 gain 36 0 -104.41 gain 0 37 -104.79 gain 37 0 -110.20 gain 0 38 -108.21 gain 38 0 -105.78 gain 0 39 -110.24 gain 39 0 -109.41 gain 0 40 -109.80 gain 40 0 -110.14 gain 0 41 -116.08 gain 41 0 -118.49 gain 0 42 -123.16 gain 42 0 -123.22 gain 0 43 -116.98 gain 43 0 -115.81 gain 0 44 -116.43 gain 44 0 -118.33 gain 0 45 -96.06 gain 45 0 -98.89 gain 0 46 -91.85 gain 46 0 -94.59 gain 0 47 -89.61 gain 47 0 -90.28 gain 0 48 -104.50 gain 48 0 -109.05 gain 0 49 -105.33 gain 49 0 -108.74 gain 0 50 -108.51 gain 50 0 -108.26 gain 0 51 -108.71 gain 51 0 -106.95 gain 0 52 -106.94 gain 52 0 -112.45 gain 0 53 -112.63 gain 53 0 -112.66 gain 0 54 -107.14 gain 54 0 -110.74 gain 0 55 -115.13 gain 55 0 -113.89 gain 0 56 -117.57 gain 56 0 -121.23 gain 0 57 -115.98 gain 57 0 -116.42 gain 0 58 -118.12 gain 58 0 -120.27 gain 0 59 -113.10 gain 59 0 -117.68 gain 0 60 -100.78 gain 60 0 -102.65 gain 0 61 -101.80 gain 61 0 -105.11 gain 0 62 -98.11 gain 62 0 -100.98 gain 0 63 -105.80 gain 63 0 -109.90 gain 0 64 -108.04 gain 64 0 -106.92 gain 0 65 -106.79 gain 65 0 -104.27 gain 0 66 -105.29 gain 66 0 -105.85 gain 0 67 -108.91 gain 67 0 -108.35 gain 0 68 -110.70 gain 68 0 -117.43 gain 0 69 -113.02 gain 69 0 -113.48 gain 0 70 -114.05 gain 70 0 -116.02 gain 0 71 -120.68 gain 71 0 -122.52 gain 0 72 -113.91 gain 72 0 -113.73 gain 0 73 -118.52 gain 73 0 -119.17 gain 0 74 -118.62 gain 74 0 -121.56 gain 0 75 -103.39 gain 75 0 -104.00 gain 0 76 -111.83 gain 76 0 -113.47 gain 0 77 -114.13 gain 77 0 -118.74 gain 0 78 -107.85 gain 78 0 -109.36 gain 0 79 -111.51 gain 79 0 -110.96 gain 0 80 -113.33 gain 80 0 -114.29 gain 0 81 -109.03 gain 81 0 -107.96 gain 0 82 -107.79 gain 82 0 -109.56 gain 0 83 -113.32 gain 83 0 -114.88 gain 0 84 -120.25 gain 84 0 -119.61 gain 0 85 -112.11 gain 85 0 -109.75 gain 0 86 -119.12 gain 86 0 -125.15 gain 0 87 -119.41 gain 87 0 -121.09 gain 0 88 -113.05 gain 88 0 -115.27 gain 0 89 -121.03 gain 89 0 -123.51 gain 0 90 -107.46 gain 90 0 -111.31 gain 0 91 -108.44 gain 91 0 -111.58 gain 0 92 -101.81 gain 92 0 -105.52 gain 0 93 -105.53 gain 93 0 -110.77 gain 0 94 -115.72 gain 94 0 -115.87 gain 0 95 -108.57 gain 95 0 -111.94 gain 0 96 -115.88 gain 96 0 -114.72 gain 0 97 -109.79 gain 97 0 -112.04 gain 0 98 -118.77 gain 98 0 -119.77 gain 0 99 -117.23 gain 99 0 -121.87 gain 0 100 -115.79 gain 100 0 -122.14 gain 0 101 -119.80 gain 101 0 -122.07 gain 0 102 -119.85 gain 102 0 -122.26 gain 0 103 -121.11 gain 103 0 -123.35 gain 0 104 -120.71 gain 104 0 -118.77 gain 0 105 -105.56 gain 105 0 -108.95 gain 0 106 -106.18 gain 106 0 -108.28 gain 0 107 -109.34 gain 107 0 -111.74 gain 0 108 -103.31 gain 108 0 -105.37 gain 0 109 -104.17 gain 109 0 -108.08 gain 0 110 -117.10 gain 110 0 -118.08 gain 0 111 -112.51 gain 111 0 -116.15 gain 0 112 -117.19 gain 112 0 -120.58 gain 0 113 -111.31 gain 113 0 -116.39 gain 0 114 -118.33 gain 114 0 -120.32 gain 0 115 -120.81 gain 115 0 -117.73 gain 0 116 -114.66 gain 116 0 -117.31 gain 0 117 -117.59 gain 117 0 -123.05 gain 0 118 -116.27 gain 118 0 -119.10 gain 0 119 -114.40 gain 119 0 -116.71 gain 0 120 -108.51 gain 120 0 -106.37 gain 0 121 -106.13 gain 121 0 -106.76 gain 0 122 -109.92 gain 122 0 -113.06 gain 0 123 -118.68 gain 123 0 -119.34 gain 0 124 -113.73 gain 124 0 -114.38 gain 0 125 -109.76 gain 125 0 -112.01 gain 0 126 -123.24 gain 126 0 -121.80 gain 0 127 -113.39 gain 127 0 -113.53 gain 0 128 -116.41 gain 128 0 -118.42 gain 0 129 -117.86 gain 129 0 -117.27 gain 0 130 -114.59 gain 130 0 -116.69 gain 0 131 -118.71 gain 131 0 -118.67 gain 0 132 -116.08 gain 132 0 -118.66 gain 0 133 -120.47 gain 133 0 -121.16 gain 0 134 -122.85 gain 134 0 -123.33 gain 0 135 -117.46 gain 135 0 -119.65 gain 0 136 -121.33 gain 136 0 -124.82 gain 0 137 -117.51 gain 137 0 -118.78 gain 0 138 -113.23 gain 138 0 -110.73 gain 0 139 -115.97 gain 139 0 -115.37 gain 0 140 -112.21 gain 140 0 -117.66 gain 0 141 -112.41 gain 141 0 -112.75 gain 0 142 -112.08 gain 142 0 -117.24 gain 0 143 -110.54 gain 143 0 -111.24 gain 0 144 -115.17 gain 144 0 -116.77 gain 0 145 -113.91 gain 145 0 -115.10 gain 0 146 -113.52 gain 146 0 -112.27 gain 0 147 -118.54 gain 147 0 -121.14 gain 0 148 -115.26 gain 148 0 -116.79 gain 0 149 -113.50 gain 149 0 -114.28 gain 0 150 -123.34 gain 150 0 -129.23 gain 0 151 -122.09 gain 151 0 -121.54 gain 0 152 -121.00 gain 152 0 -122.28 gain 0 153 -119.99 gain 153 0 -123.70 gain 0 154 -118.02 gain 154 0 -117.35 gain 0 155 -113.90 gain 155 0 -117.05 gain 0 156 -113.26 gain 156 0 -114.43 gain 0 157 -113.20 gain 157 0 -116.33 gain 0 158 -111.93 gain 158 0 -115.49 gain 0 159 -116.52 gain 159 0 -113.72 gain 0 160 -115.04 gain 160 0 -114.51 gain 0 161 -121.89 gain 161 0 -124.23 gain 0 162 -119.67 gain 162 0 -119.08 gain 0 163 -120.60 gain 163 0 -117.20 gain 0 164 -127.60 gain 164 0 -125.95 gain 0 165 -109.60 gain 165 0 -110.88 gain 0 166 -109.82 gain 166 0 -113.77 gain 0 167 -111.66 gain 167 0 -114.73 gain 0 168 -119.40 gain 168 0 -123.82 gain 0 169 -111.26 gain 169 0 -108.03 gain 0 170 -112.33 gain 170 0 -119.60 gain 0 171 -118.51 gain 171 0 -122.20 gain 0 172 -119.57 gain 172 0 -116.35 gain 0 173 -116.78 gain 173 0 -118.23 gain 0 174 -123.66 gain 174 0 -124.87 gain 0 175 -117.90 gain 175 0 -118.32 gain 0 176 -124.03 gain 176 0 -124.39 gain 0 177 -117.95 gain 177 0 -119.81 gain 0 178 -113.86 gain 178 0 -116.67 gain 0 179 -120.81 gain 179 0 -124.65 gain 0 180 -115.05 gain 180 0 -114.69 gain 0 181 -118.01 gain 181 0 -122.09 gain 0 182 -111.88 gain 182 0 -112.26 gain 0 183 -109.96 gain 183 0 -111.64 gain 0 184 -117.59 gain 184 0 -121.32 gain 0 185 -115.03 gain 185 0 -114.19 gain 0 186 -117.31 gain 186 0 -115.47 gain 0 187 -120.98 gain 187 0 -123.23 gain 0 188 -120.82 gain 188 0 -125.82 gain 0 189 -120.22 gain 189 0 -124.62 gain 0 190 -118.94 gain 190 0 -119.00 gain 0 191 -117.09 gain 191 0 -120.19 gain 0 192 -111.96 gain 192 0 -112.38 gain 0 193 -115.86 gain 193 0 -120.25 gain 0 194 -122.59 gain 194 0 -126.55 gain 0 195 -114.32 gain 195 0 -116.47 gain 0 196 -114.14 gain 196 0 -115.31 gain 0 197 -114.16 gain 197 0 -118.01 gain 0 198 -118.65 gain 198 0 -126.43 gain 0 199 -119.01 gain 199 0 -118.36 gain 0 200 -118.96 gain 200 0 -115.08 gain 0 201 -120.33 gain 201 0 -120.27 gain 0 202 -119.60 gain 202 0 -121.07 gain 0 203 -114.04 gain 203 0 -112.13 gain 0 204 -128.28 gain 204 0 -133.45 gain 0 205 -114.52 gain 205 0 -117.77 gain 0 206 -123.90 gain 206 0 -125.12 gain 0 207 -118.53 gain 207 0 -120.52 gain 0 208 -119.90 gain 208 0 -122.05 gain 0 209 -122.59 gain 209 0 -120.75 gain 0 210 -117.96 gain 210 0 -122.70 gain 0 211 -120.20 gain 211 0 -121.20 gain 0 212 -107.76 gain 212 0 -106.31 gain 0 213 -122.07 gain 213 0 -125.49 gain 0 214 -118.39 gain 214 0 -118.11 gain 0 215 -123.58 gain 215 0 -124.38 gain 0 216 -116.85 gain 216 0 -118.48 gain 0 217 -113.12 gain 217 0 -118.57 gain 0 218 -122.73 gain 218 0 -120.37 gain 0 219 -119.38 gain 219 0 -119.84 gain 0 220 -120.70 gain 220 0 -117.52 gain 0 221 -121.99 gain 221 0 -123.30 gain 0 222 -123.56 gain 222 0 -126.24 gain 0 223 -119.51 gain 223 0 -124.20 gain 0 224 -122.93 gain 224 0 -128.13 gain 1 2 -83.41 gain 2 1 -83.25 gain 1 3 -105.27 gain 3 1 -106.42 gain 1 4 -101.69 gain 4 1 -104.97 gain 1 5 -107.67 gain 5 1 -111.39 gain 1 6 -99.40 gain 6 1 -99.55 gain 1 7 -108.71 gain 7 1 -106.26 gain 1 8 -101.83 gain 8 1 -105.35 gain 1 9 -106.98 gain 9 1 -105.98 gain 1 10 -114.29 gain 10 1 -115.60 gain 1 11 -117.04 gain 11 1 -119.80 gain 1 12 -113.00 gain 12 1 -113.72 gain 1 13 -116.17 gain 13 1 -113.10 gain 1 14 -116.71 gain 14 1 -116.27 gain 1 15 -82.87 gain 15 1 -78.57 gain 1 16 -89.97 gain 16 1 -86.91 gain 1 17 -88.94 gain 17 1 -88.67 gain 1 18 -95.36 gain 18 1 -96.08 gain 1 19 -98.83 gain 19 1 -100.60 gain 1 20 -103.29 gain 20 1 -103.17 gain 1 21 -103.54 gain 21 1 -103.67 gain 1 22 -104.41 gain 22 1 -107.76 gain 1 23 -112.42 gain 23 1 -115.08 gain 1 24 -106.75 gain 24 1 -112.29 gain 1 25 -109.94 gain 25 1 -111.29 gain 1 26 -111.38 gain 26 1 -112.07 gain 1 27 -120.34 gain 27 1 -121.53 gain 1 28 -116.67 gain 28 1 -115.58 gain 1 29 -117.17 gain 29 1 -121.73 gain 1 30 -89.02 gain 30 1 -91.24 gain 1 31 -94.14 gain 31 1 -94.73 gain 1 32 -96.78 gain 32 1 -97.12 gain 1 33 -95.28 gain 33 1 -95.80 gain 1 34 -100.46 gain 34 1 -98.87 gain 1 35 -101.18 gain 35 1 -101.98 gain 1 36 -106.43 gain 36 1 -108.91 gain 1 37 -104.61 gain 37 1 -109.02 gain 1 38 -111.94 gain 38 1 -108.52 gain 1 39 -112.85 gain 39 1 -111.04 gain 1 40 -112.94 gain 40 1 -112.30 gain 1 41 -111.31 gain 41 1 -112.74 gain 1 42 -115.10 gain 42 1 -114.16 gain 1 43 -116.67 gain 43 1 -114.51 gain 1 44 -119.29 gain 44 1 -120.20 gain 1 45 -105.54 gain 45 1 -107.39 gain 1 46 -98.40 gain 46 1 -100.16 gain 1 47 -102.96 gain 47 1 -102.65 gain 1 48 -99.37 gain 48 1 -102.94 gain 1 49 -102.44 gain 49 1 -104.85 gain 1 50 -106.55 gain 50 1 -105.32 gain 1 51 -111.93 gain 51 1 -109.19 gain 1 52 -114.42 gain 52 1 -118.95 gain 1 53 -113.63 gain 53 1 -112.67 gain 1 54 -116.45 gain 54 1 -119.07 gain 1 55 -111.19 gain 55 1 -108.95 gain 1 56 -118.16 gain 56 1 -120.82 gain 1 57 -117.29 gain 57 1 -116.75 gain 1 58 -114.85 gain 58 1 -116.01 gain 1 59 -116.56 gain 59 1 -120.16 gain 1 60 -104.87 gain 60 1 -105.75 gain 1 61 -112.28 gain 61 1 -114.60 gain 1 62 -108.13 gain 62 1 -110.01 gain 1 63 -112.32 gain 63 1 -115.43 gain 1 64 -108.14 gain 64 1 -106.04 gain 1 65 -110.23 gain 65 1 -106.73 gain 1 66 -108.33 gain 66 1 -107.90 gain 1 67 -114.51 gain 67 1 -112.96 gain 1 68 -118.15 gain 68 1 -123.89 gain 1 69 -112.69 gain 69 1 -112.16 gain 1 70 -112.54 gain 70 1 -113.52 gain 1 71 -115.11 gain 71 1 -115.97 gain 1 72 -116.64 gain 72 1 -115.47 gain 1 73 -114.73 gain 73 1 -114.40 gain 1 74 -126.53 gain 74 1 -128.49 gain 1 75 -100.50 gain 75 1 -100.14 gain 1 76 -105.08 gain 76 1 -105.73 gain 1 77 -97.84 gain 77 1 -101.45 gain 1 78 -100.30 gain 78 1 -100.83 gain 1 79 -104.82 gain 79 1 -103.28 gain 1 80 -109.68 gain 80 1 -109.65 gain 1 81 -111.49 gain 81 1 -109.43 gain 1 82 -107.77 gain 82 1 -108.56 gain 1 83 -112.20 gain 83 1 -112.78 gain 1 84 -117.61 gain 84 1 -115.99 gain 1 85 -111.93 gain 85 1 -108.58 gain 1 86 -118.16 gain 86 1 -123.20 gain 1 87 -110.84 gain 87 1 -111.53 gain 1 88 -123.61 gain 88 1 -124.85 gain 1 89 -116.21 gain 89 1 -117.71 gain 1 90 -109.80 gain 90 1 -112.67 gain 1 91 -103.02 gain 91 1 -105.17 gain 1 92 -104.79 gain 92 1 -107.51 gain 1 93 -111.16 gain 93 1 -115.41 gain 1 94 -108.61 gain 94 1 -107.77 gain 1 95 -109.18 gain 95 1 -111.58 gain 1 96 -115.65 gain 96 1 -113.50 gain 1 97 -101.68 gain 97 1 -102.94 gain 1 98 -116.96 gain 98 1 -116.98 gain 1 99 -120.57 gain 99 1 -124.22 gain 1 100 -109.96 gain 100 1 -115.32 gain 1 101 -120.02 gain 101 1 -121.31 gain 1 102 -116.82 gain 102 1 -118.24 gain 1 103 -119.48 gain 103 1 -120.73 gain 1 104 -117.58 gain 104 1 -114.66 gain 1 105 -109.17 gain 105 1 -111.57 gain 1 106 -111.60 gain 106 1 -112.72 gain 1 107 -102.97 gain 107 1 -104.39 gain 1 108 -118.73 gain 108 1 -119.81 gain 1 109 -116.32 gain 109 1 -119.25 gain 1 110 -112.67 gain 110 1 -112.67 gain 1 111 -108.36 gain 111 1 -111.02 gain 1 112 -113.49 gain 112 1 -115.90 gain 1 113 -118.23 gain 113 1 -122.33 gain 1 114 -106.57 gain 114 1 -107.57 gain 1 115 -106.43 gain 115 1 -102.36 gain 1 116 -112.35 gain 116 1 -114.02 gain 1 117 -123.18 gain 117 1 -127.65 gain 1 118 -124.30 gain 118 1 -126.14 gain 1 119 -117.25 gain 119 1 -118.57 gain 1 120 -110.20 gain 120 1 -107.06 gain 1 121 -115.21 gain 121 1 -114.85 gain 1 122 -111.66 gain 122 1 -113.81 gain 1 123 -113.36 gain 123 1 -113.02 gain 1 124 -118.62 gain 124 1 -118.28 gain 1 125 -106.18 gain 125 1 -107.45 gain 1 126 -119.23 gain 126 1 -116.81 gain 1 127 -110.76 gain 127 1 -109.91 gain 1 128 -117.77 gain 128 1 -118.79 gain 1 129 -114.52 gain 129 1 -112.95 gain 1 130 -116.74 gain 130 1 -117.85 gain 1 131 -116.16 gain 131 1 -115.13 gain 1 132 -117.53 gain 132 1 -119.13 gain 1 133 -122.73 gain 133 1 -122.43 gain 1 134 -128.32 gain 134 1 -127.81 gain 1 135 -116.27 gain 135 1 -117.48 gain 1 136 -114.08 gain 136 1 -116.58 gain 1 137 -113.39 gain 137 1 -113.66 gain 1 138 -106.60 gain 138 1 -103.11 gain 1 139 -112.35 gain 139 1 -110.77 gain 1 140 -112.66 gain 140 1 -117.13 gain 1 141 -112.86 gain 141 1 -112.22 gain 1 142 -114.04 gain 142 1 -118.21 gain 1 143 -116.82 gain 143 1 -116.53 gain 1 144 -118.72 gain 144 1 -119.34 gain 1 145 -115.57 gain 145 1 -115.78 gain 1 146 -114.32 gain 146 1 -112.09 gain 1 147 -119.46 gain 147 1 -121.07 gain 1 148 -117.31 gain 148 1 -117.85 gain 1 149 -120.55 gain 149 1 -120.34 gain 1 150 -115.60 gain 150 1 -120.51 gain 1 151 -114.96 gain 151 1 -113.43 gain 1 152 -109.16 gain 152 1 -109.45 gain 1 153 -115.18 gain 153 1 -117.90 gain 1 154 -119.52 gain 154 1 -117.86 gain 1 155 -123.68 gain 155 1 -125.85 gain 1 156 -113.40 gain 156 1 -113.59 gain 1 157 -113.21 gain 157 1 -115.35 gain 1 158 -117.04 gain 158 1 -119.62 gain 1 159 -112.70 gain 159 1 -108.91 gain 1 160 -121.24 gain 160 1 -119.73 gain 1 161 -125.26 gain 161 1 -126.61 gain 1 162 -124.57 gain 162 1 -123.00 gain 1 163 -125.22 gain 163 1 -120.83 gain 1 164 -117.51 gain 164 1 -114.88 gain 1 165 -113.10 gain 165 1 -113.39 gain 1 166 -112.24 gain 166 1 -115.21 gain 1 167 -118.43 gain 167 1 -120.52 gain 1 168 -109.72 gain 168 1 -113.16 gain 1 169 -110.89 gain 169 1 -106.68 gain 1 170 -113.54 gain 170 1 -119.82 gain 1 171 -115.88 gain 171 1 -118.58 gain 1 172 -117.50 gain 172 1 -113.30 gain 1 173 -115.43 gain 173 1 -115.89 gain 1 174 -115.83 gain 174 1 -116.05 gain 1 175 -116.31 gain 175 1 -115.74 gain 1 176 -118.79 gain 176 1 -118.18 gain 1 177 -113.56 gain 177 1 -114.43 gain 1 178 -113.01 gain 178 1 -114.84 gain 1 179 -116.71 gain 179 1 -119.56 gain 1 180 -119.07 gain 180 1 -117.72 gain 1 181 -116.21 gain 181 1 -119.30 gain 1 182 -123.54 gain 182 1 -122.93 gain 1 183 -117.42 gain 183 1 -118.12 gain 1 184 -120.38 gain 184 1 -123.13 gain 1 185 -120.58 gain 185 1 -118.75 gain 1 186 -123.03 gain 186 1 -120.20 gain 1 187 -120.37 gain 187 1 -121.62 gain 1 188 -116.08 gain 188 1 -120.10 gain 1 189 -114.80 gain 189 1 -118.21 gain 1 190 -122.58 gain 190 1 -121.66 gain 1 191 -122.83 gain 191 1 -124.94 gain 1 192 -125.04 gain 192 1 -124.47 gain 1 193 -122.73 gain 193 1 -126.14 gain 1 194 -123.88 gain 194 1 -126.85 gain 1 195 -120.32 gain 195 1 -121.48 gain 1 196 -112.14 gain 196 1 -112.33 gain 1 197 -126.64 gain 197 1 -129.51 gain 1 198 -120.47 gain 198 1 -127.27 gain 1 199 -123.70 gain 199 1 -122.06 gain 1 200 -122.99 gain 200 1 -118.12 gain 1 201 -122.03 gain 201 1 -120.98 gain 1 202 -117.19 gain 202 1 -117.67 gain 1 203 -118.84 gain 203 1 -115.95 gain 1 204 -120.76 gain 204 1 -124.95 gain 1 205 -120.58 gain 205 1 -122.84 gain 1 206 -125.44 gain 206 1 -125.68 gain 1 207 -114.63 gain 207 1 -115.63 gain 1 208 -124.36 gain 208 1 -125.53 gain 1 209 -123.96 gain 209 1 -121.13 gain 1 210 -118.78 gain 210 1 -122.53 gain 1 211 -120.73 gain 211 1 -120.75 gain 1 212 -118.34 gain 212 1 -115.90 gain 1 213 -121.62 gain 213 1 -124.05 gain 1 214 -115.64 gain 214 1 -114.37 gain 1 215 -123.88 gain 215 1 -123.70 gain 1 216 -112.96 gain 216 1 -113.60 gain 1 217 -120.66 gain 217 1 -125.13 gain 1 218 -117.43 gain 218 1 -114.09 gain 1 219 -119.38 gain 219 1 -118.85 gain 1 220 -126.71 gain 220 1 -122.53 gain 1 221 -122.20 gain 221 1 -122.53 gain 1 222 -119.64 gain 222 1 -121.34 gain 1 223 -126.44 gain 223 1 -130.15 gain 1 224 -122.87 gain 224 1 -127.08 gain 2 3 -81.26 gain 3 2 -82.57 gain 2 4 -93.97 gain 4 2 -97.42 gain 2 5 -96.29 gain 5 2 -100.17 gain 2 6 -101.64 gain 6 2 -101.95 gain 2 7 -106.30 gain 7 2 -104.01 gain 2 8 -116.72 gain 8 2 -120.40 gain 2 9 -112.01 gain 9 2 -111.18 gain 2 10 -108.59 gain 10 2 -110.06 gain 2 11 -106.56 gain 11 2 -109.47 gain 2 12 -112.54 gain 12 2 -113.43 gain 2 13 -114.52 gain 13 2 -111.62 gain 2 14 -118.21 gain 14 2 -117.94 gain 2 15 -89.89 gain 15 2 -85.76 gain 2 16 -86.52 gain 16 2 -83.63 gain 2 17 -79.49 gain 17 2 -79.38 gain 2 18 -81.97 gain 18 2 -82.85 gain 2 19 -89.63 gain 19 2 -91.56 gain 2 20 -99.56 gain 20 2 -99.61 gain 2 21 -107.24 gain 21 2 -107.53 gain 2 22 -102.89 gain 22 2 -106.41 gain 2 23 -114.88 gain 23 2 -117.71 gain 2 24 -108.38 gain 24 2 -114.08 gain 2 25 -108.42 gain 25 2 -109.94 gain 2 26 -110.96 gain 26 2 -111.82 gain 2 27 -114.51 gain 27 2 -115.87 gain 2 28 -113.63 gain 28 2 -112.70 gain 2 29 -114.90 gain 29 2 -119.62 gain 2 30 -100.36 gain 30 2 -102.75 gain 2 31 -92.38 gain 31 2 -93.14 gain 2 32 -93.39 gain 32 2 -93.90 gain 2 33 -92.63 gain 33 2 -93.32 gain 2 34 -105.51 gain 34 2 -104.08 gain 2 35 -101.78 gain 35 2 -102.74 gain 2 36 -99.57 gain 36 2 -102.21 gain 2 37 -107.57 gain 37 2 -112.15 gain 2 38 -111.49 gain 38 2 -108.24 gain 2 39 -104.68 gain 39 2 -103.03 gain 2 40 -107.97 gain 40 2 -107.49 gain 2 41 -110.80 gain 41 2 -112.40 gain 2 42 -114.90 gain 42 2 -114.13 gain 2 43 -115.51 gain 43 2 -113.51 gain 2 44 -112.94 gain 44 2 -114.02 gain 2 45 -95.15 gain 45 2 -97.15 gain 2 46 -101.85 gain 46 2 -103.77 gain 2 47 -94.35 gain 47 2 -94.21 gain 2 48 -106.18 gain 48 2 -109.90 gain 2 49 -98.72 gain 49 2 -101.30 gain 2 50 -103.31 gain 50 2 -102.24 gain 2 51 -98.75 gain 51 2 -96.16 gain 2 52 -108.67 gain 52 2 -113.36 gain 2 53 -98.99 gain 53 2 -98.19 gain 2 54 -108.12 gain 54 2 -110.90 gain 2 55 -113.77 gain 55 2 -111.70 gain 2 56 -117.00 gain 56 2 -119.83 gain 2 57 -119.53 gain 57 2 -119.15 gain 2 58 -117.68 gain 58 2 -119.00 gain 2 59 -111.47 gain 59 2 -115.23 gain 2 60 -106.95 gain 60 2 -108.00 gain 2 61 -103.10 gain 61 2 -105.58 gain 2 62 -105.20 gain 62 2 -107.24 gain 2 63 -98.03 gain 63 2 -101.31 gain 2 64 -106.12 gain 64 2 -104.19 gain 2 65 -102.73 gain 65 2 -99.39 gain 2 66 -105.79 gain 66 2 -105.52 gain 2 67 -105.37 gain 67 2 -103.98 gain 2 68 -108.43 gain 68 2 -114.33 gain 2 69 -111.32 gain 69 2 -110.95 gain 2 70 -109.08 gain 70 2 -110.23 gain 2 71 -113.73 gain 71 2 -114.75 gain 2 72 -115.71 gain 72 2 -114.70 gain 2 73 -120.16 gain 73 2 -119.99 gain 2 74 -121.21 gain 74 2 -123.33 gain 2 75 -100.86 gain 75 2 -100.66 gain 2 76 -107.47 gain 76 2 -108.29 gain 2 77 -106.75 gain 77 2 -110.53 gain 2 78 -103.96 gain 78 2 -104.65 gain 2 79 -107.92 gain 79 2 -106.54 gain 2 80 -103.35 gain 80 2 -103.49 gain 2 81 -106.14 gain 81 2 -104.24 gain 2 82 -108.34 gain 82 2 -109.30 gain 2 83 -112.74 gain 83 2 -113.48 gain 2 84 -114.61 gain 84 2 -113.15 gain 2 85 -111.49 gain 85 2 -108.31 gain 2 86 -113.77 gain 86 2 -118.97 gain 2 87 -115.52 gain 87 2 -116.38 gain 2 88 -121.38 gain 88 2 -122.78 gain 2 89 -121.48 gain 89 2 -123.14 gain 2 90 -107.81 gain 90 2 -110.84 gain 2 91 -101.45 gain 91 2 -103.76 gain 2 92 -107.07 gain 92 2 -109.95 gain 2 93 -112.79 gain 93 2 -117.21 gain 2 94 -106.31 gain 94 2 -105.63 gain 2 95 -114.26 gain 95 2 -116.82 gain 2 96 -111.53 gain 96 2 -109.55 gain 2 97 -112.56 gain 97 2 -113.99 gain 2 98 -115.03 gain 98 2 -115.21 gain 2 99 -112.00 gain 99 2 -115.81 gain 2 100 -116.29 gain 100 2 -121.81 gain 2 101 -106.94 gain 101 2 -108.39 gain 2 102 -110.45 gain 102 2 -112.03 gain 2 103 -118.92 gain 103 2 -120.34 gain 2 104 -110.40 gain 104 2 -107.64 gain 2 105 -113.77 gain 105 2 -116.33 gain 2 106 -105.35 gain 106 2 -106.63 gain 2 107 -110.85 gain 107 2 -112.43 gain 2 108 -116.68 gain 108 2 -117.92 gain 2 109 -109.07 gain 109 2 -112.16 gain 2 110 -113.44 gain 110 2 -113.60 gain 2 111 -108.55 gain 111 2 -111.37 gain 2 112 -124.08 gain 112 2 -126.65 gain 2 113 -113.20 gain 113 2 -117.47 gain 2 114 -117.21 gain 114 2 -118.38 gain 2 115 -117.84 gain 115 2 -113.93 gain 2 116 -112.42 gain 116 2 -114.25 gain 2 117 -110.08 gain 117 2 -114.71 gain 2 118 -119.13 gain 118 2 -121.14 gain 2 119 -119.91 gain 119 2 -121.39 gain 2 120 -111.84 gain 120 2 -108.87 gain 2 121 -110.02 gain 121 2 -109.82 gain 2 122 -113.00 gain 122 2 -115.31 gain 2 123 -115.02 gain 123 2 -114.85 gain 2 124 -110.42 gain 124 2 -110.24 gain 2 125 -111.67 gain 125 2 -113.10 gain 2 126 -120.64 gain 126 2 -118.39 gain 2 127 -110.71 gain 127 2 -110.02 gain 2 128 -118.65 gain 128 2 -119.83 gain 2 129 -112.10 gain 129 2 -110.69 gain 2 130 -118.85 gain 130 2 -120.12 gain 2 131 -112.39 gain 131 2 -111.53 gain 2 132 -117.74 gain 132 2 -119.50 gain 2 133 -123.99 gain 133 2 -123.85 gain 2 134 -121.88 gain 134 2 -121.55 gain 2 135 -109.18 gain 135 2 -110.55 gain 2 136 -113.28 gain 136 2 -115.94 gain 2 137 -114.43 gain 137 2 -114.87 gain 2 138 -114.50 gain 138 2 -111.18 gain 2 139 -102.51 gain 139 2 -101.08 gain 2 140 -116.72 gain 140 2 -121.36 gain 2 141 -121.45 gain 141 2 -120.97 gain 2 142 -120.94 gain 142 2 -125.27 gain 2 143 -111.35 gain 143 2 -111.22 gain 2 144 -119.23 gain 144 2 -120.01 gain 2 145 -115.27 gain 145 2 -115.64 gain 2 146 -117.23 gain 146 2 -115.15 gain 2 147 -114.32 gain 147 2 -116.09 gain 2 148 -123.69 gain 148 2 -124.40 gain 2 149 -117.32 gain 149 2 -117.27 gain 2 150 -113.20 gain 150 2 -118.27 gain 2 151 -113.85 gain 151 2 -112.48 gain 2 152 -116.64 gain 152 2 -117.10 gain 2 153 -112.35 gain 153 2 -115.24 gain 2 154 -106.75 gain 154 2 -105.25 gain 2 155 -111.16 gain 155 2 -113.50 gain 2 156 -116.14 gain 156 2 -116.49 gain 2 157 -119.73 gain 157 2 -122.04 gain 2 158 -120.48 gain 158 2 -123.23 gain 2 159 -111.27 gain 159 2 -107.65 gain 2 160 -113.75 gain 160 2 -112.40 gain 2 161 -117.30 gain 161 2 -118.81 gain 2 162 -118.59 gain 162 2 -117.18 gain 2 163 -123.87 gain 163 2 -119.65 gain 2 164 -124.03 gain 164 2 -121.56 gain 2 165 -119.68 gain 165 2 -120.13 gain 2 166 -114.71 gain 166 2 -117.84 gain 2 167 -118.21 gain 167 2 -120.46 gain 2 168 -124.43 gain 168 2 -128.03 gain 2 169 -118.77 gain 169 2 -114.72 gain 2 170 -119.64 gain 170 2 -126.08 gain 2 171 -116.14 gain 171 2 -119.01 gain 2 172 -116.06 gain 172 2 -112.03 gain 2 173 -113.32 gain 173 2 -113.94 gain 2 174 -115.96 gain 174 2 -116.35 gain 2 175 -115.57 gain 175 2 -115.16 gain 2 176 -115.65 gain 176 2 -115.20 gain 2 177 -117.67 gain 177 2 -118.71 gain 2 178 -127.17 gain 178 2 -129.16 gain 2 179 -114.06 gain 179 2 -117.07 gain 2 180 -115.88 gain 180 2 -114.69 gain 2 181 -117.06 gain 181 2 -120.31 gain 2 182 -114.06 gain 182 2 -113.62 gain 2 183 -118.19 gain 183 2 -119.04 gain 2 184 -109.17 gain 184 2 -112.08 gain 2 185 -117.71 gain 185 2 -116.04 gain 2 186 -121.16 gain 186 2 -118.49 gain 2 187 -115.36 gain 187 2 -116.78 gain 2 188 -116.23 gain 188 2 -120.41 gain 2 189 -117.36 gain 189 2 -120.94 gain 2 190 -122.01 gain 190 2 -121.25 gain 2 191 -116.59 gain 191 2 -118.87 gain 2 192 -121.56 gain 192 2 -121.16 gain 2 193 -120.48 gain 193 2 -124.05 gain 2 194 -118.08 gain 194 2 -121.23 gain 2 195 -119.56 gain 195 2 -120.90 gain 2 196 -108.42 gain 196 2 -108.78 gain 2 197 -115.84 gain 197 2 -118.87 gain 2 198 -118.41 gain 198 2 -125.37 gain 2 199 -121.47 gain 199 2 -120.00 gain 2 200 -122.31 gain 200 2 -117.61 gain 2 201 -119.17 gain 201 2 -118.29 gain 2 202 -116.10 gain 202 2 -116.74 gain 2 203 -122.43 gain 203 2 -119.71 gain 2 204 -121.92 gain 204 2 -126.27 gain 2 205 -120.27 gain 205 2 -122.69 gain 2 206 -116.45 gain 206 2 -116.84 gain 2 207 -114.45 gain 207 2 -115.60 gain 2 208 -120.38 gain 208 2 -121.71 gain 2 209 -124.83 gain 209 2 -122.16 gain 2 210 -118.88 gain 210 2 -122.80 gain 2 211 -115.81 gain 211 2 -115.99 gain 2 212 -111.64 gain 212 2 -109.37 gain 2 213 -114.86 gain 213 2 -117.46 gain 2 214 -116.69 gain 214 2 -115.59 gain 2 215 -115.85 gain 215 2 -115.84 gain 2 216 -116.30 gain 216 2 -117.11 gain 2 217 -117.91 gain 217 2 -122.54 gain 2 218 -128.14 gain 218 2 -124.96 gain 2 219 -123.10 gain 219 2 -122.74 gain 2 220 -121.22 gain 220 2 -117.21 gain 2 221 -118.22 gain 221 2 -118.71 gain 2 222 -119.56 gain 222 2 -121.42 gain 2 223 -123.29 gain 223 2 -127.16 gain 2 224 -120.08 gain 224 2 -124.46 gain 3 4 -82.74 gain 4 3 -84.88 gain 3 5 -86.66 gain 5 3 -89.23 gain 3 6 -96.76 gain 6 3 -95.76 gain 3 7 -102.22 gain 7 3 -98.62 gain 3 8 -110.61 gain 8 3 -112.98 gain 3 9 -112.38 gain 9 3 -110.23 gain 3 10 -105.19 gain 10 3 -105.35 gain 3 11 -118.75 gain 11 3 -120.35 gain 3 12 -116.70 gain 12 3 -116.27 gain 3 13 -117.08 gain 13 3 -112.87 gain 3 14 -116.99 gain 14 3 -115.40 gain 3 15 -104.98 gain 15 3 -99.53 gain 3 16 -97.25 gain 16 3 -93.05 gain 3 17 -90.47 gain 17 3 -89.06 gain 3 18 -84.67 gain 18 3 -84.24 gain 3 19 -89.25 gain 19 3 -89.87 gain 3 20 -96.88 gain 20 3 -95.61 gain 3 21 -104.53 gain 21 3 -103.51 gain 3 22 -101.28 gain 22 3 -103.48 gain 3 23 -107.05 gain 23 3 -108.57 gain 3 24 -103.34 gain 24 3 -107.73 gain 3 25 -114.16 gain 25 3 -114.37 gain 3 26 -104.61 gain 26 3 -104.17 gain 3 27 -120.87 gain 27 3 -120.92 gain 3 28 -113.17 gain 28 3 -110.93 gain 3 29 -120.19 gain 29 3 -123.61 gain 3 30 -106.51 gain 30 3 -107.59 gain 3 31 -99.72 gain 31 3 -99.17 gain 3 32 -91.22 gain 32 3 -90.42 gain 3 33 -94.35 gain 33 3 -93.72 gain 3 34 -98.89 gain 34 3 -96.15 gain 3 35 -101.49 gain 35 3 -101.15 gain 3 36 -98.13 gain 36 3 -99.47 gain 3 37 -103.18 gain 37 3 -106.45 gain 3 38 -113.22 gain 38 3 -108.66 gain 3 39 -109.02 gain 39 3 -106.05 gain 3 40 -116.17 gain 40 3 -114.38 gain 3 41 -114.17 gain 41 3 -114.46 gain 3 42 -114.69 gain 42 3 -112.61 gain 3 43 -117.82 gain 43 3 -114.51 gain 3 44 -113.62 gain 44 3 -113.38 gain 3 45 -115.03 gain 45 3 -115.73 gain 3 46 -100.08 gain 46 3 -100.69 gain 3 47 -100.98 gain 47 3 -99.53 gain 3 48 -97.28 gain 48 3 -99.70 gain 3 49 -95.43 gain 49 3 -96.70 gain 3 50 -101.57 gain 50 3 -99.20 gain 3 51 -106.19 gain 51 3 -102.30 gain 3 52 -103.31 gain 52 3 -106.69 gain 3 53 -108.99 gain 53 3 -106.88 gain 3 54 -114.38 gain 54 3 -115.85 gain 3 55 -111.52 gain 55 3 -108.14 gain 3 56 -114.79 gain 56 3 -116.31 gain 3 57 -113.46 gain 57 3 -111.77 gain 3 58 -118.01 gain 58 3 -118.02 gain 3 59 -118.55 gain 59 3 -121.00 gain 3 60 -105.85 gain 60 3 -105.58 gain 3 61 -109.18 gain 61 3 -110.35 gain 3 62 -104.76 gain 62 3 -105.49 gain 3 63 -99.05 gain 63 3 -101.01 gain 3 64 -105.13 gain 64 3 -101.89 gain 3 65 -101.53 gain 65 3 -96.88 gain 3 66 -111.70 gain 66 3 -110.12 gain 3 67 -110.08 gain 67 3 -107.38 gain 3 68 -107.68 gain 68 3 -112.28 gain 3 69 -109.71 gain 69 3 -108.03 gain 3 70 -114.84 gain 70 3 -114.68 gain 3 71 -122.52 gain 71 3 -122.23 gain 3 72 -112.83 gain 72 3 -110.52 gain 3 73 -117.25 gain 73 3 -115.77 gain 3 74 -115.99 gain 74 3 -116.80 gain 3 75 -107.10 gain 75 3 -105.59 gain 3 76 -107.47 gain 76 3 -106.97 gain 3 77 -111.31 gain 77 3 -113.78 gain 3 78 -108.15 gain 78 3 -107.53 gain 3 79 -101.75 gain 79 3 -99.06 gain 3 80 -113.41 gain 80 3 -112.24 gain 3 81 -105.79 gain 81 3 -102.58 gain 3 82 -109.92 gain 82 3 -109.56 gain 3 83 -114.72 gain 83 3 -114.15 gain 3 84 -113.41 gain 84 3 -110.64 gain 3 85 -111.17 gain 85 3 -106.68 gain 3 86 -116.61 gain 86 3 -120.51 gain 3 87 -117.93 gain 87 3 -117.48 gain 3 88 -125.84 gain 88 3 -125.93 gain 3 89 -122.47 gain 89 3 -122.81 gain 3 90 -112.52 gain 90 3 -114.24 gain 3 91 -111.06 gain 91 3 -112.07 gain 3 92 -104.12 gain 92 3 -105.69 gain 3 93 -122.36 gain 93 3 -125.47 gain 3 94 -112.01 gain 94 3 -110.02 gain 3 95 -108.66 gain 95 3 -109.90 gain 3 96 -111.76 gain 96 3 -108.47 gain 3 97 -110.30 gain 97 3 -110.42 gain 3 98 -115.94 gain 98 3 -114.80 gain 3 99 -114.57 gain 99 3 -117.07 gain 3 100 -113.39 gain 100 3 -117.61 gain 3 101 -118.64 gain 101 3 -118.78 gain 3 102 -122.97 gain 102 3 -123.24 gain 3 103 -116.55 gain 103 3 -116.66 gain 3 104 -122.48 gain 104 3 -118.40 gain 3 105 -104.83 gain 105 3 -106.08 gain 3 106 -111.83 gain 106 3 -111.80 gain 3 107 -103.96 gain 107 3 -104.23 gain 3 108 -115.32 gain 108 3 -115.25 gain 3 109 -113.63 gain 109 3 -115.41 gain 3 110 -111.21 gain 110 3 -110.06 gain 3 111 -106.63 gain 111 3 -108.14 gain 3 112 -112.88 gain 112 3 -114.14 gain 3 113 -113.75 gain 113 3 -116.71 gain 3 114 -110.86 gain 114 3 -110.72 gain 3 115 -116.95 gain 115 3 -111.73 gain 3 116 -110.20 gain 116 3 -110.72 gain 3 117 -118.98 gain 117 3 -122.30 gain 3 118 -118.62 gain 118 3 -119.32 gain 3 119 -126.62 gain 119 3 -126.80 gain 3 120 -121.30 gain 120 3 -117.02 gain 3 121 -114.23 gain 121 3 -112.72 gain 3 122 -113.19 gain 122 3 -114.20 gain 3 123 -106.48 gain 123 3 -104.99 gain 3 124 -109.73 gain 124 3 -108.24 gain 3 125 -121.51 gain 125 3 -121.63 gain 3 126 -110.31 gain 126 3 -106.75 gain 3 127 -114.12 gain 127 3 -112.13 gain 3 128 -117.03 gain 128 3 -116.90 gain 3 129 -110.83 gain 129 3 -108.11 gain 3 130 -116.76 gain 130 3 -116.72 gain 3 131 -118.60 gain 131 3 -116.43 gain 3 132 -116.51 gain 132 3 -116.95 gain 3 133 -117.86 gain 133 3 -116.41 gain 3 134 -120.92 gain 134 3 -119.27 gain 3 135 -115.06 gain 135 3 -115.12 gain 3 136 -111.67 gain 136 3 -113.02 gain 3 137 -109.89 gain 137 3 -109.02 gain 3 138 -116.56 gain 138 3 -111.92 gain 3 139 -111.75 gain 139 3 -109.01 gain 3 140 -114.27 gain 140 3 -117.59 gain 3 141 -114.53 gain 141 3 -112.73 gain 3 142 -118.49 gain 142 3 -121.51 gain 3 143 -120.04 gain 143 3 -118.60 gain 3 144 -116.14 gain 144 3 -115.61 gain 3 145 -114.47 gain 145 3 -113.54 gain 3 146 -116.07 gain 146 3 -112.69 gain 3 147 -110.12 gain 147 3 -110.58 gain 3 148 -115.67 gain 148 3 -115.07 gain 3 149 -106.94 gain 149 3 -105.59 gain 3 150 -111.22 gain 150 3 -114.98 gain 3 151 -120.71 gain 151 3 -118.03 gain 3 152 -115.15 gain 152 3 -114.30 gain 3 153 -107.67 gain 153 3 -109.25 gain 3 154 -114.53 gain 154 3 -111.72 gain 3 155 -112.89 gain 155 3 -113.91 gain 3 156 -119.60 gain 156 3 -118.64 gain 3 157 -111.11 gain 157 3 -112.11 gain 3 158 -116.32 gain 158 3 -117.76 gain 3 159 -122.14 gain 159 3 -117.21 gain 3 160 -116.84 gain 160 3 -114.18 gain 3 161 -122.83 gain 161 3 -123.03 gain 3 162 -117.30 gain 162 3 -114.59 gain 3 163 -117.45 gain 163 3 -111.92 gain 3 164 -122.59 gain 164 3 -118.81 gain 3 165 -118.33 gain 165 3 -117.48 gain 3 166 -115.48 gain 166 3 -117.30 gain 3 167 -121.58 gain 167 3 -122.53 gain 3 168 -114.56 gain 168 3 -116.85 gain 3 169 -119.08 gain 169 3 -113.72 gain 3 170 -115.97 gain 170 3 -121.10 gain 3 171 -112.12 gain 171 3 -113.68 gain 3 172 -128.63 gain 172 3 -123.29 gain 3 173 -119.31 gain 173 3 -118.62 gain 3 174 -125.30 gain 174 3 -124.37 gain 3 175 -120.30 gain 175 3 -118.58 gain 3 176 -118.29 gain 176 3 -116.52 gain 3 177 -118.44 gain 177 3 -118.16 gain 3 178 -113.88 gain 178 3 -114.56 gain 3 179 -126.29 gain 179 3 -128.00 gain 3 180 -120.21 gain 180 3 -117.71 gain 3 181 -125.01 gain 181 3 -126.96 gain 3 182 -121.29 gain 182 3 -119.54 gain 3 183 -117.78 gain 183 3 -117.33 gain 3 184 -115.41 gain 184 3 -117.00 gain 3 185 -118.93 gain 185 3 -115.96 gain 3 186 -122.56 gain 186 3 -118.58 gain 3 187 -117.61 gain 187 3 -117.72 gain 3 188 -116.60 gain 188 3 -119.47 gain 3 189 -124.15 gain 189 3 -126.41 gain 3 190 -115.98 gain 190 3 -113.91 gain 3 191 -119.57 gain 191 3 -120.54 gain 3 192 -123.79 gain 192 3 -122.08 gain 3 193 -121.56 gain 193 3 -123.82 gain 3 194 -122.76 gain 194 3 -124.60 gain 3 195 -124.58 gain 195 3 -124.60 gain 3 196 -117.63 gain 196 3 -116.68 gain 3 197 -120.10 gain 197 3 -121.82 gain 3 198 -123.32 gain 198 3 -128.97 gain 3 199 -116.69 gain 199 3 -113.91 gain 3 200 -121.23 gain 200 3 -115.21 gain 3 201 -116.25 gain 201 3 -114.06 gain 3 202 -122.10 gain 202 3 -121.43 gain 3 203 -116.34 gain 203 3 -112.30 gain 3 204 -115.56 gain 204 3 -118.60 gain 3 205 -119.48 gain 205 3 -120.59 gain 3 206 -123.47 gain 206 3 -122.56 gain 3 207 -125.41 gain 207 3 -125.26 gain 3 208 -119.95 gain 208 3 -119.97 gain 3 209 -124.93 gain 209 3 -120.96 gain 3 210 -119.97 gain 210 3 -122.58 gain 3 211 -122.43 gain 211 3 -121.30 gain 3 212 -116.93 gain 212 3 -113.34 gain 3 213 -123.70 gain 213 3 -124.98 gain 3 214 -121.42 gain 214 3 -119.00 gain 3 215 -118.59 gain 215 3 -117.26 gain 3 216 -117.75 gain 216 3 -117.25 gain 3 217 -125.32 gain 217 3 -128.64 gain 3 218 -118.94 gain 218 3 -114.45 gain 3 219 -120.09 gain 219 3 -118.42 gain 3 220 -121.30 gain 220 3 -115.97 gain 3 221 -119.46 gain 221 3 -118.65 gain 3 222 -118.67 gain 222 3 -119.23 gain 3 223 -123.09 gain 223 3 -125.65 gain 3 224 -128.21 gain 224 3 -131.27 gain 4 5 -82.15 gain 5 4 -82.59 gain 4 6 -99.65 gain 6 4 -96.52 gain 4 7 -103.75 gain 7 4 -98.01 gain 4 8 -107.05 gain 8 4 -107.28 gain 4 9 -98.92 gain 9 4 -94.64 gain 4 10 -119.93 gain 10 4 -117.96 gain 4 11 -117.70 gain 11 4 -117.17 gain 4 12 -120.21 gain 12 4 -117.65 gain 4 13 -117.40 gain 13 4 -111.05 gain 4 14 -115.88 gain 14 4 -112.16 gain 4 15 -105.08 gain 15 4 -97.50 gain 4 16 -103.05 gain 16 4 -96.71 gain 4 17 -95.31 gain 17 4 -91.76 gain 4 18 -93.32 gain 18 4 -90.76 gain 4 19 -87.00 gain 19 4 -85.48 gain 4 20 -95.48 gain 20 4 -92.08 gain 4 21 -104.86 gain 21 4 -101.71 gain 4 22 -101.13 gain 22 4 -101.20 gain 4 23 -102.74 gain 23 4 -102.12 gain 4 24 -106.08 gain 24 4 -108.34 gain 4 25 -106.02 gain 25 4 -104.09 gain 4 26 -106.67 gain 26 4 -104.09 gain 4 27 -125.15 gain 27 4 -123.07 gain 4 28 -109.77 gain 28 4 -105.40 gain 4 29 -115.27 gain 29 4 -116.55 gain 4 30 -106.86 gain 30 4 -105.80 gain 4 31 -108.67 gain 31 4 -105.98 gain 4 32 -95.81 gain 32 4 -92.88 gain 4 33 -101.74 gain 33 4 -98.99 gain 4 34 -97.53 gain 34 4 -92.65 gain 4 35 -97.40 gain 35 4 -94.92 gain 4 36 -104.48 gain 36 4 -103.68 gain 4 37 -100.98 gain 37 4 -102.11 gain 4 38 -104.72 gain 38 4 -98.02 gain 4 39 -114.97 gain 39 4 -109.87 gain 4 40 -110.28 gain 40 4 -106.36 gain 4 41 -116.13 gain 41 4 -114.28 gain 4 42 -119.53 gain 42 4 -115.31 gain 4 43 -121.08 gain 43 4 -115.63 gain 4 44 -117.41 gain 44 4 -115.04 gain 4 45 -105.71 gain 45 4 -104.28 gain 4 46 -106.00 gain 46 4 -104.48 gain 4 47 -102.35 gain 47 4 -98.76 gain 4 48 -104.17 gain 48 4 -104.45 gain 4 49 -105.37 gain 49 4 -104.50 gain 4 50 -104.65 gain 50 4 -100.14 gain 4 51 -100.25 gain 51 4 -94.22 gain 4 52 -101.10 gain 52 4 -102.34 gain 4 53 -107.86 gain 53 4 -103.62 gain 4 54 -107.97 gain 54 4 -107.31 gain 4 55 -111.10 gain 55 4 -105.59 gain 4 56 -114.71 gain 56 4 -114.10 gain 4 57 -106.11 gain 57 4 -102.29 gain 4 58 -116.99 gain 58 4 -114.87 gain 4 59 -121.56 gain 59 4 -121.88 gain 4 60 -107.90 gain 60 4 -105.50 gain 4 61 -105.23 gain 61 4 -104.27 gain 4 62 -103.92 gain 62 4 -102.52 gain 4 63 -104.05 gain 63 4 -103.89 gain 4 64 -108.96 gain 64 4 -103.58 gain 4 65 -107.22 gain 65 4 -100.44 gain 4 66 -102.99 gain 66 4 -99.28 gain 4 67 -108.51 gain 67 4 -103.68 gain 4 68 -110.56 gain 68 4 -113.03 gain 4 69 -106.55 gain 69 4 -102.73 gain 4 70 -106.65 gain 70 4 -104.35 gain 4 71 -115.25 gain 71 4 -112.82 gain 4 72 -119.59 gain 72 4 -115.14 gain 4 73 -109.48 gain 73 4 -105.87 gain 4 74 -123.18 gain 74 4 -121.86 gain 4 75 -109.37 gain 75 4 -105.72 gain 4 76 -109.13 gain 76 4 -106.50 gain 4 77 -110.56 gain 77 4 -110.90 gain 4 78 -102.99 gain 78 4 -100.23 gain 4 79 -120.35 gain 79 4 -115.52 gain 4 80 -107.58 gain 80 4 -104.27 gain 4 81 -115.44 gain 81 4 -110.10 gain 4 82 -109.60 gain 82 4 -107.11 gain 4 83 -114.85 gain 83 4 -112.14 gain 4 84 -117.03 gain 84 4 -112.13 gain 4 85 -120.42 gain 85 4 -113.79 gain 4 86 -115.69 gain 86 4 -117.45 gain 4 87 -121.87 gain 87 4 -119.28 gain 4 88 -123.46 gain 88 4 -121.42 gain 4 89 -112.95 gain 89 4 -111.16 gain 4 90 -119.38 gain 90 4 -118.96 gain 4 91 -120.17 gain 91 4 -119.04 gain 4 92 -112.18 gain 92 4 -111.62 gain 4 93 -110.56 gain 93 4 -111.54 gain 4 94 -107.91 gain 94 4 -103.79 gain 4 95 -111.56 gain 95 4 -110.67 gain 4 96 -106.66 gain 96 4 -101.23 gain 4 97 -113.49 gain 97 4 -111.47 gain 4 98 -121.87 gain 98 4 -118.60 gain 4 99 -114.77 gain 99 4 -115.14 gain 4 100 -121.24 gain 100 4 -123.32 gain 4 101 -118.10 gain 101 4 -116.10 gain 4 102 -119.34 gain 102 4 -117.47 gain 4 103 -122.36 gain 103 4 -120.33 gain 4 104 -121.16 gain 104 4 -114.96 gain 4 105 -119.35 gain 105 4 -118.47 gain 4 106 -116.04 gain 106 4 -113.87 gain 4 107 -116.21 gain 107 4 -114.35 gain 4 108 -108.91 gain 108 4 -106.71 gain 4 109 -118.60 gain 109 4 -118.25 gain 4 110 -118.07 gain 110 4 -114.78 gain 4 111 -116.26 gain 111 4 -115.63 gain 4 112 -113.93 gain 112 4 -113.05 gain 4 113 -123.68 gain 113 4 -124.50 gain 4 114 -121.85 gain 114 4 -119.57 gain 4 115 -115.90 gain 115 4 -108.55 gain 4 116 -116.44 gain 116 4 -114.83 gain 4 117 -117.32 gain 117 4 -118.51 gain 4 118 -120.76 gain 118 4 -119.33 gain 4 119 -121.33 gain 119 4 -119.38 gain 4 120 -116.97 gain 120 4 -110.55 gain 4 121 -113.94 gain 121 4 -110.30 gain 4 122 -108.56 gain 122 4 -107.43 gain 4 123 -111.72 gain 123 4 -108.10 gain 4 124 -116.77 gain 124 4 -113.14 gain 4 125 -117.90 gain 125 4 -115.89 gain 4 126 -114.08 gain 126 4 -108.37 gain 4 127 -115.73 gain 127 4 -111.60 gain 4 128 -122.09 gain 128 4 -119.83 gain 4 129 -116.98 gain 129 4 -112.13 gain 4 130 -117.09 gain 130 4 -114.91 gain 4 131 -121.42 gain 131 4 -117.11 gain 4 132 -128.31 gain 132 4 -126.62 gain 4 133 -120.06 gain 133 4 -116.48 gain 4 134 -112.91 gain 134 4 -109.13 gain 4 135 -123.89 gain 135 4 -121.81 gain 4 136 -122.10 gain 136 4 -121.31 gain 4 137 -113.65 gain 137 4 -110.65 gain 4 138 -121.27 gain 138 4 -114.50 gain 4 139 -106.88 gain 139 4 -102.01 gain 4 140 -124.19 gain 140 4 -125.38 gain 4 141 -112.08 gain 141 4 -108.15 gain 4 142 -121.95 gain 142 4 -122.84 gain 4 143 -125.38 gain 143 4 -121.81 gain 4 144 -120.69 gain 144 4 -118.02 gain 4 145 -112.52 gain 145 4 -109.45 gain 4 146 -116.43 gain 146 4 -110.91 gain 4 147 -119.41 gain 147 4 -117.74 gain 4 148 -121.08 gain 148 4 -118.34 gain 4 149 -123.08 gain 149 4 -119.59 gain 4 150 -118.12 gain 150 4 -119.74 gain 4 151 -108.48 gain 151 4 -103.67 gain 4 152 -119.75 gain 152 4 -116.76 gain 4 153 -124.01 gain 153 4 -123.45 gain 4 154 -116.40 gain 154 4 -111.46 gain 4 155 -111.27 gain 155 4 -110.15 gain 4 156 -128.67 gain 156 4 -125.57 gain 4 157 -116.33 gain 157 4 -115.20 gain 4 158 -114.66 gain 158 4 -113.96 gain 4 159 -115.39 gain 159 4 -108.33 gain 4 160 -122.91 gain 160 4 -118.12 gain 4 161 -125.80 gain 161 4 -123.87 gain 4 162 -126.35 gain 162 4 -121.50 gain 4 163 -119.06 gain 163 4 -111.40 gain 4 164 -122.92 gain 164 4 -117.00 gain 4 165 -123.23 gain 165 4 -120.24 gain 4 166 -116.70 gain 166 4 -116.39 gain 4 167 -123.46 gain 167 4 -122.27 gain 4 168 -124.35 gain 168 4 -124.51 gain 4 169 -118.85 gain 169 4 -111.35 gain 4 170 -124.61 gain 170 4 -127.61 gain 4 171 -120.21 gain 171 4 -119.63 gain 4 172 -118.15 gain 172 4 -110.67 gain 4 173 -120.39 gain 173 4 -117.57 gain 4 174 -130.75 gain 174 4 -127.69 gain 4 175 -122.81 gain 175 4 -118.96 gain 4 176 -123.39 gain 176 4 -119.49 gain 4 177 -118.96 gain 177 4 -116.55 gain 4 178 -122.44 gain 178 4 -120.98 gain 4 179 -121.09 gain 179 4 -120.66 gain 4 180 -121.10 gain 180 4 -116.47 gain 4 181 -122.89 gain 181 4 -122.71 gain 4 182 -116.82 gain 182 4 -112.93 gain 4 183 -114.66 gain 183 4 -112.07 gain 4 184 -121.69 gain 184 4 -121.16 gain 4 185 -118.25 gain 185 4 -113.14 gain 4 186 -115.30 gain 186 4 -109.18 gain 4 187 -117.31 gain 187 4 -115.29 gain 4 188 -126.10 gain 188 4 -126.84 gain 4 189 -113.17 gain 189 4 -113.30 gain 4 190 -121.00 gain 190 4 -116.80 gain 4 191 -116.36 gain 191 4 -115.19 gain 4 192 -125.01 gain 192 4 -121.16 gain 4 193 -128.01 gain 193 4 -128.14 gain 4 194 -124.24 gain 194 4 -123.94 gain 4 195 -124.12 gain 195 4 -122.00 gain 4 196 -115.03 gain 196 4 -111.94 gain 4 197 -127.63 gain 197 4 -127.21 gain 4 198 -114.33 gain 198 4 -117.85 gain 4 199 -122.95 gain 199 4 -118.04 gain 4 200 -119.94 gain 200 4 -111.79 gain 4 201 -114.53 gain 201 4 -110.21 gain 4 202 -123.26 gain 202 4 -120.46 gain 4 203 -119.49 gain 203 4 -113.31 gain 4 204 -117.74 gain 204 4 -118.65 gain 4 205 -125.30 gain 205 4 -124.28 gain 4 206 -116.58 gain 206 4 -113.53 gain 4 207 -126.33 gain 207 4 -124.05 gain 4 208 -127.77 gain 208 4 -125.65 gain 4 209 -123.57 gain 209 4 -117.46 gain 4 210 -125.41 gain 210 4 -125.88 gain 4 211 -115.78 gain 211 4 -112.51 gain 4 212 -121.46 gain 212 4 -115.74 gain 4 213 -127.58 gain 213 4 -126.73 gain 4 214 -120.82 gain 214 4 -116.27 gain 4 215 -120.89 gain 215 4 -117.43 gain 4 216 -124.46 gain 216 4 -121.82 gain 4 217 -117.27 gain 217 4 -118.45 gain 4 218 -132.53 gain 218 4 -125.90 gain 4 219 -126.49 gain 219 4 -122.68 gain 4 220 -119.23 gain 220 4 -111.77 gain 4 221 -121.83 gain 221 4 -118.88 gain 4 222 -126.03 gain 222 4 -124.44 gain 4 223 -127.89 gain 223 4 -128.32 gain 4 224 -123.42 gain 224 4 -124.34 gain 5 6 -84.60 gain 6 5 -81.04 gain 5 7 -93.83 gain 7 5 -87.66 gain 5 8 -105.34 gain 8 5 -105.14 gain 5 9 -102.06 gain 9 5 -97.34 gain 5 10 -103.54 gain 10 5 -101.13 gain 5 11 -113.56 gain 11 5 -112.60 gain 5 12 -113.81 gain 12 5 -110.80 gain 5 13 -111.32 gain 13 5 -104.53 gain 5 14 -120.13 gain 14 5 -115.97 gain 5 15 -109.95 gain 15 5 -101.93 gain 5 16 -103.20 gain 16 5 -96.42 gain 5 17 -97.73 gain 17 5 -93.74 gain 5 18 -95.03 gain 18 5 -92.03 gain 5 19 -92.93 gain 19 5 -90.98 gain 5 20 -87.72 gain 20 5 -83.88 gain 5 21 -90.70 gain 21 5 -87.11 gain 5 22 -103.00 gain 22 5 -102.64 gain 5 23 -106.49 gain 23 5 -105.44 gain 5 24 -107.25 gain 24 5 -109.07 gain 5 25 -113.34 gain 25 5 -110.97 gain 5 26 -108.19 gain 26 5 -105.16 gain 5 27 -111.02 gain 27 5 -108.50 gain 5 28 -114.92 gain 28 5 -110.11 gain 5 29 -122.87 gain 29 5 -123.71 gain 5 30 -99.57 gain 30 5 -98.08 gain 5 31 -100.32 gain 31 5 -97.19 gain 5 32 -96.72 gain 32 5 -93.35 gain 5 33 -104.87 gain 33 5 -101.68 gain 5 34 -99.49 gain 34 5 -94.17 gain 5 35 -93.25 gain 35 5 -90.33 gain 5 36 -102.86 gain 36 5 -101.62 gain 5 37 -101.74 gain 37 5 -102.44 gain 5 38 -106.70 gain 38 5 -99.56 gain 5 39 -104.32 gain 39 5 -98.79 gain 5 40 -113.06 gain 40 5 -108.70 gain 5 41 -112.76 gain 41 5 -110.47 gain 5 42 -115.62 gain 42 5 -110.97 gain 5 43 -117.80 gain 43 5 -111.92 gain 5 44 -123.27 gain 44 5 -120.46 gain 5 45 -108.94 gain 45 5 -107.07 gain 5 46 -106.32 gain 46 5 -104.36 gain 5 47 -111.57 gain 47 5 -107.54 gain 5 48 -111.10 gain 48 5 -110.94 gain 5 49 -99.72 gain 49 5 -98.42 gain 5 50 -106.69 gain 50 5 -101.75 gain 5 51 -104.84 gain 51 5 -98.37 gain 5 52 -107.63 gain 52 5 -108.44 gain 5 53 -110.62 gain 53 5 -105.95 gain 5 54 -112.91 gain 54 5 -111.80 gain 5 55 -108.83 gain 55 5 -102.88 gain 5 56 -118.13 gain 56 5 -117.08 gain 5 57 -112.41 gain 57 5 -108.14 gain 5 58 -111.90 gain 58 5 -109.34 gain 5 59 -120.11 gain 59 5 -119.99 gain 5 60 -114.57 gain 60 5 -111.73 gain 5 61 -108.95 gain 61 5 -107.56 gain 5 62 -113.73 gain 62 5 -111.89 gain 5 63 -101.17 gain 63 5 -100.56 gain 5 64 -99.56 gain 64 5 -93.74 gain 5 65 -103.71 gain 65 5 -96.49 gain 5 66 -106.70 gain 66 5 -102.55 gain 5 67 -102.89 gain 67 5 -97.62 gain 5 68 -114.59 gain 68 5 -116.62 gain 5 69 -110.80 gain 69 5 -106.54 gain 5 70 -109.51 gain 70 5 -106.78 gain 5 71 -111.23 gain 71 5 -108.37 gain 5 72 -114.04 gain 72 5 -109.15 gain 5 73 -114.17 gain 73 5 -110.12 gain 5 74 -119.85 gain 74 5 -118.08 gain 5 75 -113.45 gain 75 5 -109.36 gain 5 76 -109.64 gain 76 5 -106.57 gain 5 77 -110.36 gain 77 5 -110.26 gain 5 78 -108.47 gain 78 5 -105.27 gain 5 79 -109.21 gain 79 5 -103.95 gain 5 80 -110.06 gain 80 5 -106.32 gain 5 81 -102.14 gain 81 5 -96.36 gain 5 82 -110.53 gain 82 5 -107.60 gain 5 83 -113.53 gain 83 5 -110.39 gain 5 84 -115.55 gain 84 5 -110.21 gain 5 85 -117.97 gain 85 5 -110.91 gain 5 86 -113.56 gain 86 5 -114.88 gain 5 87 -115.64 gain 87 5 -112.61 gain 5 88 -115.41 gain 88 5 -112.93 gain 5 89 -115.33 gain 89 5 -113.10 gain 5 90 -111.75 gain 90 5 -110.90 gain 5 91 -115.68 gain 91 5 -114.11 gain 5 92 -111.45 gain 92 5 -110.45 gain 5 93 -119.31 gain 93 5 -119.84 gain 5 94 -114.66 gain 94 5 -110.10 gain 5 95 -113.21 gain 95 5 -111.88 gain 5 96 -112.39 gain 96 5 -106.52 gain 5 97 -106.68 gain 97 5 -104.22 gain 5 98 -113.53 gain 98 5 -109.82 gain 5 99 -114.93 gain 99 5 -114.86 gain 5 100 -113.00 gain 100 5 -114.65 gain 5 101 -118.81 gain 101 5 -116.38 gain 5 102 -119.59 gain 102 5 -117.29 gain 5 103 -117.45 gain 103 5 -114.98 gain 5 104 -121.85 gain 104 5 -115.21 gain 5 105 -107.52 gain 105 5 -106.20 gain 5 106 -110.75 gain 106 5 -108.15 gain 5 107 -117.04 gain 107 5 -114.74 gain 5 108 -115.57 gain 108 5 -112.93 gain 5 109 -114.33 gain 109 5 -113.54 gain 5 110 -108.80 gain 110 5 -105.08 gain 5 111 -112.36 gain 111 5 -111.29 gain 5 112 -125.78 gain 112 5 -124.47 gain 5 113 -117.10 gain 113 5 -117.48 gain 5 114 -110.65 gain 114 5 -107.94 gain 5 115 -115.34 gain 115 5 -107.55 gain 5 116 -117.58 gain 116 5 -115.53 gain 5 117 -121.23 gain 117 5 -121.98 gain 5 118 -122.01 gain 118 5 -120.14 gain 5 119 -123.40 gain 119 5 -121.00 gain 5 120 -116.00 gain 120 5 -109.15 gain 5 121 -111.41 gain 121 5 -107.33 gain 5 122 -121.98 gain 122 5 -120.41 gain 5 123 -117.61 gain 123 5 -113.56 gain 5 124 -117.27 gain 124 5 -113.21 gain 5 125 -113.35 gain 125 5 -110.90 gain 5 126 -119.98 gain 126 5 -113.84 gain 5 127 -117.09 gain 127 5 -112.52 gain 5 128 -106.23 gain 128 5 -103.53 gain 5 129 -120.17 gain 129 5 -114.88 gain 5 130 -122.55 gain 130 5 -119.94 gain 5 131 -119.22 gain 131 5 -114.48 gain 5 132 -121.07 gain 132 5 -118.95 gain 5 133 -118.23 gain 133 5 -114.21 gain 5 134 -122.37 gain 134 5 -118.15 gain 5 135 -120.34 gain 135 5 -117.82 gain 5 136 -118.88 gain 136 5 -117.66 gain 5 137 -111.86 gain 137 5 -108.42 gain 5 138 -119.07 gain 138 5 -111.86 gain 5 139 -117.71 gain 139 5 -112.40 gain 5 140 -117.54 gain 140 5 -118.29 gain 5 141 -118.28 gain 141 5 -113.92 gain 5 142 -119.27 gain 142 5 -119.71 gain 5 143 -117.69 gain 143 5 -113.68 gain 5 144 -120.89 gain 144 5 -117.78 gain 5 145 -119.58 gain 145 5 -116.07 gain 5 146 -123.32 gain 146 5 -117.36 gain 5 147 -124.71 gain 147 5 -122.61 gain 5 148 -114.27 gain 148 5 -111.09 gain 5 149 -114.88 gain 149 5 -110.95 gain 5 150 -111.21 gain 150 5 -112.40 gain 5 151 -122.28 gain 151 5 -117.03 gain 5 152 -117.21 gain 152 5 -113.79 gain 5 153 -123.87 gain 153 5 -122.87 gain 5 154 -121.27 gain 154 5 -115.88 gain 5 155 -116.19 gain 155 5 -114.64 gain 5 156 -119.00 gain 156 5 -115.47 gain 5 157 -118.48 gain 157 5 -116.90 gain 5 158 -128.74 gain 158 5 -127.60 gain 5 159 -125.34 gain 159 5 -117.84 gain 5 160 -122.86 gain 160 5 -117.63 gain 5 161 -124.85 gain 161 5 -122.48 gain 5 162 -123.95 gain 162 5 -118.67 gain 5 163 -114.89 gain 163 5 -106.79 gain 5 164 -120.54 gain 164 5 -114.18 gain 5 165 -116.53 gain 165 5 -113.10 gain 5 166 -118.21 gain 166 5 -117.46 gain 5 167 -123.70 gain 167 5 -122.08 gain 5 168 -116.00 gain 168 5 -115.71 gain 5 169 -119.25 gain 169 5 -111.32 gain 5 170 -121.72 gain 170 5 -124.27 gain 5 171 -118.97 gain 171 5 -117.96 gain 5 172 -121.12 gain 172 5 -113.21 gain 5 173 -117.99 gain 173 5 -114.73 gain 5 174 -123.94 gain 174 5 -120.44 gain 5 175 -113.08 gain 175 5 -108.79 gain 5 176 -126.67 gain 176 5 -122.33 gain 5 177 -118.92 gain 177 5 -116.07 gain 5 178 -121.97 gain 178 5 -120.07 gain 5 179 -121.39 gain 179 5 -120.52 gain 5 180 -125.38 gain 180 5 -120.31 gain 5 181 -121.66 gain 181 5 -121.03 gain 5 182 -116.93 gain 182 5 -112.60 gain 5 183 -128.73 gain 183 5 -125.70 gain 5 184 -121.83 gain 184 5 -120.86 gain 5 185 -121.96 gain 185 5 -116.41 gain 5 186 -117.22 gain 186 5 -110.66 gain 5 187 -122.62 gain 187 5 -120.16 gain 5 188 -121.20 gain 188 5 -121.49 gain 5 189 -120.33 gain 189 5 -120.02 gain 5 190 -123.85 gain 190 5 -119.20 gain 5 191 -123.51 gain 191 5 -121.91 gain 5 192 -123.78 gain 192 5 -119.49 gain 5 193 -128.32 gain 193 5 -128.01 gain 5 194 -118.14 gain 194 5 -117.40 gain 5 195 -126.46 gain 195 5 -123.91 gain 5 196 -120.62 gain 196 5 -117.09 gain 5 197 -120.98 gain 197 5 -120.12 gain 5 198 -119.41 gain 198 5 -122.49 gain 5 199 -125.00 gain 199 5 -119.65 gain 5 200 -126.25 gain 200 5 -117.67 gain 5 201 -123.77 gain 201 5 -119.00 gain 5 202 -120.44 gain 202 5 -117.20 gain 5 203 -124.28 gain 203 5 -117.67 gain 5 204 -115.58 gain 204 5 -116.05 gain 5 205 -122.86 gain 205 5 -121.40 gain 5 206 -123.46 gain 206 5 -119.97 gain 5 207 -123.91 gain 207 5 -121.18 gain 5 208 -133.96 gain 208 5 -131.41 gain 5 209 -124.24 gain 209 5 -117.70 gain 5 210 -125.32 gain 210 5 -125.35 gain 5 211 -111.07 gain 211 5 -107.36 gain 5 212 -116.94 gain 212 5 -110.79 gain 5 213 -127.05 gain 213 5 -125.75 gain 5 214 -126.21 gain 214 5 -121.22 gain 5 215 -123.02 gain 215 5 -119.11 gain 5 216 -124.58 gain 216 5 -121.51 gain 5 217 -121.94 gain 217 5 -122.69 gain 5 218 -125.12 gain 218 5 -118.06 gain 5 219 -125.58 gain 219 5 -121.34 gain 5 220 -128.30 gain 220 5 -120.41 gain 5 221 -130.07 gain 221 5 -126.68 gain 5 222 -123.59 gain 222 5 -121.57 gain 5 223 -121.63 gain 223 5 -121.62 gain 5 224 -124.95 gain 224 5 -125.43 gain 6 7 -80.48 gain 7 6 -77.88 gain 6 8 -90.66 gain 8 6 -94.03 gain 6 9 -100.44 gain 9 6 -99.29 gain 6 10 -98.79 gain 10 6 -99.95 gain 6 11 -102.82 gain 11 6 -105.42 gain 6 12 -112.54 gain 12 6 -113.10 gain 6 13 -110.41 gain 13 6 -107.19 gain 6 14 -113.12 gain 14 6 -112.52 gain 6 15 -106.36 gain 15 6 -101.91 gain 6 16 -112.14 gain 16 6 -108.93 gain 6 17 -104.84 gain 17 6 -104.42 gain 6 18 -99.98 gain 18 6 -100.55 gain 6 19 -87.84 gain 19 6 -89.45 gain 6 20 -85.09 gain 20 6 -84.82 gain 6 21 -88.10 gain 21 6 -88.08 gain 6 22 -87.58 gain 22 6 -90.78 gain 6 23 -99.77 gain 23 6 -102.29 gain 6 24 -95.15 gain 24 6 -100.54 gain 6 25 -99.63 gain 25 6 -100.83 gain 6 26 -108.11 gain 26 6 -108.66 gain 6 27 -102.12 gain 27 6 -103.16 gain 6 28 -115.84 gain 28 6 -114.60 gain 6 29 -113.72 gain 29 6 -118.13 gain 6 30 -112.60 gain 30 6 -114.68 gain 6 31 -108.19 gain 31 6 -108.63 gain 6 32 -104.07 gain 32 6 -104.26 gain 6 33 -103.84 gain 33 6 -104.21 gain 6 34 -93.57 gain 34 6 -91.82 gain 6 35 -96.27 gain 35 6 -96.92 gain 6 36 -87.12 gain 36 6 -89.45 gain 6 37 -102.58 gain 37 6 -106.85 gain 6 38 -101.88 gain 38 6 -98.32 gain 6 39 -97.05 gain 39 6 -95.09 gain 6 40 -100.14 gain 40 6 -99.35 gain 6 41 -104.82 gain 41 6 -106.10 gain 6 42 -103.59 gain 42 6 -102.51 gain 6 43 -108.37 gain 43 6 -106.06 gain 6 44 -111.31 gain 44 6 -112.07 gain 6 45 -105.48 gain 45 6 -107.18 gain 6 46 -110.66 gain 46 6 -112.27 gain 6 47 -102.88 gain 47 6 -102.43 gain 6 48 -114.22 gain 48 6 -117.63 gain 6 49 -102.95 gain 49 6 -105.21 gain 6 50 -105.16 gain 50 6 -103.78 gain 6 51 -98.15 gain 51 6 -95.24 gain 6 52 -110.56 gain 52 6 -114.94 gain 6 53 -102.10 gain 53 6 -100.99 gain 6 54 -99.04 gain 54 6 -101.50 gain 6 55 -103.17 gain 55 6 -100.79 gain 6 56 -107.64 gain 56 6 -110.15 gain 6 57 -109.90 gain 57 6 -109.21 gain 6 58 -105.18 gain 58 6 -106.19 gain 6 59 -117.02 gain 59 6 -120.47 gain 6 60 -108.90 gain 60 6 -109.63 gain 6 61 -108.42 gain 61 6 -110.59 gain 6 62 -105.84 gain 62 6 -107.57 gain 6 63 -102.87 gain 63 6 -105.83 gain 6 64 -103.36 gain 64 6 -101.11 gain 6 65 -96.83 gain 65 6 -93.18 gain 6 66 -105.09 gain 66 6 -104.51 gain 6 67 -109.61 gain 67 6 -107.90 gain 6 68 -101.69 gain 68 6 -107.28 gain 6 69 -101.35 gain 69 6 -100.66 gain 6 70 -107.44 gain 70 6 -108.27 gain 6 71 -109.29 gain 71 6 -109.99 gain 6 72 -115.39 gain 72 6 -114.07 gain 6 73 -113.14 gain 73 6 -112.66 gain 6 74 -109.19 gain 74 6 -110.99 gain 6 75 -111.75 gain 75 6 -111.23 gain 6 76 -115.99 gain 76 6 -116.49 gain 6 77 -102.24 gain 77 6 -105.70 gain 6 78 -108.87 gain 78 6 -109.24 gain 6 79 -106.02 gain 79 6 -104.33 gain 6 80 -105.41 gain 80 6 -105.24 gain 6 81 -108.37 gain 81 6 -106.16 gain 6 82 -106.28 gain 82 6 -106.92 gain 6 83 -107.31 gain 83 6 -107.73 gain 6 84 -105.35 gain 84 6 -103.57 gain 6 85 -103.30 gain 85 6 -99.80 gain 6 86 -108.39 gain 86 6 -113.28 gain 6 87 -112.02 gain 87 6 -112.57 gain 6 88 -106.82 gain 88 6 -107.90 gain 6 89 -111.91 gain 89 6 -113.25 gain 6 90 -108.63 gain 90 6 -111.35 gain 6 91 -111.10 gain 91 6 -113.10 gain 6 92 -113.17 gain 92 6 -115.74 gain 6 93 -109.88 gain 93 6 -113.98 gain 6 94 -109.12 gain 94 6 -108.13 gain 6 95 -106.40 gain 95 6 -108.63 gain 6 96 -103.56 gain 96 6 -101.26 gain 6 97 -107.02 gain 97 6 -108.13 gain 6 98 -111.71 gain 98 6 -111.57 gain 6 99 -110.67 gain 99 6 -114.17 gain 6 100 -111.09 gain 100 6 -116.30 gain 6 101 -111.67 gain 101 6 -112.80 gain 6 102 -110.28 gain 102 6 -111.54 gain 6 103 -112.58 gain 103 6 -113.68 gain 6 104 -117.87 gain 104 6 -114.80 gain 6 105 -113.62 gain 105 6 -115.87 gain 6 106 -112.79 gain 106 6 -113.76 gain 6 107 -113.66 gain 107 6 -114.93 gain 6 108 -111.37 gain 108 6 -112.30 gain 6 109 -105.83 gain 109 6 -108.60 gain 6 110 -104.13 gain 110 6 -103.98 gain 6 111 -107.65 gain 111 6 -110.16 gain 6 112 -106.75 gain 112 6 -109.00 gain 6 113 -112.06 gain 113 6 -116.01 gain 6 114 -112.98 gain 114 6 -113.83 gain 6 115 -118.03 gain 115 6 -113.81 gain 6 116 -113.67 gain 116 6 -115.19 gain 6 117 -114.67 gain 117 6 -118.99 gain 6 118 -106.33 gain 118 6 -108.03 gain 6 119 -111.38 gain 119 6 -112.55 gain 6 120 -105.27 gain 120 6 -101.99 gain 6 121 -117.55 gain 121 6 -117.04 gain 6 122 -113.31 gain 122 6 -115.31 gain 6 123 -111.21 gain 123 6 -110.72 gain 6 124 -122.02 gain 124 6 -121.52 gain 6 125 -115.60 gain 125 6 -116.71 gain 6 126 -106.61 gain 126 6 -104.04 gain 6 127 -120.83 gain 127 6 -119.83 gain 6 128 -119.89 gain 128 6 -120.76 gain 6 129 -111.55 gain 129 6 -109.83 gain 6 130 -118.37 gain 130 6 -119.33 gain 6 131 -111.12 gain 131 6 -109.94 gain 6 132 -111.35 gain 132 6 -112.79 gain 6 133 -122.25 gain 133 6 -121.80 gain 6 134 -117.33 gain 134 6 -116.68 gain 6 135 -114.55 gain 135 6 -115.60 gain 6 136 -117.40 gain 136 6 -119.74 gain 6 137 -119.63 gain 137 6 -119.75 gain 6 138 -107.98 gain 138 6 -104.34 gain 6 139 -116.50 gain 139 6 -114.76 gain 6 140 -110.79 gain 140 6 -115.11 gain 6 141 -102.48 gain 141 6 -101.68 gain 6 142 -113.59 gain 142 6 -117.60 gain 6 143 -115.76 gain 143 6 -115.32 gain 6 144 -113.78 gain 144 6 -114.24 gain 6 145 -109.44 gain 145 6 -109.50 gain 6 146 -111.43 gain 146 6 -109.04 gain 6 147 -120.80 gain 147 6 -122.27 gain 6 148 -110.61 gain 148 6 -111.00 gain 6 149 -119.69 gain 149 6 -119.33 gain 6 150 -117.60 gain 150 6 -122.35 gain 6 151 -117.02 gain 151 6 -115.34 gain 6 152 -117.76 gain 152 6 -117.90 gain 6 153 -115.07 gain 153 6 -117.64 gain 6 154 -112.75 gain 154 6 -110.93 gain 6 155 -114.14 gain 155 6 -116.16 gain 6 156 -114.03 gain 156 6 -114.06 gain 6 157 -115.93 gain 157 6 -117.93 gain 6 158 -113.03 gain 158 6 -115.45 gain 6 159 -116.11 gain 159 6 -112.18 gain 6 160 -113.34 gain 160 6 -111.67 gain 6 161 -119.67 gain 161 6 -120.86 gain 6 162 -115.22 gain 162 6 -113.50 gain 6 163 -117.36 gain 163 6 -112.82 gain 6 164 -118.72 gain 164 6 -115.93 gain 6 165 -117.76 gain 165 6 -117.90 gain 6 166 -111.94 gain 166 6 -114.76 gain 6 167 -115.15 gain 167 6 -117.09 gain 6 168 -112.40 gain 168 6 -115.68 gain 6 169 -117.45 gain 169 6 -113.09 gain 6 170 -118.09 gain 170 6 -124.22 gain 6 171 -115.52 gain 171 6 -118.07 gain 6 172 -117.01 gain 172 6 -112.66 gain 6 173 -110.84 gain 173 6 -111.15 gain 6 174 -115.58 gain 174 6 -115.65 gain 6 175 -114.20 gain 175 6 -113.48 gain 6 176 -109.48 gain 176 6 -108.72 gain 6 177 -109.40 gain 177 6 -110.12 gain 6 178 -120.30 gain 178 6 -121.97 gain 6 179 -107.72 gain 179 6 -110.42 gain 6 180 -117.99 gain 180 6 -116.49 gain 6 181 -125.39 gain 181 6 -128.33 gain 6 182 -125.25 gain 182 6 -124.49 gain 6 183 -118.75 gain 183 6 -119.29 gain 6 184 -119.96 gain 184 6 -122.55 gain 6 185 -114.60 gain 185 6 -112.62 gain 6 186 -119.67 gain 186 6 -116.69 gain 6 187 -115.19 gain 187 6 -116.29 gain 6 188 -116.90 gain 188 6 -120.76 gain 6 189 -112.94 gain 189 6 -116.20 gain 6 190 -121.18 gain 190 6 -120.10 gain 6 191 -124.51 gain 191 6 -126.47 gain 6 192 -119.68 gain 192 6 -118.96 gain 6 193 -112.83 gain 193 6 -116.09 gain 6 194 -120.87 gain 194 6 -123.70 gain 6 195 -125.36 gain 195 6 -126.38 gain 6 196 -129.66 gain 196 6 -129.70 gain 6 197 -119.18 gain 197 6 -121.90 gain 6 198 -115.87 gain 198 6 -122.52 gain 6 199 -117.81 gain 199 6 -116.02 gain 6 200 -116.12 gain 200 6 -111.11 gain 6 201 -118.42 gain 201 6 -117.22 gain 6 202 -116.04 gain 202 6 -116.37 gain 6 203 -115.11 gain 203 6 -112.07 gain 6 204 -120.54 gain 204 6 -124.58 gain 6 205 -115.91 gain 205 6 -118.01 gain 6 206 -112.83 gain 206 6 -112.91 gain 6 207 -119.41 gain 207 6 -120.25 gain 6 208 -118.23 gain 208 6 -119.25 gain 6 209 -118.57 gain 209 6 -115.59 gain 6 210 -123.93 gain 210 6 -127.53 gain 6 211 -118.17 gain 211 6 -118.03 gain 6 212 -121.85 gain 212 6 -119.26 gain 6 213 -117.54 gain 213 6 -119.82 gain 6 214 -117.17 gain 214 6 -115.75 gain 6 215 -121.89 gain 215 6 -121.56 gain 6 216 -114.44 gain 216 6 -114.94 gain 6 217 -116.45 gain 217 6 -120.77 gain 6 218 -124.49 gain 218 6 -121.00 gain 6 219 -127.49 gain 219 6 -126.81 gain 6 220 -116.55 gain 220 6 -112.22 gain 6 221 -120.28 gain 221 6 -120.45 gain 6 222 -114.89 gain 222 6 -116.44 gain 6 223 -111.82 gain 223 6 -115.37 gain 6 224 -122.54 gain 224 6 -126.60 gain 7 8 -75.57 gain 8 7 -81.54 gain 7 9 -84.07 gain 9 7 -85.53 gain 7 10 -96.78 gain 10 7 -100.54 gain 7 11 -97.84 gain 11 7 -103.04 gain 7 12 -104.20 gain 12 7 -107.37 gain 7 13 -106.94 gain 13 7 -106.32 gain 7 14 -110.70 gain 14 7 -112.71 gain 7 15 -112.66 gain 15 7 -110.82 gain 7 16 -100.10 gain 16 7 -99.50 gain 7 17 -113.15 gain 17 7 -115.34 gain 7 18 -105.32 gain 18 7 -108.50 gain 7 19 -97.73 gain 19 7 -101.95 gain 7 20 -96.39 gain 20 7 -98.72 gain 7 21 -93.11 gain 21 7 -95.69 gain 7 22 -80.23 gain 22 7 -86.03 gain 7 23 -86.36 gain 23 7 -91.48 gain 7 24 -95.81 gain 24 7 -103.81 gain 7 25 -92.34 gain 25 7 -96.14 gain 7 26 -96.00 gain 26 7 -99.15 gain 7 27 -107.54 gain 27 7 -111.19 gain 7 28 -100.73 gain 28 7 -102.09 gain 7 29 -107.55 gain 29 7 -114.56 gain 7 30 -115.40 gain 30 7 -120.07 gain 7 31 -102.84 gain 31 7 -105.88 gain 7 32 -111.16 gain 32 7 -113.96 gain 7 33 -103.29 gain 33 7 -106.26 gain 7 34 -112.27 gain 34 7 -113.13 gain 7 35 -93.38 gain 35 7 -96.64 gain 7 36 -86.71 gain 36 7 -91.64 gain 7 37 -95.25 gain 37 7 -102.12 gain 7 38 -90.28 gain 38 7 -89.32 gain 7 39 -97.20 gain 39 7 -97.83 gain 7 40 -101.89 gain 40 7 -103.70 gain 7 41 -105.09 gain 41 7 -108.98 gain 7 42 -104.65 gain 42 7 -106.17 gain 7 43 -102.87 gain 43 7 -103.16 gain 7 44 -101.50 gain 44 7 -104.86 gain 7 45 -113.29 gain 45 7 -117.58 gain 7 46 -105.79 gain 46 7 -110.00 gain 7 47 -103.05 gain 47 7 -105.19 gain 7 48 -106.37 gain 48 7 -112.38 gain 7 49 -100.70 gain 49 7 -105.57 gain 7 50 -104.23 gain 50 7 -105.45 gain 7 51 -101.87 gain 51 7 -101.57 gain 7 52 -95.05 gain 52 7 -102.03 gain 7 53 -104.07 gain 53 7 -105.56 gain 7 54 -101.02 gain 54 7 -106.09 gain 7 55 -99.91 gain 55 7 -100.13 gain 7 56 -106.38 gain 56 7 -111.50 gain 7 57 -98.51 gain 57 7 -100.42 gain 7 58 -95.25 gain 58 7 -98.86 gain 7 59 -109.00 gain 59 7 -115.05 gain 7 60 -105.05 gain 60 7 -108.38 gain 7 61 -104.32 gain 61 7 -109.09 gain 7 62 -101.50 gain 62 7 -105.83 gain 7 63 -106.08 gain 63 7 -111.64 gain 7 64 -97.70 gain 64 7 -98.05 gain 7 65 -105.74 gain 65 7 -104.68 gain 7 66 -100.50 gain 66 7 -102.52 gain 7 67 -99.35 gain 67 7 -100.25 gain 7 68 -101.72 gain 68 7 -109.91 gain 7 69 -105.45 gain 69 7 -107.37 gain 7 70 -97.09 gain 70 7 -100.52 gain 7 71 -109.25 gain 71 7 -112.56 gain 7 72 -106.42 gain 72 7 -107.70 gain 7 73 -107.48 gain 73 7 -109.60 gain 7 74 -110.74 gain 74 7 -115.15 gain 7 75 -109.08 gain 75 7 -111.16 gain 7 76 -105.54 gain 76 7 -108.64 gain 7 77 -109.43 gain 77 7 -115.50 gain 7 78 -108.41 gain 78 7 -111.39 gain 7 79 -102.75 gain 79 7 -103.66 gain 7 80 -99.11 gain 80 7 -101.54 gain 7 81 -107.77 gain 81 7 -108.17 gain 7 82 -102.26 gain 82 7 -105.50 gain 7 83 -102.25 gain 83 7 -105.27 gain 7 84 -103.82 gain 84 7 -104.65 gain 7 85 -95.55 gain 85 7 -94.66 gain 7 86 -108.47 gain 86 7 -115.96 gain 7 87 -102.88 gain 87 7 -106.03 gain 7 88 -110.20 gain 88 7 -113.89 gain 7 89 -110.65 gain 89 7 -114.59 gain 7 90 -110.48 gain 90 7 -115.80 gain 7 91 -106.39 gain 91 7 -110.99 gain 7 92 -110.33 gain 92 7 -115.51 gain 7 93 -107.85 gain 93 7 -114.56 gain 7 94 -108.05 gain 94 7 -109.66 gain 7 95 -96.13 gain 95 7 -100.97 gain 7 96 -103.77 gain 96 7 -104.07 gain 7 97 -102.58 gain 97 7 -106.30 gain 7 98 -105.79 gain 98 7 -108.26 gain 7 99 -105.94 gain 99 7 -112.04 gain 7 100 -109.71 gain 100 7 -117.52 gain 7 101 -104.57 gain 101 7 -108.31 gain 7 102 -109.16 gain 102 7 -113.03 gain 7 103 -107.15 gain 103 7 -110.86 gain 7 104 -108.88 gain 104 7 -108.41 gain 7 105 -114.18 gain 105 7 -119.03 gain 7 106 -113.86 gain 106 7 -117.43 gain 7 107 -110.60 gain 107 7 -114.47 gain 7 108 -109.53 gain 108 7 -113.06 gain 7 109 -108.13 gain 109 7 -113.50 gain 7 110 -105.30 gain 110 7 -107.74 gain 7 111 -115.06 gain 111 7 -120.17 gain 7 112 -106.56 gain 112 7 -111.42 gain 7 113 -105.60 gain 113 7 -112.15 gain 7 114 -107.58 gain 114 7 -111.04 gain 7 115 -111.37 gain 115 7 -109.75 gain 7 116 -109.18 gain 116 7 -113.30 gain 7 117 -113.63 gain 117 7 -120.55 gain 7 118 -114.09 gain 118 7 -118.39 gain 7 119 -107.20 gain 119 7 -110.97 gain 7 120 -120.62 gain 120 7 -119.94 gain 7 121 -111.24 gain 121 7 -113.34 gain 7 122 -112.34 gain 122 7 -116.94 gain 7 123 -113.90 gain 123 7 -116.02 gain 7 124 -108.17 gain 124 7 -110.28 gain 7 125 -112.32 gain 125 7 -116.04 gain 7 126 -105.69 gain 126 7 -105.72 gain 7 127 -102.38 gain 127 7 -103.99 gain 7 128 -108.00 gain 128 7 -111.48 gain 7 129 -108.93 gain 129 7 -109.81 gain 7 130 -110.90 gain 130 7 -114.46 gain 7 131 -113.96 gain 131 7 -115.38 gain 7 132 -117.41 gain 132 7 -121.45 gain 7 133 -116.17 gain 133 7 -118.33 gain 7 134 -109.57 gain 134 7 -111.52 gain 7 135 -117.12 gain 135 7 -120.78 gain 7 136 -119.14 gain 136 7 -124.09 gain 7 137 -111.71 gain 137 7 -114.44 gain 7 138 -105.43 gain 138 7 -104.39 gain 7 139 -114.87 gain 139 7 -115.74 gain 7 140 -111.21 gain 140 7 -118.13 gain 7 141 -108.24 gain 141 7 -110.04 gain 7 142 -114.95 gain 142 7 -121.57 gain 7 143 -109.10 gain 143 7 -111.26 gain 7 144 -114.52 gain 144 7 -117.59 gain 7 145 -115.06 gain 145 7 -117.72 gain 7 146 -112.67 gain 146 7 -112.88 gain 7 147 -112.29 gain 147 7 -116.35 gain 7 148 -116.35 gain 148 7 -119.34 gain 7 149 -110.27 gain 149 7 -112.52 gain 7 150 -110.79 gain 150 7 -118.15 gain 7 151 -115.07 gain 151 7 -115.99 gain 7 152 -110.32 gain 152 7 -113.07 gain 7 153 -116.54 gain 153 7 -121.72 gain 7 154 -111.29 gain 154 7 -112.07 gain 7 155 -112.80 gain 155 7 -117.41 gain 7 156 -110.33 gain 156 7 -112.96 gain 7 157 -111.62 gain 157 7 -116.21 gain 7 158 -112.84 gain 158 7 -117.88 gain 7 159 -120.74 gain 159 7 -119.40 gain 7 160 -114.13 gain 160 7 -115.07 gain 7 161 -108.08 gain 161 7 -111.88 gain 7 162 -111.62 gain 162 7 -112.50 gain 7 163 -118.68 gain 163 7 -116.75 gain 7 164 -111.40 gain 164 7 -111.21 gain 7 165 -115.28 gain 165 7 -118.02 gain 7 166 -116.21 gain 166 7 -121.63 gain 7 167 -115.87 gain 167 7 -120.42 gain 7 168 -119.75 gain 168 7 -125.64 gain 7 169 -118.07 gain 169 7 -116.31 gain 7 170 -120.30 gain 170 7 -129.03 gain 7 171 -110.31 gain 171 7 -115.47 gain 7 172 -109.09 gain 172 7 -107.35 gain 7 173 -112.72 gain 173 7 -115.64 gain 7 174 -109.01 gain 174 7 -111.69 gain 7 175 -110.53 gain 175 7 -112.41 gain 7 176 -119.59 gain 176 7 -121.42 gain 7 177 -117.75 gain 177 7 -121.08 gain 7 178 -118.30 gain 178 7 -122.57 gain 7 179 -114.45 gain 179 7 -119.75 gain 7 180 -115.70 gain 180 7 -116.80 gain 7 181 -117.62 gain 181 7 -123.16 gain 7 182 -106.82 gain 182 7 -108.66 gain 7 183 -113.90 gain 183 7 -117.04 gain 7 184 -117.33 gain 184 7 -122.53 gain 7 185 -110.73 gain 185 7 -111.35 gain 7 186 -110.35 gain 186 7 -109.97 gain 7 187 -112.09 gain 187 7 -115.79 gain 7 188 -117.59 gain 188 7 -124.06 gain 7 189 -112.30 gain 189 7 -118.16 gain 7 190 -118.54 gain 190 7 -120.07 gain 7 191 -118.42 gain 191 7 -122.99 gain 7 192 -115.54 gain 192 7 -117.42 gain 7 193 -110.07 gain 193 7 -115.93 gain 7 194 -122.85 gain 194 7 -128.28 gain 7 195 -116.39 gain 195 7 -120.01 gain 7 196 -115.29 gain 196 7 -117.93 gain 7 197 -109.81 gain 197 7 -115.12 gain 7 198 -120.13 gain 198 7 -129.38 gain 7 199 -113.30 gain 199 7 -114.12 gain 7 200 -113.66 gain 200 7 -111.24 gain 7 201 -119.32 gain 201 7 -120.72 gain 7 202 -111.26 gain 202 7 -114.19 gain 7 203 -108.57 gain 203 7 -108.13 gain 7 204 -114.22 gain 204 7 -120.86 gain 7 205 -117.20 gain 205 7 -121.91 gain 7 206 -113.11 gain 206 7 -115.79 gain 7 207 -118.45 gain 207 7 -121.89 gain 7 208 -110.18 gain 208 7 -113.80 gain 7 209 -118.89 gain 209 7 -118.51 gain 7 210 -115.92 gain 210 7 -122.12 gain 7 211 -115.43 gain 211 7 -117.89 gain 7 212 -115.15 gain 212 7 -115.17 gain 7 213 -113.35 gain 213 7 -118.23 gain 7 214 -116.93 gain 214 7 -118.11 gain 7 215 -114.30 gain 215 7 -116.57 gain 7 216 -116.86 gain 216 7 -119.96 gain 7 217 -116.71 gain 217 7 -123.63 gain 7 218 -117.42 gain 218 7 -116.53 gain 7 219 -114.74 gain 219 7 -116.67 gain 7 220 -118.93 gain 220 7 -117.21 gain 7 221 -114.46 gain 221 7 -117.24 gain 7 222 -115.21 gain 222 7 -119.36 gain 7 223 -113.43 gain 223 7 -119.59 gain 7 224 -117.04 gain 224 7 -123.70 gain 8 9 -87.36 gain 9 8 -82.85 gain 8 10 -92.24 gain 10 8 -90.03 gain 8 11 -100.58 gain 11 8 -99.81 gain 8 12 -109.62 gain 12 8 -106.82 gain 8 13 -104.88 gain 13 8 -98.30 gain 8 14 -108.89 gain 14 8 -104.94 gain 8 15 -117.25 gain 15 8 -109.43 gain 8 16 -117.38 gain 16 8 -110.81 gain 8 17 -106.89 gain 17 8 -103.10 gain 8 18 -109.79 gain 18 8 -106.99 gain 8 19 -97.36 gain 19 8 -95.61 gain 8 20 -91.05 gain 20 8 -87.42 gain 8 21 -102.60 gain 21 8 -99.22 gain 8 22 -92.47 gain 22 8 -92.31 gain 8 23 -90.07 gain 23 8 -89.22 gain 8 24 -94.58 gain 24 8 -96.61 gain 8 25 -96.89 gain 25 8 -94.73 gain 8 26 -106.78 gain 26 8 -103.96 gain 8 27 -105.94 gain 27 8 -103.62 gain 8 28 -110.73 gain 28 8 -106.12 gain 8 29 -112.02 gain 29 8 -113.07 gain 8 30 -108.84 gain 30 8 -107.55 gain 8 31 -114.02 gain 31 8 -111.10 gain 8 32 -112.91 gain 32 8 -109.74 gain 8 33 -110.08 gain 33 8 -107.08 gain 8 34 -109.72 gain 34 8 -104.61 gain 8 35 -108.76 gain 35 8 -106.04 gain 8 36 -99.40 gain 36 8 -98.36 gain 8 37 -94.56 gain 37 8 -95.46 gain 8 38 -90.96 gain 38 8 -84.03 gain 8 39 -98.92 gain 39 8 -93.59 gain 8 40 -100.30 gain 40 8 -96.14 gain 8 41 -102.85 gain 41 8 -100.76 gain 8 42 -105.47 gain 42 8 -101.02 gain 8 43 -111.53 gain 43 8 -105.85 gain 8 44 -119.34 gain 44 8 -116.74 gain 8 45 -116.17 gain 45 8 -114.49 gain 8 46 -120.09 gain 46 8 -118.33 gain 8 47 -110.02 gain 47 8 -106.19 gain 8 48 -114.86 gain 48 8 -114.91 gain 8 49 -107.66 gain 49 8 -106.56 gain 8 50 -109.86 gain 50 8 -105.12 gain 8 51 -103.98 gain 51 8 -97.71 gain 8 52 -101.06 gain 52 8 -102.07 gain 8 53 -102.40 gain 53 8 -97.93 gain 8 54 -104.81 gain 54 8 -103.91 gain 8 55 -107.39 gain 55 8 -101.64 gain 8 56 -100.75 gain 56 8 -99.90 gain 8 57 -112.21 gain 57 8 -108.15 gain 8 58 -111.56 gain 58 8 -109.21 gain 8 59 -108.91 gain 59 8 -108.99 gain 8 60 -121.34 gain 60 8 -118.70 gain 8 61 -116.58 gain 61 8 -115.39 gain 8 62 -118.52 gain 62 8 -116.88 gain 8 63 -108.47 gain 63 8 -108.06 gain 8 64 -107.97 gain 64 8 -102.36 gain 8 65 -113.49 gain 65 8 -106.47 gain 8 66 -100.68 gain 66 8 -96.73 gain 8 67 -102.37 gain 67 8 -97.30 gain 8 68 -107.68 gain 68 8 -109.91 gain 8 69 -102.12 gain 69 8 -98.07 gain 8 70 -108.03 gain 70 8 -105.50 gain 8 71 -111.86 gain 71 8 -109.20 gain 8 72 -107.62 gain 72 8 -102.93 gain 8 73 -107.41 gain 73 8 -103.56 gain 8 74 -110.46 gain 74 8 -108.90 gain 8 75 -120.25 gain 75 8 -116.36 gain 8 76 -120.52 gain 76 8 -117.66 gain 8 77 -113.99 gain 77 8 -114.09 gain 8 78 -120.53 gain 78 8 -117.54 gain 8 79 -110.80 gain 79 8 -105.75 gain 8 80 -113.28 gain 80 8 -109.74 gain 8 81 -101.54 gain 81 8 -95.96 gain 8 82 -110.89 gain 82 8 -108.16 gain 8 83 -107.20 gain 83 8 -104.26 gain 8 84 -104.07 gain 84 8 -98.93 gain 8 85 -107.32 gain 85 8 -100.46 gain 8 86 -112.33 gain 86 8 -113.85 gain 8 87 -117.37 gain 87 8 -114.55 gain 8 88 -104.53 gain 88 8 -102.25 gain 8 89 -114.80 gain 89 8 -112.78 gain 8 90 -113.56 gain 90 8 -112.91 gain 8 91 -120.56 gain 91 8 -119.19 gain 8 92 -116.97 gain 92 8 -116.17 gain 8 93 -113.23 gain 93 8 -113.97 gain 8 94 -114.99 gain 94 8 -110.64 gain 8 95 -114.91 gain 95 8 -113.79 gain 8 96 -111.24 gain 96 8 -105.58 gain 8 97 -115.44 gain 97 8 -113.19 gain 8 98 -115.30 gain 98 8 -111.79 gain 8 99 -115.11 gain 99 8 -115.24 gain 8 100 -112.40 gain 100 8 -114.24 gain 8 101 -110.61 gain 101 8 -108.38 gain 8 102 -116.34 gain 102 8 -114.24 gain 8 103 -111.69 gain 103 8 -109.43 gain 8 104 -118.27 gain 104 8 -111.83 gain 8 105 -122.49 gain 105 8 -121.38 gain 8 106 -120.48 gain 106 8 -118.08 gain 8 107 -118.92 gain 107 8 -116.82 gain 8 108 -123.78 gain 108 8 -121.34 gain 8 109 -112.51 gain 109 8 -111.92 gain 8 110 -110.74 gain 110 8 -107.22 gain 8 111 -106.91 gain 111 8 -106.05 gain 8 112 -115.11 gain 112 8 -114.00 gain 8 113 -119.02 gain 113 8 -119.60 gain 8 114 -110.71 gain 114 8 -108.20 gain 8 115 -111.00 gain 115 8 -103.41 gain 8 116 -114.27 gain 116 8 -112.42 gain 8 117 -113.82 gain 117 8 -114.77 gain 8 118 -115.17 gain 118 8 -113.50 gain 8 119 -121.53 gain 119 8 -119.33 gain 8 120 -116.46 gain 120 8 -109.81 gain 8 121 -113.97 gain 121 8 -110.10 gain 8 122 -126.81 gain 122 8 -125.44 gain 8 123 -116.74 gain 123 8 -112.88 gain 8 124 -120.64 gain 124 8 -116.78 gain 8 125 -119.21 gain 125 8 -116.96 gain 8 126 -117.77 gain 126 8 -111.83 gain 8 127 -117.98 gain 127 8 -113.62 gain 8 128 -118.04 gain 128 8 -115.55 gain 8 129 -112.48 gain 129 8 -107.39 gain 8 130 -114.89 gain 130 8 -112.49 gain 8 131 -121.66 gain 131 8 -117.12 gain 8 132 -120.44 gain 132 8 -118.51 gain 8 133 -125.60 gain 133 8 -121.79 gain 8 134 -120.84 gain 134 8 -116.82 gain 8 135 -122.25 gain 135 8 -119.94 gain 8 136 -114.30 gain 136 8 -113.28 gain 8 137 -115.24 gain 137 8 -112.00 gain 8 138 -122.79 gain 138 8 -115.78 gain 8 139 -111.03 gain 139 8 -105.93 gain 8 140 -116.80 gain 140 8 -117.76 gain 8 141 -115.16 gain 141 8 -111.00 gain 8 142 -116.27 gain 142 8 -116.92 gain 8 143 -109.93 gain 143 8 -106.13 gain 8 144 -115.49 gain 144 8 -112.59 gain 8 145 -121.57 gain 145 8 -118.26 gain 8 146 -114.31 gain 146 8 -108.56 gain 8 147 -116.54 gain 147 8 -114.64 gain 8 148 -124.18 gain 148 8 -121.20 gain 8 149 -125.96 gain 149 8 -122.24 gain 8 150 -116.15 gain 150 8 -117.54 gain 8 151 -123.97 gain 151 8 -118.92 gain 8 152 -118.33 gain 152 8 -115.11 gain 8 153 -122.09 gain 153 8 -121.29 gain 8 154 -116.66 gain 154 8 -111.48 gain 8 155 -116.35 gain 155 8 -115.00 gain 8 156 -123.85 gain 156 8 -120.52 gain 8 157 -118.90 gain 157 8 -117.53 gain 8 158 -117.25 gain 158 8 -116.31 gain 8 159 -118.98 gain 159 8 -111.68 gain 8 160 -125.01 gain 160 8 -119.98 gain 8 161 -120.28 gain 161 8 -118.11 gain 8 162 -119.56 gain 162 8 -114.47 gain 8 163 -119.70 gain 163 8 -111.80 gain 8 164 -117.53 gain 164 8 -111.37 gain 8 165 -113.76 gain 165 8 -110.53 gain 8 166 -131.94 gain 166 8 -131.40 gain 8 167 -118.63 gain 167 8 -117.21 gain 8 168 -121.36 gain 168 8 -121.28 gain 8 169 -113.18 gain 169 8 -105.45 gain 8 170 -120.76 gain 170 8 -123.52 gain 8 171 -124.45 gain 171 8 -123.64 gain 8 172 -117.95 gain 172 8 -110.23 gain 8 173 -117.92 gain 173 8 -114.87 gain 8 174 -116.47 gain 174 8 -113.18 gain 8 175 -117.95 gain 175 8 -113.86 gain 8 176 -123.42 gain 176 8 -119.28 gain 8 177 -111.89 gain 177 8 -109.24 gain 8 178 -122.76 gain 178 8 -121.07 gain 8 179 -117.57 gain 179 8 -116.90 gain 8 180 -128.49 gain 180 8 -123.62 gain 8 181 -119.13 gain 181 8 -118.70 gain 8 182 -122.86 gain 182 8 -118.74 gain 8 183 -116.29 gain 183 8 -113.47 gain 8 184 -121.21 gain 184 8 -120.44 gain 8 185 -114.34 gain 185 8 -108.99 gain 8 186 -123.11 gain 186 8 -116.77 gain 8 187 -121.80 gain 187 8 -119.54 gain 8 188 -119.27 gain 188 8 -119.77 gain 8 189 -115.91 gain 189 8 -115.81 gain 8 190 -114.05 gain 190 8 -109.61 gain 8 191 -122.85 gain 191 8 -121.45 gain 8 192 -118.13 gain 192 8 -114.05 gain 8 193 -128.56 gain 193 8 -128.45 gain 8 194 -121.18 gain 194 8 -120.64 gain 8 195 -122.00 gain 195 8 -119.65 gain 8 196 -121.15 gain 196 8 -117.82 gain 8 197 -124.82 gain 197 8 -124.17 gain 8 198 -120.55 gain 198 8 -123.83 gain 8 199 -120.04 gain 199 8 -114.88 gain 8 200 -125.21 gain 200 8 -116.83 gain 8 201 -115.94 gain 201 8 -111.37 gain 8 202 -123.68 gain 202 8 -120.64 gain 8 203 -120.72 gain 203 8 -114.31 gain 8 204 -116.10 gain 204 8 -116.77 gain 8 205 -114.71 gain 205 8 -113.45 gain 8 206 -124.21 gain 206 8 -120.93 gain 8 207 -119.13 gain 207 8 -116.61 gain 8 208 -128.32 gain 208 8 -125.97 gain 8 209 -128.14 gain 209 8 -121.79 gain 8 210 -129.35 gain 210 8 -129.59 gain 8 211 -122.81 gain 211 8 -119.30 gain 8 212 -119.99 gain 212 8 -114.03 gain 8 213 -119.51 gain 213 8 -118.43 gain 8 214 -128.38 gain 214 8 -123.59 gain 8 215 -122.95 gain 215 8 -119.26 gain 8 216 -119.99 gain 216 8 -117.12 gain 8 217 -124.30 gain 217 8 -125.25 gain 8 218 -125.27 gain 218 8 -118.41 gain 8 219 -121.96 gain 219 8 -117.92 gain 8 220 -113.91 gain 220 8 -106.21 gain 8 221 -124.52 gain 221 8 -121.33 gain 8 222 -129.17 gain 222 8 -127.35 gain 8 223 -122.66 gain 223 8 -122.85 gain 8 224 -120.00 gain 224 8 -120.69 gain 9 10 -87.78 gain 10 9 -90.09 gain 9 11 -94.17 gain 11 9 -97.92 gain 9 12 -101.43 gain 12 9 -103.15 gain 9 13 -98.54 gain 13 9 -96.47 gain 9 14 -103.19 gain 14 9 -103.74 gain 9 15 -114.92 gain 15 9 -111.61 gain 9 16 -108.56 gain 16 9 -106.50 gain 9 17 -106.39 gain 17 9 -107.11 gain 9 18 -106.28 gain 18 9 -108.00 gain 9 19 -98.48 gain 19 9 -101.24 gain 9 20 -103.09 gain 20 9 -103.96 gain 9 21 -92.72 gain 21 9 -93.84 gain 9 22 -96.82 gain 22 9 -101.17 gain 9 23 -87.07 gain 23 9 -90.73 gain 9 24 -81.78 gain 24 9 -88.32 gain 9 25 -88.76 gain 25 9 -91.11 gain 9 26 -97.91 gain 26 9 -99.60 gain 9 27 -94.45 gain 27 9 -96.65 gain 9 28 -101.15 gain 28 9 -101.06 gain 9 29 -103.78 gain 29 9 -109.33 gain 9 30 -109.39 gain 30 9 -112.61 gain 9 31 -111.65 gain 31 9 -113.24 gain 9 32 -109.15 gain 32 9 -110.49 gain 9 33 -101.03 gain 33 9 -102.55 gain 9 34 -108.95 gain 34 9 -108.35 gain 9 35 -108.34 gain 35 9 -110.14 gain 9 36 -101.89 gain 36 9 -105.37 gain 9 37 -96.61 gain 37 9 -102.02 gain 9 38 -95.83 gain 38 9 -93.41 gain 9 39 -92.56 gain 39 9 -91.75 gain 9 40 -94.20 gain 40 9 -94.56 gain 9 41 -90.68 gain 41 9 -93.11 gain 9 42 -99.17 gain 42 9 -99.23 gain 9 43 -107.80 gain 43 9 -106.63 gain 9 44 -109.88 gain 44 9 -111.79 gain 9 45 -108.64 gain 45 9 -111.48 gain 9 46 -111.35 gain 46 9 -114.11 gain 9 47 -108.52 gain 47 9 -109.21 gain 9 48 -109.77 gain 48 9 -114.33 gain 9 49 -108.80 gain 49 9 -112.21 gain 9 50 -100.28 gain 50 9 -100.05 gain 9 51 -100.32 gain 51 9 -98.57 gain 9 52 -93.93 gain 52 9 -99.46 gain 9 53 -100.23 gain 53 9 -100.27 gain 9 54 -97.33 gain 54 9 -100.95 gain 9 55 -92.60 gain 55 9 -91.37 gain 9 56 -96.73 gain 56 9 -100.39 gain 9 57 -105.43 gain 57 9 -105.88 gain 9 58 -107.55 gain 58 9 -109.70 gain 9 59 -110.76 gain 59 9 -115.36 gain 9 60 -116.84 gain 60 9 -118.72 gain 9 61 -106.50 gain 61 9 -109.82 gain 9 62 -109.82 gain 62 9 -112.69 gain 9 63 -116.45 gain 63 9 -120.56 gain 9 64 -108.20 gain 64 9 -107.10 gain 9 65 -103.89 gain 65 9 -101.38 gain 9 66 -106.08 gain 66 9 -106.64 gain 9 67 -94.94 gain 67 9 -94.38 gain 9 68 -96.65 gain 68 9 -103.39 gain 9 69 -97.63 gain 69 9 -98.09 gain 9 70 -102.93 gain 70 9 -104.91 gain 9 71 -107.16 gain 71 9 -109.01 gain 9 72 -103.27 gain 72 9 -103.10 gain 9 73 -109.74 gain 73 9 -110.41 gain 9 74 -105.94 gain 74 9 -108.89 gain 9 75 -110.14 gain 75 9 -110.77 gain 9 76 -108.66 gain 76 9 -110.30 gain 9 77 -115.34 gain 77 9 -119.95 gain 9 78 -113.77 gain 78 9 -115.30 gain 9 79 -117.41 gain 79 9 -116.86 gain 9 80 -112.81 gain 80 9 -113.78 gain 9 81 -99.96 gain 81 9 -98.90 gain 9 82 -106.11 gain 82 9 -107.89 gain 9 83 -101.42 gain 83 9 -103.00 gain 9 84 -113.38 gain 84 9 -112.75 gain 9 85 -111.54 gain 85 9 -109.19 gain 9 86 -116.36 gain 86 9 -122.40 gain 9 87 -105.86 gain 87 9 -107.55 gain 9 88 -105.89 gain 88 9 -108.12 gain 9 89 -103.25 gain 89 9 -105.74 gain 9 90 -110.65 gain 90 9 -114.51 gain 9 91 -119.59 gain 91 9 -122.73 gain 9 92 -112.89 gain 92 9 -116.60 gain 9 93 -109.43 gain 93 9 -114.68 gain 9 94 -113.83 gain 94 9 -113.99 gain 9 95 -105.56 gain 95 9 -108.95 gain 9 96 -107.16 gain 96 9 -106.00 gain 9 97 -111.29 gain 97 9 -113.55 gain 9 98 -103.93 gain 98 9 -104.94 gain 9 99 -108.02 gain 99 9 -112.66 gain 9 100 -108.13 gain 100 9 -114.49 gain 9 101 -113.27 gain 101 9 -115.55 gain 9 102 -115.32 gain 102 9 -117.74 gain 9 103 -109.64 gain 103 9 -111.89 gain 9 104 -111.97 gain 104 9 -110.04 gain 9 105 -113.81 gain 105 9 -117.21 gain 9 106 -114.67 gain 106 9 -116.79 gain 9 107 -114.70 gain 107 9 -117.11 gain 9 108 -109.92 gain 108 9 -111.99 gain 9 109 -105.58 gain 109 9 -109.51 gain 9 110 -107.49 gain 110 9 -108.48 gain 9 111 -110.51 gain 111 9 -114.16 gain 9 112 -110.25 gain 112 9 -113.65 gain 9 113 -112.21 gain 113 9 -117.31 gain 9 114 -106.61 gain 114 9 -108.61 gain 9 115 -114.33 gain 115 9 -111.25 gain 9 116 -108.34 gain 116 9 -111.01 gain 9 117 -115.59 gain 117 9 -121.06 gain 9 118 -115.83 gain 118 9 -118.68 gain 9 119 -108.98 gain 119 9 -111.30 gain 9 120 -115.18 gain 120 9 -113.04 gain 9 121 -119.15 gain 121 9 -119.78 gain 9 122 -105.33 gain 122 9 -108.47 gain 9 123 -114.86 gain 123 9 -115.53 gain 9 124 -117.79 gain 124 9 -118.45 gain 9 125 -105.52 gain 125 9 -107.78 gain 9 126 -115.49 gain 126 9 -114.06 gain 9 127 -114.32 gain 127 9 -114.47 gain 9 128 -104.24 gain 128 9 -106.26 gain 9 129 -111.90 gain 129 9 -111.32 gain 9 130 -109.38 gain 130 9 -111.48 gain 9 131 -106.01 gain 131 9 -105.98 gain 9 132 -107.75 gain 132 9 -110.34 gain 9 133 -109.27 gain 133 9 -109.97 gain 9 134 -111.91 gain 134 9 -112.40 gain 9 135 -113.31 gain 135 9 -115.51 gain 9 136 -109.20 gain 136 9 -112.69 gain 9 137 -119.43 gain 137 9 -120.70 gain 9 138 -114.07 gain 138 9 -111.58 gain 9 139 -117.03 gain 139 9 -116.44 gain 9 140 -117.50 gain 140 9 -122.97 gain 9 141 -120.56 gain 141 9 -120.91 gain 9 142 -110.75 gain 142 9 -115.91 gain 9 143 -110.71 gain 143 9 -111.42 gain 9 144 -112.74 gain 144 9 -114.35 gain 9 145 -112.00 gain 145 9 -113.21 gain 9 146 -114.44 gain 146 9 -113.20 gain 9 147 -119.69 gain 147 9 -122.30 gain 9 148 -123.43 gain 148 9 -124.97 gain 9 149 -106.81 gain 149 9 -107.60 gain 9 150 -111.21 gain 150 9 -117.12 gain 9 151 -120.99 gain 151 9 -120.45 gain 9 152 -109.37 gain 152 9 -110.66 gain 9 153 -112.15 gain 153 9 -115.87 gain 9 154 -116.88 gain 154 9 -116.21 gain 9 155 -112.94 gain 155 9 -116.10 gain 9 156 -112.71 gain 156 9 -113.89 gain 9 157 -108.18 gain 157 9 -111.32 gain 9 158 -115.72 gain 158 9 -119.30 gain 9 159 -116.28 gain 159 9 -113.49 gain 9 160 -103.49 gain 160 9 -102.97 gain 9 161 -110.93 gain 161 9 -113.28 gain 9 162 -119.06 gain 162 9 -118.48 gain 9 163 -111.97 gain 163 9 -108.59 gain 9 164 -115.43 gain 164 9 -113.78 gain 9 165 -120.70 gain 165 9 -121.99 gain 9 166 -111.79 gain 166 9 -115.75 gain 9 167 -115.39 gain 167 9 -118.48 gain 9 168 -122.29 gain 168 9 -126.73 gain 9 169 -109.59 gain 169 9 -106.38 gain 9 170 -115.29 gain 170 9 -122.57 gain 9 171 -120.38 gain 171 9 -124.08 gain 9 172 -116.68 gain 172 9 -113.48 gain 9 173 -113.96 gain 173 9 -115.42 gain 9 174 -116.91 gain 174 9 -118.13 gain 9 175 -117.50 gain 175 9 -117.92 gain 9 176 -126.45 gain 176 9 -126.83 gain 9 177 -115.57 gain 177 9 -117.44 gain 9 178 -104.52 gain 178 9 -107.34 gain 9 179 -112.35 gain 179 9 -116.20 gain 9 180 -113.39 gain 180 9 -113.04 gain 9 181 -123.89 gain 181 9 -127.98 gain 9 182 -117.95 gain 182 9 -118.34 gain 9 183 -115.87 gain 183 9 -117.56 gain 9 184 -122.02 gain 184 9 -125.76 gain 9 185 -114.81 gain 185 9 -113.97 gain 9 186 -112.56 gain 186 9 -110.73 gain 9 187 -111.83 gain 187 9 -114.09 gain 9 188 -116.35 gain 188 9 -121.36 gain 9 189 -119.77 gain 189 9 -124.18 gain 9 190 -117.80 gain 190 9 -117.87 gain 9 191 -110.74 gain 191 9 -113.85 gain 9 192 -112.44 gain 192 9 -112.87 gain 9 193 -122.76 gain 193 9 -127.16 gain 9 194 -112.37 gain 194 9 -116.35 gain 9 195 -115.11 gain 195 9 -117.27 gain 9 196 -122.38 gain 196 9 -123.57 gain 9 197 -120.62 gain 197 9 -124.49 gain 9 198 -117.68 gain 198 9 -125.47 gain 9 199 -117.62 gain 199 9 -116.98 gain 9 200 -114.55 gain 200 9 -110.68 gain 9 201 -117.32 gain 201 9 -117.27 gain 9 202 -123.45 gain 202 9 -124.93 gain 9 203 -118.63 gain 203 9 -116.74 gain 9 204 -112.69 gain 204 9 -117.88 gain 9 205 -117.33 gain 205 9 -120.59 gain 9 206 -115.84 gain 206 9 -117.07 gain 9 207 -121.79 gain 207 9 -123.78 gain 9 208 -120.09 gain 208 9 -122.26 gain 9 209 -122.05 gain 209 9 -120.22 gain 9 210 -125.08 gain 210 9 -129.83 gain 9 211 -123.08 gain 211 9 -124.10 gain 9 212 -125.32 gain 212 9 -123.87 gain 9 213 -112.42 gain 213 9 -115.85 gain 9 214 -112.71 gain 214 9 -112.44 gain 9 215 -120.23 gain 215 9 -121.04 gain 9 216 -112.54 gain 216 9 -114.18 gain 9 217 -123.12 gain 217 9 -128.58 gain 9 218 -120.34 gain 218 9 -117.99 gain 9 219 -121.71 gain 219 9 -122.19 gain 9 220 -120.06 gain 220 9 -116.88 gain 9 221 -114.52 gain 221 9 -115.84 gain 9 222 -108.41 gain 222 9 -111.10 gain 9 223 -121.90 gain 223 9 -126.61 gain 9 224 -118.71 gain 224 9 -123.92 gain 10 11 -85.18 gain 11 10 -86.62 gain 10 12 -100.10 gain 12 10 -99.50 gain 10 13 -105.42 gain 13 10 -101.05 gain 10 14 -107.10 gain 14 10 -105.35 gain 10 15 -110.30 gain 15 10 -104.69 gain 10 16 -112.10 gain 16 10 -107.73 gain 10 17 -108.72 gain 17 10 -107.15 gain 10 18 -108.37 gain 18 10 -107.78 gain 10 19 -109.54 gain 19 10 -109.99 gain 10 20 -108.31 gain 20 10 -106.88 gain 10 21 -103.86 gain 21 10 -102.68 gain 10 22 -99.00 gain 22 10 -101.04 gain 10 23 -99.85 gain 23 10 -101.20 gain 10 24 -87.19 gain 24 10 -91.43 gain 10 25 -84.91 gain 25 10 -84.95 gain 10 26 -87.04 gain 26 10 -86.43 gain 10 27 -98.11 gain 27 10 -98.00 gain 10 28 -95.75 gain 28 10 -93.35 gain 10 29 -106.65 gain 29 10 -109.89 gain 10 30 -116.73 gain 30 10 -117.65 gain 10 31 -118.55 gain 31 10 -117.83 gain 10 32 -113.23 gain 32 10 -112.26 gain 10 33 -119.01 gain 33 10 -118.22 gain 10 34 -106.86 gain 34 10 -103.95 gain 10 35 -104.68 gain 35 10 -104.17 gain 10 36 -106.59 gain 36 10 -107.77 gain 10 37 -98.33 gain 37 10 -101.44 gain 10 38 -101.58 gain 38 10 -96.86 gain 10 39 -92.32 gain 39 10 -89.19 gain 10 40 -91.99 gain 40 10 -90.04 gain 10 41 -95.92 gain 41 10 -96.05 gain 10 42 -90.39 gain 42 10 -88.14 gain 10 43 -102.48 gain 43 10 -99.01 gain 10 44 -107.97 gain 44 10 -107.57 gain 10 45 -119.60 gain 45 10 -120.14 gain 10 46 -107.65 gain 46 10 -108.10 gain 10 47 -110.31 gain 47 10 -108.70 gain 10 48 -112.48 gain 48 10 -114.73 gain 10 49 -104.65 gain 49 10 -105.75 gain 10 50 -115.00 gain 50 10 -112.46 gain 10 51 -105.55 gain 51 10 -101.49 gain 10 52 -107.82 gain 52 10 -111.04 gain 10 53 -105.53 gain 53 10 -103.26 gain 10 54 -98.30 gain 54 10 -99.61 gain 10 55 -100.49 gain 55 10 -96.95 gain 10 56 -103.45 gain 56 10 -104.81 gain 10 57 -102.82 gain 57 10 -100.96 gain 10 58 -102.12 gain 58 10 -101.97 gain 10 59 -111.51 gain 59 10 -113.80 gain 10 60 -113.94 gain 60 10 -113.52 gain 10 61 -117.73 gain 61 10 -118.74 gain 10 62 -115.83 gain 62 10 -116.40 gain 10 63 -117.81 gain 63 10 -119.61 gain 10 64 -108.90 gain 64 10 -105.49 gain 10 65 -116.93 gain 65 10 -112.12 gain 10 66 -106.12 gain 66 10 -104.38 gain 10 67 -107.36 gain 67 10 -104.50 gain 10 68 -105.91 gain 68 10 -110.34 gain 10 69 -101.05 gain 69 10 -99.20 gain 10 70 -105.64 gain 70 10 -105.32 gain 10 71 -103.66 gain 71 10 -103.21 gain 10 72 -105.17 gain 72 10 -102.69 gain 10 73 -107.69 gain 73 10 -106.05 gain 10 74 -104.96 gain 74 10 -105.61 gain 10 75 -120.72 gain 75 10 -119.05 gain 10 76 -119.86 gain 76 10 -119.20 gain 10 77 -120.25 gain 77 10 -122.56 gain 10 78 -116.90 gain 78 10 -116.11 gain 10 79 -110.77 gain 79 10 -107.92 gain 10 80 -117.46 gain 80 10 -116.12 gain 10 81 -107.68 gain 81 10 -104.31 gain 10 82 -115.04 gain 82 10 -114.52 gain 10 83 -104.68 gain 83 10 -103.95 gain 10 84 -102.49 gain 84 10 -99.56 gain 10 85 -110.36 gain 85 10 -105.71 gain 10 86 -114.43 gain 86 10 -118.16 gain 10 87 -108.66 gain 87 10 -108.04 gain 10 88 -108.49 gain 88 10 -108.41 gain 10 89 -109.36 gain 89 10 -109.54 gain 10 90 -120.44 gain 90 10 -121.99 gain 10 91 -117.21 gain 91 10 -118.05 gain 10 92 -115.33 gain 92 10 -116.74 gain 10 93 -109.99 gain 93 10 -112.94 gain 10 94 -113.91 gain 94 10 -111.76 gain 10 95 -108.93 gain 95 10 -110.01 gain 10 96 -112.47 gain 96 10 -109.01 gain 10 97 -108.45 gain 97 10 -108.40 gain 10 98 -111.09 gain 98 10 -109.79 gain 10 99 -103.38 gain 99 10 -105.72 gain 10 100 -105.66 gain 100 10 -109.71 gain 10 101 -102.10 gain 101 10 -102.08 gain 10 102 -101.13 gain 102 10 -101.24 gain 10 103 -109.04 gain 103 10 -108.98 gain 10 104 -108.01 gain 104 10 -103.78 gain 10 105 -119.54 gain 105 10 -120.63 gain 10 106 -118.67 gain 106 10 -118.47 gain 10 107 -118.45 gain 107 10 -118.56 gain 10 108 -117.54 gain 108 10 -117.31 gain 10 109 -116.10 gain 109 10 -117.72 gain 10 110 -111.64 gain 110 10 -110.33 gain 10 111 -112.96 gain 111 10 -114.31 gain 10 112 -112.40 gain 112 10 -113.50 gain 10 113 -112.80 gain 113 10 -115.59 gain 10 114 -105.47 gain 114 10 -105.17 gain 10 115 -106.89 gain 115 10 -101.50 gain 10 116 -108.93 gain 116 10 -109.29 gain 10 117 -115.12 gain 117 10 -118.28 gain 10 118 -113.26 gain 118 10 -113.80 gain 10 119 -115.53 gain 119 10 -115.54 gain 10 120 -121.09 gain 120 10 -116.65 gain 10 121 -110.84 gain 121 10 -109.17 gain 10 122 -115.95 gain 122 10 -116.79 gain 10 123 -121.44 gain 123 10 -119.79 gain 10 124 -113.98 gain 124 10 -112.32 gain 10 125 -120.05 gain 125 10 -120.00 gain 10 126 -113.17 gain 126 10 -109.44 gain 10 127 -116.70 gain 127 10 -114.55 gain 10 128 -113.84 gain 128 10 -113.55 gain 10 129 -114.86 gain 129 10 -111.98 gain 10 130 -110.44 gain 130 10 -110.24 gain 10 131 -111.21 gain 131 10 -108.87 gain 10 132 -119.21 gain 132 10 -119.50 gain 10 133 -111.47 gain 133 10 -109.86 gain 10 134 -114.88 gain 134 10 -113.07 gain 10 135 -117.77 gain 135 10 -117.67 gain 10 136 -115.02 gain 136 10 -116.21 gain 10 137 -125.29 gain 137 10 -124.26 gain 10 138 -113.79 gain 138 10 -108.99 gain 10 139 -112.86 gain 139 10 -109.96 gain 10 140 -111.43 gain 140 10 -114.59 gain 10 141 -111.91 gain 141 10 -109.95 gain 10 142 -114.55 gain 142 10 -117.41 gain 10 143 -117.44 gain 143 10 -115.84 gain 10 144 -112.20 gain 144 10 -111.50 gain 10 145 -109.19 gain 145 10 -108.09 gain 10 146 -117.05 gain 146 10 -113.51 gain 10 147 -116.28 gain 147 10 -116.58 gain 10 148 -118.48 gain 148 10 -117.72 gain 10 149 -115.93 gain 149 10 -114.41 gain 10 150 -126.65 gain 150 10 -130.25 gain 10 151 -120.50 gain 151 10 -117.66 gain 10 152 -119.38 gain 152 10 -118.37 gain 10 153 -121.58 gain 153 10 -123.00 gain 10 154 -121.21 gain 154 10 -118.23 gain 10 155 -119.86 gain 155 10 -120.72 gain 10 156 -112.16 gain 156 10 -111.03 gain 10 157 -118.32 gain 157 10 -119.16 gain 10 158 -118.45 gain 158 10 -119.72 gain 10 159 -115.64 gain 159 10 -110.55 gain 10 160 -113.48 gain 160 10 -110.66 gain 10 161 -117.62 gain 161 10 -117.66 gain 10 162 -122.14 gain 162 10 -119.26 gain 10 163 -124.94 gain 163 10 -119.25 gain 10 164 -115.83 gain 164 10 -111.88 gain 10 165 -112.21 gain 165 10 -111.19 gain 10 166 -114.40 gain 166 10 -116.05 gain 10 167 -118.53 gain 167 10 -119.31 gain 10 168 -112.48 gain 168 10 -114.61 gain 10 169 -110.67 gain 169 10 -105.15 gain 10 170 -113.31 gain 170 10 -118.28 gain 10 171 -118.93 gain 171 10 -120.32 gain 10 172 -119.23 gain 172 10 -113.72 gain 10 173 -122.72 gain 173 10 -121.88 gain 10 174 -119.06 gain 174 10 -117.97 gain 10 175 -113.00 gain 175 10 -111.12 gain 10 176 -114.87 gain 176 10 -112.94 gain 10 177 -118.51 gain 177 10 -118.07 gain 10 178 -122.58 gain 178 10 -123.10 gain 10 179 -126.13 gain 179 10 -127.67 gain 10 180 -121.96 gain 180 10 -119.31 gain 10 181 -123.73 gain 181 10 -125.52 gain 10 182 -123.80 gain 182 10 -121.89 gain 10 183 -122.44 gain 183 10 -121.82 gain 10 184 -124.76 gain 184 10 -126.20 gain 10 185 -124.68 gain 185 10 -121.54 gain 10 186 -121.16 gain 186 10 -117.02 gain 10 187 -115.28 gain 187 10 -115.23 gain 10 188 -122.36 gain 188 10 -125.07 gain 10 189 -113.81 gain 189 10 -115.91 gain 10 190 -117.10 gain 190 10 -114.87 gain 10 191 -115.28 gain 191 10 -116.08 gain 10 192 -119.22 gain 192 10 -117.35 gain 10 193 -113.56 gain 193 10 -115.65 gain 10 194 -113.54 gain 194 10 -115.21 gain 10 195 -122.34 gain 195 10 -122.20 gain 10 196 -122.29 gain 196 10 -121.18 gain 10 197 -123.21 gain 197 10 -124.76 gain 10 198 -119.16 gain 198 10 -124.65 gain 10 199 -120.47 gain 199 10 -117.53 gain 10 200 -116.67 gain 200 10 -110.49 gain 10 201 -123.37 gain 201 10 -121.02 gain 10 202 -121.19 gain 202 10 -120.36 gain 10 203 -116.12 gain 203 10 -111.91 gain 10 204 -118.53 gain 204 10 -121.41 gain 10 205 -119.41 gain 205 10 -120.36 gain 10 206 -117.18 gain 206 10 -116.10 gain 10 207 -126.38 gain 207 10 -126.07 gain 10 208 -120.21 gain 208 10 -120.07 gain 10 209 -123.06 gain 209 10 -118.92 gain 10 210 -122.85 gain 210 10 -125.29 gain 10 211 -122.54 gain 211 10 -121.24 gain 10 212 -118.76 gain 212 10 -115.01 gain 10 213 -118.69 gain 213 10 -119.81 gain 10 214 -120.79 gain 214 10 -118.21 gain 10 215 -118.90 gain 215 10 -117.41 gain 10 216 -120.30 gain 216 10 -119.64 gain 10 217 -115.23 gain 217 10 -118.39 gain 10 218 -117.12 gain 218 10 -112.47 gain 10 219 -116.72 gain 219 10 -114.88 gain 10 220 -122.76 gain 220 10 -117.28 gain 10 221 -122.67 gain 221 10 -121.69 gain 10 222 -121.57 gain 222 10 -121.96 gain 10 223 -122.67 gain 223 10 -125.07 gain 10 224 -117.47 gain 224 10 -120.37 gain 11 12 -89.17 gain 12 11 -87.13 gain 11 13 -96.55 gain 13 11 -90.73 gain 11 14 -108.37 gain 14 11 -105.17 gain 11 15 -126.72 gain 15 11 -119.67 gain 11 16 -122.90 gain 16 11 -117.09 gain 11 17 -108.11 gain 17 11 -105.09 gain 11 18 -112.24 gain 18 11 -110.21 gain 11 19 -112.61 gain 19 11 -111.62 gain 11 20 -115.64 gain 20 11 -112.77 gain 11 21 -103.43 gain 21 11 -100.81 gain 11 22 -113.06 gain 22 11 -113.66 gain 11 23 -102.21 gain 23 11 -102.12 gain 11 24 -98.93 gain 24 11 -101.72 gain 11 25 -91.04 gain 25 11 -89.64 gain 11 26 -88.44 gain 26 11 -86.39 gain 11 27 -94.32 gain 27 11 -92.76 gain 11 28 -96.72 gain 28 11 -92.88 gain 11 29 -102.80 gain 29 11 -104.60 gain 11 30 -121.48 gain 30 11 -120.95 gain 11 31 -120.46 gain 31 11 -118.30 gain 11 32 -121.63 gain 32 11 -119.22 gain 11 33 -114.74 gain 33 11 -112.51 gain 11 34 -116.90 gain 34 11 -112.55 gain 11 35 -107.99 gain 35 11 -106.03 gain 11 36 -103.89 gain 36 11 -103.62 gain 11 37 -105.13 gain 37 11 -106.79 gain 11 38 -117.16 gain 38 11 -110.99 gain 11 39 -95.19 gain 39 11 -90.63 gain 11 40 -97.12 gain 40 11 -93.73 gain 11 41 -97.24 gain 41 11 -95.92 gain 11 42 -91.96 gain 42 11 -88.27 gain 11 43 -102.85 gain 43 11 -97.93 gain 11 44 -110.73 gain 44 11 -108.88 gain 11 45 -123.77 gain 45 11 -122.86 gain 11 46 -125.69 gain 46 11 -124.70 gain 11 47 -119.25 gain 47 11 -116.19 gain 11 48 -118.60 gain 48 11 -119.40 gain 11 49 -112.58 gain 49 11 -112.25 gain 11 50 -115.92 gain 50 11 -111.93 gain 11 51 -106.97 gain 51 11 -101.46 gain 11 52 -109.42 gain 52 11 -111.19 gain 11 53 -111.51 gain 53 11 -107.80 gain 11 54 -108.18 gain 54 11 -108.04 gain 11 55 -108.65 gain 55 11 -103.66 gain 11 56 -101.36 gain 56 11 -101.27 gain 11 57 -100.30 gain 57 11 -97.00 gain 11 58 -108.26 gain 58 11 -106.66 gain 11 59 -103.68 gain 59 11 -104.52 gain 11 60 -120.73 gain 60 11 -118.86 gain 11 61 -116.07 gain 61 11 -115.63 gain 11 62 -117.76 gain 62 11 -116.88 gain 11 63 -116.68 gain 63 11 -117.04 gain 11 64 -112.52 gain 64 11 -107.66 gain 11 65 -113.55 gain 65 11 -107.29 gain 11 66 -108.56 gain 66 11 -105.37 gain 11 67 -110.49 gain 67 11 -106.18 gain 11 68 -109.04 gain 68 11 -112.03 gain 11 69 -108.83 gain 69 11 -105.54 gain 11 70 -105.50 gain 70 11 -103.73 gain 11 71 -114.40 gain 71 11 -112.50 gain 11 72 -105.56 gain 72 11 -101.63 gain 11 73 -102.08 gain 73 11 -99.00 gain 11 74 -105.97 gain 74 11 -105.17 gain 11 75 -117.37 gain 75 11 -114.25 gain 11 76 -120.28 gain 76 11 -118.18 gain 11 77 -113.11 gain 77 11 -113.97 gain 11 78 -116.30 gain 78 11 -114.07 gain 11 79 -117.45 gain 79 11 -113.15 gain 11 80 -112.37 gain 80 11 -109.59 gain 11 81 -117.74 gain 81 11 -112.93 gain 11 82 -115.57 gain 82 11 -113.61 gain 11 83 -109.37 gain 83 11 -107.19 gain 11 84 -106.88 gain 84 11 -102.50 gain 11 85 -108.83 gain 85 11 -102.73 gain 11 86 -109.29 gain 86 11 -111.58 gain 11 87 -106.27 gain 87 11 -104.21 gain 11 88 -104.06 gain 88 11 -102.54 gain 11 89 -111.65 gain 89 11 -110.39 gain 11 90 -125.37 gain 90 11 -125.48 gain 11 91 -127.87 gain 91 11 -127.27 gain 11 92 -117.24 gain 92 11 -117.21 gain 11 93 -110.37 gain 93 11 -111.87 gain 11 94 -113.26 gain 94 11 -109.67 gain 11 95 -113.25 gain 95 11 -112.89 gain 11 96 -111.84 gain 96 11 -106.93 gain 11 97 -111.85 gain 97 11 -110.35 gain 11 98 -108.58 gain 98 11 -105.84 gain 11 99 -108.77 gain 99 11 -109.66 gain 11 100 -115.54 gain 100 11 -118.15 gain 11 101 -111.03 gain 101 11 -109.56 gain 11 102 -106.30 gain 102 11 -104.96 gain 11 103 -107.83 gain 103 11 -106.32 gain 11 104 -111.37 gain 104 11 -105.69 gain 11 105 -118.32 gain 105 11 -117.96 gain 11 106 -114.27 gain 106 11 -112.64 gain 11 107 -118.37 gain 107 11 -117.04 gain 11 108 -119.57 gain 108 11 -117.89 gain 11 109 -122.98 gain 109 11 -123.15 gain 11 110 -112.76 gain 110 11 -110.00 gain 11 111 -117.72 gain 111 11 -117.62 gain 11 112 -106.26 gain 112 11 -105.91 gain 11 113 -115.15 gain 113 11 -116.50 gain 11 114 -110.88 gain 114 11 -109.13 gain 11 115 -110.22 gain 115 11 -103.39 gain 11 116 -113.82 gain 116 11 -112.74 gain 11 117 -112.32 gain 117 11 -114.03 gain 11 118 -117.15 gain 118 11 -116.25 gain 11 119 -110.25 gain 119 11 -108.82 gain 11 120 -119.80 gain 120 11 -113.91 gain 11 121 -121.96 gain 121 11 -118.85 gain 11 122 -118.32 gain 122 11 -117.71 gain 11 123 -120.91 gain 123 11 -117.83 gain 11 124 -119.13 gain 124 11 -116.04 gain 11 125 -119.33 gain 125 11 -117.84 gain 11 126 -119.75 gain 126 11 -114.57 gain 11 127 -117.20 gain 127 11 -113.60 gain 11 128 -110.21 gain 128 11 -108.48 gain 11 129 -114.02 gain 129 11 -109.69 gain 11 130 -114.84 gain 130 11 -113.19 gain 11 131 -117.56 gain 131 11 -113.78 gain 11 132 -115.58 gain 132 11 -114.41 gain 11 133 -111.36 gain 133 11 -108.30 gain 11 134 -116.15 gain 134 11 -112.89 gain 11 135 -118.60 gain 135 11 -117.05 gain 11 136 -122.67 gain 136 11 -122.41 gain 11 137 -118.11 gain 137 11 -115.64 gain 11 138 -117.37 gain 138 11 -111.13 gain 11 139 -110.40 gain 139 11 -106.05 gain 11 140 -120.84 gain 140 11 -122.56 gain 11 141 -110.50 gain 141 11 -107.10 gain 11 142 -119.38 gain 142 11 -120.80 gain 11 143 -119.87 gain 143 11 -116.83 gain 11 144 -121.63 gain 144 11 -119.49 gain 11 145 -112.46 gain 145 11 -109.92 gain 11 146 -118.32 gain 146 11 -113.33 gain 11 147 -108.72 gain 147 11 -107.58 gain 11 148 -114.19 gain 148 11 -111.98 gain 11 149 -117.45 gain 149 11 -114.49 gain 11 150 -123.16 gain 150 11 -125.31 gain 11 151 -120.17 gain 151 11 -115.88 gain 11 152 -132.48 gain 152 11 -130.01 gain 11 153 -126.25 gain 153 11 -126.22 gain 11 154 -119.68 gain 154 11 -115.27 gain 11 155 -122.39 gain 155 11 -121.80 gain 11 156 -112.21 gain 156 11 -109.64 gain 11 157 -115.19 gain 157 11 -114.58 gain 11 158 -120.27 gain 158 11 -120.09 gain 11 159 -114.76 gain 159 11 -108.22 gain 11 160 -126.35 gain 160 11 -122.09 gain 11 161 -119.15 gain 161 11 -117.75 gain 11 162 -112.51 gain 162 11 -108.19 gain 11 163 -116.71 gain 163 11 -109.57 gain 11 164 -110.94 gain 164 11 -105.54 gain 11 165 -123.06 gain 165 11 -120.59 gain 11 166 -130.16 gain 166 11 -130.38 gain 11 167 -123.90 gain 167 11 -123.23 gain 11 168 -118.68 gain 168 11 -119.37 gain 11 169 -129.72 gain 169 11 -122.76 gain 11 170 -119.50 gain 170 11 -123.02 gain 11 171 -121.58 gain 171 11 -121.52 gain 11 172 -120.60 gain 172 11 -113.64 gain 11 173 -112.61 gain 173 11 -110.32 gain 11 174 -123.42 gain 174 11 -120.89 gain 11 175 -120.64 gain 175 11 -117.32 gain 11 176 -113.73 gain 176 11 -110.36 gain 11 177 -110.92 gain 177 11 -109.04 gain 11 178 -120.15 gain 178 11 -119.21 gain 11 179 -119.53 gain 179 11 -119.63 gain 11 180 -119.64 gain 180 11 -115.53 gain 11 181 -127.67 gain 181 11 -128.01 gain 11 182 -120.92 gain 182 11 -117.56 gain 11 183 -117.16 gain 183 11 -115.10 gain 11 184 -118.87 gain 184 11 -118.86 gain 11 185 -125.82 gain 185 11 -121.23 gain 11 186 -122.53 gain 186 11 -116.95 gain 11 187 -115.15 gain 187 11 -113.65 gain 11 188 -119.56 gain 188 11 -120.82 gain 11 189 -123.74 gain 189 11 -124.40 gain 11 190 -119.70 gain 190 11 -116.03 gain 11 191 -119.16 gain 191 11 -118.52 gain 11 192 -116.62 gain 192 11 -113.30 gain 11 193 -117.77 gain 193 11 -118.42 gain 11 194 -121.58 gain 194 11 -121.80 gain 11 195 -127.59 gain 195 11 -126.01 gain 11 196 -123.18 gain 196 11 -120.61 gain 11 197 -120.56 gain 197 11 -120.67 gain 11 198 -121.63 gain 198 11 -125.68 gain 11 199 -127.55 gain 199 11 -123.16 gain 11 200 -122.49 gain 200 11 -114.87 gain 11 201 -113.04 gain 201 11 -109.24 gain 11 202 -124.28 gain 202 11 -122.00 gain 11 203 -121.45 gain 203 11 -115.80 gain 11 204 -127.17 gain 204 11 -128.61 gain 11 205 -120.37 gain 205 11 -119.87 gain 11 206 -125.42 gain 206 11 -122.89 gain 11 207 -120.30 gain 207 11 -118.54 gain 11 208 -127.31 gain 208 11 -125.72 gain 11 209 -119.67 gain 209 11 -114.09 gain 11 210 -126.21 gain 210 11 -127.21 gain 11 211 -116.44 gain 211 11 -113.70 gain 11 212 -119.49 gain 212 11 -114.30 gain 11 213 -125.72 gain 213 11 -125.39 gain 11 214 -119.61 gain 214 11 -115.58 gain 11 215 -120.11 gain 215 11 -117.17 gain 11 216 -119.39 gain 216 11 -117.28 gain 11 217 -118.01 gain 217 11 -119.72 gain 11 218 -125.04 gain 218 11 -118.94 gain 11 219 -120.60 gain 219 11 -117.32 gain 11 220 -119.88 gain 220 11 -112.96 gain 11 221 -120.59 gain 221 11 -118.17 gain 11 222 -126.70 gain 222 11 -125.65 gain 11 223 -124.62 gain 223 11 -125.57 gain 11 224 -121.78 gain 224 11 -123.23 gain 12 13 -80.95 gain 13 12 -77.16 gain 12 14 -87.90 gain 14 12 -86.74 gain 12 15 -119.00 gain 15 12 -113.99 gain 12 16 -113.02 gain 16 12 -109.25 gain 12 17 -109.71 gain 17 12 -108.73 gain 12 18 -115.47 gain 18 12 -115.47 gain 12 19 -117.14 gain 19 12 -118.18 gain 12 20 -119.90 gain 20 12 -119.06 gain 12 21 -105.91 gain 21 12 -105.32 gain 12 22 -102.45 gain 22 12 -105.09 gain 12 23 -103.51 gain 23 12 -105.45 gain 12 24 -96.83 gain 24 12 -101.65 gain 12 25 -97.96 gain 25 12 -98.60 gain 12 26 -90.72 gain 26 12 -90.70 gain 12 27 -81.55 gain 27 12 -82.03 gain 12 28 -95.76 gain 28 12 -93.94 gain 12 29 -89.01 gain 29 12 -92.85 gain 12 30 -119.70 gain 30 12 -121.21 gain 12 31 -118.00 gain 31 12 -117.87 gain 12 32 -113.35 gain 32 12 -112.98 gain 12 33 -115.79 gain 33 12 -115.60 gain 12 34 -118.06 gain 34 12 -115.75 gain 12 35 -108.84 gain 35 12 -108.92 gain 12 36 -109.19 gain 36 12 -110.96 gain 12 37 -104.68 gain 37 12 -108.38 gain 12 38 -104.66 gain 38 12 -100.53 gain 12 39 -104.41 gain 39 12 -101.88 gain 12 40 -106.36 gain 40 12 -105.00 gain 12 41 -90.14 gain 41 12 -90.85 gain 12 42 -89.94 gain 42 12 -88.29 gain 12 43 -96.98 gain 43 12 -94.10 gain 12 44 -93.58 gain 44 12 -93.77 gain 12 45 -119.35 gain 45 12 -120.47 gain 12 46 -120.76 gain 46 12 -121.81 gain 12 47 -112.50 gain 47 12 -111.48 gain 12 48 -120.17 gain 48 12 -123.01 gain 12 49 -104.74 gain 49 12 -106.44 gain 12 50 -114.41 gain 50 12 -112.46 gain 12 51 -120.54 gain 51 12 -117.08 gain 12 52 -103.32 gain 52 12 -107.12 gain 12 53 -102.30 gain 53 12 -100.63 gain 12 54 -102.19 gain 54 12 -104.09 gain 12 55 -100.85 gain 55 12 -97.90 gain 12 56 -96.55 gain 56 12 -98.49 gain 12 57 -96.73 gain 57 12 -95.47 gain 12 58 -111.54 gain 58 12 -111.98 gain 12 59 -99.13 gain 59 12 -102.01 gain 12 60 -113.87 gain 60 12 -114.03 gain 12 61 -123.68 gain 61 12 -125.28 gain 12 62 -113.51 gain 62 12 -114.67 gain 12 63 -119.13 gain 63 12 -121.52 gain 12 64 -118.47 gain 64 12 -115.65 gain 12 65 -112.99 gain 65 12 -108.77 gain 12 66 -107.99 gain 66 12 -106.84 gain 12 67 -104.57 gain 67 12 -102.30 gain 12 68 -107.52 gain 68 12 -112.54 gain 12 69 -103.85 gain 69 12 -102.60 gain 12 70 -100.44 gain 70 12 -100.70 gain 12 71 -101.35 gain 71 12 -101.49 gain 12 72 -103.41 gain 72 12 -101.52 gain 12 73 -105.00 gain 73 12 -103.95 gain 12 74 -101.57 gain 74 12 -102.80 gain 12 75 -109.38 gain 75 12 -108.29 gain 12 76 -117.21 gain 76 12 -117.14 gain 12 77 -122.01 gain 77 12 -124.90 gain 12 78 -112.04 gain 78 12 -111.85 gain 12 79 -114.14 gain 79 12 -111.88 gain 12 80 -107.84 gain 80 12 -107.10 gain 12 81 -107.47 gain 81 12 -104.69 gain 12 82 -103.87 gain 82 12 -103.94 gain 12 83 -105.00 gain 83 12 -104.86 gain 12 84 -107.33 gain 84 12 -104.99 gain 12 85 -108.77 gain 85 12 -104.70 gain 12 86 -107.48 gain 86 12 -111.80 gain 12 87 -105.41 gain 87 12 -105.38 gain 12 88 -102.09 gain 88 12 -102.60 gain 12 89 -112.23 gain 89 12 -113.00 gain 12 90 -123.58 gain 90 12 -125.73 gain 12 91 -121.26 gain 91 12 -122.69 gain 12 92 -122.75 gain 92 12 -124.75 gain 12 93 -126.06 gain 93 12 -129.60 gain 12 94 -113.07 gain 94 12 -111.51 gain 12 95 -118.02 gain 95 12 -119.69 gain 12 96 -113.47 gain 96 12 -110.60 gain 12 97 -105.83 gain 97 12 -106.37 gain 12 98 -110.33 gain 98 12 -109.63 gain 12 99 -102.57 gain 99 12 -105.50 gain 12 100 -106.29 gain 100 12 -110.93 gain 12 101 -104.85 gain 101 12 -105.42 gain 12 102 -108.96 gain 102 12 -109.66 gain 12 103 -110.42 gain 103 12 -110.95 gain 12 104 -102.19 gain 104 12 -98.55 gain 12 105 -126.17 gain 105 12 -127.86 gain 12 106 -112.01 gain 106 12 -112.41 gain 12 107 -118.00 gain 107 12 -118.70 gain 12 108 -119.41 gain 108 12 -119.76 gain 12 109 -114.73 gain 109 12 -116.94 gain 12 110 -109.30 gain 110 12 -108.57 gain 12 111 -109.64 gain 111 12 -111.58 gain 12 112 -117.85 gain 112 12 -119.54 gain 12 113 -119.04 gain 113 12 -122.43 gain 12 114 -110.69 gain 114 12 -110.97 gain 12 115 -109.96 gain 115 12 -105.17 gain 12 116 -109.29 gain 116 12 -110.24 gain 12 117 -115.22 gain 117 12 -118.97 gain 12 118 -105.13 gain 118 12 -106.26 gain 12 119 -111.08 gain 119 12 -111.68 gain 12 120 -124.42 gain 120 12 -120.56 gain 12 121 -121.18 gain 121 12 -120.10 gain 12 122 -110.85 gain 122 12 -112.29 gain 12 123 -117.21 gain 123 12 -116.16 gain 12 124 -112.30 gain 124 12 -111.24 gain 12 125 -117.71 gain 125 12 -118.26 gain 12 126 -118.46 gain 126 12 -115.32 gain 12 127 -108.46 gain 127 12 -106.90 gain 12 128 -111.45 gain 128 12 -111.76 gain 12 129 -115.05 gain 129 12 -112.75 gain 12 130 -112.54 gain 130 12 -112.93 gain 12 131 -105.76 gain 131 12 -104.01 gain 12 132 -111.83 gain 132 12 -112.71 gain 12 133 -108.29 gain 133 12 -107.27 gain 12 134 -113.75 gain 134 12 -112.53 gain 12 135 -126.08 gain 135 12 -126.57 gain 12 136 -121.60 gain 136 12 -123.38 gain 12 137 -110.84 gain 137 12 -110.40 gain 12 138 -111.51 gain 138 12 -107.30 gain 12 139 -122.78 gain 139 12 -120.47 gain 12 140 -116.56 gain 140 12 -120.31 gain 12 141 -121.12 gain 141 12 -119.76 gain 12 142 -116.03 gain 142 12 -119.48 gain 12 143 -112.15 gain 143 12 -111.14 gain 12 144 -113.79 gain 144 12 -113.69 gain 12 145 -110.58 gain 145 12 -110.07 gain 12 146 -116.39 gain 146 12 -113.43 gain 12 147 -113.60 gain 147 12 -114.50 gain 12 148 -105.65 gain 148 12 -105.47 gain 12 149 -115.60 gain 149 12 -114.68 gain 12 150 -122.86 gain 150 12 -127.05 gain 12 151 -126.55 gain 151 12 -124.30 gain 12 152 -119.16 gain 152 12 -118.74 gain 12 153 -118.58 gain 153 12 -120.59 gain 12 154 -113.18 gain 154 12 -110.80 gain 12 155 -117.75 gain 155 12 -119.20 gain 12 156 -111.77 gain 156 12 -111.23 gain 12 157 -118.22 gain 157 12 -119.65 gain 12 158 -119.36 gain 158 12 -121.22 gain 12 159 -111.80 gain 159 12 -107.30 gain 12 160 -115.84 gain 160 12 -113.61 gain 12 161 -119.93 gain 161 12 -120.56 gain 12 162 -111.04 gain 162 12 -108.75 gain 12 163 -117.89 gain 163 12 -112.79 gain 12 164 -116.14 gain 164 12 -112.78 gain 12 165 -116.49 gain 165 12 -116.06 gain 12 166 -121.78 gain 166 12 -124.03 gain 12 167 -120.46 gain 167 12 -121.83 gain 12 168 -121.03 gain 168 12 -123.75 gain 12 169 -121.83 gain 169 12 -116.90 gain 12 170 -116.87 gain 170 12 -122.43 gain 12 171 -126.34 gain 171 12 -128.32 gain 12 172 -122.34 gain 172 12 -117.43 gain 12 173 -117.83 gain 173 12 -117.58 gain 12 174 -118.34 gain 174 12 -117.84 gain 12 175 -114.78 gain 175 12 -113.49 gain 12 176 -116.01 gain 176 12 -114.67 gain 12 177 -112.55 gain 177 12 -112.71 gain 12 178 -114.55 gain 178 12 -115.65 gain 12 179 -117.77 gain 179 12 -119.90 gain 12 180 -123.49 gain 180 12 -121.42 gain 12 181 -126.14 gain 181 12 -128.52 gain 12 182 -119.72 gain 182 12 -118.40 gain 12 183 -115.09 gain 183 12 -115.07 gain 12 184 -116.19 gain 184 12 -118.21 gain 12 185 -113.51 gain 185 12 -110.96 gain 12 186 -126.17 gain 186 12 -122.62 gain 12 187 -112.28 gain 187 12 -112.82 gain 12 188 -117.59 gain 188 12 -120.88 gain 12 189 -112.61 gain 189 12 -115.30 gain 12 190 -114.41 gain 190 12 -112.77 gain 12 191 -119.27 gain 191 12 -120.66 gain 12 192 -118.75 gain 192 12 -117.47 gain 12 193 -119.73 gain 193 12 -122.42 gain 12 194 -120.75 gain 194 12 -123.01 gain 12 195 -115.70 gain 195 12 -116.15 gain 12 196 -117.00 gain 196 12 -116.47 gain 12 197 -121.48 gain 197 12 -123.63 gain 12 198 -125.90 gain 198 12 -131.98 gain 12 199 -118.20 gain 199 12 -115.84 gain 12 200 -124.06 gain 200 12 -118.48 gain 12 201 -122.65 gain 201 12 -120.88 gain 12 202 -115.90 gain 202 12 -115.66 gain 12 203 -121.94 gain 203 12 -118.33 gain 12 204 -112.62 gain 204 12 -116.10 gain 12 205 -116.78 gain 205 12 -118.32 gain 12 206 -114.59 gain 206 12 -114.11 gain 12 207 -114.02 gain 207 12 -114.30 gain 12 208 -114.20 gain 208 12 -114.65 gain 12 209 -115.11 gain 209 12 -111.56 gain 12 210 -113.49 gain 210 12 -116.53 gain 12 211 -124.32 gain 211 12 -123.62 gain 12 212 -122.39 gain 212 12 -119.24 gain 12 213 -118.56 gain 213 12 -120.27 gain 12 214 -131.44 gain 214 12 -129.45 gain 12 215 -114.17 gain 215 12 -113.26 gain 12 216 -115.03 gain 216 12 -114.96 gain 12 217 -117.83 gain 217 12 -121.58 gain 12 218 -121.09 gain 218 12 -117.03 gain 12 219 -115.68 gain 219 12 -114.43 gain 12 220 -121.46 gain 220 12 -116.57 gain 12 221 -114.43 gain 221 12 -114.04 gain 12 222 -120.04 gain 222 12 -121.02 gain 12 223 -119.96 gain 223 12 -122.94 gain 12 224 -118.40 gain 224 12 -121.89 gain 13 14 -83.87 gain 14 13 -86.50 gain 13 15 -106.43 gain 15 13 -105.20 gain 13 16 -116.23 gain 16 13 -116.24 gain 13 17 -115.99 gain 17 13 -118.79 gain 13 18 -108.47 gain 18 13 -112.26 gain 13 19 -112.57 gain 19 13 -117.40 gain 13 20 -105.71 gain 20 13 -108.66 gain 13 21 -111.57 gain 21 13 -114.77 gain 13 22 -107.10 gain 22 13 -113.52 gain 13 23 -95.97 gain 23 13 -101.70 gain 13 24 -100.46 gain 24 13 -109.06 gain 13 25 -100.58 gain 25 13 -104.99 gain 13 26 -93.55 gain 26 13 -97.31 gain 13 27 -90.00 gain 27 13 -94.26 gain 13 28 -75.15 gain 28 13 -77.13 gain 13 29 -87.70 gain 29 13 -95.32 gain 13 30 -111.97 gain 30 13 -117.27 gain 13 31 -110.40 gain 31 13 -114.06 gain 13 32 -109.60 gain 32 13 -113.01 gain 13 33 -118.53 gain 33 13 -122.12 gain 13 34 -113.88 gain 34 13 -115.35 gain 13 35 -109.27 gain 35 13 -113.14 gain 13 36 -105.88 gain 36 13 -111.42 gain 13 37 -101.20 gain 37 13 -108.69 gain 13 38 -107.41 gain 38 13 -107.07 gain 13 39 -101.84 gain 39 13 -103.10 gain 13 40 -95.90 gain 40 13 -98.33 gain 13 41 -95.23 gain 41 13 -99.73 gain 13 42 -92.58 gain 42 13 -94.71 gain 13 43 -87.83 gain 43 13 -88.74 gain 13 44 -89.89 gain 44 13 -93.87 gain 13 45 -122.18 gain 45 13 -127.09 gain 13 46 -119.30 gain 46 13 -124.13 gain 13 47 -108.49 gain 47 13 -111.25 gain 13 48 -114.29 gain 48 13 -120.91 gain 13 49 -109.24 gain 49 13 -114.72 gain 13 50 -104.50 gain 50 13 -106.34 gain 13 51 -112.52 gain 51 13 -112.83 gain 13 52 -105.84 gain 52 13 -113.44 gain 13 53 -93.64 gain 53 13 -95.75 gain 13 54 -99.65 gain 54 13 -105.33 gain 13 55 -102.43 gain 55 13 -103.27 gain 13 56 -97.14 gain 56 13 -102.87 gain 13 57 -94.33 gain 57 13 -96.85 gain 13 58 -91.19 gain 58 13 -95.42 gain 13 59 -100.00 gain 59 13 -106.67 gain 13 60 -121.75 gain 60 13 -125.70 gain 13 61 -115.23 gain 61 13 -120.61 gain 13 62 -113.31 gain 62 13 -118.25 gain 13 63 -110.27 gain 63 13 -116.45 gain 13 64 -114.38 gain 64 13 -115.35 gain 13 65 -106.02 gain 65 13 -105.58 gain 13 66 -112.53 gain 66 13 -115.16 gain 13 67 -104.04 gain 67 13 -105.56 gain 13 68 -106.87 gain 68 13 -115.67 gain 13 69 -103.61 gain 69 13 -106.14 gain 13 70 -104.33 gain 70 13 -108.38 gain 13 71 -99.11 gain 71 13 -103.03 gain 13 72 -94.67 gain 72 13 -96.57 gain 13 73 -104.45 gain 73 13 -107.18 gain 13 74 -105.52 gain 74 13 -110.54 gain 13 75 -120.91 gain 75 13 -123.61 gain 13 76 -121.65 gain 76 13 -125.37 gain 13 77 -112.11 gain 77 13 -118.80 gain 13 78 -112.33 gain 78 13 -115.92 gain 13 79 -115.03 gain 79 13 -116.55 gain 13 80 -107.67 gain 80 13 -110.71 gain 13 81 -111.89 gain 81 13 -112.90 gain 13 82 -107.62 gain 82 13 -111.48 gain 13 83 -108.40 gain 83 13 -112.05 gain 13 84 -101.12 gain 84 13 -102.56 gain 13 85 -104.03 gain 85 13 -103.75 gain 13 86 -99.75 gain 86 13 -107.85 gain 13 87 -96.41 gain 87 13 -100.17 gain 13 88 -106.92 gain 88 13 -111.22 gain 13 89 -109.29 gain 89 13 -113.85 gain 13 90 -113.61 gain 90 13 -119.54 gain 13 91 -109.52 gain 91 13 -114.74 gain 13 92 -117.77 gain 92 13 -123.55 gain 13 93 -116.96 gain 93 13 -124.28 gain 13 94 -110.66 gain 94 13 -112.88 gain 13 95 -118.71 gain 95 13 -124.17 gain 13 96 -112.13 gain 96 13 -113.04 gain 13 97 -102.55 gain 97 13 -106.88 gain 13 98 -114.97 gain 98 13 -118.05 gain 13 99 -112.76 gain 99 13 -119.48 gain 13 100 -109.33 gain 100 13 -117.75 gain 13 101 -109.80 gain 101 13 -114.15 gain 13 102 -106.54 gain 102 13 -111.02 gain 13 103 -106.65 gain 103 13 -110.96 gain 13 104 -107.97 gain 104 13 -108.12 gain 13 105 -114.21 gain 105 13 -119.67 gain 13 106 -108.55 gain 106 13 -112.73 gain 13 107 -120.64 gain 107 13 -125.12 gain 13 108 -111.52 gain 108 13 -115.66 gain 13 109 -116.29 gain 109 13 -122.28 gain 13 110 -110.66 gain 110 13 -113.72 gain 13 111 -112.64 gain 111 13 -118.36 gain 13 112 -106.85 gain 112 13 -112.32 gain 13 113 -114.05 gain 113 13 -121.22 gain 13 114 -107.53 gain 114 13 -111.60 gain 13 115 -105.62 gain 115 13 -104.61 gain 13 116 -107.63 gain 116 13 -112.37 gain 13 117 -105.85 gain 117 13 -113.39 gain 13 118 -100.65 gain 118 13 -105.56 gain 13 119 -101.10 gain 119 13 -105.49 gain 13 120 -116.15 gain 120 13 -116.08 gain 13 121 -115.32 gain 121 13 -118.02 gain 13 122 -118.15 gain 122 13 -123.37 gain 13 123 -110.82 gain 123 13 -113.55 gain 13 124 -107.84 gain 124 13 -110.57 gain 13 125 -121.79 gain 125 13 -126.12 gain 13 126 -119.23 gain 126 13 -119.87 gain 13 127 -108.76 gain 127 13 -110.98 gain 13 128 -108.81 gain 128 13 -112.90 gain 13 129 -114.55 gain 129 13 -116.04 gain 13 130 -116.10 gain 130 13 -120.27 gain 13 131 -108.99 gain 131 13 -111.03 gain 13 132 -110.55 gain 132 13 -115.21 gain 13 133 -114.55 gain 133 13 -117.31 gain 13 134 -111.73 gain 134 13 -114.29 gain 13 135 -118.83 gain 135 13 -123.11 gain 13 136 -116.28 gain 136 13 -121.84 gain 13 137 -113.79 gain 137 13 -117.13 gain 13 138 -115.33 gain 138 13 -114.90 gain 13 139 -113.23 gain 139 13 -114.71 gain 13 140 -116.21 gain 140 13 -123.74 gain 13 141 -115.88 gain 141 13 -118.30 gain 13 142 -113.20 gain 142 13 -120.43 gain 13 143 -109.45 gain 143 13 -112.23 gain 13 144 -112.02 gain 144 13 -115.70 gain 13 145 -110.17 gain 145 13 -113.44 gain 13 146 -112.22 gain 146 13 -113.05 gain 13 147 -112.51 gain 147 13 -117.19 gain 13 148 -114.37 gain 148 13 -117.98 gain 13 149 -111.70 gain 149 13 -114.55 gain 13 150 -116.69 gain 150 13 -124.66 gain 13 151 -125.51 gain 151 13 -127.05 gain 13 152 -116.76 gain 152 13 -120.12 gain 13 153 -116.98 gain 153 13 -122.77 gain 13 154 -115.54 gain 154 13 -116.94 gain 13 155 -111.70 gain 155 13 -116.94 gain 13 156 -114.98 gain 156 13 -118.23 gain 13 157 -106.88 gain 157 13 -112.09 gain 13 158 -112.29 gain 158 13 -117.93 gain 13 159 -110.86 gain 159 13 -110.14 gain 13 160 -107.75 gain 160 13 -109.30 gain 13 161 -108.33 gain 161 13 -112.74 gain 13 162 -108.40 gain 162 13 -109.90 gain 13 163 -116.87 gain 163 13 -115.55 gain 13 164 -102.40 gain 164 13 -102.82 gain 13 165 -121.36 gain 165 13 -124.72 gain 13 166 -116.89 gain 166 13 -122.92 gain 13 167 -117.37 gain 167 13 -122.52 gain 13 168 -113.72 gain 168 13 -120.22 gain 13 169 -109.30 gain 169 13 -108.15 gain 13 170 -108.63 gain 170 13 -117.97 gain 13 171 -118.56 gain 171 13 -124.33 gain 13 172 -118.53 gain 172 13 -117.40 gain 13 173 -116.44 gain 173 13 -119.97 gain 13 174 -118.37 gain 174 13 -121.66 gain 13 175 -112.38 gain 175 13 -114.87 gain 13 176 -115.88 gain 176 13 -118.33 gain 13 177 -112.81 gain 177 13 -116.75 gain 13 178 -119.78 gain 178 13 -124.67 gain 13 179 -111.99 gain 179 13 -117.90 gain 13 180 -118.91 gain 180 13 -120.63 gain 13 181 -121.06 gain 181 13 -127.21 gain 13 182 -108.86 gain 182 13 -111.32 gain 13 183 -116.26 gain 183 13 -120.02 gain 13 184 -123.88 gain 184 13 -129.69 gain 13 185 -123.51 gain 185 13 -124.74 gain 13 186 -110.00 gain 186 13 -110.23 gain 13 187 -108.78 gain 187 13 -113.10 gain 13 188 -111.25 gain 188 13 -118.33 gain 13 189 -108.31 gain 189 13 -114.79 gain 13 190 -115.04 gain 190 13 -117.18 gain 13 191 -111.46 gain 191 13 -116.64 gain 13 192 -116.44 gain 192 13 -118.94 gain 13 193 -113.40 gain 193 13 -119.87 gain 13 194 -108.73 gain 194 13 -114.77 gain 13 195 -121.22 gain 195 13 -125.45 gain 13 196 -126.67 gain 196 13 -129.93 gain 13 197 -117.77 gain 197 13 -123.70 gain 13 198 -113.67 gain 198 13 -123.53 gain 13 199 -110.04 gain 199 13 -111.47 gain 13 200 -120.61 gain 200 13 -118.81 gain 13 201 -112.73 gain 201 13 -114.75 gain 13 202 -113.05 gain 202 13 -116.59 gain 13 203 -116.48 gain 203 13 -116.65 gain 13 204 -115.18 gain 204 13 -122.44 gain 13 205 -124.57 gain 205 13 -129.90 gain 13 206 -120.10 gain 206 13 -123.40 gain 13 207 -117.44 gain 207 13 -121.50 gain 13 208 -112.20 gain 208 13 -116.43 gain 13 209 -109.96 gain 209 13 -110.19 gain 13 210 -112.18 gain 210 13 -119.01 gain 13 211 -120.56 gain 211 13 -123.64 gain 13 212 -117.92 gain 212 13 -118.55 gain 13 213 -120.35 gain 213 13 -125.85 gain 13 214 -114.74 gain 214 13 -116.53 gain 13 215 -111.59 gain 215 13 -114.48 gain 13 216 -115.63 gain 216 13 -119.34 gain 13 217 -124.54 gain 217 13 -132.07 gain 13 218 -122.90 gain 218 13 -122.62 gain 13 219 -117.42 gain 219 13 -119.96 gain 13 220 -115.37 gain 220 13 -114.27 gain 13 221 -115.19 gain 221 13 -118.58 gain 13 222 -118.97 gain 222 13 -123.73 gain 13 223 -108.57 gain 223 13 -115.34 gain 13 224 -125.45 gain 224 13 -132.73 gain 14 15 -116.64 gain 15 14 -112.78 gain 14 16 -121.37 gain 16 14 -118.76 gain 14 17 -109.62 gain 17 14 -109.79 gain 14 18 -111.14 gain 18 14 -112.31 gain 14 19 -114.10 gain 19 14 -116.30 gain 14 20 -113.26 gain 20 14 -113.58 gain 14 21 -108.92 gain 21 14 -109.49 gain 14 22 -103.92 gain 22 14 -107.71 gain 14 23 -104.45 gain 23 14 -107.56 gain 14 24 -102.60 gain 24 14 -108.58 gain 14 25 -95.89 gain 25 14 -97.68 gain 14 26 -93.12 gain 26 14 -94.26 gain 14 27 -92.16 gain 27 14 -93.80 gain 14 28 -88.41 gain 28 14 -87.76 gain 14 29 -88.29 gain 29 14 -93.29 gain 14 30 -122.10 gain 30 14 -124.77 gain 14 31 -117.59 gain 31 14 -118.62 gain 14 32 -116.79 gain 32 14 -117.58 gain 14 33 -115.40 gain 33 14 -116.36 gain 14 34 -112.52 gain 34 14 -111.36 gain 14 35 -114.24 gain 35 14 -115.48 gain 14 36 -110.50 gain 36 14 -113.43 gain 14 37 -102.66 gain 37 14 -107.52 gain 14 38 -108.48 gain 38 14 -105.50 gain 14 39 -106.92 gain 39 14 -105.55 gain 14 40 -105.32 gain 40 14 -105.12 gain 14 41 -105.64 gain 41 14 -107.51 gain 14 42 -96.23 gain 42 14 -95.74 gain 14 43 -93.22 gain 43 14 -91.50 gain 14 44 -95.18 gain 44 14 -96.54 gain 14 45 -107.79 gain 45 14 -110.07 gain 14 46 -118.96 gain 46 14 -121.17 gain 14 47 -121.86 gain 47 14 -122.00 gain 14 48 -120.12 gain 48 14 -124.12 gain 14 49 -112.61 gain 49 14 -115.46 gain 14 50 -113.78 gain 50 14 -112.99 gain 14 51 -109.75 gain 51 14 -107.44 gain 14 52 -114.37 gain 52 14 -119.34 gain 14 53 -104.63 gain 53 14 -104.11 gain 14 54 -108.59 gain 54 14 -111.64 gain 14 55 -105.59 gain 55 14 -103.80 gain 14 56 -106.70 gain 56 14 -109.80 gain 14 57 -104.11 gain 57 14 -104.01 gain 14 58 -98.65 gain 58 14 -100.25 gain 14 59 -99.22 gain 59 14 -103.26 gain 14 60 -119.99 gain 60 14 -121.31 gain 14 61 -117.80 gain 61 14 -120.56 gain 14 62 -117.87 gain 62 14 -120.18 gain 14 63 -112.28 gain 63 14 -115.84 gain 14 64 -110.03 gain 64 14 -108.37 gain 14 65 -116.86 gain 65 14 -113.79 gain 14 66 -103.90 gain 66 14 -103.91 gain 14 67 -110.86 gain 67 14 -109.75 gain 14 68 -102.86 gain 68 14 -109.05 gain 14 69 -106.86 gain 69 14 -106.77 gain 14 70 -105.51 gain 70 14 -106.94 gain 14 71 -104.50 gain 71 14 -105.80 gain 14 72 -100.95 gain 72 14 -100.22 gain 14 73 -100.91 gain 73 14 -101.02 gain 14 74 -102.60 gain 74 14 -105.00 gain 14 75 -121.50 gain 75 14 -121.57 gain 14 76 -116.64 gain 76 14 -117.73 gain 14 77 -116.40 gain 77 14 -120.46 gain 14 78 -117.26 gain 78 14 -118.23 gain 14 79 -111.58 gain 79 14 -110.47 gain 14 80 -107.04 gain 80 14 -107.45 gain 14 81 -116.03 gain 81 14 -114.41 gain 14 82 -111.23 gain 82 14 -112.46 gain 14 83 -105.77 gain 83 14 -106.79 gain 14 84 -113.28 gain 84 14 -112.09 gain 14 85 -111.79 gain 85 14 -108.89 gain 14 86 -114.57 gain 86 14 -120.05 gain 14 87 -99.66 gain 87 14 -100.79 gain 14 88 -101.71 gain 88 14 -103.38 gain 14 89 -111.08 gain 89 14 -113.01 gain 14 90 -118.42 gain 90 14 -121.73 gain 14 91 -121.80 gain 91 14 -124.39 gain 14 92 -119.04 gain 92 14 -122.20 gain 14 93 -118.07 gain 93 14 -122.76 gain 14 94 -112.21 gain 94 14 -111.81 gain 14 95 -113.78 gain 95 14 -116.61 gain 14 96 -108.06 gain 96 14 -106.35 gain 14 97 -113.63 gain 97 14 -115.33 gain 14 98 -112.92 gain 98 14 -113.37 gain 14 99 -108.95 gain 99 14 -113.04 gain 14 100 -109.37 gain 100 14 -115.17 gain 14 101 -107.19 gain 101 14 -108.92 gain 14 102 -108.86 gain 102 14 -110.71 gain 14 103 -114.28 gain 103 14 -115.97 gain 14 104 -111.10 gain 104 14 -108.61 gain 14 105 -119.58 gain 105 14 -122.42 gain 14 106 -120.63 gain 106 14 -122.19 gain 14 107 -122.07 gain 107 14 -123.92 gain 14 108 -117.79 gain 108 14 -119.31 gain 14 109 -113.45 gain 109 14 -116.82 gain 14 110 -115.86 gain 110 14 -116.30 gain 14 111 -119.68 gain 111 14 -122.78 gain 14 112 -120.62 gain 112 14 -123.47 gain 14 113 -121.32 gain 113 14 -125.86 gain 14 114 -115.57 gain 114 14 -117.02 gain 14 115 -105.16 gain 115 14 -101.53 gain 14 116 -113.20 gain 116 14 -115.31 gain 14 117 -114.65 gain 117 14 -119.56 gain 14 118 -99.51 gain 118 14 -101.80 gain 14 119 -105.09 gain 119 14 -106.85 gain 14 120 -116.24 gain 120 14 -113.55 gain 14 121 -119.97 gain 121 14 -120.05 gain 14 122 -122.19 gain 122 14 -124.78 gain 14 123 -117.24 gain 123 14 -117.34 gain 14 124 -114.01 gain 124 14 -114.11 gain 14 125 -119.68 gain 125 14 -121.39 gain 14 126 -120.72 gain 126 14 -118.74 gain 14 127 -114.09 gain 127 14 -113.68 gain 14 128 -117.23 gain 128 14 -118.70 gain 14 129 -117.92 gain 129 14 -116.79 gain 14 130 -117.46 gain 130 14 -119.01 gain 14 131 -107.86 gain 131 14 -107.28 gain 14 132 -106.88 gain 132 14 -108.91 gain 14 133 -107.30 gain 133 14 -107.44 gain 14 134 -108.02 gain 134 14 -107.96 gain 14 135 -123.54 gain 135 14 -125.19 gain 14 136 -123.69 gain 136 14 -126.63 gain 14 137 -125.07 gain 137 14 -125.79 gain 14 138 -118.34 gain 138 14 -115.29 gain 14 139 -109.73 gain 139 14 -108.58 gain 14 140 -121.17 gain 140 14 -126.08 gain 14 141 -118.82 gain 141 14 -118.61 gain 14 142 -119.86 gain 142 14 -124.47 gain 14 143 -119.14 gain 143 14 -119.29 gain 14 144 -113.85 gain 144 14 -114.91 gain 14 145 -111.50 gain 145 14 -112.15 gain 14 146 -112.99 gain 146 14 -111.19 gain 14 147 -116.15 gain 147 14 -118.20 gain 14 148 -108.37 gain 148 14 -109.35 gain 14 149 -114.57 gain 149 14 -114.80 gain 14 150 -126.80 gain 150 14 -132.15 gain 14 151 -127.07 gain 151 14 -125.98 gain 14 152 -116.38 gain 152 14 -117.11 gain 14 153 -116.53 gain 153 14 -119.69 gain 14 154 -126.30 gain 154 14 -125.08 gain 14 155 -114.58 gain 155 14 -117.19 gain 14 156 -114.71 gain 156 14 -115.34 gain 14 157 -112.84 gain 157 14 -115.43 gain 14 158 -116.77 gain 158 14 -119.79 gain 14 159 -114.10 gain 159 14 -110.76 gain 14 160 -107.20 gain 160 14 -106.12 gain 14 161 -115.96 gain 161 14 -117.75 gain 14 162 -119.06 gain 162 14 -117.93 gain 14 163 -117.57 gain 163 14 -113.63 gain 14 164 -112.90 gain 164 14 -110.70 gain 14 165 -116.44 gain 165 14 -117.18 gain 14 166 -123.22 gain 166 14 -126.63 gain 14 167 -117.67 gain 167 14 -120.20 gain 14 168 -112.66 gain 168 14 -116.54 gain 14 169 -115.71 gain 169 14 -111.94 gain 14 170 -114.35 gain 170 14 -121.06 gain 14 171 -111.32 gain 171 14 -114.46 gain 14 172 -113.20 gain 172 14 -109.44 gain 14 173 -114.93 gain 173 14 -115.83 gain 14 174 -119.16 gain 174 14 -119.82 gain 14 175 -113.41 gain 175 14 -113.28 gain 14 176 -105.16 gain 176 14 -104.98 gain 14 177 -120.36 gain 177 14 -121.67 gain 14 178 -119.37 gain 178 14 -121.64 gain 14 179 -114.53 gain 179 14 -117.82 gain 14 180 -125.09 gain 180 14 -124.18 gain 14 181 -128.45 gain 181 14 -131.98 gain 14 182 -123.24 gain 182 14 -123.08 gain 14 183 -119.93 gain 183 14 -121.06 gain 14 184 -124.72 gain 184 14 -127.90 gain 14 185 -113.45 gain 185 14 -112.06 gain 14 186 -121.74 gain 186 14 -119.34 gain 14 187 -123.77 gain 187 14 -125.47 gain 14 188 -119.04 gain 188 14 -123.50 gain 14 189 -120.61 gain 189 14 -124.46 gain 14 190 -117.37 gain 190 14 -116.89 gain 14 191 -117.87 gain 191 14 -120.43 gain 14 192 -119.15 gain 192 14 -119.02 gain 14 193 -117.38 gain 193 14 -121.23 gain 14 194 -120.40 gain 194 14 -123.82 gain 14 195 -114.96 gain 195 14 -116.57 gain 14 196 -121.75 gain 196 14 -122.39 gain 14 197 -120.91 gain 197 14 -124.22 gain 14 198 -123.77 gain 198 14 -131.01 gain 14 199 -126.34 gain 199 14 -125.15 gain 14 200 -120.78 gain 200 14 -116.35 gain 14 201 -120.76 gain 201 14 -120.16 gain 14 202 -120.55 gain 202 14 -121.47 gain 14 203 -116.00 gain 203 14 -113.55 gain 14 204 -124.94 gain 204 14 -129.57 gain 14 205 -116.90 gain 205 14 -119.59 gain 14 206 -115.66 gain 206 14 -116.33 gain 14 207 -117.41 gain 207 14 -118.84 gain 14 208 -121.75 gain 208 14 -123.36 gain 14 209 -117.85 gain 209 14 -115.46 gain 14 210 -125.48 gain 210 14 -129.68 gain 14 211 -121.33 gain 211 14 -121.79 gain 14 212 -128.79 gain 212 14 -126.79 gain 14 213 -132.83 gain 213 14 -135.70 gain 14 214 -124.50 gain 214 14 -123.67 gain 14 215 -120.03 gain 215 14 -120.29 gain 14 216 -118.12 gain 216 14 -119.20 gain 14 217 -118.97 gain 217 14 -123.88 gain 14 218 -122.17 gain 218 14 -119.26 gain 14 219 -117.52 gain 219 14 -117.43 gain 14 220 -110.59 gain 220 14 -106.86 gain 14 221 -116.92 gain 221 14 -117.69 gain 14 222 -116.41 gain 222 14 -118.54 gain 14 223 -120.65 gain 223 14 -124.79 gain 14 224 -122.50 gain 224 14 -127.15 gain 15 16 -73.65 gain 16 15 -74.90 gain 15 17 -87.92 gain 17 15 -91.95 gain 15 18 -94.91 gain 18 15 -99.93 gain 15 19 -100.44 gain 19 15 -106.50 gain 15 20 -104.16 gain 20 15 -108.34 gain 15 21 -108.69 gain 21 15 -113.12 gain 15 22 -102.89 gain 22 15 -110.54 gain 15 23 -109.28 gain 23 15 -116.25 gain 15 24 -110.37 gain 24 15 -120.21 gain 15 25 -108.32 gain 25 15 -113.97 gain 15 26 -110.52 gain 26 15 -115.51 gain 15 27 -106.98 gain 27 15 -112.47 gain 15 28 -109.11 gain 28 15 -112.32 gain 15 29 -112.68 gain 29 15 -121.53 gain 15 30 -80.96 gain 30 15 -87.49 gain 15 31 -87.15 gain 31 15 -92.04 gain 15 32 -91.89 gain 32 15 -96.54 gain 15 33 -95.56 gain 33 15 -100.38 gain 15 34 -98.51 gain 34 15 -101.21 gain 15 35 -102.46 gain 35 15 -107.55 gain 15 36 -98.24 gain 36 15 -105.02 gain 15 37 -107.63 gain 37 15 -116.35 gain 15 38 -108.64 gain 38 15 -109.53 gain 15 39 -114.67 gain 39 15 -117.16 gain 15 40 -110.17 gain 40 15 -113.83 gain 15 41 -115.40 gain 41 15 -121.14 gain 15 42 -110.63 gain 42 15 -114.00 gain 15 43 -107.93 gain 43 15 -110.07 gain 15 44 -116.48 gain 44 15 -121.69 gain 15 45 -80.90 gain 45 15 -87.04 gain 15 46 -93.83 gain 46 15 -99.89 gain 15 47 -96.87 gain 47 15 -100.86 gain 15 48 -103.26 gain 48 15 -111.12 gain 15 49 -98.48 gain 49 15 -105.19 gain 15 50 -104.39 gain 50 15 -107.46 gain 15 51 -105.76 gain 51 15 -107.31 gain 15 52 -105.54 gain 52 15 -114.36 gain 15 53 -110.11 gain 53 15 -113.45 gain 15 54 -109.01 gain 54 15 -115.93 gain 15 55 -106.24 gain 55 15 -108.30 gain 15 56 -113.50 gain 56 15 -120.47 gain 15 57 -111.80 gain 57 15 -115.56 gain 15 58 -113.16 gain 58 15 -118.62 gain 15 59 -118.90 gain 59 15 -126.80 gain 15 60 -89.25 gain 60 15 -94.43 gain 15 61 -94.25 gain 61 15 -100.87 gain 15 62 -85.24 gain 62 15 -91.42 gain 15 63 -101.94 gain 63 15 -109.35 gain 15 64 -104.55 gain 64 15 -106.75 gain 15 65 -101.15 gain 65 15 -101.95 gain 15 66 -102.80 gain 66 15 -106.67 gain 15 67 -99.63 gain 67 15 -102.38 gain 15 68 -107.54 gain 68 15 -117.58 gain 15 69 -108.03 gain 69 15 -111.79 gain 15 70 -105.30 gain 70 15 -110.59 gain 15 71 -114.91 gain 71 15 -120.07 gain 15 72 -108.74 gain 72 15 -111.87 gain 15 73 -117.54 gain 73 15 -121.50 gain 15 74 -114.18 gain 74 15 -120.43 gain 15 75 -96.65 gain 75 15 -100.58 gain 15 76 -98.63 gain 76 15 -103.58 gain 15 77 -98.99 gain 77 15 -106.91 gain 15 78 -104.15 gain 78 15 -108.98 gain 15 79 -99.17 gain 79 15 -101.93 gain 15 80 -92.32 gain 80 15 -96.59 gain 15 81 -108.45 gain 81 15 -110.69 gain 15 82 -109.64 gain 82 15 -114.73 gain 15 83 -106.93 gain 83 15 -111.80 gain 15 84 -105.71 gain 84 15 -108.39 gain 15 85 -111.44 gain 85 15 -112.40 gain 15 86 -109.18 gain 86 15 -118.52 gain 15 87 -114.79 gain 87 15 -119.78 gain 15 88 -106.79 gain 88 15 -112.32 gain 15 89 -113.20 gain 89 15 -118.99 gain 15 90 -101.44 gain 90 15 -108.61 gain 15 91 -102.91 gain 91 15 -109.36 gain 15 92 -98.51 gain 92 15 -105.53 gain 15 93 -108.01 gain 93 15 -116.56 gain 15 94 -106.58 gain 94 15 -110.04 gain 15 95 -108.14 gain 95 15 -114.83 gain 15 96 -105.64 gain 96 15 -107.79 gain 15 97 -104.35 gain 97 15 -109.91 gain 15 98 -109.13 gain 98 15 -113.44 gain 15 99 -111.63 gain 99 15 -119.58 gain 15 100 -110.11 gain 100 15 -119.77 gain 15 101 -114.30 gain 101 15 -119.89 gain 15 102 -110.60 gain 102 15 -116.31 gain 15 103 -110.25 gain 103 15 -115.80 gain 15 104 -114.90 gain 104 15 -116.28 gain 15 105 -108.02 gain 105 15 -114.71 gain 15 106 -99.58 gain 106 15 -105.00 gain 15 107 -101.68 gain 107 15 -107.40 gain 15 108 -103.27 gain 108 15 -108.65 gain 15 109 -104.42 gain 109 15 -111.65 gain 15 110 -109.01 gain 110 15 -113.30 gain 15 111 -98.98 gain 111 15 -105.93 gain 15 112 -103.41 gain 112 15 -110.11 gain 15 113 -105.21 gain 113 15 -113.61 gain 15 114 -109.25 gain 114 15 -114.56 gain 15 115 -109.10 gain 115 15 -109.33 gain 15 116 -111.59 gain 116 15 -117.56 gain 15 117 -116.77 gain 117 15 -125.54 gain 15 118 -108.55 gain 118 15 -114.69 gain 15 119 -114.95 gain 119 15 -120.57 gain 15 120 -103.88 gain 120 15 -105.05 gain 15 121 -105.58 gain 121 15 -109.52 gain 15 122 -105.07 gain 122 15 -111.52 gain 15 123 -104.93 gain 123 15 -108.89 gain 15 124 -108.46 gain 124 15 -112.42 gain 15 125 -108.44 gain 125 15 -114.01 gain 15 126 -99.20 gain 126 15 -101.08 gain 15 127 -106.17 gain 127 15 -109.62 gain 15 128 -108.62 gain 128 15 -113.94 gain 15 129 -112.60 gain 129 15 -115.33 gain 15 130 -113.58 gain 130 15 -118.99 gain 15 131 -104.14 gain 131 15 -107.42 gain 15 132 -118.32 gain 132 15 -124.21 gain 15 133 -117.48 gain 133 15 -121.49 gain 15 134 -121.69 gain 134 15 -125.48 gain 15 135 -113.25 gain 135 15 -118.76 gain 15 136 -108.33 gain 136 15 -115.12 gain 15 137 -108.58 gain 137 15 -113.15 gain 15 138 -109.84 gain 138 15 -110.65 gain 15 139 -109.70 gain 139 15 -112.41 gain 15 140 -106.52 gain 140 15 -115.29 gain 15 141 -111.37 gain 141 15 -115.02 gain 15 142 -104.42 gain 142 15 -112.89 gain 15 143 -106.49 gain 143 15 -110.50 gain 15 144 -108.15 gain 144 15 -113.06 gain 15 145 -118.94 gain 145 15 -123.44 gain 15 146 -115.03 gain 146 15 -117.09 gain 15 147 -117.17 gain 147 15 -123.09 gain 15 148 -113.16 gain 148 15 -118.00 gain 15 149 -113.95 gain 149 15 -118.04 gain 15 150 -110.27 gain 150 15 -119.48 gain 15 151 -109.22 gain 151 15 -111.99 gain 15 152 -108.62 gain 152 15 -113.21 gain 15 153 -98.91 gain 153 15 -105.94 gain 15 154 -106.60 gain 154 15 -109.24 gain 15 155 -114.57 gain 155 15 -121.04 gain 15 156 -101.42 gain 156 15 -105.90 gain 15 157 -112.81 gain 157 15 -119.25 gain 15 158 -102.83 gain 158 15 -109.71 gain 15 159 -114.68 gain 159 15 -115.19 gain 15 160 -115.32 gain 160 15 -118.10 gain 15 161 -120.26 gain 161 15 -125.91 gain 15 162 -107.07 gain 162 15 -109.80 gain 15 163 -118.99 gain 163 15 -118.90 gain 15 164 -115.66 gain 164 15 -117.32 gain 15 165 -107.94 gain 165 15 -112.53 gain 15 166 -103.90 gain 166 15 -111.17 gain 15 167 -110.95 gain 167 15 -117.34 gain 15 168 -113.05 gain 168 15 -120.79 gain 15 169 -115.24 gain 169 15 -115.33 gain 15 170 -112.10 gain 170 15 -122.68 gain 15 171 -116.67 gain 171 15 -123.67 gain 15 172 -110.46 gain 172 15 -110.56 gain 15 173 -112.78 gain 173 15 -117.54 gain 15 174 -117.47 gain 174 15 -121.99 gain 15 175 -106.56 gain 175 15 -110.29 gain 15 176 -113.26 gain 176 15 -116.94 gain 15 177 -124.17 gain 177 15 -129.34 gain 15 178 -118.58 gain 178 15 -124.70 gain 15 179 -115.23 gain 179 15 -122.38 gain 15 180 -107.11 gain 180 15 -110.06 gain 15 181 -116.56 gain 181 15 -123.95 gain 15 182 -111.01 gain 182 15 -114.70 gain 15 183 -113.34 gain 183 15 -118.33 gain 15 184 -115.40 gain 184 15 -122.45 gain 15 185 -119.60 gain 185 15 -122.07 gain 15 186 -118.98 gain 186 15 -120.45 gain 15 187 -116.72 gain 187 15 -122.27 gain 15 188 -122.26 gain 188 15 -130.58 gain 15 189 -107.05 gain 189 15 -114.76 gain 15 190 -108.46 gain 190 15 -111.83 gain 15 191 -117.75 gain 191 15 -124.16 gain 15 192 -119.85 gain 192 15 -123.58 gain 15 193 -124.24 gain 193 15 -131.94 gain 15 194 -116.73 gain 194 15 -124.01 gain 15 195 -119.54 gain 195 15 -125.00 gain 15 196 -111.01 gain 196 15 -115.50 gain 15 197 -121.05 gain 197 15 -128.21 gain 15 198 -109.06 gain 198 15 -120.16 gain 15 199 -115.29 gain 199 15 -117.95 gain 15 200 -116.41 gain 200 15 -115.85 gain 15 201 -117.40 gain 201 15 -120.65 gain 15 202 -107.00 gain 202 15 -111.78 gain 15 203 -111.48 gain 203 15 -112.89 gain 15 204 -117.90 gain 204 15 -126.39 gain 15 205 -114.26 gain 205 15 -120.82 gain 15 206 -126.12 gain 206 15 -130.65 gain 15 207 -118.20 gain 207 15 -123.50 gain 15 208 -114.13 gain 208 15 -119.59 gain 15 209 -126.27 gain 209 15 -127.74 gain 15 210 -110.98 gain 210 15 -119.03 gain 15 211 -111.51 gain 211 15 -115.83 gain 15 212 -116.59 gain 212 15 -118.46 gain 15 213 -112.82 gain 213 15 -119.55 gain 15 214 -117.22 gain 214 15 -120.25 gain 15 215 -114.46 gain 215 15 -118.58 gain 15 216 -111.36 gain 216 15 -116.30 gain 15 217 -115.41 gain 217 15 -124.18 gain 15 218 -108.17 gain 218 15 -109.12 gain 15 219 -116.20 gain 219 15 -119.98 gain 15 220 -116.69 gain 220 15 -116.81 gain 15 221 -115.75 gain 221 15 -120.38 gain 15 222 -109.59 gain 222 15 -115.59 gain 15 223 -119.20 gain 223 15 -127.20 gain 15 224 -117.67 gain 224 15 -126.18 gain 16 17 -84.06 gain 17 16 -86.85 gain 16 18 -87.30 gain 18 16 -91.08 gain 16 19 -94.38 gain 19 16 -99.20 gain 16 20 -97.74 gain 20 16 -100.68 gain 16 21 -103.08 gain 21 16 -106.27 gain 16 22 -104.44 gain 22 16 -110.85 gain 16 23 -104.73 gain 23 16 -110.46 gain 16 24 -105.24 gain 24 16 -113.84 gain 16 25 -113.42 gain 25 16 -117.83 gain 16 26 -110.53 gain 26 16 -114.29 gain 16 27 -113.77 gain 27 16 -118.02 gain 16 28 -115.35 gain 28 16 -117.32 gain 16 29 -115.73 gain 29 16 -123.34 gain 16 30 -80.32 gain 30 16 -85.60 gain 16 31 -81.63 gain 31 16 -85.28 gain 16 32 -86.45 gain 32 16 -89.85 gain 16 33 -99.06 gain 33 16 -102.63 gain 16 34 -99.46 gain 34 16 -100.92 gain 16 35 -104.45 gain 35 16 -108.31 gain 16 36 -105.86 gain 36 16 -111.39 gain 16 37 -110.27 gain 37 16 -117.75 gain 16 38 -99.56 gain 38 16 -99.20 gain 16 39 -104.83 gain 39 16 -106.07 gain 16 40 -114.08 gain 40 16 -116.50 gain 16 41 -110.61 gain 41 16 -115.10 gain 16 42 -120.50 gain 42 16 -122.62 gain 16 43 -110.87 gain 43 16 -111.76 gain 16 44 -122.96 gain 44 16 -126.93 gain 16 45 -94.19 gain 45 16 -99.10 gain 16 46 -93.01 gain 46 16 -97.82 gain 16 47 -97.53 gain 47 16 -100.28 gain 16 48 -103.06 gain 48 16 -109.67 gain 16 49 -95.70 gain 49 16 -101.17 gain 16 50 -107.90 gain 50 16 -109.72 gain 16 51 -103.91 gain 51 16 -104.22 gain 16 52 -109.89 gain 52 16 -117.47 gain 16 53 -114.28 gain 53 16 -116.38 gain 16 54 -103.26 gain 54 16 -108.93 gain 16 55 -110.03 gain 55 16 -110.85 gain 16 56 -108.20 gain 56 16 -113.92 gain 16 57 -116.43 gain 57 16 -118.94 gain 16 58 -104.17 gain 58 16 -108.38 gain 16 59 -114.44 gain 59 16 -121.10 gain 16 60 -99.13 gain 60 16 -103.07 gain 16 61 -101.72 gain 61 16 -107.10 gain 16 62 -92.19 gain 62 16 -97.12 gain 16 63 -96.52 gain 63 16 -102.69 gain 16 64 -105.25 gain 64 16 -106.21 gain 16 65 -100.67 gain 65 16 -100.23 gain 16 66 -101.20 gain 66 16 -103.82 gain 16 67 -108.68 gain 67 16 -110.18 gain 16 68 -110.88 gain 68 16 -119.68 gain 16 69 -118.32 gain 69 16 -120.84 gain 16 70 -110.46 gain 70 16 -114.50 gain 16 71 -113.46 gain 71 16 -117.37 gain 16 72 -116.75 gain 72 16 -118.64 gain 16 73 -114.22 gain 73 16 -116.94 gain 16 74 -108.95 gain 74 16 -113.96 gain 16 75 -113.68 gain 75 16 -116.37 gain 16 76 -103.36 gain 76 16 -107.07 gain 16 77 -97.12 gain 77 16 -103.80 gain 16 78 -99.13 gain 78 16 -102.71 gain 16 79 -111.22 gain 79 16 -112.74 gain 16 80 -102.91 gain 80 16 -105.94 gain 16 81 -101.24 gain 81 16 -102.24 gain 16 82 -110.63 gain 82 16 -114.48 gain 16 83 -105.90 gain 83 16 -109.53 gain 16 84 -104.37 gain 84 16 -105.80 gain 16 85 -110.93 gain 85 16 -110.64 gain 16 86 -117.93 gain 86 16 -126.02 gain 16 87 -107.05 gain 87 16 -110.80 gain 16 88 -112.23 gain 88 16 -116.52 gain 16 89 -109.82 gain 89 16 -114.37 gain 16 90 -97.91 gain 90 16 -103.83 gain 16 91 -95.25 gain 91 16 -100.45 gain 16 92 -97.84 gain 92 16 -103.61 gain 16 93 -97.83 gain 93 16 -105.14 gain 16 94 -109.15 gain 94 16 -111.36 gain 16 95 -106.21 gain 95 16 -111.66 gain 16 96 -100.62 gain 96 16 -101.53 gain 16 97 -111.66 gain 97 16 -115.98 gain 16 98 -110.65 gain 98 16 -113.71 gain 16 99 -113.33 gain 99 16 -120.04 gain 16 100 -107.15 gain 100 16 -115.57 gain 16 101 -113.66 gain 101 16 -118.00 gain 16 102 -118.72 gain 102 16 -123.19 gain 16 103 -113.65 gain 103 16 -117.95 gain 16 104 -105.48 gain 104 16 -105.61 gain 16 105 -114.03 gain 105 16 -119.48 gain 16 106 -105.10 gain 106 16 -109.28 gain 16 107 -102.33 gain 107 16 -106.80 gain 16 108 -103.08 gain 108 16 -107.21 gain 16 109 -108.00 gain 109 16 -113.98 gain 16 110 -103.46 gain 110 16 -106.51 gain 16 111 -116.29 gain 111 16 -122.00 gain 16 112 -116.24 gain 112 16 -121.70 gain 16 113 -108.96 gain 113 16 -116.12 gain 16 114 -117.31 gain 114 16 -121.37 gain 16 115 -116.63 gain 115 16 -115.61 gain 16 116 -114.17 gain 116 16 -118.89 gain 16 117 -114.22 gain 117 16 -121.75 gain 16 118 -116.40 gain 118 16 -121.30 gain 16 119 -120.92 gain 119 16 -125.30 gain 16 120 -113.22 gain 120 16 -113.14 gain 16 121 -103.66 gain 121 16 -106.35 gain 16 122 -103.32 gain 122 16 -108.53 gain 16 123 -105.63 gain 123 16 -108.35 gain 16 124 -106.56 gain 124 16 -109.28 gain 16 125 -108.20 gain 125 16 -112.52 gain 16 126 -109.53 gain 126 16 -110.17 gain 16 127 -107.59 gain 127 16 -109.80 gain 16 128 -108.92 gain 128 16 -113.00 gain 16 129 -105.43 gain 129 16 -106.92 gain 16 130 -120.76 gain 130 16 -124.93 gain 16 131 -110.75 gain 131 16 -112.78 gain 16 132 -112.76 gain 132 16 -117.41 gain 16 133 -109.60 gain 133 16 -112.35 gain 16 134 -115.89 gain 134 16 -118.45 gain 16 135 -112.17 gain 135 16 -116.44 gain 16 136 -111.76 gain 136 16 -117.31 gain 16 137 -105.47 gain 137 16 -108.80 gain 16 138 -107.45 gain 138 16 -107.02 gain 16 139 -109.73 gain 139 16 -111.20 gain 16 140 -111.97 gain 140 16 -119.50 gain 16 141 -119.63 gain 141 16 -122.04 gain 16 142 -115.39 gain 142 16 -122.62 gain 16 143 -109.77 gain 143 16 -112.54 gain 16 144 -118.38 gain 144 16 -122.05 gain 16 145 -110.90 gain 145 16 -114.17 gain 16 146 -112.16 gain 146 16 -112.98 gain 16 147 -113.63 gain 147 16 -118.30 gain 16 148 -114.46 gain 148 16 -118.05 gain 16 149 -114.36 gain 149 16 -117.21 gain 16 150 -110.29 gain 150 16 -118.25 gain 16 151 -110.69 gain 151 16 -112.21 gain 16 152 -109.20 gain 152 16 -112.55 gain 16 153 -103.91 gain 153 16 -109.69 gain 16 154 -114.00 gain 154 16 -115.39 gain 16 155 -112.37 gain 155 16 -117.59 gain 16 156 -109.02 gain 156 16 -112.26 gain 16 157 -111.26 gain 157 16 -116.46 gain 16 158 -114.64 gain 158 16 -120.27 gain 16 159 -116.44 gain 159 16 -115.71 gain 16 160 -115.92 gain 160 16 -117.46 gain 16 161 -109.22 gain 161 16 -113.63 gain 16 162 -115.50 gain 162 16 -116.99 gain 16 163 -114.61 gain 163 16 -113.29 gain 16 164 -125.67 gain 164 16 -126.09 gain 16 165 -113.82 gain 165 16 -117.17 gain 16 166 -111.23 gain 166 16 -117.26 gain 16 167 -103.93 gain 167 16 -109.08 gain 16 168 -106.87 gain 168 16 -113.36 gain 16 169 -115.27 gain 169 16 -114.11 gain 16 170 -114.30 gain 170 16 -123.63 gain 16 171 -107.97 gain 171 16 -113.73 gain 16 172 -116.74 gain 172 16 -115.59 gain 16 173 -117.81 gain 173 16 -121.33 gain 16 174 -112.49 gain 174 16 -115.77 gain 16 175 -118.46 gain 175 16 -120.94 gain 16 176 -119.37 gain 176 16 -121.81 gain 16 177 -114.56 gain 177 16 -118.49 gain 16 178 -112.50 gain 178 16 -117.38 gain 16 179 -120.33 gain 179 16 -126.24 gain 16 180 -110.96 gain 180 16 -112.66 gain 16 181 -117.10 gain 181 16 -123.25 gain 16 182 -113.69 gain 182 16 -116.14 gain 16 183 -111.12 gain 183 16 -114.87 gain 16 184 -115.76 gain 184 16 -121.56 gain 16 185 -108.75 gain 185 16 -109.98 gain 16 186 -118.64 gain 186 16 -118.87 gain 16 187 -112.28 gain 187 16 -116.59 gain 16 188 -121.16 gain 188 16 -128.23 gain 16 189 -115.66 gain 189 16 -122.13 gain 16 190 -114.11 gain 190 16 -116.24 gain 16 191 -114.68 gain 191 16 -119.85 gain 16 192 -119.28 gain 192 16 -121.77 gain 16 193 -126.39 gain 193 16 -132.85 gain 16 194 -126.43 gain 194 16 -132.46 gain 16 195 -105.44 gain 195 16 -109.67 gain 16 196 -110.89 gain 196 16 -114.14 gain 16 197 -111.39 gain 197 16 -117.31 gain 16 198 -110.09 gain 198 16 -119.94 gain 16 199 -113.37 gain 199 16 -114.79 gain 16 200 -112.09 gain 200 16 -110.28 gain 16 201 -117.62 gain 201 16 -119.63 gain 16 202 -110.97 gain 202 16 -114.50 gain 16 203 -109.89 gain 203 16 -110.05 gain 16 204 -122.38 gain 204 16 -129.63 gain 16 205 -114.30 gain 205 16 -119.61 gain 16 206 -114.09 gain 206 16 -117.38 gain 16 207 -117.45 gain 207 16 -121.50 gain 16 208 -116.24 gain 208 16 -120.46 gain 16 209 -120.16 gain 209 16 -120.39 gain 16 210 -108.77 gain 210 16 -115.58 gain 16 211 -113.33 gain 211 16 -116.40 gain 16 212 -113.26 gain 212 16 -113.88 gain 16 213 -112.37 gain 213 16 -117.85 gain 16 214 -119.98 gain 214 16 -121.76 gain 16 215 -108.34 gain 215 16 -111.22 gain 16 216 -117.10 gain 216 16 -120.80 gain 16 217 -119.90 gain 217 16 -127.42 gain 16 218 -119.20 gain 218 16 -118.91 gain 16 219 -116.22 gain 219 16 -118.75 gain 16 220 -118.79 gain 220 16 -117.67 gain 16 221 -119.43 gain 221 16 -122.81 gain 16 222 -119.95 gain 222 16 -124.70 gain 16 223 -111.77 gain 223 16 -118.53 gain 16 224 -115.43 gain 224 16 -122.69 gain 17 18 -79.09 gain 18 17 -80.08 gain 17 19 -93.07 gain 19 17 -95.11 gain 17 20 -102.85 gain 20 17 -103.00 gain 17 21 -100.49 gain 21 17 -100.88 gain 17 22 -106.93 gain 22 17 -110.55 gain 17 23 -104.80 gain 23 17 -107.74 gain 17 24 -109.72 gain 24 17 -115.53 gain 17 25 -107.70 gain 25 17 -109.32 gain 17 26 -106.54 gain 26 17 -107.50 gain 17 27 -115.11 gain 27 17 -116.57 gain 17 28 -123.52 gain 28 17 -122.70 gain 17 29 -121.63 gain 29 17 -126.45 gain 17 30 -89.10 gain 30 17 -91.60 gain 17 31 -85.48 gain 31 17 -86.34 gain 17 32 -84.83 gain 32 17 -85.45 gain 17 33 -87.12 gain 33 17 -87.91 gain 17 34 -90.07 gain 34 17 -88.74 gain 17 35 -98.45 gain 35 17 -99.52 gain 17 36 -106.83 gain 36 17 -109.58 gain 17 37 -103.02 gain 37 17 -107.71 gain 17 38 -109.75 gain 38 17 -106.61 gain 17 39 -104.91 gain 39 17 -103.36 gain 17 40 -111.92 gain 40 17 -111.55 gain 17 41 -111.97 gain 41 17 -113.67 gain 17 42 -112.30 gain 42 17 -111.64 gain 17 43 -113.95 gain 43 17 -112.06 gain 17 44 -119.31 gain 44 17 -120.49 gain 17 45 -101.39 gain 45 17 -103.50 gain 17 46 -91.18 gain 46 17 -93.21 gain 17 47 -100.03 gain 47 17 -99.99 gain 17 48 -95.72 gain 48 17 -99.55 gain 17 49 -99.92 gain 49 17 -102.60 gain 17 50 -100.00 gain 50 17 -99.03 gain 17 51 -95.57 gain 51 17 -93.09 gain 17 52 -109.05 gain 52 17 -113.84 gain 17 53 -102.79 gain 53 17 -102.10 gain 17 54 -110.78 gain 54 17 -113.67 gain 17 55 -109.20 gain 55 17 -107.24 gain 17 56 -111.06 gain 56 17 -113.99 gain 17 57 -113.61 gain 57 17 -113.33 gain 17 58 -118.90 gain 58 17 -120.33 gain 17 59 -110.82 gain 59 17 -114.68 gain 17 60 -100.59 gain 60 17 -101.74 gain 17 61 -98.74 gain 61 17 -101.33 gain 17 62 -100.17 gain 62 17 -102.31 gain 17 63 -93.51 gain 63 17 -96.89 gain 17 64 -96.70 gain 64 17 -94.87 gain 17 65 -103.56 gain 65 17 -100.33 gain 17 66 -108.08 gain 66 17 -107.92 gain 17 67 -110.69 gain 67 17 -109.40 gain 17 68 -117.59 gain 68 17 -123.60 gain 17 69 -111.68 gain 69 17 -111.41 gain 17 70 -110.64 gain 70 17 -111.89 gain 17 71 -113.41 gain 71 17 -114.53 gain 17 72 -113.96 gain 72 17 -113.06 gain 17 73 -117.93 gain 73 17 -117.86 gain 17 74 -123.39 gain 74 17 -125.61 gain 17 75 -107.02 gain 75 17 -106.92 gain 17 76 -104.59 gain 76 17 -105.51 gain 17 77 -99.09 gain 77 17 -102.97 gain 17 78 -106.29 gain 78 17 -107.08 gain 17 79 -107.59 gain 79 17 -106.32 gain 17 80 -109.57 gain 80 17 -109.81 gain 17 81 -108.23 gain 81 17 -106.44 gain 17 82 -113.16 gain 82 17 -114.22 gain 17 83 -114.34 gain 83 17 -115.19 gain 17 84 -105.95 gain 84 17 -104.60 gain 17 85 -113.85 gain 85 17 -110.78 gain 17 86 -112.02 gain 86 17 -117.33 gain 17 87 -118.62 gain 87 17 -119.59 gain 17 88 -118.39 gain 88 17 -119.89 gain 17 89 -118.40 gain 89 17 -120.16 gain 17 90 -104.48 gain 90 17 -107.62 gain 17 91 -100.01 gain 91 17 -102.43 gain 17 92 -101.74 gain 92 17 -104.72 gain 17 93 -100.25 gain 93 17 -104.77 gain 17 94 -108.00 gain 94 17 -107.43 gain 17 95 -111.79 gain 95 17 -114.45 gain 17 96 -102.86 gain 96 17 -100.98 gain 17 97 -109.19 gain 97 17 -110.72 gain 17 98 -108.94 gain 98 17 -109.22 gain 17 99 -109.78 gain 99 17 -113.70 gain 17 100 -115.66 gain 100 17 -121.29 gain 17 101 -113.30 gain 101 17 -114.86 gain 17 102 -115.19 gain 102 17 -116.88 gain 17 103 -116.24 gain 103 17 -117.76 gain 17 104 -120.28 gain 104 17 -117.62 gain 17 105 -100.70 gain 105 17 -103.36 gain 17 106 -112.89 gain 106 17 -114.28 gain 17 107 -104.53 gain 107 17 -106.21 gain 17 108 -112.65 gain 108 17 -113.99 gain 17 109 -108.18 gain 109 17 -111.37 gain 17 110 -110.87 gain 110 17 -111.13 gain 17 111 -98.89 gain 111 17 -101.81 gain 17 112 -107.14 gain 112 17 -109.81 gain 17 113 -108.84 gain 113 17 -113.21 gain 17 114 -105.43 gain 114 17 -106.70 gain 17 115 -119.51 gain 115 17 -115.71 gain 17 116 -118.64 gain 116 17 -120.58 gain 17 117 -123.78 gain 117 17 -128.52 gain 17 118 -115.47 gain 118 17 -117.58 gain 17 119 -121.79 gain 119 17 -123.38 gain 17 120 -104.93 gain 120 17 -102.07 gain 17 121 -112.63 gain 121 17 -112.54 gain 17 122 -105.46 gain 122 17 -107.88 gain 17 123 -105.41 gain 123 17 -105.35 gain 17 124 -116.58 gain 124 17 -116.51 gain 17 125 -111.63 gain 125 17 -113.16 gain 17 126 -108.89 gain 126 17 -106.74 gain 17 127 -107.88 gain 127 17 -107.30 gain 17 128 -111.54 gain 128 17 -112.83 gain 17 129 -118.82 gain 129 17 -117.52 gain 17 130 -117.69 gain 130 17 -119.07 gain 17 131 -114.53 gain 131 17 -113.77 gain 17 132 -110.43 gain 132 17 -112.29 gain 17 133 -109.79 gain 133 17 -109.76 gain 17 134 -120.75 gain 134 17 -120.51 gain 17 135 -111.74 gain 135 17 -113.21 gain 17 136 -113.74 gain 136 17 -116.50 gain 17 137 -116.77 gain 137 17 -117.32 gain 17 138 -113.74 gain 138 17 -110.52 gain 17 139 -107.05 gain 139 17 -105.73 gain 17 140 -109.62 gain 140 17 -114.36 gain 17 141 -115.29 gain 141 17 -114.91 gain 17 142 -113.22 gain 142 17 -117.66 gain 17 143 -109.72 gain 143 17 -109.70 gain 17 144 -122.89 gain 144 17 -123.77 gain 17 145 -119.90 gain 145 17 -120.37 gain 17 146 -115.73 gain 146 17 -113.76 gain 17 147 -122.36 gain 147 17 -124.24 gain 17 148 -117.81 gain 148 17 -118.62 gain 17 149 -116.49 gain 149 17 -116.55 gain 17 150 -114.89 gain 150 17 -120.07 gain 17 151 -108.25 gain 151 17 -106.98 gain 17 152 -115.37 gain 152 17 -115.93 gain 17 153 -118.31 gain 153 17 -121.30 gain 17 154 -108.25 gain 154 17 -106.85 gain 17 155 -110.00 gain 155 17 -112.43 gain 17 156 -112.71 gain 156 17 -113.16 gain 17 157 -112.24 gain 157 17 -114.65 gain 17 158 -120.49 gain 158 17 -123.33 gain 17 159 -113.35 gain 159 17 -109.83 gain 17 160 -114.50 gain 160 17 -113.26 gain 17 161 -115.69 gain 161 17 -117.30 gain 17 162 -113.61 gain 162 17 -112.31 gain 17 163 -127.57 gain 163 17 -123.45 gain 17 164 -119.68 gain 164 17 -117.31 gain 17 165 -115.28 gain 165 17 -115.84 gain 17 166 -114.14 gain 166 17 -117.37 gain 17 167 -111.01 gain 167 17 -113.37 gain 17 168 -114.11 gain 168 17 -117.82 gain 17 169 -111.91 gain 169 17 -107.96 gain 17 170 -114.80 gain 170 17 -121.34 gain 17 171 -117.10 gain 171 17 -120.07 gain 17 172 -119.07 gain 172 17 -115.14 gain 17 173 -109.11 gain 173 17 -109.84 gain 17 174 -114.69 gain 174 17 -115.18 gain 17 175 -114.12 gain 175 17 -113.82 gain 17 176 -117.47 gain 176 17 -117.12 gain 17 177 -122.28 gain 177 17 -123.42 gain 17 178 -123.26 gain 178 17 -125.35 gain 17 179 -115.60 gain 179 17 -118.72 gain 17 180 -119.97 gain 180 17 -118.89 gain 17 181 -115.50 gain 181 17 -118.86 gain 17 182 -120.13 gain 182 17 -119.80 gain 17 183 -113.87 gain 183 17 -114.83 gain 17 184 -118.75 gain 184 17 -121.77 gain 17 185 -115.29 gain 185 17 -113.73 gain 17 186 -119.93 gain 186 17 -117.37 gain 17 187 -121.15 gain 187 17 -122.68 gain 17 188 -110.78 gain 188 17 -115.07 gain 17 189 -124.75 gain 189 17 -128.43 gain 17 190 -124.82 gain 190 17 -124.16 gain 17 191 -124.36 gain 191 17 -126.75 gain 17 192 -121.06 gain 192 17 -120.76 gain 17 193 -122.21 gain 193 17 -125.89 gain 17 194 -121.95 gain 194 17 -125.20 gain 17 195 -113.84 gain 195 17 -115.28 gain 17 196 -120.51 gain 196 17 -120.97 gain 17 197 -109.10 gain 197 17 -112.23 gain 17 198 -116.11 gain 198 17 -123.18 gain 17 199 -112.83 gain 199 17 -111.47 gain 17 200 -115.15 gain 200 17 -110.56 gain 17 201 -116.02 gain 201 17 -115.24 gain 17 202 -116.69 gain 202 17 -117.44 gain 17 203 -118.67 gain 203 17 -116.05 gain 17 204 -119.21 gain 204 17 -123.67 gain 17 205 -124.57 gain 205 17 -127.10 gain 17 206 -125.36 gain 206 17 -125.86 gain 17 207 -120.15 gain 207 17 -121.41 gain 17 208 -119.34 gain 208 17 -120.77 gain 17 209 -122.08 gain 209 17 -119.51 gain 17 210 -116.62 gain 210 17 -120.65 gain 17 211 -118.04 gain 211 17 -118.32 gain 17 212 -120.86 gain 212 17 -118.69 gain 17 213 -116.92 gain 213 17 -119.61 gain 17 214 -112.36 gain 214 17 -111.36 gain 17 215 -113.06 gain 215 17 -113.15 gain 17 216 -115.58 gain 216 17 -116.50 gain 17 217 -124.30 gain 217 17 -129.03 gain 17 218 -118.46 gain 218 17 -115.38 gain 17 219 -125.29 gain 219 17 -125.04 gain 17 220 -113.19 gain 220 17 -109.28 gain 17 221 -114.06 gain 221 17 -114.66 gain 17 222 -119.57 gain 222 17 -121.54 gain 17 223 -129.34 gain 223 17 -133.31 gain 17 224 -114.18 gain 224 17 -118.65 gain 18 19 -87.84 gain 19 18 -88.89 gain 18 20 -95.60 gain 20 18 -94.76 gain 18 21 -101.44 gain 21 18 -100.85 gain 18 22 -100.76 gain 22 18 -103.39 gain 18 23 -106.83 gain 23 18 -108.78 gain 18 24 -104.56 gain 24 18 -109.38 gain 18 25 -111.99 gain 25 18 -112.62 gain 18 26 -111.87 gain 26 18 -111.85 gain 18 27 -116.71 gain 27 18 -117.18 gain 18 28 -117.11 gain 28 18 -115.29 gain 18 29 -115.62 gain 29 18 -119.46 gain 18 30 -101.57 gain 30 18 -103.08 gain 18 31 -92.61 gain 31 18 -92.48 gain 18 32 -101.84 gain 32 18 -101.47 gain 18 33 -81.62 gain 33 18 -81.42 gain 18 34 -87.51 gain 34 18 -85.19 gain 18 35 -96.71 gain 35 18 -96.78 gain 18 36 -98.70 gain 36 18 -100.46 gain 18 37 -102.67 gain 37 18 -106.36 gain 18 38 -107.91 gain 38 18 -103.78 gain 18 39 -104.58 gain 39 18 -102.04 gain 18 40 -106.51 gain 40 18 -105.15 gain 18 41 -112.32 gain 41 18 -113.02 gain 18 42 -114.90 gain 42 18 -113.24 gain 18 43 -116.34 gain 43 18 -113.45 gain 18 44 -116.15 gain 44 18 -116.34 gain 18 45 -98.27 gain 45 18 -99.40 gain 18 46 -101.99 gain 46 18 -103.03 gain 18 47 -90.45 gain 47 18 -89.42 gain 18 48 -98.41 gain 48 18 -101.24 gain 18 49 -97.93 gain 49 18 -99.62 gain 18 50 -97.74 gain 50 18 -95.78 gain 18 51 -90.21 gain 51 18 -86.74 gain 18 52 -105.97 gain 52 18 -109.78 gain 18 53 -104.94 gain 53 18 -103.26 gain 18 54 -105.48 gain 54 18 -107.37 gain 18 55 -108.42 gain 55 18 -105.47 gain 18 56 -103.08 gain 56 18 -105.02 gain 18 57 -109.86 gain 57 18 -108.59 gain 18 58 -116.98 gain 58 18 -117.42 gain 18 59 -117.41 gain 59 18 -120.28 gain 18 60 -101.50 gain 60 18 -101.66 gain 18 61 -102.25 gain 61 18 -103.85 gain 18 62 -100.65 gain 62 18 -101.81 gain 18 63 -96.90 gain 63 18 -99.29 gain 18 64 -103.99 gain 64 18 -101.17 gain 18 65 -103.95 gain 65 18 -99.73 gain 18 66 -106.70 gain 66 18 -105.55 gain 18 67 -108.07 gain 67 18 -105.79 gain 18 68 -108.71 gain 68 18 -113.73 gain 18 69 -110.34 gain 69 18 -109.08 gain 18 70 -118.65 gain 70 18 -118.91 gain 18 71 -109.36 gain 71 18 -109.50 gain 18 72 -112.32 gain 72 18 -110.42 gain 18 73 -116.43 gain 73 18 -115.37 gain 18 74 -115.82 gain 74 18 -117.05 gain 18 75 -109.39 gain 75 18 -108.30 gain 18 76 -107.13 gain 76 18 -107.06 gain 18 77 -99.44 gain 77 18 -102.34 gain 18 78 -100.00 gain 78 18 -99.81 gain 18 79 -103.27 gain 79 18 -101.01 gain 18 80 -106.69 gain 80 18 -105.95 gain 18 81 -111.45 gain 81 18 -108.67 gain 18 82 -109.11 gain 82 18 -109.18 gain 18 83 -112.76 gain 83 18 -112.61 gain 18 84 -109.91 gain 84 18 -107.56 gain 18 85 -121.90 gain 85 18 -117.83 gain 18 86 -113.11 gain 86 18 -117.43 gain 18 87 -108.58 gain 87 18 -108.55 gain 18 88 -118.73 gain 88 18 -119.24 gain 18 89 -119.49 gain 89 18 -120.26 gain 18 90 -107.67 gain 90 18 -109.82 gain 18 91 -105.61 gain 91 18 -107.04 gain 18 92 -109.03 gain 92 18 -111.02 gain 18 93 -101.54 gain 93 18 -105.08 gain 18 94 -114.14 gain 94 18 -112.58 gain 18 95 -109.13 gain 95 18 -110.79 gain 18 96 -108.64 gain 96 18 -105.77 gain 18 97 -109.77 gain 97 18 -110.31 gain 18 98 -103.87 gain 98 18 -103.16 gain 18 99 -110.96 gain 99 18 -113.88 gain 18 100 -112.52 gain 100 18 -117.15 gain 18 101 -116.71 gain 101 18 -117.27 gain 18 102 -119.41 gain 102 18 -120.10 gain 18 103 -110.93 gain 103 18 -111.46 gain 18 104 -124.18 gain 104 18 -120.53 gain 18 105 -115.17 gain 105 18 -116.85 gain 18 106 -107.00 gain 106 18 -107.40 gain 18 107 -112.88 gain 107 18 -113.58 gain 18 108 -115.74 gain 108 18 -116.09 gain 18 109 -102.30 gain 109 18 -104.50 gain 18 110 -108.64 gain 110 18 -107.91 gain 18 111 -113.49 gain 111 18 -115.42 gain 18 112 -112.03 gain 112 18 -113.71 gain 18 113 -113.37 gain 113 18 -116.75 gain 18 114 -114.76 gain 114 18 -115.04 gain 18 115 -115.25 gain 115 18 -110.46 gain 18 116 -111.72 gain 116 18 -112.67 gain 18 117 -110.25 gain 117 18 -114.00 gain 18 118 -108.85 gain 118 18 -109.98 gain 18 119 -119.40 gain 119 18 -120.00 gain 18 120 -114.16 gain 120 18 -110.31 gain 18 121 -108.42 gain 121 18 -107.33 gain 18 122 -109.56 gain 122 18 -110.99 gain 18 123 -111.57 gain 123 18 -110.51 gain 18 124 -114.13 gain 124 18 -113.07 gain 18 125 -110.25 gain 125 18 -110.79 gain 18 126 -117.63 gain 126 18 -114.48 gain 18 127 -112.46 gain 127 18 -110.89 gain 18 128 -120.14 gain 128 18 -120.44 gain 18 129 -108.82 gain 129 18 -106.53 gain 18 130 -119.99 gain 130 18 -120.38 gain 18 131 -115.20 gain 131 18 -113.45 gain 18 132 -117.12 gain 132 18 -117.99 gain 18 133 -123.90 gain 133 18 -122.88 gain 18 134 -115.03 gain 134 18 -113.80 gain 18 135 -110.50 gain 135 18 -110.98 gain 18 136 -115.14 gain 136 18 -116.92 gain 18 137 -110.17 gain 137 18 -109.72 gain 18 138 -108.83 gain 138 18 -104.62 gain 18 139 -111.32 gain 139 18 -109.00 gain 18 140 -105.54 gain 140 18 -109.28 gain 18 141 -106.65 gain 141 18 -105.28 gain 18 142 -120.49 gain 142 18 -123.93 gain 18 143 -107.76 gain 143 18 -106.75 gain 18 144 -112.27 gain 144 18 -112.16 gain 18 145 -113.09 gain 145 18 -112.58 gain 18 146 -120.30 gain 146 18 -117.34 gain 18 147 -116.46 gain 147 18 -117.35 gain 18 148 -122.53 gain 148 18 -122.35 gain 18 149 -117.18 gain 149 18 -116.24 gain 18 150 -120.60 gain 150 18 -124.79 gain 18 151 -115.31 gain 151 18 -113.06 gain 18 152 -118.28 gain 152 18 -117.85 gain 18 153 -115.03 gain 153 18 -117.03 gain 18 154 -113.45 gain 154 18 -111.06 gain 18 155 -113.97 gain 155 18 -115.42 gain 18 156 -114.96 gain 156 18 -114.42 gain 18 157 -110.60 gain 157 18 -112.02 gain 18 158 -110.81 gain 158 18 -112.66 gain 18 159 -119.02 gain 159 18 -114.51 gain 18 160 -122.16 gain 160 18 -119.93 gain 18 161 -118.23 gain 161 18 -118.86 gain 18 162 -114.52 gain 162 18 -112.23 gain 18 163 -120.62 gain 163 18 -115.52 gain 18 164 -124.73 gain 164 18 -121.36 gain 18 165 -117.22 gain 165 18 -116.79 gain 18 166 -121.48 gain 166 18 -123.72 gain 18 167 -115.51 gain 167 18 -116.88 gain 18 168 -114.41 gain 168 18 -117.12 gain 18 169 -121.61 gain 169 18 -116.68 gain 18 170 -118.80 gain 170 18 -124.35 gain 18 171 -115.04 gain 171 18 -117.02 gain 18 172 -121.52 gain 172 18 -116.60 gain 18 173 -116.05 gain 173 18 -115.79 gain 18 174 -113.74 gain 174 18 -113.24 gain 18 175 -121.94 gain 175 18 -120.65 gain 18 176 -120.00 gain 176 18 -118.66 gain 18 177 -121.99 gain 177 18 -122.14 gain 18 178 -120.78 gain 178 18 -121.88 gain 18 179 -123.28 gain 179 18 -125.41 gain 18 180 -123.36 gain 180 18 -121.28 gain 18 181 -111.32 gain 181 18 -113.68 gain 18 182 -119.76 gain 182 18 -118.43 gain 18 183 -117.79 gain 183 18 -117.75 gain 18 184 -116.73 gain 184 18 -118.75 gain 18 185 -117.77 gain 185 18 -115.22 gain 18 186 -120.34 gain 186 18 -116.78 gain 18 187 -123.71 gain 187 18 -124.24 gain 18 188 -119.51 gain 188 18 -122.81 gain 18 189 -118.39 gain 189 18 -121.08 gain 18 190 -126.17 gain 190 18 -124.53 gain 18 191 -121.72 gain 191 18 -123.11 gain 18 192 -119.42 gain 192 18 -118.13 gain 18 193 -116.05 gain 193 18 -118.73 gain 18 194 -113.13 gain 194 18 -115.38 gain 18 195 -116.48 gain 195 18 -116.92 gain 18 196 -115.85 gain 196 18 -115.32 gain 18 197 -114.91 gain 197 18 -117.06 gain 18 198 -125.65 gain 198 18 -131.72 gain 18 199 -121.27 gain 199 18 -118.92 gain 18 200 -121.99 gain 200 18 -116.40 gain 18 201 -111.22 gain 201 18 -109.45 gain 18 202 -121.17 gain 202 18 -120.93 gain 18 203 -117.63 gain 203 18 -114.02 gain 18 204 -128.45 gain 204 18 -131.92 gain 18 205 -113.49 gain 205 18 -115.02 gain 18 206 -117.30 gain 206 18 -116.81 gain 18 207 -120.20 gain 207 18 -120.47 gain 18 208 -117.05 gain 208 18 -117.50 gain 18 209 -122.09 gain 209 18 -118.54 gain 18 210 -118.43 gain 210 18 -121.47 gain 18 211 -111.24 gain 211 18 -110.53 gain 18 212 -118.35 gain 212 18 -115.19 gain 18 213 -115.37 gain 213 18 -117.08 gain 18 214 -118.84 gain 214 18 -116.84 gain 18 215 -128.44 gain 215 18 -127.54 gain 18 216 -113.81 gain 216 18 -113.73 gain 18 217 -115.71 gain 217 18 -119.45 gain 18 218 -127.39 gain 218 18 -123.32 gain 18 219 -133.34 gain 219 18 -132.09 gain 18 220 -121.51 gain 220 18 -116.61 gain 18 221 -125.50 gain 221 18 -125.11 gain 18 222 -117.50 gain 222 18 -118.48 gain 18 223 -120.69 gain 223 18 -123.67 gain 18 224 -123.11 gain 224 18 -126.59 gain 19 20 -83.30 gain 20 19 -81.41 gain 19 21 -95.82 gain 21 19 -94.18 gain 19 22 -102.94 gain 22 19 -104.53 gain 19 23 -108.71 gain 23 19 -109.61 gain 19 24 -108.40 gain 24 19 -112.18 gain 19 25 -108.91 gain 25 19 -108.49 gain 19 26 -110.53 gain 26 19 -109.47 gain 19 27 -111.50 gain 27 19 -110.93 gain 19 28 -120.14 gain 28 19 -117.28 gain 19 29 -118.55 gain 29 19 -121.35 gain 19 30 -101.07 gain 30 19 -101.53 gain 19 31 -107.34 gain 31 19 -106.17 gain 19 32 -96.98 gain 32 19 -95.56 gain 19 33 -95.52 gain 33 19 -94.28 gain 19 34 -85.85 gain 34 19 -82.48 gain 19 35 -94.34 gain 35 19 -93.38 gain 19 36 -95.17 gain 36 19 -95.88 gain 19 37 -105.94 gain 37 19 -108.60 gain 19 38 -107.66 gain 38 19 -102.49 gain 19 39 -106.72 gain 39 19 -103.14 gain 19 40 -114.74 gain 40 19 -112.34 gain 19 41 -110.24 gain 41 19 -109.91 gain 19 42 -118.29 gain 42 19 -115.59 gain 19 43 -116.28 gain 43 19 -112.35 gain 19 44 -109.03 gain 44 19 -108.17 gain 19 45 -109.75 gain 45 19 -109.83 gain 19 46 -106.34 gain 46 19 -106.33 gain 19 47 -99.46 gain 47 19 -97.39 gain 19 48 -95.31 gain 48 19 -97.11 gain 19 49 -95.99 gain 49 19 -96.64 gain 19 50 -96.35 gain 50 19 -93.35 gain 19 51 -99.89 gain 51 19 -95.37 gain 19 52 -101.67 gain 52 19 -104.43 gain 19 53 -106.82 gain 53 19 -104.10 gain 19 54 -108.85 gain 54 19 -109.70 gain 19 55 -113.19 gain 55 19 -109.20 gain 19 56 -113.90 gain 56 19 -114.80 gain 19 57 -110.46 gain 57 19 -108.15 gain 19 58 -107.84 gain 58 19 -107.24 gain 19 59 -111.76 gain 59 19 -113.60 gain 19 60 -113.90 gain 60 19 -113.02 gain 19 61 -101.55 gain 61 19 -102.11 gain 19 62 -105.12 gain 62 19 -105.23 gain 19 63 -99.68 gain 63 19 -101.03 gain 19 64 -97.28 gain 64 19 -93.42 gain 19 65 -100.94 gain 65 19 -95.67 gain 19 66 -100.25 gain 66 19 -98.05 gain 19 67 -102.83 gain 67 19 -99.51 gain 19 68 -105.59 gain 68 19 -109.57 gain 19 69 -103.50 gain 69 19 -101.20 gain 19 70 -103.62 gain 70 19 -102.83 gain 19 71 -99.69 gain 71 19 -98.78 gain 19 72 -109.23 gain 72 19 -106.30 gain 19 73 -113.30 gain 73 19 -111.20 gain 19 74 -119.09 gain 74 19 -119.28 gain 19 75 -112.94 gain 75 19 -110.80 gain 19 76 -102.22 gain 76 19 -101.11 gain 19 77 -105.32 gain 77 19 -107.17 gain 19 78 -100.11 gain 78 19 -98.87 gain 19 79 -109.51 gain 79 19 -106.21 gain 19 80 -99.65 gain 80 19 -97.86 gain 19 81 -107.72 gain 81 19 -103.90 gain 19 82 -110.21 gain 82 19 -109.24 gain 19 83 -108.38 gain 83 19 -107.19 gain 19 84 -103.56 gain 84 19 -100.17 gain 19 85 -117.95 gain 85 19 -112.84 gain 19 86 -110.65 gain 86 19 -113.92 gain 19 87 -117.06 gain 87 19 -115.99 gain 19 88 -121.43 gain 88 19 -120.90 gain 19 89 -106.52 gain 89 19 -106.24 gain 19 90 -109.62 gain 90 19 -110.72 gain 19 91 -110.57 gain 91 19 -110.96 gain 19 92 -110.31 gain 92 19 -111.26 gain 19 93 -100.41 gain 93 19 -102.90 gain 19 94 -115.86 gain 94 19 -113.26 gain 19 95 -105.93 gain 95 19 -106.55 gain 19 96 -109.91 gain 96 19 -106.00 gain 19 97 -110.32 gain 97 19 -109.81 gain 19 98 -109.00 gain 98 19 -107.25 gain 19 99 -109.07 gain 99 19 -110.95 gain 19 100 -115.42 gain 100 19 -119.02 gain 19 101 -109.06 gain 101 19 -108.58 gain 19 102 -110.69 gain 102 19 -110.34 gain 19 103 -121.26 gain 103 19 -120.75 gain 19 104 -122.12 gain 104 19 -117.43 gain 19 105 -111.85 gain 105 19 -112.49 gain 19 106 -113.97 gain 106 19 -113.33 gain 19 107 -106.90 gain 107 19 -106.55 gain 19 108 -109.70 gain 108 19 -109.01 gain 19 109 -110.58 gain 109 19 -111.74 gain 19 110 -115.40 gain 110 19 -113.62 gain 19 111 -106.72 gain 111 19 -107.61 gain 19 112 -108.20 gain 112 19 -108.84 gain 19 113 -105.77 gain 113 19 -108.10 gain 19 114 -110.42 gain 114 19 -109.66 gain 19 115 -113.59 gain 115 19 -107.76 gain 19 116 -109.65 gain 116 19 -109.56 gain 19 117 -119.26 gain 117 19 -121.97 gain 19 118 -115.09 gain 118 19 -115.17 gain 19 119 -119.85 gain 119 19 -119.41 gain 19 120 -118.35 gain 120 19 -113.45 gain 19 121 -115.94 gain 121 19 -113.82 gain 19 122 -117.30 gain 122 19 -117.68 gain 19 123 -113.61 gain 123 19 -111.51 gain 19 124 -112.54 gain 124 19 -110.43 gain 19 125 -112.13 gain 125 19 -111.63 gain 19 126 -109.49 gain 126 19 -105.31 gain 19 127 -115.57 gain 127 19 -112.96 gain 19 128 -105.14 gain 128 19 -104.40 gain 19 129 -120.57 gain 129 19 -117.24 gain 19 130 -119.33 gain 130 19 -118.68 gain 19 131 -115.40 gain 131 19 -112.61 gain 19 132 -113.87 gain 132 19 -113.70 gain 19 133 -121.01 gain 133 19 -118.95 gain 19 134 -112.40 gain 134 19 -110.14 gain 19 135 -107.63 gain 135 19 -107.07 gain 19 136 -119.63 gain 136 19 -120.36 gain 19 137 -117.24 gain 137 19 -115.75 gain 19 138 -110.96 gain 138 19 -105.71 gain 19 139 -115.13 gain 139 19 -111.77 gain 19 140 -117.74 gain 140 19 -120.45 gain 19 141 -116.15 gain 141 19 -113.74 gain 19 142 -117.34 gain 142 19 -119.74 gain 19 143 -113.63 gain 143 19 -111.58 gain 19 144 -113.42 gain 144 19 -112.27 gain 19 145 -118.86 gain 145 19 -117.31 gain 19 146 -115.40 gain 146 19 -111.40 gain 19 147 -120.74 gain 147 19 -120.59 gain 19 148 -123.41 gain 148 19 -122.19 gain 19 149 -124.42 gain 149 19 -122.45 gain 19 150 -111.75 gain 150 19 -114.89 gain 19 151 -117.91 gain 151 19 -114.61 gain 19 152 -115.22 gain 152 19 -113.75 gain 19 153 -117.72 gain 153 19 -118.68 gain 19 154 -107.40 gain 154 19 -103.97 gain 19 155 -108.58 gain 155 19 -108.98 gain 19 156 -113.27 gain 156 19 -111.69 gain 19 157 -111.83 gain 157 19 -112.21 gain 19 158 -114.51 gain 158 19 -115.32 gain 19 159 -117.89 gain 159 19 -112.35 gain 19 160 -117.43 gain 160 19 -114.15 gain 19 161 -113.28 gain 161 19 -112.86 gain 19 162 -117.69 gain 162 19 -114.35 gain 19 163 -119.12 gain 163 19 -112.97 gain 19 164 -122.22 gain 164 19 -117.82 gain 19 165 -121.18 gain 165 19 -119.70 gain 19 166 -119.31 gain 166 19 -120.51 gain 19 167 -111.15 gain 167 19 -111.48 gain 19 168 -114.59 gain 168 19 -116.26 gain 19 169 -120.11 gain 169 19 -114.13 gain 19 170 -115.15 gain 170 19 -119.67 gain 19 171 -118.01 gain 171 19 -118.95 gain 19 172 -113.38 gain 172 19 -107.42 gain 19 173 -110.00 gain 173 19 -108.70 gain 19 174 -113.71 gain 174 19 -112.16 gain 19 175 -116.78 gain 175 19 -114.44 gain 19 176 -113.51 gain 176 19 -111.13 gain 19 177 -113.79 gain 177 19 -112.89 gain 19 178 -117.15 gain 178 19 -117.21 gain 19 179 -127.52 gain 179 19 -128.61 gain 19 180 -111.96 gain 180 19 -108.85 gain 19 181 -113.91 gain 181 19 -115.24 gain 19 182 -120.54 gain 182 19 -118.17 gain 19 183 -120.16 gain 183 19 -119.09 gain 19 184 -122.49 gain 184 19 -123.47 gain 19 185 -121.23 gain 185 19 -117.64 gain 19 186 -115.81 gain 186 19 -111.21 gain 19 187 -116.77 gain 187 19 -116.26 gain 19 188 -108.98 gain 188 19 -111.23 gain 19 189 -126.99 gain 189 19 -128.64 gain 19 190 -118.56 gain 190 19 -115.87 gain 19 191 -125.08 gain 191 19 -125.43 gain 19 192 -115.72 gain 192 19 -113.39 gain 19 193 -127.44 gain 193 19 -129.08 gain 19 194 -124.90 gain 194 19 -126.11 gain 19 195 -123.34 gain 195 19 -122.75 gain 19 196 -120.60 gain 196 19 -119.03 gain 19 197 -122.25 gain 197 19 -123.35 gain 19 198 -121.55 gain 198 19 -126.58 gain 19 199 -117.76 gain 199 19 -114.36 gain 19 200 -116.16 gain 200 19 -109.53 gain 19 201 -119.32 gain 201 19 -116.51 gain 19 202 -118.84 gain 202 19 -117.56 gain 19 203 -117.09 gain 203 19 -112.44 gain 19 204 -125.84 gain 204 19 -128.27 gain 19 205 -121.84 gain 205 19 -122.34 gain 19 206 -124.87 gain 206 19 -123.34 gain 19 207 -118.67 gain 207 19 -117.90 gain 19 208 -121.91 gain 208 19 -121.31 gain 19 209 -127.60 gain 209 19 -123.01 gain 19 210 -117.30 gain 210 19 -119.29 gain 19 211 -122.60 gain 211 19 -120.85 gain 19 212 -118.62 gain 212 19 -114.41 gain 19 213 -117.42 gain 213 19 -118.09 gain 19 214 -122.80 gain 214 19 -119.76 gain 19 215 -123.31 gain 215 19 -121.36 gain 19 216 -119.85 gain 216 19 -118.73 gain 19 217 -114.07 gain 217 19 -116.77 gain 19 218 -123.73 gain 218 19 -118.62 gain 19 219 -121.28 gain 219 19 -118.99 gain 19 220 -124.04 gain 220 19 -118.10 gain 19 221 -111.81 gain 221 19 -110.38 gain 19 222 -126.03 gain 222 19 -125.97 gain 19 223 -128.11 gain 223 19 -130.05 gain 19 224 -118.44 gain 224 19 -120.89 gain 20 21 -91.92 gain 21 20 -92.17 gain 20 22 -96.18 gain 22 20 -99.65 gain 20 23 -100.16 gain 23 20 -102.94 gain 20 24 -106.92 gain 24 20 -112.58 gain 20 25 -102.46 gain 25 20 -103.93 gain 20 26 -105.48 gain 26 20 -106.29 gain 20 27 -111.32 gain 27 20 -112.63 gain 20 28 -106.18 gain 28 20 -105.20 gain 20 29 -115.07 gain 29 20 -119.75 gain 20 30 -109.02 gain 30 20 -111.37 gain 20 31 -101.80 gain 31 20 -102.52 gain 20 32 -100.00 gain 32 20 -100.46 gain 20 33 -100.24 gain 33 20 -100.89 gain 20 34 -95.06 gain 34 20 -93.58 gain 20 35 -84.96 gain 35 20 -85.88 gain 20 36 -95.17 gain 36 20 -97.77 gain 20 37 -100.30 gain 37 20 -104.84 gain 20 38 -94.93 gain 38 20 -91.63 gain 20 39 -94.27 gain 39 20 -92.57 gain 20 40 -109.26 gain 40 20 -108.74 gain 20 41 -110.15 gain 41 20 -111.70 gain 20 42 -108.68 gain 42 20 -107.86 gain 20 43 -107.98 gain 43 20 -105.94 gain 20 44 -112.09 gain 44 20 -113.13 gain 20 45 -107.16 gain 45 20 -109.13 gain 20 46 -102.31 gain 46 20 -104.19 gain 20 47 -94.32 gain 47 20 -94.14 gain 20 48 -88.09 gain 48 20 -91.76 gain 20 49 -99.78 gain 49 20 -102.31 gain 20 50 -88.67 gain 50 20 -87.56 gain 20 51 -101.19 gain 51 20 -98.56 gain 20 52 -98.82 gain 52 20 -103.47 gain 20 53 -101.35 gain 53 20 -100.51 gain 20 54 -106.04 gain 54 20 -108.78 gain 20 55 -102.81 gain 55 20 -100.70 gain 20 56 -109.60 gain 56 20 -112.39 gain 20 57 -116.60 gain 57 20 -116.18 gain 20 58 -117.34 gain 58 20 -118.62 gain 20 59 -120.67 gain 59 20 -124.38 gain 20 60 -109.53 gain 60 20 -110.53 gain 20 61 -108.60 gain 61 20 -111.04 gain 20 62 -103.88 gain 62 20 -105.88 gain 20 63 -97.70 gain 63 20 -100.93 gain 20 64 -94.75 gain 64 20 -92.77 gain 20 65 -103.75 gain 65 20 -100.37 gain 20 66 -98.64 gain 66 20 -98.33 gain 20 67 -102.47 gain 67 20 -101.04 gain 20 68 -106.93 gain 68 20 -112.79 gain 20 69 -107.36 gain 69 20 -106.95 gain 20 70 -110.29 gain 70 20 -111.39 gain 20 71 -114.07 gain 71 20 -115.05 gain 20 72 -112.36 gain 72 20 -111.31 gain 20 73 -106.43 gain 73 20 -106.22 gain 20 74 -116.67 gain 74 20 -118.74 gain 20 75 -109.17 gain 75 20 -108.92 gain 20 76 -108.16 gain 76 20 -108.93 gain 20 77 -103.69 gain 77 20 -107.43 gain 20 78 -103.91 gain 78 20 -104.56 gain 20 79 -103.78 gain 79 20 -102.35 gain 20 80 -99.30 gain 80 20 -99.39 gain 20 81 -99.06 gain 81 20 -97.12 gain 20 82 -105.77 gain 82 20 -106.67 gain 20 83 -99.00 gain 83 20 -99.70 gain 20 84 -105.69 gain 84 20 -104.19 gain 20 85 -110.83 gain 85 20 -107.61 gain 20 86 -105.40 gain 86 20 -110.56 gain 20 87 -114.89 gain 87 20 -115.70 gain 20 88 -110.28 gain 88 20 -111.64 gain 20 89 -115.61 gain 89 20 -117.22 gain 20 90 -111.14 gain 90 20 -114.12 gain 20 91 -114.21 gain 91 20 -116.48 gain 20 92 -105.44 gain 92 20 -108.28 gain 20 93 -105.01 gain 93 20 -109.38 gain 20 94 -111.90 gain 94 20 -111.18 gain 20 95 -102.00 gain 95 20 -104.51 gain 20 96 -105.89 gain 96 20 -103.85 gain 20 97 -104.24 gain 97 20 -105.62 gain 20 98 -108.70 gain 98 20 -108.84 gain 20 99 -109.44 gain 99 20 -113.21 gain 20 100 -114.76 gain 100 20 -120.24 gain 20 101 -112.22 gain 101 20 -113.63 gain 20 102 -106.56 gain 102 20 -108.09 gain 20 103 -108.21 gain 103 20 -109.58 gain 20 104 -119.35 gain 104 20 -116.55 gain 20 105 -116.98 gain 105 20 -119.50 gain 20 106 -114.12 gain 106 20 -115.35 gain 20 107 -99.59 gain 107 20 -101.13 gain 20 108 -107.99 gain 108 20 -109.18 gain 20 109 -113.11 gain 109 20 -116.15 gain 20 110 -109.65 gain 110 20 -109.77 gain 20 111 -117.26 gain 111 20 -120.04 gain 20 112 -103.27 gain 112 20 -105.80 gain 20 113 -102.57 gain 113 20 -106.79 gain 20 114 -111.54 gain 114 20 -112.66 gain 20 115 -114.55 gain 115 20 -110.60 gain 20 116 -107.13 gain 116 20 -108.92 gain 20 117 -113.60 gain 117 20 -118.19 gain 20 118 -113.21 gain 118 20 -115.17 gain 20 119 -117.90 gain 119 20 -119.34 gain 20 120 -111.23 gain 120 20 -108.22 gain 20 121 -111.36 gain 121 20 -111.12 gain 20 122 -109.56 gain 122 20 -111.83 gain 20 123 -111.89 gain 123 20 -111.68 gain 20 124 -107.01 gain 124 20 -106.79 gain 20 125 -110.65 gain 125 20 -112.04 gain 20 126 -109.56 gain 126 20 -107.25 gain 20 127 -110.86 gain 127 20 -110.14 gain 20 128 -112.40 gain 128 20 -113.55 gain 20 129 -109.50 gain 129 20 -108.05 gain 20 130 -104.37 gain 130 20 -105.60 gain 20 131 -114.02 gain 131 20 -113.12 gain 20 132 -112.63 gain 132 20 -114.35 gain 20 133 -108.65 gain 133 20 -108.47 gain 20 134 -112.31 gain 134 20 -111.93 gain 20 135 -119.09 gain 135 20 -120.42 gain 20 136 -112.73 gain 136 20 -115.34 gain 20 137 -113.88 gain 137 20 -114.28 gain 20 138 -108.88 gain 138 20 -105.51 gain 20 139 -111.89 gain 139 20 -110.42 gain 20 140 -109.72 gain 140 20 -114.31 gain 20 141 -111.45 gain 141 20 -110.93 gain 20 142 -110.92 gain 142 20 -115.21 gain 20 143 -110.53 gain 143 20 -110.36 gain 20 144 -117.03 gain 144 20 -117.76 gain 20 145 -115.96 gain 145 20 -116.29 gain 20 146 -116.06 gain 146 20 -113.95 gain 20 147 -121.55 gain 147 20 -123.29 gain 20 148 -115.45 gain 148 20 -116.11 gain 20 149 -120.22 gain 149 20 -120.13 gain 20 150 -115.02 gain 150 20 -120.05 gain 20 151 -111.31 gain 151 20 -109.90 gain 20 152 -115.97 gain 152 20 -116.38 gain 20 153 -110.99 gain 153 20 -113.83 gain 20 154 -106.85 gain 154 20 -105.31 gain 20 155 -111.86 gain 155 20 -114.14 gain 20 156 -112.28 gain 156 20 -112.58 gain 20 157 -109.95 gain 157 20 -112.22 gain 20 158 -118.51 gain 158 20 -121.21 gain 20 159 -119.16 gain 159 20 -115.50 gain 20 160 -117.27 gain 160 20 -115.88 gain 20 161 -113.53 gain 161 20 -114.99 gain 20 162 -110.85 gain 162 20 -109.40 gain 20 163 -114.14 gain 163 20 -109.88 gain 20 164 -114.38 gain 164 20 -111.86 gain 20 165 -117.53 gain 165 20 -117.94 gain 20 166 -110.36 gain 166 20 -113.44 gain 20 167 -117.06 gain 167 20 -119.27 gain 20 168 -106.91 gain 168 20 -110.46 gain 20 169 -115.97 gain 169 20 -111.88 gain 20 170 -115.99 gain 170 20 -122.38 gain 20 171 -108.18 gain 171 20 -111.00 gain 20 172 -114.90 gain 172 20 -110.82 gain 20 173 -117.27 gain 173 20 -117.85 gain 20 174 -117.03 gain 174 20 -117.37 gain 20 175 -115.16 gain 175 20 -114.71 gain 20 176 -117.21 gain 176 20 -116.72 gain 20 177 -118.54 gain 177 20 -119.53 gain 20 178 -116.32 gain 178 20 -118.26 gain 20 179 -118.78 gain 179 20 -121.75 gain 20 180 -115.14 gain 180 20 -113.91 gain 20 181 -116.01 gain 181 20 -119.22 gain 20 182 -111.00 gain 182 20 -110.51 gain 20 183 -119.57 gain 183 20 -120.38 gain 20 184 -112.08 gain 184 20 -114.94 gain 20 185 -109.56 gain 185 20 -107.85 gain 20 186 -129.46 gain 186 20 -126.75 gain 20 187 -122.95 gain 187 20 -124.33 gain 20 188 -121.00 gain 188 20 -125.13 gain 20 189 -122.30 gain 189 20 -125.83 gain 20 190 -116.74 gain 190 20 -115.94 gain 20 191 -116.00 gain 191 20 -118.23 gain 20 192 -119.87 gain 192 20 -119.43 gain 20 193 -113.13 gain 193 20 -116.65 gain 20 194 -120.33 gain 194 20 -123.42 gain 20 195 -120.56 gain 195 20 -121.84 gain 20 196 -120.62 gain 196 20 -120.93 gain 20 197 -117.57 gain 197 20 -120.55 gain 20 198 -116.89 gain 198 20 -123.81 gain 20 199 -112.50 gain 199 20 -110.98 gain 20 200 -118.79 gain 200 20 -114.04 gain 20 201 -119.80 gain 201 20 -118.87 gain 20 202 -119.10 gain 202 20 -119.70 gain 20 203 -115.11 gain 203 20 -112.33 gain 20 204 -121.56 gain 204 20 -125.87 gain 20 205 -117.88 gain 205 20 -120.26 gain 20 206 -118.80 gain 206 20 -119.15 gain 20 207 -119.70 gain 207 20 -120.81 gain 20 208 -121.04 gain 208 20 -122.33 gain 20 209 -117.62 gain 209 20 -114.91 gain 20 210 -119.23 gain 210 20 -123.10 gain 20 211 -118.87 gain 211 20 -119.01 gain 20 212 -117.85 gain 212 20 -115.54 gain 20 213 -117.67 gain 213 20 -120.21 gain 20 214 -123.94 gain 214 20 -122.79 gain 20 215 -118.87 gain 215 20 -118.81 gain 20 216 -119.87 gain 216 20 -120.63 gain 20 217 -123.30 gain 217 20 -127.88 gain 20 218 -115.51 gain 218 20 -112.28 gain 20 219 -115.30 gain 219 20 -114.89 gain 20 220 -119.37 gain 220 20 -115.32 gain 20 221 -119.39 gain 221 20 -119.84 gain 20 222 -121.04 gain 222 20 -122.86 gain 20 223 -124.95 gain 223 20 -128.78 gain 20 224 -119.30 gain 224 20 -123.63 gain 21 22 -85.66 gain 22 21 -88.89 gain 21 23 -86.97 gain 23 21 -89.51 gain 21 24 -99.47 gain 24 21 -104.88 gain 21 25 -99.76 gain 25 21 -100.98 gain 21 26 -102.19 gain 26 21 -102.76 gain 21 27 -104.26 gain 27 21 -105.33 gain 21 28 -114.20 gain 28 21 -112.98 gain 21 29 -108.87 gain 29 21 -113.30 gain 21 30 -104.30 gain 30 21 -106.40 gain 21 31 -106.40 gain 31 21 -106.87 gain 21 32 -106.12 gain 32 21 -106.34 gain 21 33 -102.98 gain 33 21 -103.37 gain 21 34 -91.61 gain 34 21 -89.88 gain 21 35 -84.96 gain 35 21 -85.63 gain 21 36 -83.32 gain 36 21 -85.67 gain 21 37 -84.12 gain 37 21 -88.41 gain 21 38 -95.14 gain 38 21 -91.60 gain 21 39 -96.75 gain 39 21 -94.81 gain 21 40 -100.92 gain 40 21 -100.15 gain 21 41 -109.06 gain 41 21 -110.36 gain 21 42 -112.73 gain 42 21 -111.66 gain 21 43 -108.36 gain 43 21 -106.07 gain 21 44 -106.47 gain 44 21 -107.25 gain 21 45 -102.86 gain 45 21 -104.58 gain 21 46 -101.77 gain 46 21 -103.40 gain 21 47 -105.17 gain 47 21 -104.73 gain 21 48 -104.78 gain 48 21 -108.21 gain 21 49 -93.05 gain 49 21 -95.33 gain 21 50 -79.94 gain 50 21 -78.58 gain 21 51 -99.98 gain 51 21 -97.10 gain 21 52 -93.22 gain 52 21 -97.61 gain 21 53 -99.95 gain 53 21 -98.86 gain 21 54 -103.90 gain 54 21 -106.39 gain 21 55 -106.60 gain 55 21 -104.24 gain 21 56 -106.00 gain 56 21 -108.53 gain 21 57 -109.45 gain 57 21 -108.77 gain 21 58 -108.13 gain 58 21 -109.16 gain 21 59 -110.16 gain 59 21 -113.63 gain 21 60 -111.18 gain 60 21 -111.94 gain 21 61 -111.08 gain 61 21 -113.27 gain 21 62 -102.27 gain 62 21 -104.02 gain 21 63 -97.46 gain 63 21 -100.44 gain 21 64 -99.64 gain 64 21 -97.41 gain 21 65 -100.15 gain 65 21 -96.52 gain 21 66 -104.79 gain 66 21 -104.23 gain 21 67 -99.88 gain 67 21 -98.20 gain 21 68 -104.78 gain 68 21 -110.40 gain 21 69 -102.75 gain 69 21 -102.08 gain 21 70 -99.27 gain 70 21 -100.13 gain 21 71 -105.85 gain 71 21 -106.58 gain 21 72 -109.51 gain 72 21 -108.21 gain 21 73 -113.54 gain 73 21 -113.08 gain 21 74 -115.67 gain 74 21 -117.50 gain 21 75 -113.26 gain 75 21 -112.76 gain 21 76 -102.15 gain 76 21 -102.68 gain 21 77 -104.30 gain 77 21 -107.79 gain 21 78 -109.59 gain 78 21 -109.98 gain 21 79 -103.55 gain 79 21 -101.88 gain 21 80 -102.20 gain 80 21 -102.05 gain 21 81 -104.21 gain 81 21 -102.02 gain 21 82 -103.04 gain 82 21 -103.70 gain 21 83 -103.06 gain 83 21 -103.50 gain 21 84 -107.41 gain 84 21 -105.65 gain 21 85 -102.72 gain 85 21 -99.25 gain 21 86 -111.85 gain 86 21 -116.76 gain 21 87 -113.46 gain 87 21 -114.02 gain 21 88 -108.09 gain 88 21 -109.19 gain 21 89 -111.23 gain 89 21 -112.59 gain 21 90 -110.96 gain 90 21 -113.70 gain 21 91 -107.51 gain 91 21 -109.53 gain 21 92 -106.84 gain 92 21 -109.43 gain 21 93 -103.76 gain 93 21 -107.88 gain 21 94 -108.95 gain 94 21 -107.98 gain 21 95 -106.19 gain 95 21 -108.45 gain 21 96 -109.05 gain 96 21 -106.77 gain 21 97 -97.75 gain 97 21 -98.88 gain 21 98 -104.90 gain 98 21 -104.78 gain 21 99 -105.11 gain 99 21 -108.63 gain 21 100 -110.77 gain 100 21 -116.00 gain 21 101 -104.64 gain 101 21 -105.80 gain 21 102 -110.42 gain 102 21 -111.70 gain 21 103 -110.03 gain 103 21 -111.15 gain 21 104 -111.86 gain 104 21 -108.81 gain 21 105 -108.92 gain 105 21 -111.19 gain 21 106 -111.50 gain 106 21 -112.49 gain 21 107 -110.45 gain 107 21 -111.74 gain 21 108 -101.31 gain 108 21 -102.26 gain 21 109 -105.27 gain 109 21 -108.07 gain 21 110 -99.54 gain 110 21 -99.41 gain 21 111 -112.38 gain 111 21 -114.90 gain 21 112 -106.06 gain 112 21 -108.33 gain 21 113 -108.36 gain 113 21 -112.33 gain 21 114 -110.41 gain 114 21 -111.28 gain 21 115 -107.78 gain 115 21 -103.58 gain 21 116 -106.30 gain 116 21 -107.84 gain 21 117 -115.25 gain 117 21 -119.59 gain 21 118 -117.48 gain 118 21 -119.19 gain 21 119 -113.76 gain 119 21 -114.95 gain 21 120 -107.83 gain 120 21 -104.57 gain 21 121 -111.07 gain 121 21 -110.58 gain 21 122 -113.63 gain 122 21 -115.65 gain 21 123 -109.44 gain 123 21 -108.98 gain 21 124 -106.03 gain 124 21 -105.56 gain 21 125 -113.91 gain 125 21 -115.05 gain 21 126 -113.80 gain 126 21 -111.25 gain 21 127 -106.95 gain 127 21 -105.97 gain 21 128 -108.09 gain 128 21 -108.98 gain 21 129 -116.48 gain 129 21 -114.77 gain 21 130 -112.95 gain 130 21 -113.93 gain 21 131 -108.85 gain 131 21 -107.69 gain 21 132 -113.86 gain 132 21 -115.33 gain 21 133 -118.46 gain 133 21 -118.03 gain 21 134 -122.17 gain 134 21 -121.54 gain 21 135 -116.61 gain 135 21 -117.69 gain 21 136 -111.14 gain 136 21 -113.51 gain 21 137 -115.17 gain 137 21 -115.31 gain 21 138 -113.07 gain 138 21 -109.46 gain 21 139 -109.71 gain 139 21 -107.99 gain 21 140 -116.47 gain 140 21 -120.81 gain 21 141 -109.36 gain 141 21 -108.58 gain 21 142 -111.41 gain 142 21 -115.45 gain 21 143 -111.08 gain 143 21 -110.66 gain 21 144 -112.64 gain 144 21 -113.12 gain 21 145 -114.64 gain 145 21 -114.71 gain 21 146 -111.13 gain 146 21 -108.76 gain 21 147 -118.21 gain 147 21 -119.69 gain 21 148 -115.25 gain 148 21 -115.66 gain 21 149 -109.85 gain 149 21 -109.51 gain 21 150 -112.01 gain 150 21 -116.79 gain 21 151 -120.55 gain 151 21 -118.89 gain 21 152 -109.43 gain 152 21 -109.59 gain 21 153 -110.56 gain 153 21 -113.15 gain 21 154 -109.90 gain 154 21 -108.11 gain 21 155 -117.29 gain 155 21 -119.33 gain 21 156 -109.75 gain 156 21 -109.81 gain 21 157 -113.75 gain 157 21 -115.77 gain 21 158 -111.24 gain 158 21 -113.69 gain 21 159 -116.74 gain 159 21 -112.83 gain 21 160 -122.32 gain 160 21 -120.68 gain 21 161 -114.51 gain 161 21 -115.73 gain 21 162 -113.26 gain 162 21 -111.56 gain 21 163 -116.40 gain 163 21 -111.88 gain 21 164 -115.81 gain 164 21 -113.04 gain 21 165 -117.62 gain 165 21 -117.79 gain 21 166 -119.22 gain 166 21 -122.06 gain 21 167 -112.78 gain 167 21 -114.74 gain 21 168 -113.62 gain 168 21 -116.93 gain 21 169 -119.14 gain 169 21 -114.80 gain 21 170 -111.54 gain 170 21 -117.69 gain 21 171 -111.01 gain 171 21 -113.59 gain 21 172 -110.80 gain 172 21 -106.47 gain 21 173 -110.73 gain 173 21 -111.06 gain 21 174 -105.09 gain 174 21 -105.19 gain 21 175 -127.61 gain 175 21 -126.91 gain 21 176 -112.89 gain 176 21 -112.15 gain 21 177 -127.01 gain 177 21 -127.75 gain 21 178 -116.83 gain 178 21 -118.52 gain 21 179 -119.93 gain 179 21 -122.65 gain 21 180 -115.15 gain 180 21 -113.67 gain 21 181 -118.57 gain 181 21 -121.53 gain 21 182 -110.86 gain 182 21 -110.12 gain 21 183 -112.27 gain 183 21 -112.84 gain 21 184 -112.76 gain 184 21 -115.37 gain 21 185 -114.64 gain 185 21 -112.68 gain 21 186 -111.07 gain 186 21 -108.11 gain 21 187 -124.18 gain 187 21 -125.30 gain 21 188 -113.67 gain 188 21 -117.55 gain 21 189 -116.20 gain 189 21 -119.48 gain 21 190 -113.48 gain 190 21 -112.43 gain 21 191 -114.35 gain 191 21 -116.34 gain 21 192 -118.54 gain 192 21 -117.84 gain 21 193 -118.25 gain 193 21 -121.53 gain 21 194 -108.46 gain 194 21 -111.31 gain 21 195 -114.78 gain 195 21 -115.82 gain 21 196 -119.78 gain 196 21 -119.84 gain 21 197 -117.33 gain 197 21 -120.06 gain 21 198 -116.99 gain 198 21 -123.65 gain 21 199 -114.51 gain 199 21 -112.74 gain 21 200 -114.85 gain 200 21 -109.86 gain 21 201 -120.81 gain 201 21 -119.63 gain 21 202 -120.95 gain 202 21 -121.30 gain 21 203 -121.44 gain 203 21 -118.42 gain 21 204 -119.79 gain 204 21 -123.85 gain 21 205 -120.32 gain 205 21 -122.45 gain 21 206 -116.41 gain 206 21 -116.52 gain 21 207 -119.40 gain 207 21 -120.27 gain 21 208 -116.40 gain 208 21 -117.44 gain 21 209 -117.10 gain 209 21 -114.14 gain 21 210 -115.25 gain 210 21 -118.88 gain 21 211 -122.32 gain 211 21 -122.21 gain 21 212 -117.87 gain 212 21 -115.30 gain 21 213 -108.07 gain 213 21 -110.37 gain 21 214 -113.23 gain 214 21 -111.83 gain 21 215 -118.64 gain 215 21 -118.33 gain 21 216 -113.23 gain 216 21 -113.74 gain 21 217 -114.22 gain 217 21 -118.56 gain 21 218 -114.88 gain 218 21 -111.41 gain 21 219 -122.01 gain 219 21 -121.36 gain 21 220 -110.21 gain 220 21 -105.91 gain 21 221 -123.19 gain 221 21 -123.39 gain 21 222 -122.08 gain 222 21 -123.65 gain 21 223 -126.89 gain 223 21 -130.47 gain 21 224 -118.36 gain 224 21 -122.44 gain 22 23 -87.74 gain 23 22 -87.05 gain 22 24 -101.20 gain 24 22 -103.39 gain 22 25 -103.03 gain 25 22 -101.03 gain 22 26 -103.66 gain 26 22 -101.00 gain 22 27 -103.50 gain 27 22 -101.34 gain 22 28 -109.19 gain 28 22 -104.75 gain 22 29 -115.21 gain 29 22 -116.42 gain 22 30 -117.42 gain 30 22 -116.29 gain 22 31 -107.84 gain 31 22 -105.08 gain 22 32 -114.00 gain 32 22 -110.99 gain 22 33 -115.44 gain 33 22 -112.61 gain 22 34 -101.45 gain 34 22 -96.50 gain 22 35 -96.16 gain 35 22 -93.60 gain 22 36 -91.43 gain 36 22 -90.56 gain 22 37 -86.25 gain 37 22 -87.32 gain 22 38 -97.55 gain 38 22 -90.78 gain 22 39 -96.33 gain 39 22 -91.16 gain 22 40 -106.64 gain 40 22 -102.64 gain 22 41 -105.29 gain 41 22 -103.37 gain 22 42 -112.95 gain 42 22 -108.66 gain 22 43 -118.49 gain 43 22 -112.98 gain 22 44 -105.81 gain 44 22 -103.37 gain 22 45 -114.85 gain 45 22 -113.34 gain 22 46 -117.97 gain 46 22 -116.38 gain 22 47 -115.47 gain 47 22 -111.81 gain 22 48 -109.42 gain 48 22 -109.63 gain 22 49 -100.56 gain 49 22 -99.63 gain 22 50 -106.21 gain 50 22 -101.63 gain 22 51 -103.52 gain 51 22 -97.41 gain 22 52 -95.81 gain 52 22 -96.98 gain 22 53 -95.06 gain 53 22 -90.75 gain 22 54 -108.34 gain 54 22 -107.61 gain 22 55 -104.71 gain 55 22 -99.13 gain 22 56 -104.70 gain 56 22 -104.01 gain 22 57 -113.48 gain 57 22 -109.58 gain 22 58 -116.49 gain 58 22 -114.30 gain 22 59 -111.31 gain 59 22 -111.56 gain 22 60 -116.67 gain 60 22 -114.20 gain 22 61 -109.87 gain 61 22 -108.84 gain 22 62 -107.09 gain 62 22 -105.61 gain 22 63 -108.42 gain 63 22 -108.18 gain 22 64 -101.34 gain 64 22 -95.89 gain 22 65 -101.29 gain 65 22 -94.43 gain 22 66 -101.68 gain 66 22 -97.89 gain 22 67 -103.85 gain 67 22 -98.94 gain 22 68 -103.53 gain 68 22 -105.92 gain 22 69 -102.42 gain 69 22 -98.54 gain 22 70 -108.87 gain 70 22 -106.51 gain 22 71 -114.23 gain 71 22 -111.73 gain 22 72 -108.47 gain 72 22 -103.94 gain 22 73 -114.80 gain 73 22 -111.11 gain 22 74 -113.17 gain 74 22 -111.77 gain 22 75 -110.83 gain 75 22 -107.11 gain 22 76 -109.93 gain 76 22 -107.23 gain 22 77 -116.62 gain 77 22 -116.88 gain 22 78 -107.46 gain 78 22 -104.63 gain 22 79 -103.42 gain 79 22 -98.53 gain 22 80 -108.29 gain 80 22 -104.92 gain 22 81 -105.43 gain 81 22 -100.02 gain 22 82 -100.64 gain 82 22 -98.08 gain 22 83 -107.78 gain 83 22 -105.00 gain 22 84 -107.54 gain 84 22 -102.56 gain 22 85 -107.91 gain 85 22 -101.21 gain 22 86 -109.88 gain 86 22 -111.57 gain 22 87 -113.24 gain 87 22 -110.58 gain 22 88 -116.40 gain 88 22 -114.29 gain 22 89 -116.90 gain 89 22 -115.04 gain 22 90 -113.89 gain 90 22 -113.40 gain 22 91 -112.10 gain 91 22 -110.89 gain 22 92 -114.42 gain 92 22 -113.78 gain 22 93 -116.70 gain 93 22 -117.60 gain 22 94 -108.06 gain 94 22 -103.87 gain 22 95 -110.43 gain 95 22 -109.47 gain 22 96 -112.31 gain 96 22 -106.81 gain 22 97 -102.50 gain 97 22 -100.41 gain 22 98 -112.04 gain 98 22 -108.70 gain 22 99 -105.30 gain 99 22 -105.60 gain 22 100 -106.87 gain 100 22 -108.88 gain 22 101 -109.85 gain 101 22 -107.79 gain 22 102 -112.05 gain 102 22 -110.12 gain 22 103 -113.58 gain 103 22 -111.48 gain 22 104 -122.20 gain 104 22 -115.92 gain 22 105 -115.74 gain 105 22 -114.79 gain 22 106 -116.89 gain 106 22 -114.65 gain 22 107 -115.37 gain 107 22 -113.43 gain 22 108 -107.36 gain 108 22 -105.09 gain 22 109 -116.10 gain 109 22 -115.67 gain 22 110 -115.19 gain 110 22 -111.83 gain 22 111 -111.24 gain 111 22 -110.54 gain 22 112 -112.81 gain 112 22 -111.86 gain 22 113 -110.88 gain 113 22 -111.63 gain 22 114 -109.56 gain 114 22 -107.22 gain 22 115 -116.09 gain 115 22 -108.66 gain 22 116 -113.46 gain 116 22 -111.78 gain 22 117 -108.60 gain 117 22 -109.72 gain 22 118 -122.57 gain 118 22 -121.06 gain 22 119 -113.50 gain 119 22 -111.47 gain 22 120 -120.65 gain 120 22 -114.17 gain 22 121 -110.50 gain 121 22 -106.78 gain 22 122 -114.61 gain 122 22 -113.41 gain 22 123 -114.72 gain 123 22 -111.03 gain 22 124 -117.25 gain 124 22 -113.55 gain 22 125 -116.03 gain 125 22 -113.94 gain 22 126 -116.94 gain 126 22 -111.17 gain 22 127 -108.17 gain 127 22 -103.97 gain 22 128 -110.21 gain 128 22 -107.88 gain 22 129 -112.41 gain 129 22 -107.49 gain 22 130 -110.73 gain 130 22 -108.49 gain 22 131 -109.05 gain 131 22 -104.67 gain 22 132 -113.23 gain 132 22 -111.47 gain 22 133 -119.20 gain 133 22 -115.55 gain 22 134 -117.91 gain 134 22 -114.06 gain 22 135 -120.48 gain 135 22 -118.33 gain 22 136 -123.76 gain 136 22 -122.91 gain 22 137 -116.42 gain 137 22 -113.35 gain 22 138 -111.36 gain 138 22 -104.52 gain 22 139 -119.98 gain 139 22 -115.04 gain 22 140 -105.94 gain 140 22 -107.06 gain 22 141 -110.78 gain 141 22 -106.79 gain 22 142 -106.81 gain 142 22 -107.62 gain 22 143 -112.63 gain 143 22 -108.98 gain 22 144 -111.04 gain 144 22 -108.30 gain 22 145 -119.97 gain 145 22 -116.82 gain 22 146 -112.19 gain 146 22 -106.60 gain 22 147 -112.92 gain 147 22 -111.18 gain 22 148 -115.75 gain 148 22 -112.94 gain 22 149 -123.31 gain 149 22 -119.75 gain 22 150 -113.73 gain 150 22 -115.29 gain 22 151 -125.31 gain 151 22 -120.43 gain 22 152 -120.64 gain 152 22 -117.58 gain 22 153 -113.82 gain 153 22 -113.19 gain 22 154 -114.20 gain 154 22 -109.19 gain 22 155 -109.99 gain 155 22 -108.81 gain 22 156 -115.44 gain 156 22 -112.27 gain 22 157 -114.17 gain 157 22 -112.96 gain 22 158 -119.39 gain 158 22 -118.61 gain 22 159 -118.15 gain 159 22 -111.02 gain 22 160 -119.71 gain 160 22 -114.85 gain 22 161 -123.29 gain 161 22 -121.29 gain 22 162 -120.54 gain 162 22 -115.62 gain 22 163 -119.57 gain 163 22 -111.83 gain 22 164 -119.18 gain 164 22 -113.19 gain 22 165 -116.97 gain 165 22 -113.91 gain 22 166 -113.58 gain 166 22 -113.20 gain 22 167 -112.73 gain 167 22 -111.46 gain 22 168 -132.94 gain 168 22 -133.02 gain 22 169 -115.16 gain 169 22 -107.60 gain 22 170 -120.85 gain 170 22 -123.77 gain 22 171 -119.14 gain 171 22 -118.49 gain 22 172 -119.38 gain 172 22 -111.83 gain 22 173 -116.29 gain 173 22 -113.40 gain 22 174 -119.07 gain 174 22 -115.94 gain 22 175 -122.93 gain 175 22 -119.01 gain 22 176 -118.01 gain 176 22 -114.04 gain 22 177 -119.00 gain 177 22 -116.52 gain 22 178 -121.45 gain 178 22 -119.92 gain 22 179 -116.06 gain 179 22 -115.56 gain 22 180 -123.25 gain 180 22 -118.55 gain 22 181 -123.17 gain 181 22 -122.91 gain 22 182 -114.92 gain 182 22 -110.96 gain 22 183 -118.79 gain 183 22 -116.13 gain 22 184 -115.25 gain 184 22 -114.64 gain 22 185 -117.31 gain 185 22 -112.13 gain 22 186 -124.14 gain 186 22 -117.96 gain 22 187 -114.77 gain 187 22 -112.68 gain 22 188 -117.58 gain 188 22 -118.25 gain 22 189 -123.41 gain 189 22 -123.47 gain 22 190 -117.26 gain 190 22 -112.99 gain 22 191 -125.08 gain 191 22 -123.84 gain 22 192 -118.09 gain 192 22 -114.17 gain 22 193 -123.96 gain 193 22 -124.02 gain 22 194 -118.03 gain 194 22 -117.65 gain 22 195 -119.53 gain 195 22 -117.34 gain 22 196 -131.44 gain 196 22 -128.28 gain 22 197 -119.28 gain 197 22 -118.79 gain 22 198 -116.48 gain 198 22 -119.93 gain 22 199 -113.29 gain 199 22 -108.31 gain 22 200 -120.55 gain 200 22 -112.33 gain 22 201 -121.68 gain 201 22 -117.28 gain 22 202 -122.67 gain 202 22 -119.80 gain 22 203 -118.47 gain 203 22 -112.23 gain 22 204 -125.12 gain 204 22 -125.96 gain 22 205 -118.96 gain 205 22 -117.86 gain 22 206 -123.58 gain 206 22 -120.46 gain 22 207 -121.86 gain 207 22 -119.50 gain 22 208 -119.76 gain 208 22 -117.58 gain 22 209 -131.73 gain 209 22 -125.54 gain 22 210 -122.19 gain 210 22 -122.60 gain 22 211 -123.45 gain 211 22 -120.12 gain 22 212 -125.45 gain 212 22 -119.66 gain 22 213 -121.95 gain 213 22 -121.03 gain 22 214 -120.54 gain 214 22 -115.91 gain 22 215 -114.34 gain 215 22 -110.81 gain 22 216 -114.82 gain 216 22 -112.11 gain 22 217 -121.97 gain 217 22 -123.08 gain 22 218 -128.28 gain 218 22 -121.58 gain 22 219 -114.92 gain 219 22 -111.05 gain 22 220 -125.46 gain 220 22 -117.93 gain 22 221 -124.96 gain 221 22 -121.94 gain 22 222 -125.92 gain 222 22 -124.26 gain 22 223 -120.41 gain 223 22 -120.77 gain 22 224 -123.50 gain 224 22 -124.35 gain 23 24 -85.70 gain 24 23 -88.57 gain 23 25 -104.01 gain 25 23 -102.70 gain 23 26 -101.91 gain 26 23 -99.94 gain 23 27 -99.71 gain 27 23 -98.24 gain 23 28 -104.90 gain 28 23 -101.14 gain 23 29 -110.08 gain 29 23 -111.97 gain 23 30 -119.12 gain 30 23 -118.68 gain 23 31 -117.32 gain 31 23 -115.25 gain 23 32 -109.02 gain 32 23 -106.70 gain 23 33 -109.89 gain 33 23 -107.75 gain 23 34 -102.18 gain 34 23 -97.91 gain 23 35 -101.49 gain 35 23 -99.63 gain 23 36 -101.08 gain 36 23 -100.89 gain 23 37 -92.63 gain 37 23 -94.38 gain 23 38 -88.59 gain 38 23 -82.51 gain 23 39 -89.57 gain 39 23 -85.09 gain 23 40 -93.69 gain 40 23 -90.39 gain 23 41 -96.57 gain 41 23 -95.33 gain 23 42 -108.72 gain 42 23 -105.12 gain 23 43 -108.35 gain 43 23 -103.52 gain 23 44 -111.64 gain 44 23 -109.89 gain 23 45 -112.17 gain 45 23 -111.35 gain 23 46 -111.25 gain 46 23 -110.35 gain 23 47 -117.93 gain 47 23 -114.96 gain 23 48 -110.72 gain 48 23 -111.61 gain 23 49 -111.35 gain 49 23 -111.10 gain 23 50 -100.02 gain 50 23 -96.13 gain 23 51 -104.54 gain 51 23 -99.13 gain 23 52 -92.64 gain 52 23 -94.50 gain 23 53 -98.41 gain 53 23 -94.79 gain 23 54 -92.09 gain 54 23 -92.04 gain 23 55 -101.67 gain 55 23 -96.77 gain 23 56 -104.13 gain 56 23 -104.13 gain 23 57 -106.89 gain 57 23 -103.68 gain 23 58 -118.15 gain 58 23 -116.65 gain 23 59 -114.53 gain 59 23 -115.46 gain 23 60 -115.25 gain 60 23 -113.46 gain 23 61 -112.67 gain 61 23 -112.33 gain 23 62 -111.07 gain 62 23 -110.28 gain 23 63 -110.35 gain 63 23 -110.80 gain 23 64 -109.92 gain 64 23 -105.15 gain 23 65 -104.27 gain 65 23 -98.10 gain 23 66 -102.68 gain 66 23 -99.58 gain 23 67 -107.61 gain 67 23 -103.39 gain 23 68 -101.16 gain 68 23 -104.24 gain 23 69 -101.66 gain 69 23 -98.46 gain 23 70 -104.17 gain 70 23 -102.48 gain 23 71 -105.79 gain 71 23 -103.98 gain 23 72 -103.85 gain 72 23 -100.02 gain 23 73 -110.24 gain 73 23 -107.24 gain 23 74 -103.88 gain 74 23 -103.17 gain 23 75 -109.58 gain 75 23 -106.55 gain 23 76 -114.27 gain 76 23 -112.25 gain 23 77 -113.47 gain 77 23 -114.42 gain 23 78 -113.08 gain 78 23 -110.94 gain 23 79 -100.29 gain 79 23 -96.08 gain 23 80 -110.11 gain 80 23 -107.42 gain 23 81 -108.90 gain 81 23 -104.18 gain 23 82 -106.93 gain 82 23 -105.05 gain 23 83 -101.98 gain 83 23 -99.88 gain 23 84 -102.06 gain 84 23 -97.77 gain 23 85 -104.87 gain 85 23 -98.86 gain 23 86 -108.30 gain 86 23 -110.67 gain 23 87 -104.97 gain 87 23 -102.99 gain 23 88 -116.57 gain 88 23 -115.14 gain 23 89 -109.50 gain 89 23 -108.33 gain 23 90 -112.78 gain 90 23 -112.98 gain 23 91 -114.32 gain 91 23 -113.80 gain 23 92 -114.64 gain 92 23 -114.69 gain 23 93 -107.84 gain 93 23 -109.43 gain 23 94 -115.40 gain 94 23 -111.89 gain 23 95 -112.85 gain 95 23 -112.58 gain 23 96 -103.03 gain 96 23 -98.22 gain 23 97 -108.86 gain 97 23 -107.45 gain 23 98 -107.46 gain 98 23 -104.80 gain 23 99 -105.54 gain 99 23 -106.53 gain 23 100 -110.74 gain 100 23 -113.43 gain 23 101 -112.76 gain 101 23 -111.38 gain 23 102 -105.51 gain 102 23 -104.26 gain 23 103 -113.82 gain 103 23 -112.40 gain 23 104 -113.42 gain 104 23 -107.82 gain 23 105 -112.60 gain 105 23 -112.34 gain 23 106 -117.71 gain 106 23 -116.16 gain 23 107 -110.92 gain 107 23 -109.67 gain 23 108 -115.61 gain 108 23 -114.02 gain 23 109 -117.91 gain 109 23 -118.17 gain 23 110 -106.34 gain 110 23 -103.67 gain 23 111 -112.32 gain 111 23 -112.31 gain 23 112 -104.49 gain 112 23 -104.23 gain 23 113 -106.33 gain 113 23 -107.76 gain 23 114 -111.50 gain 114 23 -109.84 gain 23 115 -113.49 gain 115 23 -106.75 gain 23 116 -113.91 gain 116 23 -112.91 gain 23 117 -118.81 gain 117 23 -120.61 gain 23 118 -114.37 gain 118 23 -113.55 gain 23 119 -117.16 gain 119 23 -115.82 gain 23 120 -120.84 gain 120 23 -115.04 gain 23 121 -114.46 gain 121 23 -111.43 gain 23 122 -119.29 gain 122 23 -118.77 gain 23 123 -117.33 gain 123 23 -114.33 gain 23 124 -113.66 gain 124 23 -110.65 gain 23 125 -114.20 gain 125 23 -112.79 gain 23 126 -110.92 gain 126 23 -105.83 gain 23 127 -108.87 gain 127 23 -105.36 gain 23 128 -110.14 gain 128 23 -108.50 gain 23 129 -115.93 gain 129 23 -111.69 gain 23 130 -111.59 gain 130 23 -110.03 gain 23 131 -108.60 gain 131 23 -104.91 gain 23 132 -109.70 gain 132 23 -108.63 gain 23 133 -105.63 gain 133 23 -102.66 gain 23 134 -112.13 gain 134 23 -108.96 gain 23 135 -120.58 gain 135 23 -119.12 gain 23 136 -119.52 gain 136 23 -119.35 gain 23 137 -118.83 gain 137 23 -116.44 gain 23 138 -120.39 gain 138 23 -114.24 gain 23 139 -119.16 gain 139 23 -114.90 gain 23 140 -123.63 gain 140 23 -125.43 gain 23 141 -112.43 gain 141 23 -109.11 gain 23 142 -111.27 gain 142 23 -112.77 gain 23 143 -115.68 gain 143 23 -112.72 gain 23 144 -113.74 gain 144 23 -111.69 gain 23 145 -117.51 gain 145 23 -115.05 gain 23 146 -120.03 gain 146 23 -115.12 gain 23 147 -117.87 gain 147 23 -116.82 gain 23 148 -116.47 gain 148 23 -114.35 gain 23 149 -116.35 gain 149 23 -113.48 gain 23 150 -121.83 gain 150 23 -124.07 gain 23 151 -126.91 gain 151 23 -122.71 gain 23 152 -117.54 gain 152 23 -115.16 gain 23 153 -117.51 gain 153 23 -117.57 gain 23 154 -115.98 gain 154 23 -111.65 gain 23 155 -115.40 gain 155 23 -114.90 gain 23 156 -115.97 gain 156 23 -113.49 gain 23 157 -112.28 gain 157 23 -111.76 gain 23 158 -117.40 gain 158 23 -117.31 gain 23 159 -121.25 gain 159 23 -114.80 gain 23 160 -120.27 gain 160 23 -116.09 gain 23 161 -118.95 gain 161 23 -117.63 gain 23 162 -114.76 gain 162 23 -110.52 gain 23 163 -115.71 gain 163 23 -108.66 gain 23 164 -123.32 gain 164 23 -118.01 gain 23 165 -118.10 gain 165 23 -115.73 gain 23 166 -116.93 gain 166 23 -117.23 gain 23 167 -116.65 gain 167 23 -116.07 gain 23 168 -117.58 gain 168 23 -118.35 gain 23 169 -120.80 gain 169 23 -113.92 gain 23 170 -117.70 gain 170 23 -121.31 gain 23 171 -118.85 gain 171 23 -118.88 gain 23 172 -123.52 gain 172 23 -116.65 gain 23 173 -116.71 gain 173 23 -114.50 gain 23 174 -113.31 gain 174 23 -110.87 gain 23 175 -123.58 gain 175 23 -120.34 gain 23 176 -124.15 gain 176 23 -120.86 gain 23 177 -114.02 gain 177 23 -112.23 gain 23 178 -104.61 gain 178 23 -103.77 gain 23 179 -119.81 gain 179 23 -119.99 gain 23 180 -121.05 gain 180 23 -117.03 gain 23 181 -119.37 gain 181 23 -119.79 gain 23 182 -115.81 gain 182 23 -112.53 gain 23 183 -126.04 gain 183 23 -124.06 gain 23 184 -121.52 gain 184 23 -121.60 gain 23 185 -119.41 gain 185 23 -114.92 gain 23 186 -120.94 gain 186 23 -115.44 gain 23 187 -121.46 gain 187 23 -120.05 gain 23 188 -122.93 gain 188 23 -124.28 gain 23 189 -126.35 gain 189 23 -127.10 gain 23 190 -121.06 gain 190 23 -117.47 gain 23 191 -115.32 gain 191 23 -114.76 gain 23 192 -117.04 gain 192 23 -113.80 gain 23 193 -121.63 gain 193 23 -122.37 gain 23 194 -113.86 gain 194 23 -114.17 gain 23 195 -124.48 gain 195 23 -122.98 gain 23 196 -124.13 gain 196 23 -121.66 gain 23 197 -118.13 gain 197 23 -118.33 gain 23 198 -120.94 gain 198 23 -125.07 gain 23 199 -111.69 gain 199 23 -107.39 gain 23 200 -115.70 gain 200 23 -108.17 gain 23 201 -113.09 gain 201 23 -109.38 gain 23 202 -116.68 gain 202 23 -114.49 gain 23 203 -123.09 gain 203 23 -117.53 gain 23 204 -116.37 gain 204 23 -117.90 gain 23 205 -122.28 gain 205 23 -121.87 gain 23 206 -114.90 gain 206 23 -112.47 gain 23 207 -116.82 gain 207 23 -115.15 gain 23 208 -116.90 gain 208 23 -115.40 gain 23 209 -128.13 gain 209 23 -122.63 gain 23 210 -121.38 gain 210 23 -122.47 gain 23 211 -117.74 gain 211 23 -115.09 gain 23 212 -122.63 gain 212 23 -117.52 gain 23 213 -117.78 gain 213 23 -117.54 gain 23 214 -122.68 gain 214 23 -118.75 gain 23 215 -121.21 gain 215 23 -118.36 gain 23 216 -124.44 gain 216 23 -122.42 gain 23 217 -118.98 gain 217 23 -120.78 gain 23 218 -119.67 gain 218 23 -113.66 gain 23 219 -122.53 gain 219 23 -119.33 gain 23 220 -111.59 gain 220 23 -104.75 gain 23 221 -126.69 gain 221 23 -124.35 gain 23 222 -122.45 gain 222 23 -121.49 gain 23 223 -117.02 gain 223 23 -118.06 gain 23 224 -121.61 gain 224 23 -123.15 gain 24 25 -86.16 gain 25 24 -81.97 gain 24 26 -96.20 gain 26 24 -91.35 gain 24 27 -104.34 gain 27 24 -99.99 gain 24 28 -111.80 gain 28 24 -105.16 gain 24 29 -106.86 gain 29 24 -105.87 gain 24 30 -119.71 gain 30 24 -116.39 gain 24 31 -106.60 gain 31 24 -101.65 gain 24 32 -112.61 gain 32 24 -107.41 gain 24 33 -112.23 gain 33 24 -107.21 gain 24 34 -105.87 gain 34 24 -98.73 gain 24 35 -110.25 gain 35 24 -105.51 gain 24 36 -114.51 gain 36 24 -111.45 gain 24 37 -102.28 gain 37 24 -101.16 gain 24 38 -94.47 gain 38 24 -85.51 gain 24 39 -81.91 gain 39 24 -74.56 gain 24 40 -89.86 gain 40 24 -83.68 gain 24 41 -102.37 gain 41 24 -98.26 gain 24 42 -105.18 gain 42 24 -98.71 gain 24 43 -104.34 gain 43 24 -96.63 gain 24 44 -105.27 gain 44 24 -100.64 gain 24 45 -110.48 gain 45 24 -106.79 gain 24 46 -113.47 gain 46 24 -109.69 gain 24 47 -117.29 gain 47 24 -111.44 gain 24 48 -110.91 gain 48 24 -108.93 gain 24 49 -110.38 gain 49 24 -107.25 gain 24 50 -114.88 gain 50 24 -108.11 gain 24 51 -112.67 gain 51 24 -104.38 gain 24 52 -99.45 gain 52 24 -98.43 gain 24 53 -102.63 gain 53 24 -96.12 gain 24 54 -96.53 gain 54 24 -93.60 gain 24 55 -104.63 gain 55 24 -96.86 gain 24 56 -100.04 gain 56 24 -97.17 gain 24 57 -105.71 gain 57 24 -99.62 gain 24 58 -103.96 gain 58 24 -99.58 gain 24 59 -106.94 gain 59 24 -104.99 gain 24 60 -116.63 gain 60 24 -111.97 gain 24 61 -114.52 gain 61 24 -111.30 gain 24 62 -112.12 gain 62 24 -108.45 gain 24 63 -109.41 gain 63 24 -106.98 gain 24 64 -114.15 gain 64 24 -106.51 gain 24 65 -110.50 gain 65 24 -101.45 gain 24 66 -109.22 gain 66 24 -103.25 gain 24 67 -109.67 gain 67 24 -102.58 gain 24 68 -102.64 gain 68 24 -102.84 gain 24 69 -105.79 gain 69 24 -99.72 gain 24 70 -103.85 gain 70 24 -99.29 gain 24 71 -109.96 gain 71 24 -105.27 gain 24 72 -103.32 gain 72 24 -96.61 gain 24 73 -99.24 gain 73 24 -93.37 gain 24 74 -112.13 gain 74 24 -108.54 gain 24 75 -116.54 gain 75 24 -110.63 gain 24 76 -112.39 gain 76 24 -107.50 gain 24 77 -122.34 gain 77 24 -120.41 gain 24 78 -121.01 gain 78 24 -115.99 gain 24 79 -117.04 gain 79 24 -109.96 gain 24 80 -111.93 gain 80 24 -106.36 gain 24 81 -107.05 gain 81 24 -99.44 gain 24 82 -112.54 gain 82 24 -107.79 gain 24 83 -111.22 gain 83 24 -106.25 gain 24 84 -98.50 gain 84 24 -91.34 gain 24 85 -104.72 gain 85 24 -95.84 gain 24 86 -107.98 gain 86 24 -107.48 gain 24 87 -114.42 gain 87 24 -109.57 gain 24 88 -119.53 gain 88 24 -115.22 gain 24 89 -114.74 gain 89 24 -110.69 gain 24 90 -120.44 gain 90 24 -117.77 gain 24 91 -123.79 gain 91 24 -120.40 gain 24 92 -115.14 gain 92 24 -112.31 gain 24 93 -108.62 gain 93 24 -107.33 gain 24 94 -111.79 gain 94 24 -105.41 gain 24 95 -113.73 gain 95 24 -110.58 gain 24 96 -107.23 gain 96 24 -99.54 gain 24 97 -107.03 gain 97 24 -102.75 gain 24 98 -108.87 gain 98 24 -103.34 gain 24 99 -105.71 gain 99 24 -103.81 gain 24 100 -119.90 gain 100 24 -119.72 gain 24 101 -108.58 gain 101 24 -104.33 gain 24 102 -113.82 gain 102 24 -109.70 gain 24 103 -114.78 gain 103 24 -110.49 gain 24 104 -117.14 gain 104 24 -108.68 gain 24 105 -118.11 gain 105 24 -114.97 gain 24 106 -117.47 gain 106 24 -113.05 gain 24 107 -120.62 gain 107 24 -116.49 gain 24 108 -118.89 gain 108 24 -114.42 gain 24 109 -115.03 gain 109 24 -112.41 gain 24 110 -109.65 gain 110 24 -104.10 gain 24 111 -124.07 gain 111 24 -121.18 gain 24 112 -113.53 gain 112 24 -110.39 gain 24 113 -113.32 gain 113 24 -111.88 gain 24 114 -110.99 gain 114 24 -106.45 gain 24 115 -113.45 gain 115 24 -103.84 gain 24 116 -110.96 gain 116 24 -107.08 gain 24 117 -118.56 gain 117 24 -117.49 gain 24 118 -114.76 gain 118 24 -111.06 gain 24 119 -115.40 gain 119 24 -111.18 gain 24 120 -124.07 gain 120 24 -115.39 gain 24 121 -125.57 gain 121 24 -119.67 gain 24 122 -118.84 gain 122 24 -115.44 gain 24 123 -118.87 gain 123 24 -112.99 gain 24 124 -112.46 gain 124 24 -106.57 gain 24 125 -116.97 gain 125 24 -112.69 gain 24 126 -112.34 gain 126 24 -104.38 gain 24 127 -112.67 gain 127 24 -106.28 gain 24 128 -116.88 gain 128 24 -112.36 gain 24 129 -118.73 gain 129 24 -111.62 gain 24 130 -107.66 gain 130 24 -103.23 gain 24 131 -115.04 gain 131 24 -108.47 gain 24 132 -121.42 gain 132 24 -117.47 gain 24 133 -116.84 gain 133 24 -111.00 gain 24 134 -117.72 gain 134 24 -111.68 gain 24 135 -122.51 gain 135 24 -118.17 gain 24 136 -117.81 gain 136 24 -114.76 gain 24 137 -122.28 gain 137 24 -117.01 gain 24 138 -122.06 gain 138 24 -113.03 gain 24 139 -120.83 gain 139 24 -113.70 gain 24 140 -111.06 gain 140 24 -109.99 gain 24 141 -121.25 gain 141 24 -115.06 gain 24 142 -117.31 gain 142 24 -115.94 gain 24 143 -116.50 gain 143 24 -110.67 gain 24 144 -125.24 gain 144 24 -120.31 gain 24 145 -123.13 gain 145 24 -117.80 gain 24 146 -121.14 gain 146 24 -113.36 gain 24 147 -110.31 gain 147 24 -106.38 gain 24 148 -125.04 gain 148 24 -120.04 gain 24 149 -122.05 gain 149 24 -116.30 gain 24 150 -121.42 gain 150 24 -120.78 gain 24 151 -121.71 gain 151 24 -114.63 gain 24 152 -120.10 gain 152 24 -114.86 gain 24 153 -119.41 gain 153 24 -116.59 gain 24 154 -121.51 gain 154 24 -114.31 gain 24 155 -121.97 gain 155 24 -118.59 gain 24 156 -118.50 gain 156 24 -113.14 gain 24 157 -128.89 gain 157 24 -125.49 gain 24 158 -117.69 gain 158 24 -114.72 gain 24 159 -120.13 gain 159 24 -110.80 gain 24 160 -115.53 gain 160 24 -108.48 gain 24 161 -120.75 gain 161 24 -116.55 gain 24 162 -121.45 gain 162 24 -114.33 gain 24 163 -126.81 gain 163 24 -116.88 gain 24 164 -112.84 gain 164 24 -104.66 gain 24 165 -123.43 gain 165 24 -118.18 gain 24 166 -126.22 gain 166 24 -123.64 gain 24 167 -116.28 gain 167 24 -112.83 gain 24 168 -122.90 gain 168 24 -120.79 gain 24 169 -122.59 gain 169 24 -112.84 gain 24 170 -114.96 gain 170 24 -115.69 gain 24 171 -115.64 gain 171 24 -112.80 gain 24 172 -124.57 gain 172 24 -114.83 gain 24 173 -119.40 gain 173 24 -114.32 gain 24 174 -115.69 gain 174 24 -110.37 gain 24 175 -118.46 gain 175 24 -112.35 gain 24 176 -116.81 gain 176 24 -110.65 gain 24 177 -119.08 gain 177 24 -114.41 gain 24 178 -113.40 gain 178 24 -109.68 gain 24 179 -119.34 gain 179 24 -116.65 gain 24 180 -120.37 gain 180 24 -113.48 gain 24 181 -120.83 gain 181 24 -118.38 gain 24 182 -123.89 gain 182 24 -117.74 gain 24 183 -124.86 gain 183 24 -120.00 gain 24 184 -122.06 gain 184 24 -119.26 gain 24 185 -123.05 gain 185 24 -115.68 gain 24 186 -129.99 gain 186 24 -121.61 gain 24 187 -120.35 gain 187 24 -116.06 gain 24 188 -124.00 gain 188 24 -122.47 gain 24 189 -126.55 gain 189 24 -124.42 gain 24 190 -110.38 gain 190 24 -103.91 gain 24 191 -127.52 gain 191 24 -124.09 gain 24 192 -129.01 gain 192 24 -122.90 gain 24 193 -126.23 gain 193 24 -124.09 gain 24 194 -123.86 gain 194 24 -121.29 gain 24 195 -119.94 gain 195 24 -115.57 gain 24 196 -118.67 gain 196 24 -113.32 gain 24 197 -113.19 gain 197 24 -110.51 gain 24 198 -114.40 gain 198 24 -115.66 gain 24 199 -127.53 gain 199 24 -120.35 gain 24 200 -121.89 gain 200 24 -111.48 gain 24 201 -125.60 gain 201 24 -119.01 gain 24 202 -121.13 gain 202 24 -116.07 gain 24 203 -121.56 gain 203 24 -113.13 gain 24 204 -118.96 gain 204 24 -117.61 gain 24 205 -124.67 gain 205 24 -121.38 gain 24 206 -130.23 gain 206 24 -124.92 gain 24 207 -123.94 gain 207 24 -119.39 gain 24 208 -129.51 gain 208 24 -125.14 gain 24 209 -117.08 gain 209 24 -108.71 gain 24 210 -123.51 gain 210 24 -121.73 gain 24 211 -118.01 gain 211 24 -112.48 gain 24 212 -125.14 gain 212 24 -117.16 gain 24 213 -124.41 gain 213 24 -121.30 gain 24 214 -120.00 gain 214 24 -113.18 gain 24 215 -126.35 gain 215 24 -120.62 gain 24 216 -124.49 gain 216 24 -119.59 gain 24 217 -129.75 gain 217 24 -128.67 gain 24 218 -119.30 gain 218 24 -110.41 gain 24 219 -119.08 gain 219 24 -113.02 gain 24 220 -128.68 gain 220 24 -118.96 gain 24 221 -124.97 gain 221 24 -119.76 gain 24 222 -127.29 gain 222 24 -123.45 gain 24 223 -124.17 gain 223 24 -122.33 gain 24 224 -122.95 gain 224 24 -121.61 gain 25 26 -83.06 gain 26 25 -82.41 gain 25 27 -98.43 gain 27 25 -98.27 gain 25 28 -94.28 gain 28 25 -91.83 gain 25 29 -108.48 gain 29 25 -111.68 gain 25 30 -113.77 gain 30 25 -114.64 gain 25 31 -111.25 gain 31 25 -110.49 gain 25 32 -114.94 gain 32 25 -113.93 gain 25 33 -109.93 gain 33 25 -109.10 gain 25 34 -108.55 gain 34 25 -105.60 gain 25 35 -111.50 gain 35 25 -110.95 gain 25 36 -103.54 gain 36 25 -104.67 gain 25 37 -96.40 gain 37 25 -99.47 gain 25 38 -88.97 gain 38 25 -84.21 gain 25 39 -89.66 gain 39 25 -86.49 gain 25 40 -87.73 gain 40 25 -85.74 gain 25 41 -86.30 gain 41 25 -86.38 gain 25 42 -91.45 gain 42 25 -89.17 gain 25 43 -109.54 gain 43 25 -106.02 gain 25 44 -104.02 gain 44 25 -103.58 gain 25 45 -111.11 gain 45 25 -111.61 gain 25 46 -112.13 gain 46 25 -112.54 gain 25 47 -110.45 gain 47 25 -108.79 gain 25 48 -117.10 gain 48 25 -119.31 gain 25 49 -109.41 gain 49 25 -110.47 gain 25 50 -110.59 gain 50 25 -108.01 gain 25 51 -105.52 gain 51 25 -101.42 gain 25 52 -103.47 gain 52 25 -106.64 gain 25 53 -102.52 gain 53 25 -100.21 gain 25 54 -101.17 gain 54 25 -102.44 gain 25 55 -94.45 gain 55 25 -90.87 gain 25 56 -93.07 gain 56 25 -94.39 gain 25 57 -99.19 gain 57 25 -97.30 gain 25 58 -99.41 gain 58 25 -99.22 gain 25 59 -114.32 gain 59 25 -116.57 gain 25 60 -114.87 gain 60 25 -114.40 gain 25 61 -116.64 gain 61 25 -117.61 gain 25 62 -115.66 gain 62 25 -116.19 gain 25 63 -113.60 gain 63 25 -115.36 gain 25 64 -105.77 gain 64 25 -102.32 gain 25 65 -115.45 gain 65 25 -110.60 gain 25 66 -97.02 gain 66 25 -95.24 gain 25 67 -106.74 gain 67 25 -103.84 gain 25 68 -94.82 gain 68 25 -99.21 gain 25 69 -96.56 gain 69 25 -94.68 gain 25 70 -102.30 gain 70 25 -101.93 gain 25 71 -103.09 gain 71 25 -102.59 gain 25 72 -101.95 gain 72 25 -99.43 gain 25 73 -106.52 gain 73 25 -104.84 gain 25 74 -113.63 gain 74 25 -114.23 gain 25 75 -119.47 gain 75 25 -117.75 gain 25 76 -116.38 gain 76 25 -115.68 gain 25 77 -113.03 gain 77 25 -115.30 gain 25 78 -116.88 gain 78 25 -116.05 gain 25 79 -117.88 gain 79 25 -114.99 gain 25 80 -117.16 gain 80 25 -115.78 gain 25 81 -113.34 gain 81 25 -109.93 gain 25 82 -105.30 gain 82 25 -104.74 gain 25 83 -103.18 gain 83 25 -102.40 gain 25 84 -109.17 gain 84 25 -106.19 gain 25 85 -108.47 gain 85 25 -103.77 gain 25 86 -107.81 gain 86 25 -111.49 gain 25 87 -108.62 gain 87 25 -107.96 gain 25 88 -112.02 gain 88 25 -111.90 gain 25 89 -103.06 gain 89 25 -103.21 gain 25 90 -117.32 gain 90 25 -118.83 gain 25 91 -110.15 gain 91 25 -110.95 gain 25 92 -126.17 gain 92 25 -127.54 gain 25 93 -115.53 gain 93 25 -118.43 gain 25 94 -108.31 gain 94 25 -106.12 gain 25 95 -118.89 gain 95 25 -119.93 gain 25 96 -110.72 gain 96 25 -107.22 gain 25 97 -108.55 gain 97 25 -108.46 gain 25 98 -99.58 gain 98 25 -98.24 gain 25 99 -104.99 gain 99 25 -107.29 gain 25 100 -109.40 gain 100 25 -113.40 gain 25 101 -110.31 gain 101 25 -110.25 gain 25 102 -105.39 gain 102 25 -105.46 gain 25 103 -105.15 gain 103 25 -105.05 gain 25 104 -106.21 gain 104 25 -101.93 gain 25 105 -118.68 gain 105 25 -119.73 gain 25 106 -112.52 gain 106 25 -112.28 gain 25 107 -115.94 gain 107 25 -116.01 gain 25 108 -117.15 gain 108 25 -116.88 gain 25 109 -119.20 gain 109 25 -120.78 gain 25 110 -117.23 gain 110 25 -115.87 gain 25 111 -113.00 gain 111 25 -114.30 gain 25 112 -112.60 gain 112 25 -113.65 gain 25 113 -111.09 gain 113 25 -113.84 gain 25 114 -108.15 gain 114 25 -107.80 gain 25 115 -115.20 gain 115 25 -109.77 gain 25 116 -113.00 gain 116 25 -113.32 gain 25 117 -118.60 gain 117 25 -121.72 gain 25 118 -109.79 gain 118 25 -110.29 gain 25 119 -111.24 gain 119 25 -111.21 gain 25 120 -110.76 gain 120 25 -106.28 gain 25 121 -121.87 gain 121 25 -120.15 gain 25 122 -119.58 gain 122 25 -120.38 gain 25 123 -107.51 gain 123 25 -105.83 gain 25 124 -112.50 gain 124 25 -110.81 gain 25 125 -109.98 gain 125 25 -109.90 gain 25 126 -111.03 gain 126 25 -107.26 gain 25 127 -114.19 gain 127 25 -111.99 gain 25 128 -116.17 gain 128 25 -115.84 gain 25 129 -115.58 gain 129 25 -112.66 gain 25 130 -120.62 gain 130 25 -120.38 gain 25 131 -107.15 gain 131 25 -104.78 gain 25 132 -111.24 gain 132 25 -111.48 gain 25 133 -104.51 gain 133 25 -102.86 gain 25 134 -112.35 gain 134 25 -110.49 gain 25 135 -124.09 gain 135 25 -123.95 gain 25 136 -117.19 gain 136 25 -118.34 gain 25 137 -113.24 gain 137 25 -112.16 gain 25 138 -117.07 gain 138 25 -112.23 gain 25 139 -121.31 gain 139 25 -118.37 gain 25 140 -112.19 gain 140 25 -115.31 gain 25 141 -115.63 gain 141 25 -113.63 gain 25 142 -116.59 gain 142 25 -119.41 gain 25 143 -113.45 gain 143 25 -111.81 gain 25 144 -117.80 gain 144 25 -117.06 gain 25 145 -106.21 gain 145 25 -105.07 gain 25 146 -114.45 gain 146 25 -110.86 gain 25 147 -109.11 gain 147 25 -109.37 gain 25 148 -113.57 gain 148 25 -112.76 gain 25 149 -114.93 gain 149 25 -113.37 gain 25 150 -116.66 gain 150 25 -120.21 gain 25 151 -117.57 gain 151 25 -114.69 gain 25 152 -113.26 gain 152 25 -112.20 gain 25 153 -117.68 gain 153 25 -119.05 gain 25 154 -110.00 gain 154 25 -106.98 gain 25 155 -115.72 gain 155 25 -116.54 gain 25 156 -114.94 gain 156 25 -113.77 gain 25 157 -117.19 gain 157 25 -117.98 gain 25 158 -112.13 gain 158 25 -113.36 gain 25 159 -119.26 gain 159 25 -114.12 gain 25 160 -114.18 gain 160 25 -111.31 gain 25 161 -114.02 gain 161 25 -114.02 gain 25 162 -115.54 gain 162 25 -112.62 gain 25 163 -118.60 gain 163 25 -112.86 gain 25 164 -109.67 gain 164 25 -105.68 gain 25 165 -113.73 gain 165 25 -112.67 gain 25 166 -125.87 gain 166 25 -127.48 gain 25 167 -121.51 gain 167 25 -122.25 gain 25 168 -114.94 gain 168 25 -117.03 gain 25 169 -118.29 gain 169 25 -112.73 gain 25 170 -118.07 gain 170 25 -122.99 gain 25 171 -111.44 gain 171 25 -112.79 gain 25 172 -115.21 gain 172 25 -109.66 gain 25 173 -116.00 gain 173 25 -115.11 gain 25 174 -120.77 gain 174 25 -119.64 gain 25 175 -118.88 gain 175 25 -116.95 gain 25 176 -119.30 gain 176 25 -117.33 gain 25 177 -123.01 gain 177 25 -122.53 gain 25 178 -117.46 gain 178 25 -117.93 gain 25 179 -118.67 gain 179 25 -120.17 gain 25 180 -121.93 gain 180 25 -119.23 gain 25 181 -117.92 gain 181 25 -119.66 gain 25 182 -120.43 gain 182 25 -118.47 gain 25 183 -121.17 gain 183 25 -120.51 gain 25 184 -129.59 gain 184 25 -130.98 gain 25 185 -110.77 gain 185 25 -107.59 gain 25 186 -114.05 gain 186 25 -109.87 gain 25 187 -113.93 gain 187 25 -113.84 gain 25 188 -115.38 gain 188 25 -118.04 gain 25 189 -116.92 gain 189 25 -118.98 gain 25 190 -109.80 gain 190 25 -107.53 gain 25 191 -114.41 gain 191 25 -115.17 gain 25 192 -118.14 gain 192 25 -116.22 gain 25 193 -115.31 gain 193 25 -117.36 gain 25 194 -124.24 gain 194 25 -125.86 gain 25 195 -119.95 gain 195 25 -119.77 gain 25 196 -123.24 gain 196 25 -122.08 gain 25 197 -122.72 gain 197 25 -124.23 gain 25 198 -113.71 gain 198 25 -119.16 gain 25 199 -122.65 gain 199 25 -119.66 gain 25 200 -119.34 gain 200 25 -113.12 gain 25 201 -112.91 gain 201 25 -110.52 gain 25 202 -120.37 gain 202 25 -119.50 gain 25 203 -131.49 gain 203 25 -127.24 gain 25 204 -121.04 gain 204 25 -123.88 gain 25 205 -117.88 gain 205 25 -118.79 gain 25 206 -121.33 gain 206 25 -120.21 gain 25 207 -116.21 gain 207 25 -115.86 gain 25 208 -122.87 gain 208 25 -122.69 gain 25 209 -122.28 gain 209 25 -118.10 gain 25 210 -118.88 gain 210 25 -121.28 gain 25 211 -116.57 gain 211 25 -115.24 gain 25 212 -128.23 gain 212 25 -124.44 gain 25 213 -120.48 gain 213 25 -121.55 gain 25 214 -116.95 gain 214 25 -114.33 gain 25 215 -117.50 gain 215 25 -115.97 gain 25 216 -120.23 gain 216 25 -119.52 gain 25 217 -116.60 gain 217 25 -119.72 gain 25 218 -117.64 gain 218 25 -112.94 gain 25 219 -120.98 gain 219 25 -119.10 gain 25 220 -118.63 gain 220 25 -113.10 gain 25 221 -116.19 gain 221 25 -115.17 gain 25 222 -122.46 gain 222 25 -122.81 gain 25 223 -125.86 gain 223 25 -128.21 gain 25 224 -124.71 gain 224 25 -127.57 gain 26 27 -78.92 gain 27 26 -79.42 gain 26 28 -93.49 gain 28 26 -91.71 gain 26 29 -101.89 gain 29 26 -105.75 gain 26 30 -113.66 gain 30 26 -115.19 gain 26 31 -108.26 gain 31 26 -108.16 gain 26 32 -117.72 gain 32 26 -117.37 gain 26 33 -119.64 gain 33 26 -119.46 gain 26 34 -105.47 gain 34 26 -103.18 gain 26 35 -108.58 gain 35 26 -108.68 gain 26 36 -104.92 gain 36 26 -106.71 gain 26 37 -103.24 gain 37 26 -106.96 gain 26 38 -99.49 gain 38 26 -95.38 gain 26 39 -91.23 gain 39 26 -88.72 gain 26 40 -84.55 gain 40 26 -83.21 gain 26 41 -82.20 gain 41 26 -82.94 gain 26 42 -92.11 gain 42 26 -90.48 gain 26 43 -94.80 gain 43 26 -91.94 gain 26 44 -95.21 gain 44 26 -95.42 gain 26 45 -109.07 gain 45 26 -110.22 gain 26 46 -114.64 gain 46 26 -115.70 gain 26 47 -122.24 gain 47 26 -121.24 gain 26 48 -108.71 gain 48 26 -111.57 gain 26 49 -118.98 gain 49 26 -120.70 gain 26 50 -104.65 gain 50 26 -102.73 gain 26 51 -97.28 gain 51 26 -93.83 gain 26 52 -100.70 gain 52 26 -104.53 gain 26 53 -99.59 gain 53 26 -97.94 gain 26 54 -96.46 gain 54 26 -98.38 gain 26 55 -91.92 gain 55 26 -88.99 gain 26 56 -97.81 gain 56 26 -99.78 gain 26 57 -95.54 gain 57 26 -94.29 gain 26 58 -101.30 gain 58 26 -101.76 gain 26 59 -104.33 gain 59 26 -107.23 gain 26 60 -117.03 gain 60 26 -117.21 gain 26 61 -121.25 gain 61 26 -122.88 gain 26 62 -115.95 gain 62 26 -117.13 gain 26 63 -111.23 gain 63 26 -113.64 gain 26 64 -113.44 gain 64 26 -110.64 gain 26 65 -109.84 gain 65 26 -105.64 gain 26 66 -106.79 gain 66 26 -105.66 gain 26 67 -108.57 gain 67 26 -106.32 gain 26 68 -108.51 gain 68 26 -113.56 gain 26 69 -105.97 gain 69 26 -104.74 gain 26 70 -103.01 gain 70 26 -103.30 gain 26 71 -102.28 gain 71 26 -102.44 gain 26 72 -95.52 gain 72 26 -93.66 gain 26 73 -105.34 gain 73 26 -104.31 gain 26 74 -107.82 gain 74 26 -109.08 gain 26 75 -116.00 gain 75 26 -114.93 gain 26 76 -124.80 gain 76 26 -124.75 gain 26 77 -113.49 gain 77 26 -116.41 gain 26 78 -111.65 gain 78 26 -111.48 gain 26 79 -110.97 gain 79 26 -108.73 gain 26 80 -113.39 gain 80 26 -112.66 gain 26 81 -111.76 gain 81 26 -109.01 gain 26 82 -98.88 gain 82 26 -98.98 gain 26 83 -106.94 gain 83 26 -106.82 gain 26 84 -102.48 gain 84 26 -100.16 gain 26 85 -107.60 gain 85 26 -103.56 gain 26 86 -104.53 gain 86 26 -108.87 gain 26 87 -103.18 gain 87 26 -103.17 gain 26 88 -104.69 gain 88 26 -105.23 gain 26 89 -108.30 gain 89 26 -109.09 gain 26 90 -117.33 gain 90 26 -119.50 gain 26 91 -118.29 gain 91 26 -119.74 gain 26 92 -120.20 gain 92 26 -122.23 gain 26 93 -108.44 gain 93 26 -112.00 gain 26 94 -108.80 gain 94 26 -107.26 gain 26 95 -115.56 gain 95 26 -117.25 gain 26 96 -114.71 gain 96 26 -111.86 gain 26 97 -105.43 gain 97 26 -106.00 gain 26 98 -111.01 gain 98 26 -110.32 gain 26 99 -106.97 gain 99 26 -109.93 gain 26 100 -114.09 gain 100 26 -118.76 gain 26 101 -108.05 gain 101 26 -108.64 gain 26 102 -100.08 gain 102 26 -100.80 gain 26 103 -102.65 gain 103 26 -103.21 gain 26 104 -110.37 gain 104 26 -106.75 gain 26 105 -121.12 gain 105 26 -122.82 gain 26 106 -119.58 gain 106 26 -120.00 gain 26 107 -113.78 gain 107 26 -114.51 gain 26 108 -110.70 gain 108 26 -111.08 gain 26 109 -115.68 gain 109 26 -117.91 gain 26 110 -113.59 gain 110 26 -112.89 gain 26 111 -105.23 gain 111 26 -107.19 gain 26 112 -107.59 gain 112 26 -109.30 gain 26 113 -105.04 gain 113 26 -108.44 gain 26 114 -114.12 gain 114 26 -114.43 gain 26 115 -107.87 gain 115 26 -103.10 gain 26 116 -103.24 gain 116 26 -104.21 gain 26 117 -112.53 gain 117 26 -116.31 gain 26 118 -113.03 gain 118 26 -114.18 gain 26 119 -109.94 gain 119 26 -110.56 gain 26 120 -119.14 gain 120 26 -115.31 gain 26 121 -117.22 gain 121 26 -116.16 gain 26 122 -109.30 gain 122 26 -110.75 gain 26 123 -121.69 gain 123 26 -120.66 gain 26 124 -109.58 gain 124 26 -108.54 gain 26 125 -118.31 gain 125 26 -118.88 gain 26 126 -111.11 gain 126 26 -107.99 gain 26 127 -105.01 gain 127 26 -103.47 gain 26 128 -109.87 gain 128 26 -110.20 gain 26 129 -111.52 gain 129 26 -109.25 gain 26 130 -111.21 gain 130 26 -111.62 gain 26 131 -108.46 gain 131 26 -106.74 gain 26 132 -109.03 gain 132 26 -109.93 gain 26 133 -114.04 gain 133 26 -113.04 gain 26 134 -108.03 gain 134 26 -106.83 gain 26 135 -118.65 gain 135 26 -119.16 gain 26 136 -113.98 gain 136 26 -115.78 gain 26 137 -118.11 gain 137 26 -117.69 gain 26 138 -111.21 gain 138 26 -107.03 gain 26 139 -122.53 gain 139 26 -120.25 gain 26 140 -115.56 gain 140 26 -119.34 gain 26 141 -111.17 gain 141 26 -109.83 gain 26 142 -115.83 gain 142 26 -119.30 gain 26 143 -114.47 gain 143 26 -113.48 gain 26 144 -105.55 gain 144 26 -105.47 gain 26 145 -106.83 gain 145 26 -106.34 gain 26 146 -106.69 gain 146 26 -103.75 gain 26 147 -112.63 gain 147 26 -113.54 gain 26 148 -123.22 gain 148 26 -123.07 gain 26 149 -115.37 gain 149 26 -114.47 gain 26 150 -118.58 gain 150 26 -122.79 gain 26 151 -119.62 gain 151 26 -117.39 gain 26 152 -118.66 gain 152 26 -118.25 gain 26 153 -115.94 gain 153 26 -117.97 gain 26 154 -117.95 gain 154 26 -115.59 gain 26 155 -125.77 gain 155 26 -127.24 gain 26 156 -117.80 gain 156 26 -117.29 gain 26 157 -113.84 gain 157 26 -115.29 gain 26 158 -107.45 gain 158 26 -109.33 gain 26 159 -109.43 gain 159 26 -104.95 gain 26 160 -113.44 gain 160 26 -111.23 gain 26 161 -107.42 gain 161 26 -108.07 gain 26 162 -112.45 gain 162 26 -110.19 gain 26 163 -110.00 gain 163 26 -104.92 gain 26 164 -113.90 gain 164 26 -110.56 gain 26 165 -119.99 gain 165 26 -119.58 gain 26 166 -120.05 gain 166 26 -122.32 gain 26 167 -121.96 gain 167 26 -123.35 gain 26 168 -120.81 gain 168 26 -123.55 gain 26 169 -116.29 gain 169 26 -111.38 gain 26 170 -121.65 gain 170 26 -127.23 gain 26 171 -119.35 gain 171 26 -121.35 gain 26 172 -116.72 gain 172 26 -111.82 gain 26 173 -118.19 gain 173 26 -117.95 gain 26 174 -127.36 gain 174 26 -126.89 gain 26 175 -117.50 gain 175 26 -116.23 gain 26 176 -117.20 gain 176 26 -115.89 gain 26 177 -111.95 gain 177 26 -112.13 gain 26 178 -115.74 gain 178 26 -116.87 gain 26 179 -113.88 gain 179 26 -116.04 gain 26 180 -123.29 gain 180 26 -121.24 gain 26 181 -124.47 gain 181 26 -126.87 gain 26 182 -127.28 gain 182 26 -125.98 gain 26 183 -115.11 gain 183 26 -115.11 gain 26 184 -120.48 gain 184 26 -122.53 gain 26 185 -121.29 gain 185 26 -118.76 gain 26 186 -113.85 gain 186 26 -110.32 gain 26 187 -118.21 gain 187 26 -118.77 gain 26 188 -116.39 gain 188 26 -119.71 gain 26 189 -117.05 gain 189 26 -119.76 gain 26 190 -120.04 gain 190 26 -118.43 gain 26 191 -119.38 gain 191 26 -120.79 gain 26 192 -125.32 gain 192 26 -124.05 gain 26 193 -106.24 gain 193 26 -108.95 gain 26 194 -117.44 gain 194 26 -119.72 gain 26 195 -123.45 gain 195 26 -123.92 gain 26 196 -117.04 gain 196 26 -116.54 gain 26 197 -119.73 gain 197 26 -121.90 gain 26 198 -120.12 gain 198 26 -126.22 gain 26 199 -125.04 gain 199 26 -122.71 gain 26 200 -117.36 gain 200 26 -111.80 gain 26 201 -119.71 gain 201 26 -117.97 gain 26 202 -123.45 gain 202 26 -123.23 gain 26 203 -113.20 gain 203 26 -109.61 gain 26 204 -121.97 gain 204 26 -125.46 gain 26 205 -122.35 gain 205 26 -123.91 gain 26 206 -114.58 gain 206 26 -114.12 gain 26 207 -124.19 gain 207 26 -124.49 gain 26 208 -112.86 gain 208 26 -113.33 gain 26 209 -122.43 gain 209 26 -118.90 gain 26 210 -123.22 gain 210 26 -126.28 gain 26 211 -120.43 gain 211 26 -119.75 gain 26 212 -119.51 gain 212 26 -116.37 gain 26 213 -117.71 gain 213 26 -119.45 gain 26 214 -122.35 gain 214 26 -120.39 gain 26 215 -118.09 gain 215 26 -117.21 gain 26 216 -126.70 gain 216 26 -126.64 gain 26 217 -111.46 gain 217 26 -115.23 gain 26 218 -122.97 gain 218 26 -118.92 gain 26 219 -118.85 gain 219 26 -117.63 gain 26 220 -122.14 gain 220 26 -117.27 gain 26 221 -118.18 gain 221 26 -117.81 gain 26 222 -119.09 gain 222 26 -120.09 gain 26 223 -117.86 gain 223 26 -120.87 gain 26 224 -115.92 gain 224 26 -119.43 gain 27 28 -88.95 gain 28 27 -86.66 gain 27 29 -94.41 gain 29 27 -97.77 gain 27 30 -122.46 gain 30 27 -123.49 gain 27 31 -112.21 gain 31 27 -111.61 gain 27 32 -118.18 gain 32 27 -117.33 gain 27 33 -117.12 gain 33 27 -116.44 gain 27 34 -112.18 gain 34 27 -109.39 gain 27 35 -115.37 gain 35 27 -114.98 gain 27 36 -111.03 gain 36 27 -112.32 gain 27 37 -105.59 gain 37 27 -108.81 gain 27 38 -106.10 gain 38 27 -101.49 gain 27 39 -103.30 gain 39 27 -100.29 gain 27 40 -94.62 gain 40 27 -92.78 gain 27 41 -95.62 gain 41 27 -95.85 gain 27 42 -88.53 gain 42 27 -86.40 gain 27 43 -86.33 gain 43 27 -82.97 gain 27 44 -98.31 gain 44 27 -98.02 gain 27 45 -117.40 gain 45 27 -118.05 gain 27 46 -114.92 gain 46 27 -115.49 gain 27 47 -114.41 gain 47 27 -112.91 gain 27 48 -112.27 gain 48 27 -114.64 gain 27 49 -115.95 gain 49 27 -117.17 gain 27 50 -116.73 gain 50 27 -114.30 gain 27 51 -110.38 gain 51 27 -106.43 gain 27 52 -108.96 gain 52 27 -112.29 gain 27 53 -104.54 gain 53 27 -102.39 gain 27 54 -96.88 gain 54 27 -98.30 gain 27 55 -93.90 gain 55 27 -90.47 gain 27 56 -100.97 gain 56 27 -102.44 gain 27 57 -96.60 gain 57 27 -94.86 gain 27 58 -97.54 gain 58 27 -97.51 gain 27 59 -92.69 gain 59 27 -95.09 gain 27 60 -114.86 gain 60 27 -114.55 gain 27 61 -118.33 gain 61 27 -119.45 gain 27 62 -113.79 gain 62 27 -114.47 gain 27 63 -111.89 gain 63 27 -113.81 gain 27 64 -118.09 gain 64 27 -114.79 gain 27 65 -109.85 gain 65 27 -105.15 gain 27 66 -108.43 gain 66 27 -106.80 gain 27 67 -108.20 gain 67 27 -105.45 gain 27 68 -110.72 gain 68 27 -115.27 gain 27 69 -102.16 gain 69 27 -100.43 gain 27 70 -105.78 gain 70 27 -105.56 gain 27 71 -94.36 gain 71 27 -94.02 gain 27 72 -109.13 gain 72 27 -106.76 gain 27 73 -90.87 gain 73 27 -89.35 gain 27 74 -106.70 gain 74 27 -107.46 gain 27 75 -119.35 gain 75 27 -117.79 gain 27 76 -121.64 gain 76 27 -121.09 gain 27 77 -117.46 gain 77 27 -119.88 gain 27 78 -116.62 gain 78 27 -115.95 gain 27 79 -109.39 gain 79 27 -106.65 gain 27 80 -114.11 gain 80 27 -112.89 gain 27 81 -108.68 gain 81 27 -105.42 gain 27 82 -111.47 gain 82 27 -111.07 gain 27 83 -102.23 gain 83 27 -101.61 gain 27 84 -106.09 gain 84 27 -103.27 gain 27 85 -108.10 gain 85 27 -103.56 gain 27 86 -107.51 gain 86 27 -111.35 gain 27 87 -108.76 gain 87 27 -108.25 gain 27 88 -106.32 gain 88 27 -106.36 gain 27 89 -110.49 gain 89 27 -110.79 gain 27 90 -123.10 gain 90 27 -124.77 gain 27 91 -115.98 gain 91 27 -116.94 gain 27 92 -117.10 gain 92 27 -118.62 gain 27 93 -110.36 gain 93 27 -113.42 gain 27 94 -108.81 gain 94 27 -106.77 gain 27 95 -115.19 gain 95 27 -116.38 gain 27 96 -117.01 gain 96 27 -113.66 gain 27 97 -113.51 gain 97 27 -113.58 gain 27 98 -109.10 gain 98 27 -107.91 gain 27 99 -110.19 gain 99 27 -112.65 gain 27 100 -112.49 gain 100 27 -116.65 gain 27 101 -112.66 gain 101 27 -112.75 gain 27 102 -103.09 gain 102 27 -103.32 gain 27 103 -100.74 gain 103 27 -100.80 gain 27 104 -107.14 gain 104 27 -103.02 gain 27 105 -122.46 gain 105 27 -123.66 gain 27 106 -114.50 gain 106 27 -114.42 gain 27 107 -116.77 gain 107 27 -116.99 gain 27 108 -120.04 gain 108 27 -119.92 gain 27 109 -114.84 gain 109 27 -116.57 gain 27 110 -112.48 gain 110 27 -111.28 gain 27 111 -114.38 gain 111 27 -115.84 gain 27 112 -117.67 gain 112 27 -118.88 gain 27 113 -113.52 gain 113 27 -116.43 gain 27 114 -111.43 gain 114 27 -111.24 gain 27 115 -116.81 gain 115 27 -111.54 gain 27 116 -117.20 gain 116 27 -117.67 gain 27 117 -108.63 gain 117 27 -111.90 gain 27 118 -108.23 gain 118 27 -108.88 gain 27 119 -105.99 gain 119 27 -106.11 gain 27 120 -119.24 gain 120 27 -114.91 gain 27 121 -127.67 gain 121 27 -126.12 gain 27 122 -118.43 gain 122 27 -119.39 gain 27 123 -115.58 gain 123 27 -114.05 gain 27 124 -116.23 gain 124 27 -114.69 gain 27 125 -115.36 gain 125 27 -115.43 gain 27 126 -106.32 gain 126 27 -102.70 gain 27 127 -115.94 gain 127 27 -113.90 gain 27 128 -110.67 gain 128 27 -110.50 gain 27 129 -107.35 gain 129 27 -104.58 gain 27 130 -109.67 gain 130 27 -109.58 gain 27 131 -111.33 gain 131 27 -109.11 gain 27 132 -106.97 gain 132 27 -107.37 gain 27 133 -111.35 gain 133 27 -109.85 gain 27 134 -116.97 gain 134 27 -115.27 gain 27 135 -131.10 gain 135 27 -131.11 gain 27 136 -118.26 gain 136 27 -119.56 gain 27 137 -123.70 gain 137 27 -122.78 gain 27 138 -118.32 gain 138 27 -113.64 gain 27 139 -123.44 gain 139 27 -120.65 gain 27 140 -119.26 gain 140 27 -122.54 gain 27 141 -114.65 gain 141 27 -112.80 gain 27 142 -110.39 gain 142 27 -113.36 gain 27 143 -114.46 gain 143 27 -112.98 gain 27 144 -116.35 gain 144 27 -115.77 gain 27 145 -108.24 gain 145 27 -107.25 gain 27 146 -117.26 gain 146 27 -113.83 gain 27 147 -111.46 gain 147 27 -111.87 gain 27 148 -115.84 gain 148 27 -115.18 gain 27 149 -111.60 gain 149 27 -110.19 gain 27 150 -122.98 gain 150 27 -126.69 gain 27 151 -119.65 gain 151 27 -116.93 gain 27 152 -120.02 gain 152 27 -119.11 gain 27 153 -122.67 gain 153 27 -124.19 gain 27 154 -111.37 gain 154 27 -108.51 gain 27 155 -121.06 gain 155 27 -122.03 gain 27 156 -117.30 gain 156 27 -116.28 gain 27 157 -117.18 gain 157 27 -118.13 gain 27 158 -115.43 gain 158 27 -116.82 gain 27 159 -110.89 gain 159 27 -105.91 gain 27 160 -113.99 gain 160 27 -111.29 gain 27 161 -115.69 gain 161 27 -115.85 gain 27 162 -121.91 gain 162 27 -119.15 gain 27 163 -117.60 gain 163 27 -112.03 gain 27 164 -113.42 gain 164 27 -109.59 gain 27 165 -121.25 gain 165 27 -120.34 gain 27 166 -117.57 gain 166 27 -119.34 gain 27 167 -119.12 gain 167 27 -120.02 gain 27 168 -113.87 gain 168 27 -116.12 gain 27 169 -124.86 gain 169 27 -119.45 gain 27 170 -125.98 gain 170 27 -131.06 gain 27 171 -115.17 gain 171 27 -116.68 gain 27 172 -120.51 gain 172 27 -115.12 gain 27 173 -119.40 gain 173 27 -118.67 gain 27 174 -117.50 gain 174 27 -116.52 gain 27 175 -124.68 gain 175 27 -122.91 gain 27 176 -120.41 gain 176 27 -118.60 gain 27 177 -111.82 gain 177 27 -111.49 gain 27 178 -118.50 gain 178 27 -119.13 gain 27 179 -120.15 gain 179 27 -121.81 gain 27 180 -116.08 gain 180 27 -113.54 gain 27 181 -120.44 gain 181 27 -122.34 gain 27 182 -117.63 gain 182 27 -115.83 gain 27 183 -125.10 gain 183 27 -124.59 gain 27 184 -121.39 gain 184 27 -122.94 gain 27 185 -118.52 gain 185 27 -115.49 gain 27 186 -117.44 gain 186 27 -113.41 gain 27 187 -127.87 gain 187 27 -127.93 gain 27 188 -121.44 gain 188 27 -124.26 gain 27 189 -121.98 gain 189 27 -124.20 gain 27 190 -114.95 gain 190 27 -112.84 gain 27 191 -116.08 gain 191 27 -117.00 gain 27 192 -120.47 gain 192 27 -118.71 gain 27 193 -116.66 gain 193 27 -118.88 gain 27 194 -111.88 gain 194 27 -113.66 gain 27 195 -117.79 gain 195 27 -117.77 gain 27 196 -116.18 gain 196 27 -115.18 gain 27 197 -118.72 gain 197 27 -120.39 gain 27 198 -120.47 gain 198 27 -126.07 gain 27 199 -119.56 gain 199 27 -116.73 gain 27 200 -123.99 gain 200 27 -117.93 gain 27 201 -116.33 gain 201 27 -114.09 gain 27 202 -115.96 gain 202 27 -115.24 gain 27 203 -113.46 gain 203 27 -109.37 gain 27 204 -116.84 gain 204 27 -119.83 gain 27 205 -113.82 gain 205 27 -114.88 gain 27 206 -119.35 gain 206 27 -118.39 gain 27 207 -116.12 gain 207 27 -115.92 gain 27 208 -115.35 gain 208 27 -115.32 gain 27 209 -121.60 gain 209 27 -117.57 gain 27 210 -121.24 gain 210 27 -123.80 gain 27 211 -121.70 gain 211 27 -120.52 gain 27 212 -116.70 gain 212 27 -113.07 gain 27 213 -128.76 gain 213 27 -130.00 gain 27 214 -119.32 gain 214 27 -116.85 gain 27 215 -121.92 gain 215 27 -120.54 gain 27 216 -118.68 gain 216 27 -118.13 gain 27 217 -123.27 gain 217 27 -126.54 gain 27 218 -118.34 gain 218 27 -113.80 gain 27 219 -112.13 gain 219 27 -110.41 gain 27 220 -118.19 gain 220 27 -112.82 gain 27 221 -118.63 gain 221 27 -117.76 gain 27 222 -125.97 gain 222 27 -126.47 gain 27 223 -121.60 gain 223 27 -124.11 gain 27 224 -120.74 gain 224 27 -123.76 gain 28 29 -72.21 gain 29 28 -77.86 gain 28 30 -116.74 gain 30 28 -120.06 gain 28 31 -116.59 gain 31 28 -118.28 gain 28 32 -119.42 gain 32 28 -120.85 gain 28 33 -113.80 gain 33 28 -115.41 gain 28 34 -108.16 gain 34 28 -107.65 gain 28 35 -113.03 gain 35 28 -114.92 gain 28 36 -112.08 gain 36 28 -115.65 gain 28 37 -108.61 gain 37 28 -114.12 gain 28 38 -108.75 gain 38 28 -106.43 gain 28 39 -102.82 gain 39 28 -102.10 gain 28 40 -100.53 gain 40 28 -100.98 gain 28 41 -90.10 gain 41 28 -92.63 gain 28 42 -92.65 gain 42 28 -92.81 gain 28 43 -89.82 gain 43 28 -88.75 gain 28 44 -90.27 gain 44 28 -92.28 gain 28 45 -116.48 gain 45 28 -119.42 gain 28 46 -114.92 gain 46 28 -117.77 gain 28 47 -121.57 gain 47 28 -122.35 gain 28 48 -117.10 gain 48 28 -121.75 gain 28 49 -110.27 gain 49 28 -113.78 gain 28 50 -112.39 gain 50 28 -112.26 gain 28 51 -103.14 gain 51 28 -101.48 gain 28 52 -108.44 gain 52 28 -114.06 gain 28 53 -100.27 gain 53 28 -100.40 gain 28 54 -107.57 gain 54 28 -111.28 gain 28 55 -99.64 gain 55 28 -98.50 gain 28 56 -100.05 gain 56 28 -103.81 gain 28 57 -96.07 gain 57 28 -96.62 gain 28 58 -87.29 gain 58 28 -89.54 gain 28 59 -95.75 gain 59 28 -100.44 gain 28 60 -112.12 gain 60 28 -114.09 gain 28 61 -120.40 gain 61 28 -123.82 gain 28 62 -114.94 gain 62 28 -117.91 gain 28 63 -109.96 gain 63 28 -114.16 gain 28 64 -116.12 gain 64 28 -115.11 gain 28 65 -113.40 gain 65 28 -110.99 gain 28 66 -113.82 gain 66 28 -114.48 gain 28 67 -112.14 gain 67 28 -111.68 gain 28 68 -105.94 gain 68 28 -112.78 gain 28 69 -102.79 gain 69 28 -103.35 gain 28 70 -105.91 gain 70 28 -107.99 gain 28 71 -99.77 gain 71 28 -101.72 gain 28 72 -98.35 gain 72 28 -98.27 gain 28 73 -94.78 gain 73 28 -95.54 gain 28 74 -98.39 gain 74 28 -101.43 gain 28 75 -120.20 gain 75 28 -120.92 gain 28 76 -121.59 gain 76 28 -123.33 gain 28 77 -117.92 gain 77 28 -122.63 gain 28 78 -112.96 gain 78 28 -114.57 gain 28 79 -113.00 gain 79 28 -112.55 gain 28 80 -111.51 gain 80 28 -112.58 gain 28 81 -112.34 gain 81 28 -111.37 gain 28 82 -109.87 gain 82 28 -111.75 gain 28 83 -108.27 gain 83 28 -109.93 gain 28 84 -106.71 gain 84 28 -106.18 gain 28 85 -97.84 gain 85 28 -95.59 gain 28 86 -104.90 gain 86 28 -111.03 gain 28 87 -94.78 gain 87 28 -96.56 gain 28 88 -102.31 gain 88 28 -104.64 gain 28 89 -106.67 gain 89 28 -109.25 gain 28 90 -112.44 gain 90 28 -116.40 gain 28 91 -115.95 gain 91 28 -119.19 gain 28 92 -117.94 gain 92 28 -121.75 gain 28 93 -109.88 gain 93 28 -115.23 gain 28 94 -111.43 gain 94 28 -111.68 gain 28 95 -114.07 gain 95 28 -117.55 gain 28 96 -111.94 gain 96 28 -110.88 gain 28 97 -107.54 gain 97 28 -109.90 gain 28 98 -110.10 gain 98 28 -111.21 gain 28 99 -105.40 gain 99 28 -110.14 gain 28 100 -98.25 gain 100 28 -104.70 gain 28 101 -100.07 gain 101 28 -102.45 gain 28 102 -106.48 gain 102 28 -108.98 gain 28 103 -106.81 gain 103 28 -109.15 gain 28 104 -108.11 gain 104 28 -106.28 gain 28 105 -115.45 gain 105 28 -118.94 gain 28 106 -121.47 gain 106 28 -123.68 gain 28 107 -114.02 gain 107 28 -116.54 gain 28 108 -114.80 gain 108 28 -116.97 gain 28 109 -118.93 gain 109 28 -122.94 gain 28 110 -111.13 gain 110 28 -112.21 gain 28 111 -106.48 gain 111 28 -110.23 gain 28 112 -105.84 gain 112 28 -109.34 gain 28 113 -101.15 gain 113 28 -106.35 gain 28 114 -112.52 gain 114 28 -114.62 gain 28 115 -100.77 gain 115 28 -97.79 gain 28 116 -101.15 gain 116 28 -103.91 gain 28 117 -112.83 gain 117 28 -118.40 gain 28 118 -96.66 gain 118 28 -99.60 gain 28 119 -105.50 gain 119 28 -107.91 gain 28 120 -115.60 gain 120 28 -113.56 gain 28 121 -119.35 gain 121 28 -120.08 gain 28 122 -117.35 gain 122 28 -120.59 gain 28 123 -107.98 gain 123 28 -108.73 gain 28 124 -112.07 gain 124 28 -112.82 gain 28 125 -123.52 gain 125 28 -125.87 gain 28 126 -118.30 gain 126 28 -116.97 gain 28 127 -113.30 gain 127 28 -113.54 gain 28 128 -116.62 gain 128 28 -118.73 gain 28 129 -111.03 gain 129 28 -110.55 gain 28 130 -116.12 gain 130 28 -118.32 gain 28 131 -109.36 gain 131 28 -109.43 gain 28 132 -109.86 gain 132 28 -112.54 gain 28 133 -96.19 gain 133 28 -96.98 gain 28 134 -110.03 gain 134 28 -110.62 gain 28 135 -120.42 gain 135 28 -122.72 gain 28 136 -113.27 gain 136 28 -116.86 gain 28 137 -119.75 gain 137 28 -121.12 gain 28 138 -114.97 gain 138 28 -112.57 gain 28 139 -121.18 gain 139 28 -120.68 gain 28 140 -116.61 gain 140 28 -122.17 gain 28 141 -115.47 gain 141 28 -115.91 gain 28 142 -114.92 gain 142 28 -120.18 gain 28 143 -111.28 gain 143 28 -112.08 gain 28 144 -109.62 gain 144 28 -111.33 gain 28 145 -112.44 gain 145 28 -113.74 gain 28 146 -102.86 gain 146 28 -101.71 gain 28 147 -112.40 gain 147 28 -115.11 gain 28 148 -108.19 gain 148 28 -109.82 gain 28 149 -114.62 gain 149 28 -115.50 gain 28 150 -106.98 gain 150 28 -112.98 gain 28 151 -115.83 gain 151 28 -115.39 gain 28 152 -114.57 gain 152 28 -115.95 gain 28 153 -116.29 gain 153 28 -120.11 gain 28 154 -112.69 gain 154 28 -112.12 gain 28 155 -115.91 gain 155 28 -119.17 gain 28 156 -115.47 gain 156 28 -116.75 gain 28 157 -112.10 gain 157 28 -115.34 gain 28 158 -111.94 gain 158 28 -115.61 gain 28 159 -107.16 gain 159 28 -104.47 gain 28 160 -113.39 gain 160 28 -112.97 gain 28 161 -115.51 gain 161 28 -117.95 gain 28 162 -115.70 gain 162 28 -115.23 gain 28 163 -107.79 gain 163 28 -104.50 gain 28 164 -107.70 gain 164 28 -106.15 gain 28 165 -117.02 gain 165 28 -118.41 gain 28 166 -119.49 gain 166 28 -123.55 gain 28 167 -122.09 gain 167 28 -125.27 gain 28 168 -120.59 gain 168 28 -125.12 gain 28 169 -113.39 gain 169 28 -110.27 gain 28 170 -124.29 gain 170 28 -131.66 gain 28 171 -112.53 gain 171 28 -116.33 gain 28 172 -111.88 gain 172 28 -108.77 gain 28 173 -117.04 gain 173 28 -118.59 gain 28 174 -106.58 gain 174 28 -107.90 gain 28 175 -116.26 gain 175 28 -116.78 gain 28 176 -116.86 gain 176 28 -117.33 gain 28 177 -119.07 gain 177 28 -121.03 gain 28 178 -112.73 gain 178 28 -115.65 gain 28 179 -112.85 gain 179 28 -116.79 gain 28 180 -107.16 gain 180 28 -106.90 gain 28 181 -114.26 gain 181 28 -118.45 gain 28 182 -118.51 gain 182 28 -119.00 gain 28 183 -129.05 gain 183 28 -130.83 gain 28 184 -117.51 gain 184 28 -121.35 gain 28 185 -114.63 gain 185 28 -113.89 gain 28 186 -120.25 gain 186 28 -118.51 gain 28 187 -112.91 gain 187 28 -115.26 gain 28 188 -119.76 gain 188 28 -124.86 gain 28 189 -116.07 gain 189 28 -120.58 gain 28 190 -121.13 gain 190 28 -121.30 gain 28 191 -111.11 gain 191 28 -114.32 gain 28 192 -113.96 gain 192 28 -114.48 gain 28 193 -115.03 gain 193 28 -119.53 gain 28 194 -115.31 gain 194 28 -119.38 gain 28 195 -124.03 gain 195 28 -126.29 gain 28 196 -116.50 gain 196 28 -117.79 gain 28 197 -121.17 gain 197 28 -125.13 gain 28 198 -121.22 gain 198 28 -129.11 gain 28 199 -123.84 gain 199 28 -123.29 gain 28 200 -119.66 gain 200 28 -115.89 gain 28 201 -116.31 gain 201 28 -116.36 gain 28 202 -119.69 gain 202 28 -121.26 gain 28 203 -121.08 gain 203 28 -119.28 gain 28 204 -113.00 gain 204 28 -118.29 gain 28 205 -120.45 gain 205 28 -123.80 gain 28 206 -117.71 gain 206 28 -119.04 gain 28 207 -111.60 gain 207 28 -113.69 gain 28 208 -119.52 gain 208 28 -121.78 gain 28 209 -118.78 gain 209 28 -117.04 gain 28 210 -126.31 gain 210 28 -131.16 gain 28 211 -119.22 gain 211 28 -120.33 gain 28 212 -119.03 gain 212 28 -117.69 gain 28 213 -124.25 gain 213 28 -127.77 gain 28 214 -113.68 gain 214 28 -113.51 gain 28 215 -118.19 gain 215 28 -119.10 gain 28 216 -118.89 gain 216 28 -120.62 gain 28 217 -119.09 gain 217 28 -124.65 gain 28 218 -112.63 gain 218 28 -110.38 gain 28 219 -117.67 gain 219 28 -118.24 gain 28 220 -114.11 gain 220 28 -111.02 gain 28 221 -115.33 gain 221 28 -116.75 gain 28 222 -114.66 gain 222 28 -117.45 gain 28 223 -117.07 gain 223 28 -121.87 gain 28 224 -116.68 gain 224 28 -121.98 gain 29 30 -122.47 gain 30 29 -120.14 gain 29 31 -122.42 gain 31 29 -118.45 gain 29 32 -123.50 gain 32 29 -119.29 gain 29 33 -121.39 gain 33 29 -117.36 gain 29 34 -119.52 gain 34 29 -113.37 gain 29 35 -119.25 gain 35 29 -115.49 gain 29 36 -116.27 gain 36 29 -114.20 gain 29 37 -114.87 gain 37 29 -114.73 gain 29 38 -111.89 gain 38 29 -103.91 gain 29 39 -109.21 gain 39 29 -102.84 gain 29 40 -104.68 gain 40 29 -99.48 gain 29 41 -93.23 gain 41 29 -90.11 gain 29 42 -101.99 gain 42 29 -96.49 gain 29 43 -86.43 gain 43 29 -79.71 gain 29 44 -91.72 gain 44 29 -88.07 gain 29 45 -124.85 gain 45 29 -122.14 gain 29 46 -121.60 gain 46 29 -118.80 gain 29 47 -122.92 gain 47 29 -118.05 gain 29 48 -114.97 gain 48 29 -113.98 gain 29 49 -113.46 gain 49 29 -111.31 gain 29 50 -118.36 gain 50 29 -112.57 gain 29 51 -118.38 gain 51 29 -111.07 gain 29 52 -117.41 gain 52 29 -117.38 gain 29 53 -109.73 gain 53 29 -104.21 gain 29 54 -109.57 gain 54 29 -107.63 gain 29 55 -107.16 gain 55 29 -100.37 gain 29 56 -107.52 gain 56 29 -105.63 gain 29 57 -102.08 gain 57 29 -96.98 gain 29 58 -100.40 gain 58 29 -97.00 gain 29 59 -94.89 gain 59 29 -93.93 gain 29 60 -120.85 gain 60 29 -117.18 gain 29 61 -133.18 gain 61 29 -130.94 gain 29 62 -118.29 gain 62 29 -115.61 gain 29 63 -116.53 gain 63 29 -115.08 gain 29 64 -124.04 gain 64 29 -117.38 gain 29 65 -113.04 gain 65 29 -104.98 gain 29 66 -118.16 gain 66 29 -113.17 gain 29 67 -113.61 gain 67 29 -107.50 gain 29 68 -111.68 gain 68 29 -112.86 gain 29 69 -111.24 gain 69 29 -106.15 gain 29 70 -105.76 gain 70 29 -102.18 gain 29 71 -109.27 gain 71 29 -105.57 gain 29 72 -106.52 gain 72 29 -100.79 gain 29 73 -106.42 gain 73 29 -101.53 gain 29 74 -90.63 gain 74 29 -88.03 gain 29 75 -129.16 gain 75 29 -124.24 gain 29 76 -124.67 gain 76 29 -120.76 gain 29 77 -126.51 gain 77 29 -125.57 gain 29 78 -123.83 gain 78 29 -119.80 gain 29 79 -117.12 gain 79 29 -111.02 gain 29 80 -118.10 gain 80 29 -113.51 gain 29 81 -119.79 gain 81 29 -113.18 gain 29 82 -127.97 gain 82 29 -124.20 gain 29 83 -106.73 gain 83 29 -102.75 gain 29 84 -109.77 gain 84 29 -103.59 gain 29 85 -107.77 gain 85 29 -99.87 gain 29 86 -111.01 gain 86 29 -111.49 gain 29 87 -112.56 gain 87 29 -108.70 gain 29 88 -111.12 gain 88 29 -107.80 gain 29 89 -99.98 gain 89 29 -96.92 gain 29 90 -129.24 gain 90 29 -127.55 gain 29 91 -124.39 gain 91 29 -121.99 gain 29 92 -120.25 gain 92 29 -118.41 gain 29 93 -122.45 gain 93 29 -122.15 gain 29 94 -126.57 gain 94 29 -121.17 gain 29 95 -117.13 gain 95 29 -114.96 gain 29 96 -117.08 gain 96 29 -110.38 gain 29 97 -118.04 gain 97 29 -114.74 gain 29 98 -117.90 gain 98 29 -113.36 gain 29 99 -118.15 gain 99 29 -117.24 gain 29 100 -110.10 gain 100 29 -110.90 gain 29 101 -112.13 gain 101 29 -108.86 gain 29 102 -107.02 gain 102 29 -103.87 gain 29 103 -112.01 gain 103 29 -108.70 gain 29 104 -116.42 gain 104 29 -108.94 gain 29 105 -119.67 gain 105 29 -117.51 gain 29 106 -133.14 gain 106 29 -129.70 gain 29 107 -125.24 gain 107 29 -122.10 gain 29 108 -126.04 gain 108 29 -122.56 gain 29 109 -119.32 gain 109 29 -117.69 gain 29 110 -129.48 gain 110 29 -124.91 gain 29 111 -119.56 gain 111 29 -117.66 gain 29 112 -119.32 gain 112 29 -117.17 gain 29 113 -119.12 gain 113 29 -118.67 gain 29 114 -114.94 gain 114 29 -111.39 gain 29 115 -112.42 gain 115 29 -103.79 gain 29 116 -109.71 gain 116 29 -106.82 gain 29 117 -116.30 gain 117 29 -116.22 gain 29 118 -115.37 gain 118 29 -112.66 gain 29 119 -112.60 gain 119 29 -109.36 gain 29 120 -124.15 gain 120 29 -116.46 gain 29 121 -127.48 gain 121 29 -122.56 gain 29 122 -122.53 gain 122 29 -120.12 gain 29 123 -120.79 gain 123 29 -115.90 gain 29 124 -125.78 gain 124 29 -120.88 gain 29 125 -127.37 gain 125 29 -124.07 gain 29 126 -121.97 gain 126 29 -114.99 gain 29 127 -118.35 gain 127 29 -112.94 gain 29 128 -117.03 gain 128 29 -113.49 gain 29 129 -115.22 gain 129 29 -109.09 gain 29 130 -116.81 gain 130 29 -113.36 gain 29 131 -117.50 gain 131 29 -111.92 gain 29 132 -119.86 gain 132 29 -116.90 gain 29 133 -115.16 gain 133 29 -110.30 gain 29 134 -121.66 gain 134 29 -116.60 gain 29 135 -124.59 gain 135 29 -121.24 gain 29 136 -123.25 gain 136 29 -121.19 gain 29 137 -123.07 gain 137 29 -118.79 gain 29 138 -126.89 gain 138 29 -118.84 gain 29 139 -125.66 gain 139 29 -119.51 gain 29 140 -117.91 gain 140 29 -117.82 gain 29 141 -115.99 gain 141 29 -110.79 gain 29 142 -117.67 gain 142 29 -117.28 gain 29 143 -112.80 gain 143 29 -107.95 gain 29 144 -120.70 gain 144 29 -116.75 gain 29 145 -113.86 gain 145 29 -109.51 gain 29 146 -114.99 gain 146 29 -108.19 gain 29 147 -113.44 gain 147 29 -110.49 gain 29 148 -123.78 gain 148 29 -119.76 gain 29 149 -116.61 gain 149 29 -111.84 gain 29 150 -119.57 gain 150 29 -119.92 gain 29 151 -124.32 gain 151 29 -118.23 gain 29 152 -123.21 gain 152 29 -118.95 gain 29 153 -116.58 gain 153 29 -114.74 gain 29 154 -119.13 gain 154 29 -112.91 gain 29 155 -119.45 gain 155 29 -117.06 gain 29 156 -122.15 gain 156 29 -117.77 gain 29 157 -123.75 gain 157 29 -121.34 gain 29 158 -115.56 gain 158 29 -113.58 gain 29 159 -127.95 gain 159 29 -119.60 gain 29 160 -113.60 gain 160 29 -107.53 gain 29 161 -124.63 gain 161 29 -121.42 gain 29 162 -123.94 gain 162 29 -117.81 gain 29 163 -120.56 gain 163 29 -111.62 gain 29 164 -114.95 gain 164 29 -107.75 gain 29 165 -130.06 gain 165 29 -125.79 gain 29 166 -127.37 gain 166 29 -125.78 gain 29 167 -122.98 gain 167 29 -120.52 gain 29 168 -121.18 gain 168 29 -120.06 gain 29 169 -124.26 gain 169 29 -115.49 gain 29 170 -114.66 gain 170 29 -116.38 gain 29 171 -118.00 gain 171 29 -116.15 gain 29 172 -123.87 gain 172 29 -115.12 gain 29 173 -125.18 gain 173 29 -121.08 gain 29 174 -119.40 gain 174 29 -115.07 gain 29 175 -121.47 gain 175 29 -116.34 gain 29 176 -117.24 gain 176 29 -112.06 gain 29 177 -119.72 gain 177 29 -116.03 gain 29 178 -122.15 gain 178 29 -119.41 gain 29 179 -120.34 gain 179 29 -118.64 gain 29 180 -128.92 gain 180 29 -123.01 gain 29 181 -129.64 gain 181 29 -128.18 gain 29 182 -116.59 gain 182 29 -111.42 gain 29 183 -121.97 gain 183 29 -118.10 gain 29 184 -118.55 gain 184 29 -116.74 gain 29 185 -127.66 gain 185 29 -121.27 gain 29 186 -125.34 gain 186 29 -117.95 gain 29 187 -128.42 gain 187 29 -125.12 gain 29 188 -122.14 gain 188 29 -121.60 gain 29 189 -117.52 gain 189 29 -116.37 gain 29 190 -113.30 gain 190 29 -107.82 gain 29 191 -118.50 gain 191 29 -116.05 gain 29 192 -125.96 gain 192 29 -120.84 gain 29 193 -120.00 gain 193 29 -118.85 gain 29 194 -119.56 gain 194 29 -117.98 gain 29 195 -126.79 gain 195 29 -123.40 gain 29 196 -125.89 gain 196 29 -121.52 gain 29 197 -133.57 gain 197 29 -131.88 gain 29 198 -123.61 gain 198 29 -125.85 gain 29 199 -126.68 gain 199 29 -120.49 gain 29 200 -128.32 gain 200 29 -118.90 gain 29 201 -125.03 gain 201 29 -119.42 gain 29 202 -124.48 gain 202 29 -120.40 gain 29 203 -121.70 gain 203 29 -114.25 gain 29 204 -116.85 gain 204 29 -116.48 gain 29 205 -120.24 gain 205 29 -117.94 gain 29 206 -121.95 gain 206 29 -117.63 gain 29 207 -126.73 gain 207 29 -123.17 gain 29 208 -123.25 gain 208 29 -119.86 gain 29 209 -122.14 gain 209 29 -114.75 gain 29 210 -126.85 gain 210 29 -126.05 gain 29 211 -125.38 gain 211 29 -120.83 gain 29 212 -125.28 gain 212 29 -118.29 gain 29 213 -120.40 gain 213 29 -118.27 gain 29 214 -127.78 gain 214 29 -121.95 gain 29 215 -116.48 gain 215 29 -111.73 gain 29 216 -120.33 gain 216 29 -116.42 gain 29 217 -124.13 gain 217 29 -124.04 gain 29 218 -120.22 gain 218 29 -112.31 gain 29 219 -129.27 gain 219 29 -124.19 gain 29 220 -122.18 gain 220 29 -113.45 gain 29 221 -122.77 gain 221 29 -118.54 gain 29 222 -118.57 gain 222 29 -115.71 gain 29 223 -126.39 gain 223 29 -125.54 gain 29 224 -118.79 gain 224 29 -118.44 gain 30 31 -82.02 gain 31 30 -80.39 gain 30 32 -90.52 gain 32 30 -88.64 gain 30 33 -102.71 gain 33 30 -101.00 gain 30 34 -100.39 gain 34 30 -96.56 gain 30 35 -108.50 gain 35 30 -107.07 gain 30 36 -114.61 gain 36 30 -114.87 gain 30 37 -118.23 gain 37 30 -120.43 gain 30 38 -117.55 gain 38 30 -111.91 gain 30 39 -115.25 gain 39 30 -111.21 gain 30 40 -116.55 gain 40 30 -113.68 gain 30 41 -110.09 gain 41 30 -109.29 gain 30 42 -118.95 gain 42 30 -115.79 gain 30 43 -116.41 gain 43 30 -112.02 gain 30 44 -117.41 gain 44 30 -116.10 gain 30 45 -93.40 gain 45 30 -93.01 gain 30 46 -91.97 gain 46 30 -91.50 gain 30 47 -98.52 gain 47 30 -95.98 gain 30 48 -100.99 gain 48 30 -102.32 gain 30 49 -100.47 gain 49 30 -100.66 gain 30 50 -108.94 gain 50 30 -105.49 gain 30 51 -111.15 gain 51 30 -106.17 gain 30 52 -114.91 gain 52 30 -117.21 gain 30 53 -112.40 gain 53 30 -109.22 gain 30 54 -117.30 gain 54 30 -117.69 gain 30 55 -114.47 gain 55 30 -110.01 gain 30 56 -120.46 gain 56 30 -120.89 gain 30 57 -109.78 gain 57 30 -107.01 gain 30 58 -123.08 gain 58 30 -122.01 gain 30 59 -122.86 gain 59 30 -124.23 gain 30 60 -98.54 gain 60 30 -97.19 gain 30 61 -94.02 gain 61 30 -94.11 gain 30 62 -101.67 gain 62 30 -101.32 gain 30 63 -106.93 gain 63 30 -107.82 gain 30 64 -108.54 gain 64 30 -104.21 gain 30 65 -113.15 gain 65 30 -107.42 gain 30 66 -112.73 gain 66 30 -110.07 gain 30 67 -102.41 gain 67 30 -98.63 gain 30 68 -114.39 gain 68 30 -117.90 gain 30 69 -108.34 gain 69 30 -105.58 gain 30 70 -115.58 gain 70 30 -114.33 gain 30 71 -114.03 gain 71 30 -112.66 gain 30 72 -128.34 gain 72 30 -124.94 gain 30 73 -112.27 gain 73 30 -109.71 gain 30 74 -124.24 gain 74 30 -123.97 gain 30 75 -101.67 gain 75 30 -99.08 gain 30 76 -106.52 gain 76 30 -104.95 gain 30 77 -99.71 gain 77 30 -101.10 gain 30 78 -107.07 gain 78 30 -105.37 gain 30 79 -110.55 gain 79 30 -106.78 gain 30 80 -106.28 gain 80 30 -104.02 gain 30 81 -113.94 gain 81 30 -109.65 gain 30 82 -115.34 gain 82 30 -113.90 gain 30 83 -115.32 gain 83 30 -113.67 gain 30 84 -116.11 gain 84 30 -112.26 gain 30 85 -113.20 gain 85 30 -107.63 gain 30 86 -120.27 gain 86 30 -123.08 gain 30 87 -117.85 gain 87 30 -116.31 gain 30 88 -125.41 gain 88 30 -124.42 gain 30 89 -116.91 gain 89 30 -116.18 gain 30 90 -101.57 gain 90 30 -102.21 gain 30 91 -105.77 gain 91 30 -105.70 gain 30 92 -108.29 gain 92 30 -108.78 gain 30 93 -106.76 gain 93 30 -108.79 gain 30 94 -112.70 gain 94 30 -109.63 gain 30 95 -118.31 gain 95 30 -118.48 gain 30 96 -111.10 gain 96 30 -106.73 gain 30 97 -116.50 gain 97 30 -115.53 gain 30 98 -113.24 gain 98 30 -111.03 gain 30 99 -115.27 gain 99 30 -116.69 gain 30 100 -122.59 gain 100 30 -125.72 gain 30 101 -118.69 gain 101 30 -117.75 gain 30 102 -116.98 gain 102 30 -116.17 gain 30 103 -115.22 gain 103 30 -114.24 gain 30 104 -124.28 gain 104 30 -119.13 gain 30 105 -102.38 gain 105 30 -102.55 gain 30 106 -104.94 gain 106 30 -103.83 gain 30 107 -113.17 gain 107 30 -112.36 gain 30 108 -106.80 gain 108 30 -105.65 gain 30 109 -107.84 gain 109 30 -108.54 gain 30 110 -120.84 gain 110 30 -118.61 gain 30 111 -112.37 gain 111 30 -112.80 gain 30 112 -115.31 gain 112 30 -115.48 gain 30 113 -115.50 gain 113 30 -117.38 gain 30 114 -110.09 gain 114 30 -108.87 gain 30 115 -111.74 gain 115 30 -105.44 gain 30 116 -121.30 gain 116 30 -120.74 gain 30 117 -122.52 gain 117 30 -124.77 gain 30 118 -122.18 gain 118 30 -121.80 gain 30 119 -126.04 gain 119 30 -125.13 gain 30 120 -111.72 gain 120 30 -106.36 gain 30 121 -112.49 gain 121 30 -109.91 gain 30 122 -111.65 gain 122 30 -111.57 gain 30 123 -112.04 gain 123 30 -109.48 gain 30 124 -117.95 gain 124 30 -115.38 gain 30 125 -114.49 gain 125 30 -113.52 gain 30 126 -112.75 gain 126 30 -108.10 gain 30 127 -117.61 gain 127 30 -114.54 gain 30 128 -116.62 gain 128 30 -115.42 gain 30 129 -123.07 gain 129 30 -119.27 gain 30 130 -114.88 gain 130 30 -113.77 gain 30 131 -123.31 gain 131 30 -120.06 gain 30 132 -122.03 gain 132 30 -121.40 gain 30 133 -116.90 gain 133 30 -114.37 gain 30 134 -113.39 gain 134 30 -110.66 gain 30 135 -118.88 gain 135 30 -117.86 gain 30 136 -115.06 gain 136 30 -115.32 gain 30 137 -112.92 gain 137 30 -110.97 gain 30 138 -109.16 gain 138 30 -103.45 gain 30 139 -108.34 gain 139 30 -104.53 gain 30 140 -115.49 gain 140 30 -117.73 gain 30 141 -108.63 gain 141 30 -105.75 gain 30 142 -118.81 gain 142 30 -120.75 gain 30 143 -117.03 gain 143 30 -114.51 gain 30 144 -118.48 gain 144 30 -116.87 gain 30 145 -117.83 gain 145 30 -115.81 gain 30 146 -117.05 gain 146 30 -112.59 gain 30 147 -118.28 gain 147 30 -117.66 gain 30 148 -117.10 gain 148 30 -115.41 gain 30 149 -118.95 gain 149 30 -116.51 gain 30 150 -109.40 gain 150 30 -112.08 gain 30 151 -109.81 gain 151 30 -106.05 gain 30 152 -113.22 gain 152 30 -111.29 gain 30 153 -119.97 gain 153 30 -120.47 gain 30 154 -123.54 gain 154 30 -119.65 gain 30 155 -112.51 gain 155 30 -112.45 gain 30 156 -113.15 gain 156 30 -111.11 gain 30 157 -113.36 gain 157 30 -113.27 gain 30 158 -119.40 gain 158 30 -119.75 gain 30 159 -116.47 gain 159 30 -110.45 gain 30 160 -116.52 gain 160 30 -112.78 gain 30 161 -122.98 gain 161 30 -122.11 gain 30 162 -115.76 gain 162 30 -111.96 gain 30 163 -118.37 gain 163 30 -111.76 gain 30 164 -126.18 gain 164 30 -121.31 gain 30 165 -120.19 gain 165 30 -118.26 gain 30 166 -114.38 gain 166 30 -115.12 gain 30 167 -111.52 gain 167 30 -111.39 gain 30 168 -115.50 gain 168 30 -116.71 gain 30 169 -118.25 gain 169 30 -111.81 gain 30 170 -117.53 gain 170 30 -121.58 gain 30 171 -119.14 gain 171 30 -119.61 gain 30 172 -117.46 gain 172 30 -111.04 gain 30 173 -124.20 gain 173 30 -122.43 gain 30 174 -121.81 gain 174 30 -119.80 gain 30 175 -117.25 gain 175 30 -114.45 gain 30 176 -116.00 gain 176 30 -113.16 gain 30 177 -122.97 gain 177 30 -121.62 gain 30 178 -122.05 gain 178 30 -121.65 gain 30 179 -120.78 gain 179 30 -121.40 gain 30 180 -108.15 gain 180 30 -104.58 gain 30 181 -122.40 gain 181 30 -123.26 gain 30 182 -121.16 gain 182 30 -118.33 gain 30 183 -116.07 gain 183 30 -114.53 gain 30 184 -114.98 gain 184 30 -115.49 gain 30 185 -118.81 gain 185 30 -114.75 gain 30 186 -126.55 gain 186 30 -121.49 gain 30 187 -116.00 gain 187 30 -115.03 gain 30 188 -126.73 gain 188 30 -128.52 gain 30 189 -118.94 gain 189 30 -120.12 gain 30 190 -120.62 gain 190 30 -117.48 gain 30 191 -121.66 gain 191 30 -121.55 gain 30 192 -123.30 gain 192 30 -120.50 gain 30 193 -124.71 gain 193 30 -125.89 gain 30 194 -124.92 gain 194 30 -125.67 gain 30 195 -121.89 gain 195 30 -120.83 gain 30 196 -124.79 gain 196 30 -122.75 gain 30 197 -120.07 gain 197 30 -120.70 gain 30 198 -124.87 gain 198 30 -129.44 gain 30 199 -118.13 gain 199 30 -114.27 gain 30 200 -121.64 gain 200 30 -114.55 gain 30 201 -118.19 gain 201 30 -114.91 gain 30 202 -121.32 gain 202 30 -119.58 gain 30 203 -121.55 gain 203 30 -116.43 gain 30 204 -118.44 gain 204 30 -120.40 gain 30 205 -121.26 gain 205 30 -121.29 gain 30 206 -115.54 gain 206 30 -113.55 gain 30 207 -128.70 gain 207 30 -127.46 gain 30 208 -123.89 gain 208 30 -122.83 gain 30 209 -125.45 gain 209 30 -120.40 gain 30 210 -121.94 gain 210 30 -123.46 gain 30 211 -122.51 gain 211 30 -120.30 gain 30 212 -121.67 gain 212 30 -117.01 gain 30 213 -122.31 gain 213 30 -122.51 gain 30 214 -119.68 gain 214 30 -116.19 gain 30 215 -120.47 gain 215 30 -118.06 gain 30 216 -122.53 gain 216 30 -120.95 gain 30 217 -117.51 gain 217 30 -119.75 gain 30 218 -118.50 gain 218 30 -112.93 gain 30 219 -125.20 gain 219 30 -122.45 gain 30 220 -120.99 gain 220 30 -114.59 gain 30 221 -118.59 gain 221 30 -116.69 gain 30 222 -116.19 gain 222 30 -115.66 gain 30 223 -125.71 gain 223 30 -127.19 gain 30 224 -121.92 gain 224 30 -123.90 gain 31 32 -88.83 gain 32 31 -88.58 gain 31 33 -89.51 gain 33 31 -89.44 gain 31 34 -95.12 gain 34 31 -92.93 gain 31 35 -110.91 gain 35 31 -111.12 gain 31 36 -103.68 gain 36 31 -105.57 gain 31 37 -105.00 gain 37 31 -108.82 gain 31 38 -110.88 gain 38 31 -106.87 gain 31 39 -109.31 gain 39 31 -106.90 gain 31 40 -118.23 gain 40 31 -116.99 gain 31 41 -113.91 gain 41 31 -114.75 gain 31 42 -123.15 gain 42 31 -121.62 gain 31 43 -112.48 gain 43 31 -109.72 gain 31 44 -120.27 gain 44 31 -120.59 gain 31 45 -86.84 gain 45 31 -88.09 gain 31 46 -85.28 gain 46 31 -86.45 gain 31 47 -84.96 gain 47 31 -84.06 gain 31 48 -90.66 gain 48 31 -93.63 gain 31 49 -104.10 gain 49 31 -105.93 gain 31 50 -102.15 gain 50 31 -100.33 gain 31 51 -105.53 gain 51 31 -102.18 gain 31 52 -113.62 gain 52 31 -117.55 gain 31 53 -106.94 gain 53 31 -105.39 gain 31 54 -113.58 gain 54 31 -115.60 gain 31 55 -109.88 gain 55 31 -107.05 gain 31 56 -121.01 gain 56 31 -123.08 gain 31 57 -111.97 gain 57 31 -110.83 gain 31 58 -113.43 gain 58 31 -114.00 gain 31 59 -119.98 gain 59 31 -122.99 gain 31 60 -93.24 gain 60 31 -93.53 gain 31 61 -96.44 gain 61 31 -98.17 gain 31 62 -97.29 gain 62 31 -98.57 gain 31 63 -94.45 gain 63 31 -96.97 gain 31 64 -108.60 gain 64 31 -105.90 gain 31 65 -104.31 gain 65 31 -100.21 gain 31 66 -107.59 gain 66 31 -106.56 gain 31 67 -107.81 gain 67 31 -105.66 gain 31 68 -109.62 gain 68 31 -114.77 gain 31 69 -116.54 gain 69 31 -115.41 gain 31 70 -113.50 gain 70 31 -113.89 gain 31 71 -116.60 gain 71 31 -116.86 gain 31 72 -107.17 gain 72 31 -105.41 gain 31 73 -119.49 gain 73 31 -118.56 gain 31 74 -113.38 gain 74 31 -114.74 gain 31 75 -102.27 gain 75 31 -101.30 gain 31 76 -97.01 gain 76 31 -97.06 gain 31 77 -100.07 gain 77 31 -103.10 gain 31 78 -105.88 gain 78 31 -105.81 gain 31 79 -103.23 gain 79 31 -101.09 gain 31 80 -104.92 gain 80 31 -104.29 gain 31 81 -115.53 gain 81 31 -112.88 gain 31 82 -109.92 gain 82 31 -110.12 gain 31 83 -108.52 gain 83 31 -108.50 gain 31 84 -115.48 gain 84 31 -113.27 gain 31 85 -117.39 gain 85 31 -113.46 gain 31 86 -120.11 gain 86 31 -124.56 gain 31 87 -114.25 gain 87 31 -114.34 gain 31 88 -116.05 gain 88 31 -116.69 gain 31 89 -127.96 gain 89 31 -128.86 gain 31 90 -107.29 gain 90 31 -109.56 gain 31 91 -101.57 gain 91 31 -103.12 gain 31 92 -112.86 gain 92 31 -114.99 gain 31 93 -110.22 gain 93 31 -113.88 gain 31 94 -102.94 gain 94 31 -101.50 gain 31 95 -113.03 gain 95 31 -114.83 gain 31 96 -114.36 gain 96 31 -111.62 gain 31 97 -116.03 gain 97 31 -116.70 gain 31 98 -108.26 gain 98 31 -107.68 gain 31 99 -114.04 gain 99 31 -117.10 gain 31 100 -109.87 gain 100 31 -114.63 gain 31 101 -115.48 gain 101 31 -116.18 gain 31 102 -111.35 gain 102 31 -112.17 gain 31 103 -116.42 gain 103 31 -117.08 gain 31 104 -121.72 gain 104 31 -118.20 gain 31 105 -107.57 gain 105 31 -109.38 gain 31 106 -103.61 gain 106 31 -104.13 gain 31 107 -101.08 gain 107 31 -101.90 gain 31 108 -103.80 gain 108 31 -104.29 gain 31 109 -106.90 gain 109 31 -109.23 gain 31 110 -115.36 gain 110 31 -114.76 gain 31 111 -110.42 gain 111 31 -112.48 gain 31 112 -110.10 gain 112 31 -111.91 gain 31 113 -109.19 gain 113 31 -112.70 gain 31 114 -105.67 gain 114 31 -106.08 gain 31 115 -115.50 gain 115 31 -110.84 gain 31 116 -121.52 gain 116 31 -122.59 gain 31 117 -115.52 gain 117 31 -119.39 gain 31 118 -115.34 gain 118 31 -116.59 gain 31 119 -120.03 gain 119 31 -120.76 gain 31 120 -107.44 gain 120 31 -103.71 gain 31 121 -116.28 gain 121 31 -115.33 gain 31 122 -104.47 gain 122 31 -106.02 gain 31 123 -110.94 gain 123 31 -110.01 gain 31 124 -112.18 gain 124 31 -111.24 gain 31 125 -110.53 gain 125 31 -111.20 gain 31 126 -112.31 gain 126 31 -109.30 gain 31 127 -110.49 gain 127 31 -109.05 gain 31 128 -113.51 gain 128 31 -113.94 gain 31 129 -114.14 gain 129 31 -111.98 gain 31 130 -116.39 gain 130 31 -116.91 gain 31 131 -115.81 gain 131 31 -114.19 gain 31 132 -119.62 gain 132 31 -120.62 gain 31 133 -111.12 gain 133 31 -110.23 gain 31 134 -115.16 gain 134 31 -114.06 gain 31 135 -107.84 gain 135 31 -108.45 gain 31 136 -111.03 gain 136 31 -112.93 gain 31 137 -118.72 gain 137 31 -118.40 gain 31 138 -111.33 gain 138 31 -107.24 gain 31 139 -112.67 gain 139 31 -110.49 gain 31 140 -116.21 gain 140 31 -120.08 gain 31 141 -114.24 gain 141 31 -113.00 gain 31 142 -114.03 gain 142 31 -117.61 gain 31 143 -116.13 gain 143 31 -115.25 gain 31 144 -113.04 gain 144 31 -113.06 gain 31 145 -118.00 gain 145 31 -117.62 gain 31 146 -116.28 gain 146 31 -113.45 gain 31 147 -122.27 gain 147 31 -123.29 gain 31 148 -118.06 gain 148 31 -118.01 gain 31 149 -116.57 gain 149 31 -115.76 gain 31 150 -105.75 gain 150 31 -110.06 gain 31 151 -112.58 gain 151 31 -110.46 gain 31 152 -109.60 gain 152 31 -109.30 gain 31 153 -115.85 gain 153 31 -117.98 gain 31 154 -107.95 gain 154 31 -105.70 gain 31 155 -113.93 gain 155 31 -115.50 gain 31 156 -119.10 gain 156 31 -118.69 gain 31 157 -114.08 gain 157 31 -115.63 gain 31 158 -106.90 gain 158 31 -108.88 gain 31 159 -110.34 gain 159 31 -105.96 gain 31 160 -118.21 gain 160 31 -116.11 gain 31 161 -116.63 gain 161 31 -117.38 gain 31 162 -118.49 gain 162 31 -116.32 gain 31 163 -119.54 gain 163 31 -114.56 gain 31 164 -117.66 gain 164 31 -114.43 gain 31 165 -118.75 gain 165 31 -118.45 gain 31 166 -118.21 gain 166 31 -120.59 gain 31 167 -113.55 gain 167 31 -115.05 gain 31 168 -109.85 gain 168 31 -112.70 gain 31 169 -111.37 gain 169 31 -106.56 gain 31 170 -111.01 gain 170 31 -116.69 gain 31 171 -121.16 gain 171 31 -123.27 gain 31 172 -112.40 gain 172 31 -107.60 gain 31 173 -113.76 gain 173 31 -113.63 gain 31 174 -116.80 gain 174 31 -116.42 gain 31 175 -119.86 gain 175 31 -118.69 gain 31 176 -127.67 gain 176 31 -126.46 gain 31 177 -123.06 gain 177 31 -123.34 gain 31 178 -118.66 gain 178 31 -119.89 gain 31 179 -128.34 gain 179 31 -130.60 gain 31 180 -116.50 gain 180 31 -114.55 gain 31 181 -121.12 gain 181 31 -123.62 gain 31 182 -116.75 gain 182 31 -115.55 gain 31 183 -113.85 gain 183 31 -113.95 gain 31 184 -116.55 gain 184 31 -118.70 gain 31 185 -115.92 gain 185 31 -113.50 gain 31 186 -118.14 gain 186 31 -114.72 gain 31 187 -115.61 gain 187 31 -116.27 gain 31 188 -117.45 gain 188 31 -120.87 gain 31 189 -122.51 gain 189 31 -125.32 gain 31 190 -114.00 gain 190 31 -112.48 gain 31 191 -123.48 gain 191 31 -125.00 gain 31 192 -119.94 gain 192 31 -118.78 gain 31 193 -119.13 gain 193 31 -121.94 gain 31 194 -116.82 gain 194 31 -119.20 gain 31 195 -110.33 gain 195 31 -110.90 gain 31 196 -117.85 gain 196 31 -117.45 gain 31 197 -117.90 gain 197 31 -120.17 gain 31 198 -114.64 gain 198 31 -120.85 gain 31 199 -114.30 gain 199 31 -112.07 gain 31 200 -115.23 gain 200 31 -109.77 gain 31 201 -113.04 gain 201 31 -111.40 gain 31 202 -122.95 gain 202 31 -122.84 gain 31 203 -113.58 gain 203 31 -110.09 gain 31 204 -116.58 gain 204 31 -120.17 gain 31 205 -120.60 gain 205 31 -122.26 gain 31 206 -124.49 gain 206 31 -124.13 gain 31 207 -115.52 gain 207 31 -115.93 gain 31 208 -117.51 gain 208 31 -118.08 gain 31 209 -127.59 gain 209 31 -124.16 gain 31 210 -117.40 gain 210 31 -120.57 gain 31 211 -116.14 gain 211 31 -115.56 gain 31 212 -122.55 gain 212 31 -119.52 gain 31 213 -118.63 gain 213 31 -120.47 gain 31 214 -119.33 gain 214 31 -117.46 gain 31 215 -122.46 gain 215 31 -121.69 gain 31 216 -115.95 gain 216 31 -116.00 gain 31 217 -108.58 gain 217 31 -112.46 gain 31 218 -117.32 gain 218 31 -113.38 gain 31 219 -124.66 gain 219 31 -123.54 gain 31 220 -113.50 gain 220 31 -108.73 gain 31 221 -112.53 gain 221 31 -112.26 gain 31 222 -126.92 gain 222 31 -128.03 gain 31 223 -128.24 gain 223 31 -131.35 gain 31 224 -126.00 gain 224 31 -129.61 gain 32 33 -95.33 gain 33 32 -95.51 gain 32 34 -90.43 gain 34 32 -88.49 gain 32 35 -101.71 gain 35 32 -102.17 gain 32 36 -107.59 gain 36 32 -109.73 gain 32 37 -106.39 gain 37 32 -110.46 gain 32 38 -103.82 gain 38 32 -100.06 gain 32 39 -109.45 gain 39 32 -107.29 gain 32 40 -118.80 gain 40 32 -117.81 gain 32 41 -110.85 gain 41 32 -111.93 gain 32 42 -120.16 gain 42 32 -118.88 gain 32 43 -114.85 gain 43 32 -112.34 gain 32 44 -112.16 gain 44 32 -112.73 gain 32 45 -92.43 gain 45 32 -93.93 gain 32 46 -92.32 gain 46 32 -93.74 gain 32 47 -84.25 gain 47 32 -83.60 gain 32 48 -86.05 gain 48 32 -89.26 gain 32 49 -97.83 gain 49 32 -99.90 gain 32 50 -95.45 gain 50 32 -93.87 gain 32 51 -107.65 gain 51 32 -104.56 gain 32 52 -106.92 gain 52 32 -111.10 gain 32 53 -102.09 gain 53 32 -100.78 gain 32 54 -110.95 gain 54 32 -113.22 gain 32 55 -113.89 gain 55 32 -111.31 gain 32 56 -104.07 gain 56 32 -106.39 gain 32 57 -113.60 gain 57 32 -112.71 gain 32 58 -113.11 gain 58 32 -113.93 gain 32 59 -121.51 gain 59 32 -124.76 gain 32 60 -97.13 gain 60 32 -97.66 gain 32 61 -93.88 gain 61 32 -95.86 gain 32 62 -91.35 gain 62 32 -92.88 gain 32 63 -89.47 gain 63 32 -92.24 gain 32 64 -99.35 gain 64 32 -96.91 gain 32 65 -105.55 gain 65 32 -101.70 gain 32 66 -110.24 gain 66 32 -109.46 gain 32 67 -110.03 gain 67 32 -108.13 gain 32 68 -113.29 gain 68 32 -118.68 gain 32 69 -110.93 gain 69 32 -110.05 gain 32 70 -112.27 gain 70 32 -112.91 gain 32 71 -117.36 gain 71 32 -117.87 gain 32 72 -117.28 gain 72 32 -115.76 gain 32 73 -124.98 gain 73 32 -124.30 gain 32 74 -124.24 gain 74 32 -125.85 gain 32 75 -99.36 gain 75 32 -98.65 gain 32 76 -102.51 gain 76 32 -102.81 gain 32 77 -92.93 gain 77 32 -96.20 gain 32 78 -100.06 gain 78 32 -100.24 gain 32 79 -103.49 gain 79 32 -101.60 gain 32 80 -108.45 gain 80 32 -108.08 gain 32 81 -106.87 gain 81 32 -104.47 gain 32 82 -109.90 gain 82 32 -110.35 gain 32 83 -113.77 gain 83 32 -114.00 gain 32 84 -104.65 gain 84 32 -102.68 gain 32 85 -110.58 gain 85 32 -106.89 gain 32 86 -115.40 gain 86 32 -120.10 gain 32 87 -110.04 gain 87 32 -110.39 gain 32 88 -120.30 gain 88 32 -121.19 gain 32 89 -116.18 gain 89 32 -117.33 gain 32 90 -108.41 gain 90 32 -110.94 gain 32 91 -103.56 gain 91 32 -105.36 gain 32 92 -109.00 gain 92 32 -111.37 gain 32 93 -96.39 gain 93 32 -100.30 gain 32 94 -108.99 gain 94 32 -107.80 gain 32 95 -101.48 gain 95 32 -103.52 gain 32 96 -112.75 gain 96 32 -110.26 gain 32 97 -106.46 gain 97 32 -107.37 gain 32 98 -112.28 gain 98 32 -111.94 gain 32 99 -108.63 gain 99 32 -111.94 gain 32 100 -113.00 gain 100 32 -118.02 gain 32 101 -113.03 gain 101 32 -113.97 gain 32 102 -128.08 gain 102 32 -129.15 gain 32 103 -125.22 gain 103 32 -126.13 gain 32 104 -115.98 gain 104 32 -112.71 gain 32 105 -102.75 gain 105 32 -104.80 gain 32 106 -109.12 gain 106 32 -109.89 gain 32 107 -110.63 gain 107 32 -111.70 gain 32 108 -107.28 gain 108 32 -108.01 gain 32 109 -108.94 gain 109 32 -111.52 gain 32 110 -106.10 gain 110 32 -105.75 gain 32 111 -104.44 gain 111 32 -106.75 gain 32 112 -111.83 gain 112 32 -113.89 gain 32 113 -114.38 gain 113 32 -118.14 gain 32 114 -118.58 gain 114 32 -119.24 gain 32 115 -110.90 gain 115 32 -106.49 gain 32 116 -114.83 gain 116 32 -116.15 gain 32 117 -114.91 gain 117 32 -119.03 gain 32 118 -122.08 gain 118 32 -123.59 gain 32 119 -127.51 gain 119 32 -128.48 gain 32 120 -100.16 gain 120 32 -96.68 gain 32 121 -108.74 gain 121 32 -108.04 gain 32 122 -100.14 gain 122 32 -101.95 gain 32 123 -107.14 gain 123 32 -106.46 gain 32 124 -109.32 gain 124 32 -108.63 gain 32 125 -106.20 gain 125 32 -107.11 gain 32 126 -101.59 gain 126 32 -98.82 gain 32 127 -110.62 gain 127 32 -109.43 gain 32 128 -107.06 gain 128 32 -107.74 gain 32 129 -117.11 gain 129 32 -115.20 gain 32 130 -108.16 gain 130 32 -108.92 gain 32 131 -112.37 gain 131 32 -111.00 gain 32 132 -124.02 gain 132 32 -125.27 gain 32 133 -115.67 gain 133 32 -115.03 gain 32 134 -113.70 gain 134 32 -112.86 gain 32 135 -107.19 gain 135 32 -108.05 gain 32 136 -113.10 gain 136 32 -115.25 gain 32 137 -111.50 gain 137 32 -111.43 gain 32 138 -110.62 gain 138 32 -106.79 gain 32 139 -110.76 gain 139 32 -108.83 gain 32 140 -109.07 gain 140 32 -113.20 gain 32 141 -107.65 gain 141 32 -106.66 gain 32 142 -113.94 gain 142 32 -117.76 gain 32 143 -117.13 gain 143 32 -116.49 gain 32 144 -108.33 gain 144 32 -108.60 gain 32 145 -117.11 gain 145 32 -116.97 gain 32 146 -122.04 gain 146 32 -119.46 gain 32 147 -122.34 gain 147 32 -123.61 gain 32 148 -116.11 gain 148 32 -116.31 gain 32 149 -118.46 gain 149 32 -117.90 gain 32 150 -109.93 gain 150 32 -114.49 gain 32 151 -115.69 gain 151 32 -113.81 gain 32 152 -110.75 gain 152 32 -110.70 gain 32 153 -109.03 gain 153 32 -111.41 gain 32 154 -108.55 gain 154 32 -106.54 gain 32 155 -113.10 gain 155 32 -114.92 gain 32 156 -113.02 gain 156 32 -112.86 gain 32 157 -107.92 gain 157 32 -109.72 gain 32 158 -112.25 gain 158 32 -114.48 gain 32 159 -109.83 gain 159 32 -105.70 gain 32 160 -114.95 gain 160 32 -113.09 gain 32 161 -111.24 gain 161 32 -112.24 gain 32 162 -121.25 gain 162 32 -119.33 gain 32 163 -115.06 gain 163 32 -110.33 gain 32 164 -120.17 gain 164 32 -117.19 gain 32 165 -108.72 gain 165 32 -108.66 gain 32 166 -116.40 gain 166 32 -119.02 gain 32 167 -117.96 gain 167 32 -119.70 gain 32 168 -116.07 gain 168 32 -119.16 gain 32 169 -105.48 gain 169 32 -100.93 gain 32 170 -116.73 gain 170 32 -122.66 gain 32 171 -114.04 gain 171 32 -116.40 gain 32 172 -119.74 gain 172 32 -115.19 gain 32 173 -106.61 gain 173 32 -106.72 gain 32 174 -114.88 gain 174 32 -114.75 gain 32 175 -119.27 gain 175 32 -118.35 gain 32 176 -112.55 gain 176 32 -111.58 gain 32 177 -114.82 gain 177 32 -115.35 gain 32 178 -114.06 gain 178 32 -115.53 gain 32 179 -115.53 gain 179 32 -118.04 gain 32 180 -112.16 gain 180 32 -110.46 gain 32 181 -112.05 gain 181 32 -114.80 gain 32 182 -110.04 gain 182 32 -109.09 gain 32 183 -119.84 gain 183 32 -120.19 gain 32 184 -117.88 gain 184 32 -120.28 gain 32 185 -111.09 gain 185 32 -108.92 gain 32 186 -111.44 gain 186 32 -108.27 gain 32 187 -114.99 gain 187 32 -115.90 gain 32 188 -119.92 gain 188 32 -123.59 gain 32 189 -120.79 gain 189 32 -123.86 gain 32 190 -114.61 gain 190 32 -113.34 gain 32 191 -117.18 gain 191 32 -118.95 gain 32 192 -111.52 gain 192 32 -110.61 gain 32 193 -122.15 gain 193 32 -125.21 gain 32 194 -129.90 gain 194 32 -132.53 gain 32 195 -125.60 gain 195 32 -126.43 gain 32 196 -117.84 gain 196 32 -117.69 gain 32 197 -118.63 gain 197 32 -121.15 gain 32 198 -118.24 gain 198 32 -124.70 gain 32 199 -113.78 gain 199 32 -111.80 gain 32 200 -110.61 gain 200 32 -105.40 gain 32 201 -120.74 gain 201 32 -119.34 gain 32 202 -117.80 gain 202 32 -117.93 gain 32 203 -125.28 gain 203 32 -122.04 gain 32 204 -115.55 gain 204 32 -119.40 gain 32 205 -121.30 gain 205 32 -123.21 gain 32 206 -114.58 gain 206 32 -114.47 gain 32 207 -119.50 gain 207 32 -120.15 gain 32 208 -114.51 gain 208 32 -115.33 gain 32 209 -118.20 gain 209 32 -115.02 gain 32 210 -120.47 gain 210 32 -123.88 gain 32 211 -122.87 gain 211 32 -122.54 gain 32 212 -118.91 gain 212 32 -116.13 gain 32 213 -124.89 gain 213 32 -126.98 gain 32 214 -111.71 gain 214 32 -110.10 gain 32 215 -118.22 gain 215 32 -117.69 gain 32 216 -123.19 gain 216 32 -123.49 gain 32 217 -116.36 gain 217 32 -120.48 gain 32 218 -129.57 gain 218 32 -125.88 gain 32 219 -119.17 gain 219 32 -118.30 gain 32 220 -125.91 gain 220 32 -121.39 gain 32 221 -110.99 gain 221 32 -110.98 gain 32 222 -121.65 gain 222 32 -123.01 gain 32 223 -119.87 gain 223 32 -123.23 gain 32 224 -120.65 gain 224 32 -124.51 gain 33 34 -82.12 gain 34 33 -80.00 gain 33 35 -94.66 gain 35 33 -94.93 gain 33 36 -96.98 gain 36 33 -98.94 gain 33 37 -106.33 gain 37 33 -110.22 gain 33 38 -110.18 gain 38 33 -106.24 gain 33 39 -113.99 gain 39 33 -111.66 gain 33 40 -107.53 gain 40 33 -106.37 gain 33 41 -108.51 gain 41 33 -109.42 gain 33 42 -118.20 gain 42 33 -116.74 gain 33 43 -114.90 gain 43 33 -112.21 gain 33 44 -117.00 gain 44 33 -117.39 gain 33 45 -98.12 gain 45 33 -99.45 gain 33 46 -90.10 gain 46 33 -91.34 gain 33 47 -88.87 gain 47 33 -88.04 gain 33 48 -81.16 gain 48 33 -84.20 gain 33 49 -88.39 gain 49 33 -90.29 gain 33 50 -95.71 gain 50 33 -93.96 gain 33 51 -99.41 gain 51 33 -96.14 gain 33 52 -103.86 gain 52 33 -107.86 gain 33 53 -102.45 gain 53 33 -100.97 gain 33 54 -112.51 gain 54 33 -114.60 gain 33 55 -106.31 gain 55 33 -103.55 gain 33 56 -107.87 gain 56 33 -110.02 gain 33 57 -111.22 gain 57 33 -110.15 gain 33 58 -117.24 gain 58 33 -117.87 gain 33 59 -123.64 gain 59 33 -126.72 gain 33 60 -108.90 gain 60 33 -109.26 gain 33 61 -98.86 gain 61 33 -100.66 gain 33 62 -92.14 gain 62 33 -93.49 gain 33 63 -96.80 gain 63 33 -99.39 gain 33 64 -92.95 gain 64 33 -90.33 gain 33 65 -94.26 gain 65 33 -90.23 gain 33 66 -92.13 gain 66 33 -91.17 gain 33 67 -103.58 gain 67 33 -101.51 gain 33 68 -109.24 gain 68 33 -114.46 gain 33 69 -108.22 gain 69 33 -107.16 gain 33 70 -113.76 gain 70 33 -114.22 gain 33 71 -111.90 gain 71 33 -112.24 gain 33 72 -108.06 gain 72 33 -106.37 gain 33 73 -111.13 gain 73 33 -110.28 gain 33 74 -115.59 gain 74 33 -117.02 gain 33 75 -104.09 gain 75 33 -103.20 gain 33 76 -103.16 gain 76 33 -103.29 gain 33 77 -94.19 gain 77 33 -97.29 gain 33 78 -102.99 gain 78 33 -102.99 gain 33 79 -104.24 gain 79 33 -102.18 gain 33 80 -101.05 gain 80 33 -100.50 gain 33 81 -101.57 gain 81 33 -98.99 gain 33 82 -101.44 gain 82 33 -101.71 gain 33 83 -111.19 gain 83 33 -111.24 gain 33 84 -112.03 gain 84 33 -109.89 gain 33 85 -112.01 gain 85 33 -108.14 gain 33 86 -112.27 gain 86 33 -116.79 gain 33 87 -112.69 gain 87 33 -112.86 gain 33 88 -110.03 gain 88 33 -110.74 gain 33 89 -119.86 gain 89 33 -120.83 gain 33 90 -100.96 gain 90 33 -103.31 gain 33 91 -105.73 gain 91 33 -107.36 gain 33 92 -94.95 gain 92 33 -97.14 gain 33 93 -106.25 gain 93 33 -109.98 gain 33 94 -95.73 gain 94 33 -94.37 gain 33 95 -112.42 gain 95 33 -114.29 gain 33 96 -107.18 gain 96 33 -104.51 gain 33 97 -104.80 gain 97 33 -105.54 gain 33 98 -116.58 gain 98 33 -116.07 gain 33 99 -110.78 gain 99 33 -113.91 gain 33 100 -112.34 gain 100 33 -117.18 gain 33 101 -119.24 gain 101 33 -120.01 gain 33 102 -117.67 gain 102 33 -118.56 gain 33 103 -115.65 gain 103 33 -116.38 gain 33 104 -119.68 gain 104 33 -116.23 gain 33 105 -102.43 gain 105 33 -104.30 gain 33 106 -113.00 gain 106 33 -113.60 gain 33 107 -114.51 gain 107 33 -115.40 gain 33 108 -113.03 gain 108 33 -113.58 gain 33 109 -106.19 gain 109 33 -108.59 gain 33 110 -103.53 gain 110 33 -103.00 gain 33 111 -109.25 gain 111 33 -111.38 gain 33 112 -110.61 gain 112 33 -112.49 gain 33 113 -114.42 gain 113 33 -118.00 gain 33 114 -109.45 gain 114 33 -109.94 gain 33 115 -114.91 gain 115 33 -110.32 gain 33 116 -112.50 gain 116 33 -113.65 gain 33 117 -118.54 gain 117 33 -122.48 gain 33 118 -116.94 gain 118 33 -118.26 gain 33 119 -121.91 gain 119 33 -122.71 gain 33 120 -104.75 gain 120 33 -101.09 gain 33 121 -104.06 gain 121 33 -103.18 gain 33 122 -110.19 gain 122 33 -111.82 gain 33 123 -116.24 gain 123 33 -115.39 gain 33 124 -105.03 gain 124 33 -104.16 gain 33 125 -110.63 gain 125 33 -111.37 gain 33 126 -112.37 gain 126 33 -109.43 gain 33 127 -106.86 gain 127 33 -105.49 gain 33 128 -110.63 gain 128 33 -111.13 gain 33 129 -109.92 gain 129 33 -107.83 gain 33 130 -119.87 gain 130 33 -120.46 gain 33 131 -114.08 gain 131 33 -112.53 gain 33 132 -121.06 gain 132 33 -122.13 gain 33 133 -113.65 gain 133 33 -112.83 gain 33 134 -119.15 gain 134 33 -118.12 gain 33 135 -113.75 gain 135 33 -114.44 gain 33 136 -112.16 gain 136 33 -114.13 gain 33 137 -112.91 gain 137 33 -112.66 gain 33 138 -115.29 gain 138 33 -111.28 gain 33 139 -105.86 gain 139 33 -103.74 gain 33 140 -117.08 gain 140 33 -121.02 gain 33 141 -111.01 gain 141 33 -109.84 gain 33 142 -112.56 gain 142 33 -116.20 gain 33 143 -114.09 gain 143 33 -113.27 gain 33 144 -107.72 gain 144 33 -107.81 gain 33 145 -109.95 gain 145 33 -109.64 gain 33 146 -112.97 gain 146 33 -110.21 gain 33 147 -118.26 gain 147 33 -119.35 gain 33 148 -117.34 gain 148 33 -117.35 gain 33 149 -120.35 gain 149 33 -119.62 gain 33 150 -112.43 gain 150 33 -116.81 gain 33 151 -112.91 gain 151 33 -110.86 gain 33 152 -115.61 gain 152 33 -115.38 gain 33 153 -112.69 gain 153 33 -114.89 gain 33 154 -110.69 gain 154 33 -108.50 gain 33 155 -116.89 gain 155 33 -118.54 gain 33 156 -114.60 gain 156 33 -114.26 gain 33 157 -118.95 gain 157 33 -120.57 gain 33 158 -112.92 gain 158 33 -114.98 gain 33 159 -117.96 gain 159 33 -113.65 gain 33 160 -113.02 gain 160 33 -110.98 gain 33 161 -116.94 gain 161 33 -117.77 gain 33 162 -124.87 gain 162 33 -122.78 gain 33 163 -118.09 gain 163 33 -113.19 gain 33 164 -116.36 gain 164 33 -113.20 gain 33 165 -119.54 gain 165 33 -119.31 gain 33 166 -115.10 gain 166 33 -117.54 gain 33 167 -113.15 gain 167 33 -114.72 gain 33 168 -114.52 gain 168 33 -117.44 gain 33 169 -114.31 gain 169 33 -109.57 gain 33 170 -119.44 gain 170 33 -125.19 gain 33 171 -112.42 gain 171 33 -114.60 gain 33 172 -111.21 gain 172 33 -106.49 gain 33 173 -119.96 gain 173 33 -119.90 gain 33 174 -113.51 gain 174 33 -113.21 gain 33 175 -115.93 gain 175 33 -114.84 gain 33 176 -118.12 gain 176 33 -116.98 gain 33 177 -118.36 gain 177 33 -118.71 gain 33 178 -116.56 gain 178 33 -117.86 gain 33 179 -118.85 gain 179 33 -121.18 gain 33 180 -118.86 gain 180 33 -116.99 gain 33 181 -118.59 gain 181 33 -121.16 gain 33 182 -110.09 gain 182 33 -108.97 gain 33 183 -111.90 gain 183 33 -112.07 gain 33 184 -113.48 gain 184 33 -115.70 gain 33 185 -120.79 gain 185 33 -118.44 gain 33 186 -116.92 gain 186 33 -113.56 gain 33 187 -119.46 gain 187 33 -120.20 gain 33 188 -115.77 gain 188 33 -119.26 gain 33 189 -122.66 gain 189 33 -125.55 gain 33 190 -121.37 gain 190 33 -119.93 gain 33 191 -113.18 gain 191 33 -114.77 gain 33 192 -116.18 gain 192 33 -115.09 gain 33 193 -118.42 gain 193 33 -121.31 gain 33 194 -116.12 gain 194 33 -118.58 gain 33 195 -114.66 gain 195 33 -115.30 gain 33 196 -122.63 gain 196 33 -122.30 gain 33 197 -117.28 gain 197 33 -119.62 gain 33 198 -122.02 gain 198 33 -128.30 gain 33 199 -113.82 gain 199 33 -111.66 gain 33 200 -114.74 gain 200 33 -109.35 gain 33 201 -121.41 gain 201 33 -119.84 gain 33 202 -109.60 gain 202 33 -109.56 gain 33 203 -121.17 gain 203 33 -117.75 gain 33 204 -110.44 gain 204 33 -114.11 gain 33 205 -116.16 gain 205 33 -117.89 gain 33 206 -118.12 gain 206 33 -117.83 gain 33 207 -118.15 gain 207 33 -118.62 gain 33 208 -122.56 gain 208 33 -123.20 gain 33 209 -118.77 gain 209 33 -115.41 gain 33 210 -121.30 gain 210 33 -124.53 gain 33 211 -121.09 gain 211 33 -120.58 gain 33 212 -121.08 gain 212 33 -118.12 gain 33 213 -112.39 gain 213 33 -114.30 gain 33 214 -116.87 gain 214 33 -115.08 gain 33 215 -115.06 gain 215 33 -114.36 gain 33 216 -119.98 gain 216 33 -120.10 gain 33 217 -117.88 gain 217 33 -121.83 gain 33 218 -118.91 gain 218 33 -115.04 gain 33 219 -118.75 gain 219 33 -117.70 gain 33 220 -125.29 gain 220 33 -120.59 gain 33 221 -123.69 gain 221 33 -123.49 gain 33 222 -112.50 gain 222 33 -113.68 gain 33 223 -119.76 gain 223 33 -122.94 gain 33 224 -126.80 gain 224 33 -130.48 gain 34 35 -82.52 gain 35 34 -84.91 gain 34 36 -92.67 gain 36 34 -96.75 gain 34 37 -94.21 gain 37 34 -100.22 gain 34 38 -103.53 gain 38 34 -101.71 gain 34 39 -97.44 gain 39 34 -97.22 gain 34 40 -99.34 gain 40 34 -100.29 gain 34 41 -113.59 gain 41 34 -116.62 gain 34 42 -105.45 gain 42 34 -106.11 gain 34 43 -118.47 gain 43 34 -117.90 gain 34 44 -116.89 gain 44 34 -119.40 gain 34 45 -99.71 gain 45 34 -103.16 gain 34 46 -93.16 gain 46 34 -96.52 gain 34 47 -93.31 gain 47 34 -94.60 gain 34 48 -83.75 gain 48 34 -88.91 gain 34 49 -81.62 gain 49 34 -85.63 gain 34 50 -78.78 gain 50 34 -79.15 gain 34 51 -100.65 gain 51 34 -99.50 gain 34 52 -94.08 gain 52 34 -100.20 gain 34 53 -99.13 gain 53 34 -99.77 gain 34 54 -100.35 gain 54 34 -104.56 gain 34 55 -102.80 gain 55 34 -102.16 gain 34 56 -111.67 gain 56 34 -115.93 gain 34 57 -107.93 gain 57 34 -108.98 gain 34 58 -114.01 gain 58 34 -116.77 gain 34 59 -114.52 gain 59 34 -119.71 gain 34 60 -106.78 gain 60 34 -109.26 gain 34 61 -102.13 gain 61 34 -106.05 gain 34 62 -97.47 gain 62 34 -100.94 gain 34 63 -90.04 gain 63 34 -94.75 gain 34 64 -96.89 gain 64 34 -96.39 gain 34 65 -95.66 gain 65 34 -93.76 gain 34 66 -94.91 gain 66 34 -96.08 gain 34 67 -100.13 gain 67 34 -100.18 gain 34 68 -101.06 gain 68 34 -108.40 gain 34 69 -102.63 gain 69 34 -103.69 gain 34 70 -112.26 gain 70 34 -114.84 gain 34 71 -106.99 gain 71 34 -109.44 gain 34 72 -104.80 gain 72 34 -105.23 gain 34 73 -105.55 gain 73 34 -106.82 gain 34 74 -109.51 gain 74 34 -113.07 gain 34 75 -98.96 gain 75 34 -100.19 gain 34 76 -95.87 gain 76 34 -98.12 gain 34 77 -104.08 gain 77 34 -109.29 gain 34 78 -92.53 gain 78 34 -94.65 gain 34 79 -100.95 gain 79 34 -101.01 gain 34 80 -95.37 gain 80 34 -96.95 gain 34 81 -102.16 gain 81 34 -101.70 gain 34 82 -106.30 gain 82 34 -108.69 gain 34 83 -97.48 gain 83 34 -99.65 gain 34 84 -112.50 gain 84 34 -112.48 gain 34 85 -109.70 gain 85 34 -107.95 gain 34 86 -105.97 gain 86 34 -112.61 gain 34 87 -111.88 gain 87 34 -114.17 gain 34 88 -108.00 gain 88 34 -110.83 gain 34 89 -118.46 gain 89 34 -121.55 gain 34 90 -105.92 gain 90 34 -110.39 gain 34 91 -105.08 gain 91 34 -108.83 gain 34 92 -103.38 gain 92 34 -107.69 gain 34 93 -94.84 gain 93 34 -100.69 gain 34 94 -109.06 gain 94 34 -109.82 gain 34 95 -106.30 gain 95 34 -110.29 gain 34 96 -106.08 gain 96 34 -105.53 gain 34 97 -103.70 gain 97 34 -106.56 gain 34 98 -105.86 gain 98 34 -107.47 gain 34 99 -106.63 gain 99 34 -111.87 gain 34 100 -106.46 gain 100 34 -113.41 gain 34 101 -110.15 gain 101 34 -113.04 gain 34 102 -110.78 gain 102 34 -113.79 gain 34 103 -111.99 gain 103 34 -114.84 gain 34 104 -110.69 gain 104 34 -109.36 gain 34 105 -102.62 gain 105 34 -106.62 gain 34 106 -100.85 gain 106 34 -103.56 gain 34 107 -102.44 gain 107 34 -105.45 gain 34 108 -101.94 gain 108 34 -104.62 gain 34 109 -109.13 gain 109 34 -113.66 gain 34 110 -105.76 gain 110 34 -107.35 gain 34 111 -103.24 gain 111 34 -107.50 gain 34 112 -98.39 gain 112 34 -102.39 gain 34 113 -110.53 gain 113 34 -116.23 gain 34 114 -108.58 gain 114 34 -111.18 gain 34 115 -103.83 gain 115 34 -101.36 gain 34 116 -105.12 gain 116 34 -108.39 gain 34 117 -108.66 gain 117 34 -114.73 gain 34 118 -116.27 gain 118 34 -119.71 gain 34 119 -107.36 gain 119 34 -110.28 gain 34 120 -106.44 gain 120 34 -104.91 gain 34 121 -107.90 gain 121 34 -109.14 gain 34 122 -104.26 gain 122 34 -108.01 gain 34 123 -101.03 gain 123 34 -102.29 gain 34 124 -100.72 gain 124 34 -101.98 gain 34 125 -111.47 gain 125 34 -114.33 gain 34 126 -97.10 gain 126 34 -96.27 gain 34 127 -108.87 gain 127 34 -109.62 gain 34 128 -109.72 gain 128 34 -112.34 gain 34 129 -103.37 gain 129 34 -103.40 gain 34 130 -113.12 gain 130 34 -115.83 gain 34 131 -109.96 gain 131 34 -110.53 gain 34 132 -107.83 gain 132 34 -111.02 gain 34 133 -111.94 gain 133 34 -113.24 gain 34 134 -111.98 gain 134 34 -113.08 gain 34 135 -107.98 gain 135 34 -110.78 gain 34 136 -104.01 gain 136 34 -108.11 gain 34 137 -108.47 gain 137 34 -110.35 gain 34 138 -106.87 gain 138 34 -104.98 gain 34 139 -110.10 gain 139 34 -110.11 gain 34 140 -103.69 gain 140 34 -109.76 gain 34 141 -105.01 gain 141 34 -105.96 gain 34 142 -107.67 gain 142 34 -113.43 gain 34 143 -102.57 gain 143 34 -103.88 gain 34 144 -112.20 gain 144 34 -114.41 gain 34 145 -115.14 gain 145 34 -116.95 gain 34 146 -110.71 gain 146 34 -110.07 gain 34 147 -112.85 gain 147 34 -116.06 gain 34 148 -113.41 gain 148 34 -115.55 gain 34 149 -122.39 gain 149 34 -123.78 gain 34 150 -113.77 gain 150 34 -120.27 gain 34 151 -107.87 gain 151 34 -107.93 gain 34 152 -112.35 gain 152 34 -114.24 gain 34 153 -110.34 gain 153 34 -114.66 gain 34 154 -115.31 gain 154 34 -115.25 gain 34 155 -112.85 gain 155 34 -116.61 gain 34 156 -114.80 gain 156 34 -116.59 gain 34 157 -107.33 gain 157 34 -111.07 gain 34 158 -120.95 gain 158 34 -125.13 gain 34 159 -112.08 gain 159 34 -109.90 gain 34 160 -114.96 gain 160 34 -115.05 gain 34 161 -109.38 gain 161 34 -112.33 gain 34 162 -117.35 gain 162 34 -117.38 gain 34 163 -120.05 gain 163 34 -117.26 gain 34 164 -118.41 gain 164 34 -117.36 gain 34 165 -119.21 gain 165 34 -121.10 gain 34 166 -106.53 gain 166 34 -111.09 gain 34 167 -114.86 gain 167 34 -118.55 gain 34 168 -114.20 gain 168 34 -119.24 gain 34 169 -110.96 gain 169 34 -108.35 gain 34 170 -113.45 gain 170 34 -121.33 gain 34 171 -110.10 gain 171 34 -114.40 gain 34 172 -113.98 gain 172 34 -111.38 gain 34 173 -111.11 gain 173 34 -113.17 gain 34 174 -112.64 gain 174 34 -114.46 gain 34 175 -113.66 gain 175 34 -114.68 gain 34 176 -107.36 gain 176 34 -108.34 gain 34 177 -110.37 gain 177 34 -112.84 gain 34 178 -115.59 gain 178 34 -119.01 gain 34 179 -122.77 gain 179 34 -127.21 gain 34 180 -112.31 gain 180 34 -112.55 gain 34 181 -116.09 gain 181 34 -120.78 gain 34 182 -114.23 gain 182 34 -115.23 gain 34 183 -116.74 gain 183 34 -119.03 gain 34 184 -108.88 gain 184 34 -113.23 gain 34 185 -113.16 gain 185 34 -112.93 gain 34 186 -115.16 gain 186 34 -113.93 gain 34 187 -108.89 gain 187 34 -111.75 gain 34 188 -112.92 gain 188 34 -118.54 gain 34 189 -107.57 gain 189 34 -112.58 gain 34 190 -114.97 gain 190 34 -115.65 gain 34 191 -113.88 gain 191 34 -117.59 gain 34 192 -121.65 gain 192 34 -122.67 gain 34 193 -110.71 gain 193 34 -115.72 gain 34 194 -118.94 gain 194 34 -123.51 gain 34 195 -112.67 gain 195 34 -115.43 gain 34 196 -104.23 gain 196 34 -106.02 gain 34 197 -109.50 gain 197 34 -113.96 gain 34 198 -111.51 gain 198 34 -119.91 gain 34 199 -112.44 gain 199 34 -112.41 gain 34 200 -117.78 gain 200 34 -114.52 gain 34 201 -115.06 gain 201 34 -115.61 gain 34 202 -110.92 gain 202 34 -113.00 gain 34 203 -115.17 gain 203 34 -113.88 gain 34 204 -117.54 gain 204 34 -123.33 gain 34 205 -115.42 gain 205 34 -119.28 gain 34 206 -113.58 gain 206 34 -115.41 gain 34 207 -115.75 gain 207 34 -118.34 gain 34 208 -122.16 gain 208 34 -124.93 gain 34 209 -122.28 gain 209 34 -121.04 gain 34 210 -112.35 gain 210 34 -117.70 gain 34 211 -113.73 gain 211 34 -115.34 gain 34 212 -119.36 gain 212 34 -118.52 gain 34 213 -114.75 gain 213 34 -118.77 gain 34 214 -115.65 gain 214 34 -115.98 gain 34 215 -111.19 gain 215 34 -112.61 gain 34 216 -106.13 gain 216 34 -108.37 gain 34 217 -113.18 gain 217 34 -119.25 gain 34 218 -110.00 gain 218 34 -108.25 gain 34 219 -120.70 gain 219 34 -121.77 gain 34 220 -112.49 gain 220 34 -109.91 gain 34 221 -116.02 gain 221 34 -117.95 gain 34 222 -127.12 gain 222 34 -130.42 gain 34 223 -114.31 gain 223 34 -119.61 gain 34 224 -116.44 gain 224 34 -122.25 gain 35 36 -92.65 gain 36 35 -94.34 gain 35 37 -92.37 gain 37 35 -95.99 gain 35 38 -99.52 gain 38 35 -95.31 gain 35 39 -105.41 gain 39 35 -102.79 gain 35 40 -107.63 gain 40 35 -106.19 gain 35 41 -98.90 gain 41 35 -99.53 gain 35 42 -108.44 gain 42 35 -106.71 gain 35 43 -114.13 gain 43 35 -111.17 gain 35 44 -107.13 gain 44 35 -107.24 gain 35 45 -114.01 gain 45 35 -115.05 gain 35 46 -99.04 gain 46 35 -100.01 gain 35 47 -99.69 gain 47 35 -98.58 gain 35 48 -95.84 gain 48 35 -98.60 gain 35 49 -81.55 gain 49 35 -83.17 gain 35 50 -87.24 gain 50 35 -85.22 gain 35 51 -90.00 gain 51 35 -86.45 gain 35 52 -97.03 gain 52 35 -100.76 gain 35 53 -103.46 gain 53 35 -101.70 gain 35 54 -103.51 gain 54 35 -105.32 gain 35 55 -109.43 gain 55 35 -106.40 gain 35 56 -106.60 gain 56 35 -108.47 gain 35 57 -111.62 gain 57 35 -110.28 gain 35 58 -111.66 gain 58 35 -112.02 gain 35 59 -104.27 gain 59 35 -107.07 gain 35 60 -109.75 gain 60 35 -109.83 gain 35 61 -100.98 gain 61 35 -102.50 gain 35 62 -103.15 gain 62 35 -104.23 gain 35 63 -97.84 gain 63 35 -100.15 gain 35 64 -96.60 gain 64 35 -93.70 gain 35 65 -96.76 gain 65 35 -92.46 gain 35 66 -94.14 gain 66 35 -92.91 gain 35 67 -101.49 gain 67 35 -99.13 gain 35 68 -108.80 gain 68 35 -113.75 gain 35 69 -105.16 gain 69 35 -103.83 gain 35 70 -108.49 gain 70 35 -108.67 gain 35 71 -107.06 gain 71 35 -107.11 gain 35 72 -121.77 gain 72 35 -119.80 gain 35 73 -110.06 gain 73 35 -108.92 gain 35 74 -116.22 gain 74 35 -117.37 gain 35 75 -108.56 gain 75 35 -107.39 gain 35 76 -104.86 gain 76 35 -104.71 gain 35 77 -112.58 gain 77 35 -115.39 gain 35 78 -97.98 gain 78 35 -97.71 gain 35 79 -101.50 gain 79 35 -99.15 gain 35 80 -94.72 gain 80 35 -93.90 gain 35 81 -97.60 gain 81 35 -94.74 gain 35 82 -99.13 gain 82 35 -99.13 gain 35 83 -105.64 gain 83 35 -105.42 gain 35 84 -103.88 gain 84 35 -101.46 gain 35 85 -114.75 gain 85 35 -110.60 gain 35 86 -104.99 gain 86 35 -109.23 gain 35 87 -114.67 gain 87 35 -114.56 gain 35 88 -110.40 gain 88 35 -110.84 gain 35 89 -115.95 gain 89 35 -116.65 gain 35 90 -108.33 gain 90 35 -110.40 gain 35 91 -99.47 gain 91 35 -100.82 gain 35 92 -110.06 gain 92 35 -111.98 gain 35 93 -101.05 gain 93 35 -104.50 gain 35 94 -107.45 gain 94 35 -105.82 gain 35 95 -101.77 gain 95 35 -103.36 gain 35 96 -101.90 gain 96 35 -98.95 gain 35 97 -107.97 gain 97 35 -108.43 gain 35 98 -110.80 gain 98 35 -110.01 gain 35 99 -107.95 gain 99 35 -110.80 gain 35 100 -106.16 gain 100 35 -110.72 gain 35 101 -110.84 gain 101 35 -111.33 gain 35 102 -114.44 gain 102 35 -115.05 gain 35 103 -118.32 gain 103 35 -118.77 gain 35 104 -114.14 gain 104 35 -110.42 gain 35 105 -107.94 gain 105 35 -109.54 gain 35 106 -111.46 gain 106 35 -111.78 gain 35 107 -104.95 gain 107 35 -105.57 gain 35 108 -117.31 gain 108 35 -117.59 gain 35 109 -104.82 gain 109 35 -106.94 gain 35 110 -104.42 gain 110 35 -103.61 gain 35 111 -100.99 gain 111 35 -102.84 gain 35 112 -99.53 gain 112 35 -101.14 gain 35 113 -106.12 gain 113 35 -109.42 gain 35 114 -106.87 gain 114 35 -107.07 gain 35 115 -110.44 gain 115 35 -105.57 gain 35 116 -108.75 gain 116 35 -109.62 gain 35 117 -115.61 gain 117 35 -119.28 gain 35 118 -114.90 gain 118 35 -115.95 gain 35 119 -119.73 gain 119 35 -120.25 gain 35 120 -113.46 gain 120 35 -109.53 gain 35 121 -104.64 gain 121 35 -103.48 gain 35 122 -114.53 gain 122 35 -115.88 gain 35 123 -109.09 gain 123 35 -107.95 gain 35 124 -105.44 gain 124 35 -104.30 gain 35 125 -108.46 gain 125 35 -108.93 gain 35 126 -108.83 gain 126 35 -105.61 gain 35 127 -111.96 gain 127 35 -110.32 gain 35 128 -106.15 gain 128 35 -106.37 gain 35 129 -107.58 gain 129 35 -105.21 gain 35 130 -105.31 gain 130 35 -105.62 gain 35 131 -114.25 gain 131 35 -112.42 gain 35 132 -121.35 gain 132 35 -122.15 gain 35 133 -114.68 gain 133 35 -113.58 gain 35 134 -114.18 gain 134 35 -112.88 gain 35 135 -110.73 gain 135 35 -111.14 gain 35 136 -118.97 gain 136 35 -120.66 gain 35 137 -118.12 gain 137 35 -117.59 gain 35 138 -109.17 gain 138 35 -104.88 gain 35 139 -108.30 gain 139 35 -105.91 gain 35 140 -108.59 gain 140 35 -112.26 gain 35 141 -109.96 gain 141 35 -108.52 gain 35 142 -118.64 gain 142 35 -122.01 gain 35 143 -103.01 gain 143 35 -101.92 gain 35 144 -117.49 gain 144 35 -117.31 gain 35 145 -113.52 gain 145 35 -112.93 gain 35 146 -118.71 gain 146 35 -115.67 gain 35 147 -112.89 gain 147 35 -113.70 gain 35 148 -116.14 gain 148 35 -115.88 gain 35 149 -120.18 gain 149 35 -119.17 gain 35 150 -119.29 gain 150 35 -123.40 gain 35 151 -116.91 gain 151 35 -114.58 gain 35 152 -117.33 gain 152 35 -116.82 gain 35 153 -109.31 gain 153 35 -111.24 gain 35 154 -107.79 gain 154 35 -105.33 gain 35 155 -114.24 gain 155 35 -115.61 gain 35 156 -118.08 gain 156 35 -117.47 gain 35 157 -116.91 gain 157 35 -118.25 gain 35 158 -111.89 gain 158 35 -113.67 gain 35 159 -110.91 gain 159 35 -106.32 gain 35 160 -107.29 gain 160 35 -104.98 gain 35 161 -104.70 gain 161 35 -105.25 gain 35 162 -120.10 gain 162 35 -117.73 gain 35 163 -108.01 gain 163 35 -102.83 gain 35 164 -124.07 gain 164 35 -120.63 gain 35 165 -114.64 gain 165 35 -114.13 gain 35 166 -109.77 gain 166 35 -111.93 gain 35 167 -116.94 gain 167 35 -118.23 gain 35 168 -111.86 gain 168 35 -114.50 gain 35 169 -116.51 gain 169 35 -111.50 gain 35 170 -112.38 gain 170 35 -117.86 gain 35 171 -111.64 gain 171 35 -113.54 gain 35 172 -118.37 gain 172 35 -113.37 gain 35 173 -116.58 gain 173 35 -116.24 gain 35 174 -119.71 gain 174 35 -119.13 gain 35 175 -106.66 gain 175 35 -105.29 gain 35 176 -115.17 gain 176 35 -113.75 gain 35 177 -113.78 gain 177 35 -113.85 gain 35 178 -116.64 gain 178 35 -117.66 gain 35 179 -123.22 gain 179 35 -125.27 gain 35 180 -117.92 gain 180 35 -115.78 gain 35 181 -113.72 gain 181 35 -116.01 gain 35 182 -117.19 gain 182 35 -115.78 gain 35 183 -118.38 gain 183 35 -118.27 gain 35 184 -116.53 gain 184 35 -118.48 gain 35 185 -119.35 gain 185 35 -116.73 gain 35 186 -113.70 gain 186 35 -110.07 gain 35 187 -111.09 gain 187 35 -111.55 gain 35 188 -115.93 gain 188 35 -119.14 gain 35 189 -113.19 gain 189 35 -115.80 gain 35 190 -121.64 gain 190 35 -119.91 gain 35 191 -118.31 gain 191 35 -119.63 gain 35 192 -111.26 gain 192 35 -109.89 gain 35 193 -118.06 gain 193 35 -120.67 gain 35 194 -116.03 gain 194 35 -118.21 gain 35 195 -117.54 gain 195 35 -117.91 gain 35 196 -111.56 gain 196 35 -110.95 gain 35 197 -124.78 gain 197 35 -126.84 gain 35 198 -122.53 gain 198 35 -128.53 gain 35 199 -113.10 gain 199 35 -110.67 gain 35 200 -113.65 gain 200 35 -107.98 gain 35 201 -120.26 gain 201 35 -118.41 gain 35 202 -112.40 gain 202 35 -112.08 gain 35 203 -114.90 gain 203 35 -111.21 gain 35 204 -111.23 gain 204 35 -114.62 gain 35 205 -122.52 gain 205 35 -123.98 gain 35 206 -115.00 gain 206 35 -114.44 gain 35 207 -116.97 gain 207 35 -117.16 gain 35 208 -121.58 gain 208 35 -121.94 gain 35 209 -112.33 gain 209 35 -108.70 gain 35 210 -110.86 gain 210 35 -113.82 gain 35 211 -115.61 gain 211 35 -114.83 gain 35 212 -117.12 gain 212 35 -113.89 gain 35 213 -117.02 gain 213 35 -118.65 gain 35 214 -114.87 gain 214 35 -112.80 gain 35 215 -123.02 gain 215 35 -122.03 gain 35 216 -122.80 gain 216 35 -122.65 gain 35 217 -116.39 gain 217 35 -120.06 gain 35 218 -119.18 gain 218 35 -115.04 gain 35 219 -116.11 gain 219 35 -114.78 gain 35 220 -115.09 gain 220 35 -110.11 gain 35 221 -119.76 gain 221 35 -119.29 gain 35 222 -113.57 gain 222 35 -114.47 gain 35 223 -116.83 gain 223 35 -119.73 gain 35 224 -125.81 gain 224 35 -129.22 gain 36 37 -90.62 gain 37 36 -92.56 gain 36 38 -99.80 gain 38 36 -93.90 gain 36 39 -100.63 gain 39 36 -96.34 gain 36 40 -117.72 gain 40 36 -114.59 gain 36 41 -107.01 gain 41 36 -105.96 gain 36 42 -104.49 gain 42 36 -101.07 gain 36 43 -114.27 gain 43 36 -109.62 gain 36 44 -117.83 gain 44 36 -116.26 gain 36 45 -109.41 gain 45 36 -108.77 gain 36 46 -105.14 gain 46 36 -104.42 gain 36 47 -102.22 gain 47 36 -99.43 gain 36 48 -106.63 gain 48 36 -107.70 gain 36 49 -93.33 gain 49 36 -93.26 gain 36 50 -93.05 gain 50 36 -89.34 gain 36 51 -87.85 gain 51 36 -82.62 gain 36 52 -90.88 gain 52 36 -92.93 gain 36 53 -94.46 gain 53 36 -91.02 gain 36 54 -105.14 gain 54 36 -105.28 gain 36 55 -103.38 gain 55 36 -98.67 gain 36 56 -103.68 gain 56 36 -103.87 gain 36 57 -116.35 gain 57 36 -113.32 gain 36 58 -106.13 gain 58 36 -104.80 gain 36 59 -112.92 gain 59 36 -114.04 gain 36 60 -113.14 gain 60 36 -111.54 gain 36 61 -101.37 gain 61 36 -101.21 gain 36 62 -101.26 gain 62 36 -100.65 gain 36 63 -101.83 gain 63 36 -102.46 gain 36 64 -103.49 gain 64 36 -98.91 gain 36 65 -99.14 gain 65 36 -93.16 gain 36 66 -98.61 gain 66 36 -95.69 gain 36 67 -100.70 gain 67 36 -96.67 gain 36 68 -99.06 gain 68 36 -102.32 gain 36 69 -100.19 gain 69 36 -97.18 gain 36 70 -106.35 gain 70 36 -104.86 gain 36 71 -114.36 gain 71 36 -112.73 gain 36 72 -105.75 gain 72 36 -102.10 gain 36 73 -115.20 gain 73 36 -112.39 gain 36 74 -118.23 gain 74 36 -117.70 gain 36 75 -112.00 gain 75 36 -109.15 gain 36 76 -113.84 gain 76 36 -112.00 gain 36 77 -104.10 gain 77 36 -105.23 gain 36 78 -107.93 gain 78 36 -105.97 gain 36 79 -100.20 gain 79 36 -96.17 gain 36 80 -96.42 gain 80 36 -93.91 gain 36 81 -98.43 gain 81 36 -93.89 gain 36 82 -96.20 gain 82 36 -94.51 gain 36 83 -99.03 gain 83 36 -97.12 gain 36 84 -97.76 gain 84 36 -93.66 gain 36 85 -102.26 gain 85 36 -96.43 gain 36 86 -113.42 gain 86 36 -115.97 gain 36 87 -103.91 gain 87 36 -102.12 gain 36 88 -113.89 gain 88 36 -112.64 gain 36 89 -118.93 gain 89 36 -117.94 gain 36 90 -105.71 gain 90 36 -106.09 gain 36 91 -105.69 gain 91 36 -105.36 gain 36 92 -111.58 gain 92 36 -111.82 gain 36 93 -114.09 gain 93 36 -115.87 gain 36 94 -109.37 gain 94 36 -106.05 gain 36 95 -106.27 gain 95 36 -106.18 gain 36 96 -101.21 gain 96 36 -96.58 gain 36 97 -98.24 gain 97 36 -97.02 gain 36 98 -107.84 gain 98 36 -105.37 gain 36 99 -114.20 gain 99 36 -115.36 gain 36 100 -105.59 gain 100 36 -108.47 gain 36 101 -118.30 gain 101 36 -117.11 gain 36 102 -110.79 gain 102 36 -109.72 gain 36 103 -114.02 gain 103 36 -112.79 gain 36 104 -118.53 gain 104 36 -113.12 gain 36 105 -113.96 gain 105 36 -113.88 gain 36 106 -116.58 gain 106 36 -115.21 gain 36 107 -113.12 gain 107 36 -112.05 gain 36 108 -103.13 gain 108 36 -101.72 gain 36 109 -108.21 gain 109 36 -108.66 gain 36 110 -107.59 gain 110 36 -105.10 gain 36 111 -116.28 gain 111 36 -116.45 gain 36 112 -110.69 gain 112 36 -110.61 gain 36 113 -109.72 gain 113 36 -111.33 gain 36 114 -103.56 gain 114 36 -102.09 gain 36 115 -108.62 gain 115 36 -102.06 gain 36 116 -106.30 gain 116 36 -105.48 gain 36 117 -113.97 gain 117 36 -115.96 gain 36 118 -117.73 gain 118 36 -117.09 gain 36 119 -115.18 gain 119 36 -114.02 gain 36 120 -113.65 gain 120 36 -108.03 gain 36 121 -105.05 gain 121 36 -102.21 gain 36 122 -119.67 gain 122 36 -119.33 gain 36 123 -110.39 gain 123 36 -107.58 gain 36 124 -113.72 gain 124 36 -110.89 gain 36 125 -110.97 gain 125 36 -109.75 gain 36 126 -112.07 gain 126 36 -107.17 gain 36 127 -108.52 gain 127 36 -105.19 gain 36 128 -115.48 gain 128 36 -114.02 gain 36 129 -109.91 gain 129 36 -105.85 gain 36 130 -110.14 gain 130 36 -108.77 gain 36 131 -115.28 gain 131 36 -111.78 gain 36 132 -120.30 gain 132 36 -119.41 gain 36 133 -118.66 gain 133 36 -115.88 gain 36 134 -116.52 gain 134 36 -113.54 gain 36 135 -123.48 gain 135 36 -122.21 gain 36 136 -121.37 gain 136 36 -121.38 gain 36 137 -113.83 gain 137 36 -111.63 gain 36 138 -113.11 gain 138 36 -107.13 gain 36 139 -115.82 gain 139 36 -111.75 gain 36 140 -106.82 gain 140 36 -108.80 gain 36 141 -104.34 gain 141 36 -101.21 gain 36 142 -113.49 gain 142 36 -115.17 gain 36 143 -117.52 gain 143 36 -114.75 gain 36 144 -109.01 gain 144 36 -107.14 gain 36 145 -116.29 gain 145 36 -114.02 gain 36 146 -118.13 gain 146 36 -113.41 gain 36 147 -108.00 gain 147 36 -107.13 gain 36 148 -113.02 gain 148 36 -111.08 gain 36 149 -118.87 gain 149 36 -116.18 gain 36 150 -121.41 gain 150 36 -123.84 gain 36 151 -117.07 gain 151 36 -113.05 gain 36 152 -113.33 gain 152 36 -111.14 gain 36 153 -115.66 gain 153 36 -115.90 gain 36 154 -121.70 gain 154 36 -117.55 gain 36 155 -104.39 gain 155 36 -104.08 gain 36 156 -116.16 gain 156 36 -113.86 gain 36 157 -101.98 gain 157 36 -101.64 gain 36 158 -116.11 gain 158 36 -116.20 gain 36 159 -112.63 gain 159 36 -106.37 gain 36 160 -115.38 gain 160 36 -111.38 gain 36 161 -117.34 gain 161 36 -116.20 gain 36 162 -122.83 gain 162 36 -118.77 gain 36 163 -117.76 gain 163 36 -110.89 gain 36 164 -119.10 gain 164 36 -113.98 gain 36 165 -115.63 gain 165 36 -113.44 gain 36 166 -123.99 gain 166 36 -124.48 gain 36 167 -113.13 gain 167 36 -112.73 gain 36 168 -115.16 gain 168 36 -116.11 gain 36 169 -120.97 gain 169 36 -114.27 gain 36 170 -105.66 gain 170 36 -109.45 gain 36 171 -112.49 gain 171 36 -112.70 gain 36 172 -129.23 gain 172 36 -122.55 gain 36 173 -116.81 gain 173 36 -114.79 gain 36 174 -117.31 gain 174 36 -115.05 gain 36 175 -113.09 gain 175 36 -110.04 gain 36 176 -119.20 gain 176 36 -116.10 gain 36 177 -117.83 gain 177 36 -116.22 gain 36 178 -119.81 gain 178 36 -119.15 gain 36 179 -124.69 gain 179 36 -125.05 gain 36 180 -126.26 gain 180 36 -122.43 gain 36 181 -122.36 gain 181 36 -122.97 gain 36 182 -113.03 gain 182 36 -109.94 gain 36 183 -111.41 gain 183 36 -109.62 gain 36 184 -108.24 gain 184 36 -108.50 gain 36 185 -120.89 gain 185 36 -116.58 gain 36 186 -116.67 gain 186 36 -111.36 gain 36 187 -120.68 gain 187 36 -119.46 gain 36 188 -113.26 gain 188 36 -114.79 gain 36 189 -121.41 gain 189 36 -122.34 gain 36 190 -124.27 gain 190 36 -120.87 gain 36 191 -114.44 gain 191 36 -114.07 gain 36 192 -120.19 gain 192 36 -117.14 gain 36 193 -122.24 gain 193 36 -123.16 gain 36 194 -123.05 gain 194 36 -123.55 gain 36 195 -125.47 gain 195 36 -124.16 gain 36 196 -123.83 gain 196 36 -121.54 gain 36 197 -115.20 gain 197 36 -115.59 gain 36 198 -121.37 gain 198 36 -125.69 gain 36 199 -126.84 gain 199 36 -122.72 gain 36 200 -114.69 gain 200 36 -107.34 gain 36 201 -117.12 gain 201 36 -113.59 gain 36 202 -124.17 gain 202 36 -122.17 gain 36 203 -119.38 gain 203 36 -114.01 gain 36 204 -118.57 gain 204 36 -120.28 gain 36 205 -122.55 gain 205 36 -122.33 gain 36 206 -110.60 gain 206 36 -108.35 gain 36 207 -117.78 gain 207 36 -116.29 gain 36 208 -116.82 gain 208 36 -115.51 gain 36 209 -118.66 gain 209 36 -113.35 gain 36 210 -126.76 gain 210 36 -128.03 gain 36 211 -117.13 gain 211 36 -114.66 gain 36 212 -119.28 gain 212 36 -114.36 gain 36 213 -121.48 gain 213 36 -121.43 gain 36 214 -115.19 gain 214 36 -111.43 gain 36 215 -119.51 gain 215 36 -116.85 gain 36 216 -119.48 gain 216 36 -117.64 gain 36 217 -117.37 gain 217 36 -119.35 gain 36 218 -121.26 gain 218 36 -115.43 gain 36 219 -120.34 gain 219 36 -117.33 gain 36 220 -122.83 gain 220 36 -116.17 gain 36 221 -114.19 gain 221 36 -112.04 gain 36 222 -120.54 gain 222 36 -119.75 gain 36 223 -121.87 gain 223 36 -123.10 gain 36 224 -117.83 gain 224 36 -119.55 gain 37 38 -87.32 gain 38 37 -79.49 gain 37 39 -99.75 gain 39 37 -93.52 gain 37 40 -103.65 gain 40 37 -98.59 gain 37 41 -110.12 gain 41 37 -107.13 gain 37 42 -110.05 gain 42 37 -104.70 gain 37 43 -107.84 gain 43 37 -101.26 gain 37 44 -118.27 gain 44 37 -114.77 gain 37 45 -113.61 gain 45 37 -111.03 gain 37 46 -108.47 gain 46 37 -105.81 gain 37 47 -117.18 gain 47 37 -112.45 gain 37 48 -104.70 gain 48 37 -103.84 gain 37 49 -102.24 gain 49 37 -100.24 gain 37 50 -97.06 gain 50 37 -91.41 gain 37 51 -95.73 gain 51 37 -88.56 gain 37 52 -89.02 gain 52 37 -89.12 gain 37 53 -91.78 gain 53 37 -86.40 gain 37 54 -107.23 gain 54 37 -105.43 gain 37 55 -92.73 gain 55 37 -86.08 gain 37 56 -111.12 gain 56 37 -109.37 gain 37 57 -108.64 gain 57 37 -103.67 gain 37 58 -118.94 gain 58 37 -115.68 gain 37 59 -118.32 gain 59 37 -117.49 gain 37 60 -115.85 gain 60 37 -112.31 gain 37 61 -107.93 gain 61 37 -105.83 gain 37 62 -111.88 gain 62 37 -109.34 gain 37 63 -112.86 gain 63 37 -111.56 gain 37 64 -110.67 gain 64 37 -104.16 gain 37 65 -96.10 gain 65 37 -88.18 gain 37 66 -96.80 gain 66 37 -91.95 gain 37 67 -100.68 gain 67 37 -94.71 gain 37 68 -106.41 gain 68 37 -107.73 gain 37 69 -100.79 gain 69 37 -95.84 gain 37 70 -98.27 gain 70 37 -94.83 gain 37 71 -106.08 gain 71 37 -102.51 gain 37 72 -110.39 gain 72 37 -104.80 gain 37 73 -108.90 gain 73 37 -104.15 gain 37 74 -112.75 gain 74 37 -110.28 gain 37 75 -115.43 gain 75 37 -110.65 gain 37 76 -114.13 gain 76 37 -110.36 gain 37 77 -111.08 gain 77 37 -110.27 gain 37 78 -114.27 gain 78 37 -110.38 gain 37 79 -98.67 gain 79 37 -92.71 gain 37 80 -96.50 gain 80 37 -92.06 gain 37 81 -102.01 gain 81 37 -95.53 gain 37 82 -101.18 gain 82 37 -97.55 gain 37 83 -110.51 gain 83 37 -106.66 gain 37 84 -109.69 gain 84 37 -103.65 gain 37 85 -111.20 gain 85 37 -103.44 gain 37 86 -111.43 gain 86 37 -112.06 gain 37 87 -115.46 gain 87 37 -111.73 gain 37 88 -116.95 gain 88 37 -113.76 gain 37 89 -113.50 gain 89 37 -110.58 gain 37 90 -127.74 gain 90 37 -126.19 gain 37 91 -114.34 gain 91 37 -112.07 gain 37 92 -115.79 gain 92 37 -114.09 gain 37 93 -106.30 gain 93 37 -106.13 gain 37 94 -110.50 gain 94 37 -105.24 gain 37 95 -103.30 gain 95 37 -101.27 gain 37 96 -107.92 gain 96 37 -101.35 gain 37 97 -103.13 gain 97 37 -99.98 gain 37 98 -110.51 gain 98 37 -106.11 gain 37 99 -109.36 gain 99 37 -108.59 gain 37 100 -106.85 gain 100 37 -107.79 gain 37 101 -111.21 gain 101 37 -108.08 gain 37 102 -119.30 gain 102 37 -116.30 gain 37 103 -118.95 gain 103 37 -115.79 gain 37 104 -112.72 gain 104 37 -105.38 gain 37 105 -109.08 gain 105 37 -107.05 gain 37 106 -121.92 gain 106 37 -118.62 gain 37 107 -108.82 gain 107 37 -105.82 gain 37 108 -110.00 gain 108 37 -106.66 gain 37 109 -110.44 gain 109 37 -108.94 gain 37 110 -114.92 gain 110 37 -110.50 gain 37 111 -111.72 gain 111 37 -109.95 gain 37 112 -119.26 gain 112 37 -117.25 gain 37 113 -106.89 gain 113 37 -106.58 gain 37 114 -108.00 gain 114 37 -104.59 gain 37 115 -110.16 gain 115 37 -101.67 gain 37 116 -111.15 gain 116 37 -108.40 gain 37 117 -112.14 gain 117 37 -112.19 gain 37 118 -110.47 gain 118 37 -107.90 gain 37 119 -121.67 gain 119 37 -118.57 gain 37 120 -124.72 gain 120 37 -117.16 gain 37 121 -118.18 gain 121 37 -113.40 gain 37 122 -117.00 gain 122 37 -114.74 gain 37 123 -116.26 gain 123 37 -111.51 gain 37 124 -112.01 gain 124 37 -107.25 gain 37 125 -115.07 gain 125 37 -111.91 gain 37 126 -120.24 gain 126 37 -113.40 gain 37 127 -117.51 gain 127 37 -112.24 gain 37 128 -104.57 gain 128 37 -101.17 gain 37 129 -114.16 gain 129 37 -108.17 gain 37 130 -112.53 gain 130 37 -109.22 gain 37 131 -118.32 gain 131 37 -112.87 gain 37 132 -119.81 gain 132 37 -116.98 gain 37 133 -113.00 gain 133 37 -108.28 gain 37 134 -119.64 gain 134 37 -114.72 gain 37 135 -128.14 gain 135 37 -124.92 gain 37 136 -114.78 gain 136 37 -112.85 gain 37 137 -118.23 gain 137 37 -114.09 gain 37 138 -111.62 gain 138 37 -103.71 gain 37 139 -105.85 gain 139 37 -99.84 gain 37 140 -112.00 gain 140 37 -112.05 gain 37 141 -117.49 gain 141 37 -112.42 gain 37 142 -120.36 gain 142 37 -120.11 gain 37 143 -110.44 gain 143 37 -105.73 gain 37 144 -110.76 gain 144 37 -106.96 gain 37 145 -111.45 gain 145 37 -107.24 gain 37 146 -111.27 gain 146 37 -104.61 gain 37 147 -114.68 gain 147 37 -111.88 gain 37 148 -116.28 gain 148 37 -112.40 gain 37 149 -116.65 gain 149 37 -112.03 gain 37 150 -118.48 gain 150 37 -118.97 gain 37 151 -126.05 gain 151 37 -120.10 gain 37 152 -116.42 gain 152 37 -112.29 gain 37 153 -116.19 gain 153 37 -114.50 gain 37 154 -117.50 gain 154 37 -111.42 gain 37 155 -113.57 gain 155 37 -111.32 gain 37 156 -118.57 gain 156 37 -114.34 gain 37 157 -118.71 gain 157 37 -116.43 gain 37 158 -112.30 gain 158 37 -110.46 gain 37 159 -112.22 gain 159 37 -104.02 gain 37 160 -122.60 gain 160 37 -116.66 gain 37 161 -116.35 gain 161 37 -113.28 gain 37 162 -116.70 gain 162 37 -110.71 gain 37 163 -115.28 gain 163 37 -106.48 gain 37 164 -118.20 gain 164 37 -111.14 gain 37 165 -117.98 gain 165 37 -113.85 gain 37 166 -121.77 gain 166 37 -120.32 gain 37 167 -114.43 gain 167 37 -112.10 gain 37 168 -119.35 gain 168 37 -118.37 gain 37 169 -113.65 gain 169 37 -105.01 gain 37 170 -116.41 gain 170 37 -118.27 gain 37 171 -117.84 gain 171 37 -116.12 gain 37 172 -118.85 gain 172 37 -110.23 gain 37 173 -117.96 gain 173 37 -114.01 gain 37 174 -115.00 gain 174 37 -110.80 gain 37 175 -122.40 gain 175 37 -117.41 gain 37 176 -112.65 gain 176 37 -107.62 gain 37 177 -116.89 gain 177 37 -113.34 gain 37 178 -124.63 gain 178 37 -122.03 gain 37 179 -121.88 gain 179 37 -120.31 gain 37 180 -130.59 gain 180 37 -124.82 gain 37 181 -116.61 gain 181 37 -115.28 gain 37 182 -116.41 gain 182 37 -111.39 gain 37 183 -115.57 gain 183 37 -111.84 gain 37 184 -115.54 gain 184 37 -113.86 gain 37 185 -118.54 gain 185 37 -112.29 gain 37 186 -121.26 gain 186 37 -114.01 gain 37 187 -124.18 gain 187 37 -121.02 gain 37 188 -118.11 gain 188 37 -117.70 gain 37 189 -112.39 gain 189 37 -111.39 gain 37 190 -124.42 gain 190 37 -119.07 gain 37 191 -118.81 gain 191 37 -116.51 gain 37 192 -118.53 gain 192 37 -113.54 gain 37 193 -121.68 gain 193 37 -120.67 gain 37 194 -120.18 gain 194 37 -118.74 gain 37 195 -120.02 gain 195 37 -116.77 gain 37 196 -116.74 gain 196 37 -112.51 gain 37 197 -126.69 gain 197 37 -125.14 gain 37 198 -116.21 gain 198 37 -118.59 gain 37 199 -118.68 gain 199 37 -112.63 gain 37 200 -127.19 gain 200 37 -117.90 gain 37 201 -114.73 gain 201 37 -109.27 gain 37 202 -123.02 gain 202 37 -119.08 gain 37 203 -117.16 gain 203 37 -109.85 gain 37 204 -124.35 gain 204 37 -124.12 gain 37 205 -119.51 gain 205 37 -117.34 gain 37 206 -124.85 gain 206 37 -120.66 gain 37 207 -129.55 gain 207 37 -126.13 gain 37 208 -130.17 gain 208 37 -126.92 gain 37 209 -122.83 gain 209 37 -115.58 gain 37 210 -127.55 gain 210 37 -126.89 gain 37 211 -120.48 gain 211 37 -116.08 gain 37 212 -123.21 gain 212 37 -116.36 gain 37 213 -123.23 gain 213 37 -121.24 gain 37 214 -120.24 gain 214 37 -114.55 gain 37 215 -121.51 gain 215 37 -116.91 gain 37 216 -122.85 gain 216 37 -119.07 gain 37 217 -119.03 gain 217 37 -119.08 gain 37 218 -121.22 gain 218 37 -113.45 gain 37 219 -124.31 gain 219 37 -119.36 gain 37 220 -125.79 gain 220 37 -117.20 gain 37 221 -121.54 gain 221 37 -117.45 gain 37 222 -119.62 gain 222 37 -116.89 gain 37 223 -136.72 gain 223 37 -136.01 gain 37 224 -121.22 gain 224 37 -121.00 gain 38 39 -86.74 gain 39 38 -88.34 gain 38 40 -86.66 gain 40 38 -89.43 gain 38 41 -97.83 gain 41 38 -102.67 gain 38 42 -97.79 gain 42 38 -100.27 gain 38 43 -100.46 gain 43 38 -101.71 gain 38 44 -104.36 gain 44 38 -108.69 gain 38 45 -110.02 gain 45 38 -115.28 gain 38 46 -105.77 gain 46 38 -110.95 gain 38 47 -112.19 gain 47 38 -115.30 gain 38 48 -103.14 gain 48 38 -110.12 gain 38 49 -96.11 gain 49 38 -101.94 gain 38 50 -86.24 gain 50 38 -88.43 gain 38 51 -86.79 gain 51 38 -87.45 gain 38 52 -85.46 gain 52 38 -93.40 gain 38 53 -85.35 gain 53 38 -87.81 gain 38 54 -95.10 gain 54 38 -101.13 gain 38 55 -97.22 gain 55 38 -98.41 gain 38 56 -101.54 gain 56 38 -107.62 gain 38 57 -99.54 gain 57 38 -102.41 gain 38 58 -102.98 gain 58 38 -107.55 gain 38 59 -101.33 gain 59 38 -108.34 gain 38 60 -107.37 gain 60 38 -111.66 gain 38 61 -112.63 gain 61 38 -118.37 gain 38 62 -108.03 gain 62 38 -113.32 gain 38 63 -96.38 gain 63 38 -102.91 gain 38 64 -92.69 gain 64 38 -94.00 gain 38 65 -92.98 gain 65 38 -92.89 gain 38 66 -99.73 gain 66 38 -102.71 gain 38 67 -88.80 gain 67 38 -90.67 gain 38 68 -84.14 gain 68 38 -93.30 gain 38 69 -87.83 gain 69 38 -90.71 gain 38 70 -92.04 gain 70 38 -96.44 gain 38 71 -92.04 gain 71 38 -96.31 gain 38 72 -106.50 gain 72 38 -108.74 gain 38 73 -104.92 gain 73 38 -108.00 gain 38 74 -101.31 gain 74 38 -106.68 gain 38 75 -108.06 gain 75 38 -111.10 gain 38 76 -107.86 gain 76 38 -111.93 gain 38 77 -104.57 gain 77 38 -111.60 gain 38 78 -101.89 gain 78 38 -105.83 gain 38 79 -104.52 gain 79 38 -106.39 gain 38 80 -99.70 gain 80 38 -103.09 gain 38 81 -103.55 gain 81 38 -104.90 gain 38 82 -96.86 gain 82 38 -101.06 gain 38 83 -92.77 gain 83 38 -96.76 gain 38 84 -97.39 gain 84 38 -99.18 gain 38 85 -100.34 gain 85 38 -100.41 gain 38 86 -95.36 gain 86 38 -103.81 gain 38 87 -98.99 gain 87 38 -103.10 gain 38 88 -106.46 gain 88 38 -111.11 gain 38 89 -102.59 gain 89 38 -107.49 gain 38 90 -117.00 gain 90 38 -123.29 gain 38 91 -111.30 gain 91 38 -116.86 gain 38 92 -109.47 gain 92 38 -115.60 gain 38 93 -108.45 gain 93 38 -116.12 gain 38 94 -105.84 gain 94 38 -108.42 gain 38 95 -100.93 gain 95 38 -106.73 gain 38 96 -100.16 gain 96 38 -101.43 gain 38 97 -99.01 gain 97 38 -103.68 gain 38 98 -108.48 gain 98 38 -111.90 gain 38 99 -100.88 gain 99 38 -107.94 gain 38 100 -97.52 gain 100 38 -106.29 gain 38 101 -103.12 gain 101 38 -107.83 gain 38 102 -106.39 gain 102 38 -111.22 gain 38 103 -103.70 gain 103 38 -108.36 gain 38 104 -110.58 gain 104 38 -111.08 gain 38 105 -111.27 gain 105 38 -117.09 gain 38 106 -112.50 gain 106 38 -117.03 gain 38 107 -109.58 gain 107 38 -114.41 gain 38 108 -108.23 gain 108 38 -112.72 gain 38 109 -107.39 gain 109 38 -113.73 gain 38 110 -100.19 gain 110 38 -103.60 gain 38 111 -103.45 gain 111 38 -109.52 gain 38 112 -105.87 gain 112 38 -111.69 gain 38 113 -100.60 gain 113 38 -108.11 gain 38 114 -99.78 gain 114 38 -104.20 gain 38 115 -100.92 gain 115 38 -100.26 gain 38 116 -100.28 gain 116 38 -105.37 gain 38 117 -102.13 gain 117 38 -110.02 gain 38 118 -103.55 gain 118 38 -108.81 gain 38 119 -110.23 gain 119 38 -114.97 gain 38 120 -118.71 gain 120 38 -119.00 gain 38 121 -116.96 gain 121 38 -120.01 gain 38 122 -110.89 gain 122 38 -116.46 gain 38 123 -110.25 gain 123 38 -113.33 gain 38 124 -110.19 gain 124 38 -113.26 gain 38 125 -107.15 gain 125 38 -111.83 gain 38 126 -101.95 gain 126 38 -102.94 gain 38 127 -104.69 gain 127 38 -107.25 gain 38 128 -106.10 gain 128 38 -110.54 gain 38 129 -109.09 gain 129 38 -110.93 gain 38 130 -109.90 gain 130 38 -114.42 gain 38 131 -105.39 gain 131 38 -107.77 gain 38 132 -106.48 gain 132 38 -111.48 gain 38 133 -106.46 gain 133 38 -109.58 gain 38 134 -112.97 gain 134 38 -115.88 gain 38 135 -109.78 gain 135 38 -114.41 gain 38 136 -103.73 gain 136 38 -109.64 gain 38 137 -106.27 gain 137 38 -109.96 gain 38 138 -102.61 gain 138 38 -102.53 gain 38 139 -105.43 gain 139 38 -107.26 gain 38 140 -108.92 gain 140 38 -116.81 gain 38 141 -102.71 gain 141 38 -105.48 gain 38 142 -103.78 gain 142 38 -111.36 gain 38 143 -99.33 gain 143 38 -102.46 gain 38 144 -119.71 gain 144 38 -123.74 gain 38 145 -104.65 gain 145 38 -108.28 gain 38 146 -108.29 gain 146 38 -109.47 gain 38 147 -112.90 gain 147 38 -117.93 gain 38 148 -108.92 gain 148 38 -112.87 gain 38 149 -119.12 gain 149 38 -122.32 gain 38 150 -107.42 gain 150 38 -115.74 gain 38 151 -111.82 gain 151 38 -113.70 gain 38 152 -106.42 gain 152 38 -110.13 gain 38 153 -113.56 gain 153 38 -119.69 gain 38 154 -108.71 gain 154 38 -110.46 gain 38 155 -103.48 gain 155 38 -109.06 gain 38 156 -108.11 gain 156 38 -111.71 gain 38 157 -106.04 gain 157 38 -111.60 gain 38 158 -111.81 gain 158 38 -117.81 gain 38 159 -103.85 gain 159 38 -103.48 gain 38 160 -106.32 gain 160 38 -108.22 gain 38 161 -106.57 gain 161 38 -111.33 gain 38 162 -120.59 gain 162 38 -122.44 gain 38 163 -108.74 gain 163 38 -107.77 gain 38 164 -113.51 gain 164 38 -114.28 gain 38 165 -111.94 gain 165 38 -115.64 gain 38 166 -113.58 gain 166 38 -119.96 gain 38 167 -108.57 gain 167 38 -114.07 gain 38 168 -112.99 gain 168 38 -119.84 gain 38 169 -110.58 gain 169 38 -109.78 gain 38 170 -103.11 gain 170 38 -112.80 gain 38 171 -110.79 gain 171 38 -116.91 gain 38 172 -110.32 gain 172 38 -109.54 gain 38 173 -110.96 gain 173 38 -114.84 gain 38 174 -106.29 gain 174 38 -109.93 gain 38 175 -108.63 gain 175 38 -111.47 gain 38 176 -109.54 gain 176 38 -112.33 gain 38 177 -112.33 gain 177 38 -116.62 gain 38 178 -115.31 gain 178 38 -120.55 gain 38 179 -117.83 gain 179 38 -124.10 gain 38 180 -119.63 gain 180 38 -121.70 gain 38 181 -113.56 gain 181 38 -120.07 gain 38 182 -107.94 gain 182 38 -110.75 gain 38 183 -111.86 gain 183 38 -115.97 gain 38 184 -107.28 gain 184 38 -113.44 gain 38 185 -111.43 gain 185 38 -113.02 gain 38 186 -114.59 gain 186 38 -115.17 gain 38 187 -114.46 gain 187 38 -119.13 gain 38 188 -107.79 gain 188 38 -115.22 gain 38 189 -111.09 gain 189 38 -117.92 gain 38 190 -121.13 gain 190 38 -123.62 gain 38 191 -110.70 gain 191 38 -116.23 gain 38 192 -110.09 gain 192 38 -112.93 gain 38 193 -108.98 gain 193 38 -115.80 gain 38 194 -117.32 gain 194 38 -123.72 gain 38 195 -118.11 gain 195 38 -122.69 gain 38 196 -112.94 gain 196 38 -116.55 gain 38 197 -114.08 gain 197 38 -120.36 gain 38 198 -112.96 gain 198 38 -123.17 gain 38 199 -111.78 gain 199 38 -113.56 gain 38 200 -108.98 gain 200 38 -107.53 gain 38 201 -105.40 gain 201 38 -107.76 gain 38 202 -113.07 gain 202 38 -116.97 gain 38 203 -107.64 gain 203 38 -108.16 gain 38 204 -111.04 gain 204 38 -118.65 gain 38 205 -112.18 gain 205 38 -117.86 gain 38 206 -112.72 gain 206 38 -116.37 gain 38 207 -114.39 gain 207 38 -118.80 gain 38 208 -107.08 gain 208 38 -111.66 gain 38 209 -112.55 gain 209 38 -113.13 gain 38 210 -116.93 gain 210 38 -124.10 gain 38 211 -111.53 gain 211 38 -114.96 gain 38 212 -109.83 gain 212 38 -110.81 gain 38 213 -116.20 gain 213 38 -122.04 gain 38 214 -110.72 gain 214 38 -112.86 gain 38 215 -113.41 gain 215 38 -116.64 gain 38 216 -118.63 gain 216 38 -122.69 gain 38 217 -114.75 gain 217 38 -122.63 gain 38 218 -117.25 gain 218 38 -117.32 gain 38 219 -108.22 gain 219 38 -111.11 gain 38 220 -102.14 gain 220 38 -101.38 gain 38 221 -118.14 gain 221 38 -121.89 gain 38 222 -120.03 gain 222 38 -125.14 gain 38 223 -102.62 gain 223 38 -109.74 gain 38 224 -112.42 gain 224 38 -120.04 gain 39 40 -85.19 gain 40 39 -86.37 gain 39 41 -91.22 gain 41 39 -94.46 gain 39 42 -93.81 gain 42 39 -94.69 gain 39 43 -104.26 gain 43 39 -103.91 gain 39 44 -107.35 gain 44 39 -110.08 gain 39 45 -106.77 gain 45 39 -110.42 gain 39 46 -106.87 gain 46 39 -110.44 gain 39 47 -117.55 gain 47 39 -119.06 gain 39 48 -113.67 gain 48 39 -119.05 gain 39 49 -107.29 gain 49 39 -111.52 gain 39 50 -97.96 gain 50 39 -98.54 gain 39 51 -103.34 gain 51 39 -102.40 gain 39 52 -97.72 gain 52 39 -104.06 gain 39 53 -83.12 gain 53 39 -83.98 gain 39 54 -80.56 gain 54 39 -84.99 gain 39 55 -89.93 gain 55 39 -89.51 gain 39 56 -90.14 gain 56 39 -94.62 gain 39 57 -102.06 gain 57 39 -103.33 gain 39 58 -98.06 gain 58 39 -101.04 gain 39 59 -104.71 gain 59 39 -110.13 gain 39 60 -114.29 gain 60 39 -116.99 gain 39 61 -113.04 gain 61 39 -117.17 gain 39 62 -113.48 gain 62 39 -117.18 gain 39 63 -114.30 gain 63 39 -119.23 gain 39 64 -97.99 gain 64 39 -97.70 gain 39 65 -100.59 gain 65 39 -98.90 gain 39 66 -102.34 gain 66 39 -103.72 gain 39 67 -98.50 gain 67 39 -98.77 gain 39 68 -93.09 gain 68 39 -100.65 gain 39 69 -89.64 gain 69 39 -90.92 gain 39 70 -91.84 gain 70 39 -94.63 gain 39 71 -97.78 gain 71 39 -100.45 gain 39 72 -96.19 gain 72 39 -96.83 gain 39 73 -105.44 gain 73 39 -106.92 gain 39 74 -105.06 gain 74 39 -108.82 gain 39 75 -114.80 gain 75 39 -116.25 gain 39 76 -105.45 gain 76 39 -107.91 gain 39 77 -103.01 gain 77 39 -108.44 gain 39 78 -108.45 gain 78 39 -110.78 gain 39 79 -111.09 gain 79 39 -111.36 gain 39 80 -107.63 gain 80 39 -109.41 gain 39 81 -100.77 gain 81 39 -100.53 gain 39 82 -96.83 gain 82 39 -99.44 gain 39 83 -102.42 gain 83 39 -104.81 gain 39 84 -100.03 gain 84 39 -100.23 gain 39 85 -96.67 gain 85 39 -95.14 gain 39 86 -101.77 gain 86 39 -108.62 gain 39 87 -101.49 gain 87 39 -103.99 gain 39 88 -107.49 gain 88 39 -110.54 gain 39 89 -105.60 gain 89 39 -108.91 gain 39 90 -102.76 gain 90 39 -107.44 gain 39 91 -102.18 gain 91 39 -106.14 gain 39 92 -106.61 gain 92 39 -111.14 gain 39 93 -105.76 gain 93 39 -111.83 gain 39 94 -105.38 gain 94 39 -106.35 gain 39 95 -106.26 gain 95 39 -110.47 gain 39 96 -101.13 gain 96 39 -100.79 gain 39 97 -99.77 gain 97 39 -102.84 gain 39 98 -98.38 gain 98 39 -100.21 gain 39 99 -100.30 gain 99 39 -105.76 gain 39 100 -106.57 gain 100 39 -113.74 gain 39 101 -101.14 gain 101 39 -104.24 gain 39 102 -103.06 gain 102 39 -106.29 gain 39 103 -105.46 gain 103 39 -108.52 gain 39 104 -112.63 gain 104 39 -111.52 gain 39 105 -111.82 gain 105 39 -116.03 gain 39 106 -107.24 gain 106 39 -110.17 gain 39 107 -113.42 gain 107 39 -116.65 gain 39 108 -116.58 gain 108 39 -119.47 gain 39 109 -107.02 gain 109 39 -111.76 gain 39 110 -107.59 gain 110 39 -109.39 gain 39 111 -100.70 gain 111 39 -105.17 gain 39 112 -96.76 gain 112 39 -100.97 gain 39 113 -101.37 gain 113 39 -107.29 gain 39 114 -101.86 gain 114 39 -104.68 gain 39 115 -109.03 gain 115 39 -106.77 gain 39 116 -102.16 gain 116 39 -105.65 gain 39 117 -112.73 gain 117 39 -119.01 gain 39 118 -102.46 gain 118 39 -106.12 gain 39 119 -113.90 gain 119 39 -117.04 gain 39 120 -116.56 gain 120 39 -115.24 gain 39 121 -115.64 gain 121 39 -117.10 gain 39 122 -109.98 gain 122 39 -113.94 gain 39 123 -117.81 gain 123 39 -119.29 gain 39 124 -115.42 gain 124 39 -116.89 gain 39 125 -104.60 gain 125 39 -107.67 gain 39 126 -113.19 gain 126 39 -112.58 gain 39 127 -109.62 gain 127 39 -110.59 gain 39 128 -105.19 gain 128 39 -108.03 gain 39 129 -105.51 gain 129 39 -105.75 gain 39 130 -110.50 gain 130 39 -113.43 gain 39 131 -113.78 gain 131 39 -114.56 gain 39 132 -106.60 gain 132 39 -110.01 gain 39 133 -107.41 gain 133 39 -108.93 gain 39 134 -103.49 gain 134 39 -104.81 gain 39 135 -109.69 gain 135 39 -112.71 gain 39 136 -116.62 gain 136 39 -120.93 gain 39 137 -112.64 gain 137 39 -114.73 gain 39 138 -112.27 gain 138 39 -110.59 gain 39 139 -105.92 gain 139 39 -106.14 gain 39 140 -109.87 gain 140 39 -116.15 gain 39 141 -107.56 gain 141 39 -108.72 gain 39 142 -100.77 gain 142 39 -106.75 gain 39 143 -107.57 gain 143 39 -109.09 gain 39 144 -103.26 gain 144 39 -105.69 gain 39 145 -111.20 gain 145 39 -113.22 gain 39 146 -108.28 gain 146 39 -107.86 gain 39 147 -109.97 gain 147 39 -113.40 gain 39 148 -104.86 gain 148 39 -107.22 gain 39 149 -111.63 gain 149 39 -113.23 gain 39 150 -110.34 gain 150 39 -117.06 gain 39 151 -115.88 gain 151 39 -116.16 gain 39 152 -108.38 gain 152 39 -110.49 gain 39 153 -110.85 gain 153 39 -115.38 gain 39 154 -112.72 gain 154 39 -112.87 gain 39 155 -114.86 gain 155 39 -118.84 gain 39 156 -106.05 gain 156 39 -108.05 gain 39 157 -110.08 gain 157 39 -114.03 gain 39 158 -111.09 gain 158 39 -115.49 gain 39 159 -109.26 gain 159 39 -107.29 gain 39 160 -110.18 gain 160 39 -110.48 gain 39 161 -114.13 gain 161 39 -117.29 gain 39 162 -111.15 gain 162 39 -111.39 gain 39 163 -115.68 gain 163 39 -113.11 gain 39 164 -112.76 gain 164 39 -111.93 gain 39 165 -115.36 gain 165 39 -117.47 gain 39 166 -111.34 gain 166 39 -116.12 gain 39 167 -118.43 gain 167 39 -122.33 gain 39 168 -111.56 gain 168 39 -116.82 gain 39 169 -117.89 gain 169 39 -115.49 gain 39 170 -106.13 gain 170 39 -114.22 gain 39 171 -116.06 gain 171 39 -120.57 gain 39 172 -104.76 gain 172 39 -102.37 gain 39 173 -112.11 gain 173 39 -114.39 gain 39 174 -115.00 gain 174 39 -117.04 gain 39 175 -116.72 gain 175 39 -117.97 gain 39 176 -112.67 gain 176 39 -113.87 gain 39 177 -114.39 gain 177 39 -117.07 gain 39 178 -115.43 gain 178 39 -119.06 gain 39 179 -113.21 gain 179 39 -117.88 gain 39 180 -110.76 gain 180 39 -111.22 gain 39 181 -109.37 gain 181 39 -114.28 gain 39 182 -110.25 gain 182 39 -111.46 gain 39 183 -116.01 gain 183 39 -118.52 gain 39 184 -114.81 gain 184 39 -119.37 gain 39 185 -114.17 gain 185 39 -114.15 gain 39 186 -112.52 gain 186 39 -111.51 gain 39 187 -105.36 gain 187 39 -108.43 gain 39 188 -117.42 gain 188 39 -123.25 gain 39 189 -110.77 gain 189 39 -116.00 gain 39 190 -113.15 gain 190 39 -114.05 gain 39 191 -116.50 gain 191 39 -120.42 gain 39 192 -116.64 gain 192 39 -117.88 gain 39 193 -116.72 gain 193 39 -121.94 gain 39 194 -113.57 gain 194 39 -118.36 gain 39 195 -117.24 gain 195 39 -120.22 gain 39 196 -116.56 gain 196 39 -118.57 gain 39 197 -113.53 gain 197 39 -118.21 gain 39 198 -113.71 gain 198 39 -122.32 gain 39 199 -109.50 gain 199 39 -109.68 gain 39 200 -115.99 gain 200 39 -112.94 gain 39 201 -119.04 gain 201 39 -119.81 gain 39 202 -114.93 gain 202 39 -117.22 gain 39 203 -109.14 gain 203 39 -108.06 gain 39 204 -112.80 gain 204 39 -118.80 gain 39 205 -113.65 gain 205 39 -117.72 gain 39 206 -114.70 gain 206 39 -116.75 gain 39 207 -117.89 gain 207 39 -120.70 gain 39 208 -115.38 gain 208 39 -118.36 gain 39 209 -116.42 gain 209 39 -115.40 gain 39 210 -113.87 gain 210 39 -119.43 gain 39 211 -116.13 gain 211 39 -117.96 gain 39 212 -118.50 gain 212 39 -117.87 gain 39 213 -113.89 gain 213 39 -118.13 gain 39 214 -118.82 gain 214 39 -119.36 gain 39 215 -115.37 gain 215 39 -117.00 gain 39 216 -127.42 gain 216 39 -129.88 gain 39 217 -115.08 gain 217 39 -121.35 gain 39 218 -116.37 gain 218 39 -114.83 gain 39 219 -111.11 gain 219 39 -112.40 gain 39 220 -112.04 gain 220 39 -109.68 gain 39 221 -113.99 gain 221 39 -116.14 gain 39 222 -109.69 gain 222 39 -113.20 gain 39 223 -120.40 gain 223 39 -125.92 gain 39 224 -114.45 gain 224 39 -120.47 gain 40 41 -87.18 gain 41 40 -89.25 gain 40 42 -93.43 gain 42 40 -93.14 gain 40 43 -99.67 gain 43 40 -98.15 gain 40 44 -97.23 gain 44 40 -98.78 gain 40 45 -116.71 gain 45 40 -119.19 gain 40 46 -111.41 gain 46 40 -113.82 gain 40 47 -111.23 gain 47 40 -111.57 gain 40 48 -114.05 gain 48 40 -118.25 gain 40 49 -109.96 gain 49 40 -113.01 gain 40 50 -101.17 gain 50 40 -100.58 gain 40 51 -96.12 gain 51 40 -94.02 gain 40 52 -102.18 gain 52 40 -107.35 gain 40 53 -94.22 gain 53 40 -93.90 gain 40 54 -82.48 gain 54 40 -85.73 gain 40 55 -84.52 gain 55 40 -82.93 gain 40 56 -91.56 gain 56 40 -94.87 gain 40 57 -92.59 gain 57 40 -92.69 gain 40 58 -98.03 gain 58 40 -99.84 gain 40 59 -103.17 gain 59 40 -107.41 gain 40 60 -116.24 gain 60 40 -117.76 gain 40 61 -109.68 gain 61 40 -112.64 gain 40 62 -113.09 gain 62 40 -115.61 gain 40 63 -102.27 gain 63 40 -106.03 gain 40 64 -110.17 gain 64 40 -108.71 gain 40 65 -98.69 gain 65 40 -95.83 gain 40 66 -107.88 gain 66 40 -108.09 gain 40 67 -103.45 gain 67 40 -102.54 gain 40 68 -101.79 gain 68 40 -108.17 gain 40 69 -90.40 gain 69 40 -90.51 gain 40 70 -96.91 gain 70 40 -98.54 gain 40 71 -87.64 gain 71 40 -89.14 gain 40 72 -98.64 gain 72 40 -98.11 gain 40 73 -98.07 gain 73 40 -98.38 gain 40 74 -101.31 gain 74 40 -103.90 gain 40 75 -112.13 gain 75 40 -112.40 gain 40 76 -104.08 gain 76 40 -105.37 gain 40 77 -108.90 gain 77 40 -113.16 gain 40 78 -108.34 gain 78 40 -109.51 gain 40 79 -109.90 gain 79 40 -109.00 gain 40 80 -102.98 gain 80 40 -103.59 gain 40 81 -101.09 gain 81 40 -99.67 gain 40 82 -104.14 gain 82 40 -105.57 gain 40 83 -103.64 gain 83 40 -104.86 gain 40 84 -94.20 gain 84 40 -93.22 gain 40 85 -101.75 gain 85 40 -99.05 gain 40 86 -97.69 gain 86 40 -103.37 gain 40 87 -101.30 gain 87 40 -102.63 gain 40 88 -100.08 gain 88 40 -101.96 gain 40 89 -102.77 gain 89 40 -104.90 gain 40 90 -114.90 gain 90 40 -118.41 gain 40 91 -116.58 gain 91 40 -119.37 gain 40 92 -116.11 gain 92 40 -119.47 gain 40 93 -109.16 gain 93 40 -114.06 gain 40 94 -107.41 gain 94 40 -107.21 gain 40 95 -97.98 gain 95 40 -101.01 gain 40 96 -106.50 gain 96 40 -104.99 gain 40 97 -104.02 gain 97 40 -105.92 gain 40 98 -108.13 gain 98 40 -108.79 gain 40 99 -103.15 gain 99 40 -107.44 gain 40 100 -97.12 gain 100 40 -103.13 gain 40 101 -95.40 gain 101 40 -97.33 gain 40 102 -97.50 gain 102 40 -99.56 gain 40 103 -101.15 gain 103 40 -103.04 gain 40 104 -104.47 gain 104 40 -102.19 gain 40 105 -115.15 gain 105 40 -118.19 gain 40 106 -116.22 gain 106 40 -117.98 gain 40 107 -114.70 gain 107 40 -116.76 gain 40 108 -117.13 gain 108 40 -118.85 gain 40 109 -110.23 gain 109 40 -113.80 gain 40 110 -109.23 gain 110 40 -109.86 gain 40 111 -109.87 gain 111 40 -113.17 gain 40 112 -100.93 gain 112 40 -103.98 gain 40 113 -102.60 gain 113 40 -107.34 gain 40 114 -107.68 gain 114 40 -109.33 gain 40 115 -102.42 gain 115 40 -99.00 gain 40 116 -105.46 gain 116 40 -107.77 gain 40 117 -108.69 gain 117 40 -113.80 gain 40 118 -107.18 gain 118 40 -109.67 gain 40 119 -105.17 gain 119 40 -107.14 gain 40 120 -118.67 gain 120 40 -116.18 gain 40 121 -117.64 gain 121 40 -117.92 gain 40 122 -106.49 gain 122 40 -109.28 gain 40 123 -119.36 gain 123 40 -119.66 gain 40 124 -114.65 gain 124 40 -114.95 gain 40 125 -117.09 gain 125 40 -119.00 gain 40 126 -108.72 gain 126 40 -106.94 gain 40 127 -108.16 gain 127 40 -107.95 gain 40 128 -106.29 gain 128 40 -107.95 gain 40 129 -104.04 gain 129 40 -103.11 gain 40 130 -107.50 gain 130 40 -109.25 gain 40 131 -109.87 gain 131 40 -109.49 gain 40 132 -110.80 gain 132 40 -113.03 gain 40 133 -108.79 gain 133 40 -109.13 gain 40 134 -113.00 gain 134 40 -113.14 gain 40 135 -115.34 gain 135 40 -117.19 gain 40 136 -116.42 gain 136 40 -119.56 gain 40 137 -109.61 gain 137 40 -110.53 gain 40 138 -119.01 gain 138 40 -116.17 gain 40 139 -113.30 gain 139 40 -112.36 gain 40 140 -107.37 gain 140 40 -112.48 gain 40 141 -107.12 gain 141 40 -107.12 gain 40 142 -109.28 gain 142 40 -114.09 gain 40 143 -98.26 gain 143 40 -98.61 gain 40 144 -107.89 gain 144 40 -109.14 gain 40 145 -110.63 gain 145 40 -111.48 gain 40 146 -113.31 gain 146 40 -111.71 gain 40 147 -110.01 gain 147 40 -112.27 gain 40 148 -109.59 gain 148 40 -110.78 gain 40 149 -117.46 gain 149 40 -117.89 gain 40 150 -114.26 gain 150 40 -119.80 gain 40 151 -117.08 gain 151 40 -116.19 gain 40 152 -120.54 gain 152 40 -121.48 gain 40 153 -118.28 gain 153 40 -121.64 gain 40 154 -107.55 gain 154 40 -106.53 gain 40 155 -113.10 gain 155 40 -115.91 gain 40 156 -108.15 gain 156 40 -108.97 gain 40 157 -116.06 gain 157 40 -118.85 gain 40 158 -108.06 gain 158 40 -111.29 gain 40 159 -114.67 gain 159 40 -111.53 gain 40 160 -110.18 gain 160 40 -109.31 gain 40 161 -117.89 gain 161 40 -119.88 gain 40 162 -110.29 gain 162 40 -109.36 gain 40 163 -113.22 gain 163 40 -109.48 gain 40 164 -110.79 gain 164 40 -108.79 gain 40 165 -116.87 gain 165 40 -117.81 gain 40 166 -119.04 gain 166 40 -122.65 gain 40 167 -120.39 gain 167 40 -123.13 gain 40 168 -120.81 gain 168 40 -124.89 gain 40 169 -116.26 gain 169 40 -112.69 gain 40 170 -116.86 gain 170 40 -123.78 gain 40 171 -111.90 gain 171 40 -115.24 gain 40 172 -111.80 gain 172 40 -108.25 gain 40 173 -115.76 gain 173 40 -116.87 gain 40 174 -114.26 gain 174 40 -115.12 gain 40 175 -114.29 gain 175 40 -114.36 gain 40 176 -112.40 gain 176 40 -112.43 gain 40 177 -115.63 gain 177 40 -117.15 gain 40 178 -114.34 gain 178 40 -116.81 gain 40 179 -116.21 gain 179 40 -119.70 gain 40 180 -123.85 gain 180 40 -123.15 gain 40 181 -112.81 gain 181 40 -116.54 gain 40 182 -124.11 gain 182 40 -124.15 gain 40 183 -114.64 gain 183 40 -115.97 gain 40 184 -114.31 gain 184 40 -117.69 gain 40 185 -113.79 gain 185 40 -112.60 gain 40 186 -111.88 gain 186 40 -109.69 gain 40 187 -125.73 gain 187 40 -127.63 gain 40 188 -109.95 gain 188 40 -114.61 gain 40 189 -108.49 gain 189 40 -112.55 gain 40 190 -107.62 gain 190 40 -107.34 gain 40 191 -112.91 gain 191 40 -115.66 gain 40 192 -117.12 gain 192 40 -117.19 gain 40 193 -112.92 gain 193 40 -116.97 gain 40 194 -119.74 gain 194 40 -123.36 gain 40 195 -114.99 gain 195 40 -116.80 gain 40 196 -119.36 gain 196 40 -120.19 gain 40 197 -116.93 gain 197 40 -120.43 gain 40 198 -122.14 gain 198 40 -129.58 gain 40 199 -121.46 gain 199 40 -120.46 gain 40 200 -123.23 gain 200 40 -119.01 gain 40 201 -115.99 gain 201 40 -115.58 gain 40 202 -113.18 gain 202 40 -114.30 gain 40 203 -112.39 gain 203 40 -110.14 gain 40 204 -119.48 gain 204 40 -124.31 gain 40 205 -113.99 gain 205 40 -116.88 gain 40 206 -120.18 gain 206 40 -121.06 gain 40 207 -113.64 gain 207 40 -115.28 gain 40 208 -114.05 gain 208 40 -115.86 gain 40 209 -120.99 gain 209 40 -118.80 gain 40 210 -123.64 gain 210 40 -128.04 gain 40 211 -118.34 gain 211 40 -118.99 gain 40 212 -113.20 gain 212 40 -111.41 gain 40 213 -119.93 gain 213 40 -123.00 gain 40 214 -112.61 gain 214 40 -111.98 gain 40 215 -121.99 gain 215 40 -122.45 gain 40 216 -116.18 gain 216 40 -117.47 gain 40 217 -114.42 gain 217 40 -119.52 gain 40 218 -116.32 gain 218 40 -113.61 gain 40 219 -121.17 gain 219 40 -121.29 gain 40 220 -122.29 gain 220 40 -118.75 gain 40 221 -111.76 gain 221 40 -112.73 gain 40 222 -116.38 gain 222 40 -118.72 gain 40 223 -117.62 gain 223 40 -121.97 gain 40 224 -124.76 gain 224 40 -129.61 gain 41 42 -81.33 gain 42 41 -78.96 gain 41 43 -90.87 gain 43 41 -87.27 gain 41 44 -107.26 gain 44 41 -106.74 gain 41 45 -115.20 gain 45 41 -115.61 gain 41 46 -112.10 gain 46 41 -112.43 gain 41 47 -117.47 gain 47 41 -115.73 gain 41 48 -112.84 gain 48 41 -114.97 gain 41 49 -103.26 gain 49 41 -104.24 gain 41 50 -104.72 gain 50 41 -102.06 gain 41 51 -115.31 gain 51 41 -111.13 gain 41 52 -112.34 gain 52 41 -115.43 gain 41 53 -99.40 gain 53 41 -97.01 gain 41 54 -97.98 gain 54 41 -99.17 gain 41 55 -90.56 gain 55 41 -86.90 gain 41 56 -86.37 gain 56 41 -87.60 gain 41 57 -91.84 gain 57 41 -89.86 gain 41 58 -96.62 gain 58 41 -96.35 gain 41 59 -103.19 gain 59 41 -105.35 gain 41 60 -114.60 gain 60 41 -114.05 gain 41 61 -120.57 gain 61 41 -121.46 gain 41 62 -121.44 gain 62 41 -121.89 gain 41 63 -119.32 gain 63 41 -121.00 gain 41 64 -110.19 gain 64 41 -106.66 gain 41 65 -113.09 gain 65 41 -108.15 gain 41 66 -109.39 gain 66 41 -107.53 gain 41 67 -100.78 gain 67 41 -97.80 gain 41 68 -96.70 gain 68 41 -101.01 gain 41 69 -101.71 gain 69 41 -99.75 gain 41 70 -91.19 gain 70 41 -90.74 gain 41 71 -91.12 gain 71 41 -90.55 gain 41 72 -97.12 gain 72 41 -94.52 gain 41 73 -103.90 gain 73 41 -102.14 gain 41 74 -98.05 gain 74 41 -98.57 gain 41 75 -114.67 gain 75 41 -112.87 gain 41 76 -113.07 gain 76 41 -112.29 gain 41 77 -112.13 gain 77 41 -114.31 gain 41 78 -108.52 gain 78 41 -107.62 gain 41 79 -115.29 gain 79 41 -112.31 gain 41 80 -109.83 gain 80 41 -108.37 gain 41 81 -112.25 gain 81 41 -108.76 gain 41 82 -107.52 gain 82 41 -106.88 gain 41 83 -107.06 gain 83 41 -106.20 gain 41 84 -99.40 gain 84 41 -96.35 gain 41 85 -99.68 gain 85 41 -94.91 gain 41 86 -101.65 gain 86 41 -105.26 gain 41 87 -94.19 gain 87 41 -93.46 gain 41 88 -104.45 gain 88 41 -104.25 gain 41 89 -105.59 gain 89 41 -105.65 gain 41 90 -120.19 gain 90 41 -121.63 gain 41 91 -117.13 gain 91 41 -117.85 gain 41 92 -112.25 gain 92 41 -113.54 gain 41 93 -114.41 gain 93 41 -117.24 gain 41 94 -112.45 gain 94 41 -110.18 gain 41 95 -108.06 gain 95 41 -109.02 gain 41 96 -112.81 gain 96 41 -109.23 gain 41 97 -108.70 gain 97 41 -108.53 gain 41 98 -108.60 gain 98 41 -107.18 gain 41 99 -107.12 gain 99 41 -109.34 gain 41 100 -114.19 gain 100 41 -118.12 gain 41 101 -108.33 gain 101 41 -108.19 gain 41 102 -99.09 gain 102 41 -99.07 gain 41 103 -106.62 gain 103 41 -106.44 gain 41 104 -110.95 gain 104 41 -106.59 gain 41 105 -119.85 gain 105 41 -120.82 gain 41 106 -126.98 gain 106 41 -126.66 gain 41 107 -114.95 gain 107 41 -114.93 gain 41 108 -115.83 gain 108 41 -115.47 gain 41 109 -120.16 gain 109 41 -121.66 gain 41 110 -120.80 gain 110 41 -119.36 gain 41 111 -117.94 gain 111 41 -119.16 gain 41 112 -111.93 gain 112 41 -112.90 gain 41 113 -115.74 gain 113 41 -118.41 gain 41 114 -112.17 gain 114 41 -111.74 gain 41 115 -109.73 gain 115 41 -104.22 gain 41 116 -110.38 gain 116 41 -110.62 gain 41 117 -107.46 gain 117 41 -110.50 gain 41 118 -102.76 gain 118 41 -103.17 gain 41 119 -112.60 gain 119 41 -112.49 gain 41 120 -118.16 gain 120 41 -113.59 gain 41 121 -118.28 gain 121 41 -116.49 gain 41 122 -113.98 gain 122 41 -114.70 gain 41 123 -116.74 gain 123 41 -114.98 gain 41 124 -116.33 gain 124 41 -114.55 gain 41 125 -116.28 gain 125 41 -116.11 gain 41 126 -117.06 gain 126 41 -113.21 gain 41 127 -108.24 gain 127 41 -105.96 gain 41 128 -111.83 gain 128 41 -111.42 gain 41 129 -108.02 gain 129 41 -105.02 gain 41 130 -113.36 gain 130 41 -113.04 gain 41 131 -114.38 gain 131 41 -111.92 gain 41 132 -104.88 gain 132 41 -105.04 gain 41 133 -106.10 gain 133 41 -104.37 gain 41 134 -110.41 gain 134 41 -108.47 gain 41 135 -116.32 gain 135 41 -116.09 gain 41 136 -125.35 gain 136 41 -126.42 gain 41 137 -120.05 gain 137 41 -118.89 gain 41 138 -123.51 gain 138 41 -118.58 gain 41 139 -115.35 gain 139 41 -112.33 gain 41 140 -120.66 gain 140 41 -123.69 gain 41 141 -112.10 gain 141 41 -110.03 gain 41 142 -114.41 gain 142 41 -117.15 gain 41 143 -115.11 gain 143 41 -113.39 gain 41 144 -109.67 gain 144 41 -108.85 gain 41 145 -104.91 gain 145 41 -103.69 gain 41 146 -111.38 gain 146 41 -107.71 gain 41 147 -110.70 gain 147 41 -110.88 gain 41 148 -112.16 gain 148 41 -111.27 gain 41 149 -112.86 gain 149 41 -111.22 gain 41 150 -114.31 gain 150 41 -117.78 gain 41 151 -116.84 gain 151 41 -113.88 gain 41 152 -116.61 gain 152 41 -115.47 gain 41 153 -117.86 gain 153 41 -119.15 gain 41 154 -120.80 gain 154 41 -117.70 gain 41 155 -120.28 gain 155 41 -121.02 gain 41 156 -115.88 gain 156 41 -114.64 gain 41 157 -118.24 gain 157 41 -118.96 gain 41 158 -115.79 gain 158 41 -116.94 gain 41 159 -118.49 gain 159 41 -113.28 gain 41 160 -111.75 gain 160 41 -108.80 gain 41 161 -113.91 gain 161 41 -113.83 gain 41 162 -116.93 gain 162 41 -113.93 gain 41 163 -116.60 gain 163 41 -110.78 gain 41 164 -111.54 gain 164 41 -107.47 gain 41 165 -116.85 gain 165 41 -115.71 gain 41 166 -114.79 gain 166 41 -116.32 gain 41 167 -120.22 gain 167 41 -120.88 gain 41 168 -124.32 gain 168 41 -126.32 gain 41 169 -115.42 gain 169 41 -109.77 gain 41 170 -115.59 gain 170 41 -120.44 gain 41 171 -116.57 gain 171 41 -117.84 gain 41 172 -114.47 gain 172 41 -108.84 gain 41 173 -118.92 gain 173 41 -117.95 gain 41 174 -113.69 gain 174 41 -112.48 gain 41 175 -105.97 gain 175 41 -103.97 gain 41 176 -113.64 gain 176 41 -111.59 gain 41 177 -111.86 gain 177 41 -111.30 gain 41 178 -115.96 gain 178 41 -116.35 gain 41 179 -110.77 gain 179 41 -112.19 gain 41 180 -121.15 gain 180 41 -118.37 gain 41 181 -123.08 gain 181 41 -124.74 gain 41 182 -122.63 gain 182 41 -120.59 gain 41 183 -114.53 gain 183 41 -113.79 gain 41 184 -119.24 gain 184 41 -120.55 gain 41 185 -114.55 gain 185 41 -111.29 gain 41 186 -115.09 gain 186 41 -110.83 gain 41 187 -113.29 gain 187 41 -113.12 gain 41 188 -122.05 gain 188 41 -124.63 gain 41 189 -121.51 gain 189 41 -123.49 gain 41 190 -118.95 gain 190 41 -116.60 gain 41 191 -115.20 gain 191 41 -115.88 gain 41 192 -119.18 gain 192 41 -117.18 gain 41 193 -116.57 gain 193 41 -118.54 gain 41 194 -117.48 gain 194 41 -119.03 gain 41 195 -120.10 gain 195 41 -119.83 gain 41 196 -116.96 gain 196 41 -115.72 gain 41 197 -127.94 gain 197 41 -129.37 gain 41 198 -118.30 gain 198 41 -123.66 gain 41 199 -114.40 gain 199 41 -111.33 gain 41 200 -112.77 gain 200 41 -106.47 gain 41 201 -118.09 gain 201 41 -115.61 gain 41 202 -118.68 gain 202 41 -117.72 gain 41 203 -113.01 gain 203 41 -108.69 gain 41 204 -114.58 gain 204 41 -117.34 gain 41 205 -119.75 gain 205 41 -120.58 gain 41 206 -112.82 gain 206 41 -111.62 gain 41 207 -118.09 gain 207 41 -117.65 gain 41 208 -113.36 gain 208 41 -113.10 gain 41 209 -120.03 gain 209 41 -115.77 gain 41 210 -119.37 gain 210 41 -121.70 gain 41 211 -130.12 gain 211 41 -128.70 gain 41 212 -122.44 gain 212 41 -118.57 gain 41 213 -120.66 gain 213 41 -121.65 gain 41 214 -112.88 gain 214 41 -110.17 gain 41 215 -122.28 gain 215 41 -120.66 gain 41 216 -127.76 gain 216 41 -126.98 gain 41 217 -116.72 gain 217 41 -119.76 gain 41 218 -118.96 gain 218 41 -114.18 gain 41 219 -116.64 gain 219 41 -114.68 gain 41 220 -117.79 gain 220 41 -112.19 gain 41 221 -121.94 gain 221 41 -120.83 gain 41 222 -118.28 gain 222 41 -118.54 gain 41 223 -121.95 gain 223 41 -124.23 gain 41 224 -126.58 gain 224 41 -129.36 gain 42 43 -90.43 gain 43 42 -89.20 gain 42 44 -86.61 gain 44 42 -88.46 gain 42 45 -119.39 gain 45 42 -122.17 gain 42 46 -121.17 gain 46 42 -123.87 gain 42 47 -113.44 gain 47 42 -114.07 gain 42 48 -111.10 gain 48 42 -115.60 gain 42 49 -107.22 gain 49 42 -110.57 gain 42 50 -106.36 gain 50 42 -106.07 gain 42 51 -102.51 gain 51 42 -100.70 gain 42 52 -100.59 gain 52 42 -106.05 gain 42 53 -97.54 gain 53 42 -97.51 gain 42 54 -102.34 gain 54 42 -105.89 gain 42 55 -91.26 gain 55 42 -89.96 gain 42 56 -89.44 gain 56 42 -93.04 gain 42 57 -89.67 gain 57 42 -90.06 gain 42 58 -88.47 gain 58 42 -90.56 gain 42 59 -97.04 gain 59 42 -101.57 gain 42 60 -114.17 gain 60 42 -115.99 gain 42 61 -116.27 gain 61 42 -119.53 gain 42 62 -118.81 gain 62 42 -121.62 gain 42 63 -109.85 gain 63 42 -113.90 gain 42 64 -117.01 gain 64 42 -115.84 gain 42 65 -115.05 gain 65 42 -112.48 gain 42 66 -108.86 gain 66 42 -109.36 gain 42 67 -103.84 gain 67 42 -103.22 gain 42 68 -99.32 gain 68 42 -106.00 gain 42 69 -93.64 gain 69 42 -94.04 gain 42 70 -92.49 gain 70 42 -94.41 gain 42 71 -95.33 gain 71 42 -97.12 gain 42 72 -94.43 gain 72 42 -94.20 gain 42 73 -88.30 gain 73 42 -88.90 gain 42 74 -96.40 gain 74 42 -99.29 gain 42 75 -116.97 gain 75 42 -117.53 gain 42 76 -115.27 gain 76 42 -116.86 gain 42 77 -111.36 gain 77 42 -115.91 gain 42 78 -111.87 gain 78 42 -113.33 gain 42 79 -107.75 gain 79 42 -107.14 gain 42 80 -103.68 gain 80 42 -104.59 gain 42 81 -101.86 gain 81 42 -100.73 gain 42 82 -111.33 gain 82 42 -113.06 gain 42 83 -107.12 gain 83 42 -108.63 gain 42 84 -104.13 gain 84 42 -103.45 gain 42 85 -98.36 gain 85 42 -95.95 gain 42 86 -90.70 gain 86 42 -96.68 gain 42 87 -90.23 gain 87 42 -91.86 gain 42 88 -98.48 gain 88 42 -100.65 gain 42 89 -101.31 gain 89 42 -103.73 gain 42 90 -121.13 gain 90 42 -124.93 gain 42 91 -107.01 gain 91 42 -110.10 gain 42 92 -114.35 gain 92 42 -118.00 gain 42 93 -112.85 gain 93 42 -118.04 gain 42 94 -110.60 gain 94 42 -110.69 gain 42 95 -114.96 gain 95 42 -118.28 gain 42 96 -104.53 gain 96 42 -103.32 gain 42 97 -111.09 gain 97 42 -113.29 gain 42 98 -100.12 gain 98 42 -101.07 gain 42 99 -102.50 gain 99 42 -107.08 gain 42 100 -101.99 gain 100 42 -108.28 gain 42 101 -105.28 gain 101 42 -107.50 gain 42 102 -100.19 gain 102 42 -102.54 gain 42 103 -101.82 gain 103 42 -104.01 gain 42 104 -100.61 gain 104 42 -98.62 gain 42 105 -119.46 gain 105 42 -122.79 gain 42 106 -115.58 gain 106 42 -117.63 gain 42 107 -111.54 gain 107 42 -113.89 gain 42 108 -119.47 gain 108 42 -121.48 gain 42 109 -109.37 gain 109 42 -113.23 gain 42 110 -119.92 gain 110 42 -120.85 gain 42 111 -111.79 gain 111 42 -115.38 gain 42 112 -107.13 gain 112 42 -110.47 gain 42 113 -109.97 gain 113 42 -115.00 gain 42 114 -108.11 gain 114 42 -110.05 gain 42 115 -106.10 gain 115 42 -102.96 gain 42 116 -114.95 gain 116 42 -117.55 gain 42 117 -100.63 gain 117 42 -106.03 gain 42 118 -106.38 gain 118 42 -109.16 gain 42 119 -101.34 gain 119 42 -103.60 gain 42 120 -118.56 gain 120 42 -116.36 gain 42 121 -120.62 gain 121 42 -121.19 gain 42 122 -115.55 gain 122 42 -118.63 gain 42 123 -112.25 gain 123 42 -112.85 gain 42 124 -117.43 gain 124 42 -118.03 gain 42 125 -105.47 gain 125 42 -107.66 gain 42 126 -112.95 gain 126 42 -111.47 gain 42 127 -111.36 gain 127 42 -111.45 gain 42 128 -111.62 gain 128 42 -113.57 gain 42 129 -104.92 gain 129 42 -104.29 gain 42 130 -106.07 gain 130 42 -108.12 gain 42 131 -112.47 gain 131 42 -112.38 gain 42 132 -111.26 gain 132 42 -113.79 gain 42 133 -112.49 gain 133 42 -113.13 gain 42 134 -106.55 gain 134 42 -106.98 gain 42 135 -115.11 gain 135 42 -117.25 gain 42 136 -112.03 gain 136 42 -115.46 gain 42 137 -124.04 gain 137 42 -125.25 gain 42 138 -107.58 gain 138 42 -105.02 gain 42 139 -119.96 gain 139 42 -119.30 gain 42 140 -108.52 gain 140 42 -113.92 gain 42 141 -108.71 gain 141 42 -109.00 gain 42 142 -115.56 gain 142 42 -120.66 gain 42 143 -108.61 gain 143 42 -109.26 gain 42 144 -109.88 gain 144 42 -111.43 gain 42 145 -103.80 gain 145 42 -104.95 gain 42 146 -105.75 gain 146 42 -104.44 gain 42 147 -103.43 gain 147 42 -105.98 gain 42 148 -102.15 gain 148 42 -103.63 gain 42 149 -116.01 gain 149 42 -116.73 gain 42 150 -121.13 gain 150 42 -126.96 gain 42 151 -122.13 gain 151 42 -121.53 gain 42 152 -110.60 gain 152 42 -111.83 gain 42 153 -122.98 gain 153 42 -126.64 gain 42 154 -114.48 gain 154 42 -113.75 gain 42 155 -116.83 gain 155 42 -119.93 gain 42 156 -107.93 gain 156 42 -109.05 gain 42 157 -110.95 gain 157 42 -114.02 gain 42 158 -116.43 gain 158 42 -119.94 gain 42 159 -111.86 gain 159 42 -109.01 gain 42 160 -107.38 gain 160 42 -106.80 gain 42 161 -115.54 gain 161 42 -117.82 gain 42 162 -116.53 gain 162 42 -115.89 gain 42 163 -113.98 gain 163 42 -110.53 gain 42 164 -117.46 gain 164 42 -115.75 gain 42 165 -120.79 gain 165 42 -122.01 gain 42 166 -116.12 gain 166 42 -120.03 gain 42 167 -112.95 gain 167 42 -115.98 gain 42 168 -119.94 gain 168 42 -124.31 gain 42 169 -110.05 gain 169 42 -106.77 gain 42 170 -109.47 gain 170 42 -116.68 gain 42 171 -112.87 gain 171 42 -116.51 gain 42 172 -117.53 gain 172 42 -114.27 gain 42 173 -114.67 gain 173 42 -116.07 gain 42 174 -112.21 gain 174 42 -113.37 gain 42 175 -112.59 gain 175 42 -112.95 gain 42 176 -116.92 gain 176 42 -117.23 gain 42 177 -112.67 gain 177 42 -114.48 gain 42 178 -110.82 gain 178 42 -113.57 gain 42 179 -116.19 gain 179 42 -119.97 gain 42 180 -111.97 gain 180 42 -111.56 gain 42 181 -117.16 gain 181 42 -121.19 gain 42 182 -116.65 gain 182 42 -116.98 gain 42 183 -119.01 gain 183 42 -120.64 gain 42 184 -112.59 gain 184 42 -116.27 gain 42 185 -116.45 gain 185 42 -115.55 gain 42 186 -114.01 gain 186 42 -112.11 gain 42 187 -112.39 gain 187 42 -114.58 gain 42 188 -112.54 gain 188 42 -117.49 gain 42 189 -119.23 gain 189 42 -123.57 gain 42 190 -114.10 gain 190 42 -114.11 gain 42 191 -112.07 gain 191 42 -115.12 gain 42 192 -112.29 gain 192 42 -112.66 gain 42 193 -106.26 gain 193 42 -110.60 gain 42 194 -121.85 gain 194 42 -125.76 gain 42 195 -116.21 gain 195 42 -118.31 gain 42 196 -121.45 gain 196 42 -122.57 gain 42 197 -117.20 gain 197 42 -121.00 gain 42 198 -119.54 gain 198 42 -127.28 gain 42 199 -119.38 gain 199 42 -118.67 gain 42 200 -118.00 gain 200 42 -114.07 gain 42 201 -114.60 gain 201 42 -114.48 gain 42 202 -111.33 gain 202 42 -112.75 gain 42 203 -115.31 gain 203 42 -113.35 gain 42 204 -113.30 gain 204 42 -118.43 gain 42 205 -118.36 gain 205 42 -121.55 gain 42 206 -115.93 gain 206 42 -117.10 gain 42 207 -113.83 gain 207 42 -115.76 gain 42 208 -112.33 gain 208 42 -114.43 gain 42 209 -119.85 gain 209 42 -117.95 gain 42 210 -120.15 gain 210 42 -124.84 gain 42 211 -119.30 gain 211 42 -120.25 gain 42 212 -119.27 gain 212 42 -117.76 gain 42 213 -111.33 gain 213 42 -114.69 gain 42 214 -118.66 gain 214 42 -118.32 gain 42 215 -119.92 gain 215 42 -120.67 gain 42 216 -123.06 gain 216 42 -124.63 gain 42 217 -116.94 gain 217 42 -122.34 gain 42 218 -112.70 gain 218 42 -110.29 gain 42 219 -113.85 gain 219 42 -114.26 gain 42 220 -115.54 gain 220 42 -112.30 gain 42 221 -110.80 gain 221 42 -112.06 gain 42 222 -114.70 gain 222 42 -117.33 gain 42 223 -111.60 gain 223 42 -116.24 gain 42 224 -111.24 gain 224 42 -116.38 gain 43 44 -78.48 gain 44 43 -81.56 gain 43 45 -118.57 gain 45 43 -122.57 gain 43 46 -115.44 gain 46 43 -119.37 gain 43 47 -112.15 gain 47 43 -114.01 gain 43 48 -109.62 gain 48 43 -115.34 gain 43 49 -107.28 gain 49 43 -111.86 gain 43 50 -113.44 gain 50 43 -114.37 gain 43 51 -116.94 gain 51 43 -116.36 gain 43 52 -105.57 gain 52 43 -112.26 gain 43 53 -101.11 gain 53 43 -102.31 gain 43 54 -101.05 gain 54 43 -105.83 gain 43 55 -100.60 gain 55 43 -100.53 gain 43 56 -92.08 gain 56 43 -96.90 gain 43 57 -84.01 gain 57 43 -85.63 gain 43 58 -74.73 gain 58 43 -78.05 gain 43 59 -84.12 gain 59 43 -89.88 gain 43 60 -119.56 gain 60 43 -122.60 gain 43 61 -119.92 gain 61 43 -124.40 gain 43 62 -119.20 gain 62 43 -123.24 gain 43 63 -112.09 gain 63 43 -117.37 gain 43 64 -111.50 gain 64 43 -111.57 gain 43 65 -108.30 gain 65 43 -106.96 gain 43 66 -110.69 gain 66 43 -112.42 gain 43 67 -100.10 gain 67 43 -100.71 gain 43 68 -103.32 gain 68 43 -111.22 gain 43 69 -103.27 gain 69 43 -104.90 gain 43 70 -96.07 gain 70 43 -99.22 gain 43 71 -95.78 gain 71 43 -98.79 gain 43 72 -88.43 gain 72 43 -89.42 gain 43 73 -92.07 gain 73 43 -93.90 gain 43 74 -91.13 gain 74 43 -95.24 gain 43 75 -122.93 gain 75 43 -124.72 gain 43 76 -119.74 gain 76 43 -122.55 gain 43 77 -116.14 gain 77 43 -121.92 gain 43 78 -113.92 gain 78 43 -116.60 gain 43 79 -115.90 gain 79 43 -116.52 gain 43 80 -107.07 gain 80 43 -109.21 gain 43 81 -105.89 gain 81 43 -105.99 gain 43 82 -114.58 gain 82 43 -117.54 gain 43 83 -107.38 gain 83 43 -110.12 gain 43 84 -99.43 gain 84 43 -99.97 gain 43 85 -96.18 gain 85 43 -95.00 gain 43 86 -101.26 gain 86 43 -108.46 gain 43 87 -97.49 gain 87 43 -100.35 gain 43 88 -93.18 gain 88 43 -96.58 gain 43 89 -99.22 gain 89 43 -102.88 gain 43 90 -111.28 gain 90 43 -116.31 gain 43 91 -111.11 gain 91 43 -115.42 gain 43 92 -115.34 gain 92 43 -120.22 gain 43 93 -114.14 gain 93 43 -120.55 gain 43 94 -103.15 gain 94 43 -104.48 gain 43 95 -112.13 gain 95 43 -116.69 gain 43 96 -114.62 gain 96 43 -114.63 gain 43 97 -108.31 gain 97 43 -111.73 gain 43 98 -100.84 gain 98 43 -103.01 gain 43 99 -104.91 gain 99 43 -110.72 gain 43 100 -99.65 gain 100 43 -107.17 gain 43 101 -97.79 gain 101 43 -101.24 gain 43 102 -92.73 gain 102 43 -96.31 gain 43 103 -100.05 gain 103 43 -103.46 gain 43 104 -99.83 gain 104 43 -99.07 gain 43 105 -114.31 gain 105 43 -118.87 gain 43 106 -120.41 gain 106 43 -123.69 gain 43 107 -113.98 gain 107 43 -117.56 gain 43 108 -110.52 gain 108 43 -113.76 gain 43 109 -115.18 gain 109 43 -120.27 gain 43 110 -113.14 gain 110 43 -115.30 gain 43 111 -107.94 gain 111 43 -112.75 gain 43 112 -106.56 gain 112 43 -111.12 gain 43 113 -109.14 gain 113 43 -115.40 gain 43 114 -108.61 gain 114 43 -111.77 gain 43 115 -107.26 gain 115 43 -105.35 gain 43 116 -101.60 gain 116 43 -105.44 gain 43 117 -102.61 gain 117 43 -109.24 gain 43 118 -101.06 gain 118 43 -105.07 gain 43 119 -102.34 gain 119 43 -105.82 gain 43 120 -117.26 gain 120 43 -116.28 gain 43 121 -119.40 gain 121 43 -121.21 gain 43 122 -112.18 gain 122 43 -116.49 gain 43 123 -116.46 gain 123 43 -118.29 gain 43 124 -114.91 gain 124 43 -116.73 gain 43 125 -107.43 gain 125 43 -110.85 gain 43 126 -111.57 gain 126 43 -111.31 gain 43 127 -108.70 gain 127 43 -110.02 gain 43 128 -102.73 gain 128 43 -105.92 gain 43 129 -112.10 gain 129 43 -112.69 gain 43 130 -101.70 gain 130 43 -104.97 gain 43 131 -108.83 gain 131 43 -109.97 gain 43 132 -111.03 gain 132 43 -114.78 gain 43 133 -102.48 gain 133 43 -104.34 gain 43 134 -99.89 gain 134 43 -101.55 gain 43 135 -120.84 gain 135 43 -124.21 gain 43 136 -116.85 gain 136 43 -121.51 gain 43 137 -118.97 gain 137 43 -121.41 gain 43 138 -117.57 gain 138 43 -116.24 gain 43 139 -109.84 gain 139 43 -110.41 gain 43 140 -111.05 gain 140 43 -117.68 gain 43 141 -105.91 gain 141 43 -107.43 gain 43 142 -110.79 gain 142 43 -117.12 gain 43 143 -110.43 gain 143 43 -112.30 gain 43 144 -107.14 gain 144 43 -109.91 gain 43 145 -110.80 gain 145 43 -113.17 gain 43 146 -110.36 gain 146 43 -110.28 gain 43 147 -110.41 gain 147 43 -114.19 gain 43 148 -108.22 gain 148 43 -110.92 gain 43 149 -110.40 gain 149 43 -112.36 gain 43 150 -122.34 gain 150 43 -129.40 gain 43 151 -115.97 gain 151 43 -116.60 gain 43 152 -115.71 gain 152 43 -118.17 gain 43 153 -117.29 gain 153 43 -122.18 gain 43 154 -110.66 gain 154 43 -111.16 gain 43 155 -106.93 gain 155 43 -111.26 gain 43 156 -114.27 gain 156 43 -116.62 gain 43 157 -110.70 gain 157 43 -115.00 gain 43 158 -106.99 gain 158 43 -111.73 gain 43 159 -114.69 gain 159 43 -113.07 gain 43 160 -107.05 gain 160 43 -107.70 gain 43 161 -108.13 gain 161 43 -111.64 gain 43 162 -102.76 gain 162 43 -103.35 gain 43 163 -107.44 gain 163 43 -105.22 gain 43 164 -109.76 gain 164 43 -109.29 gain 43 165 -116.01 gain 165 43 -118.46 gain 43 166 -119.75 gain 166 43 -124.88 gain 43 167 -116.62 gain 167 43 -120.87 gain 43 168 -116.89 gain 168 43 -122.49 gain 43 169 -110.93 gain 169 43 -108.88 gain 43 170 -118.92 gain 170 43 -127.36 gain 43 171 -109.11 gain 171 43 -113.97 gain 43 172 -116.33 gain 172 43 -114.29 gain 43 173 -109.80 gain 173 43 -112.42 gain 43 174 -115.73 gain 174 43 -118.12 gain 43 175 -110.51 gain 175 43 -112.10 gain 43 176 -111.58 gain 176 43 -113.12 gain 43 177 -109.55 gain 177 43 -112.59 gain 43 178 -112.66 gain 178 43 -116.64 gain 43 179 -109.00 gain 179 43 -114.01 gain 43 180 -118.05 gain 180 43 -118.86 gain 43 181 -117.10 gain 181 43 -122.35 gain 43 182 -111.58 gain 182 43 -113.14 gain 43 183 -123.05 gain 183 43 -125.90 gain 43 184 -115.75 gain 184 43 -120.65 gain 43 185 -117.47 gain 185 43 -117.80 gain 43 186 -109.07 gain 186 43 -108.40 gain 43 187 -120.37 gain 187 43 -123.79 gain 43 188 -111.33 gain 188 43 -117.50 gain 43 189 -115.93 gain 189 43 -121.50 gain 43 190 -114.35 gain 190 43 -115.59 gain 43 191 -115.51 gain 191 43 -119.78 gain 43 192 -115.54 gain 192 43 -117.13 gain 43 193 -115.07 gain 193 43 -120.64 gain 43 194 -116.45 gain 194 43 -121.59 gain 43 195 -116.73 gain 195 43 -120.05 gain 43 196 -113.14 gain 196 43 -115.50 gain 43 197 -118.86 gain 197 43 -123.88 gain 43 198 -115.83 gain 198 43 -124.79 gain 43 199 -117.41 gain 199 43 -117.94 gain 43 200 -111.71 gain 200 43 -109.01 gain 43 201 -108.21 gain 201 43 -109.32 gain 43 202 -116.09 gain 202 43 -118.73 gain 43 203 -115.30 gain 203 43 -114.57 gain 43 204 -119.80 gain 204 43 -126.15 gain 43 205 -117.57 gain 205 43 -121.98 gain 43 206 -113.15 gain 206 43 -115.55 gain 43 207 -113.45 gain 207 43 -116.60 gain 43 208 -113.71 gain 208 43 -117.04 gain 43 209 -116.71 gain 209 43 -116.04 gain 43 210 -121.89 gain 210 43 -127.81 gain 43 211 -122.74 gain 211 43 -124.91 gain 43 212 -117.83 gain 212 43 -117.56 gain 43 213 -114.87 gain 213 43 -119.46 gain 43 214 -119.07 gain 214 43 -119.97 gain 43 215 -117.40 gain 215 43 -119.38 gain 43 216 -117.94 gain 216 43 -120.74 gain 43 217 -111.40 gain 217 43 -118.03 gain 43 218 -120.04 gain 218 43 -118.86 gain 43 219 -112.35 gain 219 43 -113.98 gain 43 220 -120.63 gain 220 43 -118.61 gain 43 221 -116.44 gain 221 43 -118.93 gain 43 222 -120.34 gain 222 43 -124.20 gain 43 223 -119.61 gain 223 43 -125.48 gain 43 224 -116.54 gain 224 43 -122.91 gain 44 45 -120.03 gain 45 44 -120.96 gain 44 46 -119.12 gain 46 44 -119.97 gain 44 47 -116.85 gain 47 44 -115.63 gain 44 48 -115.17 gain 48 44 -117.82 gain 44 49 -112.50 gain 49 44 -114.00 gain 44 50 -118.47 gain 50 44 -116.33 gain 44 51 -116.92 gain 51 44 -113.25 gain 44 52 -107.18 gain 52 44 -110.80 gain 44 53 -103.91 gain 53 44 -102.04 gain 44 54 -108.05 gain 54 44 -109.76 gain 44 55 -107.41 gain 55 44 -104.26 gain 44 56 -99.93 gain 56 44 -101.68 gain 44 57 -101.16 gain 57 44 -99.71 gain 44 58 -86.83 gain 58 44 -87.08 gain 44 59 -85.55 gain 59 44 -88.23 gain 44 60 -122.99 gain 60 44 -122.96 gain 44 61 -118.67 gain 61 44 -120.08 gain 44 62 -124.00 gain 62 44 -124.97 gain 44 63 -113.14 gain 63 44 -115.34 gain 44 64 -115.33 gain 64 44 -112.32 gain 44 65 -108.61 gain 65 44 -104.20 gain 44 66 -107.88 gain 66 44 -106.54 gain 44 67 -107.79 gain 67 44 -105.33 gain 44 68 -114.02 gain 68 44 -118.85 gain 44 69 -113.65 gain 69 44 -112.20 gain 44 70 -104.24 gain 70 44 -104.31 gain 44 71 -105.57 gain 71 44 -105.51 gain 44 72 -98.27 gain 72 44 -96.18 gain 44 73 -91.85 gain 73 44 -90.61 gain 44 74 -97.50 gain 74 44 -98.54 gain 44 75 -125.27 gain 75 44 -123.99 gain 44 76 -123.54 gain 76 44 -123.28 gain 44 77 -123.46 gain 77 44 -126.17 gain 44 78 -124.61 gain 78 44 -124.22 gain 44 79 -112.75 gain 79 44 -110.29 gain 44 80 -118.29 gain 80 44 -117.35 gain 44 81 -116.69 gain 81 44 -113.72 gain 44 82 -109.22 gain 82 44 -109.09 gain 44 83 -114.70 gain 83 44 -114.36 gain 44 84 -110.90 gain 84 44 -108.36 gain 44 85 -107.56 gain 85 44 -103.30 gain 44 86 -104.55 gain 86 44 -108.68 gain 44 87 -98.68 gain 87 44 -98.46 gain 44 88 -93.89 gain 88 44 -94.21 gain 44 89 -102.70 gain 89 44 -103.28 gain 44 90 -117.65 gain 90 44 -119.61 gain 44 91 -128.74 gain 91 44 -129.98 gain 44 92 -121.52 gain 92 44 -123.33 gain 44 93 -115.03 gain 93 44 -118.37 gain 44 94 -115.32 gain 94 44 -113.57 gain 44 95 -116.82 gain 95 44 -118.29 gain 44 96 -107.77 gain 96 44 -104.71 gain 44 97 -113.81 gain 97 44 -114.16 gain 44 98 -115.97 gain 98 44 -115.07 gain 44 99 -105.49 gain 99 44 -108.22 gain 44 100 -107.33 gain 100 44 -111.78 gain 44 101 -99.92 gain 101 44 -100.29 gain 44 102 -101.07 gain 102 44 -101.58 gain 44 103 -103.88 gain 103 44 -104.22 gain 44 104 -107.97 gain 104 44 -104.13 gain 44 105 -119.69 gain 105 44 -121.18 gain 44 106 -116.71 gain 106 44 -116.92 gain 44 107 -116.70 gain 107 44 -117.20 gain 44 108 -119.50 gain 108 44 -119.66 gain 44 109 -118.04 gain 109 44 -120.06 gain 44 110 -114.59 gain 110 44 -113.67 gain 44 111 -116.14 gain 111 44 -117.89 gain 44 112 -113.41 gain 112 44 -114.90 gain 44 113 -113.53 gain 113 44 -116.72 gain 44 114 -111.09 gain 114 44 -111.18 gain 44 115 -104.78 gain 115 44 -99.79 gain 44 116 -109.92 gain 116 44 -110.68 gain 44 117 -112.64 gain 117 44 -116.20 gain 44 118 -98.49 gain 118 44 -99.42 gain 44 119 -100.46 gain 119 44 -100.87 gain 44 120 -115.06 gain 120 44 -111.02 gain 44 121 -120.22 gain 121 44 -118.95 gain 44 122 -121.61 gain 122 44 -122.85 gain 44 123 -115.44 gain 123 44 -114.20 gain 44 124 -115.87 gain 124 44 -114.61 gain 44 125 -114.66 gain 125 44 -115.01 gain 44 126 -116.28 gain 126 44 -112.95 gain 44 127 -113.68 gain 127 44 -111.92 gain 44 128 -112.80 gain 128 44 -112.91 gain 44 129 -113.33 gain 129 44 -110.85 gain 44 130 -113.35 gain 130 44 -113.55 gain 44 131 -115.23 gain 131 44 -113.29 gain 44 132 -110.73 gain 132 44 -111.41 gain 44 133 -106.56 gain 133 44 -105.35 gain 44 134 -107.62 gain 134 44 -106.20 gain 44 135 -126.17 gain 135 44 -126.47 gain 44 136 -116.05 gain 136 44 -117.63 gain 44 137 -120.29 gain 137 44 -119.66 gain 44 138 -114.73 gain 138 44 -110.32 gain 44 139 -114.44 gain 139 44 -111.94 gain 44 140 -115.80 gain 140 44 -119.36 gain 44 141 -118.13 gain 141 44 -116.57 gain 44 142 -113.14 gain 142 44 -116.39 gain 44 143 -109.37 gain 143 44 -108.17 gain 44 144 -113.05 gain 144 44 -112.76 gain 44 145 -107.56 gain 145 44 -106.86 gain 44 146 -104.69 gain 146 44 -101.55 gain 44 147 -108.47 gain 147 44 -109.17 gain 44 148 -113.75 gain 148 44 -113.38 gain 44 149 -105.64 gain 149 44 -104.52 gain 44 150 -129.36 gain 150 44 -133.35 gain 44 151 -119.13 gain 151 44 -116.69 gain 44 152 -119.93 gain 152 44 -119.31 gain 44 153 -121.54 gain 153 44 -123.35 gain 44 154 -124.44 gain 154 44 -121.86 gain 44 155 -117.79 gain 155 44 -119.05 gain 44 156 -116.14 gain 156 44 -115.41 gain 44 157 -117.67 gain 157 44 -118.90 gain 44 158 -121.33 gain 158 44 -122.99 gain 44 159 -114.19 gain 159 44 -109.49 gain 44 160 -113.53 gain 160 44 -111.11 gain 44 161 -109.39 gain 161 44 -109.83 gain 44 162 -115.49 gain 162 44 -113.00 gain 44 163 -111.07 gain 163 44 -105.78 gain 44 164 -110.47 gain 164 44 -106.92 gain 44 165 -125.69 gain 165 44 -125.07 gain 44 166 -121.51 gain 166 44 -123.56 gain 44 167 -123.32 gain 167 44 -124.50 gain 44 168 -111.62 gain 168 44 -114.15 gain 44 169 -112.05 gain 169 44 -106.93 gain 44 170 -111.14 gain 170 44 -116.51 gain 44 171 -119.26 gain 171 44 -121.05 gain 44 172 -111.03 gain 172 44 -105.92 gain 44 173 -114.85 gain 173 44 -114.40 gain 44 174 -116.61 gain 174 44 -115.92 gain 44 175 -119.87 gain 175 44 -118.39 gain 44 176 -122.54 gain 176 44 -121.01 gain 44 177 -113.57 gain 177 44 -113.53 gain 44 178 -104.87 gain 178 44 -105.78 gain 44 179 -119.77 gain 179 44 -121.71 gain 44 180 -115.69 gain 180 44 -113.43 gain 44 181 -125.69 gain 181 44 -127.87 gain 44 182 -112.33 gain 182 44 -110.81 gain 44 183 -119.10 gain 183 44 -118.88 gain 44 184 -117.56 gain 184 44 -119.40 gain 44 185 -120.05 gain 185 44 -117.31 gain 44 186 -117.70 gain 186 44 -113.95 gain 44 187 -128.74 gain 187 44 -129.09 gain 44 188 -116.79 gain 188 44 -119.90 gain 44 189 -114.01 gain 189 44 -116.51 gain 44 190 -110.51 gain 190 44 -108.68 gain 44 191 -115.82 gain 191 44 -117.02 gain 44 192 -111.25 gain 192 44 -109.77 gain 44 193 -118.52 gain 193 44 -121.02 gain 44 194 -118.90 gain 194 44 -120.97 gain 44 195 -124.39 gain 195 44 -124.65 gain 44 196 -119.61 gain 196 44 -118.89 gain 44 197 -123.54 gain 197 44 -125.49 gain 44 198 -125.45 gain 198 44 -131.33 gain 44 199 -120.82 gain 199 44 -118.27 gain 44 200 -118.49 gain 200 44 -112.71 gain 44 201 -118.82 gain 201 44 -116.86 gain 44 202 -121.39 gain 202 44 -120.96 gain 44 203 -119.94 gain 203 44 -116.14 gain 44 204 -124.35 gain 204 44 -127.63 gain 44 205 -110.72 gain 205 44 -112.07 gain 44 206 -112.12 gain 206 44 -111.44 gain 44 207 -111.38 gain 207 44 -111.46 gain 44 208 -106.60 gain 208 44 -106.86 gain 44 209 -115.19 gain 209 44 -111.45 gain 44 210 -131.21 gain 210 44 -134.05 gain 44 211 -125.84 gain 211 44 -124.95 gain 44 212 -122.80 gain 212 44 -119.45 gain 44 213 -125.22 gain 213 44 -126.73 gain 44 214 -123.36 gain 214 44 -121.18 gain 44 215 -118.10 gain 215 44 -117.01 gain 44 216 -123.95 gain 216 44 -123.69 gain 44 217 -123.38 gain 217 44 -126.94 gain 44 218 -120.95 gain 218 44 -116.69 gain 44 219 -130.98 gain 219 44 -129.54 gain 44 220 -121.17 gain 220 44 -116.08 gain 44 221 -121.00 gain 221 44 -120.42 gain 44 222 -117.50 gain 222 44 -118.29 gain 44 223 -116.50 gain 223 44 -119.29 gain 44 224 -118.91 gain 224 44 -122.20 gain 45 46 -86.99 gain 46 45 -86.91 gain 45 47 -101.24 gain 47 45 -99.09 gain 45 48 -102.36 gain 48 45 -104.08 gain 45 49 -107.80 gain 49 45 -108.37 gain 45 50 -105.99 gain 50 45 -102.92 gain 45 51 -112.35 gain 51 45 -107.76 gain 45 52 -105.65 gain 52 45 -108.33 gain 45 53 -113.84 gain 53 45 -111.04 gain 45 54 -113.82 gain 54 45 -114.59 gain 45 55 -115.58 gain 55 45 -111.50 gain 45 56 -116.28 gain 56 45 -117.10 gain 45 57 -121.64 gain 57 45 -119.25 gain 45 58 -127.79 gain 58 45 -127.10 gain 45 59 -115.65 gain 59 45 -117.40 gain 45 60 -92.91 gain 60 45 -91.95 gain 45 61 -92.45 gain 61 45 -92.93 gain 45 62 -99.57 gain 62 45 -99.60 gain 45 63 -107.26 gain 63 45 -108.52 gain 45 64 -101.47 gain 64 45 -97.52 gain 45 65 -101.23 gain 65 45 -95.88 gain 45 66 -106.41 gain 66 45 -104.13 gain 45 67 -110.35 gain 67 45 -106.95 gain 45 68 -115.75 gain 68 45 -119.65 gain 45 69 -118.60 gain 69 45 -116.22 gain 45 70 -118.29 gain 70 45 -117.43 gain 45 71 -118.39 gain 71 45 -117.40 gain 45 72 -113.34 gain 72 45 -110.32 gain 45 73 -120.13 gain 73 45 -117.95 gain 45 74 -125.27 gain 74 45 -125.38 gain 45 75 -93.09 gain 75 45 -90.88 gain 45 76 -94.33 gain 76 45 -93.13 gain 45 77 -94.92 gain 77 45 -96.70 gain 45 78 -95.03 gain 78 45 -93.71 gain 45 79 -100.50 gain 79 45 -97.11 gain 45 80 -108.27 gain 80 45 -106.40 gain 45 81 -110.90 gain 81 45 -107.00 gain 45 82 -116.42 gain 82 45 -115.37 gain 45 83 -115.08 gain 83 45 -113.81 gain 45 84 -111.90 gain 84 45 -108.43 gain 45 85 -112.73 gain 85 45 -107.54 gain 45 86 -115.41 gain 86 45 -118.61 gain 45 87 -123.00 gain 87 45 -121.84 gain 45 88 -120.49 gain 88 45 -119.88 gain 45 89 -121.86 gain 89 45 -121.50 gain 45 90 -101.70 gain 90 45 -102.72 gain 45 91 -102.67 gain 91 45 -102.98 gain 45 92 -103.29 gain 92 45 -104.16 gain 45 93 -106.28 gain 93 45 -108.69 gain 45 94 -105.42 gain 94 45 -102.74 gain 45 95 -109.50 gain 95 45 -110.04 gain 45 96 -117.84 gain 96 45 -113.85 gain 45 97 -109.94 gain 97 45 -109.35 gain 45 98 -111.18 gain 98 45 -109.34 gain 45 99 -112.22 gain 99 45 -114.02 gain 45 100 -119.12 gain 100 45 -122.63 gain 45 101 -108.25 gain 101 45 -107.69 gain 45 102 -114.00 gain 102 45 -113.58 gain 45 103 -119.44 gain 103 45 -118.85 gain 45 104 -124.93 gain 104 45 -120.16 gain 45 105 -101.36 gain 105 45 -101.91 gain 45 106 -106.54 gain 106 45 -105.81 gain 45 107 -111.48 gain 107 45 -111.05 gain 45 108 -105.92 gain 108 45 -105.15 gain 45 109 -112.33 gain 109 45 -113.41 gain 45 110 -103.88 gain 110 45 -102.03 gain 45 111 -109.03 gain 111 45 -109.84 gain 45 112 -108.56 gain 112 45 -109.12 gain 45 113 -121.24 gain 113 45 -123.50 gain 45 114 -117.65 gain 114 45 -116.81 gain 45 115 -118.17 gain 115 45 -112.25 gain 45 116 -120.98 gain 116 45 -120.81 gain 45 117 -112.97 gain 117 45 -115.60 gain 45 118 -124.63 gain 118 45 -124.63 gain 45 119 -122.71 gain 119 45 -122.18 gain 45 120 -106.89 gain 120 45 -101.91 gain 45 121 -105.72 gain 121 45 -103.52 gain 45 122 -105.86 gain 122 45 -106.16 gain 45 123 -99.24 gain 123 45 -97.06 gain 45 124 -112.24 gain 124 45 -110.05 gain 45 125 -104.93 gain 125 45 -104.35 gain 45 126 -106.54 gain 126 45 -102.28 gain 45 127 -118.13 gain 127 45 -115.44 gain 45 128 -116.36 gain 128 45 -115.54 gain 45 129 -113.72 gain 129 45 -110.30 gain 45 130 -123.65 gain 130 45 -122.92 gain 45 131 -122.05 gain 131 45 -119.18 gain 45 132 -125.06 gain 132 45 -124.81 gain 45 133 -125.31 gain 133 45 -123.16 gain 45 134 -117.67 gain 134 45 -115.33 gain 45 135 -114.69 gain 135 45 -114.05 gain 45 136 -108.35 gain 136 45 -109.00 gain 45 137 -104.46 gain 137 45 -102.89 gain 45 138 -118.12 gain 138 45 -112.78 gain 45 139 -112.34 gain 139 45 -108.91 gain 45 140 -113.91 gain 140 45 -116.54 gain 45 141 -110.38 gain 141 45 -107.89 gain 45 142 -118.34 gain 142 45 -120.67 gain 45 143 -109.74 gain 143 45 -107.61 gain 45 144 -110.96 gain 144 45 -109.73 gain 45 145 -112.36 gain 145 45 -110.73 gain 45 146 -121.12 gain 146 45 -117.04 gain 45 147 -115.37 gain 147 45 -115.13 gain 45 148 -127.85 gain 148 45 -126.54 gain 45 149 -117.17 gain 149 45 -115.11 gain 45 150 -113.67 gain 150 45 -116.73 gain 45 151 -117.30 gain 151 45 -113.92 gain 45 152 -106.49 gain 152 45 -104.94 gain 45 153 -103.07 gain 153 45 -103.95 gain 45 154 -109.63 gain 154 45 -106.12 gain 45 155 -112.24 gain 155 45 -112.56 gain 45 156 -120.22 gain 156 45 -118.56 gain 45 157 -121.57 gain 157 45 -121.87 gain 45 158 -119.54 gain 158 45 -120.27 gain 45 159 -123.42 gain 159 45 -117.79 gain 45 160 -111.74 gain 160 45 -108.38 gain 45 161 -123.79 gain 161 45 -123.29 gain 45 162 -122.76 gain 162 45 -119.35 gain 45 163 -113.84 gain 163 45 -107.61 gain 45 164 -124.84 gain 164 45 -120.35 gain 45 165 -108.67 gain 165 45 -107.12 gain 45 166 -111.31 gain 166 45 -112.43 gain 45 167 -114.13 gain 167 45 -114.38 gain 45 168 -115.45 gain 168 45 -117.04 gain 45 169 -115.06 gain 169 45 -109.00 gain 45 170 -113.04 gain 170 45 -117.47 gain 45 171 -115.22 gain 171 45 -116.08 gain 45 172 -118.62 gain 172 45 -112.57 gain 45 173 -124.62 gain 173 45 -123.24 gain 45 174 -114.58 gain 174 45 -112.96 gain 45 175 -120.36 gain 175 45 -117.95 gain 45 176 -124.97 gain 176 45 -122.50 gain 45 177 -122.84 gain 177 45 -121.87 gain 45 178 -114.97 gain 178 45 -114.95 gain 45 179 -127.81 gain 179 45 -128.81 gain 45 180 -111.17 gain 180 45 -107.98 gain 45 181 -115.08 gain 181 45 -116.33 gain 45 182 -117.22 gain 182 45 -114.77 gain 45 183 -118.36 gain 183 45 -117.21 gain 45 184 -119.62 gain 184 45 -120.52 gain 45 185 -112.95 gain 185 45 -109.27 gain 45 186 -121.64 gain 186 45 -116.96 gain 45 187 -121.75 gain 187 45 -121.16 gain 45 188 -117.08 gain 188 45 -119.25 gain 45 189 -120.50 gain 189 45 -122.06 gain 45 190 -120.97 gain 190 45 -118.20 gain 45 191 -120.72 gain 191 45 -120.99 gain 45 192 -124.21 gain 192 45 -121.79 gain 45 193 -120.00 gain 193 45 -121.56 gain 45 194 -116.30 gain 194 45 -117.43 gain 45 195 -116.08 gain 195 45 -115.40 gain 45 196 -114.28 gain 196 45 -112.63 gain 45 197 -115.92 gain 197 45 -116.94 gain 45 198 -122.97 gain 198 45 -127.92 gain 45 199 -118.46 gain 199 45 -114.98 gain 45 200 -116.68 gain 200 45 -109.97 gain 45 201 -118.10 gain 201 45 -115.21 gain 45 202 -126.01 gain 202 45 -124.64 gain 45 203 -114.13 gain 203 45 -109.39 gain 45 204 -119.14 gain 204 45 -121.48 gain 45 205 -124.48 gain 205 45 -124.89 gain 45 206 -119.94 gain 206 45 -118.33 gain 45 207 -118.77 gain 207 45 -117.92 gain 45 208 -125.42 gain 208 45 -124.74 gain 45 209 -123.61 gain 209 45 -118.93 gain 45 210 -117.87 gain 210 45 -119.78 gain 45 211 -120.80 gain 211 45 -118.97 gain 45 212 -112.35 gain 212 45 -108.06 gain 45 213 -118.99 gain 213 45 -119.57 gain 45 214 -119.54 gain 214 45 -116.43 gain 45 215 -121.97 gain 215 45 -119.94 gain 45 216 -119.32 gain 216 45 -118.12 gain 45 217 -123.15 gain 217 45 -125.77 gain 45 218 -124.94 gain 218 45 -119.75 gain 45 219 -121.97 gain 219 45 -119.60 gain 45 220 -123.28 gain 220 45 -117.26 gain 45 221 -121.51 gain 221 45 -119.99 gain 45 222 -116.68 gain 222 45 -116.53 gain 45 223 -127.49 gain 223 45 -129.35 gain 45 224 -123.35 gain 224 45 -125.71 gain 46 47 -89.42 gain 47 46 -87.35 gain 46 48 -99.09 gain 48 46 -100.89 gain 46 49 -102.35 gain 49 46 -103.00 gain 46 50 -105.71 gain 50 46 -102.72 gain 46 51 -105.27 gain 51 46 -100.76 gain 46 52 -112.02 gain 52 46 -114.79 gain 46 53 -115.42 gain 53 46 -112.70 gain 46 54 -118.55 gain 54 46 -119.40 gain 46 55 -113.93 gain 55 46 -109.94 gain 46 56 -112.28 gain 56 46 -113.18 gain 46 57 -121.79 gain 57 46 -119.49 gain 46 58 -122.61 gain 58 46 -122.01 gain 46 59 -112.95 gain 59 46 -114.78 gain 46 60 -89.39 gain 60 46 -88.51 gain 46 61 -91.55 gain 61 46 -92.11 gain 46 62 -97.92 gain 62 46 -98.04 gain 46 63 -98.84 gain 63 46 -100.19 gain 46 64 -100.33 gain 64 46 -96.47 gain 46 65 -105.47 gain 65 46 -100.21 gain 46 66 -95.76 gain 66 46 -93.57 gain 46 67 -112.45 gain 67 46 -109.14 gain 46 68 -121.36 gain 68 46 -125.34 gain 46 69 -110.85 gain 69 46 -108.56 gain 46 70 -114.87 gain 70 46 -114.09 gain 46 71 -117.47 gain 71 46 -116.57 gain 46 72 -119.95 gain 72 46 -117.02 gain 46 73 -119.40 gain 73 46 -117.30 gain 46 74 -128.88 gain 74 46 -129.08 gain 46 75 -102.00 gain 75 46 -99.87 gain 46 76 -92.77 gain 76 46 -91.66 gain 46 77 -99.49 gain 77 46 -101.34 gain 46 78 -96.38 gain 78 46 -95.14 gain 46 79 -103.60 gain 79 46 -100.30 gain 46 80 -103.45 gain 80 46 -101.67 gain 46 81 -100.39 gain 81 46 -96.57 gain 46 82 -108.21 gain 82 46 -107.23 gain 46 83 -112.21 gain 83 46 -111.02 gain 46 84 -115.87 gain 84 46 -112.49 gain 46 85 -117.09 gain 85 46 -111.99 gain 46 86 -114.73 gain 86 46 -118.01 gain 46 87 -115.21 gain 87 46 -114.14 gain 46 88 -117.07 gain 88 46 -116.55 gain 46 89 -125.54 gain 89 46 -125.27 gain 46 90 -98.68 gain 90 46 -99.78 gain 46 91 -98.65 gain 91 46 -99.04 gain 46 92 -97.20 gain 92 46 -98.16 gain 46 93 -101.87 gain 93 46 -104.36 gain 46 94 -105.19 gain 94 46 -102.59 gain 46 95 -105.53 gain 95 46 -106.16 gain 46 96 -112.05 gain 96 46 -108.14 gain 46 97 -108.33 gain 97 46 -107.83 gain 46 98 -110.51 gain 98 46 -108.76 gain 46 99 -111.04 gain 99 46 -112.93 gain 46 100 -113.68 gain 100 46 -117.28 gain 46 101 -126.97 gain 101 46 -126.50 gain 46 102 -110.56 gain 102 46 -110.21 gain 46 103 -121.69 gain 103 46 -121.18 gain 46 104 -122.06 gain 104 46 -117.37 gain 46 105 -102.51 gain 105 46 -103.15 gain 46 106 -102.85 gain 106 46 -102.21 gain 46 107 -105.96 gain 107 46 -105.61 gain 46 108 -107.13 gain 108 46 -106.44 gain 46 109 -108.62 gain 109 46 -109.79 gain 46 110 -102.77 gain 110 46 -101.00 gain 46 111 -105.81 gain 111 46 -106.71 gain 46 112 -115.19 gain 112 46 -115.83 gain 46 113 -119.33 gain 113 46 -121.67 gain 46 114 -110.88 gain 114 46 -110.13 gain 46 115 -108.99 gain 115 46 -103.16 gain 46 116 -115.17 gain 116 46 -115.08 gain 46 117 -116.41 gain 117 46 -119.11 gain 46 118 -113.37 gain 118 46 -113.45 gain 46 119 -111.47 gain 119 46 -111.03 gain 46 120 -108.51 gain 120 46 -103.61 gain 46 121 -98.86 gain 121 46 -96.74 gain 46 122 -111.01 gain 122 46 -111.39 gain 46 123 -114.32 gain 123 46 -112.22 gain 46 124 -108.72 gain 124 46 -106.62 gain 46 125 -116.59 gain 125 46 -116.09 gain 46 126 -106.47 gain 126 46 -102.29 gain 46 127 -115.04 gain 127 46 -112.43 gain 46 128 -108.63 gain 128 46 -107.90 gain 46 129 -107.75 gain 129 46 -104.41 gain 46 130 -118.25 gain 130 46 -117.60 gain 46 131 -117.82 gain 131 46 -115.03 gain 46 132 -121.26 gain 132 46 -121.09 gain 46 133 -112.98 gain 133 46 -110.92 gain 46 134 -114.15 gain 134 46 -111.88 gain 46 135 -101.71 gain 135 46 -101.16 gain 46 136 -108.24 gain 136 46 -108.97 gain 46 137 -110.91 gain 137 46 -109.42 gain 46 138 -109.49 gain 138 46 -104.24 gain 46 139 -110.41 gain 139 46 -107.06 gain 46 140 -110.65 gain 140 46 -113.36 gain 46 141 -115.37 gain 141 46 -112.96 gain 46 142 -118.40 gain 142 46 -120.80 gain 46 143 -117.05 gain 143 46 -115.00 gain 46 144 -117.55 gain 144 46 -116.41 gain 46 145 -114.69 gain 145 46 -113.13 gain 46 146 -118.55 gain 146 46 -114.55 gain 46 147 -114.69 gain 147 46 -114.54 gain 46 148 -119.33 gain 148 46 -118.11 gain 46 149 -117.94 gain 149 46 -115.97 gain 46 150 -113.10 gain 150 46 -116.24 gain 46 151 -108.76 gain 151 46 -105.46 gain 46 152 -112.70 gain 152 46 -111.23 gain 46 153 -102.20 gain 153 46 -103.16 gain 46 154 -116.99 gain 154 46 -113.57 gain 46 155 -105.32 gain 155 46 -105.73 gain 46 156 -108.63 gain 156 46 -107.06 gain 46 157 -113.98 gain 157 46 -114.36 gain 46 158 -119.01 gain 158 46 -119.83 gain 46 159 -115.80 gain 159 46 -110.25 gain 46 160 -119.17 gain 160 46 -115.90 gain 46 161 -124.67 gain 161 46 -124.25 gain 46 162 -119.83 gain 162 46 -116.50 gain 46 163 -115.83 gain 163 46 -109.68 gain 46 164 -119.57 gain 164 46 -115.17 gain 46 165 -112.47 gain 165 46 -111.00 gain 46 166 -116.24 gain 166 46 -117.45 gain 46 167 -114.03 gain 167 46 -114.36 gain 46 168 -113.09 gain 168 46 -114.76 gain 46 169 -119.83 gain 169 46 -113.86 gain 46 170 -115.79 gain 170 46 -120.31 gain 46 171 -116.35 gain 171 46 -117.29 gain 46 172 -113.94 gain 172 46 -107.98 gain 46 173 -115.62 gain 173 46 -114.32 gain 46 174 -121.57 gain 174 46 -120.03 gain 46 175 -119.93 gain 175 46 -117.60 gain 46 176 -117.86 gain 176 46 -115.48 gain 46 177 -121.32 gain 177 46 -120.43 gain 46 178 -121.72 gain 178 46 -121.78 gain 46 179 -125.84 gain 179 46 -126.92 gain 46 180 -115.09 gain 180 46 -111.98 gain 46 181 -111.89 gain 181 46 -113.22 gain 46 182 -115.23 gain 182 46 -112.87 gain 46 183 -121.91 gain 183 46 -120.84 gain 46 184 -114.96 gain 184 46 -115.95 gain 46 185 -112.39 gain 185 46 -108.80 gain 46 186 -114.80 gain 186 46 -110.21 gain 46 187 -124.92 gain 187 46 -124.42 gain 46 188 -107.87 gain 188 46 -110.13 gain 46 189 -116.61 gain 189 46 -118.26 gain 46 190 -122.33 gain 190 46 -119.65 gain 46 191 -123.46 gain 191 46 -123.82 gain 46 192 -122.22 gain 192 46 -119.89 gain 46 193 -122.85 gain 193 46 -124.50 gain 46 194 -126.29 gain 194 46 -127.50 gain 46 195 -116.11 gain 195 46 -115.52 gain 46 196 -118.95 gain 196 46 -117.38 gain 46 197 -119.48 gain 197 46 -120.58 gain 46 198 -118.93 gain 198 46 -123.97 gain 46 199 -119.43 gain 199 46 -116.03 gain 46 200 -122.50 gain 200 46 -115.87 gain 46 201 -118.70 gain 201 46 -115.89 gain 46 202 -121.01 gain 202 46 -119.73 gain 46 203 -109.88 gain 203 46 -105.23 gain 46 204 -113.84 gain 204 46 -116.27 gain 46 205 -117.90 gain 205 46 -118.39 gain 46 206 -126.36 gain 206 46 -124.83 gain 46 207 -123.98 gain 207 46 -123.22 gain 46 208 -120.11 gain 208 46 -119.51 gain 46 209 -121.29 gain 209 46 -116.70 gain 46 210 -114.70 gain 210 46 -116.69 gain 46 211 -111.52 gain 211 46 -109.77 gain 46 212 -111.60 gain 212 46 -107.40 gain 46 213 -121.67 gain 213 46 -122.34 gain 46 214 -118.18 gain 214 46 -115.15 gain 46 215 -116.12 gain 215 46 -114.18 gain 46 216 -122.97 gain 216 46 -121.85 gain 46 217 -122.02 gain 217 46 -124.73 gain 46 218 -115.57 gain 218 46 -110.46 gain 46 219 -128.13 gain 219 46 -125.84 gain 46 220 -123.10 gain 220 46 -117.16 gain 46 221 -128.48 gain 221 46 -127.05 gain 46 222 -120.67 gain 222 46 -120.61 gain 46 223 -120.49 gain 223 46 -122.43 gain 46 224 -120.20 gain 224 46 -122.64 gain 47 48 -83.08 gain 48 47 -86.94 gain 47 49 -85.43 gain 49 47 -88.16 gain 47 50 -100.98 gain 50 47 -100.06 gain 47 51 -98.74 gain 51 47 -96.29 gain 47 52 -103.69 gain 52 47 -108.53 gain 47 53 -110.20 gain 53 47 -109.55 gain 47 54 -112.91 gain 54 47 -115.84 gain 47 55 -107.69 gain 55 47 -105.77 gain 47 56 -117.49 gain 56 47 -120.46 gain 47 57 -111.01 gain 57 47 -110.77 gain 47 58 -110.86 gain 58 47 -112.33 gain 47 59 -113.24 gain 59 47 -117.14 gain 47 60 -92.14 gain 60 47 -93.33 gain 47 61 -87.92 gain 61 47 -90.55 gain 47 62 -84.43 gain 62 47 -86.61 gain 47 63 -84.68 gain 63 47 -88.10 gain 47 64 -92.92 gain 64 47 -91.13 gain 47 65 -91.58 gain 65 47 -88.38 gain 47 66 -101.57 gain 66 47 -101.44 gain 47 67 -103.21 gain 67 47 -101.96 gain 47 68 -108.37 gain 68 47 -114.42 gain 47 69 -106.35 gain 69 47 -106.13 gain 47 70 -106.75 gain 70 47 -108.04 gain 47 71 -115.30 gain 71 47 -116.47 gain 47 72 -113.42 gain 72 47 -112.56 gain 47 73 -118.14 gain 73 47 -118.11 gain 47 74 -115.86 gain 74 47 -118.13 gain 47 75 -102.05 gain 75 47 -101.99 gain 47 76 -93.52 gain 76 47 -94.48 gain 47 77 -92.04 gain 77 47 -95.96 gain 47 78 -99.08 gain 78 47 -99.91 gain 47 79 -91.79 gain 79 47 -90.56 gain 47 80 -99.06 gain 80 47 -99.34 gain 47 81 -102.51 gain 81 47 -100.76 gain 47 82 -104.33 gain 82 47 -105.42 gain 47 83 -111.72 gain 83 47 -112.60 gain 47 84 -115.14 gain 84 47 -113.82 gain 47 85 -110.34 gain 85 47 -107.30 gain 47 86 -115.42 gain 86 47 -120.77 gain 47 87 -113.27 gain 87 47 -114.27 gain 47 88 -114.39 gain 88 47 -115.93 gain 47 89 -123.93 gain 89 47 -125.73 gain 47 90 -98.76 gain 90 47 -101.94 gain 47 91 -93.84 gain 91 47 -96.29 gain 47 92 -98.70 gain 92 47 -101.73 gain 47 93 -97.43 gain 93 47 -101.99 gain 47 94 -100.81 gain 94 47 -100.28 gain 47 95 -107.15 gain 95 47 -109.85 gain 47 96 -105.33 gain 96 47 -103.49 gain 47 97 -109.00 gain 97 47 -110.57 gain 47 98 -106.30 gain 98 47 -106.62 gain 47 99 -117.75 gain 99 47 -121.71 gain 47 100 -111.59 gain 100 47 -117.25 gain 47 101 -110.21 gain 101 47 -111.81 gain 47 102 -115.54 gain 102 47 -117.26 gain 47 103 -113.13 gain 103 47 -114.69 gain 47 104 -119.63 gain 104 47 -117.02 gain 47 105 -106.83 gain 105 47 -109.53 gain 47 106 -95.94 gain 106 47 -97.36 gain 47 107 -104.58 gain 107 47 -106.30 gain 47 108 -96.30 gain 108 47 -97.68 gain 47 109 -101.32 gain 109 47 -104.55 gain 47 110 -103.18 gain 110 47 -103.48 gain 47 111 -107.90 gain 111 47 -110.86 gain 47 112 -107.79 gain 112 47 -110.50 gain 47 113 -98.43 gain 113 47 -102.84 gain 47 114 -104.85 gain 114 47 -106.17 gain 47 115 -114.95 gain 115 47 -111.19 gain 47 116 -121.04 gain 116 47 -123.01 gain 47 117 -117.27 gain 117 47 -122.05 gain 47 118 -115.94 gain 118 47 -118.09 gain 47 119 -119.98 gain 119 47 -121.61 gain 47 120 -103.09 gain 120 47 -100.26 gain 47 121 -106.86 gain 121 47 -106.81 gain 47 122 -104.91 gain 122 47 -107.37 gain 47 123 -107.34 gain 123 47 -107.32 gain 47 124 -103.94 gain 124 47 -103.91 gain 47 125 -106.34 gain 125 47 -107.91 gain 47 126 -106.27 gain 126 47 -104.16 gain 47 127 -111.06 gain 127 47 -110.52 gain 47 128 -105.56 gain 128 47 -106.89 gain 47 129 -107.56 gain 129 47 -106.30 gain 47 130 -113.53 gain 130 47 -114.95 gain 47 131 -112.70 gain 131 47 -111.98 gain 47 132 -115.86 gain 132 47 -117.76 gain 47 133 -117.44 gain 133 47 -117.45 gain 47 134 -115.98 gain 134 47 -115.79 gain 47 135 -106.91 gain 135 47 -108.42 gain 47 136 -106.67 gain 136 47 -109.47 gain 47 137 -106.08 gain 137 47 -106.67 gain 47 138 -104.34 gain 138 47 -101.16 gain 47 139 -109.57 gain 139 47 -108.29 gain 47 140 -111.75 gain 140 47 -116.52 gain 47 141 -106.15 gain 141 47 -105.82 gain 47 142 -106.64 gain 142 47 -111.12 gain 47 143 -114.81 gain 143 47 -114.83 gain 47 144 -112.74 gain 144 47 -113.66 gain 47 145 -111.16 gain 145 47 -111.67 gain 47 146 -113.46 gain 146 47 -111.53 gain 47 147 -118.16 gain 147 47 -120.08 gain 47 148 -111.07 gain 148 47 -111.91 gain 47 149 -114.39 gain 149 47 -114.49 gain 47 150 -111.71 gain 150 47 -116.92 gain 47 151 -112.64 gain 151 47 -111.42 gain 47 152 -99.60 gain 152 47 -100.20 gain 47 153 -111.50 gain 153 47 -114.53 gain 47 154 -103.64 gain 154 47 -102.29 gain 47 155 -102.24 gain 155 47 -104.71 gain 47 156 -105.76 gain 156 47 -106.25 gain 47 157 -112.58 gain 157 47 -115.03 gain 47 158 -113.10 gain 158 47 -115.99 gain 47 159 -112.43 gain 159 47 -108.96 gain 47 160 -117.25 gain 160 47 -116.05 gain 47 161 -117.77 gain 161 47 -119.43 gain 47 162 -117.21 gain 162 47 -115.94 gain 47 163 -114.77 gain 163 47 -110.69 gain 47 164 -121.30 gain 164 47 -118.97 gain 47 165 -111.83 gain 165 47 -112.43 gain 47 166 -112.87 gain 166 47 -116.15 gain 47 167 -108.20 gain 167 47 -110.60 gain 47 168 -110.40 gain 168 47 -114.15 gain 47 169 -107.75 gain 169 47 -103.85 gain 47 170 -112.20 gain 170 47 -118.79 gain 47 171 -109.05 gain 171 47 -112.06 gain 47 172 -107.68 gain 172 47 -103.79 gain 47 173 -118.77 gain 173 47 -119.54 gain 47 174 -113.45 gain 174 47 -113.97 gain 47 175 -121.56 gain 175 47 -121.29 gain 47 176 -116.82 gain 176 47 -116.51 gain 47 177 -114.30 gain 177 47 -115.48 gain 47 178 -119.57 gain 178 47 -121.70 gain 47 179 -116.06 gain 179 47 -119.22 gain 47 180 -111.85 gain 180 47 -110.81 gain 47 181 -119.60 gain 181 47 -123.00 gain 47 182 -110.53 gain 182 47 -110.23 gain 47 183 -110.50 gain 183 47 -111.49 gain 47 184 -110.28 gain 184 47 -113.34 gain 47 185 -117.79 gain 185 47 -116.27 gain 47 186 -109.15 gain 186 47 -106.63 gain 47 187 -112.37 gain 187 47 -113.94 gain 47 188 -115.84 gain 188 47 -120.16 gain 47 189 -117.35 gain 189 47 -121.07 gain 47 190 -114.77 gain 190 47 -114.16 gain 47 191 -117.55 gain 191 47 -119.97 gain 47 192 -110.70 gain 192 47 -110.43 gain 47 193 -122.94 gain 193 47 -126.65 gain 47 194 -116.47 gain 194 47 -119.75 gain 47 195 -109.82 gain 195 47 -111.30 gain 47 196 -117.34 gain 196 47 -117.84 gain 47 197 -119.67 gain 197 47 -122.84 gain 47 198 -114.99 gain 198 47 -122.10 gain 47 199 -107.56 gain 199 47 -106.23 gain 47 200 -114.82 gain 200 47 -110.26 gain 47 201 -113.45 gain 201 47 -112.71 gain 47 202 -117.96 gain 202 47 -118.75 gain 47 203 -120.43 gain 203 47 -117.85 gain 47 204 -114.80 gain 204 47 -119.30 gain 47 205 -121.61 gain 205 47 -124.17 gain 47 206 -119.34 gain 206 47 -119.88 gain 47 207 -115.87 gain 207 47 -117.17 gain 47 208 -115.48 gain 208 47 -116.95 gain 47 209 -126.38 gain 209 47 -123.86 gain 47 210 -112.41 gain 210 47 -116.48 gain 47 211 -117.37 gain 211 47 -117.70 gain 47 212 -115.28 gain 212 47 -113.15 gain 47 213 -111.69 gain 213 47 -114.43 gain 47 214 -114.96 gain 214 47 -114.00 gain 47 215 -118.46 gain 215 47 -118.58 gain 47 216 -118.96 gain 216 47 -119.91 gain 47 217 -117.72 gain 217 47 -122.50 gain 47 218 -116.33 gain 218 47 -113.30 gain 47 219 -123.11 gain 219 47 -122.89 gain 47 220 -120.73 gain 220 47 -116.87 gain 47 221 -120.06 gain 221 47 -120.70 gain 47 222 -116.59 gain 222 47 -118.59 gain 47 223 -121.12 gain 223 47 -125.13 gain 47 224 -127.58 gain 224 47 -132.09 gain 48 49 -89.39 gain 49 48 -88.25 gain 48 50 -91.43 gain 50 48 -86.64 gain 48 51 -103.05 gain 51 48 -96.74 gain 48 52 -113.92 gain 52 48 -114.88 gain 48 53 -108.73 gain 53 48 -104.21 gain 48 54 -114.59 gain 54 48 -113.65 gain 48 55 -108.07 gain 55 48 -102.28 gain 48 56 -111.46 gain 56 48 -110.56 gain 48 57 -116.95 gain 57 48 -112.85 gain 48 58 -123.09 gain 58 48 -120.69 gain 48 59 -116.18 gain 59 48 -116.22 gain 48 60 -106.57 gain 60 48 -103.89 gain 48 61 -98.11 gain 61 48 -96.87 gain 48 62 -91.05 gain 62 48 -89.37 gain 48 63 -87.56 gain 63 48 -87.11 gain 48 64 -91.52 gain 64 48 -85.86 gain 48 65 -98.61 gain 65 48 -91.55 gain 48 66 -100.35 gain 66 48 -96.36 gain 48 67 -101.60 gain 67 48 -96.49 gain 48 68 -112.82 gain 68 48 -115.01 gain 48 69 -113.88 gain 69 48 -109.79 gain 48 70 -113.96 gain 70 48 -111.39 gain 48 71 -116.23 gain 71 48 -113.52 gain 48 72 -118.49 gain 72 48 -113.76 gain 48 73 -113.21 gain 73 48 -109.32 gain 48 74 -126.47 gain 74 48 -124.86 gain 48 75 -104.43 gain 75 48 -100.50 gain 48 76 -105.86 gain 76 48 -102.95 gain 48 77 -106.19 gain 77 48 -106.24 gain 48 78 -96.97 gain 78 48 -93.93 gain 48 79 -98.84 gain 79 48 -93.74 gain 48 80 -92.28 gain 80 48 -88.69 gain 48 81 -104.94 gain 81 48 -99.32 gain 48 82 -104.24 gain 82 48 -101.47 gain 48 83 -118.13 gain 83 48 -115.14 gain 48 84 -114.52 gain 84 48 -109.34 gain 48 85 -115.71 gain 85 48 -108.81 gain 48 86 -109.24 gain 86 48 -110.72 gain 48 87 -116.28 gain 87 48 -113.41 gain 48 88 -116.08 gain 88 48 -113.76 gain 48 89 -125.78 gain 89 48 -123.71 gain 48 90 -104.14 gain 90 48 -103.44 gain 48 91 -104.65 gain 91 48 -103.24 gain 48 92 -103.03 gain 92 48 -102.19 gain 48 93 -96.36 gain 93 48 -97.05 gain 48 94 -103.71 gain 94 48 -99.31 gain 48 95 -97.69 gain 95 48 -96.52 gain 48 96 -106.88 gain 96 48 -101.17 gain 48 97 -110.50 gain 97 48 -108.20 gain 48 98 -118.07 gain 98 48 -114.52 gain 48 99 -114.38 gain 99 48 -114.47 gain 48 100 -120.71 gain 100 48 -122.51 gain 48 101 -116.33 gain 101 48 -114.06 gain 48 102 -114.57 gain 102 48 -112.43 gain 48 103 -120.51 gain 103 48 -118.20 gain 48 104 -112.67 gain 104 48 -106.18 gain 48 105 -98.67 gain 105 48 -97.51 gain 48 106 -105.61 gain 106 48 -103.17 gain 48 107 -104.36 gain 107 48 -102.21 gain 48 108 -99.21 gain 108 48 -96.72 gain 48 109 -105.94 gain 109 48 -105.30 gain 48 110 -108.11 gain 110 48 -104.54 gain 48 111 -107.37 gain 111 48 -106.47 gain 48 112 -109.12 gain 112 48 -107.97 gain 48 113 -117.04 gain 113 48 -117.58 gain 48 114 -114.43 gain 114 48 -111.87 gain 48 115 -108.54 gain 115 48 -100.91 gain 48 116 -116.96 gain 116 48 -115.07 gain 48 117 -124.33 gain 117 48 -125.24 gain 48 118 -121.00 gain 118 48 -119.29 gain 48 119 -121.21 gain 119 48 -118.97 gain 48 120 -109.97 gain 120 48 -103.28 gain 48 121 -109.93 gain 121 48 -106.01 gain 48 122 -110.06 gain 122 48 -108.65 gain 48 123 -108.38 gain 123 48 -104.48 gain 48 124 -107.71 gain 124 48 -103.81 gain 48 125 -109.19 gain 125 48 -106.89 gain 48 126 -111.22 gain 126 48 -105.24 gain 48 127 -113.29 gain 127 48 -108.88 gain 48 128 -110.40 gain 128 48 -107.86 gain 48 129 -114.65 gain 129 48 -109.52 gain 48 130 -112.91 gain 130 48 -110.46 gain 48 131 -115.81 gain 131 48 -111.22 gain 48 132 -118.33 gain 132 48 -116.36 gain 48 133 -109.18 gain 133 48 -105.32 gain 48 134 -118.73 gain 134 48 -114.67 gain 48 135 -112.42 gain 135 48 -110.07 gain 48 136 -112.14 gain 136 48 -111.08 gain 48 137 -104.76 gain 137 48 -101.48 gain 48 138 -112.89 gain 138 48 -105.84 gain 48 139 -115.21 gain 139 48 -110.06 gain 48 140 -113.51 gain 140 48 -114.42 gain 48 141 -115.77 gain 141 48 -111.56 gain 48 142 -116.36 gain 142 48 -116.96 gain 48 143 -121.75 gain 143 48 -117.90 gain 48 144 -109.83 gain 144 48 -106.88 gain 48 145 -112.28 gain 145 48 -108.93 gain 48 146 -125.30 gain 146 48 -119.50 gain 48 147 -122.35 gain 147 48 -120.40 gain 48 148 -115.12 gain 148 48 -112.10 gain 48 149 -125.26 gain 149 48 -121.49 gain 48 150 -121.35 gain 150 48 -122.69 gain 48 151 -116.46 gain 151 48 -111.36 gain 48 152 -114.26 gain 152 48 -111.00 gain 48 153 -118.00 gain 153 48 -117.16 gain 48 154 -111.10 gain 154 48 -105.88 gain 48 155 -114.66 gain 155 48 -113.27 gain 48 156 -115.33 gain 156 48 -111.96 gain 48 157 -117.41 gain 157 48 -115.99 gain 48 158 -117.43 gain 158 48 -116.45 gain 48 159 -116.42 gain 159 48 -109.08 gain 48 160 -126.63 gain 160 48 -121.56 gain 48 161 -116.58 gain 161 48 -114.36 gain 48 162 -116.26 gain 162 48 -111.13 gain 48 163 -115.22 gain 163 48 -107.27 gain 48 164 -120.52 gain 164 48 -114.32 gain 48 165 -116.75 gain 165 48 -113.48 gain 48 166 -120.61 gain 166 48 -120.02 gain 48 167 -115.75 gain 167 48 -114.28 gain 48 168 -119.08 gain 168 48 -118.96 gain 48 169 -110.65 gain 169 48 -102.87 gain 48 170 -112.73 gain 170 48 -115.45 gain 48 171 -112.36 gain 171 48 -111.50 gain 48 172 -123.39 gain 172 48 -115.64 gain 48 173 -116.19 gain 173 48 -113.10 gain 48 174 -117.39 gain 174 48 -114.05 gain 48 175 -117.26 gain 175 48 -113.13 gain 48 176 -118.33 gain 176 48 -114.15 gain 48 177 -118.71 gain 177 48 -116.03 gain 48 178 -117.93 gain 178 48 -116.19 gain 48 179 -119.13 gain 179 48 -118.42 gain 48 180 -121.78 gain 180 48 -116.87 gain 48 181 -116.08 gain 181 48 -115.61 gain 48 182 -113.17 gain 182 48 -109.00 gain 48 183 -117.33 gain 183 48 -114.46 gain 48 184 -115.68 gain 184 48 -114.86 gain 48 185 -117.56 gain 185 48 -112.17 gain 48 186 -117.51 gain 186 48 -111.11 gain 48 187 -123.33 gain 187 48 -121.03 gain 48 188 -121.62 gain 188 48 -122.07 gain 48 189 -118.23 gain 189 48 -118.09 gain 48 190 -120.28 gain 190 48 -115.80 gain 48 191 -118.56 gain 191 48 -117.11 gain 48 192 -127.30 gain 192 48 -123.17 gain 48 193 -116.59 gain 193 48 -116.44 gain 48 194 -127.65 gain 194 48 -127.06 gain 48 195 -115.28 gain 195 48 -112.88 gain 48 196 -117.94 gain 196 48 -114.57 gain 48 197 -119.56 gain 197 48 -118.86 gain 48 198 -118.57 gain 198 48 -121.81 gain 48 199 -119.51 gain 199 48 -114.31 gain 48 200 -115.89 gain 200 48 -107.46 gain 48 201 -123.81 gain 201 48 -119.20 gain 48 202 -124.79 gain 202 48 -121.71 gain 48 203 -110.83 gain 203 48 -104.37 gain 48 204 -121.89 gain 204 48 -122.52 gain 48 205 -119.27 gain 205 48 -117.96 gain 48 206 -121.00 gain 206 48 -117.67 gain 48 207 -126.01 gain 207 48 -123.45 gain 48 208 -117.44 gain 208 48 -115.04 gain 48 209 -117.93 gain 209 48 -111.54 gain 48 210 -127.29 gain 210 48 -127.48 gain 48 211 -124.47 gain 211 48 -120.93 gain 48 212 -121.26 gain 212 48 -115.26 gain 48 213 -120.87 gain 213 48 -119.74 gain 48 214 -114.54 gain 214 48 -109.71 gain 48 215 -119.61 gain 215 48 -115.86 gain 48 216 -123.06 gain 216 48 -120.15 gain 48 217 -121.31 gain 217 48 -122.21 gain 48 218 -125.37 gain 218 48 -118.46 gain 48 219 -126.89 gain 219 48 -122.81 gain 48 220 -119.58 gain 220 48 -111.85 gain 48 221 -128.18 gain 221 48 -124.94 gain 48 222 -123.47 gain 222 48 -121.61 gain 48 223 -115.83 gain 223 48 -115.97 gain 48 224 -121.82 gain 224 48 -122.46 gain 49 50 -87.60 gain 50 49 -83.96 gain 49 51 -101.04 gain 51 49 -95.87 gain 49 52 -104.45 gain 52 49 -106.56 gain 49 53 -108.07 gain 53 49 -104.69 gain 49 54 -107.82 gain 54 49 -108.03 gain 49 55 -106.37 gain 55 49 -101.73 gain 49 56 -108.23 gain 56 49 -108.48 gain 49 57 -109.46 gain 57 49 -106.50 gain 49 58 -118.15 gain 58 49 -116.89 gain 49 59 -114.39 gain 59 49 -115.57 gain 49 60 -100.64 gain 60 49 -99.11 gain 49 61 -98.40 gain 61 49 -98.31 gain 49 62 -92.45 gain 62 49 -91.92 gain 49 63 -94.93 gain 63 49 -95.62 gain 49 64 -81.79 gain 64 49 -77.28 gain 49 65 -88.74 gain 65 49 -82.83 gain 49 66 -95.47 gain 66 49 -92.63 gain 49 67 -105.53 gain 67 49 -101.56 gain 49 68 -107.84 gain 68 49 -111.17 gain 49 69 -110.49 gain 69 49 -107.54 gain 49 70 -112.42 gain 70 49 -110.99 gain 49 71 -113.00 gain 71 49 -111.44 gain 49 72 -113.25 gain 72 49 -109.66 gain 49 73 -122.77 gain 73 49 -120.02 gain 49 74 -110.46 gain 74 49 -110.00 gain 49 75 -108.73 gain 75 49 -105.94 gain 49 76 -106.34 gain 76 49 -104.58 gain 49 77 -98.37 gain 77 49 -99.57 gain 49 78 -88.02 gain 78 49 -86.13 gain 49 79 -99.44 gain 79 49 -95.48 gain 49 80 -102.26 gain 80 49 -99.82 gain 49 81 -101.98 gain 81 49 -97.51 gain 49 82 -109.90 gain 82 49 -108.28 gain 49 83 -112.55 gain 83 49 -110.71 gain 49 84 -108.32 gain 84 49 -104.28 gain 49 85 -111.72 gain 85 49 -105.96 gain 49 86 -114.27 gain 86 49 -116.89 gain 49 87 -112.61 gain 87 49 -110.89 gain 49 88 -116.80 gain 88 49 -115.62 gain 49 89 -111.38 gain 89 49 -110.45 gain 49 90 -103.41 gain 90 49 -103.86 gain 49 91 -117.79 gain 91 49 -117.52 gain 49 92 -99.47 gain 92 49 -99.77 gain 49 93 -109.88 gain 93 49 -111.72 gain 49 94 -103.14 gain 94 49 -99.89 gain 49 95 -99.38 gain 95 49 -99.35 gain 49 96 -97.32 gain 96 49 -92.76 gain 49 97 -101.85 gain 97 49 -100.70 gain 49 98 -106.00 gain 98 49 -103.60 gain 49 99 -107.02 gain 99 49 -108.26 gain 49 100 -113.29 gain 100 49 -116.23 gain 49 101 -111.66 gain 101 49 -110.53 gain 49 102 -115.43 gain 102 49 -114.43 gain 49 103 -109.57 gain 103 49 -108.40 gain 49 104 -122.30 gain 104 49 -116.96 gain 49 105 -111.60 gain 105 49 -111.59 gain 49 106 -109.06 gain 106 49 -107.77 gain 49 107 -102.07 gain 107 49 -101.07 gain 49 108 -107.57 gain 108 49 -106.24 gain 49 109 -103.17 gain 109 49 -103.68 gain 49 110 -104.34 gain 110 49 -101.92 gain 49 111 -98.77 gain 111 49 -99.01 gain 49 112 -109.32 gain 112 49 -109.31 gain 49 113 -109.81 gain 113 49 -111.50 gain 49 114 -108.74 gain 114 49 -107.33 gain 49 115 -104.74 gain 115 49 -98.25 gain 49 116 -117.24 gain 116 49 -116.50 gain 49 117 -113.44 gain 117 49 -115.50 gain 49 118 -113.32 gain 118 49 -112.75 gain 49 119 -119.56 gain 119 49 -118.46 gain 49 120 -113.64 gain 120 49 -108.09 gain 49 121 -103.12 gain 121 49 -100.34 gain 49 122 -111.80 gain 122 49 -111.54 gain 49 123 -103.21 gain 123 49 -100.46 gain 49 124 -114.68 gain 124 49 -111.92 gain 49 125 -108.58 gain 125 49 -107.43 gain 49 126 -119.13 gain 126 49 -114.29 gain 49 127 -113.81 gain 127 49 -110.55 gain 49 128 -112.94 gain 128 49 -111.55 gain 49 129 -113.12 gain 129 49 -109.13 gain 49 130 -112.70 gain 130 49 -111.39 gain 49 131 -112.20 gain 131 49 -108.76 gain 49 132 -114.54 gain 132 49 -113.72 gain 49 133 -115.58 gain 133 49 -112.87 gain 49 134 -118.20 gain 134 49 -115.29 gain 49 135 -110.77 gain 135 49 -109.56 gain 49 136 -114.36 gain 136 49 -114.44 gain 49 137 -110.12 gain 137 49 -107.98 gain 49 138 -101.80 gain 138 49 -95.90 gain 49 139 -113.77 gain 139 49 -109.77 gain 49 140 -108.14 gain 140 49 -110.19 gain 49 141 -112.44 gain 141 49 -109.38 gain 49 142 -108.74 gain 142 49 -110.49 gain 49 143 -114.78 gain 143 49 -112.08 gain 49 144 -114.37 gain 144 49 -112.57 gain 49 145 -117.14 gain 145 49 -114.94 gain 49 146 -118.39 gain 146 49 -113.74 gain 49 147 -115.79 gain 147 49 -114.99 gain 49 148 -114.26 gain 148 49 -112.38 gain 49 149 -116.03 gain 149 49 -113.40 gain 49 150 -120.95 gain 150 49 -123.44 gain 49 151 -115.97 gain 151 49 -112.02 gain 49 152 -112.48 gain 152 49 -110.36 gain 49 153 -109.46 gain 153 49 -109.76 gain 49 154 -113.63 gain 154 49 -109.55 gain 49 155 -107.85 gain 155 49 -107.60 gain 49 156 -115.78 gain 156 49 -113.54 gain 49 157 -111.87 gain 157 49 -111.60 gain 49 158 -117.14 gain 158 49 -117.31 gain 49 159 -109.60 gain 159 49 -103.40 gain 49 160 -122.99 gain 160 49 -119.06 gain 49 161 -118.54 gain 161 49 -117.47 gain 49 162 -120.24 gain 162 49 -116.25 gain 49 163 -118.00 gain 163 49 -111.21 gain 49 164 -118.78 gain 164 49 -113.73 gain 49 165 -111.57 gain 165 49 -109.44 gain 49 166 -114.75 gain 166 49 -115.30 gain 49 167 -113.21 gain 167 49 -112.89 gain 49 168 -116.15 gain 168 49 -117.17 gain 49 169 -115.08 gain 169 49 -108.45 gain 49 170 -113.60 gain 170 49 -117.46 gain 49 171 -110.05 gain 171 49 -110.33 gain 49 172 -117.44 gain 172 49 -110.83 gain 49 173 -117.92 gain 173 49 -115.97 gain 49 174 -115.80 gain 174 49 -113.61 gain 49 175 -120.69 gain 175 49 -117.71 gain 49 176 -118.45 gain 176 49 -115.42 gain 49 177 -121.23 gain 177 49 -119.69 gain 49 178 -115.05 gain 178 49 -114.46 gain 49 179 -121.81 gain 179 49 -122.24 gain 49 180 -116.63 gain 180 49 -112.87 gain 49 181 -117.52 gain 181 49 -118.20 gain 49 182 -116.93 gain 182 49 -113.91 gain 49 183 -115.61 gain 183 49 -113.89 gain 49 184 -111.65 gain 184 49 -111.98 gain 49 185 -114.16 gain 185 49 -109.91 gain 49 186 -118.55 gain 186 49 -113.30 gain 49 187 -112.21 gain 187 49 -111.05 gain 49 188 -115.69 gain 188 49 -117.29 gain 49 189 -122.29 gain 189 49 -123.29 gain 49 190 -116.71 gain 190 49 -113.37 gain 49 191 -117.17 gain 191 49 -116.87 gain 49 192 -120.57 gain 192 49 -117.58 gain 49 193 -126.76 gain 193 49 -127.75 gain 49 194 -116.97 gain 194 49 -117.53 gain 49 195 -116.81 gain 195 49 -115.57 gain 49 196 -114.87 gain 196 49 -112.65 gain 49 197 -119.95 gain 197 49 -120.39 gain 49 198 -111.42 gain 198 49 -115.80 gain 49 199 -115.55 gain 199 49 -111.50 gain 49 200 -117.81 gain 200 49 -110.53 gain 49 201 -116.71 gain 201 49 -113.25 gain 49 202 -116.46 gain 202 49 -114.52 gain 49 203 -107.19 gain 203 49 -101.88 gain 49 204 -111.44 gain 204 49 -113.22 gain 49 205 -118.78 gain 205 49 -118.62 gain 49 206 -115.11 gain 206 49 -112.92 gain 49 207 -117.37 gain 207 49 -115.95 gain 49 208 -113.15 gain 208 49 -111.90 gain 49 209 -118.38 gain 209 49 -113.14 gain 49 210 -120.95 gain 210 49 -122.29 gain 49 211 -116.03 gain 211 49 -113.63 gain 49 212 -115.02 gain 212 49 -110.17 gain 49 213 -114.55 gain 213 49 -114.56 gain 49 214 -114.40 gain 214 49 -110.71 gain 49 215 -119.91 gain 215 49 -117.32 gain 49 216 -114.85 gain 216 49 -113.08 gain 49 217 -110.95 gain 217 49 -113.00 gain 49 218 -123.19 gain 218 49 -117.43 gain 49 219 -125.66 gain 219 49 -122.71 gain 49 220 -117.04 gain 220 49 -110.45 gain 49 221 -122.58 gain 221 49 -120.49 gain 49 222 -117.18 gain 222 49 -116.46 gain 49 223 -110.62 gain 223 49 -111.91 gain 49 224 -116.72 gain 224 49 -118.51 gain 50 51 -79.03 gain 51 50 -77.51 gain 50 52 -94.99 gain 52 50 -100.74 gain 50 53 -97.12 gain 53 50 -97.39 gain 50 54 -93.89 gain 54 50 -97.73 gain 50 55 -102.05 gain 55 50 -101.05 gain 50 56 -113.44 gain 56 50 -117.34 gain 50 57 -106.76 gain 57 50 -107.44 gain 50 58 -107.24 gain 58 50 -109.63 gain 50 59 -108.42 gain 59 50 -113.25 gain 50 60 -95.10 gain 60 50 -97.21 gain 50 61 -96.83 gain 61 50 -100.38 gain 50 62 -86.85 gain 62 50 -89.96 gain 50 63 -90.57 gain 63 50 -94.91 gain 50 64 -79.88 gain 64 50 -79.01 gain 50 65 -75.04 gain 65 50 -72.77 gain 50 66 -89.36 gain 66 50 -90.16 gain 50 67 -93.43 gain 67 50 -93.11 gain 50 68 -97.85 gain 68 50 -104.82 gain 50 69 -100.20 gain 69 50 -100.90 gain 50 70 -106.05 gain 70 50 -108.26 gain 50 71 -102.48 gain 71 50 -104.56 gain 50 72 -114.07 gain 72 50 -114.13 gain 50 73 -108.11 gain 73 50 -109.01 gain 50 74 -111.44 gain 74 50 -114.63 gain 50 75 -106.04 gain 75 50 -106.90 gain 50 76 -111.56 gain 76 50 -113.45 gain 50 77 -103.00 gain 77 50 -107.84 gain 50 78 -97.04 gain 78 50 -98.79 gain 50 79 -101.44 gain 79 50 -101.13 gain 50 80 -87.91 gain 80 50 -89.11 gain 50 81 -102.37 gain 81 50 -101.54 gain 50 82 -93.00 gain 82 50 -95.02 gain 50 83 -104.59 gain 83 50 -106.39 gain 50 84 -111.26 gain 84 50 -110.86 gain 50 85 -109.07 gain 85 50 -106.96 gain 50 86 -108.93 gain 86 50 -115.20 gain 50 87 -110.05 gain 87 50 -111.97 gain 50 88 -100.80 gain 88 50 -103.27 gain 50 89 -120.90 gain 89 50 -123.62 gain 50 90 -104.24 gain 90 50 -108.34 gain 50 91 -108.71 gain 91 50 -112.09 gain 50 92 -102.59 gain 92 50 -106.54 gain 50 93 -92.16 gain 93 50 -97.64 gain 50 94 -97.79 gain 94 50 -98.18 gain 50 95 -101.03 gain 95 50 -104.65 gain 50 96 -95.98 gain 96 50 -95.06 gain 50 97 -104.76 gain 97 50 -107.25 gain 50 98 -102.13 gain 98 50 -103.37 gain 50 99 -106.78 gain 99 50 -111.66 gain 50 100 -112.98 gain 100 50 -119.57 gain 50 101 -107.50 gain 101 50 -110.02 gain 50 102 -121.20 gain 102 50 -123.84 gain 50 103 -115.01 gain 103 50 -117.49 gain 50 104 -106.32 gain 104 50 -104.63 gain 50 105 -103.33 gain 105 50 -106.96 gain 50 106 -105.16 gain 106 50 -107.50 gain 50 107 -104.96 gain 107 50 -107.61 gain 50 108 -95.32 gain 108 50 -97.63 gain 50 109 -101.19 gain 109 50 -105.35 gain 50 110 -99.58 gain 110 50 -100.80 gain 50 111 -98.33 gain 111 50 -102.22 gain 50 112 -101.74 gain 112 50 -105.37 gain 50 113 -103.34 gain 113 50 -108.67 gain 50 114 -106.62 gain 114 50 -108.86 gain 50 115 -107.25 gain 115 50 -104.41 gain 50 116 -108.77 gain 116 50 -111.67 gain 50 117 -118.93 gain 117 50 -124.63 gain 50 118 -117.33 gain 118 50 -120.41 gain 50 119 -111.71 gain 119 50 -114.26 gain 50 120 -111.48 gain 120 50 -109.58 gain 50 121 -108.69 gain 121 50 -109.56 gain 50 122 -103.39 gain 122 50 -106.77 gain 50 123 -112.78 gain 123 50 -113.68 gain 50 124 -106.22 gain 124 50 -107.11 gain 50 125 -101.57 gain 125 50 -104.06 gain 50 126 -108.54 gain 126 50 -107.35 gain 50 127 -105.57 gain 127 50 -105.95 gain 50 128 -101.73 gain 128 50 -103.98 gain 50 129 -106.58 gain 129 50 -106.24 gain 50 130 -104.20 gain 130 50 -106.54 gain 50 131 -113.14 gain 131 50 -113.34 gain 50 132 -113.51 gain 132 50 -116.33 gain 50 133 -110.29 gain 133 50 -111.22 gain 50 134 -110.17 gain 134 50 -110.89 gain 50 135 -108.41 gain 135 50 -110.85 gain 50 136 -109.21 gain 136 50 -112.94 gain 50 137 -109.69 gain 137 50 -111.20 gain 50 138 -105.67 gain 138 50 -103.42 gain 50 139 -106.24 gain 139 50 -105.88 gain 50 140 -98.23 gain 140 50 -103.93 gain 50 141 -106.45 gain 141 50 -107.04 gain 50 142 -109.56 gain 142 50 -114.96 gain 50 143 -114.34 gain 143 50 -115.28 gain 50 144 -103.23 gain 144 50 -105.08 gain 50 145 -108.10 gain 145 50 -109.53 gain 50 146 -106.77 gain 146 50 -105.76 gain 50 147 -111.06 gain 147 50 -113.90 gain 50 148 -111.84 gain 148 50 -113.61 gain 50 149 -112.31 gain 149 50 -113.33 gain 50 150 -112.10 gain 150 50 -118.23 gain 50 151 -108.88 gain 151 50 -108.58 gain 50 152 -110.78 gain 152 50 -112.30 gain 50 153 -107.94 gain 153 50 -111.90 gain 50 154 -108.90 gain 154 50 -108.47 gain 50 155 -106.59 gain 155 50 -109.98 gain 50 156 -106.91 gain 156 50 -108.32 gain 50 157 -107.65 gain 157 50 -111.03 gain 50 158 -115.09 gain 158 50 -118.90 gain 50 159 -109.03 gain 159 50 -106.47 gain 50 160 -110.79 gain 160 50 -110.51 gain 50 161 -108.70 gain 161 50 -111.28 gain 50 162 -111.81 gain 162 50 -111.47 gain 50 163 -115.11 gain 163 50 -111.96 gain 50 164 -111.85 gain 164 50 -110.44 gain 50 165 -105.63 gain 165 50 -107.16 gain 50 166 -106.37 gain 166 50 -110.57 gain 50 167 -108.70 gain 167 50 -112.02 gain 50 168 -106.25 gain 168 50 -110.92 gain 50 169 -105.56 gain 169 50 -102.58 gain 50 170 -112.46 gain 170 50 -119.96 gain 50 171 -109.34 gain 171 50 -113.27 gain 50 172 -113.05 gain 172 50 -110.08 gain 50 173 -112.81 gain 173 50 -114.50 gain 50 174 -111.25 gain 174 50 -112.70 gain 50 175 -109.64 gain 175 50 -110.30 gain 50 176 -108.50 gain 176 50 -109.11 gain 50 177 -118.28 gain 177 50 -120.39 gain 50 178 -114.90 gain 178 50 -117.96 gain 50 179 -116.10 gain 179 50 -120.18 gain 50 180 -116.62 gain 180 50 -116.50 gain 50 181 -110.88 gain 181 50 -115.21 gain 50 182 -111.08 gain 182 50 -111.70 gain 50 183 -103.99 gain 183 50 -105.91 gain 50 184 -112.25 gain 184 50 -116.22 gain 50 185 -107.39 gain 185 50 -106.79 gain 50 186 -107.78 gain 186 50 -106.18 gain 50 187 -116.23 gain 187 50 -118.72 gain 50 188 -111.90 gain 188 50 -117.14 gain 50 189 -112.21 gain 189 50 -116.85 gain 50 190 -113.89 gain 190 50 -114.20 gain 50 191 -121.90 gain 191 50 -125.24 gain 50 192 -117.67 gain 192 50 -118.33 gain 50 193 -115.78 gain 193 50 -120.42 gain 50 194 -120.81 gain 194 50 -125.02 gain 50 195 -112.42 gain 195 50 -114.82 gain 50 196 -112.63 gain 196 50 -114.05 gain 50 197 -124.99 gain 197 50 -129.08 gain 50 198 -119.92 gain 198 50 -127.95 gain 50 199 -111.59 gain 199 50 -111.19 gain 50 200 -118.49 gain 200 50 -114.85 gain 50 201 -112.64 gain 201 50 -112.82 gain 50 202 -110.73 gain 202 50 -112.44 gain 50 203 -115.80 gain 203 50 -114.13 gain 50 204 -112.69 gain 204 50 -118.12 gain 50 205 -108.85 gain 205 50 -112.34 gain 50 206 -111.88 gain 206 50 -113.35 gain 50 207 -114.49 gain 207 50 -116.71 gain 50 208 -114.37 gain 208 50 -116.77 gain 50 209 -114.23 gain 209 50 -112.63 gain 50 210 -109.64 gain 210 50 -114.63 gain 50 211 -115.89 gain 211 50 -117.13 gain 50 212 -116.02 gain 212 50 -114.82 gain 50 213 -113.50 gain 213 50 -117.16 gain 50 214 -113.28 gain 214 50 -113.24 gain 50 215 -112.80 gain 215 50 -113.85 gain 50 216 -112.21 gain 216 50 -114.09 gain 50 217 -109.72 gain 217 50 -115.42 gain 50 218 -121.96 gain 218 50 -119.85 gain 50 219 -111.78 gain 219 50 -112.49 gain 50 220 -115.36 gain 220 50 -112.41 gain 50 221 -116.72 gain 221 50 -118.28 gain 50 222 -117.36 gain 222 50 -120.28 gain 50 223 -114.81 gain 223 50 -119.74 gain 50 224 -119.01 gain 224 50 -124.45 gain 51 52 -81.03 gain 52 51 -88.30 gain 51 53 -88.62 gain 53 51 -90.41 gain 51 54 -98.75 gain 54 51 -104.11 gain 51 55 -95.33 gain 55 51 -95.85 gain 51 56 -105.54 gain 56 51 -110.95 gain 51 57 -108.31 gain 57 51 -110.52 gain 51 58 -115.01 gain 58 51 -118.92 gain 51 59 -110.24 gain 59 51 -116.58 gain 51 60 -107.84 gain 60 51 -111.47 gain 51 61 -107.91 gain 61 51 -112.98 gain 51 62 -106.87 gain 62 51 -111.49 gain 51 63 -91.18 gain 63 51 -97.04 gain 51 64 -94.80 gain 64 51 -95.45 gain 51 65 -81.00 gain 65 51 -80.25 gain 51 66 -83.34 gain 66 51 -85.66 gain 51 67 -86.52 gain 67 51 -87.72 gain 51 68 -94.99 gain 68 51 -103.48 gain 51 69 -99.19 gain 69 51 -101.40 gain 51 70 -97.76 gain 70 51 -101.49 gain 51 71 -107.64 gain 71 51 -111.24 gain 51 72 -104.52 gain 72 51 -106.10 gain 51 73 -106.28 gain 73 51 -108.70 gain 51 74 -108.10 gain 74 51 -112.80 gain 51 75 -103.60 gain 75 51 -105.98 gain 51 76 -103.14 gain 76 51 -106.54 gain 51 77 -105.75 gain 77 51 -112.11 gain 51 78 -94.86 gain 78 51 -98.13 gain 51 79 -95.72 gain 79 51 -96.92 gain 51 80 -96.97 gain 80 51 -99.69 gain 51 81 -90.61 gain 81 51 -91.30 gain 51 82 -87.42 gain 82 51 -90.96 gain 51 83 -95.70 gain 83 51 -99.03 gain 51 84 -92.96 gain 84 51 -94.09 gain 51 85 -103.87 gain 85 51 -103.27 gain 51 86 -106.90 gain 86 51 -114.69 gain 51 87 -105.01 gain 87 51 -108.45 gain 51 88 -110.66 gain 88 51 -114.65 gain 51 89 -104.89 gain 89 51 -109.13 gain 51 90 -106.45 gain 90 51 -112.07 gain 51 91 -104.76 gain 91 51 -109.66 gain 51 92 -103.50 gain 92 51 -108.97 gain 51 93 -99.69 gain 93 51 -106.70 gain 51 94 -98.83 gain 94 51 -100.74 gain 51 95 -89.99 gain 95 51 -95.13 gain 51 96 -99.57 gain 96 51 -100.17 gain 51 97 -93.51 gain 97 51 -97.52 gain 51 98 -99.06 gain 98 51 -101.82 gain 51 99 -101.79 gain 99 51 -108.19 gain 51 100 -103.26 gain 100 51 -111.37 gain 51 101 -96.12 gain 101 51 -100.16 gain 51 102 -100.33 gain 102 51 -104.50 gain 51 103 -113.69 gain 103 51 -117.69 gain 51 104 -101.81 gain 104 51 -101.64 gain 51 105 -110.32 gain 105 51 -115.47 gain 51 106 -109.93 gain 106 51 -113.80 gain 51 107 -103.80 gain 107 51 -107.97 gain 51 108 -103.73 gain 108 51 -107.56 gain 51 109 -105.52 gain 109 51 -111.20 gain 51 110 -101.42 gain 110 51 -104.16 gain 51 111 -102.20 gain 111 51 -107.60 gain 51 112 -99.57 gain 112 51 -104.72 gain 51 113 -98.63 gain 113 51 -105.48 gain 51 114 -99.12 gain 114 51 -102.87 gain 51 115 -101.88 gain 115 51 -100.56 gain 51 116 -103.25 gain 116 51 -107.66 gain 51 117 -109.86 gain 117 51 -117.08 gain 51 118 -110.19 gain 118 51 -114.79 gain 51 119 -114.04 gain 119 51 -118.11 gain 51 120 -107.00 gain 120 51 -106.62 gain 51 121 -105.74 gain 121 51 -108.13 gain 51 122 -102.63 gain 122 51 -107.53 gain 51 123 -102.29 gain 123 51 -104.71 gain 51 124 -103.31 gain 124 51 -105.72 gain 51 125 -111.16 gain 125 51 -115.17 gain 51 126 -101.32 gain 126 51 -101.65 gain 51 127 -99.91 gain 127 51 -101.82 gain 51 128 -102.34 gain 128 51 -106.11 gain 51 129 -108.21 gain 129 51 -109.39 gain 51 130 -103.12 gain 130 51 -106.98 gain 51 131 -104.87 gain 131 51 -106.59 gain 51 132 -102.56 gain 132 51 -106.90 gain 51 133 -110.70 gain 133 51 -113.15 gain 51 134 -109.46 gain 134 51 -111.71 gain 51 135 -117.40 gain 135 51 -121.35 gain 51 136 -113.18 gain 136 51 -118.42 gain 51 137 -112.79 gain 137 51 -115.81 gain 51 138 -111.08 gain 138 51 -110.34 gain 51 139 -105.21 gain 139 51 -106.37 gain 51 140 -103.11 gain 140 51 -110.33 gain 51 141 -100.78 gain 141 51 -102.88 gain 51 142 -108.09 gain 142 51 -115.01 gain 51 143 -107.02 gain 143 51 -109.48 gain 51 144 -108.20 gain 144 51 -111.56 gain 51 145 -111.29 gain 145 51 -114.25 gain 51 146 -117.45 gain 146 51 -117.96 gain 51 147 -109.16 gain 147 51 -113.52 gain 51 148 -110.96 gain 148 51 -114.25 gain 51 149 -116.50 gain 149 51 -119.04 gain 51 150 -105.38 gain 150 51 -113.03 gain 51 151 -108.45 gain 151 51 -109.67 gain 51 152 -104.24 gain 152 51 -107.29 gain 51 153 -108.35 gain 153 51 -113.82 gain 51 154 -110.63 gain 154 51 -111.72 gain 51 155 -106.48 gain 155 51 -111.40 gain 51 156 -103.00 gain 156 51 -105.93 gain 51 157 -110.35 gain 157 51 -115.24 gain 51 158 -107.94 gain 158 51 -113.26 gain 51 159 -102.63 gain 159 51 -101.60 gain 51 160 -109.34 gain 160 51 -110.57 gain 51 161 -113.31 gain 161 51 -117.40 gain 51 162 -110.10 gain 162 51 -111.28 gain 51 163 -123.30 gain 163 51 -121.66 gain 51 164 -120.61 gain 164 51 -120.72 gain 51 165 -111.93 gain 165 51 -114.97 gain 51 166 -109.76 gain 166 51 -115.48 gain 51 167 -113.97 gain 167 51 -118.81 gain 51 168 -107.73 gain 168 51 -113.92 gain 51 169 -103.86 gain 169 51 -102.39 gain 51 170 -110.33 gain 170 51 -119.36 gain 51 171 -108.14 gain 171 51 -113.59 gain 51 172 -113.41 gain 172 51 -111.96 gain 51 173 -109.15 gain 173 51 -112.36 gain 51 174 -106.96 gain 174 51 -109.93 gain 51 175 -104.75 gain 175 51 -106.92 gain 51 176 -113.49 gain 176 51 -115.62 gain 51 177 -113.35 gain 177 51 -116.97 gain 51 178 -104.13 gain 178 51 -108.71 gain 51 179 -109.36 gain 179 51 -114.96 gain 51 180 -110.77 gain 180 51 -112.17 gain 51 181 -113.89 gain 181 51 -119.73 gain 51 182 -107.23 gain 182 51 -109.38 gain 51 183 -113.23 gain 183 51 -116.67 gain 51 184 -115.66 gain 184 51 -121.15 gain 51 185 -113.06 gain 185 51 -113.98 gain 51 186 -109.94 gain 186 51 -109.86 gain 51 187 -121.34 gain 187 51 -125.35 gain 51 188 -112.02 gain 188 51 -118.79 gain 51 189 -104.74 gain 189 51 -110.90 gain 51 190 -110.60 gain 190 51 -112.42 gain 51 191 -106.84 gain 191 51 -111.71 gain 51 192 -108.45 gain 192 51 -110.63 gain 51 193 -116.35 gain 193 51 -122.51 gain 51 194 -110.95 gain 194 51 -116.67 gain 51 195 -114.13 gain 195 51 -118.05 gain 51 196 -112.89 gain 196 51 -115.84 gain 51 197 -107.92 gain 197 51 -113.53 gain 51 198 -112.45 gain 198 51 -122.00 gain 51 199 -113.29 gain 199 51 -114.40 gain 51 200 -116.57 gain 200 51 -114.45 gain 51 201 -103.69 gain 201 51 -105.39 gain 51 202 -109.78 gain 202 51 -113.01 gain 51 203 -111.10 gain 203 51 -110.96 gain 51 204 -113.76 gain 204 51 -120.70 gain 51 205 -117.89 gain 205 51 -122.90 gain 51 206 -114.50 gain 206 51 -117.48 gain 51 207 -115.40 gain 207 51 -119.14 gain 51 208 -114.02 gain 208 51 -117.93 gain 51 209 -114.59 gain 209 51 -114.51 gain 51 210 -111.81 gain 210 51 -118.32 gain 51 211 -111.11 gain 211 51 -113.88 gain 51 212 -113.33 gain 212 51 -113.64 gain 51 213 -116.68 gain 213 51 -121.86 gain 51 214 -114.01 gain 214 51 -115.49 gain 51 215 -116.32 gain 215 51 -118.88 gain 51 216 -109.93 gain 216 51 -113.32 gain 51 217 -112.16 gain 217 51 -119.38 gain 51 218 -111.58 gain 218 51 -110.99 gain 51 219 -113.84 gain 219 51 -116.07 gain 51 220 -116.70 gain 220 51 -115.28 gain 51 221 -122.35 gain 221 51 -125.42 gain 51 222 -109.67 gain 222 51 -114.12 gain 51 223 -115.54 gain 223 51 -121.99 gain 51 224 -115.35 gain 224 51 -122.30 gain 52 53 -80.85 gain 53 52 -75.37 gain 52 54 -95.80 gain 54 52 -93.89 gain 52 55 -98.27 gain 55 52 -91.52 gain 52 56 -97.76 gain 56 52 -95.90 gain 52 57 -105.58 gain 57 52 -100.51 gain 52 58 -111.31 gain 58 52 -107.95 gain 52 59 -113.61 gain 59 52 -112.68 gain 52 60 -114.78 gain 60 52 -111.14 gain 52 61 -112.31 gain 61 52 -110.11 gain 52 62 -109.94 gain 62 52 -107.29 gain 52 63 -106.35 gain 63 52 -104.93 gain 52 64 -100.79 gain 64 52 -94.16 gain 52 65 -98.44 gain 65 52 -90.41 gain 52 66 -93.22 gain 66 52 -88.26 gain 52 67 -95.91 gain 67 52 -89.84 gain 52 68 -96.55 gain 68 52 -97.77 gain 52 69 -95.81 gain 69 52 -90.75 gain 52 70 -100.36 gain 70 52 -96.82 gain 52 71 -107.65 gain 71 52 -103.98 gain 52 72 -112.35 gain 72 52 -106.66 gain 52 73 -111.57 gain 73 52 -106.71 gain 52 74 -117.76 gain 74 52 -115.19 gain 52 75 -112.84 gain 75 52 -107.95 gain 52 76 -114.71 gain 76 52 -110.84 gain 52 77 -111.98 gain 77 52 -111.07 gain 52 78 -102.02 gain 78 52 -98.01 gain 52 79 -106.49 gain 79 52 -100.42 gain 52 80 -102.80 gain 80 52 -98.25 gain 52 81 -101.56 gain 81 52 -94.97 gain 52 82 -99.25 gain 82 52 -95.51 gain 52 83 -96.12 gain 83 52 -92.17 gain 52 84 -99.90 gain 84 52 -93.75 gain 52 85 -112.08 gain 85 52 -104.21 gain 52 86 -111.40 gain 86 52 -111.91 gain 52 87 -108.78 gain 87 52 -104.95 gain 52 88 -109.77 gain 88 52 -106.48 gain 52 89 -125.24 gain 89 52 -122.21 gain 52 90 -116.12 gain 90 52 -114.46 gain 52 91 -112.11 gain 91 52 -109.73 gain 52 92 -113.06 gain 92 52 -111.26 gain 52 93 -111.27 gain 93 52 -111.00 gain 52 94 -106.30 gain 94 52 -100.93 gain 52 95 -101.63 gain 95 52 -99.50 gain 52 96 -101.86 gain 96 52 -95.18 gain 52 97 -98.95 gain 97 52 -95.68 gain 52 98 -101.56 gain 98 52 -97.04 gain 52 99 -105.56 gain 99 52 -104.69 gain 52 100 -101.77 gain 100 52 -102.60 gain 52 101 -114.49 gain 101 52 -111.25 gain 52 102 -110.46 gain 102 52 -107.35 gain 52 103 -113.92 gain 103 52 -110.65 gain 52 104 -118.12 gain 104 52 -110.67 gain 52 105 -103.96 gain 105 52 -101.84 gain 52 106 -114.00 gain 106 52 -110.59 gain 52 107 -114.08 gain 107 52 -110.98 gain 52 108 -114.97 gain 108 52 -111.53 gain 52 109 -118.99 gain 109 52 -117.39 gain 52 110 -108.03 gain 110 52 -103.50 gain 52 111 -112.54 gain 111 52 -110.67 gain 52 112 -103.26 gain 112 52 -101.13 gain 52 113 -107.30 gain 113 52 -106.87 gain 52 114 -104.88 gain 114 52 -101.36 gain 52 115 -107.21 gain 115 52 -98.61 gain 52 116 -110.40 gain 116 52 -107.54 gain 52 117 -117.27 gain 117 52 -117.21 gain 52 118 -109.93 gain 118 52 -107.25 gain 52 119 -115.57 gain 119 52 -112.36 gain 52 120 -114.06 gain 120 52 -106.40 gain 52 121 -115.46 gain 121 52 -110.58 gain 52 122 -117.71 gain 122 52 -115.33 gain 52 123 -113.10 gain 123 52 -108.24 gain 52 124 -111.17 gain 124 52 -106.30 gain 52 125 -108.94 gain 125 52 -105.67 gain 52 126 -99.76 gain 126 52 -92.81 gain 52 127 -109.11 gain 127 52 -103.74 gain 52 128 -114.16 gain 128 52 -110.66 gain 52 129 -106.84 gain 129 52 -100.75 gain 52 130 -111.34 gain 130 52 -107.93 gain 52 131 -116.12 gain 131 52 -110.57 gain 52 132 -112.41 gain 132 52 -109.47 gain 52 133 -113.08 gain 133 52 -108.25 gain 52 134 -126.81 gain 134 52 -121.78 gain 52 135 -115.69 gain 135 52 -112.37 gain 52 136 -118.58 gain 136 52 -116.55 gain 52 137 -114.81 gain 137 52 -110.57 gain 52 138 -119.60 gain 138 52 -111.59 gain 52 139 -114.41 gain 139 52 -108.29 gain 52 140 -114.02 gain 140 52 -113.96 gain 52 141 -111.71 gain 141 52 -106.54 gain 52 142 -103.38 gain 142 52 -103.02 gain 52 143 -114.25 gain 143 52 -109.43 gain 52 144 -109.48 gain 144 52 -105.57 gain 52 145 -107.62 gain 145 52 -103.30 gain 52 146 -113.15 gain 146 52 -106.38 gain 52 147 -117.03 gain 147 52 -114.12 gain 52 148 -118.27 gain 148 52 -114.28 gain 52 149 -113.36 gain 149 52 -108.63 gain 52 150 -120.72 gain 150 52 -121.10 gain 52 151 -119.08 gain 151 52 -113.03 gain 52 152 -121.05 gain 152 52 -116.82 gain 52 153 -113.77 gain 153 52 -111.97 gain 52 154 -116.94 gain 154 52 -110.75 gain 52 155 -123.91 gain 155 52 -121.55 gain 52 156 -115.11 gain 156 52 -110.77 gain 52 157 -114.87 gain 157 52 -112.49 gain 52 158 -120.90 gain 158 52 -118.96 gain 52 159 -108.96 gain 159 52 -100.65 gain 52 160 -118.14 gain 160 52 -112.10 gain 52 161 -114.73 gain 161 52 -111.56 gain 52 162 -117.73 gain 162 52 -111.64 gain 52 163 -119.76 gain 163 52 -110.85 gain 52 164 -121.25 gain 164 52 -114.09 gain 52 165 -117.45 gain 165 52 -113.22 gain 52 166 -122.88 gain 166 52 -121.33 gain 52 167 -115.12 gain 167 52 -112.69 gain 52 168 -115.95 gain 168 52 -114.86 gain 52 169 -107.67 gain 169 52 -98.93 gain 52 170 -115.67 gain 170 52 -117.42 gain 52 171 -114.57 gain 171 52 -112.75 gain 52 172 -119.46 gain 172 52 -110.73 gain 52 173 -113.55 gain 173 52 -109.48 gain 52 174 -108.75 gain 174 52 -104.44 gain 52 175 -119.44 gain 175 52 -114.34 gain 52 176 -120.32 gain 176 52 -115.18 gain 52 177 -118.46 gain 177 52 -114.80 gain 52 178 -122.31 gain 178 52 -119.60 gain 52 179 -113.96 gain 179 52 -112.28 gain 52 180 -111.46 gain 180 52 -105.58 gain 52 181 -116.54 gain 181 52 -115.11 gain 52 182 -123.83 gain 182 52 -118.70 gain 52 183 -118.07 gain 183 52 -114.23 gain 52 184 -122.68 gain 184 52 -120.90 gain 52 185 -112.28 gain 185 52 -105.93 gain 52 186 -115.98 gain 186 52 -108.62 gain 52 187 -113.24 gain 187 52 -109.97 gain 52 188 -118.79 gain 188 52 -118.29 gain 52 189 -120.34 gain 189 52 -119.23 gain 52 190 -117.49 gain 190 52 -112.04 gain 52 191 -120.35 gain 191 52 -117.94 gain 52 192 -120.07 gain 192 52 -114.97 gain 52 193 -120.86 gain 193 52 -119.74 gain 52 194 -114.83 gain 194 52 -113.29 gain 52 195 -120.04 gain 195 52 -116.68 gain 52 196 -121.83 gain 196 52 -117.49 gain 52 197 -124.48 gain 197 52 -122.82 gain 52 198 -119.83 gain 198 52 -122.10 gain 52 199 -119.40 gain 199 52 -113.24 gain 52 200 -114.88 gain 200 52 -105.48 gain 52 201 -116.82 gain 201 52 -111.25 gain 52 202 -122.64 gain 202 52 -118.60 gain 52 203 -116.83 gain 203 52 -109.41 gain 52 204 -115.96 gain 204 52 -115.63 gain 52 205 -120.43 gain 205 52 -118.16 gain 52 206 -122.37 gain 206 52 -118.08 gain 52 207 -118.91 gain 207 52 -115.38 gain 52 208 -122.04 gain 208 52 -118.68 gain 52 209 -117.38 gain 209 52 -110.03 gain 52 210 -123.26 gain 210 52 -122.49 gain 52 211 -124.83 gain 211 52 -120.32 gain 52 212 -118.56 gain 212 52 -111.59 gain 52 213 -121.45 gain 213 52 -119.36 gain 52 214 -119.27 gain 214 52 -113.47 gain 52 215 -121.70 gain 215 52 -116.99 gain 52 216 -121.77 gain 216 52 -117.89 gain 52 217 -131.77 gain 217 52 -131.71 gain 52 218 -130.21 gain 218 52 -122.34 gain 52 219 -121.98 gain 219 52 -116.93 gain 52 220 -118.40 gain 220 52 -109.70 gain 52 221 -123.50 gain 221 52 -119.31 gain 52 222 -120.18 gain 222 52 -117.35 gain 52 223 -126.40 gain 223 52 -125.58 gain 52 224 -125.18 gain 224 52 -124.86 gain 53 54 -79.74 gain 54 53 -83.31 gain 53 55 -91.30 gain 55 53 -90.03 gain 53 56 -102.95 gain 56 53 -106.57 gain 53 57 -104.81 gain 57 53 -105.23 gain 53 58 -105.41 gain 58 53 -107.53 gain 53 59 -104.08 gain 59 53 -108.64 gain 53 60 -109.37 gain 60 53 -111.21 gain 53 61 -105.75 gain 61 53 -109.03 gain 53 62 -106.90 gain 62 53 -109.73 gain 53 63 -102.81 gain 63 53 -106.88 gain 53 64 -107.96 gain 64 53 -106.82 gain 53 65 -96.34 gain 65 53 -93.80 gain 53 66 -93.09 gain 66 53 -93.62 gain 53 67 -89.55 gain 67 53 -88.96 gain 53 68 -89.58 gain 68 53 -96.28 gain 53 69 -87.20 gain 69 53 -87.63 gain 53 70 -95.34 gain 70 53 -97.28 gain 53 71 -98.48 gain 71 53 -100.29 gain 53 72 -94.82 gain 72 53 -94.61 gain 53 73 -109.23 gain 73 53 -109.85 gain 53 74 -105.59 gain 74 53 -108.51 gain 53 75 -108.35 gain 75 53 -108.94 gain 53 76 -110.14 gain 76 53 -111.75 gain 53 77 -107.11 gain 77 53 -111.68 gain 53 78 -110.72 gain 78 53 -112.20 gain 53 79 -102.50 gain 79 53 -101.92 gain 53 80 -96.34 gain 80 53 -97.27 gain 53 81 -93.64 gain 81 53 -92.54 gain 53 82 -88.61 gain 82 53 -90.36 gain 53 83 -92.06 gain 83 53 -93.60 gain 53 84 -95.21 gain 84 53 -94.54 gain 53 85 -96.51 gain 85 53 -94.12 gain 53 86 -105.11 gain 86 53 -111.11 gain 53 87 -101.88 gain 87 53 -103.54 gain 53 88 -108.22 gain 88 53 -110.41 gain 53 89 -101.58 gain 89 53 -104.03 gain 53 90 -113.50 gain 90 53 -117.33 gain 53 91 -109.11 gain 91 53 -112.21 gain 53 92 -117.19 gain 92 53 -120.87 gain 53 93 -104.82 gain 93 53 -110.03 gain 53 94 -101.14 gain 94 53 -101.26 gain 53 95 -108.31 gain 95 53 -111.66 gain 53 96 -100.09 gain 96 53 -98.90 gain 53 97 -99.66 gain 97 53 -101.88 gain 53 98 -87.10 gain 98 53 -88.07 gain 53 99 -96.37 gain 99 53 -100.98 gain 53 100 -97.69 gain 100 53 -104.01 gain 53 101 -100.41 gain 101 53 -102.66 gain 53 102 -102.67 gain 102 53 -105.05 gain 53 103 -110.90 gain 103 53 -113.11 gain 53 104 -111.21 gain 104 53 -109.24 gain 53 105 -102.58 gain 105 53 -105.94 gain 53 106 -111.37 gain 106 53 -113.45 gain 53 107 -109.35 gain 107 53 -111.73 gain 53 108 -103.51 gain 108 53 -105.55 gain 53 109 -107.40 gain 109 53 -111.29 gain 53 110 -99.64 gain 110 53 -100.59 gain 53 111 -105.77 gain 111 53 -109.39 gain 53 112 -98.95 gain 112 53 -102.31 gain 53 113 -105.96 gain 113 53 -111.02 gain 53 114 -97.87 gain 114 53 -99.84 gain 53 115 -103.16 gain 115 53 -100.05 gain 53 116 -103.31 gain 116 53 -105.94 gain 53 117 -103.00 gain 117 53 -108.43 gain 53 118 -105.67 gain 118 53 -108.48 gain 53 119 -109.51 gain 119 53 -111.79 gain 53 120 -114.23 gain 120 53 -112.05 gain 53 121 -110.27 gain 121 53 -110.87 gain 53 122 -103.11 gain 122 53 -106.22 gain 53 123 -106.61 gain 123 53 -107.24 gain 53 124 -107.63 gain 124 53 -108.25 gain 53 125 -114.94 gain 125 53 -117.16 gain 53 126 -107.48 gain 126 53 -106.02 gain 53 127 -107.21 gain 127 53 -107.32 gain 53 128 -111.08 gain 128 53 -113.06 gain 53 129 -98.86 gain 129 53 -98.24 gain 53 130 -101.17 gain 130 53 -103.24 gain 53 131 -114.05 gain 131 53 -113.98 gain 53 132 -101.88 gain 132 53 -104.43 gain 53 133 -108.68 gain 133 53 -109.34 gain 53 134 -111.41 gain 134 53 -111.86 gain 53 135 -111.81 gain 135 53 -113.98 gain 53 136 -104.32 gain 136 53 -107.77 gain 53 137 -112.92 gain 137 53 -114.16 gain 53 138 -115.99 gain 138 53 -113.46 gain 53 139 -104.43 gain 139 53 -103.80 gain 53 140 -119.34 gain 140 53 -124.77 gain 53 141 -101.85 gain 141 53 -102.16 gain 53 142 -106.41 gain 142 53 -111.54 gain 53 143 -106.78 gain 143 53 -107.45 gain 53 144 -108.44 gain 144 53 -110.02 gain 53 145 -100.53 gain 145 53 -101.70 gain 53 146 -108.77 gain 146 53 -107.50 gain 53 147 -109.82 gain 147 53 -112.39 gain 53 148 -99.67 gain 148 53 -101.17 gain 53 149 -116.47 gain 149 53 -117.22 gain 53 150 -118.74 gain 150 53 -124.60 gain 53 151 -108.63 gain 151 53 -108.05 gain 53 152 -103.62 gain 152 53 -104.87 gain 53 153 -109.85 gain 153 53 -113.54 gain 53 154 -108.21 gain 154 53 -107.50 gain 53 155 -115.96 gain 155 53 -119.09 gain 53 156 -115.55 gain 156 53 -116.69 gain 53 157 -111.25 gain 157 53 -114.35 gain 53 158 -107.54 gain 158 53 -111.07 gain 53 159 -108.83 gain 159 53 -106.00 gain 53 160 -108.27 gain 160 53 -107.72 gain 53 161 -113.63 gain 161 53 -115.94 gain 53 162 -114.85 gain 162 53 -114.24 gain 53 163 -114.31 gain 163 53 -110.88 gain 53 164 -112.81 gain 164 53 -111.13 gain 53 165 -110.61 gain 165 53 -111.87 gain 53 166 -118.29 gain 166 53 -122.22 gain 53 167 -115.40 gain 167 53 -118.45 gain 53 168 -110.87 gain 168 53 -115.26 gain 53 169 -110.18 gain 169 53 -106.93 gain 53 170 -110.10 gain 170 53 -117.34 gain 53 171 -116.48 gain 171 53 -120.14 gain 53 172 -114.62 gain 172 53 -111.38 gain 53 173 -112.70 gain 173 53 -114.12 gain 53 174 -113.42 gain 174 53 -114.60 gain 53 175 -105.64 gain 175 53 -106.03 gain 53 176 -107.43 gain 176 53 -107.77 gain 53 177 -119.81 gain 177 53 -121.64 gain 53 178 -115.65 gain 178 53 -118.43 gain 53 179 -111.15 gain 179 53 -114.96 gain 53 180 -110.25 gain 180 53 -109.86 gain 53 181 -119.32 gain 181 53 -123.37 gain 53 182 -115.11 gain 182 53 -115.46 gain 53 183 -121.91 gain 183 53 -123.56 gain 53 184 -111.86 gain 184 53 -115.56 gain 53 185 -107.13 gain 185 53 -106.26 gain 53 186 -114.52 gain 186 53 -112.65 gain 53 187 -110.19 gain 187 53 -112.40 gain 53 188 -114.54 gain 188 53 -119.51 gain 53 189 -109.35 gain 189 53 -113.72 gain 53 190 -114.31 gain 190 53 -114.35 gain 53 191 -110.86 gain 191 53 -113.93 gain 53 192 -116.21 gain 192 53 -116.60 gain 53 193 -114.41 gain 193 53 -118.78 gain 53 194 -113.53 gain 194 53 -117.46 gain 53 195 -114.28 gain 195 53 -116.40 gain 53 196 -118.33 gain 196 53 -119.48 gain 53 197 -115.70 gain 197 53 -119.52 gain 53 198 -121.64 gain 198 53 -129.39 gain 53 199 -112.96 gain 199 53 -112.28 gain 53 200 -115.49 gain 200 53 -111.58 gain 53 201 -105.59 gain 201 53 -105.51 gain 53 202 -116.32 gain 202 53 -117.76 gain 53 203 -117.43 gain 203 53 -115.50 gain 53 204 -108.25 gain 204 53 -113.40 gain 53 205 -114.57 gain 205 53 -117.78 gain 53 206 -119.34 gain 206 53 -120.53 gain 53 207 -111.54 gain 207 53 -113.50 gain 53 208 -120.16 gain 208 53 -122.29 gain 53 209 -115.46 gain 209 53 -113.59 gain 53 210 -116.70 gain 210 53 -121.42 gain 53 211 -113.79 gain 211 53 -114.76 gain 53 212 -119.26 gain 212 53 -117.78 gain 53 213 -112.63 gain 213 53 -116.02 gain 53 214 -117.21 gain 214 53 -116.89 gain 53 215 -113.51 gain 215 53 -114.29 gain 53 216 -112.93 gain 216 53 -114.53 gain 53 217 -114.27 gain 217 53 -119.69 gain 53 218 -119.56 gain 218 53 -117.18 gain 53 219 -106.70 gain 219 53 -107.14 gain 53 220 -119.03 gain 220 53 -115.81 gain 53 221 -110.24 gain 221 53 -111.53 gain 53 222 -116.80 gain 222 53 -119.46 gain 53 223 -117.16 gain 223 53 -121.83 gain 53 224 -119.18 gain 224 53 -124.35 gain 54 55 -84.84 gain 55 54 -79.99 gain 54 56 -93.72 gain 56 54 -93.77 gain 54 57 -99.80 gain 57 54 -96.64 gain 54 58 -112.45 gain 58 54 -111.00 gain 54 59 -112.07 gain 59 54 -113.06 gain 54 60 -114.60 gain 60 54 -112.87 gain 54 61 -117.09 gain 61 54 -116.79 gain 54 62 -112.38 gain 62 54 -111.64 gain 54 63 -103.48 gain 63 54 -103.97 gain 54 64 -111.97 gain 64 54 -107.26 gain 54 65 -106.62 gain 65 54 -100.50 gain 54 66 -95.92 gain 66 54 -92.88 gain 54 67 -96.53 gain 67 54 -92.36 gain 54 68 -91.97 gain 68 54 -95.09 gain 54 69 -90.06 gain 69 54 -86.91 gain 54 70 -95.48 gain 70 54 -93.85 gain 54 71 -103.36 gain 71 54 -101.60 gain 54 72 -92.27 gain 72 54 -88.48 gain 54 73 -104.20 gain 73 54 -101.26 gain 54 74 -108.86 gain 74 54 -108.20 gain 54 75 -122.20 gain 75 54 -119.21 gain 54 76 -113.25 gain 76 54 -111.28 gain 54 77 -117.70 gain 77 54 -118.70 gain 54 78 -101.36 gain 78 54 -99.27 gain 54 79 -109.40 gain 79 54 -105.25 gain 54 80 -112.96 gain 80 54 -110.32 gain 54 81 -107.34 gain 81 54 -102.66 gain 54 82 -100.52 gain 82 54 -98.69 gain 54 83 -105.02 gain 83 54 -102.98 gain 54 84 -92.74 gain 84 54 -88.51 gain 54 85 -98.36 gain 85 54 -92.40 gain 54 86 -99.16 gain 86 54 -101.59 gain 54 87 -105.49 gain 87 54 -103.57 gain 54 88 -102.50 gain 88 54 -101.12 gain 54 89 -111.73 gain 89 54 -110.61 gain 54 90 -115.54 gain 90 54 -115.79 gain 54 91 -119.00 gain 91 54 -118.54 gain 54 92 -108.56 gain 92 54 -108.66 gain 54 93 -111.06 gain 93 54 -112.70 gain 54 94 -112.53 gain 94 54 -109.08 gain 54 95 -109.40 gain 95 54 -109.17 gain 54 96 -99.59 gain 96 54 -94.83 gain 54 97 -108.54 gain 97 54 -107.19 gain 54 98 -102.22 gain 98 54 -99.62 gain 54 99 -107.78 gain 99 54 -108.81 gain 54 100 -98.70 gain 100 54 -101.44 gain 54 101 -99.80 gain 101 54 -98.48 gain 54 102 -101.90 gain 102 54 -100.70 gain 54 103 -115.83 gain 103 54 -114.47 gain 54 104 -114.66 gain 104 54 -109.12 gain 54 105 -116.30 gain 105 54 -116.08 gain 54 106 -118.60 gain 106 54 -117.10 gain 54 107 -112.89 gain 107 54 -111.69 gain 54 108 -109.40 gain 108 54 -107.86 gain 54 109 -107.25 gain 109 54 -107.56 gain 54 110 -110.16 gain 110 54 -107.54 gain 54 111 -103.29 gain 111 54 -103.33 gain 54 112 -106.71 gain 112 54 -106.49 gain 54 113 -105.83 gain 113 54 -107.31 gain 54 114 -106.63 gain 114 54 -105.02 gain 54 115 -109.46 gain 115 54 -102.78 gain 54 116 -109.02 gain 116 54 -108.07 gain 54 117 -105.97 gain 117 54 -107.83 gain 54 118 -113.47 gain 118 54 -112.71 gain 54 119 -113.25 gain 119 54 -111.96 gain 54 120 -116.28 gain 120 54 -110.53 gain 54 121 -123.03 gain 121 54 -120.06 gain 54 122 -114.32 gain 122 54 -113.86 gain 54 123 -117.64 gain 123 54 -114.69 gain 54 124 -112.42 gain 124 54 -109.46 gain 54 125 -109.27 gain 125 54 -107.92 gain 54 126 -108.18 gain 126 54 -103.14 gain 54 127 -105.41 gain 127 54 -101.95 gain 54 128 -110.66 gain 128 54 -109.06 gain 54 129 -108.42 gain 129 54 -104.23 gain 54 130 -107.41 gain 130 54 -105.91 gain 54 131 -111.87 gain 131 54 -108.23 gain 54 132 -107.30 gain 132 54 -106.27 gain 54 133 -114.63 gain 133 54 -111.71 gain 54 134 -108.88 gain 134 54 -105.77 gain 54 135 -115.65 gain 135 54 -114.24 gain 54 136 -115.40 gain 136 54 -115.28 gain 54 137 -116.68 gain 137 54 -114.34 gain 54 138 -120.46 gain 138 54 -114.36 gain 54 139 -112.83 gain 139 54 -108.62 gain 54 140 -107.85 gain 140 54 -109.70 gain 54 141 -109.43 gain 141 54 -106.17 gain 54 142 -116.03 gain 142 54 -117.58 gain 54 143 -119.35 gain 143 54 -116.45 gain 54 144 -113.73 gain 144 54 -111.73 gain 54 145 -109.65 gain 145 54 -107.24 gain 54 146 -116.51 gain 146 54 -111.66 gain 54 147 -110.78 gain 147 54 -109.77 gain 54 148 -111.01 gain 148 54 -108.93 gain 54 149 -109.18 gain 149 54 -106.36 gain 54 150 -117.38 gain 150 54 -119.67 gain 54 151 -118.49 gain 151 54 -114.34 gain 54 152 -118.56 gain 152 54 -116.23 gain 54 153 -125.64 gain 153 54 -125.75 gain 54 154 -119.40 gain 154 54 -115.12 gain 54 155 -113.85 gain 155 54 -113.40 gain 54 156 -117.01 gain 156 54 -114.58 gain 54 157 -119.13 gain 157 54 -118.66 gain 54 158 -109.44 gain 158 54 -109.40 gain 54 159 -113.99 gain 159 54 -107.59 gain 54 160 -112.48 gain 160 54 -108.35 gain 54 161 -119.00 gain 161 54 -117.73 gain 54 162 -111.39 gain 162 54 -107.20 gain 54 163 -112.98 gain 163 54 -105.98 gain 54 164 -113.24 gain 164 54 -107.99 gain 54 165 -121.22 gain 165 54 -118.90 gain 54 166 -121.05 gain 166 54 -121.40 gain 54 167 -110.19 gain 167 54 -109.67 gain 54 168 -121.91 gain 168 54 -122.73 gain 54 169 -121.32 gain 169 54 -114.49 gain 54 170 -120.81 gain 170 54 -124.47 gain 54 171 -111.61 gain 171 54 -111.69 gain 54 172 -117.62 gain 172 54 -110.80 gain 54 173 -119.01 gain 173 54 -116.86 gain 54 174 -114.11 gain 174 54 -111.72 gain 54 175 -105.68 gain 175 54 -102.50 gain 54 176 -116.75 gain 176 54 -113.51 gain 54 177 -119.84 gain 177 54 -118.09 gain 54 178 -117.80 gain 178 54 -117.00 gain 54 179 -116.27 gain 179 54 -116.50 gain 54 180 -120.92 gain 180 54 -116.95 gain 54 181 -119.55 gain 181 54 -120.03 gain 54 182 -116.80 gain 182 54 -113.58 gain 54 183 -118.61 gain 183 54 -116.69 gain 54 184 -111.56 gain 184 54 -111.69 gain 54 185 -117.19 gain 185 54 -112.75 gain 54 186 -122.82 gain 186 54 -117.37 gain 54 187 -123.35 gain 187 54 -121.99 gain 54 188 -114.78 gain 188 54 -116.18 gain 54 189 -113.17 gain 189 54 -113.97 gain 54 190 -115.16 gain 190 54 -111.62 gain 54 191 -118.31 gain 191 54 -117.81 gain 54 192 -112.25 gain 192 54 -109.07 gain 54 193 -118.87 gain 193 54 -119.66 gain 54 194 -114.29 gain 194 54 -114.66 gain 54 195 -124.25 gain 195 54 -122.81 gain 54 196 -122.11 gain 196 54 -119.69 gain 54 197 -111.15 gain 197 54 -111.40 gain 54 198 -124.60 gain 198 54 -128.78 gain 54 199 -118.24 gain 199 54 -113.99 gain 54 200 -116.15 gain 200 54 -108.67 gain 54 201 -114.50 gain 201 54 -110.83 gain 54 202 -121.07 gain 202 54 -118.94 gain 54 203 -117.68 gain 203 54 -112.18 gain 54 204 -111.94 gain 204 54 -113.52 gain 54 205 -122.27 gain 205 54 -121.91 gain 54 206 -121.53 gain 206 54 -119.15 gain 54 207 -114.86 gain 207 54 -113.24 gain 54 208 -112.74 gain 208 54 -111.29 gain 54 209 -116.31 gain 209 54 -110.86 gain 54 210 -126.27 gain 210 54 -127.41 gain 54 211 -116.43 gain 211 54 -113.82 gain 54 212 -115.69 gain 212 54 -110.64 gain 54 213 -114.15 gain 213 54 -113.97 gain 54 214 -121.68 gain 214 54 -117.79 gain 54 215 -121.98 gain 215 54 -119.18 gain 54 216 -116.95 gain 216 54 -114.98 gain 54 217 -118.93 gain 217 54 -120.78 gain 54 218 -113.22 gain 218 54 -107.26 gain 54 219 -118.57 gain 219 54 -115.43 gain 54 220 -117.87 gain 220 54 -111.08 gain 54 221 -116.51 gain 221 54 -114.23 gain 54 222 -116.78 gain 222 54 -115.87 gain 54 223 -118.31 gain 223 54 -119.40 gain 54 224 -122.48 gain 224 54 -124.07 gain 55 56 -87.36 gain 56 55 -92.26 gain 55 57 -86.86 gain 57 55 -88.54 gain 55 58 -96.71 gain 58 55 -100.11 gain 55 59 -95.15 gain 59 55 -100.98 gain 55 60 -113.20 gain 60 55 -116.31 gain 55 61 -112.13 gain 61 55 -116.68 gain 55 62 -112.47 gain 62 55 -116.58 gain 55 63 -102.67 gain 63 55 -108.01 gain 55 64 -110.19 gain 64 55 -110.32 gain 55 65 -106.96 gain 65 55 -105.69 gain 55 66 -92.80 gain 66 55 -94.60 gain 55 67 -99.07 gain 67 55 -99.75 gain 55 68 -91.91 gain 68 55 -99.89 gain 55 69 -90.54 gain 69 55 -92.24 gain 55 70 -82.78 gain 70 55 -86.00 gain 55 71 -88.32 gain 71 55 -91.41 gain 55 72 -94.27 gain 72 55 -95.33 gain 55 73 -92.09 gain 73 55 -93.99 gain 55 74 -95.27 gain 74 55 -99.45 gain 55 75 -117.03 gain 75 55 -118.89 gain 55 76 -109.44 gain 76 55 -112.32 gain 55 77 -106.48 gain 77 55 -112.32 gain 55 78 -105.13 gain 78 55 -107.89 gain 55 79 -107.17 gain 79 55 -107.86 gain 55 80 -109.17 gain 80 55 -111.37 gain 55 81 -97.16 gain 81 55 -97.33 gain 55 82 -92.70 gain 82 55 -95.73 gain 55 83 -100.09 gain 83 55 -102.90 gain 55 84 -83.28 gain 84 55 -83.89 gain 55 85 -91.80 gain 85 55 -90.69 gain 55 86 -93.89 gain 86 55 -101.16 gain 55 87 -93.16 gain 87 55 -96.09 gain 55 88 -98.78 gain 88 55 -102.24 gain 55 89 -97.95 gain 89 55 -101.67 gain 55 90 -118.52 gain 90 55 -123.62 gain 55 91 -108.69 gain 91 55 -113.07 gain 55 92 -113.02 gain 92 55 -117.97 gain 55 93 -104.57 gain 93 55 -111.06 gain 55 94 -104.00 gain 94 55 -105.40 gain 55 95 -106.70 gain 95 55 -111.32 gain 55 96 -102.33 gain 96 55 -102.41 gain 55 97 -98.45 gain 97 55 -101.94 gain 55 98 -91.75 gain 98 55 -94.00 gain 55 99 -93.44 gain 99 55 -99.32 gain 55 100 -103.20 gain 100 55 -110.80 gain 55 101 -99.56 gain 101 55 -103.07 gain 55 102 -92.59 gain 102 55 -96.24 gain 55 103 -98.31 gain 103 55 -101.79 gain 55 104 -104.05 gain 104 55 -103.36 gain 55 105 -120.43 gain 105 55 -125.06 gain 55 106 -111.04 gain 106 55 -114.39 gain 55 107 -111.64 gain 107 55 -115.29 gain 55 108 -110.36 gain 108 55 -113.67 gain 55 109 -109.17 gain 109 55 -114.33 gain 55 110 -108.42 gain 110 55 -110.64 gain 55 111 -99.11 gain 111 55 -104.00 gain 55 112 -105.10 gain 112 55 -109.73 gain 55 113 -103.92 gain 113 55 -110.26 gain 55 114 -105.45 gain 114 55 -108.69 gain 55 115 -95.56 gain 115 55 -93.72 gain 55 116 -104.05 gain 116 55 -107.95 gain 55 117 -94.12 gain 117 55 -100.82 gain 55 118 -107.00 gain 118 55 -111.08 gain 55 119 -110.18 gain 119 55 -113.73 gain 55 120 -117.29 gain 120 55 -116.39 gain 55 121 -116.16 gain 121 55 -118.03 gain 55 122 -113.26 gain 122 55 -117.64 gain 55 123 -111.93 gain 123 55 -113.82 gain 55 124 -107.97 gain 124 55 -109.86 gain 55 125 -110.25 gain 125 55 -113.74 gain 55 126 -106.83 gain 126 55 -106.64 gain 55 127 -102.40 gain 127 55 -103.78 gain 55 128 -106.97 gain 128 55 -110.23 gain 55 129 -95.94 gain 129 55 -96.60 gain 55 130 -97.26 gain 130 55 -100.60 gain 55 131 -100.84 gain 131 55 -102.04 gain 55 132 -104.24 gain 132 55 -108.07 gain 55 133 -107.02 gain 133 55 -108.95 gain 55 134 -109.85 gain 134 55 -111.58 gain 55 135 -115.67 gain 135 55 -119.11 gain 55 136 -113.61 gain 136 55 -118.34 gain 55 137 -110.57 gain 137 55 -113.08 gain 55 138 -112.11 gain 138 55 -110.85 gain 55 139 -112.25 gain 139 55 -112.90 gain 55 140 -116.06 gain 140 55 -122.76 gain 55 141 -102.37 gain 141 55 -103.96 gain 55 142 -101.69 gain 142 55 -108.09 gain 55 143 -105.01 gain 143 55 -106.96 gain 55 144 -109.38 gain 144 55 -112.23 gain 55 145 -105.32 gain 145 55 -107.76 gain 55 146 -105.33 gain 146 55 -105.32 gain 55 147 -107.15 gain 147 55 -110.99 gain 55 148 -104.70 gain 148 55 -107.47 gain 55 149 -109.30 gain 149 55 -111.33 gain 55 150 -114.68 gain 150 55 -121.81 gain 55 151 -120.13 gain 151 55 -120.83 gain 55 152 -107.20 gain 152 55 -109.72 gain 55 153 -121.33 gain 153 55 -126.28 gain 55 154 -113.21 gain 154 55 -113.78 gain 55 155 -108.27 gain 155 55 -112.66 gain 55 156 -115.86 gain 156 55 -118.27 gain 55 157 -114.29 gain 157 55 -118.66 gain 55 158 -111.90 gain 158 55 -116.71 gain 55 159 -108.97 gain 159 55 -107.41 gain 55 160 -101.48 gain 160 55 -102.20 gain 55 161 -103.19 gain 161 55 -106.77 gain 55 162 -107.38 gain 162 55 -108.05 gain 55 163 -111.70 gain 163 55 -109.54 gain 55 164 -112.78 gain 164 55 -112.37 gain 55 165 -115.32 gain 165 55 -117.84 gain 55 166 -116.94 gain 166 55 -122.14 gain 55 167 -111.92 gain 167 55 -116.24 gain 55 168 -114.78 gain 168 55 -120.45 gain 55 169 -107.09 gain 169 55 -105.10 gain 55 170 -106.67 gain 170 55 -115.18 gain 55 171 -111.17 gain 171 55 -116.10 gain 55 172 -112.93 gain 172 55 -110.97 gain 55 173 -118.65 gain 173 55 -121.34 gain 55 174 -111.72 gain 174 55 -114.18 gain 55 175 -108.52 gain 175 55 -110.18 gain 55 176 -110.28 gain 176 55 -111.90 gain 55 177 -114.55 gain 177 55 -117.65 gain 55 178 -104.23 gain 178 55 -108.28 gain 55 179 -112.84 gain 179 55 -117.92 gain 55 180 -123.62 gain 180 55 -124.50 gain 55 181 -115.05 gain 181 55 -120.37 gain 55 182 -110.52 gain 182 55 -112.14 gain 55 183 -113.04 gain 183 55 -115.96 gain 55 184 -113.55 gain 184 55 -118.53 gain 55 185 -110.27 gain 185 55 -110.67 gain 55 186 -112.20 gain 186 55 -111.60 gain 55 187 -106.40 gain 187 55 -109.89 gain 55 188 -109.22 gain 188 55 -115.47 gain 55 189 -102.14 gain 189 55 -107.78 gain 55 190 -112.16 gain 190 55 -113.47 gain 55 191 -110.94 gain 191 55 -115.28 gain 55 192 -112.10 gain 192 55 -113.76 gain 55 193 -115.94 gain 193 55 -121.58 gain 55 194 -107.91 gain 194 55 -113.12 gain 55 195 -112.46 gain 195 55 -115.86 gain 55 196 -121.48 gain 196 55 -123.91 gain 55 197 -119.20 gain 197 55 -124.29 gain 55 198 -122.73 gain 198 55 -131.75 gain 55 199 -112.21 gain 199 55 -112.81 gain 55 200 -116.60 gain 200 55 -113.97 gain 55 201 -111.66 gain 201 55 -112.84 gain 55 202 -112.89 gain 202 55 -115.60 gain 55 203 -108.70 gain 203 55 -108.04 gain 55 204 -110.42 gain 204 55 -116.84 gain 55 205 -110.61 gain 205 55 -115.10 gain 55 206 -113.39 gain 206 55 -115.85 gain 55 207 -106.73 gain 207 55 -109.96 gain 55 208 -105.52 gain 208 55 -108.92 gain 55 209 -108.65 gain 209 55 -108.05 gain 55 210 -119.94 gain 210 55 -125.93 gain 55 211 -120.62 gain 211 55 -122.87 gain 55 212 -115.32 gain 212 55 -115.12 gain 55 213 -108.46 gain 213 55 -113.12 gain 55 214 -106.88 gain 214 55 -107.84 gain 55 215 -111.84 gain 215 55 -113.89 gain 55 216 -123.89 gain 216 55 -126.77 gain 55 217 -108.12 gain 217 55 -114.82 gain 55 218 -113.39 gain 218 55 -112.28 gain 55 219 -113.21 gain 219 55 -114.92 gain 55 220 -115.00 gain 220 55 -113.06 gain 55 221 -117.40 gain 221 55 -119.97 gain 55 222 -116.52 gain 222 55 -120.45 gain 55 223 -117.27 gain 223 55 -123.21 gain 55 224 -112.48 gain 224 55 -118.91 gain 56 57 -80.54 gain 57 56 -77.33 gain 56 58 -92.41 gain 58 56 -90.90 gain 56 59 -96.64 gain 59 56 -97.57 gain 56 60 -118.87 gain 60 56 -117.09 gain 56 61 -117.42 gain 61 56 -117.07 gain 56 62 -119.31 gain 62 56 -118.52 gain 56 63 -109.27 gain 63 56 -109.71 gain 56 64 -110.84 gain 64 56 -106.08 gain 56 65 -102.85 gain 65 56 -96.68 gain 56 66 -108.65 gain 66 56 -105.55 gain 56 67 -99.20 gain 67 56 -94.98 gain 56 68 -104.82 gain 68 56 -107.90 gain 56 69 -97.49 gain 69 56 -94.29 gain 56 70 -89.63 gain 70 56 -87.95 gain 56 71 -87.18 gain 71 56 -85.37 gain 56 72 -86.30 gain 72 56 -82.47 gain 56 73 -95.33 gain 73 56 -92.33 gain 56 74 -104.54 gain 74 56 -103.83 gain 56 75 -119.01 gain 75 56 -115.97 gain 56 76 -119.04 gain 76 56 -117.03 gain 56 77 -121.47 gain 77 56 -122.43 gain 56 78 -108.50 gain 78 56 -106.36 gain 56 79 -112.97 gain 79 56 -108.76 gain 56 80 -111.11 gain 80 56 -108.42 gain 56 81 -105.93 gain 81 56 -101.20 gain 56 82 -110.19 gain 82 56 -108.32 gain 56 83 -99.86 gain 83 56 -97.77 gain 56 84 -100.47 gain 84 56 -96.19 gain 56 85 -94.15 gain 85 56 -88.14 gain 56 86 -91.57 gain 86 56 -93.95 gain 56 87 -95.95 gain 87 56 -93.97 gain 56 88 -100.78 gain 88 56 -99.35 gain 56 89 -108.02 gain 89 56 -106.84 gain 56 90 -118.51 gain 90 56 -118.71 gain 56 91 -116.03 gain 91 56 -115.51 gain 56 92 -113.19 gain 92 56 -113.24 gain 56 93 -115.01 gain 93 56 -116.60 gain 56 94 -115.27 gain 94 56 -111.77 gain 56 95 -109.11 gain 95 56 -108.83 gain 56 96 -115.82 gain 96 56 -111.00 gain 56 97 -108.54 gain 97 56 -107.14 gain 56 98 -101.73 gain 98 56 -99.07 gain 56 99 -101.24 gain 99 56 -102.22 gain 56 100 -103.17 gain 100 56 -105.87 gain 56 101 -98.74 gain 101 56 -97.36 gain 56 102 -93.27 gain 102 56 -92.02 gain 56 103 -103.44 gain 103 56 -102.02 gain 56 104 -107.19 gain 104 56 -101.61 gain 56 105 -112.41 gain 105 56 -112.14 gain 56 106 -111.44 gain 106 56 -109.89 gain 56 107 -117.24 gain 107 56 -115.99 gain 56 108 -109.92 gain 108 56 -108.33 gain 56 109 -113.80 gain 109 56 -114.07 gain 56 110 -112.30 gain 110 56 -109.63 gain 56 111 -109.28 gain 111 56 -109.27 gain 56 112 -114.79 gain 112 56 -114.53 gain 56 113 -114.53 gain 113 56 -115.97 gain 56 114 -110.70 gain 114 56 -109.04 gain 56 115 -103.88 gain 115 56 -97.14 gain 56 116 -102.88 gain 116 56 -101.88 gain 56 117 -104.26 gain 117 56 -106.06 gain 56 118 -112.01 gain 118 56 -111.20 gain 56 119 -112.73 gain 119 56 -111.39 gain 56 120 -115.03 gain 120 56 -109.23 gain 56 121 -121.69 gain 121 56 -118.66 gain 56 122 -116.87 gain 122 56 -116.35 gain 56 123 -116.42 gain 123 56 -113.42 gain 56 124 -113.20 gain 124 56 -110.19 gain 56 125 -114.91 gain 125 56 -113.51 gain 56 126 -112.69 gain 126 56 -107.61 gain 56 127 -108.33 gain 127 56 -104.82 gain 56 128 -105.27 gain 128 56 -103.62 gain 56 129 -111.10 gain 129 56 -106.87 gain 56 130 -110.63 gain 130 56 -109.08 gain 56 131 -106.08 gain 131 56 -102.39 gain 56 132 -108.57 gain 132 56 -107.50 gain 56 133 -106.87 gain 133 56 -103.91 gain 56 134 -116.23 gain 134 56 -113.06 gain 56 135 -124.63 gain 135 56 -123.17 gain 56 136 -120.04 gain 136 56 -119.87 gain 56 137 -120.12 gain 137 56 -117.73 gain 56 138 -114.71 gain 138 56 -108.56 gain 56 139 -115.76 gain 139 56 -111.51 gain 56 140 -112.85 gain 140 56 -114.65 gain 56 141 -112.58 gain 141 56 -109.27 gain 56 142 -120.11 gain 142 56 -121.62 gain 56 143 -113.51 gain 143 56 -110.55 gain 56 144 -113.42 gain 144 56 -111.37 gain 56 145 -109.87 gain 145 56 -107.41 gain 56 146 -112.68 gain 146 56 -107.77 gain 56 147 -115.48 gain 147 56 -114.43 gain 56 148 -116.71 gain 148 56 -114.59 gain 56 149 -117.54 gain 149 56 -114.67 gain 56 150 -121.68 gain 150 56 -123.92 gain 56 151 -119.83 gain 151 56 -115.64 gain 56 152 -120.15 gain 152 56 -117.78 gain 56 153 -125.50 gain 153 56 -125.56 gain 56 154 -114.32 gain 154 56 -110.00 gain 56 155 -121.62 gain 155 56 -121.12 gain 56 156 -114.54 gain 156 56 -112.06 gain 56 157 -114.28 gain 157 56 -113.75 gain 56 158 -114.30 gain 158 56 -114.22 gain 56 159 -113.99 gain 159 56 -107.54 gain 56 160 -115.75 gain 160 56 -111.57 gain 56 161 -114.24 gain 161 56 -112.92 gain 56 162 -110.13 gain 162 56 -105.90 gain 56 163 -112.40 gain 163 56 -105.35 gain 56 164 -114.46 gain 164 56 -109.16 gain 56 165 -118.56 gain 165 56 -116.19 gain 56 166 -119.17 gain 166 56 -119.47 gain 56 167 -121.54 gain 167 56 -120.96 gain 56 168 -125.75 gain 168 56 -126.52 gain 56 169 -113.86 gain 169 56 -106.98 gain 56 170 -125.31 gain 170 56 -128.92 gain 56 171 -114.08 gain 171 56 -114.12 gain 56 172 -113.02 gain 172 56 -106.16 gain 56 173 -117.32 gain 173 56 -115.12 gain 56 174 -117.60 gain 174 56 -115.15 gain 56 175 -109.99 gain 175 56 -106.75 gain 56 176 -117.61 gain 176 56 -114.32 gain 56 177 -112.33 gain 177 56 -110.54 gain 56 178 -123.08 gain 178 56 -122.23 gain 56 179 -114.37 gain 179 56 -114.56 gain 56 180 -127.78 gain 180 56 -123.76 gain 56 181 -114.92 gain 181 56 -115.34 gain 56 182 -120.68 gain 182 56 -117.41 gain 56 183 -111.97 gain 183 56 -109.99 gain 56 184 -119.51 gain 184 56 -119.59 gain 56 185 -117.57 gain 185 56 -113.07 gain 56 186 -114.20 gain 186 56 -108.71 gain 56 187 -117.66 gain 187 56 -116.25 gain 56 188 -118.00 gain 188 56 -119.35 gain 56 189 -120.02 gain 189 56 -120.76 gain 56 190 -119.63 gain 190 56 -116.05 gain 56 191 -120.76 gain 191 56 -120.21 gain 56 192 -117.84 gain 192 56 -114.61 gain 56 193 -118.59 gain 193 56 -119.33 gain 56 194 -113.97 gain 194 56 -114.28 gain 56 195 -122.27 gain 195 56 -120.77 gain 56 196 -111.94 gain 196 56 -109.47 gain 56 197 -126.57 gain 197 56 -126.77 gain 56 198 -131.50 gain 198 56 -135.64 gain 56 199 -121.43 gain 199 56 -117.13 gain 56 200 -119.73 gain 200 56 -112.20 gain 56 201 -116.38 gain 201 56 -112.67 gain 56 202 -116.48 gain 202 56 -114.29 gain 56 203 -115.33 gain 203 56 -109.77 gain 56 204 -120.64 gain 204 56 -122.17 gain 56 205 -123.11 gain 205 56 -122.71 gain 56 206 -117.97 gain 206 56 -115.54 gain 56 207 -117.77 gain 207 56 -116.10 gain 56 208 -118.82 gain 208 56 -117.33 gain 56 209 -114.56 gain 209 56 -109.06 gain 56 210 -123.35 gain 210 56 -124.44 gain 56 211 -124.44 gain 211 56 -121.79 gain 56 212 -113.18 gain 212 56 -108.08 gain 56 213 -128.60 gain 213 56 -128.36 gain 56 214 -107.88 gain 214 56 -103.94 gain 56 215 -116.05 gain 215 56 -113.20 gain 56 216 -125.61 gain 216 56 -123.59 gain 56 217 -126.16 gain 217 56 -127.96 gain 56 218 -122.23 gain 218 56 -116.22 gain 56 219 -116.34 gain 219 56 -113.15 gain 56 220 -121.24 gain 220 56 -114.40 gain 56 221 -121.33 gain 221 56 -119.00 gain 56 222 -122.15 gain 222 56 -121.18 gain 56 223 -113.50 gain 223 56 -114.54 gain 56 224 -121.25 gain 224 56 -122.79 gain 57 58 -89.09 gain 58 57 -90.79 gain 57 59 -89.19 gain 59 57 -93.34 gain 57 60 -111.65 gain 60 57 -113.08 gain 57 61 -114.94 gain 61 57 -117.80 gain 57 62 -115.78 gain 62 57 -118.21 gain 57 63 -111.40 gain 63 57 -115.06 gain 57 64 -110.25 gain 64 57 -108.70 gain 57 65 -117.57 gain 65 57 -114.61 gain 57 66 -106.64 gain 66 57 -106.76 gain 57 67 -109.02 gain 67 57 -108.02 gain 57 68 -96.17 gain 68 57 -102.46 gain 57 69 -102.15 gain 69 57 -102.16 gain 57 70 -89.86 gain 70 57 -91.39 gain 57 71 -86.70 gain 71 57 -88.10 gain 57 72 -84.29 gain 72 57 -83.67 gain 57 73 -93.30 gain 73 57 -93.51 gain 57 74 -95.46 gain 74 57 -97.96 gain 57 75 -115.92 gain 75 57 -116.09 gain 57 76 -118.67 gain 76 57 -119.87 gain 57 77 -116.23 gain 77 57 -120.40 gain 57 78 -115.45 gain 78 57 -116.52 gain 57 79 -108.06 gain 79 57 -107.07 gain 57 80 -111.75 gain 80 57 -112.27 gain 57 81 -102.18 gain 81 57 -100.67 gain 57 82 -103.20 gain 82 57 -104.54 gain 57 83 -98.75 gain 83 57 -99.87 gain 57 84 -99.22 gain 84 57 -98.14 gain 57 85 -90.66 gain 85 57 -87.87 gain 57 86 -93.40 gain 86 57 -98.98 gain 57 87 -94.81 gain 87 57 -96.04 gain 57 88 -96.08 gain 88 57 -97.86 gain 57 89 -96.85 gain 89 57 -98.88 gain 57 90 -115.43 gain 90 57 -118.84 gain 57 91 -112.75 gain 91 57 -115.45 gain 57 92 -115.39 gain 92 57 -118.65 gain 57 93 -107.79 gain 93 57 -112.59 gain 57 94 -110.11 gain 94 57 -109.81 gain 57 95 -114.65 gain 95 57 -117.59 gain 57 96 -101.46 gain 96 57 -99.86 gain 57 97 -112.25 gain 97 57 -114.05 gain 57 98 -110.42 gain 98 57 -110.98 gain 57 99 -103.49 gain 99 57 -107.68 gain 57 100 -97.87 gain 100 57 -103.78 gain 57 101 -102.59 gain 101 57 -104.43 gain 57 102 -93.95 gain 102 57 -95.91 gain 57 103 -92.12 gain 103 57 -93.92 gain 57 104 -100.42 gain 104 57 -98.04 gain 57 105 -116.63 gain 105 57 -119.57 gain 57 106 -119.21 gain 106 57 -120.87 gain 57 107 -109.82 gain 107 57 -111.78 gain 57 108 -120.07 gain 108 57 -121.69 gain 57 109 -107.29 gain 109 57 -110.76 gain 57 110 -108.77 gain 110 57 -109.31 gain 57 111 -109.28 gain 111 57 -112.48 gain 57 112 -106.33 gain 112 57 -109.28 gain 57 113 -107.12 gain 113 57 -111.77 gain 57 114 -103.02 gain 114 57 -104.57 gain 57 115 -111.70 gain 115 57 -108.18 gain 57 116 -102.79 gain 116 57 -105.00 gain 57 117 -94.26 gain 117 57 -99.28 gain 57 118 -100.16 gain 118 57 -102.56 gain 57 119 -103.70 gain 119 57 -105.57 gain 57 120 -111.28 gain 120 57 -108.69 gain 57 121 -117.62 gain 121 57 -117.81 gain 57 122 -110.55 gain 122 57 -113.24 gain 57 123 -118.47 gain 123 57 -118.68 gain 57 124 -116.23 gain 124 57 -116.43 gain 57 125 -116.85 gain 125 57 -118.66 gain 57 126 -107.80 gain 126 57 -105.92 gain 57 127 -109.36 gain 127 57 -109.06 gain 57 128 -114.65 gain 128 57 -116.22 gain 57 129 -110.65 gain 129 57 -109.62 gain 57 130 -107.37 gain 130 57 -109.02 gain 57 131 -109.92 gain 131 57 -109.44 gain 57 132 -104.65 gain 132 57 -106.79 gain 57 133 -106.81 gain 133 57 -107.06 gain 57 134 -102.41 gain 134 57 -102.46 gain 57 135 -114.88 gain 135 57 -116.63 gain 57 136 -116.91 gain 136 57 -119.95 gain 57 137 -116.80 gain 137 57 -117.63 gain 57 138 -113.16 gain 138 57 -110.21 gain 57 139 -108.11 gain 139 57 -107.06 gain 57 140 -112.74 gain 140 57 -117.75 gain 57 141 -108.28 gain 141 57 -108.18 gain 57 142 -109.68 gain 142 57 -114.39 gain 57 143 -103.33 gain 143 57 -103.59 gain 57 144 -109.26 gain 144 57 -110.41 gain 57 145 -111.69 gain 145 57 -112.45 gain 57 146 -109.24 gain 146 57 -107.54 gain 57 147 -109.12 gain 147 57 -111.28 gain 57 148 -106.75 gain 148 57 -107.84 gain 57 149 -108.87 gain 149 57 -109.20 gain 57 150 -111.64 gain 150 57 -117.09 gain 57 151 -122.87 gain 151 57 -121.88 gain 57 152 -117.59 gain 152 57 -118.43 gain 57 153 -112.60 gain 153 57 -115.87 gain 57 154 -110.70 gain 154 57 -109.58 gain 57 155 -111.96 gain 155 57 -114.68 gain 57 156 -107.48 gain 156 57 -108.21 gain 57 157 -115.55 gain 157 57 -118.24 gain 57 158 -107.12 gain 158 57 -110.24 gain 57 159 -117.55 gain 159 57 -114.31 gain 57 160 -116.23 gain 160 57 -115.26 gain 57 161 -105.66 gain 161 57 -107.56 gain 57 162 -114.38 gain 162 57 -113.36 gain 57 163 -112.80 gain 163 57 -108.96 gain 57 164 -106.79 gain 164 57 -104.70 gain 57 165 -117.66 gain 165 57 -118.50 gain 57 166 -120.13 gain 166 57 -123.65 gain 57 167 -115.07 gain 167 57 -117.71 gain 57 168 -119.59 gain 168 57 -123.58 gain 57 169 -115.22 gain 169 57 -111.55 gain 57 170 -105.82 gain 170 57 -112.64 gain 57 171 -112.03 gain 171 57 -115.28 gain 57 172 -112.27 gain 172 57 -108.62 gain 57 173 -114.31 gain 173 57 -115.32 gain 57 174 -107.09 gain 174 57 -107.86 gain 57 175 -110.82 gain 175 57 -110.80 gain 57 176 -114.99 gain 176 57 -114.92 gain 57 177 -108.21 gain 177 57 -109.62 gain 57 178 -114.18 gain 178 57 -116.55 gain 57 179 -112.97 gain 179 57 -116.36 gain 57 180 -117.47 gain 180 57 -116.66 gain 57 181 -113.39 gain 181 57 -117.03 gain 57 182 -120.38 gain 182 57 -120.32 gain 57 183 -121.94 gain 183 57 -123.18 gain 57 184 -121.19 gain 184 57 -124.48 gain 57 185 -120.68 gain 185 57 -119.40 gain 57 186 -121.46 gain 186 57 -119.17 gain 57 187 -114.38 gain 187 57 -116.18 gain 57 188 -114.87 gain 188 57 -119.43 gain 57 189 -113.05 gain 189 57 -117.01 gain 57 190 -112.89 gain 190 57 -112.52 gain 57 191 -117.06 gain 191 57 -119.71 gain 57 192 -113.86 gain 192 57 -113.84 gain 57 193 -111.70 gain 193 57 -115.66 gain 57 194 -116.13 gain 194 57 -119.65 gain 57 195 -121.89 gain 195 57 -123.60 gain 57 196 -119.21 gain 196 57 -119.95 gain 57 197 -114.58 gain 197 57 -117.99 gain 57 198 -117.39 gain 198 57 -124.74 gain 57 199 -113.35 gain 199 57 -112.26 gain 57 200 -117.62 gain 200 57 -113.30 gain 57 201 -110.02 gain 201 57 -109.51 gain 57 202 -109.31 gain 202 57 -110.33 gain 57 203 -120.55 gain 203 57 -118.21 gain 57 204 -116.50 gain 204 57 -121.24 gain 57 205 -112.00 gain 205 57 -114.81 gain 57 206 -116.94 gain 206 57 -117.72 gain 57 207 -112.82 gain 207 57 -114.36 gain 57 208 -113.92 gain 208 57 -115.63 gain 57 209 -114.29 gain 209 57 -112.01 gain 57 210 -118.03 gain 210 57 -122.33 gain 57 211 -119.58 gain 211 57 -120.14 gain 57 212 -115.59 gain 212 57 -113.70 gain 57 213 -117.96 gain 213 57 -120.93 gain 57 214 -120.02 gain 214 57 -119.29 gain 57 215 -116.46 gain 215 57 -116.82 gain 57 216 -122.88 gain 216 57 -124.07 gain 57 217 -120.56 gain 217 57 -125.57 gain 57 218 -121.33 gain 218 57 -118.53 gain 57 219 -116.14 gain 219 57 -116.16 gain 57 220 -114.86 gain 220 57 -111.23 gain 57 221 -115.06 gain 221 57 -115.93 gain 57 222 -117.32 gain 222 57 -119.56 gain 57 223 -115.12 gain 223 57 -119.37 gain 57 224 -117.73 gain 224 57 -122.49 gain 58 59 -81.36 gain 59 58 -83.80 gain 58 60 -120.83 gain 60 58 -120.55 gain 58 61 -115.52 gain 61 58 -116.68 gain 58 62 -120.66 gain 62 58 -121.38 gain 58 63 -116.88 gain 63 58 -118.83 gain 58 64 -110.52 gain 64 58 -107.26 gain 58 65 -114.88 gain 65 58 -110.22 gain 58 66 -106.95 gain 66 58 -105.36 gain 58 67 -109.27 gain 67 58 -106.56 gain 58 68 -104.65 gain 68 58 -109.23 gain 58 69 -104.12 gain 69 58 -102.42 gain 58 70 -99.54 gain 70 58 -99.36 gain 58 71 -99.77 gain 71 58 -99.47 gain 58 72 -96.17 gain 72 58 -93.84 gain 58 73 -84.11 gain 73 58 -82.61 gain 58 74 -99.08 gain 74 58 -99.87 gain 58 75 -130.72 gain 75 58 -129.19 gain 58 76 -116.00 gain 76 58 -115.49 gain 58 77 -113.99 gain 77 58 -116.44 gain 58 78 -115.17 gain 78 58 -114.53 gain 58 79 -116.45 gain 79 58 -113.75 gain 58 80 -116.06 gain 80 58 -114.88 gain 58 81 -113.33 gain 81 58 -110.11 gain 58 82 -108.42 gain 82 58 -108.05 gain 58 83 -117.09 gain 83 58 -116.51 gain 58 84 -105.77 gain 84 58 -102.99 gain 58 85 -99.33 gain 85 58 -94.82 gain 58 86 -100.46 gain 86 58 -104.34 gain 58 87 -89.78 gain 87 58 -89.31 gain 58 88 -89.74 gain 88 58 -89.82 gain 58 89 -93.05 gain 89 58 -93.38 gain 58 90 -122.13 gain 90 58 -123.84 gain 58 91 -120.83 gain 91 58 -121.82 gain 58 92 -112.05 gain 92 58 -113.61 gain 58 93 -121.86 gain 93 58 -124.95 gain 58 94 -116.26 gain 94 58 -114.26 gain 58 95 -117.41 gain 95 58 -118.64 gain 58 96 -112.69 gain 96 58 -109.38 gain 58 97 -115.02 gain 97 58 -115.12 gain 58 98 -104.16 gain 98 58 -103.01 gain 58 99 -105.52 gain 99 58 -108.01 gain 58 100 -99.92 gain 100 58 -104.12 gain 58 101 -103.62 gain 101 58 -103.75 gain 58 102 -100.03 gain 102 58 -100.29 gain 58 103 -94.84 gain 103 58 -94.93 gain 58 104 -97.81 gain 104 58 -93.72 gain 58 105 -116.78 gain 105 58 -118.02 gain 58 106 -112.83 gain 106 58 -112.79 gain 58 107 -111.15 gain 107 58 -111.41 gain 58 108 -116.48 gain 108 58 -116.40 gain 58 109 -123.88 gain 109 58 -125.64 gain 58 110 -115.63 gain 110 58 -114.46 gain 58 111 -107.74 gain 111 58 -109.24 gain 58 112 -109.22 gain 112 58 -110.47 gain 58 113 -106.61 gain 113 58 -109.55 gain 58 114 -115.26 gain 114 58 -115.10 gain 58 115 -110.02 gain 115 58 -104.78 gain 58 116 -108.49 gain 116 58 -109.00 gain 58 117 -101.70 gain 117 58 -105.01 gain 58 118 -94.46 gain 118 58 -95.15 gain 58 119 -106.57 gain 119 58 -106.73 gain 58 120 -116.76 gain 120 58 -112.47 gain 58 121 -116.87 gain 121 58 -115.35 gain 58 122 -119.01 gain 122 58 -120.00 gain 58 123 -117.43 gain 123 58 -115.93 gain 58 124 -118.56 gain 124 58 -117.06 gain 58 125 -110.91 gain 125 58 -111.01 gain 58 126 -114.65 gain 126 58 -111.07 gain 58 127 -109.98 gain 127 58 -107.97 gain 58 128 -110.53 gain 128 58 -110.39 gain 58 129 -106.62 gain 129 58 -103.89 gain 58 130 -116.60 gain 130 58 -116.54 gain 58 131 -112.50 gain 131 58 -110.31 gain 58 132 -113.04 gain 132 58 -113.47 gain 58 133 -103.91 gain 133 58 -102.45 gain 58 134 -103.71 gain 134 58 -102.05 gain 58 135 -123.02 gain 135 58 -123.06 gain 58 136 -116.64 gain 136 58 -117.98 gain 58 137 -119.27 gain 137 58 -118.39 gain 58 138 -113.88 gain 138 58 -109.23 gain 58 139 -123.12 gain 139 58 -120.37 gain 58 140 -110.65 gain 140 58 -113.96 gain 58 141 -116.57 gain 141 58 -114.76 gain 58 142 -112.20 gain 142 58 -115.20 gain 58 143 -115.99 gain 143 58 -114.54 gain 58 144 -111.15 gain 144 58 -110.60 gain 58 145 -109.83 gain 145 58 -108.87 gain 58 146 -107.12 gain 146 58 -103.72 gain 58 147 -103.05 gain 147 58 -103.50 gain 58 148 -106.93 gain 148 58 -106.31 gain 58 149 -108.70 gain 149 58 -107.33 gain 58 150 -114.67 gain 150 58 -118.41 gain 58 151 -121.09 gain 151 58 -118.40 gain 58 152 -123.30 gain 152 58 -122.43 gain 58 153 -117.18 gain 153 58 -118.74 gain 58 154 -103.11 gain 154 58 -100.29 gain 58 155 -108.16 gain 155 58 -109.17 gain 58 156 -111.22 gain 156 58 -110.24 gain 58 157 -107.66 gain 157 58 -108.64 gain 58 158 -113.16 gain 158 58 -114.58 gain 58 159 -111.23 gain 159 58 -106.28 gain 58 160 -110.83 gain 160 58 -108.16 gain 58 161 -109.23 gain 161 58 -109.42 gain 58 162 -114.03 gain 162 58 -111.29 gain 58 163 -112.60 gain 163 58 -107.06 gain 58 164 -118.94 gain 164 58 -115.14 gain 58 165 -124.34 gain 165 58 -123.47 gain 58 166 -114.80 gain 166 58 -116.60 gain 58 167 -124.95 gain 167 58 -125.88 gain 58 168 -115.32 gain 168 58 -117.59 gain 58 169 -123.47 gain 169 58 -118.09 gain 58 170 -118.68 gain 170 58 -123.80 gain 58 171 -116.97 gain 171 58 -118.51 gain 58 172 -120.41 gain 172 58 -115.05 gain 58 173 -113.02 gain 173 58 -112.32 gain 58 174 -118.28 gain 174 58 -117.34 gain 58 175 -114.51 gain 175 58 -112.78 gain 58 176 -114.98 gain 176 58 -113.21 gain 58 177 -116.55 gain 177 58 -116.26 gain 58 178 -110.62 gain 178 58 -111.28 gain 58 179 -111.13 gain 179 58 -112.82 gain 58 180 -123.53 gain 180 58 -121.02 gain 58 181 -122.24 gain 181 58 -124.18 gain 58 182 -119.63 gain 182 58 -117.86 gain 58 183 -118.03 gain 183 58 -117.56 gain 58 184 -123.72 gain 184 58 -125.30 gain 58 185 -112.52 gain 185 58 -109.53 gain 58 186 -115.39 gain 186 58 -111.40 gain 58 187 -116.23 gain 187 58 -116.33 gain 58 188 -112.07 gain 188 58 -114.92 gain 58 189 -111.57 gain 189 58 -113.83 gain 58 190 -114.46 gain 190 58 -112.37 gain 58 191 -105.82 gain 191 58 -106.77 gain 58 192 -111.62 gain 192 58 -109.89 gain 58 193 -119.17 gain 193 58 -121.42 gain 58 194 -110.72 gain 194 58 -112.54 gain 58 195 -125.04 gain 195 58 -125.05 gain 58 196 -123.13 gain 196 58 -122.16 gain 58 197 -119.33 gain 197 58 -121.03 gain 58 198 -117.19 gain 198 58 -122.83 gain 58 199 -118.17 gain 199 58 -115.37 gain 58 200 -114.87 gain 200 58 -108.84 gain 58 201 -120.45 gain 201 58 -118.25 gain 58 202 -124.49 gain 202 58 -123.80 gain 58 203 -110.20 gain 203 58 -106.14 gain 58 204 -116.68 gain 204 58 -119.71 gain 58 205 -114.25 gain 205 58 -115.35 gain 58 206 -115.32 gain 206 58 -114.40 gain 58 207 -114.89 gain 207 58 -114.73 gain 58 208 -115.00 gain 208 58 -115.00 gain 58 209 -111.29 gain 209 58 -107.30 gain 58 210 -122.69 gain 210 58 -125.28 gain 58 211 -118.53 gain 211 58 -117.39 gain 58 212 -122.12 gain 212 58 -118.52 gain 58 213 -128.23 gain 213 58 -129.50 gain 58 214 -118.02 gain 214 58 -115.58 gain 58 215 -121.22 gain 215 58 -119.88 gain 58 216 -115.94 gain 216 58 -115.43 gain 58 217 -105.60 gain 217 58 -108.90 gain 58 218 -121.39 gain 218 58 -116.89 gain 58 219 -121.78 gain 219 58 -120.09 gain 58 220 -119.54 gain 220 58 -114.20 gain 58 221 -114.70 gain 221 58 -113.87 gain 58 222 -115.81 gain 222 58 -116.35 gain 58 223 -117.36 gain 223 58 -119.91 gain 58 224 -112.30 gain 224 58 -115.35 gain 59 60 -119.33 gain 60 59 -116.61 gain 59 61 -123.44 gain 61 59 -122.16 gain 59 62 -111.56 gain 62 59 -109.84 gain 59 63 -117.45 gain 63 59 -116.97 gain 59 64 -118.38 gain 64 59 -112.68 gain 59 65 -110.19 gain 65 59 -103.09 gain 59 66 -116.34 gain 66 59 -112.31 gain 59 67 -114.58 gain 67 59 -109.43 gain 59 68 -106.21 gain 68 59 -108.35 gain 59 69 -108.56 gain 69 59 -104.43 gain 59 70 -102.54 gain 70 59 -99.92 gain 59 71 -103.10 gain 71 59 -100.35 gain 59 72 -100.93 gain 72 59 -96.16 gain 59 73 -91.44 gain 73 59 -87.51 gain 59 74 -86.46 gain 74 59 -84.82 gain 59 75 -124.76 gain 75 59 -120.79 gain 59 76 -127.21 gain 76 59 -124.26 gain 59 77 -119.85 gain 77 59 -119.87 gain 59 78 -116.84 gain 78 59 -113.77 gain 59 79 -118.61 gain 79 59 -113.47 gain 59 80 -115.83 gain 80 59 -112.20 gain 59 81 -117.25 gain 81 59 -111.59 gain 59 82 -110.56 gain 82 59 -107.75 gain 59 83 -111.40 gain 83 59 -108.37 gain 59 84 -104.26 gain 84 59 -99.04 gain 59 85 -106.66 gain 85 59 -99.72 gain 59 86 -105.99 gain 86 59 -107.43 gain 59 87 -108.83 gain 87 59 -105.92 gain 59 88 -106.41 gain 88 59 -104.04 gain 59 89 -100.47 gain 89 59 -98.36 gain 59 90 -126.12 gain 90 59 -125.39 gain 59 91 -118.01 gain 91 59 -116.57 gain 59 92 -125.99 gain 92 59 -125.11 gain 59 93 -121.43 gain 93 59 -122.08 gain 59 94 -121.76 gain 94 59 -117.32 gain 59 95 -116.45 gain 95 59 -115.24 gain 59 96 -115.33 gain 96 59 -109.58 gain 59 97 -112.93 gain 97 59 -110.60 gain 59 98 -111.97 gain 98 59 -108.38 gain 59 99 -116.94 gain 99 59 -116.99 gain 59 100 -113.24 gain 100 59 -115.00 gain 59 101 -111.89 gain 101 59 -109.58 gain 59 102 -105.34 gain 102 59 -103.16 gain 59 103 -101.51 gain 103 59 -99.16 gain 59 104 -99.92 gain 104 59 -93.40 gain 59 105 -120.31 gain 105 59 -119.11 gain 59 106 -120.11 gain 106 59 -117.63 gain 59 107 -121.48 gain 107 59 -119.30 gain 59 108 -118.74 gain 108 59 -116.22 gain 59 109 -117.79 gain 109 59 -117.11 gain 59 110 -120.96 gain 110 59 -117.35 gain 59 111 -114.70 gain 111 59 -113.75 gain 59 112 -111.97 gain 112 59 -110.78 gain 59 113 -112.79 gain 113 59 -113.30 gain 59 114 -114.90 gain 114 59 -112.31 gain 59 115 -109.66 gain 115 59 -101.99 gain 59 116 -115.74 gain 116 59 -113.81 gain 59 117 -110.59 gain 117 59 -111.46 gain 59 118 -109.03 gain 118 59 -107.28 gain 59 119 -102.65 gain 119 59 -100.37 gain 59 120 -122.99 gain 120 59 -116.26 gain 59 121 -124.63 gain 121 59 -120.68 gain 59 122 -126.49 gain 122 59 -125.04 gain 59 123 -126.26 gain 123 59 -122.32 gain 59 124 -122.12 gain 124 59 -118.18 gain 59 125 -114.94 gain 125 59 -112.60 gain 59 126 -111.22 gain 126 59 -105.20 gain 59 127 -120.09 gain 127 59 -115.64 gain 59 128 -110.94 gain 128 59 -108.36 gain 59 129 -113.61 gain 129 59 -108.44 gain 59 130 -107.76 gain 130 59 -105.27 gain 59 131 -104.15 gain 131 59 -99.53 gain 59 132 -104.68 gain 132 59 -102.68 gain 59 133 -112.93 gain 133 59 -109.03 gain 59 134 -116.34 gain 134 59 -112.24 gain 59 135 -115.16 gain 135 59 -112.77 gain 59 136 -129.75 gain 136 59 -128.65 gain 59 137 -122.59 gain 137 59 -119.27 gain 59 138 -122.26 gain 138 59 -115.17 gain 59 139 -114.81 gain 139 59 -109.62 gain 59 140 -125.56 gain 140 59 -126.43 gain 59 141 -118.37 gain 141 59 -114.13 gain 59 142 -116.95 gain 142 59 -117.52 gain 59 143 -111.79 gain 143 59 -107.90 gain 59 144 -115.71 gain 144 59 -112.72 gain 59 145 -116.94 gain 145 59 -113.55 gain 59 146 -113.07 gain 146 59 -107.24 gain 59 147 -105.53 gain 147 59 -103.55 gain 59 148 -108.38 gain 148 59 -105.33 gain 59 149 -111.54 gain 149 59 -107.74 gain 59 150 -134.17 gain 150 59 -135.48 gain 59 151 -127.26 gain 151 59 -122.13 gain 59 152 -127.12 gain 152 59 -123.82 gain 59 153 -118.13 gain 153 59 -117.26 gain 59 154 -114.25 gain 154 59 -108.99 gain 59 155 -116.19 gain 155 59 -114.76 gain 59 156 -117.86 gain 156 59 -114.45 gain 59 157 -112.63 gain 157 59 -111.18 gain 59 158 -119.95 gain 158 59 -118.94 gain 59 159 -116.28 gain 159 59 -108.90 gain 59 160 -112.76 gain 160 59 -107.65 gain 59 161 -111.35 gain 161 59 -109.10 gain 59 162 -117.15 gain 162 59 -111.98 gain 59 163 -115.93 gain 163 59 -107.95 gain 59 164 -115.49 gain 164 59 -109.25 gain 59 165 -131.01 gain 165 59 -127.71 gain 59 166 -127.64 gain 166 59 -127.01 gain 59 167 -119.33 gain 167 59 -117.83 gain 59 168 -119.18 gain 168 59 -119.02 gain 59 169 -115.64 gain 169 59 -107.83 gain 59 170 -119.45 gain 170 59 -122.13 gain 59 171 -117.38 gain 171 59 -116.49 gain 59 172 -121.93 gain 172 59 -114.13 gain 59 173 -125.24 gain 173 59 -122.10 gain 59 174 -124.57 gain 174 59 -121.20 gain 59 175 -116.41 gain 175 59 -112.24 gain 59 176 -115.19 gain 176 59 -110.98 gain 59 177 -112.67 gain 177 59 -109.94 gain 59 178 -116.22 gain 178 59 -114.45 gain 59 179 -121.69 gain 179 59 -120.94 gain 59 180 -130.45 gain 180 59 -125.50 gain 59 181 -115.38 gain 181 59 -114.88 gain 59 182 -118.67 gain 182 59 -114.46 gain 59 183 -117.27 gain 183 59 -114.36 gain 59 184 -124.85 gain 184 59 -124.00 gain 59 185 -119.76 gain 185 59 -114.33 gain 59 186 -128.92 gain 186 59 -122.49 gain 59 187 -116.36 gain 187 59 -114.02 gain 59 188 -120.93 gain 188 59 -121.35 gain 59 189 -120.14 gain 189 59 -119.95 gain 59 190 -120.82 gain 190 59 -116.30 gain 59 191 -116.11 gain 191 59 -114.62 gain 59 192 -118.56 gain 192 59 -114.40 gain 59 193 -115.67 gain 193 59 -115.48 gain 59 194 -113.28 gain 194 59 -112.66 gain 59 195 -123.87 gain 195 59 -121.44 gain 59 196 -123.12 gain 196 59 -119.71 gain 59 197 -124.29 gain 197 59 -123.55 gain 59 198 -121.20 gain 198 59 -124.40 gain 59 199 -133.88 gain 199 59 -128.65 gain 59 200 -121.05 gain 200 59 -112.58 gain 59 201 -123.63 gain 201 59 -118.98 gain 59 202 -121.52 gain 202 59 -118.40 gain 59 203 -121.04 gain 203 59 -114.55 gain 59 204 -123.78 gain 204 59 -124.37 gain 59 205 -123.17 gain 205 59 -121.83 gain 59 206 -116.52 gain 206 59 -113.16 gain 59 207 -116.65 gain 207 59 -114.05 gain 59 208 -118.56 gain 208 59 -116.13 gain 59 209 -126.83 gain 209 59 -120.41 gain 59 210 -122.01 gain 210 59 -122.17 gain 59 211 -124.49 gain 211 59 -120.91 gain 59 212 -117.21 gain 212 59 -111.17 gain 59 213 -122.83 gain 213 59 -121.66 gain 59 214 -124.14 gain 214 59 -119.27 gain 59 215 -118.53 gain 215 59 -114.75 gain 59 216 -126.45 gain 216 59 -123.50 gain 59 217 -129.70 gain 217 59 -130.57 gain 59 218 -123.49 gain 218 59 -116.55 gain 59 219 -122.39 gain 219 59 -118.27 gain 59 220 -120.42 gain 220 59 -112.65 gain 59 221 -117.17 gain 221 59 -113.90 gain 59 222 -119.42 gain 222 59 -117.52 gain 59 223 -120.35 gain 223 59 -120.46 gain 59 224 -122.36 gain 224 59 -122.97 gain 60 61 -85.85 gain 61 60 -87.29 gain 60 62 -87.98 gain 62 60 -88.98 gain 60 63 -91.09 gain 63 60 -93.32 gain 60 64 -102.38 gain 64 60 -99.40 gain 60 65 -111.50 gain 65 60 -107.12 gain 60 66 -116.78 gain 66 60 -115.47 gain 60 67 -107.50 gain 67 60 -105.07 gain 60 68 -126.53 gain 68 60 -131.39 gain 60 69 -108.62 gain 69 60 -107.21 gain 60 70 -119.31 gain 70 60 -119.41 gain 60 71 -116.87 gain 71 60 -116.85 gain 60 72 -119.16 gain 72 60 -117.11 gain 60 73 -120.91 gain 73 60 -119.70 gain 60 74 -119.32 gain 74 60 -120.39 gain 60 75 -85.36 gain 75 60 -84.11 gain 60 76 -80.74 gain 76 60 -80.51 gain 60 77 -98.68 gain 77 60 -101.41 gain 60 78 -96.93 gain 78 60 -96.57 gain 60 79 -101.76 gain 79 60 -99.34 gain 60 80 -112.44 gain 80 60 -111.53 gain 60 81 -110.73 gain 81 60 -107.78 gain 60 82 -109.50 gain 82 60 -109.41 gain 60 83 -114.98 gain 83 60 -114.67 gain 60 84 -115.48 gain 84 60 -112.98 gain 60 85 -117.02 gain 85 60 -112.79 gain 60 86 -124.95 gain 86 60 -129.11 gain 60 87 -115.92 gain 87 60 -115.73 gain 60 88 -119.99 gain 88 60 -120.35 gain 60 89 -116.35 gain 89 60 -116.96 gain 60 90 -96.20 gain 90 60 -98.18 gain 60 91 -97.96 gain 91 60 -99.23 gain 60 92 -95.29 gain 92 60 -97.13 gain 60 93 -109.41 gain 93 60 -112.79 gain 60 94 -99.62 gain 94 60 -97.90 gain 60 95 -100.07 gain 95 60 -101.57 gain 60 96 -110.57 gain 96 60 -107.54 gain 60 97 -119.35 gain 97 60 -119.73 gain 60 98 -115.75 gain 98 60 -114.88 gain 60 99 -121.84 gain 99 60 -124.61 gain 60 100 -115.99 gain 100 60 -120.46 gain 60 101 -118.39 gain 101 60 -118.80 gain 60 102 -118.33 gain 102 60 -118.86 gain 60 103 -117.38 gain 103 60 -117.74 gain 60 104 -116.73 gain 104 60 -112.93 gain 60 105 -99.53 gain 105 60 -101.05 gain 60 106 -106.25 gain 106 60 -106.48 gain 60 107 -100.66 gain 107 60 -101.20 gain 60 108 -107.17 gain 108 60 -107.36 gain 60 109 -105.52 gain 109 60 -107.57 gain 60 110 -106.74 gain 110 60 -105.85 gain 60 111 -108.46 gain 111 60 -110.23 gain 60 112 -114.61 gain 112 60 -116.13 gain 60 113 -116.43 gain 113 60 -119.65 gain 60 114 -115.50 gain 114 60 -115.63 gain 60 115 -118.20 gain 115 60 -113.24 gain 60 116 -122.87 gain 116 60 -123.66 gain 60 117 -124.06 gain 117 60 -127.65 gain 60 118 -124.30 gain 118 60 -125.26 gain 60 119 -116.25 gain 119 60 -116.69 gain 60 120 -97.61 gain 120 60 -93.60 gain 60 121 -106.95 gain 121 60 -105.71 gain 60 122 -102.72 gain 122 60 -103.99 gain 60 123 -103.33 gain 123 60 -102.11 gain 60 124 -104.04 gain 124 60 -102.82 gain 60 125 -104.12 gain 125 60 -104.50 gain 60 126 -112.76 gain 126 60 -109.45 gain 60 127 -111.81 gain 127 60 -110.09 gain 60 128 -118.34 gain 128 60 -118.48 gain 60 129 -117.74 gain 129 60 -115.28 gain 60 130 -120.12 gain 130 60 -120.35 gain 60 131 -124.87 gain 131 60 -122.96 gain 60 132 -115.02 gain 132 60 -115.73 gain 60 133 -121.34 gain 133 60 -120.16 gain 60 134 -119.30 gain 134 60 -117.91 gain 60 135 -103.09 gain 135 60 -103.41 gain 60 136 -106.20 gain 136 60 -107.81 gain 60 137 -108.31 gain 137 60 -107.70 gain 60 138 -105.14 gain 138 60 -100.77 gain 60 139 -112.09 gain 139 60 -109.61 gain 60 140 -114.51 gain 140 60 -118.10 gain 60 141 -110.14 gain 141 60 -108.61 gain 60 142 -111.02 gain 142 60 -114.31 gain 60 143 -113.83 gain 143 60 -112.66 gain 60 144 -114.17 gain 144 60 -113.91 gain 60 145 -110.13 gain 145 60 -109.46 gain 60 146 -118.55 gain 146 60 -115.44 gain 60 147 -119.74 gain 147 60 -120.47 gain 60 148 -119.39 gain 148 60 -119.04 gain 60 149 -121.39 gain 149 60 -120.30 gain 60 150 -109.66 gain 150 60 -113.69 gain 60 151 -111.87 gain 151 60 -109.46 gain 60 152 -112.80 gain 152 60 -112.21 gain 60 153 -116.35 gain 153 60 -118.20 gain 60 154 -114.61 gain 154 60 -112.06 gain 60 155 -123.01 gain 155 60 -124.29 gain 60 156 -121.22 gain 156 60 -120.52 gain 60 157 -115.53 gain 157 60 -116.80 gain 60 158 -118.72 gain 158 60 -120.41 gain 60 159 -108.03 gain 159 60 -103.37 gain 60 160 -116.70 gain 160 60 -114.30 gain 60 161 -112.77 gain 161 60 -113.24 gain 60 162 -118.75 gain 162 60 -116.30 gain 60 163 -121.04 gain 163 60 -115.77 gain 60 164 -127.90 gain 164 60 -124.38 gain 60 165 -107.94 gain 165 60 -107.35 gain 60 166 -118.23 gain 166 60 -120.31 gain 60 167 -112.01 gain 167 60 -113.22 gain 60 168 -107.16 gain 168 60 -109.71 gain 60 169 -111.07 gain 169 60 -105.97 gain 60 170 -110.15 gain 170 60 -115.55 gain 60 171 -115.42 gain 171 60 -117.24 gain 60 172 -110.76 gain 172 60 -105.68 gain 60 173 -111.86 gain 173 60 -111.44 gain 60 174 -115.43 gain 174 60 -114.77 gain 60 175 -120.61 gain 175 60 -119.15 gain 60 176 -113.92 gain 176 60 -112.42 gain 60 177 -116.37 gain 177 60 -116.36 gain 60 178 -116.85 gain 178 60 -117.80 gain 60 179 -119.20 gain 179 60 -121.17 gain 60 180 -114.55 gain 180 60 -112.32 gain 60 181 -114.77 gain 181 60 -116.98 gain 60 182 -112.48 gain 182 60 -110.99 gain 60 183 -116.28 gain 183 60 -116.09 gain 60 184 -111.81 gain 184 60 -113.67 gain 60 185 -113.55 gain 185 60 -110.84 gain 60 186 -118.47 gain 186 60 -114.76 gain 60 187 -113.15 gain 187 60 -113.53 gain 60 188 -116.17 gain 188 60 -119.30 gain 60 189 -117.76 gain 189 60 -120.29 gain 60 190 -112.59 gain 190 60 -110.79 gain 60 191 -114.56 gain 191 60 -115.79 gain 60 192 -127.98 gain 192 60 -126.53 gain 60 193 -116.77 gain 193 60 -119.30 gain 60 194 -123.99 gain 194 60 -126.09 gain 60 195 -111.08 gain 195 60 -111.37 gain 60 196 -118.79 gain 196 60 -118.10 gain 60 197 -110.97 gain 197 60 -112.95 gain 60 198 -115.40 gain 198 60 -121.32 gain 60 199 -111.59 gain 199 60 -109.08 gain 60 200 -116.07 gain 200 60 -110.32 gain 60 201 -117.79 gain 201 60 -115.86 gain 60 202 -119.49 gain 202 60 -119.09 gain 60 203 -122.73 gain 203 60 -118.95 gain 60 204 -114.61 gain 204 60 -117.92 gain 60 205 -112.33 gain 205 60 -113.71 gain 60 206 -116.40 gain 206 60 -115.75 gain 60 207 -119.39 gain 207 60 -119.50 gain 60 208 -120.18 gain 208 60 -120.46 gain 60 209 -115.86 gain 209 60 -112.15 gain 60 210 -109.95 gain 210 60 -112.83 gain 60 211 -118.05 gain 211 60 -117.18 gain 60 212 -119.28 gain 212 60 -115.96 gain 60 213 -115.99 gain 213 60 -117.54 gain 60 214 -118.54 gain 214 60 -116.38 gain 60 215 -123.68 gain 215 60 -122.62 gain 60 216 -111.69 gain 216 60 -111.45 gain 60 217 -123.40 gain 217 60 -126.98 gain 60 218 -122.09 gain 218 60 -117.87 gain 60 219 -121.33 gain 219 60 -119.93 gain 60 220 -122.12 gain 220 60 -117.06 gain 60 221 -116.28 gain 221 60 -115.73 gain 60 222 -120.86 gain 222 60 -121.68 gain 60 223 -118.18 gain 223 60 -121.00 gain 60 224 -117.42 gain 224 60 -120.74 gain 61 62 -98.44 gain 62 61 -97.99 gain 61 63 -106.17 gain 63 61 -106.96 gain 61 64 -102.85 gain 64 61 -98.43 gain 61 65 -102.79 gain 65 61 -96.96 gain 61 66 -105.82 gain 66 61 -103.07 gain 61 67 -100.95 gain 67 61 -97.07 gain 61 68 -113.03 gain 68 61 -116.45 gain 61 69 -110.24 gain 69 61 -107.38 gain 61 70 -116.41 gain 70 61 -115.07 gain 61 71 -121.05 gain 71 61 -119.59 gain 61 72 -121.54 gain 72 61 -118.05 gain 61 73 -117.62 gain 73 61 -114.97 gain 61 74 -129.15 gain 74 61 -128.78 gain 61 75 -88.99 gain 75 61 -86.30 gain 61 76 -87.32 gain 76 61 -85.65 gain 61 77 -95.18 gain 77 61 -96.48 gain 61 78 -96.34 gain 78 61 -94.55 gain 61 79 -102.18 gain 79 61 -98.31 gain 61 80 -101.76 gain 80 61 -99.41 gain 61 81 -105.40 gain 81 61 -101.02 gain 61 82 -106.73 gain 82 61 -105.20 gain 61 83 -119.04 gain 83 61 -117.29 gain 61 84 -119.73 gain 84 61 -115.79 gain 61 85 -121.97 gain 85 61 -116.30 gain 61 86 -119.18 gain 86 61 -121.90 gain 61 87 -116.00 gain 87 61 -114.37 gain 61 88 -118.84 gain 88 61 -117.75 gain 61 89 -119.60 gain 89 61 -118.77 gain 61 90 -100.68 gain 90 61 -101.23 gain 61 91 -101.63 gain 91 61 -101.46 gain 61 92 -106.79 gain 92 61 -107.19 gain 61 93 -98.73 gain 93 61 -100.67 gain 61 94 -102.47 gain 94 61 -99.31 gain 61 95 -112.70 gain 95 61 -112.77 gain 61 96 -106.42 gain 96 61 -101.94 gain 61 97 -103.56 gain 97 61 -102.50 gain 61 98 -103.42 gain 98 61 -101.11 gain 61 99 -116.29 gain 99 61 -117.62 gain 61 100 -117.15 gain 100 61 -120.19 gain 61 101 -128.99 gain 101 61 -127.95 gain 61 102 -123.06 gain 102 61 -122.16 gain 61 103 -121.84 gain 103 61 -120.77 gain 61 104 -118.43 gain 104 61 -113.18 gain 61 105 -103.11 gain 105 61 -103.19 gain 61 106 -102.47 gain 106 61 -101.26 gain 61 107 -105.40 gain 107 61 -104.49 gain 61 108 -104.60 gain 108 61 -103.36 gain 61 109 -108.24 gain 109 61 -108.84 gain 61 110 -105.91 gain 110 61 -103.58 gain 61 111 -108.14 gain 111 61 -108.47 gain 61 112 -116.42 gain 112 61 -116.50 gain 61 113 -111.54 gain 113 61 -113.32 gain 61 114 -111.78 gain 114 61 -110.47 gain 61 115 -116.56 gain 115 61 -110.16 gain 61 116 -119.24 gain 116 61 -118.59 gain 61 117 -114.95 gain 117 61 -117.10 gain 61 118 -117.13 gain 118 61 -116.66 gain 61 119 -120.36 gain 119 61 -119.36 gain 61 120 -101.31 gain 120 61 -95.85 gain 61 121 -103.77 gain 121 61 -101.09 gain 61 122 -107.80 gain 122 61 -107.63 gain 61 123 -109.55 gain 123 61 -106.89 gain 61 124 -106.21 gain 124 61 -103.55 gain 61 125 -110.41 gain 125 61 -109.35 gain 61 126 -112.03 gain 126 61 -107.29 gain 61 127 -112.17 gain 127 61 -109.00 gain 61 128 -115.69 gain 128 61 -114.39 gain 61 129 -111.63 gain 129 61 -107.74 gain 61 130 -114.79 gain 130 61 -113.58 gain 61 131 -121.85 gain 131 61 -118.50 gain 61 132 -108.51 gain 132 61 -107.78 gain 61 133 -119.09 gain 133 61 -116.47 gain 61 134 -118.71 gain 134 61 -115.88 gain 61 135 -106.42 gain 135 61 -105.31 gain 61 136 -111.42 gain 136 61 -111.59 gain 61 137 -99.60 gain 137 61 -97.56 gain 61 138 -115.51 gain 138 61 -109.69 gain 61 139 -112.63 gain 139 61 -108.72 gain 61 140 -111.06 gain 140 61 -113.21 gain 61 141 -108.58 gain 141 61 -105.61 gain 61 142 -112.57 gain 142 61 -114.42 gain 61 143 -112.02 gain 143 61 -109.41 gain 61 144 -117.46 gain 144 61 -115.75 gain 61 145 -119.06 gain 145 61 -116.95 gain 61 146 -114.04 gain 146 61 -109.48 gain 61 147 -117.44 gain 147 61 -116.73 gain 61 148 -123.63 gain 148 61 -121.85 gain 61 149 -116.03 gain 149 61 -113.50 gain 61 150 -113.24 gain 150 61 -115.83 gain 61 151 -120.88 gain 151 61 -117.03 gain 61 152 -111.93 gain 152 61 -109.90 gain 61 153 -111.17 gain 153 61 -111.58 gain 61 154 -108.57 gain 154 61 -104.58 gain 61 155 -111.32 gain 155 61 -111.16 gain 61 156 -117.17 gain 156 61 -115.03 gain 61 157 -111.37 gain 157 61 -111.19 gain 61 158 -110.99 gain 158 61 -111.24 gain 61 159 -110.30 gain 159 61 -104.19 gain 61 160 -122.74 gain 160 61 -118.90 gain 61 161 -114.45 gain 161 61 -113.47 gain 61 162 -116.66 gain 162 61 -112.77 gain 61 163 -120.65 gain 163 61 -113.95 gain 61 164 -117.93 gain 164 61 -112.96 gain 61 165 -117.34 gain 165 61 -115.31 gain 61 166 -115.81 gain 166 61 -116.45 gain 61 167 -100.94 gain 167 61 -100.71 gain 61 168 -110.98 gain 168 61 -112.09 gain 61 169 -109.89 gain 169 61 -103.35 gain 61 170 -117.25 gain 170 61 -121.20 gain 61 171 -114.46 gain 171 61 -114.84 gain 61 172 -123.16 gain 172 61 -116.64 gain 61 173 -124.78 gain 173 61 -122.92 gain 61 174 -119.37 gain 174 61 -117.27 gain 61 175 -118.54 gain 175 61 -115.65 gain 61 176 -113.66 gain 176 61 -110.72 gain 61 177 -117.27 gain 177 61 -115.82 gain 61 178 -118.92 gain 178 61 -118.43 gain 61 179 -118.70 gain 179 61 -119.23 gain 61 180 -109.78 gain 180 61 -106.11 gain 61 181 -112.98 gain 181 61 -113.75 gain 61 182 -108.58 gain 182 61 -105.65 gain 61 183 -118.89 gain 183 61 -117.26 gain 61 184 -113.19 gain 184 61 -113.61 gain 61 185 -112.69 gain 185 61 -108.54 gain 61 186 -111.48 gain 186 61 -106.33 gain 61 187 -111.91 gain 187 61 -110.84 gain 61 188 -111.78 gain 188 61 -113.48 gain 61 189 -113.16 gain 189 61 -114.25 gain 61 190 -115.33 gain 190 61 -112.09 gain 61 191 -125.75 gain 191 61 -125.54 gain 61 192 -127.23 gain 192 61 -124.34 gain 61 193 -117.66 gain 193 61 -118.75 gain 61 194 -127.65 gain 194 61 -128.30 gain 61 195 -114.17 gain 195 61 -113.01 gain 61 196 -114.23 gain 196 61 -112.09 gain 61 197 -113.59 gain 197 61 -114.13 gain 61 198 -121.82 gain 198 61 -126.29 gain 61 199 -108.31 gain 199 61 -104.35 gain 61 200 -116.30 gain 200 61 -109.12 gain 61 201 -122.01 gain 201 61 -118.64 gain 61 202 -125.92 gain 202 61 -124.08 gain 61 203 -113.03 gain 203 61 -107.81 gain 61 204 -115.83 gain 204 61 -117.70 gain 61 205 -123.96 gain 205 61 -123.90 gain 61 206 -123.95 gain 206 61 -121.86 gain 61 207 -118.53 gain 207 61 -117.20 gain 61 208 -118.83 gain 208 61 -117.68 gain 61 209 -124.68 gain 209 61 -119.52 gain 61 210 -120.07 gain 210 61 -121.50 gain 61 211 -115.75 gain 211 61 -113.44 gain 61 212 -113.97 gain 212 61 -109.21 gain 61 213 -113.31 gain 213 61 -113.42 gain 61 214 -116.89 gain 214 61 -113.30 gain 61 215 -119.94 gain 215 61 -117.43 gain 61 216 -112.07 gain 216 61 -110.39 gain 61 217 -114.58 gain 217 61 -116.72 gain 61 218 -127.03 gain 218 61 -121.36 gain 61 219 -124.12 gain 219 61 -121.28 gain 61 220 -114.62 gain 220 61 -108.13 gain 61 221 -114.99 gain 221 61 -113.00 gain 61 222 -123.31 gain 222 61 -122.69 gain 61 223 -122.79 gain 223 61 -124.17 gain 61 224 -116.89 gain 224 61 -118.77 gain 62 63 -86.52 gain 63 62 -87.76 gain 62 64 -105.23 gain 64 62 -101.25 gain 62 65 -106.35 gain 65 62 -100.97 gain 62 66 -101.55 gain 66 62 -99.24 gain 62 67 -100.51 gain 67 62 -97.08 gain 62 68 -114.16 gain 68 62 -118.02 gain 62 69 -111.01 gain 69 62 -108.60 gain 62 70 -122.59 gain 70 62 -121.70 gain 62 71 -115.84 gain 71 62 -114.81 gain 62 72 -118.85 gain 72 62 -115.81 gain 62 73 -122.85 gain 73 62 -120.64 gain 62 74 -125.50 gain 74 62 -125.58 gain 62 75 -104.10 gain 75 62 -101.86 gain 62 76 -90.59 gain 76 62 -89.36 gain 62 77 -91.29 gain 77 62 -93.03 gain 62 78 -96.66 gain 78 62 -95.31 gain 62 79 -99.93 gain 79 62 -96.51 gain 62 80 -103.33 gain 80 62 -101.42 gain 62 81 -104.15 gain 81 62 -100.21 gain 62 82 -108.91 gain 82 62 -107.82 gain 62 83 -115.68 gain 83 62 -114.37 gain 62 84 -113.02 gain 84 62 -109.52 gain 62 85 -116.04 gain 85 62 -110.82 gain 62 86 -120.49 gain 86 62 -123.65 gain 62 87 -119.74 gain 87 62 -118.55 gain 62 88 -116.21 gain 88 62 -115.57 gain 62 89 -117.71 gain 89 62 -117.33 gain 62 90 -99.59 gain 90 62 -100.58 gain 62 91 -100.01 gain 91 62 -100.28 gain 62 92 -107.30 gain 92 62 -108.14 gain 62 93 -96.92 gain 93 62 -99.30 gain 62 94 -100.79 gain 94 62 -98.07 gain 62 95 -106.87 gain 95 62 -107.38 gain 62 96 -106.72 gain 96 62 -102.69 gain 62 97 -115.59 gain 97 62 -114.98 gain 62 98 -108.65 gain 98 62 -106.79 gain 62 99 -110.33 gain 99 62 -112.10 gain 62 100 -117.65 gain 100 62 -121.13 gain 62 101 -106.16 gain 101 62 -105.57 gain 62 102 -123.93 gain 102 62 -123.47 gain 62 103 -117.85 gain 103 62 -117.22 gain 62 104 -120.48 gain 104 62 -115.68 gain 62 105 -104.09 gain 105 62 -104.61 gain 62 106 -99.88 gain 106 62 -99.12 gain 62 107 -102.14 gain 107 62 -101.68 gain 62 108 -109.20 gain 108 62 -108.40 gain 62 109 -104.68 gain 109 62 -105.73 gain 62 110 -108.72 gain 110 62 -106.84 gain 62 111 -102.85 gain 111 62 -103.63 gain 62 112 -109.10 gain 112 62 -109.62 gain 62 113 -102.67 gain 113 62 -104.89 gain 62 114 -106.28 gain 114 62 -105.41 gain 62 115 -112.32 gain 115 62 -106.37 gain 62 116 -113.90 gain 116 62 -113.69 gain 62 117 -118.29 gain 117 62 -120.88 gain 62 118 -111.98 gain 118 62 -111.95 gain 62 119 -118.65 gain 119 62 -118.10 gain 62 120 -108.91 gain 120 62 -103.90 gain 62 121 -107.32 gain 121 62 -105.08 gain 62 122 -105.83 gain 122 62 -106.11 gain 62 123 -101.88 gain 123 62 -99.67 gain 62 124 -105.17 gain 124 62 -102.95 gain 62 125 -109.67 gain 125 62 -109.05 gain 62 126 -106.95 gain 126 62 -102.65 gain 62 127 -113.94 gain 127 62 -111.21 gain 62 128 -116.75 gain 128 62 -115.89 gain 62 129 -118.69 gain 129 62 -115.24 gain 62 130 -114.55 gain 130 62 -113.78 gain 62 131 -121.01 gain 131 62 -118.10 gain 62 132 -116.09 gain 132 62 -115.80 gain 62 133 -113.69 gain 133 62 -111.51 gain 62 134 -121.62 gain 134 62 -119.24 gain 62 135 -110.08 gain 135 62 -109.41 gain 62 136 -106.57 gain 136 62 -107.19 gain 62 137 -105.91 gain 137 62 -104.31 gain 62 138 -103.30 gain 138 62 -97.93 gain 62 139 -111.68 gain 139 62 -108.21 gain 62 140 -103.56 gain 140 62 -106.15 gain 62 141 -111.27 gain 141 62 -108.75 gain 62 142 -115.19 gain 142 62 -117.48 gain 62 143 -115.22 gain 143 62 -113.06 gain 62 144 -111.83 gain 144 62 -110.56 gain 62 145 -117.71 gain 145 62 -116.04 gain 62 146 -108.50 gain 146 62 -104.39 gain 62 147 -118.61 gain 147 62 -118.34 gain 62 148 -122.09 gain 148 62 -120.76 gain 62 149 -120.14 gain 149 62 -118.05 gain 62 150 -113.81 gain 150 62 -116.84 gain 62 151 -110.03 gain 151 62 -106.62 gain 62 152 -110.90 gain 152 62 -109.32 gain 62 153 -108.73 gain 153 62 -109.58 gain 62 154 -113.85 gain 154 62 -110.31 gain 62 155 -110.38 gain 155 62 -110.67 gain 62 156 -102.42 gain 156 62 -100.72 gain 62 157 -120.22 gain 157 62 -120.49 gain 62 158 -113.06 gain 158 62 -113.76 gain 62 159 -114.73 gain 159 62 -109.07 gain 62 160 -107.95 gain 160 62 -104.56 gain 62 161 -122.71 gain 161 62 -122.18 gain 62 162 -120.35 gain 162 62 -116.90 gain 62 163 -122.96 gain 163 62 -116.69 gain 62 164 -119.59 gain 164 62 -115.07 gain 62 165 -115.95 gain 165 62 -114.36 gain 62 166 -106.49 gain 166 62 -107.58 gain 62 167 -112.27 gain 167 62 -112.49 gain 62 168 -105.97 gain 168 62 -107.53 gain 62 169 -120.20 gain 169 62 -114.11 gain 62 170 -108.38 gain 170 62 -112.78 gain 62 171 -115.87 gain 171 62 -116.70 gain 62 172 -113.86 gain 172 62 -107.78 gain 62 173 -115.34 gain 173 62 -113.92 gain 62 174 -119.36 gain 174 62 -117.70 gain 62 175 -110.49 gain 175 62 -108.04 gain 62 176 -117.84 gain 176 62 -115.35 gain 62 177 -119.39 gain 177 62 -118.38 gain 62 178 -123.77 gain 178 62 -123.72 gain 62 179 -123.08 gain 179 62 -124.05 gain 62 180 -116.40 gain 180 62 -113.18 gain 62 181 -120.16 gain 181 62 -121.37 gain 62 182 -113.43 gain 182 62 -110.95 gain 62 183 -111.87 gain 183 62 -110.69 gain 62 184 -115.00 gain 184 62 -115.87 gain 62 185 -106.20 gain 185 62 -102.49 gain 62 186 -112.61 gain 186 62 -107.90 gain 62 187 -114.21 gain 187 62 -113.59 gain 62 188 -112.83 gain 188 62 -114.97 gain 62 189 -127.11 gain 189 62 -128.64 gain 62 190 -116.45 gain 190 62 -113.65 gain 62 191 -110.67 gain 191 62 -110.91 gain 62 192 -124.23 gain 192 62 -121.78 gain 62 193 -122.03 gain 193 62 -123.56 gain 62 194 -124.58 gain 194 62 -125.68 gain 62 195 -117.86 gain 195 62 -117.15 gain 62 196 -115.41 gain 196 62 -113.72 gain 62 197 -117.66 gain 197 62 -118.65 gain 62 198 -111.35 gain 198 62 -116.26 gain 62 199 -111.87 gain 199 62 -108.35 gain 62 200 -117.90 gain 200 62 -111.16 gain 62 201 -115.49 gain 201 62 -112.56 gain 62 202 -124.02 gain 202 62 -122.63 gain 62 203 -122.68 gain 203 62 -117.91 gain 62 204 -118.69 gain 204 62 -121.00 gain 62 205 -122.82 gain 205 62 -123.20 gain 62 206 -121.84 gain 206 62 -120.19 gain 62 207 -115.86 gain 207 62 -114.97 gain 62 208 -126.82 gain 208 62 -126.10 gain 62 209 -118.96 gain 209 62 -114.26 gain 62 210 -114.15 gain 210 62 -116.03 gain 62 211 -112.65 gain 211 62 -110.79 gain 62 212 -125.29 gain 212 62 -120.97 gain 62 213 -115.29 gain 213 62 -115.84 gain 62 214 -120.61 gain 214 62 -117.46 gain 62 215 -115.44 gain 215 62 -113.38 gain 62 216 -115.64 gain 216 62 -114.40 gain 62 217 -116.75 gain 217 62 -119.33 gain 62 218 -121.92 gain 218 62 -116.69 gain 62 219 -125.03 gain 219 62 -122.62 gain 62 220 -116.82 gain 220 62 -110.77 gain 62 221 -114.44 gain 221 62 -112.89 gain 62 222 -123.60 gain 222 62 -123.42 gain 62 223 -116.83 gain 223 62 -118.66 gain 62 224 -126.39 gain 224 62 -128.72 gain 63 64 -88.44 gain 64 63 -83.23 gain 63 65 -95.02 gain 65 63 -88.40 gain 63 66 -100.60 gain 66 63 -97.06 gain 63 67 -100.46 gain 67 63 -95.80 gain 63 68 -108.34 gain 68 63 -110.97 gain 63 69 -112.86 gain 69 63 -109.21 gain 63 70 -113.99 gain 70 63 -111.87 gain 63 71 -117.20 gain 71 63 -114.94 gain 63 72 -119.65 gain 72 63 -115.37 gain 63 73 -118.03 gain 73 63 -114.59 gain 63 74 -117.66 gain 74 63 -116.50 gain 63 75 -96.58 gain 75 63 -93.10 gain 63 76 -93.36 gain 76 63 -90.89 gain 63 77 -96.69 gain 77 63 -97.19 gain 63 78 -88.74 gain 78 63 -86.15 gain 63 79 -93.17 gain 79 63 -88.52 gain 63 80 -100.45 gain 80 63 -97.31 gain 63 81 -104.05 gain 81 63 -98.88 gain 63 82 -103.59 gain 82 63 -101.27 gain 63 83 -108.12 gain 83 63 -105.59 gain 63 84 -116.50 gain 84 63 -111.77 gain 63 85 -115.46 gain 85 63 -109.00 gain 63 86 -119.81 gain 86 63 -121.74 gain 63 87 -117.01 gain 87 63 -114.59 gain 63 88 -113.45 gain 88 63 -111.57 gain 63 89 -121.95 gain 89 63 -120.33 gain 63 90 -99.93 gain 90 63 -99.69 gain 63 91 -105.80 gain 91 63 -104.84 gain 63 92 -98.21 gain 92 63 -97.82 gain 63 93 -98.09 gain 93 63 -99.23 gain 63 94 -99.93 gain 94 63 -95.98 gain 63 95 -98.68 gain 95 63 -97.95 gain 63 96 -101.35 gain 96 63 -96.09 gain 63 97 -106.24 gain 97 63 -104.39 gain 63 98 -112.19 gain 98 63 -109.08 gain 63 99 -105.25 gain 99 63 -105.78 gain 63 100 -110.35 gain 100 63 -112.59 gain 63 101 -118.41 gain 101 63 -116.58 gain 63 102 -119.42 gain 102 63 -117.73 gain 63 103 -119.25 gain 103 63 -117.39 gain 63 104 -127.21 gain 104 63 -121.18 gain 63 105 -103.72 gain 105 63 -103.01 gain 63 106 -102.39 gain 106 63 -100.39 gain 63 107 -96.17 gain 107 63 -94.48 gain 63 108 -100.13 gain 108 63 -98.09 gain 63 109 -98.40 gain 109 63 -98.22 gain 63 110 -102.38 gain 110 63 -99.26 gain 63 111 -111.85 gain 111 63 -111.39 gain 63 112 -102.11 gain 112 63 -101.40 gain 63 113 -106.16 gain 113 63 -107.15 gain 63 114 -112.11 gain 114 63 -110.00 gain 63 115 -111.40 gain 115 63 -104.22 gain 63 116 -116.88 gain 116 63 -115.44 gain 63 117 -118.21 gain 117 63 -119.56 gain 63 118 -114.96 gain 118 63 -113.70 gain 63 119 -115.38 gain 119 63 -113.59 gain 63 120 -107.92 gain 120 63 -101.68 gain 63 121 -106.76 gain 121 63 -103.29 gain 63 122 -108.33 gain 122 63 -107.36 gain 63 123 -101.70 gain 123 63 -98.26 gain 63 124 -109.45 gain 124 63 -105.99 gain 63 125 -113.29 gain 125 63 -111.44 gain 63 126 -113.88 gain 126 63 -108.35 gain 63 127 -111.56 gain 127 63 -107.60 gain 63 128 -111.37 gain 128 63 -109.28 gain 63 129 -105.76 gain 129 63 -101.07 gain 63 130 -118.74 gain 130 63 -116.74 gain 63 131 -123.61 gain 131 63 -119.47 gain 63 132 -111.84 gain 132 63 -110.32 gain 63 133 -118.13 gain 133 63 -114.72 gain 63 134 -113.12 gain 134 63 -109.51 gain 63 135 -107.24 gain 135 63 -105.34 gain 63 136 -109.18 gain 136 63 -108.56 gain 63 137 -111.40 gain 137 63 -108.56 gain 63 138 -100.25 gain 138 63 -93.64 gain 63 139 -106.78 gain 139 63 -102.08 gain 63 140 -111.09 gain 140 63 -112.45 gain 63 141 -110.33 gain 141 63 -106.57 gain 63 142 -110.14 gain 142 63 -111.19 gain 63 143 -113.26 gain 143 63 -109.86 gain 63 144 -113.44 gain 144 63 -110.94 gain 63 145 -120.11 gain 145 63 -117.20 gain 63 146 -120.14 gain 146 63 -114.79 gain 63 147 -111.93 gain 147 63 -110.43 gain 63 148 -119.54 gain 148 63 -116.97 gain 63 149 -123.13 gain 149 63 -119.81 gain 63 150 -116.08 gain 150 63 -117.87 gain 63 151 -109.84 gain 151 63 -105.19 gain 63 152 -109.98 gain 152 63 -107.17 gain 63 153 -110.23 gain 153 63 -109.84 gain 63 154 -109.65 gain 154 63 -104.88 gain 63 155 -114.13 gain 155 63 -113.19 gain 63 156 -109.35 gain 156 63 -106.42 gain 63 157 -116.61 gain 157 63 -115.64 gain 63 158 -109.39 gain 158 63 -108.86 gain 63 159 -117.56 gain 159 63 -110.66 gain 63 160 -113.71 gain 160 63 -109.09 gain 63 161 -116.14 gain 161 63 -114.38 gain 63 162 -119.80 gain 162 63 -115.11 gain 63 163 -122.49 gain 163 63 -114.99 gain 63 164 -120.93 gain 164 63 -115.18 gain 63 165 -115.10 gain 165 63 -112.28 gain 63 166 -116.54 gain 166 63 -116.40 gain 63 167 -110.48 gain 167 63 -109.46 gain 63 168 -107.00 gain 168 63 -107.32 gain 63 169 -116.26 gain 169 63 -108.93 gain 63 170 -119.85 gain 170 63 -123.01 gain 63 171 -112.54 gain 171 63 -112.13 gain 63 172 -119.40 gain 172 63 -112.08 gain 63 173 -117.10 gain 173 63 -114.45 gain 63 174 -117.25 gain 174 63 -114.36 gain 63 175 -113.00 gain 175 63 -109.32 gain 63 176 -124.72 gain 176 63 -120.99 gain 63 177 -118.13 gain 177 63 -115.89 gain 63 178 -124.69 gain 178 63 -123.40 gain 63 179 -118.25 gain 179 63 -117.99 gain 63 180 -119.83 gain 180 63 -115.37 gain 63 181 -113.67 gain 181 63 -113.65 gain 63 182 -114.05 gain 182 63 -110.34 gain 63 183 -119.67 gain 183 63 -117.25 gain 63 184 -111.48 gain 184 63 -111.11 gain 63 185 -106.24 gain 185 63 -101.30 gain 63 186 -115.74 gain 186 63 -109.79 gain 63 187 -119.02 gain 187 63 -117.16 gain 63 188 -113.91 gain 188 63 -114.81 gain 63 189 -118.99 gain 189 63 -119.29 gain 63 190 -117.06 gain 190 63 -113.02 gain 63 191 -122.97 gain 191 63 -121.97 gain 63 192 -126.38 gain 192 63 -122.70 gain 63 193 -124.98 gain 193 63 -125.27 gain 63 194 -121.87 gain 194 63 -121.73 gain 63 195 -117.43 gain 195 63 -115.49 gain 63 196 -117.87 gain 196 63 -114.95 gain 63 197 -118.68 gain 197 63 -118.43 gain 63 198 -117.26 gain 198 63 -120.95 gain 63 199 -117.52 gain 199 63 -112.77 gain 63 200 -112.33 gain 200 63 -104.35 gain 63 201 -115.08 gain 201 63 -110.92 gain 63 202 -124.82 gain 202 63 -122.18 gain 63 203 -119.78 gain 203 63 -113.78 gain 63 204 -117.51 gain 204 63 -118.58 gain 63 205 -126.24 gain 205 63 -125.38 gain 63 206 -114.35 gain 206 63 -111.47 gain 63 207 -111.43 gain 207 63 -109.31 gain 63 208 -124.50 gain 208 63 -122.55 gain 63 209 -125.36 gain 209 63 -119.41 gain 63 210 -126.06 gain 210 63 -126.71 gain 63 211 -114.36 gain 211 63 -111.26 gain 63 212 -112.33 gain 212 63 -106.78 gain 63 213 -114.92 gain 213 63 -114.24 gain 63 214 -123.52 gain 214 63 -119.14 gain 63 215 -117.11 gain 215 63 -113.81 gain 63 216 -120.91 gain 216 63 -118.44 gain 63 217 -119.87 gain 217 63 -121.22 gain 63 218 -119.60 gain 218 63 -113.15 gain 63 219 -119.12 gain 219 63 -115.48 gain 63 220 -120.63 gain 220 63 -113.34 gain 63 221 -122.94 gain 221 63 -120.16 gain 63 222 -125.33 gain 222 63 -123.92 gain 63 223 -121.38 gain 223 63 -121.98 gain 63 224 -119.84 gain 224 63 -120.93 gain 64 65 -81.17 gain 65 64 -79.76 gain 64 66 -91.83 gain 66 64 -93.50 gain 64 67 -93.81 gain 67 64 -94.35 gain 64 68 -101.76 gain 68 64 -109.60 gain 64 69 -106.31 gain 69 64 -107.87 gain 64 70 -113.71 gain 70 64 -116.80 gain 64 71 -105.18 gain 71 64 -108.13 gain 64 72 -108.66 gain 72 64 -109.59 gain 64 73 -106.26 gain 73 64 -108.03 gain 64 74 -122.08 gain 74 64 -126.13 gain 64 75 -97.22 gain 75 64 -98.95 gain 64 76 -102.53 gain 76 64 -105.28 gain 64 77 -98.04 gain 77 64 -103.76 gain 64 78 -86.02 gain 78 64 -88.64 gain 64 79 -77.31 gain 79 64 -77.87 gain 64 80 -89.34 gain 80 64 -91.41 gain 64 81 -95.72 gain 81 64 -95.76 gain 64 82 -105.41 gain 82 64 -108.30 gain 64 83 -100.38 gain 83 64 -103.05 gain 64 84 -103.23 gain 84 64 -103.70 gain 64 85 -103.73 gain 85 64 -102.49 gain 64 86 -107.51 gain 86 64 -114.65 gain 64 87 -111.71 gain 87 64 -114.50 gain 64 88 -108.80 gain 88 64 -112.14 gain 64 89 -108.61 gain 89 64 -112.20 gain 64 90 -105.75 gain 90 64 -110.72 gain 64 91 -102.41 gain 91 64 -106.66 gain 64 92 -96.86 gain 92 64 -101.68 gain 64 93 -95.25 gain 93 64 -101.61 gain 64 94 -94.85 gain 94 64 -96.12 gain 64 95 -96.52 gain 95 64 -101.01 gain 64 96 -91.40 gain 96 64 -91.35 gain 64 97 -99.83 gain 97 64 -103.19 gain 64 98 -99.89 gain 98 64 -102.01 gain 64 99 -106.86 gain 99 64 -112.61 gain 64 100 -106.55 gain 100 64 -114.01 gain 64 101 -116.77 gain 101 64 -120.16 gain 64 102 -108.94 gain 102 64 -112.46 gain 64 103 -111.34 gain 103 64 -114.69 gain 64 104 -107.42 gain 104 64 -106.59 gain 64 105 -108.29 gain 105 64 -112.79 gain 64 106 -94.28 gain 106 64 -97.50 gain 64 107 -95.01 gain 107 64 -98.52 gain 64 108 -97.72 gain 108 64 -100.90 gain 64 109 -98.81 gain 109 64 -103.84 gain 64 110 -94.45 gain 110 64 -96.54 gain 64 111 -100.37 gain 111 64 -105.13 gain 64 112 -105.56 gain 112 64 -110.06 gain 64 113 -99.30 gain 113 64 -105.50 gain 64 114 -106.76 gain 114 64 -109.86 gain 64 115 -106.93 gain 115 64 -104.96 gain 64 116 -103.65 gain 116 64 -107.42 gain 64 117 -109.63 gain 117 64 -116.20 gain 64 118 -114.62 gain 118 64 -118.57 gain 64 119 -117.23 gain 119 64 -120.66 gain 64 120 -97.73 gain 120 64 -96.70 gain 64 121 -97.74 gain 121 64 -99.48 gain 64 122 -101.06 gain 122 64 -105.31 gain 64 123 -93.68 gain 123 64 -95.44 gain 64 124 -99.82 gain 124 64 -101.58 gain 64 125 -100.70 gain 125 64 -104.07 gain 64 126 -108.25 gain 126 64 -107.93 gain 64 127 -100.01 gain 127 64 -101.26 gain 64 128 -102.97 gain 128 64 -106.09 gain 64 129 -108.42 gain 129 64 -108.95 gain 64 130 -108.20 gain 130 64 -111.40 gain 64 131 -113.24 gain 131 64 -114.31 gain 64 132 -109.71 gain 132 64 -113.40 gain 64 133 -111.39 gain 133 64 -113.19 gain 64 134 -104.21 gain 134 64 -105.81 gain 64 135 -101.79 gain 135 64 -105.10 gain 64 136 -103.52 gain 136 64 -108.11 gain 64 137 -100.89 gain 137 64 -103.27 gain 64 138 -97.37 gain 138 64 -95.98 gain 64 139 -106.78 gain 139 64 -107.29 gain 64 140 -104.23 gain 140 64 -110.80 gain 64 141 -102.33 gain 141 64 -103.79 gain 64 142 -101.19 gain 142 64 -107.45 gain 64 143 -107.26 gain 143 64 -109.07 gain 64 144 -110.51 gain 144 64 -113.23 gain 64 145 -111.11 gain 145 64 -113.42 gain 64 146 -107.81 gain 146 64 -107.67 gain 64 147 -111.97 gain 147 64 -115.68 gain 64 148 -109.59 gain 148 64 -112.23 gain 64 149 -116.52 gain 149 64 -118.41 gain 64 150 -107.28 gain 150 64 -114.29 gain 64 151 -104.39 gain 151 64 -104.96 gain 64 152 -107.75 gain 152 64 -110.15 gain 64 153 -106.16 gain 153 64 -110.98 gain 64 154 -109.29 gain 154 64 -109.72 gain 64 155 -106.89 gain 155 64 -111.16 gain 64 156 -111.44 gain 156 64 -113.72 gain 64 157 -110.11 gain 157 64 -114.36 gain 64 158 -104.79 gain 158 64 -109.47 gain 64 159 -109.14 gain 159 64 -107.45 gain 64 160 -104.57 gain 160 64 -105.15 gain 64 161 -110.32 gain 161 64 -113.76 gain 64 162 -114.05 gain 162 64 -114.58 gain 64 163 -110.16 gain 163 64 -107.88 gain 64 164 -114.96 gain 164 64 -114.42 gain 64 165 -111.55 gain 165 64 -113.95 gain 64 166 -111.22 gain 166 64 -116.29 gain 64 167 -108.03 gain 167 64 -112.22 gain 64 168 -106.06 gain 168 64 -111.60 gain 64 169 -103.47 gain 169 64 -101.35 gain 64 170 -103.95 gain 170 64 -112.33 gain 64 171 -100.74 gain 171 64 -105.54 gain 64 172 -104.99 gain 172 64 -102.89 gain 64 173 -114.65 gain 173 64 -117.22 gain 64 174 -112.42 gain 174 64 -114.74 gain 64 175 -103.78 gain 175 64 -105.31 gain 64 176 -112.19 gain 176 64 -113.67 gain 64 177 -112.60 gain 177 64 -115.57 gain 64 178 -115.40 gain 178 64 -119.33 gain 64 179 -117.77 gain 179 64 -122.72 gain 64 180 -115.62 gain 180 64 -116.37 gain 64 181 -120.66 gain 181 64 -125.85 gain 64 182 -108.45 gain 182 64 -109.94 gain 64 183 -107.91 gain 183 64 -110.70 gain 64 184 -112.83 gain 184 64 -117.68 gain 64 185 -106.93 gain 185 64 -107.20 gain 64 186 -110.65 gain 186 64 -109.92 gain 64 187 -112.34 gain 187 64 -115.70 gain 64 188 -113.31 gain 188 64 -119.43 gain 64 189 -111.07 gain 189 64 -116.58 gain 64 190 -111.41 gain 190 64 -112.59 gain 64 191 -116.87 gain 191 64 -121.09 gain 64 192 -113.16 gain 192 64 -114.69 gain 64 193 -119.80 gain 193 64 -125.31 gain 64 194 -115.57 gain 194 64 -120.65 gain 64 195 -111.84 gain 195 64 -115.11 gain 64 196 -110.89 gain 196 64 -113.18 gain 64 197 -110.10 gain 197 64 -115.06 gain 64 198 -109.89 gain 198 64 -118.79 gain 64 199 -107.73 gain 199 64 -108.19 gain 64 200 -107.91 gain 200 64 -105.14 gain 64 201 -112.24 gain 201 64 -113.29 gain 64 202 -112.65 gain 202 64 -115.23 gain 64 203 -108.93 gain 203 64 -108.14 gain 64 204 -115.51 gain 204 64 -121.80 gain 64 205 -120.67 gain 205 64 -125.03 gain 64 206 -113.09 gain 206 64 -115.42 gain 64 207 -110.24 gain 207 64 -113.34 gain 64 208 -112.77 gain 208 64 -116.03 gain 64 209 -117.34 gain 209 64 -116.61 gain 64 210 -114.50 gain 210 64 -120.36 gain 64 211 -116.06 gain 211 64 -118.18 gain 64 212 -110.76 gain 212 64 -110.42 gain 64 213 -111.32 gain 213 64 -115.84 gain 64 214 -115.12 gain 214 64 -115.95 gain 64 215 -116.00 gain 215 64 -117.91 gain 64 216 -112.43 gain 216 64 -115.17 gain 64 217 -111.36 gain 217 64 -117.92 gain 64 218 -110.76 gain 218 64 -109.52 gain 64 219 -118.65 gain 219 64 -120.22 gain 64 220 -112.99 gain 220 64 -110.91 gain 64 221 -112.11 gain 221 64 -114.54 gain 64 222 -113.81 gain 222 64 -117.61 gain 64 223 -118.69 gain 223 64 -124.50 gain 64 224 -114.45 gain 224 64 -120.75 gain 65 66 -74.49 gain 66 65 -77.57 gain 65 67 -90.80 gain 67 65 -92.75 gain 65 68 -90.48 gain 68 65 -99.73 gain 65 69 -101.58 gain 69 65 -104.55 gain 65 70 -89.65 gain 70 65 -94.14 gain 65 71 -107.98 gain 71 65 -112.34 gain 65 72 -107.26 gain 72 65 -109.60 gain 65 73 -112.17 gain 73 65 -115.34 gain 65 74 -107.62 gain 74 65 -113.08 gain 65 75 -100.39 gain 75 65 -103.52 gain 65 76 -96.93 gain 76 65 -101.08 gain 65 77 -100.64 gain 77 65 -107.76 gain 65 78 -91.33 gain 78 65 -95.36 gain 65 79 -89.49 gain 79 65 -91.45 gain 65 80 -74.91 gain 80 65 -78.38 gain 65 81 -86.49 gain 81 65 -87.93 gain 65 82 -87.47 gain 82 65 -91.77 gain 65 83 -100.89 gain 83 65 -104.97 gain 65 84 -103.50 gain 84 65 -105.38 gain 65 85 -99.72 gain 85 65 -99.88 gain 65 86 -115.92 gain 86 65 -124.46 gain 65 87 -107.54 gain 87 65 -111.74 gain 65 88 -106.24 gain 88 65 -110.98 gain 65 89 -112.40 gain 89 65 -117.40 gain 65 90 -106.44 gain 90 65 -112.81 gain 65 91 -101.54 gain 91 65 -107.19 gain 65 92 -96.15 gain 92 65 -102.38 gain 65 93 -91.08 gain 93 65 -98.84 gain 65 94 -93.96 gain 94 65 -96.62 gain 65 95 -89.15 gain 95 65 -95.05 gain 65 96 -89.31 gain 96 65 -90.67 gain 65 97 -100.25 gain 97 65 -105.01 gain 65 98 -102.68 gain 98 65 -106.20 gain 65 99 -94.30 gain 99 65 -101.46 gain 65 100 -97.89 gain 100 65 -106.75 gain 65 101 -100.40 gain 101 65 -105.20 gain 65 102 -106.89 gain 102 65 -111.81 gain 65 103 -105.44 gain 103 65 -110.19 gain 65 104 -105.41 gain 104 65 -105.99 gain 65 105 -109.67 gain 105 65 -115.57 gain 65 106 -95.88 gain 106 65 -100.50 gain 65 107 -97.84 gain 107 65 -102.76 gain 65 108 -94.94 gain 108 65 -99.52 gain 65 109 -89.37 gain 109 65 -95.80 gain 65 110 -93.62 gain 110 65 -97.11 gain 65 111 -102.41 gain 111 65 -108.57 gain 65 112 -99.30 gain 112 65 -105.20 gain 65 113 -101.48 gain 113 65 -109.08 gain 65 114 -98.89 gain 114 65 -103.40 gain 65 115 -106.00 gain 115 65 -105.43 gain 65 116 -100.06 gain 116 65 -105.23 gain 65 117 -113.28 gain 117 65 -121.25 gain 65 118 -124.39 gain 118 65 -129.74 gain 65 119 -105.83 gain 119 65 -110.65 gain 65 120 -107.90 gain 120 65 -108.27 gain 65 121 -104.09 gain 121 65 -107.23 gain 65 122 -102.76 gain 122 65 -108.42 gain 65 123 -107.57 gain 123 65 -110.73 gain 65 124 -95.29 gain 124 65 -98.45 gain 65 125 -96.94 gain 125 65 -101.71 gain 65 126 -94.51 gain 126 65 -95.59 gain 65 127 -100.76 gain 127 65 -103.41 gain 65 128 -96.75 gain 128 65 -101.27 gain 65 129 -110.23 gain 129 65 -112.16 gain 65 130 -99.53 gain 130 65 -104.15 gain 65 131 -109.08 gain 131 65 -111.55 gain 65 132 -102.97 gain 132 65 -108.07 gain 65 133 -110.54 gain 133 65 -113.74 gain 65 134 -111.38 gain 134 65 -114.38 gain 65 135 -113.05 gain 135 65 -117.76 gain 65 136 -100.51 gain 136 65 -106.51 gain 65 137 -99.00 gain 137 65 -102.78 gain 65 138 -104.87 gain 138 65 -104.89 gain 65 139 -105.13 gain 139 65 -107.04 gain 65 140 -101.05 gain 140 65 -109.02 gain 65 141 -104.71 gain 141 65 -107.56 gain 65 142 -108.90 gain 142 65 -116.57 gain 65 143 -101.67 gain 143 65 -104.88 gain 65 144 -104.88 gain 144 65 -109.00 gain 65 145 -111.44 gain 145 65 -115.15 gain 65 146 -114.62 gain 146 65 -115.88 gain 65 147 -103.58 gain 147 65 -108.69 gain 65 148 -104.82 gain 148 65 -108.86 gain 65 149 -110.26 gain 149 65 -113.55 gain 65 150 -109.78 gain 150 65 -118.19 gain 65 151 -108.28 gain 151 65 -110.25 gain 65 152 -98.67 gain 152 65 -102.47 gain 65 153 -104.98 gain 153 65 -111.21 gain 65 154 -105.26 gain 154 65 -107.10 gain 65 155 -103.23 gain 155 65 -108.90 gain 65 156 -98.46 gain 156 65 -102.15 gain 65 157 -102.00 gain 157 65 -107.65 gain 65 158 -108.94 gain 158 65 -115.02 gain 65 159 -106.53 gain 159 65 -106.24 gain 65 160 -107.91 gain 160 65 -109.90 gain 65 161 -113.63 gain 161 65 -118.48 gain 65 162 -110.18 gain 162 65 -112.11 gain 65 163 -112.08 gain 163 65 -111.20 gain 65 164 -114.45 gain 164 65 -115.31 gain 65 165 -107.01 gain 165 65 -110.81 gain 65 166 -108.91 gain 166 65 -115.39 gain 65 167 -107.04 gain 167 65 -112.63 gain 65 168 -111.41 gain 168 65 -118.35 gain 65 169 -106.09 gain 169 65 -105.38 gain 65 170 -110.91 gain 170 65 -120.69 gain 65 171 -105.00 gain 171 65 -111.21 gain 65 172 -112.53 gain 172 65 -111.84 gain 65 173 -110.98 gain 173 65 -114.95 gain 65 174 -109.33 gain 174 65 -113.06 gain 65 175 -115.05 gain 175 65 -117.98 gain 65 176 -109.74 gain 176 65 -112.63 gain 65 177 -112.76 gain 177 65 -117.13 gain 65 178 -113.85 gain 178 65 -119.18 gain 65 179 -113.71 gain 179 65 -120.06 gain 65 180 -108.14 gain 180 65 -110.29 gain 65 181 -105.83 gain 181 65 -112.43 gain 65 182 -112.60 gain 182 65 -115.50 gain 65 183 -107.07 gain 183 65 -111.26 gain 65 184 -106.17 gain 184 65 -112.42 gain 65 185 -100.38 gain 185 65 -102.05 gain 65 186 -105.62 gain 186 65 -106.29 gain 65 187 -105.43 gain 187 65 -110.19 gain 65 188 -105.54 gain 188 65 -113.06 gain 65 189 -104.12 gain 189 65 -111.03 gain 65 190 -107.87 gain 190 65 -110.45 gain 65 191 -117.84 gain 191 65 -123.46 gain 65 192 -113.21 gain 192 65 -116.15 gain 65 193 -115.33 gain 193 65 -122.24 gain 65 194 -119.03 gain 194 65 -125.51 gain 65 195 -111.37 gain 195 65 -116.04 gain 65 196 -113.90 gain 196 65 -117.60 gain 65 197 -109.62 gain 197 65 -115.99 gain 65 198 -110.79 gain 198 65 -121.09 gain 65 199 -100.59 gain 199 65 -102.46 gain 65 200 -107.23 gain 200 65 -105.87 gain 65 201 -108.03 gain 201 65 -110.49 gain 65 202 -109.25 gain 202 65 -113.24 gain 65 203 -109.97 gain 203 65 -110.58 gain 65 204 -114.00 gain 204 65 -121.69 gain 65 205 -111.50 gain 205 65 -117.26 gain 65 206 -117.85 gain 206 65 -121.59 gain 65 207 -108.70 gain 207 65 -113.20 gain 65 208 -114.25 gain 208 65 -118.92 gain 65 209 -114.62 gain 209 65 -115.29 gain 65 210 -120.43 gain 210 65 -127.69 gain 65 211 -113.93 gain 211 65 -117.45 gain 65 212 -106.95 gain 212 65 -108.02 gain 65 213 -108.37 gain 213 65 -114.30 gain 65 214 -115.73 gain 214 65 -117.97 gain 65 215 -112.38 gain 215 65 -115.70 gain 65 216 -109.74 gain 216 65 -113.89 gain 65 217 -106.96 gain 217 65 -114.93 gain 65 218 -112.15 gain 218 65 -112.31 gain 65 219 -119.37 gain 219 65 -122.35 gain 65 220 -120.59 gain 220 65 -119.91 gain 65 221 -119.77 gain 221 65 -123.60 gain 65 222 -118.34 gain 222 65 -123.54 gain 65 223 -114.61 gain 223 65 -121.82 gain 65 224 -113.95 gain 224 65 -121.66 gain 66 67 -85.53 gain 67 66 -84.41 gain 66 68 -88.45 gain 68 66 -94.63 gain 66 69 -92.04 gain 69 66 -91.94 gain 66 70 -105.08 gain 70 66 -106.50 gain 66 71 -101.73 gain 71 66 -103.01 gain 66 72 -108.91 gain 72 66 -108.17 gain 66 73 -107.71 gain 73 66 -107.81 gain 66 74 -123.73 gain 74 66 -126.11 gain 66 75 -102.39 gain 75 66 -102.45 gain 66 76 -98.63 gain 76 66 -99.71 gain 66 77 -108.51 gain 77 66 -112.56 gain 66 78 -106.43 gain 78 66 -107.39 gain 66 79 -100.97 gain 79 66 -99.86 gain 66 80 -91.38 gain 80 66 -91.79 gain 66 81 -82.44 gain 81 66 -80.81 gain 66 82 -81.43 gain 82 66 -82.65 gain 66 83 -103.94 gain 83 66 -104.95 gain 66 84 -101.31 gain 84 66 -100.12 gain 66 85 -106.53 gain 85 66 -103.62 gain 66 86 -111.90 gain 86 66 -117.37 gain 66 87 -101.10 gain 87 66 -102.23 gain 66 88 -104.99 gain 88 66 -106.66 gain 66 89 -114.18 gain 89 66 -116.10 gain 66 90 -106.21 gain 90 66 -109.51 gain 66 91 -102.79 gain 91 66 -105.37 gain 66 92 -105.25 gain 92 66 -108.40 gain 66 93 -102.07 gain 93 66 -106.76 gain 66 94 -97.01 gain 94 66 -96.61 gain 66 95 -89.30 gain 95 66 -92.12 gain 66 96 -93.53 gain 96 66 -91.82 gain 66 97 -95.35 gain 97 66 -97.04 gain 66 98 -104.98 gain 98 66 -105.43 gain 66 99 -105.90 gain 99 66 -109.98 gain 66 100 -108.39 gain 100 66 -114.18 gain 66 101 -102.90 gain 101 66 -104.62 gain 66 102 -109.25 gain 102 66 -111.10 gain 66 103 -111.20 gain 103 66 -112.89 gain 66 104 -107.33 gain 104 66 -104.84 gain 66 105 -106.33 gain 105 66 -109.16 gain 66 106 -111.15 gain 106 66 -112.70 gain 66 107 -105.37 gain 107 66 -107.22 gain 66 108 -104.05 gain 108 66 -105.56 gain 66 109 -99.38 gain 109 66 -102.73 gain 66 110 -101.14 gain 110 66 -101.56 gain 66 111 -93.47 gain 111 66 -96.56 gain 66 112 -103.67 gain 112 66 -106.50 gain 66 113 -105.69 gain 113 66 -110.22 gain 66 114 -100.62 gain 114 66 -102.05 gain 66 115 -95.41 gain 115 66 -91.77 gain 66 116 -103.74 gain 116 66 -105.85 gain 66 117 -106.15 gain 117 66 -111.05 gain 66 118 -109.80 gain 118 66 -112.08 gain 66 119 -111.58 gain 119 66 -113.34 gain 66 120 -109.30 gain 120 66 -106.60 gain 66 121 -109.40 gain 121 66 -109.47 gain 66 122 -109.13 gain 122 66 -111.71 gain 66 123 -108.47 gain 123 66 -108.57 gain 66 124 -113.46 gain 124 66 -113.55 gain 66 125 -107.12 gain 125 66 -108.81 gain 66 126 -104.67 gain 126 66 -102.68 gain 66 127 -101.35 gain 127 66 -100.94 gain 66 128 -108.53 gain 128 66 -109.99 gain 66 129 -106.53 gain 129 66 -105.39 gain 66 130 -107.96 gain 130 66 -109.50 gain 66 131 -107.02 gain 131 66 -106.42 gain 66 132 -107.59 gain 132 66 -109.61 gain 66 133 -110.22 gain 133 66 -110.36 gain 66 134 -112.81 gain 134 66 -112.74 gain 66 135 -107.08 gain 135 66 -108.72 gain 66 136 -109.09 gain 136 66 -112.02 gain 66 137 -110.06 gain 137 66 -110.77 gain 66 138 -102.96 gain 138 66 -99.90 gain 66 139 -103.69 gain 139 66 -102.53 gain 66 140 -107.24 gain 140 66 -112.14 gain 66 141 -109.67 gain 141 66 -109.46 gain 66 142 -106.28 gain 142 66 -110.88 gain 66 143 -107.38 gain 143 66 -107.52 gain 66 144 -105.75 gain 144 66 -106.80 gain 66 145 -110.86 gain 145 66 -111.50 gain 66 146 -114.61 gain 146 66 -112.81 gain 66 147 -115.69 gain 147 66 -117.74 gain 66 148 -108.31 gain 148 66 -109.29 gain 66 149 -118.09 gain 149 66 -118.31 gain 66 150 -113.80 gain 150 66 -119.14 gain 66 151 -114.91 gain 151 66 -113.81 gain 66 152 -105.96 gain 152 66 -106.68 gain 66 153 -108.41 gain 153 66 -111.57 gain 66 154 -111.90 gain 154 66 -110.67 gain 66 155 -104.23 gain 155 66 -106.83 gain 66 156 -113.75 gain 156 66 -114.37 gain 66 157 -101.87 gain 157 66 -104.44 gain 66 158 -98.06 gain 158 66 -101.07 gain 66 159 -103.70 gain 159 66 -100.34 gain 66 160 -109.99 gain 160 66 -108.91 gain 66 161 -111.61 gain 161 66 -113.39 gain 66 162 -109.72 gain 162 66 -108.58 gain 66 163 -111.34 gain 163 66 -107.39 gain 66 164 -113.29 gain 164 66 -111.08 gain 66 165 -110.85 gain 165 66 -111.57 gain 66 166 -116.86 gain 166 66 -120.26 gain 66 167 -107.95 gain 167 66 -110.47 gain 66 168 -111.76 gain 168 66 -115.63 gain 66 169 -107.26 gain 169 66 -103.48 gain 66 170 -104.88 gain 170 66 -111.59 gain 66 171 -108.56 gain 171 66 -111.70 gain 66 172 -111.24 gain 172 66 -107.47 gain 66 173 -107.71 gain 173 66 -108.61 gain 66 174 -105.67 gain 174 66 -106.32 gain 66 175 -108.23 gain 175 66 -108.09 gain 66 176 -106.99 gain 176 66 -106.81 gain 66 177 -108.44 gain 177 66 -109.75 gain 66 178 -117.28 gain 178 66 -119.53 gain 66 179 -117.45 gain 179 66 -120.73 gain 66 180 -105.08 gain 180 66 -104.16 gain 66 181 -114.79 gain 181 66 -118.31 gain 66 182 -109.10 gain 182 66 -108.93 gain 66 183 -120.99 gain 183 66 -122.12 gain 66 184 -113.47 gain 184 66 -116.65 gain 66 185 -116.52 gain 185 66 -115.12 gain 66 186 -115.79 gain 186 66 -113.39 gain 66 187 -107.79 gain 187 66 -109.48 gain 66 188 -111.15 gain 188 66 -115.60 gain 66 189 -109.29 gain 189 66 -113.14 gain 66 190 -114.34 gain 190 66 -113.85 gain 66 191 -106.32 gain 191 66 -108.87 gain 66 192 -116.81 gain 192 66 -116.67 gain 66 193 -112.11 gain 193 66 -115.94 gain 66 194 -115.00 gain 194 66 -118.41 gain 66 195 -116.90 gain 195 66 -118.50 gain 66 196 -113.58 gain 196 66 -114.20 gain 66 197 -111.24 gain 197 66 -114.53 gain 66 198 -109.43 gain 198 66 -116.66 gain 66 199 -109.56 gain 199 66 -108.36 gain 66 200 -117.85 gain 200 66 -113.42 gain 66 201 -113.86 gain 201 66 -113.25 gain 66 202 -114.00 gain 202 66 -114.91 gain 66 203 -112.33 gain 203 66 -109.87 gain 66 204 -107.78 gain 204 66 -112.40 gain 66 205 -107.11 gain 205 66 -109.80 gain 66 206 -121.83 gain 206 66 -122.50 gain 66 207 -112.58 gain 207 66 -114.00 gain 66 208 -118.84 gain 208 66 -120.44 gain 66 209 -116.42 gain 209 66 -114.03 gain 66 210 -115.10 gain 210 66 -119.28 gain 66 211 -119.22 gain 211 66 -119.67 gain 66 212 -113.82 gain 212 66 -111.82 gain 66 213 -116.70 gain 213 66 -119.56 gain 66 214 -114.67 gain 214 66 -113.83 gain 66 215 -115.97 gain 215 66 -116.22 gain 66 216 -113.56 gain 216 66 -114.64 gain 66 217 -113.22 gain 217 66 -118.12 gain 66 218 -116.29 gain 218 66 -113.38 gain 66 219 -119.77 gain 219 66 -119.67 gain 66 220 -110.15 gain 220 66 -106.41 gain 66 221 -115.02 gain 221 66 -115.78 gain 66 222 -118.38 gain 222 66 -120.51 gain 66 223 -114.93 gain 223 66 -119.07 gain 66 224 -115.18 gain 224 66 -119.82 gain 67 68 -81.22 gain 68 67 -88.52 gain 67 69 -84.07 gain 69 67 -85.08 gain 67 70 -98.62 gain 70 67 -101.16 gain 67 71 -100.80 gain 71 67 -103.21 gain 67 72 -105.46 gain 72 67 -105.84 gain 67 73 -102.73 gain 73 67 -103.95 gain 67 74 -110.90 gain 74 67 -114.41 gain 67 75 -109.40 gain 75 67 -110.58 gain 67 76 -106.84 gain 76 67 -109.04 gain 67 77 -101.88 gain 77 67 -107.05 gain 67 78 -103.17 gain 78 67 -105.25 gain 67 79 -97.99 gain 79 67 -98.00 gain 67 80 -93.63 gain 80 67 -95.16 gain 67 81 -84.27 gain 81 67 -83.76 gain 67 82 -85.13 gain 82 67 -87.48 gain 67 83 -82.05 gain 83 67 -84.17 gain 67 84 -87.82 gain 84 67 -87.75 gain 67 85 -95.97 gain 85 67 -94.18 gain 67 86 -104.14 gain 86 67 -110.73 gain 67 87 -103.64 gain 87 67 -105.88 gain 67 88 -109.64 gain 88 67 -112.43 gain 67 89 -115.62 gain 89 67 -118.67 gain 67 90 -112.19 gain 90 67 -116.61 gain 67 91 -104.05 gain 91 67 -107.75 gain 67 92 -100.30 gain 92 67 -104.57 gain 67 93 -96.46 gain 93 67 -102.26 gain 67 94 -99.96 gain 94 67 -100.67 gain 67 95 -92.46 gain 95 67 -96.40 gain 67 96 -93.58 gain 96 67 -92.98 gain 67 97 -89.02 gain 97 67 -91.84 gain 67 98 -96.37 gain 98 67 -97.93 gain 67 99 -98.43 gain 99 67 -103.63 gain 67 100 -96.59 gain 100 67 -103.50 gain 67 101 -93.61 gain 101 67 -96.45 gain 67 102 -107.56 gain 102 67 -110.52 gain 67 103 -98.94 gain 103 67 -101.74 gain 67 104 -107.78 gain 104 67 -106.41 gain 67 105 -107.99 gain 105 67 -111.94 gain 67 106 -107.35 gain 106 67 -110.02 gain 67 107 -107.54 gain 107 67 -110.51 gain 67 108 -102.03 gain 108 67 -104.66 gain 67 109 -106.00 gain 109 67 -110.47 gain 67 110 -95.91 gain 110 67 -97.46 gain 67 111 -95.92 gain 111 67 -100.13 gain 67 112 -100.97 gain 112 67 -104.92 gain 67 113 -101.05 gain 113 67 -106.70 gain 67 114 -101.04 gain 114 67 -103.60 gain 67 115 -108.16 gain 115 67 -105.64 gain 67 116 -96.37 gain 116 67 -99.59 gain 67 117 -106.82 gain 117 67 -112.85 gain 67 118 -102.77 gain 118 67 -106.17 gain 67 119 -102.42 gain 119 67 -105.29 gain 67 120 -108.15 gain 120 67 -106.57 gain 67 121 -106.82 gain 121 67 -108.01 gain 67 122 -105.87 gain 122 67 -109.57 gain 67 123 -99.79 gain 123 67 -101.01 gain 67 124 -105.87 gain 124 67 -107.08 gain 67 125 -97.10 gain 125 67 -99.92 gain 67 126 -113.22 gain 126 67 -112.35 gain 67 127 -103.52 gain 127 67 -104.22 gain 67 128 -102.12 gain 128 67 -104.70 gain 67 129 -101.20 gain 129 67 -101.18 gain 67 130 -101.19 gain 130 67 -103.85 gain 67 131 -108.34 gain 131 67 -108.87 gain 67 132 -110.81 gain 132 67 -113.96 gain 67 133 -118.29 gain 133 67 -119.55 gain 67 134 -109.26 gain 134 67 -110.31 gain 67 135 -105.51 gain 135 67 -108.27 gain 67 136 -110.96 gain 136 67 -115.01 gain 67 137 -116.14 gain 137 67 -117.97 gain 67 138 -105.55 gain 138 67 -103.61 gain 67 139 -100.70 gain 139 67 -100.66 gain 67 140 -103.88 gain 140 67 -109.90 gain 67 141 -106.53 gain 141 67 -107.44 gain 67 142 -101.66 gain 142 67 -107.38 gain 67 143 -109.45 gain 143 67 -110.71 gain 67 144 -102.54 gain 144 67 -104.71 gain 67 145 -107.10 gain 145 67 -108.86 gain 67 146 -112.83 gain 146 67 -112.14 gain 67 147 -106.77 gain 147 67 -109.93 gain 67 148 -112.19 gain 148 67 -114.28 gain 67 149 -112.07 gain 149 67 -113.42 gain 67 150 -113.17 gain 150 67 -119.63 gain 67 151 -105.95 gain 151 67 -105.97 gain 67 152 -105.68 gain 152 67 -107.52 gain 67 153 -111.44 gain 153 67 -115.71 gain 67 154 -112.23 gain 154 67 -112.11 gain 67 155 -111.31 gain 155 67 -115.03 gain 67 156 -104.50 gain 156 67 -106.23 gain 67 157 -107.87 gain 157 67 -111.56 gain 67 158 -105.64 gain 158 67 -109.77 gain 67 159 -105.29 gain 159 67 -103.06 gain 67 160 -110.07 gain 160 67 -110.11 gain 67 161 -105.60 gain 161 67 -108.50 gain 67 162 -105.55 gain 162 67 -105.54 gain 67 163 -107.55 gain 163 67 -104.71 gain 67 164 -110.05 gain 164 67 -108.96 gain 67 165 -111.77 gain 165 67 -113.62 gain 67 166 -115.97 gain 166 67 -120.49 gain 67 167 -107.80 gain 167 67 -111.44 gain 67 168 -108.17 gain 168 67 -113.16 gain 67 169 -111.47 gain 169 67 -108.81 gain 67 170 -119.75 gain 170 67 -127.58 gain 67 171 -106.40 gain 171 67 -110.65 gain 67 172 -110.25 gain 172 67 -107.60 gain 67 173 -103.33 gain 173 67 -105.34 gain 67 174 -108.67 gain 174 67 -110.44 gain 67 175 -101.99 gain 175 67 -102.97 gain 67 176 -115.79 gain 176 67 -116.73 gain 67 177 -114.26 gain 177 67 -116.68 gain 67 178 -116.19 gain 178 67 -119.56 gain 67 179 -112.18 gain 179 67 -116.58 gain 67 180 -110.53 gain 180 67 -110.73 gain 67 181 -108.87 gain 181 67 -113.51 gain 67 182 -110.90 gain 182 67 -111.84 gain 67 183 -108.12 gain 183 67 -110.36 gain 67 184 -120.57 gain 184 67 -124.87 gain 67 185 -119.87 gain 185 67 -119.59 gain 67 186 -108.05 gain 186 67 -106.77 gain 67 187 -109.40 gain 187 67 -112.21 gain 67 188 -103.99 gain 188 67 -109.56 gain 67 189 -114.12 gain 189 67 -119.08 gain 67 190 -113.62 gain 190 67 -114.25 gain 67 191 -112.79 gain 191 67 -116.46 gain 67 192 -109.04 gain 192 67 -110.02 gain 67 193 -110.85 gain 193 67 -115.81 gain 67 194 -114.29 gain 194 67 -118.82 gain 67 195 -121.39 gain 195 67 -124.11 gain 67 196 -107.57 gain 196 67 -109.31 gain 67 197 -114.31 gain 197 67 -118.73 gain 67 198 -111.46 gain 198 67 -119.81 gain 67 199 -108.59 gain 199 67 -108.50 gain 67 200 -108.48 gain 200 67 -105.16 gain 67 201 -109.46 gain 201 67 -109.97 gain 67 202 -109.85 gain 202 67 -111.88 gain 67 203 -107.73 gain 203 67 -106.39 gain 67 204 -112.70 gain 204 67 -118.45 gain 67 205 -115.77 gain 205 67 -119.58 gain 67 206 -107.83 gain 206 67 -109.62 gain 67 207 -111.98 gain 207 67 -114.53 gain 67 208 -108.32 gain 208 67 -111.04 gain 67 209 -109.00 gain 209 67 -107.72 gain 67 210 -116.59 gain 210 67 -121.90 gain 67 211 -111.47 gain 211 67 -113.04 gain 67 212 -111.77 gain 212 67 -110.88 gain 67 213 -115.44 gain 213 67 -119.42 gain 67 214 -110.81 gain 214 67 -111.09 gain 67 215 -113.17 gain 215 67 -114.53 gain 67 216 -113.20 gain 216 67 -115.39 gain 67 217 -114.86 gain 217 67 -120.88 gain 67 218 -109.21 gain 218 67 -107.42 gain 67 219 -111.82 gain 219 67 -112.84 gain 67 220 -110.91 gain 220 67 -108.29 gain 67 221 -115.62 gain 221 67 -117.50 gain 67 222 -108.86 gain 222 67 -112.11 gain 67 223 -119.90 gain 223 67 -125.15 gain 67 224 -115.68 gain 224 67 -121.44 gain 68 69 -92.38 gain 69 68 -86.10 gain 68 70 -99.46 gain 70 68 -94.70 gain 68 71 -107.86 gain 71 68 -102.97 gain 68 72 -109.95 gain 72 68 -103.04 gain 68 73 -113.59 gain 73 68 -107.51 gain 68 74 -113.64 gain 74 68 -109.85 gain 68 75 -121.65 gain 75 68 -115.54 gain 68 76 -118.55 gain 76 68 -113.46 gain 68 77 -124.87 gain 77 68 -122.74 gain 68 78 -113.68 gain 78 68 -108.46 gain 68 79 -109.52 gain 79 68 -102.24 gain 68 80 -100.63 gain 80 68 -94.86 gain 68 81 -101.35 gain 81 68 -93.54 gain 68 82 -90.06 gain 82 68 -85.11 gain 68 83 -89.46 gain 83 68 -84.29 gain 68 84 -100.27 gain 84 68 -92.90 gain 68 85 -99.76 gain 85 68 -90.67 gain 68 86 -107.62 gain 86 68 -106.92 gain 68 87 -111.44 gain 87 68 -106.39 gain 68 88 -111.25 gain 88 68 -106.74 gain 68 89 -115.96 gain 89 68 -111.71 gain 68 90 -115.06 gain 90 68 -112.18 gain 68 91 -120.19 gain 91 68 -116.60 gain 68 92 -111.15 gain 92 68 -108.12 gain 68 93 -103.54 gain 93 68 -102.05 gain 68 94 -107.22 gain 94 68 -100.64 gain 68 95 -104.42 gain 95 68 -101.07 gain 68 96 -101.03 gain 96 68 -93.13 gain 68 97 -98.90 gain 97 68 -94.41 gain 68 98 -99.73 gain 98 68 -94.00 gain 68 99 -91.57 gain 99 68 -89.47 gain 68 100 -102.09 gain 100 68 -101.70 gain 68 101 -105.69 gain 101 68 -101.23 gain 68 102 -102.84 gain 102 68 -98.51 gain 68 103 -117.11 gain 103 68 -112.61 gain 68 104 -113.84 gain 104 68 -105.17 gain 68 105 -112.47 gain 105 68 -109.12 gain 68 106 -112.70 gain 106 68 -108.08 gain 68 107 -103.62 gain 107 68 -99.30 gain 68 108 -117.71 gain 108 68 -113.04 gain 68 109 -116.78 gain 109 68 -113.97 gain 68 110 -108.11 gain 110 68 -102.36 gain 68 111 -112.43 gain 111 68 -109.34 gain 68 112 -108.20 gain 112 68 -104.86 gain 68 113 -111.41 gain 113 68 -109.77 gain 68 114 -102.59 gain 114 68 -97.85 gain 68 115 -104.37 gain 115 68 -94.55 gain 68 116 -104.04 gain 116 68 -99.97 gain 68 117 -113.18 gain 117 68 -111.91 gain 68 118 -113.22 gain 118 68 -109.32 gain 68 119 -116.23 gain 119 68 -111.81 gain 68 120 -119.44 gain 120 68 -110.56 gain 68 121 -115.71 gain 121 68 -109.61 gain 68 122 -115.53 gain 122 68 -111.94 gain 68 123 -111.19 gain 123 68 -105.11 gain 68 124 -109.34 gain 124 68 -103.25 gain 68 125 -116.02 gain 125 68 -111.54 gain 68 126 -101.86 gain 126 68 -93.69 gain 68 127 -108.26 gain 127 68 -101.67 gain 68 128 -110.66 gain 128 68 -105.94 gain 68 129 -106.90 gain 129 68 -99.59 gain 68 130 -116.42 gain 130 68 -111.79 gain 68 131 -112.98 gain 131 68 -106.21 gain 68 132 -110.67 gain 132 68 -106.52 gain 68 133 -114.39 gain 133 68 -108.35 gain 68 134 -110.67 gain 134 68 -104.42 gain 68 135 -124.53 gain 135 68 -120.00 gain 68 136 -111.80 gain 136 68 -108.55 gain 68 137 -117.28 gain 137 68 -111.81 gain 68 138 -116.63 gain 138 68 -107.40 gain 68 139 -116.21 gain 139 68 -108.88 gain 68 140 -117.66 gain 140 68 -116.39 gain 68 141 -108.55 gain 141 68 -102.16 gain 68 142 -109.19 gain 142 68 -107.62 gain 68 143 -107.30 gain 143 68 -101.26 gain 68 144 -118.45 gain 144 68 -113.32 gain 68 145 -111.99 gain 145 68 -106.46 gain 68 146 -109.74 gain 146 68 -101.76 gain 68 147 -119.51 gain 147 68 -115.38 gain 68 148 -119.75 gain 148 68 -114.55 gain 68 149 -123.70 gain 149 68 -117.75 gain 68 150 -117.61 gain 150 68 -116.77 gain 68 151 -118.80 gain 151 68 -111.52 gain 68 152 -116.42 gain 152 68 -110.97 gain 68 153 -114.05 gain 153 68 -111.03 gain 68 154 -112.25 gain 154 68 -104.84 gain 68 155 -114.89 gain 155 68 -111.31 gain 68 156 -115.33 gain 156 68 -109.77 gain 68 157 -112.77 gain 157 68 -109.17 gain 68 158 -112.14 gain 158 68 -108.97 gain 68 159 -113.21 gain 159 68 -103.68 gain 68 160 -118.92 gain 160 68 -111.66 gain 68 161 -124.89 gain 161 68 -120.49 gain 68 162 -110.07 gain 162 68 -102.75 gain 68 163 -111.05 gain 163 68 -100.92 gain 68 164 -124.40 gain 164 68 -116.02 gain 68 165 -119.04 gain 165 68 -113.59 gain 68 166 -121.39 gain 166 68 -118.61 gain 68 167 -118.20 gain 167 68 -114.55 gain 68 168 -124.58 gain 168 68 -122.27 gain 68 169 -120.09 gain 169 68 -110.13 gain 68 170 -113.32 gain 170 68 -113.85 gain 68 171 -119.65 gain 171 68 -116.61 gain 68 172 -122.05 gain 172 68 -112.11 gain 68 173 -116.07 gain 173 68 -110.79 gain 68 174 -113.08 gain 174 68 -107.56 gain 68 175 -123.82 gain 175 68 -117.51 gain 68 176 -120.58 gain 176 68 -114.22 gain 68 177 -117.05 gain 177 68 -112.18 gain 68 178 -117.45 gain 178 68 -113.53 gain 68 179 -120.79 gain 179 68 -117.89 gain 68 180 -115.82 gain 180 68 -108.73 gain 68 181 -118.78 gain 181 68 -116.13 gain 68 182 -113.93 gain 182 68 -107.58 gain 68 183 -124.81 gain 183 68 -119.76 gain 68 184 -115.51 gain 184 68 -112.51 gain 68 185 -126.36 gain 185 68 -118.79 gain 68 186 -119.95 gain 186 68 -111.38 gain 68 187 -122.14 gain 187 68 -117.65 gain 68 188 -118.47 gain 188 68 -116.75 gain 68 189 -123.27 gain 189 68 -120.94 gain 68 190 -120.32 gain 190 68 -113.66 gain 68 191 -119.64 gain 191 68 -116.01 gain 68 192 -113.22 gain 192 68 -106.91 gain 68 193 -116.84 gain 193 68 -114.50 gain 68 194 -125.13 gain 194 68 -122.37 gain 68 195 -122.30 gain 195 68 -117.72 gain 68 196 -122.25 gain 196 68 -116.70 gain 68 197 -117.70 gain 197 68 -114.83 gain 68 198 -117.96 gain 198 68 -119.01 gain 68 199 -115.54 gain 199 68 -108.17 gain 68 200 -120.81 gain 200 68 -110.20 gain 68 201 -119.91 gain 201 68 -113.12 gain 68 202 -121.60 gain 202 68 -116.34 gain 68 203 -123.70 gain 203 68 -115.06 gain 68 204 -116.28 gain 204 68 -114.72 gain 68 205 -113.67 gain 205 68 -110.19 gain 68 206 -110.14 gain 206 68 -104.63 gain 68 207 -119.36 gain 207 68 -114.61 gain 68 208 -122.82 gain 208 68 -118.25 gain 68 209 -118.40 gain 209 68 -109.82 gain 68 210 -125.58 gain 210 68 -123.59 gain 68 211 -124.91 gain 211 68 -119.18 gain 68 212 -119.69 gain 212 68 -111.50 gain 68 213 -125.66 gain 213 68 -122.35 gain 68 214 -118.62 gain 214 68 -111.61 gain 68 215 -117.57 gain 215 68 -111.65 gain 68 216 -115.19 gain 216 68 -110.10 gain 68 217 -122.86 gain 217 68 -121.59 gain 68 218 -112.60 gain 218 68 -103.51 gain 68 219 -125.09 gain 219 68 -118.82 gain 68 220 -117.46 gain 220 68 -107.54 gain 68 221 -123.27 gain 221 68 -117.86 gain 68 222 -112.79 gain 222 68 -108.75 gain 68 223 -123.13 gain 223 68 -121.09 gain 68 224 -119.43 gain 224 68 -117.90 gain 69 70 -85.82 gain 70 69 -87.33 gain 69 71 -89.19 gain 71 69 -90.58 gain 69 72 -98.08 gain 72 69 -97.45 gain 69 73 -97.56 gain 73 69 -97.76 gain 69 74 -103.18 gain 74 69 -105.67 gain 69 75 -118.00 gain 75 69 -118.17 gain 69 76 -116.97 gain 76 69 -118.15 gain 69 77 -104.27 gain 77 69 -108.42 gain 69 78 -104.85 gain 78 69 -105.91 gain 69 79 -107.65 gain 79 69 -106.65 gain 69 80 -91.49 gain 80 69 -92.00 gain 69 81 -90.50 gain 81 69 -88.97 gain 69 82 -104.77 gain 82 69 -106.09 gain 69 83 -89.42 gain 83 69 -90.53 gain 69 84 -88.70 gain 84 69 -87.61 gain 69 85 -88.64 gain 85 69 -85.83 gain 69 86 -96.47 gain 86 69 -102.04 gain 69 87 -103.81 gain 87 69 -105.04 gain 69 88 -99.10 gain 88 69 -100.87 gain 69 89 -111.70 gain 89 69 -113.72 gain 69 90 -108.43 gain 90 69 -111.83 gain 69 91 -108.41 gain 91 69 -111.09 gain 69 92 -109.17 gain 92 69 -112.42 gain 69 93 -103.61 gain 93 69 -108.40 gain 69 94 -109.79 gain 94 69 -109.49 gain 69 95 -106.17 gain 95 69 -109.10 gain 69 96 -96.51 gain 96 69 -94.89 gain 69 97 -96.69 gain 97 69 -98.48 gain 69 98 -86.43 gain 98 69 -86.98 gain 69 99 -92.95 gain 99 69 -97.13 gain 69 100 -88.38 gain 100 69 -94.27 gain 69 101 -101.39 gain 101 69 -103.21 gain 69 102 -100.95 gain 102 69 -102.90 gain 69 103 -100.03 gain 103 69 -101.82 gain 69 104 -104.30 gain 104 69 -101.91 gain 69 105 -118.33 gain 105 69 -121.26 gain 69 106 -113.42 gain 106 69 -115.07 gain 69 107 -114.69 gain 107 69 -116.64 gain 69 108 -111.17 gain 108 69 -112.78 gain 69 109 -102.21 gain 109 69 -105.67 gain 69 110 -108.01 gain 110 69 -108.54 gain 69 111 -108.45 gain 111 69 -111.64 gain 69 112 -100.33 gain 112 69 -103.26 gain 69 113 -99.77 gain 113 69 -104.41 gain 69 114 -95.03 gain 114 69 -96.57 gain 69 115 -95.37 gain 115 69 -91.83 gain 69 116 -101.14 gain 116 69 -103.34 gain 69 117 -98.17 gain 117 69 -103.18 gain 69 118 -100.44 gain 118 69 -102.82 gain 69 119 -104.95 gain 119 69 -106.81 gain 69 120 -105.68 gain 120 69 -103.08 gain 69 121 -107.66 gain 121 69 -107.83 gain 69 122 -110.68 gain 122 69 -113.37 gain 69 123 -113.36 gain 123 69 -113.56 gain 69 124 -109.93 gain 124 69 -110.13 gain 69 125 -101.58 gain 125 69 -103.38 gain 69 126 -101.26 gain 126 69 -99.38 gain 69 127 -98.87 gain 127 69 -98.56 gain 69 128 -98.31 gain 128 69 -99.87 gain 69 129 -108.79 gain 129 69 -107.76 gain 69 130 -99.50 gain 130 69 -101.14 gain 69 131 -111.49 gain 131 69 -111.00 gain 69 132 -101.78 gain 132 69 -103.91 gain 69 133 -102.93 gain 133 69 -103.16 gain 69 134 -112.48 gain 134 69 -112.51 gain 69 135 -116.57 gain 135 69 -118.31 gain 69 136 -114.98 gain 136 69 -118.01 gain 69 137 -111.89 gain 137 69 -112.70 gain 69 138 -98.08 gain 138 69 -95.12 gain 69 139 -103.27 gain 139 69 -102.22 gain 69 140 -109.13 gain 140 69 -114.14 gain 69 141 -101.83 gain 141 69 -101.71 gain 69 142 -106.55 gain 142 69 -111.25 gain 69 143 -108.01 gain 143 69 -108.25 gain 69 144 -104.18 gain 144 69 -105.33 gain 69 145 -103.15 gain 145 69 -103.89 gain 69 146 -107.22 gain 146 69 -105.52 gain 69 147 -106.73 gain 147 69 -108.88 gain 69 148 -110.41 gain 148 69 -111.48 gain 69 149 -107.81 gain 149 69 -108.14 gain 69 150 -122.57 gain 150 69 -128.01 gain 69 151 -118.97 gain 151 69 -117.97 gain 69 152 -117.79 gain 152 69 -118.62 gain 69 153 -107.68 gain 153 69 -110.94 gain 69 154 -113.82 gain 154 69 -112.69 gain 69 155 -107.36 gain 155 69 -110.06 gain 69 156 -101.77 gain 156 69 -102.49 gain 69 157 -108.98 gain 157 69 -111.66 gain 69 158 -111.35 gain 158 69 -114.46 gain 69 159 -108.95 gain 159 69 -105.70 gain 69 160 -115.15 gain 160 69 -114.18 gain 69 161 -108.20 gain 161 69 -110.09 gain 69 162 -108.85 gain 162 69 -107.82 gain 69 163 -111.02 gain 163 69 -107.17 gain 69 164 -118.60 gain 164 69 -116.50 gain 69 165 -111.76 gain 165 69 -112.59 gain 69 166 -114.28 gain 166 69 -117.79 gain 69 167 -116.71 gain 167 69 -119.34 gain 69 168 -114.00 gain 168 69 -117.98 gain 69 169 -108.58 gain 169 69 -104.90 gain 69 170 -117.36 gain 170 69 -124.17 gain 69 171 -112.86 gain 171 69 -116.10 gain 69 172 -110.18 gain 172 69 -106.51 gain 69 173 -105.77 gain 173 69 -106.77 gain 69 174 -101.22 gain 174 69 -101.97 gain 69 175 -110.92 gain 175 69 -110.88 gain 69 176 -108.68 gain 176 69 -108.59 gain 69 177 -107.05 gain 177 69 -108.46 gain 69 178 -118.63 gain 178 69 -120.99 gain 69 179 -111.68 gain 179 69 -115.06 gain 69 180 -113.20 gain 180 69 -112.38 gain 69 181 -118.48 gain 181 69 -122.11 gain 69 182 -114.58 gain 182 69 -114.51 gain 69 183 -108.52 gain 183 69 -109.75 gain 69 184 -113.06 gain 184 69 -116.34 gain 69 185 -113.27 gain 185 69 -111.98 gain 69 186 -107.20 gain 186 69 -104.90 gain 69 187 -110.11 gain 187 69 -111.91 gain 69 188 -106.09 gain 188 69 -110.64 gain 69 189 -106.89 gain 189 69 -110.84 gain 69 190 -112.69 gain 190 69 -112.30 gain 69 191 -106.46 gain 191 69 -109.11 gain 69 192 -115.03 gain 192 69 -115.00 gain 69 193 -111.80 gain 193 69 -115.74 gain 69 194 -113.44 gain 194 69 -116.95 gain 69 195 -122.66 gain 195 69 -124.36 gain 69 196 -118.69 gain 196 69 -119.42 gain 69 197 -117.77 gain 197 69 -121.16 gain 69 198 -111.99 gain 198 69 -119.32 gain 69 199 -114.26 gain 199 69 -113.16 gain 69 200 -115.73 gain 200 69 -111.40 gain 69 201 -112.70 gain 201 69 -112.19 gain 69 202 -111.99 gain 202 69 -113.00 gain 69 203 -114.80 gain 203 69 -112.44 gain 69 204 -111.36 gain 204 69 -116.09 gain 69 205 -112.92 gain 205 69 -115.71 gain 69 206 -116.58 gain 206 69 -117.34 gain 69 207 -114.42 gain 207 69 -115.95 gain 69 208 -108.93 gain 208 69 -110.64 gain 69 209 -109.68 gain 209 69 -107.38 gain 69 210 -116.21 gain 210 69 -120.50 gain 69 211 -118.84 gain 211 69 -119.39 gain 69 212 -119.09 gain 212 69 -117.19 gain 69 213 -114.81 gain 213 69 -117.78 gain 69 214 -109.26 gain 214 69 -108.52 gain 69 215 -110.67 gain 215 69 -111.02 gain 69 216 -113.68 gain 216 69 -114.86 gain 69 217 -113.79 gain 217 69 -118.79 gain 69 218 -117.98 gain 218 69 -115.16 gain 69 219 -113.87 gain 219 69 -113.87 gain 69 220 -110.73 gain 220 69 -107.09 gain 69 221 -119.00 gain 221 69 -119.87 gain 69 222 -113.07 gain 222 69 -115.30 gain 69 223 -114.92 gain 223 69 -119.16 gain 69 224 -118.23 gain 224 69 -122.97 gain 70 71 -84.37 gain 71 70 -84.24 gain 70 72 -98.57 gain 72 70 -96.41 gain 70 73 -102.96 gain 73 70 -101.64 gain 70 74 -105.67 gain 74 70 -106.64 gain 70 75 -116.35 gain 75 70 -114.99 gain 70 76 -115.51 gain 76 70 -115.18 gain 70 77 -116.52 gain 77 70 -119.15 gain 70 78 -108.22 gain 78 70 -107.76 gain 70 79 -111.04 gain 79 70 -108.52 gain 70 80 -101.73 gain 80 70 -100.72 gain 70 81 -99.22 gain 81 70 -96.17 gain 70 82 -101.57 gain 82 70 -101.38 gain 70 83 -100.13 gain 83 70 -99.73 gain 70 84 -90.71 gain 84 70 -88.11 gain 70 85 -85.36 gain 85 70 -81.03 gain 70 86 -89.88 gain 86 70 -93.93 gain 70 87 -92.47 gain 87 70 -92.18 gain 70 88 -89.10 gain 88 70 -89.35 gain 70 89 -104.80 gain 89 70 -105.31 gain 70 90 -118.31 gain 90 70 -120.19 gain 70 91 -113.12 gain 91 70 -114.28 gain 70 92 -114.08 gain 92 70 -115.81 gain 70 93 -114.37 gain 93 70 -117.64 gain 70 94 -107.88 gain 94 70 -106.06 gain 70 95 -105.73 gain 95 70 -107.13 gain 70 96 -109.43 gain 96 70 -106.30 gain 70 97 -98.66 gain 97 70 -98.94 gain 70 98 -108.79 gain 98 70 -107.82 gain 70 99 -96.93 gain 99 70 -99.60 gain 70 100 -99.27 gain 100 70 -103.65 gain 70 101 -102.83 gain 101 70 -103.13 gain 70 102 -102.79 gain 102 70 -103.22 gain 70 103 -104.04 gain 103 70 -104.30 gain 70 104 -100.65 gain 104 70 -96.74 gain 70 105 -114.07 gain 105 70 -115.49 gain 70 106 -121.64 gain 106 70 -121.77 gain 70 107 -106.90 gain 107 70 -107.33 gain 70 108 -110.74 gain 108 70 -110.83 gain 70 109 -110.74 gain 109 70 -112.68 gain 70 110 -109.70 gain 110 70 -108.71 gain 70 111 -112.00 gain 111 70 -113.67 gain 70 112 -101.65 gain 112 70 -103.07 gain 70 113 -103.40 gain 113 70 -106.52 gain 70 114 -104.70 gain 114 70 -104.72 gain 70 115 -95.46 gain 115 70 -90.41 gain 70 116 -103.15 gain 116 70 -103.84 gain 70 117 -100.42 gain 117 70 -103.90 gain 70 118 -108.46 gain 118 70 -109.32 gain 70 119 -106.34 gain 119 70 -106.68 gain 70 120 -114.15 gain 120 70 -110.03 gain 70 121 -122.76 gain 121 70 -121.42 gain 70 122 -106.75 gain 122 70 -107.92 gain 70 123 -104.95 gain 123 70 -103.63 gain 70 124 -115.71 gain 124 70 -114.39 gain 70 125 -109.44 gain 125 70 -109.72 gain 70 126 -100.97 gain 126 70 -97.57 gain 70 127 -99.31 gain 127 70 -97.48 gain 70 128 -109.97 gain 128 70 -110.01 gain 70 129 -96.81 gain 129 70 -94.25 gain 70 130 -96.65 gain 130 70 -96.78 gain 70 131 -103.30 gain 131 70 -101.29 gain 70 132 -100.76 gain 132 70 -101.37 gain 70 133 -113.22 gain 133 70 -111.94 gain 70 134 -106.07 gain 134 70 -104.59 gain 70 135 -115.80 gain 135 70 -116.02 gain 70 136 -114.54 gain 136 70 -116.06 gain 70 137 -114.94 gain 137 70 -114.24 gain 70 138 -115.52 gain 138 70 -111.05 gain 70 139 -111.48 gain 139 70 -108.91 gain 70 140 -106.80 gain 140 70 -110.28 gain 70 141 -106.94 gain 141 70 -105.31 gain 70 142 -103.24 gain 142 70 -106.42 gain 70 143 -99.41 gain 143 70 -98.13 gain 70 144 -111.39 gain 144 70 -111.02 gain 70 145 -113.53 gain 145 70 -112.75 gain 70 146 -106.98 gain 146 70 -103.76 gain 70 147 -110.89 gain 147 70 -111.52 gain 70 148 -107.05 gain 148 70 -106.61 gain 70 149 -117.80 gain 149 70 -116.61 gain 70 150 -115.53 gain 150 70 -119.45 gain 70 151 -113.84 gain 151 70 -111.32 gain 70 152 -115.71 gain 152 70 -115.02 gain 70 153 -113.22 gain 153 70 -114.96 gain 70 154 -110.63 gain 154 70 -107.98 gain 70 155 -105.50 gain 155 70 -106.68 gain 70 156 -105.09 gain 156 70 -104.29 gain 70 157 -114.94 gain 157 70 -116.10 gain 70 158 -105.43 gain 158 70 -107.03 gain 70 159 -107.82 gain 159 70 -103.05 gain 70 160 -111.83 gain 160 70 -109.34 gain 70 161 -108.51 gain 161 70 -108.87 gain 70 162 -110.14 gain 162 70 -107.58 gain 70 163 -103.16 gain 163 70 -97.79 gain 70 164 -114.30 gain 164 70 -110.68 gain 70 165 -115.44 gain 165 70 -114.75 gain 70 166 -115.88 gain 166 70 -117.87 gain 70 167 -117.04 gain 167 70 -118.15 gain 70 168 -114.45 gain 168 70 -116.90 gain 70 169 -111.70 gain 169 70 -106.50 gain 70 170 -113.15 gain 170 70 -118.44 gain 70 171 -122.20 gain 171 70 -123.92 gain 70 172 -117.24 gain 172 70 -112.06 gain 70 173 -106.61 gain 173 70 -106.09 gain 70 174 -108.83 gain 174 70 -108.07 gain 70 175 -103.34 gain 175 70 -101.78 gain 70 176 -111.87 gain 176 70 -110.27 gain 70 177 -104.80 gain 177 70 -104.68 gain 70 178 -110.18 gain 178 70 -111.02 gain 70 179 -111.61 gain 179 70 -113.48 gain 70 180 -114.59 gain 180 70 -112.25 gain 70 181 -110.43 gain 181 70 -112.54 gain 70 182 -115.07 gain 182 70 -113.48 gain 70 183 -112.59 gain 183 70 -112.29 gain 70 184 -119.66 gain 184 70 -121.42 gain 70 185 -114.65 gain 185 70 -111.84 gain 70 186 -117.23 gain 186 70 -113.41 gain 70 187 -115.96 gain 187 70 -116.23 gain 70 188 -107.68 gain 188 70 -110.71 gain 70 189 -114.95 gain 189 70 -117.38 gain 70 190 -107.71 gain 190 70 -105.80 gain 70 191 -109.87 gain 191 70 -111.00 gain 70 192 -111.67 gain 192 70 -110.12 gain 70 193 -116.12 gain 193 70 -118.55 gain 70 194 -112.63 gain 194 70 -114.62 gain 70 195 -126.03 gain 195 70 -126.22 gain 70 196 -118.54 gain 196 70 -117.75 gain 70 197 -121.67 gain 197 70 -123.55 gain 70 198 -116.46 gain 198 70 -122.28 gain 70 199 -116.53 gain 199 70 -113.91 gain 70 200 -111.93 gain 200 70 -106.08 gain 70 201 -117.03 gain 201 70 -115.00 gain 70 202 -111.94 gain 202 70 -111.44 gain 70 203 -112.09 gain 203 70 -108.22 gain 70 204 -108.73 gain 204 70 -111.94 gain 70 205 -113.51 gain 205 70 -114.78 gain 70 206 -115.35 gain 206 70 -114.60 gain 70 207 -110.64 gain 207 70 -110.65 gain 70 208 -116.40 gain 208 70 -116.58 gain 70 209 -117.38 gain 209 70 -113.56 gain 70 210 -126.10 gain 210 70 -128.88 gain 70 211 -118.21 gain 211 70 -117.24 gain 70 212 -119.66 gain 212 70 -116.24 gain 70 213 -113.38 gain 213 70 -114.83 gain 70 214 -119.91 gain 214 70 -117.65 gain 70 215 -125.82 gain 215 70 -124.65 gain 70 216 -111.83 gain 216 70 -111.49 gain 70 217 -122.27 gain 217 70 -125.75 gain 70 218 -110.09 gain 218 70 -105.76 gain 70 219 -114.49 gain 219 70 -112.98 gain 70 220 -112.31 gain 220 70 -107.15 gain 70 221 -111.74 gain 221 70 -111.09 gain 70 222 -122.08 gain 222 70 -122.80 gain 70 223 -117.64 gain 223 70 -120.37 gain 70 224 -115.56 gain 224 70 -118.79 gain 71 72 -92.20 gain 72 71 -90.18 gain 71 73 -92.11 gain 73 71 -90.92 gain 71 74 -104.19 gain 74 71 -105.29 gain 71 75 -109.17 gain 75 71 -107.95 gain 71 76 -110.83 gain 76 71 -110.63 gain 71 77 -115.36 gain 77 71 -118.12 gain 71 78 -109.89 gain 78 71 -109.56 gain 71 79 -107.18 gain 79 71 -104.78 gain 71 80 -106.28 gain 80 71 -105.40 gain 71 81 -111.10 gain 81 71 -108.19 gain 71 82 -103.31 gain 82 71 -103.25 gain 71 83 -94.26 gain 83 71 -93.98 gain 71 84 -99.96 gain 84 71 -97.48 gain 71 85 -95.62 gain 85 71 -91.42 gain 71 86 -87.90 gain 86 71 -92.08 gain 71 87 -88.01 gain 87 71 -87.84 gain 71 88 -91.08 gain 88 71 -91.46 gain 71 89 -99.88 gain 89 71 -100.51 gain 71 90 -111.17 gain 90 71 -113.18 gain 71 91 -118.04 gain 91 71 -119.33 gain 71 92 -114.51 gain 92 71 -116.38 gain 71 93 -113.81 gain 93 71 -117.21 gain 71 94 -108.69 gain 94 71 -106.99 gain 71 95 -109.04 gain 95 71 -110.58 gain 71 96 -101.94 gain 96 71 -98.94 gain 71 97 -103.45 gain 97 71 -103.86 gain 71 98 -97.14 gain 98 71 -96.29 gain 71 99 -98.30 gain 99 71 -101.10 gain 71 100 -98.91 gain 100 71 -103.42 gain 71 101 -90.17 gain 101 71 -90.60 gain 71 102 -97.01 gain 102 71 -97.57 gain 71 103 -97.20 gain 103 71 -97.60 gain 71 104 -102.04 gain 104 71 -98.26 gain 71 105 -114.17 gain 105 71 -115.72 gain 71 106 -112.33 gain 106 71 -112.59 gain 71 107 -119.93 gain 107 71 -120.50 gain 71 108 -114.47 gain 108 71 -114.69 gain 71 109 -112.33 gain 109 71 -114.40 gain 71 110 -113.10 gain 110 71 -112.24 gain 71 111 -113.26 gain 111 71 -115.06 gain 71 112 -106.11 gain 112 71 -107.65 gain 71 113 -104.30 gain 113 71 -107.55 gain 71 114 -103.36 gain 114 71 -103.51 gain 71 115 -98.89 gain 115 71 -93.96 gain 71 116 -104.41 gain 116 71 -105.23 gain 71 117 -105.36 gain 117 71 -108.97 gain 71 118 -105.35 gain 118 71 -106.34 gain 71 119 -111.71 gain 119 71 -112.18 gain 71 120 -123.45 gain 120 71 -119.47 gain 71 121 -111.02 gain 121 71 -109.81 gain 71 122 -117.07 gain 122 71 -118.36 gain 71 123 -110.80 gain 123 71 -109.61 gain 71 124 -106.00 gain 124 71 -104.80 gain 71 125 -117.62 gain 125 71 -118.03 gain 71 126 -115.14 gain 126 71 -111.86 gain 71 127 -110.83 gain 127 71 -109.13 gain 71 128 -107.20 gain 128 71 -107.37 gain 71 129 -105.13 gain 129 71 -102.71 gain 71 130 -96.25 gain 130 71 -96.50 gain 71 131 -100.22 gain 131 71 -98.34 gain 71 132 -102.05 gain 132 71 -102.79 gain 71 133 -100.69 gain 133 71 -99.54 gain 71 134 -108.74 gain 134 71 -107.38 gain 71 135 -112.28 gain 135 71 -112.63 gain 71 136 -117.11 gain 136 71 -118.75 gain 71 137 -118.36 gain 137 71 -117.78 gain 71 138 -115.44 gain 138 71 -111.09 gain 71 139 -108.60 gain 139 71 -106.15 gain 71 140 -112.21 gain 140 71 -115.82 gain 71 141 -108.44 gain 141 71 -106.94 gain 71 142 -107.21 gain 142 71 -110.52 gain 71 143 -103.53 gain 143 71 -102.39 gain 71 144 -108.32 gain 144 71 -108.08 gain 71 145 -107.83 gain 145 71 -107.18 gain 71 146 -106.93 gain 146 71 -103.84 gain 71 147 -106.56 gain 147 71 -107.31 gain 71 148 -108.13 gain 148 71 -107.82 gain 71 149 -104.34 gain 149 71 -103.27 gain 71 150 -116.00 gain 150 71 -120.05 gain 71 151 -117.78 gain 151 71 -115.40 gain 71 152 -109.66 gain 152 71 -109.10 gain 71 153 -119.03 gain 153 71 -120.90 gain 71 154 -109.19 gain 154 71 -106.67 gain 71 155 -110.83 gain 155 71 -112.15 gain 71 156 -116.86 gain 156 71 -116.19 gain 71 157 -113.44 gain 157 71 -114.73 gain 71 158 -110.11 gain 158 71 -111.83 gain 71 159 -107.07 gain 159 71 -102.43 gain 71 160 -110.49 gain 160 71 -108.12 gain 71 161 -109.21 gain 161 71 -109.70 gain 71 162 -112.05 gain 162 71 -109.63 gain 71 163 -106.35 gain 163 71 -101.11 gain 71 164 -115.26 gain 164 71 -111.77 gain 71 165 -121.99 gain 165 71 -121.43 gain 71 166 -122.46 gain 166 71 -124.58 gain 71 167 -113.54 gain 167 71 -114.77 gain 71 168 -117.33 gain 168 71 -119.92 gain 71 169 -112.68 gain 169 71 -107.61 gain 71 170 -117.74 gain 170 71 -123.17 gain 71 171 -107.77 gain 171 71 -109.62 gain 71 172 -114.92 gain 172 71 -109.87 gain 71 173 -112.31 gain 173 71 -111.92 gain 71 174 -118.38 gain 174 71 -117.74 gain 71 175 -108.88 gain 175 71 -107.45 gain 71 176 -103.56 gain 176 71 -102.09 gain 71 177 -109.91 gain 177 71 -109.93 gain 71 178 -110.49 gain 178 71 -111.46 gain 71 179 -105.38 gain 179 71 -107.37 gain 71 180 -121.63 gain 180 71 -119.43 gain 71 181 -119.88 gain 181 71 -122.12 gain 71 182 -117.40 gain 182 71 -115.94 gain 71 183 -119.98 gain 183 71 -119.81 gain 71 184 -125.14 gain 184 71 -127.03 gain 71 185 -116.04 gain 185 71 -113.36 gain 71 186 -116.66 gain 186 71 -112.97 gain 71 187 -116.81 gain 187 71 -117.21 gain 71 188 -115.57 gain 188 71 -118.73 gain 71 189 -108.30 gain 189 71 -110.86 gain 71 190 -112.23 gain 190 71 -110.46 gain 71 191 -111.44 gain 191 71 -112.70 gain 71 192 -111.83 gain 192 71 -110.41 gain 71 193 -105.07 gain 193 71 -107.62 gain 71 194 -112.90 gain 194 71 -115.02 gain 71 195 -121.25 gain 195 71 -121.56 gain 71 196 -109.76 gain 196 71 -109.10 gain 71 197 -116.60 gain 197 71 -118.61 gain 71 198 -117.30 gain 198 71 -123.24 gain 71 199 -116.81 gain 199 71 -114.32 gain 71 200 -121.88 gain 200 71 -116.16 gain 71 201 -103.78 gain 201 71 -101.88 gain 71 202 -116.23 gain 202 71 -115.86 gain 71 203 -105.10 gain 203 71 -101.36 gain 71 204 -108.21 gain 204 71 -111.55 gain 71 205 -113.90 gain 205 71 -115.30 gain 71 206 -114.21 gain 206 71 -113.59 gain 71 207 -110.06 gain 207 71 -110.20 gain 71 208 -112.41 gain 208 71 -112.72 gain 71 209 -121.43 gain 209 71 -117.74 gain 71 210 -119.42 gain 210 71 -122.32 gain 71 211 -122.72 gain 211 71 -121.88 gain 71 212 -115.65 gain 212 71 -112.35 gain 71 213 -113.53 gain 213 71 -115.10 gain 71 214 -110.75 gain 214 71 -108.62 gain 71 215 -113.85 gain 215 71 -112.82 gain 71 216 -115.85 gain 216 71 -115.64 gain 71 217 -116.34 gain 217 71 -119.95 gain 71 218 -118.38 gain 218 71 -114.18 gain 71 219 -127.21 gain 219 71 -125.83 gain 71 220 -116.05 gain 220 71 -111.02 gain 71 221 -109.75 gain 221 71 -109.22 gain 71 222 -115.69 gain 222 71 -116.53 gain 71 223 -118.83 gain 223 71 -121.69 gain 71 224 -114.52 gain 224 71 -117.87 gain 72 73 -77.00 gain 73 72 -77.83 gain 72 74 -93.27 gain 74 72 -96.39 gain 72 75 -112.53 gain 75 72 -113.33 gain 72 76 -114.56 gain 76 72 -116.38 gain 72 77 -117.96 gain 77 72 -122.74 gain 72 78 -118.81 gain 78 72 -120.50 gain 72 79 -109.60 gain 79 72 -109.23 gain 72 80 -105.79 gain 80 72 -106.93 gain 72 81 -103.18 gain 81 72 -102.29 gain 72 82 -109.70 gain 82 72 -111.66 gain 72 83 -107.28 gain 83 72 -109.03 gain 72 84 -94.33 gain 84 72 -93.88 gain 72 85 -94.89 gain 85 72 -92.72 gain 72 86 -90.68 gain 86 72 -96.89 gain 72 87 -96.17 gain 87 72 -98.04 gain 72 88 -81.58 gain 88 72 -83.98 gain 72 89 -94.12 gain 89 72 -96.79 gain 72 90 -117.99 gain 90 72 -122.03 gain 72 91 -117.87 gain 91 72 -121.19 gain 72 92 -121.61 gain 92 72 -125.50 gain 72 93 -115.91 gain 93 72 -121.34 gain 72 94 -111.98 gain 94 72 -112.32 gain 72 95 -110.09 gain 95 72 -113.65 gain 72 96 -111.32 gain 96 72 -110.34 gain 72 97 -99.78 gain 97 72 -102.21 gain 72 98 -104.07 gain 98 72 -105.25 gain 72 99 -102.55 gain 99 72 -107.36 gain 72 100 -100.43 gain 100 72 -106.96 gain 72 101 -96.71 gain 101 72 -99.17 gain 72 102 -102.28 gain 102 72 -104.87 gain 72 103 -87.57 gain 103 72 -89.99 gain 72 104 -100.14 gain 104 72 -98.39 gain 72 105 -119.15 gain 105 72 -122.72 gain 72 106 -115.95 gain 106 72 -118.24 gain 72 107 -116.58 gain 107 72 -119.17 gain 72 108 -112.38 gain 108 72 -114.62 gain 72 109 -110.69 gain 109 72 -114.78 gain 72 110 -98.85 gain 110 72 -100.02 gain 72 111 -111.31 gain 111 72 -115.13 gain 72 112 -110.06 gain 112 72 -113.63 gain 72 113 -105.45 gain 113 72 -110.72 gain 72 114 -97.42 gain 114 72 -99.60 gain 72 115 -99.99 gain 115 72 -97.09 gain 72 116 -96.36 gain 116 72 -99.20 gain 72 117 -103.25 gain 117 72 -108.89 gain 72 118 -96.64 gain 118 72 -99.65 gain 72 119 -99.00 gain 119 72 -101.49 gain 72 120 -112.60 gain 120 72 -110.63 gain 72 121 -117.00 gain 121 72 -117.81 gain 72 122 -112.64 gain 122 72 -115.96 gain 72 123 -110.74 gain 123 72 -111.58 gain 72 124 -107.24 gain 124 72 -108.07 gain 72 125 -103.50 gain 125 72 -105.93 gain 72 126 -104.20 gain 126 72 -102.95 gain 72 127 -104.55 gain 127 72 -104.87 gain 72 128 -109.26 gain 128 72 -111.46 gain 72 129 -106.20 gain 129 72 -105.80 gain 72 130 -107.75 gain 130 72 -110.03 gain 72 131 -102.95 gain 131 72 -103.09 gain 72 132 -101.04 gain 132 72 -103.80 gain 72 133 -99.48 gain 133 72 -100.36 gain 72 134 -101.57 gain 134 72 -102.24 gain 72 135 -112.15 gain 135 72 -114.52 gain 72 136 -113.85 gain 136 72 -117.52 gain 72 137 -122.68 gain 137 72 -124.12 gain 72 138 -120.58 gain 138 72 -118.26 gain 72 139 -118.06 gain 139 72 -117.64 gain 72 140 -115.34 gain 140 72 -120.97 gain 72 141 -107.30 gain 141 72 -107.83 gain 72 142 -102.97 gain 142 72 -108.30 gain 72 143 -110.52 gain 143 72 -111.40 gain 72 144 -108.71 gain 144 72 -110.49 gain 72 145 -108.49 gain 145 72 -109.87 gain 72 146 -99.38 gain 146 72 -98.32 gain 72 147 -108.06 gain 147 72 -110.84 gain 72 148 -102.02 gain 148 72 -103.73 gain 72 149 -104.54 gain 149 72 -105.50 gain 72 150 -119.03 gain 150 72 -125.10 gain 72 151 -121.09 gain 151 72 -120.73 gain 72 152 -110.56 gain 152 72 -112.02 gain 72 153 -110.13 gain 153 72 -114.03 gain 72 154 -120.07 gain 154 72 -119.58 gain 72 155 -114.12 gain 155 72 -117.46 gain 72 156 -113.88 gain 156 72 -115.23 gain 72 157 -106.78 gain 157 72 -110.10 gain 72 158 -111.49 gain 158 72 -115.24 gain 72 159 -102.20 gain 159 72 -99.59 gain 72 160 -103.70 gain 160 72 -103.36 gain 72 161 -106.72 gain 161 72 -109.24 gain 72 162 -107.89 gain 162 72 -107.49 gain 72 163 -105.37 gain 163 72 -102.15 gain 72 164 -107.00 gain 164 72 -105.53 gain 72 165 -113.62 gain 165 72 -115.08 gain 72 166 -121.80 gain 166 72 -125.94 gain 72 167 -111.45 gain 167 72 -114.71 gain 72 168 -120.04 gain 168 72 -124.65 gain 72 169 -115.44 gain 169 72 -112.39 gain 72 170 -117.33 gain 170 72 -124.78 gain 72 171 -114.07 gain 171 72 -117.94 gain 72 172 -112.48 gain 172 72 -109.45 gain 72 173 -109.79 gain 173 72 -111.42 gain 72 174 -106.99 gain 174 72 -108.38 gain 72 175 -109.35 gain 175 72 -109.95 gain 72 176 -111.21 gain 176 72 -111.77 gain 72 177 -107.18 gain 177 72 -109.22 gain 72 178 -112.39 gain 178 72 -115.38 gain 72 179 -110.76 gain 179 72 -114.78 gain 72 180 -117.81 gain 180 72 -117.63 gain 72 181 -118.86 gain 181 72 -123.12 gain 72 182 -115.92 gain 182 72 -116.48 gain 72 183 -109.97 gain 183 72 -111.83 gain 72 184 -120.34 gain 184 72 -124.25 gain 72 185 -120.59 gain 185 72 -119.93 gain 72 186 -113.07 gain 186 72 -111.41 gain 72 187 -118.52 gain 187 72 -120.95 gain 72 188 -106.07 gain 188 72 -111.26 gain 72 189 -106.12 gain 189 72 -110.70 gain 72 190 -107.13 gain 190 72 -107.38 gain 72 191 -108.90 gain 191 72 -112.18 gain 72 192 -111.87 gain 192 72 -112.47 gain 72 193 -122.39 gain 193 72 -126.97 gain 72 194 -118.45 gain 194 72 -122.60 gain 72 195 -110.95 gain 195 72 -113.29 gain 72 196 -114.85 gain 196 72 -116.21 gain 72 197 -104.91 gain 197 72 -108.95 gain 72 198 -114.92 gain 198 72 -122.88 gain 72 199 -114.53 gain 199 72 -114.06 gain 72 200 -117.43 gain 200 72 -113.73 gain 72 201 -117.75 gain 201 72 -117.87 gain 72 202 -105.58 gain 202 72 -107.23 gain 72 203 -111.90 gain 203 72 -110.18 gain 72 204 -116.98 gain 204 72 -122.34 gain 72 205 -110.37 gain 205 72 -113.80 gain 72 206 -103.37 gain 206 72 -104.77 gain 72 207 -115.78 gain 207 72 -117.95 gain 72 208 -111.86 gain 208 72 -114.20 gain 72 209 -120.03 gain 209 72 -118.37 gain 72 210 -120.74 gain 210 72 -125.66 gain 72 211 -117.46 gain 211 72 -118.64 gain 72 212 -113.88 gain 212 72 -112.61 gain 72 213 -123.10 gain 213 72 -126.69 gain 72 214 -119.12 gain 214 72 -119.02 gain 72 215 -110.29 gain 215 72 -111.28 gain 72 216 -115.17 gain 216 72 -116.98 gain 72 217 -110.42 gain 217 72 -116.05 gain 72 218 -113.82 gain 218 72 -111.65 gain 72 219 -117.36 gain 219 72 -118.00 gain 72 220 -111.31 gain 220 72 -108.30 gain 72 221 -110.06 gain 221 72 -111.56 gain 72 222 -108.02 gain 222 72 -110.89 gain 72 223 -106.33 gain 223 72 -111.20 gain 72 224 -110.90 gain 224 72 -116.28 gain 73 74 -83.08 gain 74 73 -85.36 gain 73 75 -122.13 gain 75 73 -122.09 gain 73 76 -121.60 gain 76 73 -122.59 gain 73 77 -118.32 gain 77 73 -122.27 gain 73 78 -112.65 gain 78 73 -113.51 gain 73 79 -120.72 gain 79 73 -119.51 gain 73 80 -108.71 gain 80 73 -109.01 gain 73 81 -109.70 gain 81 73 -107.97 gain 73 82 -109.81 gain 82 73 -110.94 gain 73 83 -110.53 gain 83 73 -111.44 gain 73 84 -98.81 gain 84 73 -97.52 gain 73 85 -104.02 gain 85 73 -101.01 gain 73 86 -94.68 gain 86 73 -100.05 gain 73 87 -91.70 gain 87 73 -92.72 gain 73 88 -80.83 gain 88 73 -82.40 gain 73 89 -77.61 gain 89 73 -79.44 gain 73 90 -117.77 gain 90 73 -120.97 gain 73 91 -120.98 gain 91 73 -123.46 gain 73 92 -125.08 gain 92 73 -128.14 gain 73 93 -118.37 gain 93 73 -122.95 gain 73 94 -114.96 gain 94 73 -114.45 gain 73 95 -109.86 gain 95 73 -112.58 gain 73 96 -110.65 gain 96 73 -108.83 gain 73 97 -106.63 gain 97 73 -108.22 gain 73 98 -110.77 gain 98 73 -111.12 gain 73 99 -112.18 gain 99 73 -116.17 gain 73 100 -105.12 gain 100 73 -110.81 gain 73 101 -100.45 gain 101 73 -102.07 gain 73 102 -88.07 gain 102 73 -89.82 gain 73 103 -92.49 gain 103 73 -94.07 gain 73 104 -90.97 gain 104 73 -88.38 gain 73 105 -119.21 gain 105 73 -121.94 gain 73 106 -119.87 gain 106 73 -121.32 gain 73 107 -116.71 gain 107 73 -118.46 gain 73 108 -117.56 gain 108 73 -118.97 gain 73 109 -107.56 gain 109 73 -110.82 gain 73 110 -111.59 gain 110 73 -111.91 gain 73 111 -112.49 gain 111 73 -115.48 gain 73 112 -103.04 gain 112 73 -105.78 gain 73 113 -100.13 gain 113 73 -104.56 gain 73 114 -105.11 gain 114 73 -106.45 gain 73 115 -104.49 gain 115 73 -100.76 gain 73 116 -103.30 gain 116 73 -105.31 gain 73 117 -103.94 gain 117 73 -108.74 gain 73 118 -99.53 gain 118 73 -101.70 gain 73 119 -94.75 gain 119 73 -96.40 gain 73 120 -108.60 gain 120 73 -105.80 gain 73 121 -121.74 gain 121 73 -121.71 gain 73 122 -118.59 gain 122 73 -121.07 gain 73 123 -112.52 gain 123 73 -112.52 gain 73 124 -109.57 gain 124 73 -109.56 gain 73 125 -117.10 gain 125 73 -118.70 gain 73 126 -114.74 gain 126 73 -112.65 gain 73 127 -111.33 gain 127 73 -110.82 gain 73 128 -107.10 gain 128 73 -108.46 gain 73 129 -108.09 gain 129 73 -106.85 gain 73 130 -110.78 gain 130 73 -112.22 gain 73 131 -108.82 gain 131 73 -108.12 gain 73 132 -95.94 gain 132 73 -97.86 gain 73 133 -108.87 gain 133 73 -108.91 gain 73 134 -102.90 gain 134 73 -102.73 gain 73 135 -123.54 gain 135 73 -125.08 gain 73 136 -119.97 gain 136 73 -122.80 gain 73 137 -114.05 gain 137 73 -114.66 gain 73 138 -113.09 gain 138 73 -109.94 gain 73 139 -112.71 gain 139 73 -111.45 gain 73 140 -115.47 gain 140 73 -120.27 gain 73 141 -106.17 gain 141 73 -105.86 gain 73 142 -104.79 gain 142 73 -109.29 gain 73 143 -109.42 gain 143 73 -109.46 gain 73 144 -102.91 gain 144 73 -103.86 gain 73 145 -108.32 gain 145 73 -108.86 gain 73 146 -106.78 gain 146 73 -104.88 gain 73 147 -105.01 gain 147 73 -106.95 gain 73 148 -112.15 gain 148 73 -113.02 gain 73 149 -111.84 gain 149 73 -111.96 gain 73 150 -114.73 gain 150 73 -119.97 gain 73 151 -113.67 gain 151 73 -112.47 gain 73 152 -118.32 gain 152 73 -118.94 gain 73 153 -115.72 gain 153 73 -118.78 gain 73 154 -115.08 gain 154 73 -113.75 gain 73 155 -121.46 gain 155 73 -123.96 gain 73 156 -115.29 gain 156 73 -115.81 gain 73 157 -115.54 gain 157 73 -118.01 gain 73 158 -113.16 gain 158 73 -116.07 gain 73 159 -109.29 gain 159 73 -105.83 gain 73 160 -107.43 gain 160 73 -106.24 gain 73 161 -105.58 gain 161 73 -107.26 gain 73 162 -99.57 gain 162 73 -98.33 gain 73 163 -109.72 gain 163 73 -105.67 gain 73 164 -113.01 gain 164 73 -110.71 gain 73 165 -117.95 gain 165 73 -118.58 gain 73 166 -117.78 gain 166 73 -121.08 gain 73 167 -118.58 gain 167 73 -121.01 gain 73 168 -120.69 gain 168 73 -124.46 gain 73 169 -120.09 gain 169 73 -116.21 gain 73 170 -112.31 gain 170 73 -118.92 gain 73 171 -114.07 gain 171 73 -117.11 gain 73 172 -109.26 gain 172 73 -105.39 gain 73 173 -106.63 gain 173 73 -107.43 gain 73 174 -118.11 gain 174 73 -118.66 gain 73 175 -117.48 gain 175 73 -117.24 gain 73 176 -112.41 gain 176 73 -112.13 gain 73 177 -104.88 gain 177 73 -106.08 gain 73 178 -102.27 gain 178 73 -104.43 gain 73 179 -108.55 gain 179 73 -111.73 gain 73 180 -117.71 gain 180 73 -116.69 gain 73 181 -118.19 gain 181 73 -121.61 gain 73 182 -114.63 gain 182 73 -114.35 gain 73 183 -114.90 gain 183 73 -115.92 gain 73 184 -122.82 gain 184 73 -125.89 gain 73 185 -118.19 gain 185 73 -116.69 gain 73 186 -107.64 gain 186 73 -105.14 gain 73 187 -109.60 gain 187 73 -111.19 gain 73 188 -116.96 gain 188 73 -121.31 gain 73 189 -117.00 gain 189 73 -120.75 gain 73 190 -112.47 gain 190 73 -111.88 gain 73 191 -109.10 gain 191 73 -111.55 gain 73 192 -110.00 gain 192 73 -109.77 gain 73 193 -114.37 gain 193 73 -118.11 gain 73 194 -111.98 gain 194 73 -115.29 gain 73 195 -118.98 gain 195 73 -120.48 gain 73 196 -111.75 gain 196 73 -112.27 gain 73 197 -116.61 gain 197 73 -119.80 gain 73 198 -114.13 gain 198 73 -121.26 gain 73 199 -120.50 gain 199 73 -119.19 gain 73 200 -121.15 gain 200 73 -116.62 gain 73 201 -113.73 gain 201 73 -113.01 gain 73 202 -117.90 gain 202 73 -118.71 gain 73 203 -115.37 gain 203 73 -112.81 gain 73 204 -121.30 gain 204 73 -125.83 gain 73 205 -122.69 gain 205 73 -125.28 gain 73 206 -116.69 gain 206 73 -117.26 gain 73 207 -115.67 gain 207 73 -117.00 gain 73 208 -115.30 gain 208 73 -116.80 gain 73 209 -106.82 gain 209 73 -104.32 gain 73 210 -116.10 gain 210 73 -120.18 gain 73 211 -114.77 gain 211 73 -115.11 gain 73 212 -121.92 gain 212 73 -119.81 gain 73 213 -120.07 gain 213 73 -122.83 gain 73 214 -110.49 gain 214 73 -109.55 gain 73 215 -112.52 gain 215 73 -112.67 gain 73 216 -119.39 gain 216 73 -120.37 gain 73 217 -114.33 gain 217 73 -119.13 gain 73 218 -113.21 gain 218 73 -110.20 gain 73 219 -119.10 gain 219 73 -118.91 gain 73 220 -118.78 gain 220 73 -114.94 gain 73 221 -114.01 gain 221 73 -114.67 gain 73 222 -113.14 gain 222 73 -115.17 gain 73 223 -114.00 gain 223 73 -118.03 gain 73 224 -118.69 gain 224 73 -123.23 gain 74 75 -123.69 gain 75 74 -121.37 gain 74 76 -116.29 gain 76 74 -114.99 gain 74 77 -122.49 gain 77 74 -124.15 gain 74 78 -118.29 gain 78 74 -116.86 gain 74 79 -118.18 gain 79 74 -114.68 gain 74 80 -117.84 gain 80 74 -115.86 gain 74 81 -109.04 gain 81 74 -105.03 gain 74 82 -113.32 gain 82 74 -112.15 gain 74 83 -106.76 gain 83 74 -105.39 gain 74 84 -106.79 gain 84 74 -103.21 gain 74 85 -108.19 gain 85 74 -102.89 gain 74 86 -102.76 gain 86 74 -105.85 gain 74 87 -96.45 gain 87 74 -95.19 gain 74 88 -88.15 gain 88 74 -87.43 gain 74 89 -82.24 gain 89 74 -81.77 gain 74 90 -121.80 gain 90 74 -122.71 gain 74 91 -119.55 gain 91 74 -119.75 gain 74 92 -111.03 gain 92 74 -111.80 gain 74 93 -117.19 gain 93 74 -119.49 gain 74 94 -114.09 gain 94 74 -111.30 gain 74 95 -109.30 gain 95 74 -109.73 gain 74 96 -118.32 gain 96 74 -114.21 gain 74 97 -111.10 gain 97 74 -110.41 gain 74 98 -115.34 gain 98 74 -113.39 gain 74 99 -111.31 gain 99 74 -113.01 gain 74 100 -111.54 gain 100 74 -114.94 gain 74 101 -106.88 gain 101 74 -106.21 gain 74 102 -99.15 gain 102 74 -98.61 gain 74 103 -98.49 gain 103 74 -97.79 gain 74 104 -91.50 gain 104 74 -86.62 gain 74 105 -117.13 gain 105 74 -117.57 gain 74 106 -118.93 gain 106 74 -118.09 gain 74 107 -117.46 gain 107 74 -116.92 gain 74 108 -120.83 gain 108 74 -119.95 gain 74 109 -114.46 gain 109 74 -115.43 gain 74 110 -114.87 gain 110 74 -112.91 gain 74 111 -108.82 gain 111 74 -109.53 gain 74 112 -113.89 gain 112 74 -114.34 gain 74 113 -103.23 gain 113 74 -105.38 gain 74 114 -111.50 gain 114 74 -110.55 gain 74 115 -111.39 gain 115 74 -105.36 gain 74 116 -107.90 gain 116 74 -107.62 gain 74 117 -101.33 gain 117 74 -103.85 gain 74 118 -102.69 gain 118 74 -102.58 gain 74 119 -103.45 gain 119 74 -102.81 gain 74 120 -126.02 gain 120 74 -120.94 gain 74 121 -127.90 gain 121 74 -125.58 gain 74 122 -114.66 gain 122 74 -114.86 gain 74 123 -118.40 gain 123 74 -116.11 gain 74 124 -110.65 gain 124 74 -108.36 gain 74 125 -118.45 gain 125 74 -117.76 gain 74 126 -111.81 gain 126 74 -107.43 gain 74 127 -121.22 gain 127 74 -118.42 gain 74 128 -109.26 gain 128 74 -108.33 gain 74 129 -100.64 gain 129 74 -97.12 gain 74 130 -115.61 gain 130 74 -114.77 gain 74 131 -113.89 gain 131 74 -110.91 gain 74 132 -104.13 gain 132 74 -103.77 gain 74 133 -100.16 gain 133 74 -97.91 gain 74 134 -109.05 gain 134 74 -106.60 gain 74 135 -127.49 gain 135 74 -126.75 gain 74 136 -124.90 gain 136 74 -125.44 gain 74 137 -118.60 gain 137 74 -116.92 gain 74 138 -120.27 gain 138 74 -114.82 gain 74 139 -114.64 gain 139 74 -111.10 gain 74 140 -116.37 gain 140 74 -118.88 gain 74 141 -113.72 gain 141 74 -111.12 gain 74 142 -117.30 gain 142 74 -119.51 gain 74 143 -119.37 gain 143 74 -117.12 gain 74 144 -111.07 gain 144 74 -109.73 gain 74 145 -100.92 gain 145 74 -99.18 gain 74 146 -111.98 gain 146 74 -107.79 gain 74 147 -112.50 gain 147 74 -112.16 gain 74 148 -108.57 gain 148 74 -107.16 gain 74 149 -107.42 gain 149 74 -105.26 gain 74 150 -119.13 gain 150 74 -122.08 gain 74 151 -114.65 gain 151 74 -111.16 gain 74 152 -122.55 gain 152 74 -120.89 gain 74 153 -121.75 gain 153 74 -122.52 gain 74 154 -122.49 gain 154 74 -118.87 gain 74 155 -122.97 gain 155 74 -123.19 gain 74 156 -114.30 gain 156 74 -112.53 gain 74 157 -115.15 gain 157 74 -115.34 gain 74 158 -113.98 gain 158 74 -114.60 gain 74 159 -114.80 gain 159 74 -109.06 gain 74 160 -108.62 gain 160 74 -105.15 gain 74 161 -111.55 gain 161 74 -110.95 gain 74 162 -111.22 gain 162 74 -107.70 gain 74 163 -109.94 gain 163 74 -103.60 gain 74 164 -110.08 gain 164 74 -105.48 gain 74 165 -122.30 gain 165 74 -120.64 gain 74 166 -121.85 gain 166 74 -122.86 gain 74 167 -114.77 gain 167 74 -114.91 gain 74 168 -118.44 gain 168 74 -119.93 gain 74 169 -122.50 gain 169 74 -116.33 gain 74 170 -112.79 gain 170 74 -117.11 gain 74 171 -118.90 gain 171 74 -119.65 gain 74 172 -115.62 gain 172 74 -109.47 gain 74 173 -119.40 gain 173 74 -117.91 gain 74 174 -116.55 gain 174 74 -114.82 gain 74 175 -110.21 gain 175 74 -107.69 gain 74 176 -108.47 gain 176 74 -105.90 gain 74 177 -114.62 gain 177 74 -113.54 gain 74 178 -111.97 gain 178 74 -111.84 gain 74 179 -112.89 gain 179 74 -113.78 gain 74 180 -124.42 gain 180 74 -121.11 gain 74 181 -124.05 gain 181 74 -125.19 gain 74 182 -121.61 gain 182 74 -119.05 gain 74 183 -120.60 gain 183 74 -119.34 gain 74 184 -119.95 gain 184 74 -120.74 gain 74 185 -117.60 gain 185 74 -113.81 gain 74 186 -116.82 gain 186 74 -112.04 gain 74 187 -123.47 gain 187 74 -122.77 gain 74 188 -115.76 gain 188 74 -117.82 gain 74 189 -118.36 gain 189 74 -119.82 gain 74 190 -112.54 gain 190 74 -109.67 gain 74 191 -111.44 gain 191 74 -111.60 gain 74 192 -112.23 gain 192 74 -109.71 gain 74 193 -117.93 gain 193 74 -119.38 gain 74 194 -114.58 gain 194 74 -115.61 gain 74 195 -122.71 gain 195 74 -121.92 gain 74 196 -122.59 gain 196 74 -120.83 gain 74 197 -118.09 gain 197 74 -119.00 gain 74 198 -119.29 gain 198 74 -124.13 gain 74 199 -123.51 gain 199 74 -119.93 gain 74 200 -122.11 gain 200 74 -115.29 gain 74 201 -116.46 gain 201 74 -113.45 gain 74 202 -120.09 gain 202 74 -118.62 gain 74 203 -112.56 gain 203 74 -107.72 gain 74 204 -117.59 gain 204 74 -119.83 gain 74 205 -115.12 gain 205 74 -115.42 gain 74 206 -121.63 gain 206 74 -119.90 gain 74 207 -117.74 gain 207 74 -116.78 gain 74 208 -119.49 gain 208 74 -118.71 gain 74 209 -115.57 gain 209 74 -110.79 gain 74 210 -119.09 gain 210 74 -120.89 gain 74 211 -117.70 gain 211 74 -115.76 gain 74 212 -121.90 gain 212 74 -117.51 gain 74 213 -120.07 gain 213 74 -120.54 gain 74 214 -126.85 gain 214 74 -123.63 gain 74 215 -122.69 gain 215 74 -120.56 gain 74 216 -117.40 gain 216 74 -116.09 gain 74 217 -112.65 gain 217 74 -115.16 gain 74 218 -118.55 gain 218 74 -113.25 gain 74 219 -120.38 gain 219 74 -117.90 gain 74 220 -115.33 gain 220 74 -109.21 gain 74 221 -114.16 gain 221 74 -112.53 gain 74 222 -118.80 gain 222 74 -118.55 gain 74 223 -115.07 gain 223 74 -116.83 gain 74 224 -115.92 gain 224 74 -118.17 gain 75 76 -83.65 gain 76 75 -84.67 gain 75 77 -90.89 gain 77 75 -94.88 gain 75 78 -94.23 gain 78 75 -95.12 gain 75 79 -97.87 gain 79 75 -96.70 gain 75 80 -111.98 gain 80 75 -112.32 gain 75 81 -105.68 gain 81 75 -103.99 gain 75 82 -113.39 gain 82 75 -114.55 gain 75 83 -109.10 gain 83 75 -110.04 gain 75 84 -115.88 gain 84 75 -114.63 gain 75 85 -106.65 gain 85 75 -103.68 gain 75 86 -116.93 gain 86 75 -122.34 gain 75 87 -112.27 gain 87 75 -113.33 gain 75 88 -122.17 gain 88 75 -123.78 gain 75 89 -115.42 gain 89 75 -117.28 gain 75 90 -80.18 gain 90 75 -83.42 gain 75 91 -91.88 gain 91 75 -94.40 gain 75 92 -99.05 gain 92 75 -102.14 gain 75 93 -99.02 gain 93 75 -103.64 gain 75 94 -103.02 gain 94 75 -102.55 gain 75 95 -104.01 gain 95 75 -106.77 gain 75 96 -108.56 gain 96 75 -106.77 gain 75 97 -117.37 gain 97 75 -119.00 gain 75 98 -109.90 gain 98 75 -110.28 gain 75 99 -112.04 gain 99 75 -116.05 gain 75 100 -115.46 gain 100 75 -121.18 gain 75 101 -114.76 gain 101 75 -116.41 gain 75 102 -116.77 gain 102 75 -118.56 gain 75 103 -117.79 gain 103 75 -119.41 gain 75 104 -118.96 gain 104 75 -116.40 gain 75 105 -86.09 gain 105 75 -88.86 gain 75 106 -97.32 gain 106 75 -98.80 gain 75 107 -94.07 gain 107 75 -95.86 gain 75 108 -100.05 gain 108 75 -101.49 gain 75 109 -96.66 gain 109 75 -99.96 gain 75 110 -104.08 gain 110 75 -104.44 gain 75 111 -104.62 gain 111 75 -107.64 gain 75 112 -113.24 gain 112 75 -116.01 gain 75 113 -111.17 gain 113 75 -115.64 gain 75 114 -110.57 gain 114 75 -111.95 gain 75 115 -116.99 gain 115 75 -113.29 gain 75 116 -113.98 gain 116 75 -116.02 gain 75 117 -122.60 gain 117 75 -127.44 gain 75 118 -116.62 gain 118 75 -118.84 gain 75 119 -115.14 gain 119 75 -116.83 gain 75 120 -95.76 gain 120 75 -92.99 gain 75 121 -104.29 gain 121 75 -104.29 gain 75 122 -97.97 gain 122 75 -100.49 gain 75 123 -102.49 gain 123 75 -102.53 gain 75 124 -113.53 gain 124 75 -113.55 gain 75 125 -106.29 gain 125 75 -107.92 gain 75 126 -109.77 gain 126 75 -107.72 gain 75 127 -109.90 gain 127 75 -109.43 gain 75 128 -113.21 gain 128 75 -114.60 gain 75 129 -115.66 gain 129 75 -114.46 gain 75 130 -119.94 gain 130 75 -121.42 gain 75 131 -117.06 gain 131 75 -116.40 gain 75 132 -109.21 gain 132 75 -111.18 gain 75 133 -117.82 gain 133 75 -117.89 gain 75 134 -115.50 gain 134 75 -115.37 gain 75 135 -99.99 gain 135 75 -101.57 gain 75 136 -101.01 gain 136 75 -103.88 gain 75 137 -103.28 gain 137 75 -103.93 gain 75 138 -103.23 gain 138 75 -100.11 gain 75 139 -112.61 gain 139 75 -111.39 gain 75 140 -98.84 gain 140 75 -103.67 gain 75 141 -110.27 gain 141 75 -109.99 gain 75 142 -110.49 gain 142 75 -115.02 gain 75 143 -107.91 gain 143 75 -107.99 gain 75 144 -119.08 gain 144 75 -120.07 gain 75 145 -109.02 gain 145 75 -109.59 gain 75 146 -115.94 gain 146 75 -114.07 gain 75 147 -118.96 gain 147 75 -120.95 gain 75 148 -115.44 gain 148 75 -116.35 gain 75 149 -128.00 gain 149 75 -128.16 gain 75 150 -108.99 gain 150 75 -114.27 gain 75 151 -99.40 gain 151 75 -98.24 gain 75 152 -106.51 gain 152 75 -107.17 gain 75 153 -105.90 gain 153 75 -109.00 gain 75 154 -107.79 gain 154 75 -106.49 gain 75 155 -113.35 gain 155 75 -115.89 gain 75 156 -100.74 gain 156 75 -101.29 gain 75 157 -112.43 gain 157 75 -114.94 gain 75 158 -111.06 gain 158 75 -114.00 gain 75 159 -110.27 gain 159 75 -106.85 gain 75 160 -119.81 gain 160 75 -118.67 gain 75 161 -120.65 gain 161 75 -122.37 gain 75 162 -115.30 gain 162 75 -114.10 gain 75 163 -118.54 gain 163 75 -114.52 gain 75 164 -119.68 gain 164 75 -117.41 gain 75 165 -113.94 gain 165 75 -114.60 gain 75 166 -104.78 gain 166 75 -108.11 gain 75 167 -102.07 gain 167 75 -104.52 gain 75 168 -113.00 gain 168 75 -116.81 gain 75 169 -108.25 gain 169 75 -104.40 gain 75 170 -102.17 gain 170 75 -108.82 gain 75 171 -117.32 gain 171 75 -120.39 gain 75 172 -115.67 gain 172 75 -111.84 gain 75 173 -108.00 gain 173 75 -108.83 gain 75 174 -116.82 gain 174 75 -117.41 gain 75 175 -119.46 gain 175 75 -119.25 gain 75 176 -116.79 gain 176 75 -116.54 gain 75 177 -119.25 gain 177 75 -120.49 gain 75 178 -117.97 gain 178 75 -120.16 gain 75 179 -122.03 gain 179 75 -125.25 gain 75 180 -114.13 gain 180 75 -113.15 gain 75 181 -108.40 gain 181 75 -111.86 gain 75 182 -114.28 gain 182 75 -114.05 gain 75 183 -112.33 gain 183 75 -113.39 gain 75 184 -109.63 gain 184 75 -112.74 gain 75 185 -115.00 gain 185 75 -113.54 gain 75 186 -110.30 gain 186 75 -107.84 gain 75 187 -114.78 gain 187 75 -116.40 gain 75 188 -113.59 gain 188 75 -117.98 gain 75 189 -114.21 gain 189 75 -117.99 gain 75 190 -118.66 gain 190 75 -118.10 gain 75 191 -119.96 gain 191 75 -122.44 gain 75 192 -125.33 gain 192 75 -125.13 gain 75 193 -125.36 gain 193 75 -129.14 gain 75 194 -119.50 gain 194 75 -122.84 gain 75 195 -108.11 gain 195 75 -109.65 gain 75 196 -111.39 gain 196 75 -111.95 gain 75 197 -118.26 gain 197 75 -121.49 gain 75 198 -116.74 gain 198 75 -123.90 gain 75 199 -113.85 gain 199 75 -112.59 gain 75 200 -113.79 gain 200 75 -109.29 gain 75 201 -114.82 gain 201 75 -114.14 gain 75 202 -113.47 gain 202 75 -114.32 gain 75 203 -119.09 gain 203 75 -116.57 gain 75 204 -113.67 gain 204 75 -118.23 gain 75 205 -115.97 gain 205 75 -118.59 gain 75 206 -111.20 gain 206 75 -111.80 gain 75 207 -122.47 gain 207 75 -123.83 gain 75 208 -115.56 gain 208 75 -117.10 gain 75 209 -120.41 gain 209 75 -117.94 gain 75 210 -112.95 gain 210 75 -117.08 gain 75 211 -104.69 gain 211 75 -105.07 gain 75 212 -107.85 gain 212 75 -105.78 gain 75 213 -115.54 gain 213 75 -118.34 gain 75 214 -111.53 gain 214 75 -110.62 gain 75 215 -122.17 gain 215 75 -122.35 gain 75 216 -118.89 gain 216 75 -119.91 gain 75 217 -116.30 gain 217 75 -121.13 gain 75 218 -116.73 gain 218 75 -113.75 gain 75 219 -119.01 gain 219 75 -118.85 gain 75 220 -118.86 gain 220 75 -115.05 gain 75 221 -120.39 gain 221 75 -121.08 gain 75 222 -118.45 gain 222 75 -120.52 gain 75 223 -121.47 gain 223 75 -125.55 gain 75 224 -120.71 gain 224 75 -125.29 gain 76 77 -85.07 gain 77 76 -88.04 gain 76 78 -88.54 gain 78 76 -88.42 gain 76 79 -100.81 gain 79 76 -98.61 gain 76 80 -110.44 gain 80 76 -109.76 gain 76 81 -104.76 gain 81 76 -102.05 gain 76 82 -107.71 gain 82 76 -107.85 gain 76 83 -108.37 gain 83 76 -108.29 gain 76 84 -117.61 gain 84 76 -115.33 gain 76 85 -113.13 gain 85 76 -109.14 gain 76 86 -117.42 gain 86 76 -121.81 gain 76 87 -112.03 gain 87 76 -112.07 gain 76 88 -121.68 gain 88 76 -122.27 gain 76 89 -124.15 gain 89 76 -124.99 gain 76 90 -91.68 gain 90 76 -93.90 gain 76 91 -89.86 gain 91 76 -91.36 gain 76 92 -83.50 gain 92 76 -85.57 gain 76 93 -97.51 gain 93 76 -101.11 gain 76 94 -91.66 gain 94 76 -90.18 gain 76 95 -103.99 gain 95 76 -105.73 gain 76 96 -105.95 gain 96 76 -103.15 gain 76 97 -109.61 gain 97 76 -110.22 gain 76 98 -113.47 gain 98 76 -112.83 gain 76 99 -115.13 gain 99 76 -118.13 gain 76 100 -107.18 gain 100 76 -111.89 gain 76 101 -116.04 gain 101 76 -116.68 gain 76 102 -114.00 gain 102 76 -114.76 gain 76 103 -113.65 gain 103 76 -114.25 gain 76 104 -115.54 gain 104 76 -111.96 gain 76 105 -94.14 gain 105 76 -95.89 gain 76 106 -91.63 gain 106 76 -92.10 gain 76 107 -95.12 gain 107 76 -95.88 gain 76 108 -92.14 gain 108 76 -92.57 gain 76 109 -102.30 gain 109 76 -104.58 gain 76 110 -106.11 gain 110 76 -105.45 gain 76 111 -105.46 gain 111 76 -107.46 gain 76 112 -106.58 gain 112 76 -108.33 gain 76 113 -109.57 gain 113 76 -113.02 gain 76 114 -112.28 gain 114 76 -112.63 gain 76 115 -111.41 gain 115 76 -106.68 gain 76 116 -117.04 gain 116 76 -118.06 gain 76 117 -110.17 gain 117 76 -113.99 gain 76 118 -118.39 gain 118 76 -119.59 gain 76 119 -114.37 gain 119 76 -115.05 gain 76 120 -100.25 gain 120 76 -96.47 gain 76 121 -96.49 gain 121 76 -95.48 gain 76 122 -97.64 gain 122 76 -99.14 gain 76 123 -99.53 gain 123 76 -98.54 gain 76 124 -110.19 gain 124 76 -109.20 gain 76 125 -98.77 gain 125 76 -99.39 gain 76 126 -106.11 gain 126 76 -103.04 gain 76 127 -107.64 gain 127 76 -106.14 gain 76 128 -107.52 gain 128 76 -107.89 gain 76 129 -120.10 gain 129 76 -117.88 gain 76 130 -113.05 gain 130 76 -113.51 gain 76 131 -113.93 gain 131 76 -112.25 gain 76 132 -113.37 gain 132 76 -114.31 gain 76 133 -109.62 gain 133 76 -108.67 gain 76 134 -109.87 gain 134 76 -108.72 gain 76 135 -101.69 gain 135 76 -102.25 gain 76 136 -107.49 gain 136 76 -109.33 gain 76 137 -102.66 gain 137 76 -102.29 gain 76 138 -110.70 gain 138 76 -106.56 gain 76 139 -108.07 gain 139 76 -105.83 gain 76 140 -111.08 gain 140 76 -114.90 gain 76 141 -119.22 gain 141 76 -117.92 gain 76 142 -118.41 gain 142 76 -121.93 gain 76 143 -105.21 gain 143 76 -104.27 gain 76 144 -114.34 gain 144 76 -114.31 gain 76 145 -116.79 gain 145 76 -116.35 gain 76 146 -111.36 gain 146 76 -108.47 gain 76 147 -115.30 gain 147 76 -116.26 gain 76 148 -116.91 gain 148 76 -116.80 gain 76 149 -115.93 gain 149 76 -115.07 gain 76 150 -108.92 gain 150 76 -113.17 gain 76 151 -103.48 gain 151 76 -101.29 gain 76 152 -110.53 gain 152 76 -110.17 gain 76 153 -104.76 gain 153 76 -106.83 gain 76 154 -110.69 gain 154 76 -108.37 gain 76 155 -103.37 gain 155 76 -104.89 gain 76 156 -112.49 gain 156 76 -112.02 gain 76 157 -110.70 gain 157 76 -112.19 gain 76 158 -117.31 gain 158 76 -119.24 gain 76 159 -107.64 gain 159 76 -103.20 gain 76 160 -111.97 gain 160 76 -109.81 gain 76 161 -113.23 gain 161 76 -113.93 gain 76 162 -116.56 gain 162 76 -114.34 gain 76 163 -125.36 gain 163 76 -120.33 gain 76 164 -120.74 gain 164 76 -117.45 gain 76 165 -109.81 gain 165 76 -109.45 gain 76 166 -116.57 gain 166 76 -118.89 gain 76 167 -105.23 gain 167 76 -106.67 gain 76 168 -99.99 gain 168 76 -102.78 gain 76 169 -111.61 gain 169 76 -106.74 gain 76 170 -113.09 gain 170 76 -118.72 gain 76 171 -113.64 gain 171 76 -115.69 gain 76 172 -113.25 gain 172 76 -108.40 gain 76 173 -118.45 gain 173 76 -118.26 gain 76 174 -118.75 gain 174 76 -118.32 gain 76 175 -117.77 gain 175 76 -116.55 gain 76 176 -118.27 gain 176 76 -117.00 gain 76 177 -111.04 gain 177 76 -111.27 gain 76 178 -121.45 gain 178 76 -122.62 gain 76 179 -120.20 gain 179 76 -122.40 gain 76 180 -111.11 gain 180 76 -109.11 gain 76 181 -107.78 gain 181 76 -110.22 gain 76 182 -103.24 gain 182 76 -101.98 gain 76 183 -112.53 gain 183 76 -112.57 gain 76 184 -110.51 gain 184 76 -112.61 gain 76 185 -113.82 gain 185 76 -111.34 gain 76 186 -106.74 gain 186 76 -103.26 gain 76 187 -101.46 gain 187 76 -102.06 gain 76 188 -111.90 gain 188 76 -115.27 gain 76 189 -118.16 gain 189 76 -120.92 gain 76 190 -116.72 gain 190 76 -115.15 gain 76 191 -117.58 gain 191 76 -119.04 gain 76 192 -118.88 gain 192 76 -117.66 gain 76 193 -112.64 gain 193 76 -115.40 gain 76 194 -121.56 gain 194 76 -123.88 gain 76 195 -115.68 gain 195 76 -116.19 gain 76 196 -108.39 gain 196 76 -107.93 gain 76 197 -108.85 gain 197 76 -111.06 gain 76 198 -105.61 gain 198 76 -111.76 gain 76 199 -111.82 gain 199 76 -109.53 gain 76 200 -113.43 gain 200 76 -107.91 gain 76 201 -117.85 gain 201 76 -116.15 gain 76 202 -114.81 gain 202 76 -114.64 gain 76 203 -113.65 gain 203 76 -110.11 gain 76 204 -114.54 gain 204 76 -118.08 gain 76 205 -109.87 gain 205 76 -111.47 gain 76 206 -115.33 gain 206 76 -114.92 gain 76 207 -119.61 gain 207 76 -119.95 gain 76 208 -116.00 gain 208 76 -116.52 gain 76 209 -121.13 gain 209 76 -117.65 gain 76 210 -109.74 gain 210 76 -112.84 gain 76 211 -112.69 gain 211 76 -112.05 gain 76 212 -117.59 gain 212 76 -114.50 gain 76 213 -105.98 gain 213 76 -107.76 gain 76 214 -114.72 gain 214 76 -112.80 gain 76 215 -120.28 gain 215 76 -119.44 gain 76 216 -115.57 gain 216 76 -115.57 gain 76 217 -121.95 gain 217 76 -125.76 gain 76 218 -117.82 gain 218 76 -113.82 gain 76 219 -118.87 gain 219 76 -117.69 gain 76 220 -118.11 gain 220 76 -113.28 gain 76 221 -119.11 gain 221 76 -118.79 gain 76 222 -112.22 gain 222 76 -113.26 gain 76 223 -125.89 gain 223 76 -128.95 gain 76 224 -118.09 gain 224 76 -121.65 gain 77 78 -83.20 gain 78 77 -80.11 gain 77 79 -107.24 gain 79 77 -102.08 gain 77 80 -106.65 gain 80 77 -103.01 gain 77 81 -102.59 gain 81 77 -96.92 gain 77 82 -108.50 gain 82 77 -105.67 gain 77 83 -114.66 gain 83 77 -111.62 gain 77 84 -118.35 gain 84 77 -113.11 gain 77 85 -115.39 gain 85 77 -108.43 gain 77 86 -121.99 gain 86 77 -123.41 gain 77 87 -114.78 gain 87 77 -111.86 gain 77 88 -125.02 gain 88 77 -122.64 gain 77 89 -111.58 gain 89 77 -109.46 gain 77 90 -100.86 gain 90 77 -100.11 gain 77 91 -95.15 gain 91 77 -93.69 gain 77 92 -85.76 gain 92 77 -84.87 gain 77 93 -90.97 gain 93 77 -91.61 gain 77 94 -100.30 gain 94 77 -95.84 gain 77 95 -97.10 gain 95 77 -95.87 gain 77 96 -111.92 gain 96 77 -106.15 gain 77 97 -108.32 gain 97 77 -105.96 gain 77 98 -114.00 gain 98 77 -110.40 gain 77 99 -111.06 gain 99 77 -111.10 gain 77 100 -112.66 gain 100 77 -114.40 gain 77 101 -113.72 gain 101 77 -111.39 gain 77 102 -115.05 gain 102 77 -112.85 gain 77 103 -122.05 gain 103 77 -119.68 gain 77 104 -121.41 gain 104 77 -114.87 gain 77 105 -98.91 gain 105 77 -97.69 gain 77 106 -96.69 gain 106 77 -94.19 gain 77 107 -89.23 gain 107 77 -87.03 gain 77 108 -105.63 gain 108 77 -103.09 gain 77 109 -100.35 gain 109 77 -99.66 gain 77 110 -108.71 gain 110 77 -105.08 gain 77 111 -119.05 gain 111 77 -118.09 gain 77 112 -103.34 gain 112 77 -102.13 gain 77 113 -115.58 gain 113 77 -116.06 gain 77 114 -113.82 gain 114 77 -111.21 gain 77 115 -117.18 gain 115 77 -109.49 gain 77 116 -115.27 gain 116 77 -113.32 gain 77 117 -113.37 gain 117 77 -114.22 gain 77 118 -118.32 gain 118 77 -116.55 gain 77 119 -123.13 gain 119 77 -120.84 gain 77 120 -106.16 gain 120 77 -99.41 gain 77 121 -107.93 gain 121 77 -103.96 gain 77 122 -100.95 gain 122 77 -99.48 gain 77 123 -102.22 gain 123 77 -98.27 gain 77 124 -98.89 gain 124 77 -94.93 gain 77 125 -100.72 gain 125 77 -98.37 gain 77 126 -108.72 gain 126 77 -102.69 gain 77 127 -107.82 gain 127 77 -103.35 gain 77 128 -113.84 gain 128 77 -111.24 gain 77 129 -117.44 gain 129 77 -112.25 gain 77 130 -113.85 gain 130 77 -111.35 gain 77 131 -117.18 gain 131 77 -112.54 gain 77 132 -109.60 gain 132 77 -107.58 gain 77 133 -121.87 gain 133 77 -117.95 gain 77 134 -121.60 gain 134 77 -117.48 gain 77 135 -111.63 gain 135 77 -109.22 gain 77 136 -102.70 gain 136 77 -101.58 gain 77 137 -100.15 gain 137 77 -96.81 gain 77 138 -106.73 gain 138 77 -99.63 gain 77 139 -111.61 gain 139 77 -106.41 gain 77 140 -101.01 gain 140 77 -101.86 gain 77 141 -106.42 gain 141 77 -102.16 gain 77 142 -114.34 gain 142 77 -114.89 gain 77 143 -112.74 gain 143 77 -108.83 gain 77 144 -114.79 gain 144 77 -111.79 gain 77 145 -107.17 gain 145 77 -103.76 gain 77 146 -125.17 gain 146 77 -119.32 gain 77 147 -117.07 gain 147 77 -115.07 gain 77 148 -118.06 gain 148 77 -114.98 gain 77 149 -124.18 gain 149 77 -120.35 gain 77 150 -116.16 gain 150 77 -117.45 gain 77 151 -109.11 gain 151 77 -103.96 gain 77 152 -112.89 gain 152 77 -109.57 gain 77 153 -108.71 gain 153 77 -107.82 gain 77 154 -109.76 gain 154 77 -104.48 gain 77 155 -114.27 gain 155 77 -112.82 gain 77 156 -114.95 gain 156 77 -111.51 gain 77 157 -114.43 gain 157 77 -112.96 gain 77 158 -112.50 gain 158 77 -111.47 gain 77 159 -117.68 gain 159 77 -110.28 gain 77 160 -114.57 gain 160 77 -109.44 gain 77 161 -117.04 gain 161 77 -114.77 gain 77 162 -121.00 gain 162 77 -115.81 gain 77 163 -123.30 gain 163 77 -115.30 gain 77 164 -122.82 gain 164 77 -116.57 gain 77 165 -105.82 gain 165 77 -102.49 gain 77 166 -110.65 gain 166 77 -110.01 gain 77 167 -116.76 gain 167 77 -115.23 gain 77 168 -117.74 gain 168 77 -117.56 gain 77 169 -113.00 gain 169 77 -105.17 gain 77 170 -108.35 gain 170 77 -111.01 gain 77 171 -113.05 gain 171 77 -112.14 gain 77 172 -113.95 gain 172 77 -106.14 gain 77 173 -115.33 gain 173 77 -112.18 gain 77 174 -116.61 gain 174 77 -113.21 gain 77 175 -113.86 gain 175 77 -109.68 gain 77 176 -116.83 gain 176 77 -112.59 gain 77 177 -122.60 gain 177 77 -119.85 gain 77 178 -122.79 gain 178 77 -121.00 gain 77 179 -122.77 gain 179 77 -122.01 gain 77 180 -117.27 gain 180 77 -112.31 gain 77 181 -105.75 gain 181 77 -105.23 gain 77 182 -121.24 gain 182 77 -117.02 gain 77 183 -113.82 gain 183 77 -110.90 gain 77 184 -109.97 gain 184 77 -109.10 gain 77 185 -107.46 gain 185 77 -102.02 gain 77 186 -115.31 gain 186 77 -108.86 gain 77 187 -110.83 gain 187 77 -108.48 gain 77 188 -116.89 gain 188 77 -117.29 gain 77 189 -115.13 gain 189 77 -114.93 gain 77 190 -116.91 gain 190 77 -112.37 gain 77 191 -116.20 gain 191 77 -114.70 gain 77 192 -118.68 gain 192 77 -114.50 gain 77 193 -117.25 gain 193 77 -117.04 gain 77 194 -118.65 gain 194 77 -118.01 gain 77 195 -119.33 gain 195 77 -116.88 gain 77 196 -115.78 gain 196 77 -112.36 gain 77 197 -121.49 gain 197 77 -120.74 gain 77 198 -117.54 gain 198 77 -120.72 gain 77 199 -118.54 gain 199 77 -113.29 gain 77 200 -115.19 gain 200 77 -106.71 gain 77 201 -119.02 gain 201 77 -114.35 gain 77 202 -123.63 gain 202 77 -120.49 gain 77 203 -115.59 gain 203 77 -109.09 gain 77 204 -123.37 gain 204 77 -123.94 gain 77 205 -126.22 gain 205 77 -124.86 gain 77 206 -120.67 gain 206 77 -117.29 gain 77 207 -125.97 gain 207 77 -123.35 gain 77 208 -125.02 gain 208 77 -122.57 gain 77 209 -125.81 gain 209 77 -119.36 gain 77 210 -124.66 gain 210 77 -124.80 gain 77 211 -111.46 gain 211 77 -107.86 gain 77 212 -110.02 gain 212 77 -103.97 gain 77 213 -113.84 gain 213 77 -112.65 gain 77 214 -116.36 gain 214 77 -111.47 gain 77 215 -115.61 gain 215 77 -111.81 gain 77 216 -116.26 gain 216 77 -113.29 gain 77 217 -119.55 gain 217 77 -120.40 gain 77 218 -120.70 gain 218 77 -113.74 gain 77 219 -120.50 gain 219 77 -116.36 gain 77 220 -120.04 gain 220 77 -112.24 gain 77 221 -121.55 gain 221 77 -118.27 gain 77 222 -119.99 gain 222 77 -118.07 gain 77 223 -118.01 gain 223 77 -118.10 gain 77 224 -119.19 gain 224 77 -119.78 gain 78 79 -85.78 gain 79 78 -83.72 gain 78 80 -92.93 gain 80 78 -92.38 gain 78 81 -105.28 gain 81 78 -102.69 gain 78 82 -104.21 gain 82 78 -104.47 gain 78 83 -107.93 gain 83 78 -107.98 gain 78 84 -108.72 gain 84 78 -106.58 gain 78 85 -117.04 gain 85 78 -113.18 gain 78 86 -116.70 gain 86 78 -121.22 gain 78 87 -109.16 gain 87 78 -109.33 gain 78 88 -114.36 gain 88 78 -115.07 gain 78 89 -117.20 gain 89 78 -118.17 gain 78 90 -93.48 gain 90 78 -95.82 gain 78 91 -92.16 gain 91 78 -93.78 gain 78 92 -90.77 gain 92 78 -92.97 gain 78 93 -86.81 gain 93 78 -90.54 gain 78 94 -91.14 gain 94 78 -89.77 gain 78 95 -95.21 gain 95 78 -97.08 gain 78 96 -95.78 gain 96 78 -93.10 gain 78 97 -98.65 gain 97 78 -99.39 gain 78 98 -101.99 gain 98 78 -101.48 gain 78 99 -113.30 gain 99 78 -116.43 gain 78 100 -116.63 gain 100 78 -121.47 gain 78 101 -109.50 gain 101 78 -110.26 gain 78 102 -112.89 gain 102 78 -113.78 gain 78 103 -116.65 gain 103 78 -117.37 gain 78 104 -111.65 gain 104 78 -108.20 gain 78 105 -103.20 gain 105 78 -105.07 gain 78 106 -96.72 gain 106 78 -97.31 gain 78 107 -101.15 gain 107 78 -102.04 gain 78 108 -89.35 gain 108 78 -89.91 gain 78 109 -96.08 gain 109 78 -98.48 gain 78 110 -102.36 gain 110 78 -101.83 gain 78 111 -105.20 gain 111 78 -107.33 gain 78 112 -103.09 gain 112 78 -104.97 gain 78 113 -106.93 gain 113 78 -110.50 gain 78 114 -106.84 gain 114 78 -107.32 gain 78 115 -113.85 gain 115 78 -109.25 gain 78 116 -109.72 gain 116 78 -110.87 gain 78 117 -114.94 gain 117 78 -118.88 gain 78 118 -110.71 gain 118 78 -112.03 gain 78 119 -109.63 gain 119 78 -110.42 gain 78 120 -106.26 gain 120 78 -102.61 gain 78 121 -104.13 gain 121 78 -103.24 gain 78 122 -105.36 gain 122 78 -106.98 gain 78 123 -90.37 gain 123 78 -89.51 gain 78 124 -106.37 gain 124 78 -105.50 gain 78 125 -100.91 gain 125 78 -101.65 gain 78 126 -102.71 gain 126 78 -99.76 gain 78 127 -103.44 gain 127 78 -102.07 gain 78 128 -111.71 gain 128 78 -112.21 gain 78 129 -105.70 gain 129 78 -103.60 gain 78 130 -112.15 gain 130 78 -112.73 gain 78 131 -120.19 gain 131 78 -118.64 gain 78 132 -115.22 gain 132 78 -116.29 gain 78 133 -117.37 gain 133 78 -116.54 gain 78 134 -120.21 gain 134 78 -119.18 gain 78 135 -114.46 gain 135 78 -115.14 gain 78 136 -100.91 gain 136 78 -102.89 gain 78 137 -104.73 gain 137 78 -104.48 gain 78 138 -107.64 gain 138 78 -103.62 gain 78 139 -97.22 gain 139 78 -95.10 gain 78 140 -103.49 gain 140 78 -107.43 gain 78 141 -106.71 gain 141 78 -105.54 gain 78 142 -106.46 gain 142 78 -110.10 gain 78 143 -106.76 gain 143 78 -105.95 gain 78 144 -109.99 gain 144 78 -110.08 gain 78 145 -104.66 gain 145 78 -104.35 gain 78 146 -105.97 gain 146 78 -103.21 gain 78 147 -124.51 gain 147 78 -125.59 gain 78 148 -107.28 gain 148 78 -107.29 gain 78 149 -110.12 gain 149 78 -109.39 gain 78 150 -102.14 gain 150 78 -106.52 gain 78 151 -107.50 gain 151 78 -105.44 gain 78 152 -100.14 gain 152 78 -99.90 gain 78 153 -109.19 gain 153 78 -111.39 gain 78 154 -110.54 gain 154 78 -108.35 gain 78 155 -100.95 gain 155 78 -102.59 gain 78 156 -108.90 gain 156 78 -108.56 gain 78 157 -112.05 gain 157 78 -113.67 gain 78 158 -112.32 gain 158 78 -114.38 gain 78 159 -110.61 gain 159 78 -106.30 gain 78 160 -115.54 gain 160 78 -113.50 gain 78 161 -110.23 gain 161 78 -111.06 gain 78 162 -117.07 gain 162 78 -114.97 gain 78 163 -118.80 gain 163 78 -113.89 gain 78 164 -117.04 gain 164 78 -113.87 gain 78 165 -107.42 gain 165 78 -107.19 gain 78 166 -105.28 gain 166 78 -107.72 gain 78 167 -111.46 gain 167 78 -113.03 gain 78 168 -110.04 gain 168 78 -112.96 gain 78 169 -109.29 gain 169 78 -104.55 gain 78 170 -109.00 gain 170 78 -114.75 gain 78 171 -102.43 gain 171 78 -104.60 gain 78 172 -109.43 gain 172 78 -104.71 gain 78 173 -104.24 gain 173 78 -104.17 gain 78 174 -114.07 gain 174 78 -113.76 gain 78 175 -103.63 gain 175 78 -102.53 gain 78 176 -116.69 gain 176 78 -115.55 gain 78 177 -114.49 gain 177 78 -114.84 gain 78 178 -112.60 gain 178 78 -113.90 gain 78 179 -117.51 gain 179 78 -119.84 gain 78 180 -114.95 gain 180 78 -113.08 gain 78 181 -114.59 gain 181 78 -117.16 gain 78 182 -109.27 gain 182 78 -108.14 gain 78 183 -111.80 gain 183 78 -111.97 gain 78 184 -113.02 gain 184 78 -115.24 gain 78 185 -108.09 gain 185 78 -105.73 gain 78 186 -110.90 gain 186 78 -107.55 gain 78 187 -106.52 gain 187 78 -107.26 gain 78 188 -117.58 gain 188 78 -121.08 gain 78 189 -106.45 gain 189 78 -109.34 gain 78 190 -117.89 gain 190 78 -116.44 gain 78 191 -109.46 gain 191 78 -111.05 gain 78 192 -121.79 gain 192 78 -120.70 gain 78 193 -118.44 gain 193 78 -121.32 gain 78 194 -119.32 gain 194 78 -121.77 gain 78 195 -117.13 gain 195 78 -117.77 gain 78 196 -108.61 gain 196 78 -108.27 gain 78 197 -113.08 gain 197 78 -115.42 gain 78 198 -112.01 gain 198 78 -118.29 gain 78 199 -116.51 gain 199 78 -114.35 gain 78 200 -107.44 gain 200 78 -102.05 gain 78 201 -112.14 gain 201 78 -110.57 gain 78 202 -114.25 gain 202 78 -114.20 gain 78 203 -119.13 gain 203 78 -115.72 gain 78 204 -115.38 gain 204 78 -119.04 gain 78 205 -117.18 gain 205 78 -118.91 gain 78 206 -119.49 gain 206 78 -119.20 gain 78 207 -118.03 gain 207 78 -118.50 gain 78 208 -121.62 gain 208 78 -122.26 gain 78 209 -123.70 gain 209 78 -120.35 gain 78 210 -117.92 gain 210 78 -121.15 gain 78 211 -111.75 gain 211 78 -111.24 gain 78 212 -121.59 gain 212 78 -118.63 gain 78 213 -112.84 gain 213 78 -114.75 gain 78 214 -115.19 gain 214 78 -113.40 gain 78 215 -111.30 gain 215 78 -110.59 gain 78 216 -107.61 gain 216 78 -107.73 gain 78 217 -115.39 gain 217 78 -119.33 gain 78 218 -118.17 gain 218 78 -114.30 gain 78 219 -110.26 gain 219 78 -109.21 gain 78 220 -108.15 gain 220 78 -103.45 gain 78 221 -117.30 gain 221 78 -117.11 gain 78 222 -118.21 gain 222 78 -119.39 gain 78 223 -117.76 gain 223 78 -120.95 gain 78 224 -121.44 gain 224 78 -125.12 gain 79 80 -87.46 gain 80 79 -88.97 gain 79 81 -87.97 gain 81 79 -87.45 gain 79 82 -96.17 gain 82 79 -98.50 gain 79 83 -106.80 gain 83 79 -108.92 gain 79 84 -102.42 gain 84 79 -102.34 gain 79 85 -104.13 gain 85 79 -102.33 gain 79 86 -107.33 gain 86 79 -113.91 gain 79 87 -115.86 gain 87 79 -118.09 gain 79 88 -105.74 gain 88 79 -108.52 gain 79 89 -122.06 gain 89 79 -125.09 gain 79 90 -99.85 gain 90 79 -104.26 gain 79 91 -95.67 gain 91 79 -99.36 gain 79 92 -95.44 gain 92 79 -99.70 gain 79 93 -96.46 gain 93 79 -102.26 gain 79 94 -78.58 gain 94 79 -79.28 gain 79 95 -94.45 gain 95 79 -98.38 gain 79 96 -93.77 gain 96 79 -93.16 gain 79 97 -96.08 gain 97 79 -98.88 gain 79 98 -101.84 gain 98 79 -103.39 gain 79 99 -107.31 gain 99 79 -112.50 gain 79 100 -107.98 gain 100 79 -114.88 gain 79 101 -105.40 gain 101 79 -108.23 gain 79 102 -112.51 gain 102 79 -115.47 gain 79 103 -108.11 gain 103 79 -110.91 gain 79 104 -113.74 gain 104 79 -112.36 gain 79 105 -97.74 gain 105 79 -101.68 gain 79 106 -98.30 gain 106 79 -100.96 gain 79 107 -99.13 gain 107 79 -102.09 gain 79 108 -96.49 gain 108 79 -99.11 gain 79 109 -96.89 gain 109 79 -101.35 gain 79 110 -93.20 gain 110 79 -94.74 gain 79 111 -95.00 gain 111 79 -99.20 gain 79 112 -99.11 gain 112 79 -103.05 gain 79 113 -100.59 gain 113 79 -106.24 gain 79 114 -105.21 gain 114 79 -107.76 gain 79 115 -105.36 gain 115 79 -102.83 gain 79 116 -104.18 gain 116 79 -107.39 gain 79 117 -105.65 gain 117 79 -111.67 gain 79 118 -114.01 gain 118 79 -117.40 gain 79 119 -116.61 gain 119 79 -119.47 gain 79 120 -101.21 gain 120 79 -99.62 gain 79 121 -98.63 gain 121 79 -99.81 gain 79 122 -99.16 gain 122 79 -102.85 gain 79 123 -102.36 gain 123 79 -103.57 gain 79 124 -92.95 gain 124 79 -94.15 gain 79 125 -99.26 gain 125 79 -102.07 gain 79 126 -92.13 gain 126 79 -91.25 gain 79 127 -96.38 gain 127 79 -97.08 gain 79 128 -98.34 gain 128 79 -100.91 gain 79 129 -105.89 gain 129 79 -105.86 gain 79 130 -111.70 gain 130 79 -114.35 gain 79 131 -108.91 gain 131 79 -109.42 gain 79 132 -105.45 gain 132 79 -108.59 gain 79 133 -120.28 gain 133 79 -121.52 gain 79 134 -114.35 gain 134 79 -115.39 gain 79 135 -104.31 gain 135 79 -107.06 gain 79 136 -104.75 gain 136 79 -108.79 gain 79 137 -111.48 gain 137 79 -113.30 gain 79 138 -105.87 gain 138 79 -103.92 gain 79 139 -100.49 gain 139 79 -100.44 gain 79 140 -101.52 gain 140 79 -107.53 gain 79 141 -99.68 gain 141 79 -100.58 gain 79 142 -106.69 gain 142 79 -112.40 gain 79 143 -106.68 gain 143 79 -107.93 gain 79 144 -109.12 gain 144 79 -111.27 gain 79 145 -110.50 gain 145 79 -112.25 gain 79 146 -109.30 gain 146 79 -108.61 gain 79 147 -109.66 gain 147 79 -112.81 gain 79 148 -119.09 gain 148 79 -121.17 gain 79 149 -119.34 gain 149 79 -120.67 gain 79 150 -107.05 gain 150 79 -113.50 gain 79 151 -99.19 gain 151 79 -99.20 gain 79 152 -106.11 gain 152 79 -107.94 gain 79 153 -104.32 gain 153 79 -108.59 gain 79 154 -101.49 gain 154 79 -101.37 gain 79 155 -104.62 gain 155 79 -108.33 gain 79 156 -103.32 gain 156 79 -105.04 gain 79 157 -104.90 gain 157 79 -108.58 gain 79 158 -108.24 gain 158 79 -112.36 gain 79 159 -104.78 gain 159 79 -102.54 gain 79 160 -111.28 gain 160 79 -111.31 gain 79 161 -109.51 gain 161 79 -112.40 gain 79 162 -116.02 gain 162 79 -115.99 gain 79 163 -115.07 gain 163 79 -112.23 gain 79 164 -123.29 gain 164 79 -122.19 gain 79 165 -110.53 gain 165 79 -112.36 gain 79 166 -107.20 gain 166 79 -111.71 gain 79 167 -108.19 gain 167 79 -111.82 gain 79 168 -109.24 gain 168 79 -114.22 gain 79 169 -108.74 gain 169 79 -106.07 gain 79 170 -99.08 gain 170 79 -106.90 gain 79 171 -107.58 gain 171 79 -111.82 gain 79 172 -110.36 gain 172 79 -107.70 gain 79 173 -108.61 gain 173 79 -110.62 gain 79 174 -104.51 gain 174 79 -106.28 gain 79 175 -108.09 gain 175 79 -109.06 gain 79 176 -117.52 gain 176 79 -118.44 gain 79 177 -107.79 gain 177 79 -110.21 gain 79 178 -113.57 gain 178 79 -116.94 gain 79 179 -118.18 gain 179 79 -122.58 gain 79 180 -112.02 gain 180 79 -112.21 gain 79 181 -104.67 gain 181 79 -109.30 gain 79 182 -102.29 gain 182 79 -103.23 gain 79 183 -103.28 gain 183 79 -105.51 gain 79 184 -107.29 gain 184 79 -111.58 gain 79 185 -106.90 gain 185 79 -106.62 gain 79 186 -113.54 gain 186 79 -112.25 gain 79 187 -112.57 gain 187 79 -115.37 gain 79 188 -112.11 gain 188 79 -117.67 gain 79 189 -109.44 gain 189 79 -114.39 gain 79 190 -111.79 gain 190 79 -112.41 gain 79 191 -116.01 gain 191 79 -119.66 gain 79 192 -115.81 gain 192 79 -116.79 gain 79 193 -120.73 gain 193 79 -125.68 gain 79 194 -110.57 gain 194 79 -115.09 gain 79 195 -104.65 gain 195 79 -107.36 gain 79 196 -108.65 gain 196 79 -110.38 gain 79 197 -108.30 gain 197 79 -112.71 gain 79 198 -109.80 gain 198 79 -118.14 gain 79 199 -103.10 gain 199 79 -103.00 gain 79 200 -111.19 gain 200 79 -107.87 gain 79 201 -98.81 gain 201 79 -99.31 gain 79 202 -110.13 gain 202 79 -112.15 gain 79 203 -113.59 gain 203 79 -112.25 gain 79 204 -115.66 gain 204 79 -121.40 gain 79 205 -109.12 gain 205 79 -112.92 gain 79 206 -104.89 gain 206 79 -106.67 gain 79 207 -110.15 gain 207 79 -112.69 gain 79 208 -120.77 gain 208 79 -123.48 gain 79 209 -112.06 gain 209 79 -110.77 gain 79 210 -113.03 gain 210 79 -118.33 gain 79 211 -111.23 gain 211 79 -112.79 gain 79 212 -114.88 gain 212 79 -113.98 gain 79 213 -111.77 gain 213 79 -115.74 gain 79 214 -115.61 gain 214 79 -115.88 gain 79 215 -112.68 gain 215 79 -114.04 gain 79 216 -111.35 gain 216 79 -113.54 gain 79 217 -114.74 gain 217 79 -120.74 gain 79 218 -107.95 gain 218 79 -106.14 gain 79 219 -114.48 gain 219 79 -115.50 gain 79 220 -115.82 gain 220 79 -113.19 gain 79 221 -107.14 gain 221 79 -109.01 gain 79 222 -120.36 gain 222 79 -123.60 gain 79 223 -116.04 gain 223 79 -121.29 gain 79 224 -117.86 gain 224 79 -123.61 gain 80 81 -84.10 gain 81 80 -82.07 gain 80 82 -89.69 gain 82 80 -90.51 gain 80 83 -99.40 gain 83 80 -100.00 gain 80 84 -103.05 gain 84 80 -101.45 gain 80 85 -99.15 gain 85 80 -95.83 gain 80 86 -110.12 gain 86 80 -115.19 gain 80 87 -112.41 gain 87 80 -113.13 gain 80 88 -113.79 gain 88 80 -115.05 gain 80 89 -108.92 gain 89 80 -110.44 gain 80 90 -108.55 gain 90 80 -111.44 gain 80 91 -103.31 gain 91 80 -105.49 gain 80 92 -97.85 gain 92 80 -100.59 gain 80 93 -100.66 gain 93 80 -104.94 gain 80 94 -90.30 gain 94 80 -89.49 gain 80 95 -91.11 gain 95 80 -93.52 gain 80 96 -92.03 gain 96 80 -89.91 gain 80 97 -92.90 gain 97 80 -94.19 gain 80 98 -99.18 gain 98 80 -99.21 gain 80 99 -106.87 gain 99 80 -110.55 gain 80 100 -101.20 gain 100 80 -106.58 gain 80 101 -106.26 gain 101 80 -107.57 gain 80 102 -104.82 gain 102 80 -106.26 gain 80 103 -108.65 gain 103 80 -109.93 gain 80 104 -119.15 gain 104 80 -116.25 gain 80 105 -104.21 gain 105 80 -106.64 gain 80 106 -108.27 gain 106 80 -109.41 gain 80 107 -103.71 gain 107 80 -105.15 gain 80 108 -100.71 gain 108 80 -101.81 gain 80 109 -88.46 gain 109 80 -91.41 gain 80 110 -92.53 gain 110 80 -92.54 gain 80 111 -91.62 gain 111 80 -94.31 gain 80 112 -89.39 gain 112 80 -91.82 gain 80 113 -98.16 gain 113 80 -102.28 gain 80 114 -100.68 gain 114 80 -101.71 gain 80 115 -107.30 gain 115 80 -103.25 gain 80 116 -104.78 gain 116 80 -106.47 gain 80 117 -111.27 gain 117 80 -115.77 gain 80 118 -112.68 gain 118 80 -114.56 gain 80 119 -114.01 gain 119 80 -115.36 gain 80 120 -108.01 gain 120 80 -104.91 gain 80 121 -108.20 gain 121 80 -107.87 gain 80 122 -104.84 gain 122 80 -107.02 gain 80 123 -104.50 gain 123 80 -104.19 gain 80 124 -98.70 gain 124 80 -98.38 gain 80 125 -97.65 gain 125 80 -98.94 gain 80 126 -100.34 gain 126 80 -97.94 gain 80 127 -110.91 gain 127 80 -110.09 gain 80 128 -101.35 gain 128 80 -102.40 gain 80 129 -106.40 gain 129 80 -104.86 gain 80 130 -97.67 gain 130 80 -98.81 gain 80 131 -109.39 gain 131 80 -108.39 gain 80 132 -100.97 gain 132 80 -102.59 gain 80 133 -114.65 gain 133 80 -114.38 gain 80 134 -109.34 gain 134 80 -108.86 gain 80 135 -111.85 gain 135 80 -113.08 gain 80 136 -104.32 gain 136 80 -106.84 gain 80 137 -105.55 gain 137 80 -105.85 gain 80 138 -104.59 gain 138 80 -101.12 gain 80 139 -108.50 gain 139 80 -106.93 gain 80 140 -109.25 gain 140 80 -113.74 gain 80 141 -110.63 gain 141 80 -110.01 gain 80 142 -115.22 gain 142 80 -119.41 gain 80 143 -100.28 gain 143 80 -100.01 gain 80 144 -104.25 gain 144 80 -104.89 gain 80 145 -105.79 gain 145 80 -106.02 gain 80 146 -119.54 gain 146 80 -117.33 gain 80 147 -115.30 gain 147 80 -116.94 gain 80 148 -113.99 gain 148 80 -114.56 gain 80 149 -114.46 gain 149 80 -114.28 gain 80 150 -106.02 gain 150 80 -110.95 gain 80 151 -102.73 gain 151 80 -101.22 gain 80 152 -104.43 gain 152 80 -104.75 gain 80 153 -101.90 gain 153 80 -104.65 gain 80 154 -106.69 gain 154 80 -105.06 gain 80 155 -97.99 gain 155 80 -100.18 gain 80 156 -102.26 gain 156 80 -102.47 gain 80 157 -107.07 gain 157 80 -109.24 gain 80 158 -113.85 gain 158 80 -116.46 gain 80 159 -113.19 gain 159 80 -109.43 gain 80 160 -114.28 gain 160 80 -112.79 gain 80 161 -111.04 gain 161 80 -112.42 gain 80 162 -116.38 gain 162 80 -114.84 gain 80 163 -114.41 gain 163 80 -110.05 gain 80 164 -112.67 gain 164 80 -110.05 gain 80 165 -108.58 gain 165 80 -108.90 gain 80 166 -107.10 gain 166 80 -110.10 gain 80 167 -105.92 gain 167 80 -108.04 gain 80 168 -109.89 gain 168 80 -113.35 gain 80 169 -110.26 gain 169 80 -106.07 gain 80 170 -109.05 gain 170 80 -115.35 gain 80 171 -113.34 gain 171 80 -116.07 gain 80 172 -105.32 gain 172 80 -101.15 gain 80 173 -102.57 gain 173 80 -103.06 gain 80 174 -104.91 gain 174 80 -105.16 gain 80 175 -116.38 gain 175 80 -115.84 gain 80 176 -105.00 gain 176 80 -104.41 gain 80 177 -110.67 gain 177 80 -111.57 gain 80 178 -112.41 gain 178 80 -114.26 gain 80 179 -119.30 gain 179 80 -122.17 gain 80 180 -113.43 gain 180 80 -112.11 gain 80 181 -103.54 gain 181 80 -106.66 gain 80 182 -116.05 gain 182 80 -115.47 gain 80 183 -110.27 gain 183 80 -110.99 gain 80 184 -107.93 gain 184 80 -110.70 gain 80 185 -114.41 gain 185 80 -112.61 gain 80 186 -110.14 gain 186 80 -107.34 gain 80 187 -108.89 gain 187 80 -110.17 gain 80 188 -108.22 gain 188 80 -112.27 gain 80 189 -114.13 gain 189 80 -117.56 gain 80 190 -117.51 gain 190 80 -116.61 gain 80 191 -112.26 gain 191 80 -114.40 gain 80 192 -120.72 gain 192 80 -120.18 gain 80 193 -117.64 gain 193 80 -121.07 gain 80 194 -108.48 gain 194 80 -111.49 gain 80 195 -119.20 gain 195 80 -120.40 gain 80 196 -124.30 gain 196 80 -124.51 gain 80 197 -105.89 gain 197 80 -108.78 gain 80 198 -111.35 gain 198 80 -118.17 gain 80 199 -111.86 gain 199 80 -110.25 gain 80 200 -109.68 gain 200 80 -104.84 gain 80 201 -118.63 gain 201 80 -117.60 gain 80 202 -110.55 gain 202 80 -111.05 gain 80 203 -114.01 gain 203 80 -111.14 gain 80 204 -115.05 gain 204 80 -119.27 gain 80 205 -113.01 gain 205 80 -115.29 gain 80 206 -111.06 gain 206 80 -111.32 gain 80 207 -109.37 gain 207 80 -110.39 gain 80 208 -113.32 gain 208 80 -114.51 gain 80 209 -118.52 gain 209 80 -115.71 gain 80 210 -113.12 gain 210 80 -116.90 gain 80 211 -115.27 gain 211 80 -115.31 gain 80 212 -118.27 gain 212 80 -115.86 gain 80 213 -113.59 gain 213 80 -116.04 gain 80 214 -111.68 gain 214 80 -110.43 gain 80 215 -105.59 gain 215 80 -105.44 gain 80 216 -114.55 gain 216 80 -115.23 gain 80 217 -113.64 gain 217 80 -118.14 gain 80 218 -114.79 gain 218 80 -111.47 gain 80 219 -117.28 gain 219 80 -116.78 gain 80 220 -118.75 gain 220 80 -114.60 gain 80 221 -114.92 gain 221 80 -115.28 gain 80 222 -113.58 gain 222 80 -115.31 gain 80 223 -127.28 gain 223 80 -131.01 gain 80 224 -114.63 gain 224 80 -118.86 gain 81 82 -81.04 gain 82 81 -83.89 gain 81 83 -92.82 gain 83 81 -95.45 gain 81 84 -96.22 gain 84 81 -96.66 gain 81 85 -95.22 gain 85 81 -93.94 gain 81 86 -112.05 gain 86 81 -119.16 gain 81 87 -101.31 gain 87 81 -104.06 gain 81 88 -106.46 gain 88 81 -109.76 gain 81 89 -108.18 gain 89 81 -111.73 gain 81 90 -99.03 gain 90 81 -103.95 gain 81 91 -99.94 gain 91 81 -104.15 gain 81 92 -103.91 gain 92 81 -108.69 gain 81 93 -96.84 gain 93 81 -103.16 gain 81 94 -97.10 gain 94 81 -98.32 gain 81 95 -86.11 gain 95 81 -90.57 gain 81 96 -78.72 gain 96 81 -78.63 gain 81 97 -85.65 gain 97 81 -88.97 gain 81 98 -88.80 gain 98 81 -90.88 gain 81 99 -103.30 gain 99 81 -109.01 gain 81 100 -99.48 gain 100 81 -106.90 gain 81 101 -102.45 gain 101 81 -105.80 gain 81 102 -109.75 gain 102 81 -113.23 gain 81 103 -101.65 gain 103 81 -104.96 gain 81 104 -112.98 gain 104 81 -112.12 gain 81 105 -106.66 gain 105 81 -111.12 gain 81 106 -111.13 gain 106 81 -114.31 gain 81 107 -108.50 gain 107 81 -111.98 gain 81 108 -96.60 gain 108 81 -99.74 gain 81 109 -94.10 gain 109 81 -99.09 gain 81 110 -95.37 gain 110 81 -97.42 gain 81 111 -88.11 gain 111 81 -92.83 gain 81 112 -88.83 gain 112 81 -93.29 gain 81 113 -95.82 gain 113 81 -101.99 gain 81 114 -98.21 gain 114 81 -101.28 gain 81 115 -95.46 gain 115 81 -93.45 gain 81 116 -101.71 gain 116 81 -105.44 gain 81 117 -106.33 gain 117 81 -112.86 gain 81 118 -106.40 gain 118 81 -110.31 gain 81 119 -106.16 gain 119 81 -109.54 gain 81 120 -107.47 gain 120 81 -106.40 gain 81 121 -106.51 gain 121 81 -108.21 gain 81 122 -102.85 gain 122 81 -107.06 gain 81 123 -103.74 gain 123 81 -105.46 gain 81 124 -100.77 gain 124 81 -102.49 gain 81 125 -101.31 gain 125 81 -104.63 gain 81 126 -99.07 gain 126 81 -98.70 gain 81 127 -98.56 gain 127 81 -99.77 gain 81 128 -102.28 gain 128 81 -105.37 gain 81 129 -100.01 gain 129 81 -100.50 gain 81 130 -101.64 gain 130 81 -104.81 gain 81 131 -101.54 gain 131 81 -102.58 gain 81 132 -106.18 gain 132 81 -109.83 gain 81 133 -103.43 gain 133 81 -105.19 gain 81 134 -112.16 gain 134 81 -113.72 gain 81 135 -108.52 gain 135 81 -111.79 gain 81 136 -106.44 gain 136 81 -111.00 gain 81 137 -99.01 gain 137 81 -101.34 gain 81 138 -102.61 gain 138 81 -101.18 gain 81 139 -101.09 gain 139 81 -101.56 gain 81 140 -102.60 gain 140 81 -109.13 gain 81 141 -97.57 gain 141 81 -98.98 gain 81 142 -104.00 gain 142 81 -110.22 gain 81 143 -102.65 gain 143 81 -104.42 gain 81 144 -101.67 gain 144 81 -104.35 gain 81 145 -111.63 gain 145 81 -113.90 gain 81 146 -96.34 gain 146 81 -96.16 gain 81 147 -109.62 gain 147 81 -113.29 gain 81 148 -109.09 gain 148 81 -111.70 gain 81 149 -96.35 gain 149 81 -98.20 gain 81 150 -103.08 gain 150 81 -110.05 gain 81 151 -109.56 gain 151 81 -110.09 gain 81 152 -103.41 gain 152 81 -105.77 gain 81 153 -106.17 gain 153 81 -110.95 gain 81 154 -105.36 gain 154 81 -105.76 gain 81 155 -108.62 gain 155 81 -112.85 gain 81 156 -105.91 gain 156 81 -108.16 gain 81 157 -103.95 gain 157 81 -108.16 gain 81 158 -103.06 gain 158 81 -107.70 gain 81 159 -105.25 gain 159 81 -103.53 gain 81 160 -106.85 gain 160 81 -107.40 gain 81 161 -107.95 gain 161 81 -111.36 gain 81 162 -103.99 gain 162 81 -104.48 gain 81 163 -109.01 gain 163 81 -106.68 gain 81 164 -114.03 gain 164 81 -113.45 gain 81 165 -106.02 gain 165 81 -108.37 gain 81 166 -106.79 gain 166 81 -111.82 gain 81 167 -111.55 gain 167 81 -115.70 gain 81 168 -105.71 gain 168 81 -111.21 gain 81 169 -105.51 gain 169 81 -103.36 gain 81 170 -112.74 gain 170 81 -121.08 gain 81 171 -97.01 gain 171 81 -101.77 gain 81 172 -106.91 gain 172 81 -104.77 gain 81 173 -104.87 gain 173 81 -107.39 gain 81 174 -106.11 gain 174 81 -108.39 gain 81 175 -108.65 gain 175 81 -110.14 gain 81 176 -105.96 gain 176 81 -107.41 gain 81 177 -109.13 gain 177 81 -112.06 gain 81 178 -113.29 gain 178 81 -117.17 gain 81 179 -115.64 gain 179 81 -120.55 gain 81 180 -111.33 gain 180 81 -112.05 gain 81 181 -112.48 gain 181 81 -117.63 gain 81 182 -114.26 gain 182 81 -115.71 gain 81 183 -109.09 gain 183 81 -111.85 gain 81 184 -111.18 gain 184 81 -115.99 gain 81 185 -107.44 gain 185 81 -107.67 gain 81 186 -101.25 gain 186 81 -100.48 gain 81 187 -107.57 gain 187 81 -110.88 gain 81 188 -107.18 gain 188 81 -113.26 gain 81 189 -109.55 gain 189 81 -115.02 gain 81 190 -108.88 gain 190 81 -110.02 gain 81 191 -107.26 gain 191 81 -111.43 gain 81 192 -112.20 gain 192 81 -113.69 gain 81 193 -110.84 gain 193 81 -116.31 gain 81 194 -113.79 gain 194 81 -118.83 gain 81 195 -106.38 gain 195 81 -109.61 gain 81 196 -110.30 gain 196 81 -112.55 gain 81 197 -113.73 gain 197 81 -118.65 gain 81 198 -108.77 gain 198 81 -117.63 gain 81 199 -108.75 gain 199 81 -109.18 gain 81 200 -107.34 gain 200 81 -104.54 gain 81 201 -103.18 gain 201 81 -104.19 gain 81 202 -119.10 gain 202 81 -121.64 gain 81 203 -115.93 gain 203 81 -115.09 gain 81 204 -116.05 gain 204 81 -122.30 gain 81 205 -111.52 gain 205 81 -115.84 gain 81 206 -112.18 gain 206 81 -114.47 gain 81 207 -112.37 gain 207 81 -115.42 gain 81 208 -111.06 gain 208 81 -114.29 gain 81 209 -118.50 gain 209 81 -117.73 gain 81 210 -109.40 gain 210 81 -115.21 gain 81 211 -119.81 gain 211 81 -121.89 gain 81 212 -107.90 gain 212 81 -107.52 gain 81 213 -107.89 gain 213 81 -112.38 gain 81 214 -114.72 gain 214 81 -115.51 gain 81 215 -101.55 gain 215 81 -103.43 gain 81 216 -113.93 gain 216 81 -116.63 gain 81 217 -111.01 gain 217 81 -117.53 gain 81 218 -107.33 gain 218 81 -106.04 gain 81 219 -118.26 gain 219 81 -119.80 gain 81 220 -118.22 gain 220 81 -116.10 gain 81 221 -113.71 gain 221 81 -116.10 gain 81 222 -106.52 gain 222 81 -110.28 gain 81 223 -107.34 gain 223 81 -113.11 gain 81 224 -119.72 gain 224 81 -125.99 gain 82 83 -85.61 gain 83 82 -85.40 gain 82 84 -92.59 gain 84 82 -90.18 gain 82 85 -96.70 gain 85 82 -92.57 gain 82 86 -104.87 gain 86 82 -109.12 gain 82 87 -112.08 gain 87 82 -111.98 gain 82 88 -109.60 gain 88 82 -110.05 gain 82 89 -111.99 gain 89 82 -112.69 gain 82 90 -109.69 gain 90 82 -111.77 gain 82 91 -104.03 gain 91 82 -105.39 gain 82 92 -102.55 gain 92 82 -104.48 gain 82 93 -103.22 gain 93 82 -106.69 gain 82 94 -95.68 gain 94 82 -94.05 gain 82 95 -91.87 gain 95 82 -93.47 gain 82 96 -89.68 gain 96 82 -86.74 gain 82 97 -87.47 gain 97 82 -87.94 gain 82 98 -87.71 gain 98 82 -86.93 gain 82 99 -98.89 gain 99 82 -101.75 gain 82 100 -105.40 gain 100 82 -109.97 gain 82 101 -105.19 gain 101 82 -105.69 gain 82 102 -108.18 gain 102 82 -108.81 gain 82 103 -113.60 gain 103 82 -114.06 gain 82 104 -109.15 gain 104 82 -105.44 gain 82 105 -114.03 gain 105 82 -115.64 gain 82 106 -109.67 gain 106 82 -110.00 gain 82 107 -107.29 gain 107 82 -107.92 gain 82 108 -99.21 gain 108 82 -99.50 gain 82 109 -101.84 gain 109 82 -103.98 gain 82 110 -114.40 gain 110 82 -113.60 gain 82 111 -95.07 gain 111 82 -96.93 gain 82 112 -101.72 gain 112 82 -103.34 gain 82 113 -96.01 gain 113 82 -99.32 gain 82 114 -107.91 gain 114 82 -108.13 gain 82 115 -100.10 gain 115 82 -95.24 gain 82 116 -109.62 gain 116 82 -110.50 gain 82 117 -104.74 gain 117 82 -108.42 gain 82 118 -104.96 gain 118 82 -106.02 gain 82 119 -111.86 gain 119 82 -112.39 gain 82 120 -116.38 gain 120 82 -112.45 gain 82 121 -107.04 gain 121 82 -105.89 gain 82 122 -106.25 gain 122 82 -107.61 gain 82 123 -106.19 gain 123 82 -105.07 gain 82 124 -107.53 gain 124 82 -106.40 gain 82 125 -101.84 gain 125 82 -102.31 gain 82 126 -103.46 gain 126 82 -100.25 gain 82 127 -92.82 gain 127 82 -91.18 gain 82 128 -101.28 gain 128 82 -101.51 gain 82 129 -101.24 gain 129 82 -98.87 gain 82 130 -105.54 gain 130 82 -105.86 gain 82 131 -102.48 gain 131 82 -100.66 gain 82 132 -105.66 gain 132 82 -106.47 gain 82 133 -110.90 gain 133 82 -109.81 gain 82 134 -113.48 gain 134 82 -112.19 gain 82 135 -107.65 gain 135 82 -108.07 gain 82 136 -110.71 gain 136 82 -112.41 gain 82 137 -111.54 gain 137 82 -111.03 gain 82 138 -115.13 gain 138 82 -110.85 gain 82 139 -97.51 gain 139 82 -95.13 gain 82 140 -106.12 gain 140 82 -109.80 gain 82 141 -102.08 gain 141 82 -100.65 gain 82 142 -100.66 gain 142 82 -104.04 gain 82 143 -103.24 gain 143 82 -102.16 gain 82 144 -99.16 gain 144 82 -98.99 gain 82 145 -103.36 gain 145 82 -102.78 gain 82 146 -110.94 gain 146 82 -107.91 gain 82 147 -119.76 gain 147 82 -120.58 gain 82 148 -109.17 gain 148 82 -108.92 gain 82 149 -106.17 gain 149 82 -105.17 gain 82 150 -112.37 gain 150 82 -116.48 gain 82 151 -104.24 gain 151 82 -101.92 gain 82 152 -117.44 gain 152 82 -116.94 gain 82 153 -103.28 gain 153 82 -105.22 gain 82 154 -113.83 gain 154 82 -111.38 gain 82 155 -106.06 gain 155 82 -107.44 gain 82 156 -104.28 gain 156 82 -103.67 gain 82 157 -102.74 gain 157 82 -104.09 gain 82 158 -102.46 gain 158 82 -104.24 gain 82 159 -104.32 gain 159 82 -99.75 gain 82 160 -105.24 gain 160 82 -102.93 gain 82 161 -105.09 gain 161 82 -105.65 gain 82 162 -109.66 gain 162 82 -107.30 gain 82 163 -108.22 gain 163 82 -103.05 gain 82 164 -106.79 gain 164 82 -103.36 gain 82 165 -109.69 gain 165 82 -109.19 gain 82 166 -115.91 gain 166 82 -118.08 gain 82 167 -113.09 gain 167 82 -114.39 gain 82 168 -107.07 gain 168 82 -109.71 gain 82 169 -112.62 gain 169 82 -107.62 gain 82 170 -110.23 gain 170 82 -115.71 gain 82 171 -113.00 gain 171 82 -114.91 gain 82 172 -104.48 gain 172 82 -99.49 gain 82 173 -114.93 gain 173 82 -114.60 gain 82 174 -112.23 gain 174 82 -111.66 gain 82 175 -111.84 gain 175 82 -110.48 gain 82 176 -118.79 gain 176 82 -117.38 gain 82 177 -111.15 gain 177 82 -111.23 gain 82 178 -110.64 gain 178 82 -111.67 gain 82 179 -113.74 gain 179 82 -115.80 gain 82 180 -113.09 gain 180 82 -110.95 gain 82 181 -124.43 gain 181 82 -126.73 gain 82 182 -115.05 gain 182 82 -113.65 gain 82 183 -111.15 gain 183 82 -111.06 gain 82 184 -113.02 gain 184 82 -114.98 gain 82 185 -109.42 gain 185 82 -106.80 gain 82 186 -110.57 gain 186 82 -106.95 gain 82 187 -109.74 gain 187 82 -110.21 gain 82 188 -113.85 gain 188 82 -117.07 gain 82 189 -112.56 gain 189 82 -115.19 gain 82 190 -111.14 gain 190 82 -109.43 gain 82 191 -112.67 gain 191 82 -114.00 gain 82 192 -113.37 gain 192 82 -112.01 gain 82 193 -113.84 gain 193 82 -116.46 gain 82 194 -117.59 gain 194 82 -119.77 gain 82 195 -116.40 gain 195 82 -116.78 gain 82 196 -119.33 gain 196 82 -118.73 gain 82 197 -110.66 gain 197 82 -112.74 gain 82 198 -110.83 gain 198 82 -116.84 gain 82 199 -115.69 gain 199 82 -113.27 gain 82 200 -116.11 gain 200 82 -110.45 gain 82 201 -113.74 gain 201 82 -111.90 gain 82 202 -108.19 gain 202 82 -107.88 gain 82 203 -107.09 gain 203 82 -103.41 gain 82 204 -112.53 gain 204 82 -115.93 gain 82 205 -115.83 gain 205 82 -117.30 gain 82 206 -114.22 gain 206 82 -113.66 gain 82 207 -118.17 gain 207 82 -118.38 gain 82 208 -112.68 gain 208 82 -113.06 gain 82 209 -120.76 gain 209 82 -117.14 gain 82 210 -109.27 gain 210 82 -112.24 gain 82 211 -116.43 gain 211 82 -115.66 gain 82 212 -114.43 gain 212 82 -111.20 gain 82 213 -119.21 gain 213 82 -120.85 gain 82 214 -106.19 gain 214 82 -104.13 gain 82 215 -115.43 gain 215 82 -114.45 gain 82 216 -111.87 gain 216 82 -111.73 gain 82 217 -107.37 gain 217 82 -111.05 gain 82 218 -109.14 gain 218 82 -105.00 gain 82 219 -114.02 gain 219 82 -112.71 gain 82 220 -120.65 gain 220 82 -115.68 gain 82 221 -114.61 gain 221 82 -114.15 gain 82 222 -119.39 gain 222 82 -120.29 gain 82 223 -121.72 gain 223 82 -124.64 gain 82 224 -121.84 gain 224 82 -125.26 gain 83 84 -89.64 gain 84 83 -87.44 gain 83 85 -101.22 gain 85 83 -97.30 gain 83 86 -95.56 gain 86 83 -100.03 gain 83 87 -99.17 gain 87 83 -99.28 gain 83 88 -106.39 gain 88 83 -107.05 gain 83 89 -106.18 gain 89 83 -107.09 gain 83 90 -112.54 gain 90 83 -114.83 gain 83 91 -109.69 gain 91 83 -111.26 gain 83 92 -113.69 gain 92 83 -115.83 gain 83 93 -108.07 gain 93 83 -111.75 gain 83 94 -95.97 gain 94 83 -94.56 gain 83 95 -106.81 gain 95 83 -108.62 gain 83 96 -95.99 gain 96 83 -93.27 gain 83 97 -88.94 gain 97 83 -89.63 gain 83 98 -89.20 gain 98 83 -88.64 gain 83 99 -88.98 gain 99 83 -92.05 gain 83 100 -89.28 gain 100 83 -94.06 gain 83 101 -96.71 gain 101 83 -97.42 gain 83 102 -103.44 gain 102 83 -104.28 gain 83 103 -109.57 gain 103 83 -110.24 gain 83 104 -106.73 gain 104 83 -103.23 gain 83 105 -119.79 gain 105 83 -121.61 gain 83 106 -115.14 gain 106 83 -115.68 gain 83 107 -107.58 gain 107 83 -108.42 gain 83 108 -117.84 gain 108 83 -118.34 gain 83 109 -100.30 gain 109 83 -102.65 gain 83 110 -102.30 gain 110 83 -101.72 gain 83 111 -105.69 gain 111 83 -107.77 gain 83 112 -96.24 gain 112 83 -98.07 gain 83 113 -92.69 gain 113 83 -96.22 gain 83 114 -98.28 gain 114 83 -98.71 gain 83 115 -95.95 gain 115 83 -91.30 gain 83 116 -98.34 gain 116 83 -99.43 gain 83 117 -113.84 gain 117 83 -117.74 gain 83 118 -102.58 gain 118 83 -103.85 gain 83 119 -111.70 gain 119 83 -112.44 gain 83 120 -114.71 gain 120 83 -111.00 gain 83 121 -110.15 gain 121 83 -109.22 gain 83 122 -113.09 gain 122 83 -114.66 gain 83 123 -109.52 gain 123 83 -108.61 gain 83 124 -109.49 gain 124 83 -108.57 gain 83 125 -100.37 gain 125 83 -101.06 gain 83 126 -101.80 gain 126 83 -98.81 gain 83 127 -98.39 gain 127 83 -96.97 gain 83 128 -95.79 gain 128 83 -96.24 gain 83 129 -94.33 gain 129 83 -92.19 gain 83 130 -105.44 gain 130 83 -105.97 gain 83 131 -98.83 gain 131 83 -97.23 gain 83 132 -103.61 gain 132 83 -104.62 gain 83 133 -106.02 gain 133 83 -105.15 gain 83 134 -111.82 gain 134 83 -110.75 gain 83 135 -115.14 gain 135 83 -115.78 gain 83 136 -115.55 gain 136 83 -117.47 gain 83 137 -110.16 gain 137 83 -109.87 gain 83 138 -110.18 gain 138 83 -106.12 gain 83 139 -107.90 gain 139 83 -105.74 gain 83 140 -102.27 gain 140 83 -106.16 gain 83 141 -111.72 gain 141 83 -110.50 gain 83 142 -102.20 gain 142 83 -105.79 gain 83 143 -103.89 gain 143 83 -103.02 gain 83 144 -102.14 gain 144 83 -102.18 gain 83 145 -107.23 gain 145 83 -106.86 gain 83 146 -100.79 gain 146 83 -97.98 gain 83 147 -106.16 gain 147 83 -107.20 gain 83 148 -107.73 gain 148 83 -107.69 gain 83 149 -109.68 gain 149 83 -108.90 gain 83 150 -110.72 gain 150 83 -115.05 gain 83 151 -118.17 gain 151 83 -116.06 gain 83 152 -108.12 gain 152 83 -107.84 gain 83 153 -109.41 gain 153 83 -111.56 gain 83 154 -107.64 gain 154 83 -105.40 gain 83 155 -112.91 gain 155 83 -114.51 gain 83 156 -99.70 gain 156 83 -99.31 gain 83 157 -108.81 gain 157 83 -110.38 gain 83 158 -108.83 gain 158 83 -110.83 gain 83 159 -106.35 gain 159 83 -101.99 gain 83 160 -115.36 gain 160 83 -113.28 gain 83 161 -107.60 gain 161 83 -108.37 gain 83 162 -108.27 gain 162 83 -106.13 gain 83 163 -115.27 gain 163 83 -110.31 gain 83 164 -109.39 gain 164 83 -106.17 gain 83 165 -116.51 gain 165 83 -116.22 gain 83 166 -111.25 gain 166 83 -113.64 gain 83 167 -113.98 gain 167 83 -115.49 gain 83 168 -113.52 gain 168 83 -116.38 gain 83 169 -116.79 gain 169 83 -112.00 gain 83 170 -110.07 gain 170 83 -115.77 gain 83 171 -116.06 gain 171 83 -118.18 gain 83 172 -99.85 gain 172 83 -95.08 gain 83 173 -112.51 gain 173 83 -112.40 gain 83 174 -106.78 gain 174 83 -106.42 gain 83 175 -107.93 gain 175 83 -106.78 gain 83 176 -102.75 gain 176 83 -101.55 gain 83 177 -107.59 gain 177 83 -107.88 gain 83 178 -112.30 gain 178 83 -113.55 gain 83 179 -106.89 gain 179 83 -109.16 gain 83 180 -117.96 gain 180 83 -116.04 gain 83 181 -119.48 gain 181 83 -121.99 gain 83 182 -123.92 gain 182 83 -122.73 gain 83 183 -106.71 gain 183 83 -106.83 gain 83 184 -116.28 gain 184 83 -118.45 gain 83 185 -114.91 gain 185 83 -112.51 gain 83 186 -106.63 gain 186 83 -103.22 gain 83 187 -103.45 gain 187 83 -104.14 gain 83 188 -113.33 gain 188 83 -116.77 gain 83 189 -112.19 gain 189 83 -115.02 gain 83 190 -111.96 gain 190 83 -110.47 gain 83 191 -113.30 gain 191 83 -114.84 gain 83 192 -101.95 gain 192 83 -100.81 gain 83 193 -112.92 gain 193 83 -115.75 gain 83 194 -117.66 gain 194 83 -120.06 gain 83 195 -116.80 gain 195 83 -117.39 gain 83 196 -118.95 gain 196 83 -118.56 gain 83 197 -114.94 gain 197 83 -117.23 gain 83 198 -110.77 gain 198 83 -116.99 gain 83 199 -113.07 gain 199 83 -110.86 gain 83 200 -112.35 gain 200 83 -106.91 gain 83 201 -109.04 gain 201 83 -107.41 gain 83 202 -110.61 gain 202 83 -110.51 gain 83 203 -116.56 gain 203 83 -113.09 gain 83 204 -118.19 gain 204 83 -121.80 gain 83 205 -112.38 gain 205 83 -114.06 gain 83 206 -113.23 gain 206 83 -112.88 gain 83 207 -114.39 gain 207 83 -114.81 gain 83 208 -115.93 gain 208 83 -116.52 gain 83 209 -121.53 gain 209 83 -118.12 gain 83 210 -126.90 gain 210 83 -130.08 gain 83 211 -118.50 gain 211 83 -117.94 gain 83 212 -119.65 gain 212 83 -116.63 gain 83 213 -116.36 gain 213 83 -118.21 gain 83 214 -112.53 gain 214 83 -110.69 gain 83 215 -122.21 gain 215 83 -121.45 gain 83 216 -112.41 gain 216 83 -112.48 gain 83 217 -117.90 gain 217 83 -121.79 gain 83 218 -113.71 gain 218 83 -109.79 gain 83 219 -110.88 gain 219 83 -109.77 gain 83 220 -113.86 gain 220 83 -109.11 gain 83 221 -114.95 gain 221 83 -114.71 gain 83 222 -107.49 gain 222 83 -108.61 gain 83 223 -120.24 gain 223 83 -123.37 gain 83 224 -111.77 gain 224 83 -115.40 gain 84 85 -86.20 gain 85 84 -84.48 gain 84 86 -85.63 gain 86 84 -92.29 gain 84 87 -97.19 gain 87 84 -99.50 gain 84 88 -94.89 gain 88 84 -97.75 gain 84 89 -102.97 gain 89 84 -106.09 gain 84 90 -118.98 gain 90 84 -123.46 gain 84 91 -113.87 gain 91 84 -117.64 gain 84 92 -110.61 gain 92 84 -114.95 gain 84 93 -106.11 gain 93 84 -111.99 gain 84 94 -106.18 gain 94 84 -106.97 gain 84 95 -105.35 gain 95 84 -109.36 gain 84 96 -95.62 gain 96 84 -95.09 gain 84 97 -93.38 gain 97 84 -96.27 gain 84 98 -90.24 gain 98 84 -91.87 gain 84 99 -78.61 gain 99 84 -83.88 gain 84 100 -87.89 gain 100 84 -94.87 gain 84 101 -94.38 gain 101 84 -97.29 gain 84 102 -100.89 gain 102 84 -103.93 gain 84 103 -100.96 gain 103 84 -103.83 gain 84 104 -101.48 gain 104 84 -100.18 gain 84 105 -114.67 gain 105 84 -118.69 gain 84 106 -113.49 gain 106 84 -116.23 gain 84 107 -108.26 gain 107 84 -111.30 gain 84 108 -114.57 gain 108 84 -117.27 gain 84 109 -107.60 gain 109 84 -112.15 gain 84 110 -108.10 gain 110 84 -109.71 gain 84 111 -96.19 gain 111 84 -100.47 gain 84 112 -100.32 gain 112 84 -104.34 gain 84 113 -89.03 gain 113 84 -94.75 gain 84 114 -90.05 gain 114 84 -92.68 gain 84 115 -92.01 gain 115 84 -89.56 gain 84 116 -93.75 gain 116 84 -97.04 gain 84 117 -99.15 gain 117 84 -105.24 gain 84 118 -102.32 gain 118 84 -105.79 gain 84 119 -112.06 gain 119 84 -115.00 gain 84 120 -115.01 gain 120 84 -113.50 gain 84 121 -116.77 gain 121 84 -118.03 gain 84 122 -105.07 gain 122 84 -108.85 gain 84 123 -104.76 gain 123 84 -106.05 gain 84 124 -98.68 gain 124 84 -99.96 gain 84 125 -106.41 gain 125 84 -109.30 gain 84 126 -103.81 gain 126 84 -103.01 gain 84 127 -102.07 gain 127 84 -102.84 gain 84 128 -93.02 gain 128 84 -95.66 gain 84 129 -99.39 gain 129 84 -99.44 gain 84 130 -95.32 gain 130 84 -98.05 gain 84 131 -98.30 gain 131 84 -98.89 gain 84 132 -103.65 gain 132 84 -106.87 gain 84 133 -107.82 gain 133 84 -109.14 gain 84 134 -109.54 gain 134 84 -110.66 gain 84 135 -118.25 gain 135 84 -121.08 gain 84 136 -117.72 gain 136 84 -121.84 gain 84 137 -115.06 gain 137 84 -116.96 gain 84 138 -106.95 gain 138 84 -105.08 gain 84 139 -111.63 gain 139 84 -111.66 gain 84 140 -101.32 gain 140 84 -107.41 gain 84 141 -104.69 gain 141 84 -105.67 gain 84 142 -93.65 gain 142 84 -99.44 gain 84 143 -105.10 gain 143 84 -106.43 gain 84 144 -105.70 gain 144 84 -107.93 gain 84 145 -99.14 gain 145 84 -100.97 gain 84 146 -98.50 gain 146 84 -97.89 gain 84 147 -109.63 gain 147 84 -112.86 gain 84 148 -102.19 gain 148 84 -104.35 gain 84 149 -102.39 gain 149 84 -103.80 gain 84 150 -104.17 gain 150 84 -110.70 gain 84 151 -109.43 gain 151 84 -109.52 gain 84 152 -115.25 gain 152 84 -117.17 gain 84 153 -111.05 gain 153 84 -115.40 gain 84 154 -103.73 gain 154 84 -103.69 gain 84 155 -109.71 gain 155 84 -113.50 gain 84 156 -103.98 gain 156 84 -105.79 gain 84 157 -105.76 gain 157 84 -109.53 gain 84 158 -103.97 gain 158 84 -108.18 gain 84 159 -106.05 gain 159 84 -103.89 gain 84 160 -104.72 gain 160 84 -104.83 gain 84 161 -112.12 gain 161 84 -115.09 gain 84 162 -101.49 gain 162 84 -101.54 gain 84 163 -105.63 gain 163 84 -102.87 gain 84 164 -108.83 gain 164 84 -107.82 gain 84 165 -116.77 gain 165 84 -118.69 gain 84 166 -109.29 gain 166 84 -113.88 gain 84 167 -110.59 gain 167 84 -114.30 gain 84 168 -106.79 gain 168 84 -111.84 gain 84 169 -111.80 gain 169 84 -109.21 gain 84 170 -110.53 gain 170 84 -118.43 gain 84 171 -114.84 gain 171 84 -119.17 gain 84 172 -103.59 gain 172 84 -101.02 gain 84 173 -104.21 gain 173 84 -106.29 gain 84 174 -109.39 gain 174 84 -111.23 gain 84 175 -116.55 gain 175 84 -117.60 gain 84 176 -112.31 gain 176 84 -113.31 gain 84 177 -110.70 gain 177 84 -113.19 gain 84 178 -107.11 gain 178 84 -110.56 gain 84 179 -103.65 gain 179 84 -108.12 gain 84 180 -110.59 gain 180 84 -110.86 gain 84 181 -118.43 gain 181 84 -123.14 gain 84 182 -120.55 gain 182 84 -121.57 gain 84 183 -110.21 gain 183 84 -112.52 gain 84 184 -111.55 gain 184 84 -115.91 gain 84 185 -110.50 gain 185 84 -110.30 gain 84 186 -110.97 gain 186 84 -109.76 gain 84 187 -109.73 gain 187 84 -112.61 gain 84 188 -112.79 gain 188 84 -118.43 gain 84 189 -109.58 gain 189 84 -114.62 gain 84 190 -112.10 gain 190 84 -112.80 gain 84 191 -107.70 gain 191 84 -111.43 gain 84 192 -102.15 gain 192 84 -103.20 gain 84 193 -113.24 gain 193 84 -118.27 gain 84 194 -115.09 gain 194 84 -119.69 gain 84 195 -110.35 gain 195 84 -113.14 gain 84 196 -113.36 gain 196 84 -115.17 gain 84 197 -119.55 gain 197 84 -124.04 gain 84 198 -108.88 gain 198 84 -117.30 gain 84 199 -107.74 gain 199 84 -107.72 gain 84 200 -117.52 gain 200 84 -114.27 gain 84 201 -117.81 gain 201 84 -118.39 gain 84 202 -105.35 gain 202 84 -107.45 gain 84 203 -104.33 gain 203 84 -103.06 gain 84 204 -115.18 gain 204 84 -120.99 gain 84 205 -103.11 gain 205 84 -106.99 gain 84 206 -110.61 gain 206 84 -112.46 gain 84 207 -105.19 gain 207 84 -107.81 gain 84 208 -113.97 gain 208 84 -116.76 gain 84 209 -112.64 gain 209 84 -111.43 gain 84 210 -118.25 gain 210 84 -123.63 gain 84 211 -115.85 gain 211 84 -117.48 gain 84 212 -114.51 gain 212 84 -113.69 gain 84 213 -118.38 gain 213 84 -122.43 gain 84 214 -115.38 gain 214 84 -115.73 gain 84 215 -119.02 gain 215 84 -120.46 gain 84 216 -107.53 gain 216 84 -109.80 gain 84 217 -109.20 gain 217 84 -115.29 gain 84 218 -114.56 gain 218 84 -112.84 gain 84 219 -114.09 gain 219 84 -115.19 gain 84 220 -116.60 gain 220 84 -114.05 gain 84 221 -115.06 gain 221 84 -117.01 gain 84 222 -103.10 gain 222 84 -106.42 gain 84 223 -112.99 gain 223 84 -118.32 gain 84 224 -108.96 gain 224 84 -114.78 gain 85 86 -78.02 gain 86 85 -86.40 gain 85 87 -85.69 gain 87 85 -89.72 gain 85 88 -95.45 gain 88 85 -100.03 gain 85 89 -101.79 gain 89 85 -106.63 gain 85 90 -108.65 gain 90 85 -114.85 gain 85 91 -110.77 gain 91 85 -116.26 gain 85 92 -112.37 gain 92 85 -118.43 gain 85 93 -103.72 gain 93 85 -111.32 gain 85 94 -105.17 gain 94 85 -107.67 gain 85 95 -104.17 gain 95 85 -109.90 gain 85 96 -96.98 gain 96 85 -98.17 gain 85 97 -101.18 gain 97 85 -105.79 gain 85 98 -90.21 gain 98 85 -93.57 gain 85 99 -88.85 gain 99 85 -95.85 gain 85 100 -80.19 gain 100 85 -88.89 gain 85 101 -90.97 gain 101 85 -95.60 gain 85 102 -93.28 gain 102 85 -98.04 gain 85 103 -96.13 gain 103 85 -100.72 gain 85 104 -95.35 gain 104 85 -95.77 gain 85 105 -113.79 gain 105 85 -119.53 gain 85 106 -112.31 gain 106 85 -116.77 gain 85 107 -113.43 gain 107 85 -118.19 gain 85 108 -103.54 gain 108 85 -107.96 gain 85 109 -109.86 gain 109 85 -116.12 gain 85 110 -101.87 gain 110 85 -105.21 gain 85 111 -102.56 gain 111 85 -108.56 gain 85 112 -98.65 gain 112 85 -104.40 gain 85 113 -89.06 gain 113 85 -96.50 gain 85 114 -91.08 gain 114 85 -95.43 gain 85 115 -98.21 gain 115 85 -97.48 gain 85 116 -90.51 gain 116 85 -95.52 gain 85 117 -100.05 gain 117 85 -107.86 gain 85 118 -100.69 gain 118 85 -105.88 gain 85 119 -102.81 gain 119 85 -107.47 gain 85 120 -110.47 gain 120 85 -110.68 gain 85 121 -110.31 gain 121 85 -113.29 gain 85 122 -103.84 gain 122 85 -109.33 gain 85 123 -102.92 gain 123 85 -105.93 gain 85 124 -98.97 gain 124 85 -101.97 gain 85 125 -109.93 gain 125 85 -114.54 gain 85 126 -103.03 gain 126 85 -103.96 gain 85 127 -100.35 gain 127 85 -102.85 gain 85 128 -99.35 gain 128 85 -103.71 gain 85 129 -93.28 gain 129 85 -95.05 gain 85 130 -92.38 gain 130 85 -96.83 gain 85 131 -90.36 gain 131 85 -92.68 gain 85 132 -93.34 gain 132 85 -98.28 gain 85 133 -98.24 gain 133 85 -101.29 gain 85 134 -107.96 gain 134 85 -110.80 gain 85 135 -114.04 gain 135 85 -118.58 gain 85 136 -102.24 gain 136 85 -108.08 gain 85 137 -109.64 gain 137 85 -113.26 gain 85 138 -102.98 gain 138 85 -102.84 gain 85 139 -103.24 gain 139 85 -105.00 gain 85 140 -109.64 gain 140 85 -117.45 gain 85 141 -103.61 gain 141 85 -106.31 gain 85 142 -91.76 gain 142 85 -99.27 gain 85 143 -100.22 gain 143 85 -103.27 gain 85 144 -91.42 gain 144 85 -95.38 gain 85 145 -101.77 gain 145 85 -105.32 gain 85 146 -96.29 gain 146 85 -97.39 gain 85 147 -104.68 gain 147 85 -109.64 gain 85 148 -101.76 gain 148 85 -105.65 gain 85 149 -102.78 gain 149 85 -105.91 gain 85 150 -107.87 gain 150 85 -116.12 gain 85 151 -105.08 gain 151 85 -106.89 gain 85 152 -113.88 gain 152 85 -117.51 gain 85 153 -104.91 gain 153 85 -110.98 gain 85 154 -107.11 gain 154 85 -108.79 gain 85 155 -103.50 gain 155 85 -109.01 gain 85 156 -111.56 gain 156 85 -115.09 gain 85 157 -107.80 gain 157 85 -113.29 gain 85 158 -104.20 gain 158 85 -110.12 gain 85 159 -96.31 gain 159 85 -95.87 gain 85 160 -106.58 gain 160 85 -108.41 gain 85 161 -98.25 gain 161 85 -102.94 gain 85 162 -98.98 gain 162 85 -100.76 gain 85 163 -103.69 gain 163 85 -102.65 gain 85 164 -113.04 gain 164 85 -113.75 gain 85 165 -111.11 gain 165 85 -114.75 gain 85 166 -109.76 gain 166 85 -116.07 gain 85 167 -107.25 gain 167 85 -112.68 gain 85 168 -114.96 gain 168 85 -121.74 gain 85 169 -111.62 gain 169 85 -110.75 gain 85 170 -108.57 gain 170 85 -118.19 gain 85 171 -108.42 gain 171 85 -114.47 gain 85 172 -101.89 gain 172 85 -101.03 gain 85 173 -107.85 gain 173 85 -111.66 gain 85 174 -106.99 gain 174 85 -110.55 gain 85 175 -104.52 gain 175 85 -107.29 gain 85 176 -104.49 gain 176 85 -107.21 gain 85 177 -104.12 gain 177 85 -108.33 gain 85 178 -109.85 gain 178 85 -115.01 gain 85 179 -101.83 gain 179 85 -108.03 gain 85 180 -112.27 gain 180 85 -114.26 gain 85 181 -113.43 gain 181 85 -119.86 gain 85 182 -107.26 gain 182 85 -110.00 gain 85 183 -111.49 gain 183 85 -115.52 gain 85 184 -110.67 gain 184 85 -116.75 gain 85 185 -103.99 gain 185 85 -105.50 gain 85 186 -106.36 gain 186 85 -106.87 gain 85 187 -110.96 gain 187 85 -115.56 gain 85 188 -103.94 gain 188 85 -111.30 gain 85 189 -102.76 gain 189 85 -109.51 gain 85 190 -111.28 gain 190 85 -113.70 gain 85 191 -100.31 gain 191 85 -105.76 gain 85 192 -104.70 gain 192 85 -107.47 gain 85 193 -110.81 gain 193 85 -117.56 gain 85 194 -109.56 gain 194 85 -115.89 gain 85 195 -117.01 gain 195 85 -121.52 gain 85 196 -115.50 gain 196 85 -119.03 gain 85 197 -110.36 gain 197 85 -116.57 gain 85 198 -112.83 gain 198 85 -122.97 gain 85 199 -109.32 gain 199 85 -111.03 gain 85 200 -109.63 gain 200 85 -108.10 gain 85 201 -110.30 gain 201 85 -112.60 gain 85 202 -103.05 gain 202 85 -106.87 gain 85 203 -109.23 gain 203 85 -109.68 gain 85 204 -110.34 gain 204 85 -117.88 gain 85 205 -109.99 gain 205 85 -115.59 gain 85 206 -108.26 gain 206 85 -111.83 gain 85 207 -111.18 gain 207 85 -115.51 gain 85 208 -99.54 gain 208 85 -104.05 gain 85 209 -111.29 gain 209 85 -111.80 gain 85 210 -121.11 gain 210 85 -128.21 gain 85 211 -116.46 gain 211 85 -119.81 gain 85 212 -109.39 gain 212 85 -110.30 gain 85 213 -111.14 gain 213 85 -116.91 gain 85 214 -114.26 gain 214 85 -116.33 gain 85 215 -105.18 gain 215 85 -108.34 gain 85 216 -105.95 gain 216 85 -109.94 gain 85 217 -105.06 gain 217 85 -112.86 gain 85 218 -110.46 gain 218 85 -110.45 gain 85 219 -106.72 gain 219 85 -109.53 gain 85 220 -109.03 gain 220 85 -108.20 gain 85 221 -111.92 gain 221 85 -115.60 gain 85 222 -110.40 gain 222 85 -115.44 gain 85 223 -109.78 gain 223 85 -116.83 gain 85 224 -109.75 gain 224 85 -117.30 gain 86 87 -91.33 gain 87 86 -86.98 gain 86 88 -100.60 gain 88 86 -96.79 gain 86 89 -98.24 gain 89 86 -94.69 gain 86 90 -121.37 gain 90 86 -119.20 gain 86 91 -114.16 gain 91 86 -111.27 gain 86 92 -115.82 gain 92 86 -113.50 gain 86 93 -118.18 gain 93 86 -117.39 gain 86 94 -115.41 gain 94 86 -109.53 gain 86 95 -114.45 gain 95 86 -111.80 gain 86 96 -111.78 gain 96 86 -104.59 gain 86 97 -105.38 gain 97 86 -101.60 gain 86 98 -109.51 gain 98 86 -104.48 gain 86 99 -99.48 gain 99 86 -98.09 gain 86 100 -96.92 gain 100 86 -97.24 gain 86 101 -91.47 gain 101 86 -87.72 gain 86 102 -91.91 gain 102 86 -88.29 gain 86 103 -104.25 gain 103 86 -100.46 gain 86 104 -107.89 gain 104 86 -99.92 gain 86 105 -115.24 gain 105 86 -112.60 gain 86 106 -120.64 gain 106 86 -116.72 gain 86 107 -117.90 gain 107 86 -114.27 gain 86 108 -118.47 gain 108 86 -114.51 gain 86 109 -109.71 gain 109 86 -107.60 gain 86 110 -119.22 gain 110 86 -114.18 gain 86 111 -110.08 gain 111 86 -107.70 gain 86 112 -115.16 gain 112 86 -112.53 gain 86 113 -109.89 gain 113 86 -108.95 gain 86 114 -112.60 gain 114 86 -108.57 gain 86 115 -97.10 gain 115 86 -87.98 gain 86 116 -103.40 gain 116 86 -100.03 gain 86 117 -103.26 gain 117 86 -102.69 gain 86 118 -103.79 gain 118 86 -100.59 gain 86 119 -107.21 gain 119 86 -103.49 gain 86 120 -118.13 gain 120 86 -109.96 gain 86 121 -123.98 gain 121 86 -118.58 gain 86 122 -120.95 gain 122 86 -118.06 gain 86 123 -120.73 gain 123 86 -115.36 gain 86 124 -118.44 gain 124 86 -113.06 gain 86 125 -115.42 gain 125 86 -111.64 gain 86 126 -110.73 gain 126 86 -103.26 gain 86 127 -115.51 gain 127 86 -109.62 gain 86 128 -103.66 gain 128 86 -99.65 gain 86 129 -111.79 gain 129 86 -105.18 gain 86 130 -107.56 gain 130 86 -103.63 gain 86 131 -103.04 gain 131 86 -96.97 gain 86 132 -101.39 gain 132 86 -97.95 gain 86 133 -110.93 gain 133 86 -105.60 gain 86 134 -107.58 gain 134 86 -102.04 gain 86 135 -120.92 gain 135 86 -117.09 gain 86 136 -115.83 gain 136 86 -113.29 gain 86 137 -118.86 gain 137 86 -114.09 gain 86 138 -115.33 gain 138 86 -106.80 gain 86 139 -116.23 gain 139 86 -109.60 gain 86 140 -116.59 gain 140 86 -116.02 gain 86 141 -115.14 gain 141 86 -109.46 gain 86 142 -108.22 gain 142 86 -107.35 gain 86 143 -111.01 gain 143 86 -105.68 gain 86 144 -109.81 gain 144 86 -105.39 gain 86 145 -114.05 gain 145 86 -109.22 gain 86 146 -105.72 gain 146 86 -98.44 gain 86 147 -109.62 gain 147 86 -106.19 gain 86 148 -103.26 gain 148 86 -98.76 gain 86 149 -112.87 gain 149 86 -107.62 gain 86 150 -127.02 gain 150 86 -126.89 gain 86 151 -112.24 gain 151 86 -105.67 gain 86 152 -117.38 gain 152 86 -112.63 gain 86 153 -121.58 gain 153 86 -119.26 gain 86 154 -115.07 gain 154 86 -108.37 gain 86 155 -116.34 gain 155 86 -113.46 gain 86 156 -116.60 gain 156 86 -111.74 gain 86 157 -114.06 gain 157 86 -111.16 gain 86 158 -110.63 gain 158 86 -108.16 gain 86 159 -111.70 gain 159 86 -102.87 gain 86 160 -108.50 gain 160 86 -101.95 gain 86 161 -111.65 gain 161 86 -107.96 gain 86 162 -111.08 gain 162 86 -104.47 gain 86 163 -111.84 gain 163 86 -102.42 gain 86 164 -115.95 gain 164 86 -108.27 gain 86 165 -119.09 gain 165 86 -114.34 gain 86 166 -118.07 gain 166 86 -116.00 gain 86 167 -114.43 gain 167 86 -111.48 gain 86 168 -116.19 gain 168 86 -114.59 gain 86 169 -112.03 gain 169 86 -102.78 gain 86 170 -114.50 gain 170 86 -115.74 gain 86 171 -111.53 gain 171 86 -109.19 gain 86 172 -117.45 gain 172 86 -108.21 gain 86 173 -112.47 gain 173 86 -107.89 gain 86 174 -122.89 gain 174 86 -118.07 gain 86 175 -109.03 gain 175 86 -103.42 gain 86 176 -115.01 gain 176 86 -109.35 gain 86 177 -114.55 gain 177 86 -110.38 gain 86 178 -113.01 gain 178 86 -109.79 gain 86 179 -111.07 gain 179 86 -108.88 gain 86 180 -114.65 gain 180 86 -108.26 gain 86 181 -124.65 gain 181 86 -122.70 gain 86 182 -124.26 gain 182 86 -118.62 gain 86 183 -124.48 gain 183 86 -120.13 gain 86 184 -119.79 gain 184 86 -117.49 gain 86 185 -121.30 gain 185 86 -114.43 gain 86 186 -115.17 gain 186 86 -107.30 gain 86 187 -121.78 gain 187 86 -117.99 gain 86 188 -111.78 gain 188 86 -110.75 gain 86 189 -120.85 gain 189 86 -119.22 gain 86 190 -115.33 gain 190 86 -109.37 gain 86 191 -115.22 gain 191 86 -112.30 gain 86 192 -124.27 gain 192 86 -118.66 gain 86 193 -117.03 gain 193 86 -115.40 gain 86 194 -113.38 gain 194 86 -111.32 gain 86 195 -120.91 gain 195 86 -117.04 gain 86 196 -119.40 gain 196 86 -114.55 gain 86 197 -122.10 gain 197 86 -119.92 gain 86 198 -116.28 gain 198 86 -118.04 gain 86 199 -124.19 gain 199 86 -117.52 gain 86 200 -116.23 gain 200 86 -106.32 gain 86 201 -119.31 gain 201 86 -113.22 gain 86 202 -116.86 gain 202 86 -112.30 gain 86 203 -119.50 gain 203 86 -111.57 gain 86 204 -115.66 gain 204 86 -114.81 gain 86 205 -116.45 gain 205 86 -113.67 gain 86 206 -113.30 gain 206 86 -108.49 gain 86 207 -116.23 gain 207 86 -112.18 gain 86 208 -113.24 gain 208 86 -109.36 gain 86 209 -121.56 gain 209 86 -113.69 gain 86 210 -132.11 gain 210 86 -130.82 gain 86 211 -127.72 gain 211 86 -122.70 gain 86 212 -122.26 gain 212 86 -114.78 gain 86 213 -123.62 gain 213 86 -121.01 gain 86 214 -110.64 gain 214 86 -104.33 gain 86 215 -118.17 gain 215 86 -112.95 gain 86 216 -123.92 gain 216 86 -119.53 gain 86 217 -113.68 gain 217 86 -113.11 gain 86 218 -118.38 gain 218 86 -110.00 gain 86 219 -110.50 gain 219 86 -104.93 gain 86 220 -121.13 gain 220 86 -111.92 gain 86 221 -118.18 gain 221 86 -113.47 gain 86 222 -114.93 gain 222 86 -111.59 gain 86 223 -116.46 gain 223 86 -115.13 gain 86 224 -118.62 gain 224 86 -117.79 gain 87 88 -88.62 gain 88 87 -89.17 gain 87 89 -92.64 gain 89 87 -93.44 gain 87 90 -119.91 gain 90 87 -122.08 gain 87 91 -109.74 gain 91 87 -111.20 gain 87 92 -118.66 gain 92 87 -120.68 gain 87 93 -116.90 gain 93 87 -120.47 gain 87 94 -109.21 gain 94 87 -107.68 gain 87 95 -115.01 gain 95 87 -116.71 gain 87 96 -109.67 gain 96 87 -106.83 gain 87 97 -109.17 gain 97 87 -109.74 gain 87 98 -102.31 gain 98 87 -101.62 gain 87 99 -92.70 gain 99 87 -95.65 gain 87 100 -95.96 gain 100 87 -100.63 gain 87 101 -92.96 gain 101 87 -93.56 gain 87 102 -86.56 gain 102 87 -87.28 gain 87 103 -88.33 gain 103 87 -88.89 gain 87 104 -98.99 gain 104 87 -95.37 gain 87 105 -118.37 gain 105 87 -120.08 gain 87 106 -115.36 gain 106 87 -115.79 gain 87 107 -123.14 gain 107 87 -123.86 gain 87 108 -125.19 gain 108 87 -125.58 gain 87 109 -112.50 gain 109 87 -114.73 gain 87 110 -105.17 gain 110 87 -104.47 gain 87 111 -104.52 gain 111 87 -106.48 gain 87 112 -103.62 gain 112 87 -105.33 gain 87 113 -107.83 gain 113 87 -111.24 gain 87 114 -96.25 gain 114 87 -96.56 gain 87 115 -98.26 gain 115 87 -93.50 gain 87 116 -97.72 gain 116 87 -98.70 gain 87 117 -96.62 gain 117 87 -100.40 gain 87 118 -95.98 gain 118 87 -97.14 gain 87 119 -101.35 gain 119 87 -101.97 gain 87 120 -112.92 gain 120 87 -109.09 gain 87 121 -111.23 gain 121 87 -110.17 gain 87 122 -112.74 gain 122 87 -114.19 gain 87 123 -114.98 gain 123 87 -113.95 gain 87 124 -113.33 gain 124 87 -112.30 gain 87 125 -111.31 gain 125 87 -111.88 gain 87 126 -113.83 gain 126 87 -110.71 gain 87 127 -108.85 gain 127 87 -107.31 gain 87 128 -96.13 gain 128 87 -96.46 gain 87 129 -99.65 gain 129 87 -97.38 gain 87 130 -98.99 gain 130 87 -99.40 gain 87 131 -100.22 gain 131 87 -98.50 gain 87 132 -101.05 gain 132 87 -101.95 gain 87 133 -99.10 gain 133 87 -98.11 gain 87 134 -98.43 gain 134 87 -97.24 gain 87 135 -117.43 gain 135 87 -117.95 gain 87 136 -116.62 gain 136 87 -118.43 gain 87 137 -118.00 gain 137 87 -117.59 gain 87 138 -111.60 gain 138 87 -107.42 gain 87 139 -117.16 gain 139 87 -114.88 gain 87 140 -108.91 gain 140 87 -112.69 gain 87 141 -105.55 gain 141 87 -104.21 gain 87 142 -107.86 gain 142 87 -111.33 gain 87 143 -115.44 gain 143 87 -114.45 gain 87 144 -105.27 gain 144 87 -105.19 gain 87 145 -99.85 gain 145 87 -99.36 gain 87 146 -101.53 gain 146 87 -98.60 gain 87 147 -100.80 gain 147 87 -101.72 gain 87 148 -104.04 gain 148 87 -103.88 gain 87 149 -105.78 gain 149 87 -104.87 gain 87 150 -126.27 gain 150 87 -130.49 gain 87 151 -119.54 gain 151 87 -117.32 gain 87 152 -120.49 gain 152 87 -120.09 gain 87 153 -109.33 gain 153 87 -111.36 gain 87 154 -113.94 gain 154 87 -111.59 gain 87 155 -114.96 gain 155 87 -116.43 gain 87 156 -108.28 gain 156 87 -107.77 gain 87 157 -117.99 gain 157 87 -119.44 gain 87 158 -105.21 gain 158 87 -107.10 gain 87 159 -117.30 gain 159 87 -112.82 gain 87 160 -106.17 gain 160 87 -103.97 gain 87 161 -103.63 gain 161 87 -104.29 gain 87 162 -108.28 gain 162 87 -106.02 gain 87 163 -112.26 gain 163 87 -107.19 gain 87 164 -106.72 gain 164 87 -103.38 gain 87 165 -121.48 gain 165 87 -121.08 gain 87 166 -118.55 gain 166 87 -120.82 gain 87 167 -118.31 gain 167 87 -119.71 gain 87 168 -114.40 gain 168 87 -117.15 gain 87 169 -109.69 gain 169 87 -104.78 gain 87 170 -117.24 gain 170 87 -122.83 gain 87 171 -120.18 gain 171 87 -122.19 gain 87 172 -109.38 gain 172 87 -104.49 gain 87 173 -111.93 gain 173 87 -111.70 gain 87 174 -119.66 gain 174 87 -119.19 gain 87 175 -108.52 gain 175 87 -107.25 gain 87 176 -107.92 gain 176 87 -106.61 gain 87 177 -111.04 gain 177 87 -111.22 gain 87 178 -111.01 gain 178 87 -112.14 gain 87 179 -113.20 gain 179 87 -115.35 gain 87 180 -120.76 gain 180 87 -118.72 gain 87 181 -119.73 gain 181 87 -122.13 gain 87 182 -112.53 gain 182 87 -111.23 gain 87 183 -114.21 gain 183 87 -114.21 gain 87 184 -118.41 gain 184 87 -120.46 gain 87 185 -111.11 gain 185 87 -108.59 gain 87 186 -114.62 gain 186 87 -111.10 gain 87 187 -117.37 gain 187 87 -117.94 gain 87 188 -108.60 gain 188 87 -111.92 gain 87 189 -113.78 gain 189 87 -116.50 gain 87 190 -109.56 gain 190 87 -107.95 gain 87 191 -107.66 gain 191 87 -109.08 gain 87 192 -107.63 gain 192 87 -106.37 gain 87 193 -113.06 gain 193 87 -115.77 gain 87 194 -116.80 gain 194 87 -119.08 gain 87 195 -121.86 gain 195 87 -122.33 gain 87 196 -118.31 gain 196 87 -117.81 gain 87 197 -125.27 gain 197 87 -127.44 gain 87 198 -119.15 gain 198 87 -125.25 gain 87 199 -116.84 gain 199 87 -114.51 gain 87 200 -115.40 gain 200 87 -109.84 gain 87 201 -106.92 gain 201 87 -105.18 gain 87 202 -118.59 gain 202 87 -118.38 gain 87 203 -112.93 gain 203 87 -109.34 gain 87 204 -109.87 gain 204 87 -113.37 gain 87 205 -113.82 gain 205 87 -115.38 gain 87 206 -105.83 gain 206 87 -105.37 gain 87 207 -106.36 gain 207 87 -106.66 gain 87 208 -117.68 gain 208 87 -118.16 gain 87 209 -109.96 gain 209 87 -106.43 gain 87 210 -123.88 gain 210 87 -126.95 gain 87 211 -122.41 gain 211 87 -121.73 gain 87 212 -115.83 gain 212 87 -112.70 gain 87 213 -114.11 gain 213 87 -115.85 gain 87 214 -117.76 gain 214 87 -115.79 gain 87 215 -117.92 gain 215 87 -117.05 gain 87 216 -117.85 gain 216 87 -117.80 gain 87 217 -114.69 gain 217 87 -118.46 gain 87 218 -110.75 gain 218 87 -106.71 gain 87 219 -113.55 gain 219 87 -112.33 gain 87 220 -111.13 gain 220 87 -106.26 gain 87 221 -114.88 gain 221 87 -114.51 gain 87 222 -116.07 gain 222 87 -117.08 gain 87 223 -112.10 gain 223 87 -115.12 gain 87 224 -117.90 gain 224 87 -121.41 gain 88 89 -93.50 gain 89 88 -93.75 gain 88 90 -116.95 gain 90 88 -118.58 gain 88 91 -109.69 gain 91 88 -110.61 gain 88 92 -119.15 gain 92 88 -120.63 gain 88 93 -113.65 gain 93 88 -116.67 gain 88 94 -111.30 gain 94 88 -109.23 gain 88 95 -107.59 gain 95 88 -108.75 gain 88 96 -115.04 gain 96 88 -111.66 gain 88 97 -110.41 gain 97 88 -110.43 gain 88 98 -102.53 gain 98 88 -101.31 gain 88 99 -102.93 gain 99 88 -105.34 gain 88 100 -102.23 gain 100 88 -106.35 gain 88 101 -98.99 gain 101 88 -99.04 gain 88 102 -88.45 gain 102 88 -88.63 gain 88 103 -91.03 gain 103 88 -91.05 gain 88 104 -86.59 gain 104 88 -82.43 gain 88 105 -117.76 gain 105 88 -118.92 gain 88 106 -115.54 gain 106 88 -115.42 gain 88 107 -116.36 gain 107 88 -116.54 gain 88 108 -115.64 gain 108 88 -115.48 gain 88 109 -109.41 gain 109 88 -111.10 gain 88 110 -112.16 gain 110 88 -110.92 gain 88 111 -109.81 gain 111 88 -111.24 gain 88 112 -108.79 gain 112 88 -109.95 gain 88 113 -110.28 gain 113 88 -113.14 gain 88 114 -107.20 gain 114 88 -106.97 gain 88 115 -106.24 gain 115 88 -100.94 gain 88 116 -103.20 gain 116 88 -103.64 gain 88 117 -99.67 gain 117 88 -102.90 gain 88 118 -94.08 gain 118 88 -94.69 gain 88 119 -94.76 gain 119 88 -94.84 gain 88 120 -122.65 gain 120 88 -118.28 gain 88 121 -122.25 gain 121 88 -120.65 gain 88 122 -114.33 gain 122 88 -115.24 gain 88 123 -111.18 gain 123 88 -109.61 gain 88 124 -116.29 gain 124 88 -114.71 gain 88 125 -120.21 gain 125 88 -120.24 gain 88 126 -105.62 gain 126 88 -101.96 gain 88 127 -109.56 gain 127 88 -107.48 gain 88 128 -107.24 gain 128 88 -107.03 gain 88 129 -112.33 gain 129 88 -109.52 gain 88 130 -101.02 gain 130 88 -100.90 gain 88 131 -94.65 gain 131 88 -92.39 gain 88 132 -99.56 gain 132 88 -99.92 gain 88 133 -97.39 gain 133 88 -95.85 gain 88 134 -92.07 gain 134 88 -90.33 gain 88 135 -118.42 gain 135 88 -118.39 gain 88 136 -116.07 gain 136 88 -117.33 gain 88 137 -121.48 gain 137 88 -120.52 gain 88 138 -121.77 gain 138 88 -117.05 gain 88 139 -114.19 gain 139 88 -111.36 gain 88 140 -105.62 gain 140 88 -108.85 gain 88 141 -105.90 gain 141 88 -104.02 gain 88 142 -110.04 gain 142 88 -112.97 gain 88 143 -113.61 gain 143 88 -112.09 gain 88 144 -106.11 gain 144 88 -105.49 gain 88 145 -115.29 gain 145 88 -114.26 gain 88 146 -105.26 gain 146 88 -101.79 gain 88 147 -100.58 gain 147 88 -100.96 gain 88 148 -105.98 gain 148 88 -105.29 gain 88 149 -97.47 gain 149 88 -96.03 gain 88 150 -125.26 gain 150 88 -128.93 gain 88 151 -122.50 gain 151 88 -119.73 gain 88 152 -126.05 gain 152 88 -125.11 gain 88 153 -119.82 gain 153 88 -121.31 gain 88 154 -115.11 gain 154 88 -112.21 gain 88 155 -113.32 gain 155 88 -114.25 gain 88 156 -108.84 gain 156 88 -107.79 gain 88 157 -119.32 gain 157 88 -120.23 gain 88 158 -111.11 gain 158 88 -112.45 gain 88 159 -108.22 gain 159 88 -103.20 gain 88 160 -107.99 gain 160 88 -105.25 gain 88 161 -115.88 gain 161 88 -115.99 gain 88 162 -104.10 gain 162 88 -101.29 gain 88 163 -101.75 gain 163 88 -96.13 gain 88 164 -102.84 gain 164 88 -98.97 gain 88 165 -121.97 gain 165 88 -121.02 gain 88 166 -120.81 gain 166 88 -122.54 gain 88 167 -122.81 gain 167 88 -123.66 gain 88 168 -116.88 gain 168 88 -119.09 gain 88 169 -117.24 gain 169 88 -111.80 gain 88 170 -118.05 gain 170 88 -123.09 gain 88 171 -114.31 gain 171 88 -115.78 gain 88 172 -109.30 gain 172 88 -103.87 gain 88 173 -115.23 gain 173 88 -114.46 gain 88 174 -109.46 gain 174 88 -108.44 gain 88 175 -109.58 gain 175 88 -107.77 gain 88 176 -113.45 gain 176 88 -111.60 gain 88 177 -105.43 gain 177 88 -105.07 gain 88 178 -99.58 gain 178 88 -100.17 gain 88 179 -109.11 gain 179 88 -110.73 gain 88 180 -122.79 gain 180 88 -120.21 gain 88 181 -122.43 gain 181 88 -124.29 gain 88 182 -114.54 gain 182 88 -112.70 gain 88 183 -121.02 gain 183 88 -120.47 gain 88 184 -119.33 gain 184 88 -120.84 gain 88 185 -124.09 gain 185 88 -121.03 gain 88 186 -117.40 gain 186 88 -113.34 gain 88 187 -110.54 gain 187 88 -110.56 gain 88 188 -109.51 gain 188 88 -112.30 gain 88 189 -110.16 gain 189 88 -112.34 gain 88 190 -115.81 gain 190 88 -113.65 gain 88 191 -112.03 gain 191 88 -112.91 gain 88 192 -116.62 gain 192 88 -114.82 gain 88 193 -114.44 gain 193 88 -116.61 gain 88 194 -108.84 gain 194 88 -110.58 gain 88 195 -122.88 gain 195 88 -122.81 gain 88 196 -123.54 gain 196 88 -122.50 gain 88 197 -124.23 gain 197 88 -125.86 gain 88 198 -115.27 gain 198 88 -120.84 gain 88 199 -119.13 gain 199 88 -116.26 gain 88 200 -115.10 gain 200 88 -109.00 gain 88 201 -118.68 gain 201 88 -116.40 gain 88 202 -110.13 gain 202 88 -109.38 gain 88 203 -118.90 gain 203 88 -114.77 gain 88 204 -110.81 gain 204 88 -113.77 gain 88 205 -108.71 gain 205 88 -109.73 gain 88 206 -116.57 gain 206 88 -115.56 gain 88 207 -113.27 gain 207 88 -113.03 gain 88 208 -113.15 gain 208 88 -113.08 gain 88 209 -122.49 gain 209 88 -118.43 gain 88 210 -117.11 gain 210 88 -119.63 gain 88 211 -124.81 gain 211 88 -123.59 gain 88 212 -121.45 gain 212 88 -117.78 gain 88 213 -121.27 gain 213 88 -122.47 gain 88 214 -122.19 gain 214 88 -119.69 gain 88 215 -125.70 gain 215 88 -124.28 gain 88 216 -107.31 gain 216 88 -106.72 gain 88 217 -117.90 gain 217 88 -121.13 gain 88 218 -114.26 gain 218 88 -109.68 gain 88 219 -114.54 gain 219 88 -112.78 gain 88 220 -118.45 gain 220 88 -113.04 gain 88 221 -114.02 gain 221 88 -113.11 gain 88 222 -114.96 gain 222 88 -115.43 gain 88 223 -122.72 gain 223 88 -125.19 gain 88 224 -117.89 gain 224 88 -120.87 gain 89 90 -119.95 gain 90 89 -121.32 gain 89 91 -124.70 gain 91 89 -125.36 gain 89 92 -119.71 gain 92 89 -120.94 gain 89 93 -123.58 gain 93 89 -126.34 gain 89 94 -120.61 gain 94 89 -118.28 gain 89 95 -116.66 gain 95 89 -117.56 gain 89 96 -109.45 gain 96 89 -105.81 gain 89 97 -108.85 gain 97 89 -108.62 gain 89 98 -106.06 gain 98 89 -104.58 gain 89 99 -97.79 gain 99 89 -99.95 gain 89 100 -99.28 gain 100 89 -103.14 gain 89 101 -93.62 gain 101 89 -93.42 gain 89 102 -90.80 gain 102 89 -90.73 gain 89 103 -87.46 gain 103 89 -87.22 gain 89 104 -86.90 gain 104 89 -82.48 gain 89 105 -122.75 gain 105 89 -123.66 gain 89 106 -124.07 gain 106 89 -123.69 gain 89 107 -112.74 gain 107 89 -112.66 gain 89 108 -119.01 gain 108 89 -118.60 gain 89 109 -120.79 gain 109 89 -122.22 gain 89 110 -111.28 gain 110 89 -109.78 gain 89 111 -112.06 gain 111 89 -113.22 gain 89 112 -103.32 gain 112 89 -104.23 gain 89 113 -106.47 gain 113 89 -109.08 gain 89 114 -105.59 gain 114 89 -105.10 gain 89 115 -107.14 gain 115 89 -101.57 gain 89 116 -105.50 gain 116 89 -105.68 gain 89 117 -96.09 gain 117 89 -99.06 gain 89 118 -96.63 gain 118 89 -96.98 gain 89 119 -98.00 gain 119 89 -97.83 gain 89 120 -122.84 gain 120 89 -118.21 gain 89 121 -118.78 gain 121 89 -116.93 gain 89 122 -121.84 gain 122 89 -122.50 gain 89 123 -114.33 gain 123 89 -112.51 gain 89 124 -112.43 gain 124 89 -110.60 gain 89 125 -119.97 gain 125 89 -119.74 gain 89 126 -113.47 gain 126 89 -109.56 gain 89 127 -115.82 gain 127 89 -113.48 gain 89 128 -110.79 gain 128 89 -110.32 gain 89 129 -120.52 gain 129 89 -117.45 gain 89 130 -111.30 gain 130 89 -110.91 gain 89 131 -108.98 gain 131 89 -106.46 gain 89 132 -105.77 gain 132 89 -105.87 gain 89 133 -101.30 gain 133 89 -99.51 gain 89 134 -98.94 gain 134 89 -96.95 gain 89 135 -123.80 gain 135 89 -123.52 gain 89 136 -129.72 gain 136 89 -130.73 gain 89 137 -118.20 gain 137 89 -116.98 gain 89 138 -125.86 gain 138 89 -120.88 gain 89 139 -115.18 gain 139 89 -112.09 gain 89 140 -116.92 gain 140 89 -119.89 gain 89 141 -117.03 gain 141 89 -114.89 gain 89 142 -111.84 gain 142 89 -114.52 gain 89 143 -105.67 gain 143 89 -103.89 gain 89 144 -104.75 gain 144 89 -103.87 gain 89 145 -110.36 gain 145 89 -109.07 gain 89 146 -107.01 gain 146 89 -103.29 gain 89 147 -100.60 gain 147 89 -100.72 gain 89 148 -108.03 gain 148 89 -107.08 gain 89 149 -105.96 gain 149 89 -104.26 gain 89 150 -120.50 gain 150 89 -123.91 gain 89 151 -126.83 gain 151 89 -123.81 gain 89 152 -120.18 gain 152 89 -118.98 gain 89 153 -120.98 gain 153 89 -122.21 gain 89 154 -118.15 gain 154 89 -114.99 gain 89 155 -115.20 gain 155 89 -115.88 gain 89 156 -120.73 gain 156 89 -119.42 gain 89 157 -117.20 gain 157 89 -117.85 gain 89 158 -108.24 gain 158 89 -109.33 gain 89 159 -109.76 gain 159 89 -104.48 gain 89 160 -117.60 gain 160 89 -114.60 gain 89 161 -106.99 gain 161 89 -106.84 gain 89 162 -108.80 gain 162 89 -105.74 gain 89 163 -111.77 gain 163 89 -105.89 gain 89 164 -103.04 gain 164 89 -98.91 gain 89 165 -126.10 gain 165 89 -124.90 gain 89 166 -117.10 gain 166 89 -118.58 gain 89 167 -119.70 gain 167 89 -120.30 gain 89 168 -124.44 gain 168 89 -126.38 gain 89 169 -112.54 gain 169 89 -106.83 gain 89 170 -115.25 gain 170 89 -120.03 gain 89 171 -118.88 gain 171 89 -120.09 gain 89 172 -112.86 gain 172 89 -107.17 gain 89 173 -114.36 gain 173 89 -113.33 gain 89 174 -112.47 gain 174 89 -111.20 gain 89 175 -100.63 gain 175 89 -98.57 gain 89 176 -108.72 gain 176 89 -106.61 gain 89 177 -105.52 gain 177 89 -104.90 gain 89 178 -112.93 gain 178 89 -113.26 gain 89 179 -108.57 gain 179 89 -109.93 gain 89 180 -122.67 gain 180 89 -119.83 gain 89 181 -118.48 gain 181 89 -120.08 gain 89 182 -122.10 gain 182 89 -120.00 gain 89 183 -127.71 gain 183 89 -126.91 gain 89 184 -119.15 gain 184 89 -120.40 gain 89 185 -121.36 gain 185 89 -118.04 gain 89 186 -118.93 gain 186 89 -114.60 gain 89 187 -114.87 gain 187 89 -114.64 gain 89 188 -114.94 gain 188 89 -117.46 gain 89 189 -108.95 gain 189 89 -110.87 gain 89 190 -118.43 gain 190 89 -116.02 gain 89 191 -110.16 gain 191 89 -110.79 gain 89 192 -111.35 gain 192 89 -109.29 gain 89 193 -101.75 gain 193 89 -103.67 gain 89 194 -105.84 gain 194 89 -107.32 gain 89 195 -118.24 gain 195 89 -117.91 gain 89 196 -118.04 gain 196 89 -116.74 gain 89 197 -123.39 gain 197 89 -124.76 gain 89 198 -122.44 gain 198 89 -127.75 gain 89 199 -121.83 gain 199 89 -118.70 gain 89 200 -117.47 gain 200 89 -111.11 gain 89 201 -117.41 gain 201 89 -114.87 gain 89 202 -114.94 gain 202 89 -113.93 gain 89 203 -119.41 gain 203 89 -115.03 gain 89 204 -120.66 gain 204 89 -123.35 gain 89 205 -120.13 gain 205 89 -120.89 gain 89 206 -116.00 gain 206 89 -114.74 gain 89 207 -113.29 gain 207 89 -112.79 gain 89 208 -116.96 gain 208 89 -116.64 gain 89 209 -112.78 gain 209 89 -108.45 gain 89 210 -121.87 gain 210 89 -124.14 gain 89 211 -120.24 gain 211 89 -118.76 gain 89 212 -121.98 gain 212 89 -118.05 gain 89 213 -120.21 gain 213 89 -121.15 gain 89 214 -120.75 gain 214 89 -117.98 gain 89 215 -117.43 gain 215 89 -115.76 gain 89 216 -113.16 gain 216 89 -112.31 gain 89 217 -115.82 gain 217 89 -118.79 gain 89 218 -116.76 gain 218 89 -111.92 gain 89 219 -113.48 gain 219 89 -111.46 gain 89 220 -115.57 gain 220 89 -109.91 gain 89 221 -116.73 gain 221 89 -115.57 gain 89 222 -126.76 gain 222 89 -126.97 gain 89 223 -113.54 gain 223 89 -115.75 gain 89 224 -113.06 gain 224 89 -115.78 gain 90 91 -83.90 gain 91 90 -83.19 gain 90 92 -87.83 gain 92 90 -87.68 gain 90 93 -95.72 gain 93 90 -97.11 gain 90 94 -105.30 gain 94 90 -101.59 gain 90 95 -109.10 gain 95 90 -108.63 gain 90 96 -111.40 gain 96 90 -106.38 gain 90 97 -106.14 gain 97 90 -104.53 gain 90 98 -108.77 gain 98 90 -105.91 gain 90 99 -114.93 gain 99 90 -115.71 gain 90 100 -115.55 gain 100 90 -118.04 gain 90 101 -116.25 gain 101 90 -114.67 gain 90 102 -117.46 gain 102 90 -116.01 gain 90 103 -122.10 gain 103 90 -120.49 gain 90 104 -117.71 gain 104 90 -111.92 gain 90 105 -90.43 gain 105 90 -89.96 gain 90 106 -92.32 gain 106 90 -90.57 gain 90 107 -104.24 gain 107 90 -102.79 gain 90 108 -107.46 gain 108 90 -105.67 gain 90 109 -110.88 gain 109 90 -110.93 gain 90 110 -110.04 gain 110 90 -107.17 gain 90 111 -109.73 gain 111 90 -109.52 gain 90 112 -108.27 gain 112 90 -107.80 gain 90 113 -113.21 gain 113 90 -114.44 gain 90 114 -116.46 gain 114 90 -114.59 gain 90 115 -108.75 gain 115 90 -101.81 gain 90 116 -116.65 gain 116 90 -115.45 gain 90 117 -115.03 gain 117 90 -116.64 gain 90 118 -117.80 gain 118 90 -116.78 gain 90 119 -122.90 gain 119 90 -121.35 gain 90 120 -98.23 gain 120 90 -92.23 gain 90 121 -94.31 gain 121 90 -91.08 gain 90 122 -101.30 gain 122 90 -100.59 gain 90 123 -100.28 gain 123 90 -97.08 gain 90 124 -110.29 gain 124 90 -107.08 gain 90 125 -102.22 gain 125 90 -100.61 gain 90 126 -114.85 gain 126 90 -109.56 gain 90 127 -114.75 gain 127 90 -111.04 gain 90 128 -116.42 gain 128 90 -114.58 gain 90 129 -121.74 gain 129 90 -117.30 gain 90 130 -115.75 gain 130 90 -113.99 gain 90 131 -114.75 gain 131 90 -110.86 gain 90 132 -120.86 gain 132 90 -119.59 gain 90 133 -123.25 gain 133 90 -120.09 gain 90 134 -120.50 gain 134 90 -117.13 gain 90 135 -108.31 gain 135 90 -106.65 gain 90 136 -99.79 gain 136 90 -99.42 gain 90 137 -102.16 gain 137 90 -99.57 gain 90 138 -109.67 gain 138 90 -103.32 gain 90 139 -106.46 gain 139 90 -102.00 gain 90 140 -110.04 gain 140 90 -111.64 gain 90 141 -110.67 gain 141 90 -107.16 gain 90 142 -113.79 gain 142 90 -115.09 gain 90 143 -112.95 gain 143 90 -109.79 gain 90 144 -116.77 gain 144 90 -114.52 gain 90 145 -116.94 gain 145 90 -114.28 gain 90 146 -117.38 gain 146 90 -112.27 gain 90 147 -123.61 gain 147 90 -122.36 gain 90 148 -123.88 gain 148 90 -121.55 gain 90 149 -117.47 gain 149 90 -114.39 gain 90 150 -102.40 gain 150 90 -104.44 gain 90 151 -103.51 gain 151 90 -99.11 gain 90 152 -101.72 gain 152 90 -99.15 gain 90 153 -108.07 gain 153 90 -107.93 gain 90 154 -107.69 gain 154 90 -103.16 gain 90 155 -110.08 gain 155 90 -109.38 gain 90 156 -115.86 gain 156 90 -113.18 gain 90 157 -113.34 gain 157 90 -112.62 gain 90 158 -113.63 gain 158 90 -113.34 gain 90 159 -118.81 gain 159 90 -112.16 gain 90 160 -119.99 gain 160 90 -115.61 gain 90 161 -117.64 gain 161 90 -116.12 gain 90 162 -124.79 gain 162 90 -120.35 gain 90 163 -114.50 gain 163 90 -107.25 gain 90 164 -122.49 gain 164 90 -116.98 gain 90 165 -109.76 gain 165 90 -107.19 gain 90 166 -111.27 gain 166 90 -111.38 gain 90 167 -115.51 gain 167 90 -114.73 gain 90 168 -116.74 gain 168 90 -117.31 gain 90 169 -112.88 gain 169 90 -105.80 gain 90 170 -117.37 gain 170 90 -120.78 gain 90 171 -116.51 gain 171 90 -116.34 gain 90 172 -123.09 gain 172 90 -116.02 gain 90 173 -117.60 gain 173 90 -115.20 gain 90 174 -117.02 gain 174 90 -114.37 gain 90 175 -118.18 gain 175 90 -114.74 gain 90 176 -118.72 gain 176 90 -115.23 gain 90 177 -117.51 gain 177 90 -115.51 gain 90 178 -122.54 gain 178 90 -121.50 gain 90 179 -119.63 gain 179 90 -119.61 gain 90 180 -113.85 gain 180 90 -109.64 gain 90 181 -111.52 gain 181 90 -111.74 gain 90 182 -110.12 gain 182 90 -106.65 gain 90 183 -109.19 gain 183 90 -107.02 gain 90 184 -110.13 gain 184 90 -110.01 gain 90 185 -111.96 gain 185 90 -107.27 gain 90 186 -117.79 gain 186 90 -112.09 gain 90 187 -113.61 gain 187 90 -112.00 gain 90 188 -119.01 gain 188 90 -120.16 gain 90 189 -121.33 gain 189 90 -121.87 gain 90 190 -128.97 gain 190 90 -125.19 gain 90 191 -118.90 gain 191 90 -118.14 gain 90 192 -115.80 gain 192 90 -112.37 gain 90 193 -130.22 gain 193 90 -130.76 gain 90 194 -130.30 gain 194 90 -130.41 gain 90 195 -115.05 gain 195 90 -113.35 gain 90 196 -112.02 gain 196 90 -109.35 gain 90 197 -113.30 gain 197 90 -113.30 gain 90 198 -123.62 gain 198 90 -127.55 gain 90 199 -112.97 gain 199 90 -108.46 gain 90 200 -116.10 gain 200 90 -108.37 gain 90 201 -115.33 gain 201 90 -111.41 gain 90 202 -117.30 gain 202 90 -114.91 gain 90 203 -117.93 gain 203 90 -112.17 gain 90 204 -122.16 gain 204 90 -123.49 gain 90 205 -125.29 gain 205 90 -124.68 gain 90 206 -127.74 gain 206 90 -125.10 gain 90 207 -121.36 gain 207 90 -119.49 gain 90 208 -123.57 gain 208 90 -121.87 gain 90 209 -122.60 gain 209 90 -116.90 gain 90 210 -118.13 gain 210 90 -119.02 gain 90 211 -116.41 gain 211 90 -113.56 gain 90 212 -116.43 gain 212 90 -111.12 gain 90 213 -117.09 gain 213 90 -116.65 gain 90 214 -116.26 gain 214 90 -112.12 gain 90 215 -114.40 gain 215 90 -111.35 gain 90 216 -118.32 gain 216 90 -116.09 gain 90 217 -124.54 gain 217 90 -126.14 gain 90 218 -111.77 gain 218 90 -105.55 gain 90 219 -121.35 gain 219 90 -117.96 gain 90 220 -122.13 gain 220 90 -115.09 gain 90 221 -128.34 gain 221 90 -125.80 gain 90 222 -120.27 gain 222 90 -119.10 gain 90 223 -120.91 gain 223 90 -121.75 gain 90 224 -130.73 gain 224 90 -132.07 gain 91 92 -92.19 gain 92 91 -92.76 gain 91 93 -86.20 gain 93 91 -88.31 gain 91 94 -99.92 gain 94 91 -96.93 gain 91 95 -110.79 gain 95 91 -111.03 gain 91 96 -111.06 gain 96 91 -106.76 gain 91 97 -111.23 gain 97 91 -110.34 gain 91 98 -107.97 gain 98 91 -105.83 gain 91 99 -110.09 gain 99 91 -111.59 gain 91 100 -108.58 gain 100 91 -111.79 gain 91 101 -109.06 gain 101 91 -108.20 gain 91 102 -118.43 gain 102 91 -117.70 gain 91 103 -122.24 gain 103 91 -121.34 gain 91 104 -118.15 gain 104 91 -113.07 gain 91 105 -93.34 gain 105 91 -93.59 gain 91 106 -91.01 gain 106 91 -89.98 gain 91 107 -91.24 gain 107 91 -90.50 gain 91 108 -101.55 gain 108 91 -100.48 gain 91 109 -99.47 gain 109 91 -100.24 gain 91 110 -101.98 gain 110 91 -99.83 gain 91 111 -106.35 gain 111 91 -106.86 gain 91 112 -116.16 gain 112 91 -116.41 gain 91 113 -109.80 gain 113 91 -111.75 gain 91 114 -114.52 gain 114 91 -113.38 gain 91 115 -118.30 gain 115 91 -112.07 gain 91 116 -122.12 gain 116 91 -121.64 gain 91 117 -111.82 gain 117 91 -114.14 gain 91 118 -111.58 gain 118 91 -111.27 gain 91 119 -123.25 gain 119 91 -122.42 gain 91 120 -96.60 gain 120 91 -91.32 gain 91 121 -98.94 gain 121 91 -96.43 gain 91 122 -96.83 gain 122 91 -96.83 gain 91 123 -100.82 gain 123 91 -98.33 gain 91 124 -99.47 gain 124 91 -96.98 gain 91 125 -111.69 gain 125 91 -110.80 gain 91 126 -107.28 gain 126 91 -102.71 gain 91 127 -104.87 gain 127 91 -101.87 gain 91 128 -111.74 gain 128 91 -110.61 gain 91 129 -113.78 gain 129 91 -110.06 gain 91 130 -113.97 gain 130 91 -112.93 gain 91 131 -108.47 gain 131 91 -105.29 gain 91 132 -117.62 gain 132 91 -117.06 gain 91 133 -117.74 gain 133 91 -115.29 gain 91 134 -117.50 gain 134 91 -114.85 gain 91 135 -100.19 gain 135 91 -99.25 gain 91 136 -96.17 gain 136 91 -96.52 gain 91 137 -107.29 gain 137 91 -105.42 gain 91 138 -103.63 gain 138 91 -97.99 gain 91 139 -108.66 gain 139 91 -104.92 gain 91 140 -102.19 gain 140 91 -104.51 gain 91 141 -110.37 gain 141 91 -107.58 gain 91 142 -102.99 gain 142 91 -105.01 gain 91 143 -112.97 gain 143 91 -110.52 gain 91 144 -120.22 gain 144 91 -118.68 gain 91 145 -115.90 gain 145 91 -113.96 gain 91 146 -116.01 gain 146 91 -111.63 gain 91 147 -119.33 gain 147 91 -118.79 gain 91 148 -116.22 gain 148 91 -114.61 gain 91 149 -127.14 gain 149 91 -124.78 gain 91 150 -98.85 gain 150 91 -101.60 gain 91 151 -108.12 gain 151 91 -104.43 gain 91 152 -101.10 gain 152 91 -99.25 gain 91 153 -108.04 gain 153 91 -108.62 gain 91 154 -112.45 gain 154 91 -108.64 gain 91 155 -102.84 gain 155 91 -102.86 gain 91 156 -109.77 gain 156 91 -107.80 gain 91 157 -112.10 gain 157 91 -112.09 gain 91 158 -114.75 gain 158 91 -115.18 gain 91 159 -111.40 gain 159 91 -105.46 gain 91 160 -116.99 gain 160 91 -113.33 gain 91 161 -122.02 gain 161 91 -121.21 gain 91 162 -111.33 gain 162 91 -107.61 gain 91 163 -116.10 gain 163 91 -109.56 gain 91 164 -124.62 gain 164 91 -119.83 gain 91 165 -108.94 gain 165 91 -107.08 gain 91 166 -109.48 gain 166 91 -110.30 gain 91 167 -102.59 gain 167 91 -102.53 gain 91 168 -113.08 gain 168 91 -114.36 gain 91 169 -111.50 gain 169 91 -105.13 gain 91 170 -111.48 gain 170 91 -115.60 gain 91 171 -116.51 gain 171 91 -117.06 gain 91 172 -112.55 gain 172 91 -106.20 gain 91 173 -113.81 gain 173 91 -112.12 gain 91 174 -110.70 gain 174 91 -108.77 gain 91 175 -117.12 gain 175 91 -114.40 gain 91 176 -116.94 gain 176 91 -114.17 gain 91 177 -120.53 gain 177 91 -119.25 gain 91 178 -119.35 gain 178 91 -119.02 gain 91 179 -123.60 gain 179 91 -124.30 gain 91 180 -113.04 gain 180 91 -109.54 gain 91 181 -112.42 gain 181 91 -113.37 gain 91 182 -109.96 gain 182 91 -107.20 gain 91 183 -106.17 gain 183 91 -104.72 gain 91 184 -105.96 gain 184 91 -106.55 gain 91 185 -113.89 gain 185 91 -109.91 gain 91 186 -119.39 gain 186 91 -114.41 gain 91 187 -113.31 gain 187 91 -112.42 gain 91 188 -108.42 gain 188 91 -110.29 gain 91 189 -117.27 gain 189 91 -118.53 gain 91 190 -116.38 gain 190 91 -113.31 gain 91 191 -119.11 gain 191 91 -119.07 gain 91 192 -112.13 gain 192 91 -109.41 gain 91 193 -115.02 gain 193 91 -116.28 gain 91 194 -128.67 gain 194 91 -129.50 gain 91 195 -111.69 gain 195 91 -110.71 gain 91 196 -113.81 gain 196 91 -111.86 gain 91 197 -113.87 gain 197 91 -114.58 gain 91 198 -115.43 gain 198 91 -120.08 gain 91 199 -114.42 gain 199 91 -110.64 gain 91 200 -107.04 gain 200 91 -100.03 gain 91 201 -107.73 gain 201 91 -104.53 gain 91 202 -108.81 gain 202 91 -107.14 gain 91 203 -116.20 gain 203 91 -111.16 gain 91 204 -117.92 gain 204 91 -119.96 gain 91 205 -123.36 gain 205 91 -123.47 gain 91 206 -117.40 gain 206 91 -115.49 gain 91 207 -116.18 gain 207 91 -115.03 gain 91 208 -127.23 gain 208 91 -126.25 gain 91 209 -121.06 gain 209 91 -116.08 gain 91 210 -117.08 gain 210 91 -118.68 gain 91 211 -113.22 gain 211 91 -111.08 gain 91 212 -114.25 gain 212 91 -109.66 gain 91 213 -116.36 gain 213 91 -116.64 gain 91 214 -115.93 gain 214 91 -112.51 gain 91 215 -114.94 gain 215 91 -112.61 gain 91 216 -118.07 gain 216 91 -116.56 gain 91 217 -121.30 gain 217 91 -123.61 gain 91 218 -125.07 gain 218 91 -119.58 gain 91 219 -115.07 gain 219 91 -112.39 gain 91 220 -123.64 gain 220 91 -117.32 gain 91 221 -124.75 gain 221 91 -122.93 gain 91 222 -123.69 gain 222 91 -123.24 gain 91 223 -126.76 gain 223 91 -128.32 gain 91 224 -114.52 gain 224 91 -116.58 gain 92 93 -86.68 gain 93 92 -88.22 gain 92 94 -97.08 gain 94 92 -93.53 gain 92 95 -99.39 gain 95 92 -99.06 gain 92 96 -101.40 gain 96 92 -96.53 gain 92 97 -113.66 gain 97 92 -112.20 gain 92 98 -116.27 gain 98 92 -113.56 gain 92 99 -108.70 gain 99 92 -109.63 gain 92 100 -112.69 gain 100 92 -115.33 gain 92 101 -122.92 gain 101 92 -121.49 gain 92 102 -118.27 gain 102 92 -116.97 gain 92 103 -123.40 gain 103 92 -121.93 gain 92 104 -128.12 gain 104 92 -122.48 gain 92 105 -93.17 gain 105 92 -92.85 gain 92 106 -87.27 gain 106 92 -85.67 gain 92 107 -94.31 gain 107 92 -93.01 gain 92 108 -95.35 gain 108 92 -93.70 gain 92 109 -96.41 gain 109 92 -96.62 gain 92 110 -103.49 gain 110 92 -100.77 gain 92 111 -106.70 gain 111 92 -106.63 gain 92 112 -101.27 gain 112 92 -100.95 gain 92 113 -109.83 gain 113 92 -111.21 gain 92 114 -114.27 gain 114 92 -112.56 gain 92 115 -114.14 gain 115 92 -107.35 gain 92 116 -120.71 gain 116 92 -119.66 gain 92 117 -117.67 gain 117 92 -119.42 gain 92 118 -117.04 gain 118 92 -116.16 gain 92 119 -123.60 gain 119 92 -122.20 gain 92 120 -98.61 gain 120 92 -92.75 gain 92 121 -93.83 gain 121 92 -90.75 gain 92 122 -93.87 gain 122 92 -93.30 gain 92 123 -91.30 gain 123 92 -88.25 gain 92 124 -98.13 gain 124 92 -95.07 gain 92 125 -102.04 gain 125 92 -100.59 gain 92 126 -109.27 gain 126 92 -104.13 gain 92 127 -103.64 gain 127 92 -100.08 gain 92 128 -110.56 gain 128 92 -108.86 gain 92 129 -109.86 gain 129 92 -105.57 gain 92 130 -115.51 gain 130 92 -113.90 gain 92 131 -114.75 gain 131 92 -111.00 gain 92 132 -122.64 gain 132 92 -121.51 gain 92 133 -112.74 gain 133 92 -109.72 gain 92 134 -125.57 gain 134 92 -122.35 gain 92 135 -110.43 gain 135 92 -108.92 gain 92 136 -101.89 gain 136 92 -101.67 gain 92 137 -92.59 gain 137 92 -90.15 gain 92 138 -104.50 gain 138 92 -98.29 gain 92 139 -103.73 gain 139 92 -99.42 gain 92 140 -106.58 gain 140 92 -108.33 gain 92 141 -110.39 gain 141 92 -107.03 gain 92 142 -113.33 gain 142 92 -114.78 gain 92 143 -107.23 gain 143 92 -104.22 gain 92 144 -108.31 gain 144 92 -106.21 gain 92 145 -115.70 gain 145 92 -113.18 gain 92 146 -114.88 gain 146 92 -109.93 gain 92 147 -117.55 gain 147 92 -116.44 gain 92 148 -116.50 gain 148 92 -114.32 gain 92 149 -121.64 gain 149 92 -118.72 gain 92 150 -102.25 gain 150 92 -104.44 gain 92 151 -108.43 gain 151 92 -104.17 gain 92 152 -111.03 gain 152 92 -108.60 gain 92 153 -105.14 gain 153 92 -105.14 gain 92 154 -101.75 gain 154 92 -97.37 gain 92 155 -105.98 gain 155 92 -105.43 gain 92 156 -105.06 gain 156 92 -102.53 gain 92 157 -111.01 gain 157 92 -110.43 gain 92 158 -119.92 gain 158 92 -119.78 gain 92 159 -117.85 gain 159 92 -111.34 gain 92 160 -114.61 gain 160 92 -110.38 gain 92 161 -115.28 gain 161 92 -113.91 gain 92 162 -123.83 gain 162 92 -119.54 gain 92 163 -120.16 gain 163 92 -113.06 gain 92 164 -116.92 gain 164 92 -111.56 gain 92 165 -104.66 gain 165 92 -102.23 gain 92 166 -110.38 gain 166 92 -110.63 gain 92 167 -107.96 gain 167 92 -107.33 gain 92 168 -104.94 gain 168 92 -105.66 gain 92 169 -110.82 gain 169 92 -103.89 gain 92 170 -107.80 gain 170 92 -111.36 gain 92 171 -111.23 gain 171 92 -111.21 gain 92 172 -115.57 gain 172 92 -108.65 gain 92 173 -114.93 gain 173 92 -112.67 gain 92 174 -111.19 gain 174 92 -108.69 gain 92 175 -116.91 gain 175 92 -113.62 gain 92 176 -115.56 gain 176 92 -112.23 gain 92 177 -116.91 gain 177 92 -115.06 gain 92 178 -115.82 gain 178 92 -114.93 gain 92 179 -118.91 gain 179 92 -119.05 gain 92 180 -119.33 gain 180 92 -115.26 gain 92 181 -108.69 gain 181 92 -109.06 gain 92 182 -110.67 gain 182 92 -107.34 gain 92 183 -111.46 gain 183 92 -109.43 gain 92 184 -104.70 gain 184 92 -104.72 gain 92 185 -108.94 gain 185 92 -104.39 gain 92 186 -117.19 gain 186 92 -111.64 gain 92 187 -118.50 gain 187 92 -117.04 gain 92 188 -118.65 gain 188 92 -119.94 gain 92 189 -121.64 gain 189 92 -122.34 gain 92 190 -116.93 gain 190 92 -113.29 gain 92 191 -116.71 gain 191 92 -116.10 gain 92 192 -116.26 gain 192 92 -112.98 gain 92 193 -120.44 gain 193 92 -121.12 gain 92 194 -123.21 gain 194 92 -123.46 gain 92 195 -101.92 gain 195 92 -100.37 gain 92 196 -117.00 gain 196 92 -114.47 gain 92 197 -118.87 gain 197 92 -119.01 gain 92 198 -117.39 gain 198 92 -121.47 gain 92 199 -117.31 gain 199 92 -112.95 gain 92 200 -116.69 gain 200 92 -109.11 gain 92 201 -114.84 gain 201 92 -111.07 gain 92 202 -109.54 gain 202 92 -107.30 gain 92 203 -116.62 gain 203 92 -111.00 gain 92 204 -110.97 gain 204 92 -112.44 gain 92 205 -118.63 gain 205 92 -118.17 gain 92 206 -116.32 gain 206 92 -113.84 gain 92 207 -116.89 gain 207 92 -115.17 gain 92 208 -117.94 gain 208 92 -116.39 gain 92 209 -120.83 gain 209 92 -115.28 gain 92 210 -110.76 gain 210 92 -111.79 gain 92 211 -109.98 gain 211 92 -107.28 gain 92 212 -117.50 gain 212 92 -112.35 gain 92 213 -109.59 gain 213 92 -109.30 gain 92 214 -106.92 gain 214 92 -102.93 gain 92 215 -112.84 gain 215 92 -109.94 gain 92 216 -119.25 gain 216 92 -117.18 gain 92 217 -120.39 gain 217 92 -122.14 gain 92 218 -121.79 gain 218 92 -115.72 gain 92 219 -113.07 gain 219 92 -109.82 gain 92 220 -118.69 gain 220 92 -111.79 gain 92 221 -123.35 gain 221 92 -120.96 gain 92 222 -124.10 gain 222 92 -123.08 gain 92 223 -123.76 gain 223 92 -124.75 gain 92 224 -123.61 gain 224 92 -125.10 gain 93 94 -85.93 gain 94 93 -80.84 gain 93 95 -100.68 gain 95 93 -98.81 gain 93 96 -96.12 gain 96 93 -89.72 gain 93 97 -100.29 gain 97 93 -97.30 gain 93 98 -109.22 gain 98 93 -104.98 gain 93 99 -111.10 gain 99 93 -110.50 gain 93 100 -119.58 gain 100 93 -120.68 gain 93 101 -122.22 gain 101 93 -119.25 gain 93 102 -122.79 gain 102 93 -119.95 gain 93 103 -114.48 gain 103 93 -111.47 gain 93 104 -122.32 gain 104 93 -115.14 gain 93 105 -100.87 gain 105 93 -99.02 gain 93 106 -97.20 gain 106 93 -94.06 gain 93 107 -89.50 gain 107 93 -86.67 gain 93 108 -89.75 gain 108 93 -86.57 gain 93 109 -87.01 gain 109 93 -85.68 gain 93 110 -100.80 gain 110 93 -96.53 gain 93 111 -108.51 gain 111 93 -106.91 gain 93 112 -111.29 gain 112 93 -109.43 gain 93 113 -106.14 gain 113 93 -105.99 gain 93 114 -114.95 gain 114 93 -111.70 gain 93 115 -112.23 gain 115 93 -103.91 gain 93 116 -111.26 gain 116 93 -108.67 gain 93 117 -118.11 gain 117 93 -118.32 gain 93 118 -120.53 gain 118 93 -118.12 gain 93 119 -120.09 gain 119 93 -117.15 gain 93 120 -103.96 gain 120 93 -96.57 gain 93 121 -103.74 gain 121 93 -99.12 gain 93 122 -97.96 gain 122 93 -95.85 gain 93 123 -93.02 gain 123 93 -88.43 gain 93 124 -98.57 gain 124 93 -93.97 gain 93 125 -101.33 gain 125 93 -98.34 gain 93 126 -112.64 gain 126 93 -105.97 gain 93 127 -106.95 gain 127 93 -101.85 gain 93 128 -107.70 gain 128 93 -104.47 gain 93 129 -108.87 gain 129 93 -103.05 gain 93 130 -109.45 gain 130 93 -106.31 gain 93 131 -118.96 gain 131 93 -113.68 gain 93 132 -120.06 gain 132 93 -117.40 gain 93 133 -119.10 gain 133 93 -114.55 gain 93 134 -123.53 gain 134 93 -118.78 gain 93 135 -111.47 gain 135 93 -108.43 gain 93 136 -107.54 gain 136 93 -105.78 gain 93 137 -103.15 gain 137 93 -99.17 gain 93 138 -98.21 gain 138 93 -90.46 gain 93 139 -111.00 gain 139 93 -105.15 gain 93 140 -109.77 gain 140 93 -109.99 gain 93 141 -110.68 gain 141 93 -105.78 gain 93 142 -106.50 gain 142 93 -106.41 gain 93 143 -111.43 gain 143 93 -106.89 gain 93 144 -114.55 gain 144 93 -110.91 gain 93 145 -112.66 gain 145 93 -108.61 gain 93 146 -121.14 gain 146 93 -114.65 gain 93 147 -114.11 gain 147 93 -111.47 gain 93 148 -113.68 gain 148 93 -109.96 gain 93 149 -118.46 gain 149 93 -113.99 gain 93 150 -109.06 gain 150 93 -109.71 gain 93 151 -106.76 gain 151 93 -100.97 gain 93 152 -104.70 gain 152 93 -100.73 gain 93 153 -107.99 gain 153 93 -106.46 gain 93 154 -106.06 gain 154 93 -100.15 gain 93 155 -107.65 gain 155 93 -105.56 gain 93 156 -114.80 gain 156 93 -110.73 gain 93 157 -115.84 gain 157 93 -113.73 gain 93 158 -109.01 gain 158 93 -107.33 gain 93 159 -117.89 gain 159 93 -109.85 gain 93 160 -114.65 gain 160 93 -108.88 gain 93 161 -117.65 gain 161 93 -114.74 gain 93 162 -115.00 gain 162 93 -109.18 gain 93 163 -122.36 gain 163 93 -113.72 gain 93 164 -123.19 gain 164 93 -116.30 gain 93 165 -115.78 gain 165 93 -111.81 gain 93 166 -113.33 gain 166 93 -112.04 gain 93 167 -107.82 gain 167 93 -105.65 gain 93 168 -109.77 gain 168 93 -108.95 gain 93 169 -106.04 gain 169 93 -97.57 gain 93 170 -106.07 gain 170 93 -108.09 gain 93 171 -115.98 gain 171 93 -114.43 gain 93 172 -120.48 gain 172 93 -112.03 gain 93 173 -114.69 gain 173 93 -110.90 gain 93 174 -115.06 gain 174 93 -111.03 gain 93 175 -111.17 gain 175 93 -106.34 gain 93 176 -116.29 gain 176 93 -111.42 gain 93 177 -116.36 gain 177 93 -112.98 gain 93 178 -121.21 gain 178 93 -118.78 gain 93 179 -118.88 gain 179 93 -117.48 gain 93 180 -112.50 gain 180 93 -106.90 gain 93 181 -116.43 gain 181 93 -115.27 gain 93 182 -111.09 gain 182 93 -106.22 gain 93 183 -114.43 gain 183 93 -110.87 gain 93 184 -111.46 gain 184 93 -109.95 gain 93 185 -119.01 gain 185 93 -112.93 gain 93 186 -119.97 gain 186 93 -112.88 gain 93 187 -114.34 gain 187 93 -111.34 gain 93 188 -116.52 gain 188 93 -116.29 gain 93 189 -120.35 gain 189 93 -119.51 gain 93 190 -120.67 gain 190 93 -115.49 gain 93 191 -115.59 gain 191 93 -113.45 gain 93 192 -114.97 gain 192 93 -110.15 gain 93 193 -117.18 gain 193 93 -116.33 gain 93 194 -121.25 gain 194 93 -119.97 gain 93 195 -114.76 gain 195 93 -111.67 gain 93 196 -113.03 gain 196 93 -108.96 gain 93 197 -112.65 gain 197 93 -111.26 gain 93 198 -118.57 gain 198 93 -121.11 gain 93 199 -110.25 gain 199 93 -104.36 gain 93 200 -112.59 gain 200 93 -103.46 gain 93 201 -110.77 gain 201 93 -105.46 gain 93 202 -112.43 gain 202 93 -108.65 gain 93 203 -118.71 gain 203 93 -111.56 gain 93 204 -119.11 gain 204 93 -119.05 gain 93 205 -114.49 gain 205 93 -112.49 gain 93 206 -120.63 gain 206 93 -116.61 gain 93 207 -112.51 gain 207 93 -109.25 gain 93 208 -118.42 gain 208 93 -115.34 gain 93 209 -126.46 gain 209 93 -119.37 gain 93 210 -116.56 gain 210 93 -116.06 gain 93 211 -119.49 gain 211 93 -115.25 gain 93 212 -113.80 gain 212 93 -107.11 gain 93 213 -116.16 gain 213 93 -114.33 gain 93 214 -126.17 gain 214 93 -120.64 gain 93 215 -109.08 gain 215 93 -104.64 gain 93 216 -114.63 gain 216 93 -111.02 gain 93 217 -121.70 gain 217 93 -121.91 gain 93 218 -122.34 gain 218 93 -114.74 gain 93 219 -122.75 gain 219 93 -117.97 gain 93 220 -126.17 gain 220 93 -117.74 gain 93 221 -116.41 gain 221 93 -112.48 gain 93 222 -120.21 gain 222 93 -117.65 gain 93 223 -117.29 gain 223 93 -116.74 gain 93 224 -123.54 gain 224 93 -123.49 gain 94 95 -76.27 gain 95 94 -79.50 gain 94 96 -85.86 gain 96 94 -84.55 gain 94 97 -102.30 gain 97 94 -104.40 gain 94 98 -102.88 gain 98 94 -103.73 gain 94 99 -108.33 gain 99 94 -112.82 gain 94 100 -107.79 gain 100 94 -113.99 gain 94 101 -115.03 gain 101 94 -117.16 gain 94 102 -109.46 gain 102 94 -111.71 gain 94 103 -112.44 gain 103 94 -114.52 gain 94 104 -116.29 gain 104 94 -114.20 gain 94 105 -93.92 gain 105 94 -97.16 gain 94 106 -89.66 gain 106 94 -91.62 gain 94 107 -92.61 gain 107 94 -94.87 gain 94 108 -84.97 gain 108 94 -86.89 gain 94 109 -77.12 gain 109 94 -80.89 gain 94 110 -90.75 gain 110 94 -91.58 gain 94 111 -92.14 gain 111 94 -95.63 gain 94 112 -105.56 gain 112 94 -108.80 gain 94 113 -97.28 gain 113 94 -102.22 gain 94 114 -103.83 gain 114 94 -105.67 gain 94 115 -104.42 gain 115 94 -101.18 gain 94 116 -112.06 gain 116 94 -114.57 gain 94 117 -106.94 gain 117 94 -112.25 gain 94 118 -111.05 gain 118 94 -113.74 gain 94 119 -108.31 gain 119 94 -110.47 gain 94 120 -101.48 gain 120 94 -99.19 gain 94 121 -99.60 gain 121 94 -100.07 gain 94 122 -95.86 gain 122 94 -98.85 gain 94 123 -98.01 gain 123 94 -98.52 gain 94 124 -93.30 gain 124 94 -93.80 gain 94 125 -92.15 gain 125 94 -94.25 gain 94 126 -94.28 gain 126 94 -92.69 gain 94 127 -96.82 gain 127 94 -96.81 gain 94 128 -98.85 gain 128 94 -100.71 gain 94 129 -103.66 gain 129 94 -102.93 gain 94 130 -103.72 gain 130 94 -105.67 gain 94 131 -110.32 gain 131 94 -110.13 gain 94 132 -110.52 gain 132 94 -112.95 gain 94 133 -110.41 gain 133 94 -110.95 gain 94 134 -116.51 gain 134 94 -116.85 gain 94 135 -104.17 gain 135 94 -106.22 gain 94 136 -97.48 gain 136 94 -100.82 gain 94 137 -98.88 gain 137 94 -100.00 gain 94 138 -105.55 gain 138 94 -102.90 gain 94 139 -90.68 gain 139 94 -89.93 gain 94 140 -101.77 gain 140 94 -107.08 gain 94 141 -101.37 gain 141 94 -101.56 gain 94 142 -102.54 gain 142 94 -107.55 gain 94 143 -106.01 gain 143 94 -106.56 gain 94 144 -104.73 gain 144 94 -106.19 gain 94 145 -106.87 gain 145 94 -107.92 gain 94 146 -111.33 gain 146 94 -109.93 gain 94 147 -112.98 gain 147 94 -115.43 gain 94 148 -117.48 gain 148 94 -118.85 gain 94 149 -116.06 gain 149 94 -116.69 gain 94 150 -101.76 gain 150 94 -107.50 gain 94 151 -100.53 gain 151 94 -99.84 gain 94 152 -110.57 gain 152 94 -111.70 gain 94 153 -96.88 gain 153 94 -100.44 gain 94 154 -99.09 gain 154 94 -98.27 gain 94 155 -101.07 gain 155 94 -104.07 gain 94 156 -98.55 gain 156 94 -99.57 gain 94 157 -104.02 gain 157 94 -107.00 gain 94 158 -112.07 gain 158 94 -115.49 gain 94 159 -108.74 gain 159 94 -105.79 gain 94 160 -107.05 gain 160 94 -106.37 gain 94 161 -116.51 gain 161 94 -118.69 gain 94 162 -109.11 gain 162 94 -108.38 gain 94 163 -116.65 gain 163 94 -113.11 gain 94 164 -118.64 gain 164 94 -116.84 gain 94 165 -107.73 gain 165 94 -108.86 gain 94 166 -103.05 gain 166 94 -106.86 gain 94 167 -101.98 gain 167 94 -104.91 gain 94 168 -109.23 gain 168 94 -113.50 gain 94 169 -106.25 gain 169 94 -102.87 gain 94 170 -102.68 gain 170 94 -109.80 gain 94 171 -101.44 gain 171 94 -104.98 gain 94 172 -110.90 gain 172 94 -107.54 gain 94 173 -108.89 gain 173 94 -110.19 gain 94 174 -106.55 gain 174 94 -107.61 gain 94 175 -111.69 gain 175 94 -111.96 gain 94 176 -113.22 gain 176 94 -113.44 gain 94 177 -116.49 gain 177 94 -118.20 gain 94 178 -112.78 gain 178 94 -115.44 gain 94 179 -120.57 gain 179 94 -124.26 gain 94 180 -110.47 gain 180 94 -109.96 gain 94 181 -112.52 gain 181 94 -116.45 gain 94 182 -104.62 gain 182 94 -104.85 gain 94 183 -114.27 gain 183 94 -115.80 gain 94 184 -101.66 gain 184 94 -105.24 gain 94 185 -108.85 gain 185 94 -107.86 gain 94 186 -106.06 gain 186 94 -104.07 gain 94 187 -105.34 gain 187 94 -107.44 gain 94 188 -105.79 gain 188 94 -110.64 gain 94 189 -110.94 gain 189 94 -115.19 gain 94 190 -111.14 gain 190 94 -111.05 gain 94 191 -106.84 gain 191 94 -109.79 gain 94 192 -118.18 gain 192 94 -118.45 gain 94 193 -113.75 gain 193 94 -118.00 gain 94 194 -119.79 gain 194 94 -123.60 gain 94 195 -109.79 gain 195 94 -111.79 gain 94 196 -114.81 gain 196 94 -115.84 gain 94 197 -108.35 gain 197 94 -112.05 gain 94 198 -108.97 gain 198 94 -116.60 gain 94 199 -111.65 gain 199 94 -110.85 gain 94 200 -106.94 gain 200 94 -102.91 gain 94 201 -107.11 gain 201 94 -106.90 gain 94 202 -110.27 gain 202 94 -111.59 gain 94 203 -110.76 gain 203 94 -108.71 gain 94 204 -112.55 gain 204 94 -117.58 gain 94 205 -111.17 gain 205 94 -114.26 gain 94 206 -116.19 gain 206 94 -117.26 gain 94 207 -116.00 gain 207 94 -117.83 gain 94 208 -112.20 gain 208 94 -114.20 gain 94 209 -108.69 gain 209 94 -106.69 gain 94 210 -113.01 gain 210 94 -117.60 gain 94 211 -102.55 gain 211 94 -103.40 gain 94 212 -108.68 gain 212 94 -107.09 gain 94 213 -107.17 gain 213 94 -110.43 gain 94 214 -116.23 gain 214 94 -115.80 gain 94 215 -111.84 gain 215 94 -112.49 gain 94 216 -103.95 gain 216 94 -105.43 gain 94 217 -109.31 gain 217 94 -114.61 gain 94 218 -109.06 gain 218 94 -106.55 gain 94 219 -117.93 gain 219 94 -118.25 gain 94 220 -114.93 gain 220 94 -111.60 gain 94 221 -118.86 gain 221 94 -120.03 gain 94 222 -115.08 gain 222 94 -117.61 gain 94 223 -123.45 gain 223 94 -127.99 gain 94 224 -112.15 gain 224 94 -117.19 gain 95 96 -88.88 gain 96 95 -84.34 gain 95 97 -102.10 gain 97 95 -100.97 gain 95 98 -99.69 gain 98 95 -97.31 gain 95 99 -101.32 gain 99 95 -102.58 gain 95 100 -111.74 gain 100 95 -114.71 gain 95 101 -108.92 gain 101 95 -107.82 gain 95 102 -110.84 gain 102 95 -109.87 gain 95 103 -117.87 gain 103 95 -116.73 gain 95 104 -120.52 gain 104 95 -115.20 gain 95 105 -105.10 gain 105 95 -105.10 gain 95 106 -112.91 gain 106 95 -111.63 gain 95 107 -99.78 gain 107 95 -98.81 gain 95 108 -100.18 gain 108 95 -98.87 gain 95 109 -90.96 gain 109 95 -91.49 gain 95 110 -83.16 gain 110 95 -80.76 gain 95 111 -87.37 gain 111 95 -87.64 gain 95 112 -94.68 gain 112 95 -94.70 gain 95 113 -98.15 gain 113 95 -99.86 gain 95 114 -94.19 gain 114 95 -92.81 gain 95 115 -105.78 gain 115 95 -99.32 gain 95 116 -115.53 gain 116 95 -114.80 gain 95 117 -106.94 gain 117 95 -109.02 gain 95 118 -114.62 gain 118 95 -114.08 gain 95 119 -113.38 gain 119 95 -112.31 gain 95 120 -107.42 gain 120 95 -101.90 gain 95 121 -105.64 gain 121 95 -102.89 gain 95 122 -101.61 gain 122 95 -101.37 gain 95 123 -104.73 gain 123 95 -102.01 gain 95 124 -96.28 gain 124 95 -93.55 gain 95 125 -90.97 gain 125 95 -89.85 gain 95 126 -98.66 gain 126 95 -93.84 gain 95 127 -104.34 gain 127 95 -101.11 gain 95 128 -101.30 gain 128 95 -99.93 gain 95 129 -105.98 gain 129 95 -102.02 gain 95 130 -97.13 gain 130 95 -95.85 gain 95 131 -111.61 gain 131 95 -108.19 gain 95 132 -116.60 gain 132 95 -115.81 gain 95 133 -117.90 gain 133 95 -115.21 gain 95 134 -113.00 gain 134 95 -110.11 gain 95 135 -104.63 gain 135 95 -103.45 gain 95 136 -107.70 gain 136 95 -107.81 gain 95 137 -105.45 gain 137 95 -103.34 gain 95 138 -103.96 gain 138 95 -98.08 gain 95 139 -105.75 gain 139 95 -101.77 gain 95 140 -93.93 gain 140 95 -96.01 gain 95 141 -102.69 gain 141 95 -99.66 gain 95 142 -99.28 gain 142 95 -101.06 gain 95 143 -103.78 gain 143 95 -101.10 gain 95 144 -104.08 gain 144 95 -102.30 gain 95 145 -107.36 gain 145 95 -105.18 gain 95 146 -109.04 gain 146 95 -104.41 gain 95 147 -116.18 gain 147 95 -115.40 gain 95 148 -120.72 gain 148 95 -118.87 gain 95 149 -114.31 gain 149 95 -111.71 gain 95 150 -108.71 gain 150 95 -111.22 gain 95 151 -117.09 gain 151 95 -113.17 gain 95 152 -105.40 gain 152 95 -103.31 gain 95 153 -105.88 gain 153 95 -106.22 gain 95 154 -104.79 gain 154 95 -100.74 gain 95 155 -100.73 gain 155 95 -100.51 gain 95 156 -107.11 gain 156 95 -104.90 gain 95 157 -109.02 gain 157 95 -108.77 gain 95 158 -106.43 gain 158 95 -106.62 gain 95 159 -111.15 gain 159 95 -104.97 gain 95 160 -110.94 gain 160 95 -107.04 gain 95 161 -112.30 gain 161 95 -111.26 gain 95 162 -112.49 gain 162 95 -108.53 gain 95 163 -113.28 gain 163 95 -106.50 gain 95 164 -116.45 gain 164 95 -111.42 gain 95 165 -102.05 gain 165 95 -99.95 gain 95 166 -114.49 gain 166 95 -115.07 gain 95 167 -108.91 gain 167 95 -108.61 gain 95 168 -111.15 gain 168 95 -112.20 gain 95 169 -109.83 gain 169 95 -103.23 gain 95 170 -106.38 gain 170 95 -110.27 gain 95 171 -110.94 gain 171 95 -111.25 gain 95 172 -113.57 gain 172 95 -106.98 gain 95 173 -110.84 gain 173 95 -108.91 gain 95 174 -104.26 gain 174 95 -102.09 gain 95 175 -114.53 gain 175 95 -111.56 gain 95 176 -115.96 gain 176 95 -112.95 gain 95 177 -116.78 gain 177 95 -115.26 gain 95 178 -116.82 gain 178 95 -116.25 gain 95 179 -117.64 gain 179 95 -118.10 gain 95 180 -114.66 gain 180 95 -110.92 gain 95 181 -108.76 gain 181 95 -109.46 gain 95 182 -113.90 gain 182 95 -110.90 gain 95 183 -108.39 gain 183 95 -106.69 gain 95 184 -104.73 gain 184 95 -105.08 gain 95 185 -112.04 gain 185 95 -107.82 gain 95 186 -113.72 gain 186 95 -108.50 gain 95 187 -112.82 gain 187 95 -111.69 gain 95 188 -107.40 gain 188 95 -109.03 gain 95 189 -110.20 gain 189 95 -111.22 gain 95 190 -105.48 gain 190 95 -102.17 gain 95 191 -101.52 gain 191 95 -101.25 gain 95 192 -113.89 gain 192 95 -110.93 gain 95 193 -123.27 gain 193 95 -124.29 gain 95 194 -119.13 gain 194 95 -119.72 gain 95 195 -117.18 gain 195 95 -115.96 gain 95 196 -113.14 gain 196 95 -110.94 gain 95 197 -107.86 gain 197 95 -108.33 gain 95 198 -106.26 gain 198 95 -110.67 gain 95 199 -111.00 gain 199 95 -106.97 gain 95 200 -113.59 gain 200 95 -106.34 gain 95 201 -109.75 gain 201 95 -106.31 gain 95 202 -110.56 gain 202 95 -108.65 gain 95 203 -104.20 gain 203 95 -98.92 gain 95 204 -114.23 gain 204 95 -116.03 gain 95 205 -110.47 gain 205 95 -110.34 gain 95 206 -113.35 gain 206 95 -111.20 gain 95 207 -119.64 gain 207 95 -118.25 gain 95 208 -114.68 gain 208 95 -113.45 gain 95 209 -123.69 gain 209 95 -118.47 gain 95 210 -112.38 gain 210 95 -113.75 gain 95 211 -115.03 gain 211 95 -112.65 gain 95 212 -117.59 gain 212 95 -112.77 gain 95 213 -116.33 gain 213 95 -116.37 gain 95 214 -115.44 gain 214 95 -111.78 gain 95 215 -108.58 gain 215 95 -106.01 gain 95 216 -112.69 gain 216 95 -110.94 gain 95 217 -104.97 gain 217 95 -107.05 gain 95 218 -113.80 gain 218 95 -108.07 gain 95 219 -114.29 gain 219 95 -111.37 gain 95 220 -116.82 gain 220 95 -110.25 gain 95 221 -119.92 gain 221 95 -117.85 gain 95 222 -120.28 gain 222 95 -119.59 gain 95 223 -119.21 gain 223 95 -120.52 gain 95 224 -125.06 gain 224 95 -126.88 gain 96 97 -89.20 gain 97 96 -92.61 gain 96 98 -94.56 gain 98 96 -96.73 gain 96 99 -93.04 gain 99 96 -98.84 gain 96 100 -101.59 gain 100 96 -109.10 gain 96 101 -103.58 gain 101 96 -107.02 gain 96 102 -107.67 gain 102 96 -111.23 gain 96 103 -108.55 gain 103 96 -111.95 gain 96 104 -109.24 gain 104 96 -108.46 gain 96 105 -102.42 gain 105 96 -106.97 gain 96 106 -106.39 gain 106 96 -109.65 gain 96 107 -94.06 gain 107 96 -97.63 gain 96 108 -100.12 gain 108 96 -103.35 gain 96 109 -93.97 gain 109 96 -99.05 gain 96 110 -91.96 gain 110 96 -94.11 gain 96 111 -81.80 gain 111 96 -86.61 gain 96 112 -81.18 gain 112 96 -85.74 gain 96 113 -85.38 gain 113 96 -91.63 gain 96 114 -99.87 gain 114 96 -103.03 gain 96 115 -105.64 gain 115 96 -103.71 gain 96 116 -101.91 gain 116 96 -105.73 gain 96 117 -106.54 gain 117 96 -113.17 gain 96 118 -109.06 gain 118 96 -113.05 gain 96 119 -113.15 gain 119 96 -116.62 gain 96 120 -117.55 gain 120 96 -116.57 gain 96 121 -107.69 gain 121 96 -109.48 gain 96 122 -98.61 gain 122 96 -102.91 gain 96 123 -104.15 gain 123 96 -105.97 gain 96 124 -100.52 gain 124 96 -102.32 gain 96 125 -92.20 gain 125 96 -95.62 gain 96 126 -85.66 gain 126 96 -85.39 gain 96 127 -95.24 gain 127 96 -96.55 gain 96 128 -103.49 gain 128 96 -106.67 gain 96 129 -95.44 gain 129 96 -96.02 gain 96 130 -98.03 gain 130 96 -101.29 gain 96 131 -102.93 gain 131 96 -104.05 gain 96 132 -105.29 gain 132 96 -109.04 gain 96 133 -111.65 gain 133 96 -113.50 gain 96 134 -103.95 gain 134 96 -105.60 gain 96 135 -108.76 gain 135 96 -112.12 gain 96 136 -107.94 gain 136 96 -112.58 gain 96 137 -104.06 gain 137 96 -106.49 gain 96 138 -94.69 gain 138 96 -93.35 gain 96 139 -97.98 gain 139 96 -98.54 gain 96 140 -93.29 gain 140 96 -99.91 gain 96 141 -92.93 gain 141 96 -94.43 gain 96 142 -97.78 gain 142 96 -104.10 gain 96 143 -101.08 gain 143 96 -102.94 gain 96 144 -104.79 gain 144 96 -107.55 gain 96 145 -92.87 gain 145 96 -95.23 gain 96 146 -99.14 gain 146 96 -99.05 gain 96 147 -110.38 gain 147 96 -114.14 gain 96 148 -103.74 gain 148 96 -106.43 gain 96 149 -111.33 gain 149 96 -113.27 gain 96 150 -112.42 gain 150 96 -119.47 gain 96 151 -104.88 gain 151 96 -105.49 gain 96 152 -107.14 gain 152 96 -109.58 gain 96 153 -96.64 gain 153 96 -101.52 gain 96 154 -99.66 gain 154 96 -100.14 gain 96 155 -99.26 gain 155 96 -103.57 gain 96 156 -103.24 gain 156 96 -105.57 gain 96 157 -99.42 gain 157 96 -103.72 gain 96 158 -97.95 gain 158 96 -102.67 gain 96 159 -100.89 gain 159 96 -99.26 gain 96 160 -103.27 gain 160 96 -103.91 gain 96 161 -106.47 gain 161 96 -109.97 gain 96 162 -110.12 gain 162 96 -110.70 gain 96 163 -109.31 gain 163 96 -107.08 gain 96 164 -108.63 gain 164 96 -108.14 gain 96 165 -111.21 gain 165 96 -113.65 gain 96 166 -103.04 gain 166 96 -108.16 gain 96 167 -108.01 gain 167 96 -112.25 gain 96 168 -106.87 gain 168 96 -112.45 gain 96 169 -106.95 gain 169 96 -104.89 gain 96 170 -102.03 gain 170 96 -110.46 gain 96 171 -110.70 gain 171 96 -115.56 gain 96 172 -104.17 gain 172 96 -102.12 gain 96 173 -102.50 gain 173 96 -105.11 gain 96 174 -98.53 gain 174 96 -100.91 gain 96 175 -104.37 gain 175 96 -105.94 gain 96 176 -112.05 gain 176 96 -113.58 gain 96 177 -109.15 gain 177 96 -112.18 gain 96 178 -107.55 gain 178 96 -111.52 gain 96 179 -113.79 gain 179 96 -118.79 gain 96 180 -115.81 gain 180 96 -116.61 gain 96 181 -107.43 gain 181 96 -112.68 gain 96 182 -107.92 gain 182 96 -109.46 gain 96 183 -101.04 gain 183 96 -103.88 gain 96 184 -100.18 gain 184 96 -105.08 gain 96 185 -107.86 gain 185 96 -108.18 gain 96 186 -104.46 gain 186 96 -103.78 gain 96 187 -115.00 gain 187 96 -118.40 gain 96 188 -104.38 gain 188 96 -110.55 gain 96 189 -109.27 gain 189 96 -114.84 gain 96 190 -105.92 gain 190 96 -107.15 gain 96 191 -111.20 gain 191 96 -115.46 gain 96 192 -108.62 gain 192 96 -110.20 gain 96 193 -114.88 gain 193 96 -120.43 gain 96 194 -103.78 gain 194 96 -108.91 gain 96 195 -111.97 gain 195 96 -115.28 gain 96 196 -115.10 gain 196 96 -117.44 gain 96 197 -106.12 gain 197 96 -111.13 gain 96 198 -121.85 gain 198 96 -130.80 gain 96 199 -109.42 gain 199 96 -109.94 gain 96 200 -105.48 gain 200 96 -102.77 gain 96 201 -103.57 gain 201 96 -104.68 gain 96 202 -107.78 gain 202 96 -110.41 gain 96 203 -102.85 gain 203 96 -102.11 gain 96 204 -110.53 gain 204 96 -116.87 gain 96 205 -115.36 gain 205 96 -119.77 gain 96 206 -108.05 gain 206 96 -110.43 gain 96 207 -106.29 gain 207 96 -109.43 gain 96 208 -103.58 gain 208 96 -106.89 gain 96 209 -119.51 gain 209 96 -118.83 gain 96 210 -107.87 gain 210 96 -113.78 gain 96 211 -107.18 gain 211 96 -109.34 gain 96 212 -109.35 gain 212 96 -109.06 gain 96 213 -114.94 gain 213 96 -119.52 gain 96 214 -111.43 gain 214 96 -112.31 gain 96 215 -115.91 gain 215 96 -117.88 gain 96 216 -111.17 gain 216 96 -113.96 gain 96 217 -110.89 gain 217 96 -117.50 gain 96 218 -109.20 gain 218 96 -108.01 gain 96 219 -102.03 gain 219 96 -103.65 gain 96 220 -107.58 gain 220 96 -105.55 gain 96 221 -113.72 gain 221 96 -116.20 gain 96 222 -110.13 gain 222 96 -113.98 gain 96 223 -117.87 gain 223 96 -123.72 gain 96 224 -123.52 gain 224 96 -129.87 gain 97 98 -77.42 gain 98 97 -76.17 gain 97 99 -97.57 gain 99 97 -99.96 gain 97 100 -100.63 gain 100 97 -104.73 gain 97 101 -105.35 gain 101 97 -105.37 gain 97 102 -106.16 gain 102 97 -106.32 gain 97 103 -112.59 gain 103 97 -112.58 gain 97 104 -112.93 gain 104 97 -108.74 gain 97 105 -118.39 gain 105 97 -119.53 gain 97 106 -105.90 gain 106 97 -105.76 gain 97 107 -112.81 gain 107 97 -112.97 gain 97 108 -102.73 gain 108 97 -102.55 gain 97 109 -95.78 gain 109 97 -97.45 gain 97 110 -94.86 gain 110 97 -93.59 gain 97 111 -93.23 gain 111 97 -94.62 gain 97 112 -81.37 gain 112 97 -82.51 gain 97 113 -85.93 gain 113 97 -88.77 gain 97 114 -96.74 gain 114 97 -96.49 gain 97 115 -96.90 gain 115 97 -91.57 gain 97 116 -105.54 gain 116 97 -105.95 gain 97 117 -102.16 gain 117 97 -105.36 gain 97 118 -104.60 gain 118 97 -105.19 gain 97 119 -105.64 gain 119 97 -105.70 gain 97 120 -100.21 gain 120 97 -95.82 gain 97 121 -115.96 gain 121 97 -114.34 gain 97 122 -105.82 gain 122 97 -106.71 gain 97 123 -109.26 gain 123 97 -107.66 gain 97 124 -111.00 gain 124 97 -109.39 gain 97 125 -98.11 gain 125 97 -98.11 gain 97 126 -98.59 gain 126 97 -94.91 gain 97 127 -92.71 gain 127 97 -90.61 gain 97 128 -94.55 gain 128 97 -94.31 gain 97 129 -97.02 gain 129 97 -94.19 gain 97 130 -104.97 gain 130 97 -104.82 gain 97 131 -98.23 gain 131 97 -95.94 gain 97 132 -107.21 gain 132 97 -107.55 gain 97 133 -121.44 gain 133 97 -119.88 gain 97 134 -110.83 gain 134 97 -109.07 gain 97 135 -113.94 gain 135 97 -113.88 gain 97 136 -103.47 gain 136 97 -104.70 gain 97 137 -107.43 gain 137 97 -106.45 gain 97 138 -106.19 gain 138 97 -101.44 gain 97 139 -103.10 gain 139 97 -100.25 gain 97 140 -110.10 gain 140 97 -113.31 gain 97 141 -89.95 gain 141 97 -88.05 gain 97 142 -100.80 gain 142 97 -103.70 gain 97 143 -100.11 gain 143 97 -98.56 gain 97 144 -105.99 gain 144 97 -105.34 gain 97 145 -111.37 gain 145 97 -110.31 gain 97 146 -110.00 gain 146 97 -106.50 gain 97 147 -107.83 gain 147 97 -108.19 gain 97 148 -106.92 gain 148 97 -106.20 gain 97 149 -112.52 gain 149 97 -111.05 gain 97 150 -108.65 gain 150 97 -112.30 gain 97 151 -109.04 gain 151 97 -106.24 gain 97 152 -110.40 gain 152 97 -109.43 gain 97 153 -111.93 gain 153 97 -113.39 gain 97 154 -114.59 gain 154 97 -111.67 gain 97 155 -103.46 gain 155 97 -104.37 gain 97 156 -107.11 gain 156 97 -106.03 gain 97 157 -104.11 gain 157 97 -105.00 gain 97 158 -103.89 gain 158 97 -105.21 gain 97 159 -106.09 gain 159 97 -101.05 gain 97 160 -108.63 gain 160 97 -105.86 gain 97 161 -100.69 gain 161 97 -100.78 gain 97 162 -111.92 gain 162 97 -109.09 gain 97 163 -109.41 gain 163 97 -103.76 gain 97 164 -107.80 gain 164 97 -103.90 gain 97 165 -113.83 gain 165 97 -112.86 gain 97 166 -109.36 gain 166 97 -111.07 gain 97 167 -115.19 gain 167 97 -116.02 gain 97 168 -109.90 gain 168 97 -112.08 gain 97 169 -119.05 gain 169 97 -113.58 gain 97 170 -102.05 gain 170 97 -107.07 gain 97 171 -108.92 gain 171 97 -110.37 gain 97 172 -108.80 gain 172 97 -103.34 gain 97 173 -102.64 gain 173 97 -101.84 gain 97 174 -100.13 gain 174 97 -99.09 gain 97 175 -109.93 gain 175 97 -108.09 gain 97 176 -107.25 gain 176 97 -105.37 gain 97 177 -115.70 gain 177 97 -115.31 gain 97 178 -104.76 gain 178 97 -105.32 gain 97 179 -112.01 gain 179 97 -113.60 gain 97 180 -113.39 gain 180 97 -110.78 gain 97 181 -110.43 gain 181 97 -112.26 gain 97 182 -113.82 gain 182 97 -111.95 gain 97 183 -111.24 gain 183 97 -110.67 gain 97 184 -109.93 gain 184 97 -111.42 gain 97 185 -110.04 gain 185 97 -106.95 gain 97 186 -105.08 gain 186 97 -100.99 gain 97 187 -112.11 gain 187 97 -112.10 gain 97 188 -107.87 gain 188 97 -110.63 gain 97 189 -107.25 gain 189 97 -109.40 gain 97 190 -104.78 gain 190 97 -102.60 gain 97 191 -108.50 gain 191 97 -109.35 gain 97 192 -110.53 gain 192 97 -108.70 gain 97 193 -119.41 gain 193 97 -121.56 gain 97 194 -111.01 gain 194 97 -112.73 gain 97 195 -113.42 gain 195 97 -113.33 gain 97 196 -117.12 gain 196 97 -116.05 gain 97 197 -109.35 gain 197 97 -110.95 gain 97 198 -114.03 gain 198 97 -119.56 gain 97 199 -116.68 gain 199 97 -113.78 gain 97 200 -111.17 gain 200 97 -105.05 gain 97 201 -114.43 gain 201 97 -112.12 gain 97 202 -111.71 gain 202 97 -110.93 gain 97 203 -114.34 gain 203 97 -110.19 gain 97 204 -114.65 gain 204 97 -117.58 gain 97 205 -117.76 gain 205 97 -118.75 gain 97 206 -109.82 gain 206 97 -108.79 gain 97 207 -111.43 gain 207 97 -111.16 gain 97 208 -114.84 gain 208 97 -114.75 gain 97 209 -108.96 gain 209 97 -104.87 gain 97 210 -113.22 gain 210 97 -115.71 gain 97 211 -116.90 gain 211 97 -115.66 gain 97 212 -116.25 gain 212 97 -112.55 gain 97 213 -118.83 gain 213 97 -120.00 gain 97 214 -108.30 gain 214 97 -105.77 gain 97 215 -117.74 gain 215 97 -116.30 gain 97 216 -117.81 gain 216 97 -117.20 gain 97 217 -105.31 gain 217 97 -108.51 gain 97 218 -118.54 gain 218 97 -113.94 gain 97 219 -116.29 gain 219 97 -114.50 gain 97 220 -113.73 gain 220 97 -108.30 gain 97 221 -122.37 gain 221 97 -121.44 gain 97 222 -111.04 gain 222 97 -111.47 gain 97 223 -122.69 gain 223 97 -125.14 gain 97 224 -114.23 gain 224 97 -117.18 gain 98 99 -87.18 gain 99 98 -90.82 gain 98 100 -91.30 gain 100 98 -96.65 gain 98 101 -109.69 gain 101 98 -110.96 gain 98 102 -96.75 gain 102 98 -98.16 gain 98 103 -109.17 gain 103 98 -110.41 gain 98 104 -106.22 gain 104 98 -103.28 gain 98 105 -109.96 gain 105 98 -112.34 gain 98 106 -109.41 gain 106 98 -110.51 gain 98 107 -110.66 gain 107 98 -112.07 gain 98 108 -108.36 gain 108 98 -109.42 gain 98 109 -101.97 gain 109 98 -104.88 gain 98 110 -101.76 gain 110 98 -101.74 gain 98 111 -98.40 gain 111 98 -101.04 gain 98 112 -88.34 gain 112 98 -90.73 gain 98 113 -82.00 gain 113 98 -86.09 gain 98 114 -86.01 gain 114 98 -87.01 gain 98 115 -99.52 gain 115 98 -95.44 gain 98 116 -97.31 gain 116 98 -98.97 gain 98 117 -96.59 gain 117 98 -101.05 gain 98 118 -104.33 gain 118 98 -106.16 gain 98 119 -105.24 gain 119 98 -106.55 gain 98 120 -116.70 gain 120 98 -113.55 gain 98 121 -105.11 gain 121 98 -104.74 gain 98 122 -104.94 gain 122 98 -107.08 gain 98 123 -96.91 gain 123 98 -96.57 gain 98 124 -108.67 gain 124 98 -108.32 gain 98 125 -102.23 gain 125 98 -103.48 gain 98 126 -98.47 gain 126 98 -96.04 gain 98 127 -92.50 gain 127 98 -91.64 gain 98 128 -96.57 gain 128 98 -97.58 gain 98 129 -95.64 gain 129 98 -94.06 gain 98 130 -99.63 gain 130 98 -100.73 gain 98 131 -104.66 gain 131 98 -103.63 gain 98 132 -103.92 gain 132 98 -105.50 gain 98 133 -103.84 gain 133 98 -103.53 gain 98 134 -105.80 gain 134 98 -105.29 gain 98 135 -111.15 gain 135 98 -112.35 gain 98 136 -108.31 gain 136 98 -110.79 gain 98 137 -104.88 gain 137 98 -105.14 gain 98 138 -110.35 gain 138 98 -106.85 gain 98 139 -105.41 gain 139 98 -103.81 gain 98 140 -102.98 gain 140 98 -107.44 gain 98 141 -99.75 gain 141 98 -99.09 gain 98 142 -99.01 gain 142 98 -103.16 gain 98 143 -98.16 gain 143 98 -97.86 gain 98 144 -94.75 gain 144 98 -95.35 gain 98 145 -103.79 gain 145 98 -103.98 gain 98 146 -95.96 gain 146 98 -93.71 gain 98 147 -102.58 gain 147 98 -104.18 gain 98 148 -102.63 gain 148 98 -103.16 gain 98 149 -104.12 gain 149 98 -103.90 gain 98 150 -108.57 gain 150 98 -113.46 gain 98 151 -109.13 gain 151 98 -107.58 gain 98 152 -109.56 gain 152 98 -109.84 gain 98 153 -104.45 gain 153 98 -107.16 gain 98 154 -110.95 gain 154 98 -109.27 gain 98 155 -108.13 gain 155 98 -110.29 gain 98 156 -101.58 gain 156 98 -101.75 gain 98 157 -98.70 gain 157 98 -100.83 gain 98 158 -101.79 gain 158 98 -104.36 gain 98 159 -99.47 gain 159 98 -95.67 gain 98 160 -100.18 gain 160 98 -98.66 gain 98 161 -110.60 gain 161 98 -111.93 gain 98 162 -111.73 gain 162 98 -110.14 gain 98 163 -114.14 gain 163 98 -109.74 gain 98 164 -114.18 gain 164 98 -111.53 gain 98 165 -113.74 gain 165 98 -114.02 gain 98 166 -118.90 gain 166 98 -121.86 gain 98 167 -117.01 gain 167 98 -119.09 gain 98 168 -112.60 gain 168 98 -116.02 gain 98 169 -104.79 gain 169 98 -100.57 gain 98 170 -107.38 gain 170 98 -113.64 gain 98 171 -103.53 gain 171 98 -106.22 gain 98 172 -105.31 gain 172 98 -101.10 gain 98 173 -94.76 gain 173 98 -95.21 gain 98 174 -107.88 gain 174 98 -108.09 gain 98 175 -106.26 gain 175 98 -105.68 gain 98 176 -108.54 gain 176 98 -107.91 gain 98 177 -109.52 gain 177 98 -110.38 gain 98 178 -112.05 gain 178 98 -113.86 gain 98 179 -114.79 gain 179 98 -117.63 gain 98 180 -115.88 gain 180 98 -114.52 gain 98 181 -117.26 gain 181 98 -120.34 gain 98 182 -121.41 gain 182 98 -120.79 gain 98 183 -108.33 gain 183 98 -109.01 gain 98 184 -115.23 gain 184 98 -117.97 gain 98 185 -111.74 gain 185 98 -109.90 gain 98 186 -106.31 gain 186 98 -103.47 gain 98 187 -109.25 gain 187 98 -110.49 gain 98 188 -109.25 gain 188 98 -113.25 gain 98 189 -104.41 gain 189 98 -107.81 gain 98 190 -105.31 gain 190 98 -104.38 gain 98 191 -108.29 gain 191 98 -110.39 gain 98 192 -105.33 gain 192 98 -104.75 gain 98 193 -112.17 gain 193 98 -115.56 gain 98 194 -110.29 gain 194 98 -113.26 gain 98 195 -115.03 gain 195 98 -116.19 gain 98 196 -113.22 gain 196 98 -113.40 gain 98 197 -113.58 gain 197 98 -116.43 gain 98 198 -111.63 gain 198 98 -118.41 gain 98 199 -121.03 gain 199 98 -119.38 gain 98 200 -100.57 gain 200 98 -95.69 gain 98 201 -112.71 gain 201 98 -111.65 gain 98 202 -106.89 gain 202 98 -107.36 gain 98 203 -116.06 gain 203 98 -113.16 gain 98 204 -106.87 gain 204 98 -111.05 gain 98 205 -109.67 gain 205 98 -111.92 gain 98 206 -109.79 gain 206 98 -110.01 gain 98 207 -113.91 gain 207 98 -114.89 gain 98 208 -116.31 gain 208 98 -117.46 gain 98 209 -109.01 gain 209 98 -106.17 gain 98 210 -109.52 gain 210 98 -113.26 gain 98 211 -118.38 gain 211 98 -118.38 gain 98 212 -111.58 gain 212 98 -109.13 gain 98 213 -113.32 gain 213 98 -115.73 gain 98 214 -110.52 gain 214 98 -109.24 gain 98 215 -108.13 gain 215 98 -107.94 gain 98 216 -109.22 gain 216 98 -109.85 gain 98 217 -115.18 gain 217 98 -119.63 gain 98 218 -108.16 gain 218 98 -104.81 gain 98 219 -115.67 gain 219 98 -115.13 gain 98 220 -110.10 gain 220 98 -105.92 gain 98 221 -110.76 gain 221 98 -111.08 gain 98 222 -117.30 gain 222 98 -118.99 gain 98 223 -122.02 gain 223 98 -125.71 gain 98 224 -114.73 gain 224 98 -118.93 gain 99 100 -82.82 gain 100 99 -84.53 gain 99 101 -99.78 gain 101 99 -97.42 gain 99 102 -100.24 gain 102 99 -98.00 gain 99 103 -107.89 gain 103 99 -105.49 gain 99 104 -108.12 gain 104 99 -101.54 gain 99 105 -118.35 gain 105 99 -117.09 gain 99 106 -118.77 gain 106 99 -116.23 gain 99 107 -115.13 gain 107 99 -112.90 gain 99 108 -109.88 gain 108 99 -107.30 gain 99 109 -110.17 gain 109 99 -109.44 gain 99 110 -103.05 gain 110 99 -99.39 gain 99 111 -94.05 gain 111 99 -93.06 gain 99 112 -93.94 gain 112 99 -92.69 gain 99 113 -93.21 gain 113 99 -93.66 gain 99 114 -84.94 gain 114 99 -82.30 gain 99 115 -92.72 gain 115 99 -85.00 gain 99 116 -102.34 gain 116 99 -100.36 gain 99 117 -101.35 gain 117 99 -102.17 gain 99 118 -104.94 gain 118 99 -103.13 gain 99 119 -109.30 gain 119 99 -106.97 gain 99 120 -114.40 gain 120 99 -107.62 gain 99 121 -116.32 gain 121 99 -112.31 gain 99 122 -105.74 gain 122 99 -104.24 gain 99 123 -116.11 gain 123 99 -112.12 gain 99 124 -107.76 gain 124 99 -103.77 gain 99 125 -108.93 gain 125 99 -106.54 gain 99 126 -103.69 gain 126 99 -97.62 gain 99 127 -102.95 gain 127 99 -98.45 gain 99 128 -95.85 gain 128 99 -93.22 gain 99 129 -99.35 gain 129 99 -94.12 gain 99 130 -89.43 gain 130 99 -86.89 gain 99 131 -100.91 gain 131 99 -96.23 gain 99 132 -107.48 gain 132 99 -105.43 gain 99 133 -114.39 gain 133 99 -110.44 gain 99 134 -108.33 gain 134 99 -104.18 gain 99 135 -121.58 gain 135 99 -119.14 gain 99 136 -120.63 gain 136 99 -119.48 gain 99 137 -109.88 gain 137 99 -106.51 gain 99 138 -115.68 gain 138 99 -108.54 gain 99 139 -111.44 gain 139 99 -106.20 gain 99 140 -105.18 gain 140 99 -105.99 gain 99 141 -101.79 gain 141 99 -97.50 gain 99 142 -102.14 gain 142 99 -102.66 gain 99 143 -103.57 gain 143 99 -99.63 gain 99 144 -98.39 gain 144 99 -95.35 gain 99 145 -106.22 gain 145 99 -102.78 gain 99 146 -102.60 gain 146 99 -96.71 gain 99 147 -100.33 gain 147 99 -98.30 gain 99 148 -103.77 gain 148 99 -100.66 gain 99 149 -106.21 gain 149 99 -102.35 gain 99 150 -114.19 gain 150 99 -115.45 gain 99 151 -105.98 gain 151 99 -100.80 gain 99 152 -116.41 gain 152 99 -113.06 gain 99 153 -117.15 gain 153 99 -116.22 gain 99 154 -112.67 gain 154 99 -107.36 gain 99 155 -109.69 gain 155 99 -108.21 gain 99 156 -118.09 gain 156 99 -114.62 gain 99 157 -107.97 gain 157 99 -106.46 gain 99 158 -108.83 gain 158 99 -107.75 gain 99 159 -100.94 gain 159 99 -93.50 gain 99 160 -104.96 gain 160 99 -99.80 gain 99 161 -100.76 gain 161 99 -98.46 gain 99 162 -110.49 gain 162 99 -105.27 gain 99 163 -117.23 gain 163 99 -109.20 gain 99 164 -111.96 gain 164 99 -105.67 gain 99 165 -114.77 gain 165 99 -111.41 gain 99 166 -116.09 gain 166 99 -115.41 gain 99 167 -116.79 gain 167 99 -115.23 gain 99 168 -119.03 gain 168 99 -118.81 gain 99 169 -116.48 gain 169 99 -108.61 gain 99 170 -115.08 gain 170 99 -117.70 gain 99 171 -110.18 gain 171 99 -109.23 gain 99 172 -114.21 gain 172 99 -106.37 gain 99 173 -103.48 gain 173 99 -100.29 gain 99 174 -106.01 gain 174 99 -102.58 gain 99 175 -108.12 gain 175 99 -103.89 gain 99 176 -119.00 gain 176 99 -114.74 gain 99 177 -109.20 gain 177 99 -106.43 gain 99 178 -115.28 gain 178 99 -113.46 gain 99 179 -114.26 gain 179 99 -113.46 gain 99 180 -120.25 gain 180 99 -115.25 gain 99 181 -120.13 gain 181 99 -119.57 gain 99 182 -116.34 gain 182 99 -112.08 gain 99 183 -116.92 gain 183 99 -113.96 gain 99 184 -114.28 gain 184 99 -113.38 gain 99 185 -108.75 gain 185 99 -103.27 gain 99 186 -110.32 gain 186 99 -103.83 gain 99 187 -103.34 gain 187 99 -100.95 gain 99 188 -108.89 gain 188 99 -109.26 gain 99 189 -115.67 gain 189 99 -115.43 gain 99 190 -107.61 gain 190 99 -103.04 gain 99 191 -112.78 gain 191 99 -111.24 gain 99 192 -120.75 gain 192 99 -116.54 gain 99 193 -112.69 gain 193 99 -112.45 gain 99 194 -121.17 gain 194 99 -120.49 gain 99 195 -116.40 gain 195 99 -113.92 gain 99 196 -120.77 gain 196 99 -117.31 gain 99 197 -123.88 gain 197 99 -123.09 gain 99 198 -119.49 gain 198 99 -122.63 gain 99 199 -111.93 gain 199 99 -106.65 gain 99 200 -112.75 gain 200 99 -104.23 gain 99 201 -115.89 gain 201 99 -111.19 gain 99 202 -117.07 gain 202 99 -113.90 gain 99 203 -116.25 gain 203 99 -109.71 gain 99 204 -112.99 gain 204 99 -113.53 gain 99 205 -121.13 gain 205 99 -119.74 gain 99 206 -117.38 gain 206 99 -113.96 gain 99 207 -109.02 gain 207 99 -106.36 gain 99 208 -112.52 gain 208 99 -110.04 gain 99 209 -111.17 gain 209 99 -104.69 gain 99 210 -123.26 gain 210 99 -123.37 gain 99 211 -121.99 gain 211 99 -118.35 gain 99 212 -123.59 gain 212 99 -117.50 gain 99 213 -116.65 gain 213 99 -115.43 gain 99 214 -116.07 gain 214 99 -111.15 gain 99 215 -115.67 gain 215 99 -111.84 gain 99 216 -119.71 gain 216 99 -116.70 gain 99 217 -118.88 gain 217 99 -119.69 gain 99 218 -123.69 gain 218 99 -116.70 gain 99 219 -120.70 gain 219 99 -116.53 gain 99 220 -113.03 gain 220 99 -105.21 gain 99 221 -114.43 gain 221 99 -111.11 gain 99 222 -112.43 gain 222 99 -110.47 gain 99 223 -117.31 gain 223 99 -117.37 gain 99 224 -119.09 gain 224 99 -119.65 gain 100 101 -99.46 gain 101 100 -95.39 gain 100 102 -101.68 gain 102 100 -97.74 gain 100 103 -108.48 gain 103 100 -104.37 gain 100 104 -107.43 gain 104 100 -99.15 gain 100 105 -113.99 gain 105 100 -111.03 gain 100 106 -118.15 gain 106 100 -113.91 gain 100 107 -121.11 gain 107 100 -117.16 gain 100 108 -118.98 gain 108 100 -114.69 gain 100 109 -102.60 gain 109 100 -100.17 gain 100 110 -107.63 gain 110 100 -102.27 gain 100 111 -110.97 gain 111 100 -108.26 gain 100 112 -113.88 gain 112 100 -110.92 gain 100 113 -91.00 gain 113 100 -89.74 gain 100 114 -100.75 gain 114 100 -96.39 gain 100 115 -82.59 gain 115 100 -73.16 gain 100 116 -93.20 gain 116 100 -89.51 gain 100 117 -100.75 gain 117 100 -99.86 gain 100 118 -104.28 gain 118 100 -100.77 gain 100 119 -109.07 gain 119 100 -105.03 gain 100 120 -125.37 gain 120 100 -116.87 gain 100 121 -114.70 gain 121 100 -108.98 gain 100 122 -117.64 gain 122 100 -114.43 gain 100 123 -118.67 gain 123 100 -112.98 gain 100 124 -113.75 gain 124 100 -108.04 gain 100 125 -117.15 gain 125 100 -113.05 gain 100 126 -112.93 gain 126 100 -105.15 gain 100 127 -108.53 gain 127 100 -102.33 gain 100 128 -103.09 gain 128 100 -98.75 gain 100 129 -97.49 gain 129 100 -90.56 gain 100 130 -99.89 gain 130 100 -95.64 gain 100 131 -100.93 gain 131 100 -94.54 gain 100 132 -106.27 gain 132 100 -102.51 gain 100 133 -105.76 gain 133 100 -100.10 gain 100 134 -111.97 gain 134 100 -106.10 gain 100 135 -117.12 gain 135 100 -112.97 gain 100 136 -128.96 gain 136 100 -126.10 gain 100 137 -118.11 gain 137 100 -113.03 gain 100 138 -117.26 gain 138 100 -108.41 gain 100 139 -112.86 gain 139 100 -105.91 gain 100 140 -117.09 gain 140 100 -116.20 gain 100 141 -106.42 gain 141 100 -100.42 gain 100 142 -116.34 gain 142 100 -115.14 gain 100 143 -107.00 gain 143 100 -101.35 gain 100 144 -106.09 gain 144 100 -101.35 gain 100 145 -101.35 gain 145 100 -96.20 gain 100 146 -108.08 gain 146 100 -100.48 gain 100 147 -106.13 gain 147 100 -102.39 gain 100 148 -109.92 gain 148 100 -105.10 gain 100 149 -112.89 gain 149 100 -107.32 gain 100 150 -122.37 gain 150 100 -121.92 gain 100 151 -113.47 gain 151 100 -106.58 gain 100 152 -120.41 gain 152 100 -115.34 gain 100 153 -119.50 gain 153 100 -116.86 gain 100 154 -124.25 gain 154 100 -117.23 gain 100 155 -109.91 gain 155 100 -106.71 gain 100 156 -109.34 gain 156 100 -104.16 gain 100 157 -112.98 gain 157 100 -109.76 gain 100 158 -109.53 gain 158 100 -106.75 gain 100 159 -106.04 gain 159 100 -96.90 gain 100 160 -113.02 gain 160 100 -106.15 gain 100 161 -109.02 gain 161 100 -105.01 gain 100 162 -101.43 gain 162 100 -94.50 gain 100 163 -115.99 gain 163 100 -106.24 gain 100 164 -118.29 gain 164 100 -110.29 gain 100 165 -127.15 gain 165 100 -122.08 gain 100 166 -123.44 gain 166 100 -121.05 gain 100 167 -120.15 gain 167 100 -116.88 gain 100 168 -121.97 gain 168 100 -120.04 gain 100 169 -117.58 gain 169 100 -108.00 gain 100 170 -124.39 gain 170 100 -125.31 gain 100 171 -116.80 gain 171 100 -114.15 gain 100 172 -110.30 gain 172 100 -100.74 gain 100 173 -111.65 gain 173 100 -106.75 gain 100 174 -111.32 gain 174 100 -106.18 gain 100 175 -111.44 gain 175 100 -105.50 gain 100 176 -113.32 gain 176 100 -107.34 gain 100 177 -111.68 gain 177 100 -107.19 gain 100 178 -109.96 gain 178 100 -106.42 gain 100 179 -112.04 gain 179 100 -109.53 gain 100 180 -124.86 gain 180 100 -118.15 gain 100 181 -132.58 gain 181 100 -130.32 gain 100 182 -119.28 gain 182 100 -113.31 gain 100 183 -122.06 gain 183 100 -117.40 gain 100 184 -121.58 gain 184 100 -118.97 gain 100 185 -119.70 gain 185 100 -112.51 gain 100 186 -118.56 gain 186 100 -110.37 gain 100 187 -118.60 gain 187 100 -114.49 gain 100 188 -120.14 gain 188 100 -118.79 gain 100 189 -114.17 gain 189 100 -112.22 gain 100 190 -117.00 gain 190 100 -110.72 gain 100 191 -104.85 gain 191 100 -101.61 gain 100 192 -113.63 gain 192 100 -107.70 gain 100 193 -118.54 gain 193 100 -116.59 gain 100 194 -117.26 gain 194 100 -114.87 gain 100 195 -123.72 gain 195 100 -119.53 gain 100 196 -122.09 gain 196 100 -116.92 gain 100 197 -113.93 gain 197 100 -111.44 gain 100 198 -114.22 gain 198 100 -115.65 gain 100 199 -121.30 gain 199 100 -114.31 gain 100 200 -115.68 gain 200 100 -105.45 gain 100 201 -112.39 gain 201 100 -105.98 gain 100 202 -112.31 gain 202 100 -107.43 gain 100 203 -112.15 gain 203 100 -103.90 gain 100 204 -112.80 gain 204 100 -111.63 gain 100 205 -119.89 gain 205 100 -116.79 gain 100 206 -111.83 gain 206 100 -106.70 gain 100 207 -119.83 gain 207 100 -115.46 gain 100 208 -111.81 gain 208 100 -107.62 gain 100 209 -116.98 gain 209 100 -108.79 gain 100 210 -123.23 gain 210 100 -121.63 gain 100 211 -124.50 gain 211 100 -119.16 gain 100 212 -120.31 gain 212 100 -112.51 gain 100 213 -122.58 gain 213 100 -119.65 gain 100 214 -120.23 gain 214 100 -113.60 gain 100 215 -116.60 gain 215 100 -111.06 gain 100 216 -116.89 gain 216 100 -112.18 gain 100 217 -111.62 gain 217 100 -110.73 gain 100 218 -117.33 gain 218 100 -108.62 gain 100 219 -115.38 gain 219 100 -109.49 gain 100 220 -116.84 gain 220 100 -107.31 gain 100 221 -123.18 gain 221 100 -118.15 gain 100 222 -113.85 gain 222 100 -110.19 gain 100 223 -119.25 gain 223 100 -117.59 gain 100 224 -121.08 gain 224 100 -119.93 gain 101 102 -80.25 gain 102 101 -80.37 gain 101 103 -93.50 gain 103 101 -93.46 gain 101 104 -97.90 gain 104 101 -93.69 gain 101 105 -116.91 gain 105 101 -118.02 gain 101 106 -122.34 gain 106 101 -122.17 gain 101 107 -109.66 gain 107 101 -109.79 gain 101 108 -111.98 gain 108 101 -111.76 gain 101 109 -108.36 gain 109 101 -109.99 gain 101 110 -106.81 gain 110 101 -105.52 gain 101 111 -109.63 gain 111 101 -111.00 gain 101 112 -107.06 gain 112 101 -108.18 gain 101 113 -100.91 gain 113 101 -103.72 gain 101 114 -95.98 gain 114 101 -95.70 gain 101 115 -91.50 gain 115 101 -86.14 gain 101 116 -84.67 gain 116 101 -85.05 gain 101 117 -89.99 gain 117 101 -93.17 gain 101 118 -102.13 gain 118 101 -102.69 gain 101 119 -101.44 gain 119 101 -101.47 gain 101 120 -116.63 gain 120 101 -112.21 gain 101 121 -110.06 gain 121 101 -108.42 gain 101 122 -117.56 gain 122 101 -118.42 gain 101 123 -113.92 gain 123 101 -112.29 gain 101 124 -104.80 gain 124 101 -103.17 gain 101 125 -107.40 gain 125 101 -107.38 gain 101 126 -112.23 gain 126 101 -108.52 gain 101 127 -105.05 gain 127 101 -102.92 gain 101 128 -98.83 gain 128 101 -98.56 gain 101 129 -99.94 gain 129 101 -97.08 gain 101 130 -92.65 gain 130 101 -92.47 gain 101 131 -101.04 gain 131 101 -98.73 gain 101 132 -93.84 gain 132 101 -94.15 gain 101 133 -104.40 gain 133 101 -102.81 gain 101 134 -104.70 gain 134 101 -102.91 gain 101 135 -122.08 gain 135 101 -121.99 gain 101 136 -120.66 gain 136 101 -121.87 gain 101 137 -112.22 gain 137 101 -111.21 gain 101 138 -121.73 gain 138 101 -116.95 gain 101 139 -106.25 gain 139 101 -103.37 gain 101 140 -107.64 gain 140 101 -110.82 gain 101 141 -106.55 gain 141 101 -104.62 gain 101 142 -107.98 gain 142 101 -110.86 gain 101 143 -106.22 gain 143 101 -104.64 gain 101 144 -101.37 gain 144 101 -100.70 gain 101 145 -99.82 gain 145 101 -98.74 gain 101 146 -106.28 gain 146 101 -102.75 gain 101 147 -104.97 gain 147 101 -105.29 gain 101 148 -98.29 gain 148 101 -97.54 gain 101 149 -106.92 gain 149 101 -105.42 gain 101 150 -122.04 gain 150 101 -125.66 gain 101 151 -115.73 gain 151 101 -112.91 gain 101 152 -114.83 gain 152 101 -113.84 gain 101 153 -126.61 gain 153 101 -128.05 gain 101 154 -116.45 gain 154 101 -113.50 gain 101 155 -111.03 gain 155 101 -111.91 gain 101 156 -111.43 gain 156 101 -110.33 gain 101 157 -104.64 gain 157 101 -105.50 gain 101 158 -114.42 gain 158 101 -115.71 gain 101 159 -101.03 gain 159 101 -95.96 gain 101 160 -105.67 gain 160 101 -102.87 gain 101 161 -98.17 gain 161 101 -98.23 gain 101 162 -108.69 gain 162 101 -105.83 gain 101 163 -113.02 gain 163 101 -107.35 gain 101 164 -108.73 gain 164 101 -104.80 gain 101 165 -110.14 gain 165 101 -109.14 gain 101 166 -118.47 gain 166 101 -120.15 gain 101 167 -113.03 gain 167 101 -113.83 gain 101 168 -104.43 gain 168 101 -106.58 gain 101 169 -112.33 gain 169 101 -106.83 gain 101 170 -116.62 gain 170 101 -121.61 gain 101 171 -117.92 gain 171 101 -119.33 gain 101 172 -111.72 gain 172 101 -106.23 gain 101 173 -116.64 gain 173 101 -115.81 gain 101 174 -101.16 gain 174 101 -100.09 gain 101 175 -100.56 gain 175 101 -98.70 gain 101 176 -111.84 gain 176 101 -109.93 gain 101 177 -103.53 gain 177 101 -103.11 gain 101 178 -106.15 gain 178 101 -106.68 gain 101 179 -109.73 gain 179 101 -111.29 gain 101 180 -121.30 gain 180 101 -118.66 gain 101 181 -122.40 gain 181 101 -124.20 gain 101 182 -119.38 gain 182 101 -117.49 gain 101 183 -108.69 gain 183 101 -108.10 gain 101 184 -119.31 gain 184 101 -120.76 gain 101 185 -115.71 gain 185 101 -112.59 gain 101 186 -111.61 gain 186 101 -107.49 gain 101 187 -113.63 gain 187 101 -113.60 gain 101 188 -114.68 gain 188 101 -117.41 gain 101 189 -115.79 gain 189 101 -117.92 gain 101 190 -111.24 gain 190 101 -109.03 gain 101 191 -108.68 gain 191 101 -109.50 gain 101 192 -107.31 gain 192 101 -105.46 gain 101 193 -104.64 gain 193 101 -106.75 gain 101 194 -105.94 gain 194 101 -107.63 gain 101 195 -125.32 gain 195 101 -125.20 gain 101 196 -111.91 gain 196 101 -110.81 gain 101 197 -125.34 gain 197 101 -126.91 gain 101 198 -124.00 gain 198 101 -129.51 gain 101 199 -115.12 gain 199 101 -112.19 gain 101 200 -110.15 gain 200 101 -104.00 gain 101 201 -112.01 gain 201 101 -109.67 gain 101 202 -110.31 gain 202 101 -109.50 gain 101 203 -105.20 gain 203 101 -101.02 gain 101 204 -108.72 gain 204 101 -111.62 gain 101 205 -109.56 gain 205 101 -110.52 gain 101 206 -108.79 gain 206 101 -107.73 gain 101 207 -114.92 gain 207 101 -114.63 gain 101 208 -106.53 gain 208 101 -106.41 gain 101 209 -111.03 gain 209 101 -106.91 gain 101 210 -124.46 gain 210 101 -126.93 gain 101 211 -124.66 gain 211 101 -123.38 gain 101 212 -125.51 gain 212 101 -121.79 gain 101 213 -109.97 gain 213 101 -111.11 gain 101 214 -116.08 gain 214 101 -113.52 gain 101 215 -114.89 gain 215 101 -113.42 gain 101 216 -116.60 gain 216 101 -115.96 gain 101 217 -123.74 gain 217 101 -126.92 gain 101 218 -108.42 gain 218 101 -103.79 gain 101 219 -114.74 gain 219 101 -112.92 gain 101 220 -113.67 gain 220 101 -108.21 gain 101 221 -111.24 gain 221 101 -110.28 gain 101 222 -122.90 gain 222 101 -123.31 gain 101 223 -116.11 gain 223 101 -118.53 gain 101 224 -118.69 gain 224 101 -121.61 gain 102 103 -90.56 gain 103 102 -90.39 gain 102 104 -93.54 gain 104 102 -89.20 gain 102 105 -115.03 gain 105 102 -116.01 gain 102 106 -115.95 gain 106 102 -115.65 gain 102 107 -114.63 gain 107 102 -114.63 gain 102 108 -114.97 gain 108 102 -114.63 gain 102 109 -109.22 gain 109 102 -110.73 gain 102 110 -106.69 gain 110 102 -105.27 gain 102 111 -104.86 gain 111 102 -106.10 gain 102 112 -98.98 gain 112 102 -99.97 gain 102 113 -101.02 gain 113 102 -103.71 gain 102 114 -99.29 gain 114 102 -98.88 gain 102 115 -93.39 gain 115 102 -87.90 gain 102 116 -91.57 gain 116 102 -91.83 gain 102 117 -88.57 gain 117 102 -91.62 gain 102 118 -92.72 gain 118 102 -93.15 gain 102 119 -102.43 gain 119 102 -102.34 gain 102 120 -123.10 gain 120 102 -118.55 gain 102 121 -119.49 gain 121 102 -117.72 gain 102 122 -108.81 gain 122 102 -109.54 gain 102 123 -113.82 gain 123 102 -112.07 gain 102 124 -115.02 gain 124 102 -113.27 gain 102 125 -118.46 gain 125 102 -118.30 gain 102 126 -110.23 gain 126 102 -106.40 gain 102 127 -108.91 gain 127 102 -106.65 gain 102 128 -103.84 gain 128 102 -103.44 gain 102 129 -107.01 gain 129 102 -104.03 gain 102 130 -103.28 gain 130 102 -102.98 gain 102 131 -93.84 gain 131 102 -91.39 gain 102 132 -96.26 gain 132 102 -96.44 gain 102 133 -98.90 gain 133 102 -97.18 gain 102 134 -105.01 gain 134 102 -103.10 gain 102 135 -120.79 gain 135 102 -120.58 gain 102 136 -117.13 gain 136 102 -118.21 gain 102 137 -112.78 gain 137 102 -111.64 gain 102 138 -112.45 gain 138 102 -107.54 gain 102 139 -121.82 gain 139 102 -118.82 gain 102 140 -113.51 gain 140 102 -116.56 gain 102 141 -110.84 gain 141 102 -108.77 gain 102 142 -105.48 gain 142 102 -108.23 gain 102 143 -106.73 gain 143 102 -105.03 gain 102 144 -107.48 gain 144 102 -106.67 gain 102 145 -97.88 gain 145 102 -96.67 gain 102 146 -98.48 gain 146 102 -94.83 gain 102 147 -107.53 gain 147 102 -107.72 gain 102 148 -106.25 gain 148 102 -105.38 gain 102 149 -101.92 gain 149 102 -100.29 gain 102 150 -119.26 gain 150 102 -122.75 gain 102 151 -121.57 gain 151 102 -118.62 gain 102 152 -111.33 gain 152 102 -110.20 gain 102 153 -115.45 gain 153 102 -116.75 gain 102 154 -107.45 gain 154 102 -104.37 gain 102 155 -114.32 gain 155 102 -115.07 gain 102 156 -108.61 gain 156 102 -107.38 gain 102 157 -110.75 gain 157 102 -111.48 gain 102 158 -105.46 gain 158 102 -106.62 gain 102 159 -105.15 gain 159 102 -99.95 gain 102 160 -109.21 gain 160 102 -106.28 gain 102 161 -106.55 gain 161 102 -106.48 gain 102 162 -104.02 gain 162 102 -101.03 gain 102 163 -106.09 gain 163 102 -100.29 gain 102 164 -101.81 gain 164 102 -97.75 gain 102 165 -114.88 gain 165 102 -113.76 gain 102 166 -119.10 gain 166 102 -120.65 gain 102 167 -118.96 gain 167 102 -119.64 gain 102 168 -112.99 gain 168 102 -115.01 gain 102 169 -111.81 gain 169 102 -106.18 gain 102 170 -123.60 gain 170 102 -128.46 gain 102 171 -114.80 gain 171 102 -116.09 gain 102 172 -104.47 gain 172 102 -98.86 gain 102 173 -111.66 gain 173 102 -110.70 gain 102 174 -110.19 gain 174 102 -109.00 gain 102 175 -111.38 gain 175 102 -109.39 gain 102 176 -105.99 gain 176 102 -103.96 gain 102 177 -109.99 gain 177 102 -109.44 gain 102 178 -103.99 gain 178 102 -104.40 gain 102 179 -104.67 gain 179 102 -106.11 gain 102 180 -120.94 gain 180 102 -118.17 gain 102 181 -119.52 gain 181 102 -121.20 gain 102 182 -120.07 gain 182 102 -118.04 gain 102 183 -114.18 gain 183 102 -113.45 gain 102 184 -110.95 gain 184 102 -112.28 gain 102 185 -122.65 gain 185 102 -119.41 gain 102 186 -123.07 gain 186 102 -118.82 gain 102 187 -112.62 gain 187 102 -112.46 gain 102 188 -107.15 gain 188 102 -109.75 gain 102 189 -111.15 gain 189 102 -113.15 gain 102 190 -110.35 gain 190 102 -108.01 gain 102 191 -106.23 gain 191 102 -106.92 gain 102 192 -111.98 gain 192 102 -110.00 gain 102 193 -107.94 gain 193 102 -109.93 gain 102 194 -105.48 gain 194 102 -107.04 gain 102 195 -121.61 gain 195 102 -121.36 gain 102 196 -120.57 gain 196 102 -119.35 gain 102 197 -116.02 gain 197 102 -117.46 gain 102 198 -114.25 gain 198 102 -119.63 gain 102 199 -118.05 gain 199 102 -115.00 gain 102 200 -116.70 gain 200 102 -110.42 gain 102 201 -112.09 gain 201 102 -109.63 gain 102 202 -114.73 gain 202 102 -113.79 gain 102 203 -116.68 gain 203 102 -112.37 gain 102 204 -114.59 gain 204 102 -117.36 gain 102 205 -111.17 gain 205 102 -112.01 gain 102 206 -114.96 gain 206 102 -113.77 gain 102 207 -117.24 gain 207 102 -116.82 gain 102 208 -110.29 gain 208 102 -110.04 gain 102 209 -104.73 gain 209 102 -100.48 gain 102 210 -116.74 gain 210 102 -119.08 gain 102 211 -119.86 gain 211 102 -118.46 gain 102 212 -113.21 gain 212 102 -109.35 gain 102 213 -117.22 gain 213 102 -118.24 gain 102 214 -117.18 gain 214 102 -114.49 gain 102 215 -116.34 gain 215 102 -114.74 gain 102 216 -109.55 gain 216 102 -108.78 gain 102 217 -105.76 gain 217 102 -108.80 gain 102 218 -119.02 gain 218 102 -114.26 gain 102 219 -116.70 gain 219 102 -114.75 gain 102 220 -116.66 gain 220 102 -111.07 gain 102 221 -115.74 gain 221 102 -114.65 gain 102 222 -114.08 gain 222 102 -114.36 gain 102 223 -112.46 gain 223 102 -114.75 gain 102 224 -117.45 gain 224 102 -120.24 gain 103 104 -86.19 gain 104 103 -82.02 gain 103 105 -121.14 gain 105 103 -122.29 gain 103 106 -124.16 gain 106 103 -124.03 gain 103 107 -121.02 gain 107 103 -121.19 gain 103 108 -115.95 gain 108 103 -115.78 gain 103 109 -115.03 gain 109 103 -116.71 gain 103 110 -111.25 gain 110 103 -109.99 gain 103 111 -107.92 gain 111 103 -109.33 gain 103 112 -106.06 gain 112 103 -107.21 gain 103 113 -106.95 gain 113 103 -109.80 gain 103 114 -103.66 gain 114 103 -103.42 gain 103 115 -101.61 gain 115 103 -96.28 gain 103 116 -100.68 gain 116 103 -101.10 gain 103 117 -77.24 gain 117 103 -80.46 gain 103 118 -81.89 gain 118 103 -82.49 gain 103 119 -85.27 gain 119 103 -85.34 gain 103 120 -118.62 gain 120 103 -114.24 gain 103 121 -118.35 gain 121 103 -116.74 gain 103 122 -115.10 gain 122 103 -116.00 gain 103 123 -115.72 gain 123 103 -114.14 gain 103 124 -109.18 gain 124 103 -107.58 gain 103 125 -113.55 gain 125 103 -113.56 gain 103 126 -113.88 gain 126 103 -110.21 gain 103 127 -109.29 gain 127 103 -107.20 gain 103 128 -104.90 gain 128 103 -104.67 gain 103 129 -107.23 gain 129 103 -104.40 gain 103 130 -106.81 gain 130 103 -106.67 gain 103 131 -98.75 gain 131 103 -96.47 gain 103 132 -95.10 gain 132 103 -95.44 gain 103 133 -95.52 gain 133 103 -93.97 gain 103 134 -92.69 gain 134 103 -90.94 gain 103 135 -118.57 gain 135 103 -118.53 gain 103 136 -121.19 gain 136 103 -122.43 gain 103 137 -125.03 gain 137 103 -124.06 gain 103 138 -115.70 gain 138 103 -110.96 gain 103 139 -113.11 gain 139 103 -110.27 gain 103 140 -111.89 gain 140 103 -115.10 gain 103 141 -105.68 gain 141 103 -103.78 gain 103 142 -110.36 gain 142 103 -113.27 gain 103 143 -108.75 gain 143 103 -107.21 gain 103 144 -107.77 gain 144 103 -107.14 gain 103 145 -103.36 gain 145 103 -102.32 gain 103 146 -102.01 gain 146 103 -98.52 gain 103 147 -104.59 gain 147 103 -104.95 gain 103 148 -95.12 gain 148 103 -94.41 gain 103 149 -99.58 gain 149 103 -98.12 gain 103 150 -121.53 gain 150 103 -125.19 gain 103 151 -116.28 gain 151 103 -113.50 gain 103 152 -111.83 gain 152 103 -110.87 gain 103 153 -118.41 gain 153 103 -119.88 gain 103 154 -111.60 gain 154 103 -108.68 gain 103 155 -112.54 gain 155 103 -113.45 gain 103 156 -109.50 gain 156 103 -108.43 gain 103 157 -114.86 gain 157 103 -115.75 gain 103 158 -115.51 gain 158 103 -116.84 gain 103 159 -105.77 gain 159 103 -100.74 gain 103 160 -108.09 gain 160 103 -105.32 gain 103 161 -107.89 gain 161 103 -107.99 gain 103 162 -109.72 gain 162 103 -106.90 gain 103 163 -101.81 gain 163 103 -96.18 gain 103 164 -104.30 gain 164 103 -100.41 gain 103 165 -130.75 gain 165 103 -129.79 gain 103 166 -119.56 gain 166 103 -121.27 gain 103 167 -114.74 gain 167 103 -115.58 gain 103 168 -111.29 gain 168 103 -113.47 gain 103 169 -120.34 gain 169 103 -114.87 gain 103 170 -117.13 gain 170 103 -122.15 gain 103 171 -115.86 gain 171 103 -117.32 gain 103 172 -110.32 gain 172 103 -104.87 gain 103 173 -109.07 gain 173 103 -108.28 gain 103 174 -111.91 gain 174 103 -110.89 gain 103 175 -108.53 gain 175 103 -106.70 gain 103 176 -107.32 gain 176 103 -105.45 gain 103 177 -107.88 gain 177 103 -107.50 gain 103 178 -107.34 gain 178 103 -107.91 gain 103 179 -106.67 gain 179 103 -108.27 gain 103 180 -117.79 gain 180 103 -115.19 gain 103 181 -122.78 gain 181 103 -124.62 gain 103 182 -115.28 gain 182 103 -113.43 gain 103 183 -121.75 gain 183 103 -121.19 gain 103 184 -118.18 gain 184 103 -119.68 gain 103 185 -112.31 gain 185 103 -109.23 gain 103 186 -113.85 gain 186 103 -109.77 gain 103 187 -115.25 gain 187 103 -115.25 gain 103 188 -114.08 gain 188 103 -116.85 gain 103 189 -114.79 gain 189 103 -116.95 gain 103 190 -107.67 gain 190 103 -105.50 gain 103 191 -108.80 gain 191 103 -109.66 gain 103 192 -111.97 gain 192 103 -110.15 gain 103 193 -112.42 gain 193 103 -114.58 gain 103 194 -107.50 gain 194 103 -109.23 gain 103 195 -121.02 gain 195 103 -120.94 gain 103 196 -123.43 gain 196 103 -122.37 gain 103 197 -120.12 gain 197 103 -121.74 gain 103 198 -116.57 gain 198 103 -122.12 gain 103 199 -119.03 gain 199 103 -116.14 gain 103 200 -112.79 gain 200 103 -106.68 gain 103 201 -116.93 gain 201 103 -114.63 gain 103 202 -116.00 gain 202 103 -115.23 gain 103 203 -108.73 gain 203 103 -104.59 gain 103 204 -112.51 gain 204 103 -115.45 gain 103 205 -105.29 gain 205 103 -106.30 gain 103 206 -109.68 gain 206 103 -108.66 gain 103 207 -106.58 gain 207 103 -106.33 gain 103 208 -112.61 gain 208 103 -112.53 gain 103 209 -111.22 gain 209 103 -107.14 gain 103 210 -126.60 gain 210 103 -129.10 gain 103 211 -124.38 gain 211 103 -123.15 gain 103 212 -116.99 gain 212 103 -113.30 gain 103 213 -123.52 gain 213 103 -124.69 gain 103 214 -124.57 gain 214 103 -122.05 gain 103 215 -115.82 gain 215 103 -114.39 gain 103 216 -116.56 gain 216 103 -115.95 gain 103 217 -121.18 gain 217 103 -124.39 gain 103 218 -111.59 gain 218 103 -106.99 gain 103 219 -114.96 gain 219 103 -113.18 gain 103 220 -121.26 gain 220 103 -115.84 gain 103 221 -110.74 gain 221 103 -109.82 gain 103 222 -113.36 gain 222 103 -113.81 gain 103 223 -113.07 gain 223 103 -115.52 gain 103 224 -116.23 gain 224 103 -119.18 gain 104 105 -109.59 gain 105 104 -114.91 gain 104 106 -120.10 gain 106 104 -124.14 gain 104 107 -112.99 gain 107 104 -117.33 gain 104 108 -116.30 gain 108 104 -120.30 gain 104 109 -111.05 gain 109 104 -116.90 gain 104 110 -115.84 gain 110 104 -118.76 gain 104 111 -105.61 gain 111 104 -111.19 gain 104 112 -114.11 gain 112 104 -119.43 gain 104 113 -105.60 gain 113 104 -112.62 gain 104 114 -98.06 gain 114 104 -101.99 gain 104 115 -96.61 gain 115 104 -95.47 gain 104 116 -89.48 gain 116 104 -94.07 gain 104 117 -94.74 gain 117 104 -102.13 gain 104 118 -86.37 gain 118 104 -91.14 gain 104 119 -80.18 gain 119 104 -84.43 gain 104 120 -113.79 gain 120 104 -113.58 gain 104 121 -112.92 gain 121 104 -115.48 gain 104 122 -116.35 gain 122 104 -121.42 gain 104 123 -111.27 gain 123 104 -113.86 gain 104 124 -107.53 gain 124 104 -110.11 gain 104 125 -110.06 gain 125 104 -114.25 gain 104 126 -112.48 gain 126 104 -112.99 gain 104 127 -103.80 gain 127 104 -105.87 gain 104 128 -100.31 gain 128 104 -104.26 gain 104 129 -94.79 gain 129 104 -96.14 gain 104 130 -110.37 gain 130 104 -114.41 gain 104 131 -101.41 gain 131 104 -103.31 gain 104 132 -93.10 gain 132 104 -97.62 gain 104 133 -97.28 gain 133 104 -99.91 gain 104 134 -83.77 gain 134 104 -86.19 gain 104 135 -110.14 gain 135 104 -114.27 gain 104 136 -115.45 gain 136 104 -120.88 gain 104 137 -122.36 gain 137 104 -125.56 gain 104 138 -113.26 gain 138 104 -112.69 gain 104 139 -111.20 gain 139 104 -112.54 gain 104 140 -106.56 gain 140 104 -113.95 gain 104 141 -113.12 gain 141 104 -115.40 gain 104 142 -111.59 gain 142 104 -118.68 gain 104 143 -107.58 gain 143 104 -110.21 gain 104 144 -109.53 gain 144 104 -113.06 gain 104 145 -100.32 gain 145 104 -103.45 gain 104 146 -97.91 gain 146 104 -98.60 gain 104 147 -92.60 gain 147 104 -97.13 gain 104 148 -98.01 gain 148 104 -101.48 gain 104 149 -91.45 gain 149 104 -94.17 gain 104 150 -114.05 gain 150 104 -121.88 gain 104 151 -117.80 gain 151 104 -119.19 gain 104 152 -114.37 gain 152 104 -117.59 gain 104 153 -104.87 gain 153 104 -110.52 gain 104 154 -111.52 gain 154 104 -112.79 gain 104 155 -111.04 gain 155 104 -116.13 gain 104 156 -109.97 gain 156 104 -113.07 gain 104 157 -105.43 gain 157 104 -110.50 gain 104 158 -102.06 gain 158 104 -107.56 gain 104 159 -104.74 gain 159 104 -103.88 gain 104 160 -105.46 gain 160 104 -106.88 gain 104 161 -97.22 gain 161 104 -101.49 gain 104 162 -91.86 gain 162 104 -93.21 gain 104 163 -100.14 gain 163 104 -98.68 gain 104 164 -104.32 gain 164 104 -104.60 gain 104 165 -114.28 gain 165 104 -117.49 gain 104 166 -120.22 gain 166 104 -126.12 gain 104 167 -108.56 gain 167 104 -113.57 gain 104 168 -122.70 gain 168 104 -129.06 gain 104 169 -113.63 gain 169 104 -112.34 gain 104 170 -109.51 gain 170 104 -118.71 gain 104 171 -109.70 gain 171 104 -115.32 gain 104 172 -103.93 gain 172 104 -102.66 gain 104 173 -104.75 gain 173 104 -108.13 gain 104 174 -103.54 gain 174 104 -106.68 gain 104 175 -103.00 gain 175 104 -105.35 gain 104 176 -100.28 gain 176 104 -102.59 gain 104 177 -104.04 gain 177 104 -107.84 gain 104 178 -104.63 gain 178 104 -109.38 gain 104 179 -100.62 gain 179 104 -106.40 gain 104 180 -116.31 gain 180 104 -117.89 gain 104 181 -114.12 gain 181 104 -120.14 gain 104 182 -116.49 gain 182 104 -118.81 gain 104 183 -112.07 gain 183 104 -115.68 gain 104 184 -112.36 gain 184 104 -118.03 gain 104 185 -113.26 gain 185 104 -114.36 gain 104 186 -112.95 gain 186 104 -113.04 gain 104 187 -114.36 gain 187 104 -118.54 gain 104 188 -103.21 gain 188 104 -110.15 gain 104 189 -104.06 gain 189 104 -110.40 gain 104 190 -100.22 gain 190 104 -102.22 gain 104 191 -112.26 gain 191 104 -117.30 gain 104 192 -104.15 gain 192 104 -106.51 gain 104 193 -107.22 gain 193 104 -113.55 gain 104 194 -111.69 gain 194 104 -117.59 gain 104 195 -113.36 gain 195 104 -117.45 gain 104 196 -115.30 gain 196 104 -118.41 gain 104 197 -117.58 gain 197 104 -123.37 gain 104 198 -111.57 gain 198 104 -121.29 gain 104 199 -111.41 gain 199 104 -112.70 gain 104 200 -114.55 gain 200 104 -112.61 gain 104 201 -120.92 gain 201 104 -122.79 gain 104 202 -114.34 gain 202 104 -117.74 gain 104 203 -106.66 gain 203 104 -106.69 gain 104 204 -103.85 gain 204 104 -110.96 gain 104 205 -103.10 gain 205 104 -108.28 gain 104 206 -107.82 gain 206 104 -110.98 gain 104 207 -113.75 gain 207 104 -117.67 gain 104 208 -104.91 gain 208 104 -109.00 gain 104 209 -106.81 gain 209 104 -106.90 gain 104 210 -120.55 gain 210 104 -127.23 gain 104 211 -117.51 gain 211 104 -120.45 gain 104 212 -115.07 gain 212 104 -115.55 gain 104 213 -121.67 gain 213 104 -127.02 gain 104 214 -111.95 gain 214 104 -113.61 gain 104 215 -114.06 gain 215 104 -116.80 gain 104 216 -113.64 gain 216 104 -117.21 gain 104 217 -110.39 gain 217 104 -117.78 gain 104 218 -105.83 gain 218 104 -105.41 gain 104 219 -105.23 gain 219 104 -107.62 gain 104 220 -113.49 gain 220 104 -112.24 gain 104 221 -107.80 gain 221 104 -111.05 gain 104 222 -109.71 gain 222 104 -114.34 gain 104 223 -99.63 gain 223 104 -106.26 gain 104 224 -106.93 gain 224 104 -114.06 gain 105 106 -89.06 gain 106 105 -87.78 gain 105 107 -96.59 gain 107 105 -95.61 gain 105 108 -103.93 gain 108 105 -102.60 gain 105 109 -108.06 gain 109 105 -108.59 gain 105 110 -111.11 gain 110 105 -108.70 gain 105 111 -108.65 gain 111 105 -108.91 gain 105 112 -109.21 gain 112 105 -109.22 gain 105 113 -111.79 gain 113 105 -113.50 gain 105 114 -114.72 gain 114 105 -113.33 gain 105 115 -118.01 gain 115 105 -111.54 gain 105 116 -128.75 gain 116 105 -128.02 gain 105 117 -118.22 gain 117 105 -120.29 gain 105 118 -124.42 gain 118 105 -123.86 gain 105 119 -117.00 gain 119 105 -115.92 gain 105 120 -84.13 gain 120 105 -78.60 gain 105 121 -87.88 gain 121 105 -85.12 gain 105 122 -93.24 gain 122 105 -92.99 gain 105 123 -103.35 gain 123 105 -100.62 gain 105 124 -101.79 gain 124 105 -99.05 gain 105 125 -110.49 gain 125 105 -109.35 gain 105 126 -108.10 gain 126 105 -103.28 gain 105 127 -107.76 gain 127 105 -104.52 gain 105 128 -120.29 gain 128 105 -118.91 gain 105 129 -107.86 gain 129 105 -103.89 gain 105 130 -112.02 gain 130 105 -110.73 gain 105 131 -119.83 gain 131 105 -116.40 gain 105 132 -122.24 gain 132 105 -121.43 gain 105 133 -120.75 gain 133 105 -118.06 gain 105 134 -123.04 gain 134 105 -120.14 gain 105 135 -98.59 gain 135 105 -97.40 gain 105 136 -94.81 gain 136 105 -94.91 gain 105 137 -99.33 gain 137 105 -97.21 gain 105 138 -110.75 gain 138 105 -104.87 gain 105 139 -105.71 gain 139 105 -101.72 gain 105 140 -107.29 gain 140 105 -109.36 gain 105 141 -109.11 gain 141 105 -106.07 gain 105 142 -119.51 gain 142 105 -121.28 gain 105 143 -110.60 gain 143 105 -107.91 gain 105 144 -108.86 gain 144 105 -107.07 gain 105 145 -121.57 gain 145 105 -119.38 gain 105 146 -116.95 gain 146 105 -112.31 gain 105 147 -122.42 gain 147 105 -121.63 gain 105 148 -119.79 gain 148 105 -117.93 gain 105 149 -119.68 gain 149 105 -117.07 gain 105 150 -109.37 gain 150 105 -111.87 gain 105 151 -101.02 gain 151 105 -97.09 gain 105 152 -107.84 gain 152 105 -105.74 gain 105 153 -105.23 gain 153 105 -105.56 gain 105 154 -110.31 gain 154 105 -106.25 gain 105 155 -107.77 gain 155 105 -107.54 gain 105 156 -118.63 gain 156 105 -116.41 gain 105 157 -109.56 gain 157 105 -109.30 gain 105 158 -112.02 gain 158 105 -112.20 gain 105 159 -113.65 gain 159 105 -107.47 gain 105 160 -110.27 gain 160 105 -106.36 gain 105 161 -121.53 gain 161 105 -120.48 gain 105 162 -116.77 gain 162 105 -112.80 gain 105 163 -121.44 gain 163 105 -114.66 gain 105 164 -120.74 gain 164 105 -115.70 gain 105 165 -105.72 gain 165 105 -103.62 gain 105 166 -107.02 gain 166 105 -107.58 gain 105 167 -102.39 gain 167 105 -102.09 gain 105 168 -108.44 gain 168 105 -109.47 gain 105 169 -108.22 gain 169 105 -101.60 gain 105 170 -110.76 gain 170 105 -114.64 gain 105 171 -115.53 gain 171 105 -115.83 gain 105 172 -111.91 gain 172 105 -105.31 gain 105 173 -117.49 gain 173 105 -115.56 gain 105 174 -114.34 gain 174 105 -112.16 gain 105 175 -121.64 gain 175 105 -118.67 gain 105 176 -119.18 gain 176 105 -116.16 gain 105 177 -126.92 gain 177 105 -125.40 gain 105 178 -117.33 gain 178 105 -116.75 gain 105 179 -124.85 gain 179 105 -125.30 gain 105 180 -106.15 gain 180 105 -102.40 gain 105 181 -109.41 gain 181 105 -110.11 gain 105 182 -107.11 gain 182 105 -104.10 gain 105 183 -110.32 gain 183 105 -108.61 gain 105 184 -105.75 gain 184 105 -106.09 gain 105 185 -118.80 gain 185 105 -114.57 gain 105 186 -112.43 gain 186 105 -107.20 gain 105 187 -113.21 gain 187 105 -112.07 gain 105 188 -111.40 gain 188 105 -113.02 gain 105 189 -117.71 gain 189 105 -118.72 gain 105 190 -120.36 gain 190 105 -117.04 gain 105 191 -113.81 gain 191 105 -113.53 gain 105 192 -111.83 gain 192 105 -108.86 gain 105 193 -123.12 gain 193 105 -124.13 gain 105 194 -118.67 gain 194 105 -119.25 gain 105 195 -107.79 gain 195 105 -106.56 gain 105 196 -116.85 gain 196 105 -114.64 gain 105 197 -114.47 gain 197 105 -114.93 gain 105 198 -121.24 gain 198 105 -125.64 gain 105 199 -107.72 gain 199 105 -103.68 gain 105 200 -116.15 gain 200 105 -108.89 gain 105 201 -109.99 gain 201 105 -106.54 gain 105 202 -111.80 gain 202 105 -109.88 gain 105 203 -116.16 gain 203 105 -110.87 gain 105 204 -112.92 gain 204 105 -114.71 gain 105 205 -122.63 gain 205 105 -122.49 gain 105 206 -122.19 gain 206 105 -120.03 gain 105 207 -121.35 gain 207 105 -119.95 gain 105 208 -120.76 gain 208 105 -119.52 gain 105 209 -120.05 gain 209 105 -114.82 gain 105 210 -116.30 gain 210 105 -117.66 gain 105 211 -111.02 gain 211 105 -108.64 gain 105 212 -105.30 gain 212 105 -100.46 gain 105 213 -114.84 gain 213 105 -114.87 gain 105 214 -115.10 gain 214 105 -111.43 gain 105 215 -109.32 gain 215 105 -106.73 gain 105 216 -118.54 gain 216 105 -116.78 gain 105 217 -114.67 gain 217 105 -116.74 gain 105 218 -122.33 gain 218 105 -116.59 gain 105 219 -116.83 gain 219 105 -113.91 gain 105 220 -106.60 gain 220 105 -100.03 gain 105 221 -119.65 gain 221 105 -117.58 gain 105 222 -117.51 gain 222 105 -116.81 gain 105 223 -125.55 gain 223 105 -126.86 gain 105 224 -121.55 gain 224 105 -123.36 gain 106 107 -82.97 gain 107 106 -83.28 gain 106 108 -98.35 gain 108 106 -98.31 gain 106 109 -93.22 gain 109 106 -95.03 gain 106 110 -94.98 gain 110 106 -93.85 gain 106 111 -99.61 gain 111 106 -101.15 gain 106 112 -104.53 gain 112 106 -105.81 gain 106 113 -113.93 gain 113 106 -116.91 gain 106 114 -110.05 gain 114 106 -109.94 gain 106 115 -109.76 gain 115 106 -104.57 gain 106 116 -114.63 gain 116 106 -115.18 gain 106 117 -120.53 gain 117 106 -123.88 gain 106 118 -116.32 gain 118 106 -117.05 gain 106 119 -114.46 gain 119 106 -114.66 gain 106 120 -91.71 gain 120 106 -87.46 gain 106 121 -84.57 gain 121 106 -83.09 gain 106 122 -93.72 gain 122 106 -94.76 gain 106 123 -91.67 gain 123 106 -90.22 gain 106 124 -102.96 gain 124 106 -101.50 gain 106 125 -106.67 gain 125 106 -106.82 gain 106 126 -111.12 gain 126 106 -107.59 gain 106 127 -114.15 gain 127 106 -112.18 gain 106 128 -108.63 gain 128 106 -108.54 gain 106 129 -115.09 gain 129 106 -112.40 gain 106 130 -113.10 gain 130 106 -113.09 gain 106 131 -114.21 gain 131 106 -112.07 gain 106 132 -120.38 gain 132 106 -120.86 gain 106 133 -119.37 gain 133 106 -117.96 gain 106 134 -117.26 gain 134 106 -115.64 gain 106 135 -92.53 gain 135 106 -92.62 gain 106 136 -97.42 gain 136 106 -98.80 gain 106 137 -89.63 gain 137 106 -88.79 gain 106 138 -101.61 gain 138 106 -97.01 gain 106 139 -100.29 gain 139 106 -97.58 gain 106 140 -100.37 gain 140 106 -103.72 gain 106 141 -106.39 gain 141 106 -104.62 gain 106 142 -108.30 gain 142 106 -111.35 gain 106 143 -111.94 gain 143 106 -110.53 gain 106 144 -106.52 gain 144 106 -106.02 gain 106 145 -108.24 gain 145 106 -107.33 gain 106 146 -114.10 gain 146 106 -110.74 gain 106 147 -117.13 gain 147 106 -117.62 gain 106 148 -117.80 gain 148 106 -117.23 gain 106 149 -115.62 gain 149 106 -114.29 gain 106 150 -100.60 gain 150 106 -104.39 gain 106 151 -100.10 gain 151 106 -97.45 gain 106 152 -94.72 gain 152 106 -93.89 gain 106 153 -111.84 gain 153 106 -113.45 gain 106 154 -101.04 gain 154 106 -98.26 gain 106 155 -107.57 gain 155 106 -108.62 gain 106 156 -116.26 gain 156 106 -115.32 gain 106 157 -112.51 gain 157 106 -113.54 gain 106 158 -114.38 gain 158 106 -115.84 gain 106 159 -114.37 gain 159 106 -109.47 gain 106 160 -118.45 gain 160 106 -115.82 gain 106 161 -117.40 gain 161 106 -117.63 gain 106 162 -115.66 gain 162 106 -112.97 gain 106 163 -122.79 gain 163 106 -117.29 gain 106 164 -114.43 gain 164 106 -110.68 gain 106 165 -100.70 gain 165 106 -99.87 gain 106 166 -103.80 gain 166 106 -105.65 gain 106 167 -95.25 gain 167 106 -96.22 gain 106 168 -100.30 gain 168 106 -102.62 gain 106 169 -105.05 gain 169 106 -99.72 gain 106 170 -110.86 gain 170 106 -116.02 gain 106 171 -114.45 gain 171 106 -116.03 gain 106 172 -110.41 gain 172 106 -105.09 gain 106 173 -118.04 gain 173 106 -117.39 gain 106 174 -111.46 gain 174 106 -110.56 gain 106 175 -120.36 gain 175 106 -118.67 gain 106 176 -118.11 gain 176 106 -116.37 gain 106 177 -118.37 gain 177 106 -118.13 gain 106 178 -117.41 gain 178 106 -118.11 gain 106 179 -122.41 gain 179 106 -124.15 gain 106 180 -108.56 gain 180 106 -106.09 gain 106 181 -103.81 gain 181 106 -105.78 gain 106 182 -100.71 gain 182 106 -98.98 gain 106 183 -104.07 gain 183 106 -103.64 gain 106 184 -112.31 gain 184 106 -113.94 gain 106 185 -107.02 gain 185 106 -104.07 gain 106 186 -125.54 gain 186 106 -121.59 gain 106 187 -112.35 gain 187 106 -112.49 gain 106 188 -115.15 gain 188 106 -118.05 gain 106 189 -115.20 gain 189 106 -117.49 gain 106 190 -113.24 gain 190 106 -111.21 gain 106 191 -115.48 gain 191 106 -116.48 gain 106 192 -121.04 gain 192 106 -119.36 gain 106 193 -126.59 gain 193 106 -128.88 gain 106 194 -123.34 gain 194 106 -125.20 gain 106 195 -109.36 gain 195 106 -109.41 gain 106 196 -110.93 gain 196 106 -110.00 gain 106 197 -110.68 gain 197 106 -112.43 gain 106 198 -106.33 gain 198 106 -112.01 gain 106 199 -112.17 gain 199 106 -109.41 gain 106 200 -111.60 gain 200 106 -105.62 gain 106 201 -111.52 gain 201 106 -109.36 gain 106 202 -113.75 gain 202 106 -113.12 gain 106 203 -116.21 gain 203 106 -112.21 gain 106 204 -119.06 gain 204 106 -122.13 gain 106 205 -118.76 gain 205 106 -119.90 gain 106 206 -117.65 gain 206 106 -116.76 gain 106 207 -114.74 gain 207 106 -114.62 gain 106 208 -122.22 gain 208 106 -122.27 gain 106 209 -122.46 gain 209 106 -118.51 gain 106 210 -105.79 gain 210 106 -108.43 gain 106 211 -113.26 gain 211 106 -112.16 gain 106 212 -108.79 gain 212 106 -105.23 gain 106 213 -117.49 gain 213 106 -118.81 gain 106 214 -112.40 gain 214 106 -110.01 gain 106 215 -114.56 gain 215 106 -113.26 gain 106 216 -113.85 gain 216 106 -113.37 gain 106 217 -118.02 gain 217 106 -121.36 gain 106 218 -110.25 gain 218 106 -105.79 gain 106 219 -116.52 gain 219 106 -114.88 gain 106 220 -117.04 gain 220 106 -111.75 gain 106 221 -120.77 gain 221 106 -119.98 gain 106 222 -120.27 gain 222 106 -120.85 gain 106 223 -119.50 gain 223 106 -122.09 gain 106 224 -113.20 gain 224 106 -116.29 gain 107 108 -85.65 gain 108 107 -85.31 gain 107 109 -100.67 gain 109 107 -102.18 gain 107 110 -102.57 gain 110 107 -101.15 gain 107 111 -105.01 gain 111 107 -106.25 gain 107 112 -109.15 gain 112 107 -110.13 gain 107 113 -103.75 gain 113 107 -106.43 gain 107 114 -112.94 gain 114 107 -112.52 gain 107 115 -125.56 gain 115 107 -120.07 gain 107 116 -115.53 gain 116 107 -115.78 gain 107 117 -115.09 gain 117 107 -118.15 gain 107 118 -115.86 gain 118 107 -116.28 gain 107 119 -115.46 gain 119 107 -115.37 gain 107 120 -102.86 gain 120 107 -98.30 gain 107 121 -89.27 gain 121 107 -87.49 gain 107 122 -90.47 gain 122 107 -91.20 gain 107 123 -84.52 gain 123 107 -82.77 gain 107 124 -106.03 gain 124 107 -104.27 gain 107 125 -100.88 gain 125 107 -100.72 gain 107 126 -99.11 gain 126 107 -95.27 gain 107 127 -100.32 gain 127 107 -98.06 gain 107 128 -109.28 gain 128 107 -108.88 gain 107 129 -113.14 gain 129 107 -110.15 gain 107 130 -118.78 gain 130 107 -118.48 gain 107 131 -112.93 gain 131 107 -110.49 gain 107 132 -112.92 gain 132 107 -113.09 gain 107 133 -116.55 gain 133 107 -114.83 gain 107 134 -119.73 gain 134 107 -117.81 gain 107 135 -103.14 gain 135 107 -102.93 gain 107 136 -92.21 gain 136 107 -93.29 gain 107 137 -91.32 gain 137 107 -90.18 gain 107 138 -98.91 gain 138 107 -94.00 gain 107 139 -104.27 gain 139 107 -101.26 gain 107 140 -100.69 gain 140 107 -103.74 gain 107 141 -107.27 gain 141 107 -105.20 gain 107 142 -105.52 gain 142 107 -108.27 gain 107 143 -108.02 gain 143 107 -106.31 gain 107 144 -116.02 gain 144 107 -115.22 gain 107 145 -116.46 gain 145 107 -115.25 gain 107 146 -114.96 gain 146 107 -111.31 gain 107 147 -115.73 gain 147 107 -115.93 gain 107 148 -110.67 gain 148 107 -109.79 gain 107 149 -114.50 gain 149 107 -112.87 gain 107 150 -99.99 gain 150 107 -103.48 gain 107 151 -104.87 gain 151 107 -101.92 gain 107 152 -99.55 gain 152 107 -98.43 gain 107 153 -98.59 gain 153 107 -99.89 gain 107 154 -100.68 gain 154 107 -97.60 gain 107 155 -102.11 gain 155 107 -102.86 gain 107 156 -110.83 gain 156 107 -109.59 gain 107 157 -104.16 gain 157 107 -104.89 gain 107 158 -112.51 gain 158 107 -113.67 gain 107 159 -111.72 gain 159 107 -106.52 gain 107 160 -110.61 gain 160 107 -107.68 gain 107 161 -110.27 gain 161 107 -110.20 gain 107 162 -111.58 gain 162 107 -108.60 gain 107 163 -124.22 gain 163 107 -118.42 gain 107 164 -118.26 gain 164 107 -114.20 gain 107 165 -107.52 gain 165 107 -106.39 gain 107 166 -100.62 gain 166 107 -102.17 gain 107 167 -99.49 gain 167 107 -100.16 gain 107 168 -103.05 gain 168 107 -105.07 gain 107 169 -98.48 gain 169 107 -92.85 gain 107 170 -108.41 gain 170 107 -113.27 gain 107 171 -105.27 gain 171 107 -106.56 gain 107 172 -104.01 gain 172 107 -98.39 gain 107 173 -110.66 gain 173 107 -109.70 gain 107 174 -110.76 gain 174 107 -109.56 gain 107 175 -114.17 gain 175 107 -112.18 gain 107 176 -108.27 gain 176 107 -106.23 gain 107 177 -116.38 gain 177 107 -115.84 gain 107 178 -115.62 gain 178 107 -116.03 gain 107 179 -114.53 gain 179 107 -115.96 gain 107 180 -109.01 gain 180 107 -106.24 gain 107 181 -103.86 gain 181 107 -105.53 gain 107 182 -101.51 gain 182 107 -99.48 gain 107 183 -105.20 gain 183 107 -104.47 gain 107 184 -111.88 gain 184 107 -113.20 gain 107 185 -108.18 gain 185 107 -104.93 gain 107 186 -111.49 gain 186 107 -107.24 gain 107 187 -112.21 gain 187 107 -112.05 gain 107 188 -113.15 gain 188 107 -115.75 gain 107 189 -119.11 gain 189 107 -121.10 gain 107 190 -114.43 gain 190 107 -112.09 gain 107 191 -119.03 gain 191 107 -119.73 gain 107 192 -121.62 gain 192 107 -119.63 gain 107 193 -118.55 gain 193 107 -120.54 gain 107 194 -116.14 gain 194 107 -117.69 gain 107 195 -112.37 gain 195 107 -112.12 gain 107 196 -104.46 gain 196 107 -103.23 gain 107 197 -107.37 gain 197 107 -108.81 gain 107 198 -107.77 gain 198 107 -113.15 gain 107 199 -109.02 gain 199 107 -105.97 gain 107 200 -113.14 gain 200 107 -106.85 gain 107 201 -109.28 gain 201 107 -106.82 gain 107 202 -116.97 gain 202 107 -116.03 gain 107 203 -111.24 gain 203 107 -106.93 gain 107 204 -116.10 gain 204 107 -118.87 gain 107 205 -117.63 gain 205 107 -118.47 gain 107 206 -120.46 gain 206 107 -119.27 gain 107 207 -115.60 gain 207 107 -115.18 gain 107 208 -112.79 gain 208 107 -112.54 gain 107 209 -116.23 gain 209 107 -111.98 gain 107 210 -109.58 gain 210 107 -111.92 gain 107 211 -106.86 gain 211 107 -105.46 gain 107 212 -109.86 gain 212 107 -106.01 gain 107 213 -110.03 gain 213 107 -111.04 gain 107 214 -102.94 gain 214 107 -100.25 gain 107 215 -115.67 gain 215 107 -114.06 gain 107 216 -116.30 gain 216 107 -115.52 gain 107 217 -111.41 gain 217 107 -114.46 gain 107 218 -117.88 gain 218 107 -113.11 gain 107 219 -111.95 gain 219 107 -110.00 gain 107 220 -126.65 gain 220 107 -121.05 gain 107 221 -115.15 gain 221 107 -114.06 gain 107 222 -113.92 gain 222 107 -114.20 gain 107 223 -122.25 gain 223 107 -124.54 gain 107 224 -129.88 gain 224 107 -132.67 gain 108 109 -93.29 gain 109 108 -95.14 gain 108 110 -96.56 gain 110 108 -95.47 gain 108 111 -101.45 gain 111 108 -103.03 gain 108 112 -107.40 gain 112 108 -108.73 gain 108 113 -100.24 gain 113 108 -103.26 gain 108 114 -110.63 gain 114 108 -110.55 gain 108 115 -112.94 gain 115 108 -107.79 gain 108 116 -112.32 gain 116 108 -112.91 gain 108 117 -112.31 gain 117 108 -115.71 gain 108 118 -115.62 gain 118 108 -116.39 gain 108 119 -113.12 gain 119 108 -113.36 gain 108 120 -98.95 gain 120 108 -94.74 gain 108 121 -96.34 gain 121 108 -94.91 gain 108 122 -86.67 gain 122 108 -87.75 gain 108 123 -95.01 gain 123 108 -93.60 gain 108 124 -84.87 gain 124 108 -83.45 gain 108 125 -93.20 gain 125 108 -93.38 gain 108 126 -99.65 gain 126 108 -96.15 gain 108 127 -100.00 gain 127 108 -98.08 gain 108 128 -107.82 gain 128 108 -107.77 gain 108 129 -109.63 gain 129 108 -106.98 gain 108 130 -111.52 gain 130 108 -111.55 gain 108 131 -119.25 gain 131 108 -117.15 gain 108 132 -125.05 gain 132 108 -125.57 gain 108 133 -111.08 gain 133 108 -109.71 gain 108 134 -119.19 gain 134 108 -117.61 gain 108 135 -97.94 gain 135 108 -98.07 gain 108 136 -91.78 gain 136 108 -93.20 gain 108 137 -98.59 gain 137 108 -97.79 gain 108 138 -96.63 gain 138 108 -92.06 gain 108 139 -94.28 gain 139 108 -91.61 gain 108 140 -101.08 gain 140 108 -104.47 gain 108 141 -99.60 gain 141 108 -97.88 gain 108 142 -106.76 gain 142 108 -109.86 gain 108 143 -106.64 gain 143 108 -105.27 gain 108 144 -110.33 gain 144 108 -109.87 gain 108 145 -113.07 gain 145 108 -112.20 gain 108 146 -108.38 gain 146 108 -105.06 gain 108 147 -110.39 gain 147 108 -110.93 gain 108 148 -124.08 gain 148 108 -123.55 gain 108 149 -121.35 gain 149 108 -120.07 gain 108 150 -107.91 gain 150 108 -111.74 gain 108 151 -106.55 gain 151 108 -103.94 gain 108 152 -97.30 gain 152 108 -96.52 gain 108 153 -100.32 gain 153 108 -101.97 gain 108 154 -99.18 gain 154 108 -96.44 gain 108 155 -99.80 gain 155 108 -100.89 gain 108 156 -105.61 gain 156 108 -104.72 gain 108 157 -104.72 gain 157 108 -105.79 gain 108 158 -119.96 gain 158 108 -121.46 gain 108 159 -111.28 gain 159 108 -106.42 gain 108 160 -110.29 gain 160 108 -107.70 gain 108 161 -114.58 gain 161 108 -114.85 gain 108 162 -112.37 gain 162 108 -109.72 gain 108 163 -120.67 gain 163 108 -115.21 gain 108 164 -118.36 gain 164 108 -114.64 gain 108 165 -106.18 gain 165 108 -105.39 gain 108 166 -113.32 gain 166 108 -115.21 gain 108 167 -108.93 gain 167 108 -109.94 gain 108 168 -106.56 gain 168 108 -108.92 gain 108 169 -107.51 gain 169 108 -102.22 gain 108 170 -109.29 gain 170 108 -114.49 gain 108 171 -106.63 gain 171 108 -108.26 gain 108 172 -106.00 gain 172 108 -100.72 gain 108 173 -106.21 gain 173 108 -105.60 gain 108 174 -111.53 gain 174 108 -110.67 gain 108 175 -113.58 gain 175 108 -111.93 gain 108 176 -111.00 gain 176 108 -109.30 gain 108 177 -115.47 gain 177 108 -115.26 gain 108 178 -123.05 gain 178 108 -123.80 gain 108 179 -115.77 gain 179 108 -117.54 gain 108 180 -107.05 gain 180 108 -104.62 gain 108 181 -108.24 gain 181 108 -110.25 gain 108 182 -102.11 gain 182 108 -100.42 gain 108 183 -102.00 gain 183 108 -101.61 gain 108 184 -109.52 gain 184 108 -111.19 gain 108 185 -108.22 gain 185 108 -105.31 gain 108 186 -105.55 gain 186 108 -101.65 gain 108 187 -118.59 gain 187 108 -118.77 gain 108 188 -117.69 gain 188 108 -120.63 gain 108 189 -111.92 gain 189 108 -114.25 gain 108 190 -112.27 gain 190 108 -110.28 gain 108 191 -115.45 gain 191 108 -116.49 gain 108 192 -111.27 gain 192 108 -109.62 gain 108 193 -116.50 gain 193 108 -118.83 gain 108 194 -114.39 gain 194 108 -116.29 gain 108 195 -110.36 gain 195 108 -110.45 gain 108 196 -103.93 gain 196 108 -103.05 gain 108 197 -112.53 gain 197 108 -114.32 gain 108 198 -109.59 gain 198 108 -115.31 gain 108 199 -106.69 gain 199 108 -103.98 gain 108 200 -111.80 gain 200 108 -105.86 gain 108 201 -118.98 gain 201 108 -116.86 gain 108 202 -113.75 gain 202 108 -113.16 gain 108 203 -121.84 gain 203 108 -117.88 gain 108 204 -114.99 gain 204 108 -118.10 gain 108 205 -109.81 gain 205 108 -110.99 gain 108 206 -115.77 gain 206 108 -114.93 gain 108 207 -115.95 gain 207 108 -115.87 gain 108 208 -121.53 gain 208 108 -121.62 gain 108 209 -113.06 gain 209 108 -109.15 gain 108 210 -108.00 gain 210 108 -110.68 gain 108 211 -115.38 gain 211 108 -114.32 gain 108 212 -108.92 gain 212 108 -105.40 gain 108 213 -112.81 gain 213 108 -114.16 gain 108 214 -112.17 gain 214 108 -109.82 gain 108 215 -112.19 gain 215 108 -110.93 gain 108 216 -114.03 gain 216 108 -113.60 gain 108 217 -116.35 gain 217 108 -119.74 gain 108 218 -108.92 gain 218 108 -104.50 gain 108 219 -113.43 gain 219 108 -111.83 gain 108 220 -113.93 gain 220 108 -108.68 gain 108 221 -109.98 gain 221 108 -109.23 gain 108 222 -119.25 gain 222 108 -119.87 gain 108 223 -117.86 gain 223 108 -120.49 gain 108 224 -116.08 gain 224 108 -119.21 gain 109 110 -80.70 gain 110 109 -77.77 gain 109 111 -98.80 gain 111 109 -98.53 gain 109 112 -99.57 gain 112 109 -99.04 gain 109 113 -103.51 gain 113 109 -104.68 gain 109 114 -106.48 gain 114 109 -104.56 gain 109 115 -114.40 gain 115 109 -107.40 gain 109 116 -114.19 gain 116 109 -112.94 gain 109 117 -118.66 gain 117 109 -120.20 gain 109 118 -115.81 gain 118 109 -114.73 gain 109 119 -119.48 gain 119 109 -117.88 gain 109 120 -105.16 gain 120 109 -99.11 gain 109 121 -100.19 gain 121 109 -96.91 gain 109 122 -99.30 gain 122 109 -98.52 gain 109 123 -85.61 gain 123 109 -82.35 gain 109 124 -91.75 gain 124 109 -88.48 gain 109 125 -98.09 gain 125 109 -96.43 gain 109 126 -108.03 gain 126 109 -102.69 gain 109 127 -104.52 gain 127 109 -100.74 gain 109 128 -106.24 gain 128 109 -104.34 gain 109 129 -105.05 gain 129 109 -100.55 gain 109 130 -110.52 gain 130 109 -108.71 gain 109 131 -111.66 gain 131 109 -107.71 gain 109 132 -109.47 gain 132 109 -108.14 gain 109 133 -111.24 gain 133 109 -108.02 gain 109 134 -120.77 gain 134 109 -117.34 gain 109 135 -99.78 gain 135 109 -98.06 gain 109 136 -104.61 gain 136 109 -104.18 gain 109 137 -103.12 gain 137 109 -100.47 gain 109 138 -101.56 gain 138 109 -95.15 gain 109 139 -98.45 gain 139 109 -93.94 gain 109 140 -91.43 gain 140 109 -92.97 gain 109 141 -102.13 gain 141 109 -98.56 gain 109 142 -108.57 gain 142 109 -109.81 gain 109 143 -100.37 gain 143 109 -97.15 gain 109 144 -102.76 gain 144 109 -100.45 gain 109 145 -110.54 gain 145 109 -107.82 gain 109 146 -110.72 gain 146 109 -105.56 gain 109 147 -111.14 gain 147 109 -109.83 gain 109 148 -121.48 gain 148 109 -119.09 gain 109 149 -120.98 gain 149 109 -117.84 gain 109 150 -105.68 gain 150 109 -107.66 gain 109 151 -104.63 gain 151 109 -100.17 gain 109 152 -104.78 gain 152 109 -102.14 gain 109 153 -93.46 gain 153 109 -93.26 gain 109 154 -107.22 gain 154 109 -102.63 gain 109 155 -101.84 gain 155 109 -101.08 gain 109 156 -104.12 gain 156 109 -101.38 gain 109 157 -104.98 gain 157 109 -104.20 gain 109 158 -114.55 gain 158 109 -114.20 gain 109 159 -116.18 gain 159 109 -109.47 gain 109 160 -112.82 gain 160 109 -108.39 gain 109 161 -116.18 gain 161 109 -114.60 gain 109 162 -119.92 gain 162 109 -115.43 gain 109 163 -121.54 gain 163 109 -114.23 gain 109 164 -123.48 gain 164 109 -117.92 gain 109 165 -106.22 gain 165 109 -103.58 gain 109 166 -109.17 gain 166 109 -109.22 gain 109 167 -111.30 gain 167 109 -110.46 gain 109 168 -107.99 gain 168 109 -108.50 gain 109 169 -105.59 gain 169 109 -98.45 gain 109 170 -106.27 gain 170 109 -109.62 gain 109 171 -105.62 gain 171 109 -105.40 gain 109 172 -111.14 gain 172 109 -104.01 gain 109 173 -99.16 gain 173 109 -96.69 gain 109 174 -112.31 gain 174 109 -109.61 gain 109 175 -107.46 gain 175 109 -103.96 gain 109 176 -113.16 gain 176 109 -109.62 gain 109 177 -115.08 gain 177 109 -113.02 gain 109 178 -111.34 gain 178 109 -110.24 gain 109 179 -119.59 gain 179 109 -119.51 gain 109 180 -115.63 gain 180 109 -111.36 gain 109 181 -111.96 gain 181 109 -112.12 gain 109 182 -108.44 gain 182 109 -104.91 gain 109 183 -108.20 gain 183 109 -105.97 gain 109 184 -108.78 gain 184 109 -108.60 gain 109 185 -103.00 gain 185 109 -98.25 gain 109 186 -115.64 gain 186 109 -109.88 gain 109 187 -110.60 gain 187 109 -108.93 gain 109 188 -109.62 gain 188 109 -110.71 gain 109 189 -112.74 gain 189 109 -113.23 gain 109 190 -113.29 gain 190 109 -109.44 gain 109 191 -109.44 gain 191 109 -108.63 gain 109 192 -115.22 gain 192 109 -111.73 gain 109 193 -114.92 gain 193 109 -115.40 gain 109 194 -115.36 gain 194 109 -115.42 gain 109 195 -107.99 gain 195 109 -106.23 gain 109 196 -114.96 gain 196 109 -112.23 gain 109 197 -111.72 gain 197 109 -111.66 gain 109 198 -115.01 gain 198 109 -118.89 gain 109 199 -115.80 gain 199 109 -111.24 gain 109 200 -113.38 gain 200 109 -105.59 gain 109 201 -116.98 gain 201 109 -113.01 gain 109 202 -108.49 gain 202 109 -106.04 gain 109 203 -115.47 gain 203 109 -109.65 gain 109 204 -117.52 gain 204 109 -118.79 gain 109 205 -125.87 gain 205 109 -125.20 gain 109 206 -116.47 gain 206 109 -113.78 gain 109 207 -118.47 gain 207 109 -116.54 gain 109 208 -121.95 gain 208 109 -120.19 gain 109 209 -124.45 gain 209 109 -118.69 gain 109 210 -116.37 gain 210 109 -117.20 gain 109 211 -116.95 gain 211 109 -114.04 gain 109 212 -108.12 gain 212 109 -102.75 gain 109 213 -117.42 gain 213 109 -116.93 gain 109 214 -111.05 gain 214 109 -106.86 gain 109 215 -110.33 gain 215 109 -107.22 gain 109 216 -113.88 gain 216 109 -111.59 gain 109 217 -118.29 gain 217 109 -119.83 gain 109 218 -112.71 gain 218 109 -106.44 gain 109 219 -113.28 gain 219 109 -109.83 gain 109 220 -115.61 gain 220 109 -108.51 gain 109 221 -117.89 gain 221 109 -115.29 gain 109 222 -122.33 gain 222 109 -121.11 gain 109 223 -123.80 gain 223 109 -124.58 gain 109 224 -125.93 gain 224 109 -127.21 gain 110 111 -80.62 gain 111 110 -83.29 gain 110 112 -87.33 gain 112 110 -89.74 gain 110 113 -99.03 gain 113 110 -103.14 gain 110 114 -101.50 gain 114 110 -102.52 gain 110 115 -104.91 gain 115 110 -100.85 gain 110 116 -111.34 gain 116 110 -113.01 gain 110 117 -110.56 gain 117 110 -115.03 gain 110 118 -113.34 gain 118 110 -115.20 gain 110 119 -105.59 gain 119 110 -106.92 gain 110 120 -105.01 gain 120 110 -101.88 gain 110 121 -97.79 gain 121 110 -97.44 gain 110 122 -95.79 gain 122 110 -97.95 gain 110 123 -96.54 gain 123 110 -96.21 gain 110 124 -89.99 gain 124 110 -89.65 gain 110 125 -91.26 gain 125 110 -92.53 gain 110 126 -84.24 gain 126 110 -81.83 gain 110 127 -98.52 gain 127 110 -97.68 gain 110 128 -97.96 gain 128 110 -98.99 gain 110 129 -106.55 gain 129 110 -104.98 gain 110 130 -109.36 gain 130 110 -110.47 gain 110 131 -113.46 gain 131 110 -112.44 gain 110 132 -109.93 gain 132 110 -111.53 gain 110 133 -113.93 gain 133 110 -113.64 gain 110 134 -112.80 gain 134 110 -112.31 gain 110 135 -103.99 gain 135 110 -105.21 gain 110 136 -109.91 gain 136 110 -112.41 gain 110 137 -100.57 gain 137 110 -100.86 gain 110 138 -109.46 gain 138 110 -105.98 gain 110 139 -96.85 gain 139 110 -95.27 gain 110 140 -96.83 gain 140 110 -101.30 gain 110 141 -92.88 gain 141 110 -92.24 gain 110 142 -95.35 gain 142 110 -99.53 gain 110 143 -99.40 gain 143 110 -99.11 gain 110 144 -106.02 gain 144 110 -106.64 gain 110 145 -101.89 gain 145 110 -102.10 gain 110 146 -106.55 gain 146 110 -104.32 gain 110 147 -104.35 gain 147 110 -105.97 gain 110 148 -120.73 gain 148 110 -121.28 gain 110 149 -113.92 gain 149 110 -113.71 gain 110 150 -111.41 gain 150 110 -116.32 gain 110 151 -103.85 gain 151 110 -102.33 gain 110 152 -102.41 gain 152 110 -102.71 gain 110 153 -108.03 gain 153 110 -110.76 gain 110 154 -94.55 gain 154 110 -92.89 gain 110 155 -99.94 gain 155 110 -102.11 gain 110 156 -98.42 gain 156 110 -98.61 gain 110 157 -102.69 gain 157 110 -104.85 gain 110 158 -101.33 gain 158 110 -103.92 gain 110 159 -110.88 gain 159 110 -107.11 gain 110 160 -112.84 gain 160 110 -111.34 gain 110 161 -109.40 gain 161 110 -110.75 gain 110 162 -114.86 gain 162 110 -113.30 gain 110 163 -113.30 gain 163 110 -108.92 gain 110 164 -116.29 gain 164 110 -113.66 gain 110 165 -112.10 gain 165 110 -112.40 gain 110 166 -103.99 gain 166 110 -106.97 gain 110 167 -109.78 gain 167 110 -111.88 gain 110 168 -95.51 gain 168 110 -98.96 gain 110 169 -100.30 gain 169 110 -96.09 gain 110 170 -96.94 gain 170 110 -103.22 gain 110 171 -104.43 gain 171 110 -107.14 gain 110 172 -103.01 gain 172 110 -98.82 gain 110 173 -99.85 gain 173 110 -100.32 gain 110 174 -105.82 gain 174 110 -106.05 gain 110 175 -106.07 gain 175 110 -105.51 gain 110 176 -105.55 gain 176 110 -104.94 gain 110 177 -109.50 gain 177 110 -110.38 gain 110 178 -114.07 gain 178 110 -115.90 gain 110 179 -113.59 gain 179 110 -116.44 gain 110 180 -108.73 gain 180 110 -107.39 gain 110 181 -99.63 gain 181 110 -102.73 gain 110 182 -109.96 gain 182 110 -109.36 gain 110 183 -107.36 gain 183 110 -108.06 gain 110 184 -99.16 gain 184 110 -101.91 gain 110 185 -97.05 gain 185 110 -95.23 gain 110 186 -105.02 gain 186 110 -102.19 gain 110 187 -109.07 gain 187 110 -110.34 gain 110 188 -108.30 gain 188 110 -112.32 gain 110 189 -103.04 gain 189 110 -106.46 gain 110 190 -114.30 gain 190 110 -113.39 gain 110 191 -114.97 gain 191 110 -117.09 gain 110 192 -115.25 gain 192 110 -114.69 gain 110 193 -116.70 gain 193 110 -120.11 gain 110 194 -115.04 gain 194 110 -118.03 gain 110 195 -111.22 gain 195 110 -112.39 gain 110 196 -116.33 gain 196 110 -116.52 gain 110 197 -116.14 gain 197 110 -119.01 gain 110 198 -106.61 gain 198 110 -113.42 gain 110 199 -109.63 gain 199 110 -108.00 gain 110 200 -107.45 gain 200 110 -102.60 gain 110 201 -106.47 gain 201 110 -105.43 gain 110 202 -111.24 gain 202 110 -111.73 gain 110 203 -110.31 gain 203 110 -107.43 gain 110 204 -112.70 gain 204 110 -116.89 gain 110 205 -109.95 gain 205 110 -112.21 gain 110 206 -112.30 gain 206 110 -112.54 gain 110 207 -109.25 gain 207 110 -110.26 gain 110 208 -117.75 gain 208 110 -118.93 gain 110 209 -116.42 gain 209 110 -113.59 gain 110 210 -119.92 gain 210 110 -123.68 gain 110 211 -107.26 gain 211 110 -107.28 gain 110 212 -113.19 gain 212 110 -110.76 gain 110 213 -108.21 gain 213 110 -110.65 gain 110 214 -102.53 gain 214 110 -101.27 gain 110 215 -111.98 gain 215 110 -111.81 gain 110 216 -109.27 gain 216 110 -109.93 gain 110 217 -110.67 gain 217 110 -115.14 gain 110 218 -105.20 gain 218 110 -101.86 gain 110 219 -111.22 gain 219 110 -110.70 gain 110 220 -114.77 gain 220 110 -110.61 gain 110 221 -112.11 gain 221 110 -112.45 gain 110 222 -106.14 gain 222 110 -107.85 gain 110 223 -120.25 gain 223 110 -123.96 gain 110 224 -114.05 gain 224 110 -118.26 gain 111 112 -86.16 gain 112 111 -85.90 gain 111 113 -95.02 gain 113 111 -96.47 gain 111 114 -94.36 gain 114 111 -92.71 gain 111 115 -107.92 gain 115 111 -101.19 gain 111 116 -106.11 gain 116 111 -105.12 gain 111 117 -106.74 gain 117 111 -108.55 gain 111 118 -112.32 gain 118 111 -111.51 gain 111 119 -120.30 gain 119 111 -118.96 gain 111 120 -108.67 gain 120 111 -102.88 gain 111 121 -113.76 gain 121 111 -110.75 gain 111 122 -102.12 gain 122 111 -101.62 gain 111 123 -103.18 gain 123 111 -100.19 gain 111 124 -103.14 gain 124 111 -100.14 gain 111 125 -87.90 gain 125 111 -86.50 gain 111 126 -87.30 gain 126 111 -82.23 gain 111 127 -90.32 gain 127 111 -86.82 gain 111 128 -96.18 gain 128 111 -94.55 gain 111 129 -100.00 gain 129 111 -95.77 gain 111 130 -113.82 gain 130 111 -112.27 gain 111 131 -109.58 gain 131 111 -105.90 gain 111 132 -112.27 gain 132 111 -111.21 gain 111 133 -106.38 gain 133 111 -103.43 gain 111 134 -112.51 gain 134 111 -109.35 gain 111 135 -115.67 gain 135 111 -114.22 gain 111 136 -103.06 gain 136 111 -102.90 gain 111 137 -103.16 gain 137 111 -100.78 gain 111 138 -106.44 gain 138 111 -100.30 gain 111 139 -101.36 gain 139 111 -97.12 gain 111 140 -103.39 gain 140 111 -105.20 gain 111 141 -94.44 gain 141 111 -91.14 gain 111 142 -102.55 gain 142 111 -104.06 gain 111 143 -104.65 gain 143 111 -101.70 gain 111 144 -102.82 gain 144 111 -100.78 gain 111 145 -103.86 gain 145 111 -101.41 gain 111 146 -112.30 gain 146 111 -107.40 gain 111 147 -110.51 gain 147 111 -109.46 gain 111 148 -118.54 gain 148 111 -116.43 gain 111 149 -108.60 gain 149 111 -105.73 gain 111 150 -105.78 gain 150 111 -108.03 gain 111 151 -114.76 gain 151 111 -110.57 gain 111 152 -108.46 gain 152 111 -106.09 gain 111 153 -107.79 gain 153 111 -107.85 gain 111 154 -103.82 gain 154 111 -99.50 gain 111 155 -98.70 gain 155 111 -98.21 gain 111 156 -95.73 gain 156 111 -93.25 gain 111 157 -102.24 gain 157 111 -101.73 gain 111 158 -102.20 gain 158 111 -102.12 gain 111 159 -111.88 gain 159 111 -105.44 gain 111 160 -112.14 gain 160 111 -107.97 gain 111 161 -112.60 gain 161 111 -111.29 gain 111 162 -115.75 gain 162 111 -111.53 gain 111 163 -112.64 gain 163 111 -105.60 gain 111 164 -112.25 gain 164 111 -106.95 gain 111 165 -108.27 gain 165 111 -105.90 gain 111 166 -107.76 gain 166 111 -108.07 gain 111 167 -110.15 gain 167 111 -109.58 gain 111 168 -105.29 gain 168 111 -106.07 gain 111 169 -112.43 gain 169 111 -105.56 gain 111 170 -102.88 gain 170 111 -106.50 gain 111 171 -111.95 gain 171 111 -112.00 gain 111 172 -106.55 gain 172 111 -99.69 gain 111 173 -107.75 gain 173 111 -105.55 gain 111 174 -109.53 gain 174 111 -107.09 gain 111 175 -111.46 gain 175 111 -108.24 gain 111 176 -113.79 gain 176 111 -110.51 gain 111 177 -103.92 gain 177 111 -102.13 gain 111 178 -115.23 gain 178 111 -114.40 gain 111 179 -119.29 gain 179 111 -119.49 gain 111 180 -113.27 gain 180 111 -109.26 gain 111 181 -112.50 gain 181 111 -112.93 gain 111 182 -112.68 gain 182 111 -109.42 gain 111 183 -105.93 gain 183 111 -103.96 gain 111 184 -112.59 gain 184 111 -112.67 gain 111 185 -109.28 gain 185 111 -104.79 gain 111 186 -105.95 gain 186 111 -100.46 gain 111 187 -104.82 gain 187 111 -103.42 gain 111 188 -106.48 gain 188 111 -107.84 gain 111 189 -115.17 gain 189 111 -115.93 gain 111 190 -107.26 gain 190 111 -103.68 gain 111 191 -106.26 gain 191 111 -105.72 gain 111 192 -109.97 gain 192 111 -106.74 gain 111 193 -113.50 gain 193 111 -114.25 gain 111 194 -112.96 gain 194 111 -113.28 gain 111 195 -111.58 gain 195 111 -110.09 gain 111 196 -115.13 gain 196 111 -112.67 gain 111 197 -111.63 gain 197 111 -111.84 gain 111 198 -109.41 gain 198 111 -113.55 gain 111 199 -111.56 gain 199 111 -107.27 gain 111 200 -107.10 gain 200 111 -99.58 gain 111 201 -105.20 gain 201 111 -101.49 gain 111 202 -108.36 gain 202 111 -106.18 gain 111 203 -107.87 gain 203 111 -102.32 gain 111 204 -113.46 gain 204 111 -115.00 gain 111 205 -115.88 gain 205 111 -115.48 gain 111 206 -106.73 gain 206 111 -104.31 gain 111 207 -110.04 gain 207 111 -108.38 gain 111 208 -118.46 gain 208 111 -116.97 gain 111 209 -114.51 gain 209 111 -109.02 gain 111 210 -119.64 gain 210 111 -120.73 gain 111 211 -119.97 gain 211 111 -117.33 gain 111 212 -115.32 gain 212 111 -110.22 gain 111 213 -109.84 gain 213 111 -109.61 gain 111 214 -124.29 gain 214 111 -120.36 gain 111 215 -116.96 gain 215 111 -114.12 gain 111 216 -108.35 gain 216 111 -106.33 gain 111 217 -115.09 gain 217 111 -116.90 gain 111 218 -112.19 gain 218 111 -106.19 gain 111 219 -112.90 gain 219 111 -109.71 gain 111 220 -105.93 gain 220 111 -99.09 gain 111 221 -104.46 gain 221 111 -102.13 gain 111 222 -112.97 gain 222 111 -112.01 gain 111 223 -119.24 gain 223 111 -120.29 gain 111 224 -118.38 gain 224 111 -119.93 gain 112 113 -88.09 gain 113 112 -89.79 gain 112 114 -93.80 gain 114 112 -92.40 gain 112 115 -105.65 gain 115 112 -99.18 gain 112 116 -106.68 gain 116 112 -105.95 gain 112 117 -105.82 gain 117 112 -107.89 gain 112 118 -114.46 gain 118 112 -113.90 gain 112 119 -120.99 gain 119 112 -119.91 gain 112 120 -109.94 gain 120 112 -104.40 gain 112 121 -111.59 gain 121 112 -108.83 gain 112 122 -104.38 gain 122 112 -104.13 gain 112 123 -108.44 gain 123 112 -105.70 gain 112 124 -98.00 gain 124 112 -95.26 gain 112 125 -95.79 gain 125 112 -94.65 gain 112 126 -95.61 gain 126 112 -90.79 gain 112 127 -91.30 gain 127 112 -88.05 gain 112 128 -97.00 gain 128 112 -95.62 gain 112 129 -95.71 gain 129 112 -91.73 gain 112 130 -98.60 gain 130 112 -97.31 gain 112 131 -111.13 gain 131 112 -107.70 gain 112 132 -108.77 gain 132 112 -107.96 gain 112 133 -104.15 gain 133 112 -101.45 gain 112 134 -109.47 gain 134 112 -106.57 gain 112 135 -111.95 gain 135 112 -110.76 gain 112 136 -113.57 gain 136 112 -113.67 gain 112 137 -99.85 gain 137 112 -97.72 gain 112 138 -107.60 gain 138 112 -101.71 gain 112 139 -98.21 gain 139 112 -94.22 gain 112 140 -97.90 gain 140 112 -99.96 gain 112 141 -96.54 gain 141 112 -93.49 gain 112 142 -94.77 gain 142 112 -96.53 gain 112 143 -94.47 gain 143 112 -91.78 gain 112 144 -98.13 gain 144 112 -96.34 gain 112 145 -112.44 gain 145 112 -110.25 gain 112 146 -108.24 gain 146 112 -103.60 gain 112 147 -116.02 gain 147 112 -115.23 gain 112 148 -109.44 gain 148 112 -107.58 gain 112 149 -110.29 gain 149 112 -107.68 gain 112 150 -110.07 gain 150 112 -112.57 gain 112 151 -114.64 gain 151 112 -110.71 gain 112 152 -110.95 gain 152 112 -108.84 gain 112 153 -109.33 gain 153 112 -109.65 gain 112 154 -101.51 gain 154 112 -97.45 gain 112 155 -100.89 gain 155 112 -100.65 gain 112 156 -99.57 gain 156 112 -97.35 gain 112 157 -101.56 gain 157 112 -101.30 gain 112 158 -95.40 gain 158 112 -95.58 gain 112 159 -102.01 gain 159 112 -95.82 gain 112 160 -100.89 gain 160 112 -96.98 gain 112 161 -103.23 gain 161 112 -102.18 gain 112 162 -100.96 gain 162 112 -96.99 gain 112 163 -112.23 gain 163 112 -105.44 gain 112 164 -115.65 gain 164 112 -110.61 gain 112 165 -112.42 gain 165 112 -110.31 gain 112 166 -112.88 gain 166 112 -113.44 gain 112 167 -114.59 gain 167 112 -114.28 gain 112 168 -109.83 gain 168 112 -110.86 gain 112 169 -111.84 gain 169 112 -105.22 gain 112 170 -111.25 gain 170 112 -115.13 gain 112 171 -111.78 gain 171 112 -112.08 gain 112 172 -109.04 gain 172 112 -102.43 gain 112 173 -108.79 gain 173 112 -106.85 gain 112 174 -109.38 gain 174 112 -107.20 gain 112 175 -114.41 gain 175 112 -111.44 gain 112 176 -106.52 gain 176 112 -103.50 gain 112 177 -99.09 gain 177 112 -97.56 gain 112 178 -110.41 gain 178 112 -109.83 gain 112 179 -104.67 gain 179 112 -105.12 gain 112 180 -117.15 gain 180 112 -113.40 gain 112 181 -120.04 gain 181 112 -120.73 gain 112 182 -118.46 gain 182 112 -115.45 gain 112 183 -105.93 gain 183 112 -104.22 gain 112 184 -108.57 gain 184 112 -108.91 gain 112 185 -112.06 gain 185 112 -107.83 gain 112 186 -110.14 gain 186 112 -104.91 gain 112 187 -103.12 gain 187 112 -101.98 gain 112 188 -118.54 gain 188 112 -120.16 gain 112 189 -113.07 gain 189 112 -114.07 gain 112 190 -123.42 gain 190 112 -120.10 gain 112 191 -113.48 gain 191 112 -113.19 gain 112 192 -115.77 gain 192 112 -112.80 gain 112 193 -110.25 gain 193 112 -111.26 gain 112 194 -117.28 gain 194 112 -117.85 gain 112 195 -113.00 gain 195 112 -111.77 gain 112 196 -115.90 gain 196 112 -113.69 gain 112 197 -117.08 gain 197 112 -117.54 gain 112 198 -106.38 gain 198 112 -110.78 gain 112 199 -112.69 gain 199 112 -108.65 gain 112 200 -109.88 gain 200 112 -102.61 gain 112 201 -111.87 gain 201 112 -108.42 gain 112 202 -110.05 gain 202 112 -108.13 gain 112 203 -105.92 gain 203 112 -100.63 gain 112 204 -105.49 gain 204 112 -107.28 gain 112 205 -107.72 gain 205 112 -107.57 gain 112 206 -119.64 gain 206 112 -117.47 gain 112 207 -107.54 gain 207 112 -106.13 gain 112 208 -112.84 gain 208 112 -111.61 gain 112 209 -110.47 gain 209 112 -105.23 gain 112 210 -121.77 gain 210 112 -123.12 gain 112 211 -118.98 gain 211 112 -116.59 gain 112 212 -119.22 gain 212 112 -114.38 gain 112 213 -112.54 gain 213 112 -112.57 gain 112 214 -113.39 gain 214 112 -109.72 gain 112 215 -112.16 gain 215 112 -109.58 gain 112 216 -107.53 gain 216 112 -105.77 gain 112 217 -117.28 gain 217 112 -119.34 gain 112 218 -117.82 gain 218 112 -112.07 gain 112 219 -112.95 gain 219 112 -110.02 gain 112 220 -113.31 gain 220 112 -106.73 gain 112 221 -119.90 gain 221 112 -117.83 gain 112 222 -120.84 gain 222 112 -120.13 gain 112 223 -120.42 gain 223 112 -121.73 gain 112 224 -111.01 gain 224 112 -112.82 gain 113 114 -90.57 gain 114 113 -87.47 gain 113 115 -104.88 gain 115 113 -96.70 gain 113 116 -104.63 gain 116 113 -102.20 gain 113 117 -109.77 gain 117 113 -110.14 gain 113 118 -109.04 gain 118 113 -106.78 gain 113 119 -112.65 gain 119 113 -109.88 gain 113 120 -120.87 gain 120 113 -113.64 gain 113 121 -117.51 gain 121 113 -113.05 gain 113 122 -112.83 gain 122 113 -110.88 gain 113 123 -107.23 gain 123 113 -102.79 gain 113 124 -105.28 gain 124 113 -100.83 gain 113 125 -103.21 gain 125 113 -100.37 gain 113 126 -96.46 gain 126 113 -89.94 gain 113 127 -93.52 gain 127 113 -88.57 gain 113 128 -88.38 gain 128 113 -85.30 gain 113 129 -96.46 gain 129 113 -90.79 gain 113 130 -98.03 gain 130 113 -95.04 gain 113 131 -96.84 gain 131 113 -91.71 gain 113 132 -107.47 gain 132 113 -104.96 gain 113 133 -106.74 gain 133 113 -102.34 gain 113 134 -110.25 gain 134 113 -105.65 gain 113 135 -118.62 gain 135 113 -115.72 gain 113 136 -123.76 gain 136 113 -122.15 gain 113 137 -109.57 gain 137 113 -105.74 gain 113 138 -121.42 gain 138 113 -113.83 gain 113 139 -102.96 gain 139 113 -97.27 gain 113 140 -101.79 gain 140 113 -102.16 gain 113 141 -101.60 gain 141 113 -96.85 gain 113 142 -91.92 gain 142 113 -91.99 gain 113 143 -98.20 gain 143 113 -93.81 gain 113 144 -99.49 gain 144 113 -96.00 gain 113 145 -101.84 gain 145 113 -97.95 gain 113 146 -102.48 gain 146 113 -96.14 gain 113 147 -103.81 gain 147 113 -101.32 gain 113 148 -109.56 gain 148 113 -106.00 gain 113 149 -121.72 gain 149 113 -117.41 gain 113 150 -108.99 gain 150 113 -109.80 gain 113 151 -117.73 gain 151 113 -112.10 gain 113 152 -103.36 gain 152 113 -99.55 gain 113 153 -113.79 gain 153 113 -112.41 gain 113 154 -115.16 gain 154 113 -109.40 gain 113 155 -113.99 gain 155 113 -112.06 gain 113 156 -112.55 gain 156 113 -108.64 gain 113 157 -99.75 gain 157 113 -97.79 gain 113 158 -101.17 gain 158 113 -99.65 gain 113 159 -112.10 gain 159 113 -104.22 gain 113 160 -100.77 gain 160 113 -95.15 gain 113 161 -104.35 gain 161 113 -101.60 gain 113 162 -108.19 gain 162 113 -102.52 gain 113 163 -108.63 gain 163 113 -100.15 gain 113 164 -117.29 gain 164 113 -110.55 gain 113 165 -117.25 gain 165 113 -113.44 gain 113 166 -111.61 gain 166 113 -110.47 gain 113 167 -116.90 gain 167 113 -114.89 gain 113 168 -115.74 gain 168 113 -115.08 gain 113 169 -114.82 gain 169 113 -106.50 gain 113 170 -111.20 gain 170 113 -113.37 gain 113 171 -109.18 gain 171 113 -107.78 gain 113 172 -106.79 gain 172 113 -98.49 gain 113 173 -105.54 gain 173 113 -101.91 gain 113 174 -110.48 gain 174 113 -106.61 gain 113 175 -106.05 gain 175 113 -101.38 gain 113 176 -109.24 gain 176 113 -104.52 gain 113 177 -112.29 gain 177 113 -109.06 gain 113 178 -117.29 gain 178 113 -115.01 gain 113 179 -118.98 gain 179 113 -117.73 gain 113 180 -108.07 gain 180 113 -102.62 gain 113 181 -123.83 gain 181 113 -122.82 gain 113 182 -117.25 gain 182 113 -112.54 gain 113 183 -111.96 gain 183 113 -108.55 gain 113 184 -112.10 gain 184 113 -110.74 gain 113 185 -119.79 gain 185 113 -113.85 gain 113 186 -107.26 gain 186 113 -100.33 gain 113 187 -109.56 gain 187 113 -106.71 gain 113 188 -111.78 gain 188 113 -111.70 gain 113 189 -112.74 gain 189 113 -112.06 gain 113 190 -110.04 gain 190 113 -105.02 gain 113 191 -117.24 gain 191 113 -115.25 gain 113 192 -110.23 gain 192 113 -105.56 gain 113 193 -112.67 gain 193 113 -111.97 gain 113 194 -118.92 gain 194 113 -117.80 gain 113 195 -112.97 gain 195 113 -110.03 gain 113 196 -111.71 gain 196 113 -107.80 gain 113 197 -123.58 gain 197 113 -122.34 gain 113 198 -111.86 gain 198 113 -114.56 gain 113 199 -114.53 gain 199 113 -108.80 gain 113 200 -107.25 gain 200 113 -98.29 gain 113 201 -107.44 gain 201 113 -102.29 gain 113 202 -112.26 gain 202 113 -108.64 gain 113 203 -109.33 gain 203 113 -102.34 gain 113 204 -107.22 gain 204 113 -107.31 gain 113 205 -112.10 gain 205 113 -110.25 gain 113 206 -111.44 gain 206 113 -107.57 gain 113 207 -112.08 gain 207 113 -108.97 gain 113 208 -114.97 gain 208 113 -112.04 gain 113 209 -118.86 gain 209 113 -111.93 gain 113 210 -123.48 gain 210 113 -123.14 gain 113 211 -115.34 gain 211 113 -111.26 gain 113 212 -115.72 gain 212 113 -109.18 gain 113 213 -114.96 gain 213 113 -113.29 gain 113 214 -117.42 gain 214 113 -112.05 gain 113 215 -115.38 gain 215 113 -111.09 gain 113 216 -116.58 gain 216 113 -113.12 gain 113 217 -106.73 gain 217 113 -107.10 gain 113 218 -120.49 gain 218 113 -113.05 gain 113 219 -117.50 gain 219 113 -112.88 gain 113 220 -107.69 gain 220 113 -99.42 gain 113 221 -113.49 gain 221 113 -109.72 gain 113 222 -120.68 gain 222 113 -118.27 gain 113 223 -114.77 gain 223 113 -114.38 gain 113 224 -122.15 gain 224 113 -122.25 gain 114 115 -84.89 gain 115 114 -79.82 gain 114 116 -93.60 gain 116 114 -94.26 gain 114 117 -103.95 gain 117 114 -107.41 gain 114 118 -101.81 gain 118 114 -102.65 gain 114 119 -106.85 gain 119 114 -107.17 gain 114 120 -119.88 gain 120 114 -115.74 gain 114 121 -114.28 gain 121 114 -112.91 gain 114 122 -116.23 gain 122 114 -117.37 gain 114 123 -111.13 gain 123 114 -109.79 gain 114 124 -100.61 gain 124 114 -99.26 gain 114 125 -107.42 gain 125 114 -107.68 gain 114 126 -102.62 gain 126 114 -99.20 gain 114 127 -93.20 gain 127 114 -91.35 gain 114 128 -87.87 gain 128 114 -87.89 gain 114 129 -87.79 gain 129 114 -85.21 gain 114 130 -91.04 gain 130 114 -91.14 gain 114 131 -92.05 gain 131 114 -90.02 gain 114 132 -99.83 gain 132 114 -100.42 gain 114 133 -108.35 gain 133 114 -107.05 gain 114 134 -111.82 gain 134 114 -110.31 gain 114 135 -106.56 gain 135 114 -106.76 gain 114 136 -110.10 gain 136 114 -111.59 gain 114 137 -111.47 gain 137 114 -110.74 gain 114 138 -108.45 gain 138 114 -103.95 gain 114 139 -111.99 gain 139 114 -109.40 gain 114 140 -105.26 gain 140 114 -108.73 gain 114 141 -99.78 gain 141 114 -98.13 gain 114 142 -98.61 gain 142 114 -101.77 gain 114 143 -105.21 gain 143 114 -103.92 gain 114 144 -99.80 gain 144 114 -99.40 gain 114 145 -93.15 gain 145 114 -92.35 gain 114 146 -101.31 gain 146 114 -98.07 gain 114 147 -97.68 gain 147 114 -98.29 gain 114 148 -106.44 gain 148 114 -105.98 gain 114 149 -108.54 gain 149 114 -107.32 gain 114 150 -113.03 gain 150 114 -116.93 gain 114 151 -109.12 gain 151 114 -106.58 gain 114 152 -120.27 gain 152 114 -119.56 gain 114 153 -109.97 gain 153 114 -111.68 gain 114 154 -108.61 gain 154 114 -105.94 gain 114 155 -107.89 gain 155 114 -109.05 gain 114 156 -98.32 gain 156 114 -97.50 gain 114 157 -106.50 gain 157 114 -107.64 gain 114 158 -100.45 gain 158 114 -102.02 gain 114 159 -103.36 gain 159 114 -98.57 gain 114 160 -102.88 gain 160 114 -100.36 gain 114 161 -93.88 gain 161 114 -94.22 gain 114 162 -101.06 gain 162 114 -98.48 gain 114 163 -108.29 gain 163 114 -102.91 gain 114 164 -102.40 gain 164 114 -98.76 gain 114 165 -123.33 gain 165 114 -122.62 gain 114 166 -123.88 gain 166 114 -125.84 gain 114 167 -112.87 gain 167 114 -113.96 gain 114 168 -109.93 gain 168 114 -112.36 gain 114 169 -109.53 gain 169 114 -104.31 gain 114 170 -101.74 gain 170 114 -107.01 gain 114 171 -105.28 gain 171 114 -106.97 gain 114 172 -105.55 gain 172 114 -100.34 gain 114 173 -101.70 gain 173 114 -101.16 gain 114 174 -109.54 gain 174 114 -108.75 gain 114 175 -99.68 gain 175 114 -98.11 gain 114 176 -103.53 gain 176 114 -101.91 gain 114 177 -99.05 gain 177 114 -98.92 gain 114 178 -109.29 gain 178 114 -110.11 gain 114 179 -107.12 gain 179 114 -108.96 gain 114 180 -120.86 gain 180 114 -118.50 gain 114 181 -116.20 gain 181 114 -118.29 gain 114 182 -109.75 gain 182 114 -108.13 gain 114 183 -108.05 gain 183 114 -107.74 gain 114 184 -107.40 gain 184 114 -109.14 gain 114 185 -108.11 gain 185 114 -105.28 gain 114 186 -110.71 gain 186 114 -106.88 gain 114 187 -105.86 gain 187 114 -106.11 gain 114 188 -105.88 gain 188 114 -108.89 gain 114 189 -111.86 gain 189 114 -114.26 gain 114 190 -103.48 gain 190 114 -101.56 gain 114 191 -100.89 gain 191 114 -102.00 gain 114 192 -106.70 gain 192 114 -105.12 gain 114 193 -101.27 gain 193 114 -103.67 gain 114 194 -104.79 gain 194 114 -106.76 gain 114 195 -116.00 gain 195 114 -116.16 gain 114 196 -113.20 gain 196 114 -112.39 gain 114 197 -116.11 gain 197 114 -117.97 gain 114 198 -115.70 gain 198 114 -121.49 gain 114 199 -110.04 gain 199 114 -107.40 gain 114 200 -110.89 gain 200 114 -105.02 gain 114 201 -107.63 gain 201 114 -105.58 gain 114 202 -111.87 gain 202 114 -111.34 gain 114 203 -114.03 gain 203 114 -110.14 gain 114 204 -111.04 gain 204 114 -114.22 gain 114 205 -103.47 gain 205 114 -104.72 gain 114 206 -105.82 gain 206 114 -105.05 gain 114 207 -110.23 gain 207 114 -110.21 gain 114 208 -112.50 gain 208 114 -112.66 gain 114 209 -114.50 gain 209 114 -110.66 gain 114 210 -124.44 gain 210 114 -127.19 gain 114 211 -111.05 gain 211 114 -110.06 gain 114 212 -113.36 gain 212 114 -109.91 gain 114 213 -113.35 gain 213 114 -114.77 gain 114 214 -112.24 gain 214 114 -109.97 gain 114 215 -118.58 gain 215 114 -117.39 gain 114 216 -110.21 gain 216 114 -109.85 gain 114 217 -118.63 gain 217 114 -122.09 gain 114 218 -110.87 gain 218 114 -106.51 gain 114 219 -116.64 gain 219 114 -115.11 gain 114 220 -112.45 gain 220 114 -107.27 gain 114 221 -110.40 gain 221 114 -109.73 gain 114 222 -113.02 gain 222 114 -113.71 gain 114 223 -107.55 gain 223 114 -110.25 gain 114 224 -110.15 gain 224 114 -113.36 gain 115 116 -81.29 gain 116 115 -87.03 gain 115 117 -88.75 gain 117 115 -97.29 gain 115 118 -92.20 gain 118 115 -98.12 gain 115 119 -95.49 gain 119 115 -100.88 gain 115 120 -105.09 gain 120 115 -106.03 gain 115 121 -110.00 gain 121 115 -113.72 gain 115 122 -113.86 gain 122 115 -120.08 gain 115 123 -98.50 gain 123 115 -102.24 gain 115 124 -103.91 gain 124 115 -107.64 gain 115 125 -109.51 gain 125 115 -114.85 gain 115 126 -93.11 gain 126 115 -94.76 gain 115 127 -98.44 gain 127 115 -101.66 gain 115 128 -89.77 gain 128 115 -94.86 gain 115 129 -88.75 gain 129 115 -91.25 gain 115 130 -77.35 gain 130 115 -82.53 gain 115 131 -91.69 gain 131 115 -94.74 gain 115 132 -93.08 gain 132 115 -98.75 gain 115 133 -96.37 gain 133 115 -100.14 gain 115 134 -99.42 gain 134 115 -102.99 gain 115 135 -98.22 gain 135 115 -103.50 gain 115 136 -110.84 gain 136 115 -117.41 gain 115 137 -114.92 gain 137 115 -119.27 gain 115 138 -103.78 gain 138 115 -104.36 gain 115 139 -101.91 gain 139 115 -104.39 gain 115 140 -108.11 gain 140 115 -116.65 gain 115 141 -102.80 gain 141 115 -106.22 gain 115 142 -96.42 gain 142 115 -104.66 gain 115 143 -96.32 gain 143 115 -100.11 gain 115 144 -82.83 gain 144 115 -87.52 gain 115 145 -87.28 gain 145 115 -91.56 gain 115 146 -93.66 gain 146 115 -95.49 gain 115 147 -92.61 gain 147 115 -98.30 gain 115 148 -94.48 gain 148 115 -99.09 gain 115 149 -98.59 gain 149 115 -102.45 gain 115 150 -105.25 gain 150 115 -114.23 gain 115 151 -108.51 gain 151 115 -111.05 gain 115 152 -106.31 gain 152 115 -110.67 gain 115 153 -105.63 gain 153 115 -112.43 gain 115 154 -103.74 gain 154 115 -106.15 gain 115 155 -95.30 gain 155 115 -101.54 gain 115 156 -104.63 gain 156 115 -108.88 gain 115 157 -101.23 gain 157 115 -107.44 gain 115 158 -92.35 gain 158 115 -99.00 gain 115 159 -99.24 gain 159 115 -99.53 gain 115 160 -88.55 gain 160 115 -91.11 gain 115 161 -96.42 gain 161 115 -101.84 gain 115 162 -96.04 gain 162 115 -98.55 gain 115 163 -96.33 gain 163 115 -96.02 gain 115 164 -100.78 gain 164 115 -102.21 gain 115 165 -113.52 gain 165 115 -117.89 gain 115 166 -105.27 gain 166 115 -112.31 gain 115 167 -112.53 gain 167 115 -118.69 gain 115 168 -109.57 gain 168 115 -117.08 gain 115 169 -112.86 gain 169 115 -112.71 gain 115 170 -98.77 gain 170 115 -109.12 gain 115 171 -103.68 gain 171 115 -110.45 gain 115 172 -99.53 gain 172 115 -99.40 gain 115 173 -105.55 gain 173 115 -110.08 gain 115 174 -97.06 gain 174 115 -101.35 gain 115 175 -91.04 gain 175 115 -94.54 gain 115 176 -94.90 gain 176 115 -98.35 gain 115 177 -103.14 gain 177 115 -108.09 gain 115 178 -108.92 gain 178 115 -114.81 gain 115 179 -98.74 gain 179 115 -105.66 gain 115 180 -115.08 gain 180 115 -117.80 gain 115 181 -108.87 gain 181 115 -116.04 gain 115 182 -107.66 gain 182 115 -111.13 gain 115 183 -110.11 gain 183 115 -114.87 gain 115 184 -111.48 gain 184 115 -118.30 gain 115 185 -102.74 gain 185 115 -104.98 gain 115 186 -102.69 gain 186 115 -103.93 gain 115 187 -98.79 gain 187 115 -104.12 gain 115 188 -102.34 gain 188 115 -110.43 gain 115 189 -94.89 gain 189 115 -102.37 gain 115 190 -95.60 gain 190 115 -98.75 gain 115 191 -100.95 gain 191 115 -107.14 gain 115 192 -107.75 gain 192 115 -111.26 gain 115 193 -99.80 gain 193 115 -107.28 gain 115 194 -101.86 gain 194 115 -108.91 gain 115 195 -114.77 gain 195 115 -120.00 gain 115 196 -114.78 gain 196 115 -119.04 gain 115 197 -106.06 gain 197 115 -113.00 gain 115 198 -109.25 gain 198 115 -120.12 gain 115 199 -111.31 gain 199 115 -113.75 gain 115 200 -107.85 gain 200 115 -107.05 gain 115 201 -102.71 gain 201 115 -105.73 gain 115 202 -103.21 gain 202 115 -107.76 gain 115 203 -112.85 gain 203 115 -114.03 gain 115 204 -104.35 gain 204 115 -112.61 gain 115 205 -109.49 gain 205 115 -115.82 gain 115 206 -110.07 gain 206 115 -114.37 gain 115 207 -101.97 gain 207 115 -107.03 gain 115 208 -102.45 gain 208 115 -107.69 gain 115 209 -107.88 gain 209 115 -109.12 gain 115 210 -114.34 gain 210 115 -122.16 gain 115 211 -112.98 gain 211 115 -117.07 gain 115 212 -114.02 gain 212 115 -115.66 gain 115 213 -110.81 gain 213 115 -117.31 gain 115 214 -111.86 gain 214 115 -114.66 gain 115 215 -103.84 gain 215 115 -107.73 gain 115 216 -111.40 gain 216 115 -116.12 gain 115 217 -108.80 gain 217 115 -117.34 gain 115 218 -104.49 gain 218 115 -105.21 gain 115 219 -107.52 gain 219 115 -111.06 gain 115 220 -105.33 gain 220 115 -105.23 gain 115 221 -103.51 gain 221 115 -107.91 gain 115 222 -103.31 gain 222 115 -109.08 gain 115 223 -106.22 gain 223 115 -114.00 gain 115 224 -108.69 gain 224 115 -116.97 gain 116 117 -85.95 gain 117 116 -88.75 gain 116 118 -98.73 gain 118 116 -98.91 gain 116 119 -111.37 gain 119 116 -111.02 gain 116 120 -127.43 gain 120 116 -122.63 gain 116 121 -118.04 gain 121 116 -116.02 gain 116 122 -115.58 gain 122 116 -116.06 gain 116 123 -110.86 gain 123 116 -108.86 gain 116 124 -111.27 gain 124 116 -109.26 gain 116 125 -109.20 gain 125 116 -108.79 gain 116 126 -108.14 gain 126 116 -104.05 gain 116 127 -106.41 gain 127 116 -103.89 gain 116 128 -102.22 gain 128 116 -101.57 gain 116 129 -97.10 gain 129 116 -93.86 gain 116 130 -87.52 gain 130 116 -86.96 gain 116 131 -82.12 gain 131 116 -79.43 gain 116 132 -95.07 gain 132 116 -95.00 gain 116 133 -93.79 gain 133 116 -91.83 gain 116 134 -103.16 gain 134 116 -100.99 gain 116 135 -120.75 gain 135 116 -120.29 gain 116 136 -122.43 gain 136 116 -123.25 gain 116 137 -109.05 gain 137 116 -107.66 gain 116 138 -111.52 gain 138 116 -106.36 gain 116 139 -115.06 gain 139 116 -111.80 gain 116 140 -106.63 gain 140 116 -109.43 gain 116 141 -106.12 gain 141 116 -103.80 gain 116 142 -101.18 gain 142 116 -103.68 gain 116 143 -103.78 gain 143 116 -101.82 gain 116 144 -97.81 gain 144 116 -96.76 gain 116 145 -95.09 gain 145 116 -93.63 gain 116 146 -97.16 gain 146 116 -93.26 gain 116 147 -98.04 gain 147 116 -97.98 gain 116 148 -107.92 gain 148 116 -106.79 gain 116 149 -101.62 gain 149 116 -99.74 gain 116 150 -121.68 gain 150 116 -124.91 gain 116 151 -113.33 gain 151 116 -110.13 gain 116 152 -117.95 gain 152 116 -116.57 gain 116 153 -116.28 gain 153 116 -117.33 gain 116 154 -104.52 gain 154 116 -101.19 gain 116 155 -104.03 gain 155 116 -104.53 gain 116 156 -110.77 gain 156 116 -109.29 gain 116 157 -111.06 gain 157 116 -111.53 gain 116 158 -105.67 gain 158 116 -106.58 gain 116 159 -99.49 gain 159 116 -94.04 gain 116 160 -94.01 gain 160 116 -90.82 gain 116 161 -99.29 gain 161 116 -98.97 gain 116 162 -107.84 gain 162 116 -104.60 gain 116 163 -98.25 gain 163 116 -92.20 gain 116 164 -110.23 gain 164 116 -105.92 gain 116 165 -118.39 gain 165 116 -117.01 gain 116 166 -114.44 gain 166 116 -115.74 gain 116 167 -119.88 gain 167 116 -120.30 gain 116 168 -111.25 gain 168 116 -113.02 gain 116 169 -112.89 gain 169 116 -107.01 gain 116 170 -105.14 gain 170 116 -109.74 gain 116 171 -107.23 gain 171 116 -108.26 gain 116 172 -110.82 gain 172 116 -104.95 gain 116 173 -108.61 gain 173 116 -107.40 gain 116 174 -109.34 gain 174 116 -107.89 gain 116 175 -109.12 gain 175 116 -106.88 gain 116 176 -106.57 gain 176 116 -104.28 gain 116 177 -105.95 gain 177 116 -105.15 gain 116 178 -107.55 gain 178 116 -107.70 gain 116 179 -111.58 gain 179 116 -112.76 gain 116 180 -117.15 gain 180 116 -114.13 gain 116 181 -112.00 gain 181 116 -113.42 gain 116 182 -114.30 gain 182 116 -112.02 gain 116 183 -122.71 gain 183 116 -121.73 gain 116 184 -107.65 gain 184 116 -108.73 gain 116 185 -109.61 gain 185 116 -106.11 gain 116 186 -108.40 gain 186 116 -103.90 gain 116 187 -107.93 gain 187 116 -107.52 gain 116 188 -110.28 gain 188 116 -112.63 gain 116 189 -108.88 gain 189 116 -110.62 gain 116 190 -110.08 gain 190 116 -107.49 gain 116 191 -106.96 gain 191 116 -107.41 gain 116 192 -101.64 gain 192 116 -99.40 gain 116 193 -106.31 gain 193 116 -108.05 gain 116 194 -102.18 gain 194 116 -103.49 gain 116 195 -121.66 gain 195 116 -121.15 gain 116 196 -119.05 gain 196 116 -117.57 gain 116 197 -117.96 gain 197 116 -119.15 gain 116 198 -110.84 gain 198 116 -115.96 gain 116 199 -118.45 gain 199 116 -115.14 gain 116 200 -111.03 gain 200 116 -104.49 gain 116 201 -113.96 gain 201 116 -111.25 gain 116 202 -115.81 gain 202 116 -114.62 gain 116 203 -108.30 gain 203 116 -103.74 gain 116 204 -110.41 gain 204 116 -112.93 gain 116 205 -105.40 gain 205 116 -105.99 gain 116 206 -111.29 gain 206 116 -109.85 gain 116 207 -99.13 gain 207 116 -98.45 gain 116 208 -106.69 gain 208 116 -106.19 gain 116 209 -110.42 gain 209 116 -105.92 gain 116 210 -122.42 gain 210 116 -124.51 gain 116 211 -118.53 gain 211 116 -116.87 gain 116 212 -116.28 gain 212 116 -112.17 gain 116 213 -121.43 gain 213 116 -122.19 gain 116 214 -122.63 gain 214 116 -119.69 gain 116 215 -114.02 gain 215 116 -112.17 gain 116 216 -113.04 gain 216 116 -112.02 gain 116 217 -113.58 gain 217 116 -116.38 gain 116 218 -122.33 gain 218 116 -117.31 gain 116 219 -106.36 gain 219 116 -104.16 gain 116 220 -105.88 gain 220 116 -100.04 gain 116 221 -113.51 gain 221 116 -112.17 gain 116 222 -111.44 gain 222 116 -111.47 gain 116 223 -103.84 gain 223 116 -105.88 gain 116 224 -118.26 gain 224 116 -120.80 gain 117 118 -82.98 gain 118 117 -80.36 gain 117 119 -96.64 gain 119 117 -93.49 gain 117 120 -116.68 gain 120 117 -109.07 gain 117 121 -119.10 gain 121 117 -114.27 gain 117 122 -114.61 gain 122 117 -112.29 gain 117 123 -113.92 gain 123 117 -109.12 gain 117 124 -121.52 gain 124 117 -116.71 gain 117 125 -113.54 gain 125 117 -110.33 gain 117 126 -116.22 gain 126 117 -109.32 gain 117 127 -112.15 gain 127 117 -106.83 gain 117 128 -104.69 gain 128 117 -101.24 gain 117 129 -102.99 gain 129 117 -96.95 gain 117 130 -102.84 gain 130 117 -99.48 gain 117 131 -94.12 gain 131 117 -88.63 gain 117 132 -92.71 gain 132 117 -89.83 gain 117 133 -92.57 gain 133 117 -87.80 gain 117 134 -102.49 gain 134 117 -97.52 gain 117 135 -119.87 gain 135 117 -116.61 gain 117 136 -121.66 gain 136 117 -119.69 gain 117 137 -119.69 gain 137 117 -115.49 gain 117 138 -108.75 gain 138 117 -100.79 gain 117 139 -116.38 gain 139 117 -110.32 gain 117 140 -109.18 gain 140 117 -109.17 gain 117 141 -114.28 gain 141 117 -109.17 gain 117 142 -108.22 gain 142 117 -107.91 gain 117 143 -105.92 gain 143 117 -101.16 gain 117 144 -99.46 gain 144 117 -95.60 gain 117 145 -107.03 gain 145 117 -102.77 gain 117 146 -104.32 gain 146 117 -97.61 gain 117 147 -96.27 gain 147 117 -93.41 gain 117 148 -99.45 gain 148 117 -95.52 gain 117 149 -102.20 gain 149 117 -97.53 gain 117 150 -129.42 gain 150 117 -129.86 gain 117 151 -117.28 gain 151 117 -111.27 gain 117 152 -123.56 gain 152 117 -119.38 gain 117 153 -117.58 gain 153 117 -115.83 gain 117 154 -111.60 gain 154 117 -105.47 gain 117 155 -119.76 gain 155 117 -117.45 gain 117 156 -111.31 gain 156 117 -107.02 gain 117 157 -115.19 gain 157 117 -112.86 gain 117 158 -105.12 gain 158 117 -103.23 gain 117 159 -113.20 gain 159 117 -104.94 gain 117 160 -101.24 gain 160 117 -95.26 gain 117 161 -102.80 gain 161 117 -99.67 gain 117 162 -97.22 gain 162 117 -91.18 gain 117 163 -100.99 gain 163 117 -92.14 gain 117 164 -108.19 gain 164 117 -101.08 gain 117 165 -129.58 gain 165 117 -125.40 gain 117 166 -115.16 gain 166 117 -113.65 gain 117 167 -123.36 gain 167 117 -120.98 gain 117 168 -124.72 gain 168 117 -123.69 gain 117 169 -113.17 gain 169 117 -104.49 gain 117 170 -118.30 gain 170 117 -120.10 gain 117 171 -112.32 gain 171 117 -110.55 gain 117 172 -116.78 gain 172 117 -108.11 gain 117 173 -125.00 gain 173 117 -120.99 gain 117 174 -113.55 gain 174 117 -109.30 gain 117 175 -108.98 gain 175 117 -103.94 gain 117 176 -105.98 gain 176 117 -100.89 gain 117 177 -102.50 gain 177 117 -98.90 gain 117 178 -110.30 gain 178 117 -107.65 gain 117 179 -111.85 gain 179 117 -110.23 gain 117 180 -128.38 gain 180 117 -122.57 gain 117 181 -121.04 gain 181 117 -119.66 gain 117 182 -113.60 gain 182 117 -108.53 gain 117 183 -118.57 gain 183 117 -114.79 gain 117 184 -116.03 gain 184 117 -114.31 gain 117 185 -115.11 gain 185 117 -108.81 gain 117 186 -116.76 gain 186 117 -109.46 gain 117 187 -108.59 gain 187 117 -105.38 gain 117 188 -116.15 gain 188 117 -115.70 gain 117 189 -113.93 gain 189 117 -112.88 gain 117 190 -112.39 gain 190 117 -107.00 gain 117 191 -117.87 gain 191 117 -115.51 gain 117 192 -110.55 gain 192 117 -105.52 gain 117 193 -111.71 gain 193 117 -110.64 gain 117 194 -105.58 gain 194 117 -104.09 gain 117 195 -121.70 gain 195 117 -118.40 gain 117 196 -120.56 gain 196 117 -116.29 gain 117 197 -119.70 gain 197 117 -118.09 gain 117 198 -123.31 gain 198 117 -125.64 gain 117 199 -117.69 gain 199 117 -111.58 gain 117 200 -116.27 gain 200 117 -106.94 gain 117 201 -125.30 gain 201 117 -119.78 gain 117 202 -112.39 gain 202 117 -108.40 gain 117 203 -113.49 gain 203 117 -106.13 gain 117 204 -107.04 gain 204 117 -106.76 gain 117 205 -116.61 gain 205 117 -114.40 gain 117 206 -117.63 gain 206 117 -113.40 gain 117 207 -108.30 gain 207 117 -104.83 gain 117 208 -108.37 gain 208 117 -105.07 gain 117 209 -110.78 gain 209 117 -103.48 gain 117 210 -113.28 gain 210 117 -112.56 gain 117 211 -131.21 gain 211 117 -126.75 gain 117 212 -124.58 gain 212 117 -117.67 gain 117 213 -115.74 gain 213 117 -113.70 gain 117 214 -118.80 gain 214 117 -113.06 gain 117 215 -115.69 gain 215 117 -111.04 gain 117 216 -116.65 gain 216 117 -112.82 gain 117 217 -122.94 gain 217 117 -122.94 gain 117 218 -113.67 gain 218 117 -105.85 gain 117 219 -111.04 gain 219 117 -106.04 gain 117 220 -113.68 gain 220 117 -105.04 gain 117 221 -116.67 gain 221 117 -112.52 gain 117 222 -111.75 gain 222 117 -108.97 gain 117 223 -117.60 gain 223 117 -116.84 gain 117 224 -115.39 gain 224 117 -115.13 gain 118 119 -89.20 gain 119 118 -88.67 gain 118 120 -124.49 gain 120 118 -119.51 gain 118 121 -117.44 gain 121 118 -115.23 gain 118 122 -121.90 gain 122 118 -122.20 gain 118 123 -120.49 gain 123 118 -118.31 gain 118 124 -118.08 gain 124 118 -115.89 gain 118 125 -113.95 gain 125 118 -113.37 gain 118 126 -120.27 gain 126 118 -116.01 gain 118 127 -107.58 gain 127 118 -104.89 gain 118 128 -102.62 gain 128 118 -101.80 gain 118 129 -99.84 gain 129 118 -96.42 gain 118 130 -102.32 gain 130 118 -101.58 gain 118 131 -91.82 gain 131 118 -88.94 gain 118 132 -89.49 gain 132 118 -89.23 gain 118 133 -84.81 gain 133 118 -82.67 gain 118 134 -87.64 gain 134 118 -85.29 gain 118 135 -118.86 gain 135 118 -118.22 gain 118 136 -115.69 gain 136 118 -116.34 gain 118 137 -121.02 gain 137 118 -119.45 gain 118 138 -120.63 gain 138 118 -115.30 gain 118 139 -109.06 gain 139 118 -105.62 gain 118 140 -115.03 gain 140 118 -117.65 gain 118 141 -112.19 gain 141 118 -109.70 gain 118 142 -102.28 gain 142 118 -104.60 gain 118 143 -105.58 gain 143 118 -103.44 gain 118 144 -103.31 gain 144 118 -102.08 gain 118 145 -99.51 gain 145 118 -97.87 gain 118 146 -105.18 gain 146 118 -101.09 gain 118 147 -105.36 gain 147 118 -105.13 gain 118 148 -101.99 gain 148 118 -100.68 gain 118 149 -101.00 gain 149 118 -98.95 gain 118 150 -118.17 gain 150 118 -121.23 gain 118 151 -111.52 gain 151 118 -108.15 gain 118 152 -118.61 gain 152 118 -117.06 gain 118 153 -125.03 gain 153 118 -125.91 gain 118 154 -117.89 gain 154 118 -114.38 gain 118 155 -120.09 gain 155 118 -120.41 gain 118 156 -118.02 gain 156 118 -116.36 gain 118 157 -103.93 gain 157 118 -104.22 gain 118 158 -110.73 gain 158 118 -111.47 gain 118 159 -104.45 gain 159 118 -98.82 gain 118 160 -107.34 gain 160 118 -103.98 gain 118 161 -104.37 gain 161 118 -103.87 gain 118 162 -112.05 gain 162 118 -108.63 gain 118 163 -98.19 gain 163 118 -91.96 gain 118 164 -93.99 gain 164 118 -89.50 gain 118 165 -123.61 gain 165 118 -122.06 gain 118 166 -123.99 gain 166 118 -125.11 gain 118 167 -125.21 gain 167 118 -125.45 gain 118 168 -114.98 gain 168 118 -116.57 gain 118 169 -118.28 gain 169 118 -112.22 gain 118 170 -112.22 gain 170 118 -116.65 gain 118 171 -113.52 gain 171 118 -114.37 gain 118 172 -112.33 gain 172 118 -106.29 gain 118 173 -110.35 gain 173 118 -108.97 gain 118 174 -105.17 gain 174 118 -103.55 gain 118 175 -97.86 gain 175 118 -95.45 gain 118 176 -105.34 gain 176 118 -102.88 gain 118 177 -104.93 gain 177 118 -103.95 gain 118 178 -102.76 gain 178 118 -102.74 gain 118 179 -106.07 gain 179 118 -107.08 gain 118 180 -117.42 gain 180 118 -114.22 gain 118 181 -122.38 gain 181 118 -123.63 gain 118 182 -114.70 gain 182 118 -112.24 gain 118 183 -123.59 gain 183 118 -122.43 gain 118 184 -111.63 gain 184 118 -112.53 gain 118 185 -112.02 gain 185 118 -108.34 gain 118 186 -110.78 gain 186 118 -106.10 gain 118 187 -116.56 gain 187 118 -115.97 gain 118 188 -117.89 gain 188 118 -120.06 gain 118 189 -115.26 gain 189 118 -116.83 gain 118 190 -110.70 gain 190 118 -107.93 gain 118 191 -116.07 gain 191 118 -116.33 gain 118 192 -106.08 gain 192 118 -103.66 gain 118 193 -111.60 gain 193 118 -113.16 gain 118 194 -106.77 gain 194 118 -107.91 gain 118 195 -117.19 gain 195 118 -116.51 gain 118 196 -116.77 gain 196 118 -115.12 gain 118 197 -117.46 gain 197 118 -118.48 gain 118 198 -115.48 gain 198 118 -120.43 gain 118 199 -112.02 gain 199 118 -108.54 gain 118 200 -116.73 gain 200 118 -110.02 gain 118 201 -115.48 gain 201 118 -112.58 gain 118 202 -108.33 gain 202 118 -106.97 gain 118 203 -118.14 gain 203 118 -113.40 gain 118 204 -107.02 gain 204 118 -109.36 gain 118 205 -118.78 gain 205 118 -119.19 gain 118 206 -104.99 gain 206 118 -103.37 gain 118 207 -105.70 gain 207 118 -104.85 gain 118 208 -110.63 gain 208 118 -109.95 gain 118 209 -105.52 gain 209 118 -100.85 gain 118 210 -119.17 gain 210 118 -121.08 gain 118 211 -118.97 gain 211 118 -117.14 gain 118 212 -121.01 gain 212 118 -116.73 gain 118 213 -123.93 gain 213 118 -124.51 gain 118 214 -119.25 gain 214 118 -116.13 gain 118 215 -119.83 gain 215 118 -117.80 gain 118 216 -119.65 gain 216 118 -118.45 gain 118 217 -113.74 gain 217 118 -116.36 gain 118 218 -114.47 gain 218 118 -109.28 gain 118 219 -114.13 gain 219 118 -111.76 gain 118 220 -115.98 gain 220 118 -109.96 gain 118 221 -112.38 gain 221 118 -110.87 gain 118 222 -101.24 gain 222 118 -101.09 gain 118 223 -112.79 gain 223 118 -114.65 gain 118 224 -105.23 gain 224 118 -107.59 gain 119 120 -112.77 gain 120 119 -108.31 gain 119 121 -119.83 gain 121 119 -118.15 gain 119 122 -120.72 gain 122 119 -121.55 gain 119 123 -123.85 gain 123 119 -122.20 gain 119 124 -119.47 gain 124 119 -117.81 gain 119 125 -114.60 gain 125 119 -114.55 gain 119 126 -109.74 gain 126 119 -106.00 gain 119 127 -104.49 gain 127 119 -102.32 gain 119 128 -113.93 gain 128 119 -113.63 gain 119 129 -110.12 gain 129 119 -107.22 gain 119 130 -100.04 gain 130 119 -99.83 gain 119 131 -96.73 gain 131 119 -94.38 gain 119 132 -93.57 gain 132 119 -93.85 gain 119 133 -92.00 gain 133 119 -90.38 gain 119 134 -88.49 gain 134 119 -86.67 gain 119 135 -115.98 gain 135 119 -115.87 gain 119 136 -126.65 gain 136 119 -127.83 gain 119 137 -114.49 gain 137 119 -113.45 gain 119 138 -117.16 gain 138 119 -112.35 gain 119 139 -112.80 gain 139 119 -109.89 gain 119 140 -115.61 gain 140 119 -118.76 gain 119 141 -116.90 gain 141 119 -114.93 gain 119 142 -115.17 gain 142 119 -118.02 gain 119 143 -109.01 gain 143 119 -107.40 gain 119 144 -109.24 gain 144 119 -108.53 gain 119 145 -105.84 gain 145 119 -104.73 gain 119 146 -104.30 gain 146 119 -100.74 gain 119 147 -95.85 gain 147 119 -96.14 gain 119 148 -96.20 gain 148 119 -95.42 gain 119 149 -91.40 gain 149 119 -89.87 gain 119 150 -122.09 gain 150 119 -125.67 gain 119 151 -123.37 gain 151 119 -120.52 gain 119 152 -116.91 gain 152 119 -115.88 gain 119 153 -111.80 gain 153 119 -113.20 gain 119 154 -117.41 gain 154 119 -114.43 gain 119 155 -119.65 gain 155 119 -120.50 gain 119 156 -112.43 gain 156 119 -111.29 gain 119 157 -109.98 gain 157 119 -110.80 gain 119 158 -109.06 gain 158 119 -110.32 gain 119 159 -108.39 gain 159 119 -103.29 gain 119 160 -107.45 gain 160 119 -104.62 gain 119 161 -104.64 gain 161 119 -104.66 gain 119 162 -106.33 gain 162 119 -103.44 gain 119 163 -102.86 gain 163 119 -97.15 gain 119 164 -94.19 gain 164 119 -90.23 gain 119 165 -113.68 gain 165 119 -112.65 gain 119 166 -116.36 gain 166 119 -118.00 gain 119 167 -127.73 gain 167 119 -128.50 gain 119 168 -116.14 gain 168 119 -118.26 gain 119 169 -112.10 gain 169 119 -106.56 gain 119 170 -115.28 gain 170 119 -120.23 gain 119 171 -116.08 gain 171 119 -117.46 gain 119 172 -106.75 gain 172 119 -101.23 gain 119 173 -115.07 gain 173 119 -114.21 gain 119 174 -95.20 gain 174 119 -94.10 gain 119 175 -104.85 gain 175 119 -102.96 gain 119 176 -109.08 gain 176 119 -107.14 gain 119 177 -105.10 gain 177 119 -104.65 gain 119 178 -103.07 gain 178 119 -103.57 gain 119 179 -111.06 gain 179 119 -112.59 gain 119 180 -128.71 gain 180 119 -126.04 gain 119 181 -120.67 gain 181 119 -122.44 gain 119 182 -115.98 gain 182 119 -114.05 gain 119 183 -117.26 gain 183 119 -116.63 gain 119 184 -127.54 gain 184 119 -128.96 gain 119 185 -119.57 gain 185 119 -116.42 gain 119 186 -122.80 gain 186 119 -118.65 gain 119 187 -113.24 gain 187 119 -113.17 gain 119 188 -109.24 gain 188 119 -111.94 gain 119 189 -101.92 gain 189 119 -104.01 gain 119 190 -110.06 gain 190 119 -107.82 gain 119 191 -107.65 gain 191 119 -108.44 gain 119 192 -106.08 gain 192 119 -104.19 gain 119 193 -107.16 gain 193 119 -109.25 gain 119 194 -100.37 gain 194 119 -102.03 gain 119 195 -123.96 gain 195 119 -123.80 gain 119 196 -112.58 gain 196 119 -111.45 gain 119 197 -121.31 gain 197 119 -122.86 gain 119 198 -116.03 gain 198 119 -121.50 gain 119 199 -114.45 gain 199 119 -111.49 gain 119 200 -120.41 gain 200 119 -114.22 gain 119 201 -113.93 gain 201 119 -111.56 gain 119 202 -122.06 gain 202 119 -121.21 gain 119 203 -108.46 gain 203 119 -104.24 gain 119 204 -114.42 gain 204 119 -117.29 gain 119 205 -111.45 gain 205 119 -112.38 gain 119 206 -116.45 gain 206 119 -115.36 gain 119 207 -112.31 gain 207 119 -111.99 gain 119 208 -108.27 gain 208 119 -108.12 gain 119 209 -110.54 gain 209 119 -106.39 gain 119 210 -117.04 gain 210 119 -119.47 gain 119 211 -122.73 gain 211 119 -121.42 gain 119 212 -121.38 gain 212 119 -117.62 gain 119 213 -120.54 gain 213 119 -121.65 gain 119 214 -122.61 gain 214 119 -120.02 gain 119 215 -116.19 gain 215 119 -114.68 gain 119 216 -118.63 gain 216 119 -117.95 gain 119 217 -110.53 gain 217 119 -113.67 gain 119 218 -118.77 gain 218 119 -114.10 gain 119 219 -116.48 gain 219 119 -114.64 gain 119 220 -113.95 gain 220 119 -108.46 gain 119 221 -114.38 gain 221 119 -113.39 gain 119 222 -111.76 gain 222 119 -112.14 gain 119 223 -109.12 gain 223 119 -111.50 gain 119 224 -104.72 gain 224 119 -107.60 gain 120 121 -87.05 gain 121 120 -89.82 gain 120 122 -88.86 gain 122 120 -94.15 gain 120 123 -99.68 gain 123 120 -102.47 gain 120 124 -99.76 gain 124 120 -102.55 gain 120 125 -105.58 gain 125 120 -109.98 gain 120 126 -100.92 gain 126 120 -101.63 gain 120 127 -107.54 gain 127 120 -109.83 gain 120 128 -105.21 gain 128 120 -109.36 gain 120 129 -110.33 gain 129 120 -111.89 gain 120 130 -107.81 gain 130 120 -112.05 gain 120 131 -108.57 gain 131 120 -110.68 gain 120 132 -113.11 gain 132 120 -117.84 gain 120 133 -111.01 gain 133 120 -113.84 gain 120 134 -112.51 gain 134 120 -115.14 gain 120 135 -89.31 gain 135 120 -93.65 gain 120 136 -87.18 gain 136 120 -92.81 gain 120 137 -94.40 gain 137 120 -97.81 gain 120 138 -97.20 gain 138 120 -96.84 gain 120 139 -91.61 gain 139 120 -93.15 gain 120 140 -102.24 gain 140 120 -109.84 gain 120 141 -100.90 gain 141 120 -103.39 gain 120 142 -105.36 gain 142 120 -112.66 gain 120 143 -103.75 gain 143 120 -106.60 gain 120 144 -114.90 gain 144 120 -118.65 gain 120 145 -112.15 gain 145 120 -115.49 gain 120 146 -111.66 gain 146 120 -112.56 gain 120 147 -115.26 gain 147 120 -120.01 gain 120 148 -116.84 gain 148 120 -120.52 gain 120 149 -112.58 gain 149 120 -115.51 gain 120 150 -92.81 gain 150 120 -100.85 gain 120 151 -90.40 gain 151 120 -92.00 gain 120 152 -95.43 gain 152 120 -98.85 gain 120 153 -100.19 gain 153 120 -106.04 gain 120 154 -104.01 gain 154 120 -105.48 gain 120 155 -107.53 gain 155 120 -112.83 gain 120 156 -103.87 gain 156 120 -107.19 gain 120 157 -109.75 gain 157 120 -115.02 gain 120 158 -112.37 gain 158 120 -118.08 gain 120 159 -110.52 gain 159 120 -109.87 gain 120 160 -109.86 gain 160 120 -111.48 gain 120 161 -109.17 gain 161 120 -113.65 gain 120 162 -108.40 gain 162 120 -109.96 gain 120 163 -109.87 gain 163 120 -108.62 gain 120 164 -113.97 gain 164 120 -114.46 gain 120 165 -96.02 gain 165 120 -99.44 gain 120 166 -99.69 gain 166 120 -105.79 gain 120 167 -104.81 gain 167 120 -110.03 gain 120 168 -100.90 gain 168 120 -107.47 gain 120 169 -98.93 gain 169 120 -97.85 gain 120 170 -105.50 gain 170 120 -114.91 gain 120 171 -109.46 gain 171 120 -115.30 gain 120 172 -104.91 gain 172 120 -103.84 gain 120 173 -114.15 gain 173 120 -117.74 gain 120 174 -115.45 gain 174 120 -118.80 gain 120 175 -115.46 gain 175 120 -118.02 gain 120 176 -112.84 gain 176 120 -115.35 gain 120 177 -110.72 gain 177 120 -114.72 gain 120 178 -112.35 gain 178 120 -117.30 gain 120 179 -112.25 gain 179 120 -118.24 gain 120 180 -105.12 gain 180 120 -106.90 gain 120 181 -99.13 gain 181 120 -105.35 gain 120 182 -98.08 gain 182 120 -100.61 gain 120 183 -104.03 gain 183 120 -107.85 gain 120 184 -97.63 gain 184 120 -103.50 gain 120 185 -104.94 gain 185 120 -106.24 gain 120 186 -109.92 gain 186 120 -110.22 gain 120 187 -109.88 gain 187 120 -114.27 gain 120 188 -115.92 gain 188 120 -123.07 gain 120 189 -113.81 gain 189 120 -120.36 gain 120 190 -115.34 gain 190 120 -117.55 gain 120 191 -110.01 gain 191 120 -115.26 gain 120 192 -110.59 gain 192 120 -113.15 gain 120 193 -121.57 gain 193 120 -128.11 gain 120 194 -113.70 gain 194 120 -119.81 gain 120 195 -112.24 gain 195 120 -116.54 gain 120 196 -107.68 gain 196 120 -111.00 gain 120 197 -103.20 gain 197 120 -109.20 gain 120 198 -98.56 gain 198 120 -108.49 gain 120 199 -101.01 gain 199 120 -102.51 gain 120 200 -104.72 gain 200 120 -102.99 gain 120 201 -108.38 gain 201 120 -110.46 gain 120 202 -110.25 gain 202 120 -113.86 gain 120 203 -106.08 gain 203 120 -106.32 gain 120 204 -109.52 gain 204 120 -116.84 gain 120 205 -108.80 gain 205 120 -114.19 gain 120 206 -108.67 gain 206 120 -112.04 gain 120 207 -111.25 gain 207 120 -115.38 gain 120 208 -111.37 gain 208 120 -115.67 gain 120 209 -119.97 gain 209 120 -120.27 gain 120 210 -110.82 gain 210 120 -117.71 gain 120 211 -104.80 gain 211 120 -107.95 gain 120 212 -101.02 gain 212 120 -101.71 gain 120 213 -100.94 gain 213 120 -106.50 gain 120 214 -100.48 gain 214 120 -102.35 gain 120 215 -105.19 gain 215 120 -108.14 gain 120 216 -103.73 gain 216 120 -107.51 gain 120 217 -108.50 gain 217 120 -116.10 gain 120 218 -112.60 gain 218 120 -112.38 gain 120 219 -110.16 gain 219 120 -112.77 gain 120 220 -119.57 gain 220 120 -118.53 gain 120 221 -114.51 gain 221 120 -117.97 gain 120 222 -116.43 gain 222 120 -121.27 gain 120 223 -105.43 gain 223 120 -112.27 gain 120 224 -121.21 gain 224 120 -128.55 gain 121 122 -82.18 gain 122 121 -84.69 gain 121 123 -92.36 gain 123 121 -92.38 gain 121 124 -94.56 gain 124 121 -94.58 gain 121 125 -95.94 gain 125 121 -97.56 gain 121 126 -102.44 gain 126 121 -100.37 gain 121 127 -102.54 gain 127 121 -102.06 gain 121 128 -112.14 gain 128 121 -113.52 gain 121 129 -105.55 gain 129 121 -104.34 gain 121 130 -106.81 gain 130 121 -108.28 gain 121 131 -115.54 gain 131 121 -114.87 gain 121 132 -116.46 gain 132 121 -118.42 gain 121 133 -114.19 gain 133 121 -114.25 gain 121 134 -114.53 gain 134 121 -114.39 gain 121 135 -89.29 gain 135 121 -90.86 gain 121 136 -81.76 gain 136 121 -84.61 gain 121 137 -88.04 gain 137 121 -88.67 gain 121 138 -89.93 gain 138 121 -86.80 gain 121 139 -96.80 gain 139 121 -95.57 gain 121 140 -108.86 gain 140 121 -113.69 gain 121 141 -112.33 gain 141 121 -112.05 gain 121 142 -108.07 gain 142 121 -112.60 gain 121 143 -108.74 gain 143 121 -108.81 gain 121 144 -112.17 gain 144 121 -113.14 gain 121 145 -107.22 gain 145 121 -107.79 gain 121 146 -113.52 gain 146 121 -111.64 gain 121 147 -114.77 gain 147 121 -116.75 gain 121 148 -110.30 gain 148 121 -111.20 gain 121 149 -115.79 gain 149 121 -115.94 gain 121 150 -93.09 gain 150 121 -98.35 gain 121 151 -97.04 gain 151 121 -95.87 gain 121 152 -95.88 gain 152 121 -96.53 gain 121 153 -97.15 gain 153 121 -100.24 gain 121 154 -103.86 gain 154 121 -102.55 gain 121 155 -102.39 gain 155 121 -104.92 gain 121 156 -100.31 gain 156 121 -100.86 gain 121 157 -104.31 gain 157 121 -106.81 gain 121 158 -117.27 gain 158 121 -120.21 gain 121 159 -114.51 gain 159 121 -111.08 gain 121 160 -112.61 gain 160 121 -111.46 gain 121 161 -113.59 gain 161 121 -115.30 gain 121 162 -111.43 gain 162 121 -110.22 gain 121 163 -115.11 gain 163 121 -111.09 gain 121 164 -120.45 gain 164 121 -118.17 gain 121 165 -99.49 gain 165 121 -100.14 gain 121 166 -105.05 gain 166 121 -108.38 gain 121 167 -103.61 gain 167 121 -106.06 gain 121 168 -99.83 gain 168 121 -103.63 gain 121 169 -104.88 gain 169 121 -101.03 gain 121 170 -100.20 gain 170 121 -106.83 gain 121 171 -108.74 gain 171 121 -111.81 gain 121 172 -105.61 gain 172 121 -101.77 gain 121 173 -107.28 gain 173 121 -108.10 gain 121 174 -110.67 gain 174 121 -111.25 gain 121 175 -112.91 gain 175 121 -112.70 gain 121 176 -120.19 gain 176 121 -119.93 gain 121 177 -120.16 gain 177 121 -121.39 gain 121 178 -115.67 gain 178 121 -117.85 gain 121 179 -121.09 gain 179 121 -124.30 gain 121 180 -101.16 gain 180 121 -100.17 gain 121 181 -103.49 gain 181 121 -106.94 gain 121 182 -100.47 gain 182 121 -100.22 gain 121 183 -101.36 gain 183 121 -102.41 gain 121 184 -107.27 gain 184 121 -110.38 gain 121 185 -105.61 gain 185 121 -104.14 gain 121 186 -110.16 gain 186 121 -107.69 gain 121 187 -108.47 gain 187 121 -110.09 gain 121 188 -111.46 gain 188 121 -115.84 gain 121 189 -109.79 gain 189 121 -113.56 gain 121 190 -118.34 gain 190 121 -117.78 gain 121 191 -112.90 gain 191 121 -115.37 gain 121 192 -112.42 gain 192 121 -112.22 gain 121 193 -119.30 gain 193 121 -123.07 gain 121 194 -119.26 gain 194 121 -122.59 gain 121 195 -101.40 gain 195 121 -102.92 gain 121 196 -111.72 gain 196 121 -112.27 gain 121 197 -106.54 gain 197 121 -109.76 gain 121 198 -108.82 gain 198 121 -115.98 gain 121 199 -115.86 gain 199 121 -114.58 gain 121 200 -116.63 gain 200 121 -112.12 gain 121 201 -107.44 gain 201 121 -106.75 gain 121 202 -108.43 gain 202 121 -109.27 gain 121 203 -109.65 gain 203 121 -107.11 gain 121 204 -108.69 gain 204 121 -113.24 gain 121 205 -116.35 gain 205 121 -118.97 gain 121 206 -119.09 gain 206 121 -119.69 gain 121 207 -114.23 gain 207 121 -115.58 gain 121 208 -116.59 gain 208 121 -118.11 gain 121 209 -120.80 gain 209 121 -118.33 gain 121 210 -111.55 gain 210 121 -115.66 gain 121 211 -110.82 gain 211 121 -111.19 gain 121 212 -110.46 gain 212 121 -108.38 gain 121 213 -105.98 gain 213 121 -108.77 gain 121 214 -104.45 gain 214 121 -103.54 gain 121 215 -107.92 gain 215 121 -108.10 gain 121 216 -119.43 gain 216 121 -120.44 gain 121 217 -109.50 gain 217 121 -114.32 gain 121 218 -108.26 gain 218 121 -105.28 gain 121 219 -115.71 gain 219 121 -115.55 gain 121 220 -113.73 gain 220 121 -109.91 gain 121 221 -122.19 gain 221 121 -122.88 gain 121 222 -113.31 gain 222 121 -115.37 gain 121 223 -119.53 gain 223 121 -123.60 gain 121 224 -121.18 gain 224 121 -125.74 gain 122 123 -81.25 gain 123 122 -78.77 gain 122 124 -98.72 gain 124 122 -96.22 gain 122 125 -106.11 gain 125 122 -105.22 gain 122 126 -104.81 gain 126 122 -100.24 gain 122 127 -110.91 gain 127 122 -107.91 gain 122 128 -111.79 gain 128 122 -110.67 gain 122 129 -113.29 gain 129 122 -109.57 gain 122 130 -111.55 gain 130 122 -110.51 gain 122 131 -111.68 gain 131 122 -108.50 gain 122 132 -112.15 gain 132 122 -111.59 gain 122 133 -125.57 gain 133 122 -123.13 gain 122 134 -118.47 gain 134 122 -115.82 gain 122 135 -97.43 gain 135 122 -96.48 gain 122 136 -93.29 gain 136 122 -93.63 gain 122 137 -79.45 gain 137 122 -77.57 gain 122 138 -93.60 gain 138 122 -87.96 gain 122 139 -95.20 gain 139 122 -91.46 gain 122 140 -98.65 gain 140 122 -100.97 gain 122 141 -104.90 gain 141 122 -102.11 gain 122 142 -108.71 gain 142 122 -110.73 gain 122 143 -108.44 gain 143 122 -106.00 gain 122 144 -113.42 gain 144 122 -111.89 gain 122 145 -114.26 gain 145 122 -112.32 gain 122 146 -114.22 gain 146 122 -109.84 gain 122 147 -118.85 gain 147 122 -118.31 gain 122 148 -119.49 gain 148 122 -117.88 gain 122 149 -118.11 gain 149 122 -115.75 gain 122 150 -102.28 gain 150 122 -105.03 gain 122 151 -101.41 gain 151 122 -97.73 gain 122 152 -97.15 gain 152 122 -95.29 gain 122 153 -99.15 gain 153 122 -99.72 gain 122 154 -103.13 gain 154 122 -99.32 gain 122 155 -100.11 gain 155 122 -100.13 gain 122 156 -107.82 gain 156 122 -105.86 gain 122 157 -109.19 gain 157 122 -109.19 gain 122 158 -103.05 gain 158 122 -103.48 gain 122 159 -110.09 gain 159 122 -104.16 gain 122 160 -112.71 gain 160 122 -109.05 gain 122 161 -114.62 gain 161 122 -113.82 gain 122 162 -114.57 gain 162 122 -110.85 gain 122 163 -111.54 gain 163 122 -105.01 gain 122 164 -122.17 gain 164 122 -117.38 gain 122 165 -104.78 gain 165 122 -102.92 gain 122 166 -93.94 gain 166 122 -94.76 gain 122 167 -100.26 gain 167 122 -100.20 gain 122 168 -97.19 gain 168 122 -98.48 gain 122 169 -100.32 gain 169 122 -93.95 gain 122 170 -100.18 gain 170 122 -104.31 gain 122 171 -102.92 gain 171 122 -103.47 gain 122 172 -98.81 gain 172 122 -92.46 gain 122 173 -106.83 gain 173 122 -105.14 gain 122 174 -113.48 gain 174 122 -111.55 gain 122 175 -122.04 gain 175 122 -119.32 gain 122 176 -122.94 gain 176 122 -120.17 gain 122 177 -119.23 gain 177 122 -117.96 gain 122 178 -124.92 gain 178 122 -124.59 gain 122 179 -118.00 gain 179 122 -118.70 gain 122 180 -106.16 gain 180 122 -102.66 gain 122 181 -105.24 gain 181 122 -106.18 gain 122 182 -107.34 gain 182 122 -104.58 gain 122 183 -109.93 gain 183 122 -108.48 gain 122 184 -113.53 gain 184 122 -114.12 gain 122 185 -103.57 gain 185 122 -99.59 gain 122 186 -110.37 gain 186 122 -105.39 gain 122 187 -108.71 gain 187 122 -107.82 gain 122 188 -116.17 gain 188 122 -118.04 gain 122 189 -116.76 gain 189 122 -118.03 gain 122 190 -110.18 gain 190 122 -107.11 gain 122 191 -113.81 gain 191 122 -113.78 gain 122 192 -124.02 gain 192 122 -121.30 gain 122 193 -118.00 gain 193 122 -119.26 gain 122 194 -120.71 gain 194 122 -121.54 gain 122 195 -103.55 gain 195 122 -102.57 gain 122 196 -105.95 gain 196 122 -103.99 gain 122 197 -113.74 gain 197 122 -114.45 gain 122 198 -104.63 gain 198 122 -109.28 gain 122 199 -102.79 gain 199 122 -99.01 gain 122 200 -107.64 gain 200 122 -100.62 gain 122 201 -104.05 gain 201 122 -100.85 gain 122 202 -115.48 gain 202 122 -113.81 gain 122 203 -108.45 gain 203 122 -103.41 gain 122 204 -112.60 gain 204 122 -114.64 gain 122 205 -108.53 gain 205 122 -108.63 gain 122 206 -115.84 gain 206 122 -113.93 gain 122 207 -119.40 gain 207 122 -118.24 gain 122 208 -123.94 gain 208 122 -122.95 gain 122 209 -120.36 gain 209 122 -115.38 gain 122 210 -109.77 gain 210 122 -111.38 gain 122 211 -109.53 gain 211 122 -107.40 gain 122 212 -109.43 gain 212 122 -104.84 gain 122 213 -106.35 gain 213 122 -106.63 gain 122 214 -106.04 gain 214 122 -102.62 gain 122 215 -116.11 gain 215 122 -113.78 gain 122 216 -116.28 gain 216 122 -114.78 gain 122 217 -117.05 gain 217 122 -119.37 gain 122 218 -115.22 gain 218 122 -109.72 gain 122 219 -105.50 gain 219 122 -102.82 gain 122 220 -116.44 gain 220 122 -110.12 gain 122 221 -117.32 gain 221 122 -115.50 gain 122 222 -117.67 gain 222 122 -117.22 gain 122 223 -115.81 gain 223 122 -117.37 gain 122 224 -122.44 gain 224 122 -124.50 gain 123 124 -86.17 gain 124 123 -86.16 gain 123 125 -96.13 gain 125 123 -97.72 gain 123 126 -103.54 gain 126 123 -101.46 gain 123 127 -91.53 gain 127 123 -91.02 gain 123 128 -105.01 gain 128 123 -106.36 gain 123 129 -116.78 gain 129 123 -115.54 gain 123 130 -112.26 gain 130 123 -113.71 gain 123 131 -107.01 gain 131 123 -106.32 gain 123 132 -118.47 gain 132 123 -120.40 gain 123 133 -114.54 gain 133 123 -114.57 gain 123 134 -114.92 gain 134 123 -114.75 gain 123 135 -99.88 gain 135 123 -101.42 gain 123 136 -89.53 gain 136 123 -92.36 gain 123 137 -87.26 gain 137 123 -87.87 gain 123 138 -81.70 gain 138 123 -78.55 gain 123 139 -82.49 gain 139 123 -81.23 gain 123 140 -91.44 gain 140 123 -96.24 gain 123 141 -101.50 gain 141 123 -101.19 gain 123 142 -99.40 gain 142 123 -103.90 gain 123 143 -106.75 gain 143 123 -106.79 gain 123 144 -111.50 gain 144 123 -112.45 gain 123 145 -116.68 gain 145 123 -117.23 gain 123 146 -108.08 gain 146 123 -106.18 gain 123 147 -117.32 gain 147 123 -119.27 gain 123 148 -113.69 gain 148 123 -114.57 gain 123 149 -116.87 gain 149 123 -117.00 gain 123 150 -106.15 gain 150 123 -111.39 gain 123 151 -101.02 gain 151 123 -99.82 gain 123 152 -91.94 gain 152 123 -92.57 gain 123 153 -98.79 gain 153 123 -101.85 gain 123 154 -99.34 gain 154 123 -98.02 gain 123 155 -95.24 gain 155 123 -97.74 gain 123 156 -102.57 gain 156 123 -103.09 gain 123 157 -104.55 gain 157 123 -107.03 gain 123 158 -101.30 gain 158 123 -104.21 gain 123 159 -107.03 gain 159 123 -103.58 gain 123 160 -113.21 gain 160 123 -112.03 gain 123 161 -110.92 gain 161 123 -112.60 gain 123 162 -113.26 gain 162 123 -112.03 gain 123 163 -111.14 gain 163 123 -107.09 gain 123 164 -114.48 gain 164 123 -112.18 gain 123 165 -107.53 gain 165 123 -108.16 gain 123 166 -98.89 gain 166 123 -102.20 gain 123 167 -99.61 gain 167 123 -102.04 gain 123 168 -97.97 gain 168 123 -101.74 gain 123 169 -97.17 gain 169 123 -93.29 gain 123 170 -103.43 gain 170 123 -110.04 gain 123 171 -104.37 gain 171 123 -107.41 gain 123 172 -101.86 gain 172 123 -98.00 gain 123 173 -106.50 gain 173 123 -107.30 gain 123 174 -114.76 gain 174 123 -115.32 gain 123 175 -102.25 gain 175 123 -102.02 gain 123 176 -113.61 gain 176 123 -113.33 gain 123 177 -112.60 gain 177 123 -113.81 gain 123 178 -115.06 gain 178 123 -117.21 gain 123 179 -113.46 gain 179 123 -116.64 gain 123 180 -96.86 gain 180 123 -95.84 gain 123 181 -103.30 gain 181 123 -106.72 gain 123 182 -105.19 gain 182 123 -104.92 gain 123 183 -100.96 gain 183 123 -101.99 gain 123 184 -102.66 gain 184 123 -105.74 gain 123 185 -105.66 gain 185 123 -104.16 gain 123 186 -106.73 gain 186 123 -104.24 gain 123 187 -106.23 gain 187 123 -107.82 gain 123 188 -110.59 gain 188 123 -114.95 gain 123 189 -105.69 gain 189 123 -109.43 gain 123 190 -110.80 gain 190 123 -110.21 gain 123 191 -112.15 gain 191 123 -114.60 gain 123 192 -112.41 gain 192 123 -112.18 gain 123 193 -115.82 gain 193 123 -119.56 gain 123 194 -115.50 gain 194 123 -118.81 gain 123 195 -112.94 gain 195 123 -114.45 gain 123 196 -105.19 gain 196 123 -105.72 gain 123 197 -102.52 gain 197 123 -105.72 gain 123 198 -100.28 gain 198 123 -107.42 gain 123 199 -105.72 gain 199 123 -104.42 gain 123 200 -112.44 gain 200 123 -107.91 gain 123 201 -105.34 gain 201 123 -104.63 gain 123 202 -100.57 gain 202 123 -101.39 gain 123 203 -109.78 gain 203 123 -107.23 gain 123 204 -114.03 gain 204 123 -118.56 gain 123 205 -113.81 gain 205 123 -116.41 gain 123 206 -120.00 gain 206 123 -120.57 gain 123 207 -114.56 gain 207 123 -115.89 gain 123 208 -121.34 gain 208 123 -122.84 gain 123 209 -116.58 gain 209 123 -114.09 gain 123 210 -113.12 gain 210 123 -117.21 gain 123 211 -109.80 gain 211 123 -110.15 gain 123 212 -104.34 gain 212 123 -102.23 gain 123 213 -112.78 gain 213 123 -115.54 gain 123 214 -110.45 gain 214 123 -109.52 gain 123 215 -103.85 gain 215 123 -104.00 gain 123 216 -110.62 gain 216 123 -111.60 gain 123 217 -114.51 gain 217 123 -119.31 gain 123 218 -105.50 gain 218 123 -102.49 gain 123 219 -104.89 gain 219 123 -104.70 gain 123 220 -110.31 gain 220 123 -106.47 gain 123 221 -116.17 gain 221 123 -116.83 gain 123 222 -121.99 gain 222 123 -124.02 gain 123 223 -114.07 gain 223 123 -118.11 gain 123 224 -121.45 gain 224 123 -125.99 gain 124 125 -77.60 gain 125 124 -79.21 gain 124 126 -98.48 gain 126 124 -96.40 gain 124 127 -96.81 gain 127 124 -96.31 gain 124 128 -102.70 gain 128 124 -104.07 gain 124 129 -98.33 gain 129 124 -97.10 gain 124 130 -106.15 gain 130 124 -107.60 gain 124 131 -115.53 gain 131 124 -114.84 gain 124 132 -110.88 gain 132 124 -112.81 gain 124 133 -112.76 gain 133 124 -112.80 gain 124 134 -112.90 gain 134 124 -112.74 gain 124 135 -98.81 gain 135 124 -100.36 gain 124 136 -103.30 gain 136 124 -106.14 gain 124 137 -91.81 gain 137 124 -92.43 gain 124 138 -85.75 gain 138 124 -82.60 gain 124 139 -80.18 gain 139 124 -78.93 gain 124 140 -93.47 gain 140 124 -98.28 gain 124 141 -98.03 gain 141 124 -97.73 gain 124 142 -107.51 gain 142 124 -112.02 gain 124 143 -98.89 gain 143 124 -98.94 gain 124 144 -104.13 gain 144 124 -105.08 gain 124 145 -100.40 gain 145 124 -100.95 gain 124 146 -109.71 gain 146 124 -107.82 gain 124 147 -111.56 gain 147 124 -113.51 gain 124 148 -111.62 gain 148 124 -112.50 gain 124 149 -114.67 gain 149 124 -114.80 gain 124 150 -108.16 gain 150 124 -113.41 gain 124 151 -100.25 gain 151 124 -99.06 gain 124 152 -104.49 gain 152 124 -105.13 gain 124 153 -98.13 gain 153 124 -101.19 gain 124 154 -92.09 gain 154 124 -90.77 gain 124 155 -98.81 gain 155 124 -101.32 gain 124 156 -102.00 gain 156 124 -102.52 gain 124 157 -109.02 gain 157 124 -111.50 gain 124 158 -100.12 gain 158 124 -103.05 gain 124 159 -98.88 gain 159 124 -95.44 gain 124 160 -114.02 gain 160 124 -112.85 gain 124 161 -108.87 gain 161 124 -110.56 gain 124 162 -108.90 gain 162 124 -107.67 gain 124 163 -109.53 gain 163 124 -105.48 gain 124 164 -119.09 gain 164 124 -116.79 gain 124 165 -95.59 gain 165 124 -96.23 gain 124 166 -101.27 gain 166 124 -104.58 gain 124 167 -102.12 gain 167 124 -104.55 gain 124 168 -103.69 gain 168 124 -107.47 gain 124 169 -104.37 gain 169 124 -100.50 gain 124 170 -102.27 gain 170 124 -108.89 gain 124 171 -107.16 gain 171 124 -110.20 gain 124 172 -102.80 gain 172 124 -98.95 gain 124 173 -107.54 gain 173 124 -108.35 gain 124 174 -111.26 gain 174 124 -111.83 gain 124 175 -113.30 gain 175 124 -113.07 gain 124 176 -102.82 gain 176 124 -102.54 gain 124 177 -107.24 gain 177 124 -108.45 gain 124 178 -116.10 gain 178 124 -118.26 gain 124 179 -115.40 gain 179 124 -118.59 gain 124 180 -100.16 gain 180 124 -99.16 gain 124 181 -105.32 gain 181 124 -108.76 gain 124 182 -104.19 gain 182 124 -103.92 gain 124 183 -102.18 gain 183 124 -103.21 gain 124 184 -105.00 gain 184 124 -108.09 gain 124 185 -101.86 gain 185 124 -100.37 gain 124 186 -108.64 gain 186 124 -106.15 gain 124 187 -104.56 gain 187 124 -106.16 gain 124 188 -106.98 gain 188 124 -111.34 gain 124 189 -100.88 gain 189 124 -104.63 gain 124 190 -108.36 gain 190 124 -107.78 gain 124 191 -113.78 gain 191 124 -116.24 gain 124 192 -121.49 gain 192 124 -121.26 gain 124 193 -105.63 gain 193 124 -109.38 gain 124 194 -108.86 gain 194 124 -112.18 gain 124 195 -100.93 gain 195 124 -102.44 gain 124 196 -105.88 gain 196 124 -106.41 gain 124 197 -106.54 gain 197 124 -109.75 gain 124 198 -106.26 gain 198 124 -113.39 gain 124 199 -99.86 gain 199 124 -98.57 gain 124 200 -107.60 gain 200 124 -103.08 gain 124 201 -110.23 gain 201 124 -109.53 gain 124 202 -107.28 gain 202 124 -108.10 gain 124 203 -105.29 gain 203 124 -102.74 gain 124 204 -111.86 gain 204 124 -116.39 gain 124 205 -114.72 gain 205 124 -117.32 gain 124 206 -107.62 gain 206 124 -108.19 gain 124 207 -115.34 gain 207 124 -116.68 gain 124 208 -111.75 gain 208 124 -113.26 gain 124 209 -122.07 gain 209 124 -119.59 gain 124 210 -118.49 gain 210 124 -122.59 gain 124 211 -107.38 gain 211 124 -107.74 gain 124 212 -108.75 gain 212 124 -106.65 gain 124 213 -107.95 gain 213 124 -110.72 gain 124 214 -106.44 gain 214 124 -105.51 gain 124 215 -106.56 gain 215 124 -106.72 gain 124 216 -110.82 gain 216 124 -111.81 gain 124 217 -106.68 gain 217 124 -111.48 gain 124 218 -103.47 gain 218 124 -100.47 gain 124 219 -112.21 gain 219 124 -112.02 gain 124 220 -114.28 gain 220 124 -110.45 gain 124 221 -113.51 gain 221 124 -114.19 gain 124 222 -117.68 gain 222 124 -119.72 gain 124 223 -113.54 gain 223 124 -117.59 gain 124 224 -113.75 gain 224 124 -118.30 gain 125 126 -89.90 gain 126 125 -86.21 gain 125 127 -100.09 gain 127 125 -97.98 gain 125 128 -108.64 gain 128 125 -108.40 gain 125 129 -103.36 gain 129 125 -100.52 gain 125 130 -107.31 gain 130 125 -107.15 gain 125 131 -108.99 gain 131 125 -106.70 gain 125 132 -110.62 gain 132 125 -110.95 gain 125 133 -113.99 gain 133 125 -112.43 gain 125 134 -113.51 gain 134 125 -111.74 gain 125 135 -106.45 gain 135 125 -106.39 gain 125 136 -94.77 gain 136 125 -96.00 gain 125 137 -100.01 gain 137 125 -99.02 gain 125 138 -97.79 gain 138 125 -93.04 gain 125 139 -84.46 gain 139 125 -81.61 gain 125 140 -84.28 gain 140 125 -87.48 gain 125 141 -94.12 gain 141 125 -92.21 gain 125 142 -100.33 gain 142 125 -103.24 gain 125 143 -98.98 gain 143 125 -97.42 gain 125 144 -97.18 gain 144 125 -96.53 gain 125 145 -107.96 gain 145 125 -106.90 gain 125 146 -110.30 gain 146 125 -106.80 gain 125 147 -115.84 gain 147 125 -116.19 gain 125 148 -116.04 gain 148 125 -115.32 gain 125 149 -112.64 gain 149 125 -111.17 gain 125 150 -107.10 gain 150 125 -110.74 gain 125 151 -107.67 gain 151 125 -104.87 gain 125 152 -97.71 gain 152 125 -96.74 gain 125 153 -99.43 gain 153 125 -100.89 gain 125 154 -96.97 gain 154 125 -94.05 gain 125 155 -90.62 gain 155 125 -91.52 gain 125 156 -100.39 gain 156 125 -99.31 gain 125 157 -100.76 gain 157 125 -101.64 gain 125 158 -107.74 gain 158 125 -109.06 gain 125 159 -101.73 gain 159 125 -96.68 gain 125 160 -106.37 gain 160 125 -103.59 gain 125 161 -110.59 gain 161 125 -110.68 gain 125 162 -113.41 gain 162 125 -110.58 gain 125 163 -111.63 gain 163 125 -105.98 gain 125 164 -120.45 gain 164 125 -116.54 gain 125 165 -103.14 gain 165 125 -102.17 gain 125 166 -100.14 gain 166 125 -101.85 gain 125 167 -107.22 gain 167 125 -108.05 gain 125 168 -104.93 gain 168 125 -107.10 gain 125 169 -95.36 gain 169 125 -89.88 gain 125 170 -104.01 gain 170 125 -109.02 gain 125 171 -97.83 gain 171 125 -99.27 gain 125 172 -104.91 gain 172 125 -99.45 gain 125 173 -100.91 gain 173 125 -100.11 gain 125 174 -107.84 gain 174 125 -106.80 gain 125 175 -106.23 gain 175 125 -104.40 gain 125 176 -111.06 gain 176 125 -109.18 gain 125 177 -117.67 gain 177 125 -117.27 gain 125 178 -112.82 gain 178 125 -113.38 gain 125 179 -114.64 gain 179 125 -116.23 gain 125 180 -104.57 gain 180 125 -101.96 gain 125 181 -110.34 gain 181 125 -112.16 gain 125 182 -105.26 gain 182 125 -103.39 gain 125 183 -102.79 gain 183 125 -102.22 gain 125 184 -101.31 gain 184 125 -102.79 gain 125 185 -100.55 gain 185 125 -97.45 gain 125 186 -93.08 gain 186 125 -88.98 gain 125 187 -100.66 gain 187 125 -100.65 gain 125 188 -115.13 gain 188 125 -117.88 gain 125 189 -112.03 gain 189 125 -114.18 gain 125 190 -116.14 gain 190 125 -113.96 gain 125 191 -106.98 gain 191 125 -107.83 gain 125 192 -109.31 gain 192 125 -107.48 gain 125 193 -112.17 gain 193 125 -114.31 gain 125 194 -121.90 gain 194 125 -123.61 gain 125 195 -105.27 gain 195 125 -105.17 gain 125 196 -106.03 gain 196 125 -104.96 gain 125 197 -110.03 gain 197 125 -111.63 gain 125 198 -105.50 gain 198 125 -111.04 gain 125 199 -108.75 gain 199 125 -105.85 gain 125 200 -104.48 gain 200 125 -98.35 gain 125 201 -112.64 gain 201 125 -110.33 gain 125 202 -108.48 gain 202 125 -107.69 gain 125 203 -108.88 gain 203 125 -104.72 gain 125 204 -103.13 gain 204 125 -106.06 gain 125 205 -112.64 gain 205 125 -113.64 gain 125 206 -116.31 gain 206 125 -115.28 gain 125 207 -114.34 gain 207 125 -114.07 gain 125 208 -116.94 gain 208 125 -116.84 gain 125 209 -116.71 gain 209 125 -112.62 gain 125 210 -115.08 gain 210 125 -117.57 gain 125 211 -117.20 gain 211 125 -115.95 gain 125 212 -112.84 gain 212 125 -109.14 gain 125 213 -105.92 gain 213 125 -107.08 gain 125 214 -114.52 gain 214 125 -111.99 gain 125 215 -110.12 gain 215 125 -108.68 gain 125 216 -104.05 gain 216 125 -103.43 gain 125 217 -103.33 gain 217 125 -106.53 gain 125 218 -113.44 gain 218 125 -108.83 gain 125 219 -109.68 gain 219 125 -107.89 gain 125 220 -110.24 gain 220 125 -104.81 gain 125 221 -121.17 gain 221 125 -120.24 gain 125 222 -113.00 gain 222 125 -113.43 gain 125 223 -112.97 gain 223 125 -115.41 gain 125 224 -120.65 gain 224 125 -123.59 gain 126 127 -86.70 gain 127 126 -88.28 gain 126 128 -89.08 gain 128 126 -92.53 gain 126 129 -94.48 gain 129 126 -95.33 gain 126 130 -103.04 gain 130 126 -106.58 gain 126 131 -103.77 gain 131 126 -105.16 gain 126 132 -96.68 gain 132 126 -100.70 gain 126 133 -101.34 gain 133 126 -103.46 gain 126 134 -110.04 gain 134 126 -111.96 gain 126 135 -103.35 gain 135 126 -106.98 gain 126 136 -100.95 gain 136 126 -105.87 gain 126 137 -96.54 gain 137 126 -99.24 gain 126 138 -103.05 gain 138 126 -101.98 gain 126 139 -100.64 gain 139 126 -101.47 gain 126 140 -82.97 gain 140 126 -89.86 gain 126 141 -83.39 gain 141 126 -85.17 gain 126 142 -80.15 gain 142 126 -86.74 gain 126 143 -90.04 gain 143 126 -92.17 gain 126 144 -101.88 gain 144 126 -104.92 gain 126 145 -99.88 gain 145 126 -102.50 gain 126 146 -99.79 gain 146 126 -99.98 gain 126 147 -107.06 gain 147 126 -111.09 gain 126 148 -107.97 gain 148 126 -110.93 gain 126 149 -112.25 gain 149 126 -114.46 gain 126 150 -107.81 gain 150 126 -115.14 gain 126 151 -98.22 gain 151 126 -99.11 gain 126 152 -100.32 gain 152 126 -103.04 gain 126 153 -100.97 gain 153 126 -106.12 gain 126 154 -94.25 gain 154 126 -95.01 gain 126 155 -89.36 gain 155 126 -93.95 gain 126 156 -97.56 gain 156 126 -100.17 gain 126 157 -84.03 gain 157 126 -88.59 gain 126 158 -100.15 gain 158 126 -105.15 gain 126 159 -94.44 gain 159 126 -93.07 gain 126 160 -100.69 gain 160 126 -101.59 gain 126 161 -105.99 gain 161 126 -109.76 gain 126 162 -102.31 gain 162 126 -103.16 gain 126 163 -113.54 gain 163 126 -111.58 gain 126 164 -115.73 gain 164 126 -115.51 gain 126 165 -102.31 gain 165 126 -105.02 gain 126 166 -103.46 gain 166 126 -108.85 gain 126 167 -97.98 gain 167 126 -102.49 gain 126 168 -100.17 gain 168 126 -106.03 gain 126 169 -94.33 gain 169 126 -92.54 gain 126 170 -97.20 gain 170 126 -105.90 gain 126 171 -96.30 gain 171 126 -101.42 gain 126 172 -93.52 gain 172 126 -91.74 gain 126 173 -94.46 gain 173 126 -97.34 gain 126 174 -93.33 gain 174 126 -95.97 gain 126 175 -104.53 gain 175 126 -106.38 gain 126 176 -97.31 gain 176 126 -99.11 gain 126 177 -114.53 gain 177 126 -117.82 gain 126 178 -107.90 gain 178 126 -112.15 gain 126 179 -114.04 gain 179 126 -119.31 gain 126 180 -105.74 gain 180 126 -106.81 gain 126 181 -103.09 gain 181 126 -108.60 gain 126 182 -100.93 gain 182 126 -102.74 gain 126 183 -110.67 gain 183 126 -113.78 gain 126 184 -109.88 gain 184 126 -115.05 gain 126 185 -106.43 gain 185 126 -107.02 gain 126 186 -94.15 gain 186 126 -93.74 gain 126 187 -103.73 gain 187 126 -107.41 gain 126 188 -108.63 gain 188 126 -115.06 gain 126 189 -109.66 gain 189 126 -115.49 gain 126 190 -100.97 gain 190 126 -102.47 gain 126 191 -107.75 gain 191 126 -112.29 gain 126 192 -109.36 gain 192 126 -111.22 gain 126 193 -109.69 gain 193 126 -115.52 gain 126 194 -117.16 gain 194 126 -122.56 gain 126 195 -106.36 gain 195 126 -109.95 gain 126 196 -108.47 gain 196 126 -111.08 gain 126 197 -104.26 gain 197 126 -109.55 gain 126 198 -105.64 gain 198 126 -114.86 gain 126 199 -105.52 gain 199 126 -106.31 gain 126 200 -103.96 gain 200 126 -101.51 gain 126 201 -99.38 gain 201 126 -100.75 gain 126 202 -109.18 gain 202 126 -112.08 gain 126 203 -102.15 gain 203 126 -101.67 gain 126 204 -101.56 gain 204 126 -108.18 gain 126 205 -102.01 gain 205 126 -106.69 gain 126 206 -102.17 gain 206 126 -104.82 gain 126 207 -98.63 gain 207 126 -102.05 gain 126 208 -109.63 gain 208 126 -113.22 gain 126 209 -106.76 gain 209 126 -106.35 gain 126 210 -107.36 gain 210 126 -113.54 gain 126 211 -110.88 gain 211 126 -113.31 gain 126 212 -107.05 gain 212 126 -107.03 gain 126 213 -112.55 gain 213 126 -117.40 gain 126 214 -104.03 gain 214 126 -105.18 gain 126 215 -107.07 gain 215 126 -109.31 gain 126 216 -97.40 gain 216 126 -100.46 gain 126 217 -110.65 gain 217 126 -117.54 gain 126 218 -102.49 gain 218 126 -101.57 gain 126 219 -107.28 gain 219 126 -109.18 gain 126 220 -105.79 gain 220 126 -104.03 gain 126 221 -107.80 gain 221 126 -110.55 gain 126 222 -110.37 gain 222 126 -114.49 gain 126 223 -113.68 gain 223 126 -119.81 gain 126 224 -110.61 gain 224 126 -117.24 gain 127 128 -79.28 gain 128 127 -81.15 gain 127 129 -90.06 gain 129 127 -89.33 gain 127 130 -95.56 gain 130 127 -97.51 gain 127 131 -103.77 gain 131 127 -103.59 gain 127 132 -99.94 gain 132 127 -102.38 gain 127 133 -116.08 gain 133 127 -116.63 gain 127 134 -99.06 gain 134 127 -99.40 gain 127 135 -110.23 gain 135 127 -112.28 gain 127 136 -102.66 gain 136 127 -106.00 gain 127 137 -97.89 gain 137 127 -99.01 gain 127 138 -98.99 gain 138 127 -96.35 gain 127 139 -98.15 gain 139 127 -97.40 gain 127 140 -98.28 gain 140 127 -103.59 gain 127 141 -90.06 gain 141 127 -90.26 gain 127 142 -87.18 gain 142 127 -92.20 gain 127 143 -83.80 gain 143 127 -84.36 gain 127 144 -90.56 gain 144 127 -92.02 gain 127 145 -93.68 gain 145 127 -94.74 gain 127 146 -98.74 gain 146 127 -97.35 gain 127 147 -103.98 gain 147 127 -106.44 gain 127 148 -103.13 gain 148 127 -104.52 gain 127 149 -107.63 gain 149 127 -108.27 gain 127 150 -112.47 gain 150 127 -118.22 gain 127 151 -108.52 gain 151 127 -107.83 gain 127 152 -102.46 gain 152 127 -103.60 gain 127 153 -108.01 gain 153 127 -111.58 gain 127 154 -99.69 gain 154 127 -98.87 gain 127 155 -92.86 gain 155 127 -95.87 gain 127 156 -96.65 gain 156 127 -97.68 gain 127 157 -98.88 gain 157 127 -101.87 gain 127 158 -91.53 gain 158 127 -94.96 gain 127 159 -88.98 gain 159 127 -86.04 gain 127 160 -98.51 gain 160 127 -97.84 gain 127 161 -98.55 gain 161 127 -100.75 gain 127 162 -104.66 gain 162 127 -103.93 gain 127 163 -103.79 gain 163 127 -100.25 gain 127 164 -111.11 gain 164 127 -109.32 gain 127 165 -111.25 gain 165 127 -112.39 gain 127 166 -117.43 gain 166 127 -121.24 gain 127 167 -98.84 gain 167 127 -101.77 gain 127 168 -102.12 gain 168 127 -106.40 gain 127 169 -107.44 gain 169 127 -104.07 gain 127 170 -102.24 gain 170 127 -109.36 gain 127 171 -95.40 gain 171 127 -98.95 gain 127 172 -93.06 gain 172 127 -89.71 gain 127 173 -96.30 gain 173 127 -97.61 gain 127 174 -99.46 gain 174 127 -100.53 gain 127 175 -97.63 gain 175 127 -97.91 gain 127 176 -106.90 gain 176 127 -107.13 gain 127 177 -106.23 gain 177 127 -107.95 gain 127 178 -102.09 gain 178 127 -104.75 gain 127 179 -104.22 gain 179 127 -107.92 gain 127 180 -109.54 gain 180 127 -109.04 gain 127 181 -107.85 gain 181 127 -111.78 gain 127 182 -107.34 gain 182 127 -107.58 gain 127 183 -96.71 gain 183 127 -98.25 gain 127 184 -109.66 gain 184 127 -113.25 gain 127 185 -102.20 gain 185 127 -101.22 gain 127 186 -100.20 gain 186 127 -98.21 gain 127 187 -106.25 gain 187 127 -108.35 gain 127 188 -101.06 gain 188 127 -105.93 gain 127 189 -101.29 gain 189 127 -105.54 gain 127 190 -102.98 gain 190 127 -102.91 gain 127 191 -102.83 gain 191 127 -105.79 gain 127 192 -109.26 gain 192 127 -109.54 gain 127 193 -109.76 gain 193 127 -114.01 gain 127 194 -109.10 gain 194 127 -112.93 gain 127 195 -106.70 gain 195 127 -108.71 gain 127 196 -110.98 gain 196 127 -112.02 gain 127 197 -116.54 gain 197 127 -120.25 gain 127 198 -103.02 gain 198 127 -110.66 gain 127 199 -106.72 gain 199 127 -105.93 gain 127 200 -101.23 gain 200 127 -97.21 gain 127 201 -110.55 gain 201 127 -110.34 gain 127 202 -104.36 gain 202 127 -105.68 gain 127 203 -98.00 gain 203 127 -95.95 gain 127 204 -100.23 gain 204 127 -105.27 gain 127 205 -106.13 gain 205 127 -109.23 gain 127 206 -104.96 gain 206 127 -106.03 gain 127 207 -113.70 gain 207 127 -115.54 gain 127 208 -114.85 gain 208 127 -116.86 gain 127 209 -114.93 gain 209 127 -112.94 gain 127 210 -109.63 gain 210 127 -114.23 gain 127 211 -113.37 gain 211 127 -114.23 gain 127 212 -109.94 gain 212 127 -108.34 gain 127 213 -102.39 gain 213 127 -105.67 gain 127 214 -108.59 gain 214 127 -108.16 gain 127 215 -111.83 gain 215 127 -112.49 gain 127 216 -107.19 gain 216 127 -108.68 gain 127 217 -106.22 gain 217 127 -111.53 gain 127 218 -108.15 gain 218 127 -105.65 gain 127 219 -105.32 gain 219 127 -105.64 gain 127 220 -117.36 gain 220 127 -114.03 gain 127 221 -116.20 gain 221 127 -117.38 gain 127 222 -113.44 gain 222 127 -115.98 gain 127 223 -116.91 gain 223 127 -121.46 gain 127 224 -108.21 gain 224 127 -113.26 gain 128 129 -88.93 gain 129 128 -86.33 gain 128 130 -96.12 gain 130 128 -96.21 gain 128 131 -101.89 gain 131 128 -99.84 gain 128 132 -107.26 gain 132 128 -107.83 gain 128 133 -106.84 gain 133 128 -105.52 gain 128 134 -108.98 gain 134 128 -107.46 gain 128 135 -114.62 gain 135 128 -114.81 gain 128 136 -115.07 gain 136 128 -116.55 gain 128 137 -115.51 gain 137 128 -114.76 gain 128 138 -110.92 gain 138 128 -106.41 gain 128 139 -98.92 gain 139 128 -96.31 gain 128 140 -105.45 gain 140 128 -108.90 gain 128 141 -97.81 gain 141 128 -96.14 gain 128 142 -86.96 gain 142 128 -90.10 gain 128 143 -85.14 gain 143 128 -83.83 gain 128 144 -94.69 gain 144 128 -94.28 gain 128 145 -87.74 gain 145 128 -86.93 gain 128 146 -96.08 gain 146 128 -92.82 gain 128 147 -100.79 gain 147 128 -101.38 gain 128 148 -112.44 gain 148 128 -111.95 gain 128 149 -111.98 gain 149 128 -110.75 gain 128 150 -111.43 gain 150 128 -115.31 gain 128 151 -103.86 gain 151 128 -101.30 gain 128 152 -116.08 gain 152 128 -115.35 gain 128 153 -110.58 gain 153 128 -112.28 gain 128 154 -97.99 gain 154 128 -95.30 gain 128 155 -95.96 gain 155 128 -97.10 gain 128 156 -107.99 gain 156 128 -107.15 gain 128 157 -89.74 gain 157 128 -90.86 gain 128 158 -93.01 gain 158 128 -94.56 gain 128 159 -107.36 gain 159 128 -102.55 gain 128 160 -95.71 gain 160 128 -93.17 gain 128 161 -98.35 gain 161 128 -98.67 gain 128 162 -106.75 gain 162 128 -104.16 gain 128 163 -105.12 gain 163 128 -99.71 gain 128 164 -111.76 gain 164 128 -108.10 gain 128 165 -115.65 gain 165 128 -114.92 gain 128 166 -113.25 gain 166 128 -115.19 gain 128 167 -113.76 gain 167 128 -114.82 gain 128 168 -112.01 gain 168 128 -114.43 gain 128 169 -109.89 gain 169 128 -104.66 gain 128 170 -111.06 gain 170 128 -116.31 gain 128 171 -99.50 gain 171 128 -101.18 gain 128 172 -97.04 gain 172 128 -91.82 gain 128 173 -93.86 gain 173 128 -93.30 gain 128 174 -102.12 gain 174 128 -101.31 gain 128 175 -97.34 gain 175 128 -95.75 gain 128 176 -105.17 gain 176 128 -103.53 gain 128 177 -108.06 gain 177 128 -107.91 gain 128 178 -107.91 gain 178 128 -108.71 gain 128 179 -109.90 gain 179 128 -111.73 gain 128 180 -115.67 gain 180 128 -113.30 gain 128 181 -118.23 gain 181 128 -120.30 gain 128 182 -109.82 gain 182 128 -108.19 gain 128 183 -112.77 gain 183 128 -112.43 gain 128 184 -111.95 gain 184 128 -113.67 gain 128 185 -105.60 gain 185 128 -102.75 gain 128 186 -105.66 gain 186 128 -101.80 gain 128 187 -103.49 gain 187 128 -103.73 gain 128 188 -106.26 gain 188 128 -109.25 gain 128 189 -100.35 gain 189 128 -102.74 gain 128 190 -102.46 gain 190 128 -100.51 gain 128 191 -111.24 gain 191 128 -112.34 gain 128 192 -109.68 gain 192 128 -108.09 gain 128 193 -118.08 gain 193 128 -120.46 gain 128 194 -112.38 gain 194 128 -114.33 gain 128 195 -112.58 gain 195 128 -112.73 gain 128 196 -113.34 gain 196 128 -112.51 gain 128 197 -119.46 gain 197 128 -121.30 gain 128 198 -112.36 gain 198 128 -118.13 gain 128 199 -104.81 gain 199 128 -102.16 gain 128 200 -108.78 gain 200 128 -102.89 gain 128 201 -116.69 gain 201 128 -114.62 gain 128 202 -105.15 gain 202 128 -104.61 gain 128 203 -103.79 gain 203 128 -99.88 gain 128 204 -118.69 gain 204 128 -121.86 gain 128 205 -108.45 gain 205 128 -109.68 gain 128 206 -112.08 gain 206 128 -111.29 gain 128 207 -103.62 gain 207 128 -103.59 gain 128 208 -111.27 gain 208 128 -111.42 gain 128 209 -116.76 gain 209 128 -112.90 gain 128 210 -116.33 gain 210 128 -119.06 gain 128 211 -110.58 gain 211 128 -109.57 gain 128 212 -112.13 gain 212 128 -108.67 gain 128 213 -113.08 gain 213 128 -114.49 gain 128 214 -112.17 gain 214 128 -109.88 gain 128 215 -115.03 gain 215 128 -113.83 gain 128 216 -105.33 gain 216 128 -104.95 gain 128 217 -110.32 gain 217 128 -113.76 gain 128 218 -115.91 gain 218 128 -111.54 gain 128 219 -109.12 gain 219 128 -107.57 gain 128 220 -111.64 gain 220 128 -106.44 gain 128 221 -107.99 gain 221 128 -107.30 gain 128 222 -108.15 gain 222 128 -108.83 gain 128 223 -116.59 gain 223 128 -119.27 gain 128 224 -106.90 gain 224 128 -110.08 gain 129 130 -79.21 gain 130 129 -81.90 gain 129 131 -92.42 gain 131 129 -92.96 gain 129 132 -100.87 gain 132 129 -104.04 gain 129 133 -99.92 gain 133 129 -101.20 gain 129 134 -95.77 gain 134 129 -96.84 gain 129 135 -112.31 gain 135 129 -115.09 gain 129 136 -113.73 gain 136 129 -117.80 gain 129 137 -107.04 gain 137 129 -108.89 gain 129 138 -113.53 gain 138 129 -111.61 gain 129 139 -105.80 gain 139 129 -105.79 gain 129 140 -105.64 gain 140 129 -111.68 gain 129 141 -95.25 gain 141 129 -96.17 gain 129 142 -91.45 gain 142 129 -97.19 gain 129 143 -91.93 gain 143 129 -93.21 gain 129 144 -84.58 gain 144 129 -86.76 gain 129 145 -95.18 gain 145 129 -96.96 gain 129 146 -91.22 gain 146 129 -90.56 gain 129 147 -96.84 gain 147 129 -100.02 gain 129 148 -97.58 gain 148 129 -99.69 gain 129 149 -102.69 gain 149 129 -104.06 gain 129 150 -116.47 gain 150 129 -122.95 gain 129 151 -106.24 gain 151 129 -106.28 gain 129 152 -110.99 gain 152 129 -112.85 gain 129 153 -105.87 gain 153 129 -110.16 gain 129 154 -106.27 gain 154 129 -106.18 gain 129 155 -95.31 gain 155 129 -99.05 gain 129 156 -100.88 gain 156 129 -102.64 gain 129 157 -92.83 gain 157 129 -96.54 gain 129 158 -103.54 gain 158 129 -107.69 gain 129 159 -95.72 gain 159 129 -93.51 gain 129 160 -90.03 gain 160 129 -90.09 gain 129 161 -94.40 gain 161 129 -97.32 gain 129 162 -98.51 gain 162 129 -98.51 gain 129 163 -98.01 gain 163 129 -95.20 gain 129 164 -103.25 gain 164 129 -102.18 gain 129 165 -114.13 gain 165 129 -115.99 gain 129 166 -111.55 gain 166 129 -116.09 gain 129 167 -104.48 gain 167 129 -108.14 gain 129 168 -111.46 gain 168 129 -116.47 gain 129 169 -111.70 gain 169 129 -109.06 gain 129 170 -105.93 gain 170 129 -113.78 gain 129 171 -104.83 gain 171 129 -109.11 gain 129 172 -91.63 gain 172 129 -89.01 gain 129 173 -92.16 gain 173 129 -94.20 gain 129 174 -94.41 gain 174 129 -96.20 gain 129 175 -101.52 gain 175 129 -102.52 gain 129 176 -104.95 gain 176 129 -105.90 gain 129 177 -100.04 gain 177 129 -102.48 gain 129 178 -113.22 gain 178 129 -116.62 gain 129 179 -106.96 gain 179 129 -111.39 gain 129 180 -116.05 gain 180 129 -116.27 gain 129 181 -109.82 gain 181 129 -114.48 gain 129 182 -100.55 gain 182 129 -101.52 gain 129 183 -105.94 gain 183 129 -108.21 gain 129 184 -102.92 gain 184 129 -107.23 gain 129 185 -110.93 gain 185 129 -110.67 gain 129 186 -99.74 gain 186 129 -98.48 gain 129 187 -100.42 gain 187 129 -103.25 gain 129 188 -104.70 gain 188 129 -110.29 gain 129 189 -99.69 gain 189 129 -104.67 gain 129 190 -105.54 gain 190 129 -106.19 gain 129 191 -104.05 gain 191 129 -107.74 gain 129 192 -106.74 gain 192 129 -107.74 gain 129 193 -106.66 gain 193 129 -111.64 gain 129 194 -109.00 gain 194 129 -113.55 gain 129 195 -116.33 gain 195 129 -119.07 gain 129 196 -118.61 gain 196 129 -120.37 gain 129 197 -112.75 gain 197 129 -117.18 gain 129 198 -99.41 gain 198 129 -107.78 gain 129 199 -109.68 gain 199 129 -109.62 gain 129 200 -112.31 gain 200 129 -109.01 gain 129 201 -107.31 gain 201 129 -107.83 gain 129 202 -104.68 gain 202 129 -106.73 gain 129 203 -106.41 gain 203 129 -105.09 gain 129 204 -97.81 gain 204 129 -103.57 gain 129 205 -104.54 gain 205 129 -108.37 gain 129 206 -104.89 gain 206 129 -106.69 gain 129 207 -111.16 gain 207 129 -113.73 gain 129 208 -107.90 gain 208 129 -110.64 gain 129 209 -104.28 gain 209 129 -103.02 gain 129 210 -117.20 gain 210 129 -122.53 gain 129 211 -113.76 gain 211 129 -115.34 gain 129 212 -108.19 gain 212 129 -107.33 gain 129 213 -110.79 gain 213 129 -114.80 gain 129 214 -112.06 gain 214 129 -112.36 gain 129 215 -105.95 gain 215 129 -107.34 gain 129 216 -107.64 gain 216 129 -109.86 gain 129 217 -107.11 gain 217 129 -113.14 gain 129 218 -109.06 gain 218 129 -107.28 gain 129 219 -99.16 gain 219 129 -100.21 gain 129 220 -102.61 gain 220 129 -100.01 gain 129 221 -104.25 gain 221 129 -106.16 gain 129 222 -104.07 gain 222 129 -107.34 gain 129 223 -108.47 gain 223 129 -113.75 gain 129 224 -105.53 gain 224 129 -111.31 gain 130 131 -90.29 gain 131 130 -88.15 gain 130 132 -90.52 gain 132 130 -91.00 gain 130 133 -98.98 gain 133 130 -97.57 gain 130 134 -103.13 gain 134 130 -101.52 gain 130 135 -111.77 gain 135 130 -111.87 gain 130 136 -103.78 gain 136 130 -105.16 gain 130 137 -116.09 gain 137 130 -115.26 gain 130 138 -110.17 gain 138 130 -105.57 gain 130 139 -102.91 gain 139 130 -100.21 gain 130 140 -113.53 gain 140 130 -116.89 gain 130 141 -101.86 gain 141 130 -100.10 gain 130 142 -104.09 gain 142 130 -107.15 gain 130 143 -95.44 gain 143 130 -94.04 gain 130 144 -90.80 gain 144 130 -90.30 gain 130 145 -90.68 gain 145 130 -89.78 gain 130 146 -87.37 gain 146 130 -84.02 gain 130 147 -99.85 gain 147 130 -100.36 gain 130 148 -98.91 gain 148 130 -98.35 gain 130 149 -103.26 gain 149 130 -101.94 gain 130 150 -110.42 gain 150 130 -114.22 gain 130 151 -118.82 gain 151 130 -116.18 gain 130 152 -111.94 gain 152 130 -111.13 gain 130 153 -110.08 gain 153 130 -111.69 gain 130 154 -114.13 gain 154 130 -111.36 gain 130 155 -110.17 gain 155 130 -111.22 gain 130 156 -106.29 gain 156 130 -105.36 gain 130 157 -107.24 gain 157 130 -108.28 gain 130 158 -94.47 gain 158 130 -95.94 gain 130 159 -93.98 gain 159 130 -89.08 gain 130 160 -96.59 gain 160 130 -93.97 gain 130 161 -95.85 gain 161 130 -96.09 gain 130 162 -104.52 gain 162 130 -101.84 gain 130 163 -102.20 gain 163 130 -96.70 gain 130 164 -106.68 gain 164 130 -102.93 gain 130 165 -117.44 gain 165 130 -116.62 gain 130 166 -111.51 gain 166 130 -113.36 gain 130 167 -110.63 gain 167 130 -111.61 gain 130 168 -117.41 gain 168 130 -119.74 gain 130 169 -115.15 gain 169 130 -109.83 gain 130 170 -108.55 gain 170 130 -113.72 gain 130 171 -107.14 gain 171 130 -108.73 gain 130 172 -103.71 gain 172 130 -98.40 gain 130 173 -96.47 gain 173 130 -95.83 gain 130 174 -103.39 gain 174 130 -102.50 gain 130 175 -98.28 gain 175 130 -96.60 gain 130 176 -97.29 gain 176 130 -95.56 gain 130 177 -98.70 gain 177 130 -98.46 gain 130 178 -105.05 gain 178 130 -105.76 gain 130 179 -107.47 gain 179 130 -109.21 gain 130 180 -115.33 gain 180 130 -112.87 gain 130 181 -114.74 gain 181 130 -116.73 gain 130 182 -116.35 gain 182 130 -114.63 gain 130 183 -116.50 gain 183 130 -116.08 gain 130 184 -108.20 gain 184 130 -109.84 gain 130 185 -118.62 gain 185 130 -115.68 gain 130 186 -111.75 gain 186 130 -107.80 gain 130 187 -106.55 gain 187 130 -106.70 gain 130 188 -109.52 gain 188 130 -112.43 gain 130 189 -105.16 gain 189 130 -107.46 gain 130 190 -90.95 gain 190 130 -88.92 gain 130 191 -105.52 gain 191 130 -106.52 gain 130 192 -108.50 gain 192 130 -106.82 gain 130 193 -100.55 gain 193 130 -102.85 gain 130 194 -109.17 gain 194 130 -111.04 gain 130 195 -107.67 gain 195 130 -107.73 gain 130 196 -109.16 gain 196 130 -108.24 gain 130 197 -115.35 gain 197 130 -117.11 gain 130 198 -115.46 gain 198 130 -121.15 gain 130 199 -108.58 gain 199 130 -105.83 gain 130 200 -121.46 gain 200 130 -115.49 gain 130 201 -114.85 gain 201 130 -112.70 gain 130 202 -105.61 gain 202 130 -104.98 gain 130 203 -110.04 gain 203 130 -106.04 gain 130 204 -103.69 gain 204 130 -106.77 gain 130 205 -106.27 gain 205 130 -107.41 gain 130 206 -108.00 gain 206 130 -107.12 gain 130 207 -107.70 gain 207 130 -107.58 gain 130 208 -107.60 gain 208 130 -107.66 gain 130 209 -111.77 gain 209 130 -107.83 gain 130 210 -120.47 gain 210 130 -123.12 gain 130 211 -119.70 gain 211 130 -118.61 gain 130 212 -113.57 gain 212 130 -110.02 gain 130 213 -116.92 gain 213 130 -118.24 gain 130 214 -113.06 gain 214 130 -110.68 gain 130 215 -115.66 gain 215 130 -114.37 gain 130 216 -105.87 gain 216 130 -105.40 gain 130 217 -108.45 gain 217 130 -111.81 gain 130 218 -105.23 gain 218 130 -100.78 gain 130 219 -102.52 gain 219 130 -100.89 gain 130 220 -108.55 gain 220 130 -103.27 gain 130 221 -112.19 gain 221 130 -111.41 gain 130 222 -107.56 gain 222 130 -108.14 gain 130 223 -109.21 gain 223 130 -111.80 gain 130 224 -107.92 gain 224 130 -111.02 gain 131 132 -81.35 gain 132 131 -83.97 gain 131 133 -97.58 gain 133 131 -98.30 gain 131 134 -96.60 gain 134 131 -97.12 gain 131 135 -119.25 gain 135 131 -121.48 gain 131 136 -115.94 gain 136 131 -119.46 gain 131 137 -103.13 gain 137 131 -104.44 gain 131 138 -111.20 gain 138 131 -108.74 gain 131 139 -114.87 gain 139 131 -114.30 gain 131 140 -107.03 gain 140 131 -112.52 gain 131 141 -105.53 gain 141 131 -105.91 gain 131 142 -105.92 gain 142 131 -111.12 gain 131 143 -99.15 gain 143 131 -99.88 gain 131 144 -96.70 gain 144 131 -98.35 gain 131 145 -85.02 gain 145 131 -86.25 gain 131 146 -76.76 gain 146 131 -75.55 gain 131 147 -90.04 gain 147 131 -92.67 gain 131 148 -100.66 gain 148 131 -102.22 gain 131 149 -96.41 gain 149 131 -97.22 gain 131 150 -106.36 gain 150 131 -112.29 gain 131 151 -112.47 gain 151 131 -111.96 gain 131 152 -111.82 gain 152 131 -113.14 gain 131 153 -109.63 gain 153 131 -113.38 gain 131 154 -110.93 gain 154 131 -110.29 gain 131 155 -107.09 gain 155 131 -110.29 gain 131 156 -101.24 gain 156 131 -102.45 gain 131 157 -107.69 gain 157 131 -110.86 gain 131 158 -99.37 gain 158 131 -102.97 gain 131 159 -97.88 gain 159 131 -95.13 gain 131 160 -93.52 gain 160 131 -93.04 gain 131 161 -93.87 gain 161 131 -96.24 gain 131 162 -96.74 gain 162 131 -96.20 gain 131 163 -95.23 gain 163 131 -91.87 gain 131 164 -96.49 gain 164 131 -94.88 gain 131 165 -115.71 gain 165 131 -117.03 gain 131 166 -117.12 gain 166 131 -121.11 gain 131 167 -110.85 gain 167 131 -113.97 gain 131 168 -119.20 gain 168 131 -123.66 gain 131 169 -112.79 gain 169 131 -109.60 gain 131 170 -101.56 gain 170 131 -108.87 gain 131 171 -112.49 gain 171 131 -116.22 gain 131 172 -110.04 gain 172 131 -106.87 gain 131 173 -107.14 gain 173 131 -108.63 gain 131 174 -100.60 gain 174 131 -101.85 gain 131 175 -98.31 gain 175 131 -98.77 gain 131 176 -95.78 gain 176 131 -96.19 gain 131 177 -97.52 gain 177 131 -99.42 gain 131 178 -102.86 gain 178 131 -105.71 gain 131 179 -111.59 gain 179 131 -115.47 gain 131 180 -119.66 gain 180 131 -119.34 gain 131 181 -113.33 gain 181 131 -117.45 gain 131 182 -117.41 gain 182 131 -117.83 gain 131 183 -123.06 gain 183 131 -124.78 gain 131 184 -108.80 gain 184 131 -112.57 gain 131 185 -113.34 gain 185 131 -112.54 gain 131 186 -106.03 gain 186 131 -104.23 gain 131 187 -102.87 gain 187 131 -105.16 gain 131 188 -111.01 gain 188 131 -116.06 gain 131 189 -101.43 gain 189 131 -105.87 gain 131 190 -100.16 gain 190 131 -100.27 gain 131 191 -98.32 gain 191 131 -101.47 gain 131 192 -98.20 gain 192 131 -98.65 gain 131 193 -105.50 gain 193 131 -109.93 gain 131 194 -104.87 gain 194 131 -108.87 gain 131 195 -112.76 gain 195 131 -114.96 gain 131 196 -115.04 gain 196 131 -116.25 gain 131 197 -117.03 gain 197 131 -120.92 gain 131 198 -113.88 gain 198 131 -121.71 gain 131 199 -112.58 gain 199 131 -111.97 gain 131 200 -106.59 gain 200 131 -102.75 gain 131 201 -108.26 gain 201 131 -108.24 gain 131 202 -113.78 gain 202 131 -115.29 gain 131 203 -108.70 gain 203 131 -106.83 gain 131 204 -104.47 gain 204 131 -109.69 gain 131 205 -103.35 gain 205 131 -106.64 gain 131 206 -100.50 gain 206 131 -101.76 gain 131 207 -109.90 gain 207 131 -111.92 gain 131 208 -106.15 gain 208 131 -108.34 gain 131 209 -108.96 gain 209 131 -107.15 gain 131 210 -113.19 gain 210 131 -117.97 gain 131 211 -116.41 gain 211 131 -117.45 gain 131 212 -115.04 gain 212 131 -113.63 gain 131 213 -111.00 gain 213 131 -114.45 gain 131 214 -116.40 gain 214 131 -116.16 gain 131 215 -107.90 gain 215 131 -108.74 gain 131 216 -114.89 gain 216 131 -116.56 gain 131 217 -107.01 gain 217 131 -112.50 gain 131 218 -111.85 gain 218 131 -109.53 gain 131 219 -103.12 gain 219 131 -103.62 gain 131 220 -110.16 gain 220 131 -107.01 gain 131 221 -114.03 gain 221 131 -115.39 gain 131 222 -105.23 gain 222 131 -107.96 gain 131 223 -108.00 gain 223 131 -112.73 gain 131 224 -103.98 gain 224 131 -109.21 gain 132 133 -83.30 gain 133 132 -81.41 gain 132 134 -92.35 gain 134 132 -90.26 gain 132 135 -122.88 gain 135 132 -122.49 gain 132 136 -118.76 gain 136 132 -119.66 gain 132 137 -121.42 gain 137 132 -120.11 gain 132 138 -114.59 gain 138 132 -109.51 gain 132 139 -107.66 gain 139 132 -104.47 gain 132 140 -116.97 gain 140 132 -119.84 gain 132 141 -113.00 gain 141 132 -110.76 gain 132 142 -102.04 gain 142 132 -104.61 gain 132 143 -112.03 gain 143 132 -110.15 gain 132 144 -105.46 gain 144 132 -104.48 gain 132 145 -92.71 gain 145 132 -91.32 gain 132 146 -90.91 gain 146 132 -87.08 gain 132 147 -76.85 gain 147 132 -76.87 gain 132 148 -95.00 gain 148 132 -93.95 gain 132 149 -96.17 gain 149 132 -94.36 gain 132 150 -109.56 gain 150 132 -112.88 gain 132 151 -117.94 gain 151 132 -114.82 gain 132 152 -107.33 gain 152 132 -106.03 gain 132 153 -112.67 gain 153 132 -113.80 gain 132 154 -109.14 gain 154 132 -105.88 gain 132 155 -112.68 gain 155 132 -113.26 gain 132 156 -108.58 gain 156 132 -107.17 gain 132 157 -107.95 gain 157 132 -108.50 gain 132 158 -105.58 gain 158 132 -106.57 gain 132 159 -99.19 gain 159 132 -93.81 gain 132 160 -100.89 gain 160 132 -97.78 gain 132 161 -91.87 gain 161 132 -91.62 gain 132 162 -96.94 gain 162 132 -93.77 gain 132 163 -94.21 gain 163 132 -88.23 gain 132 164 -95.01 gain 164 132 -90.78 gain 132 165 -120.05 gain 165 132 -118.75 gain 132 166 -118.69 gain 166 132 -120.07 gain 132 167 -122.14 gain 167 132 -122.64 gain 132 168 -122.90 gain 168 132 -124.75 gain 132 169 -111.37 gain 169 132 -105.57 gain 132 170 -116.37 gain 170 132 -121.05 gain 132 171 -116.51 gain 171 132 -117.61 gain 132 172 -112.98 gain 172 132 -107.19 gain 132 173 -104.33 gain 173 132 -103.20 gain 132 174 -106.32 gain 174 132 -104.95 gain 132 175 -104.43 gain 175 132 -102.27 gain 132 176 -96.41 gain 176 132 -94.19 gain 132 177 -95.59 gain 177 132 -94.86 gain 132 178 -100.44 gain 178 132 -100.67 gain 132 179 -96.24 gain 179 132 -97.50 gain 132 180 -113.25 gain 180 132 -110.31 gain 132 181 -116.30 gain 181 132 -117.80 gain 132 182 -114.10 gain 182 132 -111.90 gain 132 183 -117.49 gain 183 132 -116.59 gain 132 184 -109.75 gain 184 132 -110.90 gain 132 185 -110.54 gain 185 132 -107.12 gain 132 186 -104.68 gain 186 132 -100.26 gain 132 187 -111.46 gain 187 132 -111.12 gain 132 188 -111.03 gain 188 132 -113.46 gain 132 189 -106.11 gain 189 132 -107.92 gain 132 190 -101.45 gain 190 132 -98.93 gain 132 191 -102.68 gain 191 132 -103.20 gain 132 192 -103.67 gain 192 132 -101.50 gain 132 193 -100.88 gain 193 132 -102.69 gain 132 194 -111.44 gain 194 132 -112.82 gain 132 195 -125.84 gain 195 132 -125.42 gain 132 196 -118.71 gain 196 132 -117.31 gain 132 197 -115.60 gain 197 132 -116.87 gain 132 198 -117.02 gain 198 132 -122.23 gain 132 199 -113.04 gain 199 132 -109.81 gain 132 200 -112.51 gain 200 132 -106.05 gain 132 201 -112.38 gain 201 132 -109.73 gain 132 202 -109.78 gain 202 132 -108.67 gain 132 203 -111.01 gain 203 132 -106.53 gain 132 204 -105.99 gain 204 132 -108.59 gain 132 205 -103.58 gain 205 132 -104.25 gain 132 206 -103.58 gain 206 132 -102.22 gain 132 207 -101.90 gain 207 132 -101.30 gain 132 208 -109.90 gain 208 132 -109.47 gain 132 209 -100.34 gain 209 132 -95.92 gain 132 210 -121.97 gain 210 132 -124.13 gain 132 211 -116.63 gain 211 132 -115.05 gain 132 212 -124.85 gain 212 132 -120.82 gain 132 213 -121.78 gain 213 132 -122.62 gain 132 214 -117.58 gain 214 132 -114.72 gain 132 215 -112.66 gain 215 132 -110.88 gain 132 216 -115.87 gain 216 132 -114.92 gain 132 217 -111.69 gain 217 132 -114.57 gain 132 218 -113.66 gain 218 132 -108.72 gain 132 219 -104.23 gain 219 132 -102.11 gain 132 220 -112.93 gain 220 132 -107.16 gain 132 221 -111.61 gain 221 132 -110.34 gain 132 222 -111.39 gain 222 132 -111.50 gain 132 223 -109.54 gain 223 132 -111.65 gain 132 224 -109.92 gain 224 132 -112.53 gain 133 134 -86.46 gain 134 133 -86.26 gain 133 135 -111.33 gain 135 133 -112.83 gain 133 136 -118.92 gain 136 133 -121.71 gain 133 137 -116.08 gain 137 133 -116.66 gain 133 138 -114.70 gain 138 133 -111.50 gain 133 139 -115.75 gain 139 133 -114.46 gain 133 140 -106.85 gain 140 133 -111.62 gain 133 141 -105.82 gain 141 133 -105.47 gain 133 142 -109.84 gain 142 133 -114.31 gain 133 143 -104.43 gain 143 133 -104.43 gain 133 144 -106.39 gain 144 133 -107.30 gain 133 145 -100.32 gain 145 133 -100.82 gain 133 146 -93.28 gain 146 133 -91.34 gain 133 147 -86.35 gain 147 133 -88.26 gain 133 148 -91.64 gain 148 133 -92.48 gain 133 149 -94.68 gain 149 133 -94.77 gain 133 150 -117.37 gain 150 133 -122.57 gain 133 151 -113.17 gain 151 133 -111.93 gain 133 152 -121.54 gain 152 133 -122.13 gain 133 153 -121.85 gain 153 133 -124.87 gain 133 154 -112.12 gain 154 133 -110.75 gain 133 155 -117.44 gain 155 133 -119.91 gain 133 156 -113.73 gain 156 133 -114.21 gain 133 157 -113.08 gain 157 133 -115.52 gain 133 158 -111.42 gain 158 133 -114.29 gain 133 159 -108.33 gain 159 133 -104.85 gain 133 160 -96.08 gain 160 133 -94.86 gain 133 161 -94.01 gain 161 133 -95.66 gain 133 162 -97.85 gain 162 133 -96.58 gain 133 163 -89.38 gain 163 133 -85.30 gain 133 164 -102.34 gain 164 133 -100.00 gain 133 165 -123.64 gain 165 133 -124.23 gain 133 166 -118.40 gain 166 133 -121.66 gain 133 167 -110.88 gain 167 133 -113.27 gain 133 168 -114.69 gain 168 133 -118.43 gain 133 169 -119.28 gain 169 133 -115.37 gain 133 170 -115.85 gain 170 133 -122.43 gain 133 171 -108.28 gain 171 133 -111.28 gain 133 172 -108.93 gain 172 133 -105.03 gain 133 173 -113.12 gain 173 133 -113.88 gain 133 174 -102.86 gain 174 133 -103.38 gain 133 175 -105.29 gain 175 133 -105.02 gain 133 176 -103.17 gain 176 133 -102.85 gain 133 177 -100.34 gain 177 133 -101.51 gain 133 178 -95.75 gain 178 133 -97.87 gain 133 179 -103.84 gain 179 133 -106.99 gain 133 180 -119.30 gain 180 133 -118.25 gain 133 181 -117.75 gain 181 133 -121.14 gain 133 182 -113.86 gain 182 133 -113.55 gain 133 183 -112.51 gain 183 133 -113.50 gain 133 184 -115.18 gain 184 133 -118.22 gain 133 185 -111.54 gain 185 133 -110.01 gain 133 186 -115.03 gain 186 133 -112.50 gain 133 187 -112.63 gain 187 133 -114.19 gain 133 188 -111.73 gain 188 133 -116.05 gain 133 189 -103.67 gain 189 133 -107.38 gain 133 190 -100.00 gain 190 133 -99.38 gain 133 191 -107.18 gain 191 133 -109.59 gain 133 192 -100.09 gain 192 133 -99.83 gain 133 193 -101.66 gain 193 133 -105.37 gain 133 194 -101.64 gain 194 133 -104.92 gain 133 195 -115.57 gain 195 133 -117.03 gain 133 196 -116.29 gain 196 133 -116.78 gain 133 197 -116.14 gain 197 133 -119.30 gain 133 198 -111.61 gain 198 133 -118.70 gain 133 199 -123.65 gain 199 133 -122.31 gain 133 200 -116.77 gain 200 133 -112.21 gain 133 201 -106.26 gain 201 133 -105.51 gain 133 202 -112.85 gain 202 133 -113.63 gain 133 203 -112.10 gain 203 133 -109.50 gain 133 204 -107.20 gain 204 133 -111.69 gain 133 205 -113.51 gain 205 133 -116.07 gain 133 206 -100.80 gain 206 133 -101.33 gain 133 207 -118.38 gain 207 133 -119.68 gain 133 208 -107.31 gain 208 133 -108.77 gain 133 209 -114.27 gain 209 133 -111.74 gain 133 210 -119.57 gain 210 133 -123.62 gain 133 211 -114.34 gain 211 133 -114.65 gain 133 212 -112.48 gain 212 133 -110.35 gain 133 213 -121.90 gain 213 133 -124.63 gain 133 214 -111.45 gain 214 133 -110.48 gain 133 215 -111.65 gain 215 133 -111.76 gain 133 216 -114.10 gain 216 133 -115.04 gain 133 217 -107.50 gain 217 133 -112.27 gain 133 218 -110.81 gain 218 133 -107.76 gain 133 219 -109.15 gain 219 133 -108.92 gain 133 220 -108.98 gain 220 133 -105.11 gain 133 221 -99.84 gain 221 133 -100.46 gain 133 222 -109.13 gain 222 133 -111.13 gain 133 223 -108.32 gain 223 133 -112.32 gain 133 224 -101.95 gain 224 133 -106.45 gain 134 135 -110.04 gain 135 134 -111.75 gain 134 136 -118.66 gain 136 134 -121.66 gain 134 137 -109.83 gain 137 134 -110.61 gain 134 138 -113.51 gain 138 134 -110.53 gain 134 139 -116.94 gain 139 134 -115.85 gain 134 140 -115.65 gain 140 134 -120.62 gain 134 141 -109.05 gain 141 134 -108.91 gain 134 142 -105.67 gain 142 134 -110.34 gain 134 143 -108.89 gain 143 134 -109.10 gain 134 144 -102.18 gain 144 134 -103.30 gain 134 145 -106.14 gain 145 134 -106.85 gain 134 146 -100.74 gain 146 134 -99.01 gain 134 147 -91.64 gain 147 134 -93.76 gain 134 148 -89.59 gain 148 134 -90.63 gain 134 149 -83.40 gain 149 134 -83.69 gain 134 150 -121.96 gain 150 134 -127.37 gain 134 151 -116.98 gain 151 134 -115.95 gain 134 152 -123.02 gain 152 134 -123.82 gain 134 153 -116.50 gain 153 134 -119.72 gain 134 154 -116.26 gain 154 134 -115.10 gain 134 155 -110.08 gain 155 134 -112.75 gain 134 156 -107.10 gain 156 134 -107.78 gain 134 157 -110.43 gain 157 134 -113.08 gain 134 158 -109.70 gain 158 134 -112.78 gain 134 159 -105.77 gain 159 134 -102.49 gain 134 160 -107.24 gain 160 134 -106.23 gain 134 161 -101.08 gain 161 134 -102.93 gain 134 162 -101.08 gain 162 134 -100.01 gain 134 163 -86.35 gain 163 134 -82.47 gain 134 164 -94.69 gain 164 134 -92.55 gain 134 165 -125.08 gain 165 134 -125.88 gain 134 166 -122.51 gain 166 134 -125.98 gain 134 167 -112.11 gain 167 134 -114.70 gain 134 168 -113.35 gain 168 134 -117.29 gain 134 169 -116.16 gain 169 134 -112.45 gain 134 170 -107.69 gain 170 134 -114.47 gain 134 171 -109.22 gain 171 134 -112.43 gain 134 172 -116.81 gain 172 134 -113.12 gain 134 173 -105.64 gain 173 134 -106.60 gain 134 174 -100.14 gain 174 134 -100.86 gain 134 175 -108.00 gain 175 134 -107.93 gain 134 176 -97.04 gain 176 134 -96.92 gain 134 177 -101.56 gain 177 134 -102.93 gain 134 178 -98.00 gain 178 134 -100.33 gain 134 179 -99.13 gain 179 134 -102.49 gain 134 180 -122.52 gain 180 134 -121.67 gain 134 181 -113.32 gain 181 134 -116.91 gain 134 182 -111.06 gain 182 134 -110.96 gain 134 183 -114.66 gain 183 134 -115.85 gain 134 184 -116.25 gain 184 134 -119.49 gain 134 185 -115.55 gain 185 134 -114.22 gain 134 186 -114.40 gain 186 134 -112.07 gain 134 187 -111.13 gain 187 134 -112.89 gain 134 188 -112.41 gain 188 134 -116.93 gain 134 189 -109.37 gain 189 134 -113.29 gain 134 190 -112.92 gain 190 134 -112.50 gain 134 191 -101.70 gain 191 134 -104.31 gain 134 192 -106.31 gain 192 134 -106.24 gain 134 193 -105.52 gain 193 134 -109.42 gain 134 194 -99.50 gain 194 134 -102.98 gain 134 195 -109.92 gain 195 134 -111.59 gain 134 196 -121.53 gain 196 134 -122.22 gain 134 197 -121.08 gain 197 134 -124.45 gain 134 198 -117.07 gain 198 134 -124.37 gain 134 199 -112.65 gain 199 134 -111.52 gain 134 200 -118.72 gain 200 134 -114.35 gain 134 201 -118.23 gain 201 134 -117.68 gain 134 202 -116.69 gain 202 134 -117.67 gain 134 203 -107.04 gain 203 134 -104.65 gain 134 204 -108.25 gain 204 134 -112.94 gain 134 205 -105.86 gain 205 134 -108.62 gain 134 206 -107.44 gain 206 134 -108.17 gain 134 207 -109.25 gain 207 134 -110.75 gain 134 208 -105.55 gain 208 134 -107.22 gain 134 209 -106.08 gain 209 134 -103.75 gain 134 210 -124.61 gain 210 134 -128.86 gain 134 211 -122.47 gain 211 134 -122.99 gain 134 212 -119.44 gain 212 134 -117.51 gain 134 213 -114.45 gain 213 134 -117.38 gain 134 214 -112.19 gain 214 134 -111.43 gain 134 215 -120.04 gain 215 134 -120.36 gain 134 216 -113.34 gain 216 134 -114.49 gain 134 217 -107.75 gain 217 134 -112.71 gain 134 218 -107.76 gain 218 134 -104.92 gain 134 219 -116.46 gain 219 134 -116.44 gain 134 220 -110.02 gain 220 134 -106.35 gain 134 221 -108.13 gain 221 134 -108.96 gain 134 222 -108.65 gain 222 134 -110.85 gain 134 223 -104.77 gain 223 134 -108.97 gain 134 224 -109.15 gain 224 134 -113.85 gain 135 136 -82.16 gain 136 135 -83.45 gain 135 137 -93.17 gain 137 135 -92.24 gain 135 138 -95.88 gain 138 135 -91.19 gain 135 139 -95.20 gain 139 135 -92.41 gain 135 140 -109.64 gain 140 135 -112.90 gain 135 141 -108.17 gain 141 135 -106.31 gain 135 142 -113.26 gain 142 135 -116.22 gain 135 143 -106.51 gain 143 135 -105.01 gain 135 144 -114.31 gain 144 135 -113.72 gain 135 145 -114.10 gain 145 135 -113.10 gain 135 146 -116.80 gain 146 135 -113.36 gain 135 147 -116.13 gain 147 135 -116.53 gain 135 148 -120.13 gain 148 135 -119.46 gain 135 149 -112.41 gain 149 135 -110.99 gain 135 150 -84.56 gain 150 135 -88.26 gain 135 151 -90.14 gain 151 135 -87.41 gain 135 152 -91.86 gain 152 135 -90.95 gain 135 153 -96.41 gain 153 135 -97.93 gain 135 154 -104.00 gain 154 135 -101.13 gain 135 155 -116.77 gain 155 135 -117.73 gain 135 156 -103.38 gain 156 135 -102.35 gain 135 157 -110.42 gain 157 135 -111.36 gain 135 158 -108.66 gain 158 135 -110.03 gain 135 159 -121.55 gain 159 135 -116.56 gain 135 160 -111.50 gain 160 135 -108.78 gain 135 161 -114.38 gain 161 135 -114.52 gain 135 162 -116.37 gain 162 135 -113.59 gain 135 163 -120.89 gain 163 135 -115.30 gain 135 164 -122.70 gain 164 135 -118.85 gain 135 165 -96.21 gain 165 135 -95.30 gain 135 166 -92.29 gain 166 135 -94.05 gain 135 167 -97.42 gain 167 135 -98.31 gain 135 168 -98.54 gain 168 135 -100.78 gain 135 169 -105.72 gain 169 135 -100.30 gain 135 170 -110.81 gain 170 135 -115.88 gain 135 171 -109.87 gain 171 135 -111.37 gain 135 172 -117.66 gain 172 135 -112.26 gain 135 173 -107.97 gain 173 135 -107.22 gain 135 174 -108.74 gain 174 135 -107.75 gain 135 175 -119.05 gain 175 135 -117.27 gain 135 176 -114.30 gain 176 135 -112.47 gain 135 177 -119.80 gain 177 135 -119.46 gain 135 178 -120.27 gain 178 135 -120.89 gain 135 179 -119.09 gain 179 135 -120.74 gain 135 180 -99.56 gain 180 135 -97.00 gain 135 181 -93.48 gain 181 135 -95.36 gain 135 182 -102.82 gain 182 135 -101.00 gain 135 183 -106.54 gain 183 135 -106.02 gain 135 184 -101.88 gain 184 135 -103.42 gain 135 185 -105.11 gain 185 135 -102.07 gain 135 186 -114.76 gain 186 135 -110.73 gain 135 187 -107.83 gain 187 135 -107.88 gain 135 188 -112.30 gain 188 135 -115.11 gain 135 189 -113.03 gain 189 135 -115.24 gain 135 190 -116.96 gain 190 135 -114.83 gain 135 191 -115.65 gain 191 135 -116.55 gain 135 192 -118.30 gain 192 135 -116.52 gain 135 193 -120.07 gain 193 135 -122.27 gain 135 194 -118.67 gain 194 135 -120.44 gain 135 195 -102.52 gain 195 135 -102.48 gain 135 196 -101.83 gain 196 135 -100.82 gain 135 197 -110.29 gain 197 135 -111.94 gain 135 198 -109.21 gain 198 135 -114.80 gain 135 199 -102.90 gain 199 135 -100.06 gain 135 200 -114.00 gain 200 135 -107.93 gain 135 201 -115.64 gain 201 135 -113.39 gain 135 202 -106.46 gain 202 135 -105.73 gain 135 203 -117.47 gain 203 135 -113.37 gain 135 204 -119.68 gain 204 135 -122.67 gain 135 205 -120.35 gain 205 135 -121.40 gain 135 206 -114.51 gain 206 135 -113.53 gain 135 207 -122.69 gain 207 135 -122.48 gain 135 208 -120.14 gain 208 135 -120.10 gain 135 209 -122.43 gain 209 135 -118.39 gain 135 210 -109.11 gain 210 135 -111.65 gain 135 211 -107.36 gain 211 135 -106.17 gain 135 212 -107.86 gain 212 135 -104.21 gain 135 213 -101.94 gain 213 135 -103.16 gain 135 214 -101.99 gain 214 135 -99.51 gain 135 215 -110.42 gain 215 135 -109.03 gain 135 216 -112.74 gain 216 135 -112.17 gain 135 217 -118.43 gain 217 135 -121.69 gain 135 218 -115.10 gain 218 135 -110.55 gain 135 219 -116.33 gain 219 135 -114.60 gain 135 220 -120.54 gain 220 135 -115.16 gain 135 221 -122.36 gain 221 135 -121.49 gain 135 222 -122.05 gain 222 135 -122.54 gain 135 223 -120.36 gain 223 135 -122.86 gain 135 224 -121.17 gain 224 135 -124.17 gain 136 137 -90.92 gain 137 136 -88.71 gain 136 138 -90.55 gain 138 136 -84.57 gain 136 139 -104.87 gain 139 136 -100.78 gain 136 140 -101.65 gain 140 136 -103.62 gain 136 141 -111.95 gain 141 136 -108.81 gain 136 142 -113.34 gain 142 136 -115.01 gain 136 143 -112.94 gain 143 136 -110.16 gain 136 144 -109.92 gain 144 136 -108.04 gain 136 145 -123.67 gain 145 136 -121.39 gain 136 146 -116.15 gain 146 136 -111.42 gain 136 147 -119.07 gain 147 136 -118.18 gain 136 148 -122.62 gain 148 136 -120.67 gain 136 149 -116.69 gain 149 136 -113.99 gain 136 150 -85.78 gain 150 136 -88.19 gain 136 151 -84.76 gain 151 136 -80.73 gain 136 152 -85.71 gain 152 136 -83.50 gain 136 153 -95.01 gain 153 136 -95.24 gain 136 154 -99.89 gain 154 136 -95.73 gain 136 155 -104.27 gain 155 136 -103.94 gain 136 156 -107.45 gain 156 136 -105.14 gain 136 157 -112.40 gain 157 136 -112.05 gain 136 158 -110.66 gain 158 136 -110.74 gain 136 159 -112.28 gain 159 136 -106.00 gain 136 160 -121.32 gain 160 136 -117.31 gain 136 161 -122.65 gain 161 136 -121.51 gain 136 162 -121.46 gain 162 136 -117.39 gain 136 163 -118.24 gain 163 136 -111.36 gain 136 164 -118.98 gain 164 136 -113.84 gain 136 165 -99.00 gain 165 136 -96.79 gain 136 166 -99.56 gain 166 136 -100.03 gain 136 167 -100.17 gain 167 136 -99.77 gain 136 168 -103.75 gain 168 136 -104.69 gain 136 169 -104.87 gain 169 136 -98.16 gain 136 170 -105.34 gain 170 136 -109.13 gain 136 171 -110.34 gain 171 136 -110.55 gain 136 172 -106.94 gain 172 136 -100.24 gain 136 173 -106.62 gain 173 136 -104.59 gain 136 174 -121.34 gain 174 136 -119.07 gain 136 175 -116.50 gain 175 136 -113.44 gain 136 176 -123.73 gain 176 136 -120.62 gain 136 177 -116.37 gain 177 136 -114.75 gain 136 178 -115.57 gain 178 136 -114.90 gain 136 179 -121.38 gain 179 136 -121.73 gain 136 180 -108.11 gain 180 136 -104.27 gain 136 181 -109.41 gain 181 136 -110.01 gain 136 182 -105.45 gain 182 136 -102.35 gain 136 183 -105.03 gain 183 136 -103.22 gain 136 184 -106.89 gain 184 136 -107.14 gain 136 185 -106.71 gain 185 136 -102.39 gain 136 186 -115.62 gain 186 136 -110.29 gain 136 187 -115.54 gain 187 136 -114.31 gain 136 188 -105.10 gain 188 136 -106.63 gain 136 189 -116.63 gain 189 136 -117.54 gain 136 190 -110.71 gain 190 136 -107.30 gain 136 191 -123.16 gain 191 136 -122.77 gain 136 192 -121.16 gain 192 136 -118.09 gain 136 193 -122.27 gain 193 136 -123.18 gain 136 194 -122.96 gain 194 136 -123.44 gain 136 195 -99.32 gain 195 136 -97.99 gain 136 196 -103.07 gain 196 136 -100.77 gain 136 197 -109.04 gain 197 136 -109.41 gain 136 198 -106.67 gain 198 136 -110.98 gain 136 199 -105.59 gain 199 136 -101.46 gain 136 200 -107.63 gain 200 136 -100.27 gain 136 201 -112.62 gain 201 136 -109.07 gain 136 202 -118.45 gain 202 136 -116.43 gain 136 203 -121.97 gain 203 136 -116.58 gain 136 204 -114.57 gain 204 136 -116.26 gain 136 205 -119.93 gain 205 136 -119.69 gain 136 206 -118.59 gain 206 136 -116.32 gain 136 207 -119.25 gain 207 136 -117.75 gain 136 208 -121.43 gain 208 136 -120.10 gain 136 209 -120.21 gain 209 136 -114.88 gain 136 210 -108.33 gain 210 136 -109.59 gain 136 211 -105.06 gain 211 136 -102.58 gain 136 212 -101.21 gain 212 136 -96.28 gain 136 213 -114.76 gain 213 136 -114.69 gain 136 214 -104.26 gain 214 136 -100.49 gain 136 215 -109.29 gain 215 136 -106.62 gain 136 216 -115.48 gain 216 136 -113.63 gain 136 217 -115.30 gain 217 136 -117.27 gain 136 218 -117.08 gain 218 136 -111.24 gain 136 219 -125.99 gain 219 136 -122.97 gain 136 220 -113.15 gain 220 136 -106.48 gain 136 221 -115.90 gain 221 136 -113.74 gain 136 222 -113.59 gain 222 136 -112.80 gain 136 223 -121.31 gain 223 136 -122.53 gain 136 224 -111.01 gain 224 136 -112.72 gain 137 138 -78.85 gain 138 137 -75.08 gain 137 139 -90.96 gain 139 137 -89.09 gain 137 140 -99.40 gain 140 137 -103.59 gain 137 141 -108.15 gain 141 137 -107.23 gain 137 142 -107.30 gain 142 137 -111.19 gain 137 143 -109.76 gain 143 137 -109.19 gain 137 144 -102.41 gain 144 137 -102.75 gain 137 145 -108.96 gain 145 137 -108.89 gain 137 146 -111.87 gain 146 137 -109.36 gain 137 147 -111.81 gain 147 137 -113.14 gain 137 148 -117.40 gain 148 137 -117.66 gain 137 149 -110.16 gain 149 137 -109.68 gain 137 150 -89.13 gain 150 137 -93.76 gain 137 151 -91.00 gain 151 137 -89.19 gain 137 152 -90.41 gain 152 137 -90.43 gain 137 153 -82.84 gain 153 137 -85.29 gain 137 154 -98.10 gain 154 137 -96.16 gain 137 155 -98.00 gain 155 137 -99.89 gain 137 156 -104.99 gain 156 137 -104.90 gain 137 157 -104.41 gain 157 137 -106.27 gain 137 158 -111.13 gain 158 137 -113.43 gain 137 159 -112.70 gain 159 137 -108.64 gain 137 160 -110.52 gain 160 137 -108.73 gain 137 161 -117.93 gain 161 137 -119.01 gain 137 162 -112.47 gain 162 137 -110.62 gain 137 163 -117.75 gain 163 137 -113.09 gain 137 164 -115.13 gain 164 137 -112.21 gain 137 165 -100.63 gain 165 137 -100.65 gain 137 166 -96.51 gain 166 137 -99.20 gain 137 167 -90.50 gain 167 137 -92.32 gain 137 168 -87.68 gain 168 137 -90.84 gain 137 169 -95.13 gain 169 137 -90.64 gain 137 170 -105.14 gain 170 137 -111.13 gain 137 171 -104.62 gain 171 137 -107.05 gain 137 172 -112.96 gain 172 137 -108.48 gain 137 173 -104.22 gain 173 137 -104.40 gain 137 174 -111.15 gain 174 137 -111.10 gain 137 175 -116.86 gain 175 137 -116.01 gain 137 176 -111.07 gain 176 137 -110.17 gain 137 177 -114.02 gain 177 137 -114.62 gain 137 178 -119.53 gain 178 137 -121.08 gain 137 179 -113.31 gain 179 137 -115.89 gain 137 180 -100.30 gain 180 137 -98.67 gain 137 181 -97.97 gain 181 137 -100.79 gain 137 182 -96.85 gain 182 137 -95.97 gain 137 183 -96.95 gain 183 137 -97.37 gain 137 184 -99.01 gain 184 137 -101.47 gain 137 185 -103.68 gain 185 137 -101.57 gain 137 186 -97.41 gain 186 137 -94.30 gain 137 187 -102.78 gain 187 137 -103.76 gain 137 188 -102.52 gain 188 137 -106.26 gain 137 189 -112.85 gain 189 137 -115.98 gain 137 190 -110.69 gain 190 137 -109.49 gain 137 191 -111.54 gain 191 137 -113.37 gain 137 192 -112.25 gain 192 137 -111.41 gain 137 193 -118.92 gain 193 137 -122.05 gain 137 194 -126.61 gain 194 137 -129.31 gain 137 195 -107.24 gain 195 137 -108.13 gain 137 196 -107.94 gain 196 137 -107.85 gain 137 197 -99.83 gain 197 137 -102.41 gain 137 198 -98.55 gain 198 137 -105.07 gain 137 199 -102.36 gain 199 137 -100.45 gain 137 200 -103.07 gain 200 137 -97.92 gain 137 201 -104.04 gain 201 137 -102.71 gain 137 202 -104.61 gain 202 137 -104.81 gain 137 203 -118.49 gain 203 137 -115.33 gain 137 204 -118.31 gain 204 137 -122.23 gain 137 205 -117.32 gain 205 137 -119.30 gain 137 206 -110.96 gain 206 137 -110.92 gain 137 207 -106.44 gain 207 137 -107.16 gain 137 208 -122.95 gain 208 137 -123.84 gain 137 209 -124.44 gain 209 137 -121.33 gain 137 210 -107.01 gain 210 137 -110.48 gain 137 211 -104.86 gain 211 137 -104.60 gain 137 212 -109.30 gain 212 137 -106.58 gain 137 213 -109.44 gain 213 137 -111.59 gain 137 214 -109.50 gain 214 137 -107.96 gain 137 215 -105.67 gain 215 137 -105.21 gain 137 216 -107.59 gain 216 137 -107.96 gain 137 217 -110.71 gain 217 137 -114.90 gain 137 218 -114.65 gain 218 137 -111.02 gain 137 219 -119.57 gain 219 137 -118.77 gain 137 220 -109.29 gain 220 137 -104.84 gain 137 221 -119.24 gain 221 137 -119.29 gain 137 222 -111.42 gain 222 137 -112.84 gain 137 223 -110.31 gain 223 137 -113.74 gain 137 224 -119.71 gain 224 137 -123.64 gain 138 139 -84.06 gain 139 138 -85.96 gain 138 140 -92.57 gain 140 138 -100.53 gain 138 141 -99.34 gain 141 138 -102.19 gain 138 142 -95.45 gain 142 138 -103.11 gain 138 143 -100.83 gain 143 138 -104.02 gain 138 144 -103.24 gain 144 138 -107.34 gain 138 145 -106.43 gain 145 138 -110.13 gain 138 146 -104.53 gain 146 138 -105.79 gain 138 147 -114.14 gain 147 138 -119.25 gain 138 148 -106.95 gain 148 138 -110.98 gain 138 149 -112.05 gain 149 138 -115.33 gain 138 150 -105.41 gain 150 138 -113.80 gain 138 151 -94.49 gain 151 138 -96.45 gain 138 152 -85.73 gain 152 138 -89.52 gain 138 153 -82.51 gain 153 138 -88.73 gain 138 154 -88.35 gain 154 138 -90.18 gain 138 155 -91.52 gain 155 138 -97.18 gain 138 156 -92.29 gain 156 138 -95.96 gain 138 157 -96.66 gain 157 138 -102.29 gain 138 158 -102.35 gain 158 138 -108.42 gain 138 159 -98.07 gain 159 138 -97.77 gain 138 160 -110.06 gain 160 138 -112.03 gain 138 161 -113.66 gain 161 138 -118.50 gain 138 162 -104.69 gain 162 138 -106.61 gain 138 163 -103.78 gain 163 138 -102.88 gain 138 164 -109.58 gain 164 138 -110.43 gain 138 165 -99.57 gain 165 138 -103.35 gain 138 166 -100.83 gain 166 138 -107.29 gain 138 167 -97.38 gain 167 138 -102.96 gain 138 168 -88.73 gain 168 138 -95.66 gain 138 169 -90.90 gain 169 138 -90.17 gain 138 170 -88.20 gain 170 138 -97.97 gain 138 171 -105.37 gain 171 138 -111.56 gain 138 172 -105.10 gain 172 138 -104.39 gain 138 173 -103.51 gain 173 138 -107.46 gain 138 174 -99.36 gain 174 138 -103.07 gain 138 175 -104.78 gain 175 138 -107.70 gain 138 176 -108.40 gain 176 138 -111.28 gain 138 177 -108.56 gain 177 138 -112.92 gain 138 178 -112.61 gain 178 138 -117.93 gain 138 179 -109.29 gain 179 138 -115.63 gain 138 180 -93.62 gain 180 138 -95.76 gain 138 181 -104.12 gain 181 138 -110.71 gain 138 182 -99.51 gain 182 138 -102.39 gain 138 183 -91.27 gain 183 138 -95.45 gain 138 184 -96.86 gain 184 138 -103.10 gain 138 185 -98.07 gain 185 138 -99.73 gain 138 186 -98.46 gain 186 138 -99.12 gain 138 187 -98.69 gain 187 138 -103.43 gain 138 188 -105.27 gain 188 138 -112.78 gain 138 189 -98.90 gain 189 138 -105.80 gain 138 190 -111.03 gain 190 138 -113.60 gain 138 191 -108.98 gain 191 138 -114.58 gain 138 192 -111.85 gain 192 138 -114.77 gain 138 193 -106.99 gain 193 138 -113.88 gain 138 194 -113.97 gain 194 138 -120.44 gain 138 195 -99.90 gain 195 138 -104.56 gain 138 196 -102.33 gain 196 138 -106.01 gain 138 197 -100.67 gain 197 138 -107.03 gain 138 198 -101.33 gain 198 138 -111.62 gain 138 199 -96.84 gain 199 138 -98.69 gain 138 200 -102.61 gain 200 138 -101.23 gain 138 201 -99.71 gain 201 138 -102.15 gain 138 202 -100.34 gain 202 138 -104.31 gain 138 203 -107.96 gain 203 138 -108.56 gain 138 204 -109.77 gain 204 138 -117.45 gain 138 205 -106.29 gain 205 138 -112.03 gain 138 206 -114.53 gain 206 138 -118.25 gain 138 207 -111.56 gain 207 138 -116.05 gain 138 208 -104.88 gain 208 138 -109.54 gain 138 209 -112.65 gain 209 138 -113.31 gain 138 210 -103.33 gain 210 138 -110.57 gain 138 211 -104.18 gain 211 138 -107.68 gain 138 212 -102.32 gain 212 138 -103.37 gain 138 213 -102.57 gain 213 138 -108.49 gain 138 214 -102.43 gain 214 138 -104.65 gain 138 215 -106.97 gain 215 138 -110.28 gain 138 216 -106.42 gain 216 138 -110.55 gain 138 217 -104.97 gain 217 138 -112.93 gain 138 218 -106.77 gain 218 138 -106.91 gain 138 219 -110.18 gain 219 138 -113.14 gain 138 220 -108.00 gain 220 138 -107.32 gain 138 221 -115.75 gain 221 138 -119.57 gain 138 222 -113.19 gain 222 138 -118.37 gain 138 223 -116.40 gain 223 138 -123.60 gain 138 224 -112.09 gain 224 138 -119.78 gain 139 140 -85.85 gain 140 139 -91.90 gain 139 141 -91.78 gain 141 139 -92.72 gain 139 142 -101.42 gain 142 139 -107.18 gain 139 143 -106.47 gain 143 139 -107.77 gain 139 144 -107.20 gain 144 139 -109.40 gain 139 145 -101.46 gain 145 139 -103.26 gain 139 146 -111.99 gain 146 139 -111.34 gain 139 147 -105.52 gain 147 139 -108.72 gain 139 148 -117.03 gain 148 139 -119.16 gain 139 149 -114.96 gain 149 139 -116.34 gain 139 150 -97.21 gain 150 139 -103.71 gain 139 151 -90.19 gain 151 139 -90.25 gain 139 152 -90.77 gain 152 139 -92.65 gain 139 153 -86.14 gain 153 139 -90.45 gain 139 154 -88.16 gain 154 139 -88.08 gain 139 155 -75.53 gain 155 139 -79.28 gain 139 156 -91.06 gain 156 139 -92.84 gain 139 157 -101.57 gain 157 139 -105.30 gain 139 158 -107.39 gain 158 139 -111.56 gain 139 159 -103.89 gain 159 139 -101.70 gain 139 160 -105.10 gain 160 139 -105.18 gain 139 161 -101.70 gain 161 139 -104.64 gain 139 162 -110.01 gain 162 139 -110.03 gain 139 163 -112.87 gain 163 139 -110.08 gain 139 164 -113.91 gain 164 139 -112.86 gain 139 165 -106.17 gain 165 139 -108.05 gain 139 166 -95.72 gain 166 139 -100.27 gain 139 167 -91.82 gain 167 139 -95.50 gain 139 168 -91.94 gain 168 139 -96.96 gain 139 169 -94.38 gain 169 139 -91.76 gain 139 170 -92.91 gain 170 139 -100.78 gain 139 171 -98.21 gain 171 139 -102.50 gain 139 172 -104.35 gain 172 139 -101.75 gain 139 173 -96.12 gain 173 139 -98.18 gain 139 174 -99.76 gain 174 139 -101.57 gain 139 175 -107.00 gain 175 139 -108.02 gain 139 176 -112.99 gain 176 139 -113.97 gain 139 177 -106.04 gain 177 139 -108.51 gain 139 178 -114.28 gain 178 139 -117.69 gain 139 179 -117.04 gain 179 139 -121.48 gain 139 180 -105.08 gain 180 139 -105.32 gain 139 181 -104.62 gain 181 139 -109.30 gain 139 182 -101.55 gain 182 139 -102.53 gain 139 183 -103.54 gain 183 139 -105.83 gain 139 184 -98.48 gain 184 139 -102.81 gain 139 185 -103.19 gain 185 139 -102.95 gain 139 186 -101.25 gain 186 139 -100.01 gain 139 187 -104.36 gain 187 139 -107.20 gain 139 188 -99.85 gain 188 139 -105.46 gain 139 189 -97.43 gain 189 139 -102.44 gain 139 190 -115.63 gain 190 139 -116.30 gain 139 191 -113.83 gain 191 139 -117.53 gain 139 192 -110.31 gain 192 139 -111.33 gain 139 193 -108.11 gain 193 139 -113.11 gain 139 194 -110.53 gain 194 139 -115.10 gain 139 195 -110.71 gain 195 139 -113.46 gain 139 196 -105.04 gain 196 139 -106.82 gain 139 197 -102.48 gain 197 139 -106.93 gain 139 198 -101.06 gain 198 139 -109.45 gain 139 199 -102.81 gain 199 139 -102.76 gain 139 200 -97.73 gain 200 139 -94.45 gain 139 201 -101.00 gain 201 139 -101.54 gain 139 202 -101.60 gain 202 139 -103.67 gain 139 203 -102.76 gain 203 139 -101.46 gain 139 204 -106.61 gain 204 139 -112.40 gain 139 205 -111.99 gain 205 139 -115.84 gain 139 206 -108.28 gain 206 139 -110.11 gain 139 207 -105.04 gain 207 139 -107.62 gain 139 208 -110.30 gain 208 139 -113.06 gain 139 209 -118.08 gain 209 139 -116.84 gain 139 210 -106.83 gain 210 139 -112.18 gain 139 211 -104.86 gain 211 139 -106.46 gain 139 212 -101.03 gain 212 139 -100.19 gain 139 213 -99.30 gain 213 139 -103.32 gain 139 214 -105.36 gain 214 139 -105.68 gain 139 215 -104.66 gain 215 139 -106.07 gain 139 216 -103.55 gain 216 139 -105.78 gain 139 217 -103.06 gain 217 139 -109.12 gain 139 218 -105.35 gain 218 139 -103.60 gain 139 219 -106.24 gain 219 139 -107.30 gain 139 220 -113.59 gain 220 139 -111.00 gain 139 221 -114.06 gain 221 139 -115.98 gain 139 222 -113.06 gain 222 139 -116.34 gain 139 223 -109.96 gain 223 139 -115.26 gain 139 224 -115.75 gain 224 139 -121.54 gain 140 141 -93.58 gain 141 140 -88.46 gain 140 142 -96.67 gain 142 140 -96.37 gain 140 143 -99.25 gain 143 140 -94.49 gain 140 144 -105.11 gain 144 140 -101.26 gain 140 145 -111.02 gain 145 140 -106.76 gain 140 146 -112.66 gain 146 140 -105.95 gain 140 147 -113.51 gain 147 140 -110.65 gain 140 148 -113.61 gain 148 140 -109.69 gain 140 149 -117.06 gain 149 140 -112.39 gain 140 150 -110.97 gain 150 140 -111.41 gain 140 151 -106.50 gain 151 140 -100.50 gain 140 152 -109.67 gain 152 140 -105.49 gain 140 153 -102.73 gain 153 140 -100.98 gain 140 154 -96.97 gain 154 140 -90.84 gain 140 155 -86.79 gain 155 140 -84.49 gain 140 156 -84.94 gain 156 140 -80.66 gain 140 157 -105.16 gain 157 140 -102.83 gain 140 158 -98.35 gain 158 140 -96.46 gain 140 159 -108.18 gain 159 140 -99.93 gain 140 160 -107.97 gain 160 140 -101.99 gain 140 161 -109.81 gain 161 140 -106.69 gain 140 162 -110.73 gain 162 140 -104.69 gain 140 163 -117.54 gain 163 140 -108.69 gain 140 164 -124.56 gain 164 140 -117.46 gain 140 165 -104.23 gain 165 140 -100.06 gain 140 166 -105.81 gain 166 140 -104.31 gain 140 167 -108.89 gain 167 140 -106.51 gain 140 168 -103.70 gain 168 140 -102.67 gain 140 169 -99.27 gain 169 140 -90.59 gain 140 170 -93.01 gain 170 140 -94.81 gain 140 171 -106.45 gain 171 140 -104.69 gain 140 172 -102.26 gain 172 140 -93.59 gain 140 173 -113.47 gain 173 140 -109.46 gain 140 174 -103.58 gain 174 140 -99.34 gain 140 175 -116.81 gain 175 140 -111.77 gain 140 176 -118.97 gain 176 140 -113.88 gain 140 177 -112.12 gain 177 140 -108.52 gain 140 178 -114.77 gain 178 140 -112.13 gain 140 179 -118.42 gain 179 140 -116.80 gain 140 180 -111.84 gain 180 140 -106.03 gain 140 181 -112.29 gain 181 140 -110.91 gain 140 182 -106.49 gain 182 140 -101.41 gain 140 183 -104.98 gain 183 140 -101.20 gain 140 184 -110.23 gain 184 140 -108.51 gain 140 185 -102.19 gain 185 140 -95.89 gain 140 186 -102.59 gain 186 140 -95.29 gain 140 187 -104.26 gain 187 140 -101.05 gain 140 188 -110.99 gain 188 140 -110.54 gain 140 189 -106.81 gain 189 140 -105.75 gain 140 190 -114.16 gain 190 140 -108.77 gain 140 191 -110.09 gain 191 140 -107.74 gain 140 192 -118.80 gain 192 140 -113.76 gain 140 193 -118.73 gain 193 140 -117.66 gain 140 194 -112.55 gain 194 140 -111.06 gain 140 195 -113.81 gain 195 140 -110.51 gain 140 196 -106.30 gain 196 140 -102.03 gain 140 197 -103.12 gain 197 140 -101.52 gain 140 198 -102.77 gain 198 140 -105.10 gain 140 199 -107.32 gain 199 140 -101.22 gain 140 200 -102.43 gain 200 140 -93.09 gain 140 201 -105.29 gain 201 140 -99.77 gain 140 202 -111.10 gain 202 140 -107.11 gain 140 203 -115.83 gain 203 140 -108.47 gain 140 204 -116.43 gain 204 140 -116.15 gain 140 205 -113.48 gain 205 140 -111.27 gain 140 206 -115.63 gain 206 140 -111.40 gain 140 207 -118.65 gain 207 140 -115.18 gain 140 208 -122.30 gain 208 140 -118.99 gain 140 209 -125.18 gain 209 140 -117.88 gain 140 210 -114.45 gain 210 140 -113.74 gain 140 211 -110.34 gain 211 140 -105.88 gain 140 212 -118.73 gain 212 140 -111.83 gain 140 213 -111.78 gain 213 140 -109.74 gain 140 214 -111.20 gain 214 140 -105.46 gain 140 215 -111.76 gain 215 140 -107.11 gain 140 216 -102.47 gain 216 140 -98.64 gain 140 217 -104.19 gain 217 140 -104.18 gain 140 218 -116.18 gain 218 140 -108.36 gain 140 219 -116.32 gain 219 140 -111.32 gain 140 220 -114.59 gain 220 140 -105.94 gain 140 221 -109.24 gain 221 140 -105.10 gain 140 222 -121.17 gain 222 140 -118.40 gain 140 223 -119.11 gain 223 140 -118.35 gain 140 224 -118.15 gain 224 140 -117.89 gain 141 142 -86.61 gain 142 141 -91.42 gain 141 143 -89.61 gain 143 141 -89.97 gain 141 144 -105.15 gain 144 141 -106.41 gain 141 145 -105.45 gain 145 141 -106.31 gain 141 146 -101.80 gain 146 141 -100.21 gain 141 147 -110.63 gain 147 141 -112.89 gain 141 148 -115.27 gain 148 141 -116.46 gain 141 149 -103.55 gain 149 141 -103.99 gain 141 150 -98.13 gain 150 141 -103.68 gain 141 151 -109.10 gain 151 141 -108.21 gain 141 152 -106.44 gain 152 141 -107.38 gain 141 153 -97.11 gain 153 141 -100.48 gain 141 154 -91.74 gain 154 141 -90.72 gain 141 155 -80.02 gain 155 141 -82.84 gain 141 156 -79.16 gain 156 141 -79.99 gain 141 157 -92.59 gain 157 141 -95.38 gain 141 158 -90.44 gain 158 141 -93.66 gain 141 159 -91.77 gain 159 141 -88.63 gain 141 160 -102.06 gain 160 141 -101.19 gain 141 161 -104.21 gain 161 141 -106.20 gain 141 162 -110.39 gain 162 141 -109.46 gain 141 163 -105.32 gain 163 141 -101.58 gain 141 164 -110.66 gain 164 141 -108.66 gain 141 165 -110.43 gain 165 141 -111.36 gain 141 166 -112.01 gain 166 141 -115.62 gain 141 167 -93.74 gain 167 141 -96.48 gain 141 168 -101.38 gain 168 141 -105.46 gain 141 169 -95.73 gain 169 141 -92.16 gain 141 170 -97.56 gain 170 141 -104.49 gain 141 171 -97.22 gain 171 141 -100.57 gain 141 172 -91.96 gain 172 141 -88.40 gain 141 173 -102.46 gain 173 141 -103.57 gain 141 174 -99.84 gain 174 141 -100.71 gain 141 175 -100.58 gain 175 141 -100.65 gain 141 176 -104.00 gain 176 141 -104.03 gain 141 177 -106.86 gain 177 141 -108.37 gain 141 178 -105.94 gain 178 141 -108.41 gain 141 179 -108.32 gain 179 141 -111.82 gain 141 180 -104.31 gain 180 141 -103.61 gain 141 181 -111.83 gain 181 141 -115.56 gain 141 182 -100.57 gain 182 141 -100.61 gain 141 183 -105.09 gain 183 141 -106.43 gain 141 184 -95.69 gain 184 141 -99.08 gain 141 185 -92.94 gain 185 141 -91.76 gain 141 186 -106.31 gain 186 141 -104.13 gain 141 187 -102.79 gain 187 141 -104.69 gain 141 188 -96.05 gain 188 141 -100.72 gain 141 189 -102.35 gain 189 141 -106.41 gain 141 190 -102.66 gain 190 141 -102.38 gain 141 191 -103.98 gain 191 141 -106.74 gain 141 192 -114.21 gain 192 141 -114.28 gain 141 193 -108.05 gain 193 141 -112.11 gain 141 194 -118.46 gain 194 141 -122.08 gain 141 195 -109.80 gain 195 141 -111.61 gain 141 196 -101.81 gain 196 141 -102.64 gain 141 197 -113.00 gain 197 141 -116.51 gain 141 198 -106.43 gain 198 141 -113.87 gain 141 199 -100.12 gain 199 141 -99.13 gain 141 200 -102.57 gain 200 141 -98.35 gain 141 201 -108.61 gain 201 141 -108.21 gain 141 202 -105.38 gain 202 141 -106.51 gain 141 203 -114.80 gain 203 141 -112.55 gain 141 204 -108.34 gain 204 141 -113.17 gain 141 205 -105.47 gain 205 141 -108.38 gain 141 206 -100.70 gain 206 141 -101.58 gain 141 207 -106.46 gain 207 141 -108.10 gain 141 208 -109.87 gain 208 141 -111.69 gain 141 209 -110.41 gain 209 141 -108.23 gain 141 210 -113.47 gain 210 141 -117.87 gain 141 211 -104.44 gain 211 141 -105.10 gain 141 212 -111.69 gain 212 141 -109.90 gain 141 213 -104.43 gain 213 141 -107.50 gain 141 214 -100.30 gain 214 141 -99.67 gain 141 215 -104.54 gain 215 141 -105.00 gain 141 216 -112.94 gain 216 141 -114.23 gain 141 217 -99.32 gain 217 141 -104.43 gain 141 218 -105.10 gain 218 141 -102.40 gain 141 219 -99.29 gain 219 141 -99.41 gain 141 220 -108.68 gain 220 141 -105.15 gain 141 221 -113.70 gain 221 141 -114.67 gain 141 222 -109.71 gain 222 141 -112.05 gain 141 223 -116.36 gain 223 141 -120.71 gain 141 224 -111.69 gain 224 141 -116.54 gain 142 143 -87.20 gain 143 142 -82.75 gain 142 144 -101.41 gain 144 142 -97.86 gain 142 145 -106.31 gain 145 142 -102.35 gain 142 146 -108.07 gain 146 142 -101.67 gain 142 147 -110.66 gain 147 142 -108.11 gain 142 148 -117.28 gain 148 142 -113.65 gain 142 149 -120.46 gain 149 142 -116.09 gain 142 150 -111.77 gain 150 142 -112.50 gain 142 151 -119.00 gain 151 142 -113.30 gain 142 152 -107.32 gain 152 142 -103.44 gain 142 153 -104.56 gain 153 142 -103.12 gain 142 154 -108.94 gain 154 142 -103.11 gain 142 155 -102.85 gain 155 142 -100.85 gain 142 156 -92.31 gain 156 142 -88.32 gain 142 157 -87.62 gain 157 142 -85.59 gain 142 158 -82.82 gain 158 142 -81.23 gain 142 159 -98.34 gain 159 142 -90.39 gain 142 160 -105.54 gain 160 142 -99.86 gain 142 161 -112.96 gain 161 142 -110.14 gain 142 162 -105.68 gain 162 142 -99.94 gain 142 163 -107.09 gain 163 142 -98.54 gain 142 164 -116.70 gain 164 142 -109.89 gain 142 165 -115.30 gain 165 142 -111.42 gain 142 166 -110.16 gain 166 142 -108.96 gain 142 167 -110.47 gain 167 142 -108.39 gain 142 168 -105.75 gain 168 142 -105.02 gain 142 169 -101.63 gain 169 142 -93.25 gain 142 170 -97.52 gain 170 142 -99.63 gain 142 171 -99.92 gain 171 142 -98.45 gain 142 172 -96.78 gain 172 142 -88.41 gain 142 173 -99.30 gain 173 142 -95.59 gain 142 174 -96.15 gain 174 142 -92.21 gain 142 175 -107.50 gain 175 142 -102.76 gain 142 176 -107.76 gain 176 142 -102.97 gain 142 177 -104.11 gain 177 142 -100.81 gain 142 178 -109.28 gain 178 142 -106.93 gain 142 179 -108.81 gain 179 142 -107.49 gain 142 180 -113.43 gain 180 142 -107.92 gain 142 181 -114.25 gain 181 142 -113.17 gain 142 182 -100.59 gain 182 142 -95.81 gain 142 183 -106.59 gain 183 142 -103.11 gain 142 184 -105.43 gain 184 142 -104.01 gain 142 185 -104.63 gain 185 142 -98.63 gain 142 186 -105.82 gain 186 142 -98.82 gain 142 187 -108.85 gain 187 142 -105.94 gain 142 188 -107.35 gain 188 142 -107.20 gain 142 189 -102.75 gain 189 142 -102.00 gain 142 190 -102.56 gain 190 142 -97.47 gain 142 191 -108.03 gain 191 142 -105.97 gain 142 192 -116.82 gain 192 142 -112.08 gain 142 193 -115.43 gain 193 142 -114.67 gain 142 194 -117.67 gain 194 142 -116.48 gain 142 195 -108.93 gain 195 142 -105.92 gain 142 196 -115.37 gain 196 142 -111.40 gain 142 197 -118.88 gain 197 142 -117.58 gain 142 198 -113.21 gain 198 142 -115.84 gain 142 199 -110.80 gain 199 142 -105.00 gain 142 200 -108.54 gain 200 142 -99.51 gain 142 201 -105.67 gain 201 142 -100.46 gain 142 202 -103.85 gain 202 142 -100.16 gain 142 203 -105.98 gain 203 142 -98.92 gain 142 204 -97.35 gain 204 142 -97.37 gain 142 205 -102.95 gain 205 142 -101.04 gain 142 206 -105.29 gain 206 142 -101.35 gain 142 207 -119.53 gain 207 142 -116.35 gain 142 208 -115.84 gain 208 142 -112.84 gain 142 209 -120.86 gain 209 142 -113.86 gain 142 210 -113.30 gain 210 142 -112.89 gain 142 211 -104.71 gain 211 142 -100.56 gain 142 212 -118.92 gain 212 142 -112.32 gain 142 213 -113.89 gain 213 142 -112.15 gain 142 214 -110.69 gain 214 142 -105.25 gain 142 215 -109.70 gain 215 142 -105.35 gain 142 216 -107.61 gain 216 142 -104.09 gain 142 217 -114.59 gain 217 142 -114.89 gain 142 218 -105.73 gain 218 142 -98.22 gain 142 219 -110.56 gain 219 142 -105.86 gain 142 220 -111.70 gain 220 142 -103.36 gain 142 221 -111.90 gain 221 142 -108.06 gain 142 222 -117.22 gain 222 142 -114.75 gain 142 223 -111.26 gain 223 142 -110.80 gain 142 224 -112.90 gain 224 142 -112.94 gain 143 144 -83.16 gain 144 143 -84.06 gain 143 145 -98.55 gain 145 143 -99.05 gain 143 146 -103.46 gain 146 143 -101.51 gain 143 147 -105.10 gain 147 143 -107.00 gain 143 148 -100.28 gain 148 143 -101.11 gain 143 149 -108.98 gain 149 143 -109.06 gain 143 150 -107.03 gain 150 143 -112.22 gain 143 151 -103.04 gain 151 143 -101.79 gain 143 152 -111.88 gain 152 143 -112.46 gain 143 153 -103.35 gain 153 143 -106.37 gain 143 154 -104.00 gain 154 143 -102.63 gain 143 155 -98.21 gain 155 143 -100.67 gain 143 156 -103.31 gain 156 143 -103.79 gain 143 157 -87.58 gain 157 143 -90.02 gain 143 158 -82.06 gain 158 143 -84.92 gain 143 159 -92.16 gain 159 143 -88.66 gain 143 160 -95.36 gain 160 143 -94.14 gain 143 161 -94.50 gain 161 143 -96.14 gain 143 162 -111.55 gain 162 143 -110.27 gain 143 163 -106.95 gain 163 143 -102.86 gain 143 164 -109.76 gain 164 143 -107.41 gain 143 165 -107.66 gain 165 143 -108.24 gain 143 166 -109.57 gain 166 143 -112.83 gain 143 167 -103.68 gain 167 143 -106.06 gain 143 168 -110.77 gain 168 143 -114.50 gain 143 169 -98.69 gain 169 143 -94.76 gain 143 170 -98.69 gain 170 143 -105.26 gain 143 171 -102.38 gain 171 143 -105.37 gain 143 172 -89.90 gain 172 143 -85.99 gain 143 173 -90.92 gain 173 143 -91.67 gain 143 174 -93.52 gain 174 143 -94.03 gain 143 175 -92.42 gain 175 143 -92.14 gain 143 176 -98.34 gain 176 143 -98.01 gain 143 177 -112.01 gain 177 143 -113.18 gain 143 178 -101.91 gain 178 143 -104.02 gain 143 179 -106.20 gain 179 143 -109.35 gain 143 180 -107.01 gain 180 143 -105.95 gain 143 181 -113.33 gain 181 143 -116.72 gain 143 182 -113.27 gain 182 143 -112.95 gain 143 183 -102.48 gain 183 143 -103.46 gain 143 184 -99.38 gain 184 143 -102.41 gain 143 185 -101.04 gain 185 143 -99.50 gain 143 186 -94.69 gain 186 143 -92.15 gain 143 187 -103.98 gain 187 143 -105.53 gain 143 188 -93.57 gain 188 143 -97.88 gain 143 189 -99.68 gain 189 143 -103.38 gain 143 190 -95.55 gain 190 143 -94.92 gain 143 191 -106.31 gain 191 143 -108.71 gain 143 192 -102.69 gain 192 143 -102.41 gain 143 193 -102.98 gain 193 143 -106.68 gain 143 194 -111.57 gain 194 143 -114.84 gain 143 195 -107.94 gain 195 143 -109.39 gain 143 196 -115.28 gain 196 143 -115.76 gain 143 197 -110.20 gain 197 143 -113.36 gain 143 198 -104.84 gain 198 143 -111.93 gain 143 199 -107.67 gain 199 143 -106.32 gain 143 200 -103.93 gain 200 143 -99.36 gain 143 201 -105.32 gain 201 143 -104.57 gain 143 202 -104.39 gain 202 143 -105.16 gain 143 203 -109.23 gain 203 143 -106.63 gain 143 204 -99.42 gain 204 143 -103.90 gain 143 205 -108.06 gain 205 143 -110.61 gain 143 206 -105.13 gain 206 143 -105.66 gain 143 207 -116.14 gain 207 143 -117.43 gain 143 208 -105.24 gain 208 143 -106.70 gain 143 209 -114.19 gain 209 143 -111.65 gain 143 210 -111.71 gain 210 143 -115.75 gain 143 211 -111.40 gain 211 143 -111.71 gain 143 212 -116.73 gain 212 143 -114.58 gain 143 213 -108.78 gain 213 143 -111.50 gain 143 214 -106.60 gain 214 143 -105.62 gain 143 215 -101.25 gain 215 143 -101.36 gain 143 216 -111.52 gain 216 143 -112.46 gain 143 217 -104.93 gain 217 143 -109.68 gain 143 218 -109.48 gain 218 143 -106.43 gain 143 219 -105.74 gain 219 143 -105.50 gain 143 220 -103.27 gain 220 143 -99.38 gain 143 221 -104.96 gain 221 143 -105.58 gain 143 222 -108.22 gain 222 143 -110.21 gain 143 223 -111.67 gain 223 143 -115.66 gain 143 224 -114.50 gain 224 143 -119.00 gain 144 145 -85.38 gain 145 144 -84.97 gain 144 146 -93.05 gain 146 144 -90.20 gain 144 147 -103.13 gain 147 144 -104.13 gain 144 148 -98.58 gain 148 144 -98.51 gain 144 149 -106.77 gain 149 144 -105.95 gain 144 150 -113.52 gain 150 144 -117.81 gain 144 151 -119.05 gain 151 144 -116.90 gain 144 152 -113.99 gain 152 144 -113.67 gain 144 153 -111.80 gain 153 144 -113.91 gain 144 154 -112.13 gain 154 144 -109.85 gain 144 155 -106.34 gain 155 144 -107.89 gain 144 156 -95.79 gain 156 144 -95.36 gain 144 157 -99.31 gain 157 144 -100.83 gain 144 158 -91.50 gain 158 144 -93.47 gain 144 159 -86.22 gain 159 144 -81.82 gain 144 160 -92.33 gain 160 144 -90.21 gain 144 161 -98.22 gain 161 144 -98.95 gain 144 162 -95.69 gain 162 144 -93.50 gain 144 163 -98.65 gain 163 144 -93.66 gain 144 164 -100.18 gain 164 144 -96.93 gain 144 165 -115.86 gain 165 144 -115.54 gain 144 166 -119.89 gain 166 144 -122.24 gain 144 167 -111.42 gain 167 144 -112.90 gain 144 168 -103.53 gain 168 144 -106.36 gain 144 169 -106.65 gain 169 144 -101.83 gain 144 170 -101.66 gain 170 144 -107.32 gain 144 171 -96.41 gain 171 144 -98.50 gain 144 172 -98.77 gain 172 144 -93.96 gain 144 173 -97.74 gain 173 144 -97.59 gain 144 174 -90.26 gain 174 144 -89.87 gain 144 175 -97.11 gain 175 144 -95.92 gain 144 176 -99.64 gain 176 144 -98.40 gain 144 177 -102.47 gain 177 144 -102.72 gain 144 178 -101.17 gain 178 144 -102.38 gain 144 179 -98.68 gain 179 144 -100.92 gain 144 180 -118.62 gain 180 144 -116.66 gain 144 181 -115.66 gain 181 144 -118.13 gain 144 182 -111.77 gain 182 144 -110.55 gain 144 183 -114.13 gain 183 144 -114.20 gain 144 184 -104.71 gain 184 144 -106.84 gain 144 185 -103.61 gain 185 144 -101.17 gain 144 186 -107.86 gain 186 144 -104.42 gain 144 187 -102.21 gain 187 144 -102.86 gain 144 188 -96.81 gain 188 144 -100.21 gain 144 189 -107.23 gain 189 144 -110.03 gain 144 190 -95.44 gain 190 144 -93.91 gain 144 191 -101.80 gain 191 144 -103.30 gain 144 192 -99.37 gain 192 144 -98.18 gain 144 193 -95.88 gain 193 144 -98.67 gain 144 194 -113.06 gain 194 144 -115.42 gain 144 195 -109.73 gain 195 144 -110.28 gain 144 196 -115.44 gain 196 144 -115.02 gain 144 197 -112.85 gain 197 144 -115.10 gain 144 198 -107.61 gain 198 144 -113.79 gain 144 199 -106.97 gain 199 144 -104.72 gain 144 200 -112.76 gain 200 144 -107.28 gain 144 201 -104.07 gain 201 144 -102.41 gain 144 202 -103.27 gain 202 144 -103.13 gain 144 203 -99.48 gain 203 144 -95.97 gain 144 204 -102.84 gain 204 144 -106.41 gain 144 205 -99.99 gain 205 144 -101.63 gain 144 206 -103.89 gain 206 144 -103.51 gain 144 207 -109.92 gain 207 144 -110.30 gain 144 208 -107.64 gain 208 144 -108.19 gain 144 209 -105.09 gain 209 144 -101.64 gain 144 210 -110.02 gain 210 144 -113.16 gain 144 211 -117.02 gain 211 144 -116.42 gain 144 212 -114.53 gain 212 144 -111.47 gain 144 213 -113.97 gain 213 144 -115.78 gain 144 214 -106.54 gain 214 144 -104.66 gain 144 215 -111.25 gain 215 144 -110.45 gain 144 216 -110.22 gain 216 144 -110.25 gain 144 217 -111.50 gain 217 144 -115.35 gain 144 218 -109.67 gain 218 144 -105.71 gain 144 219 -105.80 gain 219 144 -104.66 gain 144 220 -106.83 gain 220 144 -102.04 gain 144 221 -104.24 gain 221 144 -103.95 gain 144 222 -102.40 gain 222 144 -103.48 gain 144 223 -108.72 gain 223 144 -111.81 gain 144 224 -121.88 gain 224 144 -125.47 gain 145 146 -80.52 gain 146 145 -78.08 gain 145 147 -97.49 gain 147 145 -98.89 gain 145 148 -100.54 gain 148 145 -100.87 gain 145 149 -102.57 gain 149 145 -102.15 gain 145 150 -117.04 gain 150 145 -121.74 gain 145 151 -114.57 gain 151 145 -112.83 gain 145 152 -109.38 gain 152 145 -109.47 gain 145 153 -115.08 gain 153 145 -117.59 gain 145 154 -108.44 gain 154 145 -106.57 gain 145 155 -108.65 gain 155 145 -110.61 gain 145 156 -103.87 gain 156 145 -103.85 gain 145 157 -94.12 gain 157 145 -96.06 gain 145 158 -94.28 gain 158 145 -96.65 gain 145 159 -87.64 gain 159 145 -83.65 gain 145 160 -83.43 gain 160 145 -81.71 gain 145 161 -93.15 gain 161 145 -94.29 gain 145 162 -94.78 gain 162 145 -93.00 gain 145 163 -95.61 gain 163 145 -91.02 gain 145 164 -96.79 gain 164 145 -93.94 gain 145 165 -111.87 gain 165 145 -111.95 gain 145 166 -115.70 gain 166 145 -118.46 gain 145 167 -110.91 gain 167 145 -112.79 gain 145 168 -107.73 gain 168 145 -110.96 gain 145 169 -103.31 gain 169 145 -98.89 gain 145 170 -107.15 gain 170 145 -113.22 gain 145 171 -107.13 gain 171 145 -109.62 gain 145 172 -100.01 gain 172 145 -95.61 gain 145 173 -96.90 gain 173 145 -97.15 gain 145 174 -102.48 gain 174 145 -102.50 gain 145 175 -94.14 gain 175 145 -93.36 gain 145 176 -95.62 gain 176 145 -94.79 gain 145 177 -101.20 gain 177 145 -101.86 gain 145 178 -101.26 gain 178 145 -102.88 gain 145 179 -102.37 gain 179 145 -105.01 gain 145 180 -109.77 gain 180 145 -108.21 gain 145 181 -113.62 gain 181 145 -116.51 gain 145 182 -114.95 gain 182 145 -114.13 gain 145 183 -108.33 gain 183 145 -108.81 gain 145 184 -111.48 gain 184 145 -114.02 gain 145 185 -106.58 gain 185 145 -104.54 gain 145 186 -106.24 gain 186 145 -103.20 gain 145 187 -106.91 gain 187 145 -107.96 gain 145 188 -102.12 gain 188 145 -105.93 gain 145 189 -102.47 gain 189 145 -105.68 gain 145 190 -98.52 gain 190 145 -97.39 gain 145 191 -95.65 gain 191 145 -97.56 gain 145 192 -105.25 gain 192 145 -104.47 gain 145 193 -102.28 gain 193 145 -105.48 gain 145 194 -105.42 gain 194 145 -108.19 gain 145 195 -113.81 gain 195 145 -114.76 gain 145 196 -111.60 gain 196 145 -111.58 gain 145 197 -114.26 gain 197 145 -116.92 gain 145 198 -105.92 gain 198 145 -112.51 gain 145 199 -108.31 gain 199 145 -106.46 gain 145 200 -111.50 gain 200 145 -106.42 gain 145 201 -106.59 gain 201 145 -105.34 gain 145 202 -108.33 gain 202 145 -108.60 gain 145 203 -98.27 gain 203 145 -95.17 gain 145 204 -98.66 gain 204 145 -102.64 gain 145 205 -98.40 gain 205 145 -100.44 gain 145 206 -101.27 gain 206 145 -101.30 gain 145 207 -99.23 gain 207 145 -100.02 gain 145 208 -104.00 gain 208 145 -104.96 gain 145 209 -105.25 gain 209 145 -102.21 gain 145 210 -120.28 gain 210 145 -123.83 gain 145 211 -119.41 gain 211 145 -119.22 gain 145 212 -111.70 gain 212 145 -109.06 gain 145 213 -113.35 gain 213 145 -115.57 gain 145 214 -111.47 gain 214 145 -109.99 gain 145 215 -108.31 gain 215 145 -107.92 gain 145 216 -107.37 gain 216 145 -107.80 gain 145 217 -101.74 gain 217 145 -106.00 gain 145 218 -110.91 gain 218 145 -107.36 gain 145 219 -107.64 gain 219 145 -106.91 gain 145 220 -110.12 gain 220 145 -105.74 gain 145 221 -103.43 gain 221 145 -103.55 gain 145 222 -109.00 gain 222 145 -110.49 gain 145 223 -112.51 gain 223 145 -116.01 gain 145 224 -109.34 gain 224 145 -113.34 gain 146 147 -79.79 gain 147 146 -83.64 gain 146 148 -89.70 gain 148 146 -92.47 gain 146 149 -97.96 gain 149 146 -99.99 gain 146 150 -116.86 gain 150 146 -124.01 gain 146 151 -115.86 gain 151 146 -116.57 gain 146 152 -114.75 gain 152 146 -117.28 gain 146 153 -109.50 gain 153 146 -114.46 gain 146 154 -114.98 gain 154 146 -115.55 gain 146 155 -100.95 gain 155 146 -105.36 gain 146 156 -108.32 gain 156 146 -110.74 gain 146 157 -98.93 gain 157 146 -103.31 gain 146 158 -92.82 gain 158 146 -97.64 gain 146 159 -96.61 gain 159 146 -95.06 gain 146 160 -87.48 gain 160 146 -88.21 gain 146 161 -75.63 gain 161 146 -79.21 gain 146 162 -90.64 gain 162 146 -91.31 gain 146 163 -87.47 gain 163 146 -85.33 gain 146 164 -95.88 gain 164 146 -95.48 gain 146 165 -113.46 gain 165 146 -115.98 gain 146 166 -108.01 gain 166 146 -113.22 gain 146 167 -113.84 gain 167 146 -118.17 gain 146 168 -112.68 gain 168 146 -118.35 gain 146 169 -107.10 gain 169 146 -105.13 gain 146 170 -106.05 gain 170 146 -114.57 gain 146 171 -103.85 gain 171 146 -108.79 gain 146 172 -102.55 gain 172 146 -100.58 gain 146 173 -102.77 gain 173 146 -105.47 gain 146 174 -98.22 gain 174 146 -100.68 gain 146 175 -95.59 gain 175 146 -97.26 gain 146 176 -89.43 gain 176 146 -91.05 gain 146 177 -93.22 gain 177 146 -96.33 gain 146 178 -100.19 gain 178 146 -104.25 gain 146 179 -100.15 gain 179 146 -105.24 gain 146 180 -116.82 gain 180 146 -117.71 gain 146 181 -108.54 gain 181 146 -113.87 gain 146 182 -105.92 gain 182 146 -107.55 gain 146 183 -108.56 gain 183 146 -111.49 gain 146 184 -110.31 gain 184 146 -115.29 gain 146 185 -113.07 gain 185 146 -113.48 gain 146 186 -105.68 gain 186 146 -105.09 gain 146 187 -101.80 gain 187 146 -105.30 gain 146 188 -104.19 gain 188 146 -110.45 gain 146 189 -102.47 gain 189 146 -108.12 gain 146 190 -99.06 gain 190 146 -100.37 gain 146 191 -96.34 gain 191 146 -100.70 gain 146 192 -92.05 gain 192 146 -93.72 gain 146 193 -100.15 gain 193 146 -105.79 gain 146 194 -99.66 gain 194 146 -104.87 gain 146 195 -108.73 gain 195 146 -112.13 gain 146 196 -106.07 gain 196 146 -108.49 gain 146 197 -123.47 gain 197 146 -128.57 gain 146 198 -115.64 gain 198 146 -124.68 gain 146 199 -107.48 gain 199 146 -108.08 gain 146 200 -115.65 gain 200 146 -113.02 gain 146 201 -107.74 gain 201 146 -108.93 gain 146 202 -103.17 gain 202 146 -105.89 gain 146 203 -95.88 gain 203 146 -95.23 gain 146 204 -107.99 gain 204 146 -114.42 gain 146 205 -106.75 gain 205 146 -111.25 gain 146 206 -103.79 gain 206 146 -106.26 gain 146 207 -103.08 gain 207 146 -106.31 gain 146 208 -103.39 gain 208 146 -106.80 gain 146 209 -105.04 gain 209 146 -104.45 gain 146 210 -111.71 gain 210 146 -117.70 gain 146 211 -108.52 gain 211 146 -110.77 gain 146 212 -116.39 gain 212 146 -116.19 gain 146 213 -109.36 gain 213 146 -114.02 gain 146 214 -113.61 gain 214 146 -114.58 gain 146 215 -107.28 gain 215 146 -109.34 gain 146 216 -110.09 gain 216 146 -112.97 gain 146 217 -104.54 gain 217 146 -111.24 gain 146 218 -107.51 gain 218 146 -106.40 gain 146 219 -105.63 gain 219 146 -107.34 gain 146 220 -103.95 gain 220 146 -102.01 gain 146 221 -102.62 gain 221 146 -105.18 gain 146 222 -105.99 gain 222 146 -109.92 gain 146 223 -96.79 gain 223 146 -102.74 gain 146 224 -104.75 gain 224 146 -111.20 gain 147 148 -91.75 gain 148 147 -90.67 gain 147 149 -95.92 gain 149 147 -94.10 gain 147 150 -118.30 gain 150 147 -121.59 gain 147 151 -123.08 gain 151 147 -119.93 gain 147 152 -110.44 gain 152 147 -109.12 gain 147 153 -116.54 gain 153 147 -117.65 gain 147 154 -115.77 gain 154 147 -112.50 gain 147 155 -106.07 gain 155 147 -106.63 gain 147 156 -113.26 gain 156 147 -111.83 gain 147 157 -104.23 gain 157 147 -104.76 gain 147 158 -105.90 gain 158 147 -106.87 gain 147 159 -102.95 gain 159 147 -97.55 gain 147 160 -97.58 gain 160 147 -94.45 gain 147 161 -92.70 gain 161 147 -92.43 gain 147 162 -89.35 gain 162 147 -86.16 gain 147 163 -97.89 gain 163 147 -91.89 gain 147 164 -91.86 gain 164 147 -87.61 gain 147 165 -116.86 gain 165 147 -115.54 gain 147 166 -121.22 gain 166 147 -122.57 gain 147 167 -116.33 gain 167 147 -116.81 gain 147 168 -108.57 gain 168 147 -110.39 gain 147 169 -114.52 gain 169 147 -108.70 gain 147 170 -115.60 gain 170 147 -120.26 gain 147 171 -113.19 gain 171 147 -114.28 gain 147 172 -114.04 gain 172 147 -108.23 gain 147 173 -108.27 gain 173 147 -107.12 gain 147 174 -110.72 gain 174 147 -109.33 gain 147 175 -98.64 gain 175 147 -96.46 gain 147 176 -94.70 gain 176 147 -92.47 gain 147 177 -98.74 gain 177 147 -98.00 gain 147 178 -97.06 gain 178 147 -97.27 gain 147 179 -106.06 gain 179 147 -107.30 gain 147 180 -117.81 gain 180 147 -114.85 gain 147 181 -117.65 gain 181 147 -119.12 gain 147 182 -116.36 gain 182 147 -114.15 gain 147 183 -117.64 gain 183 147 -116.72 gain 147 184 -109.64 gain 184 147 -110.77 gain 147 185 -106.45 gain 185 147 -103.00 gain 147 186 -107.63 gain 186 147 -103.19 gain 147 187 -112.78 gain 187 147 -112.42 gain 147 188 -111.27 gain 188 147 -113.67 gain 147 189 -102.65 gain 189 147 -104.45 gain 147 190 -107.76 gain 190 147 -105.23 gain 147 191 -107.25 gain 191 147 -107.76 gain 147 192 -101.45 gain 192 147 -99.27 gain 147 193 -100.41 gain 193 147 -102.20 gain 147 194 -94.94 gain 194 147 -96.30 gain 147 195 -124.64 gain 195 147 -124.20 gain 147 196 -119.26 gain 196 147 -117.84 gain 147 197 -125.47 gain 197 147 -126.73 gain 147 198 -114.52 gain 198 147 -119.71 gain 147 199 -113.18 gain 199 147 -109.93 gain 147 200 -116.03 gain 200 147 -109.55 gain 147 201 -103.01 gain 201 147 -100.35 gain 147 202 -116.41 gain 202 147 -115.28 gain 147 203 -111.67 gain 203 147 -107.17 gain 147 204 -108.32 gain 204 147 -110.90 gain 147 205 -104.31 gain 205 147 -104.95 gain 147 206 -105.10 gain 206 147 -103.72 gain 147 207 -107.64 gain 207 147 -107.02 gain 147 208 -104.34 gain 208 147 -103.89 gain 147 209 -106.81 gain 209 147 -102.36 gain 147 210 -115.74 gain 210 147 -117.88 gain 147 211 -120.46 gain 211 147 -118.86 gain 147 212 -122.14 gain 212 147 -118.09 gain 147 213 -117.00 gain 213 147 -117.82 gain 147 214 -113.90 gain 214 147 -111.02 gain 147 215 -111.58 gain 215 147 -109.78 gain 147 216 -120.06 gain 216 147 -119.09 gain 147 217 -113.76 gain 217 147 -116.62 gain 147 218 -116.49 gain 218 147 -111.53 gain 147 219 -104.58 gain 219 147 -102.44 gain 147 220 -104.28 gain 220 147 -98.49 gain 147 221 -105.94 gain 221 147 -104.66 gain 147 222 -111.29 gain 222 147 -111.37 gain 147 223 -107.08 gain 223 147 -109.17 gain 147 224 -109.62 gain 224 147 -112.21 gain 148 149 -89.13 gain 149 148 -88.38 gain 148 150 -115.96 gain 150 148 -120.32 gain 148 151 -116.18 gain 151 148 -114.11 gain 148 152 -125.77 gain 152 148 -125.52 gain 148 153 -117.06 gain 153 148 -119.24 gain 148 154 -103.55 gain 154 148 -101.34 gain 148 155 -108.11 gain 155 148 -109.74 gain 148 156 -118.77 gain 156 148 -118.42 gain 148 157 -107.29 gain 157 148 -108.89 gain 148 158 -105.27 gain 158 148 -107.31 gain 148 159 -101.76 gain 159 148 -97.44 gain 148 160 -102.91 gain 160 148 -100.85 gain 148 161 -93.37 gain 161 148 -94.18 gain 148 162 -94.17 gain 162 148 -92.06 gain 148 163 -80.09 gain 163 148 -75.16 gain 148 164 -85.68 gain 164 148 -82.50 gain 148 165 -113.20 gain 165 148 -112.95 gain 148 166 -117.51 gain 166 148 -119.94 gain 148 167 -121.45 gain 167 148 -123.00 gain 148 168 -110.45 gain 168 148 -113.35 gain 148 169 -116.36 gain 169 148 -111.60 gain 148 170 -111.87 gain 170 148 -117.61 gain 148 171 -116.72 gain 171 148 -118.88 gain 148 172 -111.17 gain 172 148 -106.43 gain 148 173 -115.47 gain 173 148 -115.39 gain 148 174 -102.57 gain 174 148 -102.25 gain 148 175 -93.59 gain 175 148 -92.47 gain 148 176 -104.66 gain 176 148 -103.51 gain 148 177 -98.99 gain 177 148 -99.32 gain 148 178 -101.96 gain 178 148 -103.24 gain 148 179 -95.30 gain 179 148 -97.61 gain 148 180 -115.95 gain 180 148 -114.06 gain 148 181 -113.57 gain 181 148 -116.12 gain 148 182 -118.55 gain 182 148 -117.40 gain 148 183 -117.77 gain 183 148 -117.92 gain 148 184 -104.80 gain 184 148 -107.00 gain 148 185 -111.61 gain 185 148 -109.24 gain 148 186 -113.12 gain 186 148 -109.75 gain 148 187 -105.43 gain 187 148 -106.14 gain 148 188 -112.19 gain 188 148 -115.66 gain 148 189 -107.35 gain 189 148 -110.23 gain 148 190 -104.25 gain 190 148 -102.79 gain 148 191 -102.27 gain 191 148 -103.84 gain 148 192 -96.54 gain 192 148 -95.43 gain 148 193 -96.80 gain 193 148 -99.67 gain 148 194 -102.50 gain 194 148 -104.94 gain 148 195 -121.24 gain 195 148 -121.86 gain 148 196 -116.59 gain 196 148 -116.24 gain 148 197 -121.48 gain 197 148 -123.80 gain 148 198 -118.23 gain 198 148 -124.48 gain 148 199 -115.04 gain 199 148 -112.87 gain 148 200 -112.51 gain 200 148 -107.11 gain 148 201 -114.06 gain 201 148 -112.47 gain 148 202 -104.32 gain 202 148 -104.26 gain 148 203 -108.97 gain 203 148 -105.54 gain 148 204 -102.43 gain 204 148 -106.09 gain 148 205 -97.90 gain 205 148 -99.62 gain 148 206 -102.92 gain 206 148 -102.61 gain 148 207 -98.30 gain 207 148 -98.76 gain 148 208 -97.09 gain 208 148 -97.72 gain 148 209 -103.70 gain 209 148 -100.33 gain 148 210 -113.64 gain 210 148 -116.86 gain 148 211 -116.67 gain 211 148 -116.15 gain 148 212 -116.27 gain 212 148 -113.29 gain 148 213 -114.05 gain 213 148 -115.94 gain 148 214 -114.87 gain 214 148 -113.06 gain 148 215 -113.09 gain 215 148 -112.36 gain 148 216 -108.73 gain 216 148 -108.83 gain 148 217 -113.64 gain 217 148 -117.56 gain 148 218 -112.98 gain 218 148 -109.09 gain 148 219 -109.37 gain 219 148 -108.30 gain 148 220 -109.28 gain 220 148 -104.57 gain 148 221 -107.32 gain 221 148 -107.11 gain 148 222 -109.48 gain 222 148 -110.64 gain 148 223 -108.29 gain 223 148 -111.45 gain 148 224 -107.91 gain 224 148 -111.58 gain 149 150 -122.29 gain 150 149 -127.40 gain 149 151 -121.04 gain 151 149 -119.72 gain 149 152 -119.76 gain 152 149 -120.26 gain 149 153 -118.92 gain 153 149 -121.85 gain 149 154 -118.29 gain 154 149 -116.83 gain 149 155 -108.87 gain 155 149 -111.25 gain 149 156 -116.71 gain 156 149 -117.10 gain 149 157 -113.53 gain 157 149 -115.88 gain 149 158 -108.48 gain 158 149 -111.27 gain 149 159 -105.08 gain 159 149 -101.51 gain 149 160 -108.38 gain 160 149 -107.07 gain 149 161 -100.38 gain 161 149 -101.94 gain 149 162 -93.12 gain 162 149 -91.76 gain 149 163 -85.83 gain 163 149 -81.66 gain 149 164 -77.67 gain 164 149 -75.24 gain 149 165 -116.82 gain 165 149 -117.32 gain 149 166 -111.29 gain 166 149 -114.46 gain 149 167 -118.52 gain 167 149 -120.82 gain 149 168 -108.16 gain 168 149 -111.81 gain 149 169 -116.40 gain 169 149 -112.40 gain 149 170 -114.43 gain 170 149 -120.91 gain 149 171 -111.27 gain 171 149 -114.18 gain 149 172 -110.41 gain 172 149 -106.42 gain 149 173 -104.49 gain 173 149 -105.16 gain 149 174 -112.53 gain 174 149 -112.96 gain 149 175 -113.69 gain 175 149 -113.33 gain 149 176 -98.00 gain 176 149 -97.59 gain 149 177 -102.60 gain 177 149 -103.68 gain 149 178 -86.17 gain 178 149 -88.20 gain 149 179 -94.82 gain 179 149 -97.88 gain 149 180 -126.08 gain 180 149 -124.93 gain 149 181 -122.06 gain 181 149 -125.36 gain 149 182 -122.49 gain 182 149 -122.10 gain 149 183 -116.58 gain 183 149 -117.48 gain 149 184 -112.62 gain 184 149 -115.57 gain 149 185 -112.31 gain 185 149 -110.69 gain 149 186 -105.86 gain 186 149 -103.24 gain 149 187 -111.69 gain 187 149 -113.15 gain 149 188 -102.83 gain 188 149 -107.05 gain 149 189 -103.35 gain 189 149 -106.97 gain 149 190 -101.91 gain 190 149 -101.20 gain 149 191 -99.37 gain 191 149 -101.69 gain 149 192 -100.61 gain 192 149 -100.25 gain 149 193 -98.21 gain 193 149 -101.82 gain 149 194 -95.13 gain 194 149 -98.32 gain 149 195 -121.65 gain 195 149 -123.03 gain 149 196 -114.38 gain 196 149 -114.78 gain 149 197 -115.40 gain 197 149 -118.47 gain 149 198 -108.34 gain 198 149 -115.35 gain 149 199 -111.58 gain 199 149 -110.15 gain 149 200 -112.63 gain 200 149 -107.97 gain 149 201 -104.39 gain 201 149 -103.55 gain 149 202 -119.54 gain 202 149 -120.23 gain 149 203 -109.22 gain 203 149 -106.54 gain 149 204 -109.90 gain 204 149 -114.30 gain 149 205 -106.39 gain 205 149 -108.86 gain 149 206 -104.24 gain 206 149 -104.68 gain 149 207 -103.60 gain 207 149 -104.80 gain 149 208 -100.31 gain 208 149 -101.68 gain 149 209 -103.32 gain 209 149 -100.70 gain 149 210 -119.42 gain 210 149 -123.39 gain 149 211 -115.44 gain 211 149 -115.67 gain 149 212 -110.30 gain 212 149 -108.07 gain 149 213 -110.82 gain 213 149 -113.45 gain 149 214 -105.67 gain 214 149 -104.61 gain 149 215 -116.38 gain 215 149 -116.41 gain 149 216 -114.39 gain 216 149 -115.24 gain 149 217 -113.16 gain 217 149 -117.83 gain 149 218 -111.97 gain 218 149 -108.84 gain 149 219 -111.64 gain 219 149 -111.32 gain 149 220 -102.38 gain 220 149 -98.41 gain 149 221 -106.13 gain 221 149 -106.67 gain 149 222 -104.32 gain 222 149 -106.23 gain 149 223 -105.07 gain 223 149 -108.99 gain 149 224 -102.14 gain 224 149 -106.55 gain 150 151 -86.92 gain 151 150 -80.48 gain 150 152 -102.16 gain 152 150 -97.54 gain 150 153 -103.43 gain 153 150 -101.25 gain 150 154 -108.77 gain 154 150 -102.20 gain 150 155 -118.31 gain 155 150 -115.58 gain 150 156 -111.86 gain 156 150 -107.14 gain 150 157 -114.05 gain 157 150 -111.29 gain 150 158 -119.58 gain 158 150 -117.25 gain 150 159 -116.95 gain 159 150 -108.26 gain 150 160 -119.57 gain 160 150 -113.15 gain 150 161 -122.40 gain 161 150 -118.84 gain 150 162 -115.60 gain 162 150 -109.12 gain 150 163 -122.60 gain 163 150 -113.31 gain 150 164 -120.50 gain 164 150 -112.95 gain 150 165 -91.01 gain 165 150 -86.40 gain 150 166 -93.39 gain 166 150 -91.46 gain 150 167 -101.47 gain 167 150 -98.65 gain 150 168 -104.42 gain 168 150 -102.95 gain 150 169 -111.59 gain 169 150 -102.47 gain 150 170 -119.31 gain 170 150 -120.68 gain 150 171 -108.79 gain 171 150 -106.59 gain 150 172 -118.68 gain 172 150 -109.57 gain 150 173 -120.56 gain 173 150 -116.12 gain 150 174 -117.13 gain 174 150 -112.45 gain 150 175 -113.71 gain 175 150 -108.23 gain 150 176 -117.00 gain 176 150 -111.47 gain 150 177 -121.70 gain 177 150 -117.66 gain 150 178 -120.66 gain 178 150 -117.57 gain 150 179 -121.57 gain 179 150 -119.52 gain 150 180 -107.41 gain 180 150 -101.16 gain 150 181 -104.17 gain 181 150 -102.36 gain 150 182 -100.80 gain 182 150 -95.29 gain 150 183 -111.78 gain 183 150 -107.56 gain 150 184 -99.38 gain 184 150 -97.22 gain 150 185 -113.69 gain 185 150 -106.96 gain 150 186 -106.07 gain 186 150 -98.33 gain 150 187 -113.29 gain 187 150 -109.64 gain 150 188 -124.10 gain 188 150 -123.21 gain 150 189 -119.30 gain 189 150 -117.81 gain 150 190 -126.91 gain 190 150 -121.09 gain 150 191 -122.10 gain 191 150 -119.31 gain 150 192 -128.62 gain 192 150 -123.15 gain 150 193 -119.43 gain 193 150 -117.93 gain 150 194 -123.97 gain 194 150 -122.04 gain 150 195 -100.63 gain 195 150 -96.89 gain 150 196 -102.39 gain 196 150 -97.68 gain 150 197 -104.92 gain 197 150 -102.88 gain 150 198 -103.21 gain 198 150 -105.10 gain 150 199 -108.87 gain 199 150 -102.33 gain 150 200 -112.46 gain 200 150 -102.69 gain 150 201 -117.42 gain 201 150 -111.47 gain 150 202 -116.56 gain 202 150 -112.13 gain 150 203 -116.49 gain 203 150 -108.70 gain 150 204 -118.10 gain 204 150 -117.38 gain 150 205 -123.96 gain 205 150 -121.31 gain 150 206 -122.96 gain 206 150 -118.29 gain 150 207 -123.01 gain 207 150 -119.09 gain 150 208 -121.50 gain 208 150 -117.76 gain 150 209 -123.97 gain 209 150 -116.23 gain 150 210 -112.59 gain 210 150 -111.44 gain 150 211 -97.84 gain 211 150 -92.95 gain 150 212 -115.20 gain 212 150 -107.86 gain 150 213 -112.17 gain 213 150 -109.70 gain 150 214 -111.09 gain 214 150 -104.92 gain 150 215 -114.04 gain 215 150 -108.95 gain 150 216 -120.92 gain 216 150 -116.66 gain 150 217 -116.54 gain 217 150 -116.10 gain 150 218 -124.21 gain 218 150 -115.96 gain 150 219 -120.05 gain 219 150 -114.62 gain 150 220 -111.21 gain 220 150 -102.13 gain 150 221 -118.62 gain 221 150 -114.04 gain 150 222 -117.76 gain 222 150 -114.55 gain 150 223 -126.39 gain 223 150 -125.19 gain 150 224 -118.54 gain 224 150 -117.84 gain 151 152 -84.12 gain 152 151 -85.94 gain 151 153 -99.96 gain 153 151 -104.22 gain 151 154 -95.88 gain 154 151 -95.75 gain 151 155 -98.38 gain 155 151 -102.08 gain 151 156 -103.89 gain 156 151 -105.61 gain 151 157 -113.47 gain 157 151 -117.15 gain 151 158 -105.48 gain 158 151 -109.59 gain 151 159 -114.64 gain 159 151 -112.39 gain 151 160 -112.08 gain 160 151 -112.10 gain 151 161 -119.68 gain 161 151 -122.56 gain 151 162 -116.02 gain 162 151 -115.99 gain 151 163 -114.23 gain 163 151 -111.37 gain 151 164 -120.98 gain 164 151 -119.87 gain 151 165 -89.08 gain 165 151 -90.90 gain 151 166 -83.79 gain 166 151 -88.29 gain 151 167 -91.57 gain 167 151 -95.19 gain 151 168 -98.29 gain 168 151 -103.26 gain 151 169 -103.86 gain 169 151 -101.18 gain 151 170 -95.84 gain 170 151 -103.65 gain 151 171 -105.77 gain 171 151 -110.00 gain 151 172 -102.70 gain 172 151 -100.03 gain 151 173 -116.88 gain 173 151 -118.87 gain 151 174 -111.28 gain 174 151 -113.04 gain 151 175 -115.31 gain 175 151 -116.27 gain 151 176 -117.11 gain 176 151 -118.02 gain 151 177 -109.82 gain 177 151 -112.22 gain 151 178 -114.74 gain 178 151 -118.10 gain 151 179 -112.96 gain 179 151 -117.35 gain 151 180 -93.35 gain 180 151 -93.53 gain 151 181 -99.38 gain 181 151 -104.00 gain 151 182 -93.93 gain 182 151 -94.85 gain 151 183 -105.97 gain 183 151 -108.19 gain 151 184 -100.85 gain 184 151 -105.13 gain 151 185 -100.06 gain 185 151 -99.76 gain 151 186 -101.37 gain 186 151 -100.08 gain 151 187 -111.11 gain 187 151 -113.90 gain 151 188 -110.60 gain 188 151 -116.15 gain 151 189 -110.80 gain 189 151 -115.74 gain 151 190 -108.80 gain 190 151 -109.41 gain 151 191 -114.02 gain 191 151 -117.67 gain 151 192 -113.87 gain 192 151 -114.83 gain 151 193 -114.49 gain 193 151 -119.43 gain 151 194 -117.59 gain 194 151 -122.10 gain 151 195 -95.72 gain 195 151 -98.42 gain 151 196 -90.79 gain 196 151 -92.51 gain 151 197 -93.69 gain 197 151 -98.08 gain 151 198 -96.45 gain 198 151 -104.78 gain 151 199 -104.71 gain 199 151 -104.61 gain 151 200 -100.94 gain 200 151 -97.61 gain 151 201 -110.08 gain 201 151 -110.57 gain 151 202 -111.16 gain 202 151 -113.17 gain 151 203 -113.88 gain 203 151 -112.52 gain 151 204 -112.07 gain 204 151 -117.79 gain 151 205 -105.93 gain 205 151 -109.72 gain 151 206 -111.25 gain 206 151 -113.01 gain 151 207 -110.53 gain 207 151 -113.05 gain 151 208 -116.15 gain 208 151 -118.85 gain 151 209 -119.87 gain 209 151 -118.57 gain 151 210 -98.65 gain 210 151 -103.94 gain 151 211 -101.23 gain 211 151 -102.77 gain 151 212 -101.63 gain 212 151 -100.73 gain 151 213 -102.63 gain 213 151 -106.59 gain 151 214 -103.55 gain 214 151 -103.81 gain 151 215 -105.54 gain 215 151 -106.88 gain 151 216 -115.34 gain 216 151 -117.52 gain 151 217 -112.86 gain 217 151 -118.85 gain 151 218 -110.34 gain 218 151 -108.52 gain 151 219 -106.52 gain 219 151 -107.53 gain 151 220 -114.55 gain 220 151 -111.91 gain 151 221 -113.98 gain 221 151 -115.84 gain 151 222 -112.16 gain 222 151 -115.39 gain 151 223 -108.33 gain 223 151 -113.57 gain 151 224 -122.97 gain 224 151 -128.70 gain 152 153 -82.77 gain 153 152 -85.21 gain 152 154 -87.01 gain 154 152 -85.06 gain 152 155 -94.14 gain 155 152 -96.01 gain 152 156 -105.07 gain 156 152 -104.96 gain 152 157 -106.16 gain 157 152 -108.01 gain 152 158 -109.42 gain 158 152 -111.71 gain 152 159 -113.79 gain 159 152 -109.72 gain 152 160 -108.45 gain 160 152 -106.64 gain 152 161 -111.07 gain 161 152 -112.12 gain 152 162 -117.85 gain 162 152 -115.99 gain 152 163 -103.44 gain 163 152 -98.76 gain 152 164 -121.00 gain 164 152 -118.07 gain 152 165 -93.97 gain 165 152 -93.97 gain 152 166 -89.86 gain 166 152 -92.53 gain 152 167 -86.46 gain 167 152 -88.25 gain 152 168 -87.49 gain 168 152 -90.63 gain 152 169 -92.39 gain 169 152 -87.88 gain 152 170 -99.19 gain 170 152 -105.18 gain 152 171 -109.90 gain 171 152 -112.31 gain 152 172 -101.53 gain 172 152 -97.04 gain 152 173 -104.21 gain 173 152 -104.38 gain 152 174 -109.29 gain 174 152 -109.22 gain 152 175 -113.01 gain 175 152 -112.14 gain 152 176 -114.40 gain 176 152 -113.49 gain 152 177 -109.99 gain 177 152 -110.57 gain 152 178 -111.57 gain 178 152 -113.10 gain 152 179 -122.65 gain 179 152 -125.21 gain 152 180 -98.89 gain 180 152 -97.24 gain 152 181 -90.81 gain 181 152 -93.61 gain 152 182 -94.22 gain 182 152 -93.32 gain 152 183 -98.49 gain 183 152 -98.89 gain 152 184 -103.65 gain 184 152 -106.10 gain 152 185 -99.68 gain 185 152 -97.56 gain 152 186 -103.60 gain 186 152 -100.47 gain 152 187 -106.60 gain 187 152 -107.56 gain 152 188 -107.01 gain 188 152 -110.73 gain 152 189 -119.15 gain 189 152 -122.27 gain 152 190 -111.73 gain 190 152 -110.52 gain 152 191 -106.37 gain 191 152 -108.19 gain 152 192 -110.85 gain 192 152 -109.99 gain 152 193 -119.78 gain 193 152 -122.89 gain 152 194 -111.07 gain 194 152 -113.75 gain 152 195 -100.11 gain 195 152 -100.98 gain 152 196 -105.10 gain 196 152 -104.99 gain 152 197 -99.98 gain 197 152 -102.55 gain 152 198 -100.54 gain 198 152 -107.05 gain 152 199 -110.05 gain 199 152 -108.12 gain 152 200 -97.90 gain 200 152 -92.74 gain 152 201 -106.67 gain 201 152 -105.33 gain 152 202 -111.70 gain 202 152 -111.89 gain 152 203 -103.47 gain 203 152 -100.28 gain 152 204 -112.73 gain 204 152 -116.63 gain 152 205 -109.91 gain 205 152 -111.88 gain 152 206 -118.96 gain 206 152 -118.90 gain 152 207 -120.92 gain 207 152 -121.62 gain 152 208 -116.16 gain 208 152 -117.03 gain 152 209 -117.13 gain 209 152 -114.00 gain 152 210 -106.04 gain 210 152 -109.50 gain 152 211 -99.37 gain 211 152 -99.09 gain 152 212 -105.44 gain 212 152 -102.71 gain 152 213 -97.17 gain 213 152 -99.31 gain 152 214 -104.68 gain 214 152 -103.12 gain 152 215 -108.74 gain 215 152 -108.26 gain 152 216 -110.88 gain 216 152 -111.24 gain 152 217 -110.91 gain 217 152 -115.08 gain 152 218 -114.41 gain 218 152 -110.77 gain 152 219 -107.17 gain 219 152 -106.35 gain 152 220 -111.20 gain 220 152 -106.74 gain 152 221 -111.81 gain 221 152 -111.85 gain 152 222 -117.13 gain 222 152 -118.54 gain 152 223 -118.51 gain 223 152 -121.93 gain 152 224 -121.59 gain 224 152 -125.51 gain 153 154 -84.40 gain 154 153 -80.01 gain 153 155 -90.17 gain 155 153 -89.61 gain 153 156 -106.27 gain 156 153 -103.73 gain 153 157 -99.10 gain 157 153 -98.52 gain 153 158 -105.33 gain 158 153 -105.18 gain 153 159 -105.71 gain 159 153 -99.20 gain 153 160 -119.74 gain 160 153 -115.50 gain 153 161 -118.43 gain 161 153 -117.05 gain 153 162 -116.59 gain 162 153 -112.29 gain 153 163 -119.14 gain 163 153 -112.04 gain 153 164 -117.91 gain 164 153 -112.55 gain 153 165 -100.76 gain 165 153 -98.33 gain 153 166 -86.57 gain 166 153 -86.81 gain 153 167 -88.53 gain 167 153 -87.90 gain 153 168 -83.89 gain 168 153 -84.61 gain 153 169 -92.24 gain 169 153 -85.30 gain 153 170 -99.38 gain 170 153 -102.94 gain 153 171 -96.19 gain 171 153 -96.17 gain 153 172 -103.02 gain 172 153 -96.09 gain 153 173 -105.45 gain 173 153 -103.19 gain 153 174 -108.37 gain 174 153 -105.87 gain 153 175 -114.06 gain 175 153 -110.76 gain 153 176 -115.14 gain 176 153 -111.79 gain 153 177 -120.38 gain 177 153 -118.53 gain 153 178 -115.36 gain 178 153 -114.45 gain 153 179 -113.91 gain 179 153 -114.04 gain 153 180 -98.82 gain 180 153 -94.74 gain 153 181 -90.46 gain 181 153 -90.83 gain 153 182 -95.98 gain 182 153 -92.65 gain 153 183 -92.06 gain 183 153 -90.03 gain 153 184 -98.60 gain 184 153 -98.62 gain 153 185 -100.35 gain 185 153 -95.79 gain 153 186 -107.53 gain 186 153 -101.98 gain 153 187 -109.30 gain 187 153 -107.83 gain 153 188 -113.90 gain 188 153 -115.20 gain 153 189 -106.66 gain 189 153 -107.35 gain 153 190 -109.73 gain 190 153 -106.09 gain 153 191 -115.06 gain 191 153 -114.45 gain 153 192 -112.03 gain 192 153 -108.74 gain 153 193 -116.81 gain 193 153 -117.49 gain 153 194 -117.96 gain 194 153 -118.21 gain 153 195 -107.02 gain 195 153 -105.47 gain 153 196 -106.28 gain 196 153 -103.74 gain 153 197 -102.56 gain 197 153 -102.70 gain 153 198 -98.18 gain 198 153 -102.25 gain 153 199 -99.04 gain 199 153 -94.68 gain 153 200 -97.73 gain 200 153 -90.14 gain 153 201 -106.65 gain 201 153 -102.88 gain 153 202 -107.59 gain 202 153 -105.34 gain 153 203 -114.18 gain 203 153 -108.57 gain 153 204 -115.76 gain 204 153 -117.23 gain 153 205 -114.28 gain 205 153 -113.81 gain 153 206 -113.93 gain 206 153 -111.43 gain 153 207 -120.28 gain 207 153 -118.56 gain 153 208 -116.88 gain 208 153 -115.32 gain 153 209 -122.93 gain 209 153 -117.37 gain 153 210 -101.15 gain 210 153 -102.18 gain 153 211 -99.98 gain 211 153 -97.27 gain 153 212 -104.39 gain 212 153 -99.22 gain 153 213 -107.10 gain 213 153 -106.80 gain 153 214 -109.20 gain 214 153 -105.21 gain 153 215 -103.58 gain 215 153 -100.68 gain 153 216 -108.47 gain 216 153 -106.39 gain 153 217 -113.38 gain 217 153 -115.12 gain 153 218 -118.20 gain 218 153 -112.13 gain 153 219 -118.14 gain 219 153 -114.89 gain 153 220 -115.80 gain 220 153 -108.90 gain 153 221 -123.08 gain 221 153 -120.68 gain 153 222 -114.21 gain 222 153 -113.18 gain 153 223 -125.46 gain 223 153 -126.45 gain 153 224 -115.14 gain 224 153 -116.63 gain 154 155 -88.42 gain 155 154 -92.25 gain 154 156 -92.67 gain 156 154 -94.52 gain 154 157 -103.32 gain 157 154 -107.13 gain 154 158 -96.81 gain 158 154 -101.05 gain 154 159 -98.12 gain 159 154 -96.00 gain 154 160 -103.87 gain 160 154 -104.02 gain 154 161 -104.44 gain 161 154 -107.45 gain 154 162 -108.37 gain 162 154 -108.47 gain 154 163 -113.05 gain 163 154 -110.33 gain 154 164 -126.59 gain 164 154 -125.62 gain 154 165 -94.71 gain 165 154 -96.66 gain 154 166 -93.24 gain 166 154 -97.87 gain 154 167 -90.58 gain 167 154 -94.33 gain 154 168 -88.14 gain 168 154 -93.24 gain 154 169 -77.51 gain 169 154 -74.96 gain 154 170 -90.08 gain 170 154 -98.02 gain 154 171 -94.33 gain 171 154 -98.69 gain 154 172 -99.85 gain 172 154 -97.31 gain 154 173 -102.21 gain 173 154 -104.33 gain 154 174 -107.61 gain 174 154 -109.50 gain 154 175 -110.59 gain 175 154 -111.68 gain 154 176 -109.79 gain 176 154 -110.83 gain 154 177 -114.36 gain 177 154 -116.90 gain 154 178 -108.36 gain 178 154 -111.85 gain 154 179 -108.16 gain 179 154 -112.68 gain 154 180 -102.76 gain 180 154 -103.08 gain 154 181 -100.56 gain 181 154 -105.32 gain 154 182 -98.97 gain 182 154 -100.03 gain 154 183 -89.65 gain 183 154 -92.01 gain 154 184 -89.23 gain 184 154 -93.63 gain 154 185 -98.89 gain 185 154 -98.72 gain 154 186 -100.88 gain 186 154 -99.72 gain 154 187 -97.29 gain 187 154 -100.21 gain 154 188 -109.59 gain 188 154 -115.27 gain 154 189 -109.74 gain 189 154 -114.82 gain 154 190 -106.17 gain 190 154 -106.91 gain 154 191 -113.83 gain 191 154 -117.61 gain 154 192 -111.10 gain 192 154 -112.19 gain 154 193 -111.44 gain 193 154 -116.51 gain 154 194 -111.51 gain 194 154 -116.15 gain 154 195 -103.75 gain 195 154 -106.58 gain 154 196 -109.48 gain 196 154 -111.33 gain 154 197 -94.79 gain 197 154 -99.31 gain 154 198 -94.94 gain 198 154 -103.40 gain 154 199 -101.15 gain 199 154 -101.18 gain 154 200 -99.89 gain 200 154 -96.69 gain 154 201 -99.11 gain 201 154 -99.73 gain 154 202 -103.88 gain 202 154 -106.02 gain 154 203 -107.78 gain 203 154 -106.55 gain 154 204 -106.84 gain 204 154 -112.69 gain 154 205 -110.03 gain 205 154 -113.95 gain 154 206 -111.04 gain 206 154 -112.94 gain 154 207 -112.39 gain 207 154 -115.05 gain 154 208 -106.96 gain 208 154 -109.79 gain 154 209 -113.24 gain 209 154 -112.08 gain 154 210 -104.18 gain 210 154 -109.59 gain 154 211 -110.44 gain 211 154 -112.12 gain 154 212 -103.40 gain 212 154 -102.63 gain 154 213 -101.21 gain 213 154 -105.30 gain 154 214 -97.19 gain 214 154 -97.58 gain 154 215 -97.13 gain 215 154 -98.61 gain 154 216 -102.40 gain 216 154 -104.71 gain 154 217 -101.39 gain 217 154 -107.52 gain 154 218 -103.06 gain 218 154 -101.38 gain 154 219 -110.28 gain 219 154 -111.41 gain 154 220 -112.02 gain 220 154 -109.51 gain 154 221 -110.97 gain 221 154 -112.96 gain 154 222 -108.40 gain 222 154 -111.76 gain 154 223 -114.70 gain 223 154 -120.07 gain 154 224 -113.41 gain 224 154 -119.28 gain 155 156 -86.73 gain 156 155 -84.74 gain 155 157 -94.35 gain 157 155 -94.33 gain 155 158 -102.11 gain 158 155 -102.52 gain 155 159 -103.80 gain 159 155 -97.85 gain 155 160 -107.76 gain 160 155 -104.08 gain 155 161 -111.58 gain 161 155 -110.76 gain 155 162 -114.87 gain 162 155 -111.13 gain 155 163 -116.40 gain 163 155 -109.85 gain 155 164 -117.64 gain 164 155 -112.83 gain 155 165 -110.79 gain 165 155 -108.92 gain 155 166 -108.95 gain 166 155 -109.75 gain 155 167 -100.69 gain 167 155 -100.62 gain 155 168 -91.27 gain 168 155 -92.54 gain 155 169 -86.31 gain 169 155 -79.93 gain 155 170 -93.25 gain 170 155 -97.36 gain 155 171 -96.41 gain 171 155 -96.94 gain 155 172 -94.62 gain 172 155 -88.25 gain 155 173 -102.06 gain 173 155 -100.35 gain 155 174 -106.98 gain 174 155 -105.04 gain 155 175 -107.45 gain 175 155 -104.71 gain 155 176 -114.17 gain 176 155 -111.38 gain 155 177 -113.62 gain 177 155 -112.32 gain 155 178 -115.05 gain 178 155 -114.71 gain 155 179 -122.73 gain 179 155 -123.42 gain 155 180 -111.55 gain 180 155 -108.03 gain 155 181 -106.89 gain 181 155 -107.82 gain 155 182 -102.62 gain 182 155 -99.85 gain 155 183 -103.60 gain 183 155 -102.12 gain 155 184 -88.45 gain 184 155 -89.02 gain 155 185 -90.81 gain 185 155 -86.81 gain 155 186 -97.38 gain 186 155 -92.38 gain 155 187 -94.71 gain 187 155 -93.80 gain 155 188 -101.63 gain 188 155 -103.48 gain 155 189 -109.47 gain 189 155 -110.71 gain 155 190 -99.68 gain 190 155 -96.59 gain 155 191 -111.77 gain 191 155 -111.72 gain 155 192 -108.56 gain 192 155 -105.82 gain 155 193 -112.43 gain 193 155 -113.67 gain 155 194 -115.08 gain 194 155 -115.89 gain 155 195 -104.80 gain 195 155 -103.80 gain 155 196 -106.44 gain 196 155 -104.46 gain 155 197 -109.73 gain 197 155 -110.43 gain 155 198 -96.87 gain 198 155 -101.50 gain 155 199 -100.44 gain 199 155 -96.64 gain 155 200 -100.13 gain 200 155 -93.10 gain 155 201 -102.29 gain 201 155 -99.07 gain 155 202 -102.57 gain 202 155 -100.89 gain 155 203 -101.80 gain 203 155 -96.74 gain 155 204 -106.25 gain 204 155 -108.28 gain 155 205 -105.82 gain 205 155 -105.90 gain 155 206 -107.36 gain 206 155 -105.42 gain 155 207 -112.22 gain 207 155 -111.05 gain 155 208 -110.83 gain 208 155 -109.83 gain 155 209 -115.87 gain 209 155 -110.87 gain 155 210 -104.33 gain 210 155 -105.92 gain 155 211 -113.38 gain 211 155 -111.22 gain 155 212 -108.40 gain 212 155 -103.80 gain 155 213 -111.15 gain 213 155 -111.41 gain 155 214 -109.25 gain 214 155 -105.81 gain 155 215 -103.12 gain 215 155 -100.77 gain 155 216 -105.19 gain 216 155 -103.66 gain 155 217 -105.46 gain 217 155 -107.75 gain 155 218 -107.68 gain 218 155 -102.17 gain 155 219 -111.50 gain 219 155 -108.81 gain 155 220 -108.47 gain 220 155 -102.13 gain 155 221 -108.07 gain 221 155 -106.23 gain 155 222 -108.04 gain 222 155 -107.57 gain 155 223 -122.86 gain 223 155 -124.40 gain 155 224 -113.20 gain 224 155 -115.24 gain 156 157 -86.61 gain 157 156 -88.57 gain 156 158 -90.90 gain 158 156 -93.29 gain 156 159 -100.03 gain 159 156 -96.07 gain 156 160 -108.29 gain 160 156 -106.59 gain 156 161 -107.13 gain 161 156 -108.30 gain 156 162 -103.02 gain 162 156 -101.27 gain 156 163 -111.32 gain 163 156 -106.75 gain 156 164 -113.77 gain 164 156 -110.95 gain 156 165 -102.92 gain 165 156 -103.03 gain 156 166 -104.69 gain 166 156 -107.47 gain 156 167 -103.80 gain 167 156 -105.71 gain 156 168 -104.65 gain 168 156 -107.90 gain 156 169 -98.30 gain 169 156 -93.91 gain 156 170 -82.00 gain 170 156 -88.10 gain 156 171 -80.13 gain 171 156 -82.65 gain 156 172 -88.72 gain 172 156 -84.33 gain 156 173 -99.87 gain 173 156 -100.15 gain 156 174 -98.61 gain 174 156 -98.65 gain 156 175 -104.50 gain 175 156 -103.75 gain 156 176 -107.08 gain 176 156 -106.28 gain 156 177 -109.70 gain 177 156 -110.39 gain 156 178 -106.69 gain 178 156 -108.33 gain 156 179 -114.34 gain 179 156 -117.01 gain 156 180 -109.34 gain 180 156 -107.81 gain 156 181 -100.14 gain 181 156 -103.05 gain 156 182 -102.03 gain 182 156 -101.24 gain 156 183 -100.28 gain 183 156 -100.78 gain 156 184 -96.33 gain 184 156 -98.89 gain 156 185 -99.53 gain 185 156 -97.51 gain 156 186 -90.22 gain 186 156 -87.20 gain 156 187 -102.55 gain 187 156 -103.63 gain 156 188 -100.87 gain 188 156 -104.71 gain 156 189 -95.37 gain 189 156 -98.60 gain 156 190 -103.71 gain 190 156 -102.60 gain 156 191 -101.48 gain 191 156 -103.41 gain 156 192 -110.13 gain 192 156 -109.38 gain 156 193 -111.77 gain 193 156 -115.00 gain 156 194 -111.47 gain 194 156 -114.27 gain 156 195 -108.61 gain 195 156 -109.59 gain 156 196 -113.27 gain 196 156 -113.28 gain 156 197 -109.54 gain 197 156 -112.22 gain 156 198 -96.74 gain 198 156 -103.36 gain 156 199 -103.56 gain 199 156 -101.74 gain 156 200 -94.77 gain 200 156 -89.72 gain 156 201 -96.75 gain 201 156 -95.52 gain 156 202 -98.78 gain 202 156 -99.08 gain 156 203 -105.34 gain 203 156 -102.27 gain 156 204 -100.85 gain 204 156 -104.86 gain 156 205 -105.87 gain 205 156 -107.94 gain 156 206 -106.75 gain 206 156 -106.80 gain 156 207 -105.28 gain 207 156 -106.09 gain 156 208 -107.85 gain 208 156 -108.84 gain 156 209 -114.61 gain 209 156 -111.60 gain 156 210 -112.18 gain 210 156 -115.75 gain 156 211 -96.92 gain 211 156 -96.75 gain 156 212 -112.45 gain 212 156 -109.82 gain 156 213 -110.35 gain 213 156 -112.59 gain 156 214 -105.38 gain 214 156 -103.93 gain 156 215 -105.86 gain 215 156 -105.50 gain 156 216 -108.68 gain 216 156 -109.14 gain 156 217 -98.47 gain 217 156 -102.75 gain 156 218 -112.05 gain 218 156 -108.52 gain 156 219 -114.23 gain 219 156 -113.52 gain 156 220 -113.64 gain 220 156 -109.29 gain 156 221 -105.46 gain 221 156 -105.61 gain 156 222 -121.48 gain 222 156 -122.99 gain 156 223 -109.29 gain 223 156 -112.81 gain 156 224 -111.90 gain 224 156 -115.93 gain 157 158 -88.01 gain 158 157 -88.45 gain 157 159 -90.86 gain 159 157 -84.93 gain 157 160 -100.54 gain 160 157 -96.88 gain 157 161 -103.15 gain 161 157 -102.35 gain 157 162 -110.02 gain 162 157 -106.31 gain 157 163 -114.92 gain 163 157 -108.39 gain 157 164 -107.81 gain 164 157 -103.02 gain 157 165 -113.63 gain 165 157 -111.78 gain 157 166 -111.49 gain 166 157 -112.32 gain 157 167 -109.29 gain 167 157 -109.24 gain 157 168 -106.71 gain 168 157 -108.01 gain 157 169 -101.25 gain 169 157 -94.89 gain 157 170 -100.09 gain 170 157 -104.22 gain 157 171 -92.51 gain 171 157 -93.07 gain 157 172 -84.86 gain 172 157 -78.52 gain 157 173 -97.99 gain 173 157 -96.31 gain 157 174 -98.20 gain 174 157 -96.28 gain 157 175 -97.14 gain 175 157 -94.42 gain 157 176 -106.73 gain 176 157 -103.97 gain 157 177 -113.36 gain 177 157 -112.09 gain 157 178 -112.57 gain 178 157 -112.25 gain 157 179 -111.18 gain 179 157 -111.89 gain 157 180 -110.48 gain 180 157 -106.99 gain 157 181 -108.20 gain 181 157 -109.15 gain 157 182 -109.46 gain 182 157 -106.71 gain 157 183 -102.79 gain 183 157 -101.34 gain 157 184 -106.14 gain 184 157 -106.74 gain 157 185 -95.59 gain 185 157 -91.62 gain 157 186 -97.27 gain 186 157 -92.29 gain 157 187 -98.74 gain 187 157 -97.85 gain 157 188 -98.69 gain 188 157 -100.56 gain 157 189 -101.98 gain 189 157 -103.25 gain 157 190 -105.23 gain 190 157 -102.17 gain 157 191 -107.61 gain 191 157 -107.58 gain 157 192 -108.98 gain 192 157 -106.27 gain 157 193 -111.58 gain 193 157 -112.84 gain 157 194 -114.02 gain 194 157 -114.85 gain 157 195 -112.25 gain 195 157 -111.27 gain 157 196 -112.47 gain 196 157 -110.52 gain 157 197 -109.29 gain 197 157 -110.01 gain 157 198 -109.86 gain 198 157 -114.51 gain 157 199 -108.55 gain 199 157 -104.77 gain 157 200 -105.60 gain 200 157 -98.59 gain 157 201 -97.13 gain 201 157 -93.93 gain 157 202 -99.82 gain 202 157 -98.16 gain 157 203 -108.77 gain 203 157 -103.73 gain 157 204 -105.66 gain 204 157 -107.71 gain 157 205 -106.53 gain 205 157 -106.64 gain 157 206 -108.55 gain 206 157 -106.64 gain 157 207 -103.25 gain 207 157 -102.10 gain 157 208 -110.58 gain 208 157 -109.61 gain 157 209 -123.28 gain 209 157 -118.31 gain 157 210 -108.03 gain 210 157 -109.64 gain 157 211 -110.48 gain 211 157 -108.35 gain 157 212 -109.88 gain 212 157 -105.30 gain 157 213 -109.23 gain 213 157 -109.51 gain 157 214 -103.53 gain 214 157 -100.12 gain 157 215 -111.70 gain 215 157 -109.37 gain 157 216 -98.24 gain 216 157 -96.74 gain 157 217 -105.10 gain 217 157 -107.42 gain 157 218 -100.71 gain 218 157 -95.22 gain 157 219 -104.54 gain 219 157 -101.87 gain 157 220 -109.47 gain 220 157 -103.15 gain 157 221 -111.62 gain 221 157 -109.81 gain 157 222 -109.92 gain 222 157 -109.48 gain 157 223 -107.45 gain 223 157 -109.02 gain 157 224 -117.70 gain 224 157 -119.77 gain 158 159 -88.16 gain 159 158 -81.80 gain 158 160 -95.96 gain 160 158 -91.87 gain 158 161 -104.90 gain 161 158 -103.67 gain 158 162 -101.59 gain 162 158 -97.44 gain 158 163 -103.72 gain 163 158 -96.76 gain 158 164 -102.86 gain 164 158 -97.64 gain 158 165 -112.90 gain 165 158 -110.61 gain 158 166 -117.70 gain 166 158 -118.09 gain 158 167 -112.33 gain 167 158 -111.84 gain 158 168 -106.04 gain 168 158 -106.90 gain 158 169 -106.08 gain 169 158 -99.28 gain 158 170 -100.87 gain 170 158 -104.57 gain 158 171 -98.65 gain 171 158 -98.77 gain 158 172 -96.76 gain 172 158 -89.98 gain 158 173 -85.54 gain 173 158 -83.43 gain 158 174 -88.70 gain 174 158 -86.35 gain 158 175 -100.66 gain 175 158 -97.51 gain 158 176 -98.92 gain 176 158 -95.72 gain 158 177 -105.53 gain 177 158 -103.82 gain 158 178 -109.16 gain 178 158 -108.41 gain 158 179 -109.15 gain 179 158 -109.42 gain 158 180 -116.97 gain 180 158 -113.04 gain 158 181 -111.96 gain 181 158 -112.47 gain 158 182 -107.30 gain 182 158 -104.11 gain 158 183 -114.06 gain 183 158 -112.17 gain 158 184 -112.36 gain 184 158 -112.53 gain 158 185 -107.62 gain 185 158 -103.21 gain 158 186 -104.72 gain 186 158 -99.31 gain 158 187 -95.87 gain 187 158 -94.54 gain 158 188 -94.31 gain 188 158 -95.75 gain 158 189 -99.22 gain 189 158 -100.06 gain 158 190 -97.95 gain 190 158 -94.45 gain 158 191 -109.72 gain 191 158 -109.25 gain 158 192 -96.49 gain 192 158 -93.34 gain 158 193 -108.38 gain 193 158 -109.21 gain 158 194 -100.85 gain 194 158 -101.25 gain 158 195 -114.39 gain 195 158 -112.98 gain 158 196 -110.27 gain 196 158 -107.88 gain 158 197 -115.45 gain 197 158 -115.73 gain 158 198 -108.32 gain 198 158 -112.54 gain 158 199 -105.94 gain 199 158 -101.72 gain 158 200 -99.14 gain 200 158 -91.69 gain 158 201 -97.52 gain 201 158 -93.90 gain 158 202 -98.12 gain 202 158 -96.02 gain 158 203 -97.53 gain 203 158 -92.06 gain 158 204 -100.75 gain 204 158 -102.37 gain 158 205 -105.57 gain 205 158 -105.25 gain 158 206 -105.44 gain 206 158 -103.09 gain 158 207 -104.51 gain 207 158 -102.93 gain 158 208 -110.48 gain 208 158 -109.06 gain 158 209 -106.46 gain 209 158 -101.06 gain 158 210 -115.24 gain 210 158 -116.41 gain 158 211 -119.74 gain 211 158 -117.18 gain 158 212 -109.10 gain 212 158 -104.08 gain 158 213 -104.75 gain 213 158 -104.60 gain 158 214 -108.15 gain 214 158 -104.31 gain 158 215 -106.00 gain 215 158 -103.24 gain 158 216 -110.12 gain 216 158 -108.18 gain 158 217 -109.11 gain 217 158 -111.00 gain 158 218 -99.57 gain 218 158 -93.64 gain 158 219 -97.62 gain 219 158 -94.52 gain 158 220 -107.47 gain 220 158 -100.72 gain 158 221 -110.14 gain 221 158 -107.89 gain 158 222 -108.41 gain 222 158 -107.53 gain 158 223 -115.09 gain 223 158 -116.21 gain 158 224 -110.31 gain 224 158 -111.94 gain 159 160 -80.86 gain 160 159 -83.14 gain 159 161 -89.37 gain 161 159 -94.51 gain 159 162 -95.18 gain 162 159 -97.39 gain 159 163 -105.55 gain 163 159 -104.95 gain 159 164 -100.82 gain 164 159 -101.96 gain 159 165 -108.63 gain 165 159 -112.71 gain 159 166 -107.62 gain 166 159 -114.38 gain 159 167 -102.40 gain 167 159 -108.27 gain 159 168 -95.07 gain 168 159 -102.29 gain 159 169 -99.46 gain 169 159 -99.04 gain 159 170 -95.52 gain 170 159 -105.58 gain 159 171 -92.57 gain 171 159 -99.05 gain 159 172 -93.81 gain 172 159 -93.39 gain 159 173 -85.11 gain 173 159 -89.35 gain 159 174 -75.99 gain 174 159 -79.99 gain 159 175 -83.25 gain 175 159 -86.46 gain 159 176 -94.72 gain 176 159 -97.88 gain 159 177 -99.95 gain 177 159 -104.60 gain 159 178 -95.24 gain 178 159 -100.84 gain 159 179 -92.30 gain 179 159 -98.94 gain 159 180 -111.47 gain 180 159 -113.91 gain 159 181 -106.32 gain 181 159 -113.20 gain 159 182 -106.74 gain 182 159 -109.92 gain 159 183 -107.63 gain 183 159 -112.10 gain 159 184 -105.53 gain 184 159 -112.06 gain 159 185 -94.62 gain 185 159 -96.58 gain 159 186 -92.26 gain 186 159 -93.22 gain 159 187 -91.83 gain 187 159 -96.87 gain 159 188 -91.55 gain 188 159 -99.35 gain 159 189 -89.10 gain 189 159 -96.30 gain 159 190 -87.84 gain 190 159 -90.71 gain 159 191 -94.05 gain 191 159 -99.95 gain 159 192 -89.30 gain 192 159 -92.51 gain 159 193 -96.21 gain 193 159 -103.40 gain 159 194 -112.20 gain 194 159 -118.96 gain 159 195 -101.11 gain 195 159 -106.06 gain 159 196 -103.60 gain 196 159 -107.58 gain 159 197 -111.81 gain 197 159 -118.46 gain 159 198 -110.61 gain 198 159 -121.19 gain 159 199 -103.59 gain 199 159 -105.74 gain 159 200 -96.10 gain 200 159 -95.02 gain 159 201 -101.26 gain 201 159 -103.99 gain 159 202 -102.25 gain 202 159 -106.51 gain 159 203 -92.40 gain 203 159 -93.29 gain 159 204 -94.07 gain 204 159 -102.04 gain 159 205 -96.41 gain 205 159 -102.45 gain 159 206 -94.52 gain 206 159 -98.54 gain 159 207 -95.90 gain 207 159 -100.68 gain 159 208 -103.40 gain 208 159 -108.35 gain 159 209 -103.67 gain 209 159 -104.62 gain 159 210 -114.33 gain 210 159 -121.87 gain 159 211 -100.50 gain 211 159 -104.30 gain 159 212 -107.50 gain 212 159 -108.85 gain 159 213 -100.24 gain 213 159 -106.45 gain 159 214 -103.89 gain 214 159 -106.40 gain 159 215 -96.24 gain 215 159 -99.84 gain 159 216 -98.58 gain 216 159 -103.01 gain 159 217 -97.35 gain 217 159 -105.60 gain 159 218 -104.00 gain 218 159 -104.44 gain 159 219 -101.19 gain 219 159 -104.45 gain 159 220 -103.52 gain 220 159 -103.13 gain 159 221 -100.70 gain 221 159 -104.81 gain 159 222 -100.28 gain 222 159 -105.76 gain 159 223 -103.59 gain 223 159 -111.08 gain 159 224 -106.24 gain 224 159 -114.23 gain 160 161 -79.54 gain 161 160 -82.40 gain 160 162 -85.18 gain 162 160 -85.12 gain 160 163 -101.12 gain 163 160 -98.25 gain 160 164 -94.43 gain 164 160 -93.30 gain 160 165 -112.05 gain 165 160 -113.86 gain 160 166 -112.21 gain 166 160 -116.69 gain 160 167 -99.33 gain 167 160 -102.93 gain 160 168 -108.38 gain 168 160 -113.33 gain 160 169 -106.63 gain 169 160 -103.93 gain 160 170 -104.44 gain 170 160 -112.23 gain 160 171 -101.09 gain 171 160 -105.31 gain 160 172 -98.85 gain 172 160 -96.17 gain 160 173 -97.26 gain 173 160 -99.24 gain 160 174 -85.97 gain 174 160 -87.71 gain 160 175 -76.03 gain 175 160 -76.97 gain 160 176 -80.51 gain 176 160 -81.40 gain 160 177 -93.24 gain 177 160 -95.63 gain 160 178 -108.13 gain 178 160 -111.46 gain 160 179 -97.57 gain 179 160 -101.93 gain 160 180 -110.82 gain 180 160 -110.98 gain 160 181 -113.16 gain 181 160 -117.76 gain 160 182 -108.41 gain 182 160 -109.32 gain 160 183 -108.62 gain 183 160 -110.83 gain 160 184 -101.65 gain 184 160 -105.91 gain 160 185 -104.99 gain 185 160 -104.67 gain 160 186 -107.44 gain 186 160 -106.12 gain 160 187 -92.22 gain 187 160 -94.99 gain 160 188 -99.49 gain 188 160 -105.02 gain 160 189 -91.17 gain 189 160 -96.09 gain 160 190 -94.70 gain 190 160 -95.29 gain 160 191 -94.37 gain 191 160 -98.00 gain 160 192 -90.86 gain 192 160 -91.80 gain 160 193 -100.98 gain 193 160 -105.90 gain 160 194 -100.91 gain 194 160 -105.40 gain 160 195 -102.56 gain 195 160 -105.24 gain 160 196 -105.92 gain 196 160 -107.62 gain 160 197 -109.54 gain 197 160 -113.91 gain 160 198 -106.39 gain 198 160 -114.70 gain 160 199 -102.08 gain 199 160 -101.95 gain 160 200 -107.37 gain 200 160 -104.01 gain 160 201 -103.48 gain 201 160 -103.95 gain 160 202 -97.28 gain 202 160 -99.27 gain 160 203 -98.92 gain 203 160 -97.55 gain 160 204 -101.68 gain 204 160 -107.39 gain 160 205 -93.06 gain 205 160 -96.83 gain 160 206 -93.61 gain 206 160 -95.35 gain 160 207 -103.82 gain 207 160 -106.33 gain 160 208 -99.89 gain 208 160 -102.57 gain 160 209 -110.87 gain 209 160 -109.55 gain 160 210 -111.16 gain 210 160 -116.43 gain 160 211 -106.39 gain 211 160 -107.91 gain 160 212 -105.99 gain 212 160 -105.07 gain 160 213 -107.69 gain 213 160 -111.63 gain 160 214 -110.83 gain 214 160 -111.08 gain 160 215 -104.02 gain 215 160 -105.35 gain 160 216 -104.44 gain 216 160 -106.60 gain 160 217 -104.09 gain 217 160 -110.06 gain 160 218 -107.79 gain 218 160 -105.95 gain 160 219 -104.64 gain 219 160 -105.62 gain 160 220 -97.66 gain 220 160 -95.00 gain 160 221 -100.25 gain 221 160 -102.09 gain 160 222 -104.61 gain 222 160 -107.82 gain 160 223 -101.73 gain 223 160 -106.94 gain 160 224 -104.09 gain 224 160 -109.81 gain 161 162 -91.84 gain 162 161 -88.92 gain 161 163 -89.21 gain 163 161 -83.48 gain 161 164 -104.35 gain 164 161 -100.37 gain 161 165 -113.64 gain 165 161 -112.59 gain 161 166 -115.30 gain 166 161 -116.92 gain 161 167 -110.50 gain 167 161 -111.24 gain 161 168 -107.09 gain 168 161 -109.18 gain 161 169 -109.74 gain 169 161 -104.18 gain 161 170 -110.84 gain 170 161 -115.77 gain 161 171 -108.60 gain 171 161 -109.96 gain 161 172 -105.87 gain 172 161 -100.33 gain 161 173 -97.40 gain 173 161 -96.51 gain 161 174 -94.06 gain 174 161 -92.93 gain 161 175 -93.56 gain 175 161 -91.64 gain 161 176 -83.94 gain 176 161 -81.97 gain 161 177 -95.29 gain 177 161 -94.82 gain 161 178 -99.96 gain 178 161 -100.43 gain 161 179 -96.13 gain 179 161 -97.64 gain 161 180 -113.63 gain 180 161 -110.94 gain 161 181 -115.49 gain 181 161 -117.23 gain 161 182 -111.20 gain 182 161 -109.25 gain 161 183 -117.16 gain 183 161 -116.50 gain 161 184 -105.29 gain 184 161 -106.68 gain 161 185 -113.24 gain 185 161 -110.06 gain 161 186 -102.33 gain 186 161 -98.15 gain 161 187 -98.02 gain 187 161 -97.93 gain 161 188 -106.88 gain 188 161 -109.55 gain 161 189 -104.77 gain 189 161 -106.83 gain 161 190 -100.22 gain 190 161 -97.95 gain 161 191 -94.97 gain 191 161 -95.74 gain 161 192 -95.95 gain 192 161 -94.03 gain 161 193 -100.89 gain 193 161 -102.95 gain 161 194 -99.77 gain 194 161 -101.39 gain 161 195 -123.96 gain 195 161 -123.78 gain 161 196 -114.42 gain 196 161 -113.26 gain 161 197 -114.47 gain 197 161 -115.99 gain 161 198 -115.24 gain 198 161 -120.68 gain 161 199 -113.67 gain 199 161 -110.69 gain 161 200 -111.84 gain 200 161 -105.63 gain 161 201 -106.17 gain 201 161 -103.78 gain 161 202 -100.51 gain 202 161 -99.64 gain 161 203 -104.82 gain 203 161 -100.58 gain 161 204 -102.23 gain 204 161 -105.08 gain 161 205 -92.62 gain 205 161 -93.53 gain 161 206 -103.88 gain 206 161 -102.77 gain 161 207 -106.76 gain 207 161 -106.41 gain 161 208 -108.78 gain 208 161 -108.60 gain 161 209 -103.10 gain 209 161 -98.92 gain 161 210 -116.61 gain 210 161 -119.02 gain 161 211 -117.29 gain 211 161 -115.96 gain 161 212 -111.29 gain 212 161 -107.50 gain 161 213 -106.79 gain 213 161 -107.87 gain 161 214 -115.28 gain 214 161 -112.66 gain 161 215 -107.95 gain 215 161 -106.42 gain 161 216 -106.82 gain 216 161 -106.11 gain 161 217 -110.06 gain 217 161 -113.18 gain 161 218 -106.63 gain 218 161 -101.94 gain 161 219 -102.53 gain 219 161 -100.65 gain 161 220 -100.88 gain 220 161 -95.36 gain 161 221 -110.21 gain 221 161 -109.19 gain 161 222 -105.26 gain 222 161 -105.61 gain 161 223 -112.43 gain 223 161 -114.79 gain 161 224 -104.89 gain 224 161 -107.75 gain 162 163 -87.44 gain 163 162 -84.62 gain 162 164 -91.16 gain 164 162 -90.09 gain 162 165 -114.26 gain 165 162 -116.12 gain 162 166 -111.26 gain 166 162 -115.80 gain 162 167 -110.91 gain 167 162 -114.57 gain 162 168 -112.96 gain 168 162 -117.96 gain 162 169 -108.29 gain 169 162 -105.65 gain 162 170 -106.07 gain 170 162 -113.91 gain 162 171 -102.77 gain 171 162 -107.04 gain 162 172 -108.45 gain 172 162 -105.82 gain 162 173 -101.26 gain 173 162 -103.29 gain 162 174 -97.06 gain 174 162 -98.85 gain 162 175 -87.95 gain 175 162 -88.95 gain 162 176 -90.81 gain 176 162 -91.77 gain 162 177 -80.71 gain 177 162 -83.15 gain 162 178 -81.83 gain 178 162 -85.23 gain 162 179 -97.82 gain 179 162 -102.24 gain 162 180 -120.51 gain 180 162 -120.73 gain 162 181 -113.91 gain 181 162 -118.57 gain 162 182 -116.83 gain 182 162 -117.79 gain 162 183 -103.34 gain 183 162 -105.60 gain 162 184 -112.79 gain 184 162 -117.10 gain 162 185 -104.75 gain 185 162 -104.49 gain 162 186 -99.91 gain 186 162 -98.64 gain 162 187 -105.87 gain 187 162 -108.70 gain 162 188 -104.17 gain 188 162 -109.75 gain 162 189 -100.30 gain 189 162 -105.29 gain 162 190 -97.69 gain 190 162 -98.33 gain 162 191 -89.06 gain 191 162 -92.75 gain 162 192 -95.27 gain 192 162 -96.27 gain 162 193 -94.81 gain 193 162 -99.78 gain 162 194 -95.70 gain 194 162 -100.25 gain 162 195 -118.82 gain 195 162 -121.56 gain 162 196 -113.71 gain 196 162 -115.47 gain 162 197 -103.18 gain 197 162 -107.62 gain 162 198 -109.61 gain 198 162 -117.98 gain 162 199 -100.32 gain 199 162 -100.26 gain 162 200 -109.64 gain 200 162 -106.34 gain 162 201 -101.36 gain 201 162 -101.88 gain 162 202 -103.76 gain 202 162 -105.81 gain 162 203 -106.00 gain 203 162 -104.68 gain 162 204 -100.75 gain 204 162 -106.51 gain 162 205 -111.27 gain 205 162 -115.10 gain 162 206 -102.43 gain 206 162 -104.24 gain 162 207 -101.94 gain 207 162 -104.50 gain 162 208 -92.93 gain 208 162 -95.67 gain 162 209 -91.49 gain 209 162 -90.23 gain 162 210 -110.61 gain 210 162 -115.94 gain 162 211 -119.02 gain 211 162 -120.60 gain 162 212 -118.12 gain 212 162 -117.26 gain 162 213 -110.15 gain 213 162 -114.14 gain 162 214 -111.76 gain 214 162 -112.06 gain 162 215 -112.63 gain 215 162 -114.02 gain 162 216 -116.07 gain 216 162 -118.28 gain 162 217 -112.86 gain 217 162 -118.89 gain 162 218 -109.63 gain 218 162 -107.85 gain 162 219 -104.99 gain 219 162 -106.04 gain 162 220 -106.94 gain 220 162 -104.33 gain 162 221 -97.94 gain 221 162 -99.84 gain 162 222 -99.34 gain 222 162 -102.60 gain 162 223 -99.13 gain 223 162 -104.41 gain 162 224 -103.24 gain 224 162 -109.01 gain 163 164 -84.92 gain 164 163 -86.66 gain 163 165 -116.05 gain 165 163 -120.72 gain 163 166 -105.85 gain 166 163 -113.20 gain 163 167 -109.00 gain 167 163 -115.48 gain 163 168 -109.22 gain 168 163 -117.04 gain 163 169 -103.82 gain 169 163 -103.99 gain 163 170 -109.24 gain 170 163 -119.90 gain 163 171 -105.91 gain 171 163 -112.99 gain 163 172 -106.39 gain 172 163 -106.57 gain 163 173 -97.97 gain 173 163 -102.82 gain 163 174 -106.28 gain 174 163 -110.89 gain 163 175 -96.42 gain 175 163 -100.23 gain 163 176 -92.88 gain 176 163 -96.65 gain 163 177 -82.76 gain 177 163 -88.01 gain 163 178 -82.91 gain 178 163 -89.11 gain 163 179 -82.78 gain 179 163 -90.01 gain 163 180 -112.06 gain 180 163 -115.09 gain 163 181 -117.28 gain 181 163 -124.76 gain 163 182 -111.52 gain 182 163 -115.30 gain 163 183 -110.98 gain 183 163 -116.05 gain 163 184 -108.29 gain 184 163 -115.41 gain 163 185 -106.29 gain 185 163 -108.85 gain 163 186 -107.61 gain 186 163 -109.16 gain 163 187 -103.47 gain 187 163 -109.11 gain 163 188 -104.35 gain 188 163 -112.75 gain 163 189 -102.17 gain 189 163 -109.97 gain 163 190 -94.37 gain 190 163 -97.83 gain 163 191 -101.33 gain 191 163 -107.83 gain 163 192 -82.60 gain 192 163 -86.42 gain 163 193 -89.12 gain 193 163 -96.91 gain 163 194 -88.26 gain 194 163 -95.62 gain 163 195 -121.93 gain 195 163 -127.48 gain 163 196 -113.73 gain 196 163 -118.31 gain 163 197 -109.40 gain 197 163 -116.65 gain 163 198 -115.46 gain 198 163 -126.64 gain 163 199 -110.72 gain 199 163 -113.47 gain 163 200 -110.56 gain 200 163 -110.07 gain 163 201 -105.55 gain 201 163 -108.88 gain 163 202 -110.81 gain 202 163 -115.68 gain 163 203 -104.60 gain 203 163 -106.09 gain 163 204 -95.61 gain 204 163 -104.18 gain 163 205 -94.75 gain 205 163 -101.39 gain 163 206 -102.20 gain 206 163 -106.82 gain 163 207 -95.11 gain 207 163 -100.49 gain 163 208 -96.14 gain 208 163 -101.69 gain 163 209 -93.07 gain 209 163 -94.62 gain 163 210 -120.88 gain 210 163 -129.02 gain 163 211 -110.00 gain 211 163 -114.40 gain 163 212 -108.89 gain 212 163 -110.84 gain 163 213 -111.49 gain 213 163 -118.30 gain 163 214 -108.24 gain 214 163 -111.35 gain 163 215 -109.25 gain 215 163 -113.45 gain 163 216 -107.12 gain 216 163 -112.15 gain 163 217 -104.03 gain 217 163 -112.88 gain 163 218 -99.60 gain 218 163 -100.64 gain 163 219 -99.45 gain 219 163 -103.31 gain 163 220 -105.26 gain 220 163 -105.47 gain 163 221 -97.10 gain 221 163 -101.82 gain 163 222 -102.90 gain 222 163 -108.98 gain 163 223 -98.02 gain 223 163 -106.11 gain 163 224 -93.17 gain 224 163 -101.76 gain 164 165 -116.51 gain 165 164 -119.44 gain 164 166 -120.56 gain 166 164 -126.16 gain 164 167 -117.88 gain 167 164 -122.61 gain 164 168 -118.95 gain 168 164 -125.02 gain 164 169 -111.74 gain 169 164 -110.17 gain 164 170 -107.98 gain 170 164 -116.89 gain 164 171 -109.99 gain 171 164 -115.34 gain 164 172 -108.28 gain 172 164 -106.72 gain 164 173 -104.01 gain 173 164 -107.11 gain 164 174 -108.75 gain 174 164 -111.61 gain 164 175 -100.42 gain 175 164 -102.49 gain 164 176 -90.20 gain 176 164 -92.22 gain 164 177 -91.65 gain 177 164 -95.16 gain 164 178 -84.83 gain 178 164 -89.30 gain 164 179 -83.98 gain 179 164 -89.47 gain 164 180 -118.17 gain 180 164 -119.46 gain 164 181 -112.08 gain 181 164 -117.81 gain 164 182 -120.81 gain 182 164 -122.84 gain 164 183 -116.96 gain 183 164 -120.29 gain 164 184 -112.96 gain 184 164 -118.34 gain 164 185 -111.54 gain 185 164 -112.35 gain 164 186 -105.98 gain 186 164 -105.79 gain 164 187 -103.87 gain 187 164 -107.76 gain 164 188 -109.25 gain 188 164 -115.90 gain 164 189 -104.31 gain 189 164 -110.36 gain 164 190 -98.87 gain 190 164 -100.58 gain 164 191 -102.75 gain 191 164 -107.51 gain 164 192 -99.57 gain 192 164 -101.64 gain 164 193 -99.41 gain 193 164 -105.45 gain 164 194 -92.33 gain 194 164 -97.95 gain 164 195 -113.02 gain 195 164 -116.83 gain 164 196 -111.79 gain 196 164 -114.62 gain 164 197 -110.51 gain 197 164 -116.01 gain 164 198 -118.30 gain 198 164 -127.74 gain 164 199 -114.27 gain 199 164 -115.27 gain 164 200 -114.03 gain 200 164 -111.81 gain 164 201 -113.54 gain 201 164 -115.13 gain 164 202 -111.27 gain 202 164 -114.39 gain 164 203 -99.23 gain 203 164 -98.97 gain 164 204 -106.89 gain 204 164 -113.72 gain 164 205 -101.49 gain 205 164 -106.38 gain 164 206 -103.72 gain 206 164 -106.59 gain 164 207 -94.58 gain 207 164 -98.22 gain 164 208 -93.70 gain 208 164 -97.51 gain 164 209 -94.67 gain 209 164 -94.48 gain 164 210 -113.67 gain 210 164 -120.06 gain 164 211 -116.24 gain 211 164 -118.89 gain 164 212 -113.22 gain 212 164 -113.42 gain 164 213 -115.96 gain 213 164 -121.03 gain 164 214 -115.50 gain 214 164 -116.87 gain 164 215 -108.28 gain 215 164 -110.74 gain 164 216 -110.79 gain 216 164 -114.07 gain 164 217 -108.58 gain 217 164 -115.69 gain 164 218 -103.95 gain 218 164 -103.24 gain 164 219 -104.46 gain 219 164 -106.58 gain 164 220 -112.58 gain 220 164 -111.05 gain 164 221 -95.39 gain 221 164 -98.36 gain 164 222 -101.61 gain 222 164 -105.95 gain 164 223 -101.40 gain 223 164 -107.75 gain 164 224 -95.40 gain 224 164 -102.25 gain 165 166 -85.77 gain 166 165 -88.44 gain 165 167 -89.51 gain 167 165 -91.31 gain 165 168 -101.47 gain 168 165 -104.61 gain 165 169 -100.78 gain 169 165 -96.28 gain 165 170 -105.63 gain 170 165 -111.61 gain 165 171 -104.64 gain 171 165 -107.05 gain 165 172 -111.19 gain 172 165 -106.70 gain 165 173 -116.53 gain 173 165 -116.70 gain 165 174 -115.15 gain 174 165 -115.08 gain 165 175 -117.41 gain 175 165 -116.54 gain 165 176 -120.77 gain 176 165 -119.86 gain 165 177 -122.37 gain 177 165 -122.95 gain 165 178 -117.96 gain 178 165 -119.49 gain 165 179 -123.56 gain 179 165 -126.12 gain 165 180 -82.04 gain 180 165 -80.40 gain 165 181 -86.28 gain 181 165 -89.08 gain 165 182 -90.37 gain 182 165 -89.47 gain 165 183 -99.96 gain 183 165 -100.36 gain 165 184 -103.88 gain 184 165 -106.34 gain 165 185 -109.34 gain 185 165 -107.22 gain 165 186 -108.30 gain 186 165 -105.18 gain 165 187 -105.79 gain 187 165 -106.76 gain 165 188 -107.76 gain 188 165 -111.49 gain 165 189 -112.64 gain 189 165 -115.76 gain 165 190 -108.98 gain 190 165 -107.76 gain 165 191 -118.02 gain 191 165 -119.84 gain 165 192 -117.84 gain 192 165 -116.98 gain 165 193 -124.74 gain 193 165 -127.86 gain 165 194 -122.03 gain 194 165 -124.71 gain 165 195 -93.76 gain 195 165 -94.63 gain 165 196 -97.12 gain 196 165 -97.01 gain 165 197 -98.48 gain 197 165 -101.05 gain 165 198 -103.14 gain 198 165 -109.65 gain 165 199 -100.92 gain 199 165 -98.99 gain 165 200 -107.89 gain 200 165 -102.73 gain 165 201 -106.09 gain 201 165 -104.75 gain 165 202 -116.12 gain 202 165 -116.31 gain 165 203 -108.92 gain 203 165 -105.74 gain 165 204 -114.28 gain 204 165 -118.18 gain 165 205 -117.43 gain 205 165 -119.40 gain 165 206 -119.42 gain 206 165 -119.36 gain 165 207 -114.83 gain 207 165 -115.54 gain 165 208 -117.81 gain 208 165 -118.68 gain 165 209 -126.03 gain 209 165 -122.91 gain 165 210 -91.25 gain 210 165 -94.72 gain 165 211 -97.29 gain 211 165 -97.01 gain 165 212 -102.12 gain 212 165 -99.39 gain 165 213 -106.52 gain 213 165 -108.66 gain 165 214 -110.37 gain 214 165 -108.81 gain 165 215 -114.83 gain 215 165 -114.35 gain 165 216 -106.08 gain 216 165 -106.43 gain 165 217 -114.03 gain 217 165 -118.20 gain 165 218 -113.71 gain 218 165 -110.07 gain 165 219 -115.68 gain 219 165 -114.86 gain 165 220 -116.63 gain 220 165 -112.17 gain 165 221 -110.82 gain 221 165 -110.85 gain 165 222 -110.99 gain 222 165 -112.40 gain 165 223 -118.59 gain 223 165 -122.01 gain 165 224 -115.56 gain 224 165 -119.47 gain 166 167 -87.12 gain 167 166 -86.24 gain 166 168 -92.01 gain 168 166 -92.48 gain 166 169 -103.43 gain 169 166 -96.25 gain 166 170 -105.25 gain 170 166 -108.55 gain 166 171 -108.48 gain 171 166 -108.21 gain 166 172 -113.02 gain 172 166 -105.85 gain 166 173 -106.97 gain 173 166 -104.46 gain 166 174 -110.74 gain 174 166 -108.00 gain 166 175 -118.98 gain 175 166 -115.44 gain 166 176 -122.46 gain 176 166 -118.88 gain 166 177 -116.97 gain 177 166 -114.88 gain 166 178 -122.25 gain 178 166 -121.10 gain 166 179 -117.60 gain 179 166 -117.48 gain 166 180 -86.90 gain 180 166 -82.58 gain 166 181 -94.72 gain 181 166 -94.85 gain 166 182 -90.76 gain 182 166 -87.19 gain 166 183 -95.10 gain 183 166 -92.82 gain 166 184 -104.62 gain 184 166 -104.39 gain 166 185 -113.66 gain 185 166 -108.86 gain 166 186 -111.83 gain 186 166 -106.03 gain 166 187 -109.47 gain 187 166 -107.76 gain 166 188 -115.15 gain 188 166 -116.20 gain 166 189 -123.27 gain 189 166 -123.72 gain 166 190 -118.35 gain 190 166 -114.46 gain 166 191 -116.40 gain 191 166 -115.54 gain 166 192 -120.75 gain 192 166 -117.21 gain 166 193 -118.77 gain 193 166 -119.21 gain 166 194 -122.56 gain 194 166 -122.57 gain 166 195 -95.56 gain 195 166 -93.76 gain 166 196 -91.04 gain 196 166 -88.27 gain 166 197 -89.84 gain 197 166 -89.74 gain 166 198 -104.63 gain 198 166 -108.46 gain 166 199 -106.60 gain 199 166 -102.00 gain 166 200 -100.80 gain 200 166 -92.96 gain 166 201 -112.80 gain 201 166 -108.78 gain 166 202 -113.35 gain 202 166 -110.87 gain 166 203 -110.20 gain 203 166 -104.34 gain 166 204 -112.64 gain 204 166 -113.86 gain 166 205 -113.16 gain 205 166 -112.45 gain 166 206 -117.68 gain 206 166 -114.94 gain 166 207 -117.42 gain 207 166 -115.45 gain 166 208 -118.94 gain 208 166 -117.14 gain 166 209 -118.21 gain 209 166 -112.41 gain 166 210 -106.43 gain 210 166 -107.22 gain 166 211 -96.62 gain 211 166 -93.66 gain 166 212 -98.78 gain 212 166 -93.37 gain 166 213 -104.24 gain 213 166 -103.70 gain 166 214 -107.94 gain 214 166 -103.70 gain 166 215 -106.36 gain 215 166 -103.21 gain 166 216 -108.53 gain 216 166 -106.21 gain 166 217 -111.07 gain 217 166 -112.56 gain 166 218 -114.29 gain 218 166 -107.98 gain 166 219 -120.26 gain 219 166 -116.77 gain 166 220 -118.13 gain 220 166 -110.99 gain 166 221 -118.88 gain 221 166 -116.24 gain 166 222 -125.49 gain 222 166 -124.22 gain 166 223 -121.08 gain 223 166 -121.82 gain 166 224 -119.24 gain 224 166 -120.48 gain 167 168 -86.76 gain 168 167 -88.11 gain 167 169 -99.36 gain 169 167 -93.05 gain 167 170 -105.23 gain 170 167 -109.42 gain 167 171 -111.58 gain 171 167 -112.19 gain 167 172 -110.40 gain 172 167 -104.11 gain 167 173 -117.28 gain 173 167 -115.65 gain 167 174 -111.68 gain 174 167 -109.81 gain 167 175 -108.96 gain 175 167 -106.30 gain 167 176 -110.50 gain 176 167 -107.79 gain 167 177 -118.88 gain 177 167 -117.66 gain 167 178 -116.75 gain 178 167 -116.48 gain 167 179 -125.05 gain 179 167 -125.81 gain 167 180 -94.97 gain 180 167 -91.53 gain 167 181 -92.20 gain 181 167 -93.20 gain 167 182 -81.09 gain 182 167 -78.39 gain 167 183 -85.61 gain 183 167 -84.21 gain 167 184 -97.96 gain 184 167 -98.61 gain 167 185 -102.67 gain 185 167 -98.75 gain 167 186 -101.96 gain 186 167 -97.04 gain 167 187 -106.98 gain 187 167 -106.15 gain 167 188 -102.62 gain 188 167 -104.55 gain 167 189 -109.95 gain 189 167 -111.27 gain 167 190 -115.78 gain 190 167 -112.77 gain 167 191 -130.10 gain 191 167 -130.13 gain 167 192 -122.75 gain 192 167 -120.09 gain 167 193 -116.41 gain 193 167 -117.73 gain 167 194 -117.73 gain 194 167 -118.62 gain 167 195 -99.90 gain 195 167 -98.98 gain 167 196 -98.19 gain 196 167 -96.29 gain 167 197 -97.88 gain 197 167 -98.65 gain 167 198 -95.81 gain 198 167 -100.51 gain 167 199 -95.94 gain 199 167 -92.21 gain 167 200 -103.32 gain 200 167 -96.36 gain 167 201 -109.46 gain 201 167 -106.32 gain 167 202 -107.52 gain 202 167 -105.91 gain 167 203 -105.84 gain 203 167 -100.86 gain 167 204 -116.49 gain 204 167 -118.59 gain 167 205 -111.00 gain 205 167 -111.17 gain 167 206 -107.35 gain 206 167 -105.49 gain 167 207 -108.00 gain 207 167 -106.91 gain 167 208 -120.83 gain 208 167 -119.90 gain 167 209 -121.36 gain 209 167 -116.44 gain 167 210 -101.26 gain 210 167 -102.92 gain 167 211 -100.22 gain 211 167 -98.15 gain 167 212 -100.25 gain 212 167 -95.72 gain 167 213 -107.57 gain 213 167 -107.91 gain 167 214 -106.10 gain 214 167 -102.74 gain 167 215 -104.50 gain 215 167 -102.23 gain 167 216 -103.68 gain 216 167 -102.24 gain 167 217 -113.73 gain 217 167 -116.11 gain 167 218 -108.05 gain 218 167 -102.61 gain 167 219 -114.53 gain 219 167 -111.91 gain 167 220 -115.34 gain 220 167 -109.07 gain 167 221 -111.85 gain 221 167 -110.09 gain 167 222 -118.59 gain 222 167 -118.20 gain 167 223 -120.03 gain 223 167 -121.65 gain 167 224 -115.09 gain 224 167 -117.20 gain 168 169 -89.52 gain 169 168 -81.87 gain 168 170 -98.81 gain 170 168 -101.65 gain 168 171 -95.29 gain 171 168 -94.56 gain 168 172 -103.27 gain 172 168 -95.63 gain 168 173 -111.67 gain 173 168 -108.69 gain 168 174 -110.95 gain 174 168 -107.74 gain 168 175 -115.21 gain 175 168 -111.21 gain 168 176 -115.44 gain 176 168 -111.38 gain 168 177 -116.37 gain 177 168 -113.80 gain 168 178 -116.69 gain 178 168 -115.08 gain 168 179 -122.92 gain 179 168 -122.33 gain 168 180 -104.24 gain 180 168 -99.45 gain 168 181 -102.48 gain 181 168 -102.13 gain 168 182 -88.71 gain 182 168 -84.66 gain 168 183 -84.66 gain 183 168 -81.91 gain 168 184 -89.49 gain 184 168 -88.80 gain 168 185 -94.70 gain 185 168 -89.43 gain 168 186 -97.57 gain 186 168 -91.30 gain 168 187 -108.11 gain 187 168 -105.93 gain 168 188 -112.23 gain 188 168 -112.81 gain 168 189 -114.08 gain 189 168 -114.05 gain 168 190 -114.21 gain 190 168 -109.85 gain 168 191 -118.72 gain 191 168 -117.39 gain 168 192 -109.60 gain 192 168 -105.59 gain 168 193 -121.99 gain 193 168 -121.95 gain 168 194 -122.30 gain 194 168 -121.84 gain 168 195 -102.44 gain 195 168 -100.17 gain 168 196 -98.01 gain 196 168 -94.77 gain 168 197 -101.30 gain 197 168 -100.72 gain 168 198 -98.11 gain 198 168 -101.47 gain 168 199 -97.77 gain 199 168 -92.69 gain 168 200 -101.93 gain 200 168 -93.63 gain 168 201 -107.76 gain 201 168 -103.28 gain 168 202 -98.69 gain 202 168 -95.73 gain 168 203 -113.53 gain 203 168 -107.20 gain 168 204 -114.78 gain 204 168 -115.53 gain 168 205 -109.12 gain 205 168 -107.94 gain 168 206 -111.25 gain 206 168 -108.05 gain 168 207 -120.22 gain 207 168 -117.78 gain 168 208 -118.51 gain 208 168 -116.24 gain 168 209 -117.17 gain 209 168 -110.90 gain 168 210 -107.77 gain 210 168 -108.09 gain 168 211 -101.67 gain 211 168 -98.25 gain 168 212 -107.73 gain 212 168 -101.86 gain 168 213 -90.24 gain 213 168 -89.23 gain 168 214 -105.34 gain 214 168 -100.63 gain 168 215 -105.96 gain 215 168 -102.34 gain 168 216 -108.16 gain 216 168 -105.37 gain 168 217 -109.01 gain 217 168 -110.03 gain 168 218 -119.45 gain 218 168 -112.67 gain 168 219 -113.33 gain 219 168 -109.37 gain 168 220 -115.57 gain 220 168 -107.96 gain 168 221 -113.93 gain 221 168 -110.82 gain 168 222 -119.06 gain 222 168 -117.32 gain 168 223 -117.95 gain 223 168 -118.22 gain 168 224 -125.95 gain 224 168 -126.72 gain 169 170 -79.68 gain 170 169 -90.17 gain 169 171 -91.04 gain 171 169 -97.95 gain 169 172 -99.47 gain 172 169 -99.49 gain 169 173 -85.99 gain 173 169 -90.66 gain 169 174 -101.32 gain 174 169 -105.76 gain 169 175 -109.18 gain 175 169 -112.82 gain 169 176 -100.60 gain 176 169 -104.19 gain 169 177 -99.15 gain 177 169 -104.24 gain 169 178 -107.42 gain 178 169 -113.46 gain 169 179 -110.74 gain 179 169 -117.80 gain 169 180 -101.91 gain 180 169 -104.78 gain 169 181 -92.80 gain 181 169 -100.11 gain 169 182 -82.44 gain 182 169 -86.05 gain 169 183 -93.12 gain 183 169 -98.02 gain 169 184 -76.41 gain 184 169 -83.37 gain 169 185 -84.15 gain 185 169 -86.54 gain 169 186 -89.60 gain 186 169 -90.98 gain 169 187 -97.05 gain 187 169 -102.52 gain 169 188 -101.68 gain 188 169 -109.91 gain 169 189 -103.30 gain 189 169 -110.93 gain 169 190 -107.37 gain 190 169 -110.67 gain 169 191 -107.34 gain 191 169 -113.67 gain 169 192 -108.22 gain 192 169 -111.86 gain 169 193 -115.82 gain 193 169 -123.44 gain 169 194 -112.37 gain 194 169 -119.57 gain 169 195 -96.07 gain 195 169 -101.45 gain 169 196 -97.41 gain 196 169 -101.81 gain 169 197 -93.07 gain 197 169 -100.15 gain 169 198 -85.69 gain 198 169 -96.71 gain 169 199 -86.68 gain 199 169 -89.26 gain 169 200 -90.60 gain 200 169 -89.95 gain 169 201 -92.38 gain 201 169 -95.54 gain 169 202 -92.94 gain 202 169 -97.63 gain 169 203 -96.21 gain 203 169 -97.54 gain 169 204 -106.65 gain 204 169 -115.06 gain 169 205 -99.46 gain 205 169 -105.94 gain 169 206 -102.09 gain 206 169 -106.54 gain 169 207 -109.87 gain 207 169 -115.08 gain 169 208 -111.56 gain 208 169 -116.94 gain 169 209 -109.81 gain 209 169 -111.20 gain 169 210 -95.74 gain 210 169 -103.71 gain 169 211 -96.54 gain 211 169 -100.77 gain 169 212 -94.14 gain 212 169 -95.91 gain 169 213 -90.78 gain 213 169 -97.42 gain 169 214 -91.43 gain 214 169 -94.37 gain 169 215 -96.50 gain 215 169 -100.53 gain 169 216 -100.77 gain 216 169 -105.63 gain 169 217 -106.27 gain 217 169 -114.95 gain 169 218 -107.28 gain 218 169 -108.15 gain 169 219 -104.36 gain 219 169 -108.05 gain 169 220 -108.28 gain 220 169 -108.32 gain 169 221 -110.27 gain 221 169 -114.81 gain 169 222 -111.90 gain 222 169 -117.81 gain 169 223 -105.98 gain 223 169 -113.90 gain 169 224 -113.94 gain 224 169 -122.36 gain 170 171 -93.28 gain 171 170 -89.71 gain 170 172 -103.30 gain 172 170 -92.83 gain 170 173 -101.08 gain 173 170 -95.26 gain 170 174 -110.32 gain 174 170 -104.26 gain 170 175 -117.07 gain 175 170 -110.22 gain 170 176 -109.14 gain 176 170 -102.25 gain 170 177 -115.29 gain 177 170 -109.88 gain 170 178 -111.61 gain 178 170 -107.15 gain 170 179 -116.48 gain 179 170 -113.06 gain 170 180 -110.46 gain 180 170 -102.84 gain 170 181 -113.56 gain 181 170 -110.38 gain 170 182 -114.28 gain 182 170 -107.40 gain 170 183 -100.41 gain 183 170 -94.83 gain 170 184 -100.24 gain 184 170 -96.70 gain 170 185 -95.06 gain 185 170 -86.95 gain 170 186 -99.92 gain 186 170 -90.81 gain 170 187 -104.62 gain 187 170 -99.60 gain 170 188 -103.04 gain 188 170 -100.78 gain 170 189 -116.33 gain 189 170 -113.47 gain 170 190 -110.02 gain 190 170 -102.82 gain 170 191 -114.50 gain 191 170 -110.33 gain 170 192 -113.75 gain 192 170 -106.91 gain 170 193 -113.86 gain 193 170 -110.99 gain 170 194 -113.78 gain 194 170 -110.48 gain 170 195 -115.80 gain 195 170 -110.69 gain 170 196 -106.49 gain 196 170 -100.40 gain 170 197 -105.25 gain 197 170 -101.83 gain 170 198 -106.00 gain 198 170 -106.52 gain 170 199 -95.78 gain 199 170 -87.87 gain 170 200 -104.69 gain 200 170 -93.55 gain 170 201 -95.13 gain 201 170 -87.80 gain 170 202 -106.91 gain 202 170 -101.11 gain 170 203 -106.07 gain 203 170 -96.90 gain 170 204 -105.42 gain 204 170 -103.34 gain 170 205 -109.58 gain 205 170 -105.56 gain 170 206 -114.29 gain 206 170 -108.24 gain 170 207 -122.11 gain 207 170 -116.82 gain 170 208 -122.37 gain 208 170 -117.26 gain 170 209 -119.38 gain 209 170 -110.28 gain 170 210 -117.65 gain 210 170 -115.12 gain 170 211 -110.30 gain 211 170 -104.03 gain 170 212 -112.55 gain 212 170 -103.84 gain 170 213 -107.48 gain 213 170 -103.63 gain 170 214 -103.95 gain 214 170 -96.40 gain 170 215 -109.59 gain 215 170 -103.13 gain 170 216 -113.69 gain 216 170 -108.06 gain 170 217 -107.96 gain 217 170 -106.15 gain 170 218 -107.29 gain 218 170 -97.67 gain 170 219 -106.68 gain 219 170 -99.87 gain 170 220 -114.28 gain 220 170 -103.83 gain 170 221 -116.69 gain 221 170 -110.74 gain 170 222 -115.81 gain 222 170 -111.23 gain 170 223 -112.05 gain 223 170 -109.48 gain 170 224 -121.20 gain 224 170 -119.13 gain 171 172 -86.68 gain 172 171 -79.78 gain 171 173 -98.74 gain 173 171 -96.50 gain 171 174 -99.24 gain 174 171 -96.76 gain 171 175 -109.12 gain 175 171 -105.85 gain 171 176 -107.42 gain 176 171 -104.10 gain 171 177 -112.42 gain 177 171 -110.59 gain 171 178 -111.43 gain 178 171 -110.55 gain 171 179 -105.62 gain 179 171 -105.77 gain 171 180 -109.42 gain 180 171 -105.36 gain 171 181 -106.15 gain 181 171 -106.53 gain 171 182 -110.57 gain 182 171 -107.26 gain 171 183 -103.28 gain 183 171 -101.27 gain 171 184 -100.70 gain 184 171 -100.74 gain 171 185 -87.63 gain 185 171 -83.10 gain 171 186 -90.33 gain 186 171 -84.80 gain 171 187 -86.60 gain 187 171 -85.16 gain 171 188 -94.08 gain 188 171 -95.40 gain 171 189 -103.36 gain 189 171 -104.07 gain 171 190 -107.64 gain 190 171 -104.01 gain 171 191 -115.89 gain 191 171 -115.30 gain 171 192 -109.14 gain 192 171 -105.87 gain 171 193 -119.08 gain 193 171 -119.78 gain 171 194 -116.26 gain 194 171 -116.54 gain 171 195 -117.34 gain 195 171 -115.80 gain 171 196 -107.09 gain 196 171 -104.58 gain 171 197 -105.53 gain 197 171 -105.69 gain 171 198 -99.20 gain 198 171 -103.29 gain 171 199 -106.39 gain 199 171 -102.05 gain 171 200 -98.24 gain 200 171 -90.67 gain 171 201 -96.79 gain 201 171 -93.04 gain 171 202 -95.30 gain 202 171 -93.08 gain 171 203 -104.60 gain 203 171 -99.01 gain 171 204 -100.85 gain 204 171 -102.34 gain 171 205 -106.22 gain 205 171 -105.77 gain 171 206 -112.87 gain 206 171 -110.40 gain 171 207 -111.44 gain 207 171 -109.74 gain 171 208 -108.40 gain 208 171 -106.87 gain 171 209 -113.29 gain 209 171 -107.76 gain 171 210 -108.37 gain 210 171 -109.43 gain 171 211 -112.60 gain 211 171 -109.91 gain 171 212 -103.99 gain 212 171 -98.85 gain 171 213 -105.09 gain 213 171 -104.82 gain 171 214 -102.47 gain 214 171 -98.50 gain 171 215 -102.46 gain 215 171 -99.58 gain 171 216 -93.30 gain 216 171 -91.24 gain 171 217 -93.76 gain 217 171 -95.52 gain 171 218 -108.74 gain 218 171 -102.69 gain 171 219 -105.45 gain 219 171 -102.22 gain 171 220 -104.91 gain 220 171 -98.03 gain 171 221 -114.56 gain 221 171 -112.19 gain 171 222 -113.88 gain 222 171 -112.88 gain 171 223 -109.88 gain 223 171 -110.88 gain 171 224 -118.06 gain 224 171 -119.56 gain 172 173 -81.21 gain 173 172 -85.88 gain 172 174 -90.87 gain 174 172 -95.29 gain 172 175 -99.42 gain 175 172 -103.05 gain 172 176 -102.16 gain 176 172 -105.74 gain 172 177 -101.09 gain 177 172 -106.16 gain 172 178 -98.49 gain 178 172 -104.52 gain 172 179 -105.29 gain 179 172 -112.34 gain 172 180 -106.52 gain 180 172 -109.37 gain 172 181 -110.43 gain 181 172 -117.72 gain 172 182 -101.26 gain 182 172 -104.85 gain 172 183 -103.87 gain 183 172 -108.76 gain 172 184 -89.91 gain 184 172 -96.85 gain 172 185 -90.23 gain 185 172 -92.60 gain 172 186 -81.85 gain 186 172 -83.22 gain 172 187 -80.53 gain 187 172 -85.99 gain 172 188 -86.48 gain 188 172 -94.69 gain 172 189 -87.62 gain 189 172 -95.23 gain 172 190 -103.60 gain 190 172 -106.87 gain 172 191 -99.90 gain 191 172 -106.21 gain 172 192 -103.46 gain 192 172 -107.09 gain 172 193 -107.51 gain 193 172 -115.12 gain 172 194 -105.73 gain 194 172 -112.90 gain 172 195 -104.30 gain 195 172 -109.67 gain 172 196 -102.71 gain 196 172 -107.10 gain 172 197 -97.99 gain 197 172 -105.05 gain 172 198 -102.32 gain 198 172 -113.32 gain 172 199 -107.89 gain 199 172 -110.46 gain 172 200 -92.51 gain 200 172 -91.84 gain 172 201 -94.40 gain 201 172 -97.55 gain 172 202 -83.69 gain 202 172 -88.37 gain 172 203 -94.56 gain 203 172 -95.86 gain 172 204 -89.28 gain 204 172 -97.67 gain 172 205 -98.74 gain 205 172 -105.19 gain 172 206 -95.57 gain 206 172 -100.00 gain 172 207 -97.70 gain 207 172 -102.90 gain 172 208 -108.86 gain 208 172 -114.22 gain 172 209 -110.45 gain 209 172 -111.82 gain 172 210 -106.30 gain 210 172 -114.25 gain 172 211 -111.91 gain 211 172 -116.12 gain 172 212 -101.50 gain 212 172 -103.26 gain 172 213 -102.64 gain 213 172 -109.27 gain 172 214 -102.52 gain 214 172 -105.45 gain 172 215 -101.97 gain 215 172 -105.99 gain 172 216 -96.58 gain 216 172 -101.43 gain 172 217 -92.31 gain 217 172 -100.98 gain 172 218 -95.37 gain 218 172 -96.22 gain 172 219 -101.36 gain 219 172 -105.03 gain 172 220 -91.91 gain 220 172 -91.93 gain 172 221 -101.65 gain 221 172 -106.18 gain 172 222 -102.00 gain 222 172 -107.89 gain 172 223 -94.33 gain 223 172 -102.23 gain 172 224 -109.10 gain 224 172 -117.50 gain 173 174 -87.49 gain 174 173 -87.25 gain 173 175 -95.26 gain 175 173 -94.22 gain 173 176 -105.83 gain 176 173 -104.75 gain 173 177 -105.49 gain 177 173 -105.90 gain 173 178 -107.79 gain 178 173 -109.15 gain 173 179 -114.86 gain 179 173 -117.25 gain 173 180 -104.66 gain 180 173 -102.85 gain 173 181 -120.58 gain 181 173 -123.21 gain 173 182 -109.66 gain 182 173 -108.60 gain 173 183 -114.48 gain 183 173 -114.71 gain 173 184 -107.86 gain 184 173 -110.14 gain 173 185 -96.15 gain 185 173 -93.86 gain 173 186 -98.77 gain 186 173 -95.48 gain 173 187 -93.17 gain 187 173 -93.97 gain 173 188 -95.23 gain 188 173 -98.78 gain 173 189 -93.11 gain 189 173 -96.06 gain 173 190 -95.95 gain 190 173 -94.57 gain 173 191 -102.60 gain 191 173 -104.26 gain 173 192 -106.87 gain 192 173 -105.84 gain 173 193 -112.17 gain 193 173 -115.11 gain 173 194 -106.38 gain 194 173 -108.90 gain 173 195 -107.52 gain 195 173 -108.22 gain 173 196 -109.98 gain 196 173 -109.71 gain 173 197 -103.78 gain 197 173 -106.18 gain 173 198 -111.62 gain 198 173 -117.95 gain 173 199 -100.91 gain 199 173 -98.81 gain 173 200 -108.89 gain 200 173 -103.56 gain 173 201 -101.96 gain 201 173 -100.45 gain 173 202 -90.14 gain 202 173 -90.15 gain 173 203 -90.34 gain 203 173 -86.99 gain 173 204 -94.81 gain 204 173 -98.54 gain 173 205 -99.51 gain 205 173 -101.30 gain 173 206 -98.50 gain 206 173 -98.27 gain 173 207 -106.16 gain 207 173 -106.70 gain 173 208 -101.97 gain 208 173 -102.68 gain 173 209 -109.80 gain 209 173 -106.51 gain 173 210 -112.35 gain 210 173 -115.64 gain 173 211 -114.44 gain 211 173 -114.00 gain 173 212 -111.78 gain 212 173 -108.88 gain 173 213 -104.36 gain 213 173 -106.33 gain 173 214 -110.21 gain 214 173 -108.48 gain 173 215 -100.14 gain 215 173 -99.49 gain 173 216 -103.48 gain 216 173 -103.67 gain 173 217 -100.96 gain 217 173 -104.97 gain 173 218 -98.90 gain 218 173 -95.09 gain 173 219 -100.41 gain 219 173 -99.42 gain 173 220 -107.43 gain 220 173 -102.79 gain 173 221 -102.79 gain 221 173 -102.66 gain 173 222 -104.50 gain 222 173 -105.74 gain 173 223 -111.47 gain 223 173 -114.71 gain 173 224 -105.58 gain 224 173 -109.32 gain 174 175 -88.60 gain 175 174 -87.80 gain 174 176 -86.58 gain 176 174 -85.74 gain 174 177 -101.05 gain 177 174 -101.70 gain 174 178 -104.85 gain 178 174 -106.45 gain 174 179 -102.09 gain 179 174 -104.71 gain 174 180 -114.91 gain 180 174 -113.34 gain 174 181 -110.09 gain 181 174 -112.96 gain 174 182 -112.01 gain 182 174 -111.18 gain 174 183 -108.57 gain 183 174 -109.04 gain 174 184 -107.46 gain 184 174 -109.98 gain 174 185 -105.36 gain 185 174 -103.30 gain 174 186 -104.54 gain 186 174 -101.49 gain 174 187 -97.47 gain 187 174 -98.51 gain 174 188 -95.66 gain 188 174 -99.45 gain 174 189 -81.05 gain 189 174 -84.24 gain 174 190 -90.86 gain 190 174 -89.71 gain 174 191 -96.40 gain 191 174 -98.29 gain 174 192 -98.78 gain 192 174 -97.99 gain 174 193 -107.80 gain 193 174 -110.99 gain 174 194 -108.00 gain 194 174 -110.75 gain 174 195 -117.20 gain 195 174 -118.15 gain 174 196 -112.66 gain 196 174 -112.63 gain 174 197 -114.68 gain 197 174 -117.32 gain 174 198 -109.78 gain 198 174 -116.36 gain 174 199 -105.72 gain 199 174 -103.86 gain 174 200 -107.25 gain 200 174 -102.17 gain 174 201 -104.65 gain 201 174 -103.38 gain 174 202 -90.24 gain 202 174 -90.50 gain 174 203 -91.15 gain 203 174 -88.03 gain 174 204 -90.10 gain 204 174 -94.07 gain 174 205 -96.23 gain 205 174 -98.27 gain 174 206 -94.38 gain 206 174 -94.39 gain 174 207 -103.58 gain 207 174 -104.35 gain 174 208 -107.91 gain 208 174 -108.86 gain 174 209 -98.89 gain 209 174 -95.84 gain 174 210 -117.28 gain 210 174 -120.81 gain 174 211 -107.54 gain 211 174 -107.33 gain 174 212 -106.98 gain 212 174 -104.32 gain 174 213 -107.64 gain 213 174 -109.85 gain 174 214 -105.80 gain 214 174 -104.30 gain 174 215 -109.88 gain 215 174 -109.47 gain 174 216 -104.52 gain 216 174 -104.94 gain 174 217 -99.19 gain 217 174 -103.43 gain 174 218 -102.39 gain 218 174 -98.82 gain 174 219 -89.12 gain 219 174 -88.37 gain 174 220 -96.84 gain 220 174 -92.44 gain 174 221 -103.38 gain 221 174 -103.48 gain 174 222 -96.93 gain 222 174 -98.40 gain 174 223 -111.75 gain 223 174 -115.23 gain 174 224 -107.51 gain 224 174 -111.49 gain 175 176 -91.88 gain 176 175 -91.83 gain 175 177 -92.61 gain 177 175 -94.06 gain 175 178 -96.94 gain 178 175 -99.33 gain 175 179 -106.72 gain 179 175 -110.14 gain 175 180 -113.38 gain 180 175 -112.60 gain 175 181 -109.27 gain 181 175 -112.93 gain 175 182 -112.61 gain 182 175 -112.57 gain 175 183 -106.78 gain 183 175 -108.04 gain 175 184 -108.19 gain 184 175 -111.50 gain 175 185 -109.68 gain 185 175 -108.43 gain 175 186 -102.15 gain 186 175 -99.89 gain 175 187 -106.41 gain 187 175 -108.24 gain 175 188 -91.56 gain 188 175 -96.14 gain 175 189 -82.12 gain 189 175 -86.10 gain 175 190 -79.31 gain 190 175 -78.96 gain 175 191 -91.97 gain 191 175 -94.66 gain 175 192 -95.72 gain 192 175 -95.72 gain 175 193 -103.68 gain 193 175 -107.66 gain 175 194 -101.11 gain 194 175 -104.66 gain 175 195 -112.64 gain 195 175 -114.38 gain 175 196 -118.08 gain 196 175 -118.84 gain 175 197 -115.33 gain 197 175 -118.77 gain 175 198 -109.53 gain 198 175 -116.90 gain 175 199 -109.76 gain 199 175 -108.70 gain 175 200 -106.72 gain 200 175 -102.42 gain 175 201 -105.03 gain 201 175 -104.55 gain 175 202 -93.52 gain 202 175 -94.57 gain 175 203 -102.02 gain 203 175 -99.70 gain 175 204 -95.81 gain 204 175 -100.57 gain 175 205 -89.74 gain 205 175 -92.57 gain 175 206 -90.23 gain 206 175 -91.03 gain 175 207 -104.40 gain 207 175 -105.97 gain 175 208 -103.57 gain 208 175 -105.31 gain 175 209 -106.11 gain 209 175 -103.85 gain 175 210 -113.86 gain 210 175 -118.18 gain 175 211 -110.41 gain 211 175 -110.99 gain 175 212 -110.77 gain 212 175 -108.91 gain 175 213 -103.03 gain 213 175 -106.03 gain 175 214 -111.93 gain 214 175 -111.23 gain 175 215 -111.54 gain 215 175 -111.93 gain 175 216 -94.33 gain 216 175 -95.55 gain 175 217 -100.23 gain 217 175 -105.27 gain 175 218 -101.52 gain 218 175 -98.75 gain 175 219 -102.06 gain 219 175 -102.10 gain 175 220 -102.18 gain 220 175 -98.58 gain 175 221 -98.88 gain 221 175 -99.78 gain 175 222 -95.78 gain 222 175 -98.05 gain 175 223 -95.61 gain 223 175 -99.88 gain 175 224 -107.93 gain 224 175 -112.71 gain 176 177 -86.01 gain 177 176 -87.50 gain 176 178 -96.12 gain 178 176 -98.56 gain 176 179 -100.71 gain 179 176 -104.18 gain 176 180 -113.64 gain 180 176 -112.91 gain 176 181 -116.44 gain 181 176 -120.15 gain 176 182 -114.12 gain 182 176 -114.13 gain 176 183 -112.97 gain 183 176 -114.28 gain 176 184 -116.64 gain 184 176 -120.00 gain 176 185 -109.65 gain 185 176 -108.44 gain 176 186 -100.91 gain 186 176 -98.70 gain 176 187 -104.22 gain 187 176 -106.10 gain 176 188 -96.89 gain 188 176 -101.52 gain 176 189 -96.03 gain 189 176 -100.06 gain 176 190 -85.84 gain 190 176 -85.54 gain 176 191 -81.60 gain 191 176 -84.33 gain 176 192 -82.84 gain 192 176 -82.89 gain 176 193 -98.89 gain 193 176 -102.91 gain 176 194 -98.75 gain 194 176 -102.35 gain 176 195 -112.49 gain 195 176 -114.27 gain 176 196 -110.56 gain 196 176 -111.37 gain 176 197 -107.30 gain 197 176 -110.78 gain 176 198 -108.44 gain 198 176 -115.86 gain 176 199 -113.31 gain 199 176 -112.29 gain 176 200 -105.43 gain 200 176 -101.18 gain 176 201 -104.31 gain 201 176 -103.88 gain 176 202 -103.91 gain 202 176 -105.01 gain 176 203 -106.17 gain 203 176 -103.90 gain 176 204 -92.65 gain 204 176 -97.46 gain 176 205 -97.30 gain 205 176 -100.17 gain 176 206 -93.60 gain 206 176 -94.45 gain 176 207 -97.94 gain 207 176 -99.55 gain 176 208 -102.30 gain 208 176 -104.08 gain 176 209 -98.46 gain 209 176 -96.24 gain 176 210 -113.59 gain 210 176 -117.96 gain 176 211 -121.04 gain 211 176 -121.68 gain 176 212 -109.59 gain 212 176 -107.77 gain 176 213 -120.94 gain 213 176 -123.99 gain 176 214 -105.65 gain 214 176 -104.99 gain 176 215 -111.71 gain 215 176 -112.15 gain 176 216 -113.54 gain 216 176 -114.80 gain 176 217 -108.45 gain 217 176 -113.54 gain 176 218 -104.58 gain 218 176 -101.85 gain 176 219 -98.41 gain 219 176 -98.50 gain 176 220 -103.27 gain 220 176 -99.71 gain 176 221 -97.97 gain 221 176 -98.92 gain 176 222 -94.95 gain 222 176 -97.26 gain 176 223 -98.26 gain 223 176 -102.59 gain 176 224 -107.50 gain 224 176 -112.33 gain 177 178 -86.77 gain 178 177 -87.72 gain 177 179 -99.25 gain 179 177 -101.23 gain 177 180 -111.17 gain 180 177 -108.95 gain 177 181 -117.16 gain 181 177 -119.38 gain 177 182 -111.20 gain 182 177 -109.72 gain 177 183 -116.08 gain 183 177 -115.90 gain 177 184 -114.63 gain 184 177 -116.50 gain 177 185 -104.39 gain 185 177 -101.69 gain 177 186 -110.10 gain 186 177 -106.40 gain 177 187 -109.06 gain 187 177 -109.45 gain 177 188 -100.05 gain 188 177 -103.20 gain 177 189 -99.68 gain 189 177 -102.22 gain 177 190 -95.38 gain 190 177 -93.59 gain 177 191 -94.60 gain 191 177 -95.85 gain 177 192 -79.34 gain 192 177 -77.90 gain 177 193 -89.43 gain 193 177 -91.96 gain 177 194 -95.06 gain 194 177 -97.16 gain 177 195 -119.07 gain 195 177 -119.37 gain 177 196 -114.67 gain 196 177 -113.99 gain 177 197 -112.06 gain 197 177 -114.05 gain 177 198 -111.26 gain 198 177 -117.18 gain 177 199 -111.41 gain 199 177 -108.90 gain 177 200 -108.81 gain 200 177 -103.07 gain 177 201 -110.71 gain 201 177 -108.79 gain 177 202 -107.67 gain 202 177 -107.28 gain 177 203 -116.21 gain 203 177 -112.45 gain 177 204 -105.32 gain 204 177 -108.64 gain 177 205 -97.43 gain 205 177 -98.81 gain 177 206 -100.14 gain 206 177 -99.50 gain 177 207 -99.67 gain 207 177 -99.79 gain 177 208 -91.84 gain 208 177 -92.14 gain 177 209 -99.79 gain 209 177 -96.09 gain 177 210 -119.12 gain 210 177 -122.00 gain 177 211 -119.31 gain 211 177 -118.45 gain 177 212 -125.43 gain 212 177 -122.12 gain 177 213 -115.57 gain 213 177 -117.12 gain 177 214 -109.93 gain 214 177 -107.79 gain 177 215 -113.71 gain 215 177 -112.66 gain 177 216 -115.27 gain 216 177 -115.05 gain 177 217 -108.88 gain 217 177 -112.47 gain 177 218 -101.71 gain 218 177 -97.50 gain 177 219 -100.28 gain 219 177 -98.89 gain 177 220 -91.78 gain 220 177 -86.73 gain 177 221 -96.07 gain 221 177 -95.53 gain 177 222 -103.60 gain 222 177 -104.43 gain 177 223 -94.24 gain 223 177 -97.07 gain 177 224 -97.95 gain 224 177 -101.29 gain 178 179 -84.35 gain 179 178 -85.38 gain 178 180 -118.61 gain 180 178 -115.43 gain 178 181 -118.65 gain 181 178 -119.92 gain 178 182 -118.54 gain 182 178 -116.11 gain 178 183 -115.80 gain 183 178 -114.67 gain 178 184 -116.09 gain 184 178 -117.02 gain 178 185 -120.68 gain 185 178 -117.03 gain 178 186 -113.47 gain 186 178 -108.81 gain 178 187 -107.89 gain 187 178 -107.33 gain 178 188 -102.39 gain 188 178 -104.58 gain 178 189 -100.77 gain 189 178 -102.36 gain 178 190 -104.73 gain 190 178 -101.98 gain 178 191 -94.32 gain 191 178 -94.62 gain 178 192 -90.12 gain 192 178 -87.73 gain 178 193 -82.80 gain 193 178 -84.38 gain 178 194 -93.51 gain 194 178 -94.66 gain 178 195 -124.43 gain 195 178 -123.78 gain 178 196 -115.82 gain 196 178 -114.19 gain 178 197 -125.76 gain 197 178 -126.80 gain 178 198 -118.77 gain 198 178 -123.74 gain 178 199 -114.96 gain 199 178 -111.51 gain 178 200 -114.34 gain 200 178 -107.65 gain 178 201 -104.66 gain 201 178 -101.79 gain 178 202 -107.48 gain 202 178 -106.14 gain 178 203 -105.84 gain 203 178 -101.13 gain 178 204 -102.31 gain 204 178 -104.68 gain 178 205 -105.31 gain 205 178 -105.75 gain 178 206 -109.94 gain 206 178 -108.35 gain 178 207 -100.01 gain 207 178 -99.18 gain 178 208 -91.30 gain 208 178 -90.64 gain 178 209 -92.86 gain 209 178 -88.21 gain 178 210 -118.87 gain 210 178 -120.80 gain 178 211 -114.87 gain 211 178 -113.06 gain 178 212 -115.30 gain 212 178 -111.04 gain 178 213 -120.22 gain 213 178 -120.82 gain 178 214 -111.78 gain 214 178 -108.68 gain 178 215 -119.67 gain 215 178 -117.66 gain 178 216 -111.76 gain 216 178 -110.58 gain 178 217 -112.77 gain 217 178 -115.41 gain 178 218 -112.91 gain 218 178 -107.74 gain 178 219 -104.76 gain 219 178 -102.41 gain 178 220 -104.84 gain 220 178 -98.85 gain 178 221 -108.09 gain 221 178 -106.60 gain 178 222 -104.48 gain 222 178 -104.36 gain 178 223 -102.67 gain 223 178 -104.56 gain 178 224 -95.77 gain 224 178 -98.16 gain 179 180 -122.90 gain 180 179 -118.70 gain 179 181 -119.16 gain 181 179 -119.40 gain 179 182 -119.65 gain 182 179 -116.19 gain 179 183 -120.71 gain 183 179 -118.55 gain 179 184 -117.21 gain 184 179 -117.10 gain 179 185 -113.28 gain 185 179 -108.60 gain 179 186 -119.19 gain 186 179 -113.51 gain 179 187 -114.03 gain 187 179 -112.44 gain 179 188 -109.98 gain 188 179 -111.15 gain 179 189 -113.09 gain 189 179 -113.65 gain 179 190 -110.11 gain 190 179 -106.33 gain 179 191 -102.85 gain 191 179 -102.11 gain 179 192 -97.55 gain 192 179 -94.13 gain 179 193 -89.28 gain 193 179 -89.84 gain 179 194 -82.70 gain 194 179 -82.83 gain 179 195 -124.17 gain 195 179 -122.49 gain 179 196 -117.41 gain 196 179 -114.75 gain 179 197 -127.01 gain 197 179 -127.02 gain 179 198 -120.15 gain 198 179 -124.10 gain 179 199 -116.09 gain 199 179 -111.61 gain 179 200 -110.60 gain 200 179 -102.89 gain 179 201 -117.66 gain 201 179 -113.77 gain 179 202 -109.61 gain 202 179 -107.24 gain 179 203 -108.57 gain 203 179 -102.83 gain 179 204 -107.81 gain 204 179 -109.15 gain 179 205 -107.94 gain 205 179 -107.34 gain 179 206 -105.58 gain 206 179 -102.96 gain 179 207 -97.79 gain 207 179 -95.94 gain 179 208 -97.22 gain 208 179 -95.53 gain 179 209 -100.58 gain 209 179 -94.90 gain 179 210 -126.07 gain 210 179 -126.98 gain 179 211 -121.00 gain 211 179 -118.16 gain 179 212 -112.56 gain 212 179 -107.27 gain 179 213 -120.02 gain 213 179 -119.60 gain 179 214 -127.35 gain 214 179 -123.23 gain 179 215 -120.85 gain 215 179 -117.81 gain 179 216 -122.05 gain 216 179 -119.84 gain 179 217 -107.49 gain 217 179 -109.10 gain 179 218 -115.05 gain 218 179 -108.86 gain 179 219 -114.25 gain 219 179 -110.88 gain 179 220 -106.37 gain 220 179 -99.34 gain 179 221 -107.09 gain 221 179 -104.57 gain 179 222 -107.78 gain 222 179 -106.63 gain 179 223 -100.81 gain 223 179 -101.67 gain 179 224 -97.65 gain 224 179 -99.01 gain 180 181 -88.21 gain 181 180 -92.65 gain 180 182 -89.59 gain 182 180 -90.33 gain 180 183 -99.91 gain 183 180 -101.95 gain 180 184 -112.85 gain 184 180 -116.94 gain 180 185 -101.21 gain 185 180 -100.73 gain 180 186 -108.58 gain 186 180 -107.10 gain 180 187 -111.08 gain 187 180 -113.68 gain 180 188 -108.50 gain 188 180 -113.86 gain 180 189 -112.24 gain 189 180 -117.00 gain 180 190 -115.14 gain 190 180 -115.56 gain 180 191 -112.80 gain 191 180 -116.26 gain 180 192 -110.09 gain 192 180 -110.87 gain 180 193 -113.64 gain 193 180 -118.39 gain 180 194 -115.48 gain 194 180 -119.81 gain 180 195 -82.65 gain 195 180 -85.16 gain 180 196 -84.14 gain 196 180 -85.68 gain 180 197 -88.75 gain 197 180 -92.96 gain 180 198 -96.66 gain 198 180 -104.81 gain 180 199 -109.03 gain 199 180 -108.74 gain 180 200 -102.53 gain 200 180 -99.02 gain 180 201 -108.00 gain 201 180 -108.30 gain 180 202 -112.18 gain 202 180 -114.01 gain 180 203 -103.65 gain 203 180 -102.10 gain 180 204 -116.51 gain 204 180 -122.05 gain 180 205 -110.29 gain 205 180 -113.89 gain 180 206 -113.97 gain 206 180 -115.55 gain 180 207 -112.06 gain 207 180 -114.40 gain 180 208 -121.48 gain 208 180 -124.00 gain 180 209 -121.53 gain 209 180 -120.05 gain 180 210 -88.06 gain 210 180 -93.16 gain 180 211 -96.10 gain 211 180 -97.47 gain 180 212 -102.34 gain 212 180 -101.25 gain 180 213 -100.01 gain 213 180 -103.79 gain 180 214 -110.16 gain 214 180 -110.24 gain 180 215 -107.91 gain 215 180 -109.08 gain 180 216 -107.14 gain 216 180 -109.14 gain 180 217 -106.55 gain 217 180 -112.36 gain 180 218 -109.76 gain 218 180 -107.76 gain 180 219 -104.29 gain 219 180 -105.11 gain 180 220 -111.12 gain 220 180 -108.30 gain 180 221 -118.12 gain 221 180 -119.79 gain 180 222 -112.39 gain 222 180 -115.44 gain 180 223 -113.87 gain 223 180 -118.93 gain 180 224 -112.25 gain 224 180 -117.81 gain 181 182 -89.75 gain 182 181 -86.05 gain 181 183 -93.63 gain 183 181 -91.23 gain 181 184 -96.38 gain 184 181 -96.04 gain 181 185 -108.63 gain 185 181 -103.71 gain 181 186 -107.83 gain 186 181 -101.91 gain 181 187 -107.53 gain 187 181 -105.70 gain 181 188 -120.06 gain 188 181 -120.98 gain 181 189 -118.20 gain 189 181 -118.52 gain 181 190 -121.09 gain 190 181 -117.07 gain 181 191 -122.22 gain 191 181 -121.24 gain 181 192 -121.22 gain 192 181 -117.56 gain 181 193 -120.91 gain 193 181 -121.22 gain 181 194 -122.76 gain 194 181 -122.65 gain 181 195 -88.99 gain 195 181 -87.06 gain 181 196 -87.15 gain 196 181 -84.25 gain 181 197 -97.61 gain 197 181 -97.38 gain 181 198 -92.09 gain 198 181 -95.79 gain 181 199 -104.59 gain 199 181 -99.86 gain 181 200 -107.67 gain 200 181 -99.71 gain 181 201 -102.85 gain 201 181 -98.71 gain 181 202 -105.11 gain 202 181 -102.49 gain 181 203 -111.37 gain 203 181 -105.38 gain 181 204 -116.19 gain 204 181 -117.29 gain 181 205 -108.09 gain 205 181 -107.25 gain 181 206 -119.43 gain 206 181 -116.57 gain 181 207 -108.79 gain 207 181 -106.70 gain 181 208 -123.25 gain 208 181 -121.33 gain 181 209 -127.98 gain 209 181 -122.06 gain 181 210 -103.38 gain 210 181 -104.04 gain 181 211 -94.03 gain 211 181 -90.95 gain 181 212 -95.31 gain 212 181 -89.78 gain 181 213 -99.16 gain 213 181 -98.50 gain 181 214 -106.01 gain 214 181 -101.65 gain 181 215 -95.63 gain 215 181 -92.36 gain 181 216 -114.87 gain 216 181 -112.43 gain 181 217 -109.11 gain 217 181 -110.49 gain 181 218 -115.31 gain 218 181 -108.87 gain 181 219 -111.70 gain 219 181 -108.08 gain 181 220 -110.63 gain 220 181 -103.37 gain 181 221 -111.23 gain 221 181 -108.46 gain 181 222 -115.69 gain 222 181 -114.29 gain 181 223 -109.31 gain 223 181 -109.93 gain 181 224 -122.80 gain 224 181 -123.92 gain 182 183 -83.24 gain 183 182 -84.54 gain 182 184 -94.37 gain 184 182 -97.72 gain 182 185 -97.99 gain 185 182 -96.76 gain 182 186 -100.56 gain 186 182 -98.33 gain 182 187 -94.50 gain 187 182 -96.37 gain 182 188 -107.83 gain 188 182 -112.46 gain 182 189 -108.92 gain 189 182 -112.93 gain 182 190 -105.90 gain 190 182 -105.58 gain 182 191 -112.20 gain 191 182 -114.92 gain 182 192 -112.58 gain 192 182 -112.62 gain 182 193 -116.52 gain 193 182 -120.53 gain 182 194 -116.11 gain 194 182 -119.69 gain 182 195 -97.22 gain 195 182 -99.00 gain 182 196 -84.13 gain 196 182 -84.92 gain 182 197 -84.77 gain 197 182 -88.25 gain 182 198 -84.06 gain 198 182 -91.46 gain 182 199 -96.66 gain 199 182 -95.63 gain 182 200 -92.21 gain 200 182 -87.95 gain 182 201 -106.63 gain 201 182 -106.19 gain 182 202 -98.26 gain 202 182 -99.34 gain 182 203 -109.91 gain 203 182 -107.63 gain 182 204 -112.43 gain 204 182 -117.23 gain 182 205 -110.50 gain 205 182 -113.36 gain 182 206 -109.39 gain 206 182 -110.23 gain 182 207 -111.69 gain 207 182 -113.29 gain 182 208 -122.29 gain 208 182 -124.07 gain 182 209 -119.63 gain 209 182 -117.41 gain 182 210 -101.51 gain 210 182 -105.87 gain 182 211 -95.76 gain 211 182 -96.38 gain 182 212 -98.89 gain 212 182 -97.06 gain 182 213 -99.18 gain 213 182 -102.21 gain 182 214 -94.10 gain 214 182 -93.44 gain 182 215 -107.54 gain 215 182 -107.96 gain 182 216 -100.37 gain 216 182 -101.62 gain 182 217 -100.87 gain 217 182 -105.94 gain 182 218 -111.21 gain 218 182 -108.47 gain 182 219 -106.20 gain 219 182 -106.28 gain 182 220 -115.39 gain 220 182 -111.82 gain 182 221 -114.34 gain 221 182 -115.28 gain 182 222 -116.96 gain 222 182 -119.27 gain 182 223 -113.36 gain 223 182 -117.67 gain 182 224 -121.83 gain 224 182 -126.64 gain 183 184 -81.70 gain 184 183 -83.75 gain 183 185 -93.73 gain 185 183 -91.20 gain 183 186 -95.45 gain 186 183 -91.92 gain 183 187 -102.84 gain 187 183 -103.40 gain 183 188 -111.72 gain 188 183 -115.05 gain 183 189 -112.81 gain 189 183 -115.53 gain 183 190 -114.50 gain 190 183 -112.88 gain 183 191 -112.18 gain 191 183 -113.60 gain 183 192 -117.52 gain 192 183 -116.26 gain 183 193 -120.38 gain 193 183 -123.10 gain 183 194 -119.44 gain 194 183 -121.73 gain 183 195 -100.39 gain 195 183 -100.86 gain 183 196 -97.52 gain 196 183 -97.02 gain 183 197 -84.90 gain 197 183 -87.07 gain 183 198 -89.08 gain 198 183 -95.19 gain 183 199 -92.04 gain 199 183 -89.72 gain 183 200 -96.17 gain 200 183 -90.61 gain 183 201 -102.61 gain 201 183 -100.87 gain 183 202 -105.15 gain 202 183 -104.94 gain 183 203 -105.04 gain 203 183 -101.45 gain 183 204 -110.69 gain 204 183 -114.19 gain 183 205 -113.05 gain 205 183 -114.62 gain 183 206 -105.23 gain 206 183 -104.77 gain 183 207 -112.66 gain 207 183 -112.96 gain 183 208 -111.79 gain 208 183 -112.27 gain 183 209 -119.87 gain 209 183 -116.35 gain 183 210 -99.48 gain 210 183 -102.55 gain 183 211 -97.22 gain 211 183 -96.55 gain 183 212 -97.71 gain 212 183 -94.58 gain 183 213 -90.87 gain 213 183 -92.61 gain 183 214 -95.01 gain 214 183 -93.05 gain 183 215 -96.38 gain 215 183 -95.50 gain 183 216 -103.65 gain 216 183 -103.60 gain 183 217 -98.83 gain 217 183 -102.60 gain 183 218 -111.07 gain 218 183 -107.03 gain 183 219 -111.23 gain 219 183 -110.01 gain 183 220 -114.29 gain 220 183 -109.43 gain 183 221 -112.79 gain 221 183 -112.43 gain 183 222 -111.87 gain 222 183 -112.87 gain 183 223 -110.46 gain 223 183 -113.48 gain 183 224 -117.54 gain 224 183 -121.06 gain 184 185 -97.65 gain 185 184 -93.08 gain 184 186 -102.41 gain 186 184 -96.83 gain 184 187 -99.10 gain 187 184 -97.61 gain 184 188 -100.47 gain 188 184 -101.74 gain 184 189 -108.53 gain 189 184 -109.20 gain 184 190 -107.35 gain 190 184 -103.69 gain 184 191 -110.02 gain 191 184 -109.39 gain 184 192 -111.00 gain 192 184 -107.69 gain 184 193 -116.40 gain 193 184 -117.06 gain 184 194 -116.12 gain 194 184 -116.35 gain 184 195 -108.67 gain 195 184 -107.09 gain 184 196 -103.93 gain 196 184 -101.38 gain 184 197 -98.82 gain 197 184 -98.94 gain 184 198 -91.59 gain 198 184 -95.64 gain 184 199 -90.91 gain 199 184 -86.53 gain 184 200 -91.55 gain 200 184 -83.94 gain 184 201 -94.95 gain 201 184 -91.15 gain 184 202 -102.79 gain 202 184 -100.53 gain 184 203 -108.91 gain 203 184 -103.27 gain 184 204 -111.93 gain 204 184 -113.38 gain 184 205 -112.76 gain 205 184 -112.27 gain 184 206 -119.97 gain 206 184 -117.46 gain 184 207 -111.37 gain 207 184 -109.62 gain 184 208 -114.01 gain 208 184 -112.44 gain 184 209 -121.29 gain 209 184 -115.71 gain 184 210 -111.06 gain 210 184 -112.07 gain 184 211 -111.27 gain 211 184 -108.54 gain 184 212 -104.72 gain 212 184 -99.54 gain 184 213 -92.33 gain 213 184 -92.02 gain 184 214 -99.39 gain 214 184 -95.37 gain 184 215 -95.95 gain 215 184 -93.02 gain 184 216 -106.70 gain 216 184 -104.60 gain 184 217 -103.08 gain 217 184 -104.80 gain 184 218 -103.19 gain 218 184 -97.10 gain 184 219 -97.87 gain 219 184 -94.60 gain 184 220 -108.26 gain 220 184 -101.35 gain 184 221 -111.06 gain 221 184 -108.65 gain 184 222 -113.36 gain 222 184 -112.32 gain 184 223 -117.73 gain 223 184 -118.69 gain 184 224 -117.32 gain 224 184 -118.78 gain 185 186 -87.79 gain 186 185 -86.79 gain 185 187 -86.46 gain 187 185 -89.55 gain 185 188 -97.48 gain 188 185 -103.33 gain 185 189 -106.90 gain 189 185 -112.14 gain 185 190 -102.02 gain 190 185 -102.93 gain 185 191 -106.66 gain 191 185 -110.60 gain 185 192 -106.18 gain 192 185 -107.44 gain 185 193 -105.00 gain 193 185 -110.24 gain 185 194 -123.43 gain 194 185 -128.24 gain 185 195 -100.65 gain 195 185 -103.64 gain 185 196 -97.37 gain 196 185 -99.39 gain 185 197 -103.15 gain 197 185 -107.85 gain 185 198 -88.59 gain 198 185 -97.21 gain 185 199 -84.24 gain 199 185 -84.43 gain 185 200 -81.54 gain 200 185 -78.51 gain 185 201 -87.00 gain 201 185 -87.78 gain 185 202 -87.55 gain 202 185 -89.86 gain 185 203 -93.56 gain 203 185 -92.49 gain 185 204 -97.76 gain 204 185 -103.78 gain 185 205 -105.69 gain 205 185 -109.78 gain 185 206 -109.07 gain 206 185 -111.13 gain 185 207 -108.85 gain 207 185 -111.68 gain 185 208 -110.73 gain 208 185 -113.73 gain 185 209 -117.23 gain 209 185 -116.23 gain 185 210 -104.84 gain 210 185 -110.42 gain 185 211 -105.17 gain 211 185 -107.01 gain 185 212 -107.15 gain 212 185 -106.54 gain 185 213 -98.34 gain 213 185 -102.60 gain 185 214 -95.26 gain 214 185 -95.82 gain 185 215 -87.61 gain 215 185 -89.26 gain 185 216 -92.90 gain 216 185 -95.38 gain 185 217 -97.96 gain 217 185 -104.26 gain 185 218 -99.99 gain 218 185 -98.47 gain 185 219 -106.85 gain 219 185 -108.15 gain 185 220 -106.50 gain 220 185 -104.15 gain 185 221 -109.61 gain 221 185 -111.77 gain 185 222 -104.18 gain 222 185 -107.70 gain 185 223 -115.70 gain 223 185 -121.24 gain 185 224 -107.52 gain 224 185 -113.55 gain 186 187 -86.52 gain 187 186 -90.61 gain 186 188 -93.56 gain 188 186 -100.41 gain 186 189 -90.04 gain 189 186 -96.29 gain 186 190 -93.51 gain 190 186 -95.42 gain 186 191 -102.78 gain 191 186 -107.73 gain 186 192 -106.62 gain 192 186 -108.88 gain 186 193 -102.60 gain 193 186 -108.84 gain 186 194 -109.03 gain 194 186 -114.84 gain 186 195 -105.39 gain 195 186 -109.39 gain 186 196 -98.39 gain 196 186 -101.41 gain 186 197 -112.20 gain 197 186 -117.89 gain 186 198 -94.59 gain 198 186 -104.22 gain 186 199 -90.72 gain 199 186 -91.92 gain 186 200 -87.93 gain 200 186 -85.90 gain 186 201 -76.23 gain 201 186 -78.02 gain 186 202 -83.67 gain 202 186 -86.98 gain 186 203 -96.86 gain 203 186 -96.80 gain 186 204 -98.37 gain 204 186 -105.39 gain 186 205 -106.32 gain 205 186 -111.41 gain 186 206 -100.76 gain 206 186 -103.83 gain 186 207 -106.86 gain 207 186 -110.69 gain 186 208 -102.94 gain 208 186 -106.94 gain 186 209 -115.14 gain 209 186 -115.14 gain 186 210 -102.98 gain 210 186 -109.57 gain 186 211 -104.32 gain 211 186 -107.17 gain 186 212 -103.22 gain 212 186 -103.62 gain 186 213 -98.36 gain 213 186 -103.62 gain 186 214 -92.90 gain 214 186 -94.46 gain 186 215 -91.80 gain 215 186 -94.45 gain 186 216 -86.66 gain 216 186 -90.14 gain 186 217 -92.00 gain 217 186 -99.30 gain 186 218 -91.61 gain 218 186 -91.10 gain 186 219 -98.66 gain 219 186 -100.96 gain 186 220 -104.71 gain 220 186 -103.36 gain 186 221 -105.74 gain 221 186 -108.90 gain 186 222 -106.98 gain 222 186 -111.51 gain 186 223 -102.31 gain 223 186 -108.85 gain 186 224 -104.38 gain 224 186 -111.42 gain 187 188 -84.89 gain 188 187 -87.65 gain 187 189 -86.56 gain 189 187 -88.71 gain 187 190 -100.15 gain 190 187 -97.97 gain 187 191 -102.92 gain 191 187 -103.77 gain 187 192 -105.51 gain 192 187 -103.69 gain 187 193 -107.73 gain 193 187 -109.88 gain 187 194 -114.25 gain 194 187 -115.97 gain 187 195 -116.34 gain 195 187 -116.25 gain 187 196 -110.51 gain 196 187 -109.45 gain 187 197 -112.89 gain 197 187 -114.49 gain 187 198 -97.20 gain 198 187 -102.74 gain 187 199 -101.07 gain 199 187 -98.18 gain 187 200 -95.48 gain 200 187 -89.35 gain 187 201 -92.00 gain 201 187 -89.69 gain 187 202 -77.03 gain 202 187 -76.25 gain 187 203 -93.83 gain 203 187 -89.68 gain 187 204 -102.99 gain 204 187 -105.92 gain 187 205 -98.61 gain 205 187 -99.61 gain 187 206 -103.25 gain 206 187 -102.22 gain 187 207 -100.13 gain 207 187 -99.87 gain 187 208 -106.22 gain 208 187 -106.13 gain 187 209 -104.73 gain 209 187 -100.64 gain 187 210 -112.44 gain 210 187 -114.94 gain 187 211 -115.88 gain 211 187 -114.64 gain 187 212 -105.65 gain 212 187 -101.96 gain 187 213 -100.97 gain 213 187 -102.14 gain 187 214 -101.41 gain 214 187 -98.88 gain 187 215 -88.52 gain 215 187 -87.08 gain 187 216 -100.78 gain 216 187 -100.17 gain 187 217 -89.35 gain 217 187 -92.56 gain 187 218 -106.27 gain 218 187 -101.67 gain 187 219 -101.57 gain 219 187 -99.78 gain 187 220 -107.21 gain 220 187 -101.78 gain 187 221 -105.37 gain 221 187 -104.45 gain 187 222 -109.98 gain 222 187 -110.42 gain 187 223 -108.21 gain 223 187 -110.66 gain 187 224 -110.90 gain 224 187 -113.84 gain 188 189 -87.27 gain 189 188 -86.67 gain 188 190 -97.91 gain 190 188 -92.97 gain 188 191 -112.03 gain 191 188 -110.12 gain 188 192 -110.24 gain 192 188 -105.65 gain 188 193 -113.48 gain 193 188 -112.87 gain 188 194 -110.14 gain 194 188 -109.10 gain 188 195 -114.33 gain 195 188 -111.48 gain 188 196 -113.70 gain 196 188 -109.88 gain 188 197 -110.64 gain 197 188 -109.48 gain 188 198 -109.10 gain 198 188 -111.88 gain 188 199 -104.59 gain 199 188 -98.94 gain 188 200 -105.93 gain 200 188 -97.05 gain 188 201 -90.99 gain 201 188 -85.92 gain 188 202 -95.48 gain 202 188 -91.94 gain 188 203 -87.74 gain 203 188 -80.83 gain 188 204 -87.90 gain 204 188 -88.08 gain 188 205 -95.39 gain 205 188 -93.63 gain 188 206 -101.04 gain 206 188 -97.25 gain 188 207 -102.80 gain 207 188 -99.78 gain 188 208 -113.15 gain 208 188 -110.30 gain 188 209 -108.71 gain 209 188 -101.86 gain 188 210 -116.01 gain 210 188 -115.75 gain 188 211 -110.51 gain 211 188 -106.51 gain 188 212 -117.07 gain 212 188 -110.61 gain 188 213 -113.38 gain 213 188 -111.80 gain 188 214 -110.11 gain 214 188 -104.82 gain 188 215 -100.48 gain 215 188 -96.29 gain 188 216 -104.06 gain 216 188 -100.69 gain 188 217 -99.18 gain 217 188 -99.63 gain 188 218 -98.50 gain 218 188 -91.14 gain 188 219 -94.78 gain 219 188 -90.24 gain 188 220 -103.65 gain 220 188 -95.46 gain 188 221 -109.04 gain 221 188 -105.35 gain 188 222 -104.51 gain 222 188 -102.19 gain 188 223 -102.02 gain 223 188 -101.71 gain 188 224 -116.95 gain 224 188 -117.14 gain 189 190 -90.28 gain 190 189 -85.94 gain 189 191 -98.81 gain 191 189 -97.51 gain 189 192 -98.26 gain 192 189 -94.28 gain 189 193 -109.15 gain 193 189 -109.14 gain 189 194 -102.66 gain 194 189 -102.23 gain 189 195 -118.31 gain 195 189 -116.07 gain 189 196 -113.02 gain 196 189 -109.80 gain 189 197 -115.65 gain 197 189 -115.10 gain 189 198 -108.67 gain 198 189 -112.05 gain 189 199 -109.92 gain 199 189 -104.87 gain 189 200 -107.95 gain 200 189 -99.67 gain 189 201 -113.51 gain 201 189 -109.05 gain 189 202 -97.39 gain 202 189 -94.46 gain 189 203 -103.27 gain 203 189 -96.96 gain 189 204 -84.69 gain 204 189 -85.47 gain 189 205 -95.27 gain 205 189 -94.12 gain 189 206 -98.68 gain 206 189 -95.50 gain 189 207 -98.73 gain 207 189 -96.31 gain 189 208 -98.98 gain 208 189 -96.73 gain 189 209 -105.28 gain 209 189 -99.03 gain 189 210 -123.01 gain 210 189 -123.35 gain 189 211 -116.38 gain 211 189 -112.98 gain 189 212 -112.88 gain 212 189 -107.03 gain 189 213 -108.71 gain 213 189 -107.73 gain 189 214 -103.75 gain 214 189 -99.07 gain 189 215 -112.75 gain 215 189 -109.15 gain 189 216 -107.54 gain 216 189 -104.78 gain 189 217 -100.97 gain 217 189 -102.02 gain 189 218 -101.95 gain 218 189 -95.19 gain 189 219 -96.02 gain 219 189 -92.08 gain 189 220 -99.54 gain 220 189 -91.95 gain 189 221 -103.30 gain 221 189 -100.22 gain 189 222 -100.54 gain 222 189 -98.83 gain 189 223 -99.66 gain 223 189 -99.96 gain 189 224 -120.97 gain 224 189 -121.76 gain 190 191 -82.01 gain 191 190 -85.05 gain 190 192 -92.49 gain 192 190 -92.85 gain 190 193 -97.34 gain 193 190 -101.67 gain 190 194 -104.04 gain 194 190 -107.94 gain 190 195 -110.74 gain 195 190 -112.82 gain 190 196 -111.54 gain 196 190 -112.65 gain 190 197 -112.29 gain 197 190 -116.07 gain 190 198 -112.39 gain 198 190 -120.11 gain 190 199 -113.92 gain 199 190 -113.21 gain 190 200 -104.99 gain 200 190 -101.05 gain 190 201 -99.49 gain 201 190 -99.37 gain 190 202 -106.66 gain 202 190 -108.06 gain 190 203 -94.06 gain 203 190 -92.09 gain 190 204 -94.67 gain 204 190 -99.78 gain 190 205 -84.78 gain 205 190 -87.96 gain 190 206 -87.45 gain 206 190 -88.61 gain 190 207 -95.55 gain 207 190 -97.47 gain 190 208 -99.35 gain 208 190 -101.44 gain 190 209 -100.64 gain 209 190 -98.73 gain 190 210 -111.85 gain 210 190 -116.53 gain 190 211 -104.77 gain 211 190 -105.71 gain 190 212 -108.68 gain 212 190 -107.17 gain 190 213 -112.84 gain 213 190 -116.19 gain 190 214 -106.81 gain 214 190 -106.46 gain 190 215 -106.71 gain 215 190 -107.45 gain 190 216 -101.29 gain 216 190 -102.86 gain 190 217 -110.27 gain 217 190 -115.66 gain 190 218 -108.05 gain 218 190 -105.62 gain 190 219 -94.62 gain 219 190 -95.02 gain 190 220 -91.19 gain 220 190 -87.94 gain 190 221 -96.65 gain 221 190 -97.91 gain 190 222 -93.48 gain 222 190 -96.10 gain 190 223 -102.82 gain 223 190 -107.44 gain 190 224 -105.43 gain 224 190 -110.56 gain 191 192 -80.31 gain 192 191 -77.62 gain 191 193 -99.01 gain 193 191 -100.30 gain 191 194 -98.31 gain 194 191 -99.18 gain 191 195 -122.18 gain 195 191 -121.23 gain 191 196 -109.03 gain 196 191 -107.11 gain 191 197 -115.31 gain 197 191 -116.06 gain 191 198 -115.55 gain 198 191 -120.23 gain 191 199 -116.40 gain 199 191 -112.65 gain 191 200 -115.18 gain 200 191 -108.20 gain 191 201 -106.45 gain 201 191 -103.29 gain 191 202 -104.56 gain 202 191 -102.93 gain 191 203 -103.11 gain 203 191 -98.11 gain 191 204 -92.62 gain 204 191 -94.69 gain 191 205 -88.93 gain 205 191 -89.07 gain 191 206 -92.55 gain 206 191 -90.66 gain 191 207 -91.44 gain 207 191 -90.32 gain 191 208 -96.37 gain 208 191 -95.42 gain 191 209 -103.20 gain 209 191 -98.25 gain 191 210 -123.00 gain 210 191 -124.64 gain 191 211 -122.92 gain 211 191 -120.82 gain 191 212 -113.09 gain 212 191 -108.54 gain 191 213 -115.15 gain 213 191 -115.47 gain 191 214 -114.42 gain 214 191 -111.04 gain 191 215 -115.39 gain 215 191 -113.09 gain 191 216 -112.84 gain 216 191 -111.37 gain 191 217 -108.69 gain 217 191 -111.04 gain 191 218 -109.78 gain 218 191 -104.32 gain 191 219 -98.54 gain 219 191 -95.90 gain 191 220 -97.22 gain 220 191 -90.93 gain 191 221 -94.55 gain 221 191 -92.76 gain 191 222 -97.56 gain 222 191 -97.15 gain 191 223 -96.32 gain 223 191 -97.91 gain 191 224 -99.85 gain 224 191 -101.94 gain 192 193 -81.15 gain 193 192 -85.13 gain 192 194 -97.47 gain 194 192 -101.01 gain 192 195 -116.83 gain 195 192 -118.57 gain 192 196 -113.38 gain 196 192 -114.14 gain 192 197 -112.72 gain 197 192 -116.15 gain 192 198 -114.41 gain 198 192 -121.78 gain 192 199 -108.66 gain 199 192 -107.60 gain 192 200 -106.07 gain 200 192 -101.78 gain 192 201 -105.85 gain 201 192 -105.37 gain 192 202 -107.06 gain 202 192 -108.11 gain 192 203 -97.63 gain 203 192 -95.30 gain 192 204 -94.57 gain 204 192 -99.33 gain 192 205 -87.33 gain 205 192 -90.16 gain 192 206 -89.03 gain 206 192 -89.83 gain 192 207 -78.13 gain 207 192 -79.70 gain 192 208 -85.86 gain 208 192 -87.59 gain 192 209 -98.97 gain 209 192 -96.70 gain 192 210 -109.92 gain 210 192 -114.24 gain 192 211 -114.65 gain 211 192 -115.23 gain 192 212 -110.36 gain 212 192 -108.49 gain 192 213 -111.29 gain 213 192 -114.29 gain 192 214 -112.58 gain 214 192 -111.87 gain 192 215 -108.37 gain 215 192 -108.75 gain 192 216 -104.46 gain 216 192 -105.67 gain 192 217 -111.01 gain 217 192 -116.05 gain 192 218 -107.77 gain 218 192 -104.99 gain 192 219 -102.78 gain 219 192 -102.82 gain 192 220 -101.11 gain 220 192 -97.51 gain 192 221 -92.39 gain 221 192 -93.28 gain 192 222 -89.48 gain 222 192 -91.75 gain 192 223 -86.43 gain 223 192 -90.70 gain 192 224 -102.30 gain 224 192 -107.07 gain 193 194 -87.90 gain 194 193 -87.47 gain 193 195 -120.21 gain 195 193 -117.97 gain 193 196 -123.99 gain 196 193 -120.77 gain 193 197 -115.01 gain 197 193 -114.46 gain 193 198 -118.15 gain 198 193 -121.54 gain 193 199 -120.75 gain 199 193 -115.71 gain 193 200 -110.57 gain 200 193 -102.30 gain 193 201 -109.82 gain 201 193 -105.37 gain 193 202 -112.12 gain 202 193 -109.19 gain 193 203 -108.29 gain 203 193 -101.99 gain 193 204 -112.16 gain 204 193 -112.94 gain 193 205 -102.11 gain 205 193 -100.96 gain 193 206 -101.63 gain 206 193 -98.46 gain 193 207 -92.42 gain 207 193 -90.01 gain 193 208 -90.23 gain 208 193 -87.99 gain 193 209 -88.66 gain 209 193 -82.43 gain 193 210 -122.80 gain 210 193 -123.15 gain 193 211 -118.07 gain 211 193 -114.68 gain 193 212 -116.31 gain 212 193 -110.47 gain 193 213 -121.47 gain 213 193 -120.49 gain 193 214 -114.62 gain 214 193 -109.94 gain 193 215 -111.94 gain 215 193 -108.35 gain 193 216 -117.31 gain 216 193 -114.55 gain 193 217 -111.74 gain 217 193 -112.79 gain 193 218 -108.23 gain 218 193 -101.48 gain 193 219 -105.55 gain 219 193 -101.61 gain 193 220 -102.36 gain 220 193 -94.78 gain 193 221 -108.06 gain 221 193 -104.99 gain 193 222 -100.95 gain 222 193 -99.24 gain 193 223 -96.70 gain 223 193 -97.00 gain 193 224 -105.73 gain 224 193 -106.53 gain 194 195 -123.23 gain 195 194 -121.42 gain 194 196 -121.79 gain 196 194 -119.01 gain 194 197 -115.36 gain 197 194 -115.25 gain 194 198 -120.86 gain 198 194 -124.68 gain 194 199 -123.74 gain 199 194 -119.13 gain 194 200 -114.42 gain 200 194 -106.57 gain 194 201 -119.15 gain 201 194 -115.13 gain 194 202 -113.92 gain 202 194 -111.42 gain 194 203 -112.66 gain 203 194 -106.79 gain 194 204 -101.51 gain 204 194 -102.72 gain 194 205 -106.21 gain 205 194 -105.49 gain 194 206 -106.41 gain 206 194 -103.67 gain 194 207 -94.31 gain 207 194 -92.33 gain 194 208 -95.95 gain 208 194 -94.14 gain 194 209 -87.36 gain 209 194 -81.56 gain 194 210 -130.06 gain 210 194 -130.84 gain 194 211 -123.06 gain 211 194 -120.09 gain 194 212 -119.66 gain 212 194 -114.24 gain 194 213 -113.33 gain 213 194 -112.78 gain 194 214 -113.95 gain 214 194 -109.70 gain 194 215 -121.61 gain 215 194 -118.45 gain 194 216 -116.38 gain 216 194 -114.04 gain 194 217 -108.02 gain 217 194 -109.51 gain 194 218 -109.45 gain 218 194 -103.13 gain 194 219 -103.03 gain 219 194 -99.52 gain 194 220 -108.16 gain 220 194 -101.01 gain 194 221 -110.27 gain 221 194 -107.62 gain 194 222 -102.38 gain 222 194 -101.10 gain 194 223 -99.50 gain 223 194 -100.23 gain 194 224 -100.98 gain 224 194 -102.20 gain 195 196 -91.70 gain 196 195 -90.72 gain 195 197 -89.26 gain 197 195 -90.96 gain 195 198 -108.61 gain 198 195 -114.24 gain 195 199 -105.76 gain 199 195 -102.96 gain 195 200 -107.65 gain 200 195 -101.61 gain 195 201 -114.05 gain 201 195 -111.83 gain 195 202 -115.25 gain 202 195 -114.56 gain 195 203 -103.49 gain 203 195 -99.43 gain 195 204 -120.11 gain 204 195 -123.13 gain 195 205 -116.69 gain 205 195 -117.78 gain 195 206 -106.68 gain 206 195 -105.75 gain 195 207 -109.34 gain 207 195 -109.17 gain 195 208 -116.82 gain 208 195 -116.82 gain 195 209 -109.65 gain 209 195 -105.65 gain 195 210 -88.86 gain 210 195 -91.44 gain 195 211 -89.65 gain 211 195 -88.50 gain 195 212 -102.25 gain 212 195 -98.64 gain 195 213 -103.83 gain 213 195 -105.09 gain 195 214 -98.84 gain 214 195 -96.40 gain 195 215 -103.61 gain 215 195 -102.26 gain 195 216 -110.70 gain 216 195 -110.18 gain 195 217 -113.68 gain 217 195 -116.98 gain 195 218 -115.46 gain 218 195 -110.95 gain 195 219 -117.20 gain 219 195 -115.51 gain 195 220 -111.79 gain 220 195 -106.44 gain 195 221 -123.98 gain 221 195 -123.15 gain 195 222 -118.69 gain 222 195 -119.22 gain 195 223 -115.08 gain 223 195 -117.62 gain 195 224 -117.44 gain 224 195 -120.48 gain 196 197 -85.83 gain 197 196 -88.50 gain 196 198 -99.18 gain 198 196 -105.79 gain 196 199 -103.68 gain 199 196 -101.85 gain 196 200 -104.66 gain 200 196 -99.61 gain 196 201 -107.79 gain 201 196 -106.55 gain 196 202 -104.83 gain 202 196 -105.11 gain 196 203 -111.99 gain 203 196 -108.91 gain 196 204 -112.10 gain 204 196 -116.10 gain 196 205 -110.79 gain 205 196 -112.85 gain 196 206 -117.49 gain 206 196 -117.53 gain 196 207 -114.51 gain 207 196 -115.31 gain 196 208 -117.91 gain 208 196 -118.89 gain 196 209 -116.90 gain 209 196 -113.87 gain 196 210 -87.35 gain 210 196 -90.91 gain 196 211 -88.02 gain 211 196 -87.85 gain 196 212 -91.01 gain 212 196 -88.38 gain 196 213 -93.85 gain 213 196 -96.09 gain 196 214 -99.27 gain 214 196 -97.81 gain 196 215 -105.32 gain 215 196 -104.95 gain 196 216 -102.57 gain 216 196 -103.03 gain 196 217 -110.46 gain 217 196 -114.73 gain 196 218 -111.38 gain 218 196 -107.85 gain 196 219 -107.99 gain 219 196 -107.27 gain 196 220 -110.83 gain 220 196 -106.46 gain 196 221 -110.99 gain 221 196 -111.13 gain 196 222 -113.46 gain 222 196 -114.96 gain 196 223 -117.05 gain 223 196 -120.57 gain 196 224 -115.52 gain 224 196 -119.54 gain 197 198 -87.98 gain 198 197 -91.91 gain 197 199 -96.78 gain 199 197 -92.28 gain 197 200 -103.63 gain 200 197 -95.90 gain 197 201 -111.64 gain 201 197 -107.73 gain 197 202 -114.69 gain 202 197 -112.30 gain 197 203 -112.23 gain 203 197 -106.48 gain 197 204 -109.14 gain 204 197 -110.47 gain 197 205 -111.62 gain 205 197 -111.01 gain 197 206 -119.56 gain 206 197 -116.93 gain 197 207 -115.93 gain 207 197 -114.06 gain 197 208 -114.60 gain 208 197 -112.90 gain 197 209 -112.84 gain 209 197 -107.14 gain 197 210 -99.24 gain 210 197 -100.13 gain 197 211 -94.77 gain 211 197 -91.92 gain 197 212 -82.01 gain 212 197 -76.71 gain 197 213 -91.66 gain 213 197 -91.22 gain 197 214 -92.25 gain 214 197 -88.12 gain 197 215 -97.50 gain 215 197 -94.46 gain 197 216 -107.75 gain 216 197 -105.54 gain 197 217 -108.65 gain 217 197 -110.25 gain 197 218 -107.16 gain 218 197 -100.95 gain 197 219 -116.14 gain 219 197 -112.75 gain 197 220 -111.69 gain 220 197 -104.65 gain 197 221 -109.34 gain 221 197 -106.81 gain 197 222 -120.04 gain 222 197 -118.87 gain 197 223 -121.04 gain 223 197 -121.89 gain 197 224 -122.00 gain 224 197 -123.35 gain 198 199 -93.71 gain 199 198 -85.27 gain 198 200 -97.75 gain 200 198 -86.08 gain 198 201 -105.19 gain 201 198 -97.35 gain 198 202 -105.93 gain 202 198 -99.61 gain 198 203 -113.01 gain 203 198 -103.32 gain 198 204 -112.79 gain 204 198 -110.19 gain 198 205 -110.00 gain 205 198 -105.46 gain 198 206 -111.02 gain 206 198 -104.46 gain 198 207 -120.34 gain 207 198 -114.54 gain 198 208 -127.43 gain 208 198 -121.79 gain 198 209 -133.07 gain 209 198 -123.44 gain 198 210 -97.79 gain 210 198 -94.75 gain 198 211 -110.04 gain 211 198 -103.25 gain 198 212 -104.83 gain 212 198 -95.59 gain 198 213 -92.88 gain 213 198 -88.51 gain 198 214 -99.59 gain 214 198 -91.52 gain 198 215 -100.89 gain 215 198 -93.91 gain 198 216 -107.58 gain 216 198 -101.43 gain 198 217 -112.78 gain 217 198 -110.45 gain 198 218 -107.93 gain 218 198 -97.79 gain 198 219 -116.73 gain 219 198 -109.40 gain 198 220 -116.60 gain 220 198 -105.63 gain 198 221 -120.78 gain 221 198 -114.32 gain 198 222 -123.97 gain 222 198 -118.87 gain 198 223 -113.74 gain 223 198 -110.65 gain 198 224 -120.02 gain 224 198 -117.43 gain 199 200 -87.49 gain 200 199 -84.26 gain 199 201 -94.39 gain 201 199 -94.97 gain 199 202 -96.04 gain 202 199 -98.15 gain 199 203 -97.38 gain 203 199 -96.12 gain 199 204 -101.84 gain 204 199 -107.67 gain 199 205 -110.17 gain 205 199 -114.06 gain 199 206 -113.80 gain 206 199 -115.67 gain 199 207 -105.70 gain 207 199 -108.33 gain 199 208 -115.66 gain 208 199 -118.46 gain 199 209 -117.24 gain 209 199 -116.05 gain 199 210 -96.68 gain 210 199 -102.07 gain 199 211 -90.09 gain 211 199 -91.74 gain 199 212 -89.44 gain 212 199 -88.64 gain 199 213 -89.49 gain 213 199 -93.56 gain 199 214 -71.85 gain 214 199 -72.22 gain 199 215 -88.22 gain 215 199 -89.67 gain 199 216 -95.32 gain 216 199 -97.60 gain 199 217 -96.02 gain 217 199 -102.12 gain 199 218 -105.90 gain 218 199 -104.19 gain 199 219 -105.47 gain 219 199 -106.58 gain 199 220 -106.77 gain 220 199 -104.23 gain 199 221 -108.12 gain 221 199 -110.09 gain 199 222 -116.52 gain 222 199 -119.85 gain 199 223 -100.56 gain 223 199 -105.90 gain 199 224 -110.50 gain 224 199 -116.34 gain 200 201 -78.94 gain 201 200 -82.76 gain 200 202 -92.45 gain 202 200 -97.79 gain 200 203 -95.25 gain 203 200 -97.22 gain 200 204 -98.96 gain 204 200 -108.01 gain 200 205 -97.69 gain 205 200 -104.81 gain 200 206 -105.26 gain 206 200 -110.36 gain 200 207 -101.91 gain 207 200 -107.77 gain 200 208 -105.90 gain 208 200 -111.93 gain 200 209 -109.88 gain 209 200 -111.92 gain 200 210 -95.82 gain 210 200 -104.44 gain 200 211 -93.78 gain 211 200 -98.66 gain 200 212 -89.80 gain 212 200 -92.23 gain 200 213 -85.92 gain 213 200 -93.22 gain 200 214 -82.26 gain 214 200 -85.85 gain 200 215 -81.12 gain 215 200 -85.80 gain 200 216 -86.23 gain 216 200 -91.74 gain 200 217 -83.00 gain 217 200 -92.34 gain 200 218 -86.79 gain 218 200 -88.31 gain 200 219 -95.66 gain 219 200 -100.00 gain 200 220 -103.66 gain 220 200 -104.35 gain 200 221 -96.35 gain 221 200 -101.55 gain 200 222 -103.51 gain 222 200 -110.08 gain 200 223 -106.65 gain 223 200 -115.22 gain 200 224 -117.74 gain 224 200 -126.81 gain 201 202 -83.68 gain 202 201 -85.21 gain 201 203 -99.12 gain 203 201 -97.28 gain 201 204 -99.93 gain 204 201 -105.17 gain 201 205 -97.64 gain 205 201 -100.95 gain 201 206 -105.16 gain 206 201 -106.44 gain 201 207 -101.15 gain 207 201 -103.20 gain 201 208 -112.78 gain 208 201 -114.99 gain 201 209 -113.36 gain 209 201 -111.58 gain 201 210 -113.20 gain 210 201 -118.01 gain 201 211 -109.19 gain 211 201 -110.25 gain 201 212 -95.12 gain 212 201 -93.73 gain 201 213 -101.10 gain 213 201 -104.58 gain 201 214 -98.23 gain 214 201 -98.01 gain 201 215 -89.65 gain 215 201 -90.52 gain 201 216 -80.26 gain 216 201 -81.95 gain 201 217 -81.69 gain 217 201 -87.20 gain 201 218 -90.18 gain 218 201 -87.89 gain 201 219 -94.56 gain 219 201 -95.08 gain 201 220 -111.62 gain 220 201 -108.49 gain 201 221 -114.15 gain 221 201 -115.52 gain 201 222 -108.91 gain 222 201 -111.66 gain 201 223 -106.60 gain 223 201 -111.36 gain 201 224 -108.29 gain 224 201 -113.55 gain 202 203 -82.63 gain 203 202 -79.25 gain 202 204 -94.37 gain 204 202 -98.09 gain 202 205 -95.72 gain 205 202 -97.50 gain 202 206 -104.59 gain 206 202 -104.34 gain 202 207 -106.84 gain 207 202 -107.35 gain 202 208 -107.31 gain 208 202 -107.99 gain 202 209 -107.25 gain 209 202 -103.94 gain 202 210 -110.79 gain 210 202 -114.06 gain 202 211 -111.00 gain 211 202 -110.53 gain 202 212 -106.83 gain 212 202 -103.91 gain 202 213 -102.20 gain 213 202 -104.15 gain 202 214 -105.98 gain 214 202 -104.23 gain 202 215 -89.10 gain 215 202 -88.43 gain 202 216 -95.51 gain 216 202 -95.67 gain 202 217 -84.59 gain 217 202 -88.58 gain 202 218 -93.60 gain 218 202 -89.78 gain 202 219 -90.00 gain 219 202 -88.99 gain 202 220 -99.11 gain 220 202 -94.46 gain 202 221 -102.64 gain 221 202 -102.49 gain 202 222 -106.40 gain 222 202 -107.62 gain 202 223 -114.99 gain 223 202 -118.22 gain 202 224 -111.10 gain 224 202 -114.82 gain 203 204 -81.62 gain 204 203 -88.70 gain 203 205 -85.94 gain 205 203 -91.09 gain 203 206 -85.66 gain 206 203 -88.79 gain 203 207 -97.59 gain 207 203 -101.48 gain 203 208 -106.66 gain 208 203 -110.72 gain 203 209 -104.41 gain 209 203 -104.47 gain 203 210 -102.05 gain 210 203 -108.69 gain 203 211 -103.04 gain 211 203 -105.95 gain 203 212 -97.74 gain 212 203 -98.19 gain 203 213 -105.24 gain 213 203 -110.56 gain 203 214 -101.15 gain 214 203 -102.77 gain 203 215 -98.03 gain 215 203 -100.74 gain 203 216 -87.97 gain 216 203 -91.50 gain 203 217 -81.64 gain 217 203 -89.00 gain 203 218 -82.50 gain 218 203 -82.04 gain 203 219 -88.69 gain 219 203 -91.06 gain 203 220 -91.66 gain 220 203 -90.38 gain 203 221 -100.76 gain 221 203 -103.98 gain 203 222 -105.32 gain 222 203 -109.91 gain 203 223 -105.08 gain 223 203 -111.68 gain 203 224 -104.50 gain 224 203 -111.60 gain 204 205 -94.87 gain 205 204 -92.94 gain 204 206 -96.42 gain 206 204 -92.46 gain 204 207 -102.61 gain 207 204 -99.41 gain 204 208 -106.55 gain 208 204 -103.52 gain 204 209 -117.89 gain 209 204 -110.87 gain 204 210 -117.78 gain 210 204 -117.35 gain 204 211 -116.49 gain 211 204 -112.32 gain 204 212 -115.40 gain 212 204 -108.77 gain 204 213 -105.84 gain 213 204 -104.08 gain 204 214 -108.69 gain 214 204 -103.22 gain 204 215 -105.54 gain 215 204 -101.16 gain 204 216 -107.70 gain 216 204 -104.15 gain 204 217 -105.56 gain 217 204 -105.84 gain 204 218 -88.61 gain 218 204 -81.08 gain 204 219 -93.36 gain 219 204 -88.64 gain 204 220 -89.67 gain 220 204 -81.31 gain 204 221 -100.66 gain 221 204 -96.80 gain 204 222 -101.36 gain 222 204 -98.87 gain 204 223 -103.27 gain 223 204 -102.79 gain 204 224 -110.41 gain 224 204 -110.43 gain 205 206 -94.54 gain 206 205 -92.52 gain 205 207 -100.46 gain 207 205 -99.19 gain 205 208 -108.58 gain 208 205 -107.49 gain 205 209 -104.77 gain 209 205 -99.68 gain 205 210 -117.47 gain 210 205 -118.97 gain 205 211 -110.82 gain 211 205 -108.58 gain 205 212 -108.79 gain 212 205 -104.10 gain 205 213 -114.44 gain 213 205 -114.61 gain 205 214 -110.60 gain 214 205 -107.07 gain 205 215 -108.07 gain 215 205 -105.63 gain 205 216 -103.54 gain 216 205 -101.93 gain 205 217 -96.81 gain 217 205 -99.01 gain 205 218 -90.82 gain 218 205 -85.22 gain 205 219 -88.08 gain 219 205 -85.30 gain 205 220 -87.26 gain 220 205 -80.83 gain 205 221 -94.51 gain 221 205 -92.59 gain 205 222 -91.07 gain 222 205 -90.51 gain 205 223 -105.13 gain 223 205 -106.57 gain 205 224 -99.84 gain 224 205 -101.78 gain 206 207 -82.92 gain 207 206 -83.68 gain 206 208 -100.00 gain 208 206 -100.94 gain 206 209 -96.15 gain 209 206 -93.09 gain 206 210 -119.69 gain 210 206 -123.22 gain 206 211 -116.79 gain 211 206 -116.58 gain 206 212 -109.65 gain 212 206 -106.98 gain 206 213 -99.54 gain 213 206 -101.74 gain 206 214 -102.64 gain 214 206 -101.14 gain 206 215 -106.42 gain 215 206 -106.01 gain 206 216 -101.92 gain 216 206 -102.33 gain 206 217 -102.01 gain 217 206 -106.24 gain 206 218 -99.33 gain 218 206 -95.76 gain 206 219 -101.56 gain 219 206 -100.80 gain 206 220 -88.19 gain 220 206 -83.78 gain 206 221 -80.86 gain 221 206 -80.95 gain 206 222 -86.02 gain 222 206 -87.49 gain 206 223 -86.14 gain 223 206 -89.61 gain 206 224 -97.61 gain 224 206 -101.59 gain 207 208 -86.36 gain 208 207 -86.53 gain 207 209 -95.61 gain 209 207 -91.78 gain 207 210 -116.21 gain 210 207 -118.97 gain 207 211 -114.88 gain 211 207 -113.90 gain 207 212 -114.40 gain 212 207 -110.96 gain 207 213 -115.33 gain 213 207 -116.76 gain 207 214 -118.06 gain 214 207 -115.79 gain 207 215 -113.20 gain 215 207 -112.03 gain 207 216 -109.57 gain 216 207 -109.22 gain 207 217 -104.70 gain 217 207 -108.17 gain 207 218 -102.63 gain 218 207 -98.29 gain 207 219 -100.24 gain 219 207 -98.72 gain 207 220 -95.84 gain 220 207 -90.67 gain 207 221 -86.14 gain 221 207 -85.47 gain 207 222 -89.16 gain 222 207 -89.86 gain 207 223 -91.41 gain 223 207 -94.12 gain 207 224 -92.02 gain 224 207 -95.23 gain 208 209 -80.96 gain 209 208 -76.97 gain 208 210 -117.87 gain 210 208 -120.45 gain 208 211 -109.76 gain 211 208 -108.61 gain 208 212 -112.59 gain 212 208 -108.99 gain 208 213 -120.01 gain 213 208 -121.27 gain 208 214 -113.46 gain 214 208 -111.02 gain 208 215 -104.86 gain 215 208 -103.51 gain 208 216 -117.75 gain 216 208 -117.22 gain 208 217 -109.08 gain 217 208 -112.38 gain 208 218 -99.12 gain 218 208 -94.61 gain 208 219 -107.78 gain 219 208 -106.09 gain 208 220 -92.59 gain 220 208 -87.25 gain 208 221 -103.27 gain 221 208 -102.43 gain 208 222 -86.36 gain 222 208 -86.89 gain 208 223 -81.52 gain 223 208 -84.06 gain 208 224 -85.25 gain 224 208 -88.29 gain 209 210 -115.79 gain 210 209 -122.37 gain 209 211 -106.37 gain 211 209 -109.22 gain 209 212 -114.35 gain 212 209 -114.74 gain 209 213 -117.21 gain 213 209 -122.47 gain 209 214 -109.88 gain 214 209 -111.44 gain 209 215 -111.45 gain 215 209 -114.10 gain 209 216 -117.78 gain 216 209 -121.26 gain 209 217 -107.94 gain 217 209 -115.24 gain 209 218 -107.38 gain 218 209 -106.87 gain 209 219 -102.82 gain 219 209 -105.12 gain 209 220 -101.62 gain 220 209 -100.28 gain 209 221 -95.89 gain 221 209 -99.05 gain 209 222 -88.02 gain 222 209 -92.55 gain 209 223 -90.34 gain 223 209 -96.88 gain 209 224 -84.58 gain 224 209 -91.62 gain 210 211 -87.08 gain 211 210 -83.34 gain 210 212 -96.73 gain 212 210 -90.54 gain 210 213 -100.57 gain 213 210 -99.24 gain 210 214 -111.58 gain 214 210 -106.56 gain 210 215 -101.31 gain 215 210 -97.37 gain 210 216 -110.26 gain 216 210 -107.15 gain 210 217 -117.66 gain 217 210 -118.37 gain 210 218 -115.42 gain 218 210 -108.32 gain 210 219 -119.78 gain 219 210 -115.49 gain 210 220 -115.76 gain 220 210 -107.83 gain 210 221 -121.52 gain 221 210 -118.09 gain 210 222 -121.37 gain 222 210 -119.31 gain 210 223 -118.40 gain 223 210 -118.36 gain 210 224 -124.46 gain 224 210 -124.91 gain 211 212 -89.18 gain 212 211 -86.72 gain 211 213 -90.63 gain 213 211 -93.04 gain 211 214 -99.84 gain 214 211 -98.55 gain 211 215 -102.70 gain 215 211 -102.50 gain 211 216 -94.92 gain 216 211 -95.55 gain 211 217 -110.29 gain 217 211 -114.74 gain 211 218 -109.46 gain 218 211 -106.10 gain 211 219 -111.73 gain 219 211 -111.19 gain 211 220 -118.57 gain 220 211 -114.38 gain 211 221 -113.45 gain 221 211 -113.76 gain 211 222 -115.32 gain 222 211 -117.00 gain 211 223 -116.26 gain 223 211 -119.95 gain 211 224 -118.74 gain 224 211 -122.94 gain 212 213 -90.35 gain 213 212 -95.22 gain 212 214 -90.95 gain 214 212 -92.11 gain 212 215 -100.92 gain 215 212 -103.17 gain 212 216 -105.25 gain 216 212 -108.34 gain 212 217 -104.16 gain 217 212 -111.06 gain 212 218 -106.56 gain 218 212 -105.65 gain 212 219 -107.54 gain 219 212 -109.45 gain 212 220 -102.36 gain 220 212 -100.62 gain 212 221 -109.14 gain 221 212 -111.90 gain 212 222 -110.45 gain 222 212 -114.58 gain 212 223 -116.08 gain 223 212 -122.22 gain 212 224 -112.12 gain 224 212 -118.76 gain 213 214 -82.07 gain 214 213 -78.38 gain 213 215 -93.08 gain 215 213 -90.47 gain 213 216 -102.63 gain 216 213 -100.85 gain 213 217 -105.76 gain 217 213 -107.79 gain 213 218 -104.71 gain 218 213 -98.94 gain 213 219 -116.37 gain 219 213 -113.42 gain 213 220 -119.10 gain 220 213 -112.50 gain 213 221 -115.15 gain 221 213 -113.05 gain 213 222 -113.78 gain 222 213 -113.05 gain 213 223 -110.66 gain 223 213 -111.93 gain 213 224 -116.80 gain 224 213 -118.58 gain 214 215 -85.62 gain 215 214 -86.70 gain 214 216 -95.21 gain 216 214 -97.12 gain 214 217 -102.32 gain 217 214 -108.06 gain 214 218 -97.68 gain 218 214 -95.61 gain 214 219 -94.47 gain 219 214 -95.21 gain 214 220 -116.69 gain 220 214 -113.79 gain 214 221 -100.50 gain 221 214 -102.10 gain 214 222 -111.53 gain 222 214 -114.49 gain 214 223 -112.62 gain 223 214 -117.60 gain 214 224 -116.25 gain 224 214 -121.73 gain 215 216 -80.95 gain 216 215 -81.78 gain 215 217 -96.46 gain 217 215 -101.11 gain 215 218 -96.40 gain 218 215 -93.23 gain 215 219 -102.76 gain 219 215 -102.42 gain 215 220 -109.03 gain 220 215 -105.04 gain 215 221 -110.21 gain 221 215 -110.72 gain 215 222 -111.39 gain 222 215 -113.27 gain 215 223 -108.94 gain 223 215 -112.83 gain 215 224 -107.55 gain 224 215 -111.94 gain 216 217 -87.30 gain 217 216 -91.12 gain 216 218 -91.31 gain 218 216 -87.33 gain 216 219 -102.91 gain 219 216 -101.74 gain 216 220 -98.56 gain 220 216 -93.74 gain 216 221 -112.50 gain 221 216 -112.18 gain 216 222 -109.86 gain 222 216 -110.91 gain 216 223 -112.39 gain 223 216 -115.46 gain 216 224 -110.95 gain 224 216 -114.51 gain 217 218 -88.89 gain 218 217 -81.08 gain 217 219 -94.14 gain 219 217 -89.15 gain 217 220 -108.91 gain 220 217 -100.27 gain 217 221 -104.91 gain 221 217 -100.78 gain 217 222 -111.14 gain 222 217 -108.38 gain 217 223 -115.40 gain 223 217 -114.64 gain 217 224 -110.79 gain 224 217 -110.54 gain 218 219 -79.30 gain 219 218 -82.12 gain 218 220 -85.52 gain 220 218 -84.69 gain 218 221 -93.08 gain 221 218 -96.76 gain 218 222 -95.79 gain 222 218 -100.83 gain 218 223 -98.46 gain 223 218 -105.51 gain 218 224 -103.19 gain 224 218 -110.74 gain 219 220 -73.62 gain 220 219 -69.97 gain 219 221 -94.62 gain 221 219 -95.48 gain 219 222 -101.82 gain 222 219 -104.04 gain 219 223 -108.47 gain 223 219 -112.70 gain 219 224 -99.93 gain 224 219 -104.67 gain 220 221 -78.90 gain 221 220 -83.41 gain 220 222 -93.43 gain 222 220 -99.30 gain 220 223 -100.64 gain 223 220 -108.52 gain 220 224 -97.07 gain 224 220 -105.45 gain 221 222 -85.87 gain 222 221 -87.24 gain 221 223 -98.16 gain 223 221 -101.54 gain 221 224 -103.45 gain 224 221 -107.33 gain 222 223 -87.88 gain 223 222 -89.89 gain 222 224 -96.76 gain 224 222 -99.27 gain 223 224 -85.92 gain 224 223 -86.42 noise 0 -106.22 4.00 noise 1 -104.68 4.00 noise 2 -102.82 4.00 noise 3 -107.66 4.00 noise 4 -105.45 4.00 noise 5 -103.27 4.00 noise 6 -106.26 4.00 noise 7 -107.82 4.00 noise 8 -103.50 4.00 noise 9 -107.24 4.00 noise 10 -106.57 4.00 noise 11 -103.41 4.00 noise 12 -106.75 4.00 noise 13 -107.41 4.00 noise 14 -105.87 4.00 noise 15 -107.46 4.00 noise 16 -110.17 4.00 noise 17 -105.78 4.00 noise 18 -103.91 4.00 noise 19 -103.95 4.00 noise 20 -105.50 4.00 noise 21 -103.08 4.00 noise 22 -105.81 4.00 noise 23 -102.58 4.00 noise 24 -102.38 4.00 noise 25 -103.48 4.00 noise 26 -103.74 4.00 noise 27 -104.86 4.00 noise 28 -106.40 4.00 noise 29 -103.88 4.00 noise 30 -104.74 4.00 noise 31 -105.67 4.00 noise 32 -105.65 4.00 noise 33 -106.52 4.00 noise 34 -106.19 4.00 noise 35 -104.35 4.00 noise 36 -104.79 4.00 noise 37 -103.31 4.00 noise 38 -109.00 4.00 noise 39 -107.89 4.00 noise 40 -105.12 4.00 noise 41 -104.23 4.00 noise 42 -106.35 4.00 noise 43 -105.10 4.00 noise 44 -106.15 4.00 noise 45 -104.75 4.00 noise 46 -103.41 4.00 noise 47 -105.16 4.00 noise 48 -101.07 4.00 noise 49 -106.16 4.00 noise 50 -104.55 4.00 noise 51 -105.80 4.00 noise 52 -104.11 4.00 noise 53 -104.67 4.00 noise 54 -106.16 4.00 noise 55 -106.63 4.00 noise 56 -104.21 4.00 noise 57 -104.80 4.00 noise 58 -105.01 4.00 noise 59 -104.79 4.00 noise 60 -100.84 4.00 noise 61 -103.67 4.00 noise 62 -104.82 4.00 noise 63 -104.15 4.00 noise 64 -108.56 4.00 noise 65 -107.75 4.00 noise 66 -105.50 4.00 noise 67 -104.63 4.00 noise 68 -102.32 4.00 noise 69 -106.69 4.00 noise 70 -103.05 4.00 noise 71 -106.61 4.00 noise 72 -105.39 4.00 noise 73 -106.00 4.00 noise 74 -104.18 4.00 noise 75 -104.50 4.00 noise 76 -106.67 4.00 noise 77 -103.88 4.00 noise 78 -104.91 4.00 noise 79 -104.30 4.00 noise 80 -105.04 4.00 noise 81 -105.24 4.00 noise 82 -105.85 4.00 noise 83 -106.44 4.00 noise 84 -106.64 4.00 noise 85 -108.13 4.00 noise 86 -103.26 4.00 noise 87 -103.28 4.00 noise 88 -107.23 4.00 noise 89 -104.19 4.00 noise 90 -102.14 4.00 noise 91 -104.24 4.00 noise 92 -105.24 4.00 noise 93 -105.61 4.00 noise 94 -105.24 4.00 noise 95 -103.29 4.00 noise 96 -105.01 4.00 noise 97 -104.59 4.00 noise 98 -106.77 4.00 noise 99 -102.72 4.00 noise 100 -103.98 4.00 noise 101 -103.88 4.00 noise 102 -104.21 4.00 noise 103 -103.78 4.00 noise 104 -107.05 4.00 noise 105 -103.43 4.00 noise 106 -104.17 4.00 noise 107 -107.12 4.00 noise 108 -104.76 4.00 noise 109 -106.49 4.00 noise 110 -106.62 4.00 noise 111 -104.01 4.00 noise 112 -105.53 4.00 noise 113 -101.92 4.00 noise 114 -105.09 4.00 noise 115 -103.60 4.00 noise 116 -102.91 4.00 noise 117 -102.25 4.00 noise 118 -101.04 4.00 noise 119 -105.35 4.00 noise 120 -108.62 4.00 noise 121 -107.95 4.00 noise 122 -103.67 4.00 noise 123 -105.57 4.00 noise 124 -104.71 4.00 noise 125 -102.82 4.00 noise 126 -108.64 4.00 noise 127 -103.55 4.00 noise 128 -105.92 4.00 noise 129 -105.23 4.00 noise 130 -103.81 4.00 noise 131 -103.53 4.00 noise 132 -105.77 4.00 noise 133 -104.33 4.00 noise 134 -104.48 4.00 noise 135 -107.47 4.00 noise 136 -105.25 4.00 noise 137 -102.54 4.00 noise 138 -108.46 4.00 noise 139 -106.33 4.00 noise 140 -100.47 4.00 noise 141 -104.44 4.00 noise 142 -102.35 4.00 noise 143 -105.46 4.00 noise 144 -104.81 4.00 noise 145 -104.86 4.00 noise 146 -106.69 4.00 noise 147 -104.33 4.00 noise 148 -103.87 4.00 noise 149 -105.44 4.00 noise 150 -103.74 4.00 noise 151 -106.15 4.00 noise 152 -103.65 4.00 noise 153 -103.39 4.00 noise 154 -105.67 4.00 noise 155 -104.76 4.00 noise 156 -104.98 4.00 noise 157 -105.74 4.00 noise 158 -102.18 4.00 noise 159 -108.04 4.00 noise 160 -106.45 4.00 noise 161 -104.39 4.00 noise 162 -104.80 4.00 noise 163 -108.18 4.00 noise 164 -107.49 4.00 noise 165 -105.22 4.00 noise 166 -102.81 4.00 noise 167 -105.09 4.00 noise 168 -101.64 4.00 noise 169 -109.02 4.00 noise 170 -103.35 4.00 noise 171 -104.26 4.00 noise 172 -108.41 4.00 noise 173 -106.33 4.00 noise 174 -104.87 4.00 noise 175 -104.55 4.00 noise 176 -104.08 4.00 noise 177 -108.08 4.00 noise 178 -106.24 4.00 noise 179 -103.73 4.00 noise 180 -107.16 4.00 noise 181 -102.42 4.00 noise 182 -108.20 4.00 noise 183 -104.53 4.00 noise 184 -103.16 4.00 noise 185 -107.19 4.00 noise 186 -104.72 4.00 noise 187 -103.59 4.00 noise 188 -102.05 4.00 noise 189 -104.01 4.00 noise 190 -104.59 4.00 noise 191 -105.80 4.00 noise 192 -104.13 4.00 noise 193 -102.19 4.00 noise 194 -104.38 4.00 noise 195 -105.36 4.00 noise 196 -103.92 4.00 noise 197 -106.80 4.00 noise 198 -100.98 4.00 noise 199 -106.28 4.00 noise 200 -110.39 4.00 noise 201 -106.96 4.00 noise 202 -102.80 4.00 noise 203 -106.05 4.00 noise 204 -103.20 4.00 noise 205 -104.23 4.00 noise 206 -106.02 4.00 noise 207 -104.12 4.00 noise 208 -104.44 4.00 noise 209 -105.64 4.00 noise 210 -101.45 4.00 noise 211 -105.37 4.00 noise 212 -105.30 4.00 noise 213 -104.10 4.00 noise 214 -105.43 4.00 noise 215 -105.24 4.00 noise 216 -104.04 4.00 noise 217 -102.31 4.00 noise 218 -110.75 4.00 noise 219 -106.03 4.00 noise 220 -106.45 4.00 noise 221 -104.91 4.00 noise 222 -102.56 4.00 noise 223 -104.23 4.00 noise 224 -102.95 4.00 tinyos-2.1.2+dfsg/tos/lib/tossim/topologies/15-15-sparse-mica2-grid.txt000066400000000000000000036710451207233610700254760ustar00rootroot00000000000000gain 0 1 -90.80 gain 1 0 -95.95 gain 0 2 -97.48 gain 2 0 -102.10 gain 0 3 -111.33 gain 3 0 -115.49 gain 0 4 -104.82 gain 4 0 -110.09 gain 0 5 -104.55 gain 5 0 -109.85 gain 0 6 -111.04 gain 6 0 -113.61 gain 0 7 -122.71 gain 7 0 -127.66 gain 0 8 -114.35 gain 8 0 -116.63 gain 0 9 -119.30 gain 9 0 -123.04 gain 0 10 -116.34 gain 10 0 -120.55 gain 0 11 -120.72 gain 11 0 -124.78 gain 0 12 -124.93 gain 12 0 -128.45 gain 0 13 -121.37 gain 13 0 -123.84 gain 0 14 -128.19 gain 14 0 -132.53 gain 0 15 -81.15 gain 15 0 -89.12 gain 0 16 -94.37 gain 16 0 -100.15 gain 0 17 -98.45 gain 17 0 -100.65 gain 0 18 -109.20 gain 18 0 -111.25 gain 0 19 -106.94 gain 19 0 -111.98 gain 0 20 -117.83 gain 20 0 -124.31 gain 0 21 -110.61 gain 21 0 -115.02 gain 0 22 -113.39 gain 22 0 -116.39 gain 0 23 -119.70 gain 23 0 -126.97 gain 0 24 -118.29 gain 24 0 -119.97 gain 0 25 -113.51 gain 25 0 -121.94 gain 0 26 -118.65 gain 26 0 -120.97 gain 0 27 -122.75 gain 27 0 -120.97 gain 0 28 -121.85 gain 28 0 -122.76 gain 0 29 -119.90 gain 29 0 -122.69 gain 0 30 -102.95 gain 30 0 -109.21 gain 0 31 -104.05 gain 31 0 -107.92 gain 0 32 -102.76 gain 32 0 -106.67 gain 0 33 -111.07 gain 33 0 -117.22 gain 0 34 -116.05 gain 34 0 -120.81 gain 0 35 -119.09 gain 35 0 -123.67 gain 0 36 -121.15 gain 36 0 -129.51 gain 0 37 -113.35 gain 37 0 -113.91 gain 0 38 -118.27 gain 38 0 -124.85 gain 0 39 -123.60 gain 39 0 -129.05 gain 0 40 -124.55 gain 40 0 -132.04 gain 0 41 -122.03 gain 41 0 -125.15 gain 0 42 -123.08 gain 42 0 -124.36 gain 0 43 -113.19 gain 43 0 -118.36 gain 0 44 -128.07 gain 44 0 -136.30 gain 0 45 -104.29 gain 45 0 -110.99 gain 0 46 -107.57 gain 46 0 -110.06 gain 0 47 -113.62 gain 47 0 -117.17 gain 0 48 -104.15 gain 48 0 -105.49 gain 0 49 -110.95 gain 49 0 -120.26 gain 0 50 -112.81 gain 50 0 -123.09 gain 0 51 -118.95 gain 51 0 -124.37 gain 0 52 -121.02 gain 52 0 -122.46 gain 0 53 -119.34 gain 53 0 -121.79 gain 0 54 -122.15 gain 54 0 -125.30 gain 0 55 -118.69 gain 55 0 -121.14 gain 0 56 -118.69 gain 56 0 -128.46 gain 0 57 -115.82 gain 57 0 -119.47 gain 0 58 -119.30 gain 58 0 -125.70 gain 0 59 -124.78 gain 59 0 -127.29 gain 0 60 -105.09 gain 60 0 -108.93 gain 0 61 -107.93 gain 61 0 -110.52 gain 0 62 -101.72 gain 62 0 -109.53 gain 0 63 -117.08 gain 63 0 -118.11 gain 0 64 -115.61 gain 64 0 -119.62 gain 0 65 -114.43 gain 65 0 -120.53 gain 0 66 -113.49 gain 66 0 -113.85 gain 0 67 -110.56 gain 67 0 -113.18 gain 0 68 -115.34 gain 68 0 -122.52 gain 0 69 -128.30 gain 69 0 -132.77 gain 0 70 -121.97 gain 70 0 -126.20 gain 0 71 -116.55 gain 71 0 -118.89 gain 0 72 -120.37 gain 72 0 -123.13 gain 0 73 -135.14 gain 73 0 -136.29 gain 0 74 -124.54 gain 74 0 -129.57 gain 0 75 -115.60 gain 75 0 -120.76 gain 0 76 -103.37 gain 76 0 -104.48 gain 0 77 -115.38 gain 77 0 -120.16 gain 0 78 -117.36 gain 78 0 -124.99 gain 0 79 -120.71 gain 79 0 -123.12 gain 0 80 -117.23 gain 80 0 -120.14 gain 0 81 -118.46 gain 81 0 -121.96 gain 0 82 -116.25 gain 82 0 -117.38 gain 0 83 -110.68 gain 83 0 -112.84 gain 0 84 -126.11 gain 84 0 -128.42 gain 0 85 -122.77 gain 85 0 -121.89 gain 0 86 -125.34 gain 86 0 -127.84 gain 0 87 -119.17 gain 87 0 -125.63 gain 0 88 -133.17 gain 88 0 -137.39 gain 0 89 -129.09 gain 89 0 -131.91 gain 0 90 -108.30 gain 90 0 -108.12 gain 0 91 -114.62 gain 91 0 -118.39 gain 0 92 -111.12 gain 92 0 -111.85 gain 0 93 -117.81 gain 93 0 -123.33 gain 0 94 -114.73 gain 94 0 -120.12 gain 0 95 -109.33 gain 95 0 -116.97 gain 0 96 -119.42 gain 96 0 -124.40 gain 0 97 -114.05 gain 97 0 -117.78 gain 0 98 -119.80 gain 98 0 -124.32 gain 0 99 -125.96 gain 99 0 -128.31 gain 0 100 -126.17 gain 100 0 -128.08 gain 0 101 -121.85 gain 101 0 -123.93 gain 0 102 -130.09 gain 102 0 -132.94 gain 0 103 -128.16 gain 103 0 -128.49 gain 0 104 -129.15 gain 104 0 -134.86 gain 0 105 -117.91 gain 105 0 -119.56 gain 0 106 -119.70 gain 106 0 -122.44 gain 0 107 -120.50 gain 107 0 -129.81 gain 0 108 -122.57 gain 108 0 -124.19 gain 0 109 -108.42 gain 109 0 -113.54 gain 0 110 -117.98 gain 110 0 -121.56 gain 0 111 -121.58 gain 111 0 -124.85 gain 0 112 -120.83 gain 112 0 -122.97 gain 0 113 -121.14 gain 113 0 -122.09 gain 0 114 -116.15 gain 114 0 -120.40 gain 0 115 -118.52 gain 115 0 -117.08 gain 0 116 -122.13 gain 116 0 -128.22 gain 0 117 -121.50 gain 117 0 -129.10 gain 0 118 -129.79 gain 118 0 -135.71 gain 0 119 -119.63 gain 119 0 -120.21 gain 0 120 -120.80 gain 120 0 -125.89 gain 0 121 -119.13 gain 121 0 -123.52 gain 0 122 -118.77 gain 122 0 -125.27 gain 0 123 -116.50 gain 123 0 -123.78 gain 0 124 -114.03 gain 124 0 -117.72 gain 0 125 -124.42 gain 125 0 -129.44 gain 0 126 -113.91 gain 126 0 -116.89 gain 0 127 -121.79 gain 127 0 -128.23 gain 0 128 -118.32 gain 128 0 -122.70 gain 0 129 -126.26 gain 129 0 -128.54 gain 0 130 -132.38 gain 130 0 -132.49 gain 0 131 -122.73 gain 131 0 -129.92 gain 0 132 -124.64 gain 132 0 -131.46 gain 0 133 -121.41 gain 133 0 -126.30 gain 0 134 -119.48 gain 134 0 -121.07 gain 0 135 -112.40 gain 135 0 -117.56 gain 0 136 -118.67 gain 136 0 -124.44 gain 0 137 -120.62 gain 137 0 -123.88 gain 0 138 -120.36 gain 138 0 -122.61 gain 0 139 -115.00 gain 139 0 -118.24 gain 0 140 -119.29 gain 140 0 -125.14 gain 0 141 -118.86 gain 141 0 -123.38 gain 0 142 -121.51 gain 142 0 -125.34 gain 0 143 -124.69 gain 143 0 -128.13 gain 0 144 -113.51 gain 144 0 -117.97 gain 0 145 -130.34 gain 145 0 -133.25 gain 0 146 -123.18 gain 146 0 -125.00 gain 0 147 -134.86 gain 147 0 -133.77 gain 0 148 -128.58 gain 148 0 -127.21 gain 0 149 -130.84 gain 149 0 -132.63 gain 0 150 -123.23 gain 150 0 -127.71 gain 0 151 -118.69 gain 151 0 -123.37 gain 0 152 -119.38 gain 152 0 -121.03 gain 0 153 -124.31 gain 153 0 -123.54 gain 0 154 -119.70 gain 154 0 -127.48 gain 0 155 -123.28 gain 155 0 -130.95 gain 0 156 -117.87 gain 156 0 -119.93 gain 0 157 -111.37 gain 157 0 -116.38 gain 0 158 -129.55 gain 158 0 -137.16 gain 0 159 -124.34 gain 159 0 -128.56 gain 0 160 -127.94 gain 160 0 -129.28 gain 0 161 -119.76 gain 161 0 -124.58 gain 0 162 -128.84 gain 162 0 -132.53 gain 0 163 -123.54 gain 163 0 -129.38 gain 0 164 -128.68 gain 164 0 -135.56 gain 0 165 -113.14 gain 165 0 -116.06 gain 0 166 -126.13 gain 166 0 -130.62 gain 0 167 -124.52 gain 167 0 -131.10 gain 0 168 -124.76 gain 168 0 -129.79 gain 0 169 -125.23 gain 169 0 -134.46 gain 0 170 -120.43 gain 170 0 -121.18 gain 0 171 -117.99 gain 171 0 -123.77 gain 0 172 -121.36 gain 172 0 -121.83 gain 0 173 -121.72 gain 173 0 -121.63 gain 0 174 -123.70 gain 174 0 -127.90 gain 0 175 -130.74 gain 175 0 -138.50 gain 0 176 -128.72 gain 176 0 -128.49 gain 0 177 -122.98 gain 177 0 -130.56 gain 0 178 -123.53 gain 178 0 -126.94 gain 0 179 -121.34 gain 179 0 -123.14 gain 0 180 -124.03 gain 180 0 -127.30 gain 0 181 -129.63 gain 181 0 -132.97 gain 0 182 -127.19 gain 182 0 -132.91 gain 0 183 -125.81 gain 183 0 -124.92 gain 0 184 -118.15 gain 184 0 -122.04 gain 0 185 -117.15 gain 185 0 -118.53 gain 0 186 -127.56 gain 186 0 -129.22 gain 0 187 -121.96 gain 187 0 -126.17 gain 0 188 -123.42 gain 188 0 -130.88 gain 0 189 -125.15 gain 189 0 -130.13 gain 0 190 -122.11 gain 190 0 -124.10 gain 0 191 -125.67 gain 191 0 -128.75 gain 0 192 -128.29 gain 192 0 -134.24 gain 0 193 -127.23 gain 193 0 -134.43 gain 0 194 -124.52 gain 194 0 -125.53 gain 0 195 -117.59 gain 195 0 -119.24 gain 0 196 -125.16 gain 196 0 -130.84 gain 0 197 -122.25 gain 197 0 -123.99 gain 0 198 -119.87 gain 198 0 -121.14 gain 0 199 -125.54 gain 199 0 -130.73 gain 0 200 -126.93 gain 200 0 -129.05 gain 0 201 -120.97 gain 201 0 -123.89 gain 0 202 -126.25 gain 202 0 -133.18 gain 0 203 -127.63 gain 203 0 -134.18 gain 0 204 -130.56 gain 204 0 -134.39 gain 0 205 -124.99 gain 205 0 -127.90 gain 0 206 -128.86 gain 206 0 -136.29 gain 0 207 -126.24 gain 207 0 -126.03 gain 0 208 -127.04 gain 208 0 -132.60 gain 0 209 -128.25 gain 209 0 -134.81 gain 0 210 -125.57 gain 210 0 -129.06 gain 0 211 -125.97 gain 211 0 -131.49 gain 0 212 -121.68 gain 212 0 -125.74 gain 0 213 -122.47 gain 213 0 -125.72 gain 0 214 -124.46 gain 214 0 -127.60 gain 0 215 -124.09 gain 215 0 -123.65 gain 0 216 -118.01 gain 216 0 -122.23 gain 0 217 -125.07 gain 217 0 -129.80 gain 0 218 -123.71 gain 218 0 -130.63 gain 0 219 -122.75 gain 219 0 -121.03 gain 0 220 -126.78 gain 220 0 -135.55 gain 0 221 -127.49 gain 221 0 -131.90 gain 0 222 -122.19 gain 222 0 -126.93 gain 0 223 -130.92 gain 223 0 -134.28 gain 0 224 -132.58 gain 224 0 -138.63 gain 1 2 -94.32 gain 2 1 -93.81 gain 1 3 -110.75 gain 3 1 -109.77 gain 1 4 -111.09 gain 4 1 -111.21 gain 1 5 -116.10 gain 5 1 -116.26 gain 1 6 -118.62 gain 6 1 -116.04 gain 1 7 -112.87 gain 7 1 -112.68 gain 1 8 -119.00 gain 8 1 -116.14 gain 1 9 -120.98 gain 9 1 -119.58 gain 1 10 -122.11 gain 10 1 -121.19 gain 1 11 -119.58 gain 11 1 -118.49 gain 1 12 -126.50 gain 12 1 -124.88 gain 1 13 -118.20 gain 13 1 -115.54 gain 1 14 -128.87 gain 14 1 -128.07 gain 1 15 -103.04 gain 15 1 -105.86 gain 1 16 -88.61 gain 16 1 -89.25 gain 1 17 -105.06 gain 17 1 -102.13 gain 1 18 -106.58 gain 18 1 -103.48 gain 1 19 -114.90 gain 19 1 -114.80 gain 1 20 -105.18 gain 20 1 -106.52 gain 1 21 -120.66 gain 21 1 -119.93 gain 1 22 -115.56 gain 22 1 -113.42 gain 1 23 -121.21 gain 23 1 -123.34 gain 1 24 -117.48 gain 24 1 -114.02 gain 1 25 -122.91 gain 25 1 -126.20 gain 1 26 -126.29 gain 26 1 -123.46 gain 1 27 -124.24 gain 27 1 -117.31 gain 1 28 -130.29 gain 28 1 -126.06 gain 1 29 -129.23 gain 29 1 -126.88 gain 1 30 -107.22 gain 30 1 -108.34 gain 1 31 -105.29 gain 31 1 -104.02 gain 1 32 -115.21 gain 32 1 -113.97 gain 1 33 -109.20 gain 33 1 -110.21 gain 1 34 -109.49 gain 34 1 -109.10 gain 1 35 -119.54 gain 35 1 -118.98 gain 1 36 -115.05 gain 36 1 -118.27 gain 1 37 -117.45 gain 37 1 -112.87 gain 1 38 -124.57 gain 38 1 -126.01 gain 1 39 -123.85 gain 39 1 -124.16 gain 1 40 -117.44 gain 40 1 -119.79 gain 1 41 -124.67 gain 41 1 -122.65 gain 1 42 -131.04 gain 42 1 -127.17 gain 1 43 -125.09 gain 43 1 -125.11 gain 1 44 -128.30 gain 44 1 -131.38 gain 1 45 -103.52 gain 45 1 -105.08 gain 1 46 -102.06 gain 46 1 -99.41 gain 1 47 -110.08 gain 47 1 -108.49 gain 1 48 -116.80 gain 48 1 -113.00 gain 1 49 -111.33 gain 49 1 -115.50 gain 1 50 -120.51 gain 50 1 -125.65 gain 1 51 -116.60 gain 51 1 -116.87 gain 1 52 -114.90 gain 52 1 -111.20 gain 1 53 -118.78 gain 53 1 -116.09 gain 1 54 -122.21 gain 54 1 -120.22 gain 1 55 -119.56 gain 55 1 -116.87 gain 1 56 -124.80 gain 56 1 -129.43 gain 1 57 -120.46 gain 57 1 -118.97 gain 1 58 -135.71 gain 58 1 -136.96 gain 1 59 -131.80 gain 59 1 -129.18 gain 1 60 -121.63 gain 60 1 -120.32 gain 1 61 -111.58 gain 61 1 -109.03 gain 1 62 -114.16 gain 62 1 -116.83 gain 1 63 -114.73 gain 63 1 -110.63 gain 1 64 -119.08 gain 64 1 -117.94 gain 1 65 -121.43 gain 65 1 -122.38 gain 1 66 -117.91 gain 66 1 -113.12 gain 1 67 -117.72 gain 67 1 -115.20 gain 1 68 -129.35 gain 68 1 -131.39 gain 1 69 -124.12 gain 69 1 -123.46 gain 1 70 -119.91 gain 70 1 -119.01 gain 1 71 -124.20 gain 71 1 -121.40 gain 1 72 -118.88 gain 72 1 -116.50 gain 1 73 -129.47 gain 73 1 -125.47 gain 1 74 -134.44 gain 74 1 -134.32 gain 1 75 -118.75 gain 75 1 -118.77 gain 1 76 -118.44 gain 76 1 -114.41 gain 1 77 -118.08 gain 77 1 -117.72 gain 1 78 -115.48 gain 78 1 -117.97 gain 1 79 -114.10 gain 79 1 -111.37 gain 1 80 -119.06 gain 80 1 -116.83 gain 1 81 -118.44 gain 81 1 -116.80 gain 1 82 -118.73 gain 82 1 -114.72 gain 1 83 -126.51 gain 83 1 -123.53 gain 1 84 -124.47 gain 84 1 -121.64 gain 1 85 -126.75 gain 85 1 -120.73 gain 1 86 -125.84 gain 86 1 -123.20 gain 1 87 -121.52 gain 87 1 -122.85 gain 1 88 -132.39 gain 88 1 -131.46 gain 1 89 -127.52 gain 89 1 -125.20 gain 1 90 -112.46 gain 90 1 -107.15 gain 1 91 -109.09 gain 91 1 -107.71 gain 1 92 -121.83 gain 92 1 -117.42 gain 1 93 -118.97 gain 93 1 -119.34 gain 1 94 -121.16 gain 94 1 -121.41 gain 1 95 -126.27 gain 95 1 -128.78 gain 1 96 -124.98 gain 96 1 -124.82 gain 1 97 -125.03 gain 97 1 -123.62 gain 1 98 -121.54 gain 98 1 -120.93 gain 1 99 -136.42 gain 99 1 -133.62 gain 1 100 -125.37 gain 100 1 -122.14 gain 1 101 -131.79 gain 101 1 -128.72 gain 1 102 -141.27 gain 102 1 -138.98 gain 1 103 -132.92 gain 103 1 -128.12 gain 1 104 -132.80 gain 104 1 -133.37 gain 1 105 -120.51 gain 105 1 -117.03 gain 1 106 -114.56 gain 106 1 -112.15 gain 1 107 -120.45 gain 107 1 -124.61 gain 1 108 -120.51 gain 108 1 -116.99 gain 1 109 -114.05 gain 109 1 -114.02 gain 1 110 -112.91 gain 110 1 -111.36 gain 1 111 -122.89 gain 111 1 -121.02 gain 1 112 -127.72 gain 112 1 -124.72 gain 1 113 -123.75 gain 113 1 -119.56 gain 1 114 -115.19 gain 114 1 -114.30 gain 1 115 -125.70 gain 115 1 -119.11 gain 1 116 -122.31 gain 116 1 -123.26 gain 1 117 -129.76 gain 117 1 -132.21 gain 1 118 -133.11 gain 118 1 -133.89 gain 1 119 -121.53 gain 119 1 -116.97 gain 1 120 -121.54 gain 120 1 -121.49 gain 1 121 -122.32 gain 121 1 -121.56 gain 1 122 -121.52 gain 122 1 -122.88 gain 1 123 -120.82 gain 123 1 -122.95 gain 1 124 -119.25 gain 124 1 -117.80 gain 1 125 -124.87 gain 125 1 -124.75 gain 1 126 -128.87 gain 126 1 -126.70 gain 1 127 -126.18 gain 127 1 -127.48 gain 1 128 -125.40 gain 128 1 -124.64 gain 1 129 -133.63 gain 129 1 -130.78 gain 1 130 -125.85 gain 130 1 -120.82 gain 1 131 -133.06 gain 131 1 -135.12 gain 1 132 -123.41 gain 132 1 -125.09 gain 1 133 -127.10 gain 133 1 -126.85 gain 1 134 -133.05 gain 134 1 -129.50 gain 1 135 -130.71 gain 135 1 -130.73 gain 1 136 -119.16 gain 136 1 -119.79 gain 1 137 -131.61 gain 137 1 -129.72 gain 1 138 -127.63 gain 138 1 -124.74 gain 1 139 -124.99 gain 139 1 -123.09 gain 1 140 -121.22 gain 140 1 -121.93 gain 1 141 -120.21 gain 141 1 -119.59 gain 1 142 -132.72 gain 142 1 -131.41 gain 1 143 -133.46 gain 143 1 -131.76 gain 1 144 -123.49 gain 144 1 -122.81 gain 1 145 -134.47 gain 145 1 -132.24 gain 1 146 -131.84 gain 146 1 -128.51 gain 1 147 -133.21 gain 147 1 -126.98 gain 1 148 -124.98 gain 148 1 -118.46 gain 1 149 -137.63 gain 149 1 -134.28 gain 1 150 -125.00 gain 150 1 -124.34 gain 1 151 -117.90 gain 151 1 -117.44 gain 1 152 -126.73 gain 152 1 -123.24 gain 1 153 -132.93 gain 153 1 -127.02 gain 1 154 -128.90 gain 154 1 -131.54 gain 1 155 -128.97 gain 155 1 -131.50 gain 1 156 -128.34 gain 156 1 -125.27 gain 1 157 -130.40 gain 157 1 -130.27 gain 1 158 -122.45 gain 158 1 -124.91 gain 1 159 -129.87 gain 159 1 -128.95 gain 1 160 -134.49 gain 160 1 -130.68 gain 1 161 -128.20 gain 161 1 -127.89 gain 1 162 -127.27 gain 162 1 -125.81 gain 1 163 -121.82 gain 163 1 -122.52 gain 1 164 -128.46 gain 164 1 -130.20 gain 1 165 -131.46 gain 165 1 -129.24 gain 1 166 -128.47 gain 166 1 -127.82 gain 1 167 -126.90 gain 167 1 -128.34 gain 1 168 -124.47 gain 168 1 -124.36 gain 1 169 -128.86 gain 169 1 -132.95 gain 1 170 -124.27 gain 170 1 -119.88 gain 1 171 -121.38 gain 171 1 -122.01 gain 1 172 -131.51 gain 172 1 -126.84 gain 1 173 -127.32 gain 173 1 -122.09 gain 1 174 -128.97 gain 174 1 -128.03 gain 1 175 -125.50 gain 175 1 -128.12 gain 1 176 -126.14 gain 176 1 -120.77 gain 1 177 -129.54 gain 177 1 -131.98 gain 1 178 -126.24 gain 178 1 -124.51 gain 1 179 -135.43 gain 179 1 -132.09 gain 1 180 -127.62 gain 180 1 -125.75 gain 1 181 -124.89 gain 181 1 -123.08 gain 1 182 -136.63 gain 182 1 -137.21 gain 1 183 -129.13 gain 183 1 -123.10 gain 1 184 -127.45 gain 184 1 -126.20 gain 1 185 -129.93 gain 185 1 -126.17 gain 1 186 -127.68 gain 186 1 -124.20 gain 1 187 -125.32 gain 187 1 -124.39 gain 1 188 -128.00 gain 188 1 -130.33 gain 1 189 -127.02 gain 189 1 -126.86 gain 1 190 -122.65 gain 190 1 -119.50 gain 1 191 -131.70 gain 191 1 -129.64 gain 1 192 -124.99 gain 192 1 -125.79 gain 1 193 -129.88 gain 193 1 -131.93 gain 1 194 -130.71 gain 194 1 -126.58 gain 1 195 -127.64 gain 195 1 -124.14 gain 1 196 -127.09 gain 196 1 -127.63 gain 1 197 -127.92 gain 197 1 -124.52 gain 1 198 -122.81 gain 198 1 -118.94 gain 1 199 -127.18 gain 199 1 -127.22 gain 1 200 -119.25 gain 200 1 -116.23 gain 1 201 -130.54 gain 201 1 -128.32 gain 1 202 -121.83 gain 202 1 -123.61 gain 1 203 -130.84 gain 203 1 -132.24 gain 1 204 -131.92 gain 204 1 -130.61 gain 1 205 -133.81 gain 205 1 -131.58 gain 1 206 -127.78 gain 206 1 -130.06 gain 1 207 -135.17 gain 207 1 -129.81 gain 1 208 -136.86 gain 208 1 -137.29 gain 1 209 -132.11 gain 209 1 -133.52 gain 1 210 -129.08 gain 210 1 -127.43 gain 1 211 -125.72 gain 211 1 -126.10 gain 1 212 -124.61 gain 212 1 -123.53 gain 1 213 -122.98 gain 213 1 -121.09 gain 1 214 -129.29 gain 214 1 -127.29 gain 1 215 -131.99 gain 215 1 -126.40 gain 1 216 -135.65 gain 216 1 -134.73 gain 1 217 -127.73 gain 217 1 -127.32 gain 1 218 -131.90 gain 218 1 -133.68 gain 1 219 -131.29 gain 219 1 -124.43 gain 1 220 -127.44 gain 220 1 -131.07 gain 1 221 -137.98 gain 221 1 -137.25 gain 1 222 -135.86 gain 222 1 -135.47 gain 1 223 -133.69 gain 223 1 -131.90 gain 1 224 -136.98 gain 224 1 -137.88 gain 2 3 -87.95 gain 3 2 -87.50 gain 2 4 -94.12 gain 4 2 -94.75 gain 2 5 -114.56 gain 5 2 -115.24 gain 2 6 -107.90 gain 6 2 -105.84 gain 2 7 -119.02 gain 7 2 -119.34 gain 2 8 -114.44 gain 8 2 -112.09 gain 2 9 -118.20 gain 9 2 -117.31 gain 2 10 -128.90 gain 10 2 -128.50 gain 2 11 -119.40 gain 11 2 -118.83 gain 2 12 -129.32 gain 12 2 -128.22 gain 2 13 -128.23 gain 13 2 -126.09 gain 2 14 -128.33 gain 14 2 -128.05 gain 2 15 -105.36 gain 15 2 -108.70 gain 2 16 -100.28 gain 16 2 -101.43 gain 2 17 -91.19 gain 17 2 -88.77 gain 2 18 -94.92 gain 18 2 -92.34 gain 2 19 -107.00 gain 19 2 -107.41 gain 2 20 -109.11 gain 20 2 -110.96 gain 2 21 -110.84 gain 21 2 -110.62 gain 2 22 -113.00 gain 22 2 -111.37 gain 2 23 -112.98 gain 23 2 -115.63 gain 2 24 -125.11 gain 24 2 -122.17 gain 2 25 -119.10 gain 25 2 -122.91 gain 2 26 -125.41 gain 26 2 -123.10 gain 2 27 -119.15 gain 27 2 -112.74 gain 2 28 -131.62 gain 28 2 -127.91 gain 2 29 -119.81 gain 29 2 -117.97 gain 2 30 -106.14 gain 30 2 -107.77 gain 2 31 -98.82 gain 31 2 -98.06 gain 2 32 -104.03 gain 32 2 -103.31 gain 2 33 -104.34 gain 33 2 -105.87 gain 2 34 -106.90 gain 34 2 -107.03 gain 2 35 -111.26 gain 35 2 -111.22 gain 2 36 -113.88 gain 36 2 -117.62 gain 2 37 -116.33 gain 37 2 -112.27 gain 2 38 -118.31 gain 38 2 -120.27 gain 2 39 -125.44 gain 39 2 -126.26 gain 2 40 -118.33 gain 40 2 -121.20 gain 2 41 -117.70 gain 41 2 -116.20 gain 2 42 -125.83 gain 42 2 -122.48 gain 2 43 -127.68 gain 43 2 -128.22 gain 2 44 -132.35 gain 44 2 -135.95 gain 2 45 -110.25 gain 45 2 -112.32 gain 2 46 -111.62 gain 46 2 -109.48 gain 2 47 -114.28 gain 47 2 -113.20 gain 2 48 -113.76 gain 48 2 -110.47 gain 2 49 -111.74 gain 49 2 -116.43 gain 2 50 -114.23 gain 50 2 -119.89 gain 2 51 -116.83 gain 51 2 -117.63 gain 2 52 -113.61 gain 52 2 -110.42 gain 2 53 -111.37 gain 53 2 -109.20 gain 2 54 -118.86 gain 54 2 -117.38 gain 2 55 -120.31 gain 55 2 -118.14 gain 2 56 -129.77 gain 56 2 -134.92 gain 2 57 -124.52 gain 57 2 -123.54 gain 2 58 -124.74 gain 58 2 -126.51 gain 2 59 -124.49 gain 59 2 -122.38 gain 2 60 -115.58 gain 60 2 -114.80 gain 2 61 -100.59 gain 61 2 -98.56 gain 2 62 -113.94 gain 62 2 -117.12 gain 2 63 -106.07 gain 63 2 -102.48 gain 2 64 -113.63 gain 64 2 -113.02 gain 2 65 -123.19 gain 65 2 -124.66 gain 2 66 -123.09 gain 66 2 -118.81 gain 2 67 -117.65 gain 67 2 -115.65 gain 2 68 -123.54 gain 68 2 -126.10 gain 2 69 -131.95 gain 69 2 -131.80 gain 2 70 -126.25 gain 70 2 -125.86 gain 2 71 -121.86 gain 71 2 -119.58 gain 2 72 -123.93 gain 72 2 -122.06 gain 2 73 -129.62 gain 73 2 -126.14 gain 2 74 -126.47 gain 74 2 -126.87 gain 2 75 -114.60 gain 75 2 -115.14 gain 2 76 -112.93 gain 76 2 -109.42 gain 2 77 -115.02 gain 77 2 -115.17 gain 2 78 -110.37 gain 78 2 -113.37 gain 2 79 -114.25 gain 79 2 -112.04 gain 2 80 -117.21 gain 80 2 -115.50 gain 2 81 -117.77 gain 81 2 -116.65 gain 2 82 -120.29 gain 82 2 -116.79 gain 2 83 -119.86 gain 83 2 -117.40 gain 2 84 -129.51 gain 84 2 -127.20 gain 2 85 -128.50 gain 85 2 -123.00 gain 2 86 -121.65 gain 86 2 -119.53 gain 2 87 -129.73 gain 87 2 -131.57 gain 2 88 -126.81 gain 88 2 -126.40 gain 2 89 -133.93 gain 89 2 -132.12 gain 2 90 -117.44 gain 90 2 -112.64 gain 2 91 -110.44 gain 91 2 -109.58 gain 2 92 -122.31 gain 92 2 -118.41 gain 2 93 -117.03 gain 93 2 -117.92 gain 2 94 -117.66 gain 94 2 -118.43 gain 2 95 -115.87 gain 95 2 -118.89 gain 2 96 -116.67 gain 96 2 -117.03 gain 2 97 -123.04 gain 97 2 -122.14 gain 2 98 -119.69 gain 98 2 -119.59 gain 2 99 -122.16 gain 99 2 -119.88 gain 2 100 -128.36 gain 100 2 -125.65 gain 2 101 -129.49 gain 101 2 -126.94 gain 2 102 -127.54 gain 102 2 -125.77 gain 2 103 -125.96 gain 103 2 -121.67 gain 2 104 -125.99 gain 104 2 -127.08 gain 2 105 -122.07 gain 105 2 -119.10 gain 2 106 -120.46 gain 106 2 -118.58 gain 2 107 -118.77 gain 107 2 -123.45 gain 2 108 -132.36 gain 108 2 -129.36 gain 2 109 -121.56 gain 109 2 -122.05 gain 2 110 -120.94 gain 110 2 -119.89 gain 2 111 -120.47 gain 111 2 -119.11 gain 2 112 -123.54 gain 112 2 -121.06 gain 2 113 -128.88 gain 113 2 -125.21 gain 2 114 -125.11 gain 114 2 -124.74 gain 2 115 -120.90 gain 115 2 -114.83 gain 2 116 -120.74 gain 116 2 -122.21 gain 2 117 -132.54 gain 117 2 -135.51 gain 2 118 -126.37 gain 118 2 -127.66 gain 2 119 -130.40 gain 119 2 -126.35 gain 2 120 -124.38 gain 120 2 -124.85 gain 2 121 -123.18 gain 121 2 -122.94 gain 2 122 -125.81 gain 122 2 -127.69 gain 2 123 -122.73 gain 123 2 -125.38 gain 2 124 -125.86 gain 124 2 -124.92 gain 2 125 -124.85 gain 125 2 -125.25 gain 2 126 -131.72 gain 126 2 -130.07 gain 2 127 -120.76 gain 127 2 -122.57 gain 2 128 -119.98 gain 128 2 -119.73 gain 2 129 -127.40 gain 129 2 -125.07 gain 2 130 -124.69 gain 130 2 -120.18 gain 2 131 -129.29 gain 131 2 -131.86 gain 2 132 -131.14 gain 132 2 -133.34 gain 2 133 -126.44 gain 133 2 -126.70 gain 2 134 -127.76 gain 134 2 -124.73 gain 2 135 -124.85 gain 135 2 -125.39 gain 2 136 -125.81 gain 136 2 -126.96 gain 2 137 -125.93 gain 137 2 -124.56 gain 2 138 -128.13 gain 138 2 -125.76 gain 2 139 -123.67 gain 139 2 -122.29 gain 2 140 -126.52 gain 140 2 -127.74 gain 2 141 -113.17 gain 141 2 -113.07 gain 2 142 -130.28 gain 142 2 -129.49 gain 2 143 -124.49 gain 143 2 -123.31 gain 2 144 -123.57 gain 144 2 -123.41 gain 2 145 -123.20 gain 145 2 -121.48 gain 2 146 -128.80 gain 146 2 -126.00 gain 2 147 -126.01 gain 147 2 -120.30 gain 2 148 -129.49 gain 148 2 -123.50 gain 2 149 -121.02 gain 149 2 -118.19 gain 2 150 -129.91 gain 150 2 -129.77 gain 2 151 -128.77 gain 151 2 -128.82 gain 2 152 -125.59 gain 152 2 -122.62 gain 2 153 -119.67 gain 153 2 -114.28 gain 2 154 -120.32 gain 154 2 -123.47 gain 2 155 -120.23 gain 155 2 -123.28 gain 2 156 -127.03 gain 156 2 -124.47 gain 2 157 -125.16 gain 157 2 -125.54 gain 2 158 -123.49 gain 158 2 -126.47 gain 2 159 -123.92 gain 159 2 -123.51 gain 2 160 -127.62 gain 160 2 -124.32 gain 2 161 -136.23 gain 161 2 -136.43 gain 2 162 -129.36 gain 162 2 -128.43 gain 2 163 -127.10 gain 163 2 -128.31 gain 2 164 -127.16 gain 164 2 -129.42 gain 2 165 -126.32 gain 165 2 -124.62 gain 2 166 -126.67 gain 166 2 -126.53 gain 2 167 -126.07 gain 167 2 -128.02 gain 2 168 -123.01 gain 168 2 -123.41 gain 2 169 -130.91 gain 169 2 -135.51 gain 2 170 -123.46 gain 170 2 -119.59 gain 2 171 -121.89 gain 171 2 -123.04 gain 2 172 -121.79 gain 172 2 -117.64 gain 2 173 -139.83 gain 173 2 -135.12 gain 2 174 -134.68 gain 174 2 -134.26 gain 2 175 -128.65 gain 175 2 -131.79 gain 2 176 -123.35 gain 176 2 -118.50 gain 2 177 -130.67 gain 177 2 -133.63 gain 2 178 -124.89 gain 178 2 -123.67 gain 2 179 -125.73 gain 179 2 -122.90 gain 2 180 -125.36 gain 180 2 -124.00 gain 2 181 -126.89 gain 181 2 -125.60 gain 2 182 -125.33 gain 182 2 -126.42 gain 2 183 -131.08 gain 183 2 -125.57 gain 2 184 -117.51 gain 184 2 -116.78 gain 2 185 -123.95 gain 185 2 -120.71 gain 2 186 -129.65 gain 186 2 -126.69 gain 2 187 -125.30 gain 187 2 -124.88 gain 2 188 -122.93 gain 188 2 -125.77 gain 2 189 -125.68 gain 189 2 -126.04 gain 2 190 -129.83 gain 190 2 -127.19 gain 2 191 -127.13 gain 191 2 -125.59 gain 2 192 -129.88 gain 192 2 -131.20 gain 2 193 -128.83 gain 193 2 -131.40 gain 2 194 -132.29 gain 194 2 -128.68 gain 2 195 -122.88 gain 195 2 -119.90 gain 2 196 -125.96 gain 196 2 -127.02 gain 2 197 -123.98 gain 197 2 -121.10 gain 2 198 -133.23 gain 198 2 -129.87 gain 2 199 -131.92 gain 199 2 -132.48 gain 2 200 -128.08 gain 200 2 -125.57 gain 2 201 -129.55 gain 201 2 -127.85 gain 2 202 -125.10 gain 202 2 -127.40 gain 2 203 -130.16 gain 203 2 -132.09 gain 2 204 -136.57 gain 204 2 -135.78 gain 2 205 -126.02 gain 205 2 -124.30 gain 2 206 -125.29 gain 206 2 -128.09 gain 2 207 -141.51 gain 207 2 -136.68 gain 2 208 -130.78 gain 208 2 -131.72 gain 2 209 -136.99 gain 209 2 -138.92 gain 2 210 -126.75 gain 210 2 -125.62 gain 2 211 -130.13 gain 211 2 -131.02 gain 2 212 -131.14 gain 212 2 -130.57 gain 2 213 -132.17 gain 213 2 -130.79 gain 2 214 -128.57 gain 214 2 -127.09 gain 2 215 -128.03 gain 215 2 -122.96 gain 2 216 -135.72 gain 216 2 -135.31 gain 2 217 -140.65 gain 217 2 -140.76 gain 2 218 -134.32 gain 218 2 -136.62 gain 2 219 -134.27 gain 219 2 -127.92 gain 2 220 -127.27 gain 220 2 -131.42 gain 2 221 -136.51 gain 221 2 -136.30 gain 2 222 -128.37 gain 222 2 -128.49 gain 2 223 -132.76 gain 223 2 -131.49 gain 2 224 -137.94 gain 224 2 -139.36 gain 3 4 -90.52 gain 4 3 -91.62 gain 3 5 -100.73 gain 5 3 -101.87 gain 3 6 -109.12 gain 6 3 -107.52 gain 3 7 -107.02 gain 7 3 -107.80 gain 3 8 -109.49 gain 8 3 -107.61 gain 3 9 -115.87 gain 9 3 -115.44 gain 3 10 -119.74 gain 10 3 -119.80 gain 3 11 -125.38 gain 11 3 -125.28 gain 3 12 -117.42 gain 12 3 -116.78 gain 3 13 -126.77 gain 13 3 -125.08 gain 3 14 -121.11 gain 14 3 -121.28 gain 3 15 -120.23 gain 15 3 -124.02 gain 3 16 -103.42 gain 16 3 -105.03 gain 3 17 -98.84 gain 17 3 -96.88 gain 3 18 -92.32 gain 18 3 -90.20 gain 3 19 -95.49 gain 19 3 -96.36 gain 3 20 -102.16 gain 20 3 -104.47 gain 3 21 -116.53 gain 21 3 -116.76 gain 3 22 -116.99 gain 22 3 -115.82 gain 3 23 -118.11 gain 23 3 -121.21 gain 3 24 -122.50 gain 24 3 -120.02 gain 3 25 -116.84 gain 25 3 -121.11 gain 3 26 -124.11 gain 26 3 -122.26 gain 3 27 -113.71 gain 27 3 -107.76 gain 3 28 -130.63 gain 28 3 -127.37 gain 3 29 -131.00 gain 29 3 -129.62 gain 3 30 -111.85 gain 30 3 -113.94 gain 3 31 -109.60 gain 31 3 -109.30 gain 3 32 -111.45 gain 32 3 -111.18 gain 3 33 -104.93 gain 33 3 -106.92 gain 3 34 -106.79 gain 34 3 -107.37 gain 3 35 -102.44 gain 35 3 -102.85 gain 3 36 -108.00 gain 36 3 -112.20 gain 3 37 -114.90 gain 37 3 -111.30 gain 3 38 -106.50 gain 38 3 -108.92 gain 3 39 -113.49 gain 39 3 -114.77 gain 3 40 -120.19 gain 40 3 -123.52 gain 3 41 -114.67 gain 41 3 -113.62 gain 3 42 -120.47 gain 42 3 -117.57 gain 3 43 -121.20 gain 43 3 -122.19 gain 3 44 -127.16 gain 44 3 -131.22 gain 3 45 -102.54 gain 45 3 -105.07 gain 3 46 -121.16 gain 46 3 -119.49 gain 3 47 -112.63 gain 47 3 -112.02 gain 3 48 -112.16 gain 48 3 -109.33 gain 3 49 -110.57 gain 49 3 -115.72 gain 3 50 -114.04 gain 50 3 -120.15 gain 3 51 -114.33 gain 51 3 -115.58 gain 3 52 -113.71 gain 52 3 -110.98 gain 3 53 -115.60 gain 53 3 -113.89 gain 3 54 -120.80 gain 54 3 -119.78 gain 3 55 -120.34 gain 55 3 -118.62 gain 3 56 -120.09 gain 56 3 -125.70 gain 3 57 -128.58 gain 57 3 -128.06 gain 3 58 -127.59 gain 58 3 -129.81 gain 3 59 -129.42 gain 59 3 -127.77 gain 3 60 -123.12 gain 60 3 -122.80 gain 3 61 -110.68 gain 61 3 -109.10 gain 3 62 -105.57 gain 62 3 -109.21 gain 3 63 -104.92 gain 63 3 -101.79 gain 3 64 -120.94 gain 64 3 -120.78 gain 3 65 -111.28 gain 65 3 -113.21 gain 3 66 -112.69 gain 66 3 -108.87 gain 3 67 -112.50 gain 67 3 -110.96 gain 3 68 -115.78 gain 68 3 -118.80 gain 3 69 -126.51 gain 69 3 -126.82 gain 3 70 -117.16 gain 70 3 -117.23 gain 3 71 -118.06 gain 71 3 -116.23 gain 3 72 -116.48 gain 72 3 -115.07 gain 3 73 -124.29 gain 73 3 -121.27 gain 3 74 -123.60 gain 74 3 -124.45 gain 3 75 -115.99 gain 75 3 -116.99 gain 3 76 -122.35 gain 76 3 -119.30 gain 3 77 -111.44 gain 77 3 -112.06 gain 3 78 -114.50 gain 78 3 -117.97 gain 3 79 -109.13 gain 79 3 -107.37 gain 3 80 -116.01 gain 80 3 -114.76 gain 3 81 -118.29 gain 81 3 -117.63 gain 3 82 -121.70 gain 82 3 -118.66 gain 3 83 -121.68 gain 83 3 -119.68 gain 3 84 -121.45 gain 84 3 -119.60 gain 3 85 -121.94 gain 85 3 -116.89 gain 3 86 -124.82 gain 86 3 -123.15 gain 3 87 -119.87 gain 87 3 -122.17 gain 3 88 -126.25 gain 88 3 -126.30 gain 3 89 -130.62 gain 89 3 -129.26 gain 3 90 -119.02 gain 90 3 -114.68 gain 3 91 -116.85 gain 91 3 -116.45 gain 3 92 -126.59 gain 92 3 -123.15 gain 3 93 -123.16 gain 93 3 -124.50 gain 3 94 -115.65 gain 94 3 -116.88 gain 3 95 -117.63 gain 95 3 -121.11 gain 3 96 -114.57 gain 96 3 -115.39 gain 3 97 -116.05 gain 97 3 -115.61 gain 3 98 -123.34 gain 98 3 -123.70 gain 3 99 -121.84 gain 99 3 -120.02 gain 3 100 -119.88 gain 100 3 -117.62 gain 3 101 -122.38 gain 101 3 -120.29 gain 3 102 -123.60 gain 102 3 -122.29 gain 3 103 -126.39 gain 103 3 -122.56 gain 3 104 -126.56 gain 104 3 -128.11 gain 3 105 -121.37 gain 105 3 -118.86 gain 3 106 -120.17 gain 106 3 -118.75 gain 3 107 -119.96 gain 107 3 -125.10 gain 3 108 -120.98 gain 108 3 -118.44 gain 3 109 -120.14 gain 109 3 -121.09 gain 3 110 -117.97 gain 110 3 -117.38 gain 3 111 -122.02 gain 111 3 -121.12 gain 3 112 -118.38 gain 112 3 -116.35 gain 3 113 -119.90 gain 113 3 -116.68 gain 3 114 -131.23 gain 114 3 -131.32 gain 3 115 -129.68 gain 115 3 -124.07 gain 3 116 -129.25 gain 116 3 -131.18 gain 3 117 -128.94 gain 117 3 -132.37 gain 3 118 -122.85 gain 118 3 -124.61 gain 3 119 -130.63 gain 119 3 -127.04 gain 3 120 -123.94 gain 120 3 -124.87 gain 3 121 -122.08 gain 121 3 -122.29 gain 3 122 -122.33 gain 122 3 -124.66 gain 3 123 -117.51 gain 123 3 -120.62 gain 3 124 -124.58 gain 124 3 -124.10 gain 3 125 -125.58 gain 125 3 -126.43 gain 3 126 -127.25 gain 126 3 -126.06 gain 3 127 -119.75 gain 127 3 -122.02 gain 3 128 -120.24 gain 128 3 -120.45 gain 3 129 -118.03 gain 129 3 -116.15 gain 3 130 -124.04 gain 130 3 -119.98 gain 3 131 -124.45 gain 131 3 -127.48 gain 3 132 -129.36 gain 132 3 -132.01 gain 3 133 -128.46 gain 133 3 -129.19 gain 3 134 -127.63 gain 134 3 -125.06 gain 3 135 -122.04 gain 135 3 -123.04 gain 3 136 -126.63 gain 136 3 -128.24 gain 3 137 -124.45 gain 137 3 -123.54 gain 3 138 -126.16 gain 138 3 -124.25 gain 3 139 -121.51 gain 139 3 -120.58 gain 3 140 -127.00 gain 140 3 -128.69 gain 3 141 -125.67 gain 141 3 -126.03 gain 3 142 -125.58 gain 142 3 -125.24 gain 3 143 -124.71 gain 143 3 -123.98 gain 3 144 -127.93 gain 144 3 -128.23 gain 3 145 -124.72 gain 145 3 -123.46 gain 3 146 -122.98 gain 146 3 -120.63 gain 3 147 -133.92 gain 147 3 -128.66 gain 3 148 -129.75 gain 148 3 -124.21 gain 3 149 -118.95 gain 149 3 -116.58 gain 3 150 -122.05 gain 150 3 -122.36 gain 3 151 -134.39 gain 151 3 -134.90 gain 3 152 -124.70 gain 152 3 -122.18 gain 3 153 -126.50 gain 153 3 -121.57 gain 3 154 -127.72 gain 154 3 -131.33 gain 3 155 -126.17 gain 155 3 -129.68 gain 3 156 -128.01 gain 156 3 -125.91 gain 3 157 -125.90 gain 157 3 -126.74 gain 3 158 -127.16 gain 158 3 -130.60 gain 3 159 -124.87 gain 159 3 -124.92 gain 3 160 -125.43 gain 160 3 -122.60 gain 3 161 -122.68 gain 161 3 -123.33 gain 3 162 -132.01 gain 162 3 -131.53 gain 3 163 -133.62 gain 163 3 -135.29 gain 3 164 -129.05 gain 164 3 -131.76 gain 3 165 -128.37 gain 165 3 -127.12 gain 3 166 -130.15 gain 166 3 -130.47 gain 3 167 -125.82 gain 167 3 -128.24 gain 3 168 -127.35 gain 168 3 -128.22 gain 3 169 -130.79 gain 169 3 -135.85 gain 3 170 -134.77 gain 170 3 -131.35 gain 3 171 -125.27 gain 171 3 -126.89 gain 3 172 -124.78 gain 172 3 -121.09 gain 3 173 -124.38 gain 173 3 -120.12 gain 3 174 -125.22 gain 174 3 -125.26 gain 3 175 -124.38 gain 175 3 -127.97 gain 3 176 -125.24 gain 176 3 -120.84 gain 3 177 -127.43 gain 177 3 -130.85 gain 3 178 -130.45 gain 178 3 -129.69 gain 3 179 -128.50 gain 179 3 -126.13 gain 3 180 -129.54 gain 180 3 -128.64 gain 3 181 -129.90 gain 181 3 -129.07 gain 3 182 -130.22 gain 182 3 -131.78 gain 3 183 -124.64 gain 183 3 -119.58 gain 3 184 -128.69 gain 184 3 -128.42 gain 3 185 -122.39 gain 185 3 -119.61 gain 3 186 -126.14 gain 186 3 -123.63 gain 3 187 -130.97 gain 187 3 -131.01 gain 3 188 -131.76 gain 188 3 -135.06 gain 3 189 -136.90 gain 189 3 -137.71 gain 3 190 -125.66 gain 190 3 -123.48 gain 3 191 -127.85 gain 191 3 -126.77 gain 3 192 -130.30 gain 192 3 -132.08 gain 3 193 -128.85 gain 193 3 -131.88 gain 3 194 -121.57 gain 194 3 -118.41 gain 3 195 -125.12 gain 195 3 -122.60 gain 3 196 -127.69 gain 196 3 -129.21 gain 3 197 -124.19 gain 197 3 -121.77 gain 3 198 -123.73 gain 198 3 -120.83 gain 3 199 -128.01 gain 199 3 -129.03 gain 3 200 -134.30 gain 200 3 -132.25 gain 3 201 -123.75 gain 201 3 -122.51 gain 3 202 -126.26 gain 202 3 -129.03 gain 3 203 -131.66 gain 203 3 -134.04 gain 3 204 -129.54 gain 204 3 -129.21 gain 3 205 -125.45 gain 205 3 -124.19 gain 3 206 -124.48 gain 206 3 -127.74 gain 3 207 -128.12 gain 207 3 -123.74 gain 3 208 -128.39 gain 208 3 -129.79 gain 3 209 -128.67 gain 209 3 -131.06 gain 3 210 -123.20 gain 210 3 -122.53 gain 3 211 -117.72 gain 211 3 -119.08 gain 3 212 -126.39 gain 212 3 -126.28 gain 3 213 -132.03 gain 213 3 -131.12 gain 3 214 -125.54 gain 214 3 -124.51 gain 3 215 -133.16 gain 215 3 -128.55 gain 3 216 -128.97 gain 216 3 -129.02 gain 3 217 -128.43 gain 217 3 -129.00 gain 3 218 -136.75 gain 218 3 -139.51 gain 3 219 -125.44 gain 219 3 -119.55 gain 3 220 -136.79 gain 220 3 -141.39 gain 3 221 -127.12 gain 221 3 -127.37 gain 3 222 -129.14 gain 222 3 -129.71 gain 3 223 -127.86 gain 223 3 -127.04 gain 3 224 -133.53 gain 224 3 -135.41 gain 4 5 -96.47 gain 5 4 -96.51 gain 4 6 -103.68 gain 6 4 -100.98 gain 4 7 -110.04 gain 7 4 -109.73 gain 4 8 -112.72 gain 8 4 -109.74 gain 4 9 -113.11 gain 9 4 -111.59 gain 4 10 -121.79 gain 10 4 -120.75 gain 4 11 -117.64 gain 11 4 -116.44 gain 4 12 -126.92 gain 12 4 -125.18 gain 4 13 -128.72 gain 13 4 -125.93 gain 4 14 -123.09 gain 14 4 -122.17 gain 4 15 -110.96 gain 15 4 -113.66 gain 4 16 -112.73 gain 16 4 -113.25 gain 4 17 -107.99 gain 17 4 -104.94 gain 4 18 -98.74 gain 18 4 -95.53 gain 4 19 -104.32 gain 19 4 -104.10 gain 4 20 -95.80 gain 20 4 -97.02 gain 4 21 -104.95 gain 21 4 -104.09 gain 4 22 -114.99 gain 22 4 -112.73 gain 4 23 -109.73 gain 23 4 -111.74 gain 4 24 -111.82 gain 24 4 -108.25 gain 4 25 -128.58 gain 25 4 -131.76 gain 4 26 -122.52 gain 26 4 -119.58 gain 4 27 -125.04 gain 27 4 -117.99 gain 4 28 -120.12 gain 28 4 -115.77 gain 4 29 -124.03 gain 29 4 -121.56 gain 4 30 -119.99 gain 30 4 -120.98 gain 4 31 -118.62 gain 31 4 -117.23 gain 4 32 -108.01 gain 32 4 -106.65 gain 4 33 -101.61 gain 33 4 -102.50 gain 4 34 -106.67 gain 34 4 -106.16 gain 4 35 -104.57 gain 35 4 -103.89 gain 4 36 -106.00 gain 36 4 -109.10 gain 4 37 -109.64 gain 37 4 -104.94 gain 4 38 -117.56 gain 38 4 -118.88 gain 4 39 -119.18 gain 39 4 -119.37 gain 4 40 -123.36 gain 40 4 -125.60 gain 4 41 -119.93 gain 41 4 -117.79 gain 4 42 -124.53 gain 42 4 -120.54 gain 4 43 -120.72 gain 43 4 -120.62 gain 4 44 -114.92 gain 44 4 -117.88 gain 4 45 -114.26 gain 45 4 -115.70 gain 4 46 -116.16 gain 46 4 -113.39 gain 4 47 -111.42 gain 47 4 -109.71 gain 4 48 -109.11 gain 48 4 -105.19 gain 4 49 -111.01 gain 49 4 -115.06 gain 4 50 -105.44 gain 50 4 -110.46 gain 4 51 -105.67 gain 51 4 -105.83 gain 4 52 -113.24 gain 52 4 -109.41 gain 4 53 -117.53 gain 53 4 -114.72 gain 4 54 -117.73 gain 54 4 -115.62 gain 4 55 -119.22 gain 55 4 -116.41 gain 4 56 -123.74 gain 56 4 -128.26 gain 4 57 -117.16 gain 57 4 -115.55 gain 4 58 -131.22 gain 58 4 -132.35 gain 4 59 -128.29 gain 59 4 -125.54 gain 4 60 -116.63 gain 60 4 -115.21 gain 4 61 -117.48 gain 61 4 -114.80 gain 4 62 -120.74 gain 62 4 -123.29 gain 4 63 -113.43 gain 63 4 -109.21 gain 4 64 -115.40 gain 64 4 -114.14 gain 4 65 -111.94 gain 65 4 -112.78 gain 4 66 -116.86 gain 66 4 -111.95 gain 4 67 -123.28 gain 67 4 -120.65 gain 4 68 -120.24 gain 68 4 -122.16 gain 4 69 -115.51 gain 69 4 -114.72 gain 4 70 -120.55 gain 70 4 -119.52 gain 4 71 -127.04 gain 71 4 -124.12 gain 4 72 -125.10 gain 72 4 -122.60 gain 4 73 -119.93 gain 73 4 -115.81 gain 4 74 -125.94 gain 74 4 -125.71 gain 4 75 -123.91 gain 75 4 -123.81 gain 4 76 -120.35 gain 76 4 -116.21 gain 4 77 -116.19 gain 77 4 -115.72 gain 4 78 -134.16 gain 78 4 -136.53 gain 4 79 -117.39 gain 79 4 -114.54 gain 4 80 -116.36 gain 80 4 -114.01 gain 4 81 -116.55 gain 81 4 -114.79 gain 4 82 -114.14 gain 82 4 -110.01 gain 4 83 -123.17 gain 83 4 -120.08 gain 4 84 -118.32 gain 84 4 -115.37 gain 4 85 -115.24 gain 85 4 -109.09 gain 4 86 -120.56 gain 86 4 -117.80 gain 4 87 -125.08 gain 87 4 -126.28 gain 4 88 -126.35 gain 88 4 -125.30 gain 4 89 -127.79 gain 89 4 -125.35 gain 4 90 -124.16 gain 90 4 -118.72 gain 4 91 -113.37 gain 91 4 -111.88 gain 4 92 -124.80 gain 92 4 -120.27 gain 4 93 -118.38 gain 93 4 -118.64 gain 4 94 -119.84 gain 94 4 -119.97 gain 4 95 -113.86 gain 95 4 -116.24 gain 4 96 -120.60 gain 96 4 -120.32 gain 4 97 -121.77 gain 97 4 -120.24 gain 4 98 -116.22 gain 98 4 -115.48 gain 4 99 -127.28 gain 99 4 -124.37 gain 4 100 -121.06 gain 100 4 -117.71 gain 4 101 -133.48 gain 101 4 -130.29 gain 4 102 -125.70 gain 102 4 -123.29 gain 4 103 -129.59 gain 103 4 -124.67 gain 4 104 -125.10 gain 104 4 -125.55 gain 4 105 -121.35 gain 105 4 -117.75 gain 4 106 -121.68 gain 106 4 -119.16 gain 4 107 -118.53 gain 107 4 -122.57 gain 4 108 -114.35 gain 108 4 -110.72 gain 4 109 -120.81 gain 109 4 -120.66 gain 4 110 -119.72 gain 110 4 -118.04 gain 4 111 -117.58 gain 111 4 -115.58 gain 4 112 -119.97 gain 112 4 -116.85 gain 4 113 -116.52 gain 113 4 -112.21 gain 4 114 -122.56 gain 114 4 -121.55 gain 4 115 -128.01 gain 115 4 -121.30 gain 4 116 -123.13 gain 116 4 -123.97 gain 4 117 -128.55 gain 117 4 -130.89 gain 4 118 -124.89 gain 118 4 -125.55 gain 4 119 -129.15 gain 119 4 -124.47 gain 4 120 -127.55 gain 120 4 -127.39 gain 4 121 -121.81 gain 121 4 -120.93 gain 4 122 -122.56 gain 122 4 -123.80 gain 4 123 -116.15 gain 123 4 -118.16 gain 4 124 -120.33 gain 124 4 -118.76 gain 4 125 -123.68 gain 125 4 -123.44 gain 4 126 -127.26 gain 126 4 -124.97 gain 4 127 -119.64 gain 127 4 -120.81 gain 4 128 -128.43 gain 128 4 -127.55 gain 4 129 -121.48 gain 129 4 -118.50 gain 4 130 -129.12 gain 130 4 -123.97 gain 4 131 -117.52 gain 131 4 -119.46 gain 4 132 -134.52 gain 132 4 -136.08 gain 4 133 -131.70 gain 133 4 -131.33 gain 4 134 -126.85 gain 134 4 -123.18 gain 4 135 -117.62 gain 135 4 -117.52 gain 4 136 -126.26 gain 136 4 -126.77 gain 4 137 -123.13 gain 137 4 -121.12 gain 4 138 -122.67 gain 138 4 -119.67 gain 4 139 -116.38 gain 139 4 -114.36 gain 4 140 -118.38 gain 140 4 -118.97 gain 4 141 -127.22 gain 141 4 -126.48 gain 4 142 -120.44 gain 142 4 -119.00 gain 4 143 -126.25 gain 143 4 -124.43 gain 4 144 -133.72 gain 144 4 -132.92 gain 4 145 -125.46 gain 145 4 -123.11 gain 4 146 -125.83 gain 146 4 -122.39 gain 4 147 -131.28 gain 147 4 -124.92 gain 4 148 -124.54 gain 148 4 -117.91 gain 4 149 -121.58 gain 149 4 -118.12 gain 4 150 -122.52 gain 150 4 -121.74 gain 4 151 -125.64 gain 151 4 -125.05 gain 4 152 -121.53 gain 152 4 -117.92 gain 4 153 -127.69 gain 153 4 -121.66 gain 4 154 -128.02 gain 154 4 -130.54 gain 4 155 -126.97 gain 155 4 -129.39 gain 4 156 -122.89 gain 156 4 -119.69 gain 4 157 -124.59 gain 157 4 -124.34 gain 4 158 -119.71 gain 158 4 -122.06 gain 4 159 -133.16 gain 159 4 -132.13 gain 4 160 -126.29 gain 160 4 -122.36 gain 4 161 -128.44 gain 161 4 -128.01 gain 4 162 -123.62 gain 162 4 -122.05 gain 4 163 -132.29 gain 163 4 -132.87 gain 4 164 -128.82 gain 164 4 -130.44 gain 4 165 -122.21 gain 165 4 -119.87 gain 4 166 -126.95 gain 166 4 -126.18 gain 4 167 -127.44 gain 167 4 -128.76 gain 4 168 -126.20 gain 168 4 -125.96 gain 4 169 -127.15 gain 169 4 -131.12 gain 4 170 -124.45 gain 170 4 -119.94 gain 4 171 -128.55 gain 171 4 -129.06 gain 4 172 -134.13 gain 172 4 -129.35 gain 4 173 -124.81 gain 173 4 -119.46 gain 4 174 -127.46 gain 174 4 -126.41 gain 4 175 -129.16 gain 175 4 -131.66 gain 4 176 -122.67 gain 176 4 -117.18 gain 4 177 -126.65 gain 177 4 -128.98 gain 4 178 -121.51 gain 178 4 -119.66 gain 4 179 -130.79 gain 179 4 -127.33 gain 4 180 -123.22 gain 180 4 -121.23 gain 4 181 -128.23 gain 181 4 -126.31 gain 4 182 -122.33 gain 182 4 -122.80 gain 4 183 -125.32 gain 183 4 -119.17 gain 4 184 -124.08 gain 184 4 -122.71 gain 4 185 -126.87 gain 185 4 -122.99 gain 4 186 -129.35 gain 186 4 -125.75 gain 4 187 -126.68 gain 187 4 -125.62 gain 4 188 -131.78 gain 188 4 -133.99 gain 4 189 -135.05 gain 189 4 -134.77 gain 4 190 -134.40 gain 190 4 -131.13 gain 4 191 -126.07 gain 191 4 -123.89 gain 4 192 -132.52 gain 192 4 -133.21 gain 4 193 -133.04 gain 193 4 -134.98 gain 4 194 -132.75 gain 194 4 -128.49 gain 4 195 -124.43 gain 195 4 -120.82 gain 4 196 -131.50 gain 196 4 -131.93 gain 4 197 -128.95 gain 197 4 -125.44 gain 4 198 -132.73 gain 198 4 -128.74 gain 4 199 -123.03 gain 199 4 -122.95 gain 4 200 -130.88 gain 200 4 -127.75 gain 4 201 -127.42 gain 201 4 -125.09 gain 4 202 -128.22 gain 202 4 -129.88 gain 4 203 -132.67 gain 203 4 -133.96 gain 4 204 -133.67 gain 204 4 -132.24 gain 4 205 -126.46 gain 205 4 -124.11 gain 4 206 -131.56 gain 206 4 -133.73 gain 4 207 -139.01 gain 207 4 -133.54 gain 4 208 -129.51 gain 208 4 -129.81 gain 4 209 -139.16 gain 209 4 -140.45 gain 4 210 -130.32 gain 210 4 -128.56 gain 4 211 -124.33 gain 211 4 -124.58 gain 4 212 -136.30 gain 212 4 -135.10 gain 4 213 -128.00 gain 213 4 -125.99 gain 4 214 -127.03 gain 214 4 -124.91 gain 4 215 -130.07 gain 215 4 -124.36 gain 4 216 -133.87 gain 216 4 -132.82 gain 4 217 -129.05 gain 217 4 -128.52 gain 4 218 -123.50 gain 218 4 -125.16 gain 4 219 -133.35 gain 219 4 -126.37 gain 4 220 -134.75 gain 220 4 -138.26 gain 4 221 -131.18 gain 221 4 -130.33 gain 4 222 -126.13 gain 222 4 -125.61 gain 4 223 -134.48 gain 223 4 -132.58 gain 4 224 -133.53 gain 224 4 -134.31 gain 5 6 -94.56 gain 6 5 -91.82 gain 5 7 -107.35 gain 7 5 -106.99 gain 5 8 -104.22 gain 8 5 -101.19 gain 5 9 -112.63 gain 9 5 -111.06 gain 5 10 -123.94 gain 10 5 -122.85 gain 5 11 -111.40 gain 11 5 -110.15 gain 5 12 -120.41 gain 12 5 -118.62 gain 5 13 -120.77 gain 13 5 -117.94 gain 5 14 -125.74 gain 14 5 -124.77 gain 5 15 -109.87 gain 15 5 -112.52 gain 5 16 -108.61 gain 16 5 -109.08 gain 5 17 -110.75 gain 17 5 -107.65 gain 5 18 -105.04 gain 18 5 -101.77 gain 5 19 -96.41 gain 19 5 -96.14 gain 5 20 -94.01 gain 20 5 -95.18 gain 5 21 -98.31 gain 21 5 -97.40 gain 5 22 -109.30 gain 22 5 -106.99 gain 5 23 -111.01 gain 23 5 -112.97 gain 5 24 -115.03 gain 24 5 -111.40 gain 5 25 -115.99 gain 25 5 -119.12 gain 5 26 -125.55 gain 26 5 -122.56 gain 5 27 -118.03 gain 27 5 -110.94 gain 5 28 -122.40 gain 28 5 -118.00 gain 5 29 -129.26 gain 29 5 -126.74 gain 5 30 -120.64 gain 30 5 -121.59 gain 5 31 -113.79 gain 31 5 -112.36 gain 5 32 -115.49 gain 32 5 -114.09 gain 5 33 -103.86 gain 33 5 -104.71 gain 5 34 -101.56 gain 34 5 -101.00 gain 5 35 -97.11 gain 35 5 -96.38 gain 5 36 -102.76 gain 36 5 -105.81 gain 5 37 -111.62 gain 37 5 -106.88 gain 5 38 -112.61 gain 38 5 -113.88 gain 5 39 -117.19 gain 39 5 -117.32 gain 5 40 -120.27 gain 40 5 -122.46 gain 5 41 -111.67 gain 41 5 -109.49 gain 5 42 -117.00 gain 42 5 -112.96 gain 5 43 -132.36 gain 43 5 -132.22 gain 5 44 -126.04 gain 44 5 -128.95 gain 5 45 -112.88 gain 45 5 -114.27 gain 5 46 -112.80 gain 46 5 -109.98 gain 5 47 -116.05 gain 47 5 -114.29 gain 5 48 -112.18 gain 48 5 -108.21 gain 5 49 -110.74 gain 49 5 -114.74 gain 5 50 -108.49 gain 50 5 -113.46 gain 5 51 -109.55 gain 51 5 -109.66 gain 5 52 -108.31 gain 52 5 -104.43 gain 5 53 -114.03 gain 53 5 -111.17 gain 5 54 -116.18 gain 54 5 -114.02 gain 5 55 -124.42 gain 55 5 -121.56 gain 5 56 -123.26 gain 56 5 -127.73 gain 5 57 -121.05 gain 57 5 -119.39 gain 5 58 -124.76 gain 58 5 -125.85 gain 5 59 -121.51 gain 59 5 -118.71 gain 5 60 -117.39 gain 60 5 -115.93 gain 5 61 -114.57 gain 61 5 -111.85 gain 5 62 -115.16 gain 62 5 -117.66 gain 5 63 -112.30 gain 63 5 -108.03 gain 5 64 -105.70 gain 64 5 -104.40 gain 5 65 -111.60 gain 65 5 -112.39 gain 5 66 -114.15 gain 66 5 -109.20 gain 5 67 -116.97 gain 67 5 -114.28 gain 5 68 -111.98 gain 68 5 -113.86 gain 5 69 -117.33 gain 69 5 -116.50 gain 5 70 -110.37 gain 70 5 -109.29 gain 5 71 -118.90 gain 71 5 -115.93 gain 5 72 -116.28 gain 72 5 -113.72 gain 5 73 -112.59 gain 73 5 -108.43 gain 5 74 -114.68 gain 74 5 -114.40 gain 5 75 -125.89 gain 75 5 -125.75 gain 5 76 -118.61 gain 76 5 -114.41 gain 5 77 -122.65 gain 77 5 -122.12 gain 5 78 -114.44 gain 78 5 -116.76 gain 5 79 -116.02 gain 79 5 -113.13 gain 5 80 -118.27 gain 80 5 -115.87 gain 5 81 -113.95 gain 81 5 -112.14 gain 5 82 -118.62 gain 82 5 -114.45 gain 5 83 -125.45 gain 83 5 -122.31 gain 5 84 -131.73 gain 84 5 -128.73 gain 5 85 -127.11 gain 85 5 -120.92 gain 5 86 -118.93 gain 86 5 -116.12 gain 5 87 -118.42 gain 87 5 -119.58 gain 5 88 -118.09 gain 88 5 -117.00 gain 5 89 -123.95 gain 89 5 -121.45 gain 5 90 -121.04 gain 90 5 -115.55 gain 5 91 -108.36 gain 91 5 -106.82 gain 5 92 -120.27 gain 92 5 -115.69 gain 5 93 -124.33 gain 93 5 -124.53 gain 5 94 -122.30 gain 94 5 -122.38 gain 5 95 -115.48 gain 95 5 -117.82 gain 5 96 -116.24 gain 96 5 -115.92 gain 5 97 -118.60 gain 97 5 -117.02 gain 5 98 -120.22 gain 98 5 -119.44 gain 5 99 -126.84 gain 99 5 -123.88 gain 5 100 -124.03 gain 100 5 -120.63 gain 5 101 -125.00 gain 101 5 -121.76 gain 5 102 -125.39 gain 102 5 -122.93 gain 5 103 -123.20 gain 103 5 -118.23 gain 5 104 -123.51 gain 104 5 -123.92 gain 5 105 -117.69 gain 105 5 -114.04 gain 5 106 -119.97 gain 106 5 -117.41 gain 5 107 -117.96 gain 107 5 -121.96 gain 5 108 -125.13 gain 108 5 -121.44 gain 5 109 -122.83 gain 109 5 -122.63 gain 5 110 -123.21 gain 110 5 -121.49 gain 5 111 -130.04 gain 111 5 -127.99 gain 5 112 -120.60 gain 112 5 -117.44 gain 5 113 -118.90 gain 113 5 -114.54 gain 5 114 -120.30 gain 114 5 -119.24 gain 5 115 -126.87 gain 115 5 -120.11 gain 5 116 -120.85 gain 116 5 -121.64 gain 5 117 -127.91 gain 117 5 -130.20 gain 5 118 -125.55 gain 118 5 -126.16 gain 5 119 -128.62 gain 119 5 -123.89 gain 5 120 -124.82 gain 120 5 -124.61 gain 5 121 -126.81 gain 121 5 -125.88 gain 5 122 -116.31 gain 122 5 -117.50 gain 5 123 -125.32 gain 123 5 -127.29 gain 5 124 -116.84 gain 124 5 -115.21 gain 5 125 -118.99 gain 125 5 -118.70 gain 5 126 -123.83 gain 126 5 -121.49 gain 5 127 -117.43 gain 127 5 -118.56 gain 5 128 -123.48 gain 128 5 -122.55 gain 5 129 -120.00 gain 129 5 -116.98 gain 5 130 -124.46 gain 130 5 -119.26 gain 5 131 -128.55 gain 131 5 -130.44 gain 5 132 -119.11 gain 132 5 -120.62 gain 5 133 -124.82 gain 133 5 -124.41 gain 5 134 -128.06 gain 134 5 -124.34 gain 5 135 -128.98 gain 135 5 -128.83 gain 5 136 -123.08 gain 136 5 -123.54 gain 5 137 -122.03 gain 137 5 -119.98 gain 5 138 -128.26 gain 138 5 -125.21 gain 5 139 -121.34 gain 139 5 -119.28 gain 5 140 -123.42 gain 140 5 -123.97 gain 5 141 -121.06 gain 141 5 -120.28 gain 5 142 -125.87 gain 142 5 -124.39 gain 5 143 -124.57 gain 143 5 -122.71 gain 5 144 -115.64 gain 144 5 -114.79 gain 5 145 -118.20 gain 145 5 -115.80 gain 5 146 -126.62 gain 146 5 -123.14 gain 5 147 -124.44 gain 147 5 -118.04 gain 5 148 -129.00 gain 148 5 -122.32 gain 5 149 -135.24 gain 149 5 -131.72 gain 5 150 -126.06 gain 150 5 -125.24 gain 5 151 -131.42 gain 151 5 -130.79 gain 5 152 -128.55 gain 152 5 -124.90 gain 5 153 -116.00 gain 153 5 -109.93 gain 5 154 -126.98 gain 154 5 -129.45 gain 5 155 -131.57 gain 155 5 -133.94 gain 5 156 -118.02 gain 156 5 -114.78 gain 5 157 -130.15 gain 157 5 -129.85 gain 5 158 -127.13 gain 158 5 -129.42 gain 5 159 -115.60 gain 159 5 -114.52 gain 5 160 -123.00 gain 160 5 -119.03 gain 5 161 -125.00 gain 161 5 -124.52 gain 5 162 -131.24 gain 162 5 -129.62 gain 5 163 -126.83 gain 163 5 -127.36 gain 5 164 -130.72 gain 164 5 -132.29 gain 5 165 -123.64 gain 165 5 -121.25 gain 5 166 -129.04 gain 166 5 -128.22 gain 5 167 -126.81 gain 167 5 -128.08 gain 5 168 -116.37 gain 168 5 -116.09 gain 5 169 -126.14 gain 169 5 -130.06 gain 5 170 -124.74 gain 170 5 -120.19 gain 5 171 -122.63 gain 171 5 -123.10 gain 5 172 -124.95 gain 172 5 -120.12 gain 5 173 -125.95 gain 173 5 -120.55 gain 5 174 -128.61 gain 174 5 -127.51 gain 5 175 -124.27 gain 175 5 -126.72 gain 5 176 -128.08 gain 176 5 -122.54 gain 5 177 -132.16 gain 177 5 -134.44 gain 5 178 -126.32 gain 178 5 -124.42 gain 5 179 -129.65 gain 179 5 -126.14 gain 5 180 -124.64 gain 180 5 -122.60 gain 5 181 -122.83 gain 181 5 -120.86 gain 5 182 -130.53 gain 182 5 -130.94 gain 5 183 -123.97 gain 183 5 -117.78 gain 5 184 -123.79 gain 184 5 -122.38 gain 5 185 -130.77 gain 185 5 -126.84 gain 5 186 -119.35 gain 186 5 -115.71 gain 5 187 -133.19 gain 187 5 -132.09 gain 5 188 -126.99 gain 188 5 -129.14 gain 5 189 -126.07 gain 189 5 -125.74 gain 5 190 -140.40 gain 190 5 -137.09 gain 5 191 -129.58 gain 191 5 -127.35 gain 5 192 -127.88 gain 192 5 -128.52 gain 5 193 -140.34 gain 193 5 -142.23 gain 5 194 -133.69 gain 194 5 -129.39 gain 5 195 -137.80 gain 195 5 -134.14 gain 5 196 -130.94 gain 196 5 -131.31 gain 5 197 -127.69 gain 197 5 -124.13 gain 5 198 -124.21 gain 198 5 -120.17 gain 5 199 -131.90 gain 199 5 -131.78 gain 5 200 -129.05 gain 200 5 -125.86 gain 5 201 -126.52 gain 201 5 -124.14 gain 5 202 -135.67 gain 202 5 -137.29 gain 5 203 -120.81 gain 203 5 -122.05 gain 5 204 -127.06 gain 204 5 -125.58 gain 5 205 -132.67 gain 205 5 -130.27 gain 5 206 -133.70 gain 206 5 -135.82 gain 5 207 -125.91 gain 207 5 -120.39 gain 5 208 -129.45 gain 208 5 -129.71 gain 5 209 -127.17 gain 209 5 -128.42 gain 5 210 -132.42 gain 210 5 -130.60 gain 5 211 -123.61 gain 211 5 -123.81 gain 5 212 -132.21 gain 212 5 -130.96 gain 5 213 -132.05 gain 213 5 -129.99 gain 5 214 -132.10 gain 214 5 -129.93 gain 5 215 -133.18 gain 215 5 -127.43 gain 5 216 -133.09 gain 216 5 -132.00 gain 5 217 -127.62 gain 217 5 -127.04 gain 5 218 -131.35 gain 218 5 -132.96 gain 5 219 -130.27 gain 219 5 -123.24 gain 5 220 -136.19 gain 220 5 -139.65 gain 5 221 -128.22 gain 221 5 -127.33 gain 5 222 -132.23 gain 222 5 -131.66 gain 5 223 -129.81 gain 223 5 -127.86 gain 5 224 -136.91 gain 224 5 -137.64 gain 6 7 -88.00 gain 7 6 -90.38 gain 6 8 -98.14 gain 8 6 -97.85 gain 6 9 -102.18 gain 9 6 -103.36 gain 6 10 -107.47 gain 10 6 -109.12 gain 6 11 -108.62 gain 11 6 -110.12 gain 6 12 -115.12 gain 12 6 -116.08 gain 6 13 -115.41 gain 13 6 -115.32 gain 6 14 -117.86 gain 14 6 -119.64 gain 6 15 -115.20 gain 15 6 -120.60 gain 6 16 -117.16 gain 16 6 -120.37 gain 6 17 -110.41 gain 17 6 -110.05 gain 6 18 -107.80 gain 18 6 -107.28 gain 6 19 -100.90 gain 19 6 -103.38 gain 6 20 -99.68 gain 20 6 -103.59 gain 6 21 -99.92 gain 21 6 -101.75 gain 6 22 -96.02 gain 22 6 -96.45 gain 6 23 -109.53 gain 23 6 -114.24 gain 6 24 -103.84 gain 24 6 -102.96 gain 6 25 -111.62 gain 25 6 -117.49 gain 6 26 -119.01 gain 26 6 -118.77 gain 6 27 -115.04 gain 27 6 -110.69 gain 6 28 -119.71 gain 28 6 -118.06 gain 6 29 -117.13 gain 29 6 -117.36 gain 6 30 -119.31 gain 30 6 -123.00 gain 6 31 -113.23 gain 31 6 -114.54 gain 6 32 -110.24 gain 32 6 -111.58 gain 6 33 -106.45 gain 33 6 -110.04 gain 6 34 -110.19 gain 34 6 -112.38 gain 6 35 -97.24 gain 35 6 -99.26 gain 6 36 -102.79 gain 36 6 -108.59 gain 6 37 -100.01 gain 37 6 -98.01 gain 6 38 -104.96 gain 38 6 -108.98 gain 6 39 -110.82 gain 39 6 -113.70 gain 6 40 -115.90 gain 40 6 -120.83 gain 6 41 -114.40 gain 41 6 -114.96 gain 6 42 -113.30 gain 42 6 -112.01 gain 6 43 -112.91 gain 43 6 -115.51 gain 6 44 -116.09 gain 44 6 -121.75 gain 6 45 -120.08 gain 45 6 -124.21 gain 6 46 -118.87 gain 46 6 -118.80 gain 6 47 -108.56 gain 47 6 -109.55 gain 6 48 -112.23 gain 48 6 -111.01 gain 6 49 -108.43 gain 49 6 -115.18 gain 6 50 -107.18 gain 50 6 -114.89 gain 6 51 -113.18 gain 51 6 -116.03 gain 6 52 -109.69 gain 52 6 -108.56 gain 6 53 -108.16 gain 53 6 -108.04 gain 6 54 -117.83 gain 54 6 -118.41 gain 6 55 -116.32 gain 55 6 -116.21 gain 6 56 -116.51 gain 56 6 -123.72 gain 6 57 -117.01 gain 57 6 -118.09 gain 6 58 -118.60 gain 58 6 -122.42 gain 6 59 -122.07 gain 59 6 -122.02 gain 6 60 -113.58 gain 60 6 -114.85 gain 6 61 -122.55 gain 61 6 -122.58 gain 6 62 -116.03 gain 62 6 -121.28 gain 6 63 -116.51 gain 63 6 -114.98 gain 6 64 -107.76 gain 64 6 -109.20 gain 6 65 -101.82 gain 65 6 -105.35 gain 6 66 -108.02 gain 66 6 -105.81 gain 6 67 -112.68 gain 67 6 -112.74 gain 6 68 -104.11 gain 68 6 -108.74 gain 6 69 -117.92 gain 69 6 -119.83 gain 6 70 -118.71 gain 70 6 -120.38 gain 6 71 -109.11 gain 71 6 -108.88 gain 6 72 -112.29 gain 72 6 -112.48 gain 6 73 -124.81 gain 73 6 -123.40 gain 6 74 -123.04 gain 74 6 -125.50 gain 6 75 -117.05 gain 75 6 -119.65 gain 6 76 -121.08 gain 76 6 -119.63 gain 6 77 -119.73 gain 77 6 -121.95 gain 6 78 -118.41 gain 78 6 -123.47 gain 6 79 -120.45 gain 79 6 -120.29 gain 6 80 -114.00 gain 80 6 -114.35 gain 6 81 -112.34 gain 81 6 -113.28 gain 6 82 -112.44 gain 82 6 -111.01 gain 6 83 -104.75 gain 83 6 -104.35 gain 6 84 -118.16 gain 84 6 -117.90 gain 6 85 -116.52 gain 85 6 -113.08 gain 6 86 -111.05 gain 86 6 -110.99 gain 6 87 -113.65 gain 87 6 -117.55 gain 6 88 -110.22 gain 88 6 -111.87 gain 6 89 -120.13 gain 89 6 -120.38 gain 6 90 -129.07 gain 90 6 -126.33 gain 6 91 -127.72 gain 91 6 -128.92 gain 6 92 -123.99 gain 92 6 -122.15 gain 6 93 -123.36 gain 93 6 -126.31 gain 6 94 -121.22 gain 94 6 -124.05 gain 6 95 -113.87 gain 95 6 -118.95 gain 6 96 -113.79 gain 96 6 -116.21 gain 6 97 -109.70 gain 97 6 -110.86 gain 6 98 -118.47 gain 98 6 -120.43 gain 6 99 -122.42 gain 99 6 -122.20 gain 6 100 -113.09 gain 100 6 -112.44 gain 6 101 -117.58 gain 101 6 -117.09 gain 6 102 -113.30 gain 102 6 -113.59 gain 6 103 -117.19 gain 103 6 -114.96 gain 6 104 -116.79 gain 104 6 -119.94 gain 6 105 -122.44 gain 105 6 -121.53 gain 6 106 -119.68 gain 106 6 -119.85 gain 6 107 -120.84 gain 107 6 -127.58 gain 6 108 -112.11 gain 108 6 -111.17 gain 6 109 -116.55 gain 109 6 -119.10 gain 6 110 -118.57 gain 110 6 -119.59 gain 6 111 -115.70 gain 111 6 -116.40 gain 6 112 -123.14 gain 112 6 -122.72 gain 6 113 -116.85 gain 113 6 -115.23 gain 6 114 -122.32 gain 114 6 -124.01 gain 6 115 -118.79 gain 115 6 -114.78 gain 6 116 -122.43 gain 116 6 -125.96 gain 6 117 -125.08 gain 117 6 -130.11 gain 6 118 -128.68 gain 118 6 -132.03 gain 6 119 -123.54 gain 119 6 -121.56 gain 6 120 -115.89 gain 120 6 -118.42 gain 6 121 -126.21 gain 121 6 -128.03 gain 6 122 -120.73 gain 122 6 -124.67 gain 6 123 -125.27 gain 123 6 -129.98 gain 6 124 -118.11 gain 124 6 -119.23 gain 6 125 -110.72 gain 125 6 -113.18 gain 6 126 -116.97 gain 126 6 -117.38 gain 6 127 -109.21 gain 127 6 -113.09 gain 6 128 -123.90 gain 128 6 -125.71 gain 6 129 -122.88 gain 129 6 -122.60 gain 6 130 -124.30 gain 130 6 -121.85 gain 6 131 -123.97 gain 131 6 -128.60 gain 6 132 -115.73 gain 132 6 -119.99 gain 6 133 -125.54 gain 133 6 -127.87 gain 6 134 -134.39 gain 134 6 -133.42 gain 6 135 -126.29 gain 135 6 -128.89 gain 6 136 -126.57 gain 136 6 -129.78 gain 6 137 -123.84 gain 137 6 -124.53 gain 6 138 -123.94 gain 138 6 -123.63 gain 6 139 -121.37 gain 139 6 -122.05 gain 6 140 -111.62 gain 140 6 -114.90 gain 6 141 -116.09 gain 141 6 -118.05 gain 6 142 -118.31 gain 142 6 -119.57 gain 6 143 -132.26 gain 143 6 -133.14 gain 6 144 -127.19 gain 144 6 -129.09 gain 6 145 -123.58 gain 145 6 -123.93 gain 6 146 -119.38 gain 146 6 -118.64 gain 6 147 -114.04 gain 147 6 -110.39 gain 6 148 -124.92 gain 148 6 -120.98 gain 6 149 -123.61 gain 149 6 -122.84 gain 6 150 -128.35 gain 150 6 -130.27 gain 6 151 -117.80 gain 151 6 -119.91 gain 6 152 -118.40 gain 152 6 -117.49 gain 6 153 -122.15 gain 153 6 -118.82 gain 6 154 -121.39 gain 154 6 -126.61 gain 6 155 -113.93 gain 155 6 -119.04 gain 6 156 -117.03 gain 156 6 -116.53 gain 6 157 -119.86 gain 157 6 -122.31 gain 6 158 -123.27 gain 158 6 -128.31 gain 6 159 -125.46 gain 159 6 -127.12 gain 6 160 -116.23 gain 160 6 -114.99 gain 6 161 -127.12 gain 161 6 -129.38 gain 6 162 -118.87 gain 162 6 -119.99 gain 6 163 -123.83 gain 163 6 -127.10 gain 6 164 -131.11 gain 164 6 -135.42 gain 6 165 -127.76 gain 165 6 -128.12 gain 6 166 -135.93 gain 166 6 -137.86 gain 6 167 -127.26 gain 167 6 -131.27 gain 6 168 -118.43 gain 168 6 -120.90 gain 6 169 -119.29 gain 169 6 -125.96 gain 6 170 -122.12 gain 170 6 -120.31 gain 6 171 -125.69 gain 171 6 -128.90 gain 6 172 -121.77 gain 172 6 -119.68 gain 6 173 -125.88 gain 173 6 -123.22 gain 6 174 -116.88 gain 174 6 -118.52 gain 6 175 -126.90 gain 175 6 -132.09 gain 6 176 -126.21 gain 176 6 -123.42 gain 6 177 -129.33 gain 177 6 -134.35 gain 6 178 -128.27 gain 178 6 -129.12 gain 6 179 -133.05 gain 179 6 -132.28 gain 6 180 -126.26 gain 180 6 -126.97 gain 6 181 -121.85 gain 181 6 -122.63 gain 6 182 -120.56 gain 182 6 -123.72 gain 6 183 -131.41 gain 183 6 -127.95 gain 6 184 -124.71 gain 184 6 -126.04 gain 6 185 -122.27 gain 185 6 -121.08 gain 6 186 -120.95 gain 186 6 -120.05 gain 6 187 -127.71 gain 187 6 -129.35 gain 6 188 -123.88 gain 188 6 -128.78 gain 6 189 -128.40 gain 189 6 -130.82 gain 6 190 -124.26 gain 190 6 -123.68 gain 6 191 -122.31 gain 191 6 -122.83 gain 6 192 -120.55 gain 192 6 -123.93 gain 6 193 -126.86 gain 193 6 -131.49 gain 6 194 -126.31 gain 194 6 -124.76 gain 6 195 -128.43 gain 195 6 -127.51 gain 6 196 -129.50 gain 196 6 -132.62 gain 6 197 -122.02 gain 197 6 -121.21 gain 6 198 -123.45 gain 198 6 -122.15 gain 6 199 -127.09 gain 199 6 -129.71 gain 6 200 -131.06 gain 200 6 -130.62 gain 6 201 -127.92 gain 201 6 -128.28 gain 6 202 -129.97 gain 202 6 -134.34 gain 6 203 -123.35 gain 203 6 -127.33 gain 6 204 -121.62 gain 204 6 -122.89 gain 6 205 -132.94 gain 205 6 -133.28 gain 6 206 -124.20 gain 206 6 -129.07 gain 6 207 -116.65 gain 207 6 -113.88 gain 6 208 -132.01 gain 208 6 -135.01 gain 6 209 -128.31 gain 209 6 -132.30 gain 6 210 -126.53 gain 210 6 -127.46 gain 6 211 -128.35 gain 211 6 -131.31 gain 6 212 -126.90 gain 212 6 -128.40 gain 6 213 -126.93 gain 213 6 -127.62 gain 6 214 -127.99 gain 214 6 -128.57 gain 6 215 -120.94 gain 215 6 -117.93 gain 6 216 -129.42 gain 216 6 -131.07 gain 6 217 -124.21 gain 217 6 -126.38 gain 6 218 -124.85 gain 218 6 -129.21 gain 6 219 -123.91 gain 219 6 -119.63 gain 6 220 -127.46 gain 220 6 -133.67 gain 6 221 -131.93 gain 221 6 -133.78 gain 6 222 -128.87 gain 222 6 -131.05 gain 6 223 -125.00 gain 223 6 -125.79 gain 6 224 -125.09 gain 224 6 -128.57 gain 7 8 -92.57 gain 8 7 -89.91 gain 7 9 -98.30 gain 9 7 -97.10 gain 7 10 -115.20 gain 10 7 -114.47 gain 7 11 -115.00 gain 11 7 -114.11 gain 7 12 -117.36 gain 12 7 -115.94 gain 7 13 -121.06 gain 13 7 -118.59 gain 7 14 -123.63 gain 14 7 -123.02 gain 7 15 -119.58 gain 15 7 -122.59 gain 7 16 -115.55 gain 16 7 -116.38 gain 7 17 -121.51 gain 17 7 -118.77 gain 7 18 -111.87 gain 18 7 -108.97 gain 7 19 -107.54 gain 19 7 -107.64 gain 7 20 -108.04 gain 20 7 -109.57 gain 7 21 -106.07 gain 21 7 -105.53 gain 7 22 -93.48 gain 22 7 -91.53 gain 7 23 -104.03 gain 23 7 -106.35 gain 7 24 -106.31 gain 24 7 -103.05 gain 7 25 -114.32 gain 25 7 -117.81 gain 7 26 -108.99 gain 26 7 -106.37 gain 7 27 -116.39 gain 27 7 -109.66 gain 7 28 -123.86 gain 28 7 -119.82 gain 7 29 -118.56 gain 29 7 -116.40 gain 7 30 -120.36 gain 30 7 -121.67 gain 7 31 -117.40 gain 31 7 -116.32 gain 7 32 -104.84 gain 32 7 -103.79 gain 7 33 -117.87 gain 33 7 -119.08 gain 7 34 -114.11 gain 34 7 -113.92 gain 7 35 -105.64 gain 35 7 -105.28 gain 7 36 -109.84 gain 36 7 -113.25 gain 7 37 -102.46 gain 37 7 -98.07 gain 7 38 -104.14 gain 38 7 -105.78 gain 7 39 -102.95 gain 39 7 -103.45 gain 7 40 -114.08 gain 40 7 -116.63 gain 7 41 -112.49 gain 41 7 -110.67 gain 7 42 -118.00 gain 42 7 -114.33 gain 7 43 -118.40 gain 43 7 -118.62 gain 7 44 -126.42 gain 44 7 -129.69 gain 7 45 -114.61 gain 45 7 -116.36 gain 7 46 -122.08 gain 46 7 -119.62 gain 7 47 -113.55 gain 47 7 -112.15 gain 7 48 -114.94 gain 48 7 -111.34 gain 7 49 -109.81 gain 49 7 -114.18 gain 7 50 -116.15 gain 50 7 -121.48 gain 7 51 -106.93 gain 51 7 -107.40 gain 7 52 -108.64 gain 52 7 -105.13 gain 7 53 -117.96 gain 53 7 -115.46 gain 7 54 -106.65 gain 54 7 -104.85 gain 7 55 -119.95 gain 55 7 -117.45 gain 7 56 -113.44 gain 56 7 -118.27 gain 7 57 -117.55 gain 57 7 -116.25 gain 7 58 -128.79 gain 58 7 -130.24 gain 7 59 -122.14 gain 59 7 -119.71 gain 7 60 -124.20 gain 60 7 -123.09 gain 7 61 -120.63 gain 61 7 -118.28 gain 7 62 -117.96 gain 62 7 -120.82 gain 7 63 -115.24 gain 63 7 -111.32 gain 7 64 -119.53 gain 64 7 -118.59 gain 7 65 -115.68 gain 65 7 -116.83 gain 7 66 -114.19 gain 66 7 -109.60 gain 7 67 -116.22 gain 67 7 -113.90 gain 7 68 -112.40 gain 68 7 -114.64 gain 7 69 -111.06 gain 69 7 -110.60 gain 7 70 -113.60 gain 70 7 -112.89 gain 7 71 -117.94 gain 71 7 -115.33 gain 7 72 -117.04 gain 72 7 -114.85 gain 7 73 -124.04 gain 73 7 -120.24 gain 7 74 -123.31 gain 74 7 -123.39 gain 7 75 -118.25 gain 75 7 -118.47 gain 7 76 -117.76 gain 76 7 -113.93 gain 7 77 -111.89 gain 77 7 -111.72 gain 7 78 -115.95 gain 78 7 -118.63 gain 7 79 -117.25 gain 79 7 -114.71 gain 7 80 -119.44 gain 80 7 -117.40 gain 7 81 -121.78 gain 81 7 -120.34 gain 7 82 -116.72 gain 82 7 -112.90 gain 7 83 -113.90 gain 83 7 -111.11 gain 7 84 -111.89 gain 84 7 -109.26 gain 7 85 -115.56 gain 85 7 -109.73 gain 7 86 -115.27 gain 86 7 -112.83 gain 7 87 -123.32 gain 87 7 -124.84 gain 7 88 -122.63 gain 88 7 -121.90 gain 7 89 -127.13 gain 89 7 -125.00 gain 7 90 -123.09 gain 90 7 -117.97 gain 7 91 -123.64 gain 91 7 -122.46 gain 7 92 -128.90 gain 92 7 -124.69 gain 7 93 -122.27 gain 93 7 -122.84 gain 7 94 -117.90 gain 94 7 -118.34 gain 7 95 -114.96 gain 95 7 -117.66 gain 7 96 -124.55 gain 96 7 -124.59 gain 7 97 -114.41 gain 97 7 -113.20 gain 7 98 -110.72 gain 98 7 -110.30 gain 7 99 -118.74 gain 99 7 -116.14 gain 7 100 -124.46 gain 100 7 -121.43 gain 7 101 -125.44 gain 101 7 -122.57 gain 7 102 -122.12 gain 102 7 -120.03 gain 7 103 -128.97 gain 103 7 -124.36 gain 7 104 -129.15 gain 104 7 -129.92 gain 7 105 -119.11 gain 105 7 -115.83 gain 7 106 -126.90 gain 106 7 -124.69 gain 7 107 -125.35 gain 107 7 -129.71 gain 7 108 -124.63 gain 108 7 -121.31 gain 7 109 -127.52 gain 109 7 -127.69 gain 7 110 -121.32 gain 110 7 -119.96 gain 7 111 -119.25 gain 111 7 -117.56 gain 7 112 -122.95 gain 112 7 -120.15 gain 7 113 -126.44 gain 113 7 -122.44 gain 7 114 -119.39 gain 114 7 -118.70 gain 7 115 -121.11 gain 115 7 -114.72 gain 7 116 -130.32 gain 116 7 -131.48 gain 7 117 -122.36 gain 117 7 -125.01 gain 7 118 -122.22 gain 118 7 -123.19 gain 7 119 -114.02 gain 119 7 -109.65 gain 7 120 -121.13 gain 120 7 -121.28 gain 7 121 -127.11 gain 121 7 -126.55 gain 7 122 -126.06 gain 122 7 -127.62 gain 7 123 -118.83 gain 123 7 -121.16 gain 7 124 -129.92 gain 124 7 -128.66 gain 7 125 -121.65 gain 125 7 -121.73 gain 7 126 -119.44 gain 126 7 -117.46 gain 7 127 -121.99 gain 127 7 -123.48 gain 7 128 -126.19 gain 128 7 -125.63 gain 7 129 -133.01 gain 129 7 -130.35 gain 7 130 -120.05 gain 130 7 -115.21 gain 7 131 -121.89 gain 131 7 -124.14 gain 7 132 -127.28 gain 132 7 -129.15 gain 7 133 -120.32 gain 133 7 -120.27 gain 7 134 -130.15 gain 134 7 -126.80 gain 7 135 -125.30 gain 135 7 -125.51 gain 7 136 -129.83 gain 136 7 -130.66 gain 7 137 -122.83 gain 137 7 -121.14 gain 7 138 -121.52 gain 138 7 -118.83 gain 7 139 -122.87 gain 139 7 -121.17 gain 7 140 -125.27 gain 140 7 -126.18 gain 7 141 -121.32 gain 141 7 -120.89 gain 7 142 -122.15 gain 142 7 -121.03 gain 7 143 -124.43 gain 143 7 -122.92 gain 7 144 -122.80 gain 144 7 -122.32 gain 7 145 -129.47 gain 145 7 -127.44 gain 7 146 -125.70 gain 146 7 -122.58 gain 7 147 -127.99 gain 147 7 -121.96 gain 7 148 -130.10 gain 148 7 -123.78 gain 7 149 -128.66 gain 149 7 -125.51 gain 7 150 -123.34 gain 150 7 -122.87 gain 7 151 -132.57 gain 151 7 -132.30 gain 7 152 -122.21 gain 152 7 -118.92 gain 7 153 -122.22 gain 153 7 -116.51 gain 7 154 -122.17 gain 154 7 -125.00 gain 7 155 -126.08 gain 155 7 -128.81 gain 7 156 -126.23 gain 156 7 -123.34 gain 7 157 -123.53 gain 157 7 -123.59 gain 7 158 -115.88 gain 158 7 -118.54 gain 7 159 -126.67 gain 159 7 -125.95 gain 7 160 -127.59 gain 160 7 -123.97 gain 7 161 -128.52 gain 161 7 -128.39 gain 7 162 -130.87 gain 162 7 -129.61 gain 7 163 -127.80 gain 163 7 -128.69 gain 7 164 -122.63 gain 164 7 -124.56 gain 7 165 -130.87 gain 165 7 -128.85 gain 7 166 -126.99 gain 166 7 -126.54 gain 7 167 -127.11 gain 167 7 -128.75 gain 7 168 -120.65 gain 168 7 -120.73 gain 7 169 -127.25 gain 169 7 -131.54 gain 7 170 -116.60 gain 170 7 -112.41 gain 7 171 -134.48 gain 171 7 -135.31 gain 7 172 -128.87 gain 172 7 -124.40 gain 7 173 -122.08 gain 173 7 -117.05 gain 7 174 -125.49 gain 174 7 -124.75 gain 7 175 -128.86 gain 175 7 -131.67 gain 7 176 -131.17 gain 176 7 -126.00 gain 7 177 -124.39 gain 177 7 -127.03 gain 7 178 -118.24 gain 178 7 -116.70 gain 7 179 -126.32 gain 179 7 -123.17 gain 7 180 -132.19 gain 180 7 -130.51 gain 7 181 -129.39 gain 181 7 -127.78 gain 7 182 -124.05 gain 182 7 -124.83 gain 7 183 -130.29 gain 183 7 -124.45 gain 7 184 -124.53 gain 184 7 -123.48 gain 7 185 -127.62 gain 185 7 -124.05 gain 7 186 -125.32 gain 186 7 -122.04 gain 7 187 -127.63 gain 187 7 -126.89 gain 7 188 -122.01 gain 188 7 -124.53 gain 7 189 -123.19 gain 189 7 -123.22 gain 7 190 -123.80 gain 190 7 -120.84 gain 7 191 -125.38 gain 191 7 -123.51 gain 7 192 -129.55 gain 192 7 -130.56 gain 7 193 -130.25 gain 193 7 -132.51 gain 7 194 -126.39 gain 194 7 -122.46 gain 7 195 -121.81 gain 195 7 -118.51 gain 7 196 -122.08 gain 196 7 -122.82 gain 7 197 -124.28 gain 197 7 -121.08 gain 7 198 -125.86 gain 198 7 -122.19 gain 7 199 -121.24 gain 199 7 -121.48 gain 7 200 -132.83 gain 200 7 -130.01 gain 7 201 -131.91 gain 201 7 -129.89 gain 7 202 -120.82 gain 202 7 -122.81 gain 7 203 -126.28 gain 203 7 -127.88 gain 7 204 -130.40 gain 204 7 -129.29 gain 7 205 -132.92 gain 205 7 -130.88 gain 7 206 -126.71 gain 206 7 -129.19 gain 7 207 -127.02 gain 207 7 -121.86 gain 7 208 -126.77 gain 208 7 -127.39 gain 7 209 -131.50 gain 209 7 -133.11 gain 7 210 -126.28 gain 210 7 -124.82 gain 7 211 -133.57 gain 211 7 -134.14 gain 7 212 -139.68 gain 212 7 -138.80 gain 7 213 -127.60 gain 213 7 -125.91 gain 7 214 -127.83 gain 214 7 -126.02 gain 7 215 -125.60 gain 215 7 -120.21 gain 7 216 -125.00 gain 216 7 -124.27 gain 7 217 -126.74 gain 217 7 -126.52 gain 7 218 -128.09 gain 218 7 -130.07 gain 7 219 -129.21 gain 219 7 -122.55 gain 7 220 -131.30 gain 220 7 -135.13 gain 7 221 -126.47 gain 221 7 -125.94 gain 7 222 -127.74 gain 222 7 -127.53 gain 7 223 -125.63 gain 223 7 -124.03 gain 7 224 -131.00 gain 224 7 -132.09 gain 8 9 -90.79 gain 9 8 -92.25 gain 8 10 -99.91 gain 10 8 -101.85 gain 8 11 -113.30 gain 11 8 -115.08 gain 8 12 -108.51 gain 12 8 -109.75 gain 8 13 -116.70 gain 13 8 -116.90 gain 8 14 -111.72 gain 14 8 -113.78 gain 8 15 -125.30 gain 15 8 -130.98 gain 8 16 -116.54 gain 16 8 -120.04 gain 8 17 -110.91 gain 17 8 -110.84 gain 8 18 -119.24 gain 18 8 -119.01 gain 8 19 -110.38 gain 19 8 -113.14 gain 8 20 -106.66 gain 20 8 -110.86 gain 8 21 -105.79 gain 21 8 -107.92 gain 8 22 -98.13 gain 22 8 -98.85 gain 8 23 -81.14 gain 23 8 -86.13 gain 8 24 -96.43 gain 24 8 -95.84 gain 8 25 -103.08 gain 25 8 -109.23 gain 8 26 -111.55 gain 26 8 -111.59 gain 8 27 -116.39 gain 27 8 -112.32 gain 8 28 -112.62 gain 28 8 -111.25 gain 8 29 -112.27 gain 29 8 -112.78 gain 8 30 -128.31 gain 30 8 -132.29 gain 8 31 -122.44 gain 31 8 -124.04 gain 8 32 -125.38 gain 32 8 -127.01 gain 8 33 -118.28 gain 33 8 -122.16 gain 8 34 -102.77 gain 34 8 -105.25 gain 8 35 -105.69 gain 35 8 -107.99 gain 8 36 -111.54 gain 36 8 -117.63 gain 8 37 -102.15 gain 37 8 -100.43 gain 8 38 -100.27 gain 38 8 -104.58 gain 8 39 -100.00 gain 39 8 -103.17 gain 8 40 -98.88 gain 40 8 -104.10 gain 8 41 -113.84 gain 41 8 -114.68 gain 8 42 -113.99 gain 42 8 -112.99 gain 8 43 -119.84 gain 43 8 -122.73 gain 8 44 -115.47 gain 44 8 -121.42 gain 8 45 -116.00 gain 45 8 -120.42 gain 8 46 -113.06 gain 46 8 -113.27 gain 8 47 -115.47 gain 47 8 -116.74 gain 8 48 -111.23 gain 48 8 -110.29 gain 8 49 -111.15 gain 49 8 -118.19 gain 8 50 -110.79 gain 50 8 -118.79 gain 8 51 -104.67 gain 51 8 -107.81 gain 8 52 -104.42 gain 52 8 -103.58 gain 8 53 -94.37 gain 53 8 -94.55 gain 8 54 -101.08 gain 54 8 -101.96 gain 8 55 -104.88 gain 55 8 -105.05 gain 8 56 -111.70 gain 56 8 -119.20 gain 8 57 -117.11 gain 57 8 -118.48 gain 8 58 -112.23 gain 58 8 -116.34 gain 8 59 -115.65 gain 59 8 -115.89 gain 8 60 -112.69 gain 60 8 -114.25 gain 8 61 -122.73 gain 61 8 -123.04 gain 8 62 -118.47 gain 62 8 -124.00 gain 8 63 -116.39 gain 63 8 -115.14 gain 8 64 -112.54 gain 64 8 -114.27 gain 8 65 -107.82 gain 65 8 -111.64 gain 8 66 -113.79 gain 66 8 -111.86 gain 8 67 -114.80 gain 67 8 -115.15 gain 8 68 -107.45 gain 68 8 -112.36 gain 8 69 -112.32 gain 69 8 -114.52 gain 8 70 -114.34 gain 70 8 -116.30 gain 8 71 -106.50 gain 71 8 -106.56 gain 8 72 -114.06 gain 72 8 -114.53 gain 8 73 -113.38 gain 73 8 -112.25 gain 8 74 -116.65 gain 74 8 -119.40 gain 8 75 -121.34 gain 75 8 -124.22 gain 8 76 -124.96 gain 76 8 -123.80 gain 8 77 -121.12 gain 77 8 -123.63 gain 8 78 -112.93 gain 78 8 -118.29 gain 8 79 -122.27 gain 79 8 -122.40 gain 8 80 -121.89 gain 80 8 -122.52 gain 8 81 -107.11 gain 81 8 -108.33 gain 8 82 -115.38 gain 82 8 -114.23 gain 8 83 -108.43 gain 83 8 -108.31 gain 8 84 -115.82 gain 84 8 -115.85 gain 8 85 -108.33 gain 85 8 -105.17 gain 8 86 -118.56 gain 86 8 -118.78 gain 8 87 -119.27 gain 87 8 -123.45 gain 8 88 -122.45 gain 88 8 -124.39 gain 8 89 -116.46 gain 89 8 -117.00 gain 8 90 -114.82 gain 90 8 -112.36 gain 8 91 -120.70 gain 91 8 -122.19 gain 8 92 -117.92 gain 92 8 -116.37 gain 8 93 -115.97 gain 93 8 -119.20 gain 8 94 -105.47 gain 94 8 -108.59 gain 8 95 -116.35 gain 95 8 -121.71 gain 8 96 -118.22 gain 96 8 -120.92 gain 8 97 -116.73 gain 97 8 -118.18 gain 8 98 -119.27 gain 98 8 -121.52 gain 8 99 -122.49 gain 99 8 -122.56 gain 8 100 -111.33 gain 100 8 -110.96 gain 8 101 -117.21 gain 101 8 -117.01 gain 8 102 -114.91 gain 102 8 -115.48 gain 8 103 -117.24 gain 103 8 -115.30 gain 8 104 -121.05 gain 104 8 -124.48 gain 8 105 -120.18 gain 105 8 -119.56 gain 8 106 -121.54 gain 106 8 -122.00 gain 8 107 -127.07 gain 107 8 -134.10 gain 8 108 -118.46 gain 108 8 -117.81 gain 8 109 -118.81 gain 109 8 -121.64 gain 8 110 -121.66 gain 110 8 -122.97 gain 8 111 -120.67 gain 111 8 -121.66 gain 8 112 -115.54 gain 112 8 -115.41 gain 8 113 -115.10 gain 113 8 -113.77 gain 8 114 -118.75 gain 114 8 -120.73 gain 8 115 -116.66 gain 115 8 -112.94 gain 8 116 -115.10 gain 116 8 -118.92 gain 8 117 -124.36 gain 117 8 -129.67 gain 8 118 -116.99 gain 118 8 -120.63 gain 8 119 -115.85 gain 119 8 -114.15 gain 8 120 -119.98 gain 120 8 -122.80 gain 8 121 -124.70 gain 121 8 -126.80 gain 8 122 -118.61 gain 122 8 -122.83 gain 8 123 -122.44 gain 123 8 -127.44 gain 8 124 -124.64 gain 124 8 -126.05 gain 8 125 -128.86 gain 125 8 -131.60 gain 8 126 -117.97 gain 126 8 -118.66 gain 8 127 -127.60 gain 127 8 -131.76 gain 8 128 -118.91 gain 128 8 -121.01 gain 8 129 -123.45 gain 129 8 -123.46 gain 8 130 -120.70 gain 130 8 -118.53 gain 8 131 -129.23 gain 131 8 -134.15 gain 8 132 -120.45 gain 132 8 -124.99 gain 8 133 -118.43 gain 133 8 -121.05 gain 8 134 -113.73 gain 134 8 -113.05 gain 8 135 -124.41 gain 135 8 -127.29 gain 8 136 -124.53 gain 136 8 -128.03 gain 8 137 -123.22 gain 137 8 -124.20 gain 8 138 -115.16 gain 138 8 -115.14 gain 8 139 -127.20 gain 139 8 -128.16 gain 8 140 -120.44 gain 140 8 -124.01 gain 8 141 -123.79 gain 141 8 -126.04 gain 8 142 -122.90 gain 142 8 -124.45 gain 8 143 -124.19 gain 143 8 -125.35 gain 8 144 -117.22 gain 144 8 -119.41 gain 8 145 -117.18 gain 145 8 -117.81 gain 8 146 -121.67 gain 146 8 -121.22 gain 8 147 -126.54 gain 147 8 -123.18 gain 8 148 -123.53 gain 148 8 -119.88 gain 8 149 -122.52 gain 149 8 -122.04 gain 8 150 -117.66 gain 150 8 -119.86 gain 8 151 -128.72 gain 151 8 -131.12 gain 8 152 -120.97 gain 152 8 -120.35 gain 8 153 -118.83 gain 153 8 -115.79 gain 8 154 -128.52 gain 154 8 -134.02 gain 8 155 -118.90 gain 155 8 -124.30 gain 8 156 -118.71 gain 156 8 -118.50 gain 8 157 -118.45 gain 157 8 -121.18 gain 8 158 -116.89 gain 158 8 -122.22 gain 8 159 -122.52 gain 159 8 -124.46 gain 8 160 -120.87 gain 160 8 -119.92 gain 8 161 -122.29 gain 161 8 -124.84 gain 8 162 -123.71 gain 162 8 -125.12 gain 8 163 -121.32 gain 163 8 -124.88 gain 8 164 -122.44 gain 164 8 -127.04 gain 8 165 -124.14 gain 165 8 -124.79 gain 8 166 -118.73 gain 166 8 -120.94 gain 8 167 -125.12 gain 167 8 -129.42 gain 8 168 -129.96 gain 168 8 -132.72 gain 8 169 -116.93 gain 169 8 -123.88 gain 8 170 -122.21 gain 170 8 -120.69 gain 8 171 -125.22 gain 171 8 -128.72 gain 8 172 -118.96 gain 172 8 -117.16 gain 8 173 -123.29 gain 173 8 -120.92 gain 8 174 -127.84 gain 174 8 -129.77 gain 8 175 -128.58 gain 175 8 -134.07 gain 8 176 -124.32 gain 176 8 -121.81 gain 8 177 -124.36 gain 177 8 -129.67 gain 8 178 -122.15 gain 178 8 -123.28 gain 8 179 -123.52 gain 179 8 -123.04 gain 8 180 -123.12 gain 180 8 -124.11 gain 8 181 -127.10 gain 181 8 -128.16 gain 8 182 -125.19 gain 182 8 -128.63 gain 8 183 -118.52 gain 183 8 -115.35 gain 8 184 -123.57 gain 184 8 -125.18 gain 8 185 -129.00 gain 185 8 -128.10 gain 8 186 -122.81 gain 186 8 -122.20 gain 8 187 -124.34 gain 187 8 -126.27 gain 8 188 -124.73 gain 188 8 -129.92 gain 8 189 -125.76 gain 189 8 -128.46 gain 8 190 -125.10 gain 190 8 -124.81 gain 8 191 -131.71 gain 191 8 -132.52 gain 8 192 -122.68 gain 192 8 -126.35 gain 8 193 -129.42 gain 193 8 -134.35 gain 8 194 -128.87 gain 194 8 -127.60 gain 8 195 -126.62 gain 195 8 -125.98 gain 8 196 -131.72 gain 196 8 -135.13 gain 8 197 -123.56 gain 197 8 -123.03 gain 8 198 -122.21 gain 198 8 -121.20 gain 8 199 -123.97 gain 199 8 -126.88 gain 8 200 -122.55 gain 200 8 -122.40 gain 8 201 -125.38 gain 201 8 -126.03 gain 8 202 -125.90 gain 202 8 -130.55 gain 8 203 -123.62 gain 203 8 -127.89 gain 8 204 -126.27 gain 204 8 -127.83 gain 8 205 -128.55 gain 205 8 -129.18 gain 8 206 -130.20 gain 206 8 -135.35 gain 8 207 -121.67 gain 207 8 -119.18 gain 8 208 -129.84 gain 208 8 -133.13 gain 8 209 -119.97 gain 209 8 -124.25 gain 8 210 -125.55 gain 210 8 -126.77 gain 8 211 -125.34 gain 211 8 -128.58 gain 8 212 -133.68 gain 212 8 -135.46 gain 8 213 -123.78 gain 213 8 -124.75 gain 8 214 -122.90 gain 214 8 -123.76 gain 8 215 -128.04 gain 215 8 -125.32 gain 8 216 -136.96 gain 216 8 -138.90 gain 8 217 -126.00 gain 217 8 -128.46 gain 8 218 -133.19 gain 218 8 -137.84 gain 8 219 -128.50 gain 219 8 -124.50 gain 8 220 -131.36 gain 220 8 -137.85 gain 8 221 -127.87 gain 221 8 -130.01 gain 8 222 -129.33 gain 222 8 -131.80 gain 8 223 -127.32 gain 223 8 -128.40 gain 8 224 -128.38 gain 224 8 -132.15 gain 9 10 -94.91 gain 10 9 -95.39 gain 9 11 -102.30 gain 11 9 -102.61 gain 9 12 -110.76 gain 12 9 -110.54 gain 9 13 -113.87 gain 13 9 -112.60 gain 9 14 -114.36 gain 14 9 -114.96 gain 9 15 -120.43 gain 15 9 -124.65 gain 9 16 -116.35 gain 16 9 -118.39 gain 9 17 -117.33 gain 17 9 -115.79 gain 9 18 -119.87 gain 18 9 -118.17 gain 9 19 -117.33 gain 19 9 -118.63 gain 9 20 -114.99 gain 20 9 -117.72 gain 9 21 -103.95 gain 21 9 -104.61 gain 9 22 -115.99 gain 22 9 -115.24 gain 9 23 -93.04 gain 23 9 -96.57 gain 9 24 -94.25 gain 24 9 -92.19 gain 9 25 -101.64 gain 25 9 -106.33 gain 9 26 -105.54 gain 26 9 -104.11 gain 9 27 -102.13 gain 27 9 -96.60 gain 9 28 -114.96 gain 28 9 -112.13 gain 9 29 -121.35 gain 29 9 -120.39 gain 9 30 -113.21 gain 30 9 -115.72 gain 9 31 -123.87 gain 31 9 -124.00 gain 9 32 -122.15 gain 32 9 -122.31 gain 9 33 -114.08 gain 33 9 -116.49 gain 9 34 -120.47 gain 34 9 -121.48 gain 9 35 -121.00 gain 35 9 -121.84 gain 9 36 -109.03 gain 36 9 -113.65 gain 9 37 -104.40 gain 37 9 -101.22 gain 9 38 -102.95 gain 38 9 -105.79 gain 9 39 -108.05 gain 39 9 -109.75 gain 9 40 -110.87 gain 40 9 -114.63 gain 9 41 -106.46 gain 41 9 -105.84 gain 9 42 -109.46 gain 42 9 -106.99 gain 9 43 -110.27 gain 43 9 -111.70 gain 9 44 -112.40 gain 44 9 -116.88 gain 9 45 -124.16 gain 45 9 -127.12 gain 9 46 -119.71 gain 46 9 -118.46 gain 9 47 -115.31 gain 47 9 -115.11 gain 9 48 -122.99 gain 48 9 -120.59 gain 9 49 -113.47 gain 49 9 -119.05 gain 9 50 -116.56 gain 50 9 -123.10 gain 9 51 -113.63 gain 51 9 -115.30 gain 9 52 -118.86 gain 52 9 -116.55 gain 9 53 -104.13 gain 53 9 -102.84 gain 9 54 -109.85 gain 54 9 -109.26 gain 9 55 -106.87 gain 55 9 -105.58 gain 9 56 -107.45 gain 56 9 -113.49 gain 9 57 -119.72 gain 57 9 -119.63 gain 9 58 -113.27 gain 58 9 -115.92 gain 9 59 -122.18 gain 59 9 -120.95 gain 9 60 -125.44 gain 60 9 -125.54 gain 9 61 -117.49 gain 61 9 -116.34 gain 9 62 -123.35 gain 62 9 -127.42 gain 9 63 -120.33 gain 63 9 -117.63 gain 9 64 -119.71 gain 64 9 -119.98 gain 9 65 -114.23 gain 65 9 -116.58 gain 9 66 -111.79 gain 66 9 -108.40 gain 9 67 -114.19 gain 67 9 -113.07 gain 9 68 -115.38 gain 68 9 -118.82 gain 9 69 -106.00 gain 69 9 -106.74 gain 9 70 -110.87 gain 70 9 -111.37 gain 9 71 -109.00 gain 71 9 -107.60 gain 9 72 -105.67 gain 72 9 -104.69 gain 9 73 -119.58 gain 73 9 -116.99 gain 9 74 -117.25 gain 74 9 -118.54 gain 9 75 -115.93 gain 75 9 -117.36 gain 9 76 -125.70 gain 76 9 -123.08 gain 9 77 -114.67 gain 77 9 -115.71 gain 9 78 -123.64 gain 78 9 -127.53 gain 9 79 -130.17 gain 79 9 -128.84 gain 9 80 -116.81 gain 80 9 -115.98 gain 9 81 -122.53 gain 81 9 -122.29 gain 9 82 -114.19 gain 82 9 -111.58 gain 9 83 -116.91 gain 83 9 -115.33 gain 9 84 -119.94 gain 84 9 -118.51 gain 9 85 -117.49 gain 85 9 -112.87 gain 9 86 -116.34 gain 86 9 -115.10 gain 9 87 -117.75 gain 87 9 -120.47 gain 9 88 -123.30 gain 88 9 -123.78 gain 9 89 -111.90 gain 89 9 -110.97 gain 9 90 -127.57 gain 90 9 -123.65 gain 9 91 -120.55 gain 91 9 -120.57 gain 9 92 -126.61 gain 92 9 -123.59 gain 9 93 -120.61 gain 93 9 -122.38 gain 9 94 -120.34 gain 94 9 -121.99 gain 9 95 -116.74 gain 95 9 -120.65 gain 9 96 -119.75 gain 96 9 -120.99 gain 9 97 -112.64 gain 97 9 -112.63 gain 9 98 -115.48 gain 98 9 -116.26 gain 9 99 -114.49 gain 99 9 -113.10 gain 9 100 -123.81 gain 100 9 -121.98 gain 9 101 -115.89 gain 101 9 -114.22 gain 9 102 -114.87 gain 102 9 -113.99 gain 9 103 -118.14 gain 103 9 -114.73 gain 9 104 -125.25 gain 104 9 -127.23 gain 9 105 -127.03 gain 105 9 -124.94 gain 9 106 -130.05 gain 106 9 -129.04 gain 9 107 -126.92 gain 107 9 -132.49 gain 9 108 -129.15 gain 108 9 -127.04 gain 9 109 -128.11 gain 109 9 -129.49 gain 9 110 -116.02 gain 110 9 -115.86 gain 9 111 -122.36 gain 111 9 -121.88 gain 9 112 -114.10 gain 112 9 -112.50 gain 9 113 -115.31 gain 113 9 -112.52 gain 9 114 -120.30 gain 114 9 -120.81 gain 9 115 -121.05 gain 115 9 -115.86 gain 9 116 -123.30 gain 116 9 -125.65 gain 9 117 -122.35 gain 117 9 -126.21 gain 9 118 -122.39 gain 118 9 -124.57 gain 9 119 -115.56 gain 119 9 -112.40 gain 9 120 -129.03 gain 120 9 -130.38 gain 9 121 -124.70 gain 121 9 -125.34 gain 9 122 -120.21 gain 122 9 -122.97 gain 9 123 -118.14 gain 123 9 -121.67 gain 9 124 -119.19 gain 124 9 -119.13 gain 9 125 -121.44 gain 125 9 -122.72 gain 9 126 -126.76 gain 126 9 -126.00 gain 9 127 -121.82 gain 127 9 -124.52 gain 9 128 -126.87 gain 128 9 -127.50 gain 9 129 -122.42 gain 129 9 -120.97 gain 9 130 -121.95 gain 130 9 -118.31 gain 9 131 -126.84 gain 131 9 -130.29 gain 9 132 -121.62 gain 132 9 -124.70 gain 9 133 -123.29 gain 133 9 -124.44 gain 9 134 -122.45 gain 134 9 -120.30 gain 9 135 -125.30 gain 135 9 -126.72 gain 9 136 -127.68 gain 136 9 -129.71 gain 9 137 -125.76 gain 137 9 -125.28 gain 9 138 -124.89 gain 138 9 -123.40 gain 9 139 -123.88 gain 139 9 -123.38 gain 9 140 -118.62 gain 140 9 -120.73 gain 9 141 -126.04 gain 141 9 -126.82 gain 9 142 -119.09 gain 142 9 -119.18 gain 9 143 -121.12 gain 143 9 -120.82 gain 9 144 -120.91 gain 144 9 -121.63 gain 9 145 -127.77 gain 145 9 -126.94 gain 9 146 -124.58 gain 146 9 -122.66 gain 9 147 -130.66 gain 147 9 -125.83 gain 9 148 -121.17 gain 148 9 -116.06 gain 9 149 -122.67 gain 149 9 -120.73 gain 9 150 -131.41 gain 150 9 -132.15 gain 9 151 -127.47 gain 151 9 -128.41 gain 9 152 -127.14 gain 152 9 -125.05 gain 9 153 -122.23 gain 153 9 -117.72 gain 9 154 -124.11 gain 154 9 -128.15 gain 9 155 -122.06 gain 155 9 -126.00 gain 9 156 -127.04 gain 156 9 -125.36 gain 9 157 -127.97 gain 157 9 -129.24 gain 9 158 -123.06 gain 158 9 -126.92 gain 9 159 -118.65 gain 159 9 -119.13 gain 9 160 -125.30 gain 160 9 -122.89 gain 9 161 -119.09 gain 161 9 -120.17 gain 9 162 -123.16 gain 162 9 -123.10 gain 9 163 -123.67 gain 163 9 -125.76 gain 9 164 -120.61 gain 164 9 -123.75 gain 9 165 -129.40 gain 165 9 -128.58 gain 9 166 -125.94 gain 166 9 -126.68 gain 9 167 -122.83 gain 167 9 -125.67 gain 9 168 -128.61 gain 168 9 -129.90 gain 9 169 -127.42 gain 169 9 -132.90 gain 9 170 -130.99 gain 170 9 -128.00 gain 9 171 -121.76 gain 171 9 -123.79 gain 9 172 -130.79 gain 172 9 -127.52 gain 9 173 -123.67 gain 173 9 -119.84 gain 9 174 -131.59 gain 174 9 -132.05 gain 9 175 -124.20 gain 175 9 -128.22 gain 9 176 -115.56 gain 176 9 -111.59 gain 9 177 -126.09 gain 177 9 -129.93 gain 9 178 -126.98 gain 178 9 -126.64 gain 9 179 -119.39 gain 179 9 -117.45 gain 9 180 -133.54 gain 180 9 -133.07 gain 9 181 -125.66 gain 181 9 -125.26 gain 9 182 -126.25 gain 182 9 -128.23 gain 9 183 -129.13 gain 183 9 -124.50 gain 9 184 -126.56 gain 184 9 -126.71 gain 9 185 -122.74 gain 185 9 -120.38 gain 9 186 -128.10 gain 186 9 -126.03 gain 9 187 -132.27 gain 187 9 -132.74 gain 9 188 -125.00 gain 188 9 -128.72 gain 9 189 -125.94 gain 189 9 -127.18 gain 9 190 -122.79 gain 190 9 -121.04 gain 9 191 -132.37 gain 191 9 -131.71 gain 9 192 -127.69 gain 192 9 -129.89 gain 9 193 -125.23 gain 193 9 -128.69 gain 9 194 -123.66 gain 194 9 -120.93 gain 9 195 -131.75 gain 195 9 -129.65 gain 9 196 -131.92 gain 196 9 -133.87 gain 9 197 -130.00 gain 197 9 -128.00 gain 9 198 -125.69 gain 198 9 -123.22 gain 9 199 -131.42 gain 199 9 -132.86 gain 9 200 -120.95 gain 200 9 -119.33 gain 9 201 -131.98 gain 201 9 -131.16 gain 9 202 -128.71 gain 202 9 -131.90 gain 9 203 -127.71 gain 203 9 -130.52 gain 9 204 -124.71 gain 204 9 -124.80 gain 9 205 -126.17 gain 205 9 -125.34 gain 9 206 -124.17 gain 206 9 -127.86 gain 9 207 -129.92 gain 207 9 -125.97 gain 9 208 -125.94 gain 208 9 -127.76 gain 9 209 -130.62 gain 209 9 -133.43 gain 9 210 -125.37 gain 210 9 -125.12 gain 9 211 -129.94 gain 211 9 -131.72 gain 9 212 -126.14 gain 212 9 -126.46 gain 9 213 -121.07 gain 213 9 -120.58 gain 9 214 -122.89 gain 214 9 -122.29 gain 9 215 -121.39 gain 215 9 -117.21 gain 9 216 -126.19 gain 216 9 -126.66 gain 9 217 -125.64 gain 217 9 -126.64 gain 9 218 -133.72 gain 218 9 -136.90 gain 9 219 -133.32 gain 219 9 -127.86 gain 9 220 -130.48 gain 220 9 -135.51 gain 9 221 -125.99 gain 221 9 -126.66 gain 9 222 -128.89 gain 222 9 -129.89 gain 9 223 -137.60 gain 223 9 -137.21 gain 9 224 -130.05 gain 224 9 -132.36 gain 10 11 -95.22 gain 11 10 -95.06 gain 10 12 -104.47 gain 12 10 -103.77 gain 10 13 -114.75 gain 13 10 -113.01 gain 10 14 -110.28 gain 14 10 -110.40 gain 10 15 -123.60 gain 15 10 -127.35 gain 10 16 -120.26 gain 16 10 -121.82 gain 10 17 -126.32 gain 17 10 -124.31 gain 10 18 -121.49 gain 18 10 -119.32 gain 10 19 -118.93 gain 19 10 -119.75 gain 10 20 -118.77 gain 20 10 -121.03 gain 10 21 -114.66 gain 21 10 -114.85 gain 10 22 -110.79 gain 22 10 -109.57 gain 10 23 -103.86 gain 23 10 -106.91 gain 10 24 -99.28 gain 24 10 -96.74 gain 10 25 -87.03 gain 25 10 -91.25 gain 10 26 -97.44 gain 26 10 -95.54 gain 10 27 -108.96 gain 27 10 -102.95 gain 10 28 -110.03 gain 28 10 -106.72 gain 10 29 -117.75 gain 29 10 -116.32 gain 10 30 -126.39 gain 30 10 -128.43 gain 10 31 -123.88 gain 31 10 -123.53 gain 10 32 -115.69 gain 32 10 -115.37 gain 10 33 -115.12 gain 33 10 -117.05 gain 10 34 -114.67 gain 34 10 -115.21 gain 10 35 -111.88 gain 35 10 -112.24 gain 10 36 -111.93 gain 36 10 -116.07 gain 10 37 -110.19 gain 37 10 -106.53 gain 10 38 -108.26 gain 38 10 -110.63 gain 10 39 -101.20 gain 39 10 -102.43 gain 10 40 -106.95 gain 40 10 -110.23 gain 10 41 -103.40 gain 41 10 -102.30 gain 10 42 -108.88 gain 42 10 -105.93 gain 10 43 -114.39 gain 43 10 -115.33 gain 10 44 -106.25 gain 44 10 -110.25 gain 10 45 -128.70 gain 45 10 -131.18 gain 10 46 -127.70 gain 46 10 -125.97 gain 10 47 -115.39 gain 47 10 -114.72 gain 10 48 -119.07 gain 48 10 -116.19 gain 10 49 -118.16 gain 49 10 -123.25 gain 10 50 -107.92 gain 50 10 -113.98 gain 10 51 -113.17 gain 51 10 -114.37 gain 10 52 -113.84 gain 52 10 -111.05 gain 10 53 -109.92 gain 53 10 -108.15 gain 10 54 -113.73 gain 54 10 -112.67 gain 10 55 -108.89 gain 55 10 -107.12 gain 10 56 -109.91 gain 56 10 -115.47 gain 10 57 -116.50 gain 57 10 -115.94 gain 10 58 -111.36 gain 58 10 -113.53 gain 10 59 -113.36 gain 59 10 -111.66 gain 10 60 -120.23 gain 60 10 -119.85 gain 10 61 -124.04 gain 61 10 -122.41 gain 10 62 -120.18 gain 62 10 -123.77 gain 10 63 -114.86 gain 63 10 -111.68 gain 10 64 -119.12 gain 64 10 -118.91 gain 10 65 -119.37 gain 65 10 -121.25 gain 10 66 -119.30 gain 66 10 -115.43 gain 10 67 -111.56 gain 67 10 -109.96 gain 10 68 -116.73 gain 68 10 -119.70 gain 10 69 -113.80 gain 69 10 -114.05 gain 10 70 -111.89 gain 70 10 -111.90 gain 10 71 -105.93 gain 71 10 -104.05 gain 10 72 -115.20 gain 72 10 -113.73 gain 10 73 -120.15 gain 73 10 -117.08 gain 10 74 -121.48 gain 74 10 -122.28 gain 10 75 -126.48 gain 75 10 -127.43 gain 10 76 -124.46 gain 76 10 -121.36 gain 10 77 -116.20 gain 77 10 -116.76 gain 10 78 -120.51 gain 78 10 -123.92 gain 10 79 -109.82 gain 79 10 -108.01 gain 10 80 -117.30 gain 80 10 -115.99 gain 10 81 -115.52 gain 81 10 -114.81 gain 10 82 -121.52 gain 82 10 -118.43 gain 10 83 -118.20 gain 83 10 -116.14 gain 10 84 -113.92 gain 84 10 -112.01 gain 10 85 -120.95 gain 85 10 -115.85 gain 10 86 -116.41 gain 86 10 -114.69 gain 10 87 -121.30 gain 87 10 -123.54 gain 10 88 -112.05 gain 88 10 -112.04 gain 10 89 -121.07 gain 89 10 -119.66 gain 10 90 -128.57 gain 90 10 -124.18 gain 10 91 -121.63 gain 91 10 -121.18 gain 10 92 -122.23 gain 92 10 -118.74 gain 10 93 -126.64 gain 93 10 -127.93 gain 10 94 -121.03 gain 94 10 -122.20 gain 10 95 -122.14 gain 95 10 -125.57 gain 10 96 -124.72 gain 96 10 -125.49 gain 10 97 -111.07 gain 97 10 -110.58 gain 10 98 -112.61 gain 98 10 -112.92 gain 10 99 -114.77 gain 99 10 -112.90 gain 10 100 -118.94 gain 100 10 -116.63 gain 10 101 -113.90 gain 101 10 -111.76 gain 10 102 -114.52 gain 102 10 -113.16 gain 10 103 -119.75 gain 103 10 -115.87 gain 10 104 -115.63 gain 104 10 -117.12 gain 10 105 -127.55 gain 105 10 -124.99 gain 10 106 -124.03 gain 106 10 -122.55 gain 10 107 -125.99 gain 107 10 -131.07 gain 10 108 -126.68 gain 108 10 -124.09 gain 10 109 -127.05 gain 109 10 -127.95 gain 10 110 -117.68 gain 110 10 -117.05 gain 10 111 -123.47 gain 111 10 -122.51 gain 10 112 -113.58 gain 112 10 -111.51 gain 10 113 -120.42 gain 113 10 -117.15 gain 10 114 -122.65 gain 114 10 -122.68 gain 10 115 -120.18 gain 115 10 -114.52 gain 10 116 -120.87 gain 116 10 -122.74 gain 10 117 -119.82 gain 117 10 -123.19 gain 10 118 -118.93 gain 118 10 -120.63 gain 10 119 -124.02 gain 119 10 -120.38 gain 10 120 -123.35 gain 120 10 -124.23 gain 10 121 -123.26 gain 121 10 -123.43 gain 10 122 -130.35 gain 122 10 -132.63 gain 10 123 -129.23 gain 123 10 -132.29 gain 10 124 -123.44 gain 124 10 -122.90 gain 10 125 -121.04 gain 125 10 -121.85 gain 10 126 -128.26 gain 126 10 -127.01 gain 10 127 -119.83 gain 127 10 -122.05 gain 10 128 -118.22 gain 128 10 -118.37 gain 10 129 -129.31 gain 129 10 -127.37 gain 10 130 -120.46 gain 130 10 -116.35 gain 10 131 -119.30 gain 131 10 -122.28 gain 10 132 -115.28 gain 132 10 -117.88 gain 10 133 -127.04 gain 133 10 -127.72 gain 10 134 -118.07 gain 134 10 -115.45 gain 10 135 -125.96 gain 135 10 -126.90 gain 10 136 -125.84 gain 136 10 -127.40 gain 10 137 -126.24 gain 137 10 -125.28 gain 10 138 -121.57 gain 138 10 -119.61 gain 10 139 -129.14 gain 139 10 -128.16 gain 10 140 -129.04 gain 140 10 -130.67 gain 10 141 -119.65 gain 141 10 -119.95 gain 10 142 -126.21 gain 142 10 -125.82 gain 10 143 -123.70 gain 143 10 -122.93 gain 10 144 -122.96 gain 144 10 -123.20 gain 10 145 -117.90 gain 145 10 -116.59 gain 10 146 -126.60 gain 146 10 -124.21 gain 10 147 -121.13 gain 147 10 -115.82 gain 10 148 -121.96 gain 148 10 -116.37 gain 10 149 -128.01 gain 149 10 -125.58 gain 10 150 -127.21 gain 150 10 -127.47 gain 10 151 -129.72 gain 151 10 -130.18 gain 10 152 -131.23 gain 152 10 -128.67 gain 10 153 -123.43 gain 153 10 -118.44 gain 10 154 -127.90 gain 154 10 -131.46 gain 10 155 -129.07 gain 155 10 -132.53 gain 10 156 -128.44 gain 156 10 -126.29 gain 10 157 -118.75 gain 157 10 -119.54 gain 10 158 -122.95 gain 158 10 -126.34 gain 10 159 -126.61 gain 159 10 -126.62 gain 10 160 -126.85 gain 160 10 -123.96 gain 10 161 -120.72 gain 161 10 -121.32 gain 10 162 -121.42 gain 162 10 -120.89 gain 10 163 -128.83 gain 163 10 -130.45 gain 10 164 -132.52 gain 164 10 -135.18 gain 10 165 -136.78 gain 165 10 -135.48 gain 10 166 -130.22 gain 166 10 -130.49 gain 10 167 -130.01 gain 167 10 -132.37 gain 10 168 -131.65 gain 168 10 -132.46 gain 10 169 -121.41 gain 169 10 -126.42 gain 10 170 -124.49 gain 170 10 -121.02 gain 10 171 -122.12 gain 171 10 -123.68 gain 10 172 -125.09 gain 172 10 -121.35 gain 10 173 -120.67 gain 173 10 -116.36 gain 10 174 -121.60 gain 174 10 -121.59 gain 10 175 -120.17 gain 175 10 -123.71 gain 10 176 -120.15 gain 176 10 -115.70 gain 10 177 -125.53 gain 177 10 -128.90 gain 10 178 -121.25 gain 178 10 -120.44 gain 10 179 -128.34 gain 179 10 -125.92 gain 10 180 -130.81 gain 180 10 -129.86 gain 10 181 -127.34 gain 181 10 -126.45 gain 10 182 -130.43 gain 182 10 -131.93 gain 10 183 -136.64 gain 183 10 -131.53 gain 10 184 -124.41 gain 184 10 -124.09 gain 10 185 -131.34 gain 185 10 -128.50 gain 10 186 -121.56 gain 186 10 -119.00 gain 10 187 -124.97 gain 187 10 -124.95 gain 10 188 -123.94 gain 188 10 -127.19 gain 10 189 -116.40 gain 189 10 -117.16 gain 10 190 -124.28 gain 190 10 -122.05 gain 10 191 -123.42 gain 191 10 -122.29 gain 10 192 -140.75 gain 192 10 -142.48 gain 10 193 -126.72 gain 193 10 -129.70 gain 10 194 -128.47 gain 194 10 -125.26 gain 10 195 -125.16 gain 195 10 -122.59 gain 10 196 -130.56 gain 196 10 -132.02 gain 10 197 -132.05 gain 197 10 -129.58 gain 10 198 -134.04 gain 198 10 -131.09 gain 10 199 -126.94 gain 199 10 -127.90 gain 10 200 -123.93 gain 200 10 -121.84 gain 10 201 -125.27 gain 201 10 -123.98 gain 10 202 -133.27 gain 202 10 -135.98 gain 10 203 -133.34 gain 203 10 -135.67 gain 10 204 -123.25 gain 204 10 -122.87 gain 10 205 -131.56 gain 205 10 -130.25 gain 10 206 -120.97 gain 206 10 -124.17 gain 10 207 -126.95 gain 207 10 -122.52 gain 10 208 -129.24 gain 208 10 -130.59 gain 10 209 -127.04 gain 209 10 -129.38 gain 10 210 -140.36 gain 210 10 -139.64 gain 10 211 -125.75 gain 211 10 -127.04 gain 10 212 -127.15 gain 212 10 -126.99 gain 10 213 -133.35 gain 213 10 -132.38 gain 10 214 -133.37 gain 214 10 -132.29 gain 10 215 -129.99 gain 215 10 -125.32 gain 10 216 -129.55 gain 216 10 -129.54 gain 10 217 -132.73 gain 217 10 -133.25 gain 10 218 -132.10 gain 218 10 -134.80 gain 10 219 -129.27 gain 219 10 -123.33 gain 10 220 -126.75 gain 220 10 -131.30 gain 10 221 -128.00 gain 221 10 -128.20 gain 10 222 -127.19 gain 222 10 -127.71 gain 10 223 -128.37 gain 223 10 -127.50 gain 10 224 -128.64 gain 224 10 -130.47 gain 11 12 -90.40 gain 12 11 -89.86 gain 11 13 -100.43 gain 13 11 -98.85 gain 11 14 -102.58 gain 14 11 -102.86 gain 11 15 -129.51 gain 15 11 -133.41 gain 11 16 -123.66 gain 16 11 -125.38 gain 11 17 -121.46 gain 17 11 -119.61 gain 11 18 -122.92 gain 18 11 -120.91 gain 11 19 -115.62 gain 19 11 -116.60 gain 11 20 -120.67 gain 20 11 -123.09 gain 11 21 -119.12 gain 21 11 -119.46 gain 11 22 -111.29 gain 22 11 -110.23 gain 11 23 -106.27 gain 23 11 -109.48 gain 11 24 -102.88 gain 24 11 -100.51 gain 11 25 -94.04 gain 25 11 -98.42 gain 11 26 -93.36 gain 26 11 -91.62 gain 11 27 -102.38 gain 27 11 -96.53 gain 11 28 -104.86 gain 28 11 -101.71 gain 11 29 -107.68 gain 29 11 -106.41 gain 11 30 -123.63 gain 30 11 -125.82 gain 11 31 -128.43 gain 31 11 -128.24 gain 11 32 -126.81 gain 32 11 -126.66 gain 11 33 -118.17 gain 33 11 -120.27 gain 11 34 -118.05 gain 34 11 -118.74 gain 11 35 -114.99 gain 35 11 -115.52 gain 11 36 -111.81 gain 36 11 -116.11 gain 11 37 -115.95 gain 37 11 -112.45 gain 11 38 -107.45 gain 38 11 -109.97 gain 11 39 -111.90 gain 39 11 -113.29 gain 11 40 -104.52 gain 40 11 -107.95 gain 11 41 -102.74 gain 41 11 -101.80 gain 11 42 -103.93 gain 42 11 -101.15 gain 11 43 -106.76 gain 43 11 -107.86 gain 11 44 -108.06 gain 44 11 -112.22 gain 11 45 -122.66 gain 45 11 -125.30 gain 11 46 -128.88 gain 46 11 -127.32 gain 11 47 -127.52 gain 47 11 -127.01 gain 11 48 -122.44 gain 48 11 -119.72 gain 11 49 -121.09 gain 49 11 -126.35 gain 11 50 -123.45 gain 50 11 -129.67 gain 11 51 -123.73 gain 51 11 -125.09 gain 11 52 -113.27 gain 52 11 -110.65 gain 11 53 -112.40 gain 53 11 -110.79 gain 11 54 -107.73 gain 54 11 -106.82 gain 11 55 -116.18 gain 55 11 -114.57 gain 11 56 -105.28 gain 56 11 -111.00 gain 11 57 -102.84 gain 57 11 -102.43 gain 11 58 -112.16 gain 58 11 -114.49 gain 11 59 -111.81 gain 59 11 -110.27 gain 11 60 -127.81 gain 60 11 -127.59 gain 11 61 -117.64 gain 61 11 -116.18 gain 11 62 -118.46 gain 62 11 -122.21 gain 11 63 -119.51 gain 63 11 -116.49 gain 11 64 -116.83 gain 64 11 -116.78 gain 11 65 -118.52 gain 65 11 -120.56 gain 11 66 -125.16 gain 66 11 -121.45 gain 11 67 -117.31 gain 67 11 -115.88 gain 11 68 -114.01 gain 68 11 -117.14 gain 11 69 -122.34 gain 69 11 -122.76 gain 11 70 -114.13 gain 70 11 -114.31 gain 11 71 -108.17 gain 71 11 -106.45 gain 11 72 -114.82 gain 72 11 -113.52 gain 11 73 -110.00 gain 73 11 -107.09 gain 11 74 -117.29 gain 74 11 -118.25 gain 11 75 -125.27 gain 75 11 -126.37 gain 11 76 -119.17 gain 76 11 -116.23 gain 11 77 -125.11 gain 77 11 -125.83 gain 11 78 -124.21 gain 78 11 -127.78 gain 11 79 -123.87 gain 79 11 -122.23 gain 11 80 -125.79 gain 80 11 -124.64 gain 11 81 -123.02 gain 81 11 -122.46 gain 11 82 -119.96 gain 82 11 -117.03 gain 11 83 -116.54 gain 83 11 -114.65 gain 11 84 -121.49 gain 84 11 -119.74 gain 11 85 -108.31 gain 85 11 -103.37 gain 11 86 -107.69 gain 86 11 -106.13 gain 11 87 -117.06 gain 87 11 -119.47 gain 11 88 -114.09 gain 88 11 -114.25 gain 11 89 -122.53 gain 89 11 -121.28 gain 11 90 -132.12 gain 90 11 -127.89 gain 11 91 -135.05 gain 91 11 -134.76 gain 11 92 -125.29 gain 92 11 -121.96 gain 11 93 -121.74 gain 93 11 -123.19 gain 11 94 -118.22 gain 94 11 -119.55 gain 11 95 -124.04 gain 95 11 -127.62 gain 11 96 -113.92 gain 96 11 -114.84 gain 11 97 -119.65 gain 97 11 -119.32 gain 11 98 -115.92 gain 98 11 -116.38 gain 11 99 -120.88 gain 99 11 -119.17 gain 11 100 -120.95 gain 100 11 -118.81 gain 11 101 -123.62 gain 101 11 -121.64 gain 11 102 -121.61 gain 102 11 -120.41 gain 11 103 -109.34 gain 103 11 -105.62 gain 11 104 -123.78 gain 104 11 -125.44 gain 11 105 -127.59 gain 105 11 -125.18 gain 11 106 -124.53 gain 106 11 -123.21 gain 11 107 -118.03 gain 107 11 -123.28 gain 11 108 -122.87 gain 108 11 -120.43 gain 11 109 -121.65 gain 109 11 -122.71 gain 11 110 -113.96 gain 110 11 -113.49 gain 11 111 -120.03 gain 111 11 -119.24 gain 11 112 -118.57 gain 112 11 -116.65 gain 11 113 -113.96 gain 113 11 -110.85 gain 11 114 -118.47 gain 114 11 -118.67 gain 11 115 -112.05 gain 115 11 -106.55 gain 11 116 -116.46 gain 116 11 -118.50 gain 11 117 -116.86 gain 117 11 -120.40 gain 11 118 -118.16 gain 118 11 -120.02 gain 11 119 -122.03 gain 119 11 -118.55 gain 11 120 -122.91 gain 120 11 -123.94 gain 11 121 -125.09 gain 121 11 -125.41 gain 11 122 -126.61 gain 122 11 -129.05 gain 11 123 -126.28 gain 123 11 -129.49 gain 11 124 -124.43 gain 124 11 -124.05 gain 11 125 -128.12 gain 125 11 -129.08 gain 11 126 -120.41 gain 126 11 -119.33 gain 11 127 -124.86 gain 127 11 -127.25 gain 11 128 -122.86 gain 128 11 -123.18 gain 11 129 -117.63 gain 129 11 -115.86 gain 11 130 -126.32 gain 130 11 -122.37 gain 11 131 -120.21 gain 131 11 -123.35 gain 11 132 -124.52 gain 132 11 -127.28 gain 11 133 -122.45 gain 133 11 -123.29 gain 11 134 -113.37 gain 134 11 -110.91 gain 11 135 -139.83 gain 135 11 -140.93 gain 11 136 -131.13 gain 136 11 -132.84 gain 11 137 -133.20 gain 137 11 -132.40 gain 11 138 -131.27 gain 138 11 -129.47 gain 11 139 -123.07 gain 139 11 -122.26 gain 11 140 -123.80 gain 140 11 -125.59 gain 11 141 -123.18 gain 141 11 -123.64 gain 11 142 -129.91 gain 142 11 -129.68 gain 11 143 -124.28 gain 143 11 -123.66 gain 11 144 -123.35 gain 144 11 -123.75 gain 11 145 -124.51 gain 145 11 -123.36 gain 11 146 -119.82 gain 146 11 -117.59 gain 11 147 -127.59 gain 147 11 -122.44 gain 11 148 -122.29 gain 148 11 -116.86 gain 11 149 -129.08 gain 149 11 -126.82 gain 11 150 -126.50 gain 150 11 -126.92 gain 11 151 -131.08 gain 151 11 -131.70 gain 11 152 -124.65 gain 152 11 -122.24 gain 11 153 -125.15 gain 153 11 -120.32 gain 11 154 -132.25 gain 154 11 -135.97 gain 11 155 -126.59 gain 155 11 -130.21 gain 11 156 -129.75 gain 156 11 -127.76 gain 11 157 -122.47 gain 157 11 -123.42 gain 11 158 -123.86 gain 158 11 -127.40 gain 11 159 -123.83 gain 159 11 -123.99 gain 11 160 -122.26 gain 160 11 -119.53 gain 11 161 -129.21 gain 161 11 -129.97 gain 11 162 -123.95 gain 162 11 -123.58 gain 11 163 -116.63 gain 163 11 -118.41 gain 11 164 -124.08 gain 164 11 -126.90 gain 11 165 -127.15 gain 165 11 -126.01 gain 11 166 -126.19 gain 166 11 -126.62 gain 11 167 -129.65 gain 167 11 -132.17 gain 11 168 -126.33 gain 168 11 -127.31 gain 11 169 -132.00 gain 169 11 -137.17 gain 11 170 -125.05 gain 170 11 -121.75 gain 11 171 -130.39 gain 171 11 -132.11 gain 11 172 -123.85 gain 172 11 -120.27 gain 11 173 -132.72 gain 173 11 -128.57 gain 11 174 -126.66 gain 174 11 -126.81 gain 11 175 -129.99 gain 175 11 -133.69 gain 11 176 -126.33 gain 176 11 -122.04 gain 11 177 -126.90 gain 177 11 -130.43 gain 11 178 -127.47 gain 178 11 -126.82 gain 11 179 -125.71 gain 179 11 -123.45 gain 11 180 -123.42 gain 180 11 -122.63 gain 11 181 -125.84 gain 181 11 -125.12 gain 11 182 -124.31 gain 182 11 -125.97 gain 11 183 -125.79 gain 183 11 -120.84 gain 11 184 -129.73 gain 184 11 -129.57 gain 11 185 -128.48 gain 185 11 -125.80 gain 11 186 -127.64 gain 186 11 -125.25 gain 11 187 -125.76 gain 187 11 -125.90 gain 11 188 -130.79 gain 188 11 -134.20 gain 11 189 -126.05 gain 189 11 -126.98 gain 11 190 -121.47 gain 190 11 -119.40 gain 11 191 -117.57 gain 191 11 -116.60 gain 11 192 -138.50 gain 192 11 -140.39 gain 11 193 -132.87 gain 193 11 -136.01 gain 11 194 -127.31 gain 194 11 -124.26 gain 11 195 -140.21 gain 195 11 -137.80 gain 11 196 -130.34 gain 196 11 -131.97 gain 11 197 -132.46 gain 197 11 -130.15 gain 11 198 -125.63 gain 198 11 -122.84 gain 11 199 -137.26 gain 199 11 -138.39 gain 11 200 -134.28 gain 200 11 -132.35 gain 11 201 -137.27 gain 201 11 -136.14 gain 11 202 -134.59 gain 202 11 -137.46 gain 11 203 -129.54 gain 203 11 -132.04 gain 11 204 -124.62 gain 204 11 -124.39 gain 11 205 -130.56 gain 205 11 -129.41 gain 11 206 -130.97 gain 206 11 -134.33 gain 11 207 -127.74 gain 207 11 -123.47 gain 11 208 -128.93 gain 208 11 -130.44 gain 11 209 -123.00 gain 209 11 -125.50 gain 11 210 -130.68 gain 210 11 -130.12 gain 11 211 -128.86 gain 211 11 -130.31 gain 11 212 -123.09 gain 212 11 -123.09 gain 11 213 -130.23 gain 213 11 -129.42 gain 11 214 -130.29 gain 214 11 -129.37 gain 11 215 -129.06 gain 215 11 -124.55 gain 11 216 -133.97 gain 216 11 -134.13 gain 11 217 -133.12 gain 217 11 -133.80 gain 11 218 -124.79 gain 218 11 -127.66 gain 11 219 -127.56 gain 219 11 -121.78 gain 11 220 -126.56 gain 220 11 -131.27 gain 11 221 -126.46 gain 221 11 -126.82 gain 11 222 -126.39 gain 222 11 -127.07 gain 11 223 -126.92 gain 223 11 -126.21 gain 11 224 -128.48 gain 224 11 -130.46 gain 12 13 -94.20 gain 13 12 -93.15 gain 12 14 -97.29 gain 14 12 -98.10 gain 12 15 -131.38 gain 15 12 -135.82 gain 12 16 -124.87 gain 16 12 -127.13 gain 12 17 -123.90 gain 17 12 -122.59 gain 12 18 -117.49 gain 18 12 -116.01 gain 12 19 -123.23 gain 19 12 -124.75 gain 12 20 -120.17 gain 20 12 -123.13 gain 12 21 -114.25 gain 21 12 -115.13 gain 12 22 -113.13 gain 22 12 -112.60 gain 12 23 -116.18 gain 23 12 -119.93 gain 12 24 -109.23 gain 24 12 -107.39 gain 12 25 -102.52 gain 25 12 -107.43 gain 12 26 -96.07 gain 26 12 -94.86 gain 12 27 -97.39 gain 27 12 -92.08 gain 12 28 -103.77 gain 28 12 -101.16 gain 12 29 -105.46 gain 29 12 -104.73 gain 12 30 -129.51 gain 30 12 -132.24 gain 12 31 -125.51 gain 31 12 -125.86 gain 12 32 -129.16 gain 32 12 -129.53 gain 12 33 -125.04 gain 33 12 -127.67 gain 12 34 -119.30 gain 34 12 -120.54 gain 12 35 -121.71 gain 35 12 -122.77 gain 12 36 -122.09 gain 36 12 -126.93 gain 12 37 -118.37 gain 37 12 -115.41 gain 12 38 -113.70 gain 38 12 -116.76 gain 12 39 -110.36 gain 39 12 -112.29 gain 12 40 -111.91 gain 40 12 -115.88 gain 12 41 -99.21 gain 41 12 -98.81 gain 12 42 -109.26 gain 42 12 -107.01 gain 12 43 -112.09 gain 43 12 -113.73 gain 12 44 -106.13 gain 44 12 -110.83 gain 12 45 -120.87 gain 45 12 -124.04 gain 12 46 -124.33 gain 46 12 -123.30 gain 12 47 -127.12 gain 47 12 -127.14 gain 12 48 -124.53 gain 48 12 -122.34 gain 12 49 -118.23 gain 49 12 -124.02 gain 12 50 -117.41 gain 50 12 -124.17 gain 12 51 -124.11 gain 51 12 -126.01 gain 12 52 -120.72 gain 52 12 -118.64 gain 12 53 -114.53 gain 53 12 -113.45 gain 12 54 -119.18 gain 54 12 -118.81 gain 12 55 -108.17 gain 55 12 -107.09 gain 12 56 -104.98 gain 56 12 -111.24 gain 12 57 -107.19 gain 57 12 -107.32 gain 12 58 -101.98 gain 58 12 -104.85 gain 12 59 -110.31 gain 59 12 -109.30 gain 12 60 -126.38 gain 60 12 -126.70 gain 12 61 -123.43 gain 61 12 -122.50 gain 12 62 -133.63 gain 62 12 -137.92 gain 12 63 -122.46 gain 63 12 -119.97 gain 12 64 -125.68 gain 64 12 -126.17 gain 12 65 -117.90 gain 65 12 -120.48 gain 12 66 -122.97 gain 66 12 -119.80 gain 12 67 -113.61 gain 67 12 -112.71 gain 12 68 -110.35 gain 68 12 -114.01 gain 12 69 -121.34 gain 69 12 -122.30 gain 12 70 -115.70 gain 70 12 -116.41 gain 12 71 -112.05 gain 71 12 -110.86 gain 12 72 -108.24 gain 72 12 -107.48 gain 12 73 -107.08 gain 73 12 -104.70 gain 12 74 -120.93 gain 74 12 -122.43 gain 12 75 -127.55 gain 75 12 -129.20 gain 12 76 -124.27 gain 76 12 -121.86 gain 12 77 -126.77 gain 77 12 -128.03 gain 12 78 -128.21 gain 78 12 -132.32 gain 12 79 -119.57 gain 79 12 -118.46 gain 12 80 -122.59 gain 80 12 -121.98 gain 12 81 -128.73 gain 81 12 -128.71 gain 12 82 -126.25 gain 82 12 -123.86 gain 12 83 -119.43 gain 83 12 -118.07 gain 12 84 -117.01 gain 84 12 -115.80 gain 12 85 -115.15 gain 85 12 -110.75 gain 12 86 -110.22 gain 86 12 -109.20 gain 12 87 -113.72 gain 87 12 -116.66 gain 12 88 -118.54 gain 88 12 -119.24 gain 12 89 -113.41 gain 89 12 -112.70 gain 12 90 -125.29 gain 90 12 -121.59 gain 12 91 -125.15 gain 91 12 -125.39 gain 12 92 -121.91 gain 92 12 -119.11 gain 12 93 -122.23 gain 93 12 -124.22 gain 12 94 -130.85 gain 94 12 -132.72 gain 12 95 -119.99 gain 95 12 -124.11 gain 12 96 -113.29 gain 96 12 -114.75 gain 12 97 -115.41 gain 97 12 -115.61 gain 12 98 -115.99 gain 98 12 -116.99 gain 12 99 -111.45 gain 99 12 -110.27 gain 12 100 -123.78 gain 100 12 -122.17 gain 12 101 -118.07 gain 101 12 -116.62 gain 12 102 -112.36 gain 102 12 -111.70 gain 12 103 -118.34 gain 103 12 -115.16 gain 12 104 -117.94 gain 104 12 -120.14 gain 12 105 -120.86 gain 105 12 -119.00 gain 12 106 -132.79 gain 106 12 -132.01 gain 12 107 -133.18 gain 107 12 -138.97 gain 12 108 -132.41 gain 108 12 -130.52 gain 12 109 -121.12 gain 109 12 -122.71 gain 12 110 -122.81 gain 110 12 -122.87 gain 12 111 -120.87 gain 111 12 -120.61 gain 12 112 -121.84 gain 112 12 -120.46 gain 12 113 -127.58 gain 113 12 -125.00 gain 12 114 -124.36 gain 114 12 -125.09 gain 12 115 -128.41 gain 115 12 -123.44 gain 12 116 -119.99 gain 116 12 -122.56 gain 12 117 -119.48 gain 117 12 -123.55 gain 12 118 -124.75 gain 118 12 -127.15 gain 12 119 -121.71 gain 119 12 -118.76 gain 12 120 -127.35 gain 120 12 -128.92 gain 12 121 -126.65 gain 121 12 -127.51 gain 12 122 -123.64 gain 122 12 -126.62 gain 12 123 -126.86 gain 123 12 -130.62 gain 12 124 -120.13 gain 124 12 -120.30 gain 12 125 -118.01 gain 125 12 -119.51 gain 12 126 -119.90 gain 126 12 -119.35 gain 12 127 -122.85 gain 127 12 -125.77 gain 12 128 -126.21 gain 128 12 -127.06 gain 12 129 -118.69 gain 129 12 -117.45 gain 12 130 -120.30 gain 130 12 -116.88 gain 12 131 -120.58 gain 131 12 -124.25 gain 12 132 -120.80 gain 132 12 -124.10 gain 12 133 -119.78 gain 133 12 -121.15 gain 12 134 -118.55 gain 134 12 -116.62 gain 12 135 -128.48 gain 135 12 -130.12 gain 12 136 -126.43 gain 136 12 -128.68 gain 12 137 -125.39 gain 137 12 -125.12 gain 12 138 -130.32 gain 138 12 -129.06 gain 12 139 -131.45 gain 139 12 -131.17 gain 12 140 -123.20 gain 140 12 -125.53 gain 12 141 -127.46 gain 141 12 -128.46 gain 12 142 -124.39 gain 142 12 -124.70 gain 12 143 -120.89 gain 143 12 -120.82 gain 12 144 -115.54 gain 144 12 -116.48 gain 12 145 -120.88 gain 145 12 -120.27 gain 12 146 -120.69 gain 146 12 -118.99 gain 12 147 -127.15 gain 147 12 -122.54 gain 12 148 -124.04 gain 148 12 -119.15 gain 12 149 -117.37 gain 149 12 -115.64 gain 12 150 -136.72 gain 150 12 -137.68 gain 12 151 -135.55 gain 151 12 -136.71 gain 12 152 -122.32 gain 152 12 -120.45 gain 12 153 -124.18 gain 153 12 -119.89 gain 12 154 -124.43 gain 154 12 -128.69 gain 12 155 -129.59 gain 155 12 -133.74 gain 12 156 -123.27 gain 156 12 -121.81 gain 12 157 -128.08 gain 157 12 -129.57 gain 12 158 -123.21 gain 158 12 -127.29 gain 12 159 -122.56 gain 159 12 -123.26 gain 12 160 -125.70 gain 160 12 -123.51 gain 12 161 -123.73 gain 161 12 -125.03 gain 12 162 -118.86 gain 162 12 -119.03 gain 12 163 -122.26 gain 163 12 -124.57 gain 12 164 -126.60 gain 164 12 -129.96 gain 12 165 -130.26 gain 165 12 -129.66 gain 12 166 -123.29 gain 166 12 -124.25 gain 12 167 -133.36 gain 167 12 -136.41 gain 12 168 -120.27 gain 168 12 -121.78 gain 12 169 -127.86 gain 169 12 -133.57 gain 12 170 -123.30 gain 170 12 -120.54 gain 12 171 -127.55 gain 171 12 -129.81 gain 12 172 -126.88 gain 172 12 -123.83 gain 12 173 -123.74 gain 173 12 -120.13 gain 12 174 -128.52 gain 174 12 -129.21 gain 12 175 -120.89 gain 175 12 -125.13 gain 12 176 -123.79 gain 176 12 -120.04 gain 12 177 -122.19 gain 177 12 -126.26 gain 12 178 -121.71 gain 178 12 -121.60 gain 12 179 -122.66 gain 179 12 -120.94 gain 12 180 -127.83 gain 180 12 -127.57 gain 12 181 -131.91 gain 181 12 -131.72 gain 12 182 -129.74 gain 182 12 -131.94 gain 12 183 -132.27 gain 183 12 -127.86 gain 12 184 -131.03 gain 184 12 -131.40 gain 12 185 -130.48 gain 185 12 -128.34 gain 12 186 -130.10 gain 186 12 -128.25 gain 12 187 -121.58 gain 187 12 -122.27 gain 12 188 -127.60 gain 188 12 -131.54 gain 12 189 -129.62 gain 189 12 -131.08 gain 12 190 -124.31 gain 190 12 -122.78 gain 12 191 -130.47 gain 191 12 -130.03 gain 12 192 -132.20 gain 192 12 -134.63 gain 12 193 -124.99 gain 193 12 -128.67 gain 12 194 -129.72 gain 194 12 -127.21 gain 12 195 -128.60 gain 195 12 -126.72 gain 12 196 -127.04 gain 196 12 -129.20 gain 12 197 -124.03 gain 197 12 -122.26 gain 12 198 -134.16 gain 198 12 -131.90 gain 12 199 -126.65 gain 199 12 -128.31 gain 12 200 -128.54 gain 200 12 -127.14 gain 12 201 -126.15 gain 201 12 -125.56 gain 12 202 -126.28 gain 202 12 -129.68 gain 12 203 -129.83 gain 203 12 -132.86 gain 12 204 -122.38 gain 204 12 -122.69 gain 12 205 -123.72 gain 205 12 -123.10 gain 12 206 -121.60 gain 206 12 -125.51 gain 12 207 -121.35 gain 207 12 -117.61 gain 12 208 -131.36 gain 208 12 -133.40 gain 12 209 -119.74 gain 209 12 -122.78 gain 12 210 -129.59 gain 210 12 -129.56 gain 12 211 -129.34 gain 211 12 -131.33 gain 12 212 -134.53 gain 212 12 -135.06 gain 12 213 -125.43 gain 213 12 -125.16 gain 12 214 -130.93 gain 214 12 -130.55 gain 12 215 -130.59 gain 215 12 -126.62 gain 12 216 -131.34 gain 216 12 -132.03 gain 12 217 -133.61 gain 217 12 -134.82 gain 12 218 -125.97 gain 218 12 -129.37 gain 12 219 -136.09 gain 219 12 -130.85 gain 12 220 -124.86 gain 220 12 -130.11 gain 12 221 -132.36 gain 221 12 -133.25 gain 12 222 -131.38 gain 222 12 -132.60 gain 12 223 -129.00 gain 223 12 -128.83 gain 12 224 -127.24 gain 224 12 -129.76 gain 13 14 -90.55 gain 14 13 -92.41 gain 13 15 -124.64 gain 15 13 -130.13 gain 13 16 -127.18 gain 16 13 -130.48 gain 13 17 -129.17 gain 17 13 -128.90 gain 13 18 -118.37 gain 18 13 -117.94 gain 13 19 -114.14 gain 19 13 -116.70 gain 13 20 -116.84 gain 20 13 -120.84 gain 13 21 -114.32 gain 21 13 -116.25 gain 13 22 -110.56 gain 22 13 -111.08 gain 13 23 -110.82 gain 23 13 -115.62 gain 13 24 -112.20 gain 24 13 -111.41 gain 13 25 -106.86 gain 25 13 -112.82 gain 13 26 -97.23 gain 26 13 -97.07 gain 13 27 -98.10 gain 27 13 -93.83 gain 13 28 -95.99 gain 28 13 -94.42 gain 13 29 -103.62 gain 29 13 -103.93 gain 13 30 -126.99 gain 30 13 -130.78 gain 13 31 -118.57 gain 31 13 -119.97 gain 13 32 -124.77 gain 32 13 -126.19 gain 13 33 -117.08 gain 33 13 -120.76 gain 13 34 -115.56 gain 34 13 -117.84 gain 13 35 -118.87 gain 35 13 -120.97 gain 13 36 -115.81 gain 36 13 -121.70 gain 13 37 -119.20 gain 37 13 -117.29 gain 13 38 -113.66 gain 38 13 -117.76 gain 13 39 -104.28 gain 39 13 -107.25 gain 13 40 -109.15 gain 40 13 -114.17 gain 13 41 -99.40 gain 41 13 -100.05 gain 13 42 -100.94 gain 42 13 -99.74 gain 13 43 -99.60 gain 43 13 -102.29 gain 13 44 -103.67 gain 44 13 -109.41 gain 13 45 -126.68 gain 45 13 -130.91 gain 13 46 -122.71 gain 46 13 -122.73 gain 13 47 -122.93 gain 47 13 -124.01 gain 13 48 -126.52 gain 48 13 -125.39 gain 13 49 -118.08 gain 49 13 -124.92 gain 13 50 -124.75 gain 50 13 -132.55 gain 13 51 -120.73 gain 51 13 -123.67 gain 13 52 -118.59 gain 52 13 -117.55 gain 13 53 -112.93 gain 53 13 -112.90 gain 13 54 -115.79 gain 54 13 -116.47 gain 13 55 -109.64 gain 55 13 -109.61 gain 13 56 -105.15 gain 56 13 -112.45 gain 13 57 -109.14 gain 57 13 -110.32 gain 13 58 -105.03 gain 58 13 -108.95 gain 13 59 -103.17 gain 59 13 -103.21 gain 13 60 -127.34 gain 60 13 -128.70 gain 13 61 -123.94 gain 61 13 -124.05 gain 13 62 -123.57 gain 62 13 -128.90 gain 13 63 -118.33 gain 63 13 -116.89 gain 13 64 -120.44 gain 64 13 -121.97 gain 13 65 -119.75 gain 65 13 -123.37 gain 13 66 -117.07 gain 66 13 -114.95 gain 13 67 -117.50 gain 67 13 -117.65 gain 13 68 -125.97 gain 68 13 -130.68 gain 13 69 -118.67 gain 69 13 -120.67 gain 13 70 -112.35 gain 70 13 -114.11 gain 13 71 -112.89 gain 71 13 -112.76 gain 13 72 -105.89 gain 72 13 -106.17 gain 13 73 -116.82 gain 73 13 -115.49 gain 13 74 -109.42 gain 74 13 -111.97 gain 13 75 -127.26 gain 75 13 -129.95 gain 13 76 -127.64 gain 76 13 -126.29 gain 13 77 -119.30 gain 77 13 -121.61 gain 13 78 -115.34 gain 78 13 -120.49 gain 13 79 -125.63 gain 79 13 -125.57 gain 13 80 -119.48 gain 80 13 -119.91 gain 13 81 -121.70 gain 81 13 -122.73 gain 13 82 -116.43 gain 82 13 -115.09 gain 13 83 -118.49 gain 83 13 -118.18 gain 13 84 -118.50 gain 84 13 -118.34 gain 13 85 -122.14 gain 85 13 -118.79 gain 13 86 -119.56 gain 86 13 -119.59 gain 13 87 -116.72 gain 87 13 -120.70 gain 13 88 -119.33 gain 88 13 -121.07 gain 13 89 -113.53 gain 89 13 -113.87 gain 13 90 -128.37 gain 90 13 -125.72 gain 13 91 -126.20 gain 91 13 -127.49 gain 13 92 -119.13 gain 92 13 -117.39 gain 13 93 -122.06 gain 93 13 -125.09 gain 13 94 -119.99 gain 94 13 -122.91 gain 13 95 -126.35 gain 95 13 -131.52 gain 13 96 -130.15 gain 96 13 -132.66 gain 13 97 -118.74 gain 97 13 -119.99 gain 13 98 -125.43 gain 98 13 -127.48 gain 13 99 -119.37 gain 99 13 -119.24 gain 13 100 -117.29 gain 100 13 -116.73 gain 13 101 -118.34 gain 101 13 -117.94 gain 13 102 -113.18 gain 102 13 -113.56 gain 13 103 -116.17 gain 103 13 -114.03 gain 13 104 -117.08 gain 104 13 -120.32 gain 13 105 -134.10 gain 105 13 -133.28 gain 13 106 -125.96 gain 106 13 -126.23 gain 13 107 -129.27 gain 107 13 -136.10 gain 13 108 -126.99 gain 108 13 -126.14 gain 13 109 -130.74 gain 109 13 -133.38 gain 13 110 -121.18 gain 110 13 -122.29 gain 13 111 -121.39 gain 111 13 -122.18 gain 13 112 -119.50 gain 112 13 -119.17 gain 13 113 -126.82 gain 113 13 -125.29 gain 13 114 -115.84 gain 114 13 -117.62 gain 13 115 -112.87 gain 115 13 -108.95 gain 13 116 -113.60 gain 116 13 -117.23 gain 13 117 -113.24 gain 117 13 -118.36 gain 13 118 -122.84 gain 118 13 -126.28 gain 13 119 -116.21 gain 119 13 -114.31 gain 13 120 -130.60 gain 120 13 -133.22 gain 13 121 -130.41 gain 121 13 -132.32 gain 13 122 -124.65 gain 122 13 -128.67 gain 13 123 -120.98 gain 123 13 -125.78 gain 13 124 -123.88 gain 124 13 -125.09 gain 13 125 -130.70 gain 125 13 -133.25 gain 13 126 -120.78 gain 126 13 -121.28 gain 13 127 -124.65 gain 127 13 -128.62 gain 13 128 -124.77 gain 128 13 -126.67 gain 13 129 -122.61 gain 129 13 -122.42 gain 13 130 -126.66 gain 130 13 -124.29 gain 13 131 -121.01 gain 131 13 -125.73 gain 13 132 -118.00 gain 132 13 -122.35 gain 13 133 -115.84 gain 133 13 -118.26 gain 13 134 -113.17 gain 134 13 -112.29 gain 13 135 -126.61 gain 135 13 -129.30 gain 13 136 -119.17 gain 136 13 -122.46 gain 13 137 -131.13 gain 137 13 -131.91 gain 13 138 -124.16 gain 138 13 -123.94 gain 13 139 -125.75 gain 139 13 -126.51 gain 13 140 -122.98 gain 140 13 -126.35 gain 13 141 -126.79 gain 141 13 -128.83 gain 13 142 -117.30 gain 142 13 -118.66 gain 13 143 -123.05 gain 143 13 -124.02 gain 13 144 -123.90 gain 144 13 -125.89 gain 13 145 -125.97 gain 145 13 -126.40 gain 13 146 -121.38 gain 146 13 -120.73 gain 13 147 -119.13 gain 147 13 -115.57 gain 13 148 -122.25 gain 148 13 -118.40 gain 13 149 -121.33 gain 149 13 -120.65 gain 13 150 -126.25 gain 150 13 -128.26 gain 13 151 -124.09 gain 151 13 -126.29 gain 13 152 -121.56 gain 152 13 -120.74 gain 13 153 -126.72 gain 153 13 -123.48 gain 13 154 -124.79 gain 154 13 -130.09 gain 13 155 -124.79 gain 155 13 -129.99 gain 13 156 -128.54 gain 156 13 -128.13 gain 13 157 -122.43 gain 157 13 -124.96 gain 13 158 -118.61 gain 158 13 -123.73 gain 13 159 -125.08 gain 159 13 -126.83 gain 13 160 -116.17 gain 160 13 -115.03 gain 13 161 -117.84 gain 161 13 -120.18 gain 13 162 -126.18 gain 162 13 -127.39 gain 13 163 -118.27 gain 163 13 -121.63 gain 13 164 -119.49 gain 164 13 -123.89 gain 13 165 -124.57 gain 165 13 -125.01 gain 13 166 -126.25 gain 166 13 -128.27 gain 13 167 -120.46 gain 167 13 -124.56 gain 13 168 -131.78 gain 168 13 -134.33 gain 13 169 -124.14 gain 169 13 -130.89 gain 13 170 -122.71 gain 170 13 -120.99 gain 13 171 -121.40 gain 171 13 -124.70 gain 13 172 -126.78 gain 172 13 -124.78 gain 13 173 -126.55 gain 173 13 -123.98 gain 13 174 -116.85 gain 174 13 -118.59 gain 13 175 -125.92 gain 175 13 -131.20 gain 13 176 -120.68 gain 176 13 -117.98 gain 13 177 -125.04 gain 177 13 -130.14 gain 13 178 -124.44 gain 178 13 -125.38 gain 13 179 -125.10 gain 179 13 -124.42 gain 13 180 -129.13 gain 180 13 -129.93 gain 13 181 -126.94 gain 181 13 -127.80 gain 13 182 -121.59 gain 182 13 -124.84 gain 13 183 -127.86 gain 183 13 -124.50 gain 13 184 -130.29 gain 184 13 -131.71 gain 13 185 -126.67 gain 185 13 -125.58 gain 13 186 -123.97 gain 186 13 -123.16 gain 13 187 -124.59 gain 187 13 -126.32 gain 13 188 -124.91 gain 188 13 -129.90 gain 13 189 -114.46 gain 189 13 -116.97 gain 13 190 -117.24 gain 190 13 -116.75 gain 13 191 -123.79 gain 191 13 -124.40 gain 13 192 -127.04 gain 192 13 -130.51 gain 13 193 -129.48 gain 193 13 -134.21 gain 13 194 -122.28 gain 194 13 -120.82 gain 13 195 -136.56 gain 195 13 -135.73 gain 13 196 -133.44 gain 196 13 -136.64 gain 13 197 -124.82 gain 197 13 -124.09 gain 13 198 -134.06 gain 198 13 -132.85 gain 13 199 -121.92 gain 199 13 -124.63 gain 13 200 -126.85 gain 200 13 -126.50 gain 13 201 -122.50 gain 201 13 -122.95 gain 13 202 -122.26 gain 202 13 -126.72 gain 13 203 -122.45 gain 203 13 -126.53 gain 13 204 -126.50 gain 204 13 -127.86 gain 13 205 -130.87 gain 205 13 -131.30 gain 13 206 -126.50 gain 206 13 -131.45 gain 13 207 -128.42 gain 207 13 -125.73 gain 13 208 -126.70 gain 208 13 -129.79 gain 13 209 -113.54 gain 209 13 -117.62 gain 13 210 -134.90 gain 210 13 -135.92 gain 13 211 -128.42 gain 211 13 -131.46 gain 13 212 -127.54 gain 212 13 -129.13 gain 13 213 -132.59 gain 213 13 -133.36 gain 13 214 -131.50 gain 214 13 -132.16 gain 13 215 -134.93 gain 215 13 -132.01 gain 13 216 -123.57 gain 216 13 -125.31 gain 13 217 -132.04 gain 217 13 -134.30 gain 13 218 -130.21 gain 218 13 -134.66 gain 13 219 -126.23 gain 219 13 -122.04 gain 13 220 -124.24 gain 220 13 -130.53 gain 13 221 -127.62 gain 221 13 -129.56 gain 13 222 -135.65 gain 222 13 -137.92 gain 13 223 -126.45 gain 223 13 -127.33 gain 13 224 -120.97 gain 224 13 -124.54 gain 14 15 -121.35 gain 15 14 -124.97 gain 14 16 -123.10 gain 16 14 -124.54 gain 14 17 -126.41 gain 17 14 -124.28 gain 14 18 -126.93 gain 18 14 -124.64 gain 14 19 -120.49 gain 19 14 -121.19 gain 14 20 -118.65 gain 20 14 -120.79 gain 14 21 -120.52 gain 21 14 -120.59 gain 14 22 -111.31 gain 22 14 -109.97 gain 14 23 -112.35 gain 23 14 -115.28 gain 14 24 -113.35 gain 24 14 -110.69 gain 14 25 -115.19 gain 25 14 -119.28 gain 14 26 -111.09 gain 26 14 -109.07 gain 14 27 -104.31 gain 27 14 -98.19 gain 14 28 -98.55 gain 28 14 -95.12 gain 14 29 -90.77 gain 29 14 -89.22 gain 14 30 -126.73 gain 30 14 -128.65 gain 14 31 -126.62 gain 31 14 -126.15 gain 14 32 -127.80 gain 32 14 -127.37 gain 14 33 -129.01 gain 33 14 -130.82 gain 14 34 -126.41 gain 34 14 -126.83 gain 14 35 -122.82 gain 35 14 -123.06 gain 14 36 -123.61 gain 36 14 -127.63 gain 14 37 -121.33 gain 37 14 -117.56 gain 14 38 -120.35 gain 38 14 -122.60 gain 14 39 -107.40 gain 39 14 -108.51 gain 14 40 -113.82 gain 40 14 -116.98 gain 14 41 -110.03 gain 41 14 -108.82 gain 14 42 -108.09 gain 42 14 -105.03 gain 14 43 -104.78 gain 43 14 -105.61 gain 14 44 -97.30 gain 44 14 -101.19 gain 14 45 -126.53 gain 45 14 -128.89 gain 14 46 -129.60 gain 46 14 -127.76 gain 14 47 -129.64 gain 47 14 -128.85 gain 14 48 -118.39 gain 48 14 -115.39 gain 14 49 -132.05 gain 49 14 -137.02 gain 14 50 -120.34 gain 50 14 -126.28 gain 14 51 -120.58 gain 51 14 -121.66 gain 14 52 -117.34 gain 52 14 -114.44 gain 14 53 -116.53 gain 53 14 -114.65 gain 14 54 -114.26 gain 54 14 -113.07 gain 14 55 -114.02 gain 55 14 -112.13 gain 14 56 -111.15 gain 56 14 -116.59 gain 14 57 -104.62 gain 57 14 -103.93 gain 14 58 -112.62 gain 58 14 -114.67 gain 14 59 -110.31 gain 59 14 -108.49 gain 14 60 -133.38 gain 60 14 -132.88 gain 14 61 -120.38 gain 61 14 -118.64 gain 14 62 -128.16 gain 62 14 -131.63 gain 14 63 -131.50 gain 63 14 -128.20 gain 14 64 -126.02 gain 64 14 -125.69 gain 14 65 -118.08 gain 65 14 -119.84 gain 14 66 -121.92 gain 66 14 -117.93 gain 14 67 -124.60 gain 67 14 -122.89 gain 14 68 -127.03 gain 68 14 -129.87 gain 14 69 -119.21 gain 69 14 -119.35 gain 14 70 -109.53 gain 70 14 -109.42 gain 14 71 -112.34 gain 71 14 -110.35 gain 14 72 -113.54 gain 72 14 -111.96 gain 14 73 -107.93 gain 73 14 -104.74 gain 14 74 -107.82 gain 74 14 -108.51 gain 14 75 -126.10 gain 75 14 -126.93 gain 14 76 -121.32 gain 76 14 -118.10 gain 14 77 -124.59 gain 77 14 -125.03 gain 14 78 -130.45 gain 78 14 -133.74 gain 14 79 -123.69 gain 79 14 -121.76 gain 14 80 -118.53 gain 80 14 -117.10 gain 14 81 -128.02 gain 81 14 -127.18 gain 14 82 -117.84 gain 82 14 -114.63 gain 14 83 -123.81 gain 83 14 -121.63 gain 14 84 -118.57 gain 84 14 -116.55 gain 14 85 -111.85 gain 85 14 -106.63 gain 14 86 -119.66 gain 86 14 -117.82 gain 14 87 -110.61 gain 87 14 -112.74 gain 14 88 -116.68 gain 88 14 -116.56 gain 14 89 -115.91 gain 89 14 -114.38 gain 14 90 -131.65 gain 90 14 -127.13 gain 14 91 -127.42 gain 91 14 -126.85 gain 14 92 -125.88 gain 92 14 -122.27 gain 14 93 -132.47 gain 93 14 -133.64 gain 14 94 -126.08 gain 94 14 -127.14 gain 14 95 -125.39 gain 95 14 -128.69 gain 14 96 -125.34 gain 96 14 -125.98 gain 14 97 -117.43 gain 97 14 -116.82 gain 14 98 -126.42 gain 98 14 -126.60 gain 14 99 -121.19 gain 99 14 -119.20 gain 14 100 -118.82 gain 100 14 -116.39 gain 14 101 -117.02 gain 101 14 -114.76 gain 14 102 -115.06 gain 102 14 -113.58 gain 14 103 -109.10 gain 103 14 -105.10 gain 14 104 -121.08 gain 104 14 -122.46 gain 14 105 -124.78 gain 105 14 -122.10 gain 14 106 -132.67 gain 106 14 -131.07 gain 14 107 -127.12 gain 107 14 -132.09 gain 14 108 -125.70 gain 108 14 -122.98 gain 14 109 -125.89 gain 109 14 -126.66 gain 14 110 -127.03 gain 110 14 -126.28 gain 14 111 -123.13 gain 111 14 -122.06 gain 14 112 -121.42 gain 112 14 -119.22 gain 14 113 -123.76 gain 113 14 -120.37 gain 14 114 -124.83 gain 114 14 -124.75 gain 14 115 -117.48 gain 115 14 -111.70 gain 14 116 -118.09 gain 116 14 -119.85 gain 14 117 -127.47 gain 117 14 -130.73 gain 14 118 -122.85 gain 118 14 -124.43 gain 14 119 -117.19 gain 119 14 -113.43 gain 14 120 -121.73 gain 120 14 -122.48 gain 14 121 -127.58 gain 121 14 -127.62 gain 14 122 -135.15 gain 122 14 -137.31 gain 14 123 -129.93 gain 123 14 -132.86 gain 14 124 -127.59 gain 124 14 -126.93 gain 14 125 -129.25 gain 125 14 -129.93 gain 14 126 -123.34 gain 126 14 -121.98 gain 14 127 -118.36 gain 127 14 -120.46 gain 14 128 -119.74 gain 128 14 -119.78 gain 14 129 -122.28 gain 129 14 -120.23 gain 14 130 -126.99 gain 130 14 -122.76 gain 14 131 -115.85 gain 131 14 -118.70 gain 14 132 -119.08 gain 132 14 -121.56 gain 14 133 -126.93 gain 133 14 -127.49 gain 14 134 -119.26 gain 134 14 -116.52 gain 14 135 -130.22 gain 135 14 -131.04 gain 14 136 -132.69 gain 136 14 -134.13 gain 14 137 -133.94 gain 137 14 -132.86 gain 14 138 -130.57 gain 138 14 -128.49 gain 14 139 -122.73 gain 139 14 -121.63 gain 14 140 -132.05 gain 140 14 -133.56 gain 14 141 -123.81 gain 141 14 -123.99 gain 14 142 -130.81 gain 142 14 -130.30 gain 14 143 -125.27 gain 143 14 -124.38 gain 14 144 -119.83 gain 144 14 -119.95 gain 14 145 -128.50 gain 145 14 -127.07 gain 14 146 -122.30 gain 146 14 -119.78 gain 14 147 -123.72 gain 147 14 -118.30 gain 14 148 -123.11 gain 148 14 -117.40 gain 14 149 -119.80 gain 149 14 -117.26 gain 14 150 -132.15 gain 150 14 -132.29 gain 14 151 -139.47 gain 151 14 -139.81 gain 14 152 -124.67 gain 152 14 -121.98 gain 14 153 -129.40 gain 153 14 -124.30 gain 14 154 -126.58 gain 154 14 -130.02 gain 14 155 -135.90 gain 155 14 -139.24 gain 14 156 -116.61 gain 156 14 -114.34 gain 14 157 -128.13 gain 157 14 -128.80 gain 14 158 -129.37 gain 158 14 -132.63 gain 14 159 -130.21 gain 159 14 -130.10 gain 14 160 -126.58 gain 160 14 -123.57 gain 14 161 -115.96 gain 161 14 -116.45 gain 14 162 -128.88 gain 162 14 -128.23 gain 14 163 -119.57 gain 163 14 -121.07 gain 14 164 -127.33 gain 164 14 -129.87 gain 14 165 -133.54 gain 165 14 -132.12 gain 14 166 -125.82 gain 166 14 -125.97 gain 14 167 -127.23 gain 167 14 -129.47 gain 14 168 -130.43 gain 168 14 -131.12 gain 14 169 -133.03 gain 169 14 -137.92 gain 14 170 -126.37 gain 170 14 -122.79 gain 14 171 -127.07 gain 171 14 -128.51 gain 14 172 -132.24 gain 172 14 -128.38 gain 14 173 -118.89 gain 173 14 -114.46 gain 14 174 -124.50 gain 174 14 -124.37 gain 14 175 -122.35 gain 175 14 -125.78 gain 14 176 -128.26 gain 176 14 -123.69 gain 14 177 -123.26 gain 177 14 -126.51 gain 14 178 -137.67 gain 178 14 -136.74 gain 14 179 -127.43 gain 179 14 -124.90 gain 14 180 -129.12 gain 180 14 -128.05 gain 14 181 -130.88 gain 181 14 -129.87 gain 14 182 -129.86 gain 182 14 -131.25 gain 14 183 -126.99 gain 183 14 -121.76 gain 14 184 -129.87 gain 184 14 -129.42 gain 14 185 -133.53 gain 185 14 -130.57 gain 14 186 -130.32 gain 186 14 -127.65 gain 14 187 -125.36 gain 187 14 -125.23 gain 14 188 -128.11 gain 188 14 -131.24 gain 14 189 -138.85 gain 189 14 -139.49 gain 14 190 -126.42 gain 190 14 -124.07 gain 14 191 -122.57 gain 191 14 -121.31 gain 14 192 -128.45 gain 192 14 -130.06 gain 14 193 -124.75 gain 193 14 -127.61 gain 14 194 -125.20 gain 194 14 -121.87 gain 14 195 -129.39 gain 195 14 -126.69 gain 14 196 -134.86 gain 196 14 -136.20 gain 14 197 -135.18 gain 197 14 -132.59 gain 14 198 -133.10 gain 198 14 -130.03 gain 14 199 -127.97 gain 199 14 -128.82 gain 14 200 -125.87 gain 200 14 -123.65 gain 14 201 -138.35 gain 201 14 -136.94 gain 14 202 -130.78 gain 202 14 -133.37 gain 14 203 -137.52 gain 203 14 -139.73 gain 14 204 -135.60 gain 204 14 -135.10 gain 14 205 -120.63 gain 205 14 -119.20 gain 14 206 -138.51 gain 206 14 -141.60 gain 14 207 -134.38 gain 207 14 -129.83 gain 14 208 -134.95 gain 208 14 -136.17 gain 14 209 -127.56 gain 209 14 -129.78 gain 14 210 -137.97 gain 210 14 -137.12 gain 14 211 -130.55 gain 211 14 -131.73 gain 14 212 -129.02 gain 212 14 -128.74 gain 14 213 -135.67 gain 213 14 -134.59 gain 14 214 -136.94 gain 214 14 -135.74 gain 14 215 -128.39 gain 215 14 -123.61 gain 14 216 -128.42 gain 216 14 -128.29 gain 14 217 -129.20 gain 217 14 -129.60 gain 14 218 -126.52 gain 218 14 -129.11 gain 14 219 -128.30 gain 219 14 -122.24 gain 14 220 -127.81 gain 220 14 -132.24 gain 14 221 -135.52 gain 221 14 -135.60 gain 14 222 -124.22 gain 222 14 -124.62 gain 14 223 -128.45 gain 223 14 -127.47 gain 14 224 -127.53 gain 224 14 -129.23 gain 15 16 -94.01 gain 16 15 -91.83 gain 15 17 -108.42 gain 17 15 -102.67 gain 15 18 -116.80 gain 18 15 -110.89 gain 15 19 -115.85 gain 19 15 -112.93 gain 15 20 -119.97 gain 20 15 -118.49 gain 15 21 -126.36 gain 21 15 -122.80 gain 15 22 -119.41 gain 22 15 -114.45 gain 15 23 -124.07 gain 23 15 -123.38 gain 15 24 -129.64 gain 24 15 -123.36 gain 15 25 -130.06 gain 25 15 -130.53 gain 15 26 -133.11 gain 26 15 -127.46 gain 15 27 -133.77 gain 27 15 -124.02 gain 15 28 -132.04 gain 28 15 -124.99 gain 15 29 -126.46 gain 29 15 -121.29 gain 15 30 -106.53 gain 30 15 -104.82 gain 15 31 -105.75 gain 31 15 -101.66 gain 15 32 -106.00 gain 32 15 -101.94 gain 15 33 -117.21 gain 33 15 -115.40 gain 15 34 -117.59 gain 34 15 -114.38 gain 15 35 -122.97 gain 35 15 -119.59 gain 15 36 -119.81 gain 36 15 -120.21 gain 15 37 -125.34 gain 37 15 -117.94 gain 15 38 -128.32 gain 38 15 -126.94 gain 15 39 -120.38 gain 39 15 -117.87 gain 15 40 -128.27 gain 40 15 -127.80 gain 15 41 -127.99 gain 41 15 -123.15 gain 15 42 -120.40 gain 42 15 -113.71 gain 15 43 -136.22 gain 43 15 -133.42 gain 15 44 -137.59 gain 44 15 -137.85 gain 15 45 -105.79 gain 45 15 -104.52 gain 15 46 -106.15 gain 46 15 -100.68 gain 15 47 -106.90 gain 47 15 -102.49 gain 15 48 -113.90 gain 48 15 -107.28 gain 15 49 -121.01 gain 49 15 -122.36 gain 15 50 -119.07 gain 50 15 -121.39 gain 15 51 -122.37 gain 51 15 -119.83 gain 15 52 -122.61 gain 52 15 -116.09 gain 15 53 -128.01 gain 53 15 -122.50 gain 15 54 -128.07 gain 54 15 -123.26 gain 15 55 -135.47 gain 55 15 -129.96 gain 15 56 -126.42 gain 56 15 -128.23 gain 15 57 -139.18 gain 57 15 -134.87 gain 15 58 -132.80 gain 58 15 -131.23 gain 15 59 -129.64 gain 59 15 -124.19 gain 15 60 -115.36 gain 60 15 -111.23 gain 15 61 -114.26 gain 61 15 -108.89 gain 15 62 -115.06 gain 62 15 -114.91 gain 15 63 -119.72 gain 63 15 -112.79 gain 15 64 -112.89 gain 64 15 -108.93 gain 15 65 -120.30 gain 65 15 -118.44 gain 15 66 -129.49 gain 66 15 -121.88 gain 15 67 -122.18 gain 67 15 -116.85 gain 15 68 -128.54 gain 68 15 -127.76 gain 15 69 -126.92 gain 69 15 -123.44 gain 15 70 -125.86 gain 70 15 -122.13 gain 15 71 -129.49 gain 71 15 -123.86 gain 15 72 -127.53 gain 72 15 -122.32 gain 15 73 -134.14 gain 73 15 -127.33 gain 15 74 -130.22 gain 74 15 -127.28 gain 15 75 -116.84 gain 75 15 -114.04 gain 15 76 -117.27 gain 76 15 -110.43 gain 15 77 -114.83 gain 77 15 -111.65 gain 15 78 -116.60 gain 78 15 -116.27 gain 15 79 -119.51 gain 79 15 -113.96 gain 15 80 -115.47 gain 80 15 -110.42 gain 15 81 -127.46 gain 81 15 -123.00 gain 15 82 -122.35 gain 82 15 -115.52 gain 15 83 -122.95 gain 83 15 -117.15 gain 15 84 -122.09 gain 84 15 -116.44 gain 15 85 -126.28 gain 85 15 -117.44 gain 15 86 -127.21 gain 86 15 -121.75 gain 15 87 -127.56 gain 87 15 -126.07 gain 15 88 -127.18 gain 88 15 -123.43 gain 15 89 -140.24 gain 89 15 -135.09 gain 15 90 -121.70 gain 90 15 -113.56 gain 15 91 -122.60 gain 91 15 -118.41 gain 15 92 -121.28 gain 92 15 -114.04 gain 15 93 -124.83 gain 93 15 -122.38 gain 15 94 -120.11 gain 94 15 -117.54 gain 15 95 -124.49 gain 95 15 -124.17 gain 15 96 -120.71 gain 96 15 -117.73 gain 15 97 -129.24 gain 97 15 -125.00 gain 15 98 -130.90 gain 98 15 -127.46 gain 15 99 -121.73 gain 99 15 -116.11 gain 15 100 -138.77 gain 100 15 -132.72 gain 15 101 -126.13 gain 101 15 -120.24 gain 15 102 -130.85 gain 102 15 -125.74 gain 15 103 -133.62 gain 103 15 -125.99 gain 15 104 -132.45 gain 104 15 -130.20 gain 15 105 -114.82 gain 105 15 -108.52 gain 15 106 -120.96 gain 106 15 -115.74 gain 15 107 -123.22 gain 107 15 -124.57 gain 15 108 -122.69 gain 108 15 -116.36 gain 15 109 -120.00 gain 109 15 -117.16 gain 15 110 -124.74 gain 110 15 -120.37 gain 15 111 -124.29 gain 111 15 -119.59 gain 15 112 -122.44 gain 112 15 -116.62 gain 15 113 -123.81 gain 113 15 -116.80 gain 15 114 -131.21 gain 114 15 -127.50 gain 15 115 -134.68 gain 115 15 -125.27 gain 15 116 -129.72 gain 116 15 -127.85 gain 15 117 -129.80 gain 117 15 -129.43 gain 15 118 -132.78 gain 118 15 -130.73 gain 15 119 -131.72 gain 119 15 -124.34 gain 15 120 -123.44 gain 120 15 -120.57 gain 15 121 -129.78 gain 121 15 -126.20 gain 15 122 -121.53 gain 122 15 -120.06 gain 15 123 -123.13 gain 123 15 -122.45 gain 15 124 -125.00 gain 124 15 -120.72 gain 15 125 -124.62 gain 125 15 -121.68 gain 15 126 -131.47 gain 126 15 -126.48 gain 15 127 -131.92 gain 127 15 -130.40 gain 15 128 -121.08 gain 128 15 -117.50 gain 15 129 -129.01 gain 129 15 -123.34 gain 15 130 -122.22 gain 130 15 -114.37 gain 15 131 -127.74 gain 131 15 -126.98 gain 15 132 -135.22 gain 132 15 -134.08 gain 15 133 -133.64 gain 133 15 -130.57 gain 15 134 -132.52 gain 134 15 -126.15 gain 15 135 -124.52 gain 135 15 -121.72 gain 15 136 -123.97 gain 136 15 -121.79 gain 15 137 -121.57 gain 137 15 -116.86 gain 15 138 -120.89 gain 138 15 -115.19 gain 15 139 -129.63 gain 139 15 -124.91 gain 15 140 -129.55 gain 140 15 -127.44 gain 15 141 -123.55 gain 141 15 -120.11 gain 15 142 -132.87 gain 142 15 -128.74 gain 15 143 -130.46 gain 143 15 -125.94 gain 15 144 -128.85 gain 144 15 -125.34 gain 15 145 -131.53 gain 145 15 -126.48 gain 15 146 -133.77 gain 146 15 -127.63 gain 15 147 -130.65 gain 147 15 -121.60 gain 15 148 -132.01 gain 148 15 -122.68 gain 15 149 -132.91 gain 149 15 -126.74 gain 15 150 -123.33 gain 150 15 -119.85 gain 15 151 -125.87 gain 151 15 -122.59 gain 15 152 -130.51 gain 152 15 -124.20 gain 15 153 -130.00 gain 153 15 -121.27 gain 15 154 -130.70 gain 154 15 -130.52 gain 15 155 -133.17 gain 155 15 -132.89 gain 15 156 -131.26 gain 156 15 -125.36 gain 15 157 -124.79 gain 157 15 -121.84 gain 15 158 -131.17 gain 158 15 -130.81 gain 15 159 -132.86 gain 159 15 -129.12 gain 15 160 -131.52 gain 160 15 -124.89 gain 15 161 -129.69 gain 161 15 -126.55 gain 15 162 -133.65 gain 162 15 -129.38 gain 15 163 -133.02 gain 163 15 -130.89 gain 15 164 -141.54 gain 164 15 -140.46 gain 15 165 -128.31 gain 165 15 -123.27 gain 15 166 -128.62 gain 166 15 -125.14 gain 15 167 -129.72 gain 167 15 -128.34 gain 15 168 -124.73 gain 168 15 -121.80 gain 15 169 -128.65 gain 169 15 -129.92 gain 15 170 -124.48 gain 170 15 -117.27 gain 15 171 -125.22 gain 171 15 -123.03 gain 15 172 -132.14 gain 172 15 -124.65 gain 15 173 -132.55 gain 173 15 -124.50 gain 15 174 -138.19 gain 174 15 -134.43 gain 15 175 -131.17 gain 175 15 -130.97 gain 15 176 -127.95 gain 176 15 -119.76 gain 15 177 -137.58 gain 177 15 -137.20 gain 15 178 -135.93 gain 178 15 -131.38 gain 15 179 -132.65 gain 179 15 -126.49 gain 15 180 -129.92 gain 180 15 -125.23 gain 15 181 -134.68 gain 181 15 -130.05 gain 15 182 -138.81 gain 182 15 -136.57 gain 15 183 -133.11 gain 183 15 -124.26 gain 15 184 -127.43 gain 184 15 -123.37 gain 15 185 -131.75 gain 185 15 -125.17 gain 15 186 -137.51 gain 186 15 -131.21 gain 15 187 -129.78 gain 187 15 -126.02 gain 15 188 -130.66 gain 188 15 -130.16 gain 15 189 -134.34 gain 189 15 -131.35 gain 15 190 -135.45 gain 190 15 -129.48 gain 15 191 -133.57 gain 191 15 -128.69 gain 15 192 -137.11 gain 192 15 -135.09 gain 15 193 -130.34 gain 193 15 -129.58 gain 15 194 -140.81 gain 194 15 -133.86 gain 15 195 -131.79 gain 195 15 -125.47 gain 15 196 -136.14 gain 196 15 -133.86 gain 15 197 -125.05 gain 197 15 -118.84 gain 15 198 -130.51 gain 198 15 -123.82 gain 15 199 -128.87 gain 199 15 -126.09 gain 15 200 -132.44 gain 200 15 -126.60 gain 15 201 -135.46 gain 201 15 -130.42 gain 15 202 -127.88 gain 202 15 -126.84 gain 15 203 -132.25 gain 203 15 -130.84 gain 15 204 -133.15 gain 204 15 -129.03 gain 15 205 -139.59 gain 205 15 -134.53 gain 15 206 -130.53 gain 206 15 -130.00 gain 15 207 -125.61 gain 207 15 -117.44 gain 15 208 -132.00 gain 208 15 -129.60 gain 15 209 -131.47 gain 209 15 -130.06 gain 15 210 -133.80 gain 210 15 -129.33 gain 15 211 -134.98 gain 211 15 -132.54 gain 15 212 -128.64 gain 212 15 -124.73 gain 15 213 -135.19 gain 213 15 -130.48 gain 15 214 -134.73 gain 214 15 -129.90 gain 15 215 -132.78 gain 215 15 -124.37 gain 15 216 -136.37 gain 216 15 -132.63 gain 15 217 -138.61 gain 217 15 -135.38 gain 15 218 -134.70 gain 218 15 -133.66 gain 15 219 -133.59 gain 219 15 -123.91 gain 15 220 -132.20 gain 220 15 -133.02 gain 15 221 -136.44 gain 221 15 -132.89 gain 15 222 -131.73 gain 222 15 -128.51 gain 15 223 -131.45 gain 223 15 -126.84 gain 15 224 -133.60 gain 224 15 -131.68 gain 16 17 -100.02 gain 17 16 -96.45 gain 16 18 -104.92 gain 18 16 -101.18 gain 16 19 -115.29 gain 19 16 -114.55 gain 16 20 -112.20 gain 20 16 -112.90 gain 16 21 -110.01 gain 21 16 -108.64 gain 16 22 -115.62 gain 22 16 -112.84 gain 16 23 -118.56 gain 23 16 -120.05 gain 16 24 -116.91 gain 24 16 -112.81 gain 16 25 -122.46 gain 25 16 -125.11 gain 16 26 -119.87 gain 26 16 -116.41 gain 16 27 -126.78 gain 27 16 -119.21 gain 16 28 -128.69 gain 28 16 -123.82 gain 16 29 -131.95 gain 29 16 -128.96 gain 16 30 -96.22 gain 30 16 -96.69 gain 16 31 -94.45 gain 31 16 -92.54 gain 16 32 -102.47 gain 32 16 -100.59 gain 16 33 -109.38 gain 33 16 -109.75 gain 16 34 -116.02 gain 34 16 -115.00 gain 16 35 -109.90 gain 35 16 -108.71 gain 16 36 -115.45 gain 36 16 -118.03 gain 16 37 -117.63 gain 37 16 -112.42 gain 16 38 -118.31 gain 38 16 -119.11 gain 16 39 -120.64 gain 39 16 -120.31 gain 16 40 -124.79 gain 40 16 -126.50 gain 16 41 -129.30 gain 41 16 -126.65 gain 16 42 -127.66 gain 42 16 -123.15 gain 16 43 -123.88 gain 43 16 -123.26 gain 16 44 -127.71 gain 44 16 -130.15 gain 16 45 -108.51 gain 45 16 -109.43 gain 16 46 -110.89 gain 46 16 -107.60 gain 16 47 -102.77 gain 47 16 -100.54 gain 16 48 -102.57 gain 48 16 -98.13 gain 16 49 -108.88 gain 49 16 -112.42 gain 16 50 -117.58 gain 50 16 -122.08 gain 16 51 -113.88 gain 51 16 -113.52 gain 16 52 -122.59 gain 52 16 -118.25 gain 16 53 -124.18 gain 53 16 -120.86 gain 16 54 -125.55 gain 54 16 -122.92 gain 16 55 -126.34 gain 55 16 -123.01 gain 16 56 -128.33 gain 56 16 -132.33 gain 16 57 -135.99 gain 57 16 -133.86 gain 16 58 -124.09 gain 58 16 -124.70 gain 16 59 -129.50 gain 59 16 -126.24 gain 16 60 -107.13 gain 60 16 -105.19 gain 16 61 -108.24 gain 61 16 -105.05 gain 16 62 -109.04 gain 62 16 -111.07 gain 16 63 -115.63 gain 63 16 -110.89 gain 16 64 -121.39 gain 64 16 -119.62 gain 16 65 -111.14 gain 65 16 -111.46 gain 16 66 -112.98 gain 66 16 -107.55 gain 16 67 -120.04 gain 67 16 -116.89 gain 16 68 -118.12 gain 68 16 -119.53 gain 16 69 -118.42 gain 69 16 -117.11 gain 16 70 -128.62 gain 70 16 -127.08 gain 16 71 -126.61 gain 71 16 -123.17 gain 16 72 -128.90 gain 72 16 -125.88 gain 16 73 -132.70 gain 73 16 -128.07 gain 16 74 -124.89 gain 74 16 -124.13 gain 16 75 -111.71 gain 75 16 -111.10 gain 16 76 -114.28 gain 76 16 -109.62 gain 16 77 -115.39 gain 77 16 -114.39 gain 16 78 -115.38 gain 78 16 -117.23 gain 16 79 -115.08 gain 79 16 -111.71 gain 16 80 -124.27 gain 80 16 -121.40 gain 16 81 -116.77 gain 81 16 -114.49 gain 16 82 -112.19 gain 82 16 -107.54 gain 16 83 -119.63 gain 83 16 -116.01 gain 16 84 -121.74 gain 84 16 -118.27 gain 16 85 -122.39 gain 85 16 -115.73 gain 16 86 -125.79 gain 86 16 -122.51 gain 16 87 -127.79 gain 87 16 -128.47 gain 16 88 -131.05 gain 88 16 -129.49 gain 16 89 -126.56 gain 89 16 -123.60 gain 16 90 -112.50 gain 90 16 -106.55 gain 16 91 -111.51 gain 91 16 -109.50 gain 16 92 -119.52 gain 92 16 -114.47 gain 16 93 -118.62 gain 93 16 -118.35 gain 16 94 -123.56 gain 94 16 -123.17 gain 16 95 -117.88 gain 95 16 -119.74 gain 16 96 -122.13 gain 96 16 -121.33 gain 16 97 -128.58 gain 97 16 -126.53 gain 16 98 -122.96 gain 98 16 -121.71 gain 16 99 -125.47 gain 99 16 -122.04 gain 16 100 -129.45 gain 100 16 -125.58 gain 16 101 -126.24 gain 101 16 -122.54 gain 16 102 -133.38 gain 102 16 -130.45 gain 16 103 -144.35 gain 103 16 -138.91 gain 16 104 -127.99 gain 104 16 -127.92 gain 16 105 -121.26 gain 105 16 -117.14 gain 16 106 -125.28 gain 106 16 -122.24 gain 16 107 -113.99 gain 107 16 -117.52 gain 16 108 -121.07 gain 108 16 -116.91 gain 16 109 -110.86 gain 109 16 -110.20 gain 16 110 -126.45 gain 110 16 -124.26 gain 16 111 -123.41 gain 111 16 -120.90 gain 16 112 -119.99 gain 112 16 -116.35 gain 16 113 -120.46 gain 113 16 -115.63 gain 16 114 -125.31 gain 114 16 -123.78 gain 16 115 -128.53 gain 115 16 -121.31 gain 16 116 -128.76 gain 116 16 -129.08 gain 16 117 -128.56 gain 117 16 -130.38 gain 16 118 -126.62 gain 118 16 -126.76 gain 16 119 -130.10 gain 119 16 -124.90 gain 16 120 -113.66 gain 120 16 -112.98 gain 16 121 -123.17 gain 121 16 -121.77 gain 16 122 -122.20 gain 122 16 -122.92 gain 16 123 -128.19 gain 123 16 -129.69 gain 16 124 -126.64 gain 124 16 -124.55 gain 16 125 -132.99 gain 125 16 -132.23 gain 16 126 -113.49 gain 126 16 -110.69 gain 16 127 -118.23 gain 127 16 -118.89 gain 16 128 -125.64 gain 128 16 -124.24 gain 16 129 -124.23 gain 129 16 -120.73 gain 16 130 -130.02 gain 130 16 -124.36 gain 16 131 -127.85 gain 131 16 -129.27 gain 16 132 -131.16 gain 132 16 -132.20 gain 16 133 -129.14 gain 133 16 -128.26 gain 16 134 -133.32 gain 134 16 -129.13 gain 16 135 -127.19 gain 135 16 -126.57 gain 16 136 -122.70 gain 136 16 -122.70 gain 16 137 -122.89 gain 137 16 -120.36 gain 16 138 -131.51 gain 138 16 -127.99 gain 16 139 -117.49 gain 139 16 -114.96 gain 16 140 -123.37 gain 140 16 -123.44 gain 16 141 -128.84 gain 141 16 -127.59 gain 16 142 -127.40 gain 142 16 -125.45 gain 16 143 -119.58 gain 143 16 -117.25 gain 16 144 -123.01 gain 144 16 -121.69 gain 16 145 -129.97 gain 145 16 -127.10 gain 16 146 -130.25 gain 146 16 -126.29 gain 16 147 -127.90 gain 147 16 -121.03 gain 16 148 -123.10 gain 148 16 -115.95 gain 16 149 -131.82 gain 149 16 -127.83 gain 16 150 -121.17 gain 150 16 -119.87 gain 16 151 -122.94 gain 151 16 -121.84 gain 16 152 -119.32 gain 152 16 -115.20 gain 16 153 -130.37 gain 153 16 -123.82 gain 16 154 -125.44 gain 154 16 -127.44 gain 16 155 -123.53 gain 155 16 -125.43 gain 16 156 -126.30 gain 156 16 -122.58 gain 16 157 -122.82 gain 157 16 -122.05 gain 16 158 -131.55 gain 158 16 -133.38 gain 16 159 -125.64 gain 159 16 -124.08 gain 16 160 -135.26 gain 160 16 -130.82 gain 16 161 -124.91 gain 161 16 -123.96 gain 16 162 -131.44 gain 162 16 -129.34 gain 16 163 -132.66 gain 163 16 -132.72 gain 16 164 -132.15 gain 164 16 -133.25 gain 16 165 -133.35 gain 165 16 -130.49 gain 16 166 -126.92 gain 166 16 -125.63 gain 16 167 -126.26 gain 167 16 -127.06 gain 16 168 -131.16 gain 168 16 -130.41 gain 16 169 -125.54 gain 169 16 -128.99 gain 16 170 -130.44 gain 170 16 -125.41 gain 16 171 -122.99 gain 171 16 -122.99 gain 16 172 -124.80 gain 172 16 -119.50 gain 16 173 -130.91 gain 173 16 -125.04 gain 16 174 -124.30 gain 174 16 -122.73 gain 16 175 -132.37 gain 175 16 -134.35 gain 16 176 -133.20 gain 176 16 -127.19 gain 16 177 -130.53 gain 177 16 -132.33 gain 16 178 -127.18 gain 178 16 -124.81 gain 16 179 -131.61 gain 179 16 -127.63 gain 16 180 -132.64 gain 180 16 -130.13 gain 16 181 -138.70 gain 181 16 -136.25 gain 16 182 -128.95 gain 182 16 -128.89 gain 16 183 -127.13 gain 183 16 -120.46 gain 16 184 -126.87 gain 184 16 -124.99 gain 16 185 -126.81 gain 185 16 -122.41 gain 16 186 -130.44 gain 186 16 -126.32 gain 16 187 -128.74 gain 187 16 -127.16 gain 16 188 -123.85 gain 188 16 -125.53 gain 16 189 -124.94 gain 189 16 -124.14 gain 16 190 -131.93 gain 190 16 -128.14 gain 16 191 -137.18 gain 191 16 -134.48 gain 16 192 -131.73 gain 192 16 -131.90 gain 16 193 -125.62 gain 193 16 -127.04 gain 16 194 -134.79 gain 194 16 -130.03 gain 16 195 -136.71 gain 195 16 -132.58 gain 16 196 -120.73 gain 196 16 -120.63 gain 16 197 -120.74 gain 197 16 -116.70 gain 16 198 -128.63 gain 198 16 -124.11 gain 16 199 -130.65 gain 199 16 -130.06 gain 16 200 -129.57 gain 200 16 -125.91 gain 16 201 -128.32 gain 201 16 -125.47 gain 16 202 -137.20 gain 202 16 -138.35 gain 16 203 -133.15 gain 203 16 -133.92 gain 16 204 -130.26 gain 204 16 -128.31 gain 16 205 -134.28 gain 205 16 -131.41 gain 16 206 -126.75 gain 206 16 -128.39 gain 16 207 -118.37 gain 207 16 -112.38 gain 16 208 -131.24 gain 208 16 -131.03 gain 16 209 -136.81 gain 209 16 -137.59 gain 16 210 -133.04 gain 210 16 -130.76 gain 16 211 -130.92 gain 211 16 -130.65 gain 16 212 -125.91 gain 212 16 -124.19 gain 16 213 -125.00 gain 213 16 -122.47 gain 16 214 -137.45 gain 214 16 -134.81 gain 16 215 -134.61 gain 215 16 -128.38 gain 16 216 -135.10 gain 216 16 -133.53 gain 16 217 -119.02 gain 217 16 -117.98 gain 16 218 -129.30 gain 218 16 -130.45 gain 16 219 -132.96 gain 219 16 -125.46 gain 16 220 -136.69 gain 220 16 -139.69 gain 16 221 -133.27 gain 221 16 -131.91 gain 16 222 -131.53 gain 222 16 -130.50 gain 16 223 -135.47 gain 223 16 -133.04 gain 16 224 -137.55 gain 224 16 -137.81 gain 17 18 -91.72 gain 18 17 -91.56 gain 17 19 -97.82 gain 19 17 -100.66 gain 17 20 -104.84 gain 20 17 -109.11 gain 17 21 -112.44 gain 21 17 -114.64 gain 17 22 -110.71 gain 22 17 -111.50 gain 17 23 -111.88 gain 23 17 -116.94 gain 17 24 -118.63 gain 24 17 -118.11 gain 17 25 -122.66 gain 25 17 -128.89 gain 17 26 -116.93 gain 26 17 -117.04 gain 17 27 -132.36 gain 27 17 -128.36 gain 17 28 -117.96 gain 28 17 -116.66 gain 17 29 -115.49 gain 29 17 -116.07 gain 17 30 -101.01 gain 30 17 -105.06 gain 17 31 -98.38 gain 31 17 -100.05 gain 17 32 -93.45 gain 32 17 -95.14 gain 17 33 -91.37 gain 33 17 -95.31 gain 17 34 -101.34 gain 34 17 -103.89 gain 17 35 -102.86 gain 35 17 -105.23 gain 17 36 -111.08 gain 36 17 -117.24 gain 17 37 -114.26 gain 37 17 -112.61 gain 17 38 -103.22 gain 38 17 -107.60 gain 17 39 -110.14 gain 39 17 -113.38 gain 17 40 -115.27 gain 40 17 -120.56 gain 17 41 -119.59 gain 41 17 -120.51 gain 17 42 -120.21 gain 42 17 -119.28 gain 17 43 -123.42 gain 43 17 -126.37 gain 17 44 -126.66 gain 44 17 -132.68 gain 17 45 -104.32 gain 45 17 -108.81 gain 17 46 -102.68 gain 46 17 -102.97 gain 17 47 -103.60 gain 47 17 -104.94 gain 17 48 -108.88 gain 48 17 -108.01 gain 17 49 -102.94 gain 49 17 -110.05 gain 17 50 -108.11 gain 50 17 -116.18 gain 17 51 -113.64 gain 51 17 -116.85 gain 17 52 -113.65 gain 52 17 -112.88 gain 17 53 -123.49 gain 53 17 -123.73 gain 17 54 -115.75 gain 54 17 -116.70 gain 17 55 -116.62 gain 55 17 -116.86 gain 17 56 -121.20 gain 56 17 -128.77 gain 17 57 -118.98 gain 57 17 -120.43 gain 17 58 -118.24 gain 58 17 -122.43 gain 17 59 -129.87 gain 59 17 -130.18 gain 17 60 -110.03 gain 60 17 -111.66 gain 17 61 -112.73 gain 61 17 -113.12 gain 17 62 -106.43 gain 62 17 -112.03 gain 17 63 -106.73 gain 63 17 -105.56 gain 17 64 -111.96 gain 64 17 -113.76 gain 17 65 -109.26 gain 65 17 -113.15 gain 17 66 -119.56 gain 66 17 -117.71 gain 17 67 -122.95 gain 67 17 -123.37 gain 17 68 -108.70 gain 68 17 -113.68 gain 17 69 -118.34 gain 69 17 -120.61 gain 17 70 -119.93 gain 70 17 -121.96 gain 17 71 -117.59 gain 71 17 -117.73 gain 17 72 -125.99 gain 72 17 -126.54 gain 17 73 -126.23 gain 73 17 -125.17 gain 17 74 -122.14 gain 74 17 -124.96 gain 17 75 -110.76 gain 75 17 -113.72 gain 17 76 -110.43 gain 76 17 -109.34 gain 17 77 -112.84 gain 77 17 -115.42 gain 17 78 -107.40 gain 78 17 -112.82 gain 17 79 -113.71 gain 79 17 -113.91 gain 17 80 -115.38 gain 80 17 -116.09 gain 17 81 -113.25 gain 81 17 -114.54 gain 17 82 -116.30 gain 82 17 -115.22 gain 17 83 -122.97 gain 83 17 -122.93 gain 17 84 -117.27 gain 84 17 -117.37 gain 17 85 -130.89 gain 85 17 -127.81 gain 17 86 -120.18 gain 86 17 -120.47 gain 17 87 -123.88 gain 87 17 -128.13 gain 17 88 -115.21 gain 88 17 -117.22 gain 17 89 -121.42 gain 89 17 -122.02 gain 17 90 -107.71 gain 90 17 -105.32 gain 17 91 -113.03 gain 91 17 -114.60 gain 17 92 -115.31 gain 92 17 -113.84 gain 17 93 -114.32 gain 93 17 -117.63 gain 17 94 -113.57 gain 94 17 -116.76 gain 17 95 -112.42 gain 95 17 -117.86 gain 17 96 -117.89 gain 96 17 -120.67 gain 17 97 -116.86 gain 97 17 -118.38 gain 17 98 -113.18 gain 98 17 -115.50 gain 17 99 -122.99 gain 99 17 -123.13 gain 17 100 -123.48 gain 100 17 -123.18 gain 17 101 -122.23 gain 101 17 -122.09 gain 17 102 -123.41 gain 102 17 -124.06 gain 17 103 -126.88 gain 103 17 -125.01 gain 17 104 -125.17 gain 104 17 -128.68 gain 17 105 -111.83 gain 105 17 -111.28 gain 17 106 -111.60 gain 106 17 -112.13 gain 17 107 -118.33 gain 107 17 -125.43 gain 17 108 -112.21 gain 108 17 -111.63 gain 17 109 -113.88 gain 109 17 -116.79 gain 17 110 -117.04 gain 110 17 -118.41 gain 17 111 -117.72 gain 111 17 -118.77 gain 17 112 -116.85 gain 112 17 -116.78 gain 17 113 -122.76 gain 113 17 -121.50 gain 17 114 -119.90 gain 114 17 -121.95 gain 17 115 -120.60 gain 115 17 -116.95 gain 17 116 -109.82 gain 116 17 -113.71 gain 17 117 -129.18 gain 117 17 -134.57 gain 17 118 -126.18 gain 118 17 -129.89 gain 17 119 -127.15 gain 119 17 -125.52 gain 17 120 -116.79 gain 120 17 -119.68 gain 17 121 -116.42 gain 121 17 -118.60 gain 17 122 -113.84 gain 122 17 -118.13 gain 17 123 -122.80 gain 123 17 -127.87 gain 17 124 -122.42 gain 124 17 -123.90 gain 17 125 -117.01 gain 125 17 -119.82 gain 17 126 -125.41 gain 126 17 -126.18 gain 17 127 -108.74 gain 127 17 -112.98 gain 17 128 -119.62 gain 128 17 -121.79 gain 17 129 -127.71 gain 129 17 -127.79 gain 17 130 -115.26 gain 130 17 -113.17 gain 17 131 -123.78 gain 131 17 -128.77 gain 17 132 -124.48 gain 132 17 -129.09 gain 17 133 -123.96 gain 133 17 -126.64 gain 17 134 -128.68 gain 134 17 -128.07 gain 17 135 -123.43 gain 135 17 -126.39 gain 17 136 -118.88 gain 136 17 -122.45 gain 17 137 -118.90 gain 137 17 -119.95 gain 17 138 -122.84 gain 138 17 -122.89 gain 17 139 -121.80 gain 139 17 -122.83 gain 17 140 -117.78 gain 140 17 -121.42 gain 17 141 -117.93 gain 141 17 -120.25 gain 17 142 -121.02 gain 142 17 -122.64 gain 17 143 -120.63 gain 143 17 -121.87 gain 17 144 -125.45 gain 144 17 -127.71 gain 17 145 -127.04 gain 145 17 -127.74 gain 17 146 -123.62 gain 146 17 -123.24 gain 17 147 -124.27 gain 147 17 -120.98 gain 17 148 -124.77 gain 148 17 -121.19 gain 17 149 -126.02 gain 149 17 -125.61 gain 17 150 -115.40 gain 150 17 -117.68 gain 17 151 -130.11 gain 151 17 -132.58 gain 17 152 -127.22 gain 152 17 -126.67 gain 17 153 -121.79 gain 153 17 -118.81 gain 17 154 -127.26 gain 154 17 -132.83 gain 17 155 -123.78 gain 155 17 -129.25 gain 17 156 -119.48 gain 156 17 -119.34 gain 17 157 -120.31 gain 157 17 -123.11 gain 17 158 -122.33 gain 158 17 -127.73 gain 17 159 -122.85 gain 159 17 -124.86 gain 17 160 -126.04 gain 160 17 -125.16 gain 17 161 -127.45 gain 161 17 -130.07 gain 17 162 -127.21 gain 162 17 -128.69 gain 17 163 -127.43 gain 163 17 -131.06 gain 17 164 -130.85 gain 164 17 -135.53 gain 17 165 -119.00 gain 165 17 -119.71 gain 17 166 -123.03 gain 166 17 -125.31 gain 17 167 -120.56 gain 167 17 -124.94 gain 17 168 -128.02 gain 168 17 -130.84 gain 17 169 -122.61 gain 169 17 -129.63 gain 17 170 -118.74 gain 170 17 -117.29 gain 17 171 -127.24 gain 171 17 -130.82 gain 17 172 -130.31 gain 172 17 -128.58 gain 17 173 -121.29 gain 173 17 -118.99 gain 17 174 -117.22 gain 174 17 -119.22 gain 17 175 -121.93 gain 175 17 -127.48 gain 17 176 -121.74 gain 176 17 -119.30 gain 17 177 -121.89 gain 177 17 -127.26 gain 17 178 -125.62 gain 178 17 -126.83 gain 17 179 -130.18 gain 179 17 -129.77 gain 17 180 -127.41 gain 180 17 -128.48 gain 17 181 -126.27 gain 181 17 -127.40 gain 17 182 -122.74 gain 182 17 -126.26 gain 17 183 -124.46 gain 183 17 -121.37 gain 17 184 -122.40 gain 184 17 -124.08 gain 17 185 -116.00 gain 185 17 -115.17 gain 17 186 -120.78 gain 186 17 -120.24 gain 17 187 -124.54 gain 187 17 -126.53 gain 17 188 -128.14 gain 188 17 -133.39 gain 17 189 -128.81 gain 189 17 -131.59 gain 17 190 -134.65 gain 190 17 -134.44 gain 17 191 -122.71 gain 191 17 -123.59 gain 17 192 -127.84 gain 192 17 -131.58 gain 17 193 -124.80 gain 193 17 -129.79 gain 17 194 -123.07 gain 194 17 -121.87 gain 17 195 -125.42 gain 195 17 -124.86 gain 17 196 -124.84 gain 196 17 -128.32 gain 17 197 -120.68 gain 197 17 -120.22 gain 17 198 -128.56 gain 198 17 -127.63 gain 17 199 -119.75 gain 199 17 -122.73 gain 17 200 -121.46 gain 200 17 -121.38 gain 17 201 -125.07 gain 201 17 -125.79 gain 17 202 -131.15 gain 202 17 -135.87 gain 17 203 -128.54 gain 203 17 -132.88 gain 17 204 -126.68 gain 204 17 -128.30 gain 17 205 -128.43 gain 205 17 -129.13 gain 17 206 -130.79 gain 206 17 -136.01 gain 17 207 -135.76 gain 207 17 -133.34 gain 17 208 -129.06 gain 208 17 -132.42 gain 17 209 -130.29 gain 209 17 -134.64 gain 17 210 -118.40 gain 210 17 -119.68 gain 17 211 -130.56 gain 211 17 -133.87 gain 17 212 -124.62 gain 212 17 -126.47 gain 17 213 -126.96 gain 213 17 -128.00 gain 17 214 -123.54 gain 214 17 -124.47 gain 17 215 -122.57 gain 215 17 -119.92 gain 17 216 -126.63 gain 216 17 -128.64 gain 17 217 -124.18 gain 217 17 -126.71 gain 17 218 -125.19 gain 218 17 -129.91 gain 17 219 -127.20 gain 219 17 -123.27 gain 17 220 -131.87 gain 220 17 -138.44 gain 17 221 -126.43 gain 221 17 -128.64 gain 17 222 -124.72 gain 222 17 -127.25 gain 17 223 -132.56 gain 223 17 -133.71 gain 17 224 -125.57 gain 224 17 -129.41 gain 18 19 -85.91 gain 19 18 -88.91 gain 18 20 -98.36 gain 20 18 -102.79 gain 18 21 -98.62 gain 21 18 -100.98 gain 18 22 -107.27 gain 22 18 -108.22 gain 18 23 -112.96 gain 23 18 -118.18 gain 18 24 -124.42 gain 24 18 -124.05 gain 18 25 -117.40 gain 25 18 -123.79 gain 18 26 -118.52 gain 26 18 -118.80 gain 18 27 -118.46 gain 27 18 -114.63 gain 18 28 -122.90 gain 28 18 -121.76 gain 18 29 -125.97 gain 29 18 -126.71 gain 18 30 -108.36 gain 30 18 -112.56 gain 18 31 -103.73 gain 31 18 -105.56 gain 18 32 -96.39 gain 32 18 -98.25 gain 18 33 -95.51 gain 33 18 -99.61 gain 18 34 -95.81 gain 34 18 -98.52 gain 18 35 -101.95 gain 35 18 -104.48 gain 18 36 -106.85 gain 36 18 -113.17 gain 18 37 -112.73 gain 37 18 -111.25 gain 18 38 -116.52 gain 38 18 -121.05 gain 18 39 -106.90 gain 39 18 -110.30 gain 18 40 -116.04 gain 40 18 -121.49 gain 18 41 -120.83 gain 41 18 -121.91 gain 18 42 -116.63 gain 42 18 -115.86 gain 18 43 -112.12 gain 43 18 -115.24 gain 18 44 -122.33 gain 44 18 -128.51 gain 18 45 -105.73 gain 45 18 -110.38 gain 18 46 -105.33 gain 46 18 -105.78 gain 18 47 -104.88 gain 47 18 -106.38 gain 18 48 -103.75 gain 48 18 -103.04 gain 18 49 -102.56 gain 49 18 -109.82 gain 18 50 -111.81 gain 50 18 -120.04 gain 18 51 -107.85 gain 51 18 -111.22 gain 18 52 -115.71 gain 52 18 -115.10 gain 18 53 -109.15 gain 53 18 -109.56 gain 18 54 -115.39 gain 54 18 -116.50 gain 18 55 -115.91 gain 55 18 -116.32 gain 18 56 -123.32 gain 56 18 -131.05 gain 18 57 -122.64 gain 57 18 -124.25 gain 18 58 -121.28 gain 58 18 -125.63 gain 18 59 -125.02 gain 59 18 -125.49 gain 18 60 -112.70 gain 60 18 -114.49 gain 18 61 -107.16 gain 61 18 -107.70 gain 18 62 -103.03 gain 62 18 -108.79 gain 18 63 -109.31 gain 63 18 -108.30 gain 18 64 -110.87 gain 64 18 -112.83 gain 18 65 -111.27 gain 65 18 -115.32 gain 18 66 -112.62 gain 66 18 -110.93 gain 18 67 -113.41 gain 67 18 -113.99 gain 18 68 -120.52 gain 68 18 -125.65 gain 18 69 -122.95 gain 69 18 -125.38 gain 18 70 -119.25 gain 70 18 -121.44 gain 18 71 -122.68 gain 71 18 -122.98 gain 18 72 -126.84 gain 72 18 -127.55 gain 18 73 -126.93 gain 73 18 -126.03 gain 18 74 -120.45 gain 74 18 -123.43 gain 18 75 -109.18 gain 75 18 -112.30 gain 18 76 -112.92 gain 76 18 -111.99 gain 18 77 -115.19 gain 77 18 -117.93 gain 18 78 -101.16 gain 78 18 -106.74 gain 18 79 -110.90 gain 79 18 -111.27 gain 18 80 -117.56 gain 80 18 -118.43 gain 18 81 -108.66 gain 81 18 -110.12 gain 18 82 -114.77 gain 82 18 -113.86 gain 18 83 -109.30 gain 83 18 -109.41 gain 18 84 -120.63 gain 84 18 -120.90 gain 18 85 -116.23 gain 85 18 -113.30 gain 18 86 -117.44 gain 86 18 -117.89 gain 18 87 -123.81 gain 87 18 -128.22 gain 18 88 -130.27 gain 88 18 -132.44 gain 18 89 -124.93 gain 89 18 -125.70 gain 18 90 -117.93 gain 90 18 -115.70 gain 18 91 -116.13 gain 91 18 -117.85 gain 18 92 -107.85 gain 92 18 -106.53 gain 18 93 -112.28 gain 93 18 -115.75 gain 18 94 -110.30 gain 94 18 -113.64 gain 18 95 -115.49 gain 95 18 -121.09 gain 18 96 -114.52 gain 96 18 -117.46 gain 18 97 -121.41 gain 97 18 -123.09 gain 18 98 -120.16 gain 98 18 -122.64 gain 18 99 -117.13 gain 99 18 -117.43 gain 18 100 -112.15 gain 100 18 -112.01 gain 18 101 -116.13 gain 101 18 -116.16 gain 18 102 -124.71 gain 102 18 -125.52 gain 18 103 -120.76 gain 103 18 -119.06 gain 18 104 -123.76 gain 104 18 -127.42 gain 18 105 -118.12 gain 105 18 -117.74 gain 18 106 -118.80 gain 106 18 -119.50 gain 18 107 -114.06 gain 107 18 -121.32 gain 18 108 -115.86 gain 108 18 -115.44 gain 18 109 -118.92 gain 109 18 -121.99 gain 18 110 -115.98 gain 110 18 -117.52 gain 18 111 -119.26 gain 111 18 -120.47 gain 18 112 -125.39 gain 112 18 -125.49 gain 18 113 -108.41 gain 113 18 -107.31 gain 18 114 -109.69 gain 114 18 -111.89 gain 18 115 -120.57 gain 115 18 -117.08 gain 18 116 -120.82 gain 116 18 -124.87 gain 18 117 -125.24 gain 117 18 -130.79 gain 18 118 -121.09 gain 118 18 -124.97 gain 18 119 -124.41 gain 119 18 -122.94 gain 18 120 -112.91 gain 120 18 -115.96 gain 18 121 -125.25 gain 121 18 -127.59 gain 18 122 -109.48 gain 122 18 -113.94 gain 18 123 -121.82 gain 123 18 -127.05 gain 18 124 -119.35 gain 124 18 -120.99 gain 18 125 -117.88 gain 125 18 -120.86 gain 18 126 -117.40 gain 126 18 -118.32 gain 18 127 -116.80 gain 127 18 -121.20 gain 18 128 -120.29 gain 128 18 -122.62 gain 18 129 -113.76 gain 129 18 -114.00 gain 18 130 -120.63 gain 130 18 -118.69 gain 18 131 -125.46 gain 131 18 -130.61 gain 18 132 -123.03 gain 132 18 -127.80 gain 18 133 -128.84 gain 133 18 -131.68 gain 18 134 -127.80 gain 134 18 -127.35 gain 18 135 -121.72 gain 135 18 -124.84 gain 18 136 -115.32 gain 136 18 -119.05 gain 18 137 -115.21 gain 137 18 -116.42 gain 18 138 -119.22 gain 138 18 -119.43 gain 18 139 -121.04 gain 139 18 -122.24 gain 18 140 -119.37 gain 140 18 -123.17 gain 18 141 -119.30 gain 141 18 -121.77 gain 18 142 -118.10 gain 142 18 -119.88 gain 18 143 -121.33 gain 143 18 -122.73 gain 18 144 -122.16 gain 144 18 -124.57 gain 18 145 -120.27 gain 145 18 -121.13 gain 18 146 -132.37 gain 146 18 -132.14 gain 18 147 -125.50 gain 147 18 -122.36 gain 18 148 -128.25 gain 148 18 -124.83 gain 18 149 -132.03 gain 149 18 -131.78 gain 18 150 -123.96 gain 150 18 -126.39 gain 18 151 -122.76 gain 151 18 -125.39 gain 18 152 -128.33 gain 152 18 -127.94 gain 18 153 -114.44 gain 153 18 -111.63 gain 18 154 -121.47 gain 154 18 -127.20 gain 18 155 -127.40 gain 155 18 -133.03 gain 18 156 -118.03 gain 156 18 -118.05 gain 18 157 -124.36 gain 157 18 -127.32 gain 18 158 -119.15 gain 158 18 -124.70 gain 18 159 -125.20 gain 159 18 -127.38 gain 18 160 -126.79 gain 160 18 -126.08 gain 18 161 -127.77 gain 161 18 -130.54 gain 18 162 -127.62 gain 162 18 -129.26 gain 18 163 -132.68 gain 163 18 -136.47 gain 18 164 -122.58 gain 164 18 -127.41 gain 18 165 -123.23 gain 165 18 -124.11 gain 18 166 -118.21 gain 166 18 -120.65 gain 18 167 -122.09 gain 167 18 -126.62 gain 18 168 -126.90 gain 168 18 -129.88 gain 18 169 -124.64 gain 169 18 -131.82 gain 18 170 -118.41 gain 170 18 -117.12 gain 18 171 -117.72 gain 171 18 -121.46 gain 18 172 -124.21 gain 172 18 -122.63 gain 18 173 -122.87 gain 173 18 -120.74 gain 18 174 -129.78 gain 174 18 -131.94 gain 18 175 -121.69 gain 175 18 -127.40 gain 18 176 -132.93 gain 176 18 -130.66 gain 18 177 -125.00 gain 177 18 -130.54 gain 18 178 -123.11 gain 178 18 -124.47 gain 18 179 -127.13 gain 179 18 -126.88 gain 18 180 -124.31 gain 180 18 -125.53 gain 18 181 -123.64 gain 181 18 -124.93 gain 18 182 -118.05 gain 182 18 -121.73 gain 18 183 -125.15 gain 183 18 -122.22 gain 18 184 -126.98 gain 184 18 -128.83 gain 18 185 -121.33 gain 185 18 -120.67 gain 18 186 -124.35 gain 186 18 -123.97 gain 18 187 -120.86 gain 187 18 -123.02 gain 18 188 -124.95 gain 188 18 -130.37 gain 18 189 -125.63 gain 189 18 -128.56 gain 18 190 -121.69 gain 190 18 -121.63 gain 18 191 -124.17 gain 191 18 -125.20 gain 18 192 -127.64 gain 192 18 -131.54 gain 18 193 -114.96 gain 193 18 -120.11 gain 18 194 -130.71 gain 194 18 -129.67 gain 18 195 -126.57 gain 195 18 -126.17 gain 18 196 -129.88 gain 196 18 -133.51 gain 18 197 -125.23 gain 197 18 -124.93 gain 18 198 -126.42 gain 198 18 -125.64 gain 18 199 -125.58 gain 199 18 -128.71 gain 18 200 -125.56 gain 200 18 -125.64 gain 18 201 -131.72 gain 201 18 -132.60 gain 18 202 -125.18 gain 202 18 -130.06 gain 18 203 -123.77 gain 203 18 -128.28 gain 18 204 -129.08 gain 204 18 -130.86 gain 18 205 -128.74 gain 205 18 -129.60 gain 18 206 -127.46 gain 206 18 -132.84 gain 18 207 -125.47 gain 207 18 -123.21 gain 18 208 -131.41 gain 208 18 -134.92 gain 18 209 -132.47 gain 209 18 -136.98 gain 18 210 -126.98 gain 210 18 -128.43 gain 18 211 -124.18 gain 211 18 -127.65 gain 18 212 -130.96 gain 212 18 -132.98 gain 18 213 -132.37 gain 213 18 -133.57 gain 18 214 -123.85 gain 214 18 -124.94 gain 18 215 -121.36 gain 215 18 -118.87 gain 18 216 -118.96 gain 216 18 -121.13 gain 18 217 -127.11 gain 217 18 -129.80 gain 18 218 -131.99 gain 218 18 -136.87 gain 18 219 -130.23 gain 219 18 -126.46 gain 18 220 -123.09 gain 220 18 -129.82 gain 18 221 -126.56 gain 221 18 -128.93 gain 18 222 -131.41 gain 222 18 -134.11 gain 18 223 -124.27 gain 223 18 -125.57 gain 18 224 -129.96 gain 224 18 -133.96 gain 19 20 -100.69 gain 20 19 -102.13 gain 19 21 -104.18 gain 21 19 -103.54 gain 19 22 -109.54 gain 22 19 -107.49 gain 19 23 -112.63 gain 23 19 -114.86 gain 19 24 -112.45 gain 24 19 -109.09 gain 19 25 -116.76 gain 25 19 -120.16 gain 19 26 -118.91 gain 26 19 -116.19 gain 19 27 -127.48 gain 27 19 -120.66 gain 19 28 -119.14 gain 28 19 -115.01 gain 19 29 -126.63 gain 29 19 -124.38 gain 19 30 -113.87 gain 30 19 -115.08 gain 19 31 -109.06 gain 31 19 -107.89 gain 19 32 -108.41 gain 32 19 -107.28 gain 19 33 -94.80 gain 33 19 -95.91 gain 19 34 -95.92 gain 34 19 -95.64 gain 19 35 -99.06 gain 35 19 -98.60 gain 19 36 -108.01 gain 36 19 -111.33 gain 19 37 -110.02 gain 37 19 -105.55 gain 19 38 -111.33 gain 38 19 -112.87 gain 19 39 -121.73 gain 39 19 -122.14 gain 19 40 -118.14 gain 40 19 -120.60 gain 19 41 -117.17 gain 41 19 -115.25 gain 19 42 -117.14 gain 42 19 -113.38 gain 19 43 -120.27 gain 43 19 -120.39 gain 19 44 -125.17 gain 44 19 -128.36 gain 19 45 -122.00 gain 45 19 -123.65 gain 19 46 -107.90 gain 46 19 -105.35 gain 19 47 -106.14 gain 47 19 -104.65 gain 19 48 -104.62 gain 48 19 -100.92 gain 19 49 -110.45 gain 49 19 -114.72 gain 19 50 -106.54 gain 50 19 -111.78 gain 19 51 -101.00 gain 51 19 -101.37 gain 19 52 -115.18 gain 52 19 -111.58 gain 19 53 -108.41 gain 53 19 -105.82 gain 19 54 -114.22 gain 54 19 -112.33 gain 19 55 -122.71 gain 55 19 -120.12 gain 19 56 -125.07 gain 56 19 -129.80 gain 19 57 -124.68 gain 57 19 -123.29 gain 19 58 -120.53 gain 58 19 -121.88 gain 19 59 -124.76 gain 59 19 -122.24 gain 19 60 -116.75 gain 60 19 -115.55 gain 19 61 -113.80 gain 61 19 -111.35 gain 19 62 -119.61 gain 62 19 -122.37 gain 19 63 -111.83 gain 63 19 -107.82 gain 19 64 -112.51 gain 64 19 -111.48 gain 19 65 -108.87 gain 65 19 -109.93 gain 19 66 -107.07 gain 66 19 -102.38 gain 19 67 -108.51 gain 67 19 -106.10 gain 19 68 -114.91 gain 68 19 -117.05 gain 19 69 -120.08 gain 69 19 -119.52 gain 19 70 -122.81 gain 70 19 -122.01 gain 19 71 -122.54 gain 71 19 -119.85 gain 19 72 -117.29 gain 72 19 -115.00 gain 19 73 -122.24 gain 73 19 -118.35 gain 19 74 -131.44 gain 74 19 -131.43 gain 19 75 -120.78 gain 75 19 -120.90 gain 19 76 -115.36 gain 76 19 -111.44 gain 19 77 -116.28 gain 77 19 -116.02 gain 19 78 -108.88 gain 78 19 -111.47 gain 19 79 -115.42 gain 79 19 -112.79 gain 19 80 -113.93 gain 80 19 -111.81 gain 19 81 -111.63 gain 81 19 -110.10 gain 19 82 -122.49 gain 82 19 -118.58 gain 19 83 -117.47 gain 83 19 -114.59 gain 19 84 -119.23 gain 84 19 -116.50 gain 19 85 -121.54 gain 85 19 -115.62 gain 19 86 -125.15 gain 86 19 -122.61 gain 19 87 -124.36 gain 87 19 -125.78 gain 19 88 -127.39 gain 88 19 -126.56 gain 19 89 -131.02 gain 89 19 -128.79 gain 19 90 -122.21 gain 90 19 -117.00 gain 19 91 -118.21 gain 91 19 -116.94 gain 19 92 -116.24 gain 92 19 -111.92 gain 19 93 -119.60 gain 93 19 -120.08 gain 19 94 -118.70 gain 94 19 -119.05 gain 19 95 -111.21 gain 95 19 -113.81 gain 19 96 -115.76 gain 96 19 -115.70 gain 19 97 -119.81 gain 97 19 -118.50 gain 19 98 -114.49 gain 98 19 -113.97 gain 19 99 -125.35 gain 99 19 -122.66 gain 19 100 -118.45 gain 100 19 -115.32 gain 19 101 -121.57 gain 101 19 -118.61 gain 19 102 -123.79 gain 102 19 -121.61 gain 19 103 -128.30 gain 103 19 -123.60 gain 19 104 -124.42 gain 104 19 -125.10 gain 19 105 -114.55 gain 105 19 -111.17 gain 19 106 -122.60 gain 106 19 -120.30 gain 19 107 -126.96 gain 107 19 -131.23 gain 19 108 -113.39 gain 108 19 -109.98 gain 19 109 -116.71 gain 109 19 -116.79 gain 19 110 -111.64 gain 110 19 -110.19 gain 19 111 -123.87 gain 111 19 -122.09 gain 19 112 -121.13 gain 112 19 -118.23 gain 19 113 -117.04 gain 113 19 -112.95 gain 19 114 -121.06 gain 114 19 -120.28 gain 19 115 -119.75 gain 115 19 -113.27 gain 19 116 -126.21 gain 116 19 -127.27 gain 19 117 -127.56 gain 117 19 -130.12 gain 19 118 -122.97 gain 118 19 -123.85 gain 19 119 -129.11 gain 119 19 -124.65 gain 19 120 -122.17 gain 120 19 -122.22 gain 19 121 -122.79 gain 121 19 -122.14 gain 19 122 -122.52 gain 122 19 -123.97 gain 19 123 -120.20 gain 123 19 -122.43 gain 19 124 -127.07 gain 124 19 -125.72 gain 19 125 -119.74 gain 125 19 -119.73 gain 19 126 -122.27 gain 126 19 -120.20 gain 19 127 -120.48 gain 127 19 -121.88 gain 19 128 -127.56 gain 128 19 -126.90 gain 19 129 -128.58 gain 129 19 -125.82 gain 19 130 -125.02 gain 130 19 -120.09 gain 19 131 -124.38 gain 131 19 -126.54 gain 19 132 -128.96 gain 132 19 -130.74 gain 19 133 -134.32 gain 133 19 -134.18 gain 19 134 -123.25 gain 134 19 -119.80 gain 19 135 -117.05 gain 135 19 -117.18 gain 19 136 -120.50 gain 136 19 -121.23 gain 19 137 -121.54 gain 137 19 -119.75 gain 19 138 -119.16 gain 138 19 -116.37 gain 19 139 -119.56 gain 139 19 -117.76 gain 19 140 -122.98 gain 140 19 -123.79 gain 19 141 -128.44 gain 141 19 -127.93 gain 19 142 -124.18 gain 142 19 -122.97 gain 19 143 -121.09 gain 143 19 -119.49 gain 19 144 -116.51 gain 144 19 -115.93 gain 19 145 -123.83 gain 145 19 -121.71 gain 19 146 -124.14 gain 146 19 -120.92 gain 19 147 -126.11 gain 147 19 -119.98 gain 19 148 -123.65 gain 148 19 -117.24 gain 19 149 -127.64 gain 149 19 -124.40 gain 19 150 -125.85 gain 150 19 -125.29 gain 19 151 -120.79 gain 151 19 -120.42 gain 19 152 -130.61 gain 152 19 -127.23 gain 19 153 -126.49 gain 153 19 -120.68 gain 19 154 -119.05 gain 154 19 -121.79 gain 19 155 -119.73 gain 155 19 -122.36 gain 19 156 -121.17 gain 156 19 -118.20 gain 19 157 -128.41 gain 157 19 -128.38 gain 19 158 -125.95 gain 158 19 -128.51 gain 19 159 -127.58 gain 159 19 -126.77 gain 19 160 -131.48 gain 160 19 -127.77 gain 19 161 -121.44 gain 161 19 -121.22 gain 19 162 -127.70 gain 162 19 -126.34 gain 19 163 -134.16 gain 163 19 -134.95 gain 19 164 -128.49 gain 164 19 -130.33 gain 19 165 -124.86 gain 165 19 -122.74 gain 19 166 -123.11 gain 166 19 -122.56 gain 19 167 -128.87 gain 167 19 -130.41 gain 19 168 -125.32 gain 168 19 -125.31 gain 19 169 -127.16 gain 169 19 -131.34 gain 19 170 -119.37 gain 170 19 -115.08 gain 19 171 -120.75 gain 171 19 -121.49 gain 19 172 -122.68 gain 172 19 -118.11 gain 19 173 -124.43 gain 173 19 -119.30 gain 19 174 -125.19 gain 174 19 -124.35 gain 19 175 -123.68 gain 175 19 -126.40 gain 19 176 -125.73 gain 176 19 -120.47 gain 19 177 -128.97 gain 177 19 -131.52 gain 19 178 -127.75 gain 178 19 -126.12 gain 19 179 -124.67 gain 179 19 -121.43 gain 19 180 -128.70 gain 180 19 -126.93 gain 19 181 -126.30 gain 181 19 -124.60 gain 19 182 -134.39 gain 182 19 -135.08 gain 19 183 -128.74 gain 183 19 -122.81 gain 19 184 -121.20 gain 184 19 -120.06 gain 19 185 -125.61 gain 185 19 -121.95 gain 19 186 -124.25 gain 186 19 -120.87 gain 19 187 -128.02 gain 187 19 -127.18 gain 19 188 -128.14 gain 188 19 -130.57 gain 19 189 -117.80 gain 189 19 -117.74 gain 19 190 -131.62 gain 190 19 -128.57 gain 19 191 -121.32 gain 191 19 -119.36 gain 19 192 -132.11 gain 192 19 -133.02 gain 19 193 -125.02 gain 193 19 -127.18 gain 19 194 -131.87 gain 194 19 -127.84 gain 19 195 -127.69 gain 195 19 -124.29 gain 19 196 -128.81 gain 196 19 -129.45 gain 19 197 -118.42 gain 197 19 -115.13 gain 19 198 -125.59 gain 198 19 -121.82 gain 19 199 -126.00 gain 199 19 -126.15 gain 19 200 -126.39 gain 200 19 -123.47 gain 19 201 -125.33 gain 201 19 -123.22 gain 19 202 -123.42 gain 202 19 -125.31 gain 19 203 -118.83 gain 203 19 -120.34 gain 19 204 -128.04 gain 204 19 -126.83 gain 19 205 -129.41 gain 205 19 -127.28 gain 19 206 -131.21 gain 206 19 -133.60 gain 19 207 -123.99 gain 207 19 -118.74 gain 19 208 -124.95 gain 208 19 -125.48 gain 19 209 -129.63 gain 209 19 -131.14 gain 19 210 -130.06 gain 210 19 -128.51 gain 19 211 -124.91 gain 211 19 -125.39 gain 19 212 -134.59 gain 212 19 -133.61 gain 19 213 -128.71 gain 213 19 -126.92 gain 19 214 -128.89 gain 214 19 -126.99 gain 19 215 -129.97 gain 215 19 -124.48 gain 19 216 -133.41 gain 216 19 -132.58 gain 19 217 -127.19 gain 217 19 -126.89 gain 19 218 -123.90 gain 218 19 -125.79 gain 19 219 -125.32 gain 219 19 -118.56 gain 19 220 -127.44 gain 220 19 -131.18 gain 19 221 -129.88 gain 221 19 -129.25 gain 19 222 -126.07 gain 222 19 -125.77 gain 19 223 -136.28 gain 223 19 -134.59 gain 19 224 -134.96 gain 224 19 -135.96 gain 20 21 -96.28 gain 21 20 -94.20 gain 20 22 -97.95 gain 22 20 -94.46 gain 20 23 -113.97 gain 23 20 -114.76 gain 20 24 -112.38 gain 24 20 -107.58 gain 20 25 -116.07 gain 25 20 -118.03 gain 20 26 -121.09 gain 26 20 -116.93 gain 20 27 -120.03 gain 27 20 -111.76 gain 20 28 -123.82 gain 28 20 -118.25 gain 20 29 -129.98 gain 29 20 -126.29 gain 20 30 -117.30 gain 30 20 -117.08 gain 20 31 -112.97 gain 31 20 -110.36 gain 20 32 -111.46 gain 32 20 -108.88 gain 20 33 -105.02 gain 33 20 -104.69 gain 20 34 -96.60 gain 34 20 -94.88 gain 20 35 -91.78 gain 35 20 -89.88 gain 20 36 -105.98 gain 36 20 -107.86 gain 20 37 -108.98 gain 37 20 -103.06 gain 20 38 -109.69 gain 38 20 -109.79 gain 20 39 -110.43 gain 39 20 -109.40 gain 20 40 -117.17 gain 40 20 -118.19 gain 20 41 -119.98 gain 41 20 -116.62 gain 20 42 -122.82 gain 42 20 -117.61 gain 20 43 -128.03 gain 43 20 -126.72 gain 20 44 -126.92 gain 44 20 -128.66 gain 20 45 -121.64 gain 45 20 -121.86 gain 20 46 -112.19 gain 46 20 -108.20 gain 20 47 -113.48 gain 47 20 -110.55 gain 20 48 -107.97 gain 48 20 -102.83 gain 20 49 -107.71 gain 49 20 -110.54 gain 20 50 -102.49 gain 50 20 -106.29 gain 20 51 -103.11 gain 51 20 -102.04 gain 20 52 -100.99 gain 52 20 -95.95 gain 20 53 -114.76 gain 53 20 -110.74 gain 20 54 -117.48 gain 54 20 -114.15 gain 20 55 -120.61 gain 55 20 -116.58 gain 20 56 -132.11 gain 56 20 -135.41 gain 20 57 -115.13 gain 57 20 -112.30 gain 20 58 -125.92 gain 58 20 -125.83 gain 20 59 -125.23 gain 59 20 -121.27 gain 20 60 -123.87 gain 60 20 -121.23 gain 20 61 -122.70 gain 61 20 -118.81 gain 20 62 -111.55 gain 62 20 -112.88 gain 20 63 -111.19 gain 63 20 -105.75 gain 20 64 -108.87 gain 64 20 -106.40 gain 20 65 -116.24 gain 65 20 -115.86 gain 20 66 -108.99 gain 66 20 -102.87 gain 20 67 -113.68 gain 67 20 -109.83 gain 20 68 -116.22 gain 68 20 -116.93 gain 20 69 -118.88 gain 69 20 -116.88 gain 20 70 -116.44 gain 70 20 -114.20 gain 20 71 -120.21 gain 71 20 -116.07 gain 20 72 -123.32 gain 72 20 -119.59 gain 20 73 -123.38 gain 73 20 -118.05 gain 20 74 -127.94 gain 74 20 -126.48 gain 20 75 -120.26 gain 75 20 -118.95 gain 20 76 -119.84 gain 76 20 -114.47 gain 20 77 -122.43 gain 77 20 -120.73 gain 20 78 -117.69 gain 78 20 -118.85 gain 20 79 -109.82 gain 79 20 -105.75 gain 20 80 -107.44 gain 80 20 -103.88 gain 20 81 -115.39 gain 81 20 -112.42 gain 20 82 -116.53 gain 82 20 -111.18 gain 20 83 -122.40 gain 83 20 -118.09 gain 20 84 -120.17 gain 84 20 -116.01 gain 20 85 -119.95 gain 85 20 -112.59 gain 20 86 -120.82 gain 86 20 -116.84 gain 20 87 -124.82 gain 87 20 -124.80 gain 20 88 -127.34 gain 88 20 -125.08 gain 20 89 -125.46 gain 89 20 -121.79 gain 20 90 -129.53 gain 90 20 -122.88 gain 20 91 -120.04 gain 91 20 -117.33 gain 20 92 -113.72 gain 92 20 -107.97 gain 20 93 -118.31 gain 93 20 -117.34 gain 20 94 -123.32 gain 94 20 -122.23 gain 20 95 -116.08 gain 95 20 -117.24 gain 20 96 -118.32 gain 96 20 -116.82 gain 20 97 -113.87 gain 97 20 -111.12 gain 20 98 -115.70 gain 98 20 -113.75 gain 20 99 -118.33 gain 99 20 -114.19 gain 20 100 -116.51 gain 100 20 -111.94 gain 20 101 -123.20 gain 101 20 -118.80 gain 20 102 -122.78 gain 102 20 -119.15 gain 20 103 -126.43 gain 103 20 -120.29 gain 20 104 -122.92 gain 104 20 -122.16 gain 20 105 -119.51 gain 105 20 -114.69 gain 20 106 -124.34 gain 106 20 -120.60 gain 20 107 -124.92 gain 107 20 -127.74 gain 20 108 -126.69 gain 108 20 -121.84 gain 20 109 -118.62 gain 109 20 -117.26 gain 20 110 -118.92 gain 110 20 -116.02 gain 20 111 -117.13 gain 111 20 -113.92 gain 20 112 -118.62 gain 112 20 -114.28 gain 20 113 -115.50 gain 113 20 -109.97 gain 20 114 -121.55 gain 114 20 -119.33 gain 20 115 -122.30 gain 115 20 -114.37 gain 20 116 -127.87 gain 116 20 -127.48 gain 20 117 -129.17 gain 117 20 -130.29 gain 20 118 -130.37 gain 118 20 -129.81 gain 20 119 -125.14 gain 119 20 -119.24 gain 20 120 -130.28 gain 120 20 -128.90 gain 20 121 -123.52 gain 121 20 -121.42 gain 20 122 -122.33 gain 122 20 -122.35 gain 20 123 -122.73 gain 123 20 -123.53 gain 20 124 -121.17 gain 124 20 -118.38 gain 20 125 -124.40 gain 125 20 -122.94 gain 20 126 -123.92 gain 126 20 -120.42 gain 20 127 -126.63 gain 127 20 -126.59 gain 20 128 -124.96 gain 128 20 -122.86 gain 20 129 -121.81 gain 129 20 -117.62 gain 20 130 -127.72 gain 130 20 -121.35 gain 20 131 -119.82 gain 131 20 -120.54 gain 20 132 -124.35 gain 132 20 -124.69 gain 20 133 -121.69 gain 133 20 -120.10 gain 20 134 -131.43 gain 134 20 -126.54 gain 20 135 -127.36 gain 135 20 -126.04 gain 20 136 -128.67 gain 136 20 -127.96 gain 20 137 -120.10 gain 137 20 -116.88 gain 20 138 -125.65 gain 138 20 -121.43 gain 20 139 -121.62 gain 139 20 -118.38 gain 20 140 -117.28 gain 140 20 -116.65 gain 20 141 -115.24 gain 141 20 -113.28 gain 20 142 -128.11 gain 142 20 -125.46 gain 20 143 -129.46 gain 143 20 -126.43 gain 20 144 -130.83 gain 144 20 -128.81 gain 20 145 -126.22 gain 145 20 -122.65 gain 20 146 -130.50 gain 146 20 -125.84 gain 20 147 -130.21 gain 147 20 -122.64 gain 20 148 -130.02 gain 148 20 -122.17 gain 20 149 -127.09 gain 149 20 -122.40 gain 20 150 -122.68 gain 150 20 -120.69 gain 20 151 -124.09 gain 151 20 -122.29 gain 20 152 -122.90 gain 152 20 -118.08 gain 20 153 -128.30 gain 153 20 -121.05 gain 20 154 -122.58 gain 154 20 -123.88 gain 20 155 -128.16 gain 155 20 -129.36 gain 20 156 -121.05 gain 156 20 -116.64 gain 20 157 -125.62 gain 157 20 -124.16 gain 20 158 -124.08 gain 158 20 -125.21 gain 20 159 -127.43 gain 159 20 -125.18 gain 20 160 -126.01 gain 160 20 -120.87 gain 20 161 -128.71 gain 161 20 -127.06 gain 20 162 -130.78 gain 162 20 -127.99 gain 20 163 -126.64 gain 163 20 -126.00 gain 20 164 -132.13 gain 164 20 -132.53 gain 20 165 -126.67 gain 165 20 -123.11 gain 20 166 -124.83 gain 166 20 -122.84 gain 20 167 -125.00 gain 167 20 -125.10 gain 20 168 -127.86 gain 168 20 -126.41 gain 20 169 -127.31 gain 169 20 -130.06 gain 20 170 -131.20 gain 170 20 -125.47 gain 20 171 -122.40 gain 171 20 -121.70 gain 20 172 -131.63 gain 172 20 -125.62 gain 20 173 -124.01 gain 173 20 -117.44 gain 20 174 -128.65 gain 174 20 -126.38 gain 20 175 -124.27 gain 175 20 -125.55 gain 20 176 -126.78 gain 176 20 -120.07 gain 20 177 -128.35 gain 177 20 -129.45 gain 20 178 -127.56 gain 178 20 -124.49 gain 20 179 -128.93 gain 179 20 -124.25 gain 20 180 -129.63 gain 180 20 -126.42 gain 20 181 -127.82 gain 181 20 -124.68 gain 20 182 -124.80 gain 182 20 -124.05 gain 20 183 -125.43 gain 183 20 -118.07 gain 20 184 -135.20 gain 184 20 -132.61 gain 20 185 -130.97 gain 185 20 -125.87 gain 20 186 -131.59 gain 186 20 -126.78 gain 20 187 -126.70 gain 187 20 -124.43 gain 20 188 -123.08 gain 188 20 -124.07 gain 20 189 -130.17 gain 189 20 -128.67 gain 20 190 -133.50 gain 190 20 -129.02 gain 20 191 -132.51 gain 191 20 -129.11 gain 20 192 -127.14 gain 192 20 -126.61 gain 20 193 -132.96 gain 193 20 -133.68 gain 20 194 -128.28 gain 194 20 -122.81 gain 20 195 -125.81 gain 195 20 -120.98 gain 20 196 -122.38 gain 196 20 -121.58 gain 20 197 -131.12 gain 197 20 -126.39 gain 20 198 -128.29 gain 198 20 -123.08 gain 20 199 -122.27 gain 199 20 -120.97 gain 20 200 -126.14 gain 200 20 -121.78 gain 20 201 -126.64 gain 201 20 -123.08 gain 20 202 -130.96 gain 202 20 -131.41 gain 20 203 -126.57 gain 203 20 -126.64 gain 20 204 -131.06 gain 204 20 -128.41 gain 20 205 -129.92 gain 205 20 -126.35 gain 20 206 -129.41 gain 206 20 -130.36 gain 20 207 -129.07 gain 207 20 -122.38 gain 20 208 -138.08 gain 208 20 -137.17 gain 20 209 -128.50 gain 209 20 -128.57 gain 20 210 -131.20 gain 210 20 -128.22 gain 20 211 -131.62 gain 211 20 -130.66 gain 20 212 -127.09 gain 212 20 -124.67 gain 20 213 -135.46 gain 213 20 -132.23 gain 20 214 -139.46 gain 214 20 -136.12 gain 20 215 -131.65 gain 215 20 -124.73 gain 20 216 -132.40 gain 216 20 -130.13 gain 20 217 -131.10 gain 217 20 -129.36 gain 20 218 -134.30 gain 218 20 -134.75 gain 20 219 -132.08 gain 219 20 -123.89 gain 20 220 -132.27 gain 220 20 -134.57 gain 20 221 -129.72 gain 221 20 -127.65 gain 20 222 -134.64 gain 222 20 -132.91 gain 20 223 -136.26 gain 223 20 -133.13 gain 20 224 -137.99 gain 224 20 -137.55 gain 21 22 -94.45 gain 22 21 -93.04 gain 21 23 -100.16 gain 23 21 -103.03 gain 21 24 -112.76 gain 24 21 -110.03 gain 21 25 -111.56 gain 25 21 -115.59 gain 21 26 -112.59 gain 26 21 -110.50 gain 21 27 -112.65 gain 27 21 -106.47 gain 21 28 -118.58 gain 28 21 -115.09 gain 21 29 -123.94 gain 29 21 -122.32 gain 21 30 -117.01 gain 30 21 -118.86 gain 21 31 -114.59 gain 31 21 -114.05 gain 21 32 -118.72 gain 32 21 -118.22 gain 21 33 -109.24 gain 33 21 -110.99 gain 21 34 -108.33 gain 34 21 -108.69 gain 21 35 -100.01 gain 35 21 -100.19 gain 21 36 -93.79 gain 36 21 -97.75 gain 21 37 -96.96 gain 37 21 -93.12 gain 21 38 -102.93 gain 38 21 -105.10 gain 21 39 -110.53 gain 39 21 -111.58 gain 21 40 -112.74 gain 40 21 -115.83 gain 21 41 -119.70 gain 41 21 -118.42 gain 21 42 -121.91 gain 42 21 -118.78 gain 21 43 -122.97 gain 43 21 -123.72 gain 21 44 -118.37 gain 44 21 -122.19 gain 21 45 -114.74 gain 45 21 -117.04 gain 21 46 -108.03 gain 46 21 -106.12 gain 21 47 -116.84 gain 47 21 -115.99 gain 21 48 -108.66 gain 48 21 -105.59 gain 21 49 -111.90 gain 49 21 -116.81 gain 21 50 -105.97 gain 50 21 -111.85 gain 21 51 -100.63 gain 51 21 -101.64 gain 21 52 -105.82 gain 52 21 -102.85 gain 21 53 -116.20 gain 53 21 -114.25 gain 21 54 -111.39 gain 54 21 -110.14 gain 21 55 -120.85 gain 55 21 -118.89 gain 21 56 -112.90 gain 56 21 -118.27 gain 21 57 -114.86 gain 57 21 -114.11 gain 21 58 -118.93 gain 58 21 -120.91 gain 21 59 -121.02 gain 59 21 -119.13 gain 21 60 -120.23 gain 60 21 -119.67 gain 21 61 -116.70 gain 61 21 -114.89 gain 21 62 -114.36 gain 62 21 -117.76 gain 21 63 -115.88 gain 63 21 -112.51 gain 21 64 -115.05 gain 64 21 -114.65 gain 21 65 -105.26 gain 65 21 -106.96 gain 21 66 -108.00 gain 66 21 -103.95 gain 21 67 -113.37 gain 67 21 -111.60 gain 21 68 -116.30 gain 68 21 -119.08 gain 21 69 -112.53 gain 69 21 -112.60 gain 21 70 -108.86 gain 70 21 -108.70 gain 21 71 -112.01 gain 71 21 -109.95 gain 21 72 -118.42 gain 72 21 -116.77 gain 21 73 -118.79 gain 73 21 -115.53 gain 21 74 -128.12 gain 74 21 -128.75 gain 21 75 -123.93 gain 75 21 -124.69 gain 21 76 -125.91 gain 76 21 -122.62 gain 21 77 -117.11 gain 77 21 -117.49 gain 21 78 -122.48 gain 78 21 -125.71 gain 21 79 -115.96 gain 79 21 -113.97 gain 21 80 -114.21 gain 80 21 -112.72 gain 21 81 -114.92 gain 81 21 -114.02 gain 21 82 -114.67 gain 82 21 -111.39 gain 21 83 -115.92 gain 83 21 -113.68 gain 21 84 -117.50 gain 84 21 -115.41 gain 21 85 -117.46 gain 85 21 -112.18 gain 21 86 -113.43 gain 86 21 -111.53 gain 21 87 -115.70 gain 87 21 -117.76 gain 21 88 -119.73 gain 88 21 -119.54 gain 21 89 -121.47 gain 89 21 -119.88 gain 21 90 -115.18 gain 90 21 -110.60 gain 21 91 -118.21 gain 91 21 -117.58 gain 21 92 -121.27 gain 92 21 -117.60 gain 21 93 -116.69 gain 93 21 -117.80 gain 21 94 -109.55 gain 94 21 -110.54 gain 21 95 -110.89 gain 95 21 -114.13 gain 21 96 -114.88 gain 96 21 -115.46 gain 21 97 -109.98 gain 97 21 -109.30 gain 21 98 -112.39 gain 98 21 -112.51 gain 21 99 -112.62 gain 99 21 -110.56 gain 21 100 -119.70 gain 100 21 -117.21 gain 21 101 -118.30 gain 101 21 -115.97 gain 21 102 -119.68 gain 102 21 -118.13 gain 21 103 -112.36 gain 103 21 -108.29 gain 21 104 -125.89 gain 104 21 -127.20 gain 21 105 -127.24 gain 105 21 -124.49 gain 21 106 -123.54 gain 106 21 -121.88 gain 21 107 -119.26 gain 107 21 -124.16 gain 21 108 -121.86 gain 108 21 -119.08 gain 21 109 -119.89 gain 109 21 -120.60 gain 21 110 -116.11 gain 110 21 -115.29 gain 21 111 -121.59 gain 111 21 -120.45 gain 21 112 -114.87 gain 112 21 -112.61 gain 21 113 -121.07 gain 113 21 -117.62 gain 21 114 -116.30 gain 114 21 -116.15 gain 21 115 -121.06 gain 115 21 -115.22 gain 21 116 -125.92 gain 116 21 -127.62 gain 21 117 -120.55 gain 117 21 -123.74 gain 21 118 -126.63 gain 118 21 -128.15 gain 21 119 -126.31 gain 119 21 -122.49 gain 21 120 -118.73 gain 120 21 -119.42 gain 21 121 -127.83 gain 121 21 -127.82 gain 21 122 -117.86 gain 122 21 -119.96 gain 21 123 -116.15 gain 123 21 -119.02 gain 21 124 -123.64 gain 124 21 -122.92 gain 21 125 -122.84 gain 125 21 -123.45 gain 21 126 -119.38 gain 126 21 -117.95 gain 21 127 -120.82 gain 127 21 -122.86 gain 21 128 -120.33 gain 128 21 -120.31 gain 21 129 -116.60 gain 129 21 -114.48 gain 21 130 -114.93 gain 130 21 -110.64 gain 21 131 -128.99 gain 131 21 -131.78 gain 21 132 -117.02 gain 132 21 -119.44 gain 21 133 -122.05 gain 133 21 -122.54 gain 21 134 -129.27 gain 134 21 -126.46 gain 21 135 -128.00 gain 135 21 -128.76 gain 21 136 -123.39 gain 136 21 -124.76 gain 21 137 -113.16 gain 137 21 -112.01 gain 21 138 -125.60 gain 138 21 -123.46 gain 21 139 -123.07 gain 139 21 -121.91 gain 21 140 -118.62 gain 140 21 -120.06 gain 21 141 -113.51 gain 141 21 -113.63 gain 21 142 -119.94 gain 142 21 -119.37 gain 21 143 -115.63 gain 143 21 -114.67 gain 21 144 -121.43 gain 144 21 -121.48 gain 21 145 -126.21 gain 145 21 -124.72 gain 21 146 -129.70 gain 146 21 -127.12 gain 21 147 -120.31 gain 147 21 -114.82 gain 21 148 -120.73 gain 148 21 -114.95 gain 21 149 -125.27 gain 149 21 -122.66 gain 21 150 -129.81 gain 150 21 -129.89 gain 21 151 -122.66 gain 151 21 -122.93 gain 21 152 -122.66 gain 152 21 -119.91 gain 21 153 -123.66 gain 153 21 -118.49 gain 21 154 -128.02 gain 154 21 -131.40 gain 21 155 -123.55 gain 155 21 -126.83 gain 21 156 -123.66 gain 156 21 -121.33 gain 21 157 -127.06 gain 157 21 -127.67 gain 21 158 -126.45 gain 158 21 -129.65 gain 21 159 -123.62 gain 159 21 -123.44 gain 21 160 -124.43 gain 160 21 -121.36 gain 21 161 -115.95 gain 161 21 -116.37 gain 21 162 -134.21 gain 162 21 -133.49 gain 21 163 -135.01 gain 163 21 -136.45 gain 21 164 -123.12 gain 164 21 -125.59 gain 21 165 -119.50 gain 165 21 -118.01 gain 21 166 -131.66 gain 166 21 -131.75 gain 21 167 -121.32 gain 167 21 -123.49 gain 21 168 -123.61 gain 168 21 -124.24 gain 21 169 -113.42 gain 169 21 -118.25 gain 21 170 -125.95 gain 170 21 -122.30 gain 21 171 -130.15 gain 171 21 -131.53 gain 21 172 -119.64 gain 172 21 -115.71 gain 21 173 -130.49 gain 173 21 -126.00 gain 21 174 -130.44 gain 174 21 -130.25 gain 21 175 -123.09 gain 175 21 -126.45 gain 21 176 -131.90 gain 176 21 -127.27 gain 21 177 -130.15 gain 177 21 -133.33 gain 21 178 -133.65 gain 178 21 -132.65 gain 21 179 -126.19 gain 179 21 -123.59 gain 21 180 -125.50 gain 180 21 -124.36 gain 21 181 -123.06 gain 181 21 -121.99 gain 21 182 -127.35 gain 182 21 -128.67 gain 21 183 -127.73 gain 183 21 -122.44 gain 21 184 -122.97 gain 184 21 -122.46 gain 21 185 -116.27 gain 185 21 -113.25 gain 21 186 -124.22 gain 186 21 -121.48 gain 21 187 -131.36 gain 187 21 -131.16 gain 21 188 -119.64 gain 188 21 -122.70 gain 21 189 -125.68 gain 189 21 -126.25 gain 21 190 -126.75 gain 190 21 -124.34 gain 21 191 -133.80 gain 191 21 -132.48 gain 21 192 -122.56 gain 192 21 -124.11 gain 21 193 -131.89 gain 193 21 -134.69 gain 21 194 -130.38 gain 194 21 -126.99 gain 21 195 -131.87 gain 195 21 -129.11 gain 21 196 -127.87 gain 196 21 -129.15 gain 21 197 -127.39 gain 197 21 -124.74 gain 21 198 -129.93 gain 198 21 -126.79 gain 21 199 -126.21 gain 199 21 -126.99 gain 21 200 -124.24 gain 200 21 -121.96 gain 21 201 -134.70 gain 201 21 -133.22 gain 21 202 -127.71 gain 202 21 -130.23 gain 21 203 -128.22 gain 203 21 -130.36 gain 21 204 -123.95 gain 204 21 -123.38 gain 21 205 -124.21 gain 205 21 -122.71 gain 21 206 -135.85 gain 206 21 -138.87 gain 21 207 -126.19 gain 207 21 -121.58 gain 21 208 -128.07 gain 208 21 -129.23 gain 21 209 -131.76 gain 209 21 -133.91 gain 21 210 -126.79 gain 210 21 -125.88 gain 21 211 -132.32 gain 211 21 -133.43 gain 21 212 -124.87 gain 212 21 -124.53 gain 21 213 -130.85 gain 213 21 -129.69 gain 21 214 -133.87 gain 214 21 -132.61 gain 21 215 -128.22 gain 215 21 -123.37 gain 21 216 -131.02 gain 216 21 -130.83 gain 21 217 -130.94 gain 217 21 -131.27 gain 21 218 -122.83 gain 218 21 -125.35 gain 21 219 -127.82 gain 219 21 -121.70 gain 21 220 -126.11 gain 220 21 -130.48 gain 21 221 -131.00 gain 221 21 -131.02 gain 21 222 -126.36 gain 222 21 -126.70 gain 21 223 -126.73 gain 223 21 -125.68 gain 21 224 -130.75 gain 224 21 -132.38 gain 22 23 -93.49 gain 23 22 -97.77 gain 22 24 -97.41 gain 24 22 -96.10 gain 22 25 -105.97 gain 25 22 -111.41 gain 22 26 -113.94 gain 26 22 -113.26 gain 22 27 -113.76 gain 27 22 -108.98 gain 22 28 -120.73 gain 28 22 -118.65 gain 22 29 -119.05 gain 29 22 -118.85 gain 22 30 -113.44 gain 30 22 -116.71 gain 22 31 -113.46 gain 31 22 -114.34 gain 22 32 -114.14 gain 32 22 -115.05 gain 22 33 -105.46 gain 33 22 -108.61 gain 22 34 -99.89 gain 34 22 -101.65 gain 22 35 -105.42 gain 35 22 -107.01 gain 22 36 -93.23 gain 36 22 -98.60 gain 22 37 -93.19 gain 37 22 -90.76 gain 22 38 -94.16 gain 38 22 -97.75 gain 22 39 -101.30 gain 39 22 -103.75 gain 22 40 -107.29 gain 40 22 -111.78 gain 22 41 -108.69 gain 41 22 -108.82 gain 22 42 -113.36 gain 42 22 -111.64 gain 22 43 -113.39 gain 43 22 -115.56 gain 22 44 -122.00 gain 44 22 -127.23 gain 22 45 -115.21 gain 45 22 -118.91 gain 22 46 -116.45 gain 46 22 -115.95 gain 22 47 -109.26 gain 47 22 -109.82 gain 22 48 -112.89 gain 48 22 -111.23 gain 22 49 -109.92 gain 49 22 -116.24 gain 22 50 -123.03 gain 50 22 -130.31 gain 22 51 -100.27 gain 51 22 -102.70 gain 22 52 -99.95 gain 52 22 -98.39 gain 22 53 -101.02 gain 53 22 -100.48 gain 22 54 -108.67 gain 54 22 -108.83 gain 22 55 -107.60 gain 55 22 -107.06 gain 22 56 -117.09 gain 56 22 -123.87 gain 22 57 -114.80 gain 57 22 -115.46 gain 22 58 -114.66 gain 58 22 -118.05 gain 22 59 -126.71 gain 59 22 -126.23 gain 22 60 -120.16 gain 60 22 -121.00 gain 22 61 -118.65 gain 61 22 -118.24 gain 22 62 -106.85 gain 62 22 -111.66 gain 22 63 -107.33 gain 63 22 -105.37 gain 22 64 -104.95 gain 64 22 -105.97 gain 22 65 -112.29 gain 65 22 -115.39 gain 22 66 -103.75 gain 66 22 -101.10 gain 22 67 -105.14 gain 67 22 -104.77 gain 22 68 -108.88 gain 68 22 -113.07 gain 22 69 -113.50 gain 69 22 -114.98 gain 22 70 -115.91 gain 70 22 -117.15 gain 22 71 -112.11 gain 71 22 -111.45 gain 22 72 -116.26 gain 72 22 -116.02 gain 22 73 -118.25 gain 73 22 -116.40 gain 22 74 -126.00 gain 74 22 -128.03 gain 22 75 -128.46 gain 75 22 -130.63 gain 22 76 -115.21 gain 76 22 -113.34 gain 22 77 -115.40 gain 77 22 -117.19 gain 22 78 -107.98 gain 78 22 -112.62 gain 22 79 -125.54 gain 79 22 -124.96 gain 22 80 -113.16 gain 80 22 -113.08 gain 22 81 -107.98 gain 81 22 -108.49 gain 22 82 -107.89 gain 82 22 -106.03 gain 22 83 -115.03 gain 83 22 -114.20 gain 22 84 -106.43 gain 84 22 -105.75 gain 22 85 -110.99 gain 85 22 -107.12 gain 22 86 -106.50 gain 86 22 -106.01 gain 22 87 -119.50 gain 87 22 -122.97 gain 22 88 -116.21 gain 88 22 -117.43 gain 22 89 -116.18 gain 89 22 -116.00 gain 22 90 -117.74 gain 90 22 -114.57 gain 22 91 -121.76 gain 91 22 -122.53 gain 22 92 -123.62 gain 92 22 -121.35 gain 22 93 -112.77 gain 93 22 -115.29 gain 22 94 -123.95 gain 94 22 -126.35 gain 22 95 -111.22 gain 95 22 -115.87 gain 22 96 -122.68 gain 96 22 -124.67 gain 22 97 -112.68 gain 97 22 -113.41 gain 22 98 -112.72 gain 98 22 -114.25 gain 22 99 -115.30 gain 99 22 -114.65 gain 22 100 -110.70 gain 100 22 -109.62 gain 22 101 -112.02 gain 101 22 -111.10 gain 22 102 -117.46 gain 102 22 -117.32 gain 22 103 -120.16 gain 103 22 -117.51 gain 22 104 -123.65 gain 104 22 -126.37 gain 22 105 -119.74 gain 105 22 -118.40 gain 22 106 -113.72 gain 106 22 -113.46 gain 22 107 -121.50 gain 107 22 -127.82 gain 22 108 -122.39 gain 108 22 -121.02 gain 22 109 -117.47 gain 109 22 -119.59 gain 22 110 -119.05 gain 110 22 -119.64 gain 22 111 -113.42 gain 111 22 -113.69 gain 22 112 -117.37 gain 112 22 -116.52 gain 22 113 -116.31 gain 113 22 -114.27 gain 22 114 -109.33 gain 114 22 -110.58 gain 22 115 -113.08 gain 115 22 -108.64 gain 22 116 -122.20 gain 116 22 -125.30 gain 22 117 -118.17 gain 117 22 -122.78 gain 22 118 -127.41 gain 118 22 -130.33 gain 22 119 -118.35 gain 119 22 -115.93 gain 22 120 -114.63 gain 120 22 -116.73 gain 22 121 -117.29 gain 121 22 -118.68 gain 22 122 -118.71 gain 122 22 -122.22 gain 22 123 -120.76 gain 123 22 -125.04 gain 22 124 -120.38 gain 124 22 -121.07 gain 22 125 -117.56 gain 125 22 -119.59 gain 22 126 -125.57 gain 126 22 -125.55 gain 22 127 -119.98 gain 127 22 -123.42 gain 22 128 -118.53 gain 128 22 -119.91 gain 22 129 -124.52 gain 129 22 -123.81 gain 22 130 -119.23 gain 130 22 -116.34 gain 22 131 -121.35 gain 131 22 -125.55 gain 22 132 -120.14 gain 132 22 -123.96 gain 22 133 -129.19 gain 133 22 -131.09 gain 22 134 -128.31 gain 134 22 -126.91 gain 22 135 -120.39 gain 135 22 -122.56 gain 22 136 -124.56 gain 136 22 -127.34 gain 22 137 -113.78 gain 137 22 -114.04 gain 22 138 -118.74 gain 138 22 -118.00 gain 22 139 -120.56 gain 139 22 -120.81 gain 22 140 -121.28 gain 140 22 -124.14 gain 22 141 -117.72 gain 141 22 -119.25 gain 22 142 -116.48 gain 142 22 -117.32 gain 22 143 -116.74 gain 143 22 -117.19 gain 22 144 -121.68 gain 144 22 -123.14 gain 22 145 -115.58 gain 145 22 -115.50 gain 22 146 -119.47 gain 146 22 -118.30 gain 22 147 -118.45 gain 147 22 -114.37 gain 22 148 -125.29 gain 148 22 -120.92 gain 22 149 -126.97 gain 149 22 -125.77 gain 22 150 -123.25 gain 150 22 -124.73 gain 22 151 -117.50 gain 151 22 -119.18 gain 22 152 -120.75 gain 152 22 -119.41 gain 22 153 -128.41 gain 153 22 -124.65 gain 22 154 -124.35 gain 154 22 -129.13 gain 22 155 -120.89 gain 155 22 -125.57 gain 22 156 -120.78 gain 156 22 -119.85 gain 22 157 -116.45 gain 157 22 -118.47 gain 22 158 -120.62 gain 158 22 -125.23 gain 22 159 -121.96 gain 159 22 -123.19 gain 22 160 -121.04 gain 160 22 -119.37 gain 22 161 -120.04 gain 161 22 -121.87 gain 22 162 -117.89 gain 162 22 -118.59 gain 22 163 -128.28 gain 163 22 -131.12 gain 22 164 -120.17 gain 164 22 -124.06 gain 22 165 -127.11 gain 165 22 -127.03 gain 22 166 -125.30 gain 166 22 -126.79 gain 22 167 -126.79 gain 167 22 -130.38 gain 22 168 -116.61 gain 168 22 -118.64 gain 22 169 -117.91 gain 169 22 -124.14 gain 22 170 -119.47 gain 170 22 -117.23 gain 22 171 -126.28 gain 171 22 -129.07 gain 22 172 -125.44 gain 172 22 -122.92 gain 22 173 -114.56 gain 173 22 -111.47 gain 22 174 -118.00 gain 174 22 -119.21 gain 22 175 -124.41 gain 175 22 -129.18 gain 22 176 -128.52 gain 176 22 -125.30 gain 22 177 -122.45 gain 177 22 -127.04 gain 22 178 -123.40 gain 178 22 -123.81 gain 22 179 -124.21 gain 179 22 -123.02 gain 22 180 -121.91 gain 180 22 -122.19 gain 22 181 -125.68 gain 181 22 -126.02 gain 22 182 -126.96 gain 182 22 -129.69 gain 22 183 -128.70 gain 183 22 -124.82 gain 22 184 -119.26 gain 184 22 -120.15 gain 22 185 -123.17 gain 185 22 -121.55 gain 22 186 -126.29 gain 186 22 -124.95 gain 22 187 -119.87 gain 187 22 -121.08 gain 22 188 -117.77 gain 188 22 -122.24 gain 22 189 -122.74 gain 189 22 -124.72 gain 22 190 -114.05 gain 190 22 -113.04 gain 22 191 -123.50 gain 191 22 -123.59 gain 22 192 -132.51 gain 192 22 -135.47 gain 22 193 -127.92 gain 193 22 -132.13 gain 22 194 -127.28 gain 194 22 -125.30 gain 22 195 -130.22 gain 195 22 -128.87 gain 22 196 -125.48 gain 196 22 -128.17 gain 22 197 -128.16 gain 197 22 -126.91 gain 22 198 -129.31 gain 198 22 -127.59 gain 22 199 -122.02 gain 199 22 -124.21 gain 22 200 -124.04 gain 200 22 -123.17 gain 22 201 -124.82 gain 201 22 -124.76 gain 22 202 -129.11 gain 202 22 -133.04 gain 22 203 -127.88 gain 203 22 -131.44 gain 22 204 -125.69 gain 204 22 -126.53 gain 22 205 -122.99 gain 205 22 -122.90 gain 22 206 -130.56 gain 206 22 -134.99 gain 22 207 -131.06 gain 207 22 -127.85 gain 22 208 -129.78 gain 208 22 -132.35 gain 22 209 -126.53 gain 209 22 -130.09 gain 22 210 -122.53 gain 210 22 -123.03 gain 22 211 -122.50 gain 211 22 -125.02 gain 22 212 -134.00 gain 212 22 -135.06 gain 22 213 -127.63 gain 213 22 -127.89 gain 22 214 -130.85 gain 214 22 -130.99 gain 22 215 -121.20 gain 215 22 -117.76 gain 22 216 -125.63 gain 216 22 -126.85 gain 22 217 -129.03 gain 217 22 -130.77 gain 22 218 -130.64 gain 218 22 -134.57 gain 22 219 -131.74 gain 219 22 -127.03 gain 22 220 -130.89 gain 220 22 -136.66 gain 22 221 -128.75 gain 221 22 -130.17 gain 22 222 -126.36 gain 222 22 -128.10 gain 22 223 -127.59 gain 223 22 -127.95 gain 22 224 -124.07 gain 224 22 -127.12 gain 23 24 -97.16 gain 24 23 -91.57 gain 23 25 -105.50 gain 25 23 -106.67 gain 23 26 -110.06 gain 26 23 -105.11 gain 23 27 -111.79 gain 27 23 -102.74 gain 23 28 -116.98 gain 28 23 -110.62 gain 23 29 -115.79 gain 29 23 -111.31 gain 23 30 -121.06 gain 30 23 -120.05 gain 23 31 -125.09 gain 31 23 -121.69 gain 23 32 -115.99 gain 32 23 -112.62 gain 23 33 -116.56 gain 33 23 -115.44 gain 23 34 -116.38 gain 34 23 -113.86 gain 23 35 -107.99 gain 35 23 -105.30 gain 23 36 -106.00 gain 36 23 -107.10 gain 23 37 -97.12 gain 37 23 -90.41 gain 23 38 -95.47 gain 38 23 -94.78 gain 23 39 -107.40 gain 39 23 -105.58 gain 23 40 -107.58 gain 40 23 -107.80 gain 23 41 -115.74 gain 41 23 -111.60 gain 23 42 -117.81 gain 42 23 -111.81 gain 23 43 -117.20 gain 43 23 -115.09 gain 23 44 -117.30 gain 44 23 -118.25 gain 23 45 -117.89 gain 45 23 -117.32 gain 23 46 -123.39 gain 46 23 -118.61 gain 23 47 -115.73 gain 47 23 -112.01 gain 23 48 -118.98 gain 48 23 -113.05 gain 23 49 -117.84 gain 49 23 -119.89 gain 23 50 -102.07 gain 50 23 -105.08 gain 23 51 -112.80 gain 51 23 -110.95 gain 23 52 -107.46 gain 52 23 -101.62 gain 23 53 -104.80 gain 53 23 -99.98 gain 23 54 -102.99 gain 54 23 -98.87 gain 23 55 -117.33 gain 55 23 -112.51 gain 23 56 -111.09 gain 56 23 -113.60 gain 23 57 -118.49 gain 57 23 -114.87 gain 23 58 -117.12 gain 58 23 -116.24 gain 23 59 -123.33 gain 59 23 -118.58 gain 23 60 -125.18 gain 60 23 -121.75 gain 23 61 -127.27 gain 61 23 -122.59 gain 23 62 -125.65 gain 62 23 -126.19 gain 23 63 -118.46 gain 63 23 -112.23 gain 23 64 -118.09 gain 64 23 -114.83 gain 23 65 -114.70 gain 65 23 -113.53 gain 23 66 -116.22 gain 66 23 -109.30 gain 23 67 -116.14 gain 67 23 -111.50 gain 23 68 -113.02 gain 68 23 -112.93 gain 23 69 -110.81 gain 69 23 -108.01 gain 23 70 -116.90 gain 70 23 -113.86 gain 23 71 -117.99 gain 71 23 -113.06 gain 23 72 -126.26 gain 72 23 -121.74 gain 23 73 -117.29 gain 73 23 -111.17 gain 23 74 -126.03 gain 74 23 -123.79 gain 23 75 -128.60 gain 75 23 -126.49 gain 23 76 -128.28 gain 76 23 -122.13 gain 23 77 -121.61 gain 77 23 -119.12 gain 23 78 -125.67 gain 78 23 -126.04 gain 23 79 -122.94 gain 79 23 -118.08 gain 23 80 -120.18 gain 80 23 -115.82 gain 23 81 -111.64 gain 81 23 -107.87 gain 23 82 -115.56 gain 82 23 -109.42 gain 23 83 -118.44 gain 83 23 -113.34 gain 23 84 -117.89 gain 84 23 -112.94 gain 23 85 -120.01 gain 85 23 -111.86 gain 23 86 -123.36 gain 86 23 -118.59 gain 23 87 -115.81 gain 87 23 -115.00 gain 23 88 -122.37 gain 88 23 -119.32 gain 23 89 -124.73 gain 89 23 -120.28 gain 23 90 -127.09 gain 90 23 -119.64 gain 23 91 -127.51 gain 91 23 -124.00 gain 23 92 -116.35 gain 92 23 -109.81 gain 23 93 -123.27 gain 93 23 -121.51 gain 23 94 -121.36 gain 94 23 -119.48 gain 23 95 -118.97 gain 95 23 -119.34 gain 23 96 -119.37 gain 96 23 -117.08 gain 23 97 -113.51 gain 97 23 -109.96 gain 23 98 -115.78 gain 98 23 -113.03 gain 23 99 -111.16 gain 99 23 -106.23 gain 23 100 -121.08 gain 100 23 -115.72 gain 23 101 -118.69 gain 101 23 -113.50 gain 23 102 -118.93 gain 102 23 -114.51 gain 23 103 -118.68 gain 103 23 -111.75 gain 23 104 -125.59 gain 104 23 -124.03 gain 23 105 -128.98 gain 105 23 -123.36 gain 23 106 -126.60 gain 106 23 -122.07 gain 23 107 -117.92 gain 107 23 -119.96 gain 23 108 -117.23 gain 108 23 -111.58 gain 23 109 -119.70 gain 109 23 -117.54 gain 23 110 -122.41 gain 110 23 -118.73 gain 23 111 -126.29 gain 111 23 -122.28 gain 23 112 -124.19 gain 112 23 -119.07 gain 23 113 -119.90 gain 113 23 -113.58 gain 23 114 -116.02 gain 114 23 -113.01 gain 23 115 -125.57 gain 115 23 -116.86 gain 23 116 -122.00 gain 116 23 -120.83 gain 23 117 -123.03 gain 117 23 -123.36 gain 23 118 -126.32 gain 118 23 -124.97 gain 23 119 -126.65 gain 119 23 -119.96 gain 23 120 -131.82 gain 120 23 -129.65 gain 23 121 -123.28 gain 121 23 -120.40 gain 23 122 -135.47 gain 122 23 -134.70 gain 23 123 -133.43 gain 123 23 -133.44 gain 23 124 -129.63 gain 124 23 -126.04 gain 23 125 -125.65 gain 125 23 -123.40 gain 23 126 -124.83 gain 126 23 -120.53 gain 23 127 -126.85 gain 127 23 -126.02 gain 23 128 -122.24 gain 128 23 -119.35 gain 23 129 -119.90 gain 129 23 -114.92 gain 23 130 -128.54 gain 130 23 -121.38 gain 23 131 -129.26 gain 131 23 -129.18 gain 23 132 -122.34 gain 132 23 -121.89 gain 23 133 -117.76 gain 133 23 -115.38 gain 23 134 -121.54 gain 134 23 -115.86 gain 23 135 -127.70 gain 135 23 -125.60 gain 23 136 -127.07 gain 136 23 -125.57 gain 23 137 -130.00 gain 137 23 -125.98 gain 23 138 -126.23 gain 138 23 -121.21 gain 23 139 -132.99 gain 139 23 -128.96 gain 23 140 -122.90 gain 140 23 -121.48 gain 23 141 -131.12 gain 141 23 -128.37 gain 23 142 -125.39 gain 142 23 -121.94 gain 23 143 -125.79 gain 143 23 -121.96 gain 23 144 -121.88 gain 144 23 -119.07 gain 23 145 -121.11 gain 145 23 -116.75 gain 23 146 -121.15 gain 146 23 -115.70 gain 23 147 -126.00 gain 147 23 -117.64 gain 23 148 -122.58 gain 148 23 -113.94 gain 23 149 -125.45 gain 149 23 -119.97 gain 23 150 -127.58 gain 150 23 -124.79 gain 23 151 -132.91 gain 151 23 -130.32 gain 23 152 -124.09 gain 152 23 -118.47 gain 23 153 -122.41 gain 153 23 -114.37 gain 23 154 -124.15 gain 154 23 -124.66 gain 23 155 -126.86 gain 155 23 -127.27 gain 23 156 -127.30 gain 156 23 -122.10 gain 23 157 -126.51 gain 157 23 -124.25 gain 23 158 -131.15 gain 158 23 -131.49 gain 23 159 -126.72 gain 159 23 -123.67 gain 23 160 -126.28 gain 160 23 -120.35 gain 23 161 -119.77 gain 161 23 -117.32 gain 23 162 -124.41 gain 162 23 -120.83 gain 23 163 -134.79 gain 163 23 -133.36 gain 23 164 -131.33 gain 164 23 -130.93 gain 23 165 -126.55 gain 165 23 -122.20 gain 23 166 -134.35 gain 166 23 -131.57 gain 23 167 -128.59 gain 167 23 -127.89 gain 23 168 -126.67 gain 168 23 -124.43 gain 23 169 -129.70 gain 169 23 -131.66 gain 23 170 -120.23 gain 170 23 -113.72 gain 23 171 -123.40 gain 171 23 -121.91 gain 23 172 -128.90 gain 172 23 -122.10 gain 23 173 -131.00 gain 173 23 -123.64 gain 23 174 -131.09 gain 174 23 -128.03 gain 23 175 -124.56 gain 175 23 -125.05 gain 23 176 -124.94 gain 176 23 -117.44 gain 23 177 -129.25 gain 177 23 -129.56 gain 23 178 -121.96 gain 178 23 -118.10 gain 23 179 -129.63 gain 179 23 -124.16 gain 23 180 -136.06 gain 180 23 -132.06 gain 23 181 -125.33 gain 181 23 -121.39 gain 23 182 -134.89 gain 182 23 -133.35 gain 23 183 -133.50 gain 183 23 -125.34 gain 23 184 -122.76 gain 184 23 -119.38 gain 23 185 -123.27 gain 185 23 -117.38 gain 23 186 -125.19 gain 186 23 -119.59 gain 23 187 -131.08 gain 187 23 -128.02 gain 23 188 -126.30 gain 188 23 -126.50 gain 23 189 -127.97 gain 189 23 -125.68 gain 23 190 -125.82 gain 190 23 -120.54 gain 23 191 -125.18 gain 191 23 -120.99 gain 23 192 -131.57 gain 192 23 -130.25 gain 23 193 -128.55 gain 193 23 -128.48 gain 23 194 -127.91 gain 194 23 -121.65 gain 23 195 -130.28 gain 195 23 -124.65 gain 23 196 -133.38 gain 196 23 -131.79 gain 23 197 -132.54 gain 197 23 -127.01 gain 23 198 -129.16 gain 198 23 -123.15 gain 23 199 -130.27 gain 199 23 -128.19 gain 23 200 -130.09 gain 200 23 -124.94 gain 23 201 -143.67 gain 201 23 -139.33 gain 23 202 -133.93 gain 202 23 -133.59 gain 23 203 -135.90 gain 203 23 -135.18 gain 23 204 -126.50 gain 204 23 -123.07 gain 23 205 -122.44 gain 205 23 -118.08 gain 23 206 -128.49 gain 206 23 -128.64 gain 23 207 -125.88 gain 207 23 -118.40 gain 23 208 -132.03 gain 208 23 -130.32 gain 23 209 -129.25 gain 209 23 -128.54 gain 23 210 -131.83 gain 210 23 -128.05 gain 23 211 -137.62 gain 211 23 -135.87 gain 23 212 -128.14 gain 212 23 -124.92 gain 23 213 -131.76 gain 213 23 -127.74 gain 23 214 -136.44 gain 214 23 -132.31 gain 23 215 -140.85 gain 215 23 -133.14 gain 23 216 -133.19 gain 216 23 -130.13 gain 23 217 -132.26 gain 217 23 -129.73 gain 23 218 -130.74 gain 218 23 -130.39 gain 23 219 -127.01 gain 219 23 -118.02 gain 23 220 -129.97 gain 220 23 -131.48 gain 23 221 -136.87 gain 221 23 -134.02 gain 23 222 -137.53 gain 222 23 -135.00 gain 23 223 -126.18 gain 223 23 -122.26 gain 23 224 -128.92 gain 224 23 -127.69 gain 24 25 -97.80 gain 25 24 -104.56 gain 24 26 -94.12 gain 26 24 -94.76 gain 24 27 -110.84 gain 27 24 -107.37 gain 24 28 -112.98 gain 28 24 -112.21 gain 24 29 -108.74 gain 29 24 -109.85 gain 24 30 -117.81 gain 30 24 -122.38 gain 24 31 -119.62 gain 31 24 -121.81 gain 24 32 -114.98 gain 32 24 -117.20 gain 24 33 -109.63 gain 33 24 -114.11 gain 24 34 -119.19 gain 34 24 -122.27 gain 24 35 -111.17 gain 35 24 -114.07 gain 24 36 -107.95 gain 36 24 -114.63 gain 24 37 -104.17 gain 37 24 -103.05 gain 24 38 -98.89 gain 38 24 -103.79 gain 24 39 -87.56 gain 39 24 -91.33 gain 24 40 -95.02 gain 40 24 -100.84 gain 24 41 -102.27 gain 41 24 -103.72 gain 24 42 -110.29 gain 42 24 -109.88 gain 24 43 -116.82 gain 43 24 -120.30 gain 24 44 -116.52 gain 44 24 -123.06 gain 24 45 -111.55 gain 45 24 -116.57 gain 24 46 -120.74 gain 46 24 -121.55 gain 24 47 -114.70 gain 47 24 -116.57 gain 24 48 -107.61 gain 48 24 -107.27 gain 24 49 -111.42 gain 49 24 -119.05 gain 24 50 -116.98 gain 50 24 -125.58 gain 24 51 -107.67 gain 51 24 -111.41 gain 24 52 -102.38 gain 52 24 -102.14 gain 24 53 -101.85 gain 53 24 -102.62 gain 24 54 -95.05 gain 54 24 -96.52 gain 24 55 -105.12 gain 55 24 -105.89 gain 24 56 -105.90 gain 56 24 -113.99 gain 24 57 -108.46 gain 57 24 -110.42 gain 24 58 -108.75 gain 58 24 -113.46 gain 24 59 -120.91 gain 59 24 -121.74 gain 24 60 -121.24 gain 60 24 -123.40 gain 24 61 -118.96 gain 61 24 -119.87 gain 24 62 -114.55 gain 62 24 -120.67 gain 24 63 -111.34 gain 63 24 -110.69 gain 24 64 -114.56 gain 64 24 -116.89 gain 24 65 -107.27 gain 65 24 -111.69 gain 24 66 -110.05 gain 66 24 -108.72 gain 24 67 -113.15 gain 67 24 -114.09 gain 24 68 -104.82 gain 68 24 -110.32 gain 24 69 -102.59 gain 69 24 -105.38 gain 24 70 -106.92 gain 70 24 -109.47 gain 24 71 -106.43 gain 71 24 -107.09 gain 24 72 -111.76 gain 72 24 -112.84 gain 24 73 -113.44 gain 73 24 -112.91 gain 24 74 -117.74 gain 74 24 -121.09 gain 24 75 -120.85 gain 75 24 -124.34 gain 24 76 -131.19 gain 76 24 -130.62 gain 24 77 -114.37 gain 77 24 -117.47 gain 24 78 -121.26 gain 78 24 -127.21 gain 24 79 -118.04 gain 79 24 -118.76 gain 24 80 -113.93 gain 80 24 -115.16 gain 24 81 -108.97 gain 81 24 -110.79 gain 24 82 -112.79 gain 82 24 -112.24 gain 24 83 -110.42 gain 83 24 -110.90 gain 24 84 -106.72 gain 84 24 -107.35 gain 24 85 -116.45 gain 85 24 -113.89 gain 24 86 -113.10 gain 86 24 -113.92 gain 24 87 -119.46 gain 87 24 -124.24 gain 24 88 -112.36 gain 88 24 -114.89 gain 24 89 -117.13 gain 89 24 -118.26 gain 24 90 -124.86 gain 90 24 -123.00 gain 24 91 -122.58 gain 91 24 -124.67 gain 24 92 -126.04 gain 92 24 -125.09 gain 24 93 -119.40 gain 93 24 -123.23 gain 24 94 -122.06 gain 94 24 -125.77 gain 24 95 -110.71 gain 95 24 -116.67 gain 24 96 -111.90 gain 96 24 -115.20 gain 24 97 -115.86 gain 97 24 -117.90 gain 24 98 -107.72 gain 98 24 -110.57 gain 24 99 -104.70 gain 99 24 -105.37 gain 24 100 -115.31 gain 100 24 -115.54 gain 24 101 -116.84 gain 101 24 -117.23 gain 24 102 -113.20 gain 102 24 -114.37 gain 24 103 -103.68 gain 103 24 -102.34 gain 24 104 -117.00 gain 104 24 -121.04 gain 24 105 -126.54 gain 105 24 -126.52 gain 24 106 -131.06 gain 106 24 -132.12 gain 24 107 -122.96 gain 107 24 -130.59 gain 24 108 -118.20 gain 108 24 -118.15 gain 24 109 -114.23 gain 109 24 -117.66 gain 24 110 -115.48 gain 110 24 -117.38 gain 24 111 -118.40 gain 111 24 -119.98 gain 24 112 -116.49 gain 112 24 -116.95 gain 24 113 -117.16 gain 113 24 -116.43 gain 24 114 -112.79 gain 114 24 -115.36 gain 24 115 -119.92 gain 115 24 -116.79 gain 24 116 -116.09 gain 116 24 -120.50 gain 24 117 -117.94 gain 117 24 -123.86 gain 24 118 -115.55 gain 118 24 -119.79 gain 24 119 -119.08 gain 119 24 -117.98 gain 24 120 -127.45 gain 120 24 -130.86 gain 24 121 -125.40 gain 121 24 -128.11 gain 24 122 -122.15 gain 122 24 -126.97 gain 24 123 -110.76 gain 123 24 -116.36 gain 24 124 -124.70 gain 124 24 -126.70 gain 24 125 -115.86 gain 125 24 -119.20 gain 24 126 -105.39 gain 126 24 -106.69 gain 24 127 -124.89 gain 127 24 -129.65 gain 24 128 -116.42 gain 128 24 -119.12 gain 24 129 -113.92 gain 129 24 -114.52 gain 24 130 -122.68 gain 130 24 -121.11 gain 24 131 -116.84 gain 131 24 -122.35 gain 24 132 -124.10 gain 132 24 -129.24 gain 24 133 -113.57 gain 133 24 -116.78 gain 24 134 -120.37 gain 134 24 -120.29 gain 24 135 -117.48 gain 135 24 -120.96 gain 24 136 -115.06 gain 136 24 -119.15 gain 24 137 -126.71 gain 137 24 -128.29 gain 24 138 -119.24 gain 138 24 -119.82 gain 24 139 -120.14 gain 139 24 -121.70 gain 24 140 -120.56 gain 140 24 -124.73 gain 24 141 -119.27 gain 141 24 -122.12 gain 24 142 -119.36 gain 142 24 -121.51 gain 24 143 -120.59 gain 143 24 -122.36 gain 24 144 -121.40 gain 144 24 -124.18 gain 24 145 -119.93 gain 145 24 -121.16 gain 24 146 -118.09 gain 146 24 -118.23 gain 24 147 -117.02 gain 147 24 -114.25 gain 24 148 -118.91 gain 148 24 -115.86 gain 24 149 -115.54 gain 149 24 -115.65 gain 24 150 -117.21 gain 150 24 -120.01 gain 24 151 -122.26 gain 151 24 -125.26 gain 24 152 -123.35 gain 152 24 -123.32 gain 24 153 -120.20 gain 153 24 -117.75 gain 24 154 -118.31 gain 154 24 -124.41 gain 24 155 -126.57 gain 155 24 -132.57 gain 24 156 -118.94 gain 156 24 -119.33 gain 24 157 -116.75 gain 157 24 -120.08 gain 24 158 -111.44 gain 158 24 -117.37 gain 24 159 -117.56 gain 159 24 -120.10 gain 24 160 -120.33 gain 160 24 -119.98 gain 24 161 -110.23 gain 161 24 -113.37 gain 24 162 -123.76 gain 162 24 -125.77 gain 24 163 -116.50 gain 163 24 -120.66 gain 24 164 -113.70 gain 164 24 -118.90 gain 24 165 -127.11 gain 165 24 -128.35 gain 24 166 -128.34 gain 166 24 -131.14 gain 24 167 -127.78 gain 167 24 -132.68 gain 24 168 -119.01 gain 168 24 -122.36 gain 24 169 -121.80 gain 169 24 -129.34 gain 24 170 -126.47 gain 170 24 -125.54 gain 24 171 -120.69 gain 171 24 -124.79 gain 24 172 -121.00 gain 172 24 -119.79 gain 24 173 -124.02 gain 173 24 -122.25 gain 24 174 -118.78 gain 174 24 -121.31 gain 24 175 -114.31 gain 175 24 -120.39 gain 24 176 -118.79 gain 176 24 -116.88 gain 24 177 -130.89 gain 177 24 -136.80 gain 24 178 -128.35 gain 178 24 -130.08 gain 24 179 -123.91 gain 179 24 -124.03 gain 24 180 -134.87 gain 180 24 -136.45 gain 24 181 -126.83 gain 181 24 -128.49 gain 24 182 -122.37 gain 182 24 -126.41 gain 24 183 -120.97 gain 183 24 -118.40 gain 24 184 -125.01 gain 184 24 -127.22 gain 24 185 -125.28 gain 185 24 -124.98 gain 24 186 -123.48 gain 186 24 -123.46 gain 24 187 -127.33 gain 187 24 -129.86 gain 24 188 -124.01 gain 188 24 -129.79 gain 24 189 -125.07 gain 189 24 -128.37 gain 24 190 -125.40 gain 190 24 -125.71 gain 24 191 -125.39 gain 191 24 -126.79 gain 24 192 -116.86 gain 192 24 -121.13 gain 24 193 -129.57 gain 193 24 -135.09 gain 24 194 -125.01 gain 194 24 -124.34 gain 24 195 -125.51 gain 195 24 -125.47 gain 24 196 -127.60 gain 196 24 -131.60 gain 24 197 -133.85 gain 197 24 -133.91 gain 24 198 -129.47 gain 198 24 -129.06 gain 24 199 -124.78 gain 199 24 -128.28 gain 24 200 -129.81 gain 200 24 -130.26 gain 24 201 -128.58 gain 201 24 -129.82 gain 24 202 -126.95 gain 202 24 -132.19 gain 24 203 -128.09 gain 203 24 -132.96 gain 24 204 -125.09 gain 204 24 -127.24 gain 24 205 -129.46 gain 205 24 -130.69 gain 24 206 -126.53 gain 206 24 -132.28 gain 24 207 -122.98 gain 207 24 -121.09 gain 24 208 -121.14 gain 208 24 -125.02 gain 24 209 -127.06 gain 209 24 -131.93 gain 24 210 -118.19 gain 210 24 -120.00 gain 24 211 -127.97 gain 211 24 -131.80 gain 24 212 -122.19 gain 212 24 -124.57 gain 24 213 -122.73 gain 213 24 -124.30 gain 24 214 -122.71 gain 214 24 -124.17 gain 24 215 -127.95 gain 215 24 -125.82 gain 24 216 -126.36 gain 216 24 -128.90 gain 24 217 -122.25 gain 217 24 -125.30 gain 24 218 -122.58 gain 218 24 -127.83 gain 24 219 -119.97 gain 219 24 -116.57 gain 24 220 -117.07 gain 220 24 -124.16 gain 24 221 -121.22 gain 221 24 -123.96 gain 24 222 -126.68 gain 222 24 -129.74 gain 24 223 -129.70 gain 223 24 -131.37 gain 24 224 -129.93 gain 224 24 -134.29 gain 25 26 -97.74 gain 26 25 -91.62 gain 25 27 -102.10 gain 27 25 -91.88 gain 25 28 -113.32 gain 28 25 -105.80 gain 25 29 -112.25 gain 29 25 -106.61 gain 25 30 -133.14 gain 30 25 -130.96 gain 25 31 -125.59 gain 31 25 -121.03 gain 25 32 -131.35 gain 32 25 -126.81 gain 25 33 -123.58 gain 33 25 -121.29 gain 25 34 -120.37 gain 34 25 -116.69 gain 25 35 -117.50 gain 35 25 -113.65 gain 25 36 -114.28 gain 36 25 -114.20 gain 25 37 -115.26 gain 37 25 -107.38 gain 25 38 -107.68 gain 38 25 -105.83 gain 25 39 -104.70 gain 39 25 -101.72 gain 25 40 -101.13 gain 40 25 -100.19 gain 25 41 -103.89 gain 41 25 -98.58 gain 25 42 -114.13 gain 42 25 -106.97 gain 25 43 -117.35 gain 43 25 -114.08 gain 25 44 -119.38 gain 44 25 -119.16 gain 25 45 -128.63 gain 45 25 -126.89 gain 25 46 -124.12 gain 46 25 -118.17 gain 25 47 -122.34 gain 47 25 -117.45 gain 25 48 -129.44 gain 48 25 -122.35 gain 25 49 -123.93 gain 49 25 -124.81 gain 25 50 -120.38 gain 50 25 -122.22 gain 25 51 -114.65 gain 51 25 -111.63 gain 25 52 -113.86 gain 52 25 -106.86 gain 25 53 -116.12 gain 53 25 -110.13 gain 25 54 -109.45 gain 54 25 -104.17 gain 25 55 -107.67 gain 55 25 -101.69 gain 25 56 -106.57 gain 56 25 -107.91 gain 25 57 -115.81 gain 57 25 -111.02 gain 25 58 -114.37 gain 58 25 -112.33 gain 25 59 -114.78 gain 59 25 -108.86 gain 25 60 -128.80 gain 60 25 -124.20 gain 25 61 -126.58 gain 61 25 -120.74 gain 25 62 -122.72 gain 62 25 -122.09 gain 25 63 -129.17 gain 63 25 -121.77 gain 25 64 -117.84 gain 64 25 -113.41 gain 25 65 -122.30 gain 65 25 -119.96 gain 25 66 -118.68 gain 66 25 -110.60 gain 25 67 -109.73 gain 67 25 -103.92 gain 25 68 -113.60 gain 68 25 -112.34 gain 25 69 -115.48 gain 69 25 -111.52 gain 25 70 -116.34 gain 70 25 -112.14 gain 25 71 -110.23 gain 71 25 -104.13 gain 25 72 -120.74 gain 72 25 -115.06 gain 25 73 -114.17 gain 73 25 -106.88 gain 25 74 -114.72 gain 74 25 -111.31 gain 25 75 -126.37 gain 75 25 -123.10 gain 25 76 -118.46 gain 76 25 -111.14 gain 25 77 -131.82 gain 77 25 -128.17 gain 25 78 -122.32 gain 78 25 -121.51 gain 25 79 -130.78 gain 79 25 -124.75 gain 25 80 -124.02 gain 80 25 -118.49 gain 25 81 -122.20 gain 81 25 -117.26 gain 25 82 -120.29 gain 82 25 -112.99 gain 25 83 -116.95 gain 83 25 -110.68 gain 25 84 -125.38 gain 84 25 -119.26 gain 25 85 -112.03 gain 85 25 -102.72 gain 25 86 -111.86 gain 86 25 -105.92 gain 25 87 -111.55 gain 87 25 -109.58 gain 25 88 -119.53 gain 88 25 -115.31 gain 25 89 -118.67 gain 89 25 -113.05 gain 25 90 -124.64 gain 90 25 -116.03 gain 25 91 -125.01 gain 91 25 -120.34 gain 25 92 -129.08 gain 92 25 -121.37 gain 25 93 -125.93 gain 93 25 -123.01 gain 25 94 -128.72 gain 94 25 -125.67 gain 25 95 -121.85 gain 95 25 -121.06 gain 25 96 -118.19 gain 96 25 -114.73 gain 25 97 -120.83 gain 97 25 -116.12 gain 25 98 -121.10 gain 98 25 -117.19 gain 25 99 -123.09 gain 99 25 -117.00 gain 25 100 -118.23 gain 100 25 -111.70 gain 25 101 -122.13 gain 101 25 -115.77 gain 25 102 -127.41 gain 102 25 -121.83 gain 25 103 -115.62 gain 103 25 -107.52 gain 25 104 -121.52 gain 104 25 -118.80 gain 25 105 -127.70 gain 105 25 -120.92 gain 25 106 -126.53 gain 106 25 -120.83 gain 25 107 -134.42 gain 107 25 -135.29 gain 25 108 -123.33 gain 108 25 -116.52 gain 25 109 -130.19 gain 109 25 -126.87 gain 25 110 -125.29 gain 110 25 -120.43 gain 25 111 -115.76 gain 111 25 -110.58 gain 25 112 -129.74 gain 112 25 -123.44 gain 25 113 -121.27 gain 113 25 -113.78 gain 25 114 -124.95 gain 114 25 -120.76 gain 25 115 -122.47 gain 115 25 -112.59 gain 25 116 -127.42 gain 116 25 -125.08 gain 25 117 -124.06 gain 117 25 -123.22 gain 25 118 -123.59 gain 118 25 -121.08 gain 25 119 -124.23 gain 119 25 -116.37 gain 25 120 -125.32 gain 120 25 -121.98 gain 25 121 -137.67 gain 121 25 -133.62 gain 25 122 -124.26 gain 122 25 -122.32 gain 25 123 -126.40 gain 123 25 -125.24 gain 25 124 -115.77 gain 124 25 -111.02 gain 25 125 -134.14 gain 125 25 -130.73 gain 25 126 -126.87 gain 126 25 -121.41 gain 25 127 -130.33 gain 127 25 -128.33 gain 25 128 -122.01 gain 128 25 -117.95 gain 25 129 -128.78 gain 129 25 -122.63 gain 25 130 -123.94 gain 130 25 -115.61 gain 25 131 -128.10 gain 131 25 -126.86 gain 25 132 -120.26 gain 132 25 -118.64 gain 25 133 -120.04 gain 133 25 -116.50 gain 25 134 -126.67 gain 134 25 -119.83 gain 25 135 -127.31 gain 135 25 -124.03 gain 25 136 -125.58 gain 136 25 -122.92 gain 25 137 -132.71 gain 137 25 -127.53 gain 25 138 -128.52 gain 138 25 -122.34 gain 25 139 -123.49 gain 139 25 -118.30 gain 25 140 -125.81 gain 140 25 -123.22 gain 25 141 -119.07 gain 141 25 -115.16 gain 25 142 -127.07 gain 142 25 -122.46 gain 25 143 -123.88 gain 143 25 -118.89 gain 25 144 -118.23 gain 144 25 -114.26 gain 25 145 -134.70 gain 145 25 -129.18 gain 25 146 -127.64 gain 146 25 -121.02 gain 25 147 -124.26 gain 147 25 -114.74 gain 25 148 -130.45 gain 148 25 -120.65 gain 25 149 -124.45 gain 149 25 -117.81 gain 25 150 -128.52 gain 150 25 -124.56 gain 25 151 -133.33 gain 151 25 -129.57 gain 25 152 -136.65 gain 152 25 -129.87 gain 25 153 -129.09 gain 153 25 -119.89 gain 25 154 -124.48 gain 154 25 -123.83 gain 25 155 -132.81 gain 155 25 -132.05 gain 25 156 -126.84 gain 156 25 -120.47 gain 25 157 -128.72 gain 157 25 -125.30 gain 25 158 -129.21 gain 158 25 -128.38 gain 25 159 -113.99 gain 159 25 -109.77 gain 25 160 -124.26 gain 160 25 -117.16 gain 25 161 -131.44 gain 161 25 -127.83 gain 25 162 -128.12 gain 162 25 -123.37 gain 25 163 -128.10 gain 163 25 -125.50 gain 25 164 -126.50 gain 164 25 -124.94 gain 25 165 -134.39 gain 165 25 -128.88 gain 25 166 -131.65 gain 166 25 -127.71 gain 25 167 -124.45 gain 167 25 -122.59 gain 25 168 -128.03 gain 168 25 -124.63 gain 25 169 -123.41 gain 169 25 -124.20 gain 25 170 -125.88 gain 170 25 -118.20 gain 25 171 -129.52 gain 171 25 -126.86 gain 25 172 -129.57 gain 172 25 -121.61 gain 25 173 -128.18 gain 173 25 -119.66 gain 25 174 -126.24 gain 174 25 -122.01 gain 25 175 -125.76 gain 175 25 -125.09 gain 25 176 -126.79 gain 176 25 -118.13 gain 25 177 -126.81 gain 177 25 -125.96 gain 25 178 -127.89 gain 178 25 -122.86 gain 25 179 -125.51 gain 179 25 -118.87 gain 25 180 -130.24 gain 180 25 -125.07 gain 25 181 -135.62 gain 181 25 -130.52 gain 25 182 -124.04 gain 182 25 -121.33 gain 25 183 -123.94 gain 183 25 -114.61 gain 25 184 -136.70 gain 184 25 -132.15 gain 25 185 -128.13 gain 185 25 -121.07 gain 25 186 -136.58 gain 186 25 -129.81 gain 25 187 -126.64 gain 187 25 -122.41 gain 25 188 -127.10 gain 188 25 -126.13 gain 25 189 -133.24 gain 189 25 -129.79 gain 25 190 -136.30 gain 190 25 -129.86 gain 25 191 -132.23 gain 191 25 -126.88 gain 25 192 -128.03 gain 192 25 -125.55 gain 25 193 -122.33 gain 193 25 -121.09 gain 25 194 -134.08 gain 194 25 -126.66 gain 25 195 -136.63 gain 195 25 -129.83 gain 25 196 -139.79 gain 196 25 -137.04 gain 25 197 -129.17 gain 197 25 -122.48 gain 25 198 -129.55 gain 198 25 -122.38 gain 25 199 -133.74 gain 199 25 -130.49 gain 25 200 -129.44 gain 200 25 -123.12 gain 25 201 -128.28 gain 201 25 -122.77 gain 25 202 -127.94 gain 202 25 -126.43 gain 25 203 -128.02 gain 203 25 -126.14 gain 25 204 -129.25 gain 204 25 -124.65 gain 25 205 -131.20 gain 205 25 -125.67 gain 25 206 -132.79 gain 206 25 -131.78 gain 25 207 -124.36 gain 207 25 -115.71 gain 25 208 -128.48 gain 208 25 -125.61 gain 25 209 -131.19 gain 209 25 -129.31 gain 25 210 -130.84 gain 210 25 -125.90 gain 25 211 -141.18 gain 211 25 -138.26 gain 25 212 -136.66 gain 212 25 -132.28 gain 25 213 -135.97 gain 213 25 -130.79 gain 25 214 -126.78 gain 214 25 -121.49 gain 25 215 -142.85 gain 215 25 -133.97 gain 25 216 -134.16 gain 216 25 -129.94 gain 25 217 -136.26 gain 217 25 -132.56 gain 25 218 -133.89 gain 218 25 -132.37 gain 25 219 -129.00 gain 219 25 -118.84 gain 25 220 -132.88 gain 220 25 -133.22 gain 25 221 -127.87 gain 221 25 -123.85 gain 25 222 -137.31 gain 222 25 -133.62 gain 25 223 -123.83 gain 223 25 -118.75 gain 25 224 -131.39 gain 224 25 -129.00 gain 26 27 -94.51 gain 27 26 -90.41 gain 26 28 -105.66 gain 28 26 -104.25 gain 26 29 -111.06 gain 29 26 -111.53 gain 26 30 -131.06 gain 30 26 -135.00 gain 26 31 -126.93 gain 31 26 -128.48 gain 26 32 -116.65 gain 32 26 -118.23 gain 26 33 -123.33 gain 33 26 -127.17 gain 26 34 -119.39 gain 34 26 -121.83 gain 26 35 -114.13 gain 35 26 -116.39 gain 26 36 -115.49 gain 36 26 -121.53 gain 26 37 -110.37 gain 37 26 -108.61 gain 26 38 -108.49 gain 38 26 -112.76 gain 26 39 -101.84 gain 39 26 -104.97 gain 26 40 -92.38 gain 40 26 -97.56 gain 26 41 -95.25 gain 41 26 -96.06 gain 26 42 -102.22 gain 42 26 -101.18 gain 26 43 -101.94 gain 43 26 -104.78 gain 26 44 -111.64 gain 44 26 -117.54 gain 26 45 -125.21 gain 45 26 -129.59 gain 26 46 -121.00 gain 46 26 -121.17 gain 26 47 -109.67 gain 47 26 -110.90 gain 26 48 -119.26 gain 48 26 -118.28 gain 26 49 -120.30 gain 49 26 -127.30 gain 26 50 -115.89 gain 50 26 -123.85 gain 26 51 -110.21 gain 51 26 -113.31 gain 26 52 -109.61 gain 52 26 -108.73 gain 26 53 -112.74 gain 53 26 -112.87 gain 26 54 -108.89 gain 54 26 -109.72 gain 26 55 -106.79 gain 55 26 -106.92 gain 26 56 -102.11 gain 56 26 -109.56 gain 26 57 -106.51 gain 57 26 -107.85 gain 26 58 -102.49 gain 58 26 -106.57 gain 26 59 -110.84 gain 59 26 -111.04 gain 26 60 -136.75 gain 60 26 -138.27 gain 26 61 -119.51 gain 61 26 -119.78 gain 26 62 -129.07 gain 62 26 -134.56 gain 26 63 -118.33 gain 63 26 -117.05 gain 26 64 -119.28 gain 64 26 -120.97 gain 26 65 -116.37 gain 65 26 -120.15 gain 26 66 -116.69 gain 66 26 -114.72 gain 26 67 -108.75 gain 67 26 -109.06 gain 26 68 -108.73 gain 68 26 -113.60 gain 26 69 -107.75 gain 69 26 -109.91 gain 26 70 -109.25 gain 70 26 -111.17 gain 26 71 -111.41 gain 71 26 -111.43 gain 26 72 -111.51 gain 72 26 -111.95 gain 26 73 -102.27 gain 73 26 -101.10 gain 26 74 -110.10 gain 74 26 -112.81 gain 26 75 -128.91 gain 75 26 -131.76 gain 26 76 -120.18 gain 76 26 -118.98 gain 26 77 -120.64 gain 77 26 -123.11 gain 26 78 -121.73 gain 78 26 -127.04 gain 26 79 -127.56 gain 79 26 -127.65 gain 26 80 -112.85 gain 80 26 -113.45 gain 26 81 -118.73 gain 81 26 -119.91 gain 26 82 -113.29 gain 82 26 -112.10 gain 26 83 -105.97 gain 83 26 -105.82 gain 26 84 -114.69 gain 84 26 -114.68 gain 26 85 -117.40 gain 85 26 -114.20 gain 26 86 -108.73 gain 86 26 -108.91 gain 26 87 -110.58 gain 87 26 -114.73 gain 26 88 -108.14 gain 88 26 -110.04 gain 26 89 -116.36 gain 89 26 -116.86 gain 26 90 -123.56 gain 90 26 -121.07 gain 26 91 -124.63 gain 91 26 -126.09 gain 26 92 -123.08 gain 92 26 -121.49 gain 26 93 -123.85 gain 93 26 -127.05 gain 26 94 -120.85 gain 94 26 -123.92 gain 26 95 -121.74 gain 95 26 -127.07 gain 26 96 -118.60 gain 96 26 -121.27 gain 26 97 -118.03 gain 97 26 -119.44 gain 26 98 -115.88 gain 98 26 -118.08 gain 26 99 -112.49 gain 99 26 -112.52 gain 26 100 -121.97 gain 100 26 -121.56 gain 26 101 -115.31 gain 101 26 -115.07 gain 26 102 -115.49 gain 102 26 -116.03 gain 26 103 -113.85 gain 103 26 -111.87 gain 26 104 -111.74 gain 104 26 -115.14 gain 26 105 -116.67 gain 105 26 -116.01 gain 26 106 -122.29 gain 106 26 -122.72 gain 26 107 -119.48 gain 107 26 -126.47 gain 26 108 -122.80 gain 108 26 -122.10 gain 26 109 -119.58 gain 109 26 -122.38 gain 26 110 -117.19 gain 110 26 -118.45 gain 26 111 -121.66 gain 111 26 -122.61 gain 26 112 -118.04 gain 112 26 -117.87 gain 26 113 -103.40 gain 113 26 -102.03 gain 26 114 -116.75 gain 114 26 -118.69 gain 26 115 -115.65 gain 115 26 -111.89 gain 26 116 -114.93 gain 116 26 -118.71 gain 26 117 -122.00 gain 117 26 -127.28 gain 26 118 -123.98 gain 118 26 -127.59 gain 26 119 -117.54 gain 119 26 -115.81 gain 26 120 -122.98 gain 120 26 -125.76 gain 26 121 -126.05 gain 121 26 -128.11 gain 26 122 -130.58 gain 122 26 -134.76 gain 26 123 -118.79 gain 123 26 -123.75 gain 26 124 -121.29 gain 124 26 -122.66 gain 26 125 -122.78 gain 125 26 -125.49 gain 26 126 -126.14 gain 126 26 -126.79 gain 26 127 -113.39 gain 127 26 -117.51 gain 26 128 -116.11 gain 128 26 -118.17 gain 26 129 -114.84 gain 129 26 -114.81 gain 26 130 -121.32 gain 130 26 -119.11 gain 26 131 -116.04 gain 131 26 -120.92 gain 26 132 -114.54 gain 132 26 -119.05 gain 26 133 -116.75 gain 133 26 -119.32 gain 26 134 -122.14 gain 134 26 -121.42 gain 26 135 -118.51 gain 135 26 -121.36 gain 26 136 -123.91 gain 136 26 -127.37 gain 26 137 -122.25 gain 137 26 -123.18 gain 26 138 -128.17 gain 138 26 -128.11 gain 26 139 -115.91 gain 139 26 -116.83 gain 26 140 -118.58 gain 140 26 -122.11 gain 26 141 -122.85 gain 141 26 -125.05 gain 26 142 -122.32 gain 142 26 -123.83 gain 26 143 -131.57 gain 143 26 -132.69 gain 26 144 -114.67 gain 144 26 -116.81 gain 26 145 -120.03 gain 145 26 -120.62 gain 26 146 -115.96 gain 146 26 -115.46 gain 26 147 -118.30 gain 147 26 -114.89 gain 26 148 -119.18 gain 148 26 -115.49 gain 26 149 -123.36 gain 149 26 -122.84 gain 26 150 -125.64 gain 150 26 -127.80 gain 26 151 -128.36 gain 151 26 -130.72 gain 26 152 -126.87 gain 152 26 -126.20 gain 26 153 -121.34 gain 153 26 -118.25 gain 26 154 -124.27 gain 154 26 -129.73 gain 26 155 -119.57 gain 155 26 -124.93 gain 26 156 -120.10 gain 156 26 -119.85 gain 26 157 -118.79 gain 157 26 -121.48 gain 26 158 -119.48 gain 158 26 -124.77 gain 26 159 -124.81 gain 159 26 -126.71 gain 26 160 -115.08 gain 160 26 -114.09 gain 26 161 -119.62 gain 161 26 -122.12 gain 26 162 -119.41 gain 162 26 -120.78 gain 26 163 -113.54 gain 163 26 -117.06 gain 26 164 -135.63 gain 164 26 -140.19 gain 26 165 -124.50 gain 165 26 -125.11 gain 26 166 -123.86 gain 166 26 -126.03 gain 26 167 -123.40 gain 167 26 -127.66 gain 26 168 -126.40 gain 168 26 -129.11 gain 26 169 -124.96 gain 169 26 -131.87 gain 26 170 -121.36 gain 170 26 -119.80 gain 26 171 -117.85 gain 171 26 -121.31 gain 26 172 -119.15 gain 172 26 -117.30 gain 26 173 -120.68 gain 173 26 -118.27 gain 26 174 -125.96 gain 174 26 -127.85 gain 26 175 -124.56 gain 175 26 -130.00 gain 26 176 -126.53 gain 176 26 -123.98 gain 26 177 -120.37 gain 177 26 -125.63 gain 26 178 -120.27 gain 178 26 -121.36 gain 26 179 -122.79 gain 179 26 -122.28 gain 26 180 -134.17 gain 180 26 -135.12 gain 26 181 -125.02 gain 181 26 -126.04 gain 26 182 -120.40 gain 182 26 -123.80 gain 26 183 -122.79 gain 183 26 -119.58 gain 26 184 -122.02 gain 184 26 -123.60 gain 26 185 -131.56 gain 185 26 -130.62 gain 26 186 -126.38 gain 186 26 -125.72 gain 26 187 -121.15 gain 187 26 -123.03 gain 26 188 -122.78 gain 188 26 -127.93 gain 26 189 -122.76 gain 189 26 -125.42 gain 26 190 -126.68 gain 190 26 -126.35 gain 26 191 -123.28 gain 191 26 -124.05 gain 26 192 -122.54 gain 192 26 -126.17 gain 26 193 -121.30 gain 193 26 -126.18 gain 26 194 -124.92 gain 194 26 -123.61 gain 26 195 -129.03 gain 195 26 -128.36 gain 26 196 -129.59 gain 196 26 -132.95 gain 26 197 -127.66 gain 197 26 -127.09 gain 26 198 -128.33 gain 198 26 -127.28 gain 26 199 -126.18 gain 199 26 -129.04 gain 26 200 -125.35 gain 200 26 -125.15 gain 26 201 -125.61 gain 201 26 -126.22 gain 26 202 -119.93 gain 202 26 -124.54 gain 26 203 -121.95 gain 203 26 -126.18 gain 26 204 -134.07 gain 204 26 -135.58 gain 26 205 -125.18 gain 205 26 -125.76 gain 26 206 -124.56 gain 206 26 -129.67 gain 26 207 -128.42 gain 207 26 -125.89 gain 26 208 -118.25 gain 208 26 -121.50 gain 26 209 -128.35 gain 209 26 -132.59 gain 26 210 -135.93 gain 210 26 -137.11 gain 26 211 -133.36 gain 211 26 -136.56 gain 26 212 -134.01 gain 212 26 -135.75 gain 26 213 -134.80 gain 213 26 -135.73 gain 26 214 -126.17 gain 214 26 -126.99 gain 26 215 -123.85 gain 215 26 -121.09 gain 26 216 -127.57 gain 216 26 -129.46 gain 26 217 -128.27 gain 217 26 -130.68 gain 26 218 -119.91 gain 218 26 -124.52 gain 26 219 -129.80 gain 219 26 -125.76 gain 26 220 -128.94 gain 220 26 -135.40 gain 26 221 -124.24 gain 221 26 -126.34 gain 26 222 -125.12 gain 222 26 -127.54 gain 26 223 -123.02 gain 223 26 -124.05 gain 26 224 -128.20 gain 224 26 -131.93 gain 27 28 -89.13 gain 28 27 -91.83 gain 27 29 -99.74 gain 29 27 -104.31 gain 27 30 -115.42 gain 30 27 -123.46 gain 27 31 -116.67 gain 31 27 -122.33 gain 27 32 -114.90 gain 32 27 -120.59 gain 27 33 -117.73 gain 33 27 -125.67 gain 27 34 -117.19 gain 34 27 -123.74 gain 27 35 -107.70 gain 35 27 -114.06 gain 27 36 -110.91 gain 36 27 -121.06 gain 27 37 -101.67 gain 37 27 -104.02 gain 27 38 -101.19 gain 38 27 -109.56 gain 27 39 -102.09 gain 39 27 -109.32 gain 27 40 -96.18 gain 40 27 -105.46 gain 27 41 -94.83 gain 41 27 -99.74 gain 27 42 -89.37 gain 42 27 -92.43 gain 27 43 -89.76 gain 43 27 -96.71 gain 27 44 -96.12 gain 44 27 -106.13 gain 27 45 -115.49 gain 45 27 -123.97 gain 27 46 -123.06 gain 46 27 -127.33 gain 27 47 -114.08 gain 47 27 -119.41 gain 27 48 -117.07 gain 48 27 -120.19 gain 27 49 -115.77 gain 49 27 -126.86 gain 27 50 -115.00 gain 50 27 -127.07 gain 27 51 -112.11 gain 51 27 -119.32 gain 27 52 -107.36 gain 52 27 -110.58 gain 27 53 -116.97 gain 53 27 -121.20 gain 27 54 -107.55 gain 54 27 -112.49 gain 27 55 -100.37 gain 55 27 -104.61 gain 27 56 -100.79 gain 56 27 -112.36 gain 27 57 -96.56 gain 57 27 -101.99 gain 27 58 -92.44 gain 58 27 -100.62 gain 27 59 -101.14 gain 59 27 -105.44 gain 27 60 -116.43 gain 60 27 -122.05 gain 27 61 -119.79 gain 61 27 -124.17 gain 27 62 -113.63 gain 62 27 -123.22 gain 27 63 -117.97 gain 63 27 -120.79 gain 27 64 -119.52 gain 64 27 -125.32 gain 27 65 -112.04 gain 65 27 -119.92 gain 27 66 -112.33 gain 66 27 -114.47 gain 27 67 -114.30 gain 67 27 -118.71 gain 27 68 -113.68 gain 68 27 -122.65 gain 27 69 -110.81 gain 69 27 -117.07 gain 27 70 -103.31 gain 70 27 -109.33 gain 27 71 -103.28 gain 71 27 -107.40 gain 27 72 -106.83 gain 72 27 -111.38 gain 27 73 -105.20 gain 73 27 -108.14 gain 27 74 -100.61 gain 74 27 -107.42 gain 27 75 -120.07 gain 75 27 -127.02 gain 27 76 -120.06 gain 76 27 -122.96 gain 27 77 -115.95 gain 77 27 -122.51 gain 27 78 -115.72 gain 78 27 -125.14 gain 27 79 -117.06 gain 79 27 -121.26 gain 27 80 -111.40 gain 80 27 -116.10 gain 27 81 -124.94 gain 81 27 -130.23 gain 27 82 -114.57 gain 82 27 -117.48 gain 27 83 -111.50 gain 83 27 -115.45 gain 27 84 -106.47 gain 84 27 -110.57 gain 27 85 -109.97 gain 85 27 -110.88 gain 27 86 -98.09 gain 86 27 -102.38 gain 27 87 -101.38 gain 87 27 -109.63 gain 27 88 -105.54 gain 88 27 -111.54 gain 27 89 -102.24 gain 89 27 -106.84 gain 27 90 -119.13 gain 90 27 -120.74 gain 27 91 -114.41 gain 91 27 -119.96 gain 27 92 -112.07 gain 92 27 -114.59 gain 27 93 -113.04 gain 93 27 -120.34 gain 27 94 -121.07 gain 94 27 -128.25 gain 27 95 -118.20 gain 95 27 -127.63 gain 27 96 -111.94 gain 96 27 -118.71 gain 27 97 -116.51 gain 97 27 -122.02 gain 27 98 -107.88 gain 98 27 -114.20 gain 27 99 -107.32 gain 99 27 -111.45 gain 27 100 -110.48 gain 100 27 -114.17 gain 27 101 -106.72 gain 101 27 -110.58 gain 27 102 -112.64 gain 102 27 -117.28 gain 27 103 -115.24 gain 103 27 -117.37 gain 27 104 -107.76 gain 104 27 -115.26 gain 27 105 -124.69 gain 105 27 -128.13 gain 27 106 -125.39 gain 106 27 -129.92 gain 27 107 -123.95 gain 107 27 -135.05 gain 27 108 -118.41 gain 108 27 -121.82 gain 27 109 -120.15 gain 109 27 -127.05 gain 27 110 -118.55 gain 110 27 -123.92 gain 27 111 -117.60 gain 111 27 -122.65 gain 27 112 -111.65 gain 112 27 -115.58 gain 27 113 -116.19 gain 113 27 -118.93 gain 27 114 -110.44 gain 114 27 -116.47 gain 27 115 -114.10 gain 115 27 -114.44 gain 27 116 -114.21 gain 116 27 -122.09 gain 27 117 -111.66 gain 117 27 -121.05 gain 27 118 -111.42 gain 118 27 -119.13 gain 27 119 -121.70 gain 119 27 -124.07 gain 27 120 -130.21 gain 120 27 -137.10 gain 27 121 -115.32 gain 121 27 -121.49 gain 27 122 -114.50 gain 122 27 -122.79 gain 27 123 -123.05 gain 123 27 -132.11 gain 27 124 -119.23 gain 124 27 -124.70 gain 27 125 -110.38 gain 125 27 -117.19 gain 27 126 -109.83 gain 126 27 -114.59 gain 27 127 -120.56 gain 127 27 -128.78 gain 27 128 -118.41 gain 128 27 -124.58 gain 27 129 -115.49 gain 129 27 -119.57 gain 27 130 -110.92 gain 130 27 -112.81 gain 27 131 -115.29 gain 131 27 -124.27 gain 27 132 -106.61 gain 132 27 -115.22 gain 27 133 -114.76 gain 133 27 -121.44 gain 27 134 -113.93 gain 134 27 -117.31 gain 27 135 -122.32 gain 135 27 -129.27 gain 27 136 -121.76 gain 136 27 -129.32 gain 27 137 -122.93 gain 137 27 -127.97 gain 27 138 -124.32 gain 138 27 -128.36 gain 27 139 -121.98 gain 139 27 -127.00 gain 27 140 -125.80 gain 140 27 -133.44 gain 27 141 -123.40 gain 141 27 -129.71 gain 27 142 -121.34 gain 142 27 -126.96 gain 27 143 -113.82 gain 143 27 -119.05 gain 27 144 -116.12 gain 144 27 -122.37 gain 27 145 -108.96 gain 145 27 -113.65 gain 27 146 -114.21 gain 146 27 -117.81 gain 27 147 -116.70 gain 147 27 -117.40 gain 27 148 -116.24 gain 148 27 -116.66 gain 27 149 -117.18 gain 149 27 -120.76 gain 27 150 -119.44 gain 150 27 -125.70 gain 27 151 -127.16 gain 151 27 -133.62 gain 27 152 -122.02 gain 152 27 -125.46 gain 27 153 -113.98 gain 153 27 -114.99 gain 27 154 -113.17 gain 154 27 -122.73 gain 27 155 -118.22 gain 155 27 -127.68 gain 27 156 -113.30 gain 156 27 -117.15 gain 27 157 -117.71 gain 157 27 -124.51 gain 27 158 -118.16 gain 158 27 -127.55 gain 27 159 -121.51 gain 159 27 -127.52 gain 27 160 -115.62 gain 160 27 -118.74 gain 27 161 -115.11 gain 161 27 -121.72 gain 27 162 -120.93 gain 162 27 -126.40 gain 27 163 -121.22 gain 163 27 -128.85 gain 27 164 -116.69 gain 164 27 -125.36 gain 27 165 -118.12 gain 165 27 -122.83 gain 27 166 -118.92 gain 166 27 -125.19 gain 27 167 -122.41 gain 167 27 -130.77 gain 27 168 -120.94 gain 168 27 -127.76 gain 27 169 -121.50 gain 169 27 -132.51 gain 27 170 -120.46 gain 170 27 -123.00 gain 27 171 -123.27 gain 171 27 -130.84 gain 27 172 -121.10 gain 172 27 -123.36 gain 27 173 -117.55 gain 173 27 -119.24 gain 27 174 -114.06 gain 174 27 -120.05 gain 27 175 -115.75 gain 175 27 -125.30 gain 27 176 -119.29 gain 176 27 -120.85 gain 27 177 -108.85 gain 177 27 -118.22 gain 27 178 -118.03 gain 178 27 -123.23 gain 27 179 -118.52 gain 179 27 -122.10 gain 27 180 -119.80 gain 180 27 -124.86 gain 27 181 -118.92 gain 181 27 -124.05 gain 27 182 -125.69 gain 182 27 -133.20 gain 27 183 -125.14 gain 183 27 -126.04 gain 27 184 -120.22 gain 184 27 -125.90 gain 27 185 -118.46 gain 185 27 -121.63 gain 27 186 -121.31 gain 186 27 -124.76 gain 27 187 -119.34 gain 187 27 -125.33 gain 27 188 -122.99 gain 188 27 -132.24 gain 27 189 -115.11 gain 189 27 -121.88 gain 27 190 -113.79 gain 190 27 -117.57 gain 27 191 -125.52 gain 191 27 -130.39 gain 27 192 -112.47 gain 192 27 -120.20 gain 27 193 -120.76 gain 193 27 -129.74 gain 27 194 -118.67 gain 194 27 -121.46 gain 27 195 -128.98 gain 195 27 -132.41 gain 27 196 -128.09 gain 196 27 -135.56 gain 27 197 -119.61 gain 197 27 -123.14 gain 27 198 -120.13 gain 198 27 -123.19 gain 27 199 -114.28 gain 199 27 -121.25 gain 27 200 -124.46 gain 200 27 -128.36 gain 27 201 -118.76 gain 201 27 -123.48 gain 27 202 -119.33 gain 202 27 -128.04 gain 27 203 -125.72 gain 203 27 -134.05 gain 27 204 -113.74 gain 204 27 -119.36 gain 27 205 -117.46 gain 205 27 -122.15 gain 27 206 -120.76 gain 206 27 -129.97 gain 27 207 -119.09 gain 207 27 -120.67 gain 27 208 -114.85 gain 208 27 -122.20 gain 27 209 -121.80 gain 209 27 -130.15 gain 27 210 -120.84 gain 210 27 -126.12 gain 27 211 -120.76 gain 211 27 -128.07 gain 27 212 -128.35 gain 212 27 -134.19 gain 27 213 -128.02 gain 213 27 -133.06 gain 27 214 -125.79 gain 214 27 -130.71 gain 27 215 -119.45 gain 215 27 -120.79 gain 27 216 -120.85 gain 216 27 -126.85 gain 27 217 -122.50 gain 217 27 -129.02 gain 27 218 -114.69 gain 218 27 -123.40 gain 27 219 -116.03 gain 219 27 -116.09 gain 27 220 -120.60 gain 220 27 -131.16 gain 27 221 -124.89 gain 221 27 -131.09 gain 27 222 -115.67 gain 222 27 -122.20 gain 27 223 -123.33 gain 223 27 -128.48 gain 27 224 -122.07 gain 224 27 -129.90 gain 28 29 -84.20 gain 29 28 -86.08 gain 28 30 -119.87 gain 30 28 -125.22 gain 28 31 -121.02 gain 31 28 -123.99 gain 28 32 -121.71 gain 32 28 -124.70 gain 28 33 -126.06 gain 33 28 -131.31 gain 28 34 -115.69 gain 34 28 -119.54 gain 28 35 -113.31 gain 35 28 -116.98 gain 28 36 -108.81 gain 36 28 -116.26 gain 28 37 -119.44 gain 37 28 -119.09 gain 28 38 -113.59 gain 38 28 -119.26 gain 28 39 -112.55 gain 39 28 -117.09 gain 28 40 -106.38 gain 40 28 -112.97 gain 28 41 -93.41 gain 41 28 -95.62 gain 28 42 -94.01 gain 42 28 -94.38 gain 28 43 -89.06 gain 43 28 -93.31 gain 28 44 -92.26 gain 44 28 -99.58 gain 28 45 -124.40 gain 45 28 -130.19 gain 28 46 -126.94 gain 46 28 -128.53 gain 28 47 -119.92 gain 47 28 -122.56 gain 28 48 -121.57 gain 48 28 -122.00 gain 28 49 -115.50 gain 49 28 -123.91 gain 28 50 -118.26 gain 50 28 -127.63 gain 28 51 -112.50 gain 51 28 -117.01 gain 28 52 -108.30 gain 52 28 -108.83 gain 28 53 -115.50 gain 53 28 -117.04 gain 28 54 -106.81 gain 54 28 -109.05 gain 28 55 -117.01 gain 55 28 -118.55 gain 28 56 -107.39 gain 56 28 -116.26 gain 28 57 -102.32 gain 57 28 -105.07 gain 28 58 -100.63 gain 58 28 -106.11 gain 28 59 -109.75 gain 59 28 -111.36 gain 28 60 -126.42 gain 60 28 -129.36 gain 28 61 -117.33 gain 61 28 -119.01 gain 28 62 -123.41 gain 62 28 -130.31 gain 28 63 -123.03 gain 63 28 -123.15 gain 28 64 -112.89 gain 64 28 -115.99 gain 28 65 -117.86 gain 65 28 -123.05 gain 28 66 -122.71 gain 66 28 -122.15 gain 28 67 -116.09 gain 67 28 -117.81 gain 28 68 -109.37 gain 68 28 -115.65 gain 28 69 -114.43 gain 69 28 -118.00 gain 28 70 -104.70 gain 70 28 -108.02 gain 28 71 -104.63 gain 71 28 -106.06 gain 28 72 -107.12 gain 72 28 -108.97 gain 28 73 -112.83 gain 73 28 -113.06 gain 28 74 -103.73 gain 74 28 -107.84 gain 28 75 -125.33 gain 75 28 -129.59 gain 28 76 -133.03 gain 76 28 -133.24 gain 28 77 -123.34 gain 77 28 -127.21 gain 28 78 -122.45 gain 78 28 -129.17 gain 28 79 -120.96 gain 79 28 -122.46 gain 28 80 -113.29 gain 80 28 -115.29 gain 28 81 -119.03 gain 81 28 -121.63 gain 28 82 -112.82 gain 82 28 -113.04 gain 28 83 -121.82 gain 83 28 -123.08 gain 28 84 -109.50 gain 84 28 -110.90 gain 28 85 -121.64 gain 85 28 -119.85 gain 28 86 -112.43 gain 86 28 -114.02 gain 28 87 -110.38 gain 87 28 -115.94 gain 28 88 -117.73 gain 88 28 -121.03 gain 28 89 -114.00 gain 89 28 -115.91 gain 28 90 -115.94 gain 90 28 -114.85 gain 28 91 -125.37 gain 91 28 -128.23 gain 28 92 -122.91 gain 92 28 -122.73 gain 28 93 -129.90 gain 93 28 -134.51 gain 28 94 -122.23 gain 94 28 -126.71 gain 28 95 -124.71 gain 95 28 -131.44 gain 28 96 -122.35 gain 96 28 -126.42 gain 28 97 -118.16 gain 97 28 -120.98 gain 28 98 -111.46 gain 98 28 -115.08 gain 28 99 -111.41 gain 99 28 -112.85 gain 28 100 -110.92 gain 100 28 -111.92 gain 28 101 -106.34 gain 101 28 -107.51 gain 28 102 -120.28 gain 102 28 -122.23 gain 28 103 -114.37 gain 103 28 -113.80 gain 28 104 -110.78 gain 104 28 -115.58 gain 28 105 -122.03 gain 105 28 -122.78 gain 28 106 -126.87 gain 106 28 -128.70 gain 28 107 -126.28 gain 107 28 -134.68 gain 28 108 -129.67 gain 108 28 -130.38 gain 28 109 -121.08 gain 109 28 -125.29 gain 28 110 -127.54 gain 110 28 -130.22 gain 28 111 -117.00 gain 111 28 -119.36 gain 28 112 -117.36 gain 112 28 -118.60 gain 28 113 -111.86 gain 113 28 -111.90 gain 28 114 -116.47 gain 114 28 -119.82 gain 28 115 -117.57 gain 115 28 -115.22 gain 28 116 -112.52 gain 116 28 -117.71 gain 28 117 -115.80 gain 117 28 -122.49 gain 28 118 -111.63 gain 118 28 -116.64 gain 28 119 -111.51 gain 119 28 -111.18 gain 28 120 -126.19 gain 120 28 -130.38 gain 28 121 -123.79 gain 121 28 -127.27 gain 28 122 -126.05 gain 122 28 -131.64 gain 28 123 -120.40 gain 123 28 -126.77 gain 28 124 -116.70 gain 124 28 -119.48 gain 28 125 -128.65 gain 125 28 -132.77 gain 28 126 -115.46 gain 126 28 -117.53 gain 28 127 -123.22 gain 127 28 -128.75 gain 28 128 -123.83 gain 128 28 -127.30 gain 28 129 -115.27 gain 129 28 -116.64 gain 28 130 -118.54 gain 130 28 -117.74 gain 28 131 -103.65 gain 131 28 -109.94 gain 28 132 -113.22 gain 132 28 -119.13 gain 28 133 -115.51 gain 133 28 -119.49 gain 28 134 -116.39 gain 134 28 -117.07 gain 28 135 -121.68 gain 135 28 -125.94 gain 28 136 -124.46 gain 136 28 -129.33 gain 28 137 -130.56 gain 137 28 -132.91 gain 28 138 -126.52 gain 138 28 -127.87 gain 28 139 -125.91 gain 139 28 -128.24 gain 28 140 -116.04 gain 140 28 -120.98 gain 28 141 -123.59 gain 141 28 -127.20 gain 28 142 -119.70 gain 142 28 -122.62 gain 28 143 -109.62 gain 143 28 -112.15 gain 28 144 -124.34 gain 144 28 -127.89 gain 28 145 -118.49 gain 145 28 -120.49 gain 28 146 -112.73 gain 146 28 -113.64 gain 28 147 -126.50 gain 147 28 -124.50 gain 28 148 -119.84 gain 148 28 -117.56 gain 28 149 -116.52 gain 149 28 -117.40 gain 28 150 -127.53 gain 150 28 -131.10 gain 28 151 -127.60 gain 151 28 -131.37 gain 28 152 -128.68 gain 152 28 -129.42 gain 28 153 -121.72 gain 153 28 -120.04 gain 28 154 -122.21 gain 154 28 -129.08 gain 28 155 -119.45 gain 155 28 -126.22 gain 28 156 -119.43 gain 156 28 -120.59 gain 28 157 -112.06 gain 157 28 -116.16 gain 28 158 -119.50 gain 158 28 -126.19 gain 28 159 -119.31 gain 159 28 -122.63 gain 28 160 -124.97 gain 160 28 -125.39 gain 28 161 -125.09 gain 161 28 -129.01 gain 28 162 -120.02 gain 162 28 -122.80 gain 28 163 -114.43 gain 163 28 -119.36 gain 28 164 -115.45 gain 164 28 -121.42 gain 28 165 -117.82 gain 165 28 -119.83 gain 28 166 -123.46 gain 166 28 -127.04 gain 28 167 -126.27 gain 167 28 -131.94 gain 28 168 -126.00 gain 168 28 -130.12 gain 28 169 -127.15 gain 169 28 -135.47 gain 28 170 -129.38 gain 170 28 -129.23 gain 28 171 -122.65 gain 171 28 -127.52 gain 28 172 -119.38 gain 172 28 -118.95 gain 28 173 -125.61 gain 173 28 -124.61 gain 28 174 -119.65 gain 174 28 -122.95 gain 28 175 -117.70 gain 175 28 -124.55 gain 28 176 -122.78 gain 176 28 -121.64 gain 28 177 -125.10 gain 177 28 -131.78 gain 28 178 -121.37 gain 178 28 -123.87 gain 28 179 -119.08 gain 179 28 -119.98 gain 28 180 -125.63 gain 180 28 -127.99 gain 28 181 -129.32 gain 181 28 -131.75 gain 28 182 -133.48 gain 182 28 -138.29 gain 28 183 -127.90 gain 183 28 -126.11 gain 28 184 -128.56 gain 184 28 -131.55 gain 28 185 -122.47 gain 185 28 -122.94 gain 28 186 -127.51 gain 186 28 -128.27 gain 28 187 -120.67 gain 187 28 -123.97 gain 28 188 -122.18 gain 188 28 -128.74 gain 28 189 -118.26 gain 189 28 -122.33 gain 28 190 -118.71 gain 190 28 -119.80 gain 28 191 -120.35 gain 191 28 -122.52 gain 28 192 -123.93 gain 192 28 -128.97 gain 28 193 -119.40 gain 193 28 -125.69 gain 28 194 -124.11 gain 194 28 -124.21 gain 28 195 -132.81 gain 195 28 -133.55 gain 28 196 -127.61 gain 196 28 -132.38 gain 28 197 -129.67 gain 197 28 -130.51 gain 28 198 -133.35 gain 198 28 -133.70 gain 28 199 -128.37 gain 199 28 -132.65 gain 28 200 -124.69 gain 200 28 -125.90 gain 28 201 -121.15 gain 201 28 -123.17 gain 28 202 -115.76 gain 202 28 -121.78 gain 28 203 -124.80 gain 203 28 -130.44 gain 28 204 -125.02 gain 204 28 -127.94 gain 28 205 -124.91 gain 205 28 -126.91 gain 28 206 -128.14 gain 206 28 -134.66 gain 28 207 -125.89 gain 207 28 -124.77 gain 28 208 -118.95 gain 208 28 -123.61 gain 28 209 -122.04 gain 209 28 -127.69 gain 28 210 -122.81 gain 210 28 -125.40 gain 28 211 -125.57 gain 211 28 -130.18 gain 28 212 -128.37 gain 212 28 -131.52 gain 28 213 -127.22 gain 213 28 -129.56 gain 28 214 -121.59 gain 214 28 -123.82 gain 28 215 -128.51 gain 215 28 -127.16 gain 28 216 -131.53 gain 216 28 -134.84 gain 28 217 -121.49 gain 217 28 -125.32 gain 28 218 -130.26 gain 218 28 -136.28 gain 28 219 -119.46 gain 219 28 -116.83 gain 28 220 -130.58 gain 220 28 -138.45 gain 28 221 -122.24 gain 221 28 -125.75 gain 28 222 -120.53 gain 222 28 -124.37 gain 28 223 -119.92 gain 223 28 -122.36 gain 28 224 -127.05 gain 224 28 -132.19 gain 29 30 -133.83 gain 30 29 -137.30 gain 29 31 -126.74 gain 31 29 -127.82 gain 29 32 -128.66 gain 32 29 -129.78 gain 29 33 -123.70 gain 33 29 -127.06 gain 29 34 -127.52 gain 34 29 -129.49 gain 29 35 -122.51 gain 35 29 -124.31 gain 29 36 -118.35 gain 36 29 -123.92 gain 29 37 -123.32 gain 37 29 -121.10 gain 29 38 -113.47 gain 38 29 -117.26 gain 29 39 -108.21 gain 39 29 -110.87 gain 29 40 -112.67 gain 40 29 -117.37 gain 29 41 -103.45 gain 41 29 -103.79 gain 29 42 -104.78 gain 42 29 -103.27 gain 29 43 -94.22 gain 43 29 -96.60 gain 29 44 -97.69 gain 44 29 -103.13 gain 29 45 -128.93 gain 45 29 -132.84 gain 29 46 -126.84 gain 46 29 -126.54 gain 29 47 -123.29 gain 47 29 -124.06 gain 29 48 -119.54 gain 48 29 -118.09 gain 29 49 -125.01 gain 49 29 -131.54 gain 29 50 -119.75 gain 50 29 -127.24 gain 29 51 -120.06 gain 51 29 -122.69 gain 29 52 -118.00 gain 52 29 -116.65 gain 29 53 -122.41 gain 53 29 -122.07 gain 29 54 -113.67 gain 54 29 -114.03 gain 29 55 -111.49 gain 55 29 -111.15 gain 29 56 -104.31 gain 56 29 -111.30 gain 29 57 -108.49 gain 57 29 -109.35 gain 29 58 -104.09 gain 58 29 -107.69 gain 29 59 -99.83 gain 59 29 -99.56 gain 29 60 -137.16 gain 60 29 -138.21 gain 29 61 -133.44 gain 61 29 -133.25 gain 29 62 -122.80 gain 62 29 -127.82 gain 29 63 -126.01 gain 63 29 -124.26 gain 29 64 -126.05 gain 64 29 -127.27 gain 29 65 -121.87 gain 65 29 -125.18 gain 29 66 -125.21 gain 66 29 -122.78 gain 29 67 -117.58 gain 67 29 -117.42 gain 29 68 -121.58 gain 68 29 -125.98 gain 29 69 -114.20 gain 69 29 -115.89 gain 29 70 -113.73 gain 70 29 -115.18 gain 29 71 -113.64 gain 71 29 -113.19 gain 29 72 -107.17 gain 72 29 -107.14 gain 29 73 -105.90 gain 73 29 -104.26 gain 29 74 -102.92 gain 74 29 -105.15 gain 29 75 -121.03 gain 75 29 -123.40 gain 29 76 -125.95 gain 76 29 -124.28 gain 29 77 -132.73 gain 77 29 -134.73 gain 29 78 -127.51 gain 78 29 -132.36 gain 29 79 -122.00 gain 79 29 -121.62 gain 29 80 -116.33 gain 80 29 -116.45 gain 29 81 -121.95 gain 81 29 -122.67 gain 29 82 -122.05 gain 82 29 -120.40 gain 29 83 -116.51 gain 83 29 -115.89 gain 29 84 -116.31 gain 84 29 -115.84 gain 29 85 -120.02 gain 85 29 -116.35 gain 29 86 -110.91 gain 86 29 -110.63 gain 29 87 -108.70 gain 87 29 -112.38 gain 29 88 -114.48 gain 88 29 -115.91 gain 29 89 -113.52 gain 89 29 -113.54 gain 29 90 -123.99 gain 90 29 -121.02 gain 29 91 -125.77 gain 91 29 -126.75 gain 29 92 -124.69 gain 92 29 -122.63 gain 29 93 -119.17 gain 93 29 -121.90 gain 29 94 -124.04 gain 94 29 -126.64 gain 29 95 -124.23 gain 95 29 -129.09 gain 29 96 -119.51 gain 96 29 -121.71 gain 29 97 -114.22 gain 97 29 -115.15 gain 29 98 -121.26 gain 98 29 -123.00 gain 29 99 -125.32 gain 99 29 -124.87 gain 29 100 -116.28 gain 100 29 -115.40 gain 29 101 -116.66 gain 101 29 -115.95 gain 29 102 -122.41 gain 102 29 -122.48 gain 29 103 -105.76 gain 103 29 -103.31 gain 29 104 -119.12 gain 104 29 -122.05 gain 29 105 -127.39 gain 105 29 -126.26 gain 29 106 -122.74 gain 106 29 -122.69 gain 29 107 -122.97 gain 107 29 -129.49 gain 29 108 -132.73 gain 108 29 -131.57 gain 29 109 -124.21 gain 109 29 -126.54 gain 29 110 -115.50 gain 110 29 -116.30 gain 29 111 -121.54 gain 111 29 -122.02 gain 29 112 -126.78 gain 112 29 -126.14 gain 29 113 -121.05 gain 113 29 -119.21 gain 29 114 -118.56 gain 114 29 -120.03 gain 29 115 -114.65 gain 115 29 -110.41 gain 29 116 -121.01 gain 116 29 -124.32 gain 29 117 -115.69 gain 117 29 -120.50 gain 29 118 -114.70 gain 118 29 -117.83 gain 29 119 -119.06 gain 119 29 -116.85 gain 29 120 -120.08 gain 120 29 -122.39 gain 29 121 -131.28 gain 121 29 -132.88 gain 29 122 -126.85 gain 122 29 -130.56 gain 29 123 -125.61 gain 123 29 -130.10 gain 29 124 -126.96 gain 124 29 -127.86 gain 29 125 -122.74 gain 125 29 -124.98 gain 29 126 -120.75 gain 126 29 -120.93 gain 29 127 -116.76 gain 127 29 -120.41 gain 29 128 -125.50 gain 128 29 -127.09 gain 29 129 -123.75 gain 129 29 -123.25 gain 29 130 -121.22 gain 130 29 -118.54 gain 29 131 -121.27 gain 131 29 -125.67 gain 29 132 -118.23 gain 132 29 -122.26 gain 29 133 -121.79 gain 133 29 -123.90 gain 29 134 -120.29 gain 134 29 -119.09 gain 29 135 -128.39 gain 135 29 -130.76 gain 29 136 -132.36 gain 136 29 -135.34 gain 29 137 -134.90 gain 137 29 -135.37 gain 29 138 -124.02 gain 138 29 -123.49 gain 29 139 -120.18 gain 139 29 -120.64 gain 29 140 -132.14 gain 140 29 -135.20 gain 29 141 -133.84 gain 141 29 -135.58 gain 29 142 -124.17 gain 142 29 -125.21 gain 29 143 -125.34 gain 143 29 -126.00 gain 29 144 -124.07 gain 144 29 -125.74 gain 29 145 -117.04 gain 145 29 -117.17 gain 29 146 -120.21 gain 146 29 -119.24 gain 29 147 -112.83 gain 147 29 -108.95 gain 29 148 -122.44 gain 148 29 -118.28 gain 29 149 -119.93 gain 149 29 -118.94 gain 29 150 -124.15 gain 150 29 -125.84 gain 29 151 -130.48 gain 151 29 -132.37 gain 29 152 -124.17 gain 152 29 -123.03 gain 29 153 -131.47 gain 153 29 -127.91 gain 29 154 -132.60 gain 154 29 -137.60 gain 29 155 -128.80 gain 155 29 -133.69 gain 29 156 -127.29 gain 156 29 -126.57 gain 29 157 -126.32 gain 157 29 -128.54 gain 29 158 -122.18 gain 158 29 -127.00 gain 29 159 -119.75 gain 159 29 -121.19 gain 29 160 -120.10 gain 160 29 -118.65 gain 29 161 -118.36 gain 161 29 -120.40 gain 29 162 -121.04 gain 162 29 -121.94 gain 29 163 -123.19 gain 163 29 -126.24 gain 29 164 -122.67 gain 164 29 -126.76 gain 29 165 -118.67 gain 165 29 -118.80 gain 29 166 -127.22 gain 166 29 -128.92 gain 29 167 -133.06 gain 167 29 -136.85 gain 29 168 -131.92 gain 168 29 -134.16 gain 29 169 -130.35 gain 169 29 -136.79 gain 29 170 -124.74 gain 170 29 -122.70 gain 29 171 -127.52 gain 171 29 -130.51 gain 29 172 -131.27 gain 172 29 -128.95 gain 29 173 -124.83 gain 173 29 -121.95 gain 29 174 -116.76 gain 174 29 -118.18 gain 29 175 -124.43 gain 175 29 -129.40 gain 29 176 -112.50 gain 176 29 -109.49 gain 29 177 -126.63 gain 177 29 -131.43 gain 29 178 -117.76 gain 178 29 -118.38 gain 29 179 -124.65 gain 179 29 -123.66 gain 29 180 -137.13 gain 180 29 -137.61 gain 29 181 -132.91 gain 181 29 -133.46 gain 29 182 -126.12 gain 182 29 -129.05 gain 29 183 -128.05 gain 183 29 -124.37 gain 29 184 -126.27 gain 184 29 -127.37 gain 29 185 -128.36 gain 185 29 -126.95 gain 29 186 -123.42 gain 186 29 -122.30 gain 29 187 -130.01 gain 187 29 -131.42 gain 29 188 -121.50 gain 188 29 -126.18 gain 29 189 -139.34 gain 189 29 -141.53 gain 29 190 -124.07 gain 190 29 -123.27 gain 29 191 -122.95 gain 191 29 -123.25 gain 29 192 -127.56 gain 192 29 -130.72 gain 29 193 -129.29 gain 193 29 -133.71 gain 29 194 -126.96 gain 194 29 -125.18 gain 29 195 -128.95 gain 195 29 -127.81 gain 29 196 -128.50 gain 196 29 -131.40 gain 29 197 -124.11 gain 197 29 -123.07 gain 29 198 -122.30 gain 198 29 -120.78 gain 29 199 -129.57 gain 199 29 -131.97 gain 29 200 -128.48 gain 200 29 -127.82 gain 29 201 -122.59 gain 201 29 -122.73 gain 29 202 -133.07 gain 202 29 -137.21 gain 29 203 -121.34 gain 203 29 -125.11 gain 29 204 -125.86 gain 204 29 -126.90 gain 29 205 -126.24 gain 205 29 -126.35 gain 29 206 -126.15 gain 206 29 -130.79 gain 29 207 -126.44 gain 207 29 -123.44 gain 29 208 -127.51 gain 208 29 -130.29 gain 29 209 -127.50 gain 209 29 -131.27 gain 29 210 -126.23 gain 210 29 -126.94 gain 29 211 -134.00 gain 211 29 -136.73 gain 29 212 -134.54 gain 212 29 -135.81 gain 29 213 -128.48 gain 213 29 -128.95 gain 29 214 -131.19 gain 214 29 -131.54 gain 29 215 -129.30 gain 215 29 -126.06 gain 29 216 -121.96 gain 216 29 -123.39 gain 29 217 -121.96 gain 217 29 -123.91 gain 29 218 -127.89 gain 218 29 -132.02 gain 29 219 -128.20 gain 219 29 -123.69 gain 29 220 -126.89 gain 220 29 -132.88 gain 29 221 -130.76 gain 221 29 -132.39 gain 29 222 -130.59 gain 222 29 -132.55 gain 29 223 -119.17 gain 223 29 -119.74 gain 29 224 -132.20 gain 224 29 -135.45 gain 30 31 -93.40 gain 31 30 -91.02 gain 30 32 -105.78 gain 32 30 -103.43 gain 30 33 -108.82 gain 33 30 -108.72 gain 30 34 -113.44 gain 34 30 -111.94 gain 30 35 -111.85 gain 35 30 -110.18 gain 30 36 -132.93 gain 36 30 -135.04 gain 30 37 -119.92 gain 37 30 -114.22 gain 30 38 -122.84 gain 38 30 -123.17 gain 30 39 -120.83 gain 39 30 -120.02 gain 30 40 -127.36 gain 40 30 -128.60 gain 30 41 -123.08 gain 41 30 -119.95 gain 30 42 -123.34 gain 42 30 -118.36 gain 30 43 -126.66 gain 43 30 -125.56 gain 30 44 -132.03 gain 44 30 -134.00 gain 30 45 -96.71 gain 45 30 -97.15 gain 30 46 -100.02 gain 46 30 -96.26 gain 30 47 -105.81 gain 47 30 -103.10 gain 30 48 -113.99 gain 48 30 -109.07 gain 30 49 -115.37 gain 49 30 -118.43 gain 30 50 -117.79 gain 50 30 -121.81 gain 30 51 -118.71 gain 51 30 -117.87 gain 30 52 -119.65 gain 52 30 -114.83 gain 30 53 -119.92 gain 53 30 -116.12 gain 30 54 -123.87 gain 54 30 -120.77 gain 30 55 -128.18 gain 55 30 -124.37 gain 30 56 -129.80 gain 56 30 -133.32 gain 30 57 -134.51 gain 57 30 -131.91 gain 30 58 -129.11 gain 58 30 -129.24 gain 30 59 -125.71 gain 59 30 -121.97 gain 30 60 -99.33 gain 60 30 -96.91 gain 30 61 -104.28 gain 61 30 -100.62 gain 30 62 -110.35 gain 62 30 -111.91 gain 30 63 -106.39 gain 63 30 -101.17 gain 30 64 -121.98 gain 64 30 -119.73 gain 30 65 -121.81 gain 65 30 -121.65 gain 30 66 -118.50 gain 66 30 -112.60 gain 30 67 -117.48 gain 67 30 -113.85 gain 30 68 -123.75 gain 68 30 -124.67 gain 30 69 -127.57 gain 69 30 -125.80 gain 30 70 -124.06 gain 70 30 -122.04 gain 30 71 -124.22 gain 71 30 -120.30 gain 30 72 -121.52 gain 72 30 -118.02 gain 30 73 -131.43 gain 73 30 -126.32 gain 30 74 -130.98 gain 74 30 -129.75 gain 30 75 -111.13 gain 75 30 -110.04 gain 30 76 -104.63 gain 76 30 -99.49 gain 30 77 -108.91 gain 77 30 -107.44 gain 30 78 -118.38 gain 78 30 -119.75 gain 30 79 -120.04 gain 79 30 -116.19 gain 30 80 -123.86 gain 80 30 -120.51 gain 30 81 -112.07 gain 81 30 -109.31 gain 30 82 -114.71 gain 82 30 -109.59 gain 30 83 -119.13 gain 83 30 -115.04 gain 30 84 -126.12 gain 84 30 -122.18 gain 30 85 -134.23 gain 85 30 -127.10 gain 30 86 -125.82 gain 86 30 -122.06 gain 30 87 -128.95 gain 87 30 -129.16 gain 30 88 -133.65 gain 88 30 -131.61 gain 30 89 -125.66 gain 89 30 -122.22 gain 30 90 -114.62 gain 90 30 -108.19 gain 30 91 -107.57 gain 91 30 -105.08 gain 30 92 -114.73 gain 92 30 -109.20 gain 30 93 -117.29 gain 93 30 -116.55 gain 30 94 -125.67 gain 94 30 -124.80 gain 30 95 -123.74 gain 95 30 -125.12 gain 30 96 -118.10 gain 96 30 -116.83 gain 30 97 -126.75 gain 97 30 -124.22 gain 30 98 -125.60 gain 98 30 -123.87 gain 30 99 -129.44 gain 99 30 -125.53 gain 30 100 -120.86 gain 100 30 -116.51 gain 30 101 -127.96 gain 101 30 -123.78 gain 30 102 -124.81 gain 102 30 -121.41 gain 30 103 -127.91 gain 103 30 -121.99 gain 30 104 -131.52 gain 104 30 -130.97 gain 30 105 -125.58 gain 105 30 -120.98 gain 30 106 -120.14 gain 106 30 -116.62 gain 30 107 -114.17 gain 107 30 -117.23 gain 30 108 -114.47 gain 108 30 -109.84 gain 30 109 -114.50 gain 109 30 -113.36 gain 30 110 -128.96 gain 110 30 -126.29 gain 30 111 -123.24 gain 111 30 -120.25 gain 30 112 -129.98 gain 112 30 -125.87 gain 30 113 -131.45 gain 113 30 -126.15 gain 30 114 -122.11 gain 114 30 -120.11 gain 30 115 -125.71 gain 115 30 -118.01 gain 30 116 -129.44 gain 116 30 -129.28 gain 30 117 -125.43 gain 117 30 -126.77 gain 30 118 -128.97 gain 118 30 -128.63 gain 30 119 -137.34 gain 119 30 -131.66 gain 30 120 -114.47 gain 120 30 -113.31 gain 30 121 -125.92 gain 121 30 -124.05 gain 30 122 -113.12 gain 122 30 -113.36 gain 30 123 -118.69 gain 123 30 -119.71 gain 30 124 -120.35 gain 124 30 -117.78 gain 30 125 -130.60 gain 125 30 -129.37 gain 30 126 -126.87 gain 126 30 -123.59 gain 30 127 -121.58 gain 127 30 -121.76 gain 30 128 -120.62 gain 128 30 -118.74 gain 30 129 -130.69 gain 129 30 -126.72 gain 30 130 -126.58 gain 130 30 -120.44 gain 30 131 -127.20 gain 131 30 -128.14 gain 30 132 -129.28 gain 132 30 -129.85 gain 30 133 -136.21 gain 133 30 -134.85 gain 30 134 -132.66 gain 134 30 -128.00 gain 30 135 -124.26 gain 135 30 -123.17 gain 30 136 -124.23 gain 136 30 -123.75 gain 30 137 -126.01 gain 137 30 -123.01 gain 30 138 -117.87 gain 138 30 -113.87 gain 30 139 -131.96 gain 139 30 -128.95 gain 30 140 -124.87 gain 140 30 -124.46 gain 30 141 -133.96 gain 141 30 -132.22 gain 30 142 -126.26 gain 142 30 -123.83 gain 30 143 -120.90 gain 143 30 -118.09 gain 30 144 -127.90 gain 144 30 -126.11 gain 30 145 -126.92 gain 145 30 -123.57 gain 30 146 -126.75 gain 146 30 -122.32 gain 30 147 -130.63 gain 147 30 -123.28 gain 30 148 -130.13 gain 148 30 -122.50 gain 30 149 -134.81 gain 149 30 -130.35 gain 30 150 -116.70 gain 150 30 -114.92 gain 30 151 -125.61 gain 151 30 -124.03 gain 30 152 -122.41 gain 152 30 -117.81 gain 30 153 -118.18 gain 153 30 -111.16 gain 30 154 -122.61 gain 154 30 -124.14 gain 30 155 -125.75 gain 155 30 -127.17 gain 30 156 -122.35 gain 156 30 -118.16 gain 30 157 -131.92 gain 157 30 -130.68 gain 30 158 -128.39 gain 158 30 -129.74 gain 30 159 -132.18 gain 159 30 -130.15 gain 30 160 -131.03 gain 160 30 -126.11 gain 30 161 -134.70 gain 161 30 -133.27 gain 30 162 -132.49 gain 162 30 -129.92 gain 30 163 -130.67 gain 163 30 -130.25 gain 30 164 -124.37 gain 164 30 -125.00 gain 30 165 -125.63 gain 165 30 -122.29 gain 30 166 -126.92 gain 166 30 -125.16 gain 30 167 -120.65 gain 167 30 -120.97 gain 30 168 -129.39 gain 168 30 -128.16 gain 30 169 -125.31 gain 169 30 -128.28 gain 30 170 -123.17 gain 170 30 -117.67 gain 30 171 -128.81 gain 171 30 -128.33 gain 30 172 -123.26 gain 172 30 -117.48 gain 30 173 -127.91 gain 173 30 -121.56 gain 30 174 -128.23 gain 174 30 -126.19 gain 30 175 -135.57 gain 175 30 -137.08 gain 30 176 -127.97 gain 176 30 -121.49 gain 30 177 -125.97 gain 177 30 -127.30 gain 30 178 -135.73 gain 178 30 -132.88 gain 30 179 -136.97 gain 179 30 -132.52 gain 30 180 -118.18 gain 180 30 -115.19 gain 30 181 -124.03 gain 181 30 -121.11 gain 30 182 -131.59 gain 182 30 -131.05 gain 30 183 -119.28 gain 183 30 -112.13 gain 30 184 -127.47 gain 184 30 -125.11 gain 30 185 -125.38 gain 185 30 -120.51 gain 30 186 -125.83 gain 186 30 -121.24 gain 30 187 -130.56 gain 187 30 -128.51 gain 30 188 -130.79 gain 188 30 -132.00 gain 30 189 -127.95 gain 189 30 -126.67 gain 30 190 -123.99 gain 190 30 -119.73 gain 30 191 -129.98 gain 191 30 -126.81 gain 30 192 -125.10 gain 192 30 -124.79 gain 30 193 -143.27 gain 193 30 -144.21 gain 30 194 -133.31 gain 194 30 -128.07 gain 30 195 -122.74 gain 195 30 -118.13 gain 30 196 -131.59 gain 196 30 -131.02 gain 30 197 -124.46 gain 197 30 -119.95 gain 30 198 -126.09 gain 198 30 -121.11 gain 30 199 -123.05 gain 199 30 -121.98 gain 30 200 -122.38 gain 200 30 -118.24 gain 30 201 -127.56 gain 201 30 -124.23 gain 30 202 -129.19 gain 202 30 -129.86 gain 30 203 -129.97 gain 203 30 -130.27 gain 30 204 -135.30 gain 204 30 -132.87 gain 30 205 -128.78 gain 205 30 -125.44 gain 30 206 -130.71 gain 206 30 -131.88 gain 30 207 -138.91 gain 207 30 -132.44 gain 30 208 -131.32 gain 208 30 -130.63 gain 30 209 -136.03 gain 209 30 -136.33 gain 30 210 -133.84 gain 210 30 -131.08 gain 30 211 -128.37 gain 211 30 -127.63 gain 30 212 -128.28 gain 212 30 -126.08 gain 30 213 -131.41 gain 213 30 -128.40 gain 30 214 -131.16 gain 214 30 -128.04 gain 30 215 -135.21 gain 215 30 -128.51 gain 30 216 -129.74 gain 216 30 -127.70 gain 30 217 -127.44 gain 217 30 -125.92 gain 30 218 -135.42 gain 218 30 -136.09 gain 30 219 -126.51 gain 219 30 -118.53 gain 30 220 -130.64 gain 220 30 -133.16 gain 30 221 -135.44 gain 221 30 -133.60 gain 30 222 -126.36 gain 222 30 -124.85 gain 30 223 -132.52 gain 223 30 -129.62 gain 30 224 -130.21 gain 224 30 -129.99 gain 31 32 -91.39 gain 32 31 -91.42 gain 31 33 -106.70 gain 33 31 -108.98 gain 31 34 -110.28 gain 34 31 -111.16 gain 31 35 -105.43 gain 35 31 -106.14 gain 31 36 -111.53 gain 36 31 -116.02 gain 31 37 -118.61 gain 37 31 -115.30 gain 31 38 -122.96 gain 38 31 -125.67 gain 31 39 -116.08 gain 39 31 -117.66 gain 31 40 -125.43 gain 40 31 -129.05 gain 31 41 -121.47 gain 41 31 -120.72 gain 31 42 -126.80 gain 42 31 -124.21 gain 31 43 -120.56 gain 43 31 -121.85 gain 31 44 -122.18 gain 44 31 -126.54 gain 31 45 -91.46 gain 45 31 -94.29 gain 31 46 -97.38 gain 46 31 -96.00 gain 31 47 -95.71 gain 47 31 -95.39 gain 31 48 -105.30 gain 48 31 -102.77 gain 31 49 -107.62 gain 49 31 -113.06 gain 31 50 -117.30 gain 50 31 -123.71 gain 31 51 -107.67 gain 51 31 -109.21 gain 31 52 -118.33 gain 52 31 -115.89 gain 31 53 -115.32 gain 53 31 -113.90 gain 31 54 -115.98 gain 54 31 -115.26 gain 31 55 -125.29 gain 55 31 -123.87 gain 31 56 -127.79 gain 56 31 -133.70 gain 31 57 -127.19 gain 57 31 -126.97 gain 31 58 -122.37 gain 58 31 -124.89 gain 31 59 -127.05 gain 59 31 -125.70 gain 31 60 -98.65 gain 60 31 -98.62 gain 31 61 -104.81 gain 61 31 -103.53 gain 31 62 -99.75 gain 62 31 -103.69 gain 31 63 -106.73 gain 63 31 -103.89 gain 31 64 -118.32 gain 64 31 -118.46 gain 31 65 -113.66 gain 65 31 -115.89 gain 31 66 -123.09 gain 66 31 -119.57 gain 31 67 -115.65 gain 67 31 -114.41 gain 31 68 -119.77 gain 68 31 -123.09 gain 31 69 -119.97 gain 69 31 -120.57 gain 31 70 -126.25 gain 70 31 -126.61 gain 31 71 -126.25 gain 71 31 -124.72 gain 31 72 -118.83 gain 72 31 -117.72 gain 31 73 -122.62 gain 73 31 -119.90 gain 31 74 -130.41 gain 74 31 -131.56 gain 31 75 -107.39 gain 75 31 -108.69 gain 31 76 -110.47 gain 76 31 -107.71 gain 31 77 -103.78 gain 77 31 -104.69 gain 31 78 -102.34 gain 78 31 -106.10 gain 31 79 -122.05 gain 79 31 -120.59 gain 31 80 -111.44 gain 80 31 -110.49 gain 31 81 -122.92 gain 81 31 -122.55 gain 31 82 -117.42 gain 82 31 -114.68 gain 31 83 -127.45 gain 83 31 -125.75 gain 31 84 -123.00 gain 84 31 -121.44 gain 31 85 -125.40 gain 85 31 -120.65 gain 31 86 -125.38 gain 86 31 -124.01 gain 31 87 -129.05 gain 87 31 -131.64 gain 31 88 -128.23 gain 88 31 -128.57 gain 31 89 -130.69 gain 89 31 -129.64 gain 31 90 -115.72 gain 90 31 -111.68 gain 31 91 -110.53 gain 91 31 -110.43 gain 31 92 -109.48 gain 92 31 -106.34 gain 31 93 -111.30 gain 93 31 -112.94 gain 31 94 -112.91 gain 94 31 -114.43 gain 31 95 -124.88 gain 95 31 -128.65 gain 31 96 -113.55 gain 96 31 -114.66 gain 31 97 -120.35 gain 97 31 -120.21 gain 31 98 -121.03 gain 98 31 -121.68 gain 31 99 -122.26 gain 99 31 -120.74 gain 31 100 -121.51 gain 100 31 -119.55 gain 31 101 -130.60 gain 101 31 -128.80 gain 31 102 -123.83 gain 102 31 -122.81 gain 31 103 -137.65 gain 103 31 -134.12 gain 31 104 -130.95 gain 104 31 -132.79 gain 31 105 -112.39 gain 105 31 -110.17 gain 31 106 -116.72 gain 106 31 -115.59 gain 31 107 -120.81 gain 107 31 -126.25 gain 31 108 -109.55 gain 108 31 -107.30 gain 31 109 -110.51 gain 109 31 -111.76 gain 31 110 -118.62 gain 110 31 -118.33 gain 31 111 -120.36 gain 111 31 -119.75 gain 31 112 -120.11 gain 112 31 -118.38 gain 31 113 -130.16 gain 113 31 -127.24 gain 31 114 -126.79 gain 114 31 -127.17 gain 31 115 -123.88 gain 115 31 -118.57 gain 31 116 -121.36 gain 116 31 -123.59 gain 31 117 -121.63 gain 117 31 -125.35 gain 31 118 -129.21 gain 118 31 -131.26 gain 31 119 -127.60 gain 119 31 -124.31 gain 31 120 -114.26 gain 120 31 -115.49 gain 31 121 -123.20 gain 121 31 -123.71 gain 31 122 -110.22 gain 122 31 -112.85 gain 31 123 -117.71 gain 123 31 -121.12 gain 31 124 -117.54 gain 124 31 -117.35 gain 31 125 -117.60 gain 125 31 -118.76 gain 31 126 -123.93 gain 126 31 -123.04 gain 31 127 -131.39 gain 127 31 -133.95 gain 31 128 -124.53 gain 128 31 -125.04 gain 31 129 -126.15 gain 129 31 -124.56 gain 31 130 -124.15 gain 130 31 -120.39 gain 31 131 -125.40 gain 131 31 -128.73 gain 31 132 -124.30 gain 132 31 -127.25 gain 31 133 -119.88 gain 133 31 -120.90 gain 31 134 -130.36 gain 134 31 -128.08 gain 31 135 -114.50 gain 135 31 -115.79 gain 31 136 -119.37 gain 136 31 -121.27 gain 31 137 -118.41 gain 137 31 -117.79 gain 31 138 -116.67 gain 138 31 -115.06 gain 31 139 -122.22 gain 139 31 -121.59 gain 31 140 -115.45 gain 140 31 -117.43 gain 31 141 -119.35 gain 141 31 -120.00 gain 31 142 -127.47 gain 142 31 -127.43 gain 31 143 -125.67 gain 143 31 -125.25 gain 31 144 -124.98 gain 144 31 -125.57 gain 31 145 -119.46 gain 145 31 -118.50 gain 31 146 -122.14 gain 146 31 -120.09 gain 31 147 -125.72 gain 147 31 -120.76 gain 31 148 -126.74 gain 148 31 -121.50 gain 31 149 -131.24 gain 149 31 -129.17 gain 31 150 -128.51 gain 150 31 -129.12 gain 31 151 -123.60 gain 151 31 -124.41 gain 31 152 -124.00 gain 152 31 -121.78 gain 31 153 -117.77 gain 153 31 -113.13 gain 31 154 -123.08 gain 154 31 -126.99 gain 31 155 -126.32 gain 155 31 -130.12 gain 31 156 -122.67 gain 156 31 -120.86 gain 31 157 -121.28 gain 157 31 -122.42 gain 31 158 -122.63 gain 158 31 -126.36 gain 31 159 -127.17 gain 159 31 -127.52 gain 31 160 -118.84 gain 160 31 -116.30 gain 31 161 -123.27 gain 161 31 -124.22 gain 31 162 -126.92 gain 162 31 -126.74 gain 31 163 -125.06 gain 163 31 -127.03 gain 31 164 -121.62 gain 164 31 -124.63 gain 31 165 -117.98 gain 165 31 -117.03 gain 31 166 -122.54 gain 166 31 -123.16 gain 31 167 -126.79 gain 167 31 -129.50 gain 31 168 -124.82 gain 168 31 -125.98 gain 31 169 -116.62 gain 169 31 -121.97 gain 31 170 -125.74 gain 170 31 -122.62 gain 31 171 -118.18 gain 171 31 -120.08 gain 31 172 -128.38 gain 172 31 -124.99 gain 31 173 -129.12 gain 173 31 -125.16 gain 31 174 -121.65 gain 174 31 -121.98 gain 31 175 -135.52 gain 175 31 -139.41 gain 31 176 -124.33 gain 176 31 -120.23 gain 31 177 -127.45 gain 177 31 -131.17 gain 31 178 -130.26 gain 178 31 -129.80 gain 31 179 -125.57 gain 179 31 -123.50 gain 31 180 -126.86 gain 180 31 -126.26 gain 31 181 -121.54 gain 181 31 -121.01 gain 31 182 -124.33 gain 182 31 -126.18 gain 31 183 -124.77 gain 183 31 -120.02 gain 31 184 -123.19 gain 184 31 -123.21 gain 31 185 -119.67 gain 185 31 -117.18 gain 31 186 -125.56 gain 186 31 -123.35 gain 31 187 -130.46 gain 187 31 -130.80 gain 31 188 -125.51 gain 188 31 -129.10 gain 31 189 -128.71 gain 189 31 -129.82 gain 31 190 -124.81 gain 190 31 -122.93 gain 31 191 -125.09 gain 191 31 -124.30 gain 31 192 -133.47 gain 192 31 -135.54 gain 31 193 -133.64 gain 193 31 -136.97 gain 31 194 -139.34 gain 194 31 -136.48 gain 31 195 -117.11 gain 195 31 -114.89 gain 31 196 -117.62 gain 196 31 -119.44 gain 31 197 -132.51 gain 197 31 -130.39 gain 31 198 -123.89 gain 198 31 -121.29 gain 31 199 -118.59 gain 199 31 -119.91 gain 31 200 -125.20 gain 200 31 -123.45 gain 31 201 -123.08 gain 201 31 -122.14 gain 31 202 -124.37 gain 202 31 -127.42 gain 31 203 -127.81 gain 203 31 -130.49 gain 31 204 -127.42 gain 204 31 -127.38 gain 31 205 -128.29 gain 205 31 -127.33 gain 31 206 -127.19 gain 206 31 -130.75 gain 31 207 -135.43 gain 207 31 -131.35 gain 31 208 -130.70 gain 208 31 -132.40 gain 31 209 -126.69 gain 209 31 -129.37 gain 31 210 -127.53 gain 210 31 -127.15 gain 31 211 -126.18 gain 211 31 -127.82 gain 31 212 -125.30 gain 212 31 -125.49 gain 31 213 -124.13 gain 213 31 -123.51 gain 31 214 -130.27 gain 214 31 -129.54 gain 31 215 -132.80 gain 215 31 -128.49 gain 31 216 -120.98 gain 216 31 -121.33 gain 31 217 -128.14 gain 217 31 -129.00 gain 31 218 -129.22 gain 218 31 -132.28 gain 31 219 -129.85 gain 219 31 -124.26 gain 31 220 -131.36 gain 220 31 -136.26 gain 31 221 -132.74 gain 221 31 -133.28 gain 31 222 -127.08 gain 222 31 -127.95 gain 31 223 -128.17 gain 223 31 -127.65 gain 31 224 -132.48 gain 224 31 -134.66 gain 32 33 -94.74 gain 33 32 -96.99 gain 32 34 -107.48 gain 34 32 -108.33 gain 32 35 -103.73 gain 35 32 -104.41 gain 32 36 -105.50 gain 36 32 -109.96 gain 32 37 -112.31 gain 37 32 -108.97 gain 32 38 -115.68 gain 38 32 -118.36 gain 32 39 -128.21 gain 39 32 -129.76 gain 32 40 -122.94 gain 40 32 -126.53 gain 32 41 -121.47 gain 41 32 -120.69 gain 32 42 -126.85 gain 42 32 -124.23 gain 32 43 -128.56 gain 43 32 -129.82 gain 32 44 -115.53 gain 44 32 -119.85 gain 32 45 -104.47 gain 45 32 -107.27 gain 32 46 -97.80 gain 46 32 -96.39 gain 32 47 -93.09 gain 47 32 -92.74 gain 32 48 -94.83 gain 48 32 -92.27 gain 32 49 -93.77 gain 49 32 -99.19 gain 32 50 -111.50 gain 50 32 -117.88 gain 32 51 -105.64 gain 51 32 -107.15 gain 32 52 -109.99 gain 52 32 -107.53 gain 32 53 -110.05 gain 53 32 -108.60 gain 32 54 -118.86 gain 54 32 -118.11 gain 32 55 -115.65 gain 55 32 -114.20 gain 32 56 -122.64 gain 56 32 -128.51 gain 32 57 -121.79 gain 57 32 -121.54 gain 32 58 -125.59 gain 58 32 -128.08 gain 32 59 -123.36 gain 59 32 -121.97 gain 32 60 -106.39 gain 60 32 -106.33 gain 32 61 -101.03 gain 61 32 -99.72 gain 32 62 -102.89 gain 62 32 -106.79 gain 32 63 -98.94 gain 63 32 -96.08 gain 32 64 -110.93 gain 64 32 -111.03 gain 32 65 -105.92 gain 65 32 -108.12 gain 32 66 -114.53 gain 66 32 -110.98 gain 32 67 -109.69 gain 67 32 -108.42 gain 32 68 -119.90 gain 68 32 -123.18 gain 32 69 -122.57 gain 69 32 -123.15 gain 32 70 -120.34 gain 70 32 -120.67 gain 32 71 -125.21 gain 71 32 -123.65 gain 32 72 -118.50 gain 72 32 -117.35 gain 32 73 -126.08 gain 73 32 -123.33 gain 32 74 -122.80 gain 74 32 -123.92 gain 32 75 -105.66 gain 75 32 -106.93 gain 32 76 -111.97 gain 76 32 -109.19 gain 32 77 -109.17 gain 77 32 -110.05 gain 32 78 -105.23 gain 78 32 -108.96 gain 32 79 -111.83 gain 79 32 -110.34 gain 32 80 -114.09 gain 80 32 -113.10 gain 32 81 -115.89 gain 81 32 -115.49 gain 32 82 -116.83 gain 82 32 -114.06 gain 32 83 -117.96 gain 83 32 -116.22 gain 32 84 -121.19 gain 84 32 -119.60 gain 32 85 -121.29 gain 85 32 -116.51 gain 32 86 -127.15 gain 86 32 -125.75 gain 32 87 -118.77 gain 87 32 -121.33 gain 32 88 -127.50 gain 88 32 -127.82 gain 32 89 -122.76 gain 89 32 -121.67 gain 32 90 -114.41 gain 90 32 -110.33 gain 32 91 -115.90 gain 91 32 -115.76 gain 32 92 -115.59 gain 92 32 -112.42 gain 32 93 -117.19 gain 93 32 -118.80 gain 32 94 -109.24 gain 94 32 -110.73 gain 32 95 -111.70 gain 95 32 -115.45 gain 32 96 -116.75 gain 96 32 -117.84 gain 32 97 -121.09 gain 97 32 -120.92 gain 32 98 -113.15 gain 98 32 -113.77 gain 32 99 -119.11 gain 99 32 -117.55 gain 32 100 -125.10 gain 100 32 -123.11 gain 32 101 -124.51 gain 101 32 -122.68 gain 32 102 -128.82 gain 102 32 -127.77 gain 32 103 -126.98 gain 103 32 -123.41 gain 32 104 -127.49 gain 104 32 -129.31 gain 32 105 -113.18 gain 105 32 -110.93 gain 32 106 -113.55 gain 106 32 -112.39 gain 32 107 -115.72 gain 107 32 -121.12 gain 32 108 -116.43 gain 108 32 -114.16 gain 32 109 -109.34 gain 109 32 -110.56 gain 32 110 -111.41 gain 110 32 -111.10 gain 32 111 -119.46 gain 111 32 -118.82 gain 32 112 -126.37 gain 112 32 -124.61 gain 32 113 -118.68 gain 113 32 -115.73 gain 32 114 -126.61 gain 114 32 -126.96 gain 32 115 -118.49 gain 115 32 -113.14 gain 32 116 -118.62 gain 116 32 -120.82 gain 32 117 -130.93 gain 117 32 -134.63 gain 32 118 -128.42 gain 118 32 -130.44 gain 32 119 -127.67 gain 119 32 -124.35 gain 32 120 -119.26 gain 120 32 -120.45 gain 32 121 -117.16 gain 121 32 -117.65 gain 32 122 -120.60 gain 122 32 -123.19 gain 32 123 -120.69 gain 123 32 -124.06 gain 32 124 -116.42 gain 124 32 -116.20 gain 32 125 -120.48 gain 125 32 -121.60 gain 32 126 -117.18 gain 126 32 -116.26 gain 32 127 -121.13 gain 127 32 -123.66 gain 32 128 -122.66 gain 128 32 -123.14 gain 32 129 -123.89 gain 129 32 -122.28 gain 32 130 -118.56 gain 130 32 -114.77 gain 32 131 -127.44 gain 131 32 -130.73 gain 32 132 -124.69 gain 132 32 -127.61 gain 32 133 -125.11 gain 133 32 -126.10 gain 32 134 -124.62 gain 134 32 -122.31 gain 32 135 -124.60 gain 135 32 -125.86 gain 32 136 -123.58 gain 136 32 -125.45 gain 32 137 -118.16 gain 137 32 -117.52 gain 32 138 -115.51 gain 138 32 -113.86 gain 32 139 -121.25 gain 139 32 -120.59 gain 32 140 -124.14 gain 140 32 -126.09 gain 32 141 -122.07 gain 141 32 -122.69 gain 32 142 -119.82 gain 142 32 -119.74 gain 32 143 -118.16 gain 143 32 -117.70 gain 32 144 -120.67 gain 144 32 -121.23 gain 32 145 -126.95 gain 145 32 -125.96 gain 32 146 -127.59 gain 146 32 -125.51 gain 32 147 -126.53 gain 147 32 -121.54 gain 32 148 -126.91 gain 148 32 -121.64 gain 32 149 -128.93 gain 149 32 -126.82 gain 32 150 -118.39 gain 150 32 -118.97 gain 32 151 -123.56 gain 151 32 -124.33 gain 32 152 -126.89 gain 152 32 -124.65 gain 32 153 -118.39 gain 153 32 -113.72 gain 32 154 -123.72 gain 154 32 -127.60 gain 32 155 -125.40 gain 155 32 -129.17 gain 32 156 -119.77 gain 156 32 -117.94 gain 32 157 -119.60 gain 157 32 -120.71 gain 32 158 -119.91 gain 158 32 -123.61 gain 32 159 -123.00 gain 159 32 -123.32 gain 32 160 -120.45 gain 160 32 -117.89 gain 32 161 -119.95 gain 161 32 -120.88 gain 32 162 -121.50 gain 162 32 -121.29 gain 32 163 -126.48 gain 163 32 -128.42 gain 32 164 -124.92 gain 164 32 -127.89 gain 32 165 -124.19 gain 165 32 -123.21 gain 32 166 -124.10 gain 166 32 -124.69 gain 32 167 -117.67 gain 167 32 -120.35 gain 32 168 -122.00 gain 168 32 -123.13 gain 32 169 -122.59 gain 169 32 -127.92 gain 32 170 -127.29 gain 170 32 -124.14 gain 32 171 -124.40 gain 171 32 -126.28 gain 32 172 -120.76 gain 172 32 -117.33 gain 32 173 -120.46 gain 173 32 -116.46 gain 32 174 -128.32 gain 174 32 -128.62 gain 32 175 -124.98 gain 175 32 -128.84 gain 32 176 -125.73 gain 176 32 -121.61 gain 32 177 -122.85 gain 177 32 -126.53 gain 32 178 -127.90 gain 178 32 -127.41 gain 32 179 -126.52 gain 179 32 -124.42 gain 32 180 -121.83 gain 180 32 -121.20 gain 32 181 -120.49 gain 181 32 -119.93 gain 32 182 -125.00 gain 182 32 -126.82 gain 32 183 -123.88 gain 183 32 -119.09 gain 32 184 -128.58 gain 184 32 -128.57 gain 32 185 -124.86 gain 185 32 -122.34 gain 32 186 -124.51 gain 186 32 -122.27 gain 32 187 -124.14 gain 187 32 -124.45 gain 32 188 -131.15 gain 188 32 -134.71 gain 32 189 -120.02 gain 189 32 -121.10 gain 32 190 -133.59 gain 190 32 -131.67 gain 32 191 -125.99 gain 191 32 -125.17 gain 32 192 -131.09 gain 192 32 -133.14 gain 32 193 -122.85 gain 193 32 -126.15 gain 32 194 -127.53 gain 194 32 -124.64 gain 32 195 -125.80 gain 195 32 -123.55 gain 32 196 -119.61 gain 196 32 -121.40 gain 32 197 -129.61 gain 197 32 -127.45 gain 32 198 -126.27 gain 198 32 -123.63 gain 32 199 -124.16 gain 199 32 -125.44 gain 32 200 -120.02 gain 200 32 -118.24 gain 32 201 -129.25 gain 201 32 -128.27 gain 32 202 -127.59 gain 202 32 -130.62 gain 32 203 -131.39 gain 203 32 -134.04 gain 32 204 -127.09 gain 204 32 -127.03 gain 32 205 -129.00 gain 205 32 -128.01 gain 32 206 -128.73 gain 206 32 -132.26 gain 32 207 -131.91 gain 207 32 -127.80 gain 32 208 -125.43 gain 208 32 -127.09 gain 32 209 -123.31 gain 209 32 -125.97 gain 32 210 -126.91 gain 210 32 -126.51 gain 32 211 -129.81 gain 211 32 -131.42 gain 32 212 -120.01 gain 212 32 -120.16 gain 32 213 -128.78 gain 213 32 -128.13 gain 32 214 -124.84 gain 214 32 -124.08 gain 32 215 -129.77 gain 215 32 -125.43 gain 32 216 -132.02 gain 216 32 -132.33 gain 32 217 -132.06 gain 217 32 -132.89 gain 32 218 -121.52 gain 218 32 -124.55 gain 32 219 -133.70 gain 219 32 -128.08 gain 32 220 -133.64 gain 220 32 -138.51 gain 32 221 -129.00 gain 221 32 -129.51 gain 32 222 -135.17 gain 222 32 -136.01 gain 32 223 -136.44 gain 223 32 -135.90 gain 32 224 -138.95 gain 224 32 -141.10 gain 33 34 -86.89 gain 34 33 -85.49 gain 33 35 -110.65 gain 35 33 -109.08 gain 33 36 -103.84 gain 36 33 -106.05 gain 33 37 -121.82 gain 37 33 -116.23 gain 33 38 -117.36 gain 38 33 -117.79 gain 33 39 -116.28 gain 39 33 -115.58 gain 33 40 -119.05 gain 40 33 -120.39 gain 33 41 -131.25 gain 41 33 -128.22 gain 33 42 -121.72 gain 42 33 -116.84 gain 33 43 -124.20 gain 43 33 -123.21 gain 33 44 -134.27 gain 44 33 -136.34 gain 33 45 -110.53 gain 45 33 -111.08 gain 33 46 -102.33 gain 46 33 -98.67 gain 33 47 -102.04 gain 47 33 -99.44 gain 33 48 -98.50 gain 48 33 -93.69 gain 33 49 -93.88 gain 49 33 -97.04 gain 33 50 -105.42 gain 50 33 -109.54 gain 33 51 -111.45 gain 51 33 -110.72 gain 33 52 -114.93 gain 52 33 -110.22 gain 33 53 -121.05 gain 53 33 -117.35 gain 33 54 -116.97 gain 54 33 -113.97 gain 33 55 -115.05 gain 55 33 -111.34 gain 33 56 -131.15 gain 56 33 -134.78 gain 33 57 -116.23 gain 57 33 -113.73 gain 33 58 -122.26 gain 58 33 -122.50 gain 33 59 -127.24 gain 59 33 -123.61 gain 33 60 -115.56 gain 60 33 -113.25 gain 33 61 -118.61 gain 61 33 -115.05 gain 33 62 -103.45 gain 62 33 -105.11 gain 33 63 -112.50 gain 63 33 -107.38 gain 33 64 -111.09 gain 64 33 -108.95 gain 33 65 -103.79 gain 65 33 -103.74 gain 33 66 -112.37 gain 66 33 -106.57 gain 33 67 -116.95 gain 67 33 -113.42 gain 33 68 -120.90 gain 68 33 -121.93 gain 33 69 -122.23 gain 69 33 -120.56 gain 33 70 -125.19 gain 70 33 -123.27 gain 33 71 -122.01 gain 71 33 -118.20 gain 33 72 -126.67 gain 72 33 -123.27 gain 33 73 -125.11 gain 73 33 -120.11 gain 33 74 -123.64 gain 74 33 -122.52 gain 33 75 -119.18 gain 75 33 -118.19 gain 33 76 -110.62 gain 76 33 -105.58 gain 33 77 -115.09 gain 77 33 -113.72 gain 33 78 -114.99 gain 78 33 -116.46 gain 33 79 -110.34 gain 79 33 -106.60 gain 33 80 -112.03 gain 80 33 -108.79 gain 33 81 -111.71 gain 81 33 -109.06 gain 33 82 -123.25 gain 82 33 -118.23 gain 33 83 -109.98 gain 83 33 -105.99 gain 33 84 -120.25 gain 84 33 -116.41 gain 33 85 -128.51 gain 85 33 -121.48 gain 33 86 -125.89 gain 86 33 -122.24 gain 33 87 -135.01 gain 87 33 -135.32 gain 33 88 -120.25 gain 88 33 -118.31 gain 33 89 -121.83 gain 89 33 -118.49 gain 33 90 -113.19 gain 90 33 -106.87 gain 33 91 -110.87 gain 91 33 -108.49 gain 33 92 -120.25 gain 92 33 -114.83 gain 33 93 -113.85 gain 93 33 -113.22 gain 33 94 -115.89 gain 94 33 -115.13 gain 33 95 -114.44 gain 95 33 -115.94 gain 33 96 -118.33 gain 96 33 -117.16 gain 33 97 -120.20 gain 97 33 -117.78 gain 33 98 -121.65 gain 98 33 -120.03 gain 33 99 -122.65 gain 99 33 -118.85 gain 33 100 -119.70 gain 100 33 -115.46 gain 33 101 -127.81 gain 101 33 -123.74 gain 33 102 -131.32 gain 102 33 -128.02 gain 33 103 -124.61 gain 103 33 -118.80 gain 33 104 -133.76 gain 104 33 -133.32 gain 33 105 -115.56 gain 105 33 -111.06 gain 33 106 -122.12 gain 106 33 -118.71 gain 33 107 -114.09 gain 107 33 -117.25 gain 33 108 -119.55 gain 108 33 -115.02 gain 33 109 -119.19 gain 109 33 -118.15 gain 33 110 -122.28 gain 110 33 -119.71 gain 33 111 -112.00 gain 111 33 -109.11 gain 33 112 -116.03 gain 112 33 -112.02 gain 33 113 -122.00 gain 113 33 -116.79 gain 33 114 -126.75 gain 114 33 -124.85 gain 33 115 -120.63 gain 115 33 -113.03 gain 33 116 -121.16 gain 116 33 -121.11 gain 33 117 -127.85 gain 117 33 -129.30 gain 33 118 -127.54 gain 118 33 -127.31 gain 33 119 -120.41 gain 119 33 -114.84 gain 33 120 -124.72 gain 120 33 -123.66 gain 33 121 -122.53 gain 121 33 -120.76 gain 33 122 -115.06 gain 122 33 -115.41 gain 33 123 -119.58 gain 123 33 -120.70 gain 33 124 -127.40 gain 124 33 -124.93 gain 33 125 -120.72 gain 125 33 -119.59 gain 33 126 -121.59 gain 126 33 -118.42 gain 33 127 -125.75 gain 127 33 -126.04 gain 33 128 -130.34 gain 128 33 -128.56 gain 33 129 -126.19 gain 129 33 -122.32 gain 33 130 -124.75 gain 130 33 -118.71 gain 33 131 -125.43 gain 131 33 -126.47 gain 33 132 -127.32 gain 132 33 -127.99 gain 33 133 -124.10 gain 133 33 -122.84 gain 33 134 -134.32 gain 134 33 -129.77 gain 33 135 -120.88 gain 135 33 -119.89 gain 33 136 -122.27 gain 136 33 -121.89 gain 33 137 -125.46 gain 137 33 -122.56 gain 33 138 -116.83 gain 138 33 -112.93 gain 33 139 -119.57 gain 139 33 -116.66 gain 33 140 -122.45 gain 140 33 -122.15 gain 33 141 -117.42 gain 141 33 -115.79 gain 33 142 -119.90 gain 142 33 -117.58 gain 33 143 -128.40 gain 143 33 -125.70 gain 33 144 -124.04 gain 144 33 -122.35 gain 33 145 -119.75 gain 145 33 -116.51 gain 33 146 -128.13 gain 146 33 -123.80 gain 33 147 -127.83 gain 147 33 -120.58 gain 33 148 -124.45 gain 148 33 -116.93 gain 33 149 -125.65 gain 149 33 -121.29 gain 33 150 -121.70 gain 150 33 -120.03 gain 33 151 -126.54 gain 151 33 -125.07 gain 33 152 -115.61 gain 152 33 -111.11 gain 33 153 -125.04 gain 153 33 -118.12 gain 33 154 -125.12 gain 154 33 -126.74 gain 33 155 -121.22 gain 155 33 -122.74 gain 33 156 -114.23 gain 156 33 -110.14 gain 33 157 -129.57 gain 157 33 -128.42 gain 33 158 -124.98 gain 158 33 -126.44 gain 33 159 -123.34 gain 159 33 -121.41 gain 33 160 -128.45 gain 160 33 -123.63 gain 33 161 -129.16 gain 161 33 -127.84 gain 33 162 -133.69 gain 162 33 -131.22 gain 33 163 -124.91 gain 163 33 -124.59 gain 33 164 -121.92 gain 164 33 -122.65 gain 33 165 -131.79 gain 165 33 -128.55 gain 33 166 -126.50 gain 166 33 -124.84 gain 33 167 -126.56 gain 167 33 -126.99 gain 33 168 -131.47 gain 168 33 -130.35 gain 33 169 -125.43 gain 169 33 -128.50 gain 33 170 -124.77 gain 170 33 -119.37 gain 33 171 -122.46 gain 171 33 -122.09 gain 33 172 -121.06 gain 172 33 -115.39 gain 33 173 -132.99 gain 173 33 -126.74 gain 33 174 -121.36 gain 174 33 -119.42 gain 33 175 -133.24 gain 175 33 -134.85 gain 33 176 -130.29 gain 176 33 -123.91 gain 33 177 -126.22 gain 177 33 -127.65 gain 33 178 -129.21 gain 178 33 -126.47 gain 33 179 -138.33 gain 179 33 -133.98 gain 33 180 -124.29 gain 180 33 -121.41 gain 33 181 -118.45 gain 181 33 -115.64 gain 33 182 -128.50 gain 182 33 -128.07 gain 33 183 -122.56 gain 183 33 -115.52 gain 33 184 -133.85 gain 184 33 -131.59 gain 33 185 -128.36 gain 185 33 -123.59 gain 33 186 -119.24 gain 186 33 -114.75 gain 33 187 -123.56 gain 187 33 -121.61 gain 33 188 -120.83 gain 188 33 -122.14 gain 33 189 -126.86 gain 189 33 -125.69 gain 33 190 -128.73 gain 190 33 -124.57 gain 33 191 -128.20 gain 191 33 -125.13 gain 33 192 -128.39 gain 192 33 -128.19 gain 33 193 -129.99 gain 193 33 -131.04 gain 33 194 -126.42 gain 194 33 -121.28 gain 33 195 -128.01 gain 195 33 -123.51 gain 33 196 -128.94 gain 196 33 -128.47 gain 33 197 -125.02 gain 197 33 -120.61 gain 33 198 -127.58 gain 198 33 -122.70 gain 33 199 -124.70 gain 199 33 -123.73 gain 33 200 -132.83 gain 200 33 -128.80 gain 33 201 -128.05 gain 201 33 -124.83 gain 33 202 -134.29 gain 202 33 -135.07 gain 33 203 -123.07 gain 203 33 -123.47 gain 33 204 -128.42 gain 204 33 -126.10 gain 33 205 -133.58 gain 205 33 -130.33 gain 33 206 -128.41 gain 206 33 -129.68 gain 33 207 -128.89 gain 207 33 -122.52 gain 33 208 -123.26 gain 208 33 -122.67 gain 33 209 -128.02 gain 209 33 -128.43 gain 33 210 -129.54 gain 210 33 -126.88 gain 33 211 -131.22 gain 211 33 -130.58 gain 33 212 -129.06 gain 212 33 -126.96 gain 33 213 -132.75 gain 213 33 -129.85 gain 33 214 -122.32 gain 214 33 -119.31 gain 33 215 -122.57 gain 215 33 -115.97 gain 33 216 -121.64 gain 216 33 -119.70 gain 33 217 -135.07 gain 217 33 -133.65 gain 33 218 -134.14 gain 218 33 -134.91 gain 33 219 -136.00 gain 219 33 -128.13 gain 33 220 -129.80 gain 220 33 -132.43 gain 33 221 -137.01 gain 221 33 -135.28 gain 33 222 -125.70 gain 222 33 -124.29 gain 33 223 -135.75 gain 223 33 -132.95 gain 33 224 -135.92 gain 224 33 -135.81 gain 34 35 -87.55 gain 35 34 -87.38 gain 34 36 -98.34 gain 36 34 -101.94 gain 34 37 -103.67 gain 37 34 -99.47 gain 34 38 -113.09 gain 38 34 -114.92 gain 34 39 -112.68 gain 39 34 -113.38 gain 34 40 -119.16 gain 40 34 -121.90 gain 34 41 -119.12 gain 41 34 -117.49 gain 34 42 -115.91 gain 42 34 -112.43 gain 34 43 -117.11 gain 43 34 -117.52 gain 34 44 -128.31 gain 44 34 -131.77 gain 34 45 -117.18 gain 45 34 -119.12 gain 34 46 -111.73 gain 46 34 -109.46 gain 34 47 -99.32 gain 47 34 -98.12 gain 34 48 -96.54 gain 48 34 -93.12 gain 34 49 -98.05 gain 49 34 -102.61 gain 34 50 -100.29 gain 50 34 -105.81 gain 34 51 -94.92 gain 51 34 -95.58 gain 34 52 -108.28 gain 52 34 -104.96 gain 34 53 -114.93 gain 53 34 -112.62 gain 34 54 -116.64 gain 54 34 -115.04 gain 34 55 -117.52 gain 55 34 -115.22 gain 34 56 -117.13 gain 56 34 -122.15 gain 34 57 -119.35 gain 57 34 -118.24 gain 34 58 -118.83 gain 58 34 -120.46 gain 34 59 -123.09 gain 59 34 -120.85 gain 34 60 -116.99 gain 60 34 -116.07 gain 34 61 -116.01 gain 61 34 -113.84 gain 34 62 -108.99 gain 62 34 -112.04 gain 34 63 -105.20 gain 63 34 -101.48 gain 34 64 -100.58 gain 64 34 -99.83 gain 34 65 -108.58 gain 65 34 -109.92 gain 34 66 -106.65 gain 66 34 -102.24 gain 34 67 -114.76 gain 67 34 -112.63 gain 34 68 -116.13 gain 68 34 -118.56 gain 34 69 -120.23 gain 69 34 -119.96 gain 34 70 -118.50 gain 70 34 -117.98 gain 34 71 -118.64 gain 71 34 -116.23 gain 34 72 -123.91 gain 72 34 -121.91 gain 34 73 -124.51 gain 73 34 -120.91 gain 34 74 -125.07 gain 74 34 -125.34 gain 34 75 -114.02 gain 75 34 -114.43 gain 34 76 -116.09 gain 76 34 -112.45 gain 34 77 -107.01 gain 77 34 -107.03 gain 34 78 -106.82 gain 78 34 -109.69 gain 34 79 -104.53 gain 79 34 -102.19 gain 34 80 -105.64 gain 80 34 -103.80 gain 34 81 -112.76 gain 81 34 -111.51 gain 34 82 -106.43 gain 82 34 -102.80 gain 34 83 -120.00 gain 83 34 -117.41 gain 34 84 -118.17 gain 84 34 -115.73 gain 34 85 -122.60 gain 85 34 -116.96 gain 34 86 -118.23 gain 86 34 -115.97 gain 34 87 -118.24 gain 87 34 -119.95 gain 34 88 -125.30 gain 88 34 -124.76 gain 34 89 -130.95 gain 89 34 -129.01 gain 34 90 -115.23 gain 90 34 -110.30 gain 34 91 -117.00 gain 91 34 -116.02 gain 34 92 -115.04 gain 92 34 -111.02 gain 34 93 -111.08 gain 93 34 -111.84 gain 34 94 -112.64 gain 94 34 -113.28 gain 34 95 -113.59 gain 95 34 -116.48 gain 34 96 -111.04 gain 96 34 -111.26 gain 34 97 -111.63 gain 97 34 -110.60 gain 34 98 -117.03 gain 98 34 -116.80 gain 34 99 -121.03 gain 99 34 -118.62 gain 34 100 -121.56 gain 100 34 -118.72 gain 34 101 -126.18 gain 101 34 -123.50 gain 34 102 -122.00 gain 102 34 -120.10 gain 34 103 -127.93 gain 103 34 -123.51 gain 34 104 -126.69 gain 104 34 -127.65 gain 34 105 -123.53 gain 105 34 -120.44 gain 34 106 -120.82 gain 106 34 -118.80 gain 34 107 -121.42 gain 107 34 -125.97 gain 34 108 -119.37 gain 108 34 -116.24 gain 34 109 -117.45 gain 109 34 -117.81 gain 34 110 -112.73 gain 110 34 -111.56 gain 34 111 -119.81 gain 111 34 -118.31 gain 34 112 -118.12 gain 112 34 -115.51 gain 34 113 -110.28 gain 113 34 -106.47 gain 34 114 -121.18 gain 114 34 -120.67 gain 34 115 -122.81 gain 115 34 -116.60 gain 34 116 -127.24 gain 116 34 -128.58 gain 34 117 -127.40 gain 117 34 -130.24 gain 34 118 -125.90 gain 118 34 -127.06 gain 34 119 -126.94 gain 119 34 -122.77 gain 34 120 -122.64 gain 120 34 -122.98 gain 34 121 -126.69 gain 121 34 -126.32 gain 34 122 -113.91 gain 122 34 -115.65 gain 34 123 -114.25 gain 123 34 -116.77 gain 34 124 -120.44 gain 124 34 -119.37 gain 34 125 -119.29 gain 125 34 -119.55 gain 34 126 -113.39 gain 126 34 -111.61 gain 34 127 -116.22 gain 127 34 -117.90 gain 34 128 -123.07 gain 128 34 -122.69 gain 34 129 -122.43 gain 129 34 -119.95 gain 34 130 -114.80 gain 130 34 -110.15 gain 34 131 -133.24 gain 131 34 -135.68 gain 34 132 -127.45 gain 132 34 -129.51 gain 34 133 -121.92 gain 133 34 -122.05 gain 34 134 -122.06 gain 134 34 -118.90 gain 34 135 -122.39 gain 135 34 -122.79 gain 34 136 -118.47 gain 136 34 -119.49 gain 34 137 -120.96 gain 137 34 -119.46 gain 34 138 -125.35 gain 138 34 -122.85 gain 34 139 -120.66 gain 139 34 -119.15 gain 34 140 -121.31 gain 140 34 -122.40 gain 34 141 -121.96 gain 141 34 -121.73 gain 34 142 -114.02 gain 142 34 -113.09 gain 34 143 -116.67 gain 143 34 -115.36 gain 34 144 -115.11 gain 144 34 -114.81 gain 34 145 -123.27 gain 145 34 -121.43 gain 34 146 -118.71 gain 146 34 -115.77 gain 34 147 -128.93 gain 147 34 -123.09 gain 34 148 -123.01 gain 148 34 -116.88 gain 34 149 -131.27 gain 149 34 -128.31 gain 34 150 -125.77 gain 150 34 -125.49 gain 34 151 -125.95 gain 151 34 -125.88 gain 34 152 -110.29 gain 152 34 -107.19 gain 34 153 -124.85 gain 153 34 -119.32 gain 34 154 -123.01 gain 154 34 -126.04 gain 34 155 -123.07 gain 155 34 -125.99 gain 34 156 -121.55 gain 156 34 -118.86 gain 34 157 -119.47 gain 157 34 -119.72 gain 34 158 -125.23 gain 158 34 -128.07 gain 34 159 -116.48 gain 159 34 -115.95 gain 34 160 -122.61 gain 160 34 -119.18 gain 34 161 -130.61 gain 161 34 -130.67 gain 34 162 -123.40 gain 162 34 -122.34 gain 34 163 -118.13 gain 163 34 -119.22 gain 34 164 -127.68 gain 164 34 -129.81 gain 34 165 -118.87 gain 165 34 -117.03 gain 34 166 -121.45 gain 166 34 -121.18 gain 34 167 -112.90 gain 167 34 -114.72 gain 34 168 -119.75 gain 168 34 -120.03 gain 34 169 -128.52 gain 169 34 -132.99 gain 34 170 -128.25 gain 170 34 -124.25 gain 34 171 -121.10 gain 171 34 -122.13 gain 34 172 -123.77 gain 172 34 -119.48 gain 34 173 -121.14 gain 173 34 -116.29 gain 34 174 -125.37 gain 174 34 -124.82 gain 34 175 -127.45 gain 175 34 -130.45 gain 34 176 -129.92 gain 176 34 -124.94 gain 34 177 -131.46 gain 177 34 -134.29 gain 34 178 -126.41 gain 178 34 -125.06 gain 34 179 -128.16 gain 179 34 -125.20 gain 34 180 -122.95 gain 180 34 -121.46 gain 34 181 -121.56 gain 181 34 -120.14 gain 34 182 -126.08 gain 182 34 -127.05 gain 34 183 -123.82 gain 183 34 -118.17 gain 34 184 -118.74 gain 184 34 -117.88 gain 34 185 -135.90 gain 185 34 -132.52 gain 34 186 -122.24 gain 186 34 -119.15 gain 34 187 -120.62 gain 187 34 -120.07 gain 34 188 -120.81 gain 188 34 -123.52 gain 34 189 -128.38 gain 189 34 -128.60 gain 34 190 -123.98 gain 190 34 -121.21 gain 34 191 -126.52 gain 191 34 -124.85 gain 34 192 -129.32 gain 192 34 -130.51 gain 34 193 -116.30 gain 193 34 -118.74 gain 34 194 -131.27 gain 194 34 -127.52 gain 34 195 -124.74 gain 195 34 -121.63 gain 34 196 -128.79 gain 196 34 -129.72 gain 34 197 -131.61 gain 197 34 -128.60 gain 34 198 -131.85 gain 198 34 -128.36 gain 34 199 -129.34 gain 199 34 -129.77 gain 34 200 -129.55 gain 200 34 -126.91 gain 34 201 -124.29 gain 201 34 -122.46 gain 34 202 -125.49 gain 202 34 -127.66 gain 34 203 -127.25 gain 203 34 -129.05 gain 34 204 -132.36 gain 204 34 -131.44 gain 34 205 -124.83 gain 205 34 -122.98 gain 34 206 -127.62 gain 206 34 -130.29 gain 34 207 -133.02 gain 207 34 -128.06 gain 34 208 -126.79 gain 208 34 -127.60 gain 34 209 -126.82 gain 209 34 -128.62 gain 34 210 -123.19 gain 210 34 -121.93 gain 34 211 -127.76 gain 211 34 -128.52 gain 34 212 -134.10 gain 212 34 -133.40 gain 34 213 -127.06 gain 213 34 -125.56 gain 34 214 -130.98 gain 214 34 -129.36 gain 34 215 -125.79 gain 215 34 -120.59 gain 34 216 -129.32 gain 216 34 -128.78 gain 34 217 -120.35 gain 217 34 -120.33 gain 34 218 -128.68 gain 218 34 -130.85 gain 34 219 -125.52 gain 219 34 -119.05 gain 34 220 -125.48 gain 220 34 -129.50 gain 34 221 -126.02 gain 221 34 -125.68 gain 34 222 -131.57 gain 222 34 -131.56 gain 34 223 -121.13 gain 223 34 -119.73 gain 34 224 -121.39 gain 224 34 -122.68 gain 35 36 -97.32 gain 36 35 -101.10 gain 35 37 -105.27 gain 37 35 -101.25 gain 35 38 -107.35 gain 38 35 -109.35 gain 35 39 -104.58 gain 39 35 -105.45 gain 35 40 -116.17 gain 40 35 -119.09 gain 35 41 -119.28 gain 41 35 -117.82 gain 35 42 -117.24 gain 42 35 -113.93 gain 35 43 -119.95 gain 43 35 -120.53 gain 35 44 -134.50 gain 44 35 -138.14 gain 35 45 -118.77 gain 45 35 -120.89 gain 35 46 -117.72 gain 46 35 -115.63 gain 35 47 -110.98 gain 47 35 -109.95 gain 35 48 -106.75 gain 48 35 -103.51 gain 35 49 -94.99 gain 49 35 -99.72 gain 35 50 -90.77 gain 50 35 -96.46 gain 35 51 -97.59 gain 51 35 -98.43 gain 35 52 -109.78 gain 52 35 -106.63 gain 35 53 -107.89 gain 53 35 -105.76 gain 35 54 -104.93 gain 54 35 -103.50 gain 35 55 -114.88 gain 55 35 -112.75 gain 35 56 -115.43 gain 56 35 -120.63 gain 35 57 -123.93 gain 57 35 -123.00 gain 35 58 -116.02 gain 58 35 -117.83 gain 35 59 -127.94 gain 59 35 -125.88 gain 35 60 -112.52 gain 60 35 -111.78 gain 35 61 -112.74 gain 61 35 -110.74 gain 35 62 -118.36 gain 62 35 -121.59 gain 35 63 -109.75 gain 63 35 -106.20 gain 35 64 -104.68 gain 64 35 -104.11 gain 35 65 -102.98 gain 65 35 -104.50 gain 35 66 -105.12 gain 66 35 -100.89 gain 35 67 -100.92 gain 67 35 -98.96 gain 35 68 -111.93 gain 68 35 -114.53 gain 35 69 -113.50 gain 69 35 -113.39 gain 35 70 -117.61 gain 70 35 -117.27 gain 35 71 -119.41 gain 71 35 -117.17 gain 35 72 -124.52 gain 72 35 -122.70 gain 35 73 -122.59 gain 73 35 -119.15 gain 35 74 -126.82 gain 74 35 -127.26 gain 35 75 -120.41 gain 75 35 -120.99 gain 35 76 -119.33 gain 76 35 -115.87 gain 35 77 -114.59 gain 77 35 -114.79 gain 35 78 -120.80 gain 78 35 -123.85 gain 35 79 -109.44 gain 79 35 -107.27 gain 35 80 -119.20 gain 80 35 -117.53 gain 35 81 -104.89 gain 81 35 -103.82 gain 35 82 -115.31 gain 82 35 -111.86 gain 35 83 -115.55 gain 83 35 -113.13 gain 35 84 -113.22 gain 84 35 -110.95 gain 35 85 -130.48 gain 85 35 -125.02 gain 35 86 -124.11 gain 86 35 -122.03 gain 35 87 -119.41 gain 87 35 -121.29 gain 35 88 -127.67 gain 88 35 -127.30 gain 35 89 -121.54 gain 89 35 -119.77 gain 35 90 -118.76 gain 90 35 -114.01 gain 35 91 -113.79 gain 91 35 -112.98 gain 35 92 -121.31 gain 92 35 -117.46 gain 35 93 -120.70 gain 93 35 -121.63 gain 35 94 -115.75 gain 94 35 -116.56 gain 35 95 -117.14 gain 95 35 -120.20 gain 35 96 -112.09 gain 96 35 -112.49 gain 35 97 -117.03 gain 97 35 -116.18 gain 35 98 -112.74 gain 98 35 -112.68 gain 35 99 -114.36 gain 99 35 -112.13 gain 35 100 -118.04 gain 100 35 -115.37 gain 35 101 -116.05 gain 101 35 -113.55 gain 35 102 -124.64 gain 102 35 -122.91 gain 35 103 -126.29 gain 103 35 -122.05 gain 35 104 -125.64 gain 104 35 -126.77 gain 35 105 -117.20 gain 105 35 -114.27 gain 35 106 -130.08 gain 106 35 -128.24 gain 35 107 -113.85 gain 107 35 -118.57 gain 35 108 -111.34 gain 108 35 -108.39 gain 35 109 -119.07 gain 109 35 -119.60 gain 35 110 -113.62 gain 110 35 -112.62 gain 35 111 -118.30 gain 111 35 -116.98 gain 35 112 -115.39 gain 112 35 -112.95 gain 35 113 -117.14 gain 113 35 -113.51 gain 35 114 -121.76 gain 114 35 -121.43 gain 35 115 -120.66 gain 115 35 -114.64 gain 35 116 -117.15 gain 116 35 -118.66 gain 35 117 -118.41 gain 117 35 -121.42 gain 35 118 -123.67 gain 118 35 -125.01 gain 35 119 -122.09 gain 119 35 -118.09 gain 35 120 -119.62 gain 120 35 -120.13 gain 35 121 -119.66 gain 121 35 -119.46 gain 35 122 -121.26 gain 122 35 -123.18 gain 35 123 -115.91 gain 123 35 -118.60 gain 35 124 -115.42 gain 124 35 -114.53 gain 35 125 -114.66 gain 125 35 -115.10 gain 35 126 -120.00 gain 126 35 -118.40 gain 35 127 -115.40 gain 127 35 -117.26 gain 35 128 -119.47 gain 128 35 -119.27 gain 35 129 -122.15 gain 129 35 -119.85 gain 35 130 -122.40 gain 130 35 -117.92 gain 35 131 -117.08 gain 131 35 -119.70 gain 35 132 -129.36 gain 132 35 -131.60 gain 35 133 -123.87 gain 133 35 -124.18 gain 35 134 -126.45 gain 134 35 -123.47 gain 35 135 -118.84 gain 135 35 -119.42 gain 35 136 -117.60 gain 136 35 -118.79 gain 35 137 -117.85 gain 137 35 -116.53 gain 35 138 -121.48 gain 138 35 -119.16 gain 35 139 -119.17 gain 139 35 -117.83 gain 35 140 -123.75 gain 140 35 -125.02 gain 35 141 -113.95 gain 141 35 -113.89 gain 35 142 -117.75 gain 142 35 -117.00 gain 35 143 -110.05 gain 143 35 -108.91 gain 35 144 -123.64 gain 144 35 -123.52 gain 35 145 -125.46 gain 145 35 -123.79 gain 35 146 -124.00 gain 146 35 -121.24 gain 35 147 -124.99 gain 147 35 -119.32 gain 35 148 -129.06 gain 148 35 -123.11 gain 35 149 -124.52 gain 149 35 -121.73 gain 35 150 -115.83 gain 150 35 -115.73 gain 35 151 -118.52 gain 151 35 -118.61 gain 35 152 -119.29 gain 152 35 -116.36 gain 35 153 -121.79 gain 153 35 -116.44 gain 35 154 -126.90 gain 154 35 -130.10 gain 35 155 -116.38 gain 155 35 -119.48 gain 35 156 -122.20 gain 156 35 -119.68 gain 35 157 -119.58 gain 157 35 -120.01 gain 35 158 -120.49 gain 158 35 -123.51 gain 35 159 -121.09 gain 159 35 -120.73 gain 35 160 -131.13 gain 160 35 -127.88 gain 35 161 -122.32 gain 161 35 -122.56 gain 35 162 -119.49 gain 162 35 -118.60 gain 35 163 -124.48 gain 163 35 -125.74 gain 35 164 -124.16 gain 164 35 -126.46 gain 35 165 -125.45 gain 165 35 -123.78 gain 35 166 -129.05 gain 166 35 -128.96 gain 35 167 -124.18 gain 167 35 -126.18 gain 35 168 -122.74 gain 168 35 -123.18 gain 35 169 -133.78 gain 169 35 -138.43 gain 35 170 -124.65 gain 170 35 -120.82 gain 35 171 -122.02 gain 171 35 -123.22 gain 35 172 -120.23 gain 172 35 -116.13 gain 35 173 -122.49 gain 173 35 -117.82 gain 35 174 -121.25 gain 174 35 -120.87 gain 35 175 -119.70 gain 175 35 -122.88 gain 35 176 -126.64 gain 176 35 -121.83 gain 35 177 -131.39 gain 177 35 -134.39 gain 35 178 -120.01 gain 178 35 -118.84 gain 35 179 -123.05 gain 179 35 -120.27 gain 35 180 -128.65 gain 180 35 -127.34 gain 35 181 -117.51 gain 181 35 -116.27 gain 35 182 -125.90 gain 182 35 -127.04 gain 35 183 -121.84 gain 183 35 -116.38 gain 35 184 -130.95 gain 184 35 -130.27 gain 35 185 -119.92 gain 185 35 -116.72 gain 35 186 -120.83 gain 186 35 -117.91 gain 35 187 -124.02 gain 187 35 -123.65 gain 35 188 -124.80 gain 188 35 -127.69 gain 35 189 -126.46 gain 189 35 -126.86 gain 35 190 -119.91 gain 190 35 -117.32 gain 35 191 -128.46 gain 191 35 -126.96 gain 35 192 -127.56 gain 192 35 -128.93 gain 35 193 -126.40 gain 193 35 -129.02 gain 35 194 -130.56 gain 194 35 -126.99 gain 35 195 -133.29 gain 195 35 -130.35 gain 35 196 -127.45 gain 196 35 -128.56 gain 35 197 -120.96 gain 197 35 -118.13 gain 35 198 -123.10 gain 198 35 -119.79 gain 35 199 -128.90 gain 199 35 -129.50 gain 35 200 -127.44 gain 200 35 -124.98 gain 35 201 -125.20 gain 201 35 -123.54 gain 35 202 -119.86 gain 202 35 -122.21 gain 35 203 -128.29 gain 203 35 -130.25 gain 35 204 -124.53 gain 204 35 -123.78 gain 35 205 -125.58 gain 205 35 -123.90 gain 35 206 -126.44 gain 206 35 -129.29 gain 35 207 -126.08 gain 207 35 -121.29 gain 35 208 -124.36 gain 208 35 -125.34 gain 35 209 -125.20 gain 209 35 -127.17 gain 35 210 -130.75 gain 210 35 -129.67 gain 35 211 -131.16 gain 211 35 -132.10 gain 35 212 -124.74 gain 212 35 -124.22 gain 35 213 -130.30 gain 213 35 -128.97 gain 35 214 -126.42 gain 214 35 -124.98 gain 35 215 -129.37 gain 215 35 -124.34 gain 35 216 -132.15 gain 216 35 -131.79 gain 35 217 -125.53 gain 217 35 -125.68 gain 35 218 -128.83 gain 218 35 -131.17 gain 35 219 -122.30 gain 219 35 -116.00 gain 35 220 -131.08 gain 220 35 -135.27 gain 35 221 -130.15 gain 221 35 -129.99 gain 35 222 -132.23 gain 222 35 -132.39 gain 35 223 -123.37 gain 223 35 -122.14 gain 35 224 -135.13 gain 224 35 -136.59 gain 36 37 -100.68 gain 37 36 -92.88 gain 36 38 -113.49 gain 38 36 -111.71 gain 36 39 -117.31 gain 39 36 -114.39 gain 36 40 -123.52 gain 40 36 -122.65 gain 36 41 -123.21 gain 41 36 -117.98 gain 36 42 -114.29 gain 42 36 -107.20 gain 36 43 -123.66 gain 43 36 -120.46 gain 36 44 -122.13 gain 44 36 -121.99 gain 36 45 -115.07 gain 45 36 -113.41 gain 36 46 -121.89 gain 46 36 -116.02 gain 36 47 -118.69 gain 47 36 -113.88 gain 36 48 -113.05 gain 48 36 -106.03 gain 36 49 -103.45 gain 49 36 -104.40 gain 36 50 -100.82 gain 50 36 -102.74 gain 36 51 -96.60 gain 51 36 -93.65 gain 36 52 -105.09 gain 52 36 -98.17 gain 36 53 -109.26 gain 53 36 -103.35 gain 36 54 -108.79 gain 54 36 -103.58 gain 36 55 -109.50 gain 55 36 -103.59 gain 36 56 -120.64 gain 56 36 -122.05 gain 36 57 -119.85 gain 57 36 -115.13 gain 36 58 -128.03 gain 58 36 -126.06 gain 36 59 -127.00 gain 59 36 -121.15 gain 36 60 -119.12 gain 60 36 -114.60 gain 36 61 -123.43 gain 61 36 -117.66 gain 36 62 -113.86 gain 62 36 -113.31 gain 36 63 -110.32 gain 63 36 -102.99 gain 36 64 -102.46 gain 64 36 -98.11 gain 36 65 -105.99 gain 65 36 -103.73 gain 36 66 -110.90 gain 66 36 -102.89 gain 36 67 -115.49 gain 67 36 -109.75 gain 36 68 -113.85 gain 68 36 -112.67 gain 36 69 -113.90 gain 69 36 -110.01 gain 36 70 -117.35 gain 70 36 -113.22 gain 36 71 -119.88 gain 71 36 -113.86 gain 36 72 -124.57 gain 72 36 -118.97 gain 36 73 -123.68 gain 73 36 -116.47 gain 36 74 -122.84 gain 74 36 -119.51 gain 36 75 -121.60 gain 75 36 -118.40 gain 36 76 -121.00 gain 76 36 -113.76 gain 36 77 -117.76 gain 77 36 -114.18 gain 36 78 -110.38 gain 78 36 -109.64 gain 36 79 -113.06 gain 79 36 -107.10 gain 36 80 -113.97 gain 80 36 -108.52 gain 36 81 -112.35 gain 81 36 -107.49 gain 36 82 -107.61 gain 82 36 -100.38 gain 36 83 -117.21 gain 83 36 -111.01 gain 36 84 -116.41 gain 84 36 -110.36 gain 36 85 -117.21 gain 85 36 -107.97 gain 36 86 -123.86 gain 86 36 -118.00 gain 36 87 -120.31 gain 87 36 -118.41 gain 36 88 -124.57 gain 88 36 -120.42 gain 36 89 -123.52 gain 89 36 -117.97 gain 36 90 -132.54 gain 90 36 -124.00 gain 36 91 -130.81 gain 91 36 -126.21 gain 36 92 -118.44 gain 92 36 -110.81 gain 36 93 -120.23 gain 93 36 -117.38 gain 36 94 -114.21 gain 94 36 -111.24 gain 36 95 -119.30 gain 95 36 -118.58 gain 36 96 -113.73 gain 96 36 -110.35 gain 36 97 -114.07 gain 97 36 -109.43 gain 36 98 -119.33 gain 98 36 -115.49 gain 36 99 -125.20 gain 99 36 -119.18 gain 36 100 -123.31 gain 100 36 -116.86 gain 36 101 -119.59 gain 101 36 -113.30 gain 36 102 -119.54 gain 102 36 -114.04 gain 36 103 -128.06 gain 103 36 -120.04 gain 36 104 -130.84 gain 104 36 -128.19 gain 36 105 -124.31 gain 105 36 -117.60 gain 36 106 -126.02 gain 106 36 -120.40 gain 36 107 -124.34 gain 107 36 -125.29 gain 36 108 -121.27 gain 108 36 -114.54 gain 36 109 -119.42 gain 109 36 -116.17 gain 36 110 -124.38 gain 110 36 -119.60 gain 36 111 -117.36 gain 111 36 -112.26 gain 36 112 -115.23 gain 112 36 -109.02 gain 36 113 -115.23 gain 113 36 -107.82 gain 36 114 -121.80 gain 114 36 -117.69 gain 36 115 -123.32 gain 115 36 -113.51 gain 36 116 -122.80 gain 116 36 -120.54 gain 36 117 -122.96 gain 117 36 -122.19 gain 36 118 -123.33 gain 118 36 -120.89 gain 36 119 -122.13 gain 119 36 -114.35 gain 36 120 -124.21 gain 120 36 -120.94 gain 36 121 -128.06 gain 121 36 -124.08 gain 36 122 -116.94 gain 122 36 -115.08 gain 36 123 -122.65 gain 123 36 -121.56 gain 36 124 -124.06 gain 124 36 -119.39 gain 36 125 -118.83 gain 125 36 -115.49 gain 36 126 -126.22 gain 126 36 -120.84 gain 36 127 -121.57 gain 127 36 -119.64 gain 36 128 -126.24 gain 128 36 -122.26 gain 36 129 -122.46 gain 129 36 -116.38 gain 36 130 -129.73 gain 130 36 -121.47 gain 36 131 -124.10 gain 131 36 -122.93 gain 36 132 -120.58 gain 132 36 -119.04 gain 36 133 -128.57 gain 133 36 -125.10 gain 36 134 -130.18 gain 134 36 -123.41 gain 36 135 -128.64 gain 135 36 -125.44 gain 36 136 -120.68 gain 136 36 -118.09 gain 36 137 -132.34 gain 137 36 -127.24 gain 36 138 -129.62 gain 138 36 -123.51 gain 36 139 -119.61 gain 139 36 -114.49 gain 36 140 -128.53 gain 140 36 -126.02 gain 36 141 -124.46 gain 141 36 -120.62 gain 36 142 -119.20 gain 142 36 -114.67 gain 36 143 -120.10 gain 143 36 -115.18 gain 36 144 -122.45 gain 144 36 -118.55 gain 36 145 -126.49 gain 145 36 -121.04 gain 36 146 -124.34 gain 146 36 -117.80 gain 36 147 -128.44 gain 147 36 -118.99 gain 36 148 -128.75 gain 148 36 -119.02 gain 36 149 -124.81 gain 149 36 -118.24 gain 36 150 -123.99 gain 150 36 -120.10 gain 36 151 -125.06 gain 151 36 -121.37 gain 36 152 -131.87 gain 152 36 -125.16 gain 36 153 -131.86 gain 153 36 -122.73 gain 36 154 -119.23 gain 154 36 -118.65 gain 36 155 -126.47 gain 155 36 -125.79 gain 36 156 -123.49 gain 156 36 -117.19 gain 36 157 -125.29 gain 157 36 -121.94 gain 36 158 -120.63 gain 158 36 -119.87 gain 36 159 -127.90 gain 159 36 -123.76 gain 36 160 -128.20 gain 160 36 -121.17 gain 36 161 -133.27 gain 161 36 -129.73 gain 36 162 -121.00 gain 162 36 -116.33 gain 36 163 -128.73 gain 163 36 -126.21 gain 36 164 -129.80 gain 164 36 -128.31 gain 36 165 -127.63 gain 165 36 -122.18 gain 36 166 -127.97 gain 166 36 -124.09 gain 36 167 -129.40 gain 167 36 -127.62 gain 36 168 -128.37 gain 168 36 -125.04 gain 36 169 -133.12 gain 169 36 -133.98 gain 36 170 -131.72 gain 170 36 -124.12 gain 36 171 -128.96 gain 171 36 -126.37 gain 36 172 -127.34 gain 172 36 -119.45 gain 36 173 -126.82 gain 173 36 -118.37 gain 36 174 -122.14 gain 174 36 -117.98 gain 36 175 -127.97 gain 175 36 -127.37 gain 36 176 -129.76 gain 176 36 -121.17 gain 36 177 -128.67 gain 177 36 -127.89 gain 36 178 -133.80 gain 178 36 -128.85 gain 36 179 -139.76 gain 179 36 -133.20 gain 36 180 -128.99 gain 180 36 -123.90 gain 36 181 -140.34 gain 181 36 -135.32 gain 36 182 -134.45 gain 182 36 -131.81 gain 36 183 -127.21 gain 183 36 -117.96 gain 36 184 -126.66 gain 184 36 -122.19 gain 36 185 -118.44 gain 185 36 -111.46 gain 36 186 -125.30 gain 186 36 -118.61 gain 36 187 -125.92 gain 187 36 -121.76 gain 36 188 -135.00 gain 188 36 -134.11 gain 36 189 -125.49 gain 189 36 -122.11 gain 36 190 -131.92 gain 190 36 -125.55 gain 36 191 -125.46 gain 191 36 -120.18 gain 36 192 -138.06 gain 192 36 -135.65 gain 36 193 -120.03 gain 193 36 -118.87 gain 36 194 -126.70 gain 194 36 -119.35 gain 36 195 -128.17 gain 195 36 -121.46 gain 36 196 -137.92 gain 196 36 -135.24 gain 36 197 -133.81 gain 197 36 -127.20 gain 36 198 -127.41 gain 198 36 -120.31 gain 36 199 -126.03 gain 199 36 -122.86 gain 36 200 -128.04 gain 200 36 -121.80 gain 36 201 -127.35 gain 201 36 -121.91 gain 36 202 -127.39 gain 202 36 -125.95 gain 36 203 -126.48 gain 203 36 -124.67 gain 36 204 -129.70 gain 204 36 -125.17 gain 36 205 -132.32 gain 205 36 -126.87 gain 36 206 -129.31 gain 206 36 -128.38 gain 36 207 -130.99 gain 207 36 -122.41 gain 36 208 -129.50 gain 208 36 -126.70 gain 36 209 -132.60 gain 209 36 -130.79 gain 36 210 -127.63 gain 210 36 -122.76 gain 36 211 -129.09 gain 211 36 -126.25 gain 36 212 -133.20 gain 212 36 -128.89 gain 36 213 -136.06 gain 213 36 -130.95 gain 36 214 -133.51 gain 214 36 -128.28 gain 36 215 -127.96 gain 215 36 -119.16 gain 36 216 -128.53 gain 216 36 -124.38 gain 36 217 -128.10 gain 217 36 -124.47 gain 36 218 -134.70 gain 218 36 -133.27 gain 36 219 -132.80 gain 219 36 -122.72 gain 36 220 -131.19 gain 220 36 -131.60 gain 36 221 -137.63 gain 221 36 -133.68 gain 36 222 -132.33 gain 222 36 -128.71 gain 36 223 -130.39 gain 223 36 -125.39 gain 36 224 -128.95 gain 224 36 -126.63 gain 37 38 -89.51 gain 38 37 -95.52 gain 37 39 -94.54 gain 39 37 -99.43 gain 37 40 -97.23 gain 40 37 -104.16 gain 37 41 -115.11 gain 41 37 -117.68 gain 37 42 -113.11 gain 42 37 -113.82 gain 37 43 -110.75 gain 43 37 -115.35 gain 37 44 -114.75 gain 44 37 -122.42 gain 37 45 -116.10 gain 45 37 -122.23 gain 37 46 -115.61 gain 46 37 -117.54 gain 37 47 -112.34 gain 47 37 -115.32 gain 37 48 -110.34 gain 48 37 -111.12 gain 37 49 -114.00 gain 49 37 -122.75 gain 37 50 -97.84 gain 50 37 -107.56 gain 37 51 -102.66 gain 51 37 -107.52 gain 37 52 -82.81 gain 52 37 -83.69 gain 37 53 -93.26 gain 53 37 -95.15 gain 37 54 -95.74 gain 54 37 -98.33 gain 37 55 -100.42 gain 55 37 -102.30 gain 37 56 -102.00 gain 56 37 -111.21 gain 37 57 -108.57 gain 57 37 -111.66 gain 37 58 -116.10 gain 58 37 -121.93 gain 37 59 -118.63 gain 59 37 -120.59 gain 37 60 -118.59 gain 60 37 -121.86 gain 37 61 -111.33 gain 61 37 -113.36 gain 37 62 -112.68 gain 62 37 -119.93 gain 37 63 -109.46 gain 63 37 -109.93 gain 37 64 -108.74 gain 64 37 -112.18 gain 37 65 -103.06 gain 65 37 -108.60 gain 37 66 -100.43 gain 66 37 -100.22 gain 37 67 -96.65 gain 67 37 -98.72 gain 37 68 -98.38 gain 68 37 -105.00 gain 37 69 -96.50 gain 69 37 -100.42 gain 37 70 -110.20 gain 70 37 -113.88 gain 37 71 -105.32 gain 71 37 -107.09 gain 37 72 -110.44 gain 72 37 -112.63 gain 37 73 -108.35 gain 73 37 -108.94 gain 37 74 -120.88 gain 74 37 -125.34 gain 37 75 -118.42 gain 75 37 -123.03 gain 37 76 -112.95 gain 76 37 -113.51 gain 37 77 -118.68 gain 77 37 -122.90 gain 37 78 -107.83 gain 78 37 -114.90 gain 37 79 -111.33 gain 79 37 -113.18 gain 37 80 -109.68 gain 80 37 -112.03 gain 37 81 -108.47 gain 81 37 -111.41 gain 37 82 -103.58 gain 82 37 -104.15 gain 37 83 -106.97 gain 83 37 -108.57 gain 37 84 -110.28 gain 84 37 -112.03 gain 37 85 -107.76 gain 85 37 -106.31 gain 37 86 -113.25 gain 86 37 -115.19 gain 37 87 -111.86 gain 87 37 -117.76 gain 37 88 -114.54 gain 88 37 -118.19 gain 37 89 -114.31 gain 89 37 -116.57 gain 37 90 -115.18 gain 90 37 -114.44 gain 37 91 -113.16 gain 91 37 -116.36 gain 37 92 -109.11 gain 92 37 -109.28 gain 37 93 -114.50 gain 93 37 -119.45 gain 37 94 -107.19 gain 94 37 -112.02 gain 37 95 -98.93 gain 95 37 -106.01 gain 37 96 -101.13 gain 96 37 -105.55 gain 37 97 -100.90 gain 97 37 -104.07 gain 37 98 -113.84 gain 98 37 -117.80 gain 37 99 -103.17 gain 99 37 -104.95 gain 37 100 -113.58 gain 100 37 -114.93 gain 37 101 -109.47 gain 101 37 -110.98 gain 37 102 -115.28 gain 102 37 -117.57 gain 37 103 -118.33 gain 103 37 -118.11 gain 37 104 -118.41 gain 104 37 -123.56 gain 37 105 -117.16 gain 105 37 -118.26 gain 37 106 -110.94 gain 106 37 -113.12 gain 37 107 -118.17 gain 107 37 -126.91 gain 37 108 -110.36 gain 108 37 -111.43 gain 37 109 -120.32 gain 109 37 -124.87 gain 37 110 -118.09 gain 110 37 -121.12 gain 37 111 -111.38 gain 111 37 -114.08 gain 37 112 -114.69 gain 112 37 -116.27 gain 37 113 -110.92 gain 113 37 -111.31 gain 37 114 -119.81 gain 114 37 -123.50 gain 37 115 -112.62 gain 115 37 -110.61 gain 37 116 -116.88 gain 116 37 -122.42 gain 37 117 -115.66 gain 117 37 -122.70 gain 37 118 -118.46 gain 118 37 -123.82 gain 37 119 -118.11 gain 119 37 -118.13 gain 37 120 -124.56 gain 120 37 -129.09 gain 37 121 -120.92 gain 121 37 -124.74 gain 37 122 -116.02 gain 122 37 -121.96 gain 37 123 -122.20 gain 123 37 -128.91 gain 37 124 -111.35 gain 124 37 -114.47 gain 37 125 -116.09 gain 125 37 -120.55 gain 37 126 -115.85 gain 126 37 -118.27 gain 37 127 -116.44 gain 127 37 -122.31 gain 37 128 -115.67 gain 128 37 -119.49 gain 37 129 -111.84 gain 129 37 -113.56 gain 37 130 -114.63 gain 130 37 -114.18 gain 37 131 -113.60 gain 131 37 -120.23 gain 37 132 -112.96 gain 132 37 -119.22 gain 37 133 -121.75 gain 133 37 -126.08 gain 37 134 -122.27 gain 134 37 -123.30 gain 37 135 -123.44 gain 135 37 -128.04 gain 37 136 -121.14 gain 136 37 -126.36 gain 37 137 -120.03 gain 137 37 -122.73 gain 37 138 -114.03 gain 138 37 -115.72 gain 37 139 -111.14 gain 139 37 -113.82 gain 37 140 -117.13 gain 140 37 -122.41 gain 37 141 -114.79 gain 141 37 -118.75 gain 37 142 -120.90 gain 142 37 -124.17 gain 37 143 -110.36 gain 143 37 -113.24 gain 37 144 -117.08 gain 144 37 -120.98 gain 37 145 -115.89 gain 145 37 -118.24 gain 37 146 -119.22 gain 146 37 -120.48 gain 37 147 -118.03 gain 147 37 -116.38 gain 37 148 -123.27 gain 148 37 -121.34 gain 37 149 -118.80 gain 149 37 -120.04 gain 37 150 -121.35 gain 150 37 -125.27 gain 37 151 -118.47 gain 151 37 -122.58 gain 37 152 -121.05 gain 152 37 -122.14 gain 37 153 -113.92 gain 153 37 -112.59 gain 37 154 -114.34 gain 154 37 -121.55 gain 37 155 -121.25 gain 155 37 -128.36 gain 37 156 -107.70 gain 156 37 -109.20 gain 37 157 -118.15 gain 157 37 -122.60 gain 37 158 -124.69 gain 158 37 -131.73 gain 37 159 -109.42 gain 159 37 -113.07 gain 37 160 -115.78 gain 160 37 -116.55 gain 37 161 -113.73 gain 161 37 -117.99 gain 37 162 -122.00 gain 162 37 -125.12 gain 37 163 -124.07 gain 163 37 -129.34 gain 37 164 -114.93 gain 164 37 -121.25 gain 37 165 -119.95 gain 165 37 -122.31 gain 37 166 -121.42 gain 166 37 -125.35 gain 37 167 -114.79 gain 167 37 -120.81 gain 37 168 -122.68 gain 168 37 -127.15 gain 37 169 -116.32 gain 169 37 -124.98 gain 37 170 -113.37 gain 170 37 -113.57 gain 37 171 -123.67 gain 171 37 -128.88 gain 37 172 -113.68 gain 172 37 -113.59 gain 37 173 -121.41 gain 173 37 -120.76 gain 37 174 -123.79 gain 174 37 -127.43 gain 37 175 -123.36 gain 175 37 -130.56 gain 37 176 -118.73 gain 176 37 -117.94 gain 37 177 -116.74 gain 177 37 -123.76 gain 37 178 -122.99 gain 178 37 -125.84 gain 37 179 -117.89 gain 179 37 -119.13 gain 37 180 -125.42 gain 180 37 -128.13 gain 37 181 -117.35 gain 181 37 -120.13 gain 37 182 -121.00 gain 182 37 -126.17 gain 37 183 -113.76 gain 183 37 -112.31 gain 37 184 -117.90 gain 184 37 -121.23 gain 37 185 -117.35 gain 185 37 -118.17 gain 37 186 -124.44 gain 186 37 -125.54 gain 37 187 -124.04 gain 187 37 -127.69 gain 37 188 -126.61 gain 188 37 -133.52 gain 37 189 -122.51 gain 189 37 -126.93 gain 37 190 -116.51 gain 190 37 -117.94 gain 37 191 -122.71 gain 191 37 -125.23 gain 37 192 -120.40 gain 192 37 -125.79 gain 37 193 -131.45 gain 193 37 -138.09 gain 37 194 -112.34 gain 194 37 -112.79 gain 37 195 -121.17 gain 195 37 -122.25 gain 37 196 -129.24 gain 196 37 -134.37 gain 37 197 -127.95 gain 197 37 -129.13 gain 37 198 -118.88 gain 198 37 -119.59 gain 37 199 -116.11 gain 199 37 -120.73 gain 37 200 -123.13 gain 200 37 -124.69 gain 37 201 -124.86 gain 201 37 -127.23 gain 37 202 -123.86 gain 202 37 -130.22 gain 37 203 -119.80 gain 203 37 -125.79 gain 37 204 -117.99 gain 204 37 -121.26 gain 37 205 -128.56 gain 205 37 -130.91 gain 37 206 -122.12 gain 206 37 -128.99 gain 37 207 -125.37 gain 207 37 -124.60 gain 37 208 -125.89 gain 208 37 -130.89 gain 37 209 -136.78 gain 209 37 -142.77 gain 37 210 -129.25 gain 210 37 -132.19 gain 37 211 -120.56 gain 211 37 -125.52 gain 37 212 -115.26 gain 212 37 -118.75 gain 37 213 -129.11 gain 213 37 -131.80 gain 37 214 -119.10 gain 214 37 -121.68 gain 37 215 -125.02 gain 215 37 -124.01 gain 37 216 -122.67 gain 216 37 -126.32 gain 37 217 -117.95 gain 217 37 -122.12 gain 37 218 -121.63 gain 218 37 -127.99 gain 37 219 -123.63 gain 219 37 -121.35 gain 37 220 -123.08 gain 220 37 -131.29 gain 37 221 -127.39 gain 221 37 -131.24 gain 37 222 -124.96 gain 222 37 -129.15 gain 37 223 -119.33 gain 223 37 -122.12 gain 37 224 -125.60 gain 224 37 -131.08 gain 38 39 -95.85 gain 39 38 -94.72 gain 38 40 -105.27 gain 40 38 -106.18 gain 38 41 -112.46 gain 41 38 -109.01 gain 38 42 -115.04 gain 42 38 -109.73 gain 38 43 -117.05 gain 43 38 -115.63 gain 38 44 -116.83 gain 44 38 -118.47 gain 38 45 -125.03 gain 45 38 -125.15 gain 38 46 -121.04 gain 46 38 -116.95 gain 38 47 -122.76 gain 47 38 -119.73 gain 38 48 -114.21 gain 48 38 -108.96 gain 38 49 -122.68 gain 49 38 -125.41 gain 38 50 -108.65 gain 50 38 -112.35 gain 38 51 -103.65 gain 51 38 -102.49 gain 38 52 -103.94 gain 52 38 -98.79 gain 38 53 -100.97 gain 53 38 -96.84 gain 38 54 -98.42 gain 54 38 -94.99 gain 38 55 -109.93 gain 55 38 -105.80 gain 38 56 -119.40 gain 56 38 -122.60 gain 38 57 -109.36 gain 57 38 -106.43 gain 38 58 -121.44 gain 58 38 -121.25 gain 38 59 -115.61 gain 59 38 -111.54 gain 38 60 -113.81 gain 60 38 -111.07 gain 38 61 -118.64 gain 61 38 -114.65 gain 38 62 -120.25 gain 62 38 -121.48 gain 38 63 -121.21 gain 63 38 -115.67 gain 38 64 -114.32 gain 64 38 -111.74 gain 38 65 -113.20 gain 65 38 -112.71 gain 38 66 -104.97 gain 66 38 -98.74 gain 38 67 -119.70 gain 67 38 -115.75 gain 38 68 -107.93 gain 68 38 -108.54 gain 38 69 -103.69 gain 69 38 -101.58 gain 38 70 -108.90 gain 70 38 -106.56 gain 38 71 -101.93 gain 71 38 -97.69 gain 38 72 -112.61 gain 72 38 -108.78 gain 38 73 -108.16 gain 73 38 -102.73 gain 38 74 -118.36 gain 74 38 -116.81 gain 38 75 -118.30 gain 75 38 -116.89 gain 38 76 -127.73 gain 76 38 -122.26 gain 38 77 -109.72 gain 77 38 -107.92 gain 38 78 -115.03 gain 78 38 -116.08 gain 38 79 -114.84 gain 79 38 -110.67 gain 38 80 -115.65 gain 80 38 -111.98 gain 38 81 -111.30 gain 81 38 -108.22 gain 38 82 -111.80 gain 82 38 -106.35 gain 38 83 -113.93 gain 83 38 -109.52 gain 38 84 -110.32 gain 84 38 -106.05 gain 38 85 -112.76 gain 85 38 -105.30 gain 38 86 -115.20 gain 86 38 -111.12 gain 38 87 -118.25 gain 87 38 -118.13 gain 38 88 -118.16 gain 88 38 -115.79 gain 38 89 -117.68 gain 89 38 -113.91 gain 38 90 -123.10 gain 90 38 -116.35 gain 38 91 -131.92 gain 91 38 -129.10 gain 38 92 -118.24 gain 92 38 -112.39 gain 38 93 -119.13 gain 93 38 -118.07 gain 38 94 -119.16 gain 94 38 -117.97 gain 38 95 -119.66 gain 95 38 -120.72 gain 38 96 -118.56 gain 96 38 -116.96 gain 38 97 -112.18 gain 97 38 -109.33 gain 38 98 -110.71 gain 98 38 -108.65 gain 38 99 -115.77 gain 99 38 -111.53 gain 38 100 -125.35 gain 100 38 -120.68 gain 38 101 -119.00 gain 101 38 -114.50 gain 38 102 -118.73 gain 102 38 -115.00 gain 38 103 -125.02 gain 103 38 -118.78 gain 38 104 -117.62 gain 104 38 -116.76 gain 38 105 -128.47 gain 105 38 -123.55 gain 38 106 -121.65 gain 106 38 -117.81 gain 38 107 -120.35 gain 107 38 -123.08 gain 38 108 -122.50 gain 108 38 -117.55 gain 38 109 -116.40 gain 109 38 -114.94 gain 38 110 -120.93 gain 110 38 -117.93 gain 38 111 -114.39 gain 111 38 -111.07 gain 38 112 -117.05 gain 112 38 -112.62 gain 38 113 -128.39 gain 113 38 -122.76 gain 38 114 -111.05 gain 114 38 -108.72 gain 38 115 -123.08 gain 115 38 -115.06 gain 38 116 -129.95 gain 116 38 -129.47 gain 38 117 -120.94 gain 117 38 -121.95 gain 38 118 -119.79 gain 118 38 -119.13 gain 38 119 -120.28 gain 119 38 -114.28 gain 38 120 -120.65 gain 120 38 -119.16 gain 38 121 -122.45 gain 121 38 -120.25 gain 38 122 -128.33 gain 122 38 -128.24 gain 38 123 -118.20 gain 123 38 -118.89 gain 38 124 -127.71 gain 124 38 -124.81 gain 38 125 -118.44 gain 125 38 -116.88 gain 38 126 -117.55 gain 126 38 -113.94 gain 38 127 -121.78 gain 127 38 -121.64 gain 38 128 -118.45 gain 128 38 -116.24 gain 38 129 -110.19 gain 129 38 -105.90 gain 38 130 -110.91 gain 130 38 -104.43 gain 38 131 -123.05 gain 131 38 -123.67 gain 38 132 -120.48 gain 132 38 -120.72 gain 38 133 -126.59 gain 133 38 -124.90 gain 38 134 -123.33 gain 134 38 -118.34 gain 38 135 -126.50 gain 135 38 -125.08 gain 38 136 -118.65 gain 136 38 -117.84 gain 38 137 -123.04 gain 137 38 -119.71 gain 38 138 -127.57 gain 138 38 -123.25 gain 38 139 -122.25 gain 139 38 -118.91 gain 38 140 -118.16 gain 140 38 -117.43 gain 38 141 -114.83 gain 141 38 -112.77 gain 38 142 -122.26 gain 142 38 -119.51 gain 38 143 -126.86 gain 143 38 -123.72 gain 38 144 -125.62 gain 144 38 -123.50 gain 38 145 -123.74 gain 145 38 -120.07 gain 38 146 -118.31 gain 146 38 -113.55 gain 38 147 -122.29 gain 147 38 -114.62 gain 38 148 -128.98 gain 148 38 -121.02 gain 38 149 -121.54 gain 149 38 -116.75 gain 38 150 -133.22 gain 150 38 -131.12 gain 38 151 -124.96 gain 151 38 -123.05 gain 38 152 -125.16 gain 152 38 -120.23 gain 38 153 -133.86 gain 153 38 -126.51 gain 38 154 -126.23 gain 154 38 -127.42 gain 38 155 -119.34 gain 155 38 -120.44 gain 38 156 -124.11 gain 156 38 -119.59 gain 38 157 -124.65 gain 157 38 -123.08 gain 38 158 -119.09 gain 158 38 -120.12 gain 38 159 -120.81 gain 159 38 -118.45 gain 38 160 -120.14 gain 160 38 -114.89 gain 38 161 -120.24 gain 161 38 -118.48 gain 38 162 -121.42 gain 162 38 -118.53 gain 38 163 -123.65 gain 163 38 -122.91 gain 38 164 -121.78 gain 164 38 -122.08 gain 38 165 -128.69 gain 165 38 -125.03 gain 38 166 -128.39 gain 166 38 -126.30 gain 38 167 -121.10 gain 167 38 -121.10 gain 38 168 -128.83 gain 168 38 -127.28 gain 38 169 -121.26 gain 169 38 -123.90 gain 38 170 -124.25 gain 170 38 -118.43 gain 38 171 -122.92 gain 171 38 -122.12 gain 38 172 -130.93 gain 172 38 -124.82 gain 38 173 -129.34 gain 173 38 -122.67 gain 38 174 -125.95 gain 174 38 -123.58 gain 38 175 -129.49 gain 175 38 -130.67 gain 38 176 -125.19 gain 176 38 -118.38 gain 38 177 -133.78 gain 177 38 -134.79 gain 38 178 -118.27 gain 178 38 -115.10 gain 38 179 -129.18 gain 179 38 -124.40 gain 38 180 -131.63 gain 180 38 -128.32 gain 38 181 -129.63 gain 181 38 -126.38 gain 38 182 -124.30 gain 182 38 -123.44 gain 38 183 -132.39 gain 183 38 -124.92 gain 38 184 -128.12 gain 184 38 -125.44 gain 38 185 -133.20 gain 185 38 -128.00 gain 38 186 -121.25 gain 186 38 -116.34 gain 38 187 -126.65 gain 187 38 -124.27 gain 38 188 -120.33 gain 188 38 -121.21 gain 38 189 -125.39 gain 189 38 -123.79 gain 38 190 -131.30 gain 190 38 -126.70 gain 38 191 -129.25 gain 191 38 -125.75 gain 38 192 -124.84 gain 192 38 -124.21 gain 38 193 -123.66 gain 193 38 -124.28 gain 38 194 -129.50 gain 194 38 -123.93 gain 38 195 -130.07 gain 195 38 -125.13 gain 38 196 -124.66 gain 196 38 -123.76 gain 38 197 -133.90 gain 197 38 -129.06 gain 38 198 -127.83 gain 198 38 -122.51 gain 38 199 -128.12 gain 199 38 -126.72 gain 38 200 -130.92 gain 200 38 -126.46 gain 38 201 -130.47 gain 201 38 -126.81 gain 38 202 -130.91 gain 202 38 -131.25 gain 38 203 -121.59 gain 203 38 -121.56 gain 38 204 -125.80 gain 204 38 -123.05 gain 38 205 -123.81 gain 205 38 -120.14 gain 38 206 -135.26 gain 206 38 -136.11 gain 38 207 -129.55 gain 207 38 -122.76 gain 38 208 -125.18 gain 208 38 -124.17 gain 38 209 -129.98 gain 209 38 -129.96 gain 38 210 -134.05 gain 210 38 -130.97 gain 38 211 -126.89 gain 211 38 -125.83 gain 38 212 -129.03 gain 212 38 -126.51 gain 38 213 -131.09 gain 213 38 -127.76 gain 38 214 -125.35 gain 214 38 -121.91 gain 38 215 -127.59 gain 215 38 -120.56 gain 38 216 -124.99 gain 216 38 -122.62 gain 38 217 -125.89 gain 217 38 -124.04 gain 38 218 -135.08 gain 218 38 -135.43 gain 38 219 -124.66 gain 219 38 -116.36 gain 38 220 -127.50 gain 220 38 -129.70 gain 38 221 -122.55 gain 221 38 -120.38 gain 38 222 -123.44 gain 222 38 -121.60 gain 38 223 -128.67 gain 223 38 -125.45 gain 38 224 -130.82 gain 224 38 -130.28 gain 39 40 -102.98 gain 40 39 -105.03 gain 39 41 -104.11 gain 41 39 -101.79 gain 39 42 -107.54 gain 42 39 -103.36 gain 39 43 -115.77 gain 43 39 -115.49 gain 39 44 -111.27 gain 44 39 -114.04 gain 39 45 -126.85 gain 45 39 -128.10 gain 39 46 -121.99 gain 46 39 -119.03 gain 39 47 -123.05 gain 47 39 -121.15 gain 39 48 -120.85 gain 48 39 -116.74 gain 39 49 -115.77 gain 49 39 -119.63 gain 39 50 -117.54 gain 50 39 -122.37 gain 39 51 -104.76 gain 51 39 -104.73 gain 39 52 -108.33 gain 52 39 -104.32 gain 39 53 -106.96 gain 53 39 -103.97 gain 39 54 -93.17 gain 54 39 -90.87 gain 39 55 -98.60 gain 55 39 -95.60 gain 39 56 -114.44 gain 56 39 -118.77 gain 39 57 -112.05 gain 57 39 -110.25 gain 39 58 -116.16 gain 58 39 -117.11 gain 39 59 -120.10 gain 59 39 -117.17 gain 39 60 -132.05 gain 60 39 -130.44 gain 39 61 -119.73 gain 61 39 -116.88 gain 39 62 -125.28 gain 62 39 -127.64 gain 39 63 -122.24 gain 63 39 -117.83 gain 39 64 -116.29 gain 64 39 -114.85 gain 39 65 -114.26 gain 65 39 -114.91 gain 39 66 -117.27 gain 66 39 -112.18 gain 39 67 -106.54 gain 67 39 -103.72 gain 39 68 -96.83 gain 68 39 -98.57 gain 39 69 -104.01 gain 69 39 -103.04 gain 39 70 -108.04 gain 70 39 -106.83 gain 39 71 -104.95 gain 71 39 -101.84 gain 39 72 -113.66 gain 72 39 -110.96 gain 39 73 -114.85 gain 73 39 -110.55 gain 39 74 -114.65 gain 74 39 -114.22 gain 39 75 -127.80 gain 75 39 -127.52 gain 39 76 -118.22 gain 76 39 -113.89 gain 39 77 -114.53 gain 77 39 -113.86 gain 39 78 -121.98 gain 78 39 -124.16 gain 39 79 -120.17 gain 79 39 -117.13 gain 39 80 -110.38 gain 80 39 -107.84 gain 39 81 -118.86 gain 81 39 -116.92 gain 39 82 -103.90 gain 82 39 -99.58 gain 39 83 -109.71 gain 83 39 -106.43 gain 39 84 -111.79 gain 84 39 -108.65 gain 39 85 -113.06 gain 85 39 -106.73 gain 39 86 -114.88 gain 86 39 -111.93 gain 39 87 -114.19 gain 87 39 -115.21 gain 39 88 -118.52 gain 88 39 -117.29 gain 39 89 -125.25 gain 89 39 -122.62 gain 39 90 -122.57 gain 90 39 -116.94 gain 39 91 -126.75 gain 91 39 -125.07 gain 39 92 -125.35 gain 92 39 -120.64 gain 39 93 -113.82 gain 93 39 -113.88 gain 39 94 -110.24 gain 94 39 -110.19 gain 39 95 -116.29 gain 95 39 -118.49 gain 39 96 -113.99 gain 96 39 -113.52 gain 39 97 -114.18 gain 97 39 -112.46 gain 39 98 -118.24 gain 98 39 -117.32 gain 39 99 -113.67 gain 99 39 -110.57 gain 39 100 -120.01 gain 100 39 -116.47 gain 39 101 -119.35 gain 101 39 -115.98 gain 39 102 -117.39 gain 102 39 -114.80 gain 39 103 -112.92 gain 103 39 -107.81 gain 39 104 -125.09 gain 104 39 -125.36 gain 39 105 -131.91 gain 105 39 -128.12 gain 39 106 -131.86 gain 106 39 -129.15 gain 39 107 -120.29 gain 107 39 -124.15 gain 39 108 -119.63 gain 108 39 -115.81 gain 39 109 -116.10 gain 109 39 -115.77 gain 39 110 -115.95 gain 110 39 -114.09 gain 39 111 -114.45 gain 111 39 -112.27 gain 39 112 -114.08 gain 112 39 -110.78 gain 39 113 -120.48 gain 113 39 -115.98 gain 39 114 -124.47 gain 114 39 -123.28 gain 39 115 -110.23 gain 115 39 -103.34 gain 39 116 -110.45 gain 116 39 -111.10 gain 39 117 -122.77 gain 117 39 -124.92 gain 39 118 -109.90 gain 118 39 -110.37 gain 39 119 -115.48 gain 119 39 -110.61 gain 39 120 -121.46 gain 120 39 -121.11 gain 39 121 -126.13 gain 121 39 -125.07 gain 39 122 -120.04 gain 122 39 -121.09 gain 39 123 -119.13 gain 123 39 -120.96 gain 39 124 -123.36 gain 124 39 -121.60 gain 39 125 -125.16 gain 125 39 -124.74 gain 39 126 -115.85 gain 126 39 -113.38 gain 39 127 -120.53 gain 127 39 -121.53 gain 39 128 -112.53 gain 128 39 -111.46 gain 39 129 -118.79 gain 129 39 -115.62 gain 39 130 -118.23 gain 130 39 -112.89 gain 39 131 -123.31 gain 131 39 -125.06 gain 39 132 -123.82 gain 132 39 -125.19 gain 39 133 -115.97 gain 133 39 -115.41 gain 39 134 -129.93 gain 134 39 -126.07 gain 39 135 -127.07 gain 135 39 -126.78 gain 39 136 -120.25 gain 136 39 -120.58 gain 39 137 -127.84 gain 137 39 -125.65 gain 39 138 -125.94 gain 138 39 -122.75 gain 39 139 -125.71 gain 139 39 -123.50 gain 39 140 -117.56 gain 140 39 -117.96 gain 39 141 -121.77 gain 141 39 -120.84 gain 39 142 -120.27 gain 142 39 -118.65 gain 39 143 -128.99 gain 143 39 -126.99 gain 39 144 -125.61 gain 144 39 -124.63 gain 39 145 -120.22 gain 145 39 -117.69 gain 39 146 -118.71 gain 146 39 -115.09 gain 39 147 -123.88 gain 147 39 -117.34 gain 39 148 -115.35 gain 148 39 -108.53 gain 39 149 -123.45 gain 149 39 -119.79 gain 39 150 -127.64 gain 150 39 -126.67 gain 39 151 -127.18 gain 151 39 -126.41 gain 39 152 -123.10 gain 152 39 -119.31 gain 39 153 -125.81 gain 153 39 -119.60 gain 39 154 -116.87 gain 154 39 -119.20 gain 39 155 -130.32 gain 155 39 -132.54 gain 39 156 -120.20 gain 156 39 -116.82 gain 39 157 -126.80 gain 157 39 -126.36 gain 39 158 -122.80 gain 158 39 -124.96 gain 39 159 -114.23 gain 159 39 -113.01 gain 39 160 -121.06 gain 160 39 -116.95 gain 39 161 -122.30 gain 161 39 -121.68 gain 39 162 -118.72 gain 162 39 -116.96 gain 39 163 -122.94 gain 163 39 -123.33 gain 39 164 -122.06 gain 164 39 -123.49 gain 39 165 -123.27 gain 165 39 -120.74 gain 39 166 -127.44 gain 166 39 -126.48 gain 39 167 -125.91 gain 167 39 -127.04 gain 39 168 -125.77 gain 168 39 -125.35 gain 39 169 -130.34 gain 169 39 -134.12 gain 39 170 -126.16 gain 170 39 -121.47 gain 39 171 -122.77 gain 171 39 -123.10 gain 39 172 -124.72 gain 172 39 -119.75 gain 39 173 -128.03 gain 173 39 -122.49 gain 39 174 -124.37 gain 174 39 -123.13 gain 39 175 -121.64 gain 175 39 -123.95 gain 39 176 -118.43 gain 176 39 -112.76 gain 39 177 -125.84 gain 177 39 -127.98 gain 39 178 -137.06 gain 178 39 -135.02 gain 39 179 -123.37 gain 179 39 -119.73 gain 39 180 -130.01 gain 180 39 -127.83 gain 39 181 -132.19 gain 181 39 -130.08 gain 39 182 -135.08 gain 182 39 -135.35 gain 39 183 -128.60 gain 183 39 -122.27 gain 39 184 -137.92 gain 184 39 -136.37 gain 39 185 -128.40 gain 185 39 -124.34 gain 39 186 -129.99 gain 186 39 -126.21 gain 39 187 -121.56 gain 187 39 -120.32 gain 39 188 -126.12 gain 188 39 -128.14 gain 39 189 -126.34 gain 189 39 -125.87 gain 39 190 -125.29 gain 190 39 -121.84 gain 39 191 -131.69 gain 191 39 -129.33 gain 39 192 -127.24 gain 192 39 -127.75 gain 39 193 -125.53 gain 193 39 -127.29 gain 39 194 -127.12 gain 194 39 -122.68 gain 39 195 -127.30 gain 195 39 -123.49 gain 39 196 -126.18 gain 196 39 -126.41 gain 39 197 -133.17 gain 197 39 -129.47 gain 39 198 -122.17 gain 198 39 -117.99 gain 39 199 -132.41 gain 199 39 -132.14 gain 39 200 -128.98 gain 200 39 -125.65 gain 39 201 -134.08 gain 201 39 -131.55 gain 39 202 -122.48 gain 202 39 -123.96 gain 39 203 -123.73 gain 203 39 -124.84 gain 39 204 -124.51 gain 204 39 -122.90 gain 39 205 -125.85 gain 205 39 -123.31 gain 39 206 -125.78 gain 206 39 -127.76 gain 39 207 -120.10 gain 207 39 -114.44 gain 39 208 -122.74 gain 208 39 -122.86 gain 39 209 -129.06 gain 209 39 -130.16 gain 39 210 -138.50 gain 210 39 -136.54 gain 39 211 -135.57 gain 211 39 -135.64 gain 39 212 -124.72 gain 212 39 -123.33 gain 39 213 -140.97 gain 213 39 -138.77 gain 39 214 -128.11 gain 214 39 -125.80 gain 39 215 -126.67 gain 215 39 -120.77 gain 39 216 -128.21 gain 216 39 -126.98 gain 39 217 -132.47 gain 217 39 -131.75 gain 39 218 -116.83 gain 218 39 -118.30 gain 39 219 -134.27 gain 219 39 -127.10 gain 39 220 -130.46 gain 220 39 -133.79 gain 39 221 -124.97 gain 221 39 -123.93 gain 39 222 -132.91 gain 222 39 -132.20 gain 39 223 -121.62 gain 223 39 -119.52 gain 39 224 -134.01 gain 224 39 -134.60 gain 40 41 -89.86 gain 41 40 -85.49 gain 40 42 -103.25 gain 42 40 -97.03 gain 40 43 -117.93 gain 43 40 -115.60 gain 40 44 -121.07 gain 44 40 -121.80 gain 40 45 -127.84 gain 45 40 -127.05 gain 40 46 -124.47 gain 46 40 -119.47 gain 40 47 -124.04 gain 47 40 -120.10 gain 40 48 -125.51 gain 48 40 -119.36 gain 40 49 -126.63 gain 49 40 -128.45 gain 40 50 -119.70 gain 50 40 -122.49 gain 40 51 -114.03 gain 51 40 -111.96 gain 40 52 -118.47 gain 52 40 -112.41 gain 40 53 -112.76 gain 53 40 -107.72 gain 40 54 -103.00 gain 54 40 -98.66 gain 40 55 -93.48 gain 55 40 -88.44 gain 40 56 -107.29 gain 56 40 -109.57 gain 40 57 -109.02 gain 57 40 -105.18 gain 40 58 -107.29 gain 58 40 -106.19 gain 40 59 -116.29 gain 59 40 -111.31 gain 40 60 -131.15 gain 60 40 -127.49 gain 40 61 -127.63 gain 61 40 -122.73 gain 40 62 -124.58 gain 62 40 -124.90 gain 40 63 -124.42 gain 63 40 -117.97 gain 40 64 -121.01 gain 64 40 -117.52 gain 40 65 -114.11 gain 65 40 -112.72 gain 40 66 -119.88 gain 66 40 -112.74 gain 40 67 -110.75 gain 67 40 -105.88 gain 40 68 -110.84 gain 68 40 -110.54 gain 40 69 -115.84 gain 69 40 -112.83 gain 40 70 -101.65 gain 70 40 -98.39 gain 40 71 -111.35 gain 71 40 -106.20 gain 40 72 -112.82 gain 72 40 -108.09 gain 40 73 -112.03 gain 73 40 -105.69 gain 40 74 -120.11 gain 74 40 -117.65 gain 40 75 -126.11 gain 75 40 -123.78 gain 40 76 -121.71 gain 76 40 -115.33 gain 40 77 -123.69 gain 77 40 -120.98 gain 40 78 -127.61 gain 78 40 -127.75 gain 40 79 -119.72 gain 79 40 -114.64 gain 40 80 -120.11 gain 80 40 -115.52 gain 40 81 -116.30 gain 81 40 -112.31 gain 40 82 -113.57 gain 82 40 -107.21 gain 40 83 -116.15 gain 83 40 -110.82 gain 40 84 -119.12 gain 84 40 -113.94 gain 40 85 -99.98 gain 85 40 -91.61 gain 40 86 -109.32 gain 86 40 -104.33 gain 40 87 -115.48 gain 87 40 -114.45 gain 40 88 -113.37 gain 88 40 -110.09 gain 40 89 -125.65 gain 89 40 -120.97 gain 40 90 -121.90 gain 90 40 -114.23 gain 40 91 -120.65 gain 91 40 -116.92 gain 40 92 -128.52 gain 92 40 -121.75 gain 40 93 -123.84 gain 93 40 -121.86 gain 40 94 -120.66 gain 94 40 -118.56 gain 40 95 -123.17 gain 95 40 -123.32 gain 40 96 -123.96 gain 96 40 -121.45 gain 40 97 -123.85 gain 97 40 -120.09 gain 40 98 -124.66 gain 98 40 -121.70 gain 40 99 -118.12 gain 99 40 -112.97 gain 40 100 -112.30 gain 100 40 -106.72 gain 40 101 -119.15 gain 101 40 -113.73 gain 40 102 -121.76 gain 102 40 -117.12 gain 40 103 -122.65 gain 103 40 -115.49 gain 40 104 -117.21 gain 104 40 -115.43 gain 40 105 -127.03 gain 105 40 -121.19 gain 40 106 -118.30 gain 106 40 -113.55 gain 40 107 -124.93 gain 107 40 -126.75 gain 40 108 -119.99 gain 108 40 -114.13 gain 40 109 -123.48 gain 109 40 -121.10 gain 40 110 -127.62 gain 110 40 -123.71 gain 40 111 -115.94 gain 111 40 -111.71 gain 40 112 -121.28 gain 112 40 -115.93 gain 40 113 -125.46 gain 113 40 -118.92 gain 40 114 -113.91 gain 114 40 -110.67 gain 40 115 -122.62 gain 115 40 -113.68 gain 40 116 -120.93 gain 116 40 -119.53 gain 40 117 -119.01 gain 117 40 -119.11 gain 40 118 -116.58 gain 118 40 -115.01 gain 40 119 -115.85 gain 119 40 -108.94 gain 40 120 -134.20 gain 120 40 -131.80 gain 40 121 -130.94 gain 121 40 -127.83 gain 40 122 -133.54 gain 122 40 -132.55 gain 40 123 -128.64 gain 123 40 -128.42 gain 40 124 -124.66 gain 124 40 -120.85 gain 40 125 -114.05 gain 125 40 -111.58 gain 40 126 -122.20 gain 126 40 -117.68 gain 40 127 -123.68 gain 127 40 -122.62 gain 40 128 -119.21 gain 128 40 -116.10 gain 40 129 -121.46 gain 129 40 -116.25 gain 40 130 -121.88 gain 130 40 -114.50 gain 40 131 -120.93 gain 131 40 -120.64 gain 40 132 -125.46 gain 132 40 -124.79 gain 40 133 -119.26 gain 133 40 -116.66 gain 40 134 -126.62 gain 134 40 -120.72 gain 40 135 -131.14 gain 135 40 -128.81 gain 40 136 -127.25 gain 136 40 -125.53 gain 40 137 -124.33 gain 137 40 -120.10 gain 40 138 -124.81 gain 138 40 -119.57 gain 40 139 -122.31 gain 139 40 -118.06 gain 40 140 -123.18 gain 140 40 -121.53 gain 40 141 -124.90 gain 141 40 -121.93 gain 40 142 -130.23 gain 142 40 -126.57 gain 40 143 -132.15 gain 143 40 -128.11 gain 40 144 -117.96 gain 144 40 -114.93 gain 40 145 -119.84 gain 145 40 -115.25 gain 40 146 -127.55 gain 146 40 -121.88 gain 40 147 -126.25 gain 147 40 -117.67 gain 40 148 -125.39 gain 148 40 -116.53 gain 40 149 -129.70 gain 149 40 -124.00 gain 40 150 -132.93 gain 150 40 -129.92 gain 40 151 -134.22 gain 151 40 -131.40 gain 40 152 -121.20 gain 152 40 -115.36 gain 40 153 -130.79 gain 153 40 -122.53 gain 40 154 -134.41 gain 154 40 -134.69 gain 40 155 -126.21 gain 155 40 -126.40 gain 40 156 -123.96 gain 156 40 -118.54 gain 40 157 -128.31 gain 157 40 -125.83 gain 40 158 -120.03 gain 158 40 -120.14 gain 40 159 -125.71 gain 159 40 -122.44 gain 40 160 -130.07 gain 160 40 -123.91 gain 40 161 -122.33 gain 161 40 -119.66 gain 40 162 -122.98 gain 162 40 -119.17 gain 40 163 -126.66 gain 163 40 -125.00 gain 40 164 -127.34 gain 164 40 -126.72 gain 40 165 -124.36 gain 165 40 -119.79 gain 40 166 -130.24 gain 166 40 -127.24 gain 40 167 -126.60 gain 167 40 -125.68 gain 40 168 -128.24 gain 168 40 -125.77 gain 40 169 -122.16 gain 169 40 -123.90 gain 40 170 -123.98 gain 170 40 -117.24 gain 40 171 -127.41 gain 171 40 -125.69 gain 40 172 -133.03 gain 172 40 -126.01 gain 40 173 -118.78 gain 173 40 -111.19 gain 40 174 -122.50 gain 174 40 -119.22 gain 40 175 -123.22 gain 175 40 -123.49 gain 40 176 -122.68 gain 176 40 -114.96 gain 40 177 -123.19 gain 177 40 -123.29 gain 40 178 -126.16 gain 178 40 -122.07 gain 40 179 -120.89 gain 179 40 -115.20 gain 40 180 -127.44 gain 180 40 -123.21 gain 40 181 -139.26 gain 181 40 -135.10 gain 40 182 -129.09 gain 182 40 -127.32 gain 40 183 -131.24 gain 183 40 -122.86 gain 40 184 -132.46 gain 184 40 -128.86 gain 40 185 -127.39 gain 185 40 -121.27 gain 40 186 -128.24 gain 186 40 -122.41 gain 40 187 -131.08 gain 187 40 -127.80 gain 40 188 -130.23 gain 188 40 -130.20 gain 40 189 -125.83 gain 189 40 -123.32 gain 40 190 -125.93 gain 190 40 -120.43 gain 40 191 -122.67 gain 191 40 -118.26 gain 40 192 -128.71 gain 192 40 -127.17 gain 40 193 -125.54 gain 193 40 -125.25 gain 40 194 -129.06 gain 194 40 -122.58 gain 40 195 -134.71 gain 195 40 -128.86 gain 40 196 -131.79 gain 196 40 -129.98 gain 40 197 -137.14 gain 197 40 -131.40 gain 40 198 -131.56 gain 198 40 -125.33 gain 40 199 -127.21 gain 199 40 -124.90 gain 40 200 -135.54 gain 200 40 -130.17 gain 40 201 -122.26 gain 201 40 -117.69 gain 40 202 -127.70 gain 202 40 -127.14 gain 40 203 -132.59 gain 203 40 -131.64 gain 40 204 -124.29 gain 204 40 -120.63 gain 40 205 -133.26 gain 205 40 -128.68 gain 40 206 -126.69 gain 206 40 -126.62 gain 40 207 -131.72 gain 207 40 -124.01 gain 40 208 -123.81 gain 208 40 -121.88 gain 40 209 -132.69 gain 209 40 -131.76 gain 40 210 -132.82 gain 210 40 -128.82 gain 40 211 -129.18 gain 211 40 -127.21 gain 40 212 -134.96 gain 212 40 -131.52 gain 40 213 -130.20 gain 213 40 -125.96 gain 40 214 -129.81 gain 214 40 -125.46 gain 40 215 -126.11 gain 215 40 -118.17 gain 40 216 -132.62 gain 216 40 -129.34 gain 40 217 -125.09 gain 217 40 -122.33 gain 40 218 -132.01 gain 218 40 -131.44 gain 40 219 -125.39 gain 219 40 -116.18 gain 40 220 -131.05 gain 220 40 -132.33 gain 40 221 -138.78 gain 221 40 -135.71 gain 40 222 -135.41 gain 222 40 -132.66 gain 40 223 -138.17 gain 223 40 -134.03 gain 40 224 -127.87 gain 224 40 -126.42 gain 41 42 -89.63 gain 42 41 -87.78 gain 41 43 -102.86 gain 43 41 -104.90 gain 41 44 -102.65 gain 44 41 -107.75 gain 41 45 -128.69 gain 45 41 -132.27 gain 41 46 -120.82 gain 46 41 -120.18 gain 41 47 -118.41 gain 47 41 -118.83 gain 41 48 -130.72 gain 48 41 -128.93 gain 41 49 -117.04 gain 49 41 -123.23 gain 41 50 -119.30 gain 50 41 -126.46 gain 41 51 -111.54 gain 51 41 -113.84 gain 41 52 -110.24 gain 52 41 -108.55 gain 41 53 -106.93 gain 53 41 -106.26 gain 41 54 -94.21 gain 54 41 -94.24 gain 41 55 -99.07 gain 55 41 -98.39 gain 41 56 -97.11 gain 56 41 -103.76 gain 41 57 -105.76 gain 57 41 -106.29 gain 41 58 -105.46 gain 58 41 -108.73 gain 41 59 -111.39 gain 59 41 -110.78 gain 41 60 -124.77 gain 60 41 -125.48 gain 41 61 -125.89 gain 61 41 -125.36 gain 41 62 -122.33 gain 62 41 -127.01 gain 41 63 -115.27 gain 63 41 -113.18 gain 41 64 -115.47 gain 64 41 -116.35 gain 41 65 -115.28 gain 65 41 -118.26 gain 41 66 -118.73 gain 66 41 -115.96 gain 41 67 -116.50 gain 67 41 -116.00 gain 41 68 -109.80 gain 68 41 -113.86 gain 41 69 -107.72 gain 69 41 -109.08 gain 41 70 -100.33 gain 70 41 -101.44 gain 41 71 -102.40 gain 71 41 -101.61 gain 41 72 -104.44 gain 72 41 -104.07 gain 41 73 -112.86 gain 73 41 -110.88 gain 41 74 -110.97 gain 74 41 -112.87 gain 41 75 -124.36 gain 75 41 -126.40 gain 41 76 -114.70 gain 76 41 -112.69 gain 41 77 -120.49 gain 77 41 -122.14 gain 41 78 -121.04 gain 78 41 -125.54 gain 41 79 -117.29 gain 79 41 -116.57 gain 41 80 -116.58 gain 80 41 -116.37 gain 41 81 -120.67 gain 81 41 -121.05 gain 41 82 -117.79 gain 82 41 -115.79 gain 41 83 -111.48 gain 83 41 -110.52 gain 41 84 -102.90 gain 84 41 -102.09 gain 41 85 -107.68 gain 85 41 -103.67 gain 41 86 -110.29 gain 86 41 -109.67 gain 41 87 -105.72 gain 87 41 -109.06 gain 41 88 -105.19 gain 88 41 -106.28 gain 41 89 -102.88 gain 89 41 -102.57 gain 41 90 -132.69 gain 90 41 -129.39 gain 41 91 -125.85 gain 91 41 -126.50 gain 41 92 -124.32 gain 92 41 -121.92 gain 41 93 -118.51 gain 93 41 -120.90 gain 41 94 -121.72 gain 94 41 -123.98 gain 41 95 -113.65 gain 95 41 -118.17 gain 41 96 -110.89 gain 96 41 -112.75 gain 41 97 -112.97 gain 97 41 -113.57 gain 41 98 -114.48 gain 98 41 -115.88 gain 41 99 -114.04 gain 99 41 -113.26 gain 41 100 -112.91 gain 100 41 -111.69 gain 41 101 -112.01 gain 101 41 -110.96 gain 41 102 -110.91 gain 102 41 -110.64 gain 41 103 -113.75 gain 103 41 -110.97 gain 41 104 -115.26 gain 104 41 -117.85 gain 41 105 -127.20 gain 105 41 -125.73 gain 41 106 -126.13 gain 106 41 -125.74 gain 41 107 -119.82 gain 107 41 -126.01 gain 41 108 -121.24 gain 108 41 -119.74 gain 41 109 -119.32 gain 109 41 -121.31 gain 41 110 -121.43 gain 110 41 -121.89 gain 41 111 -120.75 gain 111 41 -120.89 gain 41 112 -117.72 gain 112 41 -116.74 gain 41 113 -115.68 gain 113 41 -113.50 gain 41 114 -109.16 gain 114 41 -110.28 gain 41 115 -116.73 gain 115 41 -112.16 gain 41 116 -115.07 gain 116 41 -118.05 gain 41 117 -110.57 gain 117 41 -115.04 gain 41 118 -110.93 gain 118 41 -113.72 gain 41 119 -109.88 gain 119 41 -107.34 gain 41 120 -124.96 gain 120 41 -126.93 gain 41 121 -127.44 gain 121 41 -128.70 gain 41 122 -126.09 gain 122 41 -129.47 gain 41 123 -119.91 gain 123 41 -124.06 gain 41 124 -123.95 gain 124 41 -124.51 gain 41 125 -120.78 gain 125 41 -122.68 gain 41 126 -118.51 gain 126 41 -118.36 gain 41 127 -117.42 gain 127 41 -120.73 gain 41 128 -122.80 gain 128 41 -124.05 gain 41 129 -114.55 gain 129 41 -113.71 gain 41 130 -119.69 gain 130 41 -116.68 gain 41 131 -113.60 gain 131 41 -117.67 gain 41 132 -120.95 gain 132 41 -124.65 gain 41 133 -118.81 gain 133 41 -120.58 gain 41 134 -111.16 gain 134 41 -109.63 gain 41 135 -122.40 gain 135 41 -124.44 gain 41 136 -129.08 gain 136 41 -131.73 gain 41 137 -121.71 gain 137 41 -121.84 gain 41 138 -122.90 gain 138 41 -122.04 gain 41 139 -117.92 gain 139 41 -118.04 gain 41 140 -122.59 gain 140 41 -125.31 gain 41 141 -119.65 gain 141 41 -121.04 gain 41 142 -121.62 gain 142 41 -122.33 gain 41 143 -115.49 gain 143 41 -115.81 gain 41 144 -115.75 gain 144 41 -117.09 gain 41 145 -119.00 gain 145 41 -118.79 gain 41 146 -120.77 gain 146 41 -119.47 gain 41 147 -109.23 gain 147 41 -105.01 gain 41 148 -121.85 gain 148 41 -117.35 gain 41 149 -113.39 gain 149 41 -112.06 gain 41 150 -119.78 gain 150 41 -121.14 gain 41 151 -121.24 gain 151 41 -122.79 gain 41 152 -125.65 gain 152 41 -124.18 gain 41 153 -121.24 gain 153 41 -117.35 gain 41 154 -119.94 gain 154 41 -124.60 gain 41 155 -123.01 gain 155 41 -127.56 gain 41 156 -124.86 gain 156 41 -123.80 gain 41 157 -125.40 gain 157 41 -127.29 gain 41 158 -112.93 gain 158 41 -117.41 gain 41 159 -122.05 gain 159 41 -123.14 gain 41 160 -117.53 gain 160 41 -115.74 gain 41 161 -125.13 gain 161 41 -126.83 gain 41 162 -115.10 gain 162 41 -115.66 gain 41 163 -121.04 gain 163 41 -123.75 gain 41 164 -119.41 gain 164 41 -123.16 gain 41 165 -130.43 gain 165 41 -130.22 gain 41 166 -118.94 gain 166 41 -120.31 gain 41 167 -127.69 gain 167 41 -131.14 gain 41 168 -122.27 gain 168 41 -124.17 gain 41 169 -125.86 gain 169 41 -131.96 gain 41 170 -118.02 gain 170 41 -115.64 gain 41 171 -122.05 gain 171 41 -124.71 gain 41 172 -127.58 gain 172 41 -124.93 gain 41 173 -118.58 gain 173 41 -115.36 gain 41 174 -120.39 gain 174 41 -121.47 gain 41 175 -120.01 gain 175 41 -124.65 gain 41 176 -114.54 gain 176 41 -111.18 gain 41 177 -119.97 gain 177 41 -124.43 gain 41 178 -122.87 gain 178 41 -123.15 gain 41 179 -122.15 gain 179 41 -120.83 gain 41 180 -128.61 gain 180 41 -128.75 gain 41 181 -136.78 gain 181 41 -137.00 gain 41 182 -127.46 gain 182 41 -130.05 gain 41 183 -124.98 gain 183 41 -120.97 gain 41 184 -127.35 gain 184 41 -128.12 gain 41 185 -124.11 gain 185 41 -122.37 gain 41 186 -120.36 gain 186 41 -118.90 gain 41 187 -125.17 gain 187 41 -126.25 gain 41 188 -122.65 gain 188 41 -126.99 gain 41 189 -121.23 gain 189 41 -123.08 gain 41 190 -120.30 gain 190 41 -119.17 gain 41 191 -124.20 gain 191 41 -124.16 gain 41 192 -121.34 gain 192 41 -124.17 gain 41 193 -120.32 gain 193 41 -124.40 gain 41 194 -127.12 gain 194 41 -125.01 gain 41 195 -128.18 gain 195 41 -126.70 gain 41 196 -126.09 gain 196 41 -128.65 gain 41 197 -126.85 gain 197 41 -125.47 gain 41 198 -132.99 gain 198 41 -131.14 gain 41 199 -125.71 gain 199 41 -127.77 gain 41 200 -120.74 gain 200 41 -119.74 gain 41 201 -120.53 gain 201 41 -120.33 gain 41 202 -120.30 gain 202 41 -124.11 gain 41 203 -132.37 gain 203 41 -135.80 gain 41 204 -123.66 gain 204 41 -124.37 gain 41 205 -130.78 gain 205 41 -130.56 gain 41 206 -112.25 gain 206 41 -116.55 gain 41 207 -121.85 gain 207 41 -118.51 gain 41 208 -131.43 gain 208 41 -133.87 gain 41 209 -125.83 gain 209 41 -129.26 gain 41 210 -130.63 gain 210 41 -131.00 gain 41 211 -130.96 gain 211 41 -133.35 gain 41 212 -131.91 gain 212 41 -132.84 gain 41 213 -132.14 gain 213 41 -132.27 gain 41 214 -124.71 gain 214 41 -124.73 gain 41 215 -128.29 gain 215 41 -124.72 gain 41 216 -127.80 gain 216 41 -128.89 gain 41 217 -124.53 gain 217 41 -126.14 gain 41 218 -126.52 gain 218 41 -130.32 gain 41 219 -128.94 gain 219 41 -124.10 gain 41 220 -127.21 gain 220 41 -132.86 gain 41 221 -125.66 gain 221 41 -126.95 gain 41 222 -126.90 gain 222 41 -128.52 gain 41 223 -128.24 gain 223 41 -128.47 gain 41 224 -123.58 gain 224 41 -126.49 gain 42 43 -95.19 gain 43 42 -99.08 gain 42 44 -106.95 gain 44 42 -113.90 gain 42 45 -127.26 gain 45 42 -132.68 gain 42 46 -116.15 gain 46 42 -117.37 gain 42 47 -123.08 gain 47 42 -125.36 gain 42 48 -126.56 gain 48 42 -126.62 gain 42 49 -110.49 gain 49 42 -118.53 gain 42 50 -116.75 gain 50 42 -125.76 gain 42 51 -119.76 gain 51 42 -123.90 gain 42 52 -119.38 gain 52 42 -119.54 gain 42 53 -110.20 gain 53 42 -111.37 gain 42 54 -110.28 gain 54 42 -112.16 gain 42 55 -104.70 gain 55 42 -105.87 gain 42 56 -93.64 gain 56 42 -102.14 gain 42 57 -89.16 gain 57 42 -91.54 gain 42 58 -96.83 gain 58 42 -101.95 gain 42 59 -104.51 gain 59 42 -105.76 gain 42 60 -128.89 gain 60 42 -131.45 gain 42 61 -121.69 gain 61 42 -123.00 gain 42 62 -118.43 gain 62 42 -124.97 gain 42 63 -124.36 gain 63 42 -124.12 gain 42 64 -111.95 gain 64 42 -114.69 gain 42 65 -121.77 gain 65 42 -126.59 gain 42 66 -118.67 gain 66 42 -117.75 gain 42 67 -107.87 gain 67 42 -109.22 gain 42 68 -111.47 gain 68 42 -117.38 gain 42 69 -101.27 gain 69 42 -104.48 gain 42 70 -102.49 gain 70 42 -105.46 gain 42 71 -102.26 gain 71 42 -103.32 gain 42 72 -103.60 gain 72 42 -105.08 gain 42 73 -100.37 gain 73 42 -100.24 gain 42 74 -108.05 gain 74 42 -111.80 gain 42 75 -118.38 gain 75 42 -122.27 gain 42 76 -125.45 gain 76 42 -125.29 gain 42 77 -120.47 gain 77 42 -123.98 gain 42 78 -117.55 gain 78 42 -123.90 gain 42 79 -113.63 gain 79 42 -114.77 gain 42 80 -117.33 gain 80 42 -118.97 gain 42 81 -119.08 gain 81 42 -121.31 gain 42 82 -112.37 gain 82 42 -112.23 gain 42 83 -111.38 gain 83 42 -112.28 gain 42 84 -109.98 gain 84 42 -111.02 gain 42 85 -111.37 gain 85 42 -109.21 gain 42 86 -114.75 gain 86 42 -115.98 gain 42 87 -105.19 gain 87 42 -110.38 gain 42 88 -108.16 gain 88 42 -111.10 gain 42 89 -107.84 gain 89 42 -109.38 gain 42 90 -118.07 gain 90 42 -116.62 gain 42 91 -128.94 gain 91 42 -131.43 gain 42 92 -124.74 gain 92 42 -124.20 gain 42 93 -117.51 gain 93 42 -121.75 gain 42 94 -114.64 gain 94 42 -118.76 gain 42 95 -116.72 gain 95 42 -123.09 gain 42 96 -121.77 gain 96 42 -125.48 gain 42 97 -118.45 gain 97 42 -120.91 gain 42 98 -115.85 gain 98 42 -119.10 gain 42 99 -114.19 gain 99 42 -115.26 gain 42 100 -110.40 gain 100 42 -111.03 gain 42 101 -112.66 gain 101 42 -113.46 gain 42 102 -107.90 gain 102 42 -109.48 gain 42 103 -108.94 gain 103 42 -108.01 gain 42 104 -104.29 gain 104 42 -108.73 gain 42 105 -126.07 gain 105 42 -126.46 gain 42 106 -126.36 gain 106 42 -127.82 gain 42 107 -118.20 gain 107 42 -126.23 gain 42 108 -122.20 gain 108 42 -122.55 gain 42 109 -121.48 gain 109 42 -125.32 gain 42 110 -118.79 gain 110 42 -121.10 gain 42 111 -118.36 gain 111 42 -120.35 gain 42 112 -118.02 gain 112 42 -118.89 gain 42 113 -119.15 gain 113 42 -118.83 gain 42 114 -112.64 gain 114 42 -115.62 gain 42 115 -113.58 gain 115 42 -110.86 gain 42 116 -110.83 gain 116 42 -115.65 gain 42 117 -111.70 gain 117 42 -118.02 gain 42 118 -120.70 gain 118 42 -125.34 gain 42 119 -115.29 gain 119 42 -114.60 gain 42 120 -118.36 gain 120 42 -122.18 gain 42 121 -126.44 gain 121 42 -129.55 gain 42 122 -133.96 gain 122 42 -139.19 gain 42 123 -112.23 gain 123 42 -118.23 gain 42 124 -125.26 gain 124 42 -127.67 gain 42 125 -119.21 gain 125 42 -122.95 gain 42 126 -113.54 gain 126 42 -115.24 gain 42 127 -121.59 gain 127 42 -126.76 gain 42 128 -120.57 gain 128 42 -123.68 gain 42 129 -117.40 gain 129 42 -118.41 gain 42 130 -118.55 gain 130 42 -117.39 gain 42 131 -103.92 gain 131 42 -109.84 gain 42 132 -111.32 gain 132 42 -116.87 gain 42 133 -119.38 gain 133 42 -123.00 gain 42 134 -116.21 gain 134 42 -116.53 gain 42 135 -129.29 gain 135 42 -133.18 gain 42 136 -129.82 gain 136 42 -134.32 gain 42 137 -123.70 gain 137 42 -125.69 gain 42 138 -121.94 gain 138 42 -122.92 gain 42 139 -122.47 gain 139 42 -124.44 gain 42 140 -122.69 gain 140 42 -127.26 gain 42 141 -120.99 gain 141 42 -124.23 gain 42 142 -120.98 gain 142 42 -123.54 gain 42 143 -114.47 gain 143 42 -116.65 gain 42 144 -118.65 gain 144 42 -121.84 gain 42 145 -109.44 gain 145 42 -111.07 gain 42 146 -114.60 gain 146 42 -115.14 gain 42 147 -119.85 gain 147 42 -117.49 gain 42 148 -107.41 gain 148 42 -104.77 gain 42 149 -116.28 gain 149 42 -116.80 gain 42 150 -132.86 gain 150 42 -136.06 gain 42 151 -124.14 gain 151 42 -127.54 gain 42 152 -123.67 gain 152 42 -124.05 gain 42 153 -124.48 gain 153 42 -122.44 gain 42 154 -124.13 gain 154 42 -130.64 gain 42 155 -116.47 gain 155 42 -122.87 gain 42 156 -119.21 gain 156 42 -120.00 gain 42 157 -119.61 gain 157 42 -123.35 gain 42 158 -125.45 gain 158 42 -131.78 gain 42 159 -115.85 gain 159 42 -118.80 gain 42 160 -125.74 gain 160 42 -125.80 gain 42 161 -119.04 gain 161 42 -122.59 gain 42 162 -126.75 gain 162 42 -129.17 gain 42 163 -115.75 gain 163 42 -120.31 gain 42 164 -118.22 gain 164 42 -123.83 gain 42 165 -121.90 gain 165 42 -123.55 gain 42 166 -129.19 gain 166 42 -132.40 gain 42 167 -128.87 gain 167 42 -134.17 gain 42 168 -119.87 gain 168 42 -123.62 gain 42 169 -123.95 gain 169 42 -131.91 gain 42 170 -120.89 gain 170 42 -120.37 gain 42 171 -125.10 gain 171 42 -129.60 gain 42 172 -122.88 gain 172 42 -122.08 gain 42 173 -118.21 gain 173 42 -116.85 gain 42 174 -118.54 gain 174 42 -121.47 gain 42 175 -121.64 gain 175 42 -128.13 gain 42 176 -109.29 gain 176 42 -107.79 gain 42 177 -120.90 gain 177 42 -127.21 gain 42 178 -114.63 gain 178 42 -116.77 gain 42 179 -119.11 gain 179 42 -119.63 gain 42 180 -126.56 gain 180 42 -128.55 gain 42 181 -123.07 gain 181 42 -125.13 gain 42 182 -124.12 gain 182 42 -128.57 gain 42 183 -119.88 gain 183 42 -117.71 gain 42 184 -124.16 gain 184 42 -126.78 gain 42 185 -119.70 gain 185 42 -119.80 gain 42 186 -126.20 gain 186 42 -126.59 gain 42 187 -124.49 gain 187 42 -127.42 gain 42 188 -121.31 gain 188 42 -127.50 gain 42 189 -129.06 gain 189 42 -132.77 gain 42 190 -121.93 gain 190 42 -122.65 gain 42 191 -118.21 gain 191 42 -120.02 gain 42 192 -122.21 gain 192 42 -126.89 gain 42 193 -125.11 gain 193 42 -131.04 gain 42 194 -119.22 gain 194 42 -118.96 gain 42 195 -122.68 gain 195 42 -123.05 gain 42 196 -126.55 gain 196 42 -130.96 gain 42 197 -123.15 gain 197 42 -123.62 gain 42 198 -126.66 gain 198 42 -126.65 gain 42 199 -128.60 gain 199 42 -132.51 gain 42 200 -124.31 gain 200 42 -125.15 gain 42 201 -123.27 gain 201 42 -124.93 gain 42 202 -120.20 gain 202 42 -125.86 gain 42 203 -119.76 gain 203 42 -125.03 gain 42 204 -127.31 gain 204 42 -129.87 gain 42 205 -118.02 gain 205 42 -119.65 gain 42 206 -128.49 gain 206 42 -134.64 gain 42 207 -126.01 gain 207 42 -124.52 gain 42 208 -122.04 gain 208 42 -126.33 gain 42 209 -122.11 gain 209 42 -127.39 gain 42 210 -127.68 gain 210 42 -129.90 gain 42 211 -124.67 gain 211 42 -128.92 gain 42 212 -123.09 gain 212 42 -125.87 gain 42 213 -123.71 gain 213 42 -125.69 gain 42 214 -129.49 gain 214 42 -131.36 gain 42 215 -127.15 gain 215 42 -125.43 gain 42 216 -129.80 gain 216 42 -132.74 gain 42 217 -124.69 gain 217 42 -128.15 gain 42 218 -128.02 gain 218 42 -133.67 gain 42 219 -117.13 gain 219 42 -114.14 gain 42 220 -123.08 gain 220 42 -130.57 gain 42 221 -126.38 gain 221 42 -129.52 gain 42 222 -131.69 gain 222 42 -135.16 gain 42 223 -124.73 gain 223 42 -126.81 gain 42 224 -122.34 gain 224 42 -127.11 gain 43 44 -91.03 gain 44 43 -94.09 gain 43 45 -125.16 gain 45 43 -126.69 gain 43 46 -124.52 gain 46 43 -121.85 gain 43 47 -119.66 gain 47 43 -118.04 gain 43 48 -120.98 gain 48 43 -117.16 gain 43 49 -127.01 gain 49 43 -131.16 gain 43 50 -111.19 gain 50 43 -116.31 gain 43 51 -114.68 gain 51 43 -114.93 gain 43 52 -110.56 gain 52 43 -106.84 gain 43 53 -121.38 gain 53 43 -118.67 gain 43 54 -117.57 gain 54 43 -115.56 gain 43 55 -107.68 gain 55 43 -104.97 gain 43 56 -110.06 gain 56 43 -114.67 gain 43 57 -106.26 gain 57 43 -104.75 gain 43 58 -94.96 gain 58 43 -96.19 gain 43 59 -103.45 gain 59 43 -100.81 gain 43 60 -121.01 gain 60 43 -119.68 gain 43 61 -128.19 gain 61 43 -125.62 gain 43 62 -128.84 gain 62 43 -131.49 gain 43 63 -122.99 gain 63 43 -118.87 gain 43 64 -134.67 gain 64 43 -133.51 gain 43 65 -124.87 gain 65 43 -125.80 gain 43 66 -119.43 gain 66 43 -114.62 gain 43 67 -123.67 gain 67 43 -121.13 gain 43 68 -113.37 gain 68 43 -115.40 gain 43 69 -113.38 gain 69 43 -112.69 gain 43 70 -109.65 gain 70 43 -108.72 gain 43 71 -103.24 gain 71 43 -100.42 gain 43 72 -97.74 gain 72 43 -95.34 gain 43 73 -102.77 gain 73 43 -98.75 gain 43 74 -106.91 gain 74 43 -106.77 gain 43 75 -128.12 gain 75 43 -128.12 gain 43 76 -122.58 gain 76 43 -118.53 gain 43 77 -126.21 gain 77 43 -125.83 gain 43 78 -125.59 gain 78 43 -128.06 gain 43 79 -121.39 gain 79 43 -118.64 gain 43 80 -122.90 gain 80 43 -120.65 gain 43 81 -113.26 gain 81 43 -111.60 gain 43 82 -120.51 gain 82 43 -116.48 gain 43 83 -119.56 gain 83 43 -116.56 gain 43 84 -110.68 gain 84 43 -107.83 gain 43 85 -113.21 gain 85 43 -107.16 gain 43 86 -107.88 gain 86 43 -105.22 gain 43 87 -105.60 gain 87 43 -106.90 gain 43 88 -104.94 gain 88 43 -103.99 gain 43 89 -105.90 gain 89 43 -103.55 gain 43 90 -125.58 gain 90 43 -120.24 gain 43 91 -126.36 gain 91 43 -124.97 gain 43 92 -129.31 gain 92 43 -124.88 gain 43 93 -131.82 gain 93 43 -132.17 gain 43 94 -123.56 gain 94 43 -123.79 gain 43 95 -127.61 gain 95 43 -130.09 gain 43 96 -123.60 gain 96 43 -123.42 gain 43 97 -128.69 gain 97 43 -127.25 gain 43 98 -121.38 gain 98 43 -120.75 gain 43 99 -116.17 gain 99 43 -113.35 gain 43 100 -115.89 gain 100 43 -112.64 gain 43 101 -113.03 gain 101 43 -109.94 gain 43 102 -111.98 gain 102 43 -109.68 gain 43 103 -108.89 gain 103 43 -104.07 gain 43 104 -112.23 gain 104 43 -112.78 gain 43 105 -128.93 gain 105 43 -125.42 gain 43 106 -126.60 gain 106 43 -124.18 gain 43 107 -123.63 gain 107 43 -127.78 gain 43 108 -124.09 gain 108 43 -120.55 gain 43 109 -126.20 gain 109 43 -126.15 gain 43 110 -127.40 gain 110 43 -125.83 gain 43 111 -122.57 gain 111 43 -120.67 gain 43 112 -119.68 gain 112 43 -116.66 gain 43 113 -122.56 gain 113 43 -118.35 gain 43 114 -120.71 gain 114 43 -119.80 gain 43 115 -119.57 gain 115 43 -112.96 gain 43 116 -117.11 gain 116 43 -118.04 gain 43 117 -121.84 gain 117 43 -124.28 gain 43 118 -119.83 gain 118 43 -120.59 gain 43 119 -118.83 gain 119 43 -114.24 gain 43 120 -129.90 gain 120 43 -129.84 gain 43 121 -135.37 gain 121 43 -134.59 gain 43 122 -133.05 gain 122 43 -134.39 gain 43 123 -125.07 gain 123 43 -127.19 gain 43 124 -133.29 gain 124 43 -131.82 gain 43 125 -122.87 gain 125 43 -122.73 gain 43 126 -128.98 gain 126 43 -126.80 gain 43 127 -121.47 gain 127 43 -122.74 gain 43 128 -125.55 gain 128 43 -124.76 gain 43 129 -107.54 gain 129 43 -104.67 gain 43 130 -114.64 gain 130 43 -109.59 gain 43 131 -120.71 gain 131 43 -122.75 gain 43 132 -123.83 gain 132 43 -125.49 gain 43 133 -114.56 gain 133 43 -114.29 gain 43 134 -115.93 gain 134 43 -112.37 gain 43 135 -129.64 gain 135 43 -129.64 gain 43 136 -130.02 gain 136 43 -130.63 gain 43 137 -122.28 gain 137 43 -120.38 gain 43 138 -125.67 gain 138 43 -122.76 gain 43 139 -132.28 gain 139 43 -130.36 gain 43 140 -121.65 gain 140 43 -122.34 gain 43 141 -128.83 gain 141 43 -128.19 gain 43 142 -122.92 gain 142 43 -121.58 gain 43 143 -124.83 gain 143 43 -123.11 gain 43 144 -122.08 gain 144 43 -121.38 gain 43 145 -118.50 gain 145 43 -116.25 gain 43 146 -120.09 gain 146 43 -116.75 gain 43 147 -122.07 gain 147 43 -115.82 gain 43 148 -120.57 gain 148 43 -114.03 gain 43 149 -116.01 gain 149 43 -112.64 gain 43 150 -130.71 gain 150 43 -130.03 gain 43 151 -136.05 gain 151 43 -135.57 gain 43 152 -130.36 gain 152 43 -126.85 gain 43 153 -126.32 gain 153 43 -120.39 gain 43 154 -125.75 gain 154 43 -128.37 gain 43 155 -124.83 gain 155 43 -127.35 gain 43 156 -127.58 gain 156 43 -124.48 gain 43 157 -120.59 gain 157 43 -120.44 gain 43 158 -120.80 gain 158 43 -123.24 gain 43 159 -123.98 gain 159 43 -123.04 gain 43 160 -132.81 gain 160 43 -128.98 gain 43 161 -131.61 gain 161 43 -131.27 gain 43 162 -124.22 gain 162 43 -122.75 gain 43 163 -120.91 gain 163 43 -121.59 gain 43 164 -123.60 gain 164 43 -125.31 gain 43 165 -129.63 gain 165 43 -127.38 gain 43 166 -124.38 gain 166 43 -123.71 gain 43 167 -130.17 gain 167 43 -131.58 gain 43 168 -117.91 gain 168 43 -117.77 gain 43 169 -123.44 gain 169 43 -127.50 gain 43 170 -126.53 gain 170 43 -122.12 gain 43 171 -124.65 gain 171 43 -125.27 gain 43 172 -124.57 gain 172 43 -119.88 gain 43 173 -125.60 gain 173 43 -120.35 gain 43 174 -126.40 gain 174 43 -125.45 gain 43 175 -128.81 gain 175 43 -131.41 gain 43 176 -124.97 gain 176 43 -119.58 gain 43 177 -120.86 gain 177 43 -123.28 gain 43 178 -121.71 gain 178 43 -119.95 gain 43 179 -122.47 gain 179 43 -119.11 gain 43 180 -132.67 gain 180 43 -130.77 gain 43 181 -135.91 gain 181 43 -134.09 gain 43 182 -130.56 gain 182 43 -131.12 gain 43 183 -129.12 gain 183 43 -123.07 gain 43 184 -134.02 gain 184 43 -132.75 gain 43 185 -130.11 gain 185 43 -126.33 gain 43 186 -120.07 gain 186 43 -116.58 gain 43 187 -123.23 gain 187 43 -122.27 gain 43 188 -122.87 gain 188 43 -125.17 gain 43 189 -127.27 gain 189 43 -127.08 gain 43 190 -127.37 gain 190 43 -124.20 gain 43 191 -124.27 gain 191 43 -122.19 gain 43 192 -126.18 gain 192 43 -126.97 gain 43 193 -123.90 gain 193 43 -125.94 gain 43 194 -125.16 gain 194 43 -121.00 gain 43 195 -122.70 gain 195 43 -119.18 gain 43 196 -131.04 gain 196 43 -131.56 gain 43 197 -126.31 gain 197 43 -122.89 gain 43 198 -132.60 gain 198 43 -128.70 gain 43 199 -127.48 gain 199 43 -127.51 gain 43 200 -125.67 gain 200 43 -122.63 gain 43 201 -130.95 gain 201 43 -128.72 gain 43 202 -130.79 gain 202 43 -132.55 gain 43 203 -128.45 gain 203 43 -129.84 gain 43 204 -124.27 gain 204 43 -122.94 gain 43 205 -124.34 gain 205 43 -122.08 gain 43 206 -123.10 gain 206 43 -125.36 gain 43 207 -124.21 gain 207 43 -118.84 gain 43 208 -117.29 gain 208 43 -117.69 gain 43 209 -120.91 gain 209 43 -122.31 gain 43 210 -132.81 gain 210 43 -131.14 gain 43 211 -133.81 gain 211 43 -134.17 gain 43 212 -131.77 gain 212 43 -130.67 gain 43 213 -132.05 gain 213 43 -130.14 gain 43 214 -128.93 gain 214 43 -126.91 gain 43 215 -130.25 gain 215 43 -124.64 gain 43 216 -137.13 gain 216 43 -136.18 gain 43 217 -122.82 gain 217 43 -122.39 gain 43 218 -130.01 gain 218 43 -131.77 gain 43 219 -128.43 gain 219 43 -121.55 gain 43 220 -128.66 gain 220 43 -132.27 gain 43 221 -134.18 gain 221 43 -133.43 gain 43 222 -129.48 gain 222 43 -129.06 gain 43 223 -125.57 gain 223 43 -123.76 gain 43 224 -126.07 gain 224 43 -126.95 gain 44 45 -140.01 gain 45 44 -138.49 gain 44 46 -137.23 gain 46 44 -131.49 gain 44 47 -130.34 gain 47 44 -125.67 gain 44 48 -136.26 gain 48 44 -129.37 gain 44 49 -130.45 gain 49 44 -131.54 gain 44 50 -124.77 gain 50 44 -126.83 gain 44 51 -122.55 gain 51 44 -119.75 gain 44 52 -130.73 gain 52 44 -123.94 gain 44 53 -115.38 gain 53 44 -109.61 gain 44 54 -118.33 gain 54 44 -113.26 gain 44 55 -121.17 gain 55 44 -115.40 gain 44 56 -108.84 gain 56 44 -110.40 gain 44 57 -111.21 gain 57 44 -106.64 gain 44 58 -103.64 gain 58 44 -101.81 gain 44 59 -101.16 gain 59 44 -95.45 gain 44 60 -129.06 gain 60 44 -124.68 gain 44 61 -123.99 gain 61 44 -118.35 gain 44 62 -133.08 gain 62 44 -132.66 gain 44 63 -122.20 gain 63 44 -115.01 gain 44 64 -131.51 gain 64 44 -127.29 gain 44 65 -123.24 gain 65 44 -121.11 gain 44 66 -124.65 gain 66 44 -116.78 gain 44 67 -127.97 gain 67 44 -122.38 gain 44 68 -126.65 gain 68 44 -125.61 gain 44 69 -122.09 gain 69 44 -118.34 gain 44 70 -122.41 gain 70 44 -118.42 gain 44 71 -122.51 gain 71 44 -116.63 gain 44 72 -109.01 gain 72 44 -103.54 gain 44 73 -113.01 gain 73 44 -105.93 gain 44 74 -109.12 gain 74 44 -105.93 gain 44 75 -133.15 gain 75 44 -130.09 gain 44 76 -134.99 gain 76 44 -127.88 gain 44 77 -135.76 gain 77 44 -132.32 gain 44 78 -128.49 gain 78 44 -127.90 gain 44 79 -131.61 gain 79 44 -125.79 gain 44 80 -129.95 gain 80 44 -124.64 gain 44 81 -121.48 gain 81 44 -116.76 gain 44 82 -121.22 gain 82 44 -114.12 gain 44 83 -123.84 gain 83 44 -117.78 gain 44 84 -119.83 gain 84 44 -113.92 gain 44 85 -119.03 gain 85 44 -109.93 gain 44 86 -118.09 gain 86 44 -112.37 gain 44 87 -111.29 gain 87 44 -109.53 gain 44 88 -116.44 gain 88 44 -112.43 gain 44 89 -116.73 gain 89 44 -111.32 gain 44 90 -134.97 gain 90 44 -126.57 gain 44 91 -131.87 gain 91 44 -127.41 gain 44 92 -126.67 gain 92 44 -119.18 gain 44 93 -128.41 gain 93 44 -125.70 gain 44 94 -137.76 gain 94 44 -134.93 gain 44 95 -128.29 gain 95 44 -127.71 gain 44 96 -123.37 gain 96 44 -120.13 gain 44 97 -122.71 gain 97 44 -118.21 gain 44 98 -125.74 gain 98 44 -122.04 gain 44 99 -119.73 gain 99 44 -113.86 gain 44 100 -122.73 gain 100 44 -116.42 gain 44 101 -122.93 gain 101 44 -116.78 gain 44 102 -115.28 gain 102 44 -109.91 gain 44 103 -122.62 gain 103 44 -114.74 gain 44 104 -114.81 gain 104 44 -112.30 gain 44 105 -138.78 gain 105 44 -132.21 gain 44 106 -129.98 gain 106 44 -124.49 gain 44 107 -130.08 gain 107 44 -131.16 gain 44 108 -122.62 gain 108 44 -116.02 gain 44 109 -130.18 gain 109 44 -127.07 gain 44 110 -127.76 gain 110 44 -123.12 gain 44 111 -130.30 gain 111 44 -125.34 gain 44 112 -129.47 gain 112 44 -123.39 gain 44 113 -123.47 gain 113 44 -116.20 gain 44 114 -131.51 gain 114 44 -127.54 gain 44 115 -107.33 gain 115 44 -97.66 gain 44 116 -118.13 gain 116 44 -116.01 gain 44 117 -120.49 gain 117 44 -119.86 gain 44 118 -123.33 gain 118 44 -121.02 gain 44 119 -115.56 gain 119 44 -107.92 gain 44 120 -139.13 gain 120 44 -136.00 gain 44 121 -133.66 gain 121 44 -129.82 gain 44 122 -130.43 gain 122 44 -128.70 gain 44 123 -129.50 gain 123 44 -128.55 gain 44 124 -122.13 gain 124 44 -117.60 gain 44 125 -127.21 gain 125 44 -124.01 gain 44 126 -130.06 gain 126 44 -124.82 gain 44 127 -125.40 gain 127 44 -123.61 gain 44 128 -125.15 gain 128 44 -121.31 gain 44 129 -134.92 gain 129 44 -128.98 gain 44 130 -135.74 gain 130 44 -127.63 gain 44 131 -120.02 gain 131 44 -119.00 gain 44 132 -117.82 gain 132 44 -116.42 gain 44 133 -123.00 gain 133 44 -119.67 gain 44 134 -121.33 gain 134 44 -114.70 gain 44 135 -130.62 gain 135 44 -127.56 gain 44 136 -141.99 gain 136 44 -139.54 gain 44 137 -125.19 gain 137 44 -120.23 gain 44 138 -132.10 gain 138 44 -126.13 gain 44 139 -121.16 gain 139 44 -116.18 gain 44 140 -130.22 gain 140 44 -127.85 gain 44 141 -132.01 gain 141 44 -128.31 gain 44 142 -126.09 gain 142 44 -121.70 gain 44 143 -121.71 gain 143 44 -116.93 gain 44 144 -127.85 gain 144 44 -124.09 gain 44 145 -123.12 gain 145 44 -117.81 gain 44 146 -121.78 gain 146 44 -115.38 gain 44 147 -122.92 gain 147 44 -113.60 gain 44 148 -123.14 gain 148 44 -113.54 gain 44 149 -118.01 gain 149 44 -111.58 gain 44 150 -138.21 gain 150 44 -134.46 gain 44 151 -126.69 gain 151 44 -123.14 gain 44 152 -128.52 gain 152 44 -121.95 gain 44 153 -133.28 gain 153 44 -124.29 gain 44 154 -129.70 gain 154 44 -129.26 gain 44 155 -129.09 gain 155 44 -128.55 gain 44 156 -129.32 gain 156 44 -123.16 gain 44 157 -130.23 gain 157 44 -127.01 gain 44 158 -132.60 gain 158 44 -131.98 gain 44 159 -131.13 gain 159 44 -127.13 gain 44 160 -136.44 gain 160 44 -129.55 gain 44 161 -131.03 gain 161 44 -127.63 gain 44 162 -127.65 gain 162 44 -123.12 gain 44 163 -127.52 gain 163 44 -125.14 gain 44 164 -124.87 gain 164 44 -123.53 gain 44 165 -134.58 gain 165 44 -129.27 gain 44 166 -129.40 gain 166 44 -125.67 gain 44 167 -137.66 gain 167 44 -136.02 gain 44 168 -134.60 gain 168 44 -131.40 gain 44 169 -133.70 gain 169 44 -134.71 gain 44 170 -125.82 gain 170 44 -118.35 gain 44 171 -132.83 gain 171 44 -130.38 gain 44 172 -132.63 gain 172 44 -124.88 gain 44 173 -128.27 gain 173 44 -119.95 gain 44 174 -126.96 gain 174 44 -122.94 gain 44 175 -126.78 gain 175 44 -126.31 gain 44 176 -131.00 gain 176 44 -122.55 gain 44 177 -127.39 gain 177 44 -126.75 gain 44 178 -122.51 gain 178 44 -117.69 gain 44 179 -132.67 gain 179 44 -126.25 gain 44 180 -132.76 gain 180 44 -127.81 gain 44 181 -139.66 gain 181 44 -134.77 gain 44 182 -140.35 gain 182 44 -137.85 gain 44 183 -135.12 gain 183 44 -126.01 gain 44 184 -134.74 gain 184 44 -130.42 gain 44 185 -134.46 gain 185 44 -127.62 gain 44 186 -137.83 gain 186 44 -131.27 gain 44 187 -132.15 gain 187 44 -128.13 gain 44 188 -129.26 gain 188 44 -128.50 gain 44 189 -128.88 gain 189 44 -125.63 gain 44 190 -131.78 gain 190 44 -125.55 gain 44 191 -128.16 gain 191 44 -123.02 gain 44 192 -133.66 gain 192 44 -131.39 gain 44 193 -117.22 gain 193 44 -116.20 gain 44 194 -126.84 gain 194 44 -119.63 gain 44 195 -133.58 gain 195 44 -127.00 gain 44 196 -130.86 gain 196 44 -128.32 gain 44 197 -134.52 gain 197 44 -128.04 gain 44 198 -131.89 gain 198 44 -124.93 gain 44 199 -129.10 gain 199 44 -126.06 gain 44 200 -137.08 gain 200 44 -130.98 gain 44 201 -130.73 gain 201 44 -125.43 gain 44 202 -136.30 gain 202 44 -135.01 gain 44 203 -127.76 gain 203 44 -126.09 gain 44 204 -132.05 gain 204 44 -127.66 gain 44 205 -133.36 gain 205 44 -128.04 gain 44 206 -122.84 gain 206 44 -122.04 gain 44 207 -137.91 gain 207 44 -129.48 gain 44 208 -127.10 gain 208 44 -124.45 gain 44 209 -135.10 gain 209 44 -133.44 gain 44 210 -136.69 gain 210 44 -131.96 gain 44 211 -134.45 gain 211 44 -131.74 gain 44 212 -133.34 gain 212 44 -129.17 gain 44 213 -133.88 gain 213 44 -128.90 gain 44 214 -124.43 gain 214 44 -119.35 gain 44 215 -134.05 gain 215 44 -125.38 gain 44 216 -127.56 gain 216 44 -123.56 gain 44 217 -135.43 gain 217 44 -131.95 gain 44 218 -130.30 gain 218 44 -129.00 gain 44 219 -129.79 gain 219 44 -119.85 gain 44 220 -131.77 gain 220 44 -132.33 gain 44 221 -128.45 gain 221 44 -124.65 gain 44 222 -130.16 gain 222 44 -126.68 gain 44 223 -130.78 gain 223 44 -125.91 gain 44 224 -123.16 gain 224 44 -120.98 gain 45 46 -97.65 gain 46 45 -93.44 gain 45 47 -106.30 gain 47 45 -103.15 gain 45 48 -114.46 gain 48 45 -109.10 gain 45 49 -114.55 gain 49 45 -117.16 gain 45 50 -117.69 gain 50 45 -121.27 gain 45 51 -123.09 gain 51 45 -121.81 gain 45 52 -117.23 gain 52 45 -111.97 gain 45 53 -123.44 gain 53 45 -119.20 gain 45 54 -125.90 gain 54 45 -122.35 gain 45 55 -121.18 gain 55 45 -116.93 gain 45 56 -129.64 gain 56 45 -132.72 gain 45 57 -126.90 gain 57 45 -123.86 gain 45 58 -134.96 gain 58 45 -134.66 gain 45 59 -128.32 gain 59 45 -124.14 gain 45 60 -104.08 gain 60 45 -101.22 gain 45 61 -101.17 gain 61 45 -97.06 gain 45 62 -112.57 gain 62 45 -113.68 gain 45 63 -108.78 gain 63 45 -103.11 gain 45 64 -121.24 gain 64 45 -118.55 gain 45 65 -111.93 gain 65 45 -111.33 gain 45 66 -126.50 gain 66 45 -120.16 gain 45 67 -118.03 gain 67 45 -113.96 gain 45 68 -126.48 gain 68 45 -126.97 gain 45 69 -119.17 gain 69 45 -116.95 gain 45 70 -126.08 gain 70 45 -123.61 gain 45 71 -125.96 gain 71 45 -121.61 gain 45 72 -136.18 gain 72 45 -132.24 gain 45 73 -129.56 gain 73 45 -124.01 gain 45 74 -130.70 gain 74 45 -129.03 gain 45 75 -108.20 gain 75 45 -106.67 gain 45 76 -108.72 gain 76 45 -103.14 gain 45 77 -116.72 gain 77 45 -114.80 gain 45 78 -116.06 gain 78 45 -117.00 gain 45 79 -110.58 gain 79 45 -106.30 gain 45 80 -129.45 gain 80 45 -125.66 gain 45 81 -125.33 gain 81 45 -122.14 gain 45 82 -121.74 gain 82 45 -116.17 gain 45 83 -117.80 gain 83 45 -113.27 gain 45 84 -125.30 gain 84 45 -120.91 gain 45 85 -125.88 gain 85 45 -118.30 gain 45 86 -129.87 gain 86 45 -125.67 gain 45 87 -138.52 gain 87 45 -138.29 gain 45 88 -131.56 gain 88 45 -129.08 gain 45 89 -127.22 gain 89 45 -123.34 gain 45 90 -109.06 gain 90 45 -102.19 gain 45 91 -118.90 gain 91 45 -115.96 gain 45 92 -117.70 gain 92 45 -111.73 gain 45 93 -116.87 gain 93 45 -115.68 gain 45 94 -123.41 gain 94 45 -122.10 gain 45 95 -123.89 gain 95 45 -124.84 gain 45 96 -120.33 gain 96 45 -118.61 gain 45 97 -117.96 gain 97 45 -114.99 gain 45 98 -131.03 gain 98 45 -128.85 gain 45 99 -125.71 gain 99 45 -121.36 gain 45 100 -124.71 gain 100 45 -119.93 gain 45 101 -123.88 gain 101 45 -119.26 gain 45 102 -137.55 gain 102 45 -133.71 gain 45 103 -126.57 gain 103 45 -120.21 gain 45 104 -124.85 gain 104 45 -123.86 gain 45 105 -113.13 gain 105 45 -108.09 gain 45 106 -110.34 gain 106 45 -106.38 gain 45 107 -122.05 gain 107 45 -124.66 gain 45 108 -113.02 gain 108 45 -107.95 gain 45 109 -122.26 gain 109 45 -120.68 gain 45 110 -119.14 gain 110 45 -116.02 gain 45 111 -125.51 gain 111 45 -122.07 gain 45 112 -122.19 gain 112 45 -117.64 gain 45 113 -119.39 gain 113 45 -113.64 gain 45 114 -127.47 gain 114 45 -125.02 gain 45 115 -122.92 gain 115 45 -114.78 gain 45 116 -134.84 gain 116 45 -134.24 gain 45 117 -126.81 gain 117 45 -127.71 gain 45 118 -133.77 gain 118 45 -132.99 gain 45 119 -132.60 gain 119 45 -126.48 gain 45 120 -119.64 gain 120 45 -118.03 gain 45 121 -118.19 gain 121 45 -115.88 gain 45 122 -123.60 gain 122 45 -123.40 gain 45 123 -116.13 gain 123 45 -116.70 gain 45 124 -113.02 gain 124 45 -110.01 gain 45 125 -123.40 gain 125 45 -121.73 gain 45 126 -128.25 gain 126 45 -124.53 gain 45 127 -121.46 gain 127 45 -121.20 gain 45 128 -125.36 gain 128 45 -123.03 gain 45 129 -127.02 gain 129 45 -122.61 gain 45 130 -133.60 gain 130 45 -127.01 gain 45 131 -123.83 gain 131 45 -124.33 gain 45 132 -138.67 gain 132 45 -138.80 gain 45 133 -135.89 gain 133 45 -134.08 gain 45 134 -131.62 gain 134 45 -126.51 gain 45 135 -121.52 gain 135 45 -119.98 gain 45 136 -118.93 gain 136 45 -118.00 gain 45 137 -118.62 gain 137 45 -115.18 gain 45 138 -126.31 gain 138 45 -121.87 gain 45 139 -125.87 gain 139 45 -122.42 gain 45 140 -126.56 gain 140 45 -125.71 gain 45 141 -126.98 gain 141 45 -124.81 gain 45 142 -122.22 gain 142 45 -119.35 gain 45 143 -130.50 gain 143 45 -127.25 gain 45 144 -134.15 gain 144 45 -131.92 gain 45 145 -127.37 gain 145 45 -123.58 gain 45 146 -119.15 gain 146 45 -114.27 gain 45 147 -126.88 gain 147 45 -119.09 gain 45 148 -136.41 gain 148 45 -128.34 gain 45 149 -124.95 gain 149 45 -120.04 gain 45 150 -117.11 gain 150 45 -114.89 gain 45 151 -125.09 gain 151 45 -123.07 gain 45 152 -116.60 gain 152 45 -111.55 gain 45 153 -124.16 gain 153 45 -116.70 gain 45 154 -119.14 gain 154 45 -120.23 gain 45 155 -126.02 gain 155 45 -127.00 gain 45 156 -131.74 gain 156 45 -127.11 gain 45 157 -127.21 gain 157 45 -125.52 gain 45 158 -132.98 gain 158 45 -133.88 gain 45 159 -127.76 gain 159 45 -125.29 gain 45 160 -131.76 gain 160 45 -126.39 gain 45 161 -131.21 gain 161 45 -129.34 gain 45 162 -124.24 gain 162 45 -121.23 gain 45 163 -135.20 gain 163 45 -134.33 gain 45 164 -130.96 gain 164 45 -131.14 gain 45 165 -132.61 gain 165 45 -128.83 gain 45 166 -118.12 gain 166 45 -115.91 gain 45 167 -126.67 gain 167 45 -126.55 gain 45 168 -114.79 gain 168 45 -113.13 gain 45 169 -124.79 gain 169 45 -127.32 gain 45 170 -123.15 gain 170 45 -117.20 gain 45 171 -127.27 gain 171 45 -126.35 gain 45 172 -124.85 gain 172 45 -118.63 gain 45 173 -121.40 gain 173 45 -114.61 gain 45 174 -133.11 gain 174 45 -130.62 gain 45 175 -126.39 gain 175 45 -127.45 gain 45 176 -129.62 gain 176 45 -122.69 gain 45 177 -128.21 gain 177 45 -129.10 gain 45 178 -131.69 gain 178 45 -128.40 gain 45 179 -130.03 gain 179 45 -125.13 gain 45 180 -126.22 gain 180 45 -122.79 gain 45 181 -125.87 gain 181 45 -122.51 gain 45 182 -123.15 gain 182 45 -122.18 gain 45 183 -123.36 gain 183 45 -115.77 gain 45 184 -126.50 gain 184 45 -123.70 gain 45 185 -125.46 gain 185 45 -120.14 gain 45 186 -128.25 gain 186 45 -123.22 gain 45 187 -126.25 gain 187 45 -123.76 gain 45 188 -131.20 gain 188 45 -131.96 gain 45 189 -140.21 gain 189 45 -138.49 gain 45 190 -133.35 gain 190 45 -128.64 gain 45 191 -133.66 gain 191 45 -130.04 gain 45 192 -133.47 gain 192 45 -132.72 gain 45 193 -137.93 gain 193 45 -138.43 gain 45 194 -131.16 gain 194 45 -125.47 gain 45 195 -132.20 gain 195 45 -127.14 gain 45 196 -130.96 gain 196 45 -129.95 gain 45 197 -127.14 gain 197 45 -122.18 gain 45 198 -128.30 gain 198 45 -122.87 gain 45 199 -134.08 gain 199 45 -132.57 gain 45 200 -129.81 gain 200 45 -125.24 gain 45 201 -123.93 gain 201 45 -120.16 gain 45 202 -125.78 gain 202 45 -126.01 gain 45 203 -127.48 gain 203 45 -127.33 gain 45 204 -135.84 gain 204 45 -132.97 gain 45 205 -123.90 gain 205 45 -120.11 gain 45 206 -130.21 gain 206 45 -130.94 gain 45 207 -133.58 gain 207 45 -126.67 gain 45 208 -132.90 gain 208 45 -131.77 gain 45 209 -135.87 gain 209 45 -135.73 gain 45 210 -136.40 gain 210 45 -133.20 gain 45 211 -126.73 gain 211 45 -125.55 gain 45 212 -124.30 gain 212 45 -121.66 gain 45 213 -123.88 gain 213 45 -120.43 gain 45 214 -128.40 gain 214 45 -124.84 gain 45 215 -131.64 gain 215 45 -124.50 gain 45 216 -132.40 gain 216 45 -129.92 gain 45 217 -135.62 gain 217 45 -133.65 gain 45 218 -129.81 gain 218 45 -130.04 gain 45 219 -133.24 gain 219 45 -124.83 gain 45 220 -132.77 gain 220 45 -134.85 gain 45 221 -134.05 gain 221 45 -131.77 gain 45 222 -128.72 gain 222 45 -126.76 gain 45 223 -123.96 gain 223 45 -120.61 gain 45 224 -135.35 gain 224 45 -134.69 gain 46 47 -90.00 gain 47 46 -91.06 gain 46 48 -97.13 gain 48 46 -95.97 gain 46 49 -104.83 gain 49 46 -111.65 gain 46 50 -104.62 gain 50 46 -112.40 gain 46 51 -110.09 gain 51 46 -113.02 gain 46 52 -118.56 gain 52 46 -117.50 gain 46 53 -116.04 gain 53 46 -116.00 gain 46 54 -118.22 gain 54 46 -118.88 gain 46 55 -121.45 gain 55 46 -121.41 gain 46 56 -127.73 gain 56 46 -135.01 gain 46 57 -120.84 gain 57 46 -122.00 gain 46 58 -123.18 gain 58 46 -127.08 gain 46 59 -124.17 gain 59 46 -124.20 gain 46 60 -99.20 gain 60 46 -100.55 gain 46 61 -88.35 gain 61 46 -88.45 gain 46 62 -95.98 gain 62 46 -101.29 gain 46 63 -98.88 gain 63 46 -97.42 gain 46 64 -111.56 gain 64 46 -113.08 gain 46 65 -104.21 gain 65 46 -107.82 gain 46 66 -107.61 gain 66 46 -105.47 gain 46 67 -108.73 gain 67 46 -108.86 gain 46 68 -122.48 gain 68 46 -127.18 gain 46 69 -122.47 gain 69 46 -124.46 gain 46 70 -120.83 gain 70 46 -122.58 gain 46 71 -121.82 gain 71 46 -121.67 gain 46 72 -126.38 gain 72 46 -126.65 gain 46 73 -126.06 gain 73 46 -124.72 gain 46 74 -128.85 gain 74 46 -131.39 gain 46 75 -101.38 gain 75 46 -104.05 gain 46 76 -103.19 gain 76 46 -101.82 gain 46 77 -99.44 gain 77 46 -101.73 gain 46 78 -100.22 gain 78 46 -105.36 gain 46 79 -107.74 gain 79 46 -107.65 gain 46 80 -114.21 gain 80 46 -114.63 gain 46 81 -113.77 gain 81 46 -114.78 gain 46 82 -119.92 gain 82 46 -118.56 gain 46 83 -118.74 gain 83 46 -118.42 gain 46 84 -116.16 gain 84 46 -115.98 gain 46 85 -120.41 gain 85 46 -117.04 gain 46 86 -128.49 gain 86 46 -128.50 gain 46 87 -123.80 gain 87 46 -127.77 gain 46 88 -127.14 gain 88 46 -128.86 gain 46 89 -133.26 gain 89 46 -133.58 gain 46 90 -100.88 gain 90 46 -98.21 gain 46 91 -108.24 gain 91 46 -109.52 gain 46 92 -105.02 gain 92 46 -103.25 gain 46 93 -105.21 gain 93 46 -108.23 gain 46 94 -111.12 gain 94 46 -114.01 gain 46 95 -111.36 gain 95 46 -116.51 gain 46 96 -115.80 gain 96 46 -118.29 gain 46 97 -114.02 gain 97 46 -115.26 gain 46 98 -104.54 gain 98 46 -106.58 gain 46 99 -119.98 gain 99 46 -119.84 gain 46 100 -126.92 gain 100 46 -126.34 gain 46 101 -128.84 gain 101 46 -128.42 gain 46 102 -128.79 gain 102 46 -129.16 gain 46 103 -122.48 gain 103 46 -120.33 gain 46 104 -115.27 gain 104 46 -118.49 gain 46 105 -117.37 gain 105 46 -116.53 gain 46 106 -112.14 gain 106 46 -112.39 gain 46 107 -110.66 gain 107 46 -117.47 gain 46 108 -111.91 gain 108 46 -111.04 gain 46 109 -118.21 gain 109 46 -120.84 gain 46 110 -115.70 gain 110 46 -116.79 gain 46 111 -122.71 gain 111 46 -123.48 gain 46 112 -118.33 gain 112 46 -117.98 gain 46 113 -115.71 gain 113 46 -114.17 gain 46 114 -123.43 gain 114 46 -125.19 gain 46 115 -120.47 gain 115 46 -116.53 gain 46 116 -124.34 gain 116 46 -127.94 gain 46 117 -126.04 gain 117 46 -131.14 gain 46 118 -125.28 gain 118 46 -128.70 gain 46 119 -126.33 gain 119 46 -124.42 gain 46 120 -115.24 gain 120 46 -117.84 gain 46 121 -117.12 gain 121 46 -119.01 gain 46 122 -115.87 gain 122 46 -119.88 gain 46 123 -115.97 gain 123 46 -120.76 gain 46 124 -115.22 gain 124 46 -116.41 gain 46 125 -117.94 gain 125 46 -120.47 gain 46 126 -113.31 gain 126 46 -113.79 gain 46 127 -113.26 gain 127 46 -117.20 gain 46 128 -125.72 gain 128 46 -127.60 gain 46 129 -123.04 gain 129 46 -122.84 gain 46 130 -119.47 gain 130 46 -117.09 gain 46 131 -131.00 gain 131 46 -135.70 gain 46 132 -120.25 gain 132 46 -124.58 gain 46 133 -122.60 gain 133 46 -125.00 gain 46 134 -128.20 gain 134 46 -127.30 gain 46 135 -120.39 gain 135 46 -123.06 gain 46 136 -111.79 gain 136 46 -115.07 gain 46 137 -106.10 gain 137 46 -106.86 gain 46 138 -111.87 gain 138 46 -111.63 gain 46 139 -116.09 gain 139 46 -116.84 gain 46 140 -114.76 gain 140 46 -118.12 gain 46 141 -120.34 gain 141 46 -122.37 gain 46 142 -119.10 gain 142 46 -120.44 gain 46 143 -112.84 gain 143 46 -113.80 gain 46 144 -125.38 gain 144 46 -127.35 gain 46 145 -117.65 gain 145 46 -118.07 gain 46 146 -133.72 gain 146 46 -133.04 gain 46 147 -125.62 gain 147 46 -122.04 gain 46 148 -126.81 gain 148 46 -122.95 gain 46 149 -127.18 gain 149 46 -126.48 gain 46 150 -121.18 gain 150 46 -123.17 gain 46 151 -119.99 gain 151 46 -122.18 gain 46 152 -108.92 gain 152 46 -108.08 gain 46 153 -117.00 gain 153 46 -113.74 gain 46 154 -118.97 gain 154 46 -124.26 gain 46 155 -128.58 gain 155 46 -133.77 gain 46 156 -121.92 gain 156 46 -121.49 gain 46 157 -125.32 gain 157 46 -127.84 gain 46 158 -120.85 gain 158 46 -125.96 gain 46 159 -128.17 gain 159 46 -129.90 gain 46 160 -126.42 gain 160 46 -125.26 gain 46 161 -124.50 gain 161 46 -126.83 gain 46 162 -128.43 gain 162 46 -129.63 gain 46 163 -124.21 gain 163 46 -127.56 gain 46 164 -127.48 gain 164 46 -131.87 gain 46 165 -122.97 gain 165 46 -123.39 gain 46 166 -117.58 gain 166 46 -119.58 gain 46 167 -120.85 gain 167 46 -124.93 gain 46 168 -123.36 gain 168 46 -125.90 gain 46 169 -127.35 gain 169 46 -134.08 gain 46 170 -127.54 gain 170 46 -125.81 gain 46 171 -126.05 gain 171 46 -129.33 gain 46 172 -125.65 gain 172 46 -123.63 gain 46 173 -131.67 gain 173 46 -129.09 gain 46 174 -123.31 gain 174 46 -125.02 gain 46 175 -126.88 gain 175 46 -132.15 gain 46 176 -124.59 gain 176 46 -121.87 gain 46 177 -123.84 gain 177 46 -128.93 gain 46 178 -125.84 gain 178 46 -126.76 gain 46 179 -125.15 gain 179 46 -124.45 gain 46 180 -116.30 gain 180 46 -117.07 gain 46 181 -125.06 gain 181 46 -125.91 gain 46 182 -121.87 gain 182 46 -125.10 gain 46 183 -119.66 gain 183 46 -116.28 gain 46 184 -124.88 gain 184 46 -126.28 gain 46 185 -126.13 gain 185 46 -125.02 gain 46 186 -126.28 gain 186 46 -125.46 gain 46 187 -127.19 gain 187 46 -128.90 gain 46 188 -123.03 gain 188 46 -128.00 gain 46 189 -131.88 gain 189 46 -134.36 gain 46 190 -123.69 gain 190 46 -123.19 gain 46 191 -129.33 gain 191 46 -129.92 gain 46 192 -125.31 gain 192 46 -128.76 gain 46 193 -129.48 gain 193 46 -134.19 gain 46 194 -123.55 gain 194 46 -122.07 gain 46 195 -124.16 gain 195 46 -123.31 gain 46 196 -124.00 gain 196 46 -127.19 gain 46 197 -120.85 gain 197 46 -120.11 gain 46 198 -127.49 gain 198 46 -126.26 gain 46 199 -126.68 gain 199 46 -129.37 gain 46 200 -118.28 gain 200 46 -117.91 gain 46 201 -127.25 gain 201 46 -127.68 gain 46 202 -124.34 gain 202 46 -128.78 gain 46 203 -121.25 gain 203 46 -125.30 gain 46 204 -124.16 gain 204 46 -125.50 gain 46 205 -126.14 gain 205 46 -126.55 gain 46 206 -130.97 gain 206 46 -135.91 gain 46 207 -127.41 gain 207 46 -124.70 gain 46 208 -121.69 gain 208 46 -124.76 gain 46 209 -122.47 gain 209 46 -126.54 gain 46 210 -122.64 gain 210 46 -123.64 gain 46 211 -123.12 gain 211 46 -126.14 gain 46 212 -125.39 gain 212 46 -126.96 gain 46 213 -124.74 gain 213 46 -125.50 gain 46 214 -125.98 gain 214 46 -126.63 gain 46 215 -121.79 gain 215 46 -118.86 gain 46 216 -122.43 gain 216 46 -124.15 gain 46 217 -126.92 gain 217 46 -129.17 gain 46 218 -132.21 gain 218 46 -136.65 gain 46 219 -129.95 gain 219 46 -125.74 gain 46 220 -125.57 gain 220 46 -131.85 gain 46 221 -127.26 gain 221 46 -129.18 gain 46 222 -135.65 gain 222 46 -137.90 gain 46 223 -130.04 gain 223 46 -130.90 gain 46 224 -140.37 gain 224 46 -143.92 gain 47 48 -89.73 gain 48 47 -87.52 gain 47 49 -101.52 gain 49 47 -107.29 gain 47 50 -107.42 gain 50 47 -114.15 gain 47 51 -105.94 gain 51 47 -107.81 gain 47 52 -107.21 gain 52 47 -105.10 gain 47 53 -113.53 gain 53 47 -112.43 gain 47 54 -118.89 gain 54 47 -118.49 gain 47 55 -117.75 gain 55 47 -116.65 gain 47 56 -123.46 gain 56 47 -129.69 gain 47 57 -126.48 gain 57 47 -126.58 gain 47 58 -121.34 gain 58 47 -124.18 gain 47 59 -119.87 gain 59 47 -118.84 gain 47 60 -99.60 gain 60 47 -99.89 gain 47 61 -98.25 gain 61 47 -97.29 gain 47 62 -92.78 gain 62 47 -97.04 gain 47 63 -96.44 gain 63 47 -93.92 gain 47 64 -102.18 gain 64 47 -102.64 gain 47 65 -102.50 gain 65 47 -105.05 gain 47 66 -111.01 gain 66 47 -107.81 gain 47 67 -113.86 gain 67 47 -112.94 gain 47 68 -117.47 gain 68 47 -121.10 gain 47 69 -116.60 gain 69 47 -117.53 gain 47 70 -119.13 gain 70 47 -119.81 gain 47 71 -121.93 gain 71 47 -120.72 gain 47 72 -122.38 gain 72 47 -121.59 gain 47 73 -115.33 gain 73 47 -112.93 gain 47 74 -119.75 gain 74 47 -121.22 gain 47 75 -105.48 gain 75 47 -107.09 gain 47 76 -110.91 gain 76 47 -108.48 gain 47 77 -99.99 gain 77 47 -101.22 gain 47 78 -96.40 gain 78 47 -100.48 gain 47 79 -101.92 gain 79 47 -100.78 gain 47 80 -112.87 gain 80 47 -112.23 gain 47 81 -112.96 gain 81 47 -112.91 gain 47 82 -114.27 gain 82 47 -111.85 gain 47 83 -118.69 gain 83 47 -117.30 gain 47 84 -118.65 gain 84 47 -117.41 gain 47 85 -119.33 gain 85 47 -114.90 gain 47 86 -122.23 gain 86 47 -121.19 gain 47 87 -125.02 gain 87 47 -127.93 gain 47 88 -128.27 gain 88 47 -128.93 gain 47 89 -129.94 gain 89 47 -129.20 gain 47 90 -112.69 gain 90 47 -108.96 gain 47 91 -112.23 gain 91 47 -112.45 gain 47 92 -106.18 gain 92 47 -103.36 gain 47 93 -108.32 gain 93 47 -110.29 gain 47 94 -113.75 gain 94 47 -115.59 gain 47 95 -116.45 gain 95 47 -120.54 gain 47 96 -112.61 gain 96 47 -114.05 gain 47 97 -114.99 gain 97 47 -115.16 gain 47 98 -119.86 gain 98 47 -120.83 gain 47 99 -116.24 gain 99 47 -115.04 gain 47 100 -126.72 gain 100 47 -125.08 gain 47 101 -130.82 gain 101 47 -129.35 gain 47 102 -123.67 gain 102 47 -122.97 gain 47 103 -129.12 gain 103 47 -125.91 gain 47 104 -129.04 gain 104 47 -131.21 gain 47 105 -114.19 gain 105 47 -112.30 gain 47 106 -112.01 gain 106 47 -111.20 gain 47 107 -115.46 gain 107 47 -121.21 gain 47 108 -116.73 gain 108 47 -114.80 gain 47 109 -113.29 gain 109 47 -114.85 gain 47 110 -112.77 gain 110 47 -112.81 gain 47 111 -114.53 gain 111 47 -114.24 gain 47 112 -113.64 gain 112 47 -112.23 gain 47 113 -116.04 gain 113 47 -113.44 gain 47 114 -123.05 gain 114 47 -123.75 gain 47 115 -126.56 gain 115 47 -121.57 gain 47 116 -119.35 gain 116 47 -121.90 gain 47 117 -131.44 gain 117 47 -135.48 gain 47 118 -128.72 gain 118 47 -131.08 gain 47 119 -125.06 gain 119 47 -122.09 gain 47 120 -118.52 gain 120 47 -120.07 gain 47 121 -115.07 gain 121 47 -115.90 gain 47 122 -114.62 gain 122 47 -117.57 gain 47 123 -120.66 gain 123 47 -124.38 gain 47 124 -119.15 gain 124 47 -119.29 gain 47 125 -112.23 gain 125 47 -113.70 gain 47 126 -120.84 gain 126 47 -120.27 gain 47 127 -119.72 gain 127 47 -122.61 gain 47 128 -122.56 gain 128 47 -123.39 gain 47 129 -121.65 gain 129 47 -120.38 gain 47 130 -125.10 gain 130 47 -121.66 gain 47 131 -120.26 gain 131 47 -123.90 gain 47 132 -121.32 gain 132 47 -124.59 gain 47 133 -124.44 gain 133 47 -125.78 gain 47 134 -133.44 gain 134 47 -131.48 gain 47 135 -116.31 gain 135 47 -117.92 gain 47 136 -112.12 gain 136 47 -114.35 gain 47 137 -119.58 gain 137 47 -119.28 gain 47 138 -113.37 gain 138 47 -112.08 gain 47 139 -124.08 gain 139 47 -123.77 gain 47 140 -117.28 gain 140 47 -119.58 gain 47 141 -126.19 gain 141 47 -127.17 gain 47 142 -120.66 gain 142 47 -120.94 gain 47 143 -118.13 gain 143 47 -118.02 gain 47 144 -121.85 gain 144 47 -122.77 gain 47 145 -120.99 gain 145 47 -120.35 gain 47 146 -125.73 gain 146 47 -124.00 gain 47 147 -125.42 gain 147 47 -120.78 gain 47 148 -129.33 gain 148 47 -124.41 gain 47 149 -125.91 gain 149 47 -124.15 gain 47 150 -125.90 gain 150 47 -126.83 gain 47 151 -123.01 gain 151 47 -124.14 gain 47 152 -118.06 gain 152 47 -116.17 gain 47 153 -117.13 gain 153 47 -112.81 gain 47 154 -116.73 gain 154 47 -120.96 gain 47 155 -124.82 gain 155 47 -128.95 gain 47 156 -122.33 gain 156 47 -120.85 gain 47 157 -123.92 gain 157 47 -125.38 gain 47 158 -123.18 gain 158 47 -127.23 gain 47 159 -126.25 gain 159 47 -126.92 gain 47 160 -121.19 gain 160 47 -118.97 gain 47 161 -122.17 gain 161 47 -123.44 gain 47 162 -129.39 gain 162 47 -129.53 gain 47 163 -130.74 gain 163 47 -133.02 gain 47 164 -124.68 gain 164 47 -128.01 gain 47 165 -123.07 gain 165 47 -122.44 gain 47 166 -119.97 gain 166 47 -120.91 gain 47 167 -121.47 gain 167 47 -124.50 gain 47 168 -123.81 gain 168 47 -125.29 gain 47 169 -119.18 gain 169 47 -124.86 gain 47 170 -123.11 gain 170 47 -120.32 gain 47 171 -120.64 gain 171 47 -122.87 gain 47 172 -127.47 gain 172 47 -124.40 gain 47 173 -125.88 gain 173 47 -122.24 gain 47 174 -122.38 gain 174 47 -123.04 gain 47 175 -123.54 gain 175 47 -127.75 gain 47 176 -130.94 gain 176 47 -127.17 gain 47 177 -130.57 gain 177 47 -134.60 gain 47 178 -131.47 gain 178 47 -131.33 gain 47 179 -130.10 gain 179 47 -128.35 gain 47 180 -120.34 gain 180 47 -120.06 gain 47 181 -116.54 gain 181 47 -116.32 gain 47 182 -118.56 gain 182 47 -120.73 gain 47 183 -117.23 gain 183 47 -112.79 gain 47 184 -119.18 gain 184 47 -119.52 gain 47 185 -124.28 gain 185 47 -122.11 gain 47 186 -124.72 gain 186 47 -122.83 gain 47 187 -117.64 gain 187 47 -118.29 gain 47 188 -124.10 gain 188 47 -128.01 gain 47 189 -123.71 gain 189 47 -125.14 gain 47 190 -127.28 gain 190 47 -125.72 gain 47 191 -130.05 gain 191 47 -129.58 gain 47 192 -127.82 gain 192 47 -130.21 gain 47 193 -132.29 gain 193 47 -135.94 gain 47 194 -131.47 gain 194 47 -128.93 gain 47 195 -116.90 gain 195 47 -115.00 gain 47 196 -127.26 gain 196 47 -129.40 gain 47 197 -120.90 gain 197 47 -119.09 gain 47 198 -125.35 gain 198 47 -123.06 gain 47 199 -120.61 gain 199 47 -122.24 gain 47 200 -124.54 gain 200 47 -123.11 gain 47 201 -119.79 gain 201 47 -119.17 gain 47 202 -127.44 gain 202 47 -130.82 gain 47 203 -126.46 gain 203 47 -129.46 gain 47 204 -129.02 gain 204 47 -129.30 gain 47 205 -121.43 gain 205 47 -120.78 gain 47 206 -124.07 gain 206 47 -127.95 gain 47 207 -128.22 gain 207 47 -124.46 gain 47 208 -131.54 gain 208 47 -133.56 gain 47 209 -133.06 gain 209 47 -136.07 gain 47 210 -122.28 gain 210 47 -122.23 gain 47 211 -123.36 gain 211 47 -125.32 gain 47 212 -116.07 gain 212 47 -116.58 gain 47 213 -129.05 gain 213 47 -128.75 gain 47 214 -125.09 gain 214 47 -124.68 gain 47 215 -124.42 gain 215 47 -120.43 gain 47 216 -123.03 gain 216 47 -123.70 gain 47 217 -123.26 gain 217 47 -124.45 gain 47 218 -129.42 gain 218 47 -132.80 gain 47 219 -125.60 gain 219 47 -120.33 gain 47 220 -124.32 gain 220 47 -129.54 gain 47 221 -123.50 gain 221 47 -124.37 gain 47 222 -137.68 gain 222 47 -138.87 gain 47 223 -130.27 gain 223 47 -130.07 gain 47 224 -128.11 gain 224 47 -130.60 gain 48 49 -90.85 gain 49 48 -98.83 gain 48 50 -95.18 gain 50 48 -104.12 gain 48 51 -113.16 gain 51 48 -117.24 gain 48 52 -112.58 gain 52 48 -112.68 gain 48 53 -119.61 gain 53 48 -120.72 gain 48 54 -107.35 gain 54 48 -109.17 gain 48 55 -122.07 gain 55 48 -123.18 gain 48 56 -120.07 gain 56 48 -128.51 gain 48 57 -118.20 gain 57 48 -120.51 gain 48 58 -127.87 gain 58 48 -132.92 gain 48 59 -125.98 gain 59 48 -127.16 gain 48 60 -109.64 gain 60 48 -112.14 gain 48 61 -103.67 gain 61 48 -104.93 gain 48 62 -90.49 gain 62 48 -96.96 gain 48 63 -88.28 gain 63 48 -87.97 gain 48 64 -98.98 gain 64 48 -101.65 gain 48 65 -99.97 gain 65 48 -104.73 gain 48 66 -103.40 gain 66 48 -102.41 gain 48 67 -109.23 gain 67 48 -110.52 gain 48 68 -116.71 gain 68 48 -122.56 gain 48 69 -116.88 gain 69 48 -120.02 gain 48 70 -112.65 gain 70 48 -115.54 gain 48 71 -123.43 gain 71 48 -124.43 gain 48 72 -122.74 gain 72 48 -124.16 gain 48 73 -121.54 gain 73 48 -121.35 gain 48 74 -121.69 gain 74 48 -125.38 gain 48 75 -109.22 gain 75 48 -113.05 gain 48 76 -108.80 gain 76 48 -108.58 gain 48 77 -102.41 gain 77 48 -105.85 gain 48 78 -98.74 gain 78 48 -105.03 gain 48 79 -100.95 gain 79 48 -102.02 gain 48 80 -103.70 gain 80 48 -105.27 gain 48 81 -105.59 gain 81 48 -107.75 gain 48 82 -109.75 gain 82 48 -109.54 gain 48 83 -113.80 gain 83 48 -114.62 gain 48 84 -117.82 gain 84 48 -118.79 gain 48 85 -112.21 gain 85 48 -109.99 gain 48 86 -115.35 gain 86 48 -116.52 gain 48 87 -117.25 gain 87 48 -122.37 gain 48 88 -121.78 gain 88 48 -124.66 gain 48 89 -128.82 gain 89 48 -130.30 gain 48 90 -113.76 gain 90 48 -112.25 gain 48 91 -112.46 gain 91 48 -114.89 gain 48 92 -104.13 gain 92 48 -103.52 gain 48 93 -105.67 gain 93 48 -109.85 gain 48 94 -98.20 gain 94 48 -102.25 gain 48 95 -104.31 gain 95 48 -110.61 gain 48 96 -108.11 gain 96 48 -111.75 gain 48 97 -109.24 gain 97 48 -111.63 gain 48 98 -112.10 gain 98 48 -115.29 gain 48 99 -110.28 gain 99 48 -111.29 gain 48 100 -125.92 gain 100 48 -126.49 gain 48 101 -120.26 gain 101 48 -121.00 gain 48 102 -115.35 gain 102 48 -116.87 gain 48 103 -117.00 gain 103 48 -116.00 gain 48 104 -128.11 gain 104 48 -132.49 gain 48 105 -111.36 gain 105 48 -111.68 gain 48 106 -108.32 gain 106 48 -109.73 gain 48 107 -109.17 gain 107 48 -117.14 gain 48 108 -103.60 gain 108 48 -103.89 gain 48 109 -115.06 gain 109 48 -118.83 gain 48 110 -101.71 gain 110 48 -103.95 gain 48 111 -115.71 gain 111 48 -117.64 gain 48 112 -109.34 gain 112 48 -110.15 gain 48 113 -119.74 gain 113 48 -119.35 gain 48 114 -112.42 gain 114 48 -115.34 gain 48 115 -117.18 gain 115 48 -114.39 gain 48 116 -122.68 gain 116 48 -127.43 gain 48 117 -120.49 gain 117 48 -126.75 gain 48 118 -120.36 gain 118 48 -124.94 gain 48 119 -122.69 gain 119 48 -121.93 gain 48 120 -113.00 gain 120 48 -116.76 gain 48 121 -112.55 gain 121 48 -115.60 gain 48 122 -109.12 gain 122 48 -114.28 gain 48 123 -107.28 gain 123 48 -113.22 gain 48 124 -111.53 gain 124 48 -113.88 gain 48 125 -117.77 gain 125 48 -121.46 gain 48 126 -113.42 gain 126 48 -115.06 gain 48 127 -121.78 gain 127 48 -126.88 gain 48 128 -124.96 gain 128 48 -128.00 gain 48 129 -123.76 gain 129 48 -124.71 gain 48 130 -119.90 gain 130 48 -118.67 gain 48 131 -125.51 gain 131 48 -131.37 gain 48 132 -117.29 gain 132 48 -122.78 gain 48 133 -121.09 gain 133 48 -124.65 gain 48 134 -120.77 gain 134 48 -121.03 gain 48 135 -111.47 gain 135 48 -115.30 gain 48 136 -122.85 gain 136 48 -127.28 gain 48 137 -112.30 gain 137 48 -114.22 gain 48 138 -119.48 gain 138 48 -120.40 gain 48 139 -114.45 gain 139 48 -116.36 gain 48 140 -110.20 gain 140 48 -114.71 gain 48 141 -110.98 gain 141 48 -114.16 gain 48 142 -111.67 gain 142 48 -114.16 gain 48 143 -112.75 gain 143 48 -114.85 gain 48 144 -117.25 gain 144 48 -120.37 gain 48 145 -117.96 gain 145 48 -119.54 gain 48 146 -115.09 gain 146 48 -115.57 gain 48 147 -133.33 gain 147 48 -130.90 gain 48 148 -126.62 gain 148 48 -123.91 gain 48 149 -124.62 gain 149 48 -125.08 gain 48 150 -120.25 gain 150 48 -123.40 gain 48 151 -114.18 gain 151 48 -117.51 gain 48 152 -109.37 gain 152 48 -109.68 gain 48 153 -115.38 gain 153 48 -113.27 gain 48 154 -114.38 gain 154 48 -120.82 gain 48 155 -118.31 gain 155 48 -124.64 gain 48 156 -115.80 gain 156 48 -116.53 gain 48 157 -120.44 gain 157 48 -124.11 gain 48 158 -118.52 gain 158 48 -124.79 gain 48 159 -116.34 gain 159 48 -119.23 gain 48 160 -121.50 gain 160 48 -121.50 gain 48 161 -126.03 gain 161 48 -129.51 gain 48 162 -122.37 gain 162 48 -124.72 gain 48 163 -121.20 gain 163 48 -125.70 gain 48 164 -130.45 gain 164 48 -135.99 gain 48 165 -115.07 gain 165 48 -116.65 gain 48 166 -114.44 gain 166 48 -117.59 gain 48 167 -114.63 gain 167 48 -119.87 gain 48 168 -117.00 gain 168 48 -120.69 gain 48 169 -114.77 gain 169 48 -122.66 gain 48 170 -115.67 gain 170 48 -115.09 gain 48 171 -119.50 gain 171 48 -123.94 gain 48 172 -119.60 gain 172 48 -118.74 gain 48 173 -119.93 gain 173 48 -118.50 gain 48 174 -119.48 gain 174 48 -122.35 gain 48 175 -119.79 gain 175 48 -126.22 gain 48 176 -125.32 gain 176 48 -123.75 gain 48 177 -124.14 gain 177 48 -130.38 gain 48 178 -125.40 gain 178 48 -127.47 gain 48 179 -127.21 gain 179 48 -127.67 gain 48 180 -116.04 gain 180 48 -117.98 gain 48 181 -114.28 gain 181 48 -116.28 gain 48 182 -115.22 gain 182 48 -119.61 gain 48 183 -115.54 gain 183 48 -113.31 gain 48 184 -118.35 gain 184 48 -120.91 gain 48 185 -117.08 gain 185 48 -117.12 gain 48 186 -118.65 gain 186 48 -118.97 gain 48 187 -116.08 gain 187 48 -118.94 gain 48 188 -116.02 gain 188 48 -122.15 gain 48 189 -130.98 gain 189 48 -134.63 gain 48 190 -114.30 gain 190 48 -114.95 gain 48 191 -125.02 gain 191 48 -126.76 gain 48 192 -129.15 gain 192 48 -133.76 gain 48 193 -123.02 gain 193 48 -128.88 gain 48 194 -128.59 gain 194 48 -128.27 gain 48 195 -124.77 gain 195 48 -125.08 gain 48 196 -118.71 gain 196 48 -123.05 gain 48 197 -123.28 gain 197 48 -123.69 gain 48 198 -124.96 gain 198 48 -124.89 gain 48 199 -115.44 gain 199 48 -119.28 gain 48 200 -128.48 gain 200 48 -129.26 gain 48 201 -121.95 gain 201 48 -123.54 gain 48 202 -125.23 gain 202 48 -130.82 gain 48 203 -124.26 gain 203 48 -129.47 gain 48 204 -115.86 gain 204 48 -118.35 gain 48 205 -126.04 gain 205 48 -127.60 gain 48 206 -119.02 gain 206 48 -125.11 gain 48 207 -123.78 gain 207 48 -122.23 gain 48 208 -134.36 gain 208 48 -138.59 gain 48 209 -121.82 gain 209 48 -127.04 gain 48 210 -122.04 gain 210 48 -124.20 gain 48 211 -118.54 gain 211 48 -122.72 gain 48 212 -124.17 gain 212 48 -126.89 gain 48 213 -117.35 gain 213 48 -119.26 gain 48 214 -114.29 gain 214 48 -116.09 gain 48 215 -114.31 gain 215 48 -112.52 gain 48 216 -127.52 gain 216 48 -130.40 gain 48 217 -120.68 gain 217 48 -124.08 gain 48 218 -129.60 gain 218 48 -135.19 gain 48 219 -120.33 gain 219 48 -117.27 gain 48 220 -128.99 gain 220 48 -136.43 gain 48 221 -121.76 gain 221 48 -124.84 gain 48 222 -119.68 gain 222 48 -123.08 gain 48 223 -121.21 gain 223 48 -123.23 gain 48 224 -129.97 gain 224 48 -134.68 gain 49 50 -101.34 gain 50 49 -102.31 gain 49 51 -109.89 gain 51 49 -105.99 gain 49 52 -116.13 gain 52 49 -108.26 gain 49 53 -120.87 gain 53 49 -114.01 gain 49 54 -120.24 gain 54 49 -114.08 gain 49 55 -119.29 gain 55 49 -112.42 gain 49 56 -121.08 gain 56 49 -121.54 gain 49 57 -134.97 gain 57 49 -129.30 gain 49 58 -127.92 gain 58 49 -125.00 gain 49 59 -134.43 gain 59 49 -127.63 gain 49 60 -111.18 gain 60 49 -105.71 gain 49 61 -111.28 gain 61 49 -104.56 gain 49 62 -114.38 gain 62 49 -112.88 gain 49 63 -99.35 gain 63 49 -91.07 gain 49 64 -95.22 gain 64 49 -89.91 gain 49 65 -105.76 gain 65 49 -102.55 gain 49 66 -108.00 gain 66 49 -99.04 gain 49 67 -111.20 gain 67 49 -104.52 gain 49 68 -121.40 gain 68 49 -119.27 gain 49 69 -117.08 gain 69 49 -112.25 gain 49 70 -122.19 gain 70 49 -117.11 gain 49 71 -125.49 gain 71 49 -118.51 gain 49 72 -126.24 gain 72 49 -119.69 gain 49 73 -129.01 gain 73 49 -120.84 gain 49 74 -133.70 gain 74 49 -129.41 gain 49 75 -126.04 gain 75 49 -121.89 gain 49 76 -121.74 gain 76 49 -113.54 gain 49 77 -111.67 gain 77 49 -107.14 gain 49 78 -103.55 gain 78 49 -101.86 gain 49 79 -111.03 gain 79 49 -104.13 gain 49 80 -110.22 gain 80 49 -103.82 gain 49 81 -113.25 gain 81 49 -107.44 gain 49 82 -116.36 gain 82 49 -108.17 gain 49 83 -126.72 gain 83 49 -119.57 gain 49 84 -124.59 gain 84 49 -117.59 gain 49 85 -128.12 gain 85 49 -117.93 gain 49 86 -126.30 gain 86 49 -119.49 gain 49 87 -122.38 gain 87 49 -119.53 gain 49 88 -128.72 gain 88 49 -123.62 gain 49 89 -135.93 gain 89 49 -129.43 gain 49 90 -119.51 gain 90 49 -110.02 gain 49 91 -126.81 gain 91 49 -121.26 gain 49 92 -112.88 gain 92 49 -104.29 gain 49 93 -110.41 gain 93 49 -106.62 gain 49 94 -106.67 gain 94 49 -102.74 gain 49 95 -107.89 gain 95 49 -106.22 gain 49 96 -124.84 gain 96 49 -120.51 gain 49 97 -114.47 gain 97 49 -108.89 gain 49 98 -115.52 gain 98 49 -110.73 gain 49 99 -125.17 gain 99 49 -118.20 gain 49 100 -130.29 gain 100 49 -122.89 gain 49 101 -127.98 gain 101 49 -120.74 gain 49 102 -123.73 gain 102 49 -117.28 gain 49 103 -123.63 gain 103 49 -114.65 gain 49 104 -128.91 gain 104 49 -125.31 gain 49 105 -125.87 gain 105 49 -118.21 gain 49 106 -121.82 gain 106 49 -115.24 gain 49 107 -120.86 gain 107 49 -120.85 gain 49 108 -116.00 gain 108 49 -108.31 gain 49 109 -116.98 gain 109 49 -112.78 gain 49 110 -122.06 gain 110 49 -116.33 gain 49 111 -117.43 gain 111 49 -111.38 gain 49 112 -121.99 gain 112 49 -114.82 gain 49 113 -121.13 gain 113 49 -112.76 gain 49 114 -118.70 gain 114 49 -113.64 gain 49 115 -132.52 gain 115 49 -121.77 gain 49 116 -130.80 gain 116 49 -127.58 gain 49 117 -129.89 gain 117 49 -128.17 gain 49 118 -133.36 gain 118 49 -129.96 gain 49 119 -130.58 gain 119 49 -121.85 gain 49 120 -116.67 gain 120 49 -112.46 gain 49 121 -122.17 gain 121 49 -117.24 gain 49 122 -116.24 gain 122 49 -113.42 gain 49 123 -121.48 gain 123 49 -119.44 gain 49 124 -115.03 gain 124 49 -109.40 gain 49 125 -108.17 gain 125 49 -103.88 gain 49 126 -122.69 gain 126 49 -116.35 gain 49 127 -126.15 gain 127 49 -123.28 gain 49 128 -124.43 gain 128 49 -119.49 gain 49 129 -125.36 gain 129 49 -118.34 gain 49 130 -121.73 gain 130 49 -112.53 gain 49 131 -127.34 gain 131 49 -125.22 gain 49 132 -128.02 gain 132 49 -125.53 gain 49 133 -126.39 gain 133 49 -121.97 gain 49 134 -139.93 gain 134 49 -132.21 gain 49 135 -126.83 gain 135 49 -122.68 gain 49 136 -130.41 gain 136 49 -126.87 gain 49 137 -129.05 gain 137 49 -123.00 gain 49 138 -124.60 gain 138 49 -117.54 gain 49 139 -115.76 gain 139 49 -109.69 gain 49 140 -124.23 gain 140 49 -120.76 gain 49 141 -123.23 gain 141 49 -118.44 gain 49 142 -122.43 gain 142 49 -116.94 gain 49 143 -121.66 gain 143 49 -115.80 gain 49 144 -131.99 gain 144 49 -127.13 gain 49 145 -128.32 gain 145 49 -121.92 gain 49 146 -128.14 gain 146 49 -120.64 gain 49 147 -124.07 gain 147 49 -113.66 gain 49 148 -127.65 gain 148 49 -116.97 gain 49 149 -133.24 gain 149 49 -125.72 gain 49 150 -127.09 gain 150 49 -122.26 gain 49 151 -126.29 gain 151 49 -121.65 gain 49 152 -127.00 gain 152 49 -119.34 gain 49 153 -126.13 gain 153 49 -116.04 gain 49 154 -125.23 gain 154 49 -123.69 gain 49 155 -127.19 gain 155 49 -125.55 gain 49 156 -126.82 gain 156 49 -119.57 gain 49 157 -122.30 gain 157 49 -118.00 gain 49 158 -128.43 gain 158 49 -126.72 gain 49 159 -130.63 gain 159 49 -125.54 gain 49 160 -126.08 gain 160 49 -118.10 gain 49 161 -135.37 gain 161 49 -130.88 gain 49 162 -128.52 gain 162 49 -122.89 gain 49 163 -137.17 gain 163 49 -133.70 gain 49 164 -130.35 gain 164 49 -127.92 gain 49 165 -131.69 gain 165 49 -125.29 gain 49 166 -124.05 gain 166 49 -119.22 gain 49 167 -126.61 gain 167 49 -123.87 gain 49 168 -125.61 gain 168 49 -121.33 gain 49 169 -127.35 gain 169 49 -127.26 gain 49 170 -116.79 gain 170 49 -108.23 gain 49 171 -126.40 gain 171 49 -122.87 gain 49 172 -129.11 gain 172 49 -120.27 gain 49 173 -136.84 gain 173 49 -127.44 gain 49 174 -135.05 gain 174 49 -129.95 gain 49 175 -130.56 gain 175 49 -129.01 gain 49 176 -124.51 gain 176 49 -114.97 gain 49 177 -119.52 gain 177 49 -117.80 gain 49 178 -131.20 gain 178 49 -125.29 gain 49 179 -135.18 gain 179 49 -127.67 gain 49 180 -129.10 gain 180 49 -123.06 gain 49 181 -130.26 gain 181 49 -124.28 gain 49 182 -132.04 gain 182 49 -128.45 gain 49 183 -130.74 gain 183 49 -120.54 gain 49 184 -133.29 gain 184 49 -127.87 gain 49 185 -123.06 gain 185 49 -115.13 gain 49 186 -132.32 gain 186 49 -124.68 gain 49 187 -129.00 gain 187 49 -123.89 gain 49 188 -132.62 gain 188 49 -130.77 gain 49 189 -137.55 gain 189 49 -133.22 gain 49 190 -128.64 gain 190 49 -121.32 gain 49 191 -132.61 gain 191 49 -126.38 gain 49 192 -128.68 gain 192 49 -125.31 gain 49 193 -134.73 gain 193 49 -132.62 gain 49 194 -129.87 gain 194 49 -121.57 gain 49 195 -127.48 gain 195 49 -119.81 gain 49 196 -126.31 gain 196 49 -122.68 gain 49 197 -127.28 gain 197 49 -119.71 gain 49 198 -123.67 gain 198 49 -115.63 gain 49 199 -123.79 gain 199 49 -119.66 gain 49 200 -125.04 gain 200 49 -117.85 gain 49 201 -130.80 gain 201 49 -124.41 gain 49 202 -126.92 gain 202 49 -124.54 gain 49 203 -131.84 gain 203 49 -129.07 gain 49 204 -131.13 gain 204 49 -125.65 gain 49 205 -135.20 gain 205 49 -128.79 gain 49 206 -133.67 gain 206 49 -131.78 gain 49 207 -138.87 gain 207 49 -129.34 gain 49 208 -131.08 gain 208 49 -127.34 gain 49 209 -136.00 gain 209 49 -133.24 gain 49 210 -133.89 gain 210 49 -128.07 gain 49 211 -126.39 gain 211 49 -122.59 gain 49 212 -132.72 gain 212 49 -127.46 gain 49 213 -132.07 gain 213 49 -126.01 gain 49 214 -132.15 gain 214 49 -125.98 gain 49 215 -126.26 gain 215 49 -116.50 gain 49 216 -127.88 gain 216 49 -122.79 gain 49 217 -135.81 gain 217 49 -131.23 gain 49 218 -133.36 gain 218 49 -130.98 gain 49 219 -135.06 gain 219 49 -124.03 gain 49 220 -126.44 gain 220 49 -125.90 gain 49 221 -124.47 gain 221 49 -119.57 gain 49 222 -132.14 gain 222 49 -127.57 gain 49 223 -132.76 gain 223 49 -126.81 gain 49 224 -130.93 gain 224 49 -127.66 gain 50 51 -105.99 gain 51 50 -101.12 gain 50 52 -108.69 gain 52 50 -99.85 gain 50 53 -116.51 gain 53 50 -108.69 gain 50 54 -125.22 gain 54 50 -118.10 gain 50 55 -123.35 gain 55 50 -115.52 gain 50 56 -123.76 gain 56 50 -123.25 gain 50 57 -125.97 gain 57 50 -119.34 gain 50 58 -124.39 gain 58 50 -120.50 gain 50 59 -131.89 gain 59 50 -124.13 gain 50 60 -119.30 gain 60 50 -112.86 gain 50 61 -125.30 gain 61 50 -117.61 gain 50 62 -115.72 gain 62 50 -113.26 gain 50 63 -107.07 gain 63 50 -97.82 gain 50 64 -102.04 gain 64 50 -95.77 gain 50 65 -103.59 gain 65 50 -99.41 gain 50 66 -109.11 gain 66 50 -99.19 gain 50 67 -113.90 gain 67 50 -106.25 gain 50 68 -114.84 gain 68 50 -111.75 gain 50 69 -126.01 gain 69 50 -120.21 gain 50 70 -127.20 gain 70 50 -121.16 gain 50 71 -118.70 gain 71 50 -110.76 gain 50 72 -134.21 gain 72 50 -126.69 gain 50 73 -126.21 gain 73 50 -117.08 gain 50 74 -136.02 gain 74 50 -130.76 gain 50 75 -111.85 gain 75 50 -106.74 gain 50 76 -118.53 gain 76 50 -109.37 gain 50 77 -111.49 gain 77 50 -105.99 gain 50 78 -118.21 gain 78 50 -115.56 gain 50 79 -109.66 gain 79 50 -101.80 gain 50 80 -105.32 gain 80 50 -97.95 gain 50 81 -115.12 gain 81 50 -108.35 gain 50 82 -110.68 gain 82 50 -101.53 gain 50 83 -112.84 gain 83 50 -104.72 gain 50 84 -117.72 gain 84 50 -109.75 gain 50 85 -124.05 gain 85 50 -112.89 gain 50 86 -122.92 gain 86 50 -115.15 gain 50 87 -124.99 gain 87 50 -121.18 gain 50 88 -128.25 gain 88 50 -122.18 gain 50 89 -134.91 gain 89 50 -127.45 gain 50 90 -121.27 gain 90 50 -110.81 gain 50 91 -125.74 gain 91 50 -119.23 gain 50 92 -119.64 gain 92 50 -110.09 gain 50 93 -118.00 gain 93 50 -113.24 gain 50 94 -116.81 gain 94 50 -111.92 gain 50 95 -112.87 gain 95 50 -110.24 gain 50 96 -114.52 gain 96 50 -109.23 gain 50 97 -110.70 gain 97 50 -104.14 gain 50 98 -120.16 gain 98 50 -114.41 gain 50 99 -113.86 gain 99 50 -105.93 gain 50 100 -127.37 gain 100 50 -119.00 gain 50 101 -118.00 gain 101 50 -109.79 gain 50 102 -128.12 gain 102 50 -120.70 gain 50 103 -130.98 gain 103 50 -121.04 gain 50 104 -135.12 gain 104 50 -130.56 gain 50 105 -118.53 gain 105 50 -109.91 gain 50 106 -116.61 gain 106 50 -109.07 gain 50 107 -123.92 gain 107 50 -122.95 gain 50 108 -119.79 gain 108 50 -111.14 gain 50 109 -115.47 gain 109 50 -110.31 gain 50 110 -120.16 gain 110 50 -113.47 gain 50 111 -113.70 gain 111 50 -106.69 gain 50 112 -126.34 gain 112 50 -118.20 gain 50 113 -124.81 gain 113 50 -115.48 gain 50 114 -117.62 gain 114 50 -111.59 gain 50 115 -125.02 gain 115 50 -113.30 gain 50 116 -124.00 gain 116 50 -119.82 gain 50 117 -129.12 gain 117 50 -126.44 gain 50 118 -129.72 gain 118 50 -125.36 gain 50 119 -128.16 gain 119 50 -118.46 gain 50 120 -123.44 gain 120 50 -118.26 gain 50 121 -123.77 gain 121 50 -117.87 gain 50 122 -123.98 gain 122 50 -120.20 gain 50 123 -123.34 gain 123 50 -120.34 gain 50 124 -122.88 gain 124 50 -116.29 gain 50 125 -118.40 gain 125 50 -113.14 gain 50 126 -122.90 gain 126 50 -115.60 gain 50 127 -121.17 gain 127 50 -117.33 gain 50 128 -121.21 gain 128 50 -115.30 gain 50 129 -124.56 gain 129 50 -116.56 gain 50 130 -125.80 gain 130 50 -115.63 gain 50 131 -127.46 gain 131 50 -124.38 gain 50 132 -125.75 gain 132 50 -122.30 gain 50 133 -129.03 gain 133 50 -123.64 gain 50 134 -124.82 gain 134 50 -116.14 gain 50 135 -132.63 gain 135 50 -127.52 gain 50 136 -122.92 gain 136 50 -118.42 gain 50 137 -128.08 gain 137 50 -121.06 gain 50 138 -127.39 gain 138 50 -119.37 gain 50 139 -131.00 gain 139 50 -123.96 gain 50 140 -124.15 gain 140 50 -119.72 gain 50 141 -126.81 gain 141 50 -121.05 gain 50 142 -129.48 gain 142 50 -123.03 gain 50 143 -131.28 gain 143 50 -124.44 gain 50 144 -130.01 gain 144 50 -124.19 gain 50 145 -126.30 gain 145 50 -118.93 gain 50 146 -127.61 gain 146 50 -119.15 gain 50 147 -137.01 gain 147 50 -125.64 gain 50 148 -127.78 gain 148 50 -116.13 gain 50 149 -127.01 gain 149 50 -118.53 gain 50 150 -129.03 gain 150 50 -123.23 gain 50 151 -129.62 gain 151 50 -124.02 gain 50 152 -134.01 gain 152 50 -125.39 gain 50 153 -125.56 gain 153 50 -114.51 gain 50 154 -126.99 gain 154 50 -124.49 gain 50 155 -121.39 gain 155 50 -118.78 gain 50 156 -122.12 gain 156 50 -113.91 gain 50 157 -121.16 gain 157 50 -115.89 gain 50 158 -125.15 gain 158 50 -122.48 gain 50 159 -128.81 gain 159 50 -122.76 gain 50 160 -129.32 gain 160 50 -120.37 gain 50 161 -138.29 gain 161 50 -132.84 gain 50 162 -128.50 gain 162 50 -121.91 gain 50 163 -127.51 gain 163 50 -123.07 gain 50 164 -129.17 gain 164 50 -125.77 gain 50 165 -129.82 gain 165 50 -122.47 gain 50 166 -137.32 gain 166 50 -131.53 gain 50 167 -127.37 gain 167 50 -123.67 gain 50 168 -121.77 gain 168 50 -116.52 gain 50 169 -126.20 gain 169 50 -125.15 gain 50 170 -128.78 gain 170 50 -119.25 gain 50 171 -122.21 gain 171 50 -117.71 gain 50 172 -125.86 gain 172 50 -116.05 gain 50 173 -129.39 gain 173 50 -119.02 gain 50 174 -120.72 gain 174 50 -114.65 gain 50 175 -129.89 gain 175 50 -127.37 gain 50 176 -132.87 gain 176 50 -122.37 gain 50 177 -126.39 gain 177 50 -123.69 gain 50 178 -129.38 gain 178 50 -122.51 gain 50 179 -133.86 gain 179 50 -125.38 gain 50 180 -129.14 gain 180 50 -122.13 gain 50 181 -125.19 gain 181 50 -118.24 gain 50 182 -136.21 gain 182 50 -131.66 gain 50 183 -129.33 gain 183 50 -118.16 gain 50 184 -139.25 gain 184 50 -132.87 gain 50 185 -131.50 gain 185 50 -122.61 gain 50 186 -128.37 gain 186 50 -119.75 gain 50 187 -128.75 gain 187 50 -122.67 gain 50 188 -117.77 gain 188 50 -114.96 gain 50 189 -130.75 gain 189 50 -125.46 gain 50 190 -128.90 gain 190 50 -120.62 gain 50 191 -131.79 gain 191 50 -124.59 gain 50 192 -129.52 gain 192 50 -125.19 gain 50 193 -132.68 gain 193 50 -129.60 gain 50 194 -144.47 gain 194 50 -135.20 gain 50 195 -134.12 gain 195 50 -125.48 gain 50 196 -138.87 gain 196 50 -134.27 gain 50 197 -131.03 gain 197 50 -122.50 gain 50 198 -126.39 gain 198 50 -117.38 gain 50 199 -130.86 gain 199 50 -125.77 gain 50 200 -138.25 gain 200 50 -130.10 gain 50 201 -137.90 gain 201 50 -130.55 gain 50 202 -133.52 gain 202 50 -130.17 gain 50 203 -133.80 gain 203 50 -130.07 gain 50 204 -127.84 gain 204 50 -121.39 gain 50 205 -133.21 gain 205 50 -125.84 gain 50 206 -131.31 gain 206 50 -128.46 gain 50 207 -134.54 gain 207 50 -124.05 gain 50 208 -131.70 gain 208 50 -126.99 gain 50 209 -134.19 gain 209 50 -130.47 gain 50 210 -133.05 gain 210 50 -126.27 gain 50 211 -128.82 gain 211 50 -124.06 gain 50 212 -124.06 gain 212 50 -117.84 gain 50 213 -129.81 gain 213 50 -122.78 gain 50 214 -125.99 gain 214 50 -118.85 gain 50 215 -134.86 gain 215 50 -124.14 gain 50 216 -136.64 gain 216 50 -130.58 gain 50 217 -134.30 gain 217 50 -128.76 gain 50 218 -132.60 gain 218 50 -129.25 gain 50 219 -126.47 gain 219 50 -114.47 gain 50 220 -130.76 gain 220 50 -129.26 gain 50 221 -141.52 gain 221 50 -135.66 gain 50 222 -134.45 gain 222 50 -128.91 gain 50 223 -128.86 gain 223 50 -121.94 gain 50 224 -136.78 gain 224 50 -132.54 gain 51 52 -96.55 gain 52 51 -92.57 gain 51 53 -101.44 gain 53 51 -98.47 gain 51 54 -114.44 gain 54 51 -112.17 gain 51 55 -122.50 gain 55 51 -119.53 gain 51 56 -113.14 gain 56 51 -117.50 gain 51 57 -109.85 gain 57 51 -108.09 gain 51 58 -120.30 gain 58 51 -121.27 gain 51 59 -123.53 gain 59 51 -120.63 gain 51 60 -121.96 gain 60 51 -120.38 gain 51 61 -118.22 gain 61 51 -115.40 gain 51 62 -111.71 gain 62 51 -114.10 gain 51 63 -111.60 gain 63 51 -107.21 gain 51 64 -107.08 gain 64 51 -105.67 gain 51 65 -101.36 gain 65 51 -102.04 gain 51 66 -90.37 gain 66 51 -85.30 gain 51 67 -102.02 gain 67 51 -99.23 gain 51 68 -111.64 gain 68 51 -113.40 gain 51 69 -106.21 gain 69 51 -105.27 gain 51 70 -111.32 gain 70 51 -110.13 gain 51 71 -116.47 gain 71 51 -113.39 gain 51 72 -115.52 gain 72 51 -112.86 gain 51 73 -122.13 gain 73 51 -117.86 gain 51 74 -124.97 gain 74 51 -124.57 gain 51 75 -121.31 gain 75 51 -121.06 gain 51 76 -119.43 gain 76 51 -115.13 gain 51 77 -114.51 gain 77 51 -113.87 gain 51 78 -110.84 gain 78 51 -113.05 gain 51 79 -112.25 gain 79 51 -109.24 gain 51 80 -108.97 gain 80 51 -106.47 gain 51 81 -98.36 gain 81 51 -96.45 gain 51 82 -107.61 gain 82 51 -103.33 gain 51 83 -111.17 gain 83 51 -107.92 gain 51 84 -111.20 gain 84 51 -108.09 gain 51 85 -119.24 gain 85 51 -112.94 gain 51 86 -116.91 gain 86 51 -113.99 gain 51 87 -123.38 gain 87 51 -124.42 gain 51 88 -119.62 gain 88 51 -118.42 gain 51 89 -118.85 gain 89 51 -116.25 gain 51 90 -123.95 gain 90 51 -118.35 gain 51 91 -120.37 gain 91 51 -118.72 gain 51 92 -117.75 gain 92 51 -113.06 gain 51 93 -107.78 gain 93 51 -107.88 gain 51 94 -111.01 gain 94 51 -110.98 gain 51 95 -106.95 gain 95 51 -109.17 gain 51 96 -111.25 gain 96 51 -110.81 gain 51 97 -109.56 gain 97 51 -107.87 gain 51 98 -109.76 gain 98 51 -108.86 gain 51 99 -118.14 gain 99 51 -115.06 gain 51 100 -120.03 gain 100 51 -116.52 gain 51 101 -119.00 gain 101 51 -115.66 gain 51 102 -122.78 gain 102 51 -120.22 gain 51 103 -118.18 gain 103 51 -113.10 gain 51 104 -119.33 gain 104 51 -119.63 gain 51 105 -119.33 gain 105 51 -115.57 gain 51 106 -118.00 gain 106 51 -115.33 gain 51 107 -116.08 gain 107 51 -119.97 gain 51 108 -115.40 gain 108 51 -111.61 gain 51 109 -111.66 gain 109 51 -111.36 gain 51 110 -114.84 gain 110 51 -113.00 gain 51 111 -111.51 gain 111 51 -109.36 gain 51 112 -118.13 gain 112 51 -114.86 gain 51 113 -113.35 gain 113 51 -108.88 gain 51 114 -118.21 gain 114 51 -117.05 gain 51 115 -119.46 gain 115 51 -112.59 gain 51 116 -122.85 gain 116 51 -123.52 gain 51 117 -125.59 gain 117 51 -127.77 gain 51 118 -119.52 gain 118 51 -120.02 gain 51 119 -127.76 gain 119 51 -122.92 gain 51 120 -126.93 gain 120 51 -126.61 gain 51 121 -115.02 gain 121 51 -113.99 gain 51 122 -122.72 gain 122 51 -123.81 gain 51 123 -122.56 gain 123 51 -124.42 gain 51 124 -114.17 gain 124 51 -112.44 gain 51 125 -115.91 gain 125 51 -115.51 gain 51 126 -117.03 gain 126 51 -114.59 gain 51 127 -120.12 gain 127 51 -121.14 gain 51 128 -108.31 gain 128 51 -107.27 gain 51 129 -116.86 gain 129 51 -113.72 gain 51 130 -115.83 gain 130 51 -110.52 gain 51 131 -121.27 gain 131 51 -123.04 gain 51 132 -117.89 gain 132 51 -119.29 gain 51 133 -123.04 gain 133 51 -122.51 gain 51 134 -125.83 gain 134 51 -122.00 gain 51 135 -120.89 gain 135 51 -120.64 gain 51 136 -123.43 gain 136 51 -123.78 gain 51 137 -117.31 gain 137 51 -115.15 gain 51 138 -125.23 gain 138 51 -122.07 gain 51 139 -119.99 gain 139 51 -117.82 gain 51 140 -122.21 gain 140 51 -122.64 gain 51 141 -118.31 gain 141 51 -117.42 gain 51 142 -122.36 gain 142 51 -120.77 gain 51 143 -122.66 gain 143 51 -120.68 gain 51 144 -118.54 gain 144 51 -117.58 gain 51 145 -117.80 gain 145 51 -115.30 gain 51 146 -120.82 gain 146 51 -117.23 gain 51 147 -127.79 gain 147 51 -121.28 gain 51 148 -130.12 gain 148 51 -123.33 gain 51 149 -125.98 gain 149 51 -122.35 gain 51 150 -123.46 gain 150 51 -122.53 gain 51 151 -121.89 gain 151 51 -121.15 gain 51 152 -126.61 gain 152 51 -122.85 gain 51 153 -124.69 gain 153 51 -118.51 gain 51 154 -115.16 gain 154 51 -117.53 gain 51 155 -126.12 gain 155 51 -128.38 gain 51 156 -120.73 gain 156 51 -117.38 gain 51 157 -117.49 gain 157 51 -117.08 gain 51 158 -116.17 gain 158 51 -118.36 gain 51 159 -119.77 gain 159 51 -118.57 gain 51 160 -121.81 gain 160 51 -117.73 gain 51 161 -119.03 gain 161 51 -118.44 gain 51 162 -131.68 gain 162 51 -129.95 gain 51 163 -122.29 gain 163 51 -122.71 gain 51 164 -129.26 gain 164 51 -130.72 gain 51 165 -127.46 gain 165 51 -124.96 gain 51 166 -132.48 gain 166 51 -131.55 gain 51 167 -119.33 gain 167 51 -120.49 gain 51 168 -127.41 gain 168 51 -127.02 gain 51 169 -120.19 gain 169 51 -124.00 gain 51 170 -123.93 gain 170 51 -119.26 gain 51 171 -122.42 gain 171 51 -122.78 gain 51 172 -125.84 gain 172 51 -120.89 gain 51 173 -118.70 gain 173 51 -113.19 gain 51 174 -117.65 gain 174 51 -116.44 gain 51 175 -120.14 gain 175 51 -122.48 gain 51 176 -121.46 gain 176 51 -115.82 gain 51 177 -129.38 gain 177 51 -131.54 gain 51 178 -128.77 gain 178 51 -126.76 gain 51 179 -125.77 gain 179 51 -122.16 gain 51 180 -134.69 gain 180 51 -132.54 gain 51 181 -122.70 gain 181 51 -120.61 gain 51 182 -128.13 gain 182 51 -128.43 gain 51 183 -126.89 gain 183 51 -120.58 gain 51 184 -121.19 gain 184 51 -119.67 gain 51 185 -125.62 gain 185 51 -121.58 gain 51 186 -123.21 gain 186 51 -119.46 gain 51 187 -130.19 gain 187 51 -128.97 gain 51 188 -130.09 gain 188 51 -132.14 gain 51 189 -123.36 gain 189 51 -122.92 gain 51 190 -127.79 gain 190 51 -124.37 gain 51 191 -125.45 gain 191 51 -123.11 gain 51 192 -124.05 gain 192 51 -124.58 gain 51 193 -134.00 gain 193 51 -135.78 gain 51 194 -121.05 gain 194 51 -116.64 gain 51 195 -123.04 gain 195 51 -119.26 gain 51 196 -123.70 gain 196 51 -123.96 gain 51 197 -132.47 gain 197 51 -128.80 gain 51 198 -125.16 gain 198 51 -121.01 gain 51 199 -125.38 gain 199 51 -125.14 gain 51 200 -124.68 gain 200 51 -121.38 gain 51 201 -126.44 gain 201 51 -123.94 gain 51 202 -123.87 gain 202 51 -125.38 gain 51 203 -127.51 gain 203 51 -128.64 gain 51 204 -131.34 gain 204 51 -129.75 gain 51 205 -130.49 gain 205 51 -127.98 gain 51 206 -121.98 gain 206 51 -123.99 gain 51 207 -122.25 gain 207 51 -116.62 gain 51 208 -128.99 gain 208 51 -129.14 gain 51 209 -122.88 gain 209 51 -124.02 gain 51 210 -126.28 gain 210 51 -124.35 gain 51 211 -129.81 gain 211 51 -129.91 gain 51 212 -124.53 gain 212 51 -123.17 gain 51 213 -129.91 gain 213 51 -127.74 gain 51 214 -118.93 gain 214 51 -116.65 gain 51 215 -119.98 gain 215 51 -114.12 gain 51 216 -128.60 gain 216 51 -127.39 gain 51 217 -133.64 gain 217 51 -132.96 gain 51 218 -124.99 gain 218 51 -126.49 gain 51 219 -118.08 gain 219 51 -110.94 gain 51 220 -121.71 gain 220 51 -125.06 gain 51 221 -128.99 gain 221 51 -127.99 gain 51 222 -122.66 gain 222 51 -121.99 gain 51 223 -122.79 gain 223 51 -120.73 gain 51 224 -125.78 gain 224 51 -126.41 gain 52 53 -84.64 gain 53 52 -85.65 gain 52 54 -100.89 gain 54 52 -102.60 gain 52 55 -106.64 gain 55 52 -107.65 gain 52 56 -113.23 gain 56 52 -121.57 gain 52 57 -114.92 gain 57 52 -117.13 gain 52 58 -110.54 gain 58 52 -115.50 gain 52 59 -115.09 gain 59 52 -116.17 gain 52 60 -112.14 gain 60 52 -114.54 gain 52 61 -118.08 gain 61 52 -119.23 gain 52 62 -115.28 gain 62 52 -121.66 gain 52 63 -107.03 gain 63 52 -106.63 gain 52 64 -103.36 gain 64 52 -105.94 gain 52 65 -103.13 gain 65 52 -107.79 gain 52 66 -83.09 gain 66 52 -82.01 gain 52 67 -89.76 gain 67 52 -90.95 gain 52 68 -101.90 gain 68 52 -107.65 gain 52 69 -91.55 gain 69 52 -94.59 gain 52 70 -101.87 gain 70 52 -104.67 gain 52 71 -110.49 gain 71 52 -111.40 gain 52 72 -113.50 gain 72 52 -114.82 gain 52 73 -116.40 gain 73 52 -116.11 gain 52 74 -118.33 gain 74 52 -121.92 gain 52 75 -112.71 gain 75 52 -116.44 gain 52 76 -114.41 gain 76 52 -114.09 gain 52 77 -114.19 gain 77 52 -117.53 gain 52 78 -116.14 gain 78 52 -122.34 gain 52 79 -109.03 gain 79 52 -110.01 gain 52 80 -104.67 gain 80 52 -106.15 gain 52 81 -107.21 gain 81 52 -109.28 gain 52 82 -98.60 gain 82 52 -98.29 gain 52 83 -113.69 gain 83 52 -114.42 gain 52 84 -108.77 gain 84 52 -109.64 gain 52 85 -108.67 gain 85 52 -106.35 gain 52 86 -105.02 gain 86 52 -106.09 gain 52 87 -108.89 gain 87 52 -113.92 gain 52 88 -113.88 gain 88 52 -116.66 gain 52 89 -121.03 gain 89 52 -122.41 gain 52 90 -127.27 gain 90 52 -125.66 gain 52 91 -115.00 gain 91 52 -117.33 gain 52 92 -115.82 gain 92 52 -115.11 gain 52 93 -117.01 gain 93 52 -121.09 gain 52 94 -108.49 gain 94 52 -112.45 gain 52 95 -105.25 gain 95 52 -111.46 gain 52 96 -109.84 gain 96 52 -113.38 gain 52 97 -106.81 gain 97 52 -109.10 gain 52 98 -106.64 gain 98 52 -109.73 gain 52 99 -102.29 gain 99 52 -103.20 gain 52 100 -113.05 gain 100 52 -113.52 gain 52 101 -119.55 gain 101 52 -120.19 gain 52 102 -116.32 gain 102 52 -117.74 gain 52 103 -115.06 gain 103 52 -113.96 gain 52 104 -120.59 gain 104 52 -124.87 gain 52 105 -119.17 gain 105 52 -119.39 gain 52 106 -116.99 gain 106 52 -118.30 gain 52 107 -115.48 gain 107 52 -123.35 gain 52 108 -119.03 gain 108 52 -119.22 gain 52 109 -105.03 gain 109 52 -108.71 gain 52 110 -108.93 gain 110 52 -111.08 gain 52 111 -113.13 gain 111 52 -114.96 gain 52 112 -118.32 gain 112 52 -119.03 gain 52 113 -111.46 gain 113 52 -110.97 gain 52 114 -104.94 gain 114 52 -107.75 gain 52 115 -98.62 gain 115 52 -95.74 gain 52 116 -108.04 gain 116 52 -112.70 gain 52 117 -112.25 gain 117 52 -118.41 gain 52 118 -116.61 gain 118 52 -121.09 gain 52 119 -120.15 gain 119 52 -119.29 gain 52 120 -111.75 gain 120 52 -115.41 gain 52 121 -121.51 gain 121 52 -124.46 gain 52 122 -118.70 gain 122 52 -123.76 gain 52 123 -115.18 gain 123 52 -121.02 gain 52 124 -117.43 gain 124 52 -119.68 gain 52 125 -116.52 gain 125 52 -120.10 gain 52 126 -109.01 gain 126 52 -110.55 gain 52 127 -103.58 gain 127 52 -108.58 gain 52 128 -113.81 gain 128 52 -116.75 gain 52 129 -111.02 gain 129 52 -111.87 gain 52 130 -107.91 gain 130 52 -106.58 gain 52 131 -115.97 gain 131 52 -121.73 gain 52 132 -115.49 gain 132 52 -120.88 gain 52 133 -120.26 gain 133 52 -123.72 gain 52 134 -124.72 gain 134 52 -124.87 gain 52 135 -117.75 gain 135 52 -121.48 gain 52 136 -116.48 gain 136 52 -120.82 gain 52 137 -119.10 gain 137 52 -120.92 gain 52 138 -114.14 gain 138 52 -114.96 gain 52 139 -109.55 gain 139 52 -111.35 gain 52 140 -113.98 gain 140 52 -118.39 gain 52 141 -117.60 gain 141 52 -120.69 gain 52 142 -104.40 gain 142 52 -106.79 gain 52 143 -112.48 gain 143 52 -114.49 gain 52 144 -119.42 gain 144 52 -122.44 gain 52 145 -113.56 gain 145 52 -115.03 gain 52 146 -118.67 gain 146 52 -119.06 gain 52 147 -125.04 gain 147 52 -122.52 gain 52 148 -123.07 gain 148 52 -120.26 gain 52 149 -117.38 gain 149 52 -117.74 gain 52 150 -123.18 gain 150 52 -126.22 gain 52 151 -115.96 gain 151 52 -119.20 gain 52 152 -117.74 gain 152 52 -117.96 gain 52 153 -121.33 gain 153 52 -119.12 gain 52 154 -109.56 gain 154 52 -115.90 gain 52 155 -115.78 gain 155 52 -122.02 gain 52 156 -112.84 gain 156 52 -113.47 gain 52 157 -120.01 gain 157 52 -123.58 gain 52 158 -122.66 gain 158 52 -128.83 gain 52 159 -112.49 gain 159 52 -115.28 gain 52 160 -117.62 gain 160 52 -117.51 gain 52 161 -116.57 gain 161 52 -119.96 gain 52 162 -116.04 gain 162 52 -118.29 gain 52 163 -126.15 gain 163 52 -130.56 gain 52 164 -122.38 gain 164 52 -127.82 gain 52 165 -123.16 gain 165 52 -124.64 gain 52 166 -121.69 gain 166 52 -124.75 gain 52 167 -114.67 gain 167 52 -119.82 gain 52 168 -119.16 gain 168 52 -122.76 gain 52 169 -124.15 gain 169 52 -131.94 gain 52 170 -118.63 gain 170 52 -117.95 gain 52 171 -115.82 gain 171 52 -120.16 gain 52 172 -112.08 gain 172 52 -111.12 gain 52 173 -121.94 gain 173 52 -120.42 gain 52 174 -122.04 gain 174 52 -124.82 gain 52 175 -121.28 gain 175 52 -127.60 gain 52 176 -119.38 gain 176 52 -117.72 gain 52 177 -124.94 gain 177 52 -131.09 gain 52 178 -113.93 gain 178 52 -115.90 gain 52 179 -120.12 gain 179 52 -120.48 gain 52 180 -115.05 gain 180 52 -116.88 gain 52 181 -119.95 gain 181 52 -121.85 gain 52 182 -122.79 gain 182 52 -127.08 gain 52 183 -123.96 gain 183 52 -121.64 gain 52 184 -120.94 gain 184 52 -123.40 gain 52 185 -122.07 gain 185 52 -122.01 gain 52 186 -121.18 gain 186 52 -121.41 gain 52 187 -117.79 gain 187 52 -120.56 gain 52 188 -123.41 gain 188 52 -129.44 gain 52 189 -120.14 gain 189 52 -123.69 gain 52 190 -127.23 gain 190 52 -127.78 gain 52 191 -123.99 gain 191 52 -125.64 gain 52 192 -121.91 gain 192 52 -126.42 gain 52 193 -124.76 gain 193 52 -130.53 gain 52 194 -125.94 gain 194 52 -125.52 gain 52 195 -122.01 gain 195 52 -122.22 gain 52 196 -120.33 gain 196 52 -124.58 gain 52 197 -126.26 gain 197 52 -126.57 gain 52 198 -119.80 gain 198 52 -119.64 gain 52 199 -114.93 gain 199 52 -118.68 gain 52 200 -125.34 gain 200 52 -126.02 gain 52 201 -121.49 gain 201 52 -122.98 gain 52 202 -125.66 gain 202 52 -131.15 gain 52 203 -122.13 gain 203 52 -127.24 gain 52 204 -121.09 gain 204 52 -123.49 gain 52 205 -123.13 gain 205 52 -124.60 gain 52 206 -124.62 gain 206 52 -130.61 gain 52 207 -114.31 gain 207 52 -112.66 gain 52 208 -122.84 gain 208 52 -126.97 gain 52 209 -123.94 gain 209 52 -129.06 gain 52 210 -125.61 gain 210 52 -127.67 gain 52 211 -124.21 gain 211 52 -128.29 gain 52 212 -128.83 gain 212 52 -131.46 gain 52 213 -127.85 gain 213 52 -129.67 gain 52 214 -123.12 gain 214 52 -124.82 gain 52 215 -122.12 gain 215 52 -120.24 gain 52 216 -122.15 gain 216 52 -124.93 gain 52 217 -122.70 gain 217 52 -125.99 gain 52 218 -128.39 gain 218 52 -133.88 gain 52 219 -122.16 gain 219 52 -119.00 gain 52 220 -120.58 gain 220 52 -127.92 gain 52 221 -112.55 gain 221 52 -115.53 gain 52 222 -121.63 gain 222 52 -124.94 gain 52 223 -126.09 gain 223 52 -128.01 gain 52 224 -126.30 gain 224 52 -130.91 gain 53 54 -93.88 gain 54 53 -94.58 gain 53 55 -99.06 gain 55 53 -99.05 gain 53 56 -112.22 gain 56 53 -119.55 gain 53 57 -107.23 gain 57 53 -108.43 gain 53 58 -120.15 gain 58 53 -124.09 gain 53 59 -119.54 gain 59 53 -119.61 gain 53 60 -115.05 gain 60 53 -116.44 gain 53 61 -117.49 gain 61 53 -117.63 gain 53 62 -123.19 gain 62 53 -128.55 gain 53 63 -116.79 gain 63 53 -115.38 gain 53 64 -114.63 gain 64 53 -116.18 gain 53 65 -107.95 gain 65 53 -111.59 gain 53 66 -105.38 gain 66 53 -103.28 gain 53 67 -90.67 gain 67 53 -90.84 gain 53 68 -93.99 gain 68 53 -98.73 gain 53 69 -99.95 gain 69 53 -101.98 gain 53 70 -94.38 gain 70 53 -96.17 gain 53 71 -106.75 gain 71 53 -106.64 gain 53 72 -113.17 gain 72 53 -113.48 gain 53 73 -111.41 gain 73 53 -110.11 gain 53 74 -114.32 gain 74 53 -116.89 gain 53 75 -117.24 gain 75 53 -119.96 gain 53 76 -124.24 gain 76 53 -122.90 gain 53 77 -108.06 gain 77 53 -110.39 gain 53 78 -104.33 gain 78 53 -109.51 gain 53 79 -109.21 gain 79 53 -109.16 gain 53 80 -111.04 gain 80 53 -111.50 gain 53 81 -104.84 gain 81 53 -105.89 gain 53 82 -104.74 gain 82 53 -103.42 gain 53 83 -97.32 gain 83 53 -97.03 gain 53 84 -101.95 gain 84 53 -101.81 gain 53 85 -103.05 gain 85 53 -99.72 gain 53 86 -107.63 gain 86 53 -107.69 gain 53 87 -102.56 gain 87 53 -106.58 gain 53 88 -115.26 gain 88 53 -117.02 gain 53 89 -122.98 gain 89 53 -123.35 gain 53 90 -123.88 gain 90 53 -121.26 gain 53 91 -124.28 gain 91 53 -125.60 gain 53 92 -112.34 gain 92 53 -110.62 gain 53 93 -119.25 gain 93 53 -122.31 gain 53 94 -115.95 gain 94 53 -118.89 gain 53 95 -109.29 gain 95 53 -114.48 gain 53 96 -111.04 gain 96 53 -113.57 gain 53 97 -99.87 gain 97 53 -101.14 gain 53 98 -103.99 gain 98 53 -106.07 gain 53 99 -102.39 gain 99 53 -102.29 gain 53 100 -102.19 gain 100 53 -101.65 gain 53 101 -112.61 gain 101 53 -112.23 gain 53 102 -110.15 gain 102 53 -110.55 gain 53 103 -114.88 gain 103 53 -112.76 gain 53 104 -120.13 gain 104 53 -123.40 gain 53 105 -119.38 gain 105 53 -118.58 gain 53 106 -123.06 gain 106 53 -123.35 gain 53 107 -116.62 gain 107 53 -123.48 gain 53 108 -115.73 gain 108 53 -114.91 gain 53 109 -112.27 gain 109 53 -114.93 gain 53 110 -113.25 gain 110 53 -114.38 gain 53 111 -108.24 gain 111 53 -109.06 gain 53 112 -104.66 gain 112 53 -104.35 gain 53 113 -107.52 gain 113 53 -106.02 gain 53 114 -112.11 gain 114 53 -113.92 gain 53 115 -107.82 gain 115 53 -103.92 gain 53 116 -105.03 gain 116 53 -108.68 gain 53 117 -108.89 gain 117 53 -114.04 gain 53 118 -122.87 gain 118 53 -126.33 gain 53 119 -112.84 gain 119 53 -110.97 gain 53 120 -119.17 gain 120 53 -121.81 gain 53 121 -118.48 gain 121 53 -120.41 gain 53 122 -119.74 gain 122 53 -123.79 gain 53 123 -121.04 gain 123 53 -125.86 gain 53 124 -113.82 gain 124 53 -115.05 gain 53 125 -120.13 gain 125 53 -122.70 gain 53 126 -114.26 gain 126 53 -114.79 gain 53 127 -119.87 gain 127 53 -123.86 gain 53 128 -109.53 gain 128 53 -111.45 gain 53 129 -110.97 gain 129 53 -110.80 gain 53 130 -115.67 gain 130 53 -113.32 gain 53 131 -118.70 gain 131 53 -123.45 gain 53 132 -119.29 gain 132 53 -123.66 gain 53 133 -113.19 gain 133 53 -115.64 gain 53 134 -117.31 gain 134 53 -116.45 gain 53 135 -118.81 gain 135 53 -121.52 gain 53 136 -122.42 gain 136 53 -125.74 gain 53 137 -122.57 gain 137 53 -123.37 gain 53 138 -114.24 gain 138 53 -114.04 gain 53 139 -118.48 gain 139 53 -119.27 gain 53 140 -118.46 gain 140 53 -121.86 gain 53 141 -115.23 gain 141 53 -117.30 gain 53 142 -109.76 gain 142 53 -111.14 gain 53 143 -115.27 gain 143 53 -116.26 gain 53 144 -113.11 gain 144 53 -115.12 gain 53 145 -118.85 gain 145 53 -119.31 gain 53 146 -112.67 gain 146 53 -112.03 gain 53 147 -117.26 gain 147 53 -113.72 gain 53 148 -120.38 gain 148 53 -116.56 gain 53 149 -116.51 gain 149 53 -115.85 gain 53 150 -120.36 gain 150 53 -122.39 gain 53 151 -121.09 gain 151 53 -123.32 gain 53 152 -127.71 gain 152 53 -126.92 gain 53 153 -121.73 gain 153 53 -118.51 gain 53 154 -115.86 gain 154 53 -121.19 gain 53 155 -116.42 gain 155 53 -121.65 gain 53 156 -117.46 gain 156 53 -117.07 gain 53 157 -114.97 gain 157 53 -117.53 gain 53 158 -113.13 gain 158 53 -118.28 gain 53 159 -114.28 gain 159 53 -116.05 gain 53 160 -118.47 gain 160 53 -117.35 gain 53 161 -117.51 gain 161 53 -119.88 gain 53 162 -119.56 gain 162 53 -120.79 gain 53 163 -119.36 gain 163 53 -122.74 gain 53 164 -123.20 gain 164 53 -127.63 gain 53 165 -117.44 gain 165 53 -117.91 gain 53 166 -123.00 gain 166 53 -125.04 gain 53 167 -123.22 gain 167 53 -127.35 gain 53 168 -129.72 gain 168 53 -132.30 gain 53 169 -127.15 gain 169 53 -133.92 gain 53 170 -125.23 gain 170 53 -123.53 gain 53 171 -122.09 gain 171 53 -125.41 gain 53 172 -116.15 gain 172 53 -114.17 gain 53 173 -113.68 gain 173 53 -111.14 gain 53 174 -128.52 gain 174 53 -130.27 gain 53 175 -119.78 gain 175 53 -125.09 gain 53 176 -121.58 gain 176 53 -118.91 gain 53 177 -125.52 gain 177 53 -130.66 gain 53 178 -125.39 gain 178 53 -126.35 gain 53 179 -121.25 gain 179 53 -120.60 gain 53 180 -127.96 gain 180 53 -128.78 gain 53 181 -121.97 gain 181 53 -122.85 gain 53 182 -122.16 gain 182 53 -125.43 gain 53 183 -124.19 gain 183 53 -120.85 gain 53 184 -122.78 gain 184 53 -124.22 gain 53 185 -118.93 gain 185 53 -117.86 gain 53 186 -114.26 gain 186 53 -113.47 gain 53 187 -125.39 gain 187 53 -127.15 gain 53 188 -117.37 gain 188 53 -122.38 gain 53 189 -125.67 gain 189 53 -128.20 gain 53 190 -125.09 gain 190 53 -124.63 gain 53 191 -122.95 gain 191 53 -123.58 gain 53 192 -122.21 gain 192 53 -125.71 gain 53 193 -130.92 gain 193 53 -135.67 gain 53 194 -126.75 gain 194 53 -125.31 gain 53 195 -124.06 gain 195 53 -123.25 gain 53 196 -125.64 gain 196 53 -128.87 gain 53 197 -128.42 gain 197 53 -127.71 gain 53 198 -123.39 gain 198 53 -122.20 gain 53 199 -121.89 gain 199 53 -124.62 gain 53 200 -127.37 gain 200 53 -127.04 gain 53 201 -125.80 gain 201 53 -126.27 gain 53 202 -126.91 gain 202 53 -131.38 gain 53 203 -123.69 gain 203 53 -127.79 gain 53 204 -125.63 gain 204 53 -127.01 gain 53 205 -112.97 gain 205 53 -113.42 gain 53 206 -120.70 gain 206 53 -125.67 gain 53 207 -123.02 gain 207 53 -120.36 gain 53 208 -117.79 gain 208 53 -120.90 gain 53 209 -122.54 gain 209 53 -126.65 gain 53 210 -127.84 gain 210 53 -128.88 gain 53 211 -126.27 gain 211 53 -129.33 gain 53 212 -118.71 gain 212 53 -120.32 gain 53 213 -120.49 gain 213 53 -121.29 gain 53 214 -119.39 gain 214 53 -120.07 gain 53 215 -126.65 gain 215 53 -123.75 gain 53 216 -122.03 gain 216 53 -123.79 gain 53 217 -127.98 gain 217 53 -130.26 gain 53 218 -122.03 gain 218 53 -126.51 gain 53 219 -129.04 gain 219 53 -124.87 gain 53 220 -126.56 gain 220 53 -132.88 gain 53 221 -131.56 gain 221 53 -133.52 gain 53 222 -128.14 gain 222 53 -130.43 gain 53 223 -126.62 gain 223 53 -127.52 gain 53 224 -129.38 gain 224 53 -132.97 gain 54 55 -84.50 gain 55 54 -83.79 gain 54 56 -95.78 gain 56 54 -102.40 gain 54 57 -110.70 gain 57 54 -111.20 gain 54 58 -120.63 gain 58 54 -123.88 gain 54 59 -108.40 gain 59 54 -107.76 gain 54 60 -124.70 gain 60 54 -125.38 gain 54 61 -122.04 gain 61 54 -121.48 gain 54 62 -117.18 gain 62 54 -121.84 gain 54 63 -120.05 gain 63 54 -117.94 gain 54 64 -117.14 gain 64 54 -118.00 gain 54 65 -118.59 gain 65 54 -121.53 gain 54 66 -104.56 gain 66 54 -101.76 gain 54 67 -99.85 gain 67 54 -99.32 gain 54 68 -105.20 gain 68 54 -109.24 gain 54 69 -97.12 gain 69 54 -98.45 gain 54 70 -94.82 gain 70 54 -95.91 gain 54 71 -107.76 gain 71 54 -106.94 gain 54 72 -109.59 gain 72 54 -109.20 gain 54 73 -108.54 gain 73 54 -106.54 gain 54 74 -110.60 gain 74 54 -112.47 gain 54 75 -118.26 gain 75 54 -120.27 gain 54 76 -119.29 gain 76 54 -117.26 gain 54 77 -109.50 gain 77 54 -111.13 gain 54 78 -118.52 gain 78 54 -123.00 gain 54 79 -111.35 gain 79 54 -110.61 gain 54 80 -111.67 gain 80 54 -111.43 gain 54 81 -112.21 gain 81 54 -112.56 gain 54 82 -117.43 gain 82 54 -115.41 gain 54 83 -102.03 gain 83 54 -101.05 gain 54 84 -102.32 gain 84 54 -101.48 gain 54 85 -102.45 gain 85 54 -98.42 gain 54 86 -102.04 gain 86 54 -101.39 gain 54 87 -112.13 gain 87 54 -115.44 gain 54 88 -115.66 gain 88 54 -116.72 gain 54 89 -112.79 gain 89 54 -112.45 gain 54 90 -114.24 gain 90 54 -110.91 gain 54 91 -122.41 gain 91 54 -123.03 gain 54 92 -118.88 gain 92 54 -116.46 gain 54 93 -112.81 gain 93 54 -115.17 gain 54 94 -114.34 gain 94 54 -116.58 gain 54 95 -108.82 gain 95 54 -113.31 gain 54 96 -108.67 gain 96 54 -110.50 gain 54 97 -104.69 gain 97 54 -105.27 gain 54 98 -108.22 gain 98 54 -109.60 gain 54 99 -107.78 gain 99 54 -106.97 gain 54 100 -111.19 gain 100 54 -109.95 gain 54 101 -104.65 gain 101 54 -103.57 gain 54 102 -111.09 gain 102 54 -110.79 gain 54 103 -118.62 gain 103 54 -115.80 gain 54 104 -119.42 gain 104 54 -121.98 gain 54 105 -121.36 gain 105 54 -119.87 gain 54 106 -115.86 gain 106 54 -115.45 gain 54 107 -123.36 gain 107 54 -129.52 gain 54 108 -114.64 gain 108 54 -113.12 gain 54 109 -120.29 gain 109 54 -122.25 gain 54 110 -120.37 gain 110 54 -120.81 gain 54 111 -110.90 gain 111 54 -111.01 gain 54 112 -104.50 gain 112 54 -103.49 gain 54 113 -110.09 gain 113 54 -107.88 gain 54 114 -108.06 gain 114 54 -109.16 gain 54 115 -112.93 gain 115 54 -108.34 gain 54 116 -113.86 gain 116 54 -116.80 gain 54 117 -108.77 gain 117 54 -113.21 gain 54 118 -113.80 gain 118 54 -116.56 gain 54 119 -119.64 gain 119 54 -117.06 gain 54 120 -124.89 gain 120 54 -126.83 gain 54 121 -127.12 gain 121 54 -128.35 gain 54 122 -116.25 gain 122 54 -119.60 gain 54 123 -118.97 gain 123 54 -123.09 gain 54 124 -116.62 gain 124 54 -117.15 gain 54 125 -122.97 gain 125 54 -124.84 gain 54 126 -118.37 gain 126 54 -118.19 gain 54 127 -111.39 gain 127 54 -114.67 gain 54 128 -114.02 gain 128 54 -115.24 gain 54 129 -109.28 gain 129 54 -108.41 gain 54 130 -113.06 gain 130 54 -110.02 gain 54 131 -120.19 gain 131 54 -124.24 gain 54 132 -112.47 gain 132 54 -116.14 gain 54 133 -117.37 gain 133 54 -119.11 gain 54 134 -119.33 gain 134 54 -117.77 gain 54 135 -125.81 gain 135 54 -127.82 gain 54 136 -126.16 gain 136 54 -128.79 gain 54 137 -117.65 gain 137 54 -117.75 gain 54 138 -116.51 gain 138 54 -115.61 gain 54 139 -126.04 gain 139 54 -126.13 gain 54 140 -120.39 gain 140 54 -123.09 gain 54 141 -119.69 gain 141 54 -121.06 gain 54 142 -121.27 gain 142 54 -121.95 gain 54 143 -113.14 gain 143 54 -113.44 gain 54 144 -117.95 gain 144 54 -119.26 gain 54 145 -120.05 gain 145 54 -119.81 gain 54 146 -118.48 gain 146 54 -117.15 gain 54 147 -116.25 gain 147 54 -112.01 gain 54 148 -117.83 gain 148 54 -113.30 gain 54 149 -116.43 gain 149 54 -115.08 gain 54 150 -122.43 gain 150 54 -123.76 gain 54 151 -130.07 gain 151 54 -131.59 gain 54 152 -122.52 gain 152 54 -121.02 gain 54 153 -125.94 gain 153 54 -122.02 gain 54 154 -124.53 gain 154 54 -129.16 gain 54 155 -118.65 gain 155 54 -123.18 gain 54 156 -108.72 gain 156 54 -107.64 gain 54 157 -123.16 gain 157 54 -125.01 gain 54 158 -118.87 gain 158 54 -123.32 gain 54 159 -121.10 gain 159 54 -122.17 gain 54 160 -117.82 gain 160 54 -116.01 gain 54 161 -112.65 gain 161 54 -114.32 gain 54 162 -120.92 gain 162 54 -121.46 gain 54 163 -114.49 gain 163 54 -117.18 gain 54 164 -114.79 gain 164 54 -118.51 gain 54 165 -126.75 gain 165 54 -126.52 gain 54 166 -122.93 gain 166 54 -124.27 gain 54 167 -119.74 gain 167 54 -123.17 gain 54 168 -118.52 gain 168 54 -120.40 gain 54 169 -116.32 gain 169 54 -122.39 gain 54 170 -123.52 gain 170 54 -121.13 gain 54 171 -118.67 gain 171 54 -121.30 gain 54 172 -114.46 gain 172 54 -111.78 gain 54 173 -120.95 gain 173 54 -117.71 gain 54 174 -127.10 gain 174 54 -128.15 gain 54 175 -119.95 gain 175 54 -124.56 gain 54 176 -115.03 gain 176 54 -111.65 gain 54 177 -115.31 gain 177 54 -119.74 gain 54 178 -121.03 gain 178 54 -121.29 gain 54 179 -125.71 gain 179 54 -124.35 gain 54 180 -131.95 gain 180 54 -132.07 gain 54 181 -129.61 gain 181 54 -129.79 gain 54 182 -122.30 gain 182 54 -124.87 gain 54 183 -128.72 gain 183 54 -124.68 gain 54 184 -118.59 gain 184 54 -119.33 gain 54 185 -118.38 gain 185 54 -116.61 gain 54 186 -129.09 gain 186 54 -127.61 gain 54 187 -124.50 gain 187 54 -125.56 gain 54 188 -123.01 gain 188 54 -127.33 gain 54 189 -119.06 gain 189 54 -120.88 gain 54 190 -120.49 gain 190 54 -119.33 gain 54 191 -122.44 gain 191 54 -122.37 gain 54 192 -118.53 gain 192 54 -121.33 gain 54 193 -124.40 gain 193 54 -128.45 gain 54 194 -121.32 gain 194 54 -119.18 gain 54 195 -131.82 gain 195 54 -130.31 gain 54 196 -122.69 gain 196 54 -125.23 gain 54 197 -122.06 gain 197 54 -120.66 gain 54 198 -124.51 gain 198 54 -122.63 gain 54 199 -116.80 gain 199 54 -118.83 gain 54 200 -120.90 gain 200 54 -119.87 gain 54 201 -122.64 gain 201 54 -122.41 gain 54 202 -125.50 gain 202 54 -129.27 gain 54 203 -124.58 gain 203 54 -127.98 gain 54 204 -121.53 gain 204 54 -122.21 gain 54 205 -128.33 gain 205 54 -128.09 gain 54 206 -126.62 gain 206 54 -130.89 gain 54 207 -127.13 gain 207 54 -123.76 gain 54 208 -125.78 gain 208 54 -128.19 gain 54 209 -129.52 gain 209 54 -132.93 gain 54 210 -125.10 gain 210 54 -125.44 gain 54 211 -130.91 gain 211 54 -133.28 gain 54 212 -123.94 gain 212 54 -124.85 gain 54 213 -119.47 gain 213 54 -119.57 gain 54 214 -114.37 gain 214 54 -114.36 gain 54 215 -128.13 gain 215 54 -124.53 gain 54 216 -121.97 gain 216 54 -123.04 gain 54 217 -132.67 gain 217 54 -134.26 gain 54 218 -124.74 gain 218 54 -128.51 gain 54 219 -125.22 gain 219 54 -120.35 gain 54 220 -126.56 gain 220 54 -132.18 gain 54 221 -128.98 gain 221 54 -130.24 gain 54 222 -119.77 gain 222 54 -121.36 gain 54 223 -128.47 gain 223 54 -128.67 gain 54 224 -123.49 gain 224 54 -126.38 gain 55 56 -89.80 gain 56 55 -97.12 gain 55 57 -103.45 gain 57 55 -104.65 gain 55 58 -109.86 gain 58 55 -113.81 gain 55 59 -113.25 gain 59 55 -113.31 gain 55 60 -122.47 gain 60 55 -123.86 gain 55 61 -117.84 gain 61 55 -117.98 gain 55 62 -123.78 gain 62 55 -129.14 gain 55 63 -111.75 gain 63 55 -110.34 gain 55 64 -119.65 gain 64 55 -121.21 gain 55 65 -108.65 gain 65 55 -112.30 gain 55 66 -110.24 gain 66 55 -108.15 gain 55 67 -103.16 gain 67 55 -103.33 gain 55 68 -112.42 gain 68 55 -117.16 gain 55 69 -95.08 gain 69 55 -97.10 gain 55 70 -91.75 gain 70 55 -93.54 gain 55 71 -93.09 gain 71 55 -92.98 gain 55 72 -103.14 gain 72 55 -103.45 gain 55 73 -97.80 gain 73 55 -96.50 gain 55 74 -112.24 gain 74 55 -114.82 gain 55 75 -120.01 gain 75 55 -122.73 gain 55 76 -127.42 gain 76 55 -126.08 gain 55 77 -116.08 gain 77 55 -118.41 gain 55 78 -110.77 gain 78 55 -115.96 gain 55 79 -117.70 gain 79 55 -117.66 gain 55 80 -116.79 gain 80 55 -117.25 gain 55 81 -115.08 gain 81 55 -116.14 gain 55 82 -116.36 gain 82 55 -115.04 gain 55 83 -110.53 gain 83 55 -110.25 gain 55 84 -107.81 gain 84 55 -107.67 gain 55 85 -109.80 gain 85 55 -106.47 gain 55 86 -104.35 gain 86 55 -104.40 gain 55 87 -95.27 gain 87 55 -99.29 gain 55 88 -107.72 gain 88 55 -109.49 gain 55 89 -109.51 gain 89 55 -109.87 gain 55 90 -122.30 gain 90 55 -119.67 gain 55 91 -128.93 gain 91 55 -130.25 gain 55 92 -120.32 gain 92 55 -118.60 gain 55 93 -124.17 gain 93 55 -127.23 gain 55 94 -118.79 gain 94 55 -121.73 gain 55 95 -115.63 gain 95 55 -120.82 gain 55 96 -106.91 gain 96 55 -109.44 gain 55 97 -107.27 gain 97 55 -108.55 gain 55 98 -115.74 gain 98 55 -117.81 gain 55 99 -104.95 gain 99 55 -104.85 gain 55 100 -99.22 gain 100 55 -98.68 gain 55 101 -115.71 gain 101 55 -115.33 gain 55 102 -107.03 gain 102 55 -107.43 gain 55 103 -112.33 gain 103 55 -110.22 gain 55 104 -120.62 gain 104 55 -123.88 gain 55 105 -111.75 gain 105 55 -110.96 gain 55 106 -127.14 gain 106 55 -127.43 gain 55 107 -122.58 gain 107 55 -129.44 gain 55 108 -125.24 gain 108 55 -124.41 gain 55 109 -120.62 gain 109 55 -123.29 gain 55 110 -117.44 gain 110 55 -118.57 gain 55 111 -114.86 gain 111 55 -115.67 gain 55 112 -118.61 gain 112 55 -118.31 gain 55 113 -106.58 gain 113 55 -105.08 gain 55 114 -112.93 gain 114 55 -114.73 gain 55 115 -106.23 gain 115 55 -102.34 gain 55 116 -112.59 gain 116 55 -116.23 gain 55 117 -109.39 gain 117 55 -114.53 gain 55 118 -120.84 gain 118 55 -124.31 gain 55 119 -113.27 gain 119 55 -111.40 gain 55 120 -129.64 gain 120 55 -132.28 gain 55 121 -123.88 gain 121 55 -125.81 gain 55 122 -120.76 gain 122 55 -124.81 gain 55 123 -116.12 gain 123 55 -120.95 gain 55 124 -117.37 gain 124 55 -118.60 gain 55 125 -120.22 gain 125 55 -122.79 gain 55 126 -118.19 gain 126 55 -118.72 gain 55 127 -119.06 gain 127 55 -123.05 gain 55 128 -119.06 gain 128 55 -120.99 gain 55 129 -115.27 gain 129 55 -115.10 gain 55 130 -108.74 gain 130 55 -106.40 gain 55 131 -116.32 gain 131 55 -121.06 gain 55 132 -110.10 gain 132 55 -114.48 gain 55 133 -119.22 gain 133 55 -121.66 gain 55 134 -112.24 gain 134 55 -111.39 gain 55 135 -130.05 gain 135 55 -132.76 gain 55 136 -126.62 gain 136 55 -129.94 gain 55 137 -129.67 gain 137 55 -130.48 gain 55 138 -127.59 gain 138 55 -127.40 gain 55 139 -115.13 gain 139 55 -115.92 gain 55 140 -113.49 gain 140 55 -116.89 gain 55 141 -118.23 gain 141 55 -120.30 gain 55 142 -125.10 gain 142 55 -126.48 gain 55 143 -123.17 gain 143 55 -124.17 gain 55 144 -118.62 gain 144 55 -120.63 gain 55 145 -114.59 gain 145 55 -115.05 gain 55 146 -113.90 gain 146 55 -113.27 gain 55 147 -109.35 gain 147 55 -105.81 gain 55 148 -127.00 gain 148 55 -123.17 gain 55 149 -125.97 gain 149 55 -125.31 gain 55 150 -128.03 gain 150 55 -130.06 gain 55 151 -120.78 gain 151 55 -123.01 gain 55 152 -122.10 gain 152 55 -121.30 gain 55 153 -122.32 gain 153 55 -119.10 gain 55 154 -126.26 gain 154 55 -131.59 gain 55 155 -114.41 gain 155 55 -119.64 gain 55 156 -121.99 gain 156 55 -121.61 gain 55 157 -122.45 gain 157 55 -125.01 gain 55 158 -104.90 gain 158 55 -110.05 gain 55 159 -118.47 gain 159 55 -120.25 gain 55 160 -115.34 gain 160 55 -114.22 gain 55 161 -113.95 gain 161 55 -116.32 gain 55 162 -115.67 gain 162 55 -116.91 gain 55 163 -119.79 gain 163 55 -123.18 gain 55 164 -115.10 gain 164 55 -119.53 gain 55 165 -120.63 gain 165 55 -121.10 gain 55 166 -128.06 gain 166 55 -130.10 gain 55 167 -120.28 gain 167 55 -124.41 gain 55 168 -124.81 gain 168 55 -127.39 gain 55 169 -119.32 gain 169 55 -126.10 gain 55 170 -120.99 gain 170 55 -119.29 gain 55 171 -124.78 gain 171 55 -128.11 gain 55 172 -124.84 gain 172 55 -122.86 gain 55 173 -118.01 gain 173 55 -115.47 gain 55 174 -126.40 gain 174 55 -128.16 gain 55 175 -122.73 gain 175 55 -128.04 gain 55 176 -114.25 gain 176 55 -111.58 gain 55 177 -114.65 gain 177 55 -119.78 gain 55 178 -123.39 gain 178 55 -124.34 gain 55 179 -113.82 gain 179 55 -113.17 gain 55 180 -125.33 gain 180 55 -126.15 gain 55 181 -122.55 gain 181 55 -123.44 gain 55 182 -124.72 gain 182 55 -127.99 gain 55 183 -136.95 gain 183 55 -133.62 gain 55 184 -122.23 gain 184 55 -123.67 gain 55 185 -123.61 gain 185 55 -122.54 gain 55 186 -125.46 gain 186 55 -124.68 gain 55 187 -125.67 gain 187 55 -127.43 gain 55 188 -115.19 gain 188 55 -120.20 gain 55 189 -124.62 gain 189 55 -127.15 gain 55 190 -127.24 gain 190 55 -126.78 gain 55 191 -120.84 gain 191 55 -121.47 gain 55 192 -116.62 gain 192 55 -120.12 gain 55 193 -115.76 gain 193 55 -120.51 gain 55 194 -128.01 gain 194 55 -126.57 gain 55 195 -129.44 gain 195 55 -128.63 gain 55 196 -124.30 gain 196 55 -127.54 gain 55 197 -124.20 gain 197 55 -123.50 gain 55 198 -123.48 gain 198 55 -122.30 gain 55 199 -119.40 gain 199 55 -122.13 gain 55 200 -129.80 gain 200 55 -129.47 gain 55 201 -129.67 gain 201 55 -130.15 gain 55 202 -127.46 gain 202 55 -131.93 gain 55 203 -125.69 gain 203 55 -129.79 gain 55 204 -127.65 gain 204 55 -129.03 gain 55 205 -124.09 gain 205 55 -124.55 gain 55 206 -123.01 gain 206 55 -127.98 gain 55 207 -117.05 gain 207 55 -114.39 gain 55 208 -124.20 gain 208 55 -127.32 gain 55 209 -122.99 gain 209 55 -127.09 gain 55 210 -130.12 gain 210 55 -131.17 gain 55 211 -126.09 gain 211 55 -129.15 gain 55 212 -124.89 gain 212 55 -126.50 gain 55 213 -128.72 gain 213 55 -129.52 gain 55 214 -125.64 gain 214 55 -126.33 gain 55 215 -130.00 gain 215 55 -127.11 gain 55 216 -125.98 gain 216 55 -127.75 gain 55 217 -122.19 gain 217 55 -124.47 gain 55 218 -122.78 gain 218 55 -127.25 gain 55 219 -126.73 gain 219 55 -122.56 gain 55 220 -122.10 gain 220 55 -128.43 gain 55 221 -120.51 gain 221 55 -122.48 gain 55 222 -122.55 gain 222 55 -124.84 gain 55 223 -117.61 gain 223 55 -118.51 gain 55 224 -118.30 gain 224 55 -121.89 gain 56 57 -100.99 gain 57 56 -94.86 gain 56 58 -111.04 gain 58 56 -107.65 gain 56 59 -112.71 gain 59 56 -105.45 gain 56 60 -130.72 gain 60 56 -124.79 gain 56 61 -126.65 gain 61 56 -119.46 gain 56 62 -133.82 gain 62 56 -131.85 gain 56 63 -125.17 gain 63 56 -116.43 gain 56 64 -127.89 gain 64 56 -122.12 gain 56 65 -121.61 gain 65 56 -117.93 gain 56 66 -122.39 gain 66 56 -112.97 gain 56 67 -113.41 gain 67 56 -106.26 gain 56 68 -111.24 gain 68 56 -108.65 gain 56 69 -110.01 gain 69 56 -104.71 gain 56 70 -103.02 gain 70 56 -97.48 gain 56 71 -94.67 gain 71 56 -87.24 gain 56 72 -103.05 gain 72 56 -96.03 gain 56 73 -104.40 gain 73 56 -95.77 gain 56 74 -118.21 gain 74 56 -113.46 gain 56 75 -130.47 gain 75 56 -125.86 gain 56 76 -129.10 gain 76 56 -120.44 gain 56 77 -126.16 gain 77 56 -121.17 gain 56 78 -128.71 gain 78 56 -126.56 gain 56 79 -118.32 gain 79 56 -110.96 gain 56 80 -119.11 gain 80 56 -112.24 gain 56 81 -123.53 gain 81 56 -117.26 gain 56 82 -119.83 gain 82 56 -111.18 gain 56 83 -117.76 gain 83 56 -110.15 gain 56 84 -106.99 gain 84 56 -99.53 gain 56 85 -118.67 gain 85 56 -108.02 gain 56 86 -105.45 gain 86 56 -98.18 gain 56 87 -100.96 gain 87 56 -97.65 gain 56 88 -120.48 gain 88 56 -114.91 gain 56 89 -117.06 gain 89 56 -110.10 gain 56 90 -127.96 gain 90 56 -118.01 gain 56 91 -133.78 gain 91 56 -127.77 gain 56 92 -130.73 gain 92 56 -121.68 gain 56 93 -125.76 gain 93 56 -121.50 gain 56 94 -124.98 gain 94 56 -120.60 gain 56 95 -122.02 gain 95 56 -119.89 gain 56 96 -122.30 gain 96 56 -117.50 gain 56 97 -121.04 gain 97 56 -115.00 gain 56 98 -118.71 gain 98 56 -113.46 gain 56 99 -104.66 gain 99 56 -97.23 gain 56 100 -120.76 gain 100 56 -112.90 gain 56 101 -102.47 gain 101 56 -94.77 gain 56 102 -116.24 gain 102 56 -109.32 gain 56 103 -115.69 gain 103 56 -106.25 gain 56 104 -118.42 gain 104 56 -114.36 gain 56 105 -138.57 gain 105 56 -130.45 gain 56 106 -129.47 gain 106 56 -122.43 gain 56 107 -128.11 gain 107 56 -127.64 gain 56 108 -129.45 gain 108 56 -121.30 gain 56 109 -124.80 gain 109 56 -120.13 gain 56 110 -129.94 gain 110 56 -123.75 gain 56 111 -119.77 gain 111 56 -113.26 gain 56 112 -127.17 gain 112 56 -119.54 gain 56 113 -115.04 gain 113 56 -106.21 gain 56 114 -117.27 gain 114 56 -111.75 gain 56 115 -114.08 gain 115 56 -102.86 gain 56 116 -120.36 gain 116 56 -116.68 gain 56 117 -113.77 gain 117 56 -111.59 gain 56 118 -115.22 gain 118 56 -111.36 gain 56 119 -125.07 gain 119 56 -115.87 gain 56 120 -126.56 gain 120 56 -121.88 gain 56 121 -131.82 gain 121 56 -126.43 gain 56 122 -122.65 gain 122 56 -119.37 gain 56 123 -123.19 gain 123 56 -120.70 gain 56 124 -123.66 gain 124 56 -117.57 gain 56 125 -129.38 gain 125 56 -124.62 gain 56 126 -129.51 gain 126 56 -122.71 gain 56 127 -123.47 gain 127 56 -120.14 gain 56 128 -125.02 gain 128 56 -119.62 gain 56 129 -124.67 gain 129 56 -117.18 gain 56 130 -117.14 gain 130 56 -107.48 gain 56 131 -118.71 gain 131 56 -116.13 gain 56 132 -126.32 gain 132 56 -123.36 gain 56 133 -118.55 gain 133 56 -113.66 gain 56 134 -121.57 gain 134 56 -113.39 gain 56 135 -129.97 gain 135 56 -125.36 gain 56 136 -129.28 gain 136 56 -125.28 gain 56 137 -132.10 gain 137 56 -125.58 gain 56 138 -132.30 gain 138 56 -124.78 gain 56 139 -125.50 gain 139 56 -118.97 gain 56 140 -126.30 gain 140 56 -122.37 gain 56 141 -133.19 gain 141 56 -127.94 gain 56 142 -121.37 gain 142 56 -115.42 gain 56 143 -123.59 gain 143 56 -117.26 gain 56 144 -123.39 gain 144 56 -118.07 gain 56 145 -120.12 gain 145 56 -113.25 gain 56 146 -125.37 gain 146 56 -117.41 gain 56 147 -116.89 gain 147 56 -106.02 gain 56 148 -125.88 gain 148 56 -114.73 gain 56 149 -121.22 gain 149 56 -113.24 gain 56 150 -131.36 gain 150 56 -126.07 gain 56 151 -135.79 gain 151 56 -130.69 gain 56 152 -129.17 gain 152 56 -121.05 gain 56 153 -132.16 gain 153 56 -121.62 gain 56 154 -126.30 gain 154 56 -124.30 gain 56 155 -130.62 gain 155 56 -128.52 gain 56 156 -123.58 gain 156 56 -115.87 gain 56 157 -129.10 gain 157 56 -124.33 gain 56 158 -130.51 gain 158 56 -128.34 gain 56 159 -119.65 gain 159 56 -114.09 gain 56 160 -124.49 gain 160 56 -116.05 gain 56 161 -122.72 gain 161 56 -117.76 gain 56 162 -118.91 gain 162 56 -112.82 gain 56 163 -126.72 gain 163 56 -122.78 gain 56 164 -125.54 gain 164 56 -122.64 gain 56 165 -130.60 gain 165 56 -123.74 gain 56 166 -136.08 gain 166 56 -130.79 gain 56 167 -125.50 gain 167 56 -122.30 gain 56 168 -133.45 gain 168 56 -128.71 gain 56 169 -131.37 gain 169 56 -130.82 gain 56 170 -123.01 gain 170 56 -113.99 gain 56 171 -122.99 gain 171 56 -118.99 gain 56 172 -126.78 gain 172 56 -117.48 gain 56 173 -119.47 gain 173 56 -109.60 gain 56 174 -125.96 gain 174 56 -120.39 gain 56 175 -124.24 gain 175 56 -122.23 gain 56 176 -122.68 gain 176 56 -112.68 gain 56 177 -126.33 gain 177 56 -124.14 gain 56 178 -130.71 gain 178 56 -124.34 gain 56 179 -129.00 gain 179 56 -121.02 gain 56 180 -127.43 gain 180 56 -120.92 gain 56 181 -128.10 gain 181 56 -121.66 gain 56 182 -137.06 gain 182 56 -133.01 gain 56 183 -132.69 gain 183 56 -122.03 gain 56 184 -139.64 gain 184 56 -133.76 gain 56 185 -127.38 gain 185 56 -118.99 gain 56 186 -133.89 gain 186 56 -125.77 gain 56 187 -129.89 gain 187 56 -124.32 gain 56 188 -124.79 gain 188 56 -122.48 gain 56 189 -132.72 gain 189 56 -127.93 gain 56 190 -130.17 gain 190 56 -122.38 gain 56 191 -130.58 gain 191 56 -123.89 gain 56 192 -125.94 gain 192 56 -122.11 gain 56 193 -132.56 gain 193 56 -129.98 gain 56 194 -132.94 gain 194 56 -124.18 gain 56 195 -141.54 gain 195 56 -133.41 gain 56 196 -135.26 gain 196 56 -131.17 gain 56 197 -135.32 gain 197 56 -127.29 gain 56 198 -133.92 gain 198 56 -125.41 gain 56 199 -130.50 gain 199 56 -125.91 gain 56 200 -137.83 gain 200 56 -130.18 gain 56 201 -134.83 gain 201 56 -127.98 gain 56 202 -132.07 gain 202 56 -129.23 gain 56 203 -132.44 gain 203 56 -129.22 gain 56 204 -134.17 gain 204 56 -128.22 gain 56 205 -128.50 gain 205 56 -121.63 gain 56 206 -130.43 gain 206 56 -128.08 gain 56 207 -128.06 gain 207 56 -118.08 gain 56 208 -131.08 gain 208 56 -126.87 gain 56 209 -129.81 gain 209 56 -126.59 gain 56 210 -129.87 gain 210 56 -123.59 gain 56 211 -134.95 gain 211 56 -130.70 gain 56 212 -137.56 gain 212 56 -131.84 gain 56 213 -134.55 gain 213 56 -128.02 gain 56 214 -141.31 gain 214 56 -134.68 gain 56 215 -130.93 gain 215 56 -120.70 gain 56 216 -129.86 gain 216 56 -124.30 gain 56 217 -132.00 gain 217 56 -126.95 gain 56 218 -133.32 gain 218 56 -130.47 gain 56 219 -132.12 gain 219 56 -120.63 gain 56 220 -126.81 gain 220 56 -125.81 gain 56 221 -130.73 gain 221 56 -125.37 gain 56 222 -136.31 gain 222 56 -131.28 gain 56 223 -137.53 gain 223 56 -131.11 gain 56 224 -136.62 gain 224 56 -132.89 gain 57 58 -90.96 gain 58 57 -93.70 gain 57 59 -97.15 gain 59 57 -96.01 gain 57 60 -120.87 gain 60 57 -121.06 gain 57 61 -125.06 gain 61 57 -124.00 gain 57 62 -118.29 gain 62 57 -122.45 gain 57 63 -115.36 gain 63 57 -112.75 gain 57 64 -118.69 gain 64 57 -119.05 gain 57 65 -118.64 gain 65 57 -121.09 gain 57 66 -114.84 gain 66 57 -111.54 gain 57 67 -116.47 gain 67 57 -115.45 gain 57 68 -105.02 gain 68 57 -108.56 gain 57 69 -112.59 gain 69 57 -113.42 gain 57 70 -106.35 gain 70 57 -106.94 gain 57 71 -96.58 gain 71 57 -95.27 gain 57 72 -96.08 gain 72 57 -95.19 gain 57 73 -93.35 gain 73 57 -90.84 gain 57 74 -104.28 gain 74 57 -105.66 gain 57 75 -122.21 gain 75 57 -123.73 gain 57 76 -123.39 gain 76 57 -120.86 gain 57 77 -119.88 gain 77 57 -121.01 gain 57 78 -130.25 gain 78 57 -134.23 gain 57 79 -126.13 gain 79 57 -124.89 gain 57 80 -121.38 gain 80 57 -120.65 gain 57 81 -115.08 gain 81 57 -114.94 gain 57 82 -112.06 gain 82 57 -109.54 gain 57 83 -110.27 gain 83 57 -108.78 gain 57 84 -110.41 gain 84 57 -109.07 gain 57 85 -103.36 gain 85 57 -98.83 gain 57 86 -106.29 gain 86 57 -105.15 gain 57 87 -102.60 gain 87 57 -105.42 gain 57 88 -104.70 gain 88 57 -105.27 gain 57 89 -108.58 gain 89 57 -107.74 gain 57 90 -122.91 gain 90 57 -119.08 gain 57 91 -131.60 gain 91 57 -131.72 gain 57 92 -121.59 gain 92 57 -118.67 gain 57 93 -118.58 gain 93 57 -120.44 gain 57 94 -118.71 gain 94 57 -120.45 gain 57 95 -117.32 gain 95 57 -121.32 gain 57 96 -110.73 gain 96 57 -112.06 gain 57 97 -112.61 gain 97 57 -112.68 gain 57 98 -117.20 gain 98 57 -118.08 gain 57 99 -109.95 gain 99 57 -108.64 gain 57 100 -110.23 gain 100 57 -108.49 gain 57 101 -110.76 gain 101 57 -109.18 gain 57 102 -105.92 gain 102 57 -105.12 gain 57 103 -105.97 gain 103 57 -102.66 gain 57 104 -114.70 gain 104 57 -116.76 gain 57 105 -133.19 gain 105 57 -131.20 gain 57 106 -126.09 gain 106 57 -125.18 gain 57 107 -120.83 gain 107 57 -126.49 gain 57 108 -120.61 gain 108 57 -118.59 gain 57 109 -116.58 gain 109 57 -118.04 gain 57 110 -121.66 gain 110 57 -121.60 gain 57 111 -116.51 gain 111 57 -116.12 gain 57 112 -120.44 gain 112 57 -118.93 gain 57 113 -118.24 gain 113 57 -115.53 gain 57 114 -112.89 gain 114 57 -113.49 gain 57 115 -107.43 gain 115 57 -102.34 gain 57 116 -116.39 gain 116 57 -118.84 gain 57 117 -111.06 gain 117 57 -115.00 gain 57 118 -117.93 gain 118 57 -120.20 gain 57 119 -114.12 gain 119 57 -111.05 gain 57 120 -130.05 gain 120 57 -131.49 gain 57 121 -126.14 gain 121 57 -126.88 gain 57 122 -123.60 gain 122 57 -126.45 gain 57 123 -123.43 gain 123 57 -127.06 gain 57 124 -124.76 gain 124 57 -124.79 gain 57 125 -124.19 gain 125 57 -125.56 gain 57 126 -116.13 gain 126 57 -115.45 gain 57 127 -121.82 gain 127 57 -124.61 gain 57 128 -112.55 gain 128 57 -113.28 gain 57 129 -112.72 gain 129 57 -111.35 gain 57 130 -113.66 gain 130 57 -110.12 gain 57 131 -117.47 gain 131 57 -121.02 gain 57 132 -108.12 gain 132 57 -111.29 gain 57 133 -106.22 gain 133 57 -107.46 gain 57 134 -115.12 gain 134 57 -113.06 gain 57 135 -123.37 gain 135 57 -124.89 gain 57 136 -125.70 gain 136 57 -127.82 gain 57 137 -121.92 gain 137 57 -121.53 gain 57 138 -122.64 gain 138 57 -121.24 gain 57 139 -125.60 gain 139 57 -125.20 gain 57 140 -125.92 gain 140 57 -128.12 gain 57 141 -126.60 gain 141 57 -127.48 gain 57 142 -122.87 gain 142 57 -123.05 gain 57 143 -117.39 gain 143 57 -117.18 gain 57 144 -111.48 gain 144 57 -112.29 gain 57 145 -116.06 gain 145 57 -115.32 gain 57 146 -112.49 gain 146 57 -110.66 gain 57 147 -119.60 gain 147 57 -114.86 gain 57 148 -122.78 gain 148 57 -117.76 gain 57 149 -120.74 gain 149 57 -118.88 gain 57 150 -126.65 gain 150 57 -127.48 gain 57 151 -128.84 gain 151 57 -129.87 gain 57 152 -125.91 gain 152 57 -123.92 gain 57 153 -123.53 gain 153 57 -119.11 gain 57 154 -122.85 gain 154 57 -126.98 gain 57 155 -127.36 gain 155 57 -131.39 gain 57 156 -127.35 gain 156 57 -125.76 gain 57 157 -131.98 gain 157 57 -133.34 gain 57 158 -122.82 gain 158 57 -126.77 gain 57 159 -117.09 gain 159 57 -117.66 gain 57 160 -118.61 gain 160 57 -116.30 gain 57 161 -118.51 gain 161 57 -119.68 gain 57 162 -120.71 gain 162 57 -120.75 gain 57 163 -119.19 gain 163 57 -121.38 gain 57 164 -115.25 gain 164 57 -118.47 gain 57 165 -131.77 gain 165 57 -131.04 gain 57 166 -132.15 gain 166 57 -132.99 gain 57 167 -131.76 gain 167 57 -134.69 gain 57 168 -120.29 gain 168 57 -121.67 gain 57 169 -127.03 gain 169 57 -132.60 gain 57 170 -123.52 gain 170 57 -120.62 gain 57 171 -123.74 gain 171 57 -125.87 gain 57 172 -128.06 gain 172 57 -124.89 gain 57 173 -122.06 gain 173 57 -118.32 gain 57 174 -121.82 gain 174 57 -122.37 gain 57 175 -119.97 gain 175 57 -124.08 gain 57 176 -122.56 gain 176 57 -118.68 gain 57 177 -124.62 gain 177 57 -128.55 gain 57 178 -125.19 gain 178 57 -124.95 gain 57 179 -115.42 gain 179 57 -113.57 gain 57 180 -135.66 gain 180 57 -135.27 gain 57 181 -138.37 gain 181 57 -138.05 gain 57 182 -127.60 gain 182 57 -129.67 gain 57 183 -132.99 gain 183 57 -128.45 gain 57 184 -123.60 gain 184 57 -123.85 gain 57 185 -127.22 gain 185 57 -124.95 gain 57 186 -130.31 gain 186 57 -128.32 gain 57 187 -116.42 gain 187 57 -116.97 gain 57 188 -130.04 gain 188 57 -133.85 gain 57 189 -121.43 gain 189 57 -122.76 gain 57 190 -118.73 gain 190 57 -117.07 gain 57 191 -125.97 gain 191 57 -125.40 gain 57 192 -119.99 gain 192 57 -122.29 gain 57 193 -109.66 gain 193 57 -113.21 gain 57 194 -124.25 gain 194 57 -121.61 gain 57 195 -130.01 gain 195 57 -128.00 gain 57 196 -128.57 gain 196 57 -130.61 gain 57 197 -126.31 gain 197 57 -124.40 gain 57 198 -123.28 gain 198 57 -120.90 gain 57 199 -129.81 gain 199 57 -131.34 gain 57 200 -126.57 gain 200 57 -125.05 gain 57 201 -132.75 gain 201 57 -132.03 gain 57 202 -122.74 gain 202 57 -126.01 gain 57 203 -129.93 gain 203 57 -132.83 gain 57 204 -121.68 gain 204 57 -121.86 gain 57 205 -123.57 gain 205 57 -122.83 gain 57 206 -131.23 gain 206 57 -135.01 gain 57 207 -122.88 gain 207 57 -119.02 gain 57 208 -123.64 gain 208 57 -125.55 gain 57 209 -128.37 gain 209 57 -131.28 gain 57 210 -124.10 gain 210 57 -123.94 gain 57 211 -129.80 gain 211 57 -131.67 gain 57 212 -130.41 gain 212 57 -130.81 gain 57 213 -124.59 gain 213 57 -124.20 gain 57 214 -127.84 gain 214 57 -127.33 gain 57 215 -131.31 gain 215 57 -127.21 gain 57 216 -133.27 gain 216 57 -133.83 gain 57 217 -131.94 gain 217 57 -133.02 gain 57 218 -129.47 gain 218 57 -132.74 gain 57 219 -123.43 gain 219 57 -118.06 gain 57 220 -119.43 gain 220 57 -124.56 gain 57 221 -130.09 gain 221 57 -130.85 gain 57 222 -125.92 gain 222 57 -127.01 gain 57 223 -124.76 gain 223 57 -124.46 gain 57 224 -131.20 gain 224 57 -133.60 gain 58 59 -92.69 gain 59 58 -88.81 gain 58 60 -134.69 gain 60 58 -132.14 gain 58 61 -128.35 gain 61 58 -124.55 gain 58 62 -135.58 gain 62 58 -137.00 gain 58 63 -132.32 gain 63 58 -126.96 gain 58 64 -122.06 gain 64 58 -119.67 gain 58 65 -130.00 gain 65 58 -129.71 gain 58 66 -123.06 gain 66 58 -117.02 gain 58 67 -119.45 gain 67 58 -115.68 gain 58 68 -112.88 gain 68 58 -113.67 gain 58 69 -112.88 gain 69 58 -110.97 gain 58 70 -115.89 gain 70 58 -113.73 gain 58 71 -107.54 gain 71 58 -103.49 gain 58 72 -106.24 gain 72 58 -102.61 gain 58 73 -92.37 gain 73 58 -87.13 gain 58 74 -107.10 gain 74 58 -105.73 gain 58 75 -125.61 gain 75 58 -124.38 gain 58 76 -126.18 gain 76 58 -120.90 gain 58 77 -129.65 gain 77 58 -128.04 gain 58 78 -131.94 gain 78 58 -133.18 gain 58 79 -129.08 gain 79 58 -125.10 gain 58 80 -124.42 gain 80 58 -120.94 gain 58 81 -116.90 gain 81 58 -114.01 gain 58 82 -120.38 gain 82 58 -115.12 gain 58 83 -122.07 gain 83 58 -117.84 gain 58 84 -113.36 gain 84 58 -109.28 gain 58 85 -110.95 gain 85 58 -103.67 gain 58 86 -115.15 gain 86 58 -111.26 gain 58 87 -102.43 gain 87 58 -102.50 gain 58 88 -99.91 gain 88 58 -97.73 gain 58 89 -110.29 gain 89 58 -106.71 gain 58 90 -130.16 gain 90 58 -123.59 gain 58 91 -127.75 gain 91 58 -125.12 gain 58 92 -125.77 gain 92 58 -120.11 gain 58 93 -131.08 gain 93 58 -130.20 gain 58 94 -126.13 gain 94 58 -125.13 gain 58 95 -129.70 gain 95 58 -130.95 gain 58 96 -124.97 gain 96 58 -123.56 gain 58 97 -122.94 gain 97 58 -120.27 gain 58 98 -121.65 gain 98 58 -119.78 gain 58 99 -117.69 gain 99 58 -113.65 gain 58 100 -112.94 gain 100 58 -108.45 gain 58 101 -107.75 gain 101 58 -103.43 gain 58 102 -112.03 gain 102 58 -108.49 gain 58 103 -112.01 gain 103 58 -105.96 gain 58 104 -105.09 gain 104 58 -104.41 gain 58 105 -132.26 gain 105 58 -127.53 gain 58 106 -132.50 gain 106 58 -128.85 gain 58 107 -127.37 gain 107 58 -130.29 gain 58 108 -123.71 gain 108 58 -118.95 gain 58 109 -125.62 gain 109 58 -124.34 gain 58 110 -119.16 gain 110 58 -116.35 gain 58 111 -116.74 gain 111 58 -113.61 gain 58 112 -123.29 gain 112 58 -119.04 gain 58 113 -121.03 gain 113 58 -115.58 gain 58 114 -124.02 gain 114 58 -121.88 gain 58 115 -112.65 gain 115 58 -104.82 gain 58 116 -120.09 gain 116 58 -119.80 gain 58 117 -111.51 gain 117 58 -112.71 gain 58 118 -118.94 gain 118 58 -118.47 gain 58 119 -119.74 gain 119 58 -113.93 gain 58 120 -130.79 gain 120 58 -129.50 gain 58 121 -128.90 gain 121 58 -126.89 gain 58 122 -132.77 gain 122 58 -132.87 gain 58 123 -130.90 gain 123 58 -131.79 gain 58 124 -125.46 gain 124 58 -122.75 gain 58 125 -123.52 gain 125 58 -122.15 gain 58 126 -125.43 gain 126 58 -122.02 gain 58 127 -130.11 gain 127 58 -130.15 gain 58 128 -122.90 gain 128 58 -120.88 gain 58 129 -120.04 gain 129 58 -115.93 gain 58 130 -114.43 gain 130 58 -108.15 gain 58 131 -121.40 gain 131 58 -122.21 gain 58 132 -117.85 gain 132 58 -118.28 gain 58 133 -112.46 gain 133 58 -110.96 gain 58 134 -114.19 gain 134 58 -109.39 gain 58 135 -138.56 gain 135 58 -137.33 gain 58 136 -131.95 gain 136 58 -131.33 gain 58 137 -129.52 gain 137 58 -126.38 gain 58 138 -133.13 gain 138 58 -129.00 gain 58 139 -122.37 gain 139 58 -119.22 gain 58 140 -119.54 gain 140 58 -119.00 gain 58 141 -114.71 gain 141 58 -112.84 gain 58 142 -124.45 gain 142 58 -121.88 gain 58 143 -122.59 gain 143 58 -119.64 gain 58 144 -122.89 gain 144 58 -120.96 gain 58 145 -122.73 gain 145 58 -119.25 gain 58 146 -119.98 gain 146 58 -115.41 gain 58 147 -119.38 gain 147 58 -111.90 gain 58 148 -122.38 gain 148 58 -114.61 gain 58 149 -115.68 gain 149 58 -111.08 gain 58 150 -130.61 gain 150 58 -128.70 gain 58 151 -125.84 gain 151 58 -124.12 gain 58 152 -126.55 gain 152 58 -121.82 gain 58 153 -122.20 gain 153 58 -115.04 gain 58 154 -126.72 gain 154 58 -128.10 gain 58 155 -130.81 gain 155 58 -132.09 gain 58 156 -121.95 gain 156 58 -117.62 gain 58 157 -124.06 gain 157 58 -122.68 gain 58 158 -127.36 gain 158 58 -128.57 gain 58 159 -122.49 gain 159 58 -120.32 gain 58 160 -124.34 gain 160 58 -119.29 gain 58 161 -125.81 gain 161 58 -124.24 gain 58 162 -128.20 gain 162 58 -125.50 gain 58 163 -114.64 gain 163 58 -114.08 gain 58 164 -120.76 gain 164 58 -121.25 gain 58 165 -124.36 gain 165 58 -120.89 gain 58 166 -139.36 gain 166 58 -137.45 gain 58 167 -130.11 gain 167 58 -130.29 gain 58 168 -125.20 gain 168 58 -123.83 gain 58 169 -131.80 gain 169 58 -134.63 gain 58 170 -125.68 gain 170 58 -120.04 gain 58 171 -120.34 gain 171 58 -119.72 gain 58 172 -122.66 gain 172 58 -116.74 gain 58 173 -119.14 gain 173 58 -112.66 gain 58 174 -126.13 gain 174 58 -123.94 gain 58 175 -125.44 gain 175 58 -126.81 gain 58 176 -124.13 gain 176 58 -117.51 gain 58 177 -118.80 gain 177 58 -119.99 gain 58 178 -127.18 gain 178 58 -124.20 gain 58 179 -117.63 gain 179 58 -113.04 gain 58 180 -135.55 gain 180 58 -132.42 gain 58 181 -124.61 gain 181 58 -121.56 gain 58 182 -126.62 gain 182 58 -125.95 gain 58 183 -126.25 gain 183 58 -118.97 gain 58 184 -136.38 gain 184 58 -133.88 gain 58 185 -131.17 gain 185 58 -126.16 gain 58 186 -127.71 gain 186 58 -122.98 gain 58 187 -126.60 gain 187 58 -124.42 gain 58 188 -132.73 gain 188 58 -133.80 gain 58 189 -122.08 gain 189 58 -120.67 gain 58 190 -126.53 gain 190 58 -122.13 gain 58 191 -123.01 gain 191 58 -119.70 gain 58 192 -125.04 gain 192 58 -124.60 gain 58 193 -121.57 gain 193 58 -122.37 gain 58 194 -121.14 gain 194 58 -115.76 gain 58 195 -132.42 gain 195 58 -127.67 gain 58 196 -135.43 gain 196 58 -134.72 gain 58 197 -128.85 gain 197 58 -124.20 gain 58 198 -127.04 gain 198 58 -121.91 gain 58 199 -128.60 gain 199 58 -127.40 gain 58 200 -129.91 gain 200 58 -125.64 gain 58 201 -130.55 gain 201 58 -127.09 gain 58 202 -129.49 gain 202 58 -130.03 gain 58 203 -133.26 gain 203 58 -133.42 gain 58 204 -126.86 gain 204 58 -124.30 gain 58 205 -128.60 gain 205 58 -125.12 gain 58 206 -122.20 gain 206 58 -123.23 gain 58 207 -126.95 gain 207 58 -120.34 gain 58 208 -120.56 gain 208 58 -119.73 gain 58 209 -121.59 gain 209 58 -121.75 gain 58 210 -133.47 gain 210 58 -130.58 gain 58 211 -131.23 gain 211 58 -130.35 gain 58 212 -128.14 gain 212 58 -125.80 gain 58 213 -132.57 gain 213 58 -129.43 gain 58 214 -131.82 gain 214 58 -128.57 gain 58 215 -136.08 gain 215 58 -129.24 gain 58 216 -129.63 gain 216 58 -127.45 gain 58 217 -132.54 gain 217 58 -130.88 gain 58 218 -134.07 gain 218 58 -134.60 gain 58 219 -122.16 gain 219 58 -114.06 gain 58 220 -132.39 gain 220 58 -134.77 gain 58 221 -124.93 gain 221 58 -122.95 gain 58 222 -136.64 gain 222 58 -134.99 gain 58 223 -126.18 gain 223 58 -123.14 gain 58 224 -121.06 gain 224 58 -120.71 gain 59 60 -127.32 gain 60 59 -128.64 gain 59 61 -126.78 gain 61 59 -126.86 gain 59 62 -121.71 gain 62 59 -127.00 gain 59 63 -126.56 gain 63 59 -125.08 gain 59 64 -117.21 gain 64 59 -118.70 gain 59 65 -126.06 gain 65 59 -129.64 gain 59 66 -116.73 gain 66 59 -114.57 gain 59 67 -122.29 gain 67 59 -122.40 gain 59 68 -118.70 gain 68 59 -123.37 gain 59 69 -113.46 gain 69 59 -115.42 gain 59 70 -108.67 gain 70 59 -110.39 gain 59 71 -109.03 gain 71 59 -108.86 gain 59 72 -106.68 gain 72 59 -106.92 gain 59 73 -96.96 gain 73 59 -95.60 gain 59 74 -93.28 gain 74 59 -95.79 gain 59 75 -131.88 gain 75 59 -134.53 gain 59 76 -123.56 gain 76 59 -122.16 gain 59 77 -130.06 gain 77 59 -132.33 gain 59 78 -124.91 gain 78 59 -130.03 gain 59 79 -120.48 gain 79 59 -120.37 gain 59 80 -123.24 gain 80 59 -123.64 gain 59 81 -119.85 gain 81 59 -120.84 gain 59 82 -116.63 gain 82 59 -115.24 gain 59 83 -117.08 gain 83 59 -116.73 gain 59 84 -109.59 gain 84 59 -109.39 gain 59 85 -114.34 gain 85 59 -110.94 gain 59 86 -106.72 gain 86 59 -106.71 gain 59 87 -106.56 gain 87 59 -110.50 gain 59 88 -101.24 gain 88 59 -102.94 gain 59 89 -102.96 gain 89 59 -103.26 gain 59 90 -125.58 gain 90 59 -122.89 gain 59 91 -126.43 gain 91 59 -127.68 gain 59 92 -119.12 gain 92 59 -117.33 gain 59 93 -126.92 gain 93 59 -129.92 gain 59 94 -128.62 gain 94 59 -131.49 gain 59 95 -117.36 gain 95 59 -122.49 gain 59 96 -125.27 gain 96 59 -127.73 gain 59 97 -128.76 gain 97 59 -129.97 gain 59 98 -115.03 gain 98 59 -117.04 gain 59 99 -115.23 gain 99 59 -115.06 gain 59 100 -121.07 gain 100 59 -120.47 gain 59 101 -118.68 gain 101 59 -118.24 gain 59 102 -113.44 gain 102 59 -113.78 gain 59 103 -103.74 gain 103 59 -101.56 gain 59 104 -108.66 gain 104 59 -111.86 gain 59 105 -122.88 gain 105 59 -122.02 gain 59 106 -122.84 gain 106 59 -123.06 gain 59 107 -129.71 gain 107 59 -136.50 gain 59 108 -128.37 gain 108 59 -127.48 gain 59 109 -127.84 gain 109 59 -130.43 gain 59 110 -119.61 gain 110 59 -120.68 gain 59 111 -117.61 gain 111 59 -118.35 gain 59 112 -124.39 gain 112 59 -124.02 gain 59 113 -123.61 gain 113 59 -122.04 gain 59 114 -118.24 gain 114 59 -119.97 gain 59 115 -110.39 gain 115 59 -106.43 gain 59 116 -112.93 gain 116 59 -116.51 gain 59 117 -108.24 gain 117 59 -113.32 gain 59 118 -118.28 gain 118 59 -121.68 gain 59 119 -112.02 gain 119 59 -110.08 gain 59 120 -128.78 gain 120 59 -131.36 gain 59 121 -130.94 gain 121 59 -132.81 gain 59 122 -126.57 gain 122 59 -130.56 gain 59 123 -117.34 gain 123 59 -122.10 gain 59 124 -117.87 gain 124 59 -119.04 gain 59 125 -125.34 gain 125 59 -127.85 gain 59 126 -126.36 gain 126 59 -126.82 gain 59 127 -120.49 gain 127 59 -124.41 gain 59 128 -119.28 gain 128 59 -121.14 gain 59 129 -122.13 gain 129 59 -121.90 gain 59 130 -116.55 gain 130 59 -114.14 gain 59 131 -109.77 gain 131 59 -114.45 gain 59 132 -115.89 gain 132 59 -120.20 gain 59 133 -120.14 gain 133 59 -122.52 gain 59 134 -108.05 gain 134 59 -107.13 gain 59 135 -130.70 gain 135 59 -133.35 gain 59 136 -130.80 gain 136 59 -134.06 gain 59 137 -125.99 gain 137 59 -126.74 gain 59 138 -129.74 gain 138 59 -129.48 gain 59 139 -124.25 gain 139 59 -124.97 gain 59 140 -131.43 gain 140 59 -134.76 gain 59 141 -121.16 gain 141 59 -123.17 gain 59 142 -120.18 gain 142 59 -121.49 gain 59 143 -114.45 gain 143 59 -115.38 gain 59 144 -114.00 gain 144 59 -115.95 gain 59 145 -119.34 gain 145 59 -119.73 gain 59 146 -113.17 gain 146 59 -112.48 gain 59 147 -119.66 gain 147 59 -116.05 gain 59 148 -117.78 gain 148 59 -113.89 gain 59 149 -116.09 gain 149 59 -115.37 gain 59 150 -126.23 gain 150 59 -128.19 gain 59 151 -131.56 gain 151 59 -133.72 gain 59 152 -134.08 gain 152 59 -133.22 gain 59 153 -124.02 gain 153 59 -120.74 gain 59 154 -131.33 gain 154 59 -136.59 gain 59 155 -129.04 gain 155 59 -134.20 gain 59 156 -121.44 gain 156 59 -120.99 gain 59 157 -122.05 gain 157 59 -124.54 gain 59 158 -121.75 gain 158 59 -126.84 gain 59 159 -134.56 gain 159 59 -136.27 gain 59 160 -115.70 gain 160 59 -114.52 gain 59 161 -118.89 gain 161 59 -121.20 gain 59 162 -118.59 gain 162 59 -119.77 gain 59 163 -121.48 gain 163 59 -124.80 gain 59 164 -119.33 gain 164 59 -123.70 gain 59 165 -130.52 gain 165 59 -130.93 gain 59 166 -126.41 gain 166 59 -128.38 gain 59 167 -126.27 gain 167 59 -130.34 gain 59 168 -129.24 gain 168 59 -131.76 gain 59 169 -122.82 gain 169 59 -129.53 gain 59 170 -120.35 gain 170 59 -118.58 gain 59 171 -124.24 gain 171 59 -127.50 gain 59 172 -122.80 gain 172 59 -120.76 gain 59 173 -122.89 gain 173 59 -120.28 gain 59 174 -123.09 gain 174 59 -124.78 gain 59 175 -118.43 gain 175 59 -123.68 gain 59 176 -117.83 gain 176 59 -115.08 gain 59 177 -120.19 gain 177 59 -125.26 gain 59 178 -126.88 gain 178 59 -127.77 gain 59 179 -124.45 gain 179 59 -123.73 gain 59 180 -126.98 gain 180 59 -127.74 gain 59 181 -133.36 gain 181 59 -134.18 gain 59 182 -125.74 gain 182 59 -128.94 gain 59 183 -126.53 gain 183 59 -123.12 gain 59 184 -128.30 gain 184 59 -129.67 gain 59 185 -129.57 gain 185 59 -128.43 gain 59 186 -122.68 gain 186 59 -121.82 gain 59 187 -120.91 gain 187 59 -122.59 gain 59 188 -123.93 gain 188 59 -128.88 gain 59 189 -123.22 gain 189 59 -125.69 gain 59 190 -123.16 gain 190 59 -122.63 gain 59 191 -116.07 gain 191 59 -116.64 gain 59 192 -112.00 gain 192 59 -115.44 gain 59 193 -123.96 gain 193 59 -128.65 gain 59 194 -115.90 gain 194 59 -114.40 gain 59 195 -130.18 gain 195 59 -129.31 gain 59 196 -131.66 gain 196 59 -134.83 gain 59 197 -134.13 gain 197 59 -133.36 gain 59 198 -126.41 gain 198 59 -125.17 gain 59 199 -128.37 gain 199 59 -131.03 gain 59 200 -129.06 gain 200 59 -128.66 gain 59 201 -126.39 gain 201 59 -126.80 gain 59 202 -128.06 gain 202 59 -132.47 gain 59 203 -126.46 gain 203 59 -130.50 gain 59 204 -128.77 gain 204 59 -130.09 gain 59 205 -122.42 gain 205 59 -122.81 gain 59 206 -124.60 gain 206 59 -129.51 gain 59 207 -127.51 gain 207 59 -124.79 gain 59 208 -121.50 gain 208 59 -124.55 gain 59 209 -127.95 gain 209 59 -132.00 gain 59 210 -130.76 gain 210 59 -131.74 gain 59 211 -129.73 gain 211 59 -132.73 gain 59 212 -133.89 gain 212 59 -135.43 gain 59 213 -130.32 gain 213 59 -131.05 gain 59 214 -129.11 gain 214 59 -129.73 gain 59 215 -125.09 gain 215 59 -122.13 gain 59 216 -126.45 gain 216 59 -128.15 gain 59 217 -120.31 gain 217 59 -122.53 gain 59 218 -121.37 gain 218 59 -125.77 gain 59 219 -123.80 gain 219 59 -119.57 gain 59 220 -118.50 gain 220 59 -124.76 gain 59 221 -118.00 gain 221 59 -119.90 gain 59 222 -123.92 gain 222 59 -126.15 gain 59 223 -120.91 gain 223 59 -121.74 gain 59 224 -122.69 gain 224 59 -126.22 gain 60 61 -91.79 gain 61 60 -90.54 gain 60 62 -97.24 gain 62 60 -101.21 gain 60 63 -106.52 gain 63 60 -103.72 gain 60 64 -112.73 gain 64 60 -112.90 gain 60 65 -115.52 gain 65 60 -117.78 gain 60 66 -122.17 gain 66 60 -118.68 gain 60 67 -112.33 gain 67 60 -111.11 gain 60 68 -119.07 gain 68 60 -122.42 gain 60 69 -121.09 gain 69 60 -121.73 gain 60 70 -124.65 gain 70 60 -125.04 gain 60 71 -122.65 gain 71 60 -121.15 gain 60 72 -129.00 gain 72 60 -127.92 gain 60 73 -125.05 gain 73 60 -122.36 gain 60 74 -131.13 gain 74 60 -132.32 gain 60 75 -91.50 gain 75 60 -92.82 gain 60 76 -102.47 gain 76 60 -99.74 gain 60 77 -106.16 gain 77 60 -107.10 gain 60 78 -105.29 gain 78 60 -109.09 gain 60 79 -117.37 gain 79 60 -115.94 gain 60 80 -119.77 gain 80 60 -118.84 gain 60 81 -115.60 gain 81 60 -115.27 gain 60 82 -116.76 gain 82 60 -114.05 gain 60 83 -119.30 gain 83 60 -117.63 gain 60 84 -125.02 gain 84 60 -123.49 gain 60 85 -130.15 gain 85 60 -125.43 gain 60 86 -121.63 gain 86 60 -120.29 gain 60 87 -121.68 gain 87 60 -124.30 gain 60 88 -124.84 gain 88 60 -125.21 gain 60 89 -128.71 gain 89 60 -127.69 gain 60 90 -105.34 gain 90 60 -101.33 gain 60 91 -103.52 gain 91 60 -103.45 gain 60 92 -101.05 gain 92 60 -97.94 gain 60 93 -108.13 gain 93 60 -109.81 gain 60 94 -114.25 gain 94 60 -115.80 gain 60 95 -120.75 gain 95 60 -124.56 gain 60 96 -121.44 gain 96 60 -122.58 gain 60 97 -118.97 gain 97 60 -118.86 gain 60 98 -122.37 gain 98 60 -123.06 gain 60 99 -120.19 gain 99 60 -118.70 gain 60 100 -129.51 gain 100 60 -127.58 gain 60 101 -121.47 gain 101 60 -119.71 gain 60 102 -124.84 gain 102 60 -123.86 gain 60 103 -128.59 gain 103 60 -125.09 gain 60 104 -132.60 gain 104 60 -134.47 gain 60 105 -102.21 gain 105 60 -100.03 gain 60 106 -105.53 gain 106 60 -104.43 gain 60 107 -113.65 gain 107 60 -119.12 gain 60 108 -108.31 gain 108 60 -106.09 gain 60 109 -108.76 gain 109 60 -110.03 gain 60 110 -108.58 gain 110 60 -108.32 gain 60 111 -117.95 gain 111 60 -117.37 gain 60 112 -131.85 gain 112 60 -130.15 gain 60 113 -117.94 gain 113 60 -115.04 gain 60 114 -125.58 gain 114 60 -126.00 gain 60 115 -122.97 gain 115 60 -117.69 gain 60 116 -128.20 gain 116 60 -130.46 gain 60 117 -122.00 gain 117 60 -125.76 gain 60 118 -133.87 gain 118 60 -135.95 gain 60 119 -124.86 gain 119 60 -121.60 gain 60 120 -115.49 gain 120 60 -116.74 gain 60 121 -109.02 gain 121 60 -109.57 gain 60 122 -113.94 gain 122 60 -116.60 gain 60 123 -118.61 gain 123 60 -122.05 gain 60 124 -112.65 gain 124 60 -112.50 gain 60 125 -124.24 gain 125 60 -125.43 gain 60 126 -117.90 gain 126 60 -117.03 gain 60 127 -123.43 gain 127 60 -126.03 gain 60 128 -122.12 gain 128 60 -122.66 gain 60 129 -121.78 gain 129 60 -120.23 gain 60 130 -129.94 gain 130 60 -126.21 gain 60 131 -131.60 gain 131 60 -134.95 gain 60 132 -121.93 gain 132 60 -124.91 gain 60 133 -119.29 gain 133 60 -120.34 gain 60 134 -132.42 gain 134 60 -130.17 gain 60 135 -109.22 gain 135 60 -110.55 gain 60 136 -116.94 gain 136 60 -118.87 gain 60 137 -114.88 gain 137 60 -114.29 gain 60 138 -110.62 gain 138 60 -109.04 gain 60 139 -117.28 gain 139 60 -116.68 gain 60 140 -120.44 gain 140 60 -122.45 gain 60 141 -125.11 gain 141 60 -125.79 gain 60 142 -123.53 gain 142 60 -123.52 gain 60 143 -124.39 gain 143 60 -123.99 gain 60 144 -117.98 gain 144 60 -118.60 gain 60 145 -124.40 gain 145 60 -123.47 gain 60 146 -122.52 gain 146 60 -120.50 gain 60 147 -127.07 gain 147 60 -122.14 gain 60 148 -123.87 gain 148 60 -118.66 gain 60 149 -130.49 gain 149 60 -128.44 gain 60 150 -118.87 gain 150 60 -119.51 gain 60 151 -118.49 gain 151 60 -119.33 gain 60 152 -119.02 gain 152 60 -116.83 gain 60 153 -111.01 gain 153 60 -106.40 gain 60 154 -114.50 gain 154 60 -118.44 gain 60 155 -124.58 gain 155 60 -128.41 gain 60 156 -124.91 gain 156 60 -123.13 gain 60 157 -123.84 gain 157 60 -125.01 gain 60 158 -123.76 gain 158 60 -127.53 gain 60 159 -130.48 gain 159 60 -130.87 gain 60 160 -120.93 gain 160 60 -118.42 gain 60 161 -117.42 gain 161 60 -118.40 gain 60 162 -129.12 gain 162 60 -128.97 gain 60 163 -121.87 gain 163 60 -123.86 gain 60 164 -128.90 gain 164 60 -131.94 gain 60 165 -121.63 gain 165 60 -120.71 gain 60 166 -120.61 gain 166 60 -121.26 gain 60 167 -114.42 gain 167 60 -117.16 gain 60 168 -124.57 gain 168 60 -125.76 gain 60 169 -122.43 gain 169 60 -127.82 gain 60 170 -126.58 gain 170 60 -123.49 gain 60 171 -121.28 gain 171 60 -123.21 gain 60 172 -122.99 gain 172 60 -119.63 gain 60 173 -130.68 gain 173 60 -126.75 gain 60 174 -120.34 gain 174 60 -120.70 gain 60 175 -130.87 gain 175 60 -134.79 gain 60 176 -124.70 gain 176 60 -120.63 gain 60 177 -118.99 gain 177 60 -122.73 gain 60 178 -131.97 gain 178 60 -131.54 gain 60 179 -129.60 gain 179 60 -127.56 gain 60 180 -123.23 gain 180 60 -122.66 gain 60 181 -120.31 gain 181 60 -119.81 gain 60 182 -120.06 gain 182 60 -121.95 gain 60 183 -128.89 gain 183 60 -124.16 gain 60 184 -123.56 gain 184 60 -123.61 gain 60 185 -123.16 gain 185 60 -120.70 gain 60 186 -115.83 gain 186 60 -113.65 gain 60 187 -124.38 gain 187 60 -124.75 gain 60 188 -129.83 gain 188 60 -133.45 gain 60 189 -126.42 gain 189 60 -127.56 gain 60 190 -129.98 gain 190 60 -128.13 gain 60 191 -123.87 gain 191 60 -123.12 gain 60 192 -129.81 gain 192 60 -131.92 gain 60 193 -116.07 gain 193 60 -119.43 gain 60 194 -123.96 gain 194 60 -121.13 gain 60 195 -120.13 gain 195 60 -117.94 gain 60 196 -125.85 gain 196 60 -127.70 gain 60 197 -121.38 gain 197 60 -119.29 gain 60 198 -119.07 gain 198 60 -116.50 gain 60 199 -123.11 gain 199 60 -124.45 gain 60 200 -129.32 gain 200 60 -127.60 gain 60 201 -123.57 gain 201 60 -122.65 gain 60 202 -128.56 gain 202 60 -131.64 gain 60 203 -129.50 gain 203 60 -132.21 gain 60 204 -125.45 gain 204 60 -125.45 gain 60 205 -123.85 gain 205 60 -122.91 gain 60 206 -122.22 gain 206 60 -125.81 gain 60 207 -129.84 gain 207 60 -125.79 gain 60 208 -126.26 gain 208 60 -127.98 gain 60 209 -129.42 gain 209 60 -132.14 gain 60 210 -123.82 gain 210 60 -123.47 gain 60 211 -124.85 gain 211 60 -126.52 gain 60 212 -131.55 gain 212 60 -131.77 gain 60 213 -123.23 gain 213 60 -122.64 gain 60 214 -121.30 gain 214 60 -120.60 gain 60 215 -125.52 gain 215 60 -121.24 gain 60 216 -127.52 gain 216 60 -127.89 gain 60 217 -123.95 gain 217 60 -124.84 gain 60 218 -125.54 gain 218 60 -128.63 gain 60 219 -124.99 gain 219 60 -119.43 gain 60 220 -133.79 gain 220 60 -138.72 gain 60 221 -130.67 gain 221 60 -131.25 gain 60 222 -125.75 gain 222 60 -126.66 gain 60 223 -133.87 gain 223 60 -133.38 gain 60 224 -129.08 gain 224 60 -131.29 gain 61 62 -87.73 gain 62 61 -92.95 gain 61 63 -99.74 gain 63 61 -98.19 gain 61 64 -103.01 gain 64 61 -104.43 gain 61 65 -105.99 gain 65 61 -109.49 gain 61 66 -116.28 gain 66 61 -114.04 gain 61 67 -120.80 gain 67 61 -120.84 gain 61 68 -123.22 gain 68 61 -127.81 gain 61 69 -121.61 gain 69 61 -123.50 gain 61 70 -129.36 gain 70 61 -131.00 gain 61 71 -123.43 gain 71 61 -123.18 gain 61 72 -127.29 gain 72 61 -127.46 gain 61 73 -125.83 gain 73 61 -124.39 gain 61 74 -127.34 gain 74 61 -129.77 gain 61 75 -97.63 gain 75 61 -100.20 gain 61 76 -90.02 gain 76 61 -88.55 gain 61 77 -96.15 gain 77 61 -98.34 gain 61 78 -102.32 gain 78 61 -107.37 gain 61 79 -107.74 gain 79 61 -107.56 gain 61 80 -112.17 gain 80 61 -112.49 gain 61 81 -116.46 gain 81 61 -117.37 gain 61 82 -114.27 gain 82 61 -112.81 gain 61 83 -116.43 gain 83 61 -116.01 gain 61 84 -119.04 gain 84 61 -118.76 gain 61 85 -120.91 gain 85 61 -117.44 gain 61 86 -128.21 gain 86 61 -128.12 gain 61 87 -123.84 gain 87 61 -127.71 gain 61 88 -129.44 gain 88 61 -131.07 gain 61 89 -123.52 gain 89 61 -123.74 gain 61 90 -100.77 gain 90 61 -98.00 gain 61 91 -103.52 gain 91 61 -104.70 gain 61 92 -104.96 gain 92 61 -103.10 gain 61 93 -99.92 gain 93 61 -102.85 gain 61 94 -107.49 gain 94 61 -110.29 gain 61 95 -113.83 gain 95 61 -118.89 gain 61 96 -111.98 gain 96 61 -114.38 gain 61 97 -115.28 gain 97 61 -116.41 gain 61 98 -124.09 gain 98 61 -126.03 gain 61 99 -120.86 gain 99 61 -120.61 gain 61 100 -124.83 gain 100 61 -124.15 gain 61 101 -120.41 gain 101 61 -119.89 gain 61 102 -119.08 gain 102 61 -119.34 gain 61 103 -125.67 gain 103 61 -123.42 gain 61 104 -128.45 gain 104 61 -131.58 gain 61 105 -118.23 gain 105 61 -117.30 gain 61 106 -100.06 gain 106 61 -100.21 gain 61 107 -111.63 gain 107 61 -118.34 gain 61 108 -106.81 gain 108 61 -105.84 gain 61 109 -104.02 gain 109 61 -106.54 gain 61 110 -116.35 gain 110 61 -117.34 gain 61 111 -113.07 gain 111 61 -113.75 gain 61 112 -114.70 gain 112 61 -114.26 gain 61 113 -126.50 gain 113 61 -124.86 gain 61 114 -114.63 gain 114 61 -116.29 gain 61 115 -117.62 gain 115 61 -113.59 gain 61 116 -122.17 gain 116 61 -125.67 gain 61 117 -120.63 gain 117 61 -125.64 gain 61 118 -123.83 gain 118 61 -127.16 gain 61 119 -129.24 gain 119 61 -127.23 gain 61 120 -110.08 gain 120 61 -112.58 gain 61 121 -105.20 gain 121 61 -107.00 gain 61 122 -110.67 gain 122 61 -114.58 gain 61 123 -118.75 gain 123 61 -123.44 gain 61 124 -114.60 gain 124 61 -115.70 gain 61 125 -108.27 gain 125 61 -110.70 gain 61 126 -123.06 gain 126 61 -123.45 gain 61 127 -116.98 gain 127 61 -120.83 gain 61 128 -120.90 gain 128 61 -122.68 gain 61 129 -124.23 gain 129 61 -123.92 gain 61 130 -115.35 gain 130 61 -112.87 gain 61 131 -121.03 gain 131 61 -125.63 gain 61 132 -123.80 gain 132 61 -128.03 gain 61 133 -130.53 gain 133 61 -132.84 gain 61 134 -129.59 gain 134 61 -128.59 gain 61 135 -112.62 gain 135 61 -115.20 gain 61 136 -111.94 gain 136 61 -115.12 gain 61 137 -121.39 gain 137 61 -122.06 gain 61 138 -106.55 gain 138 61 -106.22 gain 61 139 -116.80 gain 139 61 -117.45 gain 61 140 -116.83 gain 140 61 -120.09 gain 61 141 -123.37 gain 141 61 -125.30 gain 61 142 -117.93 gain 142 61 -119.16 gain 61 143 -126.64 gain 143 61 -127.49 gain 61 144 -116.42 gain 144 61 -118.29 gain 61 145 -120.69 gain 145 61 -121.01 gain 61 146 -122.35 gain 146 61 -121.58 gain 61 147 -125.41 gain 147 61 -121.73 gain 61 148 -123.40 gain 148 61 -119.44 gain 61 149 -129.13 gain 149 61 -128.33 gain 61 150 -116.04 gain 150 61 -117.93 gain 61 151 -118.21 gain 151 61 -120.29 gain 61 152 -115.41 gain 152 61 -114.48 gain 61 153 -116.95 gain 153 61 -113.59 gain 61 154 -118.44 gain 154 61 -123.63 gain 61 155 -115.68 gain 155 61 -120.76 gain 61 156 -121.27 gain 156 61 -120.75 gain 61 157 -116.76 gain 157 61 -119.18 gain 61 158 -122.54 gain 158 61 -127.56 gain 61 159 -125.70 gain 159 61 -127.33 gain 61 160 -122.35 gain 160 61 -121.09 gain 61 161 -125.61 gain 161 61 -127.84 gain 61 162 -123.22 gain 162 61 -124.32 gain 61 163 -131.95 gain 163 61 -135.19 gain 61 164 -121.97 gain 164 61 -126.26 gain 61 165 -124.40 gain 165 61 -124.73 gain 61 166 -123.92 gain 166 61 -125.82 gain 61 167 -128.70 gain 167 61 -132.69 gain 61 168 -113.26 gain 168 61 -115.70 gain 61 169 -118.27 gain 169 61 -124.91 gain 61 170 -116.02 gain 170 61 -114.18 gain 61 171 -120.21 gain 171 61 -123.40 gain 61 172 -122.49 gain 172 61 -120.37 gain 61 173 -119.10 gain 173 61 -116.42 gain 61 174 -116.19 gain 174 61 -117.81 gain 61 175 -122.78 gain 175 61 -127.95 gain 61 176 -122.70 gain 176 61 -119.88 gain 61 177 -127.17 gain 177 61 -132.16 gain 61 178 -125.00 gain 178 61 -125.82 gain 61 179 -128.38 gain 179 61 -127.59 gain 61 180 -114.16 gain 180 61 -114.84 gain 61 181 -119.77 gain 181 61 -120.52 gain 61 182 -123.76 gain 182 61 -126.89 gain 61 183 -117.22 gain 183 61 -113.74 gain 61 184 -125.33 gain 184 61 -126.63 gain 61 185 -115.03 gain 185 61 -113.82 gain 61 186 -128.40 gain 186 61 -127.47 gain 61 187 -122.73 gain 187 61 -124.35 gain 61 188 -124.89 gain 188 61 -129.76 gain 61 189 -127.26 gain 189 61 -129.65 gain 61 190 -131.09 gain 190 61 -130.49 gain 61 191 -122.74 gain 191 61 -123.23 gain 61 192 -127.03 gain 192 61 -130.39 gain 61 193 -128.11 gain 193 61 -132.72 gain 61 194 -122.93 gain 194 61 -121.35 gain 61 195 -125.62 gain 195 61 -124.67 gain 61 196 -116.83 gain 196 61 -119.93 gain 61 197 -124.27 gain 197 61 -123.43 gain 61 198 -122.33 gain 198 61 -121.00 gain 61 199 -121.19 gain 199 61 -123.79 gain 61 200 -127.03 gain 200 61 -126.56 gain 61 201 -120.98 gain 201 61 -121.31 gain 61 202 -116.37 gain 202 61 -120.71 gain 61 203 -135.54 gain 203 61 -139.50 gain 61 204 -123.57 gain 204 61 -124.82 gain 61 205 -124.55 gain 205 61 -124.86 gain 61 206 -125.05 gain 206 61 -129.89 gain 61 207 -125.72 gain 207 61 -122.92 gain 61 208 -136.95 gain 208 61 -139.93 gain 61 209 -128.92 gain 209 61 -132.89 gain 61 210 -124.91 gain 210 61 -125.82 gain 61 211 -122.03 gain 211 61 -124.96 gain 61 212 -117.04 gain 212 61 -118.50 gain 61 213 -128.30 gain 213 61 -128.96 gain 61 214 -122.04 gain 214 61 -122.59 gain 61 215 -131.89 gain 215 61 -128.86 gain 61 216 -119.07 gain 216 61 -120.70 gain 61 217 -127.11 gain 217 61 -129.25 gain 61 218 -128.28 gain 218 61 -132.61 gain 61 219 -125.48 gain 219 61 -121.17 gain 61 220 -129.19 gain 220 61 -135.37 gain 61 221 -131.22 gain 221 61 -133.05 gain 61 222 -128.50 gain 222 61 -130.65 gain 61 223 -125.32 gain 223 61 -126.09 gain 61 224 -131.58 gain 224 61 -135.03 gain 62 63 -102.82 gain 63 62 -96.04 gain 62 64 -105.52 gain 64 62 -101.72 gain 62 65 -109.53 gain 65 62 -107.82 gain 62 66 -111.73 gain 66 62 -104.27 gain 62 67 -115.35 gain 67 62 -110.17 gain 62 68 -120.63 gain 68 62 -120.00 gain 62 69 -115.62 gain 69 62 -112.29 gain 62 70 -122.81 gain 70 62 -119.24 gain 62 71 -132.76 gain 71 62 -127.30 gain 62 72 -133.77 gain 72 62 -128.72 gain 62 73 -136.64 gain 73 62 -129.98 gain 62 74 -134.51 gain 74 62 -131.73 gain 62 75 -113.49 gain 75 62 -110.85 gain 62 76 -99.01 gain 76 62 -92.32 gain 62 77 -96.13 gain 77 62 -93.10 gain 62 78 -101.99 gain 78 62 -101.82 gain 62 79 -109.66 gain 79 62 -104.26 gain 62 80 -109.04 gain 80 62 -104.14 gain 62 81 -101.62 gain 81 62 -97.32 gain 62 82 -120.67 gain 82 62 -113.99 gain 62 83 -127.32 gain 83 62 -121.68 gain 62 84 -117.59 gain 84 62 -112.09 gain 62 85 -127.41 gain 85 62 -118.72 gain 62 86 -119.12 gain 86 62 -113.81 gain 62 87 -132.87 gain 87 62 -131.53 gain 62 88 -126.61 gain 88 62 -123.02 gain 62 89 -131.03 gain 89 62 -126.04 gain 62 90 -118.36 gain 90 62 -110.37 gain 62 91 -111.24 gain 91 62 -107.20 gain 62 92 -104.42 gain 92 62 -97.34 gain 62 93 -107.48 gain 93 62 -105.19 gain 62 94 -108.36 gain 94 62 -105.94 gain 62 95 -119.11 gain 95 62 -118.95 gain 62 96 -115.15 gain 96 62 -112.32 gain 62 97 -117.53 gain 97 62 -113.44 gain 62 98 -124.15 gain 98 62 -120.86 gain 62 99 -127.82 gain 99 62 -122.36 gain 62 100 -128.98 gain 100 62 -123.08 gain 62 101 -121.02 gain 101 62 -115.28 gain 62 102 -125.97 gain 102 62 -121.02 gain 62 103 -130.26 gain 103 62 -122.79 gain 62 104 -136.02 gain 104 62 -133.92 gain 62 105 -121.02 gain 105 62 -114.87 gain 62 106 -110.59 gain 106 62 -105.52 gain 62 107 -112.99 gain 107 62 -114.49 gain 62 108 -110.85 gain 108 62 -104.66 gain 62 109 -114.37 gain 109 62 -111.68 gain 62 110 -118.74 gain 110 62 -114.52 gain 62 111 -129.34 gain 111 62 -124.79 gain 62 112 -121.12 gain 112 62 -115.46 gain 62 113 -125.55 gain 113 62 -118.69 gain 62 114 -122.53 gain 114 62 -118.98 gain 62 115 -125.10 gain 115 62 -115.84 gain 62 116 -122.92 gain 116 62 -121.21 gain 62 117 -126.46 gain 117 62 -126.25 gain 62 118 -125.55 gain 118 62 -123.66 gain 62 119 -133.47 gain 119 62 -126.24 gain 62 120 -117.71 gain 120 62 -115.00 gain 62 121 -123.25 gain 121 62 -119.82 gain 62 122 -114.64 gain 122 62 -113.33 gain 62 123 -114.93 gain 123 62 -114.40 gain 62 124 -115.24 gain 124 62 -111.12 gain 62 125 -116.21 gain 125 62 -113.42 gain 62 126 -117.93 gain 126 62 -113.10 gain 62 127 -115.07 gain 127 62 -113.70 gain 62 128 -125.18 gain 128 62 -121.75 gain 62 129 -120.12 gain 129 62 -114.60 gain 62 130 -131.62 gain 130 62 -123.92 gain 62 131 -135.07 gain 131 62 -134.46 gain 62 132 -130.47 gain 132 62 -129.49 gain 62 133 -131.78 gain 133 62 -128.86 gain 62 134 -126.77 gain 134 62 -120.56 gain 62 135 -115.51 gain 135 62 -112.87 gain 62 136 -118.81 gain 136 62 -116.77 gain 62 137 -116.26 gain 137 62 -111.70 gain 62 138 -120.66 gain 138 62 -115.10 gain 62 139 -123.95 gain 139 62 -119.38 gain 62 140 -120.94 gain 140 62 -118.98 gain 62 141 -125.97 gain 141 62 -122.68 gain 62 142 -118.87 gain 142 62 -114.89 gain 62 143 -124.83 gain 143 62 -120.47 gain 62 144 -126.81 gain 144 62 -123.46 gain 62 145 -123.98 gain 145 62 -119.08 gain 62 146 -128.20 gain 146 62 -122.21 gain 62 147 -127.71 gain 147 62 -118.81 gain 62 148 -123.13 gain 148 62 -113.95 gain 62 149 -138.20 gain 149 62 -132.19 gain 62 150 -121.37 gain 150 62 -118.05 gain 62 151 -120.33 gain 151 62 -117.20 gain 62 152 -126.92 gain 152 62 -120.77 gain 62 153 -127.78 gain 153 62 -119.20 gain 62 154 -118.51 gain 154 62 -118.48 gain 62 155 -120.76 gain 155 62 -120.63 gain 62 156 -117.01 gain 156 62 -111.27 gain 62 157 -126.48 gain 157 62 -123.68 gain 62 158 -132.63 gain 158 62 -132.42 gain 62 159 -118.65 gain 159 62 -115.06 gain 62 160 -131.06 gain 160 62 -124.58 gain 62 161 -136.41 gain 161 62 -133.42 gain 62 162 -129.67 gain 162 62 -125.55 gain 62 163 -132.65 gain 163 62 -130.68 gain 62 164 -126.04 gain 164 62 -125.11 gain 62 165 -126.63 gain 165 62 -121.74 gain 62 166 -126.46 gain 166 62 -123.14 gain 62 167 -119.09 gain 167 62 -117.86 gain 62 168 -124.81 gain 168 62 -122.03 gain 62 169 -126.02 gain 169 62 -127.43 gain 62 170 -118.76 gain 170 62 -111.71 gain 62 171 -130.93 gain 171 62 -128.90 gain 62 172 -129.04 gain 172 62 -121.71 gain 62 173 -126.05 gain 173 62 -118.15 gain 62 174 -121.63 gain 174 62 -118.03 gain 62 175 -125.01 gain 175 62 -124.97 gain 62 176 -127.46 gain 176 62 -119.43 gain 62 177 -134.84 gain 177 62 -134.61 gain 62 178 -132.80 gain 178 62 -128.40 gain 62 179 -138.67 gain 179 62 -132.67 gain 62 180 -127.16 gain 180 62 -122.62 gain 62 181 -125.80 gain 181 62 -121.32 gain 62 182 -126.39 gain 182 62 -124.30 gain 62 183 -126.68 gain 183 62 -117.99 gain 62 184 -119.45 gain 184 62 -115.54 gain 62 185 -125.94 gain 185 62 -119.51 gain 62 186 -131.22 gain 186 62 -125.08 gain 62 187 -128.12 gain 187 62 -124.52 gain 62 188 -129.98 gain 188 62 -129.63 gain 62 189 -128.94 gain 189 62 -126.11 gain 62 190 -128.13 gain 190 62 -122.31 gain 62 191 -126.53 gain 191 62 -121.80 gain 62 192 -135.26 gain 192 62 -133.40 gain 62 193 -132.21 gain 193 62 -131.60 gain 62 194 -131.74 gain 194 62 -124.94 gain 62 195 -124.50 gain 195 62 -118.33 gain 62 196 -118.45 gain 196 62 -116.33 gain 62 197 -123.63 gain 197 62 -117.57 gain 62 198 -129.06 gain 198 62 -122.52 gain 62 199 -129.49 gain 199 62 -126.86 gain 62 200 -125.20 gain 200 62 -119.52 gain 62 201 -125.17 gain 201 62 -120.28 gain 62 202 -126.00 gain 202 62 -125.12 gain 62 203 -129.22 gain 203 62 -127.96 gain 62 204 -127.19 gain 204 62 -123.22 gain 62 205 -131.91 gain 205 62 -127.00 gain 62 206 -126.64 gain 206 62 -126.26 gain 62 207 -130.63 gain 207 62 -122.61 gain 62 208 -132.97 gain 208 62 -130.72 gain 62 209 -131.45 gain 209 62 -130.20 gain 62 210 -124.86 gain 210 62 -120.55 gain 62 211 -122.71 gain 211 62 -120.42 gain 62 212 -129.43 gain 212 62 -125.68 gain 62 213 -131.09 gain 213 62 -126.54 gain 62 214 -129.13 gain 214 62 -124.46 gain 62 215 -136.30 gain 215 62 -128.05 gain 62 216 -127.76 gain 216 62 -124.17 gain 62 217 -133.79 gain 217 62 -130.72 gain 62 218 -128.66 gain 218 62 -127.77 gain 62 219 -134.21 gain 219 62 -124.68 gain 62 220 -127.70 gain 220 62 -128.66 gain 62 221 -128.75 gain 221 62 -125.35 gain 62 222 -131.01 gain 222 62 -127.94 gain 62 223 -133.52 gain 223 62 -129.07 gain 62 224 -130.50 gain 224 62 -128.73 gain 63 64 -99.63 gain 64 63 -102.61 gain 63 65 -97.99 gain 65 63 -103.05 gain 63 66 -100.22 gain 66 63 -99.53 gain 63 67 -110.16 gain 67 63 -111.75 gain 63 68 -115.29 gain 68 63 -121.44 gain 63 69 -112.94 gain 69 63 -116.38 gain 63 70 -114.72 gain 70 63 -117.92 gain 63 71 -118.30 gain 71 63 -119.60 gain 63 72 -117.89 gain 72 63 -119.61 gain 63 73 -117.79 gain 73 63 -117.90 gain 63 74 -119.73 gain 74 63 -123.72 gain 63 75 -101.22 gain 75 63 -105.35 gain 63 76 -96.19 gain 76 63 -96.27 gain 63 77 -91.00 gain 77 63 -94.75 gain 63 78 -94.70 gain 78 63 -101.30 gain 63 79 -99.47 gain 79 63 -100.85 gain 63 80 -103.07 gain 80 63 -104.95 gain 63 81 -107.05 gain 81 63 -109.52 gain 63 82 -102.40 gain 82 63 -102.50 gain 63 83 -115.68 gain 83 63 -116.81 gain 63 84 -103.13 gain 84 63 -104.41 gain 63 85 -115.28 gain 85 63 -113.36 gain 63 86 -119.82 gain 86 63 -121.28 gain 63 87 -124.56 gain 87 63 -129.99 gain 63 88 -126.17 gain 88 63 -129.35 gain 63 89 -121.99 gain 89 63 -123.77 gain 63 90 -111.11 gain 90 63 -109.90 gain 63 91 -100.91 gain 91 63 -103.64 gain 63 92 -100.56 gain 92 63 -100.25 gain 63 93 -98.39 gain 93 63 -102.87 gain 63 94 -97.77 gain 94 63 -102.13 gain 63 95 -98.45 gain 95 63 -105.06 gain 63 96 -105.17 gain 96 63 -109.11 gain 63 97 -110.31 gain 97 63 -113.00 gain 63 98 -114.69 gain 98 63 -118.18 gain 63 99 -113.24 gain 99 63 -114.55 gain 63 100 -118.48 gain 100 63 -119.35 gain 63 101 -122.49 gain 101 63 -123.53 gain 63 102 -114.16 gain 102 63 -115.98 gain 63 103 -120.88 gain 103 63 -120.19 gain 63 104 -126.90 gain 104 63 -131.58 gain 63 105 -113.21 gain 105 63 -113.83 gain 63 106 -106.15 gain 106 63 -107.86 gain 63 107 -101.23 gain 107 63 -109.50 gain 63 108 -106.03 gain 108 63 -106.62 gain 63 109 -101.72 gain 109 63 -105.80 gain 63 110 -105.63 gain 110 63 -108.18 gain 63 111 -107.94 gain 111 63 -110.17 gain 63 112 -108.63 gain 112 63 -109.74 gain 63 113 -104.61 gain 113 63 -104.53 gain 63 114 -112.46 gain 114 63 -115.67 gain 63 115 -117.45 gain 115 63 -114.97 gain 63 116 -114.65 gain 116 63 -119.72 gain 63 117 -128.41 gain 117 63 -134.97 gain 63 118 -121.38 gain 118 63 -126.27 gain 63 119 -128.62 gain 119 63 -128.16 gain 63 120 -111.00 gain 120 63 -115.06 gain 63 121 -109.52 gain 121 63 -112.87 gain 63 122 -111.57 gain 122 63 -117.03 gain 63 123 -109.11 gain 123 63 -115.35 gain 63 124 -107.27 gain 124 63 -109.92 gain 63 125 -106.74 gain 125 63 -110.72 gain 63 126 -108.15 gain 126 63 -110.09 gain 63 127 -111.64 gain 127 63 -117.04 gain 63 128 -116.86 gain 128 63 -120.20 gain 63 129 -117.02 gain 129 63 -118.27 gain 63 130 -118.71 gain 130 63 -117.79 gain 63 131 -120.13 gain 131 63 -126.29 gain 63 132 -130.26 gain 132 63 -136.05 gain 63 133 -118.09 gain 133 63 -121.95 gain 63 134 -118.28 gain 134 63 -118.84 gain 63 135 -114.51 gain 135 63 -118.64 gain 63 136 -113.61 gain 136 63 -118.35 gain 63 137 -107.40 gain 137 63 -109.62 gain 63 138 -111.13 gain 138 63 -112.36 gain 63 139 -109.61 gain 139 63 -111.82 gain 63 140 -111.32 gain 140 63 -116.14 gain 63 141 -116.24 gain 141 63 -119.72 gain 63 142 -110.61 gain 142 63 -113.40 gain 63 143 -120.93 gain 143 63 -123.34 gain 63 144 -117.27 gain 144 63 -120.70 gain 63 145 -124.02 gain 145 63 -125.89 gain 63 146 -123.12 gain 146 63 -123.90 gain 63 147 -124.60 gain 147 63 -122.47 gain 63 148 -120.01 gain 148 63 -117.60 gain 63 149 -126.06 gain 149 63 -126.82 gain 63 150 -113.89 gain 150 63 -117.33 gain 63 151 -112.03 gain 151 63 -115.67 gain 63 152 -113.69 gain 152 63 -114.31 gain 63 153 -117.56 gain 153 63 -115.76 gain 63 154 -120.53 gain 154 63 -127.28 gain 63 155 -119.20 gain 155 63 -125.84 gain 63 156 -116.45 gain 156 63 -117.48 gain 63 157 -116.90 gain 157 63 -120.88 gain 63 158 -119.03 gain 158 63 -125.60 gain 63 159 -121.96 gain 159 63 -125.14 gain 63 160 -116.98 gain 160 63 -117.28 gain 63 161 -122.14 gain 161 63 -125.93 gain 63 162 -117.54 gain 162 63 -120.20 gain 63 163 -129.81 gain 163 63 -134.62 gain 63 164 -129.34 gain 164 63 -135.19 gain 63 165 -121.14 gain 165 63 -123.03 gain 63 166 -117.30 gain 166 63 -120.75 gain 63 167 -121.27 gain 167 63 -126.81 gain 63 168 -115.15 gain 168 63 -119.14 gain 63 169 -115.18 gain 169 63 -123.37 gain 63 170 -116.36 gain 170 63 -116.08 gain 63 171 -116.52 gain 171 63 -121.27 gain 63 172 -118.39 gain 172 63 -117.83 gain 63 173 -120.96 gain 173 63 -119.84 gain 63 174 -122.24 gain 174 63 -125.41 gain 63 175 -122.29 gain 175 63 -129.01 gain 63 176 -123.17 gain 176 63 -121.91 gain 63 177 -127.01 gain 177 63 -133.56 gain 63 178 -126.69 gain 178 63 -129.06 gain 63 179 -115.65 gain 179 63 -116.41 gain 63 180 -112.64 gain 180 63 -114.87 gain 63 181 -118.75 gain 181 63 -121.05 gain 63 182 -116.98 gain 182 63 -121.66 gain 63 183 -111.50 gain 183 63 -109.57 gain 63 184 -113.75 gain 184 63 -116.61 gain 63 185 -118.80 gain 185 63 -119.14 gain 63 186 -120.50 gain 186 63 -121.13 gain 63 187 -117.20 gain 187 63 -120.37 gain 63 188 -124.12 gain 188 63 -130.55 gain 63 189 -124.54 gain 189 63 -128.48 gain 63 190 -116.52 gain 190 63 -117.48 gain 63 191 -117.26 gain 191 63 -119.30 gain 63 192 -125.26 gain 192 63 -130.18 gain 63 193 -126.00 gain 193 63 -132.16 gain 63 194 -130.04 gain 194 63 -130.01 gain 63 195 -121.45 gain 195 63 -122.05 gain 63 196 -119.64 gain 196 63 -124.29 gain 63 197 -115.72 gain 197 63 -116.43 gain 63 198 -122.17 gain 198 63 -122.41 gain 63 199 -111.41 gain 199 63 -115.56 gain 63 200 -120.85 gain 200 63 -121.94 gain 63 201 -116.12 gain 201 63 -118.01 gain 63 202 -127.15 gain 202 63 -133.04 gain 63 203 -124.82 gain 203 63 -130.34 gain 63 204 -117.56 gain 204 63 -120.36 gain 63 205 -121.50 gain 205 63 -123.37 gain 63 206 -123.38 gain 206 63 -129.78 gain 63 207 -122.55 gain 207 63 -121.30 gain 63 208 -126.43 gain 208 63 -130.96 gain 63 209 -124.43 gain 209 63 -129.95 gain 63 210 -121.17 gain 210 63 -123.63 gain 63 211 -122.74 gain 211 63 -127.22 gain 63 212 -119.29 gain 212 63 -122.31 gain 63 213 -122.29 gain 213 63 -124.50 gain 63 214 -121.33 gain 214 63 -123.44 gain 63 215 -122.90 gain 215 63 -121.42 gain 63 216 -119.19 gain 216 63 -122.37 gain 63 217 -116.18 gain 217 63 -119.88 gain 63 218 -125.23 gain 218 63 -131.12 gain 63 219 -118.08 gain 219 63 -115.33 gain 63 220 -121.19 gain 220 63 -128.93 gain 63 221 -123.36 gain 221 63 -126.74 gain 63 222 -125.61 gain 222 63 -129.31 gain 63 223 -117.95 gain 223 63 -120.27 gain 63 224 -125.44 gain 224 63 -130.44 gain 64 65 -86.53 gain 65 64 -88.62 gain 64 66 -106.10 gain 66 64 -102.44 gain 64 67 -104.04 gain 67 64 -102.65 gain 64 68 -115.04 gain 68 64 -118.22 gain 64 69 -113.76 gain 69 64 -114.23 gain 64 70 -112.79 gain 70 64 -113.01 gain 64 71 -120.98 gain 71 64 -119.32 gain 64 72 -118.95 gain 72 64 -117.69 gain 64 73 -120.59 gain 73 64 -117.73 gain 64 74 -120.46 gain 74 64 -121.47 gain 64 75 -116.27 gain 75 64 -117.42 gain 64 76 -103.60 gain 76 64 -100.70 gain 64 77 -113.72 gain 77 64 -114.49 gain 64 78 -102.40 gain 78 64 -106.02 gain 64 79 -97.36 gain 79 64 -95.77 gain 64 80 -100.19 gain 80 64 -99.10 gain 64 81 -96.29 gain 81 64 -95.79 gain 64 82 -108.16 gain 82 64 -105.28 gain 64 83 -112.60 gain 83 64 -110.76 gain 64 84 -118.98 gain 84 64 -117.28 gain 64 85 -118.34 gain 85 64 -113.45 gain 64 86 -114.56 gain 86 64 -113.06 gain 64 87 -125.76 gain 87 64 -128.21 gain 64 88 -124.98 gain 88 64 -125.18 gain 64 89 -122.59 gain 89 64 -121.40 gain 64 90 -117.01 gain 90 64 -112.82 gain 64 91 -107.37 gain 91 64 -107.13 gain 64 92 -103.38 gain 92 64 -100.10 gain 64 93 -106.65 gain 93 64 -108.16 gain 64 94 -104.99 gain 94 64 -106.38 gain 64 95 -99.56 gain 95 64 -103.20 gain 64 96 -104.87 gain 96 64 -105.84 gain 64 97 -107.30 gain 97 64 -107.02 gain 64 98 -110.76 gain 98 64 -111.28 gain 64 99 -117.21 gain 99 64 -115.55 gain 64 100 -124.41 gain 100 64 -122.31 gain 64 101 -124.96 gain 101 64 -123.03 gain 64 102 -115.99 gain 102 64 -114.83 gain 64 103 -123.41 gain 103 64 -119.75 gain 64 104 -127.91 gain 104 64 -129.62 gain 64 105 -113.80 gain 105 64 -111.45 gain 64 106 -111.97 gain 106 64 -110.70 gain 64 107 -111.79 gain 107 64 -117.09 gain 64 108 -111.84 gain 108 64 -109.46 gain 64 109 -102.28 gain 109 64 -103.39 gain 64 110 -102.30 gain 110 64 -101.87 gain 64 111 -102.99 gain 111 64 -102.25 gain 64 112 -114.42 gain 112 64 -112.56 gain 64 113 -114.20 gain 113 64 -111.14 gain 64 114 -114.84 gain 114 64 -115.08 gain 64 115 -117.51 gain 115 64 -112.05 gain 64 116 -116.80 gain 116 64 -118.89 gain 64 117 -127.60 gain 117 64 -131.19 gain 64 118 -122.08 gain 118 64 -123.99 gain 64 119 -126.06 gain 119 64 -122.63 gain 64 120 -114.58 gain 120 64 -115.66 gain 64 121 -112.71 gain 121 64 -113.09 gain 64 122 -116.43 gain 122 64 -118.92 gain 64 123 -108.45 gain 123 64 -111.72 gain 64 124 -113.66 gain 124 64 -113.33 gain 64 125 -119.90 gain 125 64 -120.91 gain 64 126 -113.05 gain 126 64 -112.02 gain 64 127 -120.89 gain 127 64 -123.32 gain 64 128 -113.05 gain 128 64 -113.42 gain 64 129 -124.74 gain 129 64 -123.02 gain 64 130 -125.18 gain 130 64 -121.28 gain 64 131 -121.55 gain 131 64 -124.74 gain 64 132 -123.35 gain 132 64 -126.16 gain 64 133 -127.57 gain 133 64 -128.45 gain 64 134 -121.80 gain 134 64 -119.39 gain 64 135 -113.09 gain 135 64 -114.24 gain 64 136 -121.47 gain 136 64 -123.24 gain 64 137 -108.88 gain 137 64 -108.13 gain 64 138 -107.55 gain 138 64 -105.80 gain 64 139 -115.50 gain 139 64 -114.74 gain 64 140 -112.85 gain 140 64 -114.69 gain 64 141 -111.22 gain 141 64 -111.73 gain 64 142 -115.28 gain 142 64 -115.10 gain 64 143 -121.82 gain 143 64 -121.26 gain 64 144 -121.03 gain 144 64 -121.48 gain 64 145 -119.65 gain 145 64 -118.56 gain 64 146 -120.00 gain 146 64 -117.81 gain 64 147 -125.36 gain 147 64 -120.27 gain 64 148 -123.34 gain 148 64 -117.96 gain 64 149 -121.14 gain 149 64 -118.93 gain 64 150 -118.37 gain 150 64 -118.84 gain 64 151 -112.41 gain 151 64 -113.08 gain 64 152 -122.94 gain 152 64 -120.59 gain 64 153 -115.00 gain 153 64 -110.22 gain 64 154 -111.56 gain 154 64 -115.33 gain 64 155 -114.23 gain 155 64 -117.89 gain 64 156 -121.60 gain 156 64 -119.66 gain 64 157 -123.74 gain 157 64 -124.74 gain 64 158 -115.66 gain 158 64 -119.26 gain 64 159 -125.50 gain 159 64 -125.72 gain 64 160 -125.99 gain 160 64 -123.32 gain 64 161 -124.17 gain 161 64 -124.98 gain 64 162 -120.21 gain 162 64 -119.89 gain 64 163 -122.75 gain 163 64 -124.58 gain 64 164 -126.47 gain 164 64 -129.34 gain 64 165 -127.62 gain 165 64 -126.53 gain 64 166 -116.69 gain 166 64 -117.17 gain 64 167 -119.61 gain 167 64 -122.18 gain 64 168 -116.21 gain 168 64 -117.23 gain 64 169 -115.92 gain 169 64 -121.14 gain 64 170 -120.55 gain 170 64 -117.30 gain 64 171 -121.66 gain 171 64 -123.43 gain 64 172 -120.06 gain 172 64 -116.52 gain 64 173 -124.26 gain 173 64 -120.16 gain 64 174 -119.56 gain 174 64 -119.76 gain 64 175 -118.77 gain 175 64 -122.52 gain 64 176 -129.24 gain 176 64 -125.01 gain 64 177 -132.33 gain 177 64 -135.91 gain 64 178 -127.22 gain 178 64 -126.62 gain 64 179 -132.25 gain 179 64 -130.04 gain 64 180 -125.07 gain 180 64 -124.34 gain 64 181 -128.36 gain 181 64 -127.69 gain 64 182 -117.28 gain 182 64 -118.99 gain 64 183 -125.47 gain 183 64 -120.58 gain 64 184 -121.35 gain 184 64 -121.24 gain 64 185 -118.72 gain 185 64 -116.09 gain 64 186 -123.61 gain 186 64 -121.26 gain 64 187 -118.12 gain 187 64 -118.31 gain 64 188 -119.60 gain 188 64 -123.06 gain 64 189 -119.52 gain 189 64 -120.49 gain 64 190 -125.11 gain 190 64 -123.09 gain 64 191 -130.70 gain 191 64 -129.78 gain 64 192 -126.27 gain 192 64 -128.21 gain 64 193 -130.92 gain 193 64 -134.11 gain 64 194 -122.31 gain 194 64 -119.31 gain 64 195 -126.32 gain 195 64 -123.95 gain 64 196 -116.22 gain 196 64 -117.89 gain 64 197 -118.28 gain 197 64 -116.01 gain 64 198 -123.35 gain 198 64 -120.61 gain 64 199 -121.54 gain 199 64 -122.71 gain 64 200 -125.43 gain 200 64 -123.54 gain 64 201 -123.08 gain 201 64 -122.00 gain 64 202 -129.11 gain 202 64 -132.03 gain 64 203 -132.36 gain 203 64 -134.90 gain 64 204 -123.88 gain 204 64 -123.71 gain 64 205 -127.72 gain 205 64 -126.62 gain 64 206 -123.11 gain 206 64 -126.53 gain 64 207 -128.42 gain 207 64 -124.20 gain 64 208 -129.86 gain 208 64 -131.41 gain 64 209 -130.24 gain 209 64 -132.79 gain 64 210 -128.30 gain 210 64 -127.79 gain 64 211 -127.70 gain 211 64 -129.21 gain 64 212 -126.80 gain 212 64 -126.85 gain 64 213 -126.95 gain 213 64 -126.20 gain 64 214 -123.78 gain 214 64 -122.91 gain 64 215 -115.74 gain 215 64 -111.28 gain 64 216 -131.90 gain 216 64 -132.10 gain 64 217 -121.50 gain 217 64 -122.22 gain 64 218 -126.17 gain 218 64 -129.08 gain 64 219 -129.08 gain 219 64 -123.36 gain 64 220 -121.36 gain 220 64 -126.12 gain 64 221 -129.77 gain 221 64 -130.18 gain 64 222 -129.36 gain 222 64 -130.09 gain 64 223 -127.14 gain 223 64 -126.48 gain 64 224 -122.66 gain 224 64 -124.69 gain 65 66 -105.61 gain 66 65 -99.87 gain 65 67 -103.69 gain 67 65 -100.22 gain 65 68 -108.85 gain 68 65 -109.94 gain 65 69 -110.55 gain 69 65 -108.93 gain 65 70 -118.28 gain 70 65 -116.41 gain 65 71 -119.73 gain 71 65 -115.97 gain 65 72 -123.39 gain 72 65 -120.05 gain 65 73 -125.32 gain 73 65 -120.37 gain 65 74 -129.63 gain 74 65 -128.56 gain 65 75 -118.13 gain 75 65 -117.19 gain 65 76 -116.02 gain 76 65 -111.04 gain 65 77 -117.80 gain 77 65 -116.49 gain 65 78 -107.21 gain 78 65 -108.74 gain 65 79 -100.98 gain 79 65 -97.29 gain 65 80 -92.36 gain 80 65 -89.17 gain 65 81 -103.20 gain 81 65 -100.60 gain 65 82 -110.25 gain 82 65 -105.29 gain 65 83 -112.07 gain 83 65 -108.13 gain 65 84 -116.54 gain 84 65 -112.76 gain 65 85 -112.82 gain 85 65 -105.84 gain 65 86 -119.47 gain 86 65 -115.87 gain 65 87 -122.12 gain 87 65 -122.49 gain 65 88 -126.92 gain 88 65 -125.03 gain 65 89 -123.94 gain 89 65 -120.65 gain 65 90 -116.41 gain 90 65 -110.14 gain 65 91 -113.48 gain 91 65 -111.14 gain 65 92 -106.39 gain 92 65 -101.02 gain 65 93 -107.50 gain 93 65 -106.92 gain 65 94 -105.14 gain 94 65 -104.43 gain 65 95 -100.54 gain 95 65 -102.08 gain 65 96 -104.79 gain 96 65 -103.67 gain 65 97 -110.36 gain 97 65 -107.99 gain 65 98 -109.66 gain 98 65 -108.09 gain 65 99 -107.51 gain 99 65 -103.76 gain 65 100 -119.53 gain 100 65 -115.34 gain 65 101 -123.00 gain 101 65 -118.97 gain 65 102 -121.52 gain 102 65 -118.28 gain 65 103 -126.06 gain 103 65 -120.30 gain 65 104 -126.93 gain 104 65 -126.55 gain 65 105 -123.57 gain 105 65 -119.12 gain 65 106 -112.61 gain 106 65 -109.25 gain 65 107 -108.78 gain 107 65 -111.99 gain 65 108 -110.61 gain 108 65 -106.14 gain 65 109 -104.95 gain 109 65 -103.96 gain 65 110 -108.06 gain 110 65 -105.55 gain 65 111 -112.54 gain 111 65 -109.70 gain 65 112 -118.71 gain 112 65 -114.75 gain 65 113 -113.26 gain 113 65 -108.11 gain 65 114 -116.87 gain 114 65 -115.02 gain 65 115 -123.94 gain 115 65 -116.39 gain 65 116 -122.99 gain 116 65 -122.99 gain 65 117 -123.93 gain 117 65 -125.43 gain 65 118 -127.76 gain 118 65 -127.58 gain 65 119 -131.75 gain 119 65 -126.23 gain 65 120 -122.80 gain 120 65 -121.80 gain 65 121 -115.32 gain 121 65 -113.61 gain 65 122 -115.96 gain 122 65 -116.36 gain 65 123 -122.39 gain 123 65 -123.57 gain 65 124 -120.43 gain 124 65 -118.02 gain 65 125 -111.24 gain 125 65 -110.17 gain 65 126 -118.91 gain 126 65 -115.79 gain 65 127 -114.21 gain 127 65 -114.55 gain 65 128 -121.58 gain 128 65 -119.86 gain 65 129 -121.04 gain 129 65 -117.23 gain 65 130 -125.89 gain 130 65 -119.90 gain 65 131 -125.23 gain 131 65 -126.33 gain 65 132 -126.55 gain 132 65 -127.28 gain 65 133 -128.61 gain 133 65 -127.40 gain 65 134 -124.61 gain 134 65 -120.11 gain 65 135 -121.00 gain 135 65 -120.07 gain 65 136 -113.43 gain 136 65 -113.10 gain 65 137 -119.01 gain 137 65 -116.17 gain 65 138 -123.13 gain 138 65 -119.29 gain 65 139 -121.57 gain 139 65 -118.71 gain 65 140 -120.86 gain 140 65 -120.62 gain 65 141 -115.08 gain 141 65 -113.50 gain 65 142 -114.12 gain 142 65 -111.85 gain 65 143 -117.63 gain 143 65 -114.97 gain 65 144 -125.49 gain 144 65 -123.85 gain 65 145 -126.12 gain 145 65 -122.93 gain 65 146 -123.33 gain 146 65 -119.05 gain 65 147 -124.06 gain 147 65 -116.87 gain 65 148 -120.18 gain 148 65 -112.71 gain 65 149 -124.32 gain 149 65 -120.02 gain 65 150 -124.68 gain 150 65 -123.06 gain 65 151 -120.77 gain 151 65 -119.35 gain 65 152 -119.73 gain 152 65 -115.28 gain 65 153 -117.51 gain 153 65 -110.65 gain 65 154 -115.43 gain 154 65 -117.11 gain 65 155 -120.53 gain 155 65 -122.11 gain 65 156 -118.43 gain 156 65 -114.39 gain 65 157 -124.43 gain 157 65 -123.34 gain 65 158 -123.58 gain 158 65 -125.08 gain 65 159 -123.99 gain 159 65 -122.12 gain 65 160 -123.28 gain 160 65 -118.51 gain 65 161 -118.33 gain 161 65 -117.05 gain 65 162 -119.42 gain 162 65 -117.01 gain 65 163 -128.55 gain 163 65 -128.29 gain 65 164 -127.81 gain 164 65 -128.59 gain 65 165 -123.23 gain 165 65 -120.05 gain 65 166 -126.15 gain 166 65 -124.54 gain 65 167 -121.42 gain 167 65 -121.90 gain 65 168 -123.02 gain 168 65 -121.95 gain 65 169 -118.96 gain 169 65 -122.08 gain 65 170 -126.01 gain 170 65 -120.66 gain 65 171 -120.47 gain 171 65 -120.15 gain 65 172 -119.72 gain 172 65 -114.10 gain 65 173 -121.84 gain 173 65 -115.66 gain 65 174 -126.60 gain 174 65 -124.71 gain 65 175 -126.02 gain 175 65 -127.68 gain 65 176 -124.96 gain 176 65 -118.63 gain 65 177 -130.38 gain 177 65 -131.86 gain 65 178 -119.85 gain 178 65 -117.16 gain 65 179 -121.27 gain 179 65 -116.97 gain 65 180 -131.88 gain 180 65 -129.05 gain 65 181 -124.58 gain 181 65 -121.82 gain 65 182 -130.35 gain 182 65 -129.97 gain 65 183 -122.72 gain 183 65 -115.73 gain 65 184 -127.04 gain 184 65 -124.83 gain 65 185 -124.40 gain 185 65 -119.69 gain 65 186 -118.69 gain 186 65 -114.25 gain 65 187 -119.45 gain 187 65 -117.55 gain 65 188 -127.86 gain 188 65 -129.23 gain 65 189 -130.66 gain 189 65 -129.54 gain 65 190 -124.34 gain 190 65 -120.23 gain 65 191 -137.39 gain 191 65 -134.37 gain 65 192 -117.89 gain 192 65 -117.74 gain 65 193 -130.19 gain 193 65 -131.30 gain 65 194 -127.61 gain 194 65 -122.52 gain 65 195 -125.17 gain 195 65 -120.72 gain 65 196 -128.36 gain 196 65 -127.95 gain 65 197 -129.63 gain 197 65 -125.28 gain 65 198 -125.23 gain 198 65 -120.40 gain 65 199 -119.17 gain 199 65 -118.26 gain 65 200 -123.25 gain 200 65 -119.28 gain 65 201 -123.37 gain 201 65 -120.20 gain 65 202 -123.35 gain 202 65 -124.18 gain 65 203 -127.23 gain 203 65 -127.68 gain 65 204 -122.52 gain 204 65 -120.25 gain 65 205 -128.27 gain 205 65 -125.08 gain 65 206 -123.55 gain 206 65 -124.88 gain 65 207 -133.55 gain 207 65 -127.24 gain 65 208 -131.99 gain 208 65 -131.46 gain 65 209 -135.27 gain 209 65 -135.73 gain 65 210 -124.88 gain 210 65 -122.27 gain 65 211 -126.01 gain 211 65 -125.43 gain 65 212 -129.68 gain 212 65 -127.64 gain 65 213 -130.48 gain 213 65 -127.63 gain 65 214 -127.54 gain 214 65 -124.58 gain 65 215 -132.31 gain 215 65 -125.77 gain 65 216 -126.24 gain 216 65 -124.36 gain 65 217 -123.28 gain 217 65 -121.92 gain 65 218 -127.45 gain 218 65 -128.28 gain 65 219 -131.42 gain 219 65 -123.60 gain 65 220 -123.77 gain 220 65 -126.45 gain 65 221 -126.87 gain 221 65 -125.19 gain 65 222 -128.87 gain 222 65 -127.51 gain 65 223 -140.23 gain 223 65 -137.49 gain 65 224 -127.71 gain 224 65 -127.65 gain 66 67 -91.41 gain 67 66 -93.68 gain 66 68 -102.27 gain 68 66 -109.11 gain 66 69 -102.76 gain 69 66 -106.89 gain 66 70 -108.02 gain 70 66 -111.91 gain 66 71 -107.87 gain 71 66 -109.86 gain 66 72 -112.50 gain 72 66 -114.90 gain 66 73 -114.74 gain 73 66 -115.54 gain 66 74 -124.82 gain 74 66 -129.50 gain 66 75 -120.45 gain 75 66 -125.27 gain 66 76 -113.69 gain 76 66 -114.46 gain 66 77 -107.52 gain 77 66 -111.95 gain 66 78 -104.13 gain 78 66 -111.41 gain 66 79 -105.29 gain 79 66 -107.35 gain 66 80 -93.05 gain 80 66 -95.61 gain 66 81 -83.88 gain 81 66 -87.03 gain 66 82 -99.86 gain 82 66 -100.64 gain 66 83 -96.08 gain 83 66 -97.89 gain 66 84 -108.43 gain 84 66 -110.39 gain 66 85 -111.74 gain 85 66 -110.50 gain 66 86 -118.67 gain 86 66 -120.82 gain 66 87 -116.61 gain 87 66 -122.72 gain 66 88 -118.56 gain 88 66 -122.42 gain 66 89 -116.92 gain 89 66 -119.39 gain 66 90 -110.11 gain 90 66 -109.58 gain 66 91 -111.51 gain 91 66 -114.92 gain 66 92 -113.26 gain 92 66 -113.63 gain 66 93 -115.30 gain 93 66 -120.46 gain 66 94 -103.12 gain 94 66 -108.16 gain 66 95 -102.63 gain 95 66 -109.93 gain 66 96 -90.74 gain 96 66 -95.37 gain 66 97 -100.94 gain 97 66 -104.32 gain 66 98 -106.27 gain 98 66 -110.45 gain 66 99 -111.21 gain 99 66 -113.21 gain 66 100 -110.63 gain 100 66 -112.19 gain 66 101 -102.02 gain 101 66 -103.74 gain 66 102 -121.41 gain 102 66 -123.92 gain 66 103 -115.00 gain 103 66 -114.99 gain 66 104 -118.89 gain 104 66 -124.26 gain 66 105 -118.03 gain 105 66 -119.34 gain 66 106 -114.94 gain 106 66 -117.33 gain 66 107 -118.87 gain 107 66 -127.83 gain 66 108 -106.61 gain 108 66 -107.89 gain 66 109 -105.59 gain 109 66 -110.36 gain 66 110 -104.54 gain 110 66 -107.77 gain 66 111 -101.65 gain 111 66 -104.56 gain 66 112 -97.31 gain 112 66 -99.10 gain 66 113 -103.50 gain 113 66 -104.10 gain 66 114 -105.78 gain 114 66 -109.68 gain 66 115 -114.98 gain 115 66 -113.18 gain 66 116 -108.86 gain 116 66 -114.61 gain 66 117 -114.63 gain 117 66 -121.88 gain 66 118 -112.83 gain 118 66 -118.39 gain 66 119 -118.01 gain 119 66 -118.24 gain 66 120 -122.05 gain 120 66 -126.79 gain 66 121 -113.61 gain 121 66 -117.65 gain 66 122 -112.96 gain 122 66 -119.11 gain 66 123 -110.30 gain 123 66 -117.22 gain 66 124 -105.72 gain 124 66 -109.06 gain 66 125 -108.33 gain 125 66 -113.01 gain 66 126 -108.36 gain 126 66 -110.98 gain 66 127 -107.55 gain 127 66 -113.64 gain 66 128 -107.85 gain 128 66 -111.87 gain 66 129 -112.02 gain 129 66 -113.95 gain 66 130 -111.43 gain 130 66 -111.18 gain 66 131 -114.58 gain 131 66 -121.42 gain 66 132 -110.11 gain 132 66 -116.58 gain 66 133 -117.62 gain 133 66 -122.16 gain 66 134 -119.19 gain 134 66 -120.43 gain 66 135 -118.04 gain 135 66 -122.85 gain 66 136 -115.46 gain 136 66 -120.88 gain 66 137 -108.93 gain 137 66 -111.83 gain 66 138 -118.82 gain 138 66 -120.73 gain 66 139 -107.93 gain 139 66 -110.82 gain 66 140 -110.82 gain 140 66 -116.31 gain 66 141 -114.61 gain 141 66 -118.78 gain 66 142 -106.01 gain 142 66 -109.48 gain 66 143 -106.81 gain 143 66 -109.90 gain 66 144 -110.43 gain 144 66 -114.54 gain 66 145 -114.34 gain 145 66 -116.90 gain 66 146 -115.80 gain 146 66 -117.27 gain 66 147 -128.04 gain 147 66 -126.59 gain 66 148 -116.61 gain 148 66 -114.89 gain 66 149 -118.67 gain 149 66 -120.11 gain 66 150 -118.27 gain 150 66 -122.40 gain 66 151 -122.16 gain 151 66 -126.49 gain 66 152 -113.90 gain 152 66 -115.20 gain 66 153 -116.58 gain 153 66 -115.46 gain 66 154 -116.94 gain 154 66 -124.37 gain 66 155 -116.64 gain 155 66 -123.97 gain 66 156 -109.17 gain 156 66 -110.88 gain 66 157 -113.59 gain 157 66 -118.25 gain 66 158 -113.47 gain 158 66 -120.73 gain 66 159 -115.34 gain 159 66 -119.21 gain 66 160 -113.07 gain 160 66 -114.05 gain 66 161 -117.03 gain 161 66 -121.51 gain 66 162 -119.42 gain 162 66 -122.76 gain 66 163 -115.09 gain 163 66 -120.58 gain 66 164 -126.94 gain 164 66 -133.47 gain 66 165 -121.85 gain 165 66 -124.42 gain 66 166 -121.06 gain 166 66 -125.19 gain 66 167 -118.54 gain 167 66 -124.76 gain 66 168 -116.82 gain 168 66 -121.50 gain 66 169 -116.44 gain 169 66 -125.31 gain 66 170 -118.96 gain 170 66 -119.36 gain 66 171 -119.98 gain 171 66 -125.41 gain 66 172 -116.58 gain 172 66 -116.71 gain 66 173 -110.81 gain 173 66 -110.37 gain 66 174 -118.28 gain 174 66 -122.13 gain 66 175 -119.74 gain 175 66 -127.15 gain 66 176 -119.44 gain 176 66 -118.86 gain 66 177 -114.61 gain 177 66 -121.84 gain 66 178 -124.25 gain 178 66 -127.31 gain 66 179 -126.38 gain 179 66 -127.82 gain 66 180 -126.03 gain 180 66 -128.95 gain 66 181 -119.05 gain 181 66 -122.03 gain 66 182 -123.86 gain 182 66 -129.23 gain 66 183 -113.98 gain 183 66 -112.74 gain 66 184 -120.63 gain 184 66 -124.17 gain 66 185 -114.07 gain 185 66 -115.09 gain 66 186 -108.16 gain 186 66 -109.48 gain 66 187 -114.69 gain 187 66 -118.54 gain 66 188 -121.70 gain 188 66 -128.81 gain 66 189 -118.09 gain 189 66 -122.72 gain 66 190 -117.90 gain 190 66 -119.53 gain 66 191 -124.05 gain 191 66 -126.78 gain 66 192 -117.75 gain 192 66 -123.35 gain 66 193 -117.28 gain 193 66 -124.12 gain 66 194 -114.84 gain 194 66 -115.50 gain 66 195 -124.43 gain 195 66 -125.72 gain 66 196 -118.14 gain 196 66 -123.47 gain 66 197 -124.78 gain 197 66 -126.18 gain 66 198 -120.12 gain 198 66 -121.03 gain 66 199 -123.96 gain 199 66 -128.79 gain 66 200 -116.54 gain 200 66 -118.31 gain 66 201 -122.42 gain 201 66 -124.99 gain 66 202 -115.91 gain 202 66 -122.49 gain 66 203 -116.06 gain 203 66 -122.26 gain 66 204 -129.18 gain 204 66 -132.66 gain 66 205 -117.77 gain 205 66 -120.33 gain 66 206 -118.92 gain 206 66 -126.00 gain 66 207 -123.98 gain 207 66 -123.42 gain 66 208 -122.37 gain 208 66 -127.59 gain 66 209 -128.91 gain 209 66 -135.12 gain 66 210 -118.19 gain 210 66 -121.33 gain 66 211 -114.92 gain 211 66 -120.09 gain 66 212 -127.31 gain 212 66 -131.02 gain 66 213 -123.44 gain 213 66 -126.34 gain 66 214 -118.77 gain 214 66 -121.56 gain 66 215 -119.15 gain 215 66 -118.35 gain 66 216 -126.72 gain 216 66 -130.58 gain 66 217 -124.92 gain 217 66 -129.30 gain 66 218 -116.90 gain 218 66 -123.48 gain 66 219 -124.72 gain 219 66 -122.66 gain 66 220 -122.02 gain 220 66 -130.44 gain 66 221 -115.99 gain 221 66 -120.06 gain 66 222 -124.74 gain 222 66 -129.13 gain 66 223 -123.70 gain 223 66 -126.70 gain 66 224 -124.39 gain 224 66 -130.08 gain 67 68 -86.47 gain 68 67 -91.03 gain 67 69 -100.79 gain 69 67 -102.64 gain 67 70 -99.47 gain 70 67 -101.08 gain 67 71 -111.45 gain 71 67 -111.17 gain 67 72 -119.80 gain 72 67 -119.93 gain 67 73 -118.79 gain 73 67 -117.31 gain 67 74 -122.81 gain 74 67 -125.21 gain 67 75 -118.15 gain 75 67 -120.69 gain 67 76 -116.55 gain 76 67 -115.04 gain 67 77 -107.69 gain 77 67 -109.85 gain 67 78 -103.66 gain 78 67 -108.66 gain 67 79 -113.60 gain 79 67 -113.38 gain 67 80 -101.23 gain 80 67 -101.52 gain 67 81 -99.39 gain 81 67 -100.26 gain 67 82 -85.43 gain 82 67 -83.94 gain 67 83 -97.09 gain 83 67 -96.63 gain 67 84 -111.45 gain 84 67 -111.13 gain 67 85 -109.36 gain 85 67 -105.85 gain 67 86 -107.43 gain 86 67 -107.31 gain 67 87 -108.17 gain 87 67 -112.01 gain 67 88 -108.32 gain 88 67 -109.91 gain 67 89 -117.95 gain 89 67 -118.14 gain 67 90 -120.01 gain 90 67 -117.21 gain 67 91 -123.40 gain 91 67 -124.54 gain 67 92 -114.56 gain 92 67 -112.66 gain 67 93 -118.75 gain 93 67 -121.63 gain 67 94 -111.05 gain 94 67 -113.81 gain 67 95 -105.18 gain 95 67 -110.20 gain 67 96 -106.38 gain 96 67 -108.74 gain 67 97 -100.57 gain 97 67 -101.67 gain 67 98 -106.89 gain 98 67 -108.79 gain 67 99 -99.59 gain 99 67 -99.31 gain 67 100 -109.28 gain 100 67 -108.56 gain 67 101 -118.81 gain 101 67 -118.26 gain 67 102 -113.66 gain 102 67 -113.89 gain 67 103 -118.33 gain 103 67 -116.05 gain 67 104 -123.16 gain 104 67 -126.25 gain 67 105 -124.16 gain 105 67 -123.20 gain 67 106 -115.78 gain 106 67 -115.89 gain 67 107 -107.67 gain 107 67 -114.35 gain 67 108 -114.15 gain 108 67 -113.15 gain 67 109 -116.45 gain 109 67 -118.94 gain 67 110 -116.57 gain 110 67 -117.53 gain 67 111 -103.87 gain 111 67 -104.51 gain 67 112 -106.25 gain 112 67 -105.77 gain 67 113 -112.89 gain 113 67 -111.22 gain 67 114 -113.79 gain 114 67 -115.42 gain 67 115 -105.51 gain 115 67 -101.44 gain 67 116 -114.14 gain 116 67 -117.61 gain 67 117 -119.12 gain 117 67 -124.09 gain 67 118 -113.88 gain 118 67 -117.18 gain 67 119 -120.62 gain 119 67 -118.58 gain 67 120 -118.68 gain 120 67 -121.15 gain 67 121 -119.70 gain 121 67 -121.46 gain 67 122 -124.49 gain 122 67 -128.36 gain 67 123 -113.74 gain 123 67 -118.39 gain 67 124 -111.61 gain 124 67 -112.67 gain 67 125 -112.47 gain 125 67 -114.86 gain 67 126 -119.11 gain 126 67 -119.46 gain 67 127 -113.66 gain 127 67 -117.47 gain 67 128 -109.11 gain 128 67 -110.86 gain 67 129 -121.10 gain 129 67 -120.76 gain 67 130 -111.17 gain 130 67 -108.65 gain 67 131 -111.12 gain 131 67 -115.69 gain 67 132 -115.76 gain 132 67 -119.95 gain 67 133 -118.44 gain 133 67 -120.71 gain 67 134 -117.91 gain 134 67 -116.87 gain 67 135 -121.84 gain 135 67 -124.38 gain 67 136 -119.07 gain 136 67 -122.22 gain 67 137 -118.07 gain 137 67 -118.70 gain 67 138 -119.09 gain 138 67 -118.72 gain 67 139 -112.80 gain 139 67 -113.42 gain 67 140 -110.28 gain 140 67 -113.50 gain 67 141 -126.01 gain 141 67 -127.91 gain 67 142 -110.07 gain 142 67 -111.27 gain 67 143 -111.62 gain 143 67 -112.44 gain 67 144 -111.41 gain 144 67 -113.24 gain 67 145 -111.02 gain 145 67 -111.31 gain 67 146 -115.46 gain 146 67 -114.65 gain 67 147 -117.25 gain 147 67 -113.54 gain 67 148 -119.70 gain 148 67 -115.70 gain 67 149 -116.80 gain 149 67 -115.97 gain 67 150 -118.26 gain 150 67 -120.11 gain 67 151 -118.29 gain 151 67 -120.35 gain 67 152 -113.76 gain 152 67 -112.79 gain 67 153 -117.42 gain 153 67 -114.03 gain 67 154 -120.47 gain 154 67 -125.63 gain 67 155 -115.50 gain 155 67 -120.55 gain 67 156 -115.90 gain 156 67 -115.34 gain 67 157 -116.70 gain 157 67 -119.08 gain 67 158 -112.43 gain 158 67 -117.41 gain 67 159 -118.52 gain 159 67 -120.11 gain 67 160 -119.30 gain 160 67 -118.01 gain 67 161 -123.88 gain 161 67 -126.07 gain 67 162 -118.25 gain 162 67 -119.31 gain 67 163 -113.50 gain 163 67 -116.71 gain 67 164 -123.06 gain 164 67 -127.31 gain 67 165 -118.74 gain 165 67 -119.04 gain 67 166 -115.82 gain 166 67 -117.68 gain 67 167 -120.10 gain 167 67 -124.05 gain 67 168 -120.18 gain 168 67 -122.58 gain 67 169 -115.52 gain 169 67 -122.12 gain 67 170 -118.59 gain 170 67 -116.72 gain 67 171 -122.98 gain 171 67 -126.14 gain 67 172 -120.99 gain 172 67 -118.84 gain 67 173 -116.45 gain 173 67 -113.73 gain 67 174 -116.02 gain 174 67 -117.60 gain 67 175 -118.39 gain 175 67 -123.52 gain 67 176 -115.90 gain 176 67 -113.04 gain 67 177 -120.36 gain 177 67 -125.32 gain 67 178 -119.14 gain 178 67 -119.92 gain 67 179 -121.54 gain 179 67 -120.71 gain 67 180 -118.05 gain 180 67 -118.69 gain 67 181 -127.40 gain 181 67 -128.11 gain 67 182 -126.62 gain 182 67 -129.72 gain 67 183 -120.60 gain 183 67 -117.09 gain 67 184 -125.86 gain 184 67 -127.12 gain 67 185 -115.06 gain 185 67 -113.82 gain 67 186 -120.79 gain 186 67 -119.83 gain 67 187 -123.01 gain 187 67 -124.59 gain 67 188 -115.58 gain 188 67 -120.42 gain 67 189 -118.14 gain 189 67 -120.50 gain 67 190 -117.57 gain 190 67 -116.94 gain 67 191 -124.11 gain 191 67 -124.57 gain 67 192 -121.75 gain 192 67 -125.07 gain 67 193 -121.87 gain 193 67 -126.44 gain 67 194 -126.67 gain 194 67 -125.05 gain 67 195 -124.38 gain 195 67 -123.40 gain 67 196 -127.35 gain 196 67 -130.41 gain 67 197 -120.73 gain 197 67 -119.85 gain 67 198 -117.63 gain 198 67 -116.27 gain 67 199 -117.17 gain 199 67 -119.73 gain 67 200 -117.23 gain 200 67 -116.73 gain 67 201 -123.78 gain 201 67 -124.08 gain 67 202 -117.87 gain 202 67 -122.17 gain 67 203 -119.30 gain 203 67 -123.22 gain 67 204 -116.89 gain 204 67 -118.10 gain 67 205 -132.13 gain 205 67 -132.42 gain 67 206 -121.31 gain 206 67 -126.11 gain 67 207 -123.92 gain 207 67 -121.08 gain 67 208 -128.00 gain 208 67 -130.94 gain 67 209 -123.39 gain 209 67 -127.32 gain 67 210 -136.67 gain 210 67 -137.54 gain 67 211 -127.12 gain 211 67 -130.01 gain 67 212 -124.38 gain 212 67 -125.81 gain 67 213 -122.63 gain 213 67 -123.25 gain 67 214 -117.87 gain 214 67 -118.39 gain 67 215 -116.35 gain 215 67 -113.28 gain 67 216 -123.85 gain 216 67 -125.44 gain 67 217 -119.83 gain 217 67 -121.94 gain 67 218 -123.13 gain 218 67 -127.43 gain 67 219 -118.72 gain 219 67 -114.38 gain 67 220 -126.98 gain 220 67 -133.13 gain 67 221 -122.13 gain 221 67 -123.92 gain 67 222 -129.13 gain 222 67 -131.24 gain 67 223 -123.67 gain 223 67 -124.39 gain 67 224 -116.14 gain 224 67 -119.56 gain 68 69 -96.03 gain 69 68 -93.32 gain 68 70 -102.50 gain 70 68 -99.55 gain 68 71 -117.86 gain 71 68 -113.01 gain 68 72 -120.89 gain 72 68 -116.46 gain 68 73 -119.94 gain 73 68 -113.91 gain 68 74 -112.38 gain 74 68 -110.22 gain 68 75 -123.40 gain 75 68 -121.38 gain 68 76 -118.15 gain 76 68 -112.08 gain 68 77 -122.73 gain 77 68 -120.33 gain 68 78 -114.92 gain 78 68 -115.37 gain 68 79 -114.04 gain 79 68 -109.27 gain 68 80 -119.70 gain 80 68 -115.43 gain 68 81 -103.23 gain 81 68 -99.54 gain 68 82 -104.54 gain 82 68 -98.48 gain 68 83 -90.17 gain 83 68 -85.15 gain 68 84 -97.09 gain 84 68 -92.22 gain 68 85 -106.89 gain 85 68 -98.83 gain 68 86 -118.12 gain 86 68 -113.44 gain 68 87 -112.64 gain 87 68 -111.92 gain 68 88 -109.86 gain 88 68 -106.89 gain 68 89 -128.31 gain 89 68 -123.94 gain 68 90 -124.29 gain 90 68 -116.93 gain 68 91 -113.14 gain 91 68 -109.72 gain 68 92 -120.09 gain 92 68 -113.64 gain 68 93 -113.59 gain 93 68 -111.92 gain 68 94 -113.10 gain 94 68 -111.30 gain 68 95 -118.19 gain 95 68 -118.65 gain 68 96 -102.00 gain 96 68 -99.80 gain 68 97 -105.26 gain 97 68 -101.80 gain 68 98 -99.47 gain 98 68 -96.81 gain 68 99 -107.71 gain 99 68 -102.87 gain 68 100 -111.66 gain 100 68 -106.39 gain 68 101 -113.21 gain 101 68 -108.10 gain 68 102 -111.63 gain 102 68 -107.30 gain 68 103 -116.01 gain 103 68 -109.17 gain 68 104 -122.18 gain 104 68 -120.71 gain 68 105 -127.75 gain 105 68 -122.22 gain 68 106 -117.95 gain 106 68 -113.50 gain 68 107 -122.09 gain 107 68 -124.22 gain 68 108 -127.36 gain 108 68 -121.80 gain 68 109 -115.39 gain 109 68 -113.32 gain 68 110 -113.18 gain 110 68 -109.58 gain 68 111 -104.80 gain 111 68 -100.88 gain 68 112 -113.25 gain 112 68 -108.21 gain 68 113 -112.25 gain 113 68 -106.02 gain 68 114 -109.59 gain 114 68 -106.66 gain 68 115 -116.66 gain 115 68 -108.03 gain 68 116 -120.38 gain 116 68 -119.29 gain 68 117 -117.55 gain 117 68 -117.96 gain 68 118 -114.74 gain 118 68 -113.48 gain 68 119 -124.92 gain 119 68 -118.32 gain 68 120 -134.27 gain 120 68 -132.18 gain 68 121 -127.36 gain 121 68 -124.56 gain 68 122 -128.13 gain 122 68 -127.44 gain 68 123 -120.62 gain 123 68 -120.72 gain 68 124 -115.01 gain 124 68 -111.51 gain 68 125 -123.43 gain 125 68 -121.26 gain 68 126 -115.67 gain 126 68 -111.46 gain 68 127 -118.23 gain 127 68 -117.49 gain 68 128 -119.14 gain 128 68 -116.33 gain 68 129 -114.04 gain 129 68 -109.14 gain 68 130 -106.14 gain 130 68 -99.07 gain 68 131 -122.62 gain 131 68 -122.63 gain 68 132 -117.97 gain 132 68 -117.60 gain 68 133 -121.04 gain 133 68 -118.75 gain 68 134 -119.63 gain 134 68 -114.04 gain 68 135 -130.44 gain 135 68 -128.42 gain 68 136 -125.42 gain 136 68 -124.01 gain 68 137 -123.75 gain 137 68 -119.82 gain 68 138 -124.37 gain 138 68 -119.44 gain 68 139 -118.13 gain 139 68 -114.19 gain 68 140 -117.02 gain 140 68 -115.68 gain 68 141 -124.37 gain 141 68 -121.70 gain 68 142 -115.01 gain 142 68 -111.66 gain 68 143 -114.31 gain 143 68 -110.57 gain 68 144 -119.80 gain 144 68 -117.08 gain 68 145 -119.72 gain 145 68 -115.45 gain 68 146 -121.34 gain 146 68 -115.97 gain 68 147 -125.88 gain 147 68 -117.60 gain 68 148 -115.75 gain 148 68 -107.19 gain 68 149 -125.91 gain 149 68 -120.52 gain 68 150 -126.33 gain 150 68 -123.63 gain 68 151 -122.09 gain 151 68 -119.58 gain 68 152 -122.60 gain 152 68 -117.07 gain 68 153 -119.00 gain 153 68 -111.04 gain 68 154 -131.27 gain 154 68 -131.86 gain 68 155 -118.57 gain 155 68 -119.06 gain 68 156 -125.68 gain 156 68 -120.56 gain 68 157 -128.76 gain 157 68 -126.58 gain 68 158 -112.66 gain 158 68 -113.08 gain 68 159 -118.75 gain 159 68 -115.78 gain 68 160 -116.39 gain 160 68 -110.53 gain 68 161 -124.76 gain 161 68 -122.39 gain 68 162 -123.85 gain 162 68 -120.35 gain 68 163 -124.90 gain 163 68 -123.55 gain 68 164 -120.53 gain 164 68 -120.22 gain 68 165 -130.24 gain 165 68 -125.98 gain 68 166 -132.31 gain 166 68 -129.62 gain 68 167 -125.80 gain 167 68 -125.19 gain 68 168 -121.35 gain 168 68 -119.20 gain 68 169 -119.80 gain 169 68 -121.84 gain 68 170 -130.11 gain 170 68 -123.68 gain 68 171 -120.85 gain 171 68 -119.44 gain 68 172 -118.66 gain 172 68 -111.95 gain 68 173 -119.33 gain 173 68 -112.06 gain 68 174 -119.46 gain 174 68 -116.48 gain 68 175 -120.66 gain 175 68 -121.24 gain 68 176 -121.33 gain 176 68 -113.92 gain 68 177 -129.09 gain 177 68 -129.49 gain 68 178 -123.56 gain 178 68 -119.78 gain 68 179 -124.24 gain 179 68 -118.86 gain 68 180 -135.43 gain 180 68 -131.52 gain 68 181 -131.52 gain 181 68 -127.67 gain 68 182 -127.82 gain 182 68 -126.36 gain 68 183 -131.27 gain 183 68 -123.20 gain 68 184 -123.62 gain 184 68 -120.33 gain 68 185 -130.72 gain 185 68 -124.91 gain 68 186 -121.54 gain 186 68 -116.02 gain 68 187 -123.38 gain 187 68 -120.40 gain 68 188 -132.46 gain 188 68 -132.74 gain 68 189 -124.95 gain 189 68 -122.75 gain 68 190 -117.43 gain 190 68 -112.23 gain 68 191 -137.09 gain 191 68 -132.99 gain 68 192 -126.40 gain 192 68 -125.16 gain 68 193 -130.58 gain 193 68 -130.60 gain 68 194 -130.76 gain 194 68 -124.58 gain 68 195 -124.23 gain 195 68 -118.69 gain 68 196 -128.89 gain 196 68 -127.39 gain 68 197 -127.75 gain 197 68 -122.31 gain 68 198 -127.72 gain 198 68 -121.81 gain 68 199 -122.33 gain 199 68 -120.32 gain 68 200 -122.18 gain 200 68 -117.12 gain 68 201 -124.10 gain 201 68 -119.84 gain 68 202 -131.64 gain 202 68 -131.38 gain 68 203 -123.57 gain 203 68 -122.93 gain 68 204 -128.33 gain 204 68 -124.98 gain 68 205 -122.78 gain 205 68 -118.51 gain 68 206 -125.47 gain 206 68 -125.71 gain 68 207 -127.49 gain 207 68 -120.09 gain 68 208 -123.33 gain 208 68 -121.71 gain 68 209 -133.86 gain 209 68 -133.23 gain 68 210 -131.70 gain 210 68 -128.01 gain 68 211 -132.66 gain 211 68 -130.99 gain 68 212 -135.81 gain 212 68 -132.68 gain 68 213 -119.53 gain 213 68 -115.60 gain 68 214 -129.45 gain 214 68 -125.40 gain 68 215 -130.10 gain 215 68 -122.47 gain 68 216 -129.98 gain 216 68 -127.01 gain 68 217 -127.01 gain 217 68 -124.56 gain 68 218 -127.81 gain 218 68 -127.55 gain 68 219 -128.92 gain 219 68 -120.02 gain 68 220 -128.86 gain 220 68 -130.45 gain 68 221 -128.72 gain 221 68 -125.95 gain 68 222 -121.68 gain 222 68 -119.24 gain 68 223 -123.75 gain 223 68 -119.92 gain 68 224 -129.08 gain 224 68 -127.93 gain 69 70 -97.32 gain 70 69 -97.08 gain 69 71 -101.41 gain 71 69 -99.27 gain 69 72 -109.63 gain 72 69 -107.91 gain 69 73 -112.88 gain 73 69 -109.55 gain 69 74 -119.76 gain 74 69 -120.31 gain 69 75 -121.50 gain 75 69 -122.18 gain 69 76 -121.16 gain 76 69 -117.80 gain 69 77 -116.95 gain 77 69 -117.25 gain 69 78 -121.19 gain 78 69 -124.34 gain 69 79 -111.82 gain 79 69 -109.76 gain 69 80 -110.35 gain 80 69 -108.78 gain 69 81 -102.93 gain 81 69 -101.96 gain 69 82 -107.23 gain 82 69 -103.88 gain 69 83 -97.23 gain 83 69 -94.92 gain 69 84 -97.62 gain 84 69 -95.45 gain 69 85 -101.45 gain 85 69 -96.09 gain 69 86 -106.83 gain 86 69 -104.85 gain 69 87 -107.76 gain 87 69 -109.75 gain 69 88 -115.57 gain 88 69 -115.31 gain 69 89 -110.45 gain 89 69 -108.79 gain 69 90 -129.50 gain 90 69 -124.85 gain 69 91 -122.18 gain 91 69 -121.47 gain 69 92 -117.55 gain 92 69 -113.80 gain 69 93 -120.48 gain 93 69 -121.51 gain 69 94 -116.72 gain 94 69 -117.64 gain 69 95 -113.29 gain 95 69 -116.46 gain 69 96 -110.04 gain 96 69 -110.54 gain 69 97 -103.14 gain 97 69 -102.39 gain 69 98 -99.60 gain 98 69 -99.65 gain 69 99 -93.57 gain 99 69 -91.44 gain 69 100 -108.93 gain 100 69 -106.36 gain 69 101 -106.60 gain 101 69 -104.19 gain 69 102 -109.42 gain 102 69 -107.80 gain 69 103 -110.35 gain 103 69 -106.21 gain 69 104 -113.21 gain 104 69 -114.45 gain 69 105 -129.14 gain 105 69 -126.32 gain 69 106 -118.43 gain 106 69 -116.69 gain 69 107 -122.24 gain 107 69 -127.07 gain 69 108 -116.14 gain 108 69 -113.29 gain 69 109 -118.78 gain 109 69 -119.42 gain 69 110 -116.87 gain 110 69 -115.97 gain 69 111 -115.69 gain 111 69 -114.47 gain 69 112 -114.22 gain 112 69 -111.88 gain 69 113 -115.80 gain 113 69 -112.27 gain 69 114 -104.98 gain 114 69 -104.75 gain 69 115 -112.94 gain 115 69 -107.01 gain 69 116 -110.68 gain 116 69 -112.30 gain 69 117 -112.68 gain 117 69 -115.80 gain 69 118 -111.22 gain 118 69 -112.66 gain 69 119 -117.44 gain 119 69 -113.54 gain 69 120 -127.34 gain 120 69 -127.95 gain 69 121 -123.90 gain 121 69 -123.81 gain 69 122 -114.76 gain 122 69 -116.78 gain 69 123 -126.46 gain 123 69 -129.26 gain 69 124 -119.82 gain 124 69 -119.03 gain 69 125 -122.24 gain 125 69 -122.78 gain 69 126 -118.37 gain 126 69 -116.87 gain 69 127 -114.03 gain 127 69 -115.99 gain 69 128 -110.97 gain 128 69 -110.87 gain 69 129 -115.48 gain 129 69 -113.28 gain 69 130 -119.85 gain 130 69 -115.49 gain 69 131 -111.18 gain 131 69 -113.89 gain 69 132 -110.83 gain 132 69 -113.18 gain 69 133 -116.46 gain 133 69 -116.88 gain 69 134 -120.99 gain 134 69 -118.10 gain 69 135 -128.43 gain 135 69 -129.11 gain 69 136 -122.27 gain 136 69 -123.56 gain 69 137 -126.31 gain 137 69 -125.09 gain 69 138 -116.76 gain 138 69 -114.53 gain 69 139 -117.97 gain 139 69 -116.73 gain 69 140 -118.65 gain 140 69 -120.02 gain 69 141 -116.11 gain 141 69 -116.15 gain 69 142 -114.91 gain 142 69 -114.26 gain 69 143 -119.87 gain 143 69 -118.84 gain 69 144 -119.78 gain 144 69 -119.77 gain 69 145 -104.86 gain 145 69 -103.30 gain 69 146 -121.27 gain 146 69 -118.62 gain 69 147 -123.28 gain 147 69 -117.72 gain 69 148 -114.03 gain 148 69 -108.18 gain 69 149 -120.32 gain 149 69 -117.64 gain 69 150 -127.66 gain 150 69 -127.67 gain 69 151 -124.15 gain 151 69 -124.35 gain 69 152 -124.72 gain 152 69 -121.90 gain 69 153 -128.66 gain 153 69 -123.41 gain 69 154 -117.13 gain 154 69 -120.44 gain 69 155 -121.33 gain 155 69 -124.53 gain 69 156 -117.30 gain 156 69 -114.89 gain 69 157 -111.12 gain 157 69 -111.65 gain 69 158 -113.69 gain 158 69 -116.82 gain 69 159 -117.94 gain 159 69 -117.68 gain 69 160 -117.33 gain 160 69 -114.19 gain 69 161 -118.22 gain 161 69 -118.56 gain 69 162 -117.21 gain 162 69 -116.42 gain 69 163 -117.94 gain 163 69 -119.30 gain 69 164 -114.10 gain 164 69 -116.50 gain 69 165 -122.91 gain 165 69 -121.35 gain 69 166 -124.09 gain 166 69 -124.10 gain 69 167 -122.33 gain 167 69 -124.43 gain 69 168 -117.81 gain 168 69 -118.36 gain 69 169 -126.58 gain 169 69 -131.33 gain 69 170 -121.95 gain 170 69 -118.23 gain 69 171 -114.34 gain 171 69 -115.64 gain 69 172 -122.25 gain 172 69 -118.25 gain 69 173 -122.60 gain 173 69 -118.03 gain 69 174 -130.16 gain 174 69 -129.89 gain 69 175 -114.99 gain 175 69 -118.27 gain 69 176 -118.65 gain 176 69 -113.94 gain 69 177 -121.02 gain 177 69 -124.12 gain 69 178 -120.44 gain 178 69 -119.38 gain 69 179 -119.60 gain 179 69 -116.92 gain 69 180 -134.49 gain 180 69 -133.28 gain 69 181 -126.10 gain 181 69 -124.96 gain 69 182 -125.02 gain 182 69 -126.27 gain 69 183 -118.58 gain 183 69 -113.21 gain 69 184 -117.51 gain 184 69 -116.93 gain 69 185 -116.93 gain 185 69 -113.84 gain 69 186 -122.29 gain 186 69 -119.48 gain 69 187 -118.47 gain 187 69 -118.19 gain 69 188 -122.92 gain 188 69 -125.91 gain 69 189 -128.35 gain 189 69 -128.86 gain 69 190 -125.39 gain 190 69 -122.90 gain 69 191 -119.21 gain 191 69 -117.81 gain 69 192 -121.82 gain 192 69 -123.29 gain 69 193 -117.15 gain 193 69 -119.87 gain 69 194 -120.14 gain 194 69 -116.67 gain 69 195 -125.92 gain 195 69 -123.08 gain 69 196 -126.72 gain 196 69 -127.93 gain 69 197 -127.60 gain 197 69 -124.87 gain 69 198 -122.85 gain 198 69 -119.64 gain 69 199 -123.41 gain 199 69 -124.12 gain 69 200 -121.30 gain 200 69 -118.95 gain 69 201 -129.27 gain 201 69 -127.72 gain 69 202 -128.58 gain 202 69 -131.03 gain 69 203 -111.10 gain 203 69 -113.17 gain 69 204 -121.68 gain 204 69 -121.04 gain 69 205 -125.68 gain 205 69 -124.11 gain 69 206 -121.40 gain 206 69 -124.35 gain 69 207 -124.14 gain 207 69 -119.45 gain 69 208 -116.17 gain 208 69 -117.26 gain 69 209 -129.64 gain 209 69 -131.72 gain 69 210 -130.42 gain 210 69 -129.44 gain 69 211 -131.27 gain 211 69 -132.31 gain 69 212 -123.72 gain 212 69 -123.30 gain 69 213 -130.35 gain 213 69 -129.12 gain 69 214 -125.92 gain 214 69 -124.58 gain 69 215 -119.67 gain 215 69 -114.74 gain 69 216 -121.06 gain 216 69 -120.80 gain 69 217 -126.46 gain 217 69 -126.72 gain 69 218 -127.43 gain 218 69 -129.88 gain 69 219 -123.72 gain 219 69 -117.52 gain 69 220 -123.97 gain 220 69 -128.27 gain 69 221 -125.30 gain 221 69 -125.23 gain 69 222 -126.44 gain 222 69 -126.70 gain 69 223 -120.81 gain 223 69 -119.69 gain 69 224 -123.68 gain 224 69 -125.24 gain 70 71 -88.26 gain 71 70 -86.36 gain 70 72 -102.89 gain 72 70 -101.42 gain 70 73 -110.69 gain 73 70 -107.61 gain 70 74 -108.98 gain 74 70 -109.77 gain 70 75 -126.12 gain 75 70 -127.05 gain 70 76 -120.51 gain 76 70 -117.39 gain 70 77 -123.08 gain 77 70 -123.62 gain 70 78 -120.90 gain 78 70 -124.29 gain 70 79 -122.31 gain 79 70 -120.48 gain 70 80 -117.59 gain 80 70 -116.26 gain 70 81 -112.88 gain 81 70 -112.14 gain 70 82 -99.46 gain 82 70 -96.36 gain 70 83 -98.22 gain 83 70 -96.15 gain 70 84 -100.61 gain 84 70 -98.69 gain 70 85 -95.70 gain 85 70 -90.58 gain 70 86 -99.46 gain 86 70 -97.72 gain 70 87 -107.98 gain 87 70 -110.21 gain 70 88 -110.54 gain 88 70 -110.52 gain 70 89 -117.31 gain 89 70 -115.89 gain 70 90 -124.71 gain 90 70 -120.29 gain 70 91 -128.97 gain 91 70 -128.51 gain 70 92 -124.60 gain 92 70 -121.10 gain 70 93 -121.00 gain 93 70 -122.28 gain 70 94 -129.48 gain 94 70 -130.64 gain 70 95 -121.15 gain 95 70 -124.56 gain 70 96 -117.20 gain 96 70 -117.95 gain 70 97 -109.22 gain 97 70 -108.72 gain 70 98 -103.02 gain 98 70 -103.31 gain 70 99 -105.97 gain 99 70 -104.08 gain 70 100 -100.18 gain 100 70 -97.86 gain 70 101 -102.58 gain 101 70 -100.42 gain 70 102 -104.38 gain 102 70 -103.00 gain 70 103 -113.06 gain 103 70 -109.16 gain 70 104 -115.64 gain 104 70 -117.12 gain 70 105 -121.98 gain 105 70 -119.40 gain 70 106 -122.02 gain 106 70 -120.52 gain 70 107 -118.13 gain 107 70 -123.20 gain 70 108 -113.89 gain 108 70 -111.28 gain 70 109 -122.63 gain 109 70 -123.51 gain 70 110 -114.59 gain 110 70 -113.94 gain 70 111 -113.06 gain 111 70 -112.08 gain 70 112 -114.60 gain 112 70 -112.51 gain 70 113 -106.15 gain 113 70 -102.87 gain 70 114 -112.65 gain 114 70 -112.67 gain 70 115 -114.17 gain 115 70 -108.49 gain 70 116 -99.04 gain 116 70 -100.90 gain 70 117 -116.06 gain 117 70 -119.42 gain 70 118 -113.46 gain 118 70 -115.15 gain 70 119 -111.29 gain 119 70 -107.63 gain 70 120 -127.33 gain 120 70 -128.20 gain 70 121 -129.00 gain 121 70 -129.15 gain 70 122 -120.28 gain 122 70 -122.55 gain 70 123 -120.10 gain 123 70 -123.14 gain 70 124 -118.08 gain 124 70 -117.53 gain 70 125 -123.07 gain 125 70 -123.86 gain 70 126 -116.32 gain 126 70 -115.06 gain 70 127 -118.07 gain 127 70 -120.28 gain 70 128 -111.52 gain 128 70 -111.66 gain 70 129 -114.86 gain 129 70 -112.91 gain 70 130 -114.30 gain 130 70 -110.18 gain 70 131 -116.35 gain 131 70 -119.31 gain 70 132 -115.63 gain 132 70 -118.21 gain 70 133 -118.19 gain 133 70 -118.85 gain 70 134 -105.56 gain 134 70 -102.92 gain 70 135 -124.05 gain 135 70 -124.98 gain 70 136 -126.33 gain 136 70 -127.87 gain 70 137 -118.12 gain 137 70 -117.14 gain 70 138 -121.06 gain 138 70 -119.08 gain 70 139 -119.30 gain 139 70 -118.31 gain 70 140 -120.10 gain 140 70 -121.72 gain 70 141 -120.79 gain 141 70 -121.08 gain 70 142 -118.78 gain 142 70 -118.37 gain 70 143 -115.62 gain 143 70 -114.83 gain 70 144 -115.46 gain 144 70 -115.68 gain 70 145 -112.36 gain 145 70 -111.04 gain 70 146 -109.29 gain 146 70 -106.88 gain 70 147 -116.16 gain 147 70 -110.84 gain 70 148 -113.37 gain 148 70 -107.76 gain 70 149 -120.54 gain 149 70 -118.10 gain 70 150 -126.07 gain 150 70 -126.32 gain 70 151 -126.92 gain 151 70 -127.36 gain 70 152 -128.04 gain 152 70 -125.46 gain 70 153 -116.99 gain 153 70 -111.99 gain 70 154 -120.71 gain 154 70 -124.26 gain 70 155 -123.36 gain 155 70 -126.80 gain 70 156 -112.55 gain 156 70 -110.38 gain 70 157 -118.26 gain 157 70 -119.04 gain 70 158 -119.23 gain 158 70 -122.60 gain 70 159 -118.34 gain 159 70 -118.33 gain 70 160 -115.54 gain 160 70 -112.64 gain 70 161 -118.17 gain 161 70 -118.75 gain 70 162 -120.94 gain 162 70 -120.39 gain 70 163 -121.29 gain 163 70 -122.90 gain 70 164 -125.05 gain 164 70 -127.69 gain 70 165 -120.98 gain 165 70 -119.67 gain 70 166 -128.56 gain 166 70 -128.81 gain 70 167 -117.59 gain 167 70 -119.93 gain 70 168 -124.23 gain 168 70 -125.03 gain 70 169 -126.83 gain 169 70 -131.82 gain 70 170 -127.79 gain 170 70 -124.31 gain 70 171 -118.03 gain 171 70 -119.57 gain 70 172 -117.73 gain 172 70 -113.97 gain 70 173 -124.45 gain 173 70 -120.13 gain 70 174 -119.26 gain 174 70 -119.23 gain 70 175 -124.01 gain 175 70 -127.54 gain 70 176 -114.72 gain 176 70 -110.26 gain 70 177 -114.47 gain 177 70 -117.82 gain 70 178 -117.59 gain 178 70 -116.77 gain 70 179 -120.17 gain 179 70 -117.74 gain 70 180 -125.74 gain 180 70 -124.77 gain 70 181 -131.73 gain 181 70 -130.83 gain 70 182 -128.97 gain 182 70 -130.46 gain 70 183 -128.43 gain 183 70 -123.31 gain 70 184 -128.77 gain 184 70 -128.43 gain 70 185 -127.95 gain 185 70 -125.09 gain 70 186 -118.91 gain 186 70 -116.34 gain 70 187 -117.07 gain 187 70 -117.04 gain 70 188 -123.42 gain 188 70 -126.65 gain 70 189 -120.95 gain 189 70 -121.69 gain 70 190 -111.12 gain 190 70 -108.88 gain 70 191 -119.74 gain 191 70 -118.59 gain 70 192 -118.85 gain 192 70 -120.56 gain 70 193 -123.53 gain 193 70 -126.50 gain 70 194 -125.19 gain 194 70 -121.96 gain 70 195 -129.44 gain 195 70 -126.85 gain 70 196 -123.28 gain 196 70 -124.73 gain 70 197 -125.31 gain 197 70 -122.82 gain 70 198 -125.25 gain 198 70 -122.28 gain 70 199 -121.49 gain 199 70 -122.44 gain 70 200 -119.25 gain 200 70 -117.14 gain 70 201 -128.69 gain 201 70 -127.38 gain 70 202 -125.04 gain 202 70 -127.74 gain 70 203 -117.19 gain 203 70 -119.50 gain 70 204 -121.97 gain 204 70 -121.57 gain 70 205 -132.56 gain 205 70 -131.23 gain 70 206 -118.02 gain 206 70 -121.21 gain 70 207 -118.87 gain 207 70 -114.43 gain 70 208 -121.65 gain 208 70 -122.98 gain 70 209 -125.83 gain 209 70 -128.15 gain 70 210 -128.16 gain 210 70 -127.42 gain 70 211 -129.11 gain 211 70 -130.39 gain 70 212 -132.13 gain 212 70 -131.95 gain 70 213 -124.59 gain 213 70 -123.61 gain 70 214 -124.88 gain 214 70 -123.79 gain 70 215 -127.67 gain 215 70 -122.99 gain 70 216 -136.25 gain 216 70 -136.23 gain 70 217 -121.46 gain 217 70 -121.96 gain 70 218 -124.25 gain 218 70 -126.94 gain 70 219 -124.79 gain 219 70 -118.84 gain 70 220 -127.15 gain 220 70 -131.69 gain 70 221 -124.65 gain 221 70 -124.84 gain 70 222 -126.31 gain 222 70 -126.81 gain 70 223 -128.29 gain 223 70 -127.41 gain 70 224 -124.50 gain 224 70 -126.31 gain 71 72 -97.65 gain 72 71 -98.07 gain 71 73 -97.62 gain 73 71 -96.43 gain 71 74 -103.84 gain 74 71 -106.53 gain 71 75 -130.45 gain 75 71 -133.27 gain 71 76 -124.47 gain 76 71 -123.25 gain 71 77 -115.23 gain 77 71 -117.67 gain 71 78 -114.36 gain 78 71 -119.65 gain 71 79 -116.74 gain 79 71 -116.81 gain 71 80 -119.09 gain 80 71 -119.67 gain 71 81 -116.45 gain 81 71 -117.61 gain 71 82 -109.06 gain 82 71 -107.85 gain 71 83 -104.07 gain 83 71 -103.89 gain 71 84 -100.45 gain 84 71 -100.42 gain 71 85 -104.74 gain 85 71 -101.52 gain 71 86 -89.12 gain 86 71 -89.28 gain 71 87 -95.07 gain 87 71 -99.20 gain 71 88 -104.24 gain 88 71 -106.11 gain 71 89 -106.96 gain 89 71 -107.44 gain 71 90 -129.63 gain 90 71 -127.11 gain 71 91 -118.74 gain 91 71 -120.17 gain 71 92 -122.74 gain 92 71 -121.13 gain 71 93 -118.82 gain 93 71 -121.99 gain 71 94 -115.94 gain 94 71 -118.99 gain 71 95 -112.88 gain 95 71 -118.18 gain 71 96 -110.13 gain 96 71 -112.77 gain 71 97 -113.42 gain 97 71 -114.80 gain 71 98 -114.77 gain 98 71 -116.96 gain 71 99 -100.28 gain 99 71 -100.29 gain 71 100 -101.76 gain 100 71 -101.33 gain 71 101 -104.33 gain 101 71 -104.06 gain 71 102 -104.91 gain 102 71 -105.42 gain 71 103 -103.48 gain 103 71 -101.48 gain 71 104 -110.24 gain 104 71 -113.62 gain 71 105 -131.61 gain 105 71 -130.92 gain 71 106 -121.90 gain 106 71 -122.30 gain 71 107 -120.09 gain 107 71 -127.06 gain 71 108 -118.18 gain 108 71 -117.47 gain 71 109 -122.07 gain 109 71 -124.84 gain 71 110 -116.44 gain 110 71 -117.69 gain 71 111 -128.55 gain 111 71 -129.47 gain 71 112 -109.92 gain 112 71 -109.72 gain 71 113 -105.85 gain 113 71 -104.46 gain 71 114 -102.13 gain 114 71 -104.04 gain 71 115 -100.95 gain 115 71 -97.16 gain 71 116 -102.29 gain 116 71 -106.05 gain 71 117 -106.50 gain 117 71 -111.76 gain 71 118 -111.95 gain 118 71 -115.52 gain 71 119 -118.05 gain 119 71 -116.29 gain 71 120 -129.38 gain 120 71 -132.14 gain 71 121 -121.63 gain 121 71 -123.67 gain 71 122 -122.22 gain 122 71 -126.38 gain 71 123 -121.16 gain 123 71 -126.10 gain 71 124 -114.74 gain 124 71 -116.08 gain 71 125 -119.92 gain 125 71 -122.60 gain 71 126 -119.57 gain 126 71 -120.20 gain 71 127 -117.20 gain 127 71 -121.30 gain 71 128 -113.01 gain 128 71 -115.05 gain 71 129 -109.71 gain 129 71 -109.66 gain 71 130 -108.27 gain 130 71 -106.03 gain 71 131 -109.41 gain 131 71 -114.26 gain 71 132 -113.29 gain 132 71 -117.77 gain 71 133 -109.49 gain 133 71 -112.04 gain 71 134 -116.20 gain 134 71 -115.45 gain 71 135 -126.14 gain 135 71 -128.96 gain 71 136 -121.73 gain 136 71 -125.16 gain 71 137 -126.82 gain 137 71 -127.73 gain 71 138 -117.53 gain 138 71 -117.44 gain 71 139 -116.26 gain 139 71 -117.16 gain 71 140 -124.77 gain 140 71 -128.28 gain 71 141 -117.70 gain 141 71 -119.89 gain 71 142 -120.87 gain 142 71 -122.35 gain 71 143 -121.83 gain 143 71 -122.93 gain 71 144 -109.73 gain 144 71 -111.85 gain 71 145 -115.63 gain 145 71 -116.20 gain 71 146 -124.60 gain 146 71 -124.08 gain 71 147 -110.48 gain 147 71 -107.05 gain 71 148 -115.25 gain 148 71 -111.53 gain 71 149 -115.06 gain 149 71 -114.51 gain 71 150 -122.25 gain 150 71 -124.39 gain 71 151 -123.82 gain 151 71 -126.16 gain 71 152 -124.58 gain 152 71 -123.89 gain 71 153 -133.09 gain 153 71 -129.99 gain 71 154 -119.72 gain 154 71 -125.16 gain 71 155 -119.39 gain 155 71 -124.73 gain 71 156 -113.62 gain 156 71 -113.34 gain 71 157 -110.00 gain 157 71 -112.67 gain 71 158 -118.25 gain 158 71 -123.51 gain 71 159 -113.30 gain 159 71 -115.18 gain 71 160 -115.38 gain 160 71 -114.37 gain 71 161 -113.54 gain 161 71 -116.03 gain 71 162 -118.94 gain 162 71 -120.29 gain 71 163 -116.74 gain 163 71 -120.24 gain 71 164 -118.97 gain 164 71 -123.51 gain 71 165 -123.61 gain 165 71 -124.18 gain 71 166 -125.50 gain 166 71 -127.65 gain 71 167 -123.87 gain 167 71 -128.11 gain 71 168 -120.91 gain 168 71 -123.60 gain 71 169 -124.52 gain 169 71 -131.41 gain 71 170 -124.26 gain 170 71 -122.68 gain 71 171 -116.11 gain 171 71 -119.55 gain 71 172 -121.07 gain 172 71 -119.21 gain 71 173 -118.47 gain 173 71 -116.04 gain 71 174 -117.78 gain 174 71 -119.65 gain 71 175 -122.63 gain 175 71 -128.05 gain 71 176 -122.75 gain 176 71 -120.18 gain 71 177 -113.32 gain 177 71 -118.57 gain 71 178 -113.89 gain 178 71 -114.96 gain 71 179 -124.16 gain 179 71 -123.62 gain 71 180 -126.48 gain 180 71 -127.41 gain 71 181 -126.65 gain 181 71 -127.65 gain 71 182 -124.72 gain 182 71 -128.10 gain 71 183 -118.22 gain 183 71 -115.00 gain 71 184 -126.76 gain 184 71 -128.31 gain 71 185 -126.12 gain 185 71 -125.16 gain 71 186 -117.97 gain 186 71 -117.29 gain 71 187 -121.88 gain 187 71 -123.74 gain 71 188 -119.78 gain 188 71 -124.90 gain 71 189 -113.42 gain 189 71 -116.06 gain 71 190 -120.44 gain 190 71 -120.09 gain 71 191 -124.18 gain 191 71 -124.92 gain 71 192 -121.06 gain 192 71 -124.67 gain 71 193 -114.77 gain 193 71 -119.63 gain 71 194 -128.73 gain 194 71 -127.40 gain 71 195 -131.18 gain 195 71 -130.48 gain 71 196 -127.15 gain 196 71 -130.49 gain 71 197 -120.53 gain 197 71 -119.94 gain 71 198 -125.44 gain 198 71 -124.37 gain 71 199 -127.98 gain 199 71 -130.82 gain 71 200 -125.61 gain 200 71 -125.39 gain 71 201 -115.26 gain 201 71 -115.84 gain 71 202 -114.31 gain 202 71 -118.90 gain 71 203 -120.29 gain 203 71 -124.50 gain 71 204 -124.59 gain 204 71 -126.08 gain 71 205 -122.89 gain 205 71 -123.46 gain 71 206 -127.54 gain 206 71 -132.62 gain 71 207 -122.47 gain 207 71 -119.92 gain 71 208 -123.36 gain 208 71 -126.58 gain 71 209 -125.17 gain 209 71 -129.39 gain 71 210 -125.75 gain 210 71 -126.91 gain 71 211 -129.74 gain 211 71 -132.92 gain 71 212 -119.58 gain 212 71 -121.30 gain 71 213 -122.59 gain 213 71 -123.50 gain 71 214 -129.97 gain 214 71 -130.77 gain 71 215 -120.96 gain 215 71 -118.17 gain 71 216 -119.35 gain 216 71 -121.22 gain 71 217 -122.25 gain 217 71 -124.65 gain 71 218 -121.83 gain 218 71 -126.41 gain 71 219 -118.84 gain 219 71 -114.79 gain 71 220 -123.59 gain 220 71 -130.03 gain 71 221 -125.84 gain 221 71 -127.91 gain 71 222 -126.85 gain 222 71 -129.25 gain 71 223 -124.16 gain 223 71 -125.17 gain 71 224 -126.38 gain 224 71 -130.08 gain 72 73 -99.88 gain 73 72 -98.27 gain 72 74 -100.39 gain 74 72 -102.66 gain 72 75 -123.31 gain 75 72 -125.72 gain 72 76 -119.59 gain 76 72 -117.95 gain 72 77 -121.53 gain 77 72 -123.55 gain 72 78 -117.91 gain 78 72 -122.78 gain 72 79 -122.00 gain 79 72 -121.66 gain 72 80 -117.18 gain 80 72 -117.34 gain 72 81 -112.20 gain 81 72 -112.94 gain 72 82 -114.65 gain 82 72 -113.02 gain 72 83 -110.79 gain 83 72 -110.20 gain 72 84 -110.28 gain 84 72 -109.83 gain 72 85 -101.09 gain 85 72 -97.46 gain 72 86 -97.03 gain 86 72 -96.78 gain 72 87 -98.93 gain 87 72 -102.64 gain 72 88 -104.87 gain 88 72 -106.33 gain 72 89 -98.50 gain 89 72 -98.56 gain 72 90 -121.41 gain 90 72 -118.48 gain 72 91 -124.17 gain 91 72 -125.18 gain 72 92 -123.51 gain 92 72 -121.48 gain 72 93 -117.55 gain 93 72 -120.31 gain 72 94 -120.59 gain 94 72 -123.22 gain 72 95 -118.75 gain 95 72 -123.63 gain 72 96 -112.00 gain 96 72 -114.23 gain 72 97 -113.27 gain 97 72 -114.25 gain 72 98 -113.04 gain 98 72 -114.81 gain 72 99 -106.63 gain 99 72 -106.22 gain 72 100 -107.52 gain 100 72 -106.67 gain 72 101 -103.04 gain 101 72 -102.36 gain 72 102 -98.59 gain 102 72 -98.69 gain 72 103 -107.69 gain 103 72 -105.27 gain 72 104 -107.50 gain 104 72 -110.46 gain 72 105 -127.38 gain 105 72 -126.28 gain 72 106 -117.28 gain 106 72 -117.27 gain 72 107 -126.03 gain 107 72 -132.59 gain 72 108 -119.41 gain 108 72 -118.28 gain 72 109 -121.62 gain 109 72 -123.98 gain 72 110 -124.34 gain 110 72 -125.17 gain 72 111 -120.94 gain 111 72 -121.45 gain 72 112 -114.47 gain 112 72 -113.85 gain 72 113 -115.40 gain 113 72 -113.59 gain 72 114 -111.84 gain 114 72 -113.33 gain 72 115 -105.58 gain 115 72 -101.38 gain 72 116 -108.47 gain 116 72 -111.81 gain 72 117 -108.73 gain 117 72 -113.57 gain 72 118 -101.86 gain 118 72 -105.02 gain 72 119 -110.65 gain 119 72 -108.47 gain 72 120 -131.54 gain 120 72 -133.88 gain 72 121 -119.73 gain 121 72 -121.36 gain 72 122 -130.82 gain 122 72 -134.56 gain 72 123 -123.37 gain 123 72 -127.89 gain 72 124 -121.82 gain 124 72 -122.75 gain 72 125 -110.48 gain 125 72 -112.75 gain 72 126 -123.14 gain 126 72 -123.36 gain 72 127 -112.75 gain 127 72 -116.43 gain 72 128 -110.10 gain 128 72 -111.72 gain 72 129 -116.53 gain 129 72 -116.06 gain 72 130 -120.27 gain 130 72 -117.62 gain 72 131 -104.73 gain 131 72 -109.17 gain 72 132 -112.11 gain 132 72 -116.18 gain 72 133 -112.73 gain 133 72 -114.86 gain 72 134 -117.33 gain 134 72 -116.16 gain 72 135 -121.98 gain 135 72 -124.39 gain 72 136 -133.21 gain 136 72 -136.23 gain 72 137 -121.71 gain 137 72 -122.21 gain 72 138 -127.55 gain 138 72 -127.05 gain 72 139 -122.39 gain 139 72 -122.88 gain 72 140 -131.61 gain 140 72 -134.70 gain 72 141 -111.66 gain 141 72 -113.43 gain 72 142 -118.25 gain 142 72 -119.32 gain 72 143 -118.84 gain 143 72 -119.52 gain 72 144 -116.37 gain 144 72 -118.08 gain 72 145 -114.18 gain 145 72 -114.34 gain 72 146 -107.41 gain 146 72 -106.48 gain 72 147 -113.85 gain 147 72 -110.00 gain 72 148 -110.86 gain 148 72 -106.73 gain 72 149 -111.79 gain 149 72 -110.83 gain 72 150 -123.00 gain 150 72 -124.73 gain 72 151 -127.54 gain 151 72 -129.46 gain 72 152 -124.10 gain 152 72 -123.00 gain 72 153 -115.37 gain 153 72 -111.84 gain 72 154 -124.82 gain 154 72 -129.85 gain 72 155 -127.86 gain 155 72 -132.78 gain 72 156 -116.38 gain 156 72 -115.69 gain 72 157 -122.08 gain 157 72 -124.33 gain 72 158 -113.53 gain 158 72 -118.37 gain 72 159 -115.84 gain 159 72 -117.31 gain 72 160 -113.37 gain 160 72 -111.94 gain 72 161 -116.46 gain 161 72 -118.52 gain 72 162 -115.87 gain 162 72 -116.80 gain 72 163 -116.81 gain 163 72 -119.89 gain 72 164 -110.65 gain 164 72 -114.77 gain 72 165 -126.56 gain 165 72 -126.72 gain 72 166 -124.49 gain 166 72 -126.22 gain 72 167 -123.59 gain 167 72 -127.41 gain 72 168 -125.64 gain 168 72 -127.92 gain 72 169 -116.28 gain 169 72 -122.75 gain 72 170 -124.33 gain 170 72 -122.32 gain 72 171 -121.02 gain 171 72 -124.04 gain 72 172 -120.10 gain 172 72 -117.82 gain 72 173 -120.70 gain 173 72 -117.85 gain 72 174 -116.47 gain 174 72 -117.93 gain 72 175 -109.02 gain 175 72 -114.02 gain 72 176 -115.73 gain 176 72 -112.75 gain 72 177 -123.16 gain 177 72 -127.99 gain 72 178 -118.61 gain 178 72 -119.26 gain 72 179 -117.30 gain 179 72 -116.34 gain 72 180 -130.57 gain 180 72 -131.08 gain 72 181 -129.47 gain 181 72 -130.05 gain 72 182 -129.50 gain 182 72 -132.47 gain 72 183 -124.48 gain 183 72 -120.83 gain 72 184 -127.26 gain 184 72 -128.40 gain 72 185 -127.71 gain 185 72 -126.33 gain 72 186 -121.29 gain 186 72 -120.20 gain 72 187 -121.81 gain 187 72 -123.26 gain 72 188 -122.26 gain 188 72 -126.97 gain 72 189 -121.71 gain 189 72 -123.93 gain 72 190 -120.45 gain 190 72 -119.68 gain 72 191 -116.68 gain 191 72 -117.00 gain 72 192 -117.70 gain 192 72 -120.90 gain 72 193 -120.43 gain 193 72 -124.87 gain 72 194 -120.12 gain 194 72 -118.37 gain 72 195 -124.08 gain 195 72 -122.96 gain 72 196 -131.59 gain 196 72 -134.52 gain 72 197 -130.98 gain 197 72 -129.97 gain 72 198 -127.46 gain 198 72 -125.97 gain 72 199 -129.43 gain 199 72 -131.86 gain 72 200 -127.29 gain 200 72 -126.66 gain 72 201 -126.23 gain 201 72 -126.40 gain 72 202 -120.53 gain 202 72 -124.71 gain 72 203 -120.48 gain 203 72 -124.27 gain 72 204 -118.38 gain 204 72 -119.46 gain 72 205 -122.03 gain 205 72 -122.18 gain 72 206 -118.27 gain 206 72 -122.94 gain 72 207 -111.12 gain 207 72 -108.16 gain 72 208 -124.80 gain 208 72 -127.61 gain 72 209 -118.07 gain 209 72 -121.87 gain 72 210 -123.18 gain 210 72 -123.92 gain 72 211 -135.54 gain 211 72 -138.31 gain 72 212 -132.55 gain 212 72 -133.85 gain 72 213 -131.31 gain 213 72 -131.81 gain 72 214 -128.16 gain 214 72 -128.54 gain 72 215 -123.33 gain 215 72 -120.13 gain 72 216 -123.64 gain 216 72 -125.10 gain 72 217 -126.49 gain 217 72 -128.47 gain 72 218 -120.50 gain 218 72 -124.66 gain 72 219 -124.60 gain 219 72 -120.12 gain 72 220 -126.69 gain 220 72 -132.71 gain 72 221 -124.14 gain 221 72 -125.80 gain 72 222 -126.18 gain 222 72 -128.16 gain 72 223 -122.97 gain 223 72 -123.57 gain 72 224 -120.78 gain 224 72 -124.06 gain 73 74 -81.84 gain 74 73 -85.71 gain 73 75 -124.61 gain 75 73 -128.62 gain 73 76 -127.64 gain 76 73 -127.60 gain 73 77 -121.06 gain 77 73 -124.69 gain 73 78 -126.33 gain 78 73 -132.81 gain 73 79 -128.15 gain 79 73 -129.42 gain 73 80 -127.44 gain 80 73 -129.21 gain 73 81 -119.08 gain 81 73 -121.44 gain 73 82 -105.18 gain 82 73 -105.16 gain 73 83 -116.39 gain 83 73 -117.40 gain 73 84 -118.87 gain 84 73 -120.03 gain 73 85 -104.07 gain 85 73 -102.04 gain 73 86 -99.95 gain 86 73 -101.31 gain 73 87 -97.18 gain 87 73 -102.50 gain 73 88 -90.96 gain 88 73 -94.03 gain 73 89 -95.80 gain 89 73 -97.46 gain 73 90 -122.80 gain 90 73 -121.48 gain 73 91 -123.64 gain 91 73 -126.26 gain 73 92 -116.69 gain 92 73 -116.27 gain 73 93 -120.91 gain 93 73 -125.28 gain 73 94 -118.12 gain 94 73 -122.36 gain 73 95 -120.16 gain 95 73 -126.65 gain 73 96 -115.04 gain 96 73 -118.87 gain 73 97 -118.09 gain 97 73 -120.67 gain 73 98 -115.32 gain 98 73 -118.70 gain 73 99 -112.53 gain 99 73 -113.73 gain 73 100 -99.69 gain 100 73 -100.46 gain 73 101 -107.43 gain 101 73 -108.36 gain 73 102 -105.88 gain 102 73 -107.59 gain 73 103 -104.25 gain 103 73 -103.45 gain 73 104 -102.69 gain 104 73 -107.26 gain 73 105 -117.45 gain 105 73 -117.96 gain 73 106 -127.52 gain 106 73 -129.11 gain 73 107 -123.13 gain 107 73 -131.29 gain 73 108 -130.21 gain 108 73 -130.69 gain 73 109 -120.80 gain 109 73 -124.77 gain 73 110 -122.24 gain 110 73 -124.67 gain 73 111 -116.54 gain 111 73 -118.66 gain 73 112 -111.65 gain 112 73 -112.65 gain 73 113 -110.40 gain 113 73 -110.20 gain 73 114 -109.98 gain 114 73 -113.09 gain 73 115 -104.56 gain 115 73 -101.97 gain 73 116 -109.03 gain 116 73 -113.98 gain 73 117 -104.81 gain 117 73 -111.26 gain 73 118 -107.73 gain 118 73 -112.50 gain 73 119 -106.20 gain 119 73 -105.63 gain 73 120 -113.62 gain 120 73 -117.57 gain 73 121 -124.38 gain 121 73 -127.61 gain 73 122 -123.48 gain 122 73 -128.83 gain 73 123 -119.84 gain 123 73 -125.97 gain 73 124 -112.92 gain 124 73 -115.46 gain 73 125 -121.60 gain 125 73 -125.47 gain 73 126 -113.04 gain 126 73 -114.87 gain 73 127 -118.30 gain 127 73 -123.59 gain 73 128 -116.37 gain 128 73 -119.60 gain 73 129 -109.29 gain 129 73 -110.43 gain 73 130 -103.12 gain 130 73 -102.08 gain 73 131 -115.61 gain 131 73 -121.66 gain 73 132 -102.50 gain 132 73 -108.18 gain 73 133 -106.80 gain 133 73 -110.54 gain 73 134 -109.15 gain 134 73 -109.60 gain 73 135 -129.10 gain 135 73 -133.11 gain 73 136 -128.80 gain 136 73 -133.43 gain 73 137 -127.32 gain 137 73 -129.43 gain 73 138 -127.97 gain 138 73 -129.08 gain 73 139 -127.45 gain 139 73 -129.54 gain 73 140 -126.56 gain 140 73 -131.26 gain 73 141 -122.09 gain 141 73 -125.46 gain 73 142 -115.44 gain 142 73 -118.12 gain 73 143 -120.36 gain 143 73 -122.65 gain 73 144 -109.28 gain 144 73 -112.59 gain 73 145 -114.82 gain 145 73 -116.58 gain 73 146 -117.25 gain 146 73 -117.92 gain 73 147 -107.24 gain 147 73 -105.00 gain 73 148 -115.51 gain 148 73 -112.99 gain 73 149 -112.70 gain 149 73 -113.34 gain 73 150 -118.29 gain 150 73 -121.62 gain 73 151 -122.84 gain 151 73 -126.37 gain 73 152 -119.84 gain 152 73 -120.35 gain 73 153 -126.85 gain 153 73 -124.93 gain 73 154 -119.83 gain 154 73 -126.46 gain 73 155 -124.17 gain 155 73 -130.70 gain 73 156 -114.87 gain 156 73 -115.79 gain 73 157 -120.95 gain 157 73 -124.81 gain 73 158 -111.10 gain 158 73 -117.56 gain 73 159 -116.58 gain 159 73 -119.65 gain 73 160 -116.26 gain 160 73 -116.44 gain 73 161 -113.16 gain 161 73 -116.83 gain 73 162 -117.64 gain 162 73 -120.18 gain 73 163 -113.42 gain 163 73 -118.10 gain 73 164 -115.16 gain 164 73 -120.89 gain 73 165 -120.39 gain 165 73 -122.16 gain 73 166 -119.76 gain 166 73 -123.10 gain 73 167 -126.54 gain 167 73 -131.97 gain 73 168 -121.77 gain 168 73 -125.65 gain 73 169 -127.42 gain 169 73 -135.50 gain 73 170 -126.13 gain 170 73 -125.74 gain 73 171 -119.65 gain 171 73 -124.28 gain 73 172 -118.26 gain 172 73 -117.58 gain 73 173 -128.29 gain 173 73 -127.05 gain 73 174 -124.89 gain 174 73 -127.95 gain 73 175 -117.48 gain 175 73 -124.09 gain 73 176 -119.53 gain 176 73 -118.15 gain 73 177 -112.13 gain 177 73 -118.56 gain 73 178 -115.07 gain 178 73 -117.33 gain 73 179 -115.31 gain 179 73 -115.96 gain 73 180 -128.20 gain 180 73 -130.32 gain 73 181 -128.10 gain 181 73 -130.28 gain 73 182 -123.83 gain 182 73 -128.41 gain 73 183 -125.80 gain 183 73 -123.77 gain 73 184 -124.23 gain 184 73 -126.97 gain 73 185 -127.14 gain 185 73 -127.37 gain 73 186 -122.86 gain 186 73 -123.37 gain 73 187 -114.98 gain 187 73 -118.04 gain 73 188 -113.20 gain 188 73 -119.51 gain 73 189 -124.38 gain 189 73 -128.21 gain 73 190 -115.18 gain 190 73 -116.03 gain 73 191 -117.40 gain 191 73 -119.34 gain 73 192 -114.23 gain 192 73 -119.03 gain 73 193 -117.53 gain 193 73 -123.59 gain 73 194 -113.23 gain 194 73 -113.10 gain 73 195 -123.04 gain 195 73 -123.54 gain 73 196 -126.93 gain 196 73 -131.47 gain 73 197 -132.63 gain 197 73 -133.23 gain 73 198 -117.23 gain 198 73 -117.35 gain 73 199 -121.87 gain 199 73 -125.91 gain 73 200 -120.97 gain 200 73 -121.95 gain 73 201 -124.70 gain 201 73 -126.48 gain 73 202 -120.93 gain 202 73 -126.71 gain 73 203 -116.65 gain 203 73 -122.05 gain 73 204 -121.78 gain 204 73 -124.46 gain 73 205 -123.64 gain 205 73 -125.40 gain 73 206 -118.00 gain 206 73 -124.28 gain 73 207 -117.41 gain 207 73 -116.05 gain 73 208 -122.07 gain 208 73 -126.49 gain 73 209 -124.43 gain 209 73 -129.84 gain 73 210 -124.66 gain 210 73 -127.01 gain 73 211 -130.69 gain 211 73 -135.06 gain 73 212 -127.84 gain 212 73 -130.75 gain 73 213 -129.72 gain 213 73 -131.83 gain 73 214 -132.41 gain 214 73 -134.40 gain 73 215 -126.01 gain 215 73 -124.42 gain 73 216 -123.26 gain 216 73 -126.33 gain 73 217 -121.25 gain 217 73 -124.84 gain 73 218 -119.88 gain 218 73 -125.66 gain 73 219 -119.48 gain 219 73 -116.61 gain 73 220 -122.15 gain 220 73 -129.78 gain 73 221 -126.21 gain 221 73 -129.47 gain 73 222 -121.16 gain 222 73 -124.76 gain 73 223 -117.61 gain 223 73 -119.81 gain 73 224 -124.06 gain 224 73 -128.95 gain 74 75 -125.49 gain 75 74 -125.63 gain 74 76 -128.12 gain 76 74 -124.21 gain 74 77 -120.98 gain 77 74 -120.74 gain 74 78 -126.62 gain 78 74 -129.23 gain 74 79 -127.19 gain 79 74 -124.57 gain 74 80 -124.84 gain 80 74 -122.73 gain 74 81 -117.08 gain 81 74 -115.56 gain 74 82 -114.85 gain 82 74 -110.95 gain 74 83 -117.14 gain 83 74 -114.28 gain 74 84 -112.81 gain 84 74 -110.10 gain 74 85 -116.20 gain 85 74 -110.29 gain 74 86 -103.23 gain 86 74 -100.70 gain 74 87 -103.19 gain 87 74 -104.63 gain 74 88 -100.77 gain 88 74 -99.96 gain 74 89 -99.92 gain 89 74 -97.71 gain 74 90 -127.85 gain 90 74 -122.65 gain 74 91 -123.25 gain 91 74 -121.99 gain 74 92 -130.10 gain 92 74 -125.81 gain 74 93 -119.89 gain 93 74 -120.38 gain 74 94 -124.59 gain 94 74 -124.95 gain 74 95 -122.90 gain 95 74 -125.52 gain 74 96 -120.45 gain 96 74 -120.41 gain 74 97 -118.57 gain 97 74 -117.27 gain 74 98 -116.58 gain 98 74 -116.08 gain 74 99 -119.93 gain 99 74 -117.25 gain 74 100 -111.60 gain 100 74 -108.48 gain 74 101 -111.84 gain 101 74 -108.89 gain 74 102 -103.22 gain 102 74 -101.05 gain 74 103 -108.71 gain 103 74 -104.02 gain 74 104 -103.66 gain 104 74 -104.35 gain 74 105 -132.20 gain 105 74 -128.83 gain 74 106 -126.03 gain 106 74 -123.75 gain 74 107 -125.88 gain 107 74 -130.16 gain 74 108 -125.38 gain 108 74 -121.98 gain 74 109 -116.64 gain 109 74 -116.73 gain 74 110 -128.43 gain 110 74 -126.99 gain 74 111 -120.91 gain 111 74 -119.15 gain 74 112 -120.37 gain 112 74 -117.49 gain 74 113 -120.09 gain 113 74 -116.01 gain 74 114 -122.95 gain 114 74 -122.18 gain 74 115 -109.18 gain 115 74 -102.71 gain 74 116 -115.63 gain 116 74 -116.70 gain 74 117 -120.01 gain 117 74 -122.58 gain 74 118 -112.86 gain 118 74 -113.76 gain 74 119 -108.79 gain 119 74 -104.34 gain 74 120 -135.95 gain 120 74 -136.02 gain 74 121 -127.30 gain 121 74 -126.66 gain 74 122 -120.85 gain 122 74 -122.33 gain 74 123 -130.02 gain 123 74 -132.28 gain 74 124 -125.44 gain 124 74 -124.10 gain 74 125 -128.98 gain 125 74 -128.98 gain 74 126 -125.31 gain 126 74 -123.26 gain 74 127 -123.41 gain 127 74 -124.82 gain 74 128 -119.03 gain 128 74 -118.38 gain 74 129 -117.00 gain 129 74 -114.26 gain 74 130 -119.57 gain 130 74 -114.65 gain 74 131 -109.19 gain 131 74 -111.36 gain 74 132 -121.41 gain 132 74 -123.21 gain 74 133 -109.06 gain 133 74 -108.93 gain 74 134 -113.72 gain 134 74 -110.29 gain 74 135 -127.81 gain 135 74 -127.95 gain 74 136 -129.12 gain 136 74 -129.87 gain 74 137 -123.69 gain 137 74 -121.92 gain 74 138 -125.06 gain 138 74 -122.29 gain 74 139 -125.79 gain 139 74 -124.00 gain 74 140 -130.81 gain 140 74 -131.64 gain 74 141 -123.04 gain 141 74 -122.53 gain 74 142 -121.20 gain 142 74 -120.00 gain 74 143 -128.63 gain 143 74 -127.05 gain 74 144 -117.03 gain 144 74 -116.46 gain 74 145 -117.33 gain 145 74 -115.22 gain 74 146 -124.36 gain 146 74 -121.16 gain 74 147 -112.66 gain 147 74 -106.54 gain 74 148 -121.09 gain 148 74 -114.70 gain 74 149 -117.01 gain 149 74 -113.78 gain 74 150 -126.63 gain 150 74 -126.08 gain 74 151 -127.52 gain 151 74 -127.17 gain 74 152 -128.00 gain 152 74 -124.63 gain 74 153 -132.85 gain 153 74 -127.06 gain 74 154 -129.89 gain 154 74 -132.65 gain 74 155 -126.00 gain 155 74 -128.65 gain 74 156 -128.14 gain 156 74 -125.18 gain 74 157 -122.66 gain 157 74 -122.64 gain 74 158 -114.78 gain 158 74 -117.36 gain 74 159 -116.26 gain 159 74 -115.46 gain 74 160 -119.30 gain 160 74 -115.60 gain 74 161 -128.49 gain 161 74 -128.29 gain 74 162 -123.99 gain 162 74 -122.65 gain 74 163 -124.97 gain 163 74 -125.79 gain 74 164 -116.81 gain 164 74 -118.67 gain 74 165 -134.96 gain 165 74 -132.86 gain 74 166 -129.42 gain 166 74 -128.88 gain 74 167 -127.68 gain 167 74 -129.24 gain 74 168 -121.37 gain 168 74 -121.37 gain 74 169 -124.19 gain 169 74 -128.39 gain 74 170 -125.32 gain 170 74 -121.05 gain 74 171 -132.53 gain 171 74 -133.29 gain 74 172 -121.44 gain 172 74 -116.89 gain 74 173 -119.54 gain 173 74 -114.43 gain 74 174 -121.27 gain 174 74 -120.45 gain 74 175 -124.45 gain 175 74 -127.18 gain 74 176 -121.22 gain 176 74 -115.97 gain 74 177 -128.05 gain 177 74 -130.61 gain 74 178 -116.35 gain 178 74 -114.73 gain 74 179 -122.51 gain 179 74 -119.28 gain 74 180 -133.90 gain 180 74 -132.14 gain 74 181 -130.86 gain 181 74 -129.18 gain 74 182 -133.26 gain 182 74 -133.96 gain 74 183 -135.73 gain 183 74 -129.82 gain 74 184 -129.03 gain 184 74 -127.90 gain 74 185 -128.82 gain 185 74 -125.18 gain 74 186 -123.94 gain 186 74 -120.58 gain 74 187 -126.45 gain 187 74 -125.63 gain 74 188 -117.04 gain 188 74 -119.48 gain 74 189 -120.79 gain 189 74 -120.75 gain 74 190 -117.90 gain 190 74 -114.86 gain 74 191 -119.54 gain 191 74 -117.59 gain 74 192 -117.52 gain 192 74 -118.44 gain 74 193 -128.94 gain 193 74 -131.11 gain 74 194 -120.18 gain 194 74 -116.17 gain 74 195 -130.43 gain 195 74 -127.05 gain 74 196 -134.83 gain 196 74 -135.49 gain 74 197 -134.22 gain 197 74 -130.94 gain 74 198 -126.91 gain 198 74 -123.15 gain 74 199 -126.96 gain 199 74 -127.12 gain 74 200 -124.26 gain 200 74 -121.36 gain 74 201 -130.58 gain 201 74 -128.48 gain 74 202 -122.46 gain 202 74 -124.36 gain 74 203 -127.56 gain 203 74 -129.08 gain 74 204 -124.24 gain 204 74 -123.05 gain 74 205 -129.36 gain 205 74 -127.25 gain 74 206 -124.23 gain 206 74 -126.63 gain 74 207 -124.17 gain 207 74 -118.93 gain 74 208 -121.21 gain 208 74 -121.75 gain 74 209 -126.26 gain 209 74 -127.79 gain 74 210 -130.07 gain 210 74 -128.53 gain 74 211 -134.29 gain 211 74 -134.78 gain 74 212 -127.76 gain 212 74 -126.79 gain 74 213 -128.76 gain 213 74 -126.99 gain 74 214 -124.59 gain 214 74 -122.71 gain 74 215 -120.94 gain 215 74 -115.47 gain 74 216 -123.05 gain 216 74 -122.24 gain 74 217 -130.26 gain 217 74 -129.97 gain 74 218 -130.54 gain 218 74 -132.44 gain 74 219 -126.36 gain 219 74 -119.62 gain 74 220 -127.50 gain 220 74 -131.25 gain 74 221 -125.28 gain 221 74 -124.67 gain 74 222 -134.19 gain 222 74 -133.91 gain 74 223 -120.30 gain 223 74 -118.63 gain 74 224 -126.60 gain 224 74 -127.62 gain 75 76 -97.11 gain 76 75 -93.06 gain 75 77 -105.28 gain 77 75 -104.90 gain 75 78 -110.33 gain 78 75 -112.79 gain 75 79 -117.82 gain 79 75 -115.07 gain 75 80 -113.35 gain 80 75 -111.10 gain 75 81 -118.74 gain 81 75 -117.08 gain 75 82 -123.08 gain 82 75 -119.05 gain 75 83 -121.42 gain 83 75 -118.42 gain 75 84 -125.27 gain 84 75 -122.42 gain 75 85 -127.24 gain 85 75 -121.20 gain 75 86 -119.70 gain 86 75 -117.04 gain 75 87 -128.80 gain 87 75 -130.10 gain 75 88 -126.64 gain 88 75 -125.69 gain 75 89 -131.28 gain 89 75 -128.93 gain 75 90 -97.51 gain 90 75 -92.17 gain 75 91 -91.16 gain 91 75 -89.76 gain 75 92 -109.66 gain 92 75 -105.22 gain 75 93 -110.90 gain 93 75 -111.25 gain 75 94 -107.82 gain 94 75 -108.05 gain 75 95 -120.22 gain 95 75 -122.69 gain 75 96 -117.01 gain 96 75 -116.83 gain 75 97 -126.52 gain 97 75 -125.08 gain 75 98 -119.24 gain 98 75 -118.60 gain 75 99 -120.75 gain 99 75 -117.93 gain 75 100 -126.72 gain 100 75 -123.47 gain 75 101 -124.66 gain 101 75 -121.57 gain 75 102 -124.26 gain 102 75 -121.95 gain 75 103 -130.59 gain 103 75 -125.76 gain 75 104 -127.98 gain 104 75 -128.53 gain 75 105 -105.93 gain 105 75 -102.43 gain 75 106 -104.19 gain 106 75 -101.76 gain 75 107 -102.93 gain 107 75 -107.07 gain 75 108 -116.70 gain 108 75 -113.16 gain 75 109 -113.43 gain 109 75 -113.38 gain 75 110 -111.71 gain 110 75 -110.13 gain 75 111 -113.36 gain 111 75 -111.46 gain 75 112 -115.67 gain 112 75 -112.65 gain 75 113 -117.23 gain 113 75 -113.02 gain 75 114 -124.72 gain 114 75 -123.81 gain 75 115 -125.29 gain 115 75 -118.68 gain 75 116 -125.28 gain 116 75 -126.21 gain 75 117 -123.21 gain 117 75 -125.64 gain 75 118 -132.16 gain 118 75 -132.91 gain 75 119 -131.02 gain 119 75 -126.44 gain 75 120 -111.07 gain 120 75 -111.00 gain 75 121 -108.78 gain 121 75 -108.00 gain 75 122 -106.31 gain 122 75 -107.64 gain 75 123 -104.46 gain 123 75 -106.57 gain 75 124 -116.61 gain 124 75 -115.13 gain 75 125 -115.34 gain 125 75 -115.20 gain 75 126 -116.19 gain 126 75 -114.00 gain 75 127 -122.04 gain 127 75 -123.31 gain 75 128 -114.49 gain 128 75 -113.70 gain 75 129 -120.11 gain 129 75 -117.23 gain 75 130 -120.42 gain 130 75 -115.36 gain 75 131 -123.11 gain 131 75 -125.14 gain 75 132 -122.90 gain 132 75 -124.55 gain 75 133 -131.23 gain 133 75 -130.96 gain 75 134 -124.52 gain 134 75 -120.95 gain 75 135 -108.93 gain 135 75 -108.92 gain 75 136 -115.64 gain 136 75 -116.25 gain 75 137 -118.93 gain 137 75 -117.02 gain 75 138 -115.72 gain 138 75 -112.82 gain 75 139 -115.04 gain 139 75 -113.11 gain 75 140 -116.33 gain 140 75 -117.01 gain 75 141 -124.16 gain 141 75 -123.52 gain 75 142 -118.09 gain 142 75 -116.75 gain 75 143 -127.80 gain 143 75 -126.08 gain 75 144 -125.99 gain 144 75 -125.29 gain 75 145 -129.23 gain 145 75 -126.97 gain 75 146 -118.73 gain 146 75 -115.38 gain 75 147 -129.01 gain 147 75 -122.75 gain 75 148 -130.84 gain 148 75 -124.31 gain 75 149 -128.10 gain 149 75 -124.73 gain 75 150 -113.90 gain 150 75 -113.21 gain 75 151 -114.15 gain 151 75 -113.67 gain 75 152 -112.84 gain 152 75 -109.33 gain 75 153 -109.81 gain 153 75 -103.88 gain 75 154 -121.44 gain 154 75 -124.05 gain 75 155 -117.69 gain 155 75 -120.21 gain 75 156 -124.57 gain 156 75 -121.47 gain 75 157 -113.67 gain 157 75 -113.52 gain 75 158 -125.63 gain 158 75 -128.07 gain 75 159 -128.35 gain 159 75 -127.41 gain 75 160 -130.83 gain 160 75 -127.00 gain 75 161 -131.44 gain 161 75 -131.09 gain 75 162 -136.38 gain 162 75 -134.90 gain 75 163 -131.54 gain 163 75 -132.21 gain 75 164 -122.82 gain 164 75 -124.54 gain 75 165 -113.54 gain 165 75 -111.29 gain 75 166 -126.00 gain 166 75 -125.32 gain 75 167 -119.06 gain 167 75 -120.48 gain 75 168 -119.81 gain 168 75 -119.68 gain 75 169 -125.11 gain 169 75 -129.18 gain 75 170 -122.05 gain 170 75 -117.64 gain 75 171 -117.05 gain 171 75 -117.66 gain 75 172 -125.08 gain 172 75 -120.39 gain 75 173 -123.85 gain 173 75 -118.60 gain 75 174 -125.78 gain 174 75 -124.82 gain 75 175 -122.39 gain 175 75 -124.99 gain 75 176 -129.15 gain 176 75 -123.76 gain 75 177 -129.94 gain 177 75 -132.36 gain 75 178 -133.36 gain 178 75 -131.60 gain 75 179 -132.27 gain 179 75 -128.91 gain 75 180 -117.35 gain 180 75 -115.45 gain 75 181 -129.28 gain 181 75 -127.45 gain 75 182 -122.04 gain 182 75 -122.60 gain 75 183 -118.14 gain 183 75 -112.09 gain 75 184 -114.43 gain 184 75 -113.16 gain 75 185 -120.98 gain 185 75 -117.20 gain 75 186 -119.29 gain 186 75 -115.79 gain 75 187 -124.29 gain 187 75 -123.33 gain 75 188 -121.55 gain 188 75 -123.85 gain 75 189 -124.99 gain 189 75 -124.81 gain 75 190 -127.69 gain 190 75 -124.51 gain 75 191 -124.47 gain 191 75 -122.39 gain 75 192 -126.78 gain 192 75 -127.56 gain 75 193 -132.51 gain 193 75 -134.55 gain 75 194 -136.28 gain 194 75 -132.13 gain 75 195 -122.62 gain 195 75 -119.10 gain 75 196 -115.38 gain 196 75 -115.90 gain 75 197 -120.63 gain 197 75 -117.21 gain 75 198 -115.77 gain 198 75 -111.88 gain 75 199 -127.26 gain 199 75 -127.28 gain 75 200 -122.12 gain 200 75 -119.08 gain 75 201 -122.58 gain 201 75 -120.34 gain 75 202 -122.53 gain 202 75 -124.29 gain 75 203 -122.72 gain 203 75 -124.10 gain 75 204 -118.50 gain 204 75 -117.17 gain 75 205 -131.32 gain 205 75 -129.06 gain 75 206 -135.06 gain 206 75 -137.33 gain 75 207 -129.05 gain 207 75 -123.68 gain 75 208 -129.45 gain 208 75 -129.85 gain 75 209 -125.90 gain 209 75 -127.29 gain 75 210 -116.84 gain 210 75 -115.17 gain 75 211 -120.91 gain 211 75 -121.26 gain 75 212 -120.01 gain 212 75 -118.90 gain 75 213 -118.64 gain 213 75 -116.73 gain 75 214 -124.64 gain 214 75 -122.61 gain 75 215 -125.33 gain 215 75 -119.72 gain 75 216 -127.27 gain 216 75 -126.32 gain 75 217 -119.79 gain 217 75 -119.36 gain 75 218 -123.55 gain 218 75 -125.31 gain 75 219 -128.78 gain 219 75 -121.90 gain 75 220 -125.29 gain 220 75 -128.90 gain 75 221 -123.02 gain 221 75 -122.27 gain 75 222 -126.80 gain 222 75 -126.38 gain 75 223 -126.04 gain 223 75 -124.23 gain 75 224 -128.23 gain 224 75 -129.11 gain 76 77 -89.18 gain 77 76 -92.85 gain 76 78 -101.09 gain 78 76 -107.61 gain 76 79 -102.39 gain 79 76 -103.68 gain 76 80 -112.68 gain 80 76 -114.48 gain 76 81 -118.59 gain 81 76 -120.98 gain 76 82 -111.63 gain 82 76 -111.64 gain 76 83 -120.66 gain 83 76 -121.71 gain 76 84 -117.92 gain 84 76 -119.11 gain 76 85 -120.67 gain 85 76 -118.68 gain 76 86 -115.74 gain 86 76 -117.13 gain 76 87 -123.31 gain 87 76 -128.65 gain 76 88 -126.67 gain 88 76 -129.77 gain 76 89 -127.71 gain 89 76 -129.41 gain 76 90 -99.25 gain 90 76 -97.96 gain 76 91 -89.41 gain 91 76 -92.06 gain 76 92 -94.40 gain 92 76 -94.02 gain 76 93 -100.54 gain 93 76 -104.94 gain 76 94 -104.66 gain 94 76 -108.93 gain 76 95 -110.25 gain 95 76 -116.78 gain 76 96 -116.13 gain 96 76 -120.00 gain 76 97 -118.64 gain 97 76 -121.25 gain 76 98 -118.05 gain 98 76 -121.46 gain 76 99 -120.82 gain 99 76 -122.05 gain 76 100 -124.78 gain 100 76 -125.57 gain 76 101 -125.51 gain 101 76 -126.47 gain 76 102 -130.56 gain 102 76 -132.30 gain 76 103 -124.38 gain 103 76 -123.60 gain 76 104 -126.97 gain 104 76 -131.57 gain 76 105 -100.11 gain 105 76 -100.65 gain 76 106 -105.10 gain 106 76 -106.73 gain 76 107 -96.39 gain 107 76 -104.58 gain 76 108 -105.28 gain 108 76 -105.79 gain 76 109 -109.27 gain 109 76 -113.27 gain 76 110 -114.08 gain 110 76 -116.55 gain 76 111 -111.08 gain 111 76 -113.23 gain 76 112 -112.44 gain 112 76 -113.47 gain 76 113 -112.54 gain 113 76 -112.38 gain 76 114 -116.05 gain 114 76 -119.19 gain 76 115 -122.88 gain 115 76 -120.32 gain 76 116 -127.29 gain 116 76 -132.27 gain 76 117 -129.95 gain 117 76 -136.43 gain 76 118 -121.30 gain 118 76 -126.11 gain 76 119 -127.01 gain 119 76 -126.47 gain 76 120 -108.05 gain 120 76 -112.03 gain 76 121 -105.70 gain 121 76 -108.97 gain 76 122 -108.95 gain 122 76 -114.34 gain 76 123 -112.44 gain 123 76 -118.60 gain 76 124 -108.17 gain 124 76 -110.74 gain 76 125 -104.79 gain 125 76 -108.69 gain 76 126 -114.07 gain 126 76 -115.93 gain 76 127 -116.68 gain 127 76 -122.00 gain 76 128 -116.54 gain 128 76 -119.80 gain 76 129 -117.74 gain 129 76 -118.91 gain 76 130 -119.32 gain 130 76 -118.31 gain 76 131 -121.42 gain 131 76 -127.49 gain 76 132 -126.32 gain 132 76 -132.03 gain 76 133 -125.95 gain 133 76 -129.73 gain 76 134 -124.38 gain 134 76 -124.86 gain 76 135 -107.50 gain 135 76 -111.54 gain 76 136 -105.66 gain 136 76 -110.32 gain 76 137 -115.23 gain 137 76 -117.37 gain 76 138 -117.91 gain 138 76 -119.05 gain 76 139 -111.62 gain 139 76 -113.75 gain 76 140 -108.91 gain 140 76 -113.64 gain 76 141 -117.10 gain 141 76 -120.51 gain 76 142 -121.38 gain 142 76 -124.10 gain 76 143 -117.07 gain 143 76 -119.40 gain 76 144 -120.64 gain 144 76 -123.99 gain 76 145 -116.19 gain 145 76 -117.99 gain 76 146 -124.85 gain 146 76 -125.56 gain 76 147 -122.40 gain 147 76 -120.19 gain 76 148 -122.14 gain 148 76 -119.65 gain 76 149 -128.03 gain 149 76 -128.71 gain 76 150 -108.24 gain 150 76 -111.61 gain 76 151 -115.07 gain 151 76 -118.63 gain 76 152 -108.84 gain 152 76 -109.38 gain 76 153 -112.88 gain 153 76 -110.99 gain 76 154 -108.28 gain 154 76 -114.95 gain 76 155 -119.24 gain 155 76 -125.80 gain 76 156 -118.52 gain 156 76 -119.47 gain 76 157 -120.18 gain 157 76 -124.08 gain 76 158 -121.44 gain 158 76 -127.92 gain 76 159 -126.80 gain 159 76 -129.90 gain 76 160 -118.41 gain 160 76 -118.63 gain 76 161 -121.72 gain 161 76 -125.42 gain 76 162 -123.18 gain 162 76 -125.75 gain 76 163 -127.71 gain 163 76 -132.43 gain 76 164 -132.59 gain 164 76 -138.35 gain 76 165 -115.12 gain 165 76 -116.92 gain 76 166 -113.52 gain 166 76 -116.89 gain 76 167 -115.88 gain 167 76 -121.34 gain 76 168 -110.43 gain 168 76 -114.34 gain 76 169 -110.54 gain 169 76 -118.65 gain 76 170 -112.38 gain 170 76 -112.02 gain 76 171 -118.81 gain 171 76 -123.47 gain 76 172 -117.25 gain 172 76 -116.61 gain 76 173 -122.72 gain 173 76 -121.51 gain 76 174 -118.49 gain 174 76 -121.58 gain 76 175 -127.31 gain 175 76 -133.95 gain 76 176 -120.49 gain 176 76 -119.15 gain 76 177 -134.57 gain 177 76 -141.04 gain 76 178 -121.60 gain 178 76 -123.89 gain 76 179 -130.16 gain 179 76 -130.85 gain 76 180 -118.41 gain 180 76 -120.56 gain 76 181 -111.71 gain 181 76 -113.93 gain 76 182 -121.00 gain 182 76 -125.61 gain 76 183 -116.56 gain 183 76 -114.55 gain 76 184 -114.57 gain 184 76 -117.34 gain 76 185 -120.72 gain 185 76 -120.98 gain 76 186 -119.16 gain 186 76 -119.71 gain 76 187 -121.03 gain 187 76 -124.12 gain 76 188 -117.26 gain 188 76 -123.61 gain 76 189 -117.19 gain 189 76 -121.06 gain 76 190 -124.85 gain 190 76 -125.73 gain 76 191 -125.29 gain 191 76 -127.25 gain 76 192 -131.43 gain 192 76 -136.27 gain 76 193 -125.11 gain 193 76 -131.19 gain 76 194 -131.54 gain 194 76 -131.43 gain 76 195 -119.83 gain 195 76 -120.36 gain 76 196 -116.80 gain 196 76 -121.36 gain 76 197 -114.33 gain 197 76 -114.96 gain 76 198 -122.76 gain 198 76 -122.91 gain 76 199 -118.71 gain 199 76 -122.78 gain 76 200 -122.97 gain 200 76 -123.98 gain 76 201 -118.75 gain 201 76 -120.56 gain 76 202 -122.97 gain 202 76 -128.78 gain 76 203 -129.12 gain 203 76 -134.56 gain 76 204 -113.50 gain 204 76 -116.22 gain 76 205 -130.85 gain 205 76 -132.64 gain 76 206 -121.05 gain 206 76 -127.36 gain 76 207 -120.84 gain 207 76 -119.51 gain 76 208 -124.94 gain 208 76 -129.39 gain 76 209 -126.38 gain 209 76 -131.83 gain 76 210 -118.42 gain 210 76 -120.79 gain 76 211 -116.18 gain 211 76 -120.59 gain 76 212 -114.66 gain 212 76 -117.60 gain 76 213 -113.22 gain 213 76 -115.35 gain 76 214 -119.95 gain 214 76 -121.97 gain 76 215 -118.45 gain 215 76 -116.89 gain 76 216 -113.79 gain 216 76 -116.89 gain 76 217 -122.46 gain 217 76 -126.08 gain 76 218 -126.10 gain 218 76 -131.91 gain 76 219 -117.87 gain 219 76 -115.04 gain 76 220 -128.31 gain 220 76 -135.97 gain 76 221 -128.13 gain 221 76 -131.43 gain 76 222 -131.84 gain 222 76 -135.46 gain 76 223 -122.76 gain 223 76 -124.99 gain 76 224 -134.72 gain 224 76 -139.65 gain 77 78 -93.76 gain 78 77 -96.61 gain 77 79 -107.08 gain 79 77 -104.71 gain 77 80 -108.00 gain 80 77 -106.13 gain 77 81 -107.62 gain 81 77 -106.34 gain 77 82 -121.09 gain 82 77 -117.44 gain 77 83 -115.83 gain 83 77 -113.22 gain 77 84 -123.08 gain 84 77 -120.61 gain 77 85 -127.24 gain 85 77 -121.58 gain 77 86 -127.26 gain 86 77 -124.98 gain 77 87 -130.03 gain 87 77 -131.72 gain 77 88 -126.48 gain 88 77 -125.91 gain 77 89 -125.87 gain 89 77 -123.90 gain 77 90 -106.53 gain 90 77 -101.58 gain 77 91 -98.65 gain 91 77 -97.63 gain 77 92 -91.26 gain 92 77 -87.21 gain 77 93 -98.36 gain 93 77 -99.09 gain 77 94 -101.34 gain 94 77 -101.95 gain 77 95 -110.20 gain 95 77 -113.06 gain 77 96 -113.77 gain 96 77 -113.97 gain 77 97 -111.14 gain 97 77 -110.09 gain 77 98 -112.82 gain 98 77 -112.57 gain 77 99 -111.06 gain 99 77 -108.62 gain 77 100 -123.09 gain 100 77 -120.22 gain 77 101 -119.85 gain 101 77 -117.14 gain 77 102 -123.48 gain 102 77 -121.56 gain 77 103 -125.58 gain 103 77 -121.14 gain 77 104 -127.22 gain 104 77 -128.15 gain 77 105 -108.77 gain 105 77 -105.64 gain 77 106 -104.61 gain 106 77 -102.56 gain 77 107 -107.04 gain 107 77 -111.57 gain 77 108 -117.39 gain 108 77 -114.24 gain 77 109 -109.08 gain 109 77 -109.42 gain 77 110 -112.78 gain 110 77 -111.58 gain 77 111 -114.50 gain 111 77 -112.98 gain 77 112 -125.83 gain 112 77 -123.20 gain 77 113 -115.30 gain 113 77 -111.46 gain 77 114 -117.95 gain 114 77 -117.42 gain 77 115 -121.83 gain 115 77 -115.61 gain 77 116 -133.50 gain 116 77 -134.82 gain 77 117 -124.04 gain 117 77 -126.85 gain 77 118 -124.30 gain 118 77 -125.43 gain 77 119 -123.91 gain 119 77 -119.70 gain 77 120 -111.49 gain 120 77 -111.80 gain 77 121 -107.06 gain 121 77 -106.66 gain 77 122 -99.04 gain 122 77 -100.75 gain 77 123 -104.68 gain 123 77 -107.18 gain 77 124 -105.53 gain 124 77 -104.44 gain 77 125 -111.18 gain 125 77 -111.42 gain 77 126 -118.08 gain 126 77 -116.28 gain 77 127 -119.17 gain 127 77 -120.82 gain 77 128 -121.98 gain 128 77 -121.57 gain 77 129 -123.59 gain 129 77 -121.09 gain 77 130 -128.61 gain 130 77 -123.94 gain 77 131 -121.01 gain 131 77 -123.43 gain 77 132 -123.12 gain 132 77 -125.16 gain 77 133 -129.68 gain 133 77 -129.79 gain 77 134 -127.39 gain 134 77 -124.20 gain 77 135 -119.73 gain 135 77 -120.11 gain 77 136 -111.11 gain 136 77 -112.10 gain 77 137 -107.78 gain 137 77 -106.25 gain 77 138 -112.76 gain 138 77 -110.23 gain 77 139 -109.37 gain 139 77 -107.83 gain 77 140 -112.12 gain 140 77 -113.19 gain 77 141 -115.76 gain 141 77 -115.50 gain 77 142 -123.48 gain 142 77 -122.53 gain 77 143 -122.49 gain 143 77 -121.16 gain 77 144 -127.90 gain 144 77 -127.58 gain 77 145 -128.71 gain 145 77 -126.84 gain 77 146 -126.94 gain 146 77 -123.98 gain 77 147 -124.03 gain 147 77 -118.16 gain 77 148 -116.93 gain 148 77 -110.77 gain 77 149 -124.02 gain 149 77 -121.03 gain 77 150 -119.02 gain 150 77 -118.72 gain 77 151 -119.21 gain 151 77 -119.10 gain 77 152 -115.86 gain 152 77 -112.73 gain 77 153 -120.90 gain 153 77 -115.35 gain 77 154 -117.31 gain 154 77 -120.31 gain 77 155 -118.73 gain 155 77 -121.63 gain 77 156 -115.72 gain 156 77 -113.00 gain 77 157 -122.47 gain 157 77 -122.70 gain 77 158 -114.58 gain 158 77 -117.40 gain 77 159 -122.97 gain 159 77 -122.41 gain 77 160 -120.38 gain 160 77 -116.93 gain 77 161 -131.30 gain 161 77 -131.34 gain 77 162 -115.06 gain 162 77 -113.97 gain 77 163 -127.89 gain 163 77 -128.95 gain 77 164 -129.85 gain 164 77 -131.95 gain 77 165 -122.97 gain 165 77 -121.11 gain 77 166 -118.27 gain 166 77 -117.98 gain 77 167 -117.82 gain 167 77 -119.61 gain 77 168 -119.13 gain 168 77 -119.38 gain 77 169 -118.48 gain 169 77 -122.93 gain 77 170 -118.89 gain 170 77 -114.86 gain 77 171 -119.73 gain 171 77 -120.73 gain 77 172 -116.00 gain 172 77 -111.69 gain 77 173 -121.84 gain 173 77 -116.97 gain 77 174 -120.75 gain 174 77 -120.18 gain 77 175 -126.08 gain 175 77 -129.06 gain 77 176 -127.96 gain 176 77 -122.95 gain 77 177 -131.19 gain 177 77 -133.99 gain 77 178 -129.98 gain 178 77 -128.61 gain 77 179 -128.85 gain 179 77 -125.87 gain 77 180 -124.35 gain 180 77 -122.84 gain 77 181 -124.74 gain 181 77 -123.30 gain 77 182 -118.54 gain 182 77 -119.49 gain 77 183 -118.41 gain 183 77 -112.74 gain 77 184 -121.39 gain 184 77 -120.50 gain 77 185 -120.16 gain 185 77 -116.76 gain 77 186 -124.69 gain 186 77 -121.57 gain 77 187 -125.00 gain 187 77 -124.42 gain 77 188 -124.92 gain 188 77 -127.61 gain 77 189 -120.97 gain 189 77 -121.17 gain 77 190 -122.55 gain 190 77 -119.76 gain 77 191 -128.94 gain 191 77 -127.24 gain 77 192 -129.07 gain 192 77 -130.24 gain 77 193 -129.26 gain 193 77 -131.68 gain 77 194 -128.40 gain 194 77 -124.63 gain 77 195 -115.07 gain 195 77 -111.93 gain 77 196 -130.55 gain 196 77 -131.45 gain 77 197 -116.68 gain 197 77 -113.64 gain 77 198 -117.17 gain 198 77 -113.66 gain 77 199 -123.89 gain 199 77 -124.29 gain 77 200 -117.92 gain 200 77 -115.26 gain 77 201 -119.68 gain 201 77 -117.83 gain 77 202 -120.93 gain 202 77 -123.08 gain 77 203 -127.70 gain 203 77 -129.47 gain 77 204 -122.76 gain 204 77 -121.81 gain 77 205 -124.47 gain 205 77 -122.59 gain 77 206 -121.68 gain 206 77 -124.33 gain 77 207 -126.72 gain 207 77 -121.72 gain 77 208 -127.39 gain 208 77 -128.17 gain 77 209 -130.79 gain 209 77 -132.57 gain 77 210 -121.96 gain 210 77 -120.68 gain 77 211 -115.89 gain 211 77 -116.63 gain 77 212 -128.53 gain 212 77 -127.80 gain 77 213 -121.11 gain 213 77 -119.58 gain 77 214 -126.22 gain 214 77 -124.58 gain 77 215 -122.38 gain 215 77 -117.15 gain 77 216 -124.46 gain 216 77 -123.90 gain 77 217 -124.22 gain 217 77 -124.17 gain 77 218 -125.43 gain 218 77 -127.57 gain 77 219 -125.73 gain 219 77 -119.23 gain 77 220 -119.56 gain 220 77 -123.55 gain 77 221 -127.53 gain 221 77 -127.17 gain 77 222 -127.97 gain 222 77 -127.93 gain 77 223 -129.68 gain 223 77 -128.25 gain 77 224 -131.38 gain 224 77 -132.64 gain 78 79 -93.87 gain 79 78 -88.65 gain 78 80 -110.22 gain 80 78 -105.50 gain 78 81 -111.78 gain 81 78 -107.66 gain 78 82 -107.04 gain 82 78 -100.54 gain 78 83 -117.27 gain 83 78 -111.80 gain 78 84 -120.07 gain 84 78 -114.75 gain 78 85 -121.23 gain 85 78 -112.72 gain 78 86 -125.37 gain 86 78 -120.24 gain 78 87 -130.55 gain 87 78 -129.38 gain 78 88 -127.42 gain 88 78 -124.01 gain 78 89 -134.61 gain 89 78 -129.79 gain 78 90 -116.20 gain 90 78 -108.39 gain 78 91 -107.17 gain 91 78 -103.30 gain 78 92 -97.11 gain 92 78 -90.21 gain 78 93 -96.77 gain 93 78 -94.66 gain 78 94 -105.58 gain 94 78 -103.34 gain 78 95 -94.32 gain 95 78 -94.33 gain 78 96 -106.89 gain 96 78 -104.24 gain 78 97 -117.87 gain 97 78 -113.97 gain 78 98 -119.74 gain 98 78 -116.63 gain 78 99 -120.99 gain 99 78 -115.70 gain 78 100 -121.66 gain 100 78 -115.94 gain 78 101 -128.76 gain 101 78 -123.20 gain 78 102 -127.17 gain 102 78 -122.39 gain 78 103 -126.40 gain 103 78 -119.11 gain 78 104 -131.52 gain 104 78 -129.60 gain 78 105 -112.61 gain 105 78 -106.64 gain 78 106 -113.51 gain 106 78 -108.62 gain 78 107 -98.89 gain 107 78 -100.57 gain 78 108 -103.45 gain 108 78 -97.44 gain 78 109 -107.34 gain 109 78 -104.82 gain 78 110 -115.67 gain 110 78 -111.62 gain 78 111 -110.48 gain 111 78 -106.11 gain 78 112 -110.06 gain 112 78 -104.58 gain 78 113 -121.66 gain 113 78 -114.98 gain 78 114 -118.33 gain 114 78 -114.95 gain 78 115 -125.89 gain 115 78 -116.81 gain 78 116 -125.73 gain 116 78 -124.20 gain 78 117 -131.00 gain 117 78 -130.97 gain 78 118 -125.39 gain 118 78 -123.68 gain 78 119 -128.21 gain 119 78 -121.16 gain 78 120 -111.95 gain 120 78 -109.42 gain 78 121 -113.38 gain 121 78 -110.13 gain 78 122 -114.28 gain 122 78 -113.15 gain 78 123 -116.35 gain 123 78 -115.99 gain 78 124 -118.37 gain 124 78 -114.43 gain 78 125 -114.59 gain 125 78 -111.98 gain 78 126 -116.36 gain 126 78 -111.70 gain 78 127 -114.13 gain 127 78 -112.93 gain 78 128 -121.80 gain 128 78 -118.55 gain 78 129 -122.04 gain 129 78 -116.69 gain 78 130 -121.63 gain 130 78 -114.11 gain 78 131 -118.49 gain 131 78 -118.05 gain 78 132 -124.11 gain 132 78 -123.30 gain 78 133 -126.55 gain 133 78 -123.81 gain 78 134 -130.12 gain 134 78 -124.08 gain 78 135 -121.61 gain 135 78 -119.14 gain 78 136 -120.20 gain 136 78 -118.35 gain 78 137 -115.14 gain 137 78 -110.76 gain 78 138 -111.70 gain 138 78 -106.33 gain 78 139 -114.98 gain 139 78 -110.59 gain 78 140 -116.88 gain 140 78 -115.09 gain 78 141 -116.08 gain 141 78 -112.97 gain 78 142 -118.14 gain 142 78 -114.34 gain 78 143 -130.17 gain 143 78 -125.98 gain 78 144 -125.79 gain 144 78 -122.62 gain 78 145 -130.48 gain 145 78 -125.76 gain 78 146 -123.81 gain 146 78 -118.00 gain 78 147 -124.98 gain 147 78 -116.26 gain 78 148 -131.17 gain 148 78 -122.17 gain 78 149 -133.94 gain 149 78 -128.10 gain 78 150 -115.86 gain 150 78 -112.71 gain 78 151 -116.73 gain 151 78 -113.77 gain 78 152 -116.21 gain 152 78 -110.23 gain 78 153 -116.48 gain 153 78 -108.08 gain 78 154 -115.23 gain 154 78 -115.37 gain 78 155 -117.99 gain 155 78 -118.03 gain 78 156 -126.84 gain 156 78 -121.28 gain 78 157 -124.27 gain 157 78 -121.65 gain 78 158 -115.32 gain 158 78 -115.29 gain 78 159 -125.84 gain 159 78 -122.43 gain 78 160 -123.13 gain 160 78 -116.83 gain 78 161 -125.65 gain 161 78 -122.84 gain 78 162 -127.05 gain 162 78 -123.11 gain 78 163 -128.30 gain 163 78 -126.50 gain 78 164 -130.05 gain 164 78 -129.29 gain 78 165 -120.09 gain 165 78 -115.38 gain 78 166 -125.89 gain 166 78 -122.75 gain 78 167 -113.94 gain 167 78 -112.88 gain 78 168 -121.00 gain 168 78 -118.40 gain 78 169 -120.93 gain 169 78 -122.53 gain 78 170 -120.50 gain 170 78 -113.63 gain 78 171 -114.65 gain 171 78 -112.80 gain 78 172 -126.31 gain 172 78 -119.15 gain 78 173 -124.62 gain 173 78 -116.90 gain 78 174 -126.34 gain 174 78 -122.91 gain 78 175 -128.15 gain 175 78 -128.28 gain 78 176 -116.20 gain 176 78 -108.34 gain 78 177 -124.84 gain 177 78 -124.79 gain 78 178 -129.03 gain 178 78 -124.80 gain 78 179 -130.05 gain 179 78 -124.22 gain 78 180 -119.87 gain 180 78 -115.51 gain 78 181 -122.90 gain 181 78 -118.61 gain 78 182 -123.59 gain 182 78 -121.68 gain 78 183 -126.27 gain 183 78 -117.75 gain 78 184 -127.13 gain 184 78 -123.39 gain 78 185 -124.72 gain 185 78 -118.47 gain 78 186 -122.71 gain 186 78 -116.74 gain 78 187 -121.50 gain 187 78 -118.08 gain 78 188 -127.18 gain 188 78 -127.02 gain 78 189 -126.16 gain 189 78 -123.51 gain 78 190 -124.27 gain 190 78 -118.63 gain 78 191 -131.35 gain 191 78 -126.80 gain 78 192 -128.42 gain 192 78 -126.74 gain 78 193 -128.97 gain 193 78 -128.53 gain 78 194 -127.15 gain 194 78 -120.53 gain 78 195 -129.20 gain 195 78 -123.21 gain 78 196 -126.31 gain 196 78 -124.37 gain 78 197 -120.69 gain 197 78 -114.80 gain 78 198 -124.82 gain 198 78 -118.46 gain 78 199 -119.60 gain 199 78 -117.15 gain 78 200 -124.04 gain 200 78 -118.53 gain 78 201 -125.92 gain 201 78 -121.22 gain 78 202 -121.44 gain 202 78 -120.74 gain 78 203 -132.92 gain 203 78 -131.84 gain 78 204 -128.79 gain 204 78 -125.00 gain 78 205 -130.59 gain 205 78 -125.87 gain 78 206 -134.50 gain 206 78 -134.30 gain 78 207 -124.60 gain 207 78 -116.76 gain 78 208 -131.17 gain 208 78 -129.11 gain 78 209 -134.49 gain 209 78 -133.42 gain 78 210 -133.97 gain 210 78 -129.83 gain 78 211 -133.28 gain 211 78 -131.17 gain 78 212 -127.98 gain 212 78 -124.41 gain 78 213 -125.38 gain 213 78 -121.00 gain 78 214 -126.57 gain 214 78 -122.08 gain 78 215 -122.23 gain 215 78 -114.15 gain 78 216 -131.00 gain 216 78 -127.58 gain 78 217 -130.59 gain 217 78 -127.69 gain 78 218 -131.80 gain 218 78 -131.10 gain 78 219 -127.53 gain 219 78 -118.19 gain 78 220 -124.47 gain 220 78 -125.61 gain 78 221 -128.18 gain 221 78 -124.97 gain 78 222 -133.68 gain 222 78 -130.79 gain 78 223 -137.63 gain 223 78 -133.35 gain 78 224 -131.00 gain 224 78 -129.42 gain 79 80 -86.72 gain 80 79 -87.22 gain 79 81 -104.41 gain 81 79 -105.50 gain 79 82 -100.96 gain 82 79 -99.69 gain 79 83 -109.78 gain 83 79 -109.54 gain 79 84 -108.81 gain 84 79 -108.72 gain 79 85 -114.48 gain 85 79 -111.19 gain 79 86 -112.78 gain 86 79 -112.87 gain 79 87 -113.65 gain 87 79 -117.70 gain 79 88 -123.11 gain 88 79 -124.91 gain 79 89 -122.65 gain 89 79 -123.06 gain 79 90 -114.48 gain 90 79 -111.89 gain 79 91 -105.15 gain 91 79 -106.51 gain 79 92 -90.84 gain 92 79 -89.16 gain 79 93 -96.04 gain 93 79 -99.15 gain 79 94 -94.76 gain 94 79 -97.74 gain 79 95 -99.77 gain 95 79 -105.01 gain 79 96 -105.19 gain 96 79 -107.76 gain 79 97 -106.42 gain 97 79 -107.74 gain 79 98 -116.06 gain 98 79 -118.17 gain 79 99 -116.27 gain 99 79 -116.20 gain 79 100 -110.21 gain 100 79 -109.71 gain 79 101 -116.02 gain 101 79 -115.69 gain 79 102 -125.63 gain 102 79 -126.08 gain 79 103 -124.07 gain 103 79 -122.00 gain 79 104 -126.43 gain 104 79 -129.74 gain 79 105 -111.09 gain 105 79 -110.34 gain 79 106 -108.62 gain 106 79 -108.95 gain 79 107 -108.28 gain 107 79 -115.18 gain 79 108 -109.21 gain 108 79 -108.42 gain 79 109 -98.62 gain 109 79 -101.33 gain 79 110 -103.84 gain 110 79 -105.02 gain 79 111 -102.25 gain 111 79 -103.11 gain 79 112 -106.04 gain 112 79 -105.78 gain 79 113 -109.97 gain 113 79 -108.51 gain 79 114 -114.86 gain 114 79 -116.70 gain 79 115 -120.56 gain 115 79 -116.70 gain 79 116 -119.80 gain 116 79 -123.48 gain 79 117 -121.15 gain 117 79 -126.33 gain 79 118 -118.95 gain 118 79 -122.46 gain 79 119 -126.08 gain 119 79 -124.24 gain 79 120 -109.08 gain 120 79 -111.76 gain 79 121 -112.75 gain 121 79 -114.72 gain 79 122 -116.02 gain 122 79 -120.11 gain 79 123 -104.24 gain 123 79 -109.11 gain 79 124 -104.20 gain 124 79 -105.48 gain 79 125 -106.18 gain 125 79 -108.79 gain 79 126 -105.54 gain 126 79 -106.10 gain 79 127 -108.52 gain 127 79 -112.55 gain 79 128 -113.78 gain 128 79 -115.75 gain 79 129 -115.68 gain 129 79 -115.56 gain 79 130 -115.56 gain 130 79 -113.26 gain 79 131 -123.37 gain 131 79 -128.16 gain 79 132 -118.43 gain 132 79 -122.85 gain 79 133 -118.22 gain 133 79 -120.70 gain 79 134 -120.47 gain 134 79 -119.65 gain 79 135 -111.20 gain 135 79 -113.95 gain 79 136 -112.56 gain 136 79 -115.92 gain 79 137 -114.27 gain 137 79 -115.12 gain 79 138 -114.49 gain 138 79 -114.34 gain 79 139 -108.49 gain 139 79 -109.32 gain 79 140 -106.81 gain 140 79 -110.25 gain 79 141 -109.21 gain 141 79 -111.32 gain 79 142 -107.89 gain 142 79 -109.30 gain 79 143 -114.53 gain 143 79 -115.56 gain 79 144 -112.56 gain 144 79 -114.62 gain 79 145 -120.88 gain 145 79 -121.38 gain 79 146 -118.90 gain 146 79 -118.31 gain 79 147 -122.76 gain 147 79 -119.26 gain 79 148 -121.71 gain 148 79 -117.93 gain 79 149 -120.61 gain 149 79 -120.00 gain 79 150 -117.02 gain 150 79 -119.09 gain 79 151 -112.27 gain 151 79 -114.53 gain 79 152 -110.26 gain 152 79 -109.51 gain 79 153 -113.44 gain 153 79 -110.26 gain 79 154 -114.42 gain 154 79 -119.79 gain 79 155 -114.59 gain 155 79 -119.86 gain 79 156 -114.13 gain 156 79 -113.79 gain 79 157 -111.18 gain 157 79 -113.78 gain 79 158 -111.74 gain 158 79 -116.93 gain 79 159 -112.85 gain 159 79 -114.66 gain 79 160 -119.39 gain 160 79 -118.31 gain 79 161 -122.04 gain 161 79 -124.46 gain 79 162 -121.50 gain 162 79 -122.78 gain 79 163 -121.34 gain 163 79 -124.76 gain 79 164 -126.45 gain 164 79 -130.92 gain 79 165 -117.02 gain 165 79 -117.53 gain 79 166 -112.40 gain 166 79 -114.48 gain 79 167 -118.62 gain 167 79 -122.79 gain 79 168 -116.57 gain 168 79 -119.19 gain 79 169 -122.28 gain 169 79 -129.09 gain 79 170 -122.01 gain 170 79 -120.35 gain 79 171 -110.76 gain 171 79 -114.12 gain 79 172 -112.54 gain 172 79 -110.61 gain 79 173 -115.80 gain 173 79 -113.30 gain 79 174 -115.45 gain 174 79 -117.25 gain 79 175 -118.96 gain 175 79 -124.32 gain 79 176 -121.03 gain 176 79 -118.40 gain 79 177 -125.39 gain 177 79 -130.57 gain 79 178 -124.27 gain 178 79 -125.27 gain 79 179 -121.82 gain 179 79 -121.21 gain 79 180 -115.15 gain 180 79 -116.01 gain 79 181 -123.85 gain 181 79 -124.78 gain 79 182 -117.17 gain 182 79 -120.48 gain 79 183 -119.94 gain 183 79 -116.65 gain 79 184 -117.67 gain 184 79 -119.15 gain 79 185 -117.66 gain 185 79 -116.63 gain 79 186 -122.01 gain 186 79 -121.26 gain 79 187 -122.21 gain 187 79 -124.01 gain 79 188 -118.42 gain 188 79 -123.48 gain 79 189 -118.37 gain 189 79 -120.95 gain 79 190 -121.30 gain 190 79 -120.88 gain 79 191 -117.10 gain 191 79 -117.77 gain 79 192 -122.18 gain 192 79 -125.72 gain 79 193 -127.64 gain 193 79 -132.43 gain 79 194 -131.65 gain 194 79 -130.25 gain 79 195 -122.18 gain 195 79 -121.41 gain 79 196 -114.97 gain 196 79 -118.24 gain 79 197 -119.75 gain 197 79 -119.09 gain 79 198 -119.73 gain 198 79 -118.59 gain 79 199 -118.93 gain 199 79 -121.71 gain 79 200 -115.23 gain 200 79 -114.94 gain 79 201 -121.81 gain 201 79 -122.33 gain 79 202 -115.90 gain 202 79 -120.42 gain 79 203 -121.84 gain 203 79 -125.97 gain 79 204 -122.34 gain 204 79 -123.76 gain 79 205 -120.14 gain 205 79 -120.64 gain 79 206 -124.17 gain 206 79 -129.19 gain 79 207 -125.66 gain 207 79 -123.04 gain 79 208 -127.47 gain 208 79 -130.63 gain 79 209 -119.71 gain 209 79 -123.85 gain 79 210 -121.26 gain 210 79 -122.35 gain 79 211 -124.35 gain 211 79 -127.46 gain 79 212 -123.15 gain 212 79 -124.80 gain 79 213 -124.36 gain 213 79 -125.20 gain 79 214 -117.10 gain 214 79 -117.83 gain 79 215 -118.79 gain 215 79 -115.94 gain 79 216 -128.78 gain 216 79 -130.58 gain 79 217 -119.94 gain 217 79 -122.26 gain 79 218 -136.88 gain 218 79 -141.39 gain 79 219 -128.91 gain 219 79 -124.78 gain 79 220 -122.86 gain 220 79 -129.22 gain 79 221 -123.17 gain 221 79 -125.17 gain 79 222 -123.29 gain 222 79 -125.62 gain 79 223 -129.93 gain 223 79 -130.88 gain 79 224 -122.80 gain 224 79 -126.43 gain 80 81 -93.32 gain 81 80 -93.91 gain 80 82 -105.26 gain 82 80 -103.48 gain 80 83 -101.59 gain 83 80 -100.84 gain 80 84 -112.10 gain 84 80 -111.50 gain 80 85 -112.83 gain 85 80 -109.04 gain 80 86 -120.84 gain 86 80 -120.43 gain 80 87 -115.39 gain 87 80 -118.94 gain 80 88 -117.32 gain 88 80 -118.62 gain 80 89 -121.99 gain 89 80 -121.89 gain 80 90 -109.48 gain 90 80 -106.39 gain 80 91 -104.27 gain 91 80 -105.13 gain 80 92 -108.09 gain 92 80 -105.91 gain 80 93 -99.70 gain 93 80 -102.30 gain 80 94 -99.20 gain 94 80 -101.68 gain 80 95 -92.84 gain 95 80 -97.57 gain 80 96 -100.99 gain 96 80 -103.06 gain 80 97 -99.69 gain 97 80 -100.51 gain 80 98 -102.13 gain 98 80 -103.74 gain 80 99 -109.68 gain 99 80 -109.12 gain 80 100 -112.83 gain 100 80 -111.83 gain 80 101 -116.27 gain 101 80 -115.44 gain 80 102 -121.93 gain 102 80 -121.88 gain 80 103 -125.83 gain 103 80 -123.26 gain 80 104 -122.40 gain 104 80 -125.20 gain 80 105 -122.02 gain 105 80 -120.76 gain 80 106 -113.37 gain 106 80 -113.20 gain 80 107 -108.52 gain 107 80 -114.91 gain 80 108 -105.04 gain 108 80 -103.76 gain 80 109 -101.82 gain 109 80 -104.03 gain 80 110 -103.08 gain 110 80 -103.76 gain 80 111 -104.23 gain 111 80 -104.58 gain 80 112 -103.74 gain 112 80 -102.97 gain 80 113 -99.36 gain 113 80 -97.39 gain 80 114 -111.51 gain 114 80 -112.85 gain 80 115 -119.83 gain 115 80 -115.47 gain 80 116 -114.44 gain 116 80 -117.62 gain 80 117 -122.13 gain 117 80 -126.81 gain 80 118 -127.85 gain 118 80 -130.86 gain 80 119 -120.63 gain 119 80 -118.30 gain 80 120 -112.18 gain 120 80 -114.36 gain 80 121 -109.56 gain 121 80 -111.03 gain 80 122 -115.58 gain 122 80 -119.16 gain 80 123 -110.70 gain 123 80 -115.06 gain 80 124 -111.94 gain 124 80 -112.72 gain 80 125 -104.75 gain 125 80 -106.86 gain 80 126 -106.73 gain 126 80 -106.80 gain 80 127 -108.25 gain 127 80 -111.78 gain 80 128 -108.56 gain 128 80 -110.03 gain 80 129 -126.07 gain 129 80 -125.45 gain 80 130 -114.17 gain 130 80 -111.37 gain 80 131 -111.39 gain 131 80 -115.68 gain 80 132 -118.14 gain 132 80 -122.05 gain 80 133 -122.78 gain 133 80 -124.76 gain 80 134 -118.03 gain 134 80 -116.71 gain 80 135 -118.61 gain 135 80 -120.86 gain 80 136 -116.14 gain 136 80 -119.00 gain 80 137 -120.92 gain 137 80 -121.27 gain 80 138 -107.25 gain 138 80 -106.60 gain 80 139 -112.72 gain 139 80 -113.05 gain 80 140 -119.12 gain 140 80 -122.05 gain 80 141 -110.43 gain 141 80 -112.04 gain 80 142 -113.40 gain 142 80 -114.32 gain 80 143 -120.48 gain 143 80 -121.01 gain 80 144 -112.71 gain 144 80 -114.26 gain 80 145 -116.13 gain 145 80 -116.12 gain 80 146 -123.85 gain 146 80 -122.76 gain 80 147 -124.49 gain 147 80 -120.49 gain 80 148 -124.25 gain 148 80 -119.96 gain 80 149 -126.31 gain 149 80 -125.19 gain 80 150 -123.18 gain 150 80 -124.75 gain 80 151 -117.65 gain 151 80 -119.41 gain 80 152 -115.56 gain 152 80 -114.31 gain 80 153 -111.54 gain 153 80 -107.86 gain 80 154 -111.56 gain 154 80 -116.42 gain 80 155 -110.82 gain 155 80 -115.59 gain 80 156 -115.48 gain 156 80 -114.63 gain 80 157 -109.03 gain 157 80 -111.13 gain 80 158 -114.92 gain 158 80 -119.61 gain 80 159 -119.40 gain 159 80 -120.70 gain 80 160 -121.10 gain 160 80 -119.53 gain 80 161 -116.17 gain 161 80 -118.08 gain 80 162 -116.01 gain 162 80 -116.79 gain 80 163 -118.85 gain 163 80 -121.77 gain 80 164 -125.88 gain 164 80 -129.85 gain 80 165 -118.70 gain 165 80 -118.70 gain 80 166 -124.83 gain 166 80 -126.40 gain 80 167 -115.40 gain 167 80 -119.07 gain 80 168 -118.09 gain 168 80 -120.21 gain 80 169 -118.10 gain 169 80 -124.41 gain 80 170 -113.39 gain 170 80 -111.23 gain 80 171 -112.33 gain 171 80 -115.20 gain 80 172 -117.06 gain 172 80 -114.62 gain 80 173 -115.01 gain 173 80 -112.01 gain 80 174 -118.03 gain 174 80 -119.32 gain 80 175 -123.79 gain 175 80 -128.64 gain 80 176 -120.83 gain 176 80 -117.69 gain 80 177 -114.60 gain 177 80 -119.27 gain 80 178 -124.23 gain 178 80 -124.73 gain 80 179 -129.42 gain 179 80 -128.31 gain 80 180 -121.30 gain 180 80 -121.66 gain 80 181 -123.17 gain 181 80 -123.59 gain 80 182 -120.58 gain 182 80 -123.39 gain 80 183 -120.31 gain 183 80 -116.51 gain 80 184 -124.39 gain 184 80 -125.37 gain 80 185 -118.34 gain 185 80 -116.81 gain 80 186 -125.71 gain 186 80 -124.47 gain 80 187 -112.39 gain 187 80 -113.69 gain 80 188 -122.56 gain 188 80 -127.11 gain 80 189 -124.71 gain 189 80 -126.78 gain 80 190 -122.39 gain 190 80 -121.47 gain 80 191 -121.38 gain 191 80 -121.55 gain 80 192 -118.02 gain 192 80 -121.05 gain 80 193 -123.45 gain 193 80 -127.74 gain 80 194 -127.84 gain 194 80 -125.94 gain 80 195 -131.45 gain 195 80 -130.18 gain 80 196 -119.12 gain 196 80 -121.89 gain 80 197 -126.82 gain 197 80 -125.66 gain 80 198 -121.70 gain 198 80 -120.05 gain 80 199 -119.91 gain 199 80 -122.18 gain 80 200 -120.06 gain 200 80 -119.27 gain 80 201 -119.04 gain 201 80 -119.06 gain 80 202 -116.15 gain 202 80 -120.17 gain 80 203 -118.81 gain 203 80 -122.45 gain 80 204 -116.99 gain 204 80 -117.91 gain 80 205 -123.34 gain 205 80 -123.33 gain 80 206 -120.53 gain 206 80 -125.04 gain 80 207 -122.91 gain 207 80 -119.79 gain 80 208 -120.85 gain 208 80 -123.51 gain 80 209 -121.52 gain 209 80 -125.16 gain 80 210 -123.50 gain 210 80 -124.08 gain 80 211 -124.63 gain 211 80 -127.24 gain 80 212 -117.29 gain 212 80 -118.44 gain 80 213 -113.67 gain 213 80 -114.01 gain 80 214 -124.28 gain 214 80 -124.51 gain 80 215 -122.29 gain 215 80 -118.93 gain 80 216 -124.88 gain 216 80 -126.19 gain 80 217 -120.87 gain 217 80 -122.70 gain 80 218 -125.27 gain 218 80 -129.28 gain 80 219 -126.71 gain 219 80 -122.08 gain 80 220 -112.87 gain 220 80 -118.73 gain 80 221 -122.01 gain 221 80 -123.52 gain 80 222 -127.28 gain 222 80 -129.11 gain 80 223 -118.30 gain 223 80 -118.75 gain 80 224 -119.60 gain 224 80 -122.73 gain 81 82 -96.85 gain 82 81 -94.48 gain 81 83 -103.28 gain 83 81 -101.94 gain 81 84 -108.14 gain 84 81 -106.95 gain 81 85 -113.44 gain 85 81 -109.05 gain 81 86 -111.46 gain 86 81 -110.46 gain 81 87 -116.15 gain 87 81 -119.11 gain 81 88 -110.91 gain 88 81 -111.62 gain 81 89 -124.93 gain 89 81 -124.24 gain 81 90 -118.45 gain 90 81 -114.77 gain 81 91 -112.09 gain 91 81 -112.36 gain 81 92 -115.71 gain 92 81 -112.94 gain 81 93 -109.08 gain 93 81 -111.09 gain 81 94 -107.28 gain 94 81 -109.17 gain 81 95 -95.48 gain 95 81 -99.62 gain 81 96 -84.99 gain 96 81 -86.47 gain 81 97 -93.81 gain 97 81 -94.03 gain 81 98 -105.78 gain 98 81 -106.80 gain 81 99 -108.64 gain 99 81 -107.49 gain 81 100 -109.38 gain 100 81 -107.79 gain 81 101 -112.16 gain 101 81 -110.73 gain 81 102 -124.33 gain 102 81 -123.68 gain 81 103 -111.76 gain 103 81 -108.60 gain 81 104 -119.67 gain 104 81 -121.89 gain 81 105 -112.49 gain 105 81 -110.64 gain 81 106 -116.82 gain 106 81 -116.06 gain 81 107 -113.16 gain 107 81 -118.96 gain 81 108 -111.36 gain 108 81 -109.48 gain 81 109 -106.50 gain 109 81 -108.11 gain 81 110 -100.65 gain 110 81 -100.73 gain 81 111 -93.93 gain 111 81 -93.69 gain 81 112 -100.25 gain 112 81 -98.89 gain 81 113 -110.32 gain 113 81 -107.77 gain 81 114 -118.01 gain 114 81 -118.76 gain 81 115 -112.84 gain 115 81 -107.89 gain 81 116 -114.95 gain 116 81 -117.55 gain 81 117 -124.86 gain 117 81 -128.95 gain 81 118 -122.00 gain 118 81 -124.42 gain 81 119 -124.20 gain 119 81 -121.28 gain 81 120 -121.79 gain 120 81 -123.38 gain 81 121 -117.73 gain 121 81 -118.61 gain 81 122 -109.93 gain 122 81 -112.92 gain 81 123 -117.93 gain 123 81 -121.70 gain 81 124 -105.35 gain 124 81 -105.54 gain 81 125 -105.80 gain 125 81 -107.32 gain 81 126 -109.76 gain 126 81 -109.24 gain 81 127 -108.25 gain 127 81 -111.18 gain 81 128 -107.31 gain 128 81 -108.19 gain 81 129 -111.36 gain 129 81 -110.14 gain 81 130 -117.85 gain 130 81 -114.45 gain 81 131 -113.31 gain 131 81 -117.00 gain 81 132 -118.01 gain 132 81 -121.32 gain 81 133 -120.43 gain 133 81 -121.82 gain 81 134 -119.30 gain 134 81 -117.39 gain 81 135 -121.86 gain 135 81 -123.52 gain 81 136 -127.59 gain 136 81 -129.86 gain 81 137 -118.06 gain 137 81 -117.81 gain 81 138 -118.02 gain 138 81 -116.77 gain 81 139 -107.47 gain 139 81 -107.21 gain 81 140 -105.40 gain 140 81 -107.75 gain 81 141 -106.53 gain 141 81 -107.55 gain 81 142 -115.60 gain 142 81 -115.93 gain 81 143 -111.46 gain 143 81 -111.40 gain 81 144 -108.06 gain 144 81 -109.02 gain 81 145 -121.71 gain 145 81 -121.12 gain 81 146 -120.83 gain 146 81 -119.15 gain 81 147 -118.54 gain 147 81 -113.95 gain 81 148 -114.59 gain 148 81 -109.71 gain 81 149 -123.21 gain 149 81 -121.50 gain 81 150 -125.59 gain 150 81 -126.57 gain 81 151 -121.14 gain 151 81 -122.32 gain 81 152 -123.74 gain 152 81 -121.89 gain 81 153 -111.80 gain 153 81 -107.52 gain 81 154 -107.02 gain 154 81 -111.30 gain 81 155 -110.91 gain 155 81 -115.08 gain 81 156 -103.47 gain 156 81 -102.03 gain 81 157 -116.96 gain 157 81 -118.47 gain 81 158 -110.68 gain 158 81 -114.78 gain 81 159 -120.95 gain 159 81 -121.67 gain 81 160 -116.63 gain 160 81 -114.46 gain 81 161 -116.26 gain 161 81 -117.58 gain 81 162 -124.81 gain 162 81 -124.99 gain 81 163 -122.52 gain 163 81 -124.85 gain 81 164 -117.50 gain 164 81 -120.87 gain 81 165 -122.59 gain 165 81 -122.01 gain 81 166 -124.56 gain 166 81 -125.54 gain 81 167 -118.54 gain 167 81 -121.61 gain 81 168 -113.05 gain 168 81 -114.58 gain 81 169 -116.80 gain 169 81 -122.53 gain 81 170 -112.47 gain 170 81 -109.72 gain 81 171 -120.65 gain 171 81 -122.92 gain 81 172 -123.67 gain 172 81 -120.64 gain 81 173 -118.59 gain 173 81 -115.00 gain 81 174 -110.85 gain 174 81 -111.56 gain 81 175 -123.99 gain 175 81 -128.25 gain 81 176 -118.72 gain 176 81 -114.99 gain 81 177 -126.31 gain 177 81 -130.39 gain 81 178 -123.15 gain 178 81 -123.05 gain 81 179 -119.83 gain 179 81 -118.12 gain 81 180 -122.51 gain 180 81 -122.28 gain 81 181 -123.86 gain 181 81 -123.69 gain 81 182 -121.13 gain 182 81 -123.35 gain 81 183 -111.50 gain 183 81 -107.11 gain 81 184 -126.55 gain 184 81 -126.94 gain 81 185 -116.84 gain 185 81 -114.72 gain 81 186 -116.89 gain 186 81 -115.05 gain 81 187 -116.21 gain 187 81 -116.91 gain 81 188 -113.71 gain 188 81 -117.67 gain 81 189 -124.67 gain 189 81 -126.14 gain 81 190 -122.93 gain 190 81 -121.42 gain 81 191 -112.44 gain 191 81 -112.02 gain 81 192 -126.41 gain 192 81 -128.86 gain 81 193 -125.40 gain 193 81 -129.10 gain 81 194 -126.03 gain 194 81 -123.53 gain 81 195 -129.88 gain 195 81 -128.02 gain 81 196 -119.56 gain 196 81 -121.74 gain 81 197 -126.66 gain 197 81 -124.91 gain 81 198 -119.49 gain 198 81 -117.26 gain 81 199 -116.04 gain 199 81 -117.72 gain 81 200 -117.35 gain 200 81 -115.97 gain 81 201 -118.54 gain 201 81 -117.97 gain 81 202 -121.69 gain 202 81 -125.12 gain 81 203 -125.16 gain 203 81 -128.20 gain 81 204 -124.69 gain 204 81 -125.02 gain 81 205 -120.62 gain 205 81 -120.02 gain 81 206 -119.83 gain 206 81 -123.75 gain 81 207 -117.88 gain 207 81 -114.17 gain 81 208 -120.40 gain 208 81 -122.46 gain 81 209 -124.94 gain 209 81 -128.00 gain 81 210 -124.14 gain 210 81 -124.13 gain 81 211 -119.14 gain 211 81 -121.15 gain 81 212 -115.48 gain 212 81 -116.04 gain 81 213 -125.90 gain 213 81 -125.65 gain 81 214 -121.05 gain 214 81 -120.69 gain 81 215 -124.63 gain 215 81 -120.69 gain 81 216 -120.75 gain 216 81 -121.46 gain 81 217 -124.28 gain 217 81 -125.51 gain 81 218 -118.66 gain 218 81 -122.09 gain 81 219 -114.97 gain 219 81 -109.75 gain 81 220 -123.93 gain 220 81 -129.20 gain 81 221 -126.87 gain 221 81 -127.78 gain 81 222 -120.90 gain 222 81 -122.13 gain 81 223 -120.49 gain 223 81 -120.34 gain 81 224 -129.91 gain 224 81 -132.45 gain 82 83 -104.18 gain 83 82 -105.21 gain 82 84 -97.39 gain 84 82 -98.57 gain 82 85 -108.61 gain 85 82 -106.60 gain 82 86 -107.79 gain 86 82 -109.16 gain 82 87 -114.65 gain 87 82 -119.99 gain 82 88 -114.98 gain 88 82 -118.06 gain 82 89 -114.11 gain 89 82 -115.79 gain 82 90 -115.08 gain 90 82 -113.77 gain 82 91 -113.85 gain 91 82 -116.49 gain 82 92 -118.64 gain 92 82 -118.23 gain 82 93 -108.98 gain 93 82 -113.37 gain 82 94 -104.33 gain 94 82 -108.58 gain 82 95 -101.09 gain 95 82 -107.60 gain 82 96 -93.29 gain 96 82 -97.14 gain 82 97 -87.63 gain 97 82 -90.23 gain 82 98 -98.23 gain 98 82 -101.63 gain 82 99 -102.44 gain 99 82 -103.66 gain 82 100 -100.65 gain 100 82 -101.43 gain 82 101 -113.27 gain 101 82 -114.22 gain 82 102 -102.24 gain 102 82 -103.96 gain 82 103 -117.08 gain 103 82 -116.29 gain 82 104 -111.89 gain 104 82 -116.48 gain 82 105 -115.21 gain 105 82 -115.73 gain 82 106 -111.53 gain 106 82 -113.14 gain 82 107 -110.73 gain 107 82 -118.91 gain 82 108 -113.37 gain 108 82 -113.86 gain 82 109 -105.26 gain 109 82 -109.24 gain 82 110 -106.95 gain 110 82 -109.41 gain 82 111 -99.57 gain 111 82 -101.70 gain 82 112 -99.85 gain 112 82 -100.86 gain 82 113 -99.88 gain 113 82 -99.70 gain 82 114 -100.89 gain 114 82 -104.01 gain 82 115 -106.00 gain 115 82 -103.42 gain 82 116 -104.91 gain 116 82 -109.88 gain 82 117 -117.10 gain 117 82 -123.57 gain 82 118 -108.99 gain 118 82 -113.78 gain 82 119 -114.66 gain 119 82 -114.11 gain 82 120 -115.73 gain 120 82 -119.69 gain 82 121 -115.78 gain 121 82 -119.04 gain 82 122 -117.04 gain 122 82 -122.41 gain 82 123 -120.60 gain 123 82 -126.75 gain 82 124 -107.90 gain 124 82 -110.46 gain 82 125 -106.12 gain 125 82 -110.01 gain 82 126 -99.06 gain 126 82 -100.91 gain 82 127 -102.72 gain 127 82 -108.03 gain 82 128 -99.82 gain 128 82 -103.06 gain 82 129 -106.56 gain 129 82 -107.72 gain 82 130 -107.53 gain 130 82 -106.51 gain 82 131 -115.93 gain 131 82 -121.99 gain 82 132 -114.38 gain 132 82 -120.07 gain 82 133 -117.53 gain 133 82 -121.29 gain 82 134 -116.92 gain 134 82 -117.38 gain 82 135 -116.74 gain 135 82 -120.77 gain 82 136 -112.49 gain 136 82 -117.14 gain 82 137 -114.10 gain 137 82 -116.23 gain 82 138 -114.35 gain 138 82 -115.48 gain 82 139 -112.07 gain 139 82 -114.19 gain 82 140 -108.89 gain 140 82 -113.61 gain 82 141 -108.98 gain 141 82 -112.38 gain 82 142 -110.00 gain 142 82 -112.70 gain 82 143 -111.93 gain 143 82 -114.24 gain 82 144 -105.02 gain 144 82 -108.35 gain 82 145 -104.39 gain 145 82 -106.17 gain 82 146 -117.28 gain 146 82 -117.97 gain 82 147 -112.24 gain 147 82 -110.02 gain 82 148 -111.22 gain 148 82 -108.72 gain 82 149 -109.31 gain 149 82 -109.97 gain 82 150 -116.43 gain 150 82 -119.78 gain 82 151 -123.85 gain 151 82 -127.40 gain 82 152 -121.16 gain 152 82 -121.68 gain 82 153 -119.96 gain 153 82 -118.06 gain 82 154 -114.45 gain 154 82 -121.10 gain 82 155 -115.21 gain 155 82 -121.76 gain 82 156 -112.02 gain 156 82 -112.95 gain 82 157 -112.15 gain 157 82 -116.03 gain 82 158 -117.67 gain 158 82 -124.14 gain 82 159 -116.14 gain 159 82 -119.23 gain 82 160 -117.41 gain 160 82 -117.62 gain 82 161 -107.91 gain 161 82 -111.60 gain 82 162 -116.46 gain 162 82 -119.02 gain 82 163 -117.30 gain 163 82 -122.00 gain 82 164 -121.34 gain 164 82 -127.09 gain 82 165 -120.10 gain 165 82 -121.89 gain 82 166 -117.49 gain 166 82 -120.85 gain 82 167 -112.05 gain 167 82 -117.50 gain 82 168 -107.87 gain 168 82 -111.77 gain 82 169 -124.13 gain 169 82 -132.22 gain 82 170 -118.85 gain 170 82 -118.47 gain 82 171 -110.81 gain 171 82 -115.46 gain 82 172 -107.15 gain 172 82 -106.49 gain 82 173 -114.69 gain 173 82 -113.47 gain 82 174 -115.08 gain 174 82 -118.16 gain 82 175 -122.72 gain 175 82 -129.36 gain 82 176 -117.63 gain 176 82 -116.27 gain 82 177 -123.06 gain 177 82 -129.51 gain 82 178 -126.68 gain 178 82 -128.96 gain 82 179 -123.70 gain 179 82 -124.37 gain 82 180 -127.06 gain 180 82 -129.20 gain 82 181 -115.79 gain 181 82 -118.00 gain 82 182 -118.23 gain 182 82 -122.82 gain 82 183 -115.91 gain 183 82 -113.89 gain 82 184 -122.97 gain 184 82 -125.73 gain 82 185 -110.01 gain 185 82 -110.26 gain 82 186 -115.35 gain 186 82 -115.88 gain 82 187 -117.79 gain 187 82 -120.86 gain 82 188 -115.17 gain 188 82 -121.50 gain 82 189 -121.02 gain 189 82 -124.87 gain 82 190 -115.02 gain 190 82 -115.88 gain 82 191 -118.28 gain 191 82 -120.23 gain 82 192 -117.19 gain 192 82 -122.01 gain 82 193 -120.06 gain 193 82 -126.13 gain 82 194 -122.87 gain 194 82 -122.75 gain 82 195 -122.63 gain 195 82 -123.14 gain 82 196 -125.30 gain 196 82 -129.85 gain 82 197 -114.98 gain 197 82 -115.60 gain 82 198 -121.10 gain 198 82 -121.24 gain 82 199 -119.30 gain 199 82 -123.36 gain 82 200 -119.28 gain 200 82 -120.27 gain 82 201 -122.02 gain 201 82 -123.82 gain 82 202 -110.36 gain 202 82 -116.15 gain 82 203 -115.46 gain 203 82 -120.88 gain 82 204 -124.74 gain 204 82 -127.44 gain 82 205 -109.93 gain 205 82 -111.70 gain 82 206 -121.66 gain 206 82 -127.96 gain 82 207 -124.74 gain 207 82 -123.40 gain 82 208 -116.86 gain 208 82 -121.29 gain 82 209 -120.32 gain 209 82 -125.75 gain 82 210 -125.84 gain 210 82 -128.21 gain 82 211 -119.74 gain 211 82 -124.13 gain 82 212 -125.76 gain 212 82 -128.69 gain 82 213 -121.71 gain 213 82 -123.83 gain 82 214 -117.69 gain 214 82 -119.70 gain 82 215 -117.78 gain 215 82 -116.20 gain 82 216 -117.76 gain 216 82 -120.85 gain 82 217 -122.29 gain 217 82 -125.89 gain 82 218 -123.22 gain 218 82 -129.02 gain 82 219 -119.30 gain 219 82 -116.45 gain 82 220 -123.58 gain 220 82 -131.22 gain 82 221 -120.32 gain 221 82 -123.60 gain 82 222 -120.82 gain 222 82 -124.43 gain 82 223 -112.49 gain 223 82 -114.71 gain 82 224 -122.93 gain 224 82 -127.85 gain 83 84 -92.30 gain 84 83 -92.45 gain 83 85 -104.60 gain 85 83 -101.56 gain 83 86 -113.50 gain 86 83 -113.84 gain 83 87 -113.17 gain 87 83 -117.47 gain 83 88 -110.20 gain 88 83 -112.25 gain 83 89 -115.50 gain 89 83 -116.15 gain 83 90 -122.25 gain 90 83 -119.91 gain 83 91 -115.87 gain 91 83 -117.48 gain 83 92 -121.95 gain 92 83 -120.51 gain 83 93 -108.20 gain 93 83 -111.54 gain 83 94 -114.29 gain 94 83 -117.51 gain 83 95 -106.48 gain 95 83 -111.96 gain 83 96 -95.72 gain 96 83 -98.54 gain 83 97 -103.37 gain 97 83 -104.93 gain 83 98 -86.18 gain 98 83 -88.54 gain 83 99 -98.14 gain 99 83 -98.32 gain 83 100 -101.86 gain 100 83 -101.61 gain 83 101 -105.93 gain 101 83 -105.84 gain 83 102 -107.59 gain 102 83 -108.28 gain 83 103 -117.07 gain 103 83 -115.24 gain 83 104 -113.33 gain 104 83 -116.88 gain 83 105 -124.75 gain 105 83 -124.24 gain 83 106 -118.13 gain 106 83 -118.70 gain 83 107 -111.76 gain 107 83 -118.90 gain 83 108 -110.98 gain 108 83 -110.44 gain 83 109 -111.44 gain 109 83 -114.39 gain 83 110 -110.60 gain 110 83 -112.02 gain 83 111 -100.23 gain 111 83 -101.33 gain 83 112 -107.06 gain 112 83 -107.04 gain 83 113 -96.43 gain 113 83 -95.22 gain 83 114 -107.28 gain 114 83 -109.37 gain 83 115 -104.32 gain 115 83 -100.71 gain 83 116 -112.12 gain 116 83 -116.05 gain 83 117 -112.84 gain 117 83 -118.27 gain 83 118 -117.42 gain 118 83 -121.18 gain 83 119 -116.44 gain 119 83 -114.85 gain 83 120 -117.92 gain 120 83 -120.85 gain 83 121 -120.53 gain 121 83 -122.75 gain 83 122 -118.13 gain 122 83 -122.46 gain 83 123 -115.49 gain 123 83 -120.60 gain 83 124 -115.09 gain 124 83 -116.61 gain 83 125 -114.94 gain 125 83 -117.79 gain 83 126 -112.17 gain 126 83 -112.98 gain 83 127 -100.50 gain 127 83 -104.77 gain 83 128 -105.23 gain 128 83 -107.45 gain 83 129 -112.33 gain 129 83 -112.45 gain 83 130 -114.46 gain 130 83 -112.40 gain 83 131 -114.43 gain 131 83 -119.46 gain 83 132 -111.00 gain 132 83 -115.66 gain 83 133 -122.44 gain 133 83 -125.17 gain 83 134 -116.69 gain 134 83 -116.12 gain 83 135 -121.21 gain 135 83 -124.20 gain 83 136 -124.82 gain 136 83 -128.43 gain 83 137 -120.81 gain 137 83 -121.91 gain 83 138 -117.47 gain 138 83 -117.56 gain 83 139 -118.18 gain 139 83 -119.26 gain 83 140 -116.93 gain 140 83 -120.62 gain 83 141 -109.63 gain 141 83 -111.99 gain 83 142 -114.41 gain 142 83 -116.07 gain 83 143 -109.92 gain 143 83 -111.20 gain 83 144 -112.77 gain 144 83 -115.06 gain 83 145 -109.91 gain 145 83 -110.66 gain 83 146 -113.66 gain 146 83 -113.31 gain 83 147 -115.97 gain 147 83 -112.72 gain 83 148 -114.23 gain 148 83 -110.69 gain 83 149 -114.96 gain 149 83 -114.59 gain 83 150 -123.00 gain 150 83 -125.32 gain 83 151 -121.82 gain 151 83 -124.33 gain 83 152 -128.82 gain 152 83 -128.31 gain 83 153 -116.68 gain 153 83 -113.75 gain 83 154 -119.26 gain 154 83 -124.87 gain 83 155 -122.00 gain 155 83 -127.51 gain 83 156 -111.93 gain 156 83 -111.83 gain 83 157 -106.60 gain 157 83 -109.45 gain 83 158 -111.76 gain 158 83 -117.20 gain 83 159 -105.38 gain 159 83 -107.44 gain 83 160 -110.19 gain 160 83 -109.35 gain 83 161 -116.41 gain 161 83 -119.07 gain 83 162 -115.21 gain 162 83 -116.74 gain 83 163 -114.98 gain 163 83 -118.65 gain 83 164 -122.70 gain 164 83 -127.41 gain 83 165 -115.22 gain 165 83 -115.97 gain 83 166 -112.30 gain 166 83 -114.63 gain 83 167 -125.40 gain 167 83 -129.82 gain 83 168 -115.51 gain 168 83 -118.37 gain 83 169 -118.97 gain 169 83 -126.04 gain 83 170 -116.36 gain 170 83 -114.95 gain 83 171 -123.09 gain 171 83 -126.71 gain 83 172 -120.77 gain 172 83 -119.08 gain 83 173 -110.84 gain 173 83 -108.59 gain 83 174 -121.72 gain 174 83 -123.76 gain 83 175 -112.74 gain 175 83 -118.33 gain 83 176 -122.03 gain 176 83 -119.64 gain 83 177 -119.50 gain 177 83 -124.92 gain 83 178 -119.36 gain 178 83 -120.60 gain 83 179 -120.27 gain 179 83 -119.90 gain 83 180 -124.94 gain 180 83 -126.05 gain 83 181 -125.93 gain 181 83 -127.10 gain 83 182 -120.73 gain 182 83 -124.29 gain 83 183 -122.42 gain 183 83 -119.36 gain 83 184 -126.65 gain 184 83 -128.38 gain 83 185 -113.69 gain 185 83 -112.91 gain 83 186 -121.06 gain 186 83 -120.56 gain 83 187 -114.57 gain 187 83 -116.61 gain 83 188 -118.02 gain 188 83 -123.32 gain 83 189 -116.73 gain 189 83 -119.54 gain 83 190 -120.80 gain 190 83 -120.62 gain 83 191 -120.19 gain 191 83 -121.11 gain 83 192 -115.31 gain 192 83 -119.10 gain 83 193 -121.62 gain 193 83 -126.65 gain 83 194 -124.73 gain 194 83 -123.58 gain 83 195 -123.17 gain 195 83 -122.65 gain 83 196 -117.76 gain 196 83 -121.28 gain 83 197 -125.18 gain 197 83 -124.77 gain 83 198 -116.58 gain 198 83 -115.68 gain 83 199 -121.40 gain 199 83 -124.42 gain 83 200 -117.49 gain 200 83 -117.45 gain 83 201 -120.42 gain 201 83 -121.18 gain 83 202 -119.88 gain 202 83 -124.64 gain 83 203 -126.13 gain 203 83 -130.52 gain 83 204 -116.51 gain 204 83 -118.18 gain 83 205 -122.92 gain 205 83 -123.66 gain 83 206 -126.13 gain 206 83 -131.39 gain 83 207 -120.24 gain 207 83 -117.86 gain 83 208 -122.45 gain 208 83 -125.85 gain 83 209 -119.17 gain 209 83 -123.56 gain 83 210 -122.01 gain 210 83 -123.34 gain 83 211 -126.03 gain 211 83 -129.38 gain 83 212 -116.29 gain 212 83 -118.18 gain 83 213 -117.30 gain 213 83 -118.38 gain 83 214 -119.08 gain 214 83 -120.05 gain 83 215 -117.65 gain 215 83 -115.04 gain 83 216 -124.36 gain 216 83 -126.41 gain 83 217 -120.36 gain 217 83 -122.93 gain 83 218 -120.24 gain 218 83 -125.00 gain 83 219 -118.07 gain 219 83 -114.18 gain 83 220 -123.69 gain 220 83 -130.30 gain 83 221 -121.26 gain 221 83 -123.51 gain 83 222 -120.59 gain 222 83 -123.16 gain 83 223 -119.33 gain 223 83 -120.52 gain 83 224 -119.74 gain 224 83 -123.62 gain 84 85 -95.45 gain 85 84 -92.25 gain 84 86 -101.99 gain 86 84 -102.18 gain 84 87 -99.59 gain 87 84 -103.74 gain 84 88 -110.81 gain 88 84 -112.71 gain 84 89 -108.60 gain 89 84 -109.11 gain 84 90 -120.96 gain 90 84 -118.47 gain 84 91 -107.59 gain 91 84 -109.05 gain 84 92 -119.29 gain 92 84 -117.71 gain 84 93 -110.67 gain 93 84 -113.87 gain 84 94 -119.37 gain 94 84 -122.45 gain 84 95 -110.40 gain 95 84 -115.73 gain 84 96 -103.91 gain 96 84 -106.58 gain 84 97 -103.27 gain 97 84 -104.68 gain 84 98 -102.78 gain 98 84 -104.99 gain 84 99 -96.08 gain 99 84 -96.11 gain 84 100 -95.43 gain 100 84 -95.03 gain 84 101 -102.35 gain 101 84 -102.11 gain 84 102 -105.06 gain 102 84 -105.60 gain 84 103 -119.27 gain 103 84 -117.30 gain 84 104 -110.63 gain 104 84 -114.04 gain 84 105 -125.43 gain 105 84 -124.78 gain 84 106 -116.40 gain 106 84 -116.83 gain 84 107 -120.76 gain 107 84 -127.76 gain 84 108 -114.31 gain 108 84 -113.63 gain 84 109 -110.39 gain 109 84 -113.19 gain 84 110 -107.85 gain 110 84 -109.13 gain 84 111 -103.66 gain 111 84 -104.61 gain 84 112 -108.30 gain 112 84 -108.14 gain 84 113 -112.71 gain 113 84 -111.34 gain 84 114 -106.66 gain 114 84 -108.60 gain 84 115 -106.08 gain 115 84 -102.32 gain 84 116 -108.03 gain 116 84 -111.82 gain 84 117 -108.53 gain 117 84 -113.81 gain 84 118 -109.05 gain 118 84 -112.66 gain 84 119 -112.64 gain 119 84 -110.91 gain 84 120 -126.31 gain 120 84 -129.09 gain 84 121 -115.18 gain 121 84 -117.26 gain 84 122 -118.64 gain 122 84 -122.83 gain 84 123 -116.98 gain 123 84 -121.95 gain 84 124 -113.78 gain 124 84 -115.15 gain 84 125 -117.01 gain 125 84 -119.72 gain 84 126 -112.97 gain 126 84 -113.63 gain 84 127 -104.65 gain 127 84 -108.77 gain 84 128 -112.41 gain 128 84 -114.48 gain 84 129 -107.45 gain 129 84 -107.43 gain 84 130 -115.75 gain 130 84 -113.55 gain 84 131 -112.87 gain 131 84 -117.75 gain 84 132 -112.22 gain 132 84 -116.73 gain 84 133 -111.42 gain 133 84 -114.00 gain 84 134 -117.13 gain 134 84 -116.41 gain 84 135 -118.35 gain 135 84 -121.20 gain 84 136 -116.90 gain 136 84 -120.36 gain 84 137 -116.94 gain 137 84 -117.88 gain 84 138 -109.97 gain 138 84 -109.92 gain 84 139 -121.60 gain 139 84 -122.53 gain 84 140 -116.92 gain 140 84 -120.46 gain 84 141 -111.65 gain 141 84 -113.86 gain 84 142 -110.60 gain 142 84 -112.12 gain 84 143 -116.41 gain 143 84 -117.54 gain 84 144 -103.88 gain 144 84 -106.03 gain 84 145 -115.81 gain 145 84 -116.41 gain 84 146 -112.46 gain 146 84 -111.97 gain 84 147 -118.42 gain 147 84 -115.02 gain 84 148 -118.02 gain 148 84 -114.33 gain 84 149 -114.68 gain 149 84 -114.17 gain 84 150 -128.80 gain 150 84 -130.97 gain 84 151 -122.62 gain 151 84 -124.99 gain 84 152 -116.58 gain 152 84 -115.92 gain 84 153 -127.69 gain 153 84 -124.61 gain 84 154 -123.92 gain 154 84 -129.38 gain 84 155 -114.18 gain 155 84 -119.55 gain 84 156 -120.45 gain 156 84 -120.20 gain 84 157 -113.28 gain 157 84 -115.97 gain 84 158 -119.16 gain 158 84 -124.45 gain 84 159 -108.18 gain 159 84 -110.09 gain 84 160 -118.66 gain 160 84 -117.68 gain 84 161 -114.60 gain 161 84 -117.11 gain 84 162 -108.11 gain 162 84 -109.49 gain 84 163 -112.77 gain 163 84 -116.30 gain 84 164 -123.30 gain 164 84 -127.86 gain 84 165 -130.79 gain 165 84 -131.40 gain 84 166 -123.78 gain 166 84 -125.95 gain 84 167 -119.30 gain 167 84 -123.56 gain 84 168 -123.08 gain 168 84 -125.80 gain 84 169 -124.00 gain 169 84 -130.92 gain 84 170 -116.63 gain 170 84 -115.07 gain 84 171 -115.10 gain 171 84 -118.57 gain 84 172 -116.30 gain 172 84 -114.46 gain 84 173 -113.48 gain 173 84 -111.07 gain 84 174 -117.93 gain 174 84 -119.82 gain 84 175 -117.59 gain 175 84 -123.04 gain 84 176 -111.65 gain 176 84 -109.11 gain 84 177 -118.55 gain 177 84 -123.82 gain 84 178 -120.81 gain 178 84 -121.91 gain 84 179 -119.42 gain 179 84 -118.91 gain 84 180 -119.57 gain 180 84 -120.53 gain 84 181 -122.55 gain 181 84 -123.57 gain 84 182 -124.83 gain 182 84 -128.24 gain 84 183 -122.77 gain 183 84 -119.57 gain 84 184 -114.03 gain 184 84 -115.61 gain 84 185 -119.83 gain 185 84 -118.90 gain 84 186 -121.78 gain 186 84 -121.13 gain 84 187 -114.74 gain 187 84 -116.63 gain 84 188 -113.32 gain 188 84 -118.47 gain 84 189 -108.54 gain 189 84 -111.21 gain 84 190 -115.49 gain 190 84 -115.17 gain 84 191 -118.72 gain 191 84 -119.49 gain 84 192 -114.47 gain 192 84 -118.11 gain 84 193 -115.45 gain 193 84 -120.34 gain 84 194 -122.23 gain 194 84 -120.93 gain 84 195 -119.08 gain 195 84 -118.41 gain 84 196 -120.39 gain 196 84 -123.76 gain 84 197 -127.16 gain 197 84 -126.60 gain 84 198 -118.22 gain 198 84 -117.18 gain 84 199 -119.95 gain 199 84 -122.82 gain 84 200 -126.05 gain 200 84 -125.86 gain 84 201 -116.32 gain 201 84 -116.93 gain 84 202 -123.21 gain 202 84 -127.83 gain 84 203 -120.25 gain 203 84 -124.49 gain 84 204 -119.45 gain 204 84 -120.97 gain 84 205 -119.34 gain 205 84 -119.94 gain 84 206 -120.16 gain 206 84 -125.27 gain 84 207 -117.56 gain 207 84 -115.03 gain 84 208 -116.96 gain 208 84 -120.21 gain 84 209 -118.64 gain 209 84 -122.89 gain 84 210 -130.10 gain 210 84 -131.28 gain 84 211 -125.42 gain 211 84 -128.63 gain 84 212 -126.88 gain 212 84 -128.63 gain 84 213 -122.57 gain 213 84 -123.51 gain 84 214 -121.14 gain 214 84 -121.97 gain 84 215 -125.76 gain 215 84 -123.00 gain 84 216 -121.90 gain 216 84 -123.80 gain 84 217 -122.51 gain 217 84 -124.93 gain 84 218 -114.15 gain 218 84 -118.76 gain 84 219 -114.62 gain 219 84 -110.59 gain 84 220 -116.18 gain 220 84 -122.64 gain 84 221 -120.67 gain 221 84 -122.77 gain 84 222 -127.87 gain 222 84 -130.30 gain 84 223 -123.07 gain 223 84 -124.11 gain 84 224 -110.32 gain 224 84 -114.05 gain 85 86 -90.76 gain 86 85 -94.14 gain 85 87 -94.67 gain 87 85 -102.01 gain 85 88 -100.12 gain 88 85 -105.21 gain 85 89 -108.51 gain 89 85 -112.21 gain 85 90 -113.48 gain 90 85 -114.18 gain 85 91 -120.00 gain 91 85 -124.65 gain 85 92 -117.14 gain 92 85 -118.75 gain 85 93 -117.49 gain 93 85 -123.89 gain 85 94 -112.04 gain 94 85 -118.31 gain 85 95 -102.68 gain 95 85 -111.21 gain 85 96 -105.73 gain 96 85 -111.60 gain 85 97 -107.19 gain 97 85 -111.79 gain 85 98 -101.67 gain 98 85 -107.08 gain 85 99 -86.70 gain 99 85 -89.93 gain 85 100 -91.84 gain 100 85 -94.63 gain 85 101 -92.97 gain 101 85 -95.92 gain 85 102 -96.01 gain 102 85 -99.75 gain 85 103 -102.95 gain 103 85 -104.17 gain 85 104 -111.96 gain 104 85 -118.55 gain 85 105 -129.06 gain 105 85 -131.60 gain 85 106 -113.93 gain 106 85 -117.56 gain 85 107 -114.80 gain 107 85 -124.99 gain 85 108 -112.70 gain 108 85 -115.20 gain 85 109 -116.72 gain 109 85 -122.71 gain 85 110 -108.97 gain 110 85 -113.43 gain 85 111 -103.80 gain 111 85 -107.94 gain 85 112 -107.48 gain 112 85 -110.50 gain 85 113 -106.45 gain 113 85 -108.28 gain 85 114 -101.18 gain 114 85 -106.31 gain 85 115 -99.37 gain 115 85 -98.81 gain 85 116 -96.88 gain 116 85 -103.86 gain 85 117 -102.44 gain 117 85 -110.91 gain 85 118 -109.13 gain 118 85 -115.93 gain 85 119 -111.54 gain 119 85 -113.00 gain 85 120 -116.25 gain 120 85 -122.22 gain 85 121 -119.11 gain 121 85 -124.37 gain 85 122 -112.33 gain 122 85 -119.71 gain 85 123 -113.14 gain 123 85 -121.29 gain 85 124 -104.76 gain 124 85 -109.32 gain 85 125 -115.34 gain 125 85 -121.24 gain 85 126 -114.57 gain 126 85 -118.42 gain 85 127 -107.54 gain 127 85 -114.86 gain 85 128 -102.38 gain 128 85 -107.64 gain 85 129 -98.22 gain 129 85 -101.39 gain 85 130 -105.33 gain 130 85 -106.32 gain 85 131 -101.63 gain 131 85 -109.70 gain 85 132 -105.79 gain 132 85 -113.50 gain 85 133 -104.32 gain 133 85 -110.09 gain 85 134 -107.90 gain 134 85 -110.37 gain 85 135 -120.07 gain 135 85 -126.11 gain 85 136 -116.40 gain 136 85 -123.05 gain 85 137 -117.49 gain 137 85 -121.62 gain 85 138 -117.06 gain 138 85 -120.19 gain 85 139 -116.23 gain 139 85 -120.35 gain 85 140 -112.03 gain 140 85 -118.76 gain 85 141 -116.33 gain 141 85 -121.73 gain 85 142 -113.94 gain 142 85 -118.65 gain 85 143 -111.17 gain 143 85 -115.49 gain 85 144 -95.39 gain 144 85 -100.73 gain 85 145 -107.55 gain 145 85 -111.35 gain 85 146 -109.51 gain 146 85 -112.21 gain 85 147 -108.97 gain 147 85 -108.76 gain 85 148 -110.75 gain 148 85 -110.26 gain 85 149 -113.39 gain 149 85 -116.06 gain 85 150 -120.15 gain 150 85 -125.51 gain 85 151 -119.02 gain 151 85 -124.57 gain 85 152 -118.02 gain 152 85 -120.55 gain 85 153 -128.60 gain 153 85 -128.71 gain 85 154 -110.18 gain 154 85 -118.84 gain 85 155 -113.94 gain 155 85 -122.50 gain 85 156 -111.95 gain 156 85 -114.89 gain 85 157 -103.05 gain 157 85 -108.94 gain 85 158 -106.87 gain 158 85 -115.36 gain 85 159 -110.81 gain 159 85 -115.91 gain 85 160 -116.11 gain 160 85 -118.32 gain 85 161 -111.69 gain 161 85 -117.40 gain 85 162 -112.23 gain 162 85 -116.80 gain 85 163 -117.22 gain 163 85 -123.94 gain 85 164 -114.91 gain 164 85 -122.66 gain 85 165 -116.26 gain 165 85 -120.06 gain 85 166 -115.21 gain 166 85 -120.58 gain 85 167 -117.50 gain 167 85 -124.96 gain 85 168 -117.33 gain 168 85 -123.24 gain 85 169 -116.45 gain 169 85 -126.56 gain 85 170 -111.49 gain 170 85 -113.13 gain 85 171 -107.15 gain 171 85 -113.81 gain 85 172 -116.10 gain 172 85 -117.46 gain 85 173 -110.09 gain 173 85 -110.88 gain 85 174 -111.00 gain 174 85 -116.09 gain 85 175 -116.92 gain 175 85 -125.57 gain 85 176 -113.65 gain 176 85 -114.30 gain 85 177 -112.20 gain 177 85 -120.67 gain 85 178 -114.25 gain 178 85 -118.54 gain 85 179 -120.57 gain 179 85 -123.25 gain 85 180 -122.20 gain 180 85 -126.35 gain 85 181 -116.22 gain 181 85 -120.43 gain 85 182 -114.30 gain 182 85 -120.90 gain 85 183 -120.25 gain 183 85 -120.25 gain 85 184 -118.55 gain 184 85 -123.32 gain 85 185 -119.44 gain 185 85 -121.70 gain 85 186 -120.64 gain 186 85 -123.18 gain 85 187 -117.69 gain 187 85 -122.77 gain 85 188 -115.52 gain 188 85 -123.87 gain 85 189 -112.32 gain 189 85 -118.18 gain 85 190 -104.95 gain 190 85 -107.82 gain 85 191 -115.84 gain 191 85 -119.81 gain 85 192 -110.04 gain 192 85 -116.87 gain 85 193 -115.67 gain 193 85 -123.75 gain 85 194 -116.76 gain 194 85 -118.65 gain 85 195 -125.11 gain 195 85 -127.64 gain 85 196 -123.88 gain 196 85 -130.45 gain 85 197 -120.82 gain 197 85 -123.45 gain 85 198 -119.95 gain 198 85 -122.10 gain 85 199 -129.86 gain 199 85 -135.92 gain 85 200 -113.16 gain 200 85 -116.16 gain 85 201 -117.80 gain 201 85 -121.61 gain 85 202 -116.64 gain 202 85 -124.44 gain 85 203 -116.54 gain 203 85 -123.98 gain 85 204 -118.06 gain 204 85 -122.77 gain 85 205 -119.85 gain 205 85 -123.63 gain 85 206 -114.27 gain 206 85 -122.58 gain 85 207 -114.76 gain 207 85 -115.43 gain 85 208 -117.56 gain 208 85 -124.01 gain 85 209 -120.53 gain 209 85 -127.97 gain 85 210 -120.60 gain 210 85 -124.98 gain 85 211 -115.21 gain 211 85 -121.61 gain 85 212 -120.43 gain 212 85 -125.37 gain 85 213 -115.42 gain 213 85 -119.55 gain 85 214 -117.44 gain 214 85 -121.46 gain 85 215 -120.36 gain 215 85 -120.79 gain 85 216 -117.70 gain 216 85 -122.79 gain 85 217 -117.65 gain 217 85 -123.27 gain 85 218 -119.08 gain 218 85 -126.89 gain 85 219 -118.60 gain 219 85 -117.76 gain 85 220 -115.31 gain 220 85 -124.96 gain 85 221 -109.30 gain 221 85 -114.60 gain 85 222 -118.99 gain 222 85 -124.62 gain 85 223 -116.75 gain 223 85 -120.98 gain 85 224 -119.28 gain 224 85 -126.21 gain 86 87 -90.63 gain 87 86 -94.60 gain 86 88 -100.90 gain 88 86 -102.61 gain 86 89 -106.03 gain 89 86 -106.35 gain 86 90 -123.97 gain 90 86 -121.29 gain 86 91 -124.54 gain 91 86 -125.80 gain 86 92 -119.35 gain 92 86 -117.58 gain 86 93 -122.48 gain 93 86 -125.50 gain 86 94 -115.80 gain 94 86 -118.69 gain 86 95 -122.31 gain 95 86 -127.46 gain 86 96 -111.12 gain 96 86 -113.60 gain 86 97 -112.17 gain 97 86 -113.40 gain 86 98 -111.19 gain 98 86 -113.22 gain 86 99 -101.83 gain 99 86 -101.67 gain 86 100 -98.50 gain 100 86 -97.90 gain 86 101 -99.92 gain 101 86 -99.50 gain 86 102 -94.25 gain 102 86 -94.60 gain 86 103 -100.65 gain 103 86 -98.49 gain 86 104 -110.14 gain 104 86 -113.35 gain 86 105 -123.56 gain 105 86 -122.72 gain 86 106 -120.73 gain 106 86 -120.97 gain 86 107 -119.05 gain 107 86 -125.86 gain 86 108 -115.99 gain 108 86 -115.11 gain 86 109 -121.13 gain 109 86 -123.74 gain 86 110 -114.46 gain 110 86 -115.54 gain 86 111 -111.29 gain 111 86 -112.05 gain 86 112 -107.72 gain 112 86 -107.36 gain 86 113 -106.85 gain 113 86 -105.29 gain 86 114 -100.40 gain 114 86 -102.15 gain 86 115 -104.37 gain 115 86 -100.43 gain 86 116 -100.60 gain 116 86 -104.20 gain 86 117 -108.52 gain 117 86 -113.61 gain 86 118 -107.95 gain 118 86 -111.37 gain 86 119 -111.64 gain 119 86 -109.72 gain 86 120 -122.99 gain 120 86 -125.58 gain 86 121 -125.32 gain 121 86 -127.20 gain 86 122 -122.22 gain 122 86 -126.22 gain 86 123 -119.13 gain 123 86 -123.90 gain 86 124 -113.38 gain 124 86 -114.56 gain 86 125 -107.53 gain 125 86 -110.05 gain 86 126 -115.78 gain 126 86 -116.25 gain 86 127 -109.99 gain 127 86 -113.93 gain 86 128 -114.71 gain 128 86 -116.58 gain 86 129 -105.36 gain 129 86 -105.14 gain 86 130 -105.59 gain 130 86 -103.20 gain 86 131 -102.40 gain 131 86 -107.10 gain 86 132 -106.03 gain 132 86 -110.35 gain 86 133 -110.84 gain 133 86 -113.23 gain 86 134 -117.59 gain 134 86 -116.68 gain 86 135 -125.25 gain 135 86 -127.91 gain 86 136 -112.28 gain 136 86 -115.55 gain 86 137 -124.32 gain 137 86 -125.07 gain 86 138 -122.13 gain 138 86 -121.89 gain 86 139 -121.18 gain 139 86 -121.92 gain 86 140 -121.96 gain 140 86 -125.30 gain 86 141 -122.39 gain 141 86 -124.42 gain 86 142 -116.26 gain 142 86 -117.58 gain 86 143 -110.85 gain 143 86 -111.80 gain 86 144 -109.23 gain 144 86 -111.19 gain 86 145 -106.79 gain 145 86 -107.20 gain 86 146 -106.91 gain 146 86 -106.23 gain 86 147 -106.50 gain 147 86 -102.91 gain 86 148 -113.19 gain 148 86 -109.32 gain 86 149 -110.58 gain 149 86 -109.88 gain 86 150 -122.33 gain 150 86 -124.31 gain 86 151 -130.32 gain 151 86 -132.50 gain 86 152 -123.05 gain 152 86 -122.20 gain 86 153 -122.50 gain 153 86 -119.23 gain 86 154 -121.92 gain 154 86 -127.20 gain 86 155 -124.85 gain 155 86 -130.03 gain 86 156 -121.20 gain 156 86 -120.76 gain 86 157 -117.97 gain 157 86 -120.47 gain 86 158 -111.01 gain 158 86 -116.11 gain 86 159 -118.19 gain 159 86 -119.90 gain 86 160 -112.64 gain 160 86 -111.48 gain 86 161 -111.73 gain 161 86 -114.05 gain 86 162 -117.29 gain 162 86 -118.47 gain 86 163 -113.76 gain 163 86 -117.09 gain 86 164 -117.19 gain 164 86 -121.57 gain 86 165 -121.42 gain 165 86 -121.83 gain 86 166 -118.25 gain 166 86 -120.23 gain 86 167 -117.59 gain 167 86 -121.67 gain 86 168 -123.83 gain 168 86 -126.36 gain 86 169 -119.58 gain 169 86 -126.30 gain 86 170 -120.41 gain 170 86 -118.66 gain 86 171 -125.40 gain 171 86 -128.68 gain 86 172 -121.49 gain 172 86 -119.46 gain 86 173 -116.71 gain 173 86 -114.12 gain 86 174 -112.56 gain 174 86 -114.27 gain 86 175 -116.09 gain 175 86 -121.35 gain 86 176 -117.09 gain 176 86 -114.36 gain 86 177 -117.17 gain 177 86 -122.25 gain 86 178 -114.94 gain 178 86 -115.85 gain 86 179 -121.14 gain 179 86 -120.44 gain 86 180 -118.43 gain 180 86 -119.20 gain 86 181 -126.21 gain 181 86 -127.05 gain 86 182 -132.55 gain 182 86 -135.77 gain 86 183 -124.57 gain 183 86 -121.18 gain 86 184 -125.55 gain 184 86 -126.94 gain 86 185 -128.20 gain 185 86 -127.07 gain 86 186 -120.42 gain 186 86 -119.59 gain 86 187 -121.04 gain 187 86 -122.74 gain 86 188 -113.50 gain 188 86 -118.47 gain 86 189 -115.50 gain 189 86 -117.98 gain 86 190 -121.40 gain 190 86 -120.89 gain 86 191 -120.17 gain 191 86 -120.75 gain 86 192 -119.17 gain 192 86 -122.62 gain 86 193 -119.82 gain 193 86 -124.52 gain 86 194 -115.11 gain 194 86 -113.62 gain 86 195 -122.27 gain 195 86 -121.41 gain 86 196 -125.84 gain 196 86 -129.02 gain 86 197 -129.89 gain 197 86 -129.13 gain 86 198 -122.11 gain 198 86 -120.87 gain 86 199 -118.19 gain 199 86 -120.87 gain 86 200 -127.96 gain 200 86 -127.58 gain 86 201 -121.75 gain 201 86 -122.18 gain 86 202 -125.00 gain 202 86 -129.43 gain 86 203 -128.80 gain 203 86 -132.85 gain 86 204 -123.39 gain 204 86 -124.72 gain 86 205 -113.01 gain 205 86 -113.41 gain 86 206 -116.92 gain 206 86 -121.85 gain 86 207 -115.10 gain 207 86 -112.39 gain 86 208 -126.40 gain 208 86 -129.47 gain 86 209 -120.46 gain 209 86 -124.52 gain 86 210 -126.82 gain 210 86 -127.82 gain 86 211 -120.34 gain 211 86 -123.36 gain 86 212 -121.78 gain 212 86 -123.34 gain 86 213 -133.04 gain 213 86 -133.78 gain 86 214 -123.59 gain 214 86 -124.23 gain 86 215 -123.03 gain 215 86 -120.08 gain 86 216 -114.25 gain 216 86 -115.97 gain 86 217 -111.25 gain 217 86 -113.48 gain 86 218 -128.76 gain 218 86 -133.18 gain 86 219 -125.61 gain 219 86 -121.39 gain 86 220 -117.03 gain 220 86 -123.30 gain 86 221 -116.14 gain 221 86 -118.06 gain 86 222 -124.49 gain 222 86 -126.73 gain 86 223 -123.94 gain 223 86 -124.80 gain 86 224 -119.39 gain 224 86 -122.93 gain 87 88 -96.91 gain 88 87 -94.66 gain 87 89 -103.49 gain 89 87 -99.84 gain 87 90 -131.41 gain 90 87 -124.77 gain 87 91 -124.06 gain 91 87 -121.36 gain 87 92 -126.27 gain 92 87 -120.53 gain 87 93 -122.13 gain 93 87 -121.18 gain 87 94 -121.44 gain 94 87 -120.37 gain 87 95 -121.81 gain 95 87 -122.99 gain 87 96 -119.49 gain 96 87 -118.01 gain 87 97 -114.09 gain 97 87 -111.35 gain 87 98 -115.72 gain 98 87 -113.78 gain 87 99 -112.10 gain 99 87 -107.98 gain 87 100 -111.14 gain 100 87 -106.58 gain 87 101 -99.86 gain 101 87 -95.47 gain 87 102 -106.11 gain 102 87 -102.50 gain 87 103 -100.67 gain 103 87 -94.55 gain 87 104 -104.63 gain 104 87 -103.88 gain 87 105 -122.88 gain 105 87 -118.07 gain 87 106 -124.68 gain 106 87 -120.96 gain 87 107 -129.54 gain 107 87 -132.38 gain 87 108 -123.12 gain 108 87 -118.28 gain 87 109 -124.83 gain 109 87 -123.48 gain 87 110 -129.45 gain 110 87 -126.57 gain 87 111 -118.93 gain 111 87 -115.73 gain 87 112 -124.45 gain 112 87 -120.13 gain 87 113 -115.04 gain 113 87 -109.53 gain 87 114 -110.75 gain 114 87 -108.54 gain 87 115 -105.41 gain 115 87 -97.50 gain 87 116 -105.09 gain 116 87 -104.72 gain 87 117 -105.65 gain 117 87 -106.78 gain 87 118 -102.16 gain 118 87 -101.61 gain 87 119 -111.17 gain 119 87 -105.29 gain 87 120 -131.37 gain 120 87 -130.00 gain 87 121 -129.13 gain 121 87 -127.05 gain 87 122 -127.59 gain 122 87 -127.63 gain 87 123 -125.69 gain 123 87 -126.50 gain 87 124 -118.23 gain 124 87 -115.45 gain 87 125 -126.70 gain 125 87 -125.26 gain 87 126 -119.65 gain 126 87 -116.16 gain 87 127 -122.80 gain 127 87 -122.78 gain 87 128 -120.54 gain 128 87 -118.45 gain 87 129 -113.00 gain 129 87 -108.82 gain 87 130 -114.97 gain 130 87 -108.61 gain 87 131 -116.40 gain 131 87 -117.13 gain 87 132 -112.77 gain 132 87 -113.13 gain 87 133 -113.80 gain 133 87 -112.23 gain 87 134 -115.77 gain 134 87 -110.90 gain 87 135 -128.76 gain 135 87 -127.46 gain 87 136 -130.48 gain 136 87 -129.78 gain 87 137 -132.08 gain 137 87 -128.88 gain 87 138 -121.68 gain 138 87 -117.47 gain 87 139 -127.01 gain 139 87 -123.79 gain 87 140 -122.68 gain 140 87 -122.07 gain 87 141 -121.19 gain 141 87 -119.25 gain 87 142 -119.53 gain 142 87 -116.89 gain 87 143 -123.88 gain 143 87 -120.86 gain 87 144 -115.37 gain 144 87 -113.37 gain 87 145 -113.80 gain 145 87 -110.25 gain 87 146 -112.45 gain 146 87 -107.80 gain 87 147 -111.94 gain 147 87 -104.38 gain 87 148 -118.45 gain 148 87 -110.61 gain 87 149 -109.62 gain 149 87 -104.95 gain 87 150 -125.43 gain 150 87 -123.45 gain 87 151 -129.63 gain 151 87 -127.85 gain 87 152 -133.03 gain 152 87 -128.22 gain 87 153 -134.07 gain 153 87 -126.83 gain 87 154 -118.87 gain 154 87 -120.19 gain 87 155 -125.85 gain 155 87 -127.06 gain 87 156 -123.30 gain 156 87 -118.90 gain 87 157 -117.32 gain 157 87 -115.87 gain 87 158 -121.61 gain 158 87 -122.75 gain 87 159 -116.54 gain 159 87 -114.30 gain 87 160 -122.44 gain 160 87 -117.31 gain 87 161 -115.79 gain 161 87 -114.15 gain 87 162 -115.48 gain 162 87 -112.70 gain 87 163 -116.85 gain 163 87 -116.22 gain 87 164 -116.52 gain 164 87 -116.94 gain 87 165 -131.66 gain 165 87 -128.11 gain 87 166 -133.94 gain 166 87 -131.96 gain 87 167 -125.27 gain 167 87 -125.38 gain 87 168 -128.53 gain 168 87 -127.10 gain 87 169 -128.59 gain 169 87 -131.35 gain 87 170 -128.63 gain 170 87 -122.91 gain 87 171 -121.80 gain 171 87 -121.11 gain 87 172 -125.60 gain 172 87 -119.61 gain 87 173 -125.81 gain 173 87 -119.25 gain 87 174 -115.24 gain 174 87 -112.98 gain 87 175 -119.59 gain 175 87 -120.89 gain 87 176 -118.45 gain 176 87 -111.76 gain 87 177 -123.70 gain 177 87 -124.82 gain 87 178 -119.46 gain 178 87 -116.41 gain 87 179 -126.50 gain 179 87 -121.84 gain 87 180 -133.29 gain 180 87 -130.09 gain 87 181 -133.39 gain 181 87 -130.26 gain 87 182 -128.98 gain 182 87 -128.23 gain 87 183 -123.33 gain 183 87 -115.98 gain 87 184 -118.59 gain 184 87 -116.02 gain 87 185 -126.17 gain 185 87 -121.08 gain 87 186 -130.59 gain 186 87 -125.79 gain 87 187 -118.33 gain 187 87 -116.07 gain 87 188 -125.45 gain 188 87 -126.45 gain 87 189 -122.29 gain 189 87 -120.81 gain 87 190 -121.05 gain 190 87 -116.58 gain 87 191 -118.33 gain 191 87 -114.94 gain 87 192 -112.33 gain 192 87 -111.81 gain 87 193 -114.38 gain 193 87 -115.11 gain 87 194 -114.72 gain 194 87 -109.27 gain 87 195 -127.73 gain 195 87 -122.91 gain 87 196 -129.64 gain 196 87 -128.86 gain 87 197 -134.44 gain 197 87 -129.72 gain 87 198 -128.76 gain 198 87 -123.56 gain 87 199 -129.14 gain 199 87 -127.86 gain 87 200 -120.25 gain 200 87 -115.91 gain 87 201 -130.36 gain 201 87 -126.82 gain 87 202 -129.54 gain 202 87 -130.01 gain 87 203 -124.94 gain 203 87 -125.02 gain 87 204 -121.20 gain 204 87 -118.57 gain 87 205 -127.49 gain 205 87 -123.93 gain 87 206 -125.71 gain 206 87 -126.67 gain 87 207 -117.40 gain 207 87 -110.73 gain 87 208 -113.85 gain 208 87 -112.95 gain 87 209 -120.97 gain 209 87 -121.06 gain 87 210 -132.46 gain 210 87 -129.49 gain 87 211 -132.07 gain 211 87 -131.12 gain 87 212 -133.00 gain 212 87 -130.60 gain 87 213 -132.09 gain 213 87 -128.88 gain 87 214 -130.24 gain 214 87 -126.91 gain 87 215 -129.02 gain 215 87 -122.11 gain 87 216 -124.94 gain 216 87 -122.69 gain 87 217 -124.41 gain 217 87 -122.68 gain 87 218 -125.24 gain 218 87 -125.70 gain 87 219 -118.55 gain 219 87 -110.36 gain 87 220 -127.94 gain 220 87 -130.25 gain 87 221 -118.81 gain 221 87 -116.76 gain 87 222 -127.94 gain 222 87 -126.22 gain 87 223 -123.83 gain 223 87 -120.72 gain 87 224 -119.65 gain 224 87 -119.23 gain 88 89 -95.68 gain 89 88 -94.28 gain 88 90 -129.22 gain 90 88 -124.83 gain 88 91 -120.87 gain 91 88 -120.42 gain 88 92 -123.33 gain 92 88 -119.85 gain 88 93 -122.58 gain 93 88 -123.88 gain 88 94 -125.68 gain 94 88 -126.85 gain 88 95 -121.34 gain 95 88 -124.77 gain 88 96 -111.03 gain 96 88 -111.80 gain 88 97 -116.36 gain 97 88 -115.87 gain 88 98 -110.89 gain 98 88 -111.20 gain 88 99 -111.84 gain 99 88 -109.97 gain 88 100 -107.01 gain 100 88 -104.71 gain 88 101 -109.36 gain 101 88 -107.22 gain 88 102 -97.70 gain 102 88 -96.34 gain 88 103 -91.69 gain 103 88 -87.81 gain 88 104 -103.73 gain 104 88 -105.23 gain 88 105 -125.68 gain 105 88 -123.12 gain 88 106 -128.53 gain 106 88 -127.05 gain 88 107 -127.15 gain 107 88 -132.25 gain 88 108 -123.78 gain 108 88 -121.19 gain 88 109 -124.45 gain 109 88 -125.35 gain 88 110 -124.91 gain 110 88 -124.28 gain 88 111 -119.84 gain 111 88 -118.89 gain 88 112 -117.26 gain 112 88 -115.19 gain 88 113 -114.04 gain 113 88 -110.78 gain 88 114 -105.81 gain 114 88 -105.85 gain 88 115 -109.97 gain 115 88 -104.31 gain 88 116 -107.96 gain 116 88 -109.84 gain 88 117 -100.30 gain 117 88 -103.68 gain 88 118 -103.02 gain 118 88 -104.73 gain 88 119 -106.95 gain 119 88 -103.32 gain 88 120 -130.35 gain 120 88 -131.23 gain 88 121 -127.22 gain 121 88 -127.39 gain 88 122 -122.58 gain 122 88 -124.87 gain 88 123 -126.00 gain 123 88 -129.06 gain 88 124 -125.61 gain 124 88 -125.08 gain 88 125 -125.15 gain 125 88 -125.95 gain 88 126 -121.63 gain 126 88 -120.39 gain 88 127 -119.82 gain 127 88 -122.04 gain 88 128 -119.35 gain 128 88 -119.52 gain 88 129 -120.32 gain 129 88 -118.39 gain 88 130 -116.37 gain 130 88 -112.27 gain 88 131 -110.21 gain 131 88 -113.19 gain 88 132 -103.79 gain 132 88 -106.40 gain 88 133 -102.25 gain 133 88 -102.93 gain 88 134 -109.64 gain 134 88 -107.02 gain 88 135 -122.24 gain 135 88 -123.19 gain 88 136 -125.60 gain 136 88 -127.16 gain 88 137 -122.83 gain 137 88 -121.87 gain 88 138 -129.20 gain 138 88 -127.24 gain 88 139 -124.11 gain 139 88 -123.14 gain 88 140 -126.52 gain 140 88 -128.15 gain 88 141 -123.88 gain 141 88 -124.19 gain 88 142 -123.09 gain 142 88 -122.70 gain 88 143 -120.19 gain 143 88 -119.42 gain 88 144 -113.66 gain 144 88 -113.91 gain 88 145 -114.50 gain 145 88 -113.20 gain 88 146 -112.78 gain 146 88 -110.38 gain 88 147 -112.22 gain 147 88 -106.91 gain 88 148 -105.00 gain 148 88 -99.41 gain 88 149 -113.81 gain 149 88 -111.39 gain 88 150 -131.93 gain 150 88 -132.19 gain 88 151 -124.76 gain 151 88 -125.22 gain 88 152 -121.57 gain 152 88 -119.01 gain 88 153 -133.21 gain 153 88 -128.23 gain 88 154 -127.70 gain 154 88 -131.26 gain 88 155 -125.25 gain 155 88 -128.71 gain 88 156 -124.99 gain 156 88 -122.84 gain 88 157 -119.99 gain 157 88 -120.78 gain 88 158 -116.59 gain 158 88 -119.98 gain 88 159 -116.01 gain 159 88 -116.02 gain 88 160 -122.99 gain 160 88 -120.10 gain 88 161 -117.76 gain 161 88 -118.37 gain 88 162 -112.84 gain 162 88 -112.31 gain 88 163 -117.15 gain 163 88 -118.78 gain 88 164 -114.77 gain 164 88 -117.43 gain 88 165 -123.16 gain 165 88 -121.87 gain 88 166 -123.18 gain 166 88 -123.46 gain 88 167 -121.53 gain 167 88 -123.90 gain 88 168 -125.76 gain 168 88 -126.58 gain 88 169 -114.87 gain 169 88 -119.88 gain 88 170 -130.26 gain 170 88 -126.80 gain 88 171 -120.50 gain 171 88 -122.07 gain 88 172 -118.99 gain 172 88 -115.25 gain 88 173 -113.12 gain 173 88 -108.81 gain 88 174 -126.00 gain 174 88 -125.99 gain 88 175 -122.69 gain 175 88 -126.24 gain 88 176 -115.54 gain 176 88 -111.09 gain 88 177 -122.31 gain 177 88 -125.68 gain 88 178 -121.93 gain 178 88 -121.13 gain 88 179 -117.14 gain 179 88 -114.73 gain 88 180 -131.87 gain 180 88 -130.92 gain 88 181 -134.80 gain 181 88 -133.92 gain 88 182 -127.73 gain 182 88 -129.24 gain 88 183 -125.98 gain 183 88 -120.88 gain 88 184 -128.08 gain 184 88 -127.76 gain 88 185 -121.77 gain 185 88 -118.93 gain 88 186 -122.16 gain 186 88 -119.61 gain 88 187 -120.07 gain 187 88 -120.06 gain 88 188 -124.94 gain 188 88 -128.19 gain 88 189 -121.99 gain 189 88 -122.76 gain 88 190 -122.55 gain 190 88 -120.32 gain 88 191 -117.36 gain 191 88 -116.22 gain 88 192 -122.49 gain 192 88 -124.23 gain 88 193 -119.95 gain 193 88 -122.93 gain 88 194 -117.26 gain 194 88 -114.05 gain 88 195 -131.22 gain 195 88 -128.65 gain 88 196 -135.87 gain 196 88 -137.34 gain 88 197 -122.71 gain 197 88 -120.24 gain 88 198 -123.08 gain 198 88 -120.13 gain 88 199 -121.47 gain 199 88 -122.44 gain 88 200 -117.28 gain 200 88 -115.19 gain 88 201 -119.01 gain 201 88 -117.72 gain 88 202 -127.77 gain 202 88 -130.48 gain 88 203 -129.31 gain 203 88 -131.64 gain 88 204 -128.36 gain 204 88 -127.98 gain 88 205 -125.32 gain 205 88 -124.01 gain 88 206 -120.31 gain 206 88 -123.52 gain 88 207 -119.74 gain 207 88 -115.31 gain 88 208 -121.18 gain 208 88 -122.53 gain 88 209 -117.59 gain 209 88 -119.93 gain 88 210 -130.25 gain 210 88 -129.53 gain 88 211 -133.94 gain 211 88 -135.24 gain 88 212 -128.19 gain 212 88 -128.03 gain 88 213 -124.81 gain 213 88 -123.84 gain 88 214 -131.87 gain 214 88 -130.80 gain 88 215 -129.69 gain 215 88 -125.03 gain 88 216 -124.23 gain 216 88 -124.23 gain 88 217 -128.80 gain 217 88 -129.32 gain 88 218 -129.38 gain 218 88 -132.09 gain 88 219 -131.33 gain 219 88 -125.39 gain 88 220 -126.85 gain 220 88 -131.41 gain 88 221 -127.88 gain 221 88 -128.08 gain 88 222 -120.21 gain 222 88 -120.74 gain 88 223 -123.71 gain 223 88 -122.85 gain 88 224 -119.99 gain 224 88 -121.82 gain 89 90 -127.15 gain 90 89 -124.16 gain 89 91 -121.37 gain 91 89 -122.32 gain 89 92 -122.41 gain 92 89 -120.32 gain 89 93 -120.24 gain 93 89 -122.94 gain 89 94 -115.65 gain 94 89 -118.23 gain 89 95 -115.63 gain 95 89 -120.46 gain 89 96 -118.52 gain 96 89 -120.68 gain 89 97 -119.84 gain 97 89 -120.75 gain 89 98 -117.71 gain 98 89 -119.42 gain 89 99 -113.56 gain 99 89 -113.09 gain 89 100 -115.90 gain 100 89 -115.00 gain 89 101 -99.14 gain 101 89 -98.40 gain 89 102 -102.40 gain 102 89 -102.44 gain 89 103 -92.82 gain 103 89 -90.35 gain 89 104 -93.01 gain 104 89 -95.90 gain 89 105 -115.65 gain 105 89 -114.49 gain 89 106 -130.53 gain 106 89 -130.46 gain 89 107 -124.63 gain 107 89 -131.13 gain 89 108 -124.20 gain 108 89 -123.01 gain 89 109 -124.82 gain 109 89 -127.11 gain 89 110 -124.30 gain 110 89 -125.07 gain 89 111 -112.96 gain 111 89 -113.40 gain 89 112 -118.02 gain 112 89 -117.35 gain 89 113 -121.08 gain 113 89 -119.21 gain 89 114 -113.23 gain 114 89 -114.67 gain 89 115 -110.48 gain 115 89 -106.22 gain 89 116 -112.59 gain 116 89 -115.88 gain 89 117 -102.08 gain 117 89 -106.86 gain 89 118 -104.57 gain 118 89 -107.68 gain 89 119 -95.85 gain 119 89 -93.61 gain 89 120 -119.34 gain 120 89 -121.62 gain 89 121 -126.72 gain 121 89 -128.29 gain 89 122 -131.09 gain 122 89 -134.77 gain 89 123 -123.99 gain 123 89 -128.45 gain 89 124 -125.99 gain 124 89 -126.86 gain 89 125 -121.99 gain 125 89 -124.19 gain 89 126 -116.07 gain 126 89 -116.23 gain 89 127 -112.28 gain 127 89 -115.90 gain 89 128 -118.14 gain 128 89 -119.70 gain 89 129 -115.63 gain 129 89 -115.10 gain 89 130 -113.73 gain 130 89 -111.03 gain 89 131 -114.08 gain 131 89 -118.45 gain 89 132 -112.64 gain 132 89 -116.65 gain 89 133 -105.53 gain 133 89 -107.61 gain 89 134 -107.42 gain 134 89 -106.19 gain 89 135 -124.94 gain 135 89 -127.28 gain 89 136 -132.58 gain 136 89 -135.54 gain 89 137 -120.43 gain 137 89 -120.87 gain 89 138 -119.97 gain 138 89 -119.41 gain 89 139 -125.83 gain 139 89 -126.26 gain 89 140 -126.39 gain 140 89 -129.42 gain 89 141 -121.71 gain 141 89 -123.42 gain 89 142 -121.44 gain 142 89 -122.46 gain 89 143 -117.64 gain 143 89 -118.27 gain 89 144 -118.52 gain 144 89 -120.17 gain 89 145 -114.77 gain 145 89 -114.87 gain 89 146 -112.42 gain 146 89 -111.43 gain 89 147 -113.71 gain 147 89 -109.80 gain 89 148 -119.49 gain 148 89 -115.30 gain 89 149 -111.73 gain 149 89 -110.71 gain 89 150 -126.41 gain 150 89 -128.07 gain 89 151 -126.94 gain 151 89 -128.80 gain 89 152 -129.80 gain 152 89 -128.64 gain 89 153 -124.25 gain 153 89 -120.67 gain 89 154 -120.69 gain 154 89 -125.66 gain 89 155 -121.02 gain 155 89 -125.89 gain 89 156 -119.03 gain 156 89 -118.28 gain 89 157 -121.84 gain 157 89 -124.04 gain 89 158 -115.67 gain 158 89 -120.45 gain 89 159 -116.97 gain 159 89 -118.38 gain 89 160 -118.50 gain 160 89 -117.02 gain 89 161 -123.21 gain 161 89 -125.22 gain 89 162 -114.51 gain 162 89 -115.38 gain 89 163 -111.31 gain 163 89 -114.33 gain 89 164 -106.65 gain 164 89 -110.72 gain 89 165 -125.89 gain 165 89 -125.99 gain 89 166 -124.48 gain 166 89 -126.15 gain 89 167 -124.38 gain 167 89 -128.14 gain 89 168 -124.45 gain 168 89 -126.66 gain 89 169 -121.51 gain 169 89 -127.92 gain 89 170 -117.80 gain 170 89 -115.74 gain 89 171 -123.36 gain 171 89 -126.32 gain 89 172 -123.07 gain 172 89 -120.73 gain 89 173 -116.38 gain 173 89 -113.48 gain 89 174 -116.76 gain 174 89 -118.15 gain 89 175 -119.80 gain 175 89 -124.74 gain 89 176 -112.39 gain 176 89 -109.35 gain 89 177 -118.18 gain 177 89 -122.95 gain 89 178 -115.92 gain 178 89 -116.52 gain 89 179 -115.88 gain 179 89 -114.87 gain 89 180 -129.48 gain 180 89 -129.93 gain 89 181 -128.84 gain 181 89 -129.36 gain 89 182 -127.21 gain 182 89 -130.12 gain 89 183 -123.50 gain 183 89 -119.79 gain 89 184 -122.10 gain 184 89 -123.18 gain 89 185 -127.73 gain 185 89 -126.30 gain 89 186 -116.76 gain 186 89 -115.61 gain 89 187 -128.56 gain 187 89 -129.94 gain 89 188 -114.05 gain 188 89 -118.70 gain 89 189 -114.65 gain 189 89 -116.82 gain 89 190 -115.71 gain 190 89 -114.88 gain 89 191 -117.94 gain 191 89 -118.21 gain 89 192 -124.60 gain 192 89 -127.74 gain 89 193 -120.59 gain 193 89 -124.97 gain 89 194 -118.04 gain 194 89 -116.24 gain 89 195 -130.10 gain 195 89 -128.93 gain 89 196 -126.98 gain 196 89 -129.85 gain 89 197 -126.80 gain 197 89 -125.73 gain 89 198 -123.61 gain 198 89 -122.06 gain 89 199 -122.04 gain 199 89 -124.41 gain 89 200 -119.66 gain 200 89 -118.97 gain 89 201 -126.08 gain 201 89 -126.19 gain 89 202 -128.93 gain 202 89 -133.04 gain 89 203 -116.81 gain 203 89 -120.55 gain 89 204 -115.74 gain 204 89 -116.76 gain 89 205 -114.03 gain 205 89 -114.13 gain 89 206 -122.58 gain 206 89 -127.19 gain 89 207 -120.54 gain 207 89 -117.51 gain 89 208 -120.05 gain 208 89 -122.80 gain 89 209 -112.68 gain 209 89 -116.42 gain 89 210 -131.83 gain 210 89 -132.50 gain 89 211 -130.50 gain 211 89 -133.20 gain 89 212 -128.85 gain 212 89 -130.10 gain 89 213 -125.30 gain 213 89 -125.74 gain 89 214 -131.12 gain 214 89 -131.44 gain 89 215 -126.78 gain 215 89 -123.52 gain 89 216 -134.07 gain 216 89 -135.47 gain 89 217 -120.26 gain 217 89 -122.18 gain 89 218 -126.61 gain 218 89 -130.72 gain 89 219 -127.01 gain 219 89 -122.48 gain 89 220 -115.19 gain 220 89 -121.15 gain 89 221 -120.56 gain 221 89 -122.16 gain 89 222 -128.89 gain 222 89 -130.81 gain 89 223 -117.73 gain 223 89 -118.27 gain 89 224 -129.36 gain 224 89 -132.58 gain 90 91 -89.36 gain 91 90 -93.30 gain 90 92 -92.49 gain 92 90 -93.39 gain 90 93 -103.99 gain 93 90 -109.68 gain 90 94 -99.33 gain 94 90 -104.90 gain 90 95 -111.38 gain 95 90 -119.20 gain 90 96 -112.39 gain 96 90 -117.55 gain 90 97 -109.97 gain 97 90 -113.88 gain 90 98 -108.90 gain 98 90 -113.60 gain 90 99 -115.44 gain 99 90 -117.97 gain 90 100 -124.49 gain 100 90 -126.58 gain 90 101 -115.75 gain 101 90 -118.00 gain 90 102 -126.62 gain 102 90 -129.65 gain 90 103 -124.02 gain 103 90 -124.54 gain 90 104 -123.78 gain 104 90 -129.67 gain 90 105 -88.99 gain 105 90 -90.82 gain 90 106 -95.96 gain 106 90 -98.88 gain 90 107 -100.72 gain 107 90 -110.20 gain 90 108 -102.57 gain 108 90 -104.37 gain 90 109 -108.03 gain 109 90 -113.32 gain 90 110 -110.02 gain 110 90 -113.78 gain 90 111 -117.49 gain 111 90 -120.93 gain 90 112 -114.26 gain 112 90 -116.58 gain 90 113 -119.04 gain 113 90 -120.17 gain 90 114 -115.96 gain 114 90 -120.39 gain 90 115 -119.50 gain 115 90 -118.23 gain 90 116 -121.64 gain 116 90 -127.91 gain 90 117 -123.63 gain 117 90 -131.40 gain 90 118 -119.90 gain 118 90 -125.99 gain 90 119 -129.13 gain 119 90 -129.88 gain 90 120 -99.99 gain 120 90 -105.26 gain 90 121 -101.54 gain 121 90 -106.10 gain 90 122 -102.80 gain 122 90 -109.47 gain 90 123 -103.24 gain 123 90 -110.69 gain 90 124 -111.30 gain 124 90 -115.16 gain 90 125 -108.23 gain 125 90 -113.43 gain 90 126 -114.00 gain 126 90 -117.15 gain 90 127 -114.48 gain 127 90 -121.09 gain 90 128 -124.96 gain 128 90 -129.52 gain 90 129 -115.77 gain 129 90 -118.23 gain 90 130 -130.68 gain 130 90 -130.96 gain 90 131 -122.90 gain 131 90 -130.27 gain 90 132 -123.45 gain 132 90 -130.45 gain 90 133 -127.25 gain 133 90 -132.32 gain 90 134 -127.34 gain 134 90 -129.11 gain 90 135 -107.82 gain 135 90 -113.16 gain 90 136 -110.32 gain 136 90 -116.27 gain 90 137 -107.42 gain 137 90 -110.85 gain 90 138 -107.04 gain 138 90 -109.47 gain 90 139 -113.76 gain 139 90 -117.17 gain 90 140 -109.69 gain 140 90 -115.71 gain 90 141 -105.15 gain 141 90 -109.85 gain 90 142 -117.53 gain 142 90 -121.53 gain 90 143 -114.24 gain 143 90 -117.86 gain 90 144 -118.17 gain 144 90 -122.81 gain 90 145 -118.03 gain 145 90 -121.11 gain 90 146 -115.05 gain 146 90 -117.05 gain 90 147 -124.05 gain 147 90 -123.14 gain 90 148 -125.62 gain 148 90 -124.42 gain 90 149 -119.43 gain 149 90 -121.40 gain 90 150 -107.86 gain 150 90 -112.52 gain 90 151 -109.21 gain 151 90 -114.07 gain 90 152 -103.62 gain 152 90 -105.45 gain 90 153 -109.29 gain 153 90 -108.70 gain 90 154 -116.58 gain 154 90 -124.54 gain 90 155 -117.79 gain 155 90 -125.65 gain 90 156 -116.93 gain 156 90 -119.17 gain 90 157 -115.10 gain 157 90 -120.29 gain 90 158 -113.88 gain 158 90 -121.66 gain 90 159 -117.63 gain 159 90 -122.03 gain 90 160 -125.71 gain 160 90 -127.22 gain 90 161 -123.94 gain 161 90 -128.94 gain 90 162 -131.46 gain 162 90 -135.32 gain 90 163 -122.25 gain 163 90 -128.26 gain 90 164 -120.77 gain 164 90 -127.83 gain 90 165 -106.35 gain 165 90 -109.44 gain 90 166 -114.98 gain 166 90 -119.64 gain 90 167 -113.79 gain 167 90 -120.55 gain 90 168 -108.43 gain 168 90 -113.63 gain 90 169 -112.15 gain 169 90 -121.55 gain 90 170 -109.80 gain 170 90 -110.73 gain 90 171 -121.04 gain 171 90 -126.99 gain 90 172 -118.39 gain 172 90 -119.05 gain 90 173 -128.13 gain 173 90 -128.22 gain 90 174 -119.07 gain 174 90 -123.46 gain 90 175 -120.68 gain 175 90 -128.61 gain 90 176 -121.16 gain 176 90 -121.11 gain 90 177 -130.61 gain 177 90 -138.38 gain 90 178 -125.45 gain 178 90 -129.04 gain 90 179 -126.47 gain 179 90 -128.45 gain 90 180 -111.93 gain 180 90 -115.38 gain 90 181 -110.69 gain 181 90 -114.20 gain 90 182 -112.13 gain 182 90 -118.03 gain 90 183 -114.34 gain 183 90 -113.62 gain 90 184 -117.70 gain 184 90 -121.77 gain 90 185 -116.24 gain 185 90 -117.80 gain 90 186 -112.18 gain 186 90 -114.02 gain 90 187 -123.77 gain 187 90 -128.15 gain 90 188 -119.80 gain 188 90 -127.44 gain 90 189 -122.04 gain 189 90 -127.19 gain 90 190 -126.12 gain 190 90 -128.28 gain 90 191 -122.17 gain 191 90 -125.43 gain 90 192 -124.64 gain 192 90 -130.76 gain 90 193 -125.39 gain 193 90 -132.77 gain 90 194 -122.06 gain 194 90 -123.24 gain 90 195 -120.26 gain 195 90 -122.08 gain 90 196 -124.70 gain 196 90 -130.56 gain 90 197 -110.01 gain 197 90 -111.93 gain 90 198 -109.93 gain 198 90 -111.37 gain 90 199 -117.39 gain 199 90 -122.75 gain 90 200 -120.13 gain 200 90 -122.43 gain 90 201 -119.71 gain 201 90 -122.82 gain 90 202 -115.66 gain 202 90 -122.77 gain 90 203 -121.21 gain 203 90 -127.94 gain 90 204 -117.51 gain 204 90 -121.52 gain 90 205 -119.41 gain 205 90 -122.49 gain 90 206 -128.92 gain 206 90 -136.53 gain 90 207 -119.64 gain 207 90 -119.60 gain 90 208 -119.05 gain 208 90 -124.79 gain 90 209 -132.95 gain 209 90 -139.68 gain 90 210 -121.59 gain 210 90 -125.26 gain 90 211 -117.18 gain 211 90 -122.87 gain 90 212 -117.15 gain 212 90 -121.39 gain 90 213 -115.61 gain 213 90 -119.04 gain 90 214 -117.44 gain 214 90 -120.75 gain 90 215 -123.82 gain 215 90 -123.55 gain 90 216 -121.97 gain 216 90 -126.37 gain 90 217 -122.60 gain 217 90 -127.51 gain 90 218 -122.19 gain 218 90 -129.29 gain 90 219 -124.87 gain 219 90 -123.33 gain 90 220 -121.30 gain 220 90 -130.25 gain 90 221 -123.93 gain 221 90 -128.52 gain 90 222 -129.99 gain 222 90 -134.91 gain 90 223 -129.05 gain 223 90 -132.58 gain 90 224 -124.46 gain 224 90 -130.68 gain 91 92 -94.92 gain 92 91 -91.88 gain 91 93 -104.80 gain 93 91 -106.54 gain 91 94 -107.82 gain 94 91 -109.44 gain 91 95 -113.08 gain 95 91 -116.95 gain 91 96 -112.83 gain 96 91 -114.04 gain 91 97 -118.42 gain 97 91 -118.38 gain 91 98 -118.59 gain 98 91 -119.34 gain 91 99 -118.67 gain 99 91 -117.25 gain 91 100 -124.37 gain 100 91 -122.51 gain 91 101 -121.80 gain 101 91 -120.11 gain 91 102 -127.14 gain 102 91 -126.23 gain 91 103 -124.40 gain 103 91 -120.97 gain 91 104 -128.35 gain 104 91 -130.30 gain 91 105 -98.41 gain 105 91 -96.30 gain 91 106 -88.91 gain 106 91 -87.88 gain 91 107 -100.11 gain 107 91 -105.65 gain 91 108 -105.51 gain 108 91 -103.37 gain 91 109 -115.74 gain 109 91 -117.08 gain 91 110 -111.40 gain 110 91 -111.21 gain 91 111 -109.61 gain 111 91 -109.10 gain 91 112 -113.41 gain 112 91 -111.78 gain 91 113 -121.52 gain 113 91 -118.70 gain 91 114 -126.83 gain 114 91 -127.31 gain 91 115 -126.58 gain 115 91 -121.37 gain 91 116 -131.39 gain 116 91 -133.72 gain 91 117 -127.30 gain 117 91 -131.13 gain 91 118 -129.92 gain 118 91 -132.07 gain 91 119 -124.44 gain 119 91 -121.25 gain 91 120 -93.92 gain 120 91 -95.25 gain 91 121 -107.43 gain 121 91 -108.05 gain 91 122 -110.29 gain 122 91 -113.02 gain 91 123 -105.93 gain 123 91 -109.43 gain 91 124 -114.33 gain 124 91 -114.25 gain 91 125 -113.86 gain 125 91 -115.12 gain 91 126 -122.05 gain 126 91 -121.26 gain 91 127 -120.08 gain 127 91 -122.75 gain 91 128 -124.57 gain 128 91 -125.18 gain 91 129 -127.67 gain 129 91 -126.19 gain 91 130 -128.25 gain 130 91 -124.59 gain 91 131 -125.60 gain 131 91 -129.02 gain 91 132 -131.02 gain 132 91 -134.07 gain 91 133 -121.37 gain 133 91 -122.50 gain 91 134 -133.45 gain 134 91 -131.27 gain 91 135 -112.17 gain 135 91 -113.56 gain 91 136 -106.25 gain 136 91 -108.26 gain 91 137 -109.26 gain 137 91 -108.75 gain 91 138 -110.13 gain 138 91 -108.62 gain 91 139 -116.67 gain 139 91 -116.14 gain 91 140 -118.41 gain 140 91 -120.49 gain 91 141 -117.49 gain 141 91 -118.25 gain 91 142 -119.76 gain 142 91 -119.82 gain 91 143 -121.72 gain 143 91 -121.40 gain 91 144 -123.77 gain 144 91 -124.47 gain 91 145 -123.45 gain 145 91 -122.59 gain 91 146 -125.95 gain 146 91 -124.00 gain 91 147 -132.26 gain 147 91 -127.40 gain 91 148 -132.97 gain 148 91 -127.83 gain 91 149 -128.56 gain 149 91 -126.59 gain 91 150 -110.02 gain 150 91 -110.73 gain 91 151 -114.87 gain 151 91 -115.78 gain 91 152 -110.99 gain 152 91 -108.88 gain 91 153 -108.08 gain 153 91 -103.54 gain 91 154 -114.88 gain 154 91 -118.89 gain 91 155 -113.13 gain 155 91 -117.04 gain 91 156 -118.53 gain 156 91 -116.82 gain 91 157 -118.23 gain 157 91 -119.47 gain 91 158 -114.45 gain 158 91 -118.28 gain 91 159 -121.93 gain 159 91 -122.39 gain 91 160 -129.80 gain 160 91 -127.37 gain 91 161 -129.94 gain 161 91 -131.00 gain 91 162 -118.90 gain 162 91 -118.82 gain 91 163 -123.94 gain 163 91 -126.01 gain 91 164 -125.85 gain 164 91 -128.96 gain 91 165 -114.34 gain 165 91 -113.50 gain 91 166 -114.46 gain 166 91 -115.18 gain 91 167 -114.57 gain 167 91 -117.38 gain 91 168 -123.44 gain 168 91 -124.70 gain 91 169 -117.44 gain 169 91 -122.90 gain 91 170 -129.39 gain 170 91 -126.38 gain 91 171 -117.31 gain 171 91 -119.32 gain 91 172 -116.21 gain 172 91 -112.92 gain 91 173 -132.37 gain 173 91 -128.51 gain 91 174 -119.23 gain 174 91 -119.67 gain 91 175 -122.45 gain 175 91 -126.44 gain 91 176 -121.76 gain 176 91 -117.77 gain 91 177 -131.06 gain 177 91 -134.88 gain 91 178 -126.40 gain 178 91 -126.04 gain 91 179 -132.95 gain 179 91 -130.99 gain 91 180 -112.04 gain 180 91 -111.54 gain 91 181 -111.45 gain 181 91 -111.02 gain 91 182 -105.97 gain 182 91 -107.93 gain 91 183 -111.91 gain 183 91 -107.25 gain 91 184 -123.20 gain 184 91 -123.32 gain 91 185 -122.02 gain 185 91 -119.63 gain 91 186 -118.68 gain 186 91 -116.58 gain 91 187 -114.60 gain 187 91 -115.04 gain 91 188 -119.68 gain 188 91 -123.38 gain 91 189 -119.85 gain 189 91 -121.06 gain 91 190 -121.24 gain 190 91 -119.46 gain 91 191 -128.48 gain 191 91 -127.79 gain 91 192 -124.85 gain 192 91 -127.04 gain 91 193 -130.44 gain 193 91 -133.88 gain 91 194 -130.07 gain 194 91 -127.31 gain 91 195 -107.83 gain 195 91 -105.71 gain 91 196 -126.27 gain 196 91 -128.19 gain 91 197 -121.64 gain 197 91 -119.62 gain 91 198 -123.96 gain 198 91 -121.46 gain 91 199 -123.86 gain 199 91 -125.27 gain 91 200 -118.06 gain 200 91 -116.42 gain 91 201 -123.11 gain 201 91 -122.27 gain 91 202 -123.77 gain 202 91 -126.93 gain 91 203 -124.73 gain 203 91 -127.51 gain 91 204 -120.05 gain 204 91 -120.11 gain 91 205 -126.46 gain 205 91 -125.60 gain 91 206 -129.65 gain 206 91 -133.31 gain 91 207 -125.17 gain 207 91 -121.19 gain 91 208 -134.08 gain 208 91 -135.87 gain 91 209 -126.92 gain 209 91 -129.71 gain 91 210 -116.50 gain 210 91 -116.23 gain 91 211 -118.24 gain 211 91 -119.99 gain 91 212 -118.59 gain 212 91 -118.88 gain 91 213 -120.82 gain 213 91 -120.30 gain 91 214 -125.32 gain 214 91 -124.69 gain 91 215 -125.57 gain 215 91 -121.35 gain 91 216 -124.56 gain 216 91 -125.01 gain 91 217 -120.49 gain 217 91 -121.46 gain 91 218 -126.08 gain 218 91 -129.23 gain 91 219 -125.09 gain 219 91 -119.61 gain 91 220 -121.15 gain 220 91 -126.16 gain 91 221 -127.42 gain 221 91 -128.07 gain 91 222 -123.94 gain 222 91 -124.91 gain 91 223 -124.30 gain 223 91 -123.89 gain 91 224 -128.16 gain 224 91 -130.43 gain 92 93 -94.45 gain 93 92 -99.24 gain 92 94 -94.72 gain 94 92 -99.38 gain 92 95 -104.07 gain 95 92 -110.98 gain 92 96 -110.25 gain 96 92 -114.50 gain 92 97 -110.65 gain 97 92 -113.65 gain 92 98 -113.98 gain 98 92 -117.78 gain 92 99 -115.79 gain 99 92 -117.41 gain 92 100 -117.70 gain 100 92 -118.88 gain 92 101 -115.74 gain 101 92 -117.09 gain 92 102 -119.89 gain 102 92 -122.02 gain 92 103 -112.89 gain 103 92 -112.51 gain 92 104 -127.01 gain 104 92 -131.99 gain 92 105 -106.37 gain 105 92 -107.30 gain 92 106 -91.20 gain 106 92 -93.21 gain 92 107 -89.63 gain 107 92 -98.21 gain 92 108 -95.38 gain 108 92 -96.27 gain 92 109 -93.88 gain 109 92 -98.26 gain 92 110 -104.95 gain 110 92 -107.81 gain 92 111 -112.79 gain 111 92 -115.33 gain 92 112 -113.02 gain 112 92 -114.44 gain 92 113 -117.39 gain 113 92 -117.61 gain 92 114 -112.50 gain 114 92 -116.02 gain 92 115 -117.04 gain 115 92 -114.87 gain 92 116 -119.90 gain 116 92 -125.27 gain 92 117 -114.40 gain 117 92 -121.26 gain 92 118 -126.04 gain 118 92 -131.23 gain 92 119 -123.27 gain 119 92 -123.12 gain 92 120 -105.63 gain 120 92 -110.00 gain 92 121 -108.40 gain 121 92 -112.06 gain 92 122 -100.50 gain 122 92 -106.28 gain 92 123 -100.32 gain 123 92 -106.87 gain 92 124 -106.41 gain 124 92 -109.37 gain 92 125 -109.96 gain 125 92 -114.25 gain 92 126 -108.55 gain 126 92 -110.79 gain 92 127 -103.33 gain 127 92 -109.04 gain 92 128 -107.96 gain 128 92 -111.61 gain 92 129 -116.39 gain 129 92 -117.94 gain 92 130 -116.85 gain 130 92 -116.23 gain 92 131 -116.22 gain 131 92 -122.69 gain 92 132 -119.93 gain 132 92 -126.02 gain 92 133 -120.61 gain 133 92 -124.77 gain 92 134 -128.60 gain 134 92 -129.46 gain 92 135 -114.07 gain 135 92 -118.50 gain 92 136 -108.80 gain 136 92 -113.84 gain 92 137 -106.88 gain 137 92 -109.41 gain 92 138 -110.17 gain 138 92 -111.70 gain 92 139 -108.92 gain 139 92 -111.43 gain 92 140 -107.63 gain 140 92 -112.75 gain 92 141 -107.27 gain 141 92 -111.06 gain 92 142 -107.97 gain 142 92 -111.07 gain 92 143 -118.47 gain 143 92 -121.18 gain 92 144 -118.21 gain 144 92 -121.94 gain 92 145 -120.33 gain 145 92 -122.51 gain 92 146 -124.36 gain 146 92 -125.45 gain 92 147 -119.44 gain 147 92 -117.63 gain 92 148 -122.63 gain 148 92 -120.53 gain 92 149 -133.58 gain 149 92 -134.64 gain 92 150 -111.27 gain 150 92 -115.03 gain 92 151 -111.70 gain 151 92 -115.65 gain 92 152 -106.57 gain 152 92 -107.50 gain 92 153 -113.18 gain 153 92 -111.68 gain 92 154 -111.99 gain 154 92 -119.04 gain 92 155 -114.04 gain 155 92 -120.99 gain 92 156 -108.84 gain 156 92 -110.17 gain 92 157 -110.16 gain 157 92 -114.44 gain 92 158 -119.46 gain 158 92 -126.33 gain 92 159 -119.28 gain 159 92 -122.78 gain 92 160 -117.99 gain 160 92 -118.60 gain 92 161 -120.80 gain 161 92 -124.89 gain 92 162 -125.17 gain 162 92 -128.13 gain 92 163 -119.59 gain 163 92 -124.70 gain 92 164 -125.26 gain 164 92 -131.41 gain 92 165 -120.78 gain 165 92 -122.97 gain 92 166 -116.34 gain 166 92 -120.10 gain 92 167 -111.59 gain 167 92 -117.44 gain 92 168 -113.41 gain 168 92 -117.71 gain 92 169 -114.04 gain 169 92 -122.54 gain 92 170 -112.41 gain 170 92 -112.44 gain 92 171 -116.75 gain 171 92 -121.80 gain 92 172 -113.79 gain 172 92 -113.53 gain 92 173 -121.44 gain 173 92 -120.62 gain 92 174 -115.76 gain 174 92 -119.24 gain 92 175 -119.96 gain 175 92 -127.00 gain 92 176 -122.21 gain 176 92 -121.25 gain 92 177 -122.16 gain 177 92 -129.01 gain 92 178 -125.92 gain 178 92 -128.60 gain 92 179 -113.93 gain 179 92 -115.00 gain 92 180 -114.18 gain 180 92 -116.72 gain 92 181 -112.68 gain 181 92 -115.29 gain 92 182 -111.92 gain 182 92 -116.92 gain 92 183 -113.95 gain 183 92 -112.34 gain 92 184 -117.23 gain 184 92 -120.40 gain 92 185 -110.54 gain 185 92 -111.19 gain 92 186 -117.42 gain 186 92 -118.35 gain 92 187 -115.11 gain 187 92 -118.58 gain 92 188 -120.29 gain 188 92 -127.02 gain 92 189 -114.82 gain 189 92 -119.08 gain 92 190 -121.98 gain 190 92 -123.24 gain 92 191 -127.70 gain 191 92 -130.06 gain 92 192 -116.19 gain 192 92 -121.41 gain 92 193 -120.98 gain 193 92 -127.46 gain 92 194 -122.27 gain 194 92 -122.56 gain 92 195 -111.30 gain 195 92 -112.21 gain 92 196 -115.73 gain 196 92 -120.69 gain 92 197 -114.03 gain 197 92 -115.04 gain 92 198 -112.68 gain 198 92 -113.21 gain 92 199 -118.43 gain 199 92 -122.89 gain 92 200 -120.28 gain 200 92 -121.68 gain 92 201 -120.24 gain 201 92 -122.44 gain 92 202 -114.43 gain 202 92 -120.63 gain 92 203 -121.87 gain 203 92 -127.69 gain 92 204 -124.97 gain 204 92 -128.07 gain 92 205 -123.49 gain 205 92 -125.67 gain 92 206 -119.13 gain 206 92 -125.83 gain 92 207 -124.32 gain 207 92 -123.38 gain 92 208 -128.83 gain 208 92 -133.66 gain 92 209 -124.52 gain 209 92 -130.35 gain 92 210 -111.73 gain 210 92 -114.50 gain 92 211 -113.92 gain 211 92 -118.71 gain 92 212 -121.77 gain 212 92 -125.10 gain 92 213 -115.53 gain 213 92 -118.06 gain 92 214 -125.16 gain 214 92 -127.57 gain 92 215 -116.48 gain 215 92 -115.31 gain 92 216 -114.34 gain 216 92 -117.82 gain 92 217 -125.36 gain 217 92 -129.36 gain 92 218 -122.06 gain 218 92 -128.26 gain 92 219 -124.10 gain 219 92 -121.66 gain 92 220 -126.50 gain 220 92 -134.55 gain 92 221 -123.77 gain 221 92 -127.45 gain 92 222 -121.94 gain 222 92 -125.96 gain 92 223 -120.90 gain 223 92 -123.52 gain 92 224 -118.78 gain 224 92 -124.10 gain 93 94 -96.73 gain 94 93 -96.61 gain 93 95 -103.49 gain 95 93 -105.62 gain 93 96 -113.48 gain 96 93 -112.94 gain 93 97 -119.07 gain 97 93 -117.28 gain 93 98 -119.93 gain 98 93 -118.94 gain 93 99 -116.44 gain 99 93 -113.27 gain 93 100 -121.54 gain 100 93 -117.94 gain 93 101 -118.70 gain 101 93 -115.27 gain 93 102 -120.22 gain 102 93 -117.56 gain 93 103 -120.37 gain 103 93 -115.19 gain 93 104 -121.99 gain 104 93 -122.19 gain 93 105 -114.64 gain 105 93 -110.78 gain 93 106 -102.20 gain 106 93 -99.43 gain 93 107 -98.65 gain 107 93 -102.44 gain 93 108 -95.81 gain 108 93 -91.92 gain 93 109 -92.38 gain 109 93 -91.98 gain 93 110 -103.56 gain 110 93 -101.63 gain 93 111 -111.53 gain 111 93 -109.28 gain 93 112 -110.49 gain 112 93 -107.12 gain 93 113 -118.77 gain 113 93 -114.20 gain 93 114 -112.94 gain 114 93 -111.68 gain 93 115 -123.54 gain 115 93 -116.59 gain 93 116 -121.34 gain 116 93 -121.93 gain 93 117 -119.31 gain 117 93 -121.39 gain 93 118 -123.66 gain 118 93 -124.07 gain 93 119 -118.48 gain 119 93 -113.54 gain 93 120 -110.64 gain 120 93 -110.22 gain 93 121 -107.11 gain 121 93 -105.98 gain 93 122 -98.81 gain 122 93 -99.80 gain 93 123 -108.19 gain 123 93 -109.95 gain 93 124 -104.63 gain 124 93 -102.80 gain 93 125 -102.39 gain 125 93 -101.89 gain 93 126 -109.26 gain 126 93 -106.72 gain 93 127 -114.36 gain 127 93 -115.29 gain 93 128 -124.71 gain 128 93 -123.58 gain 93 129 -120.14 gain 129 93 -116.91 gain 93 130 -126.46 gain 130 93 -121.06 gain 93 131 -119.27 gain 131 93 -120.95 gain 93 132 -127.77 gain 132 93 -129.08 gain 93 133 -126.27 gain 133 93 -125.65 gain 93 134 -127.97 gain 134 93 -124.05 gain 93 135 -110.86 gain 135 93 -110.51 gain 93 136 -113.11 gain 136 93 -113.37 gain 93 137 -112.37 gain 137 93 -110.11 gain 93 138 -112.93 gain 138 93 -109.67 gain 93 139 -110.19 gain 139 93 -107.91 gain 93 140 -112.05 gain 140 93 -112.39 gain 93 141 -103.25 gain 141 93 -102.26 gain 93 142 -114.41 gain 142 93 -112.72 gain 93 143 -118.98 gain 143 93 -116.91 gain 93 144 -119.50 gain 144 93 -118.45 gain 93 145 -123.26 gain 145 93 -120.65 gain 93 146 -120.46 gain 146 93 -116.77 gain 93 147 -132.05 gain 147 93 -125.45 gain 93 148 -128.90 gain 148 93 -122.01 gain 93 149 -132.87 gain 149 93 -129.16 gain 93 150 -116.37 gain 150 93 -115.33 gain 93 151 -107.56 gain 151 93 -106.73 gain 93 152 -111.42 gain 152 93 -107.56 gain 93 153 -111.16 gain 153 93 -104.88 gain 93 154 -116.28 gain 154 93 -118.55 gain 93 155 -116.10 gain 155 93 -118.26 gain 93 156 -117.76 gain 156 93 -114.31 gain 93 157 -121.48 gain 157 93 -120.98 gain 93 158 -120.08 gain 158 93 -122.17 gain 93 159 -123.87 gain 159 93 -122.58 gain 93 160 -124.01 gain 160 93 -119.83 gain 93 161 -121.03 gain 161 93 -120.34 gain 93 162 -124.34 gain 162 93 -122.51 gain 93 163 -134.87 gain 163 93 -135.20 gain 93 164 -128.27 gain 164 93 -129.64 gain 93 165 -118.78 gain 165 93 -116.19 gain 93 166 -117.96 gain 166 93 -116.93 gain 93 167 -113.39 gain 167 93 -114.46 gain 93 168 -121.44 gain 168 93 -120.96 gain 93 169 -126.50 gain 169 93 -130.21 gain 93 170 -116.44 gain 170 93 -111.68 gain 93 171 -125.75 gain 171 93 -126.01 gain 93 172 -120.92 gain 172 93 -115.88 gain 93 173 -118.96 gain 173 93 -113.35 gain 93 174 -124.35 gain 174 93 -123.04 gain 93 175 -122.68 gain 175 93 -124.92 gain 93 176 -124.79 gain 176 93 -119.05 gain 93 177 -125.47 gain 177 93 -127.54 gain 93 178 -133.26 gain 178 93 -131.16 gain 93 179 -127.68 gain 179 93 -123.97 gain 93 180 -121.36 gain 180 93 -119.12 gain 93 181 -116.94 gain 181 93 -114.76 gain 93 182 -118.60 gain 182 93 -118.81 gain 93 183 -122.06 gain 183 93 -115.66 gain 93 184 -118.05 gain 184 93 -116.43 gain 93 185 -122.69 gain 185 93 -118.56 gain 93 186 -116.32 gain 186 93 -112.47 gain 93 187 -116.44 gain 187 93 -115.13 gain 93 188 -120.44 gain 188 93 -122.39 gain 93 189 -129.06 gain 189 93 -128.52 gain 93 190 -125.97 gain 190 93 -122.45 gain 93 191 -126.20 gain 191 93 -123.76 gain 93 192 -132.09 gain 192 93 -132.53 gain 93 193 -127.86 gain 193 93 -129.54 gain 93 194 -126.89 gain 194 93 -122.38 gain 93 195 -124.24 gain 195 93 -120.37 gain 93 196 -122.08 gain 196 93 -122.25 gain 93 197 -119.46 gain 197 93 -115.69 gain 93 198 -118.75 gain 198 93 -114.51 gain 93 199 -116.00 gain 199 93 -115.67 gain 93 200 -119.79 gain 200 93 -116.40 gain 93 201 -117.80 gain 201 93 -115.22 gain 93 202 -131.46 gain 202 93 -132.88 gain 93 203 -126.30 gain 203 93 -127.34 gain 93 204 -124.91 gain 204 93 -123.23 gain 93 205 -119.77 gain 205 93 -117.17 gain 93 206 -125.94 gain 206 93 -127.86 gain 93 207 -123.37 gain 207 93 -117.65 gain 93 208 -128.03 gain 208 93 -128.08 gain 93 209 -124.60 gain 209 93 -125.65 gain 93 210 -113.38 gain 210 93 -111.36 gain 93 211 -118.84 gain 211 93 -118.85 gain 93 212 -118.92 gain 212 93 -117.46 gain 93 213 -125.03 gain 213 93 -122.76 gain 93 214 -125.65 gain 214 93 -123.28 gain 93 215 -121.45 gain 215 93 -115.49 gain 93 216 -126.28 gain 216 93 -124.98 gain 93 217 -126.53 gain 217 93 -125.75 gain 93 218 -124.24 gain 218 93 -125.65 gain 93 219 -123.92 gain 219 93 -116.69 gain 93 220 -133.15 gain 220 93 -136.41 gain 93 221 -125.69 gain 221 93 -124.59 gain 93 222 -123.04 gain 222 93 -122.27 gain 93 223 -129.91 gain 223 93 -127.75 gain 93 224 -130.40 gain 224 93 -130.93 gain 94 95 -100.36 gain 95 94 -102.61 gain 94 96 -103.28 gain 96 94 -102.87 gain 94 97 -103.96 gain 97 94 -102.30 gain 94 98 -120.58 gain 98 94 -119.71 gain 94 99 -114.16 gain 99 94 -111.11 gain 94 100 -118.10 gain 100 94 -114.63 gain 94 101 -114.28 gain 101 94 -110.96 gain 94 102 -122.72 gain 102 94 -120.19 gain 94 103 -127.29 gain 103 94 -122.24 gain 94 104 -127.26 gain 104 94 -127.59 gain 94 105 -114.85 gain 105 94 -111.12 gain 94 106 -116.07 gain 106 94 -113.42 gain 94 107 -106.77 gain 107 94 -110.69 gain 94 108 -95.30 gain 108 94 -91.53 gain 94 109 -97.59 gain 109 94 -97.31 gain 94 110 -95.57 gain 110 94 -93.77 gain 94 111 -100.45 gain 111 94 -98.33 gain 94 112 -112.58 gain 112 94 -109.33 gain 94 113 -108.35 gain 113 94 -103.91 gain 94 114 -121.67 gain 114 94 -120.53 gain 94 115 -118.61 gain 115 94 -111.78 gain 94 116 -122.58 gain 116 94 -123.29 gain 94 117 -119.67 gain 117 94 -121.88 gain 94 118 -122.35 gain 118 94 -122.88 gain 94 119 -131.02 gain 119 94 -126.21 gain 94 120 -109.97 gain 120 94 -109.67 gain 94 121 -106.70 gain 121 94 -105.69 gain 94 122 -110.49 gain 122 94 -111.60 gain 94 123 -104.61 gain 123 94 -106.50 gain 94 124 -106.98 gain 124 94 -105.27 gain 94 125 -105.04 gain 125 94 -104.68 gain 94 126 -113.95 gain 126 94 -111.54 gain 94 127 -114.79 gain 127 94 -115.84 gain 94 128 -114.19 gain 128 94 -113.18 gain 94 129 -114.60 gain 129 94 -111.50 gain 94 130 -115.40 gain 130 94 -110.12 gain 94 131 -122.80 gain 131 94 -124.61 gain 94 132 -122.71 gain 132 94 -124.14 gain 94 133 -126.14 gain 133 94 -125.64 gain 94 134 -124.87 gain 134 94 -121.07 gain 94 135 -116.03 gain 135 94 -115.80 gain 94 136 -118.27 gain 136 94 -118.65 gain 94 137 -110.87 gain 137 94 -108.74 gain 94 138 -109.57 gain 138 94 -106.44 gain 94 139 -104.02 gain 139 94 -101.87 gain 94 140 -112.96 gain 140 94 -113.42 gain 94 141 -118.03 gain 141 94 -117.16 gain 94 142 -112.17 gain 142 94 -110.61 gain 94 143 -119.50 gain 143 94 -117.55 gain 94 144 -126.17 gain 144 94 -125.24 gain 94 145 -118.43 gain 145 94 -115.96 gain 94 146 -119.69 gain 146 94 -116.12 gain 94 147 -124.14 gain 147 94 -117.66 gain 94 148 -126.86 gain 148 94 -120.10 gain 94 149 -125.47 gain 149 94 -121.88 gain 94 150 -115.67 gain 150 94 -114.77 gain 94 151 -106.81 gain 151 94 -106.10 gain 94 152 -118.28 gain 152 94 -114.55 gain 94 153 -117.44 gain 153 94 -111.28 gain 94 154 -116.04 gain 154 94 -118.43 gain 94 155 -110.29 gain 155 94 -112.58 gain 94 156 -109.56 gain 156 94 -106.23 gain 94 157 -112.16 gain 157 94 -111.78 gain 94 158 -116.46 gain 158 94 -118.68 gain 94 159 -117.53 gain 159 94 -116.36 gain 94 160 -122.33 gain 160 94 -118.28 gain 94 161 -125.30 gain 161 94 -124.74 gain 94 162 -120.43 gain 162 94 -118.73 gain 94 163 -122.62 gain 163 94 -123.07 gain 94 164 -122.16 gain 164 94 -123.65 gain 94 165 -117.94 gain 165 94 -115.47 gain 94 166 -117.00 gain 166 94 -116.10 gain 94 167 -120.60 gain 167 94 -121.79 gain 94 168 -121.27 gain 168 94 -120.91 gain 94 169 -118.69 gain 169 94 -122.53 gain 94 170 -114.44 gain 170 94 -109.81 gain 94 171 -120.13 gain 171 94 -120.52 gain 94 172 -130.54 gain 172 94 -125.63 gain 94 173 -113.40 gain 173 94 -107.92 gain 94 174 -116.63 gain 174 94 -115.44 gain 94 175 -120.02 gain 175 94 -122.40 gain 94 176 -120.85 gain 176 94 -115.24 gain 94 177 -123.84 gain 177 94 -126.03 gain 94 178 -122.91 gain 178 94 -120.93 gain 94 179 -120.55 gain 179 94 -116.96 gain 94 180 -121.97 gain 180 94 -119.85 gain 94 181 -122.56 gain 181 94 -120.50 gain 94 182 -120.00 gain 182 94 -120.33 gain 94 183 -112.39 gain 183 94 -106.12 gain 94 184 -116.47 gain 184 94 -114.98 gain 94 185 -120.33 gain 185 94 -116.32 gain 94 186 -122.33 gain 186 94 -118.60 gain 94 187 -121.22 gain 187 94 -120.04 gain 94 188 -120.60 gain 188 94 -122.68 gain 94 189 -120.99 gain 189 94 -120.59 gain 94 190 -134.39 gain 190 94 -130.99 gain 94 191 -129.16 gain 191 94 -126.85 gain 94 192 -130.06 gain 192 94 -130.62 gain 94 193 -128.15 gain 193 94 -129.96 gain 94 194 -121.67 gain 194 94 -117.29 gain 94 195 -126.67 gain 195 94 -122.93 gain 94 196 -125.24 gain 196 94 -125.53 gain 94 197 -123.35 gain 197 94 -119.70 gain 94 198 -112.19 gain 198 94 -108.06 gain 94 199 -120.49 gain 199 94 -120.28 gain 94 200 -125.50 gain 200 94 -122.23 gain 94 201 -124.23 gain 201 94 -121.77 gain 94 202 -122.50 gain 202 94 -124.03 gain 94 203 -120.86 gain 203 94 -122.02 gain 94 204 -121.82 gain 204 94 -120.26 gain 94 205 -119.01 gain 205 94 -116.53 gain 94 206 -122.08 gain 206 94 -124.12 gain 94 207 -126.48 gain 207 94 -120.88 gain 94 208 -126.69 gain 208 94 -126.86 gain 94 209 -123.22 gain 209 94 -124.39 gain 94 210 -126.92 gain 210 94 -125.02 gain 94 211 -115.19 gain 211 94 -115.32 gain 94 212 -123.80 gain 212 94 -122.47 gain 94 213 -123.87 gain 213 94 -121.73 gain 94 214 -118.13 gain 214 94 -115.88 gain 94 215 -118.55 gain 215 94 -112.71 gain 94 216 -125.77 gain 216 94 -124.60 gain 94 217 -125.25 gain 217 94 -124.59 gain 94 218 -128.78 gain 218 94 -130.31 gain 94 219 -111.96 gain 219 94 -104.86 gain 94 220 -129.83 gain 220 94 -133.22 gain 94 221 -120.68 gain 221 94 -119.71 gain 94 222 -122.41 gain 222 94 -121.76 gain 94 223 -127.63 gain 223 94 -125.60 gain 94 224 -127.03 gain 224 94 -127.68 gain 95 96 -88.71 gain 96 95 -86.05 gain 95 97 -107.60 gain 97 95 -103.69 gain 95 98 -108.31 gain 98 95 -105.19 gain 95 99 -117.37 gain 99 95 -112.07 gain 95 100 -121.99 gain 100 95 -116.25 gain 95 101 -118.33 gain 101 95 -112.76 gain 95 102 -123.97 gain 102 95 -119.18 gain 95 103 -129.32 gain 103 95 -122.01 gain 95 104 -124.93 gain 104 95 -123.00 gain 95 105 -113.08 gain 105 95 -107.09 gain 95 106 -118.60 gain 106 95 -113.70 gain 95 107 -119.39 gain 107 95 -121.06 gain 95 108 -108.06 gain 108 95 -102.05 gain 95 109 -97.12 gain 109 95 -94.59 gain 95 110 -100.46 gain 110 95 -96.40 gain 95 111 -102.65 gain 111 95 -98.27 gain 95 112 -112.79 gain 112 95 -107.29 gain 95 113 -114.61 gain 113 95 -107.91 gain 95 114 -115.52 gain 114 95 -112.13 gain 95 115 -112.64 gain 115 95 -103.55 gain 95 116 -122.80 gain 116 95 -121.25 gain 95 117 -131.89 gain 117 95 -131.85 gain 95 118 -125.45 gain 118 95 -123.73 gain 95 119 -124.20 gain 119 95 -117.13 gain 95 120 -120.56 gain 120 95 -118.01 gain 95 121 -111.04 gain 121 95 -107.78 gain 95 122 -114.76 gain 122 95 -113.61 gain 95 123 -118.76 gain 123 95 -118.39 gain 95 124 -108.10 gain 124 95 -104.14 gain 95 125 -112.43 gain 125 95 -109.81 gain 95 126 -110.23 gain 126 95 -105.57 gain 95 127 -105.22 gain 127 95 -104.01 gain 95 128 -113.93 gain 128 95 -110.66 gain 95 129 -116.72 gain 129 95 -111.36 gain 95 130 -113.44 gain 130 95 -105.91 gain 95 131 -120.49 gain 131 95 -120.04 gain 95 132 -118.97 gain 132 95 -118.15 gain 95 133 -132.69 gain 133 95 -129.94 gain 95 134 -126.37 gain 134 95 -120.32 gain 95 135 -119.09 gain 135 95 -116.61 gain 95 136 -113.12 gain 136 95 -111.25 gain 95 137 -111.84 gain 137 95 -107.46 gain 95 138 -111.45 gain 138 95 -106.07 gain 95 139 -108.68 gain 139 95 -104.27 gain 95 140 -107.88 gain 140 95 -106.09 gain 95 141 -116.87 gain 141 95 -113.75 gain 95 142 -115.35 gain 142 95 -111.53 gain 95 143 -118.68 gain 143 95 -114.48 gain 95 144 -117.88 gain 144 95 -114.70 gain 95 145 -121.92 gain 145 95 -117.19 gain 95 146 -124.55 gain 146 95 -118.73 gain 95 147 -128.50 gain 147 95 -119.77 gain 95 148 -121.17 gain 148 95 -112.15 gain 95 149 -126.98 gain 149 95 -121.13 gain 95 150 -120.53 gain 150 95 -117.36 gain 95 151 -113.32 gain 151 95 -110.35 gain 95 152 -118.96 gain 152 95 -112.97 gain 95 153 -115.06 gain 153 95 -106.65 gain 95 154 -116.47 gain 154 95 -116.61 gain 95 155 -115.75 gain 155 95 -115.78 gain 95 156 -117.49 gain 156 95 -111.91 gain 95 157 -121.54 gain 157 95 -118.90 gain 95 158 -115.81 gain 158 95 -115.77 gain 95 159 -128.86 gain 159 95 -125.44 gain 95 160 -116.52 gain 160 95 -110.21 gain 95 161 -123.92 gain 161 95 -121.10 gain 95 162 -124.81 gain 162 95 -120.86 gain 95 163 -124.86 gain 163 95 -123.05 gain 95 164 -126.24 gain 164 95 -125.47 gain 95 165 -128.53 gain 165 95 -123.81 gain 95 166 -116.61 gain 166 95 -113.46 gain 95 167 -119.87 gain 167 95 -118.80 gain 95 168 -125.04 gain 168 95 -122.42 gain 95 169 -120.29 gain 169 95 -121.87 gain 95 170 -125.02 gain 170 95 -118.13 gain 95 171 -117.39 gain 171 95 -115.53 gain 95 172 -125.35 gain 172 95 -118.18 gain 95 173 -117.68 gain 173 95 -109.95 gain 95 174 -126.32 gain 174 95 -122.88 gain 95 175 -116.70 gain 175 95 -116.81 gain 95 176 -117.64 gain 176 95 -109.77 gain 95 177 -122.71 gain 177 95 -122.66 gain 95 178 -133.55 gain 178 95 -129.31 gain 95 179 -120.73 gain 179 95 -114.89 gain 95 180 -128.07 gain 180 95 -123.69 gain 95 181 -118.20 gain 181 95 -113.89 gain 95 182 -116.14 gain 182 95 -114.22 gain 95 183 -125.02 gain 183 95 -116.49 gain 95 184 -127.67 gain 184 95 -123.92 gain 95 185 -117.29 gain 185 95 -111.02 gain 95 186 -121.47 gain 186 95 -115.49 gain 95 187 -121.83 gain 187 95 -118.39 gain 95 188 -125.28 gain 188 95 -125.10 gain 95 189 -125.36 gain 189 95 -122.70 gain 95 190 -125.21 gain 190 95 -119.56 gain 95 191 -130.74 gain 191 95 -126.17 gain 95 192 -130.47 gain 192 95 -128.78 gain 95 193 -123.71 gain 193 95 -123.27 gain 95 194 -122.19 gain 194 95 -115.55 gain 95 195 -132.40 gain 195 95 -126.40 gain 95 196 -123.27 gain 196 95 -121.31 gain 95 197 -126.02 gain 197 95 -120.12 gain 95 198 -122.21 gain 198 95 -115.83 gain 95 199 -125.56 gain 199 95 -123.10 gain 95 200 -123.93 gain 200 95 -118.41 gain 95 201 -116.84 gain 201 95 -112.12 gain 95 202 -124.80 gain 202 95 -124.08 gain 95 203 -126.10 gain 203 95 -125.01 gain 95 204 -126.19 gain 204 95 -122.38 gain 95 205 -131.78 gain 205 95 -127.04 gain 95 206 -129.23 gain 206 95 -129.01 gain 95 207 -116.43 gain 207 95 -108.57 gain 95 208 -129.65 gain 208 95 -127.57 gain 95 209 -129.50 gain 209 95 -128.41 gain 95 210 -122.04 gain 210 95 -117.89 gain 95 211 -128.00 gain 211 95 -125.87 gain 95 212 -123.02 gain 212 95 -119.44 gain 95 213 -123.51 gain 213 95 -119.12 gain 95 214 -122.66 gain 214 95 -118.16 gain 95 215 -124.51 gain 215 95 -116.43 gain 95 216 -126.64 gain 216 95 -123.21 gain 95 217 -133.43 gain 217 95 -130.52 gain 95 218 -122.73 gain 218 95 -122.01 gain 95 219 -126.89 gain 219 95 -117.52 gain 95 220 -122.55 gain 220 95 -123.68 gain 95 221 -134.11 gain 221 95 -130.88 gain 95 222 -120.11 gain 222 95 -117.21 gain 95 223 -125.65 gain 223 95 -121.36 gain 95 224 -123.73 gain 224 95 -122.13 gain 96 97 -88.13 gain 97 96 -86.87 gain 96 98 -107.39 gain 98 96 -106.93 gain 96 99 -110.73 gain 99 96 -108.09 gain 96 100 -121.25 gain 100 96 -118.18 gain 96 101 -120.29 gain 101 96 -117.38 gain 96 102 -119.96 gain 102 96 -117.83 gain 96 103 -124.34 gain 103 96 -119.70 gain 96 104 -118.22 gain 104 96 -118.95 gain 96 105 -123.16 gain 105 96 -119.84 gain 96 106 -116.08 gain 106 96 -113.83 gain 96 107 -111.37 gain 107 96 -115.69 gain 96 108 -106.36 gain 108 96 -103.00 gain 96 109 -100.30 gain 109 96 -100.43 gain 96 110 -94.19 gain 110 96 -92.79 gain 96 111 -90.03 gain 111 96 -88.31 gain 96 112 -99.94 gain 112 96 -97.10 gain 96 113 -103.18 gain 113 96 -99.15 gain 96 114 -108.08 gain 114 96 -107.35 gain 96 115 -109.01 gain 115 96 -102.59 gain 96 116 -120.47 gain 116 96 -121.58 gain 96 117 -116.71 gain 117 96 -119.33 gain 96 118 -119.14 gain 118 96 -120.08 gain 96 119 -120.18 gain 119 96 -115.77 gain 96 120 -118.25 gain 120 96 -118.36 gain 96 121 -117.99 gain 121 96 -117.39 gain 96 122 -116.48 gain 122 96 -117.99 gain 96 123 -113.77 gain 123 96 -116.06 gain 96 124 -106.39 gain 124 96 -105.09 gain 96 125 -102.20 gain 125 96 -102.24 gain 96 126 -102.04 gain 126 96 -100.03 gain 96 127 -109.02 gain 127 96 -110.48 gain 96 128 -114.11 gain 128 96 -113.50 gain 96 129 -112.78 gain 129 96 -110.09 gain 96 130 -111.36 gain 130 96 -106.48 gain 96 131 -115.85 gain 131 96 -118.06 gain 96 132 -116.32 gain 132 96 -118.16 gain 96 133 -118.02 gain 133 96 -117.93 gain 96 134 -118.77 gain 134 96 -115.38 gain 96 135 -121.85 gain 135 96 -122.03 gain 96 136 -121.29 gain 136 96 -122.08 gain 96 137 -116.04 gain 137 96 -114.31 gain 96 138 -116.08 gain 138 96 -113.36 gain 96 139 -111.04 gain 139 96 -109.30 gain 96 140 -106.88 gain 140 96 -107.75 gain 96 141 -107.37 gain 141 96 -106.91 gain 96 142 -113.02 gain 142 96 -111.87 gain 96 143 -107.30 gain 143 96 -105.76 gain 96 144 -109.98 gain 144 96 -109.46 gain 96 145 -111.10 gain 145 96 -109.03 gain 96 146 -117.91 gain 146 96 -114.75 gain 96 147 -121.79 gain 147 96 -115.72 gain 96 148 -119.59 gain 148 96 -113.23 gain 96 149 -121.81 gain 149 96 -118.62 gain 96 150 -117.62 gain 150 96 -117.12 gain 96 151 -111.71 gain 151 96 -111.41 gain 96 152 -117.66 gain 152 96 -114.33 gain 96 153 -111.59 gain 153 96 -105.84 gain 96 154 -114.10 gain 154 96 -116.89 gain 96 155 -112.11 gain 155 96 -114.81 gain 96 156 -113.37 gain 156 96 -110.45 gain 96 157 -122.82 gain 157 96 -122.85 gain 96 158 -123.63 gain 158 96 -126.25 gain 96 159 -114.37 gain 159 96 -113.61 gain 96 160 -115.76 gain 160 96 -112.11 gain 96 161 -123.99 gain 161 96 -123.83 gain 96 162 -121.22 gain 162 96 -119.93 gain 96 163 -116.19 gain 163 96 -117.04 gain 96 164 -138.42 gain 164 96 -140.32 gain 96 165 -119.55 gain 165 96 -117.49 gain 96 166 -121.37 gain 166 96 -120.88 gain 96 167 -118.54 gain 167 96 -120.14 gain 96 168 -116.44 gain 168 96 -116.48 gain 96 169 -113.99 gain 169 96 -118.23 gain 96 170 -118.71 gain 170 96 -114.48 gain 96 171 -116.25 gain 171 96 -117.04 gain 96 172 -112.89 gain 172 96 -108.38 gain 96 173 -118.18 gain 173 96 -113.11 gain 96 174 -117.67 gain 174 96 -116.90 gain 96 175 -121.27 gain 175 96 -124.05 gain 96 176 -119.40 gain 176 96 -114.19 gain 96 177 -118.91 gain 177 96 -121.52 gain 96 178 -116.74 gain 178 96 -115.17 gain 96 179 -129.02 gain 179 96 -125.84 gain 96 180 -119.83 gain 180 96 -118.12 gain 96 181 -120.49 gain 181 96 -118.84 gain 96 182 -118.42 gain 182 96 -119.16 gain 96 183 -125.15 gain 183 96 -119.28 gain 96 184 -121.27 gain 184 96 -120.18 gain 96 185 -119.04 gain 185 96 -115.44 gain 96 186 -118.40 gain 186 96 -115.08 gain 96 187 -116.34 gain 187 96 -115.56 gain 96 188 -119.71 gain 188 96 -122.20 gain 96 189 -129.31 gain 189 96 -129.31 gain 96 190 -122.64 gain 190 96 -119.65 gain 96 191 -117.11 gain 191 96 -115.21 gain 96 192 -122.60 gain 192 96 -123.56 gain 96 193 -127.81 gain 193 96 -130.03 gain 96 194 -134.12 gain 194 96 -130.15 gain 96 195 -125.49 gain 195 96 -122.15 gain 96 196 -117.75 gain 196 96 -118.45 gain 96 197 -119.36 gain 197 96 -116.13 gain 96 198 -119.53 gain 198 96 -115.82 gain 96 199 -120.88 gain 199 96 -121.09 gain 96 200 -119.01 gain 200 96 -116.15 gain 96 201 -113.32 gain 201 96 -111.26 gain 96 202 -119.44 gain 202 96 -121.39 gain 96 203 -115.74 gain 203 96 -117.31 gain 96 204 -122.31 gain 204 96 -121.16 gain 96 205 -121.79 gain 205 96 -119.72 gain 96 206 -131.42 gain 206 96 -133.87 gain 96 207 -127.31 gain 207 96 -122.11 gain 96 208 -128.34 gain 208 96 -128.92 gain 96 209 -124.10 gain 209 96 -125.68 gain 96 210 -123.35 gain 210 96 -121.86 gain 96 211 -118.48 gain 211 96 -119.01 gain 96 212 -120.86 gain 212 96 -119.94 gain 96 213 -123.39 gain 213 96 -121.66 gain 96 214 -126.62 gain 214 96 -124.78 gain 96 215 -130.88 gain 215 96 -125.45 gain 96 216 -117.18 gain 216 96 -116.41 gain 96 217 -116.52 gain 217 96 -116.28 gain 96 218 -119.08 gain 218 96 -121.02 gain 96 219 -127.65 gain 219 96 -120.95 gain 96 220 -127.76 gain 220 96 -131.55 gain 96 221 -124.43 gain 221 96 -123.86 gain 96 222 -123.02 gain 222 96 -122.78 gain 96 223 -126.53 gain 223 96 -124.91 gain 96 224 -127.52 gain 224 96 -128.58 gain 97 98 -96.84 gain 98 97 -97.64 gain 97 99 -101.29 gain 99 97 -99.91 gain 97 100 -100.52 gain 100 97 -98.71 gain 97 101 -114.90 gain 101 97 -113.25 gain 97 102 -107.92 gain 102 97 -107.05 gain 97 103 -112.07 gain 103 97 -108.68 gain 97 104 -116.30 gain 104 97 -118.29 gain 97 105 -113.98 gain 105 97 -111.92 gain 97 106 -117.36 gain 106 97 -116.38 gain 97 107 -106.46 gain 107 97 -112.04 gain 97 108 -104.03 gain 108 97 -101.93 gain 97 109 -97.26 gain 109 97 -98.65 gain 97 110 -108.40 gain 110 97 -108.26 gain 97 111 -100.46 gain 111 97 -100.00 gain 97 112 -96.65 gain 112 97 -95.07 gain 97 113 -90.34 gain 113 97 -87.56 gain 97 114 -106.79 gain 114 97 -107.32 gain 97 115 -107.22 gain 115 97 -102.05 gain 97 116 -114.83 gain 116 97 -117.20 gain 97 117 -114.95 gain 117 97 -118.82 gain 97 118 -118.81 gain 118 97 -121.00 gain 97 119 -118.81 gain 119 97 -115.66 gain 97 120 -115.74 gain 120 97 -117.11 gain 97 121 -111.09 gain 121 97 -111.75 gain 97 122 -115.66 gain 122 97 -118.43 gain 97 123 -115.13 gain 123 97 -118.68 gain 97 124 -112.90 gain 124 97 -112.86 gain 97 125 -104.34 gain 125 97 -105.63 gain 97 126 -101.68 gain 126 97 -100.93 gain 97 127 -102.85 gain 127 97 -105.56 gain 97 128 -101.47 gain 128 97 -102.12 gain 97 129 -101.10 gain 129 97 -99.66 gain 97 130 -111.08 gain 130 97 -107.47 gain 97 131 -111.53 gain 131 97 -115.00 gain 97 132 -119.57 gain 132 97 -122.66 gain 97 133 -114.48 gain 133 97 -115.64 gain 97 134 -121.35 gain 134 97 -119.22 gain 97 135 -126.05 gain 135 97 -127.48 gain 97 136 -115.75 gain 136 97 -117.80 gain 97 137 -115.38 gain 137 97 -114.91 gain 97 138 -120.89 gain 138 97 -119.42 gain 97 139 -117.24 gain 139 97 -116.76 gain 97 140 -112.51 gain 140 97 -114.63 gain 97 141 -109.64 gain 141 97 -110.43 gain 97 142 -114.46 gain 142 97 -114.56 gain 97 143 -108.97 gain 143 97 -108.68 gain 97 144 -110.78 gain 144 97 -111.51 gain 97 145 -113.72 gain 145 97 -112.91 gain 97 146 -111.13 gain 146 97 -109.22 gain 97 147 -117.99 gain 147 97 -113.18 gain 97 148 -118.72 gain 148 97 -113.62 gain 97 149 -123.68 gain 149 97 -121.75 gain 97 150 -125.99 gain 150 97 -126.75 gain 97 151 -116.03 gain 151 97 -116.98 gain 97 152 -124.13 gain 152 97 -122.06 gain 97 153 -110.35 gain 153 97 -105.85 gain 97 154 -111.20 gain 154 97 -115.25 gain 97 155 -114.41 gain 155 97 -118.36 gain 97 156 -114.65 gain 156 97 -112.99 gain 97 157 -109.34 gain 157 97 -110.62 gain 97 158 -120.58 gain 158 97 -124.46 gain 97 159 -108.36 gain 159 97 -108.85 gain 97 160 -118.92 gain 160 97 -116.53 gain 97 161 -115.77 gain 161 97 -116.86 gain 97 162 -118.09 gain 162 97 -118.05 gain 97 163 -117.31 gain 163 97 -119.42 gain 97 164 -123.53 gain 164 97 -126.68 gain 97 165 -118.03 gain 165 97 -117.23 gain 97 166 -118.82 gain 166 97 -119.58 gain 97 167 -115.33 gain 167 97 -118.19 gain 97 168 -115.99 gain 168 97 -117.29 gain 97 169 -114.97 gain 169 97 -120.47 gain 97 170 -114.17 gain 170 97 -111.20 gain 97 171 -119.99 gain 171 97 -122.05 gain 97 172 -106.80 gain 172 97 -103.55 gain 97 173 -107.52 gain 173 97 -103.70 gain 97 174 -112.22 gain 174 97 -112.70 gain 97 175 -119.77 gain 175 97 -123.80 gain 97 176 -120.26 gain 176 97 -116.31 gain 97 177 -118.25 gain 177 97 -122.11 gain 97 178 -126.56 gain 178 97 -126.24 gain 97 179 -116.49 gain 179 97 -114.56 gain 97 180 -124.54 gain 180 97 -124.08 gain 97 181 -122.01 gain 181 97 -121.62 gain 97 182 -123.38 gain 182 97 -125.38 gain 97 183 -117.57 gain 183 97 -112.95 gain 97 184 -119.15 gain 184 97 -119.31 gain 97 185 -121.44 gain 185 97 -119.09 gain 97 186 -119.24 gain 186 97 -117.17 gain 97 187 -123.03 gain 187 97 -123.51 gain 97 188 -111.60 gain 188 97 -115.33 gain 97 189 -118.61 gain 189 97 -119.86 gain 97 190 -119.44 gain 190 97 -117.70 gain 97 191 -116.80 gain 191 97 -116.15 gain 97 192 -119.90 gain 192 97 -122.12 gain 97 193 -118.93 gain 193 97 -122.40 gain 97 194 -125.02 gain 194 97 -122.31 gain 97 195 -120.16 gain 195 97 -118.08 gain 97 196 -121.63 gain 196 97 -123.58 gain 97 197 -129.85 gain 197 97 -127.87 gain 97 198 -115.33 gain 198 97 -112.87 gain 97 199 -124.31 gain 199 97 -125.77 gain 97 200 -114.64 gain 200 97 -113.03 gain 97 201 -118.92 gain 201 97 -118.12 gain 97 202 -118.18 gain 202 97 -121.38 gain 97 203 -118.40 gain 203 97 -121.23 gain 97 204 -119.05 gain 204 97 -119.16 gain 97 205 -119.56 gain 205 97 -118.74 gain 97 206 -124.09 gain 206 97 -127.79 gain 97 207 -119.08 gain 207 97 -115.14 gain 97 208 -124.20 gain 208 97 -126.04 gain 97 209 -121.70 gain 209 97 -124.53 gain 97 210 -121.09 gain 210 97 -120.86 gain 97 211 -126.84 gain 211 97 -128.63 gain 97 212 -114.67 gain 212 97 -115.00 gain 97 213 -123.11 gain 213 97 -122.64 gain 97 214 -129.15 gain 214 97 -128.56 gain 97 215 -121.38 gain 215 97 -117.21 gain 97 216 -120.58 gain 216 97 -121.07 gain 97 217 -118.78 gain 217 97 -119.78 gain 97 218 -122.93 gain 218 97 -126.13 gain 97 219 -121.73 gain 219 97 -116.29 gain 97 220 -118.36 gain 220 97 -123.40 gain 97 221 -121.24 gain 221 97 -121.93 gain 97 222 -124.05 gain 222 97 -125.06 gain 97 223 -123.10 gain 223 97 -122.73 gain 97 224 -119.92 gain 224 97 -122.24 gain 98 99 -98.71 gain 99 98 -96.53 gain 98 100 -103.32 gain 100 98 -100.70 gain 98 101 -111.69 gain 101 98 -109.24 gain 98 102 -111.75 gain 102 98 -110.07 gain 98 103 -114.15 gain 103 98 -109.97 gain 98 104 -115.55 gain 104 98 -116.74 gain 98 105 -115.88 gain 105 98 -113.01 gain 98 106 -120.99 gain 106 98 -119.21 gain 98 107 -115.85 gain 107 98 -120.63 gain 98 108 -116.65 gain 108 98 -113.75 gain 98 109 -116.91 gain 109 98 -117.50 gain 98 110 -108.87 gain 110 98 -107.93 gain 98 111 -100.35 gain 111 98 -99.09 gain 98 112 -94.70 gain 112 98 -92.32 gain 98 113 -98.68 gain 113 98 -95.11 gain 98 114 -95.39 gain 114 98 -95.12 gain 98 115 -101.80 gain 115 98 -95.83 gain 98 116 -106.85 gain 116 98 -108.43 gain 98 117 -112.27 gain 117 98 -115.34 gain 98 118 -115.13 gain 118 98 -116.53 gain 98 119 -122.47 gain 119 98 -118.52 gain 98 120 -120.20 gain 120 98 -120.77 gain 98 121 -120.57 gain 121 98 -120.42 gain 98 122 -116.43 gain 122 98 -118.41 gain 98 123 -118.92 gain 123 98 -121.67 gain 98 124 -122.06 gain 124 98 -121.22 gain 98 125 -112.92 gain 125 98 -113.42 gain 98 126 -100.44 gain 126 98 -98.89 gain 98 127 -108.62 gain 127 98 -110.53 gain 98 128 -104.09 gain 128 98 -103.94 gain 98 129 -101.44 gain 129 98 -99.20 gain 98 130 -109.73 gain 130 98 -105.31 gain 98 131 -109.33 gain 131 98 -112.00 gain 98 132 -111.30 gain 132 98 -113.60 gain 98 133 -109.81 gain 133 98 -110.18 gain 98 134 -116.51 gain 134 98 -113.58 gain 98 135 -119.05 gain 135 98 -119.69 gain 98 136 -121.99 gain 136 98 -123.24 gain 98 137 -114.66 gain 137 98 -113.39 gain 98 138 -122.59 gain 138 98 -120.32 gain 98 139 -114.19 gain 139 98 -112.91 gain 98 140 -117.29 gain 140 98 -118.61 gain 98 141 -109.81 gain 141 98 -109.80 gain 98 142 -104.96 gain 142 98 -104.27 gain 98 143 -111.18 gain 143 98 -110.10 gain 98 144 -110.28 gain 144 98 -110.22 gain 98 145 -115.27 gain 145 98 -113.65 gain 98 146 -115.35 gain 146 98 -112.65 gain 98 147 -114.70 gain 147 98 -109.08 gain 98 148 -115.04 gain 148 98 -109.14 gain 98 149 -119.79 gain 149 98 -117.06 gain 98 150 -113.20 gain 150 98 -113.15 gain 98 151 -117.44 gain 151 98 -117.59 gain 98 152 -111.62 gain 152 98 -108.75 gain 98 153 -114.24 gain 153 98 -108.95 gain 98 154 -115.96 gain 154 98 -119.21 gain 98 155 -114.50 gain 155 98 -117.65 gain 98 156 -118.74 gain 156 98 -116.28 gain 98 157 -108.92 gain 157 98 -109.41 gain 98 158 -109.88 gain 158 98 -112.96 gain 98 159 -113.84 gain 159 98 -113.53 gain 98 160 -117.01 gain 160 98 -113.81 gain 98 161 -116.97 gain 161 98 -117.27 gain 98 162 -109.96 gain 162 98 -109.12 gain 98 163 -115.23 gain 163 98 -116.55 gain 98 164 -114.41 gain 164 98 -116.77 gain 98 165 -128.11 gain 165 98 -126.50 gain 98 166 -122.71 gain 166 98 -122.67 gain 98 167 -125.89 gain 167 98 -127.94 gain 98 168 -119.43 gain 168 98 -119.93 gain 98 169 -119.68 gain 169 98 -124.38 gain 98 170 -114.30 gain 170 98 -110.53 gain 98 171 -110.75 gain 171 98 -112.00 gain 98 172 -118.45 gain 172 98 -114.40 gain 98 173 -115.82 gain 173 98 -111.20 gain 98 174 -110.51 gain 174 98 -110.19 gain 98 175 -107.39 gain 175 98 -110.63 gain 98 176 -115.86 gain 176 98 -111.11 gain 98 177 -124.19 gain 177 98 -127.25 gain 98 178 -122.69 gain 178 98 -121.57 gain 98 179 -121.05 gain 179 98 -118.33 gain 98 180 -122.71 gain 180 98 -121.45 gain 98 181 -116.42 gain 181 98 -115.23 gain 98 182 -126.67 gain 182 98 -127.86 gain 98 183 -119.12 gain 183 98 -113.70 gain 98 184 -122.14 gain 184 98 -121.51 gain 98 185 -122.11 gain 185 98 -118.97 gain 98 186 -115.34 gain 186 98 -112.48 gain 98 187 -115.03 gain 187 98 -114.71 gain 98 188 -122.09 gain 188 98 -125.03 gain 98 189 -113.25 gain 189 98 -113.71 gain 98 190 -120.59 gain 190 98 -118.06 gain 98 191 -118.21 gain 191 98 -116.77 gain 98 192 -125.35 gain 192 98 -126.77 gain 98 193 -121.04 gain 193 98 -123.71 gain 98 194 -123.62 gain 194 98 -120.11 gain 98 195 -121.41 gain 195 98 -118.53 gain 98 196 -129.25 gain 196 98 -130.40 gain 98 197 -119.96 gain 197 98 -117.18 gain 98 198 -123.32 gain 198 98 -120.06 gain 98 199 -123.03 gain 199 98 -123.69 gain 98 200 -114.86 gain 200 98 -112.46 gain 98 201 -120.00 gain 201 98 -118.40 gain 98 202 -114.77 gain 202 98 -117.17 gain 98 203 -126.27 gain 203 98 -128.29 gain 98 204 -117.26 gain 204 98 -116.57 gain 98 205 -117.79 gain 205 98 -116.17 gain 98 206 -118.65 gain 206 98 -121.55 gain 98 207 -118.98 gain 207 98 -114.24 gain 98 208 -117.60 gain 208 98 -118.64 gain 98 209 -128.61 gain 209 98 -130.64 gain 98 210 -127.63 gain 210 98 -126.60 gain 98 211 -124.94 gain 211 98 -125.93 gain 98 212 -125.96 gain 212 98 -125.50 gain 98 213 -116.28 gain 213 98 -115.00 gain 98 214 -127.61 gain 214 98 -126.23 gain 98 215 -128.64 gain 215 98 -123.67 gain 98 216 -121.96 gain 216 98 -121.65 gain 98 217 -115.67 gain 217 98 -115.88 gain 98 218 -126.37 gain 218 98 -128.76 gain 98 219 -119.11 gain 219 98 -112.87 gain 98 220 -125.21 gain 220 98 -129.46 gain 98 221 -123.76 gain 221 98 -123.65 gain 98 222 -121.57 gain 222 98 -121.79 gain 98 223 -128.26 gain 223 98 -127.09 gain 98 224 -129.20 gain 224 98 -130.72 gain 99 100 -89.74 gain 100 99 -89.31 gain 99 101 -96.02 gain 101 99 -95.75 gain 99 102 -103.85 gain 102 99 -104.36 gain 99 103 -112.43 gain 103 99 -110.42 gain 99 104 -112.19 gain 104 99 -115.56 gain 99 105 -119.75 gain 105 99 -119.06 gain 99 106 -115.49 gain 106 99 -115.89 gain 99 107 -117.41 gain 107 99 -124.37 gain 99 108 -122.54 gain 108 99 -121.82 gain 99 109 -117.96 gain 109 99 -120.73 gain 99 110 -109.42 gain 110 99 -110.66 gain 99 111 -105.11 gain 111 99 -106.03 gain 99 112 -108.15 gain 112 99 -107.95 gain 99 113 -99.62 gain 113 99 -98.23 gain 99 114 -88.49 gain 114 99 -90.39 gain 99 115 -99.43 gain 115 99 -95.64 gain 99 116 -97.01 gain 116 99 -100.76 gain 99 117 -107.71 gain 117 99 -112.97 gain 99 118 -107.51 gain 118 99 -111.08 gain 99 119 -107.58 gain 119 99 -105.81 gain 99 120 -120.71 gain 120 99 -123.46 gain 99 121 -115.19 gain 121 99 -117.23 gain 99 122 -113.70 gain 122 99 -117.86 gain 99 123 -117.59 gain 123 99 -122.52 gain 99 124 -114.61 gain 124 99 -115.95 gain 99 125 -112.05 gain 125 99 -114.72 gain 99 126 -109.39 gain 126 99 -110.02 gain 99 127 -107.42 gain 127 99 -111.52 gain 99 128 -99.84 gain 128 99 -101.87 gain 99 129 -104.50 gain 129 99 -104.44 gain 99 130 -106.75 gain 130 99 -104.52 gain 99 131 -111.05 gain 131 99 -115.90 gain 99 132 -103.33 gain 132 99 -107.81 gain 99 133 -111.50 gain 133 99 -114.05 gain 99 134 -110.49 gain 134 99 -109.74 gain 99 135 -120.80 gain 135 99 -123.62 gain 99 136 -121.00 gain 136 99 -124.43 gain 99 137 -117.09 gain 137 99 -118.00 gain 99 138 -114.85 gain 138 99 -114.76 gain 99 139 -114.22 gain 139 99 -115.12 gain 99 140 -111.43 gain 140 99 -114.94 gain 99 141 -110.64 gain 141 99 -112.82 gain 99 142 -111.25 gain 142 99 -112.74 gain 99 143 -109.41 gain 143 99 -110.51 gain 99 144 -108.53 gain 144 99 -110.64 gain 99 145 -106.74 gain 145 99 -107.31 gain 99 146 -112.96 gain 146 99 -112.44 gain 99 147 -116.31 gain 147 99 -112.88 gain 99 148 -109.61 gain 148 99 -105.90 gain 99 149 -106.90 gain 149 99 -106.35 gain 99 150 -130.92 gain 150 99 -133.06 gain 99 151 -112.02 gain 151 99 -114.36 gain 99 152 -120.40 gain 152 99 -119.71 gain 99 153 -116.71 gain 153 99 -113.60 gain 99 154 -121.28 gain 154 99 -126.71 gain 99 155 -112.36 gain 155 99 -117.69 gain 99 156 -113.89 gain 156 99 -113.60 gain 99 157 -109.83 gain 157 99 -112.50 gain 99 158 -109.72 gain 158 99 -114.98 gain 99 159 -107.35 gain 159 99 -109.23 gain 99 160 -116.35 gain 160 99 -115.33 gain 99 161 -116.73 gain 161 99 -119.21 gain 99 162 -123.24 gain 162 99 -124.58 gain 99 163 -111.46 gain 163 99 -114.95 gain 99 164 -108.80 gain 164 99 -113.34 gain 99 165 -124.82 gain 165 99 -125.40 gain 99 166 -120.56 gain 166 99 -122.70 gain 99 167 -121.92 gain 167 99 -126.16 gain 99 168 -121.12 gain 168 99 -123.80 gain 99 169 -117.74 gain 169 99 -124.62 gain 99 170 -109.84 gain 170 99 -108.25 gain 99 171 -115.52 gain 171 99 -118.95 gain 99 172 -115.43 gain 172 99 -113.56 gain 99 173 -113.66 gain 173 99 -111.23 gain 99 174 -118.62 gain 174 99 -120.48 gain 99 175 -114.55 gain 175 99 -119.97 gain 99 176 -114.64 gain 176 99 -112.07 gain 99 177 -118.99 gain 177 99 -124.23 gain 99 178 -118.43 gain 178 99 -119.49 gain 99 179 -115.61 gain 179 99 -115.06 gain 99 180 -122.67 gain 180 99 -123.60 gain 99 181 -121.01 gain 181 99 -122.00 gain 99 182 -114.38 gain 182 99 -117.76 gain 99 183 -125.26 gain 183 99 -122.02 gain 99 184 -120.30 gain 184 99 -121.85 gain 99 185 -118.91 gain 185 99 -117.95 gain 99 186 -118.25 gain 186 99 -117.57 gain 99 187 -112.86 gain 187 99 -114.72 gain 99 188 -113.57 gain 188 99 -118.69 gain 99 189 -120.58 gain 189 99 -123.22 gain 99 190 -120.79 gain 190 99 -120.44 gain 99 191 -119.06 gain 191 99 -119.80 gain 99 192 -120.61 gain 192 99 -124.21 gain 99 193 -121.80 gain 193 99 -126.66 gain 99 194 -109.59 gain 194 99 -108.26 gain 99 195 -126.27 gain 195 99 -125.57 gain 99 196 -121.39 gain 196 99 -124.73 gain 99 197 -122.73 gain 197 99 -122.13 gain 99 198 -117.32 gain 198 99 -116.24 gain 99 199 -122.28 gain 199 99 -125.12 gain 99 200 -120.01 gain 200 99 -119.79 gain 99 201 -116.95 gain 201 99 -117.53 gain 99 202 -109.83 gain 202 99 -114.41 gain 99 203 -119.88 gain 203 99 -124.09 gain 99 204 -120.84 gain 204 99 -122.32 gain 99 205 -118.41 gain 205 99 -118.97 gain 99 206 -114.76 gain 206 99 -119.84 gain 99 207 -118.19 gain 207 99 -115.64 gain 99 208 -118.51 gain 208 99 -121.73 gain 99 209 -119.67 gain 209 99 -123.89 gain 99 210 -123.88 gain 210 99 -125.03 gain 99 211 -122.43 gain 211 99 -125.60 gain 99 212 -122.03 gain 212 99 -123.75 gain 99 213 -128.27 gain 213 99 -129.18 gain 99 214 -123.31 gain 214 99 -124.11 gain 99 215 -116.78 gain 215 99 -113.99 gain 99 216 -112.82 gain 216 99 -114.69 gain 99 217 -121.11 gain 217 99 -123.49 gain 99 218 -124.95 gain 218 99 -129.53 gain 99 219 -121.62 gain 219 99 -117.55 gain 99 220 -115.48 gain 220 99 -121.91 gain 99 221 -119.40 gain 221 99 -121.47 gain 99 222 -117.48 gain 222 99 -119.88 gain 99 223 -115.72 gain 223 99 -116.73 gain 99 224 -114.00 gain 224 99 -117.70 gain 100 101 -88.85 gain 101 100 -89.01 gain 100 102 -93.22 gain 102 100 -94.17 gain 100 103 -113.30 gain 103 100 -111.73 gain 100 104 -110.07 gain 104 100 -113.87 gain 100 105 -128.52 gain 105 100 -128.27 gain 100 106 -114.94 gain 106 100 -115.77 gain 100 107 -116.17 gain 107 100 -123.56 gain 100 108 -119.49 gain 108 100 -119.21 gain 100 109 -111.51 gain 109 100 -114.71 gain 100 110 -117.37 gain 110 100 -119.04 gain 100 111 -115.93 gain 111 100 -117.28 gain 100 112 -103.89 gain 112 100 -104.12 gain 100 113 -100.97 gain 113 100 -100.01 gain 100 114 -98.98 gain 114 100 -101.32 gain 100 115 -92.13 gain 115 100 -88.78 gain 100 116 -99.08 gain 116 100 -103.27 gain 100 117 -97.24 gain 117 100 -102.92 gain 100 118 -102.48 gain 118 100 -106.48 gain 100 119 -112.86 gain 119 100 -111.53 gain 100 120 -116.95 gain 120 100 -120.14 gain 100 121 -121.83 gain 121 100 -124.30 gain 100 122 -120.71 gain 122 100 -125.30 gain 100 123 -116.24 gain 123 100 -121.61 gain 100 124 -116.99 gain 124 100 -118.77 gain 100 125 -113.52 gain 125 100 -116.63 gain 100 126 -107.76 gain 126 100 -108.83 gain 100 127 -107.86 gain 127 100 -112.39 gain 100 128 -104.22 gain 128 100 -106.69 gain 100 129 -97.35 gain 129 100 -97.73 gain 100 130 -101.17 gain 130 100 -99.37 gain 100 131 -108.77 gain 131 100 -114.06 gain 100 132 -107.29 gain 132 100 -112.20 gain 100 133 -108.95 gain 133 100 -111.93 gain 100 134 -118.30 gain 134 100 -117.98 gain 100 135 -118.49 gain 135 100 -121.74 gain 100 136 -120.21 gain 136 100 -124.08 gain 100 137 -120.82 gain 137 100 -122.16 gain 100 138 -115.66 gain 138 100 -116.00 gain 100 139 -113.96 gain 139 100 -115.29 gain 100 140 -118.39 gain 140 100 -122.33 gain 100 141 -110.03 gain 141 100 -112.64 gain 100 142 -107.92 gain 142 100 -109.84 gain 100 143 -102.69 gain 143 100 -104.22 gain 100 144 -108.26 gain 144 100 -110.81 gain 100 145 -109.54 gain 145 100 -110.54 gain 100 146 -106.60 gain 146 100 -106.51 gain 100 147 -99.74 gain 147 100 -96.74 gain 100 148 -113.83 gain 148 100 -110.54 gain 100 149 -109.38 gain 149 100 -109.27 gain 100 150 -121.01 gain 150 100 -123.58 gain 100 151 -120.85 gain 151 100 -123.61 gain 100 152 -124.64 gain 152 100 -124.38 gain 100 153 -112.83 gain 153 100 -110.15 gain 100 154 -120.96 gain 154 100 -126.83 gain 100 155 -117.17 gain 155 100 -122.94 gain 100 156 -115.56 gain 156 100 -115.72 gain 100 157 -110.06 gain 157 100 -113.16 gain 100 158 -114.15 gain 158 100 -119.85 gain 100 159 -111.14 gain 159 100 -113.45 gain 100 160 -107.26 gain 160 100 -106.68 gain 100 161 -107.41 gain 161 100 -110.32 gain 100 162 -119.71 gain 162 100 -121.49 gain 100 163 -108.54 gain 163 100 -112.47 gain 100 164 -110.68 gain 164 100 -115.65 gain 100 165 -125.74 gain 165 100 -126.75 gain 100 166 -119.68 gain 166 100 -122.26 gain 100 167 -116.79 gain 167 100 -121.45 gain 100 168 -120.70 gain 168 100 -123.82 gain 100 169 -116.77 gain 169 100 -124.09 gain 100 170 -121.96 gain 170 100 -120.80 gain 100 171 -115.75 gain 171 100 -119.62 gain 100 172 -116.61 gain 172 100 -115.17 gain 100 173 -114.54 gain 173 100 -112.54 gain 100 174 -111.09 gain 174 100 -113.38 gain 100 175 -112.14 gain 175 100 -117.99 gain 100 176 -114.98 gain 176 100 -112.84 gain 100 177 -111.95 gain 177 100 -117.62 gain 100 178 -116.01 gain 178 100 -117.51 gain 100 179 -114.84 gain 179 100 -114.73 gain 100 180 -123.55 gain 180 100 -124.90 gain 100 181 -117.20 gain 181 100 -118.63 gain 100 182 -121.29 gain 182 100 -125.10 gain 100 183 -125.39 gain 183 100 -122.59 gain 100 184 -123.60 gain 184 100 -125.59 gain 100 185 -113.26 gain 185 100 -112.73 gain 100 186 -111.06 gain 186 100 -110.82 gain 100 187 -111.49 gain 187 100 -113.78 gain 100 188 -109.20 gain 188 100 -114.75 gain 100 189 -116.96 gain 189 100 -120.03 gain 100 190 -108.94 gain 190 100 -109.02 gain 100 191 -116.82 gain 191 100 -117.99 gain 100 192 -114.24 gain 192 100 -118.27 gain 100 193 -118.29 gain 193 100 -123.58 gain 100 194 -112.58 gain 194 100 -111.68 gain 100 195 -127.50 gain 195 100 -127.24 gain 100 196 -128.43 gain 196 100 -132.20 gain 100 197 -124.01 gain 197 100 -123.85 gain 100 198 -122.07 gain 198 100 -121.43 gain 100 199 -117.97 gain 199 100 -121.24 gain 100 200 -126.73 gain 200 100 -126.94 gain 100 201 -121.46 gain 201 100 -122.48 gain 100 202 -114.94 gain 202 100 -119.95 gain 100 203 -112.22 gain 203 100 -116.86 gain 100 204 -120.41 gain 204 100 -122.34 gain 100 205 -120.27 gain 205 100 -121.26 gain 100 206 -116.73 gain 206 100 -122.24 gain 100 207 -116.27 gain 207 100 -114.15 gain 100 208 -118.10 gain 208 100 -121.75 gain 100 209 -120.47 gain 209 100 -125.12 gain 100 210 -127.20 gain 210 100 -128.78 gain 100 211 -121.62 gain 211 100 -125.22 gain 100 212 -125.47 gain 212 100 -127.62 gain 100 213 -123.37 gain 213 100 -124.71 gain 100 214 -130.27 gain 214 100 -131.50 gain 100 215 -123.10 gain 215 100 -120.74 gain 100 216 -117.36 gain 216 100 -119.66 gain 100 217 -117.83 gain 217 100 -120.65 gain 100 218 -114.36 gain 218 100 -119.38 gain 100 219 -121.26 gain 219 100 -117.63 gain 100 220 -119.23 gain 220 100 -126.09 gain 100 221 -120.53 gain 221 100 -123.03 gain 100 222 -121.09 gain 222 100 -123.92 gain 100 223 -121.94 gain 223 100 -123.39 gain 100 224 -118.26 gain 224 100 -122.40 gain 101 102 -87.68 gain 102 101 -88.46 gain 101 103 -97.69 gain 103 101 -95.95 gain 101 104 -97.73 gain 104 101 -101.37 gain 101 105 -129.53 gain 105 101 -129.12 gain 101 106 -120.64 gain 106 101 -121.30 gain 101 107 -116.23 gain 107 101 -123.47 gain 101 108 -123.11 gain 108 101 -122.67 gain 101 109 -119.60 gain 109 101 -122.64 gain 101 110 -114.02 gain 110 101 -115.53 gain 101 111 -118.15 gain 111 101 -119.34 gain 101 112 -111.80 gain 112 101 -111.87 gain 101 113 -107.22 gain 113 101 -106.10 gain 101 114 -103.87 gain 114 101 -106.05 gain 101 115 -96.75 gain 115 101 -93.23 gain 101 116 -88.91 gain 116 101 -92.94 gain 101 117 -94.76 gain 117 101 -100.28 gain 101 118 -105.51 gain 118 101 -109.35 gain 101 119 -103.93 gain 119 101 -102.43 gain 101 120 -126.80 gain 120 101 -129.82 gain 101 121 -125.23 gain 121 101 -127.54 gain 101 122 -123.84 gain 122 101 -128.27 gain 101 123 -121.45 gain 123 101 -126.65 gain 101 124 -117.42 gain 124 101 -119.03 gain 101 125 -115.11 gain 125 101 -118.06 gain 101 126 -105.60 gain 126 101 -106.50 gain 101 127 -115.65 gain 127 101 -120.01 gain 101 128 -106.63 gain 128 101 -108.93 gain 101 129 -103.88 gain 129 101 -104.09 gain 101 130 -105.11 gain 130 101 -103.15 gain 101 131 -99.51 gain 131 101 -104.63 gain 101 132 -97.93 gain 132 101 -102.67 gain 101 133 -102.30 gain 133 101 -105.12 gain 101 134 -105.52 gain 134 101 -105.03 gain 101 135 -120.80 gain 135 101 -123.89 gain 101 136 -121.54 gain 136 101 -125.24 gain 101 137 -121.66 gain 137 101 -122.84 gain 101 138 -119.07 gain 138 101 -119.25 gain 101 139 -118.87 gain 139 101 -120.03 gain 101 140 -118.88 gain 140 101 -122.66 gain 101 141 -117.07 gain 141 101 -119.51 gain 101 142 -111.93 gain 142 101 -113.69 gain 101 143 -111.38 gain 143 101 -112.75 gain 101 144 -102.83 gain 144 101 -105.22 gain 101 145 -103.97 gain 145 101 -104.80 gain 101 146 -102.05 gain 146 101 -101.79 gain 101 147 -104.92 gain 147 101 -101.76 gain 101 148 -97.90 gain 148 101 -94.46 gain 101 149 -110.03 gain 149 101 -109.75 gain 101 150 -122.08 gain 150 101 -124.49 gain 101 151 -120.43 gain 151 101 -123.03 gain 101 152 -117.18 gain 152 101 -116.76 gain 101 153 -112.80 gain 153 101 -109.96 gain 101 154 -125.91 gain 154 101 -131.61 gain 101 155 -120.57 gain 155 101 -126.17 gain 101 156 -116.16 gain 156 101 -116.15 gain 101 157 -113.99 gain 157 101 -116.92 gain 101 158 -108.39 gain 158 101 -113.92 gain 101 159 -114.83 gain 159 101 -116.97 gain 101 160 -114.28 gain 160 101 -113.54 gain 101 161 -104.41 gain 161 101 -107.16 gain 101 162 -124.25 gain 162 101 -125.86 gain 101 163 -113.04 gain 163 101 -116.80 gain 101 164 -117.33 gain 164 101 -122.14 gain 101 165 -120.30 gain 165 101 -121.15 gain 101 166 -125.47 gain 166 101 -127.88 gain 101 167 -118.77 gain 167 101 -123.27 gain 101 168 -117.48 gain 168 101 -120.43 gain 101 169 -116.43 gain 169 101 -123.58 gain 101 170 -118.23 gain 170 101 -116.91 gain 101 171 -116.06 gain 171 101 -119.76 gain 101 172 -109.62 gain 172 101 -108.02 gain 101 173 -112.49 gain 173 101 -110.33 gain 101 174 -117.85 gain 174 101 -119.98 gain 101 175 -115.80 gain 175 101 -121.49 gain 101 176 -118.13 gain 176 101 -115.83 gain 101 177 -116.55 gain 177 101 -122.06 gain 101 178 -117.86 gain 178 101 -119.19 gain 101 179 -116.78 gain 179 101 -116.50 gain 101 180 -120.71 gain 180 101 -121.91 gain 101 181 -123.95 gain 181 101 -125.21 gain 101 182 -116.33 gain 182 101 -119.98 gain 101 183 -125.82 gain 183 101 -122.86 gain 101 184 -120.75 gain 184 101 -122.57 gain 101 185 -116.56 gain 185 101 -115.86 gain 101 186 -117.98 gain 186 101 -117.57 gain 101 187 -116.68 gain 187 101 -118.81 gain 101 188 -113.43 gain 188 101 -118.82 gain 101 189 -116.29 gain 189 101 -119.20 gain 101 190 -117.19 gain 190 101 -117.10 gain 101 191 -116.55 gain 191 101 -117.56 gain 101 192 -116.60 gain 192 101 -120.47 gain 101 193 -117.90 gain 193 101 -123.03 gain 101 194 -118.50 gain 194 101 -117.44 gain 101 195 -119.56 gain 195 101 -119.13 gain 101 196 -125.20 gain 196 101 -128.81 gain 101 197 -121.55 gain 197 101 -121.23 gain 101 198 -122.45 gain 198 101 -121.64 gain 101 199 -126.17 gain 199 101 -129.28 gain 101 200 -118.00 gain 200 101 -118.05 gain 101 201 -121.53 gain 201 101 -122.38 gain 101 202 -121.89 gain 202 101 -126.75 gain 101 203 -117.53 gain 203 101 -122.00 gain 101 204 -120.39 gain 204 101 -122.15 gain 101 205 -113.70 gain 205 101 -114.54 gain 101 206 -117.86 gain 206 101 -123.22 gain 101 207 -113.69 gain 207 101 -111.41 gain 101 208 -116.36 gain 208 101 -119.85 gain 101 209 -112.66 gain 209 101 -117.15 gain 101 210 -128.35 gain 210 101 -129.77 gain 101 211 -124.56 gain 211 101 -128.00 gain 101 212 -118.66 gain 212 101 -120.64 gain 101 213 -129.32 gain 213 101 -130.49 gain 101 214 -124.37 gain 214 101 -125.44 gain 101 215 -123.33 gain 215 101 -120.81 gain 101 216 -118.34 gain 216 101 -120.48 gain 101 217 -120.65 gain 217 101 -123.31 gain 101 218 -116.05 gain 218 101 -120.90 gain 101 219 -123.10 gain 219 101 -119.31 gain 101 220 -124.72 gain 220 101 -131.41 gain 101 221 -116.92 gain 221 101 -119.26 gain 101 222 -119.73 gain 222 101 -122.40 gain 101 223 -111.56 gain 223 101 -112.84 gain 101 224 -124.47 gain 224 101 -128.44 gain 102 103 -85.96 gain 103 102 -83.45 gain 102 104 -103.57 gain 104 102 -106.43 gain 102 105 -123.86 gain 105 102 -122.66 gain 102 106 -125.61 gain 106 102 -125.49 gain 102 107 -122.43 gain 107 102 -128.89 gain 102 108 -117.47 gain 108 102 -116.24 gain 102 109 -121.01 gain 109 102 -123.27 gain 102 110 -118.77 gain 110 102 -119.50 gain 102 111 -112.24 gain 111 102 -112.65 gain 102 112 -116.25 gain 112 102 -115.54 gain 102 113 -105.98 gain 113 102 -104.07 gain 102 114 -111.59 gain 114 102 -112.99 gain 102 115 -103.78 gain 115 102 -99.48 gain 102 116 -93.51 gain 116 102 -96.75 gain 102 117 -94.06 gain 117 102 -98.80 gain 102 118 -95.87 gain 118 102 -98.94 gain 102 119 -105.74 gain 119 102 -103.46 gain 102 120 -126.56 gain 120 102 -128.80 gain 102 121 -129.86 gain 121 102 -131.39 gain 102 122 -121.95 gain 122 102 -125.60 gain 102 123 -123.66 gain 123 102 -128.08 gain 102 124 -122.62 gain 124 102 -123.46 gain 102 125 -114.12 gain 125 102 -116.28 gain 102 126 -120.96 gain 126 102 -121.08 gain 102 127 -109.83 gain 127 102 -113.42 gain 102 128 -118.82 gain 128 102 -120.34 gain 102 129 -109.66 gain 129 102 -109.09 gain 102 130 -105.98 gain 130 102 -103.24 gain 102 131 -105.11 gain 131 102 -109.45 gain 102 132 -93.80 gain 132 102 -97.77 gain 102 133 -108.22 gain 133 102 -110.25 gain 102 134 -108.67 gain 134 102 -107.40 gain 102 135 -132.58 gain 135 102 -134.89 gain 102 136 -129.00 gain 136 102 -131.92 gain 102 137 -125.61 gain 137 102 -126.01 gain 102 138 -119.72 gain 138 102 -119.12 gain 102 139 -116.25 gain 139 102 -116.64 gain 102 140 -118.19 gain 140 102 -121.18 gain 102 141 -112.92 gain 141 102 -114.59 gain 102 142 -108.93 gain 142 102 -109.90 gain 102 143 -108.44 gain 143 102 -109.03 gain 102 144 -105.77 gain 144 102 -107.38 gain 102 145 -113.17 gain 145 102 -113.23 gain 102 146 -111.28 gain 146 102 -110.25 gain 102 147 -107.58 gain 147 102 -103.64 gain 102 148 -110.79 gain 148 102 -106.57 gain 102 149 -106.47 gain 149 102 -105.41 gain 102 150 -127.81 gain 150 102 -129.44 gain 102 151 -121.88 gain 151 102 -123.70 gain 102 152 -127.70 gain 152 102 -126.50 gain 102 153 -121.18 gain 153 102 -117.55 gain 102 154 -125.09 gain 154 102 -130.01 gain 102 155 -120.54 gain 155 102 -125.36 gain 102 156 -114.94 gain 156 102 -114.15 gain 102 157 -117.09 gain 157 102 -119.25 gain 102 158 -111.98 gain 158 102 -116.73 gain 102 159 -111.82 gain 159 102 -113.18 gain 102 160 -114.41 gain 160 102 -112.88 gain 102 161 -116.09 gain 161 102 -118.06 gain 102 162 -113.28 gain 162 102 -114.11 gain 102 163 -107.41 gain 163 102 -110.39 gain 102 164 -108.20 gain 164 102 -112.22 gain 102 165 -123.41 gain 165 102 -123.47 gain 102 166 -124.48 gain 166 102 -126.12 gain 102 167 -123.56 gain 167 102 -127.28 gain 102 168 -126.35 gain 168 102 -128.52 gain 102 169 -119.22 gain 169 102 -125.59 gain 102 170 -121.33 gain 170 102 -119.23 gain 102 171 -117.73 gain 171 102 -120.66 gain 102 172 -117.59 gain 172 102 -115.21 gain 102 173 -113.85 gain 173 102 -110.91 gain 102 174 -113.30 gain 174 102 -114.65 gain 102 175 -117.92 gain 175 102 -122.83 gain 102 176 -116.11 gain 176 102 -113.03 gain 102 177 -112.66 gain 177 102 -117.39 gain 102 178 -109.96 gain 178 102 -110.52 gain 102 179 -115.83 gain 179 102 -114.77 gain 102 180 -128.21 gain 180 102 -128.63 gain 102 181 -124.96 gain 181 102 -125.44 gain 102 182 -117.46 gain 182 102 -120.33 gain 102 183 -124.62 gain 183 102 -120.87 gain 102 184 -125.79 gain 184 102 -126.83 gain 102 185 -123.39 gain 185 102 -121.91 gain 102 186 -118.82 gain 186 102 -117.63 gain 102 187 -118.67 gain 187 102 -120.02 gain 102 188 -117.93 gain 188 102 -122.54 gain 102 189 -119.60 gain 189 102 -121.73 gain 102 190 -112.93 gain 190 102 -112.06 gain 102 191 -114.31 gain 191 102 -114.53 gain 102 192 -118.69 gain 192 102 -121.78 gain 102 193 -116.54 gain 193 102 -120.89 gain 102 194 -116.06 gain 194 102 -114.21 gain 102 195 -130.69 gain 195 102 -129.48 gain 102 196 -127.20 gain 196 102 -130.03 gain 102 197 -127.78 gain 197 102 -126.67 gain 102 198 -123.54 gain 198 102 -121.95 gain 102 199 -126.39 gain 199 102 -128.72 gain 102 200 -123.59 gain 200 102 -122.86 gain 102 201 -127.59 gain 201 102 -127.66 gain 102 202 -121.64 gain 202 102 -125.72 gain 102 203 -116.13 gain 203 102 -119.82 gain 102 204 -120.93 gain 204 102 -121.91 gain 102 205 -114.72 gain 205 102 -114.77 gain 102 206 -122.90 gain 206 102 -127.47 gain 102 207 -122.93 gain 207 102 -119.86 gain 102 208 -122.79 gain 208 102 -125.50 gain 102 209 -116.81 gain 209 102 -120.51 gain 102 210 -122.35 gain 210 102 -122.99 gain 102 211 -127.71 gain 211 102 -130.37 gain 102 212 -124.02 gain 212 102 -125.23 gain 102 213 -120.43 gain 213 102 -120.83 gain 102 214 -115.30 gain 214 102 -115.58 gain 102 215 -124.23 gain 215 102 -120.93 gain 102 216 -121.91 gain 216 102 -123.27 gain 102 217 -117.17 gain 217 102 -119.05 gain 102 218 -113.06 gain 218 102 -117.13 gain 102 219 -126.46 gain 219 102 -121.89 gain 102 220 -126.15 gain 220 102 -132.07 gain 102 221 -117.31 gain 221 102 -118.87 gain 102 222 -121.69 gain 222 102 -123.58 gain 102 223 -119.31 gain 223 102 -119.81 gain 102 224 -117.48 gain 224 102 -120.67 gain 103 104 -88.83 gain 104 103 -94.21 gain 103 105 -121.20 gain 105 103 -122.52 gain 103 106 -124.58 gain 106 103 -126.98 gain 103 107 -114.91 gain 107 103 -123.88 gain 103 108 -126.85 gain 108 103 -128.13 gain 103 109 -121.31 gain 109 103 -126.09 gain 103 110 -114.21 gain 110 103 -117.46 gain 103 111 -116.45 gain 111 103 -119.38 gain 103 112 -108.72 gain 112 103 -110.52 gain 103 113 -109.13 gain 113 103 -109.74 gain 103 114 -110.78 gain 114 103 -114.69 gain 103 115 -109.09 gain 115 103 -107.30 gain 103 116 -100.45 gain 116 103 -106.21 gain 103 117 -96.46 gain 117 103 -103.72 gain 103 118 -90.09 gain 118 103 -95.67 gain 103 119 -98.08 gain 119 103 -98.32 gain 103 120 -123.02 gain 120 103 -127.78 gain 103 121 -124.83 gain 121 103 -128.87 gain 103 122 -120.48 gain 122 103 -126.64 gain 103 123 -124.55 gain 123 103 -131.49 gain 103 124 -117.10 gain 124 103 -120.45 gain 103 125 -122.81 gain 125 103 -127.49 gain 103 126 -112.04 gain 126 103 -114.67 gain 103 127 -105.75 gain 127 103 -111.85 gain 103 128 -108.95 gain 128 103 -112.99 gain 103 129 -113.37 gain 129 103 -115.32 gain 103 130 -108.48 gain 130 103 -108.25 gain 103 131 -101.09 gain 131 103 -107.95 gain 103 132 -99.09 gain 132 103 -105.57 gain 103 133 -101.38 gain 133 103 -105.93 gain 103 134 -104.12 gain 134 103 -105.37 gain 103 135 -131.24 gain 135 103 -136.07 gain 103 136 -122.24 gain 136 103 -127.67 gain 103 137 -116.32 gain 137 103 -119.24 gain 103 138 -119.92 gain 138 103 -121.84 gain 103 139 -113.70 gain 139 103 -116.60 gain 103 140 -113.58 gain 140 103 -119.09 gain 103 141 -118.82 gain 141 103 -123.00 gain 103 142 -123.70 gain 142 103 -127.19 gain 103 143 -108.11 gain 143 103 -111.21 gain 103 144 -114.60 gain 144 103 -118.72 gain 103 145 -108.55 gain 145 103 -111.12 gain 103 146 -106.26 gain 146 103 -107.74 gain 103 147 -107.13 gain 147 103 -105.70 gain 103 148 -107.23 gain 148 103 -105.52 gain 103 149 -105.38 gain 149 103 -106.84 gain 103 150 -122.23 gain 150 103 -126.37 gain 103 151 -116.21 gain 151 103 -120.55 gain 103 152 -122.99 gain 152 103 -124.31 gain 103 153 -114.33 gain 153 103 -113.23 gain 103 154 -124.78 gain 154 103 -132.22 gain 103 155 -112.43 gain 155 103 -119.77 gain 103 156 -121.87 gain 156 103 -123.59 gain 103 157 -113.35 gain 157 103 -118.02 gain 103 158 -108.93 gain 158 103 -116.19 gain 103 159 -108.41 gain 159 103 -112.29 gain 103 160 -113.44 gain 160 103 -114.43 gain 103 161 -105.25 gain 161 103 -109.73 gain 103 162 -105.82 gain 162 103 -109.17 gain 103 163 -114.16 gain 163 103 -119.66 gain 103 164 -107.26 gain 164 103 -113.80 gain 103 165 -122.63 gain 165 103 -125.21 gain 103 166 -124.17 gain 166 103 -128.32 gain 103 167 -120.13 gain 167 103 -126.37 gain 103 168 -116.89 gain 168 103 -121.59 gain 103 169 -122.06 gain 169 103 -130.95 gain 103 170 -121.85 gain 170 103 -122.27 gain 103 171 -121.24 gain 171 103 -126.68 gain 103 172 -125.41 gain 172 103 -125.55 gain 103 173 -122.07 gain 173 103 -121.64 gain 103 174 -111.41 gain 174 103 -115.27 gain 103 175 -110.77 gain 175 103 -118.19 gain 103 176 -110.88 gain 176 103 -110.31 gain 103 177 -120.54 gain 177 103 -127.79 gain 103 178 -108.95 gain 178 103 -112.02 gain 103 179 -111.00 gain 179 103 -112.46 gain 103 180 -127.49 gain 180 103 -130.42 gain 103 181 -130.03 gain 181 103 -133.03 gain 103 182 -125.12 gain 182 103 -130.50 gain 103 183 -123.66 gain 183 103 -122.44 gain 103 184 -130.84 gain 184 103 -134.40 gain 103 185 -118.70 gain 185 103 -119.74 gain 103 186 -114.98 gain 186 103 -116.30 gain 103 187 -121.73 gain 187 103 -125.59 gain 103 188 -113.06 gain 188 103 -120.18 gain 103 189 -117.72 gain 189 103 -122.36 gain 103 190 -121.08 gain 190 103 -122.73 gain 103 191 -115.88 gain 191 103 -118.63 gain 103 192 -113.39 gain 192 103 -119.00 gain 103 193 -113.58 gain 193 103 -120.44 gain 103 194 -113.06 gain 194 103 -113.73 gain 103 195 -119.68 gain 195 103 -120.99 gain 103 196 -124.01 gain 196 103 -129.35 gain 103 197 -131.49 gain 197 103 -132.89 gain 103 198 -123.80 gain 198 103 -124.73 gain 103 199 -126.07 gain 199 103 -130.92 gain 103 200 -116.92 gain 200 103 -118.70 gain 103 201 -117.98 gain 201 103 -120.57 gain 103 202 -118.49 gain 202 103 -125.08 gain 103 203 -114.79 gain 203 103 -121.00 gain 103 204 -114.27 gain 204 103 -117.76 gain 103 205 -113.36 gain 205 103 -115.92 gain 103 206 -107.71 gain 206 103 -114.80 gain 103 207 -121.81 gain 207 103 -121.26 gain 103 208 -115.96 gain 208 103 -121.18 gain 103 209 -111.84 gain 209 103 -118.06 gain 103 210 -124.06 gain 210 103 -127.22 gain 103 211 -127.97 gain 211 103 -133.14 gain 103 212 -126.30 gain 212 103 -130.02 gain 103 213 -118.64 gain 213 103 -121.55 gain 103 214 -122.79 gain 214 103 -125.59 gain 103 215 -117.37 gain 215 103 -116.59 gain 103 216 -123.10 gain 216 103 -126.97 gain 103 217 -118.52 gain 217 103 -122.92 gain 103 218 -119.98 gain 218 103 -126.57 gain 103 219 -123.07 gain 219 103 -121.01 gain 103 220 -117.81 gain 220 103 -126.24 gain 103 221 -124.12 gain 221 103 -128.19 gain 103 222 -121.43 gain 222 103 -125.83 gain 103 223 -119.79 gain 223 103 -122.81 gain 103 224 -117.07 gain 224 103 -122.77 gain 104 105 -129.04 gain 105 104 -124.98 gain 104 106 -130.99 gain 106 104 -128.01 gain 104 107 -124.43 gain 107 104 -128.02 gain 104 108 -127.39 gain 108 104 -123.30 gain 104 109 -129.08 gain 109 104 -128.48 gain 104 110 -128.21 gain 110 104 -126.08 gain 104 111 -126.51 gain 111 104 -124.06 gain 104 112 -111.88 gain 112 104 -108.31 gain 104 113 -114.41 gain 113 104 -109.65 gain 104 114 -116.85 gain 114 104 -115.38 gain 104 115 -112.15 gain 115 104 -104.99 gain 104 116 -105.70 gain 116 104 -106.08 gain 104 117 -104.65 gain 117 104 -106.53 gain 104 118 -94.58 gain 118 104 -94.79 gain 104 119 -95.07 gain 119 104 -89.93 gain 104 120 -120.81 gain 120 104 -120.19 gain 104 121 -129.30 gain 121 104 -127.97 gain 104 122 -127.58 gain 122 104 -128.37 gain 104 123 -120.69 gain 123 104 -122.25 gain 104 124 -128.04 gain 124 104 -126.01 gain 104 125 -127.67 gain 125 104 -126.97 gain 104 126 -120.29 gain 126 104 -117.55 gain 104 127 -115.15 gain 127 104 -115.88 gain 104 128 -118.03 gain 128 104 -116.69 gain 104 129 -125.52 gain 129 104 -122.09 gain 104 130 -118.10 gain 130 104 -112.49 gain 104 131 -109.38 gain 131 104 -110.86 gain 104 132 -106.90 gain 132 104 -108.01 gain 104 133 -104.76 gain 133 104 -103.94 gain 104 134 -113.28 gain 134 104 -109.16 gain 104 135 -125.46 gain 135 104 -124.91 gain 104 136 -125.11 gain 136 104 -125.17 gain 104 137 -133.70 gain 137 104 -131.24 gain 104 138 -132.49 gain 138 104 -129.03 gain 104 139 -130.62 gain 139 104 -128.15 gain 104 140 -125.50 gain 140 104 -125.64 gain 104 141 -125.89 gain 141 104 -124.70 gain 104 142 -120.70 gain 142 104 -118.82 gain 104 143 -120.37 gain 143 104 -118.10 gain 104 144 -119.91 gain 144 104 -118.65 gain 104 145 -119.41 gain 145 104 -116.61 gain 104 146 -113.36 gain 146 104 -109.46 gain 104 147 -108.82 gain 147 104 -102.01 gain 104 148 -112.83 gain 148 104 -105.74 gain 104 149 -107.35 gain 149 104 -103.43 gain 104 150 -126.28 gain 150 104 -125.04 gain 104 151 -130.89 gain 151 104 -129.85 gain 104 152 -131.63 gain 152 104 -127.57 gain 104 153 -121.47 gain 153 104 -114.99 gain 104 154 -121.03 gain 154 104 -123.09 gain 104 155 -128.20 gain 155 104 -130.16 gain 104 156 -125.20 gain 156 104 -121.55 gain 104 157 -127.57 gain 157 104 -126.87 gain 104 158 -122.56 gain 158 104 -124.45 gain 104 159 -122.07 gain 159 104 -120.58 gain 104 160 -120.67 gain 160 104 -116.29 gain 104 161 -112.10 gain 161 104 -111.21 gain 104 162 -116.61 gain 162 104 -114.58 gain 104 163 -115.35 gain 163 104 -115.47 gain 104 164 -112.87 gain 164 104 -114.04 gain 104 165 -129.45 gain 165 104 -126.66 gain 104 166 -126.18 gain 166 104 -124.95 gain 104 167 -121.36 gain 167 104 -122.22 gain 104 168 -125.50 gain 168 104 -124.81 gain 104 169 -126.81 gain 169 104 -130.32 gain 104 170 -124.11 gain 170 104 -119.15 gain 104 171 -132.15 gain 171 104 -132.21 gain 104 172 -122.02 gain 172 104 -116.78 gain 104 173 -125.25 gain 173 104 -119.44 gain 104 174 -120.66 gain 174 104 -119.15 gain 104 175 -122.78 gain 175 104 -124.83 gain 104 176 -114.31 gain 176 104 -108.37 gain 104 177 -111.42 gain 177 104 -113.29 gain 104 178 -117.21 gain 178 104 -114.90 gain 104 179 -122.20 gain 179 104 -118.28 gain 104 180 -133.40 gain 180 104 -130.95 gain 104 181 -126.60 gain 181 104 -124.23 gain 104 182 -130.80 gain 182 104 -130.81 gain 104 183 -132.26 gain 183 104 -125.66 gain 104 184 -118.48 gain 184 104 -116.66 gain 104 185 -133.26 gain 185 104 -128.93 gain 104 186 -129.62 gain 186 104 -125.57 gain 104 187 -128.43 gain 187 104 -126.92 gain 104 188 -119.70 gain 188 104 -121.45 gain 104 189 -123.29 gain 189 104 -122.56 gain 104 190 -124.61 gain 190 104 -120.88 gain 104 191 -123.70 gain 191 104 -121.07 gain 104 192 -114.28 gain 192 104 -114.52 gain 104 193 -119.23 gain 193 104 -120.72 gain 104 194 -118.98 gain 194 104 -114.27 gain 104 195 -135.88 gain 195 104 -131.81 gain 104 196 -134.86 gain 196 104 -134.83 gain 104 197 -136.20 gain 197 104 -132.23 gain 104 198 -124.42 gain 198 104 -119.97 gain 104 199 -129.61 gain 199 104 -129.08 gain 104 200 -126.98 gain 200 104 -123.39 gain 104 201 -129.64 gain 201 104 -126.86 gain 104 202 -125.10 gain 202 104 -126.32 gain 104 203 -125.79 gain 203 104 -126.63 gain 104 204 -123.77 gain 204 104 -121.89 gain 104 205 -124.31 gain 205 104 -121.50 gain 104 206 -117.23 gain 206 104 -118.94 gain 104 207 -123.28 gain 207 104 -117.35 gain 104 208 -119.08 gain 208 104 -118.93 gain 104 209 -127.39 gain 209 104 -128.23 gain 104 210 -135.88 gain 210 104 -133.66 gain 104 211 -132.97 gain 211 104 -132.78 gain 104 212 -128.70 gain 212 104 -127.05 gain 104 213 -131.31 gain 213 104 -128.85 gain 104 214 -127.68 gain 214 104 -125.10 gain 104 215 -125.01 gain 215 104 -118.85 gain 104 216 -130.30 gain 216 104 -128.80 gain 104 217 -117.99 gain 217 104 -117.01 gain 104 218 -120.15 gain 218 104 -121.36 gain 104 219 -128.40 gain 219 104 -120.97 gain 104 220 -126.41 gain 220 104 -129.47 gain 104 221 -128.28 gain 221 104 -126.98 gain 104 222 -122.31 gain 222 104 -121.34 gain 104 223 -122.15 gain 223 104 -119.79 gain 104 224 -121.23 gain 224 104 -121.56 gain 105 106 -87.06 gain 106 105 -88.14 gain 105 107 -100.75 gain 107 105 -108.40 gain 105 108 -109.10 gain 108 105 -109.07 gain 105 109 -107.09 gain 109 105 -110.55 gain 105 110 -109.96 gain 110 105 -111.89 gain 105 111 -110.49 gain 111 105 -112.10 gain 105 112 -118.90 gain 112 105 -119.39 gain 105 113 -119.38 gain 113 105 -118.67 gain 105 114 -122.44 gain 114 105 -125.04 gain 105 115 -122.50 gain 115 105 -119.39 gain 105 116 -123.16 gain 116 105 -127.60 gain 105 117 -122.05 gain 117 105 -127.99 gain 105 118 -131.86 gain 118 105 -136.12 gain 105 119 -132.56 gain 119 105 -131.48 gain 105 120 -99.70 gain 120 105 -103.14 gain 105 121 -93.98 gain 121 105 -96.71 gain 105 122 -107.41 gain 122 105 -112.25 gain 105 123 -102.46 gain 123 105 -108.08 gain 105 124 -109.08 gain 124 105 -111.11 gain 105 125 -110.47 gain 125 105 -113.83 gain 105 126 -121.08 gain 126 105 -122.40 gain 105 127 -115.41 gain 127 105 -120.19 gain 105 128 -123.36 gain 128 105 -126.07 gain 105 129 -115.98 gain 129 105 -116.61 gain 105 130 -120.68 gain 130 105 -119.13 gain 105 131 -124.55 gain 131 105 -130.09 gain 105 132 -125.49 gain 132 105 -130.66 gain 105 133 -122.08 gain 133 105 -125.32 gain 105 134 -122.74 gain 134 105 -122.67 gain 105 135 -104.95 gain 135 105 -108.45 gain 105 136 -98.98 gain 136 105 -103.10 gain 105 137 -110.25 gain 137 105 -111.85 gain 105 138 -110.39 gain 138 105 -110.99 gain 105 139 -117.27 gain 139 105 -118.85 gain 105 140 -112.05 gain 140 105 -116.25 gain 105 141 -113.03 gain 141 105 -115.89 gain 105 142 -118.09 gain 142 105 -120.26 gain 105 143 -122.01 gain 143 105 -123.80 gain 105 144 -119.30 gain 144 105 -122.11 gain 105 145 -123.57 gain 145 105 -124.82 gain 105 146 -123.61 gain 146 105 -123.77 gain 105 147 -115.45 gain 147 105 -112.71 gain 105 148 -122.65 gain 148 105 -119.62 gain 105 149 -124.05 gain 149 105 -124.19 gain 105 150 -105.02 gain 150 105 -107.85 gain 105 151 -103.49 gain 151 105 -106.51 gain 105 152 -109.52 gain 152 105 -109.52 gain 105 153 -115.95 gain 153 105 -113.52 gain 105 154 -112.71 gain 154 105 -118.84 gain 105 155 -114.60 gain 155 105 -120.62 gain 105 156 -114.83 gain 156 105 -115.23 gain 105 157 -118.11 gain 157 105 -121.46 gain 105 158 -117.59 gain 158 105 -123.53 gain 105 159 -118.89 gain 159 105 -121.45 gain 105 160 -117.14 gain 160 105 -116.82 gain 105 161 -129.70 gain 161 105 -132.87 gain 105 162 -123.73 gain 162 105 -125.76 gain 105 163 -131.32 gain 163 105 -135.49 gain 105 164 -128.87 gain 164 105 -134.09 gain 105 165 -105.55 gain 165 105 -106.81 gain 105 166 -113.77 gain 166 105 -116.60 gain 105 167 -104.40 gain 167 105 -109.32 gain 105 168 -111.02 gain 168 105 -114.39 gain 105 169 -114.29 gain 169 105 -121.86 gain 105 170 -114.94 gain 170 105 -114.04 gain 105 171 -116.80 gain 171 105 -120.92 gain 105 172 -118.56 gain 172 105 -117.37 gain 105 173 -119.93 gain 173 105 -118.19 gain 105 174 -118.02 gain 174 105 -120.57 gain 105 175 -113.49 gain 175 105 -119.59 gain 105 176 -119.35 gain 176 105 -117.47 gain 105 177 -132.53 gain 177 105 -138.45 gain 105 178 -125.76 gain 178 105 -127.51 gain 105 179 -129.20 gain 179 105 -129.34 gain 105 180 -116.41 gain 180 105 -118.02 gain 105 181 -112.49 gain 181 105 -114.16 gain 105 182 -109.77 gain 182 105 -113.84 gain 105 183 -115.59 gain 183 105 -113.05 gain 105 184 -116.15 gain 184 105 -118.39 gain 105 185 -108.03 gain 185 105 -107.75 gain 105 186 -118.22 gain 186 105 -118.22 gain 105 187 -116.82 gain 187 105 -119.37 gain 105 188 -120.74 gain 188 105 -126.55 gain 105 189 -123.88 gain 189 105 -127.21 gain 105 190 -130.32 gain 190 105 -130.65 gain 105 191 -120.30 gain 191 105 -121.72 gain 105 192 -131.32 gain 192 105 -135.61 gain 105 193 -129.81 gain 193 105 -135.35 gain 105 194 -127.86 gain 194 105 -127.21 gain 105 195 -112.71 gain 195 105 -112.69 gain 105 196 -114.74 gain 196 105 -118.76 gain 105 197 -111.47 gain 197 105 -111.56 gain 105 198 -120.28 gain 198 105 -119.89 gain 105 199 -118.37 gain 199 105 -121.89 gain 105 200 -119.28 gain 200 105 -119.75 gain 105 201 -120.27 gain 201 105 -121.54 gain 105 202 -116.27 gain 202 105 -121.54 gain 105 203 -119.56 gain 203 105 -124.45 gain 105 204 -124.98 gain 204 105 -127.15 gain 105 205 -123.49 gain 205 105 -124.74 gain 105 206 -126.21 gain 206 105 -131.98 gain 105 207 -125.85 gain 207 105 -123.98 gain 105 208 -120.13 gain 208 105 -124.04 gain 105 209 -122.95 gain 209 105 -127.85 gain 105 210 -113.04 gain 210 105 -114.87 gain 105 211 -119.35 gain 211 105 -123.21 gain 105 212 -114.33 gain 212 105 -116.73 gain 105 213 -117.82 gain 213 105 -119.41 gain 105 214 -116.44 gain 214 105 -117.92 gain 105 215 -118.87 gain 215 105 -116.76 gain 105 216 -115.95 gain 216 105 -118.50 gain 105 217 -127.63 gain 217 105 -130.71 gain 105 218 -124.53 gain 218 105 -129.79 gain 105 219 -123.71 gain 219 105 -120.34 gain 105 220 -118.68 gain 220 105 -125.80 gain 105 221 -120.90 gain 221 105 -123.66 gain 105 222 -122.56 gain 222 105 -125.65 gain 105 223 -127.32 gain 223 105 -129.02 gain 105 224 -130.59 gain 224 105 -134.98 gain 106 107 -93.91 gain 107 106 -100.48 gain 106 108 -102.56 gain 108 106 -101.44 gain 106 109 -110.50 gain 109 106 -112.88 gain 106 110 -111.94 gain 110 106 -112.78 gain 106 111 -121.15 gain 111 106 -121.67 gain 106 112 -117.76 gain 112 106 -117.16 gain 106 113 -124.69 gain 113 106 -122.90 gain 106 114 -126.17 gain 114 106 -127.68 gain 106 115 -117.37 gain 115 106 -113.19 gain 106 116 -122.59 gain 116 106 -125.95 gain 106 117 -129.51 gain 117 106 -134.37 gain 106 118 -117.46 gain 118 106 -120.64 gain 106 119 -125.92 gain 119 106 -123.75 gain 106 120 -102.77 gain 120 106 -105.13 gain 106 121 -94.61 gain 121 106 -96.25 gain 106 122 -102.73 gain 122 106 -106.49 gain 106 123 -98.49 gain 123 106 -103.03 gain 106 124 -106.56 gain 124 106 -107.50 gain 106 125 -109.46 gain 125 106 -111.74 gain 106 126 -115.59 gain 126 106 -115.83 gain 106 127 -115.42 gain 127 106 -119.12 gain 106 128 -119.86 gain 128 106 -121.50 gain 106 129 -119.13 gain 129 106 -118.67 gain 106 130 -123.65 gain 130 106 -121.02 gain 106 131 -125.11 gain 131 106 -129.56 gain 106 132 -124.93 gain 132 106 -129.01 gain 106 133 -133.26 gain 133 106 -135.41 gain 106 134 -123.61 gain 134 106 -122.47 gain 106 135 -108.17 gain 135 106 -110.59 gain 106 136 -103.22 gain 136 106 -106.25 gain 106 137 -106.64 gain 137 106 -107.16 gain 106 138 -112.51 gain 138 106 -112.03 gain 106 139 -106.43 gain 139 106 -106.93 gain 106 140 -116.02 gain 140 106 -119.13 gain 106 141 -113.56 gain 141 106 -115.34 gain 106 142 -114.26 gain 142 106 -115.35 gain 106 143 -121.88 gain 143 106 -122.59 gain 106 144 -126.37 gain 144 106 -128.09 gain 106 145 -131.93 gain 145 106 -132.10 gain 106 146 -127.00 gain 146 106 -126.08 gain 106 147 -121.24 gain 147 106 -117.41 gain 106 148 -121.10 gain 148 106 -116.99 gain 106 149 -129.00 gain 149 106 -128.06 gain 106 150 -112.30 gain 150 106 -114.04 gain 106 151 -110.06 gain 151 106 -111.99 gain 106 152 -107.04 gain 152 106 -105.95 gain 106 153 -114.77 gain 153 106 -111.27 gain 106 154 -116.86 gain 154 106 -121.90 gain 106 155 -113.79 gain 155 106 -118.73 gain 106 156 -115.33 gain 156 106 -114.66 gain 106 157 -116.50 gain 157 106 -118.77 gain 106 158 -115.12 gain 158 106 -119.98 gain 106 159 -121.68 gain 159 106 -123.17 gain 106 160 -123.70 gain 160 106 -122.29 gain 106 161 -123.17 gain 161 106 -125.25 gain 106 162 -120.39 gain 162 106 -121.34 gain 106 163 -129.90 gain 163 106 -133.00 gain 106 164 -123.10 gain 164 106 -127.23 gain 106 165 -108.53 gain 165 106 -108.71 gain 106 166 -108.56 gain 166 106 -110.31 gain 106 167 -102.16 gain 167 106 -105.99 gain 106 168 -104.22 gain 168 106 -106.51 gain 106 169 -118.16 gain 169 106 -124.65 gain 106 170 -108.94 gain 170 106 -106.96 gain 106 171 -115.89 gain 171 106 -118.93 gain 106 172 -112.19 gain 172 106 -109.93 gain 106 173 -119.38 gain 173 106 -116.55 gain 106 174 -120.71 gain 174 106 -122.18 gain 106 175 -128.23 gain 175 106 -133.25 gain 106 176 -120.25 gain 176 106 -117.28 gain 106 177 -122.28 gain 177 106 -127.13 gain 106 178 -122.64 gain 178 106 -123.30 gain 106 179 -129.73 gain 179 106 -128.79 gain 106 180 -111.04 gain 180 106 -111.57 gain 106 181 -115.20 gain 181 106 -115.80 gain 106 182 -111.33 gain 182 106 -114.31 gain 106 183 -118.98 gain 183 106 -115.35 gain 106 184 -109.27 gain 184 106 -110.42 gain 106 185 -115.10 gain 185 106 -113.74 gain 106 186 -114.12 gain 186 106 -113.05 gain 106 187 -130.06 gain 187 106 -131.53 gain 106 188 -116.44 gain 188 106 -121.16 gain 106 189 -121.62 gain 189 106 -123.86 gain 106 190 -122.66 gain 190 106 -121.91 gain 106 191 -125.37 gain 191 106 -125.71 gain 106 192 -118.45 gain 192 106 -121.66 gain 106 193 -127.54 gain 193 106 -132.00 gain 106 194 -124.65 gain 194 106 -122.92 gain 106 195 -111.75 gain 195 106 -110.66 gain 106 196 -116.82 gain 196 106 -119.77 gain 106 197 -116.90 gain 197 106 -115.91 gain 106 198 -124.15 gain 198 106 -122.68 gain 106 199 -118.04 gain 199 106 -120.48 gain 106 200 -113.73 gain 200 106 -113.11 gain 106 201 -112.74 gain 201 106 -112.93 gain 106 202 -119.18 gain 202 106 -123.37 gain 106 203 -117.51 gain 203 106 -121.32 gain 106 204 -127.67 gain 204 106 -128.77 gain 106 205 -117.93 gain 205 106 -118.10 gain 106 206 -123.44 gain 206 106 -128.13 gain 106 207 -123.64 gain 207 106 -120.69 gain 106 208 -136.10 gain 208 106 -138.93 gain 106 209 -130.88 gain 209 106 -134.70 gain 106 210 -115.80 gain 210 106 -116.56 gain 106 211 -117.90 gain 211 106 -120.67 gain 106 212 -118.51 gain 212 106 -119.83 gain 106 213 -112.07 gain 213 106 -112.58 gain 106 214 -123.02 gain 214 106 -123.42 gain 106 215 -124.63 gain 215 106 -121.44 gain 106 216 -131.35 gain 216 106 -132.82 gain 106 217 -126.60 gain 217 106 -128.59 gain 106 218 -122.77 gain 218 106 -126.96 gain 106 219 -125.53 gain 219 106 -121.07 gain 106 220 -117.37 gain 220 106 -123.40 gain 106 221 -124.22 gain 221 106 -125.89 gain 106 222 -131.32 gain 222 106 -133.32 gain 106 223 -126.48 gain 223 106 -127.10 gain 106 224 -126.06 gain 224 106 -129.37 gain 107 108 -101.89 gain 108 107 -94.21 gain 107 109 -100.63 gain 109 107 -96.44 gain 107 110 -113.14 gain 110 107 -107.42 gain 107 111 -116.65 gain 111 107 -110.60 gain 107 112 -117.63 gain 112 107 -110.46 gain 107 113 -131.11 gain 113 107 -122.75 gain 107 114 -125.61 gain 114 107 -120.56 gain 107 115 -132.43 gain 115 107 -121.68 gain 107 116 -128.31 gain 116 107 -125.10 gain 107 117 -129.03 gain 117 107 -127.32 gain 107 118 -127.08 gain 118 107 -123.69 gain 107 119 -124.22 gain 119 107 -115.49 gain 107 120 -111.38 gain 120 107 -107.17 gain 107 121 -103.23 gain 121 107 -98.31 gain 107 122 -98.91 gain 122 107 -96.10 gain 107 123 -99.91 gain 123 107 -97.88 gain 107 124 -97.95 gain 124 107 -92.33 gain 107 125 -108.48 gain 125 107 -104.19 gain 107 126 -112.27 gain 126 107 -105.94 gain 107 127 -117.67 gain 127 107 -114.80 gain 107 128 -127.68 gain 128 107 -122.75 gain 107 129 -128.60 gain 129 107 -121.58 gain 107 130 -137.59 gain 130 107 -128.40 gain 107 131 -131.72 gain 131 107 -129.61 gain 107 132 -132.53 gain 132 107 -130.04 gain 107 133 -126.57 gain 133 107 -122.15 gain 107 134 -133.38 gain 134 107 -125.67 gain 107 135 -112.57 gain 135 107 -108.42 gain 107 136 -115.23 gain 136 107 -111.69 gain 107 137 -109.13 gain 137 107 -103.08 gain 107 138 -114.48 gain 138 107 -107.43 gain 107 139 -114.28 gain 139 107 -108.21 gain 107 140 -119.95 gain 140 107 -116.49 gain 107 141 -113.36 gain 141 107 -108.57 gain 107 142 -117.66 gain 142 107 -112.18 gain 107 143 -119.03 gain 143 107 -113.17 gain 107 144 -121.60 gain 144 107 -116.76 gain 107 145 -129.21 gain 145 107 -122.82 gain 107 146 -126.21 gain 146 107 -118.72 gain 107 147 -130.55 gain 147 107 -120.15 gain 107 148 -132.40 gain 148 107 -121.73 gain 107 149 -133.72 gain 149 107 -126.20 gain 107 150 -120.85 gain 150 107 -116.03 gain 107 151 -120.77 gain 151 107 -116.14 gain 107 152 -109.46 gain 152 107 -101.81 gain 107 153 -111.30 gain 153 107 -101.22 gain 107 154 -121.20 gain 154 107 -119.67 gain 107 155 -116.30 gain 155 107 -114.67 gain 107 156 -122.08 gain 156 107 -114.84 gain 107 157 -127.45 gain 157 107 -123.15 gain 107 158 -127.42 gain 158 107 -125.71 gain 107 159 -127.35 gain 159 107 -122.26 gain 107 160 -124.09 gain 160 107 -116.11 gain 107 161 -127.49 gain 161 107 -123.01 gain 107 162 -129.14 gain 162 107 -123.52 gain 107 163 -132.90 gain 163 107 -129.43 gain 107 164 -132.11 gain 164 107 -129.68 gain 107 165 -123.99 gain 165 107 -117.60 gain 107 166 -116.46 gain 166 107 -111.64 gain 107 167 -113.51 gain 167 107 -110.78 gain 107 168 -109.33 gain 168 107 -105.05 gain 107 169 -123.16 gain 169 107 -123.08 gain 107 170 -123.82 gain 170 107 -115.26 gain 107 171 -124.64 gain 171 107 -121.11 gain 107 172 -117.73 gain 172 107 -108.90 gain 107 173 -119.85 gain 173 107 -110.45 gain 107 174 -126.29 gain 174 107 -121.19 gain 107 175 -127.55 gain 175 107 -126.00 gain 107 176 -130.49 gain 176 107 -120.96 gain 107 177 -128.37 gain 177 107 -126.64 gain 107 178 -129.61 gain 178 107 -123.71 gain 107 179 -126.07 gain 179 107 -118.56 gain 107 180 -122.55 gain 180 107 -116.51 gain 107 181 -115.53 gain 181 107 -109.55 gain 107 182 -116.40 gain 182 107 -112.82 gain 107 183 -126.40 gain 183 107 -116.21 gain 107 184 -120.24 gain 184 107 -114.83 gain 107 185 -118.66 gain 185 107 -110.73 gain 107 186 -121.91 gain 186 107 -114.26 gain 107 187 -123.48 gain 187 107 -118.38 gain 107 188 -126.17 gain 188 107 -124.33 gain 107 189 -122.15 gain 189 107 -117.82 gain 107 190 -122.39 gain 190 107 -115.07 gain 107 191 -134.55 gain 191 107 -128.32 gain 107 192 -130.91 gain 192 107 -127.55 gain 107 193 -131.33 gain 193 107 -129.22 gain 107 194 -126.23 gain 194 107 -117.94 gain 107 195 -128.04 gain 195 107 -120.38 gain 107 196 -123.50 gain 196 107 -119.88 gain 107 197 -123.04 gain 197 107 -115.47 gain 107 198 -124.16 gain 198 107 -116.12 gain 107 199 -128.89 gain 199 107 -124.77 gain 107 200 -126.99 gain 200 107 -119.81 gain 107 201 -125.70 gain 201 107 -119.32 gain 107 202 -123.43 gain 202 107 -121.05 gain 107 203 -130.52 gain 203 107 -127.76 gain 107 204 -128.20 gain 204 107 -122.73 gain 107 205 -132.76 gain 205 107 -126.36 gain 107 206 -134.36 gain 206 107 -132.48 gain 107 207 -127.28 gain 207 107 -117.76 gain 107 208 -129.49 gain 208 107 -125.75 gain 107 209 -126.60 gain 209 107 -123.85 gain 107 210 -126.34 gain 210 107 -120.53 gain 107 211 -128.00 gain 211 107 -124.21 gain 107 212 -120.42 gain 212 107 -115.17 gain 107 213 -121.97 gain 213 107 -115.91 gain 107 214 -127.12 gain 214 107 -120.95 gain 107 215 -119.19 gain 215 107 -109.44 gain 107 216 -129.45 gain 216 107 -124.36 gain 107 217 -122.46 gain 217 107 -117.89 gain 107 218 -135.75 gain 218 107 -133.36 gain 107 219 -128.03 gain 219 107 -117.00 gain 107 220 -129.29 gain 220 107 -128.76 gain 107 221 -127.19 gain 221 107 -122.30 gain 107 222 -132.37 gain 222 107 -127.80 gain 107 223 -134.46 gain 223 107 -128.51 gain 107 224 -130.08 gain 224 107 -126.82 gain 108 109 -93.59 gain 109 108 -97.08 gain 108 110 -101.28 gain 110 108 -103.23 gain 108 111 -102.99 gain 111 108 -104.63 gain 108 112 -113.93 gain 112 108 -114.45 gain 108 113 -114.41 gain 113 108 -113.74 gain 108 114 -120.18 gain 114 108 -122.81 gain 108 115 -118.18 gain 115 108 -115.11 gain 108 116 -124.17 gain 116 108 -128.64 gain 108 117 -123.60 gain 117 108 -129.57 gain 108 118 -120.26 gain 118 108 -124.56 gain 108 119 -121.18 gain 119 108 -120.13 gain 108 120 -109.20 gain 120 108 -112.67 gain 108 121 -101.35 gain 121 108 -104.11 gain 108 122 -99.43 gain 122 108 -104.30 gain 108 123 -97.00 gain 123 108 -102.65 gain 108 124 -86.57 gain 124 108 -88.63 gain 108 125 -99.43 gain 125 108 -102.83 gain 108 126 -99.17 gain 126 108 -100.52 gain 108 127 -104.45 gain 127 108 -109.26 gain 108 128 -113.69 gain 128 108 -116.44 gain 108 129 -113.69 gain 129 108 -114.35 gain 108 130 -122.29 gain 130 108 -120.77 gain 108 131 -124.05 gain 131 108 -129.62 gain 108 132 -125.28 gain 132 108 -130.47 gain 108 133 -121.55 gain 133 108 -124.82 gain 108 134 -119.21 gain 134 108 -119.17 gain 108 135 -108.77 gain 135 108 -112.30 gain 108 136 -108.84 gain 136 108 -112.99 gain 108 137 -103.00 gain 137 108 -104.63 gain 108 138 -102.34 gain 138 108 -102.97 gain 108 139 -103.36 gain 139 108 -104.97 gain 108 140 -107.11 gain 140 108 -111.33 gain 108 141 -111.29 gain 141 108 -114.19 gain 108 142 -115.40 gain 142 108 -117.60 gain 108 143 -118.08 gain 143 108 -119.90 gain 108 144 -116.14 gain 144 108 -118.97 gain 108 145 -114.31 gain 145 108 -115.59 gain 108 146 -110.93 gain 146 108 -111.13 gain 108 147 -110.67 gain 147 108 -107.95 gain 108 148 -123.34 gain 148 108 -120.35 gain 108 149 -123.78 gain 149 108 -123.95 gain 108 150 -107.47 gain 150 108 -110.32 gain 108 151 -104.63 gain 151 108 -107.68 gain 108 152 -110.59 gain 152 108 -110.62 gain 108 153 -107.55 gain 153 108 -105.15 gain 108 154 -106.93 gain 154 108 -113.08 gain 108 155 -104.01 gain 155 108 -110.06 gain 108 156 -101.92 gain 156 108 -102.36 gain 108 157 -114.44 gain 157 108 -117.82 gain 108 158 -109.68 gain 158 108 -115.65 gain 108 159 -116.68 gain 159 108 -119.28 gain 108 160 -113.71 gain 160 108 -113.42 gain 108 161 -118.58 gain 161 108 -121.78 gain 108 162 -118.68 gain 162 108 -120.74 gain 108 163 -113.60 gain 163 108 -117.81 gain 108 164 -128.78 gain 164 108 -134.03 gain 108 165 -105.62 gain 165 108 -106.91 gain 108 166 -109.13 gain 166 108 -111.99 gain 108 167 -109.03 gain 167 108 -113.99 gain 108 168 -109.27 gain 168 108 -112.67 gain 108 169 -108.32 gain 169 108 -115.93 gain 108 170 -109.90 gain 170 108 -109.02 gain 108 171 -106.31 gain 171 108 -110.46 gain 108 172 -112.80 gain 172 108 -111.65 gain 108 173 -110.53 gain 173 108 -108.81 gain 108 174 -113.21 gain 174 108 -115.79 gain 108 175 -119.74 gain 175 108 -125.88 gain 108 176 -121.68 gain 176 108 -119.82 gain 108 177 -128.36 gain 177 108 -134.32 gain 108 178 -120.98 gain 178 108 -122.76 gain 108 179 -126.00 gain 179 108 -126.18 gain 108 180 -115.32 gain 180 108 -116.96 gain 108 181 -109.50 gain 181 108 -111.21 gain 108 182 -104.54 gain 182 108 -108.63 gain 108 183 -115.03 gain 183 108 -112.52 gain 108 184 -107.62 gain 184 108 -109.89 gain 108 185 -110.83 gain 185 108 -110.59 gain 108 186 -113.32 gain 186 108 -113.36 gain 108 187 -110.41 gain 187 108 -112.99 gain 108 188 -115.72 gain 188 108 -121.56 gain 108 189 -121.38 gain 189 108 -124.74 gain 108 190 -118.80 gain 190 108 -119.17 gain 108 191 -113.44 gain 191 108 -114.89 gain 108 192 -114.17 gain 192 108 -118.49 gain 108 193 -123.32 gain 193 108 -128.89 gain 108 194 -121.28 gain 194 108 -120.66 gain 108 195 -118.39 gain 195 108 -118.41 gain 108 196 -120.80 gain 196 108 -124.85 gain 108 197 -117.39 gain 197 108 -117.51 gain 108 198 -117.54 gain 198 108 -117.19 gain 108 199 -117.79 gain 199 108 -121.35 gain 108 200 -111.38 gain 200 108 -111.87 gain 108 201 -108.43 gain 201 108 -109.73 gain 108 202 -122.77 gain 202 108 -128.07 gain 108 203 -112.36 gain 203 108 -117.29 gain 108 204 -114.74 gain 204 108 -116.95 gain 108 205 -117.01 gain 205 108 -118.29 gain 108 206 -121.83 gain 206 108 -127.63 gain 108 207 -124.40 gain 207 108 -122.56 gain 108 208 -121.77 gain 208 108 -125.71 gain 108 209 -120.59 gain 209 108 -125.52 gain 108 210 -115.95 gain 210 108 -117.82 gain 108 211 -115.52 gain 211 108 -119.41 gain 108 212 -120.35 gain 212 108 -122.79 gain 108 213 -115.42 gain 213 108 -117.05 gain 108 214 -118.98 gain 214 108 -120.49 gain 108 215 -111.13 gain 215 108 -109.06 gain 108 216 -114.67 gain 216 108 -117.26 gain 108 217 -114.91 gain 217 108 -118.01 gain 108 218 -118.92 gain 218 108 -124.22 gain 108 219 -118.71 gain 219 108 -115.37 gain 108 220 -127.27 gain 220 108 -134.42 gain 108 221 -124.55 gain 221 108 -127.34 gain 108 222 -122.21 gain 222 108 -125.32 gain 108 223 -126.23 gain 223 108 -127.96 gain 108 224 -132.98 gain 224 108 -137.40 gain 109 110 -90.50 gain 110 109 -88.97 gain 109 111 -104.21 gain 111 109 -102.36 gain 109 112 -115.38 gain 112 109 -112.40 gain 109 113 -109.67 gain 113 109 -105.51 gain 109 114 -112.22 gain 114 109 -111.36 gain 109 115 -112.80 gain 115 109 -106.24 gain 109 116 -120.20 gain 116 109 -121.19 gain 109 117 -115.61 gain 117 109 -118.09 gain 109 118 -127.85 gain 118 109 -128.66 gain 109 119 -129.62 gain 119 109 -125.08 gain 109 120 -105.80 gain 120 109 -105.78 gain 109 121 -102.64 gain 121 109 -101.90 gain 109 122 -106.67 gain 122 109 -108.05 gain 109 123 -96.81 gain 123 109 -98.97 gain 109 124 -95.99 gain 124 109 -94.56 gain 109 125 -103.89 gain 125 109 -103.79 gain 109 126 -105.61 gain 126 109 -103.47 gain 109 127 -110.19 gain 127 109 -111.52 gain 109 128 -117.91 gain 128 109 -117.18 gain 109 129 -116.92 gain 129 109 -114.09 gain 109 130 -123.47 gain 130 109 -118.46 gain 109 131 -120.99 gain 131 109 -123.07 gain 109 132 -127.66 gain 132 109 -129.37 gain 109 133 -121.66 gain 133 109 -121.44 gain 109 134 -127.99 gain 134 109 -124.47 gain 109 135 -115.62 gain 135 109 -115.66 gain 109 136 -112.73 gain 136 109 -113.39 gain 109 137 -107.86 gain 137 109 -106.00 gain 109 138 -107.55 gain 138 109 -104.69 gain 109 139 -103.95 gain 139 109 -102.08 gain 109 140 -107.67 gain 140 109 -108.40 gain 109 141 -107.26 gain 141 109 -106.67 gain 109 142 -113.34 gain 142 109 -112.05 gain 109 143 -110.11 gain 143 109 -108.44 gain 109 144 -115.99 gain 144 109 -115.34 gain 109 145 -121.58 gain 145 109 -119.37 gain 109 146 -119.84 gain 146 109 -116.54 gain 109 147 -122.84 gain 147 109 -116.63 gain 109 148 -127.27 gain 148 109 -120.79 gain 109 149 -125.97 gain 149 109 -122.65 gain 109 150 -114.53 gain 150 109 -113.89 gain 109 151 -109.27 gain 151 109 -108.83 gain 109 152 -107.57 gain 152 109 -104.11 gain 109 153 -107.42 gain 153 109 -101.53 gain 109 154 -104.53 gain 154 109 -107.19 gain 109 155 -115.35 gain 155 109 -117.92 gain 109 156 -112.31 gain 156 109 -109.25 gain 109 157 -108.95 gain 157 109 -108.85 gain 109 158 -109.65 gain 158 109 -112.14 gain 109 159 -120.57 gain 159 109 -119.68 gain 109 160 -110.85 gain 160 109 -107.07 gain 109 161 -116.46 gain 161 109 -116.17 gain 109 162 -128.52 gain 162 109 -127.09 gain 109 163 -124.66 gain 163 109 -125.38 gain 109 164 -125.57 gain 164 109 -127.33 gain 109 165 -118.43 gain 165 109 -116.24 gain 109 166 -115.34 gain 166 109 -114.71 gain 109 167 -108.12 gain 167 109 -109.59 gain 109 168 -108.83 gain 168 109 -108.74 gain 109 169 -108.44 gain 169 109 -112.55 gain 109 170 -109.71 gain 170 109 -105.35 gain 109 171 -120.10 gain 171 109 -120.76 gain 109 172 -108.89 gain 172 109 -104.25 gain 109 173 -116.30 gain 173 109 -111.09 gain 109 174 -116.59 gain 174 109 -115.68 gain 109 175 -127.52 gain 175 109 -130.17 gain 109 176 -125.29 gain 176 109 -119.95 gain 109 177 -117.97 gain 177 109 -120.44 gain 109 178 -123.50 gain 178 109 -121.79 gain 109 179 -122.54 gain 179 109 -119.23 gain 109 180 -122.09 gain 180 109 -120.24 gain 109 181 -122.83 gain 181 109 -121.05 gain 109 182 -118.72 gain 182 109 -119.33 gain 109 183 -117.39 gain 183 109 -111.38 gain 109 184 -121.18 gain 184 109 -119.96 gain 109 185 -115.34 gain 185 109 -111.61 gain 109 186 -120.80 gain 186 109 -117.35 gain 109 187 -124.59 gain 187 109 -123.68 gain 109 188 -119.96 gain 188 109 -122.31 gain 109 189 -117.64 gain 189 109 -117.51 gain 109 190 -115.45 gain 190 109 -112.32 gain 109 191 -128.11 gain 191 109 -126.07 gain 109 192 -128.50 gain 192 109 -129.34 gain 109 193 -123.12 gain 193 109 -125.20 gain 109 194 -126.74 gain 194 109 -122.64 gain 109 195 -114.46 gain 195 109 -110.99 gain 109 196 -117.60 gain 196 109 -118.17 gain 109 197 -125.75 gain 197 109 -122.38 gain 109 198 -124.17 gain 198 109 -120.32 gain 109 199 -118.21 gain 199 109 -118.28 gain 109 200 -118.34 gain 200 109 -115.34 gain 109 201 -126.05 gain 201 109 -123.86 gain 109 202 -115.91 gain 202 109 -117.72 gain 109 203 -114.40 gain 203 109 -115.84 gain 109 204 -120.96 gain 204 109 -119.68 gain 109 205 -124.93 gain 205 109 -122.72 gain 109 206 -116.68 gain 206 109 -118.99 gain 109 207 -129.72 gain 207 109 -124.40 gain 109 208 -120.73 gain 208 109 -121.18 gain 109 209 -123.44 gain 209 109 -124.88 gain 109 210 -120.74 gain 210 109 -119.12 gain 109 211 -112.95 gain 211 109 -113.36 gain 109 212 -122.84 gain 212 109 -121.78 gain 109 213 -113.30 gain 213 109 -111.43 gain 109 214 -117.57 gain 214 109 -115.60 gain 109 215 -127.13 gain 215 109 -121.57 gain 109 216 -124.89 gain 216 109 -123.99 gain 109 217 -120.35 gain 217 109 -119.97 gain 109 218 -123.01 gain 218 109 -124.82 gain 109 219 -128.28 gain 219 109 -121.45 gain 109 220 -120.64 gain 220 109 -124.30 gain 109 221 -125.26 gain 221 109 -124.56 gain 109 222 -118.70 gain 222 109 -118.33 gain 109 223 -121.36 gain 223 109 -119.61 gain 109 224 -130.53 gain 224 109 -131.46 gain 110 111 -87.68 gain 111 110 -87.36 gain 110 112 -112.16 gain 112 110 -110.72 gain 110 113 -111.38 gain 113 110 -108.74 gain 110 114 -113.46 gain 114 110 -114.13 gain 110 115 -116.01 gain 115 110 -110.99 gain 110 116 -120.16 gain 116 110 -122.68 gain 110 117 -119.60 gain 117 110 -123.61 gain 110 118 -120.89 gain 118 110 -123.22 gain 110 119 -127.42 gain 119 110 -124.42 gain 110 120 -123.66 gain 120 110 -125.17 gain 110 121 -106.25 gain 121 110 -107.05 gain 110 122 -110.30 gain 122 110 -113.21 gain 110 123 -105.21 gain 123 110 -108.90 gain 110 124 -100.87 gain 124 110 -100.97 gain 110 125 -94.00 gain 125 110 -95.43 gain 110 126 -95.43 gain 126 110 -94.82 gain 110 127 -97.47 gain 127 110 -100.33 gain 110 128 -105.79 gain 128 110 -106.58 gain 110 129 -112.40 gain 129 110 -111.10 gain 110 130 -117.44 gain 130 110 -113.96 gain 110 131 -111.52 gain 131 110 -115.13 gain 110 132 -117.74 gain 132 110 -120.97 gain 110 133 -121.13 gain 133 110 -122.43 gain 110 134 -128.65 gain 134 110 -126.65 gain 110 135 -117.55 gain 135 110 -119.13 gain 110 136 -112.06 gain 136 110 -114.25 gain 110 137 -112.19 gain 137 110 -111.86 gain 110 138 -104.84 gain 138 110 -103.51 gain 110 139 -101.68 gain 139 110 -101.34 gain 110 140 -99.60 gain 140 110 -101.87 gain 110 141 -101.81 gain 141 110 -102.75 gain 110 142 -108.25 gain 142 110 -108.49 gain 110 143 -118.03 gain 143 110 -117.89 gain 110 144 -111.71 gain 144 110 -112.59 gain 110 145 -115.42 gain 145 110 -114.74 gain 110 146 -113.80 gain 146 110 -112.04 gain 110 147 -123.98 gain 147 110 -119.31 gain 110 148 -114.00 gain 148 110 -109.04 gain 110 149 -117.28 gain 149 110 -115.49 gain 110 150 -112.31 gain 150 110 -113.20 gain 110 151 -114.37 gain 151 110 -115.46 gain 110 152 -111.99 gain 152 110 -110.05 gain 110 153 -114.11 gain 153 110 -109.76 gain 110 154 -110.55 gain 154 110 -114.75 gain 110 155 -110.90 gain 155 110 -115.00 gain 110 156 -107.60 gain 156 110 -106.08 gain 110 157 -116.95 gain 157 110 -118.38 gain 110 158 -112.35 gain 158 110 -116.37 gain 110 159 -119.56 gain 159 110 -120.19 gain 110 160 -121.87 gain 160 110 -119.62 gain 110 161 -114.84 gain 161 110 -116.08 gain 110 162 -115.93 gain 162 110 -116.04 gain 110 163 -124.88 gain 163 110 -127.14 gain 110 164 -119.86 gain 164 110 -123.15 gain 110 165 -115.36 gain 165 110 -114.69 gain 110 166 -118.29 gain 166 110 -119.20 gain 110 167 -113.53 gain 167 110 -116.53 gain 110 168 -113.92 gain 168 110 -115.37 gain 110 169 -114.09 gain 169 110 -119.73 gain 110 170 -108.75 gain 170 110 -105.92 gain 110 171 -116.14 gain 171 110 -118.33 gain 110 172 -110.06 gain 172 110 -106.95 gain 110 173 -110.14 gain 173 110 -106.47 gain 110 174 -111.90 gain 174 110 -112.52 gain 110 175 -114.50 gain 175 110 -118.68 gain 110 176 -115.52 gain 176 110 -111.71 gain 110 177 -119.45 gain 177 110 -123.45 gain 110 178 -118.19 gain 178 110 -118.02 gain 110 179 -127.14 gain 179 110 -125.36 gain 110 180 -116.42 gain 180 110 -116.10 gain 110 181 -118.64 gain 181 110 -118.39 gain 110 182 -114.65 gain 182 110 -116.79 gain 110 183 -116.58 gain 183 110 -112.11 gain 110 184 -108.96 gain 184 110 -109.27 gain 110 185 -114.32 gain 185 110 -112.12 gain 110 186 -109.67 gain 186 110 -107.75 gain 110 187 -114.28 gain 187 110 -114.90 gain 110 188 -115.93 gain 188 110 -119.81 gain 110 189 -114.75 gain 189 110 -116.14 gain 110 190 -114.19 gain 190 110 -112.59 gain 110 191 -116.33 gain 191 110 -115.83 gain 110 192 -119.01 gain 192 110 -121.38 gain 110 193 -125.55 gain 193 110 -129.17 gain 110 194 -125.71 gain 194 110 -123.14 gain 110 195 -126.83 gain 195 110 -124.89 gain 110 196 -113.91 gain 196 110 -116.01 gain 110 197 -118.53 gain 197 110 -116.69 gain 110 198 -116.19 gain 198 110 -113.88 gain 110 199 -113.61 gain 199 110 -115.21 gain 110 200 -113.20 gain 200 110 -111.73 gain 110 201 -112.71 gain 201 110 -112.05 gain 110 202 -117.71 gain 202 110 -121.06 gain 110 203 -122.23 gain 203 110 -125.19 gain 110 204 -126.82 gain 204 110 -127.07 gain 110 205 -123.74 gain 205 110 -123.07 gain 110 206 -122.21 gain 206 110 -126.05 gain 110 207 -126.08 gain 207 110 -122.28 gain 110 208 -124.43 gain 208 110 -126.41 gain 110 209 -133.30 gain 209 110 -136.27 gain 110 210 -126.12 gain 210 110 -126.03 gain 110 211 -115.62 gain 211 110 -117.55 gain 110 212 -125.98 gain 212 110 -126.46 gain 110 213 -114.28 gain 213 110 -113.95 gain 110 214 -117.49 gain 214 110 -117.04 gain 110 215 -123.36 gain 215 110 -119.33 gain 110 216 -124.31 gain 216 110 -124.94 gain 110 217 -120.42 gain 217 110 -121.57 gain 110 218 -127.76 gain 218 110 -131.10 gain 110 219 -125.89 gain 219 110 -120.59 gain 110 220 -121.41 gain 220 110 -126.59 gain 110 221 -121.37 gain 221 110 -122.20 gain 110 222 -118.91 gain 222 110 -120.07 gain 110 223 -128.21 gain 223 110 -127.98 gain 110 224 -126.30 gain 224 110 -128.76 gain 111 112 -94.54 gain 112 111 -93.42 gain 111 113 -100.30 gain 113 111 -97.98 gain 111 114 -108.07 gain 114 111 -109.06 gain 111 115 -105.72 gain 115 111 -101.01 gain 111 116 -114.85 gain 116 111 -117.69 gain 111 117 -123.60 gain 117 111 -127.93 gain 111 118 -117.01 gain 118 111 -119.67 gain 111 119 -121.02 gain 119 111 -118.33 gain 111 120 -113.43 gain 120 111 -115.26 gain 111 121 -120.84 gain 121 111 -121.96 gain 111 122 -108.41 gain 122 111 -111.64 gain 111 123 -102.92 gain 123 111 -106.93 gain 111 124 -91.55 gain 124 111 -91.98 gain 111 125 -96.50 gain 125 111 -98.26 gain 111 126 -85.73 gain 126 111 -85.44 gain 111 127 -102.15 gain 127 111 -105.32 gain 111 128 -101.96 gain 128 111 -103.07 gain 111 129 -110.29 gain 129 111 -109.31 gain 111 130 -114.33 gain 130 111 -111.17 gain 111 131 -113.40 gain 131 111 -117.33 gain 111 132 -117.27 gain 132 111 -120.83 gain 111 133 -122.25 gain 133 111 -123.88 gain 111 134 -121.15 gain 134 111 -119.48 gain 111 135 -116.01 gain 135 111 -117.91 gain 111 136 -116.73 gain 136 111 -119.24 gain 111 137 -116.63 gain 137 111 -116.62 gain 111 138 -111.91 gain 138 111 -110.90 gain 111 139 -106.72 gain 139 111 -106.70 gain 111 140 -104.28 gain 140 111 -106.87 gain 111 141 -102.11 gain 141 111 -103.37 gain 111 142 -110.82 gain 142 111 -111.38 gain 111 143 -102.73 gain 143 111 -102.91 gain 111 144 -110.17 gain 144 111 -111.37 gain 111 145 -103.09 gain 145 111 -102.74 gain 111 146 -119.84 gain 146 111 -118.40 gain 111 147 -117.90 gain 147 111 -113.55 gain 111 148 -117.82 gain 148 111 -113.18 gain 111 149 -120.09 gain 149 111 -118.62 gain 111 150 -115.95 gain 150 111 -117.17 gain 111 151 -118.23 gain 151 111 -119.64 gain 111 152 -118.82 gain 152 111 -117.21 gain 111 153 -105.25 gain 153 111 -101.22 gain 111 154 -106.89 gain 154 111 -111.41 gain 111 155 -110.41 gain 155 111 -114.83 gain 111 156 -105.46 gain 156 111 -104.27 gain 111 157 -110.90 gain 157 111 -112.65 gain 111 158 -105.34 gain 158 111 -109.68 gain 111 159 -113.24 gain 159 111 -114.20 gain 111 160 -116.31 gain 160 111 -114.38 gain 111 161 -115.85 gain 161 111 -117.42 gain 111 162 -120.16 gain 162 111 -120.59 gain 111 163 -120.68 gain 163 111 -123.25 gain 111 164 -114.15 gain 164 111 -117.76 gain 111 165 -128.51 gain 165 111 -128.16 gain 111 166 -114.31 gain 166 111 -115.53 gain 111 167 -118.77 gain 167 111 -122.09 gain 111 168 -119.16 gain 168 111 -120.92 gain 111 169 -105.81 gain 169 111 -111.78 gain 111 170 -112.51 gain 170 111 -110.00 gain 111 171 -115.15 gain 171 111 -117.66 gain 111 172 -112.09 gain 172 111 -109.30 gain 111 173 -113.16 gain 173 111 -109.80 gain 111 174 -118.04 gain 174 111 -118.98 gain 111 175 -114.32 gain 175 111 -118.82 gain 111 176 -115.62 gain 176 111 -112.13 gain 111 177 -120.84 gain 177 111 -125.16 gain 111 178 -125.01 gain 178 111 -125.15 gain 111 179 -126.78 gain 179 111 -125.32 gain 111 180 -116.75 gain 180 111 -116.75 gain 111 181 -120.40 gain 181 111 -120.47 gain 111 182 -116.99 gain 182 111 -119.44 gain 111 183 -115.45 gain 183 111 -111.30 gain 111 184 -117.56 gain 184 111 -118.20 gain 111 185 -115.59 gain 185 111 -113.71 gain 111 186 -114.03 gain 186 111 -112.43 gain 111 187 -115.36 gain 187 111 -116.30 gain 111 188 -120.94 gain 188 111 -125.14 gain 111 189 -116.76 gain 189 111 -118.48 gain 111 190 -111.13 gain 190 111 -109.86 gain 111 191 -118.73 gain 191 111 -118.54 gain 111 192 -116.55 gain 192 111 -119.24 gain 111 193 -124.19 gain 193 111 -128.13 gain 111 194 -129.73 gain 194 111 -127.48 gain 111 195 -126.38 gain 195 111 -124.76 gain 111 196 -115.43 gain 196 111 -117.85 gain 111 197 -122.17 gain 197 111 -120.66 gain 111 198 -118.36 gain 198 111 -116.36 gain 111 199 -111.43 gain 199 111 -113.35 gain 111 200 -118.58 gain 200 111 -117.44 gain 111 201 -117.12 gain 201 111 -116.79 gain 111 202 -116.97 gain 202 111 -120.64 gain 111 203 -114.77 gain 203 111 -118.06 gain 111 204 -114.98 gain 204 111 -115.55 gain 111 205 -114.67 gain 205 111 -114.31 gain 111 206 -118.77 gain 206 111 -122.93 gain 111 207 -118.43 gain 207 111 -114.96 gain 111 208 -126.63 gain 208 111 -128.93 gain 111 209 -119.32 gain 209 111 -122.61 gain 111 210 -124.51 gain 210 111 -124.74 gain 111 211 -124.12 gain 211 111 -126.37 gain 111 212 -113.64 gain 212 111 -114.44 gain 111 213 -117.97 gain 213 111 -117.96 gain 111 214 -116.73 gain 214 111 -116.61 gain 111 215 -119.64 gain 215 111 -115.93 gain 111 216 -112.02 gain 216 111 -112.97 gain 111 217 -119.57 gain 217 111 -121.04 gain 111 218 -118.33 gain 218 111 -121.99 gain 111 219 -115.73 gain 219 111 -110.75 gain 111 220 -124.40 gain 220 111 -129.91 gain 111 221 -118.05 gain 221 111 -119.20 gain 111 222 -123.73 gain 222 111 -125.21 gain 111 223 -122.08 gain 223 111 -122.17 gain 111 224 -125.60 gain 224 111 -128.38 gain 112 113 -92.03 gain 113 112 -90.83 gain 112 114 -99.87 gain 114 112 -101.98 gain 112 115 -104.91 gain 115 112 -101.32 gain 112 116 -107.14 gain 116 112 -111.09 gain 112 117 -114.48 gain 117 112 -119.93 gain 112 118 -118.89 gain 118 112 -122.66 gain 112 119 -115.33 gain 119 112 -113.77 gain 112 120 -119.08 gain 120 112 -122.03 gain 112 121 -114.09 gain 121 112 -116.33 gain 112 122 -107.32 gain 122 112 -111.68 gain 112 123 -104.10 gain 123 112 -109.24 gain 112 124 -97.01 gain 124 112 -98.55 gain 112 125 -103.42 gain 125 112 -106.30 gain 112 126 -92.34 gain 126 112 -93.17 gain 112 127 -85.05 gain 127 112 -89.34 gain 112 128 -99.63 gain 128 112 -101.86 gain 112 129 -107.21 gain 129 112 -107.35 gain 112 130 -108.72 gain 130 112 -106.68 gain 112 131 -101.00 gain 131 112 -106.06 gain 112 132 -116.09 gain 132 112 -120.77 gain 112 133 -119.29 gain 133 112 -122.04 gain 112 134 -121.05 gain 134 112 -120.50 gain 112 135 -123.91 gain 135 112 -126.93 gain 112 136 -114.90 gain 136 112 -118.53 gain 112 137 -110.66 gain 137 112 -111.77 gain 112 138 -103.10 gain 138 112 -103.21 gain 112 139 -109.30 gain 139 112 -110.39 gain 112 140 -104.22 gain 140 112 -107.92 gain 112 141 -105.18 gain 141 112 -107.56 gain 112 142 -98.53 gain 142 112 -100.21 gain 112 143 -105.82 gain 143 112 -107.12 gain 112 144 -105.30 gain 144 112 -107.62 gain 112 145 -110.78 gain 145 112 -111.55 gain 112 146 -117.90 gain 146 112 -117.57 gain 112 147 -111.01 gain 147 112 -107.78 gain 112 148 -118.39 gain 148 112 -114.87 gain 112 149 -113.19 gain 149 112 -112.84 gain 112 150 -118.14 gain 150 112 -120.48 gain 112 151 -112.70 gain 151 112 -115.24 gain 112 152 -118.58 gain 152 112 -118.09 gain 112 153 -112.40 gain 153 112 -109.48 gain 112 154 -117.94 gain 154 112 -123.58 gain 112 155 -109.16 gain 155 112 -114.69 gain 112 156 -111.04 gain 156 112 -110.96 gain 112 157 -108.38 gain 157 112 -111.25 gain 112 158 -108.30 gain 158 112 -113.76 gain 112 159 -108.22 gain 159 112 -110.30 gain 112 160 -111.61 gain 160 112 -110.80 gain 112 161 -113.09 gain 161 112 -115.77 gain 112 162 -117.91 gain 162 112 -119.45 gain 112 163 -114.96 gain 163 112 -118.65 gain 112 164 -120.86 gain 164 112 -125.60 gain 112 165 -115.69 gain 165 112 -116.46 gain 112 166 -122.57 gain 166 112 -124.91 gain 112 167 -119.58 gain 167 112 -124.02 gain 112 168 -120.70 gain 168 112 -123.58 gain 112 169 -111.54 gain 169 112 -118.62 gain 112 170 -108.86 gain 170 112 -107.47 gain 112 171 -111.63 gain 171 112 -115.26 gain 112 172 -113.26 gain 172 112 -111.59 gain 112 173 -108.12 gain 173 112 -105.88 gain 112 174 -117.57 gain 174 112 -119.63 gain 112 175 -114.24 gain 175 112 -119.86 gain 112 176 -115.54 gain 176 112 -113.17 gain 112 177 -114.74 gain 177 112 -120.18 gain 112 178 -115.03 gain 178 112 -116.30 gain 112 179 -119.24 gain 179 112 -118.90 gain 112 180 -124.21 gain 180 112 -125.34 gain 112 181 -117.92 gain 181 112 -119.12 gain 112 182 -118.82 gain 182 112 -122.40 gain 112 183 -111.18 gain 183 112 -108.15 gain 112 184 -107.93 gain 184 112 -109.69 gain 112 185 -115.38 gain 185 112 -114.62 gain 112 186 -118.46 gain 186 112 -117.98 gain 112 187 -118.95 gain 187 112 -121.01 gain 112 188 -116.96 gain 188 112 -122.28 gain 112 189 -119.63 gain 189 112 -122.47 gain 112 190 -124.06 gain 190 112 -123.91 gain 112 191 -114.42 gain 191 112 -115.36 gain 112 192 -114.85 gain 192 112 -118.65 gain 112 193 -123.99 gain 193 112 -129.04 gain 112 194 -123.39 gain 194 112 -122.26 gain 112 195 -124.25 gain 195 112 -123.75 gain 112 196 -121.84 gain 196 112 -125.38 gain 112 197 -110.40 gain 197 112 -110.00 gain 112 198 -119.00 gain 198 112 -118.12 gain 112 199 -113.33 gain 199 112 -116.37 gain 112 200 -115.72 gain 200 112 -115.69 gain 112 201 -105.46 gain 201 112 -106.24 gain 112 202 -113.09 gain 202 112 -117.88 gain 112 203 -115.70 gain 203 112 -120.11 gain 112 204 -110.82 gain 204 112 -112.51 gain 112 205 -118.81 gain 205 112 -119.57 gain 112 206 -118.96 gain 206 112 -124.25 gain 112 207 -119.78 gain 207 112 -117.43 gain 112 208 -124.85 gain 208 112 -128.27 gain 112 209 -121.97 gain 209 112 -126.39 gain 112 210 -125.54 gain 210 112 -126.89 gain 112 211 -110.17 gain 211 112 -113.55 gain 112 212 -120.91 gain 212 112 -122.83 gain 112 213 -119.50 gain 213 112 -120.61 gain 112 214 -122.56 gain 214 112 -123.55 gain 112 215 -117.70 gain 215 112 -115.11 gain 112 216 -120.93 gain 216 112 -123.01 gain 112 217 -120.78 gain 217 112 -123.37 gain 112 218 -115.46 gain 218 112 -120.24 gain 112 219 -113.90 gain 219 112 -110.03 gain 112 220 -121.18 gain 220 112 -127.81 gain 112 221 -120.28 gain 221 112 -122.56 gain 112 222 -113.25 gain 222 112 -115.85 gain 112 223 -114.36 gain 223 112 -115.57 gain 112 224 -114.88 gain 224 112 -118.77 gain 113 114 -89.68 gain 114 113 -92.99 gain 113 115 -107.06 gain 115 113 -104.66 gain 113 116 -107.88 gain 116 113 -113.03 gain 113 117 -108.08 gain 117 113 -114.73 gain 113 118 -111.20 gain 118 113 -116.17 gain 113 119 -118.76 gain 119 113 -118.39 gain 113 120 -118.56 gain 120 113 -122.71 gain 113 121 -115.36 gain 121 113 -118.80 gain 113 122 -118.33 gain 122 113 -123.88 gain 113 123 -111.43 gain 123 113 -117.76 gain 113 124 -110.22 gain 124 113 -112.95 gain 113 125 -108.99 gain 125 113 -113.06 gain 113 126 -104.21 gain 126 113 -106.23 gain 113 127 -94.88 gain 127 113 -100.37 gain 113 128 -88.44 gain 128 113 -91.87 gain 113 129 -92.62 gain 129 113 -93.95 gain 113 130 -99.80 gain 130 113 -98.96 gain 113 131 -109.23 gain 131 113 -115.47 gain 113 132 -105.67 gain 132 113 -111.55 gain 113 133 -109.93 gain 133 113 -113.88 gain 113 134 -110.69 gain 134 113 -111.33 gain 113 135 -122.88 gain 135 113 -127.10 gain 113 136 -115.55 gain 136 113 -120.38 gain 113 137 -113.08 gain 137 113 -115.39 gain 113 138 -109.92 gain 138 113 -111.23 gain 113 139 -107.83 gain 139 113 -110.12 gain 113 140 -103.10 gain 140 113 -108.00 gain 113 141 -102.22 gain 141 113 -105.79 gain 113 142 -94.66 gain 142 113 -97.54 gain 113 143 -99.84 gain 143 113 -102.34 gain 113 144 -108.13 gain 144 113 -111.65 gain 113 145 -103.06 gain 145 113 -105.02 gain 113 146 -107.77 gain 146 113 -108.65 gain 113 147 -117.54 gain 147 113 -115.51 gain 113 148 -101.91 gain 148 113 -99.59 gain 113 149 -109.88 gain 149 113 -110.73 gain 113 150 -120.17 gain 150 113 -123.71 gain 113 151 -117.42 gain 151 113 -121.15 gain 113 152 -116.29 gain 152 113 -117.00 gain 113 153 -110.82 gain 153 113 -109.11 gain 113 154 -116.17 gain 154 113 -123.01 gain 113 155 -110.66 gain 155 113 -117.38 gain 113 156 -106.84 gain 156 113 -107.96 gain 113 157 -102.44 gain 157 113 -106.51 gain 113 158 -105.39 gain 158 113 -112.05 gain 113 159 -109.78 gain 159 113 -113.05 gain 113 160 -111.58 gain 160 113 -111.96 gain 113 161 -108.38 gain 161 113 -112.25 gain 113 162 -110.99 gain 162 113 -113.73 gain 113 163 -113.67 gain 163 113 -118.56 gain 113 164 -118.36 gain 164 113 -124.29 gain 113 165 -120.25 gain 165 113 -122.22 gain 113 166 -115.53 gain 166 113 -119.07 gain 113 167 -118.02 gain 167 113 -123.65 gain 113 168 -108.83 gain 168 113 -112.91 gain 113 169 -110.66 gain 169 113 -118.94 gain 113 170 -107.34 gain 170 113 -107.15 gain 113 171 -123.28 gain 171 113 -128.10 gain 113 172 -115.09 gain 172 113 -114.61 gain 113 173 -110.44 gain 173 113 -109.40 gain 113 174 -116.04 gain 174 113 -119.30 gain 113 175 -106.43 gain 175 113 -113.24 gain 113 176 -111.19 gain 176 113 -110.02 gain 113 177 -118.12 gain 177 113 -124.76 gain 113 178 -112.52 gain 178 113 -114.98 gain 113 179 -122.14 gain 179 113 -122.99 gain 113 180 -117.82 gain 180 113 -120.14 gain 113 181 -125.34 gain 181 113 -127.73 gain 113 182 -121.76 gain 182 113 -126.54 gain 113 183 -119.95 gain 183 113 -118.11 gain 113 184 -113.75 gain 184 113 -116.70 gain 113 185 -115.04 gain 185 113 -115.47 gain 113 186 -106.38 gain 186 113 -107.10 gain 113 187 -112.07 gain 187 113 -115.33 gain 113 188 -115.28 gain 188 113 -121.80 gain 113 189 -112.49 gain 189 113 -116.52 gain 113 190 -113.76 gain 190 113 -114.80 gain 113 191 -107.96 gain 191 113 -110.10 gain 113 192 -114.90 gain 192 113 -119.90 gain 113 193 -112.23 gain 193 113 -118.48 gain 113 194 -123.30 gain 194 113 -123.36 gain 113 195 -113.84 gain 195 113 -114.53 gain 113 196 -119.19 gain 196 113 -123.93 gain 113 197 -118.44 gain 197 113 -119.23 gain 113 198 -120.45 gain 198 113 -120.77 gain 113 199 -106.66 gain 199 113 -110.89 gain 113 200 -117.55 gain 200 113 -118.72 gain 113 201 -117.82 gain 201 113 -119.80 gain 113 202 -113.76 gain 202 113 -119.74 gain 113 203 -113.68 gain 203 113 -119.28 gain 113 204 -111.21 gain 204 113 -114.09 gain 113 205 -115.43 gain 205 113 -117.39 gain 113 206 -116.62 gain 206 113 -123.10 gain 113 207 -115.35 gain 207 113 -114.19 gain 113 208 -122.20 gain 208 113 -126.82 gain 113 209 -120.44 gain 209 113 -126.04 gain 113 210 -118.05 gain 210 113 -120.59 gain 113 211 -113.86 gain 211 113 -118.43 gain 113 212 -116.91 gain 212 113 -120.02 gain 113 213 -121.66 gain 213 113 -123.96 gain 113 214 -119.16 gain 214 113 -121.35 gain 113 215 -116.83 gain 215 113 -115.44 gain 113 216 -118.73 gain 216 113 -122.00 gain 113 217 -108.70 gain 217 113 -112.48 gain 113 218 -110.49 gain 218 113 -116.46 gain 113 219 -122.44 gain 219 113 -119.77 gain 113 220 -110.73 gain 220 113 -118.55 gain 113 221 -117.11 gain 221 113 -120.58 gain 113 222 -122.56 gain 222 113 -126.36 gain 113 223 -120.77 gain 223 113 -123.17 gain 113 224 -126.27 gain 224 113 -131.36 gain 114 115 -89.85 gain 115 114 -84.15 gain 114 116 -102.53 gain 116 114 -104.37 gain 114 117 -116.93 gain 117 114 -120.27 gain 114 118 -108.18 gain 118 114 -109.84 gain 114 119 -114.52 gain 119 114 -110.85 gain 114 120 -126.82 gain 120 114 -127.67 gain 114 121 -122.37 gain 121 114 -122.50 gain 114 122 -116.47 gain 122 114 -118.72 gain 114 123 -118.81 gain 123 114 -121.83 gain 114 124 -115.74 gain 124 114 -115.18 gain 114 125 -106.11 gain 125 114 -106.88 gain 114 126 -108.21 gain 126 114 -106.93 gain 114 127 -111.40 gain 127 114 -113.59 gain 114 128 -99.70 gain 128 114 -99.83 gain 114 129 -93.29 gain 129 114 -91.32 gain 114 130 -92.20 gain 130 114 -88.06 gain 114 131 -103.93 gain 131 114 -106.87 gain 114 132 -111.60 gain 132 114 -114.17 gain 114 133 -115.11 gain 133 114 -115.75 gain 114 134 -117.46 gain 134 114 -114.80 gain 114 135 -121.39 gain 135 114 -122.30 gain 114 136 -120.85 gain 136 114 -122.37 gain 114 137 -122.89 gain 137 114 -121.89 gain 114 138 -121.65 gain 138 114 -119.65 gain 114 139 -115.05 gain 139 114 -114.04 gain 114 140 -111.98 gain 140 114 -113.57 gain 114 141 -103.87 gain 141 114 -104.14 gain 114 142 -104.17 gain 142 114 -103.74 gain 114 143 -108.61 gain 143 114 -107.80 gain 114 144 -102.62 gain 144 114 -102.83 gain 114 145 -98.43 gain 145 114 -97.09 gain 114 146 -103.01 gain 146 114 -100.58 gain 114 147 -113.80 gain 147 114 -108.46 gain 114 148 -115.27 gain 148 114 -109.64 gain 114 149 -117.77 gain 149 114 -115.31 gain 114 150 -123.53 gain 150 114 -123.76 gain 114 151 -115.07 gain 151 114 -115.50 gain 114 152 -119.87 gain 152 114 -117.27 gain 114 153 -119.29 gain 153 114 -114.27 gain 114 154 -114.47 gain 154 114 -117.99 gain 114 155 -113.69 gain 155 114 -117.11 gain 114 156 -116.09 gain 156 114 -113.90 gain 114 157 -114.33 gain 157 114 -115.09 gain 114 158 -114.55 gain 158 114 -117.90 gain 114 159 -114.97 gain 159 114 -114.93 gain 114 160 -107.84 gain 160 114 -104.91 gain 114 161 -117.00 gain 161 114 -117.57 gain 114 162 -112.18 gain 162 114 -111.61 gain 114 163 -116.97 gain 163 114 -118.55 gain 114 164 -118.77 gain 164 114 -121.39 gain 114 165 -128.56 gain 165 114 -127.23 gain 114 166 -125.43 gain 166 114 -125.67 gain 114 167 -123.05 gain 167 114 -125.38 gain 114 168 -121.26 gain 168 114 -122.04 gain 114 169 -113.45 gain 169 114 -118.43 gain 114 170 -113.39 gain 170 114 -109.89 gain 114 171 -116.00 gain 171 114 -117.52 gain 114 172 -110.16 gain 172 114 -106.38 gain 114 173 -111.85 gain 173 114 -107.50 gain 114 174 -117.53 gain 174 114 -117.49 gain 114 175 -104.70 gain 175 114 -108.20 gain 114 176 -112.95 gain 176 114 -108.47 gain 114 177 -107.95 gain 177 114 -111.28 gain 114 178 -118.74 gain 178 114 -117.89 gain 114 179 -120.51 gain 179 114 -118.06 gain 114 180 -126.08 gain 180 114 -125.10 gain 114 181 -112.30 gain 181 114 -111.38 gain 114 182 -121.55 gain 182 114 -123.02 gain 114 183 -119.50 gain 183 114 -114.36 gain 114 184 -118.54 gain 184 114 -118.19 gain 114 185 -123.39 gain 185 114 -120.52 gain 114 186 -116.44 gain 186 114 -113.85 gain 114 187 -119.53 gain 187 114 -119.48 gain 114 188 -115.00 gain 188 114 -118.21 gain 114 189 -118.27 gain 189 114 -118.99 gain 114 190 -116.55 gain 190 114 -114.29 gain 114 191 -121.32 gain 191 114 -120.15 gain 114 192 -116.74 gain 192 114 -118.44 gain 114 193 -117.05 gain 193 114 -120.00 gain 114 194 -118.60 gain 194 114 -115.36 gain 114 195 -125.42 gain 195 114 -122.81 gain 114 196 -124.47 gain 196 114 -125.90 gain 114 197 -121.02 gain 197 114 -118.51 gain 114 198 -123.36 gain 198 114 -120.37 gain 114 199 -119.25 gain 199 114 -120.19 gain 114 200 -121.71 gain 200 114 -119.58 gain 114 201 -116.44 gain 201 114 -115.11 gain 114 202 -117.67 gain 202 114 -120.35 gain 114 203 -119.56 gain 203 114 -121.86 gain 114 204 -117.42 gain 204 114 -117.00 gain 114 205 -118.71 gain 205 114 -117.36 gain 114 206 -122.29 gain 206 114 -125.46 gain 114 207 -120.74 gain 207 114 -116.28 gain 114 208 -116.88 gain 208 114 -118.19 gain 114 209 -109.66 gain 209 114 -111.97 gain 114 210 -124.66 gain 210 114 -123.90 gain 114 211 -127.27 gain 211 114 -128.53 gain 114 212 -124.81 gain 212 114 -124.62 gain 114 213 -120.09 gain 213 114 -119.09 gain 114 214 -119.87 gain 214 114 -118.75 gain 114 215 -122.69 gain 215 114 -117.99 gain 114 216 -118.15 gain 216 114 -118.11 gain 114 217 -117.32 gain 217 114 -117.81 gain 114 218 -113.29 gain 218 114 -115.96 gain 114 219 -120.68 gain 219 114 -114.71 gain 114 220 -119.98 gain 220 114 -124.50 gain 114 221 -122.73 gain 221 114 -122.89 gain 114 222 -123.00 gain 222 114 -123.49 gain 114 223 -118.58 gain 223 114 -117.69 gain 114 224 -122.80 gain 224 114 -124.59 gain 115 116 -89.23 gain 116 115 -96.77 gain 115 117 -94.17 gain 117 115 -103.21 gain 115 118 -103.76 gain 118 115 -111.12 gain 115 119 -105.60 gain 119 115 -107.62 gain 115 120 -120.94 gain 120 115 -127.48 gain 115 121 -121.40 gain 121 115 -127.23 gain 115 122 -113.47 gain 122 115 -121.41 gain 115 123 -109.22 gain 123 115 -117.94 gain 115 124 -109.28 gain 124 115 -114.42 gain 115 125 -104.92 gain 125 115 -111.39 gain 115 126 -111.09 gain 126 115 -115.51 gain 115 127 -97.23 gain 127 115 -105.11 gain 115 128 -99.59 gain 128 115 -105.41 gain 115 129 -87.80 gain 129 115 -91.53 gain 115 130 -87.68 gain 130 115 -89.23 gain 115 131 -91.14 gain 131 115 -99.78 gain 115 132 -104.90 gain 132 115 -113.16 gain 115 133 -107.32 gain 133 115 -113.66 gain 115 134 -105.05 gain 134 115 -108.08 gain 115 135 -112.92 gain 135 115 -119.53 gain 115 136 -119.51 gain 136 115 -126.73 gain 115 137 -114.89 gain 137 115 -119.59 gain 115 138 -112.52 gain 138 115 -116.22 gain 115 139 -112.18 gain 139 115 -116.86 gain 115 140 -113.79 gain 140 115 -121.09 gain 115 141 -112.77 gain 141 115 -118.73 gain 115 142 -108.25 gain 142 115 -113.52 gain 115 143 -99.71 gain 143 115 -104.59 gain 115 144 -93.41 gain 144 115 -99.31 gain 115 145 -97.40 gain 145 115 -101.76 gain 115 146 -94.14 gain 146 115 -97.40 gain 115 147 -100.65 gain 147 115 -101.00 gain 115 148 -103.57 gain 148 115 -103.64 gain 115 149 -109.48 gain 149 115 -112.72 gain 115 150 -113.42 gain 150 115 -119.35 gain 115 151 -119.82 gain 151 115 -125.95 gain 115 152 -112.41 gain 152 115 -115.50 gain 115 153 -113.93 gain 153 115 -114.60 gain 115 154 -115.58 gain 154 115 -124.81 gain 115 155 -106.00 gain 155 115 -115.12 gain 115 156 -107.09 gain 156 115 -110.60 gain 115 157 -108.54 gain 157 115 -115.00 gain 115 158 -108.71 gain 158 115 -117.76 gain 115 159 -103.85 gain 159 115 -109.52 gain 115 160 -105.50 gain 160 115 -108.28 gain 115 161 -95.85 gain 161 115 -102.12 gain 115 162 -100.88 gain 162 115 -106.01 gain 115 163 -112.85 gain 163 115 -120.13 gain 115 164 -111.43 gain 164 115 -119.75 gain 115 165 -113.09 gain 165 115 -117.45 gain 115 166 -117.49 gain 166 115 -123.42 gain 115 167 -116.57 gain 167 115 -124.59 gain 115 168 -114.98 gain 168 115 -121.45 gain 115 169 -115.31 gain 169 115 -125.99 gain 115 170 -112.95 gain 170 115 -115.15 gain 115 171 -110.24 gain 171 115 -117.47 gain 115 172 -108.88 gain 172 115 -110.80 gain 115 173 -106.25 gain 173 115 -107.61 gain 115 174 -109.46 gain 174 115 -115.11 gain 115 175 -107.08 gain 175 115 -116.28 gain 115 176 -104.99 gain 176 115 -106.21 gain 115 177 -111.83 gain 177 115 -120.86 gain 115 178 -110.85 gain 178 115 -115.70 gain 115 179 -115.91 gain 179 115 -119.15 gain 115 180 -123.42 gain 180 115 -128.14 gain 115 181 -121.60 gain 181 115 -126.38 gain 115 182 -115.93 gain 182 115 -123.09 gain 115 183 -116.97 gain 183 115 -117.53 gain 115 184 -115.64 gain 184 115 -120.98 gain 115 185 -117.83 gain 185 115 -120.65 gain 115 186 -107.16 gain 186 115 -110.26 gain 115 187 -110.73 gain 187 115 -116.38 gain 115 188 -110.81 gain 188 115 -119.72 gain 115 189 -104.11 gain 189 115 -110.53 gain 115 190 -109.02 gain 190 115 -112.45 gain 115 191 -110.91 gain 191 115 -115.43 gain 115 192 -105.46 gain 192 115 -112.85 gain 115 193 -106.97 gain 193 115 -115.61 gain 115 194 -113.40 gain 194 115 -115.85 gain 115 195 -119.07 gain 195 115 -122.16 gain 115 196 -114.98 gain 196 115 -122.11 gain 115 197 -118.58 gain 197 115 -121.77 gain 115 198 -112.97 gain 198 115 -115.69 gain 115 199 -116.60 gain 199 115 -123.23 gain 115 200 -107.27 gain 200 115 -110.84 gain 115 201 -118.89 gain 201 115 -123.26 gain 115 202 -118.18 gain 202 115 -126.55 gain 115 203 -108.52 gain 203 115 -116.52 gain 115 204 -112.26 gain 204 115 -117.54 gain 115 205 -111.52 gain 205 115 -115.87 gain 115 206 -115.07 gain 206 115 -123.94 gain 115 207 -108.55 gain 207 115 -109.78 gain 115 208 -115.36 gain 208 115 -122.37 gain 115 209 -110.51 gain 209 115 -118.52 gain 115 210 -113.17 gain 210 115 -118.11 gain 115 211 -125.22 gain 211 115 -132.19 gain 115 212 -115.31 gain 212 115 -120.82 gain 115 213 -117.50 gain 213 115 -122.20 gain 115 214 -122.26 gain 214 115 -126.84 gain 115 215 -114.97 gain 215 115 -115.97 gain 115 216 -112.81 gain 216 115 -118.47 gain 115 217 -107.24 gain 217 115 -113.42 gain 115 218 -113.13 gain 218 115 -121.50 gain 115 219 -108.49 gain 219 115 -108.22 gain 115 220 -114.08 gain 220 115 -124.30 gain 115 221 -118.50 gain 221 115 -124.36 gain 115 222 -108.30 gain 222 115 -114.48 gain 115 223 -116.39 gain 223 115 -121.19 gain 115 224 -115.37 gain 224 115 -122.86 gain 116 117 -97.31 gain 117 116 -98.81 gain 116 118 -103.74 gain 118 116 -103.56 gain 116 119 -110.87 gain 119 116 -105.35 gain 116 120 -124.20 gain 120 116 -123.20 gain 116 121 -125.83 gain 121 116 -124.11 gain 116 122 -121.27 gain 122 116 -121.67 gain 116 123 -123.08 gain 123 116 -124.26 gain 116 124 -113.07 gain 124 116 -110.66 gain 116 125 -123.89 gain 125 116 -122.82 gain 116 126 -118.80 gain 126 116 -115.68 gain 116 127 -111.03 gain 127 116 -111.38 gain 116 128 -107.54 gain 128 116 -105.82 gain 116 129 -100.44 gain 129 116 -96.62 gain 116 130 -100.22 gain 130 116 -94.23 gain 116 131 -95.10 gain 131 116 -96.20 gain 116 132 -95.98 gain 132 116 -96.71 gain 116 133 -109.01 gain 133 116 -107.80 gain 116 134 -104.93 gain 134 116 -100.42 gain 116 135 -130.13 gain 135 116 -129.19 gain 116 136 -123.77 gain 136 116 -123.45 gain 116 137 -125.53 gain 137 116 -122.69 gain 116 138 -132.49 gain 138 116 -128.65 gain 116 139 -123.94 gain 139 116 -121.09 gain 116 140 -120.39 gain 140 116 -120.14 gain 116 141 -117.58 gain 141 116 -116.00 gain 116 142 -114.11 gain 142 116 -111.84 gain 116 143 -114.77 gain 143 116 -112.12 gain 116 144 -105.46 gain 144 116 -103.82 gain 116 145 -102.34 gain 145 116 -99.16 gain 116 146 -103.28 gain 146 116 -99.01 gain 116 147 -105.42 gain 147 116 -98.23 gain 116 148 -106.49 gain 148 116 -99.02 gain 116 149 -113.47 gain 149 116 -109.17 gain 116 150 -126.15 gain 150 116 -124.54 gain 116 151 -131.91 gain 151 116 -130.49 gain 116 152 -126.48 gain 152 116 -122.04 gain 116 153 -127.75 gain 153 116 -120.88 gain 116 154 -125.81 gain 154 116 -127.49 gain 116 155 -119.56 gain 155 116 -121.14 gain 116 156 -118.18 gain 156 116 -114.14 gain 116 157 -111.15 gain 157 116 -110.06 gain 116 158 -117.39 gain 158 116 -118.90 gain 116 159 -110.60 gain 159 116 -108.73 gain 116 160 -114.32 gain 160 116 -109.55 gain 116 161 -106.92 gain 161 116 -105.64 gain 116 162 -110.36 gain 162 116 -107.95 gain 116 163 -122.96 gain 163 116 -122.70 gain 116 164 -116.74 gain 164 116 -117.52 gain 116 165 -129.49 gain 165 116 -126.31 gain 116 166 -131.09 gain 166 116 -129.48 gain 116 167 -128.56 gain 167 116 -129.04 gain 116 168 -127.35 gain 168 116 -126.29 gain 116 169 -120.75 gain 169 116 -123.88 gain 116 170 -123.75 gain 170 116 -118.40 gain 116 171 -120.76 gain 171 116 -120.44 gain 116 172 -116.28 gain 172 116 -110.66 gain 116 173 -125.78 gain 173 116 -119.60 gain 116 174 -120.94 gain 174 116 -119.05 gain 116 175 -113.15 gain 175 116 -114.81 gain 116 176 -113.28 gain 176 116 -106.96 gain 116 177 -112.12 gain 177 116 -113.61 gain 116 178 -114.05 gain 178 116 -111.37 gain 116 179 -121.54 gain 179 116 -117.24 gain 116 180 -122.92 gain 180 116 -120.09 gain 116 181 -124.21 gain 181 116 -121.45 gain 116 182 -124.27 gain 182 116 -123.90 gain 116 183 -129.34 gain 183 116 -122.35 gain 116 184 -118.36 gain 184 116 -116.15 gain 116 185 -127.15 gain 185 116 -122.44 gain 116 186 -123.07 gain 186 116 -118.64 gain 116 187 -119.46 gain 187 116 -117.57 gain 116 188 -117.33 gain 188 116 -118.70 gain 116 189 -120.53 gain 189 116 -119.41 gain 116 190 -115.05 gain 190 116 -110.94 gain 116 191 -114.06 gain 191 116 -111.04 gain 116 192 -115.85 gain 192 116 -115.70 gain 116 193 -115.76 gain 193 116 -116.86 gain 116 194 -112.69 gain 194 116 -107.60 gain 116 195 -129.53 gain 195 116 -125.08 gain 116 196 -126.08 gain 196 116 -125.67 gain 116 197 -130.48 gain 197 116 -126.13 gain 116 198 -132.62 gain 198 116 -127.79 gain 116 199 -129.29 gain 199 116 -128.38 gain 116 200 -118.65 gain 200 116 -114.67 gain 116 201 -124.13 gain 201 116 -120.96 gain 116 202 -121.16 gain 202 116 -121.99 gain 116 203 -114.74 gain 203 116 -115.19 gain 116 204 -122.37 gain 204 116 -120.10 gain 116 205 -121.78 gain 205 116 -118.59 gain 116 206 -121.46 gain 206 116 -122.79 gain 116 207 -116.23 gain 207 116 -109.92 gain 116 208 -121.67 gain 208 116 -121.13 gain 116 209 -125.55 gain 209 116 -126.01 gain 116 210 -129.71 gain 210 116 -127.11 gain 116 211 -124.04 gain 211 116 -123.46 gain 116 212 -130.81 gain 212 116 -128.77 gain 116 213 -121.28 gain 213 116 -118.44 gain 116 214 -124.27 gain 214 116 -121.32 gain 116 215 -126.10 gain 215 116 -119.55 gain 116 216 -123.21 gain 216 116 -121.33 gain 116 217 -121.55 gain 217 116 -120.18 gain 116 218 -121.75 gain 218 116 -122.57 gain 116 219 -120.22 gain 219 116 -112.40 gain 116 220 -119.87 gain 220 116 -122.55 gain 116 221 -126.72 gain 221 116 -125.03 gain 116 222 -120.26 gain 222 116 -118.90 gain 116 223 -118.24 gain 223 116 -115.50 gain 116 224 -119.21 gain 224 116 -119.15 gain 117 118 -95.69 gain 118 117 -94.01 gain 117 119 -108.90 gain 119 117 -101.89 gain 117 120 -133.54 gain 120 117 -131.04 gain 117 121 -131.15 gain 121 117 -127.94 gain 117 122 -120.15 gain 122 117 -119.06 gain 117 123 -124.03 gain 123 117 -123.71 gain 117 124 -126.89 gain 124 117 -122.98 gain 117 125 -125.10 gain 125 117 -122.53 gain 117 126 -123.73 gain 126 117 -119.11 gain 117 127 -116.81 gain 127 117 -115.65 gain 117 128 -113.33 gain 128 117 -110.11 gain 117 129 -115.78 gain 129 117 -110.47 gain 117 130 -104.28 gain 130 117 -96.80 gain 117 131 -101.06 gain 131 117 -100.66 gain 117 132 -91.71 gain 132 117 -90.94 gain 117 133 -106.35 gain 133 117 -103.65 gain 117 134 -112.78 gain 134 117 -106.77 gain 117 135 -127.17 gain 135 117 -124.73 gain 117 136 -122.05 gain 136 117 -120.23 gain 117 137 -126.63 gain 137 117 -122.29 gain 117 138 -128.10 gain 138 117 -122.76 gain 117 139 -125.21 gain 139 117 -120.86 gain 117 140 -123.23 gain 140 117 -121.48 gain 117 141 -117.07 gain 141 117 -113.99 gain 117 142 -123.66 gain 142 117 -119.89 gain 117 143 -117.21 gain 143 117 -113.06 gain 117 144 -115.33 gain 144 117 -112.19 gain 117 145 -106.42 gain 145 117 -101.73 gain 117 146 -103.77 gain 146 117 -97.99 gain 117 147 -106.75 gain 147 117 -98.06 gain 117 148 -112.94 gain 148 117 -103.97 gain 117 149 -110.99 gain 149 117 -105.18 gain 117 150 -130.19 gain 150 117 -127.07 gain 117 151 -129.87 gain 151 117 -126.96 gain 117 152 -129.00 gain 152 117 -123.06 gain 117 153 -136.39 gain 153 117 -128.03 gain 117 154 -120.85 gain 154 117 -121.03 gain 117 155 -127.52 gain 155 117 -127.60 gain 117 156 -114.99 gain 156 117 -109.46 gain 117 157 -122.01 gain 157 117 -119.43 gain 117 158 -121.42 gain 158 117 -121.43 gain 117 159 -118.07 gain 159 117 -114.70 gain 117 160 -118.69 gain 160 117 -112.43 gain 117 161 -115.83 gain 161 117 -113.06 gain 117 162 -107.55 gain 162 117 -103.65 gain 117 163 -110.17 gain 163 117 -108.41 gain 117 164 -110.88 gain 164 117 -110.17 gain 117 165 -129.73 gain 165 117 -125.05 gain 117 166 -134.15 gain 166 117 -131.05 gain 117 167 -128.35 gain 167 117 -127.33 gain 117 168 -130.66 gain 168 117 -128.09 gain 117 169 -126.57 gain 169 117 -128.20 gain 117 170 -128.45 gain 170 117 -121.60 gain 117 171 -122.21 gain 171 117 -120.39 gain 117 172 -128.04 gain 172 117 -120.92 gain 117 173 -126.06 gain 173 117 -118.38 gain 117 174 -118.95 gain 174 117 -115.56 gain 117 175 -112.05 gain 175 117 -112.21 gain 117 176 -110.47 gain 176 117 -102.65 gain 117 177 -122.24 gain 177 117 -122.23 gain 117 178 -105.58 gain 178 117 -101.39 gain 117 179 -116.42 gain 179 117 -110.62 gain 117 180 -138.97 gain 180 117 -134.64 gain 117 181 -121.62 gain 181 117 -117.36 gain 117 182 -125.85 gain 182 117 -123.97 gain 117 183 -128.92 gain 183 117 -120.44 gain 117 184 -133.95 gain 184 117 -130.25 gain 117 185 -125.21 gain 185 117 -118.99 gain 117 186 -125.92 gain 186 117 -119.99 gain 117 187 -115.13 gain 187 117 -111.74 gain 117 188 -121.37 gain 188 117 -121.24 gain 117 189 -119.14 gain 189 117 -116.52 gain 117 190 -122.55 gain 190 117 -116.94 gain 117 191 -116.78 gain 191 117 -112.27 gain 117 192 -119.91 gain 192 117 -118.27 gain 117 193 -121.47 gain 193 117 -121.08 gain 117 194 -117.10 gain 194 117 -110.52 gain 117 195 -136.83 gain 195 117 -130.88 gain 117 196 -127.42 gain 196 117 -125.51 gain 117 197 -133.85 gain 197 117 -128.00 gain 117 198 -129.01 gain 198 117 -122.68 gain 117 199 -125.67 gain 199 117 -123.26 gain 117 200 -128.99 gain 200 117 -123.51 gain 117 201 -128.85 gain 201 117 -124.18 gain 117 202 -127.50 gain 202 117 -126.83 gain 117 203 -119.06 gain 203 117 -118.01 gain 117 204 -121.25 gain 204 117 -117.48 gain 117 205 -123.22 gain 205 117 -118.53 gain 117 206 -120.85 gain 206 117 -120.68 gain 117 207 -128.25 gain 207 117 -120.44 gain 117 208 -121.16 gain 208 117 -119.13 gain 117 209 -117.65 gain 209 117 -116.61 gain 117 210 -133.42 gain 210 117 -129.31 gain 117 211 -129.67 gain 211 117 -127.60 gain 117 212 -121.14 gain 212 117 -117.60 gain 117 213 -135.34 gain 213 117 -131.00 gain 117 214 -137.51 gain 214 117 -133.06 gain 117 215 -127.75 gain 215 117 -119.71 gain 117 216 -125.36 gain 216 117 -121.98 gain 117 217 -120.92 gain 217 117 -118.06 gain 117 218 -124.16 gain 218 117 -123.49 gain 117 219 -129.02 gain 219 117 -119.70 gain 117 220 -124.73 gain 220 117 -125.91 gain 117 221 -119.59 gain 221 117 -116.41 gain 117 222 -123.23 gain 222 117 -120.37 gain 117 223 -120.22 gain 223 117 -115.98 gain 117 224 -130.88 gain 224 117 -129.32 gain 118 119 -97.41 gain 119 118 -92.07 gain 118 120 -126.88 gain 120 118 -126.06 gain 118 121 -128.92 gain 121 118 -127.38 gain 118 122 -131.29 gain 122 118 -131.87 gain 118 123 -129.41 gain 123 118 -130.76 gain 118 124 -120.02 gain 124 118 -117.79 gain 118 125 -124.15 gain 125 118 -123.25 gain 118 126 -118.20 gain 126 118 -115.25 gain 118 127 -117.08 gain 127 118 -117.60 gain 118 128 -113.81 gain 128 118 -112.27 gain 118 129 -121.87 gain 129 118 -118.23 gain 118 130 -110.64 gain 130 118 -104.84 gain 118 131 -105.95 gain 131 118 -107.22 gain 118 132 -99.94 gain 132 118 -100.84 gain 118 133 -97.21 gain 133 118 -96.18 gain 118 134 -99.00 gain 134 118 -94.67 gain 118 135 -125.32 gain 135 118 -124.56 gain 118 136 -128.82 gain 136 118 -128.67 gain 118 137 -131.44 gain 137 118 -128.78 gain 118 138 -118.87 gain 138 118 -115.21 gain 118 139 -125.30 gain 139 118 -122.62 gain 118 140 -124.15 gain 140 118 -124.08 gain 118 141 -116.17 gain 141 118 -114.77 gain 118 142 -120.17 gain 142 118 -118.08 gain 118 143 -120.91 gain 143 118 -118.44 gain 118 144 -118.04 gain 144 118 -116.58 gain 118 145 -112.98 gain 145 118 -109.97 gain 118 146 -115.17 gain 146 118 -111.07 gain 118 147 -104.65 gain 147 118 -97.64 gain 118 148 -99.08 gain 148 118 -91.79 gain 118 149 -98.37 gain 149 118 -94.24 gain 118 150 -124.40 gain 150 118 -122.96 gain 118 151 -127.09 gain 151 118 -125.85 gain 118 152 -125.41 gain 152 118 -121.14 gain 118 153 -124.18 gain 153 118 -117.50 gain 118 154 -124.38 gain 154 118 -126.24 gain 118 155 -123.10 gain 155 118 -124.86 gain 118 156 -131.51 gain 156 118 -127.66 gain 118 157 -117.61 gain 157 118 -116.70 gain 118 158 -117.24 gain 158 118 -118.93 gain 118 159 -121.78 gain 159 118 -120.08 gain 118 160 -112.60 gain 160 118 -108.01 gain 118 161 -109.94 gain 161 118 -108.85 gain 118 162 -115.85 gain 162 118 -113.62 gain 118 163 -108.19 gain 163 118 -108.11 gain 118 164 -113.81 gain 164 118 -114.77 gain 118 165 -119.61 gain 165 118 -116.61 gain 118 166 -130.23 gain 166 118 -128.80 gain 118 167 -132.30 gain 167 118 -132.96 gain 118 168 -127.41 gain 168 118 -126.52 gain 118 169 -125.01 gain 169 118 -128.32 gain 118 170 -120.88 gain 170 118 -115.71 gain 118 171 -119.00 gain 171 118 -118.86 gain 118 172 -116.29 gain 172 118 -110.85 gain 118 173 -113.70 gain 173 118 -107.69 gain 118 174 -120.65 gain 174 118 -118.94 gain 118 175 -115.04 gain 175 118 -116.88 gain 118 176 -118.76 gain 176 118 -112.61 gain 118 177 -105.86 gain 177 118 -107.52 gain 118 178 -108.51 gain 178 118 -106.00 gain 118 179 -109.00 gain 179 118 -104.88 gain 118 180 -129.10 gain 180 118 -126.45 gain 118 181 -128.23 gain 181 118 -125.64 gain 118 182 -122.75 gain 182 118 -122.56 gain 118 183 -128.45 gain 183 118 -121.64 gain 118 184 -127.03 gain 184 118 -125.01 gain 118 185 -127.07 gain 185 118 -122.54 gain 118 186 -117.82 gain 186 118 -113.57 gain 118 187 -121.17 gain 187 118 -119.45 gain 118 188 -123.23 gain 188 118 -124.77 gain 118 189 -116.00 gain 189 118 -115.06 gain 118 190 -119.37 gain 190 118 -115.44 gain 118 191 -115.60 gain 191 118 -112.77 gain 118 192 -119.70 gain 192 118 -119.73 gain 118 193 -119.96 gain 193 118 -121.24 gain 118 194 -120.26 gain 194 118 -115.35 gain 118 195 -131.57 gain 195 118 -127.30 gain 118 196 -129.87 gain 196 118 -129.64 gain 118 197 -132.78 gain 197 118 -128.61 gain 118 198 -130.90 gain 198 118 -126.25 gain 118 199 -125.64 gain 199 118 -124.90 gain 118 200 -125.83 gain 200 118 -122.03 gain 118 201 -123.98 gain 201 118 -120.99 gain 118 202 -124.34 gain 202 118 -125.35 gain 118 203 -126.11 gain 203 118 -126.74 gain 118 204 -123.81 gain 204 118 -121.73 gain 118 205 -125.88 gain 205 118 -122.87 gain 118 206 -118.01 gain 206 118 -119.51 gain 118 207 -122.08 gain 207 118 -115.95 gain 118 208 -126.85 gain 208 118 -126.50 gain 118 209 -115.26 gain 209 118 -115.90 gain 118 210 -133.32 gain 210 118 -130.90 gain 118 211 -128.48 gain 211 118 -128.08 gain 118 212 -124.73 gain 212 118 -122.87 gain 118 213 -125.15 gain 213 118 -122.48 gain 118 214 -120.35 gain 214 118 -117.57 gain 118 215 -128.24 gain 215 118 -121.88 gain 118 216 -125.29 gain 216 118 -123.58 gain 118 217 -127.26 gain 217 118 -126.08 gain 118 218 -126.10 gain 218 118 -127.10 gain 118 219 -125.63 gain 219 118 -117.99 gain 118 220 -130.07 gain 220 118 -132.92 gain 118 221 -123.97 gain 221 118 -122.47 gain 118 222 -114.80 gain 222 118 -113.62 gain 118 223 -113.97 gain 223 118 -111.41 gain 118 224 -123.21 gain 224 118 -123.33 gain 119 120 -125.14 gain 120 119 -129.65 gain 119 121 -118.59 gain 121 119 -122.40 gain 119 122 -128.74 gain 122 119 -134.66 gain 119 123 -119.25 gain 123 119 -125.95 gain 119 124 -123.02 gain 124 119 -126.13 gain 119 125 -122.86 gain 125 119 -127.30 gain 119 126 -118.60 gain 126 119 -121.00 gain 119 127 -118.84 gain 127 119 -124.70 gain 119 128 -115.79 gain 128 119 -119.59 gain 119 129 -116.30 gain 129 119 -118.01 gain 119 130 -106.09 gain 130 119 -105.62 gain 119 131 -109.01 gain 131 119 -115.63 gain 119 132 -106.55 gain 132 119 -112.79 gain 119 133 -86.59 gain 133 119 -90.90 gain 119 134 -85.93 gain 134 119 -86.94 gain 119 135 -124.96 gain 135 119 -129.55 gain 119 136 -119.35 gain 136 119 -124.54 gain 119 137 -130.61 gain 137 119 -133.29 gain 119 138 -118.83 gain 138 119 -120.51 gain 119 139 -124.72 gain 139 119 -127.38 gain 119 140 -121.76 gain 140 119 -127.03 gain 119 141 -116.35 gain 141 119 -120.29 gain 119 142 -117.09 gain 142 119 -120.34 gain 119 143 -114.03 gain 143 119 -116.90 gain 119 144 -121.64 gain 144 119 -125.52 gain 119 145 -114.07 gain 145 119 -116.40 gain 119 146 -100.65 gain 146 119 -101.89 gain 119 147 -98.16 gain 147 119 -96.49 gain 119 148 -104.97 gain 148 119 -103.02 gain 119 149 -99.25 gain 149 119 -100.46 gain 119 150 -121.10 gain 150 119 -125.00 gain 119 151 -120.08 gain 151 119 -124.18 gain 119 152 -127.21 gain 152 119 -128.28 gain 119 153 -121.43 gain 153 119 -120.08 gain 119 154 -123.61 gain 154 119 -130.81 gain 119 155 -121.75 gain 155 119 -128.85 gain 119 156 -114.92 gain 156 119 -116.40 gain 119 157 -123.20 gain 157 119 -127.64 gain 119 158 -115.38 gain 158 119 -122.40 gain 119 159 -110.42 gain 159 119 -114.07 gain 119 160 -109.09 gain 160 119 -109.84 gain 119 161 -106.93 gain 161 119 -111.18 gain 119 162 -109.60 gain 162 119 -112.71 gain 119 163 -101.57 gain 163 119 -106.82 gain 119 164 -106.24 gain 164 119 -112.54 gain 119 165 -131.93 gain 165 119 -134.27 gain 119 166 -130.45 gain 166 119 -134.36 gain 119 167 -123.86 gain 167 119 -129.86 gain 119 168 -125.65 gain 168 119 -130.10 gain 119 169 -123.96 gain 169 119 -132.61 gain 119 170 -114.24 gain 170 119 -114.41 gain 119 171 -116.39 gain 171 119 -121.59 gain 119 172 -119.19 gain 172 119 -119.09 gain 119 173 -119.84 gain 173 119 -119.17 gain 119 174 -115.86 gain 174 119 -119.49 gain 119 175 -109.96 gain 175 119 -117.14 gain 119 176 -112.14 gain 176 119 -111.33 gain 119 177 -108.57 gain 177 119 -115.57 gain 119 178 -108.00 gain 178 119 -110.83 gain 119 179 -103.23 gain 179 119 -104.45 gain 119 180 -129.89 gain 180 119 -132.58 gain 119 181 -129.72 gain 181 119 -132.48 gain 119 182 -122.98 gain 182 119 -128.13 gain 119 183 -115.23 gain 183 119 -113.76 gain 119 184 -117.61 gain 184 119 -120.93 gain 119 185 -125.55 gain 185 119 -126.35 gain 119 186 -121.87 gain 186 119 -122.96 gain 119 187 -108.58 gain 187 119 -112.21 gain 119 188 -112.75 gain 188 119 -119.64 gain 119 189 -117.06 gain 189 119 -121.46 gain 119 190 -109.91 gain 190 119 -111.32 gain 119 191 -114.51 gain 191 119 -117.01 gain 119 192 -111.39 gain 192 119 -116.76 gain 119 193 -112.72 gain 193 119 -119.34 gain 119 194 -111.26 gain 194 119 -111.69 gain 119 195 -123.83 gain 195 119 -124.89 gain 119 196 -123.41 gain 196 119 -128.52 gain 119 197 -126.35 gain 197 119 -127.51 gain 119 198 -124.96 gain 198 119 -125.65 gain 119 199 -119.76 gain 199 119 -124.36 gain 119 200 -123.06 gain 200 119 -124.60 gain 119 201 -109.88 gain 201 119 -112.22 gain 119 202 -117.58 gain 202 119 -123.93 gain 119 203 -124.19 gain 203 119 -130.16 gain 119 204 -117.09 gain 204 119 -120.34 gain 119 205 -118.76 gain 205 119 -121.09 gain 119 206 -112.32 gain 206 119 -119.16 gain 119 207 -116.62 gain 207 119 -115.83 gain 119 208 -115.41 gain 208 119 -120.40 gain 119 209 -114.23 gain 209 119 -120.21 gain 119 210 -126.36 gain 210 119 -129.28 gain 119 211 -133.41 gain 211 119 -138.35 gain 119 212 -123.49 gain 212 119 -126.97 gain 119 213 -127.42 gain 213 119 -130.10 gain 119 214 -120.28 gain 214 119 -122.84 gain 119 215 -123.68 gain 215 119 -122.65 gain 119 216 -119.30 gain 216 119 -122.94 gain 119 217 -120.93 gain 217 119 -125.08 gain 119 218 -123.27 gain 218 119 -129.61 gain 119 219 -123.04 gain 219 119 -120.74 gain 119 220 -112.64 gain 220 119 -120.83 gain 119 221 -110.76 gain 221 119 -114.60 gain 119 222 -118.13 gain 222 119 -122.29 gain 119 223 -116.70 gain 223 119 -119.47 gain 119 224 -112.58 gain 224 119 -118.05 gain 120 121 -102.38 gain 121 120 -101.67 gain 120 122 -106.98 gain 122 120 -108.38 gain 120 123 -102.43 gain 123 120 -104.61 gain 120 124 -107.87 gain 124 120 -106.46 gain 120 125 -114.93 gain 125 120 -114.85 gain 120 126 -124.27 gain 126 120 -122.15 gain 120 127 -118.22 gain 127 120 -119.57 gain 120 128 -119.24 gain 128 120 -118.53 gain 120 129 -125.21 gain 129 120 -122.40 gain 120 130 -114.52 gain 130 120 -109.53 gain 120 131 -125.20 gain 131 120 -127.30 gain 120 132 -130.86 gain 132 120 -132.58 gain 120 133 -128.93 gain 133 120 -128.73 gain 120 134 -126.14 gain 134 120 -122.64 gain 120 135 -95.53 gain 135 120 -95.59 gain 120 136 -94.67 gain 136 120 -95.34 gain 120 137 -101.01 gain 137 120 -99.17 gain 120 138 -112.19 gain 138 120 -109.35 gain 120 139 -116.57 gain 139 120 -114.71 gain 120 140 -119.38 gain 140 120 -120.14 gain 120 141 -122.92 gain 141 120 -122.35 gain 120 142 -116.06 gain 142 120 -114.79 gain 120 143 -119.09 gain 143 120 -117.44 gain 120 144 -126.98 gain 144 120 -126.35 gain 120 145 -129.84 gain 145 120 -127.66 gain 120 146 -123.02 gain 146 120 -119.74 gain 120 147 -129.46 gain 147 120 -123.27 gain 120 148 -130.70 gain 148 120 -124.24 gain 120 149 -129.33 gain 149 120 -126.03 gain 120 150 -106.70 gain 150 120 -106.09 gain 120 151 -110.27 gain 151 120 -109.85 gain 120 152 -102.15 gain 152 120 -98.71 gain 120 153 -106.89 gain 153 120 -101.03 gain 120 154 -113.49 gain 154 120 -116.17 gain 120 155 -112.86 gain 155 120 -115.44 gain 120 156 -120.28 gain 156 120 -117.25 gain 120 157 -119.79 gain 157 120 -119.71 gain 120 158 -127.71 gain 158 120 -130.22 gain 120 159 -118.36 gain 159 120 -117.49 gain 120 160 -127.29 gain 160 120 -123.53 gain 120 161 -129.80 gain 161 120 -129.53 gain 120 162 -129.76 gain 162 120 -128.36 gain 120 163 -122.33 gain 163 120 -123.07 gain 120 164 -124.40 gain 164 120 -126.19 gain 120 165 -110.81 gain 165 120 -108.63 gain 120 166 -110.86 gain 166 120 -110.25 gain 120 167 -111.43 gain 167 120 -112.91 gain 120 168 -116.35 gain 168 120 -116.28 gain 120 169 -115.37 gain 169 120 -119.50 gain 120 170 -116.19 gain 170 120 -111.85 gain 120 171 -120.13 gain 171 120 -120.82 gain 120 172 -129.36 gain 172 120 -124.74 gain 120 173 -123.76 gain 173 120 -118.57 gain 120 174 -128.80 gain 174 120 -127.91 gain 120 175 -122.69 gain 175 120 -125.36 gain 120 176 -131.32 gain 176 120 -126.00 gain 120 177 -130.80 gain 177 120 -133.28 gain 120 178 -126.44 gain 178 120 -124.75 gain 120 179 -130.32 gain 179 120 -127.03 gain 120 180 -113.94 gain 180 120 -112.11 gain 120 181 -113.74 gain 181 120 -111.98 gain 120 182 -113.75 gain 182 120 -114.38 gain 120 183 -111.65 gain 183 120 -105.67 gain 120 184 -108.93 gain 184 120 -107.73 gain 120 185 -124.21 gain 185 120 -120.49 gain 120 186 -118.08 gain 186 120 -114.64 gain 120 187 -123.22 gain 187 120 -122.33 gain 120 188 -119.06 gain 188 120 -121.43 gain 120 189 -120.52 gain 189 120 -120.40 gain 120 190 -126.17 gain 190 120 -123.07 gain 120 191 -125.61 gain 191 120 -123.59 gain 120 192 -130.58 gain 192 120 -131.43 gain 120 193 -131.19 gain 193 120 -133.30 gain 120 194 -122.46 gain 194 120 -118.37 gain 120 195 -117.52 gain 195 120 -114.07 gain 120 196 -117.46 gain 196 120 -118.05 gain 120 197 -117.76 gain 197 120 -114.41 gain 120 198 -114.82 gain 198 120 -110.99 gain 120 199 -119.38 gain 199 120 -119.46 gain 120 200 -122.59 gain 200 120 -119.62 gain 120 201 -116.28 gain 201 120 -114.11 gain 120 202 -118.55 gain 202 120 -120.38 gain 120 203 -123.82 gain 203 120 -125.27 gain 120 204 -123.46 gain 204 120 -122.20 gain 120 205 -123.35 gain 205 120 -121.16 gain 120 206 -128.17 gain 206 120 -130.50 gain 120 207 -128.77 gain 207 120 -123.46 gain 120 208 -127.99 gain 208 120 -128.46 gain 120 209 -136.36 gain 209 120 -137.82 gain 120 210 -121.51 gain 210 120 -119.91 gain 120 211 -116.09 gain 211 120 -116.51 gain 120 212 -119.12 gain 212 120 -118.08 gain 120 213 -114.84 gain 213 120 -112.99 gain 120 214 -116.50 gain 214 120 -114.54 gain 120 215 -117.89 gain 215 120 -112.35 gain 120 216 -121.30 gain 216 120 -120.42 gain 120 217 -126.91 gain 217 120 -126.54 gain 120 218 -131.85 gain 218 120 -133.68 gain 120 219 -131.38 gain 219 120 -124.56 gain 120 220 -122.44 gain 220 120 -126.11 gain 120 221 -130.01 gain 221 120 -129.33 gain 120 222 -141.62 gain 222 120 -141.26 gain 120 223 -129.48 gain 223 120 -127.74 gain 120 224 -123.83 gain 224 120 -124.78 gain 121 122 -92.30 gain 122 121 -94.41 gain 121 123 -99.38 gain 123 121 -102.27 gain 121 124 -110.67 gain 124 121 -109.98 gain 121 125 -112.05 gain 125 121 -112.69 gain 121 126 -117.53 gain 126 121 -116.12 gain 121 127 -107.89 gain 127 121 -109.95 gain 121 128 -123.61 gain 128 121 -123.61 gain 121 129 -116.31 gain 129 121 -114.21 gain 121 130 -117.18 gain 130 121 -112.91 gain 121 131 -123.34 gain 131 121 -126.15 gain 121 132 -131.94 gain 132 121 -134.38 gain 121 133 -126.78 gain 133 121 -127.29 gain 121 134 -129.83 gain 134 121 -127.04 gain 121 135 -100.10 gain 135 121 -100.88 gain 121 136 -92.41 gain 136 121 -93.80 gain 121 137 -106.06 gain 137 121 -104.93 gain 121 138 -105.02 gain 138 121 -102.90 gain 121 139 -110.35 gain 139 121 -109.21 gain 121 140 -114.14 gain 140 121 -115.60 gain 121 141 -113.70 gain 141 121 -113.84 gain 121 142 -115.05 gain 142 121 -114.49 gain 121 143 -124.46 gain 143 121 -123.52 gain 121 144 -117.48 gain 144 121 -117.56 gain 121 145 -125.14 gain 145 121 -123.66 gain 121 146 -117.58 gain 146 121 -115.01 gain 121 147 -124.39 gain 147 121 -118.91 gain 121 148 -122.72 gain 148 121 -116.96 gain 121 149 -130.45 gain 149 121 -127.86 gain 121 150 -113.80 gain 150 121 -113.90 gain 121 151 -108.91 gain 151 121 -109.20 gain 121 152 -105.85 gain 152 121 -103.12 gain 121 153 -109.00 gain 153 121 -103.85 gain 121 154 -109.54 gain 154 121 -112.93 gain 121 155 -113.77 gain 155 121 -117.06 gain 121 156 -117.40 gain 156 121 -115.08 gain 121 157 -113.56 gain 157 121 -114.19 gain 121 158 -115.19 gain 158 121 -118.41 gain 121 159 -123.28 gain 159 121 -123.12 gain 121 160 -125.27 gain 160 121 -122.21 gain 121 161 -131.19 gain 161 121 -131.63 gain 121 162 -125.18 gain 162 121 -124.49 gain 121 163 -128.13 gain 163 121 -129.58 gain 121 164 -126.79 gain 164 121 -129.29 gain 121 165 -112.95 gain 165 121 -111.49 gain 121 166 -106.62 gain 166 121 -106.72 gain 121 167 -108.41 gain 167 121 -110.60 gain 121 168 -109.66 gain 168 121 -110.31 gain 121 169 -114.45 gain 169 121 -119.30 gain 121 170 -111.88 gain 170 121 -108.25 gain 121 171 -116.00 gain 171 121 -117.40 gain 121 172 -115.22 gain 172 121 -111.31 gain 121 173 -118.96 gain 173 121 -114.49 gain 121 174 -120.20 gain 174 121 -120.03 gain 121 175 -123.30 gain 175 121 -126.68 gain 121 176 -125.01 gain 176 121 -120.40 gain 121 177 -131.88 gain 177 121 -135.08 gain 121 178 -127.30 gain 178 121 -126.33 gain 121 179 -133.09 gain 179 121 -130.51 gain 121 180 -110.65 gain 180 121 -109.53 gain 121 181 -115.71 gain 181 121 -114.66 gain 121 182 -108.29 gain 182 121 -109.63 gain 121 183 -110.10 gain 183 121 -104.83 gain 121 184 -123.96 gain 184 121 -123.47 gain 121 185 -110.63 gain 185 121 -107.63 gain 121 186 -113.86 gain 186 121 -111.14 gain 121 187 -121.09 gain 187 121 -120.91 gain 121 188 -124.12 gain 188 121 -127.20 gain 121 189 -126.60 gain 189 121 -127.20 gain 121 190 -120.82 gain 190 121 -118.43 gain 121 191 -123.92 gain 191 121 -122.62 gain 121 192 -124.86 gain 192 121 -126.42 gain 121 193 -126.13 gain 193 121 -128.95 gain 121 194 -135.25 gain 194 121 -131.88 gain 121 195 -111.80 gain 195 121 -109.06 gain 121 196 -117.84 gain 196 121 -119.14 gain 121 197 -115.08 gain 197 121 -112.44 gain 121 198 -121.97 gain 198 121 -118.85 gain 121 199 -113.09 gain 199 121 -113.89 gain 121 200 -120.60 gain 200 121 -118.34 gain 121 201 -122.26 gain 201 121 -120.81 gain 121 202 -118.54 gain 202 121 -121.09 gain 121 203 -123.25 gain 203 121 -125.42 gain 121 204 -120.69 gain 204 121 -120.14 gain 121 205 -122.90 gain 205 121 -121.42 gain 121 206 -128.19 gain 206 121 -131.24 gain 121 207 -120.38 gain 207 121 -115.79 gain 121 208 -125.87 gain 208 121 -127.05 gain 121 209 -123.76 gain 209 121 -125.93 gain 121 210 -117.71 gain 210 121 -116.82 gain 121 211 -116.38 gain 211 121 -117.52 gain 121 212 -121.44 gain 212 121 -121.12 gain 121 213 -119.52 gain 213 121 -118.38 gain 121 214 -122.53 gain 214 121 -121.28 gain 121 215 -122.99 gain 215 121 -118.16 gain 121 216 -118.83 gain 216 121 -118.66 gain 121 217 -118.75 gain 217 121 -119.10 gain 121 218 -127.95 gain 218 121 -130.49 gain 121 219 -121.11 gain 219 121 -115.01 gain 121 220 -127.93 gain 220 121 -132.32 gain 121 221 -122.16 gain 221 121 -122.19 gain 121 222 -126.74 gain 222 121 -127.10 gain 121 223 -133.12 gain 223 121 -132.10 gain 121 224 -120.60 gain 224 121 -122.26 gain 122 123 -98.17 gain 123 122 -98.95 gain 122 124 -103.75 gain 124 122 -100.94 gain 122 125 -105.41 gain 125 122 -103.93 gain 122 126 -114.86 gain 126 122 -111.33 gain 122 127 -121.89 gain 127 122 -121.83 gain 122 128 -119.56 gain 128 122 -117.44 gain 122 129 -116.91 gain 129 122 -112.70 gain 122 130 -126.71 gain 130 122 -120.32 gain 122 131 -127.31 gain 131 122 -128.01 gain 122 132 -121.12 gain 132 122 -121.44 gain 122 133 -123.65 gain 133 122 -122.05 gain 122 134 -129.83 gain 134 122 -124.92 gain 122 135 -121.16 gain 135 122 -119.82 gain 122 136 -106.14 gain 136 122 -105.42 gain 122 137 -94.55 gain 137 122 -91.31 gain 122 138 -100.46 gain 138 122 -96.21 gain 122 139 -109.12 gain 139 122 -105.86 gain 122 140 -110.81 gain 140 122 -110.16 gain 122 141 -111.12 gain 141 122 -109.14 gain 122 142 -115.43 gain 142 122 -112.76 gain 122 143 -119.55 gain 143 122 -116.50 gain 122 144 -126.14 gain 144 122 -124.10 gain 122 145 -120.29 gain 145 122 -116.70 gain 122 146 -123.12 gain 146 122 -118.44 gain 122 147 -133.63 gain 147 122 -126.04 gain 122 148 -126.24 gain 148 122 -118.37 gain 122 149 -125.74 gain 149 122 -121.04 gain 122 150 -106.53 gain 150 122 -104.51 gain 122 151 -104.84 gain 151 122 -103.02 gain 122 152 -112.91 gain 152 122 -108.06 gain 122 153 -101.09 gain 153 122 -93.82 gain 122 154 -115.88 gain 154 122 -117.16 gain 122 155 -116.85 gain 155 122 -118.03 gain 122 156 -112.32 gain 156 122 -107.89 gain 122 157 -118.88 gain 157 122 -117.39 gain 122 158 -114.35 gain 158 122 -115.45 gain 122 159 -129.74 gain 159 122 -127.47 gain 122 160 -115.89 gain 160 122 -110.73 gain 122 161 -124.75 gain 161 122 -123.07 gain 122 162 -127.16 gain 162 122 -124.35 gain 122 163 -128.53 gain 163 122 -127.86 gain 122 164 -128.77 gain 164 122 -129.15 gain 122 165 -104.09 gain 165 122 -100.51 gain 122 166 -106.67 gain 166 122 -104.66 gain 122 167 -107.63 gain 167 122 -107.71 gain 122 168 -108.89 gain 168 122 -107.43 gain 122 169 -114.66 gain 169 122 -117.39 gain 122 170 -116.28 gain 170 122 -110.54 gain 122 171 -116.62 gain 171 122 -115.90 gain 122 172 -111.63 gain 172 122 -105.61 gain 122 173 -113.32 gain 173 122 -106.73 gain 122 174 -119.09 gain 174 122 -116.80 gain 122 175 -128.39 gain 175 122 -129.65 gain 122 176 -121.21 gain 176 122 -114.48 gain 122 177 -126.63 gain 177 122 -127.71 gain 122 178 -130.56 gain 178 122 -127.47 gain 122 179 -137.05 gain 179 122 -132.35 gain 122 180 -117.08 gain 180 122 -113.85 gain 122 181 -117.52 gain 181 122 -114.36 gain 122 182 -115.27 gain 182 122 -114.49 gain 122 183 -113.45 gain 183 122 -106.06 gain 122 184 -113.62 gain 184 122 -111.01 gain 122 185 -119.52 gain 185 122 -114.40 gain 122 186 -119.39 gain 186 122 -114.55 gain 122 187 -122.35 gain 187 122 -120.06 gain 122 188 -132.10 gain 188 122 -133.07 gain 122 189 -129.03 gain 189 122 -127.51 gain 122 190 -121.82 gain 190 122 -117.32 gain 122 191 -129.92 gain 191 122 -126.51 gain 122 192 -128.39 gain 192 122 -127.84 gain 122 193 -129.00 gain 193 122 -129.70 gain 122 194 -132.96 gain 194 122 -127.47 gain 122 195 -120.13 gain 195 122 -115.27 gain 122 196 -114.34 gain 196 122 -113.53 gain 122 197 -120.14 gain 197 122 -115.39 gain 122 198 -121.91 gain 198 122 -116.68 gain 122 199 -120.19 gain 199 122 -118.88 gain 122 200 -114.57 gain 200 122 -110.20 gain 122 201 -118.93 gain 201 122 -115.36 gain 122 202 -125.31 gain 202 122 -125.74 gain 122 203 -122.13 gain 203 122 -122.18 gain 122 204 -132.90 gain 204 122 -130.24 gain 122 205 -127.07 gain 205 122 -123.47 gain 122 206 -121.60 gain 206 122 -122.53 gain 122 207 -130.42 gain 207 122 -123.71 gain 122 208 -133.75 gain 208 122 -132.82 gain 122 209 -130.80 gain 209 122 -130.86 gain 122 210 -116.42 gain 210 122 -113.41 gain 122 211 -128.00 gain 211 122 -127.02 gain 122 212 -112.65 gain 212 122 -110.21 gain 122 213 -121.15 gain 213 122 -117.91 gain 122 214 -120.93 gain 214 122 -117.57 gain 122 215 -112.72 gain 215 122 -105.78 gain 122 216 -117.84 gain 216 122 -115.56 gain 122 217 -123.36 gain 217 122 -121.59 gain 122 218 -122.23 gain 218 122 -122.65 gain 122 219 -120.45 gain 219 122 -112.23 gain 122 220 -128.47 gain 220 122 -130.74 gain 122 221 -124.72 gain 221 122 -122.64 gain 122 222 -131.06 gain 222 122 -129.30 gain 122 223 -122.97 gain 223 122 -119.82 gain 122 224 -134.48 gain 224 122 -134.03 gain 123 124 -101.65 gain 124 123 -98.06 gain 123 125 -105.91 gain 125 123 -103.66 gain 123 126 -113.71 gain 126 123 -109.41 gain 123 127 -118.34 gain 127 123 -117.50 gain 123 128 -112.88 gain 128 123 -109.98 gain 123 129 -120.84 gain 129 123 -115.84 gain 123 130 -117.98 gain 130 123 -110.81 gain 123 131 -127.41 gain 131 123 -127.33 gain 123 132 -128.29 gain 132 123 -127.84 gain 123 133 -129.01 gain 133 123 -126.63 gain 123 134 -127.81 gain 134 123 -122.13 gain 123 135 -113.12 gain 135 123 -111.01 gain 123 136 -108.18 gain 136 123 -106.68 gain 123 137 -103.68 gain 137 123 -99.66 gain 123 138 -95.33 gain 138 123 -90.31 gain 123 139 -100.10 gain 139 123 -96.07 gain 123 140 -107.88 gain 140 123 -106.45 gain 123 141 -114.10 gain 141 123 -111.35 gain 123 142 -112.44 gain 142 123 -108.99 gain 123 143 -117.78 gain 143 123 -113.95 gain 123 144 -117.41 gain 144 123 -114.59 gain 123 145 -121.92 gain 145 123 -117.56 gain 123 146 -120.79 gain 146 123 -115.33 gain 123 147 -125.58 gain 147 123 -117.21 gain 123 148 -128.79 gain 148 123 -120.14 gain 123 149 -134.52 gain 149 123 -129.04 gain 123 150 -111.87 gain 150 123 -109.08 gain 123 151 -111.28 gain 151 123 -108.68 gain 123 152 -106.29 gain 152 123 -100.67 gain 123 153 -105.12 gain 153 123 -97.07 gain 123 154 -102.86 gain 154 123 -103.37 gain 123 155 -113.99 gain 155 123 -114.39 gain 123 156 -116.86 gain 156 123 -111.65 gain 123 157 -122.27 gain 157 123 -120.00 gain 123 158 -118.78 gain 158 123 -119.11 gain 123 159 -125.87 gain 159 123 -122.81 gain 123 160 -126.12 gain 160 123 -120.17 gain 123 161 -119.83 gain 161 123 -117.37 gain 123 162 -131.62 gain 162 123 -128.03 gain 123 163 -136.60 gain 163 123 -135.16 gain 123 164 -129.35 gain 164 123 -128.95 gain 123 165 -113.96 gain 165 123 -109.60 gain 123 166 -113.31 gain 166 123 -110.52 gain 123 167 -108.58 gain 167 123 -107.88 gain 123 168 -108.39 gain 168 123 -106.14 gain 123 169 -112.10 gain 169 123 -114.05 gain 123 170 -116.66 gain 170 123 -110.14 gain 123 171 -118.79 gain 171 123 -117.29 gain 123 172 -119.14 gain 172 123 -112.34 gain 123 173 -119.35 gain 173 123 -111.99 gain 123 174 -127.44 gain 174 123 -124.38 gain 123 175 -123.99 gain 175 123 -124.47 gain 123 176 -125.79 gain 176 123 -118.29 gain 123 177 -124.36 gain 177 123 -124.66 gain 123 178 -119.27 gain 178 123 -115.40 gain 123 179 -125.10 gain 179 123 -119.62 gain 123 180 -119.54 gain 180 123 -115.54 gain 123 181 -109.55 gain 181 123 -105.61 gain 123 182 -114.94 gain 182 123 -113.39 gain 123 183 -108.54 gain 183 123 -100.37 gain 123 184 -117.42 gain 184 123 -114.04 gain 123 185 -117.30 gain 185 123 -111.40 gain 123 186 -122.82 gain 186 123 -117.21 gain 123 187 -125.01 gain 187 123 -121.94 gain 123 188 -122.94 gain 188 123 -123.13 gain 123 189 -122.80 gain 189 123 -120.50 gain 123 190 -125.63 gain 190 123 -120.35 gain 123 191 -125.25 gain 191 123 -121.05 gain 123 192 -128.10 gain 192 123 -126.77 gain 123 193 -129.31 gain 193 123 -129.24 gain 123 194 -129.71 gain 194 123 -123.45 gain 123 195 -119.68 gain 195 123 -114.05 gain 123 196 -111.80 gain 196 123 -110.20 gain 123 197 -116.96 gain 197 123 -111.43 gain 123 198 -119.36 gain 198 123 -113.35 gain 123 199 -114.19 gain 199 123 -112.10 gain 123 200 -119.66 gain 200 123 -114.51 gain 123 201 -123.61 gain 201 123 -119.26 gain 123 202 -116.34 gain 202 123 -115.99 gain 123 203 -118.01 gain 203 123 -117.29 gain 123 204 -125.44 gain 204 123 -121.99 gain 123 205 -114.35 gain 205 123 -109.98 gain 123 206 -126.70 gain 206 123 -126.85 gain 123 207 -134.11 gain 207 123 -126.62 gain 123 208 -123.18 gain 208 123 -121.47 gain 123 209 -132.04 gain 209 123 -131.32 gain 123 210 -129.64 gain 210 123 -125.86 gain 123 211 -116.74 gain 211 123 -114.98 gain 123 212 -115.12 gain 212 123 -111.90 gain 123 213 -121.88 gain 213 123 -117.85 gain 123 214 -126.37 gain 214 123 -122.23 gain 123 215 -126.20 gain 215 123 -118.48 gain 123 216 -116.57 gain 216 123 -113.51 gain 123 217 -123.40 gain 217 123 -120.86 gain 123 218 -124.22 gain 218 123 -123.87 gain 123 219 -122.15 gain 219 123 -113.16 gain 123 220 -132.27 gain 220 123 -133.77 gain 123 221 -124.13 gain 221 123 -121.27 gain 123 222 -130.99 gain 222 123 -128.46 gain 123 223 -121.27 gain 223 123 -117.35 gain 123 224 -125.01 gain 224 123 -123.78 gain 124 125 -91.97 gain 125 124 -93.31 gain 124 126 -103.03 gain 126 124 -102.32 gain 124 127 -103.65 gain 127 124 -106.41 gain 124 128 -104.87 gain 128 124 -105.56 gain 124 129 -111.57 gain 129 124 -110.17 gain 124 130 -120.66 gain 130 124 -117.09 gain 124 131 -117.49 gain 131 124 -121.00 gain 124 132 -124.37 gain 132 124 -127.51 gain 124 133 -124.50 gain 133 124 -125.71 gain 124 134 -124.83 gain 134 124 -122.74 gain 124 135 -108.03 gain 135 124 -109.51 gain 124 136 -101.44 gain 136 124 -103.53 gain 124 137 -106.09 gain 137 124 -105.66 gain 124 138 -94.77 gain 138 124 -93.34 gain 124 139 -93.85 gain 139 124 -93.41 gain 124 140 -107.87 gain 140 124 -110.03 gain 124 141 -111.42 gain 141 124 -112.26 gain 124 142 -115.47 gain 142 124 -115.61 gain 124 143 -112.51 gain 143 124 -112.27 gain 124 144 -116.36 gain 144 124 -117.14 gain 124 145 -117.98 gain 145 124 -117.21 gain 124 146 -112.97 gain 146 124 -111.10 gain 124 147 -121.34 gain 147 124 -116.57 gain 124 148 -121.65 gain 148 124 -116.60 gain 124 149 -117.19 gain 149 124 -115.30 gain 124 150 -119.82 gain 150 124 -120.62 gain 124 151 -123.80 gain 151 124 -124.79 gain 124 152 -109.37 gain 152 124 -107.34 gain 124 153 -104.23 gain 153 124 -99.78 gain 124 154 -99.64 gain 154 124 -103.73 gain 124 155 -107.35 gain 155 124 -111.34 gain 124 156 -108.36 gain 156 124 -106.74 gain 124 157 -115.79 gain 157 124 -117.12 gain 124 158 -116.24 gain 158 124 -120.15 gain 124 159 -117.50 gain 159 124 -118.04 gain 124 160 -116.92 gain 160 124 -114.57 gain 124 161 -120.99 gain 161 124 -122.12 gain 124 162 -118.56 gain 162 124 -118.56 gain 124 163 -124.82 gain 163 124 -126.98 gain 124 164 -123.85 gain 164 124 -127.04 gain 124 165 -122.51 gain 165 124 -121.75 gain 124 166 -109.54 gain 166 124 -110.34 gain 124 167 -111.72 gain 167 124 -114.61 gain 124 168 -106.86 gain 168 124 -108.20 gain 124 169 -112.12 gain 169 124 -117.66 gain 124 170 -103.66 gain 170 124 -100.73 gain 124 171 -108.03 gain 171 124 -110.12 gain 124 172 -117.24 gain 172 124 -114.03 gain 124 173 -108.01 gain 173 124 -104.23 gain 124 174 -117.27 gain 174 124 -117.79 gain 124 175 -118.76 gain 175 124 -122.84 gain 124 176 -115.43 gain 176 124 -111.51 gain 124 177 -117.70 gain 177 124 -121.60 gain 124 178 -122.33 gain 178 124 -122.05 gain 124 179 -124.39 gain 179 124 -122.50 gain 124 180 -119.75 gain 180 124 -119.34 gain 124 181 -112.56 gain 181 124 -112.21 gain 124 182 -114.74 gain 182 124 -116.77 gain 124 183 -113.40 gain 183 124 -108.83 gain 124 184 -106.32 gain 184 124 -106.52 gain 124 185 -117.96 gain 185 124 -115.65 gain 124 186 -109.45 gain 186 124 -107.43 gain 124 187 -114.89 gain 187 124 -115.41 gain 124 188 -115.00 gain 188 124 -118.78 gain 124 189 -115.84 gain 189 124 -117.14 gain 124 190 -112.30 gain 190 124 -110.61 gain 124 191 -113.95 gain 191 124 -113.35 gain 124 192 -116.70 gain 192 124 -118.96 gain 124 193 -125.52 gain 193 124 -129.03 gain 124 194 -129.74 gain 194 124 -127.06 gain 124 195 -115.18 gain 195 124 -113.13 gain 124 196 -118.21 gain 196 124 -120.21 gain 124 197 -123.32 gain 197 124 -121.38 gain 124 198 -117.37 gain 198 124 -114.95 gain 124 199 -113.62 gain 199 124 -115.12 gain 124 200 -112.28 gain 200 124 -110.72 gain 124 201 -112.22 gain 201 124 -111.46 gain 124 202 -119.32 gain 202 124 -122.56 gain 124 203 -111.28 gain 203 124 -114.14 gain 124 204 -119.55 gain 204 124 -119.70 gain 124 205 -114.98 gain 205 124 -114.20 gain 124 206 -120.59 gain 206 124 -124.33 gain 124 207 -118.43 gain 207 124 -114.53 gain 124 208 -116.37 gain 208 124 -118.25 gain 124 209 -112.32 gain 209 124 -115.19 gain 124 210 -115.09 gain 210 124 -114.90 gain 124 211 -113.26 gain 211 124 -115.09 gain 124 212 -118.65 gain 212 124 -119.02 gain 124 213 -117.52 gain 213 124 -117.09 gain 124 214 -108.93 gain 214 124 -108.38 gain 124 215 -116.25 gain 215 124 -112.12 gain 124 216 -113.30 gain 216 124 -113.83 gain 124 217 -118.78 gain 217 124 -119.83 gain 124 218 -119.11 gain 218 124 -122.34 gain 124 219 -124.26 gain 219 124 -118.86 gain 124 220 -122.42 gain 220 124 -127.50 gain 124 221 -119.54 gain 221 124 -120.27 gain 124 222 -121.08 gain 222 124 -122.13 gain 124 223 -116.62 gain 223 124 -116.29 gain 124 224 -120.82 gain 224 124 -123.17 gain 125 126 -100.31 gain 126 125 -98.27 gain 125 127 -108.62 gain 127 125 -110.04 gain 125 128 -111.00 gain 128 125 -110.36 gain 125 129 -114.68 gain 129 125 -111.94 gain 125 130 -123.01 gain 130 125 -118.10 gain 125 131 -119.63 gain 131 125 -121.80 gain 125 132 -122.49 gain 132 125 -124.29 gain 125 133 -121.86 gain 133 125 -121.73 gain 125 134 -126.33 gain 134 125 -122.90 gain 125 135 -113.61 gain 135 125 -113.75 gain 125 136 -111.49 gain 136 125 -112.24 gain 125 137 -105.20 gain 137 125 -103.43 gain 125 138 -100.61 gain 138 125 -97.84 gain 125 139 -92.54 gain 139 125 -90.76 gain 125 140 -97.39 gain 140 125 -98.22 gain 125 141 -100.83 gain 141 125 -100.33 gain 125 142 -103.04 gain 142 125 -101.84 gain 125 143 -106.97 gain 143 125 -105.39 gain 125 144 -111.02 gain 144 125 -110.46 gain 125 145 -116.38 gain 145 125 -114.27 gain 125 146 -120.20 gain 146 125 -117.00 gain 125 147 -119.24 gain 147 125 -113.13 gain 125 148 -120.43 gain 148 125 -114.03 gain 125 149 -119.39 gain 149 125 -116.16 gain 125 150 -116.41 gain 150 125 -115.87 gain 125 151 -117.51 gain 151 125 -117.17 gain 125 152 -107.14 gain 152 125 -103.77 gain 125 153 -118.21 gain 153 125 -112.42 gain 125 154 -104.72 gain 154 125 -107.48 gain 125 155 -100.73 gain 155 125 -103.38 gain 125 156 -111.52 gain 156 125 -108.57 gain 125 157 -108.31 gain 157 125 -108.29 gain 125 158 -115.77 gain 158 125 -118.35 gain 125 159 -117.92 gain 159 125 -117.12 gain 125 160 -118.80 gain 160 125 -115.11 gain 125 161 -120.01 gain 161 125 -119.81 gain 125 162 -119.57 gain 162 125 -118.24 gain 125 163 -119.88 gain 163 125 -120.69 gain 125 164 -120.11 gain 164 125 -121.96 gain 125 165 -116.28 gain 165 125 -114.18 gain 125 166 -112.42 gain 166 125 -111.89 gain 125 167 -110.60 gain 167 125 -112.16 gain 125 168 -112.81 gain 168 125 -112.82 gain 125 169 -110.49 gain 169 125 -114.70 gain 125 170 -116.09 gain 170 125 -111.82 gain 125 171 -103.38 gain 171 125 -104.13 gain 125 172 -114.02 gain 172 125 -109.47 gain 125 173 -107.49 gain 173 125 -102.38 gain 125 174 -110.59 gain 174 125 -109.78 gain 125 175 -111.15 gain 175 125 -113.89 gain 125 176 -124.24 gain 176 125 -118.99 gain 125 177 -120.06 gain 177 125 -122.63 gain 125 178 -123.83 gain 178 125 -122.21 gain 125 179 -119.75 gain 179 125 -116.53 gain 125 180 -113.67 gain 180 125 -111.91 gain 125 181 -121.02 gain 181 125 -119.34 gain 125 182 -121.63 gain 182 125 -122.34 gain 125 183 -111.38 gain 183 125 -105.47 gain 125 184 -112.07 gain 184 125 -110.95 gain 125 185 -113.71 gain 185 125 -110.07 gain 125 186 -117.74 gain 186 125 -114.38 gain 125 187 -118.58 gain 187 125 -117.76 gain 125 188 -117.29 gain 188 125 -119.74 gain 125 189 -122.08 gain 189 125 -122.04 gain 125 190 -119.06 gain 190 125 -116.02 gain 125 191 -118.54 gain 191 125 -116.60 gain 125 192 -122.98 gain 192 125 -123.91 gain 125 193 -124.56 gain 193 125 -126.74 gain 125 194 -118.58 gain 194 125 -114.57 gain 125 195 -128.61 gain 195 125 -125.23 gain 125 196 -120.02 gain 196 125 -120.69 gain 125 197 -116.14 gain 197 125 -112.86 gain 125 198 -120.41 gain 198 125 -116.65 gain 125 199 -115.01 gain 199 125 -115.17 gain 125 200 -114.60 gain 200 125 -111.70 gain 125 201 -111.05 gain 201 125 -108.95 gain 125 202 -113.90 gain 202 125 -115.81 gain 125 203 -122.15 gain 203 125 -123.68 gain 125 204 -119.45 gain 204 125 -118.26 gain 125 205 -123.85 gain 205 125 -121.74 gain 125 206 -120.93 gain 206 125 -123.34 gain 125 207 -118.88 gain 207 125 -113.65 gain 125 208 -123.71 gain 208 125 -124.25 gain 125 209 -118.52 gain 209 125 -120.05 gain 125 210 -120.85 gain 210 125 -119.32 gain 125 211 -118.84 gain 211 125 -119.34 gain 125 212 -128.68 gain 212 125 -127.72 gain 125 213 -121.12 gain 213 125 -119.35 gain 125 214 -123.15 gain 214 125 -121.27 gain 125 215 -118.34 gain 215 125 -112.88 gain 125 216 -122.62 gain 216 125 -121.81 gain 125 217 -118.23 gain 217 125 -117.94 gain 125 218 -114.49 gain 218 125 -116.39 gain 125 219 -118.47 gain 219 125 -111.73 gain 125 220 -118.01 gain 220 125 -121.76 gain 125 221 -125.50 gain 221 125 -124.89 gain 125 222 -127.29 gain 222 125 -127.01 gain 125 223 -121.34 gain 223 125 -119.68 gain 125 224 -127.96 gain 224 125 -128.98 gain 126 127 -93.33 gain 127 126 -96.80 gain 126 128 -98.98 gain 128 126 -100.38 gain 126 129 -110.41 gain 129 126 -109.72 gain 126 130 -114.92 gain 130 126 -112.06 gain 126 131 -112.98 gain 131 126 -117.20 gain 126 132 -118.20 gain 132 126 -122.04 gain 126 133 -116.69 gain 133 126 -118.60 gain 126 134 -115.21 gain 134 126 -113.83 gain 126 135 -116.84 gain 135 126 -119.02 gain 126 136 -119.42 gain 136 126 -122.22 gain 126 137 -109.78 gain 137 126 -110.06 gain 126 138 -108.72 gain 138 126 -108.00 gain 126 139 -106.18 gain 139 126 -106.45 gain 126 140 -92.68 gain 140 126 -95.55 gain 126 141 -98.27 gain 141 126 -99.82 gain 126 142 -89.19 gain 142 126 -90.05 gain 126 143 -99.70 gain 143 126 -100.17 gain 126 144 -105.28 gain 144 126 -106.77 gain 126 145 -108.17 gain 145 126 -108.11 gain 126 146 -112.62 gain 146 126 -111.47 gain 126 147 -117.07 gain 147 126 -113.00 gain 126 148 -116.32 gain 148 126 -111.97 gain 126 149 -110.26 gain 149 126 -109.08 gain 126 150 -113.68 gain 150 126 -115.18 gain 126 151 -110.75 gain 151 126 -112.46 gain 126 152 -113.40 gain 152 126 -112.08 gain 126 153 -105.39 gain 153 126 -101.65 gain 126 154 -104.57 gain 154 126 -109.37 gain 126 155 -104.04 gain 155 126 -108.74 gain 126 156 -96.19 gain 156 126 -95.27 gain 126 157 -102.83 gain 157 126 -104.86 gain 126 158 -104.53 gain 158 126 -109.16 gain 126 159 -116.49 gain 159 126 -117.74 gain 126 160 -112.27 gain 160 126 -110.63 gain 126 161 -113.23 gain 161 126 -115.08 gain 126 162 -115.53 gain 162 126 -116.24 gain 126 163 -111.87 gain 163 126 -114.74 gain 126 164 -114.07 gain 164 126 -117.97 gain 126 165 -119.25 gain 165 126 -119.19 gain 126 166 -113.21 gain 166 126 -114.72 gain 126 167 -114.56 gain 167 126 -118.17 gain 126 168 -113.44 gain 168 126 -115.50 gain 126 169 -106.40 gain 169 126 -112.65 gain 126 170 -106.00 gain 170 126 -103.78 gain 126 171 -104.44 gain 171 126 -107.25 gain 126 172 -101.58 gain 172 126 -99.08 gain 126 173 -119.02 gain 173 126 -115.96 gain 126 174 -116.89 gain 174 126 -118.12 gain 126 175 -111.05 gain 175 126 -115.83 gain 126 176 -116.60 gain 176 126 -113.40 gain 126 177 -116.39 gain 177 126 -121.00 gain 126 178 -116.29 gain 178 126 -116.72 gain 126 179 -127.22 gain 179 126 -126.04 gain 126 180 -117.84 gain 180 126 -118.14 gain 126 181 -114.14 gain 181 126 -114.50 gain 126 182 -114.58 gain 182 126 -117.32 gain 126 183 -114.03 gain 183 126 -110.16 gain 126 184 -109.39 gain 184 126 -110.30 gain 126 185 -114.79 gain 185 126 -113.19 gain 126 186 -110.42 gain 186 126 -109.11 gain 126 187 -109.09 gain 187 126 -110.32 gain 126 188 -113.59 gain 188 126 -118.08 gain 126 189 -120.03 gain 189 126 -122.03 gain 126 190 -120.40 gain 190 126 -119.42 gain 126 191 -115.40 gain 191 126 -115.51 gain 126 192 -115.50 gain 192 126 -118.48 gain 126 193 -124.40 gain 193 126 -128.62 gain 126 194 -119.91 gain 194 126 -117.95 gain 126 195 -123.63 gain 195 126 -122.29 gain 126 196 -118.94 gain 196 126 -121.65 gain 126 197 -119.07 gain 197 126 -117.84 gain 126 198 -121.24 gain 198 126 -119.53 gain 126 199 -116.28 gain 199 126 -118.48 gain 126 200 -114.02 gain 200 126 -113.16 gain 126 201 -112.58 gain 201 126 -112.53 gain 126 202 -113.00 gain 202 126 -116.96 gain 126 203 -115.46 gain 203 126 -119.04 gain 126 204 -117.57 gain 204 126 -118.43 gain 126 205 -120.41 gain 205 126 -120.34 gain 126 206 -119.60 gain 206 126 -124.05 gain 126 207 -116.33 gain 207 126 -113.15 gain 126 208 -124.47 gain 208 126 -127.06 gain 126 209 -123.64 gain 209 126 -127.22 gain 126 210 -124.01 gain 210 126 -124.53 gain 126 211 -121.51 gain 211 126 -124.05 gain 126 212 -117.71 gain 212 126 -118.79 gain 126 213 -109.39 gain 213 126 -109.66 gain 126 214 -116.11 gain 214 126 -116.27 gain 126 215 -121.76 gain 215 126 -118.33 gain 126 216 -119.47 gain 216 126 -120.71 gain 126 217 -122.82 gain 217 126 -124.57 gain 126 218 -120.44 gain 218 126 -124.39 gain 126 219 -119.53 gain 219 126 -114.84 gain 126 220 -115.93 gain 220 126 -121.73 gain 126 221 -114.55 gain 221 126 -115.99 gain 126 222 -119.80 gain 222 126 -121.57 gain 126 223 -118.98 gain 223 126 -119.36 gain 126 224 -122.50 gain 224 126 -125.57 gain 127 128 -99.26 gain 128 127 -97.20 gain 127 129 -104.48 gain 129 127 -100.32 gain 127 130 -111.21 gain 130 127 -104.88 gain 127 131 -116.65 gain 131 127 -117.41 gain 127 132 -117.64 gain 132 127 -118.02 gain 127 133 -119.73 gain 133 127 -118.18 gain 127 134 -128.33 gain 134 127 -123.49 gain 127 135 -117.55 gain 135 127 -116.28 gain 127 136 -122.95 gain 136 127 -122.29 gain 127 137 -125.73 gain 137 127 -122.55 gain 127 138 -117.24 gain 138 127 -113.06 gain 127 139 -107.47 gain 139 127 -104.27 gain 127 140 -109.91 gain 140 127 -109.32 gain 127 141 -98.86 gain 141 127 -96.95 gain 127 142 -96.63 gain 142 127 -94.02 gain 127 143 -103.81 gain 143 127 -100.81 gain 127 144 -108.48 gain 144 127 -106.50 gain 127 145 -109.12 gain 145 127 -105.59 gain 127 146 -120.11 gain 146 127 -115.49 gain 127 147 -122.59 gain 147 127 -115.06 gain 127 148 -114.84 gain 148 127 -107.03 gain 127 149 -119.36 gain 149 127 -114.72 gain 127 150 -122.70 gain 150 127 -120.75 gain 127 151 -116.17 gain 151 127 -114.41 gain 127 152 -122.95 gain 152 127 -118.17 gain 127 153 -120.23 gain 153 127 -113.03 gain 127 154 -112.97 gain 154 127 -114.31 gain 127 155 -108.89 gain 155 127 -110.13 gain 127 156 -108.28 gain 156 127 -103.90 gain 127 157 -101.89 gain 157 127 -100.46 gain 127 158 -103.53 gain 158 127 -104.69 gain 127 159 -112.33 gain 159 127 -110.11 gain 127 160 -110.58 gain 160 127 -105.47 gain 127 161 -118.28 gain 161 127 -116.67 gain 127 162 -114.45 gain 162 127 -111.70 gain 127 163 -115.57 gain 163 127 -114.96 gain 127 164 -116.81 gain 164 127 -117.25 gain 127 165 -124.93 gain 165 127 -121.41 gain 127 166 -120.57 gain 166 127 -118.62 gain 127 167 -123.58 gain 167 127 -123.72 gain 127 168 -123.51 gain 168 127 -122.10 gain 127 169 -116.54 gain 169 127 -119.33 gain 127 170 -104.98 gain 170 127 -99.30 gain 127 171 -111.30 gain 171 127 -110.64 gain 127 172 -104.06 gain 172 127 -98.10 gain 127 173 -109.52 gain 173 127 -102.99 gain 127 174 -111.37 gain 174 127 -109.13 gain 127 175 -106.79 gain 175 127 -108.11 gain 127 176 -115.03 gain 176 127 -108.36 gain 127 177 -123.68 gain 177 127 -124.82 gain 127 178 -126.18 gain 178 127 -123.15 gain 127 179 -122.64 gain 179 127 -118.00 gain 127 180 -117.46 gain 180 127 -114.29 gain 127 181 -128.69 gain 181 127 -125.59 gain 127 182 -114.62 gain 182 127 -113.91 gain 127 183 -121.94 gain 183 127 -114.61 gain 127 184 -114.78 gain 184 127 -112.24 gain 127 185 -112.02 gain 185 127 -106.96 gain 127 186 -109.10 gain 186 127 -104.33 gain 127 187 -112.51 gain 187 127 -110.28 gain 127 188 -118.56 gain 188 127 -119.58 gain 127 189 -119.68 gain 189 127 -118.22 gain 127 190 -120.46 gain 190 127 -116.01 gain 127 191 -117.27 gain 191 127 -113.91 gain 127 192 -120.30 gain 192 127 -119.81 gain 127 193 -119.66 gain 193 127 -120.42 gain 127 194 -122.18 gain 194 127 -116.75 gain 127 195 -127.31 gain 195 127 -122.51 gain 127 196 -123.22 gain 196 127 -122.46 gain 127 197 -120.97 gain 197 127 -116.27 gain 127 198 -112.56 gain 198 127 -107.39 gain 127 199 -120.94 gain 199 127 -119.69 gain 127 200 -115.05 gain 200 127 -110.74 gain 127 201 -111.55 gain 201 127 -108.03 gain 127 202 -121.61 gain 202 127 -122.10 gain 127 203 -118.23 gain 203 127 -118.34 gain 127 204 -118.94 gain 204 127 -116.33 gain 127 205 -117.93 gain 205 127 -114.40 gain 127 206 -125.84 gain 206 127 -126.82 gain 127 207 -122.48 gain 207 127 -115.83 gain 127 208 -126.89 gain 208 127 -126.02 gain 127 209 -125.18 gain 209 127 -125.30 gain 127 210 -127.01 gain 210 127 -124.07 gain 127 211 -124.90 gain 211 127 -123.98 gain 127 212 -122.85 gain 212 127 -120.47 gain 127 213 -130.75 gain 213 127 -127.56 gain 127 214 -119.90 gain 214 127 -116.60 gain 127 215 -117.34 gain 215 127 -110.46 gain 127 216 -121.53 gain 216 127 -119.31 gain 127 217 -117.90 gain 217 127 -116.20 gain 127 218 -117.41 gain 218 127 -117.90 gain 127 219 -115.92 gain 219 127 -107.76 gain 127 220 -116.24 gain 220 127 -118.57 gain 127 221 -124.87 gain 221 127 -122.85 gain 127 222 -132.09 gain 222 127 -130.40 gain 127 223 -119.37 gain 223 127 -116.29 gain 127 224 -121.16 gain 224 127 -120.77 gain 128 129 -94.21 gain 129 128 -92.12 gain 128 130 -103.19 gain 130 128 -98.93 gain 128 131 -102.60 gain 131 128 -105.42 gain 128 132 -114.56 gain 132 128 -117.01 gain 128 133 -117.39 gain 133 128 -117.90 gain 128 134 -121.70 gain 134 128 -118.91 gain 128 135 -125.11 gain 135 128 -125.89 gain 128 136 -124.62 gain 136 128 -126.01 gain 128 137 -124.05 gain 137 128 -122.93 gain 128 138 -117.22 gain 138 128 -115.10 gain 128 139 -111.04 gain 139 128 -109.90 gain 128 140 -110.55 gain 140 128 -112.02 gain 128 141 -110.93 gain 141 128 -111.07 gain 128 142 -97.84 gain 142 128 -97.29 gain 128 143 -94.75 gain 143 128 -93.81 gain 128 144 -94.90 gain 144 128 -94.99 gain 128 145 -103.47 gain 145 128 -102.00 gain 128 146 -112.00 gain 146 128 -109.44 gain 128 147 -119.24 gain 147 128 -113.78 gain 128 148 -123.38 gain 148 128 -117.63 gain 128 149 -115.40 gain 149 128 -112.82 gain 128 150 -115.07 gain 150 128 -115.18 gain 128 151 -124.73 gain 151 128 -125.03 gain 128 152 -119.92 gain 152 128 -117.20 gain 128 153 -113.97 gain 153 128 -108.82 gain 128 154 -122.15 gain 154 128 -125.55 gain 128 155 -111.46 gain 155 128 -114.76 gain 128 156 -113.03 gain 156 128 -110.72 gain 128 157 -93.43 gain 157 128 -94.06 gain 128 158 -99.47 gain 158 128 -102.70 gain 128 159 -98.94 gain 159 128 -98.78 gain 128 160 -103.06 gain 160 128 -100.02 gain 128 161 -106.70 gain 161 128 -107.14 gain 128 162 -112.16 gain 162 128 -111.47 gain 128 163 -112.88 gain 163 128 -114.34 gain 128 164 -111.93 gain 164 128 -114.43 gain 128 165 -119.60 gain 165 128 -118.14 gain 128 166 -123.49 gain 166 128 -123.60 gain 128 167 -121.34 gain 167 128 -123.54 gain 128 168 -121.44 gain 168 128 -122.10 gain 128 169 -118.65 gain 169 128 -123.50 gain 128 170 -110.48 gain 170 128 -106.86 gain 128 171 -106.22 gain 171 128 -107.62 gain 128 172 -111.63 gain 172 128 -107.73 gain 128 173 -107.74 gain 173 128 -103.27 gain 128 174 -110.38 gain 174 128 -110.21 gain 128 175 -113.23 gain 175 128 -116.62 gain 128 176 -112.15 gain 176 128 -107.55 gain 128 177 -117.27 gain 177 128 -120.48 gain 128 178 -116.38 gain 178 128 -115.41 gain 128 179 -119.05 gain 179 128 -116.48 gain 128 180 -116.80 gain 180 128 -115.69 gain 128 181 -120.93 gain 181 128 -119.89 gain 128 182 -119.38 gain 182 128 -120.73 gain 128 183 -122.06 gain 183 128 -116.80 gain 128 184 -111.04 gain 184 128 -110.56 gain 128 185 -104.67 gain 185 128 -101.68 gain 128 186 -117.09 gain 186 128 -114.38 gain 128 187 -111.35 gain 187 128 -111.18 gain 128 188 -110.08 gain 188 128 -113.17 gain 128 189 -109.38 gain 189 128 -109.98 gain 128 190 -115.89 gain 190 128 -113.50 gain 128 191 -114.88 gain 191 128 -113.59 gain 128 192 -116.37 gain 192 128 -117.95 gain 128 193 -119.93 gain 193 128 -122.75 gain 128 194 -124.89 gain 194 128 -121.53 gain 128 195 -119.61 gain 195 128 -116.88 gain 128 196 -114.29 gain 196 128 -115.60 gain 128 197 -125.38 gain 197 128 -122.75 gain 128 198 -120.96 gain 198 128 -117.86 gain 128 199 -119.48 gain 199 128 -120.29 gain 128 200 -123.47 gain 200 128 -121.21 gain 128 201 -114.13 gain 201 128 -112.68 gain 128 202 -120.01 gain 202 128 -122.56 gain 128 203 -114.14 gain 203 128 -116.31 gain 128 204 -119.21 gain 204 128 -118.67 gain 128 205 -117.60 gain 205 128 -116.13 gain 128 206 -115.60 gain 206 128 -118.65 gain 128 207 -121.22 gain 207 128 -116.63 gain 128 208 -120.51 gain 208 128 -121.70 gain 128 209 -118.71 gain 209 128 -120.89 gain 128 210 -123.43 gain 210 128 -122.55 gain 128 211 -121.93 gain 211 128 -123.07 gain 128 212 -121.59 gain 212 128 -121.27 gain 128 213 -117.88 gain 213 128 -116.75 gain 128 214 -118.42 gain 214 128 -117.18 gain 128 215 -120.02 gain 215 128 -115.20 gain 128 216 -118.65 gain 216 128 -118.49 gain 128 217 -116.09 gain 217 128 -116.44 gain 128 218 -110.80 gain 218 128 -113.34 gain 128 219 -117.85 gain 219 128 -111.76 gain 128 220 -116.97 gain 220 128 -121.36 gain 128 221 -116.08 gain 221 128 -116.12 gain 128 222 -124.81 gain 222 128 -125.18 gain 128 223 -128.27 gain 223 128 -127.25 gain 128 224 -123.05 gain 224 128 -124.71 gain 129 130 -92.61 gain 130 129 -90.44 gain 129 131 -104.87 gain 131 129 -109.78 gain 129 132 -107.78 gain 132 129 -112.32 gain 129 133 -107.30 gain 133 129 -109.91 gain 129 134 -117.59 gain 134 129 -116.90 gain 129 135 -117.45 gain 135 129 -120.32 gain 129 136 -123.90 gain 136 129 -127.39 gain 129 137 -117.12 gain 137 129 -118.09 gain 129 138 -113.60 gain 138 129 -113.58 gain 129 139 -119.28 gain 139 129 -120.23 gain 129 140 -114.03 gain 140 129 -117.60 gain 129 141 -105.00 gain 141 129 -107.23 gain 129 142 -100.84 gain 142 129 -102.39 gain 129 143 -101.62 gain 143 129 -102.78 gain 129 144 -94.34 gain 144 129 -96.52 gain 129 145 -110.27 gain 145 129 -110.89 gain 129 146 -99.44 gain 146 129 -98.97 gain 129 147 -104.12 gain 147 129 -100.74 gain 129 148 -112.17 gain 148 129 -108.51 gain 129 149 -117.45 gain 149 129 -116.96 gain 129 150 -117.09 gain 150 129 -119.28 gain 129 151 -118.69 gain 151 129 -121.08 gain 129 152 -113.74 gain 152 129 -113.11 gain 129 153 -117.37 gain 153 129 -114.31 gain 129 154 -112.05 gain 154 129 -117.54 gain 129 155 -112.63 gain 155 129 -118.02 gain 129 156 -109.37 gain 156 129 -109.15 gain 129 157 -109.59 gain 157 129 -112.32 gain 129 158 -101.05 gain 158 129 -106.37 gain 129 159 -101.42 gain 159 129 -103.35 gain 129 160 -106.56 gain 160 129 -105.60 gain 129 161 -102.89 gain 161 129 -105.43 gain 129 162 -114.15 gain 162 129 -115.56 gain 129 163 -104.23 gain 163 129 -107.78 gain 129 164 -113.66 gain 164 129 -118.26 gain 129 165 -127.74 gain 165 129 -128.38 gain 129 166 -124.82 gain 166 129 -127.02 gain 129 167 -122.42 gain 167 129 -126.71 gain 129 168 -119.28 gain 168 129 -122.02 gain 129 169 -108.87 gain 169 129 -115.82 gain 129 170 -112.30 gain 170 129 -110.77 gain 129 171 -114.62 gain 171 129 -118.12 gain 129 172 -100.73 gain 172 129 -98.92 gain 129 173 -110.60 gain 173 129 -108.23 gain 129 174 -106.74 gain 174 129 -108.66 gain 129 175 -99.89 gain 175 129 -105.36 gain 129 176 -105.28 gain 176 129 -102.77 gain 129 177 -111.11 gain 177 129 -116.41 gain 129 178 -112.43 gain 178 129 -113.55 gain 129 179 -111.37 gain 179 129 -110.88 gain 129 180 -128.02 gain 180 129 -129.00 gain 129 181 -117.96 gain 181 129 -119.01 gain 129 182 -117.23 gain 182 129 -120.67 gain 129 183 -118.09 gain 183 129 -114.91 gain 129 184 -114.80 gain 184 129 -116.41 gain 129 185 -113.94 gain 185 129 -113.04 gain 129 186 -121.96 gain 186 129 -121.34 gain 129 187 -105.16 gain 187 129 -107.08 gain 129 188 -108.15 gain 188 129 -113.33 gain 129 189 -98.45 gain 189 129 -101.14 gain 129 190 -111.14 gain 190 129 -110.84 gain 129 191 -108.53 gain 191 129 -109.32 gain 129 192 -108.67 gain 192 129 -112.34 gain 129 193 -125.28 gain 193 129 -130.19 gain 129 194 -118.98 gain 194 129 -117.70 gain 129 195 -120.59 gain 195 129 -119.95 gain 129 196 -115.31 gain 196 129 -118.71 gain 129 197 -121.53 gain 197 129 -120.99 gain 129 198 -119.24 gain 198 129 -118.23 gain 129 199 -117.71 gain 199 129 -120.61 gain 129 200 -112.54 gain 200 129 -112.38 gain 129 201 -111.25 gain 201 129 -111.89 gain 129 202 -111.54 gain 202 129 -116.18 gain 129 203 -112.97 gain 203 129 -117.24 gain 129 204 -109.39 gain 204 129 -110.94 gain 129 205 -112.28 gain 205 129 -112.91 gain 129 206 -108.50 gain 206 129 -113.64 gain 129 207 -114.74 gain 207 129 -112.24 gain 129 208 -120.02 gain 208 129 -123.30 gain 129 209 -124.30 gain 209 129 -128.57 gain 129 210 -122.28 gain 210 129 -123.49 gain 129 211 -115.62 gain 211 129 -118.86 gain 129 212 -120.96 gain 212 129 -122.73 gain 129 213 -119.09 gain 213 129 -120.05 gain 129 214 -112.26 gain 214 129 -113.11 gain 129 215 -117.45 gain 215 129 -114.72 gain 129 216 -121.90 gain 216 129 -123.83 gain 129 217 -114.54 gain 217 129 -116.99 gain 129 218 -119.02 gain 218 129 -123.65 gain 129 219 -115.19 gain 219 129 -111.19 gain 129 220 -116.27 gain 220 129 -122.76 gain 129 221 -115.80 gain 221 129 -117.93 gain 129 222 -120.17 gain 222 129 -122.62 gain 129 223 -117.00 gain 223 129 -118.07 gain 129 224 -115.10 gain 224 129 -118.85 gain 130 131 -88.98 gain 131 130 -96.07 gain 130 132 -93.38 gain 132 130 -100.09 gain 130 133 -100.59 gain 133 130 -105.37 gain 130 134 -111.84 gain 134 130 -113.32 gain 130 135 -121.24 gain 135 130 -126.29 gain 130 136 -124.00 gain 136 130 -129.66 gain 130 137 -123.44 gain 137 130 -126.58 gain 130 138 -114.99 gain 138 130 -117.14 gain 130 139 -111.07 gain 139 130 -114.20 gain 130 140 -113.57 gain 140 130 -119.31 gain 130 141 -100.73 gain 141 130 -105.14 gain 130 142 -106.44 gain 142 130 -110.16 gain 130 143 -91.86 gain 143 130 -95.19 gain 130 144 -94.90 gain 144 130 -99.26 gain 130 145 -83.72 gain 145 130 -86.53 gain 130 146 -97.85 gain 146 130 -99.56 gain 130 147 -94.75 gain 147 130 -93.55 gain 130 148 -105.62 gain 148 130 -104.14 gain 130 149 -108.86 gain 149 130 -110.55 gain 130 150 -125.75 gain 150 130 -130.12 gain 130 151 -115.06 gain 151 130 -119.62 gain 130 152 -121.07 gain 152 130 -122.61 gain 130 153 -111.87 gain 153 130 -110.99 gain 130 154 -117.14 gain 154 130 -124.81 gain 130 155 -106.84 gain 155 130 -114.41 gain 130 156 -101.14 gain 156 130 -103.09 gain 130 157 -105.06 gain 157 130 -109.96 gain 130 158 -112.80 gain 158 130 -120.29 gain 130 159 -105.94 gain 159 130 -110.05 gain 130 160 -100.68 gain 160 130 -101.90 gain 130 161 -95.19 gain 161 130 -99.91 gain 130 162 -99.21 gain 162 130 -102.79 gain 130 163 -110.12 gain 163 130 -115.84 gain 130 164 -109.48 gain 164 130 -116.25 gain 130 165 -115.84 gain 165 130 -118.65 gain 130 166 -121.20 gain 166 130 -125.58 gain 130 167 -112.50 gain 167 130 -118.97 gain 130 168 -116.75 gain 168 130 -121.67 gain 130 169 -118.42 gain 169 130 -127.54 gain 130 170 -111.41 gain 170 130 -112.05 gain 130 171 -118.18 gain 171 130 -123.85 gain 130 172 -115.25 gain 172 130 -115.62 gain 130 173 -106.42 gain 173 130 -106.22 gain 130 174 -112.39 gain 174 130 -116.49 gain 130 175 -106.69 gain 175 130 -114.34 gain 130 176 -102.47 gain 176 130 -102.14 gain 130 177 -107.42 gain 177 130 -114.89 gain 130 178 -113.22 gain 178 130 -116.51 gain 130 179 -115.37 gain 179 130 -117.06 gain 130 180 -122.54 gain 180 130 -125.70 gain 130 181 -105.39 gain 181 130 -108.62 gain 130 182 -116.45 gain 182 130 -122.06 gain 130 183 -115.03 gain 183 130 -114.03 gain 130 184 -105.59 gain 184 130 -109.37 gain 130 185 -113.11 gain 185 130 -114.38 gain 130 186 -109.03 gain 186 130 -110.58 gain 130 187 -108.53 gain 187 130 -112.63 gain 130 188 -107.86 gain 188 130 -115.21 gain 130 189 -115.12 gain 189 130 -119.99 gain 130 190 -111.17 gain 190 130 -113.05 gain 130 191 -109.69 gain 191 130 -112.66 gain 130 192 -109.52 gain 192 130 -115.36 gain 130 193 -115.25 gain 193 130 -122.34 gain 130 194 -112.64 gain 194 130 -113.54 gain 130 195 -116.64 gain 195 130 -118.18 gain 130 196 -119.09 gain 196 130 -124.66 gain 130 197 -117.20 gain 197 130 -118.83 gain 130 198 -122.75 gain 198 130 -123.91 gain 130 199 -124.64 gain 199 130 -129.72 gain 130 200 -111.07 gain 200 130 -113.09 gain 130 201 -116.54 gain 201 130 -119.36 gain 130 202 -115.79 gain 202 130 -122.61 gain 130 203 -121.86 gain 203 130 -128.30 gain 130 204 -109.03 gain 204 130 -112.75 gain 130 205 -115.71 gain 205 130 -118.51 gain 130 206 -111.78 gain 206 130 -119.10 gain 130 207 -109.22 gain 207 130 -108.89 gain 130 208 -108.38 gain 208 130 -113.84 gain 130 209 -111.71 gain 209 130 -118.16 gain 130 210 -126.42 gain 210 130 -129.81 gain 130 211 -122.07 gain 211 130 -127.48 gain 130 212 -123.35 gain 212 130 -127.30 gain 130 213 -122.93 gain 213 130 -126.07 gain 130 214 -117.73 gain 214 130 -120.76 gain 130 215 -118.91 gain 215 130 -118.35 gain 130 216 -120.83 gain 216 130 -124.93 gain 130 217 -123.48 gain 217 130 -128.10 gain 130 218 -118.11 gain 218 130 -124.92 gain 130 219 -107.56 gain 219 130 -105.73 gain 130 220 -115.27 gain 220 130 -123.93 gain 130 221 -113.62 gain 221 130 -117.93 gain 130 222 -117.26 gain 222 130 -121.89 gain 130 223 -106.22 gain 223 130 -109.46 gain 130 224 -118.59 gain 224 130 -124.53 gain 131 132 -92.93 gain 132 131 -92.56 gain 131 133 -110.98 gain 133 131 -108.68 gain 131 134 -114.83 gain 134 131 -109.23 gain 131 135 -128.26 gain 135 131 -126.23 gain 131 136 -125.97 gain 136 131 -124.55 gain 131 137 -124.34 gain 137 131 -120.40 gain 131 138 -127.29 gain 138 131 -122.36 gain 131 139 -124.27 gain 139 131 -120.32 gain 131 140 -113.86 gain 140 131 -112.51 gain 131 141 -121.62 gain 141 131 -118.95 gain 131 142 -120.30 gain 142 131 -116.94 gain 131 143 -109.63 gain 143 131 -105.88 gain 131 144 -107.54 gain 144 131 -104.80 gain 131 145 -100.76 gain 145 131 -96.47 gain 131 146 -95.89 gain 146 131 -90.52 gain 131 147 -103.50 gain 147 131 -95.21 gain 131 148 -111.88 gain 148 131 -103.31 gain 131 149 -107.24 gain 149 131 -101.84 gain 131 150 -129.78 gain 150 131 -127.07 gain 131 151 -131.52 gain 151 131 -129.00 gain 131 152 -120.37 gain 152 131 -114.83 gain 131 153 -122.62 gain 153 131 -114.66 gain 131 154 -116.12 gain 154 131 -116.71 gain 131 155 -123.58 gain 155 131 -124.06 gain 131 156 -116.93 gain 156 131 -111.80 gain 131 157 -113.67 gain 157 131 -111.48 gain 131 158 -117.30 gain 158 131 -117.71 gain 131 159 -106.13 gain 159 131 -103.15 gain 131 160 -111.34 gain 160 131 -105.48 gain 131 161 -108.29 gain 161 131 -105.92 gain 131 162 -105.01 gain 162 131 -101.50 gain 131 163 -104.56 gain 163 131 -103.20 gain 131 164 -108.66 gain 164 131 -108.34 gain 131 165 -126.51 gain 165 131 -122.24 gain 131 166 -132.77 gain 166 131 -130.06 gain 131 167 -122.58 gain 167 131 -121.97 gain 131 168 -125.01 gain 168 131 -122.85 gain 131 169 -125.87 gain 169 131 -127.91 gain 131 170 -126.58 gain 170 131 -120.13 gain 131 171 -120.20 gain 171 131 -118.78 gain 131 172 -118.74 gain 172 131 -112.02 gain 131 173 -113.52 gain 173 131 -106.23 gain 131 174 -111.58 gain 174 131 -108.59 gain 131 175 -111.09 gain 175 131 -111.66 gain 131 176 -111.45 gain 176 131 -104.03 gain 131 177 -109.95 gain 177 131 -110.34 gain 131 178 -115.27 gain 178 131 -111.48 gain 131 179 -123.27 gain 179 131 -117.88 gain 131 180 -131.34 gain 180 131 -127.41 gain 131 181 -131.22 gain 181 131 -127.36 gain 131 182 -125.61 gain 182 131 -124.14 gain 131 183 -130.69 gain 183 131 -122.61 gain 131 184 -118.97 gain 184 131 -115.66 gain 131 185 -124.65 gain 185 131 -118.84 gain 131 186 -126.42 gain 186 131 -120.89 gain 131 187 -115.62 gain 187 131 -112.63 gain 131 188 -117.48 gain 188 131 -117.75 gain 131 189 -113.86 gain 189 131 -111.65 gain 131 190 -109.45 gain 190 131 -104.24 gain 131 191 -112.84 gain 191 131 -108.73 gain 131 192 -116.23 gain 192 131 -114.98 gain 131 193 -116.27 gain 193 131 -116.28 gain 131 194 -119.63 gain 194 131 -113.44 gain 131 195 -132.15 gain 195 131 -126.60 gain 131 196 -130.17 gain 196 131 -128.66 gain 131 197 -125.93 gain 197 131 -120.48 gain 131 198 -126.94 gain 198 131 -121.01 gain 131 199 -123.22 gain 199 131 -121.21 gain 131 200 -123.12 gain 200 131 -118.05 gain 131 201 -127.98 gain 201 131 -123.71 gain 131 202 -118.58 gain 202 131 -118.31 gain 131 203 -127.64 gain 203 131 -126.99 gain 131 204 -120.11 gain 204 131 -116.75 gain 131 205 -129.59 gain 205 131 -125.30 gain 131 206 -117.89 gain 206 131 -118.12 gain 131 207 -121.20 gain 207 131 -113.79 gain 131 208 -118.98 gain 208 131 -117.35 gain 131 209 -118.42 gain 209 131 -117.78 gain 131 210 -131.42 gain 210 131 -127.72 gain 131 211 -136.98 gain 211 131 -135.31 gain 131 212 -128.37 gain 212 131 -125.23 gain 131 213 -128.48 gain 213 131 -124.53 gain 131 214 -124.24 gain 214 131 -120.18 gain 131 215 -131.29 gain 215 131 -123.65 gain 131 216 -124.69 gain 216 131 -121.71 gain 131 217 -126.50 gain 217 131 -124.04 gain 131 218 -121.89 gain 218 131 -121.61 gain 131 219 -118.89 gain 219 131 -109.98 gain 131 220 -125.22 gain 220 131 -126.80 gain 131 221 -110.74 gain 221 131 -107.96 gain 131 222 -123.71 gain 222 131 -121.26 gain 131 223 -127.59 gain 223 131 -123.75 gain 131 224 -118.20 gain 224 131 -117.05 gain 132 133 -97.79 gain 133 132 -95.86 gain 132 134 -103.42 gain 134 132 -98.19 gain 132 135 -127.69 gain 135 132 -126.03 gain 132 136 -128.83 gain 136 132 -127.78 gain 132 137 -123.83 gain 137 132 -120.27 gain 132 138 -124.49 gain 138 132 -119.92 gain 132 139 -124.05 gain 139 132 -120.47 gain 132 140 -122.21 gain 140 132 -121.24 gain 132 141 -116.42 gain 141 132 -114.12 gain 132 142 -120.15 gain 142 132 -117.16 gain 132 143 -114.01 gain 143 132 -110.63 gain 132 144 -108.94 gain 144 132 -106.58 gain 132 145 -105.22 gain 145 132 -101.31 gain 132 146 -95.31 gain 146 132 -90.31 gain 132 147 -95.24 gain 147 132 -87.33 gain 132 148 -102.43 gain 148 132 -94.23 gain 132 149 -111.75 gain 149 132 -106.72 gain 132 150 -132.02 gain 150 132 -129.68 gain 132 151 -131.77 gain 151 132 -129.63 gain 132 152 -129.46 gain 152 132 -124.29 gain 132 153 -126.56 gain 153 132 -118.97 gain 132 154 -121.30 gain 154 132 -122.26 gain 132 155 -123.82 gain 155 132 -124.67 gain 132 156 -120.40 gain 156 132 -115.64 gain 132 157 -114.34 gain 157 132 -112.53 gain 132 158 -114.28 gain 158 132 -115.06 gain 132 159 -112.74 gain 159 132 -110.14 gain 132 160 -110.59 gain 160 132 -105.10 gain 132 161 -111.95 gain 161 132 -109.95 gain 132 162 -100.92 gain 162 132 -97.78 gain 132 163 -113.82 gain 163 132 -112.83 gain 132 164 -110.31 gain 164 132 -110.36 gain 132 165 -125.67 gain 165 132 -121.77 gain 132 166 -129.83 gain 166 132 -127.50 gain 132 167 -128.02 gain 167 132 -127.78 gain 132 168 -122.60 gain 168 132 -120.81 gain 132 169 -120.16 gain 169 132 -122.56 gain 132 170 -120.34 gain 170 132 -114.27 gain 132 171 -116.98 gain 171 132 -115.94 gain 132 172 -115.80 gain 172 132 -109.45 gain 132 173 -128.33 gain 173 132 -121.42 gain 132 174 -123.66 gain 174 132 -121.04 gain 132 175 -107.37 gain 175 132 -108.31 gain 132 176 -115.44 gain 176 132 -108.39 gain 132 177 -111.27 gain 177 132 -112.03 gain 132 178 -108.63 gain 178 132 -105.22 gain 132 179 -118.10 gain 179 132 -113.08 gain 132 180 -132.87 gain 180 132 -129.32 gain 132 181 -128.56 gain 181 132 -125.08 gain 132 182 -136.49 gain 182 132 -135.39 gain 132 183 -120.78 gain 183 132 -113.07 gain 132 184 -122.14 gain 184 132 -119.22 gain 132 185 -118.57 gain 185 132 -113.13 gain 132 186 -120.85 gain 186 132 -115.70 gain 132 187 -117.32 gain 187 132 -114.70 gain 132 188 -116.72 gain 188 132 -117.36 gain 132 189 -115.72 gain 189 132 -113.88 gain 132 190 -122.52 gain 190 132 -117.69 gain 132 191 -114.45 gain 191 132 -110.71 gain 132 192 -119.97 gain 192 132 -119.10 gain 132 193 -111.01 gain 193 132 -111.39 gain 132 194 -119.44 gain 194 132 -113.63 gain 132 195 -128.18 gain 195 132 -123.00 gain 132 196 -126.06 gain 196 132 -124.92 gain 132 197 -127.09 gain 197 132 -122.01 gain 132 198 -121.94 gain 198 132 -116.39 gain 132 199 -119.56 gain 199 132 -117.92 gain 132 200 -119.86 gain 200 132 -115.16 gain 132 201 -120.08 gain 201 132 -116.18 gain 132 202 -112.62 gain 202 132 -112.73 gain 132 203 -124.99 gain 203 132 -124.72 gain 132 204 -116.61 gain 204 132 -113.62 gain 132 205 -118.10 gain 205 132 -114.19 gain 132 206 -116.75 gain 206 132 -117.35 gain 132 207 -117.44 gain 207 132 -110.40 gain 132 208 -122.67 gain 208 132 -121.41 gain 132 209 -122.80 gain 209 132 -122.53 gain 132 210 -128.29 gain 210 132 -124.96 gain 132 211 -137.02 gain 211 132 -135.71 gain 132 212 -131.77 gain 212 132 -129.01 gain 132 213 -130.82 gain 213 132 -127.24 gain 132 214 -131.04 gain 214 132 -127.36 gain 132 215 -130.02 gain 215 132 -122.75 gain 132 216 -126.73 gain 216 132 -124.13 gain 132 217 -125.07 gain 217 132 -122.98 gain 132 218 -127.51 gain 218 132 -127.62 gain 132 219 -122.43 gain 219 132 -113.89 gain 132 220 -121.87 gain 220 132 -123.82 gain 132 221 -121.87 gain 221 132 -119.46 gain 132 222 -123.72 gain 222 132 -121.64 gain 132 223 -114.16 gain 223 132 -110.69 gain 132 224 -126.57 gain 224 132 -125.79 gain 133 134 -93.16 gain 134 133 -89.86 gain 133 135 -126.04 gain 135 133 -126.31 gain 133 136 -127.75 gain 136 133 -128.63 gain 133 137 -129.26 gain 137 133 -127.63 gain 133 138 -126.93 gain 138 133 -124.30 gain 133 139 -118.74 gain 139 133 -117.09 gain 133 140 -123.47 gain 140 133 -124.43 gain 133 141 -119.88 gain 141 133 -119.51 gain 133 142 -115.15 gain 142 133 -114.08 gain 133 143 -118.04 gain 143 133 -116.59 gain 133 144 -109.18 gain 144 133 -108.75 gain 133 145 -115.66 gain 145 133 -113.68 gain 133 146 -102.60 gain 146 133 -99.53 gain 133 147 -97.69 gain 147 133 -91.71 gain 133 148 -93.48 gain 148 133 -87.21 gain 133 149 -98.29 gain 149 133 -95.20 gain 133 150 -137.08 gain 150 133 -136.66 gain 133 151 -128.38 gain 151 133 -128.16 gain 133 152 -128.85 gain 152 133 -125.61 gain 133 153 -123.42 gain 153 133 -117.76 gain 133 154 -130.38 gain 154 133 -133.27 gain 133 155 -120.27 gain 155 133 -123.06 gain 133 156 -121.82 gain 156 133 -118.99 gain 133 157 -120.56 gain 157 133 -120.68 gain 133 158 -117.15 gain 158 133 -119.86 gain 133 159 -111.96 gain 159 133 -111.28 gain 133 160 -114.17 gain 160 133 -110.61 gain 133 161 -107.58 gain 161 133 -107.51 gain 133 162 -104.94 gain 162 133 -103.74 gain 133 163 -109.39 gain 163 133 -110.34 gain 133 164 -103.83 gain 164 133 -105.82 gain 133 165 -127.83 gain 165 133 -125.85 gain 133 166 -124.69 gain 166 133 -124.29 gain 133 167 -121.65 gain 167 133 -123.33 gain 133 168 -130.18 gain 168 133 -130.32 gain 133 169 -130.20 gain 169 133 -134.54 gain 133 170 -122.04 gain 170 133 -117.91 gain 133 171 -122.17 gain 171 133 -123.05 gain 133 172 -114.29 gain 172 133 -109.87 gain 133 173 -119.55 gain 173 133 -114.57 gain 133 174 -112.96 gain 174 133 -112.27 gain 133 175 -109.95 gain 175 133 -112.82 gain 133 176 -110.46 gain 176 133 -105.34 gain 133 177 -106.69 gain 177 133 -109.38 gain 133 178 -102.85 gain 178 133 -101.37 gain 133 179 -113.31 gain 179 133 -110.22 gain 133 180 -122.38 gain 180 133 -120.75 gain 133 181 -126.33 gain 181 133 -124.77 gain 133 182 -123.17 gain 182 133 -124.00 gain 133 183 -125.62 gain 183 133 -119.84 gain 133 184 -122.32 gain 184 133 -121.32 gain 133 185 -125.02 gain 185 133 -121.51 gain 133 186 -118.30 gain 186 133 -115.08 gain 133 187 -119.45 gain 187 133 -118.76 gain 133 188 -116.55 gain 188 133 -119.12 gain 133 189 -122.79 gain 189 133 -122.88 gain 133 190 -115.88 gain 190 133 -112.98 gain 133 191 -110.70 gain 191 133 -108.89 gain 133 192 -112.65 gain 192 133 -113.70 gain 133 193 -115.07 gain 193 133 -117.38 gain 133 194 -112.66 gain 194 133 -108.78 gain 133 195 -133.78 gain 195 133 -130.53 gain 133 196 -131.07 gain 196 133 -131.86 gain 133 197 -125.42 gain 197 133 -122.27 gain 133 198 -128.92 gain 198 133 -125.29 gain 133 199 -126.09 gain 199 133 -126.39 gain 133 200 -120.27 gain 200 133 -117.50 gain 133 201 -119.45 gain 201 133 -117.49 gain 133 202 -113.71 gain 202 133 -115.74 gain 133 203 -122.76 gain 203 133 -124.42 gain 133 204 -106.44 gain 204 133 -105.38 gain 133 205 -122.01 gain 205 133 -120.03 gain 133 206 -118.48 gain 206 133 -121.01 gain 133 207 -116.25 gain 207 133 -111.15 gain 133 208 -112.56 gain 208 133 -113.23 gain 133 209 -116.39 gain 209 133 -118.06 gain 133 210 -130.78 gain 210 133 -129.38 gain 133 211 -128.03 gain 211 133 -128.66 gain 133 212 -130.00 gain 212 133 -129.17 gain 133 213 -128.67 gain 213 133 -127.03 gain 133 214 -124.39 gain 214 133 -122.64 gain 133 215 -128.33 gain 215 133 -123.00 gain 133 216 -119.98 gain 216 133 -119.31 gain 133 217 -125.15 gain 217 133 -124.99 gain 133 218 -127.02 gain 218 133 -129.05 gain 133 219 -120.39 gain 219 133 -113.78 gain 133 220 -115.61 gain 220 133 -119.49 gain 133 221 -118.26 gain 221 133 -117.79 gain 133 222 -110.70 gain 222 133 -110.55 gain 133 223 -116.82 gain 223 133 -115.28 gain 133 224 -115.34 gain 224 133 -116.49 gain 134 135 -128.75 gain 135 134 -132.32 gain 134 136 -126.69 gain 136 134 -130.87 gain 134 137 -121.79 gain 137 134 -123.46 gain 134 138 -119.32 gain 138 134 -119.98 gain 134 139 -121.47 gain 139 134 -123.12 gain 134 140 -119.35 gain 140 134 -123.61 gain 134 141 -118.23 gain 141 134 -121.16 gain 134 142 -116.81 gain 142 134 -119.04 gain 134 143 -108.92 gain 143 134 -110.77 gain 134 144 -114.68 gain 144 134 -117.55 gain 134 145 -105.48 gain 145 134 -106.80 gain 134 146 -100.96 gain 146 134 -101.19 gain 134 147 -103.51 gain 147 134 -100.82 gain 134 148 -93.80 gain 148 134 -90.84 gain 134 149 -89.50 gain 149 134 -89.70 gain 134 150 -130.41 gain 150 134 -133.30 gain 134 151 -124.92 gain 151 134 -128.01 gain 134 152 -126.24 gain 152 134 -126.30 gain 134 153 -122.74 gain 153 134 -120.38 gain 134 154 -122.87 gain 154 134 -129.06 gain 134 155 -118.58 gain 155 134 -124.66 gain 134 156 -119.03 gain 156 134 -119.50 gain 134 157 -113.59 gain 157 134 -117.01 gain 134 158 -120.01 gain 158 134 -126.02 gain 134 159 -110.46 gain 159 134 -113.09 gain 134 160 -110.62 gain 160 134 -110.36 gain 134 161 -116.69 gain 161 134 -119.92 gain 134 162 -103.89 gain 162 134 -105.99 gain 134 163 -101.71 gain 163 134 -105.95 gain 134 164 -98.84 gain 164 134 -104.12 gain 134 165 -122.54 gain 165 134 -123.87 gain 134 166 -117.38 gain 166 134 -120.28 gain 134 167 -124.69 gain 167 134 -129.68 gain 134 168 -120.35 gain 168 134 -123.79 gain 134 169 -122.27 gain 169 134 -129.90 gain 134 170 -120.64 gain 170 134 -119.80 gain 134 171 -124.79 gain 171 134 -128.98 gain 134 172 -119.56 gain 172 134 -118.45 gain 134 173 -113.42 gain 173 134 -111.74 gain 134 174 -116.33 gain 174 134 -118.94 gain 134 175 -112.77 gain 175 134 -118.93 gain 134 176 -109.47 gain 176 134 -107.65 gain 134 177 -109.81 gain 177 134 -115.81 gain 134 178 -100.47 gain 178 134 -102.29 gain 134 179 -100.26 gain 179 134 -100.47 gain 134 180 -127.57 gain 180 134 -129.25 gain 134 181 -123.10 gain 181 134 -124.84 gain 134 182 -120.86 gain 182 134 -124.99 gain 134 183 -117.89 gain 183 134 -115.41 gain 134 184 -122.29 gain 184 134 -124.59 gain 134 185 -117.67 gain 185 134 -117.46 gain 134 186 -117.89 gain 186 134 -117.96 gain 134 187 -119.89 gain 187 134 -122.50 gain 134 188 -120.20 gain 188 134 -126.07 gain 134 189 -110.40 gain 189 134 -113.78 gain 134 190 -114.98 gain 190 134 -115.38 gain 134 191 -112.36 gain 191 134 -113.85 gain 134 192 -113.41 gain 192 134 -117.77 gain 134 193 -107.34 gain 193 134 -112.94 gain 134 194 -119.94 gain 194 134 -119.36 gain 134 195 -132.59 gain 195 134 -132.64 gain 134 196 -125.55 gain 196 134 -129.64 gain 134 197 -123.67 gain 197 134 -123.82 gain 134 198 -125.18 gain 198 134 -124.86 gain 134 199 -120.38 gain 199 134 -123.97 gain 134 200 -123.61 gain 200 134 -124.14 gain 134 201 -120.23 gain 201 134 -121.56 gain 134 202 -119.94 gain 202 134 -125.28 gain 134 203 -117.25 gain 203 134 -122.20 gain 134 204 -116.88 gain 204 134 -119.12 gain 134 205 -112.22 gain 205 134 -113.54 gain 134 206 -120.33 gain 206 134 -126.16 gain 134 207 -102.99 gain 207 134 -101.18 gain 134 208 -110.53 gain 208 134 -114.51 gain 134 209 -111.09 gain 209 134 -116.06 gain 134 210 -132.92 gain 210 134 -134.82 gain 134 211 -134.25 gain 211 134 -138.18 gain 134 212 -126.04 gain 212 134 -128.51 gain 134 213 -124.16 gain 213 134 -125.81 gain 134 214 -116.88 gain 214 134 -118.42 gain 134 215 -125.40 gain 215 134 -123.36 gain 134 216 -126.92 gain 216 134 -129.54 gain 134 217 -118.61 gain 217 134 -121.75 gain 134 218 -116.76 gain 218 134 -122.10 gain 134 219 -119.95 gain 219 134 -116.64 gain 134 220 -116.40 gain 220 134 -123.58 gain 134 221 -111.19 gain 221 134 -114.02 gain 134 222 -115.28 gain 222 134 -118.42 gain 134 223 -108.02 gain 223 134 -109.78 gain 134 224 -111.47 gain 224 134 -115.92 gain 135 136 -89.17 gain 136 135 -89.78 gain 135 137 -100.17 gain 137 135 -98.27 gain 135 138 -112.40 gain 138 135 -109.49 gain 135 139 -110.62 gain 139 135 -108.70 gain 135 140 -107.48 gain 140 135 -108.17 gain 135 141 -120.98 gain 141 135 -120.34 gain 135 142 -121.17 gain 142 135 -119.84 gain 135 143 -122.16 gain 143 135 -120.44 gain 135 144 -120.94 gain 144 135 -120.24 gain 135 145 -129.78 gain 145 135 -127.53 gain 135 146 -129.32 gain 146 135 -125.97 gain 135 147 -123.74 gain 147 135 -117.49 gain 135 148 -116.89 gain 148 135 -110.35 gain 135 149 -130.05 gain 149 135 -126.69 gain 135 150 -95.43 gain 150 135 -94.75 gain 135 151 -101.39 gain 151 135 -100.90 gain 135 152 -105.29 gain 152 135 -101.78 gain 135 153 -104.17 gain 153 135 -98.24 gain 135 154 -113.25 gain 154 135 -115.87 gain 135 155 -115.66 gain 155 135 -118.18 gain 135 156 -118.29 gain 156 135 -115.19 gain 135 157 -123.31 gain 157 135 -123.16 gain 135 158 -125.72 gain 158 135 -128.16 gain 135 159 -118.93 gain 159 135 -117.99 gain 135 160 -125.20 gain 160 135 -121.37 gain 135 161 -125.70 gain 161 135 -125.36 gain 135 162 -127.15 gain 162 135 -125.68 gain 135 163 -126.95 gain 163 135 -127.62 gain 135 164 -128.57 gain 164 135 -130.28 gain 135 165 -108.06 gain 165 135 -105.82 gain 135 166 -101.99 gain 166 135 -101.32 gain 135 167 -105.53 gain 167 135 -106.95 gain 135 168 -114.19 gain 168 135 -114.06 gain 135 169 -120.70 gain 169 135 -124.76 gain 135 170 -119.45 gain 170 135 -115.04 gain 135 171 -121.67 gain 171 135 -122.29 gain 135 172 -121.24 gain 172 135 -116.55 gain 135 173 -122.59 gain 173 135 -117.34 gain 135 174 -123.19 gain 174 135 -122.23 gain 135 175 -127.52 gain 175 135 -130.12 gain 135 176 -126.18 gain 176 135 -120.79 gain 135 177 -137.81 gain 177 135 -140.23 gain 135 178 -136.65 gain 178 135 -134.90 gain 135 179 -131.78 gain 179 135 -128.42 gain 135 180 -120.69 gain 180 135 -118.80 gain 135 181 -109.01 gain 181 135 -107.18 gain 135 182 -113.72 gain 182 135 -114.28 gain 135 183 -120.00 gain 183 135 -113.95 gain 135 184 -114.07 gain 184 135 -112.80 gain 135 185 -125.43 gain 185 135 -121.65 gain 135 186 -116.06 gain 186 135 -112.56 gain 135 187 -115.73 gain 187 135 -114.77 gain 135 188 -121.29 gain 188 135 -123.59 gain 135 189 -121.95 gain 189 135 -121.76 gain 135 190 -126.81 gain 190 135 -123.64 gain 135 191 -131.91 gain 191 135 -129.83 gain 135 192 -123.83 gain 192 135 -124.62 gain 135 193 -131.98 gain 193 135 -134.01 gain 135 194 -133.10 gain 194 135 -128.95 gain 135 195 -116.12 gain 195 135 -112.60 gain 135 196 -119.69 gain 196 135 -120.21 gain 135 197 -114.14 gain 197 135 -110.72 gain 135 198 -118.71 gain 198 135 -114.81 gain 135 199 -119.84 gain 199 135 -119.86 gain 135 200 -118.77 gain 200 135 -115.73 gain 135 201 -122.53 gain 201 135 -120.29 gain 135 202 -122.71 gain 202 135 -124.47 gain 135 203 -127.40 gain 203 135 -128.79 gain 135 204 -126.36 gain 204 135 -125.03 gain 135 205 -123.49 gain 205 135 -121.23 gain 135 206 -127.99 gain 206 135 -130.26 gain 135 207 -129.26 gain 207 135 -123.89 gain 135 208 -128.77 gain 208 135 -129.18 gain 135 209 -130.65 gain 209 135 -132.05 gain 135 210 -115.22 gain 210 135 -113.55 gain 135 211 -107.94 gain 211 135 -108.29 gain 135 212 -113.42 gain 212 135 -112.32 gain 135 213 -121.54 gain 213 135 -119.63 gain 135 214 -117.79 gain 214 135 -115.76 gain 135 215 -124.13 gain 215 135 -118.52 gain 135 216 -117.91 gain 216 135 -116.96 gain 135 217 -124.82 gain 217 135 -124.40 gain 135 218 -127.12 gain 218 135 -128.88 gain 135 219 -120.71 gain 219 135 -113.84 gain 135 220 -128.69 gain 220 135 -132.30 gain 135 221 -128.83 gain 221 135 -128.08 gain 135 222 -128.51 gain 222 135 -128.09 gain 135 223 -131.48 gain 223 135 -129.67 gain 135 224 -120.92 gain 224 135 -121.81 gain 136 137 -91.18 gain 137 136 -88.66 gain 136 138 -104.62 gain 138 136 -101.10 gain 136 139 -105.08 gain 139 136 -102.55 gain 136 140 -111.94 gain 140 136 -112.02 gain 136 141 -119.64 gain 141 136 -118.39 gain 136 142 -109.75 gain 142 136 -107.81 gain 136 143 -126.41 gain 143 136 -124.08 gain 136 144 -126.23 gain 144 136 -124.92 gain 136 145 -130.12 gain 145 136 -127.26 gain 136 146 -128.07 gain 146 136 -124.12 gain 136 147 -115.89 gain 147 136 -109.02 gain 136 148 -127.88 gain 148 136 -120.74 gain 136 149 -129.58 gain 149 136 -125.60 gain 136 150 -94.58 gain 150 136 -93.29 gain 136 151 -92.58 gain 151 136 -91.49 gain 136 152 -102.13 gain 152 136 -98.02 gain 136 153 -109.43 gain 153 136 -102.89 gain 136 154 -110.62 gain 154 136 -112.62 gain 136 155 -117.87 gain 155 136 -119.77 gain 136 156 -123.34 gain 156 136 -119.63 gain 136 157 -116.81 gain 157 136 -116.05 gain 136 158 -113.85 gain 158 136 -115.68 gain 136 159 -126.81 gain 159 136 -125.26 gain 136 160 -123.96 gain 160 136 -119.52 gain 136 161 -122.95 gain 161 136 -122.00 gain 136 162 -127.76 gain 162 136 -125.67 gain 136 163 -130.27 gain 163 136 -130.33 gain 136 164 -122.73 gain 164 136 -123.83 gain 136 165 -99.48 gain 165 136 -96.63 gain 136 166 -107.45 gain 166 136 -106.17 gain 136 167 -109.76 gain 167 136 -110.56 gain 136 168 -113.77 gain 168 136 -113.02 gain 136 169 -111.46 gain 169 136 -114.92 gain 136 170 -111.13 gain 170 136 -106.11 gain 136 171 -110.29 gain 171 136 -110.29 gain 136 172 -121.26 gain 172 136 -115.96 gain 136 173 -123.43 gain 173 136 -117.56 gain 136 174 -123.41 gain 174 136 -121.84 gain 136 175 -129.97 gain 175 136 -131.96 gain 136 176 -125.76 gain 176 136 -119.76 gain 136 177 -129.41 gain 177 136 -131.23 gain 136 178 -129.83 gain 178 136 -127.47 gain 136 179 -130.57 gain 179 136 -126.59 gain 136 180 -111.08 gain 180 136 -108.57 gain 136 181 -108.39 gain 181 136 -105.95 gain 136 182 -114.22 gain 182 136 -114.17 gain 136 183 -111.76 gain 183 136 -105.10 gain 136 184 -113.88 gain 184 136 -112.01 gain 136 185 -118.92 gain 185 136 -114.53 gain 136 186 -121.03 gain 186 136 -116.92 gain 136 187 -121.66 gain 187 136 -120.09 gain 136 188 -121.17 gain 188 136 -122.86 gain 136 189 -123.99 gain 189 136 -123.20 gain 136 190 -126.16 gain 190 136 -122.38 gain 136 191 -118.62 gain 191 136 -115.93 gain 136 192 -127.47 gain 192 136 -127.65 gain 136 193 -124.23 gain 193 136 -125.65 gain 136 194 -135.56 gain 194 136 -130.80 gain 136 195 -110.49 gain 195 136 -106.36 gain 136 196 -110.80 gain 196 136 -110.71 gain 136 197 -114.64 gain 197 136 -110.61 gain 136 198 -113.18 gain 198 136 -108.68 gain 136 199 -112.87 gain 199 136 -112.28 gain 136 200 -114.66 gain 200 136 -111.00 gain 136 201 -117.32 gain 201 136 -114.47 gain 136 202 -122.19 gain 202 136 -123.34 gain 136 203 -126.06 gain 203 136 -126.84 gain 136 204 -121.33 gain 204 136 -119.39 gain 136 205 -134.82 gain 205 136 -131.95 gain 136 206 -126.14 gain 206 136 -127.80 gain 136 207 -129.77 gain 207 136 -123.79 gain 136 208 -132.98 gain 208 136 -132.77 gain 136 209 -126.05 gain 209 136 -126.84 gain 136 210 -115.48 gain 210 136 -113.20 gain 136 211 -113.80 gain 211 136 -113.54 gain 136 212 -114.96 gain 212 136 -113.25 gain 136 213 -109.46 gain 213 136 -106.94 gain 136 214 -120.56 gain 214 136 -117.92 gain 136 215 -112.72 gain 215 136 -106.50 gain 136 216 -121.22 gain 216 136 -119.66 gain 136 217 -117.66 gain 217 136 -116.62 gain 136 218 -122.63 gain 218 136 -123.78 gain 136 219 -126.03 gain 219 136 -118.54 gain 136 220 -126.53 gain 220 136 -129.53 gain 136 221 -122.47 gain 221 136 -121.11 gain 136 222 -134.31 gain 222 136 -133.27 gain 136 223 -125.38 gain 223 136 -122.96 gain 136 224 -135.48 gain 224 136 -135.75 gain 137 138 -92.96 gain 138 137 -91.95 gain 137 139 -98.65 gain 139 137 -98.63 gain 137 140 -108.12 gain 140 137 -110.71 gain 137 141 -106.78 gain 141 137 -108.04 gain 137 142 -120.66 gain 142 137 -121.23 gain 137 143 -116.15 gain 143 137 -116.34 gain 137 144 -115.39 gain 144 137 -116.60 gain 137 145 -116.38 gain 145 137 -116.04 gain 137 146 -122.63 gain 146 137 -121.19 gain 137 147 -117.00 gain 147 137 -112.65 gain 137 148 -121.98 gain 148 137 -117.35 gain 137 149 -130.35 gain 149 137 -128.89 gain 137 150 -103.96 gain 150 137 -105.18 gain 137 151 -106.42 gain 151 137 -107.84 gain 137 152 -92.80 gain 152 137 -91.20 gain 137 153 -92.36 gain 153 137 -88.34 gain 137 154 -107.81 gain 154 137 -112.33 gain 137 155 -112.49 gain 155 137 -116.91 gain 137 156 -114.02 gain 156 137 -112.83 gain 137 157 -110.17 gain 157 137 -111.92 gain 137 158 -111.62 gain 158 137 -115.97 gain 137 159 -116.36 gain 159 137 -117.32 gain 137 160 -125.33 gain 160 137 -123.41 gain 137 161 -128.91 gain 161 137 -130.47 gain 137 162 -120.10 gain 162 137 -120.53 gain 137 163 -120.12 gain 163 137 -122.70 gain 137 164 -129.60 gain 164 137 -133.22 gain 137 165 -105.52 gain 165 137 -105.19 gain 137 166 -99.65 gain 166 137 -100.88 gain 137 167 -97.57 gain 167 137 -100.89 gain 137 168 -99.84 gain 168 137 -101.61 gain 137 169 -111.31 gain 169 137 -117.28 gain 137 170 -102.53 gain 170 137 -100.02 gain 137 171 -115.27 gain 171 137 -117.79 gain 137 172 -115.00 gain 172 137 -112.22 gain 137 173 -114.54 gain 173 137 -111.19 gain 137 174 -113.79 gain 174 137 -114.74 gain 137 175 -114.84 gain 175 137 -119.35 gain 137 176 -115.13 gain 176 137 -111.65 gain 137 177 -126.82 gain 177 137 -131.15 gain 137 178 -129.73 gain 178 137 -129.88 gain 137 179 -124.10 gain 179 137 -122.64 gain 137 180 -116.73 gain 180 137 -116.75 gain 137 181 -107.94 gain 181 137 -108.02 gain 137 182 -111.26 gain 182 137 -113.72 gain 137 183 -110.69 gain 183 137 -106.54 gain 137 184 -107.50 gain 184 137 -108.14 gain 137 185 -113.74 gain 185 137 -111.87 gain 137 186 -105.84 gain 186 137 -104.25 gain 137 187 -119.17 gain 187 137 -120.12 gain 137 188 -122.21 gain 188 137 -126.42 gain 137 189 -111.70 gain 189 137 -113.42 gain 137 190 -126.33 gain 190 137 -125.06 gain 137 191 -121.70 gain 191 137 -121.53 gain 137 192 -121.41 gain 192 137 -124.10 gain 137 193 -123.46 gain 193 137 -127.40 gain 137 194 -118.11 gain 194 137 -115.86 gain 137 195 -111.34 gain 195 137 -109.72 gain 137 196 -109.08 gain 196 137 -111.51 gain 137 197 -102.68 gain 197 137 -101.17 gain 137 198 -107.97 gain 198 137 -105.98 gain 137 199 -112.96 gain 199 137 -114.89 gain 137 200 -112.82 gain 200 137 -111.68 gain 137 201 -111.47 gain 201 137 -111.14 gain 137 202 -122.45 gain 202 137 -126.12 gain 137 203 -117.89 gain 203 137 -121.18 gain 137 204 -115.45 gain 204 137 -116.02 gain 137 205 -130.14 gain 205 137 -129.79 gain 137 206 -118.26 gain 206 137 -122.43 gain 137 207 -128.86 gain 207 137 -125.39 gain 137 208 -128.89 gain 208 137 -131.19 gain 137 209 -124.89 gain 209 137 -128.19 gain 137 210 -108.96 gain 210 137 -109.20 gain 137 211 -121.41 gain 211 137 -123.67 gain 137 212 -114.46 gain 212 137 -115.27 gain 137 213 -117.45 gain 213 137 -117.45 gain 137 214 -108.15 gain 214 137 -108.04 gain 137 215 -112.63 gain 215 137 -108.92 gain 137 216 -113.19 gain 216 137 -114.15 gain 137 217 -113.80 gain 217 137 -115.27 gain 137 218 -123.31 gain 218 137 -126.98 gain 137 219 -116.89 gain 219 137 -111.92 gain 137 220 -121.95 gain 220 137 -127.46 gain 137 221 -124.01 gain 221 137 -125.17 gain 137 222 -127.99 gain 222 137 -129.47 gain 137 223 -124.18 gain 223 137 -124.28 gain 137 224 -128.78 gain 224 137 -131.57 gain 138 139 -94.96 gain 139 138 -95.95 gain 138 140 -99.11 gain 140 138 -102.70 gain 138 141 -98.41 gain 141 138 -100.67 gain 138 142 -104.02 gain 142 138 -105.59 gain 138 143 -109.93 gain 143 138 -111.12 gain 138 144 -116.53 gain 144 138 -118.74 gain 138 145 -117.19 gain 145 138 -117.85 gain 138 146 -116.60 gain 146 138 -116.16 gain 138 147 -121.45 gain 147 138 -118.10 gain 138 148 -122.86 gain 148 138 -119.23 gain 138 149 -120.83 gain 149 138 -120.37 gain 138 150 -106.79 gain 150 138 -109.02 gain 138 151 -105.12 gain 151 138 -107.54 gain 138 152 -95.33 gain 152 138 -94.72 gain 138 153 -98.55 gain 153 138 -95.53 gain 138 154 -96.20 gain 154 138 -101.72 gain 138 155 -99.47 gain 155 138 -104.89 gain 138 156 -106.05 gain 156 138 -105.86 gain 138 157 -117.23 gain 157 138 -119.98 gain 138 158 -114.09 gain 158 138 -119.44 gain 138 159 -113.01 gain 159 138 -114.98 gain 138 160 -118.60 gain 160 138 -117.67 gain 138 161 -122.25 gain 161 138 -124.82 gain 138 162 -119.34 gain 162 138 -120.77 gain 138 163 -122.07 gain 163 138 -125.65 gain 138 164 -120.90 gain 164 138 -125.52 gain 138 165 -110.19 gain 165 138 -110.85 gain 138 166 -108.42 gain 166 138 -110.65 gain 138 167 -105.52 gain 167 138 -109.85 gain 138 168 -97.45 gain 168 138 -100.23 gain 138 169 -98.76 gain 169 138 -105.73 gain 138 170 -102.04 gain 170 138 -100.54 gain 138 171 -108.29 gain 171 138 -111.82 gain 138 172 -111.67 gain 172 138 -109.89 gain 138 173 -114.20 gain 173 138 -111.85 gain 138 174 -117.54 gain 174 138 -119.49 gain 138 175 -117.87 gain 175 138 -123.37 gain 138 176 -118.36 gain 176 138 -115.88 gain 138 177 -114.84 gain 177 138 -120.16 gain 138 178 -122.16 gain 178 138 -123.31 gain 138 179 -120.03 gain 179 138 -119.57 gain 138 180 -112.73 gain 180 138 -113.74 gain 138 181 -109.84 gain 181 138 -110.92 gain 138 182 -119.56 gain 182 138 -123.03 gain 138 183 -112.37 gain 183 138 -109.22 gain 138 184 -107.53 gain 184 138 -109.17 gain 138 185 -111.54 gain 185 138 -110.67 gain 138 186 -113.33 gain 186 138 -112.74 gain 138 187 -113.75 gain 187 138 -115.70 gain 138 188 -112.14 gain 188 138 -117.35 gain 138 189 -112.07 gain 189 138 -114.79 gain 138 190 -127.16 gain 190 138 -126.89 gain 138 191 -119.15 gain 191 138 -119.97 gain 138 192 -121.43 gain 192 138 -125.12 gain 138 193 -125.76 gain 193 138 -130.71 gain 138 194 -120.88 gain 194 138 -119.64 gain 138 195 -109.40 gain 195 138 -108.79 gain 138 196 -106.76 gain 196 138 -110.19 gain 138 197 -113.31 gain 197 138 -112.80 gain 138 198 -116.45 gain 198 138 -115.46 gain 138 199 -112.59 gain 199 138 -115.52 gain 138 200 -109.94 gain 200 138 -109.80 gain 138 201 -111.80 gain 201 138 -112.47 gain 138 202 -109.77 gain 202 138 -114.44 gain 138 203 -116.65 gain 203 138 -120.95 gain 138 204 -116.63 gain 204 138 -118.21 gain 138 205 -121.50 gain 205 138 -122.15 gain 138 206 -120.82 gain 206 138 -125.99 gain 138 207 -120.69 gain 207 138 -118.22 gain 138 208 -112.66 gain 208 138 -115.97 gain 138 209 -119.50 gain 209 138 -123.80 gain 138 210 -111.61 gain 210 138 -112.85 gain 138 211 -113.81 gain 211 138 -117.07 gain 138 212 -103.94 gain 212 138 -105.74 gain 138 213 -116.01 gain 213 138 -117.01 gain 138 214 -113.44 gain 214 138 -114.32 gain 138 215 -112.48 gain 215 138 -109.78 gain 138 216 -114.64 gain 216 138 -116.60 gain 138 217 -112.13 gain 217 138 -114.61 gain 138 218 -116.64 gain 218 138 -121.31 gain 138 219 -120.30 gain 219 138 -116.33 gain 138 220 -117.87 gain 220 138 -124.39 gain 138 221 -121.23 gain 221 138 -123.39 gain 138 222 -124.25 gain 222 138 -126.74 gain 138 223 -121.56 gain 223 138 -122.66 gain 138 224 -131.17 gain 224 138 -134.96 gain 139 140 -103.75 gain 140 139 -106.36 gain 139 141 -104.73 gain 141 139 -106.01 gain 139 142 -107.60 gain 142 139 -108.19 gain 139 143 -114.13 gain 143 139 -114.33 gain 139 144 -116.66 gain 144 139 -117.88 gain 139 145 -116.90 gain 145 139 -116.57 gain 139 146 -119.43 gain 146 139 -118.01 gain 139 147 -115.03 gain 147 139 -110.70 gain 139 148 -122.16 gain 148 139 -117.55 gain 139 149 -119.60 gain 149 139 -118.15 gain 139 150 -115.46 gain 150 139 -116.70 gain 139 151 -109.19 gain 151 139 -110.62 gain 139 152 -104.48 gain 152 139 -102.89 gain 139 153 -100.19 gain 153 139 -96.18 gain 139 154 -94.27 gain 154 139 -98.81 gain 139 155 -98.94 gain 155 139 -103.38 gain 139 156 -104.90 gain 156 139 -103.72 gain 139 157 -111.17 gain 157 139 -112.94 gain 139 158 -116.51 gain 158 139 -120.87 gain 139 159 -113.09 gain 159 139 -114.07 gain 139 160 -123.29 gain 160 139 -121.38 gain 139 161 -121.77 gain 161 139 -123.35 gain 139 162 -114.78 gain 162 139 -115.22 gain 139 163 -124.70 gain 163 139 -127.29 gain 139 164 -122.84 gain 164 139 -126.48 gain 139 165 -122.04 gain 165 139 -121.72 gain 139 166 -107.11 gain 166 139 -108.36 gain 139 167 -108.03 gain 167 139 -111.37 gain 139 168 -100.02 gain 168 139 -101.81 gain 139 169 -101.64 gain 169 139 -107.63 gain 139 170 -112.35 gain 170 139 -109.87 gain 139 171 -108.53 gain 171 139 -111.07 gain 139 172 -108.52 gain 172 139 -105.76 gain 139 173 -114.00 gain 173 139 -110.67 gain 139 174 -114.77 gain 174 139 -115.74 gain 139 175 -117.86 gain 175 139 -122.38 gain 139 176 -114.25 gain 176 139 -110.78 gain 139 177 -118.69 gain 177 139 -123.03 gain 139 178 -119.01 gain 178 139 -119.18 gain 139 179 -114.07 gain 179 139 -112.63 gain 139 180 -120.21 gain 180 139 -120.24 gain 139 181 -109.90 gain 181 139 -109.99 gain 139 182 -109.66 gain 182 139 -112.14 gain 139 183 -109.33 gain 183 139 -105.20 gain 139 184 -106.33 gain 184 139 -106.98 gain 139 185 -111.23 gain 185 139 -109.36 gain 139 186 -109.39 gain 186 139 -107.82 gain 139 187 -111.81 gain 187 139 -112.77 gain 139 188 -115.49 gain 188 139 -119.72 gain 139 189 -115.65 gain 189 139 -117.39 gain 139 190 -125.67 gain 190 139 -124.42 gain 139 191 -125.04 gain 191 139 -124.88 gain 139 192 -121.18 gain 192 139 -123.88 gain 139 193 -115.68 gain 193 139 -119.64 gain 139 194 -126.55 gain 194 139 -124.32 gain 139 195 -108.24 gain 195 139 -106.64 gain 139 196 -114.27 gain 196 139 -116.71 gain 139 197 -108.21 gain 197 139 -106.72 gain 139 198 -117.80 gain 198 139 -115.83 gain 139 199 -110.19 gain 199 139 -112.14 gain 139 200 -108.17 gain 200 139 -107.05 gain 139 201 -113.60 gain 201 139 -113.29 gain 139 202 -108.63 gain 202 139 -112.32 gain 139 203 -119.02 gain 203 139 -122.32 gain 139 204 -114.10 gain 204 139 -114.69 gain 139 205 -119.37 gain 205 139 -119.04 gain 139 206 -114.94 gain 206 139 -119.13 gain 139 207 -123.69 gain 207 139 -120.24 gain 139 208 -122.53 gain 208 139 -124.85 gain 139 209 -121.09 gain 209 139 -124.40 gain 139 210 -119.24 gain 210 139 -119.49 gain 139 211 -107.43 gain 211 139 -109.71 gain 139 212 -117.18 gain 212 139 -118.00 gain 139 213 -118.57 gain 213 139 -118.58 gain 139 214 -114.97 gain 214 139 -114.87 gain 139 215 -122.30 gain 215 139 -118.61 gain 139 216 -113.34 gain 216 139 -114.32 gain 139 217 -114.92 gain 217 139 -116.41 gain 139 218 -112.66 gain 218 139 -116.34 gain 139 219 -117.62 gain 219 139 -112.66 gain 139 220 -116.86 gain 220 139 -122.39 gain 139 221 -117.52 gain 221 139 -118.69 gain 139 222 -122.06 gain 222 139 -123.56 gain 139 223 -120.85 gain 223 139 -120.96 gain 139 224 -124.20 gain 224 139 -127.00 gain 140 141 -95.73 gain 141 140 -94.40 gain 140 142 -110.61 gain 142 140 -108.59 gain 140 143 -107.28 gain 143 140 -104.88 gain 140 144 -121.47 gain 144 140 -120.09 gain 140 145 -114.64 gain 145 140 -111.70 gain 140 146 -114.10 gain 146 140 -110.07 gain 140 147 -119.68 gain 147 140 -112.74 gain 140 148 -126.93 gain 148 140 -119.71 gain 140 149 -129.54 gain 149 140 -125.49 gain 140 150 -119.10 gain 150 140 -117.73 gain 140 151 -115.90 gain 151 140 -114.73 gain 140 152 -110.32 gain 152 140 -106.13 gain 140 153 -112.72 gain 153 140 -106.10 gain 140 154 -102.26 gain 154 140 -104.19 gain 140 155 -101.07 gain 155 140 -102.90 gain 140 156 -97.83 gain 156 140 -94.04 gain 140 157 -110.88 gain 157 140 -110.04 gain 140 158 -112.03 gain 158 140 -113.78 gain 140 159 -114.99 gain 159 140 -113.36 gain 140 160 -119.36 gain 160 140 -114.84 gain 140 161 -117.45 gain 161 140 -116.42 gain 140 162 -123.14 gain 162 140 -120.98 gain 140 163 -126.88 gain 163 140 -126.87 gain 140 164 -121.12 gain 164 140 -122.15 gain 140 165 -117.21 gain 165 140 -114.28 gain 140 166 -119.12 gain 166 140 -117.76 gain 140 167 -115.09 gain 167 140 -115.81 gain 140 168 -107.13 gain 168 140 -106.31 gain 140 169 -114.26 gain 169 140 -117.64 gain 140 170 -105.30 gain 170 140 -100.21 gain 140 171 -105.91 gain 171 140 -105.84 gain 140 172 -105.66 gain 172 140 -100.29 gain 140 173 -116.80 gain 173 140 -110.86 gain 140 174 -121.07 gain 174 140 -119.43 gain 140 175 -116.53 gain 175 140 -118.44 gain 140 176 -113.74 gain 176 140 -107.66 gain 140 177 -116.67 gain 177 140 -118.41 gain 140 178 -120.40 gain 178 140 -117.96 gain 140 179 -119.56 gain 179 140 -115.52 gain 140 180 -118.20 gain 180 140 -115.62 gain 140 181 -117.72 gain 181 140 -115.21 gain 140 182 -111.28 gain 182 140 -111.15 gain 140 183 -114.61 gain 183 140 -107.87 gain 140 184 -108.53 gain 184 140 -106.57 gain 140 185 -107.61 gain 185 140 -103.15 gain 140 186 -112.54 gain 186 140 -108.36 gain 140 187 -101.92 gain 187 140 -100.28 gain 140 188 -121.22 gain 188 140 -122.83 gain 140 189 -109.33 gain 189 140 -108.46 gain 140 190 -126.30 gain 190 140 -122.44 gain 140 191 -114.93 gain 191 140 -112.16 gain 140 192 -123.01 gain 192 140 -123.10 gain 140 193 -118.82 gain 193 140 -120.17 gain 140 194 -123.41 gain 194 140 -118.57 gain 140 195 -119.25 gain 195 140 -115.04 gain 140 196 -121.50 gain 196 140 -121.33 gain 140 197 -120.66 gain 197 140 -116.56 gain 140 198 -117.62 gain 198 140 -113.03 gain 140 199 -110.40 gain 199 140 -109.73 gain 140 200 -107.40 gain 200 140 -103.67 gain 140 201 -111.30 gain 201 140 -108.38 gain 140 202 -111.12 gain 202 140 -112.20 gain 140 203 -115.36 gain 203 140 -116.06 gain 140 204 -115.35 gain 204 140 -113.34 gain 140 205 -132.03 gain 205 140 -129.09 gain 140 206 -117.33 gain 206 140 -118.91 gain 140 207 -124.76 gain 207 140 -118.70 gain 140 208 -124.44 gain 208 140 -124.15 gain 140 209 -124.65 gain 209 140 -125.36 gain 140 210 -125.48 gain 210 140 -123.13 gain 140 211 -124.26 gain 211 140 -123.92 gain 140 212 -118.52 gain 212 140 -116.73 gain 140 213 -117.57 gain 213 140 -114.97 gain 140 214 -114.63 gain 214 140 -111.92 gain 140 215 -113.93 gain 215 140 -107.64 gain 140 216 -128.07 gain 216 140 -126.44 gain 140 217 -114.66 gain 217 140 -113.54 gain 140 218 -122.77 gain 218 140 -123.84 gain 140 219 -129.47 gain 219 140 -121.91 gain 140 220 -122.19 gain 220 140 -125.11 gain 140 221 -118.68 gain 221 140 -117.24 gain 140 222 -118.26 gain 222 140 -117.16 gain 140 223 -122.74 gain 223 140 -120.24 gain 140 224 -128.29 gain 224 140 -128.49 gain 141 142 -87.87 gain 142 141 -87.17 gain 141 143 -100.11 gain 143 141 -99.03 gain 141 144 -112.27 gain 144 141 -112.21 gain 141 145 -108.63 gain 145 141 -107.01 gain 141 146 -116.64 gain 146 141 -113.94 gain 141 147 -114.28 gain 147 141 -108.67 gain 141 148 -114.58 gain 148 141 -108.68 gain 141 149 -126.29 gain 149 141 -123.57 gain 141 150 -114.92 gain 150 141 -114.88 gain 141 151 -117.20 gain 151 141 -117.35 gain 141 152 -112.64 gain 152 141 -109.77 gain 141 153 -109.07 gain 153 141 -103.78 gain 141 154 -103.91 gain 154 141 -107.17 gain 141 155 -95.31 gain 155 141 -98.46 gain 141 156 -93.56 gain 156 141 -91.10 gain 141 157 -99.78 gain 157 141 -100.27 gain 141 158 -107.24 gain 158 141 -110.33 gain 141 159 -113.78 gain 159 141 -113.48 gain 141 160 -109.77 gain 160 141 -106.58 gain 141 161 -118.06 gain 161 141 -118.36 gain 141 162 -120.38 gain 162 141 -119.55 gain 141 163 -118.69 gain 163 141 -120.01 gain 141 164 -118.98 gain 164 141 -121.34 gain 141 165 -125.68 gain 165 141 -124.07 gain 141 166 -120.02 gain 166 141 -119.98 gain 141 167 -111.99 gain 167 141 -114.04 gain 141 168 -104.80 gain 168 141 -105.30 gain 141 169 -109.68 gain 169 141 -114.39 gain 141 170 -108.44 gain 170 141 -104.67 gain 141 171 -105.92 gain 171 141 -107.17 gain 141 172 -108.75 gain 172 141 -104.70 gain 141 173 -109.07 gain 173 141 -104.45 gain 141 174 -115.00 gain 174 141 -114.69 gain 141 175 -115.67 gain 175 141 -118.91 gain 141 176 -111.44 gain 176 141 -106.70 gain 141 177 -118.50 gain 177 141 -121.56 gain 141 178 -123.27 gain 178 141 -122.15 gain 141 179 -120.10 gain 179 141 -117.38 gain 141 180 -120.06 gain 180 141 -118.81 gain 141 181 -123.22 gain 181 141 -122.04 gain 141 182 -110.96 gain 182 141 -112.16 gain 141 183 -112.18 gain 183 141 -106.77 gain 141 184 -106.01 gain 184 141 -105.39 gain 141 185 -104.56 gain 185 141 -101.42 gain 141 186 -109.70 gain 186 141 -106.84 gain 141 187 -110.41 gain 187 141 -110.09 gain 141 188 -109.32 gain 188 141 -112.27 gain 141 189 -120.39 gain 189 141 -120.85 gain 141 190 -114.47 gain 190 141 -111.93 gain 141 191 -110.26 gain 191 141 -108.82 gain 141 192 -118.43 gain 192 141 -119.86 gain 141 193 -125.17 gain 193 141 -127.85 gain 141 194 -117.93 gain 194 141 -114.42 gain 141 195 -120.51 gain 195 141 -117.63 gain 141 196 -115.98 gain 196 141 -117.15 gain 141 197 -121.87 gain 197 141 -119.09 gain 141 198 -116.19 gain 198 141 -112.94 gain 141 199 -115.94 gain 199 141 -116.60 gain 141 200 -115.32 gain 200 141 -112.92 gain 141 201 -117.54 gain 201 141 -115.94 gain 141 202 -110.61 gain 202 141 -113.02 gain 141 203 -112.03 gain 203 141 -114.05 gain 141 204 -116.54 gain 204 141 -115.85 gain 141 205 -114.78 gain 205 141 -113.17 gain 141 206 -119.64 gain 206 141 -122.55 gain 141 207 -122.56 gain 207 141 -117.82 gain 141 208 -126.13 gain 208 141 -127.18 gain 141 209 -121.18 gain 209 141 -123.21 gain 141 210 -118.96 gain 210 141 -117.93 gain 141 211 -121.11 gain 211 141 -122.10 gain 141 212 -122.35 gain 212 141 -121.89 gain 141 213 -116.78 gain 213 141 -115.51 gain 141 214 -116.44 gain 214 141 -115.05 gain 141 215 -114.11 gain 215 141 -109.14 gain 141 216 -117.14 gain 216 141 -116.83 gain 141 217 -118.22 gain 217 141 -118.43 gain 141 218 -117.17 gain 218 141 -119.57 gain 141 219 -115.00 gain 219 141 -108.76 gain 141 220 -119.10 gain 220 141 -123.35 gain 141 221 -121.04 gain 221 141 -120.94 gain 141 222 -112.93 gain 222 141 -113.15 gain 141 223 -130.46 gain 223 141 -129.29 gain 141 224 -114.55 gain 224 141 -116.07 gain 142 143 -88.82 gain 143 142 -88.44 gain 142 144 -104.60 gain 144 142 -105.23 gain 142 145 -101.64 gain 145 142 -100.72 gain 142 146 -105.69 gain 146 142 -103.68 gain 142 147 -118.87 gain 147 142 -113.95 gain 142 148 -115.15 gain 148 142 -109.95 gain 142 149 -115.00 gain 149 142 -112.97 gain 142 150 -118.77 gain 150 142 -119.42 gain 142 151 -125.29 gain 151 142 -126.14 gain 142 152 -114.29 gain 152 142 -112.12 gain 142 153 -111.43 gain 153 142 -106.83 gain 142 154 -104.35 gain 154 142 -108.30 gain 142 155 -102.79 gain 155 142 -106.64 gain 142 156 -100.89 gain 156 142 -99.13 gain 142 157 -94.79 gain 157 142 -95.97 gain 142 158 -97.51 gain 158 142 -101.29 gain 142 159 -101.77 gain 159 142 -102.17 gain 142 160 -106.93 gain 160 142 -104.44 gain 142 161 -108.28 gain 161 142 -109.27 gain 142 162 -121.12 gain 162 142 -120.98 gain 142 163 -115.57 gain 163 142 -117.58 gain 142 164 -124.28 gain 164 142 -127.32 gain 142 165 -118.15 gain 165 142 -117.24 gain 142 166 -119.84 gain 166 142 -120.50 gain 142 167 -115.61 gain 167 142 -118.36 gain 142 168 -109.32 gain 168 142 -110.52 gain 142 169 -107.54 gain 169 142 -112.94 gain 142 170 -104.43 gain 170 142 -101.36 gain 142 171 -97.29 gain 171 142 -99.24 gain 142 172 -109.87 gain 172 142 -106.52 gain 142 173 -101.76 gain 173 142 -97.84 gain 142 174 -109.75 gain 174 142 -110.13 gain 142 175 -108.70 gain 175 142 -112.64 gain 142 176 -116.08 gain 176 142 -112.03 gain 142 177 -118.09 gain 177 142 -121.84 gain 142 178 -122.24 gain 178 142 -121.82 gain 142 179 -122.12 gain 179 142 -120.09 gain 142 180 -129.79 gain 180 142 -129.23 gain 142 181 -119.12 gain 181 142 -118.62 gain 142 182 -118.72 gain 182 142 -120.61 gain 142 183 -110.95 gain 183 142 -106.23 gain 142 184 -114.57 gain 184 142 -114.64 gain 142 185 -113.35 gain 185 142 -110.90 gain 142 186 -113.12 gain 186 142 -110.95 gain 142 187 -99.81 gain 187 142 -100.18 gain 142 188 -117.67 gain 188 142 -121.30 gain 142 189 -108.21 gain 189 142 -109.36 gain 142 190 -114.47 gain 190 142 -112.63 gain 142 191 -112.72 gain 191 142 -111.97 gain 142 192 -115.34 gain 192 142 -117.46 gain 142 193 -114.49 gain 193 142 -117.86 gain 142 194 -118.50 gain 194 142 -115.68 gain 142 195 -129.81 gain 195 142 -127.63 gain 142 196 -123.74 gain 196 142 -125.60 gain 142 197 -120.37 gain 197 142 -118.29 gain 142 198 -109.61 gain 198 142 -107.05 gain 142 199 -119.67 gain 199 142 -121.03 gain 142 200 -113.20 gain 200 142 -111.49 gain 142 201 -115.94 gain 201 142 -115.04 gain 142 202 -112.62 gain 202 142 -115.72 gain 142 203 -113.19 gain 203 142 -115.91 gain 142 204 -118.25 gain 204 142 -118.25 gain 142 205 -125.06 gain 205 142 -124.14 gain 142 206 -114.94 gain 206 142 -118.54 gain 142 207 -121.17 gain 207 142 -117.13 gain 142 208 -111.17 gain 208 142 -112.91 gain 142 209 -124.30 gain 209 142 -127.03 gain 142 210 -122.86 gain 210 142 -122.53 gain 142 211 -125.92 gain 211 142 -127.61 gain 142 212 -122.08 gain 212 142 -122.31 gain 142 213 -116.44 gain 213 142 -115.87 gain 142 214 -113.39 gain 214 142 -112.70 gain 142 215 -111.60 gain 215 142 -107.32 gain 142 216 -112.06 gain 216 142 -112.45 gain 142 217 -118.73 gain 217 142 -119.63 gain 142 218 -110.49 gain 218 142 -113.59 gain 142 219 -114.47 gain 219 142 -108.92 gain 142 220 -122.12 gain 220 142 -127.07 gain 142 221 -119.86 gain 221 142 -120.45 gain 142 222 -118.62 gain 222 142 -119.53 gain 142 223 -116.68 gain 223 142 -116.21 gain 142 224 -122.82 gain 224 142 -125.03 gain 143 144 -89.35 gain 144 143 -90.37 gain 143 145 -109.00 gain 145 143 -108.47 gain 143 146 -107.17 gain 146 143 -105.54 gain 143 147 -107.07 gain 147 143 -102.54 gain 143 148 -121.14 gain 148 143 -116.32 gain 143 149 -118.45 gain 149 143 -116.80 gain 143 150 -116.66 gain 150 143 -117.70 gain 143 151 -123.50 gain 151 143 -124.73 gain 143 152 -110.52 gain 152 143 -108.73 gain 143 153 -117.11 gain 153 143 -112.90 gain 143 154 -112.14 gain 154 143 -116.47 gain 143 155 -105.77 gain 155 143 -110.00 gain 143 156 -106.88 gain 156 143 -105.50 gain 143 157 -99.88 gain 157 143 -101.45 gain 143 158 -94.37 gain 158 143 -98.53 gain 143 159 -99.48 gain 159 143 -100.25 gain 143 160 -103.04 gain 160 143 -100.93 gain 143 161 -106.49 gain 161 143 -107.87 gain 143 162 -110.27 gain 162 143 -110.51 gain 143 163 -115.92 gain 163 143 -118.31 gain 143 164 -116.73 gain 164 143 -120.16 gain 143 165 -120.80 gain 165 143 -120.27 gain 143 166 -122.92 gain 166 143 -123.96 gain 143 167 -115.40 gain 167 143 -118.54 gain 143 168 -116.93 gain 168 143 -118.52 gain 143 169 -101.79 gain 169 143 -107.57 gain 143 170 -112.27 gain 170 143 -109.58 gain 143 171 -105.79 gain 171 143 -108.12 gain 143 172 -101.53 gain 172 143 -98.56 gain 143 173 -103.51 gain 173 143 -99.97 gain 143 174 -108.24 gain 174 143 -109.01 gain 143 175 -108.60 gain 175 143 -112.92 gain 143 176 -106.48 gain 176 143 -102.80 gain 143 177 -108.13 gain 177 143 -112.27 gain 143 178 -119.41 gain 178 143 -119.37 gain 143 179 -113.88 gain 179 143 -112.24 gain 143 180 -123.07 gain 180 143 -122.89 gain 143 181 -122.15 gain 181 143 -122.05 gain 143 182 -124.70 gain 182 143 -126.98 gain 143 183 -120.43 gain 183 143 -116.10 gain 143 184 -111.76 gain 184 143 -112.21 gain 143 185 -113.61 gain 185 143 -111.55 gain 143 186 -107.06 gain 186 143 -105.28 gain 143 187 -103.74 gain 187 143 -104.50 gain 143 188 -102.17 gain 188 143 -106.19 gain 143 189 -117.07 gain 189 143 -118.61 gain 143 190 -108.79 gain 190 143 -107.34 gain 143 191 -102.19 gain 191 143 -101.82 gain 143 192 -114.07 gain 192 143 -116.58 gain 143 193 -119.52 gain 193 143 -123.27 gain 143 194 -112.05 gain 194 143 -109.62 gain 143 195 -124.25 gain 195 143 -122.45 gain 143 196 -115.13 gain 196 143 -117.37 gain 143 197 -120.87 gain 197 143 -119.17 gain 143 198 -119.70 gain 198 143 -117.53 gain 143 199 -118.59 gain 199 143 -120.33 gain 143 200 -110.39 gain 200 143 -109.07 gain 143 201 -109.28 gain 201 143 -108.77 gain 143 202 -112.90 gain 202 143 -116.38 gain 143 203 -110.75 gain 203 143 -113.85 gain 143 204 -107.86 gain 204 143 -108.24 gain 143 205 -114.68 gain 205 143 -114.14 gain 143 206 -112.96 gain 206 143 -116.95 gain 143 207 -119.02 gain 207 143 -115.36 gain 143 208 -111.91 gain 208 143 -114.03 gain 143 209 -119.63 gain 209 143 -122.75 gain 143 210 -129.58 gain 210 143 -129.63 gain 143 211 -115.35 gain 211 143 -117.42 gain 143 212 -121.41 gain 212 143 -122.02 gain 143 213 -123.21 gain 213 143 -123.02 gain 143 214 -120.30 gain 214 143 -120.00 gain 143 215 -113.63 gain 215 143 -109.74 gain 143 216 -116.68 gain 216 143 -117.45 gain 143 217 -109.35 gain 217 143 -110.64 gain 143 218 -118.10 gain 218 143 -121.58 gain 143 219 -111.05 gain 219 143 -105.89 gain 143 220 -115.79 gain 220 143 -121.12 gain 143 221 -119.93 gain 221 143 -120.90 gain 143 222 -122.34 gain 222 143 -123.64 gain 143 223 -121.75 gain 223 143 -121.66 gain 143 224 -130.78 gain 224 143 -133.38 gain 144 145 -99.88 gain 145 144 -98.33 gain 144 146 -106.20 gain 146 144 -103.56 gain 144 147 -100.02 gain 147 144 -94.47 gain 144 148 -109.98 gain 148 144 -104.15 gain 144 149 -126.04 gain 149 144 -123.38 gain 144 150 -123.49 gain 150 144 -123.51 gain 144 151 -123.64 gain 151 144 -123.86 gain 144 152 -116.55 gain 152 144 -113.74 gain 144 153 -122.92 gain 153 144 -117.69 gain 144 154 -115.85 gain 154 144 -119.17 gain 144 155 -113.71 gain 155 144 -116.92 gain 144 156 -112.34 gain 156 144 -109.95 gain 144 157 -111.84 gain 157 144 -112.38 gain 144 158 -95.44 gain 158 144 -98.58 gain 144 159 -95.78 gain 159 144 -95.54 gain 144 160 -111.00 gain 160 144 -107.87 gain 144 161 -103.73 gain 161 144 -104.09 gain 144 162 -100.91 gain 162 144 -100.14 gain 144 163 -116.62 gain 163 144 -118.00 gain 144 164 -116.03 gain 164 144 -118.45 gain 144 165 -125.11 gain 165 144 -123.57 gain 144 166 -118.45 gain 166 144 -118.48 gain 144 167 -123.93 gain 167 144 -126.05 gain 144 168 -117.03 gain 168 144 -117.60 gain 144 169 -124.82 gain 169 144 -129.58 gain 144 170 -116.36 gain 170 144 -112.65 gain 144 171 -114.57 gain 171 144 -115.89 gain 144 172 -107.15 gain 172 144 -103.16 gain 144 173 -102.68 gain 173 144 -98.13 gain 144 174 -100.19 gain 174 144 -99.94 gain 144 175 -106.97 gain 175 144 -110.27 gain 144 176 -106.89 gain 176 144 -102.20 gain 144 177 -114.42 gain 177 144 -117.54 gain 144 178 -114.53 gain 178 144 -113.48 gain 144 179 -117.69 gain 179 144 -115.03 gain 144 180 -128.00 gain 180 144 -126.81 gain 144 181 -124.11 gain 181 144 -122.98 gain 144 182 -120.72 gain 182 144 -121.98 gain 144 183 -116.68 gain 183 144 -111.34 gain 144 184 -122.58 gain 184 144 -122.02 gain 144 185 -117.73 gain 185 144 -114.65 gain 144 186 -113.75 gain 186 144 -110.95 gain 144 187 -102.01 gain 187 144 -101.75 gain 144 188 -106.17 gain 188 144 -109.17 gain 144 189 -106.51 gain 189 144 -107.03 gain 144 190 -111.64 gain 190 144 -109.17 gain 144 191 -109.75 gain 191 144 -108.37 gain 144 192 -108.99 gain 192 144 -110.47 gain 144 193 -115.58 gain 193 144 -118.32 gain 144 194 -113.44 gain 194 144 -109.99 gain 144 195 -120.10 gain 195 144 -117.28 gain 144 196 -119.45 gain 196 144 -120.68 gain 144 197 -117.59 gain 197 144 -114.87 gain 144 198 -115.08 gain 198 144 -111.89 gain 144 199 -113.19 gain 199 144 -113.91 gain 144 200 -111.70 gain 200 144 -109.36 gain 144 201 -114.96 gain 201 144 -113.42 gain 144 202 -117.18 gain 202 144 -119.65 gain 144 203 -106.99 gain 203 144 -109.08 gain 144 204 -114.54 gain 204 144 -113.91 gain 144 205 -112.31 gain 205 144 -110.76 gain 144 206 -109.90 gain 206 144 -112.87 gain 144 207 -111.55 gain 207 144 -106.87 gain 144 208 -116.38 gain 208 144 -117.48 gain 144 209 -120.57 gain 209 144 -122.67 gain 144 210 -133.64 gain 210 144 -132.67 gain 144 211 -125.16 gain 211 144 -126.22 gain 144 212 -114.67 gain 212 144 -114.26 gain 144 213 -124.88 gain 213 144 -123.67 gain 144 214 -120.47 gain 214 144 -119.15 gain 144 215 -113.53 gain 215 144 -108.62 gain 144 216 -121.76 gain 216 144 -121.52 gain 144 217 -117.92 gain 217 144 -118.20 gain 144 218 -117.05 gain 218 144 -119.52 gain 144 219 -110.53 gain 219 144 -104.35 gain 144 220 -112.73 gain 220 144 -117.04 gain 144 221 -124.43 gain 221 144 -124.39 gain 144 222 -106.84 gain 222 144 -107.12 gain 144 223 -114.83 gain 223 144 -113.72 gain 144 224 -117.84 gain 224 144 -119.42 gain 145 146 -90.32 gain 146 145 -89.23 gain 145 147 -108.62 gain 147 145 -104.62 gain 145 148 -101.90 gain 148 145 -97.61 gain 145 149 -105.01 gain 149 145 -103.90 gain 145 150 -124.31 gain 150 145 -125.88 gain 145 151 -116.66 gain 151 145 -118.42 gain 145 152 -119.03 gain 152 145 -117.77 gain 145 153 -115.84 gain 153 145 -112.16 gain 145 154 -119.35 gain 154 145 -124.22 gain 145 155 -114.48 gain 155 145 -119.24 gain 145 156 -106.75 gain 156 145 -105.91 gain 145 157 -104.74 gain 157 145 -106.84 gain 145 158 -104.77 gain 158 145 -109.47 gain 145 159 -97.29 gain 159 145 -98.60 gain 145 160 -85.99 gain 160 145 -84.41 gain 145 161 -103.40 gain 161 145 -105.31 gain 145 162 -102.35 gain 162 145 -103.13 gain 145 163 -115.68 gain 163 145 -118.60 gain 145 164 -113.65 gain 164 145 -117.62 gain 145 165 -124.17 gain 165 145 -124.18 gain 145 166 -125.82 gain 166 145 -127.40 gain 145 167 -122.85 gain 167 145 -126.51 gain 145 168 -118.09 gain 168 145 -120.20 gain 145 169 -120.55 gain 169 145 -126.87 gain 145 170 -123.74 gain 170 145 -121.58 gain 145 171 -116.88 gain 171 145 -119.74 gain 145 172 -102.59 gain 172 145 -100.15 gain 145 173 -109.34 gain 173 145 -106.33 gain 145 174 -102.49 gain 174 145 -103.79 gain 145 175 -92.30 gain 175 145 -97.15 gain 145 176 -96.23 gain 176 145 -93.09 gain 145 177 -111.76 gain 177 145 -116.43 gain 145 178 -105.04 gain 178 145 -105.54 gain 145 179 -117.32 gain 179 145 -116.21 gain 145 180 -124.48 gain 180 145 -124.84 gain 145 181 -122.69 gain 181 145 -123.12 gain 145 182 -114.11 gain 182 145 -116.92 gain 145 183 -121.27 gain 183 145 -117.47 gain 145 184 -115.55 gain 184 145 -116.54 gain 145 185 -114.63 gain 185 145 -113.10 gain 145 186 -111.85 gain 186 145 -110.60 gain 145 187 -109.66 gain 187 145 -110.95 gain 145 188 -115.68 gain 188 145 -120.23 gain 145 189 -115.65 gain 189 145 -117.72 gain 145 190 -112.21 gain 190 145 -111.29 gain 145 191 -111.50 gain 191 145 -111.67 gain 145 192 -109.34 gain 192 145 -112.38 gain 145 193 -114.99 gain 193 145 -119.28 gain 145 194 -110.88 gain 194 145 -108.98 gain 145 195 -130.38 gain 195 145 -129.11 gain 145 196 -117.65 gain 196 145 -120.42 gain 145 197 -127.36 gain 197 145 -126.19 gain 145 198 -120.40 gain 198 145 -118.76 gain 145 199 -120.75 gain 199 145 -123.02 gain 145 200 -115.77 gain 200 145 -114.98 gain 145 201 -117.93 gain 201 145 -117.95 gain 145 202 -112.31 gain 202 145 -116.32 gain 145 203 -103.22 gain 203 145 -106.86 gain 145 204 -111.34 gain 204 145 -112.26 gain 145 205 -110.21 gain 205 145 -110.21 gain 145 206 -105.88 gain 206 145 -110.40 gain 145 207 -104.35 gain 207 145 -101.23 gain 145 208 -117.69 gain 208 145 -120.34 gain 145 209 -115.85 gain 209 145 -119.50 gain 145 210 -128.00 gain 210 145 -128.58 gain 145 211 -124.48 gain 211 145 -127.09 gain 145 212 -121.98 gain 212 145 -123.13 gain 145 213 -117.13 gain 213 145 -117.47 gain 145 214 -121.19 gain 214 145 -121.42 gain 145 215 -116.97 gain 215 145 -113.62 gain 145 216 -122.99 gain 216 145 -124.29 gain 145 217 -112.08 gain 217 145 -113.91 gain 145 218 -119.35 gain 218 145 -123.37 gain 145 219 -124.29 gain 219 145 -119.67 gain 145 220 -112.88 gain 220 145 -118.74 gain 145 221 -113.92 gain 221 145 -115.43 gain 145 222 -117.84 gain 222 145 -119.67 gain 145 223 -117.54 gain 223 145 -117.98 gain 145 224 -117.81 gain 224 145 -120.94 gain 146 147 -95.37 gain 147 146 -92.46 gain 146 148 -102.72 gain 148 146 -99.53 gain 146 149 -102.44 gain 149 146 -102.41 gain 146 150 -128.58 gain 150 146 -131.24 gain 146 151 -123.74 gain 151 146 -126.60 gain 146 152 -119.99 gain 152 146 -119.82 gain 146 153 -119.10 gain 153 146 -116.51 gain 146 154 -111.72 gain 154 146 -117.68 gain 146 155 -115.91 gain 155 146 -121.77 gain 146 156 -120.54 gain 156 146 -120.78 gain 146 157 -105.11 gain 157 146 -108.30 gain 146 158 -108.17 gain 158 146 -113.95 gain 146 159 -102.29 gain 159 146 -104.69 gain 146 160 -92.62 gain 160 146 -92.13 gain 146 161 -93.41 gain 161 146 -96.42 gain 146 162 -103.12 gain 162 146 -104.99 gain 146 163 -103.09 gain 163 146 -107.10 gain 146 164 -100.35 gain 164 146 -105.41 gain 146 165 -115.80 gain 165 146 -116.90 gain 146 166 -120.37 gain 166 146 -123.04 gain 146 167 -111.87 gain 167 146 -116.63 gain 146 168 -127.54 gain 168 146 -130.75 gain 146 169 -119.49 gain 169 146 -126.89 gain 146 170 -110.94 gain 170 146 -109.87 gain 146 171 -107.71 gain 171 146 -111.67 gain 146 172 -113.69 gain 172 146 -112.34 gain 146 173 -101.68 gain 173 146 -99.77 gain 146 174 -105.13 gain 174 146 -107.52 gain 146 175 -104.19 gain 175 146 -110.13 gain 146 176 -98.37 gain 176 146 -96.32 gain 146 177 -105.37 gain 177 146 -111.13 gain 146 178 -99.97 gain 178 146 -101.56 gain 146 179 -115.07 gain 179 146 -115.05 gain 146 180 -132.22 gain 180 146 -133.67 gain 146 181 -122.44 gain 181 146 -123.95 gain 146 182 -125.15 gain 182 146 -129.05 gain 146 183 -117.13 gain 183 146 -114.42 gain 146 184 -116.36 gain 184 146 -118.44 gain 146 185 -116.34 gain 185 146 -115.90 gain 146 186 -104.88 gain 186 146 -104.72 gain 146 187 -117.54 gain 187 146 -119.92 gain 146 188 -102.51 gain 188 146 -108.16 gain 146 189 -111.62 gain 189 146 -114.77 gain 146 190 -108.37 gain 190 146 -108.54 gain 146 191 -103.57 gain 191 146 -104.83 gain 146 192 -104.15 gain 192 146 -108.27 gain 146 193 -110.48 gain 193 146 -115.86 gain 146 194 -117.30 gain 194 146 -116.49 gain 146 195 -122.13 gain 195 146 -121.95 gain 146 196 -120.45 gain 196 146 -124.31 gain 146 197 -119.71 gain 197 146 -119.64 gain 146 198 -121.16 gain 198 146 -120.60 gain 146 199 -119.42 gain 199 146 -122.79 gain 146 200 -109.31 gain 200 146 -109.61 gain 146 201 -117.32 gain 201 146 -118.43 gain 146 202 -110.84 gain 202 146 -115.95 gain 146 203 -115.66 gain 203 146 -120.38 gain 146 204 -109.67 gain 204 146 -111.69 gain 146 205 -112.65 gain 205 146 -113.74 gain 146 206 -105.15 gain 206 146 -110.76 gain 146 207 -111.57 gain 207 146 -109.54 gain 146 208 -113.74 gain 208 146 -117.49 gain 146 209 -112.08 gain 209 146 -116.82 gain 146 210 -120.88 gain 210 146 -122.56 gain 146 211 -122.72 gain 211 146 -126.41 gain 146 212 -120.50 gain 212 146 -122.74 gain 146 213 -116.89 gain 213 146 -118.32 gain 146 214 -123.22 gain 214 146 -124.54 gain 146 215 -113.37 gain 215 146 -111.11 gain 146 216 -116.82 gain 216 146 -119.22 gain 146 217 -118.36 gain 217 146 -121.27 gain 146 218 -117.24 gain 218 146 -122.34 gain 146 219 -116.80 gain 219 146 -113.27 gain 146 220 -106.15 gain 220 146 -113.10 gain 146 221 -108.70 gain 221 146 -111.30 gain 146 222 -110.42 gain 222 146 -113.34 gain 146 223 -109.45 gain 223 146 -110.99 gain 146 224 -117.88 gain 224 146 -122.10 gain 147 148 -89.44 gain 148 147 -89.16 gain 147 149 -97.74 gain 149 147 -100.62 gain 147 150 -125.60 gain 150 147 -131.17 gain 147 151 -122.03 gain 151 147 -127.79 gain 147 152 -123.24 gain 152 147 -125.98 gain 147 153 -119.72 gain 153 147 -120.04 gain 147 154 -116.31 gain 154 147 -125.18 gain 147 155 -108.90 gain 155 147 -117.66 gain 147 156 -114.92 gain 156 147 -118.07 gain 147 157 -112.04 gain 157 147 -118.14 gain 147 158 -97.90 gain 158 147 -106.59 gain 147 159 -98.10 gain 159 147 -103.41 gain 147 160 -101.74 gain 160 147 -104.17 gain 147 161 -84.71 gain 161 147 -90.62 gain 147 162 -94.35 gain 162 147 -99.12 gain 147 163 -97.58 gain 163 147 -104.51 gain 147 164 -98.53 gain 164 147 -106.50 gain 147 165 -124.00 gain 165 147 -128.00 gain 147 166 -115.23 gain 166 147 -120.80 gain 147 167 -126.14 gain 167 147 -133.81 gain 147 168 -118.41 gain 168 147 -124.52 gain 147 169 -117.69 gain 169 147 -128.00 gain 147 170 -110.95 gain 170 147 -112.80 gain 147 171 -112.25 gain 171 147 -119.11 gain 147 172 -111.36 gain 172 147 -112.92 gain 147 173 -106.00 gain 173 147 -107.00 gain 147 174 -106.47 gain 174 147 -111.76 gain 147 175 -106.75 gain 175 147 -115.60 gain 147 176 -94.88 gain 176 147 -95.74 gain 147 177 -97.93 gain 177 147 -106.60 gain 147 178 -100.85 gain 178 147 -105.35 gain 147 179 -98.27 gain 179 147 -101.16 gain 147 180 -121.49 gain 180 147 -125.85 gain 147 181 -125.68 gain 181 147 -130.10 gain 147 182 -121.41 gain 182 147 -128.22 gain 147 183 -119.14 gain 183 147 -119.34 gain 147 184 -114.52 gain 184 147 -119.51 gain 147 185 -119.99 gain 185 147 -122.46 gain 147 186 -117.34 gain 186 147 -120.09 gain 147 187 -111.34 gain 187 147 -116.63 gain 147 188 -113.57 gain 188 147 -122.12 gain 147 189 -105.44 gain 189 147 -111.51 gain 147 190 -107.90 gain 190 147 -110.98 gain 147 191 -102.41 gain 191 147 -106.58 gain 147 192 -101.24 gain 192 147 -108.28 gain 147 193 -99.45 gain 193 147 -107.74 gain 147 194 -110.59 gain 194 147 -112.69 gain 147 195 -115.81 gain 195 147 -118.54 gain 147 196 -113.53 gain 196 147 -120.31 gain 147 197 -115.28 gain 197 147 -118.12 gain 147 198 -120.37 gain 198 147 -122.72 gain 147 199 -117.90 gain 199 147 -124.17 gain 147 200 -118.37 gain 200 147 -121.59 gain 147 201 -122.63 gain 201 147 -126.65 gain 147 202 -112.61 gain 202 147 -120.63 gain 147 203 -117.07 gain 203 147 -124.71 gain 147 204 -111.14 gain 204 147 -116.07 gain 147 205 -108.73 gain 205 147 -112.73 gain 147 206 -103.64 gain 206 147 -112.15 gain 147 207 -104.02 gain 207 147 -104.90 gain 147 208 -105.71 gain 208 147 -112.36 gain 147 209 -107.11 gain 209 147 -114.75 gain 147 210 -121.44 gain 210 147 -126.02 gain 147 211 -125.65 gain 211 147 -132.26 gain 147 212 -120.06 gain 212 147 -125.21 gain 147 213 -119.00 gain 213 147 -123.34 gain 147 214 -122.14 gain 214 147 -126.37 gain 147 215 -116.28 gain 215 147 -116.92 gain 147 216 -121.37 gain 216 147 -126.67 gain 147 217 -118.98 gain 217 147 -124.80 gain 147 218 -119.45 gain 218 147 -127.47 gain 147 219 -117.13 gain 219 147 -116.51 gain 147 220 -110.37 gain 220 147 -120.23 gain 147 221 -108.78 gain 221 147 -114.28 gain 147 222 -111.49 gain 222 147 -117.32 gain 147 223 -109.26 gain 223 147 -113.70 gain 147 224 -115.65 gain 224 147 -122.78 gain 148 149 -87.76 gain 149 148 -90.92 gain 148 150 -127.02 gain 150 148 -132.87 gain 148 151 -120.63 gain 151 148 -126.68 gain 148 152 -119.89 gain 152 148 -122.92 gain 148 153 -121.29 gain 153 148 -121.90 gain 148 154 -123.23 gain 154 148 -132.38 gain 148 155 -118.62 gain 155 148 -127.66 gain 148 156 -115.87 gain 156 148 -119.30 gain 148 157 -116.53 gain 157 148 -122.92 gain 148 158 -111.09 gain 158 148 -120.06 gain 148 159 -104.52 gain 159 148 -110.12 gain 148 160 -104.01 gain 160 148 -106.71 gain 148 161 -96.76 gain 161 148 -102.95 gain 148 162 -93.87 gain 162 148 -98.92 gain 148 163 -89.45 gain 163 148 -96.66 gain 148 164 -92.86 gain 164 148 -101.11 gain 148 165 -117.40 gain 165 148 -121.69 gain 148 166 -120.83 gain 166 148 -126.69 gain 148 167 -121.02 gain 167 148 -128.97 gain 148 168 -122.31 gain 168 148 -128.71 gain 148 169 -125.43 gain 169 148 -136.03 gain 148 170 -119.13 gain 170 148 -121.26 gain 148 171 -113.48 gain 171 148 -120.63 gain 148 172 -109.87 gain 172 148 -111.71 gain 148 173 -114.51 gain 173 148 -115.79 gain 148 174 -103.77 gain 174 148 -109.35 gain 148 175 -105.32 gain 175 148 -114.46 gain 148 176 -98.86 gain 176 148 -100.00 gain 148 177 -96.51 gain 177 148 -105.46 gain 148 178 -95.24 gain 178 148 -100.02 gain 148 179 -101.20 gain 179 148 -104.38 gain 148 180 -117.34 gain 180 148 -121.98 gain 148 181 -125.61 gain 181 148 -130.32 gain 148 182 -114.80 gain 182 148 -121.89 gain 148 183 -116.72 gain 183 148 -117.20 gain 148 184 -117.22 gain 184 148 -122.49 gain 148 185 -115.86 gain 185 148 -118.61 gain 148 186 -118.47 gain 186 148 -121.50 gain 148 187 -115.53 gain 187 148 -121.10 gain 148 188 -103.09 gain 188 148 -111.92 gain 148 189 -108.98 gain 189 148 -115.33 gain 148 190 -103.50 gain 190 148 -106.86 gain 148 191 -104.41 gain 191 148 -108.86 gain 148 192 -103.78 gain 192 148 -111.10 gain 148 193 -95.04 gain 193 148 -103.61 gain 148 194 -107.06 gain 194 148 -109.45 gain 148 195 -119.34 gain 195 148 -122.36 gain 148 196 -130.80 gain 196 148 -137.86 gain 148 197 -122.63 gain 197 148 -125.75 gain 148 198 -116.61 gain 198 148 -119.25 gain 148 199 -111.89 gain 199 148 -118.45 gain 148 200 -114.43 gain 200 148 -117.93 gain 148 201 -116.54 gain 201 148 -120.84 gain 148 202 -118.44 gain 202 148 -126.74 gain 148 203 -115.65 gain 203 148 -123.57 gain 148 204 -113.96 gain 204 148 -119.16 gain 148 205 -106.61 gain 205 148 -110.89 gain 148 206 -104.83 gain 206 148 -113.63 gain 148 207 -101.60 gain 207 148 -102.76 gain 148 208 -106.46 gain 208 148 -113.40 gain 148 209 -114.27 gain 209 148 -122.20 gain 148 210 -116.33 gain 210 148 -121.20 gain 148 211 -121.29 gain 211 148 -128.18 gain 148 212 -122.45 gain 212 148 -127.88 gain 148 213 -116.01 gain 213 148 -120.64 gain 148 214 -123.19 gain 214 148 -127.70 gain 148 215 -112.61 gain 215 148 -113.53 gain 148 216 -121.68 gain 216 148 -127.26 gain 148 217 -111.02 gain 217 148 -117.13 gain 148 218 -116.93 gain 218 148 -125.23 gain 148 219 -107.61 gain 219 148 -107.26 gain 148 220 -106.77 gain 220 148 -116.91 gain 148 221 -107.99 gain 221 148 -113.78 gain 148 222 -114.42 gain 222 148 -120.53 gain 148 223 -103.68 gain 223 148 -108.41 gain 148 224 -112.28 gain 224 148 -119.69 gain 149 150 -123.09 gain 150 149 -125.77 gain 149 151 -125.47 gain 151 149 -128.36 gain 149 152 -117.12 gain 152 149 -116.98 gain 149 153 -131.05 gain 153 149 -128.49 gain 149 154 -121.68 gain 154 149 -127.66 gain 149 155 -116.78 gain 155 149 -122.66 gain 149 156 -122.17 gain 156 149 -122.44 gain 149 157 -122.10 gain 157 149 -125.32 gain 149 158 -116.56 gain 158 149 -122.37 gain 149 159 -107.96 gain 159 149 -110.39 gain 149 160 -117.88 gain 160 149 -117.42 gain 149 161 -110.67 gain 161 149 -113.70 gain 149 162 -105.87 gain 162 149 -107.76 gain 149 163 -95.13 gain 163 149 -99.17 gain 149 164 -92.39 gain 164 149 -97.47 gain 149 165 -123.39 gain 165 149 -124.52 gain 149 166 -127.68 gain 166 149 -130.37 gain 149 167 -122.16 gain 167 149 -126.94 gain 149 168 -127.85 gain 168 149 -131.08 gain 149 169 -123.11 gain 169 149 -130.54 gain 149 170 -128.71 gain 170 149 -127.67 gain 149 171 -121.12 gain 171 149 -125.10 gain 149 172 -110.21 gain 172 149 -108.89 gain 149 173 -116.89 gain 173 149 -115.00 gain 149 174 -114.63 gain 174 149 -117.04 gain 149 175 -111.38 gain 175 149 -117.35 gain 149 176 -114.48 gain 176 149 -112.46 gain 149 177 -100.92 gain 177 149 -106.71 gain 149 178 -96.43 gain 178 149 -98.05 gain 149 179 -100.36 gain 179 149 -100.36 gain 149 180 -125.76 gain 180 149 -127.24 gain 149 181 -123.31 gain 181 149 -124.86 gain 149 182 -124.21 gain 182 149 -128.14 gain 149 183 -115.53 gain 183 149 -112.85 gain 149 184 -119.27 gain 184 149 -121.37 gain 149 185 -116.77 gain 185 149 -116.36 gain 149 186 -116.45 gain 186 149 -116.32 gain 149 187 -122.31 gain 187 149 -124.72 gain 149 188 -117.28 gain 188 149 -122.95 gain 149 189 -118.10 gain 189 149 -121.28 gain 149 190 -114.93 gain 190 149 -115.13 gain 149 191 -112.84 gain 191 149 -114.12 gain 149 192 -105.64 gain 192 149 -109.79 gain 149 193 -106.61 gain 193 149 -112.01 gain 149 194 -100.78 gain 194 149 -99.99 gain 149 195 -122.39 gain 195 149 -122.24 gain 149 196 -130.94 gain 196 149 -134.83 gain 149 197 -121.36 gain 197 149 -121.31 gain 149 198 -121.24 gain 198 149 -120.72 gain 149 199 -124.75 gain 199 149 -128.14 gain 149 200 -123.25 gain 200 149 -123.58 gain 149 201 -115.29 gain 201 149 -116.43 gain 149 202 -125.51 gain 202 149 -130.64 gain 149 203 -123.29 gain 203 149 -128.04 gain 149 204 -112.77 gain 204 149 -114.81 gain 149 205 -112.71 gain 205 149 -113.82 gain 149 206 -117.04 gain 206 149 -122.67 gain 149 207 -112.68 gain 207 149 -110.67 gain 149 208 -114.58 gain 208 149 -118.35 gain 149 209 -110.44 gain 209 149 -115.20 gain 149 210 -132.48 gain 210 149 -134.18 gain 149 211 -126.15 gain 211 149 -129.87 gain 149 212 -119.33 gain 212 149 -121.59 gain 149 213 -125.40 gain 213 149 -126.85 gain 149 214 -123.72 gain 214 149 -125.07 gain 149 215 -127.06 gain 215 149 -124.82 gain 149 216 -116.87 gain 216 149 -119.30 gain 149 217 -124.92 gain 217 149 -127.86 gain 149 218 -113.84 gain 218 149 -118.97 gain 149 219 -118.86 gain 219 149 -115.35 gain 149 220 -118.48 gain 220 149 -125.46 gain 149 221 -109.39 gain 221 149 -112.01 gain 149 222 -118.81 gain 222 149 -121.75 gain 149 223 -120.68 gain 223 149 -122.24 gain 149 224 -114.64 gain 224 149 -118.89 gain 150 151 -98.68 gain 151 150 -98.88 gain 150 152 -104.54 gain 152 150 -101.71 gain 150 153 -106.88 gain 153 150 -101.63 gain 150 154 -119.10 gain 154 150 -122.40 gain 150 155 -114.73 gain 155 150 -117.93 gain 150 156 -122.17 gain 156 150 -119.76 gain 150 157 -114.74 gain 157 150 -115.27 gain 150 158 -121.89 gain 158 150 -125.01 gain 150 159 -122.59 gain 159 150 -122.33 gain 150 160 -122.62 gain 160 150 -119.47 gain 150 161 -122.34 gain 161 150 -122.68 gain 150 162 -131.17 gain 162 150 -130.38 gain 150 163 -128.68 gain 163 150 -130.03 gain 150 164 -134.81 gain 164 150 -137.20 gain 150 165 -93.41 gain 165 150 -91.85 gain 150 166 -110.59 gain 166 150 -110.60 gain 150 167 -103.80 gain 167 150 -105.90 gain 150 168 -111.65 gain 168 150 -112.20 gain 150 169 -108.66 gain 169 150 -113.41 gain 150 170 -111.64 gain 170 150 -107.92 gain 150 171 -116.59 gain 171 150 -117.89 gain 150 172 -117.53 gain 172 150 -113.53 gain 150 173 -124.80 gain 173 150 -120.23 gain 150 174 -129.42 gain 174 150 -129.14 gain 150 175 -127.01 gain 175 150 -130.29 gain 150 176 -122.85 gain 176 150 -118.14 gain 150 177 -132.08 gain 177 150 -135.18 gain 150 178 -124.14 gain 178 150 -123.07 gain 150 179 -133.78 gain 179 150 -131.10 gain 150 180 -105.63 gain 180 150 -104.41 gain 150 181 -103.44 gain 181 150 -102.30 gain 150 182 -114.58 gain 182 150 -115.82 gain 150 183 -107.35 gain 183 150 -101.98 gain 150 184 -107.00 gain 184 150 -106.41 gain 150 185 -114.46 gain 185 150 -111.36 gain 150 186 -118.67 gain 186 150 -115.85 gain 150 187 -123.09 gain 187 150 -122.82 gain 150 188 -119.78 gain 188 150 -122.76 gain 150 189 -118.16 gain 189 150 -118.65 gain 150 190 -120.92 gain 190 150 -118.43 gain 150 191 -123.42 gain 191 150 -122.02 gain 150 192 -126.68 gain 192 150 -128.15 gain 150 193 -125.58 gain 193 150 -128.30 gain 150 194 -130.16 gain 194 150 -126.68 gain 150 195 -108.81 gain 195 150 -105.97 gain 150 196 -110.53 gain 196 150 -111.74 gain 150 197 -106.67 gain 197 150 -103.94 gain 150 198 -113.84 gain 198 150 -110.62 gain 150 199 -109.02 gain 199 150 -109.72 gain 150 200 -118.92 gain 200 150 -116.57 gain 150 201 -121.60 gain 201 150 -120.05 gain 150 202 -121.39 gain 202 150 -123.83 gain 150 203 -118.29 gain 203 150 -120.36 gain 150 204 -118.60 gain 204 150 -117.95 gain 150 205 -122.43 gain 205 150 -120.85 gain 150 206 -133.51 gain 206 150 -136.46 gain 150 207 -125.90 gain 207 150 -121.20 gain 150 208 -126.65 gain 208 150 -127.73 gain 150 209 -127.64 gain 209 150 -129.72 gain 150 210 -110.22 gain 210 150 -109.23 gain 150 211 -112.69 gain 211 150 -113.72 gain 150 212 -104.93 gain 212 150 -104.51 gain 150 213 -120.14 gain 213 150 -118.91 gain 150 214 -115.34 gain 214 150 -114.00 gain 150 215 -116.78 gain 215 150 -111.85 gain 150 216 -117.81 gain 216 150 -117.54 gain 150 217 -120.08 gain 217 150 -120.33 gain 150 218 -123.95 gain 218 150 -126.39 gain 150 219 -123.27 gain 219 150 -117.08 gain 150 220 -122.00 gain 220 150 -126.30 gain 150 221 -124.00 gain 221 150 -123.93 gain 150 222 -127.90 gain 222 150 -128.16 gain 150 223 -132.38 gain 223 150 -131.25 gain 150 224 -138.23 gain 224 150 -139.80 gain 151 152 -94.32 gain 152 151 -91.29 gain 151 153 -98.17 gain 153 151 -92.72 gain 151 154 -109.38 gain 154 151 -112.48 gain 151 155 -108.34 gain 155 151 -111.34 gain 151 156 -121.27 gain 156 151 -118.65 gain 151 157 -123.33 gain 157 151 -123.67 gain 151 158 -121.78 gain 158 151 -124.71 gain 151 159 -113.83 gain 159 151 -113.37 gain 151 160 -127.10 gain 160 151 -123.76 gain 151 161 -130.01 gain 161 151 -130.16 gain 151 162 -132.12 gain 162 151 -131.13 gain 151 163 -131.00 gain 163 151 -132.16 gain 151 164 -118.66 gain 164 151 -120.86 gain 151 165 -104.03 gain 165 151 -102.27 gain 151 166 -98.01 gain 166 151 -97.82 gain 151 167 -97.46 gain 167 151 -99.36 gain 151 168 -105.36 gain 168 151 -105.72 gain 151 169 -108.65 gain 169 151 -113.20 gain 151 170 -110.97 gain 170 151 -107.05 gain 151 171 -120.62 gain 171 151 -121.72 gain 151 172 -112.87 gain 172 151 -108.66 gain 151 173 -118.78 gain 173 151 -114.01 gain 151 174 -123.95 gain 174 151 -123.48 gain 151 175 -118.75 gain 175 151 -121.84 gain 151 176 -123.68 gain 176 151 -118.77 gain 151 177 -126.31 gain 177 151 -129.22 gain 151 178 -134.76 gain 178 151 -133.49 gain 151 179 -131.63 gain 179 151 -128.76 gain 151 180 -104.55 gain 180 151 -103.14 gain 151 181 -96.42 gain 181 151 -95.08 gain 151 182 -105.20 gain 182 151 -106.25 gain 151 183 -112.31 gain 183 151 -106.74 gain 151 184 -117.31 gain 184 151 -116.53 gain 151 185 -118.03 gain 185 151 -114.73 gain 151 186 -118.18 gain 186 151 -115.17 gain 151 187 -111.72 gain 187 151 -111.24 gain 151 188 -120.63 gain 188 151 -123.42 gain 151 189 -118.81 gain 189 151 -119.12 gain 151 190 -123.41 gain 190 151 -120.72 gain 151 191 -127.39 gain 191 151 -125.79 gain 151 192 -131.74 gain 192 151 -133.01 gain 151 193 -115.61 gain 193 151 -118.13 gain 151 194 -126.67 gain 194 151 -123.00 gain 151 195 -112.39 gain 195 151 -109.35 gain 151 196 -101.44 gain 196 151 -102.45 gain 151 197 -114.40 gain 197 151 -111.47 gain 151 198 -108.83 gain 198 151 -105.42 gain 151 199 -108.93 gain 199 151 -109.43 gain 151 200 -113.88 gain 200 151 -111.33 gain 151 201 -107.28 gain 201 151 -105.52 gain 151 202 -121.83 gain 202 151 -124.08 gain 151 203 -121.13 gain 203 151 -123.00 gain 151 204 -120.80 gain 204 151 -119.96 gain 151 205 -121.84 gain 205 151 -120.06 gain 151 206 -128.03 gain 206 151 -130.78 gain 151 207 -126.00 gain 207 151 -121.11 gain 151 208 -126.83 gain 208 151 -127.72 gain 151 209 -127.29 gain 209 151 -129.17 gain 151 210 -114.60 gain 210 151 -113.41 gain 151 211 -111.65 gain 211 151 -112.49 gain 151 212 -104.47 gain 212 151 -103.85 gain 151 213 -114.13 gain 213 151 -112.71 gain 151 214 -112.28 gain 214 151 -110.75 gain 151 215 -109.04 gain 215 151 -103.91 gain 151 216 -118.21 gain 216 151 -117.74 gain 151 217 -115.46 gain 217 151 -115.51 gain 151 218 -111.77 gain 218 151 -114.02 gain 151 219 -119.25 gain 219 151 -112.86 gain 151 220 -120.31 gain 220 151 -124.41 gain 151 221 -128.03 gain 221 151 -127.77 gain 151 222 -123.10 gain 222 151 -123.16 gain 151 223 -127.72 gain 223 151 -126.40 gain 151 224 -124.19 gain 224 151 -125.55 gain 152 153 -93.16 gain 153 152 -90.74 gain 152 154 -106.63 gain 154 152 -112.75 gain 152 155 -107.76 gain 155 152 -113.78 gain 152 156 -109.82 gain 156 152 -110.23 gain 152 157 -111.81 gain 157 152 -115.16 gain 152 158 -119.32 gain 158 152 -125.27 gain 152 159 -117.08 gain 159 152 -119.65 gain 152 160 -114.60 gain 160 152 -114.28 gain 152 161 -118.48 gain 161 152 -121.65 gain 152 162 -116.87 gain 162 152 -118.90 gain 152 163 -119.91 gain 163 152 -124.09 gain 152 164 -122.77 gain 164 152 -127.99 gain 152 165 -105.74 gain 165 152 -107.01 gain 152 166 -88.04 gain 166 152 -90.88 gain 152 167 -88.06 gain 167 152 -92.99 gain 152 168 -102.65 gain 168 152 -106.03 gain 152 169 -106.80 gain 169 152 -114.38 gain 152 170 -107.50 gain 170 152 -106.60 gain 152 171 -109.61 gain 171 152 -113.74 gain 152 172 -105.64 gain 172 152 -104.46 gain 152 173 -117.09 gain 173 152 -115.34 gain 152 174 -115.84 gain 174 152 -118.39 gain 152 175 -116.57 gain 175 152 -122.68 gain 152 176 -122.48 gain 176 152 -120.60 gain 152 177 -123.02 gain 177 152 -128.95 gain 152 178 -118.37 gain 178 152 -120.13 gain 152 179 -119.70 gain 179 152 -119.84 gain 152 180 -101.49 gain 180 152 -103.10 gain 152 181 -98.31 gain 181 152 -100.00 gain 152 182 -101.40 gain 182 152 -105.47 gain 152 183 -100.83 gain 183 152 -98.29 gain 152 184 -103.12 gain 184 152 -105.36 gain 152 185 -108.89 gain 185 152 -108.61 gain 152 186 -110.46 gain 186 152 -110.47 gain 152 187 -113.30 gain 187 152 -115.85 gain 152 188 -110.96 gain 188 152 -116.77 gain 152 189 -121.43 gain 189 152 -124.75 gain 152 190 -118.94 gain 190 152 -119.28 gain 152 191 -119.83 gain 191 152 -121.26 gain 152 192 -114.66 gain 192 152 -118.95 gain 152 193 -125.44 gain 193 152 -130.98 gain 152 194 -123.59 gain 194 152 -122.95 gain 152 195 -106.08 gain 195 152 -106.07 gain 152 196 -108.55 gain 196 152 -112.58 gain 152 197 -108.27 gain 197 152 -108.36 gain 152 198 -100.82 gain 198 152 -100.43 gain 152 199 -102.25 gain 199 152 -105.78 gain 152 200 -112.50 gain 200 152 -112.97 gain 152 201 -111.72 gain 201 152 -112.99 gain 152 202 -117.34 gain 202 152 -122.61 gain 152 203 -115.95 gain 203 152 -120.84 gain 152 204 -119.70 gain 204 152 -121.88 gain 152 205 -115.22 gain 205 152 -116.47 gain 152 206 -119.39 gain 206 152 -125.16 gain 152 207 -124.75 gain 207 152 -122.89 gain 152 208 -124.32 gain 208 152 -128.23 gain 152 209 -118.16 gain 209 152 -123.06 gain 152 210 -110.89 gain 210 152 -112.73 gain 152 211 -105.41 gain 211 152 -109.28 gain 152 212 -108.63 gain 212 152 -111.04 gain 152 213 -112.87 gain 213 152 -114.47 gain 152 214 -106.66 gain 214 152 -108.14 gain 152 215 -109.71 gain 215 152 -107.61 gain 152 216 -107.43 gain 216 152 -109.99 gain 152 217 -119.51 gain 217 152 -122.59 gain 152 218 -112.38 gain 218 152 -117.65 gain 152 219 -120.22 gain 219 152 -116.85 gain 152 220 -116.38 gain 220 152 -123.50 gain 152 221 -118.48 gain 221 152 -121.24 gain 152 222 -118.33 gain 222 152 -121.42 gain 152 223 -122.87 gain 223 152 -124.57 gain 152 224 -115.71 gain 224 152 -120.10 gain 153 154 -92.56 gain 154 153 -101.11 gain 153 155 -97.66 gain 155 153 -106.10 gain 153 156 -104.99 gain 156 153 -107.83 gain 153 157 -96.19 gain 157 153 -101.97 gain 153 158 -116.65 gain 158 153 -125.02 gain 153 159 -112.22 gain 159 153 -117.21 gain 153 160 -114.04 gain 160 153 -116.14 gain 153 161 -113.13 gain 161 153 -118.72 gain 153 162 -110.51 gain 162 153 -114.96 gain 153 163 -112.50 gain 163 153 -119.10 gain 153 164 -119.14 gain 164 153 -126.79 gain 153 165 -99.22 gain 165 153 -102.90 gain 153 166 -103.62 gain 166 153 -108.88 gain 153 167 -91.42 gain 167 153 -98.77 gain 153 168 -91.71 gain 168 153 -97.51 gain 153 169 -95.72 gain 169 153 -105.71 gain 153 170 -103.85 gain 170 153 -105.37 gain 153 171 -107.02 gain 171 153 -113.56 gain 153 172 -104.11 gain 172 153 -105.35 gain 153 173 -110.21 gain 173 153 -110.89 gain 153 174 -113.63 gain 174 153 -118.60 gain 153 175 -115.02 gain 175 153 -123.55 gain 153 176 -115.95 gain 176 153 -116.49 gain 153 177 -127.52 gain 177 153 -135.87 gain 153 178 -109.77 gain 178 153 -113.94 gain 153 179 -116.91 gain 179 153 -119.48 gain 153 180 -100.93 gain 180 153 -104.96 gain 153 181 -101.61 gain 181 153 -105.71 gain 153 182 -95.31 gain 182 153 -101.80 gain 153 183 -92.97 gain 183 153 -92.85 gain 153 184 -93.58 gain 184 153 -98.24 gain 153 185 -103.93 gain 185 153 -106.08 gain 153 186 -106.84 gain 186 153 -109.27 gain 153 187 -110.82 gain 187 153 -115.80 gain 153 188 -110.04 gain 188 153 -118.28 gain 153 189 -104.56 gain 189 153 -110.31 gain 153 190 -115.57 gain 190 153 -118.33 gain 153 191 -120.67 gain 191 153 -124.52 gain 153 192 -122.31 gain 192 153 -129.02 gain 153 193 -123.64 gain 193 153 -131.61 gain 153 194 -125.07 gain 194 153 -126.85 gain 153 195 -107.83 gain 195 153 -110.24 gain 153 196 -107.49 gain 196 153 -113.95 gain 153 197 -107.88 gain 197 153 -110.39 gain 153 198 -100.12 gain 198 153 -102.16 gain 153 199 -104.38 gain 199 153 -110.34 gain 153 200 -103.75 gain 200 153 -106.64 gain 153 201 -106.83 gain 201 153 -110.53 gain 153 202 -104.84 gain 202 153 -112.54 gain 153 203 -115.59 gain 203 153 -122.90 gain 153 204 -111.84 gain 204 153 -116.44 gain 153 205 -112.66 gain 205 153 -116.33 gain 153 206 -121.54 gain 206 153 -129.74 gain 153 207 -125.19 gain 207 153 -125.75 gain 153 208 -123.06 gain 208 153 -129.40 gain 153 209 -127.08 gain 209 153 -134.40 gain 153 210 -110.68 gain 210 153 -114.94 gain 153 211 -106.20 gain 211 153 -112.48 gain 153 212 -105.53 gain 212 153 -110.35 gain 153 213 -105.95 gain 213 153 -109.97 gain 153 214 -108.18 gain 214 153 -112.09 gain 153 215 -109.24 gain 215 153 -109.56 gain 153 216 -110.59 gain 216 153 -115.57 gain 153 217 -107.11 gain 217 153 -112.61 gain 153 218 -108.39 gain 218 153 -116.08 gain 153 219 -113.03 gain 219 153 -112.09 gain 153 220 -121.27 gain 220 153 -130.81 gain 153 221 -116.92 gain 221 153 -122.11 gain 153 222 -114.68 gain 222 153 -120.19 gain 153 223 -120.70 gain 223 153 -124.82 gain 153 224 -124.36 gain 224 153 -131.17 gain 154 155 -93.78 gain 155 154 -93.67 gain 154 156 -109.44 gain 156 154 -103.73 gain 154 157 -117.32 gain 157 154 -114.55 gain 154 158 -118.94 gain 158 154 -118.76 gain 154 159 -119.56 gain 159 154 -116.00 gain 154 160 -121.61 gain 160 154 -115.16 gain 154 161 -132.65 gain 161 154 -129.70 gain 154 162 -122.91 gain 162 154 -118.82 gain 154 163 -131.24 gain 163 154 -129.29 gain 154 164 -132.08 gain 164 154 -131.18 gain 154 165 -124.63 gain 165 154 -119.77 gain 154 166 -117.67 gain 166 154 -114.38 gain 154 167 -107.41 gain 167 154 -106.21 gain 154 168 -100.50 gain 168 154 -97.75 gain 154 169 -100.89 gain 169 154 -102.34 gain 154 170 -105.10 gain 170 154 -98.07 gain 154 171 -111.70 gain 171 154 -109.69 gain 154 172 -106.43 gain 172 154 -99.12 gain 154 173 -119.26 gain 173 154 -111.39 gain 154 174 -119.77 gain 174 154 -116.20 gain 154 175 -125.61 gain 175 154 -125.59 gain 154 176 -129.87 gain 176 154 -121.86 gain 154 177 -125.61 gain 177 154 -125.41 gain 154 178 -123.66 gain 178 154 -119.28 gain 154 179 -127.17 gain 179 154 -121.19 gain 154 180 -113.89 gain 180 154 -109.38 gain 154 181 -115.30 gain 181 154 -110.85 gain 154 182 -117.07 gain 182 154 -115.02 gain 154 183 -107.30 gain 183 154 -98.64 gain 154 184 -100.98 gain 184 154 -97.09 gain 154 185 -107.60 gain 185 154 -101.20 gain 154 186 -105.66 gain 186 154 -99.54 gain 154 187 -123.11 gain 187 154 -119.53 gain 154 188 -116.51 gain 188 154 -116.19 gain 154 189 -115.25 gain 189 154 -112.45 gain 154 190 -118.66 gain 190 154 -112.88 gain 154 191 -125.26 gain 191 154 -120.56 gain 154 192 -130.50 gain 192 154 -128.67 gain 154 193 -124.55 gain 193 154 -123.97 gain 154 194 -129.67 gain 194 154 -122.90 gain 154 195 -115.90 gain 195 154 -109.77 gain 154 196 -116.85 gain 196 154 -114.76 gain 154 197 -114.57 gain 197 154 -108.54 gain 154 198 -114.53 gain 198 154 -108.02 gain 154 199 -115.64 gain 199 154 -113.05 gain 154 200 -114.43 gain 200 154 -108.77 gain 154 201 -112.90 gain 201 154 -108.04 gain 154 202 -112.24 gain 202 154 -111.39 gain 154 203 -115.13 gain 203 154 -113.90 gain 154 204 -120.18 gain 204 154 -116.23 gain 154 205 -128.84 gain 205 154 -123.97 gain 154 206 -121.06 gain 206 154 -120.71 gain 154 207 -120.12 gain 207 154 -112.13 gain 154 208 -123.15 gain 208 154 -120.94 gain 154 209 -129.44 gain 209 154 -128.21 gain 154 210 -121.15 gain 210 154 -116.87 gain 154 211 -113.80 gain 211 154 -111.53 gain 154 212 -119.27 gain 212 154 -115.55 gain 154 213 -115.77 gain 213 154 -111.24 gain 154 214 -119.66 gain 214 154 -115.02 gain 154 215 -118.17 gain 215 154 -109.95 gain 154 216 -121.98 gain 216 154 -118.42 gain 154 217 -118.78 gain 217 154 -115.73 gain 154 218 -118.26 gain 218 154 -117.40 gain 154 219 -114.88 gain 219 154 -105.38 gain 154 220 -128.25 gain 220 154 -129.25 gain 154 221 -128.23 gain 221 154 -124.86 gain 154 222 -130.72 gain 222 154 -127.68 gain 154 223 -124.19 gain 223 154 -119.77 gain 154 224 -126.84 gain 224 154 -125.10 gain 155 156 -90.61 gain 156 155 -85.00 gain 155 157 -107.68 gain 157 155 -105.01 gain 155 158 -106.37 gain 158 155 -106.29 gain 155 159 -115.81 gain 159 155 -112.36 gain 155 160 -119.84 gain 160 155 -113.50 gain 155 161 -122.53 gain 161 155 -119.67 gain 155 162 -123.20 gain 162 155 -119.21 gain 155 163 -124.06 gain 163 155 -122.22 gain 155 164 -130.33 gain 164 155 -129.53 gain 155 165 -120.55 gain 165 155 -115.79 gain 155 166 -114.36 gain 166 155 -111.17 gain 155 167 -103.26 gain 167 155 -102.16 gain 155 168 -113.27 gain 168 155 -110.62 gain 155 169 -101.79 gain 169 155 -103.34 gain 155 170 -97.78 gain 170 155 -90.85 gain 155 171 -99.35 gain 171 155 -97.45 gain 155 172 -106.90 gain 172 155 -99.70 gain 155 173 -116.45 gain 173 155 -108.68 gain 155 174 -113.60 gain 174 155 -110.13 gain 155 175 -121.22 gain 175 155 -121.30 gain 155 176 -117.14 gain 176 155 -109.24 gain 155 177 -122.15 gain 177 155 -122.06 gain 155 178 -119.29 gain 178 155 -115.02 gain 155 179 -126.58 gain 179 155 -120.71 gain 155 180 -117.63 gain 180 155 -113.22 gain 155 181 -108.79 gain 181 155 -104.45 gain 155 182 -119.55 gain 182 155 -117.60 gain 155 183 -112.84 gain 183 155 -104.28 gain 155 184 -112.35 gain 184 155 -108.57 gain 155 185 -109.32 gain 185 155 -103.03 gain 155 186 -111.50 gain 186 155 -105.49 gain 155 187 -102.99 gain 187 155 -99.52 gain 155 188 -115.38 gain 188 155 -115.17 gain 155 189 -120.33 gain 189 155 -117.64 gain 155 190 -117.11 gain 190 155 -111.42 gain 155 191 -121.98 gain 191 155 -117.38 gain 155 192 -125.81 gain 192 155 -124.08 gain 155 193 -120.87 gain 193 155 -120.39 gain 155 194 -125.68 gain 194 155 -119.01 gain 155 195 -114.34 gain 195 155 -108.31 gain 155 196 -113.22 gain 196 155 -111.22 gain 155 197 -111.48 gain 197 155 -105.55 gain 155 198 -117.45 gain 198 155 -111.04 gain 155 199 -115.83 gain 199 155 -113.34 gain 155 200 -109.48 gain 200 155 -103.93 gain 155 201 -112.43 gain 201 155 -107.68 gain 155 202 -112.31 gain 202 155 -111.56 gain 155 203 -119.47 gain 203 155 -118.34 gain 155 204 -114.73 gain 204 155 -110.88 gain 155 205 -118.63 gain 205 155 -113.86 gain 155 206 -122.38 gain 206 155 -122.13 gain 155 207 -119.76 gain 207 155 -111.87 gain 155 208 -127.58 gain 208 155 -125.47 gain 155 209 -124.52 gain 209 155 -123.40 gain 155 210 -127.73 gain 210 155 -123.54 gain 155 211 -121.34 gain 211 155 -119.18 gain 155 212 -121.59 gain 212 155 -117.98 gain 155 213 -119.16 gain 213 155 -114.73 gain 155 214 -117.22 gain 214 155 -112.68 gain 155 215 -115.95 gain 215 155 -107.83 gain 155 216 -113.60 gain 216 155 -110.14 gain 155 217 -117.94 gain 217 155 -115.00 gain 155 218 -117.30 gain 218 155 -116.55 gain 155 219 -119.34 gain 219 155 -109.95 gain 155 220 -125.34 gain 220 155 -126.43 gain 155 221 -121.50 gain 221 155 -118.24 gain 155 222 -123.59 gain 222 155 -120.66 gain 155 223 -132.60 gain 223 155 -128.28 gain 155 224 -128.16 gain 224 155 -126.52 gain 156 157 -98.25 gain 157 156 -101.20 gain 156 158 -98.57 gain 158 156 -104.11 gain 156 159 -106.42 gain 159 156 -108.57 gain 156 160 -113.86 gain 160 156 -113.13 gain 156 161 -117.29 gain 161 156 -120.05 gain 156 162 -110.79 gain 162 156 -112.41 gain 156 163 -122.46 gain 163 156 -126.23 gain 156 164 -122.79 gain 164 156 -127.60 gain 156 165 -116.90 gain 165 156 -117.76 gain 156 166 -112.92 gain 166 156 -115.35 gain 156 167 -111.66 gain 167 156 -116.17 gain 156 168 -109.69 gain 168 156 -112.66 gain 156 169 -104.31 gain 169 156 -111.47 gain 156 170 -88.02 gain 170 156 -86.71 gain 156 171 -93.09 gain 171 156 -96.80 gain 156 172 -97.42 gain 172 156 -95.83 gain 156 173 -109.13 gain 173 156 -106.98 gain 156 174 -106.27 gain 174 156 -108.41 gain 156 175 -108.33 gain 175 156 -114.03 gain 156 176 -115.01 gain 176 156 -112.72 gain 156 177 -109.92 gain 177 156 -115.44 gain 156 178 -109.14 gain 178 156 -110.48 gain 156 179 -116.29 gain 179 156 -116.03 gain 156 180 -116.53 gain 180 156 -117.73 gain 156 181 -114.40 gain 181 156 -115.67 gain 156 182 -118.48 gain 182 156 -122.14 gain 156 183 -112.90 gain 183 156 -109.95 gain 156 184 -102.41 gain 184 156 -104.24 gain 156 185 -96.13 gain 185 156 -95.45 gain 156 186 -99.53 gain 186 156 -99.13 gain 156 187 -104.08 gain 187 156 -106.22 gain 156 188 -106.63 gain 188 156 -112.03 gain 156 189 -109.93 gain 189 156 -112.84 gain 156 190 -112.65 gain 190 156 -112.58 gain 156 191 -119.55 gain 191 156 -120.56 gain 156 192 -119.45 gain 192 156 -123.34 gain 156 193 -118.41 gain 193 156 -123.55 gain 156 194 -120.96 gain 194 156 -119.91 gain 156 195 -115.30 gain 195 156 -114.88 gain 156 196 -115.23 gain 196 156 -118.85 gain 156 197 -111.86 gain 197 156 -111.54 gain 156 198 -107.69 gain 198 156 -106.89 gain 156 199 -110.57 gain 199 156 -113.69 gain 156 200 -107.11 gain 200 156 -107.16 gain 156 201 -104.42 gain 201 156 -105.29 gain 156 202 -102.91 gain 202 156 -107.77 gain 156 203 -112.92 gain 203 156 -117.40 gain 156 204 -115.92 gain 204 156 -117.69 gain 156 205 -106.81 gain 205 156 -107.65 gain 156 206 -113.45 gain 206 156 -118.81 gain 156 207 -118.40 gain 207 156 -116.12 gain 156 208 -118.60 gain 208 156 -122.10 gain 156 209 -118.52 gain 209 156 -123.02 gain 156 210 -118.16 gain 210 156 -119.59 gain 156 211 -116.03 gain 211 156 -119.48 gain 156 212 -113.14 gain 212 156 -115.14 gain 156 213 -115.67 gain 213 156 -116.86 gain 156 214 -115.20 gain 214 156 -116.27 gain 156 215 -112.89 gain 215 156 -110.38 gain 156 216 -109.62 gain 216 156 -111.77 gain 156 217 -112.74 gain 217 156 -115.41 gain 156 218 -107.72 gain 218 156 -112.58 gain 156 219 -122.67 gain 219 156 -118.89 gain 156 220 -115.49 gain 220 156 -122.20 gain 156 221 -117.64 gain 221 156 -119.99 gain 156 222 -125.03 gain 222 156 -127.71 gain 156 223 -115.41 gain 223 156 -116.71 gain 156 224 -114.99 gain 224 156 -118.97 gain 157 158 -94.26 gain 158 157 -96.86 gain 157 159 -106.42 gain 159 157 -105.63 gain 157 160 -105.16 gain 160 157 -101.48 gain 157 161 -108.09 gain 161 157 -107.90 gain 157 162 -109.89 gain 162 157 -108.57 gain 157 163 -119.60 gain 163 157 -120.43 gain 157 164 -122.04 gain 164 157 -123.91 gain 157 165 -126.58 gain 165 157 -124.49 gain 157 166 -122.81 gain 166 157 -122.29 gain 157 167 -113.74 gain 167 157 -115.31 gain 157 168 -113.06 gain 168 157 -113.08 gain 157 169 -113.82 gain 169 157 -118.04 gain 157 170 -103.60 gain 170 157 -99.34 gain 157 171 -101.92 gain 171 157 -102.68 gain 157 172 -96.45 gain 172 157 -91.92 gain 157 173 -98.99 gain 173 157 -93.89 gain 157 174 -109.70 gain 174 157 -108.89 gain 157 175 -108.70 gain 175 157 -111.45 gain 157 176 -117.19 gain 176 157 -111.95 gain 157 177 -110.28 gain 177 157 -112.86 gain 157 178 -115.82 gain 178 157 -114.22 gain 157 179 -114.32 gain 179 157 -111.11 gain 157 180 -122.37 gain 180 157 -120.63 gain 157 181 -120.38 gain 181 157 -118.71 gain 157 182 -114.25 gain 182 157 -114.97 gain 157 183 -110.69 gain 183 157 -104.80 gain 157 184 -114.84 gain 184 157 -113.73 gain 157 185 -115.16 gain 185 157 -111.53 gain 157 186 -114.47 gain 186 157 -111.12 gain 157 187 -96.44 gain 187 157 -95.64 gain 157 188 -105.32 gain 188 157 -107.78 gain 157 189 -104.44 gain 189 157 -104.41 gain 157 190 -111.88 gain 190 157 -108.86 gain 157 191 -113.07 gain 191 157 -111.15 gain 157 192 -112.17 gain 192 157 -113.11 gain 157 193 -124.93 gain 193 157 -127.12 gain 157 194 -120.44 gain 194 157 -116.44 gain 157 195 -117.31 gain 195 157 -113.95 gain 157 196 -116.29 gain 196 157 -116.97 gain 157 197 -120.41 gain 197 157 -117.15 gain 157 198 -109.90 gain 198 157 -106.16 gain 157 199 -117.85 gain 199 157 -118.03 gain 157 200 -111.51 gain 200 157 -108.62 gain 157 201 -114.33 gain 201 157 -112.25 gain 157 202 -106.96 gain 202 157 -108.88 gain 157 203 -110.29 gain 203 157 -111.83 gain 157 204 -110.35 gain 204 157 -109.18 gain 157 205 -121.14 gain 205 157 -119.03 gain 157 206 -115.54 gain 206 157 -117.96 gain 157 207 -119.25 gain 207 157 -114.03 gain 157 208 -121.62 gain 208 157 -122.18 gain 157 209 -121.19 gain 209 157 -122.74 gain 157 210 -121.51 gain 210 157 -120.00 gain 157 211 -127.55 gain 211 157 -128.06 gain 157 212 -118.36 gain 212 157 -117.40 gain 157 213 -123.56 gain 213 157 -121.80 gain 157 214 -113.74 gain 214 157 -111.87 gain 157 215 -109.08 gain 215 157 -103.63 gain 157 216 -115.08 gain 216 157 -114.28 gain 157 217 -120.04 gain 217 157 -119.77 gain 157 218 -117.51 gain 218 157 -119.43 gain 157 219 -112.04 gain 219 157 -105.31 gain 157 220 -114.35 gain 220 157 -118.11 gain 157 221 -113.62 gain 221 157 -113.03 gain 157 222 -112.67 gain 222 157 -112.40 gain 157 223 -127.83 gain 223 157 -126.18 gain 157 224 -119.57 gain 224 157 -120.61 gain 158 159 -99.51 gain 159 158 -96.12 gain 158 160 -102.87 gain 160 158 -96.60 gain 158 161 -113.30 gain 161 158 -110.52 gain 158 162 -106.41 gain 162 158 -102.50 gain 158 163 -121.30 gain 163 158 -119.54 gain 158 164 -113.90 gain 164 158 -113.17 gain 158 165 -125.66 gain 165 158 -120.98 gain 158 166 -122.07 gain 166 158 -118.96 gain 158 167 -122.45 gain 167 158 -121.43 gain 158 168 -122.28 gain 168 158 -119.70 gain 158 169 -117.77 gain 169 158 -119.40 gain 158 170 -106.96 gain 170 158 -100.11 gain 158 171 -107.03 gain 171 158 -105.21 gain 158 172 -102.46 gain 172 158 -95.33 gain 158 173 -96.13 gain 173 158 -88.43 gain 158 174 -107.66 gain 174 158 -104.27 gain 158 175 -117.81 gain 175 158 -117.96 gain 158 176 -108.50 gain 176 158 -100.67 gain 158 177 -112.37 gain 177 158 -112.35 gain 158 178 -117.94 gain 178 158 -113.75 gain 158 179 -113.01 gain 179 158 -107.20 gain 158 180 -115.74 gain 180 158 -111.40 gain 158 181 -120.61 gain 181 158 -116.35 gain 158 182 -126.85 gain 182 158 -124.97 gain 158 183 -114.04 gain 183 158 -105.55 gain 158 184 -117.05 gain 184 158 -113.34 gain 158 185 -113.05 gain 185 158 -106.82 gain 158 186 -113.37 gain 186 158 -107.43 gain 158 187 -105.42 gain 187 158 -102.02 gain 158 188 -111.24 gain 188 158 -111.10 gain 158 189 -113.44 gain 189 158 -110.81 gain 158 190 -111.88 gain 190 158 -106.26 gain 158 191 -115.92 gain 191 158 -111.40 gain 158 192 -114.50 gain 192 158 -112.84 gain 158 193 -127.68 gain 193 158 -127.28 gain 158 194 -122.16 gain 194 158 -115.57 gain 158 195 -118.21 gain 195 158 -112.25 gain 158 196 -121.29 gain 196 158 -119.37 gain 158 197 -123.21 gain 197 158 -117.35 gain 158 198 -121.35 gain 198 158 -115.02 gain 158 199 -110.99 gain 199 158 -108.57 gain 158 200 -116.04 gain 200 158 -110.56 gain 158 201 -118.54 gain 201 158 -113.86 gain 158 202 -113.58 gain 202 158 -112.91 gain 158 203 -112.33 gain 203 158 -111.28 gain 158 204 -106.16 gain 204 158 -102.39 gain 158 205 -111.91 gain 205 158 -107.22 gain 158 206 -120.51 gain 206 158 -120.33 gain 158 207 -121.77 gain 207 158 -113.96 gain 158 208 -109.74 gain 208 158 -107.70 gain 158 209 -126.17 gain 209 158 -125.12 gain 158 210 -125.00 gain 210 158 -120.89 gain 158 211 -125.07 gain 211 158 -122.98 gain 158 212 -121.41 gain 212 158 -117.86 gain 158 213 -119.78 gain 213 158 -115.42 gain 158 214 -117.59 gain 214 158 -113.13 gain 158 215 -120.91 gain 215 158 -112.86 gain 158 216 -114.83 gain 216 158 -111.44 gain 158 217 -115.83 gain 217 158 -112.96 gain 158 218 -112.44 gain 218 158 -111.76 gain 158 219 -107.87 gain 219 158 -98.55 gain 158 220 -121.15 gain 220 158 -122.32 gain 158 221 -112.51 gain 221 158 -109.32 gain 158 222 -129.76 gain 222 158 -126.90 gain 158 223 -125.73 gain 223 158 -121.48 gain 158 224 -124.36 gain 224 158 -122.80 gain 159 160 -89.32 gain 160 159 -86.43 gain 159 161 -100.04 gain 161 159 -100.64 gain 159 162 -104.39 gain 162 159 -103.86 gain 159 163 -113.41 gain 163 159 -115.03 gain 159 164 -117.81 gain 164 159 -120.47 gain 159 165 -120.40 gain 165 159 -119.10 gain 159 166 -120.45 gain 166 159 -120.72 gain 159 167 -125.74 gain 167 159 -128.10 gain 159 168 -115.18 gain 168 159 -115.98 gain 159 169 -110.68 gain 169 159 -115.69 gain 159 170 -118.04 gain 170 159 -114.57 gain 159 171 -114.78 gain 171 159 -116.34 gain 159 172 -97.56 gain 172 159 -93.81 gain 159 173 -98.87 gain 173 159 -94.55 gain 159 174 -91.63 gain 174 159 -91.61 gain 159 175 -98.67 gain 175 159 -102.21 gain 159 176 -103.49 gain 176 159 -99.04 gain 159 177 -100.59 gain 177 159 -103.95 gain 159 178 -112.72 gain 178 159 -111.90 gain 159 179 -115.34 gain 179 159 -112.92 gain 159 180 -121.47 gain 180 159 -120.52 gain 159 181 -119.14 gain 181 159 -118.26 gain 159 182 -124.99 gain 182 159 -126.49 gain 159 183 -115.87 gain 183 159 -110.76 gain 159 184 -114.59 gain 184 159 -114.27 gain 159 185 -114.86 gain 185 159 -112.02 gain 159 186 -110.70 gain 186 159 -108.14 gain 159 187 -111.04 gain 187 159 -111.03 gain 159 188 -102.95 gain 188 159 -106.19 gain 159 189 -98.70 gain 189 159 -99.46 gain 159 190 -107.86 gain 190 159 -105.63 gain 159 191 -105.22 gain 191 159 -104.08 gain 159 192 -105.73 gain 192 159 -107.46 gain 159 193 -109.76 gain 193 159 -112.74 gain 159 194 -125.82 gain 194 159 -122.60 gain 159 195 -126.38 gain 195 159 -123.80 gain 159 196 -120.84 gain 196 159 -122.31 gain 159 197 -113.23 gain 197 159 -110.75 gain 159 198 -119.45 gain 198 159 -116.49 gain 159 199 -112.03 gain 199 159 -113.00 gain 159 200 -106.70 gain 200 159 -104.60 gain 159 201 -105.13 gain 201 159 -103.83 gain 159 202 -113.27 gain 202 159 -115.97 gain 159 203 -110.10 gain 203 159 -112.43 gain 159 204 -108.83 gain 204 159 -108.44 gain 159 205 -103.62 gain 205 159 -102.30 gain 159 206 -114.43 gain 206 159 -117.64 gain 159 207 -116.76 gain 207 159 -112.33 gain 159 208 -117.30 gain 208 159 -118.65 gain 159 209 -117.30 gain 209 159 -119.64 gain 159 210 -135.32 gain 210 159 -134.59 gain 159 211 -117.55 gain 211 159 -118.85 gain 159 212 -122.75 gain 212 159 -122.58 gain 159 213 -128.75 gain 213 159 -127.78 gain 159 214 -118.72 gain 214 159 -117.64 gain 159 215 -115.83 gain 215 159 -111.16 gain 159 216 -113.73 gain 216 159 -113.72 gain 159 217 -113.01 gain 217 159 -113.52 gain 159 218 -114.85 gain 218 159 -117.55 gain 159 219 -112.50 gain 219 159 -106.57 gain 159 220 -113.52 gain 220 159 -118.07 gain 159 221 -109.69 gain 221 159 -109.88 gain 159 222 -109.78 gain 222 159 -110.30 gain 159 223 -112.75 gain 223 159 -111.88 gain 159 224 -118.33 gain 224 159 -120.15 gain 160 161 -83.27 gain 161 160 -86.76 gain 160 162 -97.21 gain 162 160 -99.57 gain 160 163 -100.53 gain 163 160 -105.04 gain 160 164 -107.00 gain 164 160 -112.55 gain 160 165 -123.94 gain 165 160 -125.52 gain 160 166 -111.06 gain 166 160 -114.22 gain 160 167 -119.45 gain 167 160 -124.69 gain 160 168 -112.76 gain 168 160 -116.46 gain 160 169 -109.36 gain 169 160 -117.26 gain 160 170 -110.50 gain 170 160 -109.92 gain 160 171 -107.07 gain 171 160 -111.52 gain 160 172 -108.69 gain 172 160 -107.84 gain 160 173 -98.94 gain 173 160 -97.51 gain 160 174 -90.73 gain 174 160 -93.61 gain 160 175 -91.49 gain 175 160 -97.92 gain 160 176 -91.32 gain 176 160 -89.75 gain 160 177 -104.05 gain 177 160 -110.30 gain 160 178 -104.79 gain 178 160 -106.86 gain 160 179 -110.11 gain 179 160 -110.57 gain 160 180 -120.09 gain 180 160 -122.02 gain 160 181 -124.54 gain 181 160 -126.55 gain 160 182 -114.09 gain 182 160 -118.48 gain 160 183 -123.46 gain 183 160 -121.24 gain 160 184 -118.39 gain 184 160 -120.95 gain 160 185 -112.87 gain 185 160 -112.92 gain 160 186 -106.90 gain 186 160 -107.24 gain 160 187 -109.07 gain 187 160 -111.94 gain 160 188 -105.04 gain 188 160 -111.17 gain 160 189 -100.34 gain 189 160 -103.99 gain 160 190 -92.85 gain 190 160 -93.50 gain 160 191 -99.79 gain 191 160 -101.54 gain 160 192 -106.76 gain 192 160 -111.38 gain 160 193 -111.22 gain 193 160 -117.09 gain 160 194 -112.70 gain 194 160 -112.37 gain 160 195 -123.50 gain 195 160 -123.81 gain 160 196 -114.14 gain 196 160 -118.49 gain 160 197 -115.51 gain 197 160 -115.92 gain 160 198 -122.84 gain 198 160 -122.77 gain 160 199 -119.19 gain 199 160 -123.04 gain 160 200 -115.64 gain 200 160 -116.43 gain 160 201 -117.20 gain 201 160 -118.80 gain 160 202 -111.21 gain 202 160 -116.80 gain 160 203 -109.45 gain 203 160 -114.67 gain 160 204 -104.19 gain 204 160 -106.69 gain 160 205 -104.53 gain 205 160 -106.11 gain 160 206 -107.72 gain 206 160 -113.81 gain 160 207 -108.14 gain 207 160 -106.60 gain 160 208 -111.84 gain 208 160 -116.07 gain 160 209 -114.39 gain 209 160 -119.61 gain 160 210 -124.00 gain 210 160 -126.16 gain 160 211 -120.28 gain 211 160 -124.47 gain 160 212 -118.54 gain 212 160 -121.27 gain 160 213 -114.00 gain 213 160 -115.92 gain 160 214 -114.49 gain 214 160 -116.29 gain 160 215 -110.21 gain 215 160 -108.44 gain 160 216 -122.27 gain 216 160 -125.15 gain 160 217 -110.83 gain 217 160 -114.23 gain 160 218 -112.04 gain 218 160 -117.63 gain 160 219 -110.13 gain 219 160 -107.08 gain 160 220 -107.22 gain 220 160 -114.66 gain 160 221 -105.40 gain 221 160 -108.48 gain 160 222 -101.61 gain 222 160 -105.02 gain 160 223 -118.50 gain 223 160 -120.52 gain 160 224 -119.35 gain 224 160 -124.06 gain 161 162 -95.92 gain 162 161 -94.79 gain 161 163 -102.94 gain 163 161 -103.95 gain 161 164 -106.87 gain 164 161 -108.93 gain 161 165 -121.52 gain 165 161 -119.62 gain 161 166 -127.30 gain 166 161 -126.97 gain 161 167 -127.84 gain 167 161 -129.60 gain 161 168 -117.38 gain 168 161 -117.59 gain 161 169 -120.73 gain 169 161 -125.13 gain 161 170 -121.92 gain 170 161 -117.85 gain 161 171 -125.27 gain 171 161 -126.23 gain 161 172 -110.47 gain 172 161 -106.12 gain 161 173 -111.00 gain 173 161 -106.09 gain 161 174 -108.37 gain 174 161 -107.75 gain 161 175 -105.27 gain 175 161 -108.21 gain 161 176 -98.17 gain 176 161 -93.12 gain 161 177 -91.96 gain 177 161 -94.73 gain 161 178 -108.67 gain 178 161 -107.25 gain 161 179 -117.18 gain 179 161 -114.16 gain 161 180 -120.62 gain 180 161 -119.07 gain 161 181 -120.70 gain 181 161 -119.21 gain 161 182 -124.25 gain 182 161 -125.15 gain 161 183 -118.14 gain 183 161 -112.43 gain 161 184 -119.21 gain 184 161 -118.28 gain 161 185 -114.03 gain 185 161 -110.59 gain 161 186 -112.63 gain 186 161 -109.47 gain 161 187 -109.64 gain 187 161 -109.02 gain 161 188 -106.90 gain 188 161 -109.54 gain 161 189 -102.10 gain 189 161 -102.25 gain 161 190 -104.88 gain 190 161 -102.05 gain 161 191 -99.28 gain 191 161 -97.54 gain 161 192 -97.58 gain 192 161 -98.71 gain 161 193 -110.30 gain 193 161 -112.67 gain 161 194 -116.70 gain 194 161 -112.88 gain 161 195 -130.62 gain 195 161 -127.44 gain 161 196 -126.62 gain 196 161 -127.48 gain 161 197 -122.56 gain 197 161 -119.48 gain 161 198 -122.15 gain 198 161 -118.60 gain 161 199 -116.75 gain 199 161 -117.11 gain 161 200 -121.71 gain 200 161 -119.01 gain 161 201 -123.30 gain 201 161 -121.40 gain 161 202 -124.52 gain 202 161 -126.62 gain 161 203 -114.86 gain 203 161 -116.58 gain 161 204 -109.06 gain 204 161 -108.07 gain 161 205 -110.72 gain 205 161 -108.81 gain 161 206 -102.45 gain 206 161 -105.06 gain 161 207 -105.33 gain 207 161 -100.29 gain 161 208 -109.98 gain 208 161 -110.73 gain 161 209 -107.80 gain 209 161 -109.54 gain 161 210 -124.17 gain 210 161 -122.84 gain 161 211 -126.55 gain 211 161 -127.24 gain 161 212 -122.38 gain 212 161 -121.62 gain 161 213 -125.16 gain 213 161 -123.59 gain 161 214 -118.27 gain 214 161 -116.58 gain 161 215 -121.66 gain 215 161 -116.39 gain 161 216 -116.59 gain 216 161 -115.98 gain 161 217 -114.59 gain 217 161 -114.50 gain 161 218 -114.04 gain 218 161 -116.14 gain 161 219 -113.70 gain 219 161 -107.16 gain 161 220 -118.78 gain 220 161 -122.73 gain 161 221 -108.44 gain 221 161 -108.03 gain 161 222 -111.80 gain 222 161 -111.72 gain 161 223 -115.60 gain 223 161 -114.13 gain 161 224 -115.91 gain 224 161 -117.13 gain 162 163 -93.18 gain 163 162 -95.33 gain 162 164 -103.85 gain 164 162 -107.04 gain 162 165 -127.30 gain 165 162 -126.53 gain 162 166 -120.65 gain 166 162 -121.46 gain 162 167 -123.29 gain 167 162 -126.18 gain 162 168 -119.63 gain 168 162 -120.97 gain 162 169 -118.94 gain 169 162 -124.48 gain 162 170 -112.01 gain 170 162 -109.07 gain 162 171 -115.77 gain 171 162 -117.86 gain 162 172 -117.82 gain 172 162 -114.61 gain 162 173 -111.03 gain 173 162 -107.25 gain 162 174 -107.18 gain 174 162 -107.70 gain 162 175 -103.11 gain 175 162 -107.19 gain 162 176 -96.91 gain 176 162 -92.99 gain 162 177 -93.82 gain 177 162 -97.72 gain 162 178 -99.19 gain 178 162 -98.91 gain 162 179 -106.05 gain 179 162 -104.17 gain 162 180 -130.03 gain 180 162 -129.61 gain 162 181 -120.94 gain 181 162 -120.58 gain 162 182 -122.80 gain 182 162 -124.84 gain 162 183 -129.06 gain 183 162 -124.49 gain 162 184 -124.57 gain 184 162 -124.78 gain 162 185 -118.40 gain 185 162 -116.09 gain 162 186 -118.41 gain 186 162 -116.39 gain 162 187 -115.54 gain 187 162 -116.06 gain 162 188 -108.91 gain 188 162 -112.69 gain 162 189 -107.30 gain 189 162 -108.59 gain 162 190 -113.39 gain 190 162 -111.69 gain 162 191 -111.53 gain 191 162 -110.92 gain 162 192 -115.34 gain 192 162 -117.60 gain 162 193 -107.87 gain 193 162 -111.39 gain 162 194 -98.24 gain 194 162 -95.56 gain 162 195 -120.41 gain 195 162 -118.37 gain 162 196 -125.58 gain 196 162 -127.57 gain 162 197 -128.87 gain 197 162 -126.93 gain 162 198 -114.24 gain 198 162 -111.82 gain 162 199 -124.31 gain 199 162 -125.81 gain 162 200 -113.25 gain 200 162 -111.69 gain 162 201 -122.89 gain 201 162 -122.13 gain 162 202 -120.38 gain 202 162 -123.62 gain 162 203 -113.94 gain 203 162 -116.80 gain 162 204 -112.68 gain 204 162 -112.83 gain 162 205 -110.79 gain 205 162 -110.01 gain 162 206 -114.38 gain 206 162 -118.12 gain 162 207 -109.49 gain 207 162 -105.59 gain 162 208 -113.89 gain 208 162 -115.77 gain 162 209 -99.25 gain 209 162 -102.12 gain 162 210 -121.94 gain 210 162 -121.74 gain 162 211 -120.67 gain 211 162 -122.50 gain 162 212 -131.92 gain 212 162 -132.29 gain 162 213 -119.43 gain 213 162 -118.99 gain 162 214 -120.88 gain 214 162 -120.33 gain 162 215 -117.37 gain 215 162 -113.24 gain 162 216 -117.85 gain 216 162 -118.38 gain 162 217 -120.08 gain 217 162 -121.12 gain 162 218 -119.42 gain 218 162 -122.66 gain 162 219 -115.80 gain 219 162 -110.39 gain 162 220 -106.27 gain 220 162 -111.36 gain 162 221 -109.99 gain 221 162 -110.72 gain 162 222 -117.47 gain 222 162 -118.53 gain 162 223 -113.67 gain 223 162 -113.33 gain 162 224 -112.24 gain 224 162 -114.59 gain 163 164 -97.42 gain 164 163 -98.46 gain 163 165 -131.26 gain 165 163 -128.34 gain 163 166 -130.02 gain 166 163 -128.67 gain 163 167 -128.60 gain 167 163 -129.34 gain 163 168 -128.28 gain 168 163 -127.47 gain 163 169 -123.15 gain 169 163 -126.54 gain 163 170 -120.26 gain 170 163 -115.18 gain 163 171 -120.69 gain 171 163 -120.63 gain 163 172 -120.20 gain 172 163 -114.84 gain 163 173 -125.06 gain 173 163 -119.14 gain 163 174 -118.77 gain 174 163 -117.15 gain 163 175 -108.16 gain 175 163 -110.09 gain 163 176 -104.39 gain 176 163 -98.33 gain 163 177 -105.45 gain 177 163 -107.19 gain 163 178 -93.19 gain 178 163 -90.76 gain 163 179 -93.40 gain 179 163 -89.37 gain 163 180 -134.41 gain 180 163 -131.85 gain 163 181 -126.92 gain 181 163 -124.41 gain 163 182 -127.26 gain 182 163 -127.15 gain 163 183 -121.55 gain 183 163 -114.83 gain 163 184 -120.97 gain 184 163 -119.03 gain 163 185 -124.21 gain 185 163 -119.75 gain 163 186 -120.12 gain 186 163 -115.95 gain 163 187 -119.19 gain 187 163 -117.55 gain 163 188 -119.02 gain 188 163 -120.65 gain 163 189 -112.44 gain 189 163 -111.58 gain 163 190 -113.18 gain 190 163 -109.34 gain 163 191 -109.15 gain 191 163 -106.39 gain 163 192 -98.44 gain 192 163 -98.55 gain 163 193 -100.26 gain 193 163 -101.62 gain 163 194 -110.50 gain 194 163 -105.68 gain 163 195 -129.23 gain 195 163 -125.04 gain 163 196 -127.12 gain 196 163 -126.96 gain 163 197 -122.88 gain 197 163 -118.79 gain 163 198 -125.50 gain 198 163 -120.93 gain 163 199 -130.81 gain 199 163 -130.16 gain 163 200 -121.90 gain 200 163 -118.19 gain 163 201 -120.50 gain 201 163 -117.59 gain 163 202 -115.32 gain 202 163 -116.41 gain 163 203 -119.72 gain 203 163 -120.43 gain 163 204 -113.51 gain 204 163 -111.51 gain 163 205 -110.24 gain 205 163 -107.31 gain 163 206 -117.59 gain 206 163 -119.18 gain 163 207 -99.04 gain 207 163 -92.99 gain 163 208 -109.33 gain 208 163 -109.06 gain 163 209 -114.20 gain 209 163 -114.92 gain 163 210 -129.97 gain 210 163 -127.62 gain 163 211 -139.02 gain 211 163 -138.70 gain 163 212 -122.83 gain 212 163 -121.06 gain 163 213 -127.56 gain 213 163 -124.98 gain 163 214 -121.38 gain 214 163 -118.68 gain 163 215 -126.98 gain 215 163 -120.70 gain 163 216 -121.98 gain 216 163 -120.36 gain 163 217 -132.25 gain 217 163 -131.15 gain 163 218 -122.84 gain 218 163 -123.93 gain 163 219 -127.97 gain 219 163 -120.42 gain 163 220 -119.73 gain 220 163 -122.66 gain 163 221 -109.92 gain 221 163 -108.50 gain 163 222 -108.84 gain 222 163 -107.74 gain 163 223 -114.63 gain 223 163 -112.15 gain 163 224 -111.07 gain 224 163 -111.27 gain 164 165 -131.48 gain 165 164 -127.52 gain 164 166 -124.43 gain 166 164 -122.04 gain 164 167 -130.41 gain 167 164 -130.11 gain 164 168 -129.84 gain 168 164 -127.99 gain 164 169 -132.86 gain 169 164 -135.21 gain 164 170 -131.22 gain 170 164 -125.10 gain 164 171 -123.88 gain 171 164 -122.78 gain 164 172 -121.62 gain 172 164 -115.22 gain 164 173 -119.98 gain 173 164 -113.01 gain 164 174 -124.08 gain 174 164 -121.41 gain 164 175 -114.86 gain 175 164 -115.74 gain 164 176 -112.68 gain 176 164 -105.58 gain 164 177 -104.34 gain 177 164 -105.04 gain 164 178 -110.20 gain 178 164 -106.73 gain 164 179 -96.72 gain 179 164 -91.64 gain 164 180 -129.33 gain 180 164 -125.72 gain 164 181 -130.19 gain 181 164 -126.65 gain 164 182 -134.45 gain 182 164 -133.29 gain 164 183 -129.76 gain 183 164 -122.00 gain 164 184 -126.47 gain 184 164 -123.49 gain 164 185 -127.83 gain 185 164 -122.33 gain 164 186 -122.10 gain 186 164 -116.89 gain 164 187 -121.50 gain 187 164 -118.83 gain 164 188 -115.91 gain 188 164 -116.49 gain 164 189 -106.39 gain 189 164 -104.49 gain 164 190 -126.10 gain 190 164 -121.21 gain 164 191 -116.99 gain 191 164 -113.19 gain 164 192 -113.14 gain 192 164 -112.21 gain 164 193 -104.28 gain 193 164 -104.60 gain 164 194 -108.64 gain 194 164 -102.77 gain 164 195 -137.21 gain 195 164 -131.98 gain 164 196 -128.07 gain 196 164 -126.88 gain 164 197 -136.34 gain 197 164 -131.21 gain 164 198 -122.31 gain 198 164 -116.70 gain 164 199 -122.15 gain 199 164 -120.45 gain 164 200 -121.65 gain 200 164 -116.90 gain 164 201 -125.02 gain 201 164 -121.07 gain 164 202 -130.71 gain 202 164 -130.76 gain 164 203 -121.85 gain 203 164 -121.52 gain 164 204 -115.36 gain 204 164 -112.32 gain 164 205 -117.28 gain 205 164 -113.31 gain 164 206 -113.93 gain 206 164 -114.48 gain 164 207 -116.90 gain 207 164 -109.81 gain 164 208 -115.78 gain 208 164 -114.47 gain 164 209 -106.20 gain 209 164 -105.88 gain 164 210 -132.60 gain 210 164 -129.21 gain 164 211 -126.15 gain 211 164 -124.78 gain 164 212 -127.86 gain 212 164 -125.04 gain 164 213 -125.09 gain 213 164 -121.46 gain 164 214 -119.32 gain 214 164 -115.59 gain 164 215 -132.20 gain 215 164 -124.88 gain 164 216 -132.37 gain 216 164 -129.71 gain 164 217 -125.93 gain 217 164 -123.78 gain 164 218 -117.59 gain 218 164 -117.64 gain 164 219 -123.40 gain 219 164 -114.80 gain 164 220 -108.89 gain 220 164 -110.79 gain 164 221 -121.72 gain 221 164 -119.26 gain 164 222 -114.11 gain 222 164 -111.97 gain 164 223 -113.48 gain 223 164 -109.96 gain 164 224 -114.70 gain 224 164 -113.87 gain 165 166 -97.42 gain 166 165 -98.99 gain 165 167 -105.48 gain 167 165 -109.13 gain 165 168 -106.79 gain 168 165 -108.90 gain 165 169 -108.12 gain 169 165 -114.43 gain 165 170 -113.59 gain 170 165 -111.42 gain 165 171 -118.36 gain 171 165 -121.22 gain 165 172 -122.40 gain 172 165 -119.95 gain 165 173 -125.35 gain 173 165 -122.34 gain 165 174 -126.54 gain 174 165 -127.83 gain 165 175 -118.11 gain 175 165 -122.95 gain 165 176 -120.24 gain 176 165 -117.09 gain 165 177 -129.54 gain 177 165 -134.21 gain 165 178 -123.26 gain 178 165 -123.74 gain 165 179 -131.01 gain 179 165 -129.89 gain 165 180 -91.39 gain 180 165 -91.74 gain 165 181 -92.32 gain 181 165 -92.74 gain 165 182 -105.40 gain 182 165 -108.20 gain 165 183 -102.46 gain 183 165 -98.65 gain 165 184 -108.36 gain 184 165 -109.34 gain 165 185 -117.50 gain 185 165 -115.96 gain 165 186 -121.91 gain 186 165 -120.66 gain 165 187 -115.71 gain 187 165 -116.99 gain 165 188 -110.53 gain 188 165 -115.08 gain 165 189 -119.21 gain 189 165 -121.27 gain 165 190 -127.28 gain 190 165 -126.35 gain 165 191 -121.99 gain 191 165 -122.15 gain 165 192 -122.30 gain 192 165 -125.33 gain 165 193 -124.35 gain 193 165 -128.63 gain 165 194 -124.10 gain 194 165 -122.19 gain 165 195 -105.11 gain 195 165 -103.84 gain 165 196 -102.52 gain 196 165 -105.28 gain 165 197 -106.22 gain 197 165 -105.05 gain 165 198 -118.28 gain 198 165 -116.63 gain 165 199 -114.64 gain 199 165 -116.91 gain 165 200 -116.37 gain 200 165 -115.57 gain 165 201 -116.89 gain 201 165 -116.90 gain 165 202 -122.52 gain 202 165 -126.53 gain 165 203 -120.32 gain 203 165 -123.95 gain 165 204 -122.49 gain 204 165 -123.40 gain 165 205 -124.26 gain 205 165 -124.25 gain 165 206 -125.36 gain 206 165 -129.87 gain 165 207 -130.17 gain 207 165 -127.04 gain 165 208 -130.59 gain 208 165 -133.24 gain 165 209 -124.00 gain 209 165 -127.64 gain 165 210 -99.47 gain 210 165 -100.05 gain 165 211 -101.28 gain 211 165 -103.88 gain 165 212 -108.54 gain 212 165 -109.67 gain 165 213 -111.63 gain 213 165 -111.96 gain 165 214 -112.82 gain 214 165 -113.04 gain 165 215 -114.62 gain 215 165 -111.25 gain 165 216 -122.37 gain 216 165 -123.66 gain 165 217 -118.11 gain 217 165 -119.93 gain 165 218 -114.86 gain 218 165 -118.87 gain 165 219 -124.85 gain 219 165 -120.22 gain 165 220 -119.37 gain 220 165 -125.22 gain 165 221 -122.64 gain 221 165 -124.14 gain 165 222 -129.15 gain 222 165 -130.97 gain 165 223 -123.14 gain 223 165 -123.57 gain 165 224 -126.08 gain 224 165 -129.20 gain 166 167 -96.70 gain 167 166 -98.79 gain 166 168 -104.60 gain 168 166 -105.14 gain 166 169 -108.71 gain 169 166 -113.45 gain 166 170 -118.32 gain 170 166 -114.59 gain 166 171 -118.32 gain 171 166 -119.61 gain 166 172 -113.33 gain 172 166 -109.32 gain 166 173 -119.25 gain 173 166 -114.67 gain 166 174 -124.24 gain 174 166 -123.96 gain 166 175 -118.76 gain 175 166 -122.03 gain 166 176 -125.25 gain 176 166 -120.54 gain 166 177 -123.55 gain 177 166 -126.65 gain 166 178 -127.41 gain 178 166 -126.33 gain 166 179 -129.85 gain 179 166 -127.16 gain 166 180 -96.22 gain 180 166 -95.00 gain 166 181 -91.23 gain 181 166 -90.08 gain 166 182 -93.64 gain 182 166 -94.88 gain 166 183 -104.54 gain 183 166 -99.17 gain 166 184 -107.21 gain 184 166 -106.62 gain 166 185 -111.90 gain 185 166 -108.79 gain 166 186 -114.46 gain 186 166 -111.63 gain 166 187 -122.36 gain 187 166 -122.08 gain 166 188 -126.88 gain 188 166 -129.86 gain 166 189 -120.75 gain 189 166 -121.24 gain 166 190 -121.55 gain 190 166 -119.05 gain 166 191 -120.37 gain 191 166 -118.96 gain 166 192 -124.78 gain 192 166 -126.24 gain 166 193 -126.51 gain 193 166 -129.22 gain 166 194 -123.81 gain 194 166 -120.33 gain 166 195 -103.50 gain 195 166 -100.65 gain 166 196 -99.15 gain 196 166 -100.35 gain 166 197 -99.59 gain 197 166 -96.84 gain 166 198 -110.54 gain 198 166 -107.32 gain 166 199 -108.06 gain 199 166 -108.75 gain 166 200 -121.26 gain 200 166 -118.90 gain 166 201 -116.33 gain 201 166 -114.77 gain 166 202 -114.94 gain 202 166 -117.38 gain 166 203 -112.55 gain 203 166 -114.61 gain 166 204 -123.34 gain 204 166 -122.68 gain 166 205 -122.33 gain 205 166 -120.75 gain 166 206 -122.67 gain 206 166 -125.61 gain 166 207 -128.89 gain 207 166 -124.19 gain 166 208 -124.49 gain 208 166 -125.57 gain 166 209 -129.58 gain 209 166 -131.65 gain 166 210 -113.14 gain 210 166 -112.14 gain 166 211 -108.62 gain 211 166 -109.65 gain 166 212 -108.43 gain 212 166 -108.00 gain 166 213 -111.40 gain 213 166 -110.16 gain 166 214 -117.48 gain 214 166 -116.13 gain 166 215 -114.26 gain 215 166 -109.33 gain 166 216 -121.19 gain 216 166 -120.92 gain 166 217 -116.03 gain 217 166 -116.27 gain 166 218 -119.13 gain 218 166 -121.56 gain 166 219 -126.26 gain 219 166 -120.05 gain 166 220 -122.41 gain 220 166 -126.70 gain 166 221 -124.23 gain 221 166 -124.16 gain 166 222 -122.02 gain 222 166 -122.27 gain 166 223 -127.20 gain 223 166 -126.07 gain 166 224 -134.80 gain 224 166 -136.36 gain 167 168 -91.57 gain 168 167 -90.02 gain 167 169 -110.18 gain 169 167 -112.83 gain 167 170 -106.82 gain 170 167 -101.00 gain 167 171 -115.92 gain 171 167 -115.12 gain 167 172 -112.90 gain 172 167 -106.79 gain 167 173 -114.71 gain 173 167 -108.04 gain 167 174 -122.31 gain 174 167 -119.94 gain 167 175 -120.63 gain 175 167 -121.81 gain 167 176 -125.35 gain 176 167 -118.55 gain 167 177 -125.51 gain 177 167 -126.51 gain 167 178 -126.21 gain 178 167 -123.04 gain 167 179 -128.63 gain 179 167 -123.85 gain 167 180 -111.66 gain 180 167 -108.35 gain 167 181 -101.22 gain 181 167 -97.98 gain 167 182 -97.52 gain 182 167 -96.67 gain 167 183 -102.44 gain 183 167 -94.97 gain 167 184 -106.15 gain 184 167 -103.47 gain 167 185 -121.86 gain 185 167 -116.66 gain 167 186 -107.18 gain 186 167 -102.26 gain 167 187 -113.50 gain 187 167 -111.12 gain 167 188 -119.56 gain 188 167 -120.45 gain 167 189 -126.96 gain 189 167 -125.36 gain 167 190 -124.10 gain 190 167 -119.52 gain 167 191 -123.44 gain 191 167 -119.94 gain 167 192 -125.40 gain 192 167 -124.77 gain 167 193 -129.01 gain 193 167 -129.63 gain 167 194 -131.88 gain 194 167 -126.32 gain 167 195 -107.34 gain 195 167 -102.40 gain 167 196 -109.31 gain 196 167 -108.42 gain 167 197 -96.94 gain 197 167 -92.11 gain 167 198 -100.48 gain 198 167 -95.17 gain 167 199 -103.79 gain 199 167 -102.40 gain 167 200 -116.63 gain 200 167 -112.18 gain 167 201 -119.74 gain 201 167 -116.09 gain 167 202 -121.15 gain 202 167 -121.50 gain 167 203 -118.30 gain 203 167 -118.27 gain 167 204 -115.68 gain 204 167 -112.94 gain 167 205 -125.81 gain 205 167 -122.14 gain 167 206 -128.56 gain 206 167 -129.41 gain 167 207 -127.97 gain 207 167 -121.18 gain 167 208 -133.60 gain 208 167 -132.59 gain 167 209 -126.88 gain 209 167 -126.86 gain 167 210 -111.34 gain 210 167 -108.25 gain 167 211 -103.59 gain 211 167 -102.53 gain 167 212 -106.34 gain 212 167 -103.82 gain 167 213 -112.63 gain 213 167 -109.30 gain 167 214 -114.45 gain 214 167 -111.01 gain 167 215 -114.03 gain 215 167 -107.00 gain 167 216 -122.63 gain 216 167 -120.26 gain 167 217 -114.97 gain 217 167 -113.12 gain 167 218 -122.38 gain 218 167 -122.72 gain 167 219 -124.23 gain 219 167 -115.93 gain 167 220 -125.95 gain 220 167 -128.15 gain 167 221 -126.87 gain 221 167 -124.70 gain 167 222 -132.70 gain 222 167 -130.86 gain 167 223 -131.82 gain 223 167 -128.60 gain 167 224 -122.54 gain 224 167 -122.01 gain 168 169 -85.19 gain 169 168 -89.39 gain 168 170 -101.42 gain 170 168 -97.14 gain 168 171 -111.00 gain 171 168 -111.75 gain 168 172 -120.68 gain 172 168 -116.12 gain 168 173 -117.19 gain 173 168 -112.07 gain 168 174 -117.69 gain 174 168 -116.87 gain 168 175 -124.25 gain 175 168 -126.98 gain 168 176 -125.98 gain 176 168 -120.73 gain 168 177 -122.13 gain 177 168 -124.68 gain 168 178 -125.58 gain 178 168 -123.96 gain 168 179 -125.77 gain 179 168 -122.54 gain 168 180 -111.23 gain 180 168 -109.47 gain 168 181 -102.70 gain 181 168 -101.01 gain 168 182 -103.74 gain 182 168 -104.44 gain 168 183 -96.79 gain 183 168 -90.87 gain 168 184 -97.99 gain 184 168 -96.86 gain 168 185 -109.81 gain 185 168 -106.16 gain 168 186 -109.26 gain 186 168 -105.90 gain 168 187 -119.39 gain 187 168 -118.56 gain 168 188 -116.08 gain 188 168 -118.52 gain 168 189 -120.24 gain 189 168 -120.19 gain 168 190 -121.44 gain 190 168 -118.40 gain 168 191 -122.01 gain 191 168 -120.06 gain 168 192 -117.95 gain 192 168 -118.87 gain 168 193 -123.31 gain 193 168 -125.48 gain 168 194 -129.12 gain 194 168 -125.10 gain 168 195 -107.49 gain 195 168 -104.11 gain 168 196 -109.45 gain 196 168 -110.11 gain 168 197 -99.53 gain 197 168 -96.25 gain 168 198 -95.15 gain 198 168 -91.38 gain 168 199 -100.92 gain 199 168 -101.08 gain 168 200 -114.20 gain 200 168 -111.29 gain 168 201 -110.16 gain 201 168 -108.06 gain 168 202 -114.58 gain 202 168 -116.48 gain 168 203 -116.49 gain 203 168 -118.01 gain 168 204 -114.10 gain 204 168 -112.90 gain 168 205 -123.24 gain 205 168 -121.11 gain 168 206 -127.06 gain 206 168 -129.45 gain 168 207 -129.49 gain 207 168 -124.25 gain 168 208 -123.82 gain 208 168 -124.36 gain 168 209 -124.52 gain 209 168 -126.05 gain 168 210 -109.90 gain 210 168 -108.36 gain 168 211 -108.97 gain 211 168 -109.46 gain 168 212 -108.46 gain 212 168 -107.49 gain 168 213 -105.23 gain 213 168 -103.45 gain 168 214 -110.18 gain 214 168 -108.29 gain 168 215 -108.32 gain 215 168 -102.85 gain 168 216 -112.99 gain 216 168 -112.18 gain 168 217 -119.46 gain 217 168 -119.16 gain 168 218 -119.34 gain 218 168 -121.23 gain 168 219 -124.72 gain 219 168 -117.97 gain 168 220 -125.72 gain 220 168 -129.47 gain 168 221 -129.09 gain 221 168 -128.48 gain 168 222 -117.83 gain 222 168 -117.54 gain 168 223 -122.27 gain 223 168 -120.60 gain 168 224 -127.60 gain 224 168 -128.62 gain 169 170 -97.07 gain 170 169 -88.59 gain 169 171 -103.87 gain 171 169 -100.42 gain 169 172 -113.07 gain 172 169 -104.32 gain 169 173 -118.37 gain 173 169 -109.05 gain 169 174 -120.02 gain 174 169 -115.00 gain 169 175 -122.27 gain 175 169 -120.80 gain 169 176 -119.33 gain 176 169 -109.87 gain 169 177 -122.77 gain 177 169 -121.13 gain 169 178 -138.28 gain 178 169 -132.46 gain 169 179 -125.06 gain 179 169 -117.63 gain 169 180 -117.48 gain 180 169 -111.52 gain 169 181 -115.79 gain 181 169 -109.90 gain 169 182 -114.64 gain 182 169 -111.13 gain 169 183 -102.81 gain 183 169 -92.69 gain 169 184 -106.73 gain 184 169 -101.40 gain 169 185 -104.37 gain 185 169 -96.53 gain 169 186 -109.39 gain 186 169 -101.83 gain 169 187 -113.40 gain 187 169 -108.38 gain 169 188 -118.58 gain 188 169 -116.82 gain 169 189 -113.69 gain 189 169 -109.44 gain 169 190 -125.66 gain 190 169 -118.43 gain 169 191 -126.79 gain 191 169 -120.65 gain 169 192 -121.72 gain 192 169 -118.44 gain 169 193 -124.85 gain 193 169 -122.82 gain 169 194 -133.36 gain 194 169 -125.14 gain 169 195 -117.75 gain 195 169 -110.16 gain 169 196 -118.42 gain 196 169 -114.88 gain 169 197 -110.56 gain 197 169 -103.08 gain 169 198 -111.15 gain 198 169 -103.19 gain 169 199 -111.55 gain 199 169 -107.50 gain 169 200 -106.48 gain 200 169 -99.38 gain 169 201 -110.02 gain 201 169 -103.72 gain 169 202 -120.75 gain 202 169 -118.45 gain 169 203 -117.86 gain 203 169 -115.18 gain 169 204 -127.81 gain 204 169 -122.42 gain 169 205 -121.58 gain 205 169 -115.26 gain 169 206 -129.50 gain 206 169 -127.70 gain 169 207 -132.35 gain 207 169 -122.91 gain 169 208 -117.45 gain 208 169 -113.79 gain 169 209 -124.41 gain 209 169 -121.74 gain 169 210 -124.99 gain 210 169 -119.26 gain 169 211 -110.26 gain 211 169 -106.55 gain 169 212 -116.94 gain 212 169 -111.77 gain 169 213 -116.87 gain 213 169 -110.89 gain 169 214 -116.77 gain 214 169 -110.68 gain 169 215 -110.80 gain 215 169 -101.12 gain 169 216 -121.63 gain 216 169 -116.62 gain 169 217 -120.22 gain 217 169 -115.73 gain 169 218 -117.31 gain 218 169 -115.00 gain 169 219 -122.56 gain 219 169 -111.61 gain 169 220 -122.67 gain 220 169 -122.22 gain 169 221 -123.98 gain 221 169 -119.17 gain 169 222 -128.03 gain 222 169 -123.54 gain 169 223 -133.36 gain 223 169 -127.49 gain 169 224 -131.10 gain 224 169 -127.92 gain 170 171 -97.46 gain 171 170 -102.48 gain 170 172 -101.17 gain 172 170 -100.89 gain 170 173 -101.81 gain 173 170 -100.97 gain 170 174 -111.76 gain 174 170 -115.21 gain 170 175 -109.18 gain 175 170 -116.18 gain 170 176 -109.84 gain 176 170 -108.86 gain 170 177 -125.23 gain 177 170 -132.06 gain 170 178 -119.91 gain 178 170 -122.57 gain 170 179 -121.32 gain 179 170 -122.37 gain 170 180 -109.62 gain 180 170 -112.13 gain 170 181 -101.39 gain 181 170 -103.97 gain 170 182 -102.32 gain 182 170 -107.29 gain 170 183 -104.08 gain 183 170 -102.44 gain 170 184 -96.50 gain 184 170 -99.64 gain 170 185 -86.77 gain 185 170 -87.39 gain 170 186 -97.28 gain 186 170 -98.19 gain 170 187 -102.72 gain 187 170 -106.17 gain 170 188 -103.10 gain 188 170 -109.81 gain 170 189 -105.22 gain 189 170 -109.45 gain 170 190 -114.22 gain 190 170 -115.45 gain 170 191 -117.37 gain 191 170 -119.70 gain 170 192 -111.18 gain 192 170 -116.37 gain 170 193 -112.60 gain 193 170 -119.05 gain 170 194 -120.05 gain 194 170 -120.30 gain 170 195 -105.50 gain 195 170 -106.39 gain 170 196 -109.57 gain 196 170 -114.50 gain 170 197 -105.20 gain 197 170 -106.19 gain 170 198 -109.66 gain 198 170 -110.18 gain 170 199 -101.98 gain 199 170 -106.41 gain 170 200 -100.71 gain 200 170 -102.08 gain 170 201 -100.47 gain 201 170 -102.65 gain 170 202 -104.62 gain 202 170 -110.80 gain 170 203 -114.71 gain 203 170 -120.50 gain 170 204 -105.90 gain 204 170 -108.98 gain 170 205 -109.46 gain 205 170 -111.62 gain 170 206 -116.68 gain 206 170 -123.35 gain 170 207 -117.76 gain 207 170 -116.79 gain 170 208 -117.25 gain 208 170 -122.06 gain 170 209 -120.68 gain 209 170 -126.48 gain 170 210 -107.86 gain 210 170 -110.60 gain 170 211 -112.74 gain 211 170 -117.51 gain 170 212 -107.34 gain 212 170 -110.64 gain 170 213 -101.67 gain 213 170 -104.17 gain 170 214 -105.31 gain 214 170 -107.70 gain 170 215 -107.20 gain 215 170 -106.00 gain 170 216 -110.25 gain 216 170 -113.71 gain 170 217 -108.97 gain 217 170 -112.95 gain 170 218 -104.93 gain 218 170 -111.10 gain 170 219 -109.55 gain 219 170 -107.08 gain 170 220 -114.64 gain 220 170 -122.66 gain 170 221 -120.83 gain 221 170 -124.49 gain 170 222 -121.45 gain 222 170 -125.44 gain 170 223 -117.52 gain 223 170 -120.12 gain 170 224 -122.11 gain 224 170 -127.40 gain 171 172 -94.69 gain 172 171 -89.39 gain 171 173 -103.59 gain 173 171 -97.73 gain 171 174 -107.66 gain 174 171 -106.08 gain 171 175 -113.45 gain 175 171 -115.44 gain 171 176 -116.20 gain 176 171 -110.19 gain 171 177 -117.61 gain 177 171 -119.41 gain 171 178 -122.00 gain 178 171 -119.63 gain 171 179 -126.40 gain 179 171 -122.43 gain 171 180 -118.58 gain 180 171 -116.08 gain 171 181 -118.88 gain 181 171 -116.44 gain 171 182 -114.42 gain 182 171 -114.36 gain 171 183 -109.64 gain 183 171 -102.97 gain 171 184 -104.42 gain 184 171 -102.54 gain 171 185 -100.49 gain 185 171 -96.09 gain 171 186 -98.78 gain 186 171 -94.67 gain 171 187 -105.06 gain 187 171 -103.49 gain 171 188 -104.64 gain 188 171 -106.33 gain 171 189 -112.04 gain 189 171 -111.24 gain 171 190 -114.91 gain 190 171 -111.13 gain 171 191 -120.55 gain 191 171 -117.85 gain 171 192 -123.01 gain 192 171 -123.18 gain 171 193 -122.85 gain 193 171 -124.27 gain 171 194 -125.75 gain 194 171 -120.98 gain 171 195 -118.96 gain 195 171 -114.82 gain 171 196 -114.04 gain 196 171 -113.95 gain 171 197 -120.77 gain 197 171 -116.73 gain 171 198 -118.20 gain 198 171 -113.69 gain 171 199 -108.32 gain 199 171 -107.73 gain 171 200 -105.85 gain 200 171 -102.19 gain 171 201 -96.58 gain 201 171 -93.73 gain 171 202 -106.87 gain 202 171 -108.02 gain 171 203 -110.27 gain 203 171 -111.04 gain 171 204 -111.77 gain 204 171 -109.83 gain 171 205 -115.12 gain 205 171 -112.25 gain 171 206 -112.76 gain 206 171 -114.41 gain 171 207 -117.23 gain 207 171 -111.24 gain 171 208 -124.59 gain 208 171 -124.38 gain 171 209 -128.44 gain 209 171 -129.22 gain 171 210 -123.26 gain 210 171 -120.97 gain 171 211 -121.80 gain 211 171 -121.54 gain 171 212 -111.83 gain 212 171 -110.11 gain 171 213 -114.04 gain 213 171 -111.51 gain 171 214 -111.17 gain 214 171 -108.53 gain 171 215 -114.04 gain 215 171 -107.81 gain 171 216 -114.68 gain 216 171 -113.12 gain 171 217 -113.97 gain 217 171 -112.92 gain 171 218 -112.39 gain 218 171 -113.54 gain 171 219 -114.60 gain 219 171 -107.10 gain 171 220 -117.25 gain 220 171 -120.25 gain 171 221 -116.92 gain 221 171 -115.56 gain 171 222 -119.18 gain 222 171 -118.14 gain 171 223 -124.85 gain 223 171 -122.43 gain 171 224 -125.93 gain 224 171 -126.19 gain 172 173 -92.84 gain 173 172 -92.27 gain 172 174 -99.47 gain 174 172 -103.20 gain 172 175 -102.06 gain 175 172 -109.35 gain 172 176 -110.77 gain 176 172 -110.06 gain 172 177 -105.53 gain 177 172 -112.64 gain 172 178 -114.43 gain 178 172 -117.36 gain 172 179 -110.83 gain 179 172 -112.15 gain 172 180 -116.63 gain 180 172 -119.43 gain 172 181 -113.34 gain 181 172 -116.20 gain 172 182 -112.60 gain 182 172 -117.84 gain 172 183 -108.11 gain 183 172 -106.75 gain 172 184 -108.42 gain 184 172 -111.84 gain 172 185 -101.10 gain 185 172 -102.01 gain 172 186 -90.67 gain 186 172 -91.86 gain 172 187 -89.50 gain 187 172 -93.23 gain 172 188 -100.74 gain 188 172 -107.73 gain 172 189 -99.35 gain 189 172 -103.86 gain 172 190 -110.01 gain 190 172 -111.52 gain 172 191 -108.32 gain 191 172 -110.92 gain 172 192 -112.76 gain 192 172 -118.23 gain 172 193 -104.09 gain 193 172 -110.81 gain 172 194 -119.89 gain 194 172 -120.42 gain 172 195 -118.13 gain 195 172 -119.30 gain 172 196 -109.40 gain 196 172 -114.61 gain 172 197 -112.48 gain 197 172 -113.75 gain 172 198 -108.98 gain 198 172 -109.78 gain 172 199 -106.51 gain 199 172 -111.22 gain 172 200 -103.87 gain 200 172 -105.52 gain 172 201 -101.36 gain 201 172 -103.81 gain 172 202 -103.04 gain 202 172 -109.49 gain 172 203 -104.81 gain 203 172 -110.88 gain 172 204 -98.23 gain 204 172 -101.59 gain 172 205 -109.42 gain 205 172 -111.86 gain 172 206 -105.22 gain 206 172 -112.17 gain 172 207 -110.08 gain 207 172 -109.39 gain 172 208 -118.74 gain 208 172 -123.83 gain 172 209 -114.98 gain 209 172 -121.06 gain 172 210 -111.29 gain 210 172 -114.31 gain 172 211 -115.24 gain 211 172 -120.28 gain 172 212 -118.02 gain 212 172 -121.60 gain 172 213 -113.09 gain 213 172 -115.87 gain 172 214 -109.32 gain 214 172 -111.99 gain 172 215 -106.29 gain 215 172 -105.37 gain 172 216 -105.09 gain 216 172 -108.83 gain 172 217 -106.18 gain 217 172 -110.44 gain 172 218 -102.27 gain 218 172 -108.72 gain 172 219 -110.85 gain 219 172 -108.66 gain 172 220 -105.67 gain 220 172 -113.97 gain 172 221 -114.42 gain 221 172 -118.36 gain 172 222 -99.93 gain 222 172 -104.19 gain 172 223 -114.51 gain 223 172 -117.39 gain 172 224 -119.56 gain 224 172 -125.13 gain 173 174 -89.67 gain 174 173 -93.97 gain 173 175 -100.87 gain 175 173 -108.72 gain 173 176 -102.58 gain 176 173 -102.44 gain 173 177 -107.90 gain 177 173 -115.57 gain 173 178 -111.80 gain 178 173 -115.30 gain 173 179 -104.22 gain 179 173 -106.11 gain 173 180 -121.84 gain 180 173 -125.20 gain 173 181 -120.12 gain 181 173 -123.55 gain 173 182 -107.83 gain 182 173 -113.64 gain 173 183 -108.07 gain 183 173 -107.27 gain 173 184 -112.01 gain 184 173 -116.00 gain 173 185 -107.55 gain 185 173 -109.02 gain 173 186 -102.57 gain 186 173 -104.33 gain 173 187 -89.59 gain 187 173 -93.89 gain 173 188 -92.04 gain 188 173 -99.60 gain 173 189 -94.73 gain 189 173 -99.80 gain 173 190 -96.67 gain 190 173 -98.75 gain 173 191 -104.59 gain 191 173 -107.76 gain 173 192 -106.22 gain 192 173 -112.26 gain 173 193 -110.83 gain 193 173 -118.12 gain 173 194 -110.56 gain 194 173 -111.66 gain 173 195 -117.28 gain 195 173 -119.01 gain 173 196 -117.28 gain 196 173 -123.06 gain 173 197 -114.53 gain 197 173 -116.37 gain 173 198 -109.09 gain 198 173 -110.45 gain 173 199 -111.38 gain 199 173 -116.65 gain 173 200 -106.31 gain 200 173 -108.52 gain 173 201 -111.45 gain 201 173 -114.47 gain 173 202 -99.56 gain 202 173 -106.58 gain 173 203 -93.38 gain 203 173 -100.02 gain 173 204 -98.42 gain 204 173 -102.35 gain 173 205 -103.87 gain 205 173 -106.86 gain 173 206 -106.57 gain 206 173 -114.09 gain 173 207 -109.90 gain 207 173 -109.78 gain 173 208 -110.21 gain 208 173 -115.87 gain 173 209 -112.05 gain 209 173 -118.69 gain 173 210 -116.40 gain 210 173 -119.99 gain 173 211 -115.37 gain 211 173 -120.98 gain 173 212 -119.32 gain 212 173 -123.47 gain 173 213 -113.16 gain 213 173 -116.50 gain 173 214 -107.91 gain 214 173 -111.14 gain 173 215 -112.30 gain 215 173 -111.94 gain 173 216 -107.48 gain 216 173 -111.79 gain 173 217 -103.62 gain 217 173 -108.45 gain 173 218 -97.06 gain 218 173 -104.08 gain 173 219 -105.52 gain 219 173 -103.90 gain 173 220 -112.82 gain 220 173 -121.68 gain 173 221 -103.17 gain 221 173 -107.67 gain 173 222 -108.20 gain 222 173 -113.03 gain 173 223 -113.32 gain 223 173 -116.76 gain 173 224 -113.89 gain 224 173 -120.02 gain 174 175 -88.70 gain 175 174 -92.26 gain 174 176 -105.26 gain 176 174 -100.83 gain 174 177 -108.21 gain 177 174 -111.59 gain 174 178 -116.39 gain 178 174 -115.59 gain 174 179 -116.90 gain 179 174 -114.49 gain 174 180 -121.83 gain 180 174 -120.89 gain 174 181 -119.79 gain 181 174 -118.92 gain 174 182 -122.40 gain 182 174 -123.91 gain 174 183 -117.49 gain 183 174 -112.39 gain 174 184 -117.80 gain 184 174 -117.48 gain 174 185 -109.15 gain 185 174 -106.33 gain 174 186 -115.70 gain 186 174 -113.15 gain 174 187 -108.66 gain 187 174 -108.66 gain 174 188 -96.24 gain 188 174 -99.50 gain 174 189 -96.08 gain 189 174 -96.85 gain 174 190 -92.36 gain 190 174 -90.14 gain 174 191 -103.59 gain 191 174 -102.46 gain 174 192 -102.52 gain 192 174 -104.26 gain 174 193 -108.76 gain 193 174 -111.75 gain 174 194 -118.14 gain 194 174 -114.95 gain 174 195 -120.45 gain 195 174 -117.89 gain 174 196 -123.42 gain 196 174 -124.90 gain 174 197 -121.54 gain 197 174 -119.08 gain 174 198 -117.25 gain 198 174 -114.31 gain 174 199 -111.80 gain 199 174 -112.78 gain 174 200 -115.78 gain 200 174 -113.69 gain 174 201 -119.29 gain 201 174 -118.01 gain 174 202 -105.99 gain 202 174 -108.71 gain 174 203 -107.02 gain 203 174 -109.37 gain 174 204 -101.49 gain 204 174 -101.11 gain 174 205 -108.57 gain 205 174 -107.27 gain 174 206 -103.02 gain 206 174 -106.24 gain 174 207 -109.85 gain 207 174 -105.43 gain 174 208 -113.98 gain 208 174 -115.34 gain 174 209 -122.53 gain 209 174 -124.88 gain 174 210 -123.48 gain 210 174 -122.77 gain 174 211 -121.26 gain 211 174 -122.57 gain 174 212 -122.10 gain 212 174 -121.95 gain 174 213 -115.08 gain 213 174 -114.12 gain 174 214 -120.58 gain 214 174 -119.51 gain 174 215 -114.28 gain 215 174 -109.62 gain 174 216 -116.44 gain 216 174 -116.45 gain 174 217 -111.09 gain 217 174 -111.61 gain 174 218 -103.64 gain 218 174 -106.36 gain 174 219 -108.88 gain 219 174 -102.95 gain 174 220 -108.28 gain 220 174 -112.85 gain 174 221 -115.03 gain 221 174 -115.24 gain 174 222 -111.45 gain 222 174 -111.98 gain 174 223 -108.72 gain 223 174 -107.87 gain 174 224 -121.83 gain 224 174 -123.67 gain 175 176 -98.87 gain 176 175 -90.88 gain 175 177 -98.73 gain 177 175 -98.55 gain 175 178 -121.00 gain 178 175 -116.65 gain 175 179 -121.44 gain 179 175 -115.48 gain 175 180 -125.67 gain 180 175 -121.18 gain 175 181 -126.47 gain 181 175 -122.04 gain 175 182 -127.57 gain 182 175 -125.53 gain 175 183 -129.34 gain 183 175 -120.69 gain 175 184 -123.74 gain 184 175 -119.88 gain 175 185 -113.93 gain 185 175 -107.55 gain 175 186 -120.66 gain 186 175 -114.56 gain 175 187 -110.24 gain 187 175 -106.69 gain 175 188 -109.95 gain 188 175 -109.65 gain 175 189 -103.52 gain 189 175 -100.73 gain 175 190 -96.48 gain 190 175 -90.71 gain 175 191 -96.77 gain 191 175 -92.09 gain 175 192 -106.47 gain 192 175 -104.66 gain 175 193 -110.17 gain 193 175 -109.61 gain 175 194 -113.53 gain 194 175 -106.78 gain 175 195 -124.70 gain 195 175 -118.58 gain 175 196 -124.96 gain 196 175 -122.88 gain 175 197 -118.48 gain 197 175 -112.46 gain 175 198 -127.05 gain 198 175 -120.56 gain 175 199 -126.55 gain 199 175 -123.97 gain 175 200 -117.64 gain 200 175 -112.01 gain 175 201 -114.07 gain 201 175 -109.24 gain 175 202 -112.26 gain 202 175 -111.43 gain 175 203 -108.28 gain 203 175 -107.07 gain 175 204 -115.98 gain 204 175 -112.05 gain 175 205 -107.40 gain 205 175 -102.55 gain 175 206 -104.39 gain 206 175 -104.06 gain 175 207 -111.34 gain 207 175 -103.36 gain 175 208 -109.19 gain 208 175 -107.00 gain 175 209 -114.91 gain 209 175 -113.71 gain 175 210 -127.97 gain 210 175 -123.71 gain 175 211 -131.69 gain 211 175 -129.45 gain 175 212 -137.86 gain 212 175 -134.15 gain 175 213 -123.66 gain 213 175 -119.15 gain 175 214 -126.05 gain 214 175 -121.43 gain 175 215 -116.41 gain 215 175 -108.21 gain 175 216 -118.51 gain 216 175 -114.96 gain 175 217 -120.22 gain 217 175 -117.19 gain 175 218 -111.86 gain 218 175 -111.02 gain 175 219 -110.96 gain 219 175 -101.49 gain 175 220 -110.26 gain 220 175 -111.27 gain 175 221 -115.76 gain 221 175 -112.41 gain 175 222 -115.36 gain 222 175 -112.34 gain 175 223 -118.57 gain 223 175 -114.17 gain 175 224 -119.17 gain 224 175 -117.45 gain 176 177 -91.23 gain 177 176 -99.04 gain 176 178 -100.82 gain 178 176 -104.46 gain 176 179 -103.59 gain 179 176 -105.62 gain 176 180 -125.19 gain 180 176 -128.69 gain 176 181 -122.49 gain 181 176 -126.06 gain 176 182 -109.58 gain 182 176 -115.53 gain 176 183 -114.07 gain 183 176 -113.41 gain 176 184 -109.04 gain 184 176 -113.17 gain 176 185 -119.33 gain 185 176 -120.94 gain 176 186 -109.07 gain 186 176 -110.97 gain 176 187 -107.09 gain 187 176 -111.52 gain 176 188 -101.32 gain 188 176 -109.02 gain 176 189 -97.93 gain 189 176 -103.14 gain 176 190 -88.87 gain 190 176 -91.09 gain 176 191 -92.43 gain 191 176 -95.73 gain 176 192 -93.25 gain 192 176 -99.42 gain 176 193 -97.13 gain 193 176 -104.55 gain 176 194 -104.21 gain 194 176 -105.45 gain 176 195 -121.17 gain 195 176 -123.05 gain 176 196 -120.59 gain 196 176 -126.50 gain 176 197 -116.45 gain 197 176 -118.42 gain 176 198 -108.02 gain 198 176 -109.51 gain 176 199 -113.89 gain 199 176 -119.30 gain 176 200 -114.93 gain 200 176 -117.28 gain 176 201 -118.34 gain 201 176 -121.49 gain 176 202 -108.99 gain 202 176 -116.14 gain 176 203 -106.88 gain 203 176 -113.66 gain 176 204 -98.06 gain 204 176 -102.12 gain 176 205 -99.78 gain 205 176 -102.92 gain 176 206 -97.78 gain 206 176 -105.44 gain 176 207 -95.05 gain 207 176 -95.06 gain 176 208 -103.39 gain 208 176 -109.19 gain 176 209 -101.04 gain 209 176 -107.82 gain 176 210 -130.23 gain 210 176 -133.95 gain 176 211 -118.81 gain 211 176 -124.55 gain 176 212 -118.54 gain 212 176 -122.82 gain 176 213 -118.13 gain 213 176 -121.61 gain 176 214 -115.51 gain 214 176 -118.88 gain 176 215 -106.15 gain 215 176 -105.93 gain 176 216 -105.09 gain 216 176 -109.54 gain 176 217 -116.36 gain 217 176 -121.33 gain 176 218 -112.03 gain 218 176 -119.18 gain 176 219 -100.97 gain 219 176 -99.48 gain 176 220 -97.74 gain 220 176 -106.74 gain 176 221 -106.38 gain 221 176 -111.02 gain 176 222 -108.68 gain 222 176 -113.65 gain 176 223 -104.77 gain 223 176 -108.36 gain 176 224 -102.01 gain 224 176 -108.28 gain 177 178 -87.20 gain 178 177 -83.03 gain 177 179 -96.22 gain 179 177 -90.43 gain 177 180 -137.74 gain 180 177 -133.42 gain 177 181 -128.26 gain 181 177 -124.01 gain 177 182 -127.34 gain 182 177 -125.48 gain 177 183 -127.40 gain 183 177 -118.92 gain 177 184 -122.27 gain 184 177 -118.58 gain 177 185 -118.07 gain 185 177 -111.86 gain 177 186 -120.37 gain 186 177 -114.45 gain 177 187 -119.92 gain 187 177 -116.54 gain 177 188 -114.40 gain 188 177 -114.28 gain 177 189 -105.72 gain 189 177 -103.12 gain 177 190 -111.52 gain 190 177 -105.93 gain 177 191 -100.53 gain 191 177 -96.03 gain 177 192 -101.36 gain 192 177 -99.72 gain 177 193 -100.46 gain 193 177 -100.08 gain 177 194 -109.66 gain 194 177 -103.08 gain 177 195 -130.95 gain 195 177 -125.01 gain 177 196 -123.22 gain 196 177 -121.32 gain 177 197 -122.41 gain 197 177 -116.57 gain 177 198 -122.91 gain 198 177 -116.59 gain 177 199 -119.46 gain 199 177 -117.06 gain 177 200 -130.85 gain 200 177 -125.39 gain 177 201 -117.43 gain 201 177 -112.78 gain 177 202 -119.19 gain 202 177 -118.54 gain 177 203 -116.67 gain 203 177 -115.64 gain 177 204 -113.62 gain 204 177 -109.87 gain 177 205 -109.74 gain 205 177 -105.07 gain 177 206 -110.22 gain 206 177 -110.06 gain 177 207 -104.59 gain 207 177 -96.79 gain 177 208 -101.64 gain 208 177 -99.62 gain 177 209 -102.97 gain 209 177 -101.94 gain 177 210 -129.52 gain 210 177 -125.43 gain 177 211 -130.03 gain 211 177 -127.96 gain 177 212 -132.82 gain 212 177 -129.29 gain 177 213 -123.39 gain 213 177 -119.06 gain 177 214 -125.33 gain 214 177 -120.89 gain 177 215 -119.44 gain 215 177 -111.41 gain 177 216 -124.25 gain 216 177 -120.88 gain 177 217 -119.38 gain 217 177 -116.53 gain 177 218 -120.12 gain 218 177 -119.46 gain 177 219 -117.06 gain 219 177 -107.76 gain 177 220 -116.22 gain 220 177 -117.40 gain 177 221 -106.38 gain 221 177 -103.21 gain 177 222 -110.61 gain 222 177 -107.77 gain 177 223 -110.19 gain 223 177 -105.97 gain 177 224 -106.69 gain 224 177 -105.15 gain 178 179 -88.87 gain 179 178 -87.26 gain 178 180 -126.44 gain 180 178 -126.31 gain 178 181 -129.70 gain 181 178 -129.63 gain 178 182 -128.75 gain 182 178 -131.06 gain 178 183 -127.45 gain 183 178 -123.15 gain 178 184 -125.71 gain 184 178 -126.20 gain 178 185 -130.84 gain 185 178 -128.81 gain 178 186 -123.95 gain 186 178 -122.21 gain 178 187 -117.95 gain 187 178 -118.74 gain 178 188 -113.87 gain 188 178 -117.93 gain 178 189 -116.15 gain 189 178 -117.72 gain 178 190 -105.84 gain 190 178 -104.42 gain 178 191 -97.72 gain 191 178 -97.39 gain 178 192 -98.21 gain 192 178 -100.75 gain 178 193 -89.19 gain 193 178 -92.98 gain 178 194 -89.80 gain 194 178 -87.41 gain 178 195 -116.70 gain 195 178 -114.93 gain 178 196 -124.90 gain 196 178 -127.18 gain 178 197 -130.67 gain 197 178 -129.01 gain 178 198 -127.44 gain 198 178 -125.30 gain 178 199 -117.76 gain 199 178 -119.54 gain 178 200 -127.34 gain 200 178 -126.05 gain 178 201 -116.41 gain 201 178 -115.93 gain 178 202 -117.08 gain 202 178 -120.60 gain 178 203 -110.27 gain 203 178 -113.41 gain 178 204 -110.74 gain 204 178 -111.16 gain 178 205 -112.14 gain 205 178 -111.64 gain 178 206 -102.55 gain 206 178 -106.57 gain 178 207 -102.29 gain 207 178 -98.67 gain 178 208 -102.99 gain 208 178 -105.15 gain 178 209 -107.52 gain 209 178 -110.67 gain 178 210 -126.42 gain 210 178 -126.50 gain 178 211 -129.21 gain 211 178 -131.32 gain 178 212 -130.83 gain 212 178 -131.48 gain 178 213 -124.30 gain 213 178 -124.14 gain 178 214 -118.65 gain 214 178 -118.38 gain 178 215 -122.62 gain 215 178 -118.76 gain 178 216 -116.53 gain 216 178 -117.34 gain 178 217 -115.06 gain 217 178 -116.38 gain 178 218 -118.65 gain 218 178 -122.16 gain 178 219 -108.96 gain 219 178 -103.83 gain 178 220 -112.38 gain 220 178 -117.75 gain 178 221 -108.76 gain 221 178 -109.77 gain 178 222 -102.79 gain 222 178 -104.12 gain 178 223 -106.88 gain 223 178 -106.83 gain 178 224 -107.34 gain 224 178 -109.98 gain 179 180 -135.56 gain 180 179 -137.03 gain 179 181 -124.22 gain 181 179 -125.76 gain 179 182 -119.19 gain 182 179 -123.11 gain 179 183 -122.41 gain 183 179 -119.72 gain 179 184 -113.80 gain 184 179 -115.89 gain 179 185 -125.23 gain 185 179 -124.81 gain 179 186 -116.35 gain 186 179 -116.21 gain 179 187 -116.63 gain 187 179 -119.04 gain 179 188 -114.57 gain 188 179 -120.24 gain 179 189 -114.99 gain 189 179 -118.17 gain 179 190 -114.24 gain 190 179 -114.43 gain 179 191 -103.50 gain 191 179 -104.78 gain 179 192 -102.99 gain 192 179 -107.14 gain 179 193 -95.47 gain 193 179 -100.87 gain 179 194 -96.45 gain 194 179 -95.66 gain 179 195 -125.15 gain 195 179 -124.99 gain 179 196 -129.68 gain 196 179 -133.57 gain 179 197 -119.22 gain 197 179 -119.17 gain 179 198 -124.20 gain 198 179 -123.67 gain 179 199 -116.86 gain 199 179 -120.25 gain 179 200 -118.09 gain 200 179 -118.41 gain 179 201 -118.62 gain 201 179 -119.74 gain 179 202 -115.69 gain 202 179 -120.82 gain 179 203 -107.87 gain 203 179 -112.62 gain 179 204 -114.08 gain 204 179 -116.12 gain 179 205 -109.96 gain 205 179 -111.07 gain 179 206 -106.04 gain 206 179 -111.67 gain 179 207 -108.54 gain 207 179 -106.53 gain 179 208 -97.72 gain 208 179 -101.48 gain 179 209 -104.21 gain 209 179 -108.97 gain 179 210 -134.33 gain 210 179 -136.02 gain 179 211 -130.25 gain 211 179 -133.96 gain 179 212 -126.48 gain 212 179 -128.74 gain 179 213 -124.50 gain 213 179 -125.95 gain 179 214 -129.39 gain 214 179 -130.72 gain 179 215 -127.04 gain 215 179 -124.80 gain 179 216 -123.05 gain 216 179 -125.47 gain 179 217 -114.04 gain 217 179 -116.97 gain 179 218 -114.63 gain 218 179 -119.75 gain 179 219 -114.10 gain 219 179 -110.58 gain 179 220 -111.25 gain 220 179 -118.22 gain 179 221 -113.26 gain 221 179 -115.87 gain 179 222 -110.34 gain 222 179 -113.28 gain 179 223 -103.18 gain 223 179 -104.73 gain 179 224 -105.84 gain 224 179 -110.08 gain 180 181 -87.76 gain 181 180 -87.82 gain 180 182 -91.51 gain 182 180 -93.97 gain 180 183 -105.82 gain 183 180 -101.66 gain 180 184 -106.52 gain 184 180 -107.15 gain 180 185 -105.43 gain 185 180 -103.54 gain 180 186 -128.14 gain 186 180 -126.54 gain 180 187 -114.98 gain 187 180 -115.92 gain 180 188 -119.99 gain 188 180 -124.19 gain 180 189 -119.82 gain 189 180 -121.54 gain 180 190 -130.93 gain 190 180 -129.65 gain 180 191 -130.03 gain 191 180 -129.84 gain 180 192 -120.57 gain 192 180 -123.25 gain 180 193 -130.12 gain 193 180 -134.05 gain 180 194 -129.04 gain 194 180 -126.78 gain 180 195 -92.66 gain 195 180 -91.03 gain 180 196 -100.97 gain 196 180 -103.39 gain 180 197 -104.04 gain 197 180 -102.52 gain 180 198 -107.07 gain 198 180 -105.07 gain 180 199 -111.30 gain 199 180 -113.22 gain 180 200 -111.07 gain 200 180 -109.92 gain 180 201 -120.13 gain 201 180 -119.79 gain 180 202 -117.99 gain 202 180 -121.65 gain 180 203 -116.76 gain 203 180 -120.04 gain 180 204 -127.13 gain 204 180 -127.69 gain 180 205 -118.81 gain 205 180 -118.45 gain 180 206 -121.32 gain 206 180 -125.48 gain 180 207 -130.80 gain 207 180 -127.32 gain 180 208 -125.45 gain 208 180 -127.74 gain 180 209 -124.70 gain 209 180 -127.98 gain 180 210 -90.79 gain 210 180 -91.02 gain 180 211 -103.04 gain 211 180 -105.29 gain 180 212 -98.46 gain 212 180 -99.25 gain 180 213 -114.33 gain 213 180 -114.31 gain 180 214 -109.58 gain 214 180 -109.45 gain 180 215 -108.59 gain 215 180 -104.87 gain 180 216 -114.54 gain 216 180 -115.49 gain 180 217 -120.18 gain 217 180 -121.64 gain 180 218 -124.72 gain 218 180 -128.37 gain 180 219 -120.66 gain 219 180 -115.68 gain 180 220 -124.20 gain 220 180 -129.71 gain 180 221 -117.60 gain 221 180 -118.74 gain 180 222 -128.49 gain 222 180 -129.96 gain 180 223 -127.90 gain 223 180 -127.99 gain 180 224 -126.79 gain 224 180 -129.56 gain 181 182 -90.27 gain 182 181 -92.66 gain 181 183 -102.53 gain 183 181 -98.30 gain 181 184 -109.94 gain 184 181 -110.49 gain 181 185 -109.31 gain 185 181 -107.36 gain 181 186 -114.09 gain 186 181 -112.42 gain 181 187 -110.55 gain 187 181 -111.42 gain 181 188 -114.27 gain 188 181 -118.39 gain 181 189 -118.73 gain 189 181 -120.37 gain 181 190 -123.35 gain 190 181 -122.01 gain 181 191 -120.91 gain 191 181 -120.66 gain 181 192 -121.99 gain 192 181 -124.61 gain 181 193 -129.26 gain 193 181 -133.13 gain 181 194 -129.30 gain 194 181 -126.97 gain 181 195 -92.61 gain 195 181 -90.91 gain 181 196 -93.28 gain 196 181 -95.63 gain 181 197 -93.68 gain 197 181 -92.09 gain 181 198 -96.63 gain 198 181 -94.56 gain 181 199 -109.06 gain 199 181 -110.91 gain 181 200 -112.47 gain 200 181 -111.26 gain 181 201 -119.82 gain 201 181 -119.41 gain 181 202 -110.44 gain 202 181 -114.03 gain 181 203 -118.10 gain 203 181 -121.31 gain 181 204 -120.70 gain 204 181 -121.20 gain 181 205 -119.08 gain 205 181 -118.65 gain 181 206 -120.77 gain 206 181 -124.86 gain 181 207 -115.68 gain 207 181 -112.13 gain 181 208 -124.27 gain 208 181 -126.50 gain 181 209 -128.77 gain 209 181 -132.00 gain 181 210 -104.95 gain 210 181 -105.11 gain 181 211 -106.87 gain 211 181 -109.05 gain 181 212 -105.00 gain 212 181 -105.72 gain 181 213 -105.36 gain 213 181 -105.28 gain 181 214 -112.90 gain 214 181 -112.70 gain 181 215 -116.09 gain 215 181 -112.31 gain 181 216 -116.76 gain 216 181 -117.64 gain 181 217 -116.02 gain 217 181 -117.42 gain 181 218 -115.47 gain 218 181 -119.06 gain 181 219 -116.77 gain 219 181 -111.72 gain 181 220 -126.63 gain 220 181 -132.07 gain 181 221 -124.10 gain 221 181 -125.18 gain 181 222 -127.58 gain 222 181 -128.98 gain 181 223 -126.18 gain 223 181 -126.20 gain 181 224 -121.80 gain 224 181 -124.51 gain 182 183 -101.70 gain 183 182 -95.08 gain 182 184 -106.04 gain 184 182 -104.21 gain 182 185 -110.61 gain 185 182 -106.27 gain 182 186 -110.47 gain 186 182 -106.41 gain 182 187 -111.13 gain 187 182 -109.61 gain 182 188 -121.94 gain 188 182 -123.69 gain 182 189 -130.60 gain 189 182 -129.85 gain 182 190 -126.44 gain 190 182 -122.71 gain 182 191 -123.09 gain 191 182 -120.45 gain 182 192 -125.08 gain 192 182 -125.30 gain 182 193 -123.88 gain 193 182 -125.35 gain 182 194 -122.26 gain 194 182 -117.55 gain 182 195 -103.52 gain 195 182 -99.44 gain 182 196 -100.11 gain 196 182 -100.08 gain 182 197 -95.09 gain 197 182 -91.12 gain 182 198 -95.27 gain 198 182 -90.81 gain 182 199 -100.69 gain 199 182 -100.15 gain 182 200 -114.37 gain 200 182 -110.77 gain 182 201 -112.47 gain 201 182 -109.67 gain 182 202 -108.90 gain 202 182 -110.10 gain 182 203 -129.20 gain 203 182 -130.02 gain 182 204 -128.65 gain 204 182 -126.76 gain 182 205 -118.97 gain 205 182 -116.15 gain 182 206 -121.06 gain 206 182 -122.77 gain 182 207 -120.99 gain 207 182 -115.06 gain 182 208 -123.13 gain 208 182 -122.97 gain 182 209 -125.42 gain 209 182 -126.26 gain 182 210 -107.48 gain 210 182 -105.25 gain 182 211 -113.85 gain 211 182 -113.65 gain 182 212 -101.80 gain 212 182 -100.14 gain 182 213 -104.89 gain 213 182 -102.42 gain 182 214 -106.79 gain 214 182 -104.21 gain 182 215 -110.99 gain 215 182 -104.82 gain 182 216 -117.23 gain 216 182 -115.72 gain 182 217 -116.21 gain 217 182 -115.22 gain 182 218 -115.28 gain 218 182 -116.48 gain 182 219 -119.53 gain 219 182 -112.09 gain 182 220 -118.24 gain 220 182 -121.29 gain 182 221 -125.74 gain 221 182 -124.44 gain 182 222 -125.37 gain 222 182 -124.39 gain 182 223 -124.76 gain 223 182 -122.39 gain 182 224 -136.68 gain 224 182 -137.00 gain 183 184 -88.13 gain 184 183 -92.92 gain 183 185 -95.32 gain 185 183 -97.59 gain 183 186 -102.48 gain 186 183 -105.03 gain 183 187 -112.30 gain 187 183 -117.39 gain 183 188 -109.79 gain 188 183 -118.14 gain 183 189 -113.25 gain 189 183 -119.11 gain 183 190 -112.45 gain 190 183 -115.33 gain 183 191 -122.80 gain 191 183 -126.77 gain 183 192 -122.01 gain 192 183 -128.85 gain 183 193 -121.22 gain 193 183 -129.31 gain 183 194 -123.54 gain 194 183 -125.44 gain 183 195 -102.68 gain 195 183 -105.21 gain 183 196 -98.13 gain 196 183 -104.70 gain 183 197 -91.41 gain 197 183 -94.04 gain 183 198 -89.45 gain 198 183 -91.60 gain 183 199 -102.71 gain 199 183 -108.78 gain 183 200 -95.08 gain 200 183 -98.09 gain 183 201 -105.12 gain 201 183 -108.93 gain 183 202 -99.87 gain 202 183 -107.69 gain 183 203 -106.39 gain 203 183 -113.83 gain 183 204 -112.91 gain 204 183 -117.64 gain 183 205 -114.36 gain 205 183 -118.15 gain 183 206 -120.44 gain 206 183 -128.75 gain 183 207 -111.53 gain 207 183 -112.21 gain 183 208 -111.96 gain 208 183 -118.41 gain 183 209 -113.92 gain 209 183 -121.36 gain 183 210 -101.62 gain 210 183 -106.00 gain 183 211 -102.16 gain 211 183 -108.56 gain 183 212 -105.77 gain 212 183 -110.72 gain 183 213 -92.81 gain 213 183 -96.95 gain 183 214 -97.00 gain 214 183 -101.03 gain 183 215 -97.64 gain 215 183 -98.08 gain 183 216 -111.34 gain 216 183 -116.44 gain 183 217 -108.81 gain 217 183 -114.43 gain 183 218 -119.58 gain 218 183 -127.39 gain 183 219 -108.27 gain 219 183 -107.44 gain 183 220 -115.18 gain 220 183 -124.84 gain 183 221 -119.13 gain 221 183 -124.43 gain 183 222 -114.24 gain 222 183 -119.87 gain 183 223 -119.76 gain 223 183 -124.00 gain 183 224 -122.25 gain 224 183 -129.18 gain 184 185 -99.70 gain 185 184 -97.19 gain 184 186 -96.48 gain 186 184 -94.25 gain 184 187 -104.28 gain 187 184 -104.59 gain 184 188 -107.80 gain 188 184 -111.37 gain 184 189 -121.83 gain 189 184 -122.91 gain 184 190 -118.71 gain 190 184 -116.81 gain 184 191 -115.22 gain 191 184 -114.41 gain 184 192 -117.64 gain 192 184 -119.70 gain 184 193 -120.89 gain 193 184 -124.20 gain 184 194 -122.21 gain 194 184 -119.33 gain 184 195 -115.09 gain 195 184 -112.84 gain 184 196 -108.62 gain 196 184 -110.41 gain 184 197 -101.92 gain 197 184 -99.77 gain 184 198 -95.34 gain 198 184 -92.72 gain 184 199 -90.16 gain 199 184 -91.45 gain 184 200 -100.21 gain 200 184 -98.44 gain 184 201 -101.44 gain 201 184 -100.47 gain 184 202 -109.23 gain 202 184 -112.26 gain 184 203 -114.32 gain 203 184 -116.98 gain 184 204 -114.87 gain 204 184 -114.80 gain 184 205 -116.80 gain 205 184 -115.81 gain 184 206 -121.45 gain 206 184 -124.98 gain 184 207 -125.16 gain 207 184 -121.05 gain 184 208 -120.96 gain 208 184 -122.63 gain 184 209 -120.42 gain 209 184 -123.08 gain 184 210 -112.86 gain 210 184 -112.46 gain 184 211 -109.66 gain 211 184 -111.29 gain 184 212 -106.08 gain 212 184 -106.24 gain 184 213 -101.99 gain 213 184 -101.34 gain 184 214 -103.11 gain 214 184 -102.36 gain 184 215 -106.17 gain 215 184 -101.83 gain 184 216 -100.12 gain 216 184 -100.44 gain 184 217 -111.00 gain 217 184 -111.84 gain 184 218 -118.47 gain 218 184 -121.49 gain 184 219 -113.35 gain 219 184 -107.74 gain 184 220 -119.17 gain 220 184 -124.05 gain 184 221 -118.43 gain 221 184 -118.96 gain 184 222 -122.61 gain 222 184 -123.46 gain 184 223 -126.11 gain 223 184 -125.58 gain 184 224 -122.48 gain 224 184 -124.63 gain 185 186 -94.45 gain 186 185 -94.73 gain 185 187 -102.52 gain 187 185 -105.35 gain 185 188 -105.77 gain 188 185 -111.85 gain 185 189 -112.70 gain 189 185 -116.29 gain 185 190 -107.92 gain 190 185 -108.53 gain 185 191 -112.78 gain 191 185 -114.48 gain 185 192 -119.26 gain 192 185 -123.83 gain 185 193 -119.59 gain 193 185 -125.41 gain 185 194 -118.28 gain 194 185 -117.91 gain 185 195 -114.84 gain 195 185 -115.10 gain 185 196 -110.84 gain 196 185 -115.14 gain 185 197 -106.75 gain 197 185 -107.11 gain 185 198 -105.90 gain 198 185 -105.79 gain 185 199 -95.25 gain 199 185 -99.05 gain 185 200 -88.24 gain 200 185 -88.98 gain 185 201 -90.87 gain 201 185 -92.42 gain 185 202 -96.19 gain 202 185 -101.74 gain 185 203 -109.53 gain 203 185 -114.70 gain 185 204 -115.27 gain 204 185 -117.72 gain 185 205 -106.39 gain 205 185 -107.91 gain 185 206 -113.04 gain 206 185 -119.09 gain 185 207 -113.67 gain 207 185 -112.08 gain 185 208 -116.30 gain 208 185 -120.49 gain 185 209 -122.94 gain 209 185 -128.11 gain 185 210 -112.32 gain 210 185 -114.44 gain 185 211 -108.55 gain 211 185 -112.68 gain 185 212 -109.16 gain 212 185 -111.84 gain 185 213 -102.31 gain 213 185 -104.18 gain 185 214 -98.31 gain 214 185 -100.07 gain 185 215 -95.74 gain 215 185 -93.91 gain 185 216 -92.97 gain 216 185 -95.80 gain 185 217 -104.50 gain 217 185 -107.86 gain 185 218 -107.60 gain 218 185 -113.15 gain 185 219 -108.13 gain 219 185 -105.03 gain 185 220 -108.08 gain 220 185 -115.48 gain 185 221 -115.79 gain 221 185 -118.83 gain 185 222 -125.20 gain 222 185 -128.56 gain 185 223 -115.10 gain 223 185 -117.08 gain 185 224 -126.07 gain 224 185 -130.73 gain 186 187 -86.99 gain 187 186 -89.53 gain 186 188 -99.97 gain 188 186 -105.77 gain 186 189 -98.31 gain 189 186 -101.62 gain 186 190 -101.43 gain 190 186 -101.76 gain 186 191 -105.93 gain 191 186 -107.35 gain 186 192 -103.96 gain 192 186 -108.24 gain 186 193 -127.95 gain 193 186 -133.49 gain 186 194 -121.11 gain 194 186 -120.45 gain 186 195 -112.84 gain 195 186 -112.82 gain 186 196 -113.89 gain 196 186 -117.91 gain 186 197 -107.69 gain 197 186 -107.78 gain 186 198 -108.20 gain 198 186 -107.80 gain 186 199 -103.83 gain 199 186 -107.35 gain 186 200 -95.40 gain 200 186 -95.86 gain 186 201 -89.20 gain 201 186 -90.46 gain 186 202 -95.28 gain 202 186 -100.54 gain 186 203 -105.30 gain 203 186 -110.18 gain 186 204 -103.66 gain 204 186 -105.83 gain 186 205 -106.64 gain 205 186 -107.89 gain 186 206 -112.21 gain 206 186 -117.97 gain 186 207 -117.69 gain 207 186 -115.82 gain 186 208 -111.28 gain 208 186 -115.18 gain 186 209 -118.63 gain 209 186 -123.53 gain 186 210 -114.41 gain 210 186 -116.24 gain 186 211 -116.76 gain 211 186 -120.61 gain 186 212 -108.92 gain 212 186 -111.31 gain 186 213 -102.63 gain 213 186 -104.21 gain 186 214 -102.31 gain 214 186 -103.79 gain 186 215 -99.01 gain 215 186 -96.90 gain 186 216 -99.82 gain 216 186 -102.37 gain 186 217 -101.56 gain 217 186 -104.63 gain 186 218 -108.80 gain 218 186 -114.06 gain 186 219 -102.81 gain 219 186 -99.43 gain 186 220 -107.27 gain 220 186 -114.38 gain 186 221 -112.28 gain 221 186 -115.04 gain 186 222 -118.07 gain 222 186 -121.15 gain 186 223 -120.84 gain 223 186 -122.53 gain 186 224 -121.02 gain 224 186 -125.40 gain 187 188 -92.08 gain 188 187 -95.34 gain 187 189 -103.73 gain 189 187 -104.51 gain 187 190 -105.38 gain 190 187 -103.16 gain 187 191 -109.65 gain 191 187 -108.52 gain 187 192 -113.34 gain 192 187 -115.08 gain 187 193 -117.20 gain 193 187 -120.20 gain 187 194 -122.85 gain 194 187 -119.66 gain 187 195 -116.98 gain 195 187 -114.42 gain 187 196 -109.42 gain 196 187 -110.90 gain 187 197 -117.02 gain 197 187 -114.56 gain 187 198 -110.32 gain 198 187 -107.38 gain 187 199 -112.68 gain 199 187 -113.66 gain 187 200 -103.67 gain 200 187 -101.59 gain 187 201 -85.88 gain 201 187 -84.60 gain 187 202 -96.06 gain 202 187 -98.78 gain 187 203 -97.41 gain 203 187 -99.75 gain 187 204 -107.02 gain 204 187 -106.65 gain 187 205 -106.74 gain 205 187 -105.44 gain 187 206 -109.69 gain 206 187 -112.92 gain 187 207 -107.49 gain 207 187 -103.07 gain 187 208 -117.63 gain 208 187 -118.99 gain 187 209 -115.01 gain 209 187 -117.37 gain 187 210 -120.40 gain 210 187 -119.69 gain 187 211 -116.11 gain 211 187 -117.43 gain 187 212 -114.98 gain 212 187 -114.83 gain 187 213 -117.94 gain 213 187 -116.99 gain 187 214 -105.91 gain 214 187 -104.85 gain 187 215 -104.49 gain 215 187 -99.84 gain 187 216 -102.95 gain 216 187 -102.97 gain 187 217 -96.12 gain 217 187 -96.65 gain 187 218 -103.71 gain 218 187 -106.43 gain 187 219 -108.92 gain 219 187 -103.00 gain 187 220 -104.18 gain 220 187 -108.75 gain 187 221 -116.40 gain 221 187 -116.61 gain 187 222 -121.62 gain 222 187 -122.16 gain 187 223 -117.36 gain 223 187 -116.51 gain 187 224 -117.47 gain 224 187 -119.31 gain 188 189 -90.62 gain 189 188 -88.13 gain 188 190 -104.90 gain 190 188 -99.43 gain 188 191 -115.60 gain 191 188 -111.22 gain 188 192 -108.10 gain 192 188 -106.58 gain 188 193 -118.36 gain 193 188 -118.09 gain 188 194 -120.24 gain 194 188 -113.78 gain 188 195 -120.17 gain 195 188 -114.35 gain 188 196 -121.25 gain 196 188 -119.47 gain 188 197 -119.01 gain 197 188 -113.29 gain 188 198 -117.56 gain 198 188 -111.36 gain 188 199 -116.02 gain 199 188 -113.74 gain 188 200 -110.29 gain 200 188 -104.95 gain 188 201 -111.38 gain 201 188 -106.84 gain 188 202 -99.20 gain 202 188 -98.66 gain 188 203 -90.68 gain 203 188 -89.76 gain 188 204 -96.27 gain 204 188 -92.64 gain 188 205 -104.18 gain 205 188 -99.62 gain 188 206 -109.08 gain 206 188 -109.04 gain 188 207 -114.52 gain 207 188 -106.84 gain 188 208 -113.89 gain 208 188 -111.99 gain 188 209 -118.62 gain 209 188 -117.71 gain 188 210 -124.89 gain 210 188 -120.92 gain 188 211 -123.40 gain 211 188 -121.45 gain 188 212 -121.02 gain 212 188 -117.62 gain 188 213 -119.45 gain 213 188 -115.23 gain 188 214 -115.36 gain 214 188 -111.04 gain 188 215 -109.25 gain 215 188 -101.34 gain 188 216 -114.27 gain 216 188 -111.02 gain 188 217 -108.39 gain 217 188 -105.66 gain 188 218 -106.45 gain 218 188 -105.91 gain 188 219 -108.39 gain 219 188 -99.21 gain 188 220 -111.91 gain 220 188 -113.22 gain 188 221 -116.82 gain 221 188 -113.77 gain 188 222 -118.80 gain 222 188 -116.07 gain 188 223 -116.93 gain 223 188 -112.82 gain 188 224 -117.98 gain 224 188 -116.56 gain 189 190 -96.35 gain 190 189 -93.36 gain 189 191 -101.47 gain 191 189 -99.58 gain 189 192 -106.11 gain 192 189 -107.07 gain 189 193 -109.66 gain 193 189 -111.88 gain 189 194 -111.81 gain 194 189 -107.84 gain 189 195 -115.34 gain 195 189 -112.00 gain 189 196 -125.06 gain 196 189 -125.76 gain 189 197 -111.79 gain 197 189 -108.56 gain 189 198 -117.85 gain 198 189 -114.13 gain 189 199 -117.25 gain 199 189 -117.46 gain 189 200 -108.18 gain 200 189 -105.33 gain 189 201 -105.00 gain 201 189 -102.95 gain 189 202 -105.44 gain 202 189 -107.39 gain 189 203 -101.68 gain 203 189 -103.25 gain 189 204 -93.42 gain 204 189 -92.27 gain 189 205 -97.64 gain 205 189 -95.56 gain 189 206 -103.86 gain 206 189 -106.31 gain 189 207 -106.67 gain 207 189 -101.48 gain 189 208 -108.15 gain 208 189 -108.73 gain 189 209 -113.67 gain 209 189 -115.25 gain 189 210 -118.68 gain 210 189 -117.19 gain 189 211 -127.24 gain 211 189 -127.78 gain 189 212 -120.10 gain 212 189 -119.18 gain 189 213 -114.42 gain 213 189 -112.69 gain 189 214 -110.23 gain 214 189 -108.39 gain 189 215 -111.39 gain 215 189 -105.97 gain 189 216 -105.75 gain 216 189 -104.99 gain 189 217 -108.16 gain 217 189 -107.91 gain 189 218 -97.25 gain 218 189 -99.19 gain 189 219 -106.28 gain 219 189 -99.58 gain 189 220 -107.34 gain 220 189 -111.13 gain 189 221 -103.74 gain 221 189 -103.17 gain 189 222 -111.13 gain 222 189 -110.89 gain 189 223 -115.48 gain 223 189 -113.85 gain 189 224 -111.07 gain 224 189 -112.13 gain 190 191 -88.32 gain 191 190 -89.41 gain 190 192 -106.95 gain 192 190 -110.91 gain 190 193 -102.29 gain 193 190 -107.50 gain 190 194 -101.81 gain 194 190 -100.83 gain 190 195 -119.18 gain 195 190 -118.83 gain 190 196 -111.12 gain 196 190 -114.81 gain 190 197 -119.43 gain 197 190 -119.19 gain 190 198 -117.39 gain 198 190 -116.67 gain 190 199 -116.16 gain 199 190 -119.35 gain 190 200 -109.85 gain 200 190 -109.98 gain 190 201 -119.51 gain 201 190 -120.44 gain 190 202 -105.89 gain 202 190 -110.83 gain 190 203 -102.61 gain 203 190 -107.17 gain 190 204 -101.17 gain 204 190 -103.01 gain 190 205 -91.20 gain 205 190 -92.11 gain 190 206 -102.24 gain 206 190 -107.68 gain 190 207 -106.23 gain 207 190 -104.03 gain 190 208 -105.83 gain 208 190 -109.41 gain 190 209 -110.85 gain 209 190 -115.42 gain 190 210 -123.17 gain 210 190 -124.67 gain 190 211 -120.14 gain 211 190 -123.67 gain 190 212 -121.98 gain 212 190 -124.05 gain 190 213 -101.75 gain 213 190 -103.01 gain 190 214 -112.69 gain 214 190 -113.84 gain 190 215 -114.07 gain 215 190 -111.63 gain 190 216 -115.33 gain 216 190 -117.56 gain 190 217 -107.53 gain 217 190 -110.28 gain 190 218 -106.57 gain 218 190 -111.50 gain 190 219 -101.94 gain 219 190 -98.23 gain 190 220 -97.59 gain 220 190 -104.37 gain 190 221 -104.35 gain 221 190 -106.78 gain 190 222 -103.46 gain 222 190 -106.21 gain 190 223 -107.44 gain 223 190 -108.81 gain 190 224 -105.26 gain 224 190 -109.31 gain 191 192 -83.14 gain 192 191 -86.00 gain 191 193 -98.05 gain 193 191 -102.17 gain 191 194 -106.26 gain 194 191 -104.19 gain 191 195 -119.93 gain 195 191 -118.49 gain 191 196 -119.77 gain 196 191 -122.37 gain 191 197 -127.85 gain 197 191 -126.51 gain 191 198 -124.47 gain 198 191 -122.65 gain 191 199 -110.69 gain 199 191 -112.79 gain 191 200 -109.32 gain 200 191 -108.36 gain 191 201 -113.44 gain 201 191 -113.29 gain 191 202 -109.33 gain 202 191 -113.18 gain 191 203 -103.89 gain 203 191 -107.36 gain 191 204 -100.03 gain 204 191 -100.78 gain 191 205 -90.46 gain 205 191 -90.28 gain 191 206 -98.78 gain 206 191 -103.12 gain 191 207 -92.94 gain 207 191 -89.65 gain 191 208 -105.14 gain 208 191 -107.63 gain 191 209 -103.83 gain 209 191 -107.31 gain 191 210 -122.14 gain 210 191 -122.55 gain 191 211 -124.19 gain 211 191 -126.63 gain 191 212 -119.63 gain 212 191 -120.61 gain 191 213 -127.44 gain 213 191 -127.61 gain 191 214 -115.13 gain 214 191 -115.19 gain 191 215 -121.15 gain 215 191 -117.62 gain 191 216 -114.32 gain 216 191 -115.46 gain 191 217 -114.44 gain 217 191 -116.09 gain 191 218 -114.88 gain 218 191 -118.73 gain 191 219 -102.50 gain 219 191 -97.70 gain 191 220 -95.77 gain 220 191 -101.47 gain 191 221 -99.39 gain 221 191 -100.73 gain 191 222 -102.07 gain 222 191 -103.73 gain 191 223 -108.73 gain 223 191 -109.00 gain 191 224 -109.75 gain 224 191 -112.71 gain 192 193 -93.28 gain 193 192 -94.54 gain 192 194 -109.52 gain 194 192 -104.58 gain 192 195 -126.83 gain 195 192 -122.52 gain 192 196 -128.85 gain 196 192 -128.59 gain 192 197 -126.07 gain 197 192 -121.86 gain 192 198 -124.01 gain 198 192 -119.33 gain 192 199 -121.93 gain 199 192 -121.16 gain 192 200 -131.09 gain 200 192 -127.27 gain 192 201 -122.13 gain 201 192 -119.11 gain 192 202 -115.14 gain 202 192 -116.12 gain 192 203 -112.94 gain 203 192 -113.54 gain 192 204 -105.14 gain 204 192 -103.03 gain 192 205 -102.09 gain 205 192 -99.05 gain 192 206 -99.73 gain 206 192 -101.20 gain 192 207 -98.69 gain 207 192 -92.53 gain 192 208 -104.32 gain 208 192 -103.94 gain 192 209 -114.17 gain 209 192 -114.78 gain 192 210 -129.09 gain 210 192 -126.63 gain 192 211 -124.54 gain 211 192 -124.11 gain 192 212 -128.13 gain 212 192 -126.24 gain 192 213 -122.60 gain 213 192 -119.90 gain 192 214 -129.04 gain 214 192 -126.23 gain 192 215 -118.03 gain 215 192 -111.63 gain 192 216 -113.73 gain 216 192 -112.00 gain 192 217 -114.99 gain 217 192 -113.78 gain 192 218 -112.65 gain 218 192 -113.62 gain 192 219 -111.81 gain 219 192 -104.14 gain 192 220 -104.15 gain 220 192 -106.98 gain 192 221 -103.00 gain 221 192 -101.47 gain 192 222 -107.07 gain 222 192 -105.87 gain 192 223 -115.76 gain 223 192 -113.17 gain 192 224 -106.64 gain 224 192 -106.73 gain 193 194 -97.84 gain 194 193 -91.65 gain 193 195 -129.49 gain 195 193 -123.94 gain 193 196 -122.20 gain 196 193 -120.68 gain 193 197 -123.11 gain 197 193 -117.65 gain 193 198 -122.27 gain 198 193 -116.34 gain 193 199 -123.23 gain 199 193 -121.22 gain 193 200 -120.85 gain 200 193 -115.77 gain 193 201 -127.44 gain 201 193 -123.17 gain 193 202 -121.23 gain 202 193 -120.95 gain 193 203 -121.10 gain 203 193 -120.45 gain 193 204 -119.01 gain 204 193 -115.64 gain 193 205 -113.59 gain 205 193 -109.30 gain 193 206 -108.83 gain 206 193 -109.05 gain 193 207 -97.74 gain 207 193 -90.33 gain 193 208 -108.54 gain 208 193 -106.90 gain 193 209 -99.92 gain 209 193 -99.28 gain 193 210 -128.58 gain 210 193 -124.88 gain 193 211 -127.42 gain 211 193 -125.74 gain 193 212 -123.40 gain 212 193 -120.26 gain 193 213 -130.05 gain 213 193 -126.11 gain 193 214 -120.47 gain 214 193 -116.41 gain 193 215 -129.93 gain 215 193 -122.29 gain 193 216 -128.88 gain 216 193 -125.89 gain 193 217 -121.19 gain 217 193 -118.72 gain 193 218 -114.04 gain 218 193 -113.77 gain 193 219 -117.00 gain 219 193 -108.09 gain 193 220 -119.87 gain 220 193 -121.44 gain 193 221 -112.17 gain 221 193 -109.38 gain 193 222 -112.85 gain 222 193 -110.39 gain 193 223 -103.03 gain 223 193 -99.19 gain 193 224 -102.26 gain 224 193 -101.10 gain 194 195 -134.14 gain 195 194 -134.78 gain 194 196 -121.03 gain 196 194 -125.70 gain 194 197 -118.70 gain 197 194 -119.44 gain 194 198 -126.87 gain 198 194 -127.13 gain 194 199 -123.80 gain 199 194 -127.98 gain 194 200 -115.38 gain 200 194 -116.49 gain 194 201 -123.20 gain 201 194 -125.12 gain 194 202 -113.81 gain 202 194 -119.73 gain 194 203 -114.38 gain 203 194 -119.92 gain 194 204 -114.28 gain 204 194 -117.10 gain 194 205 -107.70 gain 205 194 -109.60 gain 194 206 -103.83 gain 206 194 -110.25 gain 194 207 -97.75 gain 207 194 -96.53 gain 194 208 -95.02 gain 208 194 -99.57 gain 194 209 -90.71 gain 209 194 -96.26 gain 194 210 -126.82 gain 210 194 -129.30 gain 194 211 -121.20 gain 211 194 -125.71 gain 194 212 -122.25 gain 212 194 -125.30 gain 194 213 -120.40 gain 213 194 -122.64 gain 194 214 -118.02 gain 214 194 -120.15 gain 194 215 -113.40 gain 215 194 -111.94 gain 194 216 -117.41 gain 216 194 -120.61 gain 194 217 -108.97 gain 217 194 -112.70 gain 194 218 -115.78 gain 218 194 -121.70 gain 194 219 -108.07 gain 219 194 -105.34 gain 194 220 -107.08 gain 220 194 -114.84 gain 194 221 -104.27 gain 221 194 -107.68 gain 194 222 -102.28 gain 222 194 -106.01 gain 194 223 -98.79 gain 223 194 -101.14 gain 194 224 -98.96 gain 224 194 -103.99 gain 195 196 -88.34 gain 196 195 -92.38 gain 195 197 -100.04 gain 197 195 -100.14 gain 195 198 -109.55 gain 198 195 -109.17 gain 195 199 -103.93 gain 199 195 -107.47 gain 195 200 -115.09 gain 200 195 -115.57 gain 195 201 -116.04 gain 201 195 -117.32 gain 195 202 -119.11 gain 202 195 -124.40 gain 195 203 -119.10 gain 203 195 -124.00 gain 195 204 -125.15 gain 204 195 -127.34 gain 195 205 -124.43 gain 205 195 -125.69 gain 195 206 -123.96 gain 206 195 -129.75 gain 195 207 -128.09 gain 207 195 -126.24 gain 195 208 -126.02 gain 208 195 -129.94 gain 195 209 -130.12 gain 209 195 -135.04 gain 195 210 -84.11 gain 210 195 -85.96 gain 195 211 -100.13 gain 211 195 -104.00 gain 195 212 -104.61 gain 212 195 -107.02 gain 195 213 -100.96 gain 213 195 -102.56 gain 195 214 -107.90 gain 214 195 -109.40 gain 195 215 -111.82 gain 215 195 -109.73 gain 195 216 -113.94 gain 216 195 -116.51 gain 195 217 -121.71 gain 217 195 -124.80 gain 195 218 -119.21 gain 218 195 -124.49 gain 195 219 -121.61 gain 219 195 -118.25 gain 195 220 -121.16 gain 220 195 -128.29 gain 195 221 -121.75 gain 221 195 -124.52 gain 195 222 -118.51 gain 222 195 -121.60 gain 195 223 -125.87 gain 223 195 -127.58 gain 195 224 -126.05 gain 224 195 -130.45 gain 196 197 -92.45 gain 197 196 -88.51 gain 196 198 -104.78 gain 198 196 -100.37 gain 196 199 -110.67 gain 199 196 -110.17 gain 196 200 -121.46 gain 200 196 -117.89 gain 196 201 -119.70 gain 201 196 -116.94 gain 196 202 -119.32 gain 202 196 -120.57 gain 196 203 -120.17 gain 203 196 -121.03 gain 196 204 -122.05 gain 204 196 -120.20 gain 196 205 -128.69 gain 205 196 -125.91 gain 196 206 -120.38 gain 206 196 -122.13 gain 196 207 -132.39 gain 207 196 -126.49 gain 196 208 -132.57 gain 208 196 -132.45 gain 196 209 -123.74 gain 209 196 -124.61 gain 196 210 -102.66 gain 210 196 -100.47 gain 196 211 -99.53 gain 211 196 -99.37 gain 196 212 -101.17 gain 212 196 -99.54 gain 196 213 -106.48 gain 213 196 -104.05 gain 196 214 -119.77 gain 214 196 -117.23 gain 196 215 -115.77 gain 215 196 -109.64 gain 196 216 -111.71 gain 216 196 -110.24 gain 196 217 -119.91 gain 217 196 -118.96 gain 196 218 -126.62 gain 218 196 -127.86 gain 196 219 -117.00 gain 219 196 -109.60 gain 196 220 -124.97 gain 220 196 -128.06 gain 196 221 -128.11 gain 221 196 -126.84 gain 196 222 -129.47 gain 222 196 -128.53 gain 196 223 -120.56 gain 223 196 -118.23 gain 196 224 -131.39 gain 224 196 -131.75 gain 197 198 -97.20 gain 198 197 -96.72 gain 197 199 -96.46 gain 199 197 -99.89 gain 197 200 -110.22 gain 200 197 -110.59 gain 197 201 -101.59 gain 201 197 -102.77 gain 197 202 -112.99 gain 202 197 -118.17 gain 197 203 -116.14 gain 203 197 -120.94 gain 197 204 -111.14 gain 204 197 -113.23 gain 197 205 -122.18 gain 205 197 -123.34 gain 197 206 -119.91 gain 206 197 -125.60 gain 197 207 -118.85 gain 207 197 -116.90 gain 197 208 -115.39 gain 208 197 -119.21 gain 197 209 -125.50 gain 209 197 -130.31 gain 197 210 -109.41 gain 210 197 -111.16 gain 197 211 -94.63 gain 211 197 -98.40 gain 197 212 -96.64 gain 212 197 -98.95 gain 197 213 -92.51 gain 213 197 -94.01 gain 197 214 -100.26 gain 214 197 -101.65 gain 197 215 -103.80 gain 215 197 -101.61 gain 197 216 -102.97 gain 216 197 -105.44 gain 197 217 -117.20 gain 217 197 -120.19 gain 197 218 -114.87 gain 218 197 -120.05 gain 197 219 -119.98 gain 219 197 -116.52 gain 197 220 -119.89 gain 220 197 -126.92 gain 197 221 -120.93 gain 221 197 -123.60 gain 197 222 -121.19 gain 222 197 -124.18 gain 197 223 -120.33 gain 223 197 -121.94 gain 197 224 -119.50 gain 224 197 -123.80 gain 198 199 -87.22 gain 199 198 -91.14 gain 198 200 -94.45 gain 200 198 -95.30 gain 198 201 -108.14 gain 201 198 -109.80 gain 198 202 -121.23 gain 202 198 -126.89 gain 198 203 -115.35 gain 203 198 -120.63 gain 198 204 -112.24 gain 204 198 -114.81 gain 198 205 -119.85 gain 205 198 -121.49 gain 198 206 -121.99 gain 206 198 -128.15 gain 198 207 -112.02 gain 207 198 -110.54 gain 198 208 -116.56 gain 208 198 -120.86 gain 198 209 -124.02 gain 209 198 -129.31 gain 198 210 -103.53 gain 210 198 -105.75 gain 198 211 -103.70 gain 211 198 -107.95 gain 198 212 -96.39 gain 212 198 -99.18 gain 198 213 -88.24 gain 213 198 -90.22 gain 198 214 -96.12 gain 214 198 -97.99 gain 198 215 -99.92 gain 215 198 -98.20 gain 198 216 -109.43 gain 216 198 -112.38 gain 198 217 -114.42 gain 217 198 -117.89 gain 198 218 -120.48 gain 218 198 -126.14 gain 198 219 -121.96 gain 219 198 -118.98 gain 198 220 -117.65 gain 220 198 -125.15 gain 198 221 -123.55 gain 221 198 -126.70 gain 198 222 -125.39 gain 222 198 -128.86 gain 198 223 -122.20 gain 223 198 -124.28 gain 198 224 -120.21 gain 224 198 -124.99 gain 199 200 -94.76 gain 200 199 -91.70 gain 199 201 -96.88 gain 201 199 -94.62 gain 199 202 -112.25 gain 202 199 -113.99 gain 199 203 -114.38 gain 203 199 -115.75 gain 199 204 -114.07 gain 204 199 -112.71 gain 199 205 -111.43 gain 205 199 -109.16 gain 199 206 -121.57 gain 206 199 -123.82 gain 199 207 -117.55 gain 207 199 -112.16 gain 199 208 -127.19 gain 208 199 -127.57 gain 199 209 -124.51 gain 209 199 -125.88 gain 199 210 -117.44 gain 210 199 -115.75 gain 199 211 -111.82 gain 211 199 -112.15 gain 199 212 -110.24 gain 212 199 -109.12 gain 199 213 -101.91 gain 213 199 -99.98 gain 199 214 -89.06 gain 214 199 -87.01 gain 199 215 -99.15 gain 215 199 -93.52 gain 199 216 -104.66 gain 216 199 -103.69 gain 199 217 -110.90 gain 217 199 -110.45 gain 199 218 -110.11 gain 218 199 -111.85 gain 199 219 -118.12 gain 219 199 -111.22 gain 199 220 -121.08 gain 220 199 -124.67 gain 199 221 -124.93 gain 221 199 -124.16 gain 199 222 -123.23 gain 222 199 -122.78 gain 199 223 -120.79 gain 223 199 -118.96 gain 199 224 -125.79 gain 224 199 -126.64 gain 200 201 -91.42 gain 201 200 -92.23 gain 200 202 -102.90 gain 202 200 -107.71 gain 200 203 -108.30 gain 203 200 -112.73 gain 200 204 -112.50 gain 204 200 -114.21 gain 200 205 -109.01 gain 205 200 -109.79 gain 200 206 -111.84 gain 206 200 -117.14 gain 200 207 -111.53 gain 207 200 -109.20 gain 200 208 -114.32 gain 208 200 -117.76 gain 200 209 -119.04 gain 209 200 -123.47 gain 200 210 -116.02 gain 210 200 -117.39 gain 200 211 -107.50 gain 211 200 -110.90 gain 200 212 -110.74 gain 212 200 -112.67 gain 200 213 -109.23 gain 213 200 -110.36 gain 200 214 -95.74 gain 214 200 -96.75 gain 200 215 -97.83 gain 215 200 -95.26 gain 200 216 -96.40 gain 216 200 -98.50 gain 200 217 -97.95 gain 217 200 -100.57 gain 200 218 -103.71 gain 218 200 -108.51 gain 200 219 -109.65 gain 219 200 -105.81 gain 200 220 -117.38 gain 220 200 -124.04 gain 200 221 -118.75 gain 221 200 -121.05 gain 200 222 -115.91 gain 222 200 -118.53 gain 200 223 -118.36 gain 223 200 -119.59 gain 200 224 -117.73 gain 224 200 -121.65 gain 201 202 -93.24 gain 202 201 -97.24 gain 201 203 -102.61 gain 203 201 -106.23 gain 201 204 -105.26 gain 204 201 -106.16 gain 201 205 -109.42 gain 205 201 -109.40 gain 201 206 -119.73 gain 206 201 -124.23 gain 201 207 -116.53 gain 207 201 -113.40 gain 201 208 -122.62 gain 208 201 -125.26 gain 201 209 -126.46 gain 209 201 -130.09 gain 201 210 -121.98 gain 210 201 -122.54 gain 201 211 -108.89 gain 211 201 -111.48 gain 201 212 -120.64 gain 212 201 -121.78 gain 201 213 -105.11 gain 213 201 -105.43 gain 201 214 -102.40 gain 214 201 -102.62 gain 201 215 -90.83 gain 215 201 -87.45 gain 201 216 -92.08 gain 216 201 -93.37 gain 201 217 -91.30 gain 217 201 -93.11 gain 201 218 -104.48 gain 218 201 -108.48 gain 201 219 -109.60 gain 219 201 -104.95 gain 201 220 -112.92 gain 220 201 -118.77 gain 201 221 -115.47 gain 221 201 -116.96 gain 201 222 -114.83 gain 222 201 -116.64 gain 201 223 -116.47 gain 223 201 -116.90 gain 201 224 -119.62 gain 224 201 -122.74 gain 202 203 -90.43 gain 203 202 -90.05 gain 202 204 -101.18 gain 204 202 -98.09 gain 202 205 -104.03 gain 205 202 -100.01 gain 202 206 -120.00 gain 206 202 -120.50 gain 202 207 -117.25 gain 207 202 -110.11 gain 202 208 -117.94 gain 208 202 -116.58 gain 202 209 -120.06 gain 209 202 -119.69 gain 202 210 -125.84 gain 210 202 -122.40 gain 202 211 -125.41 gain 211 202 -124.00 gain 202 212 -118.90 gain 212 202 -116.03 gain 202 213 -110.77 gain 213 202 -107.09 gain 202 214 -105.31 gain 214 202 -101.52 gain 202 215 -115.67 gain 215 202 -108.30 gain 202 216 -101.38 gain 216 202 -98.67 gain 202 217 -98.95 gain 217 202 -96.76 gain 202 218 -96.34 gain 218 202 -96.34 gain 202 219 -101.55 gain 219 202 -92.91 gain 202 220 -105.83 gain 220 202 -107.68 gain 202 221 -120.26 gain 221 202 -117.75 gain 202 222 -114.08 gain 222 202 -111.89 gain 202 223 -124.20 gain 223 202 -120.62 gain 202 224 -126.25 gain 224 202 -125.37 gain 203 204 -97.13 gain 204 203 -94.41 gain 203 205 -98.87 gain 205 203 -95.23 gain 203 206 -110.16 gain 206 203 -111.03 gain 203 207 -113.48 gain 207 203 -106.72 gain 203 208 -114.57 gain 208 203 -113.58 gain 203 209 -121.40 gain 209 203 -121.41 gain 203 210 -121.06 gain 210 203 -118.01 gain 203 211 -122.11 gain 211 203 -121.07 gain 203 212 -124.23 gain 212 203 -121.73 gain 203 213 -120.34 gain 213 203 -117.04 gain 203 214 -112.88 gain 214 203 -109.47 gain 203 215 -116.85 gain 215 203 -109.85 gain 203 216 -105.04 gain 216 203 -102.71 gain 203 217 -97.21 gain 217 203 -95.40 gain 203 218 -98.82 gain 218 203 -99.19 gain 203 219 -99.92 gain 219 203 -91.65 gain 203 220 -98.05 gain 220 203 -100.27 gain 203 221 -111.44 gain 221 203 -109.30 gain 203 222 -111.93 gain 222 203 -110.12 gain 203 223 -123.68 gain 223 203 -120.48 gain 203 224 -112.38 gain 224 203 -111.87 gain 204 205 -94.15 gain 205 204 -93.22 gain 204 206 -96.20 gain 206 204 -99.80 gain 204 207 -106.79 gain 207 204 -102.74 gain 204 208 -103.17 gain 208 204 -104.91 gain 204 209 -110.37 gain 209 204 -113.09 gain 204 210 -120.92 gain 210 204 -120.58 gain 204 211 -122.50 gain 211 204 -124.19 gain 204 212 -123.84 gain 212 204 -124.06 gain 204 213 -121.12 gain 213 204 -120.54 gain 204 214 -118.69 gain 214 204 -118.00 gain 204 215 -105.79 gain 215 204 -101.52 gain 204 216 -102.68 gain 216 204 -103.06 gain 204 217 -108.11 gain 217 204 -109.01 gain 204 218 -102.10 gain 218 204 -105.19 gain 204 219 -91.96 gain 219 204 -86.41 gain 204 220 -102.56 gain 220 204 -107.50 gain 204 221 -105.13 gain 221 204 -105.71 gain 204 222 -107.06 gain 222 204 -107.97 gain 204 223 -117.20 gain 223 204 -116.72 gain 204 224 -115.24 gain 224 204 -117.45 gain 205 206 -88.83 gain 206 205 -93.35 gain 205 207 -110.17 gain 207 205 -107.05 gain 205 208 -111.49 gain 208 205 -114.15 gain 205 209 -116.00 gain 209 205 -119.65 gain 205 210 -116.45 gain 210 205 -117.03 gain 205 211 -117.93 gain 211 205 -120.54 gain 205 212 -119.94 gain 212 205 -121.09 gain 205 213 -118.26 gain 213 205 -118.61 gain 205 214 -114.91 gain 214 205 -115.14 gain 205 215 -117.99 gain 215 205 -114.63 gain 205 216 -109.33 gain 216 205 -110.64 gain 205 217 -109.81 gain 217 205 -111.63 gain 205 218 -107.85 gain 218 205 -111.87 gain 205 219 -95.37 gain 219 205 -90.75 gain 205 220 -92.58 gain 220 205 -98.44 gain 205 221 -102.23 gain 221 205 -103.74 gain 205 222 -106.45 gain 222 205 -108.28 gain 205 223 -110.74 gain 223 205 -111.19 gain 205 224 -114.69 gain 224 205 -117.83 gain 206 207 -102.09 gain 207 206 -94.45 gain 206 208 -105.95 gain 208 206 -104.09 gain 206 209 -108.03 gain 209 206 -107.16 gain 206 210 -122.76 gain 210 206 -118.83 gain 206 211 -121.50 gain 211 206 -119.59 gain 206 212 -128.63 gain 212 206 -125.26 gain 206 213 -125.91 gain 213 206 -121.73 gain 206 214 -120.37 gain 214 206 -116.08 gain 206 215 -124.36 gain 215 206 -116.49 gain 206 216 -124.15 gain 216 206 -120.94 gain 206 217 -119.38 gain 217 206 -116.69 gain 206 218 -113.80 gain 218 206 -113.30 gain 206 219 -109.55 gain 219 206 -100.40 gain 206 220 -95.91 gain 220 206 -97.25 gain 206 221 -97.07 gain 221 206 -94.06 gain 206 222 -103.72 gain 222 206 -101.04 gain 206 223 -104.92 gain 223 206 -100.85 gain 206 224 -114.82 gain 224 206 -113.44 gain 207 208 -92.07 gain 208 207 -97.85 gain 207 209 -99.89 gain 209 207 -106.66 gain 207 210 -125.01 gain 210 207 -128.71 gain 207 211 -122.65 gain 211 207 -128.38 gain 207 212 -119.97 gain 212 207 -124.24 gain 207 213 -118.82 gain 213 207 -122.29 gain 207 214 -110.80 gain 214 207 -114.15 gain 207 215 -110.12 gain 215 207 -109.89 gain 207 216 -111.91 gain 216 207 -116.33 gain 207 217 -111.22 gain 217 207 -116.17 gain 207 218 -106.35 gain 218 207 -113.48 gain 207 219 -101.92 gain 219 207 -100.41 gain 207 220 -100.88 gain 220 207 -109.87 gain 207 221 -93.02 gain 221 207 -97.65 gain 207 222 -97.43 gain 222 207 -102.38 gain 207 223 -85.78 gain 223 207 -89.35 gain 207 224 -96.05 gain 224 207 -102.31 gain 208 209 -94.24 gain 209 208 -95.24 gain 208 210 -135.98 gain 210 208 -133.91 gain 208 211 -124.55 gain 211 208 -124.50 gain 208 212 -126.70 gain 212 208 -125.20 gain 208 213 -122.87 gain 213 208 -120.56 gain 208 214 -133.55 gain 214 208 -131.13 gain 208 215 -113.69 gain 215 208 -107.68 gain 208 216 -116.59 gain 216 208 -115.24 gain 208 217 -120.12 gain 217 208 -119.29 gain 208 218 -117.70 gain 218 208 -119.06 gain 208 219 -111.54 gain 219 208 -104.26 gain 208 220 -100.33 gain 220 208 -103.53 gain 208 221 -103.91 gain 221 208 -102.76 gain 208 222 -102.51 gain 222 208 -101.68 gain 208 223 -89.75 gain 223 208 -87.54 gain 208 224 -100.98 gain 224 208 -101.46 gain 209 210 -134.19 gain 210 209 -131.13 gain 209 211 -130.60 gain 211 209 -129.56 gain 209 212 -122.58 gain 212 209 -120.08 gain 209 213 -130.06 gain 213 209 -126.76 gain 209 214 -121.07 gain 214 209 -117.66 gain 209 215 -121.35 gain 215 209 -114.35 gain 209 216 -121.35 gain 216 209 -119.01 gain 209 217 -122.59 gain 217 209 -120.77 gain 209 218 -120.47 gain 218 209 -120.83 gain 209 219 -119.96 gain 219 209 -111.69 gain 209 220 -109.31 gain 220 209 -111.52 gain 209 221 -105.84 gain 221 209 -103.70 gain 209 222 -104.90 gain 222 209 -103.08 gain 209 223 -99.02 gain 223 209 -95.82 gain 209 224 -90.12 gain 224 209 -89.61 gain 210 211 -94.09 gain 211 210 -96.11 gain 210 212 -103.86 gain 212 210 -104.43 gain 210 213 -108.55 gain 213 210 -108.31 gain 210 214 -108.59 gain 214 210 -108.23 gain 210 215 -112.61 gain 215 210 -108.67 gain 210 216 -119.22 gain 216 210 -119.94 gain 210 217 -116.72 gain 217 210 -117.96 gain 210 218 -121.75 gain 218 210 -125.18 gain 210 219 -121.91 gain 219 210 -116.70 gain 210 220 -124.54 gain 220 210 -129.82 gain 210 221 -127.82 gain 221 210 -128.74 gain 210 222 -128.61 gain 222 210 -129.86 gain 210 223 -120.91 gain 223 210 -120.77 gain 210 224 -126.73 gain 224 210 -129.28 gain 211 212 -101.25 gain 212 211 -99.79 gain 211 213 -103.86 gain 213 211 -101.59 gain 211 214 -113.26 gain 214 211 -110.88 gain 211 215 -112.71 gain 215 211 -106.75 gain 211 216 -110.45 gain 216 211 -109.15 gain 211 217 -121.06 gain 217 211 -120.28 gain 211 218 -116.25 gain 218 211 -117.66 gain 211 219 -123.44 gain 219 211 -116.21 gain 211 220 -119.10 gain 220 211 -122.35 gain 211 221 -126.74 gain 221 211 -125.64 gain 211 222 -128.42 gain 222 211 -127.64 gain 211 223 -128.56 gain 223 211 -126.40 gain 211 224 -130.71 gain 224 211 -131.24 gain 212 213 -93.90 gain 213 212 -93.09 gain 212 214 -98.82 gain 214 212 -97.90 gain 212 215 -106.78 gain 215 212 -102.27 gain 212 216 -115.80 gain 216 212 -115.96 gain 212 217 -115.38 gain 217 212 -116.05 gain 212 218 -116.04 gain 218 212 -118.90 gain 212 219 -118.61 gain 219 212 -112.84 gain 212 220 -124.42 gain 220 212 -129.14 gain 212 221 -114.97 gain 221 212 -115.33 gain 212 222 -120.41 gain 222 212 -121.10 gain 212 223 -126.37 gain 223 212 -125.67 gain 212 224 -129.67 gain 224 212 -131.66 gain 213 214 -90.06 gain 214 213 -89.95 gain 213 215 -99.19 gain 215 213 -95.49 gain 213 216 -104.19 gain 216 213 -105.15 gain 213 217 -109.14 gain 217 213 -110.63 gain 213 218 -113.14 gain 218 213 -116.82 gain 213 219 -115.09 gain 219 213 -110.12 gain 213 220 -117.72 gain 220 213 -123.24 gain 213 221 -113.51 gain 221 213 -114.67 gain 213 222 -125.41 gain 222 213 -126.90 gain 213 223 -116.55 gain 223 213 -116.65 gain 213 224 -120.51 gain 224 213 -123.30 gain 214 215 -84.18 gain 215 214 -80.60 gain 214 216 -101.67 gain 216 214 -102.75 gain 214 217 -103.90 gain 217 214 -105.50 gain 214 218 -113.41 gain 218 214 -117.19 gain 214 219 -115.60 gain 219 214 -110.75 gain 214 220 -115.14 gain 220 214 -120.78 gain 214 221 -116.20 gain 221 214 -117.47 gain 214 222 -112.56 gain 222 214 -114.17 gain 214 223 -117.72 gain 223 214 -117.93 gain 214 224 -125.95 gain 224 214 -128.85 gain 215 216 -87.85 gain 216 215 -92.51 gain 215 217 -97.57 gain 217 215 -102.75 gain 215 218 -105.17 gain 218 215 -112.54 gain 215 219 -106.31 gain 219 215 -105.03 gain 215 220 -111.16 gain 220 215 -120.38 gain 215 221 -109.85 gain 221 215 -114.71 gain 215 222 -120.11 gain 222 215 -125.30 gain 215 223 -121.72 gain 223 215 -125.52 gain 215 224 -111.39 gain 224 215 -117.88 gain 216 217 -93.49 gain 217 216 -94.01 gain 216 218 -102.43 gain 218 216 -105.14 gain 216 219 -109.62 gain 219 216 -103.68 gain 216 220 -111.24 gain 220 216 -115.79 gain 216 221 -116.05 gain 221 216 -116.25 gain 216 222 -117.44 gain 222 216 -117.96 gain 216 223 -125.51 gain 223 216 -124.65 gain 216 224 -127.51 gain 224 216 -129.34 gain 217 218 -93.19 gain 218 217 -95.38 gain 217 219 -104.84 gain 219 217 -98.38 gain 217 220 -109.58 gain 220 217 -113.62 gain 217 221 -113.27 gain 221 217 -112.95 gain 217 222 -114.18 gain 222 217 -114.19 gain 217 223 -120.82 gain 223 217 -119.44 gain 217 224 -122.61 gain 224 217 -123.92 gain 218 219 -99.31 gain 219 218 -90.67 gain 218 220 -101.75 gain 220 218 -103.60 gain 218 221 -105.57 gain 221 218 -103.06 gain 218 222 -110.01 gain 222 218 -107.83 gain 218 223 -117.94 gain 223 218 -114.37 gain 218 224 -124.76 gain 224 218 -123.88 gain 219 220 -83.18 gain 220 219 -93.67 gain 219 221 -101.03 gain 221 219 -107.16 gain 219 222 -106.00 gain 222 219 -112.46 gain 219 223 -110.12 gain 223 219 -115.20 gain 219 224 -115.39 gain 224 219 -123.15 gain 220 221 -95.48 gain 221 220 -91.12 gain 220 222 -113.64 gain 222 220 -109.61 gain 220 223 -103.84 gain 223 220 -98.43 gain 220 224 -116.53 gain 224 220 -113.80 gain 221 222 -96.91 gain 222 221 -97.24 gain 221 223 -105.92 gain 223 221 -104.86 gain 221 224 -106.49 gain 224 221 -108.11 gain 222 223 -94.21 gain 223 222 -92.82 gain 222 224 -109.03 gain 224 222 -110.33 gain 223 224 -93.67 gain 224 223 -96.35 noise 0 -105.70 4.00 noise 1 -104.42 4.00 noise 2 -104.49 4.00 noise 3 -103.88 4.00 noise 4 -102.86 4.00 noise 5 -104.46 4.00 noise 6 -108.60 4.00 noise 7 -103.14 4.00 noise 8 -106.80 4.00 noise 9 -107.16 4.00 noise 10 -106.34 4.00 noise 11 -107.12 4.00 noise 12 -104.98 4.00 noise 13 -106.47 4.00 noise 14 -106.28 4.00 noise 15 -103.44 4.00 noise 16 -104.69 4.00 noise 17 -106.96 4.00 noise 18 -106.94 4.00 noise 19 -104.95 4.00 noise 20 -106.22 4.00 noise 21 -106.53 4.00 noise 22 -105.96 4.00 noise 23 -103.35 4.00 noise 24 -108.16 4.00 noise 25 -101.45 4.00 noise 26 -107.06 4.00 noise 27 -107.00 4.00 noise 28 -107.73 4.00 noise 29 -105.69 4.00 noise 30 -105.04 4.00 noise 31 -104.15 4.00 noise 32 -104.37 4.00 noise 33 -106.73 4.00 noise 34 -104.45 4.00 noise 35 -104.77 4.00 noise 36 -103.65 4.00 noise 37 -105.51 4.00 noise 38 -103.87 4.00 noise 39 -104.15 4.00 noise 40 -103.32 4.00 noise 41 -106.14 4.00 noise 42 -105.75 4.00 noise 43 -106.26 4.00 noise 44 -101.75 4.00 noise 45 -104.18 4.00 noise 46 -104.22 4.00 noise 47 -103.68 4.00 noise 48 -106.13 4.00 noise 49 -103.72 4.00 noise 50 -100.91 4.00 noise 51 -104.91 4.00 noise 52 -108.21 4.00 noise 53 -105.24 4.00 noise 54 -105.63 4.00 noise 55 -107.22 4.00 noise 56 -103.43 4.00 noise 57 -103.82 4.00 noise 58 -102.45 4.00 noise 59 -105.54 4.00 noise 60 -104.59 4.00 noise 61 -107.82 4.00 noise 62 -103.25 4.00 noise 63 -109.61 4.00 noise 64 -106.24 4.00 noise 65 -102.05 4.00 noise 66 -108.67 4.00 noise 67 -104.85 4.00 noise 68 -104.59 4.00 noise 69 -104.46 4.00 noise 70 -105.50 4.00 noise 71 -107.82 4.00 noise 72 -105.34 4.00 noise 73 -107.64 4.00 noise 74 -103.48 4.00 noise 75 -103.08 4.00 noise 76 -107.50 4.00 noise 77 -105.18 4.00 noise 78 -99.53 4.00 noise 79 -106.32 4.00 noise 80 -107.08 4.00 noise 81 -106.19 4.00 noise 82 -106.69 4.00 noise 83 -103.79 4.00 noise 84 -105.58 4.00 noise 85 -107.23 4.00 noise 86 -104.94 4.00 noise 87 -105.47 4.00 noise 88 -103.83 4.00 noise 89 -105.62 4.00 noise 90 -107.21 4.00 noise 91 -105.44 4.00 noise 92 -107.11 4.00 noise 93 -106.46 4.00 noise 94 -107.30 4.00 noise 95 -101.40 4.00 noise 96 -105.68 4.00 noise 97 -105.99 4.00 noise 98 -106.44 4.00 noise 99 -106.55 4.00 noise 100 -107.24 4.00 noise 101 -107.73 4.00 noise 102 -106.19 4.00 noise 103 -108.66 4.00 noise 104 -104.25 4.00 noise 105 -107.94 4.00 noise 106 -103.81 4.00 noise 107 -101.67 4.00 noise 108 -106.00 4.00 noise 109 -100.64 4.00 noise 110 -105.66 4.00 noise 111 -105.95 4.00 noise 112 -105.63 4.00 noise 113 -106.92 4.00 noise 114 -102.55 4.00 noise 115 -107.39 4.00 noise 116 -106.82 4.00 noise 117 -100.91 4.00 noise 118 -102.21 4.00 noise 119 -106.76 4.00 noise 120 -103.35 4.00 noise 121 -106.23 4.00 noise 122 -104.95 4.00 noise 123 -104.72 4.00 noise 124 -105.94 4.00 noise 125 -104.47 4.00 noise 126 -103.52 4.00 noise 127 -104.98 4.00 noise 128 -104.71 4.00 noise 129 -106.22 4.00 noise 130 -104.07 4.00 noise 131 -103.86 4.00 noise 132 -105.61 4.00 noise 133 -105.76 4.00 noise 134 -105.29 4.00 noise 135 -104.34 4.00 noise 136 -105.60 4.00 noise 137 -104.91 4.00 noise 138 -107.88 4.00 noise 139 -104.91 4.00 noise 140 -104.84 4.00 noise 141 -102.45 4.00 noise 142 -104.19 4.00 noise 143 -106.56 4.00 noise 144 -105.56 4.00 noise 145 -107.18 4.00 noise 146 -104.89 4.00 noise 147 -108.47 4.00 noise 148 -108.46 4.00 noise 149 -106.74 4.00 noise 150 -104.96 4.00 noise 151 -102.78 4.00 noise 152 -106.21 4.00 noise 153 -109.02 4.00 noise 154 -104.99 4.00 noise 155 -103.82 4.00 noise 156 -104.94 4.00 noise 157 -104.32 4.00 noise 158 -103.15 4.00 noise 159 -103.97 4.00 noise 160 -107.18 4.00 noise 161 -104.74 4.00 noise 162 -104.62 4.00 noise 163 -105.56 4.00 noise 164 -102.63 4.00 noise 165 -105.82 4.00 noise 166 -103.21 4.00 noise 167 -103.17 4.00 noise 168 -102.17 4.00 noise 169 -104.06 4.00 noise 170 -107.67 4.00 noise 171 -104.67 4.00 noise 172 -108.32 4.00 noise 173 -107.65 4.00 noise 174 -106.16 4.00 noise 175 -105.63 4.00 noise 176 -108.63 4.00 noise 177 -103.02 4.00 noise 178 -105.96 4.00 noise 179 -107.23 4.00 noise 180 -104.95 4.00 noise 181 -103.90 4.00 noise 182 -103.83 4.00 noise 183 -109.16 4.00 noise 184 -103.90 4.00 noise 185 -107.83 4.00 noise 186 -106.99 4.00 noise 187 -106.47 4.00 noise 188 -104.39 4.00 noise 189 -102.88 4.00 noise 190 -107.63 4.00 noise 191 -106.83 4.00 noise 192 -103.00 4.00 noise 193 -103.50 4.00 noise 194 -105.60 4.00 noise 195 -105.12 4.00 noise 196 -106.37 4.00 noise 197 -107.20 4.00 noise 198 -106.28 4.00 noise 199 -104.01 4.00 noise 200 -105.85 4.00 noise 201 -105.60 4.00 noise 202 -103.91 4.00 noise 203 -105.07 4.00 noise 204 -105.75 4.00 noise 205 -104.77 4.00 noise 206 -102.30 4.00 noise 207 -107.39 4.00 noise 208 -105.65 4.00 noise 209 -102.82 4.00 noise 210 -109.21 4.00 noise 211 -105.20 4.00 noise 212 -103.75 4.00 noise 213 -106.22 4.00 noise 214 -104.94 4.00 noise 215 -108.01 4.00 noise 216 -105.58 4.00 noise 217 -105.94 4.00 noise 218 -102.37 4.00 noise 219 -107.01 4.00 noise 220 -102.30 4.00 noise 221 -104.20 4.00 noise 222 -105.14 4.00 noise 223 -103.82 4.00 noise 224 -105.47 4.00 tinyos-2.1.2+dfsg/tos/lib/tossim/topologies/15-15-tight-mica2-grid.txt000066400000000000000000035461301207233610700253140ustar00rootroot00000000000000gain 0 1 -64.71 gain 1 0 -66.06 gain 0 2 -73.89 gain 2 0 -76.19 gain 0 3 -76.00 gain 3 0 -77.08 gain 0 4 -78.29 gain 4 0 -80.34 gain 0 5 -78.62 gain 5 0 -78.56 gain 0 6 -85.98 gain 6 0 -87.32 gain 0 7 -89.50 gain 7 0 -90.94 gain 0 8 -87.98 gain 8 0 -91.27 gain 0 9 -87.39 gain 9 0 -95.08 gain 0 10 -91.14 gain 10 0 -97.22 gain 0 11 -92.22 gain 11 0 -102.50 gain 0 12 -92.81 gain 12 0 -94.20 gain 0 13 -97.17 gain 13 0 -101.94 gain 0 14 -100.65 gain 14 0 -101.66 gain 0 15 -62.81 gain 15 0 -66.58 gain 0 16 -65.54 gain 16 0 -71.44 gain 0 17 -76.31 gain 17 0 -80.11 gain 0 18 -75.68 gain 18 0 -80.57 gain 0 19 -82.46 gain 19 0 -88.08 gain 0 20 -81.28 gain 20 0 -88.10 gain 0 21 -83.45 gain 21 0 -89.38 gain 0 22 -86.26 gain 22 0 -90.65 gain 0 23 -96.95 gain 23 0 -98.52 gain 0 24 -90.15 gain 24 0 -93.34 gain 0 25 -90.04 gain 25 0 -95.90 gain 0 26 -96.92 gain 26 0 -104.22 gain 0 27 -91.70 gain 27 0 -96.60 gain 0 28 -85.74 gain 28 0 -85.97 gain 0 29 -88.62 gain 29 0 -90.39 gain 0 30 -66.50 gain 30 0 -73.29 gain 0 31 -68.53 gain 31 0 -71.88 gain 0 32 -75.06 gain 32 0 -75.76 gain 0 33 -79.28 gain 33 0 -81.43 gain 0 34 -73.35 gain 34 0 -76.13 gain 0 35 -79.19 gain 35 0 -82.91 gain 0 36 -87.39 gain 36 0 -91.26 gain 0 37 -90.99 gain 37 0 -97.40 gain 0 38 -90.15 gain 38 0 -94.09 gain 0 39 -86.79 gain 39 0 -95.06 gain 0 40 -92.29 gain 40 0 -95.54 gain 0 41 -88.74 gain 41 0 -87.33 gain 0 42 -93.23 gain 42 0 -99.07 gain 0 43 -90.40 gain 43 0 -93.83 gain 0 44 -94.08 gain 44 0 -101.10 gain 0 45 -70.35 gain 45 0 -77.35 gain 0 46 -68.58 gain 46 0 -72.05 gain 0 47 -73.92 gain 47 0 -75.09 gain 0 48 -82.51 gain 48 0 -83.26 gain 0 49 -84.46 gain 49 0 -89.26 gain 0 50 -81.81 gain 50 0 -83.48 gain 0 51 -88.29 gain 51 0 -93.65 gain 0 52 -87.09 gain 52 0 -89.69 gain 0 53 -93.87 gain 53 0 -97.02 gain 0 54 -91.41 gain 54 0 -93.97 gain 0 55 -89.63 gain 55 0 -89.11 gain 0 56 -97.35 gain 56 0 -101.87 gain 0 57 -92.95 gain 57 0 -96.55 gain 0 58 -97.22 gain 58 0 -97.52 gain 0 59 -92.54 gain 59 0 -92.09 gain 0 60 -82.20 gain 60 0 -91.03 gain 0 61 -83.71 gain 61 0 -84.45 gain 0 62 -74.70 gain 62 0 -72.95 gain 0 63 -76.59 gain 63 0 -78.81 gain 0 64 -84.10 gain 64 0 -90.54 gain 0 65 -83.52 gain 65 0 -85.51 gain 0 66 -90.36 gain 66 0 -91.33 gain 0 67 -89.59 gain 67 0 -91.79 gain 0 68 -90.14 gain 68 0 -94.93 gain 0 69 -94.30 gain 69 0 -96.30 gain 0 70 -95.50 gain 70 0 -95.97 gain 0 71 -93.20 gain 71 0 -97.23 gain 0 72 -98.34 gain 72 0 -99.94 gain 0 73 -89.24 gain 73 0 -92.21 gain 0 74 -100.35 gain 74 0 -99.43 gain 0 75 -79.83 gain 75 0 -84.80 gain 0 76 -84.30 gain 76 0 -89.39 gain 0 77 -81.90 gain 77 0 -82.99 gain 0 78 -88.31 gain 78 0 -93.90 gain 0 79 -83.26 gain 79 0 -88.47 gain 0 80 -87.48 gain 80 0 -90.48 gain 0 81 -92.57 gain 81 0 -96.48 gain 0 82 -93.29 gain 82 0 -98.18 gain 0 83 -96.25 gain 83 0 -98.41 gain 0 84 -92.62 gain 84 0 -91.97 gain 0 85 -92.01 gain 85 0 -96.79 gain 0 86 -90.02 gain 86 0 -96.44 gain 0 87 -94.44 gain 87 0 -98.14 gain 0 88 -91.48 gain 88 0 -94.82 gain 0 89 -97.82 gain 89 0 -103.30 gain 0 90 -83.08 gain 90 0 -87.91 gain 0 91 -86.18 gain 91 0 -92.08 gain 0 92 -82.16 gain 92 0 -88.98 gain 0 93 -75.92 gain 93 0 -80.10 gain 0 94 -84.66 gain 94 0 -87.40 gain 0 95 -87.74 gain 95 0 -89.73 gain 0 96 -92.09 gain 96 0 -101.04 gain 0 97 -85.64 gain 97 0 -87.42 gain 0 98 -90.12 gain 98 0 -92.36 gain 0 99 -95.73 gain 99 0 -97.11 gain 0 100 -96.65 gain 100 0 -97.95 gain 0 101 -94.62 gain 101 0 -99.55 gain 0 102 -93.46 gain 102 0 -98.36 gain 0 103 -94.20 gain 103 0 -100.27 gain 0 104 -99.97 gain 104 0 -108.52 gain 0 105 -83.69 gain 105 0 -86.76 gain 0 106 -88.66 gain 106 0 -89.06 gain 0 107 -88.92 gain 107 0 -89.23 gain 0 108 -89.58 gain 108 0 -89.50 gain 0 109 -85.98 gain 109 0 -89.36 gain 0 110 -89.08 gain 110 0 -98.82 gain 0 111 -87.18 gain 111 0 -86.88 gain 0 112 -91.17 gain 112 0 -94.34 gain 0 113 -92.74 gain 113 0 -95.03 gain 0 114 -95.97 gain 114 0 -95.44 gain 0 115 -98.89 gain 115 0 -99.01 gain 0 116 -93.11 gain 116 0 -95.66 gain 0 117 -94.41 gain 117 0 -94.11 gain 0 118 -89.61 gain 118 0 -90.92 gain 0 119 -101.92 gain 119 0 -108.29 gain 0 120 -92.82 gain 120 0 -96.57 gain 0 121 -88.74 gain 121 0 -93.52 gain 0 122 -87.45 gain 122 0 -91.98 gain 0 123 -94.35 gain 123 0 -99.22 gain 0 124 -87.01 gain 124 0 -89.86 gain 0 125 -93.08 gain 125 0 -99.28 gain 0 126 -91.88 gain 126 0 -94.72 gain 0 127 -93.03 gain 127 0 -95.50 gain 0 128 -96.73 gain 128 0 -101.80 gain 0 129 -90.31 gain 129 0 -92.59 gain 0 130 -94.27 gain 130 0 -97.83 gain 0 131 -98.45 gain 131 0 -101.79 gain 0 132 -98.59 gain 132 0 -97.94 gain 0 133 -97.74 gain 133 0 -102.27 gain 0 134 -105.15 gain 134 0 -106.54 gain 0 135 -89.80 gain 135 0 -93.49 gain 0 136 -89.29 gain 136 0 -93.42 gain 0 137 -88.19 gain 137 0 -95.24 gain 0 138 -94.32 gain 138 0 -94.89 gain 0 139 -92.78 gain 139 0 -96.62 gain 0 140 -93.46 gain 140 0 -98.13 gain 0 141 -87.62 gain 141 0 -84.26 gain 0 142 -90.09 gain 142 0 -93.48 gain 0 143 -97.46 gain 143 0 -103.58 gain 0 144 -92.85 gain 144 0 -97.33 gain 0 145 -91.62 gain 145 0 -99.49 gain 0 146 -103.07 gain 146 0 -106.94 gain 0 147 -91.93 gain 147 0 -92.90 gain 0 148 -102.46 gain 148 0 -101.76 gain 0 149 -101.78 gain 149 0 -104.74 gain 0 150 -89.31 gain 150 0 -93.10 gain 0 151 -87.86 gain 151 0 -90.59 gain 0 152 -89.90 gain 152 0 -92.45 gain 0 153 -93.04 gain 153 0 -94.80 gain 0 154 -86.27 gain 154 0 -89.93 gain 0 155 -89.78 gain 155 0 -92.02 gain 0 156 -94.00 gain 156 0 -95.47 gain 0 157 -92.95 gain 157 0 -96.90 gain 0 158 -92.08 gain 158 0 -95.53 gain 0 159 -95.54 gain 159 0 -101.37 gain 0 160 -89.60 gain 160 0 -92.59 gain 0 161 -97.11 gain 161 0 -102.54 gain 0 162 -99.69 gain 162 0 -104.83 gain 0 163 -102.74 gain 163 0 -109.79 gain 0 164 -101.66 gain 164 0 -108.08 gain 0 165 -89.63 gain 165 0 -93.11 gain 0 166 -99.58 gain 166 0 -102.81 gain 0 167 -91.32 gain 167 0 -95.27 gain 0 168 -90.31 gain 168 0 -93.15 gain 0 169 -95.27 gain 169 0 -99.24 gain 0 170 -97.19 gain 170 0 -100.39 gain 0 171 -93.43 gain 171 0 -97.71 gain 0 172 -98.86 gain 172 0 -101.32 gain 0 173 -92.67 gain 173 0 -99.78 gain 0 174 -90.28 gain 174 0 -93.44 gain 0 175 -103.07 gain 175 0 -107.37 gain 0 176 -99.53 gain 176 0 -102.79 gain 0 177 -93.76 gain 177 0 -100.03 gain 0 178 -98.62 gain 178 0 -98.33 gain 0 179 -102.31 gain 179 0 -101.44 gain 0 180 -98.75 gain 180 0 -107.33 gain 0 181 -86.38 gain 181 0 -88.98 gain 0 182 -89.95 gain 182 0 -93.63 gain 0 183 -88.32 gain 183 0 -92.28 gain 0 184 -106.56 gain 184 0 -113.27 gain 0 185 -98.43 gain 185 0 -109.01 gain 0 186 -99.76 gain 186 0 -105.92 gain 0 187 -101.88 gain 187 0 -105.77 gain 0 188 -100.13 gain 188 0 -106.43 gain 0 189 -92.18 gain 189 0 -93.21 gain 0 190 -97.73 gain 190 0 -102.67 gain 0 191 -103.20 gain 191 0 -106.84 gain 0 192 -101.92 gain 192 0 -104.27 gain 0 193 -101.26 gain 193 0 -102.58 gain 0 194 -104.41 gain 194 0 -106.52 gain 0 195 -96.68 gain 195 0 -97.33 gain 0 196 -95.39 gain 196 0 -100.36 gain 0 197 -99.58 gain 197 0 -99.68 gain 0 198 -94.39 gain 198 0 -99.00 gain 0 199 -90.59 gain 199 0 -95.31 gain 0 200 -97.96 gain 200 0 -104.02 gain 0 201 -102.83 gain 201 0 -108.80 gain 0 202 -95.03 gain 202 0 -100.13 gain 0 203 -96.73 gain 203 0 -100.94 gain 0 204 -99.15 gain 204 0 -100.01 gain 0 205 -93.63 gain 205 0 -98.23 gain 0 206 -100.43 gain 206 0 -106.13 gain 0 207 -98.98 gain 207 0 -104.11 gain 0 208 -99.68 gain 208 0 -107.41 gain 0 209 -104.73 gain 209 0 -112.03 gain 0 210 -92.69 gain 210 0 -100.17 gain 0 211 -94.45 gain 211 0 -97.15 gain 0 212 -98.56 gain 212 0 -104.27 gain 0 213 -94.09 gain 213 0 -99.14 gain 0 214 -92.36 gain 214 0 -102.79 gain 0 215 -93.41 gain 215 0 -99.24 gain 0 216 -91.47 gain 216 0 -101.21 gain 0 217 -92.85 gain 217 0 -102.86 gain 0 218 -92.76 gain 218 0 -95.57 gain 0 219 -93.30 gain 219 0 -96.59 gain 0 220 -96.08 gain 220 0 -95.46 gain 0 221 -97.65 gain 221 0 -102.71 gain 0 222 -97.78 gain 222 0 -98.64 gain 0 223 -98.88 gain 223 0 -102.99 gain 0 224 -101.52 gain 224 0 -106.10 gain 1 2 -60.34 gain 2 1 -61.28 gain 1 3 -78.59 gain 3 1 -78.32 gain 1 4 -70.73 gain 4 1 -71.42 gain 1 5 -81.73 gain 5 1 -80.32 gain 1 6 -86.54 gain 6 1 -86.52 gain 1 7 -91.21 gain 7 1 -91.29 gain 1 8 -91.82 gain 8 1 -93.75 gain 1 9 -90.75 gain 9 1 -97.09 gain 1 10 -87.63 gain 10 1 -92.36 gain 1 11 -101.54 gain 11 1 -110.46 gain 1 12 -97.79 gain 12 1 -97.83 gain 1 13 -86.73 gain 13 1 -90.15 gain 1 14 -95.92 gain 14 1 -95.58 gain 1 15 -67.09 gain 15 1 -69.51 gain 1 16 -65.65 gain 16 1 -70.20 gain 1 17 -76.69 gain 17 1 -79.14 gain 1 18 -74.78 gain 18 1 -78.31 gain 1 19 -82.78 gain 19 1 -87.04 gain 1 20 -78.61 gain 20 1 -84.08 gain 1 21 -85.41 gain 21 1 -89.99 gain 1 22 -91.84 gain 22 1 -94.88 gain 1 23 -83.19 gain 23 1 -83.40 gain 1 24 -92.71 gain 24 1 -94.54 gain 1 25 -91.96 gain 25 1 -96.48 gain 1 26 -91.27 gain 26 1 -97.22 gain 1 27 -95.33 gain 27 1 -98.88 gain 1 28 -97.34 gain 28 1 -96.21 gain 1 29 -93.85 gain 29 1 -94.28 gain 1 30 -73.57 gain 30 1 -79.00 gain 1 31 -76.43 gain 31 1 -78.42 gain 1 32 -72.56 gain 32 1 -71.90 gain 1 33 -78.27 gain 33 1 -79.06 gain 1 34 -76.16 gain 34 1 -77.58 gain 1 35 -84.15 gain 35 1 -86.52 gain 1 36 -88.81 gain 36 1 -91.33 gain 1 37 -88.27 gain 37 1 -93.33 gain 1 38 -90.98 gain 38 1 -93.57 gain 1 39 -90.38 gain 39 1 -97.29 gain 1 40 -93.43 gain 40 1 -95.32 gain 1 41 -90.42 gain 41 1 -87.66 gain 1 42 -91.70 gain 42 1 -96.18 gain 1 43 -94.72 gain 43 1 -96.80 gain 1 44 -88.49 gain 44 1 -94.16 gain 1 45 -82.05 gain 45 1 -87.70 gain 1 46 -73.09 gain 46 1 -75.21 gain 1 47 -76.98 gain 47 1 -76.80 gain 1 48 -79.52 gain 48 1 -78.92 gain 1 49 -85.50 gain 49 1 -88.96 gain 1 50 -75.56 gain 50 1 -75.88 gain 1 51 -90.29 gain 51 1 -94.30 gain 1 52 -84.90 gain 52 1 -86.15 gain 1 53 -99.60 gain 53 1 -101.40 gain 1 54 -86.33 gain 54 1 -87.53 gain 1 55 -97.25 gain 55 1 -95.38 gain 1 56 -89.68 gain 56 1 -92.86 gain 1 57 -89.59 gain 57 1 -91.84 gain 1 58 -95.39 gain 58 1 -94.34 gain 1 59 -94.76 gain 59 1 -92.96 gain 1 60 -81.65 gain 60 1 -89.13 gain 1 61 -79.47 gain 61 1 -78.85 gain 1 62 -78.81 gain 62 1 -75.71 gain 1 63 -78.89 gain 63 1 -79.75 gain 1 64 -83.38 gain 64 1 -88.47 gain 1 65 -80.88 gain 65 1 -81.52 gain 1 66 -81.43 gain 66 1 -81.04 gain 1 67 -87.38 gain 67 1 -88.23 gain 1 68 -82.48 gain 68 1 -85.91 gain 1 69 -96.96 gain 69 1 -97.61 gain 1 70 -98.81 gain 70 1 -97.93 gain 1 71 -90.32 gain 71 1 -93.00 gain 1 72 -99.66 gain 72 1 -99.91 gain 1 73 -94.02 gain 73 1 -95.64 gain 1 74 -89.52 gain 74 1 -87.24 gain 1 75 -78.55 gain 75 1 -82.16 gain 1 76 -75.94 gain 76 1 -79.69 gain 1 77 -82.22 gain 77 1 -81.95 gain 1 78 -85.59 gain 78 1 -89.83 gain 1 79 -79.42 gain 79 1 -83.28 gain 1 80 -88.69 gain 80 1 -90.34 gain 1 81 -86.94 gain 81 1 -89.50 gain 1 82 -92.55 gain 82 1 -96.08 gain 1 83 -88.73 gain 83 1 -89.54 gain 1 84 -85.61 gain 84 1 -83.60 gain 1 85 -95.43 gain 85 1 -98.86 gain 1 86 -98.63 gain 86 1 -103.70 gain 1 87 -94.25 gain 87 1 -96.60 gain 1 88 -101.87 gain 88 1 -103.86 gain 1 89 -96.47 gain 89 1 -100.61 gain 1 90 -83.32 gain 90 1 -86.79 gain 1 91 -89.51 gain 91 1 -94.06 gain 1 92 -87.00 gain 92 1 -92.46 gain 1 93 -86.77 gain 93 1 -89.59 gain 1 94 -90.14 gain 94 1 -91.53 gain 1 95 -92.62 gain 95 1 -93.25 gain 1 96 -93.00 gain 96 1 -100.60 gain 1 97 -87.26 gain 97 1 -87.69 gain 1 98 -89.98 gain 98 1 -90.88 gain 1 99 -98.07 gain 99 1 -98.10 gain 1 100 -89.03 gain 100 1 -88.98 gain 1 101 -100.98 gain 101 1 -104.56 gain 1 102 -94.95 gain 102 1 -98.49 gain 1 103 -97.33 gain 103 1 -102.04 gain 1 104 -95.24 gain 104 1 -102.43 gain 1 105 -83.70 gain 105 1 -85.41 gain 1 106 -84.89 gain 106 1 -83.94 gain 1 107 -81.23 gain 107 1 -80.18 gain 1 108 -87.84 gain 108 1 -86.41 gain 1 109 -84.47 gain 109 1 -86.49 gain 1 110 -88.09 gain 110 1 -96.47 gain 1 111 -95.89 gain 111 1 -94.24 gain 1 112 -89.96 gain 112 1 -91.78 gain 1 113 -92.50 gain 113 1 -93.45 gain 1 114 -86.84 gain 114 1 -84.95 gain 1 115 -89.85 gain 115 1 -88.61 gain 1 116 -99.20 gain 116 1 -100.39 gain 1 117 -89.24 gain 117 1 -87.58 gain 1 118 -92.43 gain 118 1 -92.39 gain 1 119 -101.76 gain 119 1 -106.78 gain 1 120 -88.13 gain 120 1 -90.53 gain 1 121 -92.48 gain 121 1 -95.90 gain 1 122 -95.94 gain 122 1 -99.12 gain 1 123 -87.64 gain 123 1 -91.16 gain 1 124 -90.23 gain 124 1 -91.73 gain 1 125 -90.49 gain 125 1 -95.33 gain 1 126 -86.45 gain 126 1 -87.95 gain 1 127 -94.62 gain 127 1 -95.74 gain 1 128 -94.56 gain 128 1 -98.27 gain 1 129 -94.69 gain 129 1 -95.61 gain 1 130 -93.38 gain 130 1 -95.60 gain 1 131 -95.10 gain 131 1 -97.09 gain 1 132 -94.22 gain 132 1 -92.21 gain 1 133 -94.95 gain 133 1 -98.13 gain 1 134 -93.26 gain 134 1 -93.29 gain 1 135 -96.90 gain 135 1 -99.24 gain 1 136 -94.46 gain 136 1 -97.24 gain 1 137 -91.58 gain 137 1 -97.27 gain 1 138 -91.18 gain 138 1 -90.41 gain 1 139 -91.03 gain 139 1 -93.52 gain 1 140 -88.81 gain 140 1 -92.12 gain 1 141 -94.65 gain 141 1 -89.93 gain 1 142 -95.33 gain 142 1 -97.36 gain 1 143 -96.18 gain 143 1 -100.95 gain 1 144 -101.50 gain 144 1 -104.63 gain 1 145 -90.40 gain 145 1 -96.92 gain 1 146 -95.25 gain 146 1 -97.76 gain 1 147 -95.79 gain 147 1 -95.41 gain 1 148 -98.56 gain 148 1 -96.51 gain 1 149 -102.71 gain 149 1 -104.31 gain 1 150 -93.18 gain 150 1 -95.62 gain 1 151 -87.69 gain 151 1 -89.07 gain 1 152 -92.22 gain 152 1 -93.42 gain 1 153 -93.21 gain 153 1 -93.62 gain 1 154 -89.90 gain 154 1 -92.21 gain 1 155 -94.73 gain 155 1 -95.61 gain 1 156 -96.65 gain 156 1 -96.76 gain 1 157 -98.16 gain 157 1 -100.76 gain 1 158 -92.22 gain 158 1 -94.32 gain 1 159 -95.92 gain 159 1 -100.40 gain 1 160 -98.73 gain 160 1 -100.37 gain 1 161 -96.94 gain 161 1 -101.02 gain 1 162 -99.57 gain 162 1 -103.35 gain 1 163 -102.70 gain 163 1 -108.40 gain 1 164 -99.05 gain 164 1 -104.12 gain 1 165 -89.74 gain 165 1 -91.87 gain 1 166 -94.82 gain 166 1 -96.70 gain 1 167 -93.14 gain 167 1 -95.74 gain 1 168 -93.06 gain 168 1 -94.56 gain 1 169 -93.64 gain 169 1 -96.25 gain 1 170 -94.01 gain 170 1 -95.85 gain 1 171 -98.37 gain 171 1 -101.29 gain 1 172 -90.64 gain 172 1 -91.75 gain 1 173 -94.15 gain 173 1 -99.91 gain 1 174 -101.05 gain 174 1 -102.86 gain 1 175 -96.90 gain 175 1 -99.85 gain 1 176 -94.96 gain 176 1 -96.87 gain 1 177 -97.27 gain 177 1 -102.19 gain 1 178 -98.58 gain 178 1 -96.93 gain 1 179 -92.41 gain 179 1 -90.19 gain 1 180 -98.67 gain 180 1 -105.90 gain 1 181 -95.59 gain 181 1 -96.84 gain 1 182 -96.53 gain 182 1 -98.86 gain 1 183 -98.93 gain 183 1 -101.54 gain 1 184 -100.53 gain 184 1 -105.89 gain 1 185 -103.38 gain 185 1 -112.61 gain 1 186 -97.26 gain 186 1 -102.06 gain 1 187 -102.57 gain 187 1 -105.11 gain 1 188 -96.84 gain 188 1 -101.79 gain 1 189 -102.45 gain 189 1 -102.12 gain 1 190 -98.45 gain 190 1 -102.04 gain 1 191 -101.47 gain 191 1 -103.76 gain 1 192 -97.64 gain 192 1 -98.63 gain 1 193 -93.77 gain 193 1 -93.74 gain 1 194 -100.07 gain 194 1 -100.82 gain 1 195 -94.05 gain 195 1 -93.36 gain 1 196 -105.96 gain 196 1 -109.57 gain 1 197 -91.17 gain 197 1 -89.92 gain 1 198 -91.04 gain 198 1 -94.30 gain 1 199 -99.46 gain 199 1 -102.83 gain 1 200 -99.49 gain 200 1 -104.20 gain 1 201 -92.11 gain 201 1 -96.73 gain 1 202 -97.28 gain 202 1 -101.03 gain 1 203 -100.67 gain 203 1 -103.53 gain 1 204 -100.52 gain 204 1 -100.02 gain 1 205 -98.45 gain 205 1 -101.70 gain 1 206 -101.39 gain 206 1 -105.74 gain 1 207 -96.98 gain 207 1 -100.75 gain 1 208 -104.54 gain 208 1 -110.92 gain 1 209 -95.36 gain 209 1 -101.31 gain 1 210 -99.74 gain 210 1 -105.86 gain 1 211 -101.86 gain 211 1 -103.21 gain 1 212 -96.08 gain 212 1 -100.44 gain 1 213 -98.26 gain 213 1 -101.95 gain 1 214 -97.85 gain 214 1 -106.93 gain 1 215 -91.45 gain 215 1 -95.93 gain 1 216 -98.65 gain 216 1 -107.04 gain 1 217 -95.80 gain 217 1 -104.45 gain 1 218 -99.60 gain 218 1 -101.06 gain 1 219 -102.86 gain 219 1 -104.80 gain 1 220 -104.37 gain 220 1 -102.40 gain 1 221 -98.47 gain 221 1 -102.18 gain 1 222 -110.67 gain 222 1 -110.19 gain 1 223 -94.35 gain 223 1 -97.10 gain 1 224 -102.77 gain 224 1 -105.99 gain 2 3 -57.98 gain 3 2 -56.76 gain 2 4 -69.28 gain 4 2 -69.03 gain 2 5 -73.84 gain 5 2 -71.48 gain 2 6 -81.84 gain 6 2 -80.88 gain 2 7 -81.01 gain 7 2 -80.15 gain 2 8 -88.80 gain 8 2 -89.79 gain 2 9 -89.58 gain 9 2 -94.97 gain 2 10 -91.00 gain 10 2 -94.79 gain 2 11 -94.15 gain 11 2 -102.13 gain 2 12 -94.16 gain 12 2 -93.26 gain 2 13 -96.92 gain 13 2 -99.39 gain 2 14 -96.85 gain 14 2 -95.57 gain 2 15 -79.81 gain 15 2 -81.29 gain 2 16 -72.57 gain 16 2 -76.18 gain 2 17 -62.99 gain 17 2 -64.50 gain 2 18 -65.15 gain 18 2 -67.74 gain 2 19 -74.26 gain 19 2 -77.58 gain 2 20 -77.50 gain 20 2 -82.03 gain 2 21 -80.36 gain 21 2 -84.00 gain 2 22 -75.88 gain 22 2 -77.98 gain 2 23 -86.54 gain 23 2 -85.82 gain 2 24 -92.60 gain 24 2 -93.49 gain 2 25 -89.18 gain 25 2 -92.75 gain 2 26 -88.12 gain 26 2 -93.12 gain 2 27 -94.73 gain 27 2 -97.35 gain 2 28 -101.25 gain 28 2 -99.18 gain 2 29 -94.45 gain 29 2 -93.93 gain 2 30 -73.62 gain 30 2 -78.11 gain 2 31 -71.31 gain 31 2 -72.36 gain 2 32 -66.74 gain 32 2 -65.14 gain 2 33 -72.01 gain 33 2 -71.86 gain 2 34 -74.42 gain 34 2 -74.91 gain 2 35 -86.60 gain 35 2 -88.03 gain 2 36 -85.77 gain 36 2 -87.34 gain 2 37 -86.98 gain 37 2 -91.09 gain 2 38 -84.79 gain 38 2 -86.44 gain 2 39 -82.95 gain 39 2 -88.92 gain 2 40 -99.61 gain 40 2 -100.56 gain 2 41 -91.48 gain 41 2 -87.78 gain 2 42 -89.99 gain 42 2 -93.53 gain 2 43 -96.09 gain 43 2 -97.22 gain 2 44 -96.13 gain 44 2 -100.86 gain 2 45 -75.88 gain 45 2 -80.59 gain 2 46 -80.72 gain 46 2 -81.89 gain 2 47 -74.76 gain 47 2 -73.64 gain 2 48 -76.60 gain 48 2 -75.05 gain 2 49 -77.04 gain 49 2 -79.55 gain 2 50 -81.49 gain 50 2 -80.87 gain 2 51 -94.88 gain 51 2 -97.94 gain 2 52 -80.39 gain 52 2 -80.69 gain 2 53 -82.02 gain 53 2 -82.88 gain 2 54 -90.11 gain 54 2 -90.37 gain 2 55 -102.07 gain 55 2 -99.25 gain 2 56 -103.60 gain 56 2 -105.83 gain 2 57 -90.83 gain 57 2 -92.14 gain 2 58 -94.72 gain 58 2 -92.72 gain 2 59 -96.20 gain 59 2 -93.46 gain 2 60 -88.01 gain 60 2 -94.54 gain 2 61 -78.56 gain 61 2 -77.00 gain 2 62 -80.02 gain 62 2 -75.97 gain 2 63 -82.93 gain 63 2 -82.84 gain 2 64 -80.37 gain 64 2 -84.51 gain 2 65 -79.39 gain 65 2 -79.08 gain 2 66 -85.54 gain 66 2 -84.22 gain 2 67 -82.71 gain 67 2 -82.62 gain 2 68 -87.33 gain 68 2 -89.82 gain 2 69 -86.03 gain 69 2 -85.74 gain 2 70 -90.27 gain 70 2 -88.45 gain 2 71 -91.95 gain 71 2 -93.69 gain 2 72 -92.30 gain 72 2 -91.60 gain 2 73 -100.50 gain 73 2 -101.17 gain 2 74 -98.27 gain 74 2 -95.05 gain 2 75 -94.07 gain 75 2 -96.74 gain 2 76 -81.46 gain 76 2 -84.25 gain 2 77 -83.25 gain 77 2 -82.05 gain 2 78 -90.56 gain 78 2 -93.86 gain 2 79 -88.05 gain 79 2 -90.96 gain 2 80 -91.73 gain 80 2 -92.43 gain 2 81 -85.63 gain 81 2 -87.25 gain 2 82 -81.84 gain 82 2 -84.43 gain 2 83 -89.08 gain 83 2 -88.95 gain 2 84 -90.65 gain 84 2 -87.70 gain 2 85 -97.58 gain 85 2 -100.06 gain 2 86 -98.77 gain 86 2 -102.89 gain 2 87 -93.93 gain 87 2 -95.34 gain 2 88 -99.93 gain 88 2 -100.98 gain 2 89 -98.08 gain 89 2 -101.27 gain 2 90 -85.25 gain 90 2 -87.79 gain 2 91 -90.67 gain 91 2 -94.27 gain 2 92 -90.05 gain 92 2 -94.57 gain 2 93 -85.54 gain 93 2 -87.42 gain 2 94 -86.81 gain 94 2 -87.26 gain 2 95 -91.80 gain 95 2 -91.49 gain 2 96 -92.41 gain 96 2 -99.07 gain 2 97 -91.50 gain 97 2 -90.98 gain 2 98 -83.97 gain 98 2 -83.92 gain 2 99 -88.67 gain 99 2 -87.75 gain 2 100 -90.74 gain 100 2 -89.75 gain 2 101 -95.35 gain 101 2 -97.99 gain 2 102 -94.57 gain 102 2 -97.17 gain 2 103 -101.20 gain 103 2 -104.97 gain 2 104 -101.40 gain 104 2 -107.65 gain 2 105 -89.99 gain 105 2 -90.77 gain 2 106 -88.62 gain 106 2 -86.73 gain 2 107 -81.29 gain 107 2 -79.30 gain 2 108 -92.16 gain 108 2 -89.79 gain 2 109 -95.23 gain 109 2 -96.31 gain 2 110 -92.84 gain 110 2 -100.28 gain 2 111 -89.84 gain 111 2 -87.25 gain 2 112 -90.25 gain 112 2 -91.12 gain 2 113 -90.56 gain 113 2 -90.56 gain 2 114 -92.21 gain 114 2 -89.38 gain 2 115 -89.42 gain 115 2 -87.24 gain 2 116 -98.27 gain 116 2 -98.52 gain 2 117 -100.22 gain 117 2 -97.62 gain 2 118 -90.83 gain 118 2 -89.85 gain 2 119 -99.26 gain 119 2 -103.33 gain 2 120 -92.08 gain 120 2 -93.54 gain 2 121 -94.99 gain 121 2 -97.47 gain 2 122 -90.18 gain 122 2 -92.41 gain 2 123 -93.97 gain 123 2 -96.55 gain 2 124 -93.71 gain 124 2 -94.27 gain 2 125 -91.74 gain 125 2 -95.64 gain 2 126 -96.24 gain 126 2 -96.79 gain 2 127 -101.23 gain 127 2 -101.41 gain 2 128 -96.73 gain 128 2 -99.50 gain 2 129 -88.62 gain 129 2 -88.60 gain 2 130 -94.65 gain 130 2 -95.93 gain 2 131 -97.03 gain 131 2 -98.08 gain 2 132 -96.71 gain 132 2 -93.76 gain 2 133 -98.57 gain 133 2 -100.80 gain 2 134 -93.25 gain 134 2 -92.34 gain 2 135 -88.07 gain 135 2 -89.47 gain 2 136 -87.68 gain 136 2 -89.52 gain 2 137 -100.73 gain 137 2 -105.48 gain 2 138 -91.41 gain 138 2 -89.69 gain 2 139 -94.33 gain 139 2 -95.88 gain 2 140 -90.93 gain 140 2 -93.30 gain 2 141 -96.91 gain 141 2 -91.26 gain 2 142 -92.69 gain 142 2 -93.77 gain 2 143 -89.11 gain 143 2 -92.93 gain 2 144 -96.76 gain 144 2 -98.95 gain 2 145 -98.91 gain 145 2 -104.49 gain 2 146 -94.57 gain 146 2 -96.14 gain 2 147 -94.07 gain 147 2 -92.74 gain 2 148 -98.48 gain 148 2 -95.49 gain 2 149 -102.45 gain 149 2 -103.11 gain 2 150 -93.92 gain 150 2 -95.42 gain 2 151 -86.90 gain 151 2 -87.34 gain 2 152 -93.74 gain 152 2 -94.00 gain 2 153 -88.51 gain 153 2 -87.98 gain 2 154 -94.87 gain 154 2 -96.25 gain 2 155 -96.28 gain 155 2 -96.22 gain 2 156 -95.97 gain 156 2 -95.15 gain 2 157 -93.64 gain 157 2 -95.29 gain 2 158 -98.28 gain 158 2 -99.43 gain 2 159 -98.44 gain 159 2 -101.98 gain 2 160 -101.74 gain 160 2 -102.44 gain 2 161 -103.05 gain 161 2 -106.19 gain 2 162 -105.88 gain 162 2 -108.73 gain 2 163 -103.69 gain 163 2 -108.45 gain 2 164 -99.50 gain 164 2 -103.63 gain 2 165 -94.93 gain 165 2 -96.12 gain 2 166 -97.36 gain 166 2 -98.30 gain 2 167 -88.88 gain 167 2 -90.54 gain 2 168 -92.29 gain 168 2 -92.85 gain 2 169 -100.00 gain 169 2 -101.67 gain 2 170 -96.00 gain 170 2 -96.91 gain 2 171 -98.59 gain 171 2 -100.57 gain 2 172 -88.78 gain 172 2 -88.95 gain 2 173 -92.17 gain 173 2 -96.98 gain 2 174 -93.48 gain 174 2 -94.35 gain 2 175 -92.05 gain 175 2 -94.05 gain 2 176 -100.99 gain 176 2 -101.97 gain 2 177 -97.45 gain 177 2 -101.43 gain 2 178 -106.73 gain 178 2 -104.14 gain 2 179 -102.10 gain 179 2 -98.94 gain 2 180 -96.32 gain 180 2 -102.61 gain 2 181 -92.01 gain 181 2 -92.32 gain 2 182 -94.90 gain 182 2 -96.29 gain 2 183 -95.43 gain 183 2 -97.10 gain 2 184 -90.57 gain 184 2 -94.98 gain 2 185 -94.70 gain 185 2 -102.99 gain 2 186 -90.71 gain 186 2 -94.57 gain 2 187 -93.67 gain 187 2 -95.26 gain 2 188 -93.49 gain 188 2 -97.49 gain 2 189 -95.68 gain 189 2 -94.41 gain 2 190 -100.75 gain 190 2 -103.40 gain 2 191 -91.95 gain 191 2 -93.30 gain 2 192 -101.25 gain 192 2 -101.30 gain 2 193 -94.01 gain 193 2 -93.04 gain 2 194 -103.76 gain 194 2 -103.57 gain 2 195 -97.16 gain 195 2 -95.52 gain 2 196 -95.14 gain 196 2 -97.81 gain 2 197 -94.64 gain 197 2 -92.45 gain 2 198 -96.56 gain 198 2 -98.88 gain 2 199 -98.24 gain 199 2 -100.66 gain 2 200 -100.80 gain 200 2 -104.56 gain 2 201 -93.51 gain 201 2 -97.18 gain 2 202 -98.90 gain 202 2 -101.70 gain 2 203 -101.39 gain 203 2 -103.31 gain 2 204 -97.32 gain 204 2 -95.88 gain 2 205 -102.60 gain 205 2 -104.91 gain 2 206 -98.35 gain 206 2 -101.76 gain 2 207 -100.34 gain 207 2 -103.17 gain 2 208 -101.36 gain 208 2 -106.79 gain 2 209 -108.10 gain 209 2 -113.10 gain 2 210 -97.66 gain 210 2 -102.84 gain 2 211 -97.78 gain 211 2 -98.19 gain 2 212 -90.88 gain 212 2 -94.30 gain 2 213 -95.86 gain 213 2 -98.61 gain 2 214 -98.86 gain 214 2 -107.00 gain 2 215 -99.61 gain 215 2 -103.15 gain 2 216 -91.92 gain 216 2 -99.37 gain 2 217 -99.96 gain 217 2 -107.67 gain 2 218 -99.57 gain 218 2 -100.08 gain 2 219 -103.83 gain 219 2 -104.82 gain 2 220 -101.93 gain 220 2 -99.01 gain 2 221 -97.56 gain 221 2 -100.33 gain 2 222 -95.97 gain 222 2 -94.54 gain 2 223 -101.97 gain 223 2 -103.78 gain 2 224 -97.93 gain 224 2 -100.21 gain 3 4 -62.83 gain 4 3 -63.79 gain 3 5 -72.96 gain 5 3 -71.82 gain 3 6 -74.02 gain 6 3 -74.28 gain 3 7 -84.73 gain 7 3 -85.09 gain 3 8 -91.65 gain 8 3 -93.85 gain 3 9 -92.12 gain 9 3 -98.73 gain 3 10 -86.26 gain 10 3 -91.27 gain 3 11 -86.98 gain 11 3 -96.18 gain 3 12 -97.09 gain 12 3 -97.40 gain 3 13 -84.54 gain 13 3 -88.24 gain 3 14 -97.71 gain 14 3 -97.64 gain 3 15 -79.43 gain 15 3 -82.13 gain 3 16 -76.26 gain 16 3 -81.09 gain 3 17 -63.48 gain 17 3 -66.20 gain 3 18 -66.79 gain 18 3 -70.59 gain 3 19 -68.37 gain 19 3 -72.91 gain 3 20 -76.21 gain 20 3 -81.96 gain 3 21 -71.28 gain 21 3 -76.13 gain 3 22 -89.46 gain 22 3 -92.78 gain 3 23 -86.70 gain 23 3 -87.19 gain 3 24 -85.78 gain 24 3 -87.89 gain 3 25 -93.37 gain 25 3 -98.16 gain 3 26 -87.31 gain 26 3 -93.52 gain 3 27 -91.31 gain 27 3 -95.14 gain 3 28 -89.62 gain 28 3 -88.78 gain 3 29 -94.43 gain 29 3 -95.13 gain 3 30 -80.55 gain 30 3 -86.26 gain 3 31 -81.94 gain 31 3 -84.21 gain 3 32 -77.41 gain 32 3 -77.03 gain 3 33 -77.89 gain 33 3 -78.95 gain 3 34 -71.07 gain 34 3 -72.77 gain 3 35 -83.82 gain 35 3 -86.47 gain 3 36 -79.10 gain 36 3 -81.90 gain 3 37 -82.19 gain 37 3 -87.52 gain 3 38 -85.26 gain 38 3 -88.12 gain 3 39 -86.17 gain 39 3 -93.36 gain 3 40 -92.20 gain 40 3 -94.37 gain 3 41 -96.70 gain 41 3 -94.21 gain 3 42 -89.38 gain 42 3 -94.14 gain 3 43 -95.36 gain 43 3 -97.71 gain 3 44 -96.68 gain 44 3 -102.63 gain 3 45 -79.84 gain 45 3 -85.76 gain 3 46 -78.75 gain 46 3 -81.15 gain 3 47 -70.82 gain 47 3 -70.91 gain 3 48 -77.81 gain 48 3 -77.49 gain 3 49 -79.19 gain 49 3 -82.92 gain 3 50 -76.83 gain 50 3 -77.41 gain 3 51 -78.86 gain 51 3 -83.15 gain 3 52 -92.00 gain 52 3 -93.52 gain 3 53 -90.56 gain 53 3 -92.63 gain 3 54 -83.05 gain 54 3 -84.53 gain 3 55 -86.87 gain 55 3 -85.27 gain 3 56 -90.42 gain 56 3 -93.86 gain 3 57 -95.02 gain 57 3 -97.55 gain 3 58 -90.39 gain 58 3 -89.62 gain 3 59 -93.67 gain 59 3 -92.15 gain 3 60 -87.07 gain 60 3 -94.82 gain 3 61 -77.03 gain 61 3 -76.69 gain 3 62 -84.73 gain 62 3 -81.90 gain 3 63 -80.29 gain 63 3 -81.43 gain 3 64 -85.73 gain 64 3 -91.09 gain 3 65 -84.56 gain 65 3 -85.47 gain 3 66 -85.57 gain 66 3 -85.46 gain 3 67 -83.80 gain 67 3 -84.92 gain 3 68 -89.73 gain 68 3 -93.44 gain 3 69 -90.42 gain 69 3 -91.35 gain 3 70 -90.41 gain 70 3 -89.80 gain 3 71 -92.63 gain 71 3 -95.59 gain 3 72 -93.61 gain 72 3 -94.13 gain 3 73 -98.45 gain 73 3 -100.34 gain 3 74 -94.70 gain 74 3 -92.70 gain 3 75 -87.02 gain 75 3 -90.91 gain 3 76 -82.44 gain 76 3 -86.45 gain 3 77 -80.54 gain 77 3 -80.55 gain 3 78 -82.78 gain 78 3 -87.29 gain 3 79 -88.74 gain 79 3 -92.87 gain 3 80 -85.30 gain 80 3 -87.23 gain 3 81 -80.46 gain 81 3 -83.30 gain 3 82 -80.89 gain 82 3 -84.70 gain 3 83 -80.78 gain 83 3 -81.87 gain 3 84 -88.69 gain 84 3 -86.96 gain 3 85 -87.78 gain 85 3 -91.47 gain 3 86 -90.67 gain 86 3 -96.01 gain 3 87 -92.16 gain 87 3 -94.78 gain 3 88 -94.08 gain 88 3 -96.34 gain 3 89 -101.41 gain 89 3 -105.82 gain 3 90 -93.07 gain 90 3 -96.82 gain 3 91 -87.50 gain 91 3 -92.32 gain 3 92 -82.07 gain 92 3 -87.81 gain 3 93 -83.62 gain 93 3 -86.72 gain 3 94 -85.68 gain 94 3 -87.34 gain 3 95 -87.59 gain 95 3 -88.50 gain 3 96 -93.32 gain 96 3 -101.20 gain 3 97 -90.29 gain 97 3 -90.99 gain 3 98 -95.59 gain 98 3 -96.75 gain 3 99 -81.45 gain 99 3 -81.75 gain 3 100 -87.80 gain 100 3 -88.02 gain 3 101 -100.32 gain 101 3 -104.17 gain 3 102 -98.82 gain 102 3 -102.64 gain 3 103 -95.80 gain 103 3 -100.79 gain 3 104 -90.90 gain 104 3 -98.37 gain 3 105 -89.83 gain 105 3 -91.82 gain 3 106 -84.27 gain 106 3 -83.59 gain 3 107 -82.56 gain 107 3 -81.78 gain 3 108 -90.24 gain 108 3 -89.09 gain 3 109 -84.60 gain 109 3 -86.89 gain 3 110 -89.80 gain 110 3 -98.45 gain 3 111 -91.15 gain 111 3 -89.78 gain 3 112 -88.91 gain 112 3 -91.00 gain 3 113 -89.84 gain 113 3 -91.05 gain 3 114 -91.74 gain 114 3 -90.13 gain 3 115 -89.46 gain 115 3 -88.50 gain 3 116 -90.05 gain 116 3 -91.52 gain 3 117 -94.74 gain 117 3 -93.35 gain 3 118 -94.43 gain 118 3 -94.66 gain 3 119 -90.57 gain 119 3 -95.86 gain 3 120 -89.18 gain 120 3 -91.86 gain 3 121 -86.27 gain 121 3 -89.97 gain 3 122 -80.52 gain 122 3 -83.97 gain 3 123 -91.04 gain 123 3 -94.83 gain 3 124 -87.69 gain 124 3 -89.46 gain 3 125 -92.04 gain 125 3 -97.16 gain 3 126 -86.20 gain 126 3 -87.96 gain 3 127 -90.92 gain 127 3 -92.32 gain 3 128 -83.41 gain 128 3 -87.39 gain 3 129 -87.62 gain 129 3 -88.82 gain 3 130 -91.57 gain 130 3 -94.06 gain 3 131 -93.70 gain 131 3 -95.97 gain 3 132 -89.26 gain 132 3 -87.52 gain 3 133 -100.60 gain 133 3 -104.05 gain 3 134 -97.23 gain 134 3 -97.54 gain 3 135 -82.97 gain 135 3 -85.58 gain 3 136 -90.58 gain 136 3 -93.63 gain 3 137 -90.40 gain 137 3 -96.37 gain 3 138 -91.26 gain 138 3 -90.76 gain 3 139 -92.36 gain 139 3 -95.13 gain 3 140 -91.50 gain 140 3 -95.09 gain 3 141 -83.35 gain 141 3 -78.92 gain 3 142 -95.32 gain 142 3 -97.62 gain 3 143 -91.53 gain 143 3 -96.58 gain 3 144 -87.68 gain 144 3 -91.08 gain 3 145 -96.56 gain 145 3 -103.35 gain 3 146 -92.75 gain 146 3 -95.54 gain 3 147 -94.44 gain 147 3 -94.33 gain 3 148 -89.27 gain 148 3 -87.49 gain 3 149 -88.44 gain 149 3 -90.31 gain 3 150 -88.41 gain 150 3 -91.13 gain 3 151 -88.99 gain 151 3 -90.65 gain 3 152 -97.28 gain 152 3 -98.75 gain 3 153 -93.67 gain 153 3 -94.35 gain 3 154 -93.44 gain 154 3 -96.03 gain 3 155 -87.33 gain 155 3 -88.49 gain 3 156 -93.72 gain 156 3 -94.11 gain 3 157 -91.88 gain 157 3 -94.76 gain 3 158 -87.27 gain 158 3 -89.65 gain 3 159 -97.77 gain 159 3 -102.53 gain 3 160 -98.42 gain 160 3 -100.33 gain 3 161 -94.47 gain 161 3 -98.82 gain 3 162 -92.15 gain 162 3 -96.21 gain 3 163 -95.86 gain 163 3 -101.83 gain 3 164 -99.17 gain 164 3 -104.51 gain 3 165 -92.33 gain 165 3 -94.73 gain 3 166 -97.71 gain 166 3 -99.86 gain 3 167 -95.70 gain 167 3 -98.58 gain 3 168 -96.72 gain 168 3 -98.49 gain 3 169 -103.41 gain 169 3 -106.30 gain 3 170 -95.97 gain 170 3 -98.09 gain 3 171 -87.49 gain 171 3 -90.69 gain 3 172 -92.16 gain 172 3 -93.54 gain 3 173 -86.99 gain 173 3 -93.03 gain 3 174 -84.89 gain 174 3 -86.97 gain 3 175 -99.92 gain 175 3 -103.14 gain 3 176 -100.49 gain 176 3 -102.68 gain 3 177 -94.51 gain 177 3 -99.70 gain 3 178 -100.01 gain 178 3 -98.64 gain 3 179 -96.95 gain 179 3 -95.00 gain 3 180 -96.00 gain 180 3 -103.50 gain 3 181 -99.87 gain 181 3 -101.40 gain 3 182 -91.17 gain 182 3 -93.78 gain 3 183 -90.45 gain 183 3 -93.33 gain 3 184 -89.44 gain 184 3 -95.08 gain 3 185 -98.95 gain 185 3 -108.45 gain 3 186 -100.11 gain 186 3 -105.19 gain 3 187 -93.48 gain 187 3 -96.29 gain 3 188 -94.17 gain 188 3 -99.39 gain 3 189 -94.35 gain 189 3 -94.29 gain 3 190 -101.91 gain 190 3 -105.77 gain 3 191 -94.54 gain 191 3 -97.11 gain 3 192 -93.33 gain 192 3 -94.59 gain 3 193 -93.81 gain 193 3 -94.06 gain 3 194 -98.24 gain 194 3 -99.27 gain 3 195 -95.61 gain 195 3 -95.19 gain 3 196 -96.32 gain 196 3 -100.21 gain 3 197 -97.59 gain 197 3 -96.61 gain 3 198 -90.14 gain 198 3 -93.67 gain 3 199 -94.27 gain 199 3 -97.91 gain 3 200 -91.58 gain 200 3 -96.55 gain 3 201 -91.27 gain 201 3 -96.16 gain 3 202 -94.53 gain 202 3 -98.55 gain 3 203 -92.91 gain 203 3 -96.04 gain 3 204 -90.13 gain 204 3 -89.91 gain 3 205 -95.27 gain 205 3 -98.79 gain 3 206 -103.81 gain 206 3 -108.43 gain 3 207 -98.53 gain 207 3 -102.57 gain 3 208 -101.25 gain 208 3 -107.90 gain 3 209 -101.73 gain 209 3 -107.95 gain 3 210 -105.37 gain 210 3 -111.77 gain 3 211 -94.39 gain 211 3 -96.01 gain 3 212 -88.04 gain 212 3 -92.67 gain 3 213 -109.11 gain 213 3 -113.07 gain 3 214 -99.65 gain 214 3 -109.00 gain 3 215 -103.55 gain 215 3 -108.30 gain 3 216 -98.92 gain 216 3 -107.59 gain 3 217 -97.51 gain 217 3 -106.44 gain 3 218 -95.64 gain 218 3 -97.37 gain 3 219 -95.62 gain 219 3 -97.84 gain 3 220 -93.52 gain 220 3 -91.83 gain 3 221 -101.99 gain 221 3 -105.97 gain 3 222 -96.15 gain 222 3 -95.94 gain 3 223 -105.89 gain 223 3 -108.92 gain 3 224 -101.60 gain 224 3 -105.09 gain 4 5 -61.94 gain 5 4 -59.83 gain 4 6 -69.56 gain 6 4 -68.85 gain 4 7 -78.17 gain 7 4 -77.56 gain 4 8 -86.72 gain 8 4 -87.96 gain 4 9 -80.95 gain 9 4 -86.59 gain 4 10 -87.41 gain 10 4 -91.45 gain 4 11 -82.77 gain 11 4 -91.00 gain 4 12 -81.35 gain 12 4 -80.69 gain 4 13 -90.19 gain 13 4 -92.92 gain 4 14 -95.50 gain 14 4 -94.46 gain 4 15 -80.59 gain 15 4 -82.32 gain 4 16 -77.51 gain 16 4 -81.37 gain 4 17 -71.33 gain 17 4 -73.08 gain 4 18 -72.97 gain 18 4 -75.80 gain 4 19 -73.21 gain 19 4 -76.79 gain 4 20 -65.83 gain 20 4 -70.61 gain 4 21 -78.00 gain 21 4 -81.89 gain 4 22 -87.54 gain 22 4 -89.90 gain 4 23 -73.48 gain 23 4 -73.00 gain 4 24 -86.23 gain 24 4 -87.37 gain 4 25 -93.20 gain 25 4 -97.02 gain 4 26 -82.41 gain 26 4 -87.66 gain 4 27 -91.51 gain 27 4 -94.37 gain 4 28 -96.78 gain 28 4 -94.97 gain 4 29 -91.53 gain 29 4 -91.27 gain 4 30 -78.59 gain 30 4 -83.33 gain 4 31 -83.32 gain 31 4 -84.62 gain 4 32 -81.01 gain 32 4 -79.66 gain 4 33 -69.02 gain 33 4 -69.12 gain 4 34 -68.80 gain 34 4 -69.53 gain 4 35 -76.21 gain 35 4 -77.89 gain 4 36 -77.91 gain 36 4 -79.73 gain 4 37 -82.44 gain 37 4 -86.80 gain 4 38 -83.64 gain 38 4 -85.54 gain 4 39 -85.76 gain 39 4 -91.98 gain 4 40 -84.60 gain 40 4 -85.79 gain 4 41 -90.33 gain 41 4 -86.88 gain 4 42 -98.18 gain 42 4 -101.97 gain 4 43 -89.90 gain 43 4 -91.29 gain 4 44 -94.66 gain 44 4 -99.64 gain 4 45 -87.22 gain 45 4 -92.18 gain 4 46 -84.60 gain 46 4 -86.03 gain 4 47 -74.35 gain 47 4 -73.47 gain 4 48 -75.68 gain 48 4 -74.38 gain 4 49 -81.94 gain 49 4 -84.70 gain 4 50 -67.66 gain 50 4 -67.28 gain 4 51 -78.52 gain 51 4 -81.84 gain 4 52 -82.58 gain 52 4 -83.13 gain 4 53 -82.46 gain 53 4 -83.56 gain 4 54 -82.26 gain 54 4 -82.78 gain 4 55 -92.95 gain 55 4 -90.38 gain 4 56 -96.75 gain 56 4 -99.23 gain 4 57 -89.63 gain 57 4 -91.19 gain 4 58 -94.45 gain 58 4 -92.71 gain 4 59 -97.98 gain 59 4 -95.49 gain 4 60 -93.44 gain 60 4 -100.23 gain 4 61 -78.57 gain 61 4 -77.26 gain 4 62 -86.74 gain 62 4 -82.94 gain 4 63 -79.37 gain 63 4 -79.54 gain 4 64 -86.47 gain 64 4 -90.86 gain 4 65 -79.96 gain 65 4 -79.90 gain 4 66 -89.42 gain 66 4 -88.34 gain 4 67 -82.96 gain 67 4 -83.11 gain 4 68 -86.07 gain 68 4 -88.81 gain 4 69 -85.09 gain 69 4 -85.05 gain 4 70 -89.38 gain 70 4 -87.81 gain 4 71 -88.85 gain 71 4 -90.84 gain 4 72 -87.53 gain 72 4 -87.08 gain 4 73 -87.85 gain 73 4 -88.77 gain 4 74 -98.03 gain 74 4 -95.06 gain 4 75 -85.17 gain 75 4 -88.09 gain 4 76 -87.73 gain 76 4 -90.77 gain 4 77 -90.70 gain 77 4 -89.75 gain 4 78 -76.25 gain 78 4 -79.80 gain 4 79 -79.07 gain 79 4 -82.23 gain 4 80 -87.22 gain 80 4 -88.18 gain 4 81 -80.56 gain 81 4 -82.42 gain 4 82 -92.55 gain 82 4 -95.40 gain 4 83 -91.60 gain 83 4 -91.71 gain 4 84 -86.36 gain 84 4 -83.67 gain 4 85 -80.39 gain 85 4 -83.12 gain 4 86 -94.09 gain 86 4 -98.46 gain 4 87 -89.41 gain 87 4 -91.06 gain 4 88 -90.88 gain 88 4 -92.18 gain 4 89 -91.45 gain 89 4 -94.90 gain 4 90 -87.99 gain 90 4 -90.77 gain 4 91 -87.05 gain 91 4 -90.90 gain 4 92 -81.34 gain 92 4 -86.11 gain 4 93 -90.64 gain 93 4 -92.77 gain 4 94 -92.62 gain 94 4 -93.31 gain 4 95 -85.63 gain 95 4 -85.56 gain 4 96 -82.12 gain 96 4 -89.03 gain 4 97 -93.85 gain 97 4 -93.58 gain 4 98 -95.76 gain 98 4 -95.96 gain 4 99 -86.80 gain 99 4 -86.13 gain 4 100 -93.13 gain 100 4 -92.39 gain 4 101 -84.96 gain 101 4 -87.84 gain 4 102 -89.49 gain 102 4 -92.34 gain 4 103 -93.18 gain 103 4 -97.20 gain 4 104 -92.42 gain 104 4 -98.92 gain 4 105 -87.05 gain 105 4 -88.07 gain 4 106 -85.96 gain 106 4 -84.31 gain 4 107 -85.66 gain 107 4 -83.91 gain 4 108 -83.20 gain 108 4 -81.08 gain 4 109 -90.00 gain 109 4 -91.33 gain 4 110 -86.47 gain 110 4 -94.15 gain 4 111 -93.15 gain 111 4 -90.81 gain 4 112 -94.97 gain 112 4 -96.09 gain 4 113 -90.56 gain 113 4 -90.80 gain 4 114 -96.33 gain 114 4 -93.75 gain 4 115 -84.87 gain 115 4 -82.94 gain 4 116 -96.77 gain 116 4 -97.27 gain 4 117 -90.97 gain 117 4 -88.62 gain 4 118 -91.09 gain 118 4 -90.36 gain 4 119 -92.97 gain 119 4 -97.29 gain 4 120 -90.68 gain 120 4 -92.39 gain 4 121 -86.98 gain 121 4 -89.71 gain 4 122 -87.18 gain 122 4 -89.66 gain 4 123 -90.98 gain 123 4 -93.80 gain 4 124 -83.85 gain 124 4 -84.67 gain 4 125 -87.04 gain 125 4 -91.19 gain 4 126 -90.76 gain 126 4 -91.56 gain 4 127 -92.92 gain 127 4 -93.34 gain 4 128 -95.27 gain 128 4 -98.28 gain 4 129 -94.80 gain 129 4 -95.03 gain 4 130 -90.50 gain 130 4 -92.02 gain 4 131 -91.01 gain 131 4 -92.30 gain 4 132 -100.45 gain 132 4 -97.75 gain 4 133 -95.24 gain 133 4 -97.72 gain 4 134 -93.58 gain 134 4 -92.92 gain 4 135 -85.40 gain 135 4 -87.05 gain 4 136 -93.01 gain 136 4 -95.09 gain 4 137 -94.73 gain 137 4 -99.73 gain 4 138 -90.47 gain 138 4 -89.00 gain 4 139 -88.86 gain 139 4 -90.65 gain 4 140 -80.34 gain 140 4 -82.96 gain 4 141 -88.08 gain 141 4 -82.67 gain 4 142 -97.26 gain 142 4 -98.59 gain 4 143 -93.76 gain 143 4 -97.83 gain 4 144 -97.83 gain 144 4 -100.27 gain 4 145 -93.80 gain 145 4 -99.63 gain 4 146 -93.94 gain 146 4 -95.76 gain 4 147 -100.23 gain 147 4 -99.16 gain 4 148 -96.47 gain 148 4 -93.72 gain 4 149 -94.79 gain 149 4 -95.70 gain 4 150 -96.80 gain 150 4 -98.54 gain 4 151 -96.29 gain 151 4 -96.98 gain 4 152 -102.26 gain 152 4 -102.76 gain 4 153 -87.19 gain 153 4 -86.91 gain 4 154 -87.94 gain 154 4 -89.56 gain 4 155 -92.60 gain 155 4 -92.79 gain 4 156 -93.30 gain 156 4 -92.72 gain 4 157 -97.50 gain 157 4 -99.40 gain 4 158 -100.64 gain 158 4 -102.04 gain 4 159 -95.55 gain 159 4 -99.34 gain 4 160 -90.88 gain 160 4 -91.82 gain 4 161 -97.11 gain 161 4 -100.49 gain 4 162 -97.46 gain 162 4 -100.55 gain 4 163 -95.64 gain 163 4 -100.65 gain 4 164 -98.64 gain 164 4 -103.02 gain 4 165 -98.53 gain 165 4 -99.96 gain 4 166 -98.69 gain 166 4 -99.88 gain 4 167 -92.94 gain 167 4 -94.85 gain 4 168 -99.10 gain 168 4 -99.90 gain 4 169 -91.35 gain 169 4 -93.27 gain 4 170 -87.54 gain 170 4 -88.69 gain 4 171 -89.42 gain 171 4 -91.65 gain 4 172 -102.50 gain 172 4 -102.92 gain 4 173 -96.85 gain 173 4 -101.92 gain 4 174 -93.90 gain 174 4 -95.02 gain 4 175 -98.97 gain 175 4 -101.22 gain 4 176 -102.38 gain 176 4 -103.60 gain 4 177 -94.44 gain 177 4 -98.66 gain 4 178 -101.56 gain 178 4 -99.23 gain 4 179 -101.63 gain 179 4 -98.71 gain 4 180 -104.74 gain 180 4 -111.27 gain 4 181 -95.65 gain 181 4 -96.21 gain 4 182 -97.81 gain 182 4 -99.45 gain 4 183 -94.34 gain 183 4 -96.26 gain 4 184 -99.88 gain 184 4 -104.55 gain 4 185 -95.71 gain 185 4 -104.24 gain 4 186 -93.75 gain 186 4 -97.86 gain 4 187 -96.59 gain 187 4 -98.43 gain 4 188 -89.94 gain 188 4 -94.20 gain 4 189 -105.33 gain 189 4 -104.31 gain 4 190 -101.32 gain 190 4 -104.22 gain 4 191 -95.05 gain 191 4 -96.65 gain 4 192 -95.86 gain 192 4 -96.15 gain 4 193 -103.24 gain 193 4 -102.52 gain 4 194 -107.56 gain 194 4 -107.62 gain 4 195 -94.54 gain 195 4 -93.15 gain 4 196 -90.23 gain 196 4 -93.15 gain 4 197 -97.91 gain 197 4 -95.97 gain 4 198 -96.33 gain 198 4 -98.90 gain 4 199 -102.85 gain 199 4 -105.53 gain 4 200 -91.59 gain 200 4 -95.60 gain 4 201 -101.87 gain 201 4 -105.79 gain 4 202 -94.73 gain 202 4 -97.79 gain 4 203 -89.72 gain 203 4 -91.89 gain 4 204 -95.24 gain 204 4 -94.05 gain 4 205 -96.40 gain 205 4 -98.95 gain 4 206 -98.41 gain 206 4 -102.07 gain 4 207 -95.04 gain 207 4 -98.12 gain 4 208 -96.25 gain 208 4 -101.93 gain 4 209 -94.39 gain 209 4 -99.64 gain 4 210 -109.37 gain 210 4 -114.80 gain 4 211 -93.33 gain 211 4 -93.99 gain 4 212 -102.59 gain 212 4 -106.26 gain 4 213 -104.48 gain 213 4 -107.48 gain 4 214 -95.17 gain 214 4 -103.56 gain 4 215 -97.71 gain 215 4 -101.49 gain 4 216 -97.85 gain 216 4 -105.55 gain 4 217 -100.98 gain 217 4 -108.94 gain 4 218 -104.69 gain 218 4 -105.45 gain 4 219 -97.26 gain 219 4 -98.51 gain 4 220 -95.51 gain 220 4 -92.85 gain 4 221 -97.45 gain 221 4 -100.46 gain 4 222 -101.03 gain 222 4 -99.85 gain 4 223 -101.32 gain 223 4 -103.39 gain 4 224 -90.26 gain 224 4 -92.79 gain 5 6 -64.26 gain 6 5 -65.65 gain 5 7 -65.82 gain 7 5 -67.32 gain 5 8 -77.72 gain 8 5 -81.06 gain 5 9 -79.57 gain 9 5 -87.32 gain 5 10 -86.51 gain 10 5 -92.66 gain 5 11 -88.43 gain 11 5 -98.77 gain 5 12 -88.98 gain 12 5 -90.43 gain 5 13 -92.84 gain 13 5 -97.67 gain 5 14 -94.10 gain 14 5 -95.17 gain 5 15 -82.23 gain 15 5 -86.06 gain 5 16 -79.84 gain 16 5 -85.80 gain 5 17 -74.98 gain 17 5 -78.84 gain 5 18 -74.48 gain 18 5 -79.43 gain 5 19 -63.34 gain 19 5 -69.02 gain 5 20 -56.75 gain 20 5 -63.63 gain 5 21 -63.08 gain 21 5 -69.07 gain 5 22 -75.38 gain 22 5 -79.84 gain 5 23 -76.83 gain 23 5 -78.46 gain 5 24 -83.92 gain 24 5 -87.16 gain 5 25 -80.25 gain 25 5 -86.17 gain 5 26 -88.28 gain 26 5 -95.63 gain 5 27 -88.33 gain 27 5 -93.30 gain 5 28 -86.92 gain 28 5 -87.21 gain 5 29 -95.22 gain 29 5 -97.06 gain 5 30 -87.59 gain 30 5 -94.44 gain 5 31 -81.28 gain 31 5 -84.69 gain 5 32 -81.15 gain 32 5 -81.91 gain 5 33 -74.39 gain 33 5 -76.59 gain 5 34 -74.87 gain 34 5 -77.71 gain 5 35 -72.51 gain 35 5 -76.30 gain 5 36 -73.50 gain 36 5 -77.43 gain 5 37 -69.75 gain 37 5 -76.22 gain 5 38 -77.56 gain 38 5 -81.56 gain 5 39 -83.53 gain 39 5 -91.86 gain 5 40 -86.13 gain 40 5 -89.44 gain 5 41 -86.74 gain 41 5 -85.39 gain 5 42 -96.05 gain 42 5 -101.95 gain 5 43 -85.34 gain 43 5 -88.83 gain 5 44 -89.77 gain 44 5 -96.85 gain 5 45 -84.58 gain 45 5 -91.65 gain 5 46 -84.45 gain 46 5 -87.98 gain 5 47 -86.88 gain 47 5 -88.11 gain 5 48 -78.24 gain 48 5 -79.05 gain 5 49 -76.31 gain 49 5 -81.18 gain 5 50 -73.52 gain 50 5 -75.24 gain 5 51 -68.33 gain 51 5 -73.75 gain 5 52 -78.74 gain 52 5 -81.40 gain 5 53 -81.21 gain 53 5 -84.42 gain 5 54 -84.20 gain 54 5 -86.82 gain 5 55 -77.83 gain 55 5 -77.36 gain 5 56 -76.99 gain 56 5 -81.58 gain 5 57 -97.62 gain 57 5 -101.29 gain 5 58 -91.69 gain 58 5 -92.05 gain 5 59 -97.74 gain 59 5 -97.36 gain 5 60 -87.79 gain 60 5 -96.68 gain 5 61 -88.87 gain 61 5 -89.67 gain 5 62 -77.11 gain 62 5 -75.41 gain 5 63 -82.31 gain 63 5 -84.59 gain 5 64 -78.77 gain 64 5 -85.27 gain 5 65 -80.19 gain 65 5 -82.24 gain 5 66 -82.32 gain 66 5 -83.35 gain 5 67 -86.06 gain 67 5 -88.31 gain 5 68 -79.27 gain 68 5 -84.12 gain 5 69 -82.56 gain 69 5 -84.63 gain 5 70 -88.59 gain 70 5 -89.12 gain 5 71 -88.94 gain 71 5 -93.04 gain 5 72 -94.58 gain 72 5 -96.24 gain 5 73 -88.67 gain 73 5 -91.70 gain 5 74 -92.34 gain 74 5 -91.48 gain 5 75 -84.36 gain 75 5 -89.39 gain 5 76 -90.86 gain 76 5 -96.01 gain 5 77 -82.63 gain 77 5 -83.78 gain 5 78 -85.60 gain 78 5 -91.25 gain 5 79 -80.81 gain 79 5 -86.08 gain 5 80 -83.32 gain 80 5 -86.38 gain 5 81 -83.93 gain 81 5 -87.91 gain 5 82 -83.85 gain 82 5 -88.80 gain 5 83 -85.51 gain 83 5 -87.73 gain 5 84 -83.14 gain 84 5 -82.55 gain 5 85 -81.45 gain 85 5 -86.29 gain 5 86 -97.90 gain 86 5 -104.38 gain 5 87 -85.72 gain 87 5 -89.48 gain 5 88 -83.10 gain 88 5 -86.50 gain 5 89 -94.71 gain 89 5 -100.26 gain 5 90 -91.99 gain 90 5 -96.88 gain 5 91 -79.43 gain 91 5 -85.38 gain 5 92 -89.51 gain 92 5 -96.39 gain 5 93 -85.24 gain 93 5 -89.48 gain 5 94 -81.41 gain 94 5 -84.21 gain 5 95 -83.02 gain 95 5 -85.07 gain 5 96 -83.87 gain 96 5 -92.89 gain 5 97 -89.35 gain 97 5 -91.18 gain 5 98 -92.07 gain 98 5 -94.37 gain 5 99 -87.74 gain 99 5 -89.19 gain 5 100 -94.04 gain 100 5 -95.40 gain 5 101 -90.12 gain 101 5 -95.11 gain 5 102 -84.73 gain 102 5 -89.68 gain 5 103 -85.16 gain 103 5 -91.28 gain 5 104 -91.50 gain 104 5 -100.11 gain 5 105 -96.28 gain 105 5 -99.41 gain 5 106 -89.06 gain 106 5 -89.52 gain 5 107 -76.32 gain 107 5 -76.68 gain 5 108 -86.67 gain 108 5 -86.65 gain 5 109 -87.85 gain 109 5 -91.29 gain 5 110 -84.42 gain 110 5 -94.21 gain 5 111 -83.61 gain 111 5 -83.37 gain 5 112 -83.46 gain 112 5 -86.69 gain 5 113 -89.24 gain 113 5 -91.59 gain 5 114 -92.00 gain 114 5 -91.52 gain 5 115 -89.57 gain 115 5 -89.75 gain 5 116 -88.24 gain 116 5 -90.85 gain 5 117 -90.67 gain 117 5 -90.42 gain 5 118 -85.87 gain 118 5 -87.24 gain 5 119 -93.47 gain 119 5 -99.90 gain 5 120 -89.63 gain 120 5 -93.45 gain 5 121 -93.58 gain 121 5 -98.42 gain 5 122 -88.37 gain 122 5 -92.96 gain 5 123 -89.32 gain 123 5 -94.25 gain 5 124 -88.84 gain 124 5 -91.76 gain 5 125 -91.19 gain 125 5 -97.45 gain 5 126 -89.13 gain 126 5 -92.03 gain 5 127 -88.88 gain 127 5 -91.41 gain 5 128 -83.30 gain 128 5 -88.43 gain 5 129 -88.27 gain 129 5 -90.61 gain 5 130 -92.09 gain 130 5 -95.72 gain 5 131 -93.72 gain 131 5 -97.12 gain 5 132 -94.08 gain 132 5 -93.49 gain 5 133 -93.56 gain 133 5 -98.15 gain 5 134 -93.57 gain 134 5 -95.02 gain 5 135 -90.37 gain 135 5 -94.12 gain 5 136 -84.69 gain 136 5 -88.89 gain 5 137 -94.43 gain 137 5 -101.53 gain 5 138 -88.13 gain 138 5 -88.76 gain 5 139 -88.55 gain 139 5 -92.45 gain 5 140 -92.02 gain 140 5 -96.75 gain 5 141 -88.95 gain 141 5 -85.65 gain 5 142 -97.73 gain 142 5 -101.18 gain 5 143 -91.39 gain 143 5 -97.57 gain 5 144 -89.78 gain 144 5 -94.33 gain 5 145 -96.24 gain 145 5 -104.17 gain 5 146 -96.57 gain 146 5 -100.49 gain 5 147 -89.76 gain 147 5 -90.79 gain 5 148 -92.29 gain 148 5 -91.65 gain 5 149 -96.57 gain 149 5 -99.59 gain 5 150 -92.48 gain 150 5 -96.33 gain 5 151 -86.68 gain 151 5 -89.48 gain 5 152 -86.37 gain 152 5 -88.98 gain 5 153 -84.18 gain 153 5 -86.00 gain 5 154 -90.72 gain 154 5 -94.45 gain 5 155 -92.43 gain 155 5 -94.73 gain 5 156 -101.02 gain 156 5 -102.55 gain 5 157 -93.60 gain 157 5 -97.61 gain 5 158 -85.44 gain 158 5 -88.95 gain 5 159 -92.50 gain 159 5 -98.40 gain 5 160 -93.48 gain 160 5 -96.53 gain 5 161 -93.32 gain 161 5 -98.80 gain 5 162 -92.01 gain 162 5 -97.21 gain 5 163 -92.19 gain 163 5 -99.31 gain 5 164 -92.78 gain 164 5 -99.26 gain 5 165 -93.94 gain 165 5 -97.47 gain 5 166 -90.69 gain 166 5 -93.98 gain 5 167 -90.19 gain 167 5 -94.20 gain 5 168 -99.75 gain 168 5 -102.66 gain 5 169 -93.09 gain 169 5 -97.11 gain 5 170 -92.90 gain 170 5 -96.16 gain 5 171 -94.28 gain 171 5 -98.62 gain 5 172 -93.50 gain 172 5 -96.03 gain 5 173 -93.39 gain 173 5 -100.57 gain 5 174 -91.54 gain 174 5 -94.76 gain 5 175 -91.70 gain 175 5 -96.06 gain 5 176 -89.07 gain 176 5 -92.40 gain 5 177 -92.55 gain 177 5 -98.88 gain 5 178 -89.65 gain 178 5 -89.42 gain 5 179 -100.01 gain 179 5 -99.20 gain 5 180 -92.98 gain 180 5 -101.62 gain 5 181 -98.96 gain 181 5 -101.62 gain 5 182 -103.32 gain 182 5 -107.06 gain 5 183 -97.73 gain 183 5 -101.76 gain 5 184 -98.18 gain 184 5 -104.95 gain 5 185 -93.99 gain 185 5 -104.62 gain 5 186 -90.40 gain 186 5 -96.62 gain 5 187 -91.45 gain 187 5 -95.39 gain 5 188 -94.50 gain 188 5 -100.86 gain 5 189 -93.18 gain 189 5 -94.26 gain 5 190 -97.47 gain 190 5 -102.47 gain 5 191 -93.27 gain 191 5 -96.97 gain 5 192 -93.12 gain 192 5 -95.53 gain 5 193 -91.20 gain 193 5 -92.59 gain 5 194 -95.73 gain 194 5 -97.90 gain 5 195 -88.61 gain 195 5 -89.33 gain 5 196 -96.71 gain 196 5 -101.74 gain 5 197 -93.03 gain 197 5 -93.19 gain 5 198 -93.98 gain 198 5 -98.65 gain 5 199 -95.11 gain 199 5 -99.89 gain 5 200 -98.45 gain 200 5 -104.56 gain 5 201 -92.34 gain 201 5 -98.36 gain 5 202 -102.51 gain 202 5 -107.67 gain 5 203 -96.69 gain 203 5 -100.96 gain 5 204 -99.08 gain 204 5 -99.99 gain 5 205 -90.48 gain 205 5 -95.14 gain 5 206 -100.24 gain 206 5 -106.00 gain 5 207 -98.27 gain 207 5 -103.46 gain 5 208 -92.62 gain 208 5 -100.40 gain 5 209 -96.62 gain 209 5 -103.98 gain 5 210 -93.56 gain 210 5 -101.09 gain 5 211 -90.33 gain 211 5 -93.09 gain 5 212 -102.69 gain 212 5 -108.47 gain 5 213 -99.65 gain 213 5 -104.76 gain 5 214 -101.41 gain 214 5 -111.90 gain 5 215 -97.63 gain 215 5 -103.52 gain 5 216 -92.88 gain 216 5 -102.68 gain 5 217 -97.38 gain 217 5 -107.45 gain 5 218 -98.88 gain 218 5 -101.75 gain 5 219 -98.06 gain 219 5 -101.41 gain 5 220 -107.00 gain 220 5 -106.44 gain 5 221 -93.52 gain 221 5 -98.64 gain 5 222 -94.12 gain 222 5 -95.05 gain 5 223 -98.19 gain 223 5 -102.35 gain 5 224 -100.26 gain 224 5 -104.90 gain 6 7 -63.86 gain 7 6 -63.96 gain 6 8 -70.51 gain 8 6 -72.46 gain 6 9 -79.58 gain 9 6 -85.93 gain 6 10 -77.10 gain 10 6 -81.85 gain 6 11 -86.87 gain 11 6 -95.81 gain 6 12 -88.98 gain 12 6 -89.04 gain 6 13 -93.23 gain 13 6 -96.67 gain 6 14 -90.41 gain 14 6 -90.09 gain 6 15 -79.42 gain 15 6 -81.86 gain 6 16 -76.68 gain 16 6 -81.25 gain 6 17 -83.29 gain 17 6 -85.76 gain 6 18 -71.53 gain 18 6 -75.07 gain 6 19 -70.71 gain 19 6 -75.00 gain 6 20 -69.54 gain 20 6 -75.04 gain 6 21 -62.84 gain 21 6 -67.44 gain 6 22 -68.87 gain 22 6 -71.93 gain 6 23 -69.01 gain 23 6 -69.24 gain 6 24 -75.55 gain 24 6 -77.40 gain 6 25 -78.04 gain 25 6 -82.58 gain 6 26 -79.52 gain 26 6 -85.48 gain 6 27 -80.62 gain 27 6 -84.19 gain 6 28 -88.87 gain 28 6 -87.76 gain 6 29 -89.43 gain 29 6 -89.87 gain 6 30 -87.30 gain 30 6 -92.75 gain 6 31 -87.35 gain 31 6 -89.36 gain 6 32 -81.95 gain 32 6 -81.32 gain 6 33 -79.97 gain 33 6 -80.78 gain 6 34 -78.55 gain 34 6 -79.99 gain 6 35 -65.42 gain 35 6 -67.81 gain 6 36 -74.53 gain 36 6 -77.07 gain 6 37 -68.79 gain 37 6 -73.87 gain 6 38 -78.99 gain 38 6 -81.60 gain 6 39 -85.63 gain 39 6 -92.56 gain 6 40 -86.10 gain 40 6 -88.01 gain 6 41 -89.74 gain 41 6 -86.99 gain 6 42 -94.15 gain 42 6 -98.65 gain 6 43 -88.85 gain 43 6 -90.95 gain 6 44 -96.14 gain 44 6 -101.83 gain 6 45 -92.73 gain 45 6 -98.40 gain 6 46 -86.84 gain 46 6 -88.97 gain 6 47 -73.11 gain 47 6 -72.95 gain 6 48 -78.44 gain 48 6 -77.86 gain 6 49 -80.68 gain 49 6 -84.15 gain 6 50 -79.65 gain 50 6 -79.98 gain 6 51 -74.13 gain 51 6 -78.16 gain 6 52 -77.83 gain 52 6 -79.10 gain 6 53 -72.74 gain 53 6 -74.56 gain 6 54 -80.54 gain 54 6 -81.77 gain 6 55 -89.26 gain 55 6 -87.40 gain 6 56 -89.32 gain 56 6 -92.51 gain 6 57 -86.68 gain 57 6 -88.95 gain 6 58 -95.39 gain 58 6 -94.35 gain 6 59 -92.03 gain 59 6 -90.25 gain 6 60 -85.56 gain 60 6 -93.06 gain 6 61 -90.91 gain 61 6 -90.31 gain 6 62 -81.28 gain 62 6 -78.20 gain 6 63 -90.99 gain 63 6 -91.87 gain 6 64 -86.02 gain 64 6 -91.12 gain 6 65 -78.58 gain 65 6 -79.24 gain 6 66 -85.62 gain 66 6 -85.26 gain 6 67 -84.44 gain 67 6 -85.30 gain 6 68 -85.52 gain 68 6 -88.98 gain 6 69 -79.90 gain 69 6 -80.56 gain 6 70 -86.08 gain 70 6 -85.21 gain 6 71 -90.74 gain 71 6 -93.44 gain 6 72 -90.26 gain 72 6 -90.52 gain 6 73 -90.63 gain 73 6 -92.26 gain 6 74 -94.42 gain 74 6 -92.16 gain 6 75 -87.47 gain 75 6 -91.10 gain 6 76 -85.15 gain 76 6 -88.91 gain 6 77 -86.87 gain 77 6 -86.63 gain 6 78 -82.89 gain 78 6 -87.15 gain 6 79 -83.67 gain 79 6 -87.55 gain 6 80 -83.41 gain 80 6 -85.08 gain 6 81 -81.37 gain 81 6 -83.94 gain 6 82 -92.84 gain 82 6 -96.39 gain 6 83 -84.02 gain 83 6 -84.85 gain 6 84 -88.28 gain 84 6 -86.29 gain 6 85 -88.47 gain 85 6 -91.91 gain 6 86 -90.52 gain 86 6 -95.60 gain 6 87 -88.40 gain 87 6 -90.77 gain 6 88 -91.01 gain 88 6 -93.02 gain 6 89 -94.82 gain 89 6 -98.97 gain 6 90 -88.70 gain 90 6 -92.19 gain 6 91 -87.20 gain 91 6 -91.76 gain 6 92 -83.60 gain 92 6 -89.08 gain 6 93 -83.20 gain 93 6 -86.04 gain 6 94 -78.88 gain 94 6 -80.29 gain 6 95 -90.87 gain 95 6 -91.52 gain 6 96 -84.75 gain 96 6 -92.37 gain 6 97 -87.80 gain 97 6 -88.24 gain 6 98 -91.05 gain 98 6 -91.96 gain 6 99 -89.63 gain 99 6 -89.68 gain 6 100 -90.56 gain 100 6 -90.53 gain 6 101 -86.78 gain 101 6 -90.38 gain 6 102 -90.14 gain 102 6 -93.70 gain 6 103 -92.33 gain 103 6 -97.06 gain 6 104 -90.48 gain 104 6 -97.69 gain 6 105 -92.73 gain 105 6 -94.47 gain 6 106 -93.88 gain 106 6 -92.95 gain 6 107 -93.64 gain 107 6 -92.61 gain 6 108 -87.52 gain 108 6 -86.11 gain 6 109 -89.54 gain 109 6 -91.57 gain 6 110 -86.53 gain 110 6 -94.93 gain 6 111 -88.83 gain 111 6 -87.20 gain 6 112 -93.19 gain 112 6 -95.02 gain 6 113 -88.28 gain 113 6 -89.24 gain 6 114 -90.74 gain 114 6 -88.87 gain 6 115 -92.87 gain 115 6 -91.65 gain 6 116 -90.16 gain 116 6 -91.38 gain 6 117 -87.01 gain 117 6 -85.37 gain 6 118 -88.25 gain 118 6 -88.23 gain 6 119 -88.07 gain 119 6 -93.11 gain 6 120 -96.05 gain 120 6 -98.47 gain 6 121 -89.97 gain 121 6 -93.41 gain 6 122 -96.25 gain 122 6 -99.44 gain 6 123 -87.89 gain 123 6 -91.42 gain 6 124 -87.96 gain 124 6 -89.48 gain 6 125 -94.47 gain 125 6 -99.33 gain 6 126 -85.50 gain 126 6 -87.01 gain 6 127 -94.52 gain 127 6 -95.65 gain 6 128 -87.04 gain 128 6 -90.77 gain 6 129 -88.79 gain 129 6 -89.73 gain 6 130 -89.70 gain 130 6 -91.93 gain 6 131 -92.81 gain 131 6 -94.82 gain 6 132 -100.42 gain 132 6 -98.44 gain 6 133 -94.28 gain 133 6 -97.47 gain 6 134 -83.37 gain 134 6 -83.42 gain 6 135 -96.58 gain 135 6 -98.94 gain 6 136 -88.67 gain 136 6 -91.47 gain 6 137 -97.06 gain 137 6 -102.77 gain 6 138 -88.30 gain 138 6 -87.54 gain 6 139 -90.09 gain 139 6 -92.59 gain 6 140 -93.80 gain 140 6 -97.13 gain 6 141 -92.22 gain 141 6 -87.53 gain 6 142 -91.18 gain 142 6 -93.23 gain 6 143 -90.64 gain 143 6 -95.42 gain 6 144 -92.08 gain 144 6 -95.23 gain 6 145 -96.05 gain 145 6 -102.59 gain 6 146 -97.59 gain 146 6 -100.11 gain 6 147 -95.99 gain 147 6 -95.63 gain 6 148 -90.78 gain 148 6 -88.74 gain 6 149 -88.08 gain 149 6 -89.70 gain 6 150 -106.79 gain 150 6 -109.25 gain 6 151 -89.86 gain 151 6 -91.26 gain 6 152 -89.66 gain 152 6 -90.88 gain 6 153 -92.34 gain 153 6 -92.77 gain 6 154 -89.29 gain 154 6 -91.62 gain 6 155 -93.73 gain 155 6 -94.63 gain 6 156 -93.40 gain 156 6 -93.54 gain 6 157 -97.80 gain 157 6 -100.42 gain 6 158 -91.64 gain 158 6 -93.76 gain 6 159 -92.69 gain 159 6 -97.19 gain 6 160 -96.29 gain 160 6 -97.95 gain 6 161 -91.58 gain 161 6 -95.67 gain 6 162 -91.88 gain 162 6 -95.69 gain 6 163 -95.67 gain 163 6 -101.39 gain 6 164 -101.77 gain 164 6 -106.86 gain 6 165 -92.46 gain 165 6 -94.61 gain 6 166 -96.68 gain 166 6 -98.58 gain 6 167 -91.73 gain 167 6 -94.35 gain 6 168 -89.97 gain 168 6 -91.48 gain 6 169 -94.62 gain 169 6 -97.25 gain 6 170 -99.21 gain 170 6 -101.08 gain 6 171 -82.75 gain 171 6 -85.69 gain 6 172 -92.03 gain 172 6 -93.16 gain 6 173 -98.59 gain 173 6 -104.37 gain 6 174 -91.69 gain 174 6 -93.52 gain 6 175 -89.50 gain 175 6 -92.46 gain 6 176 -94.80 gain 176 6 -96.73 gain 6 177 -98.64 gain 177 6 -103.58 gain 6 178 -95.47 gain 178 6 -93.85 gain 6 179 -96.91 gain 179 6 -94.70 gain 6 180 -98.17 gain 180 6 -105.42 gain 6 181 -92.59 gain 181 6 -93.86 gain 6 182 -97.82 gain 182 6 -100.17 gain 6 183 -94.56 gain 183 6 -97.19 gain 6 184 -100.29 gain 184 6 -105.66 gain 6 185 -97.52 gain 185 6 -106.76 gain 6 186 -101.02 gain 186 6 -105.84 gain 6 187 -92.72 gain 187 6 -95.27 gain 6 188 -94.07 gain 188 6 -99.03 gain 6 189 -97.80 gain 189 6 -97.49 gain 6 190 -101.35 gain 190 6 -104.95 gain 6 191 -101.62 gain 191 6 -103.93 gain 6 192 -103.00 gain 192 6 -104.01 gain 6 193 -104.51 gain 193 6 -104.50 gain 6 194 -95.10 gain 194 6 -95.87 gain 6 195 -99.05 gain 195 6 -98.37 gain 6 196 -96.04 gain 196 6 -99.68 gain 6 197 -94.80 gain 197 6 -93.57 gain 6 198 -99.14 gain 198 6 -102.42 gain 6 199 -94.17 gain 199 6 -97.56 gain 6 200 -98.45 gain 200 6 -103.17 gain 6 201 -98.96 gain 201 6 -103.59 gain 6 202 -87.62 gain 202 6 -91.39 gain 6 203 -95.93 gain 203 6 -98.81 gain 6 204 -96.46 gain 204 6 -95.98 gain 6 205 -94.64 gain 205 6 -97.90 gain 6 206 -89.58 gain 206 6 -93.95 gain 6 207 -102.49 gain 207 6 -106.29 gain 6 208 -94.28 gain 208 6 -100.67 gain 6 209 -99.24 gain 209 6 -105.21 gain 6 210 -97.84 gain 210 6 -103.98 gain 6 211 -92.65 gain 211 6 -94.02 gain 6 212 -98.41 gain 212 6 -102.80 gain 6 213 -106.39 gain 213 6 -110.10 gain 6 214 -95.04 gain 214 6 -104.14 gain 6 215 -98.05 gain 215 6 -102.55 gain 6 216 -96.47 gain 216 6 -104.88 gain 6 217 -95.10 gain 217 6 -103.77 gain 6 218 -83.58 gain 218 6 -85.06 gain 6 219 -102.00 gain 219 6 -103.96 gain 6 220 -100.58 gain 220 6 -98.63 gain 6 221 -100.77 gain 221 6 -104.50 gain 6 222 -95.62 gain 222 6 -95.16 gain 6 223 -98.14 gain 223 6 -100.91 gain 6 224 -101.04 gain 224 6 -104.28 gain 7 8 -66.01 gain 8 7 -67.86 gain 7 9 -75.45 gain 9 7 -81.71 gain 7 10 -79.81 gain 10 7 -84.46 gain 7 11 -81.18 gain 11 7 -90.02 gain 7 12 -82.26 gain 12 7 -82.21 gain 7 13 -80.82 gain 13 7 -84.16 gain 7 14 -91.71 gain 14 7 -91.28 gain 7 15 -88.94 gain 15 7 -91.28 gain 7 16 -86.26 gain 16 7 -90.73 gain 7 17 -83.32 gain 17 7 -85.68 gain 7 18 -69.79 gain 18 7 -73.24 gain 7 19 -75.69 gain 19 7 -79.87 gain 7 20 -75.90 gain 20 7 -81.29 gain 7 21 -59.29 gain 21 7 -63.79 gain 7 22 -63.38 gain 22 7 -66.34 gain 7 23 -60.53 gain 23 7 -60.67 gain 7 24 -77.16 gain 24 7 -78.91 gain 7 25 -79.99 gain 25 7 -84.42 gain 7 26 -84.12 gain 26 7 -89.98 gain 7 27 -80.48 gain 27 7 -83.95 gain 7 28 -75.60 gain 28 7 -74.40 gain 7 29 -95.10 gain 29 7 -95.44 gain 7 30 -89.32 gain 30 7 -94.67 gain 7 31 -97.48 gain 31 7 -99.39 gain 7 32 -81.40 gain 32 7 -80.66 gain 7 33 -80.18 gain 33 7 -80.89 gain 7 34 -90.60 gain 34 7 -91.94 gain 7 35 -80.02 gain 35 7 -82.31 gain 7 36 -77.10 gain 36 7 -79.54 gain 7 37 -73.73 gain 37 7 -78.71 gain 7 38 -76.04 gain 38 7 -78.55 gain 7 39 -83.28 gain 39 7 -90.11 gain 7 40 -87.23 gain 40 7 -89.04 gain 7 41 -85.26 gain 41 7 -82.41 gain 7 42 -80.32 gain 42 7 -84.72 gain 7 43 -88.32 gain 43 7 -90.32 gain 7 44 -88.27 gain 44 7 -93.85 gain 7 45 -91.34 gain 45 7 -96.91 gain 7 46 -88.13 gain 46 7 -90.17 gain 7 47 -81.86 gain 47 7 -81.60 gain 7 48 -82.61 gain 48 7 -81.92 gain 7 49 -81.90 gain 49 7 -85.27 gain 7 50 -78.55 gain 50 7 -78.78 gain 7 51 -76.00 gain 51 7 -79.92 gain 7 52 -77.72 gain 52 7 -78.88 gain 7 53 -71.25 gain 53 7 -72.97 gain 7 54 -83.97 gain 54 7 -85.10 gain 7 55 -78.54 gain 55 7 -76.58 gain 7 56 -84.01 gain 56 7 -87.10 gain 7 57 -83.14 gain 57 7 -85.31 gain 7 58 -94.57 gain 58 7 -93.43 gain 7 59 -82.31 gain 59 7 -80.43 gain 7 60 -95.30 gain 60 7 -102.70 gain 7 61 -87.50 gain 61 7 -86.81 gain 7 62 -81.91 gain 62 7 -78.72 gain 7 63 -85.70 gain 63 7 -86.48 gain 7 64 -81.62 gain 64 7 -86.62 gain 7 65 -82.35 gain 65 7 -82.90 gain 7 66 -77.49 gain 66 7 -77.02 gain 7 67 -76.30 gain 67 7 -77.06 gain 7 68 -79.07 gain 68 7 -82.42 gain 7 69 -82.61 gain 69 7 -83.17 gain 7 70 -82.05 gain 70 7 -81.09 gain 7 71 -77.62 gain 71 7 -80.22 gain 7 72 -84.17 gain 72 7 -84.33 gain 7 73 -83.24 gain 73 7 -84.77 gain 7 74 -88.48 gain 74 7 -86.12 gain 7 75 -89.99 gain 75 7 -93.52 gain 7 76 -89.18 gain 76 7 -92.83 gain 7 77 -81.35 gain 77 7 -81.01 gain 7 78 -82.32 gain 78 7 -86.48 gain 7 79 -89.19 gain 79 7 -92.97 gain 7 80 -82.67 gain 80 7 -84.24 gain 7 81 -80.10 gain 81 7 -82.57 gain 7 82 -86.62 gain 82 7 -90.08 gain 7 83 -91.60 gain 83 7 -92.33 gain 7 84 -77.17 gain 84 7 -75.09 gain 7 85 -87.65 gain 85 7 -90.99 gain 7 86 -92.69 gain 86 7 -97.67 gain 7 87 -89.58 gain 87 7 -91.85 gain 7 88 -88.62 gain 88 7 -90.53 gain 7 89 -84.87 gain 89 7 -88.93 gain 7 90 -87.90 gain 90 7 -91.30 gain 7 91 -90.49 gain 91 7 -94.95 gain 7 92 -94.24 gain 92 7 -99.62 gain 7 93 -88.29 gain 93 7 -91.03 gain 7 94 -75.86 gain 94 7 -77.17 gain 7 95 -92.99 gain 95 7 -93.53 gain 7 96 -87.29 gain 96 7 -94.81 gain 7 97 -84.07 gain 97 7 -84.41 gain 7 98 -91.31 gain 98 7 -92.12 gain 7 99 -96.04 gain 99 7 -95.99 gain 7 100 -84.41 gain 100 7 -84.27 gain 7 101 -87.55 gain 101 7 -91.05 gain 7 102 -79.81 gain 102 7 -83.27 gain 7 103 -94.31 gain 103 7 -98.94 gain 7 104 -90.45 gain 104 7 -97.56 gain 7 105 -95.46 gain 105 7 -97.10 gain 7 106 -98.31 gain 106 7 -97.27 gain 7 107 -89.61 gain 107 7 -88.48 gain 7 108 -85.45 gain 108 7 -83.94 gain 7 109 -95.86 gain 109 7 -97.79 gain 7 110 -89.53 gain 110 7 -97.83 gain 7 111 -90.26 gain 111 7 -88.52 gain 7 112 -86.68 gain 112 7 -88.41 gain 7 113 -87.02 gain 113 7 -87.88 gain 7 114 -94.72 gain 114 7 -92.75 gain 7 115 -85.02 gain 115 7 -83.70 gain 7 116 -90.42 gain 116 7 -91.53 gain 7 117 -97.25 gain 117 7 -95.51 gain 7 118 -91.47 gain 118 7 -91.35 gain 7 119 -101.34 gain 119 7 -106.28 gain 7 120 -93.16 gain 120 7 -95.48 gain 7 121 -90.48 gain 121 7 -93.82 gain 7 122 -98.08 gain 122 7 -101.17 gain 7 123 -93.58 gain 123 7 -97.01 gain 7 124 -89.81 gain 124 7 -91.24 gain 7 125 -92.17 gain 125 7 -96.93 gain 7 126 -88.41 gain 126 7 -89.82 gain 7 127 -95.02 gain 127 7 -96.05 gain 7 128 -89.76 gain 128 7 -93.39 gain 7 129 -88.62 gain 129 7 -89.46 gain 7 130 -96.46 gain 130 7 -98.59 gain 7 131 -92.73 gain 131 7 -94.63 gain 7 132 -92.53 gain 132 7 -90.44 gain 7 133 -89.86 gain 133 7 -92.95 gain 7 134 -96.54 gain 134 7 -96.50 gain 7 135 -101.93 gain 135 7 -104.19 gain 7 136 -96.04 gain 136 7 -98.73 gain 7 137 -91.21 gain 137 7 -96.82 gain 7 138 -88.46 gain 138 7 -87.60 gain 7 139 -98.29 gain 139 7 -100.69 gain 7 140 -94.54 gain 140 7 -97.77 gain 7 141 -94.33 gain 141 7 -89.54 gain 7 142 -97.95 gain 142 7 -99.90 gain 7 143 -88.96 gain 143 7 -93.65 gain 7 144 -88.55 gain 144 7 -91.60 gain 7 145 -96.01 gain 145 7 -102.45 gain 7 146 -85.09 gain 146 7 -87.52 gain 7 147 -100.43 gain 147 7 -99.96 gain 7 148 -103.92 gain 148 7 -101.79 gain 7 149 -96.73 gain 149 7 -98.25 gain 7 150 -88.46 gain 150 7 -90.82 gain 7 151 -90.17 gain 151 7 -91.47 gain 7 152 -89.76 gain 152 7 -90.87 gain 7 153 -91.27 gain 153 7 -91.60 gain 7 154 -86.31 gain 154 7 -88.54 gain 7 155 -98.56 gain 155 7 -99.36 gain 7 156 -92.64 gain 156 7 -92.67 gain 7 157 -94.98 gain 157 7 -97.49 gain 7 158 -95.24 gain 158 7 -97.25 gain 7 159 -89.73 gain 159 7 -94.13 gain 7 160 -90.87 gain 160 7 -92.42 gain 7 161 -93.02 gain 161 7 -97.02 gain 7 162 -95.29 gain 162 7 -98.99 gain 7 163 -92.54 gain 163 7 -98.16 gain 7 164 -91.22 gain 164 7 -96.20 gain 7 165 -100.19 gain 165 7 -102.23 gain 7 166 -95.93 gain 166 7 -97.73 gain 7 167 -94.83 gain 167 7 -97.34 gain 7 168 -97.79 gain 168 7 -99.20 gain 7 169 -97.38 gain 169 7 -99.91 gain 7 170 -93.64 gain 170 7 -95.40 gain 7 171 -96.71 gain 171 7 -99.55 gain 7 172 -91.71 gain 172 7 -92.74 gain 7 173 -91.09 gain 173 7 -96.77 gain 7 174 -90.96 gain 174 7 -92.69 gain 7 175 -98.01 gain 175 7 -100.87 gain 7 176 -97.52 gain 176 7 -99.35 gain 7 177 -95.69 gain 177 7 -100.52 gain 7 178 -92.16 gain 178 7 -90.43 gain 7 179 -92.58 gain 179 7 -90.28 gain 7 180 -98.39 gain 180 7 -105.54 gain 7 181 -91.91 gain 181 7 -93.07 gain 7 182 -101.67 gain 182 7 -103.92 gain 7 183 -89.56 gain 183 7 -92.08 gain 7 184 -100.50 gain 184 7 -105.77 gain 7 185 -97.47 gain 185 7 -106.61 gain 7 186 -91.74 gain 186 7 -96.46 gain 7 187 -97.59 gain 187 7 -100.04 gain 7 188 -102.37 gain 188 7 -107.23 gain 7 189 -96.39 gain 189 7 -95.98 gain 7 190 -93.20 gain 190 7 -96.70 gain 7 191 -91.44 gain 191 7 -93.65 gain 7 192 -91.73 gain 192 7 -92.63 gain 7 193 -91.07 gain 193 7 -90.96 gain 7 194 -98.86 gain 194 7 -99.54 gain 7 195 -90.88 gain 195 7 -90.10 gain 7 196 -96.48 gain 196 7 -100.01 gain 7 197 -99.44 gain 197 7 -98.11 gain 7 198 -98.31 gain 198 7 -101.48 gain 7 199 -96.92 gain 199 7 -100.21 gain 7 200 -94.56 gain 200 7 -99.18 gain 7 201 -101.66 gain 201 7 -106.19 gain 7 202 -91.21 gain 202 7 -94.88 gain 7 203 -96.56 gain 203 7 -99.34 gain 7 204 -100.25 gain 204 7 -99.67 gain 7 205 -92.18 gain 205 7 -95.35 gain 7 206 -97.28 gain 206 7 -101.55 gain 7 207 -91.89 gain 207 7 -95.58 gain 7 208 -93.16 gain 208 7 -99.45 gain 7 209 -100.08 gain 209 7 -105.94 gain 7 210 -92.63 gain 210 7 -98.67 gain 7 211 -96.59 gain 211 7 -97.86 gain 7 212 -94.76 gain 212 7 -99.04 gain 7 213 -94.03 gain 213 7 -97.64 gain 7 214 -102.76 gain 214 7 -111.76 gain 7 215 -98.45 gain 215 7 -102.85 gain 7 216 -100.12 gain 216 7 -108.42 gain 7 217 -98.09 gain 217 7 -106.66 gain 7 218 -98.80 gain 218 7 -100.18 gain 7 219 -99.51 gain 219 7 -101.37 gain 7 220 -100.33 gain 220 7 -98.27 gain 7 221 -94.30 gain 221 7 -97.92 gain 7 222 -96.57 gain 222 7 -96.00 gain 7 223 -94.99 gain 223 7 -97.66 gain 7 224 -101.39 gain 224 7 -104.53 gain 8 9 -67.95 gain 9 8 -72.35 gain 8 10 -76.49 gain 10 8 -79.30 gain 8 11 -75.97 gain 11 8 -82.96 gain 8 12 -89.25 gain 12 8 -87.36 gain 8 13 -89.97 gain 13 8 -91.46 gain 8 14 -86.69 gain 14 8 -84.42 gain 8 15 -92.27 gain 15 8 -92.77 gain 8 16 -93.69 gain 16 8 -96.31 gain 8 17 -81.76 gain 17 8 -82.27 gain 8 18 -86.69 gain 18 8 -88.29 gain 8 19 -87.33 gain 19 8 -89.67 gain 8 20 -84.90 gain 20 8 -88.44 gain 8 21 -74.83 gain 21 8 -77.48 gain 8 22 -67.83 gain 22 8 -68.94 gain 8 23 -71.81 gain 23 8 -70.10 gain 8 24 -65.55 gain 24 8 -65.45 gain 8 25 -73.18 gain 25 8 -75.76 gain 8 26 -78.32 gain 26 8 -82.33 gain 8 27 -82.13 gain 27 8 -83.75 gain 8 28 -89.93 gain 28 8 -86.88 gain 8 29 -83.14 gain 29 8 -81.63 gain 8 30 -90.02 gain 30 8 -93.52 gain 8 31 -80.81 gain 31 8 -80.87 gain 8 32 -100.95 gain 32 8 -98.36 gain 8 33 -84.07 gain 33 8 -82.93 gain 8 34 -76.65 gain 34 8 -76.14 gain 8 35 -84.38 gain 35 8 -84.82 gain 8 36 -71.81 gain 36 8 -72.40 gain 8 37 -80.35 gain 37 8 -83.48 gain 8 38 -69.26 gain 38 8 -69.92 gain 8 39 -77.91 gain 39 8 -82.90 gain 8 40 -80.35 gain 40 8 -80.31 gain 8 41 -80.91 gain 41 8 -76.22 gain 8 42 -87.44 gain 42 8 -90.00 gain 8 43 -89.60 gain 43 8 -89.75 gain 8 44 -88.73 gain 44 8 -92.47 gain 8 45 -96.58 gain 45 8 -100.30 gain 8 46 -91.18 gain 46 8 -91.37 gain 8 47 -89.35 gain 47 8 -87.24 gain 8 48 -85.92 gain 48 8 -83.38 gain 8 49 -83.49 gain 49 8 -85.02 gain 8 50 -76.56 gain 50 8 -74.94 gain 8 51 -74.42 gain 51 8 -76.49 gain 8 52 -77.66 gain 52 8 -76.97 gain 8 53 -82.68 gain 53 8 -82.55 gain 8 54 -76.01 gain 54 8 -75.28 gain 8 55 -83.82 gain 55 8 -80.01 gain 8 56 -89.65 gain 56 8 -90.89 gain 8 57 -89.78 gain 57 8 -90.10 gain 8 58 -88.07 gain 58 8 -85.08 gain 8 59 -87.86 gain 59 8 -84.13 gain 8 60 -96.97 gain 60 8 -102.52 gain 8 61 -92.98 gain 61 8 -90.44 gain 8 62 -90.12 gain 62 8 -85.08 gain 8 63 -91.40 gain 63 8 -90.33 gain 8 64 -83.99 gain 64 8 -87.14 gain 8 65 -80.32 gain 65 8 -79.03 gain 8 66 -81.70 gain 66 8 -79.38 gain 8 67 -76.70 gain 67 8 -75.62 gain 8 68 -77.93 gain 68 8 -79.44 gain 8 69 -82.34 gain 69 8 -81.06 gain 8 70 -78.90 gain 70 8 -76.08 gain 8 71 -93.37 gain 71 8 -94.12 gain 8 72 -88.14 gain 72 8 -86.45 gain 8 73 -90.04 gain 73 8 -89.73 gain 8 74 -89.66 gain 74 8 -85.45 gain 8 75 -93.75 gain 75 8 -95.44 gain 8 76 -100.53 gain 76 8 -102.34 gain 8 77 -95.98 gain 77 8 -93.78 gain 8 78 -93.73 gain 78 8 -96.03 gain 8 79 -92.36 gain 79 8 -94.29 gain 8 80 -87.44 gain 80 8 -87.16 gain 8 81 -79.53 gain 81 8 -80.16 gain 8 82 -81.01 gain 82 8 -82.61 gain 8 83 -87.22 gain 83 8 -86.10 gain 8 84 -86.71 gain 84 8 -82.78 gain 8 85 -83.24 gain 85 8 -84.73 gain 8 86 -85.93 gain 86 8 -89.07 gain 8 87 -87.67 gain 87 8 -88.09 gain 8 88 -82.50 gain 88 8 -82.56 gain 8 89 -95.49 gain 89 8 -97.70 gain 8 90 -95.59 gain 90 8 -97.13 gain 8 91 -91.57 gain 91 8 -94.18 gain 8 92 -92.46 gain 92 8 -96.00 gain 8 93 -96.18 gain 93 8 -97.07 gain 8 94 -86.22 gain 94 8 -85.68 gain 8 95 -88.43 gain 95 8 -87.13 gain 8 96 -93.10 gain 96 8 -98.77 gain 8 97 -90.35 gain 97 8 -88.85 gain 8 98 -85.65 gain 98 8 -84.61 gain 8 99 -88.71 gain 99 8 -86.81 gain 8 100 -88.38 gain 100 8 -86.40 gain 8 101 -90.34 gain 101 8 -91.98 gain 8 102 -90.80 gain 102 8 -92.41 gain 8 103 -92.91 gain 103 8 -95.69 gain 8 104 -94.65 gain 104 8 -99.91 gain 8 105 -100.04 gain 105 8 -99.83 gain 8 106 -101.53 gain 106 8 -98.65 gain 8 107 -93.83 gain 107 8 -90.85 gain 8 108 -93.83 gain 108 8 -90.47 gain 8 109 -95.12 gain 109 8 -95.21 gain 8 110 -88.48 gain 110 8 -94.93 gain 8 111 -92.22 gain 111 8 -88.64 gain 8 112 -89.43 gain 112 8 -89.31 gain 8 113 -91.92 gain 113 8 -90.93 gain 8 114 -95.79 gain 114 8 -91.96 gain 8 115 -89.81 gain 115 8 -86.64 gain 8 116 -95.22 gain 116 8 -94.48 gain 8 117 -83.30 gain 117 8 -79.70 gain 8 118 -94.74 gain 118 8 -92.77 gain 8 119 -89.62 gain 119 8 -92.71 gain 8 120 -92.29 gain 120 8 -92.76 gain 8 121 -95.62 gain 121 8 -97.11 gain 8 122 -101.43 gain 122 8 -102.68 gain 8 123 -95.31 gain 123 8 -96.90 gain 8 124 -89.14 gain 124 8 -88.71 gain 8 125 -86.50 gain 125 8 -89.41 gain 8 126 -99.24 gain 126 8 -98.80 gain 8 127 -100.88 gain 127 8 -100.06 gain 8 128 -93.21 gain 128 8 -94.99 gain 8 129 -89.92 gain 129 8 -88.91 gain 8 130 -93.00 gain 130 8 -93.28 gain 8 131 -91.30 gain 131 8 -91.36 gain 8 132 -83.59 gain 132 8 -79.66 gain 8 133 -100.41 gain 133 8 -101.65 gain 8 134 -96.62 gain 134 8 -94.73 gain 8 135 -96.80 gain 135 8 -97.21 gain 8 136 -91.10 gain 136 8 -91.95 gain 8 137 -92.60 gain 137 8 -96.37 gain 8 138 -100.55 gain 138 8 -97.84 gain 8 139 -101.95 gain 139 8 -102.50 gain 8 140 -92.78 gain 140 8 -94.16 gain 8 141 -91.73 gain 141 8 -85.08 gain 8 142 -88.75 gain 142 8 -88.85 gain 8 143 -93.82 gain 143 8 -96.66 gain 8 144 -90.66 gain 144 8 -91.86 gain 8 145 -94.18 gain 145 8 -98.77 gain 8 146 -88.83 gain 146 8 -89.41 gain 8 147 -98.11 gain 147 8 -95.80 gain 8 148 -90.56 gain 148 8 -86.57 gain 8 149 -95.81 gain 149 8 -95.48 gain 8 150 -95.05 gain 150 8 -95.55 gain 8 151 -96.15 gain 151 8 -95.60 gain 8 152 -97.86 gain 152 8 -97.13 gain 8 153 -104.90 gain 153 8 -103.38 gain 8 154 -90.57 gain 154 8 -90.95 gain 8 155 -94.99 gain 155 8 -93.94 gain 8 156 -93.48 gain 156 8 -91.67 gain 8 157 -99.40 gain 157 8 -100.07 gain 8 158 -99.99 gain 158 8 -100.16 gain 8 159 -100.79 gain 159 8 -103.34 gain 8 160 -95.17 gain 160 8 -94.87 gain 8 161 -107.96 gain 161 8 -110.11 gain 8 162 -90.81 gain 162 8 -92.66 gain 8 163 -98.51 gain 163 8 -102.28 gain 8 164 -99.31 gain 164 8 -102.45 gain 8 165 -99.50 gain 165 8 -99.70 gain 8 166 -101.33 gain 166 8 -101.28 gain 8 167 -98.37 gain 167 8 -99.04 gain 8 168 -102.91 gain 168 8 -102.48 gain 8 169 -95.58 gain 169 8 -96.26 gain 8 170 -99.06 gain 170 8 -98.98 gain 8 171 -94.43 gain 171 8 -95.42 gain 8 172 -90.87 gain 172 8 -90.06 gain 8 173 -100.15 gain 173 8 -103.98 gain 8 174 -99.28 gain 174 8 -99.16 gain 8 175 -98.21 gain 175 8 -99.22 gain 8 176 -95.91 gain 176 8 -95.89 gain 8 177 -90.43 gain 177 8 -93.41 gain 8 178 -102.88 gain 178 8 -99.31 gain 8 179 -95.11 gain 179 8 -90.96 gain 8 180 -102.93 gain 180 8 -108.22 gain 8 181 -96.15 gain 181 8 -95.47 gain 8 182 -98.78 gain 182 8 -99.19 gain 8 183 -104.35 gain 183 8 -105.02 gain 8 184 -99.97 gain 184 8 -103.39 gain 8 185 -98.47 gain 185 8 -105.76 gain 8 186 -98.12 gain 186 8 -100.99 gain 8 187 -97.62 gain 187 8 -98.22 gain 8 188 -98.12 gain 188 8 -101.13 gain 8 189 -98.72 gain 189 8 -96.46 gain 8 190 -104.13 gain 190 8 -105.78 gain 8 191 -97.36 gain 191 8 -97.72 gain 8 192 -100.96 gain 192 8 -100.02 gain 8 193 -103.20 gain 193 8 -101.24 gain 8 194 -101.80 gain 194 8 -100.63 gain 8 195 -96.85 gain 195 8 -94.22 gain 8 196 -92.90 gain 196 8 -94.58 gain 8 197 -97.65 gain 197 8 -94.47 gain 8 198 -97.58 gain 198 8 -98.91 gain 8 199 -94.35 gain 199 8 -95.78 gain 8 200 -105.14 gain 200 8 -107.91 gain 8 201 -96.24 gain 201 8 -98.93 gain 8 202 -102.32 gain 202 8 -104.14 gain 8 203 -93.56 gain 203 8 -94.49 gain 8 204 -100.49 gain 204 8 -98.06 gain 8 205 -99.78 gain 205 8 -101.10 gain 8 206 -89.03 gain 206 8 -91.45 gain 8 207 -101.36 gain 207 8 -103.20 gain 8 208 -98.55 gain 208 8 -102.99 gain 8 209 -100.27 gain 209 8 -104.29 gain 8 210 -108.91 gain 210 8 -113.10 gain 8 211 -104.83 gain 211 8 -104.25 gain 8 212 -106.41 gain 212 8 -108.84 gain 8 213 -101.18 gain 213 8 -102.94 gain 8 214 -99.35 gain 214 8 -106.49 gain 8 215 -101.68 gain 215 8 -104.23 gain 8 216 -94.87 gain 216 8 -101.33 gain 8 217 -98.42 gain 217 8 -105.15 gain 8 218 -94.90 gain 218 8 -94.42 gain 8 219 -105.68 gain 219 8 -105.69 gain 8 220 -97.39 gain 220 8 -93.49 gain 8 221 -95.10 gain 221 8 -96.88 gain 8 222 -97.36 gain 222 8 -94.95 gain 8 223 -99.67 gain 223 8 -100.49 gain 8 224 -89.24 gain 224 8 -90.53 gain 9 10 -68.43 gain 10 9 -66.82 gain 9 11 -85.12 gain 11 9 -87.70 gain 9 12 -79.23 gain 12 9 -72.93 gain 9 13 -88.47 gain 13 9 -85.55 gain 9 14 -93.00 gain 14 9 -86.32 gain 9 15 -99.73 gain 15 9 -95.81 gain 9 16 -107.28 gain 16 9 -105.50 gain 9 17 -90.87 gain 17 9 -86.98 gain 9 18 -89.83 gain 18 9 -87.02 gain 9 19 -95.30 gain 19 9 -93.24 gain 9 20 -88.79 gain 20 9 -87.93 gain 9 21 -79.27 gain 21 9 -77.52 gain 9 22 -74.42 gain 22 9 -71.13 gain 9 23 -72.24 gain 23 9 -66.12 gain 9 24 -71.01 gain 24 9 -66.51 gain 9 25 -65.04 gain 25 9 -63.21 gain 9 26 -83.59 gain 26 9 -83.20 gain 9 27 -87.43 gain 27 9 -84.64 gain 9 28 -84.29 gain 28 9 -76.83 gain 9 29 -90.30 gain 29 9 -84.39 gain 9 30 -90.38 gain 30 9 -89.47 gain 9 31 -92.27 gain 31 9 -87.93 gain 9 32 -96.84 gain 32 9 -89.85 gain 9 33 -95.01 gain 33 9 -89.47 gain 9 34 -91.08 gain 34 9 -86.17 gain 9 35 -88.00 gain 35 9 -84.04 gain 9 36 -77.88 gain 36 9 -74.06 gain 9 37 -78.59 gain 37 9 -77.31 gain 9 38 -76.14 gain 38 9 -72.39 gain 9 39 -76.79 gain 39 9 -77.37 gain 9 40 -82.40 gain 40 9 -77.95 gain 9 41 -83.54 gain 41 9 -74.44 gain 9 42 -85.02 gain 42 9 -83.16 gain 9 43 -91.24 gain 43 9 -86.98 gain 9 44 -90.57 gain 44 9 -89.90 gain 9 45 -94.34 gain 45 9 -93.66 gain 9 46 -100.14 gain 46 9 -95.92 gain 9 47 -100.38 gain 47 9 -93.86 gain 9 48 -90.91 gain 48 9 -83.97 gain 9 49 -89.12 gain 49 9 -86.24 gain 9 50 -87.77 gain 50 9 -81.75 gain 9 51 -80.95 gain 51 9 -78.62 gain 9 52 -93.19 gain 52 9 -88.10 gain 9 53 -79.23 gain 53 9 -74.69 gain 9 54 -83.77 gain 54 9 -78.64 gain 9 55 -82.72 gain 55 9 -74.51 gain 9 56 -87.99 gain 56 9 -84.82 gain 9 57 -84.17 gain 57 9 -80.09 gain 9 58 -90.96 gain 58 9 -83.57 gain 9 59 -90.68 gain 59 9 -82.54 gain 9 60 -92.11 gain 60 9 -93.26 gain 9 61 -98.01 gain 61 9 -91.05 gain 9 62 -96.59 gain 62 9 -87.15 gain 9 63 -100.11 gain 63 9 -94.63 gain 9 64 -92.91 gain 64 9 -91.66 gain 9 65 -86.68 gain 65 9 -80.97 gain 9 66 -95.62 gain 66 9 -88.90 gain 9 67 -92.05 gain 67 9 -86.56 gain 9 68 -83.06 gain 68 9 -80.15 gain 9 69 -88.88 gain 69 9 -83.19 gain 9 70 -85.64 gain 70 9 -78.42 gain 9 71 -85.83 gain 71 9 -82.18 gain 9 72 -95.21 gain 72 9 -89.11 gain 9 73 -91.41 gain 73 9 -86.69 gain 9 74 -92.09 gain 74 9 -83.48 gain 9 75 -103.38 gain 75 9 -100.66 gain 9 76 -89.56 gain 76 9 -86.96 gain 9 77 -98.60 gain 77 9 -92.00 gain 9 78 -99.29 gain 78 9 -97.19 gain 9 79 -104.73 gain 79 9 -102.25 gain 9 80 -100.48 gain 80 9 -95.79 gain 9 81 -88.14 gain 81 9 -84.36 gain 9 82 -87.57 gain 82 9 -84.77 gain 9 83 -88.41 gain 83 9 -82.88 gain 9 84 -87.79 gain 84 9 -79.44 gain 9 85 -92.22 gain 85 9 -89.31 gain 9 86 -86.89 gain 86 9 -85.61 gain 9 87 -94.48 gain 87 9 -90.49 gain 9 88 -93.04 gain 88 9 -88.70 gain 9 89 -101.08 gain 89 9 -98.88 gain 9 90 -97.86 gain 90 9 -95.00 gain 9 91 -100.38 gain 91 9 -98.59 gain 9 92 -103.01 gain 92 9 -102.14 gain 9 93 -96.28 gain 93 9 -92.76 gain 9 94 -95.82 gain 94 9 -90.87 gain 9 95 -93.05 gain 95 9 -87.34 gain 9 96 -90.81 gain 96 9 -92.07 gain 9 97 -95.93 gain 97 9 -90.02 gain 9 98 -97.06 gain 98 9 -91.62 gain 9 99 -92.21 gain 99 9 -85.90 gain 9 100 -91.64 gain 100 9 -85.25 gain 9 101 -92.21 gain 101 9 -89.45 gain 9 102 -95.06 gain 102 9 -92.26 gain 9 103 -87.76 gain 103 9 -86.13 gain 9 104 -97.65 gain 104 9 -98.50 gain 9 105 -100.45 gain 105 9 -95.83 gain 9 106 -101.48 gain 106 9 -94.19 gain 9 107 -97.04 gain 107 9 -89.65 gain 9 108 -98.19 gain 108 9 -90.42 gain 9 109 -104.60 gain 109 9 -100.28 gain 9 110 -96.69 gain 110 9 -98.73 gain 9 111 -93.22 gain 111 9 -85.23 gain 9 112 -95.57 gain 112 9 -91.05 gain 9 113 -93.55 gain 113 9 -88.16 gain 9 114 -99.69 gain 114 9 -91.46 gain 9 115 -98.81 gain 115 9 -91.24 gain 9 116 -94.63 gain 116 9 -89.49 gain 9 117 -87.80 gain 117 9 -79.80 gain 9 118 -99.12 gain 118 9 -92.74 gain 9 119 -102.25 gain 119 9 -100.93 gain 9 120 -94.30 gain 120 9 -90.37 gain 9 121 -93.34 gain 121 9 -90.43 gain 9 122 -95.92 gain 122 9 -92.76 gain 9 123 -102.25 gain 123 9 -99.42 gain 9 124 -97.79 gain 124 9 -92.96 gain 9 125 -93.52 gain 125 9 -92.02 gain 9 126 -104.41 gain 126 9 -99.56 gain 9 127 -99.34 gain 127 9 -94.12 gain 9 128 -91.48 gain 128 9 -88.86 gain 9 129 -97.03 gain 129 9 -91.62 gain 9 130 -98.17 gain 130 9 -94.05 gain 9 131 -92.84 gain 131 9 -88.49 gain 9 132 -94.76 gain 132 9 -86.41 gain 9 133 -98.67 gain 133 9 -95.51 gain 9 134 -92.24 gain 134 9 -85.94 gain 9 135 -105.62 gain 135 9 -101.62 gain 9 136 -103.53 gain 136 9 -99.97 gain 9 137 -97.58 gain 137 9 -96.93 gain 9 138 -100.70 gain 138 9 -93.58 gain 9 139 -100.11 gain 139 9 -96.26 gain 9 140 -100.24 gain 140 9 -97.22 gain 9 141 -97.35 gain 141 9 -86.30 gain 9 142 -97.87 gain 142 9 -93.56 gain 9 143 -103.87 gain 143 9 -102.30 gain 9 144 -97.79 gain 144 9 -94.59 gain 9 145 -94.09 gain 145 9 -94.27 gain 9 146 -95.69 gain 146 9 -91.87 gain 9 147 -97.87 gain 147 9 -91.15 gain 9 148 -101.34 gain 148 9 -92.95 gain 9 149 -96.50 gain 149 9 -91.76 gain 9 150 -103.29 gain 150 9 -99.39 gain 9 151 -103.99 gain 151 9 -99.04 gain 9 152 -103.55 gain 152 9 -98.40 gain 9 153 -101.64 gain 153 9 -95.71 gain 9 154 -102.60 gain 154 9 -98.57 gain 9 155 -100.98 gain 155 9 -95.53 gain 9 156 -102.06 gain 156 9 -95.84 gain 9 157 -96.68 gain 157 9 -92.94 gain 9 158 -100.79 gain 158 9 -96.55 gain 9 159 -98.35 gain 159 9 -96.50 gain 9 160 -95.20 gain 160 9 -90.49 gain 9 161 -96.49 gain 161 9 -94.23 gain 9 162 -99.75 gain 162 9 -97.20 gain 9 163 -99.76 gain 163 9 -99.12 gain 9 164 -102.77 gain 164 9 -101.50 gain 9 165 -103.96 gain 165 9 -99.75 gain 9 166 -101.27 gain 166 9 -96.81 gain 9 167 -105.03 gain 167 9 -101.29 gain 9 168 -99.79 gain 168 9 -94.95 gain 9 169 -107.12 gain 169 9 -103.39 gain 9 170 -99.68 gain 170 9 -95.19 gain 9 171 -103.32 gain 171 9 -99.91 gain 9 172 -105.69 gain 172 9 -100.46 gain 9 173 -104.77 gain 173 9 -104.20 gain 9 174 -97.84 gain 174 9 -93.32 gain 9 175 -96.82 gain 175 9 -93.43 gain 9 176 -102.62 gain 176 9 -98.20 gain 9 177 -103.94 gain 177 9 -102.52 gain 9 178 -105.69 gain 178 9 -97.71 gain 9 179 -97.82 gain 179 9 -89.26 gain 9 180 -107.41 gain 180 9 -108.30 gain 9 181 -103.20 gain 181 9 -98.11 gain 9 182 -102.12 gain 182 9 -98.11 gain 9 183 -108.84 gain 183 9 -105.11 gain 9 184 -101.88 gain 184 9 -100.90 gain 9 185 -98.79 gain 185 9 -101.67 gain 9 186 -95.82 gain 186 9 -94.29 gain 9 187 -100.68 gain 187 9 -96.88 gain 9 188 -91.54 gain 188 9 -90.15 gain 9 189 -99.47 gain 189 9 -92.80 gain 9 190 -105.06 gain 190 9 -102.31 gain 9 191 -110.69 gain 191 9 -106.64 gain 9 192 -101.93 gain 192 9 -96.58 gain 9 193 -100.85 gain 193 9 -94.49 gain 9 194 -97.82 gain 194 9 -92.23 gain 9 195 -104.82 gain 195 9 -97.78 gain 9 196 -105.62 gain 196 9 -102.89 gain 9 197 -100.77 gain 197 9 -93.18 gain 9 198 -103.72 gain 198 9 -100.65 gain 9 199 -104.31 gain 199 9 -101.34 gain 9 200 -103.04 gain 200 9 -101.41 gain 9 201 -110.66 gain 201 9 -108.94 gain 9 202 -102.35 gain 202 9 -99.76 gain 9 203 -91.41 gain 203 9 -87.94 gain 9 204 -100.03 gain 204 9 -93.19 gain 9 205 -104.05 gain 205 9 -100.96 gain 9 206 -100.06 gain 206 9 -98.08 gain 9 207 -100.60 gain 207 9 -98.04 gain 9 208 -104.54 gain 208 9 -104.58 gain 9 209 -102.10 gain 209 9 -101.71 gain 9 210 -103.86 gain 210 9 -103.65 gain 9 211 -107.39 gain 211 9 -102.41 gain 9 212 -102.41 gain 212 9 -100.44 gain 9 213 -96.53 gain 213 9 -93.88 gain 9 214 -103.49 gain 214 9 -106.23 gain 9 215 -102.94 gain 215 9 -101.09 gain 9 216 -110.21 gain 216 9 -112.26 gain 9 217 -109.91 gain 217 9 -112.23 gain 9 218 -106.16 gain 218 9 -101.28 gain 9 219 -112.86 gain 219 9 -108.46 gain 9 220 -107.23 gain 220 9 -98.92 gain 9 221 -106.14 gain 221 9 -103.51 gain 9 222 -99.22 gain 222 9 -92.40 gain 9 223 -101.26 gain 223 9 -97.67 gain 9 224 -110.25 gain 224 9 -107.14 gain 10 11 -65.87 gain 11 10 -70.06 gain 10 12 -78.92 gain 12 10 -74.22 gain 10 13 -89.35 gain 13 10 -88.03 gain 10 14 -83.16 gain 14 10 -78.09 gain 10 15 -97.30 gain 15 10 -94.99 gain 10 16 -95.52 gain 16 10 -95.34 gain 10 17 -89.76 gain 17 10 -87.47 gain 10 18 -95.99 gain 18 10 -94.78 gain 10 19 -90.26 gain 19 10 -89.80 gain 10 20 -84.99 gain 20 10 -85.73 gain 10 21 -83.82 gain 21 10 -83.67 gain 10 22 -88.57 gain 22 10 -86.88 gain 10 23 -72.80 gain 23 10 -68.28 gain 10 24 -67.05 gain 24 10 -64.15 gain 10 25 -69.70 gain 25 10 -69.48 gain 10 26 -68.73 gain 26 10 -69.94 gain 10 27 -78.88 gain 27 10 -77.69 gain 10 28 -90.15 gain 28 10 -84.29 gain 10 29 -79.51 gain 29 10 -75.20 gain 10 30 -98.70 gain 30 10 -99.39 gain 10 31 -98.93 gain 31 10 -96.19 gain 10 32 -94.85 gain 32 10 -89.46 gain 10 33 -89.04 gain 33 10 -85.10 gain 10 34 -94.58 gain 34 10 -91.28 gain 10 35 -90.19 gain 35 10 -87.83 gain 10 36 -93.77 gain 36 10 -91.56 gain 10 37 -85.53 gain 37 10 -85.86 gain 10 38 -74.51 gain 38 10 -72.36 gain 10 39 -76.05 gain 39 10 -78.23 gain 10 40 -77.83 gain 40 10 -74.99 gain 10 41 -75.61 gain 41 10 -68.11 gain 10 42 -87.66 gain 42 10 -87.41 gain 10 43 -86.47 gain 43 10 -83.82 gain 10 44 -87.88 gain 44 10 -88.82 gain 10 45 -102.79 gain 45 10 -103.71 gain 10 46 -99.66 gain 46 10 -97.04 gain 10 47 -94.63 gain 47 10 -89.72 gain 10 48 -90.39 gain 48 10 -85.05 gain 10 49 -90.97 gain 49 10 -89.69 gain 10 50 -94.23 gain 50 10 -89.82 gain 10 51 -86.05 gain 51 10 -85.32 gain 10 52 -95.44 gain 52 10 -91.95 gain 10 53 -89.57 gain 53 10 -86.64 gain 10 54 -85.46 gain 54 10 -81.94 gain 10 55 -78.86 gain 55 10 -72.25 gain 10 56 -80.73 gain 56 10 -79.17 gain 10 57 -87.68 gain 57 10 -85.20 gain 10 58 -87.57 gain 58 10 -81.79 gain 10 59 -92.72 gain 59 10 -86.18 gain 10 60 -97.05 gain 60 10 -99.80 gain 10 61 -105.47 gain 61 10 -100.12 gain 10 62 -98.44 gain 62 10 -90.60 gain 10 63 -100.67 gain 63 10 -96.79 gain 10 64 -97.43 gain 64 10 -97.78 gain 10 65 -91.17 gain 65 10 -87.07 gain 10 66 -94.66 gain 66 10 -89.54 gain 10 67 -88.47 gain 67 10 -84.58 gain 10 68 -88.50 gain 68 10 -87.20 gain 10 69 -93.80 gain 69 10 -89.72 gain 10 70 -87.03 gain 70 10 -81.41 gain 10 71 -83.64 gain 71 10 -81.60 gain 10 72 -87.04 gain 72 10 -82.55 gain 10 73 -87.91 gain 73 10 -84.79 gain 10 74 -93.05 gain 74 10 -86.04 gain 10 75 -100.27 gain 75 10 -99.15 gain 10 76 -99.62 gain 76 10 -98.63 gain 10 77 -92.12 gain 77 10 -87.12 gain 10 78 -96.47 gain 78 10 -95.98 gain 10 79 -90.60 gain 79 10 -89.73 gain 10 80 -94.42 gain 80 10 -91.34 gain 10 81 -91.90 gain 81 10 -89.72 gain 10 82 -89.42 gain 82 10 -88.23 gain 10 83 -86.90 gain 83 10 -82.98 gain 10 84 -98.49 gain 84 10 -91.75 gain 10 85 -86.23 gain 85 10 -84.92 gain 10 86 -92.12 gain 86 10 -92.44 gain 10 87 -86.37 gain 87 10 -83.99 gain 10 88 -91.57 gain 88 10 -88.83 gain 10 89 -97.24 gain 89 10 -96.64 gain 10 90 -100.55 gain 90 10 -99.29 gain 10 91 -100.26 gain 91 10 -100.07 gain 10 92 -99.36 gain 92 10 -100.09 gain 10 93 -95.13 gain 93 10 -93.22 gain 10 94 -99.03 gain 94 10 -95.69 gain 10 95 -95.17 gain 95 10 -91.07 gain 10 96 -90.47 gain 96 10 -93.34 gain 10 97 -91.71 gain 97 10 -87.40 gain 10 98 -96.36 gain 98 10 -92.52 gain 10 99 -83.60 gain 99 10 -78.90 gain 10 100 -87.74 gain 100 10 -82.95 gain 10 101 -87.49 gain 101 10 -86.33 gain 10 102 -89.30 gain 102 10 -88.11 gain 10 103 -88.74 gain 103 10 -88.71 gain 10 104 -87.55 gain 104 10 -90.01 gain 10 105 -105.95 gain 105 10 -102.93 gain 10 106 -90.18 gain 106 10 -84.49 gain 10 107 -98.35 gain 107 10 -92.57 gain 10 108 -103.69 gain 108 10 -97.53 gain 10 109 -99.58 gain 109 10 -96.86 gain 10 110 -93.02 gain 110 10 -96.67 gain 10 111 -90.12 gain 111 10 -83.74 gain 10 112 -102.92 gain 112 10 -100.00 gain 10 113 -86.01 gain 113 10 -82.22 gain 10 114 -99.18 gain 114 10 -92.55 gain 10 115 -96.08 gain 115 10 -90.11 gain 10 116 -90.56 gain 116 10 -87.02 gain 10 117 -95.38 gain 117 10 -88.98 gain 10 118 -88.93 gain 118 10 -84.15 gain 10 119 -95.41 gain 119 10 -95.69 gain 10 120 -106.35 gain 120 10 -104.02 gain 10 121 -100.83 gain 121 10 -99.52 gain 10 122 -100.17 gain 122 10 -98.62 gain 10 123 -99.97 gain 123 10 -98.75 gain 10 124 -99.37 gain 124 10 -96.14 gain 10 125 -101.06 gain 125 10 -101.17 gain 10 126 -96.89 gain 126 10 -93.65 gain 10 127 -100.87 gain 127 10 -97.25 gain 10 128 -92.03 gain 128 10 -91.01 gain 10 129 -96.15 gain 129 10 -92.34 gain 10 130 -88.90 gain 130 10 -86.38 gain 10 131 -101.45 gain 131 10 -98.70 gain 10 132 -94.60 gain 132 10 -87.86 gain 10 133 -100.53 gain 133 10 -98.97 gain 10 134 -93.46 gain 134 10 -88.76 gain 10 135 -109.96 gain 135 10 -107.57 gain 10 136 -98.73 gain 136 10 -96.77 gain 10 137 -104.93 gain 137 10 -105.89 gain 10 138 -105.07 gain 138 10 -99.55 gain 10 139 -93.45 gain 139 10 -91.20 gain 10 140 -107.64 gain 140 10 -106.22 gain 10 141 -98.82 gain 141 10 -89.37 gain 10 142 -97.49 gain 142 10 -94.78 gain 10 143 -89.54 gain 143 10 -89.57 gain 10 144 -98.04 gain 144 10 -96.44 gain 10 145 -97.39 gain 145 10 -99.18 gain 10 146 -89.16 gain 146 10 -86.94 gain 10 147 -93.35 gain 147 10 -88.23 gain 10 148 -99.47 gain 148 10 -92.68 gain 10 149 -96.53 gain 149 10 -93.39 gain 10 150 -109.46 gain 150 10 -107.17 gain 10 151 -104.69 gain 151 10 -101.34 gain 10 152 -99.85 gain 152 10 -96.32 gain 10 153 -100.00 gain 153 10 -95.68 gain 10 154 -91.90 gain 154 10 -89.47 gain 10 155 -97.76 gain 155 10 -93.91 gain 10 156 -100.23 gain 156 10 -95.61 gain 10 157 -93.09 gain 157 10 -90.95 gain 10 158 -103.09 gain 158 10 -100.45 gain 10 159 -96.12 gain 159 10 -95.86 gain 10 160 -97.28 gain 160 10 -94.18 gain 10 161 -96.29 gain 161 10 -95.64 gain 10 162 -96.68 gain 162 10 -95.74 gain 10 163 -94.85 gain 163 10 -95.81 gain 10 164 -100.33 gain 164 10 -100.66 gain 10 165 -94.15 gain 165 10 -91.54 gain 10 166 -101.30 gain 166 10 -98.44 gain 10 167 -97.45 gain 167 10 -95.31 gain 10 168 -103.09 gain 168 10 -99.86 gain 10 169 -98.13 gain 169 10 -96.00 gain 10 170 -87.38 gain 170 10 -84.49 gain 10 171 -106.33 gain 171 10 -104.53 gain 10 172 -95.06 gain 172 10 -91.44 gain 10 173 -98.02 gain 173 10 -99.05 gain 10 174 -93.23 gain 174 10 -90.30 gain 10 175 -100.69 gain 175 10 -98.90 gain 10 176 -106.54 gain 176 10 -103.72 gain 10 177 -96.54 gain 177 10 -96.73 gain 10 178 -95.00 gain 178 10 -88.62 gain 10 179 -97.96 gain 179 10 -91.00 gain 10 180 -106.54 gain 180 10 -109.04 gain 10 181 -100.86 gain 181 10 -97.38 gain 10 182 -109.96 gain 182 10 -107.56 gain 10 183 -100.44 gain 183 10 -98.31 gain 10 184 -96.74 gain 184 10 -97.36 gain 10 185 -98.70 gain 185 10 -103.19 gain 10 186 -98.51 gain 186 10 -98.58 gain 10 187 -100.99 gain 187 10 -98.79 gain 10 188 -100.41 gain 188 10 -100.62 gain 10 189 -97.43 gain 189 10 -92.36 gain 10 190 -101.88 gain 190 10 -100.73 gain 10 191 -102.33 gain 191 10 -99.89 gain 10 192 -95.21 gain 192 10 -91.47 gain 10 193 -98.96 gain 193 10 -94.20 gain 10 194 -96.20 gain 194 10 -92.23 gain 10 195 -94.79 gain 195 10 -89.36 gain 10 196 -108.45 gain 196 10 -107.34 gain 10 197 -102.76 gain 197 10 -96.78 gain 10 198 -108.62 gain 198 10 -107.15 gain 10 199 -94.86 gain 199 10 -93.49 gain 10 200 -102.33 gain 200 10 -102.30 gain 10 201 -101.69 gain 201 10 -101.57 gain 10 202 -98.78 gain 202 10 -97.80 gain 10 203 -105.78 gain 203 10 -103.91 gain 10 204 -100.95 gain 204 10 -95.72 gain 10 205 -100.76 gain 205 10 -99.27 gain 10 206 -100.70 gain 206 10 -100.32 gain 10 207 -92.17 gain 207 10 -91.20 gain 10 208 -96.82 gain 208 10 -98.46 gain 10 209 -109.66 gain 209 10 -110.87 gain 10 210 -110.20 gain 210 10 -111.58 gain 10 211 -101.53 gain 211 10 -98.15 gain 10 212 -107.40 gain 212 10 -107.03 gain 10 213 -112.63 gain 213 10 -111.59 gain 10 214 -103.13 gain 214 10 -107.47 gain 10 215 -97.91 gain 215 10 -97.66 gain 10 216 -106.28 gain 216 10 -109.94 gain 10 217 -101.02 gain 217 10 -104.94 gain 10 218 -95.94 gain 218 10 -92.66 gain 10 219 -101.77 gain 219 10 -98.97 gain 10 220 -99.14 gain 220 10 -92.44 gain 10 221 -100.28 gain 221 10 -99.25 gain 10 222 -98.56 gain 222 10 -93.34 gain 10 223 -103.57 gain 223 10 -101.59 gain 10 224 -103.87 gain 224 10 -102.36 gain 11 12 -72.28 gain 12 11 -63.40 gain 11 13 -76.23 gain 13 11 -70.72 gain 11 14 -82.64 gain 14 11 -73.37 gain 11 15 -100.17 gain 15 11 -93.67 gain 11 16 -106.22 gain 16 11 -101.85 gain 11 17 -100.34 gain 17 11 -93.86 gain 11 18 -101.16 gain 18 11 -95.77 gain 11 19 -99.36 gain 19 11 -94.70 gain 11 20 -90.26 gain 20 11 -86.81 gain 11 21 -97.19 gain 21 11 -92.85 gain 11 22 -87.88 gain 22 11 -82.00 gain 11 23 -91.46 gain 23 11 -82.75 gain 11 24 -75.62 gain 24 11 -68.53 gain 11 25 -80.67 gain 25 11 -76.26 gain 11 26 -75.32 gain 26 11 -72.34 gain 11 27 -76.24 gain 27 11 -70.87 gain 11 28 -80.90 gain 28 11 -70.85 gain 11 29 -88.60 gain 29 11 -80.11 gain 11 30 -102.30 gain 30 11 -98.81 gain 11 31 -98.01 gain 31 11 -91.08 gain 11 32 -94.66 gain 32 11 -85.08 gain 11 33 -94.68 gain 33 11 -86.55 gain 11 34 -97.72 gain 34 11 -90.22 gain 11 35 -96.10 gain 35 11 -89.55 gain 11 36 -94.83 gain 36 11 -88.42 gain 11 37 -94.91 gain 37 11 -91.04 gain 11 38 -86.52 gain 38 11 -80.19 gain 11 39 -82.98 gain 39 11 -80.97 gain 11 40 -80.21 gain 40 11 -73.18 gain 11 41 -86.32 gain 41 11 -74.63 gain 11 42 -82.66 gain 42 11 -78.22 gain 11 43 -79.58 gain 43 11 -72.73 gain 11 44 -82.00 gain 44 11 -78.75 gain 11 45 -100.68 gain 45 11 -97.41 gain 11 46 -110.85 gain 46 11 -104.04 gain 11 47 -102.97 gain 47 11 -93.87 gain 11 48 -106.70 gain 48 11 -97.17 gain 11 49 -92.08 gain 49 11 -86.61 gain 11 50 -105.17 gain 50 11 -96.56 gain 11 51 -96.40 gain 51 11 -91.49 gain 11 52 -92.80 gain 52 11 -85.12 gain 11 53 -85.07 gain 53 11 -77.95 gain 11 54 -87.89 gain 54 11 -80.18 gain 11 55 -77.58 gain 55 11 -66.78 gain 11 56 -89.00 gain 56 11 -83.25 gain 11 57 -91.00 gain 57 11 -84.33 gain 11 58 -82.92 gain 58 11 -72.94 gain 11 59 -88.65 gain 59 11 -77.92 gain 11 60 -108.32 gain 60 11 -106.88 gain 11 61 -101.29 gain 61 11 -91.75 gain 11 62 -100.29 gain 62 11 -88.26 gain 11 63 -97.32 gain 63 11 -89.26 gain 11 64 -96.87 gain 64 11 -93.03 gain 11 65 -98.77 gain 65 11 -90.48 gain 11 66 -89.15 gain 66 11 -79.85 gain 11 67 -95.53 gain 67 11 -87.45 gain 11 68 -88.36 gain 68 11 -82.87 gain 11 69 -90.94 gain 69 11 -82.67 gain 11 70 -82.21 gain 70 11 -72.40 gain 11 71 -94.34 gain 71 11 -88.10 gain 11 72 -88.96 gain 72 11 -80.28 gain 11 73 -91.64 gain 73 11 -84.33 gain 11 74 -94.95 gain 74 11 -83.76 gain 11 75 -103.92 gain 75 11 -98.61 gain 11 76 -105.93 gain 76 11 -100.74 gain 11 77 -104.43 gain 77 11 -95.25 gain 11 78 -105.98 gain 78 11 -101.29 gain 11 79 -97.02 gain 79 11 -91.96 gain 11 80 -92.76 gain 80 11 -85.48 gain 11 81 -96.70 gain 81 11 -90.33 gain 11 82 -93.40 gain 82 11 -88.02 gain 11 83 -93.49 gain 83 11 -85.38 gain 11 84 -90.75 gain 84 11 -79.82 gain 11 85 -93.36 gain 85 11 -87.86 gain 11 86 -94.15 gain 86 11 -90.29 gain 11 87 -86.23 gain 87 11 -79.66 gain 11 88 -93.64 gain 88 11 -86.71 gain 11 89 -92.17 gain 89 11 -87.38 gain 11 90 -103.40 gain 90 11 -97.96 gain 11 91 -105.11 gain 91 11 -100.74 gain 11 92 -110.35 gain 92 11 -106.89 gain 11 93 -98.52 gain 93 11 -92.42 gain 11 94 -103.05 gain 94 11 -95.51 gain 11 95 -92.30 gain 95 11 -84.01 gain 11 96 -96.77 gain 96 11 -95.45 gain 11 97 -98.55 gain 97 11 -90.05 gain 11 98 -95.57 gain 98 11 -87.54 gain 11 99 -95.49 gain 99 11 -86.60 gain 11 100 -97.37 gain 100 11 -88.40 gain 11 101 -91.48 gain 101 11 -86.14 gain 11 102 -91.01 gain 102 11 -85.63 gain 11 103 -89.57 gain 103 11 -85.36 gain 11 104 -88.83 gain 104 11 -87.10 gain 11 105 -100.58 gain 105 11 -93.37 gain 11 106 -101.30 gain 106 11 -91.42 gain 11 107 -101.42 gain 107 11 -91.45 gain 11 108 -103.00 gain 108 11 -92.64 gain 11 109 -103.38 gain 109 11 -96.48 gain 11 110 -113.95 gain 110 11 -113.41 gain 11 111 -100.45 gain 111 11 -89.87 gain 11 112 -103.25 gain 112 11 -96.14 gain 11 113 -95.34 gain 113 11 -87.36 gain 11 114 -99.04 gain 114 11 -88.23 gain 11 115 -91.46 gain 115 11 -81.30 gain 11 116 -91.95 gain 116 11 -84.23 gain 11 117 -101.72 gain 117 11 -91.13 gain 11 118 -100.56 gain 118 11 -91.60 gain 11 119 -98.49 gain 119 11 -94.58 gain 11 120 -107.28 gain 120 11 -100.76 gain 11 121 -104.94 gain 121 11 -99.45 gain 11 122 -103.69 gain 122 11 -97.95 gain 11 123 -109.87 gain 123 11 -104.46 gain 11 124 -106.97 gain 124 11 -99.55 gain 11 125 -95.60 gain 125 11 -91.52 gain 11 126 -103.37 gain 126 11 -95.93 gain 11 127 -97.79 gain 127 11 -89.98 gain 11 128 -101.24 gain 128 11 -96.03 gain 11 129 -103.44 gain 129 11 -95.44 gain 11 130 -98.37 gain 130 11 -91.66 gain 11 131 -95.31 gain 131 11 -88.38 gain 11 132 -99.73 gain 132 11 -88.80 gain 11 133 -96.23 gain 133 11 -90.48 gain 11 134 -97.98 gain 134 11 -89.09 gain 11 135 -102.37 gain 135 11 -95.78 gain 11 136 -104.37 gain 136 11 -98.23 gain 11 137 -105.59 gain 137 11 -102.36 gain 11 138 -98.03 gain 138 11 -88.32 gain 11 139 -108.12 gain 139 11 -101.69 gain 11 140 -104.01 gain 140 11 -98.40 gain 11 141 -100.36 gain 141 11 -86.72 gain 11 142 -101.60 gain 142 11 -94.71 gain 11 143 -100.80 gain 143 11 -96.64 gain 11 144 -100.93 gain 144 11 -95.14 gain 11 145 -91.46 gain 145 11 -89.06 gain 11 146 -103.69 gain 146 11 -97.27 gain 11 147 -97.57 gain 147 11 -88.27 gain 11 148 -104.48 gain 148 11 -93.51 gain 11 149 -103.36 gain 149 11 -96.04 gain 11 150 -113.85 gain 150 11 -107.36 gain 11 151 -109.54 gain 151 11 -101.99 gain 11 152 -104.89 gain 152 11 -97.16 gain 11 153 -103.93 gain 153 11 -95.42 gain 11 154 -104.92 gain 154 11 -98.31 gain 11 155 -109.06 gain 155 11 -101.02 gain 11 156 -107.24 gain 156 11 -98.43 gain 11 157 -98.41 gain 157 11 -92.09 gain 11 158 -109.48 gain 158 11 -102.65 gain 11 159 -103.63 gain 159 11 -99.19 gain 11 160 -97.97 gain 160 11 -90.68 gain 11 161 -104.84 gain 161 11 -99.99 gain 11 162 -99.95 gain 162 11 -94.82 gain 11 163 -102.91 gain 163 11 -99.69 gain 11 164 -108.99 gain 164 11 -105.13 gain 11 165 -108.72 gain 165 11 -101.92 gain 11 166 -103.66 gain 166 11 -96.62 gain 11 167 -106.23 gain 167 11 -99.91 gain 11 168 -107.10 gain 168 11 -99.67 gain 11 169 -101.15 gain 169 11 -94.83 gain 11 170 -107.90 gain 170 11 -100.82 gain 11 171 -104.29 gain 171 11 -98.29 gain 11 172 -105.01 gain 172 11 -97.20 gain 11 173 -102.65 gain 173 11 -99.48 gain 11 174 -109.57 gain 174 11 -102.45 gain 11 175 -106.82 gain 175 11 -100.84 gain 11 176 -102.95 gain 176 11 -95.94 gain 11 177 -102.22 gain 177 11 -98.21 gain 11 178 -97.80 gain 178 11 -87.24 gain 11 179 -104.30 gain 179 11 -93.15 gain 11 180 -108.86 gain 180 11 -107.17 gain 11 181 -97.38 gain 181 11 -89.70 gain 11 182 -108.77 gain 182 11 -102.18 gain 11 183 -108.09 gain 183 11 -101.77 gain 11 184 -103.77 gain 184 11 -100.21 gain 11 185 -102.09 gain 185 11 -102.39 gain 11 186 -103.66 gain 186 11 -99.54 gain 11 187 -98.42 gain 187 11 -92.03 gain 11 188 -104.03 gain 188 11 -100.05 gain 11 189 -103.10 gain 189 11 -93.84 gain 11 190 -104.88 gain 190 11 -99.54 gain 11 191 -102.87 gain 191 11 -96.24 gain 11 192 -107.92 gain 192 11 -99.99 gain 11 193 -95.50 gain 193 11 -86.55 gain 11 194 -107.11 gain 194 11 -98.95 gain 11 195 -113.12 gain 195 11 -103.50 gain 11 196 -107.95 gain 196 11 -102.64 gain 11 197 -105.02 gain 197 11 -94.84 gain 11 198 -113.33 gain 198 11 -107.67 gain 11 199 -102.34 gain 199 11 -96.79 gain 11 200 -105.39 gain 200 11 -101.17 gain 11 201 -100.78 gain 201 11 -96.47 gain 11 202 -102.13 gain 202 11 -96.95 gain 11 203 -102.91 gain 203 11 -96.85 gain 11 204 -103.83 gain 204 11 -94.41 gain 11 205 -104.96 gain 205 11 -99.28 gain 11 206 -99.01 gain 206 11 -94.44 gain 11 207 -104.61 gain 207 11 -99.46 gain 11 208 -103.12 gain 208 11 -100.57 gain 11 209 -101.88 gain 209 11 -98.90 gain 11 210 -111.60 gain 210 11 -108.79 gain 11 211 -112.06 gain 211 11 -104.49 gain 11 212 -110.98 gain 212 11 -106.42 gain 11 213 -103.11 gain 213 11 -97.88 gain 11 214 -113.93 gain 214 11 -114.09 gain 11 215 -106.83 gain 215 11 -102.39 gain 11 216 -106.47 gain 216 11 -105.93 gain 11 217 -107.35 gain 217 11 -107.08 gain 11 218 -105.44 gain 218 11 -97.98 gain 11 219 -103.50 gain 219 11 -96.52 gain 11 220 -110.39 gain 220 11 -99.50 gain 11 221 -104.75 gain 221 11 -99.53 gain 11 222 -112.32 gain 222 11 -102.91 gain 11 223 -102.05 gain 223 11 -95.88 gain 11 224 -110.10 gain 224 11 -104.40 gain 12 13 -62.91 gain 13 12 -66.29 gain 12 14 -63.35 gain 14 12 -62.97 gain 12 15 -95.89 gain 15 12 -98.27 gain 12 16 -100.73 gain 16 12 -105.24 gain 12 17 -85.74 gain 17 12 -88.15 gain 12 18 -96.93 gain 18 12 -100.42 gain 12 19 -96.23 gain 19 12 -100.46 gain 12 20 -100.57 gain 20 12 -106.01 gain 12 21 -91.62 gain 21 12 -96.17 gain 12 22 -88.55 gain 22 12 -91.56 gain 12 23 -80.48 gain 23 12 -80.66 gain 12 24 -79.53 gain 24 12 -81.32 gain 12 25 -68.48 gain 25 12 -72.95 gain 12 26 -71.39 gain 26 12 -77.29 gain 12 27 -58.78 gain 27 12 -62.30 gain 12 28 -69.38 gain 28 12 -68.22 gain 12 29 -75.03 gain 29 12 -75.42 gain 12 30 -92.43 gain 30 12 -97.82 gain 12 31 -90.87 gain 31 12 -92.83 gain 12 32 -89.89 gain 32 12 -89.19 gain 12 33 -94.64 gain 33 12 -95.40 gain 12 34 -89.57 gain 34 12 -90.95 gain 12 35 -91.02 gain 35 12 -93.36 gain 12 36 -87.20 gain 36 12 -89.68 gain 12 37 -90.18 gain 37 12 -95.20 gain 12 38 -72.17 gain 38 12 -74.73 gain 12 39 -77.22 gain 39 12 -84.09 gain 12 40 -73.37 gain 40 12 -75.22 gain 12 41 -81.34 gain 41 12 -78.54 gain 12 42 -73.05 gain 42 12 -77.49 gain 12 43 -81.91 gain 43 12 -83.95 gain 12 44 -80.83 gain 44 12 -86.46 gain 12 45 -95.71 gain 45 12 -101.32 gain 12 46 -92.40 gain 46 12 -94.48 gain 12 47 -97.17 gain 47 12 -96.95 gain 12 48 -90.01 gain 48 12 -89.37 gain 12 49 -91.11 gain 49 12 -94.53 gain 12 50 -92.74 gain 50 12 -93.02 gain 12 51 -94.72 gain 51 12 -98.69 gain 12 52 -82.69 gain 52 12 -83.90 gain 12 53 -84.95 gain 53 12 -86.71 gain 12 54 -87.07 gain 54 12 -88.24 gain 12 55 -75.40 gain 55 12 -73.49 gain 12 56 -72.51 gain 56 12 -75.65 gain 12 57 -75.17 gain 57 12 -77.39 gain 12 58 -76.87 gain 58 12 -75.78 gain 12 59 -72.58 gain 59 12 -70.74 gain 12 60 -102.09 gain 60 12 -109.53 gain 12 61 -99.79 gain 61 12 -99.14 gain 12 62 -100.71 gain 62 12 -97.57 gain 12 63 -94.12 gain 63 12 -94.94 gain 12 64 -86.39 gain 64 12 -91.44 gain 12 65 -97.46 gain 65 12 -98.05 gain 12 66 -86.78 gain 66 12 -86.36 gain 12 67 -84.96 gain 67 12 -85.77 gain 12 68 -82.60 gain 68 12 -85.99 gain 12 69 -80.06 gain 69 12 -80.67 gain 12 70 -83.58 gain 70 12 -82.66 gain 12 71 -84.65 gain 71 12 -87.30 gain 12 72 -80.16 gain 72 12 -80.36 gain 12 73 -82.62 gain 73 12 -84.20 gain 12 74 -81.34 gain 74 12 -79.03 gain 12 75 -93.05 gain 75 12 -96.63 gain 12 76 -96.15 gain 76 12 -99.85 gain 12 77 -93.72 gain 77 12 -93.42 gain 12 78 -88.85 gain 78 12 -93.05 gain 12 79 -97.08 gain 79 12 -100.90 gain 12 80 -98.51 gain 80 12 -100.12 gain 12 81 -88.96 gain 81 12 -91.48 gain 12 82 -90.79 gain 82 12 -94.29 gain 12 83 -89.24 gain 83 12 -90.01 gain 12 84 -83.08 gain 84 12 -81.03 gain 12 85 -91.77 gain 85 12 -95.15 gain 12 86 -84.64 gain 86 12 -89.66 gain 12 87 -90.63 gain 87 12 -92.94 gain 12 88 -79.01 gain 88 12 -80.97 gain 12 89 -77.66 gain 89 12 -81.75 gain 12 90 -100.16 gain 90 12 -103.59 gain 12 91 -88.46 gain 91 12 -92.96 gain 12 92 -90.84 gain 92 12 -96.26 gain 12 93 -95.04 gain 93 12 -97.82 gain 12 94 -93.52 gain 94 12 -94.87 gain 12 95 -89.51 gain 95 12 -90.10 gain 12 96 -97.96 gain 96 12 -105.52 gain 12 97 -91.83 gain 97 12 -92.21 gain 12 98 -87.00 gain 98 12 -87.85 gain 12 99 -83.36 gain 99 12 -83.35 gain 12 100 -90.17 gain 100 12 -90.08 gain 12 101 -89.11 gain 101 12 -92.65 gain 12 102 -86.88 gain 102 12 -90.39 gain 12 103 -94.27 gain 103 12 -98.94 gain 12 104 -86.69 gain 104 12 -93.85 gain 12 105 -102.70 gain 105 12 -104.37 gain 12 106 -98.18 gain 106 12 -97.19 gain 12 107 -101.81 gain 107 12 -100.72 gain 12 108 -99.26 gain 108 12 -97.80 gain 12 109 -89.44 gain 109 12 -91.42 gain 12 110 -90.07 gain 110 12 -98.41 gain 12 111 -92.18 gain 111 12 -90.49 gain 12 112 -89.23 gain 112 12 -91.00 gain 12 113 -84.99 gain 113 12 -85.89 gain 12 114 -90.19 gain 114 12 -88.26 gain 12 115 -98.43 gain 115 12 -97.15 gain 12 116 -89.35 gain 116 12 -90.51 gain 12 117 -86.59 gain 117 12 -84.89 gain 12 118 -84.00 gain 118 12 -83.92 gain 12 119 -89.02 gain 119 12 -94.00 gain 12 120 -91.80 gain 120 12 -94.16 gain 12 121 -94.96 gain 121 12 -98.35 gain 12 122 -90.74 gain 122 12 -93.88 gain 12 123 -96.81 gain 123 12 -100.29 gain 12 124 -90.68 gain 124 12 -92.15 gain 12 125 -96.81 gain 125 12 -101.61 gain 12 126 -90.46 gain 126 12 -91.92 gain 12 127 -89.43 gain 127 12 -90.51 gain 12 128 -85.02 gain 128 12 -88.70 gain 12 129 -88.72 gain 129 12 -89.60 gain 12 130 -86.92 gain 130 12 -89.09 gain 12 131 -94.98 gain 131 12 -96.93 gain 12 132 -94.20 gain 132 12 -92.16 gain 12 133 -90.15 gain 133 12 -93.28 gain 12 134 -95.31 gain 134 12 -95.30 gain 12 135 -98.92 gain 135 12 -101.22 gain 12 136 -101.77 gain 136 12 -104.51 gain 12 137 -93.27 gain 137 12 -98.92 gain 12 138 -99.20 gain 138 12 -98.38 gain 12 139 -94.80 gain 139 12 -97.25 gain 12 140 -97.38 gain 140 12 -100.66 gain 12 141 -102.51 gain 141 12 -97.76 gain 12 142 -96.96 gain 142 12 -98.95 gain 12 143 -90.84 gain 143 12 -95.57 gain 12 144 -89.05 gain 144 12 -92.14 gain 12 145 -89.92 gain 145 12 -96.40 gain 12 146 -86.30 gain 146 12 -88.78 gain 12 147 -93.71 gain 147 12 -93.29 gain 12 148 -91.83 gain 148 12 -89.73 gain 12 149 -97.16 gain 149 12 -98.72 gain 12 150 -96.79 gain 150 12 -99.19 gain 12 151 -91.68 gain 151 12 -93.02 gain 12 152 -93.76 gain 152 12 -94.92 gain 12 153 -97.99 gain 153 12 -98.36 gain 12 154 -99.30 gain 154 12 -101.57 gain 12 155 -91.70 gain 155 12 -92.55 gain 12 156 -103.10 gain 156 12 -103.18 gain 12 157 -93.78 gain 157 12 -96.34 gain 12 158 -93.10 gain 158 12 -95.16 gain 12 159 -99.71 gain 159 12 -104.15 gain 12 160 -93.82 gain 160 12 -95.42 gain 12 161 -91.62 gain 161 12 -95.65 gain 12 162 -96.44 gain 162 12 -100.19 gain 12 163 -90.61 gain 163 12 -96.27 gain 12 164 -94.52 gain 164 12 -99.55 gain 12 165 -98.29 gain 165 12 -100.37 gain 12 166 -94.17 gain 166 12 -96.01 gain 12 167 -97.84 gain 167 12 -100.40 gain 12 168 -94.98 gain 168 12 -96.44 gain 12 169 -100.79 gain 169 12 -103.36 gain 12 170 -94.87 gain 170 12 -96.68 gain 12 171 -90.91 gain 171 12 -93.80 gain 12 172 -96.06 gain 172 12 -97.13 gain 12 173 -99.91 gain 173 12 -105.64 gain 12 174 -88.07 gain 174 12 -89.84 gain 12 175 -91.95 gain 175 12 -94.85 gain 12 176 -94.58 gain 176 12 -96.45 gain 12 177 -97.48 gain 177 12 -102.35 gain 12 178 -92.96 gain 178 12 -91.28 gain 12 179 -94.17 gain 179 12 -91.91 gain 12 180 -99.64 gain 180 12 -106.83 gain 12 181 -97.03 gain 181 12 -98.24 gain 12 182 -90.78 gain 182 12 -93.08 gain 12 183 -106.72 gain 183 12 -109.29 gain 12 184 -101.85 gain 184 12 -107.17 gain 12 185 -96.69 gain 185 12 -105.87 gain 12 186 -100.02 gain 186 12 -104.79 gain 12 187 -101.40 gain 187 12 -103.89 gain 12 188 -95.77 gain 188 12 -100.67 gain 12 189 -93.93 gain 189 12 -93.56 gain 12 190 -93.87 gain 190 12 -97.42 gain 12 191 -92.19 gain 191 12 -94.44 gain 12 192 -96.47 gain 192 12 -97.42 gain 12 193 -99.47 gain 193 12 -99.40 gain 12 194 -99.67 gain 194 12 -100.39 gain 12 195 -100.21 gain 195 12 -99.48 gain 12 196 -97.61 gain 196 12 -101.19 gain 12 197 -97.55 gain 197 12 -96.26 gain 12 198 -92.62 gain 198 12 -95.85 gain 12 199 -101.85 gain 199 12 -105.18 gain 12 200 -101.33 gain 200 12 -106.00 gain 12 201 -95.97 gain 201 12 -100.55 gain 12 202 -98.04 gain 202 12 -101.75 gain 12 203 -97.87 gain 203 12 -100.69 gain 12 204 -97.84 gain 204 12 -97.31 gain 12 205 -96.40 gain 205 12 -99.61 gain 12 206 -100.67 gain 206 12 -104.99 gain 12 207 -99.82 gain 207 12 -103.56 gain 12 208 -90.40 gain 208 12 -96.73 gain 12 209 -99.08 gain 209 12 -104.99 gain 12 210 -95.15 gain 210 12 -101.23 gain 12 211 -100.48 gain 211 12 -101.80 gain 12 212 -107.38 gain 212 12 -111.71 gain 12 213 -100.10 gain 213 12 -103.76 gain 12 214 -107.67 gain 214 12 -116.71 gain 12 215 -98.07 gain 215 12 -102.51 gain 12 216 -98.94 gain 216 12 -107.30 gain 12 217 -94.14 gain 217 12 -102.75 gain 12 218 -104.65 gain 218 12 -106.07 gain 12 219 -98.58 gain 219 12 -100.49 gain 12 220 -96.12 gain 220 12 -94.11 gain 12 221 -103.72 gain 221 12 -107.39 gain 12 222 -94.78 gain 222 12 -94.26 gain 12 223 -95.43 gain 223 12 -98.15 gain 12 224 -93.65 gain 224 12 -96.84 gain 13 14 -72.53 gain 14 13 -68.77 gain 13 15 -102.11 gain 15 13 -101.12 gain 13 16 -100.22 gain 16 13 -101.35 gain 13 17 -103.33 gain 17 13 -102.35 gain 13 18 -91.29 gain 18 13 -91.40 gain 13 19 -93.59 gain 19 13 -94.44 gain 13 20 -103.94 gain 20 13 -106.00 gain 13 21 -90.79 gain 21 13 -91.96 gain 13 22 -87.21 gain 22 13 -86.83 gain 13 23 -84.25 gain 23 13 -81.05 gain 13 24 -85.33 gain 24 13 -83.74 gain 13 25 -77.68 gain 25 13 -78.78 gain 13 26 -71.77 gain 26 13 -74.30 gain 13 27 -66.18 gain 27 13 -66.32 gain 13 28 -61.94 gain 28 13 -57.40 gain 13 29 -67.16 gain 29 13 -64.17 gain 13 30 -105.50 gain 30 13 -107.51 gain 13 31 -98.88 gain 31 13 -97.45 gain 13 32 -95.63 gain 32 13 -91.55 gain 13 33 -98.43 gain 33 13 -95.80 gain 13 34 -89.91 gain 34 13 -87.92 gain 13 35 -101.47 gain 35 13 -100.43 gain 13 36 -90.49 gain 36 13 -89.59 gain 13 37 -89.64 gain 37 13 -91.28 gain 13 38 -79.95 gain 38 13 -79.12 gain 13 39 -87.26 gain 39 13 -90.75 gain 13 40 -87.85 gain 40 13 -86.32 gain 13 41 -81.94 gain 41 13 -75.76 gain 13 42 -85.72 gain 42 13 -86.79 gain 13 43 -73.23 gain 43 13 -71.89 gain 13 44 -80.09 gain 44 13 -82.34 gain 13 45 -104.23 gain 45 13 -106.46 gain 13 46 -98.70 gain 46 13 -97.39 gain 13 47 -97.18 gain 47 13 -93.58 gain 13 48 -101.87 gain 48 13 -97.84 gain 13 49 -87.51 gain 49 13 -87.55 gain 13 50 -96.94 gain 50 13 -93.84 gain 13 51 -88.48 gain 51 13 -89.07 gain 13 52 -93.82 gain 52 13 -91.65 gain 13 53 -90.30 gain 53 13 -88.68 gain 13 54 -91.20 gain 54 13 -88.99 gain 13 55 -85.27 gain 55 13 -79.98 gain 13 56 -83.94 gain 56 13 -83.70 gain 13 57 -80.87 gain 57 13 -79.70 gain 13 58 -87.83 gain 58 13 -83.36 gain 13 59 -83.92 gain 59 13 -78.70 gain 13 60 -104.10 gain 60 13 -108.16 gain 13 61 -97.60 gain 61 13 -93.57 gain 13 62 -89.28 gain 62 13 -82.76 gain 13 63 -94.21 gain 63 13 -91.65 gain 13 64 -95.68 gain 64 13 -97.35 gain 13 65 -89.64 gain 65 13 -86.85 gain 13 66 -94.15 gain 66 13 -90.35 gain 13 67 -85.85 gain 67 13 -83.27 gain 13 68 -89.29 gain 68 13 -89.31 gain 13 69 -83.80 gain 69 13 -81.04 gain 13 70 -86.85 gain 70 13 -82.55 gain 13 71 -81.80 gain 71 13 -81.07 gain 13 72 -87.75 gain 72 13 -84.57 gain 13 73 -87.98 gain 73 13 -86.18 gain 13 74 -85.98 gain 74 13 -80.29 gain 13 75 -106.51 gain 75 13 -106.71 gain 13 76 -97.85 gain 76 13 -98.18 gain 13 77 -102.35 gain 77 13 -98.67 gain 13 78 -99.57 gain 78 13 -100.39 gain 13 79 -93.86 gain 79 13 -94.31 gain 13 80 -92.71 gain 80 13 -90.94 gain 13 81 -95.32 gain 81 13 -94.46 gain 13 82 -100.43 gain 82 13 -100.55 gain 13 83 -82.19 gain 83 13 -79.58 gain 13 84 -92.52 gain 84 13 -87.10 gain 13 85 -91.72 gain 85 13 -91.73 gain 13 86 -84.58 gain 86 13 -86.23 gain 13 87 -90.10 gain 87 13 -89.04 gain 13 88 -89.31 gain 88 13 -87.89 gain 13 89 -87.90 gain 89 13 -88.62 gain 13 90 -94.08 gain 90 13 -94.14 gain 13 91 -105.86 gain 91 13 -106.98 gain 13 92 -94.26 gain 92 13 -96.30 gain 13 93 -97.72 gain 93 13 -97.13 gain 13 94 -107.81 gain 94 13 -105.78 gain 13 95 -91.18 gain 95 13 -88.39 gain 13 96 -92.00 gain 96 13 -96.19 gain 13 97 -100.89 gain 97 13 -97.90 gain 13 98 -94.19 gain 98 13 -91.67 gain 13 99 -99.99 gain 99 13 -96.60 gain 13 100 -88.26 gain 100 13 -84.79 gain 13 101 -96.06 gain 101 13 -96.22 gain 13 102 -93.08 gain 102 13 -93.20 gain 13 103 -90.61 gain 103 13 -91.90 gain 13 104 -87.65 gain 104 13 -91.43 gain 13 105 -103.10 gain 105 13 -101.40 gain 13 106 -98.50 gain 106 13 -94.13 gain 13 107 -102.79 gain 107 13 -98.32 gain 13 108 -102.36 gain 108 13 -97.51 gain 13 109 -94.56 gain 109 13 -93.16 gain 13 110 -93.68 gain 110 13 -98.65 gain 13 111 -99.53 gain 111 13 -94.46 gain 13 112 -97.15 gain 112 13 -95.54 gain 13 113 -95.74 gain 113 13 -93.26 gain 13 114 -94.32 gain 114 13 -89.01 gain 13 115 -97.81 gain 115 13 -93.15 gain 13 116 -83.09 gain 116 13 -80.87 gain 13 117 -92.02 gain 117 13 -86.95 gain 13 118 -90.13 gain 118 13 -86.67 gain 13 119 -99.17 gain 119 13 -100.77 gain 13 120 -96.90 gain 120 13 -95.89 gain 13 121 -96.78 gain 121 13 -96.79 gain 13 122 -96.37 gain 122 13 -96.13 gain 13 123 -97.33 gain 123 13 -97.43 gain 13 124 -97.30 gain 124 13 -95.38 gain 13 125 -103.35 gain 125 13 -104.78 gain 13 126 -96.53 gain 126 13 -94.60 gain 13 127 -99.54 gain 127 13 -97.23 gain 13 128 -99.81 gain 128 13 -100.11 gain 13 129 -99.91 gain 129 13 -97.42 gain 13 130 -93.12 gain 130 13 -91.92 gain 13 131 -90.81 gain 131 13 -89.38 gain 13 132 -89.69 gain 132 13 -84.27 gain 13 133 -91.90 gain 133 13 -91.65 gain 13 134 -102.32 gain 134 13 -98.94 gain 13 135 -98.14 gain 135 13 -97.06 gain 13 136 -98.12 gain 136 13 -97.48 gain 13 137 -108.55 gain 137 13 -110.82 gain 13 138 -98.69 gain 138 13 -94.49 gain 13 139 -104.76 gain 139 13 -103.83 gain 13 140 -101.08 gain 140 13 -100.98 gain 13 141 -95.67 gain 141 13 -87.54 gain 13 142 -98.17 gain 142 13 -96.78 gain 13 143 -103.20 gain 143 13 -104.55 gain 13 144 -97.68 gain 144 13 -97.39 gain 13 145 -100.84 gain 145 13 -103.94 gain 13 146 -96.20 gain 146 13 -95.29 gain 13 147 -101.47 gain 147 13 -97.67 gain 13 148 -98.06 gain 148 13 -92.59 gain 13 149 -102.17 gain 149 13 -100.36 gain 13 150 -106.84 gain 150 13 -105.86 gain 13 151 -104.50 gain 151 13 -102.47 gain 13 152 -100.17 gain 152 13 -97.95 gain 13 153 -102.95 gain 153 13 -99.94 gain 13 154 -100.20 gain 154 13 -99.10 gain 13 155 -106.79 gain 155 13 -104.25 gain 13 156 -98.80 gain 156 13 -95.50 gain 13 157 -104.49 gain 157 13 -103.67 gain 13 158 -99.25 gain 158 13 -97.93 gain 13 159 -96.20 gain 159 13 -97.26 gain 13 160 -94.61 gain 160 13 -92.83 gain 13 161 -99.76 gain 161 13 -100.41 gain 13 162 -95.43 gain 162 13 -95.80 gain 13 163 -94.98 gain 163 13 -97.26 gain 13 164 -99.96 gain 164 13 -101.61 gain 13 165 -105.57 gain 165 13 -104.28 gain 13 166 -97.35 gain 166 13 -95.81 gain 13 167 -100.93 gain 167 13 -100.11 gain 13 168 -100.96 gain 168 13 -99.04 gain 13 169 -94.34 gain 169 13 -93.53 gain 13 170 -101.66 gain 170 13 -100.09 gain 13 171 -101.02 gain 171 13 -100.53 gain 13 172 -98.20 gain 172 13 -95.90 gain 13 173 -96.56 gain 173 13 -98.91 gain 13 174 -106.31 gain 174 13 -104.70 gain 13 175 -100.01 gain 175 13 -99.53 gain 13 176 -94.33 gain 176 13 -92.83 gain 13 177 -100.53 gain 177 13 -102.03 gain 13 178 -95.00 gain 178 13 -89.94 gain 13 179 -103.32 gain 179 13 -97.68 gain 13 180 -102.14 gain 180 13 -105.95 gain 13 181 -103.85 gain 181 13 -101.68 gain 13 182 -100.74 gain 182 13 -99.66 gain 13 183 -102.57 gain 183 13 -101.76 gain 13 184 -103.75 gain 184 13 -105.69 gain 13 185 -103.25 gain 185 13 -109.05 gain 13 186 -102.87 gain 186 13 -104.25 gain 13 187 -100.94 gain 187 13 -100.05 gain 13 188 -93.89 gain 188 13 -95.41 gain 13 189 -98.99 gain 189 13 -95.24 gain 13 190 -96.65 gain 190 13 -96.82 gain 13 191 -100.49 gain 191 13 -99.36 gain 13 192 -96.67 gain 192 13 -94.24 gain 13 193 -90.01 gain 193 13 -86.56 gain 13 194 -92.51 gain 194 13 -89.85 gain 13 195 -103.26 gain 195 13 -99.15 gain 13 196 -100.62 gain 196 13 -100.82 gain 13 197 -98.42 gain 197 13 -93.75 gain 13 198 -104.17 gain 198 13 -104.01 gain 13 199 -97.02 gain 199 13 -96.97 gain 13 200 -105.66 gain 200 13 -106.95 gain 13 201 -88.27 gain 201 13 -89.46 gain 13 202 -99.57 gain 202 13 -99.90 gain 13 203 -97.74 gain 203 13 -97.19 gain 13 204 -100.38 gain 204 13 -96.47 gain 13 205 -95.05 gain 205 13 -94.88 gain 13 206 -98.71 gain 206 13 -99.65 gain 13 207 -91.78 gain 207 13 -92.13 gain 13 208 -96.12 gain 208 13 -99.07 gain 13 209 -102.36 gain 209 13 -104.89 gain 13 210 -98.81 gain 210 13 -101.52 gain 13 211 -98.40 gain 211 13 -96.33 gain 13 212 -109.27 gain 212 13 -110.21 gain 13 213 -104.27 gain 213 13 -104.54 gain 13 214 -96.85 gain 214 13 -102.51 gain 13 215 -102.25 gain 215 13 -103.31 gain 13 216 -100.38 gain 216 13 -105.35 gain 13 217 -100.84 gain 217 13 -106.07 gain 13 218 -109.93 gain 218 13 -107.97 gain 13 219 -93.54 gain 219 13 -92.07 gain 13 220 -101.16 gain 220 13 -95.77 gain 13 221 -101.73 gain 221 13 -102.02 gain 13 222 -104.47 gain 222 13 -100.56 gain 13 223 -99.81 gain 223 13 -99.14 gain 13 224 -96.88 gain 224 13 -96.69 gain 14 15 -91.81 gain 15 14 -94.58 gain 14 16 -99.37 gain 16 14 -104.27 gain 14 17 -95.52 gain 17 14 -98.31 gain 14 18 -91.41 gain 18 14 -95.28 gain 14 19 -89.75 gain 19 14 -94.36 gain 14 20 -86.27 gain 20 14 -92.09 gain 14 21 -90.67 gain 21 14 -95.59 gain 14 22 -92.06 gain 22 14 -95.45 gain 14 23 -93.18 gain 23 14 -93.73 gain 14 24 -90.18 gain 24 14 -92.35 gain 14 25 -83.93 gain 25 14 -88.78 gain 14 26 -73.09 gain 26 14 -79.37 gain 14 27 -68.77 gain 27 14 -72.66 gain 14 28 -67.27 gain 28 14 -66.49 gain 14 29 -65.81 gain 29 14 -66.58 gain 14 30 -96.45 gain 30 14 -102.22 gain 14 31 -100.02 gain 31 14 -102.35 gain 14 32 -93.72 gain 32 14 -93.40 gain 14 33 -91.12 gain 33 14 -92.26 gain 14 34 -90.56 gain 34 14 -92.33 gain 14 35 -89.60 gain 35 14 -92.31 gain 14 36 -90.31 gain 36 14 -93.17 gain 14 37 -84.99 gain 37 14 -90.39 gain 14 38 -85.28 gain 38 14 -88.21 gain 14 39 -82.88 gain 39 14 -90.13 gain 14 40 -80.94 gain 40 14 -83.17 gain 14 41 -83.68 gain 41 14 -81.26 gain 14 42 -73.39 gain 42 14 -78.21 gain 14 43 -75.98 gain 43 14 -78.40 gain 14 44 -74.06 gain 44 14 -80.07 gain 14 45 -97.48 gain 45 14 -103.47 gain 14 46 -99.05 gain 46 14 -101.51 gain 14 47 -95.11 gain 47 14 -95.27 gain 14 48 -89.67 gain 48 14 -89.41 gain 14 49 -85.46 gain 49 14 -89.26 gain 14 50 -85.70 gain 50 14 -86.36 gain 14 51 -94.63 gain 51 14 -98.98 gain 14 52 -89.17 gain 52 14 -90.76 gain 14 53 -87.94 gain 53 14 -90.08 gain 14 54 -83.23 gain 54 14 -84.78 gain 14 55 -82.00 gain 55 14 -80.46 gain 14 56 -77.08 gain 56 14 -80.59 gain 14 57 -78.19 gain 57 14 -80.79 gain 14 58 -73.71 gain 58 14 -73.00 gain 14 59 -78.37 gain 59 14 -76.91 gain 14 60 -102.15 gain 60 14 -109.97 gain 14 61 -92.73 gain 61 14 -92.46 gain 14 62 -97.33 gain 62 14 -94.57 gain 14 63 -90.56 gain 63 14 -91.76 gain 14 64 -96.00 gain 64 14 -101.43 gain 14 65 -96.53 gain 65 14 -97.51 gain 14 66 -90.29 gain 66 14 -90.25 gain 14 67 -85.54 gain 67 14 -86.73 gain 14 68 -87.11 gain 68 14 -90.89 gain 14 69 -92.49 gain 69 14 -93.48 gain 14 70 -82.67 gain 70 14 -82.13 gain 14 71 -83.26 gain 71 14 -86.29 gain 14 72 -82.10 gain 72 14 -82.69 gain 14 73 -83.51 gain 73 14 -85.47 gain 14 74 -79.24 gain 74 14 -77.31 gain 14 75 -97.64 gain 75 14 -101.60 gain 14 76 -96.08 gain 76 14 -100.16 gain 14 77 -97.02 gain 77 14 -97.10 gain 14 78 -100.92 gain 78 14 -105.50 gain 14 79 -90.62 gain 79 14 -94.82 gain 14 80 -94.18 gain 80 14 -96.17 gain 14 81 -87.17 gain 81 14 -90.07 gain 14 82 -89.15 gain 82 14 -93.03 gain 14 83 -84.86 gain 83 14 -86.01 gain 14 84 -84.74 gain 84 14 -83.08 gain 14 85 -91.55 gain 85 14 -95.32 gain 14 86 -86.22 gain 86 14 -91.62 gain 14 87 -82.38 gain 87 14 -85.07 gain 14 88 -83.05 gain 88 14 -85.39 gain 14 89 -86.35 gain 89 14 -90.83 gain 14 90 -97.07 gain 90 14 -100.89 gain 14 91 -103.54 gain 91 14 -108.43 gain 14 92 -96.14 gain 92 14 -101.95 gain 14 93 -95.59 gain 93 14 -98.76 gain 14 94 -95.85 gain 94 14 -97.58 gain 14 95 -84.81 gain 95 14 -85.78 gain 14 96 -91.40 gain 96 14 -99.35 gain 14 97 -90.41 gain 97 14 -91.18 gain 14 98 -94.63 gain 98 14 -95.87 gain 14 99 -98.53 gain 99 14 -98.91 gain 14 100 -92.08 gain 100 14 -92.37 gain 14 101 -89.49 gain 101 14 -93.41 gain 14 102 -85.58 gain 102 14 -89.46 gain 14 103 -89.46 gain 103 14 -94.52 gain 14 104 -82.14 gain 104 14 -89.67 gain 14 105 -92.74 gain 105 14 -94.80 gain 14 106 -105.21 gain 106 14 -104.60 gain 14 107 -96.50 gain 107 14 -95.79 gain 14 108 -95.08 gain 108 14 -93.99 gain 14 109 -91.20 gain 109 14 -93.56 gain 14 110 -93.72 gain 110 14 -102.44 gain 14 111 -93.61 gain 111 14 -92.31 gain 14 112 -87.13 gain 112 14 -89.28 gain 14 113 -99.13 gain 113 14 -100.41 gain 14 114 -84.09 gain 114 14 -82.54 gain 14 115 -86.03 gain 115 14 -85.14 gain 14 116 -85.27 gain 116 14 -86.81 gain 14 117 -86.78 gain 117 14 -85.46 gain 14 118 -88.49 gain 118 14 -88.79 gain 14 119 -90.88 gain 119 14 -96.24 gain 14 120 -99.71 gain 120 14 -102.46 gain 14 121 -93.10 gain 121 14 -96.87 gain 14 122 -96.09 gain 122 14 -99.61 gain 14 123 -100.89 gain 123 14 -104.74 gain 14 124 -96.91 gain 124 14 -98.75 gain 14 125 -91.64 gain 125 14 -96.83 gain 14 126 -98.61 gain 126 14 -100.44 gain 14 127 -97.77 gain 127 14 -99.23 gain 14 128 -99.74 gain 128 14 -103.79 gain 14 129 -94.08 gain 129 14 -95.35 gain 14 130 -92.91 gain 130 14 -95.47 gain 14 131 -85.30 gain 131 14 -87.63 gain 14 132 -90.04 gain 132 14 -88.38 gain 14 133 -86.41 gain 133 14 -89.92 gain 14 134 -84.07 gain 134 14 -84.45 gain 14 135 -102.62 gain 135 14 -105.30 gain 14 136 -100.21 gain 136 14 -103.33 gain 14 137 -97.23 gain 137 14 -103.27 gain 14 138 -99.91 gain 138 14 -99.47 gain 14 139 -96.65 gain 139 14 -99.48 gain 14 140 -90.95 gain 140 14 -94.61 gain 14 141 -100.87 gain 141 14 -96.50 gain 14 142 -93.26 gain 142 14 -95.63 gain 14 143 -91.87 gain 143 14 -96.99 gain 14 144 -93.55 gain 144 14 -97.02 gain 14 145 -88.93 gain 145 14 -95.79 gain 14 146 -91.13 gain 146 14 -93.98 gain 14 147 -89.18 gain 147 14 -89.14 gain 14 148 -91.49 gain 148 14 -89.78 gain 14 149 -89.87 gain 149 14 -91.82 gain 14 150 -105.49 gain 150 14 -108.27 gain 14 151 -104.50 gain 151 14 -106.23 gain 14 152 -98.90 gain 152 14 -100.44 gain 14 153 -102.05 gain 153 14 -102.80 gain 14 154 -101.01 gain 154 14 -103.66 gain 14 155 -91.68 gain 155 14 -92.91 gain 14 156 -100.73 gain 156 14 -101.19 gain 14 157 -94.41 gain 157 14 -97.35 gain 14 158 -104.61 gain 158 14 -107.05 gain 14 159 -94.75 gain 159 14 -99.57 gain 14 160 -94.13 gain 160 14 -96.10 gain 14 161 -96.79 gain 161 14 -101.20 gain 14 162 -98.55 gain 162 14 -102.68 gain 14 163 -88.43 gain 163 14 -94.48 gain 14 164 -93.55 gain 164 14 -98.96 gain 14 165 -97.15 gain 165 14 -99.62 gain 14 166 -99.58 gain 166 14 -101.80 gain 14 167 -103.16 gain 167 14 -106.11 gain 14 168 -102.86 gain 168 14 -104.70 gain 14 169 -99.02 gain 169 14 -101.97 gain 14 170 -102.13 gain 170 14 -104.32 gain 14 171 -94.72 gain 171 14 -97.99 gain 14 172 -96.84 gain 172 14 -98.30 gain 14 173 -93.84 gain 173 14 -99.94 gain 14 174 -92.23 gain 174 14 -94.38 gain 14 175 -88.77 gain 175 14 -92.06 gain 14 176 -96.05 gain 176 14 -98.30 gain 14 177 -94.51 gain 177 14 -99.76 gain 14 178 -86.09 gain 178 14 -84.79 gain 14 179 -83.99 gain 179 14 -82.11 gain 14 180 -100.30 gain 180 14 -107.87 gain 14 181 -98.06 gain 181 14 -99.65 gain 14 182 -104.01 gain 182 14 -106.68 gain 14 183 -96.46 gain 183 14 -99.41 gain 14 184 -102.26 gain 184 14 -107.96 gain 14 185 -93.83 gain 185 14 -103.40 gain 14 186 -94.18 gain 186 14 -99.33 gain 14 187 -98.42 gain 187 14 -101.30 gain 14 188 -100.58 gain 188 14 -105.87 gain 14 189 -90.88 gain 189 14 -90.90 gain 14 190 -98.17 gain 190 14 -102.10 gain 14 191 -102.53 gain 191 14 -105.16 gain 14 192 -92.39 gain 192 14 -93.72 gain 14 193 -91.60 gain 193 14 -91.92 gain 14 194 -96.42 gain 194 14 -97.52 gain 14 195 -105.28 gain 195 14 -104.93 gain 14 196 -103.65 gain 196 14 -107.61 gain 14 197 -105.11 gain 197 14 -104.20 gain 14 198 -101.40 gain 198 14 -105.00 gain 14 199 -90.17 gain 199 14 -93.88 gain 14 200 -93.00 gain 200 14 -98.04 gain 14 201 -98.09 gain 201 14 -103.04 gain 14 202 -103.98 gain 202 14 -108.07 gain 14 203 -90.14 gain 203 14 -93.35 gain 14 204 -94.55 gain 204 14 -94.39 gain 14 205 -94.01 gain 205 14 -97.60 gain 14 206 -99.44 gain 206 14 -104.13 gain 14 207 -97.99 gain 207 14 -102.10 gain 14 208 -103.50 gain 208 14 -110.22 gain 14 209 -102.25 gain 209 14 -108.53 gain 14 210 -99.34 gain 210 14 -105.80 gain 14 211 -96.94 gain 211 14 -98.64 gain 14 212 -99.95 gain 212 14 -104.66 gain 14 213 -101.27 gain 213 14 -105.30 gain 14 214 -98.72 gain 214 14 -108.14 gain 14 215 -102.36 gain 215 14 -107.18 gain 14 216 -104.13 gain 216 14 -112.86 gain 14 217 -93.75 gain 217 14 -102.75 gain 14 218 -103.85 gain 218 14 -105.65 gain 14 219 -99.86 gain 219 14 -102.14 gain 14 220 -91.69 gain 220 14 -90.06 gain 14 221 -99.29 gain 221 14 -103.34 gain 14 222 -95.31 gain 222 14 -95.16 gain 14 223 -96.85 gain 223 14 -99.95 gain 14 224 -94.48 gain 224 14 -98.05 gain 15 16 -65.56 gain 16 15 -67.68 gain 15 17 -78.52 gain 17 15 -78.54 gain 15 18 -76.75 gain 18 15 -77.86 gain 15 19 -93.55 gain 19 15 -95.40 gain 15 20 -90.75 gain 20 15 -93.80 gain 15 21 -88.51 gain 21 15 -90.67 gain 15 22 -87.69 gain 22 15 -88.31 gain 15 23 -91.98 gain 23 15 -89.77 gain 15 24 -92.59 gain 24 15 -92.00 gain 15 25 -87.69 gain 25 15 -89.78 gain 15 26 -97.84 gain 26 15 -101.36 gain 15 27 -96.79 gain 27 15 -97.92 gain 15 28 -101.04 gain 28 15 -97.49 gain 15 29 -101.61 gain 29 15 -99.62 gain 15 30 -70.70 gain 30 15 -73.71 gain 15 31 -70.38 gain 31 15 -69.95 gain 15 32 -77.23 gain 32 15 -74.16 gain 15 33 -82.27 gain 33 15 -80.64 gain 15 34 -86.96 gain 34 15 -85.97 gain 15 35 -79.43 gain 35 15 -79.38 gain 15 36 -83.02 gain 36 15 -83.12 gain 15 37 -89.66 gain 37 15 -92.29 gain 15 38 -96.36 gain 38 15 -96.53 gain 15 39 -94.49 gain 39 15 -98.98 gain 15 40 -92.25 gain 40 15 -91.72 gain 15 41 -99.54 gain 41 15 -94.36 gain 15 42 -92.54 gain 42 15 -94.61 gain 15 43 -97.40 gain 43 15 -97.06 gain 15 44 -99.78 gain 44 15 -103.02 gain 15 45 -68.56 gain 45 15 -71.79 gain 15 46 -74.38 gain 46 15 -74.07 gain 15 47 -83.35 gain 47 15 -80.74 gain 15 48 -79.50 gain 48 15 -76.47 gain 15 49 -89.85 gain 49 15 -90.88 gain 15 50 -87.83 gain 50 15 -85.72 gain 15 51 -91.60 gain 51 15 -93.18 gain 15 52 -86.08 gain 52 15 -84.90 gain 15 53 -89.06 gain 53 15 -88.44 gain 15 54 -91.94 gain 54 15 -90.73 gain 15 55 -92.69 gain 55 15 -88.39 gain 15 56 -91.02 gain 56 15 -91.77 gain 15 57 -101.69 gain 57 15 -101.52 gain 15 58 -100.91 gain 58 15 -97.44 gain 15 59 -99.43 gain 59 15 -95.21 gain 15 60 -73.76 gain 60 15 -78.82 gain 15 61 -79.54 gain 61 15 -76.50 gain 15 62 -86.33 gain 62 15 -80.80 gain 15 63 -85.30 gain 63 15 -83.74 gain 15 64 -88.00 gain 64 15 -90.67 gain 15 65 -72.79 gain 65 15 -71.00 gain 15 66 -94.63 gain 66 15 -91.83 gain 15 67 -87.89 gain 67 15 -86.32 gain 15 68 -95.92 gain 68 15 -96.93 gain 15 69 -91.23 gain 69 15 -89.46 gain 15 70 -91.87 gain 70 15 -88.56 gain 15 71 -93.11 gain 71 15 -93.37 gain 15 72 -102.47 gain 72 15 -100.29 gain 15 73 -95.92 gain 73 15 -95.11 gain 15 74 -94.64 gain 74 15 -89.94 gain 15 75 -89.82 gain 75 15 -91.01 gain 15 76 -89.80 gain 76 15 -91.12 gain 15 77 -83.42 gain 77 15 -80.74 gain 15 78 -82.96 gain 78 15 -84.78 gain 15 79 -92.15 gain 79 15 -93.59 gain 15 80 -86.82 gain 80 15 -86.05 gain 15 81 -88.62 gain 81 15 -88.76 gain 15 82 -91.48 gain 82 15 -92.60 gain 15 83 -94.33 gain 83 15 -92.71 gain 15 84 -91.27 gain 84 15 -86.85 gain 15 85 -97.89 gain 85 15 -98.89 gain 15 86 -105.04 gain 86 15 -107.68 gain 15 87 -95.42 gain 87 15 -95.34 gain 15 88 -98.36 gain 88 15 -97.93 gain 15 89 -98.44 gain 89 15 -100.15 gain 15 90 -80.83 gain 90 15 -81.88 gain 15 91 -91.23 gain 91 15 -93.35 gain 15 92 -87.56 gain 92 15 -90.60 gain 15 93 -85.58 gain 93 15 -85.98 gain 15 94 -94.58 gain 94 15 -93.55 gain 15 95 -92.95 gain 95 15 -91.15 gain 15 96 -94.75 gain 96 15 -99.93 gain 15 97 -99.14 gain 97 15 -97.14 gain 15 98 -93.97 gain 98 15 -92.44 gain 15 99 -93.45 gain 99 15 -91.06 gain 15 100 -94.96 gain 100 15 -92.48 gain 15 101 -97.72 gain 101 15 -98.88 gain 15 102 -97.81 gain 102 15 -98.92 gain 15 103 -94.03 gain 103 15 -96.32 gain 15 104 -99.80 gain 104 15 -104.57 gain 15 105 -87.42 gain 105 15 -86.71 gain 15 106 -83.76 gain 106 15 -80.38 gain 15 107 -97.84 gain 107 15 -94.37 gain 15 108 -90.04 gain 108 15 -86.19 gain 15 109 -89.70 gain 109 15 -89.30 gain 15 110 -90.07 gain 110 15 -96.03 gain 15 111 -99.00 gain 111 15 -94.92 gain 15 112 -97.18 gain 112 15 -96.57 gain 15 113 -92.55 gain 113 15 -91.06 gain 15 114 -97.10 gain 114 15 -92.78 gain 15 115 -96.37 gain 115 15 -92.71 gain 15 116 -95.20 gain 116 15 -93.97 gain 15 117 -102.86 gain 117 15 -98.78 gain 15 118 -97.68 gain 118 15 -95.21 gain 15 119 -106.04 gain 119 15 -108.63 gain 15 120 -92.04 gain 120 15 -92.02 gain 15 121 -89.65 gain 121 15 -90.65 gain 15 122 -96.76 gain 122 15 -97.51 gain 15 123 -94.78 gain 123 15 -95.87 gain 15 124 -87.88 gain 124 15 -86.96 gain 15 125 -93.85 gain 125 15 -96.27 gain 15 126 -91.11 gain 126 15 -90.18 gain 15 127 -97.59 gain 127 15 -96.28 gain 15 128 -98.40 gain 128 15 -99.69 gain 15 129 -101.75 gain 129 15 -100.25 gain 15 130 -99.95 gain 130 15 -99.74 gain 15 131 -95.63 gain 131 15 -95.19 gain 15 132 -100.74 gain 132 15 -96.31 gain 15 133 -102.29 gain 133 15 -103.04 gain 15 134 -103.69 gain 134 15 -101.30 gain 15 135 -90.17 gain 135 15 -90.09 gain 15 136 -96.67 gain 136 15 -97.02 gain 15 137 -97.63 gain 137 15 -100.89 gain 15 138 -99.97 gain 138 15 -96.77 gain 15 139 -94.47 gain 139 15 -94.54 gain 15 140 -94.92 gain 140 15 -95.82 gain 15 141 -94.80 gain 141 15 -87.66 gain 15 142 -93.64 gain 142 15 -93.25 gain 15 143 -95.48 gain 143 15 -97.82 gain 15 144 -97.85 gain 144 15 -98.56 gain 15 145 -104.26 gain 145 15 -108.36 gain 15 146 -97.64 gain 146 15 -97.73 gain 15 147 -96.82 gain 147 15 -94.01 gain 15 148 -103.09 gain 148 15 -98.61 gain 15 149 -99.81 gain 149 15 -98.99 gain 15 150 -96.27 gain 150 15 -96.29 gain 15 151 -89.77 gain 151 15 -88.72 gain 15 152 -96.52 gain 152 15 -95.30 gain 15 153 -92.42 gain 153 15 -90.41 gain 15 154 -95.36 gain 154 15 -95.25 gain 15 155 -98.62 gain 155 15 -97.08 gain 15 156 -93.60 gain 156 15 -91.29 gain 15 157 -101.37 gain 157 15 -101.54 gain 15 158 -95.83 gain 158 15 -95.51 gain 15 159 -102.16 gain 159 15 -104.22 gain 15 160 -99.99 gain 160 15 -99.20 gain 15 161 -101.42 gain 161 15 -103.07 gain 15 162 -99.28 gain 162 15 -100.64 gain 15 163 -104.51 gain 163 15 -107.79 gain 15 164 -105.77 gain 164 15 -108.42 gain 15 165 -94.86 gain 165 15 -94.56 gain 15 166 -94.51 gain 166 15 -93.97 gain 15 167 -94.84 gain 167 15 -95.02 gain 15 168 -99.79 gain 168 15 -98.86 gain 15 169 -95.29 gain 169 15 -95.48 gain 15 170 -96.03 gain 170 15 -95.46 gain 15 171 -101.50 gain 171 15 -102.01 gain 15 172 -87.52 gain 172 15 -86.21 gain 15 173 -97.86 gain 173 15 -101.20 gain 15 174 -96.21 gain 174 15 -95.59 gain 15 175 -100.00 gain 175 15 -100.52 gain 15 176 -102.00 gain 176 15 -101.49 gain 15 177 -108.83 gain 177 15 -111.33 gain 15 178 -102.19 gain 178 15 -98.13 gain 15 179 -106.53 gain 179 15 -101.88 gain 15 180 -96.18 gain 180 15 -100.98 gain 15 181 -99.17 gain 181 15 -98.00 gain 15 182 -97.79 gain 182 15 -97.70 gain 15 183 -92.23 gain 183 15 -92.42 gain 15 184 -98.00 gain 184 15 -100.93 gain 15 185 -97.70 gain 185 15 -104.50 gain 15 186 -102.94 gain 186 15 -105.32 gain 15 187 -100.02 gain 187 15 -100.13 gain 15 188 -97.82 gain 188 15 -100.34 gain 15 189 -97.67 gain 189 15 -94.92 gain 15 190 -100.22 gain 190 15 -101.38 gain 15 191 -109.02 gain 191 15 -108.89 gain 15 192 -104.14 gain 192 15 -102.70 gain 15 193 -107.21 gain 193 15 -104.76 gain 15 194 -108.70 gain 194 15 -107.04 gain 15 195 -93.77 gain 195 15 -90.65 gain 15 196 -97.38 gain 196 15 -98.57 gain 15 197 -98.59 gain 197 15 -94.92 gain 15 198 -98.69 gain 198 15 -99.53 gain 15 199 -94.31 gain 199 15 -95.26 gain 15 200 -94.20 gain 200 15 -96.49 gain 15 201 -93.30 gain 201 15 -95.49 gain 15 202 -103.91 gain 202 15 -105.24 gain 15 203 -92.59 gain 203 15 -93.03 gain 15 204 -99.55 gain 204 15 -96.63 gain 15 205 -107.25 gain 205 15 -108.07 gain 15 206 -102.91 gain 206 15 -104.84 gain 15 207 -104.28 gain 207 15 -105.63 gain 15 208 -106.04 gain 208 15 -109.99 gain 15 209 -101.46 gain 209 15 -104.99 gain 15 210 -102.08 gain 210 15 -105.77 gain 15 211 -95.78 gain 211 15 -94.71 gain 15 212 -93.85 gain 212 15 -95.79 gain 15 213 -102.49 gain 213 15 -103.75 gain 15 214 -93.03 gain 214 15 -99.69 gain 15 215 -102.08 gain 215 15 -104.14 gain 15 216 -96.54 gain 216 15 -102.51 gain 15 217 -101.75 gain 217 15 -107.98 gain 15 218 -98.86 gain 218 15 -97.89 gain 15 219 -97.99 gain 219 15 -97.51 gain 15 220 -106.66 gain 220 15 -102.26 gain 15 221 -103.93 gain 221 15 -105.21 gain 15 222 -104.96 gain 222 15 -102.05 gain 15 223 -98.82 gain 223 15 -99.15 gain 15 224 -94.01 gain 224 15 -94.81 gain 16 17 -67.84 gain 17 16 -65.73 gain 16 18 -74.73 gain 18 16 -73.71 gain 16 19 -78.96 gain 19 16 -78.67 gain 16 20 -77.90 gain 20 16 -78.82 gain 16 21 -92.90 gain 21 16 -92.93 gain 16 22 -84.84 gain 22 16 -83.33 gain 16 23 -102.98 gain 23 16 -98.64 gain 16 24 -93.78 gain 24 16 -91.06 gain 16 25 -98.03 gain 25 16 -97.99 gain 16 26 -99.79 gain 26 16 -101.18 gain 16 27 -100.66 gain 27 16 -99.66 gain 16 28 -90.51 gain 28 16 -84.84 gain 16 29 -107.06 gain 29 16 -102.94 gain 16 30 -72.82 gain 30 16 -73.70 gain 16 31 -71.88 gain 31 16 -69.32 gain 16 32 -74.26 gain 32 16 -69.06 gain 16 33 -76.90 gain 33 16 -73.14 gain 16 34 -89.62 gain 34 16 -86.50 gain 16 35 -88.67 gain 35 16 -86.49 gain 16 36 -84.25 gain 36 16 -82.22 gain 16 37 -80.29 gain 37 16 -80.80 gain 16 38 -92.22 gain 38 16 -90.26 gain 16 39 -83.96 gain 39 16 -86.32 gain 16 40 -95.75 gain 40 16 -93.09 gain 16 41 -98.57 gain 41 16 -91.26 gain 16 42 -97.38 gain 42 16 -97.31 gain 16 43 -101.05 gain 43 16 -98.57 gain 16 44 -105.90 gain 44 16 -107.02 gain 16 45 -79.70 gain 45 16 -80.80 gain 16 46 -68.58 gain 46 16 -66.15 gain 16 47 -78.00 gain 47 16 -73.27 gain 16 48 -89.10 gain 48 16 -83.95 gain 16 49 -88.28 gain 49 16 -87.18 gain 16 50 -86.80 gain 50 16 -82.56 gain 16 51 -89.02 gain 51 16 -88.47 gain 16 52 -86.39 gain 52 16 -83.08 gain 16 53 -94.91 gain 53 16 -92.16 gain 16 54 -92.87 gain 54 16 -89.53 gain 16 55 -96.53 gain 55 16 -90.10 gain 16 56 -98.87 gain 56 16 -97.49 gain 16 57 -100.61 gain 57 16 -98.31 gain 16 58 -94.47 gain 58 16 -88.86 gain 16 59 -104.20 gain 59 16 -97.85 gain 16 60 -90.83 gain 60 16 -93.76 gain 16 61 -86.23 gain 61 16 -81.06 gain 16 62 -87.15 gain 62 16 -79.50 gain 16 63 -84.31 gain 63 16 -80.62 gain 16 64 -83.29 gain 64 16 -83.82 gain 16 65 -88.75 gain 65 16 -84.84 gain 16 66 -92.41 gain 66 16 -87.48 gain 16 67 -99.88 gain 67 16 -96.18 gain 16 68 -97.00 gain 68 16 -95.88 gain 16 69 -94.55 gain 69 16 -90.65 gain 16 70 -99.85 gain 70 16 -94.41 gain 16 71 -90.79 gain 71 16 -88.93 gain 16 72 -98.08 gain 72 16 -93.77 gain 16 73 -94.29 gain 73 16 -91.35 gain 16 74 -102.57 gain 74 16 -95.75 gain 16 75 -80.94 gain 75 16 -80.00 gain 16 76 -85.94 gain 76 16 -85.13 gain 16 77 -88.64 gain 77 16 -83.82 gain 16 78 -90.24 gain 78 16 -89.92 gain 16 79 -89.34 gain 79 16 -88.65 gain 16 80 -88.94 gain 80 16 -86.04 gain 16 81 -88.50 gain 81 16 -86.51 gain 16 82 -91.23 gain 82 16 -90.21 gain 16 83 -91.13 gain 83 16 -87.38 gain 16 84 -102.70 gain 84 16 -96.14 gain 16 85 -99.33 gain 85 16 -98.20 gain 16 86 -93.96 gain 86 16 -94.47 gain 16 87 -101.43 gain 87 16 -99.23 gain 16 88 -106.64 gain 88 16 -104.08 gain 16 89 -99.55 gain 89 16 -99.14 gain 16 90 -87.19 gain 90 16 -86.11 gain 16 91 -86.46 gain 91 16 -86.45 gain 16 92 -85.13 gain 92 16 -86.05 gain 16 93 -86.86 gain 93 16 -85.13 gain 16 94 -90.78 gain 94 16 -87.62 gain 16 95 -96.22 gain 95 16 -92.29 gain 16 96 -88.66 gain 96 16 -91.71 gain 16 97 -101.09 gain 97 16 -96.96 gain 16 98 -97.09 gain 98 16 -93.43 gain 16 99 -91.82 gain 99 16 -87.30 gain 16 100 -96.34 gain 100 16 -91.74 gain 16 101 -99.19 gain 101 16 -98.22 gain 16 102 -102.09 gain 102 16 -101.08 gain 16 103 -101.05 gain 103 16 -101.20 gain 16 104 -98.62 gain 104 16 -101.26 gain 16 105 -92.06 gain 105 16 -89.23 gain 16 106 -85.83 gain 106 16 -80.32 gain 16 107 -86.73 gain 107 16 -81.12 gain 16 108 -92.16 gain 108 16 -86.18 gain 16 109 -91.00 gain 109 16 -88.47 gain 16 110 -93.65 gain 110 16 -97.48 gain 16 111 -98.09 gain 111 16 -91.89 gain 16 112 -98.70 gain 112 16 -95.96 gain 16 113 -95.43 gain 113 16 -91.82 gain 16 114 -96.05 gain 114 16 -89.61 gain 16 115 -95.79 gain 115 16 -90.01 gain 16 116 -97.48 gain 116 16 -94.12 gain 16 117 -98.67 gain 117 16 -92.45 gain 16 118 -104.50 gain 118 16 -99.91 gain 16 119 -93.42 gain 119 16 -93.88 gain 16 120 -95.05 gain 120 16 -92.90 gain 16 121 -86.63 gain 121 16 -85.50 gain 16 122 -86.90 gain 122 16 -85.52 gain 16 123 -97.87 gain 123 16 -96.84 gain 16 124 -98.44 gain 124 16 -95.39 gain 16 125 -94.95 gain 125 16 -95.24 gain 16 126 -96.80 gain 126 16 -93.74 gain 16 127 -101.63 gain 127 16 -98.19 gain 16 128 -94.74 gain 128 16 -93.90 gain 16 129 -94.28 gain 129 16 -90.65 gain 16 130 -99.68 gain 130 16 -97.34 gain 16 131 -102.79 gain 131 16 -100.23 gain 16 132 -96.31 gain 132 16 -89.75 gain 16 133 -102.09 gain 133 16 -100.71 gain 16 134 -105.65 gain 134 16 -101.13 gain 16 135 -90.63 gain 135 16 -88.41 gain 16 136 -91.45 gain 136 16 -89.68 gain 16 137 -94.06 gain 137 16 -95.20 gain 16 138 -92.79 gain 138 16 -87.46 gain 16 139 -100.59 gain 139 16 -98.53 gain 16 140 -96.02 gain 140 16 -94.78 gain 16 141 -102.97 gain 141 16 -93.71 gain 16 142 -92.45 gain 142 16 -89.93 gain 16 143 -103.18 gain 143 16 -103.39 gain 16 144 -99.78 gain 144 16 -98.36 gain 16 145 -96.81 gain 145 16 -98.78 gain 16 146 -102.93 gain 146 16 -100.88 gain 16 147 -93.46 gain 147 16 -88.53 gain 16 148 -99.44 gain 148 16 -92.83 gain 16 149 -99.41 gain 149 16 -96.46 gain 16 150 -103.69 gain 150 16 -101.57 gain 16 151 -97.15 gain 151 16 -93.98 gain 16 152 -92.07 gain 152 16 -88.71 gain 16 153 -102.03 gain 153 16 -97.89 gain 16 154 -94.46 gain 154 16 -92.22 gain 16 155 -93.75 gain 155 16 -90.08 gain 16 156 -99.38 gain 156 16 -94.94 gain 16 157 -96.54 gain 157 16 -94.59 gain 16 158 -105.03 gain 158 16 -102.58 gain 16 159 -100.56 gain 159 16 -100.49 gain 16 160 -104.32 gain 160 16 -101.40 gain 16 161 -102.76 gain 161 16 -102.29 gain 16 162 -99.55 gain 162 16 -98.78 gain 16 163 -104.23 gain 163 16 -105.38 gain 16 164 -103.77 gain 164 16 -104.28 gain 16 165 -93.66 gain 165 16 -91.24 gain 16 166 -96.83 gain 166 16 -94.16 gain 16 167 -102.02 gain 167 16 -100.07 gain 16 168 -94.48 gain 168 16 -91.43 gain 16 169 -95.13 gain 169 16 -93.19 gain 16 170 -92.07 gain 170 16 -89.36 gain 16 171 -93.11 gain 171 16 -91.48 gain 16 172 -100.05 gain 172 16 -96.61 gain 16 173 -97.28 gain 173 16 -98.49 gain 16 174 -109.06 gain 174 16 -106.31 gain 16 175 -99.17 gain 175 16 -97.56 gain 16 176 -91.39 gain 176 16 -88.75 gain 16 177 -104.68 gain 177 16 -105.04 gain 16 178 -99.60 gain 178 16 -93.41 gain 16 179 -99.11 gain 179 16 -92.34 gain 16 180 -101.75 gain 180 16 -104.43 gain 16 181 -94.25 gain 181 16 -90.94 gain 16 182 -102.02 gain 182 16 -99.81 gain 16 183 -101.59 gain 183 16 -99.65 gain 16 184 -95.48 gain 184 16 -96.29 gain 16 185 -104.58 gain 185 16 -109.25 gain 16 186 -101.74 gain 186 16 -101.99 gain 16 187 -100.27 gain 187 16 -98.25 gain 16 188 -99.47 gain 188 16 -99.86 gain 16 189 -103.18 gain 189 16 -98.30 gain 16 190 -108.05 gain 190 16 -107.08 gain 16 191 -109.43 gain 191 16 -107.17 gain 16 192 -105.45 gain 192 16 -101.88 gain 16 193 -106.46 gain 193 16 -101.88 gain 16 194 -108.37 gain 194 16 -104.57 gain 16 195 -99.79 gain 195 16 -94.54 gain 16 196 -100.01 gain 196 16 -99.07 gain 16 197 -98.73 gain 197 16 -92.93 gain 16 198 -99.99 gain 198 16 -98.70 gain 16 199 -101.50 gain 199 16 -100.31 gain 16 200 -95.89 gain 200 16 -96.05 gain 16 201 -106.55 gain 201 16 -106.61 gain 16 202 -102.43 gain 202 16 -101.62 gain 16 203 -105.27 gain 203 16 -103.58 gain 16 204 -98.20 gain 204 16 -93.16 gain 16 205 -98.78 gain 205 16 -97.47 gain 16 206 -107.27 gain 206 16 -107.08 gain 16 207 -96.08 gain 207 16 -95.30 gain 16 208 -113.17 gain 208 16 -115.00 gain 16 209 -104.67 gain 209 16 -106.06 gain 16 210 -100.51 gain 210 16 -102.07 gain 16 211 -100.32 gain 211 16 -97.12 gain 16 212 -108.25 gain 212 16 -108.07 gain 16 213 -97.81 gain 213 16 -96.95 gain 16 214 -102.85 gain 214 16 -107.37 gain 16 215 -100.99 gain 215 16 -100.92 gain 16 216 -100.46 gain 216 16 -104.30 gain 16 217 -102.03 gain 217 16 -106.13 gain 16 218 -99.84 gain 218 16 -96.75 gain 16 219 -101.08 gain 219 16 -98.47 gain 16 220 -101.06 gain 220 16 -94.54 gain 16 221 -95.11 gain 221 16 -94.26 gain 16 222 -103.15 gain 222 16 -98.11 gain 16 223 -106.92 gain 223 16 -105.12 gain 16 224 -103.00 gain 224 16 -101.67 gain 17 18 -66.97 gain 18 17 -68.05 gain 17 19 -70.08 gain 19 17 -71.91 gain 17 20 -77.99 gain 20 17 -81.01 gain 17 21 -85.61 gain 21 17 -87.75 gain 17 22 -86.28 gain 22 17 -86.88 gain 17 23 -87.26 gain 23 17 -85.03 gain 17 24 -92.45 gain 24 17 -91.84 gain 17 25 -95.38 gain 25 17 -97.45 gain 17 26 -86.70 gain 26 17 -90.19 gain 17 27 -93.15 gain 27 17 -94.26 gain 17 28 -102.52 gain 28 17 -98.95 gain 17 29 -95.34 gain 29 17 -93.32 gain 17 30 -74.99 gain 30 17 -77.97 gain 17 31 -70.51 gain 31 17 -70.05 gain 17 32 -67.03 gain 32 17 -63.93 gain 17 33 -62.76 gain 33 17 -61.11 gain 17 34 -73.39 gain 34 17 -72.37 gain 17 35 -80.74 gain 35 17 -80.66 gain 17 36 -82.08 gain 36 17 -82.16 gain 17 37 -85.23 gain 37 17 -87.84 gain 17 38 -88.85 gain 38 17 -88.99 gain 17 39 -93.07 gain 39 17 -97.54 gain 17 40 -93.49 gain 40 17 -92.94 gain 17 41 -95.16 gain 41 17 -89.95 gain 17 42 -98.59 gain 42 17 -100.62 gain 17 43 -90.06 gain 43 17 -89.69 gain 17 44 -99.56 gain 44 17 -102.79 gain 17 45 -74.26 gain 45 17 -77.47 gain 17 46 -75.22 gain 46 17 -74.89 gain 17 47 -74.64 gain 47 17 -72.01 gain 17 48 -76.82 gain 48 17 -73.77 gain 17 49 -77.56 gain 49 17 -78.57 gain 17 50 -79.72 gain 50 17 -77.59 gain 17 51 -83.84 gain 51 17 -85.40 gain 17 52 -83.94 gain 52 17 -82.74 gain 17 53 -91.07 gain 53 17 -90.43 gain 17 54 -97.27 gain 54 17 -96.03 gain 17 55 -95.30 gain 55 17 -90.98 gain 17 56 -92.50 gain 56 17 -93.23 gain 17 57 -91.19 gain 57 17 -91.00 gain 17 58 -99.73 gain 58 17 -96.23 gain 17 59 -99.42 gain 59 17 -95.17 gain 17 60 -82.50 gain 60 17 -87.53 gain 17 61 -77.58 gain 61 17 -74.52 gain 17 62 -83.03 gain 62 17 -77.48 gain 17 63 -79.55 gain 63 17 -77.96 gain 17 64 -82.37 gain 64 17 -85.01 gain 17 65 -83.91 gain 65 17 -82.10 gain 17 66 -88.72 gain 66 17 -85.89 gain 17 67 -95.26 gain 67 17 -93.66 gain 17 68 -87.95 gain 68 17 -88.94 gain 17 69 -98.25 gain 69 17 -96.46 gain 17 70 -93.14 gain 70 17 -89.81 gain 17 71 -96.36 gain 71 17 -96.60 gain 17 72 -92.31 gain 72 17 -90.11 gain 17 73 -97.57 gain 73 17 -96.74 gain 17 74 -89.30 gain 74 17 -84.58 gain 17 75 -85.85 gain 75 17 -87.02 gain 17 76 -81.20 gain 76 17 -82.50 gain 17 77 -85.71 gain 77 17 -83.00 gain 17 78 -85.12 gain 78 17 -86.91 gain 17 79 -88.61 gain 79 17 -90.03 gain 17 80 -90.82 gain 80 17 -90.03 gain 17 81 -86.22 gain 81 17 -86.33 gain 17 82 -88.66 gain 82 17 -89.76 gain 17 83 -90.23 gain 83 17 -88.59 gain 17 84 -91.10 gain 84 17 -86.65 gain 17 85 -91.48 gain 85 17 -92.46 gain 17 86 -99.69 gain 86 17 -102.30 gain 17 87 -95.03 gain 87 17 -94.94 gain 17 88 -99.99 gain 88 17 -99.53 gain 17 89 -97.01 gain 89 17 -98.70 gain 17 90 -89.34 gain 90 17 -90.37 gain 17 91 -81.33 gain 91 17 -83.43 gain 17 92 -86.84 gain 92 17 -89.85 gain 17 93 -82.45 gain 93 17 -82.82 gain 17 94 -86.97 gain 94 17 -85.91 gain 17 95 -90.31 gain 95 17 -88.50 gain 17 96 -92.56 gain 96 17 -97.71 gain 17 97 -86.72 gain 97 17 -84.70 gain 17 98 -90.28 gain 98 17 -88.72 gain 17 99 -98.13 gain 99 17 -95.71 gain 17 100 -89.03 gain 100 17 -86.53 gain 17 101 -106.18 gain 101 17 -107.31 gain 17 102 -105.47 gain 102 17 -106.57 gain 17 103 -93.36 gain 103 17 -95.63 gain 17 104 -99.48 gain 104 17 -104.22 gain 17 105 -97.22 gain 105 17 -96.49 gain 17 106 -88.40 gain 106 17 -85.00 gain 17 107 -94.93 gain 107 17 -91.43 gain 17 108 -95.30 gain 108 17 -91.42 gain 17 109 -94.01 gain 109 17 -93.58 gain 17 110 -86.09 gain 110 17 -92.02 gain 17 111 -89.12 gain 111 17 -85.02 gain 17 112 -92.38 gain 112 17 -91.74 gain 17 113 -100.17 gain 113 17 -98.67 gain 17 114 -90.76 gain 114 17 -86.42 gain 17 115 -93.31 gain 115 17 -89.63 gain 17 116 -99.59 gain 116 17 -98.34 gain 17 117 -100.05 gain 117 17 -95.95 gain 17 118 -105.24 gain 118 17 -102.75 gain 17 119 -101.40 gain 119 17 -103.97 gain 17 120 -95.00 gain 120 17 -94.95 gain 17 121 -86.12 gain 121 17 -87.10 gain 17 122 -93.02 gain 122 17 -93.75 gain 17 123 -91.99 gain 123 17 -93.06 gain 17 124 -87.33 gain 124 17 -86.39 gain 17 125 -92.19 gain 125 17 -94.59 gain 17 126 -87.59 gain 126 17 -86.64 gain 17 127 -93.52 gain 127 17 -92.19 gain 17 128 -93.25 gain 128 17 -94.51 gain 17 129 -98.47 gain 129 17 -96.95 gain 17 130 -97.34 gain 130 17 -97.11 gain 17 131 -95.54 gain 131 17 -95.08 gain 17 132 -96.39 gain 132 17 -91.93 gain 17 133 -100.59 gain 133 17 -101.32 gain 17 134 -99.14 gain 134 17 -96.73 gain 17 135 -90.33 gain 135 17 -90.22 gain 17 136 -89.55 gain 136 17 -89.89 gain 17 137 -98.30 gain 137 17 -101.55 gain 17 138 -92.61 gain 138 17 -89.39 gain 17 139 -94.10 gain 139 17 -94.14 gain 17 140 -94.46 gain 140 17 -95.33 gain 17 141 -95.70 gain 141 17 -88.54 gain 17 142 -91.79 gain 142 17 -91.38 gain 17 143 -91.38 gain 143 17 -93.70 gain 17 144 -94.17 gain 144 17 -94.86 gain 17 145 -93.66 gain 145 17 -97.73 gain 17 146 -95.52 gain 146 17 -95.59 gain 17 147 -104.11 gain 147 17 -101.28 gain 17 148 -105.70 gain 148 17 -101.20 gain 17 149 -91.65 gain 149 17 -90.81 gain 17 150 -96.08 gain 150 17 -96.07 gain 17 151 -99.28 gain 151 17 -98.21 gain 17 152 -86.20 gain 152 17 -84.95 gain 17 153 -97.50 gain 153 17 -95.46 gain 17 154 -91.46 gain 154 17 -91.33 gain 17 155 -92.13 gain 155 17 -90.57 gain 17 156 -99.01 gain 156 17 -96.68 gain 17 157 -98.23 gain 157 17 -98.38 gain 17 158 -94.26 gain 158 17 -93.91 gain 17 159 -97.33 gain 159 17 -99.36 gain 17 160 -94.57 gain 160 17 -93.76 gain 17 161 -96.91 gain 161 17 -98.54 gain 17 162 -98.00 gain 162 17 -99.34 gain 17 163 -102.89 gain 163 17 -106.14 gain 17 164 -105.76 gain 164 17 -108.38 gain 17 165 -96.82 gain 165 17 -96.50 gain 17 166 -97.94 gain 166 17 -97.38 gain 17 167 -95.05 gain 167 17 -95.21 gain 17 168 -94.95 gain 168 17 -94.00 gain 17 169 -98.19 gain 169 17 -98.36 gain 17 170 -95.09 gain 170 17 -94.49 gain 17 171 -99.10 gain 171 17 -99.58 gain 17 172 -101.53 gain 172 17 -100.20 gain 17 173 -92.26 gain 173 17 -95.57 gain 17 174 -96.74 gain 174 17 -96.10 gain 17 175 -104.94 gain 175 17 -105.44 gain 17 176 -100.85 gain 176 17 -100.32 gain 17 177 -100.10 gain 177 17 -102.57 gain 17 178 -98.68 gain 178 17 -94.59 gain 17 179 -95.08 gain 179 17 -90.41 gain 17 180 -96.24 gain 180 17 -101.03 gain 17 181 -103.79 gain 181 17 -102.59 gain 17 182 -97.02 gain 182 17 -96.91 gain 17 183 -99.96 gain 183 17 -100.13 gain 17 184 -102.61 gain 184 17 -105.52 gain 17 185 -97.95 gain 185 17 -104.73 gain 17 186 -95.00 gain 186 17 -97.36 gain 17 187 -93.39 gain 187 17 -93.47 gain 17 188 -110.20 gain 188 17 -112.70 gain 17 189 -93.52 gain 189 17 -90.74 gain 17 190 -102.30 gain 190 17 -103.44 gain 17 191 -102.01 gain 191 17 -101.86 gain 17 192 -101.47 gain 192 17 -100.01 gain 17 193 -95.11 gain 193 17 -92.64 gain 17 194 -112.28 gain 194 17 -110.59 gain 17 195 -93.38 gain 195 17 -90.24 gain 17 196 -96.70 gain 196 17 -97.87 gain 17 197 -105.14 gain 197 17 -101.44 gain 17 198 -99.36 gain 198 17 -100.17 gain 17 199 -100.95 gain 199 17 -101.87 gain 17 200 -99.61 gain 200 17 -101.87 gain 17 201 -98.97 gain 201 17 -101.14 gain 17 202 -93.34 gain 202 17 -94.64 gain 17 203 -98.24 gain 203 17 -98.66 gain 17 204 -101.51 gain 204 17 -98.57 gain 17 205 -97.29 gain 205 17 -98.09 gain 17 206 -97.35 gain 206 17 -99.26 gain 17 207 -95.92 gain 207 17 -97.24 gain 17 208 -100.99 gain 208 17 -104.92 gain 17 209 -104.24 gain 209 17 -107.74 gain 17 210 -100.35 gain 210 17 -104.03 gain 17 211 -104.95 gain 211 17 -103.85 gain 17 212 -104.41 gain 212 17 -106.32 gain 17 213 -98.26 gain 213 17 -99.51 gain 17 214 -93.80 gain 214 17 -100.44 gain 17 215 -103.00 gain 215 17 -105.04 gain 17 216 -95.28 gain 216 17 -101.23 gain 17 217 -101.54 gain 217 17 -107.74 gain 17 218 -99.99 gain 218 17 -99.01 gain 17 219 -104.14 gain 219 17 -103.63 gain 17 220 -101.13 gain 220 17 -96.71 gain 17 221 -98.27 gain 221 17 -99.53 gain 17 222 -109.10 gain 222 17 -106.16 gain 17 223 -95.99 gain 223 17 -96.29 gain 17 224 -107.65 gain 224 17 -108.43 gain 18 19 -67.62 gain 19 18 -68.36 gain 18 20 -70.26 gain 20 18 -72.21 gain 18 21 -78.11 gain 21 18 -79.17 gain 18 22 -86.29 gain 22 18 -85.81 gain 18 23 -99.10 gain 23 18 -95.79 gain 18 24 -91.20 gain 24 18 -89.51 gain 18 25 -96.51 gain 25 18 -97.50 gain 18 26 -90.59 gain 26 18 -93.01 gain 18 27 -94.36 gain 27 18 -94.38 gain 18 28 -95.02 gain 28 18 -90.37 gain 18 29 -94.36 gain 29 18 -91.25 gain 18 30 -80.73 gain 30 18 -82.64 gain 18 31 -76.34 gain 31 18 -74.81 gain 18 32 -78.83 gain 32 18 -74.65 gain 18 33 -64.81 gain 33 18 -62.07 gain 18 34 -74.08 gain 34 18 -71.98 gain 18 35 -75.85 gain 35 18 -74.69 gain 18 36 -85.54 gain 36 18 -84.54 gain 18 37 -86.67 gain 37 18 -88.20 gain 18 38 -95.06 gain 38 18 -94.13 gain 18 39 -95.52 gain 39 18 -98.91 gain 18 40 -87.91 gain 40 18 -86.27 gain 18 41 -99.15 gain 41 18 -92.86 gain 18 42 -92.93 gain 42 18 -93.89 gain 18 43 -93.87 gain 43 18 -92.42 gain 18 44 -97.57 gain 44 18 -99.71 gain 18 45 -81.91 gain 45 18 -84.03 gain 18 46 -85.40 gain 46 18 -83.99 gain 18 47 -75.96 gain 47 18 -72.25 gain 18 48 -74.73 gain 48 18 -70.60 gain 18 49 -78.68 gain 49 18 -78.61 gain 18 50 -77.68 gain 50 18 -74.47 gain 18 51 -82.97 gain 51 18 -83.45 gain 18 52 -85.03 gain 52 18 -82.75 gain 18 53 -89.98 gain 53 18 -88.25 gain 18 54 -94.41 gain 54 18 -92.09 gain 18 55 -82.63 gain 55 18 -77.23 gain 18 56 -94.57 gain 56 18 -94.21 gain 18 57 -88.72 gain 57 18 -87.45 gain 18 58 -101.43 gain 58 18 -96.85 gain 18 59 -102.63 gain 59 18 -97.30 gain 18 60 -83.17 gain 60 18 -87.12 gain 18 61 -85.35 gain 61 18 -81.20 gain 18 62 -79.41 gain 62 18 -72.77 gain 18 63 -75.83 gain 63 18 -73.17 gain 18 64 -74.30 gain 64 18 -75.85 gain 18 65 -77.69 gain 65 18 -74.79 gain 18 66 -87.62 gain 66 18 -83.71 gain 18 67 -81.45 gain 67 18 -78.77 gain 18 68 -86.30 gain 68 18 -86.21 gain 18 69 -84.72 gain 69 18 -81.84 gain 18 70 -90.47 gain 70 18 -86.06 gain 18 71 -92.59 gain 71 18 -91.75 gain 18 72 -98.97 gain 72 18 -95.68 gain 18 73 -95.67 gain 73 18 -93.75 gain 18 74 -96.00 gain 74 18 -90.20 gain 18 75 -87.73 gain 75 18 -87.82 gain 18 76 -90.69 gain 76 18 -90.90 gain 18 77 -77.98 gain 77 18 -74.19 gain 18 78 -80.40 gain 78 18 -81.11 gain 18 79 -76.78 gain 79 18 -77.11 gain 18 80 -86.92 gain 80 18 -85.04 gain 18 81 -90.54 gain 81 18 -89.58 gain 18 82 -86.07 gain 82 18 -86.08 gain 18 83 -89.41 gain 83 18 -86.69 gain 18 84 -93.34 gain 84 18 -87.80 gain 18 85 -92.34 gain 85 18 -92.24 gain 18 86 -97.29 gain 86 18 -98.83 gain 18 87 -91.26 gain 87 18 -90.09 gain 18 88 -95.24 gain 88 18 -93.70 gain 18 89 -93.27 gain 89 18 -93.88 gain 18 90 -83.16 gain 90 18 -83.11 gain 18 91 -81.82 gain 91 18 -82.83 gain 18 92 -86.63 gain 92 18 -88.57 gain 18 93 -92.52 gain 93 18 -91.81 gain 18 94 -88.04 gain 94 18 -85.90 gain 18 95 -86.36 gain 95 18 -83.47 gain 18 96 -92.56 gain 96 18 -96.64 gain 18 97 -98.77 gain 97 18 -95.66 gain 18 98 -90.75 gain 98 18 -88.12 gain 18 99 -92.16 gain 99 18 -88.66 gain 18 100 -98.61 gain 100 18 -95.02 gain 18 101 -94.31 gain 101 18 -94.36 gain 18 102 -99.24 gain 102 18 -99.25 gain 18 103 -98.53 gain 103 18 -99.71 gain 18 104 -95.05 gain 104 18 -98.71 gain 18 105 -86.69 gain 105 18 -84.88 gain 18 106 -95.68 gain 106 18 -91.20 gain 18 107 -89.04 gain 107 18 -84.47 gain 18 108 -88.44 gain 108 18 -83.48 gain 18 109 -89.79 gain 109 18 -88.28 gain 18 110 -90.22 gain 110 18 -95.08 gain 18 111 -82.92 gain 111 18 -77.74 gain 18 112 -85.65 gain 112 18 -83.94 gain 18 113 -91.94 gain 113 18 -89.35 gain 18 114 -91.98 gain 114 18 -86.56 gain 18 115 -92.92 gain 115 18 -88.16 gain 18 116 -92.77 gain 116 18 -90.43 gain 18 117 -97.87 gain 117 18 -92.68 gain 18 118 -98.34 gain 118 18 -94.77 gain 18 119 -90.86 gain 119 18 -92.35 gain 18 120 -89.76 gain 120 18 -88.63 gain 18 121 -92.48 gain 121 18 -92.37 gain 18 122 -90.99 gain 122 18 -90.64 gain 18 123 -93.87 gain 123 18 -93.86 gain 18 124 -100.08 gain 124 18 -98.06 gain 18 125 -93.51 gain 125 18 -94.83 gain 18 126 -89.76 gain 126 18 -87.72 gain 18 127 -95.32 gain 127 18 -92.91 gain 18 128 -89.61 gain 128 18 -89.79 gain 18 129 -95.21 gain 129 18 -92.60 gain 18 130 -96.64 gain 130 18 -95.33 gain 18 131 -91.84 gain 131 18 -90.30 gain 18 132 -97.03 gain 132 18 -91.50 gain 18 133 -107.57 gain 133 18 -107.21 gain 18 134 -103.31 gain 134 18 -99.81 gain 18 135 -91.59 gain 135 18 -90.40 gain 18 136 -95.87 gain 136 18 -95.12 gain 18 137 -96.37 gain 137 18 -98.54 gain 18 138 -93.66 gain 138 18 -89.36 gain 18 139 -91.52 gain 139 18 -90.48 gain 18 140 -89.43 gain 140 18 -89.22 gain 18 141 -96.21 gain 141 18 -87.97 gain 18 142 -89.18 gain 142 18 -87.68 gain 18 143 -102.76 gain 143 18 -104.00 gain 18 144 -98.36 gain 144 18 -97.96 gain 18 145 -101.98 gain 145 18 -104.97 gain 18 146 -94.81 gain 146 18 -93.79 gain 18 147 -98.43 gain 147 18 -94.52 gain 18 148 -95.07 gain 148 18 -89.49 gain 18 149 -98.96 gain 149 18 -97.04 gain 18 150 -94.07 gain 150 18 -92.99 gain 18 151 -95.60 gain 151 18 -93.45 gain 18 152 -99.39 gain 152 18 -97.06 gain 18 153 -97.22 gain 153 18 -94.11 gain 18 154 -91.66 gain 154 18 -90.44 gain 18 155 -93.64 gain 155 18 -91.00 gain 18 156 -99.22 gain 156 18 -95.81 gain 18 157 -93.75 gain 157 18 -92.82 gain 18 158 -100.82 gain 158 18 -99.39 gain 18 159 -94.64 gain 159 18 -95.60 gain 18 160 -102.61 gain 160 18 -100.72 gain 18 161 -96.67 gain 161 18 -97.22 gain 18 162 -96.69 gain 162 18 -96.95 gain 18 163 -97.63 gain 163 18 -99.80 gain 18 164 -101.52 gain 164 18 -103.06 gain 18 165 -99.22 gain 165 18 -97.82 gain 18 166 -105.42 gain 166 18 -103.77 gain 18 167 -92.93 gain 167 18 -92.00 gain 18 168 -90.28 gain 168 18 -88.25 gain 18 169 -95.44 gain 169 18 -94.52 gain 18 170 -98.05 gain 170 18 -96.37 gain 18 171 -106.39 gain 171 18 -105.79 gain 18 172 -95.87 gain 172 18 -93.45 gain 18 173 -95.29 gain 173 18 -97.53 gain 18 174 -96.46 gain 174 18 -94.74 gain 18 175 -104.02 gain 175 18 -103.44 gain 18 176 -104.22 gain 176 18 -102.60 gain 18 177 -102.00 gain 177 18 -103.39 gain 18 178 -103.02 gain 178 18 -97.85 gain 18 179 -100.53 gain 179 18 -94.78 gain 18 180 -101.27 gain 180 18 -104.97 gain 18 181 -101.59 gain 181 18 -99.31 gain 18 182 -99.21 gain 182 18 -98.01 gain 18 183 -95.75 gain 183 18 -94.83 gain 18 184 -97.42 gain 184 18 -99.25 gain 18 185 -98.41 gain 185 18 -104.11 gain 18 186 -98.53 gain 186 18 -99.81 gain 18 187 -102.64 gain 187 18 -101.64 gain 18 188 -100.97 gain 188 18 -102.38 gain 18 189 -99.11 gain 189 18 -95.25 gain 18 190 -106.06 gain 190 18 -106.12 gain 18 191 -99.52 gain 191 18 -98.29 gain 18 192 -103.98 gain 192 18 -101.44 gain 18 193 -103.25 gain 193 18 -99.70 gain 18 194 -104.31 gain 194 18 -101.53 gain 18 195 -99.24 gain 195 18 -95.01 gain 18 196 -96.32 gain 196 18 -96.41 gain 18 197 -100.59 gain 197 18 -95.82 gain 18 198 -101.39 gain 198 18 -101.12 gain 18 199 -99.79 gain 199 18 -99.63 gain 18 200 -93.24 gain 200 18 -94.42 gain 18 201 -101.23 gain 201 18 -102.31 gain 18 202 -100.90 gain 202 18 -101.12 gain 18 203 -99.40 gain 203 18 -98.74 gain 18 204 -104.88 gain 204 18 -100.86 gain 18 205 -97.54 gain 205 18 -97.26 gain 18 206 -103.96 gain 206 18 -104.79 gain 18 207 -106.60 gain 207 18 -106.85 gain 18 208 -96.59 gain 208 18 -99.43 gain 18 209 -93.27 gain 209 18 -95.69 gain 18 210 -99.32 gain 210 18 -101.91 gain 18 211 -103.07 gain 211 18 -100.90 gain 18 212 -104.25 gain 212 18 -105.09 gain 18 213 -96.15 gain 213 18 -96.32 gain 18 214 -97.43 gain 214 18 -102.98 gain 18 215 -99.50 gain 215 18 -100.45 gain 18 216 -104.68 gain 216 18 -109.54 gain 18 217 -91.23 gain 217 18 -96.36 gain 18 218 -108.01 gain 218 18 -105.94 gain 18 219 -95.18 gain 219 18 -93.60 gain 18 220 -95.60 gain 220 18 -90.10 gain 18 221 -109.21 gain 221 18 -109.39 gain 18 222 -99.37 gain 222 18 -95.35 gain 18 223 -99.86 gain 223 18 -99.09 gain 18 224 -107.33 gain 224 18 -107.03 gain 19 20 -65.14 gain 20 19 -66.35 gain 19 21 -72.10 gain 21 19 -72.42 gain 19 22 -79.82 gain 22 19 -78.60 gain 19 23 -88.34 gain 23 19 -84.29 gain 19 24 -84.29 gain 24 19 -81.86 gain 19 25 -87.26 gain 25 19 -87.50 gain 19 26 -96.68 gain 26 19 -98.36 gain 19 27 -94.31 gain 27 19 -93.60 gain 19 28 -93.55 gain 28 19 -88.16 gain 19 29 -94.33 gain 29 19 -90.49 gain 19 30 -85.04 gain 30 19 -86.20 gain 19 31 -78.25 gain 31 19 -75.97 gain 19 32 -79.66 gain 32 19 -74.73 gain 19 33 -69.76 gain 33 19 -66.28 gain 19 34 -68.33 gain 34 19 -65.49 gain 19 35 -71.74 gain 35 19 -69.84 gain 19 36 -73.94 gain 36 19 -72.19 gain 19 37 -84.62 gain 37 19 -85.41 gain 19 38 -81.49 gain 38 19 -79.81 gain 19 39 -90.39 gain 39 19 -93.03 gain 19 40 -85.35 gain 40 19 -82.98 gain 19 41 -90.78 gain 41 19 -83.75 gain 19 42 -89.93 gain 42 19 -90.14 gain 19 43 -87.94 gain 43 19 -85.75 gain 19 44 -97.70 gain 44 19 -99.10 gain 19 45 -87.89 gain 45 19 -89.28 gain 19 46 -85.35 gain 46 19 -83.20 gain 19 47 -81.89 gain 47 19 -77.44 gain 19 48 -82.49 gain 48 19 -77.62 gain 19 49 -76.01 gain 49 19 -75.20 gain 19 50 -80.82 gain 50 19 -76.87 gain 19 51 -77.06 gain 51 19 -76.80 gain 19 52 -84.93 gain 52 19 -81.90 gain 19 53 -86.21 gain 53 19 -83.74 gain 19 54 -92.42 gain 54 19 -89.36 gain 19 55 -83.24 gain 55 19 -77.10 gain 19 56 -99.34 gain 56 19 -98.25 gain 19 57 -92.55 gain 57 19 -90.53 gain 19 58 -86.47 gain 58 19 -81.15 gain 19 59 -92.73 gain 59 19 -86.66 gain 19 60 -82.40 gain 60 19 -85.61 gain 19 61 -84.22 gain 61 19 -79.34 gain 19 62 -80.80 gain 62 19 -73.43 gain 19 63 -89.30 gain 63 19 -85.89 gain 19 64 -78.64 gain 64 19 -79.46 gain 19 65 -82.57 gain 65 19 -78.94 gain 19 66 -88.27 gain 66 19 -83.62 gain 19 67 -86.20 gain 67 19 -82.78 gain 19 68 -85.51 gain 68 19 -84.67 gain 19 69 -90.80 gain 69 19 -87.18 gain 19 70 -88.90 gain 70 19 -83.75 gain 19 71 -97.28 gain 71 19 -95.70 gain 19 72 -104.37 gain 72 19 -100.35 gain 19 73 -103.76 gain 73 19 -101.11 gain 19 74 -87.37 gain 74 19 -80.82 gain 19 75 -81.02 gain 75 19 -80.37 gain 19 76 -92.53 gain 76 19 -92.00 gain 19 77 -90.99 gain 77 19 -86.46 gain 19 78 -85.56 gain 78 19 -85.53 gain 19 79 -87.14 gain 79 19 -86.74 gain 19 80 -85.37 gain 80 19 -82.75 gain 19 81 -85.96 gain 81 19 -84.25 gain 19 82 -93.31 gain 82 19 -92.58 gain 19 83 -94.78 gain 83 19 -91.32 gain 19 84 -83.42 gain 84 19 -77.15 gain 19 85 -91.59 gain 85 19 -90.75 gain 19 86 -96.62 gain 86 19 -97.42 gain 19 87 -86.45 gain 87 19 -84.53 gain 19 88 -97.75 gain 88 19 -95.47 gain 19 89 -95.70 gain 89 19 -95.56 gain 19 90 -88.72 gain 90 19 -87.93 gain 19 91 -91.44 gain 91 19 -91.72 gain 19 92 -98.84 gain 92 19 -100.03 gain 19 93 -93.63 gain 93 19 -92.18 gain 19 94 -82.12 gain 94 19 -79.24 gain 19 95 -81.69 gain 95 19 -78.05 gain 19 96 -90.69 gain 96 19 -94.02 gain 19 97 -86.10 gain 97 19 -82.25 gain 19 98 -89.65 gain 98 19 -86.28 gain 19 99 -93.79 gain 99 19 -89.55 gain 19 100 -86.85 gain 100 19 -82.53 gain 19 101 -94.40 gain 101 19 -93.71 gain 19 102 -97.65 gain 102 19 -96.92 gain 19 103 -101.11 gain 103 19 -101.55 gain 19 104 -91.38 gain 104 19 -94.30 gain 19 105 -93.34 gain 105 19 -90.79 gain 19 106 -97.29 gain 106 19 -92.07 gain 19 107 -92.07 gain 107 19 -86.76 gain 19 108 -92.87 gain 108 19 -87.17 gain 19 109 -89.57 gain 109 19 -87.32 gain 19 110 -91.26 gain 110 19 -95.37 gain 19 111 -88.07 gain 111 19 -82.16 gain 19 112 -94.62 gain 112 19 -92.17 gain 19 113 -88.24 gain 113 19 -84.91 gain 19 114 -98.78 gain 114 19 -92.62 gain 19 115 -101.24 gain 115 19 -95.74 gain 19 116 -97.73 gain 116 19 -94.66 gain 19 117 -97.41 gain 117 19 -91.49 gain 19 118 -96.18 gain 118 19 -91.87 gain 19 119 -98.09 gain 119 19 -98.84 gain 19 120 -94.28 gain 120 19 -92.42 gain 19 121 -98.40 gain 121 19 -97.56 gain 19 122 -96.07 gain 122 19 -94.98 gain 19 123 -87.57 gain 123 19 -86.82 gain 19 124 -91.60 gain 124 19 -88.84 gain 19 125 -87.73 gain 125 19 -88.31 gain 19 126 -97.11 gain 126 19 -94.34 gain 19 127 -91.97 gain 127 19 -88.82 gain 19 128 -92.72 gain 128 19 -92.16 gain 19 129 -98.18 gain 129 19 -94.84 gain 19 130 -97.78 gain 130 19 -95.73 gain 19 131 -95.03 gain 131 19 -92.75 gain 19 132 -98.77 gain 132 19 -92.49 gain 19 133 -98.94 gain 133 19 -97.85 gain 19 134 -101.49 gain 134 19 -97.25 gain 19 135 -98.91 gain 135 19 -96.98 gain 19 136 -93.25 gain 136 19 -91.76 gain 19 137 -91.23 gain 137 19 -92.66 gain 19 138 -97.72 gain 138 19 -92.67 gain 19 139 -88.74 gain 139 19 -86.96 gain 19 140 -93.24 gain 140 19 -92.29 gain 19 141 -95.38 gain 141 19 -86.40 gain 19 142 -88.85 gain 142 19 -86.62 gain 19 143 -101.06 gain 143 19 -101.56 gain 19 144 -95.76 gain 144 19 -94.62 gain 19 145 -95.03 gain 145 19 -97.29 gain 19 146 -91.22 gain 146 19 -89.46 gain 19 147 -102.14 gain 147 19 -97.49 gain 19 148 -102.57 gain 148 19 -96.25 gain 19 149 -101.93 gain 149 19 -99.26 gain 19 150 -101.16 gain 150 19 -99.33 gain 19 151 -88.20 gain 151 19 -85.31 gain 19 152 -98.93 gain 152 19 -95.86 gain 19 153 -92.85 gain 153 19 -88.99 gain 19 154 -94.43 gain 154 19 -92.48 gain 19 155 -94.96 gain 155 19 -91.58 gain 19 156 -98.58 gain 156 19 -94.43 gain 19 157 -99.31 gain 157 19 -97.64 gain 19 158 -90.33 gain 158 19 -88.16 gain 19 159 -97.95 gain 159 19 -98.17 gain 19 160 -95.00 gain 160 19 -92.37 gain 19 161 -99.22 gain 161 19 -99.02 gain 19 162 -99.67 gain 162 19 -99.19 gain 19 163 -100.19 gain 163 19 -101.62 gain 19 164 -102.99 gain 164 19 -103.79 gain 19 165 -96.43 gain 165 19 -94.29 gain 19 166 -87.69 gain 166 19 -85.30 gain 19 167 -97.12 gain 167 19 -95.46 gain 19 168 -96.15 gain 168 19 -93.38 gain 19 169 -94.12 gain 169 19 -92.46 gain 19 170 -100.92 gain 170 19 -98.49 gain 19 171 -102.13 gain 171 19 -100.79 gain 19 172 -97.75 gain 172 19 -94.60 gain 19 173 -98.07 gain 173 19 -99.56 gain 19 174 -105.28 gain 174 19 -102.82 gain 19 175 -99.51 gain 175 19 -98.19 gain 19 176 -102.63 gain 176 19 -100.28 gain 19 177 -97.42 gain 177 19 -98.06 gain 19 178 -99.89 gain 178 19 -93.98 gain 19 179 -101.95 gain 179 19 -95.46 gain 19 180 -96.28 gain 180 19 -99.24 gain 19 181 -100.14 gain 181 19 -97.12 gain 19 182 -100.77 gain 182 19 -98.84 gain 19 183 -84.19 gain 183 19 -82.53 gain 19 184 -95.61 gain 184 19 -96.70 gain 19 185 -101.19 gain 185 19 -106.15 gain 19 186 -94.23 gain 186 19 -94.77 gain 19 187 -93.12 gain 187 19 -91.39 gain 19 188 -97.11 gain 188 19 -97.79 gain 19 189 -103.27 gain 189 19 -98.67 gain 19 190 -106.62 gain 190 19 -105.93 gain 19 191 -100.73 gain 191 19 -98.76 gain 19 192 -95.51 gain 192 19 -92.23 gain 19 193 -100.22 gain 193 19 -95.93 gain 19 194 -95.10 gain 194 19 -91.59 gain 19 195 -102.85 gain 195 19 -97.88 gain 19 196 -96.03 gain 196 19 -95.38 gain 19 197 -97.76 gain 197 19 -92.24 gain 19 198 -98.46 gain 198 19 -97.46 gain 19 199 -102.68 gain 199 19 -101.78 gain 19 200 -99.17 gain 200 19 -99.61 gain 19 201 -98.52 gain 201 19 -98.87 gain 19 202 -99.99 gain 202 19 -99.47 gain 19 203 -98.51 gain 203 19 -97.10 gain 19 204 -104.15 gain 204 19 -99.39 gain 19 205 -104.50 gain 205 19 -103.48 gain 19 206 -96.45 gain 206 19 -96.54 gain 19 207 -103.27 gain 207 19 -102.78 gain 19 208 -105.97 gain 208 19 -108.08 gain 19 209 -101.39 gain 209 19 -103.06 gain 19 210 -107.02 gain 210 19 -108.88 gain 19 211 -96.89 gain 211 19 -93.97 gain 19 212 -100.23 gain 212 19 -100.32 gain 19 213 -104.53 gain 213 19 -103.96 gain 19 214 -106.46 gain 214 19 -111.27 gain 19 215 -92.85 gain 215 19 -93.06 gain 19 216 -113.44 gain 216 19 -117.56 gain 19 217 -106.76 gain 217 19 -111.14 gain 19 218 -102.49 gain 218 19 -99.68 gain 19 219 -105.63 gain 219 19 -103.31 gain 19 220 -101.86 gain 220 19 -95.62 gain 19 221 -102.86 gain 221 19 -102.30 gain 19 222 -98.71 gain 222 19 -93.95 gain 19 223 -98.53 gain 223 19 -97.01 gain 19 224 -100.35 gain 224 19 -99.30 gain 20 21 -73.78 gain 21 20 -72.89 gain 20 22 -80.64 gain 22 20 -78.22 gain 20 23 -77.19 gain 23 20 -71.94 gain 20 24 -83.59 gain 24 20 -79.95 gain 20 25 -92.31 gain 25 20 -91.35 gain 20 26 -90.96 gain 26 20 -91.43 gain 20 27 -90.07 gain 27 20 -88.15 gain 20 28 -83.96 gain 28 20 -77.37 gain 20 29 -92.14 gain 29 20 -87.09 gain 20 30 -89.99 gain 30 20 -89.95 gain 20 31 -98.31 gain 31 20 -94.83 gain 20 32 -78.13 gain 32 20 -72.01 gain 20 33 -77.48 gain 33 20 -72.80 gain 20 34 -63.16 gain 34 20 -59.11 gain 20 35 -67.80 gain 35 20 -64.70 gain 20 36 -77.10 gain 36 20 -74.15 gain 20 37 -83.55 gain 37 20 -83.14 gain 20 38 -84.95 gain 38 20 -82.07 gain 20 39 -86.37 gain 39 20 -87.81 gain 20 40 -97.97 gain 40 20 -94.39 gain 20 41 -87.91 gain 41 20 -79.68 gain 20 42 -94.72 gain 42 20 -93.73 gain 20 43 -100.95 gain 43 20 -97.55 gain 20 44 -104.28 gain 44 20 -104.48 gain 20 45 -89.22 gain 45 20 -89.40 gain 20 46 -87.81 gain 46 20 -84.45 gain 20 47 -84.86 gain 47 20 -79.20 gain 20 48 -78.80 gain 48 20 -72.73 gain 20 49 -78.12 gain 49 20 -76.11 gain 20 50 -78.16 gain 50 20 -73.01 gain 20 51 -79.12 gain 51 20 -77.65 gain 20 52 -84.66 gain 52 20 -80.43 gain 20 53 -85.55 gain 53 20 -81.88 gain 20 54 -88.84 gain 54 20 -84.57 gain 20 55 -94.18 gain 55 20 -86.84 gain 20 56 -91.70 gain 56 20 -89.40 gain 20 57 -92.30 gain 57 20 -89.09 gain 20 58 -93.73 gain 58 20 -87.21 gain 20 59 -101.56 gain 59 20 -94.29 gain 20 60 -93.48 gain 60 20 -95.49 gain 20 61 -92.74 gain 61 20 -86.65 gain 20 62 -88.04 gain 62 20 -79.46 gain 20 63 -84.48 gain 63 20 -79.87 gain 20 64 -95.39 gain 64 20 -95.01 gain 20 65 -85.35 gain 65 20 -80.51 gain 20 66 -85.56 gain 66 20 -79.70 gain 20 67 -83.25 gain 67 20 -78.62 gain 20 68 -86.22 gain 68 20 -84.18 gain 20 69 -87.93 gain 69 20 -83.11 gain 20 70 -94.63 gain 70 20 -88.27 gain 20 71 -89.42 gain 71 20 -86.64 gain 20 72 -100.13 gain 72 20 -94.90 gain 20 73 -91.39 gain 73 20 -87.53 gain 20 74 -101.44 gain 74 20 -93.70 gain 20 75 -89.33 gain 75 20 -87.47 gain 20 76 -86.08 gain 76 20 -84.35 gain 20 77 -96.36 gain 77 20 -90.62 gain 20 78 -84.98 gain 78 20 -83.75 gain 20 79 -82.17 gain 79 20 -80.56 gain 20 80 -88.71 gain 80 20 -84.89 gain 20 81 -85.82 gain 81 20 -82.90 gain 20 82 -86.07 gain 82 20 -84.14 gain 20 83 -87.08 gain 83 20 -82.41 gain 20 84 -89.83 gain 84 20 -82.35 gain 20 85 -99.60 gain 85 20 -97.56 gain 20 86 -97.75 gain 86 20 -97.34 gain 20 87 -89.32 gain 87 20 -86.20 gain 20 88 -89.95 gain 88 20 -86.47 gain 20 89 -99.70 gain 89 20 -98.37 gain 20 90 -95.87 gain 90 20 -93.87 gain 20 91 -91.75 gain 91 20 -90.82 gain 20 92 -88.76 gain 92 20 -88.75 gain 20 93 -83.17 gain 93 20 -80.52 gain 20 94 -90.23 gain 94 20 -86.15 gain 20 95 -86.25 gain 95 20 -81.41 gain 20 96 -85.65 gain 96 20 -87.78 gain 20 97 -92.40 gain 97 20 -87.35 gain 20 98 -85.87 gain 98 20 -81.29 gain 20 99 -87.26 gain 99 20 -81.82 gain 20 100 -88.10 gain 100 20 -82.57 gain 20 101 -91.45 gain 101 20 -89.55 gain 20 102 -95.41 gain 102 20 -93.48 gain 20 103 -95.70 gain 103 20 -94.94 gain 20 104 -100.61 gain 104 20 -102.33 gain 20 105 -100.91 gain 105 20 -97.16 gain 20 106 -96.06 gain 106 20 -89.64 gain 20 107 -90.50 gain 107 20 -83.97 gain 20 108 -90.15 gain 108 20 -83.25 gain 20 109 -89.74 gain 109 20 -86.29 gain 20 110 -89.07 gain 110 20 -91.98 gain 20 111 -95.48 gain 111 20 -88.35 gain 20 112 -86.43 gain 112 20 -82.77 gain 20 113 -88.89 gain 113 20 -84.36 gain 20 114 -92.11 gain 114 20 -84.75 gain 20 115 -97.81 gain 115 20 -91.10 gain 20 116 -92.00 gain 116 20 -87.73 gain 20 117 -94.43 gain 117 20 -87.30 gain 20 118 -98.44 gain 118 20 -92.92 gain 20 119 -98.35 gain 119 20 -97.90 gain 20 120 -99.08 gain 120 20 -96.01 gain 20 121 -92.26 gain 121 20 -90.21 gain 20 122 -96.62 gain 122 20 -94.32 gain 20 123 -90.70 gain 123 20 -88.75 gain 20 124 -95.13 gain 124 20 -91.17 gain 20 125 -87.88 gain 125 20 -87.25 gain 20 126 -96.68 gain 126 20 -92.69 gain 20 127 -97.08 gain 127 20 -92.73 gain 20 128 -88.85 gain 128 20 -87.09 gain 20 129 -92.07 gain 129 20 -87.52 gain 20 130 -93.99 gain 130 20 -90.73 gain 20 131 -95.80 gain 131 20 -92.31 gain 20 132 -93.74 gain 132 20 -86.26 gain 20 133 -85.93 gain 133 20 -83.63 gain 20 134 -102.84 gain 134 20 -97.40 gain 20 135 -105.01 gain 135 20 -101.88 gain 20 136 -92.83 gain 136 20 -90.14 gain 20 137 -101.00 gain 137 20 -101.22 gain 20 138 -92.79 gain 138 20 -86.54 gain 20 139 -100.54 gain 139 20 -97.55 gain 20 140 -96.92 gain 140 20 -94.77 gain 20 141 -95.53 gain 141 20 -85.35 gain 20 142 -92.49 gain 142 20 -89.05 gain 20 143 -92.98 gain 143 20 -92.28 gain 20 144 -98.39 gain 144 20 -96.05 gain 20 145 -94.20 gain 145 20 -95.25 gain 20 146 -95.97 gain 146 20 -93.01 gain 20 147 -97.42 gain 147 20 -91.56 gain 20 148 -102.83 gain 148 20 -95.30 gain 20 149 -103.12 gain 149 20 -99.25 gain 20 150 -100.49 gain 150 20 -97.45 gain 20 151 -96.78 gain 151 20 -92.69 gain 20 152 -101.77 gain 152 20 -97.49 gain 20 153 -99.81 gain 153 20 -94.75 gain 20 154 -93.85 gain 154 20 -90.69 gain 20 155 -101.96 gain 155 20 -97.38 gain 20 156 -98.43 gain 156 20 -93.08 gain 20 157 -98.77 gain 157 20 -95.90 gain 20 158 -100.61 gain 158 20 -97.23 gain 20 159 -99.80 gain 159 20 -98.81 gain 20 160 -99.49 gain 160 20 -95.66 gain 20 161 -95.40 gain 161 20 -94.00 gain 20 162 -95.65 gain 162 20 -93.96 gain 20 163 -103.24 gain 163 20 -103.47 gain 20 164 -107.03 gain 164 20 -106.63 gain 20 165 -101.00 gain 165 20 -97.66 gain 20 166 -98.19 gain 166 20 -94.60 gain 20 167 -100.48 gain 167 20 -97.61 gain 20 168 -93.82 gain 168 20 -89.84 gain 20 169 -99.09 gain 169 20 -96.23 gain 20 170 -94.38 gain 170 20 -90.75 gain 20 171 -97.06 gain 171 20 -94.52 gain 20 172 -98.43 gain 172 20 -94.07 gain 20 173 -98.96 gain 173 20 -99.25 gain 20 174 -92.45 gain 174 20 -88.78 gain 20 175 -100.40 gain 175 20 -97.87 gain 20 176 -97.27 gain 176 20 -93.71 gain 20 177 -104.89 gain 177 20 -104.33 gain 20 178 -105.15 gain 178 20 -98.04 gain 20 179 -102.12 gain 179 20 -94.42 gain 20 180 -104.97 gain 180 20 -106.72 gain 20 181 -100.49 gain 181 20 -96.26 gain 20 182 -104.49 gain 182 20 -101.35 gain 20 183 -95.92 gain 183 20 -93.05 gain 20 184 -97.74 gain 184 20 -97.62 gain 20 185 -95.67 gain 185 20 -99.43 gain 20 186 -100.11 gain 186 20 -99.44 gain 20 187 -100.80 gain 187 20 -97.86 gain 20 188 -102.02 gain 188 20 -101.49 gain 20 189 -105.70 gain 189 20 -99.90 gain 20 190 -102.57 gain 190 20 -100.68 gain 20 191 -93.15 gain 191 20 -89.97 gain 20 192 -106.39 gain 192 20 -101.90 gain 20 193 -105.19 gain 193 20 -99.70 gain 20 194 -101.84 gain 194 20 -97.12 gain 20 195 -105.49 gain 195 20 -99.32 gain 20 196 -103.13 gain 196 20 -101.27 gain 20 197 -99.37 gain 197 20 -92.65 gain 20 198 -102.83 gain 198 20 -100.62 gain 20 199 -100.00 gain 199 20 -97.90 gain 20 200 -96.64 gain 200 20 -95.87 gain 20 201 -93.70 gain 201 20 -92.84 gain 20 202 -98.14 gain 202 20 -96.42 gain 20 203 -101.37 gain 203 20 -98.76 gain 20 204 -105.79 gain 204 20 -99.82 gain 20 205 -106.51 gain 205 20 -104.28 gain 20 206 -101.28 gain 206 20 -100.16 gain 20 207 -102.25 gain 207 20 -100.55 gain 20 208 -104.35 gain 208 20 -105.25 gain 20 209 -99.20 gain 209 20 -99.67 gain 20 210 -95.26 gain 210 20 -95.91 gain 20 211 -100.40 gain 211 20 -96.28 gain 20 212 -102.39 gain 212 20 -101.28 gain 20 213 -109.42 gain 213 20 -107.64 gain 20 214 -106.75 gain 214 20 -110.36 gain 20 215 -99.79 gain 215 20 -98.79 gain 20 216 -101.25 gain 216 20 -104.16 gain 20 217 -106.09 gain 217 20 -109.27 gain 20 218 -101.87 gain 218 20 -97.86 gain 20 219 -103.62 gain 219 20 -100.09 gain 20 220 -104.25 gain 220 20 -96.81 gain 20 221 -98.51 gain 221 20 -96.75 gain 20 222 -106.82 gain 222 20 -100.87 gain 20 223 -99.19 gain 223 20 -96.47 gain 20 224 -102.96 gain 224 20 -100.71 gain 21 22 -64.50 gain 22 21 -62.96 gain 21 23 -78.56 gain 23 21 -74.19 gain 21 24 -78.95 gain 24 21 -76.20 gain 21 25 -89.72 gain 25 21 -89.65 gain 21 26 -89.71 gain 26 21 -91.07 gain 21 27 -95.18 gain 27 21 -94.15 gain 21 28 -93.57 gain 28 21 -87.87 gain 21 29 -89.68 gain 29 21 -85.52 gain 21 30 -86.61 gain 30 21 -87.46 gain 21 31 -92.92 gain 31 21 -90.33 gain 21 32 -81.71 gain 32 21 -76.47 gain 21 33 -84.95 gain 33 21 -81.16 gain 21 34 -80.08 gain 34 21 -76.93 gain 21 35 -70.80 gain 35 21 -68.59 gain 21 36 -65.01 gain 36 21 -62.95 gain 21 37 -69.32 gain 37 21 -69.80 gain 21 38 -79.54 gain 38 21 -77.55 gain 21 39 -85.47 gain 39 21 -87.80 gain 21 40 -80.99 gain 40 21 -78.30 gain 21 41 -87.56 gain 41 21 -80.21 gain 21 42 -100.15 gain 42 21 -100.06 gain 21 43 -95.14 gain 43 21 -92.64 gain 21 44 -102.17 gain 44 21 -103.26 gain 21 45 -85.91 gain 45 21 -86.99 gain 21 46 -92.13 gain 46 21 -89.66 gain 21 47 -93.13 gain 47 21 -88.37 gain 21 48 -84.02 gain 48 21 -78.84 gain 21 49 -80.88 gain 49 21 -79.75 gain 21 50 -79.44 gain 50 21 -75.17 gain 21 51 -79.22 gain 51 21 -78.65 gain 21 52 -72.51 gain 52 21 -69.17 gain 21 53 -76.28 gain 53 21 -73.50 gain 21 54 -84.94 gain 54 21 -81.56 gain 21 55 -87.91 gain 55 21 -81.46 gain 21 56 -82.45 gain 56 21 -81.04 gain 21 57 -84.91 gain 57 21 -82.58 gain 21 58 -96.15 gain 58 21 -90.51 gain 21 59 -96.66 gain 59 21 -90.28 gain 21 60 -96.76 gain 60 21 -99.66 gain 21 61 -92.22 gain 61 21 -87.03 gain 21 62 -83.24 gain 62 21 -75.56 gain 21 63 -89.90 gain 63 21 -86.18 gain 21 64 -83.46 gain 64 21 -83.96 gain 21 65 -83.33 gain 65 21 -79.38 gain 21 66 -86.50 gain 66 21 -81.53 gain 21 67 -83.92 gain 67 21 -80.19 gain 21 68 -82.77 gain 68 21 -81.62 gain 21 69 -87.53 gain 69 21 -83.59 gain 21 70 -93.05 gain 70 21 -87.59 gain 21 71 -91.75 gain 71 21 -89.86 gain 21 72 -96.94 gain 72 21 -92.60 gain 21 73 -100.63 gain 73 21 -97.66 gain 21 74 -99.41 gain 74 21 -92.55 gain 21 75 -97.10 gain 75 21 -96.13 gain 21 76 -90.71 gain 76 21 -89.87 gain 21 77 -88.91 gain 77 21 -84.07 gain 21 78 -83.94 gain 78 21 -83.59 gain 21 79 -87.83 gain 79 21 -87.11 gain 21 80 -75.97 gain 80 21 -73.04 gain 21 81 -79.00 gain 81 21 -76.98 gain 21 82 -81.28 gain 82 21 -80.23 gain 21 83 -82.60 gain 83 21 -78.83 gain 21 84 -92.54 gain 84 21 -85.95 gain 21 85 -86.29 gain 85 21 -85.13 gain 21 86 -98.22 gain 86 21 -98.70 gain 21 87 -92.06 gain 87 21 -89.82 gain 21 88 -93.79 gain 88 21 -91.20 gain 21 89 -96.02 gain 89 21 -95.58 gain 21 90 -90.08 gain 90 21 -88.98 gain 21 91 -94.48 gain 91 21 -94.45 gain 21 92 -89.35 gain 92 21 -90.23 gain 21 93 -90.42 gain 93 21 -88.66 gain 21 94 -86.40 gain 94 21 -83.20 gain 21 95 -85.39 gain 95 21 -81.44 gain 21 96 -88.52 gain 96 21 -91.54 gain 21 97 -93.02 gain 97 21 -88.86 gain 21 98 -85.22 gain 98 21 -81.53 gain 21 99 -95.95 gain 99 21 -91.40 gain 21 100 -96.92 gain 100 21 -92.29 gain 21 101 -94.65 gain 101 21 -93.65 gain 21 102 -93.52 gain 102 21 -92.48 gain 21 103 -91.77 gain 103 21 -91.90 gain 21 104 -89.25 gain 104 21 -91.86 gain 21 105 -97.02 gain 105 21 -94.15 gain 21 106 -99.75 gain 106 21 -94.21 gain 21 107 -94.77 gain 107 21 -89.14 gain 21 108 -84.19 gain 108 21 -78.18 gain 21 109 -92.17 gain 109 21 -89.61 gain 21 110 -89.04 gain 110 21 -92.84 gain 21 111 -86.13 gain 111 21 -79.90 gain 21 112 -90.75 gain 112 21 -87.98 gain 21 113 -93.93 gain 113 21 -90.29 gain 21 114 -94.00 gain 114 21 -87.53 gain 21 115 -90.14 gain 115 21 -84.33 gain 21 116 -99.68 gain 116 21 -96.29 gain 21 117 -95.59 gain 117 21 -89.35 gain 21 118 -93.49 gain 118 21 -88.87 gain 21 119 -98.43 gain 119 21 -98.87 gain 21 120 -96.08 gain 120 21 -93.90 gain 21 121 -94.19 gain 121 21 -93.03 gain 21 122 -97.34 gain 122 21 -95.94 gain 21 123 -99.75 gain 123 21 -98.68 gain 21 124 -96.56 gain 124 21 -93.48 gain 21 125 -95.91 gain 125 21 -96.17 gain 21 126 -97.91 gain 126 21 -94.82 gain 21 127 -94.18 gain 127 21 -90.72 gain 21 128 -89.11 gain 128 21 -88.24 gain 21 129 -96.24 gain 129 21 -92.58 gain 21 130 -92.07 gain 130 21 -89.70 gain 21 131 -98.23 gain 131 21 -95.63 gain 21 132 -92.85 gain 132 21 -86.27 gain 21 133 -97.09 gain 133 21 -95.68 gain 21 134 -97.43 gain 134 21 -92.88 gain 21 135 -91.96 gain 135 21 -89.71 gain 21 136 -93.48 gain 136 21 -91.68 gain 21 137 -96.02 gain 137 21 -97.13 gain 21 138 -95.97 gain 138 21 -90.61 gain 21 139 -104.47 gain 139 21 -102.37 gain 21 140 -92.24 gain 140 21 -90.97 gain 21 141 -85.68 gain 141 21 -76.38 gain 21 142 -96.42 gain 142 21 -93.87 gain 21 143 -96.18 gain 143 21 -96.36 gain 21 144 -93.39 gain 144 21 -91.94 gain 21 145 -96.18 gain 145 21 -98.12 gain 21 146 -93.94 gain 146 21 -91.87 gain 21 147 -105.64 gain 147 21 -100.67 gain 21 148 -99.35 gain 148 21 -92.71 gain 21 149 -98.09 gain 149 21 -95.11 gain 21 150 -91.68 gain 150 21 -89.54 gain 21 151 -102.58 gain 151 21 -99.38 gain 21 152 -98.63 gain 152 21 -95.24 gain 21 153 -100.00 gain 153 21 -95.83 gain 21 154 -91.58 gain 154 21 -89.31 gain 21 155 -95.50 gain 155 21 -91.81 gain 21 156 -100.27 gain 156 21 -95.80 gain 21 157 -95.60 gain 157 21 -93.62 gain 21 158 -100.09 gain 158 21 -97.61 gain 21 159 -97.89 gain 159 21 -97.79 gain 21 160 -95.63 gain 160 21 -92.69 gain 21 161 -96.81 gain 161 21 -96.30 gain 21 162 -103.34 gain 162 21 -102.55 gain 21 163 -95.01 gain 163 21 -96.13 gain 21 164 -102.27 gain 164 21 -102.75 gain 21 165 -102.50 gain 165 21 -100.05 gain 21 166 -99.75 gain 166 21 -97.05 gain 21 167 -98.38 gain 167 21 -96.40 gain 21 168 -103.03 gain 168 21 -99.94 gain 21 169 -98.64 gain 169 21 -96.67 gain 21 170 -100.57 gain 170 21 -97.84 gain 21 171 -93.62 gain 171 21 -91.96 gain 21 172 -95.98 gain 172 21 -92.51 gain 21 173 -98.80 gain 173 21 -99.98 gain 21 174 -97.76 gain 174 21 -94.99 gain 21 175 -99.66 gain 175 21 -98.02 gain 21 176 -102.07 gain 176 21 -99.40 gain 21 177 -99.07 gain 177 21 -99.40 gain 21 178 -102.82 gain 178 21 -96.60 gain 21 179 -107.80 gain 179 21 -101.00 gain 21 180 -98.16 gain 180 21 -100.80 gain 21 181 -101.88 gain 181 21 -98.55 gain 21 182 -93.39 gain 182 21 -91.15 gain 21 183 -102.77 gain 183 21 -100.79 gain 21 184 -100.69 gain 184 21 -101.47 gain 21 185 -90.34 gain 185 21 -94.98 gain 21 186 -98.48 gain 186 21 -98.70 gain 21 187 -91.42 gain 187 21 -89.37 gain 21 188 -97.66 gain 188 21 -98.02 gain 21 189 -96.49 gain 189 21 -91.58 gain 21 190 -94.90 gain 190 21 -93.91 gain 21 191 -99.44 gain 191 21 -97.15 gain 21 192 -96.67 gain 192 21 -93.08 gain 21 193 -102.09 gain 193 21 -97.48 gain 21 194 -103.06 gain 194 21 -99.23 gain 21 195 -101.49 gain 195 21 -96.21 gain 21 196 -102.19 gain 196 21 -101.22 gain 21 197 -99.09 gain 197 21 -93.26 gain 21 198 -100.43 gain 198 21 -99.11 gain 21 199 -93.15 gain 199 21 -91.93 gain 21 200 -103.50 gain 200 21 -103.62 gain 21 201 -94.14 gain 201 21 -94.18 gain 21 202 -102.92 gain 202 21 -102.08 gain 21 203 -101.86 gain 203 21 -100.14 gain 21 204 -104.73 gain 204 21 -99.65 gain 21 205 -100.91 gain 205 21 -99.58 gain 21 206 -101.91 gain 206 21 -101.68 gain 21 207 -103.97 gain 207 21 -103.16 gain 21 208 -104.38 gain 208 21 -106.17 gain 21 209 -99.82 gain 209 21 -101.18 gain 21 210 -108.45 gain 210 21 -109.99 gain 21 211 -99.21 gain 211 21 -95.98 gain 21 212 -104.37 gain 212 21 -104.15 gain 21 213 -99.10 gain 213 21 -98.21 gain 21 214 -100.21 gain 214 21 -104.71 gain 21 215 -97.96 gain 215 21 -97.85 gain 21 216 -101.17 gain 216 21 -104.98 gain 21 217 -103.49 gain 217 21 -107.56 gain 21 218 -100.75 gain 218 21 -97.63 gain 21 219 -98.86 gain 219 21 -96.22 gain 21 220 -100.40 gain 220 21 -93.85 gain 21 221 -94.82 gain 221 21 -93.95 gain 21 222 -107.49 gain 222 21 -102.42 gain 21 223 -105.64 gain 223 21 -103.81 gain 21 224 -105.10 gain 224 21 -103.74 gain 22 23 -69.22 gain 23 22 -66.39 gain 22 24 -76.34 gain 24 22 -75.13 gain 22 25 -79.78 gain 25 22 -81.25 gain 22 26 -83.88 gain 26 22 -86.78 gain 22 27 -85.25 gain 27 22 -85.75 gain 22 28 -86.88 gain 28 22 -82.71 gain 22 29 -92.21 gain 29 22 -89.59 gain 22 30 -89.94 gain 30 22 -92.32 gain 22 31 -90.86 gain 31 22 -89.80 gain 22 32 -86.51 gain 32 22 -82.81 gain 22 33 -89.67 gain 33 22 -87.42 gain 22 34 -79.20 gain 34 22 -77.58 gain 22 35 -75.80 gain 35 22 -75.13 gain 22 36 -72.33 gain 36 22 -71.80 gain 22 37 -68.06 gain 37 22 -70.07 gain 22 38 -62.73 gain 38 22 -62.28 gain 22 39 -79.03 gain 39 22 -82.90 gain 22 40 -79.23 gain 40 22 -78.07 gain 22 41 -83.12 gain 41 22 -77.31 gain 22 42 -87.19 gain 42 22 -88.63 gain 22 43 -92.32 gain 43 22 -91.35 gain 22 44 -103.53 gain 44 22 -106.15 gain 22 45 -87.52 gain 45 22 -90.13 gain 22 46 -88.17 gain 46 22 -87.24 gain 22 47 -87.33 gain 47 22 -84.10 gain 22 48 -82.05 gain 48 22 -78.40 gain 22 49 -82.32 gain 49 22 -82.73 gain 22 50 -78.29 gain 50 22 -75.56 gain 22 51 -81.12 gain 51 22 -82.08 gain 22 52 -70.41 gain 52 22 -68.61 gain 22 53 -74.96 gain 53 22 -73.72 gain 22 54 -74.89 gain 54 22 -73.05 gain 22 55 -75.81 gain 55 22 -70.89 gain 22 56 -89.89 gain 56 22 -90.02 gain 22 57 -90.42 gain 57 22 -89.62 gain 22 58 -92.17 gain 58 22 -88.08 gain 22 59 -91.70 gain 59 22 -86.85 gain 22 60 -96.14 gain 60 22 -100.58 gain 22 61 -100.63 gain 61 22 -96.97 gain 22 62 -88.20 gain 62 22 -82.05 gain 22 63 -91.86 gain 63 22 -89.67 gain 22 64 -90.19 gain 64 22 -92.23 gain 22 65 -80.59 gain 65 22 -78.18 gain 22 66 -85.73 gain 66 22 -82.30 gain 22 67 -80.58 gain 67 22 -78.38 gain 22 68 -79.56 gain 68 22 -79.95 gain 22 69 -86.35 gain 69 22 -83.95 gain 22 70 -79.68 gain 70 22 -75.75 gain 22 71 -86.26 gain 71 22 -85.90 gain 22 72 -88.61 gain 72 22 -85.81 gain 22 73 -94.08 gain 73 22 -92.64 gain 22 74 -93.44 gain 74 22 -88.12 gain 22 75 -92.42 gain 75 22 -92.99 gain 22 76 -93.57 gain 76 22 -94.26 gain 22 77 -82.62 gain 77 22 -79.31 gain 22 78 -90.50 gain 78 22 -91.69 gain 22 79 -87.36 gain 79 22 -88.17 gain 22 80 -82.78 gain 80 22 -81.38 gain 22 81 -85.81 gain 81 22 -85.32 gain 22 82 -87.35 gain 82 22 -87.85 gain 22 83 -80.72 gain 83 22 -78.49 gain 22 84 -80.38 gain 84 22 -75.33 gain 22 85 -93.02 gain 85 22 -93.40 gain 22 86 -92.61 gain 86 22 -94.63 gain 22 87 -85.86 gain 87 22 -85.17 gain 22 88 -95.95 gain 88 22 -94.90 gain 22 89 -94.10 gain 89 22 -95.19 gain 22 90 -100.07 gain 90 22 -100.50 gain 22 91 -95.34 gain 91 22 -96.84 gain 22 92 -92.88 gain 92 22 -95.30 gain 22 93 -90.08 gain 93 22 -89.86 gain 22 94 -93.85 gain 94 22 -92.19 gain 22 95 -89.01 gain 95 22 -86.59 gain 22 96 -88.62 gain 96 22 -93.18 gain 22 97 -84.14 gain 97 22 -81.52 gain 22 98 -86.53 gain 98 22 -84.38 gain 22 99 -87.13 gain 99 22 -84.11 gain 22 100 -88.19 gain 100 22 -85.09 gain 22 101 -89.90 gain 101 22 -90.43 gain 22 102 -88.54 gain 102 22 -89.04 gain 22 103 -92.05 gain 103 22 -93.71 gain 22 104 -91.17 gain 104 22 -95.32 gain 22 105 -91.60 gain 105 22 -90.27 gain 22 106 -85.91 gain 106 22 -81.91 gain 22 107 -100.33 gain 107 22 -96.24 gain 22 108 -77.62 gain 108 22 -73.14 gain 22 109 -90.19 gain 109 22 -89.17 gain 22 110 -91.42 gain 110 22 -96.76 gain 22 111 -81.76 gain 111 22 -77.06 gain 22 112 -86.66 gain 112 22 -85.43 gain 22 113 -85.86 gain 113 22 -83.76 gain 22 114 -89.42 gain 114 22 -84.48 gain 22 115 -88.81 gain 115 22 -84.53 gain 22 116 -91.63 gain 116 22 -89.78 gain 22 117 -89.90 gain 117 22 -85.19 gain 22 118 -93.65 gain 118 22 -90.57 gain 22 119 -100.61 gain 119 22 -102.59 gain 22 120 -100.88 gain 120 22 -100.24 gain 22 121 -93.81 gain 121 22 -94.19 gain 22 122 -98.83 gain 122 22 -98.96 gain 22 123 -92.67 gain 123 22 -93.14 gain 22 124 -93.24 gain 124 22 -91.70 gain 22 125 -94.15 gain 125 22 -95.94 gain 22 126 -91.20 gain 126 22 -89.65 gain 22 127 -94.26 gain 127 22 -92.33 gain 22 128 -91.39 gain 128 22 -92.05 gain 22 129 -100.47 gain 129 22 -98.35 gain 22 130 -90.52 gain 130 22 -89.69 gain 22 131 -92.71 gain 131 22 -91.65 gain 22 132 -95.83 gain 132 22 -90.78 gain 22 133 -97.31 gain 133 22 -97.43 gain 22 134 -98.34 gain 134 22 -95.33 gain 22 135 -96.40 gain 135 22 -95.69 gain 22 136 -98.07 gain 136 22 -97.81 gain 22 137 -92.15 gain 137 22 -94.80 gain 22 138 -92.34 gain 138 22 -88.52 gain 22 139 -98.19 gain 139 22 -97.63 gain 22 140 -92.54 gain 140 22 -92.81 gain 22 141 -94.55 gain 141 22 -86.79 gain 22 142 -92.10 gain 142 22 -91.08 gain 22 143 -87.62 gain 143 22 -89.34 gain 22 144 -93.92 gain 144 22 -94.01 gain 22 145 -96.43 gain 145 22 -99.90 gain 22 146 -105.46 gain 146 22 -104.93 gain 22 147 -96.41 gain 147 22 -92.98 gain 22 148 -98.86 gain 148 22 -93.76 gain 22 149 -97.56 gain 149 22 -96.12 gain 22 150 -88.04 gain 150 22 -87.43 gain 22 151 -97.14 gain 151 22 -95.48 gain 22 152 -91.24 gain 152 22 -89.40 gain 22 153 -94.13 gain 153 22 -91.50 gain 22 154 -96.37 gain 154 22 -95.63 gain 22 155 -88.12 gain 155 22 -85.96 gain 22 156 -93.39 gain 156 22 -90.46 gain 22 157 -89.59 gain 157 22 -89.14 gain 22 158 -93.99 gain 158 22 -93.04 gain 22 159 -98.53 gain 159 22 -99.97 gain 22 160 -95.25 gain 160 22 -93.84 gain 22 161 -90.11 gain 161 22 -91.14 gain 22 162 -93.40 gain 162 22 -94.14 gain 22 163 -97.82 gain 163 22 -100.48 gain 22 164 -98.38 gain 164 22 -100.40 gain 22 165 -93.60 gain 165 22 -92.68 gain 22 166 -99.97 gain 166 22 -98.81 gain 22 167 -102.47 gain 167 22 -102.02 gain 22 168 -98.82 gain 168 22 -97.27 gain 22 169 -99.30 gain 169 22 -98.86 gain 22 170 -98.01 gain 170 22 -96.81 gain 22 171 -96.74 gain 171 22 -96.62 gain 22 172 -101.10 gain 172 22 -99.16 gain 22 173 -86.15 gain 173 22 -88.86 gain 22 174 -103.31 gain 174 22 -102.07 gain 22 175 -95.57 gain 175 22 -95.47 gain 22 176 -94.25 gain 176 22 -93.12 gain 22 177 -100.05 gain 177 22 -101.91 gain 22 178 -98.75 gain 178 22 -94.06 gain 22 179 -97.42 gain 179 22 -92.16 gain 22 180 -91.86 gain 180 22 -96.04 gain 22 181 -100.51 gain 181 22 -98.72 gain 22 182 -100.20 gain 182 22 -99.48 gain 22 183 -98.37 gain 183 22 -97.93 gain 22 184 -100.22 gain 184 22 -102.53 gain 22 185 -98.68 gain 185 22 -104.86 gain 22 186 -97.26 gain 186 22 -99.01 gain 22 187 -90.81 gain 187 22 -90.30 gain 22 188 -100.10 gain 188 22 -102.00 gain 22 189 -93.79 gain 189 22 -90.42 gain 22 190 -96.66 gain 190 22 -97.20 gain 22 191 -101.09 gain 191 22 -100.33 gain 22 192 -104.28 gain 192 22 -102.22 gain 22 193 -87.22 gain 193 22 -84.15 gain 22 194 -99.66 gain 194 22 -97.37 gain 22 195 -103.04 gain 195 22 -99.30 gain 22 196 -100.78 gain 196 22 -101.35 gain 22 197 -100.97 gain 197 22 -96.67 gain 22 198 -97.30 gain 198 22 -97.51 gain 22 199 -99.77 gain 199 22 -100.09 gain 22 200 -103.58 gain 200 22 -105.24 gain 22 201 -97.45 gain 201 22 -99.01 gain 22 202 -104.03 gain 202 22 -104.73 gain 22 203 -95.93 gain 203 22 -95.75 gain 22 204 -102.16 gain 204 22 -98.62 gain 22 205 -93.78 gain 205 22 -93.98 gain 22 206 -103.08 gain 206 22 -104.39 gain 22 207 -94.57 gain 207 22 -95.30 gain 22 208 -99.32 gain 208 22 -102.64 gain 22 209 -91.95 gain 209 22 -94.85 gain 22 210 -101.03 gain 210 22 -104.10 gain 22 211 -103.07 gain 211 22 -101.37 gain 22 212 -98.95 gain 212 22 -100.27 gain 22 213 -98.59 gain 213 22 -99.23 gain 22 214 -102.05 gain 214 22 -108.08 gain 22 215 -91.98 gain 215 22 -93.41 gain 22 216 -100.43 gain 216 22 -105.78 gain 22 217 -91.52 gain 217 22 -97.13 gain 22 218 -97.98 gain 218 22 -96.39 gain 22 219 -101.62 gain 219 22 -100.51 gain 22 220 -101.07 gain 220 22 -96.05 gain 22 221 -103.94 gain 221 22 -104.60 gain 22 222 -101.62 gain 222 22 -98.09 gain 22 223 -101.55 gain 223 22 -101.26 gain 22 224 -110.75 gain 224 22 -110.92 gain 23 24 -66.45 gain 24 23 -68.06 gain 23 25 -80.45 gain 25 23 -84.75 gain 23 26 -75.67 gain 26 23 -81.39 gain 23 27 -86.08 gain 27 23 -89.41 gain 23 28 -89.31 gain 28 23 -87.97 gain 23 29 -80.48 gain 29 23 -80.69 gain 23 30 -90.66 gain 30 23 -95.88 gain 23 31 -81.59 gain 31 23 -83.37 gain 23 32 -85.72 gain 32 23 -84.85 gain 23 33 -81.34 gain 33 23 -81.91 gain 23 34 -86.22 gain 34 23 -87.43 gain 23 35 -80.22 gain 35 23 -82.37 gain 23 36 -79.02 gain 36 23 -81.32 gain 23 37 -62.26 gain 37 23 -67.10 gain 23 38 -63.26 gain 38 23 -65.63 gain 23 39 -72.45 gain 39 23 -79.15 gain 23 40 -75.30 gain 40 23 -76.98 gain 23 41 -81.15 gain 41 23 -78.17 gain 23 42 -85.14 gain 42 23 -89.41 gain 23 43 -89.20 gain 43 23 -91.06 gain 23 44 -81.11 gain 44 23 -86.57 gain 23 45 -90.74 gain 45 23 -96.18 gain 23 46 -86.60 gain 46 23 -88.50 gain 23 47 -84.87 gain 47 23 -84.47 gain 23 48 -91.91 gain 48 23 -91.09 gain 23 49 -81.30 gain 49 23 -84.54 gain 23 50 -77.97 gain 50 23 -78.06 gain 23 51 -77.49 gain 51 23 -81.28 gain 23 52 -72.97 gain 52 23 -74.00 gain 23 53 -73.38 gain 53 23 -74.97 gain 23 54 -79.66 gain 54 23 -80.65 gain 23 55 -79.82 gain 55 23 -77.73 gain 23 56 -79.49 gain 56 23 -82.45 gain 23 57 -88.04 gain 57 23 -90.07 gain 23 58 -81.75 gain 58 23 -80.48 gain 23 59 -82.82 gain 59 23 -80.80 gain 23 60 -93.31 gain 60 23 -100.58 gain 23 61 -86.13 gain 61 23 -85.30 gain 23 62 -88.72 gain 62 23 -85.40 gain 23 63 -83.83 gain 63 23 -84.47 gain 23 64 -88.85 gain 64 23 -93.72 gain 23 65 -82.74 gain 65 23 -83.16 gain 23 66 -77.54 gain 66 23 -76.94 gain 23 67 -78.73 gain 67 23 -79.36 gain 23 68 -80.01 gain 68 23 -83.23 gain 23 69 -74.14 gain 69 23 -74.58 gain 23 70 -83.26 gain 70 23 -82.16 gain 23 71 -82.87 gain 71 23 -85.35 gain 23 72 -84.42 gain 72 23 -84.44 gain 23 73 -89.37 gain 73 23 -90.77 gain 23 74 -89.31 gain 74 23 -86.82 gain 23 75 -95.16 gain 75 23 -98.56 gain 23 76 -88.35 gain 76 23 -91.88 gain 23 77 -90.70 gain 77 23 -90.22 gain 23 78 -82.93 gain 78 23 -86.95 gain 23 79 -82.45 gain 79 23 -86.10 gain 23 80 -86.68 gain 80 23 -88.11 gain 23 81 -82.39 gain 81 23 -84.74 gain 23 82 -74.83 gain 82 23 -78.15 gain 23 83 -88.96 gain 83 23 -89.55 gain 23 84 -77.89 gain 84 23 -75.67 gain 23 85 -82.58 gain 85 23 -85.78 gain 23 86 -88.98 gain 86 23 -93.83 gain 23 87 -86.42 gain 87 23 -88.55 gain 23 88 -85.73 gain 88 23 -87.50 gain 23 89 -89.86 gain 89 23 -93.78 gain 23 90 -88.90 gain 90 23 -92.16 gain 23 91 -83.65 gain 91 23 -87.98 gain 23 92 -93.60 gain 92 23 -98.85 gain 23 93 -92.72 gain 93 23 -95.33 gain 23 94 -87.36 gain 94 23 -88.53 gain 23 95 -87.77 gain 95 23 -88.18 gain 23 96 -84.85 gain 96 23 -92.24 gain 23 97 -78.52 gain 97 23 -78.73 gain 23 98 -85.79 gain 98 23 -86.46 gain 23 99 -79.08 gain 99 23 -78.89 gain 23 100 -88.04 gain 100 23 -87.77 gain 23 101 -90.36 gain 101 23 -93.72 gain 23 102 -85.56 gain 102 23 -88.88 gain 23 103 -85.93 gain 103 23 -90.42 gain 23 104 -88.59 gain 104 23 -95.57 gain 23 105 -89.74 gain 105 23 -91.23 gain 23 106 -89.65 gain 106 23 -88.48 gain 23 107 -77.13 gain 107 23 -75.87 gain 23 108 -85.05 gain 108 23 -83.41 gain 23 109 -87.88 gain 109 23 -89.68 gain 23 110 -86.61 gain 110 23 -94.78 gain 23 111 -89.70 gain 111 23 -87.84 gain 23 112 -83.98 gain 112 23 -85.58 gain 23 113 -88.14 gain 113 23 -88.86 gain 23 114 -86.35 gain 114 23 -84.24 gain 23 115 -82.34 gain 115 23 -80.88 gain 23 116 -86.89 gain 116 23 -87.87 gain 23 117 -83.78 gain 117 23 -81.91 gain 23 118 -95.34 gain 118 23 -95.08 gain 23 119 -86.45 gain 119 23 -91.25 gain 23 120 -96.96 gain 120 23 -99.15 gain 23 121 -94.91 gain 121 23 -98.12 gain 23 122 -91.45 gain 122 23 -94.41 gain 23 123 -90.50 gain 123 23 -93.80 gain 23 124 -88.35 gain 124 23 -89.64 gain 23 125 -92.16 gain 125 23 -96.79 gain 23 126 -84.90 gain 126 23 -86.18 gain 23 127 -95.97 gain 127 23 -96.88 gain 23 128 -95.19 gain 128 23 -98.68 gain 23 129 -79.68 gain 129 23 -80.39 gain 23 130 -86.40 gain 130 23 -88.40 gain 23 131 -95.23 gain 131 23 -97.00 gain 23 132 -92.54 gain 132 23 -90.32 gain 23 133 -86.80 gain 133 23 -89.75 gain 23 134 -92.41 gain 134 23 -92.23 gain 23 135 -95.89 gain 135 23 -98.01 gain 23 136 -91.07 gain 136 23 -93.63 gain 23 137 -88.83 gain 137 23 -94.31 gain 23 138 -96.41 gain 138 23 -95.42 gain 23 139 -88.55 gain 139 23 -90.82 gain 23 140 -89.47 gain 140 23 -92.57 gain 23 141 -87.39 gain 141 23 -82.46 gain 23 142 -90.28 gain 142 23 -92.10 gain 23 143 -94.86 gain 143 23 -99.41 gain 23 144 -95.68 gain 144 23 -98.60 gain 23 145 -94.81 gain 145 23 -101.12 gain 23 146 -90.37 gain 146 23 -92.67 gain 23 147 -96.34 gain 147 23 -95.74 gain 23 148 -90.47 gain 148 23 -88.20 gain 23 149 -95.16 gain 149 23 -96.55 gain 23 150 -89.48 gain 150 23 -91.70 gain 23 151 -90.53 gain 151 23 -91.70 gain 23 152 -94.34 gain 152 23 -95.32 gain 23 153 -102.25 gain 153 23 -102.45 gain 23 154 -94.62 gain 154 23 -96.72 gain 23 155 -93.87 gain 155 23 -94.54 gain 23 156 -91.34 gain 156 23 -91.24 gain 23 157 -88.31 gain 157 23 -90.70 gain 23 158 -87.75 gain 158 23 -89.64 gain 23 159 -89.00 gain 159 23 -93.27 gain 23 160 -90.79 gain 160 23 -92.21 gain 23 161 -90.44 gain 161 23 -94.30 gain 23 162 -95.78 gain 162 23 -99.35 gain 23 163 -91.05 gain 163 23 -96.53 gain 23 164 -100.35 gain 164 23 -105.21 gain 23 165 -93.43 gain 165 23 -95.34 gain 23 166 -94.70 gain 166 23 -96.37 gain 23 167 -96.18 gain 167 23 -98.56 gain 23 168 -90.78 gain 168 23 -92.06 gain 23 169 -99.94 gain 169 23 -102.33 gain 23 170 -89.84 gain 170 23 -91.46 gain 23 171 -89.46 gain 171 23 -92.17 gain 23 172 -95.72 gain 172 23 -96.62 gain 23 173 -95.92 gain 173 23 -101.47 gain 23 174 -90.76 gain 174 23 -92.35 gain 23 175 -87.82 gain 175 23 -90.54 gain 23 176 -88.72 gain 176 23 -90.42 gain 23 177 -94.91 gain 177 23 -99.60 gain 23 178 -95.72 gain 178 23 -93.86 gain 23 179 -103.38 gain 179 23 -100.94 gain 23 180 -91.26 gain 180 23 -98.27 gain 23 181 -100.15 gain 181 23 -101.18 gain 23 182 -95.87 gain 182 23 -97.99 gain 23 183 -101.72 gain 183 23 -104.11 gain 23 184 -94.27 gain 184 23 -99.41 gain 23 185 -92.95 gain 185 23 -101.96 gain 23 186 -92.72 gain 186 23 -97.31 gain 23 187 -88.99 gain 187 23 -91.30 gain 23 188 -92.70 gain 188 23 -97.43 gain 23 189 -93.31 gain 189 23 -92.76 gain 23 190 -96.38 gain 190 23 -99.75 gain 23 191 -95.34 gain 191 23 -97.42 gain 23 192 -91.17 gain 192 23 -91.94 gain 23 193 -92.12 gain 193 23 -91.88 gain 23 194 -89.45 gain 194 23 -89.98 gain 23 195 -93.09 gain 195 23 -92.18 gain 23 196 -100.75 gain 196 23 -104.15 gain 23 197 -87.95 gain 197 23 -86.48 gain 23 198 -96.40 gain 198 23 -99.44 gain 23 199 -93.81 gain 199 23 -96.96 gain 23 200 -89.36 gain 200 23 -93.85 gain 23 201 -94.37 gain 201 23 -98.77 gain 23 202 -96.58 gain 202 23 -100.11 gain 23 203 -91.48 gain 203 23 -94.12 gain 23 204 -87.50 gain 204 23 -86.79 gain 23 205 -91.53 gain 205 23 -94.56 gain 23 206 -93.43 gain 206 23 -97.57 gain 23 207 -106.98 gain 207 23 -110.54 gain 23 208 -94.92 gain 208 23 -101.07 gain 23 209 -98.35 gain 209 23 -104.08 gain 23 210 -95.48 gain 210 23 -101.39 gain 23 211 -96.59 gain 211 23 -97.72 gain 23 212 -92.65 gain 212 23 -96.80 gain 23 213 -94.14 gain 213 23 -97.61 gain 23 214 -94.19 gain 214 23 -103.05 gain 23 215 -87.52 gain 215 23 -91.78 gain 23 216 -91.02 gain 216 23 -99.19 gain 23 217 -100.88 gain 217 23 -109.32 gain 23 218 -99.64 gain 218 23 -100.88 gain 23 219 -100.52 gain 219 23 -102.25 gain 23 220 -99.23 gain 220 23 -97.04 gain 23 221 -95.72 gain 221 23 -99.21 gain 23 222 -92.82 gain 222 23 -92.12 gain 23 223 -100.88 gain 223 23 -103.42 gain 23 224 -102.60 gain 224 23 -105.60 gain 24 25 -59.04 gain 25 24 -61.72 gain 24 26 -74.64 gain 26 24 -78.75 gain 24 27 -82.20 gain 27 24 -83.92 gain 24 28 -84.09 gain 28 24 -81.14 gain 24 29 -86.12 gain 29 24 -84.71 gain 24 30 -86.22 gain 30 24 -89.82 gain 24 31 -83.58 gain 31 24 -83.74 gain 24 32 -83.82 gain 32 24 -81.33 gain 24 33 -86.42 gain 33 24 -85.38 gain 24 34 -87.66 gain 34 24 -87.25 gain 24 35 -80.55 gain 35 24 -81.09 gain 24 36 -79.67 gain 36 24 -80.35 gain 24 37 -72.69 gain 37 24 -75.92 gain 24 38 -70.10 gain 38 24 -70.86 gain 24 39 -66.69 gain 39 24 -71.77 gain 24 40 -63.62 gain 40 24 -63.68 gain 24 41 -81.37 gain 41 24 -76.78 gain 24 42 -80.11 gain 42 24 -82.76 gain 24 43 -84.69 gain 43 24 -84.93 gain 24 44 -84.86 gain 44 24 -88.70 gain 24 45 -92.56 gain 45 24 -96.38 gain 24 46 -91.76 gain 46 24 -92.05 gain 24 47 -90.57 gain 47 24 -88.55 gain 24 48 -87.31 gain 48 24 -84.87 gain 24 49 -87.46 gain 49 24 -89.08 gain 24 50 -83.52 gain 50 24 -82.00 gain 24 51 -77.92 gain 51 24 -80.09 gain 24 52 -79.71 gain 52 24 -79.12 gain 24 53 -74.87 gain 53 24 -74.84 gain 24 54 -66.56 gain 54 24 -65.93 gain 24 55 -75.22 gain 55 24 -71.51 gain 24 56 -70.58 gain 56 24 -71.92 gain 24 57 -81.76 gain 57 24 -82.18 gain 24 58 -87.73 gain 58 24 -84.85 gain 24 59 -83.09 gain 59 24 -79.45 gain 24 60 -89.97 gain 60 24 -95.62 gain 24 61 -96.88 gain 61 24 -94.43 gain 24 62 -90.92 gain 62 24 -85.98 gain 24 63 -88.52 gain 63 24 -87.55 gain 24 64 -97.37 gain 64 24 -100.62 gain 24 65 -83.19 gain 65 24 -81.99 gain 24 66 -82.97 gain 66 24 -80.75 gain 24 67 -78.33 gain 67 24 -77.34 gain 24 68 -85.12 gain 68 24 -86.72 gain 24 69 -75.16 gain 69 24 -73.98 gain 24 70 -76.93 gain 70 24 -74.21 gain 24 71 -78.45 gain 71 24 -79.31 gain 24 72 -88.37 gain 72 24 -86.78 gain 24 73 -85.40 gain 73 24 -85.18 gain 24 74 -84.80 gain 74 24 -80.69 gain 24 75 -92.68 gain 75 24 -94.46 gain 24 76 -91.93 gain 76 24 -93.83 gain 24 77 -89.33 gain 77 24 -87.23 gain 24 78 -95.98 gain 78 24 -98.39 gain 24 79 -92.20 gain 79 24 -94.23 gain 24 80 -86.24 gain 80 24 -86.06 gain 24 81 -89.08 gain 81 24 -89.81 gain 24 82 -82.90 gain 82 24 -84.60 gain 24 83 -87.17 gain 83 24 -86.14 gain 24 84 -70.76 gain 84 24 -66.92 gain 24 85 -79.81 gain 85 24 -81.40 gain 24 86 -81.54 gain 86 24 -84.77 gain 24 87 -85.58 gain 87 24 -86.09 gain 24 88 -90.02 gain 88 24 -90.17 gain 24 89 -90.66 gain 89 24 -92.96 gain 24 90 -99.12 gain 90 24 -100.76 gain 24 91 -94.10 gain 91 24 -96.81 gain 24 92 -95.48 gain 92 24 -99.11 gain 24 93 -87.93 gain 93 24 -88.92 gain 24 94 -92.52 gain 94 24 -92.07 gain 24 95 -95.28 gain 95 24 -94.08 gain 24 96 -80.13 gain 96 24 -85.90 gain 24 97 -85.22 gain 97 24 -83.81 gain 24 98 -85.42 gain 98 24 -84.48 gain 24 99 -79.22 gain 99 24 -77.42 gain 24 100 -89.10 gain 100 24 -87.21 gain 24 101 -86.06 gain 101 24 -87.80 gain 24 102 -91.30 gain 102 24 -93.01 gain 24 103 -83.38 gain 103 24 -86.25 gain 24 104 -93.88 gain 104 24 -99.25 gain 24 105 -91.18 gain 105 24 -91.07 gain 24 106 -97.38 gain 106 24 -94.59 gain 24 107 -87.94 gain 107 24 -85.06 gain 24 108 -94.32 gain 108 24 -91.06 gain 24 109 -94.95 gain 109 24 -95.14 gain 24 110 -90.34 gain 110 24 -96.88 gain 24 111 -91.33 gain 111 24 -87.84 gain 24 112 -94.11 gain 112 24 -94.09 gain 24 113 -84.48 gain 113 24 -83.59 gain 24 114 -88.11 gain 114 24 -84.38 gain 24 115 -87.03 gain 115 24 -83.96 gain 24 116 -85.17 gain 116 24 -84.53 gain 24 117 -90.57 gain 117 24 -87.08 gain 24 118 -90.85 gain 118 24 -88.97 gain 24 119 -95.01 gain 119 24 -98.19 gain 24 120 -90.41 gain 120 24 -90.98 gain 24 121 -102.79 gain 121 24 -104.38 gain 24 122 -89.54 gain 122 24 -90.88 gain 24 123 -89.68 gain 123 24 -91.37 gain 24 124 -90.09 gain 124 24 -89.76 gain 24 125 -92.20 gain 125 24 -95.21 gain 24 126 -92.40 gain 126 24 -92.05 gain 24 127 -93.67 gain 127 24 -92.96 gain 24 128 -92.70 gain 128 24 -94.58 gain 24 129 -95.53 gain 129 24 -94.62 gain 24 130 -86.41 gain 130 24 -86.79 gain 24 131 -89.22 gain 131 24 -89.38 gain 24 132 -90.10 gain 132 24 -86.26 gain 24 133 -94.60 gain 133 24 -95.93 gain 24 134 -96.65 gain 134 24 -94.85 gain 24 135 -97.23 gain 135 24 -97.74 gain 24 136 -99.39 gain 136 24 -100.33 gain 24 137 -94.22 gain 137 24 -98.07 gain 24 138 -91.71 gain 138 24 -89.10 gain 24 139 -88.96 gain 139 24 -89.62 gain 24 140 -95.93 gain 140 24 -97.42 gain 24 141 -96.75 gain 141 24 -90.21 gain 24 142 -88.40 gain 142 24 -88.60 gain 24 143 -88.31 gain 143 24 -91.24 gain 24 144 -93.78 gain 144 24 -95.08 gain 24 145 -96.26 gain 145 24 -100.95 gain 24 146 -98.05 gain 146 24 -98.73 gain 24 147 -106.25 gain 147 24 -104.03 gain 24 148 -91.79 gain 148 24 -87.90 gain 24 149 -102.86 gain 149 24 -102.63 gain 24 150 -93.96 gain 150 24 -94.57 gain 24 151 -98.40 gain 151 24 -97.94 gain 24 152 -97.05 gain 152 24 -96.41 gain 24 153 -93.78 gain 153 24 -92.36 gain 24 154 -95.92 gain 154 24 -96.40 gain 24 155 -90.44 gain 155 24 -89.49 gain 24 156 -101.70 gain 156 24 -99.99 gain 24 157 -100.66 gain 157 24 -101.43 gain 24 158 -98.00 gain 158 24 -98.27 gain 24 159 -92.03 gain 159 24 -94.68 gain 24 160 -87.28 gain 160 24 -87.08 gain 24 161 -101.86 gain 161 24 -104.10 gain 24 162 -96.95 gain 162 24 -98.90 gain 24 163 -97.51 gain 163 24 -101.37 gain 24 164 -89.73 gain 164 24 -92.97 gain 24 165 -100.27 gain 165 24 -100.56 gain 24 166 -92.58 gain 166 24 -92.63 gain 24 167 -95.43 gain 167 24 -96.19 gain 24 168 -99.39 gain 168 24 -99.05 gain 24 169 -91.19 gain 169 24 -91.96 gain 24 170 -97.46 gain 170 24 -97.47 gain 24 171 -92.87 gain 171 24 -93.96 gain 24 172 -97.62 gain 172 24 -96.90 gain 24 173 -95.43 gain 173 24 -99.36 gain 24 174 -95.12 gain 174 24 -95.09 gain 24 175 -101.41 gain 175 24 -102.52 gain 24 176 -95.64 gain 176 24 -95.72 gain 24 177 -96.26 gain 177 24 -99.34 gain 24 178 -101.93 gain 178 24 -98.45 gain 24 179 -100.73 gain 179 24 -96.67 gain 24 180 -100.55 gain 180 24 -105.94 gain 24 181 -103.89 gain 181 24 -103.31 gain 24 182 -94.48 gain 182 24 -94.99 gain 24 183 -98.19 gain 183 24 -98.96 gain 24 184 -104.52 gain 184 24 -108.04 gain 24 185 -98.58 gain 185 24 -105.97 gain 24 186 -91.84 gain 186 24 -94.81 gain 24 187 -97.04 gain 187 24 -97.74 gain 24 188 -86.24 gain 188 24 -89.35 gain 24 189 -100.41 gain 189 24 -98.25 gain 24 190 -91.90 gain 190 24 -93.65 gain 24 191 -94.35 gain 191 24 -94.81 gain 24 192 -96.82 gain 192 24 -95.98 gain 24 193 -96.44 gain 193 24 -94.58 gain 24 194 -94.69 gain 194 24 -93.61 gain 24 195 -100.36 gain 195 24 -97.83 gain 24 196 -98.93 gain 196 24 -100.71 gain 24 197 -96.38 gain 197 24 -93.29 gain 24 198 -100.04 gain 198 24 -101.47 gain 24 199 -96.61 gain 199 24 -98.14 gain 24 200 -94.37 gain 200 24 -97.25 gain 24 201 -90.29 gain 201 24 -93.07 gain 24 202 -104.39 gain 202 24 -106.30 gain 24 203 -102.69 gain 203 24 -103.72 gain 24 204 -94.40 gain 204 24 -92.07 gain 24 205 -93.49 gain 205 24 -94.91 gain 24 206 -109.51 gain 206 24 -112.03 gain 24 207 -95.00 gain 207 24 -96.94 gain 24 208 -99.77 gain 208 24 -104.31 gain 24 209 -95.93 gain 209 24 -100.04 gain 24 210 -107.75 gain 210 24 -112.04 gain 24 211 -96.43 gain 211 24 -95.95 gain 24 212 -103.19 gain 212 24 -105.72 gain 24 213 -105.78 gain 213 24 -107.64 gain 24 214 -100.18 gain 214 24 -107.42 gain 24 215 -98.17 gain 215 24 -100.82 gain 24 216 -102.14 gain 216 24 -108.70 gain 24 217 -97.88 gain 217 24 -104.70 gain 24 218 -89.93 gain 218 24 -89.56 gain 24 219 -100.56 gain 219 24 -100.67 gain 24 220 -101.49 gain 220 24 -97.68 gain 24 221 -100.76 gain 221 24 -102.63 gain 24 222 -103.44 gain 222 24 -101.11 gain 24 223 -101.95 gain 223 24 -102.87 gain 24 224 -95.30 gain 224 24 -96.69 gain 25 26 -61.27 gain 26 25 -62.70 gain 25 27 -70.73 gain 27 25 -69.76 gain 25 28 -89.00 gain 28 25 -83.36 gain 25 29 -83.31 gain 29 25 -79.22 gain 25 30 -99.61 gain 30 25 -100.53 gain 25 31 -94.95 gain 31 25 -92.43 gain 25 32 -93.99 gain 32 25 -88.82 gain 25 33 -90.58 gain 33 25 -86.86 gain 25 34 -93.10 gain 34 25 -90.02 gain 25 35 -87.96 gain 35 25 -85.82 gain 25 36 -84.33 gain 36 25 -82.34 gain 25 37 -78.74 gain 37 25 -79.28 gain 25 38 -77.58 gain 38 25 -75.66 gain 25 39 -57.85 gain 39 25 -60.25 gain 25 40 -72.69 gain 40 25 -70.07 gain 25 41 -69.09 gain 41 25 -61.82 gain 25 42 -77.70 gain 42 25 -77.67 gain 25 43 -85.36 gain 43 25 -82.92 gain 25 44 -87.00 gain 44 25 -88.15 gain 25 45 -99.63 gain 45 25 -100.77 gain 25 46 -90.77 gain 46 25 -88.37 gain 25 47 -95.78 gain 47 25 -91.09 gain 25 48 -90.56 gain 48 25 -85.44 gain 25 49 -89.85 gain 49 25 -88.79 gain 25 50 -87.63 gain 50 25 -83.44 gain 25 51 -91.79 gain 51 25 -91.28 gain 25 52 -79.68 gain 52 25 -76.41 gain 25 53 -82.75 gain 53 25 -80.03 gain 25 54 -74.44 gain 54 25 -71.13 gain 25 55 -81.40 gain 55 25 -75.01 gain 25 56 -80.25 gain 56 25 -78.90 gain 25 57 -77.22 gain 57 25 -74.96 gain 25 58 -84.14 gain 58 25 -78.58 gain 25 59 -88.02 gain 59 25 -81.71 gain 25 60 -96.32 gain 60 25 -99.29 gain 25 61 -98.19 gain 61 25 -93.06 gain 25 62 -97.33 gain 62 25 -89.71 gain 25 63 -100.71 gain 63 25 -97.06 gain 25 64 -95.46 gain 64 25 -96.03 gain 25 65 -86.40 gain 65 25 -82.52 gain 25 66 -88.64 gain 66 25 -83.75 gain 25 67 -83.03 gain 67 25 -79.36 gain 25 68 -72.62 gain 68 25 -71.54 gain 25 69 -90.98 gain 69 25 -87.12 gain 25 70 -75.33 gain 70 25 -69.93 gain 25 71 -80.36 gain 71 25 -78.54 gain 25 72 -84.66 gain 72 25 -80.39 gain 25 73 -85.08 gain 73 25 -82.18 gain 25 74 -92.22 gain 74 25 -85.43 gain 25 75 -93.15 gain 75 25 -92.26 gain 25 76 -92.68 gain 76 25 -91.91 gain 25 77 -90.53 gain 77 25 -85.75 gain 25 78 -102.49 gain 78 25 -102.21 gain 25 79 -92.13 gain 79 25 -91.47 gain 25 80 -88.05 gain 80 25 -85.19 gain 25 81 -94.26 gain 81 25 -92.31 gain 25 82 -90.63 gain 82 25 -89.65 gain 25 83 -89.71 gain 83 25 -86.00 gain 25 84 -86.17 gain 84 25 -79.65 gain 25 85 -89.71 gain 85 25 -88.62 gain 25 86 -82.21 gain 86 25 -82.76 gain 25 87 -95.78 gain 87 25 -93.62 gain 25 88 -92.72 gain 88 25 -90.20 gain 25 89 -93.63 gain 89 25 -93.26 gain 25 90 -98.56 gain 90 25 -97.52 gain 25 91 -99.29 gain 91 25 -99.32 gain 25 92 -97.24 gain 92 25 -98.19 gain 25 93 -88.93 gain 93 25 -87.24 gain 25 94 -93.82 gain 94 25 -90.69 gain 25 95 -88.22 gain 95 25 -84.34 gain 25 96 -90.43 gain 96 25 -93.52 gain 25 97 -96.09 gain 97 25 -92.00 gain 25 98 -91.54 gain 98 25 -87.92 gain 25 99 -82.15 gain 99 25 -77.67 gain 25 100 -84.34 gain 100 25 -79.77 gain 25 101 -84.26 gain 101 25 -83.33 gain 25 102 -95.87 gain 102 25 -94.90 gain 25 103 -89.76 gain 103 25 -89.96 gain 25 104 -102.87 gain 104 25 -105.55 gain 25 105 -104.53 gain 105 25 -101.73 gain 25 106 -97.97 gain 106 25 -92.50 gain 25 107 -101.49 gain 107 25 -95.93 gain 25 108 -91.88 gain 108 25 -85.93 gain 25 109 -98.94 gain 109 25 -96.45 gain 25 110 -92.55 gain 110 25 -96.42 gain 25 111 -91.22 gain 111 25 -85.06 gain 25 112 -89.39 gain 112 25 -86.69 gain 25 113 -89.94 gain 113 25 -86.37 gain 25 114 -86.14 gain 114 25 -79.73 gain 25 115 -77.19 gain 115 25 -71.44 gain 25 116 -90.18 gain 116 25 -86.86 gain 25 117 -89.88 gain 117 25 -83.70 gain 25 118 -91.22 gain 118 25 -86.66 gain 25 119 -92.68 gain 119 25 -93.19 gain 25 120 -100.41 gain 120 25 -98.30 gain 25 121 -98.00 gain 121 25 -96.91 gain 25 122 -90.04 gain 122 25 -88.70 gain 25 123 -99.10 gain 123 25 -98.10 gain 25 124 -94.69 gain 124 25 -91.68 gain 25 125 -94.73 gain 125 25 -95.06 gain 25 126 -93.70 gain 126 25 -90.68 gain 25 127 -95.64 gain 127 25 -92.25 gain 25 128 -95.30 gain 128 25 -94.49 gain 25 129 -97.48 gain 129 25 -93.89 gain 25 130 -97.02 gain 130 25 -94.72 gain 25 131 -91.83 gain 131 25 -89.30 gain 25 132 -83.90 gain 132 25 -77.38 gain 25 133 -95.06 gain 133 25 -93.71 gain 25 134 -93.24 gain 134 25 -88.76 gain 25 135 -94.81 gain 135 25 -92.64 gain 25 136 -98.79 gain 136 25 -97.06 gain 25 137 -99.10 gain 137 25 -100.28 gain 25 138 -96.04 gain 138 25 -90.75 gain 25 139 -95.70 gain 139 25 -93.67 gain 25 140 -97.24 gain 140 25 -96.04 gain 25 141 -95.63 gain 141 25 -86.41 gain 25 142 -97.96 gain 142 25 -95.47 gain 25 143 -97.67 gain 143 25 -97.93 gain 25 144 -91.61 gain 144 25 -90.23 gain 25 145 -92.77 gain 145 25 -94.78 gain 25 146 -90.90 gain 146 25 -88.90 gain 25 147 -93.32 gain 147 25 -88.43 gain 25 148 -97.18 gain 148 25 -90.61 gain 25 149 -100.17 gain 149 25 -97.26 gain 25 150 -98.72 gain 150 25 -96.65 gain 25 151 -95.51 gain 151 25 -92.38 gain 25 152 -97.74 gain 152 25 -94.42 gain 25 153 -93.86 gain 153 25 -89.76 gain 25 154 -103.73 gain 154 25 -101.53 gain 25 155 -89.60 gain 155 25 -85.97 gain 25 156 -101.54 gain 156 25 -97.15 gain 25 157 -89.14 gain 157 25 -87.22 gain 25 158 -98.81 gain 158 25 -96.40 gain 25 159 -97.08 gain 159 25 -97.05 gain 25 160 -90.18 gain 160 25 -87.31 gain 25 161 -94.33 gain 161 25 -93.89 gain 25 162 -98.12 gain 162 25 -97.39 gain 25 163 -93.51 gain 163 25 -94.69 gain 25 164 -101.90 gain 164 25 -102.46 gain 25 165 -106.40 gain 165 25 -104.01 gain 25 166 -108.92 gain 166 25 -106.29 gain 25 167 -99.36 gain 167 25 -97.45 gain 25 168 -104.51 gain 168 25 -101.49 gain 25 169 -97.57 gain 169 25 -95.67 gain 25 170 -92.98 gain 170 25 -90.31 gain 25 171 -101.53 gain 171 25 -99.94 gain 25 172 -98.13 gain 172 25 -94.73 gain 25 173 -99.34 gain 173 25 -100.59 gain 25 174 -98.77 gain 174 25 -96.07 gain 25 175 -90.01 gain 175 25 -88.44 gain 25 176 -97.39 gain 176 25 -94.79 gain 25 177 -101.76 gain 177 25 -102.17 gain 25 178 -95.83 gain 178 25 -89.67 gain 25 179 -98.29 gain 179 25 -91.55 gain 25 180 -105.76 gain 180 25 -108.48 gain 25 181 -93.95 gain 181 25 -90.68 gain 25 182 -97.87 gain 182 25 -95.69 gain 25 183 -103.23 gain 183 25 -101.33 gain 25 184 -95.73 gain 184 25 -96.58 gain 25 185 -101.46 gain 185 25 -106.17 gain 25 186 -97.38 gain 186 25 -97.67 gain 25 187 -93.87 gain 187 25 -91.89 gain 25 188 -97.61 gain 188 25 -98.05 gain 25 189 -104.39 gain 189 25 -99.54 gain 25 190 -92.00 gain 190 25 -91.08 gain 25 191 -98.94 gain 191 25 -96.72 gain 25 192 -95.48 gain 192 25 -91.96 gain 25 193 -100.65 gain 193 25 -96.11 gain 25 194 -94.17 gain 194 25 -90.41 gain 25 195 -111.14 gain 195 25 -105.93 gain 25 196 -109.15 gain 196 25 -108.25 gain 25 197 -101.07 gain 197 25 -95.30 gain 25 198 -102.72 gain 198 25 -101.47 gain 25 199 -104.43 gain 199 25 -103.29 gain 25 200 -94.49 gain 200 25 -94.68 gain 25 201 -97.91 gain 201 25 -98.01 gain 25 202 -102.12 gain 202 25 -101.35 gain 25 203 -102.96 gain 203 25 -101.31 gain 25 204 -101.60 gain 204 25 -96.59 gain 25 205 -95.40 gain 205 25 -94.13 gain 25 206 -96.47 gain 206 25 -96.31 gain 25 207 -97.10 gain 207 25 -96.36 gain 25 208 -100.61 gain 208 25 -102.47 gain 25 209 -101.12 gain 209 25 -102.55 gain 25 210 -101.82 gain 210 25 -103.43 gain 25 211 -103.42 gain 211 25 -100.26 gain 25 212 -109.67 gain 212 25 -109.52 gain 25 213 -102.09 gain 213 25 -101.27 gain 25 214 -101.92 gain 214 25 -106.49 gain 25 215 -95.92 gain 215 25 -95.89 gain 25 216 -104.80 gain 216 25 -108.67 gain 25 217 -100.49 gain 217 25 -104.63 gain 25 218 -104.61 gain 218 25 -101.55 gain 25 219 -101.53 gain 219 25 -98.96 gain 25 220 -96.24 gain 220 25 -89.75 gain 25 221 -100.44 gain 221 25 -99.63 gain 25 222 -100.82 gain 222 25 -95.82 gain 25 223 -104.12 gain 223 25 -102.36 gain 25 224 -107.79 gain 224 25 -106.49 gain 26 27 -71.35 gain 27 26 -68.96 gain 26 28 -81.53 gain 28 26 -74.47 gain 26 29 -76.37 gain 29 26 -70.85 gain 26 30 -109.29 gain 30 26 -108.78 gain 26 31 -100.26 gain 31 26 -96.31 gain 26 32 -95.32 gain 32 26 -88.72 gain 26 33 -98.40 gain 33 26 -93.25 gain 26 34 -91.94 gain 34 26 -87.42 gain 26 35 -93.33 gain 35 26 -89.76 gain 26 36 -86.53 gain 36 26 -83.11 gain 26 37 -83.95 gain 37 26 -83.06 gain 26 38 -83.35 gain 38 26 -80.00 gain 26 39 -75.47 gain 39 26 -76.44 gain 26 40 -74.79 gain 40 26 -70.74 gain 26 41 -72.02 gain 41 26 -63.31 gain 26 42 -66.75 gain 42 26 -65.29 gain 26 43 -79.81 gain 43 26 -75.95 gain 26 44 -84.03 gain 44 26 -83.76 gain 26 45 -100.92 gain 45 26 -100.64 gain 26 46 -96.66 gain 46 26 -92.83 gain 26 47 -100.68 gain 47 26 -94.55 gain 26 48 -99.88 gain 48 26 -93.33 gain 26 49 -95.50 gain 49 26 -93.01 gain 26 50 -87.01 gain 50 26 -81.38 gain 26 51 -93.33 gain 51 26 -91.40 gain 26 52 -85.50 gain 52 26 -80.80 gain 26 53 -88.40 gain 53 26 -84.26 gain 26 54 -78.95 gain 54 26 -74.22 gain 26 55 -82.98 gain 55 26 -75.16 gain 26 56 -73.72 gain 56 26 -70.95 gain 26 57 -82.01 gain 57 26 -78.32 gain 26 58 -84.62 gain 58 26 -77.62 gain 26 59 -85.09 gain 59 26 -77.35 gain 26 60 -97.14 gain 60 26 -98.68 gain 26 61 -99.93 gain 61 26 -93.37 gain 26 62 -99.88 gain 62 26 -90.83 gain 26 63 -99.25 gain 63 26 -94.17 gain 26 64 -92.86 gain 64 26 -92.01 gain 26 65 -95.62 gain 65 26 -90.31 gain 26 66 -97.58 gain 66 26 -91.26 gain 26 67 -84.69 gain 67 26 -79.59 gain 26 68 -85.15 gain 68 26 -82.64 gain 26 69 -86.01 gain 69 26 -80.72 gain 26 70 -87.95 gain 70 26 -81.13 gain 26 71 -75.17 gain 71 26 -71.92 gain 26 72 -77.70 gain 72 26 -72.00 gain 26 73 -86.00 gain 73 26 -81.67 gain 26 74 -86.35 gain 74 26 -78.14 gain 26 75 -105.85 gain 75 26 -103.53 gain 26 76 -95.83 gain 76 26 -93.63 gain 26 77 -92.01 gain 77 26 -85.81 gain 26 78 -92.52 gain 78 26 -90.82 gain 26 79 -89.29 gain 79 26 -87.20 gain 26 80 -90.53 gain 80 26 -86.23 gain 26 81 -89.25 gain 81 26 -85.86 gain 26 82 -88.32 gain 82 26 -85.91 gain 26 83 -94.99 gain 83 26 -89.86 gain 26 84 -94.44 gain 84 26 -86.49 gain 26 85 -82.94 gain 85 26 -80.42 gain 26 86 -84.65 gain 86 26 -83.77 gain 26 87 -82.15 gain 87 26 -78.56 gain 26 88 -89.85 gain 88 26 -85.90 gain 26 89 -102.38 gain 89 26 -100.58 gain 26 90 -109.26 gain 90 26 -106.80 gain 26 91 -98.37 gain 91 26 -96.97 gain 26 92 -95.05 gain 92 26 -94.57 gain 26 93 -95.22 gain 93 26 -92.10 gain 26 94 -89.95 gain 94 26 -85.40 gain 26 95 -91.68 gain 95 26 -86.37 gain 26 96 -92.42 gain 96 26 -94.08 gain 26 97 -96.09 gain 97 26 -90.57 gain 26 98 -89.75 gain 98 26 -84.70 gain 26 99 -97.67 gain 99 26 -91.76 gain 26 100 -84.17 gain 100 26 -78.18 gain 26 101 -90.73 gain 101 26 -88.36 gain 26 102 -91.03 gain 102 26 -88.63 gain 26 103 -89.74 gain 103 26 -88.51 gain 26 104 -91.60 gain 104 26 -92.85 gain 26 105 -98.50 gain 105 26 -94.27 gain 26 106 -104.34 gain 106 26 -97.45 gain 26 107 -94.98 gain 107 26 -87.99 gain 26 108 -96.76 gain 108 26 -89.39 gain 26 109 -102.28 gain 109 26 -98.36 gain 26 110 -89.26 gain 110 26 -91.69 gain 26 111 -89.77 gain 111 26 -82.18 gain 26 112 -87.72 gain 112 26 -83.59 gain 26 113 -98.63 gain 113 26 -93.63 gain 26 114 -97.39 gain 114 26 -89.55 gain 26 115 -88.44 gain 115 26 -81.27 gain 26 116 -88.17 gain 116 26 -83.42 gain 26 117 -96.79 gain 117 26 -89.19 gain 26 118 -92.94 gain 118 26 -86.96 gain 26 119 -92.91 gain 119 26 -91.98 gain 26 120 -98.74 gain 120 26 -95.20 gain 26 121 -105.07 gain 121 26 -102.55 gain 26 122 -95.65 gain 122 26 -92.88 gain 26 123 -104.54 gain 123 26 -102.11 gain 26 124 -93.59 gain 124 26 -89.15 gain 26 125 -92.42 gain 125 26 -91.32 gain 26 126 -97.01 gain 126 26 -92.56 gain 26 127 -93.73 gain 127 26 -88.91 gain 26 128 -89.59 gain 128 26 -87.36 gain 26 129 -92.99 gain 129 26 -87.97 gain 26 130 -87.19 gain 130 26 -83.46 gain 26 131 -97.70 gain 131 26 -93.74 gain 26 132 -94.15 gain 132 26 -86.21 gain 26 133 -91.57 gain 133 26 -88.80 gain 26 134 -93.84 gain 134 26 -87.94 gain 26 135 -107.15 gain 135 26 -103.54 gain 26 136 -102.21 gain 136 26 -99.04 gain 26 137 -97.97 gain 137 26 -97.72 gain 26 138 -101.05 gain 138 26 -94.33 gain 26 139 -93.23 gain 139 26 -89.78 gain 26 140 -105.53 gain 140 26 -102.90 gain 26 141 -97.02 gain 141 26 -86.37 gain 26 142 -93.43 gain 142 26 -89.52 gain 26 143 -101.61 gain 143 26 -100.43 gain 26 144 -92.97 gain 144 26 -90.16 gain 26 145 -94.90 gain 145 26 -95.48 gain 26 146 -94.32 gain 146 26 -90.89 gain 26 147 -95.54 gain 147 26 -89.22 gain 26 148 -95.51 gain 148 26 -87.51 gain 26 149 -95.22 gain 149 26 -90.88 gain 26 150 -103.26 gain 150 26 -99.75 gain 26 151 -105.09 gain 151 26 -100.53 gain 26 152 -110.86 gain 152 26 -106.12 gain 26 153 -96.70 gain 153 26 -91.17 gain 26 154 -105.00 gain 154 26 -101.37 gain 26 155 -103.14 gain 155 26 -98.09 gain 26 156 -106.83 gain 156 26 -101.00 gain 26 157 -97.60 gain 157 26 -94.26 gain 26 158 -99.91 gain 158 26 -96.06 gain 26 159 -98.99 gain 159 26 -97.53 gain 26 160 -86.21 gain 160 26 -81.91 gain 26 161 -97.89 gain 161 26 -96.03 gain 26 162 -105.26 gain 162 26 -103.10 gain 26 163 -96.26 gain 163 26 -96.02 gain 26 164 -97.23 gain 164 26 -96.36 gain 26 165 -94.66 gain 165 26 -90.85 gain 26 166 -105.23 gain 166 26 -101.17 gain 26 167 -103.67 gain 167 26 -100.33 gain 26 168 -105.98 gain 168 26 -101.53 gain 26 169 -107.51 gain 169 26 -104.18 gain 26 170 -102.76 gain 170 26 -98.66 gain 26 171 -100.40 gain 171 26 -97.39 gain 26 172 -99.08 gain 172 26 -94.25 gain 26 173 -98.44 gain 173 26 -98.26 gain 26 174 -98.46 gain 174 26 -94.32 gain 26 175 -106.39 gain 175 26 -103.39 gain 26 176 -93.24 gain 176 26 -89.21 gain 26 177 -95.98 gain 177 26 -94.96 gain 26 178 -98.69 gain 178 26 -91.10 gain 26 179 -94.79 gain 179 26 -86.63 gain 26 180 -110.89 gain 180 26 -112.18 gain 26 181 -100.90 gain 181 26 -96.21 gain 26 182 -101.69 gain 182 26 -98.09 gain 26 183 -97.21 gain 183 26 -93.88 gain 26 184 -95.60 gain 184 26 -95.02 gain 26 185 -100.53 gain 185 26 -103.82 gain 26 186 -105.77 gain 186 26 -104.63 gain 26 187 -100.79 gain 187 26 -97.38 gain 26 188 -100.54 gain 188 26 -99.54 gain 26 189 -95.11 gain 189 26 -88.84 gain 26 190 -106.23 gain 190 26 -103.87 gain 26 191 -103.29 gain 191 26 -99.64 gain 26 192 -101.75 gain 192 26 -96.79 gain 26 193 -102.39 gain 193 26 -96.42 gain 26 194 -96.52 gain 194 26 -91.33 gain 26 195 -97.86 gain 195 26 -91.22 gain 26 196 -109.40 gain 196 26 -107.07 gain 26 197 -99.02 gain 197 26 -91.82 gain 26 198 -103.27 gain 198 26 -100.59 gain 26 199 -99.26 gain 199 26 -96.69 gain 26 200 -96.45 gain 200 26 -95.21 gain 26 201 -106.24 gain 201 26 -104.91 gain 26 202 -104.56 gain 202 26 -102.37 gain 26 203 -104.80 gain 203 26 -101.72 gain 26 204 -107.66 gain 204 26 -101.22 gain 26 205 -104.29 gain 205 26 -101.59 gain 26 206 -103.45 gain 206 26 -101.86 gain 26 207 -97.51 gain 207 26 -95.34 gain 26 208 -107.11 gain 208 26 -107.54 gain 26 209 -101.50 gain 209 26 -101.50 gain 26 210 -102.43 gain 210 26 -102.61 gain 26 211 -109.52 gain 211 26 -104.93 gain 26 212 -101.21 gain 212 26 -99.63 gain 26 213 -108.96 gain 213 26 -106.71 gain 26 214 -101.19 gain 214 26 -104.33 gain 26 215 -100.70 gain 215 26 -99.24 gain 26 216 -100.81 gain 216 26 -103.26 gain 26 217 -100.58 gain 217 26 -103.29 gain 26 218 -98.98 gain 218 26 -94.50 gain 26 219 -99.98 gain 219 26 -95.98 gain 26 220 -104.45 gain 220 26 -96.53 gain 26 221 -101.37 gain 221 26 -99.13 gain 26 222 -104.14 gain 222 26 -97.71 gain 26 223 -103.45 gain 223 26 -100.27 gain 26 224 -108.00 gain 224 26 -105.28 gain 27 28 -65.62 gain 28 27 -60.95 gain 27 29 -75.93 gain 29 27 -72.80 gain 27 30 -98.24 gain 30 27 -100.12 gain 27 31 -93.40 gain 31 27 -91.84 gain 27 32 -91.04 gain 32 27 -86.84 gain 27 33 -98.86 gain 33 27 -96.10 gain 27 34 -94.30 gain 34 27 -92.18 gain 27 35 -93.57 gain 35 27 -92.39 gain 27 36 -96.02 gain 36 27 -94.99 gain 27 37 -86.33 gain 37 27 -87.83 gain 27 38 -88.93 gain 38 27 -87.97 gain 27 39 -80.87 gain 39 27 -84.23 gain 27 40 -81.26 gain 40 27 -79.60 gain 27 41 -72.93 gain 41 27 -66.61 gain 27 42 -70.28 gain 42 27 -71.22 gain 27 43 -74.81 gain 43 27 -73.33 gain 27 44 -78.48 gain 44 27 -80.59 gain 27 45 -106.81 gain 45 27 -108.91 gain 27 46 -95.08 gain 46 27 -93.65 gain 27 47 -90.48 gain 47 27 -86.75 gain 27 48 -101.92 gain 48 27 -97.76 gain 27 49 -91.95 gain 49 27 -91.85 gain 27 50 -88.33 gain 50 27 -85.09 gain 27 51 -92.95 gain 51 27 -93.41 gain 27 52 -95.96 gain 52 27 -93.65 gain 27 53 -87.42 gain 53 27 -85.66 gain 27 54 -83.47 gain 54 27 -81.13 gain 27 55 -83.30 gain 55 27 -77.87 gain 27 56 -83.70 gain 56 27 -83.32 gain 27 57 -76.66 gain 57 27 -75.36 gain 27 58 -80.13 gain 58 27 -75.52 gain 27 59 -76.88 gain 59 27 -71.53 gain 27 60 -103.97 gain 60 27 -107.90 gain 27 61 -101.48 gain 61 27 -97.31 gain 27 62 -97.07 gain 62 27 -90.41 gain 27 63 -92.67 gain 63 27 -89.98 gain 27 64 -91.91 gain 64 27 -93.45 gain 27 65 -89.23 gain 65 27 -86.31 gain 27 66 -87.30 gain 66 27 -83.37 gain 27 67 -90.22 gain 67 27 -87.51 gain 27 68 -93.96 gain 68 27 -93.85 gain 27 69 -86.25 gain 69 27 -83.35 gain 27 70 -80.80 gain 70 27 -76.37 gain 27 71 -84.64 gain 71 27 -83.77 gain 27 72 -76.47 gain 72 27 -73.16 gain 27 73 -84.62 gain 73 27 -82.68 gain 27 74 -90.43 gain 74 27 -84.60 gain 27 75 -103.10 gain 75 27 -103.16 gain 27 76 -95.62 gain 76 27 -95.81 gain 27 77 -96.68 gain 77 27 -92.86 gain 27 78 -93.13 gain 78 27 -93.82 gain 27 79 -88.18 gain 79 27 -88.48 gain 27 80 -94.16 gain 80 27 -92.26 gain 27 81 -91.12 gain 81 27 -90.13 gain 27 82 -87.74 gain 82 27 -87.72 gain 27 83 -86.75 gain 83 27 -84.01 gain 27 84 -77.79 gain 84 27 -72.23 gain 27 85 -80.07 gain 85 27 -79.94 gain 27 86 -80.19 gain 86 27 -81.70 gain 27 87 -82.05 gain 87 27 -80.84 gain 27 88 -90.88 gain 88 27 -89.32 gain 27 89 -81.52 gain 89 27 -82.11 gain 27 90 -96.01 gain 90 27 -95.94 gain 27 91 -97.32 gain 91 27 -98.31 gain 27 92 -96.76 gain 92 27 -98.67 gain 27 93 -95.82 gain 93 27 -95.09 gain 27 94 -96.37 gain 94 27 -94.20 gain 27 95 -90.08 gain 95 27 -87.16 gain 27 96 -89.08 gain 96 27 -93.13 gain 27 97 -93.74 gain 97 27 -90.61 gain 27 98 -88.95 gain 98 27 -86.29 gain 27 99 -86.49 gain 99 27 -82.97 gain 27 100 -95.54 gain 100 27 -91.94 gain 27 101 -87.69 gain 101 27 -87.71 gain 27 102 -80.35 gain 102 27 -80.34 gain 27 103 -88.92 gain 103 27 -90.07 gain 27 104 -84.68 gain 104 27 -88.32 gain 27 105 -98.95 gain 105 27 -97.12 gain 27 106 -102.05 gain 106 27 -97.55 gain 27 107 -97.93 gain 107 27 -93.33 gain 27 108 -94.18 gain 108 27 -89.19 gain 27 109 -95.05 gain 109 27 -93.52 gain 27 110 -100.42 gain 110 27 -105.25 gain 27 111 -90.57 gain 111 27 -85.37 gain 27 112 -89.90 gain 112 27 -88.16 gain 27 113 -91.88 gain 113 27 -89.27 gain 27 114 -97.90 gain 114 27 -92.45 gain 27 115 -90.20 gain 115 27 -85.41 gain 27 116 -83.11 gain 116 27 -80.75 gain 27 117 -88.35 gain 117 27 -83.14 gain 27 118 -91.29 gain 118 27 -87.70 gain 27 119 -98.05 gain 119 27 -99.52 gain 27 120 -102.95 gain 120 27 -101.80 gain 27 121 -98.04 gain 121 27 -97.91 gain 27 122 -91.13 gain 122 27 -90.75 gain 27 123 -96.69 gain 123 27 -96.65 gain 27 124 -94.02 gain 124 27 -91.97 gain 27 125 -96.29 gain 125 27 -97.58 gain 27 126 -92.34 gain 126 27 -90.28 gain 27 127 -95.04 gain 127 27 -92.61 gain 27 128 -89.99 gain 128 27 -90.15 gain 27 129 -91.89 gain 129 27 -89.26 gain 27 130 -93.56 gain 130 27 -92.22 gain 27 131 -94.74 gain 131 27 -93.18 gain 27 132 -86.91 gain 132 27 -81.36 gain 27 133 -90.01 gain 133 27 -89.63 gain 27 134 -92.36 gain 134 27 -88.84 gain 27 135 -95.87 gain 135 27 -94.65 gain 27 136 -101.11 gain 136 27 -100.33 gain 27 137 -103.18 gain 137 27 -105.32 gain 27 138 -96.86 gain 138 27 -92.53 gain 27 139 -89.12 gain 139 27 -88.06 gain 27 140 -99.02 gain 140 27 -98.78 gain 27 141 -94.45 gain 141 27 -86.19 gain 27 142 -97.39 gain 142 27 -95.87 gain 27 143 -97.73 gain 143 27 -98.95 gain 27 144 -95.99 gain 144 27 -95.57 gain 27 145 -90.32 gain 145 27 -93.29 gain 27 146 -83.38 gain 146 27 -82.34 gain 27 147 -99.33 gain 147 27 -95.40 gain 27 148 -93.77 gain 148 27 -88.17 gain 27 149 -95.10 gain 149 27 -93.15 gain 27 150 -100.17 gain 150 27 -99.06 gain 27 151 -102.49 gain 151 27 -100.32 gain 27 152 -97.90 gain 152 27 -95.54 gain 27 153 -100.65 gain 153 27 -97.51 gain 27 154 -102.09 gain 154 27 -100.85 gain 27 155 -103.70 gain 155 27 -101.04 gain 27 156 -102.36 gain 156 27 -98.93 gain 27 157 -97.08 gain 157 27 -96.12 gain 27 158 -84.91 gain 158 27 -83.45 gain 27 159 -91.91 gain 159 27 -92.84 gain 27 160 -92.33 gain 160 27 -90.41 gain 27 161 -92.91 gain 161 27 -93.43 gain 27 162 -91.21 gain 162 27 -91.44 gain 27 163 -95.49 gain 163 27 -97.64 gain 27 164 -95.40 gain 164 27 -96.92 gain 27 165 -104.83 gain 165 27 -103.40 gain 27 166 -103.36 gain 166 27 -101.69 gain 27 167 -99.34 gain 167 27 -98.39 gain 27 168 -96.64 gain 168 27 -94.58 gain 27 169 -90.33 gain 169 27 -89.39 gain 27 170 -92.79 gain 170 27 -91.08 gain 27 171 -101.47 gain 171 27 -100.85 gain 27 172 -96.89 gain 172 27 -94.45 gain 27 173 -95.35 gain 173 27 -97.56 gain 27 174 -99.97 gain 174 27 -98.23 gain 27 175 -96.07 gain 175 27 -95.46 gain 27 176 -96.22 gain 176 27 -94.58 gain 27 177 -98.00 gain 177 27 -99.37 gain 27 178 -96.11 gain 178 27 -90.92 gain 27 179 -95.98 gain 179 27 -90.20 gain 27 180 -96.73 gain 180 27 -100.41 gain 27 181 -95.00 gain 181 27 -92.70 gain 27 182 -104.24 gain 182 27 -103.02 gain 27 183 -98.60 gain 183 27 -97.66 gain 27 184 -103.12 gain 184 27 -104.93 gain 27 185 -98.70 gain 185 27 -104.38 gain 27 186 -99.19 gain 186 27 -100.44 gain 27 187 -99.83 gain 187 27 -98.81 gain 27 188 -96.45 gain 188 27 -97.84 gain 27 189 -103.72 gain 189 27 -99.84 gain 27 190 -99.63 gain 190 27 -99.67 gain 27 191 -89.25 gain 191 27 -87.99 gain 27 192 -89.86 gain 192 27 -87.29 gain 27 193 -89.05 gain 193 27 -85.48 gain 27 194 -95.64 gain 194 27 -92.85 gain 27 195 -109.60 gain 195 27 -105.35 gain 27 196 -98.43 gain 196 27 -98.49 gain 27 197 -101.59 gain 197 27 -96.78 gain 27 198 -105.12 gain 198 27 -104.83 gain 27 199 -94.69 gain 199 27 -94.51 gain 27 200 -103.27 gain 200 27 -104.42 gain 27 201 -95.40 gain 201 27 -96.46 gain 27 202 -104.69 gain 202 27 -104.88 gain 27 203 -100.77 gain 203 27 -100.08 gain 27 204 -95.74 gain 204 27 -91.69 gain 27 205 -94.27 gain 205 27 -93.96 gain 27 206 -100.05 gain 206 27 -100.86 gain 27 207 -97.78 gain 207 27 -98.00 gain 27 208 -96.39 gain 208 27 -99.21 gain 27 209 -104.83 gain 209 27 -107.22 gain 27 210 -104.59 gain 210 27 -107.16 gain 27 211 -100.48 gain 211 27 -98.28 gain 27 212 -101.95 gain 212 27 -102.76 gain 27 213 -100.61 gain 213 27 -100.75 gain 27 214 -102.30 gain 214 27 -107.83 gain 27 215 -100.00 gain 215 27 -100.92 gain 27 216 -103.13 gain 216 27 -107.97 gain 27 217 -97.38 gain 217 27 -102.48 gain 27 218 -98.22 gain 218 27 -96.13 gain 27 219 -94.10 gain 219 27 -92.49 gain 27 220 -96.24 gain 220 27 -90.71 gain 27 221 -99.99 gain 221 27 -100.15 gain 27 222 -97.55 gain 222 27 -93.51 gain 27 223 -98.50 gain 223 27 -97.70 gain 27 224 -104.01 gain 224 27 -103.68 gain 28 29 -65.43 gain 29 28 -66.97 gain 28 30 -101.83 gain 30 28 -108.38 gain 28 31 -89.28 gain 31 28 -92.39 gain 28 32 -94.22 gain 32 28 -94.69 gain 28 33 -97.31 gain 33 28 -99.22 gain 28 34 -86.71 gain 34 28 -89.25 gain 28 35 -89.23 gain 35 28 -92.72 gain 28 36 -85.03 gain 36 28 -88.67 gain 28 37 -91.37 gain 37 28 -97.55 gain 28 38 -83.80 gain 38 28 -87.52 gain 28 39 -76.65 gain 39 28 -84.69 gain 28 40 -80.88 gain 40 28 -83.89 gain 28 41 -74.02 gain 41 28 -72.37 gain 28 42 -68.29 gain 42 28 -73.90 gain 28 43 -63.63 gain 43 28 -66.83 gain 28 44 -67.95 gain 44 28 -74.74 gain 28 45 -99.48 gain 45 28 -106.26 gain 28 46 -85.21 gain 46 28 -88.45 gain 28 47 -91.76 gain 47 28 -92.70 gain 28 48 -90.88 gain 48 28 -91.40 gain 28 49 -89.48 gain 49 28 -94.06 gain 28 50 -91.73 gain 50 28 -93.16 gain 28 51 -89.03 gain 51 28 -94.16 gain 28 52 -82.04 gain 52 28 -84.40 gain 28 53 -83.44 gain 53 28 -86.36 gain 28 54 -81.95 gain 54 28 -84.28 gain 28 55 -79.75 gain 55 28 -79.00 gain 28 56 -80.11 gain 56 28 -84.41 gain 28 57 -71.05 gain 57 28 -74.42 gain 28 58 -69.62 gain 58 28 -69.69 gain 28 59 -72.35 gain 59 28 -71.67 gain 28 60 -88.26 gain 60 28 -96.86 gain 28 61 -94.71 gain 61 28 -95.22 gain 28 62 -89.87 gain 62 28 -87.89 gain 28 63 -92.66 gain 63 28 -94.65 gain 28 64 -93.12 gain 64 28 -99.33 gain 28 65 -85.81 gain 65 28 -87.57 gain 28 66 -90.86 gain 66 28 -91.60 gain 28 67 -85.08 gain 67 28 -87.05 gain 28 68 -88.41 gain 68 28 -92.96 gain 28 69 -82.86 gain 69 28 -84.63 gain 28 70 -79.85 gain 70 28 -80.09 gain 28 71 -80.70 gain 71 28 -84.51 gain 28 72 -79.05 gain 72 28 -80.42 gain 28 73 -72.07 gain 73 28 -74.81 gain 28 74 -81.87 gain 74 28 -80.72 gain 28 75 -88.43 gain 75 28 -93.17 gain 28 76 -96.44 gain 76 28 -101.30 gain 28 77 -95.07 gain 77 28 -95.92 gain 28 78 -94.54 gain 78 28 -99.90 gain 28 79 -92.64 gain 79 28 -97.62 gain 28 80 -87.38 gain 80 28 -90.15 gain 28 81 -84.97 gain 81 28 -88.65 gain 28 82 -84.02 gain 82 28 -88.68 gain 28 83 -91.18 gain 83 28 -93.11 gain 28 84 -81.09 gain 84 28 -80.21 gain 28 85 -74.95 gain 85 28 -79.50 gain 28 86 -82.46 gain 86 28 -88.64 gain 28 87 -74.52 gain 87 28 -77.99 gain 28 88 -70.38 gain 88 28 -73.50 gain 28 89 -81.21 gain 89 28 -86.47 gain 28 90 -100.66 gain 90 28 -105.25 gain 28 91 -97.61 gain 91 28 -103.28 gain 28 92 -90.19 gain 92 28 -96.77 gain 28 93 -96.30 gain 93 28 -100.25 gain 28 94 -90.71 gain 94 28 -93.22 gain 28 95 -91.87 gain 95 28 -93.62 gain 28 96 -91.99 gain 96 28 -100.71 gain 28 97 -85.99 gain 97 28 -87.54 gain 28 98 -87.65 gain 98 28 -89.67 gain 28 99 -89.74 gain 99 28 -90.89 gain 28 100 -82.57 gain 100 28 -83.64 gain 28 101 -83.62 gain 101 28 -88.32 gain 28 102 -86.15 gain 102 28 -90.81 gain 28 103 -78.51 gain 103 28 -84.34 gain 28 104 -86.40 gain 104 28 -94.72 gain 28 105 -97.46 gain 105 28 -100.30 gain 28 106 -96.97 gain 106 28 -97.14 gain 28 107 -88.09 gain 107 28 -88.16 gain 28 108 -92.93 gain 108 28 -92.62 gain 28 109 -92.47 gain 109 28 -95.61 gain 28 110 -88.71 gain 110 28 -98.21 gain 28 111 -84.71 gain 111 28 -84.18 gain 28 112 -91.02 gain 112 28 -93.96 gain 28 113 -89.10 gain 113 28 -91.17 gain 28 114 -89.12 gain 114 28 -88.35 gain 28 115 -86.66 gain 115 28 -86.54 gain 28 116 -87.77 gain 116 28 -90.08 gain 28 117 -89.06 gain 117 28 -88.52 gain 28 118 -78.37 gain 118 28 -79.45 gain 28 119 -76.79 gain 119 28 -82.93 gain 28 120 -94.70 gain 120 28 -98.23 gain 28 121 -92.42 gain 121 28 -96.96 gain 28 122 -92.62 gain 122 28 -96.92 gain 28 123 -94.73 gain 123 28 -99.37 gain 28 124 -93.96 gain 124 28 -96.58 gain 28 125 -91.34 gain 125 28 -97.31 gain 28 126 -89.19 gain 126 28 -91.80 gain 28 127 -94.60 gain 127 28 -96.84 gain 28 128 -88.16 gain 128 28 -93.00 gain 28 129 -90.73 gain 129 28 -92.78 gain 28 130 -89.11 gain 130 28 -92.44 gain 28 131 -85.92 gain 131 28 -89.03 gain 28 132 -88.65 gain 132 28 -87.77 gain 28 133 -84.85 gain 133 28 -89.14 gain 28 134 -89.58 gain 134 28 -90.74 gain 28 135 -97.36 gain 135 28 -100.82 gain 28 136 -90.88 gain 136 28 -94.78 gain 28 137 -100.14 gain 137 28 -106.96 gain 28 138 -99.09 gain 138 28 -99.44 gain 28 139 -95.48 gain 139 28 -99.09 gain 28 140 -92.90 gain 140 28 -97.34 gain 28 141 -91.84 gain 141 28 -88.25 gain 28 142 -93.78 gain 142 28 -96.93 gain 28 143 -94.24 gain 143 28 -100.13 gain 28 144 -88.38 gain 144 28 -92.64 gain 28 145 -96.14 gain 145 28 -103.78 gain 28 146 -84.97 gain 146 28 -88.60 gain 28 147 -81.60 gain 147 28 -82.34 gain 28 148 -92.37 gain 148 28 -91.44 gain 28 149 -89.43 gain 149 28 -92.16 gain 28 150 -93.62 gain 150 28 -97.18 gain 28 151 -97.12 gain 151 28 -99.62 gain 28 152 -97.01 gain 152 28 -99.33 gain 28 153 -97.74 gain 153 28 -99.27 gain 28 154 -93.95 gain 154 28 -97.38 gain 28 155 -91.19 gain 155 28 -93.19 gain 28 156 -91.02 gain 156 28 -92.26 gain 28 157 -91.19 gain 157 28 -94.91 gain 28 158 -88.32 gain 158 28 -91.54 gain 28 159 -85.78 gain 159 28 -91.38 gain 28 160 -97.16 gain 160 28 -99.91 gain 28 161 -92.81 gain 161 28 -98.01 gain 28 162 -97.10 gain 162 28 -102.01 gain 28 163 -91.23 gain 163 28 -98.05 gain 28 164 -90.28 gain 164 28 -96.47 gain 28 165 -95.16 gain 165 28 -98.41 gain 28 166 -90.26 gain 166 28 -93.26 gain 28 167 -96.95 gain 167 28 -100.68 gain 28 168 -103.13 gain 168 28 -105.75 gain 28 169 -95.63 gain 169 28 -99.37 gain 28 170 -100.82 gain 170 28 -103.78 gain 28 171 -92.45 gain 171 28 -96.50 gain 28 172 -95.66 gain 172 28 -97.89 gain 28 173 -96.08 gain 173 28 -102.97 gain 28 174 -88.21 gain 174 28 -91.15 gain 28 175 -93.86 gain 175 28 -97.93 gain 28 176 -93.65 gain 176 28 -96.68 gain 28 177 -89.24 gain 177 28 -95.27 gain 28 178 -94.31 gain 178 28 -93.78 gain 28 179 -92.37 gain 179 28 -91.27 gain 28 180 -101.93 gain 180 28 -110.28 gain 28 181 -99.35 gain 181 28 -101.73 gain 28 182 -104.75 gain 182 28 -108.20 gain 28 183 -94.19 gain 183 28 -97.92 gain 28 184 -94.60 gain 184 28 -101.08 gain 28 185 -94.87 gain 185 28 -105.22 gain 28 186 -91.24 gain 186 28 -97.17 gain 28 187 -92.94 gain 187 28 -96.59 gain 28 188 -92.93 gain 188 28 -99.00 gain 28 189 -99.03 gain 189 28 -99.82 gain 28 190 -94.35 gain 190 28 -99.05 gain 28 191 -100.04 gain 191 28 -103.45 gain 28 192 -91.40 gain 192 28 -93.51 gain 28 193 -97.31 gain 193 28 -98.41 gain 28 194 -91.68 gain 194 28 -93.55 gain 28 195 -104.63 gain 195 28 -105.06 gain 28 196 -103.40 gain 196 28 -108.14 gain 28 197 -99.57 gain 197 28 -99.44 gain 28 198 -93.82 gain 198 28 -98.21 gain 28 199 -87.93 gain 199 28 -92.42 gain 28 200 -94.12 gain 200 28 -99.95 gain 28 201 -91.74 gain 201 28 -97.47 gain 28 202 -101.55 gain 202 28 -106.42 gain 28 203 -100.77 gain 203 28 -104.75 gain 28 204 -96.04 gain 204 28 -96.67 gain 28 205 -91.42 gain 205 28 -95.79 gain 28 206 -94.43 gain 206 28 -99.91 gain 28 207 -97.78 gain 207 28 -102.67 gain 28 208 -99.56 gain 208 28 -107.06 gain 28 209 -94.66 gain 209 28 -101.72 gain 28 210 -103.39 gain 210 28 -110.63 gain 28 211 -99.36 gain 211 28 -101.84 gain 28 212 -97.50 gain 212 28 -102.99 gain 28 213 -97.27 gain 213 28 -102.09 gain 28 214 -97.50 gain 214 28 -107.70 gain 28 215 -95.11 gain 215 28 -100.71 gain 28 216 -102.56 gain 216 28 -112.07 gain 28 217 -100.13 gain 217 28 -109.90 gain 28 218 -95.82 gain 218 28 -98.40 gain 28 219 -94.06 gain 219 28 -97.12 gain 28 220 -95.19 gain 220 28 -94.34 gain 28 221 -99.00 gain 221 28 -103.83 gain 28 222 -96.68 gain 222 28 -97.32 gain 28 223 -93.13 gain 223 28 -97.01 gain 28 224 -92.08 gain 224 28 -96.42 gain 29 30 -92.91 gain 30 29 -97.92 gain 29 31 -90.78 gain 31 29 -92.35 gain 29 32 -92.63 gain 32 29 -91.55 gain 29 33 -90.85 gain 33 29 -91.21 gain 29 34 -94.91 gain 34 29 -95.91 gain 29 35 -95.52 gain 35 29 -97.47 gain 29 36 -90.30 gain 36 29 -92.39 gain 29 37 -85.08 gain 37 29 -89.71 gain 29 38 -81.14 gain 38 29 -83.30 gain 29 39 -86.26 gain 39 29 -92.75 gain 29 40 -82.23 gain 40 29 -83.70 gain 29 41 -76.18 gain 41 29 -72.99 gain 29 42 -77.36 gain 42 29 -81.42 gain 29 43 -64.72 gain 43 29 -66.37 gain 29 44 -59.36 gain 44 29 -64.60 gain 29 45 -97.62 gain 45 29 -102.84 gain 29 46 -93.09 gain 46 29 -94.78 gain 29 47 -103.68 gain 47 29 -103.07 gain 29 48 -97.03 gain 48 29 -96.00 gain 29 49 -88.19 gain 49 29 -91.22 gain 29 50 -87.94 gain 50 29 -87.83 gain 29 51 -91.35 gain 51 29 -94.93 gain 29 52 -85.87 gain 52 29 -86.69 gain 29 53 -85.30 gain 53 29 -86.68 gain 29 54 -84.03 gain 54 29 -84.81 gain 29 55 -96.39 gain 55 29 -94.09 gain 29 56 -82.28 gain 56 29 -85.03 gain 29 57 -73.82 gain 57 29 -75.65 gain 29 58 -70.75 gain 58 29 -69.27 gain 29 59 -79.56 gain 59 29 -77.34 gain 29 60 -97.41 gain 60 29 -104.47 gain 29 61 -94.95 gain 61 29 -93.91 gain 29 62 -95.09 gain 62 29 -91.56 gain 29 63 -98.55 gain 63 29 -98.99 gain 29 64 -89.46 gain 64 29 -94.12 gain 29 65 -94.60 gain 65 29 -94.81 gain 29 66 -90.11 gain 66 29 -89.30 gain 29 67 -86.11 gain 67 29 -86.53 gain 29 68 -89.64 gain 68 29 -92.65 gain 29 69 -92.89 gain 69 29 -93.11 gain 29 70 -79.72 gain 70 29 -78.41 gain 29 71 -73.11 gain 71 29 -75.37 gain 29 72 -80.58 gain 72 29 -80.40 gain 29 73 -81.23 gain 73 29 -82.42 gain 29 74 -74.82 gain 74 29 -72.12 gain 29 75 -101.68 gain 75 29 -104.87 gain 29 76 -96.62 gain 76 29 -99.94 gain 29 77 -99.64 gain 77 29 -98.95 gain 29 78 -98.75 gain 78 29 -102.57 gain 29 79 -91.16 gain 79 29 -94.59 gain 29 80 -90.84 gain 80 29 -92.07 gain 29 81 -89.57 gain 81 29 -91.71 gain 29 82 -88.82 gain 82 29 -91.93 gain 29 83 -90.56 gain 83 29 -90.94 gain 29 84 -95.37 gain 84 29 -92.94 gain 29 85 -84.51 gain 85 29 -87.51 gain 29 86 -82.65 gain 86 29 -87.28 gain 29 87 -83.48 gain 87 29 -85.40 gain 29 88 -78.78 gain 88 29 -80.35 gain 29 89 -86.35 gain 89 29 -90.06 gain 29 90 -97.98 gain 90 29 -101.03 gain 29 91 -97.16 gain 91 29 -101.28 gain 29 92 -96.80 gain 92 29 -101.84 gain 29 93 -98.28 gain 93 29 -100.68 gain 29 94 -97.76 gain 94 29 -98.72 gain 29 95 -85.75 gain 95 29 -85.96 gain 29 96 -95.12 gain 96 29 -102.29 gain 29 97 -92.94 gain 97 29 -92.94 gain 29 98 -93.15 gain 98 29 -93.62 gain 29 99 -93.99 gain 99 29 -93.59 gain 29 100 -88.05 gain 100 29 -87.57 gain 29 101 -77.69 gain 101 29 -80.84 gain 29 102 -85.27 gain 102 29 -88.39 gain 29 103 -90.24 gain 103 29 -94.53 gain 29 104 -76.37 gain 104 29 -83.14 gain 29 105 -98.71 gain 105 29 -100.00 gain 29 106 -93.78 gain 106 29 -92.40 gain 29 107 -90.81 gain 107 29 -89.33 gain 29 108 -92.89 gain 108 29 -91.03 gain 29 109 -97.09 gain 109 29 -98.69 gain 29 110 -92.39 gain 110 29 -100.35 gain 29 111 -89.28 gain 111 29 -87.21 gain 29 112 -98.55 gain 112 29 -99.94 gain 29 113 -86.55 gain 113 29 -87.06 gain 29 114 -83.14 gain 114 29 -80.82 gain 29 115 -85.12 gain 115 29 -83.46 gain 29 116 -89.20 gain 116 29 -89.97 gain 29 117 -86.06 gain 117 29 -83.97 gain 29 118 -90.06 gain 118 29 -89.59 gain 29 119 -84.03 gain 119 29 -88.63 gain 29 120 -100.43 gain 120 29 -102.40 gain 29 121 -96.47 gain 121 29 -99.47 gain 29 122 -97.30 gain 122 29 -100.05 gain 29 123 -91.17 gain 123 29 -94.26 gain 29 124 -97.98 gain 124 29 -99.06 gain 29 125 -100.45 gain 125 29 -104.86 gain 29 126 -92.26 gain 126 29 -93.33 gain 29 127 -92.60 gain 127 29 -93.29 gain 29 128 -88.03 gain 128 29 -91.32 gain 29 129 -93.02 gain 129 29 -93.51 gain 29 130 -91.47 gain 130 29 -93.26 gain 29 131 -92.33 gain 131 29 -93.89 gain 29 132 -88.10 gain 132 29 -85.67 gain 29 133 -92.49 gain 133 29 -95.24 gain 29 134 -90.63 gain 134 29 -90.24 gain 29 135 -99.48 gain 135 29 -101.40 gain 29 136 -95.15 gain 136 29 -97.50 gain 29 137 -91.92 gain 137 29 -97.18 gain 29 138 -95.96 gain 138 29 -94.75 gain 29 139 -95.28 gain 139 29 -97.35 gain 29 140 -99.68 gain 140 29 -102.56 gain 29 141 -96.06 gain 141 29 -90.92 gain 29 142 -92.51 gain 142 29 -94.12 gain 29 143 -87.16 gain 143 29 -91.50 gain 29 144 -92.14 gain 144 29 -94.85 gain 29 145 -92.89 gain 145 29 -98.98 gain 29 146 -91.52 gain 146 29 -93.60 gain 29 147 -95.66 gain 147 29 -94.86 gain 29 148 -91.79 gain 148 29 -89.31 gain 29 149 -92.61 gain 149 29 -93.79 gain 29 150 -103.26 gain 150 29 -105.27 gain 29 151 -98.12 gain 151 29 -99.07 gain 29 152 -97.61 gain 152 29 -98.38 gain 29 153 -97.49 gain 153 29 -97.48 gain 29 154 -97.85 gain 154 29 -99.73 gain 29 155 -100.15 gain 155 29 -100.61 gain 29 156 -94.01 gain 156 29 -93.70 gain 29 157 -99.16 gain 157 29 -101.33 gain 29 158 -96.15 gain 158 29 -97.82 gain 29 159 -88.60 gain 159 29 -92.66 gain 29 160 -92.39 gain 160 29 -93.60 gain 29 161 -104.93 gain 161 29 -108.58 gain 29 162 -93.07 gain 162 29 -96.43 gain 29 163 -88.37 gain 163 29 -93.64 gain 29 164 -93.96 gain 164 29 -98.61 gain 29 165 -106.95 gain 165 29 -108.66 gain 29 166 -100.18 gain 166 29 -101.64 gain 29 167 -97.44 gain 167 29 -99.62 gain 29 168 -101.82 gain 168 29 -102.89 gain 29 169 -100.30 gain 169 29 -102.48 gain 29 170 -98.34 gain 170 29 -99.76 gain 29 171 -93.22 gain 171 29 -95.72 gain 29 172 -99.07 gain 172 29 -99.76 gain 29 173 -94.94 gain 173 29 -100.27 gain 29 174 -101.93 gain 174 29 -103.31 gain 29 175 -97.63 gain 175 29 -100.15 gain 29 176 -97.80 gain 176 29 -99.28 gain 29 177 -93.79 gain 177 29 -98.28 gain 29 178 -94.98 gain 178 29 -92.91 gain 29 179 -91.47 gain 179 29 -88.82 gain 29 180 -98.76 gain 180 29 -105.56 gain 29 181 -99.06 gain 181 29 -99.89 gain 29 182 -98.19 gain 182 29 -100.10 gain 29 183 -93.29 gain 183 29 -95.47 gain 29 184 -96.99 gain 184 29 -101.92 gain 29 185 -97.94 gain 185 29 -106.74 gain 29 186 -97.29 gain 186 29 -101.67 gain 29 187 -101.95 gain 187 29 -104.06 gain 29 188 -89.10 gain 188 29 -93.62 gain 29 189 -93.81 gain 189 29 -93.05 gain 29 190 -99.34 gain 190 29 -102.50 gain 29 191 -86.02 gain 191 29 -87.88 gain 29 192 -98.25 gain 192 29 -98.81 gain 29 193 -93.92 gain 193 29 -93.47 gain 29 194 -97.10 gain 194 29 -97.43 gain 29 195 -95.31 gain 195 29 -94.18 gain 29 196 -97.88 gain 196 29 -101.07 gain 29 197 -96.53 gain 197 29 -94.85 gain 29 198 -101.29 gain 198 29 -104.13 gain 29 199 -95.73 gain 199 29 -98.68 gain 29 200 -105.98 gain 200 29 -110.25 gain 29 201 -92.02 gain 201 29 -96.21 gain 29 202 -93.33 gain 202 29 -96.65 gain 29 203 -97.48 gain 203 29 -99.92 gain 29 204 -99.70 gain 204 29 -98.78 gain 29 205 -88.67 gain 205 29 -91.49 gain 29 206 -98.88 gain 206 29 -102.81 gain 29 207 -100.92 gain 207 29 -104.26 gain 29 208 -96.11 gain 208 29 -102.06 gain 29 209 -95.04 gain 209 29 -100.56 gain 29 210 -107.23 gain 210 29 -112.93 gain 29 211 -109.16 gain 211 29 -110.08 gain 29 212 -98.62 gain 212 29 -102.55 gain 29 213 -96.55 gain 213 29 -99.81 gain 29 214 -101.96 gain 214 29 -110.62 gain 29 215 -97.60 gain 215 29 -101.65 gain 29 216 -100.96 gain 216 29 -108.92 gain 29 217 -99.29 gain 217 29 -107.52 gain 29 218 -101.00 gain 218 29 -102.03 gain 29 219 -95.80 gain 219 29 -97.31 gain 29 220 -92.15 gain 220 29 -89.75 gain 29 221 -99.26 gain 221 29 -102.54 gain 29 222 -98.45 gain 222 29 -97.54 gain 29 223 -92.30 gain 223 29 -94.63 gain 29 224 -101.81 gain 224 29 -104.61 gain 30 31 -64.42 gain 31 30 -60.98 gain 30 32 -76.02 gain 32 30 -69.93 gain 30 33 -81.57 gain 33 30 -76.93 gain 30 34 -82.66 gain 34 30 -78.65 gain 30 35 -94.55 gain 35 30 -91.49 gain 30 36 -99.14 gain 36 30 -96.23 gain 30 37 -95.23 gain 37 30 -94.86 gain 30 38 -93.81 gain 38 30 -90.97 gain 30 39 -95.77 gain 39 30 -97.25 gain 30 40 -105.25 gain 40 30 -101.71 gain 30 41 -100.05 gain 41 30 -91.85 gain 30 42 -101.67 gain 42 30 -100.72 gain 30 43 -110.49 gain 43 30 -107.13 gain 30 44 -103.85 gain 44 30 -104.09 gain 30 45 -63.98 gain 45 30 -64.20 gain 30 46 -77.89 gain 46 30 -74.57 gain 30 47 -77.81 gain 47 30 -72.20 gain 30 48 -86.08 gain 48 30 -80.05 gain 30 49 -95.09 gain 49 30 -93.11 gain 30 50 -85.13 gain 50 30 -80.01 gain 30 51 -93.06 gain 51 30 -91.64 gain 30 52 -95.99 gain 52 30 -91.81 gain 30 53 -95.73 gain 53 30 -92.10 gain 30 54 -96.38 gain 54 30 -92.16 gain 30 55 -92.27 gain 55 30 -84.96 gain 30 56 -97.61 gain 56 30 -95.35 gain 30 57 -97.15 gain 57 30 -93.97 gain 30 58 -97.61 gain 58 30 -91.13 gain 30 59 -99.59 gain 59 30 -92.36 gain 30 60 -79.22 gain 60 30 -81.27 gain 30 61 -78.68 gain 61 30 -72.64 gain 30 62 -82.01 gain 62 30 -73.47 gain 30 63 -78.58 gain 63 30 -74.01 gain 30 64 -90.88 gain 64 30 -90.53 gain 30 65 -90.10 gain 65 30 -85.30 gain 30 66 -88.16 gain 66 30 -82.35 gain 30 67 -94.86 gain 67 30 -90.28 gain 30 68 -91.56 gain 68 30 -89.56 gain 30 69 -103.52 gain 69 30 -98.74 gain 30 70 -93.32 gain 70 30 -87.00 gain 30 71 -96.75 gain 71 30 -94.00 gain 30 72 -105.93 gain 72 30 -100.73 gain 30 73 -103.47 gain 73 30 -99.65 gain 30 74 -101.12 gain 74 30 -93.42 gain 30 75 -82.69 gain 75 30 -80.88 gain 30 76 -82.96 gain 76 30 -81.27 gain 30 77 -88.84 gain 77 30 -83.15 gain 30 78 -87.23 gain 78 30 -86.03 gain 30 79 -87.23 gain 79 30 -85.66 gain 30 80 -87.20 gain 80 30 -83.42 gain 30 81 -93.41 gain 81 30 -90.54 gain 30 82 -86.92 gain 82 30 -85.03 gain 30 83 -92.11 gain 83 30 -87.49 gain 30 84 -95.34 gain 84 30 -87.90 gain 30 85 -94.10 gain 85 30 -92.10 gain 30 86 -99.70 gain 86 30 -99.33 gain 30 87 -102.47 gain 87 30 -99.39 gain 30 88 -97.15 gain 88 30 -93.71 gain 30 89 -100.46 gain 89 30 -99.17 gain 30 90 -84.95 gain 90 30 -82.99 gain 30 91 -79.82 gain 91 30 -78.94 gain 30 92 -87.53 gain 92 30 -87.57 gain 30 93 -87.00 gain 93 30 -84.39 gain 30 94 -87.48 gain 94 30 -83.44 gain 30 95 -95.62 gain 95 30 -90.82 gain 30 96 -91.53 gain 96 30 -93.70 gain 30 97 -93.13 gain 97 30 -88.13 gain 30 98 -97.93 gain 98 30 -93.39 gain 30 99 -96.40 gain 99 30 -91.00 gain 30 100 -99.17 gain 100 30 -93.69 gain 30 101 -99.89 gain 101 30 -98.04 gain 30 102 -106.82 gain 102 30 -104.92 gain 30 103 -97.42 gain 103 30 -96.69 gain 30 104 -104.51 gain 104 30 -106.27 gain 30 105 -86.55 gain 105 30 -82.83 gain 30 106 -86.47 gain 106 30 -80.08 gain 30 107 -90.19 gain 107 30 -83.71 gain 30 108 -86.17 gain 108 30 -79.31 gain 30 109 -91.64 gain 109 30 -88.23 gain 30 110 -87.37 gain 110 30 -90.32 gain 30 111 -96.00 gain 111 30 -88.92 gain 30 112 -96.93 gain 112 30 -93.31 gain 30 113 -96.69 gain 113 30 -92.20 gain 30 114 -96.68 gain 114 30 -89.35 gain 30 115 -97.89 gain 115 30 -91.22 gain 30 116 -106.88 gain 116 30 -102.65 gain 30 117 -98.80 gain 117 30 -91.70 gain 30 118 -101.07 gain 118 30 -95.60 gain 30 119 -101.07 gain 119 30 -100.66 gain 30 120 -88.82 gain 120 30 -85.79 gain 30 121 -86.45 gain 121 30 -84.45 gain 30 122 -93.01 gain 122 30 -90.75 gain 30 123 -92.65 gain 123 30 -90.74 gain 30 124 -93.96 gain 124 30 -90.03 gain 30 125 -91.54 gain 125 30 -90.95 gain 30 126 -94.14 gain 126 30 -90.20 gain 30 127 -91.14 gain 127 30 -86.83 gain 30 128 -92.87 gain 128 30 -91.15 gain 30 129 -99.13 gain 129 30 -94.62 gain 30 130 -95.74 gain 130 30 -92.52 gain 30 131 -101.19 gain 131 30 -97.74 gain 30 132 -105.97 gain 132 30 -98.53 gain 30 133 -106.06 gain 133 30 -103.80 gain 30 134 -104.56 gain 134 30 -99.16 gain 30 135 -85.71 gain 135 30 -82.62 gain 30 136 -89.42 gain 136 30 -86.77 gain 30 137 -93.91 gain 137 30 -94.17 gain 30 138 -97.24 gain 138 30 -91.03 gain 30 139 -97.44 gain 139 30 -94.49 gain 30 140 -99.25 gain 140 30 -97.13 gain 30 141 -96.87 gain 141 30 -86.72 gain 30 142 -104.93 gain 142 30 -101.53 gain 30 143 -104.53 gain 143 30 -103.87 gain 30 144 -101.57 gain 144 30 -99.27 gain 30 145 -100.88 gain 145 30 -101.96 gain 30 146 -96.97 gain 146 30 -94.05 gain 30 147 -99.95 gain 147 30 -94.14 gain 30 148 -109.82 gain 148 30 -102.34 gain 30 149 -104.59 gain 149 30 -100.76 gain 30 150 -91.90 gain 150 30 -88.91 gain 30 151 -101.17 gain 151 30 -97.12 gain 30 152 -95.86 gain 152 30 -91.62 gain 30 153 -91.71 gain 153 30 -86.69 gain 30 154 -96.00 gain 154 30 -92.88 gain 30 155 -92.87 gain 155 30 -88.32 gain 30 156 -103.77 gain 156 30 -98.45 gain 30 157 -93.52 gain 157 30 -90.69 gain 30 158 -107.71 gain 158 30 -104.37 gain 30 159 -98.78 gain 159 30 -97.83 gain 30 160 -102.86 gain 160 30 -99.07 gain 30 161 -97.57 gain 161 30 -96.22 gain 30 162 -104.20 gain 162 30 -102.56 gain 30 163 -101.52 gain 163 30 -101.78 gain 30 164 -109.96 gain 164 30 -109.60 gain 30 165 -104.88 gain 165 30 -101.57 gain 30 166 -96.82 gain 166 30 -93.27 gain 30 167 -95.01 gain 167 30 -92.18 gain 30 168 -98.85 gain 168 30 -94.92 gain 30 169 -106.53 gain 169 30 -103.71 gain 30 170 -95.31 gain 170 30 -91.72 gain 30 171 -98.27 gain 171 30 -95.76 gain 30 172 -100.04 gain 172 30 -95.72 gain 30 173 -99.80 gain 173 30 -100.13 gain 30 174 -105.05 gain 174 30 -101.43 gain 30 175 -101.44 gain 175 30 -98.95 gain 30 176 -107.68 gain 176 30 -104.16 gain 30 177 -101.62 gain 177 30 -101.11 gain 30 178 -100.98 gain 178 30 -93.90 gain 30 179 -98.92 gain 179 30 -91.27 gain 30 180 -105.00 gain 180 30 -106.80 gain 30 181 -98.15 gain 181 30 -93.97 gain 30 182 -100.92 gain 182 30 -97.83 gain 30 183 -94.89 gain 183 30 -92.06 gain 30 184 -97.46 gain 184 30 -97.39 gain 30 185 -100.72 gain 185 30 -104.51 gain 30 186 -94.04 gain 186 30 -93.41 gain 30 187 -97.66 gain 187 30 -94.76 gain 30 188 -106.55 gain 188 30 -106.06 gain 30 189 -99.51 gain 189 30 -93.75 gain 30 190 -95.84 gain 190 30 -94.00 gain 30 191 -101.69 gain 191 30 -98.55 gain 30 192 -101.20 gain 192 30 -96.75 gain 30 193 -107.72 gain 193 30 -102.26 gain 30 194 -110.12 gain 194 30 -105.44 gain 30 195 -96.66 gain 195 30 -90.53 gain 30 196 -94.46 gain 196 30 -92.64 gain 30 197 -98.66 gain 197 30 -91.98 gain 30 198 -98.66 gain 198 30 -96.48 gain 30 199 -100.68 gain 199 30 -98.62 gain 30 200 -105.42 gain 200 30 -104.69 gain 30 201 -102.99 gain 201 30 -102.17 gain 30 202 -101.85 gain 202 30 -100.16 gain 30 203 -103.27 gain 203 30 -100.70 gain 30 204 -104.47 gain 204 30 -98.54 gain 30 205 -106.29 gain 205 30 -104.10 gain 30 206 -103.15 gain 206 30 -102.07 gain 30 207 -109.31 gain 207 30 -107.65 gain 30 208 -111.83 gain 208 30 -112.77 gain 30 209 -110.25 gain 209 30 -110.77 gain 30 210 -102.09 gain 210 30 -102.78 gain 30 211 -98.73 gain 211 30 -94.65 gain 30 212 -97.01 gain 212 30 -95.94 gain 30 213 -89.86 gain 213 30 -88.12 gain 30 214 -98.32 gain 214 30 -101.96 gain 30 215 -107.38 gain 215 30 -106.43 gain 30 216 -92.92 gain 216 30 -95.87 gain 30 217 -99.33 gain 217 30 -102.55 gain 30 218 -108.88 gain 218 30 -104.91 gain 30 219 -101.85 gain 219 30 -98.35 gain 30 220 -105.44 gain 220 30 -98.03 gain 30 221 -101.81 gain 221 30 -100.08 gain 30 222 -103.17 gain 222 30 -97.25 gain 30 223 -100.60 gain 223 30 -97.92 gain 30 224 -107.10 gain 224 30 -104.89 gain 31 32 -67.64 gain 32 31 -65.00 gain 31 33 -73.14 gain 33 31 -71.94 gain 31 34 -73.79 gain 34 31 -73.23 gain 31 35 -78.91 gain 35 31 -79.29 gain 31 36 -83.83 gain 36 31 -84.36 gain 31 37 -86.79 gain 37 31 -89.86 gain 31 38 -87.80 gain 38 31 -88.40 gain 31 39 -96.40 gain 39 31 -101.33 gain 31 40 -94.03 gain 40 31 -93.93 gain 31 41 -96.50 gain 41 31 -91.75 gain 31 42 -104.91 gain 42 31 -107.41 gain 31 43 -98.42 gain 43 31 -98.50 gain 31 44 -99.76 gain 44 31 -103.44 gain 31 45 -72.21 gain 45 31 -75.87 gain 31 46 -61.04 gain 46 31 -61.17 gain 31 47 -71.32 gain 47 31 -69.14 gain 31 48 -77.36 gain 48 31 -74.76 gain 31 49 -79.83 gain 49 31 -81.30 gain 31 50 -81.24 gain 50 31 -79.57 gain 31 51 -89.19 gain 51 31 -91.20 gain 31 52 -88.79 gain 52 31 -88.04 gain 31 53 -89.82 gain 53 31 -89.63 gain 31 54 -89.10 gain 54 31 -88.32 gain 31 55 -93.83 gain 55 31 -89.96 gain 31 56 -89.98 gain 56 31 -91.16 gain 31 57 -94.41 gain 57 31 -94.67 gain 31 58 -97.97 gain 58 31 -94.93 gain 31 59 -103.57 gain 59 31 -99.78 gain 31 60 -75.00 gain 60 31 -80.49 gain 31 61 -71.69 gain 61 31 -69.09 gain 31 62 -76.71 gain 62 31 -71.62 gain 31 63 -82.03 gain 63 31 -80.90 gain 31 64 -79.51 gain 64 31 -82.61 gain 31 65 -80.96 gain 65 31 -79.61 gain 31 66 -80.19 gain 66 31 -77.82 gain 31 67 -84.87 gain 67 31 -83.73 gain 31 68 -86.86 gain 68 31 -88.31 gain 31 69 -92.37 gain 69 31 -91.03 gain 31 70 -99.09 gain 70 31 -96.22 gain 31 71 -89.66 gain 71 31 -90.36 gain 31 72 -100.52 gain 72 31 -98.77 gain 31 73 -98.68 gain 73 31 -98.30 gain 31 74 -86.03 gain 74 31 -81.76 gain 31 75 -78.91 gain 75 31 -80.53 gain 31 76 -77.94 gain 76 31 -79.69 gain 31 77 -84.00 gain 77 31 -81.74 gain 31 78 -88.42 gain 78 31 -90.66 gain 31 79 -78.50 gain 79 31 -80.37 gain 31 80 -84.19 gain 80 31 -83.85 gain 31 81 -88.77 gain 81 31 -89.34 gain 31 82 -91.24 gain 82 31 -92.79 gain 31 83 -90.22 gain 83 31 -89.04 gain 31 84 -100.92 gain 84 31 -96.92 gain 31 85 -96.93 gain 85 31 -98.36 gain 31 86 -105.16 gain 86 31 -108.23 gain 31 87 -91.65 gain 87 31 -92.01 gain 31 88 -97.89 gain 88 31 -97.90 gain 31 89 -91.08 gain 89 31 -93.22 gain 31 90 -92.56 gain 90 31 -94.05 gain 31 91 -86.34 gain 91 31 -88.89 gain 31 92 -82.40 gain 92 31 -85.88 gain 31 93 -92.89 gain 93 31 -93.72 gain 31 94 -84.37 gain 94 31 -83.77 gain 31 95 -86.20 gain 95 31 -84.84 gain 31 96 -84.27 gain 96 31 -89.88 gain 31 97 -88.13 gain 97 31 -86.56 gain 31 98 -86.76 gain 98 31 -85.66 gain 31 99 -82.52 gain 99 31 -80.56 gain 31 100 -93.20 gain 100 31 -91.16 gain 31 101 -99.93 gain 101 31 -101.51 gain 31 102 -97.01 gain 102 31 -98.57 gain 31 103 -95.11 gain 103 31 -97.83 gain 31 104 -93.21 gain 104 31 -98.42 gain 31 105 -72.90 gain 105 31 -72.62 gain 31 106 -85.23 gain 106 31 -82.29 gain 31 107 -91.06 gain 107 31 -88.02 gain 31 108 -81.82 gain 108 31 -78.40 gain 31 109 -85.15 gain 109 31 -85.18 gain 31 110 -82.34 gain 110 31 -88.73 gain 31 111 -88.27 gain 111 31 -84.63 gain 31 112 -86.85 gain 112 31 -86.67 gain 31 113 -93.81 gain 113 31 -92.76 gain 31 114 -95.19 gain 114 31 -91.31 gain 31 115 -94.45 gain 115 31 -91.23 gain 31 116 -93.05 gain 116 31 -92.25 gain 31 117 -98.78 gain 117 31 -95.13 gain 31 118 -102.87 gain 118 31 -100.84 gain 31 119 -96.02 gain 119 31 -99.05 gain 31 120 -95.21 gain 120 31 -95.62 gain 31 121 -88.07 gain 121 31 -89.51 gain 31 122 -82.46 gain 122 31 -83.64 gain 31 123 -99.05 gain 123 31 -100.58 gain 31 124 -85.41 gain 124 31 -84.93 gain 31 125 -80.85 gain 125 31 -83.71 gain 31 126 -94.57 gain 126 31 -94.07 gain 31 127 -87.24 gain 127 31 -86.37 gain 31 128 -102.78 gain 128 31 -104.51 gain 31 129 -92.19 gain 129 31 -91.12 gain 31 130 -94.43 gain 130 31 -94.65 gain 31 131 -97.62 gain 131 31 -97.62 gain 31 132 -92.68 gain 132 31 -88.68 gain 31 133 -105.48 gain 133 31 -106.66 gain 31 134 -96.28 gain 134 31 -94.33 gain 31 135 -91.82 gain 135 31 -92.17 gain 31 136 -84.73 gain 136 31 -85.52 gain 31 137 -88.24 gain 137 31 -91.94 gain 31 138 -91.12 gain 138 31 -88.35 gain 31 139 -93.71 gain 139 31 -94.21 gain 31 140 -97.30 gain 140 31 -98.63 gain 31 141 -89.78 gain 141 31 -83.08 gain 31 142 -90.94 gain 142 31 -90.98 gain 31 143 -87.54 gain 143 31 -90.32 gain 31 144 -89.31 gain 144 31 -90.46 gain 31 145 -96.55 gain 145 31 -101.08 gain 31 146 -105.82 gain 146 31 -106.34 gain 31 147 -92.78 gain 147 31 -90.40 gain 31 148 -100.73 gain 148 31 -96.68 gain 31 149 -97.60 gain 149 31 -97.21 gain 31 150 -91.40 gain 150 31 -91.85 gain 31 151 -91.23 gain 151 31 -90.62 gain 31 152 -97.09 gain 152 31 -96.29 gain 31 153 -91.41 gain 153 31 -89.83 gain 31 154 -89.41 gain 154 31 -89.74 gain 31 155 -90.16 gain 155 31 -89.06 gain 31 156 -99.45 gain 156 31 -97.58 gain 31 157 -94.09 gain 157 31 -94.69 gain 31 158 -90.77 gain 158 31 -90.88 gain 31 159 -95.37 gain 159 31 -97.86 gain 31 160 -91.88 gain 160 31 -91.52 gain 31 161 -99.13 gain 161 31 -101.22 gain 31 162 -96.81 gain 162 31 -98.61 gain 31 163 -97.68 gain 163 31 -101.39 gain 31 164 -101.76 gain 164 31 -104.84 gain 31 165 -96.92 gain 165 31 -97.06 gain 31 166 -92.89 gain 166 31 -92.78 gain 31 167 -89.79 gain 167 31 -90.40 gain 31 168 -97.47 gain 168 31 -96.98 gain 31 169 -98.97 gain 169 31 -99.59 gain 31 170 -87.72 gain 170 31 -87.57 gain 31 171 -88.88 gain 171 31 -89.82 gain 31 172 -99.67 gain 172 31 -98.79 gain 31 173 -90.44 gain 173 31 -94.21 gain 31 174 -95.04 gain 174 31 -94.86 gain 31 175 -95.00 gain 175 31 -95.96 gain 31 176 -96.36 gain 176 31 -96.28 gain 31 177 -99.74 gain 177 31 -102.67 gain 31 178 -95.54 gain 178 31 -91.91 gain 31 179 -106.67 gain 179 31 -102.46 gain 31 180 -85.45 gain 180 31 -90.69 gain 31 181 -93.19 gain 181 31 -92.45 gain 31 182 -97.28 gain 182 31 -97.62 gain 31 183 -104.83 gain 183 31 -105.45 gain 31 184 -103.35 gain 184 31 -106.71 gain 31 185 -94.36 gain 185 31 -101.60 gain 31 186 -104.72 gain 186 31 -107.53 gain 31 187 -106.02 gain 187 31 -106.56 gain 31 188 -98.75 gain 188 31 -101.71 gain 31 189 -99.78 gain 189 31 -97.46 gain 31 190 -97.59 gain 190 31 -99.19 gain 31 191 -90.87 gain 191 31 -91.17 gain 31 192 -99.69 gain 192 31 -98.69 gain 31 193 -102.36 gain 193 31 -100.34 gain 31 194 -109.86 gain 194 31 -108.63 gain 31 195 -101.75 gain 195 31 -99.06 gain 31 196 -99.24 gain 196 31 -100.86 gain 31 197 -98.67 gain 197 31 -95.43 gain 31 198 -92.15 gain 198 31 -93.42 gain 31 199 -93.64 gain 199 31 -95.02 gain 31 200 -102.62 gain 200 31 -105.33 gain 31 201 -99.26 gain 201 31 -101.89 gain 31 202 -101.46 gain 202 31 -103.22 gain 31 203 -93.74 gain 203 31 -94.61 gain 31 204 -95.49 gain 204 31 -93.00 gain 31 205 -96.89 gain 205 31 -98.15 gain 31 206 -106.49 gain 206 31 -108.85 gain 31 207 -103.26 gain 207 31 -105.05 gain 31 208 -108.54 gain 208 31 -112.92 gain 31 209 -93.70 gain 209 31 -97.66 gain 31 210 -98.95 gain 210 31 -103.08 gain 31 211 -100.29 gain 211 31 -99.65 gain 31 212 -96.98 gain 212 31 -99.36 gain 31 213 -98.13 gain 213 31 -99.83 gain 31 214 -96.98 gain 214 31 -104.07 gain 31 215 -96.46 gain 215 31 -98.95 gain 31 216 -99.30 gain 216 31 -105.70 gain 31 217 -98.60 gain 217 31 -105.26 gain 31 218 -99.68 gain 218 31 -99.15 gain 31 219 -97.23 gain 219 31 -97.18 gain 31 220 -100.43 gain 220 31 -96.47 gain 31 221 -100.75 gain 221 31 -102.46 gain 31 222 -106.68 gain 222 31 -104.20 gain 31 223 -101.83 gain 223 31 -102.60 gain 31 224 -113.64 gain 224 31 -114.87 gain 32 33 -68.44 gain 33 32 -69.88 gain 32 34 -69.30 gain 34 32 -71.37 gain 32 35 -78.16 gain 35 32 -81.19 gain 32 36 -81.61 gain 36 32 -84.78 gain 32 37 -80.57 gain 37 32 -86.28 gain 32 38 -89.21 gain 38 32 -92.46 gain 32 39 -88.19 gain 39 32 -95.76 gain 32 40 -87.80 gain 40 32 -90.35 gain 32 41 -94.09 gain 41 32 -91.98 gain 32 42 -94.26 gain 42 32 -99.39 gain 32 43 -102.15 gain 43 32 -104.88 gain 32 44 -99.24 gain 44 32 -105.57 gain 32 45 -73.26 gain 45 32 -79.57 gain 32 46 -63.36 gain 46 32 -66.13 gain 32 47 -62.58 gain 47 32 -63.05 gain 32 48 -70.62 gain 48 32 -70.67 gain 32 49 -76.93 gain 49 32 -81.04 gain 32 50 -72.10 gain 50 32 -73.07 gain 32 51 -73.11 gain 51 32 -77.77 gain 32 52 -75.17 gain 52 32 -77.07 gain 32 53 -81.31 gain 53 32 -83.77 gain 32 54 -84.09 gain 54 32 -85.95 gain 32 55 -91.61 gain 55 32 -90.39 gain 32 56 -90.50 gain 56 32 -94.32 gain 32 57 -95.16 gain 57 32 -98.06 gain 32 58 -93.77 gain 58 32 -93.37 gain 32 59 -85.31 gain 59 32 -84.16 gain 32 60 -77.77 gain 60 32 -85.90 gain 32 61 -73.52 gain 61 32 -73.56 gain 32 62 -68.85 gain 62 32 -66.40 gain 32 63 -72.21 gain 63 32 -73.72 gain 32 64 -69.50 gain 64 32 -75.24 gain 32 65 -80.87 gain 65 32 -82.16 gain 32 66 -80.93 gain 66 32 -81.20 gain 32 67 -87.75 gain 67 32 -89.25 gain 32 68 -90.12 gain 68 32 -94.21 gain 32 69 -89.38 gain 69 32 -90.68 gain 32 70 -89.60 gain 70 32 -89.37 gain 32 71 -94.96 gain 71 32 -98.30 gain 32 72 -89.81 gain 72 32 -90.71 gain 32 73 -92.37 gain 73 32 -94.64 gain 32 74 -91.62 gain 74 32 -90.00 gain 32 75 -76.77 gain 75 32 -81.04 gain 32 76 -69.67 gain 76 32 -74.07 gain 32 77 -82.44 gain 77 32 -82.83 gain 32 78 -77.82 gain 78 32 -82.71 gain 32 79 -91.48 gain 79 32 -95.99 gain 32 80 -84.14 gain 80 32 -86.44 gain 32 81 -81.11 gain 81 32 -84.32 gain 32 82 -90.87 gain 82 32 -95.06 gain 32 83 -89.62 gain 83 32 -91.08 gain 32 84 -89.08 gain 84 32 -87.73 gain 32 85 -85.99 gain 85 32 -90.07 gain 32 86 -97.95 gain 86 32 -103.66 gain 32 87 -93.14 gain 87 32 -96.14 gain 32 88 -95.32 gain 88 32 -97.96 gain 32 89 -94.69 gain 89 32 -99.48 gain 32 90 -84.99 gain 90 32 -89.12 gain 32 91 -80.54 gain 91 32 -85.74 gain 32 92 -76.37 gain 92 32 -82.48 gain 32 93 -89.53 gain 93 32 -93.00 gain 32 94 -93.39 gain 94 32 -95.44 gain 32 95 -85.81 gain 95 32 -87.09 gain 32 96 -87.67 gain 96 32 -95.92 gain 32 97 -91.57 gain 97 32 -92.65 gain 32 98 -90.29 gain 98 32 -91.83 gain 32 99 -94.77 gain 99 32 -95.45 gain 32 100 -89.99 gain 100 32 -90.59 gain 32 101 -94.19 gain 101 32 -98.42 gain 32 102 -92.46 gain 102 32 -96.66 gain 32 103 -95.41 gain 103 32 -100.77 gain 32 104 -93.89 gain 104 32 -101.73 gain 32 105 -85.74 gain 105 32 -88.11 gain 32 106 -86.30 gain 106 32 -86.00 gain 32 107 -83.41 gain 107 32 -83.01 gain 32 108 -86.73 gain 108 32 -85.96 gain 32 109 -84.41 gain 109 32 -87.09 gain 32 110 -81.94 gain 110 32 -90.97 gain 32 111 -87.23 gain 111 32 -86.24 gain 32 112 -90.73 gain 112 32 -93.20 gain 32 113 -87.46 gain 113 32 -89.06 gain 32 114 -88.55 gain 114 32 -87.31 gain 32 115 -92.41 gain 115 32 -91.83 gain 32 116 -93.92 gain 116 32 -95.77 gain 32 117 -88.81 gain 117 32 -87.80 gain 32 118 -92.06 gain 118 32 -92.67 gain 32 119 -101.29 gain 119 32 -106.97 gain 32 120 -90.25 gain 120 32 -93.31 gain 32 121 -78.16 gain 121 32 -82.24 gain 32 122 -85.17 gain 122 32 -89.00 gain 32 123 -82.82 gain 123 32 -86.99 gain 32 124 -89.25 gain 124 32 -91.41 gain 32 125 -85.46 gain 125 32 -90.95 gain 32 126 -89.97 gain 126 32 -92.12 gain 32 127 -88.04 gain 127 32 -89.81 gain 32 128 -95.15 gain 128 32 -99.51 gain 32 129 -91.68 gain 129 32 -93.25 gain 32 130 -92.85 gain 130 32 -95.72 gain 32 131 -93.07 gain 131 32 -95.71 gain 32 132 -95.37 gain 132 32 -94.02 gain 32 133 -95.59 gain 133 32 -99.42 gain 32 134 -101.29 gain 134 32 -101.98 gain 32 135 -88.34 gain 135 32 -91.34 gain 32 136 -84.36 gain 136 32 -87.79 gain 32 137 -85.01 gain 137 32 -91.36 gain 32 138 -93.14 gain 138 32 -93.01 gain 32 139 -84.13 gain 139 32 -87.27 gain 32 140 -89.79 gain 140 32 -93.76 gain 32 141 -95.58 gain 141 32 -91.52 gain 32 142 -97.43 gain 142 32 -100.11 gain 32 143 -88.84 gain 143 32 -94.26 gain 32 144 -96.43 gain 144 32 -100.21 gain 32 145 -90.95 gain 145 32 -98.13 gain 32 146 -95.85 gain 146 32 -99.01 gain 32 147 -97.06 gain 147 32 -97.33 gain 32 148 -90.70 gain 148 32 -89.30 gain 32 149 -98.71 gain 149 32 -100.96 gain 32 150 -91.27 gain 150 32 -94.37 gain 32 151 -91.43 gain 151 32 -93.46 gain 32 152 -85.77 gain 152 32 -87.62 gain 32 153 -83.35 gain 153 32 -84.41 gain 32 154 -98.24 gain 154 32 -101.20 gain 32 155 -96.27 gain 155 32 -97.81 gain 32 156 -85.73 gain 156 32 -86.50 gain 32 157 -94.19 gain 157 32 -97.45 gain 32 158 -95.64 gain 158 32 -98.39 gain 32 159 -91.31 gain 159 32 -96.44 gain 32 160 -90.41 gain 160 32 -92.70 gain 32 161 -94.31 gain 161 32 -99.04 gain 32 162 -91.10 gain 162 32 -95.54 gain 32 163 -89.34 gain 163 32 -95.69 gain 32 164 -94.27 gain 164 32 -99.99 gain 32 165 -87.44 gain 165 32 -90.22 gain 32 166 -93.10 gain 166 32 -95.63 gain 32 167 -91.93 gain 167 32 -95.19 gain 32 168 -87.10 gain 168 32 -89.25 gain 32 169 -85.09 gain 169 32 -88.35 gain 32 170 -92.91 gain 170 32 -95.41 gain 32 171 -86.30 gain 171 32 -89.88 gain 32 172 -95.28 gain 172 32 -97.05 gain 32 173 -98.79 gain 173 32 -105.20 gain 32 174 -92.62 gain 174 32 -95.08 gain 32 175 -102.77 gain 175 32 -106.36 gain 32 176 -95.60 gain 176 32 -98.16 gain 32 177 -98.03 gain 177 32 -103.60 gain 32 178 -97.85 gain 178 32 -96.86 gain 32 179 -98.50 gain 179 32 -96.93 gain 32 180 -95.63 gain 180 32 -103.51 gain 32 181 -88.45 gain 181 32 -90.36 gain 32 182 -89.89 gain 182 32 -92.87 gain 32 183 -97.00 gain 183 32 -100.26 gain 32 184 -93.10 gain 184 32 -99.11 gain 32 185 -91.88 gain 185 32 -101.75 gain 32 186 -88.45 gain 186 32 -93.91 gain 32 187 -91.12 gain 187 32 -94.30 gain 32 188 -89.32 gain 188 32 -94.92 gain 32 189 -92.20 gain 189 32 -92.52 gain 32 190 -98.78 gain 190 32 -103.02 gain 32 191 -99.92 gain 191 32 -102.87 gain 32 192 -95.71 gain 192 32 -97.35 gain 32 193 -101.74 gain 193 32 -102.37 gain 32 194 -94.88 gain 194 32 -96.29 gain 32 195 -95.02 gain 195 32 -94.98 gain 32 196 -94.93 gain 196 32 -99.20 gain 32 197 -102.01 gain 197 32 -101.41 gain 32 198 -95.76 gain 198 32 -99.68 gain 32 199 -94.89 gain 199 32 -98.91 gain 32 200 -92.82 gain 200 32 -98.18 gain 32 201 -94.01 gain 201 32 -99.27 gain 32 202 -98.58 gain 202 32 -102.99 gain 32 203 -91.36 gain 203 32 -94.87 gain 32 204 -100.97 gain 204 32 -101.12 gain 32 205 -104.68 gain 205 32 -108.58 gain 32 206 -96.61 gain 206 32 -101.61 gain 32 207 -97.42 gain 207 32 -101.84 gain 32 208 -105.67 gain 208 32 -112.69 gain 32 209 -99.99 gain 209 32 -106.59 gain 32 210 -96.22 gain 210 32 -103.00 gain 32 211 -87.77 gain 211 32 -89.78 gain 32 212 -99.43 gain 212 32 -104.45 gain 32 213 -99.19 gain 213 32 -103.53 gain 32 214 -90.69 gain 214 32 -100.42 gain 32 215 -100.23 gain 215 32 -105.36 gain 32 216 -96.83 gain 216 32 -105.88 gain 32 217 -94.74 gain 217 32 -104.05 gain 32 218 -95.92 gain 218 32 -98.03 gain 32 219 -98.58 gain 219 32 -101.18 gain 32 220 -97.06 gain 220 32 -95.74 gain 32 221 -98.20 gain 221 32 -102.56 gain 32 222 -100.51 gain 222 32 -100.68 gain 32 223 -101.85 gain 223 32 -105.26 gain 32 224 -95.25 gain 224 32 -99.13 gain 33 34 -58.99 gain 34 33 -59.63 gain 33 35 -74.75 gain 35 33 -76.33 gain 33 36 -72.77 gain 36 33 -74.50 gain 33 37 -85.01 gain 37 33 -89.27 gain 33 38 -85.46 gain 38 33 -87.27 gain 33 39 -82.07 gain 39 33 -88.19 gain 33 40 -88.46 gain 40 33 -89.57 gain 33 41 -88.88 gain 41 33 -85.33 gain 33 42 -87.20 gain 42 33 -90.90 gain 33 43 -91.10 gain 43 33 -92.39 gain 33 44 -95.15 gain 44 33 -100.03 gain 33 45 -78.75 gain 45 33 -83.61 gain 33 46 -76.25 gain 46 33 -77.57 gain 33 47 -75.06 gain 47 33 -74.09 gain 33 48 -63.00 gain 48 33 -61.61 gain 33 49 -63.69 gain 49 33 -66.35 gain 33 50 -74.05 gain 50 33 -73.58 gain 33 51 -81.61 gain 51 33 -84.83 gain 33 52 -84.76 gain 52 33 -85.21 gain 33 53 -83.74 gain 53 33 -84.75 gain 33 54 -85.79 gain 54 33 -86.20 gain 33 55 -88.47 gain 55 33 -85.80 gain 33 56 -87.89 gain 56 33 -90.27 gain 33 57 -91.32 gain 57 33 -92.79 gain 33 58 -96.79 gain 58 33 -94.94 gain 33 59 -89.83 gain 59 33 -87.24 gain 33 60 -77.90 gain 60 33 -84.59 gain 33 61 -80.10 gain 61 33 -78.70 gain 33 62 -67.05 gain 62 33 -63.15 gain 33 63 -67.50 gain 63 33 -67.57 gain 33 64 -72.33 gain 64 33 -76.62 gain 33 65 -79.13 gain 65 33 -78.98 gain 33 66 -87.53 gain 66 33 -86.35 gain 33 67 -90.45 gain 67 33 -90.50 gain 33 68 -90.41 gain 68 33 -93.05 gain 33 69 -87.85 gain 69 33 -87.71 gain 33 70 -86.53 gain 70 33 -84.85 gain 33 71 -91.30 gain 71 33 -93.20 gain 33 72 -88.45 gain 72 33 -87.90 gain 33 73 -90.74 gain 73 33 -91.56 gain 33 74 -88.13 gain 74 33 -85.06 gain 33 75 -78.43 gain 75 33 -81.26 gain 33 76 -75.72 gain 76 33 -78.67 gain 33 77 -77.15 gain 77 33 -76.09 gain 33 78 -75.67 gain 78 33 -79.12 gain 33 79 -80.97 gain 79 33 -84.03 gain 33 80 -84.39 gain 80 33 -85.24 gain 33 81 -81.16 gain 81 33 -82.92 gain 33 82 -91.07 gain 82 33 -93.82 gain 33 83 -84.99 gain 83 33 -85.01 gain 33 84 -84.62 gain 84 33 -81.82 gain 33 85 -88.07 gain 85 33 -90.71 gain 33 86 -84.18 gain 86 33 -88.45 gain 33 87 -91.33 gain 87 33 -92.89 gain 33 88 -94.49 gain 88 33 -95.69 gain 33 89 -93.41 gain 89 33 -96.75 gain 33 90 -83.88 gain 90 33 -86.56 gain 33 91 -79.95 gain 91 33 -83.71 gain 33 92 -83.48 gain 92 33 -88.15 gain 33 93 -83.44 gain 93 33 -85.47 gain 33 94 -83.34 gain 94 33 -83.94 gain 33 95 -78.04 gain 95 33 -77.88 gain 33 96 -87.88 gain 96 33 -94.69 gain 33 97 -87.94 gain 97 33 -87.57 gain 33 98 -94.73 gain 98 33 -94.83 gain 33 99 -87.99 gain 99 33 -87.23 gain 33 100 -96.30 gain 100 33 -95.45 gain 33 101 -95.40 gain 101 33 -98.18 gain 33 102 -90.81 gain 102 33 -93.56 gain 33 103 -93.92 gain 103 33 -97.84 gain 33 104 -105.94 gain 104 33 -112.34 gain 33 105 -85.08 gain 105 33 -86.00 gain 33 106 -81.60 gain 106 33 -79.86 gain 33 107 -85.90 gain 107 33 -84.06 gain 33 108 -85.35 gain 108 33 -83.13 gain 33 109 -87.77 gain 109 33 -89.00 gain 33 110 -87.26 gain 110 33 -94.85 gain 33 111 -84.43 gain 111 33 -81.99 gain 33 112 -85.37 gain 112 33 -86.39 gain 33 113 -92.75 gain 113 33 -92.90 gain 33 114 -91.77 gain 114 33 -89.09 gain 33 115 -91.62 gain 115 33 -89.59 gain 33 116 -84.81 gain 116 33 -85.21 gain 33 117 -94.53 gain 117 33 -92.07 gain 33 118 -97.22 gain 118 33 -96.39 gain 33 119 -91.47 gain 119 33 -95.69 gain 33 120 -88.48 gain 120 33 -90.09 gain 33 121 -86.92 gain 121 33 -89.55 gain 33 122 -90.51 gain 122 33 -92.90 gain 33 123 -89.54 gain 123 33 -92.27 gain 33 124 -83.88 gain 124 33 -84.60 gain 33 125 -86.80 gain 125 33 -90.85 gain 33 126 -90.65 gain 126 33 -91.35 gain 33 127 -81.62 gain 127 33 -81.95 gain 33 128 -90.07 gain 128 33 -92.99 gain 33 129 -92.05 gain 129 33 -92.18 gain 33 130 -98.89 gain 130 33 -100.31 gain 33 131 -87.48 gain 131 33 -88.67 gain 33 132 -91.76 gain 132 33 -88.97 gain 33 133 -96.09 gain 133 33 -98.47 gain 33 134 -94.30 gain 134 33 -93.54 gain 33 135 -91.51 gain 135 33 -93.06 gain 33 136 -91.50 gain 136 33 -93.49 gain 33 137 -96.79 gain 137 33 -101.69 gain 33 138 -88.47 gain 138 33 -86.90 gain 33 139 -83.82 gain 139 33 -85.51 gain 33 140 -88.38 gain 140 33 -90.90 gain 33 141 -95.34 gain 141 33 -89.84 gain 33 142 -90.76 gain 142 33 -92.00 gain 33 143 -88.06 gain 143 33 -92.03 gain 33 144 -91.26 gain 144 33 -93.60 gain 33 145 -96.51 gain 145 33 -102.24 gain 33 146 -92.48 gain 146 33 -94.20 gain 33 147 -101.41 gain 147 33 -100.23 gain 33 148 -93.57 gain 148 33 -90.72 gain 33 149 -93.71 gain 149 33 -94.52 gain 33 150 -87.18 gain 150 33 -88.82 gain 33 151 -87.21 gain 151 33 -87.79 gain 33 152 -91.85 gain 152 33 -92.25 gain 33 153 -91.81 gain 153 33 -91.43 gain 33 154 -84.94 gain 154 33 -86.46 gain 33 155 -89.85 gain 155 33 -89.95 gain 33 156 -97.05 gain 156 33 -96.38 gain 33 157 -95.98 gain 157 33 -97.79 gain 33 158 -87.85 gain 158 33 -89.16 gain 33 159 -91.10 gain 159 33 -94.79 gain 33 160 -91.68 gain 160 33 -92.52 gain 33 161 -85.78 gain 161 33 -89.06 gain 33 162 -98.44 gain 162 33 -101.43 gain 33 163 -94.64 gain 163 33 -99.55 gain 33 164 -100.10 gain 164 33 -104.38 gain 33 165 -93.09 gain 165 33 -94.42 gain 33 166 -92.48 gain 166 33 -93.57 gain 33 167 -92.96 gain 167 33 -94.77 gain 33 168 -92.16 gain 168 33 -92.86 gain 33 169 -95.33 gain 169 33 -97.14 gain 33 170 -92.77 gain 170 33 -93.82 gain 33 171 -91.58 gain 171 33 -93.71 gain 33 172 -87.15 gain 172 33 -87.48 gain 33 173 -90.08 gain 173 33 -95.05 gain 33 174 -90.93 gain 174 33 -91.95 gain 33 175 -92.89 gain 175 33 -95.05 gain 33 176 -90.91 gain 176 33 -92.04 gain 33 177 -88.90 gain 177 33 -93.03 gain 33 178 -101.87 gain 178 33 -99.44 gain 33 179 -89.39 gain 179 33 -86.38 gain 33 180 -95.13 gain 180 33 -101.57 gain 33 181 -92.49 gain 181 33 -92.94 gain 33 182 -93.27 gain 182 33 -94.81 gain 33 183 -93.07 gain 183 33 -94.88 gain 33 184 -93.93 gain 184 33 -98.49 gain 33 185 -101.02 gain 185 33 -109.45 gain 33 186 -87.57 gain 186 33 -91.58 gain 33 187 -98.03 gain 187 33 -99.77 gain 33 188 -92.85 gain 188 33 -97.01 gain 33 189 -95.11 gain 189 33 -93.99 gain 33 190 -97.50 gain 190 33 -100.30 gain 33 191 -95.93 gain 191 33 -97.43 gain 33 192 -96.01 gain 192 33 -96.21 gain 33 193 -105.40 gain 193 33 -104.58 gain 33 194 -99.09 gain 194 33 -99.06 gain 33 195 -94.67 gain 195 33 -93.18 gain 33 196 -89.04 gain 196 33 -91.86 gain 33 197 -90.87 gain 197 33 -88.83 gain 33 198 -100.41 gain 198 33 -102.88 gain 33 199 -91.58 gain 199 33 -94.15 gain 33 200 -93.83 gain 200 33 -97.74 gain 33 201 -94.24 gain 201 33 -98.06 gain 33 202 -90.99 gain 202 33 -93.95 gain 33 203 -90.48 gain 203 33 -92.54 gain 33 204 -99.82 gain 204 33 -98.53 gain 33 205 -100.67 gain 205 33 -103.12 gain 33 206 -99.81 gain 206 33 -103.37 gain 33 207 -97.58 gain 207 33 -100.56 gain 33 208 -95.29 gain 208 33 -100.87 gain 33 209 -105.16 gain 209 33 -110.31 gain 33 210 -98.16 gain 210 33 -103.49 gain 33 211 -100.13 gain 211 33 -100.69 gain 33 212 -92.56 gain 212 33 -96.13 gain 33 213 -102.97 gain 213 33 -105.87 gain 33 214 -93.31 gain 214 33 -101.59 gain 33 215 -96.97 gain 215 33 -100.66 gain 33 216 -103.36 gain 216 33 -110.96 gain 33 217 -94.57 gain 217 33 -102.43 gain 33 218 -95.48 gain 218 33 -96.15 gain 33 219 -95.12 gain 219 33 -96.27 gain 33 220 -104.33 gain 220 33 -101.57 gain 33 221 -95.66 gain 221 33 -98.58 gain 33 222 -102.82 gain 222 33 -101.54 gain 33 223 -99.07 gain 223 33 -101.03 gain 33 224 -99.35 gain 224 33 -101.78 gain 34 35 -64.54 gain 35 34 -65.48 gain 34 36 -74.32 gain 36 34 -75.41 gain 34 37 -70.68 gain 37 34 -74.31 gain 34 38 -83.38 gain 38 34 -84.55 gain 34 39 -80.37 gain 39 34 -85.85 gain 34 40 -88.70 gain 40 34 -89.17 gain 34 41 -86.91 gain 41 34 -82.72 gain 34 42 -93.35 gain 42 34 -96.41 gain 34 43 -93.69 gain 43 34 -94.34 gain 34 44 -100.35 gain 44 34 -104.60 gain 34 45 -83.73 gain 45 34 -87.95 gain 34 46 -82.93 gain 46 34 -83.63 gain 34 47 -70.03 gain 47 34 -68.42 gain 34 48 -61.96 gain 48 34 -59.93 gain 34 49 -69.52 gain 49 34 -71.55 gain 34 50 -72.63 gain 50 34 -71.52 gain 34 51 -73.72 gain 51 34 -76.30 gain 34 52 -79.07 gain 52 34 -78.89 gain 34 53 -81.98 gain 53 34 -82.36 gain 34 54 -85.80 gain 54 34 -85.59 gain 34 55 -93.63 gain 55 34 -90.33 gain 34 56 -98.18 gain 56 34 -99.92 gain 34 57 -95.31 gain 57 34 -96.13 gain 34 58 -92.99 gain 58 34 -90.51 gain 34 59 -93.66 gain 59 34 -90.43 gain 34 60 -83.46 gain 60 34 -89.52 gain 34 61 -81.62 gain 61 34 -79.58 gain 34 62 -75.18 gain 62 34 -70.65 gain 34 63 -74.71 gain 63 34 -74.14 gain 34 64 -72.06 gain 64 34 -75.72 gain 34 65 -73.52 gain 65 34 -72.73 gain 34 66 -79.86 gain 66 34 -78.05 gain 34 67 -77.87 gain 67 34 -77.29 gain 34 68 -81.83 gain 68 34 -83.84 gain 34 69 -83.98 gain 69 34 -83.21 gain 34 70 -80.98 gain 70 34 -78.67 gain 34 71 -91.66 gain 71 34 -92.92 gain 34 72 -96.16 gain 72 34 -94.97 gain 34 73 -94.02 gain 73 34 -94.21 gain 34 74 -93.87 gain 74 34 -90.18 gain 34 75 -87.34 gain 75 34 -89.53 gain 34 76 -79.14 gain 76 34 -81.46 gain 34 77 -79.24 gain 77 34 -77.55 gain 34 78 -80.98 gain 78 34 -83.79 gain 34 79 -80.65 gain 79 34 -83.09 gain 34 80 -83.47 gain 80 34 -83.69 gain 34 81 -82.27 gain 81 34 -83.40 gain 34 82 -87.79 gain 82 34 -89.90 gain 34 83 -87.41 gain 83 34 -86.79 gain 34 84 -93.69 gain 84 34 -90.26 gain 34 85 -90.97 gain 85 34 -92.97 gain 34 86 -91.26 gain 86 34 -94.90 gain 34 87 -90.03 gain 87 34 -90.95 gain 34 88 -89.05 gain 88 34 -89.62 gain 34 89 -97.36 gain 89 34 -100.07 gain 34 90 -83.27 gain 90 34 -85.32 gain 34 91 -79.22 gain 91 34 -82.33 gain 34 92 -84.54 gain 92 34 -88.57 gain 34 93 -80.34 gain 93 34 -81.74 gain 34 94 -82.21 gain 94 34 -82.17 gain 34 95 -86.35 gain 95 34 -85.55 gain 34 96 -84.57 gain 96 34 -90.75 gain 34 97 -91.22 gain 97 34 -90.22 gain 34 98 -85.60 gain 98 34 -85.07 gain 34 99 -89.40 gain 99 34 -88.00 gain 34 100 -85.74 gain 100 34 -84.26 gain 34 101 -87.29 gain 101 34 -89.44 gain 34 102 -91.43 gain 102 34 -93.54 gain 34 103 -94.66 gain 103 34 -97.95 gain 34 104 -100.50 gain 104 34 -106.27 gain 34 105 -86.82 gain 105 34 -87.11 gain 34 106 -86.54 gain 106 34 -84.16 gain 34 107 -84.79 gain 107 34 -82.32 gain 34 108 -83.34 gain 108 34 -80.48 gain 34 109 -85.88 gain 109 34 -86.47 gain 34 110 -88.05 gain 110 34 -95.00 gain 34 111 -90.51 gain 111 34 -87.43 gain 34 112 -87.44 gain 112 34 -87.82 gain 34 113 -98.74 gain 113 34 -98.25 gain 34 114 -83.89 gain 114 34 -80.57 gain 34 115 -96.51 gain 115 34 -93.85 gain 34 116 -90.00 gain 116 34 -89.77 gain 34 117 -90.53 gain 117 34 -87.44 gain 34 118 -96.35 gain 118 34 -94.89 gain 34 119 -91.99 gain 119 34 -95.58 gain 34 120 -91.76 gain 120 34 -92.73 gain 34 121 -91.67 gain 121 34 -93.67 gain 34 122 -86.99 gain 122 34 -88.75 gain 34 123 -83.56 gain 123 34 -85.65 gain 34 124 -85.74 gain 124 34 -85.82 gain 34 125 -94.38 gain 125 34 -97.80 gain 34 126 -83.18 gain 126 34 -83.24 gain 34 127 -87.45 gain 127 34 -87.14 gain 34 128 -93.98 gain 128 34 -96.27 gain 34 129 -90.54 gain 129 34 -90.04 gain 34 130 -96.65 gain 130 34 -97.44 gain 34 131 -91.74 gain 131 34 -92.30 gain 34 132 -97.93 gain 132 34 -94.50 gain 34 133 -93.72 gain 133 34 -95.46 gain 34 134 -85.54 gain 134 34 -84.14 gain 34 135 -91.76 gain 135 34 -92.67 gain 34 136 -91.22 gain 136 34 -92.57 gain 34 137 -83.25 gain 137 34 -87.52 gain 34 138 -81.20 gain 138 34 -79.00 gain 34 139 -85.05 gain 139 34 -86.11 gain 34 140 -90.04 gain 140 34 -91.93 gain 34 141 -91.38 gain 141 34 -85.24 gain 34 142 -94.72 gain 142 34 -95.33 gain 34 143 -95.73 gain 143 34 -99.07 gain 34 144 -95.67 gain 144 34 -97.37 gain 34 145 -89.94 gain 145 34 -95.03 gain 34 146 -95.42 gain 146 34 -96.51 gain 34 147 -90.02 gain 147 34 -88.22 gain 34 148 -91.37 gain 148 34 -87.89 gain 34 149 -102.03 gain 149 34 -102.21 gain 34 150 -93.90 gain 150 34 -94.91 gain 34 151 -90.88 gain 151 34 -90.83 gain 34 152 -88.10 gain 152 34 -87.87 gain 34 153 -95.02 gain 153 34 -94.00 gain 34 154 -90.53 gain 154 34 -91.42 gain 34 155 -82.71 gain 155 34 -82.17 gain 34 156 -87.51 gain 156 34 -86.20 gain 34 157 -91.39 gain 157 34 -92.57 gain 34 158 -90.02 gain 158 34 -90.70 gain 34 159 -90.04 gain 159 34 -93.10 gain 34 160 -91.38 gain 160 34 -91.59 gain 34 161 -94.69 gain 161 34 -97.34 gain 34 162 -94.40 gain 162 34 -96.76 gain 34 163 -96.86 gain 163 34 -101.13 gain 34 164 -94.14 gain 164 34 -97.79 gain 34 165 -92.13 gain 165 34 -92.83 gain 34 166 -93.85 gain 166 34 -94.30 gain 34 167 -88.28 gain 167 34 -89.45 gain 34 168 -93.41 gain 168 34 -93.48 gain 34 169 -94.98 gain 169 34 -96.17 gain 34 170 -92.81 gain 170 34 -93.23 gain 34 171 -95.02 gain 171 34 -96.52 gain 34 172 -95.30 gain 172 34 -94.99 gain 34 173 -86.11 gain 173 34 -90.44 gain 34 174 -99.01 gain 174 34 -99.39 gain 34 175 -94.22 gain 175 34 -95.73 gain 34 176 -93.62 gain 176 34 -94.10 gain 34 177 -95.09 gain 177 34 -98.58 gain 34 178 -97.19 gain 178 34 -94.12 gain 34 179 -101.42 gain 179 34 -97.77 gain 34 180 -89.94 gain 180 34 -95.74 gain 34 181 -97.51 gain 181 34 -97.33 gain 34 182 -101.03 gain 182 34 -101.94 gain 34 183 -96.65 gain 183 34 -97.84 gain 34 184 -89.89 gain 184 34 -93.82 gain 34 185 -94.36 gain 185 34 -102.16 gain 34 186 -98.67 gain 186 34 -102.04 gain 34 187 -95.60 gain 187 34 -96.71 gain 34 188 -93.68 gain 188 34 -97.20 gain 34 189 -96.52 gain 189 34 -94.76 gain 34 190 -93.71 gain 190 34 -95.87 gain 34 191 -94.49 gain 191 34 -95.36 gain 34 192 -98.38 gain 192 34 -97.94 gain 34 193 -99.05 gain 193 34 -97.60 gain 34 194 -101.48 gain 194 34 -100.81 gain 34 195 -91.79 gain 195 34 -89.66 gain 34 196 -100.37 gain 196 34 -102.56 gain 34 197 -97.68 gain 197 34 -95.01 gain 34 198 -94.27 gain 198 34 -96.11 gain 34 199 -99.89 gain 199 34 -101.83 gain 34 200 -93.44 gain 200 34 -96.72 gain 34 201 -102.96 gain 201 34 -106.14 gain 34 202 -95.70 gain 202 34 -98.02 gain 34 203 -97.13 gain 203 34 -98.56 gain 34 204 -100.35 gain 204 34 -98.43 gain 34 205 -101.27 gain 205 34 -103.09 gain 34 206 -95.38 gain 206 34 -98.31 gain 34 207 -102.48 gain 207 34 -104.83 gain 34 208 -103.40 gain 208 34 -108.34 gain 34 209 -99.44 gain 209 34 -103.96 gain 34 210 -97.17 gain 210 34 -101.86 gain 34 211 -99.50 gain 211 34 -99.42 gain 34 212 -99.39 gain 212 34 -102.33 gain 34 213 -95.36 gain 213 34 -97.63 gain 34 214 -102.46 gain 214 34 -110.11 gain 34 215 -98.57 gain 215 34 -101.62 gain 34 216 -100.65 gain 216 34 -107.61 gain 34 217 -107.70 gain 217 34 -114.93 gain 34 218 -92.61 gain 218 34 -92.64 gain 34 219 -103.24 gain 219 34 -103.75 gain 34 220 -93.66 gain 220 34 -90.26 gain 34 221 -95.46 gain 221 34 -97.74 gain 34 222 -97.35 gain 222 34 -95.44 gain 34 223 -104.60 gain 223 34 -105.92 gain 34 224 -98.85 gain 224 34 -100.64 gain 35 36 -73.45 gain 36 35 -73.60 gain 35 37 -70.85 gain 37 35 -73.53 gain 35 38 -80.25 gain 38 35 -80.47 gain 35 39 -80.19 gain 39 35 -84.73 gain 35 40 -85.80 gain 40 35 -85.32 gain 35 41 -87.53 gain 41 35 -82.40 gain 35 42 -92.54 gain 42 35 -94.65 gain 35 43 -103.11 gain 43 35 -102.82 gain 35 44 -92.66 gain 44 35 -95.96 gain 35 45 -86.97 gain 45 35 -90.25 gain 35 46 -83.04 gain 46 35 -82.78 gain 35 47 -81.53 gain 47 35 -78.97 gain 35 48 -73.91 gain 48 35 -70.93 gain 35 49 -70.28 gain 49 35 -71.36 gain 35 50 -61.79 gain 50 35 -59.73 gain 35 51 -71.70 gain 51 35 -73.34 gain 35 52 -77.99 gain 52 35 -76.86 gain 35 53 -78.75 gain 53 35 -78.18 gain 35 54 -78.99 gain 54 35 -77.83 gain 35 55 -81.23 gain 55 35 -76.99 gain 35 56 -91.11 gain 56 35 -91.91 gain 35 57 -89.24 gain 57 35 -89.12 gain 35 58 -85.37 gain 58 35 -81.94 gain 35 59 -97.66 gain 59 35 -93.49 gain 35 60 -90.21 gain 60 35 -95.32 gain 35 61 -93.36 gain 61 35 -90.37 gain 35 62 -82.33 gain 62 35 -76.85 gain 35 63 -77.16 gain 63 35 -75.65 gain 35 64 -77.85 gain 64 35 -80.56 gain 35 65 -74.19 gain 65 35 -72.45 gain 35 66 -83.49 gain 66 35 -80.73 gain 35 67 -74.03 gain 67 35 -72.51 gain 35 68 -84.86 gain 68 35 -85.92 gain 35 69 -80.71 gain 69 35 -78.98 gain 35 70 -83.36 gain 70 35 -80.10 gain 35 71 -92.09 gain 71 35 -92.40 gain 35 72 -90.90 gain 72 35 -88.77 gain 35 73 -91.03 gain 73 35 -90.27 gain 35 74 -95.58 gain 74 35 -90.93 gain 35 75 -85.08 gain 75 35 -86.33 gain 35 76 -84.00 gain 76 35 -85.37 gain 35 77 -82.58 gain 77 35 -79.95 gain 35 78 -84.03 gain 78 35 -85.90 gain 35 79 -81.10 gain 79 35 -82.59 gain 35 80 -83.06 gain 80 35 -82.33 gain 35 81 -82.23 gain 81 35 -82.42 gain 35 82 -81.20 gain 82 35 -82.36 gain 35 83 -79.93 gain 83 35 -78.37 gain 35 84 -85.53 gain 84 35 -81.16 gain 35 85 -83.92 gain 85 35 -84.97 gain 35 86 -85.89 gain 86 35 -88.58 gain 35 87 -88.42 gain 87 35 -88.39 gain 35 88 -93.61 gain 88 35 -93.23 gain 35 89 -93.28 gain 89 35 -95.05 gain 35 90 -86.53 gain 90 35 -87.64 gain 35 91 -88.27 gain 91 35 -90.44 gain 35 92 -84.94 gain 92 35 -88.03 gain 35 93 -84.15 gain 93 35 -84.60 gain 35 94 -84.62 gain 94 35 -83.64 gain 35 95 -79.49 gain 95 35 -77.75 gain 35 96 -91.39 gain 96 35 -96.62 gain 35 97 -84.04 gain 97 35 -82.09 gain 35 98 -88.75 gain 98 35 -87.27 gain 35 99 -86.73 gain 99 35 -84.39 gain 35 100 -91.60 gain 100 35 -89.17 gain 35 101 -92.14 gain 101 35 -93.34 gain 35 102 -99.04 gain 102 35 -100.21 gain 35 103 -96.37 gain 103 35 -98.71 gain 35 104 -91.93 gain 104 35 -96.75 gain 35 105 -92.85 gain 105 35 -92.19 gain 35 106 -86.77 gain 106 35 -83.44 gain 35 107 -81.51 gain 107 35 -78.09 gain 35 108 -81.54 gain 108 35 -77.74 gain 35 109 -81.07 gain 109 35 -80.72 gain 35 110 -83.08 gain 110 35 -89.09 gain 35 111 -85.21 gain 111 35 -81.19 gain 35 112 -86.19 gain 112 35 -85.63 gain 35 113 -88.65 gain 113 35 -87.22 gain 35 114 -86.11 gain 114 35 -81.85 gain 35 115 -85.53 gain 115 35 -81.92 gain 35 116 -82.92 gain 116 35 -81.74 gain 35 117 -96.58 gain 117 35 -92.55 gain 35 118 -84.88 gain 118 35 -82.47 gain 35 119 -98.81 gain 119 35 -101.45 gain 35 120 -93.16 gain 120 35 -93.19 gain 35 121 -89.21 gain 121 35 -90.26 gain 35 122 -91.38 gain 122 35 -92.19 gain 35 123 -90.07 gain 123 35 -91.21 gain 35 124 -99.40 gain 124 35 -98.53 gain 35 125 -85.62 gain 125 35 -88.09 gain 35 126 -84.46 gain 126 35 -83.58 gain 35 127 -94.92 gain 127 35 -93.67 gain 35 128 -86.96 gain 128 35 -88.30 gain 35 129 -86.04 gain 129 35 -84.59 gain 35 130 -95.86 gain 130 35 -95.70 gain 35 131 -99.48 gain 131 35 -99.09 gain 35 132 -99.98 gain 132 35 -95.61 gain 35 133 -94.89 gain 133 35 -95.69 gain 35 134 -96.33 gain 134 35 -93.99 gain 35 135 -97.25 gain 135 35 -97.21 gain 35 136 -87.17 gain 136 35 -87.58 gain 35 137 -86.65 gain 137 35 -89.97 gain 35 138 -88.72 gain 138 35 -85.57 gain 35 139 -94.01 gain 139 35 -94.13 gain 35 140 -92.53 gain 140 35 -93.47 gain 35 141 -91.08 gain 141 35 -84.00 gain 35 142 -89.77 gain 142 35 -89.43 gain 35 143 -88.69 gain 143 35 -91.08 gain 35 144 -92.49 gain 144 35 -93.25 gain 35 145 -94.01 gain 145 35 -98.16 gain 35 146 -97.36 gain 146 35 -97.50 gain 35 147 -94.70 gain 147 35 -91.95 gain 35 148 -99.39 gain 148 35 -94.96 gain 35 149 -109.47 gain 149 35 -108.71 gain 35 150 -95.42 gain 150 35 -95.49 gain 35 151 -90.56 gain 151 35 -89.57 gain 35 152 -93.31 gain 152 35 -92.13 gain 35 153 -94.40 gain 153 35 -92.43 gain 35 154 -92.19 gain 154 35 -92.13 gain 35 155 -100.83 gain 155 35 -99.34 gain 35 156 -84.97 gain 156 35 -82.71 gain 35 157 -88.97 gain 157 35 -89.19 gain 35 158 -90.78 gain 158 35 -90.51 gain 35 159 -95.40 gain 159 35 -97.51 gain 35 160 -95.69 gain 160 35 -94.95 gain 35 161 -99.87 gain 161 35 -101.57 gain 35 162 -91.93 gain 162 35 -93.34 gain 35 163 -92.15 gain 163 35 -95.47 gain 35 164 -95.55 gain 164 35 -98.25 gain 35 165 -99.40 gain 165 35 -99.15 gain 35 166 -89.30 gain 166 35 -88.81 gain 35 167 -102.24 gain 167 35 -102.47 gain 35 168 -95.77 gain 168 35 -94.90 gain 35 169 -102.31 gain 169 35 -102.55 gain 35 170 -90.71 gain 170 35 -90.18 gain 35 171 -90.95 gain 171 35 -91.51 gain 35 172 -91.40 gain 172 35 -90.14 gain 35 173 -98.46 gain 173 35 -101.85 gain 35 174 -92.90 gain 174 35 -92.33 gain 35 175 -98.96 gain 175 35 -99.54 gain 35 176 -103.35 gain 176 35 -102.89 gain 35 177 -98.02 gain 177 35 -100.56 gain 35 178 -99.83 gain 178 35 -95.82 gain 35 179 -97.77 gain 179 35 -93.18 gain 35 180 -95.55 gain 180 35 -100.40 gain 35 181 -97.56 gain 181 35 -96.44 gain 35 182 -99.42 gain 182 35 -99.39 gain 35 183 -94.99 gain 183 35 -95.23 gain 35 184 -94.00 gain 184 35 -96.98 gain 35 185 -96.06 gain 185 35 -102.91 gain 35 186 -100.10 gain 186 35 -102.53 gain 35 187 -92.64 gain 187 35 -92.80 gain 35 188 -96.94 gain 188 35 -99.51 gain 35 189 -99.03 gain 189 35 -96.33 gain 35 190 -105.53 gain 190 35 -106.74 gain 35 191 -103.22 gain 191 35 -103.14 gain 35 192 -97.90 gain 192 35 -96.52 gain 35 193 -96.66 gain 193 35 -94.26 gain 35 194 -99.92 gain 194 35 -98.30 gain 35 195 -98.43 gain 195 35 -95.36 gain 35 196 -92.79 gain 196 35 -94.03 gain 35 197 -93.13 gain 197 35 -89.51 gain 35 198 -104.82 gain 198 35 -105.71 gain 35 199 -101.99 gain 199 35 -102.98 gain 35 200 -99.09 gain 200 35 -101.42 gain 35 201 -92.46 gain 201 35 -94.70 gain 35 202 -94.02 gain 202 35 -95.40 gain 35 203 -94.83 gain 203 35 -95.32 gain 35 204 -96.84 gain 204 35 -93.98 gain 35 205 -100.38 gain 205 35 -101.26 gain 35 206 -91.92 gain 206 35 -93.90 gain 35 207 -95.22 gain 207 35 -96.62 gain 35 208 -92.44 gain 208 35 -96.44 gain 35 209 -107.58 gain 209 35 -111.16 gain 35 210 -106.44 gain 210 35 -110.19 gain 35 211 -98.64 gain 211 35 -97.62 gain 35 212 -97.54 gain 212 35 -99.54 gain 35 213 -101.41 gain 213 35 -102.72 gain 35 214 -94.26 gain 214 35 -100.97 gain 35 215 -93.83 gain 215 35 -95.93 gain 35 216 -99.35 gain 216 35 -105.37 gain 35 217 -91.12 gain 217 35 -97.40 gain 35 218 -98.59 gain 218 35 -97.67 gain 35 219 -97.54 gain 219 35 -97.11 gain 35 220 -102.40 gain 220 35 -98.06 gain 35 221 -103.15 gain 221 35 -104.48 gain 35 222 -103.28 gain 222 35 -100.43 gain 35 223 -100.66 gain 223 35 -101.04 gain 35 224 -102.94 gain 224 35 -103.79 gain 36 37 -59.09 gain 37 36 -61.62 gain 36 38 -77.04 gain 38 36 -77.11 gain 36 39 -74.69 gain 39 36 -79.09 gain 36 40 -80.86 gain 40 36 -80.23 gain 36 41 -84.81 gain 41 36 -79.53 gain 36 42 -95.06 gain 42 36 -97.03 gain 36 43 -86.11 gain 43 36 -85.66 gain 36 44 -93.47 gain 44 36 -96.62 gain 36 45 -81.88 gain 45 36 -85.01 gain 36 46 -87.29 gain 46 36 -86.89 gain 36 47 -83.93 gain 47 36 -81.23 gain 36 48 -78.93 gain 48 36 -75.81 gain 36 49 -70.53 gain 49 36 -71.46 gain 36 50 -68.21 gain 50 36 -66.01 gain 36 51 -70.88 gain 51 36 -72.37 gain 36 52 -70.94 gain 52 36 -69.66 gain 36 53 -77.41 gain 53 36 -76.69 gain 36 54 -82.57 gain 54 36 -81.26 gain 36 55 -77.07 gain 55 36 -72.67 gain 36 56 -86.75 gain 56 36 -87.40 gain 36 57 -84.76 gain 57 36 -84.49 gain 36 58 -92.96 gain 58 36 -89.39 gain 36 59 -94.10 gain 59 36 -89.78 gain 36 60 -87.86 gain 60 36 -92.82 gain 36 61 -89.75 gain 61 36 -86.61 gain 36 62 -81.67 gain 62 36 -76.05 gain 36 63 -74.19 gain 63 36 -72.53 gain 36 64 -82.20 gain 64 36 -84.76 gain 36 65 -77.49 gain 65 36 -75.60 gain 36 66 -67.32 gain 66 36 -64.42 gain 36 67 -77.07 gain 67 36 -75.40 gain 36 68 -82.24 gain 68 36 -83.16 gain 36 69 -78.39 gain 69 36 -76.52 gain 36 70 -89.10 gain 70 36 -85.69 gain 36 71 -90.70 gain 71 36 -90.87 gain 36 72 -91.70 gain 72 36 -89.42 gain 36 73 -81.03 gain 73 36 -80.12 gain 36 74 -94.70 gain 74 36 -89.91 gain 36 75 -90.70 gain 75 36 -91.79 gain 36 76 -83.57 gain 76 36 -84.79 gain 36 77 -82.91 gain 77 36 -80.13 gain 36 78 -81.49 gain 78 36 -83.21 gain 36 79 -81.48 gain 79 36 -82.82 gain 36 80 -87.26 gain 80 36 -86.39 gain 36 81 -81.86 gain 81 36 -81.90 gain 36 82 -83.13 gain 82 36 -84.15 gain 36 83 -73.67 gain 83 36 -71.96 gain 36 84 -83.37 gain 84 36 -78.85 gain 36 85 -81.13 gain 85 36 -82.04 gain 36 86 -88.64 gain 86 36 -91.18 gain 36 87 -84.61 gain 87 36 -84.45 gain 36 88 -91.56 gain 88 36 -91.03 gain 36 89 -86.49 gain 89 36 -88.10 gain 36 90 -92.64 gain 90 36 -93.60 gain 36 91 -86.15 gain 91 36 -88.18 gain 36 92 -86.93 gain 92 36 -89.88 gain 36 93 -96.62 gain 93 36 -96.93 gain 36 94 -85.31 gain 94 36 -84.18 gain 36 95 -83.20 gain 95 36 -81.31 gain 36 96 -79.00 gain 96 36 -84.08 gain 36 97 -75.49 gain 97 36 -73.39 gain 36 98 -79.68 gain 98 36 -78.05 gain 36 99 -94.09 gain 99 36 -91.60 gain 36 100 -81.90 gain 100 36 -79.32 gain 36 101 -87.87 gain 101 36 -88.93 gain 36 102 -85.90 gain 102 36 -86.92 gain 36 103 -96.19 gain 103 36 -98.38 gain 36 104 -91.12 gain 104 36 -95.80 gain 36 105 -84.92 gain 105 36 -84.11 gain 36 106 -85.21 gain 106 36 -81.73 gain 36 107 -91.53 gain 107 36 -87.96 gain 36 108 -86.92 gain 108 36 -82.97 gain 36 109 -89.58 gain 109 36 -89.08 gain 36 110 -88.26 gain 110 36 -94.12 gain 36 111 -90.30 gain 111 36 -86.13 gain 36 112 -93.08 gain 112 36 -92.37 gain 36 113 -85.92 gain 113 36 -84.34 gain 36 114 -89.41 gain 114 36 -85.00 gain 36 115 -85.62 gain 115 36 -81.87 gain 36 116 -93.07 gain 116 36 -91.75 gain 36 117 -96.71 gain 117 36 -92.53 gain 36 118 -92.21 gain 118 36 -89.65 gain 36 119 -95.13 gain 119 36 -97.63 gain 36 120 -90.86 gain 120 36 -90.74 gain 36 121 -89.27 gain 121 36 -90.18 gain 36 122 -98.19 gain 122 36 -98.85 gain 36 123 -94.19 gain 123 36 -95.19 gain 36 124 -88.01 gain 124 36 -87.00 gain 36 125 -95.22 gain 125 36 -97.55 gain 36 126 -80.49 gain 126 36 -79.46 gain 36 127 -83.74 gain 127 36 -82.34 gain 36 128 -90.44 gain 128 36 -91.63 gain 36 129 -96.86 gain 129 36 -95.26 gain 36 130 -95.79 gain 130 36 -95.48 gain 36 131 -93.40 gain 131 36 -92.87 gain 36 132 -94.22 gain 132 36 -89.70 gain 36 133 -97.62 gain 133 36 -98.27 gain 36 134 -98.15 gain 134 36 -95.66 gain 36 135 -94.90 gain 135 36 -94.72 gain 36 136 -91.01 gain 136 36 -91.27 gain 36 137 -93.04 gain 137 36 -96.21 gain 36 138 -97.06 gain 138 36 -93.76 gain 36 139 -90.38 gain 139 36 -90.35 gain 36 140 -88.69 gain 140 36 -89.49 gain 36 141 -86.95 gain 141 36 -79.72 gain 36 142 -97.38 gain 142 36 -96.89 gain 36 143 -87.22 gain 143 36 -89.47 gain 36 144 -95.79 gain 144 36 -96.40 gain 36 145 -98.19 gain 145 36 -102.19 gain 36 146 -90.31 gain 146 36 -90.30 gain 36 147 -94.41 gain 147 36 -91.51 gain 36 148 -98.48 gain 148 36 -93.90 gain 36 149 -106.01 gain 149 36 -105.09 gain 36 150 -96.63 gain 150 36 -96.55 gain 36 151 -86.69 gain 151 36 -85.55 gain 36 152 -85.79 gain 152 36 -84.46 gain 36 153 -92.67 gain 153 36 -90.56 gain 36 154 -89.92 gain 154 36 -89.71 gain 36 155 -90.26 gain 155 36 -88.62 gain 36 156 -89.91 gain 156 36 -87.51 gain 36 157 -97.51 gain 157 36 -97.59 gain 36 158 -94.42 gain 158 36 -94.00 gain 36 159 -103.35 gain 159 36 -105.31 gain 36 160 -103.12 gain 160 36 -102.24 gain 36 161 -91.35 gain 161 36 -92.91 gain 36 162 -96.38 gain 162 36 -97.65 gain 36 163 -92.22 gain 163 36 -95.40 gain 36 164 -100.07 gain 164 36 -102.62 gain 36 165 -102.71 gain 165 36 -102.32 gain 36 166 -92.22 gain 166 36 -91.58 gain 36 167 -98.55 gain 167 36 -98.64 gain 36 168 -99.00 gain 168 36 -97.98 gain 36 169 -95.41 gain 169 36 -95.50 gain 36 170 -93.03 gain 170 36 -92.35 gain 36 171 -88.50 gain 171 36 -88.91 gain 36 172 -89.30 gain 172 36 -87.90 gain 36 173 -92.04 gain 173 36 -95.28 gain 36 174 -87.33 gain 174 36 -86.62 gain 36 175 -94.39 gain 175 36 -94.82 gain 36 176 -93.32 gain 176 36 -92.71 gain 36 177 -90.37 gain 177 36 -92.76 gain 36 178 -93.91 gain 178 36 -89.75 gain 36 179 -92.13 gain 179 36 -87.39 gain 36 180 -93.54 gain 180 36 -98.25 gain 36 181 -91.22 gain 181 36 -89.95 gain 36 182 -91.72 gain 182 36 -91.54 gain 36 183 -101.06 gain 183 36 -101.15 gain 36 184 -91.27 gain 184 36 -94.11 gain 36 185 -96.81 gain 185 36 -103.52 gain 36 186 -97.04 gain 186 36 -99.33 gain 36 187 -90.59 gain 187 36 -90.60 gain 36 188 -100.56 gain 188 36 -102.98 gain 36 189 -95.30 gain 189 36 -92.45 gain 36 190 -93.82 gain 190 36 -94.89 gain 36 191 -100.51 gain 191 36 -100.28 gain 36 192 -101.31 gain 192 36 -99.77 gain 36 193 -97.32 gain 193 36 -94.77 gain 36 194 -93.32 gain 194 36 -91.55 gain 36 195 -98.77 gain 195 36 -95.56 gain 36 196 -102.21 gain 196 36 -103.30 gain 36 197 -94.54 gain 197 36 -90.77 gain 36 198 -89.65 gain 198 36 -90.39 gain 36 199 -101.85 gain 199 36 -102.70 gain 36 200 -99.19 gain 200 36 -101.38 gain 36 201 -93.05 gain 201 36 -95.14 gain 36 202 -95.55 gain 202 36 -96.78 gain 36 203 -96.37 gain 203 36 -96.71 gain 36 204 -91.55 gain 204 36 -88.53 gain 36 205 -99.84 gain 205 36 -100.56 gain 36 206 -95.09 gain 206 36 -96.93 gain 36 207 -96.41 gain 207 36 -97.66 gain 36 208 -95.08 gain 208 36 -98.93 gain 36 209 -99.44 gain 209 36 -102.86 gain 36 210 -102.55 gain 210 36 -106.15 gain 36 211 -101.04 gain 211 36 -99.88 gain 36 212 -94.57 gain 212 36 -96.41 gain 36 213 -95.60 gain 213 36 -96.77 gain 36 214 -98.92 gain 214 36 -105.48 gain 36 215 -93.42 gain 215 36 -95.38 gain 36 216 -96.34 gain 216 36 -102.21 gain 36 217 -100.88 gain 217 36 -107.02 gain 36 218 -101.97 gain 218 36 -100.91 gain 36 219 -90.63 gain 219 36 -90.05 gain 36 220 -96.02 gain 220 36 -91.53 gain 36 221 -95.89 gain 221 36 -97.08 gain 36 222 -104.10 gain 222 36 -101.10 gain 36 223 -97.81 gain 223 36 -98.05 gain 36 224 -99.64 gain 224 36 -100.34 gain 37 38 -71.69 gain 38 37 -69.22 gain 37 39 -79.91 gain 39 37 -81.77 gain 37 40 -84.74 gain 40 37 -81.58 gain 37 41 -78.93 gain 41 37 -71.11 gain 37 42 -85.20 gain 42 37 -84.63 gain 37 43 -91.08 gain 43 37 -88.10 gain 37 44 -95.96 gain 44 37 -96.58 gain 37 45 -84.81 gain 45 37 -85.40 gain 37 46 -92.54 gain 46 37 -89.60 gain 37 47 -91.61 gain 47 37 -86.37 gain 37 48 -88.90 gain 48 37 -83.24 gain 37 49 -81.77 gain 49 37 -80.17 gain 37 50 -79.37 gain 50 37 -74.63 gain 37 51 -75.75 gain 51 37 -74.70 gain 37 52 -61.97 gain 52 37 -58.16 gain 37 53 -65.05 gain 53 37 -61.79 gain 37 54 -74.32 gain 54 37 -70.47 gain 37 55 -85.91 gain 55 37 -78.97 gain 37 56 -87.64 gain 56 37 -85.76 gain 37 57 -86.28 gain 57 37 -83.48 gain 37 58 -96.07 gain 58 37 -89.96 gain 37 59 -93.60 gain 59 37 -86.74 gain 37 60 -93.36 gain 60 37 -95.78 gain 37 61 -87.20 gain 61 37 -81.52 gain 37 62 -95.40 gain 62 37 -87.24 gain 37 63 -84.50 gain 63 37 -80.30 gain 37 64 -77.15 gain 64 37 -77.17 gain 37 65 -77.00 gain 65 37 -72.58 gain 37 66 -77.83 gain 66 37 -72.39 gain 37 67 -73.43 gain 67 37 -69.22 gain 37 68 -70.46 gain 68 37 -68.84 gain 37 69 -79.35 gain 69 37 -74.94 gain 37 70 -94.14 gain 70 37 -88.20 gain 37 71 -88.30 gain 71 37 -85.93 gain 37 72 -90.83 gain 72 37 -86.02 gain 37 73 -86.00 gain 73 37 -82.55 gain 37 74 -97.66 gain 74 37 -90.33 gain 37 75 -96.04 gain 75 37 -94.60 gain 37 76 -88.29 gain 76 37 -86.97 gain 37 77 -88.22 gain 77 37 -82.90 gain 37 78 -89.02 gain 78 37 -88.20 gain 37 79 -88.58 gain 79 37 -87.38 gain 37 80 -85.21 gain 80 37 -81.80 gain 37 81 -76.63 gain 81 37 -74.13 gain 37 82 -83.62 gain 82 37 -82.10 gain 37 83 -83.13 gain 83 37 -78.89 gain 37 84 -81.09 gain 84 37 -74.03 gain 37 85 -79.62 gain 85 37 -77.99 gain 37 86 -86.39 gain 86 37 -86.39 gain 37 87 -86.12 gain 87 37 -83.42 gain 37 88 -93.76 gain 88 37 -90.70 gain 37 89 -91.35 gain 89 37 -90.43 gain 37 90 -96.20 gain 90 37 -94.62 gain 37 91 -89.20 gain 91 37 -88.69 gain 37 92 -95.70 gain 92 37 -96.10 gain 37 93 -98.67 gain 93 37 -96.44 gain 37 94 -83.33 gain 94 37 -79.66 gain 37 95 -96.05 gain 95 37 -91.63 gain 37 96 -88.61 gain 96 37 -91.15 gain 37 97 -87.05 gain 97 37 -82.42 gain 37 98 -85.08 gain 98 37 -80.91 gain 37 99 -92.72 gain 99 37 -87.69 gain 37 100 -86.41 gain 100 37 -81.30 gain 37 101 -90.85 gain 101 37 -89.37 gain 37 102 -94.23 gain 102 37 -92.71 gain 37 103 -88.75 gain 103 37 -88.41 gain 37 104 -91.45 gain 104 37 -93.58 gain 37 105 -96.00 gain 105 37 -92.66 gain 37 106 -91.41 gain 106 37 -85.40 gain 37 107 -93.47 gain 107 37 -87.36 gain 37 108 -85.39 gain 108 37 -78.90 gain 37 109 -91.25 gain 109 37 -88.22 gain 37 110 -84.46 gain 110 37 -87.79 gain 37 111 -92.62 gain 111 37 -85.91 gain 37 112 -94.26 gain 112 37 -91.02 gain 37 113 -92.00 gain 113 37 -87.88 gain 37 114 -97.32 gain 114 37 -90.37 gain 37 115 -89.00 gain 115 37 -82.71 gain 37 116 -88.45 gain 116 37 -84.58 gain 37 117 -93.64 gain 117 37 -86.92 gain 37 118 -85.94 gain 118 37 -80.84 gain 37 119 -100.02 gain 119 37 -99.99 gain 37 120 -94.55 gain 120 37 -91.90 gain 37 121 -90.01 gain 121 37 -88.38 gain 37 122 -91.92 gain 122 37 -90.04 gain 37 123 -92.29 gain 123 37 -90.75 gain 37 124 -94.99 gain 124 37 -91.44 gain 37 125 -86.84 gain 125 37 -86.62 gain 37 126 -88.75 gain 126 37 -85.19 gain 37 127 -94.62 gain 127 37 -90.68 gain 37 128 -92.71 gain 128 37 -91.36 gain 37 129 -88.95 gain 129 37 -84.82 gain 37 130 -94.83 gain 130 37 -91.99 gain 37 131 -91.10 gain 131 37 -88.02 gain 37 132 -96.29 gain 132 37 -89.23 gain 37 133 -92.42 gain 133 37 -90.53 gain 37 134 -99.42 gain 134 37 -94.40 gain 37 135 -96.65 gain 135 37 -93.93 gain 37 136 -104.50 gain 136 37 -102.22 gain 37 137 -97.65 gain 137 37 -98.29 gain 37 138 -87.59 gain 138 37 -81.76 gain 37 139 -95.30 gain 139 37 -92.73 gain 37 140 -91.30 gain 140 37 -89.56 gain 37 141 -96.35 gain 141 37 -86.58 gain 37 142 -96.71 gain 142 37 -93.69 gain 37 143 -94.70 gain 143 37 -94.41 gain 37 144 -94.06 gain 144 37 -92.13 gain 37 145 -92.50 gain 145 37 -93.97 gain 37 146 -90.14 gain 146 37 -87.59 gain 37 147 -96.00 gain 147 37 -90.56 gain 37 148 -93.57 gain 148 37 -86.46 gain 37 149 -95.43 gain 149 37 -91.97 gain 37 150 -98.88 gain 150 37 -96.26 gain 37 151 -92.64 gain 151 37 -88.96 gain 37 152 -96.84 gain 152 37 -92.98 gain 37 153 -96.12 gain 153 37 -91.47 gain 37 154 -92.75 gain 154 37 -90.00 gain 37 155 -94.40 gain 155 37 -90.23 gain 37 156 -94.30 gain 156 37 -89.36 gain 37 157 -103.37 gain 157 37 -100.91 gain 37 158 -96.99 gain 158 37 -94.03 gain 37 159 -94.90 gain 159 37 -94.33 gain 37 160 -96.89 gain 160 37 -93.47 gain 37 161 -98.44 gain 161 37 -97.46 gain 37 162 -108.26 gain 162 37 -106.99 gain 37 163 -99.67 gain 163 37 -100.32 gain 37 164 -100.75 gain 164 37 -100.77 gain 37 165 -97.48 gain 165 37 -94.55 gain 37 166 -102.31 gain 166 37 -99.14 gain 37 167 -98.94 gain 167 37 -96.49 gain 37 168 -95.41 gain 168 37 -91.84 gain 37 169 -95.29 gain 169 37 -92.84 gain 37 170 -94.74 gain 170 37 -91.53 gain 37 171 -91.64 gain 171 37 -89.51 gain 37 172 -98.99 gain 172 37 -95.04 gain 37 173 -93.74 gain 173 37 -94.45 gain 37 174 -94.01 gain 174 37 -90.76 gain 37 175 -97.46 gain 175 37 -95.34 gain 37 176 -89.96 gain 176 37 -86.81 gain 37 177 -94.60 gain 177 37 -94.45 gain 37 178 -107.95 gain 178 37 -101.25 gain 37 179 -101.04 gain 179 37 -93.76 gain 37 180 -96.68 gain 180 37 -98.85 gain 37 181 -93.66 gain 181 37 -89.85 gain 37 182 -102.17 gain 182 37 -99.45 gain 37 183 -100.55 gain 183 37 -98.10 gain 37 184 -96.98 gain 184 37 -97.28 gain 37 185 -97.84 gain 185 37 -102.01 gain 37 186 -94.71 gain 186 37 -94.45 gain 37 187 -99.40 gain 187 37 -96.88 gain 37 188 -97.75 gain 188 37 -97.64 gain 37 189 -100.21 gain 189 37 -94.82 gain 37 190 -102.47 gain 190 37 -101.00 gain 37 191 -94.05 gain 191 37 -91.28 gain 37 192 -101.40 gain 192 37 -97.33 gain 37 193 -101.16 gain 193 37 -96.08 gain 37 194 -99.08 gain 194 37 -94.78 gain 37 195 -105.03 gain 195 37 -99.27 gain 37 196 -98.35 gain 196 37 -96.91 gain 37 197 -96.39 gain 197 37 -90.08 gain 37 198 -98.10 gain 198 37 -96.31 gain 37 199 -102.67 gain 199 37 -100.98 gain 37 200 -96.67 gain 200 37 -96.32 gain 37 201 -95.99 gain 201 37 -95.55 gain 37 202 -98.07 gain 202 37 -96.76 gain 37 203 -97.23 gain 203 37 -95.04 gain 37 204 -103.31 gain 204 37 -97.75 gain 37 205 -97.35 gain 205 37 -95.53 gain 37 206 -96.77 gain 206 37 -96.07 gain 37 207 -102.28 gain 207 37 -101.00 gain 37 208 -103.47 gain 208 37 -104.79 gain 37 209 -101.42 gain 209 37 -102.31 gain 37 210 -98.18 gain 210 37 -99.24 gain 37 211 -104.76 gain 211 37 -101.05 gain 37 212 -97.44 gain 212 37 -96.75 gain 37 213 -108.28 gain 213 37 -106.92 gain 37 214 -102.49 gain 214 37 -106.52 gain 37 215 -104.73 gain 215 37 -104.16 gain 37 216 -98.32 gain 216 37 -101.65 gain 37 217 -99.38 gain 217 37 -102.98 gain 37 218 -102.23 gain 218 37 -98.63 gain 37 219 -100.21 gain 219 37 -97.09 gain 37 220 -106.59 gain 220 37 -99.56 gain 37 221 -105.56 gain 221 37 -104.21 gain 37 222 -99.83 gain 222 37 -94.28 gain 37 223 -102.45 gain 223 37 -100.14 gain 37 224 -99.12 gain 224 37 -97.29 gain 38 39 -58.16 gain 39 38 -62.48 gain 38 40 -68.27 gain 40 38 -67.57 gain 38 41 -83.21 gain 41 38 -77.86 gain 38 42 -76.64 gain 42 38 -78.53 gain 38 43 -86.84 gain 43 38 -86.33 gain 38 44 -94.63 gain 44 38 -97.71 gain 38 45 -97.68 gain 45 38 -100.74 gain 38 46 -95.18 gain 46 38 -94.71 gain 38 47 -87.21 gain 47 38 -84.44 gain 38 48 -88.33 gain 48 38 -85.13 gain 38 49 -90.79 gain 49 38 -91.65 gain 38 50 -78.77 gain 50 38 -76.49 gain 38 51 -74.85 gain 51 38 -76.27 gain 38 52 -65.13 gain 52 38 -63.78 gain 38 53 -65.37 gain 53 38 -64.58 gain 38 54 -73.80 gain 54 38 -72.42 gain 38 55 -81.83 gain 55 38 -77.37 gain 38 56 -77.07 gain 56 38 -77.65 gain 38 57 -82.82 gain 57 38 -82.48 gain 38 58 -80.34 gain 58 38 -76.69 gain 38 59 -86.01 gain 59 38 -81.62 gain 38 60 -90.04 gain 60 38 -94.92 gain 38 61 -86.69 gain 61 38 -83.48 gain 38 62 -89.13 gain 62 38 -83.44 gain 38 63 -87.34 gain 63 38 -85.61 gain 38 64 -79.57 gain 64 38 -82.06 gain 38 65 -80.72 gain 65 38 -78.76 gain 38 66 -79.81 gain 66 38 -76.84 gain 38 67 -79.89 gain 67 38 -78.14 gain 38 68 -75.19 gain 68 38 -76.03 gain 38 69 -70.24 gain 69 38 -68.29 gain 38 70 -82.10 gain 70 38 -78.62 gain 38 71 -84.10 gain 71 38 -84.20 gain 38 72 -83.58 gain 72 38 -81.23 gain 38 73 -92.40 gain 73 38 -91.42 gain 38 74 -82.08 gain 74 38 -77.22 gain 38 75 -93.06 gain 75 38 -94.09 gain 38 76 -95.26 gain 76 38 -96.41 gain 38 77 -88.11 gain 77 38 -85.25 gain 38 78 -88.94 gain 78 38 -90.58 gain 38 79 -86.14 gain 79 38 -87.41 gain 38 80 -75.94 gain 80 38 -75.00 gain 38 81 -81.41 gain 81 38 -81.38 gain 38 82 -82.83 gain 82 38 -83.78 gain 38 83 -85.04 gain 83 38 -83.25 gain 38 84 -80.22 gain 84 38 -75.62 gain 38 85 -81.55 gain 85 38 -82.38 gain 38 86 -86.36 gain 86 38 -88.83 gain 38 87 -84.91 gain 87 38 -84.67 gain 38 88 -89.30 gain 88 38 -88.70 gain 38 89 -85.75 gain 89 38 -87.29 gain 38 90 -94.93 gain 90 38 -95.82 gain 38 91 -92.38 gain 91 38 -94.33 gain 38 92 -91.37 gain 92 38 -94.24 gain 38 93 -93.28 gain 93 38 -93.50 gain 38 94 -97.60 gain 94 38 -96.39 gain 38 95 -83.01 gain 95 38 -81.05 gain 38 96 -81.40 gain 96 38 -86.41 gain 38 97 -86.41 gain 97 38 -84.25 gain 38 98 -82.99 gain 98 38 -81.29 gain 38 99 -85.37 gain 99 38 -82.81 gain 38 100 -83.96 gain 100 38 -81.31 gain 38 101 -83.01 gain 101 38 -83.99 gain 38 102 -88.27 gain 102 38 -89.21 gain 38 103 -90.88 gain 103 38 -92.99 gain 38 104 -87.53 gain 104 38 -92.13 gain 38 105 -99.23 gain 105 38 -98.35 gain 38 106 -88.88 gain 106 38 -85.34 gain 38 107 -94.17 gain 107 38 -90.53 gain 38 108 -91.14 gain 108 38 -87.12 gain 38 109 -92.53 gain 109 38 -91.96 gain 38 110 -85.07 gain 110 38 -90.86 gain 38 111 -82.41 gain 111 38 -78.17 gain 38 112 -95.50 gain 112 38 -94.72 gain 38 113 -81.43 gain 113 38 -79.78 gain 38 114 -84.13 gain 114 38 -79.65 gain 38 115 -85.54 gain 115 38 -81.71 gain 38 116 -87.81 gain 116 38 -86.41 gain 38 117 -90.28 gain 117 38 -86.03 gain 38 118 -91.10 gain 118 38 -88.47 gain 38 119 -88.29 gain 119 38 -90.72 gain 38 120 -97.62 gain 120 38 -97.43 gain 38 121 -91.50 gain 121 38 -92.33 gain 38 122 -83.52 gain 122 38 -84.11 gain 38 123 -91.33 gain 123 38 -92.25 gain 38 124 -87.04 gain 124 38 -85.96 gain 38 125 -93.60 gain 125 38 -95.85 gain 38 126 -91.11 gain 126 38 -90.01 gain 38 127 -91.14 gain 127 38 -89.66 gain 38 128 -81.71 gain 128 38 -82.83 gain 38 129 -93.08 gain 129 38 -91.41 gain 38 130 -89.72 gain 130 38 -89.34 gain 38 131 -90.80 gain 131 38 -90.19 gain 38 132 -88.59 gain 132 38 -83.99 gain 38 133 -92.81 gain 133 38 -93.39 gain 38 134 -91.24 gain 134 38 -88.68 gain 38 135 -95.53 gain 135 38 -95.27 gain 38 136 -100.36 gain 136 38 -100.55 gain 38 137 -98.87 gain 137 38 -101.96 gain 38 138 -96.19 gain 138 38 -92.82 gain 38 139 -93.38 gain 139 38 -93.28 gain 38 140 -101.50 gain 140 38 -102.22 gain 38 141 -90.18 gain 141 38 -82.88 gain 38 142 -93.70 gain 142 38 -93.14 gain 38 143 -89.20 gain 143 38 -91.38 gain 38 144 -93.38 gain 144 38 -93.92 gain 38 145 -82.71 gain 145 38 -86.64 gain 38 146 -93.53 gain 146 38 -93.44 gain 38 147 -92.92 gain 147 38 -89.95 gain 38 148 -94.23 gain 148 38 -89.58 gain 38 149 -85.02 gain 149 38 -84.03 gain 38 150 -101.39 gain 150 38 -101.24 gain 38 151 -94.15 gain 151 38 -92.94 gain 38 152 -95.56 gain 152 38 -94.17 gain 38 153 -95.22 gain 153 38 -93.03 gain 38 154 -94.01 gain 154 38 -93.73 gain 38 155 -99.20 gain 155 38 -97.49 gain 38 156 -101.97 gain 156 38 -99.50 gain 38 157 -89.15 gain 157 38 -89.15 gain 38 158 -98.13 gain 158 38 -97.63 gain 38 159 -93.49 gain 159 38 -95.38 gain 38 160 -85.09 gain 160 38 -84.13 gain 38 161 -93.12 gain 161 38 -94.61 gain 38 162 -98.74 gain 162 38 -99.93 gain 38 163 -96.81 gain 163 38 -99.92 gain 38 164 -92.45 gain 164 38 -94.92 gain 38 165 -99.04 gain 165 38 -98.58 gain 38 166 -95.81 gain 166 38 -95.09 gain 38 167 -98.48 gain 167 38 -98.48 gain 38 168 -93.73 gain 168 38 -92.64 gain 38 169 -94.52 gain 169 38 -94.54 gain 38 170 -96.40 gain 170 38 -95.65 gain 38 171 -86.76 gain 171 38 -87.09 gain 38 172 -98.49 gain 172 38 -97.01 gain 38 173 -94.63 gain 173 38 -97.79 gain 38 174 -89.88 gain 174 38 -89.09 gain 38 175 -93.91 gain 175 38 -94.26 gain 38 176 -96.57 gain 176 38 -95.89 gain 38 177 -92.91 gain 177 38 -95.23 gain 38 178 -100.59 gain 178 38 -96.36 gain 38 179 -102.79 gain 179 38 -97.97 gain 38 180 -97.61 gain 180 38 -102.25 gain 38 181 -95.77 gain 181 38 -94.43 gain 38 182 -100.41 gain 182 38 -100.16 gain 38 183 -97.16 gain 183 38 -97.18 gain 38 184 -95.44 gain 184 38 -98.20 gain 38 185 -90.31 gain 185 38 -96.94 gain 38 186 -93.37 gain 186 38 -95.58 gain 38 187 -93.25 gain 187 38 -93.19 gain 38 188 -99.41 gain 188 38 -101.76 gain 38 189 -93.34 gain 189 38 -90.42 gain 38 190 -93.37 gain 190 38 -94.36 gain 38 191 -101.28 gain 191 38 -100.98 gain 38 192 -101.34 gain 192 38 -99.74 gain 38 193 -96.18 gain 193 38 -93.56 gain 38 194 -99.11 gain 194 38 -97.27 gain 38 195 -92.96 gain 195 38 -89.67 gain 38 196 -93.57 gain 196 38 -94.59 gain 38 197 -90.26 gain 197 38 -86.42 gain 38 198 -98.51 gain 198 38 -99.18 gain 38 199 -92.73 gain 199 38 -93.51 gain 38 200 -101.98 gain 200 38 -104.09 gain 38 201 -100.54 gain 201 38 -102.56 gain 38 202 -100.55 gain 202 38 -101.71 gain 38 203 -99.90 gain 203 38 -100.17 gain 38 204 -92.13 gain 204 38 -89.04 gain 38 205 -102.19 gain 205 38 -102.84 gain 38 206 -94.10 gain 206 38 -95.86 gain 38 207 -94.75 gain 207 38 -95.93 gain 38 208 -101.17 gain 208 38 -104.95 gain 38 209 -92.65 gain 209 38 -96.00 gain 38 210 -102.66 gain 210 38 -106.18 gain 38 211 -103.28 gain 211 38 -102.03 gain 38 212 -102.88 gain 212 38 -104.65 gain 38 213 -95.79 gain 213 38 -96.89 gain 38 214 -102.17 gain 214 38 -108.66 gain 38 215 -104.51 gain 215 38 -106.39 gain 38 216 -90.74 gain 216 38 -96.53 gain 38 217 -102.63 gain 217 38 -108.69 gain 38 218 -102.17 gain 218 38 -101.03 gain 38 219 -93.82 gain 219 38 -93.16 gain 38 220 -103.09 gain 220 38 -98.53 gain 38 221 -104.16 gain 221 38 -105.28 gain 38 222 -98.43 gain 222 38 -95.35 gain 38 223 -96.97 gain 223 38 -97.13 gain 38 224 -95.63 gain 224 38 -96.26 gain 39 40 -69.82 gain 40 39 -64.80 gain 39 41 -70.90 gain 41 39 -61.22 gain 39 42 -85.74 gain 42 39 -83.31 gain 39 43 -87.60 gain 43 39 -82.76 gain 39 44 -89.80 gain 44 39 -88.56 gain 39 45 -96.35 gain 45 39 -95.09 gain 39 46 -95.07 gain 46 39 -90.27 gain 39 47 -99.49 gain 47 39 -92.40 gain 39 48 -90.45 gain 48 39 -82.93 gain 39 49 -90.70 gain 49 39 -87.24 gain 39 50 -91.37 gain 50 39 -84.77 gain 39 51 -81.58 gain 51 39 -78.68 gain 39 52 -81.28 gain 52 39 -75.61 gain 39 53 -71.00 gain 53 39 -65.88 gain 39 54 -68.84 gain 54 39 -63.13 gain 39 55 -76.09 gain 55 39 -67.30 gain 39 56 -84.23 gain 56 39 -80.49 gain 39 57 -83.22 gain 57 39 -78.56 gain 39 58 -88.18 gain 58 39 -80.21 gain 39 59 -90.98 gain 59 39 -82.27 gain 39 60 -97.50 gain 60 39 -98.07 gain 39 61 -97.77 gain 61 39 -90.24 gain 39 62 -97.82 gain 62 39 -87.80 gain 39 63 -101.19 gain 63 39 -95.14 gain 39 64 -92.88 gain 64 39 -91.05 gain 39 65 -89.42 gain 65 39 -83.14 gain 39 66 -87.17 gain 66 39 -79.87 gain 39 67 -85.61 gain 67 39 -79.54 gain 39 68 -75.97 gain 68 39 -72.49 gain 39 69 -80.61 gain 69 39 -74.34 gain 39 70 -82.47 gain 70 39 -74.67 gain 39 71 -85.22 gain 71 39 -80.99 gain 39 72 -85.33 gain 72 39 -78.66 gain 39 73 -91.06 gain 73 39 -85.76 gain 39 74 -90.79 gain 74 39 -81.61 gain 39 75 -102.57 gain 75 39 -99.27 gain 39 76 -96.06 gain 76 39 -92.89 gain 39 77 -98.72 gain 77 39 -91.54 gain 39 78 -96.50 gain 78 39 -93.83 gain 39 79 -93.51 gain 79 39 -90.46 gain 39 80 -88.86 gain 80 39 -83.60 gain 39 81 -92.49 gain 81 39 -88.14 gain 39 82 -88.72 gain 82 39 -85.34 gain 39 83 -78.97 gain 83 39 -72.86 gain 39 84 -85.35 gain 84 39 -76.43 gain 39 85 -85.52 gain 85 39 -82.03 gain 39 86 -83.78 gain 86 39 -81.93 gain 39 87 -85.63 gain 87 39 -81.07 gain 39 88 -93.98 gain 88 39 -89.06 gain 39 89 -89.64 gain 89 39 -86.86 gain 39 90 -103.38 gain 90 39 -99.94 gain 39 91 -99.99 gain 91 39 -97.62 gain 39 92 -103.60 gain 92 39 -102.15 gain 39 93 -95.65 gain 93 39 -91.56 gain 39 94 -95.69 gain 94 39 -90.17 gain 39 95 -93.03 gain 95 39 -86.74 gain 39 96 -91.43 gain 96 39 -92.12 gain 39 97 -87.38 gain 97 39 -80.89 gain 39 98 -89.64 gain 98 39 -83.62 gain 39 99 -86.25 gain 99 39 -79.36 gain 39 100 -83.73 gain 100 39 -76.76 gain 39 101 -94.21 gain 101 39 -90.88 gain 39 102 -85.14 gain 102 39 -81.77 gain 39 103 -90.90 gain 103 39 -88.69 gain 39 104 -93.07 gain 104 39 -93.35 gain 39 105 -100.91 gain 105 39 -95.72 gain 39 106 -99.56 gain 106 39 -91.69 gain 39 107 -97.30 gain 107 39 -89.34 gain 39 108 -106.23 gain 108 39 -97.89 gain 39 109 -97.19 gain 109 39 -92.29 gain 39 110 -98.60 gain 110 39 -100.06 gain 39 111 -90.32 gain 111 39 -81.75 gain 39 112 -95.63 gain 112 39 -90.53 gain 39 113 -94.20 gain 113 39 -88.23 gain 39 114 -95.87 gain 114 39 -87.07 gain 39 115 -87.61 gain 115 39 -79.46 gain 39 116 -93.02 gain 116 39 -87.30 gain 39 117 -92.57 gain 117 39 -83.99 gain 39 118 -93.25 gain 118 39 -86.29 gain 39 119 -93.75 gain 119 39 -91.85 gain 39 120 -97.62 gain 120 39 -93.11 gain 39 121 -105.83 gain 121 39 -102.35 gain 39 122 -96.75 gain 122 39 -93.01 gain 39 123 -110.06 gain 123 39 -106.66 gain 39 124 -97.49 gain 124 39 -92.08 gain 39 125 -90.09 gain 125 39 -88.01 gain 39 126 -96.92 gain 126 39 -91.50 gain 39 127 -83.98 gain 127 39 -78.18 gain 39 128 -97.19 gain 128 39 -93.99 gain 39 129 -88.27 gain 129 39 -82.28 gain 39 130 -92.12 gain 130 39 -87.42 gain 39 131 -86.69 gain 131 39 -81.76 gain 39 132 -91.33 gain 132 39 -82.42 gain 39 133 -91.84 gain 133 39 -88.10 gain 39 134 -95.33 gain 134 39 -88.45 gain 39 135 -102.43 gain 135 39 -97.85 gain 39 136 -94.18 gain 136 39 -90.05 gain 39 137 -93.31 gain 137 39 -92.09 gain 39 138 -101.14 gain 138 39 -93.45 gain 39 139 -95.93 gain 139 39 -91.50 gain 39 140 -96.80 gain 140 39 -93.20 gain 39 141 -94.03 gain 141 39 -82.40 gain 39 142 -88.23 gain 142 39 -83.34 gain 39 143 -94.27 gain 143 39 -92.12 gain 39 144 -101.30 gain 144 39 -97.52 gain 39 145 -92.32 gain 145 39 -91.93 gain 39 146 -85.14 gain 146 39 -80.74 gain 39 147 -102.29 gain 147 39 -94.99 gain 39 148 -93.66 gain 148 39 -84.69 gain 39 149 -91.80 gain 149 39 -86.49 gain 39 150 -104.51 gain 150 39 -100.04 gain 39 151 -106.46 gain 151 39 -100.92 gain 39 152 -99.67 gain 152 39 -93.95 gain 39 153 -95.06 gain 153 39 -88.56 gain 39 154 -104.80 gain 154 39 -100.20 gain 39 155 -102.69 gain 155 39 -96.66 gain 39 156 -96.52 gain 156 39 -89.72 gain 39 157 -98.16 gain 157 39 -93.85 gain 39 158 -94.78 gain 158 39 -89.97 gain 39 159 -98.97 gain 159 39 -96.54 gain 39 160 -95.86 gain 160 39 -90.58 gain 39 161 -104.14 gain 161 39 -101.30 gain 39 162 -98.53 gain 162 39 -95.40 gain 39 163 -96.72 gain 163 39 -95.50 gain 39 164 -99.85 gain 164 39 -98.01 gain 39 165 -102.17 gain 165 39 -97.38 gain 39 166 -103.20 gain 166 39 -98.17 gain 39 167 -101.22 gain 167 39 -96.91 gain 39 168 -94.71 gain 168 39 -89.29 gain 39 169 -104.81 gain 169 39 -100.51 gain 39 170 -98.81 gain 170 39 -93.74 gain 39 171 -100.30 gain 171 39 -96.31 gain 39 172 -86.34 gain 172 39 -80.54 gain 39 173 -102.05 gain 173 39 -100.90 gain 39 174 -94.52 gain 174 39 -89.41 gain 39 175 -96.63 gain 175 39 -92.66 gain 39 176 -102.85 gain 176 39 -97.85 gain 39 177 -100.07 gain 177 39 -98.07 gain 39 178 -101.44 gain 178 39 -92.88 gain 39 179 -93.41 gain 179 39 -84.28 gain 39 180 -99.10 gain 180 39 -99.42 gain 39 181 -104.45 gain 181 39 -98.79 gain 39 182 -97.83 gain 182 39 -93.25 gain 39 183 -107.96 gain 183 39 -103.65 gain 39 184 -103.42 gain 184 39 -101.87 gain 39 185 -95.15 gain 185 39 -97.46 gain 39 186 -104.87 gain 186 39 -102.76 gain 39 187 -107.21 gain 187 39 -102.83 gain 39 188 -99.39 gain 188 39 -97.42 gain 39 189 -102.05 gain 189 39 -94.81 gain 39 190 -101.02 gain 190 39 -97.69 gain 39 191 -101.49 gain 191 39 -96.87 gain 39 192 -101.35 gain 192 39 -95.42 gain 39 193 -95.99 gain 193 39 -89.05 gain 39 194 -100.67 gain 194 39 -94.52 gain 39 195 -98.89 gain 195 39 -91.27 gain 39 196 -107.36 gain 196 39 -104.06 gain 39 197 -103.33 gain 197 39 -95.16 gain 39 198 -105.07 gain 198 39 -101.42 gain 39 199 -104.30 gain 199 39 -100.76 gain 39 200 -102.05 gain 200 39 -99.84 gain 39 201 -109.42 gain 201 39 -107.11 gain 39 202 -96.66 gain 202 39 -93.49 gain 39 203 -98.86 gain 203 39 -94.81 gain 39 204 -104.31 gain 204 39 -96.90 gain 39 205 -107.28 gain 205 39 -103.61 gain 39 206 -97.17 gain 206 39 -94.61 gain 39 207 -92.46 gain 207 39 -89.32 gain 39 208 -97.01 gain 208 39 -96.47 gain 39 209 -105.84 gain 209 39 -104.87 gain 39 210 -115.09 gain 210 39 -114.30 gain 39 211 -110.46 gain 211 39 -104.90 gain 39 212 -104.92 gain 212 39 -102.37 gain 39 213 -99.39 gain 213 39 -96.17 gain 39 214 -96.11 gain 214 39 -98.27 gain 39 215 -107.80 gain 215 39 -105.37 gain 39 216 -101.78 gain 216 39 -103.26 gain 39 217 -105.12 gain 217 39 -106.86 gain 39 218 -98.40 gain 218 39 -92.95 gain 39 219 -103.39 gain 219 39 -98.42 gain 39 220 -98.65 gain 220 39 -89.76 gain 39 221 -100.35 gain 221 39 -97.15 gain 39 222 -99.46 gain 222 39 -92.06 gain 39 223 -103.57 gain 223 39 -99.41 gain 39 224 -102.23 gain 224 39 -98.54 gain 40 41 -71.45 gain 41 40 -66.79 gain 40 42 -73.93 gain 42 40 -76.53 gain 40 43 -78.40 gain 43 40 -78.59 gain 40 44 -78.03 gain 44 40 -81.81 gain 40 45 -97.71 gain 45 40 -101.47 gain 40 46 -96.59 gain 46 40 -96.81 gain 40 47 -89.86 gain 47 40 -87.78 gain 40 48 -97.68 gain 48 40 -95.19 gain 40 49 -94.28 gain 49 40 -95.84 gain 40 50 -85.82 gain 50 40 -84.24 gain 40 51 -84.25 gain 51 40 -86.36 gain 40 52 -84.66 gain 52 40 -84.01 gain 40 53 -80.47 gain 53 40 -80.38 gain 40 54 -62.98 gain 54 40 -62.30 gain 40 55 -68.86 gain 55 40 -65.10 gain 40 56 -72.24 gain 56 40 -73.52 gain 40 57 -80.99 gain 57 40 -81.35 gain 40 58 -78.66 gain 58 40 -75.71 gain 40 59 -84.64 gain 59 40 -80.95 gain 40 60 -96.14 gain 60 40 -101.73 gain 40 61 -100.65 gain 61 40 -98.14 gain 40 62 -89.03 gain 62 40 -84.03 gain 40 63 -94.76 gain 63 40 -93.72 gain 40 64 -86.73 gain 64 40 -89.92 gain 40 65 -91.64 gain 65 40 -90.38 gain 40 66 -84.47 gain 66 40 -82.20 gain 40 67 -84.18 gain 67 40 -83.13 gain 40 68 -72.84 gain 68 40 -74.38 gain 40 69 -74.00 gain 69 40 -72.75 gain 40 70 -68.49 gain 70 40 -65.72 gain 40 71 -71.34 gain 71 40 -72.14 gain 40 72 -78.87 gain 72 40 -77.22 gain 40 73 -79.46 gain 73 40 -79.18 gain 40 74 -82.68 gain 74 40 -78.51 gain 40 75 -98.36 gain 75 40 -100.08 gain 40 76 -97.18 gain 76 40 -99.02 gain 40 77 -96.45 gain 77 40 -94.29 gain 40 78 -97.85 gain 78 40 -100.19 gain 40 79 -98.07 gain 79 40 -100.03 gain 40 80 -86.20 gain 80 40 -85.95 gain 40 81 -85.89 gain 81 40 -86.56 gain 40 82 -78.01 gain 82 40 -79.65 gain 40 83 -77.87 gain 83 40 -76.79 gain 40 84 -79.64 gain 84 40 -75.75 gain 40 85 -78.62 gain 85 40 -80.15 gain 40 86 -83.44 gain 86 40 -86.61 gain 40 87 -81.03 gain 87 40 -81.49 gain 40 88 -85.09 gain 88 40 -85.19 gain 40 89 -83.87 gain 89 40 -86.11 gain 40 90 -101.07 gain 90 40 -102.66 gain 40 91 -96.57 gain 91 40 -99.22 gain 40 92 -93.42 gain 92 40 -96.99 gain 40 93 -94.51 gain 93 40 -95.44 gain 40 94 -89.86 gain 94 40 -89.36 gain 40 95 -83.69 gain 95 40 -82.43 gain 40 96 -84.57 gain 96 40 -90.28 gain 40 97 -84.96 gain 97 40 -83.49 gain 40 98 -89.95 gain 98 40 -88.95 gain 40 99 -87.94 gain 99 40 -86.08 gain 40 100 -73.58 gain 100 40 -71.63 gain 40 101 -85.97 gain 101 40 -87.65 gain 40 102 -81.94 gain 102 40 -83.59 gain 40 103 -78.89 gain 103 40 -81.71 gain 40 104 -91.19 gain 104 40 -96.49 gain 40 105 -96.59 gain 105 40 -96.41 gain 40 106 -96.63 gain 106 40 -93.78 gain 40 107 -94.86 gain 107 40 -91.92 gain 40 108 -97.99 gain 108 40 -94.67 gain 40 109 -94.01 gain 109 40 -94.14 gain 40 110 -93.38 gain 110 40 -99.87 gain 40 111 -94.26 gain 111 40 -90.72 gain 40 112 -92.44 gain 112 40 -92.36 gain 40 113 -85.42 gain 113 40 -84.46 gain 40 114 -91.35 gain 114 40 -87.57 gain 40 115 -89.50 gain 115 40 -86.37 gain 40 116 -80.98 gain 116 40 -80.29 gain 40 117 -84.78 gain 117 40 -81.22 gain 40 118 -81.82 gain 118 40 -79.89 gain 40 119 -92.18 gain 119 40 -95.31 gain 40 120 -103.55 gain 120 40 -104.06 gain 40 121 -98.72 gain 121 40 -100.26 gain 40 122 -93.99 gain 122 40 -95.27 gain 40 123 -92.61 gain 123 40 -94.23 gain 40 124 -94.70 gain 124 40 -94.32 gain 40 125 -90.86 gain 125 40 -93.81 gain 40 126 -83.72 gain 126 40 -83.32 gain 40 127 -88.02 gain 127 40 -87.25 gain 40 128 -89.88 gain 128 40 -91.70 gain 40 129 -89.13 gain 129 40 -88.16 gain 40 130 -84.90 gain 130 40 -85.22 gain 40 131 -83.03 gain 131 40 -83.12 gain 40 132 -91.99 gain 132 40 -88.09 gain 40 133 -89.66 gain 133 40 -90.94 gain 40 134 -93.61 gain 134 40 -91.76 gain 40 135 -97.54 gain 135 40 -97.99 gain 40 136 -94.90 gain 136 40 -95.78 gain 40 137 -94.65 gain 137 40 -98.45 gain 40 138 -94.95 gain 138 40 -92.28 gain 40 139 -94.82 gain 139 40 -95.42 gain 40 140 -91.92 gain 140 40 -93.34 gain 40 141 -96.44 gain 141 40 -89.84 gain 40 142 -93.37 gain 142 40 -93.51 gain 40 143 -95.65 gain 143 40 -98.52 gain 40 144 -92.51 gain 144 40 -93.75 gain 40 145 -85.49 gain 145 40 -90.12 gain 40 146 -87.23 gain 146 40 -87.85 gain 40 147 -87.34 gain 147 40 -85.07 gain 40 148 -90.79 gain 148 40 -86.85 gain 40 149 -88.05 gain 149 40 -87.77 gain 40 150 -96.93 gain 150 40 -97.48 gain 40 151 -92.14 gain 151 40 -91.62 gain 40 152 -98.67 gain 152 40 -97.97 gain 40 153 -92.74 gain 153 40 -91.26 gain 40 154 -98.16 gain 154 40 -98.58 gain 40 155 -93.38 gain 155 40 -92.37 gain 40 156 -102.01 gain 156 40 -100.24 gain 40 157 -88.05 gain 157 40 -88.75 gain 40 158 -84.61 gain 158 40 -84.81 gain 40 159 -95.98 gain 159 40 -98.57 gain 40 160 -86.29 gain 160 40 -86.03 gain 40 161 -95.40 gain 161 40 -97.58 gain 40 162 -93.47 gain 162 40 -95.36 gain 40 163 -89.92 gain 163 40 -93.73 gain 40 164 -90.70 gain 164 40 -93.87 gain 40 165 -98.37 gain 165 40 -98.61 gain 40 166 -101.22 gain 166 40 -101.21 gain 40 167 -100.45 gain 167 40 -101.16 gain 40 168 -96.04 gain 168 40 -95.64 gain 40 169 -99.65 gain 169 40 -100.37 gain 40 170 -97.43 gain 170 40 -97.38 gain 40 171 -95.45 gain 171 40 -96.48 gain 40 172 -94.81 gain 172 40 -94.03 gain 40 173 -94.44 gain 173 40 -98.31 gain 40 174 -96.95 gain 174 40 -96.87 gain 40 175 -103.93 gain 175 40 -104.98 gain 40 176 -89.50 gain 176 40 -89.52 gain 40 177 -91.01 gain 177 40 -94.04 gain 40 178 -98.01 gain 178 40 -94.48 gain 40 179 -95.32 gain 179 40 -91.21 gain 40 180 -97.53 gain 180 40 -102.86 gain 40 181 -97.90 gain 181 40 -97.26 gain 40 182 -99.64 gain 182 40 -100.08 gain 40 183 -99.82 gain 183 40 -100.54 gain 40 184 -105.27 gain 184 40 -108.74 gain 40 185 -95.72 gain 185 40 -103.05 gain 40 186 -99.77 gain 186 40 -102.68 gain 40 187 -93.12 gain 187 40 -93.76 gain 40 188 -96.77 gain 188 40 -99.82 gain 40 189 -90.14 gain 189 40 -87.92 gain 40 190 -95.75 gain 190 40 -97.45 gain 40 191 -97.87 gain 191 40 -98.27 gain 40 192 -94.33 gain 192 40 -93.43 gain 40 193 -90.22 gain 193 40 -88.30 gain 40 194 -91.90 gain 194 40 -90.77 gain 40 195 -98.03 gain 195 40 -95.44 gain 40 196 -105.32 gain 196 40 -107.04 gain 40 197 -91.55 gain 197 40 -88.41 gain 40 198 -103.92 gain 198 40 -105.29 gain 40 199 -95.86 gain 199 40 -97.33 gain 40 200 -97.46 gain 200 40 -100.27 gain 40 201 -93.67 gain 201 40 -96.39 gain 40 202 -94.11 gain 202 40 -95.97 gain 40 203 -100.10 gain 203 40 -101.07 gain 40 204 -94.19 gain 204 40 -91.81 gain 40 205 -99.15 gain 205 40 -100.50 gain 40 206 -99.08 gain 206 40 -101.55 gain 40 207 -94.65 gain 207 40 -96.53 gain 40 208 -99.65 gain 208 40 -104.13 gain 40 209 -105.97 gain 209 40 -110.02 gain 40 210 -92.71 gain 210 40 -96.94 gain 40 211 -103.70 gain 211 40 -103.16 gain 40 212 -97.24 gain 212 40 -99.71 gain 40 213 -99.33 gain 213 40 -101.13 gain 40 214 -102.29 gain 214 40 -109.48 gain 40 215 -99.47 gain 215 40 -102.06 gain 40 216 -96.78 gain 216 40 -103.28 gain 40 217 -97.49 gain 217 40 -104.25 gain 40 218 -101.11 gain 218 40 -100.68 gain 40 219 -104.64 gain 219 40 -104.69 gain 40 220 -105.08 gain 220 40 -101.22 gain 40 221 -93.84 gain 221 40 -95.66 gain 40 222 -99.75 gain 222 40 -97.37 gain 40 223 -103.83 gain 223 40 -104.69 gain 40 224 -104.87 gain 224 40 -106.20 gain 41 42 -69.60 gain 42 41 -76.84 gain 41 43 -62.66 gain 43 41 -67.50 gain 41 44 -69.94 gain 44 41 -78.37 gain 41 45 -94.07 gain 45 41 -102.49 gain 41 46 -97.71 gain 46 41 -102.59 gain 41 47 -91.00 gain 47 41 -93.58 gain 41 48 -81.82 gain 48 41 -83.98 gain 41 49 -90.34 gain 49 41 -96.55 gain 41 50 -84.92 gain 50 41 -88.00 gain 41 51 -78.76 gain 51 41 -85.53 gain 41 52 -74.57 gain 52 41 -78.58 gain 41 53 -73.39 gain 53 41 -77.95 gain 41 54 -69.72 gain 54 41 -73.69 gain 41 55 -65.62 gain 55 41 -66.51 gain 41 56 -63.27 gain 56 41 -69.20 gain 41 57 -64.75 gain 57 41 -69.77 gain 41 58 -72.61 gain 58 41 -74.32 gain 41 59 -73.59 gain 59 41 -74.55 gain 41 60 -89.20 gain 60 41 -99.44 gain 41 61 -83.25 gain 61 41 -85.40 gain 41 62 -91.67 gain 62 41 -91.33 gain 41 63 -89.23 gain 63 41 -92.85 gain 41 64 -88.36 gain 64 41 -96.21 gain 41 65 -85.71 gain 65 41 -89.11 gain 41 66 -83.81 gain 66 41 -86.19 gain 41 67 -82.41 gain 67 41 -86.02 gain 41 68 -81.05 gain 68 41 -87.25 gain 41 69 -77.47 gain 69 41 -80.89 gain 41 70 -62.21 gain 70 41 -64.09 gain 41 71 -68.59 gain 71 41 -74.04 gain 41 72 -67.16 gain 72 41 -70.16 gain 41 73 -74.43 gain 73 41 -78.81 gain 41 74 -80.68 gain 74 41 -81.17 gain 41 75 -95.23 gain 75 41 -101.61 gain 41 76 -91.24 gain 76 41 -97.74 gain 41 77 -90.52 gain 77 41 -93.02 gain 41 78 -90.44 gain 78 41 -97.45 gain 41 79 -86.75 gain 79 41 -93.37 gain 41 80 -79.63 gain 80 41 -84.04 gain 41 81 -84.36 gain 81 41 -89.69 gain 41 82 -76.55 gain 82 41 -82.85 gain 41 83 -74.61 gain 83 41 -78.18 gain 41 84 -75.70 gain 84 41 -76.46 gain 41 85 -75.24 gain 85 41 -81.42 gain 41 86 -70.32 gain 86 41 -78.15 gain 41 87 -73.76 gain 87 41 -78.88 gain 41 88 -80.01 gain 88 41 -84.76 gain 41 89 -79.64 gain 89 41 -86.53 gain 41 90 -86.79 gain 90 41 -93.03 gain 41 91 -83.12 gain 91 41 -90.43 gain 41 92 -92.47 gain 92 41 -100.69 gain 41 93 -87.65 gain 93 41 -93.23 gain 41 94 -87.88 gain 94 41 -92.03 gain 41 95 -83.29 gain 95 41 -86.69 gain 41 96 -83.53 gain 96 41 -93.89 gain 41 97 -85.12 gain 97 41 -88.31 gain 41 98 -84.59 gain 98 41 -88.25 gain 41 99 -75.95 gain 99 41 -78.74 gain 41 100 -80.18 gain 100 41 -82.89 gain 41 101 -84.41 gain 101 41 -90.75 gain 41 102 -73.06 gain 102 41 -79.37 gain 41 103 -77.31 gain 103 41 -84.78 gain 41 104 -79.52 gain 104 41 -89.48 gain 41 105 -94.75 gain 105 41 -99.23 gain 41 106 -86.57 gain 106 41 -88.38 gain 41 107 -80.87 gain 107 41 -82.58 gain 41 108 -91.98 gain 108 41 -93.32 gain 41 109 -90.94 gain 109 41 -95.73 gain 41 110 -89.74 gain 110 41 -100.88 gain 41 111 -84.86 gain 111 41 -85.98 gain 41 112 -86.08 gain 112 41 -90.65 gain 41 113 -82.52 gain 113 41 -86.22 gain 41 114 -72.49 gain 114 41 -73.36 gain 41 115 -78.76 gain 115 41 -80.28 gain 41 116 -74.58 gain 116 41 -78.54 gain 41 117 -81.26 gain 117 41 -82.36 gain 41 118 -81.66 gain 118 41 -84.38 gain 41 119 -87.58 gain 119 41 -95.37 gain 41 120 -92.59 gain 120 41 -97.76 gain 41 121 -93.11 gain 121 41 -99.30 gain 41 122 -90.16 gain 122 41 -96.10 gain 41 123 -82.21 gain 123 41 -88.49 gain 41 124 -87.92 gain 124 41 -92.19 gain 41 125 -84.25 gain 125 41 -91.85 gain 41 126 -90.24 gain 126 41 -94.49 gain 41 127 -82.18 gain 127 41 -86.06 gain 41 128 -80.79 gain 128 41 -87.26 gain 41 129 -88.01 gain 129 41 -91.69 gain 41 130 -80.38 gain 130 41 -85.35 gain 41 131 -88.54 gain 131 41 -93.29 gain 41 132 -77.86 gain 132 41 -78.62 gain 41 133 -86.01 gain 133 41 -91.95 gain 41 134 -86.85 gain 134 41 -89.65 gain 41 135 -86.16 gain 135 41 -91.26 gain 41 136 -86.67 gain 136 41 -92.22 gain 41 137 -96.50 gain 137 41 -104.96 gain 41 138 -92.72 gain 138 41 -94.71 gain 41 139 -93.04 gain 139 41 -98.29 gain 41 140 -95.78 gain 140 41 -101.86 gain 41 141 -85.30 gain 141 41 -83.35 gain 41 142 -92.10 gain 142 41 -96.89 gain 41 143 -84.95 gain 143 41 -92.48 gain 41 144 -83.57 gain 144 41 -89.46 gain 41 145 -84.93 gain 145 41 -94.21 gain 41 146 -88.24 gain 146 41 -93.52 gain 41 147 -79.41 gain 147 41 -81.79 gain 41 148 -88.46 gain 148 41 -89.17 gain 41 149 -86.22 gain 149 41 -90.59 gain 41 150 -97.18 gain 150 41 -102.38 gain 41 151 -89.13 gain 151 41 -93.27 gain 41 152 -94.76 gain 152 41 -98.72 gain 41 153 -88.41 gain 153 41 -91.58 gain 41 154 -90.93 gain 154 41 -96.01 gain 41 155 -84.14 gain 155 41 -87.79 gain 41 156 -96.92 gain 156 41 -99.80 gain 41 157 -90.58 gain 157 41 -95.95 gain 41 158 -88.10 gain 158 41 -92.96 gain 41 159 -90.07 gain 159 41 -97.31 gain 41 160 -89.66 gain 160 41 -94.06 gain 41 161 -85.63 gain 161 41 -92.47 gain 41 162 -85.96 gain 162 41 -92.51 gain 41 163 -88.55 gain 163 41 -97.01 gain 41 164 -90.99 gain 164 41 -98.82 gain 41 165 -97.03 gain 165 41 -101.92 gain 41 166 -100.05 gain 166 41 -104.70 gain 41 167 -93.32 gain 167 41 -98.68 gain 41 168 -97.92 gain 168 41 -102.18 gain 41 169 -92.58 gain 169 41 -97.95 gain 41 170 -92.31 gain 170 41 -96.92 gain 41 171 -93.75 gain 171 41 -99.43 gain 41 172 -93.29 gain 172 41 -97.17 gain 41 173 -88.44 gain 173 41 -96.97 gain 41 174 -87.31 gain 174 41 -91.88 gain 41 175 -93.09 gain 175 41 -98.80 gain 41 176 -83.84 gain 176 41 -88.51 gain 41 177 -83.19 gain 177 41 -90.87 gain 41 178 -87.25 gain 178 41 -88.37 gain 41 179 -82.17 gain 179 41 -82.71 gain 41 180 -95.07 gain 180 41 -105.06 gain 41 181 -98.10 gain 181 41 -102.12 gain 41 182 -94.52 gain 182 41 -99.61 gain 41 183 -95.97 gain 183 41 -101.34 gain 41 184 -90.40 gain 184 41 -98.52 gain 41 185 -87.61 gain 185 41 -99.60 gain 41 186 -84.76 gain 186 41 -92.33 gain 41 187 -89.00 gain 187 41 -94.30 gain 41 188 -96.84 gain 188 41 -104.55 gain 41 189 -85.24 gain 189 41 -87.68 gain 41 190 -91.27 gain 190 41 -97.62 gain 41 191 -87.41 gain 191 41 -92.46 gain 41 192 -89.88 gain 192 41 -93.64 gain 41 193 -92.41 gain 193 41 -95.14 gain 41 194 -81.60 gain 194 41 -85.12 gain 41 195 -103.56 gain 195 41 -105.62 gain 41 196 -103.85 gain 196 41 -110.23 gain 41 197 -98.17 gain 197 41 -99.69 gain 41 198 -89.94 gain 198 41 -95.96 gain 41 199 -89.35 gain 199 41 -95.49 gain 41 200 -93.52 gain 200 41 -100.99 gain 41 201 -94.20 gain 201 41 -101.58 gain 41 202 -91.82 gain 202 41 -98.34 gain 41 203 -90.79 gain 203 41 -96.41 gain 41 204 -85.28 gain 204 41 -87.55 gain 41 205 -90.02 gain 205 41 -96.03 gain 41 206 -94.95 gain 206 41 -102.07 gain 41 207 -91.95 gain 207 41 -98.48 gain 41 208 -98.63 gain 208 41 -107.77 gain 41 209 -89.92 gain 209 41 -98.63 gain 41 210 -97.18 gain 210 41 -106.06 gain 41 211 -101.08 gain 211 41 -105.19 gain 41 212 -92.52 gain 212 41 -99.65 gain 41 213 -96.42 gain 213 41 -102.87 gain 41 214 -85.10 gain 214 41 -96.94 gain 41 215 -91.80 gain 215 41 -99.04 gain 41 216 -94.92 gain 216 41 -106.08 gain 41 217 -92.06 gain 217 41 -103.47 gain 41 218 -97.58 gain 218 41 -101.80 gain 41 219 -89.37 gain 219 41 -94.08 gain 41 220 -87.53 gain 220 41 -88.32 gain 41 221 -84.88 gain 221 41 -91.35 gain 41 222 -89.37 gain 222 41 -91.64 gain 41 223 -92.89 gain 223 41 -98.41 gain 41 224 -89.04 gain 224 41 -95.02 gain 42 43 -64.27 gain 43 42 -61.86 gain 42 44 -77.25 gain 44 42 -78.44 gain 42 45 -97.94 gain 45 42 -99.11 gain 42 46 -94.98 gain 46 42 -92.61 gain 42 47 -95.26 gain 47 42 -90.60 gain 42 48 -95.91 gain 48 42 -90.82 gain 42 49 -91.27 gain 49 42 -90.24 gain 42 50 -93.44 gain 50 42 -89.27 gain 42 51 -95.01 gain 51 42 -94.53 gain 42 52 -89.70 gain 52 42 -86.46 gain 42 53 -78.87 gain 53 42 -76.19 gain 42 54 -77.38 gain 54 42 -74.10 gain 42 55 -73.21 gain 55 42 -66.85 gain 42 56 -70.85 gain 56 42 -69.54 gain 42 57 -66.69 gain 57 42 -64.46 gain 42 58 -72.51 gain 58 42 -66.97 gain 42 59 -77.59 gain 59 42 -71.31 gain 42 60 -99.88 gain 60 42 -102.87 gain 42 61 -104.85 gain 61 42 -99.75 gain 42 62 -101.46 gain 62 42 -93.87 gain 42 63 -97.91 gain 63 42 -94.29 gain 42 64 -96.37 gain 64 42 -96.97 gain 42 65 -85.44 gain 65 42 -81.59 gain 42 66 -85.17 gain 66 42 -80.31 gain 42 67 -87.10 gain 67 42 -83.46 gain 42 68 -82.59 gain 68 42 -81.54 gain 42 69 -90.59 gain 69 42 -86.76 gain 42 70 -76.98 gain 70 42 -71.61 gain 42 71 -77.92 gain 71 42 -76.12 gain 42 72 -77.53 gain 72 42 -73.29 gain 42 73 -76.62 gain 73 42 -73.75 gain 42 74 -82.43 gain 74 42 -75.67 gain 42 75 -90.87 gain 75 42 -90.00 gain 42 76 -106.13 gain 76 42 -105.39 gain 42 77 -89.37 gain 77 42 -84.62 gain 42 78 -97.22 gain 78 42 -96.97 gain 42 79 -92.24 gain 79 42 -91.62 gain 42 80 -89.83 gain 80 42 -87.00 gain 42 81 -95.25 gain 81 42 -93.33 gain 42 82 -88.08 gain 82 42 -87.13 gain 42 83 -88.52 gain 83 42 -84.84 gain 42 84 -81.40 gain 84 42 -74.91 gain 42 85 -89.53 gain 85 42 -88.47 gain 42 86 -78.05 gain 86 42 -78.63 gain 42 87 -75.93 gain 87 42 -73.80 gain 42 88 -82.60 gain 88 42 -80.11 gain 42 89 -83.94 gain 89 42 -83.59 gain 42 90 -102.76 gain 90 42 -101.75 gain 42 91 -101.51 gain 91 42 -101.57 gain 42 92 -99.40 gain 92 42 -100.38 gain 42 93 -98.05 gain 93 42 -96.39 gain 42 94 -98.44 gain 94 42 -95.34 gain 42 95 -94.43 gain 95 42 -90.58 gain 42 96 -96.43 gain 96 42 -99.55 gain 42 97 -92.25 gain 97 42 -88.19 gain 42 98 -91.15 gain 98 42 -87.56 gain 42 99 -86.26 gain 99 42 -81.80 gain 42 100 -84.01 gain 100 42 -79.47 gain 42 101 -83.52 gain 101 42 -82.62 gain 42 102 -86.14 gain 102 42 -85.19 gain 42 103 -84.69 gain 103 42 -84.91 gain 42 104 -91.28 gain 104 42 -93.99 gain 42 105 -95.15 gain 105 42 -92.38 gain 42 106 -105.67 gain 106 42 -100.24 gain 42 107 -90.63 gain 107 42 -85.10 gain 42 108 -101.89 gain 108 42 -95.98 gain 42 109 -98.98 gain 109 42 -96.52 gain 42 110 -97.51 gain 110 42 -101.41 gain 42 111 -92.85 gain 111 42 -86.71 gain 42 112 -94.80 gain 112 42 -92.13 gain 42 113 -90.67 gain 113 42 -87.13 gain 42 114 -92.00 gain 114 42 -85.62 gain 42 115 -84.36 gain 115 42 -78.64 gain 42 116 -93.72 gain 116 42 -90.44 gain 42 117 -85.38 gain 117 42 -79.23 gain 42 118 -87.43 gain 118 42 -82.90 gain 42 119 -94.44 gain 119 42 -94.98 gain 42 120 -100.05 gain 120 42 -97.97 gain 42 121 -97.86 gain 121 42 -96.81 gain 42 122 -92.03 gain 122 42 -90.72 gain 42 123 -91.86 gain 123 42 -90.89 gain 42 124 -99.72 gain 124 42 -96.74 gain 42 125 -93.59 gain 125 42 -93.95 gain 42 126 -89.51 gain 126 42 -86.51 gain 42 127 -96.45 gain 127 42 -93.08 gain 42 128 -85.67 gain 128 42 -84.89 gain 42 129 -89.23 gain 129 42 -85.66 gain 42 130 -90.99 gain 130 42 -88.72 gain 42 131 -91.42 gain 131 42 -88.93 gain 42 132 -94.11 gain 132 42 -87.62 gain 42 133 -88.24 gain 133 42 -86.93 gain 42 134 -91.25 gain 134 42 -86.80 gain 42 135 -103.54 gain 135 42 -101.40 gain 42 136 -105.23 gain 136 42 -103.52 gain 42 137 -98.82 gain 137 42 -100.03 gain 42 138 -94.78 gain 138 42 -89.52 gain 42 139 -98.09 gain 139 42 -96.09 gain 42 140 -93.43 gain 140 42 -92.26 gain 42 141 -96.01 gain 141 42 -86.81 gain 42 142 -92.56 gain 142 42 -90.10 gain 42 143 -93.31 gain 143 42 -93.59 gain 42 144 -89.75 gain 144 42 -88.40 gain 42 145 -91.72 gain 145 42 -93.76 gain 42 146 -92.84 gain 146 42 -90.87 gain 42 147 -96.17 gain 147 42 -91.31 gain 42 148 -92.84 gain 148 42 -86.31 gain 42 149 -97.80 gain 149 42 -94.92 gain 42 150 -98.96 gain 150 42 -96.92 gain 42 151 -103.99 gain 151 42 -100.88 gain 42 152 -92.09 gain 152 42 -88.80 gain 42 153 -94.53 gain 153 42 -90.46 gain 42 154 -93.07 gain 154 42 -90.90 gain 42 155 -99.24 gain 155 42 -95.65 gain 42 156 -94.94 gain 156 42 -90.57 gain 42 157 -99.11 gain 157 42 -97.23 gain 42 158 -104.72 gain 158 42 -102.34 gain 42 159 -96.21 gain 159 42 -96.21 gain 42 160 -96.27 gain 160 42 -93.42 gain 42 161 -96.79 gain 161 42 -96.38 gain 42 162 -92.12 gain 162 42 -91.42 gain 42 163 -95.92 gain 163 42 -97.14 gain 42 164 -97.68 gain 164 42 -98.26 gain 42 165 -101.08 gain 165 42 -98.72 gain 42 166 -93.01 gain 166 42 -90.40 gain 42 167 -102.74 gain 167 42 -100.86 gain 42 168 -98.77 gain 168 42 -95.78 gain 42 169 -105.33 gain 169 42 -103.45 gain 42 170 -98.89 gain 170 42 -96.26 gain 42 171 -107.11 gain 171 42 -105.56 gain 42 172 -100.76 gain 172 42 -97.39 gain 42 173 -99.77 gain 173 42 -101.05 gain 42 174 -90.57 gain 174 42 -87.89 gain 42 175 -98.28 gain 175 42 -96.74 gain 42 176 -96.31 gain 176 42 -93.74 gain 42 177 -90.60 gain 177 42 -91.03 gain 42 178 -98.38 gain 178 42 -92.26 gain 42 179 -100.38 gain 179 42 -93.67 gain 42 180 -103.61 gain 180 42 -106.36 gain 42 181 -104.18 gain 181 42 -100.94 gain 42 182 -100.56 gain 182 42 -98.41 gain 42 183 -105.16 gain 183 42 -103.28 gain 42 184 -104.37 gain 184 42 -105.25 gain 42 185 -100.78 gain 185 42 -105.52 gain 42 186 -97.83 gain 186 42 -98.15 gain 42 187 -98.57 gain 187 42 -96.62 gain 42 188 -104.58 gain 188 42 -105.04 gain 42 189 -91.16 gain 189 42 -86.34 gain 42 190 -98.46 gain 190 42 -97.56 gain 42 191 -90.68 gain 191 42 -88.49 gain 42 192 -100.39 gain 192 42 -96.89 gain 42 193 -108.75 gain 193 42 -104.24 gain 42 194 -102.00 gain 194 42 -98.27 gain 42 195 -102.20 gain 195 42 -97.01 gain 42 196 -104.30 gain 196 42 -103.43 gain 42 197 -102.43 gain 197 42 -96.69 gain 42 198 -97.06 gain 198 42 -95.84 gain 42 199 -103.56 gain 199 42 -102.45 gain 42 200 -106.70 gain 200 42 -106.92 gain 42 201 -102.35 gain 201 42 -102.47 gain 42 202 -90.83 gain 202 42 -90.09 gain 42 203 -98.39 gain 203 42 -96.76 gain 42 204 -106.39 gain 204 42 -101.41 gain 42 205 -93.35 gain 205 42 -92.11 gain 42 206 -96.90 gain 206 42 -96.77 gain 42 207 -97.58 gain 207 42 -96.86 gain 42 208 -100.76 gain 208 42 -102.65 gain 42 209 -98.45 gain 209 42 -99.91 gain 42 210 -105.90 gain 210 42 -107.54 gain 42 211 -102.43 gain 211 42 -99.30 gain 42 212 -103.61 gain 212 42 -103.49 gain 42 213 -104.43 gain 213 42 -103.64 gain 42 214 -100.63 gain 214 42 -105.22 gain 42 215 -92.83 gain 215 42 -92.83 gain 42 216 -97.64 gain 216 42 -101.55 gain 42 217 -102.15 gain 217 42 -106.32 gain 42 218 -91.31 gain 218 42 -88.28 gain 42 219 -101.78 gain 219 42 -99.24 gain 42 220 -103.57 gain 220 42 -97.11 gain 42 221 -101.02 gain 221 42 -100.24 gain 42 222 -96.39 gain 222 42 -91.42 gain 42 223 -98.13 gain 223 42 -96.40 gain 42 224 -99.64 gain 224 42 -98.38 gain 43 44 -58.94 gain 44 43 -62.54 gain 43 45 -101.63 gain 45 43 -105.20 gain 43 46 -97.11 gain 46 43 -97.15 gain 43 47 -89.76 gain 47 43 -87.50 gain 43 48 -86.90 gain 48 43 -84.22 gain 43 49 -90.05 gain 49 43 -91.43 gain 43 50 -93.76 gain 50 43 -92.00 gain 43 51 -89.54 gain 51 43 -91.47 gain 43 52 -90.79 gain 52 43 -89.96 gain 43 53 -83.99 gain 53 43 -83.71 gain 43 54 -90.05 gain 54 43 -89.18 gain 43 55 -78.18 gain 55 43 -74.23 gain 43 56 -73.33 gain 56 43 -74.42 gain 43 57 -66.03 gain 57 43 -66.20 gain 43 58 -62.23 gain 58 43 -59.10 gain 43 59 -70.00 gain 59 43 -66.12 gain 43 60 -101.80 gain 60 43 -107.20 gain 43 61 -101.61 gain 61 43 -98.92 gain 43 62 -98.94 gain 62 43 -93.76 gain 43 63 -97.36 gain 63 43 -96.14 gain 43 64 -86.80 gain 64 43 -89.81 gain 43 65 -88.71 gain 65 43 -87.27 gain 43 66 -89.54 gain 66 43 -87.08 gain 43 67 -85.40 gain 67 43 -84.17 gain 43 68 -89.98 gain 68 43 -91.34 gain 43 69 -80.07 gain 69 43 -78.64 gain 43 70 -84.16 gain 70 43 -81.20 gain 43 71 -84.21 gain 71 43 -84.82 gain 43 72 -70.15 gain 72 43 -68.31 gain 43 73 -79.23 gain 73 43 -78.77 gain 43 74 -78.67 gain 74 43 -74.32 gain 43 75 -100.91 gain 75 43 -102.45 gain 43 76 -95.95 gain 76 43 -97.61 gain 43 77 -93.51 gain 77 43 -91.17 gain 43 78 -92.76 gain 78 43 -94.92 gain 43 79 -103.13 gain 79 43 -104.92 gain 43 80 -89.50 gain 80 43 -89.07 gain 43 81 -88.90 gain 81 43 -89.38 gain 43 82 -85.93 gain 82 43 -87.39 gain 43 83 -79.50 gain 83 43 -78.23 gain 43 84 -85.39 gain 84 43 -81.31 gain 43 85 -88.82 gain 85 43 -90.17 gain 43 86 -78.64 gain 86 43 -81.62 gain 43 87 -86.76 gain 87 43 -87.03 gain 43 88 -76.96 gain 88 43 -76.88 gain 43 89 -78.26 gain 89 43 -80.32 gain 43 90 -94.68 gain 90 43 -96.08 gain 43 91 -96.25 gain 91 43 -98.72 gain 43 92 -97.69 gain 92 43 -101.07 gain 43 93 -92.42 gain 93 43 -93.17 gain 43 94 -91.05 gain 94 43 -90.36 gain 43 95 -95.26 gain 95 43 -93.81 gain 43 96 -93.67 gain 96 43 -99.19 gain 43 97 -95.15 gain 97 43 -93.49 gain 43 98 -89.18 gain 98 43 -87.99 gain 43 99 -85.71 gain 99 43 -83.66 gain 43 100 -88.38 gain 100 43 -86.25 gain 43 101 -91.97 gain 101 43 -93.47 gain 43 102 -85.35 gain 102 43 -86.81 gain 43 103 -85.42 gain 103 43 -88.06 gain 43 104 -81.61 gain 104 43 -86.73 gain 43 105 -97.57 gain 105 43 -97.21 gain 43 106 -92.24 gain 106 43 -89.20 gain 43 107 -97.41 gain 107 43 -94.28 gain 43 108 -104.29 gain 108 43 -100.79 gain 43 109 -88.91 gain 109 43 -88.85 gain 43 110 -97.63 gain 110 43 -103.94 gain 43 111 -91.86 gain 111 43 -88.14 gain 43 112 -93.70 gain 112 43 -93.44 gain 43 113 -90.40 gain 113 43 -89.26 gain 43 114 -87.90 gain 114 43 -83.93 gain 43 115 -88.22 gain 115 43 -84.91 gain 43 116 -90.56 gain 116 43 -89.67 gain 43 117 -90.16 gain 117 43 -86.42 gain 43 118 -82.40 gain 118 43 -80.29 gain 43 119 -82.61 gain 119 43 -85.55 gain 43 120 -102.93 gain 120 43 -103.25 gain 43 121 -95.83 gain 121 43 -97.18 gain 43 122 -91.54 gain 122 43 -92.64 gain 43 123 -95.47 gain 123 43 -96.91 gain 43 124 -95.82 gain 124 43 -95.25 gain 43 125 -99.18 gain 125 43 -101.95 gain 43 126 -87.38 gain 126 43 -86.79 gain 43 127 -93.41 gain 127 43 -92.45 gain 43 128 -86.06 gain 128 43 -87.70 gain 43 129 -102.30 gain 129 43 -101.15 gain 43 130 -90.76 gain 130 43 -90.89 gain 43 131 -94.31 gain 131 43 -94.22 gain 43 132 -89.72 gain 132 43 -85.64 gain 43 133 -91.29 gain 133 43 -92.38 gain 43 134 -88.39 gain 134 43 -86.35 gain 43 135 -104.90 gain 135 43 -105.16 gain 43 136 -98.10 gain 136 43 -98.80 gain 43 137 -95.38 gain 137 43 -99.00 gain 43 138 -95.71 gain 138 43 -92.85 gain 43 139 -95.99 gain 139 43 -96.40 gain 43 140 -87.30 gain 140 43 -88.54 gain 43 141 -92.30 gain 141 43 -85.51 gain 43 142 -94.77 gain 142 43 -94.72 gain 43 143 -89.26 gain 143 43 -91.95 gain 43 144 -86.19 gain 144 43 -87.24 gain 43 145 -94.08 gain 145 43 -98.52 gain 43 146 -102.50 gain 146 43 -102.93 gain 43 147 -84.08 gain 147 43 -81.62 gain 43 148 -89.74 gain 148 43 -85.61 gain 43 149 -91.48 gain 149 43 -91.01 gain 43 150 -103.38 gain 150 43 -103.74 gain 43 151 -104.42 gain 151 43 -103.73 gain 43 152 -101.57 gain 152 43 -100.69 gain 43 153 -97.97 gain 153 43 -96.31 gain 43 154 -98.83 gain 154 43 -99.07 gain 43 155 -95.27 gain 155 43 -94.08 gain 43 156 -89.35 gain 156 43 -87.39 gain 43 157 -94.30 gain 157 43 -94.82 gain 43 158 -96.55 gain 158 43 -96.57 gain 43 159 -93.59 gain 159 43 -96.00 gain 43 160 -97.43 gain 160 43 -96.99 gain 43 161 -93.92 gain 161 43 -95.92 gain 43 162 -86.82 gain 162 43 -88.53 gain 43 163 -91.86 gain 163 43 -95.48 gain 43 164 -94.48 gain 164 43 -97.47 gain 43 165 -102.06 gain 165 43 -102.11 gain 43 166 -98.44 gain 166 43 -98.24 gain 43 167 -107.17 gain 167 43 -107.69 gain 43 168 -95.76 gain 168 43 -95.18 gain 43 169 -99.82 gain 169 43 -100.36 gain 43 170 -98.00 gain 170 43 -97.77 gain 43 171 -99.83 gain 171 43 -100.68 gain 43 172 -94.98 gain 172 43 -94.02 gain 43 173 -98.22 gain 173 43 -101.91 gain 43 174 -98.66 gain 174 43 -98.39 gain 43 175 -95.40 gain 175 43 -96.27 gain 43 176 -94.88 gain 176 43 -94.71 gain 43 177 -92.79 gain 177 43 -95.63 gain 43 178 -86.44 gain 178 43 -82.72 gain 43 179 -95.97 gain 179 43 -91.68 gain 43 180 -103.78 gain 180 43 -108.93 gain 43 181 -103.74 gain 181 43 -102.91 gain 43 182 -98.81 gain 182 43 -99.06 gain 43 183 -99.30 gain 183 43 -99.83 gain 43 184 -102.78 gain 184 43 -106.06 gain 43 185 -90.40 gain 185 43 -97.55 gain 43 186 -101.80 gain 186 43 -104.52 gain 43 187 -98.10 gain 187 43 -98.56 gain 43 188 -98.56 gain 188 43 -101.43 gain 43 189 -95.65 gain 189 43 -93.24 gain 43 190 -95.60 gain 190 43 -97.11 gain 43 191 -90.97 gain 191 43 -91.19 gain 43 192 -97.33 gain 192 43 -96.24 gain 43 193 -96.43 gain 193 43 -94.32 gain 43 194 -96.77 gain 194 43 -95.44 gain 43 195 -104.96 gain 195 43 -102.18 gain 43 196 -102.08 gain 196 43 -103.62 gain 43 197 -101.00 gain 197 43 -97.67 gain 43 198 -103.04 gain 198 43 -104.22 gain 43 199 -103.12 gain 199 43 -104.41 gain 43 200 -107.94 gain 200 43 -110.57 gain 43 201 -93.15 gain 201 43 -95.68 gain 43 202 -100.56 gain 202 43 -102.23 gain 43 203 -96.55 gain 203 43 -97.33 gain 43 204 -90.73 gain 204 43 -88.16 gain 43 205 -99.46 gain 205 43 -100.63 gain 43 206 -96.79 gain 206 43 -99.07 gain 43 207 -94.14 gain 207 43 -95.83 gain 43 208 -97.02 gain 208 43 -101.32 gain 43 209 -96.99 gain 209 43 -100.86 gain 43 210 -110.87 gain 210 43 -114.92 gain 43 211 -100.56 gain 211 43 -99.83 gain 43 212 -101.23 gain 212 43 -103.52 gain 43 213 -103.92 gain 213 43 -105.53 gain 43 214 -98.43 gain 214 43 -105.43 gain 43 215 -106.01 gain 215 43 -108.41 gain 43 216 -104.57 gain 216 43 -110.88 gain 43 217 -100.52 gain 217 43 -107.10 gain 43 218 -98.52 gain 218 43 -97.90 gain 43 219 -92.95 gain 219 43 -92.81 gain 43 220 -97.73 gain 220 43 -93.68 gain 43 221 -93.89 gain 221 43 -95.52 gain 43 222 -94.61 gain 222 43 -92.04 gain 43 223 -97.08 gain 223 43 -97.76 gain 43 224 -98.63 gain 224 43 -99.77 gain 44 45 -109.29 gain 45 44 -109.28 gain 44 46 -98.19 gain 46 44 -94.63 gain 44 47 -103.88 gain 47 44 -98.03 gain 44 48 -100.70 gain 48 44 -94.43 gain 44 49 -94.58 gain 49 44 -92.36 gain 44 50 -102.17 gain 50 44 -96.82 gain 44 51 -92.79 gain 51 44 -91.13 gain 44 52 -87.10 gain 52 44 -82.68 gain 44 53 -93.07 gain 53 44 -89.20 gain 44 54 -96.55 gain 54 44 -92.09 gain 44 55 -86.59 gain 55 44 -79.04 gain 44 56 -83.51 gain 56 44 -81.02 gain 44 57 -79.11 gain 57 44 -75.69 gain 44 58 -83.35 gain 58 44 -76.63 gain 44 59 -72.30 gain 59 44 -64.83 gain 44 60 -101.71 gain 60 44 -103.52 gain 44 61 -104.13 gain 61 44 -97.85 gain 44 62 -103.02 gain 62 44 -94.25 gain 44 63 -104.51 gain 63 44 -99.70 gain 44 64 -96.09 gain 64 44 -95.50 gain 44 65 -93.93 gain 65 44 -88.89 gain 44 66 -92.76 gain 66 44 -86.70 gain 44 67 -101.16 gain 67 44 -96.34 gain 44 68 -91.90 gain 68 44 -89.67 gain 44 69 -92.22 gain 69 44 -87.20 gain 44 70 -80.66 gain 70 44 -74.10 gain 44 71 -85.02 gain 71 44 -82.03 gain 44 72 -76.10 gain 72 44 -70.68 gain 44 73 -83.75 gain 73 44 -79.70 gain 44 74 -80.03 gain 74 44 -72.09 gain 44 75 -101.17 gain 75 44 -99.11 gain 44 76 -100.87 gain 76 44 -98.94 gain 44 77 -96.41 gain 77 44 -90.48 gain 44 78 -89.98 gain 78 44 -88.55 gain 44 79 -102.58 gain 79 44 -100.77 gain 44 80 -96.93 gain 80 44 -92.91 gain 44 81 -101.18 gain 81 44 -98.06 gain 44 82 -90.36 gain 82 44 -88.23 gain 44 83 -96.68 gain 83 44 -91.82 gain 44 84 -89.31 gain 84 44 -81.63 gain 44 85 -90.43 gain 85 44 -88.18 gain 44 86 -94.65 gain 86 44 -94.04 gain 44 87 -79.68 gain 87 44 -76.36 gain 44 88 -83.80 gain 88 44 -80.12 gain 44 89 -77.57 gain 89 44 -76.03 gain 44 90 -101.18 gain 90 44 -98.98 gain 44 91 -99.61 gain 91 44 -98.48 gain 44 92 -97.80 gain 92 44 -97.59 gain 44 93 -99.65 gain 93 44 -96.80 gain 44 94 -99.15 gain 94 44 -94.87 gain 44 95 -97.31 gain 95 44 -92.27 gain 44 96 -97.07 gain 96 44 -99.00 gain 44 97 -94.92 gain 97 44 -89.67 gain 44 98 -94.67 gain 98 44 -89.89 gain 44 99 -96.84 gain 99 44 -91.19 gain 44 100 -92.82 gain 100 44 -87.10 gain 44 101 -92.66 gain 101 44 -90.56 gain 44 102 -84.90 gain 102 44 -82.77 gain 44 103 -89.44 gain 103 44 -88.48 gain 44 104 -82.25 gain 104 44 -83.78 gain 44 105 -101.25 gain 105 44 -97.30 gain 44 106 -97.39 gain 106 44 -90.77 gain 44 107 -108.46 gain 107 44 -101.74 gain 44 108 -101.22 gain 108 44 -94.12 gain 44 109 -96.86 gain 109 44 -93.21 gain 44 110 -97.76 gain 110 44 -100.47 gain 44 111 -98.51 gain 111 44 -91.19 gain 44 112 -95.45 gain 112 44 -91.59 gain 44 113 -95.95 gain 113 44 -91.22 gain 44 114 -99.14 gain 114 44 -91.58 gain 44 115 -94.29 gain 115 44 -87.39 gain 44 116 -90.74 gain 116 44 -86.27 gain 44 117 -85.45 gain 117 44 -78.12 gain 44 118 -88.59 gain 118 44 -82.88 gain 44 119 -87.10 gain 119 44 -86.45 gain 44 120 -101.98 gain 120 44 -98.71 gain 44 121 -107.68 gain 121 44 -105.44 gain 44 122 -97.55 gain 122 44 -95.05 gain 44 123 -101.23 gain 123 44 -99.08 gain 44 124 -101.09 gain 124 44 -96.93 gain 44 125 -99.26 gain 125 44 -98.44 gain 44 126 -99.51 gain 126 44 -95.33 gain 44 127 -99.11 gain 127 44 -94.55 gain 44 128 -99.59 gain 128 44 -97.64 gain 44 129 -99.54 gain 129 44 -94.79 gain 44 130 -87.71 gain 130 44 -84.25 gain 44 131 -88.05 gain 131 44 -84.36 gain 44 132 -93.71 gain 132 44 -86.03 gain 44 133 -88.20 gain 133 44 -85.70 gain 44 134 -89.89 gain 134 44 -84.26 gain 44 135 -109.26 gain 135 44 -105.92 gain 44 136 -96.49 gain 136 44 -93.60 gain 44 137 -105.93 gain 137 44 -105.95 gain 44 138 -94.04 gain 138 44 -87.59 gain 44 139 -102.90 gain 139 44 -99.72 gain 44 140 -95.92 gain 140 44 -93.56 gain 44 141 -96.27 gain 141 44 -85.89 gain 44 142 -93.85 gain 142 44 -90.21 gain 44 143 -99.21 gain 143 44 -98.31 gain 44 144 -92.61 gain 144 44 -90.07 gain 44 145 -95.16 gain 145 44 -96.01 gain 44 146 -93.67 gain 146 44 -90.51 gain 44 147 -90.06 gain 147 44 -84.01 gain 44 148 -89.27 gain 148 44 -81.55 gain 44 149 -95.53 gain 149 44 -91.46 gain 44 150 -101.56 gain 150 44 -98.33 gain 44 151 -103.94 gain 151 44 -99.65 gain 44 152 -106.80 gain 152 44 -102.32 gain 44 153 -93.49 gain 153 44 -88.23 gain 44 154 -100.25 gain 154 44 -96.89 gain 44 155 -96.48 gain 155 44 -91.70 gain 44 156 -97.19 gain 156 44 -91.63 gain 44 157 -101.33 gain 157 44 -98.26 gain 44 158 -95.90 gain 158 44 -92.33 gain 44 159 -99.06 gain 159 44 -97.87 gain 44 160 -94.08 gain 160 44 -90.04 gain 44 161 -93.53 gain 161 44 -91.93 gain 44 162 -94.08 gain 162 44 -92.20 gain 44 163 -89.11 gain 163 44 -89.14 gain 44 164 -90.46 gain 164 44 -89.85 gain 44 165 -101.47 gain 165 44 -97.92 gain 44 166 -100.21 gain 166 44 -96.42 gain 44 167 -101.72 gain 167 44 -98.65 gain 44 168 -103.58 gain 168 44 -99.40 gain 44 169 -104.67 gain 169 44 -101.62 gain 44 170 -101.09 gain 170 44 -97.27 gain 44 171 -102.48 gain 171 44 -99.74 gain 44 172 -101.54 gain 172 44 -96.98 gain 44 173 -101.41 gain 173 44 -101.50 gain 44 174 -98.55 gain 174 44 -94.69 gain 44 175 -101.96 gain 175 44 -99.23 gain 44 176 -97.65 gain 176 44 -93.89 gain 44 177 -95.62 gain 177 44 -94.86 gain 44 178 -91.90 gain 178 44 -84.58 gain 44 179 -101.55 gain 179 44 -93.66 gain 44 180 -110.36 gain 180 44 -111.92 gain 44 181 -105.39 gain 181 44 -100.97 gain 44 182 -105.03 gain 182 44 -101.69 gain 44 183 -101.40 gain 183 44 -98.34 gain 44 184 -100.39 gain 184 44 -100.08 gain 44 185 -93.48 gain 185 44 -97.03 gain 44 186 -102.32 gain 186 44 -101.46 gain 44 187 -99.59 gain 187 44 -96.45 gain 44 188 -100.58 gain 188 44 -99.86 gain 44 189 -100.42 gain 189 44 -94.41 gain 44 190 -101.47 gain 190 44 -99.38 gain 44 191 -90.89 gain 191 44 -87.51 gain 44 192 -107.11 gain 192 44 -102.43 gain 44 193 -102.00 gain 193 44 -96.30 gain 44 194 -101.50 gain 194 44 -96.58 gain 44 195 -107.30 gain 195 44 -100.93 gain 44 196 -107.24 gain 196 44 -105.19 gain 44 197 -106.98 gain 197 44 -100.05 gain 44 198 -112.43 gain 198 44 -110.02 gain 44 199 -102.17 gain 199 44 -99.86 gain 44 200 -100.29 gain 200 44 -99.32 gain 44 201 -105.82 gain 201 44 -104.76 gain 44 202 -96.35 gain 202 44 -94.43 gain 44 203 -94.35 gain 203 44 -91.54 gain 44 204 -105.72 gain 204 44 -99.56 gain 44 205 -96.47 gain 205 44 -94.05 gain 44 206 -92.02 gain 206 44 -90.70 gain 44 207 -91.52 gain 207 44 -89.62 gain 44 208 -96.72 gain 208 44 -97.42 gain 44 209 -103.29 gain 209 44 -103.56 gain 44 210 -107.32 gain 210 44 -107.77 gain 44 211 -107.72 gain 211 44 -103.40 gain 44 212 -107.94 gain 212 44 -106.64 gain 44 213 -99.08 gain 213 44 -97.10 gain 44 214 -105.19 gain 214 44 -108.60 gain 44 215 -105.83 gain 215 44 -104.64 gain 44 216 -97.02 gain 216 44 -99.74 gain 44 217 -103.99 gain 217 44 -106.97 gain 44 218 -104.53 gain 218 44 -100.32 gain 44 219 -102.77 gain 219 44 -99.04 gain 44 220 -106.27 gain 220 44 -98.62 gain 44 221 -96.60 gain 221 44 -94.64 gain 44 222 -99.87 gain 222 44 -93.71 gain 44 223 -99.93 gain 223 44 -97.01 gain 44 224 -107.47 gain 224 44 -105.02 gain 45 46 -66.94 gain 46 45 -63.40 gain 45 47 -68.78 gain 47 45 -62.94 gain 45 48 -81.44 gain 48 45 -75.19 gain 45 49 -86.75 gain 49 45 -84.56 gain 45 50 -92.13 gain 50 45 -86.80 gain 45 51 -91.54 gain 51 45 -89.90 gain 45 52 -98.70 gain 52 45 -94.29 gain 45 53 -95.20 gain 53 45 -91.35 gain 45 54 -97.42 gain 54 45 -92.97 gain 45 55 -92.63 gain 55 45 -85.10 gain 45 56 -105.76 gain 56 45 -103.28 gain 45 57 -100.51 gain 57 45 -97.11 gain 45 58 -97.41 gain 58 45 -90.71 gain 45 59 -104.93 gain 59 45 -97.48 gain 45 60 -67.82 gain 60 45 -69.64 gain 45 61 -71.66 gain 61 45 -65.39 gain 45 62 -77.06 gain 62 45 -68.30 gain 45 63 -86.21 gain 63 45 -81.42 gain 45 64 -83.73 gain 64 45 -83.16 gain 45 65 -85.93 gain 65 45 -80.91 gain 45 66 -96.48 gain 66 45 -90.45 gain 45 67 -90.43 gain 67 45 -85.63 gain 45 68 -98.45 gain 68 45 -96.23 gain 45 69 -97.02 gain 69 45 -92.01 gain 45 70 -96.02 gain 70 45 -89.48 gain 45 71 -98.15 gain 71 45 -95.18 gain 45 72 -100.33 gain 72 45 -94.92 gain 45 73 -98.98 gain 73 45 -94.94 gain 45 74 -92.20 gain 74 45 -84.28 gain 45 75 -68.61 gain 75 45 -66.57 gain 45 76 -80.00 gain 76 45 -78.09 gain 45 77 -83.04 gain 77 45 -77.12 gain 45 78 -81.38 gain 78 45 -79.96 gain 45 79 -92.91 gain 79 45 -91.12 gain 45 80 -88.12 gain 80 45 -84.12 gain 45 81 -93.63 gain 81 45 -90.53 gain 45 82 -91.66 gain 82 45 -89.54 gain 45 83 -96.82 gain 83 45 -91.98 gain 45 84 -99.85 gain 84 45 -92.20 gain 45 85 -105.98 gain 85 45 -103.75 gain 45 86 -96.48 gain 86 45 -95.89 gain 45 87 -100.19 gain 87 45 -96.89 gain 45 88 -94.04 gain 88 45 -90.38 gain 45 89 -98.34 gain 89 45 -96.82 gain 45 90 -77.60 gain 90 45 -75.42 gain 45 91 -83.95 gain 91 45 -82.84 gain 45 92 -80.26 gain 92 45 -80.07 gain 45 93 -86.83 gain 93 45 -84.00 gain 45 94 -91.21 gain 94 45 -86.95 gain 45 95 -95.23 gain 95 45 -90.20 gain 45 96 -96.03 gain 96 45 -97.98 gain 45 97 -92.56 gain 97 45 -87.33 gain 45 98 -94.86 gain 98 45 -90.10 gain 45 99 -95.63 gain 99 45 -90.00 gain 45 100 -98.85 gain 100 45 -93.14 gain 45 101 -99.35 gain 101 45 -97.27 gain 45 102 -104.89 gain 102 45 -102.78 gain 45 103 -103.66 gain 103 45 -102.72 gain 45 104 -103.40 gain 104 45 -104.94 gain 45 105 -89.69 gain 105 45 -85.75 gain 45 106 -87.09 gain 106 45 -80.49 gain 45 107 -83.41 gain 107 45 -76.71 gain 45 108 -87.21 gain 108 45 -80.13 gain 45 109 -93.02 gain 109 45 -89.38 gain 45 110 -87.89 gain 110 45 -90.62 gain 45 111 -91.64 gain 111 45 -84.33 gain 45 112 -96.54 gain 112 45 -92.70 gain 45 113 -93.29 gain 113 45 -88.58 gain 45 114 -96.58 gain 114 45 -89.04 gain 45 115 -92.24 gain 115 45 -85.35 gain 45 116 -103.23 gain 116 45 -98.78 gain 45 117 -100.88 gain 117 45 -93.57 gain 45 118 -104.20 gain 118 45 -98.50 gain 45 119 -96.23 gain 119 45 -95.60 gain 45 120 -86.62 gain 120 45 -83.36 gain 45 121 -86.23 gain 121 45 -84.00 gain 45 122 -89.89 gain 122 45 -87.41 gain 45 123 -94.65 gain 123 45 -92.52 gain 45 124 -87.16 gain 124 45 -83.01 gain 45 125 -88.41 gain 125 45 -87.60 gain 45 126 -96.71 gain 126 45 -92.55 gain 45 127 -90.48 gain 127 45 -85.94 gain 45 128 -105.21 gain 128 45 -103.27 gain 45 129 -92.26 gain 129 45 -87.53 gain 45 130 -101.52 gain 130 45 -98.08 gain 45 131 -99.44 gain 131 45 -95.77 gain 45 132 -106.20 gain 132 45 -98.55 gain 45 133 -107.51 gain 133 45 -105.03 gain 45 134 -109.69 gain 134 45 -104.07 gain 45 135 -93.25 gain 135 45 -89.94 gain 45 136 -82.28 gain 136 45 -79.40 gain 45 137 -91.16 gain 137 45 -91.20 gain 45 138 -91.72 gain 138 45 -85.29 gain 45 139 -100.01 gain 139 45 -96.84 gain 45 140 -100.56 gain 140 45 -98.23 gain 45 141 -99.80 gain 141 45 -89.43 gain 45 142 -98.37 gain 142 45 -94.74 gain 45 143 -95.62 gain 143 45 -94.73 gain 45 144 -93.73 gain 144 45 -91.21 gain 45 145 -105.16 gain 145 45 -106.03 gain 45 146 -101.95 gain 146 45 -98.81 gain 45 147 -101.56 gain 147 45 -95.52 gain 45 148 -103.24 gain 148 45 -95.53 gain 45 149 -101.40 gain 149 45 -97.35 gain 45 150 -96.98 gain 150 45 -93.76 gain 45 151 -97.39 gain 151 45 -93.12 gain 45 152 -94.86 gain 152 45 -90.40 gain 45 153 -96.24 gain 153 45 -91.00 gain 45 154 -93.91 gain 154 45 -90.57 gain 45 155 -98.65 gain 155 45 -93.88 gain 45 156 -104.28 gain 156 45 -98.74 gain 45 157 -99.74 gain 157 45 -96.69 gain 45 158 -98.89 gain 158 45 -95.34 gain 45 159 -102.23 gain 159 45 -101.06 gain 45 160 -99.92 gain 160 45 -95.90 gain 45 161 -102.92 gain 161 45 -101.34 gain 45 162 -109.45 gain 162 45 -107.58 gain 45 163 -106.49 gain 163 45 -106.54 gain 45 164 -103.56 gain 164 45 -102.98 gain 45 165 -96.58 gain 165 45 -93.05 gain 45 166 -92.63 gain 166 45 -88.85 gain 45 167 -106.13 gain 167 45 -103.08 gain 45 168 -103.68 gain 168 45 -99.53 gain 45 169 -99.69 gain 169 45 -96.64 gain 45 170 -97.98 gain 170 45 -94.17 gain 45 171 -96.82 gain 171 45 -94.09 gain 45 172 -102.72 gain 172 45 -98.18 gain 45 173 -101.65 gain 173 45 -101.76 gain 45 174 -100.84 gain 174 45 -96.99 gain 45 175 -100.25 gain 175 45 -97.54 gain 45 176 -102.72 gain 176 45 -98.98 gain 45 177 -100.60 gain 177 45 -99.86 gain 45 178 -101.94 gain 178 45 -94.64 gain 45 179 -108.43 gain 179 45 -100.55 gain 45 180 -101.29 gain 180 45 -102.86 gain 45 181 -100.41 gain 181 45 -96.01 gain 45 182 -105.36 gain 182 45 -102.04 gain 45 183 -102.47 gain 183 45 -99.42 gain 45 184 -98.08 gain 184 45 -97.78 gain 45 185 -96.32 gain 185 45 -99.89 gain 45 186 -101.49 gain 186 45 -100.64 gain 45 187 -99.29 gain 187 45 -96.17 gain 45 188 -97.98 gain 188 45 -97.27 gain 45 189 -108.07 gain 189 45 -102.09 gain 45 190 -103.39 gain 190 45 -101.32 gain 45 191 -98.72 gain 191 45 -95.36 gain 45 192 -96.91 gain 192 45 -92.24 gain 45 193 -106.20 gain 193 45 -100.52 gain 45 194 -105.69 gain 194 45 -100.79 gain 45 195 -96.30 gain 195 45 -89.95 gain 45 196 -97.79 gain 196 45 -95.75 gain 45 197 -95.73 gain 197 45 -88.82 gain 45 198 -104.52 gain 198 45 -102.13 gain 45 199 -97.91 gain 199 45 -95.62 gain 45 200 -105.46 gain 200 45 -104.52 gain 45 201 -98.20 gain 201 45 -97.16 gain 45 202 -103.23 gain 202 45 -101.32 gain 45 203 -105.93 gain 203 45 -103.14 gain 45 204 -107.82 gain 204 45 -101.67 gain 45 205 -98.18 gain 205 45 -95.77 gain 45 206 -100.51 gain 206 45 -99.21 gain 45 207 -110.24 gain 207 45 -108.36 gain 45 208 -100.64 gain 208 45 -101.36 gain 45 209 -109.97 gain 209 45 -110.27 gain 45 210 -99.07 gain 210 45 -99.53 gain 45 211 -94.63 gain 211 45 -90.33 gain 45 212 -106.80 gain 212 45 -105.51 gain 45 213 -108.53 gain 213 45 -106.57 gain 45 214 -95.70 gain 214 45 -99.13 gain 45 215 -103.39 gain 215 45 -102.21 gain 45 216 -102.06 gain 216 45 -104.80 gain 45 217 -100.37 gain 217 45 -103.36 gain 45 218 -105.28 gain 218 45 -101.09 gain 45 219 -102.29 gain 219 45 -98.58 gain 45 220 -102.12 gain 220 45 -94.49 gain 45 221 -104.42 gain 221 45 -102.47 gain 45 222 -102.84 gain 222 45 -96.70 gain 45 223 -105.65 gain 223 45 -102.75 gain 45 224 -112.44 gain 224 45 -110.00 gain 46 47 -63.29 gain 47 46 -60.98 gain 46 48 -75.27 gain 48 46 -72.55 gain 46 49 -78.03 gain 49 46 -79.36 gain 46 50 -88.45 gain 50 46 -86.65 gain 46 51 -78.29 gain 51 46 -80.18 gain 46 52 -87.42 gain 52 46 -86.54 gain 46 53 -91.79 gain 53 46 -91.47 gain 46 54 -95.28 gain 54 46 -94.37 gain 46 55 -91.55 gain 55 46 -87.55 gain 46 56 -86.87 gain 56 46 -87.93 gain 46 57 -100.73 gain 57 46 -100.86 gain 46 58 -92.85 gain 58 46 -89.68 gain 46 59 -98.59 gain 59 46 -94.67 gain 46 60 -72.65 gain 60 46 -78.01 gain 46 61 -68.60 gain 61 46 -65.87 gain 46 62 -67.99 gain 62 46 -62.76 gain 46 63 -74.83 gain 63 46 -73.58 gain 46 64 -83.25 gain 64 46 -86.22 gain 46 65 -81.53 gain 65 46 -80.04 gain 46 66 -82.19 gain 66 46 -79.69 gain 46 67 -89.91 gain 67 46 -88.64 gain 46 68 -91.44 gain 68 46 -92.75 gain 46 69 -90.98 gain 69 46 -89.51 gain 46 70 -94.54 gain 70 46 -91.54 gain 46 71 -91.92 gain 71 46 -92.49 gain 46 72 -103.20 gain 72 46 -101.32 gain 46 73 -96.06 gain 73 46 -95.55 gain 46 74 -103.50 gain 74 46 -99.11 gain 46 75 -75.89 gain 75 46 -77.39 gain 46 76 -72.34 gain 76 46 -73.96 gain 46 77 -72.62 gain 77 46 -70.24 gain 46 78 -76.39 gain 78 46 -78.51 gain 46 79 -87.14 gain 79 46 -88.88 gain 46 80 -83.97 gain 80 46 -83.50 gain 46 81 -88.30 gain 81 46 -88.74 gain 46 82 -96.64 gain 82 46 -98.06 gain 46 83 -91.15 gain 83 46 -89.84 gain 46 84 -88.43 gain 84 46 -84.31 gain 46 85 -97.87 gain 85 46 -99.18 gain 46 86 -96.14 gain 86 46 -99.08 gain 46 87 -96.87 gain 87 46 -97.10 gain 46 88 -104.72 gain 88 46 -104.60 gain 46 89 -102.90 gain 89 46 -104.92 gain 46 90 -79.31 gain 90 46 -80.67 gain 46 91 -72.85 gain 91 46 -75.28 gain 46 92 -77.57 gain 92 46 -80.91 gain 46 93 -81.36 gain 93 46 -82.06 gain 46 94 -84.04 gain 94 46 -83.32 gain 46 95 -84.69 gain 95 46 -83.20 gain 46 96 -84.87 gain 96 46 -90.35 gain 46 97 -87.96 gain 97 46 -86.26 gain 46 98 -94.63 gain 98 46 -93.41 gain 46 99 -92.03 gain 99 46 -89.94 gain 46 100 -95.58 gain 100 46 -93.41 gain 46 101 -102.20 gain 101 46 -103.66 gain 46 102 -92.30 gain 102 46 -93.73 gain 46 103 -97.68 gain 103 46 -100.27 gain 46 104 -97.82 gain 104 46 -102.90 gain 46 105 -77.78 gain 105 46 -77.37 gain 46 106 -87.26 gain 106 46 -84.19 gain 46 107 -83.39 gain 107 46 -80.22 gain 46 108 -81.35 gain 108 46 -77.80 gain 46 109 -86.02 gain 109 46 -85.93 gain 46 110 -89.35 gain 110 46 -95.61 gain 46 111 -84.17 gain 111 46 -80.40 gain 46 112 -94.32 gain 112 46 -94.02 gain 46 113 -86.97 gain 113 46 -85.80 gain 46 114 -88.94 gain 114 46 -84.93 gain 46 115 -91.49 gain 115 46 -88.14 gain 46 116 -97.52 gain 116 46 -96.60 gain 46 117 -89.71 gain 117 46 -85.93 gain 46 118 -95.81 gain 118 46 -93.65 gain 46 119 -95.56 gain 119 46 -98.46 gain 46 120 -84.96 gain 120 46 -85.24 gain 46 121 -83.93 gain 121 46 -85.24 gain 46 122 -84.06 gain 122 46 -85.12 gain 46 123 -87.55 gain 123 46 -88.95 gain 46 124 -84.89 gain 124 46 -84.27 gain 46 125 -89.64 gain 125 46 -92.36 gain 46 126 -86.31 gain 126 46 -85.68 gain 46 127 -93.71 gain 127 46 -92.71 gain 46 128 -90.84 gain 128 46 -92.44 gain 46 129 -97.17 gain 129 46 -95.97 gain 46 130 -95.09 gain 130 46 -95.18 gain 46 131 -102.22 gain 131 46 -102.09 gain 46 132 -96.24 gain 132 46 -92.12 gain 46 133 -108.38 gain 133 46 -109.43 gain 46 134 -96.09 gain 134 46 -94.00 gain 46 135 -90.71 gain 135 46 -90.93 gain 46 136 -86.10 gain 136 46 -86.76 gain 46 137 -88.88 gain 137 46 -92.46 gain 46 138 -89.52 gain 138 46 -86.63 gain 46 139 -86.43 gain 139 46 -86.80 gain 46 140 -90.76 gain 140 46 -91.95 gain 46 141 -92.79 gain 141 46 -85.96 gain 46 142 -92.61 gain 142 46 -92.52 gain 46 143 -92.14 gain 143 46 -94.79 gain 46 144 -97.73 gain 144 46 -98.74 gain 46 145 -92.49 gain 145 46 -96.89 gain 46 146 -97.01 gain 146 46 -97.40 gain 46 147 -98.23 gain 147 46 -95.73 gain 46 148 -102.02 gain 148 46 -97.85 gain 46 149 -100.68 gain 149 46 -100.17 gain 46 150 -88.83 gain 150 46 -89.15 gain 46 151 -90.00 gain 151 46 -89.26 gain 46 152 -93.69 gain 152 46 -92.77 gain 46 153 -95.11 gain 153 46 -93.40 gain 46 154 -89.32 gain 154 46 -89.51 gain 46 155 -98.03 gain 155 46 -96.80 gain 46 156 -101.63 gain 156 46 -99.63 gain 46 157 -92.39 gain 157 46 -92.87 gain 46 158 -101.84 gain 158 46 -101.82 gain 46 159 -91.85 gain 159 46 -94.21 gain 46 160 -93.44 gain 160 46 -92.96 gain 46 161 -91.53 gain 161 46 -93.49 gain 46 162 -99.03 gain 162 46 -100.69 gain 46 163 -98.92 gain 163 46 -102.50 gain 46 164 -102.53 gain 164 46 -105.48 gain 46 165 -91.31 gain 165 46 -91.32 gain 46 166 -90.64 gain 166 46 -90.40 gain 46 167 -83.22 gain 167 46 -83.70 gain 46 168 -88.51 gain 168 46 -87.88 gain 46 169 -91.92 gain 169 46 -92.41 gain 46 170 -90.77 gain 170 46 -90.50 gain 46 171 -92.75 gain 171 46 -93.56 gain 46 172 -96.85 gain 172 46 -95.85 gain 46 173 -98.46 gain 173 46 -102.10 gain 46 174 -97.68 gain 174 46 -97.38 gain 46 175 -97.00 gain 175 46 -97.82 gain 46 176 -101.04 gain 176 46 -100.84 gain 46 177 -99.67 gain 177 46 -102.46 gain 46 178 -110.82 gain 178 46 -107.06 gain 46 179 -104.89 gain 179 46 -100.55 gain 46 180 -97.45 gain 180 46 -102.56 gain 46 181 -87.89 gain 181 46 -87.02 gain 46 182 -94.99 gain 182 46 -95.20 gain 46 183 -90.03 gain 183 46 -90.52 gain 46 184 -93.97 gain 184 46 -97.21 gain 46 185 -97.71 gain 185 46 -104.81 gain 46 186 -98.26 gain 186 46 -100.95 gain 46 187 -98.83 gain 187 46 -99.24 gain 46 188 -94.65 gain 188 46 -97.48 gain 46 189 -97.57 gain 189 46 -95.12 gain 46 190 -101.40 gain 190 46 -102.86 gain 46 191 -93.37 gain 191 46 -93.55 gain 46 192 -96.22 gain 192 46 -95.09 gain 46 193 -96.32 gain 193 46 -94.18 gain 46 194 -98.25 gain 194 46 -96.89 gain 46 195 -100.16 gain 195 46 -97.35 gain 46 196 -98.60 gain 196 46 -100.09 gain 46 197 -85.54 gain 197 46 -82.17 gain 46 198 -97.84 gain 198 46 -98.99 gain 46 199 -85.80 gain 199 46 -87.05 gain 46 200 -92.75 gain 200 46 -95.33 gain 46 201 -99.40 gain 201 46 -101.90 gain 46 202 -96.76 gain 202 46 -98.39 gain 46 203 -99.68 gain 203 46 -100.43 gain 46 204 -94.23 gain 204 46 -91.61 gain 46 205 -102.05 gain 205 46 -103.17 gain 46 206 -101.38 gain 206 46 -103.62 gain 46 207 -98.28 gain 207 46 -99.93 gain 46 208 -99.93 gain 208 46 -104.19 gain 46 209 -97.81 gain 209 46 -101.64 gain 46 210 -97.75 gain 210 46 -101.75 gain 46 211 -94.24 gain 211 46 -93.48 gain 46 212 -95.63 gain 212 46 -97.88 gain 46 213 -98.80 gain 213 46 -100.38 gain 46 214 -96.44 gain 214 46 -103.41 gain 46 215 -99.70 gain 215 46 -102.07 gain 46 216 -100.76 gain 216 46 -107.03 gain 46 217 -95.29 gain 217 46 -101.82 gain 46 218 -103.42 gain 218 46 -102.76 gain 46 219 -99.99 gain 219 46 -99.82 gain 46 220 -98.81 gain 220 46 -94.72 gain 46 221 -98.17 gain 221 46 -99.76 gain 46 222 -101.47 gain 222 46 -98.86 gain 46 223 -101.69 gain 223 46 -102.33 gain 46 224 -104.06 gain 224 46 -105.17 gain 47 48 -60.30 gain 48 47 -59.88 gain 47 49 -79.26 gain 49 47 -82.90 gain 47 50 -78.80 gain 50 47 -79.29 gain 47 51 -79.95 gain 51 47 -84.14 gain 47 52 -81.04 gain 52 47 -82.46 gain 47 53 -82.58 gain 53 47 -84.56 gain 47 54 -90.37 gain 54 47 -91.77 gain 47 55 -92.51 gain 55 47 -90.82 gain 47 56 -91.97 gain 56 47 -95.33 gain 47 57 -86.74 gain 57 47 -89.18 gain 47 58 -93.89 gain 58 47 -93.02 gain 47 59 -95.54 gain 59 47 -93.93 gain 47 60 -78.02 gain 60 47 -85.69 gain 47 61 -64.67 gain 61 47 -64.24 gain 47 62 -63.68 gain 62 47 -60.76 gain 47 63 -68.81 gain 63 47 -69.85 gain 47 64 -76.31 gain 64 47 -81.58 gain 47 65 -80.81 gain 65 47 -81.62 gain 47 66 -73.34 gain 66 47 -73.14 gain 47 67 -85.31 gain 67 47 -86.34 gain 47 68 -92.72 gain 68 47 -96.34 gain 47 69 -87.48 gain 69 47 -88.32 gain 47 70 -93.99 gain 70 47 -93.29 gain 47 71 -93.08 gain 71 47 -95.95 gain 47 72 -97.30 gain 72 47 -97.72 gain 47 73 -88.69 gain 73 47 -90.49 gain 47 74 -93.52 gain 74 47 -91.43 gain 47 75 -76.82 gain 75 47 -80.62 gain 47 76 -67.42 gain 76 47 -71.35 gain 47 77 -77.55 gain 77 47 -77.47 gain 47 78 -68.37 gain 78 47 -72.79 gain 47 79 -80.89 gain 79 47 -84.93 gain 47 80 -73.16 gain 80 47 -75.00 gain 47 81 -79.50 gain 81 47 -82.24 gain 47 82 -85.84 gain 82 47 -89.56 gain 47 83 -82.82 gain 83 47 -83.81 gain 47 84 -90.81 gain 84 47 -88.99 gain 47 85 -93.81 gain 85 47 -97.42 gain 47 86 -90.55 gain 86 47 -95.79 gain 47 87 -92.98 gain 87 47 -95.51 gain 47 88 -85.49 gain 88 47 -87.66 gain 47 89 -92.06 gain 89 47 -96.37 gain 47 90 -82.91 gain 90 47 -86.57 gain 47 91 -75.61 gain 91 47 -80.34 gain 47 92 -70.84 gain 92 47 -76.49 gain 47 93 -80.88 gain 93 47 -83.88 gain 47 94 -89.23 gain 94 47 -90.80 gain 47 95 -79.61 gain 95 47 -80.43 gain 47 96 -83.90 gain 96 47 -91.68 gain 47 97 -78.11 gain 97 47 -78.72 gain 47 98 -83.30 gain 98 47 -84.38 gain 47 99 -95.52 gain 99 47 -95.74 gain 47 100 -98.43 gain 100 47 -98.56 gain 47 101 -87.27 gain 101 47 -91.03 gain 47 102 -90.39 gain 102 47 -94.12 gain 47 103 -102.24 gain 103 47 -107.13 gain 47 104 -96.34 gain 104 47 -103.72 gain 47 105 -79.68 gain 105 47 -81.58 gain 47 106 -85.01 gain 106 47 -84.24 gain 47 107 -80.57 gain 107 47 -79.71 gain 47 108 -76.48 gain 108 47 -75.23 gain 47 109 -85.46 gain 109 47 -87.67 gain 47 110 -87.76 gain 110 47 -96.32 gain 47 111 -82.61 gain 111 47 -81.14 gain 47 112 -87.26 gain 112 47 -89.26 gain 47 113 -88.50 gain 113 47 -89.62 gain 47 114 -96.89 gain 114 47 -95.18 gain 47 115 -90.09 gain 115 47 -89.03 gain 47 116 -98.62 gain 116 47 -99.99 gain 47 117 -100.16 gain 117 47 -98.68 gain 47 118 -94.36 gain 118 47 -94.50 gain 47 119 -91.00 gain 119 47 -96.21 gain 47 120 -81.80 gain 120 47 -84.39 gain 47 121 -86.30 gain 121 47 -89.91 gain 47 122 -84.51 gain 122 47 -87.87 gain 47 123 -78.66 gain 123 47 -82.36 gain 47 124 -85.31 gain 124 47 -87.00 gain 47 125 -92.79 gain 125 47 -97.81 gain 47 126 -86.71 gain 126 47 -88.38 gain 47 127 -87.44 gain 127 47 -88.75 gain 47 128 -84.56 gain 128 47 -88.46 gain 47 129 -93.62 gain 129 47 -94.72 gain 47 130 -85.28 gain 130 47 -87.67 gain 47 131 -89.83 gain 131 47 -92.00 gain 47 132 -95.42 gain 132 47 -93.60 gain 47 133 -94.69 gain 133 47 -98.04 gain 47 134 -97.59 gain 134 47 -97.81 gain 47 135 -87.54 gain 135 47 -90.06 gain 47 136 -84.72 gain 136 47 -87.68 gain 47 137 -87.16 gain 137 47 -93.03 gain 47 138 -93.94 gain 138 47 -93.35 gain 47 139 -85.40 gain 139 47 -88.07 gain 47 140 -90.01 gain 140 47 -93.51 gain 47 141 -88.13 gain 141 47 -83.60 gain 47 142 -89.02 gain 142 47 -91.24 gain 47 143 -89.03 gain 143 47 -93.98 gain 47 144 -92.08 gain 144 47 -95.40 gain 47 145 -90.70 gain 145 47 -97.41 gain 47 146 -93.43 gain 146 47 -96.13 gain 47 147 -91.56 gain 147 47 -91.37 gain 47 148 -98.65 gain 148 47 -96.78 gain 47 149 -98.40 gain 149 47 -100.19 gain 47 150 -91.11 gain 150 47 -93.74 gain 47 151 -91.07 gain 151 47 -92.63 gain 47 152 -87.18 gain 152 47 -88.56 gain 47 153 -82.82 gain 153 47 -83.41 gain 47 154 -90.72 gain 154 47 -93.22 gain 47 155 -83.23 gain 155 47 -84.30 gain 47 156 -83.41 gain 156 47 -83.71 gain 47 157 -79.12 gain 157 47 -81.90 gain 47 158 -92.92 gain 158 47 -95.20 gain 47 159 -88.03 gain 159 47 -92.69 gain 47 160 -86.11 gain 160 47 -87.93 gain 47 161 -91.61 gain 161 47 -95.87 gain 47 162 -90.15 gain 162 47 -94.12 gain 47 163 -99.55 gain 163 47 -105.44 gain 47 164 -104.14 gain 164 47 -109.39 gain 47 165 -87.11 gain 165 47 -89.42 gain 47 166 -92.12 gain 166 47 -94.18 gain 47 167 -94.12 gain 167 47 -96.91 gain 47 168 -94.62 gain 168 47 -96.30 gain 47 169 -84.54 gain 169 47 -87.34 gain 47 170 -89.18 gain 170 47 -91.21 gain 47 171 -86.92 gain 171 47 -90.03 gain 47 172 -84.45 gain 172 47 -85.75 gain 47 173 -95.27 gain 173 47 -101.21 gain 47 174 -88.51 gain 174 47 -90.50 gain 47 175 -102.26 gain 175 47 -105.39 gain 47 176 -90.69 gain 176 47 -92.79 gain 47 177 -90.55 gain 177 47 -95.65 gain 47 178 -94.82 gain 178 47 -93.36 gain 47 179 -93.55 gain 179 47 -91.51 gain 47 180 -96.80 gain 180 47 -104.21 gain 47 181 -86.34 gain 181 47 -87.77 gain 47 182 -96.31 gain 182 47 -98.83 gain 47 183 -85.18 gain 183 47 -87.97 gain 47 184 -88.40 gain 184 47 -93.94 gain 47 185 -92.03 gain 185 47 -101.44 gain 47 186 -83.41 gain 186 47 -88.40 gain 47 187 -94.64 gain 187 47 -97.36 gain 47 188 -96.62 gain 188 47 -101.74 gain 47 189 -93.36 gain 189 47 -93.22 gain 47 190 -98.45 gain 190 47 -102.22 gain 47 191 -83.96 gain 191 47 -86.44 gain 47 192 -92.96 gain 192 47 -94.13 gain 47 193 -89.64 gain 193 47 -89.79 gain 47 194 -97.54 gain 194 47 -98.47 gain 47 195 -89.87 gain 195 47 -89.35 gain 47 196 -98.67 gain 196 47 -102.47 gain 47 197 -97.64 gain 197 47 -96.57 gain 47 198 -88.87 gain 198 47 -92.31 gain 47 199 -95.45 gain 199 47 -99.00 gain 47 200 -92.71 gain 200 47 -97.60 gain 47 201 -91.80 gain 201 47 -96.59 gain 47 202 -88.98 gain 202 47 -92.91 gain 47 203 -96.76 gain 203 47 -99.81 gain 47 204 -96.68 gain 204 47 -96.37 gain 47 205 -92.38 gain 205 47 -95.81 gain 47 206 -99.21 gain 206 47 -103.75 gain 47 207 -92.34 gain 207 47 -96.29 gain 47 208 -98.21 gain 208 47 -104.77 gain 47 209 -94.71 gain 209 47 -100.83 gain 47 210 -94.04 gain 210 47 -100.34 gain 47 211 -92.77 gain 211 47 -94.30 gain 47 212 -91.02 gain 212 47 -95.56 gain 47 213 -97.51 gain 213 47 -101.38 gain 47 214 -97.68 gain 214 47 -106.94 gain 47 215 -99.28 gain 215 47 -103.95 gain 47 216 -93.16 gain 216 47 -101.74 gain 47 217 -100.62 gain 217 47 -109.45 gain 47 218 -99.85 gain 218 47 -101.49 gain 47 219 -94.98 gain 219 47 -97.11 gain 47 220 -92.47 gain 220 47 -90.68 gain 47 221 -102.43 gain 221 47 -106.32 gain 47 222 -96.28 gain 222 47 -95.97 gain 47 223 -106.29 gain 223 47 -109.23 gain 47 224 -101.64 gain 224 47 -105.05 gain 48 49 -60.16 gain 49 48 -64.22 gain 48 50 -61.79 gain 50 48 -62.71 gain 48 51 -81.78 gain 51 48 -86.40 gain 48 52 -85.04 gain 52 48 -86.89 gain 48 53 -82.00 gain 53 48 -84.40 gain 48 54 -85.83 gain 54 48 -87.64 gain 48 55 -89.59 gain 55 48 -88.32 gain 48 56 -87.58 gain 56 48 -91.36 gain 48 57 -83.53 gain 57 48 -86.39 gain 48 58 -94.46 gain 58 48 -94.01 gain 48 59 -96.50 gain 59 48 -95.30 gain 48 60 -73.64 gain 60 48 -81.72 gain 48 61 -77.11 gain 61 48 -77.10 gain 48 62 -71.20 gain 62 48 -68.70 gain 48 63 -60.42 gain 63 48 -61.88 gain 48 64 -61.99 gain 64 48 -67.68 gain 48 65 -69.28 gain 65 48 -70.52 gain 48 66 -75.01 gain 66 48 -75.23 gain 48 67 -78.32 gain 67 48 -79.77 gain 48 68 -83.77 gain 68 48 -87.80 gain 48 69 -84.94 gain 69 48 -86.19 gain 48 70 -81.68 gain 70 48 -81.40 gain 48 71 -87.46 gain 71 48 -90.75 gain 48 72 -92.40 gain 72 48 -93.25 gain 48 73 -96.98 gain 73 48 -99.20 gain 48 74 -88.52 gain 74 48 -86.85 gain 48 75 -79.79 gain 75 48 -84.01 gain 48 76 -75.57 gain 76 48 -79.92 gain 48 77 -80.63 gain 77 48 -80.97 gain 48 78 -71.69 gain 78 48 -76.53 gain 48 79 -76.85 gain 79 48 -81.31 gain 48 80 -75.00 gain 80 48 -77.25 gain 48 81 -80.85 gain 81 48 -84.01 gain 48 82 -77.90 gain 82 48 -82.04 gain 48 83 -85.28 gain 83 48 -86.69 gain 48 84 -96.83 gain 84 48 -95.42 gain 48 85 -89.99 gain 85 48 -94.02 gain 48 86 -89.63 gain 86 48 -95.30 gain 48 87 -89.93 gain 87 48 -92.89 gain 48 88 -90.19 gain 88 48 -92.79 gain 48 89 -99.46 gain 89 48 -104.20 gain 48 90 -76.65 gain 90 48 -80.73 gain 48 91 -84.65 gain 91 48 -89.80 gain 48 92 -75.38 gain 92 48 -81.44 gain 48 93 -85.24 gain 93 48 -88.67 gain 48 94 -75.48 gain 94 48 -77.47 gain 48 95 -83.62 gain 95 48 -84.86 gain 48 96 -82.41 gain 96 48 -90.61 gain 48 97 -84.48 gain 97 48 -85.50 gain 48 98 -79.31 gain 98 48 -80.81 gain 48 99 -83.89 gain 99 48 -84.52 gain 48 100 -93.33 gain 100 48 -93.88 gain 48 101 -89.88 gain 101 48 -94.06 gain 48 102 -94.75 gain 102 48 -98.90 gain 48 103 -89.20 gain 103 48 -94.51 gain 48 104 -89.69 gain 104 48 -97.49 gain 48 105 -80.63 gain 105 48 -82.95 gain 48 106 -76.71 gain 106 48 -76.36 gain 48 107 -74.79 gain 107 48 -74.34 gain 48 108 -79.45 gain 108 48 -78.63 gain 48 109 -79.90 gain 109 48 -82.53 gain 48 110 -79.58 gain 110 48 -88.56 gain 48 111 -86.85 gain 111 48 -85.80 gain 48 112 -84.41 gain 112 48 -86.82 gain 48 113 -85.84 gain 113 48 -87.38 gain 48 114 -88.27 gain 114 48 -86.98 gain 48 115 -91.04 gain 115 48 -90.40 gain 48 116 -86.43 gain 116 48 -88.23 gain 48 117 -103.12 gain 117 48 -102.06 gain 48 118 -90.91 gain 118 48 -91.47 gain 48 119 -93.80 gain 119 48 -99.43 gain 48 120 -82.43 gain 120 48 -85.44 gain 48 121 -84.01 gain 121 48 -88.04 gain 48 122 -83.93 gain 122 48 -87.71 gain 48 123 -79.57 gain 123 48 -83.69 gain 48 124 -76.28 gain 124 48 -78.39 gain 48 125 -80.47 gain 125 48 -85.92 gain 48 126 -91.32 gain 126 48 -93.42 gain 48 127 -84.43 gain 127 48 -86.15 gain 48 128 -74.49 gain 128 48 -78.80 gain 48 129 -89.42 gain 129 48 -90.95 gain 48 130 -87.75 gain 130 48 -90.56 gain 48 131 -90.15 gain 131 48 -92.74 gain 48 132 -92.45 gain 132 48 -91.05 gain 48 133 -88.55 gain 133 48 -92.33 gain 48 134 -93.87 gain 134 48 -94.51 gain 48 135 -88.75 gain 135 48 -91.69 gain 48 136 -88.40 gain 136 48 -91.78 gain 48 137 -91.67 gain 137 48 -97.96 gain 48 138 -86.61 gain 138 48 -86.44 gain 48 139 -80.76 gain 139 48 -83.85 gain 48 140 -86.72 gain 140 48 -90.64 gain 48 141 -86.26 gain 141 48 -82.15 gain 48 142 -88.05 gain 142 48 -90.68 gain 48 143 -86.00 gain 143 48 -91.37 gain 48 144 -94.86 gain 144 48 -98.59 gain 48 145 -94.72 gain 145 48 -101.85 gain 48 146 -85.92 gain 146 48 -89.03 gain 48 147 -90.52 gain 147 48 -90.74 gain 48 148 -96.58 gain 148 48 -95.13 gain 48 149 -92.22 gain 149 48 -94.43 gain 48 150 -81.29 gain 150 48 -84.33 gain 48 151 -90.64 gain 151 48 -92.62 gain 48 152 -93.47 gain 152 48 -95.27 gain 48 153 -91.68 gain 153 48 -92.69 gain 48 154 -88.39 gain 154 48 -91.30 gain 48 155 -83.15 gain 155 48 -84.64 gain 48 156 -91.47 gain 156 48 -92.20 gain 48 157 -83.65 gain 157 48 -86.85 gain 48 158 -89.75 gain 158 48 -92.45 gain 48 159 -87.51 gain 159 48 -92.59 gain 48 160 -86.87 gain 160 48 -89.11 gain 48 161 -95.87 gain 161 48 -100.55 gain 48 162 -92.84 gain 162 48 -97.23 gain 48 163 -91.96 gain 163 48 -98.27 gain 48 164 -94.56 gain 164 48 -100.23 gain 48 165 -93.29 gain 165 48 -96.02 gain 48 166 -87.95 gain 166 48 -90.43 gain 48 167 -88.66 gain 167 48 -91.87 gain 48 168 -89.85 gain 168 48 -91.95 gain 48 169 -80.66 gain 169 48 -83.88 gain 48 170 -89.78 gain 170 48 -92.23 gain 48 171 -91.53 gain 171 48 -95.05 gain 48 172 -90.96 gain 172 48 -92.68 gain 48 173 -86.53 gain 173 48 -92.89 gain 48 174 -93.67 gain 174 48 -96.09 gain 48 175 -96.73 gain 175 48 -100.28 gain 48 176 -97.47 gain 176 48 -99.99 gain 48 177 -97.89 gain 177 48 -103.41 gain 48 178 -93.70 gain 178 48 -92.66 gain 48 179 -87.76 gain 179 48 -86.15 gain 48 180 -92.09 gain 180 48 -99.92 gain 48 181 -96.32 gain 181 48 -98.18 gain 48 182 -90.59 gain 182 48 -93.52 gain 48 183 -91.74 gain 183 48 -94.95 gain 48 184 -88.23 gain 184 48 -94.19 gain 48 185 -89.14 gain 185 48 -98.97 gain 48 186 -94.93 gain 186 48 -100.33 gain 48 187 -87.18 gain 187 48 -90.32 gain 48 188 -90.62 gain 188 48 -96.17 gain 48 189 -95.57 gain 189 48 -95.84 gain 48 190 -92.13 gain 190 48 -96.32 gain 48 191 -88.42 gain 191 48 -91.32 gain 48 192 -95.68 gain 192 48 -97.27 gain 48 193 -102.50 gain 193 48 -103.08 gain 48 194 -94.76 gain 194 48 -96.11 gain 48 195 -93.34 gain 195 48 -93.24 gain 48 196 -91.35 gain 196 48 -95.57 gain 48 197 -95.68 gain 197 48 -95.03 gain 48 198 -86.90 gain 198 48 -90.77 gain 48 199 -94.57 gain 199 48 -98.54 gain 48 200 -89.06 gain 200 48 -94.37 gain 48 201 -91.08 gain 201 48 -96.30 gain 48 202 -99.36 gain 202 48 -103.72 gain 48 203 -94.80 gain 203 48 -98.27 gain 48 204 -94.35 gain 204 48 -94.46 gain 48 205 -92.47 gain 205 48 -96.32 gain 48 206 -93.69 gain 206 48 -98.64 gain 48 207 -94.04 gain 207 48 -98.41 gain 48 208 -94.31 gain 208 48 -101.28 gain 48 209 -96.49 gain 209 48 -103.04 gain 48 210 -96.48 gain 210 48 -103.21 gain 48 211 -90.30 gain 211 48 -92.25 gain 48 212 -97.03 gain 212 48 -102.00 gain 48 213 -96.80 gain 213 48 -101.09 gain 48 214 -90.91 gain 214 48 -100.59 gain 48 215 -90.21 gain 215 48 -95.29 gain 48 216 -96.24 gain 216 48 -105.23 gain 48 217 -95.87 gain 217 48 -105.12 gain 48 218 -91.15 gain 218 48 -93.21 gain 48 219 -95.88 gain 219 48 -98.42 gain 48 220 -94.96 gain 220 48 -93.59 gain 48 221 -96.74 gain 221 48 -101.05 gain 48 222 -97.52 gain 222 48 -97.64 gain 48 223 -99.29 gain 223 48 -102.65 gain 48 224 -96.62 gain 224 48 -100.45 gain 49 50 -65.74 gain 50 49 -62.59 gain 49 51 -74.22 gain 51 49 -74.78 gain 49 52 -78.96 gain 52 49 -76.75 gain 49 53 -78.33 gain 53 49 -76.68 gain 49 54 -86.39 gain 54 49 -84.14 gain 49 55 -85.15 gain 55 49 -79.82 gain 49 56 -96.79 gain 56 49 -96.50 gain 49 57 -92.03 gain 57 49 -90.82 gain 49 58 -94.06 gain 58 49 -89.55 gain 49 59 -92.39 gain 59 49 -87.14 gain 49 60 -85.74 gain 60 49 -89.77 gain 49 61 -80.57 gain 61 49 -76.50 gain 49 62 -76.91 gain 62 49 -70.35 gain 49 63 -74.31 gain 63 49 -71.72 gain 49 64 -64.17 gain 64 49 -65.80 gain 49 65 -66.52 gain 65 49 -63.70 gain 49 66 -75.66 gain 66 49 -71.82 gain 49 67 -81.68 gain 67 49 -79.07 gain 49 68 -80.65 gain 68 49 -80.63 gain 49 69 -83.55 gain 69 49 -80.75 gain 49 70 -84.32 gain 70 49 -79.99 gain 49 71 -92.03 gain 71 49 -91.26 gain 49 72 -86.36 gain 72 49 -83.15 gain 49 73 -92.99 gain 73 49 -91.15 gain 49 74 -91.74 gain 74 49 -86.01 gain 49 75 -84.41 gain 75 49 -84.57 gain 49 76 -88.15 gain 76 49 -88.44 gain 49 77 -82.53 gain 77 49 -78.81 gain 49 78 -77.56 gain 78 49 -78.34 gain 49 79 -74.99 gain 79 49 -75.39 gain 49 80 -74.17 gain 80 49 -72.36 gain 49 81 -77.25 gain 81 49 -76.35 gain 49 82 -86.95 gain 82 49 -87.03 gain 49 83 -89.35 gain 83 49 -86.70 gain 49 84 -93.65 gain 84 49 -88.19 gain 49 85 -92.84 gain 85 49 -92.80 gain 49 86 -92.60 gain 86 49 -94.21 gain 49 87 -89.89 gain 87 49 -88.78 gain 49 88 -94.52 gain 88 49 -93.05 gain 49 89 -97.43 gain 89 49 -98.12 gain 49 90 -78.49 gain 90 49 -78.51 gain 49 91 -81.81 gain 91 49 -82.90 gain 49 92 -85.33 gain 92 49 -87.34 gain 49 93 -80.14 gain 93 49 -79.50 gain 49 94 -80.64 gain 94 49 -78.58 gain 49 95 -84.74 gain 95 49 -81.91 gain 49 96 -73.00 gain 96 49 -77.15 gain 49 97 -83.37 gain 97 49 -80.34 gain 49 98 -86.30 gain 98 49 -83.74 gain 49 99 -87.04 gain 99 49 -83.61 gain 49 100 -88.09 gain 100 49 -84.58 gain 49 101 -97.46 gain 101 49 -97.58 gain 49 102 -93.80 gain 102 49 -93.89 gain 49 103 -93.25 gain 103 49 -94.50 gain 49 104 -90.96 gain 104 49 -94.70 gain 49 105 -82.66 gain 105 49 -80.92 gain 49 106 -84.45 gain 106 49 -80.05 gain 49 107 -84.08 gain 107 49 -79.58 gain 49 108 -77.45 gain 108 49 -72.56 gain 49 109 -90.70 gain 109 49 -89.26 gain 49 110 -90.84 gain 110 49 -95.76 gain 49 111 -89.00 gain 111 49 -83.90 gain 49 112 -83.61 gain 112 49 -81.97 gain 49 113 -87.74 gain 113 49 -85.22 gain 49 114 -83.23 gain 114 49 -77.89 gain 49 115 -89.10 gain 115 49 -84.41 gain 49 116 -89.94 gain 116 49 -87.68 gain 49 117 -96.05 gain 117 49 -90.93 gain 49 118 -90.78 gain 118 49 -87.29 gain 49 119 -87.42 gain 119 49 -88.98 gain 49 120 -91.50 gain 120 49 -90.45 gain 49 121 -85.25 gain 121 49 -85.22 gain 49 122 -90.85 gain 122 49 -90.57 gain 49 123 -88.05 gain 123 49 -88.11 gain 49 124 -92.16 gain 124 49 -90.21 gain 49 125 -80.52 gain 125 49 -81.90 gain 49 126 -88.32 gain 126 49 -86.35 gain 49 127 -91.90 gain 127 49 -89.57 gain 49 128 -90.66 gain 128 49 -90.92 gain 49 129 -97.51 gain 129 49 -94.98 gain 49 130 -94.70 gain 130 49 -93.46 gain 49 131 -94.75 gain 131 49 -93.28 gain 49 132 -101.90 gain 132 49 -96.44 gain 49 133 -97.17 gain 133 49 -96.89 gain 49 134 -91.90 gain 134 49 -88.48 gain 49 135 -99.62 gain 135 49 -98.50 gain 49 136 -93.24 gain 136 49 -92.56 gain 49 137 -95.28 gain 137 49 -97.52 gain 49 138 -88.32 gain 138 49 -84.09 gain 49 139 -86.61 gain 139 49 -85.65 gain 49 140 -84.43 gain 140 49 -84.29 gain 49 141 -87.59 gain 141 49 -79.42 gain 49 142 -85.23 gain 142 49 -83.80 gain 49 143 -88.01 gain 143 49 -89.33 gain 49 144 -90.24 gain 144 49 -89.91 gain 49 145 -94.28 gain 145 49 -97.34 gain 49 146 -90.70 gain 146 49 -89.76 gain 49 147 -102.21 gain 147 49 -98.37 gain 49 148 -101.58 gain 148 49 -96.07 gain 49 149 -94.73 gain 149 49 -92.88 gain 49 150 -96.54 gain 150 49 -95.52 gain 49 151 -91.71 gain 151 49 -89.64 gain 49 152 -92.58 gain 152 49 -90.32 gain 49 153 -89.44 gain 153 49 -86.40 gain 49 154 -92.36 gain 154 49 -91.22 gain 49 155 -91.88 gain 155 49 -89.31 gain 49 156 -96.79 gain 156 49 -93.45 gain 49 157 -98.60 gain 157 49 -97.74 gain 49 158 -90.98 gain 158 49 -89.62 gain 49 159 -99.46 gain 159 49 -100.49 gain 49 160 -90.40 gain 160 49 -88.58 gain 49 161 -95.03 gain 161 49 -95.65 gain 49 162 -88.01 gain 162 49 -88.34 gain 49 163 -94.94 gain 163 49 -97.19 gain 49 164 -101.55 gain 164 49 -103.17 gain 49 165 -92.33 gain 165 49 -91.00 gain 49 166 -94.00 gain 166 49 -92.43 gain 49 167 -89.58 gain 167 49 -88.73 gain 49 168 -86.52 gain 168 49 -84.57 gain 49 169 -89.10 gain 169 49 -88.26 gain 49 170 -98.79 gain 170 49 -97.18 gain 49 171 -97.65 gain 171 49 -97.12 gain 49 172 -91.54 gain 172 49 -89.20 gain 49 173 -96.72 gain 173 49 -99.03 gain 49 174 -92.03 gain 174 49 -90.38 gain 49 175 -96.34 gain 175 49 -95.83 gain 49 176 -93.97 gain 176 49 -92.43 gain 49 177 -96.12 gain 177 49 -97.58 gain 49 178 -98.21 gain 178 49 -93.11 gain 49 179 -105.18 gain 179 49 -99.50 gain 49 180 -100.56 gain 180 49 -104.34 gain 49 181 -99.43 gain 181 49 -97.22 gain 49 182 -90.49 gain 182 49 -89.37 gain 49 183 -97.70 gain 183 49 -96.85 gain 49 184 -91.75 gain 184 49 -93.65 gain 49 185 -90.73 gain 185 49 -96.50 gain 49 186 -94.10 gain 186 49 -95.45 gain 49 187 -95.60 gain 187 49 -94.67 gain 49 188 -90.01 gain 188 49 -91.50 gain 49 189 -95.03 gain 189 49 -91.24 gain 49 190 -90.85 gain 190 49 -90.98 gain 49 191 -99.23 gain 191 49 -98.06 gain 49 192 -99.61 gain 192 49 -97.14 gain 49 193 -96.87 gain 193 49 -93.39 gain 49 194 -97.04 gain 194 49 -94.34 gain 49 195 -94.87 gain 195 49 -90.71 gain 49 196 -94.25 gain 196 49 -94.40 gain 49 197 -91.66 gain 197 49 -86.95 gain 49 198 -94.40 gain 198 49 -94.21 gain 49 199 -99.23 gain 199 49 -99.15 gain 49 200 -97.39 gain 200 49 -98.64 gain 49 201 -100.31 gain 201 49 -101.47 gain 49 202 -99.55 gain 202 49 -99.85 gain 49 203 -94.42 gain 203 49 -93.83 gain 49 204 -99.14 gain 204 49 -95.19 gain 49 205 -101.82 gain 205 49 -101.61 gain 49 206 -107.53 gain 206 49 -108.43 gain 49 207 -102.23 gain 207 49 -102.55 gain 49 208 -98.78 gain 208 49 -101.70 gain 49 209 -101.12 gain 209 49 -103.61 gain 49 210 -95.99 gain 210 49 -98.65 gain 49 211 -96.08 gain 211 49 -93.98 gain 49 212 -104.57 gain 212 49 -105.48 gain 49 213 -97.75 gain 213 49 -97.99 gain 49 214 -98.60 gain 214 49 -104.22 gain 49 215 -97.06 gain 215 49 -98.08 gain 49 216 -98.44 gain 216 49 -103.38 gain 49 217 -96.47 gain 217 49 -101.67 gain 49 218 -96.61 gain 218 49 -94.61 gain 49 219 -95.97 gain 219 49 -94.45 gain 49 220 -97.33 gain 220 49 -91.91 gain 49 221 -102.80 gain 221 49 -103.05 gain 49 222 -99.70 gain 222 49 -95.76 gain 49 223 -91.02 gain 223 49 -90.32 gain 49 224 -103.28 gain 224 49 -103.04 gain 50 51 -56.09 gain 51 50 -59.79 gain 50 52 -71.44 gain 52 50 -72.37 gain 50 53 -70.05 gain 53 50 -71.53 gain 50 54 -78.03 gain 54 50 -78.93 gain 50 55 -82.99 gain 55 50 -80.80 gain 50 56 -88.97 gain 56 50 -91.83 gain 50 57 -83.95 gain 57 50 -85.89 gain 50 58 -85.54 gain 58 50 -84.17 gain 50 59 -94.22 gain 59 50 -92.10 gain 50 60 -86.93 gain 60 50 -94.10 gain 50 61 -82.54 gain 61 50 -81.61 gain 50 62 -72.54 gain 62 50 -69.13 gain 50 63 -73.64 gain 63 50 -74.19 gain 50 64 -62.62 gain 64 50 -67.39 gain 50 65 -62.12 gain 65 50 -62.44 gain 50 66 -71.11 gain 66 50 -70.42 gain 50 67 -75.22 gain 67 50 -75.75 gain 50 68 -75.82 gain 68 50 -78.94 gain 50 69 -82.82 gain 69 50 -83.15 gain 50 70 -79.33 gain 70 50 -78.13 gain 50 71 -86.42 gain 71 50 -88.79 gain 50 72 -87.92 gain 72 50 -87.85 gain 50 73 -83.94 gain 73 50 -85.24 gain 50 74 -90.21 gain 74 50 -87.62 gain 50 75 -87.73 gain 75 50 -91.03 gain 50 76 -82.73 gain 76 50 -86.15 gain 50 77 -78.29 gain 77 50 -77.72 gain 50 78 -76.75 gain 78 50 -80.67 gain 50 79 -67.26 gain 79 50 -70.81 gain 50 80 -70.89 gain 80 50 -72.23 gain 50 81 -67.41 gain 81 50 -69.66 gain 50 82 -75.38 gain 82 50 -78.60 gain 50 83 -83.87 gain 83 50 -84.37 gain 50 84 -74.46 gain 84 50 -72.14 gain 50 85 -87.55 gain 85 50 -90.66 gain 50 86 -86.37 gain 86 50 -91.12 gain 50 87 -90.97 gain 87 50 -93.01 gain 50 88 -97.14 gain 88 50 -98.81 gain 50 89 -92.46 gain 89 50 -96.28 gain 50 90 -86.10 gain 90 50 -89.26 gain 50 91 -88.03 gain 91 50 -92.26 gain 50 92 -82.11 gain 92 50 -87.26 gain 50 93 -73.71 gain 93 50 -76.22 gain 50 94 -79.23 gain 94 50 -80.31 gain 50 95 -80.42 gain 95 50 -80.73 gain 50 96 -75.37 gain 96 50 -82.66 gain 50 97 -80.57 gain 97 50 -80.68 gain 50 98 -76.28 gain 98 50 -76.86 gain 50 99 -83.96 gain 99 50 -83.68 gain 50 100 -84.58 gain 100 50 -84.21 gain 50 101 -89.79 gain 101 50 -93.06 gain 50 102 -89.99 gain 102 50 -93.22 gain 50 103 -89.88 gain 103 50 -94.27 gain 50 104 -90.98 gain 104 50 -97.86 gain 50 105 -90.39 gain 105 50 -91.79 gain 50 106 -81.22 gain 106 50 -79.95 gain 50 107 -75.46 gain 107 50 -74.09 gain 50 108 -74.67 gain 108 50 -72.93 gain 50 109 -81.24 gain 109 50 -82.95 gain 50 110 -81.84 gain 110 50 -89.90 gain 50 111 -75.94 gain 111 50 -73.97 gain 50 112 -85.79 gain 112 50 -87.29 gain 50 113 -87.14 gain 113 50 -87.77 gain 50 114 -87.35 gain 114 50 -85.15 gain 50 115 -86.59 gain 115 50 -85.04 gain 50 116 -84.10 gain 116 50 -84.98 gain 50 117 -92.12 gain 117 50 -90.14 gain 50 118 -90.26 gain 118 50 -89.91 gain 50 119 -95.54 gain 119 50 -100.24 gain 50 120 -86.46 gain 120 50 -88.54 gain 50 121 -89.65 gain 121 50 -92.76 gain 50 122 -90.04 gain 122 50 -92.90 gain 50 123 -89.04 gain 123 50 -92.24 gain 50 124 -91.83 gain 124 50 -93.02 gain 50 125 -81.61 gain 125 50 -86.14 gain 50 126 -85.50 gain 126 50 -86.68 gain 50 127 -88.80 gain 127 50 -89.61 gain 50 128 -88.79 gain 128 50 -92.19 gain 50 129 -89.22 gain 129 50 -89.83 gain 50 130 -87.16 gain 130 50 -89.05 gain 50 131 -90.10 gain 131 50 -91.77 gain 50 132 -87.63 gain 132 50 -85.31 gain 50 133 -81.77 gain 133 50 -84.63 gain 50 134 -98.72 gain 134 50 -98.44 gain 50 135 -84.85 gain 135 50 -86.87 gain 50 136 -89.59 gain 136 50 -92.05 gain 50 137 -93.35 gain 137 50 -98.73 gain 50 138 -93.10 gain 138 50 -92.01 gain 50 139 -87.33 gain 139 50 -89.50 gain 50 140 -88.83 gain 140 50 -91.83 gain 50 141 -80.92 gain 141 50 -75.89 gain 50 142 -91.39 gain 142 50 -93.10 gain 50 143 -83.69 gain 143 50 -88.14 gain 50 144 -86.44 gain 144 50 -89.25 gain 50 145 -80.43 gain 145 50 -86.63 gain 50 146 -89.01 gain 146 50 -91.21 gain 50 147 -94.01 gain 147 50 -93.31 gain 50 148 -96.98 gain 148 50 -94.61 gain 50 149 -91.33 gain 149 50 -92.61 gain 50 150 -97.04 gain 150 50 -99.16 gain 50 151 -92.22 gain 151 50 -93.28 gain 50 152 -87.19 gain 152 50 -88.07 gain 50 153 -88.75 gain 153 50 -88.84 gain 50 154 -89.33 gain 154 50 -91.33 gain 50 155 -89.99 gain 155 50 -90.56 gain 50 156 -93.91 gain 156 50 -93.71 gain 50 157 -93.14 gain 157 50 -95.42 gain 50 158 -86.13 gain 158 50 -87.92 gain 50 159 -89.08 gain 159 50 -93.25 gain 50 160 -92.21 gain 160 50 -93.53 gain 50 161 -90.52 gain 161 50 -94.28 gain 50 162 -91.50 gain 162 50 -94.97 gain 50 163 -88.67 gain 163 50 -94.05 gain 50 164 -104.71 gain 164 50 -109.46 gain 50 165 -96.55 gain 165 50 -98.36 gain 50 166 -89.64 gain 166 50 -91.21 gain 50 167 -87.55 gain 167 50 -89.84 gain 50 168 -89.71 gain 168 50 -90.89 gain 50 169 -88.84 gain 169 50 -91.14 gain 50 170 -91.68 gain 170 50 -93.21 gain 50 171 -93.55 gain 171 50 -96.16 gain 50 172 -87.96 gain 172 50 -88.75 gain 50 173 -85.22 gain 173 50 -90.67 gain 50 174 -90.87 gain 174 50 -92.37 gain 50 175 -92.98 gain 175 50 -95.60 gain 50 176 -88.54 gain 176 50 -90.14 gain 50 177 -91.92 gain 177 50 -96.52 gain 50 178 -93.79 gain 178 50 -91.83 gain 50 179 -100.93 gain 179 50 -98.39 gain 50 180 -95.19 gain 180 50 -102.10 gain 50 181 -90.47 gain 181 50 -91.41 gain 50 182 -97.65 gain 182 50 -99.67 gain 50 183 -88.09 gain 183 50 -90.38 gain 50 184 -92.87 gain 184 50 -97.91 gain 50 185 -92.32 gain 185 50 -101.23 gain 50 186 -86.55 gain 186 50 -91.04 gain 50 187 -90.15 gain 187 50 -92.37 gain 50 188 -91.85 gain 188 50 -96.48 gain 50 189 -91.54 gain 189 50 -90.90 gain 50 190 -87.05 gain 190 50 -90.32 gain 50 191 -91.90 gain 191 50 -93.88 gain 50 192 -94.91 gain 192 50 -95.58 gain 50 193 -92.18 gain 193 50 -91.84 gain 50 194 -99.94 gain 194 50 -100.38 gain 50 195 -90.40 gain 195 50 -89.39 gain 50 196 -90.73 gain 196 50 -94.03 gain 50 197 -89.70 gain 197 50 -88.13 gain 50 198 -92.46 gain 198 50 -95.40 gain 50 199 -102.88 gain 199 50 -105.94 gain 50 200 -99.88 gain 200 50 -104.27 gain 50 201 -93.17 gain 201 50 -97.47 gain 50 202 -98.85 gain 202 50 -102.28 gain 50 203 -89.61 gain 203 50 -92.16 gain 50 204 -90.63 gain 204 50 -89.82 gain 50 205 -100.40 gain 205 50 -103.33 gain 50 206 -92.51 gain 206 50 -96.55 gain 50 207 -87.21 gain 207 50 -90.66 gain 50 208 -98.38 gain 208 50 -104.44 gain 50 209 -99.33 gain 209 50 -104.96 gain 50 210 -96.68 gain 210 50 -102.48 gain 50 211 -89.32 gain 211 50 -90.36 gain 50 212 -97.58 gain 212 50 -101.63 gain 50 213 -94.35 gain 213 50 -97.72 gain 50 214 -98.99 gain 214 50 -107.75 gain 50 215 -99.24 gain 215 50 -103.40 gain 50 216 -96.28 gain 216 50 -104.35 gain 50 217 -96.50 gain 217 50 -104.83 gain 50 218 -95.38 gain 218 50 -96.53 gain 50 219 -97.90 gain 219 50 -99.53 gain 50 220 -87.31 gain 220 50 -85.02 gain 50 221 -97.56 gain 221 50 -100.95 gain 50 222 -96.62 gain 222 50 -95.81 gain 50 223 -94.63 gain 223 50 -97.07 gain 50 224 -98.63 gain 224 50 -101.54 gain 51 52 -66.65 gain 52 51 -63.88 gain 51 53 -74.60 gain 53 51 -72.40 gain 51 54 -85.05 gain 54 51 -82.25 gain 51 55 -79.21 gain 55 51 -73.33 gain 51 56 -93.23 gain 56 51 -92.39 gain 51 57 -98.14 gain 57 51 -96.39 gain 51 58 -82.83 gain 58 51 -77.77 gain 51 59 -94.05 gain 59 51 -88.25 gain 51 60 -83.56 gain 60 51 -87.03 gain 51 61 -84.68 gain 61 51 -80.06 gain 51 62 -86.29 gain 62 51 -79.18 gain 51 63 -76.39 gain 63 51 -73.24 gain 51 64 -76.80 gain 64 51 -77.88 gain 51 65 -66.54 gain 65 51 -63.17 gain 51 66 -62.41 gain 66 51 -58.02 gain 51 67 -70.17 gain 67 51 -67.01 gain 51 68 -80.44 gain 68 51 -79.86 gain 51 69 -83.70 gain 69 51 -80.34 gain 51 70 -85.12 gain 70 51 -80.23 gain 51 71 -88.88 gain 71 51 -87.56 gain 51 72 -92.23 gain 72 51 -88.46 gain 51 73 -97.64 gain 73 51 -95.25 gain 51 74 -92.38 gain 74 51 -86.10 gain 51 75 -88.85 gain 75 51 -88.46 gain 51 76 -86.23 gain 76 51 -85.96 gain 51 77 -86.33 gain 77 51 -82.06 gain 51 78 -85.41 gain 78 51 -85.64 gain 51 79 -80.33 gain 79 51 -80.18 gain 51 80 -77.13 gain 80 51 -74.77 gain 51 81 -75.27 gain 81 51 -73.82 gain 51 82 -75.19 gain 82 51 -74.72 gain 51 83 -80.84 gain 83 51 -77.64 gain 51 84 -81.95 gain 84 51 -75.94 gain 51 85 -81.58 gain 85 51 -81.00 gain 51 86 -87.64 gain 86 51 -88.69 gain 51 87 -93.41 gain 87 51 -91.75 gain 51 88 -90.61 gain 88 51 -88.60 gain 51 89 -93.26 gain 89 51 -93.39 gain 51 90 -85.52 gain 90 51 -84.99 gain 51 91 -88.95 gain 91 51 -89.48 gain 51 92 -88.68 gain 92 51 -90.13 gain 51 93 -83.53 gain 93 51 -82.34 gain 51 94 -77.18 gain 94 51 -74.56 gain 51 95 -83.46 gain 95 51 -80.08 gain 51 96 -77.07 gain 96 51 -80.66 gain 51 97 -82.02 gain 97 51 -78.43 gain 51 98 -87.33 gain 98 51 -84.22 gain 51 99 -89.82 gain 99 51 -85.84 gain 51 100 -87.38 gain 100 51 -83.32 gain 51 101 -88.51 gain 101 51 -88.07 gain 51 102 -93.58 gain 102 51 -93.12 gain 51 103 -93.69 gain 103 51 -94.39 gain 51 104 -98.01 gain 104 51 -101.19 gain 51 105 -95.61 gain 105 51 -93.31 gain 51 106 -87.16 gain 106 51 -82.19 gain 51 107 -96.52 gain 107 51 -91.46 gain 51 108 -85.58 gain 108 51 -80.14 gain 51 109 -84.76 gain 109 51 -82.78 gain 51 110 -89.53 gain 110 51 -93.90 gain 51 111 -82.69 gain 111 51 -77.03 gain 51 112 -88.75 gain 112 51 -86.55 gain 51 113 -87.27 gain 113 51 -84.20 gain 51 114 -86.47 gain 114 51 -80.58 gain 51 115 -92.18 gain 115 51 -86.93 gain 51 116 -92.41 gain 116 51 -89.60 gain 51 117 -93.91 gain 117 51 -88.24 gain 51 118 -93.68 gain 118 51 -89.63 gain 51 119 -91.88 gain 119 51 -92.89 gain 51 120 -93.18 gain 120 51 -91.58 gain 51 121 -90.84 gain 121 51 -90.25 gain 51 122 -94.71 gain 122 51 -93.88 gain 51 123 -87.16 gain 123 51 -86.67 gain 51 124 -90.58 gain 124 51 -88.08 gain 51 125 -88.65 gain 125 51 -89.49 gain 51 126 -85.22 gain 126 51 -82.70 gain 51 127 -92.48 gain 127 51 -89.59 gain 51 128 -83.47 gain 128 51 -83.17 gain 51 129 -86.96 gain 129 51 -83.88 gain 51 130 -89.54 gain 130 51 -87.75 gain 51 131 -89.60 gain 131 51 -87.58 gain 51 132 -90.59 gain 132 51 -84.58 gain 51 133 -98.15 gain 133 51 -97.31 gain 51 134 -92.92 gain 134 51 -88.95 gain 51 135 -87.79 gain 135 51 -86.11 gain 51 136 -92.19 gain 136 51 -90.96 gain 51 137 -96.90 gain 137 51 -98.59 gain 51 138 -87.83 gain 138 51 -83.04 gain 51 139 -92.95 gain 139 51 -91.43 gain 51 140 -85.63 gain 140 51 -84.94 gain 51 141 -87.24 gain 141 51 -78.52 gain 51 142 -86.01 gain 142 51 -84.03 gain 51 143 -86.92 gain 143 51 -87.68 gain 51 144 -96.95 gain 144 51 -96.08 gain 51 145 -85.52 gain 145 51 -88.03 gain 51 146 -97.55 gain 146 51 -96.05 gain 51 147 -87.57 gain 147 51 -83.18 gain 51 148 -93.88 gain 148 51 -87.82 gain 51 149 -101.92 gain 149 51 -99.52 gain 51 150 -98.69 gain 150 51 -97.12 gain 51 151 -99.02 gain 151 51 -96.40 gain 51 152 -83.88 gain 152 51 -81.07 gain 51 153 -98.65 gain 153 51 -95.05 gain 51 154 -95.06 gain 154 51 -93.36 gain 51 155 -88.93 gain 155 51 -85.80 gain 51 156 -91.43 gain 156 51 -87.54 gain 51 157 -93.08 gain 157 51 -91.67 gain 51 158 -93.70 gain 158 51 -91.79 gain 51 159 -88.74 gain 159 51 -89.22 gain 51 160 -88.49 gain 160 51 -86.12 gain 51 161 -93.22 gain 161 51 -93.29 gain 51 162 -99.77 gain 162 51 -99.54 gain 51 163 -101.49 gain 163 51 -103.19 gain 51 164 -98.25 gain 164 51 -99.31 gain 51 165 -102.68 gain 165 51 -100.79 gain 51 166 -94.75 gain 166 51 -92.62 gain 51 167 -95.90 gain 167 51 -94.49 gain 51 168 -91.93 gain 168 51 -89.42 gain 51 169 -95.43 gain 169 51 -94.03 gain 51 170 -95.20 gain 170 51 -93.04 gain 51 171 -94.22 gain 171 51 -93.13 gain 51 172 -99.19 gain 172 51 -96.30 gain 51 173 -84.01 gain 173 51 -85.76 gain 51 174 -100.52 gain 174 51 -98.32 gain 51 175 -93.75 gain 175 51 -92.69 gain 51 176 -100.06 gain 176 51 -97.97 gain 51 177 -99.11 gain 177 51 -100.02 gain 51 178 -94.06 gain 178 51 -88.41 gain 51 179 -100.40 gain 179 51 -94.18 gain 51 180 -107.26 gain 180 51 -110.48 gain 51 181 -99.73 gain 181 51 -96.97 gain 51 182 -92.72 gain 182 51 -91.04 gain 51 183 -99.51 gain 183 51 -98.11 gain 51 184 -95.97 gain 184 51 -97.32 gain 51 185 -98.49 gain 185 51 -103.71 gain 51 186 -89.57 gain 186 51 -90.37 gain 51 187 -90.93 gain 187 51 -89.46 gain 51 188 -96.78 gain 188 51 -97.71 gain 51 189 -95.06 gain 189 51 -90.72 gain 51 190 -96.57 gain 190 51 -96.14 gain 51 191 -104.84 gain 191 51 -103.12 gain 51 192 -103.97 gain 192 51 -100.95 gain 51 193 -96.57 gain 193 51 -92.54 gain 51 194 -95.56 gain 194 51 -92.31 gain 51 195 -99.50 gain 195 51 -94.80 gain 51 196 -99.39 gain 196 51 -98.99 gain 51 197 -104.91 gain 197 51 -99.65 gain 51 198 -98.94 gain 198 51 -98.19 gain 51 199 -98.06 gain 199 51 -97.42 gain 51 200 -98.81 gain 200 51 -99.51 gain 51 201 -92.22 gain 201 51 -92.82 gain 51 202 -90.93 gain 202 51 -90.67 gain 51 203 -99.90 gain 203 51 -98.75 gain 51 204 -102.13 gain 204 51 -97.63 gain 51 205 -91.33 gain 205 51 -90.56 gain 51 206 -97.27 gain 206 51 -97.62 gain 51 207 -96.58 gain 207 51 -96.35 gain 51 208 -100.96 gain 208 51 -103.32 gain 51 209 -101.13 gain 209 51 -103.06 gain 51 210 -102.26 gain 210 51 -104.38 gain 51 211 -98.42 gain 211 51 -95.77 gain 51 212 -101.04 gain 212 51 -101.40 gain 51 213 -90.09 gain 213 51 -89.77 gain 51 214 -94.19 gain 214 51 -99.26 gain 51 215 -100.35 gain 215 51 -100.82 gain 51 216 -99.36 gain 216 51 -103.74 gain 51 217 -107.35 gain 217 51 -112.00 gain 51 218 -97.54 gain 218 51 -94.99 gain 51 219 -99.46 gain 219 51 -97.40 gain 51 220 -101.48 gain 220 51 -95.50 gain 51 221 -104.88 gain 221 51 -104.58 gain 51 222 -98.57 gain 222 51 -94.08 gain 51 223 -99.55 gain 223 51 -98.29 gain 51 224 -100.21 gain 224 51 -99.43 gain 52 53 -62.43 gain 53 52 -62.98 gain 52 54 -82.74 gain 54 52 -82.70 gain 52 55 -73.29 gain 55 52 -70.17 gain 52 56 -80.26 gain 56 52 -82.19 gain 52 57 -82.33 gain 57 52 -83.34 gain 52 58 -89.75 gain 58 52 -87.45 gain 52 59 -95.55 gain 59 52 -92.51 gain 52 60 -87.75 gain 60 52 -93.99 gain 52 61 -84.76 gain 61 52 -82.90 gain 52 62 -81.95 gain 62 52 -77.60 gain 52 63 -80.72 gain 63 52 -80.34 gain 52 64 -81.47 gain 64 52 -85.32 gain 52 65 -70.59 gain 65 52 -69.98 gain 52 66 -68.21 gain 66 52 -66.58 gain 52 67 -69.01 gain 67 52 -68.61 gain 52 68 -64.36 gain 68 52 -66.55 gain 52 69 -77.96 gain 69 52 -77.36 gain 52 70 -74.79 gain 70 52 -72.66 gain 52 71 -81.82 gain 71 52 -83.26 gain 52 72 -86.25 gain 72 52 -85.25 gain 52 73 -91.35 gain 73 52 -91.72 gain 52 74 -90.90 gain 74 52 -87.39 gain 52 75 -94.39 gain 75 52 -96.77 gain 52 76 -89.92 gain 76 52 -92.41 gain 52 77 -82.39 gain 77 52 -80.88 gain 52 78 -89.17 gain 78 52 -92.16 gain 52 79 -81.18 gain 79 52 -83.79 gain 52 80 -78.91 gain 80 52 -79.31 gain 52 81 -71.36 gain 81 52 -72.68 gain 52 82 -76.36 gain 82 52 -78.66 gain 52 83 -69.93 gain 83 52 -69.50 gain 52 84 -78.36 gain 84 52 -75.11 gain 52 85 -76.33 gain 85 52 -78.51 gain 52 86 -82.59 gain 86 52 -86.40 gain 52 87 -85.95 gain 87 52 -87.05 gain 52 88 -82.94 gain 88 52 -83.69 gain 52 89 -89.20 gain 89 52 -92.09 gain 52 90 -91.18 gain 90 52 -93.41 gain 52 91 -80.71 gain 91 52 -84.01 gain 52 92 -89.22 gain 92 52 -93.44 gain 52 93 -82.42 gain 93 52 -84.00 gain 52 94 -84.18 gain 94 52 -84.32 gain 52 95 -78.33 gain 95 52 -77.71 gain 52 96 -82.50 gain 96 52 -88.86 gain 52 97 -70.12 gain 97 52 -69.30 gain 52 98 -80.36 gain 98 52 -80.01 gain 52 99 -78.57 gain 99 52 -77.35 gain 52 100 -88.74 gain 100 52 -87.44 gain 52 101 -82.00 gain 101 52 -84.34 gain 52 102 -85.26 gain 102 52 -87.56 gain 52 103 -96.69 gain 103 52 -100.15 gain 52 104 -91.85 gain 104 52 -97.80 gain 52 105 -94.18 gain 105 52 -94.65 gain 52 106 -84.05 gain 106 52 -81.85 gain 52 107 -87.93 gain 107 52 -85.63 gain 52 108 -90.92 gain 108 52 -88.25 gain 52 109 -83.23 gain 109 52 -84.00 gain 52 110 -86.16 gain 110 52 -93.30 gain 52 111 -77.94 gain 111 52 -75.05 gain 52 112 -86.69 gain 112 52 -87.26 gain 52 113 -85.61 gain 113 52 -85.31 gain 52 114 -80.76 gain 114 52 -77.63 gain 52 115 -86.58 gain 115 52 -84.10 gain 52 116 -84.81 gain 116 52 -84.76 gain 52 117 -85.48 gain 117 52 -82.58 gain 52 118 -89.55 gain 118 52 -88.26 gain 52 119 -88.85 gain 119 52 -92.63 gain 52 120 -95.76 gain 120 52 -96.91 gain 52 121 -97.96 gain 121 52 -100.14 gain 52 122 -81.06 gain 122 52 -82.99 gain 52 123 -90.25 gain 123 52 -92.52 gain 52 124 -89.63 gain 124 52 -89.89 gain 52 125 -82.59 gain 125 52 -86.19 gain 52 126 -81.31 gain 126 52 -81.55 gain 52 127 -80.49 gain 127 52 -80.36 gain 52 128 -76.68 gain 128 52 -79.14 gain 52 129 -81.13 gain 129 52 -80.81 gain 52 130 -82.58 gain 130 52 -83.55 gain 52 131 -83.21 gain 131 52 -83.95 gain 52 132 -98.87 gain 132 52 -95.62 gain 52 133 -92.57 gain 133 52 -94.50 gain 52 134 -95.94 gain 134 52 -94.73 gain 52 135 -90.94 gain 135 52 -92.04 gain 52 136 -93.71 gain 136 52 -95.24 gain 52 137 -92.54 gain 137 52 -96.99 gain 52 138 -83.97 gain 138 52 -81.95 gain 52 139 -86.90 gain 139 52 -88.14 gain 52 140 -84.62 gain 140 52 -86.70 gain 52 141 -89.29 gain 141 52 -83.33 gain 52 142 -92.73 gain 142 52 -93.52 gain 52 143 -90.47 gain 143 52 -93.99 gain 52 144 -88.88 gain 144 52 -90.77 gain 52 145 -86.33 gain 145 52 -91.60 gain 52 146 -92.36 gain 146 52 -93.62 gain 52 147 -94.34 gain 147 52 -92.72 gain 52 148 -92.20 gain 148 52 -88.91 gain 52 149 -92.01 gain 149 52 -92.37 gain 52 150 -96.54 gain 150 52 -97.74 gain 52 151 -93.36 gain 151 52 -93.50 gain 52 152 -94.31 gain 152 52 -94.27 gain 52 153 -87.72 gain 153 52 -86.89 gain 52 154 -89.39 gain 154 52 -90.46 gain 52 155 -86.11 gain 155 52 -85.76 gain 52 156 -84.68 gain 156 52 -83.55 gain 52 157 -87.70 gain 157 52 -89.06 gain 52 158 -94.33 gain 158 52 -95.18 gain 52 159 -84.19 gain 159 52 -87.43 gain 52 160 -93.21 gain 160 52 -93.60 gain 52 161 -97.87 gain 161 52 -100.70 gain 52 162 -91.16 gain 162 52 -93.70 gain 52 163 -98.74 gain 163 52 -103.20 gain 52 164 -102.37 gain 164 52 -106.20 gain 52 165 -86.54 gain 165 52 -87.42 gain 52 166 -89.73 gain 166 52 -90.36 gain 52 167 -92.58 gain 167 52 -93.94 gain 52 168 -95.69 gain 168 52 -95.94 gain 52 169 -88.33 gain 169 52 -89.69 gain 52 170 -93.22 gain 170 52 -93.82 gain 52 171 -85.96 gain 171 52 -87.64 gain 52 172 -84.05 gain 172 52 -83.92 gain 52 173 -94.31 gain 173 52 -98.83 gain 52 174 -93.37 gain 174 52 -93.94 gain 52 175 -94.48 gain 175 52 -96.18 gain 52 176 -92.80 gain 176 52 -93.47 gain 52 177 -93.53 gain 177 52 -97.20 gain 52 178 -90.15 gain 178 52 -87.26 gain 52 179 -93.92 gain 179 52 -90.46 gain 52 180 -95.85 gain 180 52 -101.84 gain 52 181 -89.69 gain 181 52 -89.69 gain 52 182 -94.45 gain 182 52 -95.55 gain 52 183 -98.68 gain 183 52 -100.05 gain 52 184 -98.54 gain 184 52 -102.65 gain 52 185 -91.50 gain 185 52 -99.48 gain 52 186 -96.14 gain 186 52 -99.69 gain 52 187 -93.52 gain 187 52 -94.81 gain 52 188 -90.26 gain 188 52 -93.96 gain 52 189 -93.89 gain 189 52 -92.32 gain 52 190 -85.78 gain 190 52 -88.12 gain 52 191 -97.17 gain 191 52 -98.22 gain 52 192 -91.72 gain 192 52 -91.47 gain 52 193 -97.94 gain 193 52 -96.67 gain 52 194 -102.33 gain 194 52 -101.84 gain 52 195 -95.66 gain 195 52 -93.72 gain 52 196 -98.45 gain 196 52 -100.82 gain 52 197 -89.90 gain 197 52 -87.40 gain 52 198 -97.55 gain 198 52 -99.57 gain 52 199 -93.97 gain 199 52 -96.10 gain 52 200 -97.95 gain 200 52 -101.41 gain 52 201 -97.60 gain 201 52 -100.97 gain 52 202 -93.10 gain 202 52 -95.61 gain 52 203 -97.56 gain 203 52 -99.17 gain 52 204 -93.42 gain 204 52 -91.68 gain 52 205 -93.22 gain 205 52 -95.22 gain 52 206 -94.13 gain 206 52 -97.24 gain 52 207 -90.61 gain 207 52 -93.14 gain 52 208 -94.94 gain 208 52 -100.07 gain 52 209 -96.95 gain 209 52 -101.65 gain 52 210 -102.09 gain 210 52 -106.97 gain 52 211 -102.21 gain 211 52 -102.32 gain 52 212 -100.06 gain 212 52 -103.18 gain 52 213 -95.83 gain 213 52 -98.27 gain 52 214 -92.04 gain 214 52 -99.88 gain 52 215 -102.98 gain 215 52 -106.22 gain 52 216 -94.71 gain 216 52 -101.86 gain 52 217 -97.78 gain 217 52 -105.19 gain 52 218 -96.57 gain 218 52 -96.78 gain 52 219 -91.64 gain 219 52 -92.34 gain 52 220 -84.25 gain 220 52 -81.03 gain 52 221 -101.04 gain 221 52 -103.50 gain 52 222 -99.52 gain 222 52 -97.79 gain 52 223 -102.22 gain 223 52 -103.73 gain 52 224 -102.00 gain 224 52 -103.98 gain 53 54 -63.15 gain 54 53 -62.56 gain 53 55 -67.46 gain 55 53 -63.78 gain 53 56 -81.73 gain 56 53 -83.10 gain 53 57 -75.06 gain 57 53 -75.52 gain 53 58 -86.33 gain 58 53 -83.47 gain 53 59 -92.22 gain 59 53 -88.62 gain 53 60 -83.48 gain 60 53 -89.16 gain 53 61 -91.27 gain 61 53 -88.86 gain 53 62 -87.28 gain 62 53 -82.37 gain 53 63 -84.20 gain 63 53 -83.26 gain 53 64 -85.19 gain 64 53 -88.48 gain 53 65 -80.68 gain 65 53 -79.52 gain 53 66 -75.66 gain 66 53 -73.48 gain 53 67 -68.64 gain 67 53 -67.68 gain 53 68 -60.03 gain 68 53 -61.67 gain 53 69 -67.39 gain 69 53 -66.24 gain 53 70 -73.78 gain 70 53 -71.10 gain 53 71 -77.56 gain 71 53 -78.45 gain 53 72 -83.05 gain 72 53 -81.49 gain 53 73 -87.43 gain 73 53 -87.25 gain 53 74 -90.35 gain 74 53 -86.28 gain 53 75 -89.34 gain 75 53 -91.15 gain 53 76 -87.70 gain 76 53 -89.64 gain 53 77 -83.62 gain 77 53 -81.56 gain 53 78 -88.69 gain 78 53 -91.12 gain 53 79 -84.79 gain 79 53 -86.85 gain 53 80 -79.74 gain 80 53 -79.58 gain 53 81 -80.05 gain 81 53 -80.81 gain 53 82 -74.91 gain 82 53 -76.64 gain 53 83 -72.65 gain 83 53 -71.66 gain 53 84 -75.26 gain 84 53 -71.46 gain 53 85 -77.49 gain 85 53 -79.11 gain 53 86 -84.25 gain 86 53 -87.51 gain 53 87 -88.60 gain 87 53 -89.15 gain 53 88 -84.93 gain 88 53 -85.13 gain 53 89 -85.90 gain 89 53 -88.24 gain 53 90 -88.11 gain 90 53 -89.78 gain 53 91 -95.48 gain 91 53 -98.22 gain 53 92 -91.27 gain 92 53 -94.93 gain 53 93 -86.23 gain 93 53 -87.25 gain 53 94 -89.90 gain 94 53 -89.49 gain 53 95 -84.24 gain 95 53 -83.07 gain 53 96 -75.61 gain 96 53 -81.41 gain 53 97 -81.47 gain 97 53 -80.10 gain 53 98 -80.63 gain 98 53 -79.72 gain 53 99 -88.48 gain 99 53 -86.70 gain 53 100 -86.23 gain 100 53 -84.37 gain 53 101 -79.75 gain 101 53 -81.53 gain 53 102 -87.90 gain 102 53 -89.64 gain 53 103 -91.86 gain 103 53 -94.77 gain 53 104 -82.63 gain 104 53 -88.03 gain 53 105 -96.07 gain 105 53 -95.99 gain 53 106 -87.98 gain 106 53 -85.23 gain 53 107 -93.64 gain 107 53 -90.79 gain 53 108 -83.55 gain 108 53 -80.32 gain 53 109 -83.44 gain 109 53 -83.66 gain 53 110 -85.14 gain 110 53 -91.72 gain 53 111 -84.89 gain 111 53 -81.44 gain 53 112 -84.04 gain 112 53 -84.05 gain 53 113 -83.69 gain 113 53 -82.84 gain 53 114 -82.09 gain 114 53 -78.40 gain 53 115 -83.41 gain 115 53 -80.37 gain 53 116 -85.43 gain 116 53 -84.83 gain 53 117 -92.53 gain 117 53 -89.07 gain 53 118 -87.99 gain 118 53 -86.15 gain 53 119 -100.33 gain 119 53 -103.55 gain 53 120 -93.60 gain 120 53 -94.20 gain 53 121 -91.68 gain 121 53 -93.31 gain 53 122 -91.27 gain 122 53 -92.65 gain 53 123 -92.00 gain 123 53 -93.71 gain 53 124 -91.14 gain 124 53 -90.84 gain 53 125 -87.00 gain 125 53 -90.05 gain 53 126 -89.75 gain 126 53 -89.44 gain 53 127 -86.86 gain 127 53 -86.17 gain 53 128 -82.60 gain 128 53 -84.51 gain 53 129 -79.71 gain 129 53 -78.83 gain 53 130 -82.98 gain 130 53 -83.39 gain 53 131 -86.07 gain 131 53 -86.26 gain 53 132 -88.96 gain 132 53 -85.15 gain 53 133 -86.83 gain 133 53 -88.20 gain 53 134 -86.60 gain 134 53 -84.83 gain 53 135 -98.18 gain 135 53 -98.72 gain 53 136 -93.32 gain 136 53 -94.30 gain 53 137 -94.14 gain 137 53 -98.03 gain 53 138 -86.92 gain 138 53 -84.34 gain 53 139 -92.80 gain 139 53 -93.49 gain 53 140 -84.92 gain 140 53 -86.43 gain 53 141 -90.33 gain 141 53 -83.82 gain 53 142 -93.24 gain 142 53 -93.46 gain 53 143 -92.40 gain 143 53 -95.37 gain 53 144 -90.77 gain 144 53 -92.10 gain 53 145 -91.83 gain 145 53 -96.55 gain 53 146 -89.36 gain 146 53 -90.07 gain 53 147 -94.66 gain 147 53 -92.48 gain 53 148 -92.36 gain 148 53 -88.51 gain 53 149 -84.47 gain 149 53 -84.27 gain 53 150 -96.11 gain 150 53 -96.74 gain 53 151 -89.71 gain 151 53 -89.29 gain 53 152 -93.69 gain 152 53 -93.09 gain 53 153 -89.38 gain 153 53 -87.99 gain 53 154 -86.58 gain 154 53 -87.09 gain 53 155 -96.52 gain 155 53 -95.60 gain 53 156 -92.68 gain 156 53 -90.99 gain 53 157 -94.96 gain 157 53 -95.75 gain 53 158 -89.66 gain 158 53 -89.95 gain 53 159 -91.40 gain 159 53 -94.08 gain 53 160 -100.09 gain 160 53 -99.93 gain 53 161 -84.54 gain 161 53 -86.82 gain 53 162 -93.94 gain 162 53 -95.92 gain 53 163 -94.44 gain 163 53 -98.33 gain 53 164 -96.70 gain 164 53 -99.97 gain 53 165 -99.24 gain 165 53 -99.57 gain 53 166 -94.61 gain 166 53 -94.69 gain 53 167 -100.37 gain 167 53 -101.17 gain 53 168 -94.66 gain 168 53 -94.36 gain 53 169 -91.32 gain 169 53 -92.13 gain 53 170 -92.59 gain 170 53 -92.63 gain 53 171 -85.71 gain 171 53 -86.84 gain 53 172 -88.37 gain 172 53 -87.68 gain 53 173 -87.28 gain 173 53 -91.24 gain 53 174 -88.72 gain 174 53 -88.72 gain 53 175 -99.33 gain 175 53 -100.47 gain 53 176 -91.19 gain 176 53 -91.30 gain 53 177 -90.92 gain 177 53 -94.03 gain 53 178 -95.50 gain 178 53 -92.05 gain 53 179 -95.51 gain 179 53 -91.49 gain 53 180 -94.77 gain 180 53 -100.20 gain 53 181 -98.19 gain 181 53 -97.64 gain 53 182 -96.48 gain 182 53 -97.02 gain 53 183 -89.63 gain 183 53 -90.43 gain 53 184 -98.13 gain 184 53 -101.69 gain 53 185 -90.79 gain 185 53 -98.21 gain 53 186 -93.01 gain 186 53 -96.01 gain 53 187 -86.83 gain 187 53 -87.56 gain 53 188 -93.91 gain 188 53 -97.06 gain 53 189 -95.89 gain 189 53 -93.76 gain 53 190 -92.54 gain 190 53 -94.33 gain 53 191 -86.09 gain 191 53 -86.58 gain 53 192 -92.36 gain 192 53 -91.55 gain 53 193 -85.72 gain 193 53 -83.90 gain 53 194 -93.86 gain 194 53 -92.82 gain 53 195 -105.87 gain 195 53 -103.37 gain 53 196 -93.86 gain 196 53 -95.67 gain 53 197 -99.26 gain 197 53 -96.21 gain 53 198 -87.72 gain 198 53 -89.18 gain 53 199 -90.98 gain 199 53 -92.54 gain 53 200 -87.28 gain 200 53 -90.18 gain 53 201 -97.46 gain 201 53 -100.28 gain 53 202 -87.29 gain 202 53 -89.24 gain 53 203 -96.28 gain 203 53 -97.34 gain 53 204 -92.44 gain 204 53 -90.14 gain 53 205 -86.36 gain 205 53 -87.81 gain 53 206 -99.88 gain 206 53 -102.43 gain 53 207 -93.45 gain 207 53 -95.42 gain 53 208 -95.53 gain 208 53 -100.10 gain 53 209 -97.91 gain 209 53 -102.05 gain 53 210 -100.80 gain 210 53 -105.12 gain 53 211 -96.17 gain 211 53 -95.72 gain 53 212 -93.97 gain 212 53 -96.53 gain 53 213 -95.29 gain 213 53 -97.18 gain 53 214 -97.23 gain 214 53 -104.50 gain 53 215 -99.54 gain 215 53 -102.22 gain 53 216 -101.08 gain 216 53 -107.67 gain 53 217 -93.49 gain 217 53 -100.34 gain 53 218 -97.62 gain 218 53 -97.28 gain 53 219 -88.92 gain 219 53 -89.06 gain 53 220 -102.31 gain 220 53 -98.54 gain 53 221 -98.69 gain 221 53 -100.59 gain 53 222 -94.41 gain 222 53 -92.12 gain 53 223 -101.90 gain 223 53 -102.85 gain 53 224 -104.30 gain 224 53 -105.72 gain 54 55 -63.57 gain 55 54 -60.49 gain 54 56 -73.85 gain 56 54 -75.81 gain 54 57 -77.89 gain 57 54 -78.93 gain 54 58 -82.60 gain 58 54 -80.34 gain 54 59 -86.13 gain 59 54 -83.12 gain 54 60 -95.82 gain 60 54 -102.09 gain 54 61 -89.71 gain 61 54 -87.89 gain 54 62 -93.19 gain 62 54 -88.88 gain 54 63 -82.30 gain 63 54 -81.96 gain 54 64 -85.53 gain 64 54 -89.41 gain 54 65 -82.82 gain 65 54 -82.24 gain 54 66 -80.22 gain 66 54 -78.63 gain 54 67 -74.76 gain 67 54 -74.39 gain 54 68 -72.29 gain 68 54 -74.51 gain 54 69 -68.60 gain 69 54 -68.04 gain 54 70 -64.87 gain 70 54 -62.77 gain 54 71 -80.40 gain 71 54 -81.87 gain 54 72 -78.55 gain 72 54 -77.59 gain 54 73 -81.66 gain 73 54 -82.06 gain 54 74 -85.44 gain 74 54 -81.96 gain 54 75 -93.60 gain 75 54 -96.01 gain 54 76 -89.50 gain 76 54 -92.03 gain 54 77 -93.48 gain 77 54 -92.01 gain 54 78 -84.03 gain 78 54 -87.06 gain 54 79 -87.08 gain 79 54 -89.73 gain 54 80 -85.61 gain 80 54 -86.05 gain 54 81 -76.47 gain 81 54 -77.82 gain 54 82 -82.83 gain 82 54 -85.16 gain 54 83 -81.13 gain 83 54 -80.74 gain 54 84 -74.14 gain 84 54 -70.92 gain 54 85 -68.38 gain 85 54 -70.59 gain 54 86 -78.28 gain 86 54 -82.13 gain 54 87 -79.51 gain 87 54 -80.66 gain 54 88 -80.71 gain 88 54 -81.50 gain 54 89 -93.66 gain 89 54 -96.59 gain 54 90 -92.67 gain 90 54 -94.94 gain 54 91 -88.15 gain 91 54 -91.49 gain 54 92 -98.01 gain 92 54 -102.27 gain 54 93 -92.47 gain 93 54 -94.09 gain 54 94 -89.25 gain 94 54 -89.43 gain 54 95 -83.69 gain 95 54 -83.12 gain 54 96 -85.73 gain 96 54 -92.12 gain 54 97 -80.15 gain 97 54 -79.37 gain 54 98 -78.71 gain 98 54 -78.39 gain 54 99 -81.45 gain 99 54 -80.27 gain 54 100 -79.89 gain 100 54 -78.63 gain 54 101 -83.65 gain 101 54 -86.02 gain 54 102 -84.35 gain 102 54 -86.68 gain 54 103 -85.48 gain 103 54 -88.98 gain 54 104 -84.97 gain 104 54 -90.95 gain 54 105 -98.61 gain 105 54 -99.12 gain 54 106 -91.99 gain 106 54 -89.83 gain 54 107 -96.63 gain 107 54 -94.37 gain 54 108 -88.01 gain 108 54 -85.37 gain 54 109 -106.37 gain 109 54 -107.18 gain 54 110 -87.41 gain 110 54 -94.59 gain 54 111 -87.06 gain 111 54 -84.20 gain 54 112 -83.33 gain 112 54 -83.94 gain 54 113 -81.04 gain 113 54 -80.77 gain 54 114 -90.59 gain 114 54 -87.49 gain 54 115 -77.28 gain 115 54 -74.83 gain 54 116 -78.63 gain 116 54 -78.62 gain 54 117 -85.22 gain 117 54 -82.35 gain 54 118 -85.36 gain 118 54 -84.11 gain 54 119 -91.99 gain 119 54 -95.80 gain 54 120 -92.22 gain 120 54 -93.41 gain 54 121 -89.50 gain 121 54 -91.72 gain 54 122 -97.25 gain 122 54 -99.22 gain 54 123 -91.50 gain 123 54 -93.80 gain 54 124 -90.21 gain 124 54 -90.51 gain 54 125 -84.22 gain 125 54 -87.86 gain 54 126 -85.10 gain 126 54 -85.38 gain 54 127 -86.11 gain 127 54 -86.02 gain 54 128 -83.03 gain 128 54 -85.53 gain 54 129 -81.17 gain 129 54 -80.88 gain 54 130 -86.03 gain 130 54 -87.03 gain 54 131 -86.72 gain 131 54 -87.50 gain 54 132 -89.05 gain 132 54 -85.84 gain 54 133 -92.93 gain 133 54 -94.90 gain 54 134 -86.64 gain 134 54 -85.46 gain 54 135 -94.96 gain 135 54 -96.09 gain 54 136 -94.46 gain 136 54 -96.03 gain 54 137 -93.14 gain 137 54 -97.62 gain 54 138 -86.44 gain 138 54 -84.45 gain 54 139 -89.20 gain 139 54 -90.48 gain 54 140 -84.55 gain 140 54 -86.66 gain 54 141 -90.67 gain 141 54 -84.75 gain 54 142 -92.43 gain 142 54 -93.25 gain 54 143 -89.63 gain 143 54 -93.19 gain 54 144 -87.86 gain 144 54 -89.78 gain 54 145 -90.99 gain 145 54 -96.30 gain 54 146 -90.31 gain 146 54 -91.62 gain 54 147 -87.30 gain 147 54 -85.71 gain 54 148 -88.75 gain 148 54 -85.48 gain 54 149 -98.57 gain 149 54 -98.96 gain 54 150 -96.45 gain 150 54 -97.68 gain 54 151 -89.02 gain 151 54 -89.20 gain 54 152 -91.34 gain 152 54 -91.33 gain 54 153 -97.70 gain 153 54 -96.90 gain 54 154 -88.59 gain 154 54 -89.69 gain 54 155 -93.06 gain 155 54 -92.73 gain 54 156 -92.06 gain 156 54 -90.97 gain 54 157 -93.70 gain 157 54 -95.09 gain 54 158 -87.43 gain 158 54 -88.32 gain 54 159 -96.22 gain 159 54 -99.50 gain 54 160 -93.78 gain 160 54 -94.20 gain 54 161 -95.16 gain 161 54 -98.02 gain 54 162 -87.31 gain 162 54 -89.89 gain 54 163 -90.61 gain 163 54 -95.10 gain 54 164 -92.62 gain 164 54 -96.48 gain 54 165 -93.42 gain 165 54 -94.34 gain 54 166 -93.73 gain 166 54 -94.40 gain 54 167 -97.30 gain 167 54 -98.69 gain 54 168 -104.00 gain 168 54 -104.29 gain 54 169 -89.31 gain 169 54 -90.71 gain 54 170 -92.08 gain 170 54 -92.71 gain 54 171 -91.79 gain 171 54 -93.51 gain 54 172 -95.10 gain 172 54 -95.01 gain 54 173 -92.46 gain 173 54 -97.01 gain 54 174 -86.26 gain 174 54 -86.87 gain 54 175 -88.52 gain 175 54 -90.25 gain 54 176 -87.17 gain 176 54 -87.87 gain 54 177 -90.90 gain 177 54 -94.61 gain 54 178 -86.91 gain 178 54 -84.06 gain 54 179 -90.74 gain 179 54 -87.31 gain 54 180 -98.37 gain 180 54 -104.39 gain 54 181 -102.30 gain 181 54 -102.35 gain 54 182 -90.41 gain 182 54 -91.54 gain 54 183 -94.42 gain 183 54 -95.82 gain 54 184 -94.33 gain 184 54 -98.48 gain 54 185 -95.26 gain 185 54 -103.28 gain 54 186 -98.13 gain 186 54 -101.72 gain 54 187 -94.13 gain 187 54 -95.45 gain 54 188 -95.61 gain 188 54 -99.35 gain 54 189 -95.69 gain 189 54 -94.16 gain 54 190 -87.77 gain 190 54 -90.15 gain 54 191 -90.08 gain 191 54 -91.16 gain 54 192 -89.45 gain 192 54 -89.23 gain 54 193 -92.76 gain 193 54 -91.52 gain 54 194 -94.36 gain 194 54 -93.91 gain 54 195 -98.33 gain 195 54 -96.43 gain 54 196 -100.80 gain 196 54 -103.20 gain 54 197 -86.45 gain 197 54 -83.99 gain 54 198 -98.95 gain 198 54 -101.01 gain 54 199 -99.60 gain 199 54 -101.76 gain 54 200 -97.07 gain 200 54 -100.56 gain 54 201 -90.35 gain 201 54 -93.75 gain 54 202 -92.60 gain 202 54 -95.14 gain 54 203 -99.69 gain 203 54 -101.34 gain 54 204 -95.95 gain 204 54 -94.24 gain 54 205 -100.94 gain 205 54 -102.97 gain 54 206 -91.30 gain 206 54 -94.44 gain 54 207 -96.80 gain 207 54 -99.36 gain 54 208 -97.62 gain 208 54 -102.78 gain 54 209 -88.97 gain 209 54 -93.71 gain 54 210 -99.92 gain 210 54 -104.83 gain 54 211 -101.58 gain 211 54 -101.72 gain 54 212 -91.08 gain 212 54 -94.24 gain 54 213 -94.99 gain 213 54 -97.47 gain 54 214 -104.44 gain 214 54 -112.31 gain 54 215 -105.05 gain 215 54 -108.32 gain 54 216 -95.54 gain 216 54 -102.72 gain 54 217 -94.87 gain 217 54 -102.32 gain 54 218 -99.65 gain 218 54 -99.90 gain 54 219 -98.13 gain 219 54 -98.87 gain 54 220 -92.74 gain 220 54 -89.56 gain 54 221 -90.30 gain 221 54 -92.80 gain 54 222 -95.39 gain 222 54 -93.69 gain 54 223 -91.82 gain 223 54 -93.37 gain 54 224 -100.88 gain 224 54 -102.90 gain 55 56 -57.63 gain 56 55 -62.67 gain 55 57 -65.54 gain 57 55 -69.67 gain 55 58 -76.96 gain 58 55 -77.78 gain 55 59 -70.83 gain 59 55 -70.90 gain 55 60 -90.95 gain 60 55 -100.31 gain 55 61 -84.28 gain 61 55 -85.54 gain 55 62 -81.28 gain 62 55 -80.05 gain 55 63 -82.43 gain 63 55 -85.17 gain 55 64 -86.13 gain 64 55 -93.09 gain 55 65 -87.35 gain 65 55 -89.86 gain 55 66 -81.69 gain 66 55 -83.18 gain 55 67 -76.24 gain 67 55 -78.97 gain 55 68 -70.25 gain 68 55 -75.56 gain 55 69 -62.21 gain 69 55 -64.73 gain 55 70 -61.55 gain 70 55 -62.55 gain 55 71 -68.72 gain 71 55 -73.28 gain 55 72 -74.39 gain 72 55 -76.51 gain 55 73 -82.20 gain 73 55 -85.69 gain 55 74 -81.61 gain 74 55 -81.21 gain 55 75 -94.39 gain 75 55 -99.89 gain 55 76 -86.67 gain 76 55 -92.28 gain 55 77 -81.25 gain 77 55 -82.87 gain 55 78 -84.46 gain 78 55 -90.57 gain 55 79 -85.71 gain 79 55 -91.44 gain 55 80 -85.80 gain 80 55 -89.33 gain 55 81 -81.68 gain 81 55 -86.12 gain 55 82 -78.41 gain 82 55 -83.82 gain 55 83 -78.38 gain 83 55 -81.06 gain 55 84 -69.66 gain 84 55 -69.53 gain 55 85 -70.19 gain 85 55 -75.49 gain 55 86 -79.36 gain 86 55 -86.30 gain 55 87 -77.26 gain 87 55 -81.48 gain 55 88 -71.99 gain 88 55 -75.86 gain 55 89 -80.11 gain 89 55 -86.12 gain 55 90 -89.50 gain 90 55 -94.85 gain 55 91 -93.31 gain 91 55 -99.73 gain 55 92 -84.73 gain 92 55 -92.07 gain 55 93 -85.18 gain 93 55 -89.88 gain 55 94 -87.91 gain 94 55 -91.18 gain 55 95 -83.90 gain 95 55 -86.41 gain 55 96 -89.75 gain 96 55 -99.23 gain 55 97 -81.04 gain 97 55 -83.34 gain 55 98 -78.47 gain 98 55 -81.24 gain 55 99 -81.85 gain 99 55 -83.75 gain 55 100 -75.61 gain 100 55 -77.43 gain 55 101 -75.32 gain 101 55 -80.77 gain 55 102 -74.70 gain 102 55 -80.11 gain 55 103 -81.13 gain 103 55 -87.72 gain 55 104 -84.65 gain 104 55 -93.72 gain 55 105 -97.33 gain 105 55 -100.92 gain 55 106 -94.20 gain 106 55 -95.13 gain 55 107 -95.84 gain 107 55 -96.66 gain 55 108 -89.88 gain 108 55 -90.32 gain 55 109 -85.89 gain 109 55 -89.78 gain 55 110 -84.29 gain 110 55 -94.54 gain 55 111 -86.22 gain 111 55 -86.45 gain 55 112 -87.79 gain 112 55 -91.48 gain 55 113 -76.62 gain 113 55 -79.43 gain 55 114 -80.42 gain 114 55 -80.40 gain 55 115 -77.37 gain 115 55 -78.01 gain 55 116 -73.50 gain 116 55 -76.57 gain 55 117 -76.77 gain 117 55 -76.98 gain 55 118 -81.61 gain 118 55 -83.44 gain 55 119 -88.95 gain 119 55 -95.85 gain 55 120 -91.37 gain 120 55 -95.65 gain 55 121 -84.24 gain 121 55 -89.54 gain 55 122 -85.73 gain 122 55 -90.79 gain 55 123 -94.37 gain 123 55 -99.76 gain 55 124 -85.10 gain 124 55 -88.48 gain 55 125 -86.77 gain 125 55 -93.49 gain 55 126 -85.01 gain 126 55 -88.37 gain 55 127 -81.49 gain 127 55 -84.48 gain 55 128 -79.65 gain 128 55 -85.24 gain 55 129 -78.98 gain 129 55 -81.77 gain 55 130 -82.04 gain 130 55 -86.13 gain 55 131 -80.35 gain 131 55 -84.21 gain 55 132 -83.52 gain 132 55 -83.39 gain 55 133 -84.13 gain 133 55 -89.18 gain 55 134 -85.12 gain 134 55 -87.03 gain 55 135 -99.72 gain 135 55 -103.93 gain 55 136 -93.24 gain 136 55 -97.90 gain 55 137 -92.60 gain 137 55 -100.17 gain 55 138 -90.68 gain 138 55 -91.78 gain 55 139 -88.27 gain 139 55 -92.64 gain 55 140 -85.63 gain 140 55 -90.82 gain 55 141 -91.15 gain 141 55 -88.32 gain 55 142 -85.83 gain 142 55 -89.73 gain 55 143 -87.20 gain 143 55 -93.84 gain 55 144 -78.80 gain 144 55 -83.81 gain 55 145 -85.35 gain 145 55 -93.75 gain 55 146 -84.09 gain 146 55 -88.47 gain 55 147 -92.92 gain 147 55 -94.41 gain 55 148 -88.00 gain 148 55 -87.82 gain 55 149 -86.18 gain 149 55 -89.66 gain 55 150 -99.02 gain 150 55 -103.34 gain 55 151 -99.71 gain 151 55 -102.97 gain 55 152 -94.73 gain 152 55 -97.80 gain 55 153 -91.79 gain 153 55 -94.08 gain 55 154 -95.20 gain 154 55 -99.38 gain 55 155 -87.57 gain 155 55 -90.33 gain 55 156 -84.79 gain 156 55 -86.79 gain 55 157 -88.68 gain 157 55 -93.16 gain 55 158 -83.80 gain 158 55 -87.77 gain 55 159 -85.83 gain 159 55 -92.19 gain 55 160 -91.99 gain 160 55 -95.50 gain 55 161 -86.15 gain 161 55 -92.11 gain 55 162 -84.32 gain 162 55 -89.98 gain 55 163 -82.27 gain 163 55 -89.85 gain 55 164 -86.04 gain 164 55 -92.98 gain 55 165 -85.15 gain 165 55 -89.15 gain 55 166 -90.96 gain 166 55 -94.71 gain 55 167 -91.96 gain 167 55 -96.44 gain 55 168 -89.77 gain 168 55 -93.14 gain 55 169 -90.55 gain 169 55 -95.04 gain 55 170 -88.39 gain 170 55 -92.11 gain 55 171 -95.46 gain 171 55 -100.26 gain 55 172 -87.47 gain 172 55 -90.46 gain 55 173 -83.40 gain 173 55 -91.04 gain 55 174 -85.86 gain 174 55 -89.55 gain 55 175 -87.85 gain 175 55 -92.67 gain 55 176 -83.92 gain 176 55 -87.71 gain 55 177 -86.41 gain 177 55 -93.20 gain 55 178 -85.90 gain 178 55 -86.14 gain 55 179 -84.16 gain 179 55 -83.82 gain 55 180 -88.04 gain 180 55 -97.14 gain 55 181 -97.11 gain 181 55 -100.24 gain 55 182 -90.53 gain 182 55 -94.74 gain 55 183 -94.93 gain 183 55 -99.42 gain 55 184 -83.39 gain 184 55 -90.63 gain 55 185 -95.35 gain 185 55 -106.45 gain 55 186 -95.94 gain 186 55 -102.61 gain 55 187 -95.52 gain 187 55 -99.92 gain 55 188 -85.56 gain 188 55 -92.38 gain 55 189 -92.12 gain 189 55 -93.66 gain 55 190 -84.32 gain 190 55 -89.78 gain 55 191 -90.85 gain 191 55 -95.02 gain 55 192 -91.41 gain 192 55 -94.27 gain 55 193 -86.89 gain 193 55 -88.74 gain 55 194 -97.16 gain 194 55 -99.79 gain 55 195 -94.12 gain 195 55 -95.30 gain 55 196 -95.38 gain 196 55 -100.87 gain 55 197 -100.94 gain 197 55 -101.56 gain 55 198 -90.31 gain 198 55 -95.45 gain 55 199 -93.62 gain 199 55 -98.86 gain 55 200 -97.41 gain 200 55 -103.99 gain 55 201 -86.16 gain 201 55 -92.65 gain 55 202 -86.91 gain 202 55 -92.53 gain 55 203 -86.32 gain 203 55 -91.05 gain 55 204 -92.80 gain 204 55 -94.18 gain 55 205 -86.80 gain 205 55 -91.92 gain 55 206 -87.90 gain 206 55 -94.12 gain 55 207 -87.85 gain 207 55 -93.50 gain 55 208 -89.18 gain 208 55 -97.43 gain 55 209 -92.52 gain 209 55 -100.34 gain 55 210 -89.91 gain 210 55 -97.91 gain 55 211 -95.99 gain 211 55 -99.22 gain 55 212 -92.99 gain 212 55 -99.23 gain 55 213 -94.26 gain 213 55 -99.83 gain 55 214 -97.58 gain 214 55 -108.53 gain 55 215 -88.61 gain 215 55 -94.96 gain 55 216 -97.16 gain 216 55 -107.42 gain 55 217 -94.11 gain 217 55 -104.64 gain 55 218 -93.91 gain 218 55 -97.24 gain 55 219 -94.40 gain 219 55 -98.21 gain 55 220 -87.59 gain 220 55 -87.49 gain 55 221 -90.78 gain 221 55 -96.36 gain 55 222 -90.75 gain 222 55 -92.13 gain 55 223 -90.97 gain 223 55 -95.60 gain 55 224 -86.76 gain 224 55 -91.85 gain 56 57 -68.74 gain 57 56 -67.82 gain 56 58 -75.17 gain 58 56 -70.94 gain 56 59 -80.84 gain 59 56 -75.87 gain 56 60 -92.41 gain 60 56 -96.72 gain 56 61 -90.68 gain 61 56 -86.89 gain 56 62 -92.06 gain 62 56 -85.78 gain 56 63 -91.59 gain 63 56 -89.28 gain 56 64 -89.92 gain 64 56 -91.83 gain 56 65 -90.31 gain 65 56 -87.77 gain 56 66 -82.21 gain 66 56 -78.65 gain 56 67 -89.65 gain 67 56 -87.33 gain 56 68 -82.58 gain 68 56 -82.84 gain 56 69 -77.39 gain 69 56 -74.87 gain 56 70 -71.91 gain 70 56 -67.86 gain 56 71 -71.97 gain 71 56 -71.48 gain 56 72 -74.59 gain 72 56 -71.66 gain 56 73 -82.64 gain 73 56 -81.08 gain 56 74 -81.67 gain 74 56 -76.23 gain 56 75 -99.26 gain 75 56 -99.71 gain 56 76 -97.66 gain 76 56 -98.23 gain 56 77 -97.55 gain 77 56 -94.12 gain 56 78 -93.47 gain 78 56 -94.54 gain 56 79 -86.92 gain 79 56 -87.61 gain 56 80 -88.86 gain 80 56 -87.34 gain 56 81 -86.46 gain 81 56 -85.84 gain 56 82 -85.74 gain 82 56 -86.10 gain 56 83 -78.48 gain 83 56 -76.12 gain 56 84 -79.14 gain 84 56 -73.96 gain 56 85 -81.72 gain 85 56 -81.98 gain 56 86 -71.93 gain 86 56 -73.82 gain 56 87 -78.22 gain 87 56 -77.40 gain 56 88 -78.97 gain 88 56 -77.79 gain 56 89 -82.53 gain 89 56 -83.49 gain 56 90 -100.32 gain 90 56 -100.63 gain 56 91 -96.50 gain 91 56 -97.88 gain 56 92 -90.85 gain 92 56 -93.14 gain 56 93 -92.81 gain 93 56 -92.46 gain 56 94 -92.80 gain 94 56 -91.02 gain 56 95 -93.02 gain 95 56 -90.47 gain 56 96 -86.88 gain 96 56 -91.31 gain 56 97 -85.27 gain 97 56 -82.52 gain 56 98 -89.42 gain 98 56 -87.14 gain 56 99 -81.07 gain 99 56 -77.92 gain 56 100 -77.03 gain 100 56 -73.80 gain 56 101 -80.49 gain 101 56 -80.89 gain 56 102 -80.49 gain 102 56 -80.86 gain 56 103 -82.92 gain 103 56 -84.46 gain 56 104 -93.68 gain 104 56 -97.71 gain 56 105 -97.62 gain 105 56 -96.16 gain 56 106 -92.57 gain 106 56 -88.45 gain 56 107 -99.88 gain 107 56 -95.66 gain 56 108 -92.28 gain 108 56 -87.67 gain 56 109 -92.35 gain 109 56 -91.20 gain 56 110 -89.85 gain 110 56 -95.06 gain 56 111 -90.78 gain 111 56 -85.96 gain 56 112 -83.52 gain 112 56 -82.16 gain 56 113 -86.70 gain 113 56 -84.47 gain 56 114 -86.76 gain 114 56 -81.70 gain 56 115 -83.91 gain 115 56 -79.50 gain 56 116 -88.83 gain 116 56 -86.86 gain 56 117 -88.97 gain 117 56 -84.14 gain 56 118 -82.77 gain 118 56 -79.56 gain 56 119 -86.42 gain 119 56 -88.27 gain 56 120 -102.42 gain 120 56 -101.65 gain 56 121 -101.89 gain 121 56 -102.14 gain 56 122 -100.65 gain 122 56 -100.66 gain 56 123 -98.79 gain 123 56 -99.14 gain 56 124 -95.77 gain 124 56 -94.10 gain 56 125 -98.41 gain 125 56 -100.08 gain 56 126 -92.26 gain 126 56 -90.58 gain 56 127 -90.77 gain 127 56 -88.72 gain 56 128 -90.10 gain 128 56 -90.64 gain 56 129 -87.79 gain 129 56 -85.54 gain 56 130 -90.31 gain 130 56 -89.35 gain 56 131 -88.29 gain 131 56 -87.11 gain 56 132 -90.70 gain 132 56 -85.53 gain 56 133 -91.77 gain 133 56 -91.77 gain 56 134 -86.72 gain 134 56 -83.59 gain 56 135 -98.35 gain 135 56 -97.52 gain 56 136 -99.00 gain 136 56 -98.61 gain 56 137 -98.30 gain 137 56 -100.82 gain 56 138 -92.41 gain 138 56 -88.46 gain 56 139 -96.75 gain 139 56 -96.06 gain 56 140 -95.12 gain 140 56 -95.26 gain 56 141 -95.37 gain 141 56 -87.48 gain 56 142 -91.28 gain 142 56 -90.14 gain 56 143 -96.63 gain 143 56 -98.22 gain 56 144 -92.63 gain 144 56 -92.59 gain 56 145 -90.29 gain 145 56 -93.64 gain 56 146 -84.95 gain 146 56 -84.29 gain 56 147 -82.95 gain 147 56 -79.39 gain 56 148 -81.73 gain 148 56 -76.50 gain 56 149 -92.32 gain 149 56 -90.75 gain 56 150 -88.60 gain 150 56 -87.86 gain 56 151 -101.78 gain 151 56 -99.99 gain 56 152 -95.29 gain 152 56 -93.31 gain 56 153 -102.97 gain 153 56 -100.20 gain 56 154 -101.49 gain 154 56 -100.63 gain 56 155 -86.61 gain 155 56 -84.32 gain 56 156 -94.40 gain 156 56 -91.35 gain 56 157 -96.39 gain 157 56 -95.82 gain 56 158 -97.77 gain 158 56 -96.70 gain 56 159 -94.27 gain 159 56 -95.58 gain 56 160 -90.18 gain 160 56 -88.65 gain 56 161 -89.80 gain 161 56 -90.70 gain 56 162 -89.34 gain 162 56 -89.95 gain 56 163 -92.12 gain 163 56 -94.65 gain 56 164 -96.95 gain 164 56 -98.85 gain 56 165 -102.17 gain 165 56 -101.13 gain 56 166 -95.84 gain 166 56 -94.54 gain 56 167 -100.79 gain 167 56 -100.22 gain 56 168 -98.12 gain 168 56 -96.44 gain 56 169 -97.37 gain 169 56 -96.81 gain 56 170 -94.16 gain 170 56 -92.83 gain 56 171 -99.67 gain 171 56 -99.42 gain 56 172 -93.42 gain 172 56 -91.36 gain 56 173 -95.23 gain 173 56 -97.82 gain 56 174 -91.50 gain 174 56 -90.14 gain 56 175 -90.29 gain 175 56 -90.06 gain 56 176 -95.67 gain 176 56 -94.41 gain 56 177 -93.21 gain 177 56 -94.95 gain 56 178 -96.21 gain 178 56 -91.40 gain 56 179 -92.48 gain 179 56 -87.09 gain 56 180 -102.70 gain 180 56 -106.75 gain 56 181 -101.85 gain 181 56 -99.93 gain 56 182 -104.53 gain 182 56 -103.69 gain 56 183 -96.21 gain 183 56 -95.64 gain 56 184 -98.64 gain 184 56 -100.82 gain 56 185 -93.60 gain 185 56 -99.66 gain 56 186 -91.53 gain 186 56 -93.16 gain 56 187 -98.72 gain 187 56 -98.08 gain 56 188 -96.36 gain 188 56 -98.13 gain 56 189 -96.44 gain 189 56 -92.94 gain 56 190 -85.73 gain 190 56 -86.14 gain 56 191 -95.93 gain 191 56 -95.05 gain 56 192 -98.13 gain 192 56 -95.94 gain 56 193 -93.97 gain 193 56 -90.77 gain 56 194 -93.10 gain 194 56 -90.69 gain 56 195 -96.88 gain 195 56 -93.01 gain 56 196 -101.79 gain 196 56 -102.23 gain 56 197 -99.03 gain 197 56 -94.60 gain 56 198 -101.26 gain 198 56 -101.35 gain 56 199 -102.68 gain 199 56 -102.87 gain 56 200 -95.75 gain 200 56 -97.28 gain 56 201 -97.86 gain 201 56 -99.30 gain 56 202 -94.33 gain 202 56 -94.90 gain 56 203 -95.99 gain 203 56 -95.67 gain 56 204 -95.12 gain 204 56 -91.45 gain 56 205 -96.34 gain 205 56 -96.41 gain 56 206 -96.53 gain 206 56 -97.71 gain 56 207 -94.87 gain 207 56 -95.47 gain 56 208 -102.13 gain 208 56 -105.33 gain 56 209 -98.23 gain 209 56 -101.01 gain 56 210 -100.12 gain 210 56 -103.07 gain 56 211 -100.26 gain 211 56 -98.44 gain 56 212 -100.62 gain 212 56 -101.81 gain 56 213 -103.99 gain 213 56 -104.51 gain 56 214 -95.54 gain 214 56 -101.45 gain 56 215 -98.86 gain 215 56 -100.16 gain 56 216 -95.38 gain 216 56 -100.60 gain 56 217 -95.56 gain 217 56 -101.04 gain 56 218 -91.82 gain 218 56 -90.10 gain 56 219 -89.50 gain 219 56 -88.27 gain 56 220 -108.65 gain 220 56 -103.51 gain 56 221 -100.17 gain 221 56 -100.71 gain 56 222 -96.95 gain 222 56 -93.29 gain 56 223 -93.77 gain 223 56 -93.35 gain 56 224 -93.47 gain 224 56 -93.52 gain 57 58 -60.85 gain 58 57 -57.55 gain 57 59 -81.94 gain 59 57 -77.89 gain 57 60 -112.44 gain 60 57 -117.67 gain 57 61 -100.65 gain 61 57 -97.78 gain 57 62 -95.36 gain 62 57 -90.00 gain 57 63 -96.71 gain 63 57 -95.32 gain 57 64 -87.22 gain 64 57 -90.05 gain 57 65 -87.25 gain 65 57 -85.63 gain 57 66 -81.87 gain 66 57 -79.23 gain 57 67 -90.28 gain 67 57 -88.88 gain 57 68 -81.00 gain 68 57 -82.19 gain 57 69 -72.99 gain 69 57 -71.39 gain 57 70 -75.99 gain 70 57 -72.85 gain 57 71 -64.18 gain 71 57 -64.61 gain 57 72 -67.94 gain 72 57 -65.93 gain 57 73 -78.18 gain 73 57 -77.54 gain 57 74 -75.72 gain 74 57 -71.19 gain 57 75 -93.38 gain 75 57 -94.75 gain 57 76 -93.91 gain 76 57 -95.39 gain 57 77 -96.91 gain 77 57 -94.40 gain 57 78 -89.70 gain 78 57 -91.68 gain 57 79 -97.93 gain 79 57 -99.53 gain 57 80 -90.24 gain 80 57 -89.64 gain 57 81 -93.94 gain 81 57 -94.25 gain 57 82 -87.85 gain 82 57 -89.14 gain 57 83 -87.37 gain 83 57 -85.92 gain 57 84 -81.31 gain 84 57 -77.05 gain 57 85 -76.63 gain 85 57 -77.80 gain 57 86 -79.35 gain 86 57 -82.16 gain 57 87 -69.13 gain 87 57 -69.23 gain 57 88 -78.88 gain 88 57 -78.61 gain 57 89 -74.14 gain 89 57 -76.02 gain 57 90 -95.70 gain 90 57 -96.93 gain 57 91 -88.49 gain 91 57 -90.78 gain 57 92 -95.35 gain 92 57 -98.56 gain 57 93 -94.55 gain 93 57 -95.11 gain 57 94 -93.14 gain 94 57 -92.27 gain 57 95 -88.98 gain 95 57 -87.36 gain 57 96 -85.19 gain 96 57 -90.54 gain 57 97 -91.75 gain 97 57 -89.92 gain 57 98 -88.93 gain 98 57 -87.57 gain 57 99 -87.99 gain 99 57 -85.77 gain 57 100 -79.30 gain 100 57 -76.99 gain 57 101 -75.70 gain 101 57 -77.02 gain 57 102 -70.90 gain 102 57 -72.19 gain 57 103 -78.72 gain 103 57 -81.18 gain 57 104 -81.41 gain 104 57 -86.35 gain 57 105 -98.15 gain 105 57 -97.61 gain 57 106 -95.97 gain 106 57 -92.76 gain 57 107 -95.31 gain 107 57 -92.01 gain 57 108 -89.18 gain 108 57 -85.50 gain 57 109 -93.49 gain 109 57 -93.25 gain 57 110 -94.81 gain 110 57 -100.93 gain 57 111 -85.66 gain 111 57 -81.76 gain 57 112 -87.82 gain 112 57 -87.38 gain 57 113 -88.82 gain 113 57 -87.50 gain 57 114 -87.31 gain 114 57 -83.16 gain 57 115 -87.97 gain 115 57 -84.48 gain 57 116 -85.83 gain 116 57 -84.77 gain 57 117 -84.57 gain 117 57 -80.66 gain 57 118 -81.76 gain 118 57 -79.47 gain 57 119 -87.01 gain 119 57 -89.77 gain 57 120 -103.52 gain 120 57 -103.67 gain 57 121 -103.97 gain 121 57 -105.15 gain 57 122 -96.22 gain 122 57 -97.14 gain 57 123 -102.18 gain 123 57 -103.45 gain 57 124 -94.54 gain 124 57 -93.80 gain 57 125 -94.18 gain 125 57 -96.77 gain 57 126 -90.77 gain 126 57 -90.00 gain 57 127 -97.14 gain 127 57 -96.01 gain 57 128 -87.80 gain 128 57 -89.26 gain 57 129 -93.19 gain 129 57 -91.86 gain 57 130 -84.36 gain 130 57 -84.32 gain 57 131 -84.24 gain 131 57 -83.98 gain 57 132 -79.98 gain 132 57 -75.72 gain 57 133 -89.05 gain 133 57 -89.97 gain 57 134 -86.72 gain 134 57 -84.50 gain 57 135 -97.27 gain 135 57 -97.35 gain 57 136 -98.91 gain 136 57 -99.44 gain 57 137 -94.03 gain 137 57 -97.47 gain 57 138 -93.67 gain 138 57 -90.64 gain 57 139 -90.14 gain 139 57 -90.37 gain 57 140 -90.91 gain 140 57 -91.98 gain 57 141 -93.11 gain 141 57 -86.15 gain 57 142 -92.13 gain 142 57 -91.90 gain 57 143 -89.04 gain 143 57 -91.55 gain 57 144 -91.51 gain 144 57 -92.39 gain 57 145 -95.14 gain 145 57 -99.41 gain 57 146 -91.18 gain 146 57 -91.44 gain 57 147 -87.78 gain 147 57 -85.14 gain 57 148 -93.94 gain 148 57 -89.64 gain 57 149 -95.85 gain 149 57 -95.20 gain 57 150 -95.84 gain 150 57 -96.02 gain 57 151 -91.40 gain 151 57 -90.53 gain 57 152 -99.96 gain 152 57 -98.91 gain 57 153 -97.78 gain 153 57 -95.94 gain 57 154 -95.42 gain 154 57 -95.48 gain 57 155 -90.01 gain 155 57 -88.64 gain 57 156 -92.41 gain 156 57 -90.27 gain 57 157 -94.87 gain 157 57 -95.22 gain 57 158 -98.33 gain 158 57 -98.18 gain 57 159 -93.25 gain 159 57 -95.48 gain 57 160 -88.87 gain 160 57 -88.25 gain 57 161 -89.95 gain 161 57 -91.77 gain 57 162 -85.51 gain 162 57 -87.04 gain 57 163 -91.03 gain 163 57 -94.47 gain 57 164 -89.29 gain 164 57 -92.10 gain 57 165 -95.39 gain 165 57 -95.26 gain 57 166 -102.41 gain 166 57 -102.03 gain 57 167 -102.63 gain 167 57 -102.97 gain 57 168 -102.03 gain 168 57 -101.28 gain 57 169 -95.29 gain 169 57 -95.64 gain 57 170 -98.67 gain 170 57 -98.26 gain 57 171 -92.83 gain 171 57 -93.50 gain 57 172 -88.30 gain 172 57 -87.16 gain 57 173 -93.53 gain 173 57 -97.04 gain 57 174 -85.32 gain 174 57 -84.87 gain 57 175 -97.93 gain 175 57 -98.62 gain 57 176 -94.30 gain 176 57 -93.96 gain 57 177 -88.07 gain 177 57 -90.73 gain 57 178 -93.37 gain 178 57 -89.47 gain 57 179 -85.47 gain 179 57 -80.99 gain 57 180 -98.12 gain 180 57 -103.10 gain 57 181 -98.18 gain 181 57 -97.18 gain 57 182 -97.86 gain 182 57 -97.94 gain 57 183 -107.17 gain 183 57 -107.53 gain 57 184 -96.01 gain 184 57 -99.12 gain 57 185 -99.84 gain 185 57 -106.81 gain 57 186 -100.19 gain 186 57 -102.74 gain 57 187 -94.75 gain 187 57 -95.03 gain 57 188 -101.84 gain 188 57 -104.53 gain 57 189 -98.88 gain 189 57 -96.30 gain 57 190 -92.78 gain 190 57 -94.12 gain 57 191 -93.35 gain 191 57 -93.39 gain 57 192 -84.19 gain 192 57 -82.93 gain 57 193 -90.77 gain 193 57 -88.49 gain 57 194 -88.83 gain 194 57 -87.33 gain 57 195 -104.47 gain 195 57 -101.52 gain 57 196 -94.52 gain 196 57 -95.88 gain 57 197 -99.40 gain 197 57 -95.90 gain 57 198 -108.39 gain 198 57 -109.39 gain 57 199 -100.30 gain 199 57 -101.41 gain 57 200 -99.15 gain 200 57 -101.60 gain 57 201 -91.49 gain 201 57 -93.85 gain 57 202 -91.38 gain 202 57 -92.88 gain 57 203 -103.06 gain 203 57 -103.66 gain 57 204 -107.46 gain 204 57 -104.71 gain 57 205 -88.02 gain 205 57 -89.01 gain 57 206 -94.35 gain 206 57 -96.45 gain 57 207 -95.88 gain 207 57 -97.40 gain 57 208 -95.28 gain 208 57 -99.40 gain 57 209 -99.61 gain 209 57 -103.30 gain 57 210 -101.41 gain 210 57 -105.28 gain 57 211 -103.99 gain 211 57 -103.09 gain 57 212 -93.31 gain 212 57 -95.42 gain 57 213 -103.85 gain 213 57 -105.29 gain 57 214 -100.09 gain 214 57 -106.92 gain 57 215 -99.05 gain 215 57 -101.27 gain 57 216 -100.40 gain 216 57 -106.53 gain 57 217 -99.82 gain 217 57 -106.22 gain 57 218 -100.47 gain 218 57 -99.67 gain 57 219 -100.39 gain 219 57 -100.08 gain 57 220 -93.19 gain 220 57 -88.96 gain 57 221 -95.43 gain 221 57 -96.89 gain 57 222 -92.95 gain 222 57 -90.21 gain 57 223 -99.36 gain 223 57 -99.86 gain 57 224 -99.23 gain 224 57 -100.20 gain 58 59 -56.55 gain 59 58 -55.81 gain 58 60 -90.99 gain 60 58 -99.52 gain 58 61 -90.71 gain 61 58 -91.15 gain 58 62 -88.04 gain 62 58 -85.99 gain 58 63 -92.87 gain 63 58 -94.78 gain 58 64 -89.08 gain 64 58 -95.22 gain 58 65 -81.34 gain 65 58 -83.03 gain 58 66 -88.23 gain 66 58 -88.90 gain 58 67 -89.09 gain 67 58 -90.99 gain 58 68 -78.57 gain 68 58 -83.06 gain 58 69 -83.10 gain 69 58 -84.80 gain 58 70 -76.15 gain 70 58 -76.32 gain 58 71 -68.69 gain 71 58 -72.43 gain 58 72 -65.53 gain 72 58 -66.82 gain 58 73 -63.12 gain 73 58 -65.79 gain 58 74 -63.97 gain 74 58 -62.75 gain 58 75 -86.39 gain 75 58 -91.06 gain 58 76 -89.69 gain 76 58 -94.48 gain 58 77 -97.33 gain 77 58 -98.12 gain 58 78 -90.85 gain 78 58 -96.14 gain 58 79 -89.04 gain 79 58 -93.95 gain 58 80 -90.95 gain 80 58 -93.65 gain 58 81 -87.19 gain 81 58 -90.80 gain 58 82 -83.65 gain 82 58 -88.24 gain 58 83 -83.01 gain 83 58 -84.87 gain 58 84 -83.38 gain 84 58 -82.43 gain 58 85 -76.53 gain 85 58 -81.00 gain 58 86 -71.85 gain 86 58 -77.97 gain 58 87 -76.19 gain 87 58 -79.59 gain 58 88 -78.59 gain 88 58 -81.64 gain 58 89 -73.88 gain 89 58 -79.07 gain 58 90 -92.87 gain 90 58 -97.40 gain 58 91 -93.39 gain 91 58 -98.99 gain 58 92 -95.33 gain 92 58 -101.84 gain 58 93 -98.35 gain 93 58 -102.22 gain 58 94 -95.63 gain 94 58 -98.07 gain 58 95 -84.70 gain 95 58 -86.38 gain 58 96 -88.21 gain 96 58 -96.86 gain 58 97 -95.70 gain 97 58 -97.18 gain 58 98 -85.25 gain 98 58 -87.20 gain 58 99 -83.51 gain 99 58 -84.59 gain 58 100 -81.68 gain 100 58 -82.68 gain 58 101 -80.05 gain 101 58 -84.68 gain 58 102 -75.90 gain 102 58 -80.49 gain 58 103 -70.14 gain 103 58 -75.91 gain 58 104 -82.00 gain 104 58 -90.25 gain 58 105 -93.98 gain 105 58 -96.75 gain 58 106 -96.77 gain 106 58 -96.87 gain 58 107 -89.12 gain 107 58 -89.12 gain 58 108 -96.36 gain 108 58 -95.98 gain 58 109 -93.12 gain 109 58 -96.20 gain 58 110 -96.92 gain 110 58 -106.36 gain 58 111 -87.40 gain 111 58 -86.80 gain 58 112 -90.81 gain 112 58 -93.67 gain 58 113 -94.51 gain 113 58 -96.50 gain 58 114 -84.40 gain 114 58 -83.56 gain 58 115 -89.33 gain 115 58 -89.15 gain 58 116 -76.47 gain 116 58 -78.72 gain 58 117 -84.57 gain 117 58 -83.96 gain 58 118 -85.07 gain 118 58 -86.08 gain 58 119 -79.85 gain 119 58 -85.93 gain 58 120 -102.63 gain 120 58 -106.08 gain 58 121 -97.24 gain 121 58 -101.71 gain 58 122 -93.96 gain 122 58 -98.19 gain 58 123 -87.42 gain 123 58 -91.99 gain 58 124 -93.98 gain 124 58 -96.54 gain 58 125 -87.65 gain 125 58 -93.55 gain 58 126 -87.48 gain 126 58 -90.03 gain 58 127 -89.24 gain 127 58 -91.41 gain 58 128 -87.16 gain 128 58 -91.92 gain 58 129 -87.51 gain 129 58 -89.49 gain 58 130 -86.13 gain 130 58 -89.39 gain 58 131 -82.03 gain 131 58 -85.07 gain 58 132 -85.97 gain 132 58 -85.02 gain 58 133 -82.67 gain 133 58 -86.89 gain 58 134 -85.17 gain 134 58 -86.26 gain 58 135 -95.59 gain 135 58 -98.98 gain 58 136 -97.35 gain 136 58 -101.18 gain 58 137 -95.59 gain 137 58 -102.33 gain 58 138 -90.46 gain 138 58 -90.74 gain 58 139 -93.83 gain 139 58 -97.38 gain 58 140 -92.90 gain 140 58 -97.27 gain 58 141 -94.31 gain 141 58 -90.65 gain 58 142 -91.53 gain 142 58 -94.62 gain 58 143 -86.13 gain 143 58 -91.95 gain 58 144 -88.81 gain 144 58 -93.00 gain 58 145 -85.07 gain 145 58 -92.64 gain 58 146 -90.36 gain 146 58 -93.93 gain 58 147 -91.28 gain 147 58 -91.95 gain 58 148 -88.20 gain 148 58 -87.20 gain 58 149 -79.65 gain 149 58 -82.30 gain 58 150 -96.52 gain 150 58 -100.01 gain 58 151 -95.91 gain 151 58 -98.34 gain 58 152 -94.40 gain 152 58 -96.65 gain 58 153 -92.42 gain 153 58 -93.89 gain 58 154 -89.27 gain 154 58 -92.63 gain 58 155 -93.78 gain 155 58 -95.72 gain 58 156 -87.45 gain 156 58 -88.63 gain 58 157 -85.51 gain 157 58 -89.16 gain 58 158 -78.08 gain 158 58 -81.23 gain 58 159 -94.48 gain 159 58 -100.02 gain 58 160 -88.32 gain 160 58 -91.01 gain 58 161 -80.92 gain 161 58 -86.05 gain 58 162 -89.00 gain 162 58 -93.84 gain 58 163 -88.10 gain 163 58 -94.85 gain 58 164 -89.09 gain 164 58 -95.21 gain 58 165 -90.94 gain 165 58 -94.12 gain 58 166 -99.42 gain 166 58 -102.35 gain 58 167 -84.28 gain 167 58 -87.93 gain 58 168 -97.14 gain 168 58 -99.69 gain 58 169 -97.83 gain 169 58 -101.50 gain 58 170 -96.50 gain 170 58 -99.39 gain 58 171 -94.33 gain 171 58 -98.31 gain 58 172 -85.01 gain 172 58 -87.17 gain 58 173 -89.42 gain 173 58 -96.23 gain 58 174 -89.73 gain 174 58 -92.59 gain 58 175 -97.58 gain 175 58 -101.58 gain 58 176 -95.90 gain 176 58 -98.86 gain 58 177 -87.01 gain 177 58 -92.98 gain 58 178 -87.03 gain 178 58 -86.44 gain 58 179 -89.74 gain 179 58 -88.57 gain 58 180 -93.62 gain 180 58 -101.90 gain 58 181 -97.12 gain 181 58 -99.43 gain 58 182 -94.07 gain 182 58 -97.46 gain 58 183 -96.09 gain 183 58 -99.75 gain 58 184 -96.16 gain 184 58 -102.57 gain 58 185 -93.51 gain 185 58 -103.79 gain 58 186 -89.91 gain 186 58 -95.76 gain 58 187 -93.31 gain 187 58 -96.89 gain 58 188 -98.16 gain 188 58 -104.15 gain 58 189 -90.17 gain 189 58 -90.89 gain 58 190 -95.58 gain 190 58 -100.22 gain 58 191 -89.73 gain 191 58 -93.08 gain 58 192 -89.59 gain 192 58 -91.63 gain 58 193 -87.70 gain 193 58 -88.73 gain 58 194 -91.44 gain 194 58 -93.25 gain 58 195 -99.78 gain 195 58 -100.13 gain 58 196 -101.34 gain 196 58 -106.01 gain 58 197 -88.72 gain 197 58 -88.53 gain 58 198 -100.60 gain 198 58 -104.92 gain 58 199 -96.28 gain 199 58 -100.70 gain 58 200 -94.71 gain 200 58 -100.47 gain 58 201 -94.47 gain 201 58 -100.14 gain 58 202 -93.49 gain 202 58 -98.29 gain 58 203 -97.03 gain 203 58 -100.94 gain 58 204 -96.56 gain 204 58 -97.12 gain 58 205 -87.16 gain 205 58 -91.46 gain 58 206 -90.21 gain 206 58 -95.62 gain 58 207 -92.27 gain 207 58 -97.10 gain 58 208 -90.78 gain 208 58 -98.21 gain 58 209 -94.54 gain 209 58 -101.53 gain 58 210 -96.14 gain 210 58 -103.31 gain 58 211 -102.43 gain 211 58 -104.84 gain 58 212 -98.83 gain 212 58 -104.24 gain 58 213 -95.77 gain 213 58 -100.51 gain 58 214 -95.09 gain 214 58 -105.22 gain 58 215 -99.12 gain 215 58 -104.66 gain 58 216 -94.16 gain 216 58 -103.61 gain 58 217 -90.72 gain 217 58 -100.42 gain 58 218 -93.59 gain 218 58 -96.10 gain 58 219 -92.61 gain 219 58 -95.61 gain 58 220 -91.89 gain 220 58 -90.97 gain 58 221 -94.23 gain 221 58 -98.99 gain 58 222 -86.99 gain 222 58 -87.56 gain 58 223 -96.67 gain 223 58 -100.48 gain 58 224 -93.29 gain 224 58 -97.56 gain 59 60 -95.07 gain 60 59 -104.35 gain 59 61 -91.46 gain 61 59 -92.65 gain 59 62 -94.65 gain 62 59 -93.34 gain 59 63 -95.08 gain 63 59 -97.74 gain 59 64 -95.80 gain 64 59 -102.68 gain 59 65 -88.01 gain 65 59 -90.45 gain 59 66 -93.33 gain 66 59 -94.74 gain 59 67 -87.83 gain 67 59 -90.48 gain 59 68 -89.42 gain 68 59 -94.65 gain 59 69 -83.24 gain 69 59 -85.68 gain 59 70 -83.93 gain 70 59 -84.84 gain 59 71 -68.15 gain 71 59 -72.63 gain 59 72 -71.04 gain 72 59 -73.08 gain 59 73 -72.28 gain 73 59 -75.69 gain 59 74 -62.04 gain 74 59 -61.56 gain 59 75 -100.08 gain 75 59 -105.50 gain 59 76 -88.12 gain 76 59 -93.66 gain 59 77 -94.66 gain 77 59 -96.20 gain 59 78 -94.95 gain 78 59 -100.99 gain 59 79 -93.09 gain 79 59 -98.75 gain 59 80 -90.41 gain 80 59 -93.86 gain 59 81 -90.74 gain 81 59 -95.10 gain 59 82 -86.34 gain 82 59 -91.68 gain 59 83 -79.49 gain 83 59 -82.10 gain 59 84 -84.82 gain 84 59 -84.61 gain 59 85 -82.58 gain 85 59 -87.81 gain 59 86 -80.82 gain 86 59 -87.69 gain 59 87 -78.57 gain 87 59 -82.72 gain 59 88 -65.21 gain 88 59 -69.00 gain 59 89 -67.22 gain 89 59 -73.16 gain 59 90 -95.27 gain 90 59 -100.55 gain 59 91 -96.12 gain 91 59 -102.46 gain 59 92 -91.33 gain 92 59 -98.60 gain 59 93 -100.70 gain 93 59 -105.32 gain 59 94 -89.11 gain 94 59 -92.30 gain 59 95 -90.45 gain 95 59 -92.88 gain 59 96 -87.34 gain 96 59 -96.74 gain 59 97 -89.15 gain 97 59 -91.38 gain 59 98 -80.68 gain 98 59 -83.37 gain 59 99 -81.20 gain 99 59 -83.03 gain 59 100 -80.88 gain 100 59 -82.63 gain 59 101 -77.40 gain 101 59 -82.78 gain 59 102 -71.13 gain 102 59 -76.47 gain 59 103 -80.84 gain 103 59 -87.35 gain 59 104 -73.84 gain 104 59 -82.83 gain 59 105 -95.90 gain 105 59 -99.42 gain 59 106 -91.51 gain 106 59 -92.36 gain 59 107 -98.49 gain 107 59 -99.24 gain 59 108 -90.20 gain 108 59 -90.57 gain 59 109 -91.21 gain 109 59 -95.03 gain 59 110 -96.54 gain 110 59 -106.72 gain 59 111 -87.09 gain 111 59 -87.24 gain 59 112 -80.19 gain 112 59 -83.80 gain 59 113 -80.40 gain 113 59 -83.14 gain 59 114 -80.93 gain 114 59 -80.84 gain 59 115 -87.39 gain 115 59 -87.95 gain 59 116 -85.57 gain 116 59 -88.56 gain 59 117 -78.46 gain 117 59 -78.59 gain 59 118 -82.36 gain 118 59 -84.11 gain 59 119 -72.83 gain 119 59 -79.65 gain 59 120 -98.73 gain 120 59 -102.93 gain 59 121 -107.29 gain 121 59 -112.52 gain 59 122 -101.03 gain 122 59 -106.01 gain 59 123 -98.10 gain 123 59 -103.41 gain 59 124 -94.51 gain 124 59 -97.82 gain 59 125 -90.16 gain 125 59 -96.80 gain 59 126 -91.94 gain 126 59 -95.23 gain 59 127 -96.05 gain 127 59 -98.96 gain 59 128 -90.57 gain 128 59 -96.08 gain 59 129 -81.66 gain 129 59 -84.38 gain 59 130 -85.21 gain 130 59 -89.22 gain 59 131 -94.52 gain 131 59 -98.30 gain 59 132 -85.70 gain 132 59 -85.49 gain 59 133 -83.21 gain 133 59 -88.18 gain 59 134 -86.50 gain 134 59 -88.33 gain 59 135 -93.54 gain 135 59 -97.67 gain 59 136 -88.47 gain 136 59 -93.04 gain 59 137 -95.79 gain 137 59 -103.28 gain 59 138 -90.09 gain 138 59 -91.11 gain 59 139 -91.44 gain 139 59 -95.73 gain 59 140 -86.97 gain 140 59 -92.09 gain 59 141 -91.49 gain 141 59 -88.57 gain 59 142 -90.74 gain 142 59 -94.57 gain 59 143 -90.66 gain 143 59 -97.22 gain 59 144 -80.12 gain 144 59 -85.05 gain 59 145 -100.73 gain 145 59 -109.05 gain 59 146 -85.14 gain 146 59 -89.45 gain 59 147 -78.96 gain 147 59 -80.38 gain 59 148 -80.60 gain 148 59 -80.34 gain 59 149 -83.03 gain 149 59 -86.44 gain 59 150 -95.09 gain 150 59 -99.33 gain 59 151 -100.90 gain 151 59 -104.08 gain 59 152 -91.60 gain 152 59 -94.60 gain 59 153 -102.24 gain 153 59 -104.45 gain 59 154 -96.58 gain 154 59 -100.69 gain 59 155 -91.59 gain 155 59 -94.27 gain 59 156 -95.82 gain 156 59 -97.73 gain 59 157 -88.38 gain 157 59 -92.77 gain 59 158 -88.24 gain 158 59 -92.14 gain 59 159 -89.98 gain 159 59 -96.26 gain 59 160 -85.39 gain 160 59 -88.83 gain 59 161 -87.05 gain 161 59 -92.93 gain 59 162 -81.31 gain 162 59 -86.90 gain 59 163 -88.70 gain 163 59 -96.20 gain 59 164 -92.41 gain 164 59 -99.28 gain 59 165 -93.60 gain 165 59 -97.53 gain 59 166 -93.40 gain 166 59 -97.08 gain 59 167 -95.29 gain 167 59 -99.69 gain 59 168 -93.60 gain 168 59 -96.90 gain 59 169 -86.94 gain 169 59 -91.35 gain 59 170 -92.72 gain 170 59 -96.36 gain 59 171 -88.49 gain 171 59 -93.21 gain 59 172 -95.52 gain 172 59 -98.43 gain 59 173 -87.71 gain 173 59 -95.27 gain 59 174 -90.40 gain 174 59 -94.00 gain 59 175 -85.79 gain 175 59 -90.53 gain 59 176 -84.13 gain 176 59 -87.85 gain 59 177 -90.47 gain 177 59 -97.19 gain 59 178 -95.73 gain 178 59 -95.89 gain 59 179 -85.28 gain 179 59 -84.86 gain 59 180 -100.23 gain 180 59 -109.25 gain 59 181 -94.81 gain 181 59 -97.86 gain 59 182 -99.49 gain 182 59 -103.63 gain 59 183 -98.47 gain 183 59 -102.88 gain 59 184 -92.82 gain 184 59 -99.98 gain 59 185 -92.38 gain 185 59 -103.40 gain 59 186 -86.02 gain 186 59 -92.62 gain 59 187 -86.95 gain 187 59 -91.28 gain 59 188 -85.10 gain 188 59 -91.85 gain 59 189 -92.34 gain 189 59 -93.81 gain 59 190 -87.48 gain 190 59 -92.87 gain 59 191 -95.63 gain 191 59 -99.72 gain 59 192 -89.28 gain 192 59 -92.07 gain 59 193 -90.20 gain 193 59 -91.97 gain 59 194 -91.04 gain 194 59 -93.60 gain 59 195 -99.14 gain 195 59 -100.24 gain 59 196 -96.55 gain 196 59 -101.97 gain 59 197 -102.49 gain 197 59 -103.04 gain 59 198 -97.31 gain 198 59 -102.37 gain 59 199 -92.41 gain 199 59 -97.57 gain 59 200 -91.87 gain 200 59 -98.38 gain 59 201 -91.65 gain 201 59 -98.07 gain 59 202 -92.03 gain 202 59 -97.57 gain 59 203 -91.57 gain 203 59 -96.23 gain 59 204 -98.46 gain 204 59 -99.76 gain 59 205 -88.47 gain 205 59 -93.51 gain 59 206 -93.82 gain 206 59 -99.97 gain 59 207 -92.09 gain 207 59 -97.66 gain 59 208 -86.63 gain 208 59 -94.80 gain 59 209 -94.62 gain 209 59 -102.36 gain 59 210 -85.56 gain 210 59 -93.48 gain 59 211 -88.58 gain 211 59 -91.73 gain 59 212 -100.74 gain 212 59 -106.90 gain 59 213 -92.04 gain 213 59 -97.53 gain 59 214 -97.48 gain 214 59 -108.36 gain 59 215 -93.10 gain 215 59 -99.38 gain 59 216 -99.26 gain 216 59 -109.45 gain 59 217 -85.48 gain 217 59 -95.94 gain 59 218 -93.76 gain 218 59 -97.01 gain 59 219 -97.38 gain 219 59 -101.12 gain 59 220 -96.44 gain 220 59 -96.26 gain 59 221 -87.81 gain 221 59 -93.32 gain 59 222 -94.78 gain 222 59 -96.09 gain 59 223 -97.01 gain 223 59 -101.56 gain 59 224 -91.65 gain 224 59 -96.67 gain 60 61 -65.59 gain 61 60 -57.49 gain 60 62 -77.18 gain 62 60 -66.59 gain 60 63 -77.37 gain 63 60 -70.75 gain 60 64 -92.19 gain 64 60 -89.79 gain 60 65 -93.30 gain 65 60 -86.45 gain 60 66 -96.22 gain 66 60 -88.35 gain 60 67 -95.72 gain 67 60 -89.08 gain 60 68 -98.54 gain 68 60 -94.49 gain 60 69 -97.95 gain 69 60 -91.11 gain 60 70 -102.00 gain 70 60 -93.63 gain 60 71 -100.62 gain 71 60 -95.82 gain 60 72 -106.26 gain 72 60 -99.02 gain 60 73 -99.18 gain 73 60 -93.31 gain 60 74 -107.92 gain 74 60 -98.17 gain 60 75 -67.55 gain 75 60 -63.69 gain 60 76 -71.80 gain 76 60 -68.06 gain 60 77 -74.24 gain 77 60 -66.50 gain 60 78 -85.19 gain 78 60 -81.95 gain 60 79 -95.62 gain 79 60 -92.00 gain 60 80 -92.82 gain 80 60 -86.99 gain 60 81 -94.35 gain 81 60 -89.43 gain 60 82 -98.22 gain 82 60 -94.28 gain 60 83 -91.79 gain 83 60 -85.12 gain 60 84 -95.33 gain 84 60 -85.85 gain 60 85 -88.03 gain 85 60 -83.97 gain 60 86 -101.15 gain 86 60 -98.73 gain 60 87 -102.17 gain 87 60 -97.04 gain 60 88 -107.36 gain 88 60 -101.87 gain 60 89 -99.48 gain 89 60 -96.14 gain 60 90 -79.73 gain 90 60 -75.73 gain 60 91 -82.26 gain 91 60 -79.32 gain 60 92 -74.62 gain 92 60 -72.60 gain 60 93 -85.57 gain 93 60 -80.91 gain 60 94 -89.45 gain 94 60 -83.36 gain 60 95 -90.72 gain 95 60 -83.87 gain 60 96 -95.22 gain 96 60 -95.33 gain 60 97 -98.51 gain 97 60 -91.46 gain 60 98 -96.34 gain 98 60 -89.75 gain 60 99 -105.02 gain 99 60 -97.57 gain 60 100 -100.81 gain 100 60 -93.28 gain 60 101 -98.32 gain 101 60 -94.41 gain 60 102 -97.11 gain 102 60 -93.17 gain 60 103 -110.09 gain 103 60 -107.32 gain 60 104 -105.65 gain 104 60 -105.37 gain 60 105 -82.82 gain 105 60 -77.06 gain 60 106 -85.49 gain 106 60 -77.06 gain 60 107 -84.36 gain 107 60 -75.83 gain 60 108 -93.80 gain 108 60 -84.89 gain 60 109 -91.87 gain 109 60 -86.41 gain 60 110 -87.04 gain 110 60 -87.94 gain 60 111 -91.48 gain 111 60 -82.35 gain 60 112 -103.42 gain 112 60 -97.76 gain 60 113 -98.05 gain 113 60 -91.51 gain 60 114 -98.10 gain 114 60 -88.73 gain 60 115 -92.47 gain 115 60 -83.75 gain 60 116 -103.65 gain 116 60 -97.36 gain 60 117 -102.78 gain 117 60 -93.64 gain 60 118 -106.66 gain 118 60 -99.14 gain 60 119 -108.22 gain 119 60 -105.76 gain 60 120 -91.10 gain 120 60 -86.02 gain 60 121 -86.49 gain 121 60 -82.43 gain 60 122 -89.60 gain 122 60 -85.29 gain 60 123 -95.53 gain 123 60 -91.56 gain 60 124 -95.62 gain 124 60 -89.64 gain 60 125 -91.13 gain 125 60 -88.49 gain 60 126 -97.14 gain 126 60 -91.15 gain 60 127 -99.62 gain 127 60 -93.25 gain 60 128 -94.74 gain 128 60 -90.97 gain 60 129 -100.86 gain 129 60 -94.30 gain 60 130 -103.31 gain 130 60 -98.04 gain 60 131 -101.26 gain 131 60 -95.76 gain 60 132 -106.26 gain 132 60 -96.78 gain 60 133 -105.70 gain 133 60 -101.39 gain 60 134 -107.33 gain 134 60 -99.89 gain 60 135 -93.09 gain 135 60 -87.95 gain 60 136 -93.35 gain 136 60 -88.65 gain 60 137 -94.27 gain 137 60 -92.48 gain 60 138 -90.81 gain 138 60 -82.55 gain 60 139 -94.17 gain 139 60 -89.18 gain 60 140 -92.77 gain 140 60 -88.60 gain 60 141 -98.53 gain 141 60 -86.33 gain 60 142 -97.33 gain 142 60 -91.88 gain 60 143 -98.24 gain 143 60 -95.53 gain 60 144 -97.91 gain 144 60 -93.56 gain 60 145 -95.81 gain 145 60 -94.85 gain 60 146 -102.13 gain 146 60 -97.16 gain 60 147 -103.33 gain 147 60 -95.47 gain 60 148 -94.40 gain 148 60 -84.86 gain 60 149 -102.88 gain 149 60 -97.00 gain 60 150 -100.68 gain 150 60 -95.64 gain 60 151 -93.61 gain 151 60 -87.51 gain 60 152 -94.23 gain 152 60 -87.94 gain 60 153 -89.81 gain 153 60 -82.74 gain 60 154 -95.04 gain 154 60 -89.88 gain 60 155 -97.18 gain 155 60 -90.58 gain 60 156 -100.54 gain 156 60 -93.18 gain 60 157 -94.78 gain 157 60 -89.90 gain 60 158 -101.44 gain 158 60 -96.05 gain 60 159 -104.58 gain 159 60 -101.58 gain 60 160 -99.82 gain 160 60 -93.98 gain 60 161 -106.57 gain 161 60 -103.16 gain 60 162 -109.98 gain 162 60 -106.28 gain 60 163 -102.06 gain 163 60 -100.28 gain 60 164 -106.45 gain 164 60 -104.04 gain 60 165 -99.35 gain 165 60 -93.99 gain 60 166 -101.53 gain 166 60 -95.93 gain 60 167 -92.46 gain 167 60 -87.58 gain 60 168 -98.66 gain 168 60 -92.67 gain 60 169 -91.04 gain 169 60 -86.17 gain 60 170 -91.82 gain 170 60 -86.18 gain 60 171 -95.08 gain 171 60 -90.52 gain 60 172 -103.11 gain 172 60 -96.74 gain 60 173 -103.85 gain 173 60 -102.13 gain 60 174 -98.61 gain 174 60 -92.94 gain 60 175 -108.31 gain 175 60 -103.77 gain 60 176 -100.53 gain 176 60 -94.96 gain 60 177 -108.10 gain 177 60 -105.53 gain 60 178 -101.81 gain 178 60 -92.69 gain 60 179 -106.42 gain 179 60 -96.72 gain 60 180 -99.08 gain 180 60 -98.83 gain 60 181 -98.05 gain 181 60 -91.82 gain 60 182 -95.81 gain 182 60 -90.67 gain 60 183 -99.16 gain 183 60 -94.29 gain 60 184 -101.05 gain 184 60 -98.93 gain 60 185 -98.31 gain 185 60 -100.05 gain 60 186 -100.47 gain 186 60 -97.79 gain 60 187 -100.22 gain 187 60 -95.27 gain 60 188 -104.92 gain 188 60 -102.39 gain 60 189 -106.09 gain 189 60 -98.28 gain 60 190 -99.64 gain 190 60 -95.75 gain 60 191 -103.06 gain 191 60 -97.87 gain 60 192 -116.89 gain 192 60 -110.40 gain 60 193 -99.08 gain 193 60 -91.57 gain 60 194 -103.17 gain 194 60 -96.44 gain 60 195 -95.42 gain 195 60 -87.24 gain 60 196 -96.63 gain 196 60 -92.76 gain 60 197 -97.24 gain 197 60 -88.51 gain 60 198 -105.61 gain 198 60 -101.39 gain 60 199 -98.34 gain 199 60 -94.23 gain 60 200 -104.08 gain 200 60 -101.31 gain 60 201 -109.52 gain 201 60 -106.65 gain 60 202 -100.25 gain 202 60 -96.51 gain 60 203 -101.29 gain 203 60 -96.67 gain 60 204 -107.86 gain 204 60 -99.89 gain 60 205 -103.04 gain 205 60 -98.81 gain 60 206 -103.70 gain 206 60 -100.57 gain 60 207 -105.25 gain 207 60 -101.54 gain 60 208 -103.02 gain 208 60 -101.91 gain 60 209 -109.16 gain 209 60 -107.62 gain 60 210 -101.18 gain 210 60 -99.82 gain 60 211 -99.26 gain 211 60 -93.13 gain 60 212 -105.43 gain 212 60 -102.31 gain 60 213 -98.13 gain 213 60 -94.34 gain 60 214 -102.08 gain 214 60 -103.68 gain 60 215 -98.10 gain 215 60 -95.10 gain 60 216 -101.34 gain 216 60 -102.25 gain 60 217 -102.38 gain 217 60 -103.55 gain 60 218 -111.29 gain 218 60 -105.26 gain 60 219 -104.47 gain 219 60 -98.93 gain 60 220 -116.70 gain 220 60 -107.24 gain 60 221 -100.77 gain 221 60 -96.99 gain 60 222 -107.21 gain 222 60 -99.24 gain 60 223 -100.46 gain 223 60 -95.73 gain 60 224 -106.93 gain 224 60 -102.67 gain 61 62 -64.38 gain 62 61 -61.89 gain 61 63 -71.92 gain 63 61 -73.39 gain 61 64 -76.35 gain 64 61 -82.05 gain 61 65 -79.25 gain 65 61 -80.50 gain 61 66 -85.91 gain 66 61 -86.14 gain 61 67 -85.78 gain 67 61 -87.24 gain 61 68 -87.59 gain 68 61 -91.64 gain 61 69 -85.65 gain 69 61 -86.92 gain 61 70 -89.49 gain 70 61 -89.22 gain 61 71 -87.64 gain 71 61 -90.94 gain 61 72 -95.16 gain 72 61 -96.02 gain 61 73 -97.78 gain 73 61 -100.01 gain 61 74 -104.67 gain 74 61 -103.01 gain 61 75 -68.46 gain 75 61 -72.69 gain 61 76 -71.84 gain 76 61 -76.19 gain 61 77 -66.08 gain 77 61 -66.43 gain 61 78 -76.06 gain 78 61 -80.91 gain 61 79 -70.55 gain 79 61 -75.02 gain 61 80 -78.06 gain 80 61 -80.32 gain 61 81 -76.56 gain 81 61 -79.74 gain 61 82 -81.13 gain 82 61 -85.28 gain 61 83 -86.12 gain 83 61 -87.54 gain 61 84 -87.24 gain 84 61 -85.86 gain 61 85 -90.65 gain 85 61 -94.69 gain 61 86 -95.77 gain 86 61 -101.44 gain 61 87 -96.54 gain 87 61 -99.50 gain 61 88 -98.34 gain 88 61 -100.95 gain 61 89 -95.19 gain 89 61 -99.94 gain 61 90 -72.77 gain 90 61 -76.87 gain 61 91 -64.91 gain 91 61 -70.07 gain 61 92 -75.43 gain 92 61 -81.50 gain 61 93 -76.41 gain 93 61 -79.84 gain 61 94 -77.29 gain 94 61 -79.29 gain 61 95 -80.84 gain 95 61 -82.08 gain 61 96 -80.60 gain 96 61 -88.81 gain 61 97 -87.80 gain 97 61 -88.83 gain 61 98 -95.34 gain 98 61 -96.85 gain 61 99 -84.73 gain 99 61 -85.37 gain 61 100 -91.69 gain 100 61 -92.25 gain 61 101 -93.67 gain 101 61 -97.86 gain 61 102 -93.32 gain 102 61 -97.48 gain 61 103 -93.62 gain 103 61 -98.95 gain 61 104 -99.89 gain 104 61 -107.69 gain 61 105 -78.90 gain 105 61 -81.23 gain 61 106 -75.67 gain 106 61 -75.33 gain 61 107 -76.88 gain 107 61 -76.45 gain 61 108 -80.65 gain 108 61 -79.84 gain 61 109 -81.29 gain 109 61 -83.93 gain 61 110 -81.27 gain 110 61 -90.27 gain 61 111 -84.46 gain 111 61 -83.43 gain 61 112 -86.53 gain 112 61 -88.96 gain 61 113 -83.90 gain 113 61 -85.46 gain 61 114 -88.03 gain 114 61 -86.76 gain 61 115 -89.12 gain 115 61 -88.50 gain 61 116 -95.29 gain 116 61 -97.10 gain 61 117 -93.89 gain 117 61 -92.84 gain 61 118 -92.75 gain 118 61 -93.33 gain 61 119 -102.66 gain 119 61 -108.29 gain 61 120 -85.64 gain 120 61 -88.66 gain 61 121 -77.47 gain 121 61 -81.51 gain 61 122 -84.31 gain 122 61 -88.10 gain 61 123 -77.97 gain 123 61 -82.10 gain 61 124 -79.72 gain 124 61 -81.84 gain 61 125 -81.44 gain 125 61 -86.89 gain 61 126 -87.15 gain 126 61 -89.26 gain 61 127 -87.98 gain 127 61 -89.71 gain 61 128 -86.21 gain 128 61 -90.54 gain 61 129 -96.55 gain 129 61 -98.09 gain 61 130 -93.78 gain 130 61 -96.61 gain 61 131 -89.81 gain 131 61 -92.41 gain 61 132 -85.53 gain 132 61 -84.14 gain 61 133 -95.89 gain 133 61 -99.67 gain 61 134 -96.50 gain 134 61 -97.15 gain 61 135 -83.73 gain 135 61 -86.68 gain 61 136 -83.98 gain 136 61 -87.37 gain 61 137 -81.71 gain 137 61 -88.01 gain 61 138 -83.18 gain 138 61 -83.02 gain 61 139 -80.27 gain 139 61 -83.37 gain 61 140 -86.25 gain 140 61 -90.18 gain 61 141 -89.44 gain 141 61 -85.34 gain 61 142 -97.34 gain 142 61 -99.98 gain 61 143 -87.00 gain 143 61 -92.38 gain 61 144 -97.91 gain 144 61 -101.66 gain 61 145 -95.72 gain 145 61 -102.85 gain 61 146 -92.25 gain 146 61 -95.38 gain 61 147 -94.31 gain 147 61 -94.54 gain 61 148 -98.43 gain 148 61 -96.99 gain 61 149 -93.26 gain 149 61 -95.48 gain 61 150 -84.31 gain 150 61 -87.37 gain 61 151 -84.47 gain 151 61 -86.47 gain 61 152 -85.03 gain 152 61 -86.84 gain 61 153 -91.80 gain 153 61 -92.82 gain 61 154 -85.88 gain 154 61 -88.80 gain 61 155 -92.53 gain 155 61 -94.03 gain 61 156 -89.14 gain 156 61 -89.87 gain 61 157 -89.87 gain 157 61 -93.09 gain 61 158 -86.10 gain 158 61 -88.81 gain 61 159 -91.73 gain 159 61 -96.82 gain 61 160 -92.30 gain 160 61 -94.55 gain 61 161 -93.79 gain 161 61 -98.48 gain 61 162 -95.04 gain 162 61 -99.44 gain 61 163 -98.98 gain 163 61 -105.30 gain 61 164 -93.44 gain 164 61 -99.12 gain 61 165 -81.09 gain 165 61 -83.83 gain 61 166 -84.47 gain 166 61 -86.96 gain 61 167 -83.09 gain 167 61 -86.30 gain 61 168 -89.58 gain 168 61 -91.69 gain 61 169 -87.66 gain 169 61 -90.89 gain 61 170 -97.04 gain 170 61 -99.50 gain 61 171 -89.07 gain 171 61 -92.61 gain 61 172 -87.46 gain 172 61 -89.18 gain 61 173 -90.65 gain 173 61 -97.02 gain 61 174 -88.62 gain 174 61 -91.05 gain 61 175 -84.23 gain 175 61 -87.78 gain 61 176 -97.72 gain 176 61 -100.25 gain 61 177 -96.89 gain 177 61 -102.42 gain 61 178 -98.09 gain 178 61 -97.06 gain 61 179 -99.25 gain 179 61 -97.65 gain 61 180 -88.68 gain 180 61 -96.52 gain 61 181 -85.17 gain 181 61 -87.04 gain 61 182 -101.32 gain 182 61 -104.27 gain 61 183 -87.70 gain 183 61 -90.92 gain 61 184 -88.68 gain 184 61 -94.66 gain 61 185 -91.09 gain 185 61 -100.93 gain 61 186 -94.23 gain 186 61 -99.65 gain 61 187 -95.56 gain 187 61 -98.71 gain 61 188 -86.49 gain 188 61 -92.05 gain 61 189 -93.79 gain 189 61 -94.08 gain 61 190 -92.85 gain 190 61 -97.05 gain 61 191 -91.51 gain 191 61 -94.42 gain 61 192 -94.45 gain 192 61 -96.05 gain 61 193 -102.90 gain 193 61 -103.49 gain 61 194 -96.39 gain 194 61 -97.76 gain 61 195 -93.66 gain 195 61 -93.58 gain 61 196 -95.02 gain 196 61 -99.25 gain 61 197 -95.82 gain 197 61 -95.19 gain 61 198 -97.84 gain 198 61 -101.71 gain 61 199 -95.73 gain 199 61 -99.71 gain 61 200 -101.39 gain 200 61 -106.71 gain 61 201 -92.20 gain 201 61 -97.43 gain 61 202 -99.44 gain 202 61 -103.80 gain 61 203 -97.43 gain 203 61 -100.91 gain 61 204 -101.07 gain 204 61 -101.19 gain 61 205 -96.69 gain 205 61 -100.55 gain 61 206 -96.81 gain 206 61 -101.78 gain 61 207 -103.81 gain 207 61 -108.19 gain 61 208 -92.41 gain 208 61 -99.40 gain 61 209 -96.83 gain 209 61 -103.39 gain 61 210 -98.45 gain 210 61 -105.18 gain 61 211 -89.22 gain 211 61 -91.19 gain 61 212 -92.35 gain 212 61 -97.33 gain 61 213 -101.19 gain 213 61 -105.49 gain 61 214 -88.45 gain 214 61 -98.14 gain 61 215 -85.93 gain 215 61 -91.03 gain 61 216 -94.46 gain 216 61 -103.46 gain 61 217 -94.90 gain 217 61 -104.17 gain 61 218 -92.86 gain 218 61 -94.93 gain 61 219 -95.16 gain 219 61 -97.72 gain 61 220 -97.08 gain 220 61 -95.72 gain 61 221 -87.49 gain 221 61 -91.81 gain 61 222 -94.88 gain 222 61 -95.01 gain 61 223 -109.63 gain 223 61 -113.00 gain 61 224 -101.86 gain 224 61 -105.70 gain 62 63 -66.69 gain 63 62 -70.66 gain 62 64 -66.09 gain 64 62 -74.28 gain 62 65 -72.67 gain 65 62 -76.40 gain 62 66 -76.53 gain 66 62 -79.25 gain 62 67 -84.32 gain 67 62 -88.27 gain 62 68 -81.86 gain 68 62 -88.40 gain 62 69 -76.05 gain 69 62 -79.80 gain 62 70 -85.44 gain 70 62 -87.66 gain 62 71 -84.76 gain 71 62 -90.55 gain 62 72 -93.75 gain 72 62 -97.09 gain 62 73 -93.67 gain 73 62 -98.39 gain 62 74 -85.28 gain 74 62 -86.12 gain 62 75 -71.91 gain 75 62 -78.63 gain 62 76 -60.72 gain 76 62 -67.56 gain 62 77 -59.70 gain 77 62 -62.54 gain 62 78 -69.87 gain 78 62 -77.21 gain 62 79 -69.04 gain 79 62 -76.00 gain 62 80 -76.42 gain 80 62 -81.18 gain 62 81 -76.35 gain 81 62 -82.02 gain 62 82 -78.47 gain 82 62 -85.11 gain 62 83 -85.30 gain 83 62 -89.21 gain 62 84 -92.98 gain 84 62 -94.08 gain 62 85 -83.43 gain 85 62 -89.96 gain 62 86 -90.81 gain 86 62 -98.98 gain 62 87 -88.99 gain 87 62 -94.45 gain 62 88 -92.99 gain 88 62 -98.09 gain 62 89 -93.51 gain 89 62 -100.75 gain 62 90 -79.11 gain 90 62 -85.69 gain 62 91 -66.89 gain 91 62 -74.53 gain 62 92 -68.96 gain 92 62 -77.53 gain 62 93 -73.75 gain 93 62 -79.67 gain 62 94 -72.67 gain 94 62 -77.16 gain 62 95 -79.52 gain 95 62 -83.25 gain 62 96 -81.67 gain 96 62 -92.38 gain 62 97 -87.74 gain 97 62 -91.26 gain 62 98 -78.35 gain 98 62 -82.35 gain 62 99 -80.75 gain 99 62 -83.88 gain 62 100 -89.69 gain 100 62 -92.74 gain 62 101 -87.39 gain 101 62 -94.07 gain 62 102 -82.26 gain 102 62 -88.90 gain 62 103 -92.71 gain 103 62 -100.52 gain 62 104 -84.61 gain 104 62 -94.91 gain 62 105 -74.06 gain 105 62 -78.87 gain 62 106 -72.46 gain 106 62 -74.61 gain 62 107 -71.11 gain 107 62 -73.17 gain 62 108 -57.64 gain 108 62 -59.32 gain 62 109 -77.61 gain 109 62 -82.74 gain 62 110 -78.97 gain 110 62 -90.46 gain 62 111 -82.48 gain 111 62 -83.93 gain 62 112 -82.51 gain 112 62 -87.42 gain 62 113 -81.47 gain 113 62 -85.52 gain 62 114 -86.58 gain 114 62 -87.79 gain 62 115 -87.52 gain 115 62 -89.38 gain 62 116 -85.63 gain 116 62 -89.93 gain 62 117 -87.66 gain 117 62 -89.10 gain 62 118 -94.51 gain 118 62 -97.57 gain 62 119 -92.95 gain 119 62 -101.07 gain 62 120 -79.16 gain 120 62 -84.66 gain 62 121 -77.35 gain 121 62 -83.88 gain 62 122 -73.48 gain 122 62 -79.76 gain 62 123 -79.16 gain 123 62 -85.78 gain 62 124 -81.29 gain 124 62 -85.90 gain 62 125 -79.36 gain 125 62 -87.31 gain 62 126 -78.75 gain 126 62 -83.35 gain 62 127 -86.28 gain 127 62 -90.50 gain 62 128 -82.38 gain 128 62 -89.19 gain 62 129 -84.72 gain 129 62 -88.74 gain 62 130 -92.08 gain 130 62 -97.40 gain 62 131 -90.36 gain 131 62 -95.45 gain 62 132 -85.30 gain 132 62 -86.40 gain 62 133 -98.48 gain 133 62 -104.76 gain 62 134 -90.05 gain 134 62 -93.19 gain 62 135 -78.47 gain 135 62 -83.91 gain 62 136 -85.09 gain 136 62 -90.97 gain 62 137 -83.24 gain 137 62 -92.03 gain 62 138 -81.96 gain 138 62 -84.29 gain 62 139 -79.11 gain 139 62 -84.70 gain 62 140 -81.27 gain 140 62 -87.69 gain 62 141 -77.64 gain 141 62 -76.03 gain 62 142 -90.30 gain 142 62 -95.43 gain 62 143 -87.90 gain 143 62 -95.77 gain 62 144 -89.60 gain 144 62 -95.83 gain 62 145 -93.41 gain 145 62 -103.03 gain 62 146 -93.63 gain 146 62 -99.24 gain 62 147 -90.52 gain 147 62 -93.25 gain 62 148 -95.69 gain 148 62 -96.74 gain 62 149 -93.19 gain 149 62 -97.90 gain 62 150 -84.52 gain 150 62 -90.06 gain 62 151 -76.88 gain 151 62 -81.37 gain 62 152 -89.18 gain 152 62 -93.48 gain 62 153 -81.39 gain 153 62 -84.90 gain 62 154 -86.47 gain 154 62 -91.89 gain 62 155 -89.55 gain 155 62 -93.54 gain 62 156 -80.23 gain 156 62 -83.45 gain 62 157 -92.94 gain 157 62 -98.64 gain 62 158 -92.05 gain 158 62 -97.25 gain 62 159 -95.61 gain 159 62 -103.20 gain 62 160 -88.98 gain 160 62 -93.72 gain 62 161 -97.21 gain 161 62 -104.39 gain 62 162 -92.74 gain 162 62 -99.63 gain 62 163 -85.51 gain 163 62 -94.31 gain 62 164 -93.74 gain 164 62 -101.91 gain 62 165 -82.94 gain 165 62 -88.17 gain 62 166 -92.41 gain 166 62 -97.40 gain 62 167 -82.96 gain 167 62 -88.66 gain 62 168 -79.64 gain 168 62 -84.24 gain 62 169 -78.45 gain 169 62 -84.17 gain 62 170 -87.43 gain 170 62 -92.38 gain 62 171 -86.71 gain 171 62 -92.74 gain 62 172 -93.92 gain 172 62 -98.13 gain 62 173 -99.21 gain 173 62 -108.08 gain 62 174 -93.19 gain 174 62 -98.10 gain 62 175 -89.86 gain 175 62 -95.91 gain 62 176 -92.10 gain 176 62 -97.12 gain 62 177 -95.39 gain 177 62 -103.40 gain 62 178 -91.45 gain 178 62 -92.91 gain 62 179 -87.18 gain 179 62 -88.06 gain 62 180 -88.64 gain 180 62 -98.98 gain 62 181 -83.62 gain 181 62 -87.97 gain 62 182 -98.37 gain 182 62 -103.81 gain 62 183 -85.89 gain 183 62 -91.60 gain 62 184 -88.00 gain 184 62 -96.46 gain 62 185 -81.60 gain 185 62 -93.93 gain 62 186 -94.03 gain 186 62 -101.94 gain 62 187 -90.32 gain 187 62 -95.96 gain 62 188 -83.45 gain 188 62 -91.50 gain 62 189 -89.46 gain 189 62 -92.23 gain 62 190 -88.32 gain 190 62 -95.00 gain 62 191 -93.18 gain 191 62 -98.58 gain 62 192 -98.41 gain 192 62 -102.50 gain 62 193 -97.12 gain 193 62 -100.20 gain 62 194 -100.85 gain 194 62 -104.71 gain 62 195 -87.68 gain 195 62 -90.09 gain 62 196 -82.36 gain 196 62 -89.08 gain 62 197 -78.44 gain 197 62 -80.29 gain 62 198 -94.52 gain 198 62 -100.89 gain 62 199 -88.27 gain 199 62 -94.74 gain 62 200 -87.54 gain 200 62 -95.35 gain 62 201 -78.72 gain 201 62 -86.44 gain 62 202 -92.00 gain 202 62 -98.86 gain 62 203 -94.72 gain 203 62 -100.68 gain 62 204 -92.59 gain 204 62 -95.19 gain 62 205 -90.00 gain 205 62 -96.35 gain 62 206 -91.42 gain 206 62 -98.88 gain 62 207 -97.03 gain 207 62 -103.90 gain 62 208 -98.06 gain 208 62 -107.53 gain 62 209 -90.37 gain 209 62 -99.42 gain 62 210 -90.27 gain 210 62 -99.49 gain 62 211 -88.84 gain 211 62 -93.29 gain 62 212 -94.95 gain 212 62 -102.42 gain 62 213 -88.09 gain 213 62 -94.88 gain 62 214 -89.56 gain 214 62 -101.74 gain 62 215 -93.86 gain 215 62 -101.44 gain 62 216 -92.45 gain 216 62 -103.94 gain 62 217 -88.13 gain 217 62 -99.88 gain 62 218 -94.95 gain 218 62 -99.51 gain 62 219 -95.76 gain 219 62 -100.80 gain 62 220 -85.83 gain 220 62 -86.96 gain 62 221 -97.14 gain 221 62 -103.95 gain 62 222 -99.21 gain 222 62 -101.83 gain 62 223 -91.48 gain 223 62 -97.34 gain 62 224 -91.98 gain 224 62 -98.30 gain 63 64 -66.30 gain 64 63 -70.52 gain 63 65 -67.79 gain 65 63 -67.57 gain 63 66 -80.88 gain 66 63 -79.63 gain 63 67 -85.68 gain 67 63 -85.66 gain 63 68 -82.87 gain 68 63 -85.45 gain 63 69 -87.51 gain 69 63 -87.30 gain 63 70 -83.88 gain 70 63 -82.14 gain 63 71 -88.19 gain 71 63 -90.02 gain 63 72 -92.45 gain 72 63 -91.83 gain 63 73 -96.66 gain 73 63 -97.42 gain 63 74 -93.13 gain 74 63 -90.00 gain 63 75 -80.93 gain 75 63 -83.69 gain 63 76 -71.87 gain 76 63 -74.75 gain 63 77 -70.49 gain 77 63 -69.37 gain 63 78 -63.49 gain 78 63 -66.86 gain 63 79 -66.78 gain 79 63 -69.78 gain 63 80 -75.63 gain 80 63 -76.41 gain 63 81 -84.26 gain 81 63 -85.96 gain 63 82 -85.04 gain 82 63 -87.72 gain 63 83 -90.17 gain 83 63 -90.12 gain 63 84 -85.96 gain 84 63 -83.10 gain 63 85 -92.62 gain 85 63 -95.19 gain 63 86 -93.08 gain 86 63 -97.28 gain 63 87 -93.50 gain 87 63 -94.99 gain 63 88 -94.28 gain 88 63 -95.41 gain 63 89 -91.21 gain 89 63 -94.49 gain 63 90 -76.74 gain 90 63 -79.36 gain 63 91 -79.20 gain 91 63 -82.89 gain 63 92 -70.78 gain 92 63 -75.39 gain 63 93 -71.52 gain 93 63 -73.48 gain 63 94 -71.73 gain 94 63 -72.26 gain 63 95 -80.23 gain 95 63 -80.00 gain 63 96 -80.75 gain 96 63 -87.49 gain 63 97 -85.12 gain 97 63 -84.68 gain 63 98 -84.93 gain 98 63 -84.96 gain 63 99 -87.96 gain 99 63 -87.13 gain 63 100 -84.07 gain 100 63 -83.16 gain 63 101 -94.21 gain 101 63 -96.93 gain 63 102 -95.12 gain 102 63 -97.80 gain 63 103 -93.54 gain 103 63 -97.38 gain 63 104 -96.64 gain 104 63 -102.98 gain 63 105 -82.13 gain 105 63 -82.98 gain 63 106 -78.91 gain 106 63 -77.10 gain 63 107 -83.34 gain 107 63 -81.43 gain 63 108 -79.81 gain 108 63 -77.52 gain 63 109 -74.08 gain 109 63 -75.24 gain 63 110 -73.97 gain 110 63 -81.49 gain 63 111 -85.88 gain 111 63 -83.36 gain 63 112 -85.09 gain 112 63 -86.05 gain 63 113 -85.91 gain 113 63 -85.99 gain 63 114 -84.01 gain 114 63 -81.26 gain 63 115 -93.12 gain 115 63 -91.03 gain 63 116 -89.33 gain 116 63 -89.67 gain 63 117 -102.36 gain 117 63 -99.83 gain 63 118 -99.30 gain 118 63 -98.40 gain 63 119 -92.09 gain 119 63 -96.25 gain 63 120 -78.17 gain 120 63 -79.71 gain 63 121 -79.79 gain 121 63 -82.35 gain 63 122 -81.99 gain 122 63 -84.30 gain 63 123 -82.13 gain 123 63 -84.79 gain 63 124 -72.70 gain 124 63 -73.34 gain 63 125 -74.25 gain 125 63 -78.23 gain 63 126 -84.31 gain 126 63 -84.94 gain 63 127 -84.97 gain 127 63 -85.23 gain 63 128 -93.61 gain 128 63 -96.47 gain 63 129 -89.65 gain 129 63 -89.71 gain 63 130 -93.15 gain 130 63 -94.51 gain 63 131 -95.22 gain 131 63 -96.35 gain 63 132 -98.82 gain 132 63 -95.96 gain 63 133 -100.89 gain 133 63 -103.20 gain 63 134 -96.47 gain 134 63 -95.65 gain 63 135 -87.91 gain 135 63 -89.39 gain 63 136 -80.75 gain 136 63 -82.67 gain 63 137 -89.28 gain 137 63 -94.11 gain 63 138 -82.37 gain 138 63 -80.73 gain 63 139 -88.40 gain 139 63 -90.03 gain 63 140 -81.61 gain 140 63 -84.06 gain 63 141 -89.78 gain 141 63 -84.20 gain 63 142 -90.55 gain 142 63 -91.72 gain 63 143 -90.27 gain 143 63 -94.18 gain 63 144 -87.77 gain 144 63 -90.04 gain 63 145 -95.54 gain 145 63 -101.20 gain 63 146 -90.28 gain 146 63 -91.93 gain 63 147 -95.06 gain 147 63 -93.81 gain 63 148 -97.24 gain 148 63 -94.33 gain 63 149 -103.14 gain 149 63 -103.88 gain 63 150 -87.83 gain 150 63 -89.41 gain 63 151 -85.89 gain 151 63 -86.41 gain 63 152 -83.18 gain 152 63 -83.52 gain 63 153 -94.42 gain 153 63 -93.97 gain 63 154 -85.14 gain 154 63 -86.60 gain 63 155 -88.86 gain 155 63 -88.88 gain 63 156 -86.67 gain 156 63 -85.93 gain 63 157 -92.34 gain 157 63 -94.08 gain 63 158 -90.37 gain 158 63 -91.61 gain 63 159 -93.61 gain 159 63 -97.23 gain 63 160 -92.65 gain 160 63 -93.42 gain 63 161 -96.54 gain 161 63 -99.75 gain 63 162 -92.47 gain 162 63 -95.39 gain 63 163 -95.87 gain 163 63 -100.70 gain 63 164 -98.04 gain 164 63 -102.25 gain 63 165 -95.45 gain 165 63 -96.71 gain 63 166 -90.06 gain 166 63 -91.08 gain 63 167 -94.57 gain 167 63 -96.31 gain 63 168 -88.39 gain 168 63 -89.03 gain 63 169 -87.61 gain 169 63 -89.36 gain 63 170 -91.74 gain 170 63 -92.72 gain 63 171 -90.78 gain 171 63 -92.85 gain 63 172 -94.49 gain 172 63 -94.74 gain 63 173 -85.14 gain 173 63 -90.04 gain 63 174 -95.93 gain 174 63 -96.88 gain 63 175 -89.85 gain 175 63 -91.93 gain 63 176 -93.03 gain 176 63 -94.08 gain 63 177 -98.88 gain 177 63 -102.94 gain 63 178 -102.12 gain 178 63 -99.62 gain 63 179 -95.10 gain 179 63 -92.02 gain 63 180 -91.84 gain 180 63 -98.21 gain 63 181 -94.08 gain 181 63 -94.47 gain 63 182 -95.06 gain 182 63 -96.53 gain 63 183 -91.47 gain 183 63 -93.21 gain 63 184 -89.35 gain 184 63 -93.85 gain 63 185 -89.54 gain 185 63 -97.91 gain 63 186 -96.71 gain 186 63 -100.65 gain 63 187 -93.62 gain 187 63 -95.29 gain 63 188 -89.60 gain 188 63 -93.68 gain 63 189 -89.72 gain 189 63 -88.53 gain 63 190 -92.19 gain 190 63 -94.91 gain 63 191 -93.35 gain 191 63 -94.78 gain 63 192 -92.46 gain 192 63 -92.59 gain 63 193 -96.99 gain 193 63 -96.10 gain 63 194 -101.23 gain 194 63 -101.12 gain 63 195 -91.36 gain 195 63 -89.80 gain 63 196 -94.26 gain 196 63 -97.01 gain 63 197 -90.62 gain 197 63 -88.51 gain 63 198 -94.69 gain 198 63 -97.09 gain 63 199 -92.67 gain 199 63 -95.18 gain 63 200 -92.80 gain 200 63 -96.65 gain 63 201 -86.77 gain 201 63 -90.52 gain 63 202 -93.33 gain 202 63 -96.21 gain 63 203 -87.50 gain 203 63 -89.50 gain 63 204 -100.43 gain 204 63 -99.08 gain 63 205 -93.57 gain 205 63 -95.95 gain 63 206 -95.26 gain 206 63 -98.76 gain 63 207 -96.72 gain 207 63 -99.63 gain 63 208 -95.64 gain 208 63 -101.15 gain 63 209 -106.16 gain 209 63 -111.24 gain 63 210 -91.34 gain 210 63 -96.60 gain 63 211 -89.00 gain 211 63 -89.49 gain 63 212 -89.67 gain 212 63 -93.17 gain 63 213 -94.70 gain 213 63 -97.53 gain 63 214 -99.00 gain 214 63 -107.22 gain 63 215 -89.85 gain 215 63 -93.47 gain 63 216 -98.21 gain 216 63 -105.73 gain 63 217 -97.87 gain 217 63 -105.66 gain 63 218 -99.89 gain 218 63 -100.49 gain 63 219 -95.04 gain 219 63 -96.12 gain 63 220 -90.85 gain 220 63 -88.01 gain 63 221 -95.32 gain 221 63 -98.17 gain 63 222 -102.77 gain 222 63 -101.42 gain 63 223 -107.33 gain 223 63 -109.23 gain 63 224 -96.69 gain 224 63 -99.06 gain 64 65 -67.85 gain 65 64 -63.39 gain 64 66 -71.69 gain 66 64 -66.23 gain 64 67 -79.38 gain 67 64 -75.14 gain 64 68 -86.28 gain 68 64 -84.63 gain 64 69 -92.43 gain 69 64 -87.99 gain 64 70 -85.45 gain 70 64 -79.48 gain 64 71 -98.61 gain 71 64 -96.21 gain 64 72 -92.73 gain 72 64 -87.89 gain 64 73 -98.72 gain 73 64 -95.24 gain 64 74 -95.62 gain 74 64 -88.26 gain 64 75 -76.41 gain 75 64 -74.94 gain 64 76 -76.93 gain 76 64 -75.58 gain 64 77 -76.51 gain 77 64 -71.16 gain 64 78 -76.81 gain 78 64 -75.96 gain 64 79 -65.33 gain 79 64 -64.10 gain 64 80 -71.68 gain 80 64 -68.25 gain 64 81 -80.41 gain 81 64 -77.88 gain 64 82 -77.52 gain 82 64 -75.97 gain 64 83 -94.21 gain 83 64 -89.93 gain 64 84 -94.30 gain 84 64 -87.21 gain 64 85 -99.21 gain 85 64 -97.55 gain 64 86 -85.27 gain 86 64 -85.25 gain 64 87 -91.36 gain 87 64 -88.62 gain 64 88 -97.45 gain 88 64 -94.36 gain 64 89 -96.84 gain 89 64 -95.89 gain 64 90 -84.09 gain 90 64 -82.48 gain 64 91 -85.04 gain 91 64 -84.50 gain 64 92 -78.62 gain 92 64 -79.00 gain 64 93 -76.82 gain 93 64 -74.55 gain 64 94 -71.33 gain 94 64 -67.63 gain 64 95 -74.18 gain 95 64 -69.72 gain 64 96 -76.01 gain 96 64 -78.52 gain 64 97 -85.86 gain 97 64 -81.20 gain 64 98 -84.62 gain 98 64 -80.43 gain 64 99 -90.79 gain 99 64 -85.73 gain 64 100 -94.36 gain 100 64 -89.22 gain 64 101 -88.42 gain 101 64 -86.91 gain 64 102 -100.70 gain 102 64 -99.15 gain 64 103 -97.02 gain 103 64 -96.64 gain 64 104 -95.25 gain 104 64 -97.36 gain 64 105 -83.03 gain 105 64 -79.66 gain 64 106 -92.79 gain 106 64 -86.75 gain 64 107 -82.56 gain 107 64 -76.42 gain 64 108 -77.70 gain 108 64 -71.19 gain 64 109 -80.49 gain 109 64 -77.43 gain 64 110 -81.74 gain 110 64 -85.04 gain 64 111 -83.78 gain 111 64 -77.05 gain 64 112 -83.49 gain 112 64 -80.22 gain 64 113 -85.90 gain 113 64 -81.75 gain 64 114 -95.60 gain 114 64 -88.62 gain 64 115 -87.43 gain 115 64 -81.11 gain 64 116 -98.01 gain 116 64 -94.12 gain 64 117 -94.55 gain 117 64 -87.80 gain 64 118 -96.31 gain 118 64 -91.18 gain 64 119 -99.34 gain 119 64 -99.27 gain 64 120 -86.63 gain 120 64 -83.95 gain 64 121 -88.80 gain 121 64 -87.14 gain 64 122 -84.62 gain 122 64 -82.71 gain 64 123 -86.55 gain 123 64 -84.98 gain 64 124 -83.78 gain 124 64 -80.20 gain 64 125 -89.20 gain 125 64 -88.95 gain 64 126 -87.82 gain 126 64 -84.23 gain 64 127 -88.74 gain 127 64 -84.78 gain 64 128 -89.74 gain 128 64 -88.37 gain 64 129 -87.33 gain 129 64 -83.16 gain 64 130 -92.67 gain 130 64 -89.80 gain 64 131 -93.08 gain 131 64 -89.98 gain 64 132 -88.22 gain 132 64 -81.13 gain 64 133 -100.53 gain 133 64 -98.62 gain 64 134 -97.32 gain 134 64 -92.26 gain 64 135 -91.88 gain 135 64 -89.13 gain 64 136 -95.62 gain 136 64 -93.31 gain 64 137 -89.40 gain 137 64 -90.00 gain 64 138 -85.97 gain 138 64 -80.11 gain 64 139 -84.81 gain 139 64 -82.22 gain 64 140 -84.84 gain 140 64 -83.07 gain 64 141 -85.33 gain 141 64 -75.53 gain 64 142 -88.71 gain 142 64 -85.66 gain 64 143 -96.46 gain 143 64 -96.15 gain 64 144 -94.60 gain 144 64 -92.64 gain 64 145 -97.57 gain 145 64 -99.00 gain 64 146 -96.30 gain 146 64 -93.72 gain 64 147 -104.93 gain 147 64 -99.46 gain 64 148 -94.60 gain 148 64 -87.46 gain 64 149 -107.11 gain 149 64 -103.63 gain 64 150 -96.69 gain 150 64 -94.04 gain 64 151 -98.37 gain 151 64 -94.66 gain 64 152 -93.96 gain 152 64 -90.07 gain 64 153 -92.99 gain 153 64 -88.31 gain 64 154 -92.52 gain 154 64 -89.75 gain 64 155 -85.25 gain 155 64 -81.05 gain 64 156 -90.54 gain 156 64 -85.57 gain 64 157 -87.56 gain 157 64 -85.07 gain 64 158 -88.01 gain 158 64 -85.02 gain 64 159 -96.08 gain 159 64 -95.48 gain 64 160 -100.60 gain 160 64 -97.15 gain 64 161 -99.48 gain 161 64 -98.47 gain 64 162 -96.32 gain 162 64 -95.02 gain 64 163 -93.52 gain 163 64 -94.14 gain 64 164 -102.73 gain 164 64 -102.72 gain 64 165 -98.07 gain 165 64 -95.11 gain 64 166 -93.78 gain 166 64 -90.57 gain 64 167 -103.20 gain 167 64 -100.71 gain 64 168 -93.79 gain 168 64 -90.20 gain 64 169 -94.52 gain 169 64 -92.05 gain 64 170 -95.10 gain 170 64 -91.86 gain 64 171 -95.35 gain 171 64 -93.20 gain 64 172 -93.60 gain 172 64 -89.63 gain 64 173 -87.80 gain 173 64 -88.48 gain 64 174 -95.88 gain 174 64 -92.60 gain 64 175 -101.03 gain 175 64 -98.89 gain 64 176 -99.46 gain 176 64 -96.28 gain 64 177 -99.52 gain 177 64 -99.35 gain 64 178 -99.98 gain 178 64 -93.25 gain 64 179 -94.51 gain 179 64 -87.21 gain 64 180 -95.51 gain 180 64 -97.65 gain 64 181 -95.89 gain 181 64 -92.05 gain 64 182 -91.83 gain 182 64 -89.08 gain 64 183 -92.18 gain 183 64 -89.70 gain 64 184 -95.45 gain 184 64 -95.72 gain 64 185 -97.68 gain 185 64 -101.82 gain 64 186 -93.47 gain 186 64 -93.18 gain 64 187 -96.35 gain 187 64 -93.80 gain 64 188 -101.21 gain 188 64 -101.07 gain 64 189 -94.09 gain 189 64 -88.68 gain 64 190 -98.06 gain 190 64 -96.56 gain 64 191 -96.54 gain 191 64 -93.75 gain 64 192 -98.80 gain 192 64 -94.70 gain 64 193 -101.90 gain 193 64 -96.78 gain 64 194 -103.84 gain 194 64 -99.51 gain 64 195 -93.21 gain 195 64 -87.43 gain 64 196 -97.07 gain 196 64 -95.60 gain 64 197 -88.93 gain 197 64 -82.59 gain 64 198 -105.13 gain 198 64 -103.31 gain 64 199 -95.49 gain 199 64 -93.77 gain 64 200 -101.52 gain 200 64 -101.14 gain 64 201 -100.00 gain 201 64 -99.52 gain 64 202 -91.41 gain 202 64 -90.07 gain 64 203 -99.52 gain 203 64 -97.29 gain 64 204 -95.43 gain 204 64 -89.84 gain 64 205 -94.34 gain 205 64 -92.50 gain 64 206 -99.37 gain 206 64 -98.64 gain 64 207 -98.18 gain 207 64 -96.87 gain 64 208 -98.95 gain 208 64 -100.24 gain 64 209 -103.45 gain 209 64 -104.31 gain 64 210 -97.32 gain 210 64 -98.35 gain 64 211 -97.57 gain 211 64 -93.84 gain 64 212 -97.01 gain 212 64 -96.29 gain 64 213 -96.33 gain 213 64 -94.94 gain 64 214 -104.37 gain 214 64 -108.36 gain 64 215 -102.57 gain 215 64 -101.96 gain 64 216 -100.09 gain 216 64 -103.40 gain 64 217 -102.39 gain 217 64 -105.96 gain 64 218 -97.16 gain 218 64 -93.54 gain 64 219 -94.55 gain 219 64 -91.41 gain 64 220 -102.01 gain 220 64 -94.95 gain 64 221 -96.41 gain 221 64 -95.03 gain 64 222 -95.91 gain 222 64 -90.34 gain 64 223 -103.72 gain 223 64 -101.39 gain 64 224 -101.82 gain 224 64 -99.96 gain 65 66 -67.57 gain 66 65 -66.55 gain 65 67 -76.98 gain 67 65 -77.20 gain 65 68 -66.83 gain 68 65 -69.63 gain 65 69 -84.84 gain 69 65 -84.85 gain 65 70 -82.22 gain 70 65 -80.71 gain 65 71 -88.23 gain 71 65 -90.28 gain 65 72 -88.36 gain 72 65 -87.97 gain 65 73 -87.88 gain 73 65 -88.86 gain 65 74 -91.36 gain 74 65 -88.45 gain 65 75 -89.65 gain 75 65 -92.63 gain 65 76 -78.58 gain 76 65 -81.69 gain 65 77 -77.05 gain 77 65 -76.16 gain 65 78 -77.41 gain 78 65 -81.02 gain 65 79 -65.40 gain 79 65 -68.62 gain 65 80 -58.16 gain 80 65 -59.17 gain 65 81 -72.69 gain 81 65 -74.61 gain 65 82 -76.24 gain 82 65 -79.14 gain 65 83 -75.74 gain 83 65 -75.91 gain 65 84 -87.54 gain 84 65 -84.90 gain 65 85 -83.19 gain 85 65 -85.98 gain 65 86 -87.62 gain 86 65 -92.05 gain 65 87 -91.08 gain 87 65 -92.80 gain 65 88 -81.12 gain 88 65 -82.48 gain 65 89 -84.57 gain 89 65 -88.07 gain 65 90 -81.74 gain 90 65 -84.59 gain 65 91 -83.99 gain 91 65 -87.90 gain 65 92 -77.57 gain 92 65 -82.40 gain 65 93 -71.42 gain 93 65 -73.61 gain 65 94 -73.00 gain 94 65 -73.76 gain 65 95 -71.48 gain 95 65 -71.48 gain 65 96 -72.62 gain 96 65 -79.59 gain 65 97 -78.99 gain 97 65 -78.78 gain 65 98 -87.74 gain 98 65 -88.00 gain 65 99 -77.60 gain 99 65 -76.99 gain 65 100 -88.35 gain 100 65 -87.66 gain 65 101 -83.81 gain 101 65 -86.75 gain 65 102 -93.44 gain 102 65 -96.35 gain 65 103 -91.43 gain 103 65 -95.51 gain 65 104 -89.29 gain 104 65 -95.85 gain 65 105 -86.31 gain 105 65 -87.39 gain 65 106 -78.20 gain 106 65 -76.61 gain 65 107 -88.47 gain 107 65 -86.79 gain 65 108 -78.60 gain 108 65 -76.54 gain 65 109 -81.28 gain 109 65 -82.66 gain 65 110 -74.01 gain 110 65 -81.76 gain 65 111 -76.36 gain 111 65 -74.08 gain 65 112 -80.70 gain 112 65 -81.88 gain 65 113 -85.27 gain 113 65 -85.58 gain 65 114 -80.97 gain 114 65 -78.44 gain 65 115 -86.51 gain 115 65 -84.64 gain 65 116 -88.42 gain 116 65 -88.98 gain 65 117 -82.17 gain 117 65 -79.88 gain 65 118 -99.22 gain 118 65 -98.55 gain 65 119 -90.61 gain 119 65 -95.00 gain 65 120 -85.61 gain 120 65 -87.38 gain 65 121 -88.97 gain 121 65 -91.76 gain 65 122 -83.70 gain 122 65 -86.24 gain 65 123 -82.00 gain 123 65 -84.89 gain 65 124 -85.42 gain 124 65 -86.29 gain 65 125 -81.23 gain 125 65 -85.44 gain 65 126 -88.84 gain 126 65 -89.70 gain 65 127 -88.16 gain 127 65 -88.64 gain 65 128 -81.03 gain 128 65 -84.11 gain 65 129 -89.54 gain 129 65 -89.83 gain 65 130 -86.53 gain 130 65 -88.11 gain 65 131 -80.84 gain 131 65 -82.19 gain 65 132 -97.98 gain 132 65 -95.34 gain 65 133 -93.91 gain 133 65 -96.44 gain 65 134 -98.50 gain 134 65 -97.90 gain 65 135 -80.88 gain 135 65 -82.58 gain 65 136 -91.16 gain 136 65 -93.30 gain 65 137 -84.86 gain 137 65 -89.92 gain 65 138 -85.03 gain 138 65 -83.62 gain 65 139 -86.79 gain 139 65 -88.65 gain 65 140 -81.42 gain 140 65 -84.11 gain 65 141 -76.27 gain 141 65 -70.92 gain 65 142 -89.06 gain 142 65 -90.46 gain 65 143 -77.90 gain 143 65 -82.03 gain 65 144 -84.70 gain 144 65 -87.20 gain 65 145 -85.81 gain 145 65 -91.70 gain 65 146 -86.67 gain 146 65 -88.55 gain 65 147 -93.46 gain 147 65 -92.44 gain 65 148 -91.80 gain 148 65 -89.11 gain 65 149 -93.30 gain 149 65 -94.27 gain 65 150 -91.98 gain 150 65 -93.79 gain 65 151 -89.87 gain 151 65 -90.62 gain 65 152 -91.34 gain 152 65 -91.91 gain 65 153 -86.88 gain 153 65 -86.65 gain 65 154 -82.38 gain 154 65 -84.06 gain 65 155 -87.68 gain 155 65 -87.94 gain 65 156 -90.61 gain 156 65 -90.09 gain 65 157 -87.60 gain 157 65 -89.56 gain 65 158 -96.68 gain 158 65 -98.14 gain 65 159 -93.51 gain 159 65 -97.36 gain 65 160 -86.15 gain 160 65 -87.16 gain 65 161 -95.74 gain 161 65 -99.18 gain 65 162 -98.70 gain 162 65 -101.85 gain 65 163 -92.15 gain 163 65 -97.22 gain 65 164 -97.80 gain 164 65 -102.23 gain 65 165 -89.58 gain 165 65 -91.07 gain 65 166 -91.10 gain 166 65 -92.35 gain 65 167 -96.53 gain 167 65 -98.50 gain 65 168 -86.63 gain 168 65 -87.49 gain 65 169 -89.03 gain 169 65 -91.00 gain 65 170 -93.30 gain 170 65 -94.51 gain 65 171 -87.32 gain 171 65 -89.61 gain 65 172 -91.60 gain 172 65 -92.08 gain 65 173 -90.77 gain 173 65 -95.90 gain 65 174 -90.96 gain 174 65 -92.14 gain 65 175 -92.11 gain 175 65 -94.42 gain 65 176 -90.15 gain 176 65 -91.43 gain 65 177 -96.26 gain 177 65 -100.54 gain 65 178 -91.10 gain 178 65 -88.82 gain 65 179 -101.89 gain 179 65 -99.04 gain 65 180 -89.67 gain 180 65 -96.26 gain 65 181 -80.63 gain 181 65 -81.24 gain 65 182 -95.33 gain 182 65 -97.03 gain 65 183 -88.64 gain 183 65 -90.61 gain 65 184 -97.13 gain 184 65 -101.86 gain 65 185 -86.71 gain 185 65 -95.31 gain 65 186 -85.18 gain 186 65 -89.35 gain 65 187 -88.89 gain 187 65 -90.79 gain 65 188 -90.26 gain 188 65 -94.57 gain 65 189 -95.94 gain 189 65 -94.98 gain 65 190 -96.52 gain 190 65 -99.48 gain 65 191 -90.99 gain 191 65 -92.65 gain 65 192 -98.25 gain 192 65 -98.61 gain 65 193 -95.28 gain 193 65 -94.62 gain 65 194 -94.57 gain 194 65 -94.70 gain 65 195 -92.41 gain 195 65 -91.08 gain 65 196 -101.77 gain 196 65 -104.75 gain 65 197 -92.72 gain 197 65 -90.83 gain 65 198 -85.75 gain 198 65 -88.38 gain 65 199 -88.22 gain 199 65 -90.95 gain 65 200 -98.25 gain 200 65 -102.32 gain 65 201 -90.42 gain 201 65 -94.40 gain 65 202 -88.55 gain 202 65 -91.67 gain 65 203 -91.75 gain 203 65 -93.97 gain 65 204 -97.46 gain 204 65 -96.33 gain 65 205 -95.81 gain 205 65 -98.43 gain 65 206 -94.31 gain 206 65 -98.03 gain 65 207 -96.31 gain 207 65 -99.45 gain 65 208 -93.40 gain 208 65 -99.14 gain 65 209 -94.91 gain 209 65 -100.23 gain 65 210 -98.88 gain 210 65 -104.36 gain 65 211 -96.86 gain 211 65 -97.58 gain 65 212 -90.16 gain 212 65 -93.90 gain 65 213 -88.19 gain 213 65 -91.25 gain 65 214 -97.55 gain 214 65 -105.99 gain 65 215 -93.84 gain 215 65 -97.68 gain 65 216 -89.78 gain 216 65 -97.53 gain 65 217 -91.51 gain 217 65 -99.53 gain 65 218 -100.67 gain 218 65 -101.49 gain 65 219 -86.55 gain 219 65 -87.85 gain 65 220 -95.68 gain 220 65 -93.08 gain 65 221 -96.84 gain 221 65 -99.91 gain 65 222 -95.66 gain 222 65 -94.54 gain 65 223 -99.21 gain 223 65 -101.33 gain 65 224 -99.28 gain 224 65 -101.87 gain 66 67 -67.02 gain 67 66 -68.25 gain 66 68 -74.00 gain 68 66 -77.82 gain 66 69 -82.99 gain 69 66 -84.02 gain 66 70 -74.45 gain 70 66 -73.95 gain 66 71 -87.22 gain 71 66 -90.29 gain 66 72 -92.50 gain 72 66 -93.13 gain 66 73 -86.22 gain 73 66 -88.22 gain 66 74 -80.48 gain 74 66 -78.59 gain 66 75 -81.86 gain 75 66 -85.86 gain 66 76 -81.12 gain 76 66 -85.24 gain 66 77 -79.96 gain 77 66 -80.08 gain 66 78 -73.27 gain 78 66 -77.89 gain 66 79 -74.47 gain 79 66 -78.71 gain 66 80 -64.58 gain 80 66 -66.61 gain 66 81 -62.13 gain 81 66 -65.07 gain 66 82 -67.74 gain 82 66 -71.66 gain 66 83 -74.43 gain 83 66 -75.63 gain 66 84 -80.57 gain 84 66 -78.95 gain 66 85 -82.31 gain 85 66 -86.12 gain 66 86 -77.04 gain 86 66 -82.49 gain 66 87 -82.81 gain 87 66 -85.55 gain 66 88 -90.85 gain 88 66 -93.22 gain 66 89 -92.03 gain 89 66 -96.55 gain 66 90 -82.00 gain 90 66 -85.86 gain 66 91 -87.52 gain 91 66 -92.44 gain 66 92 -80.50 gain 92 66 -86.35 gain 66 93 -80.46 gain 93 66 -83.67 gain 66 94 -75.98 gain 94 66 -77.75 gain 66 95 -75.01 gain 95 66 -76.02 gain 66 96 -70.22 gain 96 66 -78.20 gain 66 97 -76.46 gain 97 66 -77.27 gain 66 98 -74.90 gain 98 66 -76.17 gain 66 99 -74.60 gain 99 66 -75.01 gain 66 100 -88.81 gain 100 66 -89.14 gain 66 101 -91.69 gain 101 66 -95.65 gain 66 102 -82.35 gain 102 66 -86.28 gain 66 103 -79.62 gain 103 66 -84.71 gain 66 104 -86.56 gain 104 66 -94.14 gain 66 105 -84.49 gain 105 66 -86.58 gain 66 106 -79.13 gain 106 66 -78.56 gain 66 107 -78.97 gain 107 66 -78.30 gain 66 108 -75.63 gain 108 66 -74.58 gain 66 109 -84.45 gain 109 66 -86.85 gain 66 110 -76.87 gain 110 66 -85.64 gain 66 111 -77.59 gain 111 66 -76.33 gain 66 112 -78.07 gain 112 66 -80.27 gain 66 113 -80.02 gain 113 66 -81.34 gain 66 114 -83.05 gain 114 66 -81.54 gain 66 115 -82.45 gain 115 66 -81.59 gain 66 116 -89.10 gain 116 66 -90.68 gain 66 117 -87.55 gain 117 66 -86.27 gain 66 118 -80.77 gain 118 66 -81.11 gain 66 119 -91.32 gain 119 66 -96.73 gain 66 120 -97.33 gain 120 66 -100.12 gain 66 121 -85.64 gain 121 66 -89.45 gain 66 122 -80.94 gain 122 66 -84.50 gain 66 123 -81.16 gain 123 66 -85.06 gain 66 124 -87.40 gain 124 66 -89.29 gain 66 125 -75.44 gain 125 66 -80.67 gain 66 126 -83.35 gain 126 66 -85.22 gain 66 127 -83.52 gain 127 66 -85.02 gain 66 128 -81.85 gain 128 66 -85.95 gain 66 129 -80.64 gain 129 66 -81.94 gain 66 130 -76.75 gain 130 66 -79.34 gain 66 131 -83.28 gain 131 66 -85.65 gain 66 132 -82.92 gain 132 66 -81.30 gain 66 133 -91.60 gain 133 66 -95.15 gain 66 134 -83.39 gain 134 66 -83.80 gain 66 135 -86.99 gain 135 66 -89.71 gain 66 136 -87.45 gain 136 66 -90.61 gain 66 137 -86.70 gain 137 66 -92.78 gain 66 138 -82.97 gain 138 66 -82.58 gain 66 139 -77.86 gain 139 66 -80.73 gain 66 140 -90.98 gain 140 66 -94.68 gain 66 141 -75.40 gain 141 66 -71.07 gain 66 142 -78.98 gain 142 66 -81.39 gain 66 143 -86.87 gain 143 66 -92.02 gain 66 144 -94.60 gain 144 66 -98.12 gain 66 145 -77.62 gain 145 66 -84.52 gain 66 146 -92.69 gain 146 66 -95.58 gain 66 147 -93.59 gain 147 66 -93.59 gain 66 148 -93.86 gain 148 66 -92.19 gain 66 149 -88.99 gain 149 66 -90.98 gain 66 150 -95.94 gain 150 66 -98.76 gain 66 151 -88.86 gain 151 66 -90.62 gain 66 152 -87.28 gain 152 66 -88.86 gain 66 153 -76.63 gain 153 66 -77.42 gain 66 154 -82.09 gain 154 66 -84.79 gain 66 155 -81.93 gain 155 66 -83.20 gain 66 156 -89.29 gain 156 66 -89.79 gain 66 157 -86.54 gain 157 66 -89.52 gain 66 158 -89.82 gain 158 66 -92.31 gain 66 159 -95.80 gain 159 66 -100.67 gain 66 160 -88.47 gain 160 66 -90.49 gain 66 161 -88.68 gain 161 66 -93.14 gain 66 162 -95.19 gain 162 66 -99.36 gain 66 163 -94.09 gain 163 66 -100.17 gain 66 164 -89.53 gain 164 66 -94.98 gain 66 165 -87.46 gain 165 66 -89.97 gain 66 166 -89.65 gain 166 66 -91.92 gain 66 167 -89.86 gain 167 66 -92.85 gain 66 168 -86.20 gain 168 66 -88.08 gain 66 169 -83.86 gain 169 66 -86.85 gain 66 170 -89.01 gain 170 66 -91.24 gain 66 171 -90.26 gain 171 66 -93.57 gain 66 172 -87.37 gain 172 66 -88.87 gain 66 173 -86.85 gain 173 66 -92.99 gain 66 174 -84.54 gain 174 66 -86.74 gain 66 175 -95.40 gain 175 66 -98.73 gain 66 176 -89.81 gain 176 66 -92.11 gain 66 177 -92.61 gain 177 66 -97.91 gain 66 178 -82.76 gain 178 66 -81.50 gain 66 179 -94.00 gain 179 66 -92.16 gain 66 180 -88.10 gain 180 66 -95.71 gain 66 181 -92.71 gain 181 66 -94.35 gain 66 182 -95.15 gain 182 66 -97.87 gain 66 183 -90.56 gain 183 66 -93.55 gain 66 184 -99.72 gain 184 66 -105.47 gain 66 185 -92.06 gain 185 66 -101.67 gain 66 186 -96.67 gain 186 66 -101.86 gain 66 187 -86.98 gain 187 66 -89.89 gain 66 188 -90.16 gain 188 66 -95.48 gain 66 189 -86.22 gain 189 66 -86.27 gain 66 190 -90.15 gain 190 66 -94.12 gain 66 191 -90.82 gain 191 66 -93.50 gain 66 192 -93.40 gain 192 66 -94.77 gain 66 193 -94.70 gain 193 66 -95.05 gain 66 194 -92.15 gain 194 66 -93.29 gain 66 195 -89.18 gain 195 66 -88.87 gain 66 196 -91.91 gain 196 66 -95.91 gain 66 197 -86.78 gain 197 66 -85.91 gain 66 198 -93.51 gain 198 66 -97.15 gain 66 199 -99.46 gain 199 66 -103.22 gain 66 200 -93.51 gain 200 66 -98.59 gain 66 201 -94.45 gain 201 66 -99.44 gain 66 202 -86.23 gain 202 66 -90.36 gain 66 203 -94.39 gain 203 66 -97.63 gain 66 204 -98.31 gain 204 66 -98.20 gain 66 205 -87.41 gain 205 66 -91.04 gain 66 206 -91.63 gain 206 66 -96.37 gain 66 207 -94.98 gain 207 66 -99.14 gain 66 208 -96.13 gain 208 66 -102.89 gain 66 209 -96.63 gain 209 66 -102.96 gain 66 210 -92.98 gain 210 66 -99.48 gain 66 211 -99.95 gain 211 66 -101.68 gain 66 212 -91.32 gain 212 66 -96.06 gain 66 213 -91.56 gain 213 66 -95.64 gain 66 214 -89.60 gain 214 66 -99.06 gain 66 215 -95.24 gain 215 66 -100.10 gain 66 216 -93.54 gain 216 66 -102.31 gain 66 217 -96.38 gain 217 66 -105.42 gain 66 218 -98.45 gain 218 66 -100.29 gain 66 219 -93.54 gain 219 66 -95.86 gain 66 220 -100.03 gain 220 66 -98.44 gain 66 221 -88.70 gain 221 66 -92.79 gain 66 222 -90.91 gain 222 66 -90.81 gain 66 223 -96.59 gain 223 66 -99.73 gain 66 224 -99.93 gain 224 66 -103.54 gain 67 68 -64.35 gain 68 67 -66.93 gain 67 69 -68.21 gain 69 67 -68.02 gain 67 70 -80.49 gain 70 67 -78.76 gain 67 71 -87.03 gain 71 67 -88.87 gain 67 72 -82.40 gain 72 67 -81.80 gain 67 73 -88.16 gain 73 67 -88.93 gain 67 74 -91.18 gain 74 67 -88.06 gain 67 75 -90.94 gain 75 67 -93.71 gain 67 76 -84.99 gain 76 67 -87.89 gain 67 77 -85.91 gain 77 67 -84.80 gain 67 78 -80.19 gain 78 67 -83.59 gain 67 79 -83.86 gain 79 67 -86.88 gain 67 80 -75.43 gain 80 67 -76.23 gain 67 81 -64.36 gain 81 67 -66.07 gain 67 82 -62.64 gain 82 67 -65.33 gain 67 83 -68.25 gain 83 67 -68.21 gain 67 84 -75.29 gain 84 67 -72.44 gain 67 85 -81.24 gain 85 67 -83.82 gain 67 86 -73.27 gain 86 67 -77.49 gain 67 87 -84.87 gain 87 67 -86.38 gain 67 88 -83.72 gain 88 67 -84.87 gain 67 89 -93.79 gain 89 67 -97.08 gain 67 90 -88.39 gain 90 67 -91.02 gain 67 91 -82.95 gain 91 67 -86.65 gain 67 92 -87.11 gain 92 67 -91.72 gain 67 93 -77.53 gain 93 67 -79.50 gain 67 94 -78.97 gain 94 67 -79.51 gain 67 95 -67.67 gain 95 67 -67.45 gain 67 96 -67.33 gain 96 67 -74.09 gain 67 97 -73.61 gain 97 67 -73.19 gain 67 98 -72.64 gain 98 67 -72.68 gain 67 99 -80.60 gain 99 67 -79.78 gain 67 100 -74.80 gain 100 67 -73.90 gain 67 101 -82.05 gain 101 67 -84.78 gain 67 102 -80.39 gain 102 67 -83.08 gain 67 103 -91.70 gain 103 67 -95.57 gain 67 104 -89.17 gain 104 67 -95.51 gain 67 105 -91.20 gain 105 67 -92.06 gain 67 106 -93.25 gain 106 67 -91.45 gain 67 107 -88.37 gain 107 67 -86.48 gain 67 108 -84.41 gain 108 67 -82.13 gain 67 109 -86.85 gain 109 67 -88.02 gain 67 110 -78.87 gain 110 67 -86.41 gain 67 111 -80.61 gain 111 67 -78.12 gain 67 112 -75.00 gain 112 67 -75.97 gain 67 113 -78.68 gain 113 67 -78.77 gain 67 114 -77.40 gain 114 67 -74.67 gain 67 115 -83.00 gain 115 67 -80.92 gain 67 116 -90.40 gain 116 67 -90.75 gain 67 117 -84.62 gain 117 67 -82.11 gain 67 118 -88.91 gain 118 67 -88.02 gain 67 119 -93.89 gain 119 67 -98.06 gain 67 120 -84.06 gain 120 67 -85.62 gain 67 121 -86.46 gain 121 67 -89.04 gain 67 122 -87.43 gain 122 67 -89.76 gain 67 123 -81.50 gain 123 67 -84.17 gain 67 124 -88.34 gain 124 67 -89.00 gain 67 125 -86.63 gain 125 67 -90.63 gain 67 126 -85.24 gain 126 67 -85.88 gain 67 127 -84.55 gain 127 67 -84.82 gain 67 128 -81.14 gain 128 67 -84.00 gain 67 129 -85.93 gain 129 67 -86.01 gain 67 130 -81.81 gain 130 67 -83.17 gain 67 131 -80.03 gain 131 67 -81.17 gain 67 132 -86.17 gain 132 67 -83.32 gain 67 133 -86.64 gain 133 67 -88.96 gain 67 134 -97.14 gain 134 67 -96.33 gain 67 135 -98.27 gain 135 67 -99.77 gain 67 136 -88.22 gain 136 67 -90.16 gain 67 137 -91.14 gain 137 67 -95.99 gain 67 138 -85.41 gain 138 67 -83.78 gain 67 139 -83.10 gain 139 67 -84.74 gain 67 140 -87.32 gain 140 67 -89.79 gain 67 141 -85.39 gain 141 67 -79.83 gain 67 142 -81.02 gain 142 67 -82.21 gain 67 143 -91.73 gain 143 67 -95.65 gain 67 144 -79.84 gain 144 67 -82.13 gain 67 145 -84.43 gain 145 67 -90.10 gain 67 146 -81.34 gain 146 67 -83.00 gain 67 147 -86.53 gain 147 67 -85.30 gain 67 148 -90.67 gain 148 67 -87.77 gain 67 149 -87.56 gain 149 67 -88.31 gain 67 150 -87.50 gain 150 67 -89.10 gain 67 151 -91.25 gain 151 67 -91.78 gain 67 152 -83.67 gain 152 67 -84.02 gain 67 153 -86.04 gain 153 67 -85.60 gain 67 154 -86.67 gain 154 67 -88.14 gain 67 155 -89.99 gain 155 67 -90.03 gain 67 156 -84.25 gain 156 67 -83.52 gain 67 157 -85.18 gain 157 67 -86.93 gain 67 158 -80.31 gain 158 67 -81.56 gain 67 159 -79.94 gain 159 67 -83.58 gain 67 160 -85.75 gain 160 67 -86.53 gain 67 161 -92.18 gain 161 67 -95.41 gain 67 162 -83.50 gain 162 67 -86.44 gain 67 163 -89.49 gain 163 67 -94.34 gain 67 164 -90.75 gain 164 67 -94.97 gain 67 165 -98.19 gain 165 67 -99.47 gain 67 166 -91.07 gain 166 67 -92.11 gain 67 167 -96.14 gain 167 67 -97.89 gain 67 168 -95.89 gain 168 67 -96.54 gain 67 169 -87.74 gain 169 67 -89.50 gain 67 170 -91.05 gain 170 67 -92.05 gain 67 171 -84.07 gain 171 67 -86.15 gain 67 172 -93.84 gain 172 67 -94.11 gain 67 173 -87.76 gain 173 67 -92.68 gain 67 174 -93.00 gain 174 67 -93.97 gain 67 175 -85.09 gain 175 67 -87.19 gain 67 176 -89.99 gain 176 67 -91.06 gain 67 177 -91.25 gain 177 67 -95.32 gain 67 178 -91.05 gain 178 67 -88.56 gain 67 179 -92.25 gain 179 67 -89.18 gain 67 180 -91.27 gain 180 67 -97.65 gain 67 181 -90.78 gain 181 67 -91.19 gain 67 182 -90.33 gain 182 67 -91.82 gain 67 183 -95.03 gain 183 67 -96.79 gain 67 184 -91.05 gain 184 67 -95.56 gain 67 185 -90.49 gain 185 67 -98.87 gain 67 186 -91.02 gain 186 67 -94.98 gain 67 187 -88.09 gain 187 67 -89.78 gain 67 188 -92.05 gain 188 67 -96.15 gain 67 189 -92.16 gain 189 67 -90.99 gain 67 190 -92.38 gain 190 67 -95.12 gain 67 191 -86.99 gain 191 67 -88.43 gain 67 192 -93.29 gain 192 67 -93.43 gain 67 193 -86.61 gain 193 67 -85.74 gain 67 194 -92.41 gain 194 67 -92.31 gain 67 195 -89.30 gain 195 67 -87.76 gain 67 196 -90.37 gain 196 67 -93.14 gain 67 197 -97.12 gain 197 67 -95.02 gain 67 198 -89.59 gain 198 67 -92.00 gain 67 199 -96.13 gain 199 67 -98.65 gain 67 200 -96.68 gain 200 67 -100.54 gain 67 201 -90.57 gain 201 67 -94.33 gain 67 202 -98.01 gain 202 67 -100.91 gain 67 203 -91.20 gain 203 67 -93.21 gain 67 204 -95.10 gain 204 67 -93.76 gain 67 205 -98.59 gain 205 67 -100.99 gain 67 206 -94.86 gain 206 67 -98.37 gain 67 207 -93.16 gain 207 67 -96.09 gain 67 208 -94.25 gain 208 67 -99.77 gain 67 209 -93.35 gain 209 67 -98.45 gain 67 210 -95.67 gain 210 67 -100.94 gain 67 211 -88.13 gain 211 67 -88.63 gain 67 212 -98.69 gain 212 67 -102.21 gain 67 213 -93.10 gain 213 67 -95.95 gain 67 214 -89.26 gain 214 67 -97.49 gain 67 215 -91.49 gain 215 67 -95.12 gain 67 216 -95.14 gain 216 67 -102.69 gain 67 217 -92.75 gain 217 67 -100.56 gain 67 218 -86.53 gain 218 67 -87.15 gain 67 219 -96.85 gain 219 67 -97.95 gain 67 220 -85.87 gain 220 67 -83.05 gain 67 221 -87.27 gain 221 67 -90.13 gain 67 222 -96.63 gain 222 67 -95.30 gain 67 223 -90.69 gain 223 67 -92.60 gain 67 224 -97.41 gain 224 67 -99.79 gain 68 69 -69.01 gain 69 68 -66.23 gain 68 70 -79.19 gain 70 68 -74.88 gain 68 71 -80.29 gain 71 68 -79.55 gain 68 72 -81.86 gain 72 68 -78.66 gain 68 73 -91.55 gain 73 68 -89.73 gain 68 74 -79.65 gain 74 68 -73.94 gain 68 75 -91.97 gain 75 68 -92.16 gain 68 76 -90.04 gain 76 68 -90.35 gain 68 77 -88.21 gain 77 68 -84.51 gain 68 78 -86.51 gain 78 68 -87.31 gain 68 79 -82.48 gain 79 68 -82.91 gain 68 80 -78.77 gain 80 68 -76.99 gain 68 81 -77.29 gain 81 68 -76.42 gain 68 82 -78.02 gain 82 68 -78.12 gain 68 83 -67.49 gain 83 68 -64.86 gain 68 84 -67.94 gain 84 68 -62.50 gain 68 85 -80.29 gain 85 68 -80.28 gain 68 86 -81.43 gain 86 68 -83.05 gain 68 87 -82.19 gain 87 68 -81.10 gain 68 88 -88.42 gain 88 68 -86.98 gain 68 89 -88.96 gain 89 68 -89.66 gain 68 90 -97.50 gain 90 68 -97.54 gain 68 91 -75.47 gain 91 68 -76.58 gain 68 92 -96.81 gain 92 68 -98.83 gain 68 93 -80.67 gain 93 68 -80.06 gain 68 94 -85.08 gain 94 68 -83.03 gain 68 95 -82.79 gain 95 68 -79.99 gain 68 96 -81.79 gain 96 68 -85.96 gain 68 97 -70.99 gain 97 68 -67.98 gain 68 98 -76.16 gain 98 68 -73.62 gain 68 99 -81.75 gain 99 68 -78.35 gain 68 100 -81.07 gain 100 68 -77.58 gain 68 101 -79.17 gain 101 68 -79.31 gain 68 102 -86.65 gain 102 68 -86.76 gain 68 103 -85.79 gain 103 68 -87.06 gain 68 104 -80.42 gain 104 68 -84.18 gain 68 105 -99.60 gain 105 68 -97.88 gain 68 106 -92.74 gain 106 68 -88.35 gain 68 107 -80.76 gain 107 68 -76.28 gain 68 108 -96.91 gain 108 68 -92.05 gain 68 109 -84.76 gain 109 68 -83.35 gain 68 110 -86.96 gain 110 68 -91.90 gain 68 111 -81.96 gain 111 68 -76.88 gain 68 112 -82.18 gain 112 68 -80.56 gain 68 113 -78.37 gain 113 68 -75.88 gain 68 114 -82.22 gain 114 68 -76.90 gain 68 115 -86.50 gain 115 68 -81.83 gain 68 116 -82.25 gain 116 68 -80.01 gain 68 117 -87.29 gain 117 68 -82.20 gain 68 118 -94.55 gain 118 68 -91.07 gain 68 119 -86.99 gain 119 68 -88.58 gain 68 120 -93.24 gain 120 68 -92.20 gain 68 121 -91.53 gain 121 68 -91.52 gain 68 122 -89.98 gain 122 68 -89.72 gain 68 123 -87.89 gain 123 68 -87.97 gain 68 124 -92.25 gain 124 68 -90.32 gain 68 125 -87.29 gain 125 68 -88.70 gain 68 126 -84.22 gain 126 68 -82.27 gain 68 127 -83.22 gain 127 68 -80.91 gain 68 128 -75.25 gain 128 68 -75.53 gain 68 129 -83.73 gain 129 68 -81.22 gain 68 130 -86.53 gain 130 68 -85.31 gain 68 131 -93.37 gain 131 68 -91.92 gain 68 132 -82.78 gain 132 68 -77.34 gain 68 133 -93.79 gain 133 68 -93.53 gain 68 134 -92.75 gain 134 68 -89.35 gain 68 135 -88.87 gain 135 68 -87.77 gain 68 136 -94.03 gain 136 68 -93.37 gain 68 137 -96.56 gain 137 68 -98.82 gain 68 138 -91.40 gain 138 68 -87.19 gain 68 139 -89.77 gain 139 68 -88.82 gain 68 140 -91.13 gain 140 68 -91.01 gain 68 141 -94.10 gain 141 68 -85.95 gain 68 142 -80.20 gain 142 68 -78.80 gain 68 143 -88.96 gain 143 68 -90.30 gain 68 144 -90.19 gain 144 68 -89.88 gain 68 145 -93.88 gain 145 68 -96.97 gain 68 146 -83.81 gain 146 68 -82.89 gain 68 147 -95.89 gain 147 68 -92.08 gain 68 148 -97.65 gain 148 68 -92.16 gain 68 149 -92.77 gain 149 68 -90.94 gain 68 150 -94.55 gain 150 68 -93.56 gain 68 151 -88.38 gain 151 68 -86.33 gain 68 152 -96.27 gain 152 68 -94.03 gain 68 153 -91.98 gain 153 68 -88.95 gain 68 154 -92.43 gain 154 68 -91.31 gain 68 155 -93.58 gain 155 68 -91.04 gain 68 156 -88.48 gain 156 68 -85.16 gain 68 157 -87.66 gain 157 68 -86.83 gain 68 158 -93.23 gain 158 68 -91.89 gain 68 159 -93.40 gain 159 68 -94.44 gain 68 160 -93.80 gain 160 68 -92.00 gain 68 161 -93.14 gain 161 68 -93.78 gain 68 162 -88.94 gain 162 68 -89.29 gain 68 163 -97.72 gain 163 68 -99.98 gain 68 164 -94.99 gain 164 68 -96.63 gain 68 165 -91.05 gain 165 68 -89.75 gain 68 166 -97.17 gain 166 68 -95.61 gain 68 167 -98.17 gain 167 68 -97.34 gain 68 168 -99.48 gain 168 68 -97.55 gain 68 169 -89.66 gain 169 68 -88.83 gain 68 170 -89.75 gain 170 68 -88.16 gain 68 171 -89.63 gain 171 68 -89.12 gain 68 172 -91.37 gain 172 68 -89.05 gain 68 173 -90.53 gain 173 68 -92.86 gain 68 174 -94.22 gain 174 68 -92.60 gain 68 175 -90.81 gain 175 68 -90.32 gain 68 176 -89.68 gain 176 68 -88.15 gain 68 177 -95.87 gain 177 68 -97.35 gain 68 178 -92.49 gain 178 68 -87.41 gain 68 179 -91.86 gain 179 68 -86.20 gain 68 180 -95.43 gain 180 68 -99.22 gain 68 181 -94.89 gain 181 68 -92.71 gain 68 182 -97.87 gain 182 68 -96.77 gain 68 183 -93.67 gain 183 68 -92.84 gain 68 184 -100.35 gain 184 68 -102.27 gain 68 185 -89.79 gain 185 68 -95.58 gain 68 186 -98.39 gain 186 68 -99.76 gain 68 187 -91.39 gain 187 68 -90.49 gain 68 188 -91.55 gain 188 68 -93.06 gain 68 189 -96.16 gain 189 68 -92.39 gain 68 190 -88.33 gain 190 68 -88.48 gain 68 191 -93.55 gain 191 68 -92.41 gain 68 192 -102.00 gain 192 68 -99.55 gain 68 193 -91.95 gain 193 68 -88.49 gain 68 194 -94.06 gain 194 68 -91.38 gain 68 195 -100.69 gain 195 68 -96.56 gain 68 196 -108.64 gain 196 68 -108.82 gain 68 197 -93.25 gain 197 68 -88.57 gain 68 198 -92.51 gain 198 68 -92.34 gain 68 199 -97.01 gain 199 68 -96.94 gain 68 200 -96.04 gain 200 68 -97.31 gain 68 201 -95.70 gain 201 68 -96.88 gain 68 202 -95.92 gain 202 68 -96.24 gain 68 203 -97.69 gain 203 68 -97.12 gain 68 204 -100.18 gain 204 68 -96.25 gain 68 205 -93.55 gain 205 68 -93.36 gain 68 206 -92.57 gain 206 68 -93.49 gain 68 207 -94.78 gain 207 68 -95.12 gain 68 208 -98.57 gain 208 68 -101.51 gain 68 209 -96.38 gain 209 68 -98.90 gain 68 210 -95.90 gain 210 68 -98.58 gain 68 211 -98.19 gain 211 68 -96.11 gain 68 212 -97.09 gain 212 68 -98.02 gain 68 213 -96.89 gain 213 68 -97.15 gain 68 214 -97.09 gain 214 68 -102.73 gain 68 215 -93.44 gain 215 68 -94.48 gain 68 216 -96.30 gain 216 68 -101.25 gain 68 217 -100.06 gain 217 68 -105.27 gain 68 218 -92.08 gain 218 68 -90.10 gain 68 219 -91.35 gain 219 68 -89.86 gain 68 220 -96.44 gain 220 68 -91.03 gain 68 221 -99.06 gain 221 68 -99.33 gain 68 222 -90.77 gain 222 68 -86.85 gain 68 223 -99.12 gain 223 68 -98.44 gain 68 224 -99.59 gain 224 68 -99.38 gain 69 70 -58.62 gain 70 69 -57.09 gain 69 71 -80.65 gain 71 69 -82.69 gain 69 72 -75.07 gain 72 69 -74.66 gain 69 73 -80.00 gain 73 69 -80.96 gain 69 74 -79.28 gain 74 69 -76.36 gain 69 75 -90.28 gain 75 69 -93.24 gain 69 76 -88.64 gain 76 69 -91.73 gain 69 77 -90.81 gain 77 69 -89.89 gain 69 78 -87.62 gain 78 69 -91.21 gain 69 79 -88.98 gain 79 69 -92.19 gain 69 80 -83.55 gain 80 69 -84.55 gain 69 81 -76.64 gain 81 69 -78.55 gain 69 82 -81.91 gain 82 69 -84.79 gain 69 83 -78.57 gain 83 69 -78.73 gain 69 84 -70.77 gain 84 69 -68.12 gain 69 85 -69.41 gain 85 69 -72.19 gain 69 86 -74.66 gain 86 69 -79.08 gain 69 87 -74.89 gain 87 69 -76.60 gain 69 88 -77.73 gain 88 69 -79.07 gain 69 89 -82.69 gain 89 69 -86.17 gain 69 90 -91.69 gain 90 69 -94.51 gain 69 91 -89.36 gain 91 69 -93.25 gain 69 92 -87.26 gain 92 69 -92.07 gain 69 93 -91.30 gain 93 69 -93.47 gain 69 94 -84.94 gain 94 69 -85.68 gain 69 95 -85.47 gain 95 69 -85.45 gain 69 96 -80.90 gain 96 69 -87.85 gain 69 97 -82.22 gain 97 69 -81.99 gain 69 98 -76.10 gain 98 69 -76.34 gain 69 99 -73.34 gain 99 69 -72.72 gain 69 100 -68.80 gain 100 69 -68.09 gain 69 101 -82.17 gain 101 69 -85.10 gain 69 102 -82.48 gain 102 69 -85.37 gain 69 103 -80.67 gain 103 69 -84.73 gain 69 104 -94.84 gain 104 69 -101.38 gain 69 105 -96.75 gain 105 69 -97.81 gain 69 106 -96.89 gain 106 69 -95.28 gain 69 107 -97.15 gain 107 69 -95.45 gain 69 108 -86.56 gain 108 69 -84.48 gain 69 109 -82.21 gain 109 69 -83.58 gain 69 110 -78.00 gain 110 69 -85.73 gain 69 111 -81.36 gain 111 69 -79.06 gain 69 112 -77.00 gain 112 69 -78.17 gain 69 113 -76.47 gain 113 69 -76.76 gain 69 114 -81.06 gain 114 69 -78.52 gain 69 115 -79.88 gain 115 69 -77.99 gain 69 116 -81.96 gain 116 69 -82.50 gain 69 117 -86.27 gain 117 69 -83.96 gain 69 118 -88.18 gain 118 69 -87.49 gain 69 119 -89.43 gain 119 69 -93.80 gain 69 120 -98.96 gain 120 69 -100.71 gain 69 121 -93.06 gain 121 69 -95.83 gain 69 122 -86.41 gain 122 69 -88.94 gain 69 123 -94.00 gain 123 69 -96.86 gain 69 124 -88.43 gain 124 69 -89.28 gain 69 125 -91.30 gain 125 69 -95.50 gain 69 126 -86.98 gain 126 69 -87.82 gain 69 127 -88.37 gain 127 69 -88.84 gain 69 128 -78.89 gain 128 69 -81.95 gain 69 129 -68.67 gain 129 69 -68.94 gain 69 130 -86.47 gain 130 69 -88.03 gain 69 131 -86.95 gain 131 69 -88.29 gain 69 132 -82.61 gain 132 69 -79.95 gain 69 133 -88.91 gain 133 69 -91.43 gain 69 134 -86.84 gain 134 69 -86.23 gain 69 135 -93.32 gain 135 69 -95.01 gain 69 136 -82.58 gain 136 69 -84.71 gain 69 137 -81.45 gain 137 69 -86.49 gain 69 138 -90.99 gain 138 69 -89.57 gain 69 139 -93.19 gain 139 69 -95.03 gain 69 140 -83.87 gain 140 69 -86.54 gain 69 141 -83.56 gain 141 69 -78.20 gain 69 142 -88.29 gain 142 69 -89.67 gain 69 143 -82.65 gain 143 69 -86.76 gain 69 144 -82.44 gain 144 69 -84.93 gain 69 145 -83.83 gain 145 69 -89.70 gain 69 146 -81.69 gain 146 69 -83.55 gain 69 147 -86.21 gain 147 69 -85.18 gain 69 148 -93.18 gain 148 69 -90.48 gain 69 149 -89.34 gain 149 69 -90.30 gain 69 150 -98.09 gain 150 69 -99.88 gain 69 151 -93.53 gain 151 69 -94.26 gain 69 152 -91.25 gain 152 69 -91.79 gain 69 153 -97.96 gain 153 69 -97.72 gain 69 154 -92.11 gain 154 69 -93.78 gain 69 155 -89.54 gain 155 69 -89.78 gain 69 156 -81.60 gain 156 69 -81.07 gain 69 157 -85.59 gain 157 69 -87.54 gain 69 158 -83.26 gain 158 69 -84.71 gain 69 159 -83.32 gain 159 69 -87.15 gain 69 160 -92.24 gain 160 69 -93.23 gain 69 161 -87.67 gain 161 69 -91.10 gain 69 162 -92.77 gain 162 69 -95.91 gain 69 163 -93.38 gain 163 69 -98.43 gain 69 164 -87.48 gain 164 69 -91.90 gain 69 165 -95.99 gain 165 69 -97.47 gain 69 166 -98.04 gain 166 69 -99.27 gain 69 167 -95.17 gain 167 69 -97.13 gain 69 168 -89.08 gain 168 69 -89.93 gain 69 169 -97.15 gain 169 69 -99.11 gain 69 170 -90.51 gain 170 69 -91.70 gain 69 171 -86.96 gain 171 69 -89.23 gain 69 172 -86.18 gain 172 69 -86.65 gain 69 173 -91.77 gain 173 69 -96.88 gain 69 174 -86.71 gain 174 69 -87.87 gain 69 175 -96.44 gain 175 69 -98.73 gain 69 176 -100.11 gain 176 69 -101.38 gain 69 177 -80.34 gain 177 69 -84.60 gain 69 178 -93.82 gain 178 69 -91.53 gain 69 179 -95.40 gain 179 69 -92.53 gain 69 180 -90.20 gain 180 69 -96.78 gain 69 181 -97.50 gain 181 69 -98.10 gain 69 182 -95.34 gain 182 69 -97.03 gain 69 183 -90.39 gain 183 69 -92.35 gain 69 184 -95.12 gain 184 69 -99.83 gain 69 185 -82.60 gain 185 69 -91.17 gain 69 186 -91.83 gain 186 69 -95.98 gain 69 187 -96.46 gain 187 69 -98.35 gain 69 188 -93.65 gain 188 69 -97.95 gain 69 189 -91.31 gain 189 69 -90.33 gain 69 190 -83.91 gain 190 69 -86.84 gain 69 191 -90.83 gain 191 69 -92.47 gain 69 192 -85.99 gain 192 69 -86.33 gain 69 193 -86.74 gain 193 69 -86.07 gain 69 194 -89.45 gain 194 69 -89.55 gain 69 195 -98.48 gain 195 69 -97.13 gain 69 196 -98.92 gain 196 69 -101.88 gain 69 197 -93.44 gain 197 69 -91.54 gain 69 198 -93.33 gain 198 69 -95.94 gain 69 199 -91.39 gain 199 69 -94.11 gain 69 200 -92.53 gain 200 69 -96.58 gain 69 201 -94.06 gain 201 69 -98.02 gain 69 202 -93.00 gain 202 69 -96.10 gain 69 203 -97.72 gain 203 69 -99.93 gain 69 204 -91.49 gain 204 69 -90.35 gain 69 205 -93.51 gain 205 69 -96.11 gain 69 206 -93.62 gain 206 69 -97.32 gain 69 207 -94.57 gain 207 69 -97.69 gain 69 208 -93.89 gain 208 69 -99.61 gain 69 209 -98.57 gain 209 69 -103.87 gain 69 210 -96.56 gain 210 69 -102.03 gain 69 211 -99.41 gain 211 69 -100.12 gain 69 212 -95.75 gain 212 69 -99.46 gain 69 213 -89.62 gain 213 69 -92.67 gain 69 214 -97.62 gain 214 69 -106.05 gain 69 215 -94.05 gain 215 69 -97.88 gain 69 216 -96.43 gain 216 69 -104.17 gain 69 217 -85.03 gain 217 69 -93.03 gain 69 218 -89.24 gain 218 69 -90.05 gain 69 219 -94.00 gain 219 69 -95.29 gain 69 220 -91.14 gain 220 69 -88.52 gain 69 221 -90.44 gain 221 69 -93.50 gain 69 222 -94.01 gain 222 69 -92.88 gain 69 223 -93.80 gain 223 69 -95.90 gain 69 224 -92.40 gain 224 69 -94.97 gain 70 71 -63.75 gain 71 70 -67.32 gain 70 72 -69.15 gain 72 70 -70.28 gain 70 73 -67.40 gain 73 70 -69.90 gain 70 74 -77.81 gain 74 70 -76.42 gain 70 75 -94.57 gain 75 70 -99.07 gain 70 76 -88.83 gain 76 70 -93.45 gain 70 77 -83.38 gain 77 70 -84.00 gain 70 78 -88.17 gain 78 70 -93.29 gain 70 79 -81.35 gain 79 70 -86.09 gain 70 80 -81.74 gain 80 70 -84.27 gain 70 81 -79.22 gain 81 70 -82.67 gain 70 82 -80.92 gain 82 70 -85.34 gain 70 83 -78.10 gain 83 70 -79.80 gain 70 84 -67.85 gain 84 70 -66.73 gain 70 85 -65.18 gain 85 70 -69.49 gain 70 86 -64.60 gain 86 70 -70.54 gain 70 87 -77.29 gain 87 70 -80.53 gain 70 88 -77.02 gain 88 70 -79.90 gain 70 89 -84.28 gain 89 70 -89.30 gain 70 90 -85.90 gain 90 70 -90.26 gain 70 91 -101.62 gain 91 70 -107.05 gain 70 92 -84.75 gain 92 70 -91.10 gain 70 93 -84.38 gain 93 70 -88.08 gain 70 94 -87.08 gain 94 70 -89.35 gain 70 95 -87.57 gain 95 70 -89.08 gain 70 96 -75.89 gain 96 70 -84.38 gain 70 97 -76.57 gain 97 70 -77.88 gain 70 98 -75.60 gain 98 70 -77.38 gain 70 99 -66.52 gain 99 70 -67.43 gain 70 100 -73.65 gain 100 70 -74.48 gain 70 101 -69.51 gain 101 70 -73.97 gain 70 102 -78.56 gain 102 70 -82.98 gain 70 103 -76.51 gain 103 70 -82.10 gain 70 104 -83.67 gain 104 70 -91.75 gain 70 105 -93.39 gain 105 70 -95.99 gain 70 106 -96.47 gain 106 70 -96.40 gain 70 107 -88.61 gain 107 70 -88.44 gain 70 108 -84.61 gain 108 70 -84.06 gain 70 109 -87.54 gain 109 70 -90.44 gain 70 110 -84.44 gain 110 70 -93.71 gain 70 111 -85.20 gain 111 70 -84.43 gain 70 112 -85.31 gain 112 70 -88.01 gain 70 113 -73.12 gain 113 70 -74.94 gain 70 114 -81.97 gain 114 70 -80.96 gain 70 115 -76.68 gain 115 70 -76.32 gain 70 116 -78.56 gain 116 70 -80.64 gain 70 117 -74.44 gain 117 70 -73.66 gain 70 118 -88.57 gain 118 70 -89.41 gain 70 119 -88.40 gain 119 70 -94.30 gain 70 120 -90.13 gain 120 70 -93.41 gain 70 121 -99.90 gain 121 70 -104.21 gain 70 122 -91.28 gain 122 70 -95.34 gain 70 123 -88.43 gain 123 70 -92.82 gain 70 124 -87.95 gain 124 70 -90.34 gain 70 125 -85.80 gain 125 70 -91.52 gain 70 126 -92.59 gain 126 70 -94.97 gain 70 127 -79.75 gain 127 70 -81.75 gain 70 128 -86.38 gain 128 70 -90.98 gain 70 129 -76.89 gain 129 70 -78.70 gain 70 130 -80.79 gain 130 70 -83.88 gain 70 131 -83.91 gain 131 70 -86.78 gain 70 132 -82.95 gain 132 70 -81.82 gain 70 133 -80.86 gain 133 70 -84.91 gain 70 134 -78.91 gain 134 70 -79.82 gain 70 135 -91.03 gain 135 70 -94.25 gain 70 136 -89.90 gain 136 70 -93.56 gain 70 137 -84.48 gain 137 70 -91.06 gain 70 138 -89.67 gain 138 70 -89.78 gain 70 139 -93.11 gain 139 70 -96.48 gain 70 140 -92.27 gain 140 70 -96.47 gain 70 141 -82.09 gain 141 70 -78.27 gain 70 142 -85.08 gain 142 70 -87.99 gain 70 143 -87.36 gain 143 70 -93.01 gain 70 144 -85.99 gain 144 70 -90.00 gain 70 145 -83.56 gain 145 70 -90.96 gain 70 146 -85.42 gain 146 70 -88.81 gain 70 147 -80.43 gain 147 70 -80.93 gain 70 148 -85.24 gain 148 70 -84.07 gain 70 149 -89.56 gain 149 70 -92.04 gain 70 150 -99.16 gain 150 70 -102.48 gain 70 151 -87.01 gain 151 70 -89.27 gain 70 152 -94.65 gain 152 70 -96.73 gain 70 153 -85.86 gain 153 70 -87.16 gain 70 154 -95.34 gain 154 70 -98.53 gain 70 155 -87.07 gain 155 70 -88.84 gain 70 156 -88.76 gain 156 70 -89.76 gain 70 157 -89.68 gain 157 70 -93.16 gain 70 158 -85.59 gain 158 70 -88.57 gain 70 159 -77.41 gain 159 70 -82.77 gain 70 160 -86.80 gain 160 70 -89.32 gain 70 161 -85.27 gain 161 70 -90.23 gain 70 162 -88.41 gain 162 70 -93.08 gain 70 163 -92.17 gain 163 70 -98.75 gain 70 164 -78.24 gain 164 70 -84.19 gain 70 165 -101.46 gain 165 70 -104.47 gain 70 166 -100.54 gain 166 70 -103.30 gain 70 167 -91.99 gain 167 70 -95.47 gain 70 168 -92.49 gain 168 70 -94.87 gain 70 169 -94.38 gain 169 70 -97.87 gain 70 170 -97.16 gain 170 70 -99.89 gain 70 171 -86.12 gain 171 70 -89.92 gain 70 172 -88.96 gain 172 70 -90.96 gain 70 173 -84.05 gain 173 70 -90.70 gain 70 174 -79.96 gain 174 70 -82.66 gain 70 175 -80.71 gain 175 70 -84.54 gain 70 176 -85.42 gain 176 70 -88.22 gain 70 177 -89.65 gain 177 70 -95.45 gain 70 178 -80.30 gain 178 70 -79.54 gain 70 179 -88.04 gain 179 70 -86.70 gain 70 180 -97.52 gain 180 70 -105.63 gain 70 181 -96.33 gain 181 70 -98.46 gain 70 182 -90.46 gain 182 70 -93.68 gain 70 183 -92.70 gain 183 70 -96.19 gain 70 184 -88.06 gain 184 70 -94.30 gain 70 185 -84.53 gain 185 70 -94.64 gain 70 186 -91.29 gain 186 70 -96.98 gain 70 187 -81.19 gain 187 70 -84.61 gain 70 188 -84.66 gain 188 70 -90.49 gain 70 189 -86.84 gain 189 70 -87.40 gain 70 190 -84.46 gain 190 70 -88.93 gain 70 191 -83.59 gain 191 70 -86.77 gain 70 192 -87.76 gain 192 70 -89.63 gain 70 193 -87.75 gain 193 70 -88.60 gain 70 194 -87.04 gain 194 70 -88.68 gain 70 195 -96.52 gain 195 70 -96.71 gain 70 196 -99.35 gain 196 70 -103.84 gain 70 197 -99.59 gain 197 70 -99.23 gain 70 198 -92.06 gain 198 70 -96.21 gain 70 199 -93.07 gain 199 70 -97.32 gain 70 200 -92.75 gain 200 70 -98.33 gain 70 201 -88.54 gain 201 70 -94.03 gain 70 202 -87.01 gain 202 70 -91.65 gain 70 203 -95.75 gain 203 70 -99.49 gain 70 204 -93.34 gain 204 70 -93.72 gain 70 205 -96.10 gain 205 70 -100.23 gain 70 206 -84.28 gain 206 70 -89.52 gain 70 207 -86.95 gain 207 70 -91.61 gain 70 208 -85.12 gain 208 70 -92.38 gain 70 209 -98.89 gain 209 70 -105.72 gain 70 210 -101.38 gain 210 70 -108.38 gain 70 211 -95.36 gain 211 70 -97.60 gain 70 212 -99.19 gain 212 70 -104.44 gain 70 213 -92.11 gain 213 70 -96.68 gain 70 214 -98.96 gain 214 70 -108.92 gain 70 215 -93.43 gain 215 70 -98.79 gain 70 216 -89.02 gain 216 70 -98.29 gain 70 217 -97.20 gain 217 70 -106.73 gain 70 218 -95.13 gain 218 70 -97.47 gain 70 219 -92.94 gain 219 70 -95.76 gain 70 220 -95.30 gain 220 70 -94.21 gain 70 221 -86.42 gain 221 70 -91.01 gain 70 222 -92.56 gain 222 70 -92.95 gain 70 223 -84.27 gain 223 70 -87.91 gain 70 224 -99.56 gain 224 70 -103.67 gain 71 72 -66.25 gain 72 71 -63.80 gain 71 73 -73.03 gain 73 71 -71.96 gain 71 74 -86.96 gain 74 71 -82.01 gain 71 75 -90.13 gain 75 71 -91.06 gain 71 76 -97.36 gain 76 71 -98.42 gain 71 77 -93.17 gain 77 71 -90.22 gain 71 78 -91.71 gain 78 71 -93.26 gain 71 79 -89.33 gain 79 71 -90.50 gain 71 80 -99.60 gain 80 71 -98.56 gain 71 81 -81.03 gain 81 71 -80.90 gain 71 82 -90.27 gain 82 71 -91.12 gain 71 83 -77.65 gain 83 71 -75.78 gain 71 84 -71.69 gain 84 71 -67.00 gain 71 85 -69.04 gain 85 71 -69.78 gain 71 86 -70.59 gain 86 71 -72.97 gain 71 87 -69.30 gain 87 71 -68.96 gain 71 88 -79.30 gain 88 71 -78.61 gain 71 89 -78.40 gain 89 71 -79.85 gain 71 90 -104.12 gain 90 71 -104.91 gain 71 91 -96.52 gain 91 71 -98.38 gain 71 92 -97.98 gain 92 71 -100.76 gain 71 93 -96.92 gain 93 71 -97.05 gain 71 94 -86.92 gain 94 71 -85.63 gain 71 95 -88.05 gain 95 71 -85.99 gain 71 96 -89.81 gain 96 71 -94.73 gain 71 97 -87.33 gain 97 71 -85.07 gain 71 98 -83.06 gain 98 71 -81.26 gain 71 99 -79.50 gain 99 71 -76.85 gain 71 100 -74.40 gain 100 71 -71.66 gain 71 101 -77.30 gain 101 71 -78.19 gain 71 102 -76.40 gain 102 71 -77.25 gain 71 103 -80.69 gain 103 71 -82.71 gain 71 104 -87.86 gain 104 71 -92.37 gain 71 105 -101.60 gain 105 71 -100.63 gain 71 106 -94.67 gain 106 71 -91.03 gain 71 107 -95.98 gain 107 71 -92.24 gain 71 108 -93.67 gain 108 71 -89.55 gain 71 109 -94.52 gain 109 71 -93.86 gain 71 110 -93.47 gain 110 71 -99.17 gain 71 111 -87.53 gain 111 71 -83.20 gain 71 112 -83.16 gain 112 71 -82.29 gain 71 113 -85.34 gain 113 71 -83.59 gain 71 114 -77.65 gain 114 71 -73.07 gain 71 115 -84.23 gain 115 71 -80.30 gain 71 116 -79.68 gain 116 71 -78.19 gain 71 117 -78.53 gain 117 71 -74.18 gain 71 118 -91.28 gain 118 71 -88.56 gain 71 119 -89.12 gain 119 71 -91.45 gain 71 120 -96.88 gain 120 71 -96.59 gain 71 121 -98.82 gain 121 71 -99.55 gain 71 122 -97.58 gain 122 71 -98.07 gain 71 123 -95.56 gain 123 71 -96.39 gain 71 124 -86.44 gain 124 71 -85.26 gain 71 125 -94.13 gain 125 71 -96.29 gain 71 126 -92.23 gain 126 71 -91.03 gain 71 127 -91.77 gain 127 71 -90.20 gain 71 128 -86.70 gain 128 71 -87.73 gain 71 129 -81.37 gain 129 71 -79.61 gain 71 130 -83.67 gain 130 71 -83.19 gain 71 131 -79.52 gain 131 71 -78.82 gain 71 132 -84.40 gain 132 71 -79.71 gain 71 133 -89.99 gain 133 71 -90.48 gain 71 134 -88.62 gain 134 71 -85.96 gain 71 135 -93.07 gain 135 71 -92.72 gain 71 136 -95.82 gain 136 71 -95.91 gain 71 137 -98.93 gain 137 71 -101.93 gain 71 138 -90.58 gain 138 71 -87.11 gain 71 139 -90.74 gain 139 71 -90.54 gain 71 140 -96.58 gain 140 71 -97.21 gain 71 141 -93.08 gain 141 71 -85.68 gain 71 142 -87.91 gain 142 71 -87.25 gain 71 143 -92.27 gain 143 71 -94.35 gain 71 144 -87.47 gain 144 71 -87.92 gain 71 145 -86.79 gain 145 71 -90.62 gain 71 146 -79.25 gain 146 71 -79.07 gain 71 147 -86.66 gain 147 71 -83.60 gain 71 148 -87.10 gain 148 71 -82.36 gain 71 149 -87.31 gain 149 71 -86.23 gain 71 150 -94.84 gain 150 71 -94.60 gain 71 151 -97.76 gain 151 71 -96.45 gain 71 152 -101.41 gain 152 71 -99.92 gain 71 153 -99.14 gain 153 71 -96.87 gain 71 154 -101.80 gain 154 71 -101.42 gain 71 155 -99.83 gain 155 71 -98.03 gain 71 156 -88.09 gain 156 71 -85.52 gain 71 157 -88.69 gain 157 71 -88.61 gain 71 158 -92.84 gain 158 71 -92.25 gain 71 159 -93.42 gain 159 71 -95.21 gain 71 160 -82.88 gain 160 71 -81.82 gain 71 161 -94.10 gain 161 71 -95.49 gain 71 162 -85.46 gain 162 71 -86.56 gain 71 163 -95.47 gain 163 71 -98.48 gain 71 164 -87.91 gain 164 71 -90.29 gain 71 165 -106.10 gain 165 71 -105.54 gain 71 166 -99.15 gain 166 71 -98.34 gain 71 167 -106.77 gain 167 71 -106.68 gain 71 168 -99.14 gain 168 71 -97.95 gain 71 169 -99.55 gain 169 71 -99.48 gain 71 170 -92.96 gain 170 71 -92.12 gain 71 171 -99.47 gain 171 71 -99.70 gain 71 172 -94.75 gain 172 71 -93.18 gain 71 173 -92.60 gain 173 71 -95.67 gain 71 174 -89.01 gain 174 71 -88.14 gain 71 175 -86.15 gain 175 71 -86.41 gain 71 176 -95.17 gain 176 71 -94.39 gain 71 177 -94.49 gain 177 71 -96.72 gain 71 178 -98.67 gain 178 71 -94.34 gain 71 179 -95.76 gain 179 71 -90.85 gain 71 180 -98.51 gain 180 71 -103.05 gain 71 181 -99.38 gain 181 71 -97.95 gain 71 182 -94.72 gain 182 71 -94.37 gain 71 183 -102.80 gain 183 71 -102.73 gain 71 184 -101.29 gain 184 71 -103.97 gain 71 185 -93.81 gain 185 71 -100.35 gain 71 186 -93.00 gain 186 71 -95.12 gain 71 187 -97.82 gain 187 71 -97.66 gain 71 188 -93.94 gain 188 71 -96.20 gain 71 189 -95.25 gain 189 71 -92.24 gain 71 190 -90.61 gain 190 71 -91.51 gain 71 191 -90.59 gain 191 71 -90.20 gain 71 192 -87.65 gain 192 71 -85.95 gain 71 193 -98.09 gain 193 71 -95.38 gain 71 194 -96.83 gain 194 71 -94.90 gain 71 195 -96.27 gain 195 71 -92.88 gain 71 196 -97.82 gain 196 71 -98.74 gain 71 197 -100.99 gain 197 71 -97.05 gain 71 198 -99.57 gain 198 71 -100.14 gain 71 199 -97.20 gain 199 71 -97.88 gain 71 200 -94.59 gain 200 71 -96.61 gain 71 201 -93.79 gain 201 71 -95.72 gain 71 202 -89.22 gain 202 71 -90.29 gain 71 203 -93.56 gain 203 71 -93.74 gain 71 204 -92.13 gain 204 71 -88.95 gain 71 205 -97.49 gain 205 71 -98.05 gain 71 206 -89.72 gain 206 71 -91.39 gain 71 207 -94.35 gain 207 71 -95.44 gain 71 208 -85.86 gain 208 71 -89.54 gain 71 209 -96.12 gain 209 71 -99.38 gain 71 210 -97.98 gain 210 71 -101.41 gain 71 211 -96.66 gain 211 71 -95.32 gain 71 212 -106.79 gain 212 71 -108.47 gain 71 213 -102.32 gain 213 71 -103.33 gain 71 214 -97.43 gain 214 71 -103.82 gain 71 215 -97.95 gain 215 71 -99.74 gain 71 216 -97.40 gain 216 71 -103.10 gain 71 217 -91.40 gain 217 71 -97.37 gain 71 218 -88.65 gain 218 71 -87.43 gain 71 219 -91.58 gain 219 71 -90.83 gain 71 220 -95.56 gain 220 71 -90.90 gain 71 221 -95.39 gain 221 71 -96.41 gain 71 222 -92.52 gain 222 71 -89.35 gain 71 223 -93.80 gain 223 71 -93.87 gain 71 224 -89.99 gain 224 71 -90.52 gain 72 73 -64.84 gain 73 72 -66.21 gain 72 74 -75.58 gain 74 72 -73.06 gain 72 75 -97.66 gain 75 72 -101.04 gain 72 76 -91.17 gain 76 72 -94.67 gain 72 77 -90.91 gain 77 72 -90.40 gain 72 78 -95.20 gain 78 72 -99.20 gain 72 79 -87.39 gain 79 72 -91.01 gain 72 80 -88.96 gain 80 72 -90.37 gain 72 81 -86.61 gain 81 72 -88.93 gain 72 82 -83.43 gain 82 72 -86.72 gain 72 83 -87.19 gain 83 72 -87.76 gain 72 84 -78.45 gain 84 72 -76.21 gain 72 85 -65.14 gain 85 72 -68.33 gain 72 86 -70.41 gain 86 72 -75.23 gain 72 87 -52.37 gain 87 72 -54.48 gain 72 88 -71.95 gain 88 72 -73.70 gain 72 89 -70.18 gain 89 72 -74.08 gain 72 90 -92.45 gain 90 72 -95.68 gain 72 91 -95.03 gain 91 72 -99.33 gain 72 92 -95.53 gain 92 72 -100.75 gain 72 93 -94.00 gain 93 72 -96.58 gain 72 94 -88.95 gain 94 72 -90.10 gain 72 95 -94.85 gain 95 72 -95.24 gain 72 96 -93.39 gain 96 72 -100.74 gain 72 97 -82.68 gain 97 72 -82.86 gain 72 98 -84.39 gain 98 72 -85.04 gain 72 99 -78.91 gain 99 72 -78.70 gain 72 100 -69.61 gain 100 72 -69.31 gain 72 101 -74.14 gain 101 72 -77.48 gain 72 102 -70.81 gain 102 72 -74.11 gain 72 103 -72.58 gain 103 72 -77.05 gain 72 104 -83.67 gain 104 72 -90.62 gain 72 105 -95.66 gain 105 72 -97.13 gain 72 106 -95.29 gain 106 72 -94.10 gain 72 107 -93.85 gain 107 72 -92.56 gain 72 108 -94.51 gain 108 72 -92.84 gain 72 109 -89.60 gain 109 72 -91.38 gain 72 110 -85.75 gain 110 72 -93.89 gain 72 111 -92.51 gain 111 72 -90.62 gain 72 112 -84.86 gain 112 72 -86.43 gain 72 113 -87.19 gain 113 72 -87.89 gain 72 114 -88.23 gain 114 72 -86.10 gain 72 115 -78.98 gain 115 72 -77.51 gain 72 116 -76.06 gain 116 72 -77.01 gain 72 117 -78.40 gain 117 72 -76.50 gain 72 118 -76.69 gain 118 72 -76.41 gain 72 119 -79.42 gain 119 72 -84.20 gain 72 120 -98.42 gain 120 72 -100.58 gain 72 121 -98.93 gain 121 72 -102.11 gain 72 122 -96.76 gain 122 72 -99.70 gain 72 123 -97.76 gain 123 72 -101.03 gain 72 124 -93.30 gain 124 72 -94.57 gain 72 125 -91.14 gain 125 72 -95.74 gain 72 126 -91.48 gain 126 72 -92.73 gain 72 127 -94.90 gain 127 72 -95.78 gain 72 128 -73.86 gain 128 72 -77.33 gain 72 129 -83.15 gain 129 72 -83.83 gain 72 130 -85.59 gain 130 72 -87.56 gain 72 131 -83.38 gain 131 72 -85.12 gain 72 132 -84.03 gain 132 72 -81.78 gain 72 133 -79.74 gain 133 72 -82.66 gain 72 134 -88.74 gain 134 72 -88.53 gain 72 135 -95.04 gain 135 72 -97.14 gain 72 136 -91.50 gain 136 72 -94.04 gain 72 137 -90.69 gain 137 72 -96.14 gain 72 138 -95.71 gain 138 72 -94.69 gain 72 139 -89.81 gain 139 72 -92.05 gain 72 140 -100.89 gain 140 72 -103.96 gain 72 141 -88.10 gain 141 72 -83.14 gain 72 142 -90.91 gain 142 72 -92.70 gain 72 143 -87.68 gain 143 72 -92.20 gain 72 144 -84.51 gain 144 72 -87.40 gain 72 145 -84.09 gain 145 72 -90.37 gain 72 146 -84.28 gain 146 72 -86.55 gain 72 147 -90.06 gain 147 72 -89.44 gain 72 148 -83.64 gain 148 72 -81.35 gain 72 149 -84.12 gain 149 72 -85.48 gain 72 150 -96.52 gain 150 72 -98.72 gain 72 151 -99.66 gain 151 72 -100.80 gain 72 152 -93.66 gain 152 72 -94.61 gain 72 153 -85.03 gain 153 72 -85.20 gain 72 154 -87.76 gain 154 72 -89.83 gain 72 155 -85.32 gain 155 72 -85.96 gain 72 156 -89.61 gain 156 72 -89.49 gain 72 157 -88.46 gain 157 72 -90.82 gain 72 158 -93.18 gain 158 72 -95.03 gain 72 159 -86.21 gain 159 72 -90.45 gain 72 160 -89.22 gain 160 72 -90.61 gain 72 161 -84.81 gain 161 72 -88.64 gain 72 162 -93.76 gain 162 72 -97.30 gain 72 163 -84.70 gain 163 72 -90.15 gain 72 164 -83.25 gain 164 72 -88.07 gain 72 165 -96.37 gain 165 72 -98.26 gain 72 166 -99.52 gain 166 72 -101.16 gain 72 167 -93.80 gain 167 72 -96.16 gain 72 168 -93.99 gain 168 72 -95.25 gain 72 169 -94.83 gain 169 72 -97.20 gain 72 170 -86.94 gain 170 72 -88.55 gain 72 171 -93.19 gain 171 72 -95.87 gain 72 172 -78.41 gain 172 72 -79.29 gain 72 173 -93.76 gain 173 72 -99.28 gain 72 174 -93.49 gain 174 72 -95.06 gain 72 175 -95.20 gain 175 72 -97.90 gain 72 176 -87.71 gain 176 72 -89.38 gain 72 177 -88.05 gain 177 72 -92.72 gain 72 178 -98.36 gain 178 72 -96.47 gain 72 179 -89.67 gain 179 72 -87.20 gain 72 180 -100.36 gain 180 72 -107.35 gain 72 181 -98.69 gain 181 72 -99.70 gain 72 182 -92.60 gain 182 72 -94.70 gain 72 183 -103.27 gain 183 72 -105.64 gain 72 184 -93.18 gain 184 72 -98.30 gain 72 185 -96.09 gain 185 72 -105.07 gain 72 186 -95.85 gain 186 72 -100.41 gain 72 187 -91.37 gain 187 72 -93.66 gain 72 188 -92.75 gain 188 72 -97.45 gain 72 189 -97.58 gain 189 72 -97.00 gain 72 190 -87.95 gain 190 72 -91.30 gain 72 191 -90.12 gain 191 72 -92.17 gain 72 192 -94.16 gain 192 72 -94.91 gain 72 193 -89.65 gain 193 72 -89.38 gain 72 194 -85.91 gain 194 72 -86.42 gain 72 195 -96.20 gain 195 72 -95.26 gain 72 196 -95.65 gain 196 72 -99.03 gain 72 197 -98.95 gain 197 72 -97.46 gain 72 198 -98.36 gain 198 72 -101.38 gain 72 199 -92.15 gain 199 72 -95.28 gain 72 200 -90.12 gain 200 72 -94.59 gain 72 201 -101.57 gain 201 72 -105.94 gain 72 202 -89.45 gain 202 72 -92.95 gain 72 203 -92.52 gain 203 72 -95.14 gain 72 204 -94.69 gain 204 72 -93.96 gain 72 205 -89.75 gain 205 72 -92.75 gain 72 206 -94.69 gain 206 72 -98.80 gain 72 207 -95.25 gain 207 72 -98.78 gain 72 208 -93.00 gain 208 72 -99.14 gain 72 209 -89.28 gain 209 72 -94.99 gain 72 210 -105.03 gain 210 72 -110.91 gain 72 211 -100.92 gain 211 72 -102.03 gain 72 212 -99.84 gain 212 72 -103.96 gain 72 213 -99.67 gain 213 72 -103.12 gain 72 214 -90.84 gain 214 72 -99.68 gain 72 215 -94.37 gain 215 72 -98.61 gain 72 216 -98.39 gain 216 72 -106.54 gain 72 217 -91.51 gain 217 72 -99.92 gain 72 218 -98.17 gain 218 72 -99.39 gain 72 219 -91.52 gain 219 72 -93.22 gain 72 220 -95.82 gain 220 72 -93.61 gain 72 221 -93.56 gain 221 72 -97.02 gain 72 222 -89.70 gain 222 72 -88.97 gain 72 223 -86.04 gain 223 72 -88.55 gain 72 224 -92.87 gain 224 72 -95.85 gain 73 74 -62.77 gain 74 73 -58.89 gain 73 75 -95.98 gain 75 73 -97.99 gain 73 76 -90.54 gain 76 73 -92.67 gain 73 77 -87.62 gain 77 73 -85.74 gain 73 78 -97.76 gain 78 73 -100.39 gain 73 79 -92.06 gain 79 73 -94.31 gain 73 80 -88.03 gain 80 73 -88.06 gain 73 81 -84.94 gain 81 73 -85.89 gain 73 82 -90.89 gain 82 73 -92.81 gain 73 83 -83.21 gain 83 73 -82.41 gain 73 84 -79.24 gain 84 73 -75.62 gain 73 85 -73.31 gain 85 73 -75.12 gain 73 86 -74.42 gain 86 73 -77.87 gain 73 87 -71.64 gain 87 73 -72.37 gain 73 88 -63.24 gain 88 73 -63.62 gain 73 89 -64.65 gain 89 73 -67.17 gain 73 90 -98.90 gain 90 73 -100.76 gain 73 91 -98.69 gain 91 73 -101.62 gain 73 92 -88.20 gain 92 73 -92.05 gain 73 93 -97.77 gain 93 73 -98.97 gain 73 94 -93.12 gain 94 73 -92.90 gain 73 95 -94.29 gain 95 73 -93.31 gain 73 96 -99.48 gain 96 73 -105.47 gain 73 97 -87.51 gain 97 73 -86.33 gain 73 98 -88.31 gain 98 73 -87.59 gain 73 99 -82.12 gain 99 73 -80.53 gain 73 100 -80.62 gain 100 73 -78.95 gain 73 101 -83.16 gain 101 73 -85.12 gain 73 102 -81.39 gain 102 73 -83.31 gain 73 103 -77.95 gain 103 73 -81.05 gain 73 104 -82.80 gain 104 73 -88.38 gain 73 105 -104.26 gain 105 73 -104.36 gain 73 106 -100.41 gain 106 73 -97.85 gain 73 107 -94.08 gain 107 73 -91.42 gain 73 108 -98.90 gain 108 73 -95.86 gain 73 109 -93.95 gain 109 73 -94.35 gain 73 110 -87.47 gain 110 73 -94.24 gain 73 111 -92.23 gain 111 73 -88.96 gain 73 112 -85.93 gain 112 73 -86.13 gain 73 113 -84.91 gain 113 73 -84.23 gain 73 114 -80.56 gain 114 73 -77.06 gain 73 115 -85.93 gain 115 73 -83.08 gain 73 116 -86.93 gain 116 73 -86.52 gain 73 117 -78.47 gain 117 73 -75.19 gain 73 118 -75.64 gain 118 73 -73.99 gain 73 119 -76.74 gain 119 73 -80.15 gain 73 120 -95.22 gain 120 73 -96.01 gain 73 121 -102.90 gain 121 73 -104.71 gain 73 122 -96.87 gain 122 73 -98.43 gain 73 123 -95.97 gain 123 73 -97.88 gain 73 124 -102.35 gain 124 73 -102.24 gain 73 125 -93.29 gain 125 73 -96.52 gain 73 126 -92.56 gain 126 73 -92.44 gain 73 127 -90.58 gain 127 73 -90.08 gain 73 128 -93.12 gain 128 73 -95.22 gain 73 129 -88.67 gain 129 73 -87.98 gain 73 130 -79.76 gain 130 73 -80.36 gain 73 131 -80.29 gain 131 73 -80.66 gain 73 132 -83.89 gain 132 73 -80.27 gain 73 133 -85.64 gain 133 73 -87.19 gain 73 134 -84.09 gain 134 73 -82.51 gain 73 135 -99.36 gain 135 73 -100.08 gain 73 136 -95.08 gain 136 73 -96.25 gain 73 137 -92.77 gain 137 73 -96.85 gain 73 138 -92.31 gain 138 73 -89.92 gain 73 139 -99.03 gain 139 73 -99.91 gain 73 140 -102.78 gain 140 73 -104.49 gain 73 141 -86.24 gain 141 73 -79.91 gain 73 142 -94.11 gain 142 73 -94.53 gain 73 143 -86.59 gain 143 73 -89.74 gain 73 144 -86.31 gain 144 73 -87.83 gain 73 145 -81.63 gain 145 73 -86.54 gain 73 146 -83.47 gain 146 73 -84.37 gain 73 147 -88.02 gain 147 73 -86.03 gain 73 148 -80.97 gain 148 73 -77.31 gain 73 149 -80.61 gain 149 73 -80.60 gain 73 150 -95.67 gain 150 73 -96.49 gain 73 151 -100.12 gain 151 73 -99.89 gain 73 152 -97.66 gain 152 73 -97.25 gain 73 153 -106.72 gain 153 73 -105.52 gain 73 154 -96.09 gain 154 73 -96.79 gain 73 155 -91.63 gain 155 73 -90.90 gain 73 156 -96.17 gain 156 73 -94.68 gain 73 157 -97.50 gain 157 73 -98.48 gain 73 158 -91.14 gain 158 73 -91.63 gain 73 159 -94.22 gain 159 73 -97.09 gain 73 160 -90.72 gain 160 73 -90.74 gain 73 161 -86.28 gain 161 73 -88.75 gain 73 162 -88.81 gain 162 73 -90.99 gain 73 163 -91.55 gain 163 73 -95.64 gain 73 164 -84.73 gain 164 73 -88.18 gain 73 165 -96.37 gain 165 73 -96.89 gain 73 166 -98.34 gain 166 73 -98.60 gain 73 167 -99.71 gain 167 73 -100.70 gain 73 168 -99.86 gain 168 73 -99.75 gain 73 169 -93.61 gain 169 73 -94.61 gain 73 170 -93.92 gain 170 73 -94.15 gain 73 171 -94.80 gain 171 73 -96.11 gain 73 172 -90.80 gain 172 73 -90.30 gain 73 173 -85.19 gain 173 73 -89.33 gain 73 174 -93.44 gain 174 73 -93.64 gain 73 175 -89.59 gain 175 73 -90.92 gain 73 176 -90.78 gain 176 73 -91.08 gain 73 177 -89.53 gain 177 73 -92.83 gain 73 178 -87.11 gain 178 73 -83.85 gain 73 179 -86.89 gain 179 73 -83.06 gain 73 180 -101.64 gain 180 73 -107.26 gain 73 181 -101.69 gain 181 73 -101.33 gain 73 182 -103.36 gain 182 73 -104.09 gain 73 183 -93.03 gain 183 73 -94.02 gain 73 184 -95.23 gain 184 73 -98.98 gain 73 185 -100.70 gain 185 73 -108.31 gain 73 186 -94.93 gain 186 73 -98.12 gain 73 187 -87.15 gain 187 73 -88.07 gain 73 188 -98.52 gain 188 73 -101.85 gain 73 189 -102.01 gain 189 73 -100.07 gain 73 190 -88.93 gain 190 73 -90.90 gain 73 191 -84.95 gain 191 73 -85.63 gain 73 192 -84.96 gain 192 73 -84.33 gain 73 193 -89.63 gain 193 73 -87.99 gain 73 194 -84.70 gain 194 73 -83.84 gain 73 195 -95.94 gain 195 73 -93.63 gain 73 196 -94.94 gain 196 73 -96.94 gain 73 197 -99.22 gain 197 73 -96.35 gain 73 198 -95.77 gain 198 73 -97.42 gain 73 199 -96.63 gain 199 73 -98.38 gain 73 200 -97.31 gain 200 73 -100.41 gain 73 201 -100.59 gain 201 73 -103.59 gain 73 202 -95.00 gain 202 73 -97.14 gain 73 203 -99.18 gain 203 73 -100.43 gain 73 204 -98.10 gain 204 73 -95.99 gain 73 205 -94.67 gain 205 73 -96.30 gain 73 206 -87.33 gain 206 73 -90.07 gain 73 207 -94.93 gain 207 73 -97.09 gain 73 208 -91.32 gain 208 73 -96.08 gain 73 209 -94.28 gain 209 73 -98.61 gain 73 210 -102.14 gain 210 73 -106.65 gain 73 211 -100.47 gain 211 73 -100.21 gain 73 212 -102.56 gain 212 73 -105.31 gain 73 213 -100.32 gain 213 73 -102.40 gain 73 214 -91.63 gain 214 73 -99.10 gain 73 215 -91.54 gain 215 73 -94.41 gain 73 216 -93.02 gain 216 73 -99.80 gain 73 217 -99.33 gain 217 73 -106.37 gain 73 218 -94.25 gain 218 73 -94.10 gain 73 219 -93.59 gain 219 73 -93.92 gain 73 220 -88.70 gain 220 73 -85.12 gain 73 221 -101.01 gain 221 73 -103.11 gain 73 222 -92.90 gain 222 73 -90.80 gain 73 223 -85.49 gain 223 73 -86.63 gain 73 224 -101.78 gain 224 73 -103.39 gain 74 75 -88.19 gain 75 74 -94.08 gain 74 76 -88.16 gain 76 74 -94.17 gain 74 77 -96.14 gain 77 74 -98.15 gain 74 78 -91.28 gain 78 74 -97.79 gain 74 79 -96.37 gain 79 74 -102.51 gain 74 80 -95.03 gain 80 74 -98.96 gain 74 81 -86.14 gain 81 74 -90.97 gain 74 82 -83.79 gain 82 74 -89.60 gain 74 83 -80.82 gain 83 74 -83.90 gain 74 84 -81.23 gain 84 74 -81.50 gain 74 85 -70.86 gain 85 74 -76.56 gain 74 86 -74.24 gain 86 74 -81.57 gain 74 87 -63.83 gain 87 74 -68.46 gain 74 88 -63.22 gain 88 74 -67.49 gain 74 89 -64.10 gain 89 74 -70.51 gain 74 90 -97.25 gain 90 74 -103.00 gain 74 91 -100.62 gain 91 74 -107.44 gain 74 92 -89.02 gain 92 74 -96.75 gain 74 93 -90.91 gain 93 74 -96.01 gain 74 94 -82.63 gain 94 74 -86.29 gain 74 95 -92.45 gain 95 74 -95.35 gain 74 96 -82.09 gain 96 74 -91.96 gain 74 97 -86.58 gain 97 74 -89.27 gain 74 98 -85.28 gain 98 74 -88.44 gain 74 99 -85.48 gain 99 74 -87.78 gain 74 100 -82.48 gain 100 74 -84.69 gain 74 101 -85.75 gain 101 74 -91.60 gain 74 102 -75.17 gain 102 74 -80.98 gain 74 103 -75.12 gain 103 74 -82.10 gain 74 104 -68.54 gain 104 74 -78.01 gain 74 105 -98.47 gain 105 74 -102.45 gain 74 106 -88.94 gain 106 74 -90.25 gain 74 107 -95.93 gain 107 74 -97.15 gain 74 108 -90.43 gain 108 74 -91.27 gain 74 109 -87.92 gain 109 74 -92.21 gain 74 110 -94.26 gain 110 74 -104.91 gain 74 111 -90.04 gain 111 74 -90.66 gain 74 112 -80.37 gain 112 74 -84.46 gain 74 113 -87.08 gain 113 74 -90.30 gain 74 114 -77.40 gain 114 74 -77.78 gain 74 115 -87.82 gain 115 74 -88.86 gain 74 116 -74.38 gain 116 74 -77.84 gain 74 117 -72.82 gain 117 74 -73.43 gain 74 118 -83.41 gain 118 74 -85.64 gain 74 119 -71.79 gain 119 74 -79.09 gain 74 120 -91.62 gain 120 74 -96.29 gain 74 121 -90.93 gain 121 74 -96.63 gain 74 122 -92.57 gain 122 74 -98.02 gain 74 123 -90.60 gain 123 74 -96.38 gain 74 124 -85.45 gain 124 74 -89.23 gain 74 125 -86.01 gain 125 74 -93.13 gain 74 126 -94.74 gain 126 74 -98.50 gain 74 127 -86.67 gain 127 74 -90.06 gain 74 128 -88.27 gain 128 74 -94.25 gain 74 129 -83.75 gain 129 74 -86.94 gain 74 130 -83.64 gain 130 74 -88.13 gain 74 131 -83.54 gain 131 74 -87.80 gain 74 132 -73.88 gain 132 74 -74.14 gain 74 133 -82.13 gain 133 74 -87.58 gain 74 134 -81.70 gain 134 74 -84.01 gain 74 135 -94.23 gain 135 74 -98.84 gain 74 136 -90.70 gain 136 74 -95.75 gain 74 137 -88.15 gain 137 74 -96.12 gain 74 138 -88.53 gain 138 74 -90.03 gain 74 139 -90.88 gain 139 74 -95.64 gain 74 140 -84.66 gain 140 74 -90.25 gain 74 141 -89.60 gain 141 74 -87.16 gain 74 142 -85.40 gain 142 74 -89.70 gain 74 143 -86.11 gain 143 74 -93.15 gain 74 144 -86.50 gain 144 74 -91.91 gain 74 145 -85.40 gain 145 74 -94.19 gain 74 146 -84.53 gain 146 74 -89.31 gain 74 147 -88.75 gain 147 74 -90.64 gain 74 148 -78.97 gain 148 74 -79.19 gain 74 149 -84.09 gain 149 74 -87.97 gain 74 150 -90.89 gain 150 74 -95.60 gain 74 151 -95.40 gain 151 74 -99.06 gain 74 152 -94.40 gain 152 74 -97.87 gain 74 153 -94.40 gain 153 74 -97.09 gain 74 154 -94.55 gain 154 74 -99.13 gain 74 155 -97.90 gain 155 74 -101.06 gain 74 156 -86.30 gain 156 74 -88.69 gain 74 157 -94.67 gain 157 74 -99.54 gain 74 158 -85.35 gain 158 74 -89.72 gain 74 159 -81.96 gain 159 74 -88.72 gain 74 160 -90.09 gain 160 74 -94.00 gain 74 161 -90.03 gain 161 74 -96.38 gain 74 162 -86.77 gain 162 74 -92.82 gain 74 163 -87.41 gain 163 74 -95.38 gain 74 164 -83.11 gain 164 74 -90.45 gain 74 165 -99.02 gain 165 74 -103.42 gain 74 166 -103.20 gain 166 74 -107.36 gain 74 167 -99.81 gain 167 74 -104.68 gain 74 168 -96.69 gain 168 74 -100.46 gain 74 169 -87.89 gain 169 74 -92.78 gain 74 170 -88.66 gain 170 74 -92.78 gain 74 171 -85.62 gain 171 74 -90.82 gain 74 172 -86.51 gain 172 74 -89.90 gain 74 173 -86.95 gain 173 74 -94.99 gain 74 174 -90.87 gain 174 74 -94.95 gain 74 175 -82.22 gain 175 74 -87.44 gain 74 176 -85.34 gain 176 74 -89.52 gain 74 177 -90.44 gain 177 74 -97.62 gain 74 178 -87.24 gain 178 74 -87.87 gain 74 179 -90.74 gain 179 74 -90.79 gain 74 180 -99.20 gain 180 74 -108.70 gain 74 181 -96.66 gain 181 74 -100.18 gain 74 182 -97.98 gain 182 74 -102.58 gain 74 183 -97.07 gain 183 74 -101.95 gain 74 184 -96.03 gain 184 74 -103.66 gain 74 185 -95.16 gain 185 74 -106.66 gain 74 186 -91.44 gain 186 74 -98.52 gain 74 187 -101.67 gain 187 74 -106.48 gain 74 188 -88.33 gain 188 74 -95.55 gain 74 189 -91.95 gain 189 74 -93.89 gain 74 190 -93.24 gain 190 74 -99.10 gain 74 191 -97.44 gain 191 74 -102.01 gain 74 192 -91.58 gain 192 74 -94.84 gain 74 193 -80.10 gain 193 74 -82.35 gain 74 194 -89.38 gain 194 74 -92.41 gain 74 195 -98.50 gain 195 74 -100.07 gain 74 196 -99.26 gain 196 74 -105.15 gain 74 197 -103.39 gain 197 74 -104.41 gain 74 198 -99.32 gain 198 74 -104.86 gain 74 199 -86.54 gain 199 74 -92.19 gain 74 200 -93.27 gain 200 74 -100.24 gain 74 201 -88.12 gain 201 74 -95.00 gain 74 202 -94.06 gain 202 74 -100.09 gain 74 203 -99.19 gain 203 74 -104.33 gain 74 204 -89.17 gain 204 74 -90.95 gain 74 205 -87.35 gain 205 74 -92.87 gain 74 206 -89.07 gain 206 74 -95.70 gain 74 207 -87.57 gain 207 74 -93.62 gain 74 208 -92.18 gain 208 74 -100.82 gain 74 209 -91.64 gain 209 74 -99.86 gain 74 210 -100.46 gain 210 74 -108.85 gain 74 211 -97.79 gain 211 74 -101.41 gain 74 212 -91.13 gain 212 74 -97.77 gain 74 213 -89.43 gain 213 74 -95.39 gain 74 214 -93.88 gain 214 74 -105.23 gain 74 215 -86.71 gain 215 74 -93.46 gain 74 216 -94.94 gain 216 74 -105.60 gain 74 217 -97.08 gain 217 74 -108.01 gain 74 218 -86.16 gain 218 74 -89.90 gain 74 219 -84.57 gain 219 74 -88.78 gain 74 220 -96.78 gain 220 74 -97.08 gain 74 221 -93.64 gain 221 74 -99.62 gain 74 222 -90.37 gain 222 74 -92.15 gain 74 223 -84.16 gain 223 74 -89.18 gain 74 224 -93.81 gain 224 74 -99.31 gain 75 76 -71.76 gain 76 75 -71.88 gain 75 77 -77.62 gain 77 75 -73.74 gain 75 78 -85.80 gain 78 75 -86.42 gain 75 79 -81.87 gain 79 75 -82.12 gain 75 80 -85.59 gain 80 75 -83.63 gain 75 81 -90.14 gain 81 75 -89.09 gain 75 82 -98.01 gain 82 75 -97.93 gain 75 83 -90.86 gain 83 75 -88.05 gain 75 84 -89.04 gain 84 75 -83.42 gain 75 85 -100.88 gain 85 75 -100.69 gain 75 86 -95.31 gain 86 75 -96.76 gain 75 87 -95.61 gain 87 75 -94.35 gain 75 88 -96.81 gain 88 75 -95.18 gain 75 89 -103.80 gain 89 75 -104.32 gain 75 90 -64.98 gain 90 75 -64.84 gain 75 91 -68.01 gain 91 75 -68.94 gain 75 92 -89.47 gain 92 75 -91.32 gain 75 93 -83.58 gain 93 75 -82.78 gain 75 94 -92.93 gain 94 75 -90.70 gain 75 95 -83.72 gain 95 75 -80.73 gain 75 96 -87.44 gain 96 75 -91.42 gain 75 97 -92.73 gain 97 75 -89.54 gain 75 98 -91.69 gain 98 75 -88.97 gain 75 99 -84.00 gain 99 75 -80.41 gain 75 100 -97.28 gain 100 75 -93.61 gain 75 101 -99.06 gain 101 75 -99.02 gain 75 102 -97.22 gain 102 75 -97.15 gain 75 103 -98.99 gain 103 75 -100.08 gain 75 104 -98.15 gain 104 75 -101.72 gain 75 105 -74.88 gain 105 75 -72.98 gain 75 106 -79.20 gain 106 75 -74.63 gain 75 107 -75.48 gain 107 75 -70.81 gain 75 108 -78.62 gain 108 75 -73.57 gain 75 109 -93.16 gain 109 75 -91.56 gain 75 110 -91.36 gain 110 75 -96.12 gain 75 111 -94.06 gain 111 75 -88.80 gain 75 112 -93.40 gain 112 75 -91.60 gain 75 113 -94.40 gain 113 75 -91.72 gain 75 114 -97.87 gain 114 75 -92.36 gain 75 115 -92.62 gain 115 75 -87.76 gain 75 116 -99.88 gain 116 75 -97.46 gain 75 117 -92.20 gain 117 75 -86.93 gain 75 118 -102.79 gain 118 75 -99.14 gain 75 119 -107.23 gain 119 75 -108.63 gain 75 120 -82.12 gain 120 75 -80.91 gain 75 121 -76.57 gain 121 75 -76.38 gain 75 122 -82.67 gain 122 75 -82.23 gain 75 123 -84.11 gain 123 75 -84.01 gain 75 124 -87.37 gain 124 75 -85.26 gain 75 125 -92.82 gain 125 75 -94.05 gain 75 126 -91.21 gain 126 75 -89.08 gain 75 127 -91.46 gain 127 75 -88.96 gain 75 128 -96.41 gain 128 75 -96.51 gain 75 129 -98.78 gain 129 75 -96.08 gain 75 130 -95.70 gain 130 75 -94.30 gain 75 131 -95.12 gain 131 75 -93.49 gain 75 132 -97.07 gain 132 75 -91.45 gain 75 133 -97.12 gain 133 75 -96.68 gain 75 134 -103.87 gain 134 75 -100.29 gain 75 135 -82.99 gain 135 75 -81.71 gain 75 136 -91.39 gain 136 75 -90.55 gain 75 137 -90.01 gain 137 75 -92.08 gain 75 138 -88.25 gain 138 75 -83.85 gain 75 139 -82.91 gain 139 75 -81.78 gain 75 140 -89.65 gain 140 75 -89.35 gain 75 141 -94.60 gain 141 75 -86.27 gain 75 142 -94.64 gain 142 75 -93.05 gain 75 143 -90.28 gain 143 75 -91.44 gain 75 144 -99.50 gain 144 75 -99.01 gain 75 145 -103.76 gain 145 75 -106.66 gain 75 146 -96.41 gain 146 75 -95.30 gain 75 147 -99.00 gain 147 75 -95.00 gain 75 148 -102.49 gain 148 75 -96.82 gain 75 149 -103.99 gain 149 75 -101.98 gain 75 150 -89.55 gain 150 75 -88.37 gain 75 151 -82.61 gain 151 75 -80.38 gain 75 152 -88.51 gain 152 75 -86.09 gain 75 153 -82.20 gain 153 75 -78.99 gain 75 154 -82.12 gain 154 75 -80.82 gain 75 155 -94.87 gain 155 75 -92.14 gain 75 156 -91.78 gain 156 75 -88.28 gain 75 157 -96.07 gain 157 75 -95.05 gain 75 158 -97.44 gain 158 75 -95.92 gain 75 159 -96.89 gain 159 75 -97.76 gain 75 160 -97.66 gain 160 75 -95.68 gain 75 161 -93.46 gain 161 75 -93.92 gain 75 162 -96.39 gain 162 75 -96.56 gain 75 163 -97.67 gain 163 75 -99.75 gain 75 164 -100.81 gain 164 75 -102.26 gain 75 165 -91.68 gain 165 75 -90.19 gain 75 166 -91.90 gain 166 75 -90.16 gain 75 167 -91.42 gain 167 75 -90.41 gain 75 168 -93.06 gain 168 75 -90.94 gain 75 169 -87.64 gain 169 75 -86.64 gain 75 170 -89.81 gain 170 75 -88.04 gain 75 171 -91.63 gain 171 75 -90.94 gain 75 172 -97.43 gain 172 75 -94.93 gain 75 173 -93.51 gain 173 75 -95.66 gain 75 174 -102.20 gain 174 75 -100.39 gain 75 175 -97.72 gain 175 75 -97.05 gain 75 176 -98.88 gain 176 75 -97.18 gain 75 177 -98.18 gain 177 75 -99.48 gain 75 178 -95.07 gain 178 75 -89.81 gain 75 179 -96.94 gain 179 75 -91.11 gain 75 180 -93.95 gain 180 75 -97.56 gain 75 181 -89.34 gain 181 75 -86.97 gain 75 182 -87.89 gain 182 75 -86.61 gain 75 183 -92.99 gain 183 75 -91.98 gain 75 184 -90.91 gain 184 75 -92.65 gain 75 185 -94.30 gain 185 75 -99.90 gain 75 186 -102.66 gain 186 75 -103.84 gain 75 187 -97.70 gain 187 75 -96.61 gain 75 188 -86.03 gain 188 75 -87.35 gain 75 189 -106.20 gain 189 75 -102.26 gain 75 190 -101.13 gain 190 75 -101.10 gain 75 191 -104.70 gain 191 75 -103.37 gain 75 192 -102.06 gain 192 75 -99.43 gain 75 193 -103.39 gain 193 75 -99.75 gain 75 194 -100.66 gain 194 75 -97.80 gain 75 195 -91.47 gain 195 75 -87.16 gain 75 196 -104.65 gain 196 75 -104.65 gain 75 197 -93.10 gain 197 75 -88.23 gain 75 198 -95.50 gain 198 75 -95.15 gain 75 199 -94.51 gain 199 75 -94.27 gain 75 200 -94.26 gain 200 75 -95.35 gain 75 201 -96.23 gain 201 75 -97.23 gain 75 202 -95.13 gain 202 75 -95.26 gain 75 203 -94.48 gain 203 75 -93.73 gain 75 204 -95.43 gain 204 75 -91.32 gain 75 205 -100.22 gain 205 75 -99.85 gain 75 206 -91.38 gain 206 75 -92.12 gain 75 207 -100.07 gain 207 75 -100.23 gain 75 208 -101.79 gain 208 75 -104.55 gain 75 209 -104.95 gain 209 75 -107.28 gain 75 210 -87.94 gain 210 75 -90.44 gain 75 211 -97.41 gain 211 75 -95.15 gain 75 212 -94.35 gain 212 75 -95.10 gain 75 213 -100.87 gain 213 75 -100.95 gain 75 214 -104.33 gain 214 75 -109.79 gain 75 215 -95.80 gain 215 75 -96.67 gain 75 216 -97.40 gain 216 75 -102.17 gain 75 217 -95.55 gain 217 75 -100.59 gain 75 218 -99.36 gain 218 75 -97.21 gain 75 219 -107.29 gain 219 75 -105.62 gain 75 220 -98.77 gain 220 75 -93.18 gain 75 221 -95.49 gain 221 75 -95.58 gain 75 222 -100.89 gain 222 75 -96.79 gain 75 223 -100.43 gain 223 75 -99.56 gain 75 224 -103.68 gain 224 75 -103.29 gain 76 77 -61.51 gain 77 76 -57.50 gain 76 78 -75.25 gain 78 76 -75.74 gain 76 79 -76.84 gain 79 76 -76.96 gain 76 80 -92.98 gain 80 76 -90.89 gain 76 81 -85.57 gain 81 76 -84.39 gain 76 82 -91.49 gain 82 76 -91.29 gain 76 83 -92.99 gain 83 76 -90.06 gain 76 84 -98.63 gain 84 76 -92.88 gain 76 85 -98.69 gain 85 76 -98.37 gain 76 86 -99.43 gain 86 76 -100.75 gain 76 87 -90.55 gain 87 76 -89.16 gain 76 88 -91.45 gain 88 76 -89.70 gain 76 89 -98.86 gain 89 76 -99.25 gain 76 90 -66.21 gain 90 76 -65.94 gain 76 91 -62.37 gain 91 76 -63.18 gain 76 92 -68.80 gain 92 76 -70.52 gain 76 93 -75.02 gain 93 76 -74.10 gain 76 94 -74.66 gain 94 76 -72.31 gain 76 95 -91.30 gain 95 76 -88.19 gain 76 96 -89.76 gain 96 76 -93.62 gain 76 97 -95.09 gain 97 76 -91.78 gain 76 98 -87.75 gain 98 76 -84.90 gain 76 99 -94.62 gain 99 76 -90.91 gain 76 100 -96.05 gain 100 76 -92.25 gain 76 101 -100.37 gain 101 76 -100.20 gain 76 102 -92.05 gain 102 76 -91.85 gain 76 103 -102.30 gain 103 76 -103.27 gain 76 104 -98.51 gain 104 76 -101.96 gain 76 105 -84.49 gain 105 76 -82.46 gain 76 106 -76.89 gain 106 76 -72.19 gain 76 107 -75.58 gain 107 76 -70.79 gain 76 108 -79.63 gain 108 76 -74.46 gain 76 109 -78.62 gain 109 76 -76.90 gain 76 110 -86.43 gain 110 76 -91.08 gain 76 111 -88.33 gain 111 76 -82.94 gain 76 112 -90.70 gain 112 76 -88.78 gain 76 113 -94.20 gain 113 76 -91.40 gain 76 114 -96.93 gain 114 76 -91.30 gain 76 115 -93.71 gain 115 76 -88.73 gain 76 116 -97.43 gain 116 76 -94.88 gain 76 117 -98.48 gain 117 76 -93.08 gain 76 118 -106.51 gain 118 76 -102.73 gain 76 119 -98.08 gain 119 76 -99.36 gain 76 120 -80.40 gain 120 76 -79.06 gain 76 121 -79.71 gain 121 76 -79.39 gain 76 122 -80.77 gain 122 76 -80.21 gain 76 123 -81.10 gain 123 76 -80.88 gain 76 124 -84.29 gain 124 76 -82.05 gain 76 125 -84.43 gain 125 76 -85.54 gain 76 126 -92.06 gain 126 76 -89.81 gain 76 127 -92.14 gain 127 76 -89.51 gain 76 128 -96.57 gain 128 76 -96.55 gain 76 129 -89.31 gain 129 76 -86.49 gain 76 130 -101.68 gain 130 76 -100.15 gain 76 131 -95.15 gain 131 76 -93.40 gain 76 132 -102.18 gain 132 76 -96.44 gain 76 133 -94.33 gain 133 76 -93.76 gain 76 134 -102.21 gain 134 76 -98.50 gain 76 135 -88.83 gain 135 76 -87.42 gain 76 136 -84.72 gain 136 76 -83.76 gain 76 137 -79.81 gain 137 76 -81.76 gain 76 138 -86.07 gain 138 76 -81.55 gain 76 139 -86.63 gain 139 76 -85.38 gain 76 140 -92.00 gain 140 76 -91.58 gain 76 141 -84.97 gain 141 76 -76.51 gain 76 142 -96.85 gain 142 76 -95.14 gain 76 143 -93.12 gain 143 76 -94.14 gain 76 144 -95.65 gain 144 76 -95.04 gain 76 145 -92.57 gain 145 76 -95.35 gain 76 146 -98.55 gain 146 76 -97.32 gain 76 147 -98.87 gain 147 76 -94.75 gain 76 148 -103.16 gain 148 76 -97.37 gain 76 149 -94.15 gain 149 76 -92.02 gain 76 150 -83.95 gain 150 76 -82.65 gain 76 151 -88.22 gain 151 76 -85.86 gain 76 152 -92.79 gain 152 76 -90.25 gain 76 153 -86.27 gain 153 76 -82.94 gain 76 154 -90.37 gain 154 76 -88.94 gain 76 155 -89.22 gain 155 76 -86.36 gain 76 156 -88.47 gain 156 76 -84.85 gain 76 157 -92.11 gain 157 76 -90.97 gain 76 158 -95.56 gain 158 76 -93.92 gain 76 159 -93.20 gain 159 76 -93.94 gain 76 160 -100.42 gain 160 76 -98.31 gain 76 161 -95.99 gain 161 76 -96.33 gain 76 162 -95.61 gain 162 76 -95.65 gain 76 163 -111.54 gain 163 76 -113.50 gain 76 164 -102.72 gain 164 76 -104.05 gain 76 165 -87.24 gain 165 76 -85.63 gain 76 166 -82.69 gain 166 76 -80.83 gain 76 167 -89.01 gain 167 76 -87.87 gain 76 168 -96.94 gain 168 76 -94.70 gain 76 169 -85.32 gain 169 76 -84.19 gain 76 170 -90.16 gain 170 76 -88.26 gain 76 171 -95.72 gain 171 76 -94.91 gain 76 172 -94.94 gain 172 76 -92.32 gain 76 173 -88.12 gain 173 76 -90.14 gain 76 174 -89.71 gain 174 76 -87.78 gain 76 175 -96.52 gain 175 76 -95.73 gain 76 176 -94.14 gain 176 76 -92.31 gain 76 177 -106.30 gain 177 76 -107.48 gain 76 178 -104.50 gain 178 76 -99.12 gain 76 179 -97.72 gain 179 76 -91.76 gain 76 180 -95.88 gain 180 76 -99.36 gain 76 181 -92.73 gain 181 76 -90.24 gain 76 182 -90.60 gain 182 76 -89.19 gain 76 183 -91.17 gain 183 76 -90.04 gain 76 184 -88.26 gain 184 76 -89.88 gain 76 185 -96.49 gain 185 76 -101.98 gain 76 186 -96.30 gain 186 76 -97.36 gain 76 187 -99.37 gain 187 76 -98.16 gain 76 188 -94.86 gain 188 76 -96.06 gain 76 189 -96.53 gain 189 76 -92.46 gain 76 190 -100.08 gain 190 76 -99.93 gain 76 191 -103.61 gain 191 76 -102.16 gain 76 192 -100.46 gain 192 76 -97.70 gain 76 193 -105.62 gain 193 76 -101.85 gain 76 194 -100.01 gain 194 76 -97.03 gain 76 195 -91.91 gain 195 76 -87.47 gain 76 196 -87.97 gain 196 76 -87.84 gain 76 197 -86.47 gain 197 76 -81.47 gain 76 198 -95.07 gain 198 76 -94.59 gain 76 199 -102.71 gain 199 76 -102.33 gain 76 200 -98.65 gain 200 76 -99.61 gain 76 201 -95.66 gain 201 76 -96.53 gain 76 202 -93.96 gain 202 76 -93.97 gain 76 203 -95.47 gain 203 76 -94.59 gain 76 204 -95.38 gain 204 76 -91.14 gain 76 205 -97.40 gain 205 76 -96.91 gain 76 206 -93.22 gain 206 76 -93.84 gain 76 207 -95.32 gain 207 76 -95.35 gain 76 208 -102.55 gain 208 76 -105.19 gain 76 209 -96.07 gain 209 76 -98.27 gain 76 210 -95.86 gain 210 76 -98.24 gain 76 211 -91.27 gain 211 76 -88.88 gain 76 212 -93.39 gain 212 76 -94.01 gain 76 213 -97.96 gain 213 76 -97.91 gain 76 214 -101.11 gain 214 76 -106.44 gain 76 215 -91.68 gain 215 76 -92.42 gain 76 216 -94.86 gain 216 76 -99.51 gain 76 217 -96.00 gain 217 76 -100.91 gain 76 218 -98.70 gain 218 76 -96.42 gain 76 219 -100.50 gain 219 76 -98.70 gain 76 220 -97.79 gain 220 76 -92.08 gain 76 221 -104.77 gain 221 76 -104.73 gain 76 222 -104.21 gain 222 76 -99.98 gain 76 223 -98.22 gain 223 76 -97.23 gain 76 224 -102.76 gain 224 76 -102.24 gain 77 78 -66.70 gain 78 77 -71.20 gain 77 79 -72.80 gain 79 77 -76.92 gain 77 80 -71.37 gain 80 77 -73.28 gain 77 81 -78.63 gain 81 77 -81.45 gain 77 82 -76.68 gain 82 77 -80.48 gain 77 83 -85.13 gain 83 77 -86.20 gain 77 84 -86.68 gain 84 77 -84.94 gain 77 85 -88.82 gain 85 77 -92.51 gain 77 86 -95.55 gain 86 77 -100.88 gain 77 87 -88.39 gain 87 77 -91.00 gain 77 88 -87.65 gain 88 77 -89.91 gain 77 89 -98.66 gain 89 77 -103.06 gain 77 90 -68.99 gain 90 77 -72.73 gain 77 91 -66.00 gain 91 77 -70.81 gain 77 92 -54.78 gain 92 77 -60.50 gain 77 93 -66.54 gain 93 77 -69.62 gain 77 94 -70.75 gain 94 77 -72.40 gain 77 95 -75.40 gain 95 77 -76.29 gain 77 96 -84.20 gain 96 77 -92.06 gain 77 97 -83.62 gain 97 77 -84.31 gain 77 98 -89.99 gain 98 77 -91.15 gain 77 99 -91.62 gain 99 77 -91.91 gain 77 100 -88.68 gain 100 77 -88.89 gain 77 101 -86.92 gain 101 77 -90.76 gain 77 102 -91.10 gain 102 77 -94.91 gain 77 103 -92.83 gain 103 77 -97.80 gain 77 104 -97.74 gain 104 77 -105.20 gain 77 105 -73.71 gain 105 77 -75.69 gain 77 106 -74.40 gain 106 77 -73.71 gain 77 107 -76.37 gain 107 77 -75.59 gain 77 108 -71.17 gain 108 77 -70.00 gain 77 109 -77.48 gain 109 77 -79.76 gain 77 110 -84.02 gain 110 77 -92.66 gain 77 111 -80.94 gain 111 77 -79.56 gain 77 112 -83.95 gain 112 77 -86.02 gain 77 113 -83.50 gain 113 77 -84.70 gain 77 114 -92.32 gain 114 77 -90.69 gain 77 115 -91.68 gain 115 77 -90.70 gain 77 116 -94.33 gain 116 77 -95.79 gain 77 117 -92.98 gain 117 77 -91.59 gain 77 118 -93.00 gain 118 77 -93.22 gain 77 119 -86.73 gain 119 77 -92.01 gain 77 120 -78.65 gain 120 77 -81.31 gain 77 121 -73.15 gain 121 77 -76.84 gain 77 122 -74.51 gain 122 77 -77.95 gain 77 123 -76.90 gain 123 77 -80.68 gain 77 124 -78.29 gain 124 77 -80.06 gain 77 125 -74.93 gain 125 77 -80.04 gain 77 126 -85.14 gain 126 77 -86.90 gain 77 127 -83.85 gain 127 77 -85.23 gain 77 128 -86.34 gain 128 77 -90.32 gain 77 129 -84.19 gain 129 77 -85.38 gain 77 130 -93.95 gain 130 77 -96.42 gain 77 131 -98.92 gain 131 77 -101.17 gain 77 132 -93.34 gain 132 77 -91.60 gain 77 133 -92.86 gain 133 77 -96.29 gain 77 134 -94.68 gain 134 77 -94.98 gain 77 135 -80.18 gain 135 77 -82.78 gain 77 136 -81.33 gain 136 77 -84.37 gain 77 137 -86.36 gain 137 77 -92.31 gain 77 138 -76.36 gain 138 77 -75.85 gain 77 139 -76.86 gain 139 77 -79.61 gain 77 140 -87.37 gain 140 77 -90.95 gain 77 141 -76.60 gain 141 77 -72.15 gain 77 142 -91.52 gain 142 77 -93.82 gain 77 143 -86.16 gain 143 77 -91.19 gain 77 144 -91.77 gain 144 77 -95.16 gain 77 145 -91.24 gain 145 77 -98.02 gain 77 146 -90.14 gain 146 77 -92.91 gain 77 147 -93.15 gain 147 77 -93.03 gain 77 148 -93.30 gain 148 77 -91.51 gain 77 149 -94.63 gain 149 77 -96.49 gain 77 150 -85.69 gain 150 77 -88.39 gain 77 151 -86.44 gain 151 77 -88.08 gain 77 152 -83.53 gain 152 77 -84.99 gain 77 153 -80.13 gain 153 77 -80.81 gain 77 154 -86.87 gain 154 77 -89.44 gain 77 155 -87.23 gain 155 77 -88.38 gain 77 156 -86.93 gain 156 77 -87.31 gain 77 157 -89.11 gain 157 77 -91.97 gain 77 158 -88.11 gain 158 77 -90.47 gain 77 159 -83.44 gain 159 77 -88.18 gain 77 160 -96.25 gain 160 77 -98.15 gain 77 161 -90.40 gain 161 77 -94.73 gain 77 162 -94.41 gain 162 77 -98.46 gain 77 163 -96.78 gain 163 77 -102.74 gain 77 164 -96.92 gain 164 77 -102.25 gain 77 165 -87.24 gain 165 77 -89.63 gain 77 166 -87.00 gain 166 77 -89.14 gain 77 167 -81.10 gain 167 77 -83.97 gain 77 168 -84.57 gain 168 77 -86.33 gain 77 169 -82.45 gain 169 77 -85.32 gain 77 170 -84.20 gain 170 77 -86.30 gain 77 171 -96.40 gain 171 77 -99.58 gain 77 172 -95.28 gain 172 77 -96.65 gain 77 173 -94.09 gain 173 77 -100.12 gain 77 174 -87.19 gain 174 77 -89.27 gain 77 175 -97.45 gain 175 77 -100.66 gain 77 176 -93.60 gain 176 77 -95.77 gain 77 177 -96.10 gain 177 77 -101.28 gain 77 178 -95.96 gain 178 77 -94.58 gain 77 179 -101.40 gain 179 77 -99.44 gain 77 180 -93.50 gain 180 77 -100.99 gain 77 181 -83.41 gain 181 77 -84.93 gain 77 182 -87.76 gain 182 77 -90.35 gain 77 183 -79.68 gain 183 77 -82.55 gain 77 184 -96.98 gain 184 77 -102.60 gain 77 185 -98.01 gain 185 77 -107.50 gain 77 186 -86.86 gain 186 77 -91.93 gain 77 187 -96.51 gain 187 77 -99.31 gain 77 188 -97.82 gain 188 77 -103.02 gain 77 189 -88.91 gain 189 77 -88.84 gain 77 190 -96.66 gain 190 77 -100.51 gain 77 191 -92.29 gain 191 77 -94.85 gain 77 192 -85.08 gain 192 77 -86.33 gain 77 193 -98.54 gain 193 77 -98.78 gain 77 194 -88.78 gain 194 77 -89.80 gain 77 195 -88.31 gain 195 77 -87.88 gain 77 196 -90.80 gain 196 77 -94.67 gain 77 197 -88.22 gain 197 77 -87.23 gain 77 198 -87.94 gain 198 77 -91.46 gain 77 199 -94.90 gain 199 77 -98.54 gain 77 200 -100.16 gain 200 77 -105.13 gain 77 201 -92.00 gain 201 77 -96.88 gain 77 202 -91.95 gain 202 77 -95.96 gain 77 203 -97.31 gain 203 77 -100.44 gain 77 204 -89.90 gain 204 77 -89.66 gain 77 205 -88.51 gain 205 77 -92.01 gain 77 206 -99.29 gain 206 77 -103.91 gain 77 207 -94.89 gain 207 77 -98.93 gain 77 208 -99.60 gain 208 77 -106.24 gain 77 209 -94.27 gain 209 77 -100.48 gain 77 210 -88.20 gain 210 77 -94.58 gain 77 211 -86.05 gain 211 77 -87.66 gain 77 212 -93.84 gain 212 77 -98.46 gain 77 213 -89.65 gain 213 77 -93.61 gain 77 214 -94.67 gain 214 77 -104.01 gain 77 215 -89.84 gain 215 77 -94.58 gain 77 216 -88.51 gain 216 77 -97.16 gain 77 217 -91.01 gain 217 77 -99.93 gain 77 218 -104.03 gain 218 77 -105.75 gain 77 219 -99.25 gain 219 77 -101.45 gain 77 220 -94.16 gain 220 77 -92.45 gain 77 221 -90.23 gain 221 77 -94.20 gain 77 222 -96.30 gain 222 77 -96.07 gain 77 223 -94.41 gain 223 77 -97.43 gain 77 224 -97.74 gain 224 77 -101.23 gain 78 79 -63.88 gain 79 78 -63.50 gain 78 80 -76.87 gain 80 78 -74.28 gain 78 81 -77.82 gain 81 78 -76.14 gain 78 82 -84.35 gain 82 78 -83.65 gain 78 83 -83.41 gain 83 78 -79.98 gain 78 84 -92.70 gain 84 78 -86.46 gain 78 85 -82.99 gain 85 78 -82.17 gain 78 86 -91.03 gain 86 78 -91.86 gain 78 87 -97.37 gain 87 78 -95.49 gain 78 88 -94.00 gain 88 78 -91.75 gain 78 89 -103.46 gain 89 78 -103.36 gain 78 90 -82.03 gain 90 78 -81.27 gain 78 91 -75.39 gain 91 78 -75.69 gain 78 92 -75.37 gain 92 78 -76.60 gain 78 93 -69.29 gain 93 78 -67.87 gain 78 94 -78.43 gain 94 78 -75.58 gain 78 95 -74.13 gain 95 78 -70.52 gain 78 96 -81.46 gain 96 78 -84.82 gain 78 97 -82.17 gain 97 78 -78.35 gain 78 98 -89.95 gain 98 78 -86.61 gain 78 99 -91.43 gain 99 78 -87.22 gain 78 100 -97.45 gain 100 78 -93.16 gain 78 101 -90.86 gain 101 78 -90.20 gain 78 102 -98.01 gain 102 78 -97.31 gain 78 103 -99.48 gain 103 78 -99.95 gain 78 104 -98.10 gain 104 78 -101.05 gain 78 105 -87.44 gain 105 78 -84.92 gain 78 106 -79.32 gain 106 78 -74.13 gain 78 107 -76.38 gain 107 78 -71.09 gain 78 108 -78.24 gain 108 78 -72.57 gain 78 109 -86.96 gain 109 78 -84.74 gain 78 110 -81.65 gain 110 78 -85.79 gain 78 111 -84.16 gain 111 78 -78.27 gain 78 112 -87.71 gain 112 78 -85.28 gain 78 113 -91.45 gain 113 78 -88.16 gain 78 114 -96.48 gain 114 78 -90.35 gain 78 115 -92.08 gain 115 78 -86.61 gain 78 116 -100.65 gain 116 78 -97.60 gain 78 117 -102.28 gain 117 78 -96.39 gain 78 118 -96.17 gain 118 78 -91.90 gain 78 119 -95.88 gain 119 78 -96.66 gain 78 120 -88.53 gain 120 78 -86.70 gain 78 121 -86.60 gain 121 78 -85.78 gain 78 122 -77.40 gain 122 78 -76.34 gain 78 123 -84.56 gain 123 78 -83.84 gain 78 124 -76.84 gain 124 78 -74.11 gain 78 125 -87.50 gain 125 78 -88.10 gain 78 126 -82.49 gain 126 78 -79.74 gain 78 127 -88.59 gain 127 78 -85.47 gain 78 128 -92.61 gain 128 78 -92.09 gain 78 129 -87.72 gain 129 78 -84.40 gain 78 130 -103.26 gain 130 78 -101.23 gain 78 131 -96.01 gain 131 78 -93.76 gain 78 132 -93.53 gain 132 78 -87.29 gain 78 133 -105.12 gain 133 78 -104.06 gain 78 134 -93.10 gain 134 78 -88.89 gain 78 135 -92.50 gain 135 78 -90.60 gain 78 136 -81.46 gain 136 78 -80.00 gain 78 137 -84.60 gain 137 78 -86.06 gain 78 138 -84.09 gain 138 78 -79.08 gain 78 139 -87.53 gain 139 78 -85.78 gain 78 140 -83.59 gain 140 78 -82.66 gain 78 141 -87.88 gain 141 78 -78.93 gain 78 142 -91.80 gain 142 78 -89.60 gain 78 143 -89.47 gain 143 78 -90.00 gain 78 144 -94.89 gain 144 78 -93.78 gain 78 145 -91.34 gain 145 78 -93.62 gain 78 146 -95.02 gain 146 78 -93.29 gain 78 147 -101.68 gain 147 78 -97.06 gain 78 148 -101.48 gain 148 78 -95.19 gain 78 149 -99.38 gain 149 78 -96.75 gain 78 150 -89.31 gain 150 78 -87.51 gain 78 151 -81.69 gain 151 78 -78.83 gain 78 152 -97.11 gain 152 78 -94.07 gain 78 153 -92.45 gain 153 78 -88.62 gain 78 154 -86.36 gain 154 78 -84.43 gain 78 155 -84.08 gain 155 78 -80.73 gain 78 156 -92.62 gain 156 78 -88.50 gain 78 157 -93.63 gain 157 78 -91.99 gain 78 158 -94.92 gain 158 78 -92.78 gain 78 159 -88.49 gain 159 78 -88.73 gain 78 160 -92.33 gain 160 78 -89.73 gain 78 161 -92.39 gain 161 78 -92.23 gain 78 162 -106.20 gain 162 78 -105.74 gain 78 163 -101.72 gain 163 78 -103.18 gain 78 164 -99.10 gain 164 78 -99.94 gain 78 165 -98.13 gain 165 78 -96.02 gain 78 166 -94.97 gain 166 78 -92.62 gain 78 167 -88.80 gain 167 78 -87.17 gain 78 168 -89.83 gain 168 78 -87.09 gain 78 169 -87.10 gain 169 78 -85.48 gain 78 170 -88.05 gain 170 78 -85.66 gain 78 171 -100.59 gain 171 78 -99.28 gain 78 172 -96.20 gain 172 78 -93.07 gain 78 173 -97.35 gain 173 78 -98.87 gain 78 174 -93.00 gain 174 78 -90.57 gain 78 175 -89.04 gain 175 78 -87.75 gain 78 176 -98.51 gain 176 78 -96.18 gain 78 177 -101.08 gain 177 78 -101.76 gain 78 178 -89.60 gain 178 78 -83.72 gain 78 179 -100.05 gain 179 78 -93.59 gain 78 180 -91.49 gain 180 78 -94.48 gain 78 181 -92.41 gain 181 78 -89.42 gain 78 182 -85.87 gain 182 78 -83.97 gain 78 183 -94.94 gain 183 78 -93.32 gain 78 184 -86.07 gain 184 78 -87.19 gain 78 185 -93.13 gain 185 78 -98.11 gain 78 186 -103.19 gain 186 78 -103.76 gain 78 187 -93.50 gain 187 78 -91.80 gain 78 188 -94.99 gain 188 78 -95.70 gain 78 189 -96.27 gain 189 78 -91.70 gain 78 190 -96.28 gain 190 78 -95.63 gain 78 191 -94.50 gain 191 78 -92.55 gain 78 192 -103.41 gain 192 78 -100.16 gain 78 193 -104.10 gain 193 78 -99.84 gain 78 194 -99.23 gain 194 78 -95.75 gain 78 195 -95.42 gain 195 78 -90.49 gain 78 196 -99.91 gain 196 78 -99.29 gain 78 197 -101.57 gain 197 78 -96.08 gain 78 198 -89.60 gain 198 78 -88.62 gain 78 199 -93.93 gain 199 78 -93.06 gain 78 200 -100.89 gain 200 78 -101.36 gain 78 201 -96.96 gain 201 78 -97.33 gain 78 202 -98.05 gain 202 78 -97.56 gain 78 203 -99.30 gain 203 78 -97.92 gain 78 204 -106.41 gain 204 78 -101.67 gain 78 205 -100.84 gain 205 78 -99.85 gain 78 206 -100.78 gain 206 78 -100.90 gain 78 207 -98.49 gain 207 78 -98.02 gain 78 208 -94.22 gain 208 78 -96.36 gain 78 209 -109.82 gain 209 78 -111.52 gain 78 210 -99.54 gain 210 78 -101.43 gain 78 211 -96.30 gain 211 78 -93.41 gain 78 212 -100.87 gain 212 78 -101.00 gain 78 213 -97.21 gain 213 78 -96.67 gain 78 214 -101.16 gain 214 78 -106.00 gain 78 215 -90.84 gain 215 78 -91.09 gain 78 216 -92.49 gain 216 78 -96.64 gain 78 217 -99.68 gain 217 78 -104.09 gain 78 218 -100.27 gain 218 78 -97.49 gain 78 219 -97.27 gain 219 78 -94.97 gain 78 220 -96.52 gain 220 78 -90.31 gain 78 221 -92.73 gain 221 78 -92.19 gain 78 222 -98.91 gain 222 78 -94.19 gain 78 223 -101.98 gain 223 78 -100.50 gain 78 224 -101.45 gain 224 78 -100.44 gain 79 80 -69.51 gain 80 79 -67.30 gain 79 81 -78.52 gain 81 79 -77.22 gain 79 82 -78.78 gain 82 79 -78.46 gain 79 83 -85.90 gain 83 79 -82.85 gain 79 84 -91.07 gain 84 79 -85.21 gain 79 85 -87.62 gain 85 79 -87.19 gain 79 86 -90.85 gain 86 79 -92.05 gain 79 87 -90.00 gain 87 79 -88.49 gain 79 88 -88.99 gain 88 79 -87.12 gain 79 89 -97.97 gain 89 79 -98.24 gain 79 90 -84.44 gain 90 79 -84.06 gain 79 91 -78.69 gain 91 79 -79.37 gain 79 92 -77.29 gain 92 79 -78.89 gain 79 93 -72.27 gain 93 79 -71.23 gain 79 94 -71.21 gain 94 79 -68.74 gain 79 95 -71.60 gain 95 79 -68.37 gain 79 96 -80.90 gain 96 79 -84.64 gain 79 97 -83.49 gain 97 79 -80.05 gain 79 98 -81.89 gain 98 79 -78.92 gain 79 99 -86.03 gain 99 79 -82.20 gain 79 100 -91.08 gain 100 79 -87.17 gain 79 101 -93.67 gain 101 79 -93.39 gain 79 102 -93.40 gain 102 79 -93.08 gain 79 103 -96.81 gain 103 79 -97.66 gain 79 104 -99.84 gain 104 79 -103.17 gain 79 105 -80.14 gain 105 79 -77.99 gain 79 106 -78.35 gain 106 79 -73.54 gain 79 107 -75.42 gain 107 79 -70.51 gain 79 108 -76.74 gain 108 79 -71.45 gain 79 109 -72.13 gain 109 79 -70.29 gain 79 110 -84.41 gain 110 79 -88.93 gain 79 111 -77.68 gain 111 79 -72.17 gain 79 112 -76.25 gain 112 79 -74.20 gain 79 113 -89.64 gain 113 79 -86.72 gain 79 114 -94.85 gain 114 79 -89.10 gain 79 115 -89.09 gain 115 79 -84.00 gain 79 116 -88.57 gain 116 79 -85.90 gain 79 117 -92.70 gain 117 79 -87.18 gain 79 118 -96.03 gain 118 79 -92.13 gain 79 119 -91.46 gain 119 79 -92.61 gain 79 120 -83.80 gain 120 79 -82.35 gain 79 121 -92.47 gain 121 79 -92.03 gain 79 122 -85.08 gain 122 79 -84.39 gain 79 123 -79.80 gain 123 79 -79.46 gain 79 124 -73.97 gain 124 79 -71.62 gain 79 125 -82.40 gain 125 79 -83.38 gain 79 126 -87.89 gain 126 79 -85.52 gain 79 127 -84.10 gain 127 79 -81.36 gain 79 128 -89.21 gain 128 79 -89.06 gain 79 129 -94.07 gain 129 79 -91.13 gain 79 130 -93.91 gain 130 79 -92.26 gain 79 131 -91.73 gain 131 79 -89.85 gain 79 132 -96.97 gain 132 79 -91.11 gain 79 133 -101.24 gain 133 79 -100.55 gain 79 134 -95.16 gain 134 79 -91.33 gain 79 135 -90.15 gain 135 79 -88.63 gain 79 136 -88.49 gain 136 79 -87.41 gain 79 137 -86.01 gain 137 79 -87.85 gain 79 138 -79.34 gain 138 79 -74.71 gain 79 139 -80.17 gain 139 79 -78.80 gain 79 140 -90.47 gain 140 79 -89.92 gain 79 141 -83.09 gain 141 79 -74.52 gain 79 142 -88.74 gain 142 79 -86.91 gain 79 143 -92.20 gain 143 79 -93.11 gain 79 144 -83.50 gain 144 79 -82.77 gain 79 145 -97.26 gain 145 79 -99.92 gain 79 146 -90.47 gain 146 79 -89.12 gain 79 147 -93.87 gain 147 79 -89.63 gain 79 148 -93.48 gain 148 79 -87.56 gain 79 149 -93.84 gain 149 79 -91.58 gain 79 150 -94.47 gain 150 79 -93.05 gain 79 151 -92.75 gain 151 79 -90.27 gain 79 152 -79.63 gain 152 79 -76.97 gain 79 153 -89.46 gain 153 79 -86.01 gain 79 154 -80.82 gain 154 79 -79.27 gain 79 155 -86.99 gain 155 79 -84.02 gain 79 156 -85.06 gain 156 79 -81.31 gain 79 157 -88.21 gain 157 79 -86.95 gain 79 158 -96.88 gain 158 79 -95.12 gain 79 159 -92.42 gain 159 79 -93.05 gain 79 160 -95.24 gain 160 79 -93.02 gain 79 161 -91.90 gain 161 79 -92.11 gain 79 162 -93.28 gain 162 79 -93.21 gain 79 163 -106.85 gain 163 79 -108.69 gain 79 164 -99.04 gain 164 79 -100.25 gain 79 165 -97.08 gain 165 79 -95.35 gain 79 166 -89.80 gain 166 79 -87.82 gain 79 167 -91.19 gain 167 79 -89.93 gain 79 168 -91.65 gain 168 79 -89.29 gain 79 169 -94.12 gain 169 79 -92.87 gain 79 170 -91.31 gain 170 79 -89.30 gain 79 171 -92.73 gain 171 79 -91.80 gain 79 172 -87.47 gain 172 79 -84.73 gain 79 173 -92.66 gain 173 79 -94.56 gain 79 174 -94.97 gain 174 79 -92.92 gain 79 175 -88.04 gain 175 79 -87.12 gain 79 176 -89.83 gain 176 79 -87.88 gain 79 177 -96.67 gain 177 79 -97.73 gain 79 178 -93.94 gain 178 79 -88.44 gain 79 179 -96.02 gain 179 79 -89.94 gain 79 180 -89.64 gain 180 79 -93.00 gain 79 181 -92.46 gain 181 79 -89.85 gain 79 182 -90.02 gain 182 79 -88.50 gain 79 183 -95.72 gain 183 79 -94.47 gain 79 184 -86.07 gain 184 79 -87.56 gain 79 185 -91.42 gain 185 79 -96.78 gain 79 186 -83.28 gain 186 79 -84.22 gain 79 187 -89.67 gain 187 79 -88.34 gain 79 188 -89.21 gain 188 79 -90.30 gain 79 189 -97.72 gain 189 79 -93.53 gain 79 190 -94.39 gain 190 79 -94.11 gain 79 191 -101.00 gain 191 79 -99.43 gain 79 192 -99.47 gain 192 79 -96.60 gain 79 193 -99.16 gain 193 79 -95.28 gain 79 194 -100.41 gain 194 79 -97.31 gain 79 195 -91.80 gain 195 79 -87.25 gain 79 196 -100.58 gain 196 79 -100.33 gain 79 197 -90.59 gain 197 79 -85.48 gain 79 198 -91.57 gain 198 79 -90.97 gain 79 199 -99.37 gain 199 79 -98.88 gain 79 200 -88.69 gain 200 79 -89.54 gain 79 201 -92.06 gain 201 79 -92.81 gain 79 202 -93.16 gain 202 79 -93.05 gain 79 203 -97.85 gain 203 79 -96.85 gain 79 204 -105.00 gain 204 79 -100.65 gain 79 205 -90.65 gain 205 79 -90.04 gain 79 206 -97.98 gain 206 79 -98.47 gain 79 207 -97.59 gain 207 79 -97.50 gain 79 208 -98.65 gain 208 79 -101.16 gain 79 209 -91.30 gain 209 79 -93.38 gain 79 210 -93.14 gain 210 79 -95.40 gain 79 211 -93.93 gain 211 79 -91.42 gain 79 212 -98.96 gain 212 79 -99.47 gain 79 213 -96.33 gain 213 79 -96.16 gain 79 214 -94.20 gain 214 79 -99.42 gain 79 215 -99.99 gain 215 79 -100.61 gain 79 216 -92.00 gain 216 79 -96.53 gain 79 217 -101.53 gain 217 79 -106.32 gain 79 218 -102.46 gain 218 79 -100.06 gain 79 219 -92.70 gain 219 79 -90.78 gain 79 220 -102.78 gain 220 79 -96.95 gain 79 221 -97.79 gain 221 79 -97.63 gain 79 222 -94.57 gain 222 79 -90.22 gain 79 223 -99.35 gain 223 79 -98.25 gain 79 224 -100.84 gain 224 79 -100.21 gain 80 81 -62.19 gain 81 80 -63.10 gain 80 82 -68.63 gain 82 80 -70.52 gain 80 83 -79.46 gain 83 80 -78.62 gain 80 84 -83.52 gain 84 80 -79.87 gain 80 85 -93.25 gain 85 80 -95.03 gain 80 86 -91.08 gain 86 80 -94.49 gain 80 87 -86.34 gain 87 80 -87.04 gain 80 88 -95.19 gain 88 80 -95.54 gain 80 89 -84.85 gain 89 80 -87.34 gain 80 90 -86.01 gain 90 80 -87.84 gain 80 91 -82.12 gain 91 80 -85.02 gain 80 92 -82.47 gain 92 80 -86.28 gain 80 93 -67.76 gain 93 80 -68.94 gain 80 94 -73.63 gain 94 80 -73.37 gain 80 95 -65.10 gain 95 80 -64.08 gain 80 96 -69.43 gain 96 80 -75.39 gain 80 97 -71.79 gain 97 80 -70.57 gain 80 98 -85.62 gain 98 80 -84.86 gain 80 99 -84.35 gain 99 80 -82.73 gain 80 100 -89.13 gain 100 80 -87.43 gain 80 101 -88.11 gain 101 80 -90.03 gain 80 102 -91.74 gain 102 80 -93.64 gain 80 103 -92.46 gain 103 80 -95.52 gain 80 104 -86.16 gain 104 80 -91.70 gain 80 105 -83.55 gain 105 80 -83.62 gain 80 106 -87.95 gain 106 80 -85.35 gain 80 107 -75.62 gain 107 80 -72.93 gain 80 108 -72.89 gain 108 80 -69.81 gain 80 109 -81.06 gain 109 80 -81.43 gain 80 110 -70.59 gain 110 80 -77.33 gain 80 111 -80.19 gain 111 80 -76.89 gain 80 112 -82.59 gain 112 80 -82.75 gain 80 113 -76.03 gain 113 80 -75.33 gain 80 114 -78.59 gain 114 80 -75.05 gain 80 115 -84.14 gain 115 80 -81.26 gain 80 116 -97.40 gain 116 80 -96.95 gain 80 117 -87.63 gain 117 80 -84.32 gain 80 118 -89.01 gain 118 80 -87.32 gain 80 119 -100.31 gain 119 80 -103.68 gain 80 120 -87.65 gain 120 80 -88.41 gain 80 121 -82.15 gain 121 80 -83.93 gain 80 122 -82.86 gain 122 80 -84.39 gain 80 123 -78.20 gain 123 80 -80.06 gain 80 124 -83.16 gain 124 80 -83.02 gain 80 125 -78.81 gain 125 80 -82.00 gain 80 126 -78.48 gain 126 80 -78.32 gain 80 127 -77.86 gain 127 80 -77.32 gain 80 128 -81.07 gain 128 80 -83.14 gain 80 129 -80.97 gain 129 80 -80.25 gain 80 130 -79.61 gain 130 80 -80.18 gain 80 131 -85.18 gain 131 80 -85.52 gain 80 132 -87.92 gain 132 80 -84.26 gain 80 133 -94.70 gain 133 80 -96.22 gain 80 134 -91.57 gain 134 80 -89.96 gain 80 135 -84.32 gain 135 80 -85.00 gain 80 136 -84.86 gain 136 80 -85.99 gain 80 137 -84.46 gain 137 80 -88.50 gain 80 138 -82.97 gain 138 80 -80.54 gain 80 139 -84.28 gain 139 80 -85.12 gain 80 140 -77.44 gain 140 80 -79.11 gain 80 141 -82.95 gain 141 80 -76.59 gain 80 142 -85.90 gain 142 80 -86.28 gain 80 143 -80.57 gain 143 80 -83.69 gain 80 144 -85.37 gain 144 80 -86.86 gain 80 145 -77.27 gain 145 80 -82.14 gain 80 146 -94.15 gain 146 80 -95.01 gain 80 147 -87.90 gain 147 80 -85.87 gain 80 148 -93.58 gain 148 80 -89.88 gain 80 149 -93.58 gain 149 80 -93.54 gain 80 150 -99.01 gain 150 80 -99.80 gain 80 151 -92.19 gain 151 80 -91.92 gain 80 152 -90.57 gain 152 80 -90.11 gain 80 153 -86.85 gain 153 80 -85.62 gain 80 154 -85.06 gain 154 80 -85.73 gain 80 155 -81.75 gain 155 80 -80.99 gain 80 156 -94.31 gain 156 80 -92.77 gain 80 157 -88.55 gain 157 80 -89.50 gain 80 158 -83.14 gain 158 80 -83.58 gain 80 159 -89.70 gain 159 80 -92.53 gain 80 160 -97.15 gain 160 80 -97.13 gain 80 161 -89.66 gain 161 80 -92.09 gain 80 162 -92.44 gain 162 80 -94.58 gain 80 163 -91.73 gain 163 80 -95.78 gain 80 164 -87.97 gain 164 80 -91.39 gain 80 165 -88.64 gain 165 80 -89.11 gain 80 166 -88.77 gain 166 80 -89.01 gain 80 167 -87.66 gain 167 80 -88.61 gain 80 168 -92.18 gain 168 80 -92.03 gain 80 169 -93.28 gain 169 80 -94.24 gain 80 170 -86.04 gain 170 80 -86.24 gain 80 171 -90.13 gain 171 80 -91.41 gain 80 172 -91.29 gain 172 80 -90.76 gain 80 173 -84.22 gain 173 80 -88.33 gain 80 174 -95.33 gain 174 80 -95.49 gain 80 175 -88.17 gain 175 80 -89.46 gain 80 176 -95.18 gain 176 80 -95.44 gain 80 177 -98.29 gain 177 80 -101.56 gain 80 178 -97.85 gain 178 80 -94.56 gain 80 179 -101.25 gain 179 80 -97.38 gain 80 180 -97.74 gain 180 80 -103.32 gain 80 181 -91.76 gain 181 80 -91.36 gain 80 182 -88.88 gain 182 80 -89.57 gain 80 183 -85.34 gain 183 80 -86.30 gain 80 184 -87.86 gain 184 80 -91.57 gain 80 185 -85.93 gain 185 80 -93.51 gain 80 186 -88.78 gain 186 80 -91.94 gain 80 187 -81.22 gain 187 80 -82.10 gain 80 188 -94.98 gain 188 80 -98.28 gain 80 189 -97.09 gain 189 80 -95.11 gain 80 190 -85.83 gain 190 80 -87.77 gain 80 191 -94.90 gain 191 80 -95.55 gain 80 192 -97.98 gain 192 80 -97.32 gain 80 193 -98.59 gain 193 80 -96.92 gain 80 194 -98.31 gain 194 80 -97.42 gain 80 195 -98.78 gain 195 80 -96.43 gain 80 196 -91.20 gain 196 80 -93.16 gain 80 197 -97.99 gain 197 80 -95.09 gain 80 198 -83.61 gain 198 80 -85.22 gain 80 199 -99.63 gain 199 80 -101.35 gain 80 200 -87.23 gain 200 80 -90.28 gain 80 201 -91.35 gain 201 80 -94.31 gain 80 202 -85.98 gain 202 80 -88.08 gain 80 203 -99.19 gain 203 80 -100.40 gain 80 204 -90.42 gain 204 80 -88.28 gain 80 205 -95.09 gain 205 80 -96.69 gain 80 206 -91.00 gain 206 80 -93.70 gain 80 207 -93.42 gain 207 80 -95.54 gain 80 208 -94.03 gain 208 80 -98.76 gain 80 209 -99.93 gain 209 80 -104.23 gain 80 210 -100.91 gain 210 80 -105.38 gain 80 211 -89.92 gain 211 80 -89.62 gain 80 212 -92.11 gain 212 80 -94.82 gain 80 213 -95.19 gain 213 80 -97.23 gain 80 214 -93.78 gain 214 80 -101.21 gain 80 215 -92.61 gain 215 80 -95.44 gain 80 216 -91.47 gain 216 80 -98.21 gain 80 217 -87.98 gain 217 80 -94.98 gain 80 218 -91.12 gain 218 80 -90.92 gain 80 219 -89.95 gain 219 80 -90.24 gain 80 220 -95.28 gain 220 80 -91.66 gain 80 221 -93.05 gain 221 80 -95.11 gain 80 222 -93.16 gain 222 80 -91.03 gain 80 223 -99.57 gain 223 80 -100.67 gain 80 224 -97.15 gain 224 80 -98.72 gain 81 82 -67.46 gain 82 81 -68.44 gain 81 83 -74.11 gain 83 81 -72.36 gain 81 84 -80.95 gain 84 81 -76.38 gain 81 85 -90.42 gain 85 81 -91.28 gain 81 86 -91.06 gain 86 81 -93.56 gain 81 87 -92.75 gain 87 81 -92.54 gain 81 88 -90.63 gain 88 81 -90.06 gain 81 89 -89.17 gain 89 81 -90.75 gain 81 90 -90.35 gain 90 81 -91.27 gain 81 91 -87.20 gain 91 81 -89.18 gain 81 92 -90.50 gain 92 81 -93.41 gain 81 93 -84.62 gain 93 81 -84.89 gain 81 94 -86.49 gain 94 81 -85.31 gain 81 95 -75.49 gain 95 81 -73.56 gain 81 96 -67.79 gain 96 81 -72.83 gain 81 97 -67.24 gain 97 81 -65.11 gain 81 98 -76.89 gain 98 81 -75.22 gain 81 99 -72.84 gain 99 81 -70.31 gain 81 100 -75.82 gain 100 81 -73.20 gain 81 101 -86.43 gain 101 81 -87.44 gain 81 102 -89.94 gain 102 81 -90.92 gain 81 103 -96.08 gain 103 81 -98.23 gain 81 104 -92.94 gain 104 81 -97.57 gain 81 105 -88.82 gain 105 81 -87.97 gain 81 106 -86.27 gain 106 81 -82.75 gain 81 107 -80.54 gain 107 81 -76.93 gain 81 108 -78.95 gain 108 81 -74.96 gain 81 109 -81.56 gain 109 81 -81.02 gain 81 110 -71.61 gain 110 81 -77.44 gain 81 111 -74.74 gain 111 81 -70.53 gain 81 112 -82.83 gain 112 81 -82.09 gain 81 113 -77.07 gain 113 81 -75.45 gain 81 114 -77.45 gain 114 81 -72.99 gain 81 115 -80.73 gain 115 81 -76.93 gain 81 116 -79.19 gain 116 81 -77.82 gain 81 117 -92.90 gain 117 81 -88.68 gain 81 118 -95.57 gain 118 81 -92.97 gain 81 119 -94.97 gain 119 81 -97.43 gain 81 120 -88.07 gain 120 81 -87.91 gain 81 121 -82.80 gain 121 81 -83.66 gain 81 122 -86.66 gain 122 81 -87.28 gain 81 123 -78.39 gain 123 81 -79.35 gain 81 124 -75.25 gain 124 81 -74.19 gain 81 125 -78.29 gain 125 81 -80.57 gain 81 126 -75.34 gain 126 81 -74.27 gain 81 127 -81.94 gain 127 81 -80.50 gain 81 128 -80.11 gain 128 81 -81.26 gain 81 129 -89.54 gain 129 81 -87.90 gain 81 130 -84.90 gain 130 81 -84.55 gain 81 131 -87.21 gain 131 81 -86.64 gain 81 132 -83.10 gain 132 81 -78.54 gain 81 133 -99.23 gain 133 81 -99.84 gain 81 134 -90.48 gain 134 81 -87.95 gain 81 135 -89.88 gain 135 81 -89.66 gain 81 136 -85.50 gain 136 81 -85.72 gain 81 137 -84.72 gain 137 81 -87.85 gain 81 138 -91.44 gain 138 81 -88.10 gain 81 139 -82.82 gain 139 81 -82.74 gain 81 140 -78.88 gain 140 81 -79.64 gain 81 141 -91.04 gain 141 81 -83.77 gain 81 142 -82.80 gain 142 81 -82.27 gain 81 143 -87.99 gain 143 81 -90.20 gain 81 144 -86.18 gain 144 81 -86.75 gain 81 145 -89.07 gain 145 81 -93.03 gain 81 146 -83.36 gain 146 81 -83.31 gain 81 147 -81.64 gain 147 81 -78.70 gain 81 148 -90.02 gain 148 81 -85.41 gain 81 149 -97.40 gain 149 81 -96.44 gain 81 150 -91.30 gain 150 81 -91.18 gain 81 151 -93.58 gain 151 81 -92.40 gain 81 152 -90.96 gain 152 81 -89.59 gain 81 153 -90.98 gain 153 81 -88.83 gain 81 154 -90.99 gain 154 81 -90.74 gain 81 155 -78.47 gain 155 81 -76.79 gain 81 156 -90.04 gain 156 81 -87.60 gain 81 157 -85.96 gain 157 81 -86.00 gain 81 158 -87.36 gain 158 81 -86.90 gain 81 159 -92.18 gain 159 81 -94.10 gain 81 160 -87.92 gain 160 81 -87.00 gain 81 161 -91.81 gain 161 81 -93.32 gain 81 162 -84.56 gain 162 81 -85.78 gain 81 163 -93.37 gain 163 81 -96.51 gain 81 164 -106.78 gain 164 81 -109.29 gain 81 165 -88.52 gain 165 81 -88.08 gain 81 166 -87.16 gain 166 81 -86.48 gain 81 167 -101.64 gain 167 81 -101.68 gain 81 168 -89.88 gain 168 81 -88.82 gain 81 169 -88.18 gain 169 81 -88.23 gain 81 170 -86.32 gain 170 81 -85.61 gain 81 171 -89.48 gain 171 81 -89.84 gain 81 172 -92.27 gain 172 81 -90.83 gain 81 173 -95.97 gain 173 81 -99.17 gain 81 174 -85.08 gain 174 81 -84.33 gain 81 175 -91.00 gain 175 81 -91.38 gain 81 176 -99.41 gain 176 81 -98.76 gain 81 177 -93.82 gain 177 81 -96.18 gain 81 178 -93.64 gain 178 81 -89.44 gain 81 179 -94.26 gain 179 81 -89.48 gain 81 180 -101.84 gain 180 81 -106.51 gain 81 181 -91.42 gain 181 81 -90.11 gain 81 182 -98.54 gain 182 81 -98.31 gain 81 183 -83.63 gain 183 81 -83.68 gain 81 184 -92.15 gain 184 81 -94.94 gain 81 185 -87.14 gain 185 81 -93.80 gain 81 186 -89.71 gain 186 81 -91.96 gain 81 187 -81.26 gain 187 81 -81.24 gain 81 188 -87.04 gain 188 81 -89.42 gain 81 189 -98.50 gain 189 81 -95.61 gain 81 190 -98.15 gain 190 81 -99.18 gain 81 191 -85.31 gain 191 81 -85.05 gain 81 192 -95.23 gain 192 81 -93.65 gain 81 193 -94.56 gain 193 81 -91.97 gain 81 194 -94.04 gain 194 81 -92.24 gain 81 195 -90.88 gain 195 81 -87.62 gain 81 196 -93.63 gain 196 81 -94.68 gain 81 197 -87.37 gain 197 81 -83.56 gain 81 198 -92.51 gain 198 81 -93.21 gain 81 199 -91.00 gain 199 81 -91.81 gain 81 200 -91.92 gain 200 81 -94.06 gain 81 201 -97.20 gain 201 81 -99.25 gain 81 202 -93.84 gain 202 81 -95.02 gain 81 203 -96.76 gain 203 81 -97.07 gain 81 204 -93.51 gain 204 81 -90.45 gain 81 205 -93.92 gain 205 81 -94.61 gain 81 206 -95.00 gain 206 81 -96.79 gain 81 207 -92.20 gain 207 81 -93.41 gain 81 208 -108.28 gain 208 81 -112.10 gain 81 209 -97.07 gain 209 81 -100.45 gain 81 210 -96.33 gain 210 81 -99.89 gain 81 211 -100.35 gain 211 81 -99.15 gain 81 212 -93.95 gain 212 81 -95.75 gain 81 213 -95.02 gain 213 81 -96.15 gain 81 214 -99.46 gain 214 81 -105.98 gain 81 215 -87.03 gain 215 81 -88.95 gain 81 216 -93.07 gain 216 81 -98.90 gain 81 217 -93.35 gain 217 81 -99.44 gain 81 218 -90.49 gain 218 81 -89.39 gain 81 219 -93.81 gain 219 81 -93.19 gain 81 220 -90.37 gain 220 81 -85.84 gain 81 221 -99.52 gain 221 81 -100.67 gain 81 222 -105.29 gain 222 81 -102.24 gain 81 223 -99.71 gain 223 81 -99.91 gain 81 224 -95.46 gain 224 81 -96.13 gain 82 83 -66.75 gain 83 82 -64.02 gain 82 84 -78.74 gain 84 82 -73.20 gain 82 85 -86.27 gain 85 82 -86.16 gain 82 86 -84.76 gain 86 82 -86.29 gain 82 87 -89.41 gain 87 82 -88.22 gain 82 88 -87.14 gain 88 82 -85.59 gain 82 89 -91.33 gain 89 82 -91.93 gain 82 90 -98.39 gain 90 82 -98.33 gain 82 91 -90.72 gain 91 82 -91.73 gain 82 92 -83.63 gain 92 82 -85.56 gain 82 93 -83.62 gain 93 82 -82.90 gain 82 94 -80.70 gain 94 82 -78.55 gain 82 95 -74.64 gain 95 82 -71.73 gain 82 96 -74.17 gain 96 82 -78.24 gain 82 97 -70.93 gain 97 82 -67.82 gain 82 98 -70.89 gain 98 82 -68.24 gain 82 99 -74.87 gain 99 82 -71.36 gain 82 100 -85.45 gain 100 82 -81.86 gain 82 101 -83.99 gain 101 82 -84.03 gain 82 102 -91.79 gain 102 82 -91.80 gain 82 103 -87.76 gain 103 82 -88.93 gain 82 104 -92.60 gain 104 82 -96.26 gain 82 105 -97.55 gain 105 82 -95.73 gain 82 106 -86.78 gain 106 82 -82.29 gain 82 107 -84.09 gain 107 82 -79.50 gain 82 108 -87.06 gain 108 82 -82.09 gain 82 109 -79.97 gain 109 82 -78.45 gain 82 110 -83.21 gain 110 82 -88.05 gain 82 111 -74.02 gain 111 82 -68.83 gain 82 112 -79.08 gain 112 82 -77.36 gain 82 113 -85.95 gain 113 82 -83.35 gain 82 114 -77.56 gain 114 82 -72.13 gain 82 115 -91.48 gain 115 82 -86.71 gain 82 116 -84.36 gain 116 82 -82.02 gain 82 117 -87.81 gain 117 82 -82.61 gain 82 118 -91.61 gain 118 82 -88.03 gain 82 119 -91.28 gain 119 82 -92.76 gain 82 120 -91.59 gain 120 82 -90.46 gain 82 121 -94.41 gain 121 82 -94.29 gain 82 122 -91.16 gain 122 82 -90.80 gain 82 123 -85.88 gain 123 82 -85.86 gain 82 124 -80.01 gain 124 82 -77.98 gain 82 125 -80.80 gain 125 82 -82.10 gain 82 126 -79.84 gain 126 82 -77.80 gain 82 127 -80.16 gain 127 82 -77.74 gain 82 128 -86.76 gain 128 82 -86.93 gain 82 129 -84.12 gain 129 82 -81.50 gain 82 130 -86.05 gain 130 82 -84.73 gain 82 131 -79.50 gain 131 82 -77.95 gain 82 132 -89.76 gain 132 82 -84.21 gain 82 133 -92.81 gain 133 82 -92.44 gain 82 134 -97.60 gain 134 82 -94.10 gain 82 135 -97.27 gain 135 82 -96.07 gain 82 136 -85.29 gain 136 82 -84.53 gain 82 137 -98.95 gain 137 82 -101.11 gain 82 138 -89.12 gain 138 82 -84.81 gain 82 139 -83.84 gain 139 82 -82.79 gain 82 140 -88.41 gain 140 82 -88.18 gain 82 141 -85.08 gain 141 82 -76.83 gain 82 142 -89.93 gain 142 82 -88.43 gain 82 143 -84.61 gain 143 82 -85.84 gain 82 144 -87.09 gain 144 82 -86.68 gain 82 145 -95.81 gain 145 82 -98.79 gain 82 146 -92.85 gain 146 82 -91.82 gain 82 147 -90.35 gain 147 82 -86.43 gain 82 148 -92.05 gain 148 82 -86.46 gain 82 149 -87.24 gain 149 82 -85.31 gain 82 150 -93.87 gain 150 82 -92.77 gain 82 151 -91.54 gain 151 82 -89.38 gain 82 152 -90.60 gain 152 82 -88.26 gain 82 153 -93.23 gain 153 82 -90.10 gain 82 154 -90.70 gain 154 82 -89.47 gain 82 155 -84.50 gain 155 82 -81.85 gain 82 156 -92.10 gain 156 82 -88.68 gain 82 157 -83.07 gain 157 82 -82.13 gain 82 158 -91.20 gain 158 82 -89.76 gain 82 159 -89.65 gain 159 82 -90.59 gain 82 160 -85.58 gain 160 82 -83.68 gain 82 161 -95.22 gain 161 82 -95.76 gain 82 162 -91.73 gain 162 82 -91.98 gain 82 163 -89.52 gain 163 82 -91.68 gain 82 164 -89.70 gain 164 82 -91.23 gain 82 165 -95.10 gain 165 82 -93.69 gain 82 166 -95.35 gain 166 82 -93.69 gain 82 167 -92.43 gain 167 82 -91.49 gain 82 168 -88.77 gain 168 82 -86.73 gain 82 169 -91.28 gain 169 82 -90.35 gain 82 170 -88.57 gain 170 82 -86.88 gain 82 171 -84.38 gain 171 82 -83.77 gain 82 172 -97.40 gain 172 82 -94.98 gain 82 173 -86.19 gain 173 82 -88.42 gain 82 174 -87.29 gain 174 82 -85.56 gain 82 175 -89.08 gain 175 82 -88.48 gain 82 176 -94.30 gain 176 82 -92.68 gain 82 177 -92.13 gain 177 82 -93.51 gain 82 178 -90.88 gain 178 82 -85.70 gain 82 179 -93.47 gain 179 82 -87.72 gain 82 180 -98.68 gain 180 82 -102.37 gain 82 181 -98.77 gain 181 82 -96.48 gain 82 182 -92.52 gain 182 82 -91.31 gain 82 183 -91.82 gain 183 82 -90.89 gain 82 184 -87.47 gain 184 82 -89.29 gain 82 185 -86.44 gain 185 82 -92.12 gain 82 186 -90.55 gain 186 82 -91.82 gain 82 187 -93.57 gain 187 82 -92.57 gain 82 188 -99.55 gain 188 82 -100.95 gain 82 189 -86.91 gain 189 82 -83.04 gain 82 190 -97.92 gain 190 82 -97.96 gain 82 191 -96.63 gain 191 82 -95.39 gain 82 192 -94.86 gain 192 82 -92.31 gain 82 193 -93.01 gain 193 82 -89.44 gain 82 194 -96.57 gain 194 82 -93.79 gain 82 195 -94.68 gain 195 82 -90.45 gain 82 196 -95.52 gain 196 82 -95.60 gain 82 197 -96.06 gain 197 82 -91.27 gain 82 198 -99.03 gain 198 82 -98.75 gain 82 199 -93.99 gain 199 82 -93.82 gain 82 200 -94.64 gain 200 82 -95.80 gain 82 201 -97.26 gain 201 82 -98.33 gain 82 202 -94.49 gain 202 82 -94.70 gain 82 203 -95.44 gain 203 82 -94.76 gain 82 204 -98.36 gain 204 82 -94.33 gain 82 205 -94.21 gain 205 82 -93.92 gain 82 206 -92.28 gain 206 82 -93.09 gain 82 207 -95.92 gain 207 82 -96.15 gain 82 208 -94.34 gain 208 82 -97.18 gain 82 209 -97.77 gain 209 82 -100.18 gain 82 210 -103.02 gain 210 82 -105.61 gain 82 211 -97.61 gain 211 82 -95.42 gain 82 212 -102.16 gain 212 82 -102.98 gain 82 213 -95.84 gain 213 82 -95.99 gain 82 214 -88.79 gain 214 82 -94.33 gain 82 215 -92.13 gain 215 82 -93.07 gain 82 216 -97.44 gain 216 82 -102.29 gain 82 217 -87.70 gain 217 82 -92.82 gain 82 218 -95.44 gain 218 82 -93.36 gain 82 219 -99.12 gain 219 82 -97.53 gain 82 220 -93.23 gain 220 82 -87.72 gain 82 221 -93.02 gain 221 82 -93.19 gain 82 222 -105.39 gain 222 82 -101.37 gain 82 223 -93.20 gain 223 82 -92.42 gain 82 224 -101.88 gain 224 82 -101.57 gain 83 84 -63.09 gain 84 83 -60.28 gain 83 85 -76.18 gain 85 83 -78.79 gain 83 86 -81.60 gain 86 83 -85.85 gain 83 87 -83.86 gain 87 83 -85.40 gain 83 88 -77.43 gain 88 83 -78.62 gain 83 89 -84.18 gain 89 83 -87.51 gain 83 90 -93.56 gain 90 83 -96.22 gain 83 91 -87.27 gain 91 83 -91.01 gain 83 92 -81.24 gain 92 83 -85.89 gain 83 93 -78.07 gain 93 83 -80.08 gain 83 94 -85.86 gain 94 83 -86.44 gain 83 95 -78.57 gain 95 83 -78.39 gain 83 96 -71.53 gain 96 83 -78.32 gain 83 97 -70.51 gain 97 83 -70.12 gain 83 98 -61.62 gain 98 83 -61.71 gain 83 99 -72.96 gain 99 83 -72.18 gain 83 100 -73.51 gain 100 83 -72.64 gain 83 101 -78.19 gain 101 83 -80.96 gain 83 102 -85.14 gain 102 83 -87.87 gain 83 103 -85.67 gain 103 83 -89.57 gain 83 104 -83.87 gain 104 83 -90.25 gain 83 105 -91.55 gain 105 83 -92.46 gain 83 106 -89.77 gain 106 83 -88.01 gain 83 107 -83.06 gain 107 83 -81.20 gain 83 108 -78.13 gain 108 83 -75.89 gain 83 109 -89.22 gain 109 83 -90.43 gain 83 110 -78.64 gain 110 83 -86.21 gain 83 111 -84.90 gain 111 83 -82.44 gain 83 112 -70.97 gain 112 83 -71.98 gain 83 113 -68.69 gain 113 83 -68.83 gain 83 114 -77.81 gain 114 83 -75.10 gain 83 115 -80.04 gain 115 83 -78.00 gain 83 116 -77.06 gain 116 83 -77.45 gain 83 117 -81.49 gain 117 83 -79.02 gain 83 118 -87.88 gain 118 83 -87.03 gain 83 119 -87.74 gain 119 83 -91.95 gain 83 120 -80.62 gain 120 83 -82.21 gain 83 121 -90.04 gain 121 83 -92.66 gain 83 122 -89.18 gain 122 83 -91.55 gain 83 123 -85.12 gain 123 83 -87.82 gain 83 124 -85.76 gain 124 83 -86.45 gain 83 125 -81.37 gain 125 83 -85.41 gain 83 126 -75.79 gain 126 83 -76.47 gain 83 127 -81.25 gain 127 83 -81.56 gain 83 128 -77.99 gain 128 83 -80.89 gain 83 129 -80.89 gain 129 83 -81.00 gain 83 130 -81.73 gain 130 83 -83.13 gain 83 131 -81.76 gain 131 83 -82.94 gain 83 132 -81.89 gain 132 83 -79.07 gain 83 133 -89.84 gain 133 83 -92.20 gain 83 134 -90.20 gain 134 83 -89.42 gain 83 135 -92.05 gain 135 83 -93.58 gain 83 136 -94.88 gain 136 83 -96.85 gain 83 137 -95.08 gain 137 83 -99.97 gain 83 138 -87.01 gain 138 83 -85.42 gain 83 139 -88.52 gain 139 83 -90.20 gain 83 140 -85.10 gain 140 83 -87.61 gain 83 141 -79.16 gain 141 83 -73.63 gain 83 142 -82.26 gain 142 83 -83.48 gain 83 143 -81.69 gain 143 83 -85.65 gain 83 144 -79.52 gain 144 83 -81.84 gain 83 145 -83.75 gain 145 83 -89.46 gain 83 146 -78.45 gain 146 83 -80.15 gain 83 147 -86.84 gain 147 83 -85.65 gain 83 148 -86.53 gain 148 83 -83.67 gain 83 149 -93.11 gain 149 83 -93.90 gain 83 150 -88.83 gain 150 83 -90.45 gain 83 151 -92.72 gain 151 83 -93.29 gain 83 152 -85.12 gain 152 83 -85.51 gain 83 153 -88.93 gain 153 83 -88.53 gain 83 154 -85.67 gain 154 83 -87.17 gain 83 155 -87.82 gain 155 83 -87.90 gain 83 156 -82.05 gain 156 83 -81.35 gain 83 157 -82.37 gain 157 83 -84.16 gain 83 158 -86.07 gain 158 83 -87.36 gain 83 159 -78.97 gain 159 83 -82.64 gain 83 160 -85.44 gain 160 83 -86.27 gain 83 161 -91.53 gain 161 83 -94.80 gain 83 162 -91.90 gain 162 83 -94.88 gain 83 163 -91.63 gain 163 83 -96.52 gain 83 164 -94.85 gain 164 83 -99.11 gain 83 165 -97.26 gain 165 83 -98.58 gain 83 166 -93.29 gain 166 83 -94.36 gain 83 167 -90.99 gain 167 83 -92.78 gain 83 168 -91.53 gain 168 83 -92.22 gain 83 169 -95.72 gain 169 83 -97.53 gain 83 170 -85.16 gain 170 83 -86.19 gain 83 171 -82.38 gain 171 83 -84.50 gain 83 172 -87.69 gain 172 83 -87.99 gain 83 173 -83.96 gain 173 83 -88.92 gain 83 174 -86.99 gain 174 83 -87.99 gain 83 175 -84.72 gain 175 83 -86.86 gain 83 176 -91.95 gain 176 83 -93.06 gain 83 177 -85.51 gain 177 83 -89.62 gain 83 178 -91.60 gain 178 83 -89.15 gain 83 179 -88.60 gain 179 83 -85.57 gain 83 180 -98.12 gain 180 83 -104.53 gain 83 181 -90.08 gain 181 83 -90.52 gain 83 182 -89.90 gain 182 83 -91.43 gain 83 183 -88.73 gain 183 83 -90.53 gain 83 184 -89.42 gain 184 83 -93.97 gain 83 185 -87.75 gain 185 83 -96.16 gain 83 186 -91.91 gain 186 83 -95.90 gain 83 187 -90.67 gain 187 83 -92.39 gain 83 188 -84.42 gain 188 83 -88.55 gain 83 189 -83.25 gain 189 83 -82.10 gain 83 190 -97.35 gain 190 83 -100.12 gain 83 191 -90.15 gain 191 83 -91.64 gain 83 192 -79.31 gain 192 83 -79.48 gain 83 193 -92.91 gain 193 83 -92.07 gain 83 194 -91.46 gain 194 83 -91.40 gain 83 195 -92.34 gain 195 83 -90.84 gain 83 196 -91.53 gain 196 83 -94.33 gain 83 197 -91.34 gain 197 83 -89.28 gain 83 198 -89.42 gain 198 83 -91.87 gain 83 199 -89.25 gain 199 83 -91.81 gain 83 200 -91.80 gain 200 83 -95.69 gain 83 201 -94.32 gain 201 83 -98.13 gain 83 202 -93.90 gain 202 83 -96.83 gain 83 203 -93.40 gain 203 83 -95.45 gain 83 204 -91.67 gain 204 83 -90.36 gain 83 205 -96.35 gain 205 83 -98.79 gain 83 206 -89.69 gain 206 83 -93.24 gain 83 207 -85.43 gain 207 83 -88.39 gain 83 208 -94.51 gain 208 83 -100.08 gain 83 209 -94.58 gain 209 83 -99.72 gain 83 210 -97.12 gain 210 83 -102.43 gain 83 211 -95.32 gain 211 83 -95.86 gain 83 212 -97.68 gain 212 83 -101.23 gain 83 213 -89.97 gain 213 83 -92.85 gain 83 214 -99.35 gain 214 83 -107.62 gain 83 215 -94.62 gain 215 83 -98.29 gain 83 216 -90.84 gain 216 83 -98.42 gain 83 217 -89.65 gain 217 83 -97.49 gain 83 218 -92.28 gain 218 83 -92.92 gain 83 219 -86.25 gain 219 83 -87.38 gain 83 220 -100.21 gain 220 83 -97.43 gain 83 221 -95.09 gain 221 83 -97.98 gain 83 222 -93.84 gain 222 83 -92.54 gain 83 223 -93.70 gain 223 83 -95.64 gain 83 224 -89.70 gain 224 83 -92.11 gain 84 85 -57.07 gain 85 84 -62.50 gain 84 86 -68.19 gain 86 84 -75.26 gain 84 87 -76.91 gain 87 84 -81.27 gain 84 88 -82.72 gain 88 84 -86.71 gain 84 89 -80.73 gain 89 84 -86.87 gain 84 90 -90.83 gain 90 84 -96.31 gain 84 91 -92.62 gain 91 84 -99.16 gain 84 92 -85.42 gain 92 84 -92.89 gain 84 93 -83.38 gain 93 84 -88.21 gain 84 94 -79.18 gain 94 84 -82.57 gain 84 95 -81.25 gain 95 84 -83.88 gain 84 96 -75.96 gain 96 84 -85.57 gain 84 97 -68.03 gain 97 84 -70.45 gain 84 98 -64.80 gain 98 84 -67.70 gain 84 99 -51.84 gain 99 84 -53.87 gain 84 100 -64.11 gain 100 84 -66.06 gain 84 101 -71.96 gain 101 84 -77.54 gain 84 102 -74.51 gain 102 84 -80.06 gain 84 103 -83.15 gain 103 84 -89.87 gain 84 104 -75.78 gain 104 84 -84.98 gain 84 105 -92.32 gain 105 84 -96.04 gain 84 106 -88.91 gain 106 84 -89.96 gain 84 107 -79.73 gain 107 84 -80.68 gain 84 108 -81.39 gain 108 84 -81.97 gain 84 109 -78.00 gain 109 84 -82.02 gain 84 110 -76.66 gain 110 84 -87.05 gain 84 111 -82.40 gain 111 84 -82.75 gain 84 112 -76.87 gain 112 84 -80.69 gain 84 113 -69.86 gain 113 84 -72.80 gain 84 114 -73.25 gain 114 84 -73.37 gain 84 115 -75.81 gain 115 84 -76.58 gain 84 116 -79.94 gain 116 84 -83.13 gain 84 117 -77.87 gain 117 84 -78.21 gain 84 118 -79.04 gain 118 84 -81.00 gain 84 119 -79.42 gain 119 84 -86.44 gain 84 120 -90.21 gain 120 84 -94.61 gain 84 121 -92.28 gain 121 84 -97.71 gain 84 122 -90.66 gain 122 84 -95.84 gain 84 123 -92.63 gain 123 84 -98.15 gain 84 124 -80.87 gain 124 84 -84.38 gain 84 125 -75.88 gain 125 84 -82.72 gain 84 126 -82.43 gain 126 84 -85.92 gain 84 127 -80.87 gain 127 84 -83.99 gain 84 128 -74.08 gain 128 84 -79.80 gain 84 129 -76.69 gain 129 84 -79.61 gain 84 130 -70.55 gain 130 84 -74.77 gain 84 131 -77.25 gain 131 84 -81.25 gain 84 132 -81.28 gain 132 84 -81.28 gain 84 133 -72.53 gain 133 84 -77.70 gain 84 134 -85.72 gain 134 84 -87.76 gain 84 135 -93.99 gain 135 84 -98.33 gain 84 136 -90.05 gain 136 84 -94.84 gain 84 137 -82.80 gain 137 84 -90.49 gain 84 138 -87.44 gain 138 84 -88.67 gain 84 139 -88.11 gain 139 84 -92.61 gain 84 140 -85.63 gain 140 84 -90.94 gain 84 141 -77.15 gain 141 84 -74.44 gain 84 142 -75.68 gain 142 84 -79.71 gain 84 143 -82.31 gain 143 84 -89.08 gain 84 144 -83.31 gain 144 84 -88.44 gain 84 145 -77.60 gain 145 84 -86.12 gain 84 146 -76.14 gain 146 84 -80.66 gain 84 147 -80.84 gain 147 84 -82.46 gain 84 148 -87.50 gain 148 84 -87.45 gain 84 149 -84.98 gain 149 84 -88.59 gain 84 150 -90.56 gain 150 84 -95.00 gain 84 151 -87.95 gain 151 84 -91.34 gain 84 152 -88.44 gain 152 84 -91.64 gain 84 153 -88.01 gain 153 84 -90.43 gain 84 154 -84.95 gain 154 84 -89.27 gain 84 155 -83.58 gain 155 84 -86.47 gain 84 156 -82.36 gain 156 84 -84.48 gain 84 157 -86.79 gain 157 84 -91.39 gain 84 158 -90.13 gain 158 84 -94.24 gain 84 159 -80.04 gain 159 84 -86.53 gain 84 160 -77.38 gain 160 84 -81.02 gain 84 161 -80.49 gain 161 84 -86.57 gain 84 162 -84.25 gain 162 84 -90.04 gain 84 163 -79.94 gain 163 84 -87.65 gain 84 164 -90.82 gain 164 84 -97.89 gain 84 165 -89.99 gain 165 84 -94.12 gain 84 166 -98.47 gain 166 84 -102.35 gain 84 167 -82.99 gain 167 84 -87.60 gain 84 168 -87.70 gain 168 84 -91.20 gain 84 169 -89.97 gain 169 84 -94.58 gain 84 170 -89.37 gain 170 84 -93.22 gain 84 171 -84.98 gain 171 84 -89.91 gain 84 172 -84.57 gain 172 84 -87.69 gain 84 173 -88.18 gain 173 84 -95.94 gain 84 174 -79.61 gain 174 84 -83.42 gain 84 175 -89.60 gain 175 84 -94.55 gain 84 176 -83.62 gain 176 84 -87.53 gain 84 177 -85.54 gain 177 84 -92.46 gain 84 178 -84.59 gain 178 84 -84.95 gain 84 179 -92.23 gain 179 84 -92.01 gain 84 180 -94.35 gain 180 84 -103.58 gain 84 181 -91.11 gain 181 84 -94.36 gain 84 182 -93.88 gain 182 84 -98.22 gain 84 183 -95.31 gain 183 84 -99.92 gain 84 184 -89.45 gain 184 84 -96.81 gain 84 185 -86.85 gain 185 84 -98.08 gain 84 186 -93.35 gain 186 84 -100.16 gain 84 187 -83.36 gain 187 84 -87.89 gain 84 188 -84.55 gain 188 84 -91.50 gain 84 189 -82.98 gain 189 84 -84.66 gain 84 190 -91.40 gain 190 84 -96.99 gain 84 191 -85.29 gain 191 84 -89.58 gain 84 192 -85.31 gain 192 84 -88.30 gain 84 193 -93.27 gain 193 84 -95.25 gain 84 194 -90.28 gain 194 84 -93.04 gain 84 195 -90.61 gain 195 84 -91.91 gain 84 196 -91.99 gain 196 84 -97.61 gain 84 197 -95.75 gain 197 84 -96.51 gain 84 198 -86.11 gain 198 84 -91.37 gain 84 199 -86.70 gain 199 84 -92.08 gain 84 200 -89.09 gain 200 84 -95.80 gain 84 201 -86.67 gain 201 84 -93.29 gain 84 202 -88.23 gain 202 84 -93.98 gain 84 203 -79.67 gain 203 84 -84.54 gain 84 204 -91.52 gain 204 84 -93.03 gain 84 205 -89.21 gain 205 84 -94.46 gain 84 206 -88.79 gain 206 84 -95.15 gain 84 207 -87.91 gain 207 84 -93.69 gain 84 208 -84.67 gain 208 84 -93.05 gain 84 209 -88.39 gain 209 84 -96.34 gain 84 210 -91.79 gain 210 84 -99.91 gain 84 211 -95.03 gain 211 84 -98.39 gain 84 212 -89.76 gain 212 84 -96.13 gain 84 213 -84.88 gain 213 84 -90.57 gain 84 214 -90.40 gain 214 84 -101.49 gain 84 215 -96.78 gain 215 84 -103.26 gain 84 216 -90.26 gain 216 84 -100.65 gain 84 217 -91.19 gain 217 84 -101.84 gain 84 218 -94.87 gain 218 84 -98.33 gain 84 219 -86.06 gain 219 84 -90.01 gain 84 220 -91.30 gain 220 84 -91.33 gain 84 221 -86.76 gain 221 84 -92.47 gain 84 222 -94.32 gain 222 84 -95.84 gain 84 223 -90.63 gain 223 84 -95.39 gain 84 224 -86.17 gain 224 84 -91.40 gain 85 86 -68.72 gain 86 85 -70.36 gain 85 87 -79.55 gain 87 85 -78.48 gain 85 88 -81.45 gain 88 85 -80.01 gain 85 89 -88.70 gain 89 85 -89.41 gain 85 90 -99.96 gain 90 85 -100.02 gain 85 91 -97.71 gain 91 85 -98.83 gain 85 92 -93.14 gain 92 85 -95.18 gain 85 93 -83.02 gain 93 85 -82.42 gain 85 94 -91.77 gain 94 85 -89.73 gain 85 95 -83.85 gain 95 85 -81.05 gain 85 96 -87.96 gain 96 85 -92.14 gain 85 97 -79.55 gain 97 85 -76.55 gain 85 98 -73.36 gain 98 85 -70.83 gain 85 99 -69.26 gain 99 85 -65.87 gain 85 100 -67.50 gain 100 85 -64.02 gain 85 101 -72.34 gain 101 85 -72.50 gain 85 102 -75.26 gain 102 85 -75.38 gain 85 103 -82.70 gain 103 85 -83.98 gain 85 104 -88.58 gain 104 85 -92.35 gain 85 105 -94.51 gain 105 85 -92.80 gain 85 106 -101.63 gain 106 85 -97.25 gain 85 107 -94.88 gain 107 85 -90.40 gain 85 108 -93.81 gain 108 85 -88.96 gain 85 109 -91.57 gain 109 85 -90.16 gain 85 110 -89.76 gain 110 85 -94.72 gain 85 111 -84.83 gain 111 85 -79.75 gain 85 112 -87.41 gain 112 85 -85.80 gain 85 113 -81.94 gain 113 85 -79.46 gain 85 114 -79.84 gain 114 85 -74.52 gain 85 115 -79.23 gain 115 85 -74.57 gain 85 116 -79.82 gain 116 85 -77.59 gain 85 117 -86.51 gain 117 85 -81.43 gain 85 118 -78.96 gain 118 85 -75.49 gain 85 119 -82.80 gain 119 85 -84.40 gain 85 120 -88.86 gain 120 85 -87.84 gain 85 121 -101.96 gain 121 85 -101.97 gain 85 122 -99.09 gain 122 85 -98.84 gain 85 123 -85.35 gain 123 85 -85.44 gain 85 124 -89.95 gain 124 85 -88.03 gain 85 125 -93.03 gain 125 85 -94.45 gain 85 126 -91.49 gain 126 85 -89.56 gain 85 127 -89.16 gain 127 85 -86.85 gain 85 128 -76.13 gain 128 85 -76.42 gain 85 129 -76.08 gain 129 85 -73.58 gain 85 130 -77.32 gain 130 85 -76.11 gain 85 131 -82.03 gain 131 85 -80.59 gain 85 132 -87.58 gain 132 85 -82.15 gain 85 133 -80.02 gain 133 85 -79.77 gain 85 134 -85.43 gain 134 85 -82.04 gain 85 135 -92.63 gain 135 85 -91.55 gain 85 136 -86.85 gain 136 85 -86.20 gain 85 137 -98.79 gain 137 85 -101.06 gain 85 138 -92.70 gain 138 85 -88.50 gain 85 139 -90.32 gain 139 85 -89.38 gain 85 140 -94.50 gain 140 85 -94.40 gain 85 141 -86.66 gain 141 85 -78.52 gain 85 142 -87.85 gain 142 85 -86.46 gain 85 143 -92.96 gain 143 85 -94.30 gain 85 144 -86.84 gain 144 85 -86.55 gain 85 145 -74.77 gain 145 85 -77.86 gain 85 146 -82.57 gain 146 85 -81.65 gain 85 147 -83.76 gain 147 85 -79.95 gain 85 148 -84.31 gain 148 85 -78.83 gain 85 149 -89.46 gain 149 85 -87.63 gain 85 150 -96.42 gain 150 85 -95.44 gain 85 151 -98.32 gain 151 85 -96.28 gain 85 152 -95.47 gain 152 85 -93.24 gain 85 153 -96.52 gain 153 85 -93.51 gain 85 154 -98.01 gain 154 85 -96.90 gain 85 155 -92.95 gain 155 85 -90.42 gain 85 156 -92.44 gain 156 85 -89.13 gain 85 157 -87.20 gain 157 85 -86.38 gain 85 158 -88.70 gain 158 85 -87.37 gain 85 159 -85.73 gain 159 85 -86.78 gain 85 160 -86.51 gain 160 85 -84.73 gain 85 161 -90.91 gain 161 85 -91.56 gain 85 162 -83.13 gain 162 85 -83.49 gain 85 163 -88.69 gain 163 85 -90.97 gain 85 164 -90.40 gain 164 85 -92.04 gain 85 165 -107.08 gain 165 85 -105.78 gain 85 166 -100.30 gain 166 85 -98.75 gain 85 167 -98.12 gain 167 85 -97.30 gain 85 168 -93.06 gain 168 85 -91.13 gain 85 169 -89.98 gain 169 85 -89.17 gain 85 170 -93.84 gain 170 85 -92.26 gain 85 171 -93.59 gain 171 85 -93.10 gain 85 172 -84.27 gain 172 85 -81.96 gain 85 173 -95.21 gain 173 85 -97.54 gain 85 174 -88.13 gain 174 85 -86.52 gain 85 175 -91.14 gain 175 85 -90.66 gain 85 176 -97.71 gain 176 85 -96.20 gain 85 177 -93.64 gain 177 85 -95.14 gain 85 178 -83.16 gain 178 85 -78.09 gain 85 179 -99.67 gain 179 85 -94.02 gain 85 180 -94.72 gain 180 85 -98.52 gain 85 181 -99.98 gain 181 85 -97.81 gain 85 182 -95.91 gain 182 85 -94.82 gain 85 183 -99.83 gain 183 85 -99.01 gain 85 184 -93.70 gain 184 85 -95.63 gain 85 185 -98.38 gain 185 85 -104.18 gain 85 186 -92.08 gain 186 85 -93.46 gain 85 187 -96.53 gain 187 85 -95.64 gain 85 188 -86.92 gain 188 85 -88.44 gain 85 189 -89.47 gain 189 85 -85.71 gain 85 190 -90.87 gain 190 85 -91.03 gain 85 191 -93.40 gain 191 85 -92.27 gain 85 192 -92.33 gain 192 85 -89.90 gain 85 193 -92.83 gain 193 85 -89.38 gain 85 194 -89.56 gain 194 85 -86.90 gain 85 195 -97.44 gain 195 85 -93.32 gain 85 196 -100.62 gain 196 85 -100.81 gain 85 197 -100.32 gain 197 85 -95.64 gain 85 198 -93.13 gain 198 85 -92.96 gain 85 199 -91.05 gain 199 85 -90.99 gain 85 200 -98.31 gain 200 85 -99.59 gain 85 201 -99.26 gain 201 85 -100.45 gain 85 202 -94.47 gain 202 85 -94.79 gain 85 203 -94.06 gain 203 85 -93.50 gain 85 204 -96.08 gain 204 85 -92.16 gain 85 205 -100.77 gain 205 85 -100.60 gain 85 206 -95.57 gain 206 85 -96.50 gain 85 207 -90.42 gain 207 85 -90.77 gain 85 208 -98.61 gain 208 85 -101.56 gain 85 209 -97.25 gain 209 85 -99.77 gain 85 210 -93.26 gain 210 85 -95.95 gain 85 211 -98.10 gain 211 85 -96.03 gain 85 212 -89.10 gain 212 85 -90.04 gain 85 213 -97.09 gain 213 85 -97.35 gain 85 214 -102.39 gain 214 85 -108.05 gain 85 215 -92.13 gain 215 85 -93.18 gain 85 216 -101.51 gain 216 85 -106.47 gain 85 217 -93.65 gain 217 85 -98.88 gain 85 218 -91.14 gain 218 85 -89.17 gain 85 219 -98.14 gain 219 85 -96.65 gain 85 220 -98.29 gain 220 85 -92.90 gain 85 221 -97.73 gain 221 85 -98.02 gain 85 222 -97.11 gain 222 85 -93.20 gain 85 223 -100.71 gain 223 85 -100.04 gain 85 224 -105.75 gain 224 85 -105.54 gain 86 87 -71.44 gain 87 86 -68.72 gain 86 88 -74.91 gain 88 86 -71.84 gain 86 89 -79.05 gain 89 86 -78.13 gain 86 90 -99.69 gain 90 86 -98.11 gain 86 91 -102.86 gain 91 86 -102.34 gain 86 92 -93.79 gain 92 86 -94.19 gain 86 93 -100.92 gain 93 86 -98.68 gain 86 94 -98.17 gain 94 86 -94.50 gain 86 95 -92.81 gain 95 86 -88.38 gain 86 96 -87.83 gain 96 86 -90.36 gain 86 97 -88.19 gain 97 86 -83.55 gain 86 98 -81.75 gain 98 86 -77.58 gain 86 99 -79.05 gain 99 86 -74.01 gain 86 100 -69.13 gain 100 86 -64.01 gain 86 101 -72.18 gain 101 86 -70.69 gain 86 102 -72.96 gain 102 86 -71.44 gain 86 103 -82.82 gain 103 86 -82.47 gain 86 104 -84.05 gain 104 86 -86.19 gain 86 105 -97.48 gain 105 86 -94.13 gain 86 106 -98.32 gain 106 86 -92.30 gain 86 107 -98.34 gain 107 86 -92.23 gain 86 108 -107.82 gain 108 86 -101.32 gain 86 109 -90.26 gain 109 86 -87.22 gain 86 110 -103.32 gain 110 86 -106.64 gain 86 111 -95.36 gain 111 86 -88.65 gain 86 112 -90.52 gain 112 86 -87.27 gain 86 113 -86.35 gain 113 86 -82.22 gain 86 114 -73.65 gain 114 86 -66.70 gain 86 115 -79.01 gain 115 86 -72.71 gain 86 116 -74.70 gain 116 86 -70.83 gain 86 117 -72.32 gain 117 86 -65.60 gain 86 118 -81.82 gain 118 86 -76.71 gain 86 119 -89.58 gain 119 86 -89.54 gain 86 120 -104.30 gain 120 86 -101.64 gain 86 121 -101.21 gain 121 86 -99.58 gain 86 122 -91.76 gain 122 86 -89.87 gain 86 123 -100.33 gain 123 86 -98.78 gain 86 124 -99.86 gain 124 86 -96.30 gain 86 125 -91.50 gain 125 86 -91.28 gain 86 126 -92.81 gain 126 86 -89.24 gain 86 127 -92.45 gain 127 86 -88.50 gain 86 128 -88.55 gain 128 86 -87.20 gain 86 129 -72.66 gain 129 86 -68.52 gain 86 130 -85.37 gain 130 86 -82.52 gain 86 131 -82.25 gain 131 86 -79.18 gain 86 132 -82.88 gain 132 86 -75.82 gain 86 133 -90.33 gain 133 86 -88.44 gain 86 134 -86.46 gain 134 86 -81.43 gain 86 135 -101.08 gain 135 86 -98.36 gain 86 136 -103.52 gain 136 86 -101.24 gain 86 137 -96.94 gain 137 86 -97.57 gain 86 138 -89.13 gain 138 86 -83.29 gain 86 139 -92.36 gain 139 86 -89.78 gain 86 140 -83.13 gain 140 86 -81.39 gain 86 141 -88.80 gain 141 86 -79.02 gain 86 142 -93.29 gain 142 86 -90.26 gain 86 143 -87.58 gain 143 86 -87.28 gain 86 144 -86.80 gain 144 86 -84.87 gain 86 145 -78.57 gain 145 86 -80.03 gain 86 146 -90.78 gain 146 86 -88.23 gain 86 147 -80.62 gain 147 86 -75.17 gain 86 148 -76.76 gain 148 86 -69.64 gain 86 149 -90.67 gain 149 86 -87.21 gain 86 150 -98.44 gain 150 86 -95.81 gain 86 151 -101.74 gain 151 86 -98.06 gain 86 152 -99.55 gain 152 86 -95.69 gain 86 153 -91.76 gain 153 86 -87.11 gain 86 154 -97.85 gain 154 86 -95.10 gain 86 155 -90.85 gain 155 86 -86.68 gain 86 156 -96.09 gain 156 86 -91.14 gain 86 157 -90.78 gain 157 86 -88.32 gain 86 158 -95.56 gain 158 86 -92.60 gain 86 159 -81.14 gain 159 86 -80.56 gain 86 160 -82.07 gain 160 86 -78.65 gain 86 161 -87.24 gain 161 86 -86.25 gain 86 162 -92.04 gain 162 86 -90.77 gain 86 163 -85.62 gain 163 86 -86.25 gain 86 164 -88.13 gain 164 86 -88.13 gain 86 165 -101.98 gain 165 86 -99.04 gain 86 166 -104.63 gain 166 86 -101.45 gain 86 167 -94.64 gain 167 86 -92.18 gain 86 168 -96.96 gain 168 86 -93.39 gain 86 169 -99.68 gain 169 86 -97.22 gain 86 170 -93.41 gain 170 86 -90.19 gain 86 171 -96.73 gain 171 86 -94.59 gain 86 172 -95.90 gain 172 86 -91.95 gain 86 173 -90.45 gain 173 86 -91.15 gain 86 174 -104.05 gain 174 86 -100.80 gain 86 175 -89.87 gain 175 86 -87.75 gain 86 176 -92.39 gain 176 86 -89.24 gain 86 177 -87.36 gain 177 86 -87.21 gain 86 178 -93.85 gain 178 86 -87.14 gain 86 179 -87.26 gain 179 86 -79.97 gain 86 180 -106.10 gain 180 86 -108.26 gain 86 181 -102.85 gain 181 86 -99.04 gain 86 182 -107.59 gain 182 86 -104.86 gain 86 183 -102.72 gain 183 86 -100.27 gain 86 184 -90.71 gain 184 86 -91.00 gain 86 185 -99.65 gain 185 86 -103.81 gain 86 186 -98.41 gain 186 86 -98.15 gain 86 187 -94.82 gain 187 86 -92.29 gain 86 188 -94.04 gain 188 86 -93.93 gain 86 189 -95.71 gain 189 86 -90.32 gain 86 190 -96.40 gain 190 86 -94.92 gain 86 191 -95.92 gain 191 86 -93.15 gain 86 192 -102.27 gain 192 86 -98.19 gain 86 193 -84.94 gain 193 86 -79.85 gain 86 194 -93.44 gain 194 86 -89.14 gain 86 195 -108.00 gain 195 86 -102.24 gain 86 196 -92.45 gain 196 86 -91.00 gain 86 197 -97.86 gain 197 86 -91.55 gain 86 198 -101.58 gain 198 86 -99.78 gain 86 199 -100.01 gain 199 86 -98.32 gain 86 200 -95.72 gain 200 86 -95.36 gain 86 201 -101.97 gain 201 86 -101.52 gain 86 202 -99.59 gain 202 86 -98.28 gain 86 203 -89.96 gain 203 86 -87.76 gain 86 204 -92.48 gain 204 86 -86.92 gain 86 205 -93.27 gain 205 86 -91.46 gain 86 206 -90.35 gain 206 86 -89.64 gain 86 207 -101.49 gain 207 86 -100.20 gain 86 208 -99.43 gain 208 86 -100.74 gain 86 209 -95.26 gain 209 86 -96.15 gain 86 210 -106.87 gain 210 86 -107.93 gain 86 211 -108.18 gain 211 86 -104.47 gain 86 212 -93.86 gain 212 86 -93.16 gain 86 213 -98.26 gain 213 86 -96.89 gain 86 214 -94.14 gain 214 86 -98.16 gain 86 215 -94.75 gain 215 86 -94.17 gain 86 216 -95.26 gain 216 86 -98.59 gain 86 217 -92.51 gain 217 86 -96.10 gain 86 218 -99.67 gain 218 86 -96.07 gain 86 219 -93.20 gain 219 86 -90.07 gain 86 220 -94.69 gain 220 86 -87.66 gain 86 221 -96.65 gain 221 86 -95.29 gain 86 222 -94.75 gain 222 86 -89.20 gain 86 223 -91.34 gain 223 86 -89.03 gain 86 224 -95.19 gain 224 86 -93.35 gain 87 88 -59.37 gain 88 87 -59.01 gain 87 89 -74.35 gain 89 87 -76.13 gain 87 90 -97.13 gain 90 87 -98.25 gain 87 91 -106.73 gain 91 87 -108.92 gain 87 92 -95.10 gain 92 87 -98.21 gain 87 93 -93.36 gain 93 87 -93.83 gain 87 94 -94.75 gain 94 87 -93.79 gain 87 95 -90.75 gain 95 87 -89.03 gain 87 96 -88.79 gain 96 87 -94.04 gain 87 97 -88.05 gain 97 87 -86.12 gain 87 98 -79.94 gain 98 87 -78.48 gain 87 99 -83.24 gain 99 87 -80.92 gain 87 100 -76.06 gain 100 87 -73.65 gain 87 101 -69.22 gain 101 87 -70.44 gain 87 102 -67.37 gain 102 87 -68.56 gain 87 103 -74.02 gain 103 87 -76.38 gain 87 104 -76.55 gain 104 87 -81.39 gain 87 105 -99.86 gain 105 87 -99.23 gain 87 106 -92.48 gain 106 87 -89.17 gain 87 107 -94.20 gain 107 87 -90.80 gain 87 108 -97.72 gain 108 87 -93.94 gain 87 109 -95.03 gain 109 87 -94.70 gain 87 110 -91.07 gain 110 87 -97.10 gain 87 111 -94.53 gain 111 87 -90.53 gain 87 112 -75.68 gain 112 87 -75.14 gain 87 113 -81.17 gain 113 87 -79.76 gain 87 114 -76.96 gain 114 87 -72.72 gain 87 115 -79.38 gain 115 87 -75.79 gain 87 116 -69.53 gain 116 87 -68.37 gain 87 117 -81.98 gain 117 87 -77.97 gain 87 118 -72.91 gain 118 87 -70.52 gain 87 119 -71.76 gain 119 87 -74.43 gain 87 120 -97.25 gain 120 87 -97.30 gain 87 121 -99.18 gain 121 87 -100.26 gain 87 122 -99.45 gain 122 87 -100.28 gain 87 123 -92.13 gain 123 87 -93.30 gain 87 124 -86.00 gain 124 87 -85.15 gain 87 125 -85.59 gain 125 87 -88.08 gain 87 126 -88.17 gain 126 87 -87.31 gain 87 127 -90.93 gain 127 87 -89.69 gain 87 128 -87.09 gain 128 87 -88.45 gain 87 129 -87.15 gain 129 87 -85.72 gain 87 130 -80.82 gain 130 87 -80.68 gain 87 131 -76.98 gain 131 87 -76.62 gain 87 132 -79.10 gain 132 87 -74.74 gain 87 133 -78.31 gain 133 87 -79.13 gain 87 134 -87.76 gain 134 87 -85.44 gain 87 135 -96.48 gain 135 87 -96.46 gain 87 136 -98.54 gain 136 87 -98.97 gain 87 137 -96.11 gain 137 87 -99.45 gain 87 138 -89.68 gain 138 87 -86.55 gain 87 139 -89.46 gain 139 87 -89.59 gain 87 140 -92.25 gain 140 87 -93.22 gain 87 141 -93.67 gain 141 87 -86.60 gain 87 142 -88.67 gain 142 87 -88.35 gain 87 143 -89.68 gain 143 87 -92.09 gain 87 144 -83.97 gain 144 87 -84.75 gain 87 145 -79.88 gain 145 87 -84.05 gain 87 146 -80.70 gain 146 87 -80.86 gain 87 147 -82.06 gain 147 87 -79.33 gain 87 148 -80.16 gain 148 87 -75.76 gain 87 149 -93.93 gain 149 87 -93.18 gain 87 150 -96.38 gain 150 87 -96.47 gain 87 151 -98.36 gain 151 87 -97.38 gain 87 152 -101.99 gain 152 87 -100.83 gain 87 153 -91.63 gain 153 87 -89.69 gain 87 154 -92.21 gain 154 87 -92.17 gain 87 155 -92.16 gain 155 87 -90.70 gain 87 156 -99.17 gain 156 87 -96.93 gain 87 157 -87.48 gain 157 87 -87.73 gain 87 158 -92.80 gain 158 87 -92.55 gain 87 159 -87.79 gain 159 87 -89.92 gain 87 160 -74.44 gain 160 87 -73.72 gain 87 161 -90.95 gain 161 87 -92.67 gain 87 162 -81.60 gain 162 87 -83.04 gain 87 163 -82.18 gain 163 87 -85.53 gain 87 164 -86.54 gain 164 87 -89.25 gain 87 165 -100.49 gain 165 87 -100.27 gain 87 166 -98.20 gain 166 87 -97.73 gain 87 167 -99.76 gain 167 87 -100.01 gain 87 168 -97.17 gain 168 87 -96.32 gain 87 169 -98.95 gain 169 87 -99.21 gain 87 170 -93.90 gain 170 87 -93.40 gain 87 171 -94.96 gain 171 87 -95.53 gain 87 172 -88.86 gain 172 87 -87.62 gain 87 173 -90.54 gain 173 87 -93.95 gain 87 174 -85.86 gain 174 87 -85.31 gain 87 175 -87.89 gain 175 87 -88.48 gain 87 176 -90.47 gain 176 87 -90.04 gain 87 177 -85.91 gain 177 87 -88.48 gain 87 178 -93.53 gain 178 87 -89.54 gain 87 179 -95.01 gain 179 87 -90.44 gain 87 180 -101.69 gain 180 87 -106.57 gain 87 181 -99.50 gain 181 87 -98.40 gain 87 182 -107.29 gain 182 87 -107.28 gain 87 183 -100.87 gain 183 87 -101.13 gain 87 184 -94.22 gain 184 87 -97.23 gain 87 185 -104.22 gain 185 87 -111.09 gain 87 186 -97.77 gain 186 87 -100.22 gain 87 187 -93.66 gain 187 87 -93.84 gain 87 188 -89.43 gain 188 87 -92.02 gain 87 189 -89.60 gain 189 87 -86.92 gain 87 190 -89.70 gain 190 87 -90.94 gain 87 191 -87.45 gain 191 87 -87.39 gain 87 192 -91.33 gain 192 87 -89.97 gain 87 193 -89.29 gain 193 87 -86.91 gain 87 194 -93.22 gain 194 87 -91.62 gain 87 195 -98.42 gain 195 87 -95.37 gain 87 196 -105.30 gain 196 87 -106.56 gain 87 197 -96.85 gain 197 87 -93.25 gain 87 198 -97.77 gain 198 87 -98.69 gain 87 199 -96.97 gain 199 87 -97.99 gain 87 200 -95.89 gain 200 87 -98.24 gain 87 201 -85.12 gain 201 87 -87.38 gain 87 202 -94.82 gain 202 87 -96.22 gain 87 203 -96.20 gain 203 87 -96.71 gain 87 204 -94.77 gain 204 87 -91.93 gain 87 205 -85.67 gain 205 87 -86.57 gain 87 206 -88.35 gain 206 87 -90.35 gain 87 207 -88.28 gain 207 87 -89.70 gain 87 208 -90.88 gain 208 87 -94.90 gain 87 209 -98.05 gain 209 87 -101.64 gain 87 210 -103.05 gain 210 87 -106.82 gain 87 211 -94.71 gain 211 87 -93.71 gain 87 212 -96.53 gain 212 87 -98.54 gain 87 213 -95.96 gain 213 87 -97.30 gain 87 214 -99.45 gain 214 87 -106.18 gain 87 215 -103.45 gain 215 87 -105.58 gain 87 216 -99.85 gain 216 87 -105.89 gain 87 217 -98.90 gain 217 87 -105.20 gain 87 218 -96.57 gain 218 87 -95.68 gain 87 219 -91.74 gain 219 87 -91.33 gain 87 220 -95.34 gain 220 87 -91.02 gain 87 221 -89.99 gain 221 87 -91.35 gain 87 222 -96.84 gain 222 87 -94.01 gain 87 223 -87.14 gain 223 87 -87.54 gain 87 224 -91.58 gain 224 87 -92.45 gain 88 89 -69.16 gain 89 88 -71.30 gain 88 90 -103.27 gain 90 88 -104.75 gain 88 91 -99.42 gain 91 88 -101.97 gain 88 92 -104.93 gain 92 88 -108.41 gain 88 93 -99.05 gain 93 88 -99.88 gain 88 94 -89.42 gain 94 88 -88.81 gain 88 95 -90.01 gain 95 88 -88.65 gain 88 96 -95.72 gain 96 88 -101.33 gain 88 97 -94.23 gain 97 88 -92.66 gain 88 98 -82.11 gain 98 88 -81.02 gain 88 99 -86.24 gain 99 88 -84.27 gain 88 100 -84.08 gain 100 88 -82.03 gain 88 101 -73.46 gain 101 88 -75.05 gain 88 102 -69.99 gain 102 88 -71.54 gain 88 103 -62.55 gain 103 88 -65.27 gain 88 104 -68.44 gain 104 88 -73.64 gain 88 105 -90.66 gain 105 88 -90.38 gain 88 106 -97.58 gain 106 88 -94.63 gain 88 107 -93.57 gain 107 88 -90.53 gain 88 108 -97.44 gain 108 88 -94.02 gain 88 109 -89.19 gain 109 88 -89.22 gain 88 110 -95.36 gain 110 88 -101.75 gain 88 111 -85.24 gain 111 88 -81.59 gain 88 112 -84.93 gain 112 88 -84.76 gain 88 113 -88.13 gain 113 88 -87.08 gain 88 114 -80.19 gain 114 88 -76.30 gain 88 115 -79.31 gain 115 88 -76.08 gain 88 116 -77.04 gain 116 88 -76.24 gain 88 117 -74.89 gain 117 88 -71.23 gain 88 118 -71.85 gain 118 88 -69.81 gain 88 119 -75.69 gain 119 88 -78.72 gain 88 120 -95.28 gain 120 88 -95.69 gain 88 121 -104.37 gain 121 88 -105.80 gain 88 122 -99.32 gain 122 88 -100.50 gain 88 123 -102.70 gain 123 88 -104.23 gain 88 124 -93.65 gain 124 88 -93.17 gain 88 125 -88.06 gain 125 88 -90.91 gain 88 126 -93.95 gain 126 88 -93.45 gain 88 127 -94.09 gain 127 88 -93.21 gain 88 128 -84.02 gain 128 88 -85.74 gain 88 129 -81.36 gain 129 88 -80.29 gain 88 130 -82.54 gain 130 88 -82.77 gain 88 131 -86.28 gain 131 88 -86.28 gain 88 132 -79.92 gain 132 88 -75.92 gain 88 133 -74.05 gain 133 88 -75.23 gain 88 134 -80.92 gain 134 88 -78.96 gain 88 135 -99.31 gain 135 88 -99.65 gain 88 136 -95.41 gain 136 88 -96.20 gain 88 137 -93.21 gain 137 88 -96.91 gain 88 138 -95.34 gain 138 88 -92.57 gain 88 139 -94.40 gain 139 88 -94.89 gain 88 140 -99.81 gain 140 88 -101.14 gain 88 141 -93.03 gain 141 88 -86.33 gain 88 142 -88.89 gain 142 88 -88.93 gain 88 143 -91.66 gain 143 88 -94.44 gain 88 144 -87.91 gain 144 88 -89.05 gain 88 145 -91.79 gain 145 88 -96.32 gain 88 146 -90.27 gain 146 88 -90.79 gain 88 147 -78.06 gain 147 88 -75.69 gain 88 148 -90.83 gain 148 88 -86.78 gain 88 149 -82.06 gain 149 88 -81.67 gain 88 150 -96.07 gain 150 88 -96.52 gain 88 151 -95.06 gain 151 88 -94.45 gain 88 152 -98.50 gain 152 88 -97.71 gain 88 153 -87.41 gain 153 88 -85.83 gain 88 154 -89.69 gain 154 88 -90.01 gain 88 155 -94.67 gain 155 88 -93.56 gain 88 156 -92.61 gain 156 88 -90.73 gain 88 157 -90.28 gain 157 88 -90.88 gain 88 158 -85.15 gain 158 88 -85.26 gain 88 159 -88.16 gain 159 88 -90.65 gain 88 160 -84.09 gain 160 88 -83.74 gain 88 161 -78.27 gain 161 88 -80.35 gain 88 162 -82.64 gain 162 88 -84.43 gain 88 163 -94.13 gain 163 88 -97.83 gain 88 164 -84.25 gain 164 88 -87.33 gain 88 165 -101.04 gain 165 88 -101.18 gain 88 166 -99.93 gain 166 88 -99.82 gain 88 167 -100.69 gain 167 88 -101.30 gain 88 168 -101.21 gain 168 88 -100.71 gain 88 169 -95.71 gain 169 88 -96.33 gain 88 170 -88.00 gain 170 88 -87.85 gain 88 171 -99.48 gain 171 88 -100.41 gain 88 172 -93.80 gain 172 88 -92.92 gain 88 173 -98.72 gain 173 88 -102.49 gain 88 174 -84.88 gain 174 88 -84.70 gain 88 175 -88.77 gain 175 88 -89.72 gain 88 176 -89.92 gain 176 88 -89.84 gain 88 177 -94.78 gain 177 88 -97.70 gain 88 178 -96.88 gain 178 88 -93.25 gain 88 179 -90.54 gain 179 88 -86.33 gain 88 180 -100.89 gain 180 88 -106.12 gain 88 181 -97.24 gain 181 88 -96.50 gain 88 182 -97.43 gain 182 88 -97.77 gain 88 183 -94.36 gain 183 88 -94.97 gain 88 184 -91.62 gain 184 88 -94.98 gain 88 185 -95.72 gain 185 88 -102.95 gain 88 186 -93.87 gain 186 88 -96.68 gain 88 187 -97.17 gain 187 88 -97.71 gain 88 188 -100.58 gain 188 88 -103.54 gain 88 189 -93.44 gain 189 88 -91.11 gain 88 190 -92.10 gain 190 88 -93.69 gain 88 191 -89.27 gain 191 88 -89.57 gain 88 192 -86.88 gain 192 88 -85.88 gain 88 193 -84.60 gain 193 88 -82.58 gain 88 194 -90.69 gain 194 88 -89.45 gain 88 195 -94.20 gain 195 88 -91.51 gain 88 196 -92.73 gain 196 88 -94.35 gain 88 197 -92.81 gain 197 88 -89.57 gain 88 198 -95.87 gain 198 88 -97.14 gain 88 199 -97.63 gain 199 88 -99.01 gain 88 200 -96.29 gain 200 88 -99.01 gain 88 201 -97.28 gain 201 88 -99.91 gain 88 202 -96.31 gain 202 88 -98.07 gain 88 203 -97.84 gain 203 88 -98.71 gain 88 204 -92.05 gain 204 88 -89.56 gain 88 205 -88.32 gain 205 88 -89.57 gain 88 206 -93.90 gain 206 88 -96.26 gain 88 207 -91.19 gain 207 88 -92.97 gain 88 208 -92.87 gain 208 88 -97.25 gain 88 209 -87.44 gain 209 88 -91.39 gain 88 210 -102.61 gain 210 88 -106.74 gain 88 211 -102.15 gain 211 88 -101.51 gain 88 212 -101.69 gain 212 88 -104.06 gain 88 213 -94.99 gain 213 88 -96.69 gain 88 214 -99.45 gain 214 88 -106.54 gain 88 215 -93.72 gain 215 88 -96.20 gain 88 216 -93.84 gain 216 88 -100.24 gain 88 217 -98.28 gain 217 88 -104.94 gain 88 218 -101.32 gain 218 88 -100.78 gain 88 219 -96.76 gain 219 88 -96.71 gain 88 220 -97.39 gain 220 88 -93.43 gain 88 221 -93.31 gain 221 88 -95.02 gain 88 222 -92.21 gain 222 88 -89.74 gain 88 223 -84.10 gain 223 88 -84.86 gain 88 224 -91.39 gain 224 88 -92.62 gain 89 90 -93.85 gain 90 89 -93.19 gain 89 91 -93.49 gain 91 89 -93.89 gain 89 92 -101.95 gain 92 89 -103.27 gain 89 93 -98.26 gain 93 89 -96.95 gain 89 94 -93.97 gain 94 89 -91.22 gain 89 95 -89.33 gain 95 89 -85.82 gain 89 96 -92.43 gain 96 89 -95.90 gain 89 97 -94.54 gain 97 89 -90.83 gain 89 98 -89.70 gain 98 89 -86.45 gain 89 99 -90.30 gain 99 89 -86.20 gain 89 100 -86.60 gain 100 89 -82.41 gain 89 101 -84.04 gain 101 89 -83.48 gain 89 102 -77.48 gain 102 89 -76.89 gain 89 103 -73.34 gain 103 89 -73.92 gain 89 104 -63.52 gain 104 89 -66.58 gain 89 105 -107.12 gain 105 89 -104.70 gain 89 106 -100.64 gain 106 89 -95.55 gain 89 107 -96.45 gain 107 89 -91.26 gain 89 108 -103.40 gain 108 89 -97.83 gain 89 109 -102.56 gain 109 89 -100.44 gain 89 110 -91.69 gain 110 89 -95.93 gain 89 111 -99.65 gain 111 89 -93.86 gain 89 112 -93.30 gain 112 89 -90.97 gain 89 113 -90.35 gain 113 89 -87.16 gain 89 114 -83.53 gain 114 89 -77.50 gain 89 115 -91.32 gain 115 89 -85.95 gain 89 116 -82.53 gain 116 89 -79.59 gain 89 117 -83.60 gain 117 89 -77.80 gain 89 118 -76.06 gain 118 89 -71.88 gain 89 119 -86.19 gain 119 89 -87.07 gain 89 120 -103.93 gain 120 89 -102.20 gain 89 121 -102.84 gain 121 89 -102.13 gain 89 122 -99.39 gain 122 89 -98.43 gain 89 123 -100.93 gain 123 89 -100.31 gain 89 124 -101.98 gain 124 89 -99.35 gain 89 125 -100.60 gain 125 89 -101.31 gain 89 126 -98.82 gain 126 89 -96.18 gain 89 127 -95.34 gain 127 89 -92.32 gain 89 128 -88.07 gain 128 89 -87.65 gain 89 129 -91.30 gain 129 89 -88.09 gain 89 130 -91.95 gain 130 89 -90.03 gain 89 131 -89.69 gain 131 89 -87.55 gain 89 132 -83.12 gain 132 89 -76.98 gain 89 133 -81.15 gain 133 89 -80.19 gain 89 134 -84.13 gain 134 89 -80.03 gain 89 135 -104.54 gain 135 89 -102.74 gain 89 136 -96.72 gain 136 89 -95.36 gain 89 137 -98.74 gain 137 89 -100.30 gain 89 138 -97.92 gain 138 89 -93.00 gain 89 139 -96.53 gain 139 89 -94.88 gain 89 140 -94.77 gain 140 89 -93.94 gain 89 141 -95.01 gain 141 89 -86.16 gain 89 142 -95.11 gain 142 89 -93.01 gain 89 143 -88.41 gain 143 89 -89.04 gain 89 144 -93.31 gain 144 89 -92.30 gain 89 145 -85.19 gain 145 89 -87.57 gain 89 146 -90.17 gain 146 89 -88.55 gain 89 147 -91.62 gain 147 89 -87.10 gain 89 148 -83.48 gain 148 89 -77.29 gain 89 149 -75.52 gain 149 89 -72.98 gain 89 150 -102.86 gain 150 89 -101.16 gain 89 151 -99.98 gain 151 89 -97.22 gain 89 152 -92.64 gain 152 89 -89.70 gain 89 153 -98.72 gain 153 89 -95.00 gain 89 154 -98.04 gain 154 89 -96.21 gain 89 155 -100.03 gain 155 89 -96.78 gain 89 156 -96.85 gain 156 89 -92.83 gain 89 157 -97.18 gain 157 89 -95.65 gain 89 158 -94.63 gain 158 89 -92.59 gain 89 159 -90.96 gain 159 89 -91.30 gain 89 160 -94.97 gain 160 89 -92.47 gain 89 161 -85.48 gain 161 89 -85.42 gain 89 162 -95.97 gain 162 89 -95.62 gain 89 163 -90.22 gain 163 89 -91.78 gain 89 164 -77.30 gain 164 89 -78.23 gain 89 165 -108.43 gain 165 89 -106.42 gain 89 166 -98.80 gain 166 89 -96.55 gain 89 167 -100.11 gain 167 89 -98.57 gain 89 168 -107.67 gain 168 89 -105.03 gain 89 169 -97.71 gain 169 89 -96.19 gain 89 170 -97.67 gain 170 89 -95.38 gain 89 171 -91.70 gain 171 89 -90.49 gain 89 172 -93.76 gain 172 89 -90.73 gain 89 173 -92.14 gain 173 89 -93.76 gain 89 174 -96.97 gain 174 89 -94.64 gain 89 175 -94.73 gain 175 89 -93.54 gain 89 176 -88.72 gain 176 89 -86.49 gain 89 177 -89.00 gain 177 89 -89.78 gain 89 178 -90.22 gain 178 89 -84.44 gain 89 179 -84.94 gain 179 89 -78.58 gain 89 180 -102.56 gain 180 89 -105.65 gain 89 181 -103.39 gain 181 89 -100.50 gain 89 182 -96.49 gain 182 89 -94.68 gain 89 183 -100.54 gain 183 89 -99.01 gain 89 184 -97.75 gain 184 89 -98.97 gain 89 185 -99.11 gain 185 89 -104.19 gain 89 186 -100.78 gain 186 89 -101.44 gain 89 187 -97.92 gain 187 89 -96.32 gain 89 188 -93.97 gain 188 89 -94.78 gain 89 189 -95.51 gain 189 89 -91.05 gain 89 190 -99.40 gain 190 89 -98.85 gain 89 191 -91.19 gain 191 89 -89.35 gain 89 192 -96.18 gain 192 89 -93.03 gain 89 193 -94.92 gain 193 89 -90.76 gain 89 194 -95.24 gain 194 89 -91.86 gain 89 195 -105.74 gain 195 89 -100.90 gain 89 196 -99.76 gain 196 89 -99.24 gain 89 197 -107.03 gain 197 89 -101.64 gain 89 198 -99.00 gain 198 89 -98.13 gain 89 199 -102.91 gain 199 89 -102.14 gain 89 200 -100.74 gain 200 89 -101.31 gain 89 201 -98.36 gain 201 89 -98.84 gain 89 202 -97.55 gain 202 89 -97.16 gain 89 203 -105.73 gain 203 89 -104.46 gain 89 204 -97.64 gain 204 89 -93.01 gain 89 205 -104.16 gain 205 89 -103.27 gain 89 206 -92.50 gain 206 89 -92.72 gain 89 207 -90.24 gain 207 89 -89.88 gain 89 208 -93.51 gain 208 89 -95.75 gain 89 209 -86.79 gain 209 89 -88.60 gain 89 210 -100.12 gain 210 89 -102.11 gain 89 211 -106.03 gain 211 89 -103.25 gain 89 212 -100.75 gain 212 89 -100.98 gain 89 213 -102.61 gain 213 89 -102.16 gain 89 214 -102.26 gain 214 89 -107.20 gain 89 215 -99.68 gain 215 89 -100.03 gain 89 216 -98.61 gain 216 89 -102.86 gain 89 217 -94.86 gain 217 89 -99.37 gain 89 218 -96.31 gain 218 89 -93.63 gain 89 219 -99.58 gain 219 89 -97.38 gain 89 220 -94.31 gain 220 89 -88.20 gain 89 221 -91.35 gain 221 89 -90.92 gain 89 222 -106.88 gain 222 89 -102.26 gain 89 223 -99.44 gain 223 89 -98.06 gain 89 224 -92.64 gain 224 89 -91.73 gain 90 91 -67.57 gain 91 90 -68.64 gain 90 92 -78.43 gain 92 90 -80.42 gain 90 93 -74.71 gain 93 90 -74.05 gain 90 94 -86.15 gain 94 90 -84.06 gain 90 95 -90.54 gain 95 90 -87.70 gain 90 96 -94.69 gain 96 90 -98.82 gain 90 97 -93.86 gain 97 90 -90.80 gain 90 98 -93.90 gain 98 90 -91.32 gain 90 99 -88.05 gain 99 90 -84.61 gain 90 100 -100.16 gain 100 90 -96.63 gain 90 101 -96.68 gain 101 90 -96.78 gain 90 102 -95.17 gain 102 90 -95.24 gain 90 103 -101.67 gain 103 90 -102.90 gain 90 104 -91.70 gain 104 90 -95.41 gain 90 105 -66.83 gain 105 90 -65.07 gain 90 106 -68.75 gain 106 90 -64.32 gain 90 107 -80.44 gain 107 90 -75.92 gain 90 108 -73.07 gain 108 90 -68.16 gain 90 109 -85.48 gain 109 90 -84.02 gain 90 110 -83.19 gain 110 90 -88.10 gain 90 111 -78.60 gain 111 90 -73.48 gain 90 112 -90.68 gain 112 90 -89.02 gain 90 113 -91.92 gain 113 90 -89.38 gain 90 114 -97.74 gain 114 90 -92.37 gain 90 115 -93.71 gain 115 90 -89.00 gain 90 116 -102.68 gain 116 90 -100.40 gain 90 117 -101.41 gain 117 90 -96.27 gain 90 118 -98.39 gain 118 90 -94.87 gain 90 119 -99.52 gain 119 90 -101.06 gain 90 120 -71.51 gain 120 90 -70.44 gain 90 121 -75.32 gain 121 90 -75.27 gain 90 122 -80.20 gain 122 90 -79.90 gain 90 123 -76.77 gain 123 90 -76.81 gain 90 124 -83.21 gain 124 90 -81.24 gain 90 125 -90.12 gain 125 90 -91.49 gain 90 126 -80.07 gain 126 90 -78.08 gain 90 127 -86.59 gain 127 90 -84.23 gain 90 128 -95.66 gain 128 90 -95.90 gain 90 129 -85.28 gain 129 90 -82.72 gain 90 130 -95.99 gain 130 90 -94.73 gain 90 131 -97.21 gain 131 90 -95.72 gain 90 132 -88.96 gain 132 90 -83.48 gain 90 133 -102.13 gain 133 90 -101.82 gain 90 134 -105.24 gain 134 90 -101.79 gain 90 135 -81.14 gain 135 90 -80.00 gain 90 136 -75.71 gain 136 90 -75.01 gain 90 137 -81.37 gain 137 90 -83.59 gain 90 138 -78.05 gain 138 90 -73.79 gain 90 139 -84.23 gain 139 90 -83.24 gain 90 140 -87.24 gain 140 90 -87.07 gain 90 141 -88.83 gain 141 90 -80.64 gain 90 142 -96.67 gain 142 90 -95.22 gain 90 143 -97.05 gain 143 90 -98.34 gain 90 144 -97.32 gain 144 90 -96.97 gain 90 145 -93.77 gain 145 90 -96.81 gain 90 146 -96.72 gain 146 90 -95.75 gain 90 147 -97.06 gain 147 90 -93.20 gain 90 148 -96.68 gain 148 90 -91.15 gain 90 149 -97.64 gain 149 90 -95.76 gain 90 150 -84.73 gain 150 90 -83.70 gain 90 151 -83.88 gain 151 90 -81.79 gain 90 152 -90.38 gain 152 90 -88.10 gain 90 153 -85.51 gain 153 90 -82.45 gain 90 154 -83.18 gain 154 90 -82.02 gain 90 155 -87.74 gain 155 90 -85.15 gain 90 156 -98.81 gain 156 90 -95.46 gain 90 157 -95.29 gain 157 90 -94.42 gain 90 158 -94.78 gain 158 90 -93.40 gain 90 159 -103.32 gain 159 90 -104.32 gain 90 160 -92.71 gain 160 90 -90.87 gain 90 161 -100.26 gain 161 90 -100.86 gain 90 162 -98.71 gain 162 90 -99.02 gain 90 163 -97.93 gain 163 90 -100.15 gain 90 164 -96.73 gain 164 90 -98.32 gain 90 165 -92.48 gain 165 90 -91.13 gain 90 166 -89.45 gain 166 90 -87.86 gain 90 167 -86.17 gain 167 90 -85.30 gain 90 168 -90.18 gain 168 90 -88.20 gain 90 169 -85.89 gain 169 90 -85.02 gain 90 170 -90.29 gain 170 90 -88.65 gain 90 171 -93.52 gain 171 90 -92.97 gain 90 172 -94.16 gain 172 90 -91.79 gain 90 173 -90.71 gain 173 90 -92.99 gain 90 174 -91.33 gain 174 90 -89.66 gain 90 175 -104.74 gain 175 90 -104.21 gain 90 176 -99.68 gain 176 90 -98.11 gain 90 177 -101.75 gain 177 90 -103.19 gain 90 178 -104.30 gain 178 90 -99.18 gain 90 179 -104.66 gain 179 90 -98.97 gain 90 180 -98.06 gain 180 90 -101.81 gain 90 181 -90.41 gain 181 90 -88.19 gain 90 182 -96.35 gain 182 90 -95.20 gain 90 183 -88.77 gain 183 90 -87.90 gain 90 184 -93.10 gain 184 90 -94.98 gain 90 185 -94.82 gain 185 90 -100.57 gain 90 186 -92.02 gain 186 90 -93.35 gain 90 187 -95.87 gain 187 90 -94.93 gain 90 188 -98.04 gain 188 90 -99.51 gain 90 189 -95.35 gain 189 90 -91.55 gain 90 190 -100.40 gain 190 90 -100.51 gain 90 191 -97.99 gain 191 90 -96.80 gain 90 192 -99.22 gain 192 90 -96.73 gain 90 193 -105.05 gain 193 90 -101.54 gain 90 194 -102.77 gain 194 90 -100.05 gain 90 195 -94.62 gain 195 90 -90.44 gain 90 196 -93.34 gain 196 90 -93.48 gain 90 197 -97.44 gain 197 90 -92.72 gain 90 198 -85.96 gain 198 90 -85.75 gain 90 199 -92.74 gain 199 90 -92.63 gain 90 200 -94.43 gain 200 90 -95.66 gain 90 201 -88.87 gain 201 90 -90.01 gain 90 202 -96.55 gain 202 90 -96.82 gain 90 203 -96.50 gain 203 90 -95.88 gain 90 204 -101.24 gain 204 90 -97.27 gain 90 205 -95.89 gain 205 90 -95.66 gain 90 206 -98.86 gain 206 90 -99.74 gain 90 207 -100.39 gain 207 90 -100.69 gain 90 208 -97.55 gain 208 90 -100.45 gain 90 209 -92.60 gain 209 90 -95.07 gain 90 210 -92.74 gain 210 90 -95.38 gain 90 211 -93.22 gain 211 90 -91.09 gain 90 212 -96.01 gain 212 90 -96.90 gain 90 213 -97.11 gain 213 90 -97.32 gain 90 214 -96.86 gain 214 90 -102.46 gain 90 215 -97.79 gain 215 90 -98.80 gain 90 216 -96.80 gain 216 90 -101.72 gain 90 217 -96.83 gain 217 90 -102.01 gain 90 218 -101.66 gain 218 90 -99.64 gain 90 219 -95.91 gain 219 90 -94.38 gain 90 220 -99.62 gain 220 90 -94.17 gain 90 221 -99.67 gain 221 90 -99.90 gain 90 222 -103.21 gain 222 90 -99.25 gain 90 223 -99.73 gain 223 90 -99.01 gain 90 224 -100.89 gain 224 90 -100.64 gain 91 92 -68.30 gain 92 91 -69.22 gain 91 93 -70.99 gain 93 91 -69.27 gain 91 94 -79.39 gain 94 91 -76.23 gain 91 95 -92.51 gain 95 91 -88.60 gain 91 96 -91.53 gain 96 91 -94.58 gain 91 97 -90.89 gain 97 91 -86.77 gain 91 98 -95.60 gain 98 91 -91.95 gain 91 99 -98.28 gain 99 91 -93.77 gain 91 100 -93.59 gain 100 91 -88.99 gain 91 101 -103.10 gain 101 91 -102.13 gain 91 102 -100.54 gain 102 91 -99.54 gain 91 103 -102.50 gain 103 91 -102.66 gain 91 104 -102.21 gain 104 91 -104.86 gain 91 105 -77.21 gain 105 91 -74.38 gain 91 106 -63.39 gain 106 91 -57.89 gain 91 107 -71.62 gain 107 91 -66.03 gain 91 108 -69.92 gain 108 91 -63.94 gain 91 109 -76.58 gain 109 91 -74.06 gain 91 110 -83.17 gain 110 91 -87.00 gain 91 111 -93.12 gain 111 91 -86.93 gain 91 112 -86.76 gain 112 91 -84.03 gain 91 113 -94.96 gain 113 91 -91.36 gain 91 114 -90.08 gain 114 91 -83.65 gain 91 115 -95.84 gain 115 91 -90.06 gain 91 116 -97.17 gain 116 91 -93.82 gain 91 117 -101.78 gain 117 91 -95.57 gain 91 118 -100.70 gain 118 91 -96.12 gain 91 119 -104.47 gain 119 91 -104.95 gain 91 120 -77.68 gain 120 91 -75.54 gain 91 121 -78.56 gain 121 91 -77.45 gain 91 122 -86.89 gain 122 91 -85.52 gain 91 123 -79.16 gain 123 91 -78.13 gain 91 124 -79.67 gain 124 91 -76.63 gain 91 125 -91.25 gain 125 91 -91.55 gain 91 126 -92.82 gain 126 91 -89.77 gain 91 127 -90.29 gain 127 91 -86.87 gain 91 128 -92.86 gain 128 91 -92.02 gain 91 129 -92.47 gain 129 91 -88.85 gain 91 130 -98.68 gain 130 91 -96.34 gain 91 131 -100.92 gain 131 91 -98.36 gain 91 132 -99.65 gain 132 91 -93.11 gain 91 133 -98.16 gain 133 91 -96.79 gain 91 134 -101.70 gain 134 91 -97.19 gain 91 135 -77.43 gain 135 91 -75.22 gain 91 136 -83.73 gain 136 91 -81.96 gain 91 137 -88.90 gain 137 91 -90.05 gain 91 138 -82.57 gain 138 91 -77.24 gain 91 139 -96.29 gain 139 91 -94.24 gain 91 140 -92.17 gain 140 91 -90.95 gain 91 141 -92.21 gain 141 91 -82.95 gain 91 142 -91.51 gain 142 91 -89.00 gain 91 143 -97.37 gain 143 91 -97.59 gain 91 144 -95.23 gain 144 91 -93.82 gain 91 145 -90.55 gain 145 91 -92.53 gain 91 146 -98.31 gain 146 91 -96.28 gain 91 147 -100.69 gain 147 91 -95.76 gain 91 148 -97.79 gain 148 91 -91.19 gain 91 149 -106.08 gain 149 91 -103.14 gain 91 150 -86.83 gain 150 91 -84.73 gain 91 151 -93.68 gain 151 91 -90.51 gain 91 152 -79.58 gain 152 91 -76.23 gain 91 153 -85.02 gain 153 91 -80.88 gain 91 154 -84.99 gain 154 91 -82.76 gain 91 155 -92.16 gain 155 91 -88.50 gain 91 156 -96.57 gain 156 91 -92.15 gain 91 157 -99.21 gain 157 91 -97.26 gain 91 158 -96.83 gain 158 91 -94.39 gain 91 159 -96.35 gain 159 91 -96.29 gain 91 160 -94.89 gain 160 91 -91.99 gain 91 161 -100.89 gain 161 91 -100.42 gain 91 162 -103.08 gain 162 91 -102.32 gain 91 163 -102.13 gain 163 91 -103.28 gain 91 164 -105.14 gain 164 91 -105.67 gain 91 165 -86.91 gain 165 91 -84.49 gain 91 166 -85.96 gain 166 91 -83.30 gain 91 167 -88.55 gain 167 91 -86.61 gain 91 168 -90.64 gain 168 91 -87.59 gain 91 169 -94.40 gain 169 91 -92.47 gain 91 170 -93.52 gain 170 91 -90.82 gain 91 171 -91.92 gain 171 91 -90.30 gain 91 172 -94.50 gain 172 91 -91.07 gain 91 173 -98.13 gain 173 91 -99.35 gain 91 174 -92.11 gain 174 91 -89.38 gain 91 175 -93.22 gain 175 91 -91.62 gain 91 176 -91.25 gain 176 91 -88.62 gain 91 177 -95.86 gain 177 91 -96.23 gain 91 178 -97.42 gain 178 91 -91.24 gain 91 179 -96.40 gain 179 91 -89.63 gain 91 180 -92.49 gain 180 91 -95.18 gain 91 181 -90.88 gain 181 91 -87.59 gain 91 182 -92.96 gain 182 91 -90.75 gain 91 183 -93.16 gain 183 91 -91.22 gain 91 184 -93.09 gain 184 91 -93.90 gain 91 185 -93.63 gain 185 91 -98.30 gain 91 186 -96.32 gain 186 91 -96.58 gain 91 187 -89.07 gain 187 91 -87.06 gain 91 188 -100.43 gain 188 91 -100.83 gain 91 189 -98.04 gain 189 91 -93.17 gain 91 190 -98.49 gain 190 91 -97.53 gain 91 191 -98.45 gain 191 91 -96.20 gain 91 192 -99.75 gain 192 91 -96.20 gain 91 193 -108.28 gain 193 91 -103.71 gain 91 194 -103.60 gain 194 91 -99.81 gain 91 195 -88.86 gain 195 91 -83.62 gain 91 196 -96.54 gain 196 91 -95.61 gain 91 197 -91.06 gain 197 91 -85.26 gain 91 198 -92.24 gain 198 91 -90.96 gain 91 199 -100.93 gain 199 91 -99.75 gain 91 200 -97.95 gain 200 91 -98.12 gain 91 201 -100.41 gain 201 91 -100.48 gain 91 202 -96.94 gain 202 91 -96.15 gain 91 203 -94.72 gain 203 91 -93.04 gain 91 204 -99.68 gain 204 91 -94.64 gain 91 205 -103.03 gain 205 91 -101.73 gain 91 206 -98.90 gain 206 91 -98.71 gain 91 207 -100.03 gain 207 91 -99.26 gain 91 208 -102.23 gain 208 91 -104.06 gain 91 209 -103.54 gain 209 91 -104.94 gain 91 210 -87.49 gain 210 91 -89.06 gain 91 211 -83.63 gain 211 91 -80.43 gain 91 212 -96.70 gain 212 91 -96.52 gain 91 213 -89.30 gain 213 91 -88.45 gain 91 214 -92.61 gain 214 91 -97.15 gain 91 215 -96.81 gain 215 91 -96.74 gain 91 216 -90.38 gain 216 91 -94.22 gain 91 217 -103.29 gain 217 91 -107.40 gain 91 218 -100.96 gain 218 91 -97.88 gain 91 219 -98.33 gain 219 91 -95.73 gain 91 220 -99.64 gain 220 91 -93.12 gain 91 221 -99.76 gain 221 91 -98.92 gain 91 222 -102.73 gain 222 91 -97.70 gain 91 223 -95.75 gain 223 91 -93.96 gain 91 224 -102.42 gain 224 91 -101.09 gain 92 93 -66.56 gain 93 92 -63.92 gain 92 94 -72.36 gain 94 92 -68.28 gain 92 95 -79.98 gain 95 92 -75.15 gain 92 96 -83.42 gain 96 92 -85.56 gain 92 97 -100.12 gain 97 92 -95.08 gain 92 98 -92.58 gain 98 92 -88.01 gain 92 99 -95.31 gain 99 92 -89.88 gain 92 100 -95.40 gain 100 92 -89.88 gain 92 101 -100.45 gain 101 92 -98.57 gain 92 102 -91.02 gain 102 92 -89.09 gain 92 103 -94.17 gain 103 92 -93.42 gain 92 104 -95.81 gain 104 92 -97.54 gain 92 105 -79.08 gain 105 92 -75.33 gain 92 106 -73.02 gain 106 92 -66.60 gain 92 107 -67.75 gain 107 92 -61.24 gain 92 108 -73.65 gain 108 92 -66.75 gain 92 109 -88.43 gain 109 92 -84.98 gain 92 110 -81.42 gain 110 92 -84.34 gain 92 111 -86.83 gain 111 92 -79.71 gain 92 112 -91.75 gain 112 92 -88.10 gain 92 113 -87.70 gain 113 92 -83.18 gain 92 114 -98.93 gain 114 92 -91.57 gain 92 115 -93.36 gain 115 92 -86.66 gain 92 116 -98.08 gain 116 92 -93.81 gain 92 117 -99.00 gain 117 92 -91.88 gain 92 118 -103.29 gain 118 92 -97.79 gain 92 119 -108.64 gain 119 92 -108.19 gain 92 120 -82.52 gain 120 92 -79.46 gain 92 121 -79.05 gain 121 92 -77.01 gain 92 122 -77.16 gain 122 92 -74.87 gain 92 123 -72.19 gain 123 92 -70.25 gain 92 124 -78.24 gain 124 92 -74.28 gain 92 125 -82.05 gain 125 92 -81.43 gain 92 126 -89.24 gain 126 92 -85.27 gain 92 127 -85.88 gain 127 92 -81.54 gain 92 128 -86.40 gain 128 92 -84.64 gain 92 129 -98.45 gain 129 92 -93.91 gain 92 130 -95.68 gain 130 92 -92.43 gain 92 131 -95.50 gain 131 92 -92.03 gain 92 132 -102.67 gain 132 92 -95.20 gain 92 133 -96.89 gain 133 92 -94.60 gain 92 134 -100.21 gain 134 92 -94.79 gain 92 135 -78.77 gain 135 92 -75.64 gain 92 136 -84.27 gain 136 92 -81.58 gain 92 137 -74.49 gain 137 92 -74.72 gain 92 138 -80.87 gain 138 92 -74.63 gain 92 139 -81.77 gain 139 92 -78.79 gain 92 140 -87.49 gain 140 92 -85.34 gain 92 141 -90.73 gain 141 92 -80.55 gain 92 142 -84.66 gain 142 92 -81.22 gain 92 143 -93.76 gain 143 92 -93.06 gain 92 144 -87.82 gain 144 92 -85.49 gain 92 145 -96.57 gain 145 92 -97.63 gain 92 146 -96.17 gain 146 92 -93.22 gain 92 147 -95.02 gain 147 92 -89.18 gain 92 148 -103.30 gain 148 92 -95.79 gain 92 149 -101.62 gain 149 92 -97.76 gain 92 150 -87.80 gain 150 92 -84.77 gain 92 151 -84.48 gain 151 92 -80.40 gain 92 152 -88.70 gain 152 92 -84.43 gain 92 153 -80.23 gain 153 92 -75.18 gain 92 154 -94.73 gain 154 92 -91.58 gain 92 155 -84.09 gain 155 92 -79.52 gain 92 156 -88.32 gain 156 92 -82.98 gain 92 157 -89.96 gain 157 92 -87.10 gain 92 158 -88.04 gain 158 92 -84.68 gain 92 159 -97.16 gain 159 92 -96.17 gain 92 160 -99.82 gain 160 92 -96.00 gain 92 161 -102.55 gain 161 92 -101.16 gain 92 162 -98.89 gain 162 92 -97.21 gain 92 163 -100.65 gain 163 92 -100.89 gain 92 164 -103.34 gain 164 92 -102.95 gain 92 165 -95.60 gain 165 92 -92.26 gain 92 166 -94.41 gain 166 92 -90.82 gain 92 167 -88.74 gain 167 92 -85.88 gain 92 168 -90.99 gain 168 92 -87.03 gain 92 169 -91.37 gain 169 92 -88.52 gain 92 170 -92.48 gain 170 92 -88.86 gain 92 171 -92.71 gain 171 92 -90.18 gain 92 172 -99.13 gain 172 92 -94.78 gain 92 173 -98.50 gain 173 92 -98.80 gain 92 174 -93.27 gain 174 92 -89.62 gain 92 175 -95.10 gain 175 92 -92.58 gain 92 176 -92.99 gain 176 92 -89.44 gain 92 177 -94.61 gain 177 92 -94.06 gain 92 178 -96.08 gain 178 92 -88.98 gain 92 179 -104.30 gain 179 92 -96.62 gain 92 180 -87.08 gain 180 92 -88.85 gain 92 181 -97.83 gain 181 92 -93.61 gain 92 182 -95.60 gain 182 92 -92.47 gain 92 183 -94.95 gain 183 92 -92.09 gain 92 184 -88.01 gain 184 92 -87.90 gain 92 185 -95.25 gain 185 92 -99.01 gain 92 186 -97.06 gain 186 92 -96.40 gain 92 187 -91.39 gain 187 92 -88.46 gain 92 188 -89.70 gain 188 92 -89.18 gain 92 189 -101.80 gain 189 92 -96.01 gain 92 190 -107.47 gain 190 92 -105.59 gain 92 191 -97.28 gain 191 92 -94.11 gain 92 192 -99.47 gain 192 92 -94.99 gain 92 193 -103.81 gain 193 92 -98.32 gain 92 194 -100.33 gain 194 92 -95.62 gain 92 195 -96.68 gain 195 92 -90.51 gain 92 196 -93.79 gain 196 92 -91.94 gain 92 197 -91.91 gain 197 92 -85.19 gain 92 198 -90.22 gain 198 92 -88.02 gain 92 199 -90.57 gain 199 92 -88.47 gain 92 200 -100.52 gain 200 92 -99.76 gain 92 201 -96.52 gain 201 92 -95.67 gain 92 202 -107.37 gain 202 92 -105.65 gain 92 203 -106.05 gain 203 92 -103.45 gain 92 204 -102.73 gain 204 92 -96.77 gain 92 205 -99.51 gain 205 92 -97.29 gain 92 206 -105.57 gain 206 92 -104.46 gain 92 207 -98.93 gain 207 92 -97.24 gain 92 208 -100.28 gain 208 92 -101.19 gain 92 209 -103.03 gain 209 92 -103.51 gain 92 210 -99.50 gain 210 92 -100.16 gain 92 211 -98.29 gain 211 92 -94.17 gain 92 212 -99.77 gain 212 92 -98.67 gain 92 213 -98.10 gain 213 92 -96.33 gain 92 214 -96.97 gain 214 92 -100.59 gain 92 215 -102.13 gain 215 92 -101.15 gain 92 216 -94.27 gain 216 92 -97.20 gain 92 217 -95.14 gain 217 92 -98.33 gain 92 218 -104.71 gain 218 92 -100.70 gain 92 219 -96.91 gain 219 92 -93.38 gain 92 220 -103.25 gain 220 92 -95.81 gain 92 221 -106.76 gain 221 92 -105.00 gain 92 222 -102.09 gain 222 92 -96.14 gain 92 223 -98.55 gain 223 92 -95.84 gain 92 224 -101.14 gain 224 92 -98.90 gain 93 94 -64.18 gain 94 93 -62.75 gain 93 95 -73.32 gain 95 93 -71.13 gain 93 96 -84.15 gain 96 93 -88.93 gain 93 97 -88.77 gain 97 93 -86.37 gain 93 98 -83.18 gain 98 93 -81.25 gain 93 99 -84.08 gain 99 93 -81.28 gain 93 100 -87.94 gain 100 93 -85.06 gain 93 101 -95.45 gain 101 93 -96.21 gain 93 102 -92.15 gain 102 93 -92.87 gain 93 103 -94.73 gain 103 93 -96.61 gain 93 104 -96.15 gain 104 93 -100.52 gain 93 105 -80.98 gain 105 93 -79.87 gain 93 106 -76.24 gain 106 93 -72.47 gain 93 107 -59.51 gain 107 93 -55.64 gain 93 108 -61.64 gain 108 93 -57.39 gain 93 109 -75.62 gain 109 93 -74.82 gain 93 110 -69.06 gain 110 93 -74.62 gain 93 111 -79.05 gain 111 93 -74.58 gain 93 112 -84.62 gain 112 93 -83.61 gain 93 113 -80.54 gain 113 93 -78.66 gain 93 114 -91.46 gain 114 93 -86.74 gain 93 115 -91.06 gain 115 93 -87.00 gain 93 116 -91.81 gain 116 93 -90.19 gain 93 117 -100.20 gain 117 93 -95.72 gain 93 118 -96.92 gain 118 93 -94.06 gain 93 119 -102.78 gain 119 93 -104.98 gain 93 120 -84.37 gain 120 93 -83.95 gain 93 121 -74.66 gain 121 93 -75.27 gain 93 122 -72.72 gain 122 93 -73.07 gain 93 123 -72.25 gain 123 93 -72.94 gain 93 124 -76.57 gain 124 93 -75.25 gain 93 125 -76.41 gain 125 93 -78.43 gain 93 126 -80.16 gain 126 93 -78.83 gain 93 127 -83.26 gain 127 93 -81.56 gain 93 128 -83.60 gain 128 93 -84.50 gain 93 129 -90.63 gain 129 93 -88.73 gain 93 130 -88.81 gain 130 93 -88.21 gain 93 131 -88.31 gain 131 93 -87.47 gain 93 132 -98.27 gain 132 93 -93.45 gain 93 133 -95.07 gain 133 93 -95.42 gain 93 134 -101.32 gain 134 93 -98.53 gain 93 135 -89.43 gain 135 93 -88.94 gain 93 136 -85.88 gain 136 93 -85.84 gain 93 137 -78.06 gain 137 93 -80.93 gain 93 138 -82.27 gain 138 93 -78.67 gain 93 139 -72.34 gain 139 93 -72.01 gain 93 140 -75.88 gain 140 93 -76.37 gain 93 141 -82.65 gain 141 93 -75.12 gain 93 142 -87.53 gain 142 93 -86.74 gain 93 143 -85.68 gain 143 93 -87.63 gain 93 144 -95.87 gain 144 93 -96.18 gain 93 145 -91.80 gain 145 93 -95.50 gain 93 146 -89.46 gain 146 93 -89.15 gain 93 147 -92.10 gain 147 93 -88.90 gain 93 148 -96.30 gain 148 93 -91.42 gain 93 149 -89.06 gain 149 93 -87.84 gain 93 150 -88.00 gain 150 93 -87.62 gain 93 151 -79.20 gain 151 93 -77.76 gain 93 152 -84.21 gain 152 93 -82.58 gain 93 153 -80.51 gain 153 93 -78.10 gain 93 154 -77.61 gain 154 93 -77.10 gain 93 155 -87.87 gain 155 93 -85.94 gain 93 156 -83.11 gain 156 93 -80.40 gain 93 157 -84.32 gain 157 93 -84.10 gain 93 158 -94.17 gain 158 93 -93.44 gain 93 159 -89.49 gain 159 93 -91.15 gain 93 160 -95.23 gain 160 93 -94.04 gain 93 161 -93.62 gain 161 93 -94.87 gain 93 162 -99.82 gain 162 93 -100.79 gain 93 163 -95.50 gain 163 93 -98.38 gain 93 164 -99.05 gain 164 93 -101.30 gain 93 165 -83.53 gain 165 93 -82.84 gain 93 166 -83.15 gain 166 93 -82.21 gain 93 167 -81.04 gain 167 93 -80.82 gain 93 168 -87.29 gain 168 93 -85.96 gain 93 169 -90.32 gain 169 93 -90.11 gain 93 170 -86.61 gain 170 93 -85.63 gain 93 171 -91.06 gain 171 93 -91.16 gain 93 172 -84.89 gain 172 93 -83.18 gain 93 173 -91.33 gain 173 93 -94.27 gain 93 174 -94.05 gain 174 93 -93.04 gain 93 175 -93.74 gain 175 93 -93.87 gain 93 176 -94.84 gain 176 93 -93.93 gain 93 177 -93.90 gain 177 93 -96.00 gain 93 178 -102.26 gain 178 93 -97.79 gain 93 179 -94.86 gain 179 93 -89.82 gain 93 180 -97.33 gain 180 93 -101.73 gain 93 181 -88.40 gain 181 93 -86.83 gain 93 182 -92.91 gain 182 93 -92.43 gain 93 183 -91.93 gain 183 93 -91.72 gain 93 184 -90.65 gain 184 93 -93.19 gain 93 185 -89.05 gain 185 93 -95.46 gain 93 186 -90.60 gain 186 93 -92.58 gain 93 187 -83.20 gain 187 93 -82.92 gain 93 188 -91.94 gain 188 93 -94.07 gain 93 189 -84.65 gain 189 93 -81.49 gain 93 190 -98.69 gain 190 93 -99.45 gain 93 191 -97.33 gain 191 93 -96.80 gain 93 192 -103.81 gain 192 93 -101.97 gain 93 193 -101.81 gain 193 93 -98.96 gain 93 194 -100.78 gain 194 93 -98.71 gain 93 195 -92.10 gain 195 93 -88.58 gain 93 196 -98.45 gain 196 93 -99.24 gain 93 197 -93.87 gain 197 93 -89.79 gain 93 198 -99.14 gain 198 93 -99.58 gain 93 199 -84.66 gain 199 93 -85.21 gain 93 200 -85.29 gain 200 93 -87.17 gain 93 201 -88.88 gain 201 93 -90.67 gain 93 202 -89.19 gain 202 93 -90.12 gain 93 203 -97.55 gain 203 93 -97.59 gain 93 204 -96.29 gain 204 93 -92.97 gain 93 205 -93.08 gain 205 93 -93.50 gain 93 206 -100.65 gain 206 93 -102.19 gain 93 207 -89.96 gain 207 93 -90.91 gain 93 208 -97.92 gain 208 93 -101.47 gain 93 209 -102.24 gain 209 93 -105.37 gain 93 210 -97.48 gain 210 93 -100.78 gain 93 211 -96.56 gain 211 93 -95.09 gain 93 212 -97.31 gain 212 93 -98.86 gain 93 213 -96.55 gain 213 93 -97.42 gain 93 214 -91.83 gain 214 93 -98.08 gain 93 215 -94.10 gain 215 93 -95.76 gain 93 216 -97.88 gain 216 93 -103.44 gain 93 217 -89.47 gain 217 93 -95.30 gain 93 218 -97.99 gain 218 93 -96.63 gain 93 219 -97.50 gain 219 93 -96.62 gain 93 220 -94.60 gain 220 93 -89.81 gain 93 221 -96.60 gain 221 93 -97.49 gain 93 222 -101.37 gain 222 93 -98.06 gain 93 223 -99.00 gain 223 93 -98.93 gain 93 224 -91.52 gain 224 93 -91.92 gain 94 95 -64.35 gain 95 94 -63.59 gain 94 96 -70.77 gain 96 94 -76.98 gain 94 97 -83.69 gain 97 94 -82.73 gain 94 98 -76.74 gain 98 94 -76.25 gain 94 99 -87.48 gain 99 94 -86.12 gain 94 100 -90.10 gain 100 94 -88.66 gain 94 101 -88.42 gain 101 94 -90.60 gain 94 102 -89.60 gain 102 94 -91.76 gain 94 103 -97.11 gain 103 94 -100.43 gain 94 104 -96.53 gain 104 94 -102.34 gain 94 105 -80.23 gain 105 94 -80.55 gain 94 106 -82.26 gain 106 94 -79.91 gain 94 107 -72.82 gain 107 94 -70.39 gain 94 108 -72.98 gain 108 94 -70.17 gain 94 109 -57.42 gain 109 94 -58.05 gain 94 110 -68.15 gain 110 94 -75.14 gain 94 111 -63.90 gain 111 94 -60.86 gain 94 112 -73.68 gain 112 94 -74.11 gain 94 113 -85.33 gain 113 94 -84.88 gain 94 114 -84.14 gain 114 94 -80.86 gain 94 115 -85.92 gain 115 94 -83.30 gain 94 116 -98.80 gain 116 94 -98.61 gain 94 117 -92.53 gain 117 94 -89.48 gain 94 118 -95.58 gain 118 94 -94.15 gain 94 119 -101.31 gain 119 94 -104.94 gain 94 120 -82.14 gain 120 94 -83.15 gain 94 121 -78.06 gain 121 94 -80.09 gain 94 122 -75.97 gain 122 94 -77.75 gain 94 123 -80.42 gain 123 94 -82.54 gain 94 124 -69.75 gain 124 94 -69.87 gain 94 125 -76.97 gain 125 94 -80.42 gain 94 126 -77.07 gain 126 94 -77.17 gain 94 127 -80.71 gain 127 94 -80.44 gain 94 128 -83.88 gain 128 94 -86.20 gain 94 129 -86.94 gain 129 94 -86.47 gain 94 130 -97.22 gain 130 94 -98.05 gain 94 131 -88.16 gain 131 94 -88.76 gain 94 132 -93.34 gain 132 94 -89.95 gain 94 133 -92.58 gain 133 94 -94.36 gain 94 134 -95.61 gain 134 94 -94.25 gain 94 135 -78.55 gain 135 94 -79.50 gain 94 136 -80.15 gain 136 94 -81.54 gain 94 137 -85.14 gain 137 94 -89.44 gain 94 138 -76.84 gain 138 94 -74.67 gain 94 139 -78.61 gain 139 94 -79.71 gain 94 140 -80.68 gain 140 94 -82.61 gain 94 141 -78.10 gain 141 94 -72.00 gain 94 142 -84.18 gain 142 94 -84.82 gain 94 143 -91.35 gain 143 94 -94.73 gain 94 144 -83.78 gain 144 94 -85.52 gain 94 145 -90.25 gain 145 94 -95.38 gain 94 146 -88.39 gain 146 94 -89.51 gain 94 147 -91.88 gain 147 94 -90.11 gain 94 148 -89.28 gain 148 94 -85.84 gain 94 149 -93.68 gain 149 94 -93.90 gain 94 150 -85.87 gain 150 94 -86.92 gain 94 151 -87.85 gain 151 94 -87.84 gain 94 152 -91.11 gain 152 94 -90.92 gain 94 153 -84.46 gain 153 94 -83.48 gain 94 154 -78.15 gain 154 94 -79.08 gain 94 155 -87.36 gain 155 94 -86.86 gain 94 156 -81.51 gain 156 94 -80.24 gain 94 157 -77.51 gain 157 94 -78.72 gain 94 158 -84.03 gain 158 94 -84.74 gain 94 159 -95.90 gain 159 94 -99.00 gain 94 160 -89.35 gain 160 94 -89.60 gain 94 161 -92.60 gain 161 94 -95.29 gain 94 162 -95.24 gain 162 94 -97.64 gain 94 163 -89.88 gain 163 94 -94.19 gain 94 164 -101.73 gain 164 94 -105.41 gain 94 165 -86.59 gain 165 94 -87.32 gain 94 166 -82.92 gain 166 94 -83.41 gain 94 167 -86.01 gain 167 94 -87.23 gain 94 168 -90.45 gain 168 94 -90.56 gain 94 169 -89.12 gain 169 94 -90.34 gain 94 170 -84.34 gain 170 94 -84.80 gain 94 171 -83.13 gain 171 94 -84.67 gain 94 172 -96.26 gain 172 94 -95.99 gain 94 173 -85.02 gain 173 94 -89.40 gain 94 174 -90.27 gain 174 94 -90.69 gain 94 175 -90.68 gain 175 94 -92.24 gain 94 176 -90.24 gain 176 94 -90.77 gain 94 177 -92.73 gain 177 94 -96.25 gain 94 178 -92.26 gain 178 94 -89.23 gain 94 179 -98.24 gain 179 94 -94.63 gain 94 180 -89.16 gain 180 94 -95.00 gain 94 181 -86.05 gain 181 94 -85.91 gain 94 182 -91.61 gain 182 94 -92.55 gain 94 183 -84.32 gain 183 94 -85.54 gain 94 184 -81.04 gain 184 94 -85.01 gain 94 185 -85.11 gain 185 94 -92.95 gain 94 186 -87.87 gain 186 94 -91.29 gain 94 187 -86.98 gain 187 94 -88.12 gain 94 188 -89.30 gain 188 94 -92.85 gain 94 189 -94.52 gain 189 94 -92.80 gain 94 190 -92.65 gain 190 94 -94.85 gain 94 191 -86.36 gain 191 94 -87.26 gain 94 192 -97.56 gain 192 94 -97.16 gain 94 193 -98.61 gain 193 94 -97.20 gain 94 194 -97.54 gain 194 94 -96.91 gain 94 195 -84.14 gain 195 94 -82.06 gain 94 196 -90.52 gain 196 94 -92.75 gain 94 197 -82.01 gain 197 94 -79.37 gain 94 198 -92.34 gain 198 94 -94.21 gain 94 199 -89.28 gain 199 94 -91.26 gain 94 200 -90.04 gain 200 94 -93.36 gain 94 201 -95.79 gain 201 94 -99.01 gain 94 202 -94.55 gain 202 94 -96.90 gain 94 203 -88.66 gain 203 94 -90.13 gain 94 204 -93.22 gain 204 94 -91.34 gain 94 205 -92.71 gain 205 94 -94.56 gain 94 206 -92.68 gain 206 94 -95.64 gain 94 207 -87.89 gain 207 94 -90.28 gain 94 208 -97.34 gain 208 94 -102.33 gain 94 209 -95.20 gain 209 94 -99.76 gain 94 210 -89.83 gain 210 94 -94.56 gain 94 211 -93.52 gain 211 94 -93.48 gain 94 212 -96.26 gain 212 94 -99.24 gain 94 213 -89.55 gain 213 94 -91.85 gain 94 214 -90.91 gain 214 94 -98.60 gain 94 215 -93.96 gain 215 94 -97.05 gain 94 216 -97.66 gain 216 94 -104.66 gain 94 217 -93.68 gain 217 94 -100.95 gain 94 218 -89.91 gain 218 94 -89.98 gain 94 219 -91.04 gain 219 94 -91.59 gain 94 220 -97.38 gain 220 94 -94.02 gain 94 221 -96.37 gain 221 94 -98.69 gain 94 222 -93.05 gain 222 94 -91.17 gain 94 223 -102.55 gain 223 94 -103.91 gain 94 224 -106.74 gain 224 94 -108.58 gain 95 96 -69.65 gain 96 95 -76.62 gain 95 97 -72.06 gain 97 95 -71.85 gain 95 98 -77.92 gain 98 95 -78.19 gain 95 99 -78.96 gain 99 95 -78.36 gain 95 100 -83.85 gain 100 95 -83.17 gain 95 101 -82.63 gain 101 95 -85.57 gain 95 102 -93.33 gain 102 95 -96.25 gain 95 103 -87.62 gain 103 95 -91.70 gain 95 104 -92.84 gain 104 95 -99.41 gain 95 105 -84.37 gain 105 95 -85.45 gain 95 106 -80.40 gain 106 95 -78.82 gain 95 107 -82.31 gain 107 95 -80.63 gain 95 108 -76.77 gain 108 95 -74.71 gain 95 109 -58.16 gain 109 95 -59.55 gain 95 110 -59.44 gain 110 95 -67.19 gain 95 111 -63.03 gain 111 95 -60.75 gain 95 112 -69.83 gain 112 95 -71.01 gain 95 113 -80.31 gain 113 95 -80.63 gain 95 114 -77.97 gain 114 95 -75.45 gain 95 115 -83.94 gain 115 95 -82.07 gain 95 116 -87.01 gain 116 95 -87.57 gain 95 117 -88.08 gain 117 95 -85.79 gain 95 118 -90.27 gain 118 95 -89.60 gain 95 119 -93.62 gain 119 95 -98.01 gain 95 120 -80.42 gain 120 95 -82.19 gain 95 121 -84.62 gain 121 95 -87.42 gain 95 122 -77.62 gain 122 95 -80.17 gain 95 123 -75.39 gain 123 95 -78.27 gain 95 124 -75.67 gain 124 95 -76.54 gain 95 125 -62.48 gain 125 95 -66.70 gain 95 126 -75.34 gain 126 95 -76.20 gain 95 127 -73.24 gain 127 95 -73.73 gain 95 128 -83.31 gain 128 95 -86.39 gain 95 129 -86.34 gain 129 95 -86.63 gain 95 130 -80.55 gain 130 95 -82.14 gain 95 131 -94.48 gain 131 95 -95.84 gain 95 132 -88.27 gain 132 95 -85.63 gain 95 133 -91.53 gain 133 95 -94.08 gain 95 134 -85.43 gain 134 95 -84.83 gain 95 135 -87.60 gain 135 95 -89.31 gain 95 136 -85.81 gain 136 95 -87.96 gain 95 137 -77.76 gain 137 95 -82.82 gain 95 138 -74.28 gain 138 95 -72.87 gain 95 139 -80.52 gain 139 95 -82.37 gain 95 140 -81.03 gain 140 95 -83.72 gain 95 141 -75.72 gain 141 95 -70.38 gain 95 142 -85.40 gain 142 95 -86.80 gain 95 143 -83.07 gain 143 95 -87.21 gain 95 144 -88.10 gain 144 95 -90.60 gain 95 145 -86.19 gain 145 95 -92.08 gain 95 146 -87.96 gain 146 95 -89.84 gain 95 147 -83.27 gain 147 95 -82.26 gain 95 148 -80.83 gain 148 95 -78.15 gain 95 149 -87.14 gain 149 95 -88.11 gain 95 150 -89.13 gain 150 95 -90.94 gain 95 151 -85.35 gain 151 95 -86.10 gain 95 152 -86.52 gain 152 95 -87.08 gain 95 153 -83.33 gain 153 95 -83.11 gain 95 154 -79.40 gain 154 95 -81.08 gain 95 155 -72.85 gain 155 95 -73.10 gain 95 156 -76.82 gain 156 95 -76.31 gain 95 157 -83.49 gain 157 95 -85.46 gain 95 158 -88.16 gain 158 95 -89.63 gain 95 159 -85.50 gain 159 95 -89.35 gain 95 160 -89.97 gain 160 95 -90.97 gain 95 161 -89.74 gain 161 95 -93.19 gain 95 162 -98.23 gain 162 95 -101.39 gain 95 163 -95.15 gain 163 95 -100.22 gain 95 164 -99.18 gain 164 95 -103.62 gain 95 165 -90.43 gain 165 95 -91.92 gain 95 166 -85.42 gain 166 95 -86.67 gain 95 167 -86.72 gain 167 95 -88.69 gain 95 168 -80.78 gain 168 95 -81.64 gain 95 169 -84.27 gain 169 95 -86.25 gain 95 170 -86.42 gain 170 95 -87.64 gain 95 171 -75.58 gain 171 95 -77.88 gain 95 172 -82.45 gain 172 95 -82.93 gain 95 173 -87.09 gain 173 95 -92.23 gain 95 174 -90.85 gain 174 95 -92.03 gain 95 175 -90.45 gain 175 95 -92.76 gain 95 176 -92.00 gain 176 95 -93.28 gain 95 177 -89.48 gain 177 95 -93.76 gain 95 178 -95.84 gain 178 95 -93.56 gain 95 179 -95.05 gain 179 95 -92.20 gain 95 180 -82.64 gain 180 95 -89.24 gain 95 181 -95.74 gain 181 95 -96.36 gain 95 182 -91.69 gain 182 95 -93.40 gain 95 183 -89.84 gain 183 95 -91.82 gain 95 184 -86.10 gain 184 95 -90.83 gain 95 185 -85.53 gain 185 95 -94.12 gain 95 186 -84.66 gain 186 95 -88.83 gain 95 187 -89.14 gain 187 95 -91.05 gain 95 188 -88.26 gain 188 95 -92.58 gain 95 189 -86.46 gain 189 95 -85.50 gain 95 190 -94.28 gain 190 95 -97.24 gain 95 191 -87.46 gain 191 95 -89.13 gain 95 192 -94.71 gain 192 95 -95.07 gain 95 193 -95.96 gain 193 95 -95.30 gain 95 194 -91.04 gain 194 95 -91.17 gain 95 195 -85.43 gain 195 95 -84.10 gain 95 196 -83.20 gain 196 95 -86.19 gain 95 197 -85.07 gain 197 95 -83.19 gain 95 198 -88.64 gain 198 95 -91.27 gain 95 199 -85.01 gain 199 95 -87.75 gain 95 200 -80.28 gain 200 95 -84.35 gain 95 201 -85.88 gain 201 95 -89.86 gain 95 202 -92.32 gain 202 95 -95.44 gain 95 203 -86.22 gain 203 95 -88.45 gain 95 204 -93.74 gain 204 95 -92.61 gain 95 205 -99.93 gain 205 95 -102.54 gain 95 206 -99.13 gain 206 95 -102.85 gain 95 207 -98.43 gain 207 95 -101.57 gain 95 208 -102.54 gain 208 95 -108.29 gain 95 209 -90.89 gain 209 95 -96.21 gain 95 210 -93.97 gain 210 95 -99.46 gain 95 211 -92.63 gain 211 95 -93.35 gain 95 212 -85.26 gain 212 95 -88.99 gain 95 213 -85.05 gain 213 95 -88.11 gain 95 214 -87.82 gain 214 95 -96.27 gain 95 215 -98.34 gain 215 95 -102.19 gain 95 216 -91.25 gain 216 95 -99.01 gain 95 217 -87.59 gain 217 95 -95.62 gain 95 218 -86.70 gain 218 95 -87.53 gain 95 219 -95.78 gain 219 95 -97.09 gain 95 220 -95.81 gain 220 95 -93.21 gain 95 221 -96.17 gain 221 95 -99.24 gain 95 222 -96.71 gain 222 95 -95.59 gain 95 223 -100.56 gain 223 95 -102.69 gain 95 224 -101.61 gain 224 95 -104.20 gain 96 97 -65.78 gain 97 96 -58.61 gain 96 98 -82.33 gain 98 96 -75.62 gain 96 99 -83.57 gain 99 96 -75.99 gain 96 100 -89.76 gain 100 96 -82.11 gain 96 101 -85.70 gain 101 96 -81.67 gain 96 102 -94.69 gain 102 96 -90.63 gain 96 103 -92.84 gain 103 96 -89.95 gain 96 104 -98.26 gain 104 96 -97.86 gain 96 105 -91.53 gain 105 96 -85.64 gain 96 106 -90.81 gain 106 96 -82.25 gain 96 107 -87.28 gain 107 96 -78.63 gain 96 108 -80.01 gain 108 96 -70.98 gain 96 109 -76.54 gain 109 96 -70.96 gain 96 110 -75.51 gain 110 96 -76.29 gain 96 111 -71.80 gain 111 96 -62.55 gain 96 112 -80.06 gain 112 96 -74.27 gain 96 113 -73.90 gain 113 96 -67.24 gain 96 114 -83.24 gain 114 96 -73.75 gain 96 115 -92.02 gain 115 96 -83.19 gain 96 116 -84.72 gain 116 96 -78.31 gain 96 117 -90.34 gain 117 96 -81.08 gain 96 118 -96.65 gain 118 96 -89.00 gain 96 119 -96.90 gain 119 96 -94.32 gain 96 120 -88.83 gain 120 96 -83.63 gain 96 121 -91.28 gain 121 96 -87.10 gain 96 122 -86.32 gain 122 96 -81.90 gain 96 123 -91.13 gain 123 96 -87.04 gain 96 124 -86.10 gain 124 96 -80.00 gain 96 125 -74.52 gain 125 96 -71.76 gain 96 126 -83.02 gain 126 96 -76.91 gain 96 127 -76.41 gain 127 96 -69.93 gain 96 128 -83.02 gain 128 96 -79.13 gain 96 129 -79.56 gain 129 96 -72.88 gain 96 130 -86.21 gain 130 96 -80.82 gain 96 131 -95.88 gain 131 96 -90.26 gain 96 132 -99.10 gain 132 96 -89.49 gain 96 133 -94.91 gain 133 96 -90.48 gain 96 134 -92.05 gain 134 96 -84.49 gain 96 135 -91.88 gain 135 96 -86.62 gain 96 136 -96.18 gain 136 96 -91.36 gain 96 137 -98.15 gain 137 96 -96.25 gain 96 138 -93.85 gain 138 96 -85.47 gain 96 139 -92.14 gain 139 96 -87.03 gain 96 140 -83.98 gain 140 96 -79.69 gain 96 141 -85.21 gain 141 96 -72.90 gain 96 142 -88.05 gain 142 96 -82.48 gain 96 143 -89.09 gain 143 96 -86.26 gain 96 144 -86.14 gain 144 96 -81.67 gain 96 145 -81.40 gain 145 96 -80.32 gain 96 146 -90.30 gain 146 96 -85.21 gain 96 147 -93.46 gain 147 96 -85.48 gain 96 148 -99.20 gain 148 96 -89.54 gain 96 149 -94.10 gain 149 96 -88.10 gain 96 150 -98.82 gain 150 96 -93.65 gain 96 151 -94.49 gain 151 96 -88.27 gain 96 152 -94.25 gain 152 96 -87.85 gain 96 153 -93.77 gain 153 96 -86.58 gain 96 154 -88.59 gain 154 96 -83.31 gain 96 155 -84.93 gain 155 96 -78.22 gain 96 156 -88.61 gain 156 96 -81.13 gain 96 157 -91.20 gain 157 96 -86.20 gain 96 158 -89.78 gain 158 96 -84.28 gain 96 159 -89.65 gain 159 96 -86.53 gain 96 160 -95.08 gain 160 96 -89.11 gain 96 161 -93.54 gain 161 96 -90.01 gain 96 162 -89.60 gain 162 96 -85.79 gain 96 163 -100.25 gain 163 96 -98.35 gain 96 164 -96.71 gain 164 96 -94.17 gain 96 165 -97.36 gain 165 96 -91.88 gain 96 166 -98.77 gain 166 96 -93.05 gain 96 167 -96.98 gain 167 96 -91.98 gain 96 168 -82.41 gain 168 96 -76.31 gain 96 169 -93.68 gain 169 96 -88.69 gain 96 170 -97.73 gain 170 96 -91.97 gain 96 171 -88.01 gain 171 96 -83.33 gain 96 172 -85.47 gain 172 96 -78.98 gain 96 173 -91.15 gain 173 96 -89.31 gain 96 174 -94.42 gain 174 96 -88.63 gain 96 175 -91.33 gain 175 96 -86.68 gain 96 176 -95.97 gain 176 96 -90.28 gain 96 177 -90.63 gain 177 96 -87.95 gain 96 178 -100.02 gain 178 96 -90.78 gain 96 179 -95.71 gain 179 96 -85.89 gain 96 180 -97.60 gain 180 96 -97.23 gain 96 181 -99.43 gain 181 96 -93.08 gain 96 182 -92.60 gain 182 96 -87.33 gain 96 183 -93.87 gain 183 96 -88.88 gain 96 184 -94.64 gain 184 96 -92.40 gain 96 185 -95.88 gain 185 96 -97.50 gain 96 186 -94.77 gain 186 96 -91.97 gain 96 187 -97.45 gain 187 96 -92.38 gain 96 188 -92.49 gain 188 96 -89.83 gain 96 189 -98.58 gain 189 96 -90.64 gain 96 190 -94.00 gain 190 96 -89.98 gain 96 191 -93.56 gain 191 96 -88.26 gain 96 192 -90.64 gain 192 96 -84.02 gain 96 193 -94.22 gain 193 96 -86.59 gain 96 194 -103.86 gain 194 96 -97.02 gain 96 195 -96.16 gain 195 96 -87.86 gain 96 196 -97.60 gain 196 96 -93.61 gain 96 197 -97.14 gain 197 96 -88.28 gain 96 198 -99.60 gain 198 96 -95.26 gain 96 199 -94.92 gain 199 96 -90.69 gain 96 200 -93.57 gain 200 96 -90.68 gain 96 201 -95.17 gain 201 96 -92.19 gain 96 202 -96.47 gain 202 96 -92.62 gain 96 203 -101.33 gain 203 96 -96.59 gain 96 204 -100.16 gain 204 96 -92.06 gain 96 205 -95.93 gain 205 96 -91.58 gain 96 206 -102.96 gain 206 96 -99.71 gain 96 207 -94.91 gain 207 96 -91.08 gain 96 208 -98.13 gain 208 96 -96.90 gain 96 209 -105.99 gain 209 96 -104.33 gain 96 210 -97.72 gain 210 96 -96.24 gain 96 211 -98.98 gain 211 96 -92.73 gain 96 212 -99.46 gain 212 96 -96.22 gain 96 213 -90.40 gain 213 96 -86.49 gain 96 214 -92.35 gain 214 96 -93.83 gain 96 215 -101.91 gain 215 96 -98.79 gain 96 216 -95.15 gain 216 96 -95.94 gain 96 217 -88.35 gain 217 96 -89.40 gain 96 218 -99.50 gain 218 96 -93.36 gain 96 219 -94.94 gain 219 96 -89.28 gain 96 220 -97.47 gain 220 96 -87.90 gain 96 221 -99.14 gain 221 96 -95.24 gain 96 222 -98.73 gain 222 96 -90.64 gain 96 223 -99.38 gain 223 96 -94.53 gain 96 224 -103.20 gain 224 96 -98.83 gain 97 98 -63.61 gain 98 97 -64.08 gain 97 99 -72.11 gain 99 97 -71.71 gain 97 100 -78.73 gain 100 97 -78.26 gain 97 101 -71.62 gain 101 97 -74.77 gain 97 102 -83.07 gain 102 97 -86.19 gain 97 103 -88.31 gain 103 97 -92.60 gain 97 104 -85.87 gain 104 97 -92.64 gain 97 105 -87.75 gain 105 97 -89.05 gain 97 106 -88.26 gain 106 97 -86.88 gain 97 107 -88.34 gain 107 97 -86.87 gain 97 108 -78.04 gain 108 97 -76.19 gain 97 109 -74.97 gain 109 97 -76.56 gain 97 110 -80.12 gain 110 97 -88.08 gain 97 111 -72.40 gain 111 97 -70.32 gain 97 112 -59.23 gain 112 97 -60.62 gain 97 113 -72.08 gain 113 97 -72.59 gain 97 114 -71.00 gain 114 97 -68.68 gain 97 115 -84.73 gain 115 97 -83.07 gain 97 116 -87.44 gain 116 97 -88.21 gain 97 117 -87.96 gain 117 97 -85.87 gain 97 118 -86.97 gain 118 97 -86.51 gain 97 119 -90.14 gain 119 97 -94.74 gain 97 120 -83.26 gain 120 97 -85.24 gain 97 121 -83.94 gain 121 97 -86.95 gain 97 122 -85.82 gain 122 97 -88.58 gain 97 123 -80.56 gain 123 97 -83.65 gain 97 124 -81.31 gain 124 97 -82.39 gain 97 125 -80.75 gain 125 97 -85.17 gain 97 126 -73.67 gain 126 97 -74.73 gain 97 127 -63.51 gain 127 97 -64.20 gain 97 128 -78.72 gain 128 97 -82.01 gain 97 129 -73.41 gain 129 97 -73.91 gain 97 130 -87.33 gain 130 97 -89.12 gain 97 131 -85.41 gain 131 97 -86.97 gain 97 132 -89.65 gain 132 97 -87.22 gain 97 133 -89.87 gain 133 97 -92.62 gain 97 134 -89.92 gain 134 97 -89.53 gain 97 135 -93.47 gain 135 97 -95.38 gain 97 136 -89.71 gain 136 97 -92.07 gain 97 137 -85.05 gain 137 97 -90.31 gain 97 138 -84.66 gain 138 97 -83.46 gain 97 139 -80.84 gain 139 97 -82.90 gain 97 140 -79.21 gain 140 97 -82.11 gain 97 141 -80.10 gain 141 97 -74.96 gain 97 142 -77.45 gain 142 97 -79.05 gain 97 143 -75.79 gain 143 97 -80.14 gain 97 144 -72.95 gain 144 97 -75.66 gain 97 145 -81.86 gain 145 97 -87.95 gain 97 146 -87.30 gain 146 97 -89.39 gain 97 147 -78.37 gain 147 97 -77.57 gain 97 148 -91.69 gain 148 97 -89.21 gain 97 149 -90.70 gain 149 97 -91.88 gain 97 150 -90.93 gain 150 97 -92.95 gain 97 151 -89.79 gain 151 97 -90.75 gain 97 152 -86.43 gain 152 97 -87.21 gain 97 153 -87.09 gain 153 97 -87.08 gain 97 154 -80.84 gain 154 97 -82.73 gain 97 155 -83.38 gain 155 97 -83.85 gain 97 156 -81.73 gain 156 97 -81.42 gain 97 157 -81.07 gain 157 97 -83.25 gain 97 158 -81.40 gain 158 97 -83.08 gain 97 159 -84.47 gain 159 97 -88.53 gain 97 160 -78.71 gain 160 97 -79.92 gain 97 161 -83.48 gain 161 97 -87.13 gain 97 162 -89.04 gain 162 97 -92.40 gain 97 163 -88.66 gain 163 97 -93.93 gain 97 164 -93.87 gain 164 97 -98.52 gain 97 165 -95.13 gain 165 97 -96.83 gain 97 166 -89.44 gain 166 97 -90.90 gain 97 167 -97.81 gain 167 97 -99.99 gain 97 168 -90.75 gain 168 97 -91.83 gain 97 169 -87.26 gain 169 97 -89.44 gain 97 170 -86.52 gain 170 97 -87.94 gain 97 171 -83.85 gain 171 97 -86.35 gain 97 172 -84.15 gain 172 97 -84.83 gain 97 173 -83.98 gain 173 97 -89.32 gain 97 174 -80.10 gain 174 97 -81.49 gain 97 175 -77.61 gain 175 97 -80.13 gain 97 176 -87.56 gain 176 97 -89.05 gain 97 177 -87.23 gain 177 97 -91.72 gain 97 178 -95.97 gain 178 97 -93.90 gain 97 179 -82.25 gain 179 97 -79.60 gain 97 180 -88.72 gain 180 97 -95.52 gain 97 181 -92.43 gain 181 97 -93.25 gain 97 182 -97.41 gain 182 97 -99.32 gain 97 183 -92.03 gain 183 97 -94.22 gain 97 184 -98.33 gain 184 97 -103.26 gain 97 185 -91.63 gain 185 97 -100.43 gain 97 186 -86.20 gain 186 97 -90.58 gain 97 187 -84.29 gain 187 97 -86.40 gain 97 188 -92.90 gain 188 97 -97.42 gain 97 189 -82.25 gain 189 97 -81.50 gain 97 190 -87.37 gain 190 97 -90.53 gain 97 191 -90.35 gain 191 97 -92.22 gain 97 192 -90.95 gain 192 97 -91.52 gain 97 193 -91.43 gain 193 97 -90.98 gain 97 194 -99.74 gain 194 97 -100.07 gain 97 195 -101.10 gain 195 97 -99.98 gain 97 196 -94.49 gain 196 97 -97.68 gain 97 197 -88.83 gain 197 97 -87.15 gain 97 198 -92.00 gain 198 97 -94.84 gain 97 199 -92.89 gain 199 97 -95.84 gain 97 200 -92.95 gain 200 97 -97.23 gain 97 201 -79.74 gain 201 97 -83.93 gain 97 202 -86.59 gain 202 97 -89.92 gain 97 203 -82.48 gain 203 97 -84.92 gain 97 204 -86.25 gain 204 97 -85.33 gain 97 205 -88.54 gain 205 97 -91.36 gain 97 206 -85.58 gain 206 97 -89.51 gain 97 207 -85.75 gain 207 97 -89.09 gain 97 208 -95.97 gain 208 97 -101.92 gain 97 209 -92.44 gain 209 97 -97.97 gain 97 210 -93.76 gain 210 97 -99.46 gain 97 211 -92.07 gain 211 97 -93.00 gain 97 212 -85.70 gain 212 97 -89.64 gain 97 213 -93.07 gain 213 97 -96.33 gain 97 214 -87.52 gain 214 97 -96.18 gain 97 215 -92.16 gain 215 97 -96.22 gain 97 216 -96.91 gain 216 97 -104.87 gain 97 217 -90.72 gain 217 97 -98.95 gain 97 218 -87.71 gain 218 97 -88.74 gain 97 219 -92.42 gain 219 97 -93.93 gain 97 220 -97.68 gain 220 97 -95.29 gain 97 221 -89.28 gain 221 97 -92.57 gain 97 222 -95.20 gain 222 97 -94.29 gain 97 223 -93.08 gain 223 97 -95.41 gain 97 224 -92.24 gain 224 97 -95.04 gain 98 99 -71.66 gain 99 98 -70.80 gain 98 100 -73.08 gain 100 98 -72.13 gain 98 101 -83.21 gain 101 98 -85.89 gain 98 102 -79.90 gain 102 98 -82.55 gain 98 103 -87.46 gain 103 98 -91.28 gain 98 104 -88.23 gain 104 98 -94.54 gain 98 105 -91.69 gain 105 98 -92.51 gain 98 106 -89.89 gain 106 98 -88.04 gain 98 107 -88.50 gain 107 98 -86.56 gain 98 108 -92.53 gain 108 98 -90.21 gain 98 109 -84.09 gain 109 98 -85.21 gain 98 110 -82.24 gain 110 98 -89.73 gain 98 111 -70.91 gain 111 98 -68.37 gain 98 112 -66.48 gain 112 98 -67.40 gain 98 113 -53.23 gain 113 98 -53.28 gain 98 114 -69.04 gain 114 98 -66.26 gain 98 115 -69.47 gain 115 98 -67.35 gain 98 116 -74.60 gain 116 98 -74.90 gain 98 117 -77.33 gain 117 98 -74.78 gain 98 118 -89.55 gain 118 98 -88.62 gain 98 119 -89.79 gain 119 98 -93.92 gain 98 120 -92.18 gain 120 98 -93.69 gain 98 121 -88.79 gain 121 98 -91.32 gain 98 122 -89.30 gain 122 98 -91.59 gain 98 123 -86.90 gain 123 98 -89.52 gain 98 124 -87.67 gain 124 98 -88.28 gain 98 125 -86.69 gain 125 98 -90.64 gain 98 126 -70.97 gain 126 98 -71.57 gain 98 127 -68.01 gain 127 98 -68.24 gain 98 128 -67.98 gain 128 98 -70.80 gain 98 129 -71.09 gain 129 98 -71.12 gain 98 130 -70.69 gain 130 98 -72.01 gain 98 131 -78.07 gain 131 98 -79.17 gain 98 132 -76.27 gain 132 98 -73.37 gain 98 133 -94.04 gain 133 98 -96.32 gain 98 134 -87.33 gain 134 98 -86.47 gain 98 135 -86.48 gain 135 98 -87.93 gain 98 136 -89.72 gain 136 98 -91.61 gain 98 137 -92.28 gain 137 98 -97.08 gain 98 138 -90.59 gain 138 98 -88.92 gain 98 139 -87.59 gain 139 98 -89.18 gain 98 140 -81.88 gain 140 98 -84.31 gain 98 141 -79.23 gain 141 98 -73.62 gain 98 142 -71.88 gain 142 98 -73.01 gain 98 143 -75.46 gain 143 98 -79.34 gain 98 144 -81.62 gain 144 98 -83.86 gain 98 145 -82.30 gain 145 98 -87.92 gain 98 146 -79.42 gain 146 98 -81.04 gain 98 147 -73.55 gain 147 98 -72.28 gain 98 148 -79.20 gain 148 98 -76.25 gain 98 149 -91.30 gain 149 98 -92.01 gain 98 150 -98.03 gain 150 98 -99.58 gain 98 151 -85.90 gain 151 98 -86.39 gain 98 152 -88.38 gain 152 98 -88.68 gain 98 153 -87.20 gain 153 98 -86.72 gain 98 154 -83.98 gain 154 98 -85.40 gain 98 155 -83.59 gain 155 98 -83.58 gain 98 156 -78.68 gain 156 98 -77.90 gain 98 157 -80.57 gain 157 98 -82.27 gain 98 158 -83.72 gain 158 98 -84.93 gain 98 159 -81.10 gain 159 98 -84.69 gain 98 160 -82.38 gain 160 98 -83.12 gain 98 161 -88.48 gain 161 98 -91.66 gain 98 162 -86.03 gain 162 98 -88.93 gain 98 163 -91.27 gain 163 98 -96.08 gain 98 164 -81.75 gain 164 98 -85.93 gain 98 165 -99.30 gain 165 98 -100.53 gain 98 166 -89.59 gain 166 98 -90.57 gain 98 167 -95.45 gain 167 98 -97.16 gain 98 168 -91.03 gain 168 98 -91.64 gain 98 169 -86.78 gain 169 98 -88.50 gain 98 170 -89.73 gain 170 98 -90.68 gain 98 171 -87.83 gain 171 98 -89.86 gain 98 172 -87.78 gain 172 98 -88.00 gain 98 173 -86.90 gain 173 98 -91.76 gain 98 174 -80.97 gain 174 98 -81.89 gain 98 175 -80.00 gain 175 98 -82.05 gain 98 176 -87.33 gain 176 98 -88.35 gain 98 177 -94.79 gain 177 98 -98.81 gain 98 178 -92.72 gain 178 98 -90.18 gain 98 179 -87.77 gain 179 98 -84.66 gain 98 180 -90.73 gain 180 98 -97.06 gain 98 181 -90.28 gain 181 98 -90.63 gain 98 182 -101.75 gain 182 98 -103.19 gain 98 183 -84.35 gain 183 98 -86.07 gain 98 184 -90.07 gain 184 98 -94.53 gain 98 185 -88.58 gain 185 98 -96.91 gain 98 186 -90.78 gain 186 98 -94.69 gain 98 187 -82.59 gain 187 98 -84.23 gain 98 188 -84.96 gain 188 98 -89.01 gain 98 189 -87.14 gain 189 98 -85.92 gain 98 190 -85.38 gain 190 98 -88.07 gain 98 191 -86.17 gain 191 98 -87.57 gain 98 192 -85.58 gain 192 98 -85.67 gain 98 193 -96.04 gain 193 98 -95.13 gain 98 194 -89.47 gain 194 98 -89.33 gain 98 195 -93.48 gain 195 98 -91.89 gain 98 196 -93.69 gain 196 98 -96.41 gain 98 197 -95.61 gain 197 98 -93.46 gain 98 198 -88.39 gain 198 98 -90.76 gain 98 199 -95.88 gain 199 98 -98.36 gain 98 200 -94.74 gain 200 98 -98.55 gain 98 201 -84.82 gain 201 98 -88.54 gain 98 202 -79.50 gain 202 98 -82.36 gain 98 203 -88.22 gain 203 98 -90.19 gain 98 204 -86.68 gain 204 98 -85.29 gain 98 205 -92.53 gain 205 98 -94.88 gain 98 206 -83.97 gain 206 98 -87.43 gain 98 207 -91.03 gain 207 98 -93.91 gain 98 208 -100.26 gain 208 98 -105.74 gain 98 209 -97.84 gain 209 98 -102.89 gain 98 210 -98.70 gain 210 98 -103.93 gain 98 211 -91.71 gain 211 98 -92.17 gain 98 212 -93.48 gain 212 98 -96.96 gain 98 213 -91.30 gain 213 98 -94.10 gain 98 214 -90.84 gain 214 98 -99.03 gain 98 215 -83.83 gain 215 98 -87.42 gain 98 216 -93.86 gain 216 98 -101.36 gain 98 217 -93.68 gain 217 98 -101.44 gain 98 218 -98.76 gain 218 98 -99.33 gain 98 219 -90.63 gain 219 98 -91.68 gain 98 220 -87.77 gain 220 98 -84.91 gain 98 221 -99.31 gain 221 98 -102.13 gain 98 222 -96.23 gain 222 98 -94.85 gain 98 223 -87.00 gain 223 98 -88.86 gain 98 224 -104.13 gain 224 98 -106.45 gain 99 100 -63.59 gain 100 99 -63.50 gain 99 101 -73.65 gain 101 99 -77.20 gain 99 102 -80.14 gain 102 99 -83.65 gain 99 103 -85.27 gain 103 99 -89.95 gain 99 104 -84.71 gain 104 99 -91.88 gain 99 105 -95.40 gain 105 99 -97.09 gain 99 106 -93.04 gain 106 99 -92.06 gain 99 107 -80.89 gain 107 99 -79.81 gain 99 108 -89.44 gain 108 99 -87.98 gain 99 109 -83.88 gain 109 99 -85.87 gain 99 110 -76.15 gain 110 99 -84.50 gain 99 111 -75.12 gain 111 99 -73.44 gain 99 112 -74.08 gain 112 99 -75.87 gain 99 113 -66.42 gain 113 99 -67.33 gain 99 114 -65.68 gain 114 99 -63.76 gain 99 115 -68.64 gain 115 99 -67.37 gain 99 116 -72.56 gain 116 99 -73.73 gain 99 117 -77.16 gain 117 99 -75.47 gain 99 118 -90.11 gain 118 99 -90.04 gain 99 119 -91.41 gain 119 99 -96.40 gain 99 120 -100.90 gain 120 99 -103.28 gain 99 121 -93.17 gain 121 99 -96.57 gain 99 122 -92.28 gain 122 99 -95.42 gain 99 123 -91.09 gain 123 99 -94.58 gain 99 124 -91.65 gain 124 99 -93.12 gain 99 125 -86.40 gain 125 99 -91.21 gain 99 126 -78.55 gain 126 99 -80.01 gain 99 127 -74.36 gain 127 99 -75.45 gain 99 128 -75.89 gain 128 99 -79.58 gain 99 129 -64.27 gain 129 99 -65.17 gain 99 130 -77.04 gain 130 99 -79.23 gain 99 131 -76.98 gain 131 99 -78.94 gain 99 132 -78.53 gain 132 99 -76.49 gain 99 133 -79.15 gain 133 99 -82.29 gain 99 134 -91.76 gain 134 99 -91.76 gain 99 135 -87.80 gain 135 99 -90.11 gain 99 136 -96.53 gain 136 99 -99.28 gain 99 137 -89.29 gain 137 99 -94.95 gain 99 138 -84.95 gain 138 99 -84.15 gain 99 139 -83.91 gain 139 99 -86.37 gain 99 140 -88.61 gain 140 99 -91.90 gain 99 141 -82.12 gain 141 99 -77.37 gain 99 142 -82.52 gain 142 99 -84.52 gain 99 143 -78.56 gain 143 99 -83.29 gain 99 144 -78.32 gain 144 99 -81.42 gain 99 145 -75.28 gain 145 99 -81.77 gain 99 146 -84.94 gain 146 99 -87.42 gain 99 147 -86.63 gain 147 99 -86.22 gain 99 148 -88.59 gain 148 99 -86.50 gain 99 149 -85.72 gain 149 99 -87.29 gain 99 150 -88.86 gain 150 99 -91.27 gain 99 151 -87.56 gain 151 99 -88.91 gain 99 152 -82.87 gain 152 99 -84.04 gain 99 153 -88.33 gain 153 99 -88.71 gain 99 154 -87.38 gain 154 99 -89.66 gain 99 155 -91.58 gain 155 99 -92.44 gain 99 156 -88.00 gain 156 99 -88.08 gain 99 157 -76.13 gain 157 99 -78.70 gain 99 158 -75.21 gain 158 99 -77.28 gain 99 159 -83.81 gain 159 99 -88.27 gain 99 160 -82.08 gain 160 99 -83.69 gain 99 161 -84.83 gain 161 99 -88.88 gain 99 162 -80.29 gain 162 99 -84.05 gain 99 163 -83.85 gain 163 99 -89.52 gain 99 164 -82.59 gain 164 99 -87.63 gain 99 165 -90.52 gain 165 99 -92.62 gain 99 166 -89.46 gain 166 99 -91.31 gain 99 167 -87.17 gain 167 99 -89.75 gain 99 168 -82.25 gain 168 99 -83.72 gain 99 169 -93.32 gain 169 99 -95.90 gain 99 170 -77.56 gain 170 99 -79.38 gain 99 171 -91.77 gain 171 99 -94.66 gain 99 172 -85.93 gain 172 99 -87.01 gain 99 173 -77.65 gain 173 99 -83.38 gain 99 174 -78.94 gain 174 99 -80.72 gain 99 175 -84.76 gain 175 99 -87.68 gain 99 176 -78.26 gain 176 99 -80.14 gain 99 177 -89.50 gain 177 99 -94.39 gain 99 178 -81.98 gain 178 99 -80.31 gain 99 179 -83.39 gain 179 99 -81.14 gain 99 180 -96.76 gain 180 99 -103.96 gain 99 181 -96.40 gain 181 99 -97.62 gain 99 182 -91.93 gain 182 99 -94.23 gain 99 183 -90.58 gain 183 99 -93.16 gain 99 184 -87.16 gain 184 99 -92.49 gain 99 185 -85.15 gain 185 99 -94.34 gain 99 186 -86.07 gain 186 99 -90.85 gain 99 187 -87.47 gain 187 99 -89.97 gain 99 188 -93.21 gain 188 99 -98.13 gain 99 189 -86.89 gain 189 99 -86.53 gain 99 190 -78.43 gain 190 99 -81.99 gain 99 191 -84.92 gain 191 99 -87.18 gain 99 192 -85.57 gain 192 99 -86.53 gain 99 193 -90.80 gain 193 99 -90.74 gain 99 194 -93.10 gain 194 99 -93.82 gain 99 195 -101.02 gain 195 99 -100.29 gain 99 196 -95.50 gain 196 99 -99.09 gain 99 197 -94.20 gain 197 99 -92.92 gain 99 198 -97.13 gain 198 99 -100.36 gain 99 199 -90.70 gain 199 99 -94.04 gain 99 200 -93.49 gain 200 99 -98.17 gain 99 201 -87.71 gain 201 99 -92.29 gain 99 202 -88.16 gain 202 99 -91.88 gain 99 203 -81.82 gain 203 99 -84.65 gain 99 204 -88.94 gain 204 99 -88.42 gain 99 205 -91.41 gain 205 99 -94.62 gain 99 206 -80.66 gain 206 99 -84.98 gain 99 207 -84.55 gain 207 99 -88.30 gain 99 208 -90.41 gain 208 99 -96.75 gain 99 209 -88.54 gain 209 99 -94.46 gain 99 210 -85.97 gain 210 99 -92.06 gain 99 211 -97.52 gain 211 99 -98.84 gain 99 212 -93.60 gain 212 99 -97.93 gain 99 213 -96.21 gain 213 99 -99.88 gain 99 214 -91.96 gain 214 99 -101.01 gain 99 215 -92.25 gain 215 99 -96.70 gain 99 216 -96.79 gain 216 99 -105.15 gain 99 217 -93.32 gain 217 99 -101.94 gain 99 218 -89.93 gain 218 99 -91.36 gain 99 219 -88.21 gain 219 99 -90.12 gain 99 220 -91.11 gain 220 99 -89.11 gain 99 221 -94.17 gain 221 99 -97.85 gain 99 222 -81.81 gain 222 99 -81.30 gain 99 223 -90.73 gain 223 99 -93.45 gain 99 224 -98.86 gain 224 99 -102.05 gain 100 101 -68.45 gain 101 100 -72.08 gain 100 102 -70.73 gain 102 100 -74.32 gain 100 103 -75.10 gain 103 100 -79.87 gain 100 104 -82.02 gain 104 100 -89.27 gain 100 105 -96.77 gain 105 100 -98.54 gain 100 106 -87.02 gain 106 100 -86.12 gain 100 107 -84.85 gain 107 100 -83.86 gain 100 108 -93.06 gain 108 100 -91.68 gain 100 109 -76.64 gain 109 100 -78.71 gain 100 110 -85.12 gain 110 100 -93.56 gain 100 111 -88.45 gain 111 100 -86.85 gain 100 112 -73.23 gain 112 100 -75.10 gain 100 113 -66.28 gain 113 100 -67.28 gain 100 114 -65.66 gain 114 100 -63.82 gain 100 115 -62.89 gain 115 100 -61.71 gain 100 116 -64.70 gain 116 100 -65.95 gain 100 117 -61.33 gain 117 100 -59.72 gain 100 118 -78.87 gain 118 100 -78.89 gain 100 119 -76.94 gain 119 100 -82.01 gain 100 120 -92.92 gain 120 100 -95.37 gain 100 121 -89.03 gain 121 100 -92.51 gain 100 122 -103.06 gain 122 100 -106.29 gain 100 123 -88.63 gain 123 100 -92.20 gain 100 124 -94.70 gain 124 100 -96.26 gain 100 125 -90.78 gain 125 100 -95.68 gain 100 126 -82.29 gain 126 100 -83.84 gain 100 127 -77.52 gain 127 100 -78.69 gain 100 128 -75.62 gain 128 100 -79.38 gain 100 129 -72.04 gain 129 100 -73.01 gain 100 130 -71.91 gain 130 100 -74.18 gain 100 131 -71.17 gain 131 100 -73.21 gain 100 132 -73.22 gain 132 100 -71.27 gain 100 133 -84.52 gain 133 100 -87.74 gain 100 134 -84.50 gain 134 100 -84.59 gain 100 135 -94.70 gain 135 100 -97.09 gain 100 136 -93.85 gain 136 100 -96.68 gain 100 137 -91.75 gain 137 100 -97.50 gain 100 138 -90.61 gain 138 100 -89.88 gain 100 139 -82.61 gain 139 100 -85.15 gain 100 140 -85.42 gain 140 100 -88.79 gain 100 141 -80.76 gain 141 100 -76.10 gain 100 142 -84.60 gain 142 100 -86.68 gain 100 143 -79.87 gain 143 100 -84.69 gain 100 144 -83.24 gain 144 100 -86.43 gain 100 145 -69.38 gain 145 100 -75.96 gain 100 146 -76.31 gain 146 100 -78.87 gain 100 147 -76.44 gain 147 100 -76.11 gain 100 148 -74.56 gain 148 100 -72.56 gain 100 149 -86.55 gain 149 100 -88.21 gain 100 150 -97.09 gain 150 100 -99.59 gain 100 151 -89.07 gain 151 100 -90.50 gain 100 152 -88.88 gain 152 100 -90.13 gain 100 153 -94.12 gain 153 100 -94.58 gain 100 154 -92.30 gain 154 100 -94.67 gain 100 155 -89.36 gain 155 100 -90.30 gain 100 156 -79.41 gain 156 100 -79.58 gain 100 157 -79.18 gain 157 100 -81.84 gain 100 158 -89.39 gain 158 100 -91.55 gain 100 159 -83.06 gain 159 100 -87.60 gain 100 160 -83.40 gain 160 100 -85.09 gain 100 161 -70.57 gain 161 100 -74.70 gain 100 162 -81.51 gain 162 100 -85.35 gain 100 163 -84.62 gain 163 100 -90.37 gain 100 164 -91.24 gain 164 100 -96.36 gain 100 165 -87.91 gain 165 100 -90.09 gain 100 166 -93.23 gain 166 100 -95.16 gain 100 167 -93.56 gain 167 100 -96.22 gain 100 168 -98.78 gain 168 100 -100.33 gain 100 169 -89.17 gain 169 100 -91.83 gain 100 170 -85.66 gain 170 100 -87.56 gain 100 171 -83.86 gain 171 100 -86.84 gain 100 172 -83.81 gain 172 100 -84.98 gain 100 173 -77.54 gain 173 100 -83.35 gain 100 174 -82.92 gain 174 100 -84.78 gain 100 175 -86.35 gain 175 100 -89.35 gain 100 176 -78.26 gain 176 100 -80.23 gain 100 177 -82.97 gain 177 100 -87.94 gain 100 178 -87.22 gain 178 100 -85.63 gain 100 179 -89.66 gain 179 100 -87.49 gain 100 180 -94.37 gain 180 100 -101.66 gain 100 181 -91.77 gain 181 100 -93.07 gain 100 182 -93.79 gain 182 100 -96.18 gain 100 183 -91.90 gain 183 100 -94.57 gain 100 184 -87.22 gain 184 100 -92.63 gain 100 185 -88.99 gain 185 100 -98.26 gain 100 186 -89.57 gain 186 100 -94.42 gain 100 187 -80.89 gain 187 100 -83.48 gain 100 188 -88.89 gain 188 100 -93.89 gain 100 189 -84.40 gain 189 100 -84.13 gain 100 190 -77.39 gain 190 100 -81.03 gain 100 191 -83.50 gain 191 100 -85.85 gain 100 192 -85.48 gain 192 100 -86.52 gain 100 193 -89.64 gain 193 100 -89.67 gain 100 194 -89.84 gain 194 100 -90.65 gain 100 195 -96.18 gain 195 100 -95.54 gain 100 196 -86.19 gain 196 100 -89.86 gain 100 197 -91.12 gain 197 100 -89.92 gain 100 198 -103.70 gain 198 100 -107.01 gain 100 199 -89.01 gain 199 100 -92.43 gain 100 200 -90.84 gain 200 100 -95.60 gain 100 201 -94.15 gain 201 100 -98.81 gain 100 202 -94.23 gain 202 100 -98.04 gain 100 203 -88.88 gain 203 100 -91.79 gain 100 204 -94.87 gain 204 100 -94.43 gain 100 205 -88.07 gain 205 100 -91.37 gain 100 206 -96.57 gain 206 100 -100.98 gain 100 207 -92.76 gain 207 100 -96.59 gain 100 208 -89.53 gain 208 100 -95.95 gain 100 209 -94.18 gain 209 100 -100.18 gain 100 210 -90.98 gain 210 100 -97.16 gain 100 211 -100.27 gain 211 100 -101.68 gain 100 212 -89.38 gain 212 100 -93.79 gain 100 213 -101.58 gain 213 100 -105.33 gain 100 214 -95.54 gain 214 100 -104.67 gain 100 215 -87.40 gain 215 100 -91.93 gain 100 216 -84.53 gain 216 100 -92.98 gain 100 217 -85.83 gain 217 100 -94.54 gain 100 218 -91.81 gain 218 100 -93.32 gain 100 219 -90.76 gain 219 100 -92.75 gain 100 220 -85.59 gain 220 100 -83.68 gain 100 221 -92.37 gain 221 100 -96.13 gain 100 222 -87.25 gain 222 100 -86.82 gain 100 223 -92.69 gain 223 100 -95.50 gain 100 224 -86.32 gain 224 100 -89.60 gain 101 102 -69.39 gain 102 101 -69.35 gain 101 103 -81.29 gain 103 101 -82.43 gain 101 104 -87.89 gain 104 101 -91.51 gain 101 105 -92.04 gain 105 101 -90.18 gain 101 106 -96.49 gain 106 101 -91.96 gain 101 107 -90.89 gain 107 101 -86.26 gain 101 108 -94.85 gain 108 101 -89.85 gain 101 109 -91.46 gain 109 101 -89.91 gain 101 110 -93.39 gain 110 101 -98.19 gain 101 111 -88.88 gain 111 101 -83.65 gain 101 112 -84.40 gain 112 101 -82.63 gain 101 113 -77.54 gain 113 101 -74.91 gain 101 114 -77.50 gain 114 101 -72.03 gain 101 115 -77.32 gain 115 101 -72.51 gain 101 116 -68.26 gain 116 101 -65.87 gain 101 117 -70.52 gain 117 101 -65.28 gain 101 118 -73.61 gain 118 101 -70.00 gain 101 119 -81.24 gain 119 101 -82.68 gain 101 120 -96.21 gain 120 101 -95.04 gain 101 121 -99.41 gain 121 101 -99.26 gain 101 122 -99.54 gain 122 101 -99.14 gain 101 123 -98.13 gain 123 101 -98.07 gain 101 124 -88.43 gain 124 101 -86.36 gain 101 125 -90.07 gain 125 101 -91.34 gain 101 126 -91.19 gain 126 101 -89.11 gain 101 127 -81.98 gain 127 101 -79.52 gain 101 128 -84.04 gain 128 101 -84.18 gain 101 129 -82.49 gain 129 101 -79.84 gain 101 130 -77.85 gain 130 101 -76.48 gain 101 131 -74.44 gain 131 101 -72.85 gain 101 132 -75.53 gain 132 101 -69.95 gain 101 133 -79.92 gain 133 101 -79.51 gain 101 134 -78.31 gain 134 101 -74.77 gain 101 135 -100.95 gain 135 101 -99.71 gain 101 136 -91.58 gain 136 101 -90.79 gain 101 137 -95.51 gain 137 101 -97.62 gain 101 138 -92.31 gain 138 101 -87.95 gain 101 139 -88.77 gain 139 101 -87.68 gain 101 140 -84.82 gain 140 101 -84.56 gain 101 141 -96.77 gain 141 101 -88.48 gain 101 142 -94.42 gain 142 101 -92.88 gain 101 143 -78.12 gain 143 101 -79.31 gain 101 144 -70.26 gain 144 101 -69.82 gain 101 145 -80.36 gain 145 101 -83.30 gain 101 146 -78.20 gain 146 101 -77.14 gain 101 147 -87.45 gain 147 101 -83.49 gain 101 148 -84.27 gain 148 101 -78.64 gain 101 149 -83.01 gain 149 101 -81.04 gain 101 150 -99.27 gain 150 101 -98.14 gain 101 151 -97.85 gain 151 101 -95.65 gain 101 152 -96.21 gain 152 101 -93.83 gain 101 153 -86.06 gain 153 101 -82.89 gain 101 154 -93.40 gain 154 101 -92.13 gain 101 155 -82.47 gain 155 101 -79.77 gain 101 156 -85.95 gain 156 101 -82.49 gain 101 157 -84.77 gain 157 101 -83.79 gain 101 158 -90.90 gain 158 101 -89.42 gain 101 159 -86.62 gain 159 101 -87.52 gain 101 160 -82.72 gain 160 101 -80.78 gain 101 161 -87.22 gain 161 101 -87.72 gain 101 162 -88.51 gain 162 101 -88.72 gain 101 163 -85.09 gain 163 101 -87.21 gain 101 164 -81.03 gain 164 101 -82.52 gain 101 165 -100.40 gain 165 101 -98.95 gain 101 166 -93.66 gain 166 101 -91.96 gain 101 167 -96.82 gain 167 101 -95.85 gain 101 168 -88.80 gain 168 101 -86.72 gain 101 169 -93.38 gain 169 101 -92.42 gain 101 170 -97.56 gain 170 101 -95.83 gain 101 171 -95.04 gain 171 101 -94.38 gain 101 172 -92.34 gain 172 101 -89.87 gain 101 173 -92.30 gain 173 101 -94.48 gain 101 174 -89.93 gain 174 101 -88.16 gain 101 175 -78.10 gain 175 101 -77.46 gain 101 176 -86.15 gain 176 101 -84.48 gain 101 177 -87.78 gain 177 101 -89.12 gain 101 178 -90.04 gain 178 101 -84.82 gain 101 179 -92.41 gain 179 101 -86.61 gain 101 180 -99.10 gain 180 101 -102.75 gain 101 181 -94.44 gain 181 101 -92.11 gain 101 182 -94.12 gain 182 101 -92.87 gain 101 183 -99.96 gain 183 101 -98.99 gain 101 184 -94.80 gain 184 101 -96.58 gain 101 185 -98.71 gain 185 101 -104.36 gain 101 186 -97.76 gain 186 101 -98.98 gain 101 187 -89.32 gain 187 101 -88.27 gain 101 188 -88.50 gain 188 101 -89.87 gain 101 189 -89.65 gain 189 101 -85.74 gain 101 190 -91.18 gain 190 101 -91.19 gain 101 191 -89.17 gain 191 101 -87.88 gain 101 192 -93.75 gain 192 101 -91.16 gain 101 193 -89.91 gain 193 101 -86.30 gain 101 194 -95.30 gain 194 101 -92.48 gain 101 195 -101.60 gain 195 101 -97.33 gain 101 196 -103.98 gain 196 101 -104.02 gain 101 197 -90.13 gain 197 101 -85.30 gain 101 198 -98.60 gain 198 101 -98.28 gain 101 199 -92.52 gain 199 101 -92.31 gain 101 200 -97.67 gain 200 101 -98.79 gain 101 201 -95.29 gain 201 101 -96.32 gain 101 202 -95.33 gain 202 101 -95.50 gain 101 203 -85.14 gain 203 101 -84.42 gain 101 204 -85.44 gain 204 101 -81.36 gain 101 205 -91.24 gain 205 101 -90.90 gain 101 206 -91.24 gain 206 101 -92.01 gain 101 207 -91.96 gain 207 101 -92.16 gain 101 208 -98.53 gain 208 101 -101.32 gain 101 209 -92.06 gain 209 101 -94.43 gain 101 210 -105.29 gain 210 101 -107.83 gain 101 211 -98.89 gain 211 101 -96.66 gain 101 212 -95.54 gain 212 101 -96.33 gain 101 213 -96.57 gain 213 101 -96.69 gain 101 214 -102.35 gain 214 101 -107.86 gain 101 215 -101.28 gain 215 101 -102.18 gain 101 216 -93.26 gain 216 101 -98.07 gain 101 217 -99.02 gain 217 101 -104.10 gain 101 218 -96.91 gain 218 101 -94.79 gain 101 219 -98.21 gain 219 101 -96.57 gain 101 220 -93.24 gain 220 101 -87.69 gain 101 221 -99.09 gain 221 101 -99.21 gain 101 222 -91.60 gain 222 101 -87.53 gain 101 223 -93.22 gain 223 101 -92.40 gain 101 224 -96.25 gain 224 101 -95.90 gain 102 103 -60.98 gain 103 102 -62.15 gain 102 104 -69.12 gain 104 102 -72.78 gain 102 105 -98.35 gain 105 102 -96.53 gain 102 106 -91.23 gain 106 102 -86.73 gain 102 107 -93.00 gain 107 102 -88.40 gain 102 108 -84.29 gain 108 102 -79.32 gain 102 109 -92.89 gain 109 102 -91.37 gain 102 110 -99.13 gain 110 102 -103.97 gain 102 111 -97.13 gain 111 102 -91.93 gain 102 112 -88.02 gain 112 102 -86.29 gain 102 113 -85.42 gain 113 102 -82.82 gain 102 114 -90.19 gain 114 102 -84.75 gain 102 115 -81.33 gain 115 102 -76.55 gain 102 116 -64.26 gain 116 102 -61.92 gain 102 117 -68.71 gain 117 102 -63.50 gain 102 118 -71.85 gain 118 102 -68.27 gain 102 119 -79.31 gain 119 102 -80.79 gain 102 120 -99.48 gain 120 102 -98.34 gain 102 121 -100.06 gain 121 102 -99.94 gain 102 122 -96.71 gain 122 102 -96.34 gain 102 123 -92.70 gain 123 102 -92.68 gain 102 124 -98.20 gain 124 102 -96.16 gain 102 125 -95.15 gain 125 102 -96.45 gain 102 126 -85.52 gain 126 102 -83.47 gain 102 127 -88.50 gain 127 102 -86.08 gain 102 128 -87.95 gain 128 102 -88.12 gain 102 129 -86.62 gain 129 102 -84.00 gain 102 130 -83.06 gain 130 102 -81.74 gain 102 131 -73.19 gain 131 102 -71.64 gain 102 132 -74.98 gain 132 102 -69.44 gain 102 133 -77.66 gain 133 102 -77.29 gain 102 134 -82.05 gain 134 102 -78.54 gain 102 135 -97.69 gain 135 102 -96.49 gain 102 136 -96.78 gain 136 102 -96.01 gain 102 137 -92.69 gain 137 102 -94.84 gain 102 138 -94.54 gain 138 102 -90.22 gain 102 139 -90.07 gain 139 102 -89.01 gain 102 140 -91.97 gain 140 102 -91.74 gain 102 141 -95.57 gain 141 102 -87.32 gain 102 142 -90.41 gain 142 102 -88.89 gain 102 143 -82.68 gain 143 102 -83.91 gain 102 144 -85.71 gain 144 102 -85.30 gain 102 145 -80.59 gain 145 102 -83.57 gain 102 146 -82.05 gain 146 102 -81.01 gain 102 147 -78.23 gain 147 102 -74.31 gain 102 148 -83.06 gain 148 102 -77.47 gain 102 149 -88.65 gain 149 102 -86.71 gain 102 150 -102.32 gain 150 102 -101.22 gain 102 151 -102.67 gain 151 102 -100.51 gain 102 152 -94.10 gain 152 102 -91.76 gain 102 153 -93.04 gain 153 102 -89.91 gain 102 154 -95.67 gain 154 102 -94.44 gain 102 155 -93.19 gain 155 102 -90.53 gain 102 156 -96.88 gain 156 102 -93.45 gain 102 157 -92.96 gain 157 102 -92.02 gain 102 158 -88.50 gain 158 102 -87.05 gain 102 159 -87.71 gain 159 102 -88.65 gain 102 160 -80.77 gain 160 102 -78.86 gain 102 161 -91.16 gain 161 102 -91.70 gain 102 162 -77.80 gain 162 102 -78.04 gain 102 163 -86.40 gain 163 102 -88.56 gain 102 164 -73.80 gain 164 102 -75.33 gain 102 165 -95.64 gain 165 102 -94.23 gain 102 166 -99.00 gain 166 102 -97.34 gain 102 167 -93.71 gain 167 102 -92.77 gain 102 168 -104.04 gain 168 102 -101.99 gain 102 169 -92.52 gain 169 102 -91.59 gain 102 170 -93.87 gain 170 102 -92.17 gain 102 171 -90.19 gain 171 102 -89.58 gain 102 172 -90.88 gain 172 102 -88.46 gain 102 173 -104.04 gain 173 102 -106.26 gain 102 174 -89.99 gain 174 102 -88.26 gain 102 175 -93.24 gain 175 102 -92.64 gain 102 176 -84.34 gain 176 102 -82.71 gain 102 177 -86.83 gain 177 102 -88.20 gain 102 178 -88.20 gain 178 102 -83.01 gain 102 179 -82.97 gain 179 102 -77.21 gain 102 180 -99.57 gain 180 102 -103.25 gain 102 181 -98.46 gain 181 102 -96.17 gain 102 182 -94.24 gain 182 102 -93.03 gain 102 183 -100.33 gain 183 102 -99.40 gain 102 184 -101.77 gain 184 102 -103.59 gain 102 185 -99.73 gain 185 102 -105.41 gain 102 186 -92.68 gain 186 102 -93.94 gain 102 187 -98.49 gain 187 102 -97.48 gain 102 188 -91.65 gain 188 102 -93.06 gain 102 189 -92.23 gain 189 102 -88.36 gain 102 190 -87.87 gain 190 102 -87.91 gain 102 191 -97.40 gain 191 102 -96.15 gain 102 192 -89.85 gain 192 102 -87.30 gain 102 193 -89.98 gain 193 102 -86.41 gain 102 194 -86.16 gain 194 102 -83.37 gain 102 195 -107.95 gain 195 102 -103.71 gain 102 196 -102.35 gain 196 102 -102.42 gain 102 197 -98.64 gain 197 102 -93.85 gain 102 198 -94.83 gain 198 102 -94.55 gain 102 199 -103.28 gain 199 102 -103.10 gain 102 200 -98.16 gain 200 102 -99.32 gain 102 201 -87.50 gain 201 102 -88.57 gain 102 202 -87.59 gain 202 102 -87.80 gain 102 203 -87.42 gain 203 102 -86.74 gain 102 204 -90.80 gain 204 102 -86.76 gain 102 205 -88.73 gain 205 102 -88.43 gain 102 206 -92.24 gain 206 102 -93.05 gain 102 207 -86.78 gain 207 102 -87.01 gain 102 208 -93.31 gain 208 102 -96.14 gain 102 209 -91.11 gain 209 102 -93.51 gain 102 210 -95.85 gain 210 102 -98.43 gain 102 211 -108.89 gain 211 102 -106.70 gain 102 212 -101.27 gain 212 102 -102.09 gain 102 213 -104.51 gain 213 102 -104.66 gain 102 214 -101.47 gain 214 102 -107.01 gain 102 215 -93.69 gain 215 102 -94.63 gain 102 216 -89.52 gain 216 102 -94.37 gain 102 217 -96.59 gain 217 102 -101.70 gain 102 218 -96.16 gain 218 102 -94.07 gain 102 219 -98.75 gain 219 102 -97.15 gain 102 220 -93.51 gain 220 102 -88.00 gain 102 221 -92.36 gain 221 102 -92.52 gain 102 222 -90.02 gain 222 102 -85.99 gain 102 223 -96.64 gain 223 102 -95.86 gain 102 224 -93.55 gain 224 102 -93.23 gain 103 104 -65.34 gain 104 103 -67.82 gain 103 105 -101.26 gain 105 103 -98.27 gain 103 106 -101.68 gain 106 103 -96.01 gain 103 107 -98.14 gain 107 103 -92.38 gain 103 108 -97.63 gain 108 103 -91.49 gain 103 109 -98.33 gain 109 103 -95.64 gain 103 110 -94.94 gain 110 103 -98.61 gain 103 111 -92.79 gain 111 103 -86.42 gain 103 112 -90.12 gain 112 103 -87.22 gain 103 113 -86.02 gain 113 103 -82.25 gain 103 114 -84.99 gain 114 103 -78.39 gain 103 115 -82.58 gain 115 103 -76.64 gain 103 116 -72.69 gain 116 103 -69.18 gain 103 117 -68.65 gain 117 103 -62.28 gain 103 118 -62.66 gain 118 103 -57.91 gain 103 119 -72.74 gain 119 103 -73.05 gain 103 120 -101.57 gain 120 103 -99.26 gain 103 121 -104.95 gain 121 103 -103.66 gain 103 122 -92.48 gain 122 103 -90.94 gain 103 123 -96.48 gain 123 103 -95.28 gain 103 124 -98.29 gain 124 103 -95.08 gain 103 125 -100.57 gain 125 103 -100.70 gain 103 126 -89.75 gain 126 103 -86.54 gain 103 127 -95.93 gain 127 103 -92.33 gain 103 128 -96.41 gain 128 103 -95.42 gain 103 129 -90.39 gain 129 103 -86.60 gain 103 130 -77.32 gain 130 103 -74.82 gain 103 131 -78.31 gain 131 103 -75.58 gain 103 132 -75.10 gain 132 103 -68.38 gain 103 133 -69.46 gain 133 103 -67.92 gain 103 134 -73.92 gain 134 103 -69.25 gain 103 135 -99.47 gain 135 103 -97.09 gain 103 136 -99.16 gain 136 103 -97.23 gain 103 137 -103.41 gain 137 103 -104.39 gain 103 138 -96.91 gain 138 103 -91.42 gain 103 139 -94.69 gain 139 103 -92.46 gain 103 140 -96.96 gain 140 103 -95.57 gain 103 141 -89.94 gain 141 103 -80.52 gain 103 142 -93.69 gain 142 103 -91.01 gain 103 143 -86.00 gain 143 103 -86.05 gain 103 144 -94.94 gain 144 103 -93.36 gain 103 145 -83.30 gain 145 103 -85.11 gain 103 146 -84.44 gain 146 103 -82.24 gain 103 147 -76.09 gain 147 103 -71.00 gain 103 148 -77.68 gain 148 103 -70.92 gain 103 149 -87.85 gain 149 103 -84.74 gain 103 150 -100.30 gain 150 103 -98.02 gain 103 151 -101.03 gain 151 103 -97.70 gain 103 152 -103.19 gain 152 103 -99.67 gain 103 153 -98.96 gain 153 103 -94.66 gain 103 154 -98.64 gain 154 103 -96.24 gain 103 155 -93.18 gain 155 103 -89.35 gain 103 156 -91.45 gain 156 103 -86.86 gain 103 157 -93.62 gain 157 103 -91.51 gain 103 158 -96.30 gain 158 103 -93.69 gain 103 159 -89.27 gain 159 103 -89.04 gain 103 160 -90.95 gain 160 103 -87.87 gain 103 161 -85.85 gain 161 103 -85.21 gain 103 162 -86.89 gain 162 103 -85.97 gain 103 163 -80.78 gain 163 103 -81.77 gain 103 164 -84.98 gain 164 103 -85.33 gain 103 165 -101.04 gain 165 103 -98.46 gain 103 166 -102.95 gain 166 103 -100.12 gain 103 167 -103.37 gain 167 103 -101.26 gain 103 168 -97.38 gain 168 103 -94.17 gain 103 169 -93.44 gain 169 103 -91.34 gain 103 170 -98.16 gain 170 103 -95.29 gain 103 171 -94.21 gain 171 103 -92.42 gain 103 172 -94.66 gain 172 103 -91.06 gain 103 173 -90.54 gain 173 103 -91.59 gain 103 174 -94.00 gain 174 103 -91.10 gain 103 175 -90.04 gain 175 103 -88.27 gain 103 176 -99.36 gain 176 103 -96.56 gain 103 177 -95.14 gain 177 103 -95.34 gain 103 178 -92.53 gain 178 103 -86.18 gain 103 179 -89.49 gain 179 103 -82.56 gain 103 180 -99.41 gain 180 103 -101.92 gain 103 181 -100.35 gain 181 103 -96.89 gain 103 182 -100.81 gain 182 103 -98.43 gain 103 183 -103.47 gain 183 103 -101.37 gain 103 184 -100.15 gain 184 103 -100.80 gain 103 185 -101.21 gain 185 103 -105.72 gain 103 186 -93.37 gain 186 103 -93.46 gain 103 187 -95.91 gain 187 103 -93.73 gain 103 188 -91.65 gain 188 103 -91.88 gain 103 189 -95.89 gain 189 103 -90.85 gain 103 190 -93.56 gain 190 103 -92.44 gain 103 191 -93.83 gain 191 103 -91.41 gain 103 192 -91.58 gain 192 103 -87.86 gain 103 193 -94.35 gain 193 103 -89.61 gain 103 194 -92.44 gain 194 103 -88.49 gain 103 195 -100.97 gain 195 103 -95.56 gain 103 196 -97.89 gain 196 103 -96.79 gain 103 197 -100.24 gain 197 103 -94.28 gain 103 198 -103.30 gain 198 103 -101.85 gain 103 199 -100.19 gain 199 103 -98.85 gain 103 200 -102.32 gain 200 103 -102.32 gain 103 201 -94.44 gain 201 103 -94.35 gain 103 202 -97.43 gain 202 103 -96.47 gain 103 203 -101.17 gain 203 103 -99.32 gain 103 204 -95.18 gain 204 103 -89.97 gain 103 205 -89.90 gain 205 103 -88.44 gain 103 206 -88.82 gain 206 103 -88.46 gain 103 207 -94.09 gain 207 103 -93.15 gain 103 208 -96.21 gain 208 103 -97.87 gain 103 209 -90.99 gain 209 103 -92.23 gain 103 210 -102.81 gain 210 103 -104.22 gain 103 211 -99.23 gain 211 103 -95.87 gain 103 212 -98.35 gain 212 103 -98.00 gain 103 213 -98.25 gain 213 103 -97.23 gain 103 214 -104.86 gain 214 103 -109.23 gain 103 215 -93.49 gain 215 103 -93.26 gain 103 216 -99.42 gain 216 103 -103.10 gain 103 217 -103.20 gain 217 103 -107.14 gain 103 218 -91.57 gain 218 103 -88.32 gain 103 219 -96.58 gain 219 103 -93.81 gain 103 220 -95.95 gain 220 103 -89.27 gain 103 221 -96.59 gain 221 103 -95.58 gain 103 222 -91.79 gain 222 103 -86.59 gain 103 223 -100.06 gain 223 103 -98.10 gain 103 224 -93.49 gain 224 103 -92.01 gain 104 105 -106.69 gain 105 104 -101.22 gain 104 106 -107.34 gain 106 104 -99.19 gain 104 107 -101.06 gain 107 104 -92.82 gain 104 108 -101.19 gain 108 104 -92.56 gain 104 109 -105.02 gain 109 104 -99.85 gain 104 110 -98.71 gain 110 104 -99.90 gain 104 111 -92.98 gain 111 104 -84.13 gain 104 112 -94.70 gain 112 104 -89.32 gain 104 113 -96.58 gain 113 104 -90.33 gain 104 114 -81.10 gain 114 104 -72.01 gain 104 115 -83.58 gain 115 104 -75.15 gain 104 116 -81.97 gain 116 104 -75.97 gain 104 117 -86.83 gain 117 104 -77.98 gain 104 118 -76.61 gain 118 104 -69.37 gain 104 119 -67.74 gain 119 104 -65.56 gain 104 120 -103.76 gain 120 104 -98.97 gain 104 121 -113.37 gain 121 104 -109.60 gain 104 122 -111.49 gain 122 104 -107.47 gain 104 123 -102.08 gain 123 104 -98.40 gain 104 124 -103.70 gain 124 104 -98.01 gain 104 125 -95.40 gain 125 104 -93.05 gain 104 126 -102.96 gain 126 104 -97.26 gain 104 127 -97.04 gain 127 104 -90.96 gain 104 128 -96.35 gain 128 104 -92.87 gain 104 129 -90.85 gain 129 104 -84.58 gain 104 130 -91.16 gain 130 104 -86.18 gain 104 131 -87.18 gain 131 104 -81.98 gain 104 132 -78.74 gain 132 104 -69.54 gain 104 133 -72.34 gain 133 104 -68.31 gain 104 134 -76.16 gain 134 104 -69.00 gain 104 135 -102.91 gain 135 104 -98.05 gain 104 136 -102.45 gain 136 104 -98.03 gain 104 137 -106.39 gain 137 104 -104.89 gain 104 138 -98.42 gain 138 104 -90.44 gain 104 139 -98.44 gain 139 104 -93.74 gain 104 140 -97.96 gain 140 104 -94.08 gain 104 141 -103.43 gain 141 104 -91.52 gain 104 142 -102.01 gain 142 104 -96.85 gain 104 143 -90.02 gain 143 104 -87.59 gain 104 144 -89.65 gain 144 104 -85.59 gain 104 145 -87.49 gain 145 104 -86.82 gain 104 146 -90.47 gain 146 104 -85.79 gain 104 147 -86.40 gain 147 104 -78.82 gain 104 148 -75.23 gain 148 104 -65.98 gain 104 149 -85.56 gain 149 104 -79.97 gain 104 150 -107.92 gain 150 104 -103.16 gain 104 151 -106.99 gain 151 104 -101.17 gain 104 152 -108.14 gain 152 104 -102.15 gain 104 153 -102.83 gain 153 104 -96.04 gain 104 154 -103.41 gain 154 104 -98.53 gain 104 155 -97.76 gain 155 104 -91.45 gain 104 156 -91.77 gain 156 104 -84.69 gain 104 157 -100.79 gain 157 104 -96.20 gain 104 158 -98.52 gain 158 104 -93.42 gain 104 159 -97.64 gain 159 104 -94.93 gain 104 160 -89.59 gain 160 104 -84.03 gain 104 161 -89.98 gain 161 104 -86.86 gain 104 162 -86.04 gain 162 104 -82.64 gain 104 163 -87.57 gain 163 104 -86.07 gain 104 164 -87.86 gain 164 104 -85.74 gain 104 165 -107.56 gain 165 104 -102.49 gain 104 166 -112.75 gain 166 104 -107.44 gain 104 167 -103.36 gain 167 104 -98.77 gain 104 168 -103.79 gain 168 104 -98.09 gain 104 169 -97.58 gain 169 104 -93.00 gain 104 170 -102.62 gain 170 104 -97.27 gain 104 171 -97.70 gain 171 104 -93.43 gain 104 172 -96.24 gain 172 104 -90.16 gain 104 173 -95.74 gain 173 104 -94.31 gain 104 174 -99.33 gain 174 104 -93.95 gain 104 175 -95.08 gain 175 104 -90.83 gain 104 176 -91.82 gain 176 104 -86.54 gain 104 177 -94.47 gain 177 104 -92.19 gain 104 178 -93.77 gain 178 104 -84.93 gain 104 179 -92.61 gain 179 104 -83.20 gain 104 180 -99.92 gain 180 104 -99.96 gain 104 181 -106.64 gain 181 104 -100.70 gain 104 182 -102.69 gain 182 104 -97.83 gain 104 183 -103.88 gain 183 104 -99.29 gain 104 184 -99.04 gain 184 104 -97.21 gain 104 185 -98.40 gain 185 104 -100.43 gain 104 186 -107.94 gain 186 104 -105.55 gain 104 187 -97.35 gain 187 104 -92.69 gain 104 188 -93.47 gain 188 104 -91.22 gain 104 189 -94.70 gain 189 104 -87.18 gain 104 190 -92.15 gain 190 104 -88.55 gain 104 191 -94.34 gain 191 104 -89.44 gain 104 192 -88.31 gain 192 104 -82.10 gain 104 193 -97.29 gain 193 104 -90.07 gain 104 194 -88.69 gain 194 104 -82.26 gain 104 195 -108.42 gain 195 104 -100.53 gain 104 196 -105.72 gain 196 104 -102.14 gain 104 197 -101.79 gain 197 104 -93.35 gain 104 198 -103.62 gain 198 104 -99.69 gain 104 199 -104.69 gain 199 104 -100.86 gain 104 200 -96.22 gain 200 104 -93.73 gain 104 201 -91.93 gain 201 104 -89.35 gain 104 202 -98.88 gain 202 104 -95.43 gain 104 203 -99.53 gain 203 104 -95.19 gain 104 204 -94.61 gain 204 104 -86.92 gain 104 205 -94.58 gain 205 104 -90.64 gain 104 206 -95.35 gain 206 104 -92.51 gain 104 207 -102.87 gain 207 104 -99.45 gain 104 208 -92.17 gain 208 104 -91.35 gain 104 209 -91.41 gain 209 104 -90.16 gain 104 210 -103.36 gain 210 104 -102.29 gain 104 211 -98.47 gain 211 104 -92.63 gain 104 212 -109.89 gain 212 104 -107.07 gain 104 213 -114.18 gain 213 104 -110.67 gain 104 214 -103.43 gain 214 104 -105.32 gain 104 215 -94.06 gain 215 104 -91.34 gain 104 216 -101.85 gain 216 104 -103.05 gain 104 217 -94.73 gain 217 104 -96.18 gain 104 218 -100.59 gain 218 104 -94.86 gain 104 219 -97.33 gain 219 104 -92.08 gain 104 220 -97.48 gain 220 104 -88.31 gain 104 221 -102.27 gain 221 104 -98.78 gain 104 222 -97.76 gain 222 104 -90.08 gain 104 223 -100.07 gain 223 104 -95.63 gain 104 224 -98.21 gain 224 104 -94.23 gain 105 106 -61.88 gain 106 105 -59.21 gain 105 107 -82.68 gain 107 105 -79.91 gain 105 108 -74.30 gain 108 105 -71.15 gain 105 109 -78.01 gain 109 105 -78.32 gain 105 110 -81.12 gain 110 105 -87.79 gain 105 111 -91.17 gain 111 105 -87.81 gain 105 112 -92.96 gain 112 105 -93.06 gain 105 113 -98.65 gain 113 105 -97.88 gain 105 114 -92.27 gain 114 105 -88.67 gain 105 115 -95.34 gain 115 105 -92.39 gain 105 116 -89.41 gain 116 105 -88.89 gain 105 117 -97.51 gain 117 105 -94.13 gain 105 118 -98.84 gain 118 105 -97.08 gain 105 119 -91.84 gain 119 105 -95.14 gain 105 120 -64.57 gain 120 105 -65.26 gain 105 121 -77.29 gain 121 105 -79.00 gain 105 122 -75.88 gain 122 105 -77.35 gain 105 123 -75.88 gain 123 105 -77.68 gain 105 124 -85.08 gain 124 105 -84.87 gain 105 125 -87.54 gain 125 105 -90.67 gain 105 126 -90.08 gain 126 105 -89.85 gain 105 127 -91.57 gain 127 105 -90.97 gain 105 128 -96.84 gain 128 105 -98.83 gain 105 129 -87.36 gain 129 105 -86.57 gain 105 130 -93.17 gain 130 105 -93.67 gain 105 131 -99.05 gain 131 105 -99.33 gain 105 132 -91.47 gain 132 105 -87.74 gain 105 133 -95.09 gain 133 105 -96.55 gain 105 134 -97.32 gain 134 105 -95.64 gain 105 135 -72.19 gain 135 105 -72.81 gain 105 136 -72.01 gain 136 105 -73.08 gain 105 137 -72.92 gain 137 105 -76.90 gain 105 138 -87.25 gain 138 105 -84.76 gain 105 139 -84.17 gain 139 105 -84.94 gain 105 140 -86.55 gain 140 105 -88.15 gain 105 141 -91.66 gain 141 105 -85.23 gain 105 142 -98.24 gain 142 105 -98.55 gain 105 143 -94.92 gain 143 105 -97.98 gain 105 144 -94.10 gain 144 105 -95.52 gain 105 145 -89.87 gain 145 105 -94.68 gain 105 146 -96.07 gain 146 105 -96.87 gain 105 147 -98.90 gain 147 105 -96.81 gain 105 148 -93.96 gain 148 105 -90.20 gain 105 149 -100.97 gain 149 105 -100.86 gain 105 150 -77.51 gain 150 105 -78.24 gain 105 151 -83.75 gain 151 105 -83.41 gain 105 152 -80.68 gain 152 105 -80.16 gain 105 153 -88.77 gain 153 105 -87.46 gain 105 154 -82.83 gain 154 105 -83.43 gain 105 155 -85.83 gain 155 105 -85.00 gain 105 156 -86.74 gain 156 105 -85.14 gain 105 157 -97.77 gain 157 105 -98.66 gain 105 158 -91.48 gain 158 105 -91.87 gain 105 159 -101.58 gain 159 105 -104.34 gain 105 160 -94.60 gain 160 105 -94.52 gain 105 161 -93.46 gain 161 105 -95.82 gain 105 162 -97.70 gain 162 105 -99.77 gain 105 163 -98.71 gain 163 105 -102.69 gain 105 164 -100.58 gain 164 105 -103.94 gain 105 165 -85.67 gain 165 105 -86.08 gain 105 166 -78.49 gain 166 105 -78.66 gain 105 167 -88.08 gain 167 105 -88.96 gain 105 168 -82.28 gain 168 105 -82.06 gain 105 169 -91.00 gain 169 105 -91.89 gain 105 170 -85.28 gain 170 105 -85.41 gain 105 171 -84.13 gain 171 105 -85.34 gain 105 172 -92.53 gain 172 105 -91.93 gain 105 173 -92.10 gain 173 105 -96.14 gain 105 174 -92.44 gain 174 105 -92.53 gain 105 175 -96.44 gain 175 105 -97.66 gain 105 176 -101.94 gain 176 105 -102.13 gain 105 177 -94.75 gain 177 105 -97.95 gain 105 178 -96.17 gain 178 105 -92.82 gain 105 179 -103.12 gain 179 105 -99.19 gain 105 180 -91.18 gain 180 105 -96.69 gain 105 181 -89.91 gain 181 105 -89.44 gain 105 182 -85.39 gain 182 105 -86.01 gain 105 183 -87.74 gain 183 105 -88.64 gain 105 184 -86.77 gain 184 105 -90.41 gain 105 185 -92.95 gain 185 105 -100.45 gain 105 186 -92.13 gain 186 105 -95.22 gain 105 187 -96.20 gain 187 105 -97.02 gain 105 188 -92.22 gain 188 105 -95.45 gain 105 189 -91.40 gain 189 105 -89.35 gain 105 190 -99.98 gain 190 105 -101.85 gain 105 191 -100.63 gain 191 105 -101.20 gain 105 192 -96.42 gain 192 105 -95.69 gain 105 193 -101.37 gain 193 105 -99.63 gain 105 194 -106.28 gain 194 105 -105.32 gain 105 195 -86.93 gain 195 105 -84.52 gain 105 196 -86.60 gain 196 105 -88.50 gain 105 197 -81.69 gain 197 105 -78.73 gain 105 198 -90.38 gain 198 105 -91.93 gain 105 199 -87.31 gain 199 105 -88.96 gain 105 200 -94.27 gain 200 105 -97.26 gain 105 201 -93.59 gain 201 105 -96.49 gain 105 202 -92.00 gain 202 105 -94.03 gain 105 203 -94.49 gain 203 105 -95.63 gain 105 204 -98.69 gain 204 105 -96.47 gain 105 205 -90.85 gain 205 105 -92.38 gain 105 206 -97.25 gain 206 105 -99.89 gain 105 207 -91.64 gain 207 105 -93.70 gain 105 208 -98.42 gain 208 105 -103.08 gain 105 209 -96.42 gain 209 105 -100.65 gain 105 210 -93.62 gain 210 105 -98.03 gain 105 211 -90.75 gain 211 105 -90.39 gain 105 212 -89.59 gain 212 105 -92.24 gain 105 213 -86.84 gain 213 105 -88.82 gain 105 214 -96.35 gain 214 105 -103.71 gain 105 215 -93.56 gain 215 105 -96.32 gain 105 216 -94.26 gain 216 105 -100.93 gain 105 217 -96.72 gain 217 105 -103.66 gain 105 218 -99.31 gain 218 105 -99.05 gain 105 219 -95.61 gain 219 105 -95.84 gain 105 220 -92.86 gain 220 105 -89.17 gain 105 221 -97.71 gain 221 105 -99.71 gain 105 222 -100.05 gain 222 105 -97.85 gain 105 223 -103.56 gain 223 105 -104.60 gain 105 224 -92.72 gain 224 105 -94.22 gain 106 107 -61.29 gain 107 106 -61.19 gain 106 108 -69.61 gain 108 106 -69.14 gain 106 109 -75.66 gain 109 106 -78.63 gain 106 110 -82.30 gain 110 106 -91.64 gain 106 111 -86.03 gain 111 106 -85.33 gain 106 112 -86.54 gain 112 106 -89.31 gain 106 113 -85.36 gain 113 106 -87.25 gain 106 114 -89.83 gain 114 106 -88.89 gain 106 115 -90.67 gain 115 106 -90.39 gain 106 116 -86.98 gain 116 106 -89.13 gain 106 117 -95.63 gain 117 106 -94.92 gain 106 118 -96.20 gain 118 106 -97.11 gain 106 119 -103.04 gain 119 106 -109.01 gain 106 120 -56.52 gain 120 106 -59.88 gain 106 121 -60.91 gain 121 106 -65.28 gain 106 122 -56.57 gain 122 106 -60.70 gain 106 123 -73.70 gain 123 106 -78.17 gain 106 124 -76.29 gain 124 106 -78.75 gain 106 125 -78.50 gain 125 106 -84.29 gain 106 126 -84.28 gain 126 106 -86.73 gain 106 127 -85.11 gain 127 106 -87.18 gain 106 128 -81.88 gain 128 106 -86.54 gain 106 129 -89.07 gain 129 106 -90.94 gain 106 130 -91.03 gain 130 106 -94.20 gain 106 131 -93.44 gain 131 106 -96.38 gain 106 132 -91.82 gain 132 106 -90.77 gain 106 133 -92.14 gain 133 106 -96.27 gain 106 134 -89.74 gain 134 106 -90.73 gain 106 135 -70.14 gain 135 106 -73.43 gain 106 136 -71.98 gain 136 106 -75.71 gain 106 137 -74.87 gain 137 106 -81.52 gain 106 138 -73.67 gain 138 106 -73.85 gain 106 139 -75.85 gain 139 106 -79.29 gain 106 140 -81.08 gain 140 106 -85.34 gain 106 141 -94.90 gain 141 106 -91.14 gain 106 142 -88.88 gain 142 106 -91.86 gain 106 143 -91.04 gain 143 106 -96.76 gain 106 144 -91.44 gain 144 106 -95.52 gain 106 145 -93.60 gain 145 106 -101.07 gain 106 146 -95.01 gain 146 106 -98.48 gain 106 147 -99.01 gain 147 106 -99.58 gain 106 148 -93.75 gain 148 106 -92.65 gain 106 149 -98.05 gain 149 106 -100.60 gain 106 150 -87.11 gain 150 106 -90.50 gain 106 151 -70.14 gain 151 106 -72.47 gain 106 152 -79.04 gain 152 106 -81.20 gain 106 153 -79.24 gain 153 106 -80.60 gain 106 154 -80.98 gain 154 106 -84.24 gain 106 155 -82.78 gain 155 106 -84.62 gain 106 156 -87.69 gain 156 106 -88.76 gain 106 157 -91.20 gain 157 106 -94.75 gain 106 158 -83.36 gain 158 106 -86.41 gain 106 159 -91.39 gain 159 106 -96.82 gain 106 160 -85.05 gain 160 106 -87.64 gain 106 161 -96.54 gain 161 106 -101.57 gain 106 162 -96.51 gain 162 106 -101.25 gain 106 163 -103.06 gain 163 106 -109.71 gain 106 164 -102.74 gain 164 106 -108.76 gain 106 165 -79.64 gain 165 106 -82.72 gain 106 166 -76.58 gain 166 106 -79.41 gain 106 167 -85.70 gain 167 106 -89.26 gain 106 168 -81.69 gain 168 106 -84.14 gain 106 169 -81.15 gain 169 106 -84.72 gain 106 170 -77.39 gain 170 106 -80.19 gain 106 171 -85.13 gain 171 106 -89.01 gain 106 172 -87.89 gain 172 106 -89.95 gain 106 173 -85.15 gain 173 106 -91.86 gain 106 174 -90.78 gain 174 106 -93.54 gain 106 175 -94.77 gain 175 106 -98.67 gain 106 176 -100.25 gain 176 106 -103.11 gain 106 177 -92.62 gain 177 106 -98.49 gain 106 178 -102.68 gain 178 106 -101.99 gain 106 179 -96.23 gain 179 106 -94.96 gain 106 180 -82.58 gain 180 106 -90.76 gain 106 181 -81.94 gain 181 106 -84.15 gain 106 182 -80.44 gain 182 106 -83.72 gain 106 183 -83.14 gain 183 106 -86.70 gain 106 184 -79.85 gain 184 106 -86.16 gain 106 185 -88.00 gain 185 106 -98.18 gain 106 186 -85.40 gain 186 106 -91.15 gain 106 187 -98.69 gain 187 106 -102.18 gain 106 188 -86.29 gain 188 106 -92.18 gain 106 189 -89.32 gain 189 106 -89.94 gain 106 190 -90.33 gain 190 106 -94.87 gain 106 191 -95.99 gain 191 106 -99.23 gain 106 192 -94.63 gain 192 106 -96.57 gain 106 193 -100.91 gain 193 106 -101.84 gain 106 194 -94.17 gain 194 106 -95.88 gain 106 195 -84.03 gain 195 106 -84.29 gain 106 196 -82.96 gain 196 106 -87.52 gain 106 197 -86.09 gain 197 106 -85.80 gain 106 198 -83.40 gain 198 106 -87.62 gain 106 199 -85.68 gain 199 106 -90.00 gain 106 200 -83.32 gain 200 106 -88.98 gain 106 201 -91.83 gain 201 106 -97.39 gain 106 202 -89.46 gain 202 106 -94.16 gain 106 203 -89.99 gain 203 106 -93.80 gain 106 204 -99.63 gain 204 106 -100.09 gain 106 205 -95.37 gain 205 106 -99.57 gain 106 206 -96.77 gain 206 106 -102.08 gain 106 207 -95.73 gain 207 106 -100.46 gain 106 208 -93.33 gain 208 106 -100.66 gain 106 209 -98.96 gain 209 106 -105.86 gain 106 210 -83.09 gain 210 106 -90.16 gain 106 211 -91.74 gain 211 106 -94.04 gain 106 212 -90.63 gain 212 106 -95.95 gain 106 213 -85.75 gain 213 106 -90.40 gain 106 214 -81.98 gain 214 106 -92.01 gain 106 215 -93.06 gain 215 106 -98.49 gain 106 216 -89.38 gain 216 106 -98.72 gain 106 217 -88.74 gain 217 106 -98.35 gain 106 218 -90.42 gain 218 106 -92.83 gain 106 219 -91.99 gain 219 106 -94.89 gain 106 220 -93.16 gain 220 106 -92.14 gain 106 221 -91.65 gain 221 106 -96.31 gain 106 222 -91.72 gain 222 106 -92.19 gain 106 223 -96.65 gain 223 106 -100.36 gain 106 224 -98.71 gain 224 106 -102.89 gain 107 108 -52.31 gain 108 107 -51.93 gain 107 109 -72.54 gain 109 107 -75.61 gain 107 110 -81.58 gain 110 107 -91.01 gain 107 111 -81.14 gain 111 107 -80.54 gain 107 112 -77.29 gain 112 107 -80.15 gain 107 113 -84.09 gain 113 107 -86.08 gain 107 114 -93.45 gain 114 107 -92.60 gain 107 115 -95.89 gain 115 107 -95.71 gain 107 116 -88.00 gain 116 107 -90.25 gain 107 117 -87.20 gain 117 107 -86.58 gain 107 118 -94.62 gain 118 107 -95.63 gain 107 119 -97.85 gain 119 107 -103.92 gain 107 120 -68.33 gain 120 107 -71.78 gain 107 121 -72.97 gain 121 107 -77.45 gain 107 122 -58.74 gain 122 107 -62.97 gain 107 123 -66.41 gain 123 107 -70.98 gain 107 124 -73.01 gain 124 107 -75.56 gain 107 125 -75.96 gain 125 107 -81.85 gain 107 126 -81.70 gain 126 107 -84.24 gain 107 127 -90.40 gain 127 107 -92.56 gain 107 128 -86.71 gain 128 107 -91.47 gain 107 129 -87.18 gain 129 107 -89.15 gain 107 130 -86.98 gain 130 107 -90.24 gain 107 131 -88.12 gain 131 107 -91.16 gain 107 132 -92.73 gain 132 107 -91.77 gain 107 133 -89.33 gain 133 107 -93.55 gain 107 134 -95.11 gain 134 107 -96.19 gain 107 135 -71.16 gain 135 107 -74.55 gain 107 136 -62.99 gain 136 107 -66.82 gain 107 137 -69.26 gain 137 107 -76.01 gain 107 138 -72.54 gain 138 107 -72.81 gain 107 139 -77.43 gain 139 107 -80.96 gain 107 140 -77.38 gain 140 107 -81.74 gain 107 141 -81.19 gain 141 107 -77.52 gain 107 142 -86.24 gain 142 107 -89.32 gain 107 143 -86.55 gain 143 107 -92.36 gain 107 144 -83.54 gain 144 107 -87.72 gain 107 145 -91.61 gain 145 107 -99.18 gain 107 146 -87.02 gain 146 107 -90.58 gain 107 147 -96.18 gain 147 107 -96.84 gain 107 148 -90.95 gain 148 107 -89.95 gain 107 149 -91.66 gain 149 107 -94.31 gain 107 150 -85.48 gain 150 107 -88.97 gain 107 151 -72.06 gain 151 107 -74.49 gain 107 152 -82.37 gain 152 107 -84.61 gain 107 153 -74.78 gain 153 107 -76.24 gain 107 154 -70.91 gain 154 107 -74.27 gain 107 155 -81.90 gain 155 107 -83.84 gain 107 156 -76.47 gain 156 107 -77.64 gain 107 157 -83.44 gain 157 107 -87.09 gain 107 158 -82.13 gain 158 107 -85.28 gain 107 159 -82.96 gain 159 107 -88.49 gain 107 160 -85.42 gain 160 107 -88.11 gain 107 161 -92.38 gain 161 107 -97.50 gain 107 162 -94.48 gain 162 107 -99.31 gain 107 163 -86.20 gain 163 107 -92.95 gain 107 164 -95.46 gain 164 107 -101.58 gain 107 165 -79.71 gain 165 107 -82.89 gain 107 166 -83.33 gain 166 107 -86.25 gain 107 167 -85.07 gain 167 107 -88.72 gain 107 168 -81.90 gain 168 107 -84.45 gain 107 169 -82.82 gain 169 107 -86.48 gain 107 170 -80.01 gain 170 107 -82.90 gain 107 171 -85.93 gain 171 107 -89.90 gain 107 172 -81.93 gain 172 107 -84.09 gain 107 173 -93.51 gain 173 107 -100.32 gain 107 174 -90.37 gain 174 107 -93.23 gain 107 175 -84.76 gain 175 107 -88.75 gain 107 176 -92.96 gain 176 107 -95.92 gain 107 177 -88.52 gain 177 107 -94.48 gain 107 178 -97.13 gain 178 107 -96.53 gain 107 179 -96.39 gain 179 107 -95.22 gain 107 180 -83.09 gain 180 107 -91.37 gain 107 181 -77.50 gain 181 107 -79.80 gain 107 182 -89.70 gain 182 107 -93.08 gain 107 183 -87.83 gain 183 107 -91.49 gain 107 184 -89.39 gain 184 107 -95.79 gain 107 185 -91.91 gain 185 107 -102.18 gain 107 186 -84.60 gain 186 107 -90.45 gain 107 187 -83.35 gain 187 107 -86.93 gain 107 188 -87.38 gain 188 107 -93.37 gain 107 189 -89.15 gain 189 107 -89.87 gain 107 190 -90.08 gain 190 107 -94.71 gain 107 191 -93.55 gain 191 107 -96.89 gain 107 192 -96.62 gain 192 107 -98.65 gain 107 193 -92.19 gain 193 107 -93.21 gain 107 194 -97.87 gain 194 107 -99.68 gain 107 195 -85.94 gain 195 107 -86.29 gain 107 196 -86.98 gain 196 107 -91.64 gain 107 197 -87.77 gain 197 107 -87.57 gain 107 198 -84.67 gain 198 107 -88.98 gain 107 199 -91.85 gain 199 107 -96.27 gain 107 200 -85.95 gain 200 107 -91.70 gain 107 201 -90.11 gain 201 107 -95.77 gain 107 202 -85.04 gain 202 107 -89.84 gain 107 203 -97.76 gain 203 107 -101.67 gain 107 204 -87.68 gain 204 107 -88.24 gain 107 205 -87.73 gain 205 107 -92.02 gain 107 206 -98.85 gain 206 107 -104.26 gain 107 207 -90.78 gain 207 107 -95.60 gain 107 208 -93.45 gain 208 107 -100.87 gain 107 209 -94.74 gain 209 107 -101.74 gain 107 210 -78.03 gain 210 107 -85.20 gain 107 211 -76.65 gain 211 107 -79.05 gain 107 212 -86.07 gain 212 107 -91.48 gain 107 213 -91.00 gain 213 107 -95.74 gain 107 214 -87.86 gain 214 107 -97.99 gain 107 215 -88.39 gain 215 107 -93.92 gain 107 216 -91.16 gain 216 107 -100.60 gain 107 217 -87.77 gain 217 107 -97.47 gain 107 218 -93.94 gain 218 107 -96.45 gain 107 219 -89.30 gain 219 107 -92.29 gain 107 220 -90.39 gain 220 107 -89.46 gain 107 221 -96.55 gain 221 107 -101.31 gain 107 222 -96.41 gain 222 107 -96.98 gain 107 223 -96.63 gain 223 107 -100.43 gain 107 224 -100.08 gain 224 107 -104.35 gain 108 109 -57.18 gain 109 108 -60.63 gain 108 110 -70.94 gain 110 108 -80.76 gain 108 111 -75.11 gain 111 108 -74.89 gain 108 112 -78.54 gain 112 108 -81.78 gain 108 113 -77.24 gain 113 108 -79.61 gain 108 114 -83.20 gain 114 108 -82.74 gain 108 115 -83.39 gain 115 108 -83.58 gain 108 116 -90.95 gain 116 108 -93.57 gain 108 117 -84.21 gain 117 108 -83.98 gain 108 118 -89.81 gain 118 108 -91.20 gain 108 119 -86.92 gain 119 108 -93.36 gain 108 120 -75.28 gain 120 108 -79.12 gain 108 121 -73.56 gain 121 108 -78.42 gain 108 122 -59.41 gain 122 108 -64.02 gain 108 123 -57.24 gain 123 108 -62.18 gain 108 124 -64.61 gain 124 108 -67.55 gain 108 125 -71.80 gain 125 108 -78.07 gain 108 126 -68.49 gain 126 108 -71.41 gain 108 127 -84.87 gain 127 108 -87.42 gain 108 128 -78.14 gain 128 108 -83.29 gain 108 129 -76.90 gain 129 108 -79.25 gain 108 130 -87.04 gain 130 108 -90.69 gain 108 131 -86.41 gain 131 108 -89.83 gain 108 132 -93.07 gain 132 108 -92.49 gain 108 133 -96.91 gain 133 108 -101.51 gain 108 134 -96.80 gain 134 108 -98.27 gain 108 135 -78.89 gain 135 108 -82.65 gain 108 136 -77.25 gain 136 108 -81.46 gain 108 137 -71.82 gain 137 108 -78.94 gain 108 138 -71.63 gain 138 108 -72.28 gain 108 139 -69.04 gain 139 108 -72.96 gain 108 140 -71.13 gain 140 108 -75.87 gain 108 141 -78.17 gain 141 108 -74.89 gain 108 142 -78.94 gain 142 108 -82.40 gain 108 143 -84.16 gain 143 108 -90.36 gain 108 144 -82.66 gain 144 108 -87.22 gain 108 145 -83.63 gain 145 108 -91.58 gain 108 146 -88.47 gain 146 108 -92.41 gain 108 147 -92.62 gain 147 108 -93.67 gain 108 148 -91.81 gain 148 108 -91.18 gain 108 149 -98.13 gain 149 108 -101.16 gain 108 150 -82.52 gain 150 108 -86.39 gain 108 151 -72.68 gain 151 108 -75.49 gain 108 152 -81.31 gain 152 108 -83.94 gain 108 153 -78.88 gain 153 108 -80.72 gain 108 154 -81.14 gain 154 108 -84.89 gain 108 155 -80.10 gain 155 108 -82.42 gain 108 156 -80.52 gain 156 108 -82.07 gain 108 157 -79.45 gain 157 108 -83.48 gain 108 158 -75.50 gain 158 108 -79.03 gain 108 159 -91.10 gain 159 108 -97.01 gain 108 160 -85.51 gain 160 108 -88.58 gain 108 161 -87.32 gain 161 108 -92.83 gain 108 162 -92.60 gain 162 108 -97.81 gain 108 163 -86.06 gain 163 108 -93.19 gain 108 164 -87.86 gain 164 108 -94.36 gain 108 165 -85.28 gain 165 108 -88.84 gain 108 166 -80.14 gain 166 108 -83.45 gain 108 167 -79.09 gain 167 108 -83.12 gain 108 168 -83.82 gain 168 108 -86.75 gain 108 169 -82.18 gain 169 108 -86.22 gain 108 170 -87.37 gain 170 108 -90.64 gain 108 171 -83.94 gain 171 108 -88.29 gain 108 172 -84.72 gain 172 108 -87.26 gain 108 173 -80.89 gain 173 108 -88.08 gain 108 174 -88.23 gain 174 108 -91.47 gain 108 175 -90.08 gain 175 108 -94.45 gain 108 176 -90.27 gain 176 108 -93.62 gain 108 177 -85.05 gain 177 108 -91.40 gain 108 178 -94.04 gain 178 108 -93.83 gain 108 179 -91.70 gain 179 108 -90.91 gain 108 180 -81.80 gain 180 108 -90.46 gain 108 181 -77.29 gain 181 108 -79.97 gain 108 182 -78.56 gain 182 108 -82.33 gain 108 183 -80.26 gain 183 108 -84.30 gain 108 184 -87.07 gain 184 108 -93.85 gain 108 185 -81.65 gain 185 108 -92.31 gain 108 186 -89.96 gain 186 108 -96.19 gain 108 187 -85.53 gain 187 108 -89.50 gain 108 188 -82.49 gain 188 108 -88.86 gain 108 189 -91.25 gain 189 108 -92.35 gain 108 190 -93.13 gain 190 108 -98.14 gain 108 191 -92.33 gain 191 108 -96.05 gain 108 192 -88.94 gain 192 108 -91.36 gain 108 193 -87.15 gain 193 108 -88.56 gain 108 194 -90.48 gain 194 108 -92.66 gain 108 195 -90.09 gain 195 108 -90.83 gain 108 196 -85.16 gain 196 108 -90.20 gain 108 197 -78.32 gain 197 108 -78.49 gain 108 198 -91.35 gain 198 108 -96.04 gain 108 199 -87.39 gain 199 108 -92.18 gain 108 200 -81.96 gain 200 108 -88.09 gain 108 201 -87.19 gain 201 108 -93.23 gain 108 202 -93.95 gain 202 108 -99.13 gain 108 203 -86.44 gain 203 108 -90.74 gain 108 204 -83.70 gain 204 108 -84.64 gain 108 205 -93.58 gain 205 108 -98.26 gain 108 206 -89.11 gain 206 108 -94.90 gain 108 207 -86.08 gain 207 108 -91.29 gain 108 208 -96.37 gain 208 108 -104.17 gain 108 209 -96.52 gain 209 108 -103.90 gain 108 210 -85.30 gain 210 108 -92.85 gain 108 211 -85.42 gain 211 108 -88.20 gain 108 212 -91.29 gain 212 108 -97.09 gain 108 213 -94.60 gain 213 108 -99.73 gain 108 214 -87.03 gain 214 108 -97.54 gain 108 215 -90.55 gain 215 108 -96.46 gain 108 216 -87.20 gain 216 108 -97.02 gain 108 217 -90.55 gain 217 108 -100.64 gain 108 218 -88.56 gain 218 108 -91.45 gain 108 219 -89.01 gain 219 108 -92.38 gain 108 220 -88.48 gain 220 108 -87.94 gain 108 221 -96.26 gain 221 108 -101.39 gain 108 222 -98.85 gain 222 108 -99.79 gain 108 223 -98.43 gain 223 108 -102.61 gain 108 224 -101.50 gain 224 108 -106.15 gain 109 110 -64.76 gain 110 109 -71.12 gain 109 111 -65.87 gain 111 109 -62.20 gain 109 112 -79.30 gain 112 109 -79.09 gain 109 113 -79.66 gain 113 109 -78.58 gain 109 114 -85.06 gain 114 109 -81.15 gain 109 115 -94.75 gain 115 109 -91.49 gain 109 116 -88.27 gain 116 109 -87.45 gain 109 117 -98.14 gain 117 109 -94.46 gain 109 118 -92.58 gain 118 109 -90.52 gain 109 119 -90.01 gain 119 109 -93.01 gain 109 120 -90.11 gain 120 109 -90.49 gain 109 121 -80.31 gain 121 109 -81.72 gain 109 122 -77.23 gain 122 109 -78.38 gain 109 123 -72.71 gain 123 109 -74.21 gain 109 124 -69.68 gain 124 109 -69.16 gain 109 125 -67.74 gain 125 109 -70.56 gain 109 126 -74.04 gain 126 109 -73.51 gain 109 127 -79.10 gain 127 109 -78.20 gain 109 128 -80.34 gain 128 109 -82.03 gain 109 129 -85.66 gain 129 109 -84.56 gain 109 130 -93.16 gain 130 109 -93.35 gain 109 131 -94.25 gain 131 109 -94.21 gain 109 132 -91.40 gain 132 109 -87.37 gain 109 133 -94.77 gain 133 109 -95.92 gain 109 134 -90.77 gain 134 109 -88.78 gain 109 135 -75.82 gain 135 109 -76.13 gain 109 136 -82.22 gain 136 109 -82.98 gain 109 137 -78.05 gain 137 109 -81.72 gain 109 138 -81.29 gain 138 109 -78.49 gain 109 139 -77.25 gain 139 109 -77.72 gain 109 140 -78.30 gain 140 109 -79.60 gain 109 141 -82.74 gain 141 109 -76.01 gain 109 142 -81.73 gain 142 109 -81.74 gain 109 143 -90.33 gain 143 109 -93.07 gain 109 144 -83.48 gain 144 109 -84.59 gain 109 145 -91.42 gain 145 109 -95.92 gain 109 146 -91.34 gain 146 109 -91.83 gain 109 147 -95.74 gain 147 109 -93.34 gain 109 148 -89.28 gain 148 109 -85.21 gain 109 149 -92.54 gain 149 109 -92.12 gain 109 150 -87.95 gain 150 109 -88.37 gain 109 151 -86.48 gain 151 109 -85.84 gain 109 152 -79.54 gain 152 109 -78.71 gain 109 153 -82.54 gain 153 109 -80.93 gain 109 154 -81.35 gain 154 109 -81.64 gain 109 155 -78.06 gain 155 109 -76.93 gain 109 156 -84.84 gain 156 109 -82.94 gain 109 157 -85.70 gain 157 109 -86.28 gain 109 158 -82.52 gain 158 109 -82.60 gain 109 159 -89.12 gain 159 109 -91.58 gain 109 160 -89.62 gain 160 109 -89.24 gain 109 161 -89.61 gain 161 109 -91.66 gain 109 162 -84.80 gain 162 109 -86.56 gain 109 163 -100.37 gain 163 109 -104.05 gain 109 164 -102.28 gain 164 109 -105.33 gain 109 165 -85.99 gain 165 109 -86.10 gain 109 166 -78.91 gain 166 109 -78.77 gain 109 167 -82.82 gain 167 109 -83.40 gain 109 168 -81.29 gain 168 109 -80.77 gain 109 169 -83.79 gain 169 109 -84.38 gain 109 170 -89.67 gain 170 109 -89.50 gain 109 171 -87.80 gain 171 109 -88.70 gain 109 172 -84.49 gain 172 109 -83.58 gain 109 173 -89.86 gain 173 109 -93.60 gain 109 174 -97.32 gain 174 109 -97.11 gain 109 175 -87.42 gain 175 109 -88.35 gain 109 176 -86.93 gain 176 109 -86.82 gain 109 177 -91.94 gain 177 109 -94.83 gain 109 178 -98.41 gain 178 109 -94.75 gain 109 179 -90.32 gain 179 109 -86.08 gain 109 180 -87.60 gain 180 109 -92.80 gain 109 181 -85.36 gain 181 109 -84.59 gain 109 182 -90.27 gain 182 109 -90.58 gain 109 183 -90.01 gain 183 109 -90.60 gain 109 184 -83.99 gain 184 109 -87.33 gain 109 185 -87.55 gain 185 109 -94.76 gain 109 186 -82.74 gain 186 109 -85.53 gain 109 187 -87.79 gain 187 109 -88.30 gain 109 188 -90.19 gain 188 109 -93.11 gain 109 189 -89.53 gain 189 109 -87.18 gain 109 190 -89.66 gain 190 109 -91.23 gain 109 191 -94.13 gain 191 109 -94.40 gain 109 192 -93.08 gain 192 109 -92.05 gain 109 193 -100.98 gain 193 109 -98.93 gain 109 194 -96.66 gain 194 109 -95.40 gain 109 195 -89.80 gain 195 109 -87.08 gain 109 196 -89.32 gain 196 109 -90.91 gain 109 197 -84.88 gain 197 109 -81.61 gain 109 198 -93.07 gain 198 109 -94.31 gain 109 199 -95.04 gain 199 109 -96.38 gain 109 200 -90.21 gain 200 109 -92.90 gain 109 201 -96.55 gain 201 109 -99.14 gain 109 202 -89.05 gain 202 109 -90.78 gain 109 203 -95.97 gain 203 109 -96.81 gain 109 204 -91.17 gain 204 109 -88.66 gain 109 205 -87.37 gain 205 109 -88.60 gain 109 206 -91.08 gain 206 109 -93.41 gain 109 207 -87.02 gain 207 109 -88.77 gain 109 208 -97.65 gain 208 109 -102.00 gain 109 209 -97.07 gain 209 109 -100.99 gain 109 210 -90.27 gain 210 109 -94.37 gain 109 211 -91.96 gain 211 109 -91.29 gain 109 212 -88.82 gain 212 109 -91.17 gain 109 213 -93.63 gain 213 109 -95.30 gain 109 214 -92.60 gain 214 109 -99.66 gain 109 215 -88.22 gain 215 109 -90.68 gain 109 216 -86.74 gain 216 109 -93.11 gain 109 217 -81.21 gain 217 109 -87.84 gain 109 218 -99.67 gain 218 109 -99.11 gain 109 219 -102.28 gain 219 109 -102.20 gain 109 220 -91.15 gain 220 109 -87.15 gain 109 221 -93.43 gain 221 109 -95.11 gain 109 222 -101.44 gain 222 109 -98.93 gain 109 223 -95.01 gain 223 109 -95.74 gain 109 224 -93.16 gain 224 109 -94.36 gain 110 111 -69.72 gain 111 110 -59.69 gain 110 112 -79.03 gain 112 110 -72.46 gain 110 113 -84.20 gain 113 110 -76.76 gain 110 114 -88.82 gain 114 110 -78.55 gain 110 115 -97.21 gain 115 110 -87.59 gain 110 116 -92.66 gain 116 110 -85.47 gain 110 117 -102.95 gain 117 110 -92.91 gain 110 118 -103.70 gain 118 110 -95.28 gain 110 119 -98.86 gain 119 110 -95.50 gain 110 120 -88.51 gain 120 110 -82.53 gain 110 121 -90.19 gain 121 110 -85.23 gain 110 122 -80.42 gain 122 110 -75.21 gain 110 123 -78.99 gain 123 110 -74.12 gain 110 124 -76.09 gain 124 110 -69.21 gain 110 125 -69.66 gain 125 110 -66.12 gain 110 126 -74.10 gain 126 110 -67.21 gain 110 127 -76.55 gain 127 110 -69.28 gain 110 128 -79.97 gain 128 110 -75.30 gain 110 129 -97.44 gain 129 110 -89.98 gain 110 130 -96.26 gain 130 110 -90.10 gain 110 131 -92.40 gain 131 110 -86.01 gain 110 132 -104.92 gain 132 110 -94.54 gain 110 133 -94.40 gain 133 110 -89.19 gain 110 134 -104.40 gain 134 110 -96.05 gain 110 135 -93.38 gain 135 110 -87.34 gain 110 136 -90.32 gain 136 110 -84.71 gain 110 137 -91.19 gain 137 110 -88.50 gain 110 138 -90.62 gain 138 110 -81.46 gain 110 139 -87.25 gain 139 110 -81.36 gain 110 140 -90.03 gain 140 110 -84.97 gain 110 141 -82.82 gain 141 110 -69.73 gain 110 142 -80.62 gain 142 110 -74.27 gain 110 143 -87.73 gain 143 110 -84.11 gain 110 144 -85.84 gain 144 110 -80.59 gain 110 145 -97.05 gain 145 110 -95.18 gain 110 146 -91.03 gain 146 110 -85.16 gain 110 147 -100.78 gain 147 110 -92.02 gain 110 148 -94.65 gain 148 110 -84.22 gain 110 149 -96.39 gain 149 110 -89.61 gain 110 150 -94.24 gain 150 110 -88.30 gain 110 151 -87.71 gain 151 110 -80.71 gain 110 152 -83.41 gain 152 110 -76.23 gain 110 153 -92.65 gain 153 110 -84.68 gain 110 154 -82.08 gain 154 110 -76.01 gain 110 155 -86.01 gain 155 110 -78.51 gain 110 156 -87.07 gain 156 110 -78.81 gain 110 157 -87.59 gain 157 110 -81.81 gain 110 158 -92.51 gain 158 110 -86.23 gain 110 159 -89.41 gain 159 110 -85.51 gain 110 160 -95.63 gain 160 110 -88.89 gain 110 161 -97.20 gain 161 110 -92.90 gain 110 162 -87.52 gain 162 110 -82.92 gain 110 163 -95.55 gain 163 110 -92.87 gain 110 164 -101.30 gain 164 110 -97.99 gain 110 165 -100.87 gain 165 110 -94.62 gain 110 166 -92.13 gain 166 110 -85.63 gain 110 167 -87.44 gain 167 110 -81.66 gain 110 168 -91.33 gain 168 110 -84.44 gain 110 169 -89.77 gain 169 110 -84.00 gain 110 170 -88.35 gain 170 110 -81.82 gain 110 171 -89.44 gain 171 110 -83.99 gain 110 172 -88.76 gain 172 110 -81.49 gain 110 173 -88.07 gain 173 110 -85.45 gain 110 174 -92.09 gain 174 110 -85.52 gain 110 175 -96.93 gain 175 110 -91.49 gain 110 176 -102.02 gain 176 110 -95.56 gain 110 177 -102.72 gain 177 110 -99.26 gain 110 178 -96.54 gain 178 110 -86.51 gain 110 179 -101.02 gain 179 110 -90.42 gain 110 180 -98.78 gain 180 110 -97.62 gain 110 181 -94.60 gain 181 110 -87.47 gain 110 182 -93.88 gain 182 110 -87.83 gain 110 183 -89.39 gain 183 110 -83.62 gain 110 184 -95.33 gain 184 110 -92.30 gain 110 185 -98.36 gain 185 110 -99.20 gain 110 186 -92.98 gain 186 110 -89.40 gain 110 187 -92.06 gain 187 110 -86.22 gain 110 188 -94.21 gain 188 110 -90.77 gain 110 189 -99.04 gain 189 110 -90.33 gain 110 190 -94.49 gain 190 110 -89.70 gain 110 191 -101.22 gain 191 110 -95.13 gain 110 192 -102.67 gain 192 110 -95.28 gain 110 193 -92.25 gain 193 110 -83.85 gain 110 194 -101.02 gain 194 110 -93.40 gain 110 195 -100.19 gain 195 110 -91.11 gain 110 196 -96.47 gain 196 110 -91.70 gain 110 197 -105.40 gain 197 110 -95.77 gain 110 198 -96.96 gain 198 110 -91.84 gain 110 199 -91.21 gain 199 110 -86.19 gain 110 200 -95.66 gain 200 110 -91.98 gain 110 201 -98.74 gain 201 110 -94.97 gain 110 202 -99.97 gain 202 110 -95.34 gain 110 203 -89.00 gain 203 110 -83.48 gain 110 204 -104.99 gain 204 110 -96.11 gain 110 205 -99.07 gain 205 110 -93.93 gain 110 206 -94.60 gain 206 110 -90.57 gain 110 207 -94.19 gain 207 110 -89.58 gain 110 208 -99.81 gain 208 110 -97.80 gain 110 209 -99.61 gain 209 110 -97.17 gain 110 210 -101.65 gain 210 110 -99.39 gain 110 211 -94.11 gain 211 110 -87.08 gain 110 212 -94.96 gain 212 110 -90.94 gain 110 213 -100.46 gain 213 110 -95.77 gain 110 214 -102.29 gain 214 110 -102.99 gain 110 215 -99.54 gain 215 110 -95.63 gain 110 216 -101.23 gain 216 110 -101.24 gain 110 217 -96.74 gain 217 110 -97.01 gain 110 218 -99.74 gain 218 110 -92.82 gain 110 219 -99.66 gain 219 110 -93.22 gain 110 220 -100.42 gain 220 110 -90.07 gain 110 221 -102.56 gain 221 110 -97.88 gain 110 222 -102.20 gain 222 110 -93.33 gain 110 223 -103.87 gain 223 110 -98.25 gain 110 224 -102.65 gain 224 110 -97.49 gain 111 112 -71.29 gain 112 111 -74.76 gain 111 113 -74.01 gain 113 111 -76.60 gain 111 114 -74.41 gain 114 111 -74.17 gain 111 115 -76.40 gain 115 111 -76.82 gain 111 116 -78.44 gain 116 111 -81.28 gain 111 117 -81.48 gain 117 111 -81.47 gain 111 118 -86.41 gain 118 111 -88.02 gain 111 119 -85.73 gain 119 111 -92.40 gain 111 120 -77.49 gain 120 111 -81.54 gain 111 121 -81.39 gain 121 111 -86.47 gain 111 122 -86.06 gain 122 111 -90.89 gain 111 123 -69.99 gain 123 111 -75.16 gain 111 124 -69.65 gain 124 111 -72.81 gain 111 125 -62.15 gain 125 111 -68.65 gain 111 126 -64.54 gain 126 111 -67.69 gain 111 127 -66.24 gain 127 111 -69.01 gain 111 128 -67.97 gain 128 111 -73.34 gain 111 129 -78.45 gain 129 111 -81.02 gain 111 130 -76.98 gain 130 111 -80.84 gain 111 131 -85.15 gain 131 111 -88.79 gain 111 132 -88.23 gain 132 111 -87.88 gain 111 133 -81.25 gain 133 111 -86.08 gain 111 134 -89.95 gain 134 111 -91.63 gain 111 135 -81.12 gain 135 111 -85.11 gain 111 136 -80.50 gain 136 111 -84.93 gain 111 137 -86.85 gain 137 111 -94.20 gain 111 138 -80.75 gain 138 111 -81.62 gain 111 139 -72.69 gain 139 111 -76.83 gain 111 140 -72.96 gain 140 111 -77.93 gain 111 141 -68.80 gain 141 111 -65.74 gain 111 142 -69.48 gain 142 111 -73.16 gain 111 143 -78.15 gain 143 111 -84.57 gain 111 144 -76.13 gain 144 111 -80.91 gain 111 145 -89.80 gain 145 111 -97.97 gain 111 146 -81.07 gain 146 111 -85.23 gain 111 147 -84.69 gain 147 111 -85.96 gain 111 148 -89.69 gain 148 111 -89.29 gain 111 149 -87.67 gain 149 111 -90.92 gain 111 150 -84.04 gain 150 111 -88.13 gain 111 151 -77.48 gain 151 111 -80.51 gain 111 152 -88.32 gain 152 111 -91.17 gain 111 153 -82.36 gain 153 111 -84.42 gain 111 154 -79.62 gain 154 111 -83.58 gain 111 155 -73.55 gain 155 111 -76.09 gain 111 156 -82.80 gain 156 111 -84.57 gain 111 157 -78.05 gain 157 111 -82.29 gain 111 158 -81.31 gain 158 111 -85.05 gain 111 159 -79.21 gain 159 111 -85.34 gain 111 160 -84.17 gain 160 111 -87.46 gain 111 161 -80.77 gain 161 111 -86.50 gain 111 162 -91.27 gain 162 111 -96.71 gain 111 163 -83.54 gain 163 111 -90.89 gain 111 164 -93.65 gain 164 111 -100.37 gain 111 165 -84.25 gain 165 111 -88.02 gain 111 166 -89.10 gain 166 111 -92.63 gain 111 167 -85.20 gain 167 111 -89.45 gain 111 168 -79.70 gain 168 111 -82.84 gain 111 169 -71.65 gain 169 111 -75.91 gain 111 170 -82.32 gain 170 111 -85.81 gain 111 171 -78.83 gain 171 111 -83.41 gain 111 172 -76.29 gain 172 111 -79.05 gain 111 173 -79.61 gain 173 111 -87.02 gain 111 174 -85.01 gain 174 111 -88.47 gain 111 175 -84.59 gain 175 111 -89.18 gain 111 176 -90.88 gain 176 111 -94.44 gain 111 177 -82.96 gain 177 111 -89.53 gain 111 178 -83.87 gain 178 111 -83.87 gain 111 179 -89.82 gain 179 111 -89.25 gain 111 180 -87.97 gain 180 111 -96.85 gain 111 181 -85.27 gain 181 111 -88.17 gain 111 182 -78.33 gain 182 111 -82.31 gain 111 183 -82.74 gain 183 111 -87.00 gain 111 184 -82.07 gain 184 111 -89.07 gain 111 185 -79.31 gain 185 111 -90.18 gain 111 186 -87.34 gain 186 111 -93.79 gain 111 187 -82.24 gain 187 111 -86.42 gain 111 188 -80.83 gain 188 111 -87.43 gain 111 189 -85.82 gain 189 111 -87.14 gain 111 190 -83.58 gain 190 111 -88.81 gain 111 191 -83.93 gain 191 111 -87.88 gain 111 192 -92.41 gain 192 111 -95.05 gain 111 193 -85.04 gain 193 111 -86.67 gain 111 194 -89.41 gain 194 111 -91.81 gain 111 195 -88.07 gain 195 111 -89.02 gain 111 196 -92.58 gain 196 111 -97.85 gain 111 197 -91.24 gain 197 111 -91.64 gain 111 198 -80.16 gain 198 111 -85.07 gain 111 199 -82.89 gain 199 111 -87.91 gain 111 200 -80.18 gain 200 111 -86.53 gain 111 201 -81.84 gain 201 111 -88.10 gain 111 202 -87.82 gain 202 111 -93.22 gain 111 203 -85.75 gain 203 111 -90.26 gain 111 204 -83.44 gain 204 111 -84.60 gain 111 205 -82.51 gain 205 111 -87.41 gain 111 206 -83.91 gain 206 111 -89.91 gain 111 207 -89.84 gain 207 111 -95.27 gain 111 208 -91.65 gain 208 111 -99.67 gain 111 209 -94.23 gain 209 111 -101.83 gain 111 210 -83.35 gain 210 111 -91.12 gain 111 211 -88.44 gain 211 111 -91.44 gain 111 212 -91.84 gain 212 111 -97.85 gain 111 213 -92.30 gain 213 111 -97.64 gain 111 214 -90.79 gain 214 111 -101.52 gain 111 215 -81.64 gain 215 111 -87.77 gain 111 216 -92.92 gain 216 111 -102.96 gain 111 217 -90.27 gain 217 111 -100.57 gain 111 218 -89.18 gain 218 111 -92.29 gain 111 219 -86.07 gain 219 111 -89.66 gain 111 220 -90.09 gain 220 111 -89.77 gain 111 221 -88.28 gain 221 111 -93.64 gain 111 222 -91.45 gain 222 111 -92.61 gain 111 223 -92.37 gain 223 111 -96.78 gain 111 224 -88.08 gain 224 111 -92.95 gain 112 113 -62.58 gain 113 112 -61.71 gain 112 114 -85.40 gain 114 112 -81.70 gain 112 115 -74.33 gain 115 112 -71.28 gain 112 116 -80.77 gain 116 112 -80.15 gain 112 117 -85.93 gain 117 112 -82.46 gain 112 118 -85.71 gain 118 112 -83.85 gain 112 119 -91.23 gain 119 112 -94.44 gain 112 120 -90.14 gain 120 112 -90.73 gain 112 121 -100.22 gain 121 112 -101.83 gain 112 122 -84.72 gain 122 112 -86.08 gain 112 123 -86.61 gain 123 112 -88.31 gain 112 124 -79.05 gain 124 112 -78.75 gain 112 125 -79.79 gain 125 112 -82.82 gain 112 126 -76.18 gain 126 112 -75.86 gain 112 127 -61.99 gain 127 112 -61.29 gain 112 128 -69.74 gain 128 112 -71.64 gain 112 129 -69.79 gain 129 112 -68.90 gain 112 130 -78.78 gain 130 112 -79.18 gain 112 131 -78.67 gain 131 112 -78.84 gain 112 132 -90.69 gain 132 112 -86.87 gain 112 133 -89.55 gain 133 112 -90.91 gain 112 134 -85.79 gain 134 112 -84.01 gain 112 135 -90.18 gain 135 112 -90.70 gain 112 136 -81.26 gain 136 112 -82.23 gain 112 137 -90.59 gain 137 112 -94.47 gain 112 138 -80.78 gain 138 112 -78.19 gain 112 139 -84.30 gain 139 112 -84.98 gain 112 140 -82.24 gain 140 112 -83.74 gain 112 141 -75.48 gain 141 112 -68.96 gain 112 142 -75.53 gain 142 112 -75.75 gain 112 143 -72.26 gain 143 112 -75.21 gain 112 144 -85.84 gain 144 112 -87.16 gain 112 145 -82.97 gain 145 112 -87.68 gain 112 146 -87.61 gain 146 112 -88.31 gain 112 147 -87.98 gain 147 112 -85.79 gain 112 148 -85.90 gain 148 112 -82.03 gain 112 149 -90.38 gain 149 112 -90.17 gain 112 150 -87.89 gain 150 112 -88.51 gain 112 151 -83.81 gain 151 112 -83.38 gain 112 152 -89.83 gain 152 112 -89.22 gain 112 153 -84.77 gain 153 112 -83.37 gain 112 154 -87.26 gain 154 112 -87.76 gain 112 155 -78.29 gain 155 112 -77.36 gain 112 156 -80.91 gain 156 112 -79.21 gain 112 157 -81.13 gain 157 112 -81.91 gain 112 158 -77.09 gain 158 112 -77.38 gain 112 159 -86.69 gain 159 112 -89.35 gain 112 160 -76.49 gain 160 112 -76.32 gain 112 161 -84.12 gain 161 112 -86.39 gain 112 162 -86.18 gain 162 112 -88.16 gain 112 163 -90.23 gain 163 112 -94.11 gain 112 164 -88.40 gain 164 112 -91.66 gain 112 165 -87.49 gain 165 112 -87.80 gain 112 166 -95.66 gain 166 112 -95.73 gain 112 167 -87.25 gain 167 112 -88.03 gain 112 168 -88.64 gain 168 112 -88.32 gain 112 169 -87.59 gain 169 112 -88.39 gain 112 170 -88.12 gain 170 112 -88.15 gain 112 171 -84.13 gain 171 112 -85.24 gain 112 172 -74.38 gain 172 112 -73.68 gain 112 173 -83.52 gain 173 112 -87.46 gain 112 174 -85.07 gain 174 112 -85.06 gain 112 175 -83.97 gain 175 112 -85.10 gain 112 176 -82.83 gain 176 112 -82.93 gain 112 177 -88.82 gain 177 112 -91.92 gain 112 178 -96.81 gain 178 112 -93.35 gain 112 179 -89.74 gain 179 112 -85.70 gain 112 180 -98.59 gain 180 112 -104.00 gain 112 181 -89.94 gain 181 112 -89.38 gain 112 182 -92.00 gain 182 112 -92.52 gain 112 183 -89.16 gain 183 112 -89.95 gain 112 184 -89.47 gain 184 112 -93.01 gain 112 185 -85.75 gain 185 112 -93.17 gain 112 186 -89.45 gain 186 112 -92.44 gain 112 187 -78.90 gain 187 112 -79.62 gain 112 188 -78.42 gain 188 112 -81.55 gain 112 189 -88.72 gain 189 112 -86.58 gain 112 190 -89.44 gain 190 112 -91.21 gain 112 191 -87.98 gain 191 112 -88.46 gain 112 192 -83.94 gain 192 112 -83.11 gain 112 193 -94.40 gain 193 112 -92.56 gain 112 194 -97.51 gain 194 112 -96.45 gain 112 195 -90.08 gain 195 112 -87.57 gain 112 196 -99.14 gain 196 112 -100.94 gain 112 197 -90.98 gain 197 112 -87.92 gain 112 198 -94.94 gain 198 112 -96.39 gain 112 199 -87.65 gain 199 112 -89.20 gain 112 200 -90.78 gain 200 112 -93.67 gain 112 201 -90.97 gain 201 112 -93.77 gain 112 202 -89.58 gain 202 112 -91.52 gain 112 203 -91.81 gain 203 112 -92.85 gain 112 204 -82.61 gain 204 112 -80.30 gain 112 205 -91.63 gain 205 112 -93.06 gain 112 206 -85.57 gain 206 112 -88.11 gain 112 207 -89.30 gain 207 112 -91.26 gain 112 208 -90.07 gain 208 112 -94.64 gain 112 209 -100.78 gain 209 112 -104.91 gain 112 210 -99.62 gain 210 112 -103.93 gain 112 211 -98.62 gain 211 112 -98.16 gain 112 212 -92.92 gain 212 112 -95.47 gain 112 213 -89.38 gain 213 112 -91.26 gain 112 214 -97.24 gain 214 112 -104.51 gain 112 215 -87.65 gain 215 112 -90.32 gain 112 216 -90.83 gain 216 112 -97.41 gain 112 217 -90.28 gain 217 112 -97.12 gain 112 218 -89.00 gain 218 112 -88.65 gain 112 219 -94.50 gain 219 112 -94.63 gain 112 220 -92.75 gain 220 112 -88.97 gain 112 221 -90.09 gain 221 112 -91.98 gain 112 222 -90.83 gain 222 112 -88.53 gain 112 223 -90.40 gain 223 112 -91.35 gain 112 224 -100.05 gain 224 112 -101.46 gain 113 114 -60.48 gain 114 113 -57.65 gain 113 115 -64.66 gain 115 113 -62.49 gain 113 116 -83.34 gain 116 113 -83.60 gain 113 117 -82.49 gain 117 113 -79.89 gain 113 118 -78.50 gain 118 113 -77.52 gain 113 119 -80.66 gain 119 113 -84.74 gain 113 120 -92.99 gain 120 113 -94.45 gain 113 121 -90.11 gain 121 113 -92.59 gain 113 122 -83.29 gain 122 113 -85.53 gain 113 123 -81.34 gain 123 113 -83.92 gain 113 124 -81.64 gain 124 113 -82.21 gain 113 125 -73.83 gain 125 113 -77.73 gain 113 126 -76.91 gain 126 113 -77.46 gain 113 127 -70.69 gain 127 113 -70.86 gain 113 128 -60.56 gain 128 113 -63.33 gain 113 129 -67.53 gain 129 113 -67.51 gain 113 130 -76.58 gain 130 113 -77.85 gain 113 131 -83.50 gain 131 113 -84.54 gain 113 132 -82.21 gain 132 113 -79.26 gain 113 133 -83.55 gain 133 113 -85.78 gain 113 134 -82.37 gain 134 113 -81.46 gain 113 135 -85.83 gain 135 113 -87.23 gain 113 136 -93.97 gain 136 113 -95.81 gain 113 137 -76.34 gain 137 113 -81.09 gain 113 138 -84.21 gain 138 113 -82.49 gain 113 139 -82.72 gain 139 113 -84.26 gain 113 140 -74.88 gain 140 113 -77.26 gain 113 141 -71.32 gain 141 113 -65.67 gain 113 142 -65.02 gain 142 113 -66.11 gain 113 143 -74.10 gain 143 113 -77.93 gain 113 144 -69.65 gain 144 113 -71.84 gain 113 145 -79.10 gain 145 113 -84.67 gain 113 146 -76.83 gain 146 113 -78.40 gain 113 147 -80.91 gain 147 113 -79.59 gain 113 148 -80.78 gain 148 113 -77.79 gain 113 149 -83.39 gain 149 113 -84.05 gain 113 150 -91.18 gain 150 113 -92.67 gain 113 151 -84.36 gain 151 113 -84.80 gain 113 152 -97.65 gain 152 113 -97.90 gain 113 153 -86.49 gain 153 113 -85.96 gain 113 154 -77.02 gain 154 113 -78.39 gain 113 155 -85.76 gain 155 113 -85.71 gain 113 156 -80.51 gain 156 113 -79.68 gain 113 157 -83.07 gain 157 113 -84.72 gain 113 158 -74.34 gain 158 113 -75.49 gain 113 159 -78.51 gain 159 113 -82.05 gain 113 160 -78.39 gain 160 113 -79.08 gain 113 161 -78.43 gain 161 113 -81.56 gain 113 162 -90.52 gain 162 113 -93.36 gain 113 163 -92.15 gain 163 113 -96.91 gain 113 164 -85.06 gain 164 113 -89.19 gain 113 165 -95.19 gain 165 113 -96.38 gain 113 166 -85.27 gain 166 113 -86.21 gain 113 167 -92.94 gain 167 113 -94.60 gain 113 168 -95.19 gain 168 113 -95.74 gain 113 169 -84.35 gain 169 113 -86.02 gain 113 170 -89.51 gain 170 113 -90.42 gain 113 171 -81.54 gain 171 113 -83.53 gain 113 172 -82.62 gain 172 113 -82.79 gain 113 173 -87.86 gain 173 113 -92.68 gain 113 174 -84.85 gain 174 113 -85.72 gain 113 175 -84.50 gain 175 113 -86.50 gain 113 176 -80.97 gain 176 113 -81.94 gain 113 177 -88.15 gain 177 113 -92.12 gain 113 178 -94.28 gain 178 113 -91.70 gain 113 179 -85.52 gain 179 113 -82.36 gain 113 180 -87.75 gain 180 113 -94.04 gain 113 181 -93.38 gain 181 113 -93.69 gain 113 182 -90.90 gain 182 113 -92.29 gain 113 183 -92.01 gain 183 113 -93.68 gain 113 184 -87.04 gain 184 113 -91.45 gain 113 185 -81.32 gain 185 113 -89.60 gain 113 186 -89.68 gain 186 113 -93.55 gain 113 187 -87.92 gain 187 113 -89.51 gain 113 188 -86.60 gain 188 113 -90.60 gain 113 189 -79.26 gain 189 113 -77.99 gain 113 190 -89.55 gain 190 113 -92.19 gain 113 191 -85.82 gain 191 113 -87.17 gain 113 192 -85.60 gain 192 113 -85.65 gain 113 193 -91.29 gain 193 113 -90.32 gain 113 194 -91.92 gain 194 113 -91.73 gain 113 195 -89.59 gain 195 113 -87.95 gain 113 196 -95.42 gain 196 113 -98.09 gain 113 197 -89.48 gain 197 113 -87.29 gain 113 198 -89.37 gain 198 113 -91.69 gain 113 199 -81.69 gain 199 113 -84.12 gain 113 200 -82.40 gain 200 113 -86.16 gain 113 201 -85.76 gain 201 113 -89.43 gain 113 202 -86.15 gain 202 113 -88.95 gain 113 203 -91.51 gain 203 113 -93.43 gain 113 204 -83.55 gain 204 113 -82.11 gain 113 205 -90.08 gain 205 113 -92.38 gain 113 206 -83.23 gain 206 113 -86.64 gain 113 207 -90.08 gain 207 113 -92.91 gain 113 208 -89.86 gain 208 113 -95.29 gain 113 209 -86.25 gain 209 113 -91.25 gain 113 210 -88.26 gain 210 113 -93.44 gain 113 211 -100.73 gain 211 113 -101.14 gain 113 212 -92.74 gain 212 113 -96.16 gain 113 213 -91.37 gain 213 113 -94.12 gain 113 214 -93.58 gain 214 113 -101.72 gain 113 215 -93.93 gain 215 113 -97.47 gain 113 216 -91.53 gain 216 113 -98.98 gain 113 217 -86.94 gain 217 113 -94.65 gain 113 218 -91.33 gain 218 113 -91.85 gain 113 219 -90.51 gain 219 113 -91.51 gain 113 220 -87.12 gain 220 113 -84.21 gain 113 221 -100.79 gain 221 113 -103.55 gain 113 222 -81.18 gain 222 113 -79.75 gain 113 223 -92.02 gain 223 113 -93.83 gain 113 224 -97.37 gain 224 113 -99.65 gain 114 115 -56.42 gain 115 114 -57.07 gain 114 116 -70.36 gain 116 114 -73.45 gain 114 117 -74.26 gain 117 114 -74.49 gain 114 118 -79.39 gain 118 114 -81.24 gain 114 119 -75.33 gain 119 114 -82.24 gain 114 120 -84.29 gain 120 114 -88.59 gain 114 121 -91.97 gain 121 114 -97.28 gain 114 122 -82.11 gain 122 114 -87.18 gain 114 123 -75.74 gain 123 114 -81.15 gain 114 124 -88.83 gain 124 114 -92.23 gain 114 125 -76.83 gain 125 114 -83.56 gain 114 126 -85.21 gain 126 114 -88.59 gain 114 127 -77.06 gain 127 114 -80.07 gain 114 128 -61.41 gain 128 114 -67.01 gain 114 129 -55.51 gain 129 114 -58.32 gain 114 130 -62.19 gain 130 114 -66.29 gain 114 131 -73.53 gain 131 114 -77.41 gain 114 132 -72.95 gain 132 114 -72.83 gain 114 133 -80.54 gain 133 114 -85.60 gain 114 134 -85.91 gain 134 114 -87.83 gain 114 135 -94.16 gain 135 114 -98.38 gain 114 136 -87.29 gain 136 114 -91.96 gain 114 137 -95.28 gain 137 114 -102.86 gain 114 138 -84.63 gain 138 114 -85.74 gain 114 139 -80.67 gain 139 114 -85.05 gain 114 140 -83.22 gain 140 114 -88.43 gain 114 141 -82.49 gain 141 114 -79.67 gain 114 142 -75.93 gain 142 114 -79.86 gain 114 143 -63.32 gain 143 114 -69.97 gain 114 144 -69.00 gain 144 114 -74.02 gain 114 145 -64.61 gain 145 114 -73.02 gain 114 146 -74.28 gain 146 114 -78.68 gain 114 147 -82.55 gain 147 114 -84.06 gain 114 148 -80.50 gain 148 114 -80.34 gain 114 149 -85.00 gain 149 114 -88.49 gain 114 150 -89.53 gain 150 114 -93.86 gain 114 151 -84.47 gain 151 114 -87.74 gain 114 152 -82.90 gain 152 114 -85.99 gain 114 153 -83.28 gain 153 114 -85.58 gain 114 154 -82.64 gain 154 114 -86.84 gain 114 155 -82.63 gain 155 114 -85.41 gain 114 156 -82.34 gain 156 114 -84.34 gain 114 157 -82.76 gain 157 114 -87.25 gain 114 158 -83.01 gain 158 114 -87.00 gain 114 159 -76.53 gain 159 114 -82.91 gain 114 160 -69.57 gain 160 114 -73.10 gain 114 161 -84.43 gain 161 114 -90.39 gain 114 162 -78.36 gain 162 114 -84.04 gain 114 163 -81.73 gain 163 114 -89.32 gain 114 164 -83.05 gain 164 114 -90.01 gain 114 165 -86.63 gain 165 114 -90.65 gain 114 166 -79.33 gain 166 114 -83.10 gain 114 167 -91.78 gain 167 114 -96.28 gain 114 168 -86.90 gain 168 114 -90.29 gain 114 169 -80.85 gain 169 114 -85.35 gain 114 170 -89.33 gain 170 114 -93.06 gain 114 171 -76.57 gain 171 114 -81.39 gain 114 172 -80.73 gain 172 114 -83.73 gain 114 173 -81.03 gain 173 114 -88.68 gain 114 174 -80.99 gain 174 114 -84.69 gain 114 175 -82.99 gain 175 114 -87.82 gain 114 176 -80.31 gain 176 114 -84.12 gain 114 177 -80.89 gain 177 114 -87.69 gain 114 178 -82.81 gain 178 114 -83.06 gain 114 179 -80.89 gain 179 114 -80.56 gain 114 180 -93.68 gain 180 114 -102.80 gain 114 181 -91.65 gain 181 114 -94.79 gain 114 182 -91.72 gain 182 114 -95.95 gain 114 183 -81.64 gain 183 114 -86.14 gain 114 184 -82.84 gain 184 114 -90.09 gain 114 185 -90.28 gain 185 114 -101.40 gain 114 186 -83.80 gain 186 114 -90.49 gain 114 187 -82.58 gain 187 114 -87.00 gain 114 188 -86.03 gain 188 114 -92.86 gain 114 189 -82.88 gain 189 114 -84.44 gain 114 190 -81.91 gain 190 114 -87.38 gain 114 191 -78.70 gain 191 114 -82.89 gain 114 192 -86.66 gain 192 114 -89.54 gain 114 193 -82.24 gain 193 114 -84.10 gain 114 194 -80.89 gain 194 114 -83.54 gain 114 195 -86.00 gain 195 114 -87.19 gain 114 196 -95.45 gain 196 114 -100.95 gain 114 197 -88.62 gain 197 114 -89.25 gain 114 198 -85.92 gain 198 114 -91.08 gain 114 199 -88.19 gain 199 114 -93.45 gain 114 200 -79.88 gain 200 114 -86.48 gain 114 201 -84.80 gain 201 114 -91.30 gain 114 202 -79.11 gain 202 114 -84.75 gain 114 203 -86.29 gain 203 114 -91.04 gain 114 204 -89.51 gain 204 114 -90.90 gain 114 205 -86.50 gain 205 114 -91.63 gain 114 206 -85.41 gain 206 114 -91.66 gain 114 207 -91.82 gain 207 114 -97.48 gain 114 208 -93.12 gain 208 114 -101.39 gain 114 209 -81.01 gain 209 114 -88.85 gain 114 210 -99.20 gain 210 114 -107.21 gain 114 211 -96.72 gain 211 114 -99.96 gain 114 212 -86.72 gain 212 114 -92.97 gain 114 213 -89.43 gain 213 114 -95.01 gain 114 214 -90.23 gain 214 114 -101.20 gain 114 215 -80.66 gain 215 114 -87.03 gain 114 216 -87.99 gain 216 114 -98.27 gain 114 217 -93.10 gain 217 114 -103.64 gain 114 218 -83.09 gain 218 114 -86.43 gain 114 219 -89.38 gain 219 114 -93.22 gain 114 220 -82.44 gain 220 114 -82.36 gain 114 221 -86.89 gain 221 114 -92.49 gain 114 222 -94.13 gain 222 114 -95.54 gain 114 223 -88.66 gain 223 114 -93.30 gain 114 224 -89.12 gain 224 114 -94.23 gain 115 116 -56.77 gain 116 115 -59.20 gain 115 117 -71.72 gain 117 115 -71.29 gain 115 118 -77.08 gain 118 115 -78.28 gain 115 119 -74.72 gain 119 115 -80.98 gain 115 120 -95.15 gain 120 115 -98.79 gain 115 121 -101.65 gain 121 115 -106.31 gain 115 122 -81.24 gain 122 115 -85.65 gain 115 123 -87.08 gain 123 115 -91.83 gain 115 124 -88.75 gain 124 115 -91.50 gain 115 125 -77.16 gain 125 115 -83.24 gain 115 126 -84.50 gain 126 115 -87.22 gain 115 127 -76.55 gain 127 115 -78.90 gain 115 128 -72.59 gain 128 115 -77.54 gain 115 129 -61.62 gain 129 115 -63.78 gain 115 130 -56.50 gain 130 115 -59.95 gain 115 131 -69.81 gain 131 115 -73.04 gain 115 132 -64.76 gain 132 115 -63.99 gain 115 133 -75.67 gain 133 115 -80.08 gain 115 134 -86.36 gain 134 115 -87.63 gain 115 135 -84.02 gain 135 115 -87.60 gain 115 136 -98.87 gain 136 115 -102.89 gain 115 137 -85.90 gain 137 115 -92.83 gain 115 138 -86.15 gain 138 115 -86.61 gain 115 139 -85.33 gain 139 115 -89.05 gain 115 140 -79.78 gain 140 115 -84.33 gain 115 141 -80.99 gain 141 115 -77.52 gain 115 142 -81.12 gain 142 115 -84.39 gain 115 143 -75.04 gain 143 115 -81.05 gain 115 144 -71.95 gain 144 115 -76.32 gain 115 145 -65.64 gain 145 115 -73.40 gain 115 146 -63.77 gain 146 115 -67.52 gain 115 147 -75.05 gain 147 115 -75.91 gain 115 148 -77.92 gain 148 115 -77.10 gain 115 149 -78.53 gain 149 115 -81.37 gain 115 150 -91.92 gain 150 115 -95.59 gain 115 151 -92.17 gain 151 115 -94.78 gain 115 152 -86.45 gain 152 115 -88.88 gain 115 153 -91.30 gain 153 115 -92.95 gain 115 154 -84.28 gain 154 115 -87.83 gain 115 155 -85.52 gain 155 115 -87.64 gain 115 156 -81.15 gain 156 115 -82.50 gain 115 157 -83.86 gain 157 115 -87.70 gain 115 158 -78.88 gain 158 115 -82.22 gain 115 159 -78.99 gain 159 115 -84.71 gain 115 160 -70.92 gain 160 115 -73.80 gain 115 161 -79.06 gain 161 115 -84.37 gain 115 162 -76.23 gain 162 115 -81.25 gain 115 163 -72.07 gain 163 115 -79.00 gain 115 164 -84.27 gain 164 115 -90.58 gain 115 165 -90.54 gain 165 115 -93.91 gain 115 166 -94.07 gain 166 115 -97.19 gain 115 167 -93.41 gain 167 115 -97.25 gain 115 168 -89.54 gain 168 115 -92.27 gain 115 169 -75.69 gain 169 115 -79.54 gain 115 170 -81.61 gain 170 115 -84.69 gain 115 171 -84.47 gain 171 115 -88.63 gain 115 172 -87.04 gain 172 115 -89.39 gain 115 173 -78.30 gain 173 115 -85.29 gain 115 174 -76.69 gain 174 115 -79.74 gain 115 175 -74.78 gain 175 115 -78.96 gain 115 176 -81.78 gain 176 115 -84.93 gain 115 177 -73.12 gain 177 115 -79.27 gain 115 178 -80.40 gain 178 115 -79.99 gain 115 179 -71.14 gain 179 115 -70.15 gain 115 180 -94.82 gain 180 115 -103.29 gain 115 181 -90.21 gain 181 115 -92.70 gain 115 182 -91.68 gain 182 115 -95.25 gain 115 183 -82.73 gain 183 115 -86.58 gain 115 184 -83.47 gain 184 115 -90.07 gain 115 185 -83.86 gain 185 115 -94.32 gain 115 186 -91.68 gain 186 115 -97.72 gain 115 187 -88.39 gain 187 115 -92.16 gain 115 188 -88.84 gain 188 115 -95.02 gain 115 189 -82.16 gain 189 115 -83.07 gain 115 190 -84.63 gain 190 115 -89.45 gain 115 191 -78.14 gain 191 115 -81.67 gain 115 192 -85.95 gain 192 115 -88.18 gain 115 193 -86.50 gain 193 115 -87.71 gain 115 194 -84.68 gain 194 115 -86.67 gain 115 195 -94.74 gain 195 115 -95.27 gain 115 196 -90.62 gain 196 115 -95.47 gain 115 197 -87.77 gain 197 115 -87.76 gain 115 198 -88.07 gain 198 115 -92.57 gain 115 199 -83.74 gain 199 115 -88.34 gain 115 200 -92.11 gain 200 115 -98.05 gain 115 201 -84.39 gain 201 115 -90.24 gain 115 202 -89.38 gain 202 115 -94.36 gain 115 203 -78.60 gain 203 115 -82.70 gain 115 204 -86.92 gain 204 115 -87.66 gain 115 205 -83.61 gain 205 115 -88.09 gain 115 206 -88.77 gain 206 115 -94.36 gain 115 207 -81.94 gain 207 115 -86.95 gain 115 208 -78.31 gain 208 115 -85.92 gain 115 209 -84.74 gain 209 115 -91.93 gain 115 210 -92.12 gain 210 115 -99.48 gain 115 211 -96.17 gain 211 115 -98.76 gain 115 212 -94.74 gain 212 115 -100.34 gain 115 213 -94.72 gain 213 115 -99.65 gain 115 214 -98.94 gain 214 115 -109.25 gain 115 215 -88.33 gain 215 115 -94.05 gain 115 216 -81.23 gain 216 115 -90.85 gain 115 217 -94.96 gain 217 115 -104.85 gain 115 218 -87.26 gain 218 115 -89.96 gain 115 219 -90.62 gain 219 115 -93.80 gain 115 220 -83.41 gain 220 115 -82.67 gain 115 221 -83.72 gain 221 115 -88.67 gain 115 222 -92.51 gain 222 115 -93.26 gain 115 223 -92.74 gain 223 115 -96.73 gain 115 224 -78.97 gain 224 115 -83.43 gain 116 117 -67.41 gain 117 116 -64.55 gain 116 118 -62.29 gain 118 116 -61.05 gain 116 119 -78.60 gain 119 116 -82.43 gain 116 120 -97.96 gain 120 116 -99.17 gain 116 121 -96.79 gain 121 116 -99.02 gain 116 122 -96.27 gain 122 116 -98.25 gain 116 123 -89.05 gain 123 116 -91.37 gain 116 124 -87.55 gain 124 116 -87.86 gain 116 125 -86.62 gain 125 116 -90.27 gain 116 126 -77.81 gain 126 116 -78.10 gain 116 127 -77.05 gain 127 116 -76.97 gain 116 128 -75.64 gain 128 116 -78.15 gain 116 129 -78.10 gain 129 116 -77.83 gain 116 130 -65.25 gain 130 116 -66.27 gain 116 131 -64.96 gain 131 116 -65.75 gain 116 132 -63.81 gain 132 116 -60.61 gain 116 133 -74.23 gain 133 116 -76.21 gain 116 134 -82.67 gain 134 116 -81.51 gain 116 135 -96.34 gain 135 116 -97.48 gain 116 136 -97.76 gain 136 116 -99.34 gain 116 137 -96.38 gain 137 116 -100.87 gain 116 138 -93.93 gain 138 116 -91.96 gain 116 139 -85.57 gain 139 116 -86.86 gain 116 140 -92.08 gain 140 116 -94.20 gain 116 141 -90.22 gain 141 116 -84.31 gain 116 142 -87.83 gain 142 116 -88.66 gain 116 143 -76.60 gain 143 116 -80.17 gain 116 144 -78.58 gain 144 116 -80.52 gain 116 145 -78.18 gain 145 116 -83.51 gain 116 146 -71.06 gain 146 116 -72.38 gain 116 147 -71.43 gain 147 116 -69.86 gain 116 148 -76.30 gain 148 116 -73.05 gain 116 149 -80.79 gain 149 116 -81.20 gain 116 150 -98.05 gain 150 116 -99.29 gain 116 151 -96.86 gain 151 116 -97.04 gain 116 152 -93.60 gain 152 116 -93.60 gain 116 153 -94.69 gain 153 116 -93.91 gain 116 154 -92.41 gain 154 116 -93.52 gain 116 155 -89.55 gain 155 116 -89.24 gain 116 156 -86.96 gain 156 116 -85.88 gain 116 157 -79.24 gain 157 116 -80.64 gain 116 158 -87.75 gain 158 116 -88.66 gain 116 159 -87.58 gain 159 116 -90.87 gain 116 160 -80.17 gain 160 116 -80.61 gain 116 161 -72.05 gain 161 116 -74.93 gain 116 162 -82.77 gain 162 116 -85.36 gain 116 163 -76.98 gain 163 116 -81.48 gain 116 164 -72.66 gain 164 116 -76.53 gain 116 165 -99.07 gain 165 116 -100.00 gain 116 166 -92.69 gain 166 116 -93.38 gain 116 167 -88.63 gain 167 116 -90.03 gain 116 168 -98.72 gain 168 116 -99.02 gain 116 169 -91.52 gain 169 116 -92.94 gain 116 170 -92.40 gain 170 116 -93.05 gain 116 171 -84.35 gain 171 116 -86.08 gain 116 172 -87.12 gain 172 116 -87.04 gain 116 173 -78.33 gain 173 116 -82.89 gain 116 174 -88.04 gain 174 116 -88.66 gain 116 175 -76.83 gain 175 116 -78.58 gain 116 176 -85.69 gain 176 116 -86.41 gain 116 177 -75.98 gain 177 116 -79.70 gain 116 178 -86.17 gain 178 116 -83.33 gain 116 179 -89.71 gain 179 116 -86.29 gain 116 180 -92.88 gain 180 116 -98.91 gain 116 181 -89.84 gain 181 116 -89.90 gain 116 182 -99.04 gain 182 116 -100.18 gain 116 183 -87.61 gain 183 116 -89.02 gain 116 184 -97.18 gain 184 116 -101.34 gain 116 185 -98.39 gain 185 116 -106.42 gain 116 186 -86.56 gain 186 116 -90.16 gain 116 187 -88.22 gain 187 116 -89.56 gain 116 188 -89.49 gain 188 116 -93.24 gain 116 189 -83.96 gain 189 116 -82.43 gain 116 190 -84.71 gain 190 116 -87.11 gain 116 191 -93.02 gain 191 116 -94.12 gain 116 192 -85.16 gain 192 116 -84.95 gain 116 193 -87.02 gain 193 116 -85.80 gain 116 194 -90.45 gain 194 116 -90.01 gain 116 195 -96.84 gain 195 116 -94.95 gain 116 196 -93.04 gain 196 116 -95.46 gain 116 197 -94.19 gain 197 116 -91.74 gain 116 198 -91.75 gain 198 116 -93.82 gain 116 199 -93.09 gain 199 116 -95.26 gain 116 200 -96.84 gain 200 116 -100.35 gain 116 201 -91.50 gain 201 116 -94.92 gain 116 202 -92.43 gain 202 116 -94.98 gain 116 203 -82.77 gain 203 116 -84.43 gain 116 204 -91.90 gain 204 116 -90.21 gain 116 205 -84.96 gain 205 116 -87.01 gain 116 206 -84.51 gain 206 116 -87.66 gain 116 207 -87.09 gain 207 116 -89.67 gain 116 208 -86.13 gain 208 116 -91.30 gain 116 209 -90.87 gain 209 116 -95.62 gain 116 210 -96.92 gain 210 116 -101.85 gain 116 211 -101.30 gain 211 116 -101.46 gain 116 212 -95.33 gain 212 116 -98.50 gain 116 213 -93.56 gain 213 116 -96.05 gain 116 214 -95.99 gain 214 116 -103.87 gain 116 215 -87.94 gain 215 116 -91.23 gain 116 216 -94.70 gain 216 116 -101.89 gain 116 217 -89.96 gain 217 116 -97.42 gain 116 218 -84.90 gain 218 116 -85.16 gain 116 219 -87.67 gain 219 116 -88.41 gain 116 220 -94.65 gain 220 116 -91.48 gain 116 221 -86.27 gain 221 116 -88.78 gain 116 222 -82.02 gain 222 116 -80.33 gain 116 223 -91.63 gain 223 116 -93.18 gain 116 224 -81.42 gain 224 116 -83.44 gain 117 118 -57.51 gain 118 117 -59.13 gain 117 119 -78.72 gain 119 117 -85.40 gain 117 120 -96.62 gain 120 117 -100.68 gain 117 121 -93.93 gain 121 117 -99.02 gain 117 122 -95.35 gain 122 117 -100.19 gain 117 123 -86.27 gain 123 117 -91.44 gain 117 124 -83.61 gain 124 117 -86.78 gain 117 125 -88.69 gain 125 117 -95.19 gain 117 126 -82.62 gain 126 117 -85.77 gain 117 127 -83.89 gain 127 117 -86.67 gain 117 128 -78.98 gain 128 117 -84.35 gain 117 129 -74.81 gain 129 117 -77.40 gain 117 130 -65.71 gain 130 117 -69.59 gain 117 131 -68.60 gain 131 117 -72.24 gain 117 132 -64.03 gain 132 117 -63.68 gain 117 133 -65.44 gain 133 117 -70.27 gain 117 134 -70.07 gain 134 117 -71.76 gain 117 135 -97.56 gain 135 117 -101.56 gain 117 136 -93.78 gain 136 117 -98.22 gain 117 137 -87.75 gain 137 117 -95.11 gain 117 138 -92.52 gain 138 117 -93.40 gain 117 139 -88.40 gain 139 117 -92.55 gain 117 140 -85.08 gain 140 117 -90.06 gain 117 141 -88.09 gain 141 117 -85.03 gain 117 142 -87.62 gain 142 117 -91.31 gain 117 143 -82.50 gain 143 117 -88.93 gain 117 144 -82.36 gain 144 117 -87.15 gain 117 145 -73.91 gain 145 117 -82.09 gain 117 146 -73.08 gain 146 117 -77.25 gain 117 147 -74.36 gain 147 117 -75.64 gain 117 148 -68.31 gain 148 117 -67.91 gain 117 149 -78.52 gain 149 117 -81.79 gain 117 150 -95.07 gain 150 117 -99.17 gain 117 151 -94.29 gain 151 117 -97.33 gain 117 152 -88.08 gain 152 117 -90.94 gain 117 153 -93.81 gain 153 117 -95.88 gain 117 154 -87.31 gain 154 117 -91.28 gain 117 155 -90.69 gain 155 117 -93.24 gain 117 156 -92.06 gain 156 117 -93.84 gain 117 157 -85.82 gain 157 117 -90.08 gain 117 158 -79.38 gain 158 117 -83.14 gain 117 159 -78.66 gain 159 117 -84.80 gain 117 160 -77.06 gain 160 117 -80.35 gain 117 161 -73.62 gain 161 117 -79.36 gain 117 162 -70.74 gain 162 117 -76.19 gain 117 163 -74.04 gain 163 117 -81.40 gain 117 164 -73.71 gain 164 117 -80.44 gain 117 165 -96.69 gain 165 117 -100.47 gain 117 166 -95.13 gain 166 117 -98.68 gain 117 167 -90.16 gain 167 117 -94.43 gain 117 168 -91.80 gain 168 117 -94.96 gain 117 169 -85.28 gain 169 117 -89.55 gain 117 170 -82.41 gain 170 117 -85.92 gain 117 171 -85.31 gain 171 117 -89.90 gain 117 172 -85.83 gain 172 117 -88.61 gain 117 173 -77.06 gain 173 117 -84.48 gain 117 174 -79.62 gain 174 117 -83.09 gain 117 175 -75.78 gain 175 117 -80.39 gain 117 176 -81.19 gain 176 117 -84.76 gain 117 177 -78.82 gain 177 117 -85.40 gain 117 178 -77.29 gain 178 117 -77.31 gain 117 179 -85.12 gain 179 117 -84.56 gain 117 180 -99.75 gain 180 117 -108.64 gain 117 181 -93.72 gain 181 117 -96.63 gain 117 182 -98.58 gain 182 117 -102.57 gain 117 183 -99.11 gain 183 117 -103.38 gain 117 184 -92.23 gain 184 117 -99.24 gain 117 185 -88.89 gain 185 117 -99.77 gain 117 186 -93.03 gain 186 117 -99.49 gain 117 187 -88.03 gain 187 117 -92.22 gain 117 188 -85.19 gain 188 117 -91.80 gain 117 189 -78.29 gain 189 117 -79.62 gain 117 190 -88.28 gain 190 117 -93.53 gain 117 191 -82.94 gain 191 117 -86.90 gain 117 192 -82.98 gain 192 117 -85.63 gain 117 193 -79.50 gain 193 117 -81.14 gain 117 194 -77.25 gain 194 117 -79.66 gain 117 195 -102.12 gain 195 117 -103.08 gain 117 196 -96.10 gain 196 117 -101.37 gain 117 197 -97.39 gain 197 117 -97.80 gain 117 198 -87.85 gain 198 117 -92.78 gain 117 199 -86.18 gain 199 117 -91.21 gain 117 200 -88.11 gain 200 117 -94.48 gain 117 201 -92.41 gain 201 117 -98.69 gain 117 202 -89.07 gain 202 117 -94.48 gain 117 203 -85.56 gain 203 117 -90.08 gain 117 204 -94.31 gain 204 117 -95.47 gain 117 205 -83.30 gain 205 117 -88.20 gain 117 206 -83.81 gain 206 117 -89.82 gain 117 207 -78.65 gain 207 117 -84.09 gain 117 208 -76.27 gain 208 117 -84.31 gain 117 209 -83.71 gain 209 117 -91.31 gain 117 210 -92.17 gain 210 117 -99.95 gain 117 211 -97.46 gain 211 117 -100.47 gain 117 212 -89.77 gain 212 117 -95.80 gain 117 213 -92.71 gain 213 117 -98.06 gain 117 214 -94.24 gain 214 117 -104.98 gain 117 215 -96.86 gain 215 117 -103.00 gain 117 216 -88.80 gain 216 117 -98.85 gain 117 217 -91.68 gain 217 117 -101.99 gain 117 218 -90.52 gain 218 117 -93.64 gain 117 219 -87.45 gain 219 117 -91.05 gain 117 220 -82.31 gain 220 117 -81.99 gain 117 221 -85.96 gain 221 117 -91.33 gain 117 222 -83.31 gain 222 117 -84.49 gain 117 223 -91.67 gain 223 117 -96.09 gain 117 224 -94.28 gain 224 117 -99.16 gain 118 119 -65.74 gain 119 118 -70.80 gain 118 120 -90.87 gain 120 118 -93.31 gain 118 121 -101.44 gain 121 118 -104.90 gain 118 122 -87.47 gain 122 118 -90.68 gain 118 123 -94.14 gain 123 118 -97.69 gain 118 124 -84.32 gain 124 118 -85.87 gain 118 125 -88.16 gain 125 118 -93.05 gain 118 126 -83.64 gain 126 118 -85.17 gain 118 127 -90.08 gain 127 118 -91.24 gain 118 128 -86.96 gain 128 118 -90.71 gain 118 129 -86.59 gain 129 118 -87.55 gain 118 130 -78.56 gain 130 118 -80.82 gain 118 131 -68.55 gain 131 118 -70.58 gain 118 132 -64.25 gain 132 118 -62.28 gain 118 133 -63.61 gain 133 118 -66.82 gain 118 134 -63.09 gain 134 118 -63.17 gain 118 135 -94.86 gain 135 118 -97.23 gain 118 136 -100.60 gain 136 118 -103.42 gain 118 137 -102.33 gain 137 118 -108.06 gain 118 138 -101.19 gain 138 118 -100.45 gain 118 139 -89.13 gain 139 118 -91.66 gain 118 140 -89.32 gain 140 118 -92.68 gain 118 141 -102.11 gain 141 118 -97.44 gain 118 142 -86.64 gain 142 118 -88.71 gain 118 143 -84.59 gain 143 118 -89.40 gain 118 144 -81.83 gain 144 118 -85.00 gain 118 145 -77.28 gain 145 118 -83.84 gain 118 146 -69.44 gain 146 118 -71.99 gain 118 147 -79.54 gain 147 118 -79.20 gain 118 148 -69.16 gain 148 118 -67.14 gain 118 149 -73.40 gain 149 118 -75.04 gain 118 150 -100.82 gain 150 118 -103.30 gain 118 151 -95.84 gain 151 118 -97.26 gain 118 152 -95.80 gain 152 118 -97.03 gain 118 153 -91.94 gain 153 118 -92.39 gain 118 154 -99.22 gain 154 118 -101.57 gain 118 155 -88.01 gain 155 118 -88.93 gain 118 156 -92.01 gain 156 118 -92.17 gain 118 157 -89.63 gain 157 118 -92.27 gain 118 158 -93.20 gain 158 118 -95.34 gain 118 159 -82.75 gain 159 118 -87.28 gain 118 160 -79.55 gain 160 118 -81.23 gain 118 161 -76.48 gain 161 118 -80.60 gain 118 162 -82.55 gain 162 118 -86.38 gain 118 163 -81.80 gain 163 118 -87.54 gain 118 164 -75.77 gain 164 118 -80.88 gain 118 165 -99.85 gain 165 118 -102.01 gain 118 166 -93.48 gain 166 118 -95.40 gain 118 167 -93.72 gain 167 118 -96.36 gain 118 168 -94.38 gain 168 118 -95.92 gain 118 169 -90.66 gain 169 118 -93.32 gain 118 170 -95.87 gain 170 118 -97.75 gain 118 171 -94.84 gain 171 118 -97.81 gain 118 172 -87.62 gain 172 118 -88.78 gain 118 173 -91.84 gain 173 118 -97.64 gain 118 174 -86.56 gain 174 118 -88.41 gain 118 175 -81.94 gain 175 118 -84.93 gain 118 176 -85.50 gain 176 118 -87.46 gain 118 177 -70.21 gain 177 118 -75.17 gain 118 178 -81.33 gain 178 118 -79.73 gain 118 179 -73.77 gain 179 118 -71.59 gain 118 180 -92.24 gain 180 118 -99.51 gain 118 181 -90.92 gain 181 118 -92.22 gain 118 182 -95.54 gain 182 118 -97.91 gain 118 183 -98.07 gain 183 118 -100.72 gain 118 184 -87.96 gain 184 118 -93.36 gain 118 185 -87.45 gain 185 118 -96.72 gain 118 186 -88.41 gain 186 118 -93.25 gain 118 187 -91.04 gain 187 118 -93.61 gain 118 188 -82.08 gain 188 118 -87.07 gain 118 189 -83.47 gain 189 118 -83.18 gain 118 190 -83.26 gain 190 118 -86.89 gain 118 191 -87.99 gain 191 118 -90.32 gain 118 192 -81.54 gain 192 118 -82.57 gain 118 193 -89.11 gain 193 118 -89.12 gain 118 194 -77.55 gain 194 118 -78.34 gain 118 195 -99.80 gain 195 118 -99.14 gain 118 196 -93.69 gain 196 118 -97.34 gain 118 197 -93.79 gain 197 118 -92.57 gain 118 198 -95.37 gain 198 118 -98.68 gain 118 199 -92.11 gain 199 118 -95.52 gain 118 200 -96.25 gain 200 118 -100.99 gain 118 201 -92.68 gain 201 118 -97.33 gain 118 202 -90.05 gain 202 118 -93.84 gain 118 203 -85.26 gain 203 118 -88.16 gain 118 204 -83.88 gain 204 118 -83.42 gain 118 205 -87.42 gain 205 118 -90.70 gain 118 206 -81.67 gain 206 118 -86.06 gain 118 207 -93.21 gain 207 118 -97.02 gain 118 208 -94.28 gain 208 118 -100.70 gain 118 209 -80.47 gain 209 118 -86.45 gain 118 210 -96.22 gain 210 118 -102.38 gain 118 211 -105.62 gain 211 118 -107.02 gain 118 212 -93.32 gain 212 118 -97.72 gain 118 213 -96.12 gain 213 118 -99.85 gain 118 214 -91.13 gain 214 118 -100.25 gain 118 215 -92.60 gain 215 118 -97.12 gain 118 216 -92.25 gain 216 118 -100.68 gain 118 217 -94.68 gain 217 118 -103.37 gain 118 218 -88.68 gain 218 118 -90.18 gain 118 219 -89.91 gain 219 118 -91.89 gain 118 220 -82.28 gain 220 118 -80.35 gain 118 221 -85.84 gain 221 118 -89.59 gain 118 222 -89.71 gain 222 118 -89.26 gain 118 223 -85.77 gain 223 118 -88.57 gain 118 224 -84.96 gain 224 118 -88.22 gain 119 120 -100.57 gain 120 119 -97.95 gain 119 121 -101.18 gain 121 119 -99.58 gain 119 122 -98.56 gain 122 119 -96.72 gain 119 123 -103.25 gain 123 119 -101.75 gain 119 124 -92.01 gain 124 119 -88.50 gain 119 125 -95.53 gain 125 119 -95.35 gain 119 126 -95.32 gain 126 119 -91.79 gain 119 127 -90.67 gain 127 119 -86.77 gain 119 128 -93.90 gain 128 119 -92.59 gain 119 129 -89.11 gain 129 119 -85.01 gain 119 130 -87.30 gain 130 119 -84.49 gain 119 131 -88.26 gain 131 119 -85.23 gain 119 132 -73.37 gain 132 119 -66.35 gain 119 133 -68.06 gain 133 119 -66.22 gain 119 134 -63.47 gain 134 119 -58.49 gain 119 135 -103.08 gain 135 119 -100.40 gain 119 136 -107.37 gain 136 119 -105.13 gain 119 137 -99.07 gain 137 119 -99.74 gain 119 138 -104.44 gain 138 119 -98.64 gain 119 139 -104.46 gain 139 119 -101.92 gain 119 140 -100.24 gain 140 119 -98.53 gain 119 141 -93.63 gain 141 119 -83.90 gain 119 142 -97.38 gain 142 119 -94.39 gain 119 143 -96.94 gain 143 119 -96.69 gain 119 144 -88.91 gain 144 119 -87.02 gain 119 145 -79.72 gain 145 119 -81.22 gain 119 146 -83.24 gain 146 119 -80.74 gain 119 147 -78.56 gain 147 119 -73.16 gain 119 148 -71.01 gain 148 119 -63.94 gain 119 149 -70.48 gain 149 119 -67.07 gain 119 150 -107.00 gain 150 119 -104.42 gain 119 151 -97.05 gain 151 119 -93.41 gain 119 152 -91.84 gain 152 119 -88.02 gain 119 153 -100.31 gain 153 119 -95.70 gain 119 154 -109.25 gain 154 119 -106.54 gain 119 155 -94.04 gain 155 119 -89.90 gain 119 156 -95.46 gain 156 119 -90.56 gain 119 157 -91.81 gain 157 119 -89.38 gain 119 158 -94.40 gain 158 119 -91.48 gain 119 159 -92.71 gain 159 119 -92.18 gain 119 160 -90.23 gain 160 119 -86.85 gain 119 161 -83.70 gain 161 119 -82.75 gain 119 162 -88.10 gain 162 119 -86.86 gain 119 163 -77.90 gain 163 119 -78.59 gain 119 164 -85.92 gain 164 119 -85.97 gain 119 165 -103.68 gain 165 119 -100.78 gain 119 166 -97.58 gain 166 119 -94.44 gain 119 167 -100.64 gain 167 119 -98.22 gain 119 168 -101.88 gain 168 119 -98.36 gain 119 169 -97.55 gain 169 119 -95.14 gain 119 170 -100.12 gain 170 119 -96.94 gain 119 171 -99.46 gain 171 119 -97.36 gain 119 172 -92.12 gain 172 119 -88.21 gain 119 173 -91.71 gain 173 119 -92.45 gain 119 174 -95.74 gain 174 119 -92.53 gain 119 175 -87.00 gain 175 119 -84.93 gain 119 176 -89.01 gain 176 119 -85.90 gain 119 177 -82.32 gain 177 119 -82.21 gain 119 178 -90.65 gain 178 119 -83.99 gain 119 179 -85.24 gain 179 119 -78.00 gain 119 180 -106.36 gain 180 119 -108.57 gain 119 181 -92.82 gain 181 119 -89.05 gain 119 182 -111.07 gain 182 119 -108.38 gain 119 183 -97.66 gain 183 119 -95.25 gain 119 184 -98.91 gain 184 119 -99.25 gain 119 185 -92.00 gain 185 119 -96.21 gain 119 186 -106.56 gain 186 119 -106.34 gain 119 187 -99.05 gain 187 119 -96.57 gain 119 188 -97.64 gain 188 119 -97.56 gain 119 189 -89.93 gain 189 119 -84.58 gain 119 190 -86.64 gain 190 119 -85.20 gain 119 191 -93.31 gain 191 119 -90.58 gain 119 192 -84.83 gain 192 119 -80.80 gain 119 193 -83.11 gain 193 119 -78.07 gain 119 194 -88.28 gain 194 119 -84.02 gain 119 195 -106.95 gain 195 119 -101.23 gain 119 196 -100.99 gain 196 119 -99.59 gain 119 197 -101.40 gain 197 119 -95.13 gain 119 198 -97.65 gain 198 119 -95.90 gain 119 199 -90.39 gain 199 119 -88.74 gain 119 200 -100.90 gain 200 119 -100.59 gain 119 201 -101.69 gain 201 119 -101.28 gain 119 202 -93.37 gain 202 119 -92.09 gain 119 203 -96.12 gain 203 119 -93.96 gain 119 204 -96.27 gain 204 119 -90.75 gain 119 205 -91.61 gain 205 119 -89.84 gain 119 206 -96.10 gain 206 119 -95.44 gain 119 207 -93.98 gain 207 119 -92.73 gain 119 208 -91.89 gain 208 119 -93.24 gain 119 209 -93.52 gain 209 119 -94.45 gain 119 210 -106.81 gain 210 119 -107.92 gain 119 211 -99.55 gain 211 119 -95.88 gain 119 212 -108.40 gain 212 119 -107.74 gain 119 213 -103.39 gain 213 119 -102.06 gain 119 214 -93.47 gain 214 119 -97.53 gain 119 215 -99.64 gain 215 119 -99.10 gain 119 216 -97.82 gain 216 119 -101.19 gain 119 217 -96.16 gain 217 119 -99.79 gain 119 218 -100.37 gain 218 119 -96.81 gain 119 219 -90.58 gain 219 119 -87.50 gain 119 220 -98.45 gain 220 119 -91.46 gain 119 221 -91.62 gain 221 119 -90.31 gain 119 222 -86.60 gain 222 119 -81.09 gain 119 223 -84.98 gain 223 119 -82.72 gain 119 224 -98.99 gain 224 119 -97.19 gain 120 121 -66.35 gain 121 120 -67.37 gain 120 122 -68.79 gain 122 120 -69.56 gain 120 123 -78.49 gain 123 120 -79.61 gain 120 124 -82.29 gain 124 120 -81.39 gain 120 125 -85.47 gain 125 120 -87.91 gain 120 126 -83.76 gain 126 120 -82.85 gain 120 127 -94.10 gain 127 120 -92.82 gain 120 128 -91.66 gain 128 120 -92.97 gain 120 129 -93.03 gain 129 120 -91.55 gain 120 130 -89.08 gain 130 120 -88.89 gain 120 131 -97.94 gain 131 120 -97.53 gain 120 132 -95.05 gain 132 120 -90.64 gain 120 133 -109.71 gain 133 120 -110.48 gain 120 134 -100.11 gain 134 120 -97.74 gain 120 135 -63.93 gain 135 120 -63.86 gain 120 136 -66.95 gain 136 120 -67.33 gain 120 137 -70.70 gain 137 120 -73.99 gain 120 138 -85.02 gain 138 120 -81.84 gain 120 139 -83.70 gain 139 120 -83.78 gain 120 140 -86.66 gain 140 120 -87.57 gain 120 141 -84.54 gain 141 120 -77.43 gain 120 142 -91.61 gain 142 120 -91.24 gain 120 143 -88.01 gain 143 120 -90.37 gain 120 144 -88.85 gain 144 120 -89.58 gain 120 145 -98.29 gain 145 120 -102.41 gain 120 146 -93.77 gain 146 120 -93.88 gain 120 147 -93.80 gain 147 120 -91.02 gain 120 148 -97.49 gain 148 120 -93.03 gain 120 149 -103.44 gain 149 120 -102.64 gain 120 150 -67.22 gain 150 120 -67.25 gain 120 151 -78.98 gain 151 120 -77.96 gain 120 152 -76.12 gain 152 120 -74.92 gain 120 153 -83.19 gain 153 120 -81.20 gain 120 154 -84.88 gain 154 120 -84.79 gain 120 155 -88.97 gain 155 120 -87.45 gain 120 156 -91.24 gain 156 120 -88.96 gain 120 157 -92.59 gain 157 120 -92.78 gain 120 158 -93.09 gain 158 120 -92.79 gain 120 159 -88.16 gain 159 120 -90.24 gain 120 160 -101.75 gain 160 120 -100.98 gain 120 161 -99.52 gain 161 120 -101.20 gain 120 162 -102.29 gain 162 120 -103.67 gain 120 163 -99.10 gain 163 120 -102.40 gain 120 164 -99.35 gain 164 120 -102.02 gain 120 165 -81.54 gain 165 120 -81.27 gain 120 166 -77.56 gain 166 120 -77.03 gain 120 167 -84.16 gain 167 120 -84.36 gain 120 168 -83.09 gain 168 120 -82.19 gain 120 169 -84.15 gain 169 120 -84.36 gain 120 170 -85.67 gain 170 120 -85.11 gain 120 171 -88.83 gain 171 120 -89.35 gain 120 172 -85.99 gain 172 120 -84.70 gain 120 173 -89.98 gain 173 120 -93.34 gain 120 174 -93.13 gain 174 120 -92.53 gain 120 175 -94.26 gain 175 120 -94.80 gain 120 176 -100.48 gain 176 120 -99.99 gain 120 177 -97.60 gain 177 120 -100.11 gain 120 178 -111.20 gain 178 120 -107.16 gain 120 179 -105.51 gain 179 120 -100.89 gain 120 180 -77.42 gain 180 120 -82.24 gain 120 181 -82.33 gain 181 120 -81.18 gain 120 182 -89.20 gain 182 120 -89.13 gain 120 183 -91.34 gain 183 120 -91.55 gain 120 184 -87.13 gain 184 120 -90.08 gain 120 185 -94.75 gain 185 120 -101.57 gain 120 186 -90.29 gain 186 120 -92.69 gain 120 187 -91.07 gain 187 120 -91.20 gain 120 188 -92.05 gain 188 120 -94.60 gain 120 189 -98.97 gain 189 120 -96.24 gain 120 190 -102.99 gain 190 120 -104.17 gain 120 191 -89.91 gain 191 120 -89.80 gain 120 192 -94.55 gain 192 120 -93.13 gain 120 193 -105.95 gain 193 120 -103.52 gain 120 194 -106.29 gain 194 120 -104.64 gain 120 195 -88.29 gain 195 120 -85.19 gain 120 196 -90.47 gain 196 120 -91.68 gain 120 197 -82.94 gain 197 120 -79.28 gain 120 198 -88.40 gain 198 120 -89.26 gain 120 199 -97.92 gain 199 120 -98.88 gain 120 200 -89.77 gain 200 120 -92.07 gain 120 201 -96.05 gain 201 120 -98.26 gain 120 202 -95.23 gain 202 120 -96.58 gain 120 203 -95.92 gain 203 120 -96.38 gain 120 204 -95.99 gain 204 120 -93.09 gain 120 205 -93.25 gain 205 120 -94.10 gain 120 206 -98.95 gain 206 120 -100.90 gain 120 207 -96.70 gain 207 120 -98.07 gain 120 208 -98.61 gain 208 120 -102.59 gain 120 209 -101.39 gain 209 120 -104.93 gain 120 210 -87.65 gain 210 120 -91.37 gain 120 211 -87.84 gain 211 120 -86.79 gain 120 212 -92.44 gain 212 120 -94.40 gain 120 213 -88.91 gain 213 120 -90.20 gain 120 214 -93.41 gain 214 120 -100.08 gain 120 215 -83.38 gain 215 120 -85.45 gain 120 216 -93.17 gain 216 120 -99.15 gain 120 217 -92.96 gain 217 120 -99.21 gain 120 218 -95.02 gain 218 120 -94.08 gain 120 219 -99.16 gain 219 120 -98.70 gain 120 220 -101.62 gain 220 120 -97.24 gain 120 221 -96.66 gain 221 120 -97.96 gain 120 222 -108.22 gain 222 120 -105.33 gain 120 223 -101.17 gain 223 120 -101.52 gain 120 224 -103.70 gain 224 120 -104.52 gain 121 122 -64.52 gain 122 121 -64.27 gain 121 123 -76.24 gain 123 121 -76.33 gain 121 124 -78.28 gain 124 121 -76.36 gain 121 125 -86.04 gain 125 121 -87.46 gain 121 126 -87.26 gain 126 121 -85.33 gain 121 127 -96.87 gain 127 121 -94.56 gain 121 128 -90.80 gain 128 121 -91.08 gain 121 129 -95.64 gain 129 121 -93.14 gain 121 130 -90.79 gain 130 121 -89.58 gain 121 131 -99.27 gain 131 121 -97.83 gain 121 132 -92.95 gain 132 121 -87.52 gain 121 133 -99.67 gain 133 121 -99.42 gain 121 134 -100.61 gain 134 121 -97.21 gain 121 135 -68.70 gain 135 121 -67.61 gain 121 136 -65.43 gain 136 121 -64.79 gain 121 137 -69.47 gain 137 121 -71.73 gain 121 138 -72.67 gain 138 121 -68.47 gain 121 139 -81.39 gain 139 121 -80.45 gain 121 140 -83.90 gain 140 121 -83.79 gain 121 141 -85.33 gain 141 121 -77.19 gain 121 142 -92.72 gain 142 121 -91.33 gain 121 143 -94.95 gain 143 121 -96.29 gain 121 144 -93.68 gain 144 121 -93.39 gain 121 145 -92.23 gain 145 121 -95.33 gain 121 146 -99.61 gain 146 121 -98.69 gain 121 147 -96.39 gain 147 121 -92.58 gain 121 148 -102.00 gain 148 121 -96.52 gain 121 149 -94.72 gain 149 121 -92.90 gain 121 150 -75.69 gain 150 121 -74.71 gain 121 151 -81.14 gain 151 121 -79.09 gain 121 152 -77.34 gain 152 121 -75.11 gain 121 153 -82.13 gain 153 121 -79.12 gain 121 154 -75.09 gain 154 121 -73.98 gain 121 155 -86.02 gain 155 121 -83.48 gain 121 156 -85.50 gain 156 121 -82.19 gain 121 157 -94.65 gain 157 121 -93.83 gain 121 158 -89.43 gain 158 121 -88.10 gain 121 159 -96.11 gain 159 121 -97.16 gain 121 160 -87.83 gain 160 121 -86.04 gain 121 161 -95.66 gain 161 121 -96.31 gain 121 162 -97.39 gain 162 121 -97.75 gain 121 163 -97.52 gain 163 121 -99.80 gain 121 164 -96.13 gain 164 121 -97.78 gain 121 165 -84.69 gain 165 121 -83.39 gain 121 166 -81.83 gain 166 121 -80.28 gain 121 167 -86.44 gain 167 121 -85.62 gain 121 168 -85.81 gain 168 121 -83.88 gain 121 169 -84.52 gain 169 121 -83.70 gain 121 170 -90.58 gain 170 121 -89.00 gain 121 171 -87.97 gain 171 121 -87.47 gain 121 172 -86.20 gain 172 121 -83.88 gain 121 173 -92.14 gain 173 121 -94.48 gain 121 174 -100.54 gain 174 121 -98.92 gain 121 175 -95.12 gain 175 121 -94.64 gain 121 176 -97.35 gain 176 121 -95.84 gain 121 177 -101.17 gain 177 121 -102.66 gain 121 178 -98.54 gain 178 121 -93.47 gain 121 179 -98.18 gain 179 121 -92.54 gain 121 180 -86.65 gain 180 121 -90.46 gain 121 181 -84.69 gain 181 121 -82.51 gain 121 182 -81.64 gain 182 121 -80.55 gain 121 183 -85.24 gain 183 121 -84.42 gain 121 184 -82.02 gain 184 121 -83.95 gain 121 185 -93.71 gain 185 121 -99.50 gain 121 186 -92.26 gain 186 121 -93.63 gain 121 187 -92.53 gain 187 121 -91.64 gain 121 188 -88.11 gain 188 121 -89.63 gain 121 189 -98.10 gain 189 121 -94.35 gain 121 190 -88.50 gain 190 121 -88.66 gain 121 191 -98.66 gain 191 121 -97.53 gain 121 192 -93.66 gain 192 121 -91.22 gain 121 193 -98.03 gain 193 121 -94.58 gain 121 194 -99.38 gain 194 121 -96.71 gain 121 195 -88.31 gain 195 121 -84.18 gain 121 196 -86.36 gain 196 121 -86.55 gain 121 197 -80.52 gain 197 121 -75.84 gain 121 198 -86.68 gain 198 121 -86.52 gain 121 199 -90.32 gain 199 121 -90.27 gain 121 200 -87.57 gain 200 121 -88.85 gain 121 201 -94.12 gain 201 121 -95.31 gain 121 202 -93.66 gain 202 121 -93.98 gain 121 203 -85.91 gain 203 121 -85.35 gain 121 204 -93.79 gain 204 121 -89.87 gain 121 205 -93.20 gain 205 121 -93.02 gain 121 206 -92.10 gain 206 121 -93.03 gain 121 207 -101.45 gain 207 121 -101.80 gain 121 208 -97.06 gain 208 121 -100.01 gain 121 209 -98.86 gain 209 121 -101.38 gain 121 210 -87.98 gain 210 121 -90.68 gain 121 211 -91.18 gain 211 121 -89.10 gain 121 212 -85.41 gain 212 121 -86.35 gain 121 213 -87.99 gain 213 121 -88.26 gain 121 214 -94.61 gain 214 121 -100.27 gain 121 215 -93.14 gain 215 121 -94.20 gain 121 216 -86.98 gain 216 121 -91.94 gain 121 217 -93.45 gain 217 121 -98.68 gain 121 218 -94.26 gain 218 121 -92.30 gain 121 219 -100.14 gain 219 121 -98.66 gain 121 220 -105.62 gain 220 121 -100.22 gain 121 221 -104.14 gain 221 121 -104.42 gain 121 222 -99.63 gain 222 121 -95.72 gain 121 223 -101.86 gain 223 121 -101.19 gain 121 224 -104.08 gain 224 121 -103.87 gain 122 123 -63.54 gain 123 122 -63.88 gain 122 124 -75.21 gain 124 122 -73.54 gain 122 125 -85.10 gain 125 122 -86.77 gain 122 126 -84.96 gain 126 122 -83.28 gain 122 127 -85.72 gain 127 122 -83.66 gain 122 128 -84.87 gain 128 122 -85.41 gain 122 129 -81.31 gain 129 122 -79.06 gain 122 130 -84.55 gain 130 122 -83.59 gain 122 131 -99.44 gain 131 122 -98.25 gain 122 132 -99.40 gain 132 122 -94.22 gain 122 133 -97.07 gain 133 122 -97.07 gain 122 134 -97.33 gain 134 122 -94.18 gain 122 135 -74.92 gain 135 122 -74.08 gain 122 136 -72.16 gain 136 122 -71.76 gain 122 137 -61.50 gain 137 122 -64.02 gain 122 138 -65.60 gain 138 122 -61.65 gain 122 139 -75.30 gain 139 122 -74.62 gain 122 140 -79.07 gain 140 122 -79.20 gain 122 141 -94.55 gain 141 122 -86.66 gain 122 142 -87.74 gain 142 122 -86.59 gain 122 143 -86.31 gain 143 122 -87.90 gain 122 144 -91.47 gain 144 122 -91.43 gain 122 145 -91.10 gain 145 122 -94.45 gain 122 146 -96.11 gain 146 122 -95.44 gain 122 147 -98.49 gain 147 122 -94.93 gain 122 148 -97.58 gain 148 122 -92.35 gain 122 149 -105.28 gain 149 122 -103.71 gain 122 150 -77.29 gain 150 122 -76.55 gain 122 151 -72.42 gain 151 122 -70.63 gain 122 152 -71.20 gain 152 122 -69.22 gain 122 153 -69.46 gain 153 122 -66.69 gain 122 154 -80.47 gain 154 122 -79.61 gain 122 155 -80.40 gain 155 122 -78.11 gain 122 156 -88.83 gain 156 122 -85.77 gain 122 157 -79.68 gain 157 122 -79.10 gain 122 158 -91.91 gain 158 122 -90.83 gain 122 159 -88.18 gain 159 122 -89.48 gain 122 160 -93.12 gain 160 122 -91.58 gain 122 161 -90.96 gain 161 122 -91.86 gain 122 162 -95.57 gain 162 122 -96.18 gain 122 163 -102.45 gain 163 122 -104.97 gain 122 164 -98.21 gain 164 122 -100.10 gain 122 165 -78.67 gain 165 122 -77.62 gain 122 166 -87.82 gain 166 122 -86.52 gain 122 167 -83.46 gain 167 122 -82.89 gain 122 168 -78.68 gain 168 122 -77.00 gain 122 169 -82.10 gain 169 122 -81.53 gain 122 170 -78.84 gain 170 122 -77.51 gain 122 171 -85.57 gain 171 122 -85.32 gain 122 172 -94.04 gain 172 122 -91.97 gain 122 173 -91.37 gain 173 122 -93.96 gain 122 174 -95.62 gain 174 122 -94.25 gain 122 175 -98.77 gain 175 122 -98.54 gain 122 176 -90.04 gain 176 122 -88.78 gain 122 177 -95.46 gain 177 122 -97.20 gain 122 178 -95.82 gain 178 122 -91.00 gain 122 179 -98.65 gain 179 122 -93.25 gain 122 180 -91.37 gain 180 122 -95.42 gain 122 181 -86.22 gain 181 122 -84.30 gain 122 182 -88.28 gain 182 122 -87.44 gain 122 183 -78.35 gain 183 122 -77.79 gain 122 184 -80.13 gain 184 122 -82.31 gain 122 185 -82.18 gain 185 122 -88.23 gain 122 186 -84.13 gain 186 122 -85.75 gain 122 187 -87.21 gain 187 122 -86.56 gain 122 188 -90.94 gain 188 122 -92.71 gain 122 189 -93.99 gain 189 122 -90.48 gain 122 190 -91.48 gain 190 122 -91.89 gain 122 191 -94.14 gain 191 122 -93.26 gain 122 192 -97.71 gain 192 122 -95.52 gain 122 193 -98.88 gain 193 122 -95.68 gain 122 194 -100.08 gain 194 122 -97.66 gain 122 195 -88.94 gain 195 122 -85.07 gain 122 196 -88.21 gain 196 122 -88.65 gain 122 197 -88.74 gain 197 122 -84.31 gain 122 198 -83.78 gain 198 122 -83.87 gain 122 199 -84.09 gain 199 122 -84.28 gain 122 200 -89.13 gain 200 122 -90.66 gain 122 201 -87.96 gain 201 122 -89.40 gain 122 202 -93.78 gain 202 122 -94.35 gain 122 203 -94.56 gain 203 122 -94.24 gain 122 204 -93.06 gain 204 122 -89.39 gain 122 205 -97.23 gain 205 122 -97.30 gain 122 206 -94.22 gain 206 122 -95.40 gain 122 207 -95.51 gain 207 122 -96.11 gain 122 208 -97.72 gain 208 122 -100.91 gain 122 209 -101.40 gain 209 122 -104.17 gain 122 210 -90.62 gain 210 122 -93.56 gain 122 211 -86.77 gain 211 122 -84.95 gain 122 212 -80.79 gain 212 122 -81.98 gain 122 213 -92.95 gain 213 122 -93.46 gain 122 214 -92.20 gain 214 122 -98.10 gain 122 215 -86.86 gain 215 122 -88.16 gain 122 216 -89.71 gain 216 122 -94.92 gain 122 217 -96.03 gain 217 122 -101.50 gain 122 218 -89.51 gain 218 122 -87.79 gain 122 219 -97.73 gain 219 122 -96.49 gain 122 220 -99.08 gain 220 122 -93.93 gain 122 221 -99.88 gain 221 122 -100.41 gain 122 222 -100.40 gain 222 122 -96.74 gain 122 223 -93.02 gain 223 122 -92.60 gain 122 224 -98.46 gain 224 122 -98.51 gain 123 124 -62.71 gain 124 123 -60.70 gain 123 125 -80.90 gain 125 123 -82.23 gain 123 126 -84.23 gain 126 123 -82.21 gain 123 127 -92.97 gain 127 123 -90.57 gain 123 128 -83.38 gain 128 123 -83.58 gain 123 129 -85.60 gain 129 123 -83.00 gain 123 130 -90.36 gain 130 123 -89.06 gain 123 131 -94.71 gain 131 123 -93.18 gain 123 132 -96.96 gain 132 123 -91.44 gain 123 133 -90.79 gain 133 123 -90.44 gain 123 134 -93.99 gain 134 123 -90.50 gain 123 135 -76.01 gain 135 123 -74.84 gain 123 136 -80.71 gain 136 123 -79.97 gain 123 137 -69.48 gain 137 123 -71.66 gain 123 138 -72.30 gain 138 123 -68.01 gain 123 139 -70.88 gain 139 123 -69.85 gain 123 140 -80.17 gain 140 123 -79.97 gain 123 141 -76.81 gain 141 123 -68.58 gain 123 142 -79.72 gain 142 123 -78.23 gain 123 143 -85.72 gain 143 123 -86.97 gain 123 144 -89.91 gain 144 123 -89.53 gain 123 145 -98.45 gain 145 123 -101.45 gain 123 146 -90.51 gain 146 123 -89.50 gain 123 147 -93.01 gain 147 123 -89.12 gain 123 148 -92.20 gain 148 123 -86.63 gain 123 149 -99.47 gain 149 123 -97.56 gain 123 150 -89.75 gain 150 123 -88.67 gain 123 151 -71.41 gain 151 123 -69.28 gain 123 152 -78.77 gain 152 123 -76.45 gain 123 153 -76.44 gain 153 123 -73.33 gain 123 154 -77.43 gain 154 123 -76.22 gain 123 155 -80.28 gain 155 123 -77.65 gain 123 156 -77.29 gain 156 123 -73.89 gain 123 157 -86.08 gain 157 123 -85.16 gain 123 158 -88.61 gain 158 123 -87.19 gain 123 159 -91.34 gain 159 123 -92.31 gain 123 160 -96.41 gain 160 123 -94.53 gain 123 161 -89.67 gain 161 123 -90.23 gain 123 162 -97.51 gain 162 123 -97.78 gain 123 163 -100.63 gain 163 123 -102.81 gain 123 164 -101.97 gain 164 123 -103.53 gain 123 165 -78.12 gain 165 123 -76.73 gain 123 166 -84.69 gain 166 123 -83.05 gain 123 167 -82.85 gain 167 123 -81.94 gain 123 168 -82.02 gain 168 123 -80.00 gain 123 169 -80.83 gain 169 123 -79.92 gain 123 170 -78.96 gain 170 123 -77.29 gain 123 171 -88.59 gain 171 123 -88.00 gain 123 172 -85.22 gain 172 123 -82.82 gain 123 173 -85.40 gain 173 123 -87.65 gain 123 174 -96.08 gain 174 123 -94.37 gain 123 175 -95.99 gain 175 123 -95.42 gain 123 176 -91.67 gain 176 123 -90.07 gain 123 177 -92.23 gain 177 123 -93.63 gain 123 178 -98.80 gain 178 123 -93.64 gain 123 179 -95.67 gain 179 123 -89.93 gain 123 180 -95.28 gain 180 123 -98.99 gain 123 181 -91.94 gain 181 123 -89.67 gain 123 182 -87.68 gain 182 123 -86.50 gain 123 183 -82.32 gain 183 123 -81.41 gain 123 184 -76.47 gain 184 123 -78.31 gain 123 185 -91.44 gain 185 123 -97.15 gain 123 186 -82.09 gain 186 123 -83.38 gain 123 187 -78.56 gain 187 123 -77.58 gain 123 188 -89.55 gain 188 123 -90.98 gain 123 189 -97.96 gain 189 123 -94.12 gain 123 190 -94.79 gain 190 123 -94.86 gain 123 191 -97.36 gain 191 123 -96.14 gain 123 192 -95.06 gain 192 123 -92.53 gain 123 193 -96.05 gain 193 123 -92.51 gain 123 194 -96.95 gain 194 123 -94.19 gain 123 195 -84.67 gain 195 123 -80.46 gain 123 196 -82.48 gain 196 123 -82.57 gain 123 197 -92.11 gain 197 123 -87.35 gain 123 198 -82.90 gain 198 123 -82.64 gain 123 199 -94.06 gain 199 123 -93.92 gain 123 200 -82.08 gain 200 123 -83.27 gain 123 201 -86.10 gain 201 123 -87.20 gain 123 202 -88.66 gain 202 123 -88.89 gain 123 203 -83.74 gain 203 123 -83.08 gain 123 204 -92.93 gain 204 123 -88.92 gain 123 205 -99.44 gain 205 123 -99.17 gain 123 206 -100.64 gain 206 123 -101.47 gain 123 207 -95.11 gain 207 123 -95.37 gain 123 208 -95.80 gain 208 123 -98.66 gain 123 209 -104.97 gain 209 123 -107.40 gain 123 210 -95.16 gain 210 123 -97.76 gain 123 211 -85.87 gain 211 123 -83.70 gain 123 212 -94.70 gain 212 123 -95.55 gain 123 213 -84.40 gain 213 123 -84.58 gain 123 214 -86.18 gain 214 123 -91.74 gain 123 215 -91.79 gain 215 123 -92.75 gain 123 216 -96.61 gain 216 123 -101.48 gain 123 217 -91.79 gain 217 123 -96.93 gain 123 218 -88.69 gain 218 123 -86.63 gain 123 219 -89.44 gain 219 123 -87.87 gain 123 220 -97.10 gain 220 123 -91.61 gain 123 221 -99.79 gain 221 123 -99.98 gain 123 222 -101.57 gain 222 123 -97.57 gain 123 223 -95.14 gain 223 123 -94.38 gain 123 224 -93.12 gain 224 123 -92.83 gain 124 125 -66.33 gain 125 124 -69.67 gain 124 126 -72.39 gain 126 124 -72.38 gain 124 127 -81.81 gain 127 124 -81.42 gain 124 128 -80.48 gain 128 124 -82.69 gain 124 129 -88.10 gain 129 124 -87.52 gain 124 130 -83.07 gain 130 124 -83.78 gain 124 131 -92.32 gain 131 124 -92.80 gain 124 132 -87.96 gain 132 124 -84.45 gain 124 133 -100.52 gain 133 124 -102.19 gain 124 134 -93.57 gain 134 124 -92.10 gain 124 135 -84.19 gain 135 124 -85.02 gain 124 136 -81.30 gain 136 124 -82.57 gain 124 137 -73.04 gain 137 124 -77.22 gain 124 138 -70.83 gain 138 124 -68.55 gain 124 139 -59.20 gain 139 124 -60.19 gain 124 140 -70.22 gain 140 124 -72.03 gain 124 141 -78.61 gain 141 124 -72.40 gain 124 142 -82.97 gain 142 124 -83.50 gain 124 143 -77.18 gain 143 124 -80.44 gain 124 144 -85.25 gain 144 124 -86.88 gain 124 145 -86.48 gain 145 124 -91.50 gain 124 146 -91.61 gain 146 124 -92.62 gain 124 147 -90.26 gain 147 124 -88.37 gain 124 148 -87.35 gain 148 124 -83.79 gain 124 149 -90.62 gain 149 124 -90.72 gain 124 150 -87.63 gain 150 124 -88.56 gain 124 151 -82.76 gain 151 124 -82.63 gain 124 152 -74.36 gain 152 124 -74.05 gain 124 153 -71.33 gain 153 124 -70.24 gain 124 154 -75.43 gain 154 124 -76.24 gain 124 155 -69.51 gain 155 124 -68.89 gain 124 156 -82.94 gain 156 124 -81.55 gain 124 157 -84.40 gain 157 124 -85.49 gain 124 158 -83.09 gain 158 124 -83.68 gain 124 159 -83.91 gain 159 124 -86.89 gain 124 160 -83.11 gain 160 124 -83.24 gain 124 161 -96.12 gain 161 124 -98.69 gain 124 162 -95.79 gain 162 124 -98.07 gain 124 163 -99.89 gain 163 124 -104.08 gain 124 164 -91.35 gain 164 124 -94.91 gain 124 165 -82.23 gain 165 124 -82.85 gain 124 166 -87.80 gain 166 124 -88.17 gain 124 167 -91.09 gain 167 124 -92.19 gain 124 168 -75.73 gain 168 124 -75.72 gain 124 169 -72.95 gain 169 124 -74.05 gain 124 170 -81.11 gain 170 124 -81.45 gain 124 171 -87.09 gain 171 124 -88.51 gain 124 172 -80.36 gain 172 124 -79.97 gain 124 173 -92.44 gain 173 124 -96.70 gain 124 174 -85.45 gain 174 124 -85.75 gain 124 175 -92.82 gain 175 124 -94.26 gain 124 176 -94.28 gain 176 124 -94.69 gain 124 177 -94.59 gain 177 124 -98.00 gain 124 178 -94.60 gain 178 124 -91.45 gain 124 179 -87.38 gain 179 124 -83.65 gain 124 180 -86.57 gain 180 124 -92.29 gain 124 181 -86.69 gain 181 124 -86.44 gain 124 182 -87.09 gain 182 124 -87.92 gain 124 183 -85.05 gain 183 124 -86.15 gain 124 184 -83.24 gain 184 124 -87.09 gain 124 185 -84.01 gain 185 124 -91.73 gain 124 186 -84.60 gain 186 124 -87.90 gain 124 187 -77.34 gain 187 124 -78.37 gain 124 188 -89.64 gain 188 124 -93.08 gain 124 189 -89.34 gain 189 124 -87.51 gain 124 190 -100.03 gain 190 124 -102.11 gain 124 191 -84.22 gain 191 124 -85.00 gain 124 192 -92.46 gain 192 124 -91.94 gain 124 193 -94.21 gain 193 124 -92.68 gain 124 194 -96.56 gain 194 124 -95.81 gain 124 195 -82.67 gain 195 124 -80.47 gain 124 196 -85.44 gain 196 124 -87.55 gain 124 197 -85.41 gain 197 124 -82.65 gain 124 198 -80.77 gain 198 124 -82.53 gain 124 199 -80.24 gain 199 124 -82.10 gain 124 200 -82.07 gain 200 124 -85.27 gain 124 201 -88.49 gain 201 124 -91.60 gain 124 202 -95.85 gain 202 124 -98.10 gain 124 203 -90.48 gain 203 124 -91.84 gain 124 204 -95.20 gain 204 124 -93.20 gain 124 205 -95.50 gain 205 124 -97.24 gain 124 206 -102.04 gain 206 124 -104.89 gain 124 207 -95.10 gain 207 124 -97.37 gain 124 208 -90.86 gain 208 124 -95.73 gain 124 209 -95.78 gain 209 124 -100.22 gain 124 210 -91.29 gain 210 124 -95.90 gain 124 211 -90.19 gain 211 124 -90.04 gain 124 212 -82.29 gain 212 124 -85.15 gain 124 213 -84.96 gain 213 124 -87.14 gain 124 214 -95.92 gain 214 124 -103.50 gain 124 215 -89.17 gain 215 124 -92.15 gain 124 216 -81.97 gain 216 124 -88.85 gain 124 217 -92.24 gain 217 124 -99.39 gain 124 218 -88.89 gain 218 124 -88.84 gain 124 219 -92.77 gain 219 124 -93.20 gain 124 220 -93.65 gain 220 124 -90.18 gain 124 221 -91.25 gain 221 124 -93.45 gain 124 222 -92.26 gain 222 124 -90.26 gain 124 223 -90.81 gain 223 124 -92.06 gain 124 224 -98.65 gain 224 124 -100.37 gain 125 126 -62.67 gain 126 125 -59.32 gain 125 127 -74.04 gain 127 125 -70.32 gain 125 128 -84.17 gain 128 125 -83.04 gain 125 129 -83.77 gain 129 125 -79.85 gain 125 130 -92.41 gain 130 125 -89.78 gain 125 131 -90.26 gain 131 125 -87.40 gain 125 132 -94.25 gain 132 125 -87.40 gain 125 133 -90.68 gain 133 125 -89.01 gain 125 134 -90.57 gain 134 125 -85.76 gain 125 135 -85.44 gain 135 125 -82.93 gain 125 136 -84.16 gain 136 125 -82.10 gain 125 137 -75.53 gain 137 125 -76.38 gain 125 138 -75.67 gain 138 125 -70.05 gain 125 139 -68.19 gain 139 125 -65.84 gain 125 140 -64.19 gain 140 125 -62.66 gain 125 141 -72.51 gain 141 125 -62.96 gain 125 142 -78.04 gain 142 125 -75.23 gain 125 143 -79.67 gain 143 125 -79.60 gain 125 144 -87.73 gain 144 125 -86.02 gain 125 145 -93.07 gain 145 125 -94.74 gain 125 146 -96.03 gain 146 125 -93.70 gain 125 147 -90.88 gain 147 125 -85.65 gain 125 148 -96.25 gain 148 125 -89.35 gain 125 149 -96.98 gain 149 125 -93.74 gain 125 150 -89.36 gain 150 125 -86.96 gain 125 151 -94.99 gain 151 125 -91.53 gain 125 152 -87.33 gain 152 125 -83.68 gain 125 153 -90.81 gain 153 125 -86.38 gain 125 154 -80.02 gain 154 125 -77.49 gain 125 155 -81.03 gain 155 125 -77.07 gain 125 156 -72.84 gain 156 125 -68.11 gain 125 157 -84.39 gain 157 125 -82.15 gain 125 158 -78.89 gain 158 125 -76.14 gain 125 159 -88.50 gain 159 125 -88.14 gain 125 160 -82.14 gain 160 125 -78.94 gain 125 161 -91.71 gain 161 125 -90.95 gain 125 162 -96.93 gain 162 125 -95.88 gain 125 163 -90.84 gain 163 125 -91.69 gain 125 164 -98.18 gain 164 125 -98.40 gain 125 165 -85.35 gain 165 125 -82.64 gain 125 166 -88.69 gain 166 125 -85.73 gain 125 167 -81.91 gain 167 125 -79.67 gain 125 168 -74.13 gain 168 125 -70.78 gain 125 169 -79.39 gain 169 125 -77.16 gain 125 170 -80.92 gain 170 125 -77.93 gain 125 171 -76.06 gain 171 125 -74.14 gain 125 172 -87.89 gain 172 125 -84.16 gain 125 173 -85.77 gain 173 125 -86.68 gain 125 174 -90.49 gain 174 125 -87.45 gain 125 175 -92.23 gain 175 125 -90.33 gain 125 176 -97.89 gain 176 125 -94.96 gain 125 177 -92.51 gain 177 125 -92.59 gain 125 178 -94.32 gain 178 125 -87.83 gain 125 179 -94.43 gain 179 125 -87.37 gain 125 180 -88.48 gain 180 125 -90.86 gain 125 181 -87.47 gain 181 125 -83.88 gain 125 182 -90.28 gain 182 125 -87.77 gain 125 183 -93.49 gain 183 125 -91.26 gain 125 184 -87.15 gain 184 125 -87.66 gain 125 185 -86.97 gain 185 125 -91.36 gain 125 186 -83.96 gain 186 125 -83.92 gain 125 187 -89.85 gain 187 125 -87.54 gain 125 188 -86.61 gain 188 125 -86.71 gain 125 189 -88.93 gain 189 125 -83.75 gain 125 190 -84.97 gain 190 125 -83.71 gain 125 191 -91.72 gain 191 125 -89.17 gain 125 192 -92.70 gain 192 125 -88.85 gain 125 193 -94.57 gain 193 125 -89.70 gain 125 194 -100.11 gain 194 125 -96.02 gain 125 195 -94.88 gain 195 125 -89.34 gain 125 196 -88.33 gain 196 125 -87.10 gain 125 197 -88.84 gain 197 125 -82.75 gain 125 198 -87.28 gain 198 125 -85.69 gain 125 199 -91.10 gain 199 125 -89.63 gain 125 200 -96.63 gain 200 125 -96.49 gain 125 201 -88.50 gain 201 125 -88.27 gain 125 202 -93.33 gain 202 125 -92.24 gain 125 203 -87.77 gain 203 125 -85.79 gain 125 204 -97.14 gain 204 125 -91.80 gain 125 205 -90.04 gain 205 125 -88.45 gain 125 206 -92.25 gain 206 125 -91.76 gain 125 207 -94.83 gain 207 125 -93.76 gain 125 208 -97.48 gain 208 125 -99.02 gain 125 209 -95.72 gain 209 125 -96.82 gain 125 210 -94.98 gain 210 125 -96.26 gain 125 211 -90.68 gain 211 125 -87.19 gain 125 212 -87.74 gain 212 125 -87.26 gain 125 213 -77.92 gain 213 125 -76.77 gain 125 214 -96.01 gain 214 125 -100.25 gain 125 215 -91.69 gain 215 125 -91.32 gain 125 216 -94.03 gain 216 125 -97.58 gain 125 217 -97.23 gain 217 125 -101.04 gain 125 218 -93.17 gain 218 125 -89.79 gain 125 219 -87.88 gain 219 125 -84.97 gain 125 220 -93.60 gain 220 125 -86.79 gain 125 221 -96.97 gain 221 125 -95.84 gain 125 222 -100.06 gain 222 125 -94.73 gain 125 223 -102.88 gain 223 125 -100.79 gain 125 224 -101.86 gain 224 125 -100.24 gain 126 127 -62.08 gain 127 126 -61.71 gain 126 128 -76.63 gain 128 126 -78.85 gain 126 129 -78.79 gain 129 126 -78.22 gain 126 130 -81.97 gain 130 126 -82.69 gain 126 131 -92.33 gain 131 126 -92.82 gain 126 132 -81.15 gain 132 126 -77.66 gain 126 133 -92.21 gain 133 126 -93.89 gain 126 134 -88.60 gain 134 126 -87.14 gain 126 135 -85.88 gain 135 126 -86.73 gain 126 136 -84.39 gain 136 126 -85.68 gain 126 137 -83.18 gain 137 126 -87.38 gain 126 138 -78.17 gain 138 126 -75.90 gain 126 139 -67.99 gain 139 126 -68.99 gain 126 140 -72.71 gain 140 126 -74.53 gain 126 141 -61.66 gain 141 126 -55.46 gain 126 142 -73.59 gain 142 126 -74.13 gain 126 143 -69.97 gain 143 126 -73.24 gain 126 144 -81.64 gain 144 126 -83.28 gain 126 145 -72.95 gain 145 126 -77.98 gain 126 146 -79.60 gain 146 126 -80.62 gain 126 147 -87.86 gain 147 126 -85.99 gain 126 148 -91.54 gain 148 126 -87.99 gain 126 149 -92.48 gain 149 126 -92.59 gain 126 150 -87.84 gain 150 126 -88.79 gain 126 151 -82.37 gain 151 126 -82.26 gain 126 152 -90.13 gain 152 126 -89.84 gain 126 153 -85.20 gain 153 126 -84.12 gain 126 154 -71.14 gain 154 126 -71.96 gain 126 155 -73.92 gain 155 126 -73.32 gain 126 156 -69.84 gain 156 126 -68.47 gain 126 157 -68.70 gain 157 126 -69.81 gain 126 158 -79.65 gain 158 126 -80.25 gain 126 159 -79.14 gain 159 126 -82.13 gain 126 160 -87.75 gain 160 126 -87.89 gain 126 161 -80.70 gain 161 126 -83.29 gain 126 162 -86.64 gain 162 126 -88.94 gain 126 163 -93.40 gain 163 126 -97.61 gain 126 164 -94.38 gain 164 126 -97.96 gain 126 165 -91.46 gain 165 126 -92.10 gain 126 166 -86.32 gain 166 126 -86.71 gain 126 167 -90.32 gain 167 126 -91.43 gain 126 168 -83.15 gain 168 126 -83.15 gain 126 169 -85.35 gain 169 126 -86.47 gain 126 170 -79.09 gain 170 126 -79.44 gain 126 171 -78.99 gain 171 126 -80.43 gain 126 172 -75.50 gain 172 126 -75.12 gain 126 173 -73.40 gain 173 126 -77.67 gain 126 174 -83.52 gain 174 126 -83.84 gain 126 175 -86.65 gain 175 126 -88.10 gain 126 176 -85.72 gain 176 126 -86.14 gain 126 177 -89.52 gain 177 126 -92.95 gain 126 178 -97.06 gain 178 126 -93.93 gain 126 179 -94.35 gain 179 126 -90.64 gain 126 180 -88.26 gain 180 126 -94.00 gain 126 181 -88.84 gain 181 126 -88.60 gain 126 182 -91.52 gain 182 126 -92.36 gain 126 183 -90.40 gain 183 126 -91.51 gain 126 184 -79.50 gain 184 126 -83.36 gain 126 185 -81.08 gain 185 126 -88.81 gain 126 186 -87.83 gain 186 126 -91.14 gain 126 187 -82.62 gain 187 126 -83.66 gain 126 188 -82.06 gain 188 126 -85.51 gain 126 189 -78.97 gain 189 126 -77.14 gain 126 190 -84.21 gain 190 126 -86.31 gain 126 191 -87.49 gain 191 126 -88.29 gain 126 192 -86.55 gain 192 126 -86.05 gain 126 193 -93.36 gain 193 126 -91.84 gain 126 194 -89.43 gain 194 126 -88.69 gain 126 195 -88.53 gain 195 126 -86.34 gain 126 196 -85.88 gain 196 126 -88.00 gain 126 197 -83.07 gain 197 126 -80.33 gain 126 198 -84.27 gain 198 126 -86.04 gain 126 199 -86.12 gain 199 126 -88.00 gain 126 200 -83.74 gain 200 126 -86.96 gain 126 201 -84.33 gain 201 126 -87.46 gain 126 202 -83.55 gain 202 126 -85.80 gain 126 203 -85.96 gain 203 126 -87.33 gain 126 204 -86.34 gain 204 126 -84.35 gain 126 205 -92.35 gain 205 126 -94.11 gain 126 206 -85.40 gain 206 126 -88.26 gain 126 207 -96.81 gain 207 126 -99.09 gain 126 208 -96.81 gain 208 126 -101.70 gain 126 209 -83.65 gain 209 126 -88.10 gain 126 210 -90.41 gain 210 126 -95.04 gain 126 211 -90.93 gain 211 126 -90.79 gain 126 212 -92.05 gain 212 126 -94.93 gain 126 213 -87.12 gain 213 126 -89.32 gain 126 214 -91.13 gain 214 126 -98.71 gain 126 215 -92.96 gain 215 126 -95.95 gain 126 216 -80.19 gain 216 126 -87.08 gain 126 217 -86.44 gain 217 126 -93.60 gain 126 218 -93.50 gain 218 126 -93.46 gain 126 219 -90.74 gain 219 126 -91.19 gain 126 220 -91.14 gain 220 126 -87.68 gain 126 221 -88.19 gain 221 126 -90.40 gain 126 222 -97.32 gain 222 126 -95.34 gain 126 223 -91.17 gain 223 126 -92.44 gain 126 224 -95.25 gain 224 126 -96.98 gain 127 128 -61.95 gain 128 127 -64.54 gain 127 129 -73.68 gain 129 127 -73.48 gain 127 130 -81.53 gain 130 127 -82.63 gain 127 131 -73.68 gain 131 127 -74.55 gain 127 132 -82.47 gain 132 127 -79.35 gain 127 133 -79.95 gain 133 127 -82.00 gain 127 134 -88.65 gain 134 127 -87.56 gain 127 135 -89.36 gain 135 127 -90.58 gain 127 136 -86.45 gain 136 127 -88.11 gain 127 137 -80.64 gain 137 127 -85.22 gain 127 138 -87.42 gain 138 127 -85.52 gain 127 139 -76.42 gain 139 127 -77.79 gain 127 140 -82.36 gain 140 127 -84.56 gain 127 141 -75.49 gain 141 127 -69.66 gain 127 142 -66.96 gain 142 127 -67.87 gain 127 143 -65.54 gain 143 127 -69.19 gain 127 144 -72.47 gain 144 127 -74.49 gain 127 145 -80.40 gain 145 127 -85.81 gain 127 146 -90.90 gain 146 127 -92.30 gain 127 147 -82.56 gain 147 127 -81.06 gain 127 148 -84.06 gain 148 127 -80.89 gain 127 149 -93.35 gain 149 127 -93.83 gain 127 150 -89.63 gain 150 127 -90.96 gain 127 151 -83.33 gain 151 127 -83.59 gain 127 152 -88.17 gain 152 127 -88.24 gain 127 153 -87.67 gain 153 127 -86.96 gain 127 154 -80.34 gain 154 127 -81.54 gain 127 155 -77.47 gain 155 127 -77.23 gain 127 156 -77.23 gain 156 127 -76.23 gain 127 157 -78.70 gain 157 127 -80.18 gain 127 158 -76.13 gain 158 127 -77.11 gain 127 159 -75.72 gain 159 127 -79.08 gain 127 160 -78.66 gain 160 127 -79.17 gain 127 161 -83.63 gain 161 127 -86.59 gain 127 162 -81.94 gain 162 127 -84.60 gain 127 163 -89.58 gain 163 127 -94.17 gain 127 164 -96.43 gain 164 127 -100.38 gain 127 165 -89.07 gain 165 127 -90.08 gain 127 166 -89.93 gain 166 127 -90.69 gain 127 167 -84.94 gain 167 127 -86.43 gain 127 168 -81.40 gain 168 127 -81.78 gain 127 169 -85.56 gain 169 127 -87.05 gain 127 170 -68.81 gain 170 127 -69.54 gain 127 171 -78.36 gain 171 127 -80.16 gain 127 172 -75.31 gain 172 127 -75.30 gain 127 173 -81.96 gain 173 127 -86.61 gain 127 174 -76.59 gain 174 127 -77.28 gain 127 175 -79.76 gain 175 127 -81.59 gain 127 176 -81.68 gain 176 127 -82.48 gain 127 177 -83.01 gain 177 127 -86.81 gain 127 178 -88.44 gain 178 127 -85.68 gain 127 179 -86.04 gain 179 127 -82.70 gain 127 180 -90.22 gain 180 127 -96.33 gain 127 181 -83.27 gain 181 127 -83.40 gain 127 182 -91.45 gain 182 127 -92.67 gain 127 183 -88.05 gain 183 127 -89.54 gain 127 184 -90.67 gain 184 127 -94.91 gain 127 185 -82.65 gain 185 127 -90.76 gain 127 186 -78.03 gain 186 127 -81.71 gain 127 187 -75.95 gain 187 127 -77.36 gain 127 188 -82.36 gain 188 127 -86.18 gain 127 189 -82.84 gain 189 127 -81.39 gain 127 190 -87.67 gain 190 127 -90.14 gain 127 191 -92.77 gain 191 127 -93.94 gain 127 192 -95.77 gain 192 127 -95.64 gain 127 193 -91.24 gain 193 127 -90.10 gain 127 194 -80.37 gain 194 127 -80.01 gain 127 195 -93.77 gain 195 127 -91.95 gain 127 196 -90.17 gain 196 127 -92.67 gain 127 197 -85.71 gain 197 127 -83.34 gain 127 198 -85.42 gain 198 127 -87.56 gain 127 199 -89.39 gain 199 127 -91.64 gain 127 200 -88.20 gain 200 127 -91.78 gain 127 201 -85.43 gain 201 127 -88.93 gain 127 202 -91.68 gain 202 127 -94.31 gain 127 203 -87.95 gain 203 127 -89.69 gain 127 204 -87.59 gain 204 127 -85.98 gain 127 205 -89.06 gain 205 127 -91.19 gain 127 206 -88.11 gain 206 127 -91.34 gain 127 207 -91.39 gain 207 127 -94.05 gain 127 208 -91.82 gain 208 127 -97.07 gain 127 209 -84.00 gain 209 127 -88.82 gain 127 210 -87.17 gain 210 127 -92.17 gain 127 211 -90.28 gain 211 127 -90.51 gain 127 212 -93.70 gain 212 127 -96.95 gain 127 213 -87.02 gain 213 127 -89.59 gain 127 214 -88.28 gain 214 127 -96.24 gain 127 215 -84.24 gain 215 127 -87.60 gain 127 216 -85.04 gain 216 127 -92.31 gain 127 217 -87.05 gain 217 127 -94.58 gain 127 218 -91.39 gain 218 127 -91.73 gain 127 219 -82.50 gain 219 127 -83.32 gain 127 220 -84.78 gain 220 127 -81.69 gain 127 221 -89.13 gain 221 127 -91.72 gain 127 222 -92.39 gain 222 127 -90.78 gain 127 223 -95.71 gain 223 127 -97.34 gain 127 224 -90.07 gain 224 127 -92.17 gain 128 129 -65.95 gain 129 128 -63.16 gain 128 130 -70.97 gain 130 128 -69.48 gain 128 131 -76.94 gain 131 128 -75.21 gain 128 132 -84.38 gain 132 128 -78.66 gain 128 133 -87.77 gain 133 128 -87.23 gain 128 134 -85.26 gain 134 128 -81.58 gain 128 135 -89.41 gain 135 128 -88.04 gain 128 136 -88.85 gain 136 128 -87.91 gain 128 137 -88.07 gain 137 128 -90.05 gain 128 138 -90.90 gain 138 128 -86.41 gain 128 139 -83.57 gain 139 128 -82.35 gain 128 140 -84.74 gain 140 128 -84.34 gain 128 141 -74.14 gain 141 128 -65.72 gain 128 142 -76.93 gain 142 128 -75.25 gain 128 143 -61.41 gain 143 128 -62.47 gain 128 144 -68.65 gain 144 128 -68.07 gain 128 145 -80.29 gain 145 128 -83.09 gain 128 146 -82.70 gain 146 128 -81.50 gain 128 147 -87.54 gain 147 128 -83.45 gain 128 148 -95.91 gain 148 128 -90.14 gain 128 149 -95.50 gain 149 128 -93.39 gain 128 150 -101.28 gain 150 128 -100.00 gain 128 151 -91.64 gain 151 128 -89.31 gain 128 152 -92.35 gain 152 128 -89.84 gain 128 153 -91.93 gain 153 128 -88.63 gain 128 154 -91.74 gain 154 128 -90.34 gain 128 155 -83.99 gain 155 128 -81.16 gain 128 156 -81.82 gain 156 128 -78.23 gain 128 157 -85.68 gain 157 128 -84.56 gain 128 158 -77.48 gain 158 128 -75.87 gain 128 159 -78.03 gain 159 128 -78.80 gain 128 160 -79.54 gain 160 128 -77.47 gain 128 161 -79.13 gain 161 128 -79.49 gain 128 162 -82.94 gain 162 128 -83.02 gain 128 163 -85.14 gain 163 128 -87.13 gain 128 164 -93.62 gain 164 128 -94.98 gain 128 165 -96.54 gain 165 128 -94.96 gain 128 166 -88.67 gain 166 128 -86.83 gain 128 167 -96.43 gain 167 128 -95.32 gain 128 168 -81.23 gain 168 128 -79.02 gain 128 169 -89.56 gain 169 128 -88.46 gain 128 170 -84.59 gain 170 128 -82.72 gain 128 171 -85.98 gain 171 128 -85.19 gain 128 172 -83.40 gain 172 128 -80.80 gain 128 173 -87.64 gain 173 128 -89.69 gain 128 174 -80.50 gain 174 128 -78.60 gain 128 175 -83.32 gain 175 128 -82.55 gain 128 176 -81.80 gain 176 128 -80.00 gain 128 177 -87.90 gain 177 128 -89.10 gain 128 178 -85.38 gain 178 128 -80.02 gain 128 179 -88.28 gain 179 128 -82.34 gain 128 180 -91.84 gain 180 128 -95.35 gain 128 181 -91.85 gain 181 128 -89.39 gain 128 182 -88.09 gain 182 128 -86.72 gain 128 183 -87.40 gain 183 128 -86.30 gain 128 184 -89.12 gain 184 128 -90.77 gain 128 185 -87.27 gain 185 128 -92.78 gain 128 186 -80.59 gain 186 128 -81.68 gain 128 187 -86.05 gain 187 128 -84.87 gain 128 188 -86.46 gain 188 128 -87.69 gain 128 189 -89.61 gain 189 128 -85.57 gain 128 190 -80.56 gain 190 128 -80.44 gain 128 191 -89.89 gain 191 128 -88.47 gain 128 192 -88.67 gain 192 128 -85.95 gain 128 193 -92.23 gain 193 128 -88.49 gain 128 194 -89.48 gain 194 128 -86.52 gain 128 195 -97.92 gain 195 128 -93.51 gain 128 196 -91.37 gain 196 128 -91.28 gain 128 197 -98.50 gain 197 128 -93.53 gain 128 198 -84.02 gain 198 128 -83.57 gain 128 199 -77.67 gain 199 128 -77.32 gain 128 200 -86.93 gain 200 128 -87.92 gain 128 201 -92.20 gain 201 128 -93.10 gain 128 202 -93.56 gain 202 128 -93.59 gain 128 203 -89.03 gain 203 128 -88.18 gain 128 204 -86.60 gain 204 128 -82.39 gain 128 205 -85.06 gain 205 128 -84.59 gain 128 206 -87.61 gain 206 128 -88.25 gain 128 207 -87.49 gain 207 128 -87.55 gain 128 208 -93.75 gain 208 128 -96.41 gain 128 209 -93.69 gain 209 128 -95.92 gain 128 210 -97.30 gain 210 128 -99.71 gain 128 211 -91.28 gain 211 128 -88.92 gain 128 212 -87.17 gain 212 128 -87.83 gain 128 213 -88.21 gain 213 128 -88.19 gain 128 214 -92.28 gain 214 128 -97.65 gain 128 215 -91.28 gain 215 128 -92.05 gain 128 216 -85.35 gain 216 128 -90.03 gain 128 217 -93.78 gain 217 128 -98.72 gain 128 218 -90.35 gain 218 128 -88.10 gain 128 219 -88.52 gain 219 128 -86.74 gain 128 220 -84.05 gain 220 128 -78.37 gain 128 221 -91.26 gain 221 128 -91.25 gain 128 222 -87.60 gain 222 128 -83.40 gain 128 223 -100.72 gain 223 128 -99.76 gain 128 224 -94.27 gain 224 128 -93.78 gain 129 130 -71.60 gain 130 129 -72.89 gain 129 131 -74.54 gain 131 129 -75.61 gain 129 132 -70.99 gain 132 129 -68.07 gain 129 133 -73.16 gain 133 129 -75.41 gain 129 134 -86.70 gain 134 129 -85.81 gain 129 135 -94.50 gain 135 129 -95.91 gain 129 136 -86.54 gain 136 129 -88.39 gain 129 137 -83.85 gain 137 129 -88.62 gain 129 138 -91.15 gain 138 129 -89.45 gain 129 139 -83.40 gain 139 129 -84.96 gain 129 140 -82.43 gain 140 129 -84.83 gain 129 141 -74.16 gain 141 129 -68.53 gain 129 142 -67.18 gain 142 129 -68.29 gain 129 143 -72.58 gain 143 129 -76.42 gain 129 144 -68.37 gain 144 129 -70.58 gain 129 145 -69.90 gain 145 129 -75.50 gain 129 146 -69.62 gain 146 129 -71.20 gain 129 147 -79.22 gain 147 129 -77.91 gain 129 148 -85.44 gain 148 129 -82.46 gain 129 149 -84.16 gain 149 129 -84.84 gain 129 150 -91.46 gain 150 129 -92.97 gain 129 151 -86.19 gain 151 129 -86.65 gain 129 152 -91.95 gain 152 129 -92.22 gain 129 153 -88.39 gain 153 129 -87.88 gain 129 154 -83.17 gain 154 129 -84.56 gain 129 155 -86.57 gain 155 129 -86.54 gain 129 156 -82.04 gain 156 129 -81.24 gain 129 157 -70.76 gain 157 129 -72.44 gain 129 158 -78.40 gain 158 129 -79.58 gain 129 159 -72.99 gain 159 129 -76.55 gain 129 160 -76.54 gain 160 129 -77.25 gain 129 161 -78.13 gain 161 129 -81.28 gain 129 162 -81.02 gain 162 129 -83.88 gain 129 163 -83.71 gain 163 129 -88.49 gain 129 164 -83.32 gain 164 129 -87.47 gain 129 165 -88.60 gain 165 129 -89.81 gain 129 166 -100.00 gain 166 129 -100.96 gain 129 167 -90.74 gain 167 129 -92.42 gain 129 168 -82.50 gain 168 129 -83.08 gain 129 169 -82.47 gain 169 129 -84.16 gain 129 170 -83.23 gain 170 129 -84.15 gain 129 171 -84.18 gain 171 129 -86.18 gain 129 172 -81.64 gain 172 129 -81.83 gain 129 173 -72.36 gain 173 129 -77.20 gain 129 174 -79.07 gain 174 129 -79.96 gain 129 175 -76.83 gain 175 129 -78.85 gain 129 176 -76.09 gain 176 129 -77.08 gain 129 177 -86.75 gain 177 129 -90.74 gain 129 178 -85.71 gain 178 129 -83.15 gain 129 179 -93.68 gain 179 129 -90.53 gain 129 180 -97.00 gain 180 129 -103.30 gain 129 181 -87.05 gain 181 129 -87.38 gain 129 182 -95.57 gain 182 129 -96.99 gain 129 183 -81.59 gain 183 129 -83.28 gain 129 184 -89.60 gain 184 129 -94.03 gain 129 185 -88.21 gain 185 129 -96.51 gain 129 186 -82.74 gain 186 129 -86.62 gain 129 187 -90.68 gain 187 129 -92.29 gain 129 188 -75.44 gain 188 129 -79.46 gain 129 189 -83.69 gain 189 129 -82.44 gain 129 190 -85.61 gain 190 129 -88.28 gain 129 191 -81.42 gain 191 129 -82.79 gain 129 192 -86.85 gain 192 129 -86.92 gain 129 193 -87.15 gain 193 129 -86.20 gain 129 194 -99.42 gain 194 129 -99.26 gain 129 195 -100.66 gain 195 129 -99.04 gain 129 196 -87.28 gain 196 129 -89.97 gain 129 197 -87.01 gain 197 129 -84.83 gain 129 198 -93.96 gain 198 129 -96.30 gain 129 199 -87.34 gain 199 129 -89.78 gain 129 200 -90.54 gain 200 129 -94.33 gain 129 201 -86.05 gain 201 129 -89.74 gain 129 202 -88.21 gain 202 129 -91.04 gain 129 203 -89.88 gain 203 129 -91.82 gain 129 204 -87.16 gain 204 129 -85.74 gain 129 205 -88.90 gain 205 129 -91.23 gain 129 206 -89.76 gain 206 129 -93.19 gain 129 207 -92.89 gain 207 129 -95.74 gain 129 208 -88.31 gain 208 129 -93.76 gain 129 209 -85.01 gain 209 129 -90.03 gain 129 210 -98.80 gain 210 129 -104.00 gain 129 211 -92.43 gain 211 129 -92.86 gain 129 212 -92.41 gain 212 129 -95.85 gain 129 213 -95.40 gain 213 129 -98.17 gain 129 214 -89.61 gain 214 129 -97.77 gain 129 215 -89.29 gain 215 129 -92.85 gain 129 216 -86.37 gain 216 129 -93.84 gain 129 217 -95.17 gain 217 129 -102.90 gain 129 218 -84.98 gain 218 129 -85.52 gain 129 219 -84.23 gain 219 129 -85.25 gain 129 220 -90.23 gain 220 129 -87.34 gain 129 221 -91.62 gain 221 129 -94.41 gain 129 222 -86.22 gain 222 129 -84.81 gain 129 223 -90.74 gain 223 129 -92.58 gain 129 224 -88.79 gain 224 129 -91.09 gain 130 131 -64.45 gain 131 130 -64.23 gain 130 132 -67.45 gain 132 130 -63.23 gain 130 133 -75.10 gain 133 130 -76.06 gain 130 134 -87.91 gain 134 130 -85.73 gain 130 135 -93.99 gain 135 130 -94.12 gain 130 136 -90.67 gain 136 130 -91.23 gain 130 137 -92.87 gain 137 130 -96.35 gain 130 138 -100.16 gain 138 130 -97.17 gain 130 139 -88.92 gain 139 130 -89.19 gain 130 140 -90.95 gain 140 130 -92.05 gain 130 141 -82.95 gain 141 130 -76.02 gain 130 142 -80.55 gain 142 130 -80.36 gain 130 143 -76.91 gain 143 130 -79.47 gain 130 144 -77.38 gain 144 130 -78.30 gain 130 145 -68.17 gain 145 130 -72.48 gain 130 146 -60.25 gain 146 130 -60.55 gain 130 147 -77.10 gain 147 130 -74.50 gain 130 148 -76.33 gain 148 130 -72.06 gain 130 149 -86.29 gain 149 130 -85.68 gain 130 150 -94.79 gain 150 130 -95.01 gain 130 151 -93.71 gain 151 130 -92.88 gain 130 152 -88.37 gain 152 130 -87.35 gain 130 153 -101.17 gain 153 130 -99.37 gain 130 154 -85.73 gain 154 130 -85.83 gain 130 155 -89.39 gain 155 130 -88.07 gain 130 156 -91.00 gain 156 130 -88.90 gain 130 157 -79.61 gain 157 130 -79.99 gain 130 158 -80.69 gain 158 130 -80.57 gain 130 159 -76.52 gain 159 130 -78.79 gain 130 160 -70.46 gain 160 130 -69.89 gain 130 161 -79.63 gain 161 130 -81.49 gain 130 162 -75.94 gain 162 130 -77.51 gain 130 163 -81.94 gain 163 130 -85.42 gain 130 164 -84.36 gain 164 130 -87.22 gain 130 165 -97.42 gain 165 130 -97.33 gain 130 166 -93.97 gain 166 130 -93.63 gain 130 167 -94.54 gain 167 130 -94.93 gain 130 168 -90.95 gain 168 130 -90.24 gain 130 169 -98.41 gain 169 130 -98.81 gain 130 170 -85.34 gain 170 130 -84.97 gain 130 171 -82.87 gain 171 130 -83.59 gain 130 172 -81.20 gain 172 130 -80.10 gain 130 173 -78.44 gain 173 130 -81.99 gain 130 174 -79.77 gain 174 130 -79.37 gain 130 175 -85.77 gain 175 130 -86.50 gain 130 176 -79.18 gain 176 130 -78.88 gain 130 177 -84.31 gain 177 130 -87.01 gain 130 178 -80.01 gain 178 130 -76.15 gain 130 179 -88.02 gain 179 130 -83.59 gain 130 180 -97.38 gain 180 130 -102.40 gain 130 181 -93.65 gain 181 130 -92.68 gain 130 182 -91.23 gain 182 130 -91.35 gain 130 183 -90.93 gain 183 130 -91.32 gain 130 184 -93.48 gain 184 130 -96.62 gain 130 185 -91.76 gain 185 130 -98.77 gain 130 186 -81.98 gain 186 130 -84.57 gain 130 187 -86.12 gain 187 130 -86.44 gain 130 188 -90.10 gain 188 130 -92.84 gain 130 189 -84.96 gain 189 130 -82.42 gain 130 190 -72.57 gain 190 130 -73.94 gain 130 191 -83.89 gain 191 130 -83.97 gain 130 192 -80.72 gain 192 130 -79.49 gain 130 193 -88.70 gain 193 130 -86.46 gain 130 194 -88.97 gain 194 130 -87.52 gain 130 195 -96.47 gain 195 130 -93.56 gain 130 196 -97.99 gain 196 130 -99.39 gain 130 197 -101.12 gain 197 130 -97.66 gain 130 198 -91.57 gain 198 130 -92.62 gain 130 199 -94.54 gain 199 130 -95.69 gain 130 200 -93.75 gain 200 130 -96.24 gain 130 201 -89.67 gain 201 130 -92.07 gain 130 202 -86.23 gain 202 130 -87.77 gain 130 203 -88.99 gain 203 130 -89.64 gain 130 204 -82.96 gain 204 130 -80.25 gain 130 205 -89.44 gain 205 130 -90.47 gain 130 206 -86.61 gain 206 130 -88.75 gain 130 207 -87.74 gain 207 130 -89.30 gain 130 208 -84.56 gain 208 130 -88.72 gain 130 209 -91.28 gain 209 130 -95.01 gain 130 210 -96.08 gain 210 130 -99.99 gain 130 211 -94.72 gain 211 130 -93.86 gain 130 212 -96.71 gain 212 130 -98.86 gain 130 213 -96.17 gain 213 130 -97.65 gain 130 214 -88.82 gain 214 130 -95.68 gain 130 215 -87.75 gain 215 130 -90.02 gain 130 216 -83.49 gain 216 130 -89.67 gain 130 217 -94.04 gain 217 130 -100.48 gain 130 218 -93.01 gain 218 130 -92.26 gain 130 219 -91.17 gain 219 130 -90.90 gain 130 220 -89.59 gain 220 130 -85.40 gain 130 221 -84.96 gain 221 130 -86.45 gain 130 222 -90.69 gain 222 130 -87.99 gain 130 223 -84.92 gain 223 130 -85.46 gain 130 224 -98.71 gain 224 130 -99.72 gain 131 132 -67.09 gain 132 131 -63.10 gain 131 133 -70.75 gain 133 131 -71.93 gain 131 134 -79.75 gain 134 131 -77.80 gain 131 135 -92.56 gain 135 131 -92.91 gain 131 136 -89.57 gain 136 131 -90.36 gain 131 137 -94.38 gain 137 131 -98.08 gain 131 138 -96.11 gain 138 131 -93.35 gain 131 139 -89.01 gain 139 131 -89.51 gain 131 140 -94.74 gain 140 131 -96.07 gain 131 141 -85.37 gain 141 131 -78.68 gain 131 142 -84.64 gain 142 131 -84.68 gain 131 143 -77.62 gain 143 131 -80.40 gain 131 144 -77.91 gain 144 131 -79.05 gain 131 145 -65.82 gain 145 131 -70.35 gain 131 146 -61.56 gain 146 131 -62.08 gain 131 147 -66.63 gain 147 131 -64.26 gain 131 148 -71.39 gain 148 131 -67.35 gain 131 149 -70.61 gain 149 131 -70.23 gain 131 150 -94.70 gain 150 131 -95.15 gain 131 151 -100.08 gain 151 131 -99.47 gain 131 152 -96.53 gain 152 131 -95.74 gain 131 153 -92.36 gain 153 131 -90.78 gain 131 154 -87.90 gain 154 131 -88.23 gain 131 155 -89.66 gain 155 131 -88.56 gain 131 156 -80.47 gain 156 131 -78.61 gain 131 157 -84.65 gain 157 131 -85.26 gain 131 158 -79.70 gain 158 131 -79.81 gain 131 159 -67.48 gain 159 131 -69.97 gain 131 160 -80.43 gain 160 131 -80.08 gain 131 161 -81.49 gain 161 131 -83.58 gain 131 162 -86.27 gain 162 131 -88.06 gain 131 163 -80.63 gain 163 131 -84.35 gain 131 164 -72.52 gain 164 131 -75.60 gain 131 165 -102.16 gain 165 131 -102.30 gain 131 166 -90.91 gain 166 131 -90.80 gain 131 167 -95.87 gain 167 131 -96.49 gain 131 168 -95.73 gain 168 131 -95.24 gain 131 169 -95.40 gain 169 131 -96.02 gain 131 170 -88.30 gain 170 131 -88.16 gain 131 171 -91.75 gain 171 131 -92.69 gain 131 172 -82.39 gain 172 131 -81.52 gain 131 173 -95.34 gain 173 131 -99.12 gain 131 174 -82.64 gain 174 131 -82.46 gain 131 175 -68.13 gain 175 131 -69.08 gain 131 176 -76.28 gain 176 131 -76.21 gain 131 177 -77.30 gain 177 131 -80.23 gain 131 178 -81.53 gain 178 131 -77.90 gain 131 179 -82.76 gain 179 131 -78.55 gain 131 180 -96.91 gain 180 131 -102.15 gain 131 181 -95.41 gain 181 131 -94.67 gain 131 182 -98.36 gain 182 131 -98.71 gain 131 183 -95.53 gain 183 131 -96.16 gain 131 184 -80.34 gain 184 131 -83.71 gain 131 185 -89.75 gain 185 131 -96.99 gain 131 186 -98.01 gain 186 131 -100.82 gain 131 187 -86.27 gain 187 131 -86.81 gain 131 188 -85.87 gain 188 131 -88.83 gain 131 189 -80.03 gain 189 131 -77.72 gain 131 190 -76.25 gain 190 131 -77.85 gain 131 191 -79.07 gain 191 131 -79.37 gain 131 192 -81.38 gain 192 131 -80.38 gain 131 193 -87.85 gain 193 131 -85.84 gain 131 194 -85.08 gain 194 131 -83.85 gain 131 195 -98.77 gain 195 131 -96.09 gain 131 196 -94.94 gain 196 131 -96.57 gain 131 197 -94.93 gain 197 131 -91.69 gain 131 198 -90.92 gain 198 131 -92.20 gain 131 199 -97.25 gain 199 131 -98.63 gain 131 200 -95.51 gain 200 131 -98.23 gain 131 201 -88.63 gain 201 131 -91.26 gain 131 202 -91.64 gain 202 131 -93.40 gain 131 203 -85.17 gain 203 131 -86.04 gain 131 204 -93.27 gain 204 131 -90.79 gain 131 205 -75.98 gain 205 131 -77.24 gain 131 206 -84.00 gain 206 131 -86.36 gain 131 207 -88.42 gain 207 131 -90.20 gain 131 208 -88.73 gain 208 131 -93.11 gain 131 209 -79.95 gain 209 131 -83.90 gain 131 210 -99.80 gain 210 131 -103.93 gain 131 211 -97.69 gain 211 131 -97.05 gain 131 212 -91.88 gain 212 131 -94.25 gain 131 213 -93.74 gain 213 131 -95.45 gain 131 214 -93.13 gain 214 131 -100.22 gain 131 215 -90.54 gain 215 131 -93.03 gain 131 216 -84.03 gain 216 131 -90.43 gain 131 217 -95.72 gain 217 131 -102.39 gain 131 218 -89.37 gain 218 131 -88.84 gain 131 219 -88.22 gain 219 131 -88.17 gain 131 220 -88.57 gain 220 131 -84.61 gain 131 221 -78.62 gain 221 131 -80.34 gain 131 222 -92.13 gain 222 131 -89.65 gain 131 223 -86.75 gain 223 131 -87.52 gain 131 224 -86.72 gain 224 131 -87.96 gain 132 133 -58.89 gain 133 132 -64.06 gain 132 134 -70.58 gain 134 132 -72.62 gain 132 135 -89.84 gain 135 132 -94.18 gain 132 136 -94.26 gain 136 132 -99.04 gain 132 137 -88.02 gain 137 132 -95.72 gain 132 138 -90.59 gain 138 132 -91.81 gain 132 139 -81.55 gain 139 132 -86.04 gain 132 140 -87.67 gain 140 132 -92.99 gain 132 141 -82.60 gain 141 132 -79.89 gain 132 142 -75.55 gain 142 132 -79.59 gain 132 143 -78.85 gain 143 132 -85.62 gain 132 144 -77.88 gain 144 132 -83.02 gain 132 145 -70.45 gain 145 132 -78.98 gain 132 146 -64.92 gain 146 132 -69.43 gain 132 147 -57.71 gain 147 132 -59.34 gain 132 148 -61.36 gain 148 132 -61.32 gain 132 149 -73.92 gain 149 132 -77.53 gain 132 150 -88.84 gain 150 132 -93.28 gain 132 151 -89.83 gain 151 132 -93.22 gain 132 152 -97.09 gain 152 132 -100.29 gain 132 153 -88.29 gain 153 132 -90.70 gain 132 154 -77.24 gain 154 132 -81.55 gain 132 155 -91.61 gain 155 132 -94.50 gain 132 156 -80.58 gain 156 132 -82.70 gain 132 157 -80.37 gain 157 132 -84.97 gain 132 158 -88.35 gain 158 132 -92.45 gain 132 159 -74.76 gain 159 132 -81.25 gain 132 160 -67.86 gain 160 132 -71.50 gain 132 161 -71.19 gain 161 132 -77.27 gain 132 162 -72.06 gain 162 132 -77.86 gain 132 163 -74.01 gain 163 132 -81.71 gain 132 164 -74.91 gain 164 132 -81.99 gain 132 165 -97.73 gain 165 132 -101.87 gain 132 166 -94.33 gain 166 132 -98.22 gain 132 167 -87.38 gain 167 132 -91.99 gain 132 168 -91.88 gain 168 132 -95.38 gain 132 169 -86.41 gain 169 132 -91.03 gain 132 170 -86.69 gain 170 132 -90.54 gain 132 171 -85.40 gain 171 132 -90.33 gain 132 172 -86.84 gain 172 132 -89.95 gain 132 173 -87.39 gain 173 132 -95.16 gain 132 174 -76.59 gain 174 132 -80.40 gain 132 175 -76.24 gain 175 132 -81.19 gain 132 176 -75.14 gain 176 132 -79.06 gain 132 177 -81.40 gain 177 132 -88.32 gain 132 178 -73.53 gain 178 132 -73.89 gain 132 179 -73.37 gain 179 132 -73.15 gain 132 180 -98.88 gain 180 132 -108.11 gain 132 181 -92.11 gain 181 132 -95.36 gain 132 182 -89.48 gain 182 132 -93.82 gain 132 183 -92.44 gain 183 132 -97.05 gain 132 184 -94.56 gain 184 132 -101.92 gain 132 185 -87.28 gain 185 132 -98.51 gain 132 186 -84.54 gain 186 132 -91.35 gain 132 187 -74.08 gain 187 132 -78.62 gain 132 188 -85.00 gain 188 132 -91.95 gain 132 189 -85.23 gain 189 132 -86.90 gain 132 190 -77.17 gain 190 132 -82.76 gain 132 191 -82.32 gain 191 132 -86.62 gain 132 192 -73.00 gain 192 132 -75.99 gain 132 193 -77.28 gain 193 132 -79.26 gain 132 194 -78.79 gain 194 132 -81.55 gain 132 195 -90.71 gain 195 132 -92.02 gain 132 196 -97.22 gain 196 132 -102.84 gain 132 197 -84.59 gain 197 132 -85.34 gain 132 198 -91.79 gain 198 132 -97.06 gain 132 199 -83.73 gain 199 132 -89.11 gain 132 200 -86.95 gain 200 132 -93.66 gain 132 201 -91.40 gain 201 132 -98.02 gain 132 202 -86.11 gain 202 132 -91.86 gain 132 203 -92.18 gain 203 132 -97.05 gain 132 204 -85.97 gain 204 132 -87.48 gain 132 205 -79.54 gain 205 132 -84.80 gain 132 206 -81.02 gain 206 132 -87.38 gain 132 207 -76.46 gain 207 132 -82.24 gain 132 208 -76.59 gain 208 132 -84.97 gain 132 209 -74.94 gain 209 132 -82.89 gain 132 210 -97.32 gain 210 132 -105.45 gain 132 211 -100.22 gain 211 132 -103.58 gain 132 212 -95.01 gain 212 132 -101.38 gain 132 213 -93.04 gain 213 132 -98.73 gain 132 214 -92.23 gain 214 132 -103.31 gain 132 215 -89.67 gain 215 132 -96.16 gain 132 216 -87.67 gain 216 132 -98.07 gain 132 217 -87.22 gain 217 132 -97.87 gain 132 218 -81.79 gain 218 132 -85.26 gain 132 219 -96.69 gain 219 132 -100.64 gain 132 220 -81.41 gain 220 132 -81.44 gain 132 221 -87.13 gain 221 132 -92.85 gain 132 222 -78.63 gain 222 132 -80.15 gain 132 223 -91.62 gain 223 132 -96.38 gain 132 224 -83.50 gain 224 132 -88.73 gain 133 134 -67.31 gain 134 133 -64.17 gain 133 135 -99.35 gain 135 133 -98.51 gain 133 136 -105.56 gain 136 133 -105.17 gain 133 137 -98.71 gain 137 133 -101.23 gain 133 138 -96.01 gain 138 133 -92.06 gain 133 139 -97.22 gain 139 133 -96.54 gain 133 140 -91.40 gain 140 133 -91.54 gain 133 141 -90.36 gain 141 133 -82.48 gain 133 142 -86.89 gain 142 133 -85.75 gain 133 143 -89.50 gain 143 133 -91.10 gain 133 144 -81.42 gain 144 133 -81.38 gain 133 145 -80.60 gain 145 133 -83.95 gain 133 146 -75.79 gain 146 133 -75.13 gain 133 147 -74.48 gain 147 133 -70.92 gain 133 148 -61.97 gain 148 133 -56.75 gain 133 149 -66.25 gain 149 133 -64.68 gain 133 150 -105.62 gain 150 133 -104.88 gain 133 151 -96.88 gain 151 133 -95.09 gain 133 152 -97.60 gain 152 133 -95.63 gain 133 153 -96.93 gain 153 133 -94.17 gain 133 154 -97.70 gain 154 133 -96.84 gain 133 155 -90.82 gain 155 133 -88.53 gain 133 156 -93.26 gain 156 133 -90.20 gain 133 157 -88.09 gain 157 133 -87.52 gain 133 158 -87.65 gain 158 133 -86.58 gain 133 159 -90.76 gain 159 133 -92.07 gain 133 160 -83.97 gain 160 133 -82.44 gain 133 161 -78.92 gain 161 133 -79.83 gain 133 162 -75.06 gain 162 133 -75.67 gain 133 163 -80.42 gain 163 133 -82.95 gain 133 164 -77.20 gain 164 133 -79.10 gain 133 165 -103.65 gain 165 133 -102.61 gain 133 166 -98.63 gain 166 133 -97.34 gain 133 167 -96.66 gain 167 133 -96.09 gain 133 168 -107.63 gain 168 133 -105.96 gain 133 169 -88.84 gain 169 133 -88.28 gain 133 170 -98.60 gain 170 133 -97.27 gain 133 171 -96.11 gain 171 133 -95.86 gain 133 172 -93.52 gain 172 133 -91.46 gain 133 173 -90.47 gain 173 133 -93.06 gain 133 174 -85.24 gain 174 133 -83.88 gain 133 175 -81.30 gain 175 133 -81.08 gain 133 176 -79.56 gain 176 133 -78.31 gain 133 177 -76.17 gain 177 133 -77.91 gain 133 178 -77.32 gain 178 133 -72.51 gain 133 179 -75.99 gain 179 133 -70.60 gain 133 180 -100.67 gain 180 133 -104.73 gain 133 181 -103.78 gain 181 133 -101.86 gain 133 182 -101.01 gain 182 133 -100.17 gain 133 183 -96.83 gain 183 133 -96.27 gain 133 184 -98.95 gain 184 133 -101.13 gain 133 185 -96.65 gain 185 133 -102.70 gain 133 186 -96.70 gain 186 133 -98.33 gain 133 187 -91.83 gain 187 133 -91.19 gain 133 188 -88.56 gain 188 133 -90.33 gain 133 189 -88.85 gain 189 133 -85.35 gain 133 190 -84.26 gain 190 133 -84.67 gain 133 191 -89.04 gain 191 133 -88.17 gain 133 192 -90.42 gain 192 133 -88.24 gain 133 193 -89.28 gain 193 133 -86.08 gain 133 194 -89.07 gain 194 133 -86.65 gain 133 195 -97.23 gain 195 133 -93.36 gain 133 196 -102.17 gain 196 133 -102.62 gain 133 197 -87.26 gain 197 133 -82.84 gain 133 198 -101.26 gain 198 133 -101.35 gain 133 199 -100.43 gain 199 133 -100.63 gain 133 200 -101.26 gain 200 133 -102.79 gain 133 201 -100.97 gain 201 133 -102.41 gain 133 202 -96.84 gain 202 133 -97.42 gain 133 203 -93.66 gain 203 133 -93.35 gain 133 204 -87.83 gain 204 133 -84.17 gain 133 205 -90.85 gain 205 133 -90.92 gain 133 206 -79.85 gain 206 133 -81.03 gain 133 207 -91.42 gain 207 133 -92.02 gain 133 208 -89.54 gain 208 133 -92.74 gain 133 209 -88.39 gain 209 133 -91.17 gain 133 210 -96.91 gain 210 133 -99.86 gain 133 211 -102.44 gain 211 133 -100.62 gain 133 212 -99.71 gain 212 133 -100.91 gain 133 213 -100.25 gain 213 133 -100.77 gain 133 214 -98.66 gain 214 133 -104.57 gain 133 215 -96.26 gain 215 133 -97.57 gain 133 216 -90.99 gain 216 133 -96.21 gain 133 217 -87.30 gain 217 133 -92.78 gain 133 218 -89.63 gain 218 133 -87.92 gain 133 219 -97.09 gain 219 133 -95.86 gain 133 220 -89.40 gain 220 133 -84.25 gain 133 221 -85.98 gain 221 133 -86.51 gain 133 222 -82.64 gain 222 133 -78.98 gain 133 223 -86.90 gain 223 133 -86.48 gain 133 224 -92.62 gain 224 133 -92.67 gain 134 135 -99.57 gain 135 134 -101.88 gain 134 136 -92.08 gain 136 134 -94.83 gain 134 137 -99.41 gain 137 134 -105.07 gain 134 138 -94.40 gain 138 134 -93.58 gain 134 139 -87.01 gain 139 134 -89.46 gain 134 140 -96.33 gain 140 134 -99.61 gain 134 141 -89.73 gain 141 134 -84.98 gain 134 142 -93.51 gain 142 134 -95.51 gain 134 143 -86.38 gain 143 134 -91.11 gain 134 144 -81.23 gain 144 134 -84.32 gain 134 145 -80.89 gain 145 134 -87.38 gain 134 146 -80.66 gain 146 134 -83.13 gain 134 147 -67.77 gain 147 134 -67.35 gain 134 148 -67.21 gain 148 134 -65.13 gain 134 149 -63.97 gain 149 134 -65.54 gain 134 150 -98.32 gain 150 134 -100.72 gain 134 151 -101.75 gain 151 134 -103.10 gain 134 152 -94.69 gain 152 134 -95.85 gain 134 153 -88.44 gain 153 134 -88.82 gain 134 154 -92.74 gain 154 134 -95.02 gain 134 155 -96.54 gain 155 134 -97.39 gain 134 156 -87.29 gain 156 134 -87.37 gain 134 157 -88.23 gain 157 134 -90.80 gain 134 158 -84.04 gain 158 134 -86.11 gain 134 159 -80.42 gain 159 134 -84.87 gain 134 160 -81.84 gain 160 134 -83.44 gain 134 161 -82.36 gain 161 134 -86.40 gain 134 162 -73.84 gain 162 134 -77.59 gain 134 163 -78.92 gain 163 134 -84.58 gain 134 164 -70.70 gain 164 134 -75.74 gain 134 165 -100.27 gain 165 134 -102.36 gain 134 166 -102.54 gain 166 134 -104.39 gain 134 167 -96.63 gain 167 134 -99.20 gain 134 168 -91.53 gain 168 134 -92.99 gain 134 169 -93.13 gain 169 134 -95.71 gain 134 170 -94.72 gain 170 134 -96.53 gain 134 171 -89.14 gain 171 134 -92.03 gain 134 172 -95.42 gain 172 134 -96.50 gain 134 173 -89.71 gain 173 134 -95.44 gain 134 174 -84.42 gain 174 134 -86.20 gain 134 175 -82.16 gain 175 134 -85.07 gain 134 176 -84.15 gain 176 134 -86.03 gain 134 177 -81.41 gain 177 134 -86.30 gain 134 178 -77.61 gain 178 134 -75.94 gain 134 179 -80.37 gain 179 134 -78.12 gain 134 180 -104.11 gain 180 134 -111.30 gain 134 181 -97.80 gain 181 134 -99.01 gain 134 182 -93.24 gain 182 134 -95.54 gain 134 183 -95.57 gain 183 134 -98.14 gain 134 184 -87.30 gain 184 134 -92.62 gain 134 185 -88.17 gain 185 134 -97.36 gain 134 186 -99.41 gain 186 134 -104.18 gain 134 187 -91.25 gain 187 134 -93.75 gain 134 188 -84.80 gain 188 134 -89.71 gain 134 189 -92.10 gain 189 134 -91.74 gain 134 190 -86.20 gain 190 134 -89.76 gain 134 191 -76.64 gain 191 134 -78.90 gain 134 192 -83.85 gain 192 134 -84.80 gain 134 193 -91.94 gain 193 134 -91.88 gain 134 194 -79.97 gain 194 134 -80.69 gain 134 195 -101.15 gain 195 134 -100.41 gain 134 196 -99.12 gain 196 134 -102.70 gain 134 197 -97.22 gain 197 134 -95.93 gain 134 198 -95.17 gain 198 134 -98.40 gain 134 199 -99.31 gain 199 134 -102.64 gain 134 200 -97.99 gain 200 134 -102.66 gain 134 201 -99.36 gain 201 134 -103.94 gain 134 202 -91.46 gain 202 134 -95.17 gain 134 203 -87.65 gain 203 134 -90.48 gain 134 204 -83.90 gain 204 134 -83.37 gain 134 205 -84.75 gain 205 134 -87.96 gain 134 206 -84.48 gain 206 134 -88.80 gain 134 207 -88.75 gain 207 134 -92.48 gain 134 208 -81.85 gain 208 134 -88.19 gain 134 209 -83.81 gain 209 134 -89.72 gain 134 210 -102.25 gain 210 134 -108.34 gain 134 211 -96.11 gain 211 134 -97.43 gain 134 212 -91.73 gain 212 134 -96.06 gain 134 213 -98.78 gain 213 134 -102.44 gain 134 214 -95.09 gain 214 134 -104.14 gain 134 215 -89.36 gain 215 134 -93.81 gain 134 216 -95.24 gain 216 134 -103.60 gain 134 217 -94.24 gain 217 134 -102.86 gain 134 218 -92.31 gain 218 134 -93.73 gain 134 219 -94.19 gain 219 134 -96.10 gain 134 220 -93.58 gain 220 134 -91.57 gain 134 221 -87.92 gain 221 134 -91.60 gain 134 222 -84.56 gain 222 134 -84.04 gain 134 223 -81.24 gain 223 134 -83.96 gain 134 224 -87.91 gain 224 134 -91.09 gain 135 136 -62.98 gain 136 135 -63.42 gain 135 137 -74.58 gain 137 135 -77.94 gain 135 138 -85.58 gain 138 135 -82.47 gain 135 139 -80.24 gain 139 135 -80.39 gain 135 140 -86.73 gain 140 135 -87.71 gain 135 141 -94.47 gain 141 135 -87.42 gain 135 142 -87.24 gain 142 135 -86.93 gain 135 143 -86.54 gain 143 135 -88.97 gain 135 144 -95.01 gain 144 135 -95.81 gain 135 145 -95.51 gain 145 135 -99.70 gain 135 146 -99.50 gain 146 135 -99.67 gain 135 147 -93.56 gain 147 135 -90.85 gain 135 148 -96.47 gain 148 135 -92.08 gain 135 149 -103.77 gain 149 135 -103.03 gain 135 150 -61.34 gain 150 135 -61.44 gain 135 151 -66.57 gain 151 135 -65.62 gain 135 152 -76.87 gain 152 135 -75.73 gain 135 153 -79.25 gain 153 135 -77.32 gain 135 154 -78.14 gain 154 135 -78.11 gain 135 155 -92.21 gain 155 135 -90.76 gain 135 156 -88.58 gain 156 135 -86.36 gain 135 157 -91.59 gain 157 135 -91.86 gain 135 158 -100.64 gain 158 135 -100.40 gain 135 159 -88.53 gain 159 135 -90.68 gain 135 160 -93.65 gain 160 135 -92.95 gain 135 161 -99.45 gain 161 135 -101.18 gain 135 162 -101.19 gain 162 135 -102.64 gain 135 163 -100.59 gain 163 135 -103.96 gain 135 164 -99.38 gain 164 135 -102.11 gain 135 165 -68.11 gain 165 135 -67.90 gain 135 166 -79.11 gain 166 135 -78.65 gain 135 167 -82.70 gain 167 135 -82.96 gain 135 168 -76.32 gain 168 135 -75.48 gain 135 169 -83.65 gain 169 135 -83.93 gain 135 170 -78.05 gain 170 135 -77.56 gain 135 171 -83.58 gain 171 135 -84.17 gain 135 172 -89.55 gain 172 135 -88.32 gain 135 173 -91.31 gain 173 135 -94.74 gain 135 174 -94.48 gain 174 135 -93.95 gain 135 175 -93.05 gain 175 135 -93.66 gain 135 176 -95.49 gain 176 135 -95.06 gain 135 177 -94.82 gain 177 135 -97.39 gain 135 178 -97.11 gain 178 135 -93.13 gain 135 179 -99.51 gain 179 135 -94.95 gain 135 180 -80.88 gain 180 135 -85.77 gain 135 181 -77.18 gain 181 135 -76.09 gain 135 182 -82.11 gain 182 135 -82.10 gain 135 183 -78.33 gain 183 135 -78.60 gain 135 184 -89.70 gain 184 135 -92.72 gain 135 185 -85.24 gain 185 135 -92.13 gain 135 186 -92.19 gain 186 135 -94.66 gain 135 187 -89.85 gain 187 135 -90.05 gain 135 188 -90.97 gain 188 135 -93.58 gain 135 189 -100.51 gain 189 135 -97.84 gain 135 190 -96.21 gain 190 135 -97.46 gain 135 191 -96.36 gain 191 135 -96.32 gain 135 192 -103.17 gain 192 135 -101.82 gain 135 193 -92.05 gain 193 135 -89.69 gain 135 194 -94.86 gain 194 135 -93.28 gain 135 195 -86.79 gain 195 135 -83.76 gain 135 196 -88.74 gain 196 135 -90.02 gain 135 197 -85.38 gain 197 135 -81.79 gain 135 198 -84.37 gain 198 135 -85.29 gain 135 199 -92.88 gain 199 135 -93.91 gain 135 200 -87.01 gain 200 135 -89.37 gain 135 201 -94.76 gain 201 135 -97.03 gain 135 202 -93.19 gain 202 135 -94.60 gain 135 203 -94.16 gain 203 135 -94.69 gain 135 204 -99.58 gain 204 135 -96.74 gain 135 205 -93.55 gain 205 135 -94.46 gain 135 206 -90.07 gain 206 135 -92.09 gain 135 207 -95.39 gain 207 135 -96.83 gain 135 208 -100.63 gain 208 135 -104.67 gain 135 209 -96.32 gain 209 135 -99.92 gain 135 210 -88.02 gain 210 135 -91.80 gain 135 211 -85.39 gain 211 135 -84.40 gain 135 212 -91.54 gain 212 135 -93.56 gain 135 213 -86.66 gain 213 135 -88.02 gain 135 214 -89.24 gain 214 135 -95.98 gain 135 215 -78.67 gain 215 135 -80.81 gain 135 216 -94.78 gain 216 135 -100.83 gain 135 217 -93.27 gain 217 135 -99.59 gain 135 218 -99.75 gain 218 135 -98.87 gain 135 219 -96.98 gain 219 135 -96.58 gain 135 220 -94.55 gain 220 135 -90.24 gain 135 221 -99.63 gain 221 135 -101.00 gain 135 222 -95.67 gain 222 135 -92.84 gain 135 223 -106.20 gain 223 135 -106.61 gain 135 224 -105.01 gain 224 135 -105.89 gain 136 137 -68.53 gain 137 136 -71.45 gain 136 138 -77.83 gain 138 136 -74.28 gain 136 139 -80.63 gain 139 136 -80.34 gain 136 140 -90.48 gain 140 136 -91.01 gain 136 141 -84.36 gain 141 136 -76.87 gain 136 142 -90.66 gain 142 136 -89.91 gain 136 143 -89.71 gain 143 136 -91.70 gain 136 144 -94.50 gain 144 136 -94.85 gain 136 145 -94.01 gain 145 136 -97.75 gain 136 146 -94.84 gain 146 136 -94.58 gain 136 147 -100.36 gain 147 136 -97.20 gain 136 148 -105.20 gain 148 136 -100.36 gain 136 149 -96.07 gain 149 136 -94.89 gain 136 150 -67.39 gain 150 136 -67.05 gain 136 151 -69.79 gain 151 136 -68.40 gain 136 152 -67.10 gain 152 136 -65.52 gain 136 153 -79.13 gain 153 136 -76.77 gain 136 154 -83.00 gain 154 136 -82.53 gain 136 155 -78.77 gain 155 136 -76.88 gain 136 156 -85.42 gain 156 136 -82.76 gain 136 157 -92.29 gain 157 136 -92.11 gain 136 158 -90.24 gain 158 136 -89.56 gain 136 159 -97.44 gain 159 136 -99.14 gain 136 160 -97.94 gain 160 136 -96.80 gain 136 161 -93.53 gain 161 136 -94.82 gain 136 162 -102.55 gain 162 136 -103.56 gain 136 163 -91.44 gain 163 136 -94.36 gain 136 164 -97.83 gain 164 136 -100.12 gain 136 165 -69.51 gain 165 136 -68.86 gain 136 166 -76.59 gain 166 136 -75.69 gain 136 167 -81.50 gain 167 136 -81.32 gain 136 168 -82.23 gain 168 136 -80.95 gain 136 169 -83.29 gain 169 136 -83.12 gain 136 170 -88.23 gain 170 136 -87.29 gain 136 171 -85.19 gain 171 136 -85.34 gain 136 172 -95.03 gain 172 136 -93.37 gain 136 173 -88.07 gain 173 136 -91.05 gain 136 174 -89.83 gain 174 136 -88.87 gain 136 175 -95.33 gain 175 136 -95.50 gain 136 176 -103.87 gain 176 136 -103.01 gain 136 177 -90.08 gain 177 136 -92.21 gain 136 178 -102.26 gain 178 136 -97.84 gain 136 179 -103.05 gain 179 136 -98.05 gain 136 180 -88.55 gain 180 136 -93.00 gain 136 181 -84.48 gain 181 136 -82.95 gain 136 182 -85.83 gain 182 136 -85.39 gain 136 183 -79.24 gain 183 136 -79.07 gain 136 184 -80.85 gain 184 136 -83.43 gain 136 185 -86.72 gain 185 136 -93.17 gain 136 186 -89.59 gain 186 136 -91.61 gain 136 187 -87.68 gain 187 136 -87.44 gain 136 188 -91.20 gain 188 136 -93.37 gain 136 189 -92.35 gain 189 136 -89.24 gain 136 190 -94.80 gain 190 136 -95.61 gain 136 191 -91.35 gain 191 136 -90.87 gain 136 192 -105.33 gain 192 136 -103.53 gain 136 193 -97.11 gain 193 136 -94.30 gain 136 194 -99.32 gain 194 136 -97.29 gain 136 195 -82.69 gain 195 136 -79.22 gain 136 196 -86.65 gain 196 136 -87.48 gain 136 197 -86.97 gain 197 136 -82.94 gain 136 198 -83.46 gain 198 136 -83.94 gain 136 199 -84.21 gain 199 136 -84.80 gain 136 200 -94.01 gain 200 136 -95.94 gain 136 201 -84.98 gain 201 136 -86.81 gain 136 202 -94.63 gain 202 136 -95.60 gain 136 203 -100.16 gain 203 136 -100.24 gain 136 204 -96.38 gain 204 136 -93.10 gain 136 205 -92.31 gain 205 136 -92.77 gain 136 206 -98.29 gain 206 136 -99.87 gain 136 207 -100.14 gain 207 136 -101.13 gain 136 208 -96.83 gain 208 136 -100.43 gain 136 209 -89.55 gain 209 136 -92.72 gain 136 210 -83.88 gain 210 136 -87.23 gain 136 211 -85.72 gain 211 136 -84.29 gain 136 212 -79.00 gain 212 136 -80.58 gain 136 213 -87.19 gain 213 136 -88.10 gain 136 214 -89.28 gain 214 136 -95.58 gain 136 215 -82.62 gain 215 136 -84.32 gain 136 216 -95.11 gain 216 136 -100.72 gain 136 217 -92.53 gain 217 136 -98.40 gain 136 218 -91.89 gain 218 136 -90.57 gain 136 219 -95.50 gain 219 136 -94.66 gain 136 220 -98.96 gain 220 136 -94.21 gain 136 221 -87.47 gain 221 136 -88.40 gain 136 222 -98.04 gain 222 136 -94.78 gain 136 223 -104.63 gain 223 136 -104.60 gain 136 224 -96.98 gain 224 136 -97.42 gain 137 138 -69.23 gain 138 137 -62.76 gain 137 139 -73.80 gain 139 137 -70.59 gain 137 140 -82.16 gain 140 137 -79.78 gain 137 141 -82.17 gain 141 137 -71.77 gain 137 142 -90.51 gain 142 137 -86.84 gain 137 143 -90.99 gain 143 137 -90.06 gain 137 144 -100.61 gain 144 137 -98.05 gain 137 145 -97.82 gain 145 137 -98.64 gain 137 146 -98.74 gain 146 137 -95.56 gain 137 147 -105.30 gain 147 137 -99.23 gain 137 148 -99.81 gain 148 137 -92.06 gain 137 149 -98.61 gain 149 137 -94.52 gain 137 150 -82.34 gain 150 137 -79.09 gain 137 151 -74.54 gain 151 137 -70.22 gain 137 152 -66.14 gain 152 137 -61.64 gain 137 153 -68.24 gain 153 137 -62.96 gain 137 154 -81.00 gain 154 137 -77.62 gain 137 155 -79.01 gain 155 137 -74.20 gain 137 156 -84.30 gain 156 137 -78.72 gain 137 157 -97.64 gain 157 137 -94.54 gain 137 158 -87.85 gain 158 137 -84.26 gain 137 159 -87.81 gain 159 137 -86.59 gain 137 160 -92.50 gain 160 137 -88.44 gain 137 161 -96.01 gain 161 137 -94.39 gain 137 162 -104.61 gain 162 137 -102.71 gain 137 163 -102.34 gain 163 137 -102.35 gain 137 164 -107.04 gain 164 137 -106.41 gain 137 165 -87.14 gain 165 137 -83.57 gain 137 166 -81.23 gain 166 137 -77.42 gain 137 167 -66.94 gain 167 137 -63.85 gain 137 168 -81.58 gain 168 137 -77.39 gain 137 169 -89.53 gain 169 137 -86.45 gain 137 170 -80.87 gain 170 137 -77.02 gain 137 171 -87.55 gain 171 137 -84.78 gain 137 172 -86.27 gain 172 137 -81.69 gain 137 173 -93.64 gain 173 137 -93.71 gain 137 174 -90.84 gain 174 137 -86.96 gain 137 175 -95.69 gain 175 137 -92.94 gain 137 176 -97.35 gain 176 137 -93.57 gain 137 177 -98.06 gain 177 137 -97.28 gain 137 178 -98.69 gain 178 137 -91.35 gain 137 179 -100.79 gain 179 137 -92.88 gain 137 180 -90.92 gain 180 137 -92.45 gain 137 181 -82.18 gain 181 137 -77.74 gain 137 182 -85.78 gain 182 137 -82.43 gain 137 183 -90.78 gain 183 137 -87.69 gain 137 184 -88.37 gain 184 137 -88.04 gain 137 185 -95.27 gain 185 137 -98.80 gain 137 186 -86.51 gain 186 137 -85.62 gain 137 187 -95.72 gain 187 137 -92.56 gain 137 188 -88.84 gain 188 137 -88.09 gain 137 189 -96.56 gain 189 137 -90.54 gain 137 190 -90.12 gain 190 137 -88.02 gain 137 191 -102.64 gain 191 137 -99.24 gain 137 192 -98.50 gain 192 137 -93.80 gain 137 193 -96.52 gain 193 137 -90.80 gain 137 194 -105.28 gain 194 137 -100.34 gain 137 195 -90.64 gain 195 137 -84.25 gain 137 196 -82.54 gain 196 137 -80.46 gain 137 197 -88.08 gain 197 137 -81.14 gain 137 198 -87.87 gain 198 137 -85.44 gain 137 199 -90.79 gain 199 137 -88.47 gain 137 200 -90.95 gain 200 137 -89.96 gain 137 201 -95.34 gain 201 137 -94.26 gain 137 202 -88.15 gain 202 137 -86.21 gain 137 203 -91.41 gain 203 137 -88.58 gain 137 204 -97.46 gain 204 137 -91.27 gain 137 205 -95.60 gain 205 137 -93.15 gain 137 206 -100.82 gain 206 137 -99.48 gain 137 207 -98.05 gain 207 137 -96.13 gain 137 208 -105.99 gain 208 137 -106.67 gain 137 209 -101.50 gain 209 137 -101.76 gain 137 210 -93.99 gain 210 137 -94.41 gain 137 211 -99.36 gain 211 137 -95.02 gain 137 212 -88.61 gain 212 137 -87.29 gain 137 213 -96.34 gain 213 137 -94.34 gain 137 214 -87.28 gain 214 137 -90.67 gain 137 215 -92.19 gain 215 137 -90.97 gain 137 216 -95.66 gain 216 137 -98.36 gain 137 217 -89.81 gain 217 137 -92.77 gain 137 218 -97.26 gain 218 137 -93.03 gain 137 219 -100.04 gain 219 137 -96.29 gain 137 220 -99.95 gain 220 137 -92.29 gain 137 221 -99.31 gain 221 137 -97.32 gain 137 222 -99.45 gain 222 137 -93.27 gain 137 223 -89.66 gain 223 137 -86.72 gain 137 224 -103.02 gain 224 137 -100.55 gain 138 139 -65.86 gain 139 138 -69.13 gain 138 140 -82.99 gain 140 138 -87.08 gain 138 141 -79.92 gain 141 138 -75.99 gain 138 142 -81.76 gain 142 138 -84.57 gain 138 143 -80.87 gain 143 138 -86.42 gain 138 144 -85.55 gain 144 138 -89.46 gain 138 145 -89.51 gain 145 138 -96.81 gain 138 146 -85.68 gain 146 138 -88.97 gain 138 147 -98.92 gain 147 138 -99.32 gain 138 148 -88.11 gain 148 138 -86.84 gain 138 149 -89.42 gain 149 138 -91.80 gain 138 150 -81.32 gain 150 138 -84.54 gain 138 151 -67.43 gain 151 138 -69.59 gain 138 152 -69.30 gain 152 138 -71.27 gain 138 153 -63.10 gain 153 138 -64.29 gain 138 154 -67.82 gain 154 138 -70.91 gain 138 155 -72.97 gain 155 138 -74.63 gain 138 156 -78.35 gain 156 138 -79.24 gain 138 157 -79.84 gain 157 138 -83.22 gain 138 158 -80.32 gain 158 138 -83.19 gain 138 159 -86.42 gain 159 138 -91.68 gain 138 160 -87.55 gain 160 138 -89.96 gain 138 161 -86.74 gain 161 138 -91.59 gain 138 162 -90.54 gain 162 138 -95.10 gain 138 163 -91.64 gain 163 138 -98.12 gain 138 164 -93.03 gain 164 138 -98.88 gain 138 165 -81.66 gain 165 138 -84.56 gain 138 166 -70.00 gain 166 138 -72.66 gain 138 167 -75.35 gain 167 138 -78.73 gain 138 168 -67.85 gain 168 138 -70.13 gain 138 169 -63.21 gain 169 138 -66.59 gain 138 170 -79.22 gain 170 138 -81.84 gain 138 171 -83.37 gain 171 138 -87.07 gain 138 172 -79.92 gain 172 138 -81.82 gain 138 173 -86.50 gain 173 138 -93.04 gain 138 174 -87.16 gain 174 138 -89.74 gain 138 175 -90.07 gain 175 138 -93.79 gain 138 176 -90.00 gain 176 138 -92.69 gain 138 177 -88.47 gain 177 138 -94.17 gain 138 178 -86.15 gain 178 138 -85.28 gain 138 179 -93.18 gain 179 138 -91.74 gain 138 180 -78.94 gain 180 138 -86.95 gain 138 181 -74.12 gain 181 138 -76.15 gain 138 182 -74.27 gain 182 138 -77.38 gain 138 183 -79.97 gain 183 138 -83.35 gain 138 184 -74.02 gain 184 138 -80.16 gain 138 185 -72.48 gain 185 138 -82.48 gain 138 186 -87.04 gain 186 138 -92.62 gain 138 187 -81.72 gain 187 138 -85.03 gain 138 188 -86.64 gain 188 138 -92.36 gain 138 189 -86.22 gain 189 138 -86.67 gain 138 190 -85.25 gain 190 138 -89.62 gain 138 191 -92.31 gain 191 138 -95.38 gain 138 192 -95.63 gain 192 138 -97.40 gain 138 193 -86.05 gain 193 138 -86.80 gain 138 194 -90.91 gain 194 138 -92.44 gain 138 195 -80.61 gain 195 138 -80.69 gain 138 196 -76.68 gain 196 138 -81.08 gain 138 197 -78.81 gain 197 138 -78.33 gain 138 198 -80.06 gain 198 138 -84.10 gain 138 199 -82.77 gain 199 138 -86.92 gain 138 200 -77.67 gain 200 138 -83.15 gain 138 201 -87.28 gain 201 138 -92.67 gain 138 202 -81.67 gain 202 138 -86.20 gain 138 203 -78.27 gain 203 138 -81.91 gain 138 204 -85.86 gain 204 138 -86.14 gain 138 205 -88.80 gain 205 138 -92.82 gain 138 206 -93.46 gain 206 138 -98.60 gain 138 207 -90.31 gain 207 138 -94.86 gain 138 208 -88.70 gain 208 138 -95.86 gain 138 209 -97.54 gain 209 138 -104.26 gain 138 210 -85.78 gain 210 138 -92.68 gain 138 211 -85.72 gain 211 138 -87.85 gain 138 212 -84.46 gain 212 138 -89.61 gain 138 213 -89.30 gain 213 138 -93.77 gain 138 214 -85.59 gain 214 138 -95.45 gain 138 215 -77.88 gain 215 138 -83.13 gain 138 216 -82.61 gain 216 138 -91.78 gain 138 217 -85.37 gain 217 138 -94.80 gain 138 218 -83.33 gain 218 138 -85.56 gain 138 219 -88.30 gain 219 138 -91.02 gain 138 220 -91.89 gain 220 138 -90.70 gain 138 221 -96.79 gain 221 138 -101.28 gain 138 222 -86.34 gain 222 138 -86.63 gain 138 223 -88.83 gain 223 138 -92.36 gain 138 224 -98.60 gain 224 138 -102.60 gain 139 140 -57.18 gain 140 139 -58.00 gain 139 141 -69.60 gain 141 139 -62.40 gain 139 142 -78.15 gain 142 139 -77.69 gain 139 143 -77.92 gain 143 139 -80.20 gain 139 144 -86.02 gain 144 139 -86.66 gain 139 145 -88.46 gain 145 139 -92.50 gain 139 146 -93.70 gain 146 139 -93.72 gain 139 147 -91.74 gain 147 139 -88.87 gain 139 148 -96.81 gain 148 139 -92.27 gain 139 149 -100.42 gain 149 139 -99.54 gain 139 150 -82.61 gain 150 139 -82.57 gain 139 151 -76.70 gain 151 139 -75.60 gain 139 152 -80.44 gain 152 139 -79.15 gain 139 153 -66.36 gain 153 139 -64.29 gain 139 154 -60.51 gain 154 139 -60.33 gain 139 155 -69.13 gain 155 139 -67.53 gain 139 156 -79.60 gain 156 139 -77.23 gain 139 157 -82.11 gain 157 139 -82.22 gain 139 158 -89.28 gain 158 139 -88.89 gain 139 159 -92.08 gain 159 139 -94.07 gain 139 160 -83.61 gain 160 139 -82.76 gain 139 161 -96.24 gain 161 139 -97.83 gain 139 162 -88.47 gain 162 139 -89.77 gain 139 163 -97.24 gain 163 139 -100.46 gain 139 164 -85.66 gain 164 139 -88.24 gain 139 165 -85.34 gain 165 139 -84.98 gain 139 166 -83.63 gain 166 139 -83.02 gain 139 167 -80.41 gain 167 139 -80.52 gain 139 168 -71.96 gain 168 139 -70.97 gain 139 169 -81.22 gain 169 139 -81.35 gain 139 170 -79.94 gain 170 139 -79.30 gain 139 171 -81.10 gain 171 139 -81.54 gain 139 172 -80.65 gain 172 139 -79.28 gain 139 173 -80.08 gain 173 139 -83.35 gain 139 174 -88.43 gain 174 139 -87.75 gain 139 175 -93.59 gain 175 139 -94.04 gain 139 176 -83.27 gain 176 139 -82.69 gain 139 177 -93.94 gain 177 139 -96.36 gain 139 178 -89.66 gain 178 139 -85.53 gain 139 179 -92.45 gain 179 139 -87.74 gain 139 180 -92.09 gain 180 139 -96.83 gain 139 181 -93.25 gain 181 139 -92.02 gain 139 182 -78.49 gain 182 139 -78.34 gain 139 183 -72.61 gain 183 139 -72.73 gain 139 184 -81.17 gain 184 139 -84.04 gain 139 185 -84.31 gain 185 139 -91.04 gain 139 186 -82.53 gain 186 139 -84.85 gain 139 187 -86.14 gain 187 139 -86.18 gain 139 188 -91.32 gain 188 139 -93.78 gain 139 189 -88.56 gain 189 139 -85.75 gain 139 190 -85.44 gain 190 139 -86.54 gain 139 191 -98.15 gain 191 139 -97.96 gain 139 192 -96.90 gain 192 139 -95.40 gain 139 193 -96.11 gain 193 139 -93.59 gain 139 194 -94.67 gain 194 139 -92.93 gain 139 195 -88.89 gain 195 139 -85.70 gain 139 196 -84.30 gain 196 139 -85.43 gain 139 197 -86.80 gain 197 139 -83.06 gain 139 198 -84.90 gain 198 139 -85.68 gain 139 199 -83.70 gain 199 139 -84.58 gain 139 200 -80.75 gain 200 139 -82.97 gain 139 201 -87.61 gain 201 139 -89.74 gain 139 202 -84.17 gain 202 139 -85.43 gain 139 203 -89.03 gain 203 139 -89.41 gain 139 204 -80.36 gain 204 139 -77.38 gain 139 205 -91.53 gain 205 139 -92.29 gain 139 206 -89.08 gain 206 139 -90.95 gain 139 207 -95.77 gain 207 139 -97.06 gain 139 208 -92.80 gain 208 139 -96.68 gain 139 209 -98.11 gain 209 139 -101.57 gain 139 210 -86.32 gain 210 139 -89.95 gain 139 211 -79.71 gain 211 139 -78.58 gain 139 212 -83.94 gain 212 139 -85.82 gain 139 213 -87.56 gain 213 139 -88.77 gain 139 214 -83.81 gain 214 139 -90.40 gain 139 215 -83.11 gain 215 139 -85.10 gain 139 216 -81.53 gain 216 139 -87.43 gain 139 217 -82.53 gain 217 139 -88.69 gain 139 218 -87.55 gain 218 139 -86.52 gain 139 219 -86.80 gain 219 139 -86.25 gain 139 220 -93.07 gain 220 139 -88.61 gain 139 221 -98.59 gain 221 139 -99.80 gain 139 222 -100.04 gain 222 139 -97.06 gain 139 223 -89.78 gain 223 139 -90.04 gain 139 224 -92.73 gain 224 139 -93.47 gain 140 141 -60.52 gain 141 140 -52.49 gain 140 142 -70.62 gain 142 140 -69.33 gain 140 143 -77.10 gain 143 140 -78.55 gain 140 144 -75.18 gain 144 140 -75.00 gain 140 145 -87.79 gain 145 140 -91.00 gain 140 146 -82.94 gain 146 140 -82.13 gain 140 147 -89.07 gain 147 140 -85.37 gain 140 148 -95.48 gain 148 140 -90.11 gain 140 149 -94.22 gain 149 140 -92.51 gain 140 150 -94.80 gain 150 140 -93.92 gain 140 151 -83.23 gain 151 140 -81.29 gain 140 152 -82.67 gain 152 140 -80.55 gain 140 153 -71.30 gain 153 140 -68.39 gain 140 154 -69.44 gain 154 140 -68.44 gain 140 155 -70.12 gain 155 140 -67.69 gain 140 156 -66.76 gain 156 140 -63.56 gain 140 157 -74.42 gain 157 140 -73.71 gain 140 158 -76.17 gain 158 140 -74.95 gain 140 159 -80.57 gain 159 140 -81.74 gain 140 160 -92.85 gain 160 140 -91.17 gain 140 161 -87.89 gain 161 140 -88.65 gain 140 162 -85.30 gain 162 140 -85.77 gain 140 163 -90.33 gain 163 140 -92.72 gain 140 164 -100.05 gain 164 140 -101.80 gain 140 165 -89.30 gain 165 140 -88.11 gain 140 166 -88.53 gain 166 140 -87.09 gain 140 167 -82.55 gain 167 140 -81.84 gain 140 168 -81.98 gain 168 140 -80.16 gain 140 169 -77.25 gain 169 140 -76.54 gain 140 170 -70.23 gain 170 140 -68.76 gain 140 171 -80.75 gain 171 140 -80.36 gain 140 172 -76.69 gain 172 140 -74.49 gain 140 173 -85.85 gain 173 140 -88.29 gain 140 174 -84.15 gain 174 140 -82.64 gain 140 175 -93.52 gain 175 140 -93.15 gain 140 176 -88.95 gain 176 140 -87.55 gain 140 177 -96.47 gain 177 140 -98.07 gain 140 178 -95.55 gain 178 140 -90.59 gain 140 179 -94.09 gain 179 140 -88.55 gain 140 180 -85.19 gain 180 140 -89.10 gain 140 181 -83.12 gain 181 140 -81.05 gain 140 182 -88.49 gain 182 140 -87.50 gain 140 183 -78.30 gain 183 140 -77.60 gain 140 184 -82.66 gain 184 140 -84.70 gain 140 185 -79.75 gain 185 140 -85.66 gain 140 186 -80.17 gain 186 140 -81.66 gain 140 187 -83.50 gain 187 140 -82.72 gain 140 188 -82.74 gain 188 140 -84.37 gain 140 189 -87.38 gain 189 140 -83.74 gain 140 190 -92.09 gain 190 140 -92.36 gain 140 191 -92.57 gain 191 140 -91.55 gain 140 192 -92.38 gain 192 140 -90.05 gain 140 193 -92.15 gain 193 140 -88.81 gain 140 194 -97.07 gain 194 140 -94.51 gain 140 195 -83.87 gain 195 140 -79.86 gain 140 196 -87.95 gain 196 140 -88.25 gain 140 197 -82.73 gain 197 140 -78.16 gain 140 198 -80.03 gain 198 140 -79.97 gain 140 199 -84.47 gain 199 140 -84.53 gain 140 200 -82.91 gain 200 140 -84.30 gain 140 201 -87.38 gain 201 140 -88.68 gain 140 202 -86.09 gain 202 140 -86.52 gain 140 203 -86.47 gain 203 140 -86.02 gain 140 204 -90.82 gain 204 140 -87.01 gain 140 205 -88.37 gain 205 140 -88.30 gain 140 206 -90.54 gain 206 140 -91.58 gain 140 207 -96.45 gain 207 140 -96.91 gain 140 208 -94.84 gain 208 140 -97.90 gain 140 209 -91.68 gain 209 140 -94.31 gain 140 210 -93.97 gain 210 140 -96.77 gain 140 211 -90.06 gain 211 140 -88.10 gain 140 212 -88.65 gain 212 140 -89.70 gain 140 213 -82.32 gain 213 140 -82.70 gain 140 214 -89.30 gain 214 140 -95.06 gain 140 215 -83.71 gain 215 140 -84.88 gain 140 216 -84.77 gain 216 140 -89.85 gain 140 217 -94.92 gain 217 140 -100.25 gain 140 218 -89.08 gain 218 140 -87.22 gain 140 219 -90.85 gain 219 140 -89.47 gain 140 220 -89.41 gain 220 140 -84.13 gain 140 221 -95.34 gain 221 140 -95.73 gain 140 222 -90.53 gain 222 140 -86.72 gain 140 223 -94.83 gain 223 140 -94.27 gain 140 224 -95.72 gain 224 140 -95.63 gain 141 142 -56.40 gain 142 141 -63.15 gain 141 143 -67.77 gain 143 141 -77.25 gain 141 144 -78.06 gain 144 141 -85.91 gain 141 145 -70.14 gain 145 141 -81.38 gain 141 146 -77.55 gain 146 141 -84.77 gain 141 147 -82.69 gain 147 141 -87.02 gain 141 148 -87.77 gain 148 141 -90.43 gain 141 149 -84.87 gain 149 141 -91.18 gain 141 150 -79.44 gain 150 141 -86.59 gain 141 151 -73.37 gain 151 141 -79.46 gain 141 152 -78.03 gain 152 141 -83.94 gain 141 153 -79.68 gain 153 141 -84.80 gain 141 154 -64.71 gain 154 141 -71.73 gain 141 155 -70.43 gain 155 141 -76.03 gain 141 156 -55.87 gain 156 141 -60.70 gain 141 157 -63.09 gain 157 141 -70.40 gain 141 158 -67.75 gain 158 141 -74.56 gain 141 159 -76.26 gain 159 141 -85.46 gain 141 160 -72.54 gain 160 141 -78.89 gain 141 161 -81.12 gain 161 141 -89.91 gain 141 162 -82.35 gain 162 141 -90.85 gain 141 163 -85.77 gain 163 141 -96.19 gain 141 164 -85.62 gain 164 141 -95.40 gain 141 165 -73.41 gain 165 141 -80.25 gain 141 166 -82.02 gain 166 141 -88.61 gain 141 167 -86.22 gain 167 141 -93.53 gain 141 168 -80.28 gain 168 141 -86.48 gain 141 169 -66.96 gain 169 141 -74.28 gain 141 170 -71.25 gain 170 141 -77.81 gain 141 171 -70.09 gain 171 141 -77.73 gain 141 172 -75.87 gain 172 141 -81.69 gain 141 173 -69.91 gain 173 141 -80.38 gain 141 174 -75.82 gain 174 141 -82.34 gain 141 175 -73.71 gain 175 141 -81.36 gain 141 176 -77.09 gain 176 141 -83.71 gain 141 177 -82.71 gain 177 141 -92.33 gain 141 178 -75.45 gain 178 141 -78.52 gain 141 179 -94.95 gain 179 141 -97.44 gain 141 180 -80.60 gain 180 141 -92.54 gain 141 181 -88.44 gain 181 141 -94.41 gain 141 182 -76.31 gain 182 141 -83.36 gain 141 183 -76.99 gain 183 141 -84.31 gain 141 184 -75.99 gain 184 141 -86.06 gain 141 185 -68.15 gain 185 141 -82.09 gain 141 186 -71.07 gain 186 141 -80.59 gain 141 187 -76.18 gain 187 141 -83.43 gain 141 188 -78.76 gain 188 141 -88.42 gain 141 189 -75.23 gain 189 141 -79.61 gain 141 190 -72.03 gain 190 141 -80.33 gain 141 191 -76.40 gain 191 141 -83.41 gain 141 192 -90.64 gain 192 141 -96.34 gain 141 193 -77.70 gain 193 141 -82.39 gain 141 194 -81.31 gain 194 141 -86.77 gain 141 195 -78.04 gain 195 141 -82.06 gain 141 196 -77.42 gain 196 141 -85.74 gain 141 197 -77.68 gain 197 141 -81.14 gain 141 198 -77.48 gain 198 141 -85.45 gain 141 199 -76.88 gain 199 141 -84.96 gain 141 200 -77.49 gain 200 141 -86.91 gain 141 201 -77.07 gain 201 141 -86.39 gain 141 202 -72.29 gain 202 141 -80.75 gain 141 203 -72.39 gain 203 141 -79.96 gain 141 204 -77.98 gain 204 141 -82.19 gain 141 205 -79.53 gain 205 141 -87.49 gain 141 206 -79.15 gain 206 141 -88.22 gain 141 207 -89.15 gain 207 141 -97.63 gain 141 208 -86.74 gain 208 141 -97.82 gain 141 209 -84.59 gain 209 141 -95.25 gain 141 210 -82.94 gain 210 141 -93.77 gain 141 211 -81.45 gain 211 141 -87.51 gain 141 212 -78.68 gain 212 141 -87.76 gain 141 213 -73.12 gain 213 141 -81.52 gain 141 214 -78.51 gain 214 141 -92.30 gain 141 215 -82.83 gain 215 141 -92.02 gain 141 216 -82.75 gain 216 141 -95.85 gain 141 217 -82.06 gain 217 141 -95.43 gain 141 218 -88.41 gain 218 141 -94.58 gain 141 219 -84.33 gain 219 141 -90.98 gain 141 220 -82.06 gain 220 141 -84.80 gain 141 221 -84.49 gain 221 141 -92.91 gain 141 222 -79.59 gain 222 141 -83.82 gain 141 223 -86.10 gain 223 141 -93.57 gain 141 224 -94.68 gain 224 141 -102.62 gain 142 143 -66.11 gain 143 142 -68.85 gain 142 144 -78.43 gain 144 142 -79.53 gain 142 145 -73.06 gain 145 142 -77.55 gain 142 146 -81.61 gain 146 142 -82.09 gain 142 147 -79.69 gain 147 142 -77.28 gain 142 148 -80.32 gain 148 142 -76.23 gain 142 149 -90.27 gain 149 142 -89.84 gain 142 150 -93.09 gain 150 142 -93.50 gain 142 151 -88.26 gain 151 142 -87.61 gain 142 152 -90.18 gain 152 142 -89.35 gain 142 153 -82.33 gain 153 142 -80.71 gain 142 154 -74.61 gain 154 142 -74.89 gain 142 155 -69.31 gain 155 142 -68.16 gain 142 156 -74.28 gain 156 142 -72.37 gain 142 157 -65.11 gain 157 142 -65.68 gain 142 158 -67.60 gain 158 142 -67.67 gain 142 159 -79.16 gain 159 142 -81.61 gain 142 160 -77.09 gain 160 142 -76.69 gain 142 161 -79.74 gain 161 142 -81.78 gain 142 162 -84.44 gain 162 142 -86.19 gain 142 163 -93.72 gain 163 142 -97.39 gain 142 164 -84.00 gain 164 142 -87.04 gain 142 165 -86.49 gain 165 142 -86.59 gain 142 166 -92.27 gain 166 142 -92.12 gain 142 167 -88.28 gain 167 142 -88.85 gain 142 168 -82.29 gain 168 142 -81.76 gain 142 169 -83.24 gain 169 142 -83.82 gain 142 170 -76.42 gain 170 142 -76.24 gain 142 171 -72.26 gain 171 142 -73.16 gain 142 172 -73.19 gain 172 142 -72.27 gain 142 173 -68.97 gain 173 142 -72.70 gain 142 174 -81.93 gain 174 142 -81.71 gain 142 175 -84.97 gain 175 142 -85.88 gain 142 176 -79.17 gain 176 142 -79.06 gain 142 177 -84.73 gain 177 142 -87.61 gain 142 178 -96.81 gain 178 142 -93.14 gain 142 179 -80.98 gain 179 142 -76.73 gain 142 180 -91.53 gain 180 142 -96.73 gain 142 181 -94.03 gain 181 142 -93.25 gain 142 182 -91.01 gain 182 142 -91.31 gain 142 183 -78.73 gain 183 142 -79.31 gain 142 184 -84.18 gain 184 142 -87.51 gain 142 185 -76.84 gain 185 142 -84.04 gain 142 186 -81.31 gain 186 142 -84.08 gain 142 187 -74.57 gain 187 142 -75.08 gain 142 188 -76.99 gain 188 142 -79.90 gain 142 189 -75.61 gain 189 142 -73.25 gain 142 190 -81.67 gain 190 142 -83.22 gain 142 191 -84.60 gain 191 142 -84.87 gain 142 192 -85.46 gain 192 142 -84.42 gain 142 193 -80.56 gain 193 142 -78.50 gain 142 194 -86.84 gain 194 142 -85.56 gain 142 195 -97.22 gain 195 142 -94.49 gain 142 196 -91.54 gain 196 142 -93.13 gain 142 197 -84.84 gain 197 142 -81.56 gain 142 198 -87.49 gain 198 142 -88.72 gain 142 199 -92.97 gain 199 142 -94.30 gain 142 200 -89.72 gain 200 142 -92.40 gain 142 201 -88.70 gain 201 142 -91.28 gain 142 202 -82.02 gain 202 142 -83.74 gain 142 203 -82.50 gain 203 142 -83.34 gain 142 204 -83.77 gain 204 142 -81.25 gain 142 205 -84.21 gain 205 142 -85.43 gain 142 206 -90.21 gain 206 142 -92.53 gain 142 207 -91.16 gain 207 142 -92.90 gain 142 208 -89.39 gain 208 142 -93.73 gain 142 209 -94.03 gain 209 142 -97.94 gain 142 210 -94.84 gain 210 142 -98.93 gain 142 211 -92.03 gain 211 142 -91.35 gain 142 212 -90.48 gain 212 142 -92.81 gain 142 213 -92.78 gain 213 142 -94.44 gain 142 214 -91.55 gain 214 142 -98.60 gain 142 215 -87.28 gain 215 142 -89.73 gain 142 216 -86.10 gain 216 142 -92.46 gain 142 217 -77.80 gain 217 142 -84.42 gain 142 218 -90.20 gain 218 142 -89.62 gain 142 219 -92.64 gain 219 142 -92.55 gain 142 220 -87.41 gain 220 142 -83.40 gain 142 221 -89.21 gain 221 142 -90.89 gain 142 222 -88.61 gain 222 142 -86.09 gain 142 223 -93.72 gain 223 142 -94.44 gain 142 224 -94.95 gain 224 142 -96.14 gain 143 144 -68.79 gain 144 143 -67.15 gain 143 145 -77.11 gain 145 143 -78.86 gain 143 146 -81.97 gain 146 143 -79.72 gain 143 147 -85.18 gain 147 143 -80.03 gain 143 148 -94.39 gain 148 143 -87.56 gain 143 149 -99.67 gain 149 143 -96.50 gain 143 150 -94.13 gain 150 143 -91.80 gain 143 151 -87.97 gain 151 143 -84.59 gain 143 152 -89.41 gain 152 143 -85.84 gain 143 153 -85.56 gain 153 143 -81.20 gain 143 154 -85.72 gain 154 143 -83.27 gain 143 155 -77.63 gain 155 143 -73.75 gain 143 156 -79.78 gain 156 143 -75.13 gain 143 157 -69.32 gain 157 143 -67.15 gain 143 158 -70.01 gain 158 143 -67.34 gain 143 159 -67.55 gain 159 143 -67.26 gain 143 160 -75.72 gain 160 143 -72.59 gain 143 161 -85.30 gain 161 143 -84.61 gain 143 162 -81.75 gain 162 143 -80.76 gain 143 163 -87.80 gain 163 143 -88.73 gain 143 164 -96.64 gain 164 143 -96.94 gain 143 165 -95.32 gain 165 143 -92.68 gain 143 166 -89.14 gain 166 143 -86.25 gain 143 167 -91.58 gain 167 143 -89.41 gain 143 168 -91.13 gain 168 143 -87.85 gain 143 169 -90.41 gain 169 143 -88.25 gain 143 170 -87.26 gain 170 143 -84.34 gain 143 171 -79.08 gain 171 143 -77.23 gain 143 172 -78.66 gain 172 143 -75.00 gain 143 173 -69.58 gain 173 143 -70.57 gain 143 174 -79.68 gain 174 143 -76.72 gain 143 175 -81.32 gain 175 143 -79.50 gain 143 176 -89.31 gain 176 143 -86.45 gain 143 177 -89.46 gain 177 143 -89.61 gain 143 178 -85.06 gain 178 143 -78.65 gain 143 179 -88.97 gain 179 143 -81.98 gain 143 180 -95.65 gain 180 143 -98.11 gain 143 181 -91.62 gain 181 143 -88.10 gain 143 182 -90.27 gain 182 143 -87.84 gain 143 183 -86.57 gain 183 143 -84.41 gain 143 184 -92.08 gain 184 143 -92.66 gain 143 185 -88.80 gain 185 143 -93.25 gain 143 186 -82.84 gain 186 143 -82.87 gain 143 187 -80.85 gain 187 143 -78.62 gain 143 188 -88.01 gain 188 143 -88.18 gain 143 189 -83.29 gain 189 143 -78.20 gain 143 190 -91.33 gain 190 143 -90.15 gain 143 191 -84.73 gain 191 143 -82.25 gain 143 192 -93.58 gain 192 143 -89.80 gain 143 193 -89.54 gain 193 143 -84.74 gain 143 194 -99.03 gain 194 143 -95.02 gain 143 195 -97.11 gain 195 143 -91.64 gain 143 196 -97.10 gain 196 143 -95.95 gain 143 197 -89.47 gain 197 143 -83.45 gain 143 198 -89.54 gain 198 143 -88.04 gain 143 199 -97.25 gain 199 143 -95.86 gain 143 200 -96.89 gain 200 143 -96.83 gain 143 201 -91.83 gain 201 143 -91.68 gain 143 202 -88.42 gain 202 143 -87.40 gain 143 203 -85.96 gain 203 143 -84.05 gain 143 204 -87.83 gain 204 143 -82.56 gain 143 205 -80.55 gain 205 143 -79.03 gain 143 206 -87.75 gain 206 143 -87.34 gain 143 207 -86.78 gain 207 143 -85.79 gain 143 208 -91.12 gain 208 143 -92.72 gain 143 209 -96.59 gain 209 143 -97.77 gain 143 210 -95.36 gain 210 143 -96.71 gain 143 211 -107.78 gain 211 143 -104.36 gain 143 212 -100.93 gain 212 143 -100.53 gain 143 213 -90.66 gain 213 143 -89.59 gain 143 214 -86.83 gain 214 143 -91.14 gain 143 215 -89.88 gain 215 143 -89.59 gain 143 216 -85.16 gain 216 143 -88.78 gain 143 217 -92.80 gain 217 143 -96.69 gain 143 218 -90.60 gain 218 143 -87.30 gain 143 219 -88.30 gain 219 143 -85.47 gain 143 220 -78.76 gain 220 143 -72.01 gain 143 221 -92.66 gain 221 143 -91.60 gain 143 222 -92.24 gain 222 143 -86.98 gain 143 223 -87.65 gain 223 143 -85.63 gain 143 224 -89.39 gain 224 143 -87.85 gain 144 145 -64.59 gain 145 144 -67.98 gain 144 146 -74.17 gain 146 144 -73.54 gain 144 147 -74.45 gain 147 144 -70.94 gain 144 148 -82.44 gain 148 144 -77.26 gain 144 149 -91.15 gain 149 144 -89.62 gain 144 150 -101.62 gain 150 144 -100.93 gain 144 151 -91.59 gain 151 144 -89.83 gain 144 152 -98.27 gain 152 144 -96.33 gain 144 153 -95.15 gain 153 144 -92.42 gain 144 154 -94.97 gain 154 144 -94.15 gain 144 155 -92.46 gain 155 144 -90.21 gain 144 156 -75.84 gain 156 144 -72.83 gain 144 157 -76.21 gain 157 144 -75.67 gain 144 158 -66.60 gain 158 144 -65.57 gain 144 159 -65.93 gain 159 144 -67.28 gain 144 160 -69.56 gain 160 144 -68.07 gain 144 161 -75.05 gain 161 144 -75.99 gain 144 162 -86.16 gain 162 144 -86.81 gain 144 163 -86.44 gain 163 144 -89.00 gain 144 164 -82.45 gain 164 144 -84.39 gain 144 165 -98.02 gain 165 144 -97.02 gain 144 166 -90.12 gain 166 144 -88.87 gain 144 167 -84.02 gain 167 144 -83.49 gain 144 168 -87.89 gain 168 144 -86.25 gain 144 169 -80.41 gain 169 144 -79.89 gain 144 170 -88.21 gain 170 144 -86.92 gain 144 171 -84.52 gain 171 144 -84.32 gain 144 172 -68.48 gain 172 144 -66.46 gain 144 173 -72.78 gain 173 144 -75.41 gain 144 174 -73.91 gain 174 144 -72.58 gain 144 175 -78.96 gain 175 144 -78.77 gain 144 176 -78.82 gain 176 144 -77.60 gain 144 177 -78.91 gain 177 144 -80.69 gain 144 178 -84.62 gain 178 144 -79.85 gain 144 179 -94.28 gain 179 144 -88.93 gain 144 180 -98.36 gain 180 144 -102.46 gain 144 181 -91.45 gain 181 144 -89.57 gain 144 182 -88.51 gain 182 144 -87.71 gain 144 183 -91.54 gain 183 144 -91.02 gain 144 184 -88.28 gain 184 144 -90.50 gain 144 185 -85.18 gain 185 144 -91.27 gain 144 186 -87.86 gain 186 144 -89.53 gain 144 187 -89.39 gain 187 144 -88.79 gain 144 188 -83.32 gain 188 144 -85.13 gain 144 189 -84.78 gain 189 144 -81.32 gain 144 190 -77.84 gain 190 144 -78.29 gain 144 191 -85.68 gain 191 144 -84.84 gain 144 192 -92.65 gain 192 144 -90.51 gain 144 193 -91.93 gain 193 144 -88.77 gain 144 194 -91.05 gain 194 144 -88.67 gain 144 195 -94.49 gain 195 144 -90.66 gain 144 196 -94.03 gain 196 144 -94.51 gain 144 197 -94.63 gain 197 144 -90.25 gain 144 198 -87.22 gain 198 144 -87.35 gain 144 199 -85.77 gain 199 144 -86.01 gain 144 200 -89.51 gain 200 144 -91.08 gain 144 201 -88.85 gain 201 144 -90.33 gain 144 202 -84.38 gain 202 144 -85.00 gain 144 203 -79.81 gain 203 144 -79.54 gain 144 204 -92.62 gain 204 144 -89.00 gain 144 205 -82.07 gain 205 144 -82.18 gain 144 206 -90.08 gain 206 144 -91.30 gain 144 207 -92.73 gain 207 144 -93.37 gain 144 208 -93.19 gain 208 144 -96.43 gain 144 209 -93.29 gain 209 144 -96.11 gain 144 210 -102.37 gain 210 144 -105.36 gain 144 211 -93.82 gain 211 144 -92.04 gain 144 212 -90.31 gain 212 144 -91.54 gain 144 213 -95.72 gain 213 144 -96.28 gain 144 214 -89.38 gain 214 144 -95.32 gain 144 215 -100.10 gain 215 144 -101.45 gain 144 216 -88.98 gain 216 144 -94.24 gain 144 217 -86.29 gain 217 144 -91.81 gain 144 218 -89.07 gain 218 144 -87.39 gain 144 219 -73.86 gain 219 144 -72.66 gain 144 220 -92.79 gain 220 144 -87.68 gain 144 221 -90.20 gain 221 144 -90.78 gain 144 222 -87.54 gain 222 144 -83.92 gain 144 223 -87.07 gain 223 144 -86.69 gain 144 224 -89.59 gain 224 144 -89.68 gain 145 146 -63.35 gain 146 145 -59.34 gain 145 147 -77.86 gain 147 145 -70.96 gain 145 148 -81.98 gain 148 145 -73.41 gain 145 149 -84.68 gain 149 145 -79.76 gain 145 150 -103.91 gain 150 145 -99.83 gain 145 151 -100.82 gain 151 145 -95.68 gain 145 152 -95.94 gain 152 145 -90.61 gain 145 153 -94.13 gain 153 145 -88.02 gain 145 154 -93.34 gain 154 145 -89.13 gain 145 155 -92.43 gain 155 145 -86.80 gain 145 156 -85.53 gain 156 145 -79.13 gain 145 157 -82.16 gain 157 145 -78.24 gain 145 158 -83.57 gain 158 145 -79.15 gain 145 159 -68.41 gain 159 145 -66.37 gain 145 160 -70.93 gain 160 145 -66.05 gain 145 161 -71.61 gain 161 145 -69.17 gain 145 162 -75.16 gain 162 145 -72.42 gain 145 163 -89.94 gain 163 145 -89.12 gain 145 164 -89.11 gain 164 145 -87.66 gain 145 165 -93.38 gain 165 145 -88.98 gain 145 166 -92.39 gain 166 145 -87.75 gain 145 167 -98.94 gain 167 145 -95.03 gain 145 168 -92.30 gain 168 145 -87.28 gain 145 169 -97.64 gain 169 145 -93.73 gain 145 170 -90.25 gain 170 145 -85.57 gain 145 171 -92.00 gain 171 145 -88.41 gain 145 172 -82.44 gain 172 145 -77.03 gain 145 173 -81.66 gain 173 145 -80.90 gain 145 174 -79.19 gain 174 145 -74.48 gain 145 175 -75.10 gain 175 145 -71.53 gain 145 176 -75.53 gain 176 145 -70.93 gain 145 177 -82.10 gain 177 145 -80.49 gain 145 178 -85.53 gain 178 145 -77.37 gain 145 179 -91.65 gain 179 145 -82.91 gain 145 180 -110.15 gain 180 145 -110.86 gain 145 181 -101.57 gain 181 145 -96.30 gain 145 182 -92.68 gain 182 145 -88.49 gain 145 183 -92.46 gain 183 145 -88.55 gain 145 184 -98.07 gain 184 145 -96.91 gain 145 185 -92.24 gain 185 145 -94.95 gain 145 186 -85.60 gain 186 145 -83.88 gain 145 187 -85.56 gain 187 145 -81.57 gain 145 188 -88.43 gain 188 145 -86.85 gain 145 189 -83.06 gain 189 145 -76.21 gain 145 190 -89.61 gain 190 145 -86.68 gain 145 191 -80.77 gain 191 145 -76.54 gain 145 192 -80.65 gain 192 145 -75.12 gain 145 193 -92.49 gain 193 145 -85.94 gain 145 194 -91.15 gain 194 145 -85.39 gain 145 195 -105.79 gain 195 145 -98.58 gain 145 196 -98.53 gain 196 145 -95.62 gain 145 197 -99.36 gain 197 145 -91.59 gain 145 198 -97.07 gain 198 145 -93.81 gain 145 199 -91.47 gain 199 145 -88.32 gain 145 200 -95.00 gain 200 145 -93.19 gain 145 201 -86.44 gain 201 145 -84.54 gain 145 202 -87.51 gain 202 145 -84.74 gain 145 203 -82.19 gain 203 145 -78.53 gain 145 204 -85.52 gain 204 145 -78.50 gain 145 205 -88.30 gain 205 145 -85.02 gain 145 206 -87.59 gain 206 145 -85.43 gain 145 207 -91.67 gain 207 145 -88.92 gain 145 208 -89.05 gain 208 145 -88.90 gain 145 209 -90.96 gain 209 145 -90.39 gain 145 210 -102.12 gain 210 145 -101.72 gain 145 211 -98.86 gain 211 145 -93.69 gain 145 212 -92.48 gain 212 145 -90.32 gain 145 213 -103.27 gain 213 145 -100.44 gain 145 214 -93.33 gain 214 145 -95.89 gain 145 215 -94.54 gain 215 145 -92.50 gain 145 216 -92.87 gain 216 145 -94.74 gain 145 217 -97.71 gain 217 145 -99.84 gain 145 218 -93.49 gain 218 145 -88.43 gain 145 219 -93.27 gain 219 145 -88.69 gain 145 220 -93.69 gain 220 145 -85.20 gain 145 221 -84.31 gain 221 145 -81.49 gain 145 222 -97.57 gain 222 145 -90.57 gain 145 223 -89.66 gain 223 145 -85.89 gain 145 224 -97.20 gain 224 145 -93.90 gain 146 147 -67.98 gain 147 146 -65.08 gain 146 148 -74.48 gain 148 146 -69.92 gain 146 149 -75.73 gain 149 146 -74.82 gain 146 150 -92.50 gain 150 146 -92.43 gain 146 151 -93.11 gain 151 146 -91.98 gain 146 152 -98.78 gain 152 146 -97.47 gain 146 153 -91.21 gain 153 146 -89.11 gain 146 154 -92.17 gain 154 146 -91.97 gain 146 155 -86.68 gain 155 146 -85.05 gain 146 156 -88.57 gain 156 146 -86.17 gain 146 157 -83.01 gain 157 146 -83.10 gain 146 158 -84.12 gain 158 146 -83.71 gain 146 159 -77.09 gain 159 146 -79.07 gain 146 160 -72.85 gain 160 146 -71.97 gain 146 161 -63.16 gain 161 146 -64.73 gain 146 162 -74.92 gain 162 146 -76.20 gain 146 163 -72.04 gain 163 146 -75.23 gain 146 164 -81.03 gain 164 146 -83.58 gain 146 165 -102.94 gain 165 146 -102.56 gain 146 166 -90.80 gain 166 146 -90.17 gain 146 167 -89.35 gain 167 146 -89.45 gain 146 168 -89.69 gain 168 146 -88.68 gain 146 169 -83.35 gain 169 146 -83.45 gain 146 170 -91.45 gain 170 146 -90.79 gain 146 171 -84.57 gain 171 146 -84.98 gain 146 172 -91.50 gain 172 146 -90.10 gain 146 173 -79.05 gain 173 146 -82.30 gain 146 174 -78.77 gain 174 146 -78.07 gain 146 175 -76.74 gain 175 146 -77.17 gain 146 176 -69.57 gain 176 146 -68.98 gain 146 177 -70.66 gain 177 146 -73.06 gain 146 178 -80.23 gain 178 146 -76.08 gain 146 179 -80.51 gain 179 146 -75.78 gain 146 180 -99.22 gain 180 146 -103.94 gain 146 181 -97.89 gain 181 146 -96.63 gain 146 182 -93.34 gain 182 146 -93.16 gain 146 183 -95.33 gain 183 146 -95.43 gain 146 184 -93.20 gain 184 146 -96.05 gain 146 185 -90.50 gain 185 146 -97.21 gain 146 186 -88.04 gain 186 146 -90.33 gain 146 187 -83.88 gain 187 146 -83.91 gain 146 188 -85.48 gain 188 146 -87.91 gain 146 189 -83.26 gain 189 146 -80.42 gain 146 190 -83.89 gain 190 146 -84.97 gain 146 191 -81.35 gain 191 146 -81.13 gain 146 192 -80.73 gain 192 146 -79.21 gain 146 193 -86.49 gain 193 146 -83.95 gain 146 194 -82.86 gain 194 146 -81.10 gain 146 195 -96.32 gain 195 146 -93.11 gain 146 196 -95.72 gain 196 146 -96.83 gain 146 197 -90.39 gain 197 146 -86.63 gain 146 198 -98.52 gain 198 146 -99.27 gain 146 199 -94.49 gain 199 146 -95.35 gain 146 200 -94.94 gain 200 146 -97.14 gain 146 201 -88.35 gain 201 146 -90.45 gain 146 202 -88.89 gain 202 146 -90.13 gain 146 203 -91.57 gain 203 146 -91.92 gain 146 204 -81.94 gain 204 146 -78.93 gain 146 205 -82.15 gain 205 146 -82.89 gain 146 206 -89.39 gain 206 146 -91.24 gain 146 207 -80.34 gain 207 146 -81.61 gain 146 208 -86.31 gain 208 146 -90.18 gain 146 209 -89.30 gain 209 146 -92.73 gain 146 210 -92.43 gain 210 146 -96.03 gain 146 211 -94.09 gain 211 146 -92.93 gain 146 212 -98.54 gain 212 146 -100.39 gain 146 213 -89.39 gain 213 146 -90.57 gain 146 214 -95.68 gain 214 146 -102.25 gain 146 215 -94.14 gain 215 146 -96.11 gain 146 216 -84.66 gain 216 146 -90.54 gain 146 217 -89.94 gain 217 146 -96.08 gain 146 218 -89.98 gain 218 146 -88.93 gain 146 219 -87.66 gain 219 146 -87.09 gain 146 220 -85.80 gain 220 146 -81.31 gain 146 221 -88.57 gain 221 146 -89.77 gain 146 222 -93.03 gain 222 146 -90.04 gain 146 223 -85.68 gain 223 146 -85.93 gain 146 224 -89.24 gain 224 146 -89.95 gain 147 148 -58.73 gain 148 147 -57.06 gain 147 149 -70.01 gain 149 147 -72.00 gain 147 150 -95.28 gain 150 147 -98.11 gain 147 151 -86.39 gain 151 147 -88.15 gain 147 152 -91.38 gain 152 147 -92.96 gain 147 153 -87.23 gain 153 147 -88.02 gain 147 154 -100.10 gain 154 147 -102.80 gain 147 155 -90.38 gain 155 147 -91.65 gain 147 156 -85.68 gain 156 147 -86.17 gain 147 157 -83.43 gain 157 147 -86.41 gain 147 158 -81.25 gain 158 147 -83.73 gain 147 159 -79.70 gain 159 147 -84.56 gain 147 160 -78.52 gain 160 147 -80.54 gain 147 161 -60.83 gain 161 147 -65.29 gain 147 162 -61.30 gain 162 147 -65.47 gain 147 163 -75.37 gain 163 147 -81.46 gain 147 164 -77.17 gain 164 147 -82.62 gain 147 165 -95.18 gain 165 147 -97.69 gain 147 166 -98.55 gain 166 147 -100.81 gain 147 167 -90.27 gain 167 147 -93.25 gain 147 168 -83.86 gain 168 147 -85.74 gain 147 169 -90.57 gain 169 147 -93.57 gain 147 170 -90.24 gain 170 147 -92.47 gain 147 171 -83.26 gain 171 147 -86.57 gain 147 172 -82.16 gain 172 147 -83.65 gain 147 173 -80.38 gain 173 147 -86.52 gain 147 174 -75.35 gain 174 147 -77.54 gain 147 175 -78.21 gain 175 147 -81.53 gain 147 176 -80.40 gain 176 147 -82.70 gain 147 177 -73.15 gain 177 147 -78.45 gain 147 178 -66.10 gain 178 147 -64.84 gain 147 179 -76.02 gain 179 147 -74.18 gain 147 180 -99.84 gain 180 147 -107.45 gain 147 181 -92.96 gain 181 147 -94.59 gain 147 182 -96.18 gain 182 147 -98.90 gain 147 183 -83.08 gain 183 147 -86.07 gain 147 184 -90.63 gain 184 147 -96.37 gain 147 185 -92.23 gain 185 147 -101.83 gain 147 186 -85.56 gain 186 147 -90.74 gain 147 187 -82.06 gain 187 147 -84.97 gain 147 188 -75.48 gain 188 147 -80.80 gain 147 189 -77.41 gain 189 147 -77.46 gain 147 190 -78.41 gain 190 147 -82.37 gain 147 191 -76.26 gain 191 147 -78.94 gain 147 192 -75.70 gain 192 147 -77.07 gain 147 193 -81.53 gain 193 147 -81.89 gain 147 194 -78.10 gain 194 147 -79.24 gain 147 195 -99.38 gain 195 147 -99.07 gain 147 196 -89.08 gain 196 147 -93.08 gain 147 197 -100.46 gain 197 147 -99.59 gain 147 198 -88.72 gain 198 147 -92.37 gain 147 199 -82.39 gain 199 147 -86.14 gain 147 200 -92.79 gain 200 147 -97.88 gain 147 201 -87.39 gain 201 147 -92.38 gain 147 202 -81.57 gain 202 147 -85.70 gain 147 203 -90.00 gain 203 147 -93.24 gain 147 204 -81.06 gain 204 147 -80.94 gain 147 205 -88.67 gain 205 147 -92.30 gain 147 206 -76.47 gain 206 147 -81.20 gain 147 207 -82.81 gain 207 147 -86.97 gain 147 208 -87.48 gain 208 147 -94.23 gain 147 209 -78.13 gain 209 147 -84.46 gain 147 210 -94.59 gain 210 147 -101.09 gain 147 211 -99.47 gain 211 147 -101.20 gain 147 212 -95.50 gain 212 147 -100.25 gain 147 213 -101.93 gain 213 147 -106.00 gain 147 214 -88.51 gain 214 147 -97.97 gain 147 215 -90.89 gain 215 147 -95.76 gain 147 216 -90.59 gain 216 147 -99.36 gain 147 217 -88.54 gain 217 147 -97.58 gain 147 218 -92.13 gain 218 147 -93.97 gain 147 219 -89.17 gain 219 147 -91.49 gain 147 220 -88.75 gain 220 147 -87.16 gain 147 221 -87.42 gain 221 147 -91.51 gain 147 222 -90.16 gain 222 147 -90.05 gain 147 223 -85.29 gain 223 147 -88.43 gain 147 224 -83.95 gain 224 147 -87.55 gain 148 149 -58.20 gain 149 148 -61.85 gain 148 150 -91.21 gain 150 148 -95.71 gain 148 151 -91.44 gain 151 148 -94.87 gain 148 152 -90.98 gain 152 148 -94.23 gain 148 153 -97.47 gain 153 148 -99.94 gain 148 154 -88.87 gain 154 148 -93.24 gain 148 155 -92.85 gain 155 148 -95.79 gain 148 156 -86.82 gain 156 148 -88.99 gain 148 157 -81.91 gain 157 148 -86.56 gain 148 158 -86.26 gain 158 148 -90.41 gain 148 159 -79.84 gain 159 148 -86.37 gain 148 160 -78.95 gain 160 148 -82.64 gain 148 161 -67.55 gain 161 148 -73.68 gain 148 162 -64.34 gain 162 148 -70.18 gain 148 163 -63.88 gain 163 148 -71.63 gain 148 164 -68.84 gain 164 148 -75.96 gain 148 165 -93.06 gain 165 148 -97.24 gain 148 166 -95.40 gain 166 148 -99.34 gain 148 167 -91.17 gain 167 148 -95.82 gain 148 168 -88.05 gain 168 148 -91.60 gain 148 169 -92.69 gain 169 148 -97.35 gain 148 170 -88.60 gain 170 148 -92.50 gain 148 171 -78.00 gain 171 148 -82.98 gain 148 172 -83.24 gain 172 148 -86.40 gain 148 173 -79.46 gain 173 148 -87.27 gain 148 174 -83.12 gain 174 148 -86.98 gain 148 175 -78.83 gain 175 148 -83.82 gain 148 176 -76.81 gain 176 148 -80.77 gain 148 177 -69.95 gain 177 148 -76.92 gain 148 178 -75.05 gain 178 148 -75.46 gain 148 179 -75.73 gain 179 148 -75.57 gain 148 180 -90.71 gain 180 148 -99.99 gain 148 181 -95.61 gain 181 148 -98.91 gain 148 182 -88.70 gain 182 148 -93.09 gain 148 183 -92.49 gain 183 148 -97.15 gain 148 184 -90.02 gain 184 148 -97.43 gain 148 185 -85.86 gain 185 148 -97.14 gain 148 186 -85.73 gain 186 148 -92.59 gain 148 187 -72.26 gain 187 148 -76.85 gain 148 188 -82.71 gain 188 148 -89.71 gain 148 189 -77.38 gain 189 148 -79.10 gain 148 190 -79.52 gain 190 148 -85.16 gain 148 191 -71.26 gain 191 148 -75.60 gain 148 192 -76.18 gain 192 148 -79.22 gain 148 193 -77.04 gain 193 148 -79.07 gain 148 194 -78.54 gain 194 148 -81.35 gain 148 195 -98.76 gain 195 148 -100.12 gain 148 196 -95.21 gain 196 148 -100.88 gain 148 197 -96.68 gain 197 148 -97.48 gain 148 198 -99.37 gain 198 148 -104.69 gain 148 199 -89.55 gain 199 148 -94.98 gain 148 200 -88.27 gain 200 148 -95.03 gain 148 201 -85.69 gain 201 148 -92.36 gain 148 202 -85.66 gain 202 148 -91.46 gain 148 203 -93.04 gain 203 148 -97.95 gain 148 204 -81.24 gain 204 148 -82.80 gain 148 205 -82.17 gain 205 148 -87.47 gain 148 206 -77.81 gain 206 148 -84.22 gain 148 207 -75.55 gain 207 148 -81.38 gain 148 208 -77.39 gain 208 148 -85.82 gain 148 209 -80.19 gain 209 148 -88.19 gain 148 210 -97.33 gain 210 148 -105.50 gain 148 211 -90.47 gain 211 148 -93.88 gain 148 212 -91.78 gain 212 148 -98.20 gain 148 213 -93.33 gain 213 148 -99.07 gain 148 214 -87.49 gain 214 148 -98.62 gain 148 215 -97.20 gain 215 148 -103.73 gain 148 216 -88.82 gain 216 148 -99.26 gain 148 217 -85.53 gain 217 148 -96.24 gain 148 218 -81.28 gain 218 148 -84.79 gain 148 219 -88.79 gain 219 148 -92.78 gain 148 220 -85.12 gain 220 148 -85.20 gain 148 221 -85.69 gain 221 148 -91.45 gain 148 222 -93.60 gain 222 148 -95.17 gain 148 223 -80.79 gain 223 148 -85.60 gain 148 224 -81.80 gain 224 148 -87.07 gain 149 150 -92.66 gain 150 149 -93.49 gain 149 151 -102.09 gain 151 149 -101.87 gain 149 152 -95.31 gain 152 149 -94.91 gain 149 153 -100.17 gain 153 149 -98.98 gain 149 154 -90.36 gain 154 149 -91.07 gain 149 155 -94.40 gain 155 149 -93.68 gain 149 156 -90.07 gain 156 149 -88.59 gain 149 157 -89.37 gain 157 149 -90.37 gain 149 158 -89.01 gain 158 149 -89.51 gain 149 159 -85.33 gain 159 149 -88.21 gain 149 160 -85.09 gain 160 149 -85.12 gain 149 161 -85.74 gain 161 149 -88.21 gain 149 162 -68.87 gain 162 149 -71.05 gain 149 163 -70.65 gain 163 149 -74.74 gain 149 164 -60.64 gain 164 149 -64.11 gain 149 165 -93.23 gain 165 149 -93.76 gain 149 166 -94.56 gain 166 149 -94.83 gain 149 167 -96.03 gain 167 149 -97.03 gain 149 168 -96.90 gain 168 149 -96.79 gain 149 169 -92.90 gain 169 149 -93.91 gain 149 170 -90.30 gain 170 149 -90.54 gain 149 171 -96.00 gain 171 149 -97.32 gain 149 172 -93.95 gain 172 149 -93.46 gain 149 173 -92.77 gain 173 149 -96.92 gain 149 174 -89.97 gain 174 149 -90.18 gain 149 175 -82.89 gain 175 149 -84.23 gain 149 176 -79.40 gain 176 149 -79.71 gain 149 177 -83.00 gain 177 149 -86.31 gain 149 178 -77.29 gain 178 149 -74.04 gain 149 179 -70.24 gain 179 149 -66.42 gain 149 180 -100.20 gain 180 149 -105.83 gain 149 181 -99.26 gain 181 149 -98.91 gain 149 182 -93.09 gain 182 149 -93.82 gain 149 183 -101.31 gain 183 149 -102.32 gain 149 184 -89.67 gain 184 149 -93.42 gain 149 185 -89.72 gain 185 149 -97.34 gain 149 186 -97.42 gain 186 149 -100.62 gain 149 187 -97.06 gain 187 149 -97.99 gain 149 188 -81.38 gain 188 149 -84.72 gain 149 189 -86.14 gain 189 149 -84.20 gain 149 190 -88.28 gain 190 149 -90.26 gain 149 191 -90.63 gain 191 149 -91.32 gain 149 192 -73.63 gain 192 149 -73.02 gain 149 193 -84.11 gain 193 149 -82.48 gain 149 194 -70.59 gain 194 149 -69.75 gain 149 195 -98.61 gain 195 149 -96.31 gain 149 196 -104.14 gain 196 149 -106.15 gain 149 197 -101.16 gain 197 149 -98.31 gain 149 198 -105.09 gain 198 149 -106.75 gain 149 199 -95.12 gain 199 149 -96.89 gain 149 200 -90.77 gain 200 149 -93.87 gain 149 201 -87.53 gain 201 149 -90.54 gain 149 202 -95.15 gain 202 149 -97.29 gain 149 203 -88.48 gain 203 149 -89.73 gain 149 204 -87.26 gain 204 149 -85.16 gain 149 205 -83.13 gain 205 149 -84.77 gain 149 206 -84.82 gain 206 149 -87.57 gain 149 207 -83.31 gain 207 149 -85.48 gain 149 208 -84.42 gain 208 149 -89.19 gain 149 209 -85.23 gain 209 149 -89.57 gain 149 210 -101.70 gain 210 149 -106.22 gain 149 211 -103.97 gain 211 149 -103.72 gain 149 212 -101.42 gain 212 149 -104.18 gain 149 213 -98.18 gain 213 149 -100.27 gain 149 214 -100.60 gain 214 149 -108.07 gain 149 215 -91.13 gain 215 149 -94.01 gain 149 216 -89.77 gain 216 149 -96.56 gain 149 217 -88.76 gain 217 149 -95.81 gain 149 218 -92.92 gain 218 149 -92.78 gain 149 219 -89.34 gain 219 149 -89.67 gain 149 220 -92.43 gain 220 149 -88.86 gain 149 221 -88.52 gain 221 149 -90.62 gain 149 222 -87.06 gain 222 149 -84.97 gain 149 223 -81.69 gain 223 149 -82.85 gain 149 224 -86.67 gain 224 149 -88.28 gain 150 151 -61.67 gain 151 150 -60.61 gain 150 152 -72.06 gain 152 150 -70.82 gain 150 153 -88.22 gain 153 150 -86.20 gain 150 154 -85.89 gain 154 150 -85.76 gain 150 155 -76.57 gain 155 150 -75.02 gain 150 156 -93.42 gain 156 150 -91.10 gain 150 157 -96.77 gain 157 150 -96.93 gain 150 158 -94.75 gain 158 150 -94.41 gain 150 159 -94.39 gain 159 150 -96.43 gain 150 160 -86.31 gain 160 150 -85.51 gain 150 161 -85.38 gain 161 150 -87.02 gain 150 162 -102.16 gain 162 150 -103.50 gain 150 163 -86.40 gain 163 150 -89.66 gain 150 164 -102.51 gain 164 150 -105.14 gain 150 165 -66.11 gain 165 150 -65.79 gain 150 166 -65.79 gain 166 150 -65.23 gain 150 167 -68.41 gain 167 150 -68.57 gain 150 168 -83.82 gain 168 150 -82.88 gain 150 169 -84.59 gain 169 150 -84.76 gain 150 170 -91.14 gain 170 150 -90.55 gain 150 171 -90.05 gain 171 150 -90.54 gain 150 172 -92.70 gain 172 150 -91.38 gain 150 173 -87.86 gain 173 150 -91.18 gain 150 174 -91.98 gain 174 150 -91.35 gain 150 175 -97.06 gain 175 150 -97.56 gain 150 176 -97.44 gain 176 150 -96.91 gain 150 177 -92.57 gain 177 150 -95.04 gain 150 178 -97.57 gain 178 150 -93.49 gain 150 179 -92.51 gain 179 150 -87.85 gain 150 180 -71.36 gain 180 150 -76.15 gain 150 181 -76.49 gain 181 150 -75.30 gain 150 182 -77.56 gain 182 150 -77.45 gain 150 183 -83.17 gain 183 150 -83.34 gain 150 184 -89.21 gain 184 150 -92.13 gain 150 185 -83.16 gain 185 150 -89.94 gain 150 186 -85.65 gain 186 150 -88.01 gain 150 187 -89.20 gain 187 150 -89.29 gain 150 188 -88.20 gain 188 150 -90.70 gain 150 189 -95.68 gain 189 150 -92.91 gain 150 190 -99.43 gain 190 150 -100.57 gain 150 191 -89.36 gain 191 150 -89.21 gain 150 192 -98.41 gain 192 150 -96.95 gain 150 193 -95.35 gain 193 150 -92.89 gain 150 194 -99.03 gain 194 150 -97.34 gain 150 195 -73.57 gain 195 150 -70.43 gain 150 196 -85.73 gain 196 150 -86.91 gain 150 197 -73.45 gain 197 150 -69.76 gain 150 198 -84.00 gain 198 150 -84.82 gain 150 199 -83.21 gain 199 150 -84.13 gain 150 200 -85.68 gain 200 150 -87.94 gain 150 201 -89.81 gain 201 150 -91.98 gain 150 202 -98.22 gain 202 150 -99.53 gain 150 203 -93.10 gain 203 150 -93.52 gain 150 204 -95.84 gain 204 150 -92.90 gain 150 205 -103.85 gain 205 150 -104.65 gain 150 206 -98.88 gain 206 150 -100.80 gain 150 207 -93.62 gain 207 150 -94.95 gain 150 208 -99.93 gain 208 150 -103.86 gain 150 209 -104.57 gain 209 150 -108.07 gain 150 210 -77.91 gain 210 150 -81.60 gain 150 211 -78.30 gain 211 150 -77.22 gain 150 212 -90.63 gain 212 150 -92.55 gain 150 213 -80.95 gain 213 150 -82.20 gain 150 214 -88.50 gain 214 150 -95.14 gain 150 215 -90.40 gain 215 150 -92.44 gain 150 216 -86.38 gain 216 150 -92.33 gain 150 217 -92.12 gain 217 150 -98.34 gain 150 218 -88.21 gain 218 150 -87.23 gain 150 219 -91.27 gain 219 150 -90.77 gain 150 220 -101.52 gain 220 150 -97.11 gain 150 221 -90.00 gain 221 150 -91.27 gain 150 222 -99.79 gain 222 150 -96.86 gain 150 223 -95.10 gain 223 150 -95.41 gain 150 224 -100.14 gain 224 150 -100.92 gain 151 152 -70.29 gain 152 151 -70.11 gain 151 153 -71.04 gain 153 151 -70.07 gain 151 154 -79.59 gain 154 151 -80.52 gain 151 155 -86.91 gain 155 151 -86.42 gain 151 156 -94.46 gain 156 151 -93.20 gain 151 157 -91.65 gain 157 151 -92.87 gain 151 158 -94.61 gain 158 151 -95.33 gain 151 159 -92.89 gain 159 151 -96.00 gain 151 160 -90.91 gain 160 151 -91.17 gain 151 161 -97.14 gain 161 151 -99.83 gain 151 162 -96.42 gain 162 151 -98.82 gain 151 163 -96.66 gain 163 151 -100.98 gain 151 164 -97.88 gain 164 151 -101.57 gain 151 165 -63.39 gain 165 151 -64.13 gain 151 166 -71.92 gain 166 151 -72.42 gain 151 167 -64.86 gain 167 151 -66.08 gain 151 168 -72.57 gain 168 151 -72.68 gain 151 169 -75.62 gain 169 151 -76.85 gain 151 170 -79.15 gain 170 151 -79.61 gain 151 171 -91.94 gain 171 151 -93.49 gain 151 172 -83.78 gain 172 151 -83.51 gain 151 173 -94.64 gain 173 151 -99.02 gain 151 174 -86.32 gain 174 151 -86.75 gain 151 175 -101.10 gain 175 151 -102.66 gain 151 176 -96.13 gain 176 151 -96.67 gain 151 177 -101.45 gain 177 151 -104.99 gain 151 178 -101.82 gain 178 151 -98.80 gain 151 179 -96.77 gain 179 151 -93.17 gain 151 180 -70.92 gain 180 151 -76.76 gain 151 181 -75.94 gain 181 151 -75.81 gain 151 182 -69.08 gain 182 151 -70.03 gain 151 183 -77.12 gain 183 151 -78.35 gain 151 184 -88.71 gain 184 151 -92.69 gain 151 185 -78.03 gain 185 151 -85.87 gain 151 186 -85.93 gain 186 151 -89.35 gain 151 187 -96.65 gain 187 151 -97.80 gain 151 188 -86.87 gain 188 151 -90.44 gain 151 189 -90.67 gain 189 151 -88.96 gain 151 190 -89.80 gain 190 151 -92.01 gain 151 191 -96.52 gain 191 151 -97.43 gain 151 192 -100.80 gain 192 151 -100.40 gain 151 193 -104.61 gain 193 151 -103.21 gain 151 194 -105.66 gain 194 151 -105.03 gain 151 195 -81.12 gain 195 151 -79.05 gain 151 196 -82.58 gain 196 151 -84.81 gain 151 197 -83.95 gain 197 151 -81.32 gain 151 198 -78.95 gain 198 151 -80.83 gain 151 199 -75.49 gain 199 151 -77.47 gain 151 200 -89.25 gain 200 151 -92.57 gain 151 201 -87.15 gain 201 151 -90.38 gain 151 202 -90.52 gain 202 151 -92.88 gain 151 203 -83.38 gain 203 151 -84.86 gain 151 204 -87.16 gain 204 151 -85.28 gain 151 205 -96.35 gain 205 151 -98.22 gain 151 206 -93.00 gain 206 151 -95.97 gain 151 207 -97.69 gain 207 151 -100.08 gain 151 208 -96.02 gain 208 151 -101.01 gain 151 209 -99.01 gain 209 151 -103.58 gain 151 210 -77.54 gain 210 151 -82.28 gain 151 211 -83.47 gain 211 151 -83.44 gain 151 212 -77.94 gain 212 151 -80.92 gain 151 213 -82.44 gain 213 151 -84.75 gain 151 214 -86.58 gain 214 151 -94.28 gain 151 215 -89.66 gain 215 151 -92.76 gain 151 216 -87.26 gain 216 151 -94.27 gain 151 217 -95.37 gain 217 151 -102.64 gain 151 218 -92.97 gain 218 151 -93.05 gain 151 219 -94.56 gain 219 151 -95.12 gain 151 220 -95.37 gain 220 151 -92.02 gain 151 221 -97.52 gain 221 151 -99.85 gain 151 222 -92.37 gain 222 151 -90.51 gain 151 223 -99.97 gain 223 151 -101.34 gain 151 224 -96.93 gain 224 151 -98.77 gain 152 153 -58.94 gain 153 152 -58.15 gain 152 154 -75.67 gain 154 152 -76.78 gain 152 155 -76.52 gain 155 152 -76.21 gain 152 156 -90.11 gain 156 152 -89.03 gain 152 157 -78.50 gain 157 152 -79.91 gain 152 158 -84.37 gain 158 152 -85.27 gain 152 159 -85.34 gain 159 152 -88.63 gain 152 160 -97.28 gain 160 152 -97.72 gain 152 161 -90.58 gain 161 152 -93.46 gain 152 162 -91.93 gain 162 152 -94.52 gain 152 163 -98.79 gain 163 152 -103.30 gain 152 164 -100.32 gain 164 152 -104.19 gain 152 165 -77.95 gain 165 152 -78.88 gain 152 166 -65.72 gain 166 152 -66.41 gain 152 167 -64.76 gain 167 152 -66.16 gain 152 168 -63.01 gain 168 152 -63.31 gain 152 169 -75.11 gain 169 152 -76.52 gain 152 170 -78.44 gain 170 152 -79.08 gain 152 171 -73.56 gain 171 152 -75.29 gain 152 172 -89.76 gain 172 152 -89.68 gain 152 173 -86.18 gain 173 152 -90.74 gain 152 174 -90.84 gain 174 152 -91.45 gain 152 175 -91.46 gain 175 152 -93.21 gain 152 176 -93.47 gain 176 152 -94.19 gain 152 177 -86.71 gain 177 152 -90.43 gain 152 178 -98.89 gain 178 152 -96.05 gain 152 179 -92.40 gain 179 152 -88.98 gain 152 180 -78.11 gain 180 152 -84.14 gain 152 181 -63.61 gain 181 152 -63.66 gain 152 182 -70.09 gain 182 152 -71.23 gain 152 183 -76.24 gain 183 152 -77.65 gain 152 184 -74.65 gain 184 152 -78.81 gain 152 185 -75.93 gain 185 152 -83.96 gain 152 186 -82.00 gain 186 152 -85.61 gain 152 187 -87.70 gain 187 152 -89.04 gain 152 188 -89.29 gain 188 152 -93.04 gain 152 189 -89.16 gain 189 152 -87.63 gain 152 190 -89.80 gain 190 152 -92.19 gain 152 191 -95.02 gain 191 152 -96.12 gain 152 192 -94.52 gain 192 152 -94.31 gain 152 193 -94.91 gain 193 152 -93.69 gain 152 194 -96.34 gain 194 152 -95.90 gain 152 195 -77.79 gain 195 152 -75.89 gain 152 196 -81.18 gain 196 152 -83.60 gain 152 197 -71.51 gain 197 152 -69.06 gain 152 198 -76.79 gain 198 152 -78.85 gain 152 199 -79.85 gain 199 152 -82.02 gain 152 200 -81.95 gain 200 152 -85.46 gain 152 201 -87.45 gain 201 152 -90.86 gain 152 202 -93.55 gain 202 152 -96.10 gain 152 203 -94.83 gain 203 152 -96.49 gain 152 204 -83.40 gain 204 152 -81.71 gain 152 205 -92.06 gain 205 152 -94.11 gain 152 206 -98.25 gain 206 152 -101.41 gain 152 207 -94.36 gain 207 152 -96.94 gain 152 208 -93.55 gain 208 152 -98.72 gain 152 209 -97.69 gain 209 152 -102.44 gain 152 210 -85.90 gain 210 152 -90.82 gain 152 211 -78.56 gain 211 152 -78.72 gain 152 212 -78.75 gain 212 152 -81.92 gain 152 213 -79.16 gain 213 152 -81.65 gain 152 214 -77.52 gain 214 152 -85.40 gain 152 215 -82.24 gain 215 152 -85.52 gain 152 216 -91.72 gain 216 152 -98.91 gain 152 217 -84.59 gain 217 152 -92.04 gain 152 218 -87.12 gain 218 152 -87.39 gain 152 219 -84.58 gain 219 152 -85.32 gain 152 220 -87.60 gain 220 152 -84.43 gain 152 221 -89.23 gain 221 152 -91.74 gain 152 222 -101.02 gain 222 152 -99.34 gain 152 223 -94.44 gain 223 152 -96.00 gain 152 224 -93.67 gain 224 152 -95.69 gain 153 154 -64.15 gain 154 153 -66.05 gain 153 155 -73.18 gain 155 153 -73.65 gain 153 156 -80.74 gain 156 153 -80.44 gain 153 157 -83.59 gain 157 153 -85.78 gain 153 158 -85.73 gain 158 153 -87.41 gain 153 159 -78.49 gain 159 153 -82.56 gain 153 160 -89.48 gain 160 153 -90.71 gain 153 161 -98.63 gain 161 153 -102.30 gain 153 162 -90.96 gain 162 153 -94.34 gain 153 163 -95.07 gain 163 153 -100.36 gain 153 164 -96.33 gain 164 153 -100.99 gain 153 165 -74.64 gain 165 153 -76.36 gain 153 166 -78.39 gain 166 153 -79.86 gain 153 167 -68.89 gain 167 153 -71.08 gain 153 168 -70.22 gain 168 153 -71.30 gain 153 169 -69.44 gain 169 153 -71.64 gain 153 170 -75.20 gain 170 153 -76.63 gain 153 171 -80.30 gain 171 153 -82.82 gain 153 172 -80.35 gain 172 153 -81.06 gain 153 173 -81.19 gain 173 153 -86.54 gain 153 174 -86.63 gain 174 153 -88.03 gain 153 175 -86.64 gain 175 153 -89.18 gain 153 176 -93.25 gain 176 153 -94.75 gain 153 177 -91.06 gain 177 153 -95.56 gain 153 178 -92.51 gain 178 153 -90.46 gain 153 179 -92.14 gain 179 153 -89.50 gain 153 180 -83.74 gain 180 153 -90.55 gain 153 181 -78.13 gain 181 153 -78.97 gain 153 182 -72.06 gain 182 153 -73.98 gain 153 183 -76.80 gain 183 153 -79.00 gain 153 184 -74.13 gain 184 153 -79.08 gain 153 185 -77.99 gain 185 153 -86.80 gain 153 186 -85.53 gain 186 153 -89.93 gain 153 187 -75.24 gain 187 153 -77.37 gain 153 188 -83.92 gain 188 153 -88.45 gain 153 189 -86.18 gain 189 153 -85.44 gain 153 190 -91.22 gain 190 153 -94.39 gain 153 191 -89.78 gain 191 153 -91.66 gain 153 192 -96.28 gain 192 153 -96.85 gain 153 193 -90.41 gain 193 153 -89.97 gain 153 194 -101.71 gain 194 153 -102.05 gain 153 195 -80.03 gain 195 153 -78.93 gain 153 196 -75.87 gain 196 153 -79.08 gain 153 197 -76.76 gain 197 153 -75.10 gain 153 198 -76.69 gain 198 153 -79.55 gain 153 199 -80.09 gain 199 153 -83.05 gain 153 200 -80.42 gain 200 153 -84.71 gain 153 201 -80.14 gain 201 153 -84.35 gain 153 202 -82.94 gain 202 153 -86.27 gain 153 203 -90.36 gain 203 153 -92.81 gain 153 204 -89.55 gain 204 153 -88.64 gain 153 205 -93.10 gain 205 153 -95.93 gain 153 206 -89.10 gain 206 153 -93.04 gain 153 207 -98.83 gain 207 153 -102.19 gain 153 208 -100.08 gain 208 153 -106.05 gain 153 209 -103.46 gain 209 153 -108.99 gain 153 210 -89.48 gain 210 153 -95.19 gain 153 211 -78.97 gain 211 153 -79.91 gain 153 212 -78.90 gain 212 153 -82.85 gain 153 213 -85.57 gain 213 153 -88.85 gain 153 214 -87.68 gain 214 153 -96.35 gain 153 215 -82.41 gain 215 153 -86.48 gain 153 216 -87.76 gain 216 153 -95.74 gain 153 217 -92.32 gain 217 153 -100.56 gain 153 218 -85.93 gain 218 153 -86.98 gain 153 219 -95.08 gain 219 153 -96.61 gain 153 220 -97.39 gain 220 153 -95.00 gain 153 221 -94.29 gain 221 153 -97.59 gain 153 222 -93.44 gain 222 153 -92.54 gain 153 223 -94.15 gain 223 153 -96.50 gain 153 224 -87.91 gain 224 153 -90.73 gain 154 155 -74.74 gain 155 154 -73.32 gain 154 156 -67.62 gain 156 154 -65.42 gain 154 157 -77.82 gain 157 154 -78.10 gain 154 158 -86.01 gain 158 154 -85.80 gain 154 159 -82.92 gain 159 154 -85.09 gain 154 160 -87.79 gain 160 154 -87.11 gain 154 161 -84.74 gain 161 154 -86.51 gain 154 162 -84.33 gain 162 154 -85.80 gain 154 163 -98.37 gain 163 154 -101.76 gain 154 164 -96.11 gain 164 154 -98.87 gain 154 165 -86.73 gain 165 154 -86.55 gain 154 166 -81.00 gain 166 154 -80.56 gain 154 167 -78.37 gain 167 154 -78.66 gain 154 168 -63.83 gain 168 154 -63.01 gain 154 169 -65.19 gain 169 154 -65.49 gain 154 170 -68.87 gain 170 154 -68.41 gain 154 171 -78.78 gain 171 154 -79.40 gain 154 172 -82.26 gain 172 154 -81.06 gain 154 173 -79.54 gain 173 154 -82.99 gain 154 174 -82.21 gain 174 154 -81.71 gain 154 175 -87.46 gain 175 154 -88.09 gain 154 176 -97.66 gain 176 154 -97.26 gain 154 177 -98.12 gain 177 154 -100.72 gain 154 178 -97.64 gain 178 154 -93.68 gain 154 179 -90.97 gain 179 154 -86.44 gain 154 180 -78.11 gain 180 154 -83.03 gain 154 181 -80.33 gain 181 154 -79.26 gain 154 182 -71.71 gain 182 154 -71.74 gain 154 183 -77.78 gain 183 154 -78.08 gain 154 184 -69.63 gain 184 154 -72.68 gain 154 185 -79.75 gain 185 154 -86.66 gain 154 186 -79.76 gain 186 154 -82.25 gain 154 187 -84.95 gain 187 154 -85.17 gain 154 188 -91.73 gain 188 154 -94.37 gain 154 189 -90.04 gain 189 154 -87.40 gain 154 190 -90.80 gain 190 154 -92.07 gain 154 191 -85.92 gain 191 154 -85.90 gain 154 192 -98.00 gain 192 154 -96.68 gain 154 193 -92.87 gain 193 154 -90.54 gain 154 194 -97.33 gain 194 154 -95.78 gain 154 195 -88.86 gain 195 154 -85.85 gain 154 196 -80.35 gain 196 154 -81.65 gain 154 197 -86.34 gain 197 154 -82.77 gain 154 198 -85.64 gain 198 154 -86.59 gain 154 199 -81.78 gain 199 154 -82.83 gain 154 200 -83.42 gain 200 154 -85.82 gain 154 201 -81.29 gain 201 154 -83.59 gain 154 202 -97.27 gain 202 154 -98.71 gain 154 203 -85.53 gain 203 154 -86.08 gain 154 204 -89.14 gain 204 154 -86.33 gain 154 205 -91.39 gain 205 154 -92.32 gain 154 206 -92.42 gain 206 154 -94.46 gain 154 207 -92.50 gain 207 154 -93.96 gain 154 208 -92.65 gain 208 154 -96.71 gain 154 209 -96.02 gain 209 154 -99.66 gain 154 210 -85.09 gain 210 154 -88.90 gain 154 211 -86.95 gain 211 154 -85.99 gain 154 212 -88.06 gain 212 154 -90.11 gain 154 213 -81.98 gain 213 154 -83.36 gain 154 214 -83.08 gain 214 154 -89.85 gain 154 215 -87.51 gain 215 154 -89.67 gain 154 216 -79.41 gain 216 154 -85.49 gain 154 217 -81.99 gain 217 154 -88.33 gain 154 218 -87.91 gain 218 154 -87.06 gain 154 219 -89.56 gain 219 154 -89.18 gain 154 220 -86.94 gain 220 154 -82.65 gain 154 221 -88.68 gain 221 154 -90.07 gain 154 222 -86.69 gain 222 154 -83.89 gain 154 223 -95.47 gain 223 154 -95.91 gain 154 224 -95.59 gain 224 154 -96.50 gain 155 156 -61.25 gain 156 155 -60.48 gain 155 157 -68.07 gain 157 155 -69.78 gain 155 158 -70.43 gain 158 155 -71.64 gain 155 159 -85.25 gain 159 155 -88.84 gain 155 160 -76.30 gain 160 155 -77.05 gain 155 161 -81.48 gain 161 155 -84.67 gain 155 162 -88.51 gain 162 155 -91.41 gain 155 163 -89.46 gain 163 155 -94.27 gain 155 164 -94.32 gain 164 155 -98.50 gain 155 165 -87.55 gain 165 155 -88.79 gain 155 166 -85.48 gain 166 155 -86.48 gain 155 167 -76.30 gain 167 155 -78.01 gain 155 168 -72.58 gain 168 155 -73.19 gain 155 169 -73.59 gain 169 155 -75.32 gain 155 170 -67.44 gain 170 155 -68.40 gain 155 171 -70.40 gain 171 155 -72.44 gain 155 172 -71.72 gain 172 155 -71.94 gain 155 173 -77.06 gain 173 155 -81.93 gain 155 174 -84.80 gain 174 155 -85.72 gain 155 175 -82.76 gain 175 155 -84.82 gain 155 176 -87.00 gain 176 155 -88.03 gain 155 177 -93.35 gain 177 155 -97.38 gain 155 178 -86.07 gain 178 155 -83.54 gain 155 179 -82.94 gain 179 155 -79.84 gain 155 180 -78.43 gain 180 155 -84.77 gain 155 181 -81.04 gain 181 155 -81.40 gain 155 182 -81.69 gain 182 155 -83.14 gain 155 183 -76.89 gain 183 155 -78.62 gain 155 184 -74.37 gain 184 155 -78.84 gain 155 185 -81.81 gain 185 155 -90.14 gain 155 186 -78.76 gain 186 155 -82.68 gain 155 187 -71.80 gain 187 155 -73.44 gain 155 188 -88.39 gain 188 155 -92.45 gain 155 189 -86.86 gain 189 155 -85.65 gain 155 190 -87.25 gain 190 155 -89.95 gain 155 191 -85.02 gain 191 155 -86.43 gain 155 192 -95.83 gain 192 155 -95.94 gain 155 193 -83.72 gain 193 155 -82.80 gain 155 194 -93.10 gain 194 155 -92.97 gain 155 195 -81.65 gain 195 155 -80.07 gain 155 196 -84.73 gain 196 155 -87.45 gain 155 197 -83.22 gain 197 155 -81.08 gain 155 198 -77.81 gain 198 155 -80.19 gain 155 199 -70.73 gain 199 155 -73.21 gain 155 200 -79.05 gain 200 155 -82.86 gain 155 201 -74.36 gain 201 155 -78.09 gain 155 202 -83.97 gain 202 155 -86.83 gain 155 203 -84.64 gain 203 155 -86.62 gain 155 204 -80.04 gain 204 155 -78.66 gain 155 205 -85.00 gain 205 155 -87.36 gain 155 206 -90.89 gain 206 155 -94.36 gain 155 207 -91.52 gain 207 155 -94.41 gain 155 208 -86.13 gain 208 155 -91.62 gain 155 209 -91.78 gain 209 155 -96.84 gain 155 210 -90.86 gain 210 155 -96.10 gain 155 211 -80.34 gain 211 155 -80.80 gain 155 212 -82.31 gain 212 155 -85.79 gain 155 213 -84.05 gain 213 155 -86.85 gain 155 214 -85.30 gain 214 155 -93.49 gain 155 215 -90.18 gain 215 155 -93.77 gain 155 216 -76.54 gain 216 155 -84.04 gain 155 217 -88.66 gain 217 155 -96.43 gain 155 218 -80.90 gain 218 155 -81.47 gain 155 219 -83.82 gain 219 155 -84.88 gain 155 220 -97.56 gain 220 155 -94.70 gain 155 221 -94.49 gain 221 155 -97.31 gain 155 222 -91.20 gain 222 155 -89.82 gain 155 223 -82.88 gain 223 155 -84.74 gain 155 224 -93.64 gain 224 155 -95.97 gain 156 157 -62.71 gain 157 156 -65.19 gain 156 158 -71.05 gain 158 156 -73.03 gain 156 159 -74.96 gain 159 156 -79.33 gain 156 160 -81.67 gain 160 156 -83.19 gain 156 161 -89.14 gain 161 156 -93.09 gain 156 162 -89.11 gain 162 156 -92.78 gain 156 163 -89.20 gain 163 156 -94.79 gain 156 164 -94.37 gain 164 156 -99.32 gain 156 165 -75.86 gain 165 156 -77.86 gain 156 166 -80.72 gain 166 156 -82.48 gain 156 167 -83.09 gain 167 156 -85.58 gain 156 168 -74.31 gain 168 156 -75.69 gain 156 169 -66.93 gain 169 156 -69.43 gain 156 170 -71.48 gain 170 156 -73.21 gain 156 171 -61.97 gain 171 156 -64.78 gain 156 172 -68.90 gain 172 156 -69.89 gain 156 173 -66.99 gain 173 156 -72.64 gain 156 174 -80.10 gain 174 156 -81.80 gain 156 175 -75.65 gain 175 156 -78.48 gain 156 176 -82.81 gain 176 156 -84.61 gain 156 177 -84.76 gain 177 156 -89.56 gain 156 178 -86.89 gain 178 156 -85.13 gain 156 179 -90.88 gain 179 156 -88.54 gain 156 180 -87.34 gain 180 156 -94.45 gain 156 181 -82.78 gain 181 156 -83.91 gain 156 182 -89.96 gain 182 156 -92.17 gain 156 183 -76.97 gain 183 156 -79.46 gain 156 184 -84.84 gain 184 156 -90.08 gain 156 185 -77.37 gain 185 156 -86.47 gain 156 186 -70.56 gain 186 156 -75.24 gain 156 187 -79.33 gain 187 156 -81.75 gain 156 188 -74.35 gain 188 156 -79.18 gain 156 189 -79.00 gain 189 156 -78.55 gain 156 190 -82.20 gain 190 156 -85.67 gain 156 191 -84.98 gain 191 156 -87.15 gain 156 192 -83.70 gain 192 156 -84.57 gain 156 193 -83.95 gain 193 156 -83.81 gain 156 194 -87.37 gain 194 156 -88.01 gain 156 195 -89.85 gain 195 156 -89.04 gain 156 196 -89.75 gain 196 156 -93.25 gain 156 197 -89.68 gain 197 156 -88.31 gain 156 198 -80.04 gain 198 156 -83.19 gain 156 199 -79.48 gain 199 156 -82.73 gain 156 200 -77.87 gain 200 156 -82.46 gain 156 201 -77.98 gain 201 156 -82.48 gain 156 202 -81.44 gain 202 156 -85.07 gain 156 203 -82.08 gain 203 156 -84.83 gain 156 204 -79.33 gain 204 156 -78.72 gain 156 205 -83.00 gain 205 156 -86.13 gain 156 206 -84.35 gain 206 156 -88.59 gain 156 207 -87.03 gain 207 156 -90.69 gain 156 208 -90.74 gain 208 156 -96.99 gain 156 209 -93.76 gain 209 156 -99.58 gain 156 210 -92.32 gain 210 156 -98.32 gain 156 211 -88.86 gain 211 156 -90.10 gain 156 212 -86.20 gain 212 156 -90.45 gain 156 213 -85.60 gain 213 156 -89.17 gain 156 214 -80.20 gain 214 156 -89.16 gain 156 215 -81.13 gain 215 156 -85.49 gain 156 216 -83.63 gain 216 156 -91.90 gain 156 217 -76.62 gain 217 156 -85.15 gain 156 218 -83.29 gain 218 156 -84.63 gain 156 219 -85.47 gain 219 156 -87.29 gain 156 220 -81.73 gain 220 156 -79.64 gain 156 221 -86.12 gain 221 156 -89.71 gain 156 222 -93.24 gain 222 156 -92.63 gain 156 223 -84.04 gain 223 156 -86.67 gain 156 224 -96.00 gain 224 156 -99.10 gain 157 158 -60.07 gain 158 157 -59.57 gain 157 159 -73.97 gain 159 157 -75.86 gain 157 160 -83.29 gain 160 157 -82.33 gain 157 161 -82.87 gain 161 157 -84.35 gain 157 162 -83.68 gain 162 157 -84.87 gain 157 163 -87.13 gain 163 157 -90.23 gain 157 164 -90.80 gain 164 157 -93.27 gain 157 165 -84.39 gain 165 157 -83.92 gain 157 166 -91.07 gain 166 157 -90.35 gain 157 167 -84.15 gain 167 157 -84.15 gain 157 168 -92.83 gain 168 157 -91.73 gain 157 169 -70.19 gain 169 157 -70.20 gain 157 170 -69.59 gain 170 157 -68.84 gain 157 171 -62.87 gain 171 157 -63.19 gain 157 172 -63.07 gain 172 157 -61.59 gain 157 173 -68.78 gain 173 157 -71.95 gain 157 174 -75.61 gain 174 157 -74.82 gain 157 175 -76.92 gain 175 157 -77.26 gain 157 176 -86.39 gain 176 157 -85.71 gain 157 177 -88.09 gain 177 157 -90.41 gain 157 178 -87.10 gain 178 157 -82.85 gain 157 179 -91.47 gain 179 157 -86.65 gain 157 180 -95.17 gain 180 157 -99.80 gain 157 181 -91.73 gain 181 157 -90.38 gain 157 182 -87.69 gain 182 157 -87.42 gain 157 183 -85.93 gain 183 157 -85.94 gain 157 184 -87.12 gain 184 157 -89.88 gain 157 185 -76.86 gain 185 157 -83.49 gain 157 186 -76.42 gain 186 157 -78.63 gain 157 187 -72.94 gain 187 157 -72.88 gain 157 188 -72.07 gain 188 157 -74.42 gain 157 189 -76.77 gain 189 157 -73.84 gain 157 190 -83.64 gain 190 157 -84.62 gain 157 191 -88.54 gain 191 157 -88.23 gain 157 192 -87.08 gain 192 157 -85.47 gain 157 193 -88.51 gain 193 157 -85.89 gain 157 194 -91.43 gain 194 157 -89.59 gain 157 195 -93.71 gain 195 157 -90.41 gain 157 196 -92.98 gain 196 157 -94.00 gain 157 197 -91.61 gain 197 157 -87.76 gain 157 198 -89.47 gain 198 157 -90.13 gain 157 199 -77.01 gain 199 157 -77.78 gain 157 200 -78.28 gain 200 157 -80.39 gain 157 201 -82.75 gain 201 157 -84.76 gain 157 202 -69.99 gain 202 157 -71.14 gain 157 203 -76.83 gain 203 157 -77.09 gain 157 204 -77.62 gain 204 157 -74.53 gain 157 205 -80.12 gain 205 157 -80.76 gain 157 206 -86.12 gain 206 157 -87.87 gain 157 207 -94.39 gain 207 157 -95.56 gain 157 208 -86.67 gain 208 157 -90.44 gain 157 209 -96.38 gain 209 157 -99.73 gain 157 210 -92.12 gain 210 157 -95.64 gain 157 211 -82.71 gain 211 157 -81.46 gain 157 212 -93.80 gain 212 157 -95.56 gain 157 213 -88.45 gain 213 157 -89.55 gain 157 214 -89.88 gain 214 157 -96.36 gain 157 215 -86.57 gain 215 157 -88.45 gain 157 216 -85.32 gain 216 157 -91.11 gain 157 217 -84.15 gain 217 157 -90.20 gain 157 218 -89.82 gain 218 157 -88.68 gain 157 219 -87.71 gain 219 157 -87.05 gain 157 220 -83.55 gain 220 157 -78.98 gain 157 221 -84.11 gain 221 157 -85.22 gain 157 222 -91.47 gain 222 157 -88.38 gain 157 223 -90.46 gain 223 157 -90.62 gain 157 224 -93.16 gain 224 157 -93.79 gain 158 159 -68.78 gain 159 158 -71.17 gain 158 160 -78.29 gain 160 158 -77.83 gain 158 161 -73.26 gain 161 158 -75.24 gain 158 162 -83.26 gain 162 158 -84.95 gain 158 163 -86.05 gain 163 158 -89.65 gain 158 164 -80.39 gain 164 158 -83.36 gain 158 165 -91.69 gain 165 158 -91.72 gain 158 166 -88.34 gain 166 158 -88.12 gain 158 167 -86.40 gain 167 158 -86.90 gain 158 168 -89.47 gain 168 158 -88.86 gain 158 169 -77.54 gain 169 158 -78.05 gain 158 170 -76.65 gain 170 158 -76.40 gain 158 171 -77.25 gain 171 158 -78.08 gain 158 172 -62.49 gain 172 158 -61.51 gain 158 173 -71.75 gain 173 158 -75.41 gain 158 174 -66.77 gain 174 158 -66.48 gain 158 175 -76.88 gain 175 158 -77.72 gain 158 176 -82.05 gain 176 158 -81.87 gain 158 177 -73.83 gain 177 158 -76.65 gain 158 178 -87.88 gain 178 158 -84.14 gain 158 179 -90.89 gain 179 158 -86.57 gain 158 180 -93.18 gain 180 158 -98.31 gain 158 181 -91.62 gain 181 158 -90.77 gain 158 182 -91.44 gain 182 158 -91.68 gain 158 183 -89.13 gain 183 158 -89.64 gain 158 184 -83.10 gain 184 158 -86.36 gain 158 185 -81.11 gain 185 158 -88.24 gain 158 186 -75.53 gain 186 158 -78.23 gain 158 187 -71.35 gain 187 158 -71.79 gain 158 188 -71.67 gain 188 158 -74.51 gain 158 189 -85.73 gain 189 158 -83.30 gain 158 190 -80.25 gain 190 158 -81.74 gain 158 191 -81.75 gain 191 158 -81.94 gain 158 192 -84.00 gain 192 158 -82.89 gain 158 193 -82.07 gain 193 158 -79.94 gain 158 194 -89.54 gain 194 158 -88.20 gain 158 195 -93.72 gain 195 158 -90.93 gain 158 196 -97.54 gain 196 158 -99.06 gain 158 197 -94.87 gain 197 158 -91.52 gain 158 198 -87.57 gain 198 158 -88.73 gain 158 199 -77.56 gain 199 158 -78.83 gain 158 200 -84.21 gain 200 158 -86.81 gain 158 201 -83.16 gain 201 158 -85.68 gain 158 202 -86.97 gain 202 158 -88.62 gain 158 203 -87.01 gain 203 158 -87.78 gain 158 204 -84.66 gain 204 158 -82.07 gain 158 205 -80.12 gain 205 158 -81.27 gain 158 206 -82.47 gain 206 158 -84.72 gain 158 207 -84.52 gain 207 158 -86.19 gain 158 208 -91.60 gain 208 158 -95.88 gain 158 209 -94.69 gain 209 158 -98.54 gain 158 210 -95.57 gain 210 158 -99.59 gain 158 211 -92.27 gain 211 158 -91.53 gain 158 212 -89.66 gain 212 158 -91.92 gain 158 213 -93.38 gain 213 158 -94.97 gain 158 214 -81.46 gain 214 158 -88.44 gain 158 215 -80.31 gain 215 158 -82.69 gain 158 216 -85.29 gain 216 158 -91.58 gain 158 217 -82.40 gain 217 158 -88.95 gain 158 218 -89.74 gain 218 158 -89.10 gain 158 219 -79.75 gain 219 158 -79.59 gain 158 220 -78.07 gain 220 158 -74.00 gain 158 221 -89.83 gain 221 158 -91.44 gain 158 222 -82.67 gain 222 158 -80.09 gain 158 223 -94.84 gain 223 158 -95.50 gain 158 224 -93.55 gain 224 158 -94.68 gain 159 160 -64.93 gain 160 159 -62.08 gain 159 161 -79.10 gain 161 159 -78.69 gain 159 162 -86.03 gain 162 159 -85.34 gain 159 163 -87.20 gain 163 159 -88.42 gain 159 164 -79.43 gain 164 159 -80.02 gain 159 165 -95.37 gain 165 159 -93.02 gain 159 166 -92.45 gain 166 159 -89.84 gain 159 167 -86.48 gain 167 159 -84.60 gain 159 168 -95.73 gain 168 159 -92.74 gain 159 169 -94.83 gain 169 159 -92.96 gain 159 170 -86.28 gain 170 159 -83.64 gain 159 171 -85.26 gain 171 159 -83.70 gain 159 172 -77.50 gain 172 159 -74.13 gain 159 173 -75.72 gain 173 159 -77.00 gain 159 174 -62.17 gain 174 159 -59.50 gain 159 175 -72.21 gain 175 159 -70.67 gain 159 176 -74.38 gain 176 159 -71.81 gain 159 177 -84.44 gain 177 159 -84.87 gain 159 178 -87.75 gain 178 159 -81.62 gain 159 179 -86.49 gain 179 159 -79.79 gain 159 180 -94.28 gain 180 159 -97.03 gain 159 181 -90.08 gain 181 159 -86.85 gain 159 182 -92.41 gain 182 159 -90.26 gain 159 183 -91.12 gain 183 159 -89.25 gain 159 184 -84.48 gain 184 159 -85.35 gain 159 185 -78.24 gain 185 159 -82.98 gain 159 186 -84.93 gain 186 159 -85.25 gain 159 187 -77.84 gain 187 159 -75.89 gain 159 188 -71.30 gain 188 159 -71.76 gain 159 189 -75.36 gain 189 159 -70.55 gain 159 190 -73.82 gain 190 159 -72.93 gain 159 191 -73.58 gain 191 159 -71.39 gain 159 192 -85.35 gain 192 159 -81.85 gain 159 193 -92.31 gain 193 159 -87.80 gain 159 194 -86.25 gain 194 159 -82.52 gain 159 195 -94.87 gain 195 159 -89.69 gain 159 196 -94.11 gain 196 159 -93.24 gain 159 197 -97.75 gain 197 159 -92.01 gain 159 198 -98.17 gain 198 159 -96.95 gain 159 199 -86.16 gain 199 159 -85.04 gain 159 200 -94.02 gain 200 159 -94.24 gain 159 201 -93.34 gain 201 159 -93.47 gain 159 202 -85.52 gain 202 159 -84.78 gain 159 203 -82.27 gain 203 159 -80.65 gain 159 204 -78.89 gain 204 159 -73.91 gain 159 205 -86.74 gain 205 159 -85.50 gain 159 206 -84.41 gain 206 159 -84.29 gain 159 207 -92.41 gain 207 159 -91.70 gain 159 208 -92.12 gain 208 159 -94.01 gain 159 209 -85.72 gain 209 159 -87.18 gain 159 210 -97.16 gain 210 159 -98.80 gain 159 211 -97.42 gain 211 159 -94.29 gain 159 212 -95.61 gain 212 159 -95.49 gain 159 213 -99.64 gain 213 159 -98.85 gain 159 214 -91.89 gain 214 159 -96.48 gain 159 215 -88.67 gain 215 159 -88.67 gain 159 216 -95.11 gain 216 159 -99.02 gain 159 217 -95.91 gain 217 159 -100.08 gain 159 218 -89.97 gain 218 159 -86.95 gain 159 219 -89.99 gain 219 159 -87.45 gain 159 220 -76.83 gain 220 159 -70.37 gain 159 221 -102.80 gain 221 159 -102.03 gain 159 222 -84.99 gain 222 159 -80.02 gain 159 223 -90.61 gain 223 159 -88.89 gain 159 224 -89.17 gain 224 159 -87.91 gain 160 161 -61.27 gain 161 160 -63.71 gain 160 162 -73.27 gain 162 160 -75.42 gain 160 163 -81.30 gain 163 160 -85.36 gain 160 164 -80.77 gain 164 160 -84.20 gain 160 165 -99.07 gain 165 160 -99.56 gain 160 166 -94.39 gain 166 160 -94.63 gain 160 167 -99.74 gain 167 160 -100.70 gain 160 168 -82.97 gain 168 160 -82.83 gain 160 169 -87.02 gain 169 160 -88.00 gain 160 170 -81.41 gain 170 160 -81.62 gain 160 171 -89.05 gain 171 160 -90.34 gain 160 172 -77.37 gain 172 160 -76.85 gain 160 173 -74.46 gain 173 160 -78.58 gain 160 174 -65.25 gain 174 160 -65.43 gain 160 175 -61.58 gain 175 160 -62.89 gain 160 176 -70.43 gain 176 160 -70.71 gain 160 177 -75.68 gain 177 160 -78.96 gain 160 178 -79.02 gain 178 160 -75.74 gain 160 179 -85.06 gain 179 160 -81.21 gain 160 180 -101.07 gain 180 160 -106.66 gain 160 181 -89.81 gain 181 160 -89.43 gain 160 182 -94.69 gain 182 160 -95.39 gain 160 183 -90.04 gain 183 160 -91.01 gain 160 184 -93.69 gain 184 160 -97.41 gain 160 185 -81.71 gain 185 160 -89.30 gain 160 186 -83.26 gain 186 160 -86.43 gain 160 187 -76.35 gain 187 160 -77.25 gain 160 188 -74.70 gain 188 160 -78.01 gain 160 189 -83.20 gain 189 160 -81.23 gain 160 190 -68.94 gain 190 160 -70.89 gain 160 191 -82.33 gain 191 160 -82.99 gain 160 192 -79.18 gain 192 160 -78.53 gain 160 193 -83.66 gain 193 160 -82.00 gain 160 194 -88.70 gain 194 160 -87.82 gain 160 195 -90.99 gain 195 160 -88.66 gain 160 196 -93.55 gain 196 160 -95.52 gain 160 197 -93.63 gain 197 160 -90.74 gain 160 198 -89.65 gain 198 160 -91.27 gain 160 199 -91.01 gain 199 160 -92.74 gain 160 200 -87.49 gain 200 160 -90.56 gain 160 201 -90.57 gain 201 160 -93.55 gain 160 202 -81.57 gain 202 160 -83.69 gain 160 203 -82.23 gain 203 160 -83.45 gain 160 204 -75.63 gain 204 160 -73.49 gain 160 205 -76.49 gain 205 160 -78.10 gain 160 206 -87.05 gain 206 160 -89.77 gain 160 207 -86.75 gain 207 160 -88.89 gain 160 208 -88.94 gain 208 160 -93.68 gain 160 209 -80.07 gain 209 160 -84.38 gain 160 210 -100.58 gain 210 160 -105.06 gain 160 211 -100.25 gain 211 160 -99.96 gain 160 212 -96.74 gain 212 160 -99.46 gain 160 213 -83.98 gain 213 160 -86.04 gain 160 214 -93.12 gain 214 160 -100.57 gain 160 215 -89.40 gain 215 160 -92.24 gain 160 216 -78.87 gain 216 160 -85.62 gain 160 217 -90.72 gain 217 160 -97.74 gain 160 218 -75.10 gain 218 160 -74.92 gain 160 219 -83.65 gain 219 160 -83.95 gain 160 220 -85.19 gain 220 160 -81.58 gain 160 221 -88.31 gain 221 160 -90.38 gain 160 222 -85.05 gain 222 160 -82.93 gain 160 223 -81.63 gain 223 160 -82.75 gain 160 224 -79.77 gain 224 160 -81.35 gain 161 162 -60.18 gain 162 161 -59.89 gain 161 163 -67.68 gain 163 161 -69.30 gain 161 164 -84.70 gain 164 161 -85.70 gain 161 165 -101.84 gain 165 161 -99.89 gain 161 166 -95.58 gain 166 161 -93.38 gain 161 167 -91.84 gain 167 161 -90.37 gain 161 168 -90.16 gain 168 161 -87.58 gain 161 169 -86.74 gain 169 161 -85.27 gain 161 170 -87.99 gain 170 161 -85.76 gain 161 171 -88.92 gain 171 161 -87.77 gain 161 172 -88.58 gain 172 161 -85.62 gain 161 173 -84.96 gain 173 161 -86.64 gain 161 174 -77.09 gain 174 161 -74.83 gain 161 175 -70.73 gain 175 161 -69.60 gain 161 176 -60.19 gain 176 161 -58.02 gain 161 177 -68.86 gain 177 161 -69.70 gain 161 178 -83.03 gain 178 161 -77.31 gain 161 179 -81.19 gain 179 161 -74.89 gain 161 180 -103.38 gain 180 161 -106.53 gain 161 181 -91.65 gain 181 161 -88.82 gain 161 182 -97.77 gain 182 161 -96.03 gain 161 183 -99.98 gain 183 161 -98.52 gain 161 184 -97.78 gain 184 161 -99.06 gain 161 185 -99.20 gain 185 161 -104.35 gain 161 186 -82.20 gain 186 161 -82.92 gain 161 187 -85.03 gain 187 161 -83.49 gain 161 188 -88.70 gain 188 161 -89.57 gain 161 189 -73.49 gain 189 161 -69.08 gain 161 190 -78.04 gain 190 161 -77.55 gain 161 191 -79.95 gain 191 161 -78.17 gain 161 192 -70.10 gain 192 161 -67.01 gain 161 193 -83.27 gain 193 161 -79.17 gain 161 194 -85.15 gain 194 161 -81.83 gain 161 195 -100.52 gain 195 161 -95.75 gain 161 196 -95.46 gain 196 161 -95.00 gain 161 197 -94.26 gain 197 161 -88.94 gain 161 198 -92.97 gain 198 161 -92.16 gain 161 199 -93.98 gain 199 161 -93.27 gain 161 200 -89.88 gain 200 161 -90.51 gain 161 201 -88.43 gain 201 161 -88.97 gain 161 202 -87.58 gain 202 161 -87.25 gain 161 203 -87.64 gain 203 161 -86.43 gain 161 204 -88.47 gain 204 161 -83.90 gain 161 205 -80.38 gain 205 161 -79.55 gain 161 206 -86.74 gain 206 161 -87.02 gain 161 207 -81.27 gain 207 161 -80.97 gain 161 208 -85.16 gain 208 161 -87.45 gain 161 209 -84.11 gain 209 161 -85.98 gain 161 210 -107.31 gain 210 161 -109.35 gain 161 211 -99.09 gain 211 161 -96.37 gain 161 212 -99.04 gain 212 161 -99.33 gain 161 213 -96.24 gain 213 161 -95.85 gain 161 214 -93.62 gain 214 161 -98.63 gain 161 215 -93.88 gain 215 161 -94.28 gain 161 216 -89.52 gain 216 161 -93.83 gain 161 217 -87.24 gain 217 161 -91.82 gain 161 218 -87.19 gain 218 161 -84.57 gain 161 219 -86.60 gain 219 161 -84.46 gain 161 220 -86.25 gain 220 161 -80.20 gain 161 221 -88.72 gain 221 161 -88.35 gain 161 222 -79.63 gain 222 161 -75.07 gain 161 223 -86.64 gain 223 161 -85.32 gain 161 224 -88.27 gain 224 161 -87.41 gain 162 163 -66.57 gain 163 162 -68.49 gain 162 164 -81.98 gain 164 162 -83.26 gain 162 165 -102.30 gain 165 162 -100.64 gain 162 166 -93.78 gain 166 162 -91.88 gain 162 167 -100.91 gain 167 162 -99.73 gain 162 168 -99.51 gain 168 162 -97.22 gain 162 169 -96.09 gain 169 162 -94.91 gain 162 170 -97.08 gain 170 162 -95.14 gain 162 171 -89.78 gain 171 162 -88.92 gain 162 172 -94.55 gain 172 162 -91.88 gain 162 173 -84.77 gain 173 162 -86.74 gain 162 174 -79.79 gain 174 162 -77.81 gain 162 175 -70.94 gain 175 162 -70.09 gain 162 176 -73.84 gain 176 162 -71.97 gain 162 177 -62.39 gain 177 162 -63.52 gain 162 178 -70.67 gain 178 162 -65.24 gain 162 179 -76.46 gain 179 162 -70.45 gain 162 180 -93.43 gain 180 162 -96.87 gain 162 181 -96.55 gain 181 162 -94.02 gain 162 182 -89.43 gain 182 162 -87.98 gain 162 183 -94.18 gain 183 162 -93.01 gain 162 184 -95.53 gain 184 162 -97.10 gain 162 185 -89.86 gain 185 162 -95.30 gain 162 186 -91.67 gain 186 162 -92.69 gain 162 187 -97.17 gain 187 162 -95.91 gain 162 188 -84.81 gain 188 162 -85.97 gain 162 189 -83.59 gain 189 162 -79.47 gain 162 190 -77.91 gain 190 162 -77.71 gain 162 191 -83.92 gain 191 162 -82.42 gain 162 192 -73.14 gain 192 162 -70.35 gain 162 193 -80.68 gain 193 162 -76.87 gain 162 194 -79.39 gain 194 162 -76.36 gain 162 195 -99.05 gain 195 162 -94.57 gain 162 196 -105.27 gain 196 162 -105.10 gain 162 197 -101.21 gain 197 162 -96.17 gain 162 198 -101.60 gain 198 162 -101.08 gain 162 199 -88.78 gain 199 162 -88.36 gain 162 200 -94.50 gain 200 162 -95.42 gain 162 201 -97.64 gain 201 162 -98.47 gain 162 202 -95.16 gain 202 162 -95.13 gain 162 203 -90.49 gain 203 162 -89.57 gain 162 204 -83.73 gain 204 162 -79.44 gain 162 205 -79.61 gain 205 162 -79.07 gain 162 206 -75.83 gain 206 162 -76.40 gain 162 207 -78.18 gain 207 162 -78.17 gain 162 208 -80.99 gain 208 162 -83.57 gain 162 209 -82.58 gain 209 162 -84.74 gain 162 210 -100.77 gain 210 162 -103.10 gain 162 211 -103.39 gain 211 162 -100.96 gain 162 212 -103.50 gain 212 162 -104.08 gain 162 213 -93.18 gain 213 162 -93.08 gain 162 214 -93.31 gain 214 162 -98.60 gain 162 215 -104.25 gain 215 162 -104.94 gain 162 216 -95.79 gain 216 162 -100.40 gain 162 217 -95.22 gain 217 162 -100.09 gain 162 218 -86.95 gain 218 162 -84.63 gain 162 219 -84.90 gain 219 162 -83.05 gain 162 220 -91.70 gain 220 162 -85.94 gain 162 221 -85.15 gain 221 162 -85.07 gain 162 222 -80.47 gain 222 162 -76.19 gain 162 223 -82.04 gain 223 162 -81.01 gain 162 224 -82.23 gain 224 162 -81.66 gain 163 164 -66.09 gain 164 163 -65.45 gain 163 165 -105.91 gain 165 163 -102.33 gain 163 166 -101.76 gain 166 163 -97.94 gain 163 167 -92.92 gain 167 163 -89.83 gain 163 168 -101.27 gain 168 163 -97.07 gain 163 169 -88.01 gain 169 163 -84.92 gain 163 170 -101.28 gain 170 163 -97.42 gain 163 171 -94.22 gain 171 163 -91.45 gain 163 172 -96.21 gain 172 163 -91.62 gain 163 173 -92.20 gain 173 163 -92.26 gain 163 174 -83.50 gain 174 163 -79.61 gain 163 175 -85.62 gain 175 163 -82.86 gain 163 176 -82.79 gain 176 163 -79.00 gain 163 177 -69.93 gain 177 163 -69.15 gain 163 178 -70.10 gain 178 163 -62.76 gain 163 179 -70.66 gain 179 163 -62.74 gain 163 180 -104.89 gain 180 163 -106.42 gain 163 181 -105.09 gain 181 163 -100.64 gain 163 182 -96.02 gain 182 163 -92.66 gain 163 183 -95.79 gain 183 163 -92.70 gain 163 184 -91.69 gain 184 163 -91.35 gain 163 185 -93.88 gain 185 163 -97.40 gain 163 186 -88.63 gain 186 163 -87.74 gain 163 187 -91.99 gain 187 163 -88.83 gain 163 188 -96.21 gain 188 163 -95.46 gain 163 189 -86.59 gain 189 163 -80.56 gain 163 190 -86.58 gain 190 163 -84.47 gain 163 191 -87.62 gain 191 163 -84.21 gain 163 192 -77.29 gain 192 163 -72.58 gain 163 193 -78.44 gain 193 163 -72.71 gain 163 194 -73.66 gain 194 163 -68.72 gain 163 195 -96.10 gain 195 163 -89.71 gain 163 196 -100.63 gain 196 163 -98.55 gain 163 197 -89.30 gain 197 163 -82.35 gain 163 198 -102.54 gain 198 163 -100.11 gain 163 199 -94.48 gain 199 163 -92.15 gain 163 200 -99.71 gain 200 163 -98.72 gain 163 201 -97.94 gain 201 163 -96.86 gain 163 202 -91.89 gain 202 163 -89.93 gain 163 203 -87.56 gain 203 163 -84.72 gain 163 204 -93.29 gain 204 163 -87.09 gain 163 205 -86.13 gain 205 163 -83.68 gain 163 206 -80.77 gain 206 163 -79.42 gain 163 207 -85.20 gain 207 163 -83.27 gain 163 208 -79.31 gain 208 163 -79.98 gain 163 209 -82.37 gain 209 163 -82.62 gain 163 210 -105.98 gain 210 163 -106.40 gain 163 211 -110.31 gain 211 163 -105.96 gain 163 212 -99.71 gain 212 163 -98.38 gain 163 213 -94.34 gain 213 163 -92.34 gain 163 214 -89.58 gain 214 163 -92.96 gain 163 215 -91.64 gain 215 163 -90.42 gain 163 216 -93.15 gain 216 163 -95.84 gain 163 217 -91.58 gain 217 163 -94.53 gain 163 218 -89.70 gain 218 163 -85.46 gain 163 219 -96.34 gain 219 163 -92.58 gain 163 220 -84.66 gain 220 163 -76.99 gain 163 221 -84.88 gain 221 163 -82.88 gain 163 222 -85.93 gain 222 163 -79.74 gain 163 223 -86.77 gain 223 163 -83.82 gain 163 224 -76.69 gain 224 163 -74.21 gain 164 165 -102.70 gain 165 164 -99.76 gain 164 166 -98.49 gain 166 164 -95.30 gain 164 167 -96.34 gain 167 164 -93.87 gain 164 168 -101.11 gain 168 164 -97.54 gain 164 169 -107.66 gain 169 164 -105.20 gain 164 170 -96.27 gain 170 164 -93.04 gain 164 171 -87.67 gain 171 164 -85.52 gain 164 172 -89.74 gain 172 164 -85.78 gain 164 173 -94.07 gain 173 164 -94.76 gain 164 174 -85.47 gain 174 164 -82.21 gain 164 175 -85.53 gain 175 164 -83.41 gain 164 176 -78.50 gain 176 164 -75.35 gain 164 177 -74.04 gain 177 164 -73.89 gain 164 178 -71.04 gain 178 164 -64.33 gain 164 179 -75.61 gain 179 164 -68.32 gain 164 180 -99.25 gain 180 164 -101.41 gain 164 181 -101.50 gain 181 164 -97.68 gain 164 182 -100.13 gain 182 164 -97.39 gain 164 183 -97.01 gain 183 164 -94.55 gain 164 184 -91.49 gain 184 164 -91.78 gain 164 185 -100.72 gain 185 164 -104.88 gain 164 186 -95.87 gain 186 164 -95.61 gain 164 187 -90.98 gain 187 164 -88.44 gain 164 188 -95.31 gain 188 164 -95.18 gain 164 189 -91.83 gain 189 164 -86.43 gain 164 190 -91.04 gain 190 164 -89.55 gain 164 191 -88.89 gain 191 164 -86.12 gain 164 192 -88.56 gain 192 164 -84.48 gain 164 193 -86.36 gain 193 164 -81.26 gain 164 194 -81.07 gain 194 164 -76.76 gain 164 195 -95.47 gain 195 164 -89.71 gain 164 196 -101.34 gain 196 164 -99.88 gain 164 197 -102.52 gain 197 164 -96.20 gain 164 198 -106.01 gain 198 164 -104.20 gain 164 199 -101.78 gain 199 164 -100.08 gain 164 200 -97.59 gain 200 164 -97.23 gain 164 201 -99.78 gain 201 164 -99.33 gain 164 202 -90.55 gain 202 164 -89.22 gain 164 203 -98.02 gain 203 164 -95.81 gain 164 204 -93.12 gain 204 164 -87.55 gain 164 205 -92.23 gain 205 164 -90.41 gain 164 206 -87.04 gain 206 164 -86.33 gain 164 207 -84.50 gain 207 164 -83.20 gain 164 208 -85.11 gain 208 164 -86.42 gain 164 209 -78.72 gain 209 164 -79.60 gain 164 210 -104.15 gain 210 164 -105.20 gain 164 211 -104.82 gain 211 164 -101.11 gain 164 212 -105.37 gain 212 164 -104.67 gain 164 213 -97.48 gain 213 164 -96.11 gain 164 214 -98.16 gain 214 164 -102.17 gain 164 215 -99.67 gain 215 164 -99.09 gain 164 216 -97.86 gain 216 164 -101.18 gain 164 217 -99.56 gain 217 164 -103.15 gain 164 218 -96.39 gain 218 164 -92.78 gain 164 219 -99.76 gain 219 164 -96.63 gain 164 220 -84.61 gain 220 164 -77.57 gain 164 221 -92.29 gain 221 164 -90.93 gain 164 222 -88.74 gain 222 164 -83.18 gain 164 223 -91.53 gain 223 164 -89.21 gain 164 224 -81.17 gain 224 164 -79.33 gain 165 166 -60.83 gain 166 165 -60.58 gain 165 167 -68.88 gain 167 165 -69.35 gain 165 168 -77.63 gain 168 165 -77.00 gain 165 169 -84.87 gain 169 165 -85.35 gain 165 170 -86.59 gain 170 165 -86.31 gain 165 171 -86.79 gain 171 165 -87.59 gain 165 172 -89.41 gain 172 165 -88.40 gain 165 173 -93.45 gain 173 165 -97.09 gain 165 174 -90.89 gain 174 165 -90.57 gain 165 175 -86.52 gain 175 165 -87.33 gain 165 176 -99.21 gain 176 165 -99.00 gain 165 177 -95.95 gain 177 165 -98.74 gain 165 178 -101.25 gain 178 165 -97.48 gain 165 179 -106.99 gain 179 165 -102.64 gain 165 180 -65.88 gain 180 165 -70.98 gain 165 181 -68.43 gain 181 165 -67.56 gain 165 182 -74.19 gain 182 165 -74.40 gain 165 183 -73.97 gain 183 165 -74.45 gain 165 184 -81.17 gain 184 165 -84.41 gain 165 185 -86.47 gain 185 165 -93.57 gain 165 186 -90.14 gain 186 165 -92.82 gain 165 187 -87.83 gain 187 165 -88.24 gain 165 188 -98.07 gain 188 165 -100.88 gain 165 189 -91.48 gain 189 165 -89.02 gain 165 190 -97.57 gain 190 165 -99.03 gain 165 191 -96.92 gain 191 165 -97.08 gain 165 192 -93.28 gain 192 165 -92.15 gain 165 193 -103.04 gain 193 165 -100.89 gain 165 194 -99.06 gain 194 165 -97.69 gain 165 195 -73.38 gain 195 165 -70.56 gain 165 196 -73.41 gain 196 165 -74.90 gain 165 197 -67.63 gain 197 165 -64.25 gain 165 198 -79.19 gain 198 165 -80.33 gain 165 199 -87.59 gain 199 165 -88.84 gain 165 200 -88.14 gain 200 165 -90.72 gain 165 201 -95.43 gain 201 165 -97.91 gain 165 202 -95.08 gain 202 165 -96.70 gain 165 203 -90.29 gain 203 165 -91.02 gain 165 204 -93.29 gain 204 165 -90.67 gain 165 205 -89.51 gain 205 165 -90.63 gain 165 206 -100.74 gain 206 165 -102.96 gain 165 207 -96.56 gain 207 165 -98.20 gain 165 208 -104.60 gain 208 165 -108.85 gain 165 209 -94.72 gain 209 165 -98.54 gain 165 210 -82.55 gain 210 165 -86.54 gain 165 211 -81.28 gain 211 165 -80.50 gain 165 212 -80.92 gain 212 165 -83.16 gain 165 213 -80.06 gain 213 165 -81.62 gain 165 214 -81.30 gain 214 165 -88.25 gain 165 215 -87.38 gain 215 165 -89.73 gain 165 216 -96.40 gain 216 165 -102.66 gain 165 217 -89.45 gain 217 165 -95.98 gain 165 218 -95.07 gain 218 165 -94.40 gain 165 219 -93.58 gain 219 165 -93.39 gain 165 220 -99.15 gain 220 165 -95.05 gain 165 221 -93.46 gain 221 165 -95.04 gain 165 222 -92.93 gain 222 165 -90.32 gain 165 223 -97.28 gain 223 165 -97.91 gain 165 224 -98.65 gain 224 165 -99.75 gain 166 167 -65.65 gain 167 166 -66.37 gain 166 168 -71.69 gain 168 166 -71.30 gain 166 169 -82.56 gain 169 166 -83.29 gain 166 170 -87.97 gain 170 166 -87.94 gain 166 171 -86.82 gain 171 166 -87.86 gain 166 172 -82.03 gain 172 166 -81.26 gain 166 173 -93.94 gain 173 166 -97.83 gain 166 174 -92.96 gain 174 166 -92.89 gain 166 175 -97.68 gain 175 166 -98.75 gain 166 176 -89.88 gain 176 166 -89.92 gain 166 177 -93.98 gain 177 166 -97.01 gain 166 178 -98.06 gain 178 166 -94.53 gain 166 179 -100.68 gain 179 166 -96.58 gain 166 180 -71.55 gain 180 166 -76.90 gain 166 181 -66.92 gain 181 166 -66.29 gain 166 182 -76.60 gain 182 166 -77.06 gain 166 183 -78.68 gain 183 166 -79.41 gain 166 184 -71.00 gain 184 166 -74.48 gain 166 185 -79.68 gain 185 166 -87.02 gain 166 186 -91.18 gain 186 166 -94.11 gain 166 187 -81.21 gain 187 166 -81.86 gain 166 188 -84.86 gain 188 166 -87.93 gain 166 189 -90.32 gain 189 166 -88.11 gain 166 190 -98.63 gain 190 166 -100.33 gain 166 191 -94.63 gain 191 166 -95.05 gain 166 192 -90.78 gain 192 166 -89.89 gain 166 193 -95.57 gain 193 166 -93.67 gain 166 194 -98.35 gain 194 166 -97.23 gain 166 195 -74.57 gain 195 166 -71.99 gain 166 196 -79.18 gain 196 166 -80.92 gain 166 197 -81.22 gain 197 166 -78.09 gain 166 198 -74.66 gain 198 166 -76.04 gain 166 199 -73.88 gain 199 166 -75.37 gain 166 200 -88.09 gain 200 166 -90.91 gain 166 201 -91.02 gain 201 166 -93.75 gain 166 202 -93.47 gain 202 166 -95.34 gain 166 203 -85.85 gain 203 166 -86.84 gain 166 204 -95.49 gain 204 166 -93.12 gain 166 205 -100.34 gain 205 166 -101.71 gain 166 206 -90.30 gain 206 166 -92.77 gain 166 207 -89.85 gain 207 166 -91.74 gain 166 208 -96.32 gain 208 166 -100.81 gain 166 209 -101.88 gain 209 166 -105.94 gain 166 210 -73.69 gain 210 166 -77.93 gain 166 211 -80.29 gain 211 166 -79.76 gain 166 212 -81.22 gain 212 166 -83.71 gain 166 213 -77.30 gain 213 166 -79.11 gain 166 214 -82.44 gain 214 166 -89.64 gain 166 215 -93.93 gain 215 166 -96.53 gain 166 216 -93.13 gain 216 166 -99.64 gain 166 217 -88.58 gain 217 166 -95.35 gain 166 218 -89.54 gain 218 166 -89.12 gain 166 219 -83.21 gain 219 166 -83.27 gain 166 220 -91.43 gain 220 166 -87.58 gain 166 221 -91.89 gain 221 166 -93.71 gain 166 222 -97.58 gain 222 166 -95.21 gain 166 223 -101.40 gain 223 166 -102.27 gain 166 224 -95.63 gain 224 166 -96.97 gain 167 168 -66.16 gain 168 167 -65.06 gain 167 169 -74.27 gain 169 167 -74.28 gain 167 170 -77.21 gain 170 167 -76.46 gain 167 171 -82.56 gain 171 167 -82.88 gain 167 172 -87.05 gain 172 167 -85.56 gain 167 173 -89.43 gain 173 167 -92.59 gain 167 174 -90.40 gain 174 167 -89.60 gain 167 175 -97.25 gain 175 167 -97.59 gain 167 176 -92.83 gain 176 167 -92.14 gain 167 177 -88.06 gain 177 167 -90.37 gain 167 178 -103.38 gain 178 167 -99.13 gain 167 179 -98.50 gain 179 167 -93.68 gain 167 180 -78.16 gain 180 167 -82.78 gain 167 181 -68.30 gain 181 167 -66.94 gain 167 182 -65.35 gain 182 167 -65.09 gain 167 183 -71.98 gain 183 167 -71.99 gain 167 184 -76.44 gain 184 167 -79.20 gain 167 185 -79.59 gain 185 167 -86.21 gain 167 186 -86.00 gain 186 167 -88.20 gain 167 187 -82.71 gain 187 167 -82.64 gain 167 188 -87.65 gain 188 167 -89.99 gain 167 189 -89.31 gain 189 167 -86.38 gain 167 190 -86.11 gain 190 167 -87.10 gain 167 191 -86.84 gain 191 167 -86.53 gain 167 192 -96.40 gain 192 167 -94.79 gain 167 193 -93.07 gain 193 167 -90.44 gain 167 194 -98.59 gain 194 167 -96.74 gain 167 195 -73.79 gain 195 167 -70.49 gain 167 196 -73.98 gain 196 167 -75.00 gain 167 197 -70.56 gain 197 167 -66.70 gain 167 198 -79.78 gain 198 167 -80.44 gain 167 199 -81.17 gain 199 167 -81.94 gain 167 200 -85.32 gain 200 167 -87.43 gain 167 201 -86.58 gain 201 167 -88.59 gain 167 202 -94.41 gain 202 167 -95.55 gain 167 203 -94.21 gain 203 167 -94.47 gain 167 204 -96.95 gain 204 167 -93.85 gain 167 205 -93.77 gain 205 167 -94.42 gain 167 206 -87.97 gain 206 167 -89.72 gain 167 207 -98.00 gain 207 167 -99.17 gain 167 208 -91.66 gain 208 167 -95.44 gain 167 209 -99.95 gain 209 167 -103.30 gain 167 210 -83.48 gain 210 167 -87.00 gain 167 211 -80.95 gain 211 167 -79.70 gain 167 212 -84.35 gain 212 167 -86.11 gain 167 213 -80.71 gain 213 167 -81.80 gain 167 214 -82.13 gain 214 167 -88.61 gain 167 215 -81.84 gain 215 167 -83.71 gain 167 216 -82.75 gain 216 167 -88.54 gain 167 217 -82.82 gain 217 167 -88.88 gain 167 218 -94.24 gain 218 167 -93.10 gain 167 219 -87.72 gain 219 167 -87.06 gain 167 220 -99.31 gain 220 167 -94.73 gain 167 221 -95.85 gain 221 167 -96.95 gain 167 222 -99.78 gain 222 167 -96.69 gain 167 223 -93.90 gain 223 167 -94.05 gain 167 224 -97.66 gain 224 167 -98.28 gain 168 169 -63.95 gain 169 168 -65.06 gain 168 170 -67.73 gain 170 168 -68.08 gain 168 171 -81.07 gain 171 168 -82.49 gain 168 172 -80.31 gain 172 168 -79.93 gain 168 173 -88.85 gain 173 168 -93.12 gain 168 174 -84.39 gain 174 168 -84.71 gain 168 175 -89.23 gain 175 168 -90.68 gain 168 176 -91.19 gain 176 168 -91.60 gain 168 177 -86.88 gain 177 168 -90.30 gain 168 178 -101.94 gain 178 168 -98.80 gain 168 179 -91.40 gain 179 168 -87.69 gain 168 180 -73.35 gain 180 168 -79.08 gain 168 181 -78.49 gain 181 168 -78.24 gain 168 182 -67.74 gain 182 168 -68.57 gain 168 183 -63.41 gain 183 168 -64.52 gain 168 184 -75.69 gain 184 168 -79.55 gain 168 185 -74.86 gain 185 168 -82.59 gain 168 186 -77.80 gain 186 168 -81.11 gain 168 187 -85.06 gain 187 168 -86.10 gain 168 188 -84.11 gain 188 168 -87.55 gain 168 189 -81.88 gain 189 168 -80.05 gain 168 190 -88.72 gain 190 168 -90.81 gain 168 191 -96.89 gain 191 168 -97.69 gain 168 192 -90.70 gain 192 168 -90.19 gain 168 193 -101.24 gain 193 168 -99.72 gain 168 194 -91.28 gain 194 168 -90.54 gain 168 195 -78.72 gain 195 168 -76.53 gain 168 196 -84.87 gain 196 168 -86.98 gain 168 197 -74.06 gain 197 168 -71.31 gain 168 198 -77.39 gain 198 168 -79.16 gain 168 199 -74.46 gain 199 168 -76.33 gain 168 200 -80.97 gain 200 168 -84.17 gain 168 201 -87.41 gain 201 168 -90.53 gain 168 202 -82.99 gain 202 168 -85.24 gain 168 203 -83.83 gain 203 168 -85.19 gain 168 204 -86.21 gain 204 168 -84.22 gain 168 205 -85.76 gain 205 168 -87.51 gain 168 206 -85.73 gain 206 168 -88.59 gain 168 207 -90.18 gain 207 168 -92.46 gain 168 208 -102.02 gain 208 168 -106.89 gain 168 209 -95.25 gain 209 168 -99.69 gain 168 210 -85.33 gain 210 168 -89.96 gain 168 211 -81.80 gain 211 168 -81.65 gain 168 212 -85.62 gain 212 168 -88.49 gain 168 213 -79.58 gain 213 168 -81.78 gain 168 214 -79.61 gain 214 168 -87.19 gain 168 215 -81.43 gain 215 168 -84.42 gain 168 216 -81.95 gain 216 168 -88.84 gain 168 217 -82.64 gain 217 168 -89.80 gain 168 218 -88.77 gain 218 168 -88.73 gain 168 219 -88.79 gain 219 168 -89.24 gain 168 220 -89.58 gain 220 168 -86.11 gain 168 221 -92.80 gain 221 168 -95.01 gain 168 222 -101.45 gain 222 168 -99.47 gain 168 223 -99.58 gain 223 168 -100.84 gain 168 224 -95.32 gain 224 168 -97.05 gain 169 170 -66.94 gain 170 169 -66.17 gain 169 171 -70.18 gain 171 169 -70.50 gain 169 172 -79.77 gain 172 169 -78.28 gain 169 173 -82.06 gain 173 169 -85.21 gain 169 174 -89.03 gain 174 169 -88.22 gain 169 175 -88.00 gain 175 169 -88.33 gain 169 176 -85.94 gain 176 169 -85.24 gain 169 177 -90.62 gain 177 169 -92.92 gain 169 178 -96.33 gain 178 169 -92.08 gain 169 179 -83.02 gain 179 169 -78.19 gain 169 180 -86.49 gain 180 169 -91.11 gain 169 181 -84.90 gain 181 169 -83.54 gain 169 182 -74.35 gain 182 169 -74.07 gain 169 183 -71.21 gain 183 169 -71.20 gain 169 184 -76.43 gain 184 169 -79.17 gain 169 185 -69.69 gain 185 169 -76.30 gain 169 186 -79.73 gain 186 169 -81.92 gain 169 187 -80.76 gain 187 169 -80.69 gain 169 188 -80.42 gain 188 169 -82.75 gain 169 189 -88.68 gain 189 169 -85.74 gain 169 190 -93.57 gain 190 169 -94.55 gain 169 191 -99.73 gain 191 169 -99.41 gain 169 192 -88.52 gain 192 169 -86.90 gain 169 193 -90.64 gain 193 169 -88.00 gain 169 194 -97.18 gain 194 169 -95.32 gain 169 195 -86.60 gain 195 169 -83.29 gain 169 196 -81.36 gain 196 169 -82.36 gain 169 197 -80.97 gain 197 169 -77.11 gain 169 198 -81.99 gain 198 169 -82.64 gain 169 199 -78.67 gain 199 169 -79.43 gain 169 200 -80.41 gain 200 169 -82.50 gain 169 201 -81.03 gain 201 169 -83.03 gain 169 202 -80.86 gain 202 169 -82.00 gain 169 203 -88.82 gain 203 169 -89.07 gain 169 204 -88.76 gain 204 169 -85.65 gain 169 205 -86.85 gain 205 169 -87.48 gain 169 206 -84.66 gain 206 169 -86.40 gain 169 207 -91.68 gain 207 169 -92.84 gain 169 208 -97.16 gain 208 169 -100.93 gain 169 209 -92.19 gain 209 169 -95.52 gain 169 210 -88.79 gain 210 169 -92.29 gain 169 211 -81.19 gain 211 169 -79.94 gain 169 212 -82.70 gain 212 169 -84.45 gain 169 213 -78.14 gain 213 169 -79.22 gain 169 214 -76.31 gain 214 169 -82.78 gain 169 215 -81.63 gain 215 169 -83.50 gain 169 216 -84.76 gain 216 169 -90.54 gain 169 217 -88.64 gain 217 169 -94.68 gain 169 218 -92.77 gain 218 169 -91.61 gain 169 219 -88.96 gain 219 169 -88.29 gain 169 220 -91.41 gain 220 169 -86.82 gain 169 221 -93.34 gain 221 169 -94.43 gain 169 222 -97.12 gain 222 169 -94.02 gain 169 223 -98.49 gain 223 169 -98.63 gain 169 224 -93.99 gain 224 169 -94.60 gain 170 171 -73.62 gain 171 170 -74.70 gain 170 172 -74.12 gain 172 170 -73.38 gain 170 173 -72.28 gain 173 170 -76.19 gain 170 174 -85.28 gain 174 170 -85.24 gain 170 175 -86.09 gain 175 170 -87.19 gain 170 176 -89.22 gain 176 170 -89.28 gain 170 177 -88.87 gain 177 170 -91.94 gain 170 178 -97.68 gain 178 170 -94.19 gain 170 179 -97.85 gain 179 170 -93.78 gain 170 180 -86.40 gain 180 170 -91.79 gain 170 181 -76.87 gain 181 170 -76.28 gain 170 182 -79.98 gain 182 170 -80.47 gain 170 183 -73.17 gain 183 170 -73.93 gain 170 184 -67.90 gain 184 170 -71.41 gain 170 185 -62.93 gain 185 170 -70.31 gain 170 186 -71.07 gain 186 170 -74.03 gain 170 187 -77.24 gain 187 170 -77.93 gain 170 188 -75.26 gain 188 170 -78.36 gain 170 189 -83.35 gain 189 170 -81.17 gain 170 190 -84.49 gain 190 170 -86.23 gain 170 191 -82.23 gain 191 170 -82.68 gain 170 192 -94.29 gain 192 170 -93.44 gain 170 193 -90.82 gain 193 170 -88.94 gain 170 194 -92.25 gain 194 170 -91.16 gain 170 195 -86.30 gain 195 170 -83.76 gain 170 196 -84.08 gain 196 170 -85.85 gain 170 197 -80.22 gain 197 170 -77.12 gain 170 198 -75.07 gain 198 170 -76.48 gain 170 199 -84.42 gain 199 170 -85.94 gain 170 200 -74.65 gain 200 170 -77.51 gain 170 201 -79.37 gain 201 170 -82.13 gain 170 202 -81.13 gain 202 170 -83.04 gain 170 203 -77.02 gain 203 170 -78.04 gain 170 204 -85.50 gain 204 170 -83.16 gain 170 205 -89.99 gain 205 170 -91.39 gain 170 206 -87.34 gain 206 170 -89.85 gain 170 207 -91.44 gain 207 170 -93.36 gain 170 208 -82.59 gain 208 170 -87.11 gain 170 209 -94.02 gain 209 170 -98.12 gain 170 210 -88.02 gain 210 170 -92.29 gain 170 211 -86.94 gain 211 170 -86.45 gain 170 212 -88.66 gain 212 170 -91.18 gain 170 213 -82.15 gain 213 170 -83.99 gain 170 214 -73.40 gain 214 170 -80.64 gain 170 215 -77.62 gain 215 170 -80.25 gain 170 216 -74.25 gain 216 170 -80.80 gain 170 217 -80.35 gain 217 170 -87.16 gain 170 218 -84.79 gain 218 170 -84.41 gain 170 219 -100.05 gain 219 170 -100.15 gain 170 220 -82.22 gain 220 170 -78.40 gain 170 221 -93.23 gain 221 170 -95.10 gain 170 222 -95.89 gain 222 170 -93.56 gain 170 223 -90.02 gain 223 170 -90.93 gain 170 224 -93.60 gain 224 170 -94.98 gain 171 172 -61.32 gain 172 171 -59.50 gain 171 173 -77.33 gain 173 171 -80.17 gain 171 174 -74.97 gain 174 171 -73.85 gain 171 175 -79.71 gain 175 171 -79.73 gain 171 176 -86.75 gain 176 171 -85.74 gain 171 177 -95.26 gain 177 171 -97.25 gain 171 178 -93.82 gain 178 171 -89.26 gain 171 179 -89.16 gain 179 171 -84.02 gain 171 180 -86.49 gain 180 171 -90.79 gain 171 181 -90.11 gain 181 171 -88.44 gain 171 182 -78.24 gain 182 171 -77.65 gain 171 183 -73.91 gain 183 171 -73.59 gain 171 184 -70.91 gain 184 171 -73.34 gain 171 185 -71.08 gain 185 171 -77.38 gain 171 186 -71.30 gain 186 171 -73.18 gain 171 187 -80.85 gain 187 171 -80.46 gain 171 188 -71.75 gain 188 171 -73.77 gain 171 189 -79.37 gain 189 171 -76.11 gain 171 190 -85.34 gain 190 171 -86.00 gain 171 191 -89.95 gain 191 171 -89.32 gain 171 192 -84.44 gain 192 171 -82.50 gain 171 193 -99.42 gain 193 171 -96.47 gain 171 194 -94.14 gain 194 171 -91.97 gain 171 195 -91.43 gain 195 171 -87.81 gain 171 196 -95.13 gain 196 171 -95.82 gain 171 197 -88.34 gain 197 171 -84.17 gain 171 198 -78.69 gain 198 171 -79.02 gain 171 199 -70.37 gain 199 171 -70.81 gain 171 200 -74.60 gain 200 171 -76.38 gain 171 201 -78.37 gain 201 171 -80.06 gain 171 202 -83.41 gain 202 171 -84.23 gain 171 203 -81.43 gain 203 171 -81.36 gain 171 204 -82.93 gain 204 171 -79.50 gain 171 205 -85.26 gain 205 171 -85.58 gain 171 206 -94.73 gain 206 171 -96.15 gain 171 207 -88.74 gain 207 171 -89.58 gain 171 208 -100.13 gain 208 171 -103.58 gain 171 209 -89.06 gain 209 171 -92.08 gain 171 210 -90.00 gain 210 171 -93.20 gain 171 211 -88.09 gain 211 171 -86.51 gain 171 212 -81.22 gain 212 171 -82.66 gain 171 213 -77.69 gain 213 171 -78.45 gain 171 214 -76.17 gain 214 171 -82.33 gain 171 215 -80.75 gain 215 171 -82.30 gain 171 216 -76.34 gain 216 171 -81.81 gain 171 217 -83.67 gain 217 171 -89.39 gain 171 218 -84.96 gain 218 171 -83.50 gain 171 219 -85.80 gain 219 171 -84.81 gain 171 220 -87.48 gain 220 171 -82.58 gain 171 221 -86.37 gain 221 171 -87.15 gain 171 222 -98.34 gain 222 171 -94.93 gain 171 223 -82.47 gain 223 171 -82.30 gain 171 224 -98.49 gain 224 171 -98.78 gain 172 173 -65.13 gain 173 172 -69.78 gain 172 174 -72.61 gain 174 172 -73.31 gain 172 175 -72.33 gain 175 172 -74.16 gain 172 176 -76.99 gain 176 172 -77.79 gain 172 177 -76.22 gain 177 172 -80.02 gain 172 178 -88.96 gain 178 172 -86.21 gain 172 179 -87.65 gain 179 172 -84.32 gain 172 180 -81.05 gain 180 172 -87.16 gain 172 181 -85.12 gain 181 172 -85.26 gain 172 182 -87.77 gain 182 172 -88.99 gain 172 183 -83.89 gain 183 172 -85.39 gain 172 184 -68.02 gain 184 172 -72.27 gain 172 185 -77.57 gain 185 172 -85.68 gain 172 186 -66.81 gain 186 172 -70.50 gain 172 187 -57.39 gain 187 172 -58.82 gain 172 188 -71.50 gain 188 172 -75.33 gain 172 189 -72.19 gain 189 172 -70.75 gain 172 190 -77.53 gain 190 172 -80.01 gain 172 191 -81.48 gain 191 172 -82.66 gain 172 192 -84.14 gain 192 172 -84.01 gain 172 193 -79.95 gain 193 172 -78.81 gain 172 194 -84.97 gain 194 172 -84.61 gain 172 195 -84.37 gain 195 172 -82.56 gain 172 196 -85.10 gain 196 172 -87.60 gain 172 197 -90.64 gain 197 172 -88.28 gain 172 198 -78.85 gain 198 172 -81.00 gain 172 199 -80.89 gain 199 172 -83.15 gain 172 200 -89.43 gain 200 172 -93.03 gain 172 201 -80.54 gain 201 172 -84.04 gain 172 202 -75.06 gain 202 172 -77.70 gain 172 203 -68.85 gain 203 172 -70.60 gain 172 204 -77.34 gain 204 172 -75.74 gain 172 205 -83.52 gain 205 172 -85.65 gain 172 206 -81.93 gain 206 172 -85.17 gain 172 207 -81.55 gain 207 172 -84.21 gain 172 208 -87.39 gain 208 172 -92.65 gain 172 209 -92.68 gain 209 172 -97.51 gain 172 210 -94.68 gain 210 172 -99.69 gain 172 211 -87.35 gain 211 172 -87.59 gain 172 212 -85.82 gain 212 172 -89.07 gain 172 213 -91.45 gain 213 172 -94.03 gain 172 214 -80.41 gain 214 172 -88.37 gain 172 215 -80.86 gain 215 172 -84.23 gain 172 216 -76.01 gain 216 172 -83.29 gain 172 217 -77.74 gain 217 172 -85.28 gain 172 218 -74.00 gain 218 172 -74.34 gain 172 219 -79.05 gain 219 172 -79.88 gain 172 220 -89.66 gain 220 172 -86.58 gain 172 221 -78.07 gain 221 172 -80.66 gain 172 222 -85.88 gain 222 172 -84.28 gain 172 223 -85.39 gain 223 172 -87.04 gain 172 224 -84.17 gain 224 172 -86.28 gain 173 174 -69.95 gain 174 173 -65.99 gain 173 175 -75.48 gain 175 173 -72.67 gain 173 176 -81.66 gain 176 173 -77.81 gain 173 177 -91.90 gain 177 173 -91.05 gain 173 178 -96.69 gain 178 173 -89.28 gain 173 179 -96.30 gain 179 173 -88.32 gain 173 180 -94.69 gain 180 173 -96.15 gain 173 181 -92.05 gain 181 173 -87.54 gain 173 182 -89.52 gain 182 173 -86.09 gain 173 183 -86.29 gain 183 173 -83.14 gain 173 184 -85.70 gain 184 173 -85.30 gain 173 185 -85.40 gain 185 173 -88.87 gain 173 186 -72.54 gain 186 173 -71.58 gain 173 187 -68.69 gain 187 173 -65.46 gain 173 188 -68.28 gain 188 173 -67.46 gain 173 189 -74.15 gain 189 173 -68.06 gain 173 190 -80.77 gain 190 173 -78.60 gain 173 191 -81.65 gain 191 173 -78.18 gain 173 192 -81.00 gain 192 173 -76.23 gain 173 193 -101.72 gain 193 173 -95.94 gain 173 194 -99.86 gain 194 173 -94.85 gain 173 195 -96.66 gain 195 173 -90.20 gain 173 196 -93.44 gain 196 173 -91.30 gain 173 197 -97.06 gain 197 173 -90.05 gain 173 198 -86.53 gain 198 173 -84.04 gain 173 199 -83.52 gain 199 173 -81.13 gain 173 200 -93.31 gain 200 173 -92.26 gain 173 201 -75.90 gain 201 173 -74.76 gain 173 202 -73.04 gain 202 173 -71.03 gain 173 203 -78.58 gain 203 173 -75.68 gain 173 204 -81.74 gain 204 173 -75.49 gain 173 205 -80.21 gain 205 173 -77.69 gain 173 206 -84.08 gain 206 173 -82.67 gain 173 207 -90.78 gain 207 173 -88.79 gain 173 208 -96.19 gain 208 173 -96.80 gain 173 209 -85.45 gain 209 173 -85.64 gain 173 210 -95.51 gain 210 173 -95.87 gain 173 211 -92.66 gain 211 173 -88.25 gain 173 212 -92.93 gain 212 173 -91.53 gain 173 213 -87.23 gain 213 173 -85.16 gain 173 214 -82.68 gain 214 173 -86.00 gain 173 215 -89.58 gain 215 173 -88.30 gain 173 216 -84.90 gain 216 173 -87.53 gain 173 217 -89.84 gain 217 173 -92.73 gain 173 218 -84.95 gain 218 173 -80.65 gain 173 219 -78.57 gain 219 173 -74.75 gain 173 220 -85.46 gain 220 173 -77.72 gain 173 221 -82.22 gain 221 173 -80.16 gain 173 222 -90.30 gain 222 173 -84.05 gain 173 223 -95.92 gain 223 173 -92.91 gain 173 224 -93.56 gain 224 173 -91.03 gain 174 175 -60.30 gain 175 174 -61.44 gain 174 176 -73.95 gain 176 174 -74.05 gain 174 177 -81.21 gain 177 174 -84.32 gain 174 178 -82.56 gain 178 174 -79.10 gain 174 179 -86.07 gain 179 174 -82.04 gain 174 180 -97.07 gain 180 174 -102.49 gain 174 181 -89.55 gain 181 174 -88.99 gain 174 182 -88.10 gain 182 174 -88.63 gain 174 183 -90.41 gain 183 174 -91.21 gain 174 184 -87.94 gain 184 174 -91.48 gain 174 185 -81.07 gain 185 174 -88.48 gain 174 186 -86.11 gain 186 174 -89.11 gain 174 187 -77.99 gain 187 174 -78.71 gain 174 188 -68.09 gain 188 174 -71.23 gain 174 189 -64.72 gain 189 174 -62.58 gain 174 190 -71.17 gain 190 174 -72.95 gain 174 191 -66.22 gain 191 174 -66.70 gain 174 192 -76.85 gain 192 174 -76.03 gain 174 193 -77.31 gain 193 174 -75.47 gain 174 194 -81.98 gain 194 174 -80.92 gain 174 195 -93.10 gain 195 174 -90.59 gain 174 196 -91.49 gain 196 174 -93.29 gain 174 197 -89.72 gain 197 174 -86.66 gain 174 198 -84.04 gain 198 174 -85.50 gain 174 199 -85.37 gain 199 174 -86.93 gain 174 200 -83.39 gain 200 174 -86.29 gain 174 201 -74.39 gain 201 174 -77.20 gain 174 202 -75.57 gain 202 174 -77.51 gain 174 203 -78.57 gain 203 174 -79.62 gain 174 204 -73.55 gain 204 174 -71.25 gain 174 205 -71.83 gain 205 174 -73.27 gain 174 206 -77.14 gain 206 174 -79.69 gain 174 207 -82.32 gain 207 174 -84.28 gain 174 208 -78.15 gain 208 174 -82.71 gain 174 209 -85.18 gain 209 174 -89.32 gain 174 210 -91.80 gain 210 174 -96.11 gain 174 211 -87.69 gain 211 174 -87.23 gain 174 212 -90.33 gain 212 174 -92.88 gain 174 213 -89.53 gain 213 174 -91.42 gain 174 214 -83.16 gain 214 174 -90.43 gain 174 215 -90.36 gain 215 174 -93.03 gain 174 216 -79.39 gain 216 174 -85.97 gain 174 217 -76.39 gain 217 174 -83.23 gain 174 218 -78.93 gain 218 174 -78.58 gain 174 219 -79.81 gain 219 174 -79.94 gain 174 220 -67.79 gain 220 174 -64.01 gain 174 221 -77.40 gain 221 174 -79.30 gain 174 222 -83.76 gain 222 174 -81.46 gain 174 223 -91.11 gain 223 174 -92.06 gain 174 224 -83.99 gain 224 174 -85.40 gain 175 176 -58.42 gain 176 175 -57.39 gain 175 177 -77.50 gain 177 175 -79.47 gain 175 178 -79.76 gain 178 175 -75.18 gain 175 179 -84.95 gain 179 175 -79.79 gain 175 180 -96.74 gain 180 175 -101.03 gain 175 181 -91.89 gain 181 175 -90.20 gain 175 182 -91.06 gain 182 175 -90.45 gain 175 183 -97.02 gain 183 175 -96.68 gain 175 184 -92.09 gain 184 175 -94.50 gain 175 185 -85.29 gain 185 175 -91.57 gain 175 186 -84.36 gain 186 175 -86.22 gain 175 187 -77.21 gain 187 175 -76.80 gain 175 188 -75.10 gain 188 175 -77.10 gain 175 189 -71.59 gain 189 175 -68.32 gain 175 190 -65.19 gain 190 175 -65.83 gain 175 191 -75.15 gain 191 175 -74.50 gain 175 192 -71.22 gain 192 175 -69.26 gain 175 193 -81.34 gain 193 175 -78.37 gain 175 194 -87.84 gain 194 175 -85.65 gain 175 195 -90.34 gain 195 175 -86.70 gain 175 196 -96.51 gain 196 175 -97.18 gain 175 197 -97.48 gain 197 175 -93.28 gain 175 198 -88.36 gain 198 175 -88.67 gain 175 199 -92.00 gain 199 175 -92.43 gain 175 200 -88.06 gain 200 175 -89.82 gain 175 201 -91.58 gain 201 175 -93.25 gain 175 202 -84.02 gain 202 175 -84.83 gain 175 203 -83.80 gain 203 175 -83.72 gain 175 204 -73.53 gain 204 175 -70.09 gain 175 205 -70.05 gain 205 175 -70.35 gain 175 206 -74.01 gain 206 175 -75.42 gain 175 207 -79.87 gain 207 175 -80.70 gain 175 208 -75.47 gain 208 175 -78.90 gain 175 209 -92.03 gain 209 175 -95.03 gain 175 210 -90.93 gain 210 175 -94.11 gain 175 211 -94.06 gain 211 175 -92.47 gain 175 212 -86.51 gain 212 175 -87.93 gain 175 213 -92.68 gain 213 175 -93.43 gain 175 214 -90.76 gain 214 175 -96.89 gain 175 215 -90.84 gain 215 175 -92.38 gain 175 216 -87.37 gain 216 175 -92.82 gain 175 217 -80.39 gain 217 175 -86.10 gain 175 218 -86.33 gain 218 175 -84.84 gain 175 219 -81.95 gain 219 175 -80.95 gain 175 220 -80.06 gain 220 175 -75.14 gain 175 221 -83.50 gain 221 175 -84.26 gain 175 222 -86.38 gain 222 175 -82.95 gain 175 223 -84.17 gain 223 175 -83.98 gain 175 224 -82.79 gain 224 175 -83.07 gain 176 177 -64.28 gain 177 176 -67.28 gain 176 178 -72.61 gain 178 176 -69.06 gain 176 179 -76.95 gain 179 176 -72.81 gain 176 180 -93.34 gain 180 176 -98.65 gain 176 181 -90.81 gain 181 176 -90.15 gain 176 182 -90.80 gain 182 176 -91.22 gain 176 183 -100.64 gain 183 176 -101.34 gain 176 184 -85.91 gain 184 176 -89.36 gain 176 185 -90.10 gain 185 176 -97.41 gain 176 186 -81.43 gain 186 176 -84.32 gain 176 187 -83.54 gain 187 176 -84.16 gain 176 188 -78.71 gain 188 176 -81.74 gain 176 189 -78.40 gain 189 176 -76.15 gain 176 190 -64.13 gain 190 176 -65.80 gain 176 191 -63.21 gain 191 176 -63.59 gain 176 192 -67.09 gain 192 176 -66.16 gain 176 193 -70.83 gain 193 176 -68.89 gain 176 194 -82.27 gain 194 176 -81.11 gain 176 195 -100.41 gain 195 176 -97.79 gain 176 196 -98.65 gain 196 176 -100.35 gain 176 197 -97.95 gain 197 176 -94.78 gain 176 198 -90.81 gain 198 176 -92.16 gain 176 199 -86.96 gain 199 176 -88.41 gain 176 200 -87.04 gain 200 176 -89.83 gain 176 201 -90.18 gain 201 176 -92.88 gain 176 202 -85.75 gain 202 176 -87.58 gain 176 203 -78.68 gain 203 176 -79.63 gain 176 204 -76.63 gain 204 176 -74.22 gain 176 205 -83.30 gain 205 176 -84.64 gain 176 206 -79.53 gain 206 176 -81.97 gain 176 207 -75.60 gain 207 176 -77.46 gain 176 208 -76.38 gain 208 176 -80.84 gain 176 209 -80.44 gain 209 176 -84.47 gain 176 210 -96.26 gain 210 176 -100.47 gain 176 211 -91.32 gain 211 176 -90.76 gain 176 212 -86.02 gain 212 176 -88.47 gain 176 213 -96.44 gain 213 176 -98.21 gain 176 214 -87.91 gain 214 176 -95.08 gain 176 215 -88.15 gain 215 176 -90.72 gain 176 216 -89.40 gain 216 176 -95.88 gain 176 217 -83.90 gain 217 176 -90.64 gain 176 218 -79.26 gain 218 176 -78.80 gain 176 219 -79.28 gain 219 176 -79.31 gain 176 220 -88.79 gain 220 176 -84.91 gain 176 221 -83.41 gain 221 176 -85.21 gain 176 222 -76.05 gain 222 176 -73.65 gain 176 223 -82.34 gain 223 176 -83.18 gain 176 224 -85.25 gain 224 176 -86.56 gain 177 178 -67.95 gain 178 177 -61.39 gain 177 179 -75.67 gain 179 177 -68.53 gain 177 180 -99.98 gain 180 177 -102.30 gain 177 181 -98.02 gain 181 177 -94.36 gain 177 182 -92.93 gain 182 177 -90.34 gain 177 183 -90.60 gain 183 177 -88.30 gain 177 184 -91.34 gain 184 177 -91.79 gain 177 185 -95.52 gain 185 177 -99.82 gain 177 186 -91.26 gain 186 177 -91.15 gain 177 187 -90.83 gain 187 177 -88.44 gain 177 188 -84.82 gain 188 177 -84.85 gain 177 189 -73.25 gain 189 177 -68.01 gain 177 190 -79.83 gain 190 177 -78.50 gain 177 191 -62.49 gain 191 177 -59.86 gain 177 192 -69.60 gain 192 177 -65.67 gain 177 193 -69.15 gain 193 177 -64.21 gain 177 194 -80.21 gain 194 177 -76.05 gain 177 195 -93.38 gain 195 177 -87.77 gain 177 196 -96.64 gain 196 177 -95.34 gain 177 197 -105.56 gain 197 177 -99.39 gain 177 198 -98.31 gain 198 177 -96.65 gain 177 199 -96.37 gain 199 177 -94.82 gain 177 200 -92.85 gain 200 177 -92.64 gain 177 201 -99.34 gain 201 177 -99.04 gain 177 202 -89.86 gain 202 177 -88.69 gain 177 203 -95.39 gain 203 177 -93.34 gain 177 204 -83.09 gain 204 177 -77.68 gain 177 205 -81.42 gain 205 177 -79.75 gain 177 206 -71.31 gain 206 177 -70.75 gain 177 207 -83.30 gain 207 177 -82.15 gain 177 208 -78.46 gain 208 177 -79.92 gain 177 209 -75.54 gain 209 177 -76.57 gain 177 210 -98.84 gain 210 177 -100.05 gain 177 211 -106.40 gain 211 177 -102.84 gain 177 212 -97.85 gain 212 177 -97.29 gain 177 213 -93.11 gain 213 177 -91.89 gain 177 214 -96.52 gain 214 177 -100.68 gain 177 215 -93.69 gain 215 177 -93.25 gain 177 216 -98.37 gain 216 177 -101.85 gain 177 217 -85.17 gain 217 177 -88.91 gain 177 218 -91.12 gain 218 177 -87.67 gain 177 219 -90.31 gain 219 177 -87.33 gain 177 220 -84.16 gain 220 177 -77.27 gain 177 221 -83.21 gain 221 177 -82.01 gain 177 222 -87.43 gain 222 177 -82.03 gain 177 223 -83.65 gain 223 177 -81.49 gain 177 224 -80.98 gain 224 177 -79.29 gain 178 179 -57.49 gain 179 178 -56.91 gain 178 180 -95.40 gain 180 178 -104.27 gain 178 181 -86.70 gain 181 178 -89.59 gain 178 182 -92.98 gain 182 178 -96.96 gain 178 183 -91.44 gain 183 178 -95.69 gain 178 184 -91.61 gain 184 178 -98.61 gain 178 185 -93.10 gain 185 178 -103.97 gain 178 186 -86.96 gain 186 178 -93.41 gain 178 187 -88.73 gain 187 178 -92.91 gain 178 188 -85.67 gain 188 178 -92.25 gain 178 189 -78.90 gain 189 178 -80.22 gain 178 190 -74.65 gain 190 178 -79.88 gain 178 191 -71.72 gain 191 178 -75.65 gain 178 192 -66.41 gain 192 178 -69.04 gain 178 193 -65.72 gain 193 178 -67.33 gain 178 194 -63.67 gain 194 178 -66.07 gain 178 195 -92.95 gain 195 178 -93.90 gain 178 196 -100.01 gain 196 178 -105.27 gain 178 197 -92.15 gain 197 178 -92.54 gain 178 198 -96.89 gain 198 178 -101.79 gain 178 199 -86.84 gain 199 178 -91.85 gain 178 200 -91.02 gain 200 178 -97.37 gain 178 201 -91.23 gain 201 178 -97.49 gain 178 202 -88.92 gain 202 178 -94.31 gain 178 203 -83.54 gain 203 178 -88.05 gain 178 204 -83.63 gain 204 178 -84.77 gain 178 205 -78.43 gain 205 178 -83.32 gain 178 206 -71.74 gain 206 178 -77.73 gain 178 207 -65.84 gain 207 178 -71.26 gain 178 208 -75.13 gain 208 178 -83.14 gain 178 209 -71.38 gain 209 178 -78.96 gain 178 210 -102.92 gain 210 178 -110.68 gain 178 211 -97.42 gain 211 178 -100.42 gain 178 212 -81.89 gain 212 178 -87.90 gain 178 213 -91.59 gain 213 178 -96.93 gain 178 214 -96.22 gain 214 178 -106.94 gain 178 215 -93.62 gain 215 178 -99.74 gain 178 216 -88.63 gain 216 178 -98.66 gain 178 217 -87.52 gain 217 178 -97.81 gain 178 218 -81.81 gain 218 178 -84.91 gain 178 219 -76.34 gain 219 178 -79.93 gain 178 220 -79.26 gain 220 178 -78.94 gain 178 221 -78.37 gain 221 178 -83.72 gain 178 222 -81.86 gain 222 178 -83.02 gain 178 223 -75.07 gain 223 178 -79.47 gain 178 224 -77.44 gain 224 178 -82.31 gain 179 180 -89.05 gain 180 179 -98.50 gain 179 181 -91.35 gain 181 179 -94.82 gain 179 182 -91.27 gain 182 179 -95.82 gain 179 183 -91.48 gain 183 179 -96.31 gain 179 184 -92.74 gain 184 179 -100.31 gain 179 185 -90.22 gain 185 179 -101.66 gain 179 186 -87.61 gain 186 179 -94.63 gain 179 187 -91.02 gain 187 179 -95.78 gain 179 188 -83.74 gain 188 179 -90.91 gain 179 189 -77.45 gain 189 179 -79.34 gain 179 190 -79.24 gain 190 179 -85.05 gain 179 191 -76.80 gain 191 179 -81.31 gain 179 192 -78.56 gain 192 179 -81.76 gain 179 193 -60.75 gain 193 179 -62.94 gain 179 194 -56.89 gain 194 179 -59.87 gain 179 195 -98.88 gain 195 179 -100.40 gain 179 196 -93.90 gain 196 179 -99.73 gain 179 197 -94.12 gain 197 179 -95.09 gain 179 198 -92.35 gain 198 179 -97.84 gain 179 199 -95.68 gain 199 179 -101.27 gain 179 200 -91.49 gain 200 179 -98.42 gain 179 201 -85.49 gain 201 179 -92.32 gain 179 202 -91.00 gain 202 179 -96.97 gain 179 203 -85.61 gain 203 179 -90.69 gain 179 204 -75.49 gain 204 179 -77.21 gain 179 205 -81.46 gain 205 179 -86.93 gain 179 206 -71.99 gain 206 179 -78.57 gain 179 207 -72.77 gain 207 179 -78.76 gain 179 208 -72.07 gain 208 179 -80.66 gain 179 209 -68.19 gain 209 179 -76.36 gain 179 210 -97.42 gain 210 179 -105.76 gain 179 211 -92.10 gain 211 179 -95.67 gain 179 212 -92.77 gain 212 179 -99.35 gain 179 213 -93.63 gain 213 179 -99.54 gain 179 214 -90.34 gain 214 179 -101.64 gain 179 215 -92.46 gain 215 179 -99.16 gain 179 216 -86.06 gain 216 179 -96.67 gain 179 217 -88.10 gain 217 179 -98.97 gain 179 218 -80.26 gain 218 179 -83.94 gain 179 219 -83.33 gain 219 179 -87.50 gain 179 220 -84.22 gain 220 179 -84.47 gain 179 221 -80.48 gain 221 179 -86.41 gain 179 222 -81.32 gain 222 179 -83.05 gain 179 223 -80.77 gain 223 179 -85.75 gain 179 224 -73.75 gain 224 179 -79.20 gain 180 181 -68.28 gain 181 180 -62.30 gain 180 182 -82.05 gain 182 180 -77.16 gain 180 183 -89.25 gain 183 180 -84.64 gain 180 184 -92.66 gain 184 180 -90.79 gain 180 185 -88.82 gain 185 180 -90.82 gain 180 186 -87.46 gain 186 180 -85.03 gain 180 187 -98.11 gain 187 180 -93.42 gain 180 188 -101.01 gain 188 180 -98.73 gain 180 189 -99.75 gain 189 180 -92.19 gain 180 190 -101.10 gain 190 180 -97.46 gain 180 191 -99.75 gain 191 180 -94.82 gain 180 192 -104.88 gain 192 180 -98.64 gain 180 193 -103.37 gain 193 180 -96.12 gain 180 194 -92.67 gain 194 180 -86.20 gain 180 195 -68.34 gain 195 180 -60.42 gain 180 196 -71.78 gain 196 180 -68.16 gain 180 197 -76.23 gain 197 180 -67.75 gain 180 198 -89.57 gain 198 180 -85.60 gain 180 199 -92.29 gain 199 180 -88.43 gain 180 200 -91.64 gain 200 180 -89.11 gain 180 201 -94.39 gain 201 180 -91.77 gain 180 202 -97.32 gain 202 180 -93.84 gain 180 203 -98.23 gain 203 180 -93.86 gain 180 204 -103.49 gain 204 180 -95.77 gain 180 205 -92.03 gain 205 180 -88.04 gain 180 206 -98.16 gain 206 180 -95.29 gain 180 207 -97.99 gain 207 180 -94.54 gain 180 208 -105.21 gain 208 180 -104.36 gain 180 209 -107.87 gain 209 180 -106.59 gain 180 210 -81.92 gain 210 180 -80.82 gain 180 211 -77.87 gain 211 180 -72.00 gain 180 212 -84.35 gain 212 180 -81.49 gain 180 213 -83.79 gain 213 180 -80.25 gain 180 214 -97.94 gain 214 180 -99.79 gain 180 215 -86.89 gain 215 180 -84.14 gain 180 216 -89.34 gain 216 180 -90.51 gain 180 217 -98.72 gain 217 180 -100.15 gain 180 218 -96.90 gain 218 180 -91.13 gain 180 219 -101.27 gain 219 180 -95.98 gain 180 220 -100.57 gain 220 180 -91.37 gain 180 221 -99.03 gain 221 180 -95.51 gain 180 222 -111.09 gain 222 180 -103.37 gain 180 223 -97.94 gain 223 180 -93.47 gain 180 224 -103.67 gain 224 180 -99.67 gain 181 182 -67.01 gain 182 181 -68.10 gain 181 183 -76.46 gain 183 181 -77.82 gain 181 184 -85.20 gain 184 181 -89.31 gain 181 185 -79.26 gain 185 181 -87.24 gain 181 186 -83.15 gain 186 181 -86.70 gain 181 187 -79.85 gain 187 181 -81.14 gain 181 188 -97.94 gain 188 181 -101.63 gain 181 189 -96.58 gain 189 181 -95.00 gain 181 190 -90.34 gain 190 181 -92.68 gain 181 191 -96.46 gain 191 181 -97.50 gain 181 192 -100.61 gain 192 181 -100.34 gain 181 193 -92.24 gain 193 181 -90.97 gain 181 194 -94.10 gain 194 181 -93.60 gain 181 195 -73.35 gain 195 181 -71.41 gain 181 196 -64.01 gain 196 181 -66.38 gain 181 197 -63.10 gain 197 181 -60.60 gain 181 198 -76.17 gain 198 181 -78.19 gain 181 199 -76.98 gain 199 181 -79.10 gain 181 200 -81.85 gain 200 181 -85.31 gain 181 201 -83.86 gain 201 181 -87.22 gain 181 202 -84.76 gain 202 181 -87.26 gain 181 203 -90.04 gain 203 181 -91.65 gain 181 204 -93.61 gain 204 181 -91.86 gain 181 205 -89.67 gain 205 181 -91.66 gain 181 206 -93.21 gain 206 181 -96.31 gain 181 207 -92.74 gain 207 181 -95.26 gain 181 208 -95.98 gain 208 181 -101.10 gain 181 209 -95.71 gain 209 181 -100.41 gain 181 210 -70.44 gain 210 181 -75.31 gain 181 211 -64.96 gain 211 181 -65.06 gain 181 212 -70.67 gain 212 181 -73.79 gain 181 213 -74.22 gain 213 181 -76.66 gain 181 214 -72.60 gain 214 181 -80.43 gain 181 215 -87.15 gain 215 181 -90.38 gain 181 216 -83.11 gain 216 181 -90.25 gain 181 217 -88.96 gain 217 181 -96.37 gain 181 218 -89.23 gain 218 181 -89.44 gain 181 219 -90.80 gain 219 181 -91.49 gain 181 220 -91.19 gain 220 181 -87.97 gain 181 221 -102.57 gain 221 181 -105.03 gain 181 222 -96.29 gain 222 181 -94.55 gain 181 223 -98.44 gain 223 181 -99.94 gain 181 224 -101.38 gain 224 181 -103.35 gain 182 183 -64.86 gain 183 182 -65.13 gain 182 184 -68.15 gain 184 182 -71.17 gain 182 185 -86.21 gain 185 182 -93.10 gain 182 186 -79.89 gain 186 182 -82.35 gain 182 187 -78.06 gain 187 182 -78.26 gain 182 188 -85.14 gain 188 182 -87.75 gain 182 189 -92.08 gain 189 182 -89.42 gain 182 190 -87.99 gain 190 182 -89.24 gain 182 191 -96.09 gain 191 182 -96.04 gain 182 192 -98.20 gain 192 182 -96.85 gain 182 193 -100.08 gain 193 182 -97.72 gain 182 194 -98.57 gain 194 182 -96.99 gain 182 195 -69.46 gain 195 182 -66.43 gain 182 196 -75.96 gain 196 182 -77.24 gain 182 197 -69.58 gain 197 182 -66.00 gain 182 198 -68.87 gain 198 182 -69.79 gain 182 199 -79.85 gain 199 182 -80.89 gain 182 200 -71.02 gain 200 182 -73.39 gain 182 201 -80.89 gain 201 182 -83.17 gain 182 202 -90.78 gain 202 182 -92.19 gain 182 203 -85.90 gain 203 182 -86.43 gain 182 204 -86.98 gain 204 182 -84.15 gain 182 205 -98.87 gain 205 182 -99.78 gain 182 206 -91.92 gain 206 182 -93.93 gain 182 207 -97.94 gain 207 182 -99.38 gain 182 208 -97.46 gain 208 182 -101.50 gain 182 209 -97.82 gain 209 182 -101.43 gain 182 210 -77.21 gain 210 182 -81.00 gain 182 211 -78.66 gain 211 182 -77.68 gain 182 212 -72.63 gain 212 182 -74.66 gain 182 213 -77.65 gain 213 182 -79.01 gain 182 214 -77.34 gain 214 182 -84.09 gain 182 215 -78.61 gain 215 182 -80.76 gain 182 216 -85.28 gain 216 182 -91.33 gain 182 217 -85.40 gain 217 182 -91.71 gain 182 218 -91.39 gain 218 182 -90.52 gain 182 219 -96.53 gain 219 182 -96.14 gain 182 220 -86.42 gain 220 182 -82.11 gain 182 221 -95.80 gain 221 182 -97.17 gain 182 222 -92.38 gain 222 182 -89.55 gain 182 223 -97.99 gain 223 182 -98.41 gain 182 224 -102.64 gain 224 182 -103.53 gain 183 184 -66.32 gain 184 183 -69.07 gain 183 185 -72.31 gain 185 183 -78.92 gain 183 186 -76.84 gain 186 183 -79.04 gain 183 187 -86.07 gain 187 183 -86.00 gain 183 188 -88.84 gain 188 183 -91.18 gain 183 189 -90.41 gain 189 183 -87.47 gain 183 190 -95.32 gain 190 183 -96.29 gain 183 191 -89.13 gain 191 183 -88.81 gain 183 192 -94.39 gain 192 183 -92.77 gain 183 193 -99.72 gain 193 183 -97.08 gain 183 194 -91.78 gain 194 183 -89.93 gain 183 195 -81.69 gain 195 183 -78.38 gain 183 196 -74.30 gain 196 183 -75.30 gain 183 197 -69.07 gain 197 183 -65.21 gain 183 198 -62.81 gain 198 183 -63.46 gain 183 199 -63.33 gain 199 183 -64.09 gain 183 200 -71.32 gain 200 183 -73.41 gain 183 201 -80.63 gain 201 183 -82.64 gain 183 202 -86.26 gain 202 183 -87.40 gain 183 203 -87.57 gain 203 183 -87.82 gain 183 204 -83.90 gain 204 183 -80.79 gain 183 205 -93.14 gain 205 183 -93.78 gain 183 206 -97.55 gain 206 183 -99.29 gain 183 207 -98.58 gain 207 183 -99.74 gain 183 208 -88.69 gain 208 183 -92.45 gain 183 209 -99.26 gain 209 183 -102.59 gain 183 210 -72.86 gain 210 183 -76.37 gain 183 211 -76.90 gain 211 183 -75.64 gain 183 212 -74.50 gain 212 183 -76.25 gain 183 213 -74.70 gain 213 183 -75.78 gain 183 214 -74.27 gain 214 183 -80.74 gain 183 215 -70.24 gain 215 183 -72.12 gain 183 216 -81.32 gain 216 183 -87.10 gain 183 217 -78.75 gain 217 183 -84.79 gain 183 218 -85.91 gain 218 183 -84.76 gain 183 219 -88.70 gain 219 183 -88.03 gain 183 220 -88.68 gain 220 183 -84.10 gain 183 221 -94.50 gain 221 183 -95.60 gain 183 222 -92.91 gain 222 183 -89.82 gain 183 223 -100.30 gain 223 183 -100.44 gain 183 224 -99.79 gain 224 183 -100.40 gain 184 185 -67.36 gain 185 184 -71.22 gain 184 186 -75.52 gain 186 184 -74.96 gain 184 187 -80.81 gain 187 184 -77.99 gain 184 188 -95.47 gain 188 184 -95.06 gain 184 189 -86.54 gain 189 184 -80.85 gain 184 190 -91.74 gain 190 184 -89.97 gain 184 191 -94.18 gain 191 184 -91.11 gain 184 192 -96.08 gain 192 184 -91.71 gain 184 193 -95.99 gain 193 184 -90.61 gain 184 194 -102.57 gain 194 184 -97.97 gain 184 195 -85.42 gain 195 184 -79.37 gain 184 196 -77.36 gain 196 184 -75.61 gain 184 197 -87.77 gain 197 184 -81.16 gain 184 198 -73.32 gain 198 184 -71.23 gain 184 199 -68.39 gain 199 184 -66.40 gain 184 200 -73.13 gain 200 184 -72.48 gain 184 201 -82.44 gain 201 184 -81.69 gain 184 202 -82.11 gain 202 184 -80.50 gain 184 203 -81.83 gain 203 184 -79.34 gain 184 204 -92.97 gain 204 184 -87.12 gain 184 205 -86.77 gain 205 184 -84.66 gain 184 206 -94.42 gain 206 184 -93.42 gain 184 207 -87.93 gain 207 184 -86.34 gain 184 208 -99.72 gain 208 184 -100.73 gain 184 209 -98.50 gain 209 184 -99.09 gain 184 210 -88.00 gain 210 184 -88.76 gain 184 211 -81.35 gain 211 184 -77.35 gain 184 212 -79.18 gain 212 184 -78.18 gain 184 213 -79.13 gain 213 184 -77.46 gain 184 214 -73.70 gain 214 184 -77.42 gain 184 215 -72.95 gain 215 184 -72.07 gain 184 216 -82.55 gain 216 184 -85.58 gain 184 217 -83.77 gain 217 184 -87.06 gain 184 218 -90.39 gain 218 184 -86.49 gain 184 219 -81.43 gain 219 184 -78.02 gain 184 220 -95.68 gain 220 184 -88.35 gain 184 221 -99.39 gain 221 184 -97.74 gain 184 222 -101.02 gain 222 184 -95.17 gain 184 223 -97.42 gain 223 184 -94.81 gain 184 224 -95.94 gain 224 184 -93.80 gain 185 186 -70.89 gain 186 185 -66.47 gain 185 187 -82.45 gain 187 185 -75.76 gain 185 188 -94.63 gain 188 185 -90.35 gain 185 189 -97.29 gain 189 185 -87.74 gain 185 190 -91.51 gain 190 185 -85.88 gain 185 191 -93.74 gain 191 185 -86.81 gain 185 192 -96.18 gain 192 185 -87.95 gain 185 193 -102.78 gain 193 185 -93.53 gain 185 194 -99.13 gain 194 185 -90.66 gain 185 195 -91.95 gain 195 185 -82.03 gain 185 196 -85.24 gain 196 185 -79.63 gain 185 197 -84.07 gain 197 185 -73.60 gain 185 198 -74.89 gain 198 185 -68.93 gain 185 199 -79.00 gain 199 185 -73.15 gain 185 200 -74.79 gain 200 185 -70.28 gain 185 201 -78.43 gain 201 185 -73.82 gain 185 202 -82.23 gain 202 185 -76.75 gain 185 203 -87.71 gain 203 185 -81.35 gain 185 204 -93.34 gain 204 185 -83.62 gain 185 205 -95.11 gain 205 185 -89.13 gain 185 206 -89.80 gain 206 185 -84.93 gain 185 207 -98.56 gain 207 185 -93.11 gain 185 208 -103.79 gain 208 185 -100.94 gain 185 209 -94.29 gain 209 185 -91.01 gain 185 210 -86.30 gain 210 185 -83.20 gain 185 211 -96.96 gain 211 185 -89.09 gain 185 212 -84.83 gain 212 185 -79.97 gain 185 213 -84.21 gain 213 185 -78.68 gain 185 214 -85.40 gain 214 185 -85.26 gain 185 215 -82.37 gain 215 185 -77.62 gain 185 216 -80.69 gain 216 185 -79.85 gain 185 217 -91.51 gain 217 185 -90.94 gain 185 218 -89.42 gain 218 185 -81.65 gain 185 219 -88.44 gain 219 185 -81.16 gain 185 220 -96.91 gain 220 185 -85.72 gain 185 221 -103.14 gain 221 185 -97.62 gain 185 222 -92.26 gain 222 185 -82.55 gain 185 223 -99.77 gain 223 185 -93.30 gain 185 224 -99.47 gain 224 185 -93.47 gain 186 187 -67.05 gain 187 186 -64.78 gain 186 188 -75.57 gain 188 186 -75.72 gain 186 189 -84.85 gain 189 186 -79.72 gain 186 190 -87.72 gain 190 186 -86.50 gain 186 191 -81.70 gain 191 186 -79.19 gain 186 192 -92.29 gain 192 186 -88.47 gain 186 193 -97.91 gain 193 186 -93.08 gain 186 194 -99.42 gain 194 186 -95.37 gain 186 195 -85.36 gain 195 186 -79.86 gain 186 196 -84.94 gain 196 186 -83.75 gain 186 197 -84.74 gain 197 186 -78.69 gain 186 198 -77.98 gain 198 186 -76.44 gain 186 199 -79.48 gain 199 186 -78.05 gain 186 200 -73.81 gain 200 186 -73.71 gain 186 201 -70.65 gain 201 186 -70.46 gain 186 202 -69.92 gain 202 186 -68.87 gain 186 203 -73.58 gain 203 186 -71.64 gain 186 204 -83.69 gain 204 186 -78.39 gain 186 205 -89.64 gain 205 186 -88.08 gain 186 206 -94.57 gain 206 186 -94.12 gain 186 207 -94.87 gain 207 186 -93.84 gain 186 208 -87.28 gain 208 186 -88.85 gain 186 209 -98.23 gain 209 186 -99.38 gain 186 210 -93.50 gain 210 186 -94.82 gain 186 211 -91.66 gain 211 186 -88.21 gain 186 212 -86.21 gain 212 186 -85.77 gain 186 213 -93.31 gain 213 186 -92.20 gain 186 214 -88.73 gain 214 186 -93.01 gain 186 215 -74.67 gain 215 186 -74.34 gain 186 216 -74.80 gain 216 186 -78.39 gain 186 217 -76.89 gain 217 186 -80.74 gain 186 218 -84.32 gain 218 186 -80.98 gain 186 219 -83.61 gain 219 186 -80.74 gain 186 220 -82.43 gain 220 186 -75.66 gain 186 221 -85.35 gain 221 186 -84.25 gain 186 222 -91.13 gain 222 186 -85.84 gain 186 223 -97.78 gain 223 186 -95.73 gain 186 224 -90.86 gain 224 186 -89.27 gain 187 188 -68.99 gain 188 187 -71.41 gain 187 189 -71.08 gain 189 187 -68.22 gain 187 190 -83.72 gain 190 187 -84.77 gain 187 191 -82.19 gain 191 187 -81.95 gain 187 192 -85.96 gain 192 187 -84.42 gain 187 193 -90.77 gain 193 187 -88.21 gain 187 194 -95.83 gain 194 187 -94.05 gain 187 195 -96.83 gain 195 187 -93.60 gain 187 196 -90.23 gain 196 187 -91.31 gain 187 197 -88.77 gain 197 187 -84.99 gain 187 198 -84.59 gain 198 187 -85.32 gain 187 199 -81.56 gain 199 187 -82.40 gain 187 200 -73.80 gain 200 187 -75.97 gain 187 201 -70.34 gain 201 187 -72.42 gain 187 202 -65.79 gain 202 187 -67.00 gain 187 203 -72.00 gain 203 187 -72.32 gain 187 204 -72.39 gain 204 187 -69.36 gain 187 205 -78.96 gain 205 187 -79.67 gain 187 206 -77.74 gain 206 187 -79.56 gain 187 207 -86.80 gain 207 187 -88.04 gain 187 208 -88.17 gain 208 187 -92.01 gain 187 209 -86.82 gain 209 187 -90.23 gain 187 210 -87.24 gain 210 187 -90.83 gain 187 211 -87.75 gain 211 187 -86.57 gain 187 212 -86.11 gain 212 187 -87.94 gain 187 213 -82.76 gain 213 187 -83.92 gain 187 214 -81.68 gain 214 187 -88.22 gain 187 215 -83.74 gain 215 187 -85.68 gain 187 216 -78.61 gain 216 187 -84.47 gain 187 217 -72.02 gain 217 187 -78.14 gain 187 218 -81.88 gain 218 187 -80.80 gain 187 219 -77.11 gain 219 187 -76.52 gain 187 220 -91.54 gain 220 187 -87.03 gain 187 221 -85.23 gain 221 187 -86.40 gain 187 222 -82.30 gain 222 187 -79.27 gain 187 223 -91.25 gain 223 187 -91.47 gain 187 224 -100.30 gain 224 187 -100.99 gain 188 189 -69.54 gain 189 188 -64.26 gain 188 190 -79.68 gain 190 188 -78.32 gain 188 191 -79.39 gain 191 188 -76.74 gain 188 192 -82.62 gain 192 188 -78.66 gain 188 193 -95.83 gain 193 188 -90.86 gain 188 194 -94.39 gain 194 188 -90.20 gain 188 195 -100.17 gain 195 188 -94.53 gain 188 196 -95.20 gain 196 188 -93.87 gain 188 197 -93.52 gain 197 188 -87.32 gain 188 198 -86.60 gain 198 188 -84.92 gain 188 199 -89.11 gain 199 188 -87.53 gain 188 200 -86.87 gain 200 188 -86.63 gain 188 201 -78.04 gain 201 188 -77.71 gain 188 202 -75.84 gain 202 188 -74.64 gain 188 203 -67.99 gain 203 188 -65.90 gain 188 204 -70.45 gain 204 188 -65.01 gain 188 205 -73.59 gain 205 188 -71.89 gain 188 206 -74.03 gain 206 188 -73.43 gain 188 207 -84.17 gain 207 188 -82.99 gain 188 208 -83.77 gain 208 188 -85.20 gain 188 209 -91.96 gain 209 188 -92.96 gain 188 210 -91.85 gain 210 188 -93.03 gain 188 211 -88.71 gain 211 188 -85.12 gain 188 212 -86.96 gain 212 188 -86.38 gain 188 213 -89.21 gain 213 188 -87.96 gain 188 214 -86.04 gain 214 188 -90.17 gain 188 215 -83.11 gain 215 188 -82.64 gain 188 216 -88.08 gain 216 188 -91.52 gain 188 217 -74.57 gain 217 188 -78.27 gain 188 218 -78.09 gain 218 188 -74.61 gain 188 219 -76.34 gain 219 188 -73.34 gain 188 220 -83.65 gain 220 188 -76.73 gain 188 221 -87.98 gain 221 188 -86.74 gain 188 222 -91.29 gain 222 188 -85.85 gain 188 223 -91.13 gain 223 188 -88.93 gain 188 224 -90.85 gain 224 188 -89.13 gain 189 190 -63.95 gain 190 189 -67.87 gain 189 191 -75.52 gain 191 189 -78.14 gain 189 192 -76.70 gain 192 189 -78.02 gain 189 193 -86.27 gain 193 189 -86.57 gain 189 194 -84.85 gain 194 189 -85.94 gain 189 195 -87.74 gain 195 189 -87.38 gain 189 196 -84.11 gain 196 189 -88.05 gain 189 197 -89.77 gain 197 189 -88.84 gain 189 198 -93.04 gain 198 189 -96.63 gain 189 199 -78.80 gain 199 189 -82.50 gain 189 200 -82.18 gain 200 189 -87.22 gain 189 201 -73.54 gain 201 189 -78.49 gain 189 202 -83.18 gain 202 189 -87.26 gain 189 203 -66.29 gain 203 189 -69.48 gain 189 204 -61.10 gain 204 189 -60.93 gain 189 205 -75.60 gain 205 189 -79.18 gain 189 206 -75.24 gain 206 189 -79.92 gain 189 207 -72.14 gain 207 189 -76.25 gain 189 208 -77.05 gain 208 189 -83.75 gain 189 209 -85.25 gain 209 189 -91.53 gain 189 210 -86.48 gain 210 189 -92.93 gain 189 211 -82.32 gain 211 189 -84.01 gain 189 212 -84.63 gain 212 189 -89.33 gain 189 213 -89.61 gain 213 189 -93.63 gain 189 214 -86.60 gain 214 189 -96.01 gain 189 215 -81.94 gain 215 189 -86.75 gain 189 216 -84.09 gain 216 189 -92.81 gain 189 217 -84.71 gain 217 189 -93.70 gain 189 218 -74.84 gain 218 189 -76.63 gain 189 219 -75.95 gain 219 189 -78.22 gain 189 220 -74.18 gain 220 189 -72.54 gain 189 221 -76.45 gain 221 189 -80.49 gain 189 222 -84.11 gain 222 189 -83.96 gain 189 223 -76.74 gain 223 189 -79.82 gain 189 224 -88.94 gain 224 189 -92.49 gain 190 191 -72.42 gain 191 190 -71.13 gain 190 192 -77.51 gain 192 190 -74.92 gain 190 193 -88.87 gain 193 190 -85.26 gain 190 194 -83.48 gain 194 190 -80.65 gain 190 195 -101.79 gain 195 190 -97.50 gain 190 196 -90.98 gain 196 190 -91.01 gain 190 197 -92.47 gain 197 190 -87.64 gain 190 198 -90.12 gain 198 190 -89.79 gain 190 199 -93.26 gain 199 190 -93.04 gain 190 200 -85.80 gain 200 190 -86.91 gain 190 201 -79.65 gain 201 190 -80.68 gain 190 202 -77.96 gain 202 190 -78.12 gain 190 203 -76.51 gain 203 190 -75.79 gain 190 204 -71.83 gain 204 190 -67.75 gain 190 205 -64.27 gain 205 190 -63.93 gain 190 206 -65.16 gain 206 190 -65.92 gain 190 207 -74.53 gain 207 190 -74.71 gain 190 208 -81.75 gain 208 190 -84.53 gain 190 209 -85.99 gain 209 190 -88.34 gain 190 210 -99.82 gain 210 190 -102.36 gain 190 211 -92.54 gain 211 190 -90.31 gain 190 212 -100.60 gain 212 190 -101.37 gain 190 213 -90.98 gain 213 190 -91.08 gain 190 214 -86.47 gain 214 190 -91.97 gain 190 215 -90.06 gain 215 190 -90.95 gain 190 216 -89.12 gain 216 190 -93.92 gain 190 217 -76.31 gain 217 190 -81.37 gain 190 218 -71.03 gain 218 190 -68.90 gain 190 219 -73.45 gain 219 190 -71.81 gain 190 220 -74.63 gain 220 190 -69.07 gain 190 221 -75.53 gain 221 190 -75.65 gain 190 222 -87.23 gain 222 190 -83.15 gain 190 223 -84.00 gain 223 190 -83.17 gain 190 224 -82.96 gain 224 190 -82.59 gain 191 192 -69.14 gain 192 191 -67.83 gain 191 193 -76.30 gain 193 191 -73.98 gain 191 194 -68.90 gain 194 191 -67.36 gain 191 195 -98.44 gain 195 191 -95.45 gain 191 196 -95.02 gain 196 191 -96.34 gain 191 197 -94.46 gain 197 191 -90.92 gain 191 198 -95.32 gain 198 191 -96.29 gain 191 199 -96.25 gain 199 191 -97.33 gain 191 200 -93.52 gain 200 191 -95.93 gain 191 201 -97.00 gain 201 191 -99.32 gain 191 202 -85.92 gain 202 191 -87.38 gain 191 203 -83.22 gain 203 191 -83.79 gain 191 204 -72.52 gain 204 191 -69.73 gain 191 205 -67.56 gain 205 191 -68.51 gain 191 206 -64.32 gain 206 191 -66.38 gain 191 207 -76.59 gain 207 191 -78.07 gain 191 208 -67.38 gain 208 191 -71.46 gain 191 209 -86.91 gain 209 191 -90.56 gain 191 210 -96.21 gain 210 191 -100.03 gain 191 211 -98.92 gain 211 191 -97.97 gain 191 212 -102.95 gain 212 191 -105.03 gain 191 213 -88.53 gain 213 191 -89.93 gain 191 214 -89.62 gain 214 191 -96.40 gain 191 215 -94.84 gain 215 191 -97.02 gain 191 216 -84.17 gain 216 191 -90.27 gain 191 217 -87.52 gain 217 191 -93.88 gain 191 218 -87.73 gain 218 191 -86.90 gain 191 219 -77.58 gain 219 191 -77.23 gain 191 220 -70.45 gain 220 191 -66.18 gain 191 221 -72.41 gain 221 191 -73.83 gain 191 222 -74.03 gain 222 191 -71.25 gain 191 223 -83.44 gain 223 191 -83.91 gain 191 224 -86.20 gain 224 191 -87.12 gain 192 193 -60.33 gain 193 192 -59.31 gain 192 194 -70.29 gain 194 192 -70.06 gain 192 195 -97.55 gain 195 192 -95.86 gain 192 196 -96.50 gain 196 192 -99.12 gain 192 197 -99.84 gain 197 192 -97.60 gain 192 198 -91.38 gain 198 192 -93.65 gain 192 199 -89.95 gain 199 192 -92.33 gain 192 200 -91.08 gain 200 192 -94.80 gain 192 201 -85.19 gain 201 192 -88.82 gain 192 202 -79.72 gain 202 192 -82.48 gain 192 203 -79.07 gain 203 192 -80.95 gain 192 204 -76.86 gain 204 192 -75.38 gain 192 205 -73.34 gain 205 192 -75.60 gain 192 206 -68.04 gain 206 192 -71.41 gain 192 207 -66.50 gain 207 192 -69.28 gain 192 208 -67.57 gain 208 192 -72.96 gain 192 209 -72.63 gain 209 192 -77.59 gain 192 210 -97.98 gain 210 192 -103.11 gain 192 211 -95.09 gain 211 192 -95.45 gain 192 212 -98.93 gain 212 192 -102.31 gain 192 213 -90.46 gain 213 192 -93.16 gain 192 214 -96.96 gain 214 192 -105.05 gain 192 215 -88.71 gain 215 192 -92.20 gain 192 216 -88.85 gain 216 192 -96.25 gain 192 217 -86.17 gain 217 192 -93.84 gain 192 218 -80.34 gain 218 192 -80.81 gain 192 219 -82.02 gain 219 192 -82.97 gain 192 220 -75.78 gain 220 192 -72.82 gain 192 221 -69.28 gain 221 192 -72.00 gain 192 222 -67.93 gain 222 192 -66.45 gain 192 223 -70.37 gain 223 192 -72.14 gain 192 224 -81.04 gain 224 192 -83.27 gain 193 194 -61.12 gain 194 193 -61.90 gain 193 195 -90.62 gain 195 193 -89.95 gain 193 196 -96.45 gain 196 193 -100.09 gain 193 197 -94.66 gain 197 193 -93.44 gain 193 198 -95.86 gain 198 193 -99.14 gain 193 199 -92.66 gain 199 193 -96.06 gain 193 200 -93.44 gain 200 193 -98.17 gain 193 201 -86.26 gain 201 193 -90.90 gain 193 202 -88.36 gain 202 193 -92.14 gain 193 203 -87.08 gain 203 193 -89.97 gain 193 204 -77.36 gain 204 193 -76.89 gain 193 205 -71.58 gain 205 193 -74.85 gain 193 206 -68.41 gain 206 193 -72.79 gain 193 207 -61.68 gain 207 193 -65.47 gain 193 208 -51.93 gain 208 193 -58.33 gain 193 209 -62.14 gain 209 193 -68.11 gain 193 210 -100.68 gain 210 193 -106.82 gain 193 211 -92.95 gain 211 193 -94.33 gain 193 212 -97.10 gain 212 193 -101.49 gain 193 213 -88.09 gain 213 193 -91.81 gain 193 214 -94.82 gain 214 193 -103.93 gain 193 215 -93.25 gain 215 193 -97.76 gain 193 216 -82.66 gain 216 193 -91.07 gain 193 217 -84.82 gain 217 193 -93.50 gain 193 218 -89.34 gain 218 193 -90.82 gain 193 219 -82.28 gain 219 193 -84.24 gain 193 220 -81.52 gain 220 193 -79.57 gain 193 221 -75.97 gain 221 193 -79.71 gain 193 222 -72.81 gain 222 193 -72.35 gain 193 223 -69.86 gain 223 193 -72.64 gain 193 224 -75.71 gain 224 193 -78.96 gain 194 195 -98.68 gain 195 194 -97.23 gain 194 196 -94.44 gain 196 194 -97.30 gain 194 197 -98.22 gain 197 194 -96.22 gain 194 198 -94.46 gain 198 194 -96.96 gain 194 199 -95.98 gain 199 194 -98.59 gain 194 200 -86.60 gain 200 194 -90.55 gain 194 201 -85.13 gain 201 194 -88.98 gain 194 202 -86.28 gain 202 194 -89.27 gain 194 203 -89.31 gain 203 194 -91.41 gain 194 204 -86.07 gain 204 194 -84.82 gain 194 205 -81.47 gain 205 194 -83.97 gain 194 206 -84.52 gain 206 194 -88.12 gain 194 207 -66.18 gain 207 194 -69.20 gain 194 208 -71.38 gain 208 194 -76.99 gain 194 209 -67.81 gain 209 194 -73.00 gain 194 210 -105.77 gain 210 194 -111.14 gain 194 211 -101.95 gain 211 194 -102.54 gain 194 212 -95.17 gain 212 194 -98.78 gain 194 213 -92.95 gain 213 194 -95.88 gain 194 214 -93.34 gain 214 194 -101.67 gain 194 215 -91.49 gain 215 194 -95.21 gain 194 216 -89.83 gain 216 194 -97.46 gain 194 217 -95.91 gain 217 194 -103.81 gain 194 218 -92.53 gain 218 194 -93.23 gain 194 219 -88.50 gain 219 194 -89.69 gain 194 220 -84.10 gain 220 194 -81.37 gain 194 221 -78.35 gain 221 194 -81.30 gain 194 222 -80.94 gain 222 194 -79.70 gain 194 223 -67.50 gain 223 194 -69.50 gain 194 224 -77.23 gain 224 194 -79.70 gain 195 196 -60.17 gain 196 195 -64.48 gain 195 197 -81.53 gain 197 195 -80.98 gain 195 198 -72.50 gain 198 195 -76.45 gain 195 199 -76.33 gain 199 195 -80.40 gain 195 200 -78.48 gain 200 195 -83.88 gain 195 201 -87.48 gain 201 195 -92.80 gain 195 202 -86.68 gain 202 195 -91.12 gain 195 203 -90.45 gain 203 195 -94.01 gain 195 204 -90.72 gain 204 195 -90.93 gain 195 205 -94.82 gain 205 195 -98.76 gain 195 206 -91.18 gain 206 195 -96.23 gain 195 207 -97.07 gain 207 195 -101.54 gain 195 208 -95.38 gain 208 195 -102.45 gain 195 209 -103.02 gain 209 195 -109.66 gain 195 210 -63.40 gain 210 195 -70.22 gain 195 211 -52.75 gain 211 195 -54.80 gain 195 212 -72.68 gain 212 195 -77.74 gain 195 213 -71.72 gain 213 195 -76.11 gain 195 214 -74.97 gain 214 195 -84.74 gain 195 215 -75.40 gain 215 195 -80.58 gain 195 216 -85.98 gain 216 195 -95.07 gain 195 217 -92.89 gain 217 195 -102.24 gain 195 218 -97.70 gain 218 195 -99.86 gain 195 219 -95.81 gain 219 195 -98.45 gain 195 220 -88.82 gain 220 195 -87.54 gain 195 221 -91.33 gain 221 195 -95.74 gain 195 222 -97.05 gain 222 195 -97.26 gain 195 223 -99.18 gain 223 195 -102.64 gain 195 224 -99.40 gain 224 195 -103.32 gain 196 197 -56.54 gain 197 196 -51.68 gain 196 198 -81.06 gain 198 196 -80.71 gain 196 199 -78.75 gain 199 196 -78.51 gain 196 200 -81.95 gain 200 196 -83.04 gain 196 201 -82.51 gain 201 196 -83.51 gain 196 202 -92.87 gain 202 196 -93.01 gain 196 203 -93.40 gain 203 196 -92.65 gain 196 204 -92.18 gain 204 196 -88.07 gain 196 205 -96.26 gain 205 196 -95.90 gain 196 206 -96.47 gain 206 196 -97.21 gain 196 207 -99.28 gain 207 196 -99.44 gain 196 208 -95.54 gain 208 196 -98.30 gain 196 209 -95.49 gain 209 196 -97.82 gain 196 210 -72.73 gain 210 196 -75.24 gain 196 211 -64.85 gain 211 196 -62.58 gain 196 212 -67.44 gain 212 196 -68.19 gain 196 213 -66.59 gain 213 196 -66.67 gain 196 214 -84.64 gain 214 196 -90.11 gain 196 215 -87.47 gain 215 196 -88.34 gain 196 216 -94.57 gain 216 196 -99.34 gain 196 217 -89.98 gain 217 196 -95.02 gain 196 218 -93.37 gain 218 196 -91.21 gain 196 219 -97.61 gain 219 196 -95.93 gain 196 220 -96.37 gain 220 196 -90.78 gain 196 221 -92.11 gain 221 196 -92.20 gain 196 222 -92.71 gain 222 196 -88.61 gain 196 223 -93.01 gain 223 196 -92.15 gain 196 224 -96.68 gain 224 196 -96.29 gain 197 198 -52.58 gain 198 197 -57.09 gain 197 199 -73.93 gain 199 197 -78.55 gain 197 200 -70.57 gain 200 197 -76.53 gain 197 201 -79.73 gain 201 197 -85.60 gain 197 202 -82.69 gain 202 197 -87.69 gain 197 203 -83.51 gain 203 197 -87.62 gain 197 204 -87.09 gain 204 197 -87.85 gain 197 205 -86.12 gain 205 197 -90.61 gain 197 206 -84.82 gain 206 197 -90.42 gain 197 207 -97.90 gain 207 197 -102.93 gain 197 208 -95.95 gain 208 197 -103.58 gain 197 209 -94.73 gain 209 197 -101.92 gain 197 210 -68.13 gain 210 197 -75.50 gain 197 211 -70.65 gain 211 197 -73.25 gain 197 212 -61.64 gain 212 197 -67.25 gain 197 213 -66.88 gain 213 197 -71.82 gain 197 214 -76.13 gain 214 197 -86.46 gain 197 215 -74.86 gain 215 197 -80.59 gain 197 216 -76.47 gain 216 197 -86.11 gain 197 217 -78.79 gain 217 197 -88.70 gain 197 218 -83.44 gain 218 197 -86.15 gain 197 219 -82.34 gain 219 197 -85.53 gain 197 220 -90.16 gain 220 197 -89.43 gain 197 221 -85.43 gain 221 197 -90.39 gain 197 222 -95.31 gain 222 197 -96.07 gain 197 223 -92.25 gain 223 197 -96.25 gain 197 224 -87.50 gain 224 197 -91.98 gain 198 199 -64.12 gain 199 198 -64.23 gain 198 200 -73.83 gain 200 198 -75.27 gain 198 201 -84.21 gain 201 198 -85.56 gain 198 202 -86.16 gain 202 198 -86.64 gain 198 203 -85.84 gain 203 198 -85.44 gain 198 204 -91.02 gain 204 198 -87.26 gain 198 205 -86.51 gain 205 198 -86.50 gain 198 206 -92.23 gain 206 198 -93.32 gain 198 207 -97.75 gain 207 198 -98.27 gain 198 208 -94.41 gain 208 198 -97.52 gain 198 209 -98.71 gain 209 198 -101.39 gain 198 210 -82.27 gain 210 198 -85.13 gain 198 211 -75.22 gain 211 198 -73.31 gain 198 212 -71.54 gain 212 198 -72.64 gain 198 213 -67.31 gain 213 198 -67.74 gain 198 214 -72.50 gain 214 198 -78.31 gain 198 215 -68.05 gain 215 198 -69.27 gain 198 216 -77.26 gain 216 198 -82.39 gain 198 217 -76.39 gain 217 198 -81.79 gain 198 218 -89.06 gain 218 198 -87.26 gain 198 219 -88.26 gain 219 198 -86.94 gain 198 220 -92.40 gain 220 198 -87.17 gain 198 221 -99.98 gain 221 198 -100.43 gain 198 222 -91.91 gain 222 198 -88.16 gain 198 223 -95.38 gain 223 198 -94.88 gain 198 224 -101.16 gain 224 198 -101.12 gain 199 200 -71.39 gain 200 199 -72.73 gain 199 201 -72.50 gain 201 199 -73.74 gain 199 202 -78.47 gain 202 199 -78.85 gain 199 203 -85.47 gain 203 199 -84.96 gain 199 204 -90.22 gain 204 199 -86.35 gain 199 205 -88.85 gain 205 199 -88.72 gain 199 206 -91.35 gain 206 199 -92.34 gain 199 207 -86.99 gain 207 199 -87.40 gain 199 208 -95.83 gain 208 199 -98.83 gain 199 209 -100.35 gain 209 199 -102.92 gain 199 210 -89.89 gain 210 199 -92.64 gain 199 211 -79.62 gain 211 199 -77.60 gain 199 212 -71.10 gain 212 199 -72.10 gain 199 213 -71.26 gain 213 199 -71.58 gain 199 214 -65.91 gain 214 199 -71.62 gain 199 215 -73.39 gain 215 199 -74.50 gain 199 216 -74.42 gain 216 199 -79.44 gain 199 217 -79.02 gain 217 199 -84.31 gain 199 218 -85.55 gain 218 199 -83.64 gain 199 219 -87.56 gain 219 199 -86.14 gain 199 220 -94.99 gain 220 199 -89.65 gain 199 221 -80.37 gain 221 199 -80.71 gain 199 222 -92.65 gain 222 199 -88.80 gain 199 223 -95.60 gain 223 199 -94.98 gain 199 224 -101.61 gain 224 199 -101.46 gain 200 201 -67.55 gain 201 200 -67.46 gain 200 202 -75.87 gain 202 200 -74.91 gain 200 203 -82.86 gain 203 200 -81.02 gain 200 204 -84.21 gain 204 200 -79.00 gain 200 205 -84.72 gain 205 200 -83.26 gain 200 206 -90.95 gain 206 200 -90.60 gain 200 207 -90.61 gain 207 200 -89.68 gain 200 208 -88.49 gain 208 200 -90.16 gain 200 209 -98.06 gain 209 200 -99.30 gain 200 210 -87.39 gain 210 200 -88.81 gain 200 211 -93.34 gain 211 200 -89.99 gain 200 212 -84.31 gain 212 200 -83.97 gain 200 213 -78.81 gain 213 200 -77.80 gain 200 214 -74.01 gain 214 200 -78.38 gain 200 215 -69.58 gain 215 200 -69.36 gain 200 216 -69.50 gain 216 200 -73.18 gain 200 217 -75.23 gain 217 200 -79.18 gain 200 218 -80.85 gain 218 200 -77.60 gain 200 219 -89.13 gain 219 200 -86.37 gain 200 220 -90.68 gain 220 200 -84.00 gain 200 221 -98.64 gain 221 200 -97.65 gain 200 222 -90.77 gain 222 200 -85.57 gain 200 223 -97.22 gain 223 200 -95.27 gain 200 224 -93.32 gain 224 200 -91.84 gain 201 202 -65.32 gain 202 201 -64.46 gain 201 203 -77.48 gain 203 201 -75.72 gain 201 204 -81.63 gain 204 201 -76.52 gain 201 205 -85.86 gain 205 201 -84.49 gain 201 206 -87.02 gain 206 201 -86.76 gain 201 207 -91.43 gain 207 201 -90.59 gain 201 208 -94.77 gain 208 201 -96.53 gain 201 209 -91.76 gain 209 201 -93.10 gain 201 210 -85.43 gain 210 201 -86.94 gain 201 211 -93.95 gain 211 201 -90.69 gain 201 212 -84.57 gain 212 201 -84.32 gain 201 213 -82.46 gain 213 201 -81.54 gain 201 214 -76.48 gain 214 201 -80.94 gain 201 215 -73.70 gain 215 201 -73.57 gain 201 216 -65.85 gain 216 201 -69.63 gain 201 217 -64.85 gain 217 201 -68.89 gain 201 218 -80.26 gain 218 201 -77.11 gain 201 219 -85.17 gain 219 201 -82.50 gain 201 220 -86.41 gain 220 201 -79.83 gain 201 221 -86.00 gain 221 201 -85.10 gain 201 222 -85.09 gain 222 201 -79.99 gain 201 223 -90.90 gain 223 201 -89.04 gain 201 224 -100.69 gain 224 201 -99.30 gain 202 203 -63.53 gain 203 202 -62.64 gain 202 204 -80.69 gain 204 202 -76.44 gain 202 205 -77.38 gain 205 202 -76.88 gain 202 206 -83.65 gain 206 202 -84.26 gain 202 207 -87.69 gain 207 202 -87.71 gain 202 208 -90.76 gain 208 202 -93.39 gain 202 209 -83.46 gain 209 202 -85.65 gain 202 210 -87.72 gain 210 202 -90.09 gain 202 211 -88.86 gain 211 202 -86.46 gain 202 212 -81.29 gain 212 202 -81.90 gain 202 213 -81.95 gain 213 202 -81.89 gain 202 214 -86.54 gain 214 202 -91.87 gain 202 215 -76.95 gain 215 202 -77.68 gain 202 216 -72.02 gain 216 202 -76.66 gain 202 217 -68.88 gain 217 202 -73.78 gain 202 218 -67.46 gain 218 202 -65.17 gain 202 219 -80.41 gain 219 202 -78.60 gain 202 220 -82.39 gain 220 202 -76.67 gain 202 221 -83.69 gain 221 202 -83.65 gain 202 222 -88.89 gain 222 202 -84.65 gain 202 223 -91.24 gain 223 202 -90.25 gain 202 224 -89.13 gain 224 202 -88.60 gain 203 204 -59.28 gain 204 203 -55.92 gain 203 205 -75.38 gain 205 203 -75.76 gain 203 206 -88.58 gain 206 203 -90.07 gain 203 207 -87.48 gain 207 203 -88.39 gain 203 208 -90.49 gain 208 203 -94.00 gain 203 209 -83.87 gain 209 203 -86.95 gain 203 210 -93.61 gain 210 203 -96.86 gain 203 211 -85.98 gain 211 203 -84.48 gain 203 212 -91.81 gain 212 203 -93.31 gain 203 213 -83.10 gain 213 203 -83.93 gain 203 214 -77.57 gain 214 203 -83.79 gain 203 215 -88.81 gain 215 203 -90.43 gain 203 216 -88.43 gain 216 203 -93.96 gain 203 217 -69.47 gain 217 203 -75.26 gain 203 218 -63.67 gain 218 203 -62.26 gain 203 219 -70.18 gain 219 203 -69.26 gain 203 220 -78.31 gain 220 203 -73.48 gain 203 221 -82.65 gain 221 203 -83.50 gain 203 222 -79.96 gain 222 203 -76.61 gain 203 223 -89.54 gain 223 203 -89.43 gain 203 224 -88.32 gain 224 203 -88.68 gain 204 205 -64.26 gain 205 204 -68.00 gain 204 206 -69.28 gain 206 204 -74.13 gain 204 207 -76.14 gain 207 204 -80.41 gain 204 208 -80.19 gain 208 204 -87.06 gain 204 209 -83.17 gain 209 204 -89.61 gain 204 210 -98.39 gain 210 204 -105.01 gain 204 211 -96.18 gain 211 204 -98.03 gain 204 212 -87.52 gain 212 204 -92.38 gain 204 213 -91.15 gain 213 204 -95.34 gain 204 214 -83.02 gain 214 204 -92.60 gain 204 215 -82.35 gain 215 204 -87.33 gain 204 216 -71.46 gain 216 204 -80.35 gain 204 217 -75.58 gain 217 204 -84.73 gain 204 218 -64.79 gain 218 204 -66.75 gain 204 219 -60.85 gain 219 204 -63.28 gain 204 220 -61.99 gain 220 204 -60.52 gain 204 221 -71.66 gain 221 204 -75.86 gain 204 222 -84.77 gain 222 204 -84.77 gain 204 223 -79.77 gain 223 204 -83.02 gain 204 224 -83.78 gain 224 204 -87.49 gain 205 206 -66.69 gain 206 205 -67.80 gain 205 207 -77.76 gain 207 205 -78.29 gain 205 208 -75.40 gain 208 205 -78.53 gain 205 209 -79.97 gain 209 205 -82.67 gain 205 210 -97.68 gain 210 205 -100.55 gain 205 211 -95.25 gain 211 205 -93.35 gain 205 212 -91.83 gain 212 205 -92.95 gain 205 213 -97.55 gain 213 205 -98.00 gain 205 214 -95.73 gain 214 205 -101.56 gain 205 215 -90.38 gain 215 205 -91.61 gain 205 216 -84.27 gain 216 205 -89.41 gain 205 217 -76.31 gain 217 205 -81.72 gain 205 218 -80.13 gain 218 205 -78.34 gain 205 219 -69.39 gain 219 205 -68.09 gain 205 220 -62.17 gain 220 205 -56.95 gain 205 221 -59.35 gain 221 205 -59.81 gain 205 222 -80.19 gain 222 205 -76.45 gain 205 223 -82.43 gain 223 205 -81.93 gain 205 224 -88.10 gain 224 205 -88.07 gain 206 207 -65.07 gain 207 206 -64.49 gain 206 208 -78.42 gain 208 206 -80.44 gain 206 209 -75.08 gain 209 206 -76.67 gain 206 210 -94.08 gain 210 206 -95.85 gain 206 211 -92.32 gain 211 206 -89.32 gain 206 212 -93.70 gain 212 206 -93.71 gain 206 213 -94.59 gain 213 206 -93.93 gain 206 214 -89.30 gain 214 206 -94.03 gain 206 215 -95.03 gain 215 206 -95.15 gain 206 216 -83.03 gain 216 206 -87.06 gain 206 217 -85.95 gain 217 206 -90.25 gain 206 218 -79.13 gain 218 206 -76.23 gain 206 219 -77.50 gain 219 206 -75.09 gain 206 220 -71.78 gain 220 206 -65.45 gain 206 221 -76.05 gain 221 206 -75.40 gain 206 222 -68.98 gain 222 206 -64.13 gain 206 223 -78.19 gain 223 206 -76.59 gain 206 224 -84.93 gain 224 206 -83.80 gain 207 208 -64.82 gain 208 207 -67.42 gain 207 209 -83.09 gain 209 207 -85.26 gain 207 210 -98.57 gain 210 207 -100.92 gain 207 211 -103.13 gain 211 207 -100.71 gain 207 212 -101.74 gain 212 207 -102.34 gain 207 213 -89.40 gain 213 207 -89.32 gain 207 214 -97.87 gain 214 207 -103.18 gain 207 215 -99.52 gain 215 207 -100.22 gain 207 216 -91.87 gain 216 207 -96.48 gain 207 217 -89.24 gain 217 207 -94.12 gain 207 218 -86.23 gain 218 207 -83.92 gain 207 219 -88.23 gain 219 207 -86.40 gain 207 220 -74.74 gain 220 207 -69.00 gain 207 221 -71.68 gain 221 207 -71.61 gain 207 222 -55.83 gain 222 207 -51.57 gain 207 223 -75.69 gain 223 207 -74.67 gain 207 224 -79.32 gain 224 207 -78.77 gain 208 209 -69.04 gain 209 208 -68.61 gain 208 210 -102.09 gain 210 208 -101.84 gain 208 211 -101.42 gain 211 208 -96.40 gain 208 212 -101.55 gain 212 208 -99.54 gain 208 213 -96.96 gain 213 208 -94.28 gain 208 214 -94.60 gain 214 208 -97.31 gain 208 215 -97.62 gain 215 208 -95.73 gain 208 216 -95.16 gain 216 208 -97.18 gain 208 217 -96.37 gain 217 208 -98.65 gain 208 218 -88.61 gain 218 208 -83.69 gain 208 219 -88.90 gain 219 208 -84.47 gain 208 220 -84.07 gain 220 208 -75.72 gain 208 221 -86.09 gain 221 208 -83.43 gain 208 222 -67.26 gain 222 208 -60.40 gain 208 223 -71.68 gain 223 208 -68.06 gain 208 224 -75.90 gain 224 208 -72.74 gain 209 210 -104.79 gain 210 209 -104.96 gain 209 211 -101.49 gain 211 209 -96.90 gain 209 212 -95.09 gain 212 209 -93.51 gain 209 213 -104.79 gain 213 209 -102.53 gain 209 214 -102.09 gain 214 209 -105.22 gain 209 215 -94.69 gain 215 209 -93.22 gain 209 216 -90.63 gain 216 209 -93.07 gain 209 217 -86.95 gain 217 209 -89.66 gain 209 218 -82.73 gain 218 209 -78.25 gain 209 219 -83.46 gain 219 209 -79.45 gain 209 220 -86.75 gain 220 209 -78.83 gain 209 221 -78.81 gain 221 209 -76.57 gain 209 222 -79.96 gain 222 209 -73.53 gain 209 223 -66.64 gain 223 209 -63.45 gain 209 224 -73.43 gain 224 209 -70.71 gain 210 211 -67.69 gain 211 210 -62.92 gain 210 212 -74.23 gain 212 210 -72.47 gain 210 213 -87.64 gain 213 210 -85.21 gain 210 214 -89.60 gain 214 210 -92.56 gain 210 215 -83.64 gain 215 210 -82.00 gain 210 216 -82.38 gain 216 210 -84.65 gain 210 217 -99.47 gain 217 210 -102.00 gain 210 218 -101.00 gain 218 210 -96.34 gain 210 219 -100.96 gain 219 210 -96.78 gain 210 220 -96.15 gain 220 210 -88.05 gain 210 221 -101.57 gain 221 210 -99.16 gain 210 222 -100.41 gain 222 210 -93.80 gain 210 223 -98.95 gain 223 210 -95.59 gain 210 224 -97.08 gain 224 210 -94.19 gain 211 212 -70.11 gain 212 211 -73.12 gain 211 213 -70.98 gain 213 211 -73.32 gain 211 214 -73.07 gain 214 211 -80.80 gain 211 215 -84.37 gain 215 211 -87.50 gain 211 216 -82.83 gain 216 211 -89.87 gain 211 217 -97.32 gain 217 211 -104.62 gain 211 218 -89.03 gain 218 211 -89.14 gain 211 219 -83.75 gain 219 211 -84.34 gain 211 220 -88.54 gain 220 211 -85.22 gain 211 221 -93.68 gain 221 211 -96.04 gain 211 222 -93.33 gain 222 211 -91.49 gain 211 223 -98.39 gain 223 211 -99.79 gain 211 224 -99.72 gain 224 211 -101.59 gain 212 213 -74.45 gain 213 212 -73.78 gain 212 214 -76.27 gain 214 212 -80.99 gain 212 215 -78.71 gain 215 212 -78.82 gain 212 216 -83.90 gain 216 212 -87.93 gain 212 217 -81.99 gain 217 212 -86.28 gain 212 218 -88.38 gain 218 212 -85.47 gain 212 219 -91.26 gain 219 212 -88.83 gain 212 220 -86.38 gain 220 212 -80.04 gain 212 221 -93.82 gain 221 212 -93.16 gain 212 222 -99.32 gain 222 212 -94.47 gain 212 223 -95.74 gain 223 212 -94.13 gain 212 224 -94.15 gain 224 212 -93.01 gain 213 214 -68.45 gain 214 213 -73.83 gain 213 215 -72.01 gain 215 213 -72.80 gain 213 216 -79.20 gain 216 213 -83.90 gain 213 217 -81.80 gain 217 213 -86.76 gain 213 218 -82.08 gain 218 213 -79.85 gain 213 219 -95.37 gain 219 213 -93.62 gain 213 220 -89.68 gain 220 213 -84.02 gain 213 221 -93.76 gain 221 213 -93.78 gain 213 222 -97.11 gain 222 213 -92.93 gain 213 223 -97.81 gain 223 213 -96.88 gain 213 224 -109.50 gain 224 213 -109.03 gain 214 215 -79.22 gain 215 214 -74.62 gain 214 216 -80.26 gain 216 214 -79.57 gain 214 217 -85.66 gain 217 214 -85.23 gain 214 218 -82.17 gain 218 214 -74.55 gain 214 219 -92.75 gain 219 214 -85.61 gain 214 220 -99.65 gain 220 214 -88.60 gain 214 221 -91.20 gain 221 214 -85.83 gain 214 222 -94.56 gain 222 214 -85.00 gain 214 223 -105.04 gain 223 214 -98.72 gain 214 224 -103.47 gain 224 214 -97.61 gain 215 216 -64.58 gain 216 215 -68.49 gain 215 217 -75.64 gain 217 215 -79.82 gain 215 218 -84.02 gain 218 215 -81.00 gain 215 219 -82.18 gain 219 215 -79.64 gain 215 220 -85.82 gain 220 215 -79.37 gain 215 221 -92.95 gain 221 215 -92.18 gain 215 222 -87.37 gain 222 215 -82.40 gain 215 223 -97.96 gain 223 215 -96.23 gain 215 224 -97.77 gain 224 215 -96.52 gain 216 217 -70.04 gain 217 216 -70.31 gain 216 218 -86.39 gain 218 216 -79.46 gain 216 219 -81.42 gain 219 216 -74.97 gain 216 220 -90.83 gain 220 216 -80.47 gain 216 221 -94.16 gain 221 216 -89.48 gain 216 222 -93.07 gain 222 216 -84.20 gain 216 223 -100.42 gain 223 216 -94.79 gain 216 224 -103.07 gain 224 216 -97.90 gain 217 218 -74.80 gain 218 217 -67.61 gain 217 219 -85.35 gain 219 217 -78.64 gain 217 220 -79.75 gain 220 217 -69.12 gain 217 221 -88.57 gain 221 217 -83.62 gain 217 222 -93.20 gain 222 217 -84.06 gain 217 223 -98.46 gain 223 217 -92.56 gain 217 224 -91.65 gain 224 217 -86.22 gain 218 219 -66.05 gain 219 218 -66.53 gain 218 220 -75.56 gain 220 218 -72.13 gain 218 221 -73.39 gain 221 218 -75.64 gain 218 222 -81.93 gain 222 218 -79.99 gain 218 223 -82.86 gain 223 218 -84.15 gain 218 224 -90.10 gain 224 218 -91.86 gain 219 220 -67.29 gain 220 219 -63.38 gain 219 221 -73.60 gain 221 219 -75.36 gain 219 222 -74.44 gain 222 219 -72.01 gain 219 223 -82.32 gain 223 219 -83.13 gain 219 224 -86.70 gain 224 219 -87.98 gain 220 221 -59.96 gain 221 220 -65.64 gain 220 222 -69.94 gain 222 220 -71.43 gain 220 223 -76.21 gain 223 220 -80.94 gain 220 224 -76.05 gain 224 220 -81.24 gain 221 222 -63.61 gain 222 221 -59.42 gain 221 223 -77.44 gain 223 221 -76.49 gain 221 224 -80.59 gain 224 221 -80.10 gain 222 223 -59.59 gain 223 222 -62.83 gain 222 224 -74.83 gain 224 222 -78.54 gain 223 224 -64.23 gain 224 223 -64.70 noise 0 -107.96 4.00 noise 1 -102.14 4.00 noise 2 -103.55 4.00 noise 3 -107.94 4.00 noise 4 -106.61 4.00 noise 5 -108.81 4.00 noise 6 -105.00 4.00 noise 7 -106.59 4.00 noise 8 -105.74 4.00 noise 9 -104.51 4.00 noise 10 -105.57 4.00 noise 11 -102.63 4.00 noise 12 -105.46 4.00 noise 13 -103.67 4.00 noise 14 -101.83 4.00 noise 15 -104.39 4.00 noise 16 -104.33 4.00 noise 17 -105.36 4.00 noise 18 -104.31 4.00 noise 19 -106.05 4.00 noise 20 -104.29 4.00 noise 21 -102.17 4.00 noise 22 -105.89 4.00 noise 23 -106.49 4.00 noise 24 -105.15 4.00 noise 25 -103.49 4.00 noise 26 -103.27 4.00 noise 27 -103.05 4.00 noise 28 -109.83 4.00 noise 29 -105.45 4.00 noise 30 -103.30 4.00 noise 31 -106.20 4.00 noise 32 -104.83 4.00 noise 33 -108.42 4.00 noise 34 -107.49 4.00 noise 35 -104.79 4.00 noise 36 -104.57 4.00 noise 37 -103.81 4.00 noise 38 -105.32 4.00 noise 39 -101.79 4.00 noise 40 -107.18 4.00 noise 41 -108.98 4.00 noise 42 -104.54 4.00 noise 43 -103.78 4.00 noise 44 -101.29 4.00 noise 45 -103.04 4.00 noise 46 -101.71 4.00 noise 47 -105.70 4.00 noise 48 -105.95 4.00 noise 49 -104.81 4.00 noise 50 -105.76 4.00 noise 51 -104.39 4.00 noise 52 -105.50 4.00 noise 53 -104.76 4.00 noise 54 -103.87 4.00 noise 55 -107.94 4.00 noise 56 -106.21 4.00 noise 57 -102.57 4.00 noise 58 -108.67 4.00 noise 59 -108.49 4.00 noise 60 -101.09 4.00 noise 61 -106.75 4.00 noise 62 -105.89 4.00 noise 63 -105.63 4.00 noise 64 -105.21 4.00 noise 65 -106.70 4.00 noise 66 -105.20 4.00 noise 67 -103.78 4.00 noise 68 -103.54 4.00 noise 69 -105.60 4.00 noise 70 -108.26 4.00 noise 71 -104.10 4.00 noise 72 -107.74 4.00 noise 73 -107.17 4.00 noise 74 -109.12 4.00 noise 75 -102.11 4.00 noise 76 -102.35 4.00 noise 77 -107.43 4.00 noise 78 -105.30 4.00 noise 79 -102.05 4.00 noise 80 -105.01 4.00 noise 81 -106.69 4.00 noise 82 -104.25 4.00 noise 83 -106.55 4.00 noise 84 -105.81 4.00 noise 85 -105.35 4.00 noise 86 -101.90 4.00 noise 87 -105.91 4.00 noise 88 -105.17 4.00 noise 89 -102.68 4.00 noise 90 -103.33 4.00 noise 91 -102.72 4.00 noise 92 -102.19 4.00 noise 93 -104.62 4.00 noise 94 -107.11 4.00 noise 95 -105.85 4.00 noise 96 -102.73 4.00 noise 97 -106.00 4.00 noise 98 -106.23 4.00 noise 99 -109.34 4.00 noise 100 -104.19 4.00 noise 101 -105.56 4.00 noise 102 -106.47 4.00 noise 103 -104.93 4.00 noise 104 -102.02 4.00 noise 105 -103.98 4.00 noise 106 -106.92 4.00 noise 107 -104.94 4.00 noise 108 -105.32 4.00 noise 109 -106.48 4.00 noise 110 -103.62 4.00 noise 111 -107.14 4.00 noise 112 -105.69 4.00 noise 113 -103.91 4.00 noise 114 -106.58 4.00 noise 115 -104.76 4.00 noise 116 -105.81 4.00 noise 117 -107.57 4.00 noise 118 -105.61 4.00 noise 119 -104.80 4.00 noise 120 -105.56 4.00 noise 121 -101.83 4.00 noise 122 -104.75 4.00 noise 123 -104.33 4.00 noise 124 -105.18 4.00 noise 125 -103.77 4.00 noise 126 -102.99 4.00 noise 127 -105.24 4.00 noise 128 -104.70 4.00 noise 129 -106.44 4.00 noise 130 -105.71 4.00 noise 131 -105.68 4.00 noise 132 -109.54 4.00 noise 133 -103.21 4.00 noise 134 -104.70 4.00 noise 135 -104.87 4.00 noise 136 -105.16 4.00 noise 137 -100.10 4.00 noise 138 -107.09 4.00 noise 139 -106.97 4.00 noise 140 -105.97 4.00 noise 141 -110.76 4.00 noise 142 -104.63 4.00 noise 143 -103.05 4.00 noise 144 -104.72 4.00 noise 145 -102.08 4.00 noise 146 -104.29 4.00 noise 147 -107.63 4.00 noise 148 -106.26 4.00 noise 149 -107.66 4.00 noise 150 -104.62 4.00 noise 151 -104.32 4.00 noise 152 -105.95 4.00 noise 153 -107.90 4.00 noise 154 -104.05 4.00 noise 155 -105.61 4.00 noise 156 -106.50 4.00 noise 157 -107.23 4.00 noise 158 -104.61 4.00 noise 159 -102.21 4.00 noise 160 -104.39 4.00 noise 161 -102.77 4.00 noise 162 -104.82 4.00 noise 163 -103.61 4.00 noise 164 -105.32 4.00 noise 165 -105.68 4.00 noise 166 -107.07 4.00 noise 167 -103.66 4.00 noise 168 -103.98 4.00 noise 169 -104.68 4.00 noise 170 -106.21 4.00 noise 171 -104.07 4.00 noise 172 -104.75 4.00 noise 173 -104.39 4.00 noise 174 -105.78 4.00 noise 175 -106.17 4.00 noise 176 -104.66 4.00 noise 177 -104.68 4.00 noise 178 -107.77 4.00 noise 179 -106.23 4.00 noise 180 -101.38 4.00 noise 181 -105.81 4.00 noise 182 -106.29 4.00 noise 183 -106.26 4.00 noise 184 -102.70 4.00 noise 185 -100.71 4.00 noise 186 -105.14 4.00 noise 187 -105.16 4.00 noise 188 -103.78 4.00 noise 189 -105.91 4.00 noise 190 -104.62 4.00 noise 191 -104.01 4.00 noise 192 -104.84 4.00 noise 193 -105.51 4.00 noise 194 -105.18 4.00 noise 195 -106.34 4.00 noise 196 -106.84 4.00 noise 197 -106.69 4.00 noise 198 -105.25 4.00 noise 199 -103.68 4.00 noise 200 -104.03 4.00 noise 201 -104.74 4.00 noise 202 -104.74 4.00 noise 203 -102.63 4.00 noise 204 -108.15 4.00 noise 205 -107.32 4.00 noise 206 -103.93 4.00 noise 207 -103.67 4.00 noise 208 -104.88 4.00 noise 209 -103.33 4.00 noise 210 -103.77 4.00 noise 211 -107.35 4.00 noise 212 -104.40 4.00 noise 213 -102.55 4.00 noise 214 -99.68 4.00 noise 215 -102.74 4.00 noise 216 -102.16 4.00 noise 217 -102.66 4.00 noise 218 -107.37 4.00 noise 219 -105.53 4.00 noise 220 -109.69 4.00 noise 221 -104.91 4.00 noise 222 -107.83 4.00 noise 223 -103.71 4.00 noise 224 -102.76 4.00 tinyos-2.1.2+dfsg/tos/lib/tossim/topologies/layout.py000066400000000000000000000215761207233610700227400ustar00rootroot00000000000000#!/usr/bin/env python import pygtk pygtk.require('2.0') import gtk class Mote: def __init__(self): self.x = 0 self.y = 0 self.selected = False class HelloWorld: def hello(self, widget, data=None): print "Hello World" def delete_event(self, widget, event, data=None): print "delete event occured" return False def destroy(self, widget, data=None): gtk.main_quit() def addButton(self, string, function, data=None): button = gtk.Button(string) button.connect("clicked", function, data) self.buttonArea.add(button) button.show() def close(self, x1, y1, x2, y2): x1 -= x2 y1 -= y2 x1 *= x1 y1 *= y1 if (x1 + y1 < 50): print "close: ", x1, " ", y1 return True else: print "not close: ", x1, " ", y1 return False def within(self, m, x1, y1, x2, y2): gX = max(x1, x2) + 5 lX = min(x1, x2) - 5 gY = max(y1, y2) + 5 lY = min(y1, y2) - 5 if (m.x >= lX and m.x <= gX and m.y >= lY and m.y <= gY): print "X: ", lX, "<=", m.x, "<=", gX print "Y: ", lY, "<=", m.y, "<=", gY return True else: print "X: ", lX, ">", m.x, ">", gX print "Y: ", lY, ">", m.y, ">", gY return False def button_press_event(self, widget, event): if event.button == 1 and self.pixmap != None: x = event.x y = event.y print "press at ", x, " ", y self.start_x = event.x self.start_y = event.y self.dx = 0 self.dy = 0 self.new_target = True for m in self.selected: if self.close(m.x, m.y, x, y): self.new_target = False if self.new_target: for m in self.selected: m.selected = False self.selected = [] self.redraw_motes() def button_release_event(self, widget, event): if event.button == 1 and self.pixmap != None: if self.new_target: x = event.x y = event.y print "release at ", x, " ", y for m in self.motes: if self.within(m, x, y, self.start_x, self.start_y): m.selected = True self.selected.append(m) self.redraw_motes() self.new_target = False else: for m in self.selected: m.x += self.dx m.y += self.dy self.dx = 0 self.dy = 0 self.redraw_motes() def drag_event(self, widget, event): x = y = state = None if event.is_hint: x, y, state = event.window.get_pointer() else: x = event.x y = event.y state = event.state if state & gtk.gdk.BUTTON1_MASK and self.pixmap != None: if not self.new_target: self.dx = event.x - self.start_x self.dy = event.y - self.start_y self.redraw_motes() print "drag" def configure_event(self, widget, event): self.widget = widget self.x, self.y, self.width, self.height = widget.get_allocation() self.pixmap = gtk.gdk.Pixmap(widget.window, self.width, self.height) self.pixmap.draw_rectangle(widget.get_style().white_gc, True, 0, 0, self.width, self.height) print "Configuring ", self.x, " ", self.y, " ", self.height, " ", self.width return True def expose_event(self, widget, event): x , y, width, height = event.area print "expose" widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, x, y, x, y, width, height) return False def redraw_motes(self): self.pixmap.draw_rectangle(self.widget.get_style().white_gc, True, 0, 0, self.width, self.height) self.widget.queue_draw_area(0, 0, self.width, self.height) for mote in self.motes: self.draw_mote(mote) def draw_mote(self, mote): x = mote.x y = mote.y if mote.selected: x += self.dx y += self.dy rect = (int(x-5), int(y-5), 10, 10) gc = self.widget.get_style().black_gc if mote.selected: gc = self.widget.get_style().light_gc[gtk.STATE_SELECTED] self.pixmap.draw_rectangle(gc, True, rect[0], rect[1], rect[2], rect[3]) def createDrawPanel(self): self.moteArea = gtk.DrawingArea() self.moteArea.set_size_request(400,400) self.drawArea.add(self.moteArea) self.moteArea.show() self.moteArea.connect("expose_event", self.expose_event) self.moteArea.connect("configure_event", self.configure_event) self.moteArea.connect("motion_notify_event", self.drag_event) self.moteArea.connect("button_press_event", self.button_press_event) self.moteArea.connect("button_release_event", self.button_release_event) self.moteArea.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.LEAVE_NOTIFY_MASK | gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK | gtk.gdk.BUTTON_RELEASE_MASK) def createButtonPanel(self): self.addButton("Add", self.addNode) self.addButton("Remove", self.removeSelected) self.addButton("Print", self.printTopology) table = gtk.Table(2, 2, True) label = gtk.Label("Area") label.set_justify(gtk.JUSTIFY_LEFT) label.show() self.distanceText = gtk.TextBuffer() self.distanceText.set_text("100") view = gtk.TextView(self.distanceText) table.attach(label, 0, 1, 0, 1) table.attach(view, 1, 2, 0, 1) view.show() label = gtk.Label("File") label.set_justify(gtk.JUSTIFY_LEFT) label.show() self.fileText = gtk.TextBuffer() self.fileText.set_text("layout.txt") view = gtk.TextView(self.fileText) view.show() table.attach(label, 0, 1, 1, 2) table.attach(view, 1, 2, 1, 2) self.buttonArea.add(table) table.set_row_spacings(4) table.show() self.addButton("Quit", self.quit); def __init__(self): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.connect("delete_event", self.delete_event) self.window.connect("destroy", self.destroy) self.window.set_border_width(10) self.buttonArea = gtk.VBox() self.drawArea = gtk.VBox() self.totalArea = gtk.HBox() self.totalArea.add(self.buttonArea) self.totalArea.add(self.drawArea) self.createDrawPanel() self.createButtonPanel() self.window.add(self.totalArea) self.buttonArea.show() self.drawArea.show() self.totalArea.show() self.window.show() self.motes = [] # For clicking and selecting motes self.selected = [] self.new_target = False self.start_x = 0 self.start_y = 0 self.dx = 0 self.dy = 0 def add_mote(self, x, y): m = Mote() m.x = x m.y = y self.motes.append(m) def addNode(self, widget, data=None): self.add_mote(50, 50) self.redraw_motes() print "add node" def removeSelected(self, widget, data=None): for m in self.selected: for other in self.motes: if m == other: self.motes.remove(m) self.selected = [] self.redraw_motes() print "remove selected" def printTopology(self, widget, data=None): counter = 0 startiter, enditer = self.fileText.get_bounds() filename = self.fileText.get_text(startiter, enditer) file = open(filename, "w") for m in self.motes: x = m.x y = m.y startiter, enditer = self.distanceText.get_bounds() text = self.distanceText.get_text(startiter, enditer) x *= int(text) y *= int(text) x /= 400 y /= 400 file.write(str(counter) + " "+ str(x) + " "+ str(y) + "\n") print "print topology" def quit(self, widget, data=None): gtk.main_quit() def main(self): gtk.main() if __name__ == "__main__": hello = HelloWorld() hello.main() tinyos-2.1.2+dfsg/tos/lib/tossim/tos.h000066400000000000000000000061401207233610700176310ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of all of the basic TOSSIM primitives and utility * functions. * * @author Philip Levis * @date Nov 22 2005 */ // $Id: tos.h,v 1.6 2010-06-29 22:07:51 scipio Exp $ #ifndef TOS_H_INCLUDED #define TOS_H_INCLUDED #if !defined(__CYGWIN__) #if defined(__MSP430__) #include #else #include #endif #else //cygwin #include #include #include #endif #include #include #include #include #include #include #ifndef __cplusplus typedef uint8_t bool; #endif /* * TEMPORARY: include the Safe TinyOS macros so that annotations get * defined away for non-safe users -- this will no longer be necessary * after we require users to use the ncc that has Safe TinyOS * support */ #include "../../lib/safe/include/annots_stage1.h" enum { FALSE = 0, TRUE = 1 }; extern uint16_t TOS_NODE_ID; #define PROGMEM #ifndef TOSSIM_MAX_NODES #define TOSSIM_MAX_NODES 1000 #endif #include #include #include #include // We only want to include these files if we are compiling TOSSIM proper, // that is, the C file representing the TinyOS application. The TinyOS // build process means that this is the only really good place to put // them. #ifdef TOSSIM struct @atmostonce { }; struct @atleastonce { }; struct @exactlyonce { }; #include #include #include #include #include #include #endif #endif tinyos-2.1.2+dfsg/tos/lib/tossim/tossim.c000066400000000000000000000156471207233610700203510ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of TOSSIM C++ classes. Generally just directly * call their C analogues. * * @author Philip Levis * @date Nov 22 2005 */ // $Id: tossim.c,v 1.7 2010-06-29 22:07:51 scipio Exp $ #include #include #include #include #include #include #include #include #include #include #include #include uint16_t TOS_NODE_ID = 1; Variable::Variable(char* str, char* formatStr, int array, int which) { name = str; format = formatStr; isArray = array; mote = which; int sLen = strlen(name); realName = (char*)malloc(sLen + 1); memcpy(realName, name, sLen + 1); realName[sLen] = 0; for (int i = 0; i < sLen; i++) { if (realName[i] == '.') { realName[i] = '$'; } } // printf("Creating %s realName: %s format: %s %s\n", name, realName, formatStr, array? "[]":""); if (sim_mote_get_variable_info(mote, realName, &ptr, &len) == 0) { data = (char*)malloc(len + 1); data[len] = 0; } else { printf("Could not find variable %s\n", realName); data = NULL; ptr = NULL; } printf("Allocated variable %s\n", realName); } Variable::~Variable() { printf("Freeing variable %s\n", realName); free(data); free(realName); } /* This is the sdbm algorithm, taken from http://www.cs.yorku.ca/~oz/hash.html -pal */ static unsigned int tossim_hash(void* key) { char* str = (char*)key; unsigned int hashVal = 0; int c; while ((c = *str++)) hashVal = c + (hashVal << 6) + (hashVal << 16) - hashVal; return hashVal; } static int tossim_hash_eq(void* key1, void* key2) { return strcmp((char*)key1, (char*)key2) == 0; } variable_string_t Variable::getData() { if (data != NULL && ptr != NULL) { str.ptr = data; str.type = format; str.len = len; str.isArray = isArray; // printf("Getting %s %s %s\n", format, isArray? "[]":"", name); memcpy(data, ptr, len); } else { str.ptr = (char*)""; str.type = (char*)""; str.len = strlen(""); str.isArray = 0; } return str; } Mote::Mote(nesc_app_t* n) { app = n; varTable = create_hashtable(128, tossim_hash, tossim_hash_eq); } Mote::~Mote(){} unsigned long Mote::id() { return nodeID; } long long int Mote::euid() { return sim_mote_euid(nodeID); } void Mote::setEuid(long long int val) { sim_mote_set_euid(nodeID, val); } long long int Mote::bootTime() { return sim_mote_start_time(nodeID); } void Mote::bootAtTime(long long int time) { sim_mote_set_start_time(nodeID, time); sim_mote_enqueue_boot_event(nodeID); } bool Mote::isOn() { return sim_mote_is_on(nodeID); } void Mote::turnOff() { sim_mote_turn_off(nodeID); } void Mote::turnOn() { sim_mote_turn_on(nodeID); } void Mote::setID(unsigned long val) { nodeID = val; } Variable* Mote::getVariable(char* name) { char* typeStr = (char*)""; int isArray; Variable* var; var = (Variable*)hashtable_search(varTable, name); if (var == NULL) { // Could hash this for greater efficiency, // but that would either require transformation // in Tossim class or a more complex typemap. if (app != NULL) { for (int i = 0; i < app->numVariables; i++) { if(strcmp(name, app->variableNames[i]) == 0) { typeStr = app->variableTypes[i]; isArray = app->variableArray[i]; break; } } } // printf("Getting variable %s of type %s %s\n", name, typeStr, isArray? "[]" : ""); var = new Variable(name, typeStr, isArray, nodeID); hashtable_insert(varTable, name, var); } return var; } void Mote::addNoiseTraceReading(int val) { sim_noise_trace_add(id(), (char)val); } void Mote::createNoiseModel() { sim_noise_create_model(id()); } int Mote::generateNoise(int when) { return (int)sim_noise_generate(id(), when); } Tossim::Tossim(nesc_app_t* n) { app = n; init(); } Tossim::~Tossim() { sim_end(); } void Tossim::init() { sim_init(); motes = (Mote**)malloc(sizeof(Mote*) * (TOSSIM_MAX_NODES + 1)); memset(motes, 0, sizeof(Mote*) * TOSSIM_MAX_NODES); } long long int Tossim::time() { return sim_time(); } long long int Tossim::ticksPerSecond() { return sim_ticks_per_sec(); } char* Tossim::timeStr() { sim_print_now(timeBuf, 256); return timeBuf; } void Tossim::setTime(long long int val) { sim_set_time(val); } Mote* Tossim::currentNode() { return getNode(sim_node()); } Mote* Tossim::getNode(unsigned long nodeID) { if (nodeID > TOSSIM_MAX_NODES) { nodeID = TOSSIM_MAX_NODES; // log an error, asked for an invalid node } else { if (motes[nodeID] == NULL) { motes[nodeID] = new Mote(app); if (nodeID == TOSSIM_MAX_NODES) { motes[nodeID]->setID(0xffff); } else { motes[nodeID]->setID(nodeID); } } return motes[nodeID]; } } void Tossim::setCurrentNode(unsigned long nodeID) { sim_set_node(nodeID); } void Tossim::addChannel(char* channel, FILE* file) { sim_add_channel(channel, file); } bool Tossim::removeChannel(char* channel, FILE* file) { return sim_remove_channel(channel, file); } void Tossim::randomSeed(int seed) { return sim_random_seed(seed); } bool Tossim::runNextEvent() { return sim_run_next_event(); } MAC* Tossim::mac() { return new MAC(); } Radio* Tossim::radio() { return new Radio(); } Packet* Tossim::newPacket() { return new Packet(); } tinyos-2.1.2+dfsg/tos/lib/tossim/tossim.h000066400000000000000000000071151207233610700203450ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Declaration of C++ objects representing TOSSIM abstractions. * Used to generate Python objects. * * @author Philip Levis * @date Nov 22 2005 */ // $Id: tossim.h,v 1.6 2010-06-29 22:07:51 scipio Exp $ #ifndef TOSSIM_H_INCLUDED #define TOSSIM_H_INCLUDED //#include #include #include #include #include #include #include typedef struct variable_string { char* type; char* ptr; int len; int isArray; } variable_string_t; typedef struct nesc_app { int numVariables; char** variableNames; char** variableTypes; int* variableArray; } nesc_app_t; class Variable { public: Variable(char* name, char* format, int array, int mote); ~Variable(); variable_string_t getData(); private: char* name; char* realName; char* format; int mote; void* ptr; char* data; size_t len; int isArray; variable_string_t str; }; class Mote { public: Mote(nesc_app_t* app); ~Mote(); unsigned long id(); long long int euid(); void setEuid(long long int id); long long int bootTime(); void bootAtTime(long long int time); bool isOn(); void turnOff(); void turnOn(); void setID(unsigned long id); void addNoiseTraceReading(int val); void createNoiseModel(); int generateNoise(int when); Variable* getVariable(char* name); private: unsigned long nodeID; nesc_app_t* app; struct hashtable* varTable; }; class Tossim { public: Tossim(nesc_app_t* app); ~Tossim(); void init(); long long int time(); long long int ticksPerSecond(); char* timeStr(); void setTime(long long int time); Mote* currentNode(); Mote* getNode(unsigned long nodeID); void setCurrentNode(unsigned long nodeID); void addChannel(char* channel, FILE* file); bool removeChannel(char* channel, FILE* file); void randomSeed(int seed); bool runNextEvent(); MAC* mac(); Radio* radio(); Packet* newPacket(); private: char timeBuf[256]; nesc_app_t* app; Mote** motes; }; #endif // TOSSIM_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tossim/tossim.i000066400000000000000000000243621207233610700203510ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * SWIG interface specification for TOSSIM. This file defines * the top-level TOSSIM and Mote objects which are exported to * Python. The typemap at the beginning allows a script to * use Python files as a parameter to a function that takes a * FILE* as a parameter (e.g., the logging system in sim_log.h). * * @author Philip Levis * @date Nov 22 2005 */ %module TOSSIM %{ #include #include enum { PRIMITIVE_INTEGER = 0, PRIMITIVE_FLOAT = 1, PRIMITIVE_UNKNOWN = 2 }; int lengthOfType(char* type) { if (strcmp(type, "uint8_t") == 0) { return sizeof(uint8_t); } else if (strcmp(type, "uint16_t") == 0) { return sizeof(uint16_t); } else if (strcmp(type, "uint32_t") == 0) { return sizeof(uint32_t); } else if (strcmp(type, "int8_t") == 0) { return sizeof(int8_t); } else if (strcmp(type, "int16_t") == 0) { return sizeof(int16_t); } else if (strcmp(type, "int32_t") == 0) { return sizeof(int32_t); } else if (strcmp(type, "char") == 0) { return sizeof(char); } else if (strcmp(type, "short") == 0) { return sizeof(short); } else if (strcmp(type, "int") == 0) { return sizeof(int); } else if (strcmp(type, "long") == 0) { return sizeof(long); } else if (strcmp(type, "unsigned char") == 0) { return sizeof(unsigned char); } else if (strcmp(type, "unsigned short") == 0) { return sizeof(unsigned short); } else if (strcmp(type, "unsigned int") == 0) { return sizeof(unsigned int); } else if (strcmp(type, "unsigned long") == 0) { return sizeof(unsigned long); } else if (strcmp(type, "float") == 0) { return sizeof(float); } else if (strcmp(type, "double") == 0) { return sizeof(double); } else { return 1; } } int memoryToPrimitive(char* type, char* ptr, long* lval, double* dval) { if (strcmp(type, "uint8_t") == 0) { uint8_t val; memcpy(&val, ptr, sizeof(uint8_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "uint16_t") == 0) { uint16_t val; memcpy(&val, ptr, sizeof(uint16_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "uint32_t") == 0) { uint32_t val; memcpy(&val, ptr, sizeof(uint32_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int8_t") == 0) { int8_t val; memcpy(&val, ptr, sizeof(int8_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int16_t") == 0) { int16_t val; memcpy(&val, ptr, sizeof(int16_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int32_t") == 0) { int32_t val; memcpy(&val, ptr, sizeof(int32_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "char") == 0) { long val; memcpy(&val, ptr, sizeof(char)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "short") == 0) { short val; memcpy(&val, ptr, sizeof(short)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int") == 0) { int val; memcpy(&val, ptr, sizeof(int)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "long") == 0) { long val; memcpy(&val, ptr, sizeof(long)); *lval = val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned char") == 0) { unsigned char val; memcpy(&val, ptr, sizeof(unsigned char)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned short") == 0) { unsigned short val; memcpy(&val, ptr, sizeof(unsigned short)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned int") == 0) { unsigned int val; memcpy(&val, ptr, sizeof(unsigned int)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned long") == 0) { unsigned long val; memcpy(&val, ptr, sizeof(unsigned long)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "float") == 0) { float val; memcpy(&val, ptr, sizeof(float)); *dval = (double)val; return PRIMITIVE_FLOAT; } else if (strcmp(type, "double") == 0) { double val; memcpy(&val, ptr, sizeof(double)); *dval = val; return PRIMITIVE_FLOAT; } else { return PRIMITIVE_UNKNOWN; } } PyObject* valueFromScalar(char* type, char* ptr, int len) { long lval; double dval; int rval = memoryToPrimitive(type, ptr, &lval, &dval); switch(rval) { case PRIMITIVE_INTEGER: return PyInt_FromLong(lval); case PRIMITIVE_FLOAT: return PyFloat_FromDouble(dval); case PRIMITIVE_UNKNOWN: default: return PyString_FromStringAndSize(ptr, len); } } PyObject* listFromArray(char* type, char* ptr, int len) { long lval; double dval; int elementLen = lengthOfType(type); PyObject* list = PyList_New(0); //printf("Generating list of %s\n", type); for (char* tmpPtr = ptr; tmpPtr < ptr + len; tmpPtr += elementLen) { PyList_Append(list, valueFromScalar(type, tmpPtr, elementLen)); } return list; } %} %include mac.i %include radio.i %include packet.i %typemap(python,in) FILE * { if (!PyFile_Check($input)) { PyErr_SetString(PyExc_TypeError, "Requires a file as a parameter."); return NULL; } $1 = PyFile_AsFile($input); } %typemap(python,out) variable_string_t { if ($1.isArray) { //printf("Generating array %s\n", $1.type); $result = listFromArray ($1.type, $1.ptr, $1.len); } else { //printf("Generating scalar %s\n", $1.type); $result = valueFromScalar($1.type, $1.ptr, $1.len); } if ($result == NULL) { PyErr_SetString(PyExc_RuntimeError, "Error generating Python type from TinyOS variable."); } } %typemap(python,in) nesc_app_t* { if (!PyList_Check($input)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size($input); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem($input, 3 * i); PyObject* array = PyList_GetItem($input, (3 * i) + 1); PyObject* format = PyList_GetItem($input, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = (char*)""; app->variableTypes[i] = (char*)""; } } $1 = app; } } typedef struct var_string { char* type; char* ptr; int len; int isArray; } variable_string_t; typedef struct nesc_app { int numVariables; char** variableNames; char** variableTypes; int* variableArray; } nesc_app_t; class Variable { public: Variable(char* name, char* format, int array, int mote); ~Variable(); variable_string_t getData(); }; class Mote { public: Mote(nesc_app_t* app); ~Mote(); unsigned long id(); long long int euid(); void setEuid(long long int id); long long int bootTime(); void bootAtTime(long long int time); bool isOn(); void turnOff(); void turnOn(); Variable* getVariable(char* name); void addNoiseTraceReading(int val); void createNoiseModel(); int generateNoise(int when); }; class Tossim { public: Tossim(nesc_app_t* app); ~Tossim(); void init(); long long int time(); long long int ticksPerSecond(); void setTime(long long int time); char* timeStr(); Mote* currentNode(); Mote* getNode(unsigned long nodeID); void setCurrentNode(unsigned long nodeID); void addChannel(char* channel, FILE* file); bool removeChannel(char* channel, FILE* file); void randomSeed(int seed); bool runNextEvent(); MAC* mac(); Radio* radio(); Packet* newPacket(); }; tinyos-2.1.2+dfsg/tos/lib/tossim/tossim_wrap.cxx000066400000000000000000006711651207233610700217650ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 1.3.33 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGPYTHON #define SWIG_PYTHON_DIRECTOR_NO_VTABLE #ifdef __cplusplus template class SwigValueWrapper { T *tt; public: SwigValueWrapper() : tt(0) { } SwigValueWrapper(const SwigValueWrapper& rhs) : tt(new T(*rhs.tt)) { } SwigValueWrapper(const T& t) : tt(new T(t)) { } ~SwigValueWrapper() { delete tt; } SwigValueWrapper& operator=(const T& t) { delete tt; tt = new T(t); return *this; } operator T&() const { return *tt; } T *operator&() { return tt; } private: SwigValueWrapper& operator=(const SwigValueWrapper& rhs); }; template T SwigValueInit() { return T(); } #endif /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif /* Python.h has to appear first */ #include /* ----------------------------------------------------------------------------- * swigrun.swg * * This file contains generic CAPI SWIG runtime support for pointer * type checking. * ----------------------------------------------------------------------------- */ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "3" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE # define SWIG_QUOTE_STRING(x) #x # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else # define SWIG_TYPE_TABLE_NAME #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the swig runtime code. In 99.9% of the cases, swig just needs to declare them as 'static'. But only do this if is strictly necessary, ie, if you have problems with your compiler or so. */ #ifndef SWIGRUNTIME # define SWIGRUNTIME SWIGINTERN #endif #ifndef SWIGRUNTIMEINLINE # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif /* Generic buffer size */ #ifndef SWIG_BUFFER_SIZE # define SWIG_BUFFER_SIZE 1024 #endif /* Flags for pointer conversions */ #define SWIG_POINTER_DISOWN 0x1 /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 /* Flags/methods for returning states. The swig conversion methods, as ConvertPtr, return and integer that tells if the conversion was successful or not. And if not, an error code can be returned (see swigerrors.swg for the codes). Use the following macros/flags to set or process the returning states. In old swig versions, you usually write code as: if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { // success code } else { //fail code } Now you can be more explicit as: int res = SWIG_ConvertPtr(obj,vptr,ty.flags); if (SWIG_IsOK(res)) { // success code } else { // fail code } that seems to be the same, but now you can also do Type *ptr; int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); if (SWIG_IsOK(res)) { // success code if (SWIG_IsNewObj(res) { ... delete *ptr; } else { ... } } else { // fail code } I.e., now SWIG_ConvertPtr can return new objects and you can identify the case and take care of the deallocation. Of course that requires also to SWIG_ConvertPtr to return new result values, as int SWIG_ConvertPtr(obj, ptr,...) { if () { if () { *ptr = ; return SWIG_NEWOBJ; } else { *ptr = ; return SWIG_OLDOBJ; } } else { return SWIG_BADOBJ; } } Of course, returning the plain '0(success)/-1(fail)' still works, but you can be more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the swig errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code allows to return the 'cast rank', for example, if you have this int food(double) int fooi(int); and you call food(1) // cast rank '1' (1 -> 1.0) fooi(1) // cast rank '0' just use the SWIG_AddCast()/SWIG_CheckState() */ #define SWIG_OK (0) #define SWIG_ERROR (-1) #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) /* The CastRankLimit says how many bits are used for the cast rank */ #define SWIG_CASTRANKLIMIT (1 << 8) /* The NewMask denotes the object was created (using new/malloc) */ #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) /* The TmpMask is for in/out typemaps that use temporal objects */ #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) /* Simple returning values */ #define SWIG_BADOBJ (SWIG_ERROR) #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) /* Check, add and del mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) #define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) #define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) #define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) /* Cast-Rank Mode */ #if defined(SWIG_CASTRANK_MODE) # ifndef SWIG_TypeRank # define SWIG_TypeRank unsigned long # endif # ifndef SWIG_MAXCASTRANK /* Default cast allowed */ # define SWIG_MAXCASTRANK (2) # endif # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) SWIGINTERNINLINE int SWIG_AddCast(int r) { return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; } SWIGINTERNINLINE int SWIG_CheckState(int r) { return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; } #else /* no cast-rank mode */ # define SWIG_AddCast # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) #endif #include #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *); typedef struct swig_type_info *(*swig_dycast_func)(void **); /* Structure to store inforomation on one type */ typedef struct swig_type_info { const char *name; /* mangled name of this type */ const char *str; /* human readable name of this type */ swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ struct swig_cast_info *cast; /* linked list of types that can cast into this type */ void *clientdata; /* language specific type data */ int owndata; /* flag if the structure owns the clientdata */ } swig_type_info; /* Structure to store a type and conversion function used for casting */ typedef struct swig_cast_info { swig_type_info *type; /* pointer to type that is equivalent to this type */ swig_converter_func converter; /* function to cast the void pointers */ struct swig_cast_info *next; /* pointer to next cast in linked list */ struct swig_cast_info *prev; /* pointer to the previous cast */ } swig_cast_info; /* Structure used to store module information * Each module generates one structure like this, and the runtime collects * all of these structures and stores them in a circularly linked list.*/ typedef struct swig_module_info { swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ size_t size; /* Number of types in this module */ struct swig_module_info *next; /* Pointer to next element in circularly linked list */ swig_type_info **type_initial; /* Array of initially generated type structures */ swig_cast_info **cast_initial; /* Array of initially generated casting structures */ void *clientdata; /* Language specific module data */ } swig_module_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; } return (int)((l1 - f1) - (l2 - f2)); } /* Check type equivalence in a name list like ||... Return 0 if not equal, 1 if equal */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { int equiv = 0; const char* te = tb + strlen(tb); const char* ne = nb; while (!equiv && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; if (*ne) ++ne; } return equiv; } /* Check type equivalence in a name list like ||... Return 0 if equal, -1 if nb < tb, 1 if nb > tb */ SWIGRUNTIME int SWIG_TypeCompare(const char *nb, const char *tb) { int equiv = 0; const char* te = tb + strlen(tb); const char* ne = nb; while (!equiv && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; if (*ne) ++ne; } return equiv; } /* think of this as a c++ template<> or a scheme macro */ #define SWIG_TypeCheck_Template(comparison, ty) \ if (ty) { \ swig_cast_info *iter = ty->cast; \ while (iter) { \ if (comparison) { \ if (iter == ty->cast) return iter; \ /* Move iter to the top of the linked list */ \ iter->prev->next = iter->next; \ if (iter->next) \ iter->next->prev = iter->prev; \ iter->next = ty->cast; \ iter->prev = 0; \ if (ty->cast) ty->cast->prev = iter; \ ty->cast = iter; \ return iter; \ } \ iter = iter->next; \ } \ } \ return 0 /* Check the typename */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { SWIG_TypeCheck_Template(strcmp(iter->type->name, c) == 0, ty); } /* Same as previous function, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *into) { SWIG_TypeCheck_Template(iter->type == from, into); } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_cast_info *ty, void *ptr) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { swig_cast_info *cast = ti->cast; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; while (cast) { if (!cast->converter) { swig_type_info *tc = cast->type; if (!tc->clientdata) { SWIG_TypeClientData(tc, clientdata); } } cast = cast->next; } } SWIGRUNTIME void SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientData(ti, clientdata); ti->owndata = 1; } /* Search for a swig_type_info structure only by mangled name Search is a O(log #types) We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_MangledTypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { swig_module_info *iter = start; do { if (iter->size) { register size_t l = 0; register size_t r = iter->size - 1; do { /* since l+r >= 0, we can (>> 1) instead (/ 2) */ register size_t i = (l + r) >> 1; const char *iname = iter->types[i]->name; if (iname) { register int compare = strcmp(name, iname); if (compare == 0) { return iter->types[i]; } else if (compare < 0) { if (i) { r = i - 1; } else { break; } } else if (compare > 0) { l = i + 1; } } else { break; /* should never happen */ } } while (l <= r); } iter = iter->next; } while (iter != end); return 0; } /* Search for a swig_type_info structure for either a mangled name or a human readable name. It first searches the mangled names of the types, which is a O(log #types) If a type is not found it then searches the human readable names, which is O(#types). We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { /* STEP 1: Search the name field using binary search */ swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); if (ret) { return ret; } else { /* STEP 2: If the type hasn't been found, do a complete search of the str field (the human readable name) */ swig_module_info *iter = start; do { register size_t i = 0; for (; i < iter->size; ++i) { if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) return iter->types[i]; } iter = iter->next; } while (iter != end); } /* neither found a match */ return 0; } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; register const unsigned char *u = (unsigned char *) ptr; register const unsigned char *eu = u + sz; for (; u != eu; ++u) { register unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { register unsigned char *u = (unsigned char *) ptr; register const unsigned char *eu = u + sz; for (; u != eu; ++u) { register char d = *(c++); register unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /* Errors in SWIG */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 #define SWIG_IndexError -4 #define SWIG_TypeError -5 #define SWIG_DivisionByZero -6 #define SWIG_OverflowError -7 #define SWIG_SyntaxError -8 #define SWIG_ValueError -9 #define SWIG_SystemError -10 #define SWIG_AttributeError -11 #define SWIG_MemoryError -12 #define SWIG_NullReferenceError -13 /* Add PyOS_snprintf for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) # define PyOS_snprintf _snprintf # else # define PyOS_snprintf snprintf # endif #endif /* A crude PyString_FromFormat implementation for old Pythons */ #if PY_VERSION_HEX < 0x02020000 #ifndef SWIG_PYBUFFER_SIZE # define SWIG_PYBUFFER_SIZE 1024 #endif static PyObject * PyString_FromFormat(const char *fmt, ...) { va_list ap; char buf[SWIG_PYBUFFER_SIZE * 2]; int res; va_start(ap, fmt); res = vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf); } #endif /* Add PyObject_Del for old Pythons */ #if PY_VERSION_HEX < 0x01060000 # define PyObject_Del(op) PyMem_DEL((op)) #endif #ifndef PyObject_DEL # define PyObject_DEL PyObject_Del #endif /* A crude PyExc_StopIteration exception for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # ifndef PyExc_StopIteration # define PyExc_StopIteration PyExc_RuntimeError # endif # ifndef PyObject_GenericGetAttr # define PyObject_GenericGetAttr 0 # endif #endif /* Py_NotImplemented is defined in 2.1 and up. */ #if PY_VERSION_HEX < 0x02010000 # ifndef Py_NotImplemented # define Py_NotImplemented PyExc_RuntimeError # endif #endif /* A crude PyString_AsStringAndSize implementation for old Pythons */ #if PY_VERSION_HEX < 0x02010000 # ifndef PyString_AsStringAndSize # define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;} # endif #endif /* PySequence_Size for old Pythons */ #if PY_VERSION_HEX < 0x02000000 # ifndef PySequence_Size # define PySequence_Size PySequence_Length # endif #endif /* PyBool_FromLong for old Pythons */ #if PY_VERSION_HEX < 0x02030000 static PyObject *PyBool_FromLong(long ok) { PyObject *result = ok ? Py_True : Py_False; Py_INCREF(result); return result; } #endif /* Py_ssize_t for old Pythons */ /* This code is as recommended by: */ /* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */ #if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) typedef int Py_ssize_t; # define PY_SSIZE_T_MAX INT_MAX # define PY_SSIZE_T_MIN INT_MIN #endif /* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME PyObject* SWIG_Python_ErrorType(int code) { PyObject* type = 0; switch(code) { case SWIG_MemoryError: type = PyExc_MemoryError; break; case SWIG_IOError: type = PyExc_IOError; break; case SWIG_RuntimeError: type = PyExc_RuntimeError; break; case SWIG_IndexError: type = PyExc_IndexError; break; case SWIG_TypeError: type = PyExc_TypeError; break; case SWIG_DivisionByZero: type = PyExc_ZeroDivisionError; break; case SWIG_OverflowError: type = PyExc_OverflowError; break; case SWIG_SyntaxError: type = PyExc_SyntaxError; break; case SWIG_ValueError: type = PyExc_ValueError; break; case SWIG_SystemError: type = PyExc_SystemError; break; case SWIG_AttributeError: type = PyExc_AttributeError; break; default: type = PyExc_RuntimeError; } return type; } SWIGRUNTIME void SWIG_Python_AddErrorMsg(const char* mesg) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); PyErr_Clear(); Py_XINCREF(type); PyErr_Format(type, "%s %s", PyString_AsString(old_str), mesg); Py_DECREF(old_str); Py_DECREF(value); } else { PyErr_Format(PyExc_RuntimeError, mesg); } } #if defined(SWIG_PYTHON_NO_THREADS) # if defined(SWIG_PYTHON_THREADS) # undef SWIG_PYTHON_THREADS # endif #endif #if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ # if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) # if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */ # define SWIG_PYTHON_USE_GIL # endif # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ # ifndef SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() # endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { bool status; PyGILState_STATE state; public: void end() { if (status) { PyGILState_Release(state); status = false;} } SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} ~SWIG_Python_Thread_Block() { end(); } }; class SWIG_Python_Thread_Allow { bool status; PyThreadState *save; public: void end() { if (status) { PyEval_RestoreThread(save); status = false; }} SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} ~SWIG_Python_Thread_Allow() { end(); } }; # define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block # define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() # define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow # define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() # else /* C code */ # define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() # define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() # define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) # endif # else /* Old thread way, not implemented, user must provide it */ # if !defined(SWIG_PYTHON_INITIALIZE_THREADS) # define SWIG_PYTHON_INITIALIZE_THREADS # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_END_BLOCK) # define SWIG_PYTHON_THREAD_END_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # endif # if !defined(SWIG_PYTHON_THREAD_END_ALLOW) # define SWIG_PYTHON_THREAD_END_ALLOW # endif # endif #else /* No thread support */ # define SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # define SWIG_PYTHON_THREAD_END_BLOCK # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # define SWIG_PYTHON_THREAD_END_ALLOW #endif /* ----------------------------------------------------------------------------- * Python API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* cc-mode */ #endif #endif /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; #ifdef __cplusplus #if 0 { /* cc-mode */ #endif } #endif /* ----------------------------------------------------------------------------- * See the LICENSE file for information on copyright, usage and redistribution * of SWIG, and the README file for authors - http://www.swig.org/release.html. * * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * ----------------------------------------------------------------------------- */ /* Common SWIG API */ /* for raw pointers */ #define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(ptr, type, flags) #define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) #define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) #define swig_owntype int /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Python_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) #define SWIG_NewClientData(obj) PySwigClientData_New(obj) #define SWIG_SetErrorObj SWIG_Python_SetErrorObj #define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg #define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) #define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) #define SWIG_fail goto fail /* Runtime API implementation */ /* Error manipulation */ SWIGINTERN void SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetObject(errtype, obj); Py_DECREF(obj); SWIG_PYTHON_THREAD_END_BLOCK; } SWIGINTERN void SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(errtype, (char *) msg); SWIG_PYTHON_THREAD_END_BLOCK; } #define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) /* Set a constant value */ SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { PyDict_SetItemString(d, (char*) name, obj); Py_DECREF(obj); } /* Append a value to the result obj */ SWIGINTERN PyObject* SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { #if !defined(SWIG_PYTHON_OUTPUT_TUPLE) if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyList_Check(result)) { PyObject *o2 = result; result = PyList_New(1); PyList_SetItem(result, 0, o2); } PyList_Append(result,obj); Py_DECREF(obj); } return result; #else PyObject* o2; PyObject* o3; if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyTuple_Check(result)) { o2 = result; result = PyTuple_New(1); PyTuple_SET_ITEM(result, 0, o2); } o3 = PyTuple_New(1); PyTuple_SET_ITEM(o3, 0, obj); o2 = result; result = PySequence_Concat(o2, o3); Py_DECREF(o2); Py_DECREF(o3); } return result; #endif } /* Unpack the argument tuple */ SWIGINTERN int SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) { if (!args) { if (!min && !max) { return 1; } else { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", name, (min == max ? "" : "at least "), (int)min); return 0; } } if (!PyTuple_Check(args)) { PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); return 0; } else { register Py_ssize_t l = PyTuple_GET_SIZE(args); if (l < min) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at least "), (int)min, (int)l); return 0; } else if (l > max) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at most "), (int)max, (int)l); return 0; } else { register int i; for (i = 0; i < l; ++i) { objs[i] = PyTuple_GET_ITEM(args, i); } for (; l < max; ++l) { objs[l] = 0; } return i + 1; } } } /* A functor is a function object with one single object argument */ #if PY_VERSION_HEX >= 0x02020000 #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); #else #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj); #endif /* Helper for static pointer initialization for both C and C++ code, for example static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); */ #ifdef __cplusplus #define SWIG_STATIC_POINTER(var) var #else #define SWIG_STATIC_POINTER(var) var = 0; if (!var) var #endif /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Flags for new pointer objects */ #define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) #define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) #define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) #ifdef __cplusplus extern "C" { #if 0 } /* cc-mode */ #endif #endif /* How to access Py_None */ #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # ifndef SWIG_PYTHON_NO_BUILD_NONE # ifndef SWIG_PYTHON_BUILD_NONE # define SWIG_PYTHON_BUILD_NONE # endif # endif #endif #ifdef SWIG_PYTHON_BUILD_NONE # ifdef Py_None # undef Py_None # define Py_None SWIG_Py_None() # endif SWIGRUNTIMEINLINE PyObject * _SWIG_Py_None(void) { PyObject *none = Py_BuildValue((char*)""); Py_DECREF(none); return none; } SWIGRUNTIME PyObject * SWIG_Py_None(void) { static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None(); return none; } #endif /* The python void return value */ SWIGRUNTIMEINLINE PyObject * SWIG_Py_Void(void) { PyObject *none = Py_None; Py_INCREF(none); return none; } /* PySwigClientData */ typedef struct { PyObject *klass; PyObject *newraw; PyObject *newargs; PyObject *destroy; int delargs; int implicitconv; } PySwigClientData; SWIGRUNTIMEINLINE int SWIG_Python_CheckImplicit(swig_type_info *ty) { PySwigClientData *data = (PySwigClientData *)ty->clientdata; return data ? data->implicitconv : 0; } SWIGRUNTIMEINLINE PyObject * SWIG_Python_ExceptionType(swig_type_info *desc) { PySwigClientData *data = desc ? (PySwigClientData *) desc->clientdata : 0; PyObject *klass = data ? data->klass : 0; return (klass ? klass : PyExc_RuntimeError); } SWIGRUNTIME PySwigClientData * PySwigClientData_New(PyObject* obj) { if (!obj) { return 0; } else { PySwigClientData *data = (PySwigClientData *)malloc(sizeof(PySwigClientData)); /* the klass element */ data->klass = obj; Py_INCREF(data->klass); /* the newraw method and newargs arguments used to create a new raw instance */ if (PyClass_Check(obj)) { data->newraw = 0; data->newargs = obj; Py_INCREF(obj); } else { #if (PY_VERSION_HEX < 0x02020000) data->newraw = 0; #else data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__"); #endif if (data->newraw) { Py_INCREF(data->newraw); data->newargs = PyTuple_New(1); PyTuple_SetItem(data->newargs, 0, obj); } else { data->newargs = obj; } Py_INCREF(data->newargs); } /* the destroy method, aka as the C++ delete method */ data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__"); if (PyErr_Occurred()) { PyErr_Clear(); data->destroy = 0; } if (data->destroy) { int flags; Py_INCREF(data->destroy); flags = PyCFunction_GET_FLAGS(data->destroy); #ifdef METH_O data->delargs = !(flags & (METH_O)); #else data->delargs = 0; #endif } else { data->delargs = 0; } data->implicitconv = 0; return data; } } SWIGRUNTIME void PySwigClientData_Del(PySwigClientData* data) { Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); } /* =============== PySwigObject =====================*/ typedef struct { PyObject_HEAD void *ptr; swig_type_info *ty; int own; PyObject *next; } PySwigObject; SWIGRUNTIME PyObject * PySwigObject_long(PySwigObject *v) { return PyLong_FromVoidPtr(v->ptr); } SWIGRUNTIME PyObject * PySwigObject_format(const char* fmt, PySwigObject *v) { PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { if (PyTuple_SetItem(args, 0, PySwigObject_long(v)) == 0) { PyObject *ofmt = PyString_FromString(fmt); if (ofmt) { res = PyString_Format(ofmt,args); Py_DECREF(ofmt); } Py_DECREF(args); } } return res; } SWIGRUNTIME PyObject * PySwigObject_oct(PySwigObject *v) { return PySwigObject_format("%o",v); } SWIGRUNTIME PyObject * PySwigObject_hex(PySwigObject *v) { return PySwigObject_format("%x",v); } SWIGRUNTIME PyObject * #ifdef METH_NOARGS PySwigObject_repr(PySwigObject *v) #else PySwigObject_repr(PySwigObject *v, PyObject *args) #endif { const char *name = SWIG_TypePrettyName(v->ty); PyObject *hex = PySwigObject_hex(v); PyObject *repr = PyString_FromFormat("", name, PyString_AsString(hex)); Py_DECREF(hex); if (v->next) { #ifdef METH_NOARGS PyObject *nrep = PySwigObject_repr((PySwigObject *)v->next); #else PyObject *nrep = PySwigObject_repr((PySwigObject *)v->next, args); #endif PyString_ConcatAndDel(&repr,nrep); } return repr; } SWIGRUNTIME int PySwigObject_print(PySwigObject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { #ifdef METH_NOARGS PyObject *repr = PySwigObject_repr(v); #else PyObject *repr = PySwigObject_repr(v, NULL); #endif if (repr) { fputs(PyString_AsString(repr), fp); Py_DECREF(repr); return 0; } else { return 1; } } SWIGRUNTIME PyObject * PySwigObject_str(PySwigObject *v) { char result[SWIG_BUFFER_SIZE]; return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ? PyString_FromString(result) : 0; } SWIGRUNTIME int PySwigObject_compare(PySwigObject *v, PySwigObject *w) { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : ((i > j) ? 1 : 0); } SWIGRUNTIME PyTypeObject* _PySwigObject_type(void); SWIGRUNTIME PyTypeObject* PySwigObject_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = _PySwigObject_type(); return type; } SWIGRUNTIMEINLINE int PySwigObject_Check(PyObject *op) { return ((op)->ob_type == PySwigObject_type()) || (strcmp((op)->ob_type->tp_name,"PySwigObject") == 0); } SWIGRUNTIME PyObject * PySwigObject_New(void *ptr, swig_type_info *ty, int own); SWIGRUNTIME void PySwigObject_dealloc(PyObject *v) { PySwigObject *sobj = (PySwigObject *) v; PyObject *next = sobj->next; if (sobj->own) { swig_type_info *ty = sobj->ty; PySwigClientData *data = ty ? (PySwigClientData *) ty->clientdata : 0; PyObject *destroy = data ? data->destroy : 0; if (destroy) { /* destroy is always a VARARGS method */ PyObject *res; if (data->delargs) { /* we need to create a temporal object to carry the destroy operation */ PyObject *tmp = PySwigObject_New(sobj->ptr, ty, 0); res = SWIG_Python_CallFunctor(destroy, tmp); Py_DECREF(tmp); } else { PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy); res = ((*meth)(mself, v)); } Py_XDECREF(res); } else { const char *name = SWIG_TypePrettyName(ty); #if !defined(SWIG_PYTHON_SILENT_MEMLEAK) printf("swig/python detected a memory leak of type '%s', no destructor found.\n", name); #endif } } Py_XDECREF(next); PyObject_DEL(v); } SWIGRUNTIME PyObject* PySwigObject_append(PyObject* v, PyObject* next) { PySwigObject *sobj = (PySwigObject *) v; #ifndef METH_O PyObject *tmp = 0; if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; next = tmp; #endif if (!PySwigObject_Check(next)) { return NULL; } sobj->next = next; Py_INCREF(next); return SWIG_Py_Void(); } SWIGRUNTIME PyObject* #ifdef METH_NOARGS PySwigObject_next(PyObject* v) #else PySwigObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { PySwigObject *sobj = (PySwigObject *) v; if (sobj->next) { Py_INCREF(sobj->next); return sobj->next; } else { return SWIG_Py_Void(); } } SWIGINTERN PyObject* #ifdef METH_NOARGS PySwigObject_disown(PyObject *v) #else PySwigObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { PySwigObject *sobj = (PySwigObject *)v; sobj->own = 0; return SWIG_Py_Void(); } SWIGINTERN PyObject* #ifdef METH_NOARGS PySwigObject_acquire(PyObject *v) #else PySwigObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { PySwigObject *sobj = (PySwigObject *)v; sobj->own = SWIG_POINTER_OWN; return SWIG_Py_Void(); } SWIGINTERN PyObject* PySwigObject_own(PyObject *v, PyObject *args) { PyObject *val = 0; #if (PY_VERSION_HEX < 0x02020000) if (!PyArg_ParseTuple(args,(char *)"|O:own",&val)) #else if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) #endif { return NULL; } else { PySwigObject *sobj = (PySwigObject *)v; PyObject *obj = PyBool_FromLong(sobj->own); if (val) { #ifdef METH_NOARGS if (PyObject_IsTrue(val)) { PySwigObject_acquire(v); } else { PySwigObject_disown(v); } #else if (PyObject_IsTrue(val)) { PySwigObject_acquire(v,args); } else { PySwigObject_disown(v,args); } #endif } return obj; } } #ifdef METH_O static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)PySwigObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)PySwigObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"}, {(char *)"own", (PyCFunction)PySwigObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)PySwigObject_append, METH_O, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)PySwigObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)PySwigObject_repr, METH_NOARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #else static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)PySwigObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)PySwigObject_acquire, METH_VARARGS, (char *)"aquires ownership of the pointer"}, {(char *)"own", (PyCFunction)PySwigObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)PySwigObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)PySwigObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)PySwigObject_repr, METH_VARARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #endif #if PY_VERSION_HEX < 0x02020000 SWIGINTERN PyObject * PySwigObject_getattr(PySwigObject *sobj,char *name) { return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name); } #endif SWIGRUNTIME PyTypeObject* _PySwigObject_type(void) { static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods PySwigObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ (binaryfunc)0, /*nb_divide*/ (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ (coercion)0, /*nb_coerce*/ (unaryfunc)PySwigObject_long, /*nb_int*/ (unaryfunc)PySwigObject_long, /*nb_long*/ (unaryfunc)0, /*nb_float*/ (unaryfunc)PySwigObject_oct, /*nb_oct*/ (unaryfunc)PySwigObject_hex, /*nb_hex*/ #if PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ #elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ #elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */ 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */ #endif }; static PyTypeObject pyswigobject_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ (char *)"PySwigObject", /* tp_name */ sizeof(PySwigObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)PySwigObject_dealloc, /* tp_dealloc */ (printfunc)PySwigObject_print, /* tp_print */ #if PY_VERSION_HEX < 0x02020000 (getattrfunc)PySwigObject_getattr, /* tp_getattr */ #else (getattrfunc)0, /* tp_getattr */ #endif (setattrfunc)0, /* tp_setattr */ (cmpfunc)PySwigObject_compare, /* tp_compare */ (reprfunc)PySwigObject_repr, /* tp_repr */ &PySwigObject_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ (reprfunc)PySwigObject_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigobject_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ swigobject_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; pyswigobject_type = tmp; pyswigobject_type.ob_type = &PyType_Type; type_init = 1; } return &pyswigobject_type; } SWIGRUNTIME PyObject * PySwigObject_New(void *ptr, swig_type_info *ty, int own) { PySwigObject *sobj = PyObject_NEW(PySwigObject, PySwigObject_type()); if (sobj) { sobj->ptr = ptr; sobj->ty = ty; sobj->own = own; sobj->next = 0; } return (PyObject *)sobj; } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; swig_type_info *ty; size_t size; } PySwigPacked; SWIGRUNTIME int PySwigPacked_print(PySwigPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { char result[SWIG_BUFFER_SIZE]; fputs("pack, v->size, 0, sizeof(result))) { fputs("at ", fp); fputs(result, fp); } fputs(v->ty->name,fp); fputs(">", fp); return 0; } SWIGRUNTIME PyObject * PySwigPacked_repr(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return PyString_FromFormat("", result, v->ty->name); } else { return PyString_FromFormat("", v->ty->name); } } SWIGRUNTIME PyObject * PySwigPacked_str(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return PyString_FromFormat("%s%s", result, v->ty->name); } else { return PyString_FromString(v->ty->name); } } SWIGRUNTIME int PySwigPacked_compare(PySwigPacked *v, PySwigPacked *w) { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : ((i > j) ? 1 : 0); return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); } SWIGRUNTIME PyTypeObject* _PySwigPacked_type(void); SWIGRUNTIME PyTypeObject* PySwigPacked_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = _PySwigPacked_type(); return type; } SWIGRUNTIMEINLINE int PySwigPacked_Check(PyObject *op) { return ((op)->ob_type == _PySwigPacked_type()) || (strcmp((op)->ob_type->tp_name,"PySwigPacked") == 0); } SWIGRUNTIME void PySwigPacked_dealloc(PyObject *v) { if (PySwigPacked_Check(v)) { PySwigPacked *sobj = (PySwigPacked *) v; free(sobj->pack); } PyObject_DEL(v); } SWIGRUNTIME PyTypeObject* _PySwigPacked_type(void) { static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; static PyTypeObject pyswigpacked_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ (char *)"PySwigPacked", /* tp_name */ sizeof(PySwigPacked), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)PySwigPacked_dealloc, /* tp_dealloc */ (printfunc)PySwigPacked_print, /* tp_print */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ (cmpfunc)PySwigPacked_compare, /* tp_compare */ (reprfunc)PySwigPacked_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ (reprfunc)PySwigPacked_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigpacked_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; pyswigpacked_type = tmp; pyswigpacked_type.ob_type = &PyType_Type; type_init = 1; } return &pyswigpacked_type; } SWIGRUNTIME PyObject * PySwigPacked_New(void *ptr, size_t size, swig_type_info *ty) { PySwigPacked *sobj = PyObject_NEW(PySwigPacked, PySwigPacked_type()); if (sobj) { void *pack = malloc(size); if (pack) { memcpy(pack, ptr, size); sobj->pack = pack; sobj->ty = ty; sobj->size = size; } else { PyObject_DEL((PyObject *) sobj); sobj = 0; } } return (PyObject *) sobj; } SWIGRUNTIME swig_type_info * PySwigPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { if (PySwigPacked_Check(obj)) { PySwigPacked *sobj = (PySwigPacked *)obj; if (sobj->size != size) return 0; memcpy(ptr, sobj->pack, size); return sobj->ty; } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIMEINLINE PyObject * _SWIG_This(void) { return PyString_FromString("this"); } SWIGRUNTIME PyObject * SWIG_This(void) { static PyObject *SWIG_STATIC_POINTER(swig_this) = _SWIG_This(); return swig_this; } /* #define SWIG_PYTHON_SLOW_GETSET_THIS */ SWIGRUNTIME PySwigObject * SWIG_Python_GetSwigThis(PyObject *pyobj) { if (PySwigObject_Check(pyobj)) { return (PySwigObject *) pyobj; } else { PyObject *obj = 0; #if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000)) if (PyInstance_Check(pyobj)) { obj = _PyInstance_Lookup(pyobj, SWIG_This()); } else { PyObject **dictptr = _PyObject_GetDictPtr(pyobj); if (dictptr != NULL) { PyObject *dict = *dictptr; obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; } else { #ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; } #endif obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } } } #else obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } #endif if (obj && !PySwigObject_Check(obj)) { /* a PyObject is called 'this', try to get the 'real this' PySwigObject from it */ return SWIG_Python_GetSwigThis(obj); } return (PySwigObject *)obj; } } /* Acquire a pointer value */ SWIGRUNTIME int SWIG_Python_AcquirePtr(PyObject *obj, int own) { if (own) { PySwigObject *sobj = SWIG_Python_GetSwigThis(obj); if (sobj) { int oldown = sobj->own; sobj->own = own; return oldown; } } return 0; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { if (!obj) return SWIG_ERROR; if (obj == Py_None) { if (ptr) *ptr = 0; return SWIG_OK; } else { PySwigObject *sobj = SWIG_Python_GetSwigThis(obj); while (sobj) { void *vptr = sobj->ptr; if (ty) { swig_type_info *to = sobj->ty; if (to == ty) { /* no type cast needed */ if (ptr) *ptr = vptr; break; } else { swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) { sobj = (PySwigObject *)sobj->next; } else { if (ptr) *ptr = SWIG_TypeCast(tc,vptr); break; } } } else { if (ptr) *ptr = vptr; break; } } if (sobj) { if (own) *own = sobj->own; if (flags & SWIG_POINTER_DISOWN) { sobj->own = 0; } return SWIG_OK; } else { int res = SWIG_ERROR; if (flags & SWIG_POINTER_IMPLICIT_CONV) { PySwigClientData *data = ty ? (PySwigClientData *) ty->clientdata : 0; if (data && !data->implicitconv) { PyObject *klass = data->klass; if (klass) { PyObject *impconv; data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ impconv = SWIG_Python_CallFunctor(klass, obj); data->implicitconv = 0; if (PyErr_Occurred()) { PyErr_Clear(); impconv = 0; } if (impconv) { PySwigObject *iobj = SWIG_Python_GetSwigThis(impconv); if (iobj) { void *vptr; res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); if (SWIG_IsOK(res)) { if (ptr) { *ptr = vptr; /* transfer the ownership to 'ptr' */ iobj->own = 0; res = SWIG_AddCast(res); res = SWIG_AddNewMask(res); } else { res = SWIG_AddCast(res); } } } Py_DECREF(impconv); } } } } return res; } } } /* Convert a function ptr value */ SWIGRUNTIME int SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { if (!PyCFunction_Check(obj)) { return SWIG_ConvertPtr(obj, ptr, ty, 0); } else { void *vptr = 0; /* here we get the method pointer for callbacks */ const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; if (desc) { desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; if (!desc) return SWIG_ERROR; } if (ty) { swig_cast_info *tc = SWIG_TypeCheck(desc,ty); if (!tc) return SWIG_ERROR; *ptr = SWIG_TypeCast(tc,vptr); } else { *ptr = vptr; } return SWIG_OK; } } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = PySwigPacked_UnpackData(obj, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } /* ----------------------------------------------------------------------------- * Create a new pointer object * ----------------------------------------------------------------------------- */ /* Create a new instance object, whitout calling __init__, and set the 'this' attribute. */ SWIGRUNTIME PyObject* SWIG_Python_NewShadowInstance(PySwigClientData *data, PyObject *swig_this) { #if (PY_VERSION_HEX >= 0x02020000) PyObject *inst = 0; PyObject *newraw = data->newraw; if (newraw) { inst = PyObject_Call(newraw, data->newargs, NULL); if (inst) { #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { PyObject *dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; PyDict_SetItem(dict, SWIG_This(), swig_this); } } #else PyObject *key = SWIG_This(); PyObject_SetAttr(inst, key, swig_this); #endif } } else { PyObject *dict = PyDict_New(); PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } return inst; #else #if (PY_VERSION_HEX >= 0x02010000) PyObject *inst; PyObject *dict = PyDict_New(); PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); return (PyObject *) inst; #else PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); if (inst == NULL) { return NULL; } inst->in_class = (PyClassObject *)data->newargs; Py_INCREF(inst->in_class); inst->in_dict = PyDict_New(); if (inst->in_dict == NULL) { Py_DECREF(inst); return NULL; } #ifdef Py_TPFLAGS_HAVE_WEAKREFS inst->in_weakreflist = NULL; #endif #ifdef Py_TPFLAGS_GC PyObject_GC_Init(inst); #endif PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this); return (PyObject *) inst; #endif #endif } SWIGRUNTIME void SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) { PyObject *dict; #if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; } PyDict_SetItem(dict, SWIG_This(), swig_this); return; } #endif dict = PyObject_GetAttrString(inst, (char*)"__dict__"); PyDict_SetItem(dict, SWIG_This(), swig_this); Py_DECREF(dict); } SWIGINTERN PyObject * SWIG_Python_InitShadowInstance(PyObject *args) { PyObject *obj[2]; if (!SWIG_Python_UnpackTuple(args,(char*)"swiginit", 2, 2, obj)) { return NULL; } else { PySwigObject *sthis = SWIG_Python_GetSwigThis(obj[0]); if (sthis) { PySwigObject_append((PyObject*) sthis, obj[1]); } else { SWIG_Python_SetSwigThis(obj[0], obj[1]); } return SWIG_Py_Void(); } } /* Create a new pointer object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int flags) { if (!ptr) { return SWIG_Py_Void(); } else { int own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; PyObject *robj = PySwigObject_New(ptr, type, own); PySwigClientData *clientdata = type ? (PySwigClientData *)(type->clientdata) : 0; if (clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); if (inst) { Py_DECREF(robj); robj = inst; } } return robj; } } /* Create a new packed object */ SWIGRUNTIMEINLINE PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return ptr ? PySwigPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_module_info * SWIG_Python_GetModule(void) { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } #endif } return (swig_module_info *) type_pointer; } #if PY_MAJOR_VERSION < 2 /* PyModule_AddObject function was introduced in Python 2.0. The following function is copied out of Python/modsupport.c in python version 2.3.4 */ SWIGINTERN int PyModule_AddObject(PyObject *m, char *name, PyObject *o) { PyObject *dict; if (!PyModule_Check(m)) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); return SWIG_ERROR; } if (!o) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); return SWIG_ERROR; } dict = PyModule_GetDict(m); if (dict == NULL) { /* Internal error -- modules must have a dict! */ PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", PyModule_GetName(m)); return SWIG_ERROR; } if (PyDict_SetItemString(dict, name, o)) return SWIG_ERROR; Py_DECREF(o); return SWIG_OK; } #endif SWIGRUNTIME void SWIG_Python_DestroyModule(void *vptr) { swig_module_info *swig_module = (swig_module_info *) vptr; swig_type_info **types = swig_module->types; size_t i; for (i =0; i < swig_module->size; ++i) { swig_type_info *ty = types[i]; if (ty->owndata) { PySwigClientData *data = (PySwigClientData *) ty->clientdata; if (data) PySwigClientData_Del(data); } } Py_DECREF(SWIG_This()); } SWIGRUNTIME void SWIG_Python_SetModule(swig_module_info *swig_module) { static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} };/* Sentinel */ PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } } /* The python cached type query */ SWIGRUNTIME PyObject * SWIG_Python_TypeCache(void) { static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); return cache; } SWIGRUNTIME swig_type_info * SWIG_Python_TypeQuery(const char *type) { PyObject *cache = SWIG_Python_TypeCache(); PyObject *key = PyString_FromString(type); PyObject *obj = PyDict_GetItem(cache, key); swig_type_info *descriptor; if (obj) { descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj); } else { swig_module_info *swig_module = SWIG_Python_GetModule(); descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); if (descriptor) { obj = PyCObject_FromVoidPtr(descriptor, NULL); PyDict_SetItem(cache, key, obj); Py_DECREF(obj); } } Py_DECREF(key); return descriptor; } /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, PyString_AsString(old_str)); } else { PyErr_Format(type, "%s %s", PyString_AsString(old_str), mesg); } Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } SWIGRUNTIMEINLINE const char * PySwigObject_GetDesc(PyObject *self) { PySwigObject *v = (PySwigObject *)self; swig_type_info *ty = v ? v->ty : 0; return ty ? ty->str : (char*)""; } SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (obj && PySwigObject_Check(obj)) { const char *otype = (const char *) PySwigObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'PySwigObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? PyString_AsString(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_XDECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); if (flags & SWIG_POINTER_EXCEPTION) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } } return result; } #ifdef __cplusplus #if 0 { /* cc-mode */ #endif } #endif #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) #define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_FILE swig_types[0] #define SWIGTYPE_p_MAC swig_types[1] #define SWIGTYPE_p_Mote swig_types[2] #define SWIGTYPE_p_Packet swig_types[3] #define SWIGTYPE_p_Radio swig_types[4] #define SWIGTYPE_p_Tossim swig_types[5] #define SWIGTYPE_p_Variable swig_types[6] #define SWIGTYPE_p_char swig_types[7] #define SWIGTYPE_p_int swig_types[8] #define SWIGTYPE_p_nesc_app swig_types[9] #define SWIGTYPE_p_p_char swig_types[10] #define SWIGTYPE_p_var_string swig_types[11] static swig_type_info *swig_types[13]; static swig_module_info swig_module = {swig_types, 12, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) /* -------- TYPES TABLE (END) -------- */ #if (PY_VERSION_HEX <= 0x02000000) # if !defined(SWIG_PYTHON_CLASSIC) # error "This python version requires swig to be run with the '-classic' option" # endif #endif /*----------------------------------------------- @(target):= _TOSSIM.so ------------------------------------------------*/ #define SWIG_init init_TOSSIM #define SWIG_name "_TOSSIM" #define SWIGVERSION 0x010333 #define SWIG_VERSION SWIGVERSION #define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) #define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) #include namespace swig { class PyObject_ptr { protected: PyObject *_obj; public: PyObject_ptr() :_obj(0) { } PyObject_ptr(const PyObject_ptr& item) : _obj(item._obj) { Py_XINCREF(_obj); } PyObject_ptr(PyObject *obj, bool initial_ref = true) :_obj(obj) { if (initial_ref) Py_XINCREF(_obj); } PyObject_ptr & operator=(const PyObject_ptr& item) { Py_XINCREF(item._obj); Py_XDECREF(_obj); _obj = item._obj; return *this; } ~PyObject_ptr() { Py_XDECREF(_obj); } operator PyObject *() const { return _obj; } PyObject *operator->() const { return _obj; } }; } namespace swig { struct PyObject_var : PyObject_ptr { PyObject_var(PyObject* obj = 0) : PyObject_ptr(obj, false) { } PyObject_var & operator = (PyObject* obj) { Py_XDECREF(_obj); _obj = obj; return *this; } }; } #include #include enum { PRIMITIVE_INTEGER = 0, PRIMITIVE_FLOAT = 1, PRIMITIVE_UNKNOWN = 2 }; int lengthOfType(char* type) { if (strcmp(type, "uint8_t") == 0) { return sizeof(uint8_t); } else if (strcmp(type, "uint16_t") == 0) { return sizeof(uint16_t); } else if (strcmp(type, "uint32_t") == 0) { return sizeof(uint32_t); } else if (strcmp(type, "int8_t") == 0) { return sizeof(int8_t); } else if (strcmp(type, "int16_t") == 0) { return sizeof(int16_t); } else if (strcmp(type, "int32_t") == 0) { return sizeof(int32_t); } else if (strcmp(type, "char") == 0) { return sizeof(char); } else if (strcmp(type, "short") == 0) { return sizeof(short); } else if (strcmp(type, "int") == 0) { return sizeof(int); } else if (strcmp(type, "long") == 0) { return sizeof(long); } else if (strcmp(type, "unsigned char") == 0) { return sizeof(unsigned char); } else if (strcmp(type, "unsigned short") == 0) { return sizeof(unsigned short); } else if (strcmp(type, "unsigned int") == 0) { return sizeof(unsigned int); } else if (strcmp(type, "unsigned long") == 0) { return sizeof(unsigned long); } else if (strcmp(type, "float") == 0) { return sizeof(float); } else if (strcmp(type, "double") == 0) { return sizeof(double); } else { return 1; } } int memoryToPrimitive(char* type, char* ptr, long* lval, double* dval) { if (strcmp(type, "uint8_t") == 0) { uint8_t val; memcpy(&val, ptr, sizeof(uint8_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "uint16_t") == 0) { uint16_t val; memcpy(&val, ptr, sizeof(uint16_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "uint32_t") == 0) { uint32_t val; memcpy(&val, ptr, sizeof(uint32_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int8_t") == 0) { int8_t val; memcpy(&val, ptr, sizeof(int8_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int16_t") == 0) { int16_t val; memcpy(&val, ptr, sizeof(int16_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int32_t") == 0) { int32_t val; memcpy(&val, ptr, sizeof(int32_t)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "char") == 0) { long val; memcpy(&val, ptr, sizeof(char)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "short") == 0) { short val; memcpy(&val, ptr, sizeof(short)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "int") == 0) { int val; memcpy(&val, ptr, sizeof(int)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "long") == 0) { long val; memcpy(&val, ptr, sizeof(long)); *lval = val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned char") == 0) { unsigned char val; memcpy(&val, ptr, sizeof(unsigned char)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned short") == 0) { unsigned short val; memcpy(&val, ptr, sizeof(unsigned short)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned int") == 0) { unsigned int val; memcpy(&val, ptr, sizeof(unsigned int)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "unsigned long") == 0) { unsigned long val; memcpy(&val, ptr, sizeof(unsigned long)); *lval = (long)val; return PRIMITIVE_INTEGER; } else if (strcmp(type, "float") == 0) { float val; memcpy(&val, ptr, sizeof(float)); *dval = (double)val; return PRIMITIVE_FLOAT; } else if (strcmp(type, "double") == 0) { double val; memcpy(&val, ptr, sizeof(double)); *dval = val; return PRIMITIVE_FLOAT; } else { return PRIMITIVE_UNKNOWN; } } PyObject* valueFromScalar(char* type, char* ptr, int len) { long lval; double dval; int rval = memoryToPrimitive(type, ptr, &lval, &dval); switch(rval) { case PRIMITIVE_INTEGER: return PyInt_FromLong(lval); case PRIMITIVE_FLOAT: return PyFloat_FromDouble(dval); case PRIMITIVE_UNKNOWN: default: return PyString_FromStringAndSize(ptr, len); } } PyObject* listFromArray(char* type, char* ptr, int len) { long lval; double dval; int elementLen = lengthOfType(type); PyObject* list = PyList_New(0); //printf("Generating list of %s\n", type); for (char* tmpPtr = ptr; tmpPtr < ptr + len; tmpPtr += elementLen) { PyList_Append(list, valueFromScalar(type, tmpPtr, elementLen)); } return list; } #include #define SWIG_From_long PyInt_FromLong SWIGINTERNINLINE PyObject * SWIG_From_int (int value) { return SWIG_From_long (value); } #include #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX - 1LL) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) # endif #endif SWIGINTERN int SWIG_AsVal_double (PyObject *obj, double *val) { int res = SWIG_TypeError; if (PyFloat_Check(obj)) { if (val) *val = PyFloat_AsDouble(obj); return SWIG_OK; } else if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else if (PyLong_Check(obj)) { double v = PyLong_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; double d = PyFloat_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = d; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); } else { PyErr_Clear(); } } } #endif return res; } #include #include SWIGINTERNINLINE int SWIG_CanCastAsInteger(double *d, double min, double max) { double x = *d; if ((min <= x && x <= max)) { double fx = floor(x); double cx = ceil(x); double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ if ((errno == EDOM) || (errno == ERANGE)) { errno = 0; } else { double summ, reps, diff; if (rd < x) { diff = x - rd; } else if (rd > x) { diff = rd - x; } else { return 1; } summ = rd + x; reps = diff/summ; if (reps < 8*DBL_EPSILON) { *d = rd; return 1; } } } return 0; } SWIGINTERN int SWIG_AsVal_long (PyObject *obj, long* val) { if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else if (PyLong_Check(obj)) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; long v = PyInt_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } #endif return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_int (PyObject * obj, int *val) { long v; int res = SWIG_AsVal_long (obj, &v); if (SWIG_IsOK(res)) { if ((v < INT_MIN || v > INT_MAX)) { return SWIG_OverflowError; } else { if (val) *val = static_cast< int >(v); } } return res; } #include #define SWIG_From_double PyFloat_FromDouble SWIGINTERNINLINE PyObject* SWIG_From_bool (bool value) { return PyBool_FromLong(value ? 1 : 0); } #include SWIGINTERN swig_type_info* SWIG_pchar_descriptor(void) { static int init = 0; static swig_type_info* info = 0; if (!init) { info = SWIG_TypeQuery("_p_char"); init = 1; } return info; } SWIGINTERNINLINE PyObject * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); return pchar_descriptor ? SWIG_NewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void(); } else { return PyString_FromStringAndSize(carray, static_cast< int >(size)); } } else { return SWIG_Py_Void(); } } SWIGINTERNINLINE PyObject * SWIG_FromCharPtr(const char *cptr) { return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); } SWIGINTERN int SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) { if (PyString_Check(obj)) { char *cstr; Py_ssize_t len; PyString_AsStringAndSize(obj, &cstr, &len); if (cptr) { if (alloc) { /* In python the user should not be able to modify the inner string representation. To warranty that, if you define SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string buffer is always returned. The default behavior is just to return the pointer value, so, be careful. */ #if defined(SWIG_PYTHON_SAFE_CSTRINGS) if (*alloc != SWIG_OLDOBJ) #else if (*alloc == SWIG_NEWOBJ) #endif { *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1))); *alloc = SWIG_NEWOBJ; } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } else { *cptr = PyString_AsString(obj); } } if (psize) *psize = len + 1; return SWIG_OK; } else { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_long_SS_long (PyObject *obj, long long *val) { int res = SWIG_TypeError; if (PyLong_Check(obj)) { long long v = PyLong_AsLongLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } else { long v; res = SWIG_AsVal_long (obj,&v); if (SWIG_IsOK(res)) { if (val) *val = v; return res; } } #ifdef SWIG_PYTHON_CAST_MODE { const double mant_max = 1LL << DBL_MANT_DIG; const double mant_min = -mant_max; double d; res = SWIG_AsVal_double (obj,&d); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) { if (val) *val = (long long)(d); return SWIG_AddCast(res); } res = SWIG_TypeError; } #endif return res; } SWIGINTERNINLINE PyObject* SWIG_From_unsigned_SS_long (unsigned long value) { return (value > LONG_MAX) ? PyLong_FromUnsignedLong(value) : PyInt_FromLong(static_cast< long >(value)); } SWIGINTERNINLINE PyObject* SWIG_From_long_SS_long (long long value) { return ((value < LONG_MIN) || (value > LONG_MAX)) ? PyLong_FromLongLong(value) : PyInt_FromLong(static_cast< long >(value)); } SWIGINTERN int SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) { if (PyInt_Check(obj)) { long v = PyInt_AsLong(obj); if (v >= 0) { if (val) *val = v; return SWIG_OK; } else { return SWIG_OverflowError; } } else if (PyLong_Check(obj)) { unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { if (val) *val = (unsigned long)(d); return res; } } } #endif return SWIG_TypeError; } #ifdef __cplusplus extern "C" { #endif SWIGINTERN PyObject *_wrap_new_MAC(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_MAC")) SWIG_fail; result = (MAC *)new MAC(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MAC, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_MAC(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_MAC",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MAC" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_initHigh(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_initHigh",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_initHigh" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->initHigh(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_initLow(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_initLow",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_initLow" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->initLow(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_high(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_high",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_high" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->high(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_low(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_low",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_low" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->low(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_symbolsPerSec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_symbolsPerSec",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_symbolsPerSec" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->symbolsPerSec(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_bitsPerSymbol(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_bitsPerSymbol",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_bitsPerSymbol" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->bitsPerSymbol(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_preambleLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_preambleLength",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_preambleLength" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->preambleLength(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_exponentBase(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_exponentBase",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_exponentBase" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->exponentBase(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_maxIterations(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_maxIterations",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_maxIterations" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->maxIterations(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_minFreeSamples(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_minFreeSamples",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_minFreeSamples" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->minFreeSamples(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_rxtxDelay(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_rxtxDelay",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_rxtxDelay" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->rxtxDelay(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_ackTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:MAC_ackTime",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_ackTime" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); result = (int)(arg1)->ackTime(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setInitHigh(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setInitHigh",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setInitHigh" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setInitHigh" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setInitHigh(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setInitLow(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setInitLow",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setInitLow" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setInitLow" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setInitLow(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setHigh(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setHigh",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setHigh" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setHigh" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setHigh(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setLow(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setLow",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setLow" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setLow" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setLow(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setSymbolsPerSec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setSymbolsPerSec",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setSymbolsPerSec" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setSymbolsPerSec" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setSymbolsPerSec(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setBitsBerSymbol(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setBitsBerSymbol",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setBitsBerSymbol" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setBitsBerSymbol" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setBitsBerSymbol(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setPreambleLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setPreambleLength",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setPreambleLength" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setPreambleLength" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setPreambleLength(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setExponentBase(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setExponentBase",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setExponentBase" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setExponentBase" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setExponentBase(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setMaxIterations(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setMaxIterations",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setMaxIterations" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setMaxIterations" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setMaxIterations(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setMinFreeSamples(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setMinFreeSamples",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setMinFreeSamples" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setMinFreeSamples" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setMinFreeSamples(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setRxtxDelay(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setRxtxDelay",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setRxtxDelay" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setRxtxDelay" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setRxtxDelay(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_MAC_setAckTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MAC *arg1 = (MAC *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:MAC_setAckTime",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MAC, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MAC_setAckTime" "', argument " "1"" of type '" "MAC *""'"); } arg1 = reinterpret_cast< MAC * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MAC_setAckTime" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setAckTime(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *MAC_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_MAC, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_new_Radio(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_Radio")) SWIG_fail; result = (Radio *)new Radio(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Radio, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_Radio(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_Radio",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Radio" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Radio_add(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; int arg2 ; int arg3 ; double arg4 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:Radio_add",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Radio_add" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Radio_add" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Radio_add" "', argument " "3"" of type '" "int""'"); } arg3 = static_cast< int >(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Radio_add" "', argument " "4"" of type '" "double""'"); } arg4 = static_cast< double >(val4); (arg1)->add(arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Radio_gain(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; int arg2 ; int arg3 ; double result; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:Radio_gain",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Radio_gain" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Radio_gain" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Radio_gain" "', argument " "3"" of type '" "int""'"); } arg3 = static_cast< int >(val3); result = (double)(arg1)->gain(arg2,arg3); resultobj = SWIG_From_double(static_cast< double >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Radio_connected(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; int arg2 ; int arg3 ; bool result; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:Radio_connected",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Radio_connected" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Radio_connected" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Radio_connected" "', argument " "3"" of type '" "int""'"); } arg3 = static_cast< int >(val3); result = (bool)(arg1)->connected(arg2,arg3); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Radio_remove(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; int arg2 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:Radio_remove",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Radio_remove" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Radio_remove" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Radio_remove" "', argument " "3"" of type '" "int""'"); } arg3 = static_cast< int >(val3); (arg1)->remove(arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Radio_setNoise(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; int arg2 ; double arg3 ; double arg4 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:Radio_setNoise",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Radio_setNoise" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Radio_setNoise" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Radio_setNoise" "', argument " "3"" of type '" "double""'"); } arg3 = static_cast< double >(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Radio_setNoise" "', argument " "4"" of type '" "double""'"); } arg4 = static_cast< double >(val4); (arg1)->setNoise(arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Radio_setSensitivity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Radio *arg1 = (Radio *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Radio_setSensitivity",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Radio, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Radio_setSensitivity" "', argument " "1"" of type '" "Radio *""'"); } arg1 = reinterpret_cast< Radio * >(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Radio_setSensitivity" "', argument " "2"" of type '" "double""'"); } arg2 = static_cast< double >(val2); (arg1)->setSensitivity(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *Radio_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_Radio, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_new_Packet(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_Packet")) SWIG_fail; result = (Packet *)new Packet(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Packet, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_Packet(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_Packet",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Packet" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_setSource(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_setSource",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_setSource" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_setSource" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setSource(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_source(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Packet_source",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_source" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); result = (int)(arg1)->source(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_setDestination(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_setDestination",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_setDestination" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_setDestination" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setDestination(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_destination(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Packet_destination",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_destination" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); result = (int)(arg1)->destination(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_setLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_setLength",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_setLength" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_setLength" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setLength(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_length(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Packet_length",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_length" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); result = (int)(arg1)->length(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_setType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_setType",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_setType" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_setType" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setType(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_type(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Packet_type",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_type" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); result = (int)(arg1)->type(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_data(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; char *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Packet_data",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_data" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); result = (char *)(arg1)->data(); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_setData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; size_t size2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_setData",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_setData" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, &size2, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Packet_setData" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); arg3 = static_cast< int >(size2 - 1); (arg1)->setData(arg2,arg3); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_Packet_maxLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Packet_maxLength",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_maxLength" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); result = (int)(arg1)->maxLength(); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_setStrength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_setStrength",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_setStrength" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_setStrength" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->setStrength(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_deliver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; long long arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; long long val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:Packet_deliver",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_deliver" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_deliver" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_long_SS_long(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Packet_deliver" "', argument " "3"" of type '" "long long""'"); } arg3 = static_cast< long long >(val3); (arg1)->deliver(arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Packet_deliverNow(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Packet *arg1 = (Packet *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Packet_deliverNow",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Packet, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Packet_deliverNow" "', argument " "1"" of type '" "Packet *""'"); } arg1 = reinterpret_cast< Packet * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Packet_deliverNow" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->deliverNow(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *Packet_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_Packet, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_variable_string_t_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:variable_string_t_type_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_type_set" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "variable_string_t_type_set" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); if (arg1->type) delete[] arg1->type; if (arg2) { size_t size = strlen(reinterpret_cast< const char * >(arg2)) + 1; arg1->type = (char *)reinterpret_cast< char* >(memcpy((new char[size]), reinterpret_cast< const char * >(arg2), sizeof(char)*(size))); } else { arg1->type = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; char *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:variable_string_t_type_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_type_get" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); result = (char *) ((arg1)->type); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_ptr_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:variable_string_t_ptr_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_ptr_set" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "variable_string_t_ptr_set" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); if (arg1->ptr) delete[] arg1->ptr; if (arg2) { size_t size = strlen(reinterpret_cast< const char * >(arg2)) + 1; arg1->ptr = (char *)reinterpret_cast< char* >(memcpy((new char[size]), reinterpret_cast< const char * >(arg2), sizeof(char)*(size))); } else { arg1->ptr = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_ptr_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; char *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:variable_string_t_ptr_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_ptr_get" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); result = (char *) ((arg1)->ptr); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_len_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:variable_string_t_len_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_len_set" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "variable_string_t_len_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->len = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_len_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:variable_string_t_len_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_len_get" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); result = (int) ((arg1)->len); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_isArray_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:variable_string_t_isArray_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_isArray_set" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "variable_string_t_isArray_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->isArray = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_variable_string_t_isArray_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; int result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:variable_string_t_isArray_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "variable_string_t_isArray_get" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); result = (int) ((arg1)->isArray); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_variable_string_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_variable_string_t")) SWIG_fail; result = (variable_string_t *)new variable_string_t(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_var_string, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_variable_string_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; variable_string_t *arg1 = (variable_string_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_variable_string_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_var_string, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_variable_string_t" "', argument " "1"" of type '" "variable_string_t *""'"); } arg1 = reinterpret_cast< variable_string_t * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *variable_string_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_var_string, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_nesc_app_t_numVariables_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; int arg2 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:nesc_app_t_numVariables_set",&obj0,&obj1)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = (char*)""; app->variableTypes[i] = (char*)""; } } arg1 = app; } } ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "nesc_app_t_numVariables_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->numVariables = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_numVariables_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; int result; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:nesc_app_t_numVariables_get",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = (char*)""; app->variableTypes[i] = (char*)""; } } arg1 = app; } } result = (int) ((arg1)->numVariables); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_variableNames_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; char **arg2 = (char **) 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:nesc_app_t_variableNames_set",&obj0,&obj1)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = (char*)""; app->variableTypes[i] = (char*)""; } } arg1 = app; } } res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_p_char, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "nesc_app_t_variableNames_set" "', argument " "2"" of type '" "char **""'"); } arg2 = reinterpret_cast< char ** >(argp2); if (arg1) (arg1)->variableNames = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_variableNames_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; char **result = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:nesc_app_t_variableNames_get",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = (char*)""; app->variableTypes[i] = (char*)""; } } arg1 = app; } } result = (char **) ((arg1)->variableNames); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_p_char, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_variableTypes_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; char **arg2 = (char **) 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:nesc_app_t_variableTypes_set",&obj0,&obj1)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = (char*)""; app->variableTypes[i] = (char*)""; } } arg1 = app; } } res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_p_char, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "nesc_app_t_variableTypes_set" "', argument " "2"" of type '" "char **""'"); } arg2 = reinterpret_cast< char ** >(argp2); if (arg1) (arg1)->variableTypes = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_variableTypes_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; char **result = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:nesc_app_t_variableTypes_get",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = (char*)""; app->variableTypes[i] = (char*)""; } } arg1 = app; } } result = (char **) ((arg1)->variableTypes); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_p_char, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_variableArray_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; int *arg2 = (int *) 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:nesc_app_t_variableArray_set",&obj0,&obj1)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = (char*)""; app->variableTypes[i] = (char*)""; } } arg1 = app; } } res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "nesc_app_t_variableArray_set" "', argument " "2"" of type '" "int *""'"); } arg2 = reinterpret_cast< int * >(argp2); if (arg1) (arg1)->variableArray = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nesc_app_t_variableArray_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; int *result = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:nesc_app_t_variableArray_get",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = (char*)""; app->variableTypes[i] = (char*)""; } } arg1 = app; } } result = (int *) ((arg1)->variableArray); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_int, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_nesc_app_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_nesc_app_t")) SWIG_fail; result = (nesc_app_t *)new nesc_app_t(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_nesc_app, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_nesc_app_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_nesc_app_t",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = (char*)""; app->variableTypes[i] = (char*)""; } } arg1 = app; } } delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *nesc_app_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_nesc_app, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_new_Variable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; int arg4 ; Variable *result = 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:new_Variable",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Variable" "', argument " "1"" of type '" "char *""'"); } arg1 = reinterpret_cast< char * >(buf1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Variable" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_Variable" "', argument " "3"" of type '" "int""'"); } arg3 = static_cast< int >(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_Variable" "', argument " "4"" of type '" "int""'"); } arg4 = static_cast< int >(val4); result = (Variable *)new Variable(arg1,arg2,arg3,arg4); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Variable, SWIG_POINTER_NEW | 0 ); if (alloc1 == SWIG_NEWOBJ) delete[] buf1; if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) delete[] buf1; if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_delete_Variable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Variable *arg1 = (Variable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_Variable",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Variable, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Variable" "', argument " "1"" of type '" "Variable *""'"); } arg1 = reinterpret_cast< Variable * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Variable_getData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Variable *arg1 = (Variable *) 0 ; variable_string_t result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Variable_getData",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Variable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Variable_getData" "', argument " "1"" of type '" "Variable *""'"); } arg1 = reinterpret_cast< Variable * >(argp1); result = (arg1)->getData(); { if ((&result)->isArray) { //printf("Generating array %s\n", (&result)->type); resultobj = listFromArray ((&result)->type, (&result)->ptr, (&result)->len); } else { //printf("Generating scalar %s\n", (&result)->type); resultobj = valueFromScalar((&result)->type, (&result)->ptr, (&result)->len); } if (resultobj == NULL) { PyErr_SetString(PyExc_RuntimeError, "Error generating Python type from TinyOS variable."); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *Variable_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_Variable, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_new_Mote(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; Mote *result = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:new_Mote",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = (char*)""; app->variableTypes[i] = (char*)""; } } arg1 = app; } } result = (Mote *)new Mote(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Mote, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_Mote(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_Mote",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Mote" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_id(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; unsigned long result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_id",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_id" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); result = (unsigned long)(arg1)->id(); resultobj = SWIG_From_unsigned_SS_long(static_cast< unsigned long >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_euid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; long long result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_euid",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_euid" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); result = (long long)(arg1)->euid(); resultobj = SWIG_From_long_SS_long(static_cast< long long >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_setEuid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; long long arg2 ; void *argp1 = 0 ; int res1 = 0 ; long long val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Mote_setEuid",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_setEuid" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); ecode2 = SWIG_AsVal_long_SS_long(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Mote_setEuid" "', argument " "2"" of type '" "long long""'"); } arg2 = static_cast< long long >(val2); (arg1)->setEuid(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_bootTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; long long result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_bootTime",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_bootTime" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); result = (long long)(arg1)->bootTime(); resultobj = SWIG_From_long_SS_long(static_cast< long long >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_bootAtTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; long long arg2 ; void *argp1 = 0 ; int res1 = 0 ; long long val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Mote_bootAtTime",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_bootAtTime" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); ecode2 = SWIG_AsVal_long_SS_long(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Mote_bootAtTime" "', argument " "2"" of type '" "long long""'"); } arg2 = static_cast< long long >(val2); (arg1)->bootAtTime(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_isOn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; bool result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_isOn",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_isOn" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); result = (bool)(arg1)->isOn(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_turnOff(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_turnOff",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_turnOff" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); (arg1)->turnOff(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_turnOn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_turnOn",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_turnOn" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); (arg1)->turnOn(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_getVariable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; char *arg2 = (char *) 0 ; Variable *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Mote_getVariable",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_getVariable" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Mote_getVariable" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); result = (Variable *)(arg1)->getVariable(arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Variable, 0 | 0 ); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_Mote_addNoiseTraceReading(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Mote_addNoiseTraceReading",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_addNoiseTraceReading" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Mote_addNoiseTraceReading" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->addNoiseTraceReading(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_createNoiseModel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Mote_createNoiseModel",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_createNoiseModel" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); (arg1)->createNoiseModel(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Mote_generateNoise(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Mote *arg1 = (Mote *) 0 ; int arg2 ; int result; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Mote_generateNoise",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Mote, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Mote_generateNoise" "', argument " "1"" of type '" "Mote *""'"); } arg1 = reinterpret_cast< Mote * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Mote_generateNoise" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); result = (int)(arg1)->generateNoise(arg2); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *Mote_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_Mote, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_new_Tossim(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; nesc_app_t *arg1 = (nesc_app_t *) 0 ; Tossim *result = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:new_Tossim",&obj0)) SWIG_fail; { if (!PyList_Check(obj0)) { PyErr_SetString(PyExc_TypeError, "Requires a list as a parameter."); return NULL; } else { int size = PyList_Size(obj0); int i = 0; nesc_app_t* app; if (size % 3 != 0) { PyErr_SetString(PyExc_RuntimeError, "List must have 2*N elements."); return NULL; } app = (nesc_app_t*)malloc(sizeof(nesc_app_t)); app->numVariables = size / 3; app->variableNames = (char**)malloc(sizeof(char*) * app->numVariables); app->variableTypes = (char**)malloc(sizeof(char*) * app->numVariables); app->variableArray = (int*)malloc(sizeof(int) * app->numVariables); memset(app->variableNames, 0, sizeof(char*) * app->numVariables); memset(app->variableTypes, 0, sizeof(char*) * app->numVariables); memset(app->variableArray, 0, sizeof(int) * app->numVariables); for (i = 0; i < app->numVariables; i++) { PyObject* name = PyList_GetItem(obj0, 3 * i); PyObject* array = PyList_GetItem(obj0, (3 * i) + 1); PyObject* format = PyList_GetItem(obj0, (3 * i) + 2); if (PyString_Check(name) && PyString_Check(format)) { app->variableNames[i] = PyString_AsString(name); app->variableTypes[i] = PyString_AsString(format); if (strcmp(PyString_AsString(array), "array") == 0) { app->variableArray[i] = 1; //printf("%s is an array\n", PyString_AsString(name)); } else { app->variableArray[i] = 0; //printf("%s is a scalar\n", PyString_AsString(name)); } } else { app->variableNames[i] = (char*)""; app->variableTypes[i] = (char*)""; } } arg1 = app; } } result = (Tossim *)new Tossim(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Tossim, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_Tossim(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_Tossim",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Tossim" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_init",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_init" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); (arg1)->init(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_time(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; long long result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_time",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_time" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (long long)(arg1)->time(); resultobj = SWIG_From_long_SS_long(static_cast< long long >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_ticksPerSecond(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; long long result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_ticksPerSecond",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_ticksPerSecond" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (long long)(arg1)->ticksPerSecond(); resultobj = SWIG_From_long_SS_long(static_cast< long long >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_setTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; long long arg2 ; void *argp1 = 0 ; int res1 = 0 ; long long val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Tossim_setTime",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_setTime" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); ecode2 = SWIG_AsVal_long_SS_long(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Tossim_setTime" "', argument " "2"" of type '" "long long""'"); } arg2 = static_cast< long long >(val2); (arg1)->setTime(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_timeStr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; char *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_timeStr",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_timeStr" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (char *)(arg1)->timeStr(); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_currentNode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; Mote *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_currentNode",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_currentNode" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (Mote *)(arg1)->currentNode(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Mote, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_getNode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; unsigned long arg2 ; Mote *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; unsigned long val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Tossim_getNode",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_getNode" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); ecode2 = SWIG_AsVal_unsigned_SS_long(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Tossim_getNode" "', argument " "2"" of type '" "unsigned long""'"); } arg2 = static_cast< unsigned long >(val2); result = (Mote *)(arg1)->getNode(arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Mote, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_setCurrentNode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; unsigned long arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned long val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Tossim_setCurrentNode",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_setCurrentNode" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); ecode2 = SWIG_AsVal_unsigned_SS_long(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Tossim_setCurrentNode" "', argument " "2"" of type '" "unsigned long""'"); } arg2 = static_cast< unsigned long >(val2); (arg1)->setCurrentNode(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_addChannel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; char *arg2 = (char *) 0 ; FILE *arg3 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:Tossim_addChannel",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_addChannel" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Tossim_addChannel" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); { if (!PyFile_Check(obj2)) { PyErr_SetString(PyExc_TypeError, "Requires a file as a parameter."); return NULL; } arg3 = PyFile_AsFile(obj2); } (arg1)->addChannel(arg2,arg3); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_Tossim_removeChannel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; char *arg2 = (char *) 0 ; FILE *arg3 = (FILE *) 0 ; bool result; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:Tossim_removeChannel",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_removeChannel" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Tossim_removeChannel" "', argument " "2"" of type '" "char *""'"); } arg2 = reinterpret_cast< char * >(buf2); { if (!PyFile_Check(obj2)) { PyErr_SetString(PyExc_TypeError, "Requires a file as a parameter."); return NULL; } arg3 = PyFile_AsFile(obj2); } result = (bool)(arg1)->removeChannel(arg2,arg3); resultobj = SWIG_From_bool(static_cast< bool >(result)); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_Tossim_randomSeed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:Tossim_randomSeed",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_randomSeed" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Tossim_randomSeed" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->randomSeed(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_runNextEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; bool result; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_runNextEvent",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_runNextEvent" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (bool)(arg1)->runNextEvent(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_mac(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; MAC *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_mac",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_mac" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (MAC *)(arg1)->mac(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MAC, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_radio(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; Radio *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_radio",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_radio" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (Radio *)(arg1)->radio(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Radio, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Tossim_newPacket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; Tossim *arg1 = (Tossim *) 0 ; Packet *result = 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:Tossim_newPacket",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tossim, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tossim_newPacket" "', argument " "1"" of type '" "Tossim *""'"); } arg1 = reinterpret_cast< Tossim * >(argp1); result = (Packet *)(arg1)->newPacket(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Packet, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *Tossim_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O|swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_Tossim, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } static PyMethodDef SwigMethods[] = { { (char *)"new_MAC", _wrap_new_MAC, METH_VARARGS, NULL}, { (char *)"delete_MAC", _wrap_delete_MAC, METH_VARARGS, NULL}, { (char *)"MAC_initHigh", _wrap_MAC_initHigh, METH_VARARGS, NULL}, { (char *)"MAC_initLow", _wrap_MAC_initLow, METH_VARARGS, NULL}, { (char *)"MAC_high", _wrap_MAC_high, METH_VARARGS, NULL}, { (char *)"MAC_low", _wrap_MAC_low, METH_VARARGS, NULL}, { (char *)"MAC_symbolsPerSec", _wrap_MAC_symbolsPerSec, METH_VARARGS, NULL}, { (char *)"MAC_bitsPerSymbol", _wrap_MAC_bitsPerSymbol, METH_VARARGS, NULL}, { (char *)"MAC_preambleLength", _wrap_MAC_preambleLength, METH_VARARGS, NULL}, { (char *)"MAC_exponentBase", _wrap_MAC_exponentBase, METH_VARARGS, NULL}, { (char *)"MAC_maxIterations", _wrap_MAC_maxIterations, METH_VARARGS, NULL}, { (char *)"MAC_minFreeSamples", _wrap_MAC_minFreeSamples, METH_VARARGS, NULL}, { (char *)"MAC_rxtxDelay", _wrap_MAC_rxtxDelay, METH_VARARGS, NULL}, { (char *)"MAC_ackTime", _wrap_MAC_ackTime, METH_VARARGS, NULL}, { (char *)"MAC_setInitHigh", _wrap_MAC_setInitHigh, METH_VARARGS, NULL}, { (char *)"MAC_setInitLow", _wrap_MAC_setInitLow, METH_VARARGS, NULL}, { (char *)"MAC_setHigh", _wrap_MAC_setHigh, METH_VARARGS, NULL}, { (char *)"MAC_setLow", _wrap_MAC_setLow, METH_VARARGS, NULL}, { (char *)"MAC_setSymbolsPerSec", _wrap_MAC_setSymbolsPerSec, METH_VARARGS, NULL}, { (char *)"MAC_setBitsBerSymbol", _wrap_MAC_setBitsBerSymbol, METH_VARARGS, NULL}, { (char *)"MAC_setPreambleLength", _wrap_MAC_setPreambleLength, METH_VARARGS, NULL}, { (char *)"MAC_setExponentBase", _wrap_MAC_setExponentBase, METH_VARARGS, NULL}, { (char *)"MAC_setMaxIterations", _wrap_MAC_setMaxIterations, METH_VARARGS, NULL}, { (char *)"MAC_setMinFreeSamples", _wrap_MAC_setMinFreeSamples, METH_VARARGS, NULL}, { (char *)"MAC_setRxtxDelay", _wrap_MAC_setRxtxDelay, METH_VARARGS, NULL}, { (char *)"MAC_setAckTime", _wrap_MAC_setAckTime, METH_VARARGS, NULL}, { (char *)"MAC_swigregister", MAC_swigregister, METH_VARARGS, NULL}, { (char *)"new_Radio", _wrap_new_Radio, METH_VARARGS, NULL}, { (char *)"delete_Radio", _wrap_delete_Radio, METH_VARARGS, NULL}, { (char *)"Radio_add", _wrap_Radio_add, METH_VARARGS, NULL}, { (char *)"Radio_gain", _wrap_Radio_gain, METH_VARARGS, NULL}, { (char *)"Radio_connected", _wrap_Radio_connected, METH_VARARGS, NULL}, { (char *)"Radio_remove", _wrap_Radio_remove, METH_VARARGS, NULL}, { (char *)"Radio_setNoise", _wrap_Radio_setNoise, METH_VARARGS, NULL}, { (char *)"Radio_setSensitivity", _wrap_Radio_setSensitivity, METH_VARARGS, NULL}, { (char *)"Radio_swigregister", Radio_swigregister, METH_VARARGS, NULL}, { (char *)"new_Packet", _wrap_new_Packet, METH_VARARGS, NULL}, { (char *)"delete_Packet", _wrap_delete_Packet, METH_VARARGS, NULL}, { (char *)"Packet_setSource", _wrap_Packet_setSource, METH_VARARGS, NULL}, { (char *)"Packet_source", _wrap_Packet_source, METH_VARARGS, NULL}, { (char *)"Packet_setDestination", _wrap_Packet_setDestination, METH_VARARGS, NULL}, { (char *)"Packet_destination", _wrap_Packet_destination, METH_VARARGS, NULL}, { (char *)"Packet_setLength", _wrap_Packet_setLength, METH_VARARGS, NULL}, { (char *)"Packet_length", _wrap_Packet_length, METH_VARARGS, NULL}, { (char *)"Packet_setType", _wrap_Packet_setType, METH_VARARGS, NULL}, { (char *)"Packet_type", _wrap_Packet_type, METH_VARARGS, NULL}, { (char *)"Packet_data", _wrap_Packet_data, METH_VARARGS, NULL}, { (char *)"Packet_setData", _wrap_Packet_setData, METH_VARARGS, NULL}, { (char *)"Packet_maxLength", _wrap_Packet_maxLength, METH_VARARGS, NULL}, { (char *)"Packet_setStrength", _wrap_Packet_setStrength, METH_VARARGS, NULL}, { (char *)"Packet_deliver", _wrap_Packet_deliver, METH_VARARGS, NULL}, { (char *)"Packet_deliverNow", _wrap_Packet_deliverNow, METH_VARARGS, NULL}, { (char *)"Packet_swigregister", Packet_swigregister, METH_VARARGS, NULL}, { (char *)"variable_string_t_type_set", _wrap_variable_string_t_type_set, METH_VARARGS, NULL}, { (char *)"variable_string_t_type_get", _wrap_variable_string_t_type_get, METH_VARARGS, NULL}, { (char *)"variable_string_t_ptr_set", _wrap_variable_string_t_ptr_set, METH_VARARGS, NULL}, { (char *)"variable_string_t_ptr_get", _wrap_variable_string_t_ptr_get, METH_VARARGS, NULL}, { (char *)"variable_string_t_len_set", _wrap_variable_string_t_len_set, METH_VARARGS, NULL}, { (char *)"variable_string_t_len_get", _wrap_variable_string_t_len_get, METH_VARARGS, NULL}, { (char *)"variable_string_t_isArray_set", _wrap_variable_string_t_isArray_set, METH_VARARGS, NULL}, { (char *)"variable_string_t_isArray_get", _wrap_variable_string_t_isArray_get, METH_VARARGS, NULL}, { (char *)"new_variable_string_t", _wrap_new_variable_string_t, METH_VARARGS, NULL}, { (char *)"delete_variable_string_t", _wrap_delete_variable_string_t, METH_VARARGS, NULL}, { (char *)"variable_string_t_swigregister", variable_string_t_swigregister, METH_VARARGS, NULL}, { (char *)"nesc_app_t_numVariables_set", _wrap_nesc_app_t_numVariables_set, METH_VARARGS, NULL}, { (char *)"nesc_app_t_numVariables_get", _wrap_nesc_app_t_numVariables_get, METH_VARARGS, NULL}, { (char *)"nesc_app_t_variableNames_set", _wrap_nesc_app_t_variableNames_set, METH_VARARGS, NULL}, { (char *)"nesc_app_t_variableNames_get", _wrap_nesc_app_t_variableNames_get, METH_VARARGS, NULL}, { (char *)"nesc_app_t_variableTypes_set", _wrap_nesc_app_t_variableTypes_set, METH_VARARGS, NULL}, { (char *)"nesc_app_t_variableTypes_get", _wrap_nesc_app_t_variableTypes_get, METH_VARARGS, NULL}, { (char *)"nesc_app_t_variableArray_set", _wrap_nesc_app_t_variableArray_set, METH_VARARGS, NULL}, { (char *)"nesc_app_t_variableArray_get", _wrap_nesc_app_t_variableArray_get, METH_VARARGS, NULL}, { (char *)"new_nesc_app_t", _wrap_new_nesc_app_t, METH_VARARGS, NULL}, { (char *)"delete_nesc_app_t", _wrap_delete_nesc_app_t, METH_VARARGS, NULL}, { (char *)"nesc_app_t_swigregister", nesc_app_t_swigregister, METH_VARARGS, NULL}, { (char *)"new_Variable", _wrap_new_Variable, METH_VARARGS, NULL}, { (char *)"delete_Variable", _wrap_delete_Variable, METH_VARARGS, NULL}, { (char *)"Variable_getData", _wrap_Variable_getData, METH_VARARGS, NULL}, { (char *)"Variable_swigregister", Variable_swigregister, METH_VARARGS, NULL}, { (char *)"new_Mote", _wrap_new_Mote, METH_VARARGS, NULL}, { (char *)"delete_Mote", _wrap_delete_Mote, METH_VARARGS, NULL}, { (char *)"Mote_id", _wrap_Mote_id, METH_VARARGS, NULL}, { (char *)"Mote_euid", _wrap_Mote_euid, METH_VARARGS, NULL}, { (char *)"Mote_setEuid", _wrap_Mote_setEuid, METH_VARARGS, NULL}, { (char *)"Mote_bootTime", _wrap_Mote_bootTime, METH_VARARGS, NULL}, { (char *)"Mote_bootAtTime", _wrap_Mote_bootAtTime, METH_VARARGS, NULL}, { (char *)"Mote_isOn", _wrap_Mote_isOn, METH_VARARGS, NULL}, { (char *)"Mote_turnOff", _wrap_Mote_turnOff, METH_VARARGS, NULL}, { (char *)"Mote_turnOn", _wrap_Mote_turnOn, METH_VARARGS, NULL}, { (char *)"Mote_getVariable", _wrap_Mote_getVariable, METH_VARARGS, NULL}, { (char *)"Mote_addNoiseTraceReading", _wrap_Mote_addNoiseTraceReading, METH_VARARGS, NULL}, { (char *)"Mote_createNoiseModel", _wrap_Mote_createNoiseModel, METH_VARARGS, NULL}, { (char *)"Mote_generateNoise", _wrap_Mote_generateNoise, METH_VARARGS, NULL}, { (char *)"Mote_swigregister", Mote_swigregister, METH_VARARGS, NULL}, { (char *)"new_Tossim", _wrap_new_Tossim, METH_VARARGS, NULL}, { (char *)"delete_Tossim", _wrap_delete_Tossim, METH_VARARGS, NULL}, { (char *)"Tossim_init", _wrap_Tossim_init, METH_VARARGS, NULL}, { (char *)"Tossim_time", _wrap_Tossim_time, METH_VARARGS, NULL}, { (char *)"Tossim_ticksPerSecond", _wrap_Tossim_ticksPerSecond, METH_VARARGS, NULL}, { (char *)"Tossim_setTime", _wrap_Tossim_setTime, METH_VARARGS, NULL}, { (char *)"Tossim_timeStr", _wrap_Tossim_timeStr, METH_VARARGS, NULL}, { (char *)"Tossim_currentNode", _wrap_Tossim_currentNode, METH_VARARGS, NULL}, { (char *)"Tossim_getNode", _wrap_Tossim_getNode, METH_VARARGS, NULL}, { (char *)"Tossim_setCurrentNode", _wrap_Tossim_setCurrentNode, METH_VARARGS, NULL}, { (char *)"Tossim_addChannel", _wrap_Tossim_addChannel, METH_VARARGS, NULL}, { (char *)"Tossim_removeChannel", _wrap_Tossim_removeChannel, METH_VARARGS, NULL}, { (char *)"Tossim_randomSeed", _wrap_Tossim_randomSeed, METH_VARARGS, NULL}, { (char *)"Tossim_runNextEvent", _wrap_Tossim_runNextEvent, METH_VARARGS, NULL}, { (char *)"Tossim_mac", _wrap_Tossim_mac, METH_VARARGS, NULL}, { (char *)"Tossim_radio", _wrap_Tossim_radio, METH_VARARGS, NULL}, { (char *)"Tossim_newPacket", _wrap_Tossim_newPacket, METH_VARARGS, NULL}, { (char *)"Tossim_swigregister", Tossim_swigregister, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_FILE = {"_p_FILE", "FILE *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_MAC = {"_p_MAC", "MAC *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_Mote = {"_p_Mote", "Mote *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_Packet = {"_p_Packet", "Packet *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_Radio = {"_p_Radio", "Radio *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_Tossim = {"_p_Tossim", "Tossim *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_Variable = {"_p_Variable", "Variable *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_int = {"_p_int", "int *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_nesc_app = {"_p_nesc_app", "nesc_app *|nesc_app_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_p_char = {"_p_p_char", "char **", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_var_string = {"_p_var_string", "var_string *|variable_string_t *", 0, 0, (void*)0, 0}; static swig_type_info *swig_type_initial[] = { &_swigt__p_FILE, &_swigt__p_MAC, &_swigt__p_Mote, &_swigt__p_Packet, &_swigt__p_Radio, &_swigt__p_Tossim, &_swigt__p_Variable, &_swigt__p_char, &_swigt__p_int, &_swigt__p_nesc_app, &_swigt__p_p_char, &_swigt__p_var_string, }; static swig_cast_info _swigc__p_FILE[] = { {&_swigt__p_FILE, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_MAC[] = { {&_swigt__p_MAC, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_Mote[] = { {&_swigt__p_Mote, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_Packet[] = { {&_swigt__p_Packet, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_Radio[] = { {&_swigt__p_Radio, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_Tossim[] = { {&_swigt__p_Tossim, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_Variable[] = { {&_swigt__p_Variable, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_nesc_app[] = { {&_swigt__p_nesc_app, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_p_char[] = { {&_swigt__p_p_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_var_string[] = { {&_swigt__p_var_string, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info *swig_cast_initial[] = { _swigc__p_FILE, _swigc__p_MAC, _swigc__p_Mote, _swigc__p_Packet, _swigc__p_Radio, _swigc__p_Tossim, _swigc__p_Variable, _swigc__p_char, _swigc__p_int, _swigc__p_nesc_app, _swigc__p_p_char, _swigc__p_var_string, }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_const_info swig_const_table[] = { {0, 0, 0, 0.0, 0, 0}}; #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * Type initialization: * This problem is tough by the requirement that no dynamic * memory is used. Also, since swig_type_info structures store pointers to * swig_cast_info structures and swig_cast_info structures store pointers back * to swig_type_info structures, we need some lookup code at initialization. * The idea is that swig generates all the structures that are needed. * The runtime then collects these partially filled structures. * The SWIG_InitializeModule function takes these initial arrays out of * swig_module, and does all the lookup, filling in the swig_module.types * array with the correct data and linking the correct swig_cast_info * structures together. * * The generated swig_type_info structures are assigned staticly to an initial * array. We just loop through that array, and handle each type individually. * First we lookup if this type has been already loaded, and if so, use the * loaded structure instead of the generated one. Then we have to fill in the * cast linked list. The cast data is initially stored in something like a * two-dimensional array. Each row corresponds to a type (there are the same * number of rows as there are in the swig_type_initial array). Each entry in * a column is one of the swig_cast_info structures for that type. * The cast_initial array is actually an array of arrays, because each row has * a variable number of columns. So to actually build the cast linked list, * we find the array of casts associated with the type, and loop through it * adding the casts to the list. The one last trick we need to do is making * sure the type pointer in the swig_cast_info struct is correct. * * First off, we lookup the cast->type name to see if it is already loaded. * There are three cases to handle: * 1) If the cast->type has already been loaded AND the type we are adding * casting info to has not been loaded (it is in this module), THEN we * replace the cast->type pointer with the type pointer that has already * been loaded. * 2) If BOTH types (the one we are adding casting info to, and the * cast->type) are loaded, THEN the cast info has already been loaded by * the previous module so we just ignore it. * 3) Finally, if cast->type has not already been loaded, then we add that * swig_cast_info to the linked list (because the cast->type) pointer will * be correct. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* c-mode */ #endif #endif #if 0 #define SWIGRUNTIME_DEBUG #endif SWIGRUNTIME void SWIG_InitializeModule(void *clientdata) { size_t i; swig_module_info *module_head, *iter; int found; clientdata = clientdata; /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { /* Initialize the swig_module */ swig_module.type_initial = swig_type_initial; swig_module.cast_initial = swig_cast_initial; swig_module.next = &swig_module; } /* Try and load any already created modules */ module_head = SWIG_GetModule(clientdata); if (!module_head) { /* This is the first module loaded for this interpreter */ /* so set the swig module into the interpreter */ SWIG_SetModule(clientdata, &swig_module); module_head = &swig_module; } else { /* the interpreter has loaded a SWIG module, but has it loaded this one? */ found=0; iter=module_head; do { if (iter==&swig_module) { found=1; break; } iter=iter->next; } while (iter!= module_head); /* if the is found in the list, then all is done and we may leave */ if (found) return; /* otherwise we must add out module into the list */ swig_module.next = module_head->next; module_head->next = &swig_module; } /* Now work on filling in swig_module.types */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: size %d\n", swig_module.size); #endif for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = 0; swig_type_info *ret; swig_cast_info *cast; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); #endif /* if there is another module already loaded */ if (swig_module.next != &swig_module) { type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); } if (type) { /* Overwrite clientdata field */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found type %s\n", type->name); #endif if (swig_module.type_initial[i]->clientdata) { type->clientdata = swig_module.type_initial[i]->clientdata; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); #endif } } else { type = swig_module.type_initial[i]; } /* Insert casting types */ cast = swig_module.cast_initial[i]; while (cast->type) { /* Don't need to add information already in the list */ ret = 0; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); #endif if (swig_module.next != &swig_module) { ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); #ifdef SWIGRUNTIME_DEBUG if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); #endif } if (ret) { if (type == swig_module.type_initial[i]) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: skip old type %s\n", ret->name); #endif cast->type = ret; ret = 0; } else { /* Check for casting already in the list */ swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); #ifdef SWIGRUNTIME_DEBUG if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); #endif if (!ocast) ret = 0; } } if (!ret) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); #endif if (type->cast) { type->cast->prev = cast; cast->next = type->cast; } type->cast = cast; } cast++; } /* Set entry in modules->types array equal to the type */ swig_module.types[i] = type; } swig_module.types[i] = 0; #ifdef SWIGRUNTIME_DEBUG printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { int j = 0; swig_cast_info *cast = swig_module.cast_initial[i]; printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); while (cast->type) { printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); cast++; ++j; } printf("---- Total casts: %d\n",j); } printf("**** SWIG_InitializeModule: Cast List ******\n"); #endif } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientData(void) { size_t i; swig_cast_info *equiv; static int init_run = 0; if (init_run) return; init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { if (equiv->type && !equiv->type->clientdata) SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); } equiv = equiv->next; } } } } #ifdef __cplusplus #if 0 { /* c-mode */ #endif } #endif #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(void); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; SWIGINTERN PyObject * swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { return PyString_FromString(""); } SWIGINTERN PyObject * swig_varlink_str(swig_varlinkobject *v) { PyObject *str = PyString_FromString("("); swig_globalvar *var; for (var = v->vars; var; var=var->next) { PyString_ConcatAndDel(&str,PyString_FromString(var->name)); if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); } PyString_ConcatAndDel(&str,PyString_FromString(")")); return str; } SWIGINTERN int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { PyObject *str = swig_varlink_str(v); fprintf(fp,"Swig global variables "); fprintf(fp,"%s\n", PyString_AsString(str)); Py_DECREF(str); return 0; } SWIGINTERN void swig_varlink_dealloc(swig_varlinkobject *v) { swig_globalvar *var = v->vars; while (var) { swig_globalvar *n = var->next; free(var->name); free(var); var = n; } } SWIGINTERN PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { PyObject *res = NULL; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->get_attr)(); break; } var = var->next; } if (res == NULL && !PyErr_Occurred()) { PyErr_SetString(PyExc_NameError,"Unknown C global variable"); } return res; } SWIGINTERN int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { int res = 1; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->set_attr)(p); break; } var = var->next; } if (res == 1 && !PyErr_Occurred()) { PyErr_SetString(PyExc_NameError,"Unknown C global variable"); } return res; } SWIGINTERN PyTypeObject* swig_varlink_type(void) { static char varlink__doc__[] = "Swig var link object"; static PyTypeObject varlink_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { PyObject_HEAD_INIT(NULL) 0, /* Number of items in variable part (ob_size) */ (char *)"swigvarlink", /* Type name (tp_name) */ sizeof(swig_varlinkobject), /* Basic size (tp_basicsize) */ 0, /* Itemsize (tp_itemsize) */ (destructor) swig_varlink_dealloc, /* Deallocator (tp_dealloc) */ (printfunc) swig_varlink_print, /* Print (tp_print) */ (getattrfunc) swig_varlink_getattr, /* get attr (tp_getattr) */ (setattrfunc) swig_varlink_setattr, /* Set attr (tp_setattr) */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ (reprfunc)swig_varlink_str, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ varlink__doc__, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; varlink_type = tmp; varlink_type.ob_type = &PyType_Type; type_init = 1; } return &varlink_type; } /* Create a variable linking object for use later */ SWIGINTERN PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); if (result) { result->vars = 0; } return ((PyObject*) result); } SWIGINTERN void SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v = (swig_varlinkobject *) p; swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); if (gv) { size_t size = strlen(name)+1; gv->name = (char *)malloc(size); if (gv->name) { strncpy(gv->name,name,size); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; } } v->vars = gv; } SWIGINTERN PyObject * SWIG_globals(void) { static PyObject *_SWIG_globals = 0; if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink(); return _SWIG_globals; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ SWIGINTERN void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; ++i) { switch(constants[i].type) { case SWIG_PY_POINTER: obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d, constants[i].name, obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ SWIGINTERN void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { const char *c = methods[i].ml_doc; if (c && (c = strstr(c, "swig_ptr: "))) { int j; swig_const_info *ci = 0; const char *name = c + 10; for (j = 0; const_table[j].type; ++j) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); if (ndoc) { char *buff = ndoc; void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; if (ptr) { strncpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; strncpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIG_init(void) { PyObject *m, *d; /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); m = Py_InitModule((char *) SWIG_name, SwigMethods); d = PyModule_GetDict(m); SWIG_InitializeModule(0); SWIG_InstallConstants(d,swig_const_table); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/000077500000000000000000000000001207233610700175145ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/000077500000000000000000000000001207233610700206225ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/000077500000000000000000000000001207233610700216365ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128AdcC.nc000066400000000000000000000041421207233610700243140ustar00rootroot00000000000000/// $Id: HplAtm128AdcC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128Adc.h" /** * HPL for the Atmega128 A/D conversion susbsystem. * * @author Martin Turon * @author Hu Siquan * @author David Gay */ configuration HplAtm128AdcC { provides interface HplAtm128Adc; } implementation { components HplAtm128AdcP, McuSleepC; HplAtm128Adc = HplAtm128AdcP; HplAtm128AdcP.McuPowerState -> McuSleepC; components PlatformInterruptC; HplAtm128AdcP.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128AdcP.nc000066400000000000000000000120301207233610700243240ustar00rootroot00000000000000/// $Id: HplAtm128AdcP.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Atm128Adc.h" /** * HPL for the Atmega128 A/D conversion susbsystem. * * @author Martin Turon * @author Hu Siquan * @author David Gay */ module HplAtm128AdcP { provides interface HplAtm128Adc; uses interface McuPowerState; uses interface PlatformInterrupt; } implementation { //=== Direct read of HW registers. ================================= async command Atm128Admux_t HplAtm128Adc.getAdmux() { return *(Atm128Admux_t*)&ADMUX; } async command Atm128Adcsra_t HplAtm128Adc.getAdcsra() { return *(Atm128Adcsra_t*)&ADCSRA; } async command uint16_t HplAtm128Adc.getValue() { return ADC; } DEFINE_UNION_CAST(Admux2int, Atm128Admux_t, uint8_t); DEFINE_UNION_CAST(Adcsra2int, Atm128Adcsra_t, uint8_t); //=== Direct write of HW registers. ================================ async command void HplAtm128Adc.setAdmux( Atm128Admux_t x ) { ADMUX = Admux2int(x); } async command void HplAtm128Adc.setAdcsra( Atm128Adcsra_t x ) { ADCSRA = Adcsra2int(x); } async command void HplAtm128Adc.setPrescaler(uint8_t scale){ Atm128Adcsra_t current_val = call HplAtm128Adc.getAdcsra(); current_val.adif = FALSE; current_val.adps = scale; call HplAtm128Adc.setAdcsra(current_val); } // Individual bit manipulation. These all clear any pending A/D interrupt. async command void HplAtm128Adc.enableAdc() { SET_BIT(ADCSRA, ADEN); call McuPowerState.update(); } async command void HplAtm128Adc.disableAdc() { CLR_BIT(ADCSRA, ADEN); call McuPowerState.update(); } async command void HplAtm128Adc.enableInterruption() { SET_BIT(ADCSRA, ADIE); } async command void HplAtm128Adc.disableInterruption() { CLR_BIT(ADCSRA, ADIE); } async command void HplAtm128Adc.setContinuous() { SET_BIT(ADCSRA, ADFR); } async command void HplAtm128Adc.setSingle() { CLR_BIT(ADCSRA, ADFR); } async command void HplAtm128Adc.resetInterrupt() { SET_BIT(ADCSRA, ADIF); } async command void HplAtm128Adc.startConversion() { SET_BIT(ADCSRA, ADSC); } /* A/D status checks */ async command bool HplAtm128Adc.isEnabled() { return (call HplAtm128Adc.getAdcsra()).aden; } async command bool HplAtm128Adc.isStarted() { return (call HplAtm128Adc.getAdcsra()).adsc; } async command bool HplAtm128Adc.isComplete() { return (call HplAtm128Adc.getAdcsra()).adif; } /* A/D interrupt handlers. Signals dataReady event with interrupts enabled */ AVR_ATOMIC_HANDLER(SIG_ADC) { uint16_t data = call HplAtm128Adc.getValue(); __nesc_enable_interrupt(); signal HplAtm128Adc.dataReady(data); call PlatformInterrupt.postAmble(); } default async event void HplAtm128Adc.dataReady(uint16_t done) { } async command bool HplAtm128Adc.cancel() { /* This is tricky */ atomic { Atm128Adcsra_t oldSr = call HplAtm128Adc.getAdcsra(), newSr; /* To cancel a conversion, first turn off ADEN, then turn off ADSC. We also cancel any pending interrupt. Finally we reenable the ADC. */ newSr = oldSr; newSr.aden = FALSE; newSr.adif = TRUE; /* This clears a pending interrupt... */ newSr.adie = FALSE; /* We don't want to start sampling again at the next sleep */ call HplAtm128Adc.setAdcsra(newSr); newSr.adsc = FALSE; call HplAtm128Adc.setAdcsra(newSr); newSr.aden = TRUE; call HplAtm128Adc.setAdcsra(newSr); return oldSr.adif || oldSr.adsc; } } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128I2CBusC.nc000066400000000000000000000044731207233610700246630ustar00rootroot00000000000000/// $Id: HplAtm128I2CBusC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2006 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This driver implements direct I2C register access and a blocking master * controller for the ATmega128 via a Hardware Platform Layer (HPL) to its * two-wire-interface (TWI) hardware subsystem. * * @author Martin Turon * @author Philip Levis * * @version $Id: HplAtm128I2CBusC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ */ configuration HplAtm128I2CBusC { provides interface HplAtm128I2CBus as I2C; } implementation { components HplAtm128GeneralIOC as IO, HplAtm128I2CBusP as Bus; I2C = Bus.I2C; Bus.I2CClk -> IO.PortD0; Bus.I2CData -> IO.PortD1; components PlatformInterruptC; Bus.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128I2CBusP.nc000066400000000000000000000121241207233610700246700ustar00rootroot00000000000000/// $Id: HplAtm128I2CBusP.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #define F_CPU 7372800 #include "Atm128I2C.h" /** * This driver implements direct I2C register access and a blocking master * controller for the ATmega128 via a Hardware Platform Layer (HPL) to its * two-wire-interface (TWI) hardware subsystem. * * @author Martin Turon * @author Philip Levis * * @version $Id: HplAtm128I2CBusP.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ */ module HplAtm128I2CBusP { provides interface HplAtm128I2CBus as I2C; uses { interface GeneralIO as I2CClk; interface GeneralIO as I2CData; interface PlatformInterrupt; } } implementation { uint8_t current; async command void I2C.init(bool hasExternalPulldown) { // Set the internal pullup resisters if (hasExternalPulldown) { //call I2CClk.makeOutput(); //call I2CData.makeOutput(); call I2CClk.set(); call I2CData.set(); } call I2CClk.makeInput(); call I2CData.makeInput(); TWSR = 0; // set prescaler == 0 TWBR = (F_CPU / 50000UL - 16) / 2; // set I2C baud rate //TWBR = 50; TWAR = 0; TWCR = 0; } async command void I2C.off() { call I2CClk.clr(); call I2CData.clr(); } async command uint8_t I2C.status() { return TWSR & 0xf8; } async command void I2C.sendCommand() { atomic TWCR = current; } async command void I2C.readCurrent() { atomic current = TWCR; } /** Send START symbol and begin I2C bus transaction. */ async command void I2C.setStart(bool on) { if (on) { atomic SET_BIT(current, TWSTA); } else { atomic CLR_BIT(current, TWSTA); } } async command bool I2C.hasStart() { return READ_BIT(current, TWSTA); } async command void I2C.setStop(bool on) { if (on) { atomic SET_BIT(current, TWSTO); } else { atomic CLR_BIT(current, TWSTO); } } async command bool I2C.hasStop() { return READ_BIT(current, TWSTO); } /** Write a byte to an I2C slave device. */ async command void I2C.write(uint8_t data) { TWDR = data; } async command uint8_t I2C.read() { return TWDR; } async command void I2C.enableAck(bool enable) { if (enable) { atomic SET_BIT(current, TWEA); } else { atomic CLR_BIT(current, TWEA); } } async command bool I2C.hasAcks() { return READ_BIT(current, TWEA); } async command void I2C.enableInterrupt(bool enable) { if (enable) { atomic SET_BIT(current, TWIE); } else { atomic CLR_BIT(current, TWIE); } } async command bool I2C.isInterruptEnabled() { return READ_BIT(current, TWIE); } async command bool I2C.isRealInterruptPending() { return READ_BIT(TWCR, TWINT); } async command bool I2C.isInterruptPending() { return READ_BIT(current, TWINT); } async command void I2C.setInterruptPending(bool on) { if (on) { atomic SET_BIT(current, TWINT); } else { atomic CLR_BIT(current, TWINT); } } async command void I2C.enable(bool enable) { if (enable) { atomic SET_BIT(current, TWEN); } else { atomic CLR_BIT(current, TWEN); } } async command bool I2C.isEnabled() { return READ_BIT(current, TWEN); } async command bool I2C.hasWriteCollided() { return READ_BIT(current, TWWC); } default async event void I2C.commandComplete() { } AVR_ATOMIC_HANDLER(SIG_2WIRE_SERIAL) { signal I2C.commandComplete(); call PlatformInterrupt.postAmble(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128InterruptC.nc000066400000000000000000000067351207233610700256330ustar00rootroot00000000000000/// $Id: HplAtm128InterruptC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include /** * Component providing access to all external interrupt pins on ATmega128. * @author Martin Turon */ configuration HplAtm128InterruptC { // provides all the ports as raw ports provides { interface HplAtm128Interrupt as Int0; interface HplAtm128Interrupt as Int1; interface HplAtm128Interrupt as Int2; interface HplAtm128Interrupt as Int3; interface HplAtm128Interrupt as Int4; interface HplAtm128Interrupt as Int5; interface HplAtm128Interrupt as Int6; interface HplAtm128Interrupt as Int7; } } implementation { #define IRQ_PORT_D_PIN(bit) (uint8_t)&EICRA, ISC##bit##0, ISC##bit##1, bit #define IRQ_PORT_E_PIN(bit) (uint8_t)&EICRB, ISC##bit##0, ISC##bit##1, bit components HplAtm128InterruptSigP as IrqVector, new HplAtm128InterruptPinP(IRQ_PORT_D_PIN(0)) as IntPin0, new HplAtm128InterruptPinP(IRQ_PORT_D_PIN(1)) as IntPin1, new HplAtm128InterruptPinP(IRQ_PORT_D_PIN(2)) as IntPin2, new HplAtm128InterruptPinP(IRQ_PORT_D_PIN(3)) as IntPin3, new HplAtm128InterruptPinP(IRQ_PORT_E_PIN(4)) as IntPin4, new HplAtm128InterruptPinP(IRQ_PORT_E_PIN(5)) as IntPin5, new HplAtm128InterruptPinP(IRQ_PORT_E_PIN(6)) as IntPin6, new HplAtm128InterruptPinP(IRQ_PORT_E_PIN(7)) as IntPin7; Int0 = IntPin0; Int1 = IntPin1; Int2 = IntPin2; Int3 = IntPin3; Int4 = IntPin4; Int5 = IntPin5; Int6 = IntPin6; Int7 = IntPin7; IntPin0.IrqSignal -> IrqVector.IntSig0; IntPin1.IrqSignal -> IrqVector.IntSig1; IntPin2.IrqSignal -> IrqVector.IntSig2; IntPin3.IrqSignal -> IrqVector.IntSig3; IntPin4.IrqSignal -> IrqVector.IntSig4; IntPin5.IrqSignal -> IrqVector.IntSig5; IntPin6.IrqSignal -> IrqVector.IntSig6; IntPin7.IrqSignal -> IrqVector.IntSig7; components PlatformInterruptC; IrqVector.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128InterruptSigP.nc000066400000000000000000000071551207233610700263100ustar00rootroot00000000000000/// $Id: HplAtm128InterruptSigP.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interrupt interface access for interrupt capable GPIO pins. * Exposes just the interrupt vector routine for * easy linking to generic components. * * @author Martin Turon */ module HplAtm128InterruptSigP { provides interface HplAtm128InterruptSig as IntSig0; provides interface HplAtm128InterruptSig as IntSig1; provides interface HplAtm128InterruptSig as IntSig2; provides interface HplAtm128InterruptSig as IntSig3; provides interface HplAtm128InterruptSig as IntSig4; provides interface HplAtm128InterruptSig as IntSig5; provides interface HplAtm128InterruptSig as IntSig6; provides interface HplAtm128InterruptSig as IntSig7; uses interface PlatformInterrupt; } implementation { default async event void IntSig0.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT0 ) { signal IntSig0.fired(); call PlatformInterrupt.postAmble(); } default async event void IntSig1.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT1 ) { signal IntSig1.fired(); call PlatformInterrupt.postAmble(); } default async event void IntSig2.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT2 ) { signal IntSig2.fired(); call PlatformInterrupt.postAmble(); } default async event void IntSig3.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT3 ) { signal IntSig3.fired(); call PlatformInterrupt.postAmble(); } default async event void IntSig4.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT4 ) { signal IntSig4.fired(); call PlatformInterrupt.postAmble(); } default async event void IntSig5.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT5 ) { signal IntSig5.fired(); call PlatformInterrupt.postAmble(); } default async event void IntSig6.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT6 ) { signal IntSig6.fired(); call PlatformInterrupt.postAmble(); } default async event void IntSig7.fired() { } AVR_ATOMIC_HANDLER( SIG_INTERRUPT7 ) { signal IntSig7.fired(); call PlatformInterrupt.postAmble(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128SpiC.nc000066400000000000000000000076331207233610700243700ustar00rootroot00000000000000/// $Id: HplAtm128SpiC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Configuration encapsulating the basic SPI HPL for the atm128. * *
       * $Id: HplAtm128SpiC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $
       * 
      * * @author Philip Levis * @author Martin Turon */ configuration HplAtm128SpiC { provides interface Atm128Spi as SpiBus; } implementation { components HplAtm128GeneralIOC as IO, HplAtm128SpiP as HplSpi; components McuSleepC; SpiBus = HplSpi; HplSpi.Mcu -> McuSleepC; HplSpi.SS -> IO.PortB0; // Slave set line HplSpi.SCK -> IO.PortB1; // SPI clock line HplSpi.MOSI -> IO.PortB2; // Master out, slave in HplSpi.MISO -> IO.PortB3; // Master in, slave out components PlatformInterruptC; HplSpi.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128SpiP.nc000066400000000000000000000157551207233610700244110ustar00rootroot00000000000000/// $Id: HplAtm128SpiP.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the SPI bus abstraction for the atm128 * microcontroller. * * @author Philip Levis * @author Martin Turon */ #include "Atm128Spi.h" module HplAtm128SpiP { provides interface Atm128Spi as SPI; provides interface AsyncStdControl; uses { interface GeneralIO as SS; // Slave set line interface GeneralIO as SCK; // SPI clock line interface GeneralIO as MOSI; // Master out, slave in interface GeneralIO as MISO; // Master in, slave out interface McuPowerState as Mcu; interface PlatformInterrupt; } } implementation { async command error_t AsyncStdControl.start() { call SPI.enableSpi(TRUE); } async command error_t AsyncStdControl.stop() { call SPI.enableInterrupt(FALSE); call SPI.enableSpi(FALSE); } async command void SPI.initMaster() { call MOSI.makeOutput(); call MISO.makeInput(); call SCK.makeOutput(); call SPI.setMasterBit(TRUE); } async command void SPI.initSlave() { call MISO.makeOutput(); call MOSI.makeInput(); call SCK.makeInput(); call SS.makeInput(); call SPI.setMasterBit(FALSE); } async command void SPI.sleep() { // call SS.set(); // why was this needed? } async command uint8_t SPI.read() { return SPDR; } async command void SPI.write(uint8_t d) { SPDR = d; } default async event void SPI.dataReady(uint8_t d) {} AVR_ATOMIC_HANDLER(SIG_SPI) { signal SPI.dataReady(call SPI.read()); call PlatformInterrupt.postAmble(); } //=== SPI Bus utility routines. ==================================== async command bool SPI.isInterruptPending() { return READ_BIT(SPSR, SPIF); } async command bool SPI.isInterruptEnabled () { return READ_BIT(SPCR, SPIE); } async command void SPI.enableInterrupt(bool enabled) { if (enabled) { SET_BIT(SPCR, SPIE); call Mcu.update(); } else { CLR_BIT(SPCR, SPIE); call Mcu.update(); } } async command bool SPI.isSpiEnabled() { return READ_BIT(SPCR, SPE); } async command void SPI.enableSpi(bool enabled) { if (enabled) { SET_BIT(SPCR, SPE); call Mcu.update(); } else { CLR_BIT(SPCR, SPE); call Mcu.update(); } } /* DORD bit */ async command void SPI.setDataOrder(bool lsbFirst) { if (lsbFirst) { SET_BIT(SPCR, DORD); } else { CLR_BIT(SPCR, DORD); } } async command bool SPI.isOrderLsbFirst() { return READ_BIT(SPCR, DORD); } /* MSTR bit */ async command void SPI.setMasterBit(bool isMaster) { if (isMaster) { SET_BIT(SPCR, MSTR); } else { CLR_BIT(SPCR, MSTR); } } async command bool SPI.isMasterBitSet() { return READ_BIT(SPCR, MSTR); } /* CPOL bit */ async command void SPI.setClockPolarity(bool highWhenIdle) { if (highWhenIdle) { SET_BIT(SPCR, CPOL); } else { CLR_BIT(SPCR, CPOL); } } async command bool SPI.getClockPolarity() { return READ_BIT(SPCR, CPOL); } /* CPHA bit */ async command void SPI.setClockPhase(bool sampleOnTrailing) { if (sampleOnTrailing) { SET_BIT(SPCR, CPHA); } else { CLR_BIT(SPCR, CPHA); } } async command bool SPI.getClockPhase() { return READ_BIT(SPCR, CPHA); } async command uint8_t SPI.getClock () { return READ_FLAG(SPCR, ((1 << SPR1) | (1 < configuration HplAtm128Timer0AsyncC { provides { // 8-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; interface HplAtm128TimerAsync as TimerAsync; } } implementation { components HplAtm128Timer0AsyncP; components McuSleepC; McuSleepC.McuPowerOverride -> HplAtm128Timer0AsyncP; Timer = HplAtm128Timer0AsyncP; TimerCtrl = HplAtm128Timer0AsyncP; Compare = HplAtm128Timer0AsyncP; TimerAsync = HplAtm128Timer0AsyncP; components PlatformInterruptC; HplAtm128Timer0AsyncP.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128Timer0AsyncP.nc000066400000000000000000000176001207233610700260030ustar00rootroot00000000000000/// $Id: HplAtm128Timer0AsyncP.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL interface to Atmega128 timer 0 in ASYNC mode. This is a specialised * HPL component that assumes that timer 0 is used in ASYNC mode and * includes some workarounds for some of the weirdnesses (delayed overflow * interrupt) of that mode. * * @author Martin Turon * @author David Gay */ #include module HplAtm128Timer0AsyncP { provides { // 8-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; interface McuPowerOverride; interface HplAtm128TimerAsync as TimerAsync; } uses interface PlatformInterrupt; } implementation { //=== Read the current timer value. =================================== async command uint8_t Timer.get() { return TCNT0; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint8_t t) { TCNT0 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR0 & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128TimerControl_t x = call TimerCtrl.getControl(); x.bits.cs = s; call TimerCtrl.setControl(x); } //=== Read the control registers. ===================================== async command Atm128TimerControl_t TimerCtrl.getControl() { return *(Atm128TimerControl_t*)&TCCR0; } //=== Write the control registers. ==================================== async command void TimerCtrl.setControl( Atm128TimerControl_t x ) { TCCR0 = x.flat; } //=== Read the interrupt mask. ===================================== async command Atm128_TIMSK_t TimerCtrl.getInterruptMask() { return *(Atm128_TIMSK_t*)&TIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask8_2int, Atm128_TIMSK_t, uint8_t); DEFINE_UNION_CAST(TimerMask16_2int, Atm128_ETIMSK_t, uint8_t); async command void TimerCtrl.setInterruptMask( Atm128_TIMSK_t x ) { TIMSK = TimerMask8_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_TIFR_t TimerCtrl.getInterruptFlag() { return *(Atm128_TIFR_t*)&TIFR; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags8_2int, Atm128_TIFR_t, uint8_t); DEFINE_UNION_CAST(TimerFlags16_2int, Atm128_ETIFR_t, uint8_t); async command void TimerCtrl.setInterruptFlag( Atm128_TIFR_t x ) { TIFR = TimerFlags8_2int(x); } //=== Timer 8-bit implementation. ==================================== async command void Timer.reset() { TIFR = 1 << TOV0; } async command void Timer.start() { SET_BIT(TIMSK, TOIE0); } async command void Timer.stop() { CLR_BIT(TIMSK, TOIE0); } bool overflowed() { return (call TimerCtrl.getInterruptFlag()).bits.tov0; } async command bool Timer.test() { return overflowed(); } async command bool Timer.isOn() { return (call TimerCtrl.getInterruptMask()).bits.toie0; } async command void Compare.reset() { TIFR = 1 << OCF0; } async command void Compare.start() { SET_BIT(TIMSK,OCIE0); } async command void Compare.stop() { CLR_BIT(TIMSK,OCIE0); } async command bool Compare.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf0; } async command bool Compare.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie0; } //=== Read the compare registers. ===================================== async command uint8_t Compare.get() { return OCR0; } //=== Write the compare registers. ==================================== async command void Compare.set(uint8_t t) { OCR0 = t; } //=== Timer interrupts signals ======================================== inline void stabiliseTimer0() { TCCR0 = TCCR0; while (ASSR & 1 << TCR0UB) ; } /** * On the atm128, there is a small latency when waking up from * POWER_SAVE mode. So if a timer is going to go off very soon, it's * better to drop down until EXT_STANDBY, which has a 6 cycle wakeup * latency. This function calculates whether staying in EXT_STANDBY * is needed. If the timer is not running it returns POWER_DOWN. * Please refer to TEP 112 and the atm128 datasheet for details. */ async command mcu_power_t McuPowerOverride.lowestState() { uint8_t diff; // We need to make sure that the sleep wakeup latency will not // cause us to miss a timer. POWER_SAVE if (TIMSK & (1 << OCIE0 | 1 << TOIE0)) { // need to wait for timer 0 updates propagate before sleeping // (we don't need to worry about reentering sleep mode too early, // as the wake ups from timer0 wait at least one TOSC1 cycle // anyway - see the stabiliseTimer0 function) while (ASSR & (1 << TCN0UB | 1 << OCR0UB | 1 << TCR0UB)) ; diff = OCR0 - TCNT0; if (diff < EXT_STANDBY_T0_THRESHOLD || TCNT0 > 256 - EXT_STANDBY_T0_THRESHOLD) return ATM128_POWER_EXT_STANDBY; return ATM128_POWER_SAVE; } else { return ATM128_POWER_DOWN; } } default async event void Compare.fired() { } AVR_ATOMIC_HANDLER(SIG_OUTPUT_COMPARE0) { stabiliseTimer0(); signal Compare.fired(); call PlatformInterrupt.postAmble(); } default async event void Timer.overflow() { } AVR_ATOMIC_HANDLER(SIG_OVERFLOW0) { stabiliseTimer0(); signal Timer.overflow(); call PlatformInterrupt.postAmble(); } // Asynchronous status register support async command Atm128Assr_t TimerAsync.getAssr() { return *(Atm128Assr_t *)&ASSR; } async command void TimerAsync.setAssr(Atm128Assr_t x) { ASSR = x.flat; } async command void TimerAsync.setTimer0Asynchronous() { ASSR |= 1 << AS0; } async command int TimerAsync.controlBusy() { return (ASSR & (1 << TCR0UB)) != 0; } async command int TimerAsync.compareBusy() { return (ASSR & (1 << OCR0UB)) != 0; } async command int TimerAsync.countBusy() { return (ASSR & (1 << TCN0UB)) != 0; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128Timer1C.nc000066400000000000000000000047641207233610700250000ustar00rootroot00000000000000/// $Id: HplAtm128Timer1C.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL interface to Atmega128 timer 1. * * @author Martin Turon * @author David Gay */ configuration HplAtm128Timer1C { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as Compare[uint8_t id]; } } implementation { components HplAtm128Timer0AsyncC, HplAtm128Timer1P; Timer = HplAtm128Timer1P; TimerCtrl = HplAtm128Timer1P; Capture = HplAtm128Timer1P; Compare[0] = HplAtm128Timer1P.CompareA; Compare[1] = HplAtm128Timer1P.CompareB; Compare[2] = HplAtm128Timer1P.CompareC; HplAtm128Timer1P.Timer0Ctrl -> HplAtm128Timer0AsyncC; components PlatformInterruptC; HplAtm128Timer1P.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128Timer1P.nc000066400000000000000000000221421207233610700250030ustar00rootroot00000000000000/// $Id: HplAtm128Timer1P.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Internal component of the HPL interface to Atmega128 timer 1. * * @author Martin Turon */ #include module HplAtm128Timer1P { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as CompareA; interface HplAtm128Compare as CompareB; interface HplAtm128Compare as CompareC; } uses interface HplAtm128TimerCtrl8 as Timer0Ctrl; uses interface PlatformInterrupt; } implementation { //=== Read the current timer value. =================================== async command uint16_t Timer.get() { return TCNT1; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint16_t t) { TCNT1 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR1B & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128TimerCtrlCapture_t x = call TimerCtrl.getCtrlCapture(); x.bits.cs = s; call TimerCtrl.setCtrlCapture(x); } //=== Read the control registers. ===================================== async command Atm128TimerCtrlCompare_t TimerCtrl.getCtrlCompare() { return *(Atm128TimerCtrlCompare_t*)&TCCR1A; } async command Atm128TimerCtrlCapture_t TimerCtrl.getCtrlCapture() { return *(Atm128TimerCtrlCapture_t*)&TCCR1B; } async command Atm128TimerCtrlClock_t TimerCtrl.getCtrlClock() { return *(Atm128TimerCtrlClock_t*)&TCCR1C; } //=== Control registers utilities. ================================== DEFINE_UNION_CAST(TimerCtrlCompare2int, Atm128TimerCtrlCompare_t, uint16_t); DEFINE_UNION_CAST(TimerCtrlCapture2int, Atm128TimerCtrlCapture_t, uint16_t); DEFINE_UNION_CAST(TimerCtrlClock2int, Atm128TimerCtrlClock_t, uint16_t); //=== Write the control registers. ==================================== async command void TimerCtrl.setCtrlCompare( Atm128_TCCR1A_t x ) { TCCR1A = TimerCtrlCompare2int(x); } async command void TimerCtrl.setCtrlCapture( Atm128_TCCR1B_t x ) { TCCR1B = TimerCtrlCapture2int(x); } async command void TimerCtrl.setCtrlClock( Atm128_TCCR1C_t x ) { TCCR1C = TimerCtrlClock2int(x); } //=== Read the interrupt mask. ===================================== async command Atm128_ETIMSK_t TimerCtrl.getInterruptMask() { return *(Atm128_ETIMSK_t*)&ETIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask8_2int, Atm128_TIMSK_t, uint8_t); DEFINE_UNION_CAST(TimerMask16_2int, Atm128_ETIMSK_t, uint8_t); async command void TimerCtrl.setInterruptMask( Atm128_ETIMSK_t x ) { ETIMSK = TimerMask16_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_ETIFR_t TimerCtrl.getInterruptFlag() { return *(Atm128_ETIFR_t*)&ETIFR; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags8_2int, Atm128_TIFR_t, uint8_t); DEFINE_UNION_CAST(TimerFlags16_2int, Atm128_ETIFR_t, uint8_t); async command void TimerCtrl.setInterruptFlag( Atm128_ETIFR_t x ) { ETIFR = TimerFlags16_2int(x); } //=== Capture 16-bit implementation. =================================== async command void Capture.setEdge(bool up) { WRITE_BIT(TCCR1B,ICES1, up); } //=== Timer 16-bit implementation. =================================== async command void Timer.reset() { TIFR = 1 << TOV1; } async command void Capture.reset() { TIFR = 1 << ICF1; } async command void CompareA.reset() { TIFR = 1 << OCF1A; } async command void CompareB.reset() { TIFR = 1 << OCF1B; } async command void CompareC.reset() { ETIFR = 1 << OCF1C; } async command void Timer.start() { SET_BIT(TIMSK,TOIE1); } async command void Capture.start() { SET_BIT(TIMSK,TICIE1); } async command void CompareA.start() { SET_BIT(TIMSK,OCIE1A); } async command void CompareB.start() { SET_BIT(TIMSK,OCIE1B); } async command void CompareC.start() { SET_BIT(ETIMSK,OCIE1C); } async command void Timer.stop() { CLR_BIT(TIMSK,TOIE1); } async command void Capture.stop() { CLR_BIT(TIMSK,TICIE1); } async command void CompareA.stop() { CLR_BIT(TIMSK,OCIE1A); } async command void CompareB.stop() { CLR_BIT(TIMSK,OCIE1B); } async command void CompareC.stop() { CLR_BIT(ETIMSK,OCIE1C); } // Note: Many Timer interrupt flags are on Timer0 register async command bool Timer.test() { return (call Timer0Ctrl.getInterruptFlag()).bits.tov1; } async command bool Capture.test() { return (call Timer0Ctrl.getInterruptFlag()).bits.icf1; } async command bool CompareA.test() { return (call Timer0Ctrl.getInterruptFlag()).bits.ocf1a; } async command bool CompareB.test() { return (call Timer0Ctrl.getInterruptFlag()).bits.ocf1b; } async command bool CompareC.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf1c; } // Note: Many Timer interrupt mask bits are on Timer0 register async command bool Timer.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.toie1; } async command bool Capture.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.ticie1; } async command bool CompareA.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.ocie1a; } async command bool CompareB.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.ocie1b; } async command bool CompareC.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie1c; } //=== Read the compare registers. ===================================== async command uint16_t CompareA.get() { return OCR1A; } async command uint16_t CompareB.get() { return OCR1B; } async command uint16_t CompareC.get() { return OCR1C; } //=== Write the compare registers. ==================================== async command void CompareA.set(uint16_t t) { OCR1A = t; } async command void CompareB.set(uint16_t t) { OCR1B = t; } async command void CompareC.set(uint16_t t) { OCR1C = t; } //=== Read the capture registers. ===================================== async command uint16_t Capture.get() { return ICR1; } //=== Write the capture registers. ==================================== async command void Capture.set(uint16_t t) { ICR1 = t; } //=== Timer interrupts signals ======================================== default async event void CompareA.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE1A) { signal CompareA.fired(); call PlatformInterrupt.postAmble(); } default async event void CompareB.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE1B) { signal CompareB.fired(); call PlatformInterrupt.postAmble(); } default async event void CompareC.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE1C) { signal CompareC.fired(); call PlatformInterrupt.postAmble(); } default async event void Capture.captured(uint16_t time) { } AVR_NONATOMIC_HANDLER(SIG_INPUT_CAPTURE1) { signal Capture.captured(call Timer.get()); call PlatformInterrupt.postAmble(); } default async event void Timer.overflow() { } AVR_NONATOMIC_HANDLER(SIG_OVERFLOW1) { signal Timer.overflow(); call PlatformInterrupt.postAmble(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128Timer2C.nc000066400000000000000000000133521207233610700247720ustar00rootroot00000000000000/// $Id: HplAtm128Timer2C.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL interface to Atmega128 timer 2. * * @author Martin Turon */ #include module HplAtm128Timer2C { provides { interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; } uses interface ThreadScheduler; } implementation { //=== Read the current timer value. =================================== async command uint8_t Timer.get() { return TCNT2; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint8_t t) { TCNT2 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR2 & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128TimerControl_t x = call TimerCtrl.getControl(); x.bits.cs = s; call TimerCtrl.setControl(x); } //=== Read the control registers. ===================================== async command Atm128TimerControl_t TimerCtrl.getControl() { return *(Atm128TimerControl_t*)&TCCR2; } //=== Control registers utilities. ================================== DEFINE_UNION_CAST(TimerCtrlCompareint, Atm128TimerCtrlCompare_t, uint16_t); DEFINE_UNION_CAST(TimerCtrlCapture2int, Atm128TimerCtrlCapture_t, uint16_t); DEFINE_UNION_CAST(TimerCtrlClock2int, Atm128TimerCtrlClock_t, uint16_t); //=== Write the control registers. ==================================== async command void TimerCtrl.setControl( Atm128TimerControl_t x ) { TCCR2 = x.flat; } //=== Read the interrupt mask. ===================================== async command Atm128_TIMSK_t TimerCtrl.getInterruptMask() { return *(Atm128_TIMSK_t*)&TIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask8_2int, Atm128_TIMSK_t, uint8_t); async command void TimerCtrl.setInterruptMask( Atm128_TIMSK_t x ) { TIMSK = TimerMask8_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_TIFR_t TimerCtrl.getInterruptFlag() { return *(Atm128_TIFR_t*)&TIFR; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags8_2int, Atm128_TIFR_t, uint8_t); async command void TimerCtrl.setInterruptFlag( Atm128_TIFR_t x ) { TIFR = TimerFlags8_2int(x); } //=== Timer 8-bit implementation. ==================================== async command void Timer.reset() { TIFR = 1 << TOV2; } async command void Timer.start() { SET_BIT(TIMSK,TOIE2); } async command void Timer.stop() { CLR_BIT(TIMSK,TOIE2); } async command bool Timer.test() { return (call TimerCtrl.getInterruptFlag()).bits.tov2; } async command bool Timer.isOn() { return (call TimerCtrl.getInterruptMask()).bits.toie2; } async command void Compare.reset() { TIFR = 1 << OCF2; } async command void Compare.start() { SET_BIT(TIMSK,OCIE2); } async command void Compare.stop() { CLR_BIT(TIMSK,OCIE2); } async command bool Compare.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf2; } async command bool Compare.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie2; } //=== Read the compare registers. ===================================== async command uint8_t Compare.get() { return OCR2; } //=== Write the compare registers. ==================================== async command void Compare.set(uint8_t t) { OCR2 = t; } //=== Timer interrupts signals ======================================== default async event void Compare.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE2) { signal Compare.fired(); call ThreadScheduler.interruptPostAmble(); } default async event void Timer.overflow() { } AVR_NONATOMIC_HANDLER(SIG_OVERFLOW2) { signal Timer.overflow(); call ThreadScheduler.interruptPostAmble(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128Timer3C.nc000066400000000000000000000046421207233610700247750ustar00rootroot00000000000000/// $Id: HplAtm128Timer3C.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL interface to Atmega128 timer 2. * * @author Martin Turon * @author David Gay */ configuration HplAtm128Timer3C { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as Compare[uint8_t id]; } } implementation { components HplAtm128Timer3P; Timer = HplAtm128Timer3P; TimerCtrl = HplAtm128Timer3P; Capture = HplAtm128Timer3P; Compare[0] = HplAtm128Timer3P.CompareA; Compare[1] = HplAtm128Timer3P.CompareB; Compare[2] = HplAtm128Timer3P.CompareC; components PlatformInterruptC; HplAtm128Timer3P.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128Timer3P.nc000066400000000000000000000214361207233610700250120ustar00rootroot00000000000000/// $Id: HplAtm128Timer3P.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Internal componentr of the HPL interface to Atmega128 timer 3. * * @author Martin Turon */ #include module HplAtm128Timer3P { provides { interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as CompareA; interface HplAtm128Compare as CompareB; interface HplAtm128Compare as CompareC; } uses interface PlatformInterrupt; } implementation { //=== Read the current timer value. =================================== async command uint16_t Timer.get() { return TCNT3; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint16_t t) { TCNT3 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR3B & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128TimerCtrlCapture_t x = call TimerCtrl.getCtrlCapture(); x.bits.cs = s; call TimerCtrl.setCtrlCapture(x); } //=== Read the control registers. ===================================== async command Atm128TimerCtrlCompare_t TimerCtrl.getCtrlCompare() { return *(Atm128TimerCtrlCompare_t*)&TCCR3A; } async command Atm128TimerCtrlCapture_t TimerCtrl.getCtrlCapture() { return *(Atm128TimerCtrlCapture_t*)&TCCR3B; } async command Atm128TimerCtrlClock_t TimerCtrl.getCtrlClock() { return *(Atm128TimerCtrlClock_t*)&TCCR3C; } //=== Control registers utilities. ================================== DEFINE_UNION_CAST(TimerCtrlCompare2int, Atm128TimerCtrlCompare_t, uint16_t); DEFINE_UNION_CAST(TimerCtrlCapture2int, Atm128TimerCtrlCapture_t, uint16_t); DEFINE_UNION_CAST(TimerCtrlClock2int, Atm128TimerCtrlClock_t, uint16_t); //=== Write the control registers. ==================================== async command void TimerCtrl.setCtrlCompare( Atm128_TCCR3A_t x ) { TCCR3A = TimerCtrlCompare2int(x); } async command void TimerCtrl.setCtrlCapture( Atm128_TCCR3B_t x ) { TCCR3B = TimerCtrlCapture2int(x); } async command void TimerCtrl.setCtrlClock( Atm128_TCCR3C_t x ) { TCCR3C = TimerCtrlClock2int(x); } //=== Read the interrupt mask. ===================================== async command Atm128_ETIMSK_t TimerCtrl.getInterruptMask() { return *(Atm128_ETIMSK_t*)&ETIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask16_2int, Atm128_ETIMSK_t, uint8_t); async command void TimerCtrl.setInterruptMask( Atm128_ETIMSK_t x ) { ETIMSK = TimerMask16_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_ETIFR_t TimerCtrl.getInterruptFlag() { return *(Atm128_ETIFR_t*)&ETIFR; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags16_2int, Atm128_ETIFR_t, uint8_t); async command void TimerCtrl.setInterruptFlag( Atm128_ETIFR_t x ) { ETIFR = TimerFlags16_2int(x); } //=== Capture 16-bit implementation. =================================== async command void Capture.setEdge(bool up) { WRITE_BIT(TCCR3B,ICES3, up); } //=== Timer 16-bit implementation. =================================== async command void Timer.reset() { ETIFR = 1 << TOV3; } async command void Capture.reset() { ETIFR = 1 << ICF3; } async command void CompareA.reset() { ETIFR = 1 << OCF3A; } async command void CompareB.reset() { ETIFR = 1 << OCF3B; } async command void CompareC.reset() { ETIFR = 1 << OCF3C; } async command void Timer.start() { SET_BIT(ETIMSK,TOIE3); } async command void Capture.start() { SET_BIT(ETIMSK,TICIE3); } async command void CompareA.start() { SET_BIT(ETIMSK,OCIE3A); } async command void CompareB.start() { SET_BIT(ETIMSK,OCIE3B); } async command void CompareC.start() { SET_BIT(ETIMSK,OCIE3C); } async command void Timer.stop() { CLR_BIT(ETIMSK,TOIE3); } async command void Capture.stop() { CLR_BIT(ETIMSK,TICIE3); } async command void CompareA.stop() { CLR_BIT(ETIMSK,OCIE3A); } async command void CompareB.stop() { CLR_BIT(ETIMSK,OCIE3B); } async command void CompareC.stop() { CLR_BIT(ETIMSK,OCIE3C); } async command bool Timer.test() { return (call TimerCtrl.getInterruptFlag()).bits.tov3; } async command bool Capture.test() { return (call TimerCtrl.getInterruptFlag()).bits.icf3; } async command bool CompareA.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf3a; } async command bool CompareB.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf3b; } async command bool CompareC.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf3c; } async command bool Timer.isOn() { return (call TimerCtrl.getInterruptMask()).bits.toie3; } async command bool Capture.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ticie3; } async command bool CompareA.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie3a; } async command bool CompareB.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie3b; } async command bool CompareC.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie3c; } //=== Read the compare registers. ===================================== async command uint16_t CompareA.get() { return OCR3A; } async command uint16_t CompareB.get() { return OCR3B; } async command uint16_t CompareC.get() { return OCR3C; } //=== Write the compare registers. ==================================== async command void CompareA.set(uint16_t t) { OCR3A = t; } async command void CompareB.set(uint16_t t) { OCR3B = t; } async command void CompareC.set(uint16_t t) { OCR3C = t; } //=== Read the capture registers. ===================================== async command uint16_t Capture.get() { return ICR3; } //=== Write the capture registers. ==================================== async command void Capture.set(uint16_t t) { ICR3 = t; } //=== Timer interrupts signals ======================================== default async event void CompareA.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE3A) { signal CompareA.fired(); call PlatformInterrupt.postAmble(); } default async event void CompareB.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE3B) { signal CompareB.fired(); call PlatformInterrupt.postAmble(); } default async event void CompareC.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE3C) { signal CompareC.fired(); call PlatformInterrupt.postAmble(); } default async event void Capture.captured(uint16_t time) { } AVR_NONATOMIC_HANDLER(SIG_INPUT_CAPTURE3) { signal Capture.captured(call Timer.get()); call PlatformInterrupt.postAmble(); } default async event void Timer.overflow() { } AVR_NONATOMIC_HANDLER(SIG_OVERFLOW3) { signal Timer.overflow(); call PlatformInterrupt.postAmble(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128UartC.nc000066400000000000000000000053421207233610700245430ustar00rootroot00000000000000/// $Id: HplAtm128UartC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /// #include /** * HPL for the Atmega 128 serial ports. * * @author Martin Turon * @author David Gay */ configuration HplAtm128UartC { provides { interface StdControl as Uart0TxControl; interface StdControl as Uart0RxControl; interface HplAtm128Uart as HplUart0; interface StdControl as Uart1TxControl; interface StdControl as Uart1RxControl; interface HplAtm128Uart as HplUart1; } } implementation { components HplAtm128UartP, PlatformC, McuSleepC; Uart0TxControl = HplAtm128UartP.Uart0TxControl; Uart0RxControl = HplAtm128UartP.Uart0RxControl; HplUart0 = HplAtm128UartP.HplUart0; Uart1TxControl = HplAtm128UartP.Uart1TxControl; Uart1RxControl = HplAtm128UartP.Uart1RxControl; HplUart1 = HplAtm128UartP.HplUart1; HplAtm128UartP.Atm128Calibrate -> PlatformC; HplAtm128UartP.McuPowerState -> McuSleepC; components MainC; MainC.SoftwareInit -> HplAtm128UartP.Uart0Init; MainC.SoftwareInit -> HplAtm128UartP.Uart1Init; components PlatformInterruptC; HplAtm128UartP.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/HplAtm128UartP.nc000066400000000000000000000206531207233610700245620ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Alec Woo * @author Jonathan Hui * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:51 $ */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Private component of the Atmega128 serial port HPL. * * @author Martin Turon * @author David Gay */ #include module HplAtm128UartP { provides interface Init as Uart0Init; provides interface StdControl as Uart0TxControl; provides interface StdControl as Uart0RxControl; provides interface HplAtm128Uart as HplUart0; provides interface Init as Uart1Init; provides interface StdControl as Uart1TxControl; provides interface StdControl as Uart1RxControl; provides interface HplAtm128Uart as HplUart1; uses interface Atm128Calibrate; uses interface McuPowerState; uses interface PlatformInterrupt; } implementation { //=== Uart Init Commands. ==================================== command error_t Uart0Init.init() { Atm128UartMode_t mode; Atm128UartStatus_t stts; Atm128UartControl_t ctrl; uint16_t ubrr0; ctrl.bits = (struct Atm128_UCSRB_t) {rxcie:0, txcie:0, rxen:0, txen:0}; stts.bits = (struct Atm128_UCSRA_t) {u2x:1}; mode.bits = (struct Atm128_UCSRC_t) {ucsz:ATM128_UART_DATA_SIZE_8_BITS}; ubrr0 = call Atm128Calibrate.baudrateRegister(PLATFORM_BAUDRATE); UBRR0L = ubrr0; UBRR0H = ubrr0 >> 8; UCSR0A = stts.flat; UCSR0C = mode.flat; UCSR0B = ctrl.flat; return SUCCESS; } command error_t Uart0TxControl.start() { SET_BIT(UCSR0B, TXEN); call McuPowerState.update(); return SUCCESS; } command error_t Uart0TxControl.stop() { CLR_BIT(UCSR0B, TXEN); call McuPowerState.update(); return SUCCESS; } command error_t Uart0RxControl.start() { SET_BIT(UCSR0B, RXEN); call McuPowerState.update(); return SUCCESS; } command error_t Uart0RxControl.stop() { CLR_BIT(UCSR0B, RXEN); call McuPowerState.update(); return SUCCESS; } async command error_t HplUart0.enableTxIntr() { SET_BIT(UCSR0A, TXC); SET_BIT(UCSR0B, TXCIE); return SUCCESS; } async command error_t HplUart0.disableTxIntr(){ CLR_BIT(UCSR0B, TXCIE); return SUCCESS; } async command error_t HplUart0.enableRxIntr(){ SET_BIT(UCSR0B, RXCIE); return SUCCESS; } async command error_t HplUart0.disableRxIntr(){ CLR_BIT(UCSR0B, RXCIE); return SUCCESS; } async command bool HplUart0.isTxEmpty(){ return READ_BIT(UCSR0A, TXC); } async command bool HplUart0.isRxEmpty(){ return !READ_BIT(UCSR0A, RXC); } async command uint8_t HplUart0.rx(){ return UDR0; } async command void HplUart0.tx(uint8_t data) { atomic{ UDR0 = data; SET_BIT(UCSR0A, TXC); } } AVR_ATOMIC_HANDLER(SIG_UART0_RECV) { if (READ_BIT(UCSR0A, RXC)) { signal HplUart0.rxDone(UDR0); } call PlatformInterrupt.postAmble(); } AVR_NONATOMIC_HANDLER(SIG_UART0_TRANS) { signal HplUart0.txDone(); call PlatformInterrupt.postAmble(); } command error_t Uart1Init.init() { Atm128UartMode_t mode; Atm128UartStatus_t stts; Atm128UartControl_t ctrl; uint16_t ubrr1; ctrl.bits = (struct Atm128_UCSRB_t) {rxcie:0, txcie:0, rxen:0, txen:0}; stts.bits = (struct Atm128_UCSRA_t) {u2x:1}; mode.bits = (struct Atm128_UCSRC_t) {ucsz:ATM128_UART_DATA_SIZE_8_BITS}; ubrr1 = call Atm128Calibrate.baudrateRegister(PLATFORM_BAUDRATE); UBRR1L = ubrr1; UBRR1H = ubrr1 >> 8; UCSR1A = stts.flat; UCSR1C = mode.flat; UCSR1B = ctrl.flat; return SUCCESS; } command error_t Uart1TxControl.start() { SET_BIT(UCSR1B, TXEN); call McuPowerState.update(); return SUCCESS; } command error_t Uart1TxControl.stop() { CLR_BIT(UCSR1B, TXEN); call McuPowerState.update(); return SUCCESS; } command error_t Uart1RxControl.start() { SET_BIT(UCSR1B, RXEN); call McuPowerState.update(); return SUCCESS; } command error_t Uart1RxControl.stop() { CLR_BIT(UCSR1B, RXEN); call McuPowerState.update(); return SUCCESS; } async command error_t HplUart1.enableTxIntr() { SET_BIT(UCSR1A, TXC); SET_BIT(UCSR1B, TXCIE); return SUCCESS; } async command error_t HplUart1.disableTxIntr(){ CLR_BIT(UCSR1B, TXCIE); return SUCCESS; } async command error_t HplUart1.enableRxIntr(){ SET_BIT(UCSR1B, RXCIE); return SUCCESS; } async command error_t HplUart1.disableRxIntr(){ CLR_BIT(UCSR1B, RXCIE); return SUCCESS; } async command bool HplUart1.isTxEmpty() { return READ_BIT(UCSR1A, TXC); } async command bool HplUart1.isRxEmpty() { return !READ_BIT(UCSR1A, RXC); } async command uint8_t HplUart1.rx(){ return UDR1; } async command void HplUart1.tx(uint8_t data) { atomic{ UDR1 = data; SET_BIT(UCSR1A, TXC); } } AVR_ATOMIC_HANDLER(SIG_UART1_RECV) { if (READ_BIT(UCSR1A, RXC)) signal HplUart1.rxDone(UDR1); call PlatformInterrupt.postAmble(); } AVR_NONATOMIC_HANDLER(SIG_UART1_TRANS) { signal HplUart1.txDone(); call PlatformInterrupt.postAmble(); } default async event void HplUart0.txDone() {} default async event void HplUart0.rxDone(uint8_t data) {} default async event void HplUart1.txDone() {} default async event void HplUart1.rxDone(uint8_t data) {} } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/adc/000077500000000000000000000000001207233610700223655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/adc/BlockingAdcP.nc000066400000000000000000000057671207233610700252060ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" configuration BlockingAdcP { provides { interface BlockingRead as BlockingRead[uint8_t client]; interface BlockingReadStream as BlockingReadStream[uint8_t streamClient]; } uses { //For BlockingRead interface Atm128AdcConfig as Config[uint8_t client]; interface Resource as ResourceRead[uint8_t client]; //For BlockingReadStream interface Atm128AdcConfig as ConfigReadStream[uint8_t streamClient]; interface Resource as ResourceReadStream[uint8_t streamClient]; } } implementation { components MainC; components WireAdcP; components WireAdcStreamP; components new BlockingReadP(); components new BlockingReadStreamP(); MainC.SoftwareInit -> BlockingReadP; MainC.SoftwareInit -> BlockingReadStreamP; //For BlockingRead BlockingRead = BlockingReadP; BlockingReadP.Read -> WireAdcP; Config = WireAdcP; ResourceRead = WireAdcP; //For BlockingReadStream BlockingReadStream = BlockingReadStreamP; BlockingReadStreamP.ReadStream -> WireAdcStreamP; ConfigReadStream = WireAdcStreamP; ResourceReadStream = WireAdcStreamP; components SystemCallC; components SystemCallQueueC; BlockingReadP.SystemCallQueue -> SystemCallQueueC; BlockingReadP.SystemCall -> SystemCallC; BlockingReadStreamP.SystemCallQueue -> SystemCallQueueC; BlockingReadStreamP.SystemCall -> SystemCallC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/adc/BlockingAdcReadClientC.nc000066400000000000000000000024051207233610700271060ustar00rootroot00000000000000/* $Id: BlockingAdcReadClientC.nc,v 1.2 2008-06-14 19:27:25 klueska Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Provide, as per TEP101, arbitrated access via a Read interface to the * Atmega128 ADC. Users of this component must link it to an * implementation of Atm128AdcConfig which provides the ADC parameters * (channel, etc). * * @author David Gay * @author Kevin Klues */ #include "Adc.h" generic configuration BlockingAdcReadClientC() { provides interface BlockingRead; uses { interface Atm128AdcConfig; interface ResourceConfigure; } } implementation { components Atm128AdcC, BlockingAdcP; enum { ID = unique(UQ_ADC_READ), HAL_ID = unique(UQ_ATM128ADC_RESOURCE) }; BlockingRead = BlockingAdcP.BlockingRead[ID]; Atm128AdcConfig = BlockingAdcP.Config[ID]; BlockingAdcP.ResourceRead[ID] -> Atm128AdcC.Resource[HAL_ID]; ResourceConfigure = Atm128AdcC.ResourceConfigure[HAL_ID]; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/adc/BlockingAdcReadStreamClientC.nc000066400000000000000000000024771207233610700302730ustar00rootroot00000000000000/* $Id: BlockingAdcReadStreamClientC.nc,v 1.2 2008-06-14 19:27:25 klueska Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Provide, as per TEP101, arbitrated access via a ReadStream interface to * the Atmega128 ADC. Users of this component must link it to an * implementation of Atm128AdcConfig which provides the ADC parameters * (channel, etc). * * @author David Gay * @author Kevin Klues */ #include "Adc.h" generic configuration BlockingAdcReadStreamClientC() { provides interface BlockingReadStream; uses { interface Atm128AdcConfig; interface ResourceConfigure; } } implementation { components BlockingAdcP, Atm128AdcC; enum { ID = unique(UQ_ADC_READSTREAM), HAL_ID = unique(UQ_ATM128ADC_RESOURCE) }; BlockingReadStream = BlockingAdcP.BlockingReadStream[ID]; Atm128AdcConfig = BlockingAdcP.ConfigReadStream[ID]; BlockingAdcP.ResourceReadStream[ID] -> Atm128AdcC.Resource[HAL_ID]; ResourceConfigure = Atm128AdcC.ResourceConfigure[HAL_ID]; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/chip_thread.h000066400000000000000000000176411207233610700242720ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This file is derived from similar files in the TinyThread implementation * by William P. McCartney from Cleveland State University (2006) * * This file contains MSP430 platform-specific routines for implementing * threads in TinyOS * * @author Kevin Klues */ //Define on platform specific basis for inclusion in // the thread control block typedef struct thread_regs { uint8_t status; uint8_t r0; uint8_t r1; uint8_t r2; uint8_t r3; uint8_t r4; uint8_t r5; uint8_t r6; uint8_t r7; uint8_t r8; uint8_t r9; uint8_t r10; uint8_t r11; uint8_t r12; uint8_t r13; uint8_t r14; uint8_t r15; uint8_t r16; uint8_t r17; uint8_t r18; uint8_t r19; uint8_t r20; uint8_t r21; uint8_t r22; uint8_t r23; uint8_t r24; uint8_t r25; uint8_t r26; uint8_t r27; uint8_t r28; uint8_t r29; uint8_t r30; uint8_t r31; } thread_regs_t; typedef uint16_t* stack_ptr_t; #define STACK_TOP(stack, size) \ (&(((uint8_t*)stack)[size - sizeof(stack_ptr_t)])) //Save stack pointer #define SAVE_STACK_PTR(t) \ __asm__("in %A0, __SP_L__\n\t" \ "in %B0, __SP_H__\n\t" \ :"=r"((t)->stack_ptr) : ); //Save status register #define SAVE_STATUS(t) \ __asm__("in %0,__SREG__ \n\t" : "=r" ((t)->regs.status) : ); //Save General Purpose Registers #define SAVE_GPR(t) \ __asm__("mov %0,r0 \n\t" : "=r" ((t)->regs.r0) : ); \ __asm__("mov %0,r1 \n\t" : "=r" ((t)->regs.r1) : ); \ __asm__("mov %0,r2 \n\t" : "=r" ((t)->regs.r2) : ); \ __asm__("mov %0,r3 \n\t" : "=r" ((t)->regs.r3) : ); \ __asm__("mov %0,r4 \n\t" : "=r" ((t)->regs.r4) : ); \ __asm__("mov %0,r5 \n\t" : "=r" ((t)->regs.r5) : ); \ __asm__("mov %0,r6 \n\t" : "=r" ((t)->regs.r6) : ); \ __asm__("mov %0,r7 \n\t" : "=r" ((t)->regs.r7) : ); \ __asm__("mov %0,r8 \n\t" : "=r" ((t)->regs.r8) : ); \ __asm__("mov %0,r9 \n\t" : "=r" ((t)->regs.r9) : ); \ __asm__("mov %0,r10 \n\t" : "=r" ((t)->regs.r10) : ); \ __asm__("mov %0,r11 \n\t" : "=r" ((t)->regs.r11) : ); \ __asm__("mov %0,r12 \n\t" : "=r" ((t)->regs.r12) : ); \ __asm__("mov %0,r13 \n\t" : "=r" ((t)->regs.r13) : ); \ __asm__("mov %0,r14 \n\t" : "=r" ((t)->regs.r14) : ); \ __asm__("mov %0,r15 \n\t" : "=r" ((t)->regs.r15) : ); \ __asm__("mov %0,r16 \n\t" : "=r" ((t)->regs.r16) : ); \ __asm__("mov %0,r17 \n\t" : "=r" ((t)->regs.r17) : ); \ __asm__("mov %0,r18 \n\t" : "=r" ((t)->regs.r18) : ); \ __asm__("mov %0,r19 \n\t" : "=r" ((t)->regs.r19) : ); \ __asm__("mov %0,r20 \n\t" : "=r" ((t)->regs.r20) : ); \ __asm__("mov %0,r21 \n\t" : "=r" ((t)->regs.r21) : ); \ __asm__("mov %0,r22 \n\t" : "=r" ((t)->regs.r22) : ); \ __asm__("mov %0,r23 \n\t" : "=r" ((t)->regs.r23) : ); \ __asm__("mov %0,r24 \n\t" : "=r" ((t)->regs.r24) : ); \ __asm__("mov %0,r25 \n\t" : "=r" ((t)->regs.r25) : ); \ __asm__("mov %0,r26 \n\t" : "=r" ((t)->regs.r26) : ); \ __asm__("mov %0,r27 \n\t" : "=r" ((t)->regs.r27) : ); \ __asm__("mov %0,r28 \n\t" : "=r" ((t)->regs.r28) : ); \ __asm__("mov %0,r29 \n\t" : "=r" ((t)->regs.r29) : ); \ __asm__("mov %0,r30 \n\t" : "=r" ((t)->regs.r30) : ); \ __asm__("mov %0,r31 \n\t" : "=r" ((t)->regs.r31) : ); //Restore stack pointer #define RESTORE_STACK_PTR(t) \ __asm__("out __SP_H__,%B0 \n\t" \ "out __SP_L__,%A0 \n\t" \ ::"r" ((t)->stack_ptr)) //Restore status register #define RESTORE_STATUS(t) \ __asm__("out __SREG__,%0 \n\t" :: "r" ((t)->regs.status) ); //Restore the general purpose registers #define RESTORE_GPR(t) \ __asm__("mov r0,%0 \n\t" :: "r" ((t)->regs.r0) ); \ __asm__("mov r1,%0 \n\t" :: "r" ((t)->regs.r1) ); \ __asm__("mov r2,%0 \n\t" :: "r" ((t)->regs.r2) ); \ __asm__("mov r3,%0 \n\t" :: "r" ((t)->regs.r3) ); \ __asm__("mov r4,%0 \n\t" :: "r" ((t)->regs.r4) ); \ __asm__("mov r5,%0 \n\t" :: "r" ((t)->regs.r5) ); \ __asm__("mov r6,%0 \n\t" :: "r" ((t)->regs.r6) ); \ __asm__("mov r7,%0 \n\t" :: "r" ((t)->regs.r7) ); \ __asm__("mov r8,%0 \n\t" :: "r" ((t)->regs.r8) ); \ __asm__("mov r9,%0 \n\t" :: "r" ((t)->regs.r9) ); \ __asm__("mov r10,%0 \n\t" :: "r" ((t)->regs.r10) ); \ __asm__("mov r11,%0 \n\t" :: "r" ((t)->regs.r11) ); \ __asm__("mov r12,%0 \n\t" :: "r" ((t)->regs.r12) ); \ __asm__("mov r13,%0 \n\t" :: "r" ((t)->regs.r13) ); \ __asm__("mov r14,%0 \n\t" :: "r" ((t)->regs.r14) ); \ __asm__("mov r15,%0 \n\t" :: "r" ((t)->regs.r15) ); \ __asm__("mov r16,%0 \n\t" :: "r" ((t)->regs.r16) ); \ __asm__("mov r17,%0 \n\t" :: "r" ((t)->regs.r17) ); \ __asm__("mov r18,%0 \n\t" :: "r" ((t)->regs.r18) ); \ __asm__("mov r19,%0 \n\t" :: "r" ((t)->regs.r19) ); \ __asm__("mov r20,%0 \n\t" :: "r" ((t)->regs.r20) ); \ __asm__("mov r21,%0 \n\t" :: "r" ((t)->regs.r21) ); \ __asm__("mov r22,%0 \n\t" :: "r" ((t)->regs.r22) ); \ __asm__("mov r23,%0 \n\t" :: "r" ((t)->regs.r23) ); \ __asm__("mov r24,%0 \n\t" :: "r" ((t)->regs.r24) ); \ __asm__("mov r25,%0 \n\t" :: "r" ((t)->regs.r25) ); \ __asm__("mov r26,%0 \n\t" :: "r" ((t)->regs.r26) ); \ __asm__("mov r27,%0 \n\t" :: "r" ((t)->regs.r27) ); \ __asm__("mov r28,%0 \n\t" :: "r" ((t)->regs.r28) ); \ __asm__("mov r29,%0 \n\t" :: "r" ((t)->regs.r29) ); \ __asm__("mov r30,%0 \n\t" :: "r" ((t)->regs.r30) ); \ __asm__("mov r31,%0 \n\t" :: "r" ((t)->regs.r31) ); #define SAVE_TCB(t) \ SAVE_GPR(t); \ SAVE_STATUS(t); \ SAVE_STACK_PTR(t) #define RESTORE_TCB(t) \ RESTORE_STACK_PTR(t); \ RESTORE_STATUS(t); \ RESTORE_GPR(t) #define SWITCH_CONTEXTS(from, to) \ SAVE_TCB(from); \ RESTORE_TCB(to) #define SWAP_STACK_PTR(OLD, NEW) \ __asm__("in %A0, __SP_L__\n\t in %B0, __SP_H__":"=r"(OLD):);\ __asm__("out __SP_H__,%B0\n\t out __SP_L__,%A0"::"r"(NEW)) #define PREPARE_THREAD(t, thread_ptr) \ { uint16_t temp; \ SWAP_STACK_PTR(temp, (t)->stack_ptr); \ __asm__("push %A0\n push %B0"::"r"(&(thread_ptr))); \ SWAP_STACK_PTR((t)->stack_ptr, temp); \ SAVE_STATUS(t) \ } /* *((uint8_t*)((t)->stack_ptr)) = (uint8_t)((uint16_t)(&(thread_ptr)) >> 8); \ *((uint8_t*)((t)->stack_ptr)-1) = (uint8_t)((&(thread_ptr))); \ */ tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/sim/000077500000000000000000000000001207233610700224265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/sim/HplAtm128CompareC.nc000066400000000000000000000214251207233610700260060ustar00rootroot00000000000000/// $Id: HplAtm128CompareC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Basic compare abstraction that builds on top of a counter. * * @author Philip Levis * @date Nov 22 2005 */ // $Id: HplAtm128CompareC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ #include generic module HplAtm128CompareC(typedef width_t @integer(), uint8_t valueRegister, uint8_t interruptRegister, uint8_t interruptBit, uint8_t flagRegister, uint8_t flagBit) { provides { // 8-bit Timers interface HplAtm128Compare as Compare; } uses { interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128TimerNotify as Notify; interface ThreadScheduler; } } implementation { /* lastZero keeps track of the phase of the clock. It denotes the sim * time at which the underlying clock started, which is needed to * calculate when compares will occur. */ sim_time_t lastZero = 0; /** This variable is needed to keep track of when the underlying * timer starts, in order to reset lastZero. When oldScale is * AVR_CLOCK_OFF and the scale is set to something else, the * clock starts ticking. */ uint8_t oldScale = AVR_CLOCK_OFF; void adjust_zero(width_t currentCounter); void cancel_compare(); sim_event_t* allocate_compare(); void configure_compare(sim_event_t* e); void schedule_new_compare(); sim_time_t clock_to_sim(sim_time_t t); sim_time_t sim_to_clock(sim_time_t t); uint16_t shiftFromScale(); sim_time_t last_zero() { if (lastZero == 0) { lastZero = sim_mote_start_time(sim_node()); } return lastZero; } async event void Notify.changed() { uint8_t newScale = call Timer.getScale(); if (newScale != AVR_CLOCK_OFF && oldScale == AVR_CLOCK_OFF) { lastZero = sim_time(); } oldScale = newScale; schedule_new_compare(); } async command void Compare.reset() { REG_ACCESS(flagRegister) &= ~(1 << flagBit); } async command void Compare.start() { SET_BIT(interruptRegister,interruptBit); } async command void Compare.stop() { CLR_BIT(interruptRegister,interruptBit); } async command bool Compare.test() { return (call TimerCtrl.getInterruptFlag()).bits.ocf0; } async command bool Compare.isOn() { return (call TimerCtrl.getInterruptMask()).bits.ocie0; } //=== Read the compare registers. ===================================== async command width_t Compare.get() { return (width_t)REG_ACCESS(valueRegister); } //=== Write the compare registers. ==================================== async command void Compare.set(width_t t) { atomic { /* Re the comment above: it's a bad idea to wake up at time 0, as we'll just spin when setting the next deadline. Try and reduce the likelihood by delaying the interrupt... */ if (t == 0 || t >= 0xfe) t = 1; if (t != REG_ACCESS(valueRegister)) { REG_ACCESS(valueRegister) = t; schedule_new_compare(); } } } //=== Timer interrupts signals ======================================== default async event void Compare.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE0) { signal Compare.fired(); call ThreadScheduler.interruptPostAmble(); } /** * If the clock was stopped and has restarted, then * we need to move the time when the clock was last * zero to a time that reflects the current settings. * For example, if the clock was stopped when the counter * was 52 and then later restarted, then lastZero * needs to be moved forward in time so that the 52 * reflects the current time. */ void adjust_zero(width_t currentCounter) { sim_time_t now = sim_time(); sim_time_t adjust = currentCounter; adjust = adjust << shiftFromScale(); adjust = clock_to_sim(adjust); lastZero = now - adjust; } sim_time_t clock_to_sim(sim_time_t t) { t *= sim_ticks_per_sec(); t /= call Notify.clockTicksPerSec(); return t; } sim_time_t sim_to_clock(sim_time_t t) { t *= call Notify.clockTicksPerSec(); t /= sim_ticks_per_sec(); return t; } uint16_t shiftFromScale() { uint8_t scale = call Timer.getScale(); switch (scale) { case 0: return 0; case 1: return 0; case 2: return 3; case 3: return 5; case 4: return 6; case 5: return 7; case 6: return 8; case 7: return 10; default: return 255; } } sim_event_t* compare; void timer0_compare_handle(sim_event_t* evt) { dbg("HplAtm128CompareC", "%s Beginning compare at 0x%p\n", __FUNCTION__, evt); if (evt->cancelled) { return; } else { dbg("HplAtm128CompareC", "%s Handling compare at 0x%p @ %s\n",__FUNCTION__, evt, sim_time_string()); if (READ_BIT(interruptRegister, interruptBit)) { CLR_BIT(flagRegister, flagBit); dbg("HplAtm128CompareC", "%s Compare interrupt @ %s\n", __FUNCTION__, sim_time_string()); SIG_OUTPUT_COMPARE0(); } else { SET_BIT(flagRegister, flagBit); } // If we haven't been cancelled if (!evt->cancelled) { configure_compare(evt); sim_queue_insert(evt); } } } sim_event_t* allocate_compare() { sim_event_t* newEvent = sim_queue_allocate_event(); dbg("HplAtm128CompareC", "Allocated compare at 0x%p\n", newEvent); newEvent->handle = timer0_compare_handle; newEvent->cleanup = sim_queue_cleanup_none; return newEvent; } void configure_compare(sim_event_t* evt) { sim_time_t compareTime = 0; sim_time_t phaseOffset = 0; uint8_t timerVal = call Timer.get(); uint8_t compareVal = call Compare.get(); // Calculate how many counter increments until timer // hits compare, considering wraparound, and special // case of complete wraparound. compareTime = ((compareVal - timerVal) & 0xff); if (compareTime == 0) { compareTime = 256; } // Now convert the compare time from counter increments // to simulation ticks, considering the fact that the // increment actually has a phase offset. compareTime = compareTime << shiftFromScale(); compareTime = clock_to_sim(compareTime); compareTime += sim_time(); // How long into a timer tick was the clock actually reset? // This covers the case when the compare is set midway between // a tick, so it will go off a little early phaseOffset = sim_time(); phaseOffset -= last_zero(); phaseOffset %= clock_to_sim(1 << shiftFromScale()); compareTime -= phaseOffset; dbg("HplAtm128CompareC", "Configuring new compare of %i for %i at time %llu (@ %llu)\n", (int)compareVal, sim_node(), compareTime, sim_time()); evt->time = compareTime; } void schedule_new_compare() { if (compare != NULL) { cancel_compare(); } if (call Timer.getScale() != AVR_CLOCK_OFF) { sim_event_t* newEvent = allocate_compare(); configure_compare(newEvent); compare = newEvent; sim_queue_insert(newEvent); } } void cancel_compare() { dbg("HplAtm128CompareC", "Cancelling compare at 0x%p\n", compare); if (compare != NULL) { compare->cancelled = 1; compare->cleanup = sim_queue_cleanup_total; } } async event void Timer.overflow() {} } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/sim/HplAtm128Counter0C.nc000066400000000000000000000270321207233610700261170ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM implementation of the Atm128 Timer0 counter. It handles * overflow, scaling, and phase considerations. * * @date November 22 2005 * * @author Philip Levis * @author Martin Turon * @author David Gay */ // $Id: HplAtm128Counter0C.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $/// $Id: HplAtm128Timer2C.nc, #include #include module HplAtm128Counter0C { provides { interface Init @atleastonce(); // 8-bit Timers interface HplAtm128Timer as Timer0; interface HplAtm128TimerNotify as Notify; interface HplAtm128TimerCtrl8 as Timer0Ctrl; } uses interface ThreadScheduler; } implementation { bool inOverflow = 0; uint8_t savedCounter = 0; sim_time_t lastZero = 0; void adjust_zero(uint8_t currentCounter); void cancel_overflow(); sim_event_t* allocate_overflow(); void configure_overflow(sim_event_t* e); void schedule_new_overflow(); sim_time_t clock_to_sim(sim_time_t t); sim_time_t sim_to_clock(sim_time_t t); uint16_t shiftFromScale(); command error_t Init.init() { /* Do nothing. On a standard mote this configures Timer0 to * operating in asynchronous mode off an external crystal. Here in * TOSSIM it's assumed that's the case. */ return SUCCESS; } async command sim_time_t Notify.clockTicksPerSec() { return ATM128_TIMER0_TICKSPPS; } sim_time_t last_zero() { if (lastZero == 0) { lastZero = sim_mote_start_time(sim_node()); } return lastZero; } //=== Read the current timer value. =================================== async command uint8_t Timer0.get() { uint8_t rval; sim_time_t elapsed = sim_time() - last_zero(); elapsed = sim_to_clock(elapsed); elapsed = elapsed >> shiftFromScale(); rval = (uint8_t)(elapsed & 0xff); dbg("HplAtm128Counter0C", "HplAtm128Counter0C: Getting timer: %hhu\n", rval); return rval; } //=== Set/clear the current timer value. ============================== /** * Set/clear the current timer value. * * This code is pretty tricky. */ async command void Timer0.set(uint8_t newVal) { uint8_t curVal = call Timer0.get(); if (newVal == curVal) { return; } else { sim_time_t adjustment = curVal - newVal; adjustment = adjustment << shiftFromScale(); adjustment = clock_to_sim(adjustment); if (newVal < curVal) { lastZero += adjustment; } else { // newVal > curVal lastZero -= adjustment; } schedule_new_overflow(); signal Notify.changed(); } } //=== Read the current timer scale. =================================== async command uint8_t Timer0.getScale() { return TCCR0 & 0x7; } //=== Turn off the timers. ============================================ async command void Timer0.off() { call Timer0.setScale(AVR_CLOCK_OFF); savedCounter = call Timer0.get(); cancel_overflow(); signal Notify.changed(); } //=== Write a new timer scale. ======================================== async command void Timer0.setScale(uint8_t s) { Atm128TimerControl_t ctrl; uint8_t currentScale = call Timer0.getScale(); uint8_t currentCounter; dbg("HplAtm128Counter0C", "Timer0 scale set to %i\n", (int)s); if (currentScale == 0) { currentCounter = savedCounter; } else { currentCounter = call Timer0.get(); } ctrl = call Timer0Ctrl.getControl(); ctrl.flat &= ~(0x7); ctrl.flat |= (s & 0x7); call Timer0Ctrl.setControl(ctrl); if (currentScale != s) { adjust_zero(currentCounter); schedule_new_overflow(); } signal Notify.changed(); } //=== Read the control registers. ===================================== async command Atm128TimerControl_t Timer0Ctrl.getControl() { return *(Atm128TimerControl_t*)&TCCR0; } //=== Write the control registers. ==================================== async command void Timer0Ctrl.setControl( Atm128TimerControl_t x ) { TCCR0 = x.flat; } //=== Read the interrupt mask. ===================================== async command Atm128_TIMSK_t Timer0Ctrl.getInterruptMask() { return *(Atm128_TIMSK_t*)&TIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask8_2int, Atm128_TIMSK_t, uint8_t); DEFINE_UNION_CAST(TimerMask16_2int, Atm128_ETIMSK_t, uint8_t); async command void Timer0Ctrl.setInterruptMask( Atm128_TIMSK_t x ) { TIMSK = TimerMask8_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_TIFR_t Timer0Ctrl.getInterruptFlag() { return *(Atm128_TIFR_t*)&TIFR; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags8_2int, Atm128_TIFR_t, uint8_t); DEFINE_UNION_CAST(TimerFlags16_2int, Atm128_ETIFR_t, uint8_t); async command void Timer0Ctrl.setInterruptFlag( Atm128_TIFR_t x ) { TIFR = TimerFlags8_2int(x); } //=== Timer 8-bit implementation. ==================================== async command void Timer0.reset() { // Clear TOV0. On real hardware, this is a write. TIFR &= ~(1 << TOV0); } async command void Timer0.start() { SET_BIT(ATM128_TIMSK, TOIE0); dbg("HplAtm128Counter0C", "Enabling TOIE0 at %llu\n", sim_time()); schedule_new_overflow(); } async command void Timer0.stop() { dbg("HplAtm128Counter0C", "Timer stopped @ %llu\n", sim_time()); CLR_BIT(ATM128_TIMSK, TOIE0); cancel_overflow(); } bool overflowed() { return READ_BIT(ATM128_TIFR, TOV0); } inline void stabiliseOverflow() { /* From the atmel manual: During asynchronous operation, the synchronization of the interrupt flags for the asynchronous timer takes three processor cycles plus one timer cycle. The timer is therefore advanced by at least one before the processor can read the timer value causing the setting of the interrupt flag. The output compare pin is changed on the timer clock and is not synchronized to the processor clock. So: if the timer is = 0, wait till it's = 1, except if - we're currently in the overflow interrupt handler - or, the overflow flag is already set */ //if (!inOverflow) // while (!TCNT0 && !overflowed()) //; } async command bool Timer0.test() { stabiliseOverflow(); return overflowed(); } async command bool Timer0.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.toie0; } default async event void Timer0.overflow() { } AVR_ATOMIC_HANDLER(SIG_OVERFLOW0) { inOverflow = TRUE; signal Timer0.overflow(); inOverflow = FALSE; call ThreadScheduler.interruptPostAmble(); } /** * If the clock was stopped and has restarted, then * we need to move the time when the clock was last * zero to a time that reflects the current settings. * For example, if the clock was stopped when the counter * was 52 and then later restarted, then lastZero * needs to be moved forward in time so that the 52 * reflects the current time. */ void adjust_zero(uint8_t currentCounter) { sim_time_t now = sim_time(); sim_time_t adjust = currentCounter; adjust = adjust << shiftFromScale(); adjust = clock_to_sim(adjust); lastZero = now - adjust; } sim_time_t clock_to_sim(sim_time_t t) { t *= sim_ticks_per_sec(); t /= call Notify.clockTicksPerSec(); return t; } sim_time_t sim_to_clock(sim_time_t t) { t *= call Notify.clockTicksPerSec(); t /= sim_ticks_per_sec(); return t; } uint16_t shiftFromScale() { uint8_t scale = call Timer0.getScale(); switch (scale) { case 0: return 0; case 1: return 0; case 2: return 3; case 3: return 5; case 4: return 6; case 5: return 7; case 6: return 8; case 7: return 10; default: return 255; } } sim_event_t* overflow; void timer0_overflow_handle(sim_event_t* evt) { if (evt->cancelled) { return; } else { if (READ_BIT(ATM128_TIMSK, TOIE0)) { CLR_BIT(ATM128_TIFR, TOV0); dbg("HplAtm128Counter0C", "Overflow interrupt at %s\n", sim_time_string()); SIG_OVERFLOW0(); } else { dbg("HplAtm128Counter0C", "Setting overflow bit at %s\n", sim_time_string()); SET_BIT(ATM128_TIFR, TOV0); } configure_overflow(evt); sim_queue_insert(evt); } } sim_event_t* allocate_overflow() { sim_event_t* newEvent = sim_queue_allocate_event(); newEvent->handle = timer0_overflow_handle; newEvent->cleanup = sim_queue_cleanup_none; return newEvent; } void configure_overflow(sim_event_t* evt) { sim_time_t overflowTime = 0; uint8_t timerVal = call Timer0.get(); uint8_t overflowVal = 0; // Calculate how many counter increments until timer // hits compare, considering wraparound, and special // case of complete wraparound. overflowTime = ((overflowVal - timerVal) & 0xff); if (overflowTime == 0) { overflowTime = 256; } // Now convert the compare time from counter increments // to simulation ticks, considering the fact that the // increment actually has a phase offset. overflowTime = overflowTime << shiftFromScale(); overflowTime = clock_to_sim(overflowTime); overflowTime += sim_time(); overflowTime -= (sim_time() - last_zero()) % (1 << shiftFromScale()); dbg("HplAtm128Counter0C", "Scheduling new overflow for %i at time %llu\n", sim_node(), overflowTime); evt->time = overflowTime; } void schedule_new_overflow() { sim_event_t* newEvent = allocate_overflow(); configure_overflow(newEvent); if (overflow != NULL) { cancel_overflow(); } overflow = newEvent; sim_queue_insert(newEvent); } void cancel_overflow() { if (overflow != NULL) { overflow->cancelled = 1; dbg("HplAtm128Counter0C", "Cancelling overflow %p.\n", overflow); overflow->cleanup = sim_queue_cleanup_total; } } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/sim/HplAtm128Counter2C.nc000066400000000000000000000264621207233610700261270ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM implementation of the Atm128 Timer2 counter. It handles * overflow, scaling, and phase considerations. * * @date November 22 2005 * * @author Philip Levis * @author Martin Turon * @author David Gay */ // $Id: HplAtm128Counter2C.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $/// $Id: HplAtm128Timer2C.nc, #include #include enum { ATM128_TIMER2_TICKSPPS = (1 << 13) }; module HplAtm128Counter2C { provides { // 8-bit Timers interface HplAtm128Timer as Timer2; interface HplAtm128TimerNotify as Notify; interface HplAtm128TimerCtrl8 as Timer2Ctrl; } uses interface ThreadScheduler; } implementation { bool inOverflow = 0; uint8_t savedCounter = 0; sim_time_t lastZero = 0; void adjust_zero(uint8_t currentCounter); void cancel_overflow(); sim_event_t* allocate_overflow(); void configure_overflow(sim_event_t* e); void schedule_new_overflow(); sim_time_t clock_to_sim(sim_time_t t); sim_time_t sim_to_clock(sim_time_t t); uint16_t shiftFromScale(); async command sim_time_t Notify.clockTicksPerSec() { return ATM128_TIMER2_TICKSPPS; } sim_time_t last_zero() { if (lastZero == 0) { lastZero = sim_mote_start_time(sim_node()); } return lastZero; } //=== Read the current timer value. =================================== async command uint8_t Timer2.get() { uint8_t rval; sim_time_t elapsed = sim_time() - last_zero(); elapsed = sim_to_clock(elapsed); elapsed = elapsed >> shiftFromScale(); rval = (uint8_t)(elapsed & 0xff); dbg("HplAtm128Counter2C", "HplAtm128Counter2C: Getting timer: %hhu\n", rval); return rval; } //=== Set/clear the current timer value. ============================== /** * Set/clear the current timer value. * * This code is pretty tricky. */ async command void Timer2.set(uint8_t newVal) { uint8_t curVal = call Timer2.get(); if (newVal == curVal) { return; } else { sim_time_t adjustment = curVal - newVal; adjustment = adjustment << shiftFromScale(); adjustment = clock_to_sim(adjustment); if (newVal < curVal) { lastZero += adjustment; } else { // newVal > curVal lastZero -= adjustment; } schedule_new_overflow(); signal Notify.changed(); } } //=== Read the current timer scale. =================================== async command uint8_t Timer2.getScale() { return TCCR2 & 0x7; } //=== Turn off the timers. ============================================ async command void Timer2.off() { call Timer2.setScale(AVR_CLOCK_OFF); savedCounter = call Timer2.get(); cancel_overflow(); signal Notify.changed(); } //=== Write a new timer scale. ======================================== async command void Timer2.setScale(uint8_t s) { Atm128TimerControl_t ctrl; uint8_t currentScale = call Timer2.getScale(); uint8_t currentCounter; dbg("HplAtm128Counter2C", "Timer2 scale set to %i\n", (int)s); if (currentScale == 0) { currentCounter = savedCounter; } else { currentCounter = call Timer2.get(); } ctrl = call Timer2Ctrl.getControl(); ctrl.bits.cs = s; call Timer2Ctrl.setControl(ctrl); if (currentScale != s) { adjust_zero(currentCounter); schedule_new_overflow(); } signal Notify.changed(); } //=== Read the control registers. ===================================== async command Atm128TimerControl_t Timer2Ctrl.getControl() { return *(Atm128TimerControl_t*)&TCCR2; } //=== Write the control registers. ==================================== async command void Timer2Ctrl.setControl( Atm128TimerControl_t x ) { TCCR2 = x.flat; } //=== Read the interrupt mask. ===================================== async command Atm128_TIMSK_t Timer2Ctrl.getInterruptMask() { return *(Atm128_TIMSK_t*)&TIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask8_2int, Atm128_TIMSK_t, uint8_t); DEFINE_UNION_CAST(TimerMask16_2int, Atm128_ETIMSK_t, uint8_t); async command void Timer2Ctrl.setInterruptMask( Atm128_TIMSK_t x ) { TIMSK = TimerMask8_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_TIFR_t Timer2Ctrl.getInterruptFlag() { return *(Atm128_TIFR_t*)&TIFR; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags8_2int, Atm128_TIFR_t, uint8_t); DEFINE_UNION_CAST(TimerFlags16_2int, Atm128_ETIFR_t, uint8_t); async command void Timer2Ctrl.setInterruptFlag( Atm128_TIFR_t x ) { TIFR = TimerFlags8_2int(x); } //=== Timer 8-bit implementation. ==================================== async command void Timer2.reset() { // Clear TOV0. On real hardware, this is a write. TIFR &= ~(1 << TOV2); } async command void Timer2.start() { SET_BIT(ATM128_TIMSK, TOIE2); dbg("HplAtm128Counter2C", "Enabling TOIE0 at %llu\n", sim_time()); schedule_new_overflow(); } async command void Timer2.stop() { dbg("HplAtm128Counter2C", "Timer stopped @ %llu\n", sim_time()); CLR_BIT(ATM128_TIMSK, TOIE2); cancel_overflow(); } bool overflowed() { return READ_BIT(ATM128_TIFR, TOV2); } inline void stabiliseOverflow() { /* From the atmel manual: During asynchronous operation, the synchronization of the interrupt flags for the asynchronous timer takes three processor cycles plus one timer cycle. The timer is therefore advanced by at least one before the processor can read the timer value causing the setting of the interrupt flag. The output compare pin is changed on the timer clock and is not synchronized to the processor clock. So: if the timer is = 0, wait till it's = 1, except if - we're currently in the overflow interrupt handler - or, the overflow flag is already set */ //if (!inOverflow) // while (!TCNT0 && !overflowed()) //; } async command bool Timer2.test() { stabiliseOverflow(); return overflowed(); } async command bool Timer2.isOn() { return (call Timer2Ctrl.getInterruptMask()).bits.toie2; } default async event void Timer2.overflow() { } AVR_ATOMIC_HANDLER(SIG_OVERFLOW2) { inOverflow = TRUE; signal Timer2.overflow(); inOverflow = FALSE; call ThreadScheduler.interruptPostAmble(); } /** * If the clock was stopped and has restarted, then * we need to move the time when the clock was last * zero to a time that reflects the current settings. * For example, if the clock was stopped when the counter * was 52 and then later restarted, then lastZero * needs to be moved forward in time so that the 52 * reflects the current time. */ void adjust_zero(uint8_t currentCounter) { sim_time_t now = sim_time(); sim_time_t adjust = currentCounter; adjust = adjust << shiftFromScale(); adjust = clock_to_sim(adjust); lastZero = now - adjust; } sim_time_t clock_to_sim(sim_time_t t) { t *= sim_ticks_per_sec(); t /= call Notify.clockTicksPerSec(); return t; } sim_time_t sim_to_clock(sim_time_t t) { t *= call Notify.clockTicksPerSec(); t /= sim_ticks_per_sec(); return t; } uint16_t shiftFromScale() { uint8_t scale = call Timer2.getScale(); switch (scale) { case 0: return 0; case 1: return 0; case 2: return 3; case 3: return 5; case 4: return 6; case 5: return 7; case 6: return 8; case 7: return 10; default: return 255; } } sim_event_t* overflow; void timer2_overflow_handle(sim_event_t* evt) { if (evt->cancelled) { return; } else { char time[128]; sim_print_now(time, 128); if (READ_BIT(ATM128_TIMSK, TOIE2)) { CLR_BIT(ATM128_TIFR, TOV2); dbg("HplAtm128Counter2C", "Overflow interrupt at %s\n", time); SIG_OVERFLOW2(); } else { dbg("HplAtm128Counter2C", "Setting overflow bit at %s\n", time); SET_BIT(ATM128_TIFR, TOV2); } configure_overflow(evt); sim_queue_insert(evt); } } sim_event_t* allocate_overflow() { sim_event_t* newEvent = sim_queue_allocate_event(); newEvent->handle = timer2_overflow_handle; newEvent->cleanup = sim_queue_cleanup_none; return newEvent; } void configure_overflow(sim_event_t* evt) { sim_time_t overflowTime = 0; uint8_t timerVal = call Timer2.get(); uint8_t overflowVal = 0; // Calculate how many counter increments until timer // hits compare, considering wraparound, and special // case of complete wraparound. overflowTime = ((overflowVal - timerVal) & 0xff); if (overflowTime == 0) { overflowTime = 256; } // Now convert the compare time from counter increments // to simulation ticks, considering the fact that the // increment actually has a phase offset. overflowTime = overflowTime << shiftFromScale(); overflowTime = clock_to_sim(overflowTime); overflowTime += sim_time(); overflowTime -= (sim_time() - last_zero()) % (1 << shiftFromScale()); dbg("HplAtm128Counter2C", "Scheduling new overflow for %i at time %llu\n", sim_node(), overflowTime); evt->time = overflowTime; } void schedule_new_overflow() { sim_event_t* newEvent = allocate_overflow(); configure_overflow(newEvent); if (overflow != NULL) { cancel_overflow(); } overflow = newEvent; sim_queue_insert(newEvent); } void cancel_overflow() { if (overflow != NULL) { overflow->cancelled = 1; dbg("HplAtm128Counter2C", "Cancelling overflow %p.\n", overflow); overflow->cleanup = sim_queue_cleanup_total; } } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/sim/HplAtm128Timer0AsyncC.nc000066400000000000000000000053321207233610700265550ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM implementation of the Atm128 Timer0. It is built from a * timer-specific counter component and a generic compare * component. The counter component has an additional simulation-only * interface to let the compare component know when its state has * changed (e.g., TCNTX was set). * * @date November 22 2005 * * @author Philip Levis * @author Martin Turon * @author David Gay */ // $Id: HplAtm128Timer0AsyncC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $/// $Id: HplAtm128Timer2C.nc, #include configuration HplAtm128Timer0AsyncC { provides { // 8-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; interface HplAtm128TimerAsync as TimerAsync; } } implementation { components HplAtm128Timer0AsyncP; Timer = HplAtm128Timer0AsyncP; TimerCtrl = HplAtm128Timer0AsyncP; Compare = HplAtm128Timer0AsyncP; TimerAsync = HplAtm128Timer0AsyncP; components TinyThreadSchedulerC; HplAtm128Timer0AsyncP.ThreadScheduler -> TinyThreadSchedulerC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/sim/HplAtm128Timer0AsyncP.nc000066400000000000000000000432041207233610700265720ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM implementation of the Atm128 Timer0 counter. It handles * overflow, scaling, and phase considerations. * * @date November 22 2005 * * @author Philip Levis * @author Martin Turon * @author David Gay */ // $Id: HplAtm128Timer0AsyncP.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $/// $Id: HplAtm128Timer2C.nc, #include #include module HplAtm128Timer0AsyncP { provides { interface HplAtm128Timer as Timer0; interface HplAtm128TimerCtrl8 as Timer0Ctrl; interface HplAtm128Compare as Compare; interface HplAtm128TimerAsync as TimerAsync; } uses interface ThreadScheduler; } implementation { bool inOverflow = 0; uint8_t savedCounter = 0; void adjust_zero(uint8_t currentCounter); void cancel_overflow(); sim_event_t* allocate_overflow(); void configure_overflow(sim_event_t* e); void schedule_new_overflow(); sim_time_t clock_to_sim(sim_time_t t); sim_time_t sim_to_clock(sim_time_t t); uint16_t shiftFromScale(); /* lastZero keeps track of the phase of the clock. It denotes the sim * time at which the underlying clock started, which is needed to * calculate when compares will occur. */ sim_time_t lastZero = 0; /** This variable is needed to keep track of when the underlying * timer starts, in order to reset lastZero. When oldScale is * AVR_CLOCK_OFF and the scale is set to something else, the * clock starts ticking. */ uint8_t oldScale = AVR_CLOCK_OFF; void adjust_zero(uint8_t currentCounter); void cancel_compare(); sim_event_t* allocate_compare(); void configure_compare(sim_event_t* e); void schedule_new_compare(); sim_time_t clock_to_sim(sim_time_t t); sim_time_t sim_to_clock(sim_time_t t); uint16_t shiftFromScale(); default async event void Compare.fired() { } AVR_ATOMIC_HANDLER(SIG_OUTPUT_COMPARE0) { //stabiliseTimer0(); signal Compare.fired(); call ThreadScheduler.interruptPostAmble(); } default async event void Timer0.overflow() { } AVR_ATOMIC_HANDLER(SIG_OVERFLOW0) { inOverflow = TRUE; signal Timer0.overflow(); inOverflow = FALSE; call ThreadScheduler.interruptPostAmble(); } sim_time_t last_zero() { if (lastZero == 0) { lastZero = sim_mote_start_time(sim_node()); } return lastZero; } void notify_changed() { uint8_t newScale = call Timer0.getScale(); if (newScale != AVR_CLOCK_OFF && oldScale == AVR_CLOCK_OFF) { lastZero = sim_time(); } oldScale = newScale; schedule_new_compare(); } sim_time_t notify_clockTicksPerSec() { return ATM128_TIMER0_TICKSPPS; } /** * If the clock was stopped and has restarted, then * we need to move the time when the clock was last * zero to a time that reflects the current settings. * For example, if the clock was stopped when the counter * was 52 and then later restarted, then lastZero * needs to be moved forward in time so that the 52 * reflects the current time. */ void adjust_zero(uint8_t currentCounter) { sim_time_t now = sim_time(); sim_time_t adjust = currentCounter; adjust = adjust << shiftFromScale(); adjust = clock_to_sim(adjust); lastZero = now - adjust; } sim_time_t clock_to_sim(sim_time_t t) { t *= sim_ticks_per_sec(); t /= notify_clockTicksPerSec(); return t; } sim_time_t sim_to_clock(sim_time_t t) { t *= notify_clockTicksPerSec(); t /= sim_ticks_per_sec(); return t; } uint16_t shiftFromScale() { uint8_t scale = call Timer0.getScale(); switch (scale) { case 0: return 0; case 1: return 0; case 2: return 3; case 3: return 5; case 4: return 6; case 5: return 7; case 6: return 8; case 7: return 10; default: return 255; } } sim_event_t* compare; void timer0_compare_handle(sim_event_t* evt) { dbg("HplAtm128Timer0AsyncP", "Beginning compare 0x%p at %s\n", evt, sim_time_string()); if (evt->cancelled) { return; } else { char timeStr[128]; sim_print_now(timeStr, 128); dbg("HplAtm128Timer0AsyncP", "Handling compare at 0x%p @ %s\n", evt, sim_time_string()); if (READ_BIT(ATM128_TCCR0, WGM01) && !READ_BIT(ATM128_TCCR0, WGM00)) { dbg("HplAtm128Timer0AsyncP", "%s: CTC is set, clear timer.\n", __FUNCTION__); call Timer0.set(0); } else { dbg("HplAtm128Timer0AsyncP", "%s: TCCR is 0x%hhx, %i, %i\n", __FUNCTION__, TCCR0, (int)READ_BIT(ATM128_TCCR0, WGM01), (int)READ_BIT(ATM128_TCCR0, WGM00)); } if (READ_BIT(ATM128_TIMSK, OCIE0)) { dbg("HplAtm128Timer0AsyncP", "TIFR is %hhx\n", TIFR); CLR_BIT(ATM128_TIFR, OCF0); dbg("HplAtm128Timer0AsyncP", "TIFR is %hhx\n", TIFR); dbg("HplAtm128Timer0AsyncP", "Compare interrupt @ %s\n", timeStr); SIG_OUTPUT_COMPARE0(); } else { SET_BIT(ATM128_TIFR, OCF0); } // If we haven't been cancelled if (!evt->cancelled) { configure_compare(evt); sim_queue_insert(evt); } } } sim_event_t* allocate_compare() { sim_event_t* newEvent = sim_queue_allocate_event(); dbg("HplAtm128Timer0AsyncP", "Allocated compare at 0x%p\n", newEvent); newEvent->handle = timer0_compare_handle; newEvent->cleanup = sim_queue_cleanup_none; return newEvent; } void configure_compare(sim_event_t* evt) { sim_time_t compareTime = 0; sim_time_t phaseOffset = 0; uint8_t timerVal = call Timer0.get(); uint8_t compareVal = call Compare.get(); // Calculate how many counter increments until timer // hits compare, considering wraparound, and special // case of complete wraparound. compareTime = ((compareVal - timerVal) & 0xff); if (compareTime == 0) { compareTime = 256; } // Now convert the compare time from counter increments // to simulation ticks, considering the fact that the // increment actually has a phase offset. // The +1 is from the timer behavior: if you set OCR0 to be X, // it will actually fire when TCNT is X+1 compareTime = (compareTime + 1) << shiftFromScale(); compareTime = clock_to_sim(compareTime); compareTime += sim_time(); // How long into a timer tick was the clock actually reset? // This covers the case when the compare is set midway between // a tick, so it will go off a little early phaseOffset = sim_time(); phaseOffset -= last_zero(); phaseOffset %= clock_to_sim(1 << shiftFromScale()); compareTime -= phaseOffset; dbg("HplAtm128Timer0AsyncP", "Configuring new compare of %i for %i at time %llu (@ %llu)\n", (int)compareVal, sim_node(), compareTime, sim_time()); evt->time = compareTime; } void schedule_new_compare() { if (compare != NULL) { cancel_compare(); } if (call Timer0.getScale() != AVR_CLOCK_OFF) { sim_event_t* newEvent = allocate_compare(); configure_compare(newEvent); compare = newEvent; sim_queue_insert(newEvent); } } //=== Read the current timer value. =================================== async command uint8_t Timer0.get() { uint8_t rval; sim_time_t elapsed = sim_time() - last_zero(); elapsed = sim_to_clock(elapsed); elapsed = elapsed >> shiftFromScale(); rval = (uint8_t)(elapsed & 0xff); dbg("HplAtm128Timer0AsyncP", "HplAtm128Timer0AsyncP: Getting timer: %hhu\n", rval); return rval; } //=== Set/clear the current timer value. ============================== /** * Set/clear the current timer value. * * This code is pretty tricky. */ async command void Timer0.set(uint8_t newVal) { uint8_t curVal = call Timer0.get(); dbg("HplAtm128Timer0AsyncP", "HplAtm128Timer0AsyncP: Setting timer: %hhu\n", newVal); if (newVal == curVal) { return; } else { sim_time_t adjustment = curVal - newVal; adjustment = adjustment << shiftFromScale(); adjustment = clock_to_sim(adjustment); if (newVal < curVal) { lastZero += adjustment; } else { // newVal > curVal lastZero -= adjustment; } schedule_new_overflow(); notify_changed(); } } //=== Read the current timer scale. =================================== async command uint8_t Timer0.getScale() { return TCCR0 & 0x7; } //=== Turn off the timers. ============================================ async command void Timer0.off() { call Timer0.setScale(AVR_CLOCK_OFF); savedCounter = call Timer0.get(); cancel_overflow(); notify_changed(); } //=== Write a new timer scale. ======================================== async command void Timer0.setScale(uint8_t s) { Atm128TimerControl_t ctrl; uint8_t currentScale = call Timer0.getScale(); uint8_t currentCounter; dbg("HplAtm128Timer0AsyncP", "Timer0 scale set to %i\n", (int)s); if (currentScale == 0) { currentCounter = savedCounter; } else { currentCounter = call Timer0.get(); } ctrl = call Timer0Ctrl.getControl(); ctrl.flat &= ~(0x7); ctrl.flat |= (s & 0x7); call Timer0Ctrl.setControl(ctrl); if (currentScale != s) { adjust_zero(currentCounter); schedule_new_overflow(); } notify_changed(); } //=== Read the control registers. ===================================== async command Atm128TimerControl_t Timer0Ctrl.getControl() { return *(Atm128TimerControl_t*)&TCCR0; } //=== Write the control registers. ==================================== async command void Timer0Ctrl.setControl( Atm128TimerControl_t x ) { dbg("HplAtm128Timer0AsyncP", "Setting control to be 0x%hhx\n", x.flat); TCCR0 = x.flat; } //=== Read the interrupt mask. ===================================== async command Atm128_TIMSK_t Timer0Ctrl.getInterruptMask() { return *(Atm128_TIMSK_t*)&TIMSK; } //=== Write the interrupt mask. ==================================== DEFINE_UNION_CAST(TimerMask8_2int, Atm128_TIMSK_t, uint8_t); DEFINE_UNION_CAST(TimerMask16_2int, Atm128_ETIMSK_t, uint8_t); async command void Timer0Ctrl.setInterruptMask( Atm128_TIMSK_t x ) { TIMSK = TimerMask8_2int(x); } //=== Read the interrupt flags. ===================================== async command Atm128_TIFR_t Timer0Ctrl.getInterruptFlag() { Atm128_TIFR_t at; at.flat = TIFR; return at; } //=== Write the interrupt flags. ==================================== DEFINE_UNION_CAST(TimerFlags8_2int, Atm128_TIFR_t, uint8_t); DEFINE_UNION_CAST(TimerFlags16_2int, Atm128_ETIFR_t, uint8_t); async command void Timer0Ctrl.setInterruptFlag( Atm128_TIFR_t x ) { TIFR = TimerFlags8_2int(x); } //=== Timer 8-bit implementation. ==================================== async command void Timer0.reset() { // Clear TOV0. On real hardware, this is a write. TIFR &= ~(1 << TOV0); } async command void Timer0.start() { SET_BIT(ATM128_TIMSK, TOIE0); dbg("HplAtm128Timer0AsyncP", "Enabling TOIE0 at %llu\n", sim_time()); schedule_new_overflow(); } async command void Timer0.stop() { dbg("HplAtm128Timer0AsyncP", "Timer stopped @ %llu\n", sim_time()); CLR_BIT(ATM128_TIMSK, TOIE0); cancel_overflow(); } bool overflowed() { return READ_BIT(ATM128_TIFR, TOV0); } inline void stabiliseOverflow() { /* From the atmel manual: During asynchronous operation, the synchronization of the interrupt flags for the asynchronous timer takes three processor cycles plus one timer cycle. The timer is therefore advanced by at least one before the processor can read the timer value causing the setting of the interrupt flag. The output compare pin is changed on the timer clock and is not synchronized to the processor clock. So: if the timer is = 0, wait till it's = 1, except if - we're currently in the overflow interrupt handler - or, the overflow flag is already set */ //if (!inOverflow) // while (!TCNT0 && !overflowed()) //; } async command bool Timer0.test() { stabiliseOverflow(); return overflowed(); } async command bool Timer0.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.toie0; } async command void Compare.reset() { TIFR = 1 << OCF0; } async command void Compare.start() { SET_BIT(ATM128_TIMSK,OCIE0); } async command void Compare.stop() { CLR_BIT(ATM128_TIMSK,OCIE0); } async command bool Compare.test() { return (call Timer0Ctrl.getInterruptFlag()).bits.ocf0; } async command bool Compare.isOn() { return (call Timer0Ctrl.getInterruptMask()).bits.ocie0; } //=== Read the compare registers. ===================================== async command uint8_t Compare.get() { dbg("HplAtm128Timer0AsyncP", "HplAtm128Timer0AsyncP: Getting compare: %hhu\n", OCR0); return OCR0; } //=== Write the compare registers. ==================================== async command void Compare.set(uint8_t t) { dbg("HplAtm128Timer0AsyncP", "HplAtm128Timer0AsyncP: Setting compare: %hhu\n", t); atomic { /* Re the comment above: it's a bad idea to wake up at time 0, as we'll just spin when setting the next deadline. Try and reduce the likelihood by delaying the interrupt... */ if (t == 0 || t >= 0xfe) t = 1; if (t != OCR0) { OCR0 = t; schedule_new_compare(); } } } sim_event_t* overflow; void timer0_overflow_handle(sim_event_t* evt) { if (evt->cancelled) { return; } else { if (READ_BIT(ATM128_TIMSK, TOIE0)) { CLR_BIT(ATM128_TIFR, TOV0); dbg("HplAtm128Timer0AsyncP", "Overflow interrupt at %s\n", sim_time_string()); SIG_OVERFLOW0(); } else { dbg("HplAtm128Timer0AsyncP", "Setting overflow bit at %s\n", sim_time_string()); SET_BIT(ATM128_TIFR, TOV0); } configure_overflow(evt); sim_queue_insert(evt); } } sim_event_t* allocate_overflow() { sim_event_t* newEvent = sim_queue_allocate_event(); newEvent->handle = timer0_overflow_handle; newEvent->cleanup = sim_queue_cleanup_none; return newEvent; } void configure_overflow(sim_event_t* evt) { sim_time_t overflowTime = 0; uint8_t timerVal = call Timer0.get(); uint8_t overflowVal = 0; // Calculate how many counter increments until timer // hits compare, considering wraparound, and special // case of complete wraparound. overflowTime = ((overflowVal - timerVal) & 0xff); if (overflowTime == 0) { overflowTime = 256; } // Now convert the compare time from counter increments // to simulation ticks, considering the fact that the // increment actually has a phase offset. overflowTime = overflowTime << shiftFromScale(); overflowTime = clock_to_sim(overflowTime); overflowTime += sim_time(); overflowTime -= (sim_time() - last_zero()) % (1 << shiftFromScale()); dbg("HplAtm128Timer0AsyncP", "Scheduling new overflow for %i at time %llu\n", sim_node(), overflowTime); evt->time = overflowTime; } void schedule_new_overflow() { sim_event_t* newEvent = allocate_overflow(); configure_overflow(newEvent); if (overflow != NULL) { cancel_overflow(); } overflow = newEvent; sim_queue_insert(newEvent); } void cancel_overflow() { if (overflow != NULL) { overflow->cancelled = 1; dbg("HplAtm128Timer0AsyncP", "Cancelling overflow %p.\n", overflow); overflow->cleanup = sim_queue_cleanup_total; } } async command Atm128Assr_t TimerAsync.getAssr() { return *(Atm128Assr_t *)&ASSR; } async command void TimerAsync.setAssr(Atm128Assr_t x) { ASSR = x.flat; } async command void TimerAsync.setTimer0Asynchronous() { ASSR |= 1 << AS0; } async command int TimerAsync.controlBusy() { return (ASSR & (1 << TCR0UB)) != 0; } async command int TimerAsync.compareBusy() { return (ASSR & (1 << OCR0UB)) != 0; } async command int TimerAsync.countBusy() { return (ASSR & (1 << TCN0UB)) != 0; } void cancel_compare() { dbg("HplAtm128CompareC", "Cancelling compare at 0x%p\n", compare); if (compare != NULL) { compare->cancelled = 1; compare->cleanup = sim_queue_cleanup_total; } } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm128/sim/HplAtm128Timer2C.nc000066400000000000000000000057331207233610700255660ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TOSSIM implementation of the Atm128 Timer2. It is built from a * timer-specific counter component and a generic compare * component. The counter component has an additional simulation-only * interface to let the compare component know when its state has * changed (e.g., TCNTX was set). * * @date November 22 2005 * * @author Philip Levis * @author Martin Turon * @author David Gay */ // $Id: HplAtm128Timer2C.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $/// $Id: HplAtm128Timer2C.nc, #include configuration HplAtm128Timer2C { provides { // 8-bit Timers interface HplAtm128Timer as Timer2; interface HplAtm128TimerCtrl8 as Timer2Ctrl; interface HplAtm128Compare as Compare2; } uses interface ThreadScheduler; } implementation { components HplAtm128Counter0C, new HplAtm128CompareC(uint8_t, ATM128_OCR2, ATM128_TIMSK, OCIE2, ATM128_TIFR, OCF2); Timer2 = HplAtm128Counter2C; Timer2Ctrl = HplAtm128Counter2C; Compare2 = HplAtm128CompareC; HplAtm128CompareC.Timer -> HplAtm128Counter2C; HplAtm128CompareC.TimerCtrl -> HplAtm128Counter2C; HplAtm128CompareC.Notify -> HplAtm128Counter2C; components TinyThreadSchedulerC; HplAtm128Counter0C.ThreadScheduler -> TinyThreadSchedulerC; HplAtm128CompareC.ThreadScheduler -> TinyThreadSchedulerC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm1281/000077500000000000000000000000001207233610700217175ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm1281/HplAtm1281Timer1P.nc000066400000000000000000000233541207233610700251530ustar00rootroot00000000000000 /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Internal component of the HPL interface to Atmega1281 timer 1. * * @author Martin Turon * @author Janos Sallai */ #include module HplAtm1281Timer1P { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as CompareA; interface HplAtm128Compare as CompareB; interface HplAtm128Compare as CompareC; } uses interface PlatformInterrupt; } implementation { //=== Read the current timer value. =================================== async command uint16_t Timer.get() { return TCNT1; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint16_t t) { TCNT1 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR1B & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128_TCCRB_t x = (Atm128_TCCRB_t) call TimerCtrl.getControlB(); x.bits.cs = s; call TimerCtrl.setControlB(x.flat); } //=== Read the control registers. ===================================== async command uint8_t TimerCtrl.getControlA() { return TCCR1A; } async command uint8_t TimerCtrl.getControlB() { return TCCR1B; } async command uint8_t TimerCtrl.getControlC() { return TCCR1C; } //=== Write the control registers. ==================================== async command void TimerCtrl.setControlA( uint8_t x ) { TCCR1A = x; } async command void TimerCtrl.setControlB( uint8_t x ) { TCCR1B = x; } async command void TimerCtrl.setControlC( uint8_t x ) { TCCR1C = x; } //=== Read the interrupt mask. ===================================== async command uint8_t TimerCtrl.getInterruptMask() { return TIMSK1; } //=== Write the interrupt mask. ==================================== async command void TimerCtrl.setInterruptMask( uint8_t x ) { TIMSK1 = x; } //=== Read the interrupt flags. ===================================== async command uint8_t TimerCtrl.getInterruptFlag() { return TIFR1; } //=== Write the interrupt flags. ==================================== async command void TimerCtrl.setInterruptFlag( uint8_t x ) { TIFR1 = x; } //=== Capture 16-bit implementation. =================================== async command void Capture.setEdge(bool up) { WRITE_BIT(TCCR1B,ICES1, up); } //=== Timer 16-bit implementation. =================================== async command void Timer.reset() { TIFR1 = 1 << TOV1; } async command void Capture.reset() { TIFR1 = 1 << ICF1; } async command void CompareA.reset() { TIFR1 = 1 << OCF1A; } async command void CompareB.reset() { TIFR1 = 1 << OCF1B; } async command void CompareC.reset() { TIFR1 = 1 << OCF1C; } async command void Timer.start() { SET_BIT(TIMSK1,TOIE1); } async command void Capture.start() { SET_BIT(TIMSK1,ICIE1); } async command void CompareA.start() { SET_BIT(TIMSK1,OCIE1A); } async command void CompareB.start() { SET_BIT(TIMSK1,OCIE1B); } async command void CompareC.start() { SET_BIT(TIMSK1,OCIE1C); } async command void Timer.stop() { CLR_BIT(TIMSK1,TOIE1); } async command void Capture.stop() { CLR_BIT(TIMSK1,ICIE1); } async command void CompareA.stop() { CLR_BIT(TIMSK1,OCIE1A); } async command void CompareB.stop() { CLR_BIT(TIMSK1,OCIE1B); } async command void CompareC.stop() { CLR_BIT(TIMSK1,OCIE1C); } async command bool Timer.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.tov; } async command bool Capture.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.icf; } async command bool CompareA.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.ocfa; } async command bool CompareB.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.ocfb; } async command bool CompareC.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.ocfc; } async command bool Timer.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.toie; } async command bool Capture.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.icie; } async command bool CompareA.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.ociea; } async command bool CompareB.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.ocieb; } async command bool CompareC.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.ociec; } //=== Read the compare registers. ===================================== async command uint16_t CompareA.get() { return OCR1A; } async command uint16_t CompareB.get() { return OCR1B; } async command uint16_t CompareC.get() { return OCR1C; } //=== Write the compare registers. ==================================== async command void CompareA.set(uint16_t t) { OCR1A = t; } async command void CompareB.set(uint16_t t) { OCR1B = t; } async command void CompareC.set(uint16_t t) { OCR1C = t; } //=== Read the capture registers. ===================================== async command uint16_t Capture.get() { return ICR1; } //=== Write the capture registers. ==================================== async command void Capture.set(uint16_t t) { ICR1 = t; } //=== Timer interrupts signals ======================================== default async event void CompareA.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE1A) { signal CompareA.fired(); call PlatformInterrupt.postAmble(); } default async event void CompareB.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE1B) { signal CompareB.fired(); call PlatformInterrupt.postAmble(); } default async event void CompareC.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE1C) { signal CompareC.fired(); call PlatformInterrupt.postAmble(); } default async event void Capture.captured(uint16_t time) { } AVR_NONATOMIC_HANDLER(SIG_INPUT_CAPTURE1) { signal Capture.captured(call Timer.get()); call PlatformInterrupt.postAmble(); } default async event void Timer.overflow() { } AVR_NONATOMIC_HANDLER(SIG_OVERFLOW1) { signal Timer.overflow(); call PlatformInterrupt.postAmble(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm1281/HplAtm1281Timer2AsyncC.nc000066400000000000000000000101571207233610700261320ustar00rootroot00000000000000/// $Id: HplAtm1281Timer2AsyncC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Simple wrapper around the actual timer implementation that automatically * wires it to McuSleepC for low-power calculations.. * * @author Philip Levis * @author David Gay * @author Janos Sallai */ #include configuration HplAtm1281Timer2AsyncC { provides { // 8-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; interface HplAtm128TimerAsync as TimerAsync; } } implementation { components HplAtm1281Timer2AsyncP; components McuSleepC; McuSleepC.McuPowerOverride -> HplAtm1281Timer2AsyncP; Timer = HplAtm1281Timer2AsyncP; TimerCtrl = HplAtm1281Timer2AsyncP; Compare = HplAtm1281Timer2AsyncP; TimerAsync = HplAtm1281Timer2AsyncP; components PlatformInterruptC; HplAtm1281Timer2AsyncP.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm1281/HplAtm1281Timer2AsyncP.nc000066400000000000000000000236661207233610700261600ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * HPL interface to Atmega1281 timer 2 in ASYNC mode. This is a specialised * HPL component that assumes that timer 2 is used in ASYNC mode and * includes some workarounds for some of the weirdnesses (delayed overflow * interrupt) of that mode. * * @author Martin Turon * @author David Gay * @author Janos Sallai */ #include module HplAtm1281Timer2AsyncP { provides { // 8-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl8 as TimerCtrl; interface HplAtm128Compare as Compare; interface McuPowerOverride; interface HplAtm128TimerAsync as TimerAsync; } uses interface PlatformInterrupt; } implementation { // bool inOverflow; // command error_t Init.init() { // SET_BIT(ASSR, AS2); // set Timer/Counter2 to asynchronous mode // return SUCCESS; // } //=== Read the current timer value. =================================== async command uint8_t Timer.get() { return TCNT2; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint8_t t) { while (ASSR & 1 << TCN2UB) ; TCNT2 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR2B & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128_TCCR2B_t x = (Atm128_TCCR2B_t) call TimerCtrl.getControlB(); x.bits.cs = s; call TimerCtrl.setControlB(x.flat); } //=== Read the control registers. ===================================== async command uint8_t TimerCtrl.getControlA() { return TCCR2A; } async command uint8_t TimerCtrl.getControlB() { return TCCR2B; } //=== Write the control registers. ==================================== async command void TimerCtrl.setControlA( uint8_t x ) { while (ASSR & 1 << TCR2AUB) ; TCCR2A = ((Atm128_TCCR2A_t)x).flat; } async command void TimerCtrl.setControlB( uint8_t x ) { while (ASSR & 1 << TCR2BUB) ; TCCR2B = ((Atm128_TCCR2B_t)x).flat; } //=== Read the interrupt mask. ===================================== async command uint8_t TimerCtrl.getInterruptMask() { return TIMSK2; } //=== Write the interrupt mask. ==================================== async command void TimerCtrl.setInterruptMask( uint8_t x ) { TIMSK2 = x; } //=== Read the interrupt flags. ===================================== async command uint8_t TimerCtrl.getInterruptFlag() { return TIFR2; } //=== Write the interrupt flags. ==================================== async command void TimerCtrl.setInterruptFlag( uint8_t x ) { TIFR2 = x; } //=== Timer 8-bit implementation. ==================================== async command void Timer.reset() { TIFR2 = 1 << TOV2; } async command void Timer.start() { SET_BIT(TIMSK2, TOIE2); } async command void Timer.stop() { CLR_BIT(TIMSK2, TOIE2); } bool overflowed() { return ((Atm128_TIFR2_t)call TimerCtrl.getInterruptFlag()).bits.tov; } async command bool Timer.test() { return overflowed(); } async command bool Timer.isOn() { return ((Atm128_TIMSK2_t)call TimerCtrl.getInterruptMask()).bits.toie; } async command void Compare.reset() { TIFR2 = 1 << OCF2A; } async command void Compare.start() { SET_BIT(TIMSK2,OCIE2A); } async command void Compare.stop() { CLR_BIT(TIMSK2,OCIE2A); } async command bool Compare.test() { return ((Atm128_TIFR2_t)call TimerCtrl.getInterruptFlag()).bits.ocfa; } async command bool Compare.isOn() { return ((Atm128_TIMSK2_t)call TimerCtrl.getInterruptMask()).bits.ociea; } //=== Read the compare registers. ===================================== async command uint8_t Compare.get(){ return OCR2A; } //=== Write the compare registers. ==================================== async command void Compare.set(uint8_t t) { atomic { while (ASSR & 1 << OCR2AUB) ; OCR2A = t; } } //=== Timer interrupts signals ======================================== inline void stabiliseTimer2() { TCCR2A = TCCR2A; while (ASSR & 1 << TCR2AUB) ; } /** * On the atm128, there is a small latency when waking up from * POWER_SAVE mode. So if a timer is going to go off very soon, it's * better to drop down until EXT_STANDBY, which has a 6 cycle wakeup * latency. This function calculates whether staying in EXT_STANDBY * is needed. If the timer is not running it returns POWER_DOWN. * Please refer to TEP 112 and the atm128 datasheet for details. */ async command mcu_power_t McuPowerOverride.lowestState() { uint8_t diff; // We need to make sure that the sleep wakeup latency will not // cause us to miss a timer. POWER_SAVE if (TIMSK2 & (1 << OCIE2A | 1 << TOIE2)) { // need to wait for timer 2 updates propagate before sleeping // (we don't need to worry about reentering sleep mode too early, // as the wake ups from timer2 wait at least one TOSC1 cycle // anyway - see the stabiliseTimer2 function) while (ASSR & (1 << TCN2UB | 1 << OCR2AUB | 1 << TCR2AUB)) ; diff = OCR2A - TCNT2; if (diff < EXT_STANDBY_T0_THRESHOLD || TCNT2 > 256 - EXT_STANDBY_T0_THRESHOLD) return ATM128_POWER_EXT_STANDBY; return ATM128_POWER_SAVE; } else { return ATM128_POWER_DOWN; } } default async event void Compare.fired() { } AVR_ATOMIC_HANDLER(SIG_OUTPUT_COMPARE2A) { stabiliseTimer2(); // __nesc_enable_interrupt(); signal Compare.fired(); call PlatformInterrupt.postAmble(); } default async event void Timer.overflow() { } AVR_ATOMIC_HANDLER(SIG_OVERFLOW2) { stabiliseTimer2(); // inOverflow = TRUE; signal Timer.overflow(); // inOverflow = FALSE; call PlatformInterrupt.postAmble(); } // Asynchronous status register support async command Atm128_ASSR_t TimerAsync.getAssr() { return *(Atm128_ASSR_t *)&ASSR; } async command void TimerAsync.setAssr(Atm128_ASSR_t x) { ASSR = x.flat; } async command void TimerAsync.setTimer2Asynchronous() { ASSR |= 1 << AS2; } async command int TimerAsync.controlABusy() { return (ASSR & (1 << TCR2AUB)) != 0; } async command int TimerAsync.controlBBusy() { return (ASSR & (1 << TCR2BUB)) != 0; } async command int TimerAsync.compareABusy() { return (ASSR & (1 << OCR2AUB)) != 0; } async command int TimerAsync.compareBBusy() { return (ASSR & (1 << OCR2BUB)) != 0; } async command int TimerAsync.countBusy() { return (ASSR & (1 << TCN2UB)) != 0; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm1281/HplAtm1281Timer3P.nc000066400000000000000000000233551207233610700251560ustar00rootroot00000000000000 /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Internal component of the HPL interface to Atmega1281 timer 3. * * @author Martin Turon * @author Janos Sallai */ #include module HplAtm1281Timer3P { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as CompareA; interface HplAtm128Compare as CompareB; interface HplAtm128Compare as CompareC; } uses interface PlatformInterrupt; } implementation { //=== Read the current timer value. =================================== async command uint16_t Timer.get() { return TCNT3; } //=== Set/clear the current timer value. ============================== async command void Timer.set(uint16_t t) { TCNT3 = t; } //=== Read the current timer scale. =================================== async command uint8_t Timer.getScale() { return TCCR3B & 0x7; } //=== Turn off the timers. ============================================ async command void Timer.off() { call Timer.setScale(AVR_CLOCK_OFF); } //=== Write a new timer scale. ======================================== async command void Timer.setScale(uint8_t s) { Atm128_TCCRB_t x = (Atm128_TCCRB_t) call TimerCtrl.getControlB(); x.bits.cs = s; call TimerCtrl.setControlB(x.flat); } //=== Read the control registers. ===================================== async command uint8_t TimerCtrl.getControlA() { return TCCR3A; } async command uint8_t TimerCtrl.getControlB() { return TCCR3B; } async command uint8_t TimerCtrl.getControlC() { return TCCR3C; } //=== Write the control registers. ==================================== async command void TimerCtrl.setControlA( uint8_t x ) { TCCR3A = x; } async command void TimerCtrl.setControlB( uint8_t x ) { TCCR3B = x; } async command void TimerCtrl.setControlC( uint8_t x ) { TCCR3C = x; } //=== Read the interrupt mask. ===================================== async command uint8_t TimerCtrl.getInterruptMask() { return TIMSK3; } //=== Write the interrupt mask. ==================================== async command void TimerCtrl.setInterruptMask( uint8_t x ) { TIMSK3 = x; } //=== Read the interrupt flags. ===================================== async command uint8_t TimerCtrl.getInterruptFlag() { return TIFR3; } //=== Write the interrupt flags. ==================================== async command void TimerCtrl.setInterruptFlag( uint8_t x ) { TIFR3 = x; } //=== Capture 16-bit implementation. =================================== async command void Capture.setEdge(bool up) { WRITE_BIT(TCCR3B, ICES3, up); } //=== Timer 16-bit implementation. =================================== async command void Timer.reset() { TIFR3 = 1 << TOV3; } async command void Capture.reset() { TIFR3 = 1 << ICF3; } async command void CompareA.reset() { TIFR3 = 1 << OCF3A; } async command void CompareB.reset() { TIFR3 = 1 << OCF3B; } async command void CompareC.reset() { TIFR3 = 1 << OCF3C; } async command void Timer.start() { SET_BIT(TIMSK3,TOIE3); } async command void Capture.start() { SET_BIT(TIMSK3,ICIE3); } async command void CompareA.start() { SET_BIT(TIMSK3,OCIE3A); } async command void CompareB.start() { SET_BIT(TIMSK3,OCIE3B); } async command void CompareC.start() { SET_BIT(TIMSK3,OCIE3C); } async command void Timer.stop() { CLR_BIT(TIMSK3,TOIE3); } async command void Capture.stop() { CLR_BIT(TIMSK3,ICIE3); } async command void CompareA.stop() { CLR_BIT(TIMSK3,OCIE3A); } async command void CompareB.stop() { CLR_BIT(TIMSK3,OCIE3B); } async command void CompareC.stop() { CLR_BIT(TIMSK3,OCIE3C); } async command bool Timer.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.tov; } async command bool Capture.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.icf; } async command bool CompareA.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.ocfa; } async command bool CompareB.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.ocfb; } async command bool CompareC.test() { return ((Atm128_TIFR_t)call TimerCtrl.getInterruptFlag()).bits.ocfc; } async command bool Timer.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.toie; } async command bool Capture.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.icie; } async command bool CompareA.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.ociea; } async command bool CompareB.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.ocieb; } async command bool CompareC.isOn() { return ((Atm128_TIMSK_t)call TimerCtrl.getInterruptMask()).bits.ociec; } //=== Read the compare registers. ===================================== async command uint16_t CompareA.get() { return OCR3A; } async command uint16_t CompareB.get() { return OCR3B; } async command uint16_t CompareC.get() { return OCR3C; } //=== Write the compare registers. ==================================== async command void CompareA.set(uint16_t t) { OCR3A = t; } async command void CompareB.set(uint16_t t) { OCR3B = t; } async command void CompareC.set(uint16_t t) { OCR3C = t; } //=== Read the capture registers. ===================================== async command uint16_t Capture.get() { return ICR3; } //=== Write the capture registers. ==================================== async command void Capture.set(uint16_t t) { ICR3 = t; } //=== Timer interrupts signals ======================================== default async event void CompareA.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE3A) { signal CompareA.fired(); call PlatformInterrupt.postAmble(); } default async event void CompareB.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE3B) { signal CompareB.fired(); call PlatformInterrupt.postAmble(); } default async event void CompareC.fired() { } AVR_NONATOMIC_HANDLER(SIG_OUTPUT_COMPARE3C) { signal CompareC.fired(); call PlatformInterrupt.postAmble(); } default async event void Capture.captured(uint16_t time) { } AVR_NONATOMIC_HANDLER(SIG_INPUT_CAPTURE3) { signal Capture.captured(call Timer.get()); call PlatformInterrupt.postAmble(); } default async event void Timer.overflow() { } AVR_NONATOMIC_HANDLER(SIG_OVERFLOW3) { signal Timer.overflow(); call PlatformInterrupt.postAmble(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm1281/HplAtm128AdcP.nc000066400000000000000000000153551207233610700244220ustar00rootroot00000000000000/// $Id: HplAtm128AdcP.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "Atm128Adc.h" /** * HPL for the Atmega1281 A/D conversion susbsystem. * * @author Martin Turon * @author Hu Siquan * @author David Gay * @author Janos Sallai */ module HplAtm128AdcP { provides interface HplAtm128Adc; uses interface McuPowerState; uses interface PlatformInterrupt; } implementation { //=== Direct read of HW registers. ================================= async command Atm128Admux_t HplAtm128Adc.getAdmux() { return *(Atm128Admux_t*)&ADMUX; } async command Atm128Adcsra_t HplAtm128Adc.getAdcsra() { return *(Atm128Adcsra_t*)&ADCSRA; } async command uint16_t HplAtm128Adc.getValue() { return ADC; } DEFINE_UNION_CAST(Admux2int, Atm128Admux_t, uint8_t); DEFINE_UNION_CAST(Adcsra2int, Atm128Adcsra_t, uint8_t); //=== Direct write of HW registers. ================================ async command void HplAtm128Adc.setAdmux( Atm128Admux_t x ) { ADMUX = Admux2int(x); } async command void HplAtm128Adc.setAdcsra( Atm128Adcsra_t x ) { ADCSRA = Adcsra2int(x); } async command void HplAtm128Adc.setPrescaler(uint8_t scale){ Atm128Adcsra_t current_val = call HplAtm128Adc.getAdcsra(); current_val.adif = FALSE; current_val.adps = scale; call HplAtm128Adc.setAdcsra(current_val); } // Individual bit manipulation. These all clear any pending A/D interrupt. // It's not clear these are that useful... async command void HplAtm128Adc.enableAdc() { SET_BIT(ADCSRA, ADEN); call McuPowerState.update(); } async command void HplAtm128Adc.disableAdc() { CLR_BIT(ADCSRA, ADEN); call McuPowerState.update(); } async command void HplAtm128Adc.enableInterruption() { SET_BIT(ADCSRA, ADIE); } async command void HplAtm128Adc.disableInterruption() { CLR_BIT(ADCSRA, ADIE); } async command void HplAtm128Adc.setContinuous() { ((Atm128Adcsrb_t*)&ADCSRB)->adts = 0; SET_BIT(ADCSRA, ADATE); } async command void HplAtm128Adc.setSingle() { CLR_BIT(ADCSRA, ADATE); } async command void HplAtm128Adc.resetInterrupt() { SET_BIT(ADCSRA, ADIF); } async command void HplAtm128Adc.startConversion() { SET_BIT(ADCSRA, ADSC); } /* A/D status checks */ async command bool HplAtm128Adc.isEnabled() { return (call HplAtm128Adc.getAdcsra()).aden; } async command bool HplAtm128Adc.isStarted() { return (call HplAtm128Adc.getAdcsra()).adsc; } async command bool HplAtm128Adc.isComplete() { return (call HplAtm128Adc.getAdcsra()).adif; } /* A/D interrupt handlers. Signals dataReady event with interrupts enabled */ AVR_ATOMIC_HANDLER(SIG_ADC) { uint16_t data = call HplAtm128Adc.getValue(); __nesc_enable_interrupt(); signal HplAtm128Adc.dataReady(data); call PlatformInterrupt.postAmble(); } default async event void HplAtm128Adc.dataReady(uint16_t done) { } async command bool HplAtm128Adc.cancel() { /* This is tricky */ atomic { Atm128Adcsra_t oldSr = call HplAtm128Adc.getAdcsra(), newSr; /* To cancel a conversion, first turn off ADEN, then turn off ADSC. We also cancel any pending interrupt. Finally we reenable the ADC. */ newSr = oldSr; newSr.aden = FALSE; newSr.adif = TRUE; /* This clears a pending interrupt... */ newSr.adie = FALSE; /* We don't want to start sampling again at the next sleep */ call HplAtm128Adc.setAdcsra(newSr); newSr.adsc = FALSE; call HplAtm128Adc.setAdcsra(newSr); newSr.aden = TRUE; call HplAtm128Adc.setAdcsra(newSr); return oldSr.adif || oldSr.adsc; } } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm1281/HplAtm128Timer1C.nc000066400000000000000000000100361207233610700250460ustar00rootroot00000000000000/// $Id: HplAtm128Timer1C.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * HPL interface to Atmega1281 timer 1. * * @author Martin Turon * @author David Gay * @author Janos Sallai */ configuration HplAtm128Timer1C { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as Compare[uint8_t id]; } } implementation { components HplAtm1281Timer1P; Timer = HplAtm1281Timer1P; TimerCtrl = HplAtm1281Timer1P; Capture = HplAtm1281Timer1P; Compare[0] = HplAtm1281Timer1P.CompareA; Compare[1] = HplAtm1281Timer1P.CompareB; Compare[2] = HplAtm1281Timer1P.CompareC; components PlatformInterruptC; HplAtm1281Timer1P.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm1281/HplAtm128Timer3C.nc000066400000000000000000000100361207233610700250500ustar00rootroot00000000000000/// $Id: HplAtm128Timer3C.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * HPL interface to Atmega1281 timer 3. * * @author Martin Turon * @author David Gay * @author Janos Sallai */ configuration HplAtm128Timer3C { provides { // 16-bit Timers interface HplAtm128Timer as Timer; interface HplAtm128TimerCtrl16 as TimerCtrl; interface HplAtm128Capture as Capture; interface HplAtm128Compare as Compare[uint8_t id]; } } implementation { components HplAtm1281Timer3P; Timer = HplAtm1281Timer3P; TimerCtrl = HplAtm1281Timer3P; Capture = HplAtm1281Timer3P; Compare[0] = HplAtm1281Timer3P.CompareA; Compare[1] = HplAtm1281Timer3P.CompareB; Compare[2] = HplAtm1281Timer3P.CompareC; components PlatformInterruptC; HplAtm1281Timer3P.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/atm1281/HplAtm128UartP.nc000066400000000000000000000240761207233610700246460ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Alec Woo * @author Jonathan Hui * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:51 $ */ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Private component of the Atmega1281 serial port HPL. * * @author Martin Turon * @author David Gay * @author Janos Sallai */ #include module HplAtm128UartP { provides interface Init as Uart0Init; provides interface StdControl as Uart0TxControl; provides interface StdControl as Uart0RxControl; provides interface HplAtm128Uart as HplUart0; provides interface Init as Uart1Init; provides interface StdControl as Uart1TxControl; provides interface StdControl as Uart1RxControl; provides interface HplAtm128Uart as HplUart1; uses interface Atm128Calibrate; uses interface McuPowerState; uses interface PlatformInterrupt; } implementation { //=== Uart Init Commands. ==================================== command error_t Uart0Init.init() { Atm128UartMode_t mode; Atm128UartStatus_t stts; Atm128UartControl_t ctrl; uint16_t ubrr0; ctrl.bits = (struct Atm128_UCSRB_t) {rxcie:0, txcie:0, rxen:0, txen:0}; stts.bits = (struct Atm128_UCSRA_t) {u2x:1}; mode.bits = (struct Atm128_UCSRC_t) {ucsz:ATM128_UART_DATA_SIZE_8_BITS}; ubrr0 = call Atm128Calibrate.baudrateRegister(PLATFORM_BAUDRATE); UBRR0L = ubrr0; UBRR0H = ubrr0 >> 8; UCSR0A = stts.flat; UCSR0C = mode.flat; UCSR0B = ctrl.flat; return SUCCESS; } command error_t Uart0TxControl.start() { SET_BIT(UCSR0B, TXEN0); call McuPowerState.update(); return SUCCESS; } command error_t Uart0TxControl.stop() { CLR_BIT(UCSR0B, TXEN0); call McuPowerState.update(); return SUCCESS; } command error_t Uart0RxControl.start() { SET_BIT(UCSR0B, RXEN0); call McuPowerState.update(); return SUCCESS; } command error_t Uart0RxControl.stop() { CLR_BIT(UCSR0B, RXEN0); call McuPowerState.update(); return SUCCESS; } async command error_t HplUart0.enableTxIntr() { SET_BIT(UCSR0A, TXC0); SET_BIT(UCSR0B, TXCIE0); return SUCCESS; } async command error_t HplUart0.disableTxIntr(){ CLR_BIT(UCSR0B, TXCIE0); return SUCCESS; } async command error_t HplUart0.enableRxIntr(){ SET_BIT(UCSR0B, RXCIE0); return SUCCESS; } async command error_t HplUart0.disableRxIntr(){ CLR_BIT(UCSR0B, RXCIE0); return SUCCESS; } async command bool HplUart0.isTxEmpty(){ return READ_BIT(UCSR0A, TXC0); } async command bool HplUart0.isRxEmpty(){ return !READ_BIT(UCSR0A, RXC0); } async command uint8_t HplUart0.rx(){ return UDR0; } async command void HplUart0.tx(uint8_t data) { atomic{ UDR0 = data; SET_BIT(UCSR0A, TXC0); } } AVR_ATOMIC_HANDLER(SIG_USART0_RECV) { if (READ_BIT(UCSR0A, RXC0)) { signal HplUart0.rxDone(UDR0); } call PlatformInterrupt.postAmble(); } AVR_NONATOMIC_HANDLER(SIG_USART0_TRANS) { signal HplUart0.txDone(); call PlatformInterrupt.postAmble(); } command error_t Uart1Init.init() { Atm128UartMode_t mode; Atm128UartStatus_t stts; Atm128UartControl_t ctrl; uint16_t ubrr1; ctrl.bits = (struct Atm128_UCSRB_t) {rxcie:0, txcie:0, rxen:0, txen:0}; stts.bits = (struct Atm128_UCSRA_t) {u2x:1}; mode.bits = (struct Atm128_UCSRC_t) {ucsz:ATM128_UART_DATA_SIZE_8_BITS}; ubrr1 = call Atm128Calibrate.baudrateRegister(PLATFORM_BAUDRATE); UBRR1L = ubrr1; UBRR1H = ubrr1 >> 8; UCSR1A = stts.flat; UCSR1C = mode.flat; UCSR1B = ctrl.flat; return SUCCESS; } command error_t Uart1TxControl.start() { SET_BIT(UCSR1B, TXEN1); call McuPowerState.update(); return SUCCESS; } command error_t Uart1TxControl.stop() { CLR_BIT(UCSR1B, TXEN1); call McuPowerState.update(); return SUCCESS; } command error_t Uart1RxControl.start() { SET_BIT(UCSR1B, RXEN1); call McuPowerState.update(); return SUCCESS; } command error_t Uart1RxControl.stop() { CLR_BIT(UCSR1B, RXEN1); call McuPowerState.update(); return SUCCESS; } async command error_t HplUart1.enableTxIntr() { SET_BIT(UCSR1A, TXC1); SET_BIT(UCSR1B, TXCIE1); return SUCCESS; } async command error_t HplUart1.disableTxIntr(){ CLR_BIT(UCSR1B, TXCIE1); return SUCCESS; } async command error_t HplUart1.enableRxIntr(){ SET_BIT(UCSR1B, RXCIE1); return SUCCESS; } async command error_t HplUart1.disableRxIntr(){ CLR_BIT(UCSR1B, RXCIE1); return SUCCESS; } async command bool HplUart1.isTxEmpty() { return READ_BIT(UCSR1A, TXC1); } async command bool HplUart1.isRxEmpty() { return !READ_BIT(UCSR1A, RXC1); } async command uint8_t HplUart1.rx(){ return UDR1; } async command void HplUart1.tx(uint8_t data) { atomic{ UDR1 = data; SET_BIT(UCSR1A, TXC1); } } AVR_ATOMIC_HANDLER(SIG_USART1_RECV) { if (READ_BIT(UCSR1A, RXC1)) signal HplUart1.rxDone(UDR1); call PlatformInterrupt.postAmble(); } AVR_NONATOMIC_HANDLER(SIG_USART1_TRANS) { signal HplUart1.txDone(); call PlatformInterrupt.postAmble(); } default async event void HplUart0.txDone() {} default async event void HplUart0.rxDone(uint8_t data) {} default async event void HplUart1.txDone() {} default async event void HplUart1.rxDone(uint8_t data) {} } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/cc1000/000077500000000000000000000000001207233610700215105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/cc1000/CC1000ActiveMessageC.nc000066400000000000000000000064251207233610700253730ustar00rootroot00000000000000// $Id: CC1000ActiveMessageC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * The Active Message layer for the CC1000 radio. This configuration * just layers the AM dispatch (CC1000ActiveMessageM) on top of the * underlying CC1000 radio packet (CC1000CsmaRadioC), which is * inherently an AM packet (acknowledgements based on AM destination * addr and group). * * @author Philip Levis * @date June 19 2005 */ configuration CC1000ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface AMPacket; interface Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; } } implementation { components CC1000ActiveMessageP as AM, CC1000CsmaRadioC as Radio; components ActiveMessageAddressC as Address; SplitControl = Radio; Packet = Radio; PacketAcknowledgements = Radio; LinkPacketMetadata = Radio; AMSend = AM; Receive = AM.Receive; ReceiveDefault = AM.ReceiveDefault; Snoop = AM.Snoop; SnoopDefault = AM.SnoopDefault; AMPacket = AM; AM.SubSend -> Radio.Send; AM.SubReceive -> Radio.Receive; AM.amAddress -> Address; AM.Packet -> Radio; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/cc1000/CC1000ActiveMessageP.nc000066400000000000000000000142511207233610700254040ustar00rootroot00000000000000// $Id: CC1000ActiveMessageP.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implementation component for CC1000ActiveMessageC. * * @author Philip Levis * @date June 19 2006 */ module CC1000ActiveMessageP @safe() { provides { interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface AMPacket; } uses { interface Send as SubSend; interface Receive as SubReceive; interface Packet as Packet; command am_addr_t amAddress(); } } implementation { cc1000_header_t* ONE getHeader(message_t* ONE amsg) { return TCAST(cc1000_header_t* ONE, (uint8_t*)amsg + offsetof(message_t, data) - sizeof(cc1000_header_t)); } cc1000_footer_t *getFooter(message_t *amsg) { return (cc1000_footer_t *)(amsg->footer); } command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* amsg, uint8_t len) { cc1000_header_t* header = getHeader(amsg); header->type = id; header->dest = addr; header->source = call AMPacket.address(); header->group = TOS_AM_GROUP; return call SubSend.send(amsg, len); } command error_t AMSend.cancel[am_id_t id](message_t* msg) { return call SubSend.cancel(msg); } event void SubSend.sendDone(message_t* msg, error_t result) { signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } /* Receiving a packet */ event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { cc1000_footer_t* msg_footer = getFooter(msg); if(msg_footer->crc == 1) { if (call AMPacket.isForMe(msg)) { return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len); } else { return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len); } } return msg; } command am_addr_t AMPacket.address() { return call amAddress(); } command am_addr_t AMPacket.destination(message_t* amsg) { cc1000_header_t* header = getHeader(amsg); return header->dest; } command am_addr_t AMPacket.source(message_t* amsg) { cc1000_header_t* header = getHeader(amsg); return header->source; } command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { cc1000_header_t* header = getHeader(amsg); header->dest = addr; } command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { cc1000_header_t* header = getHeader(amsg); header->source = addr; } command bool AMPacket.isForMe(message_t* amsg) { return (call AMPacket.destination(amsg) == call AMPacket.address() || call AMPacket.destination(amsg) == AM_BROADCAST_ADDR); } command am_id_t AMPacket.type(message_t* amsg) { cc1000_header_t* header = getHeader(amsg); return header->type; } command void AMPacket.setType(message_t* amsg, am_id_t type) { cc1000_header_t* header = getHeader(amsg); header->type = type; } command void AMPacket.setGroup(message_t* msg, am_group_t group) { cc1000_header_t* header = getHeader(msg); header->group = group; } command am_group_t AMPacket.group(message_t* msg) { cc1000_header_t* header = getHeader(msg); return header->group; } command am_group_t AMPacket.localGroup() { return TOS_AM_GROUP; } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal ReceiveDefault.receive[id](msg, payload, len); } default event message_t* ReceiveDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal SnoopDefault.receive[id](msg, payload, len); } default event message_t* SnoopDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { return; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/cc2420/000077500000000000000000000000001207233610700215175ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/cc2420/CC2420ActiveMessageC.nc000066400000000000000000000075401207233610700254100ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The Active Message layer for the CC2420 radio. This configuration * just layers the AM dispatch (CC2420ActiveMessageM) on top of the * underlying CC2420 radio packet (CC2420CsmaCsmaCC), which is * inherently an AM packet (acknowledgements based on AM destination * addr and group). Note that snooping may not work, due to CC2420 * early packet rejection if acknowledgements are enabled. * * @author Philip Levis * @author David Moss * @version $Revision: 1.3 $ $Date: 2010-06-29 22:07:51 $ */ #include "CC2420.h" #include "AM.h" #include "Ieee154.h" #ifdef IEEE154FRAMES_ENABLED #error "CC2420 AM layer cannot work when IEEE 802.15.4 frames only are used" #endif configuration CC2420ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface AMPacket; interface Packet; interface CC2420Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; interface RadioBackoff[am_id_t amId]; interface LowPowerListening; interface PacketLink; interface SendNotifier[am_id_t amId]; } } implementation { enum { CC2420_AM_SEND_ID = unique(IEEE154_SEND_CLIENT), }; components CC2420RadioC as Radio; components CC2420ActiveMessageP as AM; components ActiveMessageAddressC; components CC2420CsmaC as CsmaC; components CC2420ControlC; components CC2420PacketC; SplitControl = Radio; RadioBackoff = AM; Packet = AM; AMSend = AM; SendNotifier = AM; Receive = AM.Receive; ReceiveDefault = AM.ReceiveDefault; Snoop = AM.Snoop; SnoopDefault = AM.SnoopDefault; AMPacket = AM; PacketLink = Radio; LowPowerListening = Radio; CC2420Packet = Radio; PacketAcknowledgements = Radio; LinkPacketMetadata = Radio; // Radio resource for the AM layer AM.RadioResource -> Radio.Resource[CC2420_AM_SEND_ID]; AM.SubSend -> Radio.ActiveSend; AM.SubReceive -> Radio.ActiveReceive; AM.ActiveMessageAddress -> ActiveMessageAddressC; AM.CC2420Packet -> CC2420PacketC; AM.CC2420PacketBody -> CC2420PacketC; AM.CC2420Config -> CC2420ControlC; AM.SubBackoff -> CsmaC; components LedsC; AM.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/cc2420/CC2420ActiveMessageP.nc000066400000000000000000000246611207233610700254300ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Active message implementation on top of the CC2420 radio. This * implementation uses the 16-bit addressing mode of 802.15.4: the * only additional byte it adds is the AM id byte, as the first byte * of the data payload. * * @author Philip Levis * @version $Revision: 1.3 $ $Date: 2010-06-29 22:07:51 $ */ #include "CC2420.h" module CC2420ActiveMessageP @safe() { provides { interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface AMPacket; interface Packet; interface SendNotifier[am_id_t id]; interface RadioBackoff[am_id_t id]; } uses { interface Send as SubSend; interface Receive as SubReceive; interface CC2420Packet; interface CC2420PacketBody; interface CC2420Config; interface ActiveMessageAddress; interface RadioBackoff as SubBackoff; interface Resource as RadioResource; interface Leds; } } implementation { uint16_t pending_length; message_t *pending_message = NULL; /***************** Resource event ****************/ event void RadioResource.granted() { uint8_t rc; cc2420_header_t* header = call CC2420PacketBody.getHeader( pending_message ); signal SendNotifier.aboutToSend[header->type](header->dest, pending_message); rc = call SubSend.send( pending_message, pending_length ); if (rc != SUCCESS) { call RadioResource.release(); signal AMSend.sendDone[header->type]( pending_message, rc ); } } /***************** AMSend Commands ****************/ command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len) { cc2420_header_t* header = call CC2420PacketBody.getHeader( msg ); if (len > call Packet.maxPayloadLength()) { return ESIZE; } header->type = id; header->dest = addr; header->destpan = call CC2420Config.getPanAddr(); header->src = call AMPacket.address(); header->fcf = ( 1 << IEEE154_FCF_INTRAPAN ) | ( IEEE154_ADDR_SHORT << IEEE154_FCF_DEST_ADDR_MODE ) | ( IEEE154_ADDR_SHORT << IEEE154_FCF_SRC_ADDR_MODE ) ; header->length = len + CC2420_SIZE; if (call RadioResource.immediateRequest() == SUCCESS) { error_t rc; signal SendNotifier.aboutToSend[id](addr, msg); rc = call SubSend.send( msg, len ); if (rc != SUCCESS) { call RadioResource.release(); } return rc; } else { pending_length = len; pending_message = msg; return call RadioResource.request(); } } command error_t AMSend.cancel[am_id_t id](message_t* msg) { return call SubSend.cancel(msg); } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } /***************** AMPacket Commands ****************/ command am_addr_t AMPacket.address() { return call ActiveMessageAddress.amAddress(); } command am_addr_t AMPacket.destination(message_t* amsg) { cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); return header->dest; } command am_addr_t AMPacket.source(message_t* amsg) { cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); return header->src; } command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); header->dest = addr; } command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); header->src = addr; } command bool AMPacket.isForMe(message_t* amsg) { return (call AMPacket.destination(amsg) == call AMPacket.address() || call AMPacket.destination(amsg) == AM_BROADCAST_ADDR); } command am_id_t AMPacket.type(message_t* amsg) { cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); return header->type; } command void AMPacket.setType(message_t* amsg, am_id_t type) { cc2420_header_t* header = call CC2420PacketBody.getHeader(amsg); header->type = type; } command am_group_t AMPacket.group(message_t* amsg) { return (call CC2420PacketBody.getHeader(amsg))->destpan; } command void AMPacket.setGroup(message_t* amsg, am_group_t grp) { // Overridden intentionally when we send() (call CC2420PacketBody.getHeader(amsg))->destpan = grp; } command am_group_t AMPacket.localGroup() { return call CC2420Config.getPanAddr(); } /***************** Packet Commands ****************/ command void Packet.clear(message_t* msg) { memset(call CC2420PacketBody.getHeader(msg), 0x0, sizeof(cc2420_header_t)); memset(call CC2420PacketBody.getMetadata(msg), 0x0, sizeof(cc2420_metadata_t)); } command uint8_t Packet.payloadLength(message_t* msg) { return (call CC2420PacketBody.getHeader(msg))->length - CC2420_SIZE; } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { (call CC2420PacketBody.getHeader(msg))->length = len + CC2420_SIZE; } command uint8_t Packet.maxPayloadLength() { return call SubSend.maxPayloadLength(); } command void* Packet.getPayload(message_t* msg, uint8_t len) { return call SubSend.getPayload(msg, len); } /***************** SubSend Events ****************/ event void SubSend.sendDone(message_t* msg, error_t result) { call RadioResource.release(); signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); } /***************** SubReceive Events ****************/ event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { if (call AMPacket.isForMe(msg)) { return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len); } else { return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len); } } /***************** ActiveMessageAddress Events ****************/ async event void ActiveMessageAddress.changed() { } /***************** CC2420Config Events ****************/ event void CC2420Config.syncDone( error_t error ) { } /***************** RadioBackoff ***********************/ async event void SubBackoff.requestInitialBackoff(message_t *msg) { signal RadioBackoff.requestInitialBackoff[(TCAST(cc2420_header_t* ONE, (uint8_t*)msg + offsetof(message_t, data) - sizeof(cc2420_header_t)))->type](msg); } async event void SubBackoff.requestCongestionBackoff(message_t *msg) { signal RadioBackoff.requestCongestionBackoff[(TCAST(cc2420_header_t* ONE, (uint8_t*)msg + offsetof(message_t, data) - sizeof(cc2420_header_t)))->type](msg); } async event void SubBackoff.requestCca(message_t *msg) { // Lower layers than this do not configure the CCA settings signal RadioBackoff.requestCca[(TCAST(cc2420_header_t* ONE, (uint8_t*)msg + offsetof(message_t, data) - sizeof(cc2420_header_t)))->type](msg); } async command void RadioBackoff.setInitialBackoff[am_id_t amId](uint16_t backoffTime) { call SubBackoff.setInitialBackoff(backoffTime); } /** * Must be called within a requestCongestionBackoff event * @param backoffTime the amount of time in some unspecified units to backoff */ async command void RadioBackoff.setCongestionBackoff[am_id_t amId](uint16_t backoffTime) { call SubBackoff.setCongestionBackoff(backoffTime); } /** * Enable CCA for the outbound packet. Must be called within a requestCca * event * @param ccaOn TRUE to enable CCA, which is the default. */ async command void RadioBackoff.setCca[am_id_t amId](bool useCca) { call SubBackoff.setCca(useCca); } /***************** Defaults ****************/ default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal ReceiveDefault.receive[id](msg, payload, len); } default event message_t* ReceiveDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal SnoopDefault.receive[id](msg, payload, len); } default event message_t* SnoopDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { call RadioResource.release(); } default event void SendNotifier.aboutToSend[am_id_t amId](am_addr_t addr, message_t *msg) { } default async event void RadioBackoff.requestInitialBackoff[am_id_t id]( message_t *msg) { } default async event void RadioBackoff.requestCongestionBackoff[am_id_t id]( message_t *msg) { } default async event void RadioBackoff.requestCca[am_id_t id]( message_t *msg) { } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/m16c60/000077500000000000000000000000001207233610700215365ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/m16c60/chip_thread.h000066400000000000000000000163031207233610700241640ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This file contains M16c/60 mcu-specific routines for implementing * threads in TinyOS * * @author Henrik Makitaavola * @author Kevin Klues */ typedef struct thread_regs { uint16_t r0; uint16_t r1; uint16_t r2; uint16_t r3; uint16_t a0; uint16_t a1; uint16_t fb; uint16_t flg; uint16_t mem0; uint16_t mem2; uint16_t mem4; uint16_t mem6; uint16_t mem8; uint16_t mem10; uint16_t mem12; uint16_t mem14; } thread_regs_t; /** * Memory is addressed by 16 bits on M16c/60 but because * is can be addressed in 8 bit units we typedef the * stack pointer as a uint8_t. */ typedef uint8_t* stack_ptr_t; #define STACK_TOP(stack, size) \ (&(((uint8_t*)stack)[size - 1])) //Save stack pointer #define SAVE_STACK_PTR(t) \ asm volatile ("stc sp, %0": "=r"(t->stack_ptr)); //Save status register #define SAVE_STATUS(t) \ asm volatile ("stc flg, %0": "=r"(t->regs.flg)); //Save General Purpose Registers #define SAVE_GPR(t) \ asm volatile ("mov.w r0, %0 \n\t" : "=r" ((t)->regs.r0) : ); \ asm volatile ("mov.w r1, %0 \n\t" : "=r" ((t)->regs.r1) : ); \ asm volatile ("mov.w r2, %0 \n\t" : "=r" ((t)->regs.r2) : ); \ asm volatile ("mov.w r3, %0 \n\t" : "=r" ((t)->regs.r3) : ); \ asm volatile ("mov.w a0, %0 \n\t" : "=r" ((t)->regs.a0) : ); \ asm volatile ("mov.w a1, %0 \n\t" : "=r" ((t)->regs.a1) : ); \ asm volatile ("stc fb, %0 \n\t" : "=r" ((t)->regs.fb) : ); \ asm volatile ("mov.w mem0, %0 \n\t" : "=r" ((t)->regs.mem0) : ); \ asm volatile ("mov.w mem2, %0 \n\t" : "=r" ((t)->regs.mem2) : ); \ asm volatile ("mov.w mem4, %0 \n\t" : "=r" ((t)->regs.mem4) : ); \ asm volatile ("mov.w mem6, %0 \n\t" : "=r" ((t)->regs.mem6) : ); \ asm volatile ("mov.w mem8, %0 \n\t" : "=r" ((t)->regs.mem8) : ); \ asm volatile ("mov.w mem10, %0 \n\t" : "=r" ((t)->regs.mem10) : ); \ asm volatile ("mov.w mem12, %0 \n\t" : "=r" ((t)->regs.mem12) : ); \ asm volatile ("mov.w mem14, %0 \n\t" : "=r" ((t)->regs.mem14) : ); //Restore stack pointer #define RESTORE_STACK_PTR(t) \ asm volatile ("ldc %0, sp \n\t" :: "r" ((t)->stack_ptr)) //Restore status register #define RESTORE_STATUS(t) \ asm volatile ("ldc %0, flg \n\t" :: "r" (t->regs.flg) ); //Restore the general purpose registers #define RESTORE_GPR(t) \ asm volatile ("mov.w %0, r0 \n\t" :: "r" ((t)->regs.r0) ); \ asm volatile ("mov.w %0, r1 \n\t" :: "r" ((t)->regs.r1) ); \ asm volatile ("mov.w %0, r2 \n\t" :: "r" ((t)->regs.r2) ); \ asm volatile ("mov.w %0, r3 \n\t" :: "r" ((t)->regs.r3) ); \ asm volatile ("mov.w %0, a0 \n\t" :: "r" ((t)->regs.a0) ); \ asm volatile ("mov.w %0, a1 \n\t" :: "r" ((t)->regs.a1) ); \ asm volatile ("ldc %0, fb \n\t" :: "r" ((t)->regs.fb) ); \ asm volatile ("mov.w %0, mem0 \n\t" :: "r" ((t)->regs.mem0) ); \ asm volatile ("mov.w %0, mem2 \n\t" :: "r" ((t)->regs.mem2) ); \ asm volatile ("mov.w %0, mem4 \n\t" :: "r" ((t)->regs.mem4) ); \ asm volatile ("mov.w %0, mem6 \n\t" :: "r" ((t)->regs.mem6) ); \ asm volatile ("mov.w %0, mem8 \n\t" :: "r" ((t)->regs.mem8) ); \ asm volatile ("mov.w %0, mem10 \n\t" :: "r" ((t)->regs.mem10) ); \ asm volatile ("mov.w %0, mem12 \n\t" :: "r" ((t)->regs.mem12) ); \ asm volatile ("mov.w %0, mem14 \n\t" :: "r" ((t)->regs.mem14) ); #define SAVE_TCB(t) \ SAVE_GPR(t); \ SAVE_STATUS(t); \ SAVE_STACK_PTR(t) #define RESTORE_TCB(t) \ RESTORE_STACK_PTR(t); \ RESTORE_STATUS(t); \ RESTORE_GPR(t) #define SWITCH_CONTEXTS(from, to) \ SAVE_TCB(from); \ RESTORE_TCB(to) #define PREPARE_THREAD(t, start_function) \ t->stack_ptr[0] = 0; \ t->stack_ptr[-1] = (uint8_t)((uint16_t)&start_function >> 8) & 0xFF; \ t->stack_ptr[-2] = (uint8_t)((uint16_t)&start_function) & 0xFF; \ t->stack_ptr -= 2; \ SAVE_STATUS(t) tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/000077500000000000000000000000001207233610700216505ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/HplAdc12P.nc000066400000000000000000000104141207233610700236100ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2008-06-12 14:02:24 $ * @author: Jan Hauer * ======================================================================== */ /** * The HplAdc12 interface exports low-level access to the ADC12 registers * of the MSP430 MCU. * * @author Jan Hauer * @see Please refer to TEP 101 for more information about this component and its * intended use. */ module HplAdc12P { provides interface HplAdc12; uses interface PlatformInterrupt; } implementation { MSP430REG_NORACE(ADC12CTL0); MSP430REG_NORACE(ADC12CTL1); MSP430REG_NORACE(ADC12IFG); MSP430REG_NORACE(ADC12IE); MSP430REG_NORACE(ADC12IV); // SFRs are accessed directly or cast to a pointer, both works fine // (we don't access all SFRs directly, because that would result in // much higher memory footprint) async command void HplAdc12.setCtl0(adc12ctl0_t control0){ ADC12CTL0 = *((uint16_t*) &control0); } async command void HplAdc12.setCtl1(adc12ctl1_t control1){ ADC12CTL1 = *((uint16_t*) &control1); } async command adc12ctl0_t HplAdc12.getCtl0(){ return *((adc12ctl0_t*) &ADC12CTL0); } async command adc12ctl1_t HplAdc12.getCtl1(){ return *((adc12ctl1_t*) &ADC12CTL1); } async command void HplAdc12.setMCtl(uint8_t i, adc12memctl_t memControl){ uint8_t *memCtlPtr = (uint8_t*) ADC12MCTL; memCtlPtr += i; *memCtlPtr = *(uint8_t*)&memControl; } async command adc12memctl_t HplAdc12.getMCtl(uint8_t i){ adc12memctl_t x = {inch: 0, sref: 0, eos: 0 }; uint8_t *memCtlPtr = (uint8_t*) ADC12MCTL; memCtlPtr += i; x = *(adc12memctl_t*) memCtlPtr; return x; } async command uint16_t HplAdc12.getMem(uint8_t i){ return *((uint16_t*) ADC12MEM + i); } async command void HplAdc12.setIEFlags(uint16_t mask){ ADC12IE = mask; } async command uint16_t HplAdc12.getIEFlags(){ return (uint16_t) ADC12IE; } async command void HplAdc12.resetIFGs(){ ADC12IV = 0; ADC12IFG = 0; } async command void HplAdc12.startConversion(){ ADC12CTL0 |= ADC12ON; ADC12CTL0 |= (ADC12SC + ENC); } async command void HplAdc12.stopConversion(){ // stop conversion mode immediately, conversion data is unreliable ADC12CTL1 &= ~(CONSEQ0 | CONSEQ1); ADC12CTL0 &= ~(ADC12SC + ENC); ADC12CTL0 &= ~(ADC12ON); } async command void HplAdc12.enableConversion(){ ADC12CTL0 |= ENC; } async command bool HplAdc12.isBusy(){ return ADC12CTL1 & ADC12BUSY; } TOSH_SIGNAL(ADC_VECTOR) { signal HplAdc12.conversionDone(ADC12IV); call PlatformInterrupt.postAmble(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/HplMsp430DmaC.nc000066400000000000000000000103401207233610700243470ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Ben Greenstein * @author Jonathan Hui * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:51 $ */ configuration HplMsp430DmaC { provides interface HplMsp430DmaControl as Control; provides interface HplMsp430DmaChannel as Channel0; provides interface HplMsp430DmaChannel as Channel1; provides interface HplMsp430DmaChannel as Channel2; } implementation { components HplMsp430DmaP; components new HplMsp430DmaXP( DMA0CTL_, DMA0SA_, DMA0DA_, DMA0SZ_, DMA0TSEL_MASK, DMA0TSEL_SHIFT ) as Dma0; components new HplMsp430DmaXP( DMA1CTL_, DMA1SA_, DMA1DA_, DMA1SZ_, DMA1TSEL_MASK, DMA1TSEL_SHIFT ) as Dma1; components new HplMsp430DmaXP( DMA2CTL_, DMA2SA_, DMA2DA_, DMA2SZ_, DMA2TSEL_MASK, DMA2TSEL_SHIFT ) as Dma2; Control = HplMsp430DmaP; Channel0 = Dma0; Channel1 = Dma1; Channel2 = Dma2; Dma0.Interrupt -> HplMsp430DmaP; Dma1.Interrupt -> HplMsp430DmaP; Dma2.Interrupt -> HplMsp430DmaP; components PlatformInterruptC; HplMsp430DmaP.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/HplMsp430DmaP.nc000066400000000000000000000106751207233610700243770ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Ben Greenstein * @author Jonathan Hui * @author Joe Polastre * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:51 $ */ module HplMsp430DmaP { provides interface HplMsp430DmaControl as DmaControl; provides interface HplMsp430DmaInterrupt as Interrupt; uses interface PlatformInterrupt; } implementation { MSP430REG_NORACE( DMACTL0 ); MSP430REG_NORACE( DMACTL1 ); TOSH_SIGNAL( DACDMA_VECTOR ) { signal Interrupt.fired(); call PlatformInterrupt.postAmble(); } async command void DmaControl.setOnFetch(){ DMACTL1 |= DMAONFETCH; } async command void DmaControl.clearOnFetch(){ DMACTL1 &= ~DMAONFETCH; } async command void DmaControl.setRoundRobin(){ DMACTL1 |= ROUNDROBIN; } async command void DmaControl.clearRoundRobin(){ DMACTL1 &= ~ROUNDROBIN; } async command void DmaControl.setENNMI(){ DMACTL1 |= ENNMI; } async command void DmaControl.clearENNMI(){ DMACTL1 &= ~ENNMI; } async command void DmaControl.setState(dma_state_t s){ DMACTL1 = *(int*)&s; } async command dma_state_t DmaControl.getState(){ dma_state_t s; s = *(dma_state_t*)&DMACTL1; return s; } async command void DmaControl.reset(){ DMACTL0 = 0; DMACTL1 = 0; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/HplMsp430InterruptC.nc000066400000000000000000000072261207233610700256530ustar00rootroot00000000000000 /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL for the TI MSP430 family of microprocessors. This provides an * abstraction for GPIO interrupts. * * @author Joe Polastre */ configuration HplMsp430InterruptC { #if defined(__msp430_have_port1) || defined(__MSP430_HAS_PORT1__) || defined(__MSP430_HAS_PORT1_R__) provides interface HplMsp430Interrupt as Port10; provides interface HplMsp430Interrupt as Port11; provides interface HplMsp430Interrupt as Port12; provides interface HplMsp430Interrupt as Port13; provides interface HplMsp430Interrupt as Port14; provides interface HplMsp430Interrupt as Port15; provides interface HplMsp430Interrupt as Port16; provides interface HplMsp430Interrupt as Port17; #endif #if defined(__msp430_have_port2) || defined(__MSP430_HAS_PORT2__) || defined(__MSP430_HAS_PORT2_R__) provides interface HplMsp430Interrupt as Port20; provides interface HplMsp430Interrupt as Port21; provides interface HplMsp430Interrupt as Port22; provides interface HplMsp430Interrupt as Port23; provides interface HplMsp430Interrupt as Port24; provides interface HplMsp430Interrupt as Port25; provides interface HplMsp430Interrupt as Port26; provides interface HplMsp430Interrupt as Port27; #endif } implementation { components HplMsp430InterruptP as HplInterruptP; #if defined(__msp430_have_port1) || defined(__MSP430_HAS_PORT1__) || defined(__MSP430_HAS_PORT1_R__) Port10 = HplInterruptP.Port10; Port11 = HplInterruptP.Port11; Port12 = HplInterruptP.Port12; Port13 = HplInterruptP.Port13; Port14 = HplInterruptP.Port14; Port15 = HplInterruptP.Port15; Port16 = HplInterruptP.Port16; Port17 = HplInterruptP.Port17; #endif #if defined(__msp430_have_port2) || defined(__MSP430_HAS_PORT2__) || defined(__MSP430_HAS_PORT2_R__) Port20 = HplInterruptP.Port20; Port21 = HplInterruptP.Port21; Port22 = HplInterruptP.Port22; Port23 = HplInterruptP.Port23; Port24 = HplInterruptP.Port24; Port25 = HplInterruptP.Port25; Port26 = HplInterruptP.Port26; Port27 = HplInterruptP.Port27; #endif components PlatformInterruptC; HplInterruptP.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/HplMsp430InterruptNMIC.nc000066400000000000000000000042301207233610700262070ustar00rootroot00000000000000 /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HPL for the TI MSP430 family of microprocessors. This provides an * abstraction for non-maskable interrupts. * * @author Joe Polastre */ configuration HplMsp430InterruptNMIC { provides interface HplMsp430Interrupt as NMI; provides interface HplMsp430Interrupt as OF; provides interface HplMsp430Interrupt as ACCV; } implementation { components HplMsp430InterruptNMIP as HplInterruptP; NMI = HplInterruptP.NMI; OF = HplInterruptP.OF; ACCV = HplInterruptP.ACCV; components PlatformInterruptC; HplInterruptP.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/HplMsp430InterruptNMIP.nc000066400000000000000000000075771207233610700262450ustar00rootroot00000000000000 /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre */ module HplMsp430InterruptNMIP { provides interface HplMsp430Interrupt as NMI; provides interface HplMsp430Interrupt as OF; provides interface HplMsp430Interrupt as ACCV; uses interface PlatformInterrupt; } implementation { TOSH_SIGNAL(NMI_VECTOR) { volatile int n = IFG1; if (n & NMIIFG) { signal NMI.fired(); } else if (n & OFIFG) { signal OF.fired(); } else if (FCTL3 & ACCVIFG) { signal ACCV.fired(); } call PlatformInterrupt.postAmble(); } default async event void NMI.fired() { call NMI.clear(); } default async event void OF.fired() { call OF.clear(); } default async event void ACCV.fired() { call ACCV.clear(); } async command void NMI.enable() { volatile uint16_t _watchdog; atomic { _watchdog = WDTCTL; _watchdog = WDTPW | (_watchdog & 0x0FF); _watchdog |= WDTNMI; WDTCTL = _watchdog; IE1 |= NMIIE; } } async command void OF.enable() { atomic IE1 |= OFIE; } async command void ACCV.enable() { atomic IE1 |= ACCVIE; } async command void NMI.disable() { volatile uint16_t _watchdog; atomic { _watchdog = WDTCTL; _watchdog = WDTPW | (_watchdog & 0x0FF); _watchdog &= ~WDTNMI; WDTCTL = _watchdog; IE1 &= ~NMIIE; } } async command void OF.disable() { atomic IE1 &= ~OFIE; } async command void ACCV.disable() { atomic IE1 &= ~ACCVIE; } async command void NMI.clear() { atomic IFG1 &= ~NMIIFG; } async command void OF.clear() { atomic IFG1 &= ~OFIFG; } async command void ACCV.clear() { atomic FCTL3 &= ~ACCVIFG; } async command bool NMI.getValue() { bool b; atomic b=(IFG1 & NMIIFG) & 0x01; return b; } async command bool OF.getValue() { bool b; atomic b=(IFG1 & OFIFG) & 0x01; return b; } async command bool ACCV.getValue() { bool b; atomic b=(FCTL3 & ACCVIFG) & 0x01; return b; } async command void NMI.edge(bool l2h) { volatile uint16_t _watchdog; atomic { _watchdog = WDTCTL; _watchdog = WDTPW | (_watchdog & 0x0FF); if (l2h) _watchdog &= ~(WDTNMIES); else _watchdog |= (WDTNMIES); WDTCTL = _watchdog; } } // edge does not apply to oscillator faults async command void OF.edge(bool l2h) { } // edge does not apply to flash access violations async command void ACCV.edge(bool l2h) { } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/HplMsp430InterruptP.nc000066400000000000000000000266321207233610700256720ustar00rootroot00000000000000 /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre */ module HplMsp430InterruptP { #if defined(__msp430_have_port1) || defined(__MSP430_HAS_PORT1__) || defined(__MSP430_HAS_PORT1_R__) provides interface HplMsp430Interrupt as Port10; provides interface HplMsp430Interrupt as Port11; provides interface HplMsp430Interrupt as Port12; provides interface HplMsp430Interrupt as Port13; provides interface HplMsp430Interrupt as Port14; provides interface HplMsp430Interrupt as Port15; provides interface HplMsp430Interrupt as Port16; provides interface HplMsp430Interrupt as Port17; #endif #if defined(__msp430_have_port2) || defined(__MSP430_HAS_PORT2__) || defined(__MSP430_HAS_PORT2_R__) provides interface HplMsp430Interrupt as Port20; provides interface HplMsp430Interrupt as Port21; provides interface HplMsp430Interrupt as Port22; provides interface HplMsp430Interrupt as Port23; provides interface HplMsp430Interrupt as Port24; provides interface HplMsp430Interrupt as Port25; provides interface HplMsp430Interrupt as Port26; provides interface HplMsp430Interrupt as Port27; #endif uses interface PlatformInterrupt; } implementation { #if defined(__msp430_have_port1) || defined(__MSP430_HAS_PORT1__) || defined(__MSP430_HAS_PORT1_R__) TOSH_SIGNAL(PORT1_VECTOR) { volatile int n = P1IFG & P1IE; if (n & (1 << 0)) { signal Port10.fired(); } else if (n & (1 << 1)) { signal Port11.fired(); } else if (n & (1 << 2)) { signal Port12.fired(); } else if (n & (1 << 3)) { signal Port13.fired(); } else if (n & (1 << 4)) { signal Port14.fired(); } else if (n & (1 << 5)) { signal Port15.fired(); } else if (n & (1 << 6)) { signal Port16.fired(); } else if (n & (1 << 7)) { signal Port17.fired(); } call PlatformInterrupt.postAmble(); } default async event void Port10.fired() { call Port10.clear(); } default async event void Port11.fired() { call Port11.clear(); } default async event void Port12.fired() { call Port12.clear(); } default async event void Port13.fired() { call Port13.clear(); } default async event void Port14.fired() { call Port14.clear(); } default async event void Port15.fired() { call Port15.clear(); } default async event void Port16.fired() { call Port16.clear(); } default async event void Port17.fired() { call Port17.clear(); } async command void Port10.enable() { P1IE |= (1 << 0); } async command void Port11.enable() { P1IE |= (1 << 1); } async command void Port12.enable() { P1IE |= (1 << 2); } async command void Port13.enable() { P1IE |= (1 << 3); } async command void Port14.enable() { P1IE |= (1 << 4); } async command void Port15.enable() { P1IE |= (1 << 5); } async command void Port16.enable() { P1IE |= (1 << 6); } async command void Port17.enable() { P1IE |= (1 << 7); } async command void Port10.disable() { P1IE &= ~(1 << 0); } async command void Port11.disable() { P1IE &= ~(1 << 1); } async command void Port12.disable() { P1IE &= ~(1 << 2); } async command void Port13.disable() { P1IE &= ~(1 << 3); } async command void Port14.disable() { P1IE &= ~(1 << 4); } async command void Port15.disable() { P1IE &= ~(1 << 5); } async command void Port16.disable() { P1IE &= ~(1 << 6); } async command void Port17.disable() { P1IE &= ~(1 << 7); } async command void Port10.clear() { P1IFG &= ~(1 << 0); } async command void Port11.clear() { P1IFG &= ~(1 << 1); } async command void Port12.clear() { P1IFG &= ~(1 << 2); } async command void Port13.clear() { P1IFG &= ~(1 << 3); } async command void Port14.clear() { P1IFG &= ~(1 << 4); } async command void Port15.clear() { P1IFG &= ~(1 << 5); } async command void Port16.clear() { P1IFG &= ~(1 << 6); } async command void Port17.clear() { P1IFG &= ~(1 << 7); } async command bool Port10.getValue() { bool b; atomic b=(P1IN >> 0) & 1; return b; } async command bool Port11.getValue() { bool b; atomic b=(P1IN >> 1) & 1; return b; } async command bool Port12.getValue() { bool b; atomic b=(P1IN >> 2) & 1; return b; } async command bool Port13.getValue() { bool b; atomic b=(P1IN >> 3) & 1; return b; } async command bool Port14.getValue() { bool b; atomic b=(P1IN >> 4) & 1; return b; } async command bool Port15.getValue() { bool b; atomic b=(P1IN >> 5) & 1; return b; } async command bool Port16.getValue() { bool b; atomic b=(P1IN >> 6) & 1; return b; } async command bool Port17.getValue() { bool b; atomic b=(P1IN >> 7) & 1; return b; } async command void Port10.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 0); else P1IES |= (1 << 0); } } async command void Port11.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 1); else P1IES |= (1 << 1); } } async command void Port12.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 2); else P1IES |= (1 << 2); } } async command void Port13.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 3); else P1IES |= (1 << 3); } } async command void Port14.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 4); else P1IES |= (1 << 4); } } async command void Port15.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 5); else P1IES |= (1 << 5); } } async command void Port16.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 6); else P1IES |= (1 << 6); } } async command void Port17.edge(bool l2h) { atomic { if (l2h) P1IES &= ~(1 << 7); else P1IES |= (1 << 7); } } #endif #if defined(__msp430_have_port2) || defined(__MSP430_HAS_PORT2__) || defined(__MSP430_HAS_PORT2_R__) TOSH_SIGNAL(PORT2_VECTOR) { volatile int n = P2IFG & P2IE; if (n & (1 << 0)) { signal Port20.fired(); } else if (n & (1 << 1)) { signal Port21.fired(); } else if (n & (1 << 2)) { signal Port22.fired(); } else if (n & (1 << 3)) { signal Port23.fired(); } else if (n & (1 << 4)) { signal Port24.fired(); } else if (n & (1 << 5)) { signal Port25.fired(); } else if (n & (1 << 6)) { signal Port26.fired(); } else if (n & (1 << 7)) { signal Port27.fired(); } call PlatformInterrupt.postAmble(); } default async event void Port20.fired() { call Port20.clear(); } default async event void Port21.fired() { call Port21.clear(); } default async event void Port22.fired() { call Port22.clear(); } default async event void Port23.fired() { call Port23.clear(); } default async event void Port24.fired() { call Port24.clear(); } default async event void Port25.fired() { call Port25.clear(); } default async event void Port26.fired() { call Port26.clear(); } default async event void Port27.fired() { call Port27.clear(); } async command void Port20.enable() { P2IE |= (1 << 0); } async command void Port21.enable() { P2IE |= (1 << 1); } async command void Port22.enable() { P2IE |= (1 << 2); } async command void Port23.enable() { P2IE |= (1 << 3); } async command void Port24.enable() { P2IE |= (1 << 4); } async command void Port25.enable() { P2IE |= (1 << 5); } async command void Port26.enable() { P2IE |= (1 << 6); } async command void Port27.enable() { P2IE |= (1 << 7); } async command void Port20.disable() { P2IE &= ~(1 << 0); } async command void Port21.disable() { P2IE &= ~(1 << 1); } async command void Port22.disable() { P2IE &= ~(1 << 2); } async command void Port23.disable() { P2IE &= ~(1 << 3); } async command void Port24.disable() { P2IE &= ~(1 << 4); } async command void Port25.disable() { P2IE &= ~(1 << 5); } async command void Port26.disable() { P2IE &= ~(1 << 6); } async command void Port27.disable() { P2IE &= ~(1 << 7); } async command void Port20.clear() { P2IFG &= ~(1 << 0); } async command void Port21.clear() { P2IFG &= ~(1 << 1); } async command void Port22.clear() { P2IFG &= ~(1 << 2); } async command void Port23.clear() { P2IFG &= ~(1 << 3); } async command void Port24.clear() { P2IFG &= ~(1 << 4); } async command void Port25.clear() { P2IFG &= ~(1 << 5); } async command void Port26.clear() { P2IFG &= ~(1 << 6); } async command void Port27.clear() { P2IFG &= ~(1 << 7); } async command bool Port20.getValue() { bool b; atomic b=(P2IN >> 0) & 1; return b; } async command bool Port21.getValue() { bool b; atomic b=(P2IN >> 1) & 1; return b; } async command bool Port22.getValue() { bool b; atomic b=(P2IN >> 2) & 1; return b; } async command bool Port23.getValue() { bool b; atomic b=(P2IN >> 3) & 1; return b; } async command bool Port24.getValue() { bool b; atomic b=(P2IN >> 4) & 1; return b; } async command bool Port25.getValue() { bool b; atomic b=(P2IN >> 5) & 1; return b; } async command bool Port26.getValue() { bool b; atomic b=(P2IN >> 6) & 1; return b; } async command bool Port27.getValue() { bool b; atomic b=(P2IN >> 7) & 1; return b; } async command void Port20.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 0); else P2IES |= (1 << 0); } } async command void Port21.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 1); else P2IES |= (1 << 1); } } async command void Port22.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 2); else P2IES |= (1 << 2); } } async command void Port23.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 3); else P2IES |= (1 << 3); } } async command void Port24.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 4); else P2IES |= (1 << 4); } } async command void Port25.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 5); else P2IES |= (1 << 5); } } async command void Port26.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 6); else P2IES |= (1 << 6); } } async command void Port27.edge(bool l2h) { atomic { if (l2h) P2IES &= ~(1 << 7); else P2IES |= (1 << 7); } } #endif } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/HplMsp430Usart0C.nc000066400000000000000000000077351207233610700250420ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * An HPL abstraction of USART0 on the MSP430. * * @author Jonathan Hui * @author Joe Polastre * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:51 $ */ #include "msp430usart.h" configuration HplMsp430Usart0C { provides interface HplMsp430Usart; provides interface HplMsp430UsartInterrupts; provides interface HplMsp430I2CInterrupts; } implementation { components HplMsp430Usart0P as HplUsartP; HplMsp430Usart = HplUsartP; HplMsp430UsartInterrupts = HplUsartP; HplMsp430I2CInterrupts = HplUsartP; components HplMsp430GeneralIOC as GIO; HplUsartP.SIMO -> GIO.SIMO0; HplUsartP.SOMI -> GIO.SOMI0; HplUsartP.UCLK -> GIO.UCLK0; HplUsartP.URXD -> GIO.URXD0; HplUsartP.UTXD -> GIO.UTXD0; components PlatformInterruptC; HplUsartP.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/HplMsp430Usart0P.nc000066400000000000000000000260141207233610700250460ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Copyright (c) 2004-2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "msp430usart.h" /** * Implementation of USART0 lowlevel functionality - stateless. * Setting a mode will by default disable USART-Interrupts. * * @author: Jan Hauer * @author: Jonathan Hui * @author: Vlado Handziski * @author: Joe Polastre * @author: Philipp Huppertz * @version $Revision: 1.1 $ $Date: 2008-06-12 14:02:25 $ */ module HplMsp430Usart0P { provides interface HplMsp430Usart as Usart; provides interface HplMsp430UsartInterrupts as Interrupts; provides interface HplMsp430I2CInterrupts as I2CInterrupts; uses interface HplMsp430I2C as HplI2C; uses interface HplMsp430GeneralIO as SIMO; uses interface HplMsp430GeneralIO as SOMI; uses interface HplMsp430GeneralIO as UCLK; uses interface HplMsp430GeneralIO as URXD; uses interface HplMsp430GeneralIO as UTXD; uses interface PlatformInterrupt; } implementation { MSP430REG_NORACE(IE1); MSP430REG_NORACE(ME1); MSP430REG_NORACE(IFG1); MSP430REG_NORACE(U0TCTL); MSP430REG_NORACE(U0RCTL); MSP430REG_NORACE(U0TXBUF); TOSH_SIGNAL(UART0RX_VECTOR) { uint8_t temp = U0RXBUF; signal Interrupts.rxDone(temp); call PlatformInterrupt.postAmble(); } TOSH_SIGNAL(UART0TX_VECTOR) { if ( call HplI2C.isI2C() ) signal I2CInterrupts.fired(); else signal Interrupts.txDone(); call PlatformInterrupt.postAmble(); } async command void Usart.setUctl(msp430_uctl_t control) { U0CTL=uctl2int(control); } async command msp430_uctl_t Usart.getUctl() { return int2uctl(U0CTL); } async command void Usart.setUtctl(msp430_utctl_t control) { U0TCTL=utctl2int(control); } async command msp430_utctl_t Usart.getUtctl() { return int2utctl(U0TCTL); } async command void Usart.setUrctl(msp430_urctl_t control) { U0RCTL=urctl2int(control); } async command msp430_urctl_t Usart.getUrctl() { return int2urctl(U0RCTL); } async command void Usart.setUbr(uint16_t control) { atomic { U0BR0 = control & 0x00FF; U0BR1 = (control >> 8) & 0x00FF; } } async command uint16_t Usart.getUbr() { return (U0BR1 << 8) + U0BR0; } async command void Usart.setUmctl(uint8_t control) { U0MCTL=control; } async command uint8_t Usart.getUmctl() { return U0MCTL; } async command void Usart.resetUsart(bool reset) { if (reset) { U0CTL = SWRST; } else { CLR_FLAG(U0CTL, SWRST); } } async command bool Usart.isSpi() { atomic { return (U0CTL & SYNC) && (ME1 & USPIE0); } } async command bool Usart.isUart() { atomic { return !(U0CTL & SYNC) && ((ME1 & UTXE0) && (ME1 & URXE0)); } } async command bool Usart.isUartTx() { atomic { return !(U0CTL & SYNC) && (ME1 & UTXE0); } } async command bool Usart.isUartRx() { atomic { return !(U0CTL & SYNC) && (ME1 & URXE0); } } async command msp430_usartmode_t Usart.getMode() { if (call Usart.isUart()) return USART_UART; else if (call Usart.isUartRx()) return USART_UART_RX; else if (call Usart.isUartTx()) return USART_UART_TX; else if (call Usart.isSpi()) return USART_SPI; else if (call HplI2C.isI2C()) return USART_I2C; else return USART_NONE; } async command void Usart.enableUart() { atomic{ call UTXD.selectModuleFunc(); call URXD.selectModuleFunc(); } ME1 |= (UTXE0 | URXE0); // USART0 UART module enable } async command void Usart.disableUart() { atomic { ME1 &= ~(UTXE0 | URXE0); // USART0 UART module enable call UTXD.selectIOFunc(); call URXD.selectIOFunc(); } } async command void Usart.enableUartTx() { call UTXD.selectModuleFunc(); ME1 |= UTXE0; // USART0 UART Tx module enable } async command void Usart.disableUartTx() { ME1 &= ~UTXE0; // USART0 UART Tx module enable call UTXD.selectIOFunc(); } async command void Usart.enableUartRx() { call URXD.selectModuleFunc(); ME1 |= URXE0; // USART0 UART Rx module enable } async command void Usart.disableUartRx() { ME1 &= ~URXE0; // USART0 UART Rx module disable call URXD.selectIOFunc(); } async command void Usart.enableSpi() { atomic { call SIMO.selectModuleFunc(); call SOMI.selectModuleFunc(); call UCLK.selectModuleFunc(); } ME1 |= USPIE0; // USART0 SPI module enable } async command void Usart.disableSpi() { atomic { ME1 &= ~USPIE0; // USART0 SPI module disable call SIMO.selectIOFunc(); call SOMI.selectIOFunc(); call UCLK.selectIOFunc(); } } void configSpi(msp430_spi_union_config_t* config) { // U0CTL = (config->spiRegisters.uctl & ~I2C) | SYNC | SWRST; U0CTL = (config->spiRegisters.uctl) | SYNC | SWRST; U0TCTL = config->spiRegisters.utctl; call Usart.setUbr(config->spiRegisters.ubr); call Usart.setUmctl(0x00); } async command void Usart.setModeSpi(msp430_spi_union_config_t* config) { atomic { call Usart.resetUsart(TRUE); call HplI2C.clearModeI2C(); call Usart.disableUart(); configSpi(config); call Usart.enableSpi(); call Usart.resetUsart(FALSE); call Usart.clrIntr(); call Usart.disableIntr(); } return; } void configUart(msp430_uart_union_config_t* config) { U0CTL = (config->uartRegisters.uctl & ~SYNC) | SWRST; U0TCTL = config->uartRegisters.utctl; U0RCTL = config->uartRegisters.urctl; call Usart.setUbr(config->uartRegisters.ubr); call Usart.setUmctl(config->uartRegisters.umctl); } async command void Usart.setModeUart(msp430_uart_union_config_t* config) { atomic { call Usart.resetUsart(TRUE); call HplI2C.clearModeI2C(); call Usart.disableSpi(); configUart(config); if ((config->uartConfig.utxe == 1) && (config->uartConfig.urxe == 1)) { call Usart.enableUart(); } else if ((config->uartConfig.utxe == 0) && (config->uartConfig.urxe == 1)) { call Usart.disableUartTx(); call Usart.enableUartRx(); } else if ((config->uartConfig.utxe == 1) && (config->uartConfig.urxe == 0)){ call Usart.disableUartRx(); call Usart.enableUartTx(); } else { call Usart.disableUart(); } call Usart.resetUsart(FALSE); call Usart.clrIntr(); call Usart.disableIntr(); } return; } async command bool Usart.isTxIntrPending(){ if (IFG1 & UTXIFG0){ return TRUE; } return FALSE; } async command bool Usart.isTxEmpty(){ if (U0TCTL & TXEPT) { return TRUE; } return FALSE; } async command bool Usart.isRxIntrPending(){ if (IFG1 & URXIFG0){ return TRUE; } return FALSE; } async command void Usart.clrTxIntr(){ IFG1 &= ~UTXIFG0; } async command void Usart.clrRxIntr() { IFG1 &= ~URXIFG0; } async command void Usart.clrIntr() { IFG1 &= ~(UTXIFG0 | URXIFG0); } async command void Usart.disableRxIntr() { IE1 &= ~URXIE0; } async command void Usart.disableTxIntr() { IE1 &= ~UTXIE0; } async command void Usart.disableIntr() { IE1 &= ~(UTXIE0 | URXIE0); } async command void Usart.enableRxIntr() { atomic { IFG1 &= ~URXIFG0; IE1 |= URXIE0; } } async command void Usart.enableTxIntr() { atomic { IFG1 &= ~UTXIFG0; IE1 |= UTXIE0; } } async command void Usart.enableIntr() { atomic { IFG1 &= ~(UTXIFG0 | URXIFG0); IE1 |= (UTXIE0 | URXIE0); } } async command void Usart.tx(uint8_t data) { atomic U0TXBUF = data; } async command uint8_t Usart.rx() { uint8_t value; atomic value = U0RXBUF; return value; } default async event void I2CInterrupts.fired() {} default async command bool HplI2C.isI2C() { return FALSE; } default async command void HplI2C.clearModeI2C() {}; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/HplMsp430Usart1C.nc000066400000000000000000000077201207233610700250350ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * An HPL abstraction of USART1 on the MSP430. * * @author Jonathan Hui * @author Joe Polastre * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:51 $ */ #include "msp430usart.h" configuration HplMsp430Usart1C { provides interface AsyncStdControl; provides interface HplMsp430Usart; provides interface HplMsp430UsartInterrupts; } implementation { components HplMsp430Usart1P as HplUsartP; components HplMsp430GeneralIOC as GIO; AsyncStdControl = HplUsartP; HplMsp430Usart = HplUsartP; HplMsp430UsartInterrupts = HplUsartP; HplUsartP.SIMO -> GIO.SIMO1; HplUsartP.SOMI -> GIO.SOMI1; HplUsartP.UCLK -> GIO.UCLK1; HplUsartP.URXD -> GIO.URXD1; HplUsartP.UTXD -> GIO.UTXD1; components PlatformInterruptC; HplUsartP.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/HplMsp430Usart1P.nc000066400000000000000000000252261207233610700250530ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Copyright (c) 2004-2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "msp430usart.h" /** * Implementation of USART1 lowlevel functionality - stateless. * Setting a mode will by default disable USART-Interrupts. * * @author: Jan Hauer * @author: Jonathan Hui * @author: Vlado Handziski * @author: Joe Polastre * @version $Revision: 1.1 $ $Date: 2008-06-12 14:02:26 $ */ module HplMsp430Usart1P { provides interface AsyncStdControl; provides interface HplMsp430Usart as Usart; provides interface HplMsp430UsartInterrupts as Interrupts; uses interface HplMsp430GeneralIO as SIMO; uses interface HplMsp430GeneralIO as SOMI; uses interface HplMsp430GeneralIO as UCLK; uses interface HplMsp430GeneralIO as URXD; uses interface HplMsp430GeneralIO as UTXD; uses interface PlatformInterrupt; } implementation { MSP430REG_NORACE(IE2); MSP430REG_NORACE(ME2); MSP430REG_NORACE(IFG2); MSP430REG_NORACE(U1TCTL); MSP430REG_NORACE(U1RCTL); MSP430REG_NORACE(U1TXBUF); TOSH_SIGNAL(UART1RX_VECTOR) { uint8_t temp = U1RXBUF; signal Interrupts.rxDone(temp); call PlatformInterrupt.postAmble(); } TOSH_SIGNAL(UART1TX_VECTOR) { signal Interrupts.txDone(); call PlatformInterrupt.postAmble(); } async command error_t AsyncStdControl.start() { return SUCCESS; } async command error_t AsyncStdControl.stop() { call Usart.disableSpi(); call Usart.disableUart(); return SUCCESS; } async command void Usart.setUctl(msp430_uctl_t control) { U1CTL=uctl2int(control); } async command msp430_uctl_t Usart.getUctl() { return int2uctl(U0CTL); } async command void Usart.setUtctl(msp430_utctl_t control) { U1TCTL=utctl2int(control); } async command msp430_utctl_t Usart.getUtctl() { return int2utctl(U1TCTL); } async command void Usart.setUrctl(msp430_urctl_t control) { U1RCTL=urctl2int(control); } async command msp430_urctl_t Usart.getUrctl() { return int2urctl(U1RCTL); } async command void Usart.setUbr(uint16_t control) { atomic { U1BR0 = control & 0x00FF; U1BR1 = (control >> 8) & 0x00FF; } } async command uint16_t Usart.getUbr() { return (U1BR1 << 8) + U1BR0; } async command void Usart.setUmctl(uint8_t control) { U1MCTL=control; } async command uint8_t Usart.getUmctl() { return U1MCTL; } async command void Usart.resetUsart(bool reset) { if (reset) U1CTL = SWRST; else CLR_FLAG(U1CTL, SWRST); } async command bool Usart.isSpi() { atomic { return (U1CTL & SYNC) && (ME2 & USPIE1); } } async command bool Usart.isUart() { atomic { return !(U1CTL & SYNC) && ((ME2 & UTXE1) && (ME2 & URXE1)); } } async command bool Usart.isUartTx() { atomic { return !(U1CTL & SYNC) && (ME2 & UTXE1); } } async command bool Usart.isUartRx() { atomic { return !(U1CTL & SYNC) && (ME2 & URXE1); } } async command msp430_usartmode_t Usart.getMode() { if (call Usart.isUart()) return USART_UART; else if (call Usart.isUartRx()) return USART_UART_RX; else if (call Usart.isUartTx()) return USART_UART_TX; else if (call Usart.isSpi()) return USART_SPI; else return USART_NONE; } async command void Usart.enableUart() { atomic{ call UTXD.selectModuleFunc(); call URXD.selectModuleFunc(); } ME2 |= (UTXE1 | URXE1); // USART1 UART module enable } async command void Usart.disableUart() { atomic { ME2 &= ~(UTXE1 | URXE1); // USART1 UART module enable call UTXD.selectIOFunc(); call URXD.selectIOFunc(); } } async command void Usart.enableUartTx() { call UTXD.selectModuleFunc(); ME2 |= UTXE1; // USART1 UART Tx module enable } async command void Usart.disableUartTx() { ME2 &= ~UTXE1; // USART1 UART Tx module enable call UTXD.selectIOFunc(); } async command void Usart.enableUartRx() { call URXD.selectModuleFunc(); ME2 |= URXE1; // USART1 UART Rx module enable } async command void Usart.disableUartRx() { ME2 &= ~URXE1; // USART1 UART Rx module disable call URXD.selectIOFunc(); } async command void Usart.enableSpi() { atomic { call SIMO.selectModuleFunc(); call SOMI.selectModuleFunc(); call UCLK.selectModuleFunc(); } ME2 |= USPIE1; // USART1 SPI module enable } async command void Usart.disableSpi() { atomic { ME2 &= ~USPIE1; // USART1 SPI module disable call SIMO.selectIOFunc(); call SOMI.selectIOFunc(); call UCLK.selectIOFunc(); } } void configSpi(msp430_spi_union_config_t* config) { U1CTL = (config->spiRegisters.uctl) | SYNC | SWRST; U1TCTL = config->spiRegisters.utctl; call Usart.setUbr(config->spiRegisters.ubr); call Usart.setUmctl(0x00); } async command void Usart.setModeSpi(msp430_spi_union_config_t* config) { atomic { call Usart.resetUsart(TRUE); call Usart.disableUart(); configSpi(config); call Usart.enableSpi(); call Usart.resetUsart(FALSE); call Usart.clrIntr(); call Usart.disableIntr(); } return; } void configUart(msp430_uart_union_config_t* config) { U1CTL = (config->uartRegisters.uctl & ~SYNC) | SWRST; U1TCTL = config->uartRegisters.utctl; U1RCTL = config->uartRegisters.urctl; call Usart.setUbr(config->uartRegisters.ubr); call Usart.setUmctl(config->uartRegisters.umctl); } async command void Usart.setModeUart(msp430_uart_union_config_t* config) { atomic { call Usart.resetUsart(TRUE); call Usart.disableSpi(); configUart(config); if ((config->uartConfig.utxe == 1) && (config->uartConfig.urxe == 1)) { call Usart.enableUart(); } else if ((config->uartConfig.utxe == 0) && (config->uartConfig.urxe == 1)) { call Usart.disableUartTx(); call Usart.enableUartRx(); } else if ((config->uartConfig.utxe == 1) && (config->uartConfig.urxe == 0)){ call Usart.disableUartRx(); call Usart.enableUartTx(); } else { call Usart.disableUart(); } call Usart.resetUsart(FALSE); call Usart.clrIntr(); call Usart.disableIntr(); } return; } async command bool Usart.isTxIntrPending(){ if (IFG2 & UTXIFG1){ return TRUE; } return FALSE; } async command bool Usart.isTxEmpty(){ if (U1TCTL & TXEPT) { return TRUE; } return FALSE; } async command bool Usart.isRxIntrPending(){ if (IFG2 & URXIFG1){ return TRUE; } return FALSE; } async command void Usart.clrTxIntr(){ IFG2 &= ~UTXIFG1; } async command void Usart.clrRxIntr() { IFG2 &= ~URXIFG1; } async command void Usart.clrIntr() { IFG2 &= ~(UTXIFG1 | URXIFG1); } async command void Usart.disableRxIntr() { IE2 &= ~URXIE1; } async command void Usart.disableTxIntr() { IE2 &= ~UTXIE1; } async command void Usart.disableIntr() { IE2 &= ~(UTXIE1 | URXIE1); } async command void Usart.enableRxIntr() { atomic { IFG2 &= ~URXIFG1; IE2 |= URXIE1; } } async command void Usart.enableTxIntr() { atomic { IFG2 &= ~UTXIFG1; IE2 |= UTXIE1; } } async command void Usart.enableIntr() { atomic { IFG2 &= ~(UTXIFG1 | URXIFG1); IE2 |= (UTXIE1 | URXIE1); } } async command void Usart.tx(uint8_t data) { atomic U1TXBUF = data; } async command uint8_t Usart.rx() { uint8_t value; atomic value = U1RXBUF; return value; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/Msp430Adc12P.nc000066400000000000000000000071161207233610700240600ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2008-06-12 14:02:26 $ * @author: Jan Hauer * ======================================================================== */ #include configuration Msp430Adc12P { provides { interface Resource[uint8_t id]; interface Msp430Adc12SingleChannel as SingleChannel[uint8_t id]; interface Msp430Adc12MultiChannel as MultiChannel[uint8_t id]; interface Msp430Adc12Overflow as Overflow[uint8_t id]; interface AsyncStdControl as DMAExtension[uint8_t id]; } } implementation { components Msp430Adc12ImplP, HplAdc12P, MainC, new SimpleRoundRobinArbiterC(MSP430ADC12_RESOURCE) as Arbiter; Resource = Arbiter; SingleChannel = Msp430Adc12ImplP.SingleChannel; MultiChannel= Msp430Adc12ImplP.MultiChannel; Overflow = Msp430Adc12ImplP.Overflow; DMAExtension = Msp430Adc12ImplP.DMAExtension; Msp430Adc12ImplP.Init <- MainC; Msp430Adc12ImplP.ADCArbiterInfo -> Arbiter; Msp430Adc12ImplP.HplAdc12 -> HplAdc12P; #ifdef ADC12_P6PIN_AUTO_CONFIGURE components HplMsp430GeneralIOC; Msp430Adc12ImplP.Port60 -> HplMsp430GeneralIOC.Port60; Msp430Adc12ImplP.Port61 -> HplMsp430GeneralIOC.Port61; Msp430Adc12ImplP.Port62 -> HplMsp430GeneralIOC.Port62; Msp430Adc12ImplP.Port63 -> HplMsp430GeneralIOC.Port63; Msp430Adc12ImplP.Port64 -> HplMsp430GeneralIOC.Port64; Msp430Adc12ImplP.Port65 -> HplMsp430GeneralIOC.Port65; Msp430Adc12ImplP.Port66 -> HplMsp430GeneralIOC.Port66; Msp430Adc12ImplP.Port67 -> HplMsp430GeneralIOC.Port67; #endif #ifdef ADC12_TIMERA_ENABLED components Msp430TimerC; Msp430Adc12ImplP.TimerA -> Msp430TimerC.TimerA; Msp430Adc12ImplP.ControlA0 -> Msp430TimerC.ControlA0; Msp430Adc12ImplP.ControlA1 -> Msp430TimerC.ControlA1; Msp430Adc12ImplP.CompareA0 -> Msp430TimerC.CompareA0; Msp430Adc12ImplP.CompareA1 -> Msp430TimerC.CompareA1; #endif components PlatformInterruptC; HplAdc12P.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/Msp430TimerC.nc000066400000000000000000000156401207233610700242720ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp */ configuration Msp430TimerC { provides interface Msp430Timer as TimerA; provides interface Msp430TimerControl as ControlA0; provides interface Msp430TimerControl as ControlA1; provides interface Msp430TimerControl as ControlA2; provides interface Msp430Compare as CompareA0; provides interface Msp430Compare as CompareA1; provides interface Msp430Compare as CompareA2; provides interface Msp430Capture as CaptureA0; provides interface Msp430Capture as CaptureA1; provides interface Msp430Capture as CaptureA2; provides interface Msp430Timer as TimerB; provides interface Msp430TimerControl as ControlB0; provides interface Msp430TimerControl as ControlB1; provides interface Msp430TimerControl as ControlB2; provides interface Msp430TimerControl as ControlB3; provides interface Msp430TimerControl as ControlB4; provides interface Msp430TimerControl as ControlB5; provides interface Msp430TimerControl as ControlB6; provides interface Msp430Compare as CompareB0; provides interface Msp430Compare as CompareB1; provides interface Msp430Compare as CompareB2; provides interface Msp430Compare as CompareB3; provides interface Msp430Compare as CompareB4; provides interface Msp430Compare as CompareB5; provides interface Msp430Compare as CompareB6; provides interface Msp430Capture as CaptureB0; provides interface Msp430Capture as CaptureB1; provides interface Msp430Capture as CaptureB2; provides interface Msp430Capture as CaptureB3; provides interface Msp430Capture as CaptureB4; provides interface Msp430Capture as CaptureB5; provides interface Msp430Capture as CaptureB6; } implementation { components new Msp430TimerP( TAIV_, TAR_, TACTL_, TAIFG, TACLR, TAIE, TASSEL0, TASSEL1, FALSE ) as Msp430TimerA , new Msp430TimerP( TBIV_, TBR_, TBCTL_, TBIFG, TBCLR, TBIE, TBSSEL0, TBSSEL1, TRUE ) as Msp430TimerB , new Msp430TimerCapComP( TACCTL0_, TACCR0_ ) as Msp430TimerA0 , new Msp430TimerCapComP( TACCTL1_, TACCR1_ ) as Msp430TimerA1 , new Msp430TimerCapComP( TACCTL2_, TACCR2_ ) as Msp430TimerA2 , new Msp430TimerCapComP( TBCCTL0_, TBCCR0_ ) as Msp430TimerB0 , new Msp430TimerCapComP( TBCCTL1_, TBCCR1_ ) as Msp430TimerB1 , new Msp430TimerCapComP( TBCCTL2_, TBCCR2_ ) as Msp430TimerB2 , new Msp430TimerCapComP( TBCCTL3_, TBCCR3_ ) as Msp430TimerB3 , new Msp430TimerCapComP( TBCCTL4_, TBCCR4_ ) as Msp430TimerB4 , new Msp430TimerCapComP( TBCCTL5_, TBCCR5_ ) as Msp430TimerB5 , new Msp430TimerCapComP( TBCCTL6_, TBCCR6_ ) as Msp430TimerB6 , Msp430TimerCommonP as Common ; // Timer A TimerA = Msp430TimerA.Timer; Msp430TimerA.Overflow -> Msp430TimerA.Event[5]; Msp430TimerA.VectorTimerX0 -> Common.VectorTimerA0; Msp430TimerA.VectorTimerX1 -> Common.VectorTimerA1; // Timer A0 ControlA0 = Msp430TimerA0.Control; CompareA0 = Msp430TimerA0.Compare; CaptureA0 = Msp430TimerA0.Capture; Msp430TimerA0.Timer -> Msp430TimerA.Timer; Msp430TimerA0.Event -> Msp430TimerA.Event[0]; // Timer A1 ControlA1 = Msp430TimerA1.Control; CompareA1 = Msp430TimerA1.Compare; CaptureA1 = Msp430TimerA1.Capture; Msp430TimerA1.Timer -> Msp430TimerA.Timer; Msp430TimerA1.Event -> Msp430TimerA.Event[1]; // Timer A2 ControlA2 = Msp430TimerA2.Control; CompareA2 = Msp430TimerA2.Compare; CaptureA2 = Msp430TimerA2.Capture; Msp430TimerA2.Timer -> Msp430TimerA.Timer; Msp430TimerA2.Event -> Msp430TimerA.Event[2]; // Timer B TimerB = Msp430TimerB.Timer; Msp430TimerB.Overflow -> Msp430TimerB.Event[7]; Msp430TimerB.VectorTimerX0 -> Common.VectorTimerB0; Msp430TimerB.VectorTimerX1 -> Common.VectorTimerB1; // Timer B0 ControlB0 = Msp430TimerB0.Control; CompareB0 = Msp430TimerB0.Compare; CaptureB0 = Msp430TimerB0.Capture; Msp430TimerB0.Timer -> Msp430TimerB.Timer; Msp430TimerB0.Event -> Msp430TimerB.Event[0]; // Timer B1 ControlB1 = Msp430TimerB1.Control; CompareB1 = Msp430TimerB1.Compare; CaptureB1 = Msp430TimerB1.Capture; Msp430TimerB1.Timer -> Msp430TimerB.Timer; Msp430TimerB1.Event -> Msp430TimerB.Event[1]; // Timer B2 ControlB2 = Msp430TimerB2.Control; CompareB2 = Msp430TimerB2.Compare; CaptureB2 = Msp430TimerB2.Capture; Msp430TimerB2.Timer -> Msp430TimerB.Timer; Msp430TimerB2.Event -> Msp430TimerB.Event[2]; // Timer B3 ControlB3 = Msp430TimerB3.Control; CompareB3 = Msp430TimerB3.Compare; CaptureB3 = Msp430TimerB3.Capture; Msp430TimerB3.Timer -> Msp430TimerB.Timer; Msp430TimerB3.Event -> Msp430TimerB.Event[3]; // Timer B4 ControlB4 = Msp430TimerB4.Control; CompareB4 = Msp430TimerB4.Compare; CaptureB4 = Msp430TimerB4.Capture; Msp430TimerB4.Timer -> Msp430TimerB.Timer; Msp430TimerB4.Event -> Msp430TimerB.Event[4]; // Timer B5 ControlB5 = Msp430TimerB5.Control; CompareB5 = Msp430TimerB5.Compare; CaptureB5 = Msp430TimerB5.Capture; Msp430TimerB5.Timer -> Msp430TimerB.Timer; Msp430TimerB5.Event -> Msp430TimerB.Event[5]; // Timer B6 ControlB6 = Msp430TimerB6.Control; CompareB6 = Msp430TimerB6.Compare; CaptureB6 = Msp430TimerB6.Capture; Msp430TimerB6.Timer -> Msp430TimerB.Timer; Msp430TimerB6.Event -> Msp430TimerB.Event[6]; components PlatformInterruptC; Common.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/Msp430TimerCommonP.nc000066400000000000000000000013641207233610700254560ustar00rootroot00000000000000 module Msp430TimerCommonP { provides interface Msp430TimerEvent as VectorTimerA0; provides interface Msp430TimerEvent as VectorTimerA1; provides interface Msp430TimerEvent as VectorTimerB0; provides interface Msp430TimerEvent as VectorTimerB1; uses interface PlatformInterrupt; } implementation { TOSH_SIGNAL(TIMERA0_VECTOR) { signal VectorTimerA0.fired(); call PlatformInterrupt.postAmble(); } TOSH_SIGNAL(TIMERA1_VECTOR) { signal VectorTimerA1.fired(); call PlatformInterrupt.postAmble(); } TOSH_SIGNAL(TIMERB0_VECTOR) { signal VectorTimerB0.fired(); call PlatformInterrupt.postAmble(); } TOSH_SIGNAL(TIMERB1_VECTOR) { signal VectorTimerB1.fired(); call PlatformInterrupt.postAmble(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/adc12/000077500000000000000000000000001207233610700225425ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/adc12/BlockingAdcP.nc000066400000000000000000000064701207233610700253530ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" configuration BlockingAdcP { provides { interface BlockingRead as BlockingRead[uint8_t client]; interface BlockingReadStream as BlockingReadStream[uint8_t streamClient]; } uses { //For BlockingRead interface AdcConfigure as Config[uint8_t client]; interface Msp430Adc12SingleChannel as SingleChannel[uint8_t client]; interface Resource as ResourceRead[uint8_t client]; //For BlockingReadStream interface AdcConfigure as ConfigReadStream[uint8_t streamClient]; interface Msp430Adc12SingleChannel as SingleChannelReadStream[uint8_t streamClient]; interface Resource as ResourceReadStream[uint8_t streamClient]; } } implementation { components MainC; components AdcP; components WireAdcStreamP; components new BlockingReadP(); components new BlockingReadStreamP(); MainC.SoftwareInit -> BlockingReadP; MainC.SoftwareInit -> BlockingReadStreamP; //For BlockingRead BlockingRead = BlockingReadP; Config = AdcP.Config; SingleChannel = AdcP.SingleChannel; ResourceRead = AdcP.ResourceRead; BlockingReadP.Read -> AdcP.Read; //For BlockingReadStream BlockingReadStream = BlockingReadStreamP; ConfigReadStream = WireAdcStreamP; SingleChannelReadStream = WireAdcStreamP; ResourceReadStream = WireAdcStreamP; BlockingReadStreamP.ReadStream -> WireAdcStreamP; components SystemCallC; components SystemCallQueueC; BlockingReadP.SystemCallQueue -> SystemCallQueueC; BlockingReadP.SystemCall -> SystemCallC; BlockingReadStreamP.SystemCallQueue -> SystemCallQueueC; BlockingReadStreamP.SystemCall -> SystemCallC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/adc12/BlockingAdcReadClientC.nc000066400000000000000000000050721207233610700272660ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include generic configuration BlockingAdcReadClientC() { provides interface BlockingRead; uses interface AdcConfigure; } implementation { components BlockingAdcP, #ifdef REF_VOLT_AUTO_CONFIGURE // if the client configuration requires a stable // reference voltage, the reference voltage generator // is automatically enabled new Msp430Adc12ClientAutoRVGC() as Msp430AdcClient; #else new Msp430Adc12ClientC() as Msp430AdcClient; #endif enum { CLIENT = unique(ADCC_SERVICE), }; BlockingRead = BlockingAdcP.BlockingRead[CLIENT]; AdcConfigure = BlockingAdcP.Config[CLIENT]; BlockingAdcP.SingleChannel[CLIENT] -> Msp430AdcClient.Msp430Adc12SingleChannel; BlockingAdcP.ResourceRead[CLIENT] -> Msp430AdcClient.Resource; #ifdef REF_VOLT_AUTO_CONFIGURE AdcConfigure = Msp430AdcClient.AdcConfigure; #endif } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/adc12/BlockingAdcReadStreamClientC.nc000066400000000000000000000052001207233610700304330ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include generic configuration BlockingAdcReadStreamClientC() { provides interface BlockingReadStream; uses interface AdcConfigure; } implementation { components BlockingAdcP, #ifdef REF_VOLT_AUTO_CONFIGURE // if the client configuration requires a stable // reference voltage, the reference voltage generator // is automatically enabled new Msp430Adc12ClientAutoRVGC() as Msp430AdcPlient; #else new Msp430Adc12ClientC() as Msp430AdcPlient; #endif enum { RSCLIENT = unique(ADCC_READ_STREAM_SERVICE), }; BlockingReadStream = BlockingAdcP.BlockingReadStream[RSCLIENT]; AdcConfigure = BlockingAdcP.ConfigReadStream[RSCLIENT]; BlockingAdcP.SingleChannelReadStream[RSCLIENT] -> Msp430AdcPlient.Msp430Adc12SingleChannel; BlockingAdcP.ResourceReadStream[RSCLIENT] -> Msp430AdcPlient.Resource; #ifdef REF_VOLT_AUTO_CONFIGURE AdcConfigure = Msp430AdcPlient.AdcConfigure; #endif } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/chip_thread.h000066400000000000000000000112751207233610700243010ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This file is derived from similar files in the TinyThread implementation * by William P. McCartney from Cleveland State University (2006) * * This file contains MSP430 platform-specific routines for implementing * threads in TinyOS * * @author Kevin Klues */ //Define on platform specific basis for inclusion in // the thread control block typedef struct thread_regs { uint16_t status; uint16_t r4; uint16_t r5; uint16_t r6; uint16_t r7; uint16_t r8; uint16_t r9; uint16_t r10; uint16_t r11; uint16_t r12; uint16_t r13; uint16_t r14; uint16_t r15; } thread_regs_t; typedef uint16_t* stack_ptr_t; #define STACK_TOP(stack, size) \ (&(((uint8_t*)stack)[size - sizeof(stack_ptr_t)])) //Save stack pointer #define SAVE_STACK_PTR(t) \ __asm__("mov.w r1,%0" : "=m" ((t)->stack_ptr)) //Save status register #define SAVE_STATUS(t) \ __asm__("mov.w r2,%0" : "=r" ((t)->regs.status)) //Save General Purpose Registers #define SAVE_GPR(t) \ __asm__("mov.w r4,%0" : "=m" ((t)->regs.r4)); \ __asm__("mov.w r5,%0" : "=m" ((t)->regs.r5)); \ __asm__("mov.w r6,%0" : "=m" ((t)->regs.r6)); \ __asm__("mov.w r7,%0" : "=m" ((t)->regs.r7)); \ __asm__("mov.w r8,%0" : "=m" ((t)->regs.r8)); \ __asm__("mov.w r9,%0" : "=m" ((t)->regs.r9)); \ __asm__("mov.w r10,%0" : "=m" ((t)->regs.r10)); \ __asm__("mov.w r11,%0" : "=m" ((t)->regs.r11)); \ __asm__("mov.w r12,%0" : "=m" ((t)->regs.r12)); \ __asm__("mov.w r13,%0" : "=m" ((t)->regs.r13)); \ __asm__("mov.w r14,%0" : "=m" ((t)->regs.r14)); \ __asm__("mov.w r15,%0" : "=m" ((t)->regs.r15)) //Restore stack pointer #define RESTORE_STACK_PTR(t) \ __asm__("mov.w %0,r1" : : "m" ((t)->stack_ptr)) //Restore status register #define RESTORE_STATUS(t) \ __asm__("mov.w %0,r2" : : "r" ((t)->regs.status)) //Restore the general purpose registers #define RESTORE_GPR(t) \ __asm__("mov.w %0,r4" : : "m" ((t)->regs.r4)); \ __asm__("mov.w %0,r5" : : "m" ((t)->regs.r5)); \ __asm__("mov.w %0,r6" : : "m" ((t)->regs.r6)); \ __asm__("mov.w %0,r7" : : "m" ((t)->regs.r7)); \ __asm__("mov.w %0,r8" : : "m" ((t)->regs.r8)); \ __asm__("mov.w %0,r9" : : "m" ((t)->regs.r9)); \ __asm__("mov.w %0,r10" : : "m" ((t)->regs.r10)); \ __asm__("mov.w %0,r11" : : "m" ((t)->regs.r11)); \ __asm__("mov.w %0,r12" : : "m" ((t)->regs.r12)); \ __asm__("mov.w %0,r13" : : "m" ((t)->regs.r13)); \ __asm__("mov.w %0,r14" : : "m" ((t)->regs.r14)); \ __asm__("mov.w %0,r15" : : "m" ((t)->regs.r15)) #define SAVE_TCB(t) \ SAVE_GPR(t); \ SAVE_STATUS(t); \ SAVE_STACK_PTR(t) #define RESTORE_TCB(t) \ RESTORE_STACK_PTR(t); \ RESTORE_STATUS(t); \ RESTORE_GPR(t) #define SWITCH_CONTEXTS(from, to) \ SAVE_TCB(from); \ RESTORE_TCB(to) #define SWAP_STACK_PTR(OLD, NEW) \ __asm__("mov.w r1,%0" : "=m" (OLD)); \ __asm__("mov.w %0,r1" : : "m" (NEW)) #define PREPARE_THREAD(t, thread_ptr) \ *((t)->stack_ptr) = (uint16_t)(&(thread_ptr)); \ SAVE_STATUS(t) tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/sensors/000077500000000000000000000000001207233610700233445ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/sensors/BlockingMsp430InternalTemperatureC.nc000066400000000000000000000051401207233610700323430ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Msp430InternalTemperatureC is the temperature sensor available on * the msp430-based platforms. * * To convert from ADC counts to temperature, convert to voltage by * dividing by 4096 and multiplying by Vref (1.5V). Then subtract * 0.986 from voltage and divide by 0.00355 to get degrees C. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2008-09-11 19:59:50 $ */ /** * Port to Tosthreads * * @author Chieh-Jan Mike Liang */ generic configuration BlockingMsp430InternalTemperatureC() { provides { interface BlockingRead; interface BlockingReadStream; } } implementation { components new BlockingAdcReadClientC(); BlockingRead = BlockingAdcReadClientC; components new BlockingAdcReadStreamClientC(); BlockingReadStream = BlockingAdcReadStreamClientC; components Msp430InternalTemperatureP; BlockingAdcReadClientC.AdcConfigure -> Msp430InternalTemperatureP; BlockingAdcReadStreamClientC.AdcConfigure -> Msp430InternalTemperatureP; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/msp430/sensors/BlockingMsp430InternalVoltageC.nc000066400000000000000000000047311207233610700314540ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Msp430InternalVoltageC is the voltage sensor available on the * msp430-based platforms. * * To convert from ADC counts to actual voltage, divide by 4096 and * multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2008-09-11 19:59:50 $ */ /** * Port to Tosthreads * * @author Chieh-Jan Mike Liang */ generic configuration BlockingMsp430InternalVoltageC() { provides { interface BlockingRead; interface BlockingReadStream; } } implementation { components new BlockingAdcReadClientC(); BlockingRead = BlockingAdcReadClientC; components new BlockingAdcReadStreamClientC(); BlockingReadStream = BlockingAdcReadStreamClientC; components Msp430InternalVoltageP; BlockingAdcReadClientC.AdcConfigure -> Msp430InternalVoltageP; BlockingAdcReadStreamClientC.AdcConfigure -> Msp430InternalVoltageP; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/pxa27x/000077500000000000000000000000001207233610700217535ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/pxa27x/HplPXA27xInterruptImplM.nc000066400000000000000000000144221207233610700266110ustar00rootroot00000000000000// $Id: HplPXA27xInterruptImplM.nc,v 1.1 2008-06-12 14:02:31 klueska Exp $ /* tab:4 * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * * Authors: Phil Buonadonna * * Edits: Josh Herbach * Revised: 09/02/2005 * * Edits: Kevin Klues * Revised: 05/27/2008 */ module HplPXA27xInterruptM { provides { interface HplPXA27xInterrupt as PXA27xIrq[uint8_t id]; interface HplPXA27xInterruptCntl; } uses interface PlatformInterrupt; } implementation { uint32_t getICHP() { uint32_t val; asm volatile ("mrc p6,0,%0,c5,c0,0\n\t":"=r" (val)); return val; } /* Core PXA27X interrupt dispatch vectors */ /* DO NOT change the name of these functions */ void hplarmv_irq() __attribute__ ((interrupt ("IRQ"))) @C() @atomic_hwevent() { uint32_t IRQPending; IRQPending = getICHP(); // Determine which interrupt to service IRQPending >>= 16; // Right justify to the IRQ portion while (IRQPending & (1 << 15)) { uint8_t PeripheralID = (IRQPending & 0x3f); // Get rid of the Valid bit signal PXA27xIrq.fired[PeripheralID](); // Handler is responsible for clearing interrupt call PlatformInterrupt.postAmble(); IRQPending = getICHP(); // Determine which interrupt to service IRQPending >>= 16; // Right justify to the IRQ portion } return; } void hplarmv_fiq() __attribute__ ((interrupt ("FIQ"))) @C() @atomic_hwevent() { call PlatformInterrupt.postAmble(); } static uint8_t usedPriorities = 0; /* Helper functions */ /* NOTE: Read-back of all register writes is necessary to ensure the data latches */ error_t allocate(uint8_t id, bool level, uint8_t priority) { uint32_t tmp; error_t error = FAIL; atomic{ uint8_t i; if(usedPriorities == 0){//assumed that the table will have some entries uint8_t PriorityTable[40], DuplicateTable[40]; for(i = 0; i < 40; i++){ DuplicateTable[i] = PriorityTable[i] = 0xFF; } for(i = 0; i < 40; i++) if(TOSH_IRP_TABLE[i] != 0xff){ if(PriorityTable[TOSH_IRP_TABLE[i]] != 0xFF)/*duplicate priorities in the table, mark for later fixing*/ DuplicateTable[i] = PriorityTable[TOSH_IRP_TABLE[i]]; else PriorityTable[TOSH_IRP_TABLE[i]] = i; } //compress table for(i = 0; i < 40; i++){ if(PriorityTable[i] != 0xff){ PriorityTable[usedPriorities] = PriorityTable[i]; if(i != usedPriorities) PriorityTable[i] = 0xFF; usedPriorities++; } } for(i = 0; i < 40; i++) if(DuplicateTable[i] != 0xFF){ uint8_t j, ExtraTable[40]; for(j = 0; DuplicateTable[i] != PriorityTable[j]; j++); memcpy(ExtraTable + j + 1, PriorityTable + j, usedPriorities - j); memcpy(PriorityTable + j + 1, ExtraTable + j + 1, usedPriorities - j); PriorityTable[j] = i; usedPriorities++; } for(i = 0; i < usedPriorities; i++){ IPR(i) = (IPR_VALID | PriorityTable[i]); tmp = IPR(i); } } if (id < 34){ if(priority == 0xff){ priority = usedPriorities; usedPriorities++; IPR(priority) = (IPR_VALID | (id)); tmp = IPR(priority); } if (level) { _ICLR(id) |= _PPID_Bit(id); tmp = _ICLR(id); } error = SUCCESS; } } return error; } void enable(uint8_t id) { uint32_t tmp; atomic { if (id < 34) { _ICMR(id) |= _PPID_Bit(id); tmp = _ICMR(id); } } return; } void disable(uint8_t id) { uint32_t tmp; atomic { if (id < 34) { _ICMR(id) &= ~(_PPID_Bit(id)); tmp = _ICMR(id); } } return; } /* Interface implementation */ async command error_t PXA27xIrq.allocate[uint8_t id]() { return allocate(id, FALSE, TOSH_IRP_TABLE[id]); } async command void PXA27xIrq.enable[uint8_t id]() { enable(id); return; } async command void PXA27xIrq.disable[uint8_t id]() { disable(id); return; } async command void HplPXA27xInterruptCntl.setICCR_DIM(bool flag) { if (flag) { ICCR |= ICCR_DIM; } else { ICCR = 0; } return; } async command bool HplPXA27xInterruptCntl.getICCR_DIM() { bool result = FALSE; if (ICCR & ICCR_DIM) { result = TRUE; } return result; } default async event void PXA27xIrq.fired[uint8_t id]() { return; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/pxa27x/HplPXA27xInterruptM.nc000066400000000000000000000050151207233610700257650ustar00rootroot00000000000000// $Id: HplPXA27xInterruptM.nc,v 1.1 2008-06-12 14:02:31 klueska Exp $ /* tab:4 * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * * Authors: Phil Buonadonna * * Edits: Josh Herbach * Revised: 09/02/2005 * * Edits: Kevin Klues * Revised: 05/27/2008 */ configuration HplPXA27xInterruptM { provides { interface HplPXA27xInterrupt as PXA27xIrq[uint8_t id]; interface HplPXA27xInterruptCntl; } } implementation { components HplPXA27xInterruptImplM; PXA27xIrq = HplPXA27xInterruptImplM; HplPXA27xInterruptCntl = HplPXA27xInterruptImplM; components PlatformInterruptC; HplInterruptP.PlatformInterrupt -> PlatformInterruptC; }tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/pxa27x/chip_thread.h000066400000000000000000000050711207233610700244010ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This file is derived from similar files in the TinyThread implementation * by William P. McCartney from Cleveland State University (2006) * * This file contains MSP430 platform-specific routines for implementing * threads in TinyOS * * @author Kevin Klues */ //Define on platform specific basis for inclusion in // the thread control block typedef struct thread_regs { } thread_regs_t; typedef uint16_t* stack_ptr_t; #define STACK_TOP(stack, size) \ (&(((uint8_t*)stack)[size - sizeof(stack_ptr_t)])) //Save stack pointer #define SAVE_STACK_PTR(t) //Save status register #define SAVE_STATUS(t) //Save General Purpose Registers #define SAVE_GPR(t) //Restore stack pointer #define RESTORE_STACK_PTR(t) //Restore status register #define RESTORE_STATUS(t) //Restore the general purpose registers #define RESTORE_GPR(t) #define SAVE_TCB(t) #define RESTORE_TCB(t) #define SWITCH_CONTEXTS(from, to) #define SWAP_STACK_PTR(OLD, NEW) #define PREPARE_THREAD(t, thread_ptr) tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/tda5250/000077500000000000000000000000001207233610700217065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/tda5250/Tda5250ActiveMessageC.nc000066400000000000000000000067051207233610700260300ustar00rootroot00000000000000// $Id: Tda5250ActiveMessageC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: Tda5250ActiveMessageC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ * */ /** * * The Active Message layer for the TDA5250 radio. This configuration * just layers the AM dispatch (Tda5250ActiveMessageP) on top of the * underlying TDA5250 radio packet. * * @author Philip Levis * @author Vlado Handziski (TDA5250 modifications) * @date July 20 2005 */ #include "Timer.h" configuration Tda5250ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface AMPacket; interface Packet; interface PacketAcknowledgements; interface Tda5250Packet; } } implementation { components Tda5250ActiveMessageP as AM, RadioDataLinkC as Radio; components ActiveMessageAddressC as Address; SplitControl = Radio; Packet = Radio; PacketAcknowledgements = Radio; Tda5250Packet = AM; AMSend = AM; Receive = AM.Receive; ReceiveDefault = AM.ReceiveDefault; Snoop = AM.Snoop; SnoopDefault = AM.SnoopDefault; AMPacket = AM; AM.SubSend -> Radio.Send; AM.SubReceive -> Radio.Receive; AM.SubPacket -> Radio.Packet; AM.amAddress -> Address; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/tda5250/Tda5250ActiveMessageP.nc000066400000000000000000000144461207233610700260460ustar00rootroot00000000000000// -*- mode:c++; indent-tabs-mode: nil -*- $Id: Tda5250ActiveMessageP.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: Tda5250ActiveMessageP.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ * */ /** * @author Philip Levis * @author Vlado Handziski (TDA5250 modifications) * @date July 20 2005 */ module Tda5250ActiveMessageP { provides { interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface AMPacket; interface Tda5250Packet; } uses { interface Send as SubSend; interface Receive as SubReceive; interface Packet as SubPacket; command am_addr_t amAddress(); } } implementation { tda5250_header_t* getHeader( message_t* msg ) { return (tda5250_header_t*)( msg->data - sizeof(tda5250_header_t) ); } tda5250_metadata_t* getMetadata(message_t* amsg) { return (tda5250_metadata_t*)((uint8_t*)amsg->footer + sizeof(message_radio_footer_t)); } command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len) { tda5250_header_t* header = getHeader(msg); header->type = id; header->dest = addr; header->src = call amAddress(); return call SubSend.send(msg, len); } command error_t AMSend.cancel[am_id_t id](message_t* msg) { return call SubSend.cancel(msg); } event void SubSend.sendDone(message_t* msg, error_t result) { signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call SubPacket.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call SubPacket.getPayload(m, len); } /* Receiving a packet */ event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { if (call AMPacket.isForMe(msg)) { return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len); } else { return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len); } } command am_addr_t AMPacket.address() { return call amAddress(); } command am_addr_t AMPacket.destination(message_t* amsg) { tda5250_header_t* header = getHeader(amsg); return header->dest; } command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { tda5250_header_t* header = getHeader(amsg); header->dest = addr; } command am_addr_t AMPacket.source(message_t* amsg) { tda5250_header_t* header = getHeader(amsg); return header->src; } command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { tda5250_header_t* header = getHeader(amsg); header->src = addr; } command bool AMPacket.isForMe(message_t* amsg) { return (call AMPacket.destination(amsg) == call AMPacket.address() || call AMPacket.destination(amsg) == AM_BROADCAST_ADDR); } command am_id_t AMPacket.type(message_t* amsg) { tda5250_header_t* header = getHeader(amsg); return header->type; } command void AMPacket.setType(message_t* amsg, am_id_t type) { tda5250_header_t* header = getHeader(amsg); header->type = type; } command void AMPacket.setGroup(message_t* msg, am_group_t group) { return; } command am_group_t AMPacket.group(message_t* msg) { return TOS_AM_GROUP; } command am_group_t AMPacket.localGroup() { return TOS_AM_GROUP; } async command uint8_t Tda5250Packet.getSnr(message_t* msg) { return getMetadata(msg)->strength; } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { return; } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal ReceiveDefault.receive[id](msg, payload, len); } default event message_t* ReceiveDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal SnoopDefault.receive[id](msg, payload, len); } default event message_t* SnoopDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/xe1205/000077500000000000000000000000001207233610700215465ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/xe1205/XE1205ActiveMessageC.nc000066400000000000000000000063561207233610700254720ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * @author Henri Dubois-Ferriere * */ configuration XE1205ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface AMPacket; interface Packet; interface PacketAcknowledgements; #ifdef LOW_POWER_LISTENING interface LowPowerListening; #endif } } implementation { components XE1205SendReceiveC; Packet = XE1205SendReceiveC; PacketAcknowledgements = XE1205SendReceiveC; components XE1205ActiveMessageP; #ifdef LOW_POWER_LISTENING components XE1205LowPowerListeningC as Lpl; LowPowerListening = Lpl; XE1205ActiveMessageP.SubSend -> Lpl.Send; XE1205ActiveMessageP.SubReceive -> Lpl.Receive; SplitControl = Lpl; #else XE1205ActiveMessageP.Packet -> XE1205SendReceiveC; XE1205ActiveMessageP.SubSend -> XE1205SendReceiveC.Send; XE1205ActiveMessageP.SubReceive -> XE1205SendReceiveC.Receive; SplitControl = XE1205SendReceiveC; #endif AMPacket = XE1205ActiveMessageP; AMSend = XE1205ActiveMessageP; Receive = XE1205ActiveMessageP.Receive; ReceiveDefault = XE1205ActiveMessageP.ReceiveDefault; Snoop = XE1205ActiveMessageP.Snoop; SnoopDefault = XE1205ActiveMessageP.SnoopDefault; components ActiveMessageAddressC; XE1205ActiveMessageP.amAddress -> ActiveMessageAddressC; components XE1205IrqConfC, XE1205PatternConfC, XE1205PhyRssiConfC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/chips/xe1205/XE1205ActiveMessageP.nc000066400000000000000000000131611207233610700254770ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * @author Henri Dubois-Ferriere * */ module XE1205ActiveMessageP { uses interface Packet; uses interface Send as SubSend; uses interface Receive as SubReceive; uses command am_addr_t amAddress(); provides interface AMSend[am_id_t id]; provides interface AMPacket; provides interface Receive[am_id_t id]; provides interface Receive as ReceiveDefault[am_id_t id]; provides interface Receive as Snoop[am_id_t id]; provides interface Receive as SnoopDefault[am_id_t id]; } implementation { // xxx - this is replicated in ActiveMessageP. // put in XE1205.h? xe1205_header_t* getHeader( message_t* msg ) { return (xe1205_header_t*)( msg->data - sizeof(xe1205_header_t) ); } command am_addr_t AMPacket.address() { return call amAddress(); } command am_addr_t AMPacket.destination(message_t* msg) { xe1205_header_t* header = getHeader(msg); return header->dest; } command void AMPacket.setDestination(message_t* msg, am_addr_t addr) { xe1205_header_t* header = getHeader(msg); header->dest = addr; } command am_addr_t AMPacket.source(message_t* msg) { xe1205_header_t* header = getHeader(msg); return header->source; } command void AMPacket.setSource(message_t* msg, am_addr_t addr) { xe1205_header_t* header = getHeader(msg); header->source = addr; } command bool AMPacket.isForMe(message_t* msg) { return (call AMPacket.destination(msg) == call AMPacket.address() || call AMPacket.destination(msg) == AM_BROADCAST_ADDR); } command am_id_t AMPacket.type(message_t* msg) { xe1205_header_t* header = getHeader(msg); return header->type; } command void AMPacket.setType(message_t* msg, am_id_t type) { xe1205_header_t* header = getHeader(msg); header->type = type; } command void AMPacket.setGroup(message_t* msg, am_group_t group) { xe1205_header_t* header = getHeader(msg); header->group = group; } command am_group_t AMPacket.group(message_t* msg) { xe1205_header_t* header = getHeader(msg); return header->group; } command am_group_t AMPacket.localGroup() { return TOS_AM_GROUP; } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len) { xe1205_header_t* header = getHeader(msg); header->type = id; header->dest = addr; header->source = call AMPacket.address(); header->group = TOS_AM_GROUP; return call SubSend.send(msg, len); } command error_t AMSend.cancel[am_id_t id](message_t* msg) { return call SubSend.cancel(msg); } event void SubSend.sendDone(message_t* msg, error_t result) { signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { return; } event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) __attribute__ ((noinline)) { if (call AMPacket.isForMe(msg)) { return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len); } else { return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len); } } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal ReceiveDefault.receive[id](msg, payload, len); } default event message_t* ReceiveDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal SnoopDefault.receive[id](msg, payload, len); } default event message_t* SnoopDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/000077500000000000000000000000001207233610700212035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CAMRadioC.nc000066400000000000000000000041271207233610700232130ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #include "tosthread_amradio.h" configuration CAMRadioC {} implementation { components CAMRadioP as CAMP; components BlockingActiveMessageC as AM; CAMP.BlockingStdControl -> AM; CAMP.BlockingReceive -> AM.BlockingReceive; CAMP.BlockingSnoop -> AM.BlockingSnoop; CAMP.BlockingReceiveAny -> AM.BlockingReceiveAny; CAMP.BlockingSnoopAny -> AM.BlockingSnoopAny; CAMP.Send -> AM; CAMP.Packet -> AM; CAMP.AMPacket -> AM; CAMP.PacketAcknowledgements -> AM; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CAMRadioP.nc000066400000000000000000000117741207233610700232360ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ module CAMRadioP { uses { interface BlockingStdControl; interface BlockingReceive[am_id_t amId]; interface BlockingReceive as BlockingReceiveAny; interface BlockingReceive as BlockingSnoop[am_id_t amId]; interface BlockingReceive as BlockingSnoopAny; interface BlockingAMSend as Send[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; } } implementation { error_t amRadioStart() @C() AT_SPONTANEOUS { return call BlockingStdControl.start(); } error_t amRadioStop() @C() AT_SPONTANEOUS { return call BlockingStdControl.stop(); } error_t amRadioReceive(message_t* m, uint32_t timeout, am_id_t amId) @C() AT_SPONTANEOUS { if(amId == AM_RECEIVE_FROM_ANY) return call BlockingReceiveAny.receive(m, timeout); else return call BlockingReceive.receive[amId](m, timeout); } error_t amRadioSnoop(message_t* m, uint32_t timeout, am_id_t amId) @C() AT_SPONTANEOUS { if(amId == AM_RECEIVE_FROM_ANY) return call BlockingSnoopAny.receive(m, timeout); else return call BlockingSnoop.receive[amId](m, timeout); } error_t amRadioSend(am_addr_t addr, message_t* msg, uint8_t len, am_id_t amId) @C() AT_SPONTANEOUS { return call Send.send[amId](addr, msg, len); } am_addr_t amRadioGetLocalAddress() @C() AT_SPONTANEOUS { return call AMPacket.address(); } am_group_t amRadioGetLocalGroup() @C() AT_SPONTANEOUS { return call AMPacket.localGroup(); } am_addr_t amRadioGetDestination(message_t* amsg) @C() AT_SPONTANEOUS { return call AMPacket.destination(amsg); } am_addr_t amRadioGetSource(message_t* amsg) @C() AT_SPONTANEOUS { return call AMPacket.source(amsg); } void amRadioSetDestination(message_t* amsg, am_addr_t addr) @C() AT_SPONTANEOUS { call AMPacket.setDestination(amsg, addr); } void amRadioSetSource(message_t* amsg, am_addr_t addr) @C() AT_SPONTANEOUS { call AMPacket.setSource(amsg, addr); } bool amRadioIsForMe(message_t* amsg) @C() AT_SPONTANEOUS { return call AMPacket.isForMe(amsg); } am_id_t amRadioGetType(message_t* amsg) @C() AT_SPONTANEOUS { return call AMPacket.type(amsg); } void amRadioSetType(message_t* amsg, am_id_t t) @C() AT_SPONTANEOUS { call AMPacket.setType(amsg, t); } am_group_t amRadioGetGroup(message_t* amsg) @C() AT_SPONTANEOUS { return call AMPacket.group(amsg); } void amRadioSetGroup(message_t* amsg, am_group_t grp) @C() AT_SPONTANEOUS { call AMPacket.setGroup(amsg, grp); } void radioClear(message_t* msg) @C() AT_SPONTANEOUS { call Packet.clear(msg); } uint8_t radioGetPayloadLength(message_t* msg) @C() AT_SPONTANEOUS { return call Packet.payloadLength(msg); } void radioSetPayloadLength(message_t* msg, uint8_t len) @C() AT_SPONTANEOUS { call Packet.setPayloadLength(msg, len); } uint8_t radioMaxPayloadLength() @C() AT_SPONTANEOUS { return call Packet.maxPayloadLength(); } void* radioGetPayload(message_t* msg, uint8_t len) @C() AT_SPONTANEOUS { return call Packet.getPayload(msg, len); } error_t radioRequestAck( message_t* msg ) @C() AT_SPONTANEOUS { return call PacketAcknowledgements.requestAck(msg); } error_t radioNoAck( message_t* msg ) @C() AT_SPONTANEOUS { return call PacketAcknowledgements.noAck(msg); } bool radioWasAcked(message_t* msg) @C() AT_SPONTANEOUS { return call PacketAcknowledgements.wasAcked(msg); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CAMSerialC.nc000066400000000000000000000040061207233610700233700ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #include "tosthread_amserial.h" configuration CAMSerialC {} implementation { components CAMSerialP as CAMP; components BlockingSerialActiveMessageC as AM; CAMP.BlockingStdControl -> AM; CAMP.BlockingReceive -> AM.BlockingReceive; CAMP.BlockingReceiveAny -> AM.BlockingReceiveAny; CAMP.Send -> AM; CAMP.Packet -> AM; CAMP.AMPacket -> AM; CAMP.PacketAcknowledgements -> AM; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CAMSerialP.nc000066400000000000000000000112401207233610700234030ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ module CAMSerialP { uses { interface BlockingStdControl; interface BlockingReceive[am_id_t amId]; interface BlockingReceive as BlockingReceiveAny; interface BlockingAMSend as Send[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; } } implementation { error_t amSerialStart() @C() AT_SPONTANEOUS { return call BlockingStdControl.start(); } error_t amSerialStop() @C() AT_SPONTANEOUS { return call BlockingStdControl.stop(); } error_t amSerialReceive(message_t* m, uint32_t timeout, am_id_t amId) @C() AT_SPONTANEOUS { if(amId == AM_RECEIVE_FROM_ANY) return call BlockingReceiveAny.receive(m, timeout); else return call BlockingReceive.receive[amId](m, timeout); } error_t amSerialSend(am_addr_t addr, message_t* msg, uint8_t len, am_id_t amId) @C() AT_SPONTANEOUS { return call Send.send[amId](addr, msg, len); } am_addr_t amSerialLocalAddress() @C() AT_SPONTANEOUS { return call AMPacket.address(); } am_group_t amSerialGetLocalGroup() @C() AT_SPONTANEOUS { return call AMPacket.localGroup(); } am_addr_t amSerialGetDestination(message_t* amsg) @C() AT_SPONTANEOUS { return call AMPacket.destination(amsg); } am_addr_t amSerialGetSource(message_t* amsg) @C() AT_SPONTANEOUS { return call AMPacket.source(amsg); } void amSerialSetDestination(message_t* amsg, am_addr_t addr) @C() AT_SPONTANEOUS { call AMPacket.setDestination(amsg, addr); } void amSerialSetSource(message_t* amsg, am_addr_t addr) @C() AT_SPONTANEOUS { call AMPacket.setSource(amsg, addr); } bool amSerialIsForMe(message_t* amsg) @C() AT_SPONTANEOUS { return call AMPacket.isForMe(amsg); } am_id_t amSerialGetType(message_t* amsg) @C() AT_SPONTANEOUS { return call AMPacket.type(amsg); } void amSerialSetType(message_t* amsg, am_id_t t) @C() AT_SPONTANEOUS { call AMPacket.setType(amsg, t); } am_group_t amSerialGetGroup(message_t* amsg) @C() AT_SPONTANEOUS { return call AMPacket.group(amsg); } void amSerialSetGroup(message_t* amsg, am_group_t grp) @C() AT_SPONTANEOUS { call AMPacket.setGroup(amsg, grp); } void serialClear(message_t* msg) @C() AT_SPONTANEOUS { call Packet.clear(msg); } uint8_t serialGetPayloadLength(message_t* msg) @C() AT_SPONTANEOUS { return call Packet.payloadLength(msg); } void serialSetPayloadLength(message_t* msg, uint8_t len) @C() AT_SPONTANEOUS { call Packet.setPayloadLength(msg, len); } uint8_t serialMaxPayloadLength() @C() AT_SPONTANEOUS { return call Packet.maxPayloadLength(); } void* serialGetPayload(message_t* msg, uint8_t len) @C() AT_SPONTANEOUS { return call Packet.getPayload(msg, len); } error_t serialRequestAck( message_t* msg ) @C() AT_SPONTANEOUS { return call PacketAcknowledgements.requestAck(msg); } error_t serialNoAck( message_t* msg ) @C() AT_SPONTANEOUS { return call PacketAcknowledgements.noAck(msg); } bool serialWasAcked(message_t* msg) @C() AT_SPONTANEOUS { return call PacketAcknowledgements.wasAcked(msg); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CBlockStorageC.nc000066400000000000000000000036641207233610700243230ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ configuration CBlockStorageC {} implementation { components CBlockStorageP, BlockingBlockStorageP, VolumeMapC; CBlockStorageP.BlockingBlock -> BlockingBlockStorageP; BlockingBlockStorageP.BlockRead -> VolumeMapC; BlockingBlockStorageP.BlockWrite -> VolumeMapC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CBlockStorageP.nc000066400000000000000000000050711207233610700243320ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ module CBlockStorageP { uses { interface BlockingBlock[uint8_t volume_id]; } } implementation { error_t volumeBlockRead(uint8_t volumeId, storage_addr_t addr, void* buf, storage_len_t* len) @C() AT_SPONTANEOUS { return call BlockingBlock.read[volumeId](addr, buf, len); } error_t volumeBlockWrite(uint8_t volumeId, storage_addr_t addr, void* buf, storage_len_t* len) @C() AT_SPONTANEOUS { return call BlockingBlock.write[volumeId](addr, buf, len); } error_t volumeBlockCrc(uint8_t volumeId, storage_addr_t addr, storage_len_t* len, uint16_t crc, uint16_t *finalCrc) @C() AT_SPONTANEOUS { return call BlockingBlock.computeCrc[volumeId](addr, len, crc, finalCrc); } error_t volumeBlockErase(uint8_t volumeId) @C() AT_SPONTANEOUS { return call BlockingBlock.erase[volumeId](); } error_t volumeBlockSync(uint8_t volumeId) @C() AT_SPONTANEOUS { return call BlockingBlock.sync[volumeId](); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CConfigStorageC.nc000066400000000000000000000040101207233610700244600ustar00rootroot00000000000000/* * Copyright (c) 2009 RWTH Aachen University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author J gila Bitsch Link */ configuration CConfigStorageC {} implementation { components CConfigStorageP, BlockingConfigStorageP, VolumeMapC; CConfigStorageP.BlockingConfig -> BlockingConfigStorageP; CConfigStorageP.BlockingMount -> BlockingConfigStorageP; BlockingConfigStorageP.ConfigMount -> VolumeMapC.Mount; BlockingConfigStorageP.ConfigStorage -> VolumeMapC.ConfigStorage; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CConfigStorageP.nc000066400000000000000000000053071207233610700245070ustar00rootroot00000000000000/* * Copyright (c) 2009 RWTH Aachen University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author J gila Bitsch Link * @author Chieh-Jan Mike Liang */ module CConfigStorageP { uses { interface BlockingConfig[uint8_t volume_id]; interface BlockingMount[uint8_t volume_id]; } } implementation { error_t volumeConfigMount(uint8_t volumeId) @C() AT_SPONTANEOUS { return call BlockingMount.mount[volumeId](); } error_t volumeConfigRead(uint8_t volumeId, storage_addr_t addr, void* buf, storage_len_t* len) @C() AT_SPONTANEOUS { return call BlockingConfig.read[volumeId](addr, buf, len); } error_t volumeConfigWrite(uint8_t volumeId, storage_addr_t addr, void* buf, storage_len_t* len) @C() AT_SPONTANEOUS { return call BlockingConfig.write[volumeId](addr, buf, len); } error_t volumeConfigCommit(uint8_t volumeId) @C() AT_SPONTANEOUS { return call BlockingConfig.commit[volumeId](); } storage_len_t volumeConfigGetSize(uint8_t volumeId) @C() AT_SPONTANEOUS { return call BlockingConfig.getSize[volumeId](); } bool volumeConfigValid(uint8_t volumeId) @C() AT_SPONTANEOUS { return call BlockingConfig.valid[volumeId](); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CLedsC.nc000066400000000000000000000033461207233610700226300ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ configuration CLedsC {} implementation { components LedsC; components CLedsP; CLedsP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CLedsP.nc000066400000000000000000000047011207233610700226410ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ module CLedsP { uses { interface Leds; } } implementation { void led0On() @C() AT_SPONTANEOUS { call Leds.led0On(); } void led0Off() @C() AT_SPONTANEOUS { call Leds.led0Off(); } void led0Toggle() @C() AT_SPONTANEOUS{ call Leds.led0Toggle(); } void led1On() @C() AT_SPONTANEOUS{ call Leds.led1On(); } void led1Off() @C() AT_SPONTANEOUS{ call Leds.led1Off(); } void led1Toggle() @C() AT_SPONTANEOUS{ call Leds.led1Toggle(); } void led2On() @C() AT_SPONTANEOUS{ call Leds.led2On(); } void led2Off() @C() AT_SPONTANEOUS{ call Leds.led2Off(); } void led2Toggle() @C() AT_SPONTANEOUS{ call Leds.led2Toggle(); } uint8_t getLeds() @C() AT_SPONTANEOUS{ return call Leds.get(); } void setLeds(uint8_t val) @C() AT_SPONTANEOUS{ call Leds.set(val); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CLinkedListC.nc000066400000000000000000000034571207233610700240060ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "tosthread_linked_list.h" configuration CLinkedListC {} implementation { components LinkedListC; components CLinkedListP; CLinkedListP.LinkedList -> LinkedListC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CLinkedListP.nc000066400000000000000000000105621207233610700240160ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module CLinkedListP { uses interface LinkedList; } implementation { void linked_list_init(linked_list_t* l) @C() AT_SPONTANEOUS { call LinkedList.init(l); } void linked_list_clear(linked_list_t* l) @C() AT_SPONTANEOUS { call LinkedList.clear(l); } uint8_t linked_list_size(linked_list_t* l) @C() AT_SPONTANEOUS { return call LinkedList.size(l); } error_t linked_list_addFirst(linked_list_t* l, list_element_t* e) @C() AT_SPONTANEOUS { return call LinkedList.addFirst(l, e); } list_element_t* linked_list_getFirst(linked_list_t* l) @C() AT_SPONTANEOUS { return call LinkedList.getFirst(l); } list_element_t* linked_list_removeFirst(linked_list_t* l) @C() AT_SPONTANEOUS { return call LinkedList.removeFirst(l); } error_t linked_list_addLast(linked_list_t* l, list_element_t* e) @C() AT_SPONTANEOUS { return call LinkedList.addLast(l, e); } list_element_t* linked_list_getLast(linked_list_t* l) @C() AT_SPONTANEOUS { return call LinkedList.getLast(l); } list_element_t* linked_list_removeLast(linked_list_t* l) @C() AT_SPONTANEOUS { return call LinkedList.removeLast(l); } error_t linked_list_addAt(linked_list_t* l, list_element_t* e, uint8_t i) @C() AT_SPONTANEOUS { return call LinkedList.addAt(l, e, i); } list_element_t* linked_list_getAt(linked_list_t* l, uint8_t i) @C() AT_SPONTANEOUS { return call LinkedList.getAt(l, i); } list_element_t* linked_list_removeAt(linked_list_t* l, uint8_t i) @C() AT_SPONTANEOUS { return call LinkedList.removeAt(l, i); } error_t linked_list_addAfter(linked_list_t* l, list_element_t* first, list_element_t* second) @C() AT_SPONTANEOUS { return call LinkedList.addAfter(l, first, second); } error_t linked_list_addBefore(linked_list_t* l, list_element_t* first, list_element_t* e) @C() AT_SPONTANEOUS { return call LinkedList.addBefore(l, first, e); } list_element_t* linked_list_getAfter(linked_list_t* l, list_element_t* e) @C() AT_SPONTANEOUS { return call LinkedList.getAfter(l, e); } list_element_t* linked_list_getBefore(linked_list_t* l, list_element_t* e) @C() AT_SPONTANEOUS { return call LinkedList.getBefore(l, e); } list_element_t* linked_list_remove(linked_list_t* l, list_element_t* e) @C() AT_SPONTANEOUS { return call LinkedList.remove(l, e); } list_element_t* linked_list_removeBefore(linked_list_t* l, list_element_t* e) @C() AT_SPONTANEOUS { return call LinkedList.removeBefore(l, e); } list_element_t* linked_list_removeAfter(linked_list_t* l, list_element_t* e) @C() AT_SPONTANEOUS { return call LinkedList.removeAfter(l, e); } uint8_t linked_list_indexOf(linked_list_t* l, list_element_t* e) @C() AT_SPONTANEOUS { return call LinkedList.indexOf(l, e); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CLogStorageC.nc000066400000000000000000000036341207233610700240070ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ configuration CLogStorageC {} implementation { components CLogStorageP, BlockingLogStorageP, VolumeMapC; CLogStorageP.BlockingLog -> BlockingLogStorageP; BlockingLogStorageP.LogRead -> VolumeMapC; BlockingLogStorageP.LogWrite -> VolumeMapC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CLogStorageP.nc000066400000000000000000000055241207233610700240240ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module CLogStorageP { uses { interface BlockingLog[uint8_t volume_id]; } } implementation { error_t volumeLogRead(uint8_t volumeId, void *buf, storage_len_t *len) @C() AT_SPONTANEOUS { return call BlockingLog.read[volumeId](buf, len); } storage_cookie_t volumeLogCurrentReadOffset(uint8_t volumeId) @C() AT_SPONTANEOUS { return call BlockingLog.currentReadOffset[volumeId](); } error_t volumeLogSeek(uint8_t volumeId, storage_cookie_t offset) @C() AT_SPONTANEOUS { return call BlockingLog.seek[volumeId](offset); } storage_len_t volumeLogGetSize(uint8_t volumeId) @C() AT_SPONTANEOUS { return call BlockingLog.getSize[volumeId](); } error_t volumeLogAppend(uint8_t volumeId, void* buf, storage_len_t *len, bool *recordsLost) @C() AT_SPONTANEOUS { return call BlockingLog.append[volumeId](buf, len, recordsLost); } storage_cookie_t volumeLogCurrentWriteOffset(uint8_t volumeId) @C() AT_SPONTANEOUS { return call BlockingLog.currentWriteOffset[volumeId](); } error_t volumeLogErase(uint8_t volumeId) @C() AT_SPONTANEOUS { return call BlockingLog.erase[volumeId](); } error_t volumeLogSync(uint8_t volumeId) @C() AT_SPONTANEOUS { return call BlockingLog.sync[volumeId](); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CQueueC.nc000066400000000000000000000050461207233610700230240ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "tosthread_linked_list.h" #include "tosthread_queue.h" module CQueueC {} implementation { void queue_init(queue_t* q) @C() AT_SPONTANEOUS { linked_list_init( &(q->l) ); } void queue_clear(queue_t* q) @C() AT_SPONTANEOUS { linked_list_clear( &(q->l) ); } error_t queue_enqueue(queue_t* q, queue_element_t* e) @C() AT_SPONTANEOUS { return linked_list_addLast(&(q->l), (list_element_t*)e); } queue_element_t* queue_dequeue(queue_t* q) @C() AT_SPONTANEOUS { return (queue_element_t*)linked_list_removeFirst( &(q->l) ); } queue_element_t* queue_remove(queue_t* q, queue_element_t* e) @C() AT_SPONTANEOUS { return (queue_element_t*)linked_list_remove(&(q->l), (list_element_t*)e); } uint8_t queue_size(queue_t* q) @C() AT_SPONTANEOUS { return linked_list_size( &(q->l) ); } bool queue_is_empty(queue_t* q) @C() AT_SPONTANEOUS { return (linked_list_size( &(q->l) ) == 0); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CRandomC.nc000066400000000000000000000034331207233610700231560ustar00rootroot00000000000000/* * Copyright (c) 2009 RWTH Aachen University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author J gila Bitsch Link */ configuration CRandomC {} implementation { components CRandomP, RandomC; CRandomP.Random -> RandomC; CRandomP.SeedInit -> RandomC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CRandomP.nc000066400000000000000000000040031207233610700231650ustar00rootroot00000000000000/* * Copyright (c) 2009 RWTH Aachen University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author J gila Bitsch Link */ module CRandomP { uses { interface ParameterInit as SeedInit; interface Random; } } implementation { error_t randSeed(uint16_t seed) @C() AT_SPONTANEOUS { return call SeedInit.init(seed); } uint16_t rand16() @C() AT_SPONTANEOUS { return call Random.rand16(); } uint32_t rand32() @C() AT_SPONTANEOUS { return call Random.rand32(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CThreadC.nc000066400000000000000000000034111207233610700231410ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ configuration CThreadC {} implementation { components DynamicThreadC; components CThreadP; CThreadP.DynamicThread -> DynamicThreadC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CThreadP.nc000066400000000000000000000047161207233610700231670ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "thread.h" module CThreadP { uses { interface DynamicThread; } } implementation { error_t tosthread_create(tosthread_t* t, void (*start_routine)(void*), void* arg, uint16_t stack_size) @C() AT_SPONTANEOUS { return call DynamicThread.create(t, start_routine, arg, stack_size); } error_t tosthread_destroy(tosthread_t* t) @C() AT_SPONTANEOUS { return call DynamicThread.destroy(t); } error_t tosthread_pause(tosthread_t* t) @C() AT_SPONTANEOUS { return call DynamicThread.pause(t); } error_t tosthread_resume(tosthread_t* t) @C() AT_SPONTANEOUS { return call DynamicThread.resume(t); } error_t tosthread_sleep(uint32_t milli) @C() AT_SPONTANEOUS { return call DynamicThread.sleep(milli); } error_t tosthread_join(tosthread_t* t) @C() AT_SPONTANEOUS { return call DynamicThread.join(t); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CThreadSynchronizationC.nc000066400000000000000000000041471207233610700262720ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "tosthread_threadsync.h" configuration CThreadSynchronizationC {} implementation { components ThreadSynchronizationC; components CThreadSynchronizationP; CThreadSynchronizationP.Mutex -> ThreadSynchronizationC; CThreadSynchronizationP.Semaphore -> ThreadSynchronizationC; CThreadSynchronizationP.Barrier -> ThreadSynchronizationC; CThreadSynchronizationP.ConditionVariable -> ThreadSynchronizationC; CThreadSynchronizationP.ReferenceCounter -> ThreadSynchronizationC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/CThreadSynchronizationP.nc000066400000000000000000000101411207233610700262760ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module CThreadSynchronizationP { uses { interface Mutex; interface Semaphore; interface Barrier; interface ConditionVariable; interface ReferenceCounter; } } implementation { /******************** Mutex ***************************/ void mutex_init(mutex_t* m) @C() AT_SPONTANEOUS { call Mutex.init(m); } error_t mutex_lock(mutex_t* m) @C() AT_SPONTANEOUS { return call Mutex.lock(m); } error_t mutex_unlock(mutex_t* m) @C() AT_SPONTANEOUS { return call Mutex.unlock(m); } /******************** Semaphore ***************************/ void semaphore_reset(semaphore_t* s, uint8_t v) @C() AT_SPONTANEOUS { call Semaphore.reset(s, v); } error_t semaphore_acquire(semaphore_t* s) @C() AT_SPONTANEOUS { return call Semaphore.acquire(s); } error_t semaphore_release(semaphore_t* s) @C() AT_SPONTANEOUS { return call Semaphore.release(s); } /******************** Barrier ***************************/ void barrier_reset(barrier_t* b, uint8_t count) @C() AT_SPONTANEOUS { call Barrier.reset(b, count); } void barrier_block(barrier_t* b) @C() AT_SPONTANEOUS { call Barrier.block(b); } bool barrier_isBlocking(barrier_t* b) @C() AT_SPONTANEOUS { return call Barrier.isBlocking(b); } void condvar_init(condvar_t* c) @C() AT_SPONTANEOUS { call ConditionVariable.init(c); } /******************** Condition Variable ***************************/ void condvar_wait(condvar_t* c, mutex_t* m) @C() AT_SPONTANEOUS { call ConditionVariable.wait(c, m); } void condvar_signalNext(condvar_t* c) @C() AT_SPONTANEOUS { call ConditionVariable.signalNext(c); } void condvar_signalAll(condvar_t* c) @C() AT_SPONTANEOUS { call ConditionVariable.signalAll(c); } bool condvar_isBlocking(condvar_t* c) @C() AT_SPONTANEOUS { return call ConditionVariable.isBlocking(c); } /******************** Reference Counter ***************************/ void refcounter_init(refcounter_t* r) @C() AT_SPONTANEOUS { call ReferenceCounter.init(r); } void refcounter_increment(refcounter_t* r) @C() AT_SPONTANEOUS { call ReferenceCounter.increment(r); } void refcounter_decrement(refcounter_t* r) @C() AT_SPONTANEOUS { call ReferenceCounter.decrement(r); } void refcounter_waitOnValue(refcounter_t* r, uint8_t count) @C() AT_SPONTANEOUS { call ReferenceCounter.waitOnValue(r, count); } uint8_t refcounter_count(refcounter_t* r) @C() AT_SPONTANEOUS { return call ReferenceCounter.count(r); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/TinyOSEntryPointC.nc000066400000000000000000000036021207233610700250520ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "tosthread.h" configuration TinyOSEntryPointC { } implementation { components MainC; components TinyOSEntryPointP; MainC.Boot <- TinyOSEntryPointP; #ifdef TOSTHREAD_TENET components TosThreadTenetApiC; #else components TosThreadApiC; #endif } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/TinyOSEntryPointP.nc000066400000000000000000000044451207233610700250750ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ /** * The Makefile for your top level application must contain a line of the form: * TOSTHREAD_MAIN=Blink.c * in order to compile correctly. * * This simply issues an error at compile time if TOSTHREAD_MAIN has not been defined * appropriately. */ #ifndef MAIN_APP #error "You must define the TOSTHREAD_MAIN constant in your Makefile to correctly point to your top level c file in order to compile..... Spelling Error?" #else #include MAIN_APP #endif module TinyOSEntryPointP { uses { interface Boot; } } implementation { tosthread_t thread; event void Boot.booted() { tosthread_create(&thread, tosthread_main, NULL, TOSTHREAD_MAIN_STACK_SIZE); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/TosThreadApiC.nc000066400000000000000000000074641207233610700241720ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @author Chieh-Jan Mike Liang */ #include "tosthread.h" configuration TosThreadApiC { } implementation { //Here are all the components that implement the Tosthread API calls components CThreadC; #if defined(PRINTF_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components PrintfC; #endif #if defined(TOSTHREAD_QUEUE_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CQueueC; #endif #if defined(TOSTHREAD_LINKED_LIST_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CLinkedListC; #endif #if defined(TOSTHREAD_THREADSYNC_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CThreadSynchronizationC; #endif #if defined(TOSTHREAD_LEDS_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CLedsC; #endif #if defined(TOSTHREAD_AMRADIO_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CAMRadioC; #endif #if defined(TOSTHREAD_AMSERIAL_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CAMSerialC; #endif #if defined(TOSTHREAD_BLOCKSTORAGE_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CBlockStorageC; #endif #if defined(TOSTHREAD_LOGSTORAGE_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CLogStorageC; #endif #if defined(TOSTHREAD_CONFIGSTORAGE_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CConfigStorageC; #endif #if defined(TOSTHREAD_COLLECTION_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CCollectionC; #endif //Telosb sensorboard specific. #if defined(TOSTHREAD_HAMAMATSUS1087_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CHamamatsuS1087ParC; #endif #if defined(TOSTHREAD_HAMAMATSUS10871_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CHamamatsuS10871TsrC; #endif #if defined(TOSTHREAD_SENSIRIONSHT11_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CSensirionSht11C; #endif //Universal sensorboard specific #if defined(TOSTHREAD_SINESENSOR_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CSineSensorC; #endif //Basicsb sensorboard specific #if defined(TOSTHREAD_PHOTO_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CPhotoC; #endif #if defined(TOSTHREAD_TEMP_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CTempC; #endif } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/VolumeMapC.nc000066400000000000000000000042771207233610700235470ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author J gila Bitsch Link */ configuration VolumeMapC { provides { interface BlockRead[uint8_t volume_id]; interface BlockWrite[uint8_t volume_id]; interface LogRead[uint8_t volume_id]; interface LogWrite[uint8_t volume_id]; interface ConfigStorage[uint8_t volume_id]; interface Mount[uint8_t volume_id]; } } implementation { components VolumeMapP; BlockRead = VolumeMapP; BlockWrite = VolumeMapP; LogRead = VolumeMapP; LogWrite = VolumeMapP; ConfigStorage = VolumeMapP; Mount = VolumeMapP; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/VolumeMapP.nc000066400000000000000000000254501207233610700235600ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author J gila Bitsch Link */ module VolumeMapP { provides { interface BlockRead[uint8_t volume_id]; interface BlockWrite[uint8_t volume_id]; interface LogRead[uint8_t volume_id]; interface LogWrite[uint8_t volume_id]; interface ConfigStorage[uint8_t volume_id]; interface Mount[uint8_t volume_id]; } uses { interface BlockRead as SubBlockRead[uint8_t volume_id]; interface BlockWrite as SubBlockWrite[uint8_t volume_id]; interface LogRead as SubLogRead[uint8_t volume_id]; interface LogWrite as SubLogWrite[uint8_t volume_id]; interface ConfigStorage as SubConfigStorage[uint8_t volume_id]; interface Mount as SubMount[uint8_t volume_id]; } } implementation { command error_t BlockRead.read[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len) { return call SubBlockRead.read[volume_id](addr, buf, len); } event void SubBlockRead.readDone[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { signal BlockRead.readDone[volume_id](addr, buf, len, error); } command error_t BlockRead.computeCrc[uint8_t volume_id](storage_addr_t addr, storage_len_t len, uint16_t crc) { return call SubBlockRead.computeCrc[volume_id](addr, len, crc); } event void SubBlockRead.computeCrcDone[uint8_t volume_id](storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) { signal BlockRead.computeCrcDone[volume_id](addr, len, crc, error); } command storage_len_t BlockRead.getSize[uint8_t volume_id]() { return call SubBlockRead.getSize[volume_id](); } command error_t BlockWrite.write[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len) { return call SubBlockWrite.write[volume_id](addr, buf, len); } event void SubBlockWrite.writeDone[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { signal BlockWrite.writeDone[volume_id](addr, buf, len, error); } command error_t BlockWrite.erase[uint8_t volume_id]() { return call SubBlockWrite.erase[volume_id](); } event void SubBlockWrite.eraseDone[uint8_t volume_id](error_t error) { signal BlockWrite.eraseDone[volume_id](error); } command error_t BlockWrite.sync[uint8_t volume_id]() { return call SubBlockWrite.sync[volume_id](); } event void SubBlockWrite.syncDone[uint8_t volume_id](error_t error) { signal BlockWrite.syncDone[volume_id](error); } default command error_t SubBlockRead.read[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t SubBlockRead.computeCrc[uint8_t volume_id](storage_addr_t addr, storage_len_t len, uint16_t crc) { return FAIL; } default command storage_len_t SubBlockRead.getSize[uint8_t volume_id]() { return FAIL; } default command error_t SubBlockWrite.write[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t SubBlockWrite.erase[uint8_t volume_id]() { return FAIL; } default command error_t SubBlockWrite.sync[uint8_t volume_id]() { return FAIL; } default event void BlockRead.readDone[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} default event void BlockRead.computeCrcDone[uint8_t volume_id](storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) {} default event void BlockWrite.writeDone[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} default event void BlockWrite.eraseDone[uint8_t volume_id](error_t error) {} default event void BlockWrite.syncDone[uint8_t volume_id](error_t error) {} command error_t LogRead.read[uint8_t volume_id](void* buf, storage_len_t len) { return call SubLogRead.read[volume_id](buf, len); } event void SubLogRead.readDone[uint8_t volume_id](void* buf, storage_len_t len, error_t error) { signal LogRead.readDone[volume_id](buf, len, error); } command storage_cookie_t LogRead.currentOffset[uint8_t volume_id]() { return call SubLogRead.currentOffset[volume_id](); } command error_t LogRead.seek[uint8_t volume_id](storage_cookie_t offset) { return call SubLogRead.seek[volume_id](offset); } event void SubLogRead.seekDone[uint8_t volume_id](error_t error) { signal LogRead.seekDone[volume_id](error); } command storage_len_t LogRead.getSize[uint8_t volume_id]() { return call SubLogRead.getSize[volume_id](); } command error_t LogWrite.append[uint8_t volume_id](void* buf, storage_len_t len) { return call SubLogWrite.append[volume_id](buf, len); } event void SubLogWrite.appendDone[uint8_t volume_id](void* buf, storage_len_t len, bool recordsLost, error_t error) { signal LogWrite.appendDone[volume_id](buf, len, recordsLost, error); } command storage_cookie_t LogWrite.currentOffset[uint8_t volume_id]() { return call SubLogWrite.currentOffset[volume_id](); } command error_t LogWrite.erase[uint8_t volume_id]() { return call SubLogWrite.erase[volume_id](); } event void SubLogWrite.eraseDone[uint8_t volume_id](error_t error) { signal LogWrite.eraseDone[volume_id](error); } command error_t LogWrite.sync[uint8_t volume_id]() { return call SubLogWrite.sync[volume_id](); } event void SubLogWrite.syncDone[uint8_t volume_id](error_t error) { signal LogWrite.syncDone[volume_id](error); } default command error_t SubLogRead.read[uint8_t volume_id](void* buf, storage_len_t len) { return FAIL; } default command storage_cookie_t SubLogRead.currentOffset[uint8_t volume_id]() { return 0; } default command error_t SubLogRead.seek[uint8_t volume_id](storage_cookie_t offset) { return FAIL; } default command storage_len_t SubLogRead.getSize[uint8_t volume_id]() { return 0; } default command error_t SubLogWrite.append[uint8_t volume_id](void* buf, storage_len_t len) { return FAIL; } default command storage_cookie_t SubLogWrite.currentOffset[uint8_t volume_id]() { return 0; } default command error_t SubLogWrite.erase[uint8_t volume_id]() { return FAIL; } default command error_t SubLogWrite.sync[uint8_t volume_id]() { return FAIL; } default event void LogRead.readDone[uint8_t volume_id](void* buf, storage_len_t len, error_t error) {} default event void LogRead.seekDone[uint8_t volume_id](error_t error) {} default event void LogWrite.appendDone[uint8_t volume_id](void* buf, storage_len_t len, bool recordsLost, error_t error) {} default event void LogWrite.eraseDone[uint8_t volume_id](error_t error) {} default event void LogWrite.syncDone[uint8_t volume_id](error_t error) {} command error_t ConfigStorage.read[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len) { return call SubConfigStorage.read[volume_id](addr, buf, len); } event void SubConfigStorage.readDone[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { signal ConfigStorage.readDone[volume_id](addr, buf, len, error); } command error_t ConfigStorage.write[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len) { return call SubConfigStorage.write[volume_id](addr, buf, len); } event void SubConfigStorage.writeDone[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { signal ConfigStorage.writeDone[volume_id](addr, buf, len, error); } command error_t ConfigStorage.commit[uint8_t volume_id]() { return call SubConfigStorage.commit[volume_id](); } event void SubConfigStorage.commitDone[uint8_t volume_id](error_t error) { signal ConfigStorage.commitDone[volume_id](error); } command storage_len_t ConfigStorage.getSize[uint8_t volume_id]() { return call SubConfigStorage.getSize[volume_id](); } command bool ConfigStorage.valid[uint8_t volume_id]() { return call SubConfigStorage.valid[volume_id](); } command error_t Mount.mount[uint8_t volume_id]() { return call SubMount.mount[volume_id](); } event void SubMount.mountDone[uint8_t volume_id](error_t error) { signal Mount.mountDone[volume_id](error); } default command error_t SubConfigStorage.read[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t SubConfigStorage.write[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t SubConfigStorage.commit[uint8_t volume_id]() { return FAIL; } default command storage_len_t SubConfigStorage.getSize[uint8_t volume_id]() { return FAIL; } default command bool SubConfigStorage.valid[uint8_t volume_id]() { return FAIL; } default command error_t SubMount.mount[uint8_t volume_id]() { return FAIL; } default event void ConfigStorage.commitDone[uint8_t volume_id](error_t error) {} default event void ConfigStorage.writeDone[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} default event void ConfigStorage.readDone[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} default event void Mount.mountDone[uint8_t volume_id](error_t error) {} } tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread.h000066400000000000000000000121011207233610700233440ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This is the file to include in your top level application when using * the tosthread library. It defines all the tosthread_* commands and * #includes all of the needed header files for the basic tosthread * library calls * * @author Kevin Klues */ #ifndef TOSTHREAD_H_INCLUDED #define TOSTHREAD_H_INCLUDED #include "thread.h" /** * tosthread_main() * * This in the main entry point thread from which all tosthread applications begin. * @param NULL */ extern void tosthread_main(void* arg); /** * tosthread_create() * * This function creates a new tosthread. * * @param t A pointer to a thread identifier * @param start_routine The function called when the created thread starts running * @param arg The parameter passed to the start_routine for the created thread * @param stack_size The maximum stack size for this thread * @return An error code indicating whether the thread could be created or not * SUCCESS - The thread has been created * FAIL - The thread could not be created * EALREADY - The thread identifier is already associated with a * currently active thread */ extern error_t tosthread_create(tosthread_t* t, void (*start_routine)(void*), void* arg, uint16_t stack_size); /** * tosthread_destroy() * * This function destroys a tosthread. * * @param t A pointer to a thread identifier * @return An error code indicating whether the thread could be destroyed or not * SUCCESS - The thread has been destroyed * FAIL - The thread could not be destroyed * EBUSY - The thread holds mutexes so cannot be destroyed * at the moment */ extern error_t tosthread_destroy(tosthread_t* t); /** * tosthread_pause() * * This function pauses a tosthread. * * @param t A pointer to a thread identifier * @return An error code indicating whether the thread could be paused or not * SUCCESS - The thread has been paused * FAIL - The thread could not be paused * EBUSY - The thread holds mutexes so cannot be paused * at the moment */ extern error_t tosthread_pause(tosthread_t* t); /** * tosthread_resume() * * This function resumes a previously paused tosthread. * * @param t A pointer to a thread identifier * @return An error code indicating whether the thread could be resumed or not * SUCCESS - The thread has been resumed * FAIL - The thread could not be resumed */ extern error_t tosthread_resume(tosthread_t* t); /** * tosthread_sleep() * * This function puts the currently running thread to sleep. * * @param milli The number of milliseconds to sleep for * @return An error code indicating whether the thread could be put to sleep or not * SUCCESS - The thread has been put to sleep * FAIL - The thread could not be put to sleep */ extern error_t tosthread_sleep(uint32_t milli); /** * tosthread_join(tosthread_t* t) * * This function bocks until the thread passed as a parameter has completed * * @param id The handle to the thread to block on * @return An error code indicating whether the thread could be waited on or not * SUCCESS - The thread has been waited on and is now completed * EALREADY - The thread we are trying to wait on has already completed * FAIL - The thread could not waited on */ extern error_t tosthread_join(tosthread_t* id); #endif //TOSTHREAD_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_amradio.h000066400000000000000000000062761207233610700250600ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Kevin Klues */ #ifndef TOSTHREAD_AMRADIO_H #define TOSTHREAD_AMRADIO_H #include "message.h" #include "AM.h" #include "TinyError.h" #ifndef AM_RECEIVE_FROM_ANY #define AM_RECEIVE_FROM_ANY 0XFF #endif extern error_t amRadioStart(); extern error_t amRadioStop(); extern error_t amRadioReceive(message_t* m, uint32_t timeout, am_id_t amId); extern error_t amRadioSnoop(message_t* m, uint32_t timeout, am_id_t amId); extern error_t amRadioSend(am_addr_t addr, message_t* msg, uint8_t len, am_id_t amId); extern am_addr_t amRadioGetLocalAddress(); extern am_group_t amRadioGetLocalGroup(); extern am_addr_t amRadioGetDestination(message_t* amsg); extern am_addr_t amRadioGetSource(message_t* amsg); extern void amRadioSetDestination(message_t* amsg, am_addr_t addr); extern void amRadioSetSource(message_t* amsg, am_addr_t addr); extern bool amRadioIsForMe(message_t* amsg); extern am_id_t amRadioGetType(message_t* amsg); extern void amRadioSetType(message_t* amsg, am_id_t t); extern am_group_t amRadioGetGroup(message_t* amsg); extern void amRadioSetGroup(message_t* amsg, am_group_t grp); extern void radioClear(message_t* msg); extern uint8_t radioGetPayloadLength(message_t* msg); extern void radioSetPayloadLength(message_t* msg, uint8_t len); extern uint8_t radioMaxPayloadLength(); extern void* radioGetPayload(message_t* msg, uint8_t len); extern error_t radioRequestAck( message_t* msg ); extern error_t radioNoAck( message_t* msg ); extern bool radioWasAcked(message_t* msg); #endif //TOSTHREAD_AMRADIO_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_amserial.h000066400000000000000000000061061207233610700252310ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #ifndef TOSTHREAD_AMSERIAL_H #define TOSTHREAD_AMSERIAL_H #include "message.h" #include "TinyError.h" #ifndef AM_RECEIVE_FROM_ANY #define AM_RECEIVE_FROM_ANY 0XFF #endif extern error_t amSerialStart(); extern error_t amSerialStop(); extern error_t amSerialReceive(message_t* m, uint32_t timeout, am_id_t amId); extern error_t amSerialSend(am_addr_t addr, message_t* msg, uint8_t len, am_id_t amId); extern am_addr_t amSerialLocalAddress(); extern am_group_t amSerialGetLocalGroup(); extern am_addr_t amSerialGetDestination(message_t* amsg); extern am_addr_t amSerialGetSource(message_t* amsg); extern void amSerialSetDestination(message_t* amsg, am_addr_t addr); extern void amSerialSetSource(message_t* amsg, am_addr_t addr); extern bool amSerialIsForMe(message_t* amsg); extern am_id_t amSerialGetType(message_t* amsg); extern void amSerialSetType(message_t* amsg, am_id_t t); extern am_group_t amSerialGetGroup(message_t* amsg); extern void amSerialSetGroup(message_t* amsg, am_group_t grp); extern void serialClear(message_t* msg); extern uint8_t serialGetPayloadLength(message_t* msg); extern void serialSetPayloadLength(message_t* msg, uint8_t len); extern uint8_t serialMaxPayloadLength(); extern void* serialGetPayload(message_t* msg, uint8_t len); extern error_t serialRequestAck( message_t* msg ); extern error_t serialNoAck( message_t* msg ); extern bool serialWasAcked(message_t* msg); #endif //TOSTHREAD_AMSERIAL_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_barrier.h000066400000000000000000000035631207233610700250660ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TOSTHREAD_BARRIER_H #define TOSTHREAD_BARRIER_H #include "barrier.h" extern void barrier_reset(barrier_t* b, uint8_t count); extern void barrier_block(barrier_t* b); extern bool barrier_isBlocking(barrier_t* b); #endif //TOSTHREAD_BARRIER_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_blockstorage.h000066400000000000000000000042421207233610700261120ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Author: Chieh-Jan Mike Liang */ #ifndef TOSTHREAD_BLOCKSTORAGE_H #define TOSTHREAD_BLOCKSTORAGE_H #include "Storage.h" extern error_t volumeBlockRead(uint8_t volumeId, storage_addr_t addr, void* buf, storage_len_t* len); extern error_t volumeBlockWrite(uint8_t volumeId, storage_addr_t addr, void* buf, storage_len_t* len); extern error_t volumeBlockCrc(uint8_t volumeId, storage_addr_t addr, storage_len_t* len, uint16_t crc, uint16_t *finalCrc); extern error_t volumeBlockErase(uint8_t volumeId); extern error_t volumeBlockSync(uint8_t volumeId); #endif //TOSTHREAD_BLOCKSTORAGE_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_condvar.h000066400000000000000000000037111207233610700250670ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TOSTHREAD_CONDVAR_H #define TOSTHREAD_CONDVAR_H #include "condvar.h" extern void condvar_init(condvar_t* c); extern void condvar_wait(condvar_t* c, mutex_t* m); extern void condvar_signalNext(condvar_t* c); extern void condvar_signalAll(condvar_t* c); extern bool condvar_isBlocking(condvar_t* c); #endif //TOSTHREAD_CONDVAR_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_configstorage.h000066400000000000000000000042471207233610700262720ustar00rootroot00000000000000/* * Copyright (c) 2009 RWTH Aachen University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author J gila Bitsch Link */ #ifndef TOSTHREAD_CONFIGSTORAGE_H #define TOSTHREAD_CONFIGSTORAGE_H #include "Storage.h" extern error_t volumeConfigMount(uint8_t volumeId); extern error_t volumeConfigRead(uint8_t volumeId, storage_addr_t addr, void* buf, storage_len_t* len); extern error_t volumeConfigWrite(uint8_t volumeId, storage_addr_t addr, void* buf, storage_len_t* len); extern error_t volumeConfigCommit(uint8_t volumeId); extern storage_len_t volumeConfigGetSize(uint8_t volumeId); extern bool volumeConfigValid(uint8_t volumeId); #endif // TOSTHREAD_CONFIGSTORAGE_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_leds.h000066400000000000000000000037311207233610700243640ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #ifndef TOSTHREAD_LEDS_H #define TOSTHREAD_LEDS_H extern void led0On(); extern void led0Off(); extern void led0Toggle(); extern void led1On(); extern void led1Off(); extern void led1Toggle(); extern void led2On(); extern void led2Off(); extern void led2Toggle(); extern uint8_t getLeds(); extern void setLeds(uint8_t val); #endif //TOSTHREAD_LEDS_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_linked_list.h000066400000000000000000000063441207233610700257410ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright *extern notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright *extern notice, this list of conditions and the following disclaimer in the *extern documentation and/or other materials provided with the *extern distribution. * - Neither the name of the Stanford University nor the names of *extern its contributors may be used to endorse or promote products derived *extern from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.extern IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #ifndef TOSTHREAD_LINKED_LIST_H #define TOSTHREAD_LINKED_LIST_H #include "linked_list.h" extern void linked_list_init(linked_list_t* l); extern void linked_list_clear(linked_list_t* l); extern uint8_t linked_list_size(linked_list_t* l); extern error_t linked_list_addFirst(linked_list_t* l, list_element_t* e); extern list_element_t* linked_list_getFirst(linked_list_t* l); extern list_element_t* linked_list_removeFirst(linked_list_t* l); extern error_t linked_list_addLast(linked_list_t* l, list_element_t* e); extern list_element_t* linked_list_getLast(linked_list_t* l); extern list_element_t* linked_list_removeLast(linked_list_t* l); extern error_t linked_list_addAt(linked_list_t* l, list_element_t* e, uint8_t i); extern list_element_t* linked_list_getAt(linked_list_t* l, uint8_t i); extern list_element_t* linked_list_removeAt(linked_list_t* l, uint8_t i); extern error_t linked_list_addAfter(linked_list_t* l, list_element_t* first, list_element_t* second); extern error_t linked_list_addBefore(linked_list_t* l, list_element_t* first, list_element_t* e); extern list_element_t* linked_list_getAfter(linked_list_t* l, list_element_t* e); extern list_element_t* linked_list_getBefore(linked_list_t* l, list_element_t* e); extern list_element_t* linked_list_remove(linked_list_t* l, list_element_t* e); extern list_element_t* linked_list_removeBefore(linked_list_t* l, list_element_t* e); extern list_element_t* linked_list_removeAfter(linked_list_t* l, list_element_t* e); extern uint8_t linked_list_indexOf(linked_list_t* l, list_element_t* e); #endif //TOSTHREAD_LINKED_LIST_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_logstorage.h000066400000000000000000000044211207233610700256000ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TOSTHREAD_LOGSTORAGE_H #define TOSTHREAD_LOGSTORAGE_H #include "Storage.h" extern error_t volumeLogRead(uint8_t volumeId, void *buf, storage_len_t *len); extern storage_cookie_t volumeLogCurrentReadOffset(uint8_t volumeId); extern error_t volumeLogSeek(uint8_t volumeId, storage_cookie_t offset); extern storage_len_t volumeLogGetSize(uint8_t volumeId); extern error_t volumeLogAppend(uint8_t volumeId, void* buf, storage_len_t *len, bool *recordsLost); extern storage_cookie_t volumeLogCurrentWriteOffset(uint8_t volumeId); extern error_t volumeLogErase(uint8_t volumeId); extern error_t volumeLogSync(uint8_t volumeId); #endif //TOSTHREAD_LOGSTORAGE_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_mutex.h000066400000000000000000000035471207233610700246040ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TOSTHREAD_MUTEX_H #define TOSTHREAD_MUTEX_H #include "mutex.h" #include "TinyError.h" extern void mutex_init(mutex_t* m); extern error_t mutex_lock(mutex_t* m); extern error_t mutex_unlock(mutex_t* m); #endif //TOSTHREAD_MUTEX_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_queue.h000066400000000000000000000041221207233610700245540ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright *extern notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright *extern notice, this list of conditions and the following disclaimer in the *extern documentation and/or other materials provided with the *extern distribution. * - Neither the name of the Stanford University nor the names of *extern its contributors may be used to endorse or promote products derived *extern from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.extern IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #ifndef TOSTHREAD_QUEUE_H #define TOSTHREAD_QUEUE_H #include "queue.h" extern void queue_init(queue_t* q); extern void queue_clear(queue_t* q); extern error_t queue_enqueue(queue_t* q, queue_element_t* e); extern queue_element_t* queue_dequeue(queue_t* q); extern queue_element_t* queue_remove(queue_t* q, queue_element_t* e); extern uint8_t queue_size(queue_t* q); extern bool queue_is_empty(queue_t* q); #endif //TOSTHREAD_QUEUE_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_random.h000066400000000000000000000035101207233610700247100ustar00rootroot00000000000000/* * Copyright (c) 2009 RWTH Aachen University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author J gila Bitsch Link */ #ifndef TOSTHREAD_RANDOM_H #define TOSTHREAD_RANDOM_H #include "TinyError.h" extern error_t randSeed(uint16_t seed); extern uint16_t rand16(); extern uint32_t rand32(); #endif //TOSTHREAD_RANDOM_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_refcounter.h000066400000000000000000000037721207233610700256160ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TOSTHREAD_REFCOUNTER_H #define TOSTHREAD_REFCOUNTER_H #include "refcounter.h" extern void refcounter_init(refcounter_t* r); extern void refcounter_increment(refcounter_t* r); extern void refcounter_decrement(refcounter_t* r); extern void refcounter_waitOnValue(refcounter_t* r, uint8_t count); extern uint8_t refcounter_count(refcounter_t* r); #endif //TOSTHREAD_REFCOUNTER_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_semaphore.h000066400000000000000000000036331207233610700254210ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TOSTHREAD_SEMAPHORE_H #define TOSTHREAD_SEMAPHORE_H #include "semaphore.h" #include "TinyError.h" extern void semaphore_reset(semaphore_t* s, uint8_t v); extern error_t semaphore_acquire(semaphore_t* s); extern error_t semaphore_release(semaphore_t* s); #endif //TOSTHREAD_MUTEX_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/csystem/tosthread_threadsync.h000066400000000000000000000035651207233610700256060ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TOSTHREAD_THREADSYNC_H #define TOSTHREAD_THREADSYNC_H #include "tosthread_mutex.h" #include "tosthread_semaphore.h" #include "tosthread_barrier.h" #include "tosthread_condvar.h" #include "tosthread_refcounter.h" #endif //TOSTHREAD_THREADSYNC_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/000077500000000000000000000000001207233610700216375ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/Barrier.nc000066400000000000000000000046541207233610700235600ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface for using Barrier synchronization with tosthreads. * * @author Kevin Klues */ #include "barrier.h" interface Barrier { /** * Reset a barrier for use. * @param b The barrier you would like to reset. * @param count The number of threads that must call * block before the flood gates open and * the barrier is unblocked. */ command void reset(barrier_t* b, uint8_t count); /** * Block on a barrier until all threads have called * block() as indicated in the count parameter to reset() * @param b The barrier you would like to block on. */ command void block(barrier_t* b); /** * Query whether a barrier is currently blocked or not * @param b The barrier you would like to query. * @return TRUE or FALSE */ command bool isBlocking(barrier_t* b); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/BitArrayUtils.nc000066400000000000000000000036641207233610700247300ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang * @author Kevin Klues */ interface BitArrayUtils { async command void clrArray(uint8_t* array, uint8_t numBytes); async command bool getBit(uint8_t* array, uint8_t idx); async command void setBit(uint8_t* array, uint8_t idx); async command void clrBit(uint8_t* array, uint8_t idx); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/BlockingAMSend.nc000066400000000000000000000035641207233610700247510ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include #include #include interface BlockingAMSend { command error_t send(am_addr_t addr, message_t* msg, uint8_t len); command uint8_t maxPayloadLength(); command void* getPayload(message_t* msg, uint8_t len); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/BlockingBlock.nc000066400000000000000000000040131207233610700246620ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #include "Storage.h" interface BlockingBlock { command error_t read(storage_addr_t addr, void *buf, storage_len_t* len); command error_t computeCrc(storage_addr_t addr, storage_len_t* len, uint16_t crc, uint16_t *finalCrc); command storage_len_t getSize(); command error_t write(storage_addr_t addr, void *buf, storage_len_t* len); command error_t erase(); command error_t sync(); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/BlockingConfig.nc000066400000000000000000000036341207233610700250450ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #include "Storage.h" interface BlockingConfig { command error_t read(storage_addr_t addr, void* buf, storage_len_t* len); command error_t write(storage_addr_t addr, void* buf, storage_len_t* len); command error_t commit(); command storage_len_t getSize(); command bool valid(); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/BlockingLog.nc000066400000000000000000000040341207233610700243540ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #include "Storage.h" interface BlockingLog { command error_t read(void *buf, storage_len_t *len); command storage_cookie_t currentReadOffset(); command error_t seek(storage_cookie_t offset); command storage_len_t getSize(); command error_t append(void* buf, storage_len_t *len, bool *recordsLost); command storage_cookie_t currentWriteOffset(); command error_t erase(); command error_t sync(); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/BlockingMount.nc000066400000000000000000000046131207233610700247400ustar00rootroot00000000000000/* Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Mount a volume. * * @author David Gay * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:51 $ */ /* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ interface BlockingMount { /** * Mount a particular volume. This must be done before the volume's * first use. mountDone will be signaled if SUCCESS is * returned. * @return SUCCESS if mount request is accepted, FAIL if mount has * already been attempted. */ command error_t mount(); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/BlockingRead.nc000066400000000000000000000035561207233610700245160ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ interface BlockingRead { /** * Read a value * * @param val pointer for where to store the value that has been read * @return SUCCESS if a readDone() event will eventually come back. */ command error_t read(val_t* val); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/BlockingReadStream.nc000066400000000000000000000043171207233610700256660ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ interface BlockingReadStream { /** * Directs the device to fill a buffer by sampling with the * specified period. * * @param usPeriod the between-sample period in microseconds * @param buf a pointer to the buffer * @param count the number of values the buffer should hold * @param usActualPeriod Actual sampling period used - may be * different from period requested. Undefined if * result != SUCCESS. * * @return SUCCESS if the reading was carried out successfully */ command error_t read(uint32_t* usPeriod, val_t* buf, uint16_t count); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/BlockingReceive.nc000066400000000000000000000034661207233610700252250ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include #include interface BlockingReceive { command error_t receive(message_t* m, uint32_t timeout); command void* getPayload(message_t* msg, uint8_t len); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/BlockingResource.nc000066400000000000000000000034331207233610700254240ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ interface BlockingResource { command error_t request(); command error_t release(); command error_t timedRelease(uint32_t milli); command bool isOwner(); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/BlockingSend.nc000066400000000000000000000035231207233610700245260ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang */ interface BlockingSend { command error_t send(message_t* msg, uint8_t len); command error_t cancel(message_t* msg); command uint8_t maxPayloadLength(); command void* getPayload(message_t* msg, uint8_t len); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/BlockingStdControl.nc000066400000000000000000000034111207233610700257240ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include #include #include interface BlockingStdControl { command error_t start(); command error_t stop(); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/ConditionVariable.nc000066400000000000000000000061341207233610700255610ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface for using Conddition Variables for synchronization * with tosthreads. * * @author Kevin Klues */ #include "condvar.h" interface ConditionVariable { /** * Reset a condition variable for use. * @param c The condition variable you would like to reset. */ command void init(condvar_t* c); /** * Wait on a condition variable until one of the signal * calls unbocks me. In the process, unlock the mutex * passed in to me. * @param c The condition variable you would like to wait on. * @param m The mutex you would like to unlock */ command void wait(condvar_t* c, mutex_t* m); /** * Signal the next thread waiting on this condition variable * to continue execution. To unblock all threads waiting on * this condition vairable use signalAll(). * @param c The condition variable associated with the thread * you would like to signal. */ command void signalNext(condvar_t* c); /** * Signal all threads waiting on this condition variable * to continue execution. To unblock just the next thread * waiting on this condition vairable use signalNext(). * @param c The condition variable associated with the thread * you would like to signal. */ command void signalAll(condvar_t* c); /** * Query whether a condition variable is currently blocking * any threads from executing. * @param c The cndition variable you would like to query. * @return TRUE or FALSE */ command bool isBlocking(condvar_t* c); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/DynamicThread.nc000066400000000000000000000112361207233610700247000ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ interface DynamicThread { /** * create() * * This function creates a new tosthread. * * @param t A pointer to a unique handler associated with the thread being created * @param start_routine The function called when the created thread starts running * @param arg The parameter passed to the start_routine for the created thread * @param stack_size The maximum stack size for this thread * @return An error code indicating whether the thread could be created or not * SUCCESS - The thread has been created * FAIL - The thread could not be created * EALREADY - The thread identifier is already associated with a * currently active thread */ command error_t create(tosthread_t* t, void (*start_routine)(void*), void* arg, uint16_t stack_size); /** * destroy() * * This function destroys a tosthread. * * @param t A pointer to a thread identifier * @return An error code indicating whether the thread could be destroyed or not * SUCCESS - The thread has been destroyed * FAIL - The thread could not be destroyed * EBUSY - The thread holds mutexes so cannot be destroyed * at the moment */ command error_t destroy(tosthread_t* t); /** * tosthread_pause() * * This function pauses a tosthread. * * @param t A pointer to a thread identifier * @return An error code indicating whether the thread could be paused or not * SUCCESS - The thread has been paused * FAIL - The thread could not be paused * EBUSY - The thread holds mutexes so cannot be paused * at the moment */ command error_t pause(tosthread_t* t); /** * resume() * * This function resumes a previously paused tosthread. * * @param t A pointer to a thread identifier * @return An error code indicating whether the thread could be resumed or not * SUCCESS - The thread has been resumed * FAIL - The thread could not be resumed */ command error_t resume(tosthread_t* t); /** * sleep() * * This function puts the currently running thread to sleep. * * @param milli The number of milliseconds to sleep for * @return An error code indicating whether the thread could be put to sleep or not * SUCCESS - The thread has been put to sleep * FAIL - The thread could not be put to sleep */ command error_t sleep(uint32_t milli); /** * join(tosthread_t* t) * * This function bocks until the thread passed as a parameter has completed * * @param id The handle to the thread to block on * @return An error code indicating whether the thread could be waited on or not * SUCCESS - The thread has been waited on and is now completed * EALREADY - The thread we are trying to wait on has already completed * FAIL - The thread could not waited on */ command error_t join(tosthread_t* id); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/LinkedList.nc000066400000000000000000000060551207233610700242310ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "linked_list.h" interface LinkedList { async command void init(linked_list_t* l); async command void clear(linked_list_t* l); async command uint8_t size(linked_list_t* l); async command error_t addAt(linked_list_t* l, list_element_t* e, uint8_t i); async command error_t addFirst(linked_list_t* l, list_element_t* e); async command error_t addLast(linked_list_t* l, list_element_t* e); async command error_t addAfter(linked_list_t* l, list_element_t* first, list_element_t* second); async command error_t addBefore(linked_list_t* l, list_element_t* first, list_element_t* second); async command list_element_t* getAt(linked_list_t* l, uint8_t i); async command list_element_t* getFirst(linked_list_t* l); async command list_element_t* getLast(linked_list_t* l); async command list_element_t* getAfter(linked_list_t* l, list_element_t* e); async command list_element_t* getBefore(linked_list_t* l, list_element_t* e); async command uint8_t indexOf(linked_list_t* l, list_element_t* e); async command list_element_t* remove(linked_list_t* l, list_element_t* e); async command list_element_t* removeAt(linked_list_t* l, uint8_t i); async command list_element_t* removeFirst(linked_list_t* l); async command list_element_t* removeLast(linked_list_t* l); async command list_element_t* removeBefore(linked_list_t* l, list_element_t* e); async command list_element_t* removeAfter(linked_list_t* l, list_element_t* e); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/Malloc.nc000066400000000000000000000033331207233610700233720ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ interface Malloc { async command void* malloc(size_t size); async command void free (void *p); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/Mutex.nc000066400000000000000000000034121207233610700232630ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "mutex.h" interface Mutex { command void init(mutex_t* m); command error_t lock(mutex_t* m); command error_t unlock(mutex_t* m); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/PlatformInterrupt.nc000066400000000000000000000032721207233610700256660ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ interface PlatformInterrupt { async command void postAmble(); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/PoolThread.nc000066400000000000000000000005021207233610700242170ustar00rootroot00000000000000 /** * @author Jeongyeup Paek (jpaek@enl.usc.edu) **/ interface PoolThread { command error_t allocate(uint8_t* t, void (*start_routine)(void*), void* arg); command error_t release(uint8_t t); command error_t pause(uint8_t t); command error_t resume(uint8_t t); command error_t sleep(uint32_t milli); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/ReferenceCounter.nc000066400000000000000000000036601207233610700254240ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "refcounter.h" interface ReferenceCounter { async command void init(refcounter_t* r); async command void increment(refcounter_t* r); async command void decrement(refcounter_t* r); async command void waitOnValue(refcounter_t* r, uint8_t count); async command uint8_t count(refcounter_t* r); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/Semaphore.nc000066400000000000000000000035151207233610700241100ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #include "semaphore.h" /* * Counting semaphore */ interface Semaphore { command void reset(semaphore_t* s, uint8_t v); command error_t acquire(semaphore_t* s); command error_t release(semaphore_t* s); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/SystemCall.nc000066400000000000000000000034501207233610700242430ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "TinyError.h" interface SystemCall { command error_t start(void* syscall_ptr, syscall_t* s, syscall_id_t id, void* params); command error_t finish(syscall_t* s); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/SystemCallQueue.nc000066400000000000000000000040561207233610700252530ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" #include "syscall_queue.h" interface SystemCallQueue { async command void init(syscall_queue_t* q); async command void enqueue(syscall_queue_t* q, syscall_t* t); async command syscall_t* dequeue(syscall_queue_t* q); async command syscall_t* remove(syscall_queue_t* q, syscall_t* t); async command syscall_t* find(syscall_queue_t* q, syscall_id_t id); async command bool isEmpty(syscall_queue_t* q); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/TaskScheduler.nc000066400000000000000000000057671207233610700247410ustar00rootroot00000000000000// $Id: TaskScheduler.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* tab:4 * Copyright (c) 2004-5 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-5 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The interface to a TinyOS task scheduler. * * @author Philip Levis * @author Kevin Klues * @date January 19 2005 * @see TEP 106: Tasks and Schedulers * @see TEP 107: Boot Sequence */ interface TaskScheduler { /** * Initialize the scheduler. */ command void init(); /** * Run the next task if one is waiting, otherwise return immediately. * * @return whether a task was run -- TRUE indicates a task * ran, FALSE indicates there was no task to run. */ command bool runNextTask(); /** * Check to see if there are any pending tasks in the task queue. * * @return whether there are any tasks waiting to run */ async command bool hasTasks(); /** * Enter an infinite task-running loop. Put the MCU into a low power * state when the processor is idle (task queue empty, waiting for * interrupts). This call never returns. */ command void taskLoop(); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/Thread.nc000066400000000000000000000035421207233610700233740ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ interface Thread { command error_t start(void* arg); command error_t stop(); command error_t pause(); command error_t resume(); command error_t sleep(uint32_t milli); event void run(void* arg); command error_t join(); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/ThreadCleanup.nc000066400000000000000000000032621207233610700247030ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ interface ThreadCleanup { async event void cleanup(); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/ThreadFunction.nc000066400000000000000000000032761207233610700251060ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ interface ThreadFunction { event void signalThreadRun(void* arg); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/ThreadInfo.nc000066400000000000000000000033501207233610700242050ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" interface ThreadInfo { async command error_t reset(); async command thread_t* get(); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/ThreadNotification.nc000066400000000000000000000033401207233610700257370ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ interface ThreadNotification { async event void justCreated(); async event void aboutToDestroy(); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/ThreadQueue.nc000066400000000000000000000037001207233610700243750ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread_queue.h" interface ThreadQueue { async command void init(thread_queue_t* q); async command void enqueue(thread_queue_t* q, thread_t* t); async command thread_t* dequeue(thread_queue_t* q); async command thread_t* remove(thread_queue_t* q, thread_t* t); async command bool isEmpty(thread_queue_t* q); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/ThreadScheduler.nc000066400000000000000000000042271207233610700252340ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" interface ThreadScheduler { async command uint8_t currentThreadId(); async command thread_t* currentThreadInfo(); async command thread_t* threadInfo(thread_id_t id); command error_t initThread(thread_id_t id); command error_t startThread(thread_id_t id); command error_t stopThread(thread_id_t id); async command error_t suspendCurrentThread(); async command error_t interruptCurrentThread(); async command error_t wakeupThread(thread_id_t id); async command error_t joinThread(thread_id_t id); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/interfaces/ThreadSleep.nc000066400000000000000000000032731207233610700243660ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ interface ThreadSleep { command error_t sleep(uint32_t milli); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/000077500000000000000000000000001207233610700202625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/000077500000000000000000000000001207233610700210505ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/BlockingCollectionControlC.nc000066400000000000000000000042471207233610700266110ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang */ configuration BlockingCollectionControlC { provides { interface BlockingStdControl as RoutingControl; interface RootControl; } } implementation { components CollectionC as Collector, SystemCallC, MutexC, BlockingCollectionControlP; RoutingControl = BlockingCollectionControlP.BlockingStdControl; RootControl = Collector; BlockingCollectionControlP.RoutingControl -> Collector.StdControl; BlockingCollectionControlP.SystemCall -> SystemCallC; BlockingCollectionControlP.Mutex -> MutexC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/BlockingCollectionControlP.nc000066400000000000000000000052641207233610700266260ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang */ module BlockingCollectionControlP { provides { interface BlockingStdControl; interface Init; } uses { interface StdControl as RoutingControl; interface SystemCall; interface Mutex; } } implementation { typedef struct params { error_t error; } params_t; syscall_t* start_call = NULL; mutex_t my_mutex; command error_t Init.init() { call Mutex.init(&my_mutex); return SUCCESS; } void startTask(syscall_t* s) { params_t* p = s->params; p->error = call RoutingControl.start(); call SystemCall.finish(s); } command error_t BlockingStdControl.start() { syscall_t s; params_t p; call Mutex.lock(&my_mutex); if (start_call == NULL) { start_call = &s; call SystemCall.start(&startTask, &s, INVALID_ID, &p); start_call = NULL; } else { p.error = EBUSY; } atomic { call Mutex.unlock(&my_mutex); return p.error; } } command error_t BlockingStdControl.stop() { return call RoutingControl.stop(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/BlockingCollectionReceiverC.nc000066400000000000000000000037141207233610700267330ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang */ generic configuration BlockingCollectionReceiverC (collection_id_t id) { provides { interface BlockingReceive; interface Packet; } } implementation { components BlockingCollectionReceiverP, CollectionC as Collector; BlockingReceive = BlockingCollectionReceiverP.BlockingReceive[id]; Packet = Collector; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/BlockingCollectionReceiverP.nc000066400000000000000000000051411207233610700267440ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang */ configuration BlockingCollectionReceiverP { provides { interface BlockingReceive[collection_id_t id]; interface BlockingReceive as BlockingReceiveAny; } } implementation { components new BlockingAMReceiverImplP() as BlockingCollectionReceiverImplP, CollectionC as Collector, ThreadTimersC, MainC, SystemCallC, SystemCallQueueC, TinyThreadSchedulerC; MainC.SoftwareInit -> BlockingCollectionReceiverImplP; BlockingReceive = BlockingCollectionReceiverImplP; BlockingReceiveAny = BlockingCollectionReceiverImplP; BlockingCollectionReceiverImplP.Receive -> Collector.Receive; BlockingCollectionReceiverImplP.Timer -> ThreadTimersC; BlockingCollectionReceiverImplP.SystemCallQueue -> SystemCallQueueC; BlockingCollectionReceiverImplP.SystemCall -> SystemCallC; BlockingCollectionReceiverImplP.ThreadScheduler -> TinyThreadSchedulerC; BlockingCollectionReceiverImplP.Packet -> Collector; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/BlockingCollectionSnooperC.nc000066400000000000000000000036031207233610700266110ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang */ generic configuration BlockingCollectionSnooperC (collection_id_t id) { provides { interface BlockingReceive as BlockingSnoop; } } implementation { components BlockingCollectionSnooperP; BlockingSnoop = BlockingCollectionSnooperP.BlockingSnoop[id]; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/BlockingCollectionSnooperP.nc000066400000000000000000000051511207233610700266260ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang */ configuration BlockingCollectionSnooperP { provides { interface BlockingReceive as BlockingSnoop[collection_id_t id]; interface BlockingReceive as BlockingSnoopAny; } } implementation { components new BlockingAMReceiverImplP() as BlockingCollectionReceiverImplP, CollectionC as Collector, ThreadTimersC, MainC, SystemCallC, SystemCallQueueC, TinyThreadSchedulerC; MainC.SoftwareInit -> BlockingCollectionReceiverImplP; BlockingSnoop = BlockingCollectionReceiverImplP; BlockingSnoopAny = BlockingCollectionReceiverImplP; BlockingCollectionReceiverImplP.Receive -> Collector.Snoop; BlockingCollectionReceiverImplP.Timer -> ThreadTimersC; BlockingCollectionReceiverImplP.SystemCallQueue -> SystemCallQueueC; BlockingCollectionReceiverImplP.SystemCall -> SystemCallC; BlockingCollectionReceiverImplP.ThreadScheduler -> TinyThreadSchedulerC; BlockingCollectionReceiverImplP.Packet -> Collector; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/CCollectionId.nc000066400000000000000000000034161207233610700240510ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang */ interface CCollectionId { command collection_id_t fetch(uint8_t clientid); command error_t set(uint8_t clientid, collection_id_t collectionid); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/ctp/000077500000000000000000000000001207233610700216365ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/ctp/BlockingCollectionSenderC.nc000066400000000000000000000042631207233610700271750ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang * @author Kevin Klues */ #include generic configuration BlockingCollectionSenderC (collection_id_t collectid) { provides { interface BlockingSend; interface Packet; } } implementation { components BlockingCollectionSenderP, new CollectionIdP(collectid), CollectionC as Collector; enum { CLIENT_ID = unique(UQ_CTP_CLIENT), }; BlockingSend = BlockingCollectionSenderP.BlockingSend[CLIENT_ID]; Packet = Collector; Collector.CollectionId[CLIENT_ID] -> CollectionIdP; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/ctp/BlockingCollectionSenderImplP.nc000066400000000000000000000064471207233610700300420ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang */ module BlockingCollectionSenderImplP { provides { interface BlockingSend[uint8_t client]; interface Init; } uses { interface Send[uint8_t client]; interface SystemCall; interface Mutex; interface Packet; interface Leds; } } implementation { typedef struct params { message_t *msg; uint8_t len; error_t error; } params_t; syscall_t* send_call; mutex_t my_mutex; command error_t Init.init() { call Mutex.init(&my_mutex); return SUCCESS; } void sendTask(syscall_t *s) { params_t* p = s->params; p->error = call Send.send[s->id](p->msg, p->len); if(p->error != SUCCESS) { call SystemCall.finish(s); } } command error_t BlockingSend.send[uint8_t client](message_t *msg, uint8_t len) { syscall_t s; params_t p; call Mutex.lock(&my_mutex); send_call = &s; p.msg = msg; p.len = len; call SystemCall.start(&sendTask, &s, client, &p); atomic { call Mutex.unlock(&my_mutex); return p.error; } } event void Send.sendDone[uint8_t client](message_t* m, error_t error) { if (client == send_call->id) { params_t* p; p = send_call->params; p->error = error; call SystemCall.finish(send_call); } } command error_t BlockingSend.cancel[uint8_t client](message_t* msg) { return call Send.cancel[client](msg); } command uint8_t BlockingSend.maxPayloadLength[uint8_t client]() { return call Send.maxPayloadLength[client](); } command void* BlockingSend.getPayload[uint8_t client](message_t* msg, uint8_t len) { return call Send.getPayload[client](msg, len); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/ctp/BlockingCollectionSenderP.nc000066400000000000000000000045121207233610700272070ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang * @author Kevin Klues */ configuration BlockingCollectionSenderP { provides { interface BlockingSend[uint8_t id]; } } implementation { components BlockingCollectionSenderImplP, CollectionC as Collector, MutexC, SystemCallC, MainC, LedsC; MainC.SoftwareInit -> BlockingCollectionSenderImplP; BlockingSend = BlockingCollectionSenderImplP.BlockingSend; BlockingCollectionSenderImplP.Mutex -> MutexC; BlockingCollectionSenderImplP.SystemCall -> SystemCallC; BlockingCollectionSenderImplP.Send -> Collector; BlockingCollectionSenderImplP.Packet -> Collector; BlockingCollectionSenderImplP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/ctp/CCollectionC.nc000066400000000000000000000045341207233610700244670ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "tosthread_collection.h" #include "Ctp.h" configuration CCollectionC {} implementation { components CCollectionP as CCP; components BlockingCollectionReceiverP; components BlockingCollectionSnooperP; components BlockingCollectionSenderP; components BlockingCollectionControlC; components CCollectionIdP; CCP.BlockingReceive -> BlockingCollectionReceiverP; CCP.BlockingSnoop -> BlockingCollectionSnooperP; CCP.BlockingSend -> BlockingCollectionSenderP; CCP.RoutingControl -> BlockingCollectionControlC; CCP.CCollectionId -> CCollectionIdP; components CollectionC; CCP.Packet -> CollectionC; CCP.CollectionPacket -> CollectionC; CCP.RootControl -> CollectionC; CollectionC.CollectionId -> CCP; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/ctp/CCollectionIdP.nc000066400000000000000000000042111207233610700247510ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang */ module CCollectionIdP { provides { interface CCollectionId; } } implementation { collection_id_t clientCollectionIds[uniqueCount(UQ_CTP_CLIENT)]; command collection_id_t CCollectionId.fetch(uint8_t clientid) { return clientCollectionIds[clientid]; } command error_t CCollectionId.set(uint8_t clientid, collection_id_t collectionid) { if (clientid < uniqueCount(UQ_CTP_CLIENT)) { clientCollectionIds[clientid] = collectionid; return SUCCESS; } return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/ctp/CCollectionP.nc000066400000000000000000000112271207233610700245010ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @author Chieh-Jan Mike Liang */ module CCollectionP { uses { interface BlockingStdControl as RoutingControl; interface BlockingReceive[collection_id_t id]; interface BlockingReceive as BlockingSnoop[collection_id_t id]; interface BlockingSend[uint8_t id]; interface Packet; interface CollectionPacket; interface RootControl; interface CCollectionId; } provides { interface CollectionId[uint8_t client]; } } implementation { command collection_id_t CollectionId.fetch[uint8_t id]() { return call CCollectionId.fetch(id); } error_t collectionSetCollectionId(uint8_t clientid, collection_id_t collectionid) @C() AT_SPONTANEOUS { return call CCollectionId.set(clientid, collectionid); } error_t collectionRoutingStart() @C() AT_SPONTANEOUS { return call RoutingControl.start(); } error_t collectionRoutingStop() @C() AT_SPONTANEOUS { return call RoutingControl.stop(); } error_t collectionReceive(message_t* m, uint32_t timeout, collection_id_t id) @C() AT_SPONTANEOUS { return call BlockingReceive.receive[id](m, timeout); } error_t collectionSnoop(message_t* m, uint32_t timeout, collection_id_t id) @C() AT_SPONTANEOUS { return call BlockingSnoop.receive[id](m, timeout); } error_t collectionSend(message_t* msg, uint8_t len, uint8_t id) @C() AT_SPONTANEOUS { return call BlockingSend.send[id](msg, len); } void collectionClear(message_t* msg) @C() AT_SPONTANEOUS { call Packet.clear(msg); } uint8_t collectionGetPayloadLength(message_t* msg) @C() AT_SPONTANEOUS { return call Packet.payloadLength(msg); } void collectionSetPayloadLength(message_t* msg, uint8_t len) @C() AT_SPONTANEOUS { call Packet.setPayloadLength(msg, len); } uint8_t collectionMaxPayloadLength() @C() AT_SPONTANEOUS { return call Packet.maxPayloadLength(); } void* collectionGetPayload(message_t* msg, uint8_t len) @C() AT_SPONTANEOUS { return call Packet.getPayload(msg, len); } am_addr_t collectionGetOrigin(message_t* msg) @C() AT_SPONTANEOUS { return call CollectionPacket.getOrigin(msg); } void collectionSetOrigin(message_t* msg, am_addr_t addr) @C() AT_SPONTANEOUS { call CollectionPacket.setOrigin(msg, addr); } collection_id_t collectionGetType(message_t* msg) @C() AT_SPONTANEOUS { return call CollectionPacket.getType(msg); } void collectionSetType(message_t* msg, collection_id_t id) @C() AT_SPONTANEOUS { call CollectionPacket.setType(msg, id); } uint8_t collectionGetSequenceNumber(message_t* msg) @C() AT_SPONTANEOUS { return call CollectionPacket.getSequenceNumber(msg); } void collectionSetSequenceNumber(message_t* msg, uint8_t seqno) @C() AT_SPONTANEOUS { call CollectionPacket.setSequenceNumber(msg, seqno); } error_t collectionSetRoot() @C() AT_SPONTANEOUS { return call RootControl.setRoot(); } error_t collectionUnsetRoot() @C() AT_SPONTANEOUS { return call RootControl.unsetRoot(); } bool collectionIsRoot() @C() AT_SPONTANEOUS { return call RootControl.isRoot(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/ctp/ccollection.h000066400000000000000000000035261207233610700243130ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef CCOLLECTION_H #define CCOLLECTION_H #include "message.h" #include "TinyError.h" #include "Collection.h" #include "Ctp.h" #define NEW_COLLECTION_CLIENT_ID() ((uint8_t)unique(UQ_CTP_CLIENT)) #endif //CCOLLECTION_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/lqi/000077500000000000000000000000001207233610700216355ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/lqi/BlockingCollectionSenderC.nc000066400000000000000000000043131207233610700271700ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang * @author Kevin Klues */ #include generic configuration BlockingCollectionSenderC (collection_id_t collectid) { provides { interface BlockingSend; interface Packet; } } implementation { components BlockingCollectionSenderP, new CollectionIdP(collectid), CollectionC as Collector; enum { CLIENT_ID = unique(UQ_LQI_CLIENT), }; BlockingSend = BlockingCollectionSenderP.BlockingSend[CLIENT_ID]; Packet = Collector; BlockingCollectionSenderP.CollectionId[CLIENT_ID] -> CollectionIdP; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/lqi/BlockingCollectionSenderImplP.nc000066400000000000000000000070241207233610700300310ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang */ module BlockingCollectionSenderImplP { provides { interface BlockingSend[uint8_t client]; interface Init; } uses { interface Send[uint8_t client]; interface SystemCall; interface Mutex; interface Packet; interface Leds; interface CollectionPacket; interface CollectionId[uint8_t client]; } } implementation { typedef struct params { message_t *msg; uint8_t len; error_t error; } params_t; syscall_t* send_call; mutex_t my_mutex; command error_t Init.init() { call Mutex.init(&my_mutex); return SUCCESS; } void sendTask(syscall_t *s) { params_t* p = s->params; call CollectionPacket.setType(p->msg, call CollectionId.fetch[s->id]()); p->error = call Send.send[s->id](p->msg, p->len); if(p->error != SUCCESS) { call SystemCall.finish(s); } } command error_t BlockingSend.send[uint8_t client](message_t *msg, uint8_t len) { syscall_t s; params_t p; call Mutex.lock(&my_mutex); send_call = &s; p.msg = msg; p.len = len; call SystemCall.start(&sendTask, &s, client, &p); atomic { call Mutex.unlock(&my_mutex); return p.error; } } event void Send.sendDone[uint8_t client](message_t* m, error_t error) { if (client == send_call->id) { params_t* p; p = send_call->params; p->error = error; call SystemCall.finish(send_call); } } command error_t BlockingSend.cancel[uint8_t client](message_t* msg) { return call Send.cancel[client](msg); } command uint8_t BlockingSend.maxPayloadLength[uint8_t client]() { return call Send.maxPayloadLength[client](); } command void* BlockingSend.getPayload[uint8_t client](message_t* msg, uint8_t len) { return call Send.getPayload[client](msg, len); } default command collection_id_t CollectionId.fetch[uint8_t id]() { return 0; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/lqi/BlockingCollectionSenderP.nc000066400000000000000000000047611207233610700272140ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang * @author Kevin Klues */ configuration BlockingCollectionSenderP { provides { interface BlockingSend[uint8_t id]; } uses { interface CollectionId[uint8_t id]; } } implementation { components BlockingCollectionSenderImplP, CollectionC as Collector, MutexC, SystemCallC, MainC, LedsC; MainC.SoftwareInit -> BlockingCollectionSenderImplP; BlockingSend = BlockingCollectionSenderImplP.BlockingSend; CollectionId = BlockingCollectionSenderImplP; BlockingCollectionSenderImplP.Mutex -> MutexC; BlockingCollectionSenderImplP.SystemCall -> SystemCallC; BlockingCollectionSenderImplP.Send -> Collector; BlockingCollectionSenderImplP.Packet -> Collector; BlockingCollectionSenderImplP.Leds -> LedsC; BlockingCollectionSenderImplP.CollectionPacket -> Collector; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/lqi/CCollectionC.nc000066400000000000000000000045011207233610700244600ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "tosthread_collection.h" #include "MultiHopLqi.h" configuration CCollectionC {} implementation { components CCollectionP as CCP; components BlockingCollectionReceiverP; components BlockingCollectionSnooperP; components BlockingCollectionSenderP; components BlockingCollectionControlC; components CCollectionIdP; CCP.BlockingReceive -> BlockingCollectionReceiverP; CCP.BlockingSnoop -> BlockingCollectionSnooperP; CCP.BlockingSend -> BlockingCollectionSenderP; CCP.RoutingControl -> BlockingCollectionControlC; CCP.CCollectionId -> CCollectionIdP; components CollectionC; CCP.Packet -> CollectionC; CCP.CollectionPacket -> CollectionC; CCP.RootControl -> CollectionC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/lqi/CCollectionIdP.nc000066400000000000000000000042111207233610700247500ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang */ module CCollectionIdP { provides { interface CCollectionId; } } implementation { collection_id_t clientCollectionIds[uniqueCount(UQ_LQI_CLIENT)]; command collection_id_t CCollectionId.fetch(uint8_t clientid) { return clientCollectionIds[clientid]; } command error_t CCollectionId.set(uint8_t clientid, collection_id_t collectionid) { if (clientid < uniqueCount(UQ_LQI_CLIENT)) { clientCollectionIds[clientid] = collectionid; return SUCCESS; } return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/lqi/CCollectionP.nc000066400000000000000000000113351207233610700245000ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @author Chieh-Jan Mike Liang */ module CCollectionP { uses { interface BlockingStdControl as RoutingControl; interface BlockingReceive[collection_id_t id]; interface BlockingReceive as BlockingSnoop[collection_id_t id]; interface BlockingSend[uint8_t id]; interface Packet; interface CollectionPacket; interface RootControl; interface CCollectionId; } provides { interface CollectionId[uint8_t client]; } } implementation { command collection_id_t CollectionId.fetch[uint8_t id]() { return call CCollectionId.fetch(id); } error_t collectionSetCollectionId(uint8_t clientid, collection_id_t collectionid) @C() AT_SPONTANEOUS { return call CCollectionId.set(clientid, collectionid); } error_t collectionRoutingStart() @C() AT_SPONTANEOUS { return call RoutingControl.start(); } error_t collectionRoutingStop() @C() AT_SPONTANEOUS { return call RoutingControl.stop(); } error_t collectionReceive(message_t* m, uint32_t timeout, collection_id_t id) @C() AT_SPONTANEOUS { return call BlockingReceive.receive[id](m, timeout); } error_t collectionSnoop(message_t* m, uint32_t timeout, collection_id_t id) @C() AT_SPONTANEOUS { return call BlockingSnoop.receive[id](m, timeout); } error_t collectionSend(message_t* msg, uint8_t len, uint8_t id) @C() AT_SPONTANEOUS { call CollectionPacket.setType(msg, call CCollectionId.fetch(id)); return call BlockingSend.send[id](msg, len); } void collectionClear(message_t* msg) @C() AT_SPONTANEOUS { call Packet.clear(msg); } uint8_t collectionGetPayloadLength(message_t* msg) @C() AT_SPONTANEOUS { return call Packet.payloadLength(msg); } void collectionSetPayloadLength(message_t* msg, uint8_t len) @C() AT_SPONTANEOUS { call Packet.setPayloadLength(msg, len); } uint8_t collectionMaxPayloadLength() @C() AT_SPONTANEOUS { return call Packet.maxPayloadLength(); } void* collectionGetPayload(message_t* msg, uint8_t len) @C() AT_SPONTANEOUS { return call Packet.getPayload(msg, len); } am_addr_t collectionGetOrigin(message_t* msg) @C() AT_SPONTANEOUS { return call CollectionPacket.getOrigin(msg); } void collectionSetOrigin(message_t* msg, am_addr_t addr) @C() AT_SPONTANEOUS { call CollectionPacket.setOrigin(msg, addr); } collection_id_t collectionGetType(message_t* msg) @C() AT_SPONTANEOUS { return call CollectionPacket.getType(msg); } void collectionSetType(message_t* msg, collection_id_t id) @C() AT_SPONTANEOUS { call CollectionPacket.setType(msg, id); } uint8_t collectionGetSequenceNumber(message_t* msg) @C() AT_SPONTANEOUS { return call CollectionPacket.getSequenceNumber(msg); } void collectionSetSequenceNumber(message_t* msg, uint8_t seqno) @C() AT_SPONTANEOUS { call CollectionPacket.setSequenceNumber(msg, seqno); } error_t collectionSetRoot() @C() AT_SPONTANEOUS { return call RootControl.setRoot(); } error_t collectionUnsetRoot() @C() AT_SPONTANEOUS { return call RootControl.unsetRoot(); } bool collectionIsRoot() @C() AT_SPONTANEOUS { return call RootControl.isRoot(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/lqi/ccollection.h000066400000000000000000000035361207233610700243130ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef CCOLLECTION_H #define CCOLLECTION_H #include "message.h" #include "TinyError.h" #include "Collection.h" #include "MultiHopLqi.h" #define NEW_COLLECTION_CLIENT_ID() ((uint8_t)unique(UQ_LQI_CLIENT)) #endif //CCOLLECTION_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/net/tosthread_collection.h000066400000000000000000000060061207233610700254330ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @author Chieh-Jan Mike Liang */ #ifndef TOSTHREAD_COLLECTION_H #define TOSTHREAD_COLLECTION_H #include "ccollection.h" extern error_t collectionRoutingStart(); extern error_t collectionRoutingStop(); extern error_t collectionSetCollectionId(uint8_t clientid, collection_id_t collectionid); extern error_t collectionReceive(message_t* m, uint32_t timeout, collection_id_t id); extern error_t collectionSnoop(message_t* m, uint32_t timeout, collection_id_t id); extern error_t collectionSend(message_t* msg, uint8_t len, collection_id_t id); extern void collectionClear(message_t* msg); extern uint8_t collectionGetPayloadLength(message_t* msg); extern void collectionSetPayloadLength(message_t* msg, uint8_t len); extern uint8_t collectionMaxPayloadLength(); extern void* collectionGetPayload(message_t* msg, uint8_t len); extern am_addr_t collectionGetOrigin(message_t* msg); extern void collectionSetOrigin(message_t* msg, am_addr_t addr); extern collection_id_t collectionGetType(message_t* msg); extern void collectionSetType(message_t* msg, collection_id_t id); extern uint8_t collectionGetSequenceNumber(message_t* msg); extern void collectionSetSequenceNumber(message_t* msg, uint8_t seqno); extern error_t collectionSetRoot(); extern error_t collectionUnsetRoot(); extern bool collectionIsRoot(); #endif //TOSTHREAD_COLLECTION_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/printf/000077500000000000000000000000001207233610700215645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/printf/PrintfC.nc000066400000000000000000000045041207233610700234560ustar00rootroot00000000000000 /* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "printf.h" configuration PrintfC {} implementation { components MainC; components PrintfP; PrintfP.Boot -> MainC; components new ThreadC(200); PrintfP.PrintfThread -> ThreadC; components BlockingSerialActiveMessageC; PrintfP.SerialControl -> BlockingSerialActiveMessageC; PrintfP.Packet -> BlockingSerialActiveMessageC; components new PrintfQueueC(uint8_t, PRINTF_BUFFER_SIZE) as QueueC; PrintfP.Queue -> QueueC; components BarrierC; PrintfP.Barrier -> BarrierC; components MutexC; PrintfP.Mutex -> MutexC; components new BlockingSerialAMSenderC(AM_PRINTF_MSG); PrintfP.BlockingAMSend -> BlockingSerialAMSenderC; components LedsC; PrintfP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/printf/PrintfP.nc000066400000000000000000000107151207233610700234740ustar00rootroot00000000000000 /* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "printf.h" #ifdef _H_atmega128hardware_H static int uart_putchar(char c, FILE *stream); static FILE atm128_stdout = FDEV_SETUP_STREAM(TCAST(int (*)(char c, FILE *stream), uart_putchar), NULL, _FDEV_SETUP_WRITE); #endif module PrintfP { uses { interface Boot; interface Thread as PrintfThread; interface BlockingStdControl as SerialControl; interface PrintfQueue as Queue; interface Barrier; interface Mutex; interface BlockingAMSend; interface Packet; interface Leds; } } implementation { message_t printfMsg; printf_msg_t* printf_payload; mutex_t printf_mutex; barrier_t flushstart_barrier; barrier_t flushdone_barrier; void flush_buffer(); event void Boot.booted() { #ifdef _H_atmega128hardware_H stdout = &atm128_stdout; #endif printf_payload = (printf_msg_t*)call Packet.getPayload(&printfMsg, sizeof(printf_msg_t)); call Mutex.init(&printf_mutex); call Barrier.reset(&flushstart_barrier, 2); call Barrier.reset(&flushdone_barrier, 2); call PrintfThread.start(NULL); } event void PrintfThread.run(void* arg) { call SerialControl.start(); for(;;) { call Barrier.block(&flushstart_barrier); flush_buffer(); call Barrier.block(&flushdone_barrier); } } void flush_buffer() { int i; uint16_t q_size; uint16_t length_to_send; call Mutex.lock(&printf_mutex); q_size = call Queue.size(); call Mutex.unlock(&printf_mutex); while(q_size > 0) { memset(printf_payload->buffer, 0, sizeof(printf_msg_t)); length_to_send = (q_size < sizeof(printf_msg_t)) ? q_size : sizeof(printf_msg_t); call Mutex.lock(&printf_mutex); for(i=0; ibuffer[i] = call Queue.dequeue(); q_size = call Queue.size(); call Mutex.unlock(&printf_mutex); call BlockingAMSend.send(AM_BROADCAST_ADDR, &printfMsg, sizeof(printf_msg_t)); } } int printfflush() @C() @spontaneous() { call Barrier.block(&flushstart_barrier); call Barrier.reset(&flushstart_barrier, 2); call Barrier.block(&flushdone_barrier); call Barrier.reset(&flushdone_barrier, 2); return SUCCESS; } #ifdef _H_msp430hardware_h int putchar(int c) __attribute__((noinline)) @C() @spontaneous() { #endif #ifdef _H_atmega128hardware_H int uart_putchar(char c, FILE *stream) __attribute__((noinline)) @C() @spontaneous() { #endif #ifdef __M16C60HARDWARE_H__ int lowlevel_putc(int c) __attribute__((noinline)) @C() @spontaneous() { #endif uint16_t q_size; error_t q_error; call Mutex.lock(&printf_mutex); q_error = call Queue.enqueue(c); q_size = call Queue.size(); call Mutex.unlock(&printf_mutex); if((q_size == PRINTF_BUFFER_SIZE/2)) printfflush(); if(q_error == SUCCESS) return 0; else return -1; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/printf/avr_stdio.h000066400000000000000000001232441207233610700237350ustar00rootroot00000000000000/* Copyright (c) 2002, 2005, Joerg Wunsch All rights reserved. Portions of documentation Copyright (c) 1990, 1991, 1993 The Regents of the University of California. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. $Id: avr_stdio.h,v 1.2 2008-07-21 23:14:04 sallai Exp $ */ #ifndef _STDIO_H_ #define _STDIO_H_ 1 #ifndef __ASSEMBLER__ #include #include #define __need_NULL #define __need_size_t #include /** \defgroup avr_stdio : Standard IO facilities \code #include \endcode

      Introduction to the Standard IO facilities

      This file declares the standard IO facilities that are implemented in \c avr-libc. Due to the nature of the underlying hardware, only a limited subset of standard IO is implemented. There is no actual file implementation available, so only device IO can be performed. Since there's no operating system, the application needs to provide enough details about their devices in order to make them usable by the standard IO facilities. Due to space constraints, some functionality has not been implemented at all (like some of the \c printf conversions that have been left out). Nevertheless, potential users of this implementation should be warned: the \c printf and \c scanf families of functions, although usually associated with presumably simple things like the famous "Hello, world!" program, are actually fairly complex which causes their inclusion to eat up a fair amount of code space. Also, they are not fast due to the nature of interpreting the format string at run-time. Whenever possible, resorting to the (sometimes non-standard) predetermined conversion facilities that are offered by avr-libc will usually cost much less in terms of speed and code size.

      Tunable options for code size vs. feature set

      In order to allow programmers a code size vs. functionality tradeoff, the function vfprintf() which is the heart of the printf family can be selected in different flavours using linker options. See the documentation of vfprintf() for a detailed description. The same applies to vfscanf() and the \c scanf family of functions.

      Outline of the chosen API

      The standard streams \c stdin, \c stdout, and \c stderr are provided, but contrary to the C standard, since avr-libc has no knowledge about applicable devices, these streams are not already pre-initialized at application startup. Also, since there is no notion of "file" whatsoever to avr-libc, there is no function \c fopen() that could be used to associate a stream to some device. (See \ref stdio_note1 "note 1".) Instead, the function \c fdevopen() is provided to associate a stream to a device, where the device needs to provide a function to send a character, to receive a character, or both. There is no differentiation between "text" and "binary" streams inside avr-libc. Character \c \\n is sent literally down to the device's \c put() function. If the device requires a carriage return (\c \\r) character to be sent before the linefeed, its \c put() routine must implement this (see \ref stdio_note2 "note 2"). As an alternative method to fdevopen(), the macro fdev_setup_stream() might be used to setup a user-supplied FILE structure. It should be noted that the automatic conversion of a newline character into a carriage return - newline sequence breaks binary transfers. If binary transfers are desired, no automatic conversion should be performed, but instead any string that aims to issue a CR-LF sequence must use "\r\n" explicitly. For convenience, the first call to \c fdevopen() that opens a stream for reading will cause the resulting stream to be aliased to \c stdin. Likewise, the first call to \c fdevopen() that opens a stream for writing will cause the resulting stream to be aliased to both, \c stdout, and \c stderr. Thus, if the open was done with both, read and write intent, all three standard streams will be identical. Note that these aliases are indistinguishable from each other, thus calling \c fclose() on such a stream will also effectively close all of its aliases (\ref stdio_note3 "note 3"). It is possible to tie additional user data to a stream, using fdev_set_udata(). The backend put and get functions can then extract this user data using fdev_get_udata(), and act appropriately. For example, a single put function could be used to talk to two different UARTs that way, or the put and get functions could keep internal state between calls there.

      Format strings in flash ROM

      All the \c printf and \c scanf family functions come in two flavours: the standard name, where the format string is expected to be in SRAM, as well as a version with the suffix "_P" where the format string is expected to reside in the flash ROM. The macro \c PSTR (explained in \ref avr_pgmspace) becomes very handy for declaring these format strings. \anchor stdio_without_malloc

      Running stdio without malloc()

      By default, fdevopen() as well as the floating-point versions of the printf and scanf family require malloc(). As this is often not desired in the limited environment of a microcontroller, an alternative option is provided to run completely without malloc(). The macro fdev_setup_stream() is provided to prepare a user-supplied FILE buffer for operation with stdio. If floating-point operation is desired, a user-supplied buffer can as well be passed for the internal buffering for the floating-point numbers (and processing of \%[ scanf data).

      Example

      \code #include static int uart_putchar(char c, FILE *stream); static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); static int uart_putchar(char c, FILE *stream) { if (c == '\n') uart_putchar('\r', stream); loop_until_bit_is_set(UCSRA, UDRE); UDR = c; return 0; } int main(void) { init_uart(); stdout = &mystdout; printf("Hello, world!\n"); return 0; } \endcode This example uses the initializer form FDEV_SETUP_STREAM() rather than the function-like fdev_setup_stream(), so all data initialization happens during C start-up. If streams initialized that way are no longer needed, they can be destroyed by first calling the macro fdev_close(), and then destroying the object itself. No call to fclose() should be issued for these streams. While calling fclose() itself is harmless, it will cause an undefined reference to free() and thus cause the linker to link the malloc module into the application.

      Notes

      \anchor stdio_note1 \par Note 1: It might have been possible to implement a device abstraction that is compatible with \c fopen() but since this would have required to parse a string, and to take all the information needed either out of this string, or out of an additional table that would need to be provided by the application, this approach was not taken. \anchor stdio_note2 \par Note 2: This basically follows the Unix approach: if a device such as a terminal needs special handling, it is in the domain of the terminal device driver to provide this functionality. Thus, a simple function suitable as \c put() for \c fdevopen() that talks to a UART interface might look like this: \code int uart_putchar(char c, FILE *stream) { if (c == '\n') uart_putchar('\r'); loop_until_bit_is_set(UCSRA, UDRE); UDR = c; return 0; } \endcode \anchor stdio_note3 \par Note 3: This implementation has been chosen because the cost of maintaining an alias is considerably smaller than the cost of maintaining full copies of each stream. Yet, providing an implementation that offers the complete set of standard streams was deemed to be useful. Not only that writing \c printf() instead of fprintf(mystream, ...) saves typing work, but since avr-gcc needs to resort to pass all arguments of variadic functions on the stack (as opposed to passing them in registers for functions that take a fixed number of parameters), the ability to pass one parameter less by implying \c stdin will also save some execution time. */ #if !defined(__DOXYGEN__) /* * This is an internal structure of the library that is subject to be * changed without warnings at any time. Please do *never* reference * elements of it beyond by using the official interfaces provided. */ struct __file { char *buf; /* buffer pointer */ unsigned char unget; /* ungetc() buffer */ uint8_t flags; /* flags, see below */ #define __SRD 0x0001 /* OK to read */ #define __SWR 0x0002 /* OK to write */ #define __SSTR 0x0004 /* this is an sprintf/snprintf string */ #define __SPGM 0x0008 /* fmt string is in progmem */ #define __SERR 0x0010 /* found error */ #define __SEOF 0x0020 /* found EOF */ #define __SUNGET 0x040 /* ungetc() happened */ #define __SMALLOC 0x80 /* handle is malloc()ed */ #if 0 /* possible future extensions, will require uint16_t flags */ #define __SRW 0x0100 /* open for reading & writing */ #define __SLBF 0x0200 /* line buffered */ #define __SNBF 0x0400 /* unbuffered */ #define __SMBF 0x0800 /* buf is from malloc */ #endif int size; /* size of buffer */ int len; /* characters read or written so far */ int (*put)(char, struct __file *); /* function to write one char to device */ int (*get)(struct __file *); /* function to read one char from device */ void *udata; /* User defined and accessible data. */ }; #endif /* not __DOXYGEN__ */ /*@{*/ /** \c FILE is the opaque structure that is passed around between the various standard IO functions. */ #define FILE struct __file /** Stream that will be used as an input stream by the simplified functions that don't take a \c stream argument. The first stream opened with read intent using \c fdevopen() will be assigned to \c stdin. */ #define stdin (__iob[0]) /** Stream that will be used as an output stream by the simplified functions that don't take a \c stream argument. The first stream opened with write intent using \c fdevopen() will be assigned to both, \c stdin, and \c stderr. */ #define stdout (__iob[1]) /** Stream destined for error output. Unless specifically assigned, identical to \c stdout. If \c stderr should point to another stream, the result of another \c fdevopen() must be explicitly assigned to it without closing the previous \c stderr (since this would also close \c stdout). */ #define stderr (__iob[2]) /** \c EOF declares the value that is returned by various standard IO functions in case of an error. Since the AVR platform (currently) doesn't contain an abstraction for actual files, its origin as "end of file" is somewhat meaningless here. */ #define EOF (-1) /** This macro inserts a pointer to user defined data into a FILE stream object. The user data can be useful for tracking state in the put and get functions supplied to the fdevopen() function. */ #define fdev_set_udata(stream, u) do { (stream)->udata = u; } while(0) /** This macro retrieves a pointer to user defined data from a FILE stream object. */ #define fdev_get_udata(stream) ((stream)->udata) #if defined(__DOXYGEN__) /** \brief Setup a user-supplied buffer as an stdio stream This macro takes a user-supplied buffer \c stream, and sets it up as a stream that is valid for stdio operations, similar to one that has been obtained dynamically from fdevopen(). The buffer to setup must be of type FILE. The arguments \c put and \c get are identical to those that need to be passed to fdevopen(). The \c rwflag argument can take one of the values _FDEV_SETUP_READ, _FDEV_SETUP_WRITE, or _FDEV_SETUP_RW, for read, write, or read/write intent, respectively. \note No assignments to the standard streams will be performed by fdev_setup_stream(). If standard streams are to be used, these need to be assigned by the user. See also under \ref stdio_without_malloc "Running stdio without malloc()". */ #define fdev_setup_stream(stream, put, get, rwflag) #else /* !DOXYGEN */ #define fdev_setup_stream(stream, p, g, f) \ do { \ (stream)->put = p; \ (stream)->get = g; \ (stream)->flags = f; \ (stream)->udata = 0; \ } while(0) #endif /* DOXYGEN */ #define _FDEV_SETUP_READ __SRD /**< fdev_setup_stream() with read intent */ #define _FDEV_SETUP_WRITE __SWR /**< fdev_setup_stream() with write intent */ #define _FDEV_SETUP_RW (__SRD|__SWR) /**< fdev_setup_stream() with read/write intent */ /** * Return code for an error condition during device read. * * To be used in the get function of fdevopen(). */ #define _FDEV_ERR (-1) /** * Return code for an end-of-file condition during device read. * * To be used in the get function of fdevopen(). */ #define _FDEV_EOF (-2) #if defined(__DOXYGEN__) /** \brief Initializer for a user-supplied stdio stream This macro acts similar to fdev_setup_stream(), but it is to be used as the initializer of a variable of type FILE. The remaining arguments are to be used as explained in fdev_setup_stream(). */ #define FDEV_SETUP_STREAM(put, get, rwflag) #else /* !DOXYGEN */ #define FDEV_SETUP_STREAM(p, g, f) \ { \ .put = p, \ .get = g, \ .flags = f, \ .udata = 0, \ } #endif /* DOXYGEN */ #ifdef __cplusplus extern "C" { #endif #if !defined(__DOXYGEN__) /* * Doxygen documentation can be found in fdevopen.c. */ extern struct __file * (COUNT(3) __iob)[]; #if defined(__STDIO_FDEVOPEN_COMPAT_12) /* * Declare prototype for the discontinued version of fdevopen() that * has been in use up to avr-libc 1.2.x. The new implementation has * some backwards compatibility with the old version. */ extern FILE *fdevopen(int (*__put)(char), int (*__get)(void), int __opts __attribute__((unused))); #else /* !defined(__STDIO_FDEVOPEN_COMPAT_12) */ /* New prototype for avr-libc 1.4 and above. */ extern FILE *fdevopen(int (*__put)(char, FILE*), int (*__get)(FILE*)); #endif /* defined(__STDIO_FDEVOPEN_COMPAT_12) */ #endif /* not __DOXYGEN__ */ /** This function closes \c stream, and disallows and further IO to and from it. When using fdevopen() to setup the stream, a call to fclose() is needed in order to free the internal resources allocated. If the stream has been set up using fdev_setup_stream() or FDEV_SETUP_STREAM(), use fdev_close() instead. It currently always returns 0 (for success). */ extern int fclose(FILE *__stream); /** This macro frees up any library resources that might be associated with \c stream. It should be called if \c stream is no longer needed, right before the application is going to destroy the \c stream object itself. (Currently, this macro evaluates to nothing, but this might change in future versions of the library.) */ #if defined(__DOXYGEN__) # define fdev_close() #else # define fdev_close() ((void)0) #endif /** \c vfprintf is the central facility of the \c printf family of functions. It outputs values to \c stream under control of a format string passed in \c fmt. The actual values to print are passed as a variable argument list \c ap. \c vfprintf returns the number of characters written to \c stream, or \c EOF in case of an error. Currently, this will only happen if \c stream has not been opened with write intent. The format string is composed of zero or more directives: ordinary characters (not \c %), which are copied unchanged to the output stream; and conversion specifications, each of which results in fetching zero or more subsequent arguments. Each conversion specification is introduced by the \c % character. The arguments must properly correspond (after type promotion) with the conversion specifier. After the \c %, the following appear in sequence: - Zero or more of the following flags:
      • \c # The value should be converted to an "alternate form". For c, d, i, s, and u conversions, this option has no effect. For o conversions, the precision of the number is increased to force the first character of the output string to a zero (except if a zero value is printed with an explicit precision of zero). For x and X conversions, a non-zero result has the string `0x' (or `0X' for X conversions) prepended to it.
      • \c 0 (zero) Zero padding. For all conversions, the converted value is padded on the left with zeros rather than blanks. If a precision is given with a numeric conversion (d, i, o, u, i, x, and X), the 0 flag is ignored.
      • \c - A negative field width flag; the converted value is to be left adjusted on the field boundary. The converted value is padded on the right with blanks, rather than on the left with blanks or zeros. A - overrides a 0 if both are given.
      • ' ' (space) A blank should be left before a positive number produced by a signed conversion (d, or i).
      • \c + A sign must always be placed before a number produced by a signed conversion. A + overrides a space if both are used.
      - An optional decimal digit string specifying a minimum field width. If the converted value has fewer characters than the field width, it will be padded with spaces on the left (or right, if the left-adjust ment flag has been given) to fill out the field width. - An optional precision, in the form of a period . followed by an optional digit string. If the digit string is omitted, the precision is taken as zero. This gives the minimum number of digits to appear for d, i, o, u, x, and X conversions, or the maximum number of characters to be printed from a string for \c s conversions. - An optional \c l length modifier, that specifies that the argument for the d, i, o, u, x, or X conversion is a \c "long int" rather than \c int. - A character that specifies the type of conversion to be applied. The conversion specifiers and their meanings are: - \c diouxX The int (or appropriate variant) argument is converted to signed decimal (d and i), unsigned octal (o), unsigned decimal (u), or unsigned hexadecimal (x and X) notation. The letters "abcdef" are used for x conversions; the letters "ABCDEF" are used for X conversions. The precision, if any, gives the minimum number of digits that must appear; if the converted value requires fewer digits, it is padded on the left with zeros. - \c p The void * argument is taken as an unsigned integer, and converted similarly as a %\#x command would do. - \c c The \c int argument is converted to an \c "unsigned char", and the resulting character is written. - \c s The \c "char *" argument is expected to be a pointer to an array of character type (pointer to a string). Characters from the array are written up to (but not including) a terminating NUL character; if a precision is specified, no more than the number specified are written. If a precision is given, no null character need be present; if the precision is not specified, or is greater than the size of the array, the array must contain a terminating NUL character. - \c % A \c % is written. No argument is converted. The complete conversion specification is "%%". - \c eE The double argument is rounded and converted in the format \c "[-]d.dddedd" where there is one digit before the decimal-point character and the number of digits after it is equal to the precision; if the precision is missing, it is taken as 6; if the precision is zero, no decimal-point character appears. An \e E conversion uses the letter \c 'E' (rather than \c 'e') to introduce the exponent. The exponent always contains two digits; if the value is zero, the exponent is 00. - \c fF The double argument is rounded and converted to decimal notation in the format \c "[-]ddd.ddd", where the number of digits after the decimal-point character is equal to the precision specification. If the precision is missing, it is taken as 6; if the precision is explicitly zero, no decimal-point character appears. If a decimal point appears, at least one digit appears before it. - \c gG The double argument is converted in style \c f or \c e (or \c F or \c E for \c G conversions). The precision specifies the number of significant digits. If the precision is missing, 6 digits are given; if the precision is zero, it is treated as 1. Style \c e is used if the exponent from its conversion is less than -4 or greater than or equal to the precision. Trailing zeros are removed from the fractional part of the result; a decimal point appears only if it is followed by at least one digit. - \c S Similar to the \c s format, except the pointer is expected to point to a program-memory (ROM) string instead of a RAM string. In no case does a non-existent or small field width cause truncation of a numeric field; if the result of a conversion is wider than the field width, the field is expanded to contain the conversion result. Since the full implementation of all the mentioned features becomes fairly large, three different flavours of vfprintf() can be selected using linker options. The default vfprintf() implements all the mentioned functionality except floating point conversions. A minimized version of vfprintf() is available that only implements the very basic integer and string conversion facilities, but none of the additional options that can be specified using conversion flags (these flags are parsed correctly from the format specification, but then simply ignored). This version can be requested using the following \ref gcc_minusW "compiler options": \code -Wl,-u,vfprintf -lprintf_min \endcode If the full functionality including the floating point conversions is required, the following options should be used: \code -Wl,-u,vfprintf -lprintf_flt -lm \endcode \par Limitations: - The specified width and precision can be at most 127. - For floating-point conversions, trailing digits will be lost if a number close to DBL_MAX is converted with a precision > 0. */ extern int vfprintf(FILE * ONE __stream, const char * NTS __fmt, va_list __ap); /** Variant of \c vfprintf() that uses a \c fmt string that resides in program memory. */ extern int vfprintf_P(FILE * ONE __stream, const char * NTS __fmt, va_list __ap); /** The function \c fputc sends the character \c c (though given as type \c int) to \c stream. It returns the character, or \c EOF in case an error occurred. */ extern int fputc(int __c, FILE * ONE __stream); #if !defined(__DOXYGEN__) /* putc() function implementation, required by standard */ extern int putc(int __c, FILE * ONE __stream); /* putchar() function implementation, required by standard */ extern int putchar(int __c); #endif /* not __DOXYGEN__ */ /** The macro \c putc used to be a "fast" macro implementation with a functionality identical to fputc(). For space constraints, in \c avr-libc, it is just an alias for \c fputc. */ #define putc(__c, __stream) fputc(__c, __stream) /** The macro \c putchar sends character \c c to \c stdout. */ #define putchar(__c) fputc(__c, stdout) /** The function \c printf performs formatted output to stream \c stderr. See \c vfprintf() for details. */ extern int printf(const char * NTS __fmt, ...); /** Variant of \c printf() that uses a \c fmt string that resides in program memory. */ extern int printf_P(const char * NTS __fmt, ...); /** The function \c vprintf performs formatted output to stream \c stdout, taking a variable argument list as in vfprintf(). See vfprintf() for details. */ extern int vprintf(const char * NTS __fmt, va_list __ap); /** Variant of \c printf() that sends the formatted characters to string \c s. */ extern int sprintf(char * NTS __s, const char * NTS __fmt, ...); /** Variant of \c sprintf() that uses a \c fmt string that resides in program memory. */ extern int sprintf_P(char * NTS __s, const char * NTS __fmt, ...); /** Like \c sprintf(), but instead of assuming \c s to be of infinite size, no more than \c n characters (including the trailing NUL character) will be converted to \c s. Returns the number of characters that would have been written to \c s if there were enough space. */ extern int snprintf(char * NTS __s, size_t __n, const char * NTS __fmt, ...); /** Variant of \c snprintf() that uses a \c fmt string that resides in program memory. */ extern int snprintf_P(char * NTS __s, size_t __n, const char * NTS __fmt, ...); /** Like \c sprintf() but takes a variable argument list for the arguments. */ extern int vsprintf(char * NTS __s, const char * NTS __fmt, va_list ap); /** Variant of \c vsprintf() that uses a \c fmt string that resides in program memory. */ extern int vsprintf_P(char * NTS __s, const char * NTS __fmt, va_list ap); /** Like \c vsprintf(), but instead of assuming \c s to be of infinite size, no more than \c n characters (including the trailing NUL character) will be converted to \c s. Returns the number of characters that would have been written to \c s if there were enough space. */ extern int vsnprintf(char * NTS __s, size_t __n, const char * NTS __fmt, va_list ap); /** Variant of \c vsnprintf() that uses a \c fmt string that resides in program memory. */ extern int vsnprintf_P(char * NTS __s, size_t __n, const char * NTS __fmt, va_list ap); /** The function \c fprintf performs formatted output to \c stream. See \c vfprintf() for details. */ extern int fprintf(FILE * ONE __stream, const char * NTS __fmt, ...); /** Variant of \c fprintf() that uses a \c fmt string that resides in program memory. */ extern int fprintf_P(FILE * ONE __stream, const char * NTS __fmt, ...); /** Write the string pointed to by \c str to stream \c stream. Returns 0 on success and EOF on error. */ extern int fputs(const char * NTS __str, FILE * ONE __stream); /** Variant of fputs() where \c str resides in program memory. */ extern int fputs_P(const char * NTS __str, FILE * ONE __stream); /** Write the string pointed to by \c str, and a trailing newline character, to \c stdout. */ extern int puts(const char * NTS __str); /** Variant of puts() where \c str resides in program memory. */ extern int puts_P(const char * NTS __str); /** Write \c nmemb objects, \c size bytes each, to \c stream. The first byte of the first object is referenced by \c ptr. Returns the number of objects successfully written, i. e. \c nmemb unless an output error occured. */ extern size_t fwrite(const void *__ptr, size_t __size, size_t __nmemb, FILE * ONE __stream); /** The function \c fgetc reads a character from \c stream. It returns the character, or \c EOF in case end-of-file was encountered or an error occurred. The routines feof() or ferror() must be used to distinguish between both situations. */ extern int fgetc(FILE * ONE __stream); #if !defined(__DOXYGEN__) /* getc() function implementation, required by standard */ extern int getc(FILE * ONE __stream); /* getchar() function implementation, required by standard */ extern int getchar(void); #endif /* not __DOXYGEN__ */ /** The macro \c getc used to be a "fast" macro implementation with a functionality identical to fgetc(). For space constraints, in \c avr-libc, it is just an alias for \c fgetc. */ #define getc(__stream) fgetc(__stream) /** The macro \c getchar reads a character from \c stdin. Return values and error handling is identical to fgetc(). */ #define getchar() fgetc(stdin) /** The ungetc() function pushes the character \c c (converted to an unsigned char) back onto the input stream pointed to by \c stream. The pushed-back character will be returned by a subsequent read on the stream. Currently, only a single character can be pushed back onto the stream. The ungetc() function returns the character pushed back after the conversion, or \c EOF if the operation fails. If the value of the argument \c c character equals \c EOF, the operation will fail and the stream will remain unchanged. */ extern int ungetc(int __c, FILE * ONE __stream); /** Read at most size - 1 bytes from \c stream, until a newline character was encountered, and store the characters in the buffer pointed to by \c str. Unless an error was encountered while reading, the string will then be terminated with a \c NUL character. If an error was encountered, the function returns NULL and sets the error flag of \c stream, which can be tested using ferror(). Otherwise, a pointer to the string will be returned. */ extern char *fgets(char * NTS __str, int __size, FILE * ONE __stream); /** Similar to fgets() except that it will operate on stream \c stdin, and the trailing newline (if any) will not be stored in the string. It is the caller's responsibility to provide enough storage to hold the characters read. */ extern char *gets(char * NTS __str); /** Read \c nmemb objects, \c size bytes each, from \c stream, to the buffer pointed to by \c ptr. Returns the number of objects successfully read, i. e. \c nmemb unless an input error occured or end-of-file was encountered. feof() and ferror() must be used to distinguish between these two conditions. */ extern size_t fread(void *__ptr, size_t __size, size_t __nmemb, FILE * ONE __stream); /** Clear the error and end-of-file flags of \c stream. */ extern void clearerr(FILE * ONE __stream); #if !defined(__DOXYGEN__) /* fast inlined version of clearerr() */ #define clearerror(s) do { (s)->flags &= ~(__SERR | __SEOF); } while(0) #endif /* !defined(__DOXYGEN__) */ /** Test the end-of-file flag of \c stream. This flag can only be cleared by a call to clearerr(). */ extern int feof(FILE * ONE __stream); #if !defined(__DOXYGEN__) /* fast inlined version of feof() */ #define feof(s) ((s)->flags & __SEOF) #endif /* !defined(__DOXYGEN__) */ /** Test the error flag of \c stream. This flag can only be cleared by a call to clearerr(). */ extern int ferror(FILE * ONE __stream); #if !defined(__DOXYGEN__) /* fast inlined version of ferror() */ #define ferror(s) ((s)->flags & __SERR) #endif /* !defined(__DOXYGEN__) */ /** Formatted input. This function is the heart of the \c scanf family of functions. Characters are read from \c stream and processed in a way described by \c fmt. Conversion results will be assigned to the parameters passed via \c ap. The format string \c fmt is scanned for conversion specifications. Anything that doesn't comprise a conversion specification is taken as text that is matched literally against the input. White space in the format string will match any white space in the data (including none), all other characters match only itself. Processing is aborted as soon as the data and format string no longer match, or there is an error or end-of-file condition on \c stream. Most conversions skip leading white space before starting the actual conversion. Conversions are introduced with the character \b %. Possible options can follow the \b %: - a \c * indicating that the conversion should be performed but the conversion result is to be discarded; no parameters will be processed from \c ap, - the character \c h indicating that the argument is a pointer to short int (rather than int), - the character \c l indicating that the argument is a pointer to long int (rather than int, for integer type conversions), or a pointer to \c double (for floating point conversions). In addition, a maximal field width may be specified as a nonzero positive decimal integer, which will restrict the conversion to at most this many characters from the input stream. This field width is limited to at most 127 characters which is also the default value (except for the %c conversion that defaults to 1). The following conversion flags are supported: - \c % Matches a literal \c % character. This is not a conversion. - \c d Matches an optionally signed decimal integer; the next pointer must be a pointer to \c int. - \c i Matches an optionally signed integer; the next pointer must be a pointer to \c int. The integer is read in base 16 if it begins with \b 0x or \b 0X, in base 8 if it begins with \b 0, and in base 10 otherwise. Only characters that correspond to the base are used. - \c o Matches an octal integer; the next pointer must be a pointer to unsigned int. - \c u Matches an optionally signed decimal integer; the next pointer must be a pointer to unsigned int. - \c x Matches an optionally signed hexadecimal integer; the next pointer must be a pointer to unsigned int. - \c f Matches an optionally signed floating-point number; the next pointer must be a pointer to \c float. - e, g, E, G Equivalent to \c f. - \c s Matches a sequence of non-white-space characters; the next pointer must be a pointer to \c char, and the array must be large enough to accept all the sequence and the terminating \c NUL character. The input string stops at white space or at the maximum field width, whichever occurs first. - \c c Matches a sequence of width count characters (default 1); the next pointer must be a pointer to \c char, and there must be enough room for all the characters (no terminating \c NUL is added). The usual skip of leading white space is suppressed. To skip white space first, use an explicit space in the format. - \c [ Matches a nonempty sequence of characters from the specified set of accepted characters; the next pointer must be a pointer to \c char, and there must be enough room for all the characters in the string, plus a terminating \c NUL character. The usual skip of leading white space is suppressed. The string is to be made up of characters in (or not in) a particular set; the set is defined by the characters between the open bracket \c [ character and a close bracket \c ] character. The set excludes those characters if the first character after the open bracket is a circumflex \c ^. To include a close bracket in the set, make it the first character after the open bracket or the circumflex; any other position will end the set. The hyphen character \c - is also special; when placed between two other characters, it adds all intervening characters to the set. To include a hyphen, make it the last character before the final close bracket. For instance, [^]0-9-] means the set of everything except close bracket, zero through nine, and hyphen. The string ends with the appearance of a character not in the (or, with a circumflex, in) set or when the field width runs out. - \c p Matches a pointer value (as printed by %p in printf()); the next pointer must be a pointer to \c void. - \c n Nothing is expected; instead, the number of characters consumed thus far from the input is stored through the next pointer, which must be a pointer to \c int. This is not a conversion, although it can be suppressed with the \c * flag. These functions return the number of input items assigned, which can be fewer than provided for, or even zero, in the event of a matching failure. Zero indicates that, while there was input available, no conversions were assigned; typically this is due to an invalid input character, such as an alphabetic character for a %d conversion. The value \c EOF is returned if an input failure occurs before any conversion such as an end-of-file occurs. If an error or end-of-file occurs after conversion has begun, the number of conversions which were successfully completed is returned. By default, all the conversions described above are available except the floating-point conversions, and the \%[ conversion. These conversions will be available in the extended version provided by the library \c libscanf_flt.a. Note that either of these conversions requires the availability of a buffer that needs to be obtained at run-time using malloc(). If this buffer cannot be obtained, the operation is aborted, returning the value \c EOF. To link a program against the extended version, use the following compiler flags in the link stage: \code -Wl,-u,vfscanf -lscanf_flt -lm \endcode A third version is available for environments that are tight on space. This version is provided in the library \c libscanf_min.a, and can be requested using the following options in the link stage: \code -Wl,-u,vfscanf -lscanf_min -lm \endcode In addition to the restrictions of the standard version, this version implements no field width specification, no conversion assignment suppression flag (\c *), no %n specification, and no general format character matching at all. All characters in \c fmt that do not comprise a conversion specification will simply be ignored, including white space (that is normally used to consume \e any amount of white space in the input stream). However, the usual skip of initial white space in the formats that support it is implemented. */ extern int vfscanf(FILE * ONE __stream, const char * NTS __fmt, va_list __ap); /** Variant of vfscanf() using a \c fmt string in program memory. */ extern int vfscanf_P(FILE * ONE __stream, const char * NTS __fmt, va_list __ap); /** The function \c fscanf performs formatted input, reading the input data from \c stream. See vfscanf() for details. */ extern int fscanf(FILE * ONE __stream, const char * NTS __fmt, ...); /** Variant of fscanf() using a \c fmt string in program memory. */ extern int fscanf_P(FILE * ONE __stream, const char * NTS __fmt, ...); /** The function \c scanf performs formatted input from stream \c stdin. See vfscanf() for details. */ extern int scanf(const char * NTS __fmt, ...); /** Variant of scanf() where \c fmt resides in program memory. */ extern int scanf_P(const char * NTS __fmt, ...); /** The function \c vscanf performs formatted input from stream \c stdin, taking a variable argument list as in vfscanf(). See vfscanf() for details. */ extern int vscanf(const char * NTS __fmt, va_list __ap); /** The function \c sscanf performs formatted input, reading the input data from the buffer pointed to by \c buf. See vfscanf() for details. */ extern int sscanf(const char * NTS __buf, const char * NTS __fmt, ...); /** Variant of sscanf() using a \c fmt string in program memory. */ extern int sscanf_P(const char * NTS __buf, const char * NTS __fmt, ...); #if defined(__DOXYGEN__) /** Flush \c stream. This is a null operation provided for source-code compatibility only, as the standard IO implementation currently does not perform any buffering. */ extern int fflush(FILE * ONE stream); #else static __inline__ int fflush(FILE * ONE stream __attribute__((unused))) { return 0; } #endif #ifdef __cplusplus } #endif /*@}*/ /* * The following constants are currently not used by avr-libc's * stdio subsystem. They are defined here since the gcc build * environment expects them to be here. */ #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #endif /* __ASSEMBLER */ #endif /* _STDLIB_H_ */ tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/printf/printf.h000066400000000000000000000043711207233610700232440ustar00rootroot00000000000000/* * Copyright (c) 2006 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.2 $ * @date $Date: 2010-06-29 22:07:51 $ */ #ifndef PRINTF_H #define PRINTF_H #ifndef PRINTF_BUFFER_SIZE #define PRINTF_BUFFER_SIZE 255 #endif #if PRINTF_BUFFER_SIZE > 255 #define PrintfQueueC BigQueueC #define PrintfQueue BigQueue #else #define PrintfQueueC QueueC #define PrintfQueue Queue #endif #ifdef _H_msp430hardware_h #include #endif #ifdef _H_atmega128hardware_H #include "avr_stdio.h" #endif #include "message.h" typedef nx_struct printf_msg { nx_uint8_t buffer[TOSH_DATA_LENGTH]; } printf_msg_t; enum { AM_PRINTF_MSG = 100, }; int printfflush(); #endif //PRINTF_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/serial/000077500000000000000000000000001207233610700215415ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/serial/SerialActiveMessageC.nc000066400000000000000000000053371207233610700260560ustar00rootroot00000000000000//$Id: SerialActiveMessageC.nc,v 1.2 2010-06-29 22:07:51 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Sending active messages over the serial port. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 * */ #include "Serial.h" configuration SerialActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; } uses interface Leds; } implementation { components new SerialActiveMessageP() as AM, SerialDispatcherC; components SerialPacketInfoActiveMessageP as Info, MainC; MainC.SoftwareInit -> SerialDispatcherC; Leds = SerialDispatcherC; SplitControl = SerialDispatcherC; AMSend = AM; Receive = AM.Receive; ReceiveDefault = AM.ReceiveDefault; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; AM.SubSend -> SerialDispatcherC.Send[TOS_SERIAL_ACTIVE_MESSAGE_ID]; AM.SubReceive -> SerialDispatcherC.Receive[TOS_SERIAL_ACTIVE_MESSAGE_ID]; SerialDispatcherC.SerialPacketInfo[TOS_SERIAL_ACTIVE_MESSAGE_ID] -> Info; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/serial/SerialActiveMessageP.nc000066400000000000000000000142421207233610700260660ustar00rootroot00000000000000//$Id: SerialActiveMessageP.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Sending active messages over the serial port. * * @author Philip Levis * @author Ben Greenstein * @date August 7 2005 * */ #include generic module SerialActiveMessageP () { provides { interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface AMPacket; interface Packet; interface PacketAcknowledgements; } uses { interface Send as SubSend; interface Receive as SubReceive; } } implementation { serial_header_t* ONE getHeader(message_t* ONE msg) { return TCAST(serial_header_t* ONE, (uint8_t*)msg + offsetof(message_t, data) - sizeof(serial_header_t)); } serial_metadata_t* getMetadata(message_t* msg) { return (serial_metadata_t*)(msg->metadata); } command error_t AMSend.send[am_id_t id](am_addr_t dest, message_t* msg, uint8_t len) { serial_header_t* header = getHeader(msg); header->dest = dest; // Do not set the source address or group, as doing so // prevents transparent bridging. Need a better long-term // solution for this. //header->src = call AMPacket.address(); //header->group = TOS_AM_GROUP; header->type = id; header->length = len; return call SubSend.send(msg, len); } command error_t AMSend.cancel[am_id_t id](message_t* msg) { return call SubSend.cancel(msg); } command uint8_t AMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } command void* AMSend.getPayload[am_id_t id](message_t* m, uint8_t len) { return call Packet.getPayload(m, len); } event void SubSend.sendDone(message_t* msg, error_t result) { signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); } default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t result) { return; } default event message_t* Receive.receive[uint8_t id](message_t* msg, void* payload, uint8_t len) { return signal ReceiveDefault.receive[id](msg, payload, len); } default event message_t* ReceiveDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { return signal Receive.receive[call AMPacket.type(msg)](msg, msg->data, len); } command void Packet.clear(message_t* msg) { memset(getHeader(msg), 0, sizeof(serial_header_t)); return; } command uint8_t Packet.payloadLength(message_t* msg) { serial_header_t* header = getHeader(msg); return header->length; } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { getHeader(msg)->length = len; } command uint8_t Packet.maxPayloadLength() { return TOSH_DATA_LENGTH; } command void* Packet.getPayload(message_t* msg, uint8_t len) { if (len > call Packet.maxPayloadLength()) { return NULL; } else { return (void * COUNT_NOK(len))msg->data; } } command am_addr_t AMPacket.address() { return 0; } command am_addr_t AMPacket.destination(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->dest; } command am_addr_t AMPacket.source(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->src; } command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { serial_header_t* header = getHeader(amsg); header->dest = addr; } command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { serial_header_t* header = getHeader(amsg); header->src = addr; } command bool AMPacket.isForMe(message_t* amsg) { return TRUE; } command am_id_t AMPacket.type(message_t* amsg) { serial_header_t* header = getHeader(amsg); return header->type; } command void AMPacket.setType(message_t* amsg, am_id_t type) { serial_header_t* header = getHeader(amsg); header->type = type; } async command error_t PacketAcknowledgements.requestAck( message_t* msg ) { return FAIL; } async command error_t PacketAcknowledgements.noAck( message_t* msg ) { return SUCCESS; } command void AMPacket.setGroup(message_t* msg, am_group_t group) { serial_header_t* header = getHeader(msg); header->group = group; } command am_group_t AMPacket.group(message_t* msg) { serial_header_t* header = getHeader(msg); return header->group; } command am_group_t AMPacket.localGroup() { return TOS_AM_GROUP; } async command bool PacketAcknowledgements.wasAcked(message_t* msg) { return FALSE; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/000077500000000000000000000000001207233610700215655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/BigCrc.nc000066400000000000000000000002371207233610700232420ustar00rootroot00000000000000interface BigCrc { command error_t computeCrc(void* buf, uint16_t len); event void computeCrcDone(void* buf, uint16_t len, uint16_t crc, error_t error); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/BigCrcC.nc000066400000000000000000000002451207233610700233440ustar00rootroot00000000000000configuration BigCrcC { provides interface BigCrc; } implementation { components CrcC, BigCrcP; BigCrc = BigCrcP; BigCrcP.Crc -> CrcC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/BigCrcP.nc000066400000000000000000000014401207233610700233570ustar00rootroot00000000000000module BigCrcP { provides interface BigCrc; uses interface Crc; } implementation { bool isBusy = FALSE; void* inbuf; uint16_t inlen; uint16_t pos; uint16_t computedCrc; task void computeCrc() { uint8_t len = 0xFF; if (inlen < 0xFF) { len = inlen; } computedCrc = call Crc.seededCrc16(computedCrc, inbuf + pos, len); inlen -= len; pos += len; if (inlen > 0) { post computeCrc(); } else { isBusy = FALSE; signal BigCrc.computeCrcDone(inbuf, pos + 1, computedCrc, SUCCESS); } } command error_t BigCrc.computeCrc(void* buf, uint16_t len) { if (isBusy == TRUE) { return EBUSY; } inbuf = buf; inlen = len; computedCrc = pos = 0; post computeCrc(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/DynamicLoader.h000077500000000000000000000043611207233610700244600ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #ifndef DYNAMICLOADER_H #define DYNAMICLOADER_H //#defines for setting up which set of apis the dynamic loader //should recognize. This should eventually move into a file that //gets #included in here, but for now we set the defaults here. #ifdef TOSTHREAD_TENET #define ApiForDynamicLoaderC TosThreadTenetApiC #define SLCS_TYPES_FILE "tosthread_tenet_slcs_types.h" #else #define ApiForDynamicLoaderC TosThreadApiC #define SLCS_TYPES_FILE "tosthread_slcs_types.h" #endif #define TOSTHREAD_DYNAMIC_LOADER #ifndef DISABLE_LOADER_FLASH #include "StorageVolumes.h" #endif enum { READSOURCE_MEMORY = 0xFF, }; #endif tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/DynamicLoader.nc000077500000000000000000000036501207233610700246310ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #include "thread.h" interface DynamicLoader { command error_t loadFromFlash(uint8_t volumeId); event void loadFromFlashDone(uint8_t volumeId, tosthread_t id, error_t error); command error_t loadFromMemory(void *addr); event void loadFromMemoryDone(void *addr, tosthread_t id, error_t error); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/DynamicLoaderC.nc000077500000000000000000000050741207233610700247360ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #include "DynamicLoader.h" configuration DynamicLoaderC { provides interface DynamicLoader; } implementation { components MainC, DynamicLoaderP, LedsC, NoLedsC, LoadSourceMapC, DynamicThreadC, ReferenceCounterC, TinyThreadSchedulerC; DynamicLoader = DynamicLoaderP; DynamicLoaderP <- MainC.SoftwareInit; DynamicLoaderP.Leds -> LedsC; DynamicLoaderP.ImageRead -> LoadSourceMapC; DynamicLoaderP.DynamicThread -> DynamicThreadC; DynamicLoaderP.ReferenceCounter -> ReferenceCounterC; DynamicLoaderP.ThreadNotification -> DynamicThreadC; DynamicLoaderP.ThreadScheduler -> TinyThreadSchedulerC; components ApiForDynamicLoaderC; components PMManagerC; DynamicLoaderP.PMManager -> PMManagerC; #ifndef DISABLE_LOADER_USERBUTTON components UserButtonC; DynamicLoaderP.UserButton -> UserButtonC; #endif } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/DynamicLoaderP.nc000077500000000000000000000374041207233610700247550ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang * @author Razvan Musaloiu-E. */ #include SLCS_TYPES_FILE #include "thread.h" module DynamicLoaderP { provides { interface Init; interface DynamicLoader; } uses { interface Leds; interface BlockRead as ImageRead[uint8_t id]; interface DynamicThread; interface ThreadNotification[uint8_t id]; interface ThreadScheduler; interface ReferenceCounter; interface PMManager; #ifndef DISABLE_LOADER_USERBUTTON interface UserButton; #endif } } implementation { uint8_t *code; // Points to first byte of the program code in the internal flash uint8_t *tablesMemory; void *gVarMemory; struct prog_desc prog_desc; init_block_t *proc; uint16_t codePtr; // Records what code has been copied to the internal flash uint16_t nextAddr; uint8_t *nextTask_chain; // Used to update the next patching address in a chain uint8_t readSource; // Loads from flash or memory uint16_t readSourceOffset; // If loading from memory, then this is effectively the passed-in memory address error_t retError = FAIL; tosthread_t handler; uint16_t threadCodeSizes[TOSTHREAD_MAX_NUM_THREADS]; uint16_t codeFirstAddrs[TOSTHREAD_MAX_NUM_THREADS]; async event void ThreadNotification.justCreated[uint8_t id]() { thread_t *t = call ThreadScheduler.threadInfo(id); if(t->init_block != NULL) { call ReferenceCounter.increment(&(t->init_block->thread_counter)); } } async event void ThreadNotification.aboutToDestroy[uint8_t id]() { thread_t *t = call ThreadScheduler.threadInfo(id); if(t->init_block != NULL) { call ReferenceCounter.decrement(&(t->init_block->thread_counter)); } } task void loadDoneTask() { if (retError != SUCCESS) handler = TOSTHREAD_INVALID_THREAD_ID; if (readSource == READSOURCE_MEMORY) { signal DynamicLoader.loadFromMemoryDone(((void *)readSourceOffset), handler, retError); } else { signal DynamicLoader.loadFromFlashDone(readSource, handler, retError); } } void initProgDesc() { prog_desc.main_addr = 0; prog_desc.alloc_count = 0; prog_desc.g_reloc_count = 0; prog_desc.l_reloc_count = 0; prog_desc.code_count = 0; prog_desc.patch_table_count = 0; prog_desc.loading_stage = 0; codePtr = 0; } void errorHandler() { call Leds.set(7); if (tablesMemory != NULL) { free(tablesMemory); tablesMemory = NULL; } if (gVarMemory != NULL) { free(gVarMemory); gVarMemory = NULL; } if (proc != NULL) { free(proc); proc = NULL; } initProgDesc(); retError = FAIL; post loadDoneTask(); } void run_proc(void *arg) { init_block_t* curProc = arg; thread_t* t = call ThreadScheduler.currentThreadInfo(); t->init_block = curProc; (*(curProc->init_ptr))(curProc->init_arg); call ReferenceCounter.waitOnValue(&(curProc->thread_counter), 0); call PMManager.release(codeFirstAddrs[t->id], threadCodeSizes[t->id]); codeFirstAddrs[t->id] = 0; threadCodeSizes[t->id] = 0; if (curProc->globals != NULL) { free(curProc->globals); } free(curProc); } task void start_prog() { free(tablesMemory); proc = malloc(sizeof(init_block_t)); proc->globals = gVarMemory; proc->init_ptr = (void *)((uint16_t)code + prog_desc.main_addr); proc->init_arg = NULL; call ReferenceCounter.init( &(proc->thread_counter) ); if (call DynamicThread.create(&handler, run_proc, proc, 200) == SUCCESS) { codeFirstAddrs[handler] = (uint16_t)code; threadCodeSizes[handler] = prog_desc.code_count; retError = SUCCESS; post loadDoneTask(); } else { retError = FAIL; post loadDoneTask(); if (proc->globals != NULL) { free(proc->globals); } free(proc); } initProgDesc(); } // Gets write access to the internal flash void eeprom_w() { FCTL2 = FWKEY + FSSEL1 + FN2; // selects SMCLK and divides it by 4 FCTL3 = FWKEY; // enables the writing/erasing by clearing the LOCK bit FCTL1 = FWKEY + WRT; // enables the writing } // Gets read-only access to the internal flash void eeprom_r() { FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; // disabling the writing/erasing } // Calculates where should the code be placed in the internal flash /* uint16_t eeprom_code_addr() { uint16_t addr; addr = (((prog_desc.code_count - 1) / 512) + 1) * 512; // Spaces needed for the code addr = 0xFFFF - 512 - addr + 1; // The 1 is to align the code return addr; } */ // Loads program image meta data void loader_metaData() { prog_desc.patch_table_count = prog_desc.alloc_count + prog_desc.g_reloc_count + prog_desc.l_reloc_count; prog_desc.code_offset = sizeof(prog_desc.main_addr) + sizeof(prog_desc.alloc_count) + sizeof(prog_desc.alloc_size) + sizeof(prog_desc.g_reloc_count) + sizeof(prog_desc.l_reloc_count) + sizeof(prog_desc.datasec_count) + sizeof(prog_desc.code_count) + (prog_desc.patch_table_count * 4) + (prog_desc.datasec_count * 6); if (prog_desc.patch_table_count > 0 || prog_desc.datasec_count > 0) { if ((prog_desc.patch_table_count * 4) > (prog_desc.datasec_count * 6)) { tablesMemory = malloc(prog_desc.patch_table_count * 4); } else { tablesMemory = malloc(prog_desc.datasec_count * 6); } } else { tablesMemory = NULL; } } // Prepares the patch table before patching addresses in the binary code void loader_patch_table() { uint16_t i, tempUInt16 = 0; // Find out the total space global variables need, and malloc /* for (i = 0; i < (prog_desc.alloc_count * 4); i+=4) { tempUInt16 += *((uint16_t *)&tablesMemory[i]); *((uint16_t *)&tablesMemory[i]) = tempUInt16 - *((uint16_t *)&tablesMemory[i]); } */ if (prog_desc.alloc_size > 0) { gVarMemory = malloc(prog_desc.alloc_size); memset(gVarMemory, 0, prog_desc.alloc_size); } else { gVarMemory = NULL; } // Some "real" addresses need offsets added. For example, local relocation table entries need // the starting code address for (i = 0; i < (prog_desc.patch_table_count * 4); i+=4) { if (i < (prog_desc.alloc_count * 4)) { tempUInt16 = (uint16_t)gVarMemory; // Allocation table needs memory's offset } else if (i < ((prog_desc.alloc_count + prog_desc.g_reloc_count) * 4)) { tempUInt16 = 0; // Global relocation table doesn't need anything } else { tempUInt16 = (uint16_t)code; // Local relocation table needs code's offset } *((uint16_t *)&(tablesMemory[i])) = *((uint16_t *)&(tablesMemory[i])) + tempUInt16; // Writes the real address } // Converts function IDs in global relocation table to real addresses for (i = (prog_desc.alloc_count * 4); i < ((prog_desc.alloc_count + prog_desc.g_reloc_count) * 4); i+=4) { tempUInt16 = *((uint16_t *)&tablesMemory[i]); // Gets function ID tempUInt16 = (uint16_t)fun[tempUInt16].addr; // Gets the real address of the function ID *((uint16_t *)&tablesMemory[i]) = tempUInt16; // Writes the real address } } void loader_addr_1() { uint16_t i, laddr = 0, raddr = 0; // Resets before start nextTask_chain = 0x0; nextAddr = 0; // Gets the next task by searching for the lowest next patching address raddr = 0xFFFF; // Temp variable to store the minimum patching address so far laddr = 0; // Temp variable to store the current patching address for (i = 0; i < (prog_desc.patch_table_count * 4); i+=4) { laddr = *((uint16_t *)&tablesMemory[i + 2]); if (((uint16_t)nextTask_chain == 0x0 && laddr != 0xFFFF) || raddr > laddr) { nextTask_chain = &(tablesMemory[i]); raddr = laddr; } } if (nextTask_chain != 0x0) { // Gets the next patching address in the chain from the flash raddr = *((uint16_t *)&nextTask_chain[2]); call ImageRead.read[readSource](readSourceOffset + prog_desc.code_offset + raddr, &nextAddr, 2); } else { // Copies the rest of the binary code call ImageRead.read[readSource](readSourceOffset + prog_desc.code_offset + codePtr, &(code[codePtr]), prog_desc.code_count - codePtr); prog_desc.loading_stage++; } } // Patches the part of binary code that needs "real" addresses void loader_addr_2() { uint16_t laddr; laddr = *((uint16_t *)&nextTask_chain[2]); // Gets the current patching address // Updates the chain with the next patching address if (nextAddr == 0x0000) { nextAddr = 0xFFFF; // End of chain, marks it with a big number } *((uint16_t *)&nextTask_chain[2]) = nextAddr; // Patches address in the binary code *((uint16_t *)&code[laddr]) = *((uint16_t *)&nextTask_chain[0]); // Copies the binary code between the last patching address and the current patching address call ImageRead.read[readSource](readSourceOffset + prog_desc.code_offset + codePtr, &(code[codePtr]), laddr - codePtr); codePtr = laddr + 2; // Notes up to what location in the binary code we have copied } void loader_datasec() { uint16_t i, j; for (i = 0; i < (prog_desc.datasec_count * 6); i+=6) { uint16_t destAddr = *((uint16_t *)&(tablesMemory[i])) + (uint16_t)gVarMemory; // Writes the real address uint16_t srcAddr = *((uint16_t *)&(tablesMemory[i + 2])) + (uint16_t)code; // Writes the real address uint16_t size = *((uint16_t *)&(tablesMemory[i + 4])); for (j = 0; j < size; j++) { ((uint8_t *)((void *)(destAddr + j)))[0] = ((uint8_t *)((void *)(srcAddr + j)))[0]; //*((uint8_t *)&code[destAddr + j]) = *((uint8_t *)&code[srcAddr + j]); } } } void loadProgram() { error_t error = SUCCESS; switch (prog_desc.loading_stage) { case 0: // Loads meta data to memory array error = call ImageRead.read[readSource](readSourceOffset + 0, &prog_desc, 7 * 2); if (error == SUCCESS) { prog_desc.loading_stage++; // Moves to next loading phase } else { errorHandler(); } break; case 1: loader_metaData(); // Gets meta data code = (void *) call PMManager.request(prog_desc.code_count); // Gets the location of where the code will be copied to if ((uint16_t)code != 0xFFFF) { // Loads patch table to memory array error = call ImageRead.read[readSource](readSourceOffset + 7 * 2, tablesMemory, prog_desc.patch_table_count * 4); if (error == SUCCESS) { prog_desc.loading_stage++; // Moves to next loading phase } else { errorHandler(); } } else { errorHandler(); } break; case 2: loader_patch_table(); eeprom_w(); // Gets write-access to internal flash prog_desc.loading_stage++; // Moves to next loading phase case 3: loader_addr_1(); break; case 4: eeprom_r(); // Locks the internal flash back error = call ImageRead.read[readSource](readSourceOffset + 7 * 2 + prog_desc.patch_table_count * 4, tablesMemory, prog_desc.datasec_count * 6); if (error == SUCCESS) { prog_desc.loading_stage++; // Moves to next loading phase } else { errorHandler(); } break; case 5: loader_datasec(); prog_desc.loading_stage++; case 6: post start_prog(); break; } } command error_t Init.init() { int i; for (i = 0; i < TOSTHREAD_MAX_NUM_THREADS; i++) { threadCodeSizes[i] = 0; codeFirstAddrs[i] = 0; } initProgDesc(); return SUCCESS; } task void taskLoadProgram() { loadProgram(); } error_t start_load(uint8_t in_readSource, uint16_t in_readSourceOffset) { if (prog_desc.loading_stage == 0) { uint16_t i; call Leds.set(7); for (i = 0; i < 2000; i++) { } call Leds.set(0); readSource = in_readSource; readSourceOffset = in_readSourceOffset; post taskLoadProgram(); // Start Loading return SUCCESS; } return EBUSY; } command error_t DynamicLoader.loadFromFlash(uint8_t volumeId) { return start_load(volumeId, 0); } command error_t DynamicLoader.loadFromMemory(void *addr) { return start_load(READSOURCE_MEMORY, (uint16_t)addr); } event void ImageRead.readDone[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { if (error == SUCCESS) { if (buf == &nextAddr) { loader_addr_2(); } else { post taskLoadProgram(); } } else { errorHandler(); } } #ifndef DISABLE_LOADER_USERBUTTON event void UserButton.fired() { call DynamicLoader.loadFromFlash(VOLUME_MICROEXEIMAGE); } #endif event void ImageRead.computeCrcDone[uint8_t id](storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) {} default command error_t ImageRead.read[uint8_t id](storage_addr_t addr, void *buf, storage_len_t len) { return FAIL; } default event void DynamicLoader.loadFromFlashDone(uint8_t volumeId, tosthread_t id, error_t error) {} default event void DynamicLoader.loadFromMemoryDone(void *addr, tosthread_t id, error_t error) {} } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/LoadSourceMapC.nc000077500000000000000000000040341207233610700247140ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ configuration LoadSourceMapC { provides interface BlockRead[uint8_t id]; } implementation { components LoadSourceMapP, #ifdef DISABLE_LOADER_FLASH NullVolumeMapC as VolumeMapC, #else VolumeMapC, #endif MemoryStorageC; BlockRead = LoadSourceMapP; LoadSourceMapP.SubBlockRead -> VolumeMapC; LoadSourceMapP.SubMemoryRead -> MemoryStorageC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/LoadSourceMapP.nc000077500000000000000000000101431207233610700247270ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #include "DynamicLoader.h" module LoadSourceMapP { provides interface BlockRead[uint8_t id]; uses { interface BlockRead as SubBlockRead[uint8_t id]; interface BlockRead as SubMemoryRead; } } implementation { event void SubMemoryRead.readDone(storage_addr_t addr, void* buf, storage_len_t len, error_t error) { signal BlockRead.readDone[READSOURCE_MEMORY](addr, buf, len, error); } event void SubBlockRead.readDone[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { signal BlockRead.readDone[id](addr, buf, len, error); } command error_t BlockRead.read[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len) { error_t error = FAIL; if (id == READSOURCE_MEMORY) { error = call SubMemoryRead.read(addr, buf, len); } else { error = call SubBlockRead.read[id](addr, buf, len); } return error; } event void SubMemoryRead.computeCrcDone(storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) { signal BlockRead.computeCrcDone[READSOURCE_MEMORY](addr, len, crc, error); } event void SubBlockRead.computeCrcDone[uint8_t id](storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) { signal BlockRead.computeCrcDone[id](addr, len, crc, error); } command error_t BlockRead.computeCrc[uint8_t id](storage_addr_t addr, storage_len_t len, uint16_t crc) { error_t error = FAIL; if (id == READSOURCE_MEMORY) { error = call SubMemoryRead.computeCrc(addr, len, crc); } else { error = call SubBlockRead.computeCrc[id](addr, len, crc); } return error; } command storage_len_t BlockRead.getSize[uint8_t id]() { storage_len_t len; if (id == READSOURCE_MEMORY) { len = call SubMemoryRead.getSize(); } else { len = call SubBlockRead.getSize[id](); } return len; } default command error_t SubBlockRead.read[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t SubBlockRead.computeCrc[uint8_t id](storage_addr_t addr, storage_len_t len, uint16_t crc) { return FAIL; } default command storage_len_t SubBlockRead.getSize[uint8_t id]() { return 0; } default event void BlockRead.readDone[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} default event void BlockRead.computeCrcDone[uint8_t id](storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) {} } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/MemoryStorageC.nc000077500000000000000000000035011207233610700250110ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ configuration MemoryStorageC { provides interface BlockRead; } implementation { components MemoryStorageP, CrcC; BlockRead = MemoryStorageP; MemoryStorageP.Crc -> CrcC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/MemoryStorageP.nc000077500000000000000000000024521207233610700250320ustar00rootroot00000000000000module MemoryStorageP { provides interface BlockRead; uses interface Crc; } implementation { storage_addr_t retAddr; void *retBuf; storage_len_t retLen; uint16_t retCrc; task void taskReadDone() { signal BlockRead.readDone(retAddr, retBuf, retLen, SUCCESS); } command error_t BlockRead.read(storage_addr_t addr, void* buf, storage_len_t len) { storage_len_t i; uint8_t *from = (uint8_t *)((void *)((uint16_t)addr)); for (i = 0; i < len; i++) { ((uint8_t *)buf)[i] = from[i]; } retAddr = addr; retBuf = buf; retLen = len; post taskReadDone(); return SUCCESS; } task void taskCrcDone() { signal BlockRead.computeCrcDone(retAddr, retLen, retCrc, SUCCESS); } command error_t BlockRead.computeCrc(storage_addr_t addr, storage_len_t len, uint16_t crc) { retCrc = call Crc.seededCrc16(crc, (void *)addr, len); retAddr = addr; retLen = len; post taskCrcDone(); return SUCCESS; } command storage_len_t BlockRead.getSize() { return 0; // Not sure what to do } default event void BlockRead.readDone(storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} default event void BlockRead.computeCrcDone(storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) {} } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/NullVolumeMapC.nc000077500000000000000000000007371207233610700247640ustar00rootroot00000000000000 /** * @author Jeongyeup Paek */ #include "DynamicLoader.h" module NullVolumeMapC { provides interface BlockRead[uint8_t id]; } implementation { command error_t BlockRead.read[uint8_t id](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } command error_t BlockRead.computeCrc[uint8_t id](storage_addr_t addr, storage_len_t len, uint16_t crc) { return FAIL; } command storage_len_t BlockRead.getSize[uint8_t id]() { return 0; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/PMManager.nc000066400000000000000000000033721207233610700237230ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ interface PMManager { command uint16_t request(uint16_t size); command void release(uint16_t startingAddr, uint16_t size); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/PMManagerC.nc000066400000000000000000000036661207233610700240340ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ configuration PMManagerC { provides interface PMManager; } implementation { components MainC, PMManagerP, LedsC, BitArrayUtilsC; PMManager = PMManagerP; MainC.SoftwareInit -> PMManagerP; PMManagerP.BitArrayUtils -> BitArrayUtilsC; PMManagerP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/PMManagerP.nc000066400000000000000000000121441207233610700240400ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ module PMManagerP { provides { interface Init; interface PMManager; } uses { interface BitArrayUtils; interface Leds; } } implementation { uint16_t HOST_ROM_SIZE = 0; // Set by tos-set-symbol uint16_t SEGMENT_SIZE = 512; // For telosb, the internal flash segment size is 512 bytes uint16_t FLASH_ROM_START_ADDR = 0x4000; // For telosb, the program memory starts at 0x4000 uint16_t FLASH_ROM_END_ADDR = 0xFDFF; // Last free byte (the last segment is used for interrupt vector) uint16_t numFreeSegments = 0; uint8_t *segmentBitArray; command error_t Init.init() { uint16_t numBytes; // Adjust FLASH_ROM_START_ADDR to account for the code loaded with PMManager if (HOST_ROM_SIZE == 0) { // Should not be here at all // return FAIL; } else { FLASH_ROM_START_ADDR += (((HOST_ROM_SIZE - 1) / SEGMENT_SIZE) + 1) * SEGMENT_SIZE; } // Calculates the number of available segments numFreeSegments = FLASH_ROM_END_ADDR - FLASH_ROM_START_ADDR + 1; numFreeSegments = ((numFreeSegments - 1) / SEGMENT_SIZE) + 1; // Initializes an bit array to track the status of available segments numBytes = ((numFreeSegments - 1) / 8) + 1; segmentBitArray = malloc(numBytes); call BitArrayUtils.clrArray(segmentBitArray, numBytes); return SUCCESS; } uint16_t bitIndexToAddress(uint16_t bitIndex) { return FLASH_ROM_START_ADDR + (bitIndex * SEGMENT_SIZE); } void eraseSegment(void* addr) { FCTL2 = FWKEY + FSSEL1 + FN2; FCTL3 = FWKEY; FCTL1 = FWKEY + ERASE; *((uint16_t *)addr) = 0; FCTL1 = FWKEY; FCTL3 = FWKEY + LOCK; } command uint16_t PMManager.request(uint16_t size) { if (size > 0) { uint8_t numSegments = ((size - 1) / SEGMENT_SIZE) + 1; // Number of segments needed to cover size int i; for (i = (numFreeSegments - 1); i >= 0; i--) { if (call BitArrayUtils.getBit(segmentBitArray, i) == FALSE) { int j, tempNumSegments = numSegments - 1; for (j = (i - 1); j >= 0 && tempNumSegments > 0; ) { // Checks if there are enough consecutive free segments if (call BitArrayUtils.getBit(segmentBitArray, j) == TRUE) { break; } else { j--; tempNumSegments--; } } j++; if ((i - j + 1) >= numSegments) { // There are enough consecutive free segments (starting segment index (j + 1)) int k; for (k = j; k <= i; k++) { eraseSegment((void *)bitIndexToAddress(k)); // Erase segment content call BitArrayUtils.setBit(segmentBitArray, k); // Mark segment as occupied } return bitIndexToAddress(j); } else { i = j; } } } } return 0xFFFF; } command void PMManager.release(uint16_t startingAddr, uint16_t size) { if ((startingAddr >= FLASH_ROM_START_ADDR && startingAddr <= FLASH_ROM_END_ADDR) && size > 0) { uint8_t numSegments = ((size - 1) / SEGMENT_SIZE) + 1; // Number of segments needed to cover size uint8_t startingSegment = (startingAddr - FLASH_ROM_START_ADDR) / SEGMENT_SIZE; int i; for (i = 0; i < numSegments && (i + startingSegment) < numFreeSegments; i++) { call BitArrayUtils.clrBit(segmentBitArray, i + startingSegment); // Mark the segment as free } } } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/TosThreadApiC.nc000066400000000000000000000074071207233610700245510ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "tosthread.h" configuration TosThreadApiC { } implementation { //Here are all the components that implement the Tosthread API calls components CThreadC; #if defined(PRINTF_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components PrintfC; #endif #if defined(TOSTHREAD_QUEUE_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CQueueC; #endif #if defined(TOSTHREAD_LINKED_LIST_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CLinkedListC; #endif #if defined(TOSTHREAD_THREADSYNC_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CThreadSynchronizationC; #endif #if defined(TOSTHREAD_LEDS_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CLedsC; #endif #if defined(TOSTHREAD_AMRADIO_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CAMRadioC; #endif #if defined(TOSTHREAD_AMSERIAL_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CAMSerialC; #endif #if defined(TOSTHREAD_BLOCKSTORAGE_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CBlockStorageC; #endif #if defined(TOSTHREAD_BLOCKSTORAGE_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CConfigStorageC; #endif #if defined(TOSTHREAD_LOGSTORAGE_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CLogStorageC; #endif #if defined(TOSTHREAD_COLLECTION_H) || defined(TOSTHREAD_DYNAMIC_LOADER) // components CCollectionC; #endif //Telosb sensorboard specific. #if defined(TOSTHREAD_HAMAMATSUS1087_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CHamamatsuS1087ParC; #endif #if defined(TOSTHREAD_HAMAMATSUS10871_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CHamamatsuS10871TsrC; #endif #if defined(TOSTHREAD_SENSIRIONSHT11_H) || defined(TOSTHREAD_DYNAMIC_LOADER) components CSensirionSht11C; #endif //Universal sensorboard specific #if defined(TOSTHREAD_SINESENSOR_H) || defined(TOSTHREAD_DYNAMIC_LOADER) // components CSineSensorC; #endif //Basicsb sensorboard specific #if defined(TOSTHREAD_PHOTO_H) || defined(TOSTHREAD_DYNAMIC_LOADER) // components CPhotoC; #endif #if defined(TOSTHREAD_TEMP_H) || defined(TOSTHREAD_DYNAMIC_LOADER) // components CTempC; #endif } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/UserButton.nc000077500000000000000000000000571207233610700242260ustar00rootroot00000000000000interface UserButton { event void fired(); } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/UserButtonC.nc000077500000000000000000000043071207233610700243330ustar00rootroot00000000000000/* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Init/start/stop the user button with StdControl and get interrupt events * when the button is released with MSP430Event. * * @author Cory Sharp * @author Andrew Redfern */ configuration UserButtonC { provides interface UserButton; } implementation { components MainC, new TimerMilliC(), HplMsp430GeneralIOC, HplMsp430InterruptC, UserButtonP; UserButton = UserButtonP; MainC.SoftwareInit -> UserButtonP; UserButtonP -> HplMsp430GeneralIOC.Port27; UserButtonP -> HplMsp430InterruptC.Port27; UserButtonP.Timer -> TimerMilliC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/UserButtonP.nc000077500000000000000000000052441207233610700243510ustar00rootroot00000000000000/* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Andew's timer debouce logic used from the CountInput application. * * @author Cory Sharp * @author Andrew Redfern */ module UserButtonP { provides { interface Init; interface UserButton; } uses { interface HplMsp430GeneralIO; interface HplMsp430Interrupt; interface Timer; } } implementation { command error_t Init.init() { atomic { call HplMsp430Interrupt.disable(); call HplMsp430GeneralIO.makeInput(); call HplMsp430GeneralIO.selectIOFunc(); call HplMsp430Interrupt.edge(TRUE); call HplMsp430Interrupt.clear(); call HplMsp430Interrupt.enable(); } return SUCCESS; } event void Timer.fired() { atomic { call HplMsp430Interrupt.clear(); call HplMsp430Interrupt.enable(); } } task void debounce() { call Timer.startOneShot(100); signal UserButton.fired(); } async event void HplMsp430Interrupt.fired() { atomic { call HplMsp430Interrupt.disable(); post debounce(); } } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/slcs_types.h000077500000000000000000000056761207233610700241470ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #ifndef _SLCS_TYPES_H #define _SLCS_TYPES_H #include "tosthread.h" #include "tosthread_leds.h" #include "tosthread_amradio.h" #include "tosthread_blockstorage.h" #include "tosthread_logstorage.h" #include "tosthread_configstorage.h" #include "tosthread_threadsync.h" #include "tosthread_amserial.h" #include "tosthread_queue.h" #include "tosthread_sensirionSht11.h" #include "tosthread_hamamatsuS10871.h" #include "tosthread_hamamatsuS1087.h" struct value_addr_pair { uint16_t value; void *addr; }; struct addr { void *addr; }; struct prog_desc { uint16_t main_addr; // Loadable program's main function (or tosthread_main() in our case) uint16_t alloc_count; uint16_t alloc_size; uint16_t g_reloc_count; uint16_t l_reloc_count; uint16_t datasec_count; uint16_t code_count; uint16_t patch_table_count; // alloc_count + g_reloc_count + l_reloc_count; uint16_t code_offset; // sizeof(main_addr) + // sizeof(alloc_count) + // sizeof(alloc_size) + // sizeof(g_reloc_count) + // sizeof(l_reloc_count) + // sizeof(datasec_count) + // sizeof(code_count) + // (g_sym_count + patch_table_count) * 4 uint16_t loading_stage; }; #endif tinyos-2.1.2+dfsg/tos/lib/tosthreads/lib/tinyld/tosthread_slcs_types.h000077500000000000000000000102531207233610700262070ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #ifndef _TOSTHREAD_SLCS_TYPES_H #define _TOSTHREAD_SLCS_TYPES_H #include "slcs_types.h" struct addr fun[] = { {tosthread_sleep}, {tosthread_create}, {led0On}, {led1On}, {led2On}, {led0Off}, {led1Off}, {led2Off}, {led0Toggle}, {led1Toggle}, {led2Toggle}, {amSerialStart}, {amSerialStop}, {amSerialReceive}, {amSerialSend}, {amSerialLocalAddress}, {amSerialGetLocalGroup}, {amSerialGetDestination}, {amSerialGetSource}, {amSerialSetDestination}, {amSerialSetSource}, {amSerialIsForMe}, {amSerialGetType}, {amSerialSetType}, {amSerialGetGroup}, {amSerialSetGroup}, {serialClear}, {serialGetPayloadLength}, {serialSetPayloadLength}, {serialMaxPayloadLength}, {serialGetPayload}, {serialRequestAck}, {serialNoAck}, {serialWasAcked}, {amRadioStart}, {amRadioStop}, {amRadioReceive}, {amRadioSend}, {amRadioGetLocalAddress}, {amRadioGetLocalGroup}, {amRadioGetDestination}, {amRadioGetSource}, {amRadioSetDestination}, {amRadioSetSource}, {amRadioIsForMe}, {amRadioGetType}, {amRadioSetType}, {amRadioGetGroup}, {amRadioSetGroup}, {radioClear}, {radioGetPayloadLength}, {radioSetPayloadLength}, {radioMaxPayloadLength}, {radioGetPayload}, {radioRequestAck}, {radioNoAck}, {radioWasAcked}, {semaphore_reset}, {semaphore_acquire}, {semaphore_release}, {barrier_reset}, {barrier_block}, {barrier_isBlocking}, {condvar_init}, {condvar_wait}, {condvar_signalNext}, {condvar_signalAll}, {condvar_isBlocking}, {mutex_init}, {mutex_lock}, {mutex_unlock}, {volumeBlockRead}, {volumeBlockWrite}, {volumeBlockCrc}, {volumeBlockErase}, {volumeBlockSync}, {refcounter_init}, {refcounter_increment}, {refcounter_decrement}, {refcounter_waitOnValue}, {refcounter_count}, {amRadioSnoop}, {queue_init}, {queue_clear}, {queue_enqueue}, {queue_dequeue}, {queue_remove}, {queue_size}, {queue_is_empty}, {sensirionSht11_humidity_read}, {sensirionSht11_humidity_getNumBits}, {sensirionSht11_temperature_read}, {sensirionSht11_temperature_getNumBits}, {hamamatsuS10871_tsr_read}, {hamamatsuS10871_tsr_readStream}, {hamamatsuS10871_tsr_getNumBits}, {hamamatsuS1087_par_read}, {hamamatsuS1087_par_readStream}, {hamamatsuS1087_par_getNumBits}, {volumeLogRead}, {volumeLogCurrentReadOffset}, {volumeLogSeek}, {volumeLogGetSize}, {volumeLogAppend}, {volumeLogCurrentWriteOffset}, {volumeLogErase}, {volumeLogSync}, {getLeds}, {setLeds}, {div}, {tosthread_join}, {volumeConfigMount}, {volumeConfigRead}, {volumeConfigWrite}, {volumeConfigCommit}, {volumeConfigGetSize}, {volumeConfigValid} }; #endif tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/000077500000000000000000000000001207233610700215235ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/epic/000077500000000000000000000000001207233610700224435ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/epic/ActiveMessageC.nc000066400000000000000000000064271207233610700256210ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ * */ /** * * The Active Message layer on the Telos platform. This is a naming wrapper * around the CC2420 Active Message layer. * * @author Philip Levis * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:52 $ */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2420ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; ReceiveDefault = AM.ReceiveDefault; Snoop = AM.Snoop; SnoopDefault = AM.SnoopDefault; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/epic/TelosSerialP.nc000066400000000000000000000013151207233610700253330ustar00rootroot00000000000000module TelosSerialP { provides interface StdControl; provides interface Msp430UartConfigure; uses interface Resource; } implementation { msp430_uart_union_config_t msp430_uart_telos_config = { {ubr: UBR_1MHZ_57600, umctl: UMCTL_1MHZ_57600, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0, utxe : 1, urxe : 1} }; command error_t StdControl.start(){ return call Resource.immediateRequest(); } command error_t StdControl.stop(){ call Resource.release(); return SUCCESS; } event void Resource.granted(){} async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig() { return &msp430_uart_telos_config; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/eyesIFX/000077500000000000000000000000001207233610700230375ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/eyesIFX/ActiveMessageC.nc000066400000000000000000000070761207233610700262160ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ * */ /** * * The Active Message layer on the eyesIFX platforms. This is a naming wrapper * around the TDA5250 Active Message layer. * * @author Philip Levis * @author Vlado Handziski (TDA5250 modifications) * @date July 20 2005 */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components ActiveMessageFilterC as Filter; components Tda5250ActiveMessageC as AM; components PacketStampC as PacketStamp; AMSend = Filter; Receive = Filter.Receive; ReceiveDefault = Filter.ReceiveDefault; Snoop = Filter.Snoop; SnoopDefault = Filter.SnoopDefault; Filter.SubAMSend -> AM; Filter.SubReceive -> AM.Receive; Filter.SubSnoop -> AM.Snoop; //Filter.AMPacket -> AM; SplitControl = AM; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; PacketTimeStamp32khz = PacketStamp; PacketTimeStampMilli = PacketStamp; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/eyesIFX/ActiveMessageFilterC.nc000066400000000000000000000101021207233610700273440ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2008-07-24 20:07:21 $ * @author: Jan Hauer * ======================================================================== */ /* This component is the default AM filter component: it does not do anything, * it uses no RAM and nesC will compile all code away. Its purpose is to allow * other components to shadow (overwrite) it to implement their own * filter/statistic component. */ #include "AM.h" module ActiveMessageFilterC { provides { interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; } uses { interface AMSend as SubAMSend[am_id_t id]; interface Receive as SubReceive[am_id_t id]; interface Receive as SubSnoop[am_id_t id]; } } implementation { command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len){ return call SubAMSend.send[id](addr, msg, len);} command error_t AMSend.cancel[am_id_t id](message_t* msg){ return call SubAMSend.cancel[id](msg);} command uint8_t AMSend.maxPayloadLength[am_id_t id](){ return call SubAMSend.maxPayloadLength[id]();} command void* AMSend.getPayload[am_id_t id](message_t* msg, uint8_t len){ return call SubAMSend.getPayload[id](msg, len);} event void SubAMSend.sendDone[am_id_t id](message_t* msg, error_t error) { signal AMSend.sendDone[id](msg, error); } default event void AMSend.sendDone[am_id_t id](message_t* msg, error_t error) { return; } event message_t* SubReceive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal Receive.receive[id](msg, payload, len); } event message_t* SubSnoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal Snoop.receive[id](msg, payload, len); } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal ReceiveDefault.receive[id](msg, payload, len); } default event message_t* ReceiveDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal SnoopDefault.receive[id](msg, payload, len); } default event message_t* SnoopDefault.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return msg; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/iris/000077500000000000000000000000001207233610700224715ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/iris/ActiveMessageC.nc000066400000000000000000000054511207233610700256430ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ /* * Make active message TOSThreads-compatible by exposing default interfaces * * Author: Chieh-Jan Mike Liang */ #include configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[uint8_t id]; interface Receive as SnoopDefault[am_id_t id]; interface SendNotifier[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface PacketTimeStamp as PacketTimeStampMicro; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components RF230ActiveMessageC as MessageC; SplitControl = MessageC; AMSend = MessageC; Receive = MessageC.Receive; ReceiveDefault = MessageC.ReceiveDefault; Snoop = MessageC.Snoop; SnoopDefault = MessageC.SnoopDefault; SendNotifier = MessageC; Packet = MessageC; AMPacket = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketLink = MessageC; PacketTimeStampMilli = MessageC; PacketTimeStampMicro = MessageC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/mica2/000077500000000000000000000000001207233610700225165ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/mica2/ActiveMessageC.nc000066400000000000000000000057361207233610700256760ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ * */ /** * The Active Message layer on the mica2 platform. This is a naming wrapper * around the CC1000 Active Message layer. * * @author Philip Levis * @date June 19 2005 */ configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; } } implementation { components CC1000ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; ReceiveDefault = AM.ReceiveDefault; Snoop = AM.Snoop; SnoopDefault = AM.SnoopDefault; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/mica2/chips/000077500000000000000000000000001207233610700236245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/mica2/chips/cc1000/000077500000000000000000000000001207233610700245125ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/mica2/chips/cc1000/HplCC1000InitP.nc000066400000000000000000000053701207233610700272370ustar00rootroot00000000000000// $Id: HplCC1000InitP.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* tab:4 * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Hardware initialisation for the CC1000 radio. This component is always * included even if the radio is not used. * * @author David Gay */ configuration HplCC1000InitP { provides interface Init as PlatformInit; } implementation { components HplCC1000P, HplCC1000SpiP, HplAtm128GeneralIOC as IO; PlatformInit = HplCC1000P; PlatformInit = HplCC1000SpiP; HplCC1000P.CHP_OUT -> IO.PortA6; HplCC1000P.PALE -> IO.PortD4; HplCC1000P.PCLK -> IO.PortD6; HplCC1000P.PDATA -> IO.PortD7; HplCC1000SpiP.SpiSck -> IO.PortB1; HplCC1000SpiP.SpiMiso -> IO.PortB3; HplCC1000SpiP.SpiMosi -> IO.PortB2; HplCC1000SpiP.OC1C -> IO.PortB7; components PlatformInterruptC; HplCC1000SpiP.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/mica2/chips/cc1000/HplCC1000SpiP.nc000066400000000000000000000076771207233610700271030ustar00rootroot00000000000000// $Id: HplCC1000SpiP.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Low-level functions to access the CC1000 bus. Built using the mica2 * hardware SPI. * * @author Jaein Jeong * @author Philip buonadonna */ module HplCC1000SpiP { provides interface Init as PlatformInit; provides interface HplCC1000Spi; //uses interface PowerManagement; uses { interface GeneralIO as SpiSck; interface GeneralIO as SpiMiso; interface GeneralIO as SpiMosi; interface GeneralIO as OC1C; interface PlatformInterrupt; } } implementation { uint8_t outgoingByte; command error_t PlatformInit.init() { call SpiSck.makeInput(); call OC1C.makeInput(); call HplCC1000Spi.rxMode(); return SUCCESS; } AVR_ATOMIC_HANDLER(SIG_SPI) { register uint8_t temp = SPDR; SPDR = outgoingByte; signal HplCC1000Spi.dataReady(temp); call PlatformInterrupt.postAmble(); } default async event void HplCC1000Spi.dataReady(uint8_t data) { } async command void HplCC1000Spi.writeByte(uint8_t data) { atomic outgoingByte = data; } async command bool HplCC1000Spi.isBufBusy() { return bit_is_clear(SPSR, SPIF); } async command uint8_t HplCC1000Spi.readByte() { return SPDR; } async command void HplCC1000Spi.enableIntr() { //sbi(SPCR,SPIE); SPCR = 0xc0; CLR_BIT(DDRB, 0); //call PowerManagement.adjustPower(); } async command void HplCC1000Spi.disableIntr() { CLR_BIT(SPCR, SPIE); SET_BIT(DDRB, 0); CLR_BIT(PORTB, 0); //call PowerManagement.adjustPower(); } async command void HplCC1000Spi.initSlave() { atomic { CLR_BIT(SPCR, CPOL); // Set proper polarity... CLR_BIT(SPCR, CPHA); // ...and phase SET_BIT(SPCR, SPIE); // enable spi port SET_BIT(SPCR, SPE); } } async command void HplCC1000Spi.txMode() { call SpiMiso.makeOutput(); call SpiMosi.makeOutput(); } async command void HplCC1000Spi.rxMode() { call SpiMiso.makeInput(); call SpiMosi.makeInput(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/mica2dot/000077500000000000000000000000001207233610700232255ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/mica2dot/chips/000077500000000000000000000000001207233610700243335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/mica2dot/chips/cc1000/000077500000000000000000000000001207233610700252215ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/mica2dot/chips/cc1000/HplCC1000InitP.nc000066400000000000000000000053501207233610700277440ustar00rootroot00000000000000// $Id: HplCC1000InitP.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Hardware initialisation for the CC1000 radio. This component is always * included even if the radio is not used. * * @author David Gay */ configuration HplCC1000InitP { provides interface Init as PlatformInit; } implementation { components HplCC1000P, HplCC1000SpiP, HplAtm128GeneralIOC as IO; PlatformInit = HplCC1000P; PlatformInit = HplCC1000SpiP; HplCC1000P.CHP_OUT -> IO.PortE7; HplCC1000P.PALE -> IO.PortD5; HplCC1000P.PCLK -> IO.PortD6; HplCC1000P.PDATA -> IO.PortD7; HplCC1000SpiP.SpiSck -> IO.PortB1; HplCC1000SpiP.SpiMiso -> IO.PortB3; HplCC1000SpiP.SpiMosi -> IO.PortB2; HplCC1000SpiP.OC1C -> IO.PortB7; components PlatformInterruptC; HplCC1000SpiP.PlatformInterrupt -> PlatformInterruptC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/micaz/000077500000000000000000000000001207233610700226265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/micaz/ActiveMessageC.nc000066400000000000000000000063651207233610700260050ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ * */ /** * * The Active Message layer on the micaZ platform. This is a naming wrapper * around the CC2420 Active Message layer. * * @author Philip Levis * @date June 19 2005 */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2420ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; ReceiveDefault = AM.ReceiveDefault; Snoop = AM.Snoop; SnoopDefault = AM.SnoopDefault; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/mulle/000077500000000000000000000000001207233610700226415ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/mulle/ActiveMessageC.nc000066400000000000000000000057451207233610700260210ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ /* * Make active message TOSThreads-compatible by exposing default interfaces * * Author: Chieh-Jan Mike Liang */ #include configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[uint8_t id]; interface Receive as SnoopDefault[am_id_t id]; interface SendNotifier[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface PacketTimeStamp as PacketTimeStampMicro; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components RF230ActiveMessageC as MessageC, RF230SplitControlP, new SystemClockControlC(); RF230SplitControlP.SplitControlOrig -> MessageC; RF230SplitControlP.SystemClockControl -> SystemClockControlC; SplitControl = RF230SplitControlP.SplitControl; AMSend = MessageC; Receive = MessageC.Receive; ReceiveDefault = MessageC.ReceiveDefault; Snoop = MessageC.Snoop; SnoopDefault = MessageC.SnoopDefault; SendNotifier = MessageC; Packet = MessageC; AMPacket = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketLink = MessageC; PacketTimeStampMilli = MessageC; PacketTimeStampMicro = MessageC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/shimmer/000077500000000000000000000000001207233610700231675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/shimmer/ActiveMessageC.nc000066400000000000000000000064271207233610700263450ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ * */ /** * * The Active Message layer on the Telos platform. This is a naming wrapper * around the CC2420 Active Message layer. * * @author Philip Levis * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:52 $ */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2420ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; ReceiveDefault = AM.ReceiveDefault; Snoop = AM.Snoop; SnoopDefault = AM.SnoopDefault; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/telosa/000077500000000000000000000000001207233610700230125ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/telosa/ActiveMessageC.nc000066400000000000000000000064271207233610700261700ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ * */ /** * * The Active Message layer on the Telos platform. This is a naming wrapper * around the CC2420 Active Message layer. * * @author Philip Levis * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:52 $ */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2420ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; ReceiveDefault = AM.ReceiveDefault; Snoop = AM.Snoop; SnoopDefault = AM.SnoopDefault; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/telosa/TelosSerialP.nc000066400000000000000000000013151207233610700257020ustar00rootroot00000000000000module TelosSerialP { provides interface StdControl; provides interface Msp430UartConfigure; uses interface Resource; } implementation { msp430_uart_union_config_t msp430_uart_telos_config = { {ubr: UBR_1MHZ_57600, umctl: UMCTL_1MHZ_57600, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0, utxe : 1, urxe : 1} }; command error_t StdControl.start(){ return call Resource.immediateRequest(); } command error_t StdControl.stop(){ call Resource.release(); return SUCCESS; } event void Resource.granted(){} async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig() { return &msp430_uart_telos_config; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/tinynode/000077500000000000000000000000001207233610700233545ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/platforms/tinynode/ActiveMessageC.nc000066400000000000000000000057641207233610700265350ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ * */ /** * * The Active Message layer on the TinyNode platform. This is a naming wrapper * around the XE1205 Active Message layer. * * @author Philip Levis, Henri Dubois-Ferriere */ configuration ActiveMessageC { provides { interface SplitControl @atleastonce(); interface AMSend[uint8_t id]; interface Receive[am_id_t id]; interface Receive as ReceiveDefault[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Receive as SnoopDefault[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; } } implementation { components XE1205ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; ReceiveDefault = AM.ReceiveDefault; Snoop = AM.Snoop; SnoopDefault = AM.SnoopDefault; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/000077500000000000000000000000001207233610700222205ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/basicsb/000077500000000000000000000000001207233610700236265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/basicsb/BlockingPhotoC.nc000066400000000000000000000015401207233610700270150ustar00rootroot00000000000000/* $Id: BlockingPhotoC.nc,v 1.1 2008-06-14 19:27:25 klueska Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Photodiode of the basicsb sensor board. * * @author David Gay * @author Kevin Klues */ generic configuration BlockingPhotoC() { provides interface BlockingRead; } implementation { components new BlockingAdcReadClientC(), PhotoDeviceP; BlockingRead = BlockingAdcReadClientC; BlockingAdcReadClientC.Atm128AdcConfig -> PhotoDeviceP; BlockingAdcReadClientC.ResourceConfigure -> PhotoDeviceP; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/basicsb/BlockingPhotoStreamC.nc000066400000000000000000000016201207233610700301700ustar00rootroot00000000000000/* $Id: BlockingPhotoStreamC.nc,v 1.1 2008-06-14 19:27:25 klueska Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Photodiode of the basicsb sensor board. * * @author David Gay * @author Kevin Klues */ generic configuration BlockingPhotoStreamC() { provides interface BlockingReadStream; } implementation { components PhotoDeviceP, new BlockingAdcReadStreamClientC(); BlockingReadStream = BlockingAdcReadStreamClientC; BlockingAdcReadStreamClientC.Atm128AdcConfig -> PhotoDeviceP; BlockingAdcReadStreamClientC.ResourceConfigure -> PhotoDeviceP; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/basicsb/BlockingTempC.nc000066400000000000000000000014521207233610700266330ustar00rootroot00000000000000/* $Id: BlockingTempC.nc,v 1.1 2008-06-14 19:27:25 klueska Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Thermistor of the basicsb sensor board. * * @author David Gay */ generic configuration BlockingTempC() { provides interface BlockingRead; } implementation { components new BlockingAdcReadClientC(), TempDeviceP; BlockingRead = BlockingAdcReadClientC; BlockingAdcReadClientC.Atm128AdcConfig -> TempDeviceP; BlockingAdcReadClientC.ResourceConfigure -> TempDeviceP; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/basicsb/BlockingTempStreamC.nc000066400000000000000000000016031207233610700300050ustar00rootroot00000000000000/* $Id: BlockingTempStreamC.nc,v 1.1 2008-06-14 19:27:25 klueska Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Thermistor of the basicsb sensor board. * * @author David Gay * @author Kevin Klues */ generic configuration TempStreamC() { provides interface BlockingReadStream; } implementation { components TempDeviceP, new BlockingAdcReadStreamClientC(); BlockingReadStream = BlockingAdcReadStreamClientC; BlockingAdcReadStreamClientC.Atm128AdcConfig -> TempDeviceP; BlockingAdcReadStreamClientC.ResourceConfigure -> TempDeviceP; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/basicsb/CPhotoC.nc000066400000000000000000000034731207233610700254560ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ configuration CPhotoC {} implementation { components CPhotoP; components new BlockingPhotoC(); CPhotoP.BlockingRead -> BlockingPhotoC; CPhotoP.BlockingReadStream -> BlockingPhotoC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/basicsb/CPhotoP.nc000066400000000000000000000040071207233610700254650ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module CPhotoP { uses { interface BlockingRead; interface BlockingReadStream; } } implementation { error_t photo_read(uint16_t* val) @C() AT_SPONTANEOUS { return call BlockingRead.read(val); } error_t photo_readStream(uint32_t* usPeriod, uint16_t* buf, uint16_t count) @C() AT_SPONTANEOUS { return call BlockingReadStream.read(usPeriod, buf, count); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/basicsb/CTempC.nc000066400000000000000000000034641207233610700252720ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ configuration CTempC {} implementation { components CTempP; components new BlockingTempC(); CTempP.BlockingRead -> BlockingTempC; CTempP.BlockingReadStream -> BlockingTempC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/basicsb/CTempP.nc000066400000000000000000000040041207233610700252760ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module CTempP { uses { interface BlockingRead; interface BlockingReadStream; } } implementation { error_t temp_read(uint16_t* val) @C() AT_SPONTANEOUS { return call BlockingRead.read(val); } error_t temp_readStream(uint32_t* usPeriod, uint16_t* buf, uint16_t count) @C() AT_SPONTANEOUS { return call BlockingReadStream.read(usPeriod, buf, count); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/basicsb/basicsb_sensors.h000066400000000000000000000034021207233610700271600ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef BASICSB_SENSORS_H #define BASICSB_SENSORS_H #include "tosthread_photo.h" #include "tosthread_temp.h" #endif //BASICSB_SENSORS_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/basicsb/tosthread_photo.h000066400000000000000000000035361207233610700272140ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TOSTHREAD_PHOTO_H #define TOSTHREAD_PHOTO_H #include "TinyError.h" extern error_t photo_read(uint16_t* val); extern error_t photo_readStream(uint32_t* usPeriod, uint16_t* buf, uint16_t count); #endif //TOSTHREAD_PHOTO_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/basicsb/tosthread_temp.h000066400000000000000000000035311207233610700270230ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TOSTHREAD_TEMP_H #define TOSTHREAD_TEMP_H #include "TinyError.h" extern error_t temp_read(uint16_t* val); extern error_t temp_readStream(uint32_t* usPeriod, uint16_t* buf, uint16_t count); #endif //TOSTHREAD_TEMP_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/000077500000000000000000000000001207233610700250545ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/BlockingHamamatsuS10871TsrC.nc000066400000000000000000000043351207233610700323140ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ generic configuration BlockingHamamatsuS10871TsrC() { provides interface DeviceMetadata; provides interface BlockingRead as Read; provides interface BlockingReadStream as ReadStream; } implementation { components new BlockingAdcReadClientC() as AdcReadClientC; Read = AdcReadClientC; components new BlockingAdcReadStreamClientC() as AdcReadStreamClientC; ReadStream = AdcReadStreamClientC; components HamamatsuS10871TsrP; DeviceMetadata = HamamatsuS10871TsrP; AdcReadClientC.AdcConfigure -> HamamatsuS10871TsrP; AdcReadStreamClientC.AdcConfigure -> HamamatsuS10871TsrP; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/BlockingHamamatsuS1087ParC.nc000066400000000000000000000043311207233610700322010ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ generic configuration BlockingHamamatsuS1087ParC() { provides interface DeviceMetadata; provides interface BlockingRead as Read; provides interface BlockingReadStream as ReadStream; } implementation { components new BlockingAdcReadClientC() as AdcReadClientC; Read = AdcReadClientC; components new BlockingAdcReadStreamClientC() as AdcReadStreamClientC; ReadStream = AdcReadStreamClientC; components HamamatsuS1087ParP; DeviceMetadata = HamamatsuS1087ParP; AdcReadClientC.AdcConfigure -> HamamatsuS1087ParP; AdcReadStreamClientC.AdcConfigure -> HamamatsuS1087ParP; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/BlockingSensirionSht11C.nc000066400000000000000000000052331207233610700317470ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ generic configuration BlockingSensirionSht11C() { provides interface BlockingRead as Temperature; provides interface DeviceMetadata as TemperatureMetadata; provides interface BlockingRead as Humidity; provides interface DeviceMetadata as HumidityMetadata; } implementation { components new BlockingSensirionSht11ReaderP() as SensirionSht11ReaderP; Temperature = SensirionSht11ReaderP.Temperature; TemperatureMetadata = SensirionSht11ReaderP.TemperatureMetadata; Humidity = SensirionSht11ReaderP.Humidity; HumidityMetadata = SensirionSht11ReaderP.HumidityMetadata; components HalSensirionSht11C; enum { TEMP_KEY = unique("Sht11.Resource") }; enum { HUM_KEY = unique("Sht11.Resource") }; SensirionSht11ReaderP.TempResource -> HalSensirionSht11C.Resource[ TEMP_KEY ]; SensirionSht11ReaderP.Sht11Temp -> HalSensirionSht11C.SensirionSht11[ TEMP_KEY ]; SensirionSht11ReaderP.HumResource -> HalSensirionSht11C.Resource[ HUM_KEY ]; SensirionSht11ReaderP.Sht11Hum -> HalSensirionSht11C.SensirionSht11[ HUM_KEY ]; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/BlockingSensirionSht11ReaderImplP.nc000066400000000000000000000066411207233610700337350ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include generic module BlockingSensirionSht11ReaderImplP() { provides { interface BlockingRead as BlockingTemperature; interface BlockingRead as BlockingHumidity; } uses { interface Read as Temperature; interface Read as Humidity; interface SystemCall; } } implementation { typedef struct params { uint16_t* val; error_t error; } params_t; syscall_t* temp_call = NULL; syscall_t* hum_call = NULL; void tempTask(syscall_t* s) { params_t* p = s->params; p->error = call Temperature.read(); if(p->error != SUCCESS) { call SystemCall.finish(s); } } void humTask(syscall_t* s) { params_t* p = s->params; p->error = call Humidity.read(); if(p->error != SUCCESS) { call SystemCall.finish(s); } } error_t blockingRead(syscall_t** s_call, uint16_t* val, void* task_ptr) { syscall_t s; params_t p; atomic { if(*s_call != NULL) return EBUSY; *s_call = &s; } p.val = val; call SystemCall.start(task_ptr, &s, INVALID_ID, &p); atomic { *s_call = NULL; return p.error; } } command error_t BlockingTemperature.read(uint16_t* val) { return blockingRead(&temp_call, val, tempTask); } command error_t BlockingHumidity.read(uint16_t* val) { return blockingRead(&hum_call, val, humTask); } event void Temperature.readDone( error_t result, uint16_t val ) { params_t* p = temp_call->params; p->error = result; *(p->val) = val; call SystemCall.finish(temp_call); } event void Humidity.readDone( error_t result, uint16_t val ) { params_t* p = hum_call->params; p->error = result; *(p->val) = val; call SystemCall.finish(hum_call); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/BlockingSensirionSht11ReaderP.nc000066400000000000000000000056531207233610700331150ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" generic configuration BlockingSensirionSht11ReaderP() { provides interface DeviceMetadata as TemperatureMetadata; provides interface BlockingRead as Temperature; provides interface DeviceMetadata as HumidityMetadata; provides interface BlockingRead as Humidity; uses interface Resource as TempResource; uses interface Resource as HumResource; uses interface SensirionSht11 as Sht11Temp; uses interface SensirionSht11 as Sht11Hum; } implementation { components new SensirionSht11ReaderP(); components new BlockingSensirionSht11ReaderImplP(); TemperatureMetadata = SensirionSht11ReaderP.TemperatureMetadata; Temperature = BlockingSensirionSht11ReaderImplP.BlockingTemperature; HumidityMetadata = SensirionSht11ReaderP.HumidityMetadata; Humidity = BlockingSensirionSht11ReaderImplP.BlockingHumidity; TempResource = SensirionSht11ReaderP.TempResource; HumResource = SensirionSht11ReaderP.HumResource; Sht11Temp = SensirionSht11ReaderP.Sht11Temp; Sht11Hum = SensirionSht11ReaderP.Sht11Hum; BlockingSensirionSht11ReaderImplP.Temperature -> SensirionSht11ReaderP.Temperature; BlockingSensirionSht11ReaderImplP.Humidity -> SensirionSht11ReaderP.Humidity; components SystemCallC; BlockingSensirionSht11ReaderImplP.SystemCall -> SystemCallC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/CHamamatsuS10871TsrC.nc000066400000000000000000000040201207233610700307350ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ configuration CHamamatsuS10871TsrC {} implementation { components CHamamatsuS10871TsrP; #ifdef PLATFORM_TELOSB components new BlockingHamamatsuS10871TsrC(); CHamamatsuS10871TsrP.DeviceMetadata -> BlockingHamamatsuS10871TsrC.DeviceMetadata; CHamamatsuS10871TsrP.Read -> BlockingHamamatsuS10871TsrC.Read; CHamamatsuS10871TsrP.ReadStream -> BlockingHamamatsuS10871TsrC.ReadStream; #endif } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/CHamamatsuS10871TsrP.nc000066400000000000000000000050761207233610700307660ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module CHamamatsuS10871TsrP { uses { interface DeviceMetadata; interface BlockingRead as Read; interface BlockingReadStream as ReadStream; } } implementation { error_t hamamatsuS10871_tsr_read(uint16_t* val) @C() AT_SPONTANEOUS { return call Read.read(val); } error_t hamamatsuS10871_tsr_readStream(uint32_t* usPeriod, uint16_t* buf, uint16_t count) @C() AT_SPONTANEOUS { return call ReadStream.read(usPeriod, buf, count); } uint8_t hamamatsuS10871_tsr_getNumBits() @C() AT_SPONTANEOUS { return call DeviceMetadata.getSignificantBits(); } default command error_t Read.read(uint16_t* val) { return FAIL; } default command error_t ReadStream.read(uint32_t* usPeriod, uint16_t* buf, uint16_t count) { return FAIL; } default command uint8_t DeviceMetadata.getSignificantBits() { return 0; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/CHamamatsuS1087ParC.nc000066400000000000000000000040071207233610700306330ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ configuration CHamamatsuS1087ParC {} implementation { components CHamamatsuS1087ParP; #ifdef PLATFORM_TELOSB components new BlockingHamamatsuS1087ParC(); CHamamatsuS1087ParP.DeviceMetadata -> BlockingHamamatsuS1087ParC.DeviceMetadata; CHamamatsuS1087ParP.Read -> BlockingHamamatsuS1087ParC.Read; CHamamatsuS1087ParP.ReadStream -> BlockingHamamatsuS1087ParC.ReadStream; #endif } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/CHamamatsuS1087ParP.nc000066400000000000000000000050731207233610700306540ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module CHamamatsuS1087ParP { uses { interface DeviceMetadata; interface BlockingRead as Read; interface BlockingReadStream as ReadStream; } } implementation { error_t hamamatsuS1087_par_read(uint16_t* val) @C() AT_SPONTANEOUS { return call Read.read(val); } error_t hamamatsuS1087_par_readStream(uint32_t* usPeriod, uint16_t* buf, uint16_t count) @C() AT_SPONTANEOUS { return call ReadStream.read(usPeriod, buf, count); } uint8_t hamamatsuS1087_par_getNumBits() @C() AT_SPONTANEOUS { return call DeviceMetadata.getSignificantBits(); } default command error_t Read.read(uint16_t* val) { return FAIL; } default command error_t ReadStream.read(uint32_t* usPeriod, uint16_t* buf, uint16_t count) { return FAIL; } default command uint8_t DeviceMetadata.getSignificantBits() { return 0; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/CSensirionSht11C.nc000066400000000000000000000041211207233610700303740ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ configuration CSensirionSht11C {} implementation { components CSensirionSht11P; #ifdef PLATFORM_TELOSB components new BlockingSensirionSht11C(); CSensirionSht11P.Temperature -> BlockingSensirionSht11C.Temperature; CSensirionSht11P.TemperatureMetadata -> BlockingSensirionSht11C.TemperatureMetadata; CSensirionSht11P.Humidity -> BlockingSensirionSht11C.Humidity; CSensirionSht11P.HumidityMetadata -> BlockingSensirionSht11C.HumidityMetadata; #endif } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/CSensirionSht11P.nc000066400000000000000000000053071207233610700304200ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module CSensirionSht11P { uses { interface BlockingRead as Temperature; interface DeviceMetadata as TemperatureMetadata; interface BlockingRead as Humidity; interface DeviceMetadata as HumidityMetadata; } } implementation { error_t sensirionSht11_humidity_read(uint16_t* val) @C() AT_SPONTANEOUS { return call Humidity.read(val); } uint8_t sensirionSht11_humidity_getNumBits() @C() AT_SPONTANEOUS { return call HumidityMetadata.getSignificantBits(); } error_t sensirionSht11_temperature_read(uint16_t* val) @C() AT_SPONTANEOUS { return call Temperature.read(val); } uint8_t sensirionSht11_temperature_getNumBits() @C() AT_SPONTANEOUS { return call TemperatureMetadata.getSignificantBits(); } default command error_t Humidity.read(uint16_t* val) { return FAIL; } default command uint8_t HumidityMetadata.getSignificantBits() { return 0; } default command error_t Temperature.read(uint16_t* val) { return FAIL; } default command uint8_t TemperatureMetadata.getSignificantBits() { return 0; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/tmote_onboard_sensors.h000066400000000000000000000035161207233610700316420ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TMOTE_ONBOARD_SENSORS_H #define TMOTE_ONBOARD_SENSORS_H #include "tosthread_sensirionSht11.h" #include "tosthread_hamamatsuS1087.h" #include "tosthread_hamamatsuS10871.h" #endif //TMOTE_ONBOARD_SENSORS_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/tosthread_hamamatsuS1087.h000066400000000000000000000037501207233610700317320ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TOSTHREAD_HAMAMATSUS1087_H #define TOSTHREAD_HAMAMATSUS1087_H #include "TinyError.h" #define tmote_par hamamatsuS1087_par extern error_t hamamatsuS1087_par_read(uint16_t* val); extern error_t hamamatsuS1087_par_readStream(uint32_t* usPeriod, uint16_t* buf, uint16_t count); extern uint8_t hamamatsuS1087_par_getNumBits(); #endif //TOSTHREAD_HAMAMATSUS1087_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/tosthread_hamamatsuS10871.h000066400000000000000000000037561207233610700320210ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TOSTHREAD_HAMAMATSUS10871_H #define TOSTHREAD_HAMAMATSUS10871_H #include "TinyError.h" #define tmote_tsr hamamatsuS10871_tsr extern error_t hamamatsuS10871_tsr_read(uint16_t* val); extern error_t hamamatsuS10871_tsr_readStream(uint32_t* usPeriod, uint16_t* buf, uint16_t count); extern uint8_t hamamatsuS10871_tsr_getNumBits(); #endif //TOSTHREAD_HAMAMATSUS1087_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/tmote_onboard/tosthread_sensirionSht11.h000066400000000000000000000041111207233610700321310ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TOSTHREAD_SENSIRIONSHT11_H #define TOSTHREAD_SENSIRIONSHT11_H #include "TinyError.h" #define tmote_humidity sensirionSht11_humidity #define tmote_temperature sensirionSht11_temperature extern error_t sensirionSht11_humidity_read(uint16_t* val); extern uint8_t sensirionSht11_humidity_getNumBits(); extern error_t sensirionSht11_temperature_read(uint16_t* val); extern uint8_t sensirionSht11_temperature_getNumBits(); #endif //TOSTHREAD_SENSIRIONSHT11_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/universal/000077500000000000000000000000001207233610700242305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/universal/BlockingSineSensorC.nc000066400000000000000000000037531207233610700304260ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ generic configuration BlockingSineSensorC() { provides interface Init; provides interface BlockingRead; } implementation { components BlockingSineSensorP; components new SineSensorC(); enum { ID = unique("Sine.Sensor") }; Init = SineSensorC; BlockingRead = BlockingSineSensorP.BlockingRead[ID]; BlockingSineSensorP.Read[ID] -> SineSensorC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/universal/BlockingSineSensorP.nc000066400000000000000000000040151207233610700304330ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ configuration BlockingSineSensorP { provides interface BlockingRead[uint8_t id]; uses interface Read[uint8_t id]; } implementation { components new BlockingReadP(); BlockingRead = BlockingReadP; Read = BlockingReadP; components SystemCallC; components SystemCallQueueC; BlockingReadP.SystemCallQueue -> SystemCallQueueC; BlockingReadP.SystemCall -> SystemCallC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/universal/CSineSensorC.nc000066400000000000000000000034441207233610700270550ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ configuration CSineSensorC {} implementation { components CSineSensorP; components new BlockingSineSensorC(); CSineSensorP.BlockingRead -> BlockingSineSensorC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/universal/CSineSensorP.nc000066400000000000000000000034761207233610700270770ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module CSineSensorP { uses { interface BlockingRead; } } implementation { error_t sinesensor_read(uint16_t* val) @C() AT_SPONTANEOUS { return call BlockingRead.read(val); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/universal/tosthread_sinesensor.h000066400000000000000000000034361207233610700306540ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef TOSTHREAD_SINESENSOR_H #define TOSTHREAD_SINESENSOR_H #include "TinyError.h" extern error_t sinesensor_read(uint16_t* val); #endif //TOSTHREAD_SINESENSOR_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/sensorboards/universal/universal_sensors.h000066400000000000000000000033611207233610700301700ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef UNIVERSAL_SENSORS_H #define UNIVERSAL_SENSORS_H #include "tosthread_sinesensor.h" #endif //UNIVERSAL_SENSORS_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/000077500000000000000000000000001207233610700210405ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BarrierC.nc000066400000000000000000000045521207233610700230610ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This is the barrier implementation. Every barrier has a pointer to * a linked list of threads. When a thread calls block() on a barrier * it is pushed onto the thread queue associated with that barrier and * it is blocked. Once some thread calls unblock() on a particular * barrier, all threads on that barrier's thread queue are popped off * and woken up. * * @author Kevin Klues */ #include "thread.h" #include "barrier.h" configuration BarrierC { provides { interface Barrier; } } implementation { components TinyThreadSchedulerC; components ThreadQueueC; components BarrierP; Barrier = BarrierP; BarrierP.ThreadScheduler -> TinyThreadSchedulerC; BarrierP.ThreadQueue -> ThreadQueueC; components LedsC; BarrierP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BarrierP.nc000066400000000000000000000060161207233610700230730ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This is the barrier implementation. Every barrier has a pointer to * a linked list of threads. When a thread calls block() on a barrier * it is pushed onto the thread queue associated with that barrier and * it is blocked. Once some thread calls unblock() on a particular * barrier, all threads on that barrier's thread queue are popped off * and woken up. * * @author Kevin Klues */ module BarrierP { provides { interface Barrier; } uses { interface ThreadScheduler; interface ThreadQueue; interface Leds; } } implementation { command void Barrier.reset(barrier_t* b, uint8_t count) { atomic { b->count = count; //Initialize the thread queue associated with this barrier. call ThreadQueue.init(&(b->thread_queue)); } } command void Barrier.block(barrier_t* b) { atomic { if(b->count > 1) { //Push the thread that just called block() onto the thread queue associated with this barrier call ThreadQueue.enqueue(&(b->thread_queue), call ThreadScheduler.currentThreadInfo()); b->count--; call ThreadScheduler.suspendCurrentThread(); } else { thread_t* t; while((t = call ThreadQueue.dequeue(&(b->thread_queue))) != NULL) call ThreadScheduler.wakeupThread(t->id); } } } command bool Barrier.isBlocking(barrier_t* b) { atomic return !(call ThreadQueue.isEmpty(&(b->thread_queue))); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BitArrayUtilsC.nc000066400000000000000000000046601207233610700242310ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Chieh-Jan Mike Liang * @author Kevin Klues */ module BitArrayUtilsC { provides interface BitArrayUtils; } implementation { uint16_t getByteIndex(uint8_t bitIndex) { return bitIndex / 8; } uint8_t getMask(uint8_t bitIndex) { return 1 << (bitIndex % 8); } async command void BitArrayUtils.clrArray(uint8_t* array, uint8_t size) { memset(array, 0, size); } async command bool BitArrayUtils.getBit(uint8_t* array, uint8_t bitIndex) { return (array[getByteIndex(bitIndex)] & getMask(bitIndex)) ? TRUE : FALSE; } async command void BitArrayUtils.setBit(uint8_t* array, uint8_t bitIndex) { array[getByteIndex(bitIndex)] |= getMask(bitIndex); } async command void BitArrayUtils.clrBit(uint8_t* array, uint8_t bitIndex) { array[getByteIndex(bitIndex)] &= ~getMask(bitIndex); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingAMReceiverC.nc000066400000000000000000000037451207233610700251310ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) * @author Chieh-Jan Mike Liang (cliang4@cs.jhu.edu) */ #include "AM.h" generic configuration BlockingAMReceiverC(am_id_t amId) { provides { interface BlockingReceive; interface Packet; interface AMPacket; } } implementation { components BlockingActiveMessageC as AM; BlockingReceive = AM.BlockingReceive[amId]; Packet = AM; AMPacket = AM; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingAMReceiverImplP.nc000066400000000000000000000115031207233610700257570ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ generic module BlockingAMReceiverImplP() { provides { interface Init; interface BlockingReceive[uint8_t id]; interface BlockingReceive as BlockingReceiveAny; } uses { interface Packet; interface Timer[uint8_t id]; interface Receive[uint8_t id]; interface SystemCall; interface SystemCallQueue; interface ThreadScheduler; interface Leds; } } implementation { typedef struct params { uint32_t* timeout; message_t* msg; error_t error; } params_t; //For parameterized BlockingReceive interface syscall_queue_t am_queue; //For single BlockingReceiveAny interface bool blockForAny = FALSE; void timerTask(syscall_t* s) { params_t* p = s->params; call Timer.startOneShot[s->thread->id](*(p->timeout)); } command error_t Init.init() { call SystemCallQueue.init(&am_queue); blockForAny = FALSE; return SUCCESS; } void blockingReceive(syscall_t* s, am_id_t am_id, params_t* p, message_t* m, uint32_t* timeout) { p->msg = m; p->timeout = timeout; atomic { p->error = EBUSY; if(*timeout != 0) call SystemCall.start(&timerTask, s, am_id, p); else call SystemCall.start(SYSCALL_WAIT_ON_EVENT, s, am_id, p); } } command error_t BlockingReceiveAny.receive(message_t* m, uint32_t timeout) { syscall_t s; params_t p; atomic { if((blockForAny == TRUE) || (call SystemCallQueue.isEmpty(&am_queue) == FALSE)) return EBUSY; call SystemCallQueue.enqueue(&am_queue, &s); blockForAny = TRUE; } blockingReceive(&s, INVALID_ID, &p, m, &timeout); atomic { blockForAny = FALSE; call SystemCallQueue.remove(&am_queue, &s); return p.error; } } command error_t BlockingReceive.receive[uint8_t am_id](message_t* m, uint32_t timeout) { syscall_t s; params_t p; atomic { if((blockForAny == TRUE) || (call SystemCallQueue.find(&am_queue, am_id) != NULL)) return EBUSY; call SystemCallQueue.enqueue(&am_queue, &s); } blockingReceive(&s, am_id, &p, m, &timeout); atomic { call SystemCallQueue.remove(&am_queue, &s); return p.error; } } command void* BlockingReceive.getPayload[uint8_t am_id](message_t* msg, uint8_t len) { return call Packet.getPayload(msg,len); } command void* BlockingReceiveAny.getPayload(message_t* msg, uint8_t len) { return call Packet.getPayload(msg,len); } event message_t* Receive.receive[uint8_t am_id](message_t* m, void* payload, uint8_t len) { syscall_t* s; params_t* p; if(blockForAny == TRUE) s = call SystemCallQueue.find(&am_queue, INVALID_ID); else s = call SystemCallQueue.find(&am_queue, am_id); if(s == NULL) return m; p = s->params; if( (p->error == EBUSY) ) { call Timer.stop[s->thread->id](); *(p->msg) = *m; p->error = SUCCESS; call SystemCall.finish(s); } return m; } event void Timer.fired[uint8_t id]() { thread_t* t = call ThreadScheduler.threadInfo(id); params_t* p = t->syscall->params; if( (p->error == EBUSY) ) { p->error = FAIL; call SystemCall.finish(t->syscall); } } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingAMReceiverP.nc000066400000000000000000000051341207233610700251400ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "AM.h" #include "thread.h" configuration BlockingAMReceiverP { provides { interface BlockingReceive[uint8_t id]; interface BlockingReceive as BlockingReceiveAny; } uses { interface Receive[uint8_t id]; } } implementation { components MainC; components ActiveMessageC as AM; components new BlockingAMReceiverImplP(); MainC.SoftwareInit -> BlockingAMReceiverImplP; BlockingReceive = BlockingAMReceiverImplP; BlockingReceiveAny = BlockingAMReceiverImplP; Receive = BlockingAMReceiverImplP; BlockingAMReceiverImplP.Packet -> AM; components SystemCallC; components SystemCallQueueC; components TinyThreadSchedulerC; BlockingAMReceiverImplP.SystemCallQueue -> SystemCallQueueC; BlockingAMReceiverImplP.SystemCall -> SystemCallC; BlockingAMReceiverImplP.ThreadScheduler -> TinyThreadSchedulerC; components ThreadTimersC; BlockingAMReceiverImplP.Timer -> ThreadTimersC; components LedsC; BlockingAMReceiverImplP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingAMSenderC.nc000066400000000000000000000037471207233610700246070ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "AM.h" generic configuration BlockingAMSenderC(am_id_t AMId) { provides { interface BlockingAMSend; interface Packet; interface AMPacket; interface PacketAcknowledgements as Acks; } } implementation { components BlockingActiveMessageC as AM; BlockingAMSend = AM.BlockingAMSend[AMId]; Packet = AM; AMPacket = AM; Acks = AM; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingAMSenderImplP.nc000066400000000000000000000070551207233610700254420ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) * @author Chieh-Jan Mike Liang */ generic module BlockingAMSenderImplP() { provides { interface Init; interface BlockingAMSend[am_id_t id]; } uses { interface SystemCall; interface Mutex; interface AMSend[am_id_t id]; interface Packet; interface Leds; } } implementation { typedef struct params { am_addr_t addr; message_t* msg; uint8_t len; error_t error; } params_t; syscall_t* send_call = NULL; mutex_t my_mutex; void sendTask(syscall_t* s) { params_t* p = s->params; p->error = call AMSend.send[s->id](p->addr, p->msg, p->len); if(p->error != SUCCESS) call SystemCall.finish(s); } command error_t Init.init() { call Mutex.init(&my_mutex); return SUCCESS; } command error_t BlockingAMSend.send[am_id_t am_id](am_addr_t addr, message_t* msg, uint8_t len) { syscall_t s; params_t p; call Mutex.lock(&my_mutex); if (send_call == NULL) { send_call = &s; p.addr = addr; p.msg = msg; p.len = len; call SystemCall.start(&sendTask, &s, am_id, &p); send_call = NULL; } else { p.error = EBUSY; } atomic { call Mutex.unlock(&my_mutex); return p.error; } } command uint8_t BlockingAMSend.maxPayloadLength[am_id_t id]() { return call Packet.maxPayloadLength(); } command void* BlockingAMSend.getPayload[am_id_t id](message_t* msg, uint8_t len) { return call Packet.getPayload(msg, len); } event void AMSend.sendDone[am_id_t am_id](message_t* m, error_t error) { if (send_call != NULL) { if (send_call->id == am_id) { params_t* p; p = send_call->params; p->error = error; call SystemCall.finish(send_call); } } } default command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len) { return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingAMSenderP.nc000066400000000000000000000044421207233610700246150ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "AM.h" #include "thread.h" #include "mutex.h" configuration BlockingAMSenderP { provides { interface BlockingAMSend[am_id_t amId]; } uses { interface AMSend[am_id_t amId]; } } implementation { components MainC; components ActiveMessageC as AM; components new BlockingAMSenderImplP(); components MutexC; components SystemCallC; components LedsC; MainC.SoftwareInit -> BlockingAMSenderImplP; BlockingAMSend = BlockingAMSenderImplP; AMSend = BlockingAMSenderImplP; BlockingAMSenderImplP.Mutex -> MutexC; BlockingAMSenderImplP.SystemCall -> SystemCallC; BlockingAMSenderImplP.Packet -> AM; BlockingAMSenderImplP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingAMSnooperC.nc000066400000000000000000000037631207233610700250120ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) * @author Chieh-Jan Mike Liang (cliang4@cs.jhu.edu) */ #include "AM.h" generic configuration BlockingAMSnooperC(am_id_t amId) { provides { interface BlockingReceive as BlockingSnoop; interface Packet; interface AMPacket; } } implementation { components BlockingActiveMessageC as AM; BlockingReceive = AM.BlockingSnoop[amId]; Packet = AM; AMPacket = AM; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingAMSnooperP.nc000066400000000000000000000051551207233610700250240ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "AM.h" #include "thread.h" configuration BlockingAMSnooperP { provides { interface BlockingReceive as BlockingSnoop[uint8_t id]; interface BlockingReceive as BlockingSnoopAny; } uses { interface Receive as Snoop[uint8_t id]; } } implementation { components MainC; components ActiveMessageC as AM; components new BlockingAMReceiverImplP(); MainC.SoftwareInit -> BlockingAMReceiverImplP; BlockingSnoop = BlockingAMReceiverImplP; BlockingSnoopAny = BlockingAMReceiverImplP; Snoop = BlockingAMReceiverImplP; BlockingAMReceiverImplP.Packet -> AM; components SystemCallC; components SystemCallQueueC; components TinyThreadSchedulerC; BlockingAMReceiverImplP.SystemCallQueue -> SystemCallQueueC; BlockingAMReceiverImplP.SystemCall -> SystemCallC; BlockingAMReceiverImplP.ThreadScheduler -> TinyThreadSchedulerC; components ThreadTimersC; BlockingAMReceiverImplP.Timer -> ThreadTimersC; components LedsC; BlockingAMReceiverImplP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingActiveMessageC.nc000066400000000000000000000053101207233610700256550ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ configuration BlockingActiveMessageC { provides { interface BlockingStdControl; interface BlockingReceive[uint8_t id]; interface BlockingReceive as BlockingReceiveAny; interface BlockingReceive as BlockingSnoop[uint8_t id]; interface BlockingReceive as BlockingSnoopAny; interface BlockingAMSend[uint8_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; } } implementation { components ActiveMessageC as AM; components new BlockingStdControlC(); components BlockingAMReceiverP as AMReceiverP; components BlockingAMSnooperP as AMSnooperP; components BlockingAMSenderP as AMSenderP; BlockingStdControl = BlockingStdControlC; BlockingReceive = AMReceiverP; BlockingReceiveAny = AMReceiverP; BlockingSnoop = AMSnooperP; BlockingSnoopAny = AMSnooperP; BlockingAMSend = AMSenderP; BlockingStdControlC.SplitControl -> AM; AMReceiverP.Receive -> AM.ReceiveDefault; AMSnooperP.Snoop -> AM.SnoopDefault; AMSenderP.AMSend -> AM.AMSend; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingBlockStorageC.nc000066400000000000000000000042501207233610700255160ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #define UQ_BLOCKING_BLOCK_STORAGE_VOLUME "Blocking.Block.Storage.Volume" generic configuration BlockingBlockStorageC(volume_id_t volume_id) { provides { interface BlockingBlock; } } implementation { enum { VOLUME_ID = unique(UQ_BLOCKING_BLOCK_STORAGE_VOLUME), }; components new BlockStorageC(volume_id), BlockingBlockStorageP; BlockingBlock = BlockingBlockStorageP.BlockingBlock[VOLUME_ID]; BlockingBlockStorageP.BlockRead[VOLUME_ID] -> BlockStorageC; BlockingBlockStorageP.BlockWrite[VOLUME_ID] -> BlockStorageC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingBlockStorageImplP.nc000066400000000000000000000240071207233610700263570ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @author Chieh-Jan Mike Liang */ module BlockingBlockStorageImplP { provides { interface Init; interface BlockingBlock[uint8_t volume_id]; } uses { interface BlockRead[uint8_t volume_id]; interface BlockWrite[uint8_t volume_id]; interface SystemCall; interface SystemCallQueue; } } implementation { typedef struct read_write_params { storage_addr_t addr; void* buf; storage_len_t* len; error_t error; } read_write_params_t; typedef struct crc_params { storage_addr_t addr; storage_len_t* len; uint16_t crc; uint16_t *finalCrc; error_t error; } crc_params_t; typedef struct erase_sync_params { error_t error; } erase_sync_params_t; syscall_queue_t vol_queue; command error_t Init.init() { call SystemCallQueue.init(&vol_queue); return SUCCESS; } command storage_len_t BlockingBlock.getSize[uint8_t volume_id]() { return call BlockRead.getSize[volume_id](); } /**************************** Reading ********************************/ void readTask(syscall_t* s) { read_write_params_t* p = s->params; p->error = call BlockRead.read[s->id](p->addr, p->buf, *(p->len)); if(p->error != SUCCESS) call SystemCall.finish(s); } command error_t BlockingBlock.read[uint8_t volume_id](storage_addr_t addr, void *buf, storage_len_t* len) { syscall_t s; read_write_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&vol_queue, &s); } p.addr = addr; p.buf = buf; p.len = len; call SystemCall.start(&readTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void BlockRead.readDone[uint8_t volume_id](storage_addr_t addr, void *buf, storage_len_t len, error_t error) { syscall_t* s = call SystemCallQueue.find(&vol_queue, volume_id); read_write_params_t* p = s->params; p->error = error; *(p->len) = len; call SystemCall.finish(s); } /**************************** Writing ********************************/ void writeTask(syscall_t* s) { read_write_params_t* p = s->params; p->error = call BlockWrite.write[s->id](p->addr, p->buf, *(p->len)); if(p->error != SUCCESS) call SystemCall.finish(s); } command error_t BlockingBlock.write[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t* len) { syscall_t s; read_write_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&vol_queue, &s); } p.addr = addr; p.buf = buf; p.len = len; call SystemCall.start(&writeTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void BlockWrite.writeDone[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { syscall_t* s = call SystemCallQueue.find(&vol_queue, volume_id); read_write_params_t* p = s->params; *(p->len) = len; p->error = error; call SystemCall.finish(s); } /**************************** Computing CRC ********************************/ void crcTask(syscall_t* s) { crc_params_t* p = s->params; p->error = call BlockRead.computeCrc[s->id](p->addr, *(p->len), p->crc); if(p->error != SUCCESS) call SystemCall.finish(s); } command error_t BlockingBlock.computeCrc[uint8_t volume_id](storage_addr_t addr, storage_len_t* len, uint16_t crc, uint16_t *finalCrc) { syscall_t s; crc_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&vol_queue, &s); } p.addr = addr; p.len = len; p.crc = crc; p.finalCrc = finalCrc; call SystemCall.start(&crcTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void BlockRead.computeCrcDone[uint8_t volume_id](storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error) { syscall_t* s = call SystemCallQueue.find(&vol_queue, volume_id); crc_params_t* p = s->params; *(p->finalCrc) = crc; *(p->len) = len; p->error = error; call SystemCall.finish(s); } /**************************** Erasing ********************************/ void eraseTask(syscall_t* s) { erase_sync_params_t* p = s->params; p->error = call BlockWrite.erase[s->id](); if(p->error != SUCCESS) call SystemCall.finish(s); } command error_t BlockingBlock.erase[uint8_t volume_id]() { syscall_t s; erase_sync_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&vol_queue, &s); } call SystemCall.start(&eraseTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void BlockWrite.eraseDone[uint8_t volume_id](error_t error) { syscall_t* s = call SystemCallQueue.find(&vol_queue, volume_id); erase_sync_params_t* p = s->params; p->error = error; call SystemCall.finish(s); } /**************************** Syncing ********************************/ void syncTask(syscall_t* s) { erase_sync_params_t* p = s->params; p->error = call BlockWrite.sync[s->id](); if(p->error != SUCCESS) call SystemCall.finish(s); } command error_t BlockingBlock.sync[uint8_t volume_id]() { syscall_t s; erase_sync_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&vol_queue, &s); } call SystemCall.start(&syncTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void BlockWrite.syncDone[uint8_t volume_id](error_t error) { syscall_t* s = call SystemCallQueue.find(&vol_queue, volume_id); erase_sync_params_t* p = s->params; p->error = error; call SystemCall.finish(s); } default command error_t BlockRead.read[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t BlockRead.computeCrc[uint8_t volume_id](storage_addr_t addr, storage_len_t len, uint16_t crc) { return FAIL; } default command storage_len_t BlockRead.getSize[uint8_t volume_id]() { return 0; } default command error_t BlockWrite.write[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t BlockWrite.erase[uint8_t volume_id]() { return FAIL; } default command error_t BlockWrite.sync[uint8_t volume_id]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingBlockStorageP.nc000066400000000000000000000043731207233610700255410ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ configuration BlockingBlockStorageP { provides { interface BlockingBlock[uint8_t id]; } uses { interface BlockRead[uint8_t id]; interface BlockWrite[uint8_t id]; } } implementation { components MainC, BlockingBlockStorageImplP; MainC.SoftwareInit -> BlockingBlockStorageImplP; BlockingBlock = BlockingBlockStorageImplP; BlockRead = BlockingBlockStorageImplP; BlockWrite = BlockingBlockStorageImplP; components SystemCallC; components SystemCallQueueC; BlockingBlockStorageImplP.SystemCall -> SystemCallC; BlockingBlockStorageImplP.SystemCallQueue -> SystemCallQueueC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingBootC.nc000066400000000000000000000037411207233610700240460ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ generic configuration BlockingBootC() { provides { interface Boot as BlockingBoot; } uses { interface Boot; } } implementation { components SystemCallC; components new BlockingBootP(); BlockingBoot = BlockingBootP; Boot = BlockingBootP; BlockingBootP.SystemCall -> SystemCallC; components LedsC; BlockingBootP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingBootP.nc000066400000000000000000000040141207233610700240550ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ generic module BlockingBootP() { provides { interface Boot as BlockingBoot; } uses { interface Boot; interface SystemCall; interface Leds; } } implementation { void bootTask(syscall_t* s) { signal BlockingBoot.booted(); call SystemCall.finish(s); } event void Boot.booted() { syscall_t s; call SystemCall.start(&bootTask, &s, INVALID_ID, NULL); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingConfigStorageC.nc000066400000000000000000000044361207233610700256770ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #define UQ_BLOCKING_CONFIG_STORAGE_VOLUME "Blocking.Config.Storage.Volume" generic configuration BlockingConfigStorageC(volume_id_t volume_id) { provides { interface BlockingConfig; interface BlockingMount; } } implementation { enum { VOLUME_ID = unique(UQ_BLOCKING_CONFIG_STORAGE_VOLUME), }; components new ConfigStorageC(volume_id), BlockingConfigStorageP; BlockingConfig = BlockingConfigStorageP.BlockingConfig[VOLUME_ID]; BlockingMount = BlockingConfigStorageP.BlockingMount[VOLUME_ID]; BlockingConfigStorageP.ConfigStorage[VOLUME_ID] -> ConfigStorageC; BlockingConfigStorageP.ConfigMount[VOLUME_ID] -> ConfigStorageC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingConfigStorageImplP.nc000066400000000000000000000165361207233610700265420ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ module BlockingConfigStorageImplP { provides { interface Init; interface BlockingConfig[uint8_t volume_id]; interface BlockingMount[uint8_t volume_id]; } uses { interface ConfigStorage[uint8_t volume_id]; interface Mount as ConfigMount[uint8_t volume_id]; interface SystemCall; interface SystemCallQueue; } } implementation { typedef struct read_write_params { storage_addr_t addr; void* buf; storage_len_t* len; error_t error; } read_write_params_t; typedef struct commit_mount_params { error_t error; } commit_mount_params_t; syscall_queue_t vol_queue; command error_t Init.init() { call SystemCallQueue.init(&vol_queue); return SUCCESS; } command storage_len_t BlockingConfig.getSize[uint8_t volume_id]() { return call ConfigStorage.getSize[volume_id](); } command bool BlockingConfig.valid[uint8_t volume_id]() { return call ConfigStorage.valid[volume_id](); } /**************************** Reading ********************************/ void readTask(syscall_t* s) { read_write_params_t* p = s->params; p->error = call ConfigStorage.read[s->id](p->addr, p->buf, *(p->len)); if(p->error != SUCCESS) { call SystemCall.finish(s); } } command error_t BlockingConfig.read[uint8_t volume_id](storage_addr_t addr, void *buf, storage_len_t* len) { syscall_t s; read_write_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) { return EBUSY; } call SystemCallQueue.enqueue(&vol_queue, &s); } p.addr = addr; p.buf = buf; p.len = len; call SystemCall.start(&readTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void ConfigStorage.readDone[uint8_t volume_id](storage_addr_t addr, void *buf, storage_len_t len, error_t error) { syscall_t* s = call SystemCallQueue.find(&vol_queue, volume_id); read_write_params_t* p = s->params; p->error = error; *(p->len) = len; call SystemCall.finish(s); } /**************************** Writing ********************************/ void writeTask(syscall_t* s) { read_write_params_t* p = s->params; p->error = call ConfigStorage.write[s->id](p->addr, p->buf, *(p->len)); if(p->error != SUCCESS) { call SystemCall.finish(s); } } command error_t BlockingConfig.write[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t* len) { syscall_t s; read_write_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) { return EBUSY; } call SystemCallQueue.enqueue(&vol_queue, &s); } p.addr = addr; p.buf = buf; p.len = len; call SystemCall.start(&writeTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void ConfigStorage.writeDone[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len, error_t error) { syscall_t* s = call SystemCallQueue.find(&vol_queue, volume_id); read_write_params_t* p = s->params; *(p->len) = len; p->error = error; call SystemCall.finish(s); } /**************************** Committing ********************************/ void commitTask(syscall_t* s) { commit_mount_params_t* p = s->params; p->error = call ConfigStorage.commit[s->id](); if(p->error != SUCCESS) { call SystemCall.finish(s); } } command error_t BlockingConfig.commit[uint8_t volume_id]() { syscall_t s; commit_mount_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) { return EBUSY; } call SystemCallQueue.enqueue(&vol_queue, &s); } call SystemCall.start(&commitTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void ConfigStorage.commitDone[uint8_t volume_id](error_t error) { syscall_t* s = call SystemCallQueue.find(&vol_queue, volume_id); commit_mount_params_t* p = s->params; p->error = error; call SystemCall.finish(s); } /**************************** Mounting ********************************/ void mountTask(syscall_t* s) { commit_mount_params_t* p = s->params; p->error = call ConfigMount.mount[s->id](); if(p->error != SUCCESS) { call SystemCall.finish(s); } } command error_t BlockingMount.mount[uint8_t volume_id]() { syscall_t s; commit_mount_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) { return EBUSY; } call SystemCallQueue.enqueue(&vol_queue, &s); } call SystemCall.start(&mountTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void ConfigMount.mountDone[uint8_t volume_id](error_t error) { syscall_t* s = call SystemCallQueue.find(&vol_queue, volume_id); commit_mount_params_t* p = s->params; p->error = error; call SystemCall.finish(s); } default command error_t ConfigStorage.read[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t ConfigStorage.write[uint8_t volume_id](storage_addr_t addr, void* buf, storage_len_t len) { return FAIL; } default command error_t ConfigStorage.commit[uint8_t volume_id]() { return FAIL; } default command storage_len_t ConfigStorage.getSize[uint8_t volume_id]() { return 0; } default command bool ConfigStorage.valid[uint8_t volume_id]() { return FALSE; } default command error_t ConfigMount.mount[uint8_t volume_id]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingConfigStorageP.nc000066400000000000000000000045621207233610700257140ustar00rootroot00000000000000/* * Copyright (c) 2009 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ configuration BlockingConfigStorageP { provides { interface BlockingConfig[uint8_t id]; interface BlockingMount[uint8_t id]; } uses { interface ConfigStorage[uint8_t id]; interface Mount as ConfigMount[uint8_t id]; } } implementation { components MainC, SystemCallC, SystemCallQueueC, BlockingConfigStorageImplP; MainC.SoftwareInit -> BlockingConfigStorageImplP; BlockingConfig = BlockingConfigStorageImplP; BlockingMount = BlockingConfigStorageImplP; ConfigStorage = BlockingConfigStorageImplP; ConfigMount = BlockingConfigStorageImplP; BlockingConfigStorageImplP.SystemCall -> SystemCallC; BlockingConfigStorageImplP.SystemCallQueue -> SystemCallQueueC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingLogStorageC.nc000066400000000000000000000042661207233610700252140ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #include "Storage.h" #define UQ_BLOCKING_LOG_STORAGE_VOLUME "Blocking.Log.Storage.Volume" generic configuration BlockingLogStorageC(volume_id_t volume_id, bool circular) { provides { interface BlockingLog; } } implementation { enum { VOLUME_ID = unique(UQ_BLOCKING_LOG_STORAGE_VOLUME), }; components new LogStorageC(volume_id, circular), BlockingLogStorageP; BlockingLog = BlockingLogStorageP.BlockingLog[VOLUME_ID]; BlockingLogStorageP.LogRead[VOLUME_ID] -> LogStorageC; BlockingLogStorageP.LogWrite[VOLUME_ID] -> LogStorageC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingLogStorageImplP.nc000066400000000000000000000206071207233610700260500ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ module BlockingLogStorageImplP { provides { interface Init; interface BlockingLog[uint8_t volume_id]; } uses { interface LogRead[uint8_t volume_id]; interface LogWrite[uint8_t volume_id]; interface SystemCall; interface SystemCallQueue; } } implementation { typedef struct read_params { void *buf; storage_len_t* len; error_t error; } read_params_t; typedef struct append_params { void *buf; storage_len_t* len; bool* recordsLost; error_t error; } append_params_t; typedef struct seek_params { storage_cookie_t offset; error_t error; } seek_params_t; typedef struct erase_sync_params { error_t error; } erase_sync_params_t; syscall_queue_t vol_queue; command error_t Init.init() { call SystemCallQueue.init(&vol_queue); return SUCCESS; } // ===== READ ===== // void readTask(syscall_t *s) { read_params_t *p = s->params; p->error = call LogRead.read[s->id](p->buf, *(p->len)); if(p->error != SUCCESS) { call SystemCall.finish(s); } } command error_t BlockingLog.read[uint8_t volume_id](void *buf, storage_len_t *len) { syscall_t s; read_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&vol_queue, &s); } p.buf = buf; p.len = len; call SystemCall.start(&readTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void LogRead.readDone[uint8_t volume_id](void *buf, storage_len_t len, error_t error) { syscall_t *s = call SystemCallQueue.find(&vol_queue, volume_id); read_params_t *p = s->params; if (p->buf == buf) { p->error = error; *(p->len) = len; call SystemCall.finish(s); } } // ===== SEEK ===== // void seekTask(syscall_t *s) { seek_params_t *p = s->params; p->error = call LogRead.seek[s->id](p->offset); if(p->error != SUCCESS) { call SystemCall.finish(s); } } command error_t BlockingLog.seek[uint8_t volume_id](storage_cookie_t offset) { syscall_t s; seek_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&vol_queue, &s); } p.offset = offset; call SystemCall.start(&seekTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void LogRead.seekDone[uint8_t volume_id](error_t error) { syscall_t *s = call SystemCallQueue.find(&vol_queue, volume_id); seek_params_t *p = s->params; p->error = error; call SystemCall.finish(s); } // ===== APPEND ===== // void appendTask(syscall_t *s) { append_params_t *p = s->params; p->error = call LogWrite.append[s->id](p->buf, *(p->len)); if(p->error != SUCCESS) { call SystemCall.finish(s); } } command error_t BlockingLog.append[uint8_t volume_id](void* buf, storage_len_t *len, bool *recordsLost) { syscall_t s; append_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&vol_queue, &s); } p.buf = buf; p.len = len; p.recordsLost = recordsLost; call SystemCall.start(&appendTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void LogWrite.appendDone[uint8_t volume_id](void* buf, storage_len_t len, bool recordsLost, error_t error) { syscall_t *s = call SystemCallQueue.find(&vol_queue, volume_id); append_params_t *p = s->params; if (p->buf == buf) { p->error = error; *(p->len) = len; *(p->recordsLost) = recordsLost; call SystemCall.finish(s); } } // ===== ERASE ===== // void eraseTask(syscall_t *s) { erase_sync_params_t *p = s->params; p->error = call LogWrite.erase[s->id](); if(p->error != SUCCESS) { call SystemCall.finish(s); } } command error_t BlockingLog.erase[uint8_t volume_id]() { syscall_t s; erase_sync_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&vol_queue, &s); } call SystemCall.start(&eraseTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void LogWrite.eraseDone[uint8_t volume_id](error_t error) { syscall_t *s = call SystemCallQueue.find(&vol_queue, volume_id); erase_sync_params_t *p = s->params; p->error = error; call SystemCall.finish(s); } // ===== SYNC ===== // void syncTask(syscall_t *s) { erase_sync_params_t *p = s->params; p->error = call LogWrite.sync[s->id](); if(p->error != SUCCESS) { call SystemCall.finish(s); } } command error_t BlockingLog.sync[uint8_t volume_id]() { syscall_t s; erase_sync_params_t p; atomic { if(call SystemCallQueue.find(&vol_queue, volume_id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&vol_queue, &s); } call SystemCall.start(&syncTask, &s, volume_id, &p); atomic { call SystemCallQueue.remove(&vol_queue, &s); return p.error; } } event void LogWrite.syncDone[uint8_t volume_id](error_t error) { syscall_t *s = call SystemCallQueue.find(&vol_queue, volume_id); erase_sync_params_t *p = s->params; p->error = error; call SystemCall.finish(s); } // ===== MISC ===== // command storage_cookie_t BlockingLog.currentWriteOffset[uint8_t volume_id]() { return call LogWrite.currentOffset[volume_id](); } command storage_cookie_t BlockingLog.currentReadOffset[uint8_t volume_id]() { return call LogRead.currentOffset[volume_id](); } command storage_len_t BlockingLog.getSize[uint8_t volume_id]() { return call LogRead.getSize[volume_id](); } default command error_t LogRead.read[uint8_t volume_id](void* buf, storage_len_t len) { return FAIL; } default command storage_cookie_t LogRead.currentOffset[uint8_t volume_id]() { return SEEK_BEGINNING; } default command error_t LogRead.seek[uint8_t volume_id](storage_cookie_t offset) { return FAIL; } default command storage_len_t LogRead.getSize[uint8_t volume_id]() { return 0; } default command error_t LogWrite.append[uint8_t volume_id](void* buf, storage_len_t len) { return FAIL; } default command storage_cookie_t LogWrite.currentOffset[uint8_t volume_id]() { return SEEK_BEGINNING; } default command error_t LogWrite.erase[uint8_t volume_id]() { return FAIL; } default command error_t LogWrite.sync[uint8_t volume_id]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingLogStorageP.nc000066400000000000000000000043371207233610700252300ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ configuration BlockingLogStorageP { provides { interface BlockingLog[uint8_t id]; } uses { interface LogRead[uint8_t id]; interface LogWrite[uint8_t id]; } } implementation { components MainC, BlockingLogStorageImplP; MainC.SoftwareInit -> BlockingLogStorageImplP; BlockingLog = BlockingLogStorageImplP; LogRead = BlockingLogStorageImplP; LogWrite = BlockingLogStorageImplP; components SystemCallC, SystemCallQueueC; BlockingLogStorageImplP.SystemCall -> SystemCallC; BlockingLogStorageImplP.SystemCallQueue -> SystemCallQueueC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingReadP.nc000066400000000000000000000061551207233610700240350ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ generic module BlockingReadP() { provides { interface Init; interface BlockingRead as BlockingRead[uint8_t client]; } uses { interface Read as Read[uint8_t client]; interface SystemCall; interface SystemCallQueue; } } implementation { typedef struct read_params { uint16_t* val; error_t error; } read_params_t; syscall_queue_t read_queue; command error_t Init.init() { call SystemCallQueue.init(&read_queue); return SUCCESS; } /**************************** Read ********************************/ void readTask(syscall_t* s) { read_params_t* p = s->params; p->error = call Read.read[s->id](); if(p->error != SUCCESS) { call SystemCall.finish(s); } } command error_t BlockingRead.read[uint8_t id](uint16_t* val) { syscall_t s; read_params_t p; atomic { if(call SystemCallQueue.find(&read_queue, id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&read_queue, &s); } p.val = val; call SystemCall.start(&readTask, &s, id, &p); atomic { call SystemCallQueue.remove(&read_queue, &s); return p.error; } } event void Read.readDone[uint8_t id]( error_t result, uint16_t val ) { syscall_t* s = call SystemCallQueue.find(&read_queue, id); read_params_t* p = s->params; *(p->val) = val; p->error = result; call SystemCall.finish(s); } default command error_t Read.read[uint8_t id]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingReadStreamP.nc000066400000000000000000000072321207233610700252060ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ generic module BlockingReadStreamP() { provides { interface Init; interface BlockingReadStream as BlockingReadStream[uint8_t streamClient]; } uses { interface ReadStream as ReadStream[uint8_t streamClient]; interface SystemCall; interface SystemCallQueue; } } implementation { typedef struct readstream_params { uint32_t* usPeriod; uint16_t* buf; uint16_t* count; error_t error; } readstream_params_t; syscall_queue_t readstream_queue; command error_t Init.init() { call SystemCallQueue.init(&readstream_queue); return SUCCESS; } /**************************** ReadStream ********************************/ void readStreamTask(syscall_t* s) { readstream_params_t* p = s->params; p->error = call ReadStream.postBuffer[s->id](p->buf, *(p->count)); if(p->error == SUCCESS) p->error = call ReadStream.read[s->id](*(p->usPeriod)); if(p->error != SUCCESS) call SystemCall.finish(s); } command error_t BlockingReadStream.read[uint8_t id](uint32_t* usPeriod, uint16_t* buf, uint16_t count) { syscall_t s; readstream_params_t p; atomic { if(call SystemCallQueue.find(&readstream_queue, id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&readstream_queue, &s); } p.usPeriod = usPeriod; p.buf = buf; p.count = &count; call SystemCall.start(&readStreamTask, &s, id, &p); atomic { call SystemCallQueue.remove(&readstream_queue, &s); return p.error; } } event void ReadStream.bufferDone[uint8_t id](error_t result, uint16_t* buf, uint16_t count) { //Should never get here!!!!!! } event void ReadStream.readDone[uint8_t id](error_t result, uint32_t usPeriod) { syscall_t* s = call SystemCallQueue.find(&readstream_queue, id); readstream_params_t* p = s->params; *(p->usPeriod) = usPeriod; p->error = result; call SystemCall.finish(s); } default command error_t ReadStream.read[uint8_t id](uint32_t usPeriod) { return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingResourceC.nc000066400000000000000000000041701207233610700247270ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ generic configuration BlockingResourceC() { provides { interface BlockingResource; } uses { interface Resource; } } implementation { components new BlockingResourceP(); BlockingResource = BlockingResourceP; Resource = BlockingResourceP; components ThreadSleepC; BlockingResourceP.ThreadSleep -> ThreadSleepC; components SystemCallC; components TinyThreadSchedulerC; BlockingResourceP.SystemCall -> SystemCallC; BlockingResourceP.ThreadScheduler -> TinyThreadSchedulerC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingResourceP.nc000066400000000000000000000076411207233610700247520ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ generic module BlockingResourceP() { provides { interface BlockingResource; } uses { interface SystemCall; interface ThreadScheduler; interface Resource; interface ThreadSleep; } } implementation { typedef struct params { error_t error; } params_t; syscall_t* resource_call = NULL; /**************************** Request ********************************/ void requestTask(syscall_t* s) { params_t* p = s->params; p->error = call Resource.request(); if(p->error != SUCCESS) call SystemCall.finish(s); } command error_t BlockingResource.request() { syscall_t s; params_t p; atomic { if(resource_call != NULL) return EBUSY; resource_call = &s; } call SystemCall.start(requestTask, &s, INVALID_ID, &p); atomic { resource_call = NULL; return p.error; } } event void Resource.granted() { params_t* p = resource_call->params; p->error = SUCCESS; call SystemCall.finish(resource_call); } /**************************** Release ********************************/ void releaseTask(syscall_t* s) { params_t* p = s->params; p->error = call Resource.release(); call SystemCall.finish(s); } command error_t BlockingResource.release() { syscall_t s; params_t p; atomic { if(resource_call != NULL) return EBUSY; resource_call = &s; } call SystemCall.start(releaseTask, &s, INVALID_ID, &p); atomic { resource_call = NULL; return p.error; } } /************************* Timed Release *****************************/ command error_t BlockingResource.timedRelease(uint32_t milli) { syscall_t s; params_t p; atomic { if(resource_call != NULL) return EBUSY; resource_call = &s; } if(milli != 0) call ThreadSleep.sleep(milli); call SystemCall.start(releaseTask, &s, INVALID_ID, &p); if(p.error == SUCCESS) call SystemCall.start(requestTask, &s, INVALID_ID, &p); atomic { resource_call = NULL; return p.error; } } /************************* isOwner pass through *****************************/ command bool BlockingResource.isOwner() { return call Resource.isOwner(); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingSendC.nc000066400000000000000000000037471207233610700240420ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #define UQ_BLOCKING_SEND "Blocking.Send" generic configuration BlockingSendC() { provides { interface BlockingSend; } uses { interface Send; } } implementation { enum { CLIENT_ID = unique(UQ_BLOCKING_SEND), }; components BlockingSendP; BlockingSend = BlockingSendP.BlockingSend[CLIENT_ID]; Send = BlockingSendP.Send[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingSendImplP.nc000066400000000000000000000067171207233610700247010ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #include "message.h" module BlockingSendImplP { provides { interface Init; interface BlockingSend[uint8_t id]; } uses { interface Send[uint8_t id]; interface SystemCall; interface SystemCallQueue; } } implementation { typedef struct params { message_t* msg; uint8_t len; error_t error; } params_t; syscall_queue_t send_queue; command error_t Init.init() { call SystemCallQueue.init(&send_queue); return SUCCESS; } void sendTask(syscall_t* s) { params_t* p = s->params; p->error = call Send.send[s->id](p->msg, p->len); if(p->error != SUCCESS) call SystemCall.finish(s); } command error_t BlockingSend.send[uint8_t id](message_t* msg, uint8_t len) { syscall_t s; params_t p; atomic { if(call SystemCallQueue.find(&send_queue, id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&send_queue, &s); } p.msg = msg; p.len = len; call SystemCall.start(&sendTask, &s, id, &p); atomic { call SystemCallQueue.remove(&send_queue, &s); return p.error; } } event void Send.sendDone[uint8_t id](message_t* msg, error_t error) { syscall_t* s = call SystemCallQueue.find(&send_queue, id); params_t* p = s->params; p->error = error; call SystemCall.finish(s); } command uint8_t BlockingSend.maxPayloadLength[uint8_t id]() { return call Send.maxPayloadLength[id](); } command void* BlockingSend.getPayload[uint8_t id](message_t* msg, uint8_t len) { return call Send.getPayload[id](msg, len); } default command error_t Send.send[uint8_t id](message_t* msg, uint8_t len) { return FAIL; } default command uint8_t Send.maxPayloadLength[uint8_t id]() { return 0; } default command void* Send.getPayload[uint8_t id](message_t* msg, uint8_t len) { return NULL; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingSendP.nc000066400000000000000000000041321207233610700240440ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ configuration BlockingSendP { provides { interface BlockingSend[uint8_t id]; } uses { interface Send[uint8_t id]; } } implementation { components MainC, SystemCallC, SystemCallQueueC, BlockingSendImplP; MainC.SoftwareInit -> BlockingSendImplP; BlockingSend = BlockingSendImplP; Send = BlockingSendImplP; BlockingSendImplP.SystemCallQueue -> SystemCallQueueC; BlockingSendImplP.SystemCall -> SystemCallC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingSerialAMReceiverC.nc000066400000000000000000000036741207233610700262720ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "AM.h" generic configuration BlockingSerialAMReceiverC(am_id_t amId) { provides { interface BlockingReceive; interface Packet; interface AMPacket; } } implementation { components BlockingSerialActiveMessageC as AM; BlockingReceive = AM.BlockingReceive[amId]; Packet = AM; AMPacket = AM; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingSerialAMReceiverP.nc000066400000000000000000000051501207233610700262760ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "AM.h" #include "thread.h" configuration BlockingSerialAMReceiverP { provides { interface BlockingReceive[uint8_t id]; interface BlockingReceive as BlockingReceiveAny; } uses { interface Receive[uint8_t id]; } } implementation { components MainC; components SerialActiveMessageC as AM; components new BlockingAMReceiverImplP(); MainC.SoftwareInit -> BlockingAMReceiverImplP; BlockingReceive = BlockingAMReceiverImplP; BlockingReceiveAny = BlockingAMReceiverImplP; Receive = BlockingAMReceiverImplP; BlockingAMReceiverImplP.Packet -> AM; components SystemCallC; components SystemCallQueueC; components TinyThreadSchedulerC; BlockingAMReceiverImplP.SystemCallQueue -> SystemCallQueueC; BlockingAMReceiverImplP.SystemCall -> SystemCallC; BlockingAMReceiverImplP.ThreadScheduler -> TinyThreadSchedulerC; components ThreadTimersC; BlockingAMReceiverImplP.Timer -> ThreadTimersC; components LedsC; BlockingAMReceiverImplP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingSerialAMSenderC.nc000066400000000000000000000037631207233610700257450ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "AM.h" generic configuration BlockingSerialAMSenderC(am_id_t AMId) { provides { interface BlockingAMSend; interface Packet; interface AMPacket; interface PacketAcknowledgements as Acks; } } implementation { components BlockingSerialActiveMessageC as AM; BlockingAMSend = AM.BlockingAMSend[AMId]; Packet = AM; AMPacket = AM; Acks = AM; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingSerialAMSenderP.nc000066400000000000000000000044561207233610700257620ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "AM.h" #include "thread.h" #include "mutex.h" configuration BlockingSerialAMSenderP { provides { interface BlockingAMSend[am_id_t amId]; } uses { interface AMSend[am_id_t amId]; } } implementation { components MainC; components SerialActiveMessageC as AM; components new BlockingAMSenderImplP(); components MutexC; components SystemCallC; components LedsC; MainC.SoftwareInit -> BlockingAMSenderImplP; BlockingAMSend = BlockingAMSenderImplP; AMSend = BlockingAMSenderImplP; BlockingAMSenderImplP.Mutex -> MutexC; BlockingAMSenderImplP.SystemCall -> SystemCallC; BlockingAMSenderImplP.Packet -> AM; BlockingAMSenderImplP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingSerialActiveMessageC.nc000066400000000000000000000047371207233610700270310ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ configuration BlockingSerialActiveMessageC { provides { interface BlockingStdControl; interface BlockingReceive[uint8_t id]; interface BlockingReceive as BlockingReceiveAny; interface BlockingAMSend[uint8_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; } } implementation { components SerialActiveMessageC as AM; components new BlockingStdControlC(); components BlockingSerialAMReceiverP as AMReceiverP; components BlockingSerialAMSenderP as AMSenderP; BlockingStdControl = BlockingStdControlC; BlockingReceive = AMReceiverP; BlockingReceiveAny = AMReceiverP; BlockingAMSend = AMSenderP; BlockingStdControlC.SplitControl -> AM; AMReceiverP.Receive -> AM.ReceiveDefault; AMSenderP.AMSend -> AM.AMSend; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingStdControlC.nc000066400000000000000000000040721207233610700252340ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #define UQ_BLOCKING_STD_CONTROL "Blocking.StdControl" generic configuration BlockingStdControlC() { provides { interface BlockingStdControl; } uses { interface SplitControl; } } implementation { enum { CLIENT_ID = unique(UQ_BLOCKING_STD_CONTROL), }; components BlockingStdControlP; BlockingStdControl = BlockingStdControlP.BlockingStdControl[CLIENT_ID]; SplitControl = BlockingStdControlP.SplitControl[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingStdControlImplP.nc000066400000000000000000000077631207233610700261050ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ module BlockingStdControlImplP { provides { interface Init; interface BlockingStdControl[uint8_t id]; } uses { interface SplitControl[uint8_t id]; interface SystemCall; interface SystemCallQueue; interface Leds; } } implementation { typedef struct params { error_t error; } params_t; syscall_queue_t std_cntrl_queue; command error_t Init.init() { call SystemCallQueue.init(&std_cntrl_queue); return SUCCESS; } /**************************** Start ********************************/ void startTask(syscall_t* s) { params_t* p = s->params; p->error = call SplitControl.start[s->id](); if(p->error != SUCCESS) call SystemCall.finish(s); } command error_t BlockingStdControl.start[uint8_t id]() { syscall_t s; params_t p; atomic { if(call SystemCallQueue.find(&std_cntrl_queue, id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&std_cntrl_queue, &s); } call SystemCall.start(&startTask, &s, id, &p); atomic { call SystemCallQueue.remove(&std_cntrl_queue, &s); return p.error; } } event void SplitControl.startDone[uint8_t id](error_t error) { syscall_t* s = call SystemCallQueue.find(&std_cntrl_queue, id); params_t* p = s->params; p->error = error; call SystemCall.finish(s); } /**************************** Stop ********************************/ void stopTask(syscall_t* s) { params_t* p = s->params; p->error = call SplitControl.stop[s->id](); if(p->error != SUCCESS) call SystemCall.finish(s); } command error_t BlockingStdControl.stop[uint8_t id]() { syscall_t s; params_t p; atomic { if(call SystemCallQueue.find(&std_cntrl_queue, id) != NULL) return EBUSY; call SystemCallQueue.enqueue(&std_cntrl_queue, &s); } call SystemCall.start(&stopTask, &s, id, &p); atomic { call SystemCallQueue.remove(&std_cntrl_queue, &s); return p.error; } } event void SplitControl.stopDone[uint8_t id](error_t error) { syscall_t* s = call SystemCallQueue.find(&std_cntrl_queue, id); params_t* p = s->params; p->error = error; call SystemCall.finish(s); } default command error_t SplitControl.start[uint8_t id]() { return FAIL; } default command error_t SplitControl.stop[uint8_t id]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/BlockingStdControlP.nc000066400000000000000000000043361207233610700252540ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ configuration BlockingStdControlP { provides { interface BlockingStdControl[uint8_t id]; } uses { interface SplitControl[uint8_t id]; } } implementation { components MainC; components BlockingStdControlImplP; components LedsC; MainC.SoftwareInit -> BlockingStdControlImplP; BlockingStdControl = BlockingStdControlImplP; SplitControl = BlockingStdControlImplP; BlockingStdControlImplP.Leds -> LedsC; components SystemCallC; components SystemCallQueueC; BlockingStdControlImplP.SystemCallQueue -> SystemCallQueueC; BlockingStdControlImplP.SystemCall -> SystemCallC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ConditionVariableC.nc000066400000000000000000000047651207233610700250750ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This is the barrier implementation. Every barrier has a pointer to * a linked list of threads. When a thread calls block() on a barrier * it is pushed onto the thread queue associated with that barrier and * it is blocked. Once some thread calls unblock() on a particular * barrier, all threads on that barrier's thread queue are popped off * and woken up. * * @author Kevin Klues */ #include "thread.h" #include "condvar.h" configuration ConditionVariableC { provides { interface ConditionVariable; } } implementation { components TinyThreadSchedulerC; components ThreadQueueC; components MutexC; components ConditionVariableP; ConditionVariable = ConditionVariableP; ConditionVariableP.ThreadScheduler -> TinyThreadSchedulerC; ConditionVariableP.ThreadQueue -> ThreadQueueC; ConditionVariableP.Mutex -> MutexC; components LedsC; ConditionVariableP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ConditionVariableP.nc000066400000000000000000000070101207233610700250740ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This is the barrier implementation. Every barrier has a pointer to * a linked list of threads. When a thread calls block() on a barrier * it is pushed onto the thread queue associated with that barrier and * it is blocked. Once some thread calls unblock() on a particular * barrier, all threads on that barrier's thread queue are popped off * and woken up. * * @author Kevin Klues */ module ConditionVariableP { provides { interface ConditionVariable; } uses { interface ThreadScheduler; interface ThreadQueue; interface Mutex; interface Leds; } } implementation { command void ConditionVariable.init(condvar_t* c) { //Initialize the thread queue associated with this condition variable. call ThreadQueue.init(&(c->thread_queue)); } command void ConditionVariable.wait(condvar_t* c, mutex_t* m) { atomic { //Push the thread that just called wait() onto the thread queue associated with // this condition variable call ThreadQueue.enqueue(&(c->thread_queue), call ThreadScheduler.currentThreadInfo()); call Mutex.unlock(m); call ThreadScheduler.suspendCurrentThread(); call Mutex.lock(m); } } command void ConditionVariable.signalNext(condvar_t* c) { atomic { thread_t* t; //Pop all threads currently blocking on this barrier from its thread queue if((t = call ThreadQueue.dequeue(&(c->thread_queue))) != NULL) { call ThreadScheduler.wakeupThread(t->id); } } } command void ConditionVariable.signalAll(condvar_t* c) { atomic { thread_t* t; //Pop all threads currently blocking on this barrier from its thread queue while((t = call ThreadQueue.dequeue(&(c->thread_queue))) != NULL) { call ThreadScheduler.wakeupThread(t->id); } } } command bool ConditionVariable.isBlocking(condvar_t* c) { atomic return !(call ThreadQueue.isEmpty(&(c->thread_queue))); ; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/DynamicThreadC.nc000066400000000000000000000046271207233610700242120ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" configuration DynamicThreadC { provides { interface DynamicThread; interface ThreadNotification[uint8_t id]; } } implementation { components DynamicThreadP; components TinyThreadSchedulerC; components BitArrayUtilsC; components ThreadSleepC; components TosMallocC; DynamicThread = DynamicThreadP; ThreadNotification = DynamicThreadP.ThreadNotification; DynamicThreadP.ThreadSleep -> ThreadSleepC; DynamicThreadP.ThreadScheduler -> TinyThreadSchedulerC; DynamicThreadP.BitArrayUtils -> BitArrayUtilsC; DynamicThreadP.Malloc -> TosMallocC; components ThreadMapC; ThreadMapC.DynamicThreadInfo -> DynamicThreadP; DynamicThreadP.ThreadCleanup -> ThreadMapC.DynamicThreadCleanup; components LedsC; DynamicThreadP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/DynamicThreadP.nc000066400000000000000000000131411207233610700242160ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #include "thread.h" module DynamicThreadP { provides { interface DynamicThread; interface ThreadInfo[uint8_t]; interface ThreadNotification[uint8_t]; } uses { interface ThreadCleanup[uint8_t]; interface ThreadScheduler; interface ThreadSleep; interface BitArrayUtils; interface Malloc; interface Leds; } } implementation { thread_t* thread_info[TOSTHREAD_MAX_DYNAMIC_THREADS]; uint8_t* stack_heads[TOSTHREAD_MAX_DYNAMIC_THREADS]; uint8_t thread_map[((TOSTHREAD_MAX_DYNAMIC_THREADS - 1) / 8 + 1)]; thread_id_t last_id_given = -1; enum { THREAD_OVERFLOW = TOSTHREAD_MAX_DYNAMIC_THREADS, }; thread_id_t getNextId() { thread_id_t i; for(i=last_id_given+1; inext_thread = NULL; thread_info[*t]->id = *t + TOSTHREAD_NUM_STATIC_THREADS; thread_info[*t]->init_block = NULL; thread_info[*t]->stack_ptr = (stack_ptr_t)(STACK_TOP(stack_heads[*t], stack_size)); thread_info[*t]->state = TOSTHREAD_STATE_INACTIVE; thread_info[*t]->mutex_count = 0; thread_info[*t]->start_ptr = start_routine; thread_info[*t]->start_arg_ptr = arg; thread_info[*t]->syscall = NULL; memset(&(thread_info[*t]->regs), 0, sizeof(thread_regs_t)); *t += TOSTHREAD_NUM_STATIC_THREADS; return call ThreadScheduler.initThread(*t); } return FAIL; } command error_t DynamicThread.create(tosthread_t* t, void (*start_routine)(void*), void* arg, uint16_t stack_size) { atomic { if(init(t, start_routine, arg, stack_size) == SUCCESS ) { error_t e = call ThreadScheduler.startThread(*t); if(e == SUCCESS) signal ThreadNotification.justCreated[*t](); return e; } } return FAIL; } command error_t DynamicThread.destroy(tosthread_t* t) { atomic { if(call ThreadScheduler.stopThread(*t) == SUCCESS) { signal ThreadCleanup.cleanup[*t](); return SUCCESS; } } return FAIL; } command error_t DynamicThread.pause(tosthread_t* t) { if(call BitArrayUtils.getBit(thread_map, *t-TOSTHREAD_NUM_STATIC_THREADS) == TRUE) { return call ThreadScheduler.stopThread(*t); } return FAIL; } command error_t DynamicThread.resume(tosthread_t* t) { if(call BitArrayUtils.getBit(thread_map, *t-TOSTHREAD_NUM_STATIC_THREADS) == TRUE) { return call ThreadScheduler.startThread(*t); } return FAIL; } command error_t DynamicThread.sleep(uint32_t milli) { return call ThreadSleep.sleep(milli); } command error_t DynamicThread.join(tosthread_t* t) { return call ThreadScheduler.joinThread(*t); } async command thread_t* ThreadInfo.get[uint8_t id]() { atomic return thread_info[id - TOSTHREAD_NUM_STATIC_THREADS]; } async command error_t ThreadInfo.reset[uint8_t id]() { return FAIL; } async event void ThreadCleanup.cleanup[uint8_t id]() { signal ThreadNotification.aboutToDestroy[id](); atomic { uint8_t adjusted_id = id-TOSTHREAD_NUM_STATIC_THREADS; call Malloc.free(thread_info[adjusted_id]); call BitArrayUtils.clrBit(thread_map, adjusted_id); } } default async event void ThreadNotification.justCreated[uint8_t id]() {} default async event void ThreadNotification.aboutToDestroy[uint8_t id]() {} } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/LinkedListC.nc000066400000000000000000000167011207233610700235340ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "linked_list.h" module LinkedListC { provides interface LinkedList; } implementation { list_element_t* get_elementAt(linked_list_t* l, uint8_t i) { if(i >= (l->size)) return NULL; else if((l->head) == NULL) return NULL; else { list_element_t* temp = (l->head); while(i-- > 0) { temp = temp->next; } return temp; } } list_element_t* get_element(linked_list_t* l, list_element_t* e) { list_element_t* temp = (l->head); while(temp != NULL) { if(temp == e) return temp; temp = temp->next; } return NULL; } list_element_t* get_element_before(linked_list_t* l, list_element_t* e) { list_element_t* temp = (l->head); if(temp == NULL) return NULL; while(temp->next != NULL) { if(temp->next == e) return temp;; temp = temp->next; } return NULL; } list_element_t* get_element_2before(linked_list_t* l, list_element_t* e) { list_element_t* temp = (l->head); if(temp == NULL) return NULL; if(temp->next == NULL) return NULL; while(temp->next->next != NULL) { if(temp->next->next == e) return temp; temp = temp->next->next; } return NULL; } error_t insert_element(linked_list_t* l, list_element_t** previous_next, list_element_t* e) { if(e == NULL) return FAIL; e->next = *previous_next; *previous_next = e; (l->size)++; return SUCCESS; } list_element_t* remove_element(linked_list_t* l, list_element_t** previous_next) { list_element_t* e = (*previous_next); *previous_next = (*previous_next)->next; e->next = NULL; (l->size)--; return e; } async command void LinkedList.init(linked_list_t* l) { l->head = NULL; l->size = 0; } async command void LinkedList.clear(linked_list_t* l) { list_element_t* temp = (l->head); while(temp != NULL) remove_element(l, &temp); l->head = NULL; l->size = 0; } async command uint8_t LinkedList.size(linked_list_t* l) { return (l->size); } async command error_t LinkedList.addFirst(linked_list_t* l, list_element_t* e) { return insert_element(l, &(l->head), e); } async command list_element_t* LinkedList.getFirst(linked_list_t* l) { if((l->head) == NULL) return NULL; return (l->head); } async command list_element_t* LinkedList.removeFirst(linked_list_t* l) { if((l->head) == NULL) return NULL; else return remove_element(l, &(l->head)); } async command error_t LinkedList.addLast(linked_list_t* l, list_element_t* e) { return call LinkedList.addAt(l, e, (l->size)); } async command list_element_t* LinkedList.getLast(linked_list_t* l) { return get_elementAt(l, (l->size)-1); } async command list_element_t* LinkedList.removeLast(linked_list_t* l) { return call LinkedList.removeAt(l, (l->size)-1); } async command error_t LinkedList.addAt(linked_list_t* l, list_element_t* e, uint8_t i) { if(i > (l->size)) return FAIL; else if(i == 0) return insert_element(l, &(l->head), e); else { list_element_t* temp = get_elementAt(l, i-1); return insert_element(l, &(temp->next), e); } } async command list_element_t* LinkedList.getAt(linked_list_t* l, uint8_t i) { list_element_t* temp = get_elementAt(l, i); if(temp == NULL) return NULL; return temp; } async command list_element_t* LinkedList.removeAt(linked_list_t* l, uint8_t i) { if(i == 0) return call LinkedList.removeFirst(l); else { list_element_t* temp = get_elementAt(l, i-1); if(temp == NULL) return NULL; else return remove_element(l, &(temp->next)); } } async command error_t LinkedList.addAfter(linked_list_t* l, list_element_t* first, list_element_t* second) { list_element_t* temp = get_element(l, first); if(temp == NULL) return FAIL; else return insert_element(l, &(temp->next), second); } async command error_t LinkedList.addBefore(linked_list_t* l, list_element_t* first, list_element_t* e) { list_element_t* temp; if((l->head) == NULL) return FAIL; if((l->head) == first) return insert_element(l, &(l->head), e); temp = get_element_before(l, first); if(temp == NULL) return FAIL; else return insert_element(l, &(temp->next), e); } async command list_element_t* LinkedList.getAfter(linked_list_t* l, list_element_t* e) { list_element_t* temp = get_element(l, e); if(temp == NULL) return NULL; if(temp->next == NULL) return NULL; return temp->next; } async command list_element_t* LinkedList.getBefore(linked_list_t* l, list_element_t* e) { list_element_t* temp = get_element_before(l, e); if(temp == NULL) return NULL; return temp; } async command list_element_t* LinkedList.remove(linked_list_t* l, list_element_t* e) { list_element_t* temp; if((l->head) == NULL) return NULL; if((l->head) == e) return remove_element(l, &(l->head)); temp = get_element_before(l, e); if(temp == NULL) return NULL; else return remove_element(l, &(temp->next)); } async command list_element_t* LinkedList.removeBefore(linked_list_t* l, list_element_t* e) { list_element_t* temp; if((l->head) == NULL) return NULL; if((l->head)->next == NULL) return NULL; if((l->head)->next == e) return remove_element(l, &(l->head)); temp = get_element_2before(l, e); if(temp == NULL) return NULL; else return remove_element(l, &(temp->next)); } async command list_element_t* LinkedList.removeAfter(linked_list_t* l, list_element_t* e) { list_element_t* temp = get_element(l, e); if(temp == NULL) return NULL; else return remove_element(l, &(temp->next)); } async command uint8_t LinkedList.indexOf(linked_list_t* l, list_element_t* e) { int i = -1; list_element_t* temp = (l->head); while(temp != NULL) { i++; if(temp == e) break; temp = temp->next; } return i; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/MainC.nc000066400000000000000000000064431207233610700223600ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * * Date last modified: $Id: MainC.nc,v 1.4 2010-06-29 22:07:52 scipio Exp $ */ /** * MainC is the system interface the TinyOS boot sequence. It wires the * boot sequence implementation to the scheduler and hardware resources. * * @author Philip Levis * @author Kevin Klues */ #include "hardware.h" configuration MainC { provides interface Boot; uses { interface Init as SoftwareInit; } } implementation { components PlatformC; components TinyOSMainP; components RealMainP; components TinyTaskSchedulerC; components TinyThreadSchedulerC; components StaticThreadC; #ifdef SAFE_TINYOS components SafeFailureHandlerC; #endif // Export the SoftwareInit and Boot for applications SoftwareInit = TinyOSMainP.SoftwareInit; Boot = TinyOSMainP; //Wire up the platform specific code TinyOSMainP.PlatformInit -> PlatformC; TinyOSMainP.TaskScheduler -> TinyTaskSchedulerC; //Wire up the interdependent task and thread schedulers TinyTaskSchedulerC.ThreadScheduler -> TinyThreadSchedulerC; //Wire up the TinyOS code to its thread StaticThreadC.ThreadInfo[TOSTHREAD_TOS_THREAD_ID] -> TinyOSMainP; TinyOSMainP.TinyOSBoot -> TinyThreadSchedulerC; //Wire up the thread scheduler to start running TinyThreadSchedulerC.ThreadSchedulerBoot -> RealMainP; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/MutexC.nc000066400000000000000000000036601207233610700225740ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" #include "mutex.h" configuration MutexC { provides { interface Mutex; } } implementation { components ThreadQueueC; components TinyThreadSchedulerC; components MutexP; Mutex = MutexP; MutexP.ThreadQueue -> ThreadQueueC; MutexP.ThreadScheduler -> TinyThreadSchedulerC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/MutexP.nc000066400000000000000000000051451207233610700226110ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module MutexP { provides { interface Mutex; } uses { interface ThreadQueue; interface ThreadScheduler; } } implementation { command void Mutex.init(mutex_t* m) { m->lock = FALSE; call ThreadQueue.init(&(m->thread_queue)); } command error_t Mutex.lock(mutex_t* m) { atomic { thread_t* t = call ThreadScheduler.currentThreadInfo(); if(m->lock == FALSE) { m->lock = TRUE; t->mutex_count++; } else { call ThreadQueue.enqueue(&(m->thread_queue), t); call ThreadScheduler.suspendCurrentThread(); } return SUCCESS; } } command error_t Mutex.unlock(mutex_t* m) { atomic { if(m->lock == TRUE) { thread_t* t = call ThreadScheduler.currentThreadInfo(); t->mutex_count--; if((t = call ThreadQueue.dequeue(&(m->thread_queue))) != NULL) call ThreadScheduler.wakeupThread(t->id); else m->lock = FALSE; } return SUCCESS; } } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/PlatformInterruptC.nc000066400000000000000000000037611207233610700251750ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ configuration PlatformInterruptC { provides { interface PlatformInterrupt; } } implementation { components TinyThreadSchedulerC; components TinyTaskSchedulerC; components TOSThreadsInterruptP; PlatformInterrupt = TOSThreadsInterruptP; TOSThreadsInterruptP.ThreadScheduler -> TinyThreadSchedulerC; TOSThreadsInterruptP.TaskScheduler -> TinyTaskSchedulerC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/PoolThreadC.nc000066400000000000000000000046151207233610700235340ustar00rootroot00000000000000 /** * @author Jeongyeup Paek (jpaek@enl.usc.edu) */ #include "thread.h" #include "poolthread.h" configuration PoolThreadC { provides { interface PoolThread; interface ThreadNotification[uint8_t id]; } } implementation { components MainC, PoolThreadP, ThreadP; PoolThread = PoolThreadP; ThreadNotification = ThreadP.StaticThreadNotification; components BitArrayUtilsC; PoolThreadP.BitArrayUtils -> BitArrayUtilsC; components ThreadSleepC; PoolThreadP.ThreadSleep -> ThreadSleepC; components TinyThreadSchedulerC; PoolThreadP.ThreadScheduler -> TinyThreadSchedulerC; #if (NUM_POOL_THREADS > 0) components new ThreadC(POOL_THREAD_STACK_SIZE) as TinyThread0; PoolThreadP.TinyThread0 -> TinyThread0; PoolThreadP.ThreadInfo0 -> TinyThread0; #endif #if (NUM_POOL_THREADS > 1) components new ThreadC(POOL_THREAD_STACK_SIZE) as TinyThread1; PoolThreadP.TinyThread1 -> TinyThread1; PoolThreadP.ThreadInfo1 -> TinyThread1; #endif #if (NUM_POOL_THREADS > 2) components new ThreadC(POOL_THREAD_STACK_SIZE) as TinyThread2; PoolThreadP.TinyThread2 -> TinyThread2; PoolThreadP.ThreadInfo2 -> TinyThread2; #endif #if (NUM_POOL_THREADS > 3) components new ThreadC(POOL_THREAD_STACK_SIZE) as TinyThread3; PoolThreadP.TinyThread3 -> TinyThread3; PoolThreadP.ThreadInfo3 -> TinyThread3; #endif #if (NUM_POOL_THREADS > 4) components new ThreadC(POOL_THREAD_STACK_SIZE) as TinyThread4; PoolThreadP.TinyThread4 -> TinyThread4; PoolThreadP.ThreadInfo4 -> TinyThread4; #endif #if (NUM_POOL_THREADS > 5) components new ThreadC(POOL_THREAD_STACK_SIZE) as TinyThread5; PoolThreadP.TinyThread5 -> TinyThread5; PoolThreadP.ThreadInfo5 -> TinyThread5; #endif #if (NUM_POOL_THREADS > 6) components new ThreadC(POOL_THREAD_STACK_SIZE) as TinyThread6; PoolThreadP.TinyThread6 -> TinyThread6; PoolThreadP.ThreadInfo6 -> TinyThread6; #endif #if (NUM_POOL_THREADS > 7) components new ThreadC(POOL_THREAD_STACK_SIZE) as TinyThread7; PoolThreadP.TinyThread7 -> TinyThread7; PoolThreadP.ThreadInfo7 -> TinyThread7; #endif #if (NUM_POOL_THREADS > 8) components new ThreadC(POOL_THREAD_STACK_SIZE) as TinyThread8; PoolThreadP.TinyThread8 -> TinyThread8; PoolThreadP.ThreadInfo8 -> TinyThread8; #endif #if (NUM_POOL_THREADS > 9) components new ThreadC(POOL_THREAD_STACK_SIZE) as TinyThread9; PoolThreadP.TinyThread9 -> TinyThread9; PoolThreadP.ThreadInfo9 -> TinyThread9; #endif } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/PoolThreadP.nc000066400000000000000000000233401207233610700235450ustar00rootroot00000000000000 /** * @author Jeongyeup Paek (jpaek@enl.usc.edu) */ #include "thread.h" #include "poolthread.h" module PoolThreadP { provides { interface PoolThread; } uses { #if (NUM_POOL_THREADS > 0) interface Thread as TinyThread0; interface ThreadInfo as ThreadInfo0; #endif #if (NUM_POOL_THREADS > 1) interface Thread as TinyThread1; interface ThreadInfo as ThreadInfo1; #endif #if (NUM_POOL_THREADS > 2) interface Thread as TinyThread2; interface ThreadInfo as ThreadInfo2; #endif #if (NUM_POOL_THREADS > 3) interface Thread as TinyThread3; interface ThreadInfo as ThreadInfo3; #endif #if (NUM_POOL_THREADS > 4) interface Thread as TinyThread4; interface ThreadInfo as ThreadInfo4; #endif #if (NUM_POOL_THREADS > 5) interface Thread as TinyThread5; interface ThreadInfo as ThreadInfo5; #endif #if (NUM_POOL_THREADS > 6) interface Thread as TinyThread6; interface ThreadInfo as ThreadInfo6; #endif #if (NUM_POOL_THREADS > 7) interface Thread as TinyThread7; interface ThreadInfo as ThreadInfo7; #endif #if (NUM_POOL_THREADS > 8) interface Thread as TinyThread8; interface ThreadInfo as ThreadInfo8; #endif #if (NUM_POOL_THREADS > 9) interface Thread as TinyThread9; interface ThreadInfo as ThreadInfo9; #endif interface ThreadSleep; interface BitArrayUtils; interface ThreadScheduler; } } implementation { typedef struct pool_item { thread_t* info; } pool_item_t; pool_item_t m_list[NUM_POOL_THREADS]; uint8_t thread_map[((NUM_POOL_THREADS - 1) / 8 + 1)]; enum { THREAD_OVERFLOW = NUM_POOL_THREADS, }; error_t start_thread(uint8_t id, void* arg) { if (id >= NUM_POOL_THREADS) return FAIL; #if (NUM_POOL_THREADS > 0) if (id == 0) return call TinyThread0.start(arg); #endif #if (NUM_POOL_THREADS > 1) if (id == 1) return call TinyThread1.start(arg); #endif #if (NUM_POOL_THREADS > 2) if (id == 2) return call TinyThread2.start(arg); #endif #if (NUM_POOL_THREADS > 3) if (id == 3) return call TinyThread3.start(arg); #endif #if (NUM_POOL_THREADS > 4) if (id == 4) return call TinyThread4.start(arg); #endif #if (NUM_POOL_THREADS > 5) if (id == 5) return call TinyThread5.start(arg); #endif #if (NUM_POOL_THREADS > 6) if (id == 6) return call TinyThread6.start(arg); #endif #if (NUM_POOL_THREADS > 7) if (id == 7) return call TinyThread7.start(arg); #endif #if (NUM_POOL_THREADS > 8) if (id == 8) return call TinyThread8.start(arg); #endif #if (NUM_POOL_THREADS > 9) if (id == 9) return call TinyThread9.start(arg); #endif return FAIL; } error_t stop_thread(uint8_t id) { if (id >= NUM_POOL_THREADS) return FAIL; #if (NUM_POOL_THREADS > 0) if (id == 0) return call TinyThread0.stop(); #endif #if (NUM_POOL_THREADS > 1) if (id == 1) return call TinyThread1.stop(); #endif #if (NUM_POOL_THREADS > 2) if (id == 2) return call TinyThread2.stop(); #endif #if (NUM_POOL_THREADS > 3) if (id == 3) return call TinyThread3.stop(); #endif #if (NUM_POOL_THREADS > 4) if (id == 4) return call TinyThread4.stop(); #endif #if (NUM_POOL_THREADS > 5) if (id == 5) return call TinyThread5.stop(); #endif #if (NUM_POOL_THREADS > 6) if (id == 6) return call TinyThread6.stop(); #endif #if (NUM_POOL_THREADS > 7) if (id == 7) return call TinyThread7.stop(); #endif #if (NUM_POOL_THREADS > 8) if (id == 8) return call TinyThread8.stop(); #endif #if (NUM_POOL_THREADS > 9) if (id == 9) return call TinyThread9.stop(); #endif return FAIL; } error_t pause_thread(uint8_t id) { if (id >= NUM_POOL_THREADS) return FAIL; #if (NUM_POOL_THREADS > 0) if (id == 0) return call TinyThread0.pause(); #endif #if (NUM_POOL_THREADS > 1) if (id == 1) return call TinyThread1.pause(); #endif #if (NUM_POOL_THREADS > 2) if (id == 2) return call TinyThread2.pause(); #endif #if (NUM_POOL_THREADS > 3) if (id == 3) return call TinyThread3.pause(); #endif #if (NUM_POOL_THREADS > 4) if (id == 4) return call TinyThread4.pause(); #endif #if (NUM_POOL_THREADS > 5) if (id == 5) return call TinyThread5.pause(); #endif #if (NUM_POOL_THREADS > 6) if (id == 6) return call TinyThread6.pause(); #endif #if (NUM_POOL_THREADS > 7) if (id == 7) return call TinyThread7.pause(); #endif #if (NUM_POOL_THREADS > 8) if (id == 8) return call TinyThread8.pause(); #endif #if (NUM_POOL_THREADS > 9) if (id == 9) return call TinyThread9.pause(); #endif return FAIL; } error_t resume_thread(uint8_t id) { if (id >= NUM_POOL_THREADS) return FAIL; #if (NUM_POOL_THREADS > 0) if (id == 0) return call TinyThread0.resume(); #endif #if (NUM_POOL_THREADS > 1) if (id == 1) return call TinyThread1.resume(); #endif #if (NUM_POOL_THREADS > 2) if (id == 2) return call TinyThread2.resume(); #endif #if (NUM_POOL_THREADS > 3) if (id == 3) return call TinyThread3.resume(); #endif #if (NUM_POOL_THREADS > 4) if (id == 4) return call TinyThread4.resume(); #endif #if (NUM_POOL_THREADS > 5) if (id == 5) return call TinyThread5.resume(); #endif #if (NUM_POOL_THREADS > 6) if (id == 6) return call TinyThread6.resume(); #endif #if (NUM_POOL_THREADS > 7) if (id == 7) return call TinyThread7.resume(); #endif #if (NUM_POOL_THREADS > 8) if (id == 8) return call TinyThread8.resume(); #endif #if (NUM_POOL_THREADS > 9) if (id == 9) return call TinyThread9.resume(); #endif return FAIL; } thread_t *thread_info(uint8_t id) { if (id >= NUM_POOL_THREADS) return NULL; #if (NUM_POOL_THREADS > 0) if (id == 0) return call ThreadInfo0.get(); #endif #if (NUM_POOL_THREADS > 1) if (id == 1) return call ThreadInfo1.get(); #endif #if (NUM_POOL_THREADS > 2) if (id == 2) return call ThreadInfo2.get(); #endif #if (NUM_POOL_THREADS > 3) if (id == 3) return call ThreadInfo3.get(); #endif #if (NUM_POOL_THREADS > 4) if (id == 4) return call ThreadInfo4.get(); #endif #if (NUM_POOL_THREADS > 5) if (id == 5) return call ThreadInfo5.get(); #endif #if (NUM_POOL_THREADS > 6) if (id == 6) return call ThreadInfo6.get(); #endif #if (NUM_POOL_THREADS > 7) if (id == 7) return call ThreadInfo7.get(); #endif #if (NUM_POOL_THREADS > 8) if (id == 8) return call ThreadInfo8.get(); #endif #if (NUM_POOL_THREADS > 9) if (id == 9) return call ThreadInfo9.get(); #endif return NULL; } uint8_t getNextPoolId() { uint8_t i; for (i = 0; i < NUM_POOL_THREADS; i++) { if(call BitArrayUtils.getBit(thread_map, i) == 0) break; } if (i >= NUM_POOL_THREADS) return THREAD_OVERFLOW; return i; } command error_t PoolThread.allocate(uint8_t* id, void (*start_routine)(void*), void* arg) { thread_t *t; atomic { *id = getNextPoolId(); if (*id != THREAD_OVERFLOW) { call BitArrayUtils.setBit(thread_map, *id); t = thread_info(*id); m_list[*id].info = t; m_list[*id].info->start_ptr = start_routine; if (start_thread(*id, arg) == SUCCESS) { return SUCCESS; } else { call BitArrayUtils.clrBit(thread_map, *id); m_list[*id].info = NULL; } } } return FAIL; } command error_t PoolThread.release(uint8_t id) { atomic { call BitArrayUtils.clrBit(thread_map, id); m_list[id].info = NULL; if (stop_thread(id) == SUCCESS) return SUCCESS; } return FAIL; } command error_t PoolThread.pause(uint8_t id) { if (call BitArrayUtils.getBit(thread_map, id) == 1) { return pause_thread(id); } return FAIL; } command error_t PoolThread.resume(uint8_t id) { if (call BitArrayUtils.getBit(thread_map, id) == 1) { return resume_thread(id); } return FAIL; } uint8_t findPoolIdFromThreadId(uint8_t id) { int i; for (i = 0; i < NUM_POOL_THREADS; i++) { if (call BitArrayUtils.getBit(thread_map, i) == 1) if (m_list[i].info->id == id) return i; } return THREAD_OVERFLOW; } command error_t PoolThread.sleep(uint32_t milli) { call ThreadSleep.sleep(milli); } #if (NUM_POOL_THREADS > 0) event void TinyThread0.run(void *arg) {} #endif #if (NUM_POOL_THREADS > 1) event void TinyThread1.run(void *arg) {} #endif #if (NUM_POOL_THREADS > 2) event void TinyThread2.run(void *arg) {} #endif #if (NUM_POOL_THREADS > 3) event void TinyThread3.run(void *arg) {} #endif #if (NUM_POOL_THREADS > 4) event void TinyThread4.run(void *arg) {} #endif #if (NUM_POOL_THREADS > 5) event void TinyThread5.run(void *arg) {} #endif #if (NUM_POOL_THREADS > 6) event void TinyThread6.run(void *arg) {} #endif #if (NUM_POOL_THREADS > 7) event void TinyThread7.run(void *arg) {} #endif #if (NUM_POOL_THREADS > 8) event void TinyThread8.run(void *arg) {} #endif #if (NUM_POOL_THREADS > 9) event void TinyThread9.run(void *arg) {} #endif } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/RealMainImplP.nc000066400000000000000000000053471207233610700240250ustar00rootroot00000000000000// $Id: RealMainImplP.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: RealMainImplP.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ * */ /** * RealMain implements the TinyOS boot sequence, as documented in TEP 107. * * @author Philip Levis * @author Kevin Klues */ module RealMainImplP { provides interface Boot as ThreadSchedulerBoot; } implementation { int main() @C() @spontaneous() { atomic { // Start running the TinyOS thread scheduler signal ThreadSchedulerBoot.booted(); } /* We should never reach this point, but some versions of * gcc don't realize that and issue a warning if we return * void from a non-void function. So include this. */ return -1; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/RealMainP.nc000066400000000000000000000051431207233610700231750ustar00rootroot00000000000000// $Id: RealMainP.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: RealMainP.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ * */ /** * RealMain implements the TinyOS boot sequence, as documented in TEP 107. * * @author Philip Levis * @author Kevin Klues */ configuration RealMainP { provides interface Boot; uses interface Init as PlatformInit; uses interface Init as SoftwareInit; } implementation { components TinyOSMainP; components RealMainImplP; Boot = RealMainImplP; SoftwareInit = TinyOSMainP.SoftwareInit; PlatformInit = TinyOSMainP.PlatformInit; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ReferenceCounterC.nc000066400000000000000000000040751207233610700247310ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" #include "refcounter.h" configuration ReferenceCounterC { provides { interface ReferenceCounter; } } implementation { components TinyThreadSchedulerC; components ThreadQueueC; components ReferenceCounterP; ReferenceCounter = ReferenceCounterP; ReferenceCounterP.ThreadScheduler -> TinyThreadSchedulerC; ReferenceCounterP.ThreadQueue -> ThreadQueueC; components LedsC; ReferenceCounterP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ReferenceCounterP.nc000066400000000000000000000055451207233610700247510ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module ReferenceCounterP { provides { interface ReferenceCounter; } uses { interface ThreadScheduler; interface ThreadQueue; interface Leds; } } implementation { void signalWaiters(refcounter_t* r) { thread_t* t; while((t = call ThreadQueue.dequeue(&(r->thread_queue))) != NULL) call ThreadScheduler.wakeupThread(t->id); } async command void ReferenceCounter.init(refcounter_t* r) { atomic { r->count = 0; call ThreadQueue.init(&(r->thread_queue)); } } async command void ReferenceCounter.increment(refcounter_t* r) { atomic { if( r->count != 255 ) { r->count++; signalWaiters(r); } } } async command void ReferenceCounter.decrement(refcounter_t* r) { atomic { if( r->count > 0 ) { r->count--; signalWaiters(r); } } } async command void ReferenceCounter.waitOnValue(refcounter_t* r, uint8_t val) { atomic { while(r->count != val) { call ThreadQueue.enqueue(&(r->thread_queue), call ThreadScheduler.currentThreadInfo()); call ThreadScheduler.suspendCurrentThread(); } } } async command uint8_t ReferenceCounter.count(refcounter_t* r) { atomic return r->count; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/SchedulerBasicP.nc000066400000000000000000000111711207233610700243630ustar00rootroot00000000000000// $Id: SchedulerBasicP.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * SchedulerBasicP implements the default TinyOS scheduler sequence, as * documented in TEP 106. * * @author Philip Levis * @author Cory Sharp * @author Kevin Klues * @date January 19 2005 */ #include "hardware.h" #include "thread.h" module SchedulerBasicP { provides interface TaskScheduler; provides interface TaskBasic[uint8_t id]; uses interface ThreadScheduler; uses interface Leds; } implementation { enum { NUM_TASKS = uniqueCount("TinyTaskSchedulerC.TaskBasic"), NO_TASK = 255, }; volatile uint8_t m_head; volatile uint8_t m_tail; volatile uint8_t m_next[NUM_TASKS]; // Helper functions (internal functions) intentionally do not have atomic // sections. It is left as the duty of the exported interface functions to // manage atomicity to minimize chances for binary code bloat. // move the head forward // if the head is at the end, mark the tail at the end, too // mark the task as not in the queue inline uint8_t popTask() { if( m_head != NO_TASK ) { uint8_t id = m_head; m_head = m_next[m_head]; if( m_head == NO_TASK ) { m_tail = NO_TASK; } m_next[id] = NO_TASK; return id; } else { return NO_TASK; } } bool isWaiting( uint8_t id ) { return (m_next[id] != NO_TASK) || (m_tail == id); } async command bool TaskScheduler.hasTasks() { atomic return (m_head != NO_TASK); } bool pushTask( uint8_t id ) { if( !isWaiting(id) ) { if( m_head == NO_TASK ) { m_head = id; m_tail = id; } else { m_next[m_tail] = id; m_tail = id; } return TRUE; } else { return FALSE; } } command void TaskScheduler.init() { atomic { memset( (void *)m_next, NO_TASK, sizeof(m_next) ); m_head = NO_TASK; m_tail = NO_TASK; } } command bool TaskScheduler.runNextTask() { uint8_t nextTask; atomic { nextTask = popTask(); if( nextTask == NO_TASK ) { return FALSE; } } signal TaskBasic.runTask[nextTask](); return TRUE; } command void TaskScheduler.taskLoop() { for (;;) { uint8_t nextTask; atomic { while((nextTask = popTask()) == NO_TASK) { call ThreadScheduler.suspendCurrentThread(); } } signal TaskBasic.runTask[nextTask](); } } /** * Return SUCCESS if the post succeeded, EBUSY if it was already posted. */ async command error_t TaskBasic.postTask[uint8_t id]() { atomic { return pushTask(id) ? SUCCESS : EBUSY; } } default event void TaskBasic.runTask[uint8_t id]() {} } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/SemaphoreC.nc000066400000000000000000000041761207233610700234200ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @author Chieh-Jan Mike Liang */ #include "thread.h" #include "semaphore.h" configuration SemaphoreC { provides { interface Semaphore; } } implementation { components TinyThreadSchedulerC; components MutexC; components ConditionVariableC; components SemaphoreP; Semaphore = SemaphoreP; SemaphoreP.ThreadScheduler -> TinyThreadSchedulerC; SemaphoreP.Mutex -> MutexC; SemaphoreP.ConditionVariable -> ConditionVariableC; components LedsC; SemaphoreP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/SemaphoreP.nc000066400000000000000000000051541207233610700234320ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @author Chieh-Jan Mike Liang */ module SemaphoreP { provides { interface Semaphore; } uses { interface ThreadScheduler; interface Mutex; interface ConditionVariable; interface Leds; } } implementation { command void Semaphore.reset(semaphore_t* s, uint8_t v) { s->s = 0; s->v = v; call Mutex.init(&(s->lock)); call ConditionVariable.init(&(s->condvar)); } command error_t Semaphore.acquire(semaphore_t* s) { atomic { call Mutex.lock(&(s->lock)); s->s++; while (s->v == 0) { call ConditionVariable.wait(&(s->condvar), &(s->lock)); s->v++; } s->s--; s->v--; call Mutex.unlock(&(s->lock)); } return SUCCESS; } command error_t Semaphore.release(semaphore_t* s) { atomic { call Mutex.lock(&(s->lock)); if(s->s > 0) call ConditionVariable.signalNext(&(s->condvar)); else s->v++; call Mutex.unlock(&(s->lock)); } return SUCCESS; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/StaticThreadC.nc000066400000000000000000000045301207233610700240460ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ configuration StaticThreadC { provides { interface Thread[uint8_t id]; interface ThreadNotification[uint8_t id]; } uses { interface ThreadInfo[uint8_t id]; interface ThreadFunction[uint8_t id]; interface ThreadCleanup[uint8_t id]; } } implementation { components StaticThreadP; components ThreadMapC; Thread = StaticThreadP; ThreadNotification = StaticThreadP; ThreadCleanup = StaticThreadP; StaticThreadP.ThreadInfo = ThreadInfo; ThreadMapC.StaticThreadInfo = ThreadInfo; StaticThreadP.ThreadFunction = ThreadFunction; components ThreadSleepC; components TinyThreadSchedulerC; StaticThreadP.ThreadSleep -> ThreadSleepC; StaticThreadP.ThreadScheduler -> TinyThreadSchedulerC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/StaticThreadP.nc000066400000000000000000000073641207233610700240730ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module StaticThreadP { provides { interface Thread[uint8_t id]; interface ThreadNotification[uint8_t id]; } uses { interface ThreadScheduler; interface ThreadSleep; interface ThreadInfo[uint8_t id]; interface ThreadFunction[uint8_t id]; interface ThreadCleanup[uint8_t id]; interface Leds; } } implementation { error_t init(uint8_t id, void* arg) { error_t r1, r2; thread_t* thread_info = call ThreadInfo.get[id](); thread_info->start_arg_ptr = arg; thread_info->mutex_count = 0; thread_info->next_thread = NULL; r1 = call ThreadInfo.reset[id](); r2 = call ThreadScheduler.initThread(id); return ecombine(r1, r2); } command error_t Thread.start[uint8_t id](void* arg) { atomic { if( init(id, arg) == SUCCESS ) { error_t e = call ThreadScheduler.startThread(id); if(e == SUCCESS) signal ThreadNotification.justCreated[id](); return e; } } return FAIL; } command error_t Thread.pause[uint8_t id]() { return call ThreadScheduler.suspendCurrentThread(); } command error_t Thread.resume[uint8_t id]() { return call ThreadScheduler.wakeupThread(id); } command error_t Thread.stop[uint8_t id]() { if(call ThreadScheduler.stopThread(id) == SUCCESS) return init(id, NULL); return FAIL; } command error_t Thread.sleep[uint8_t id](uint32_t milli) { return call ThreadSleep.sleep(milli); } command error_t Thread.join[uint8_t id]() { return call ThreadScheduler.joinThread(id); } event void ThreadFunction.signalThreadRun[uint8_t id](void *arg) { signal Thread.run[id](arg); } async event void ThreadCleanup.cleanup[uint8_t id]() { signal ThreadNotification.aboutToDestroy[id](); } default event void Thread.run[uint8_t id](void* arg) {} default async command thread_t* ThreadInfo.get[uint8_t id]() {return NULL;} default async command error_t ThreadInfo.reset[uint8_t id]() {return FAIL;} default async event void ThreadNotification.justCreated[uint8_t id]() {} default async event void ThreadNotification.aboutToDestroy[uint8_t id]() {} } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/SystemCallC.nc000066400000000000000000000035731207233610700235550ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" configuration SystemCallC { provides { interface SystemCall; } } implementation { components SystemCallP; components TinyThreadSchedulerC; SystemCall = SystemCallP; SystemCallP.ThreadScheduler -> TinyThreadSchedulerC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/SystemCallP.nc000066400000000000000000000062631207233610700235710ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module SystemCallP { provides { interface SystemCall; } uses { interface ThreadScheduler; } } implementation { syscall_t* current_call = NULL; task void threadTask() { (*(current_call->syscall_ptr))(current_call); } //Had originally planned on using a thread queue here to // hold and keep track of multiple system call requests //Observation though is that only one outstanding system // call can exist in the system at any given time //Some thread calls this function, and the task gets posted, // the TOS kernel thread gets woken up, and the task is run // immediately before any other threads get the chance to // make any system calls. //If semantics change in the future, a thread queue could // be used here with a single TinyOS task servicing all them // by popping threads off the queue and reposting itself command error_t SystemCall.start(void* syscall_ptr, syscall_t* s, syscall_id_t id, void* p) { atomic { current_call = s; current_call->id = id; current_call->thread = call ThreadScheduler.currentThreadInfo(); current_call->thread->syscall = s; current_call->params = p; if(syscall_ptr != SYSCALL_WAIT_ON_EVENT) { current_call->syscall_ptr = syscall_ptr; post threadTask(); call ThreadScheduler.wakeupThread(TOSTHREAD_TOS_THREAD_ID); } return call ThreadScheduler.suspendCurrentThread(); } } command error_t SystemCall.finish( syscall_t* s ) { return call ThreadScheduler.wakeupThread(s->thread->id); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/SystemCallQueueC.nc000066400000000000000000000037571207233610700245660ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" #include "linked_list.h" #include "syscall_queue.h" configuration SystemCallQueueC { provides { interface SystemCallQueue; } } implementation { components LinkedListC; components SystemCallQueueP; SystemCallQueue = SystemCallQueueP; SystemCallQueueP.LinkedList -> LinkedListC; components LedsC; SystemCallQueueP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/SystemCallQueueP.nc000066400000000000000000000054121207233610700245710ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module SystemCallQueueP { provides { interface SystemCallQueue; } uses { interface LinkedList; interface Leds; } } implementation { async command void SystemCallQueue.init(syscall_queue_t* q) { call LinkedList.init(&(q->l)); } async command void SystemCallQueue.enqueue(syscall_queue_t* q, syscall_t* s) { s->next_call = NULL; call LinkedList.addLast(&(q->l), (list_element_t*)s); } async command syscall_t* SystemCallQueue.dequeue(syscall_queue_t* q) { return (syscall_t*)call LinkedList.removeFirst(&(q->l)); } async command syscall_t* SystemCallQueue.remove(syscall_queue_t* q, syscall_t* s) { return (syscall_t*)call LinkedList.remove(&(q->l), (list_element_t*)s); } async command syscall_t* SystemCallQueue.find(syscall_queue_t* q, uint8_t id) { syscall_t* s; for(s = (syscall_t*)(call LinkedList.getFirst(&(q->l))); s != NULL; s = (syscall_t*)(call LinkedList.getAfter(&(q->l), (list_element_t*)s)) ) { if(s->id == id) return s; } return NULL; } async command bool SystemCallQueue.isEmpty(syscall_queue_t* q) { return (call LinkedList.size(&(q->l)) == 0); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/TOSThreadsInterruptP.nc000066400000000000000000000043211207233610700253770ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module TOSThreadsInterruptP { provides { interface PlatformInterrupt; } uses { interface TaskScheduler; interface ThreadScheduler; } } implementation { void interruptThread() __attribute__((noinline)) { if(call ThreadScheduler.wakeupThread(TOSTHREAD_TOS_THREAD_ID) == SUCCESS) if(call ThreadScheduler.currentThreadId() != TOSTHREAD_TOS_THREAD_ID) call ThreadScheduler.interruptCurrentThread(); } inline async command void PlatformInterrupt.postAmble() { atomic { if(call TaskScheduler.hasTasks() == TRUE ) interruptThread(); } } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ThreadC.nc000066400000000000000000000046411207233610700227010ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" generic configuration ThreadC(uint16_t stack_size) { provides { interface Thread; interface ThreadNotification; interface ThreadInfo; } } implementation { enum { THREAD_ID = unique(UQ_TOS_THREAD), }; components MainC; components new ThreadInfoP(stack_size, THREAD_ID); components StaticThreadC; components ThreadMapC; MainC.SoftwareInit -> ThreadInfoP; Thread = StaticThreadC.Thread[THREAD_ID]; ThreadNotification = StaticThreadC.ThreadNotification[THREAD_ID]; ThreadInfo = ThreadInfoP; StaticThreadC.ThreadFunction[THREAD_ID] -> ThreadInfoP; StaticThreadC.ThreadCleanup[THREAD_ID] -> ThreadMapC.StaticThreadCleanup[THREAD_ID]; StaticThreadC.ThreadInfo[THREAD_ID] -> ThreadInfoP; components LedsC; ThreadInfoP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ThreadInfoMapP.nc000066400000000000000000000047441207233610700241740ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module ThreadInfoMapP { provides { interface ThreadInfo[uint8_t id]; interface ThreadCleanup as StaticThreadCleanup[uint8_t id]; interface ThreadCleanup as DynamicThreadCleanup[uint8_t id]; } uses { interface ThreadInfo as StaticThreadInfo[uint8_t id]; interface ThreadInfo as DynamicThreadInfo[uint8_t id]; interface ThreadCleanup[uint8_t id]; interface Leds; } } implementation { async command thread_t* ThreadInfo.get[uint8_t id]() { return call StaticThreadInfo.get[id](); } default async command thread_t* StaticThreadInfo.get[uint8_t id]() { return call DynamicThreadInfo.get[id](); } async event void ThreadCleanup.cleanup[uint8_t id]() { signal StaticThreadCleanup.cleanup[id](); } default async event void StaticThreadCleanup.cleanup[uint8_t id]() { signal DynamicThreadCleanup.cleanup[id](); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ThreadInfoP.nc000066400000000000000000000051431207233610700235300ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ generic module ThreadInfoP(uint16_t stack_size, uint8_t thread_id) { provides { interface Init; interface ThreadInfo; interface ThreadFunction; } uses { interface Leds; } } implementation { uint8_t stack[stack_size]; thread_t thread_info; void run_thread(void* arg) __attribute__((noinline)) { signal ThreadFunction.signalThreadRun(arg); } error_t init() { thread_info.next_thread = NULL; thread_info.id = thread_id; thread_info.init_block = NULL; thread_info.stack_ptr = (stack_ptr_t)(STACK_TOP(stack, sizeof(stack))); thread_info.state = TOSTHREAD_STATE_INACTIVE; thread_info.mutex_count = 0; thread_info.start_ptr = run_thread; thread_info.start_arg_ptr = NULL; thread_info.syscall = NULL; return SUCCESS; } command error_t Init.init() { return init(); } async command error_t ThreadInfo.reset() { return init(); } async command thread_t* ThreadInfo.get() { return &thread_info; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ThreadMapC.nc000066400000000000000000000044711207233610700233400ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ configuration ThreadMapC { provides { interface ThreadCleanup as StaticThreadCleanup[uint8_t id]; interface ThreadCleanup as DynamicThreadCleanup[uint8_t id]; } uses { interface ThreadInfo as StaticThreadInfo[uint8_t id]; interface ThreadInfo as DynamicThreadInfo[uint8_t id]; } } implementation { components TinyThreadSchedulerC; components ThreadMapP; TinyThreadSchedulerC.ThreadInfo -> ThreadMapP; ThreadMapP.StaticThreadInfo = StaticThreadInfo; ThreadMapP.DynamicThreadInfo = DynamicThreadInfo; ThreadMapP.ThreadCleanup -> TinyThreadSchedulerC; DynamicThreadCleanup = ThreadMapP.DynamicThreadCleanup; StaticThreadCleanup = ThreadMapP.StaticThreadCleanup; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ThreadMapP.nc000066400000000000000000000060611207233610700233520ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module ThreadMapP { provides { interface ThreadInfo[uint8_t id]; interface ThreadCleanup as StaticThreadCleanup[uint8_t id]; interface ThreadCleanup as DynamicThreadCleanup[uint8_t id]; } uses { interface ThreadInfo as StaticThreadInfo[uint8_t id]; interface ThreadInfo as DynamicThreadInfo[uint8_t id]; interface ThreadCleanup[uint8_t id]; interface Leds; } } implementation { async command thread_t* ThreadInfo.get[uint8_t id]() { return call StaticThreadInfo.get[id](); } async command error_t ThreadInfo.reset[uint8_t id]() { return call StaticThreadInfo.reset[id](); } default async command thread_t* StaticThreadInfo.get[uint8_t id]() { return call DynamicThreadInfo.get[id](); } default async command error_t StaticThreadInfo.reset[uint8_t id]() { return call DynamicThreadInfo.reset[id](); } default async command thread_t* DynamicThreadInfo.get[uint8_t id]() { return call StaticThreadInfo.get[id](); } default async command error_t DynamicThreadInfo.reset[uint8_t id]() { return call StaticThreadInfo.reset[id](); } async event void ThreadCleanup.cleanup[uint8_t id]() { signal StaticThreadCleanup.cleanup[id](); } default async event void StaticThreadCleanup.cleanup[uint8_t id]() { signal DynamicThreadCleanup.cleanup[id](); } default async event void DynamicThreadCleanup.cleanup[uint8_t id]() { signal StaticThreadCleanup.cleanup[id](); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ThreadQueueC.nc000066400000000000000000000036351207233610700237100ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" #include "linked_list.h" #include "thread_queue.h" configuration ThreadQueueC { provides { interface ThreadQueue; } } implementation { components LinkedListC; components ThreadQueueP; ThreadQueue = ThreadQueueP; ThreadQueueP.LinkedList -> LinkedListC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ThreadQueueP.nc000066400000000000000000000045631207233610700237260ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module ThreadQueueP { provides { interface ThreadQueue; } uses { interface LinkedList; } } implementation { async command void ThreadQueue.init(thread_queue_t* q) { call LinkedList.init(&(q->l)); } async command void ThreadQueue.enqueue(thread_queue_t* q, thread_t* t) { call LinkedList.addFirst(&(q->l), (list_element_t*)t); } async command thread_t* ThreadQueue.dequeue(thread_queue_t* q) { return (thread_t*)call LinkedList.removeLast(&(q->l)); } async command thread_t* ThreadQueue.remove(thread_queue_t* q, thread_t* t) { return (thread_t*)call LinkedList.remove(&(q->l), (list_element_t*)t); } async command bool ThreadQueue.isEmpty(thread_queue_t* q) { return (call LinkedList.size(&(q->l)) == 0); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ThreadSleepC.nc000066400000000000000000000040551207233610700236710ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ configuration ThreadSleepC { provides { interface ThreadSleep; } } implementation { components ThreadTimersC; components ThreadSleepP; components SystemCallC; components TinyThreadSchedulerC; ThreadSleep = ThreadSleepP; ThreadSleepP.TimerMilli -> ThreadTimersC; ThreadSleepP.SystemCall -> SystemCallC; ThreadSleepP.ThreadScheduler -> TinyThreadSchedulerC; components LedsC; ThreadSleepP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ThreadSleepP.nc000066400000000000000000000057351207233610700237140ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module ThreadSleepP { provides { interface ThreadSleep; } uses { interface SystemCall; interface ThreadScheduler; interface Timer as TimerMilli[uint8_t id]; interface Leds; } } implementation { typedef struct sleep_params { uint32_t* milli; } sleep_params_t; void sleepTask(syscall_t* s) { sleep_params_t* p = s->params; call TimerMilli.startOneShot[s->thread->id]( *(p->milli) ); } command error_t ThreadSleep.sleep(uint32_t milli) { syscall_t s; sleep_params_t p; p.milli = &milli; call SystemCall.start(&sleepTask, &s, INVALID_ID, &p); return SUCCESS; } //Need to add a cancel command so that components like //BlockingAMReceiverImplP can use the ThreadSleep interface //directly instead of reusing the underlying ThreadTimerC //component. The current implementation does things this way //and causes us to be defensive in here since the same //TimerMilli.fired() event is sent to that component as well. //Basically its just broken.... cancel() would get rid of this. //Also need some sort of a sleepWithSyscall command //Need to think about this one a little more event void TimerMilli.fired[uint8_t id]() { thread_t* t = call ThreadScheduler.threadInfo(id); if(t->syscall->syscall_ptr == sleepTask) call SystemCall.finish(t->syscall); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ThreadSynchronizationC.nc000066400000000000000000000041461207233610700260230ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ configuration ThreadSynchronizationC { provides { interface Barrier; interface Mutex; interface Semaphore; interface ConditionVariable; interface ReferenceCounter; } } implementation { components BarrierC; components MutexC; components SemaphoreC; components ConditionVariableC; components ReferenceCounterC; Barrier = BarrierC; Mutex = MutexC; Semaphore = SemaphoreC; ConditionVariable = ConditionVariableC; ReferenceCounter = ReferenceCounterC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/ThreadTimersC.nc000066400000000000000000000037041207233610700240640ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" configuration ThreadTimersC { provides { interface Timer as TimerMilli[uint8_t id]; } } implementation { components new TimerMilliC(); components new VirtualizeTimerC(TMilli, TOSTHREAD_MAX_NUM_THREADS); VirtualizeTimerC.TimerFrom -> TimerMilliC; TimerMilli = VirtualizeTimerC.Timer; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/TinyOSMainP.nc000066400000000000000000000102161207233610700234740ustar00rootroot00000000000000// $Id: TinyOSMainP.nc,v 1.4 2010-06-29 22:07:52 scipio Exp $ /* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: TinyOSMainP.nc,v 1.4 2010-06-29 22:07:52 scipio Exp $ * */ /** * RealMain implements the TinyOS boot sequence, as documented in TEP 107. * * @author Philip Levis * @author Kevin Klues */ #ifdef DYNTHREADS #define AT_SPONTANEOUS @spontaneous() #else #define AT_SPONTANEOUS #endif module TinyOSMainP { provides { interface Boot; interface ThreadInfo; } uses { interface Boot as TinyOSBoot; interface TaskScheduler; interface Init as PlatformInit; interface Init as SoftwareInit; interface Leds; } } implementation { thread_t thread_info; event void TinyOSBoot.booted() { atomic { /* Initialize all of the very hardware specific stuff, such as CPU settings, counters, etc. After the hardware is ready, initialize the requisite software components and start execution. */ platform_bootstrap(); // First, initialize the Scheduler so components can post tasks. call TaskScheduler.init(); /* Initialize the platform. Then spin on the Scheduler, passing * FALSE so it will not put the system to sleep if there are no * more tasks; if no tasks remain, continue on to software * initialization */ call PlatformInit.init(); while (call TaskScheduler.runNextTask()); /* Initialize software components.Then spin on the Scheduler, * passing FALSE so it will not put the system to sleep if there * are no more tasks; if no tasks remain, the system has booted * successfully.*/ call SoftwareInit.init(); while (call TaskScheduler.runNextTask()); } /* Enable interrupts now that system is ready. */ __nesc_enable_interrupt(); signal Boot.booted(); /* Spin in the TaskScheduler */ call TaskScheduler.taskLoop(); } async command error_t ThreadInfo.reset() { return FAIL; } async command thread_t* ThreadInfo.get() { return &thread_info; } default command error_t PlatformInit.init() { return SUCCESS; } default command error_t SoftwareInit.init() { return SUCCESS; } default event void Boot.booted() { } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/TinyTaskSchedulerC.nc000066400000000000000000000047331207233610700251010ustar00rootroot00000000000000// $Id: TinyTaskSchedulerC.nc,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TinyOS scheduler. It provides two interfaces: Scheduler, * for TinyOS to initialize and run tasks, and TaskBasic, the simplext * class of TinyOS tasks (reserved always at-most-once posting, * FIFO, parameter-free). For details and information on how to * replace the scheduler, refer to TEP 106. * * @author Phil Levis * @author Kevin Klues * @date August 7 2005 * @see TEP 106: Tasks and Schedulers */ configuration TinyTaskSchedulerC { provides interface TaskScheduler; provides interface TaskBasic[uint8_t id]; uses interface ThreadScheduler; } implementation { components SchedulerBasicP as Sched; components McuSleepC as Sleep; TaskScheduler = Sched; TaskBasic = Sched; Sched.ThreadScheduler = ThreadScheduler; components LedsC; Sched.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/TinyThreadSchedulerC.nc000066400000000000000000000046461207233610700254110ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #include "thread.h" configuration TinyThreadSchedulerC { provides { interface ThreadScheduler; interface ThreadCleanup[uint8_t id]; interface Boot as TinyOSBoot; } uses { interface Boot as ThreadSchedulerBoot; interface ThreadInfo[uint8_t id]; } } implementation { components TinyThreadSchedulerP as Sched; components McuSleepC as Sleep; TinyOSBoot = Sched; ThreadSchedulerBoot = Sched.ThreadSchedulerBoot; ThreadInfo = Sched; ThreadCleanup = Sched; ThreadScheduler = Sched; Sched.McuSleep -> Sleep; components BitArrayUtilsC; Sched.BitArrayUtils -> BitArrayUtilsC; components ThreadQueueC; Sched.ThreadQueue -> ThreadQueueC; components new TimerMilliC() as Alarm; Sched.PreemptionAlarm -> Alarm; components LedsC; Sched.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/TinyThreadSchedulerP.nc000066400000000000000000000242421207233610700254200ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ module TinyThreadSchedulerP { provides { interface ThreadScheduler; interface Boot as TinyOSBoot; interface ThreadCleanup[uint8_t id]; } uses { interface Boot as ThreadSchedulerBoot; interface ThreadInfo[uint8_t id]; interface ThreadQueue; interface BitArrayUtils; interface McuSleep; interface Leds; interface Timer as PreemptionAlarm; } } implementation { //Pointer to currently running thread thread_t* current_thread; //Pointer to the tos thread thread_t* tos_thread; //Pointer to yielding thread thread_t* yielding_thread; //Number of threads started, and currently capable of running if given the chance uint8_t num_runnable_threads; //Thread queue for keeping track of threads waiting to run thread_queue_t ready_queue; void task alarmTask() { uint8_t temp; atomic temp = num_runnable_threads; if(temp <= 1) call PreemptionAlarm.stop(); else if(temp > 1) call PreemptionAlarm.startOneShot(TOSTHREAD_PREEMPTION_PERIOD); } /* switch_threads() * This routine swaps the stack and allows a thread to run. * Needs to be in a separate function like this so that the * PC counter gets saved on the stack correctly. * * This funciton should have NOTHING other than the call * to the SWITCH_CONTEXTS macro in it. Otherwise we run * the risk of variables being pushed and popped by the * compiler, causing obvious problems with the stack switching * thats going on.... */ void switchThreads() __attribute__((noinline)) { SWITCH_CONTEXTS(yielding_thread, current_thread); } void restoreThread() __attribute__((noinline)) { RESTORE_TCB(current_thread); } /* sleepWhileIdle() * This routine is responsible for putting the mcu to sleep as * long as there are no threads waiting to be run. Once a * thread has been added to the ready queue the mcu will be * woken up and the thread will start running */ void sleepWhileIdle() { while(TRUE) { bool mt; atomic mt = (call ThreadQueue.isEmpty(&ready_queue) == TRUE); if(!mt || tos_thread->state == TOSTHREAD_STATE_READY) break; call McuSleep.sleep(); } } /* schedule_next_thread() * This routine does the job of deciding which thread should run next. * Should be complete as is. Add functionality to getNextThreadId() * if you need to change the actual scheduling policy. */ void scheduleNextThread() { if(tos_thread->state == TOSTHREAD_STATE_READY) current_thread = tos_thread; else current_thread = call ThreadQueue.dequeue(&ready_queue); current_thread->state = TOSTHREAD_STATE_ACTIVE; } /* interrupt() * This routine figures out what thread should run next * and then switches to it. */ void interrupt(thread_t* thread) { yielding_thread = thread; scheduleNextThread(); if(current_thread != yielding_thread) { switchThreads(); } } /* suspend() * this routine is responsbile for suspending a thread. It first * checks to see if the mcu should be put to sleep based on the fact * that the thread is being suspended. If not, it proceeds to switch * contexts to the next thread on the ready queue. */ void suspend(thread_t* thread) { //if there are no active threads, put the MCU to sleep //Then wakeup the TinyOS thread whenever the MCU wakes up again #ifdef TOSTHREADS_TIMER_OPTIMIZATION num_runnable_threads--; post alarmTask(); #endif sleepWhileIdle(); interrupt(thread); } void wakeupJoined(thread_t* t) { int i,j,k; k = 0; for(i=0; ijoinedOnMe); i++) { if(t->joinedOnMe[i] == 0) { k+=8; continue; } for(j=0; j<8; j++) { if(t->joinedOnMe[i] & 0x1) call ThreadScheduler.wakeupThread(k); t->joinedOnMe[i] >>= 1; k++; } } } /* stop * This routine stops a thread by putting it into the inactive state * and decrementing any necessary variables used to keep track of * threads by the thread scheduler. */ void stop(thread_t* t) { t->state = TOSTHREAD_STATE_INACTIVE; num_runnable_threads--; wakeupJoined(t); #ifdef TOSTHREADS_TIMER_OPTIMIZATION post alarmTask(); #else if(num_runnable_threads == 1) call PreemptionAlarm.stop(); #endif signal ThreadCleanup.cleanup[t->id](); } /* This executes and cleans up a thread */ void threadWrapper() __attribute__((naked, noinline)) { thread_t* t; atomic t = current_thread; __nesc_enable_interrupt(); (*(t->start_ptr))(t->start_arg_ptr); atomic { stop(t); sleepWhileIdle(); scheduleNextThread(); restoreThread(); } } event void ThreadSchedulerBoot.booted() { num_runnable_threads = 0; tos_thread = call ThreadInfo.get[TOSTHREAD_TOS_THREAD_ID](); tos_thread->id = TOSTHREAD_TOS_THREAD_ID; call ThreadQueue.init(&ready_queue); current_thread = tos_thread; current_thread->state = TOSTHREAD_STATE_ACTIVE; current_thread->init_block = NULL; signal TinyOSBoot.booted(); } command error_t ThreadScheduler.initThread(uint8_t id) { thread_t* t = (call ThreadInfo.get[id]()); t->state = TOSTHREAD_STATE_INACTIVE; t->init_block = current_thread->init_block; call BitArrayUtils.clrArray(t->joinedOnMe, sizeof(t->joinedOnMe)); PREPARE_THREAD(t, threadWrapper); return SUCCESS; } command error_t ThreadScheduler.startThread(uint8_t id) { atomic { thread_t* t = (call ThreadInfo.get[id]()); if(t->state == TOSTHREAD_STATE_INACTIVE) { num_runnable_threads++; #ifdef TOSTHREADS_TIMER_OPTIMIZATION post alarmTask(); #else if(num_runnable_threads == 2) call PreemptionAlarm.startOneShot(TOSTHREAD_PREEMPTION_PERIOD); #endif t->state = TOSTHREAD_STATE_READY; call ThreadQueue.enqueue(&ready_queue, t); return SUCCESS; } } return FAIL; } command error_t ThreadScheduler.stopThread(uint8_t id) { atomic { thread_t* t = call ThreadInfo.get[id](); if((t->state == TOSTHREAD_STATE_READY) && (t->mutex_count == 0)) { call ThreadQueue.remove(&ready_queue, t); stop(t); return SUCCESS; } return FAIL; } } async command error_t ThreadScheduler.suspendCurrentThread() { atomic { if(current_thread->state == TOSTHREAD_STATE_ACTIVE) { current_thread->state = TOSTHREAD_STATE_SUSPENDED; suspend(current_thread); return SUCCESS; } return FAIL; } } async command error_t ThreadScheduler.interruptCurrentThread() { atomic { if(current_thread->state == TOSTHREAD_STATE_ACTIVE) { current_thread->state = TOSTHREAD_STATE_READY; if(current_thread != tos_thread) call ThreadQueue.enqueue(&ready_queue, current_thread); interrupt(current_thread); return SUCCESS; } return FAIL; } } async command error_t ThreadScheduler.joinThread(thread_id_t id) { thread_t* t = call ThreadInfo.get[id](); atomic { if(current_thread == tos_thread) return FAIL; if (t->state != TOSTHREAD_STATE_INACTIVE) { call BitArrayUtils.setBit(t->joinedOnMe, current_thread->id); call ThreadScheduler.suspendCurrentThread(); return SUCCESS; } } return EALREADY; } async command error_t ThreadScheduler.wakeupThread(uint8_t id) { thread_t* t = call ThreadInfo.get[id](); if((t->state) == TOSTHREAD_STATE_SUSPENDED) { t->state = TOSTHREAD_STATE_READY; if(t != tos_thread) { call ThreadQueue.enqueue(&ready_queue, call ThreadInfo.get[id]()); #ifdef TOSTHREADS_TIMER_OPTIMIZATION atomic num_runnable_threads++; post alarmTask(); #endif } return SUCCESS; } return FAIL; } async command uint8_t ThreadScheduler.currentThreadId() { atomic return current_thread->id; } async command thread_t* ThreadScheduler.threadInfo(uint8_t id) { atomic return call ThreadInfo.get[id](); } async command thread_t* ThreadScheduler.currentThreadInfo() { atomic return current_thread; } event void PreemptionAlarm.fired() { call PreemptionAlarm.startOneShot(TOSTHREAD_PREEMPTION_PERIOD); atomic { if((call ThreadQueue.isEmpty(&ready_queue) == FALSE)) { call ThreadScheduler.interruptCurrentThread(); } } } default async command thread_t* ThreadInfo.get[uint8_t id]() { return NULL; } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/system/TosMallocC.nc000066400000000000000000000071351207233610700233700ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) * Implementation borrowed from the msp430-libc implementation */ /* * MALLOC_HEAP_SIZE MUST be defined as a power of 2 */ #ifndef MALLOC_HEAP_SIZE #define MALLOC_HEAP_SIZE 1024 #endif module TosMallocC { provides interface Malloc; } implementation { #define XSIZE(x) ((*x)>>1) #define FREE_P(x) (!((*x)&1)) #define MARK_BUSY(x) ((*x)|=1) #define MARK_FREE(x) ((*x)&=0xfffe) size_t malloc_heap[MALLOC_HEAP_SIZE]; void *tos_malloc (size_t size) @C() AT_SPONTANEOUS { static char once = 0; size_t * heap_bottom = &(malloc_heap[MALLOC_HEAP_SIZE]); size_t * heap_top = malloc_heap; char f = 0; atomic if (!once) { once = 1; *heap_top = 0xFFFE; } size = (size+1) >> 1; /* round to 2 */ do { size_t xsize = XSIZE (heap_top); size_t * heap_next = &heap_top[xsize + 1]; if ((xsize<<1)+2 == 0) { f = 1; } if (FREE_P (heap_top)) { if (f) { xsize = heap_bottom - heap_top - 1; } else if (FREE_P(heap_next)) { *heap_top = ( (XSIZE(heap_next)<<1) + 2 == 0 ? 0xfffe : (xsize + XSIZE(heap_next) + 1)<<1); continue; } if (xsize >= size) { if (f) heap_top[size + 1] = 0xfffe; else if (xsize != size) heap_top[size + 1] = (xsize - size - 1) << 1; *heap_top = size << 1; MARK_BUSY (heap_top); return heap_top+1; } } heap_top += xsize + 1; } while (!f); return NULL; } void tos_free (void *p) @C() AT_SPONTANEOUS { size_t *t = (size_t*)p - 1; MARK_FREE (t); } async command void* Malloc.malloc(size_t size) { return tos_malloc(size); } async command void Malloc.free(void* p) { tos_free(p); } } tinyos-2.1.2+dfsg/tos/lib/tosthreads/types/000077500000000000000000000000001207233610700206605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/tosthreads/types/barrier.h000066400000000000000000000036171207233610700224660ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Header file declaring struct for barrier synchronization as used * with tosthreads. * * @author Kevin Klues */ #ifndef BARRIER_H #define BARRIER_H #include "thread.h" #include "thread_queue.h" typedef struct barrier { uint8_t count; thread_queue_t thread_queue; } barrier_t; #endif //BARRIER_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/types/condvar.h000066400000000000000000000034671207233610700224770ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues (klueska@cs.stanford.edu) */ #ifndef CONDVAR_H #define CONDVAR_H #include "thread.h" #include "thread_queue.h" #include "mutex.h" typedef struct condvar { thread_queue_t thread_queue; } condvar_t; #endif //COND_VAR_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/types/linked_list.h000066400000000000000000000036351207233610700233410ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef LINKED_LIST_H_INCLUDED #define LINKED_LIST_H_INCLUDED typedef struct list_element { struct list_element* next; uint8_t* element_data; } list_element_t; typedef struct linked_list { list_element_t* head; volatile uint8_t size; } linked_list_t; #endif //LINKED_LIST_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tosthreads/types/mutex.h000066400000000000000000000034211207233610700221730ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef MUTEX_H #define MUTEX_H #include "thread_queue.h" typedef struct mutex { bool lock; thread_queue_t thread_queue; } mutex_t; #endif //MUTEX_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/types/poolthread.h000066400000000000000000000003001207233610700231630ustar00rootroot00000000000000 #ifndef _POOL_THREAD_H_ #define _POOL_THREAD_H_ #ifndef NUM_POOL_THREADS #define NUM_POOL_THREADS 5 #endif #ifndef POOL_THREAD_STACK_SIZE #define POOL_THREAD_STACK_SIZE 200 #endif #endif tinyos-2.1.2+dfsg/tos/lib/tosthreads/types/queue.h000066400000000000000000000035361207233610700221640ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef QUEUE_H_INCLUDED #define QUEUE_H_INCLUDED #include "linked_list.h" #include "tosthread_linked_list.h" typedef struct queue { linked_list_t l; } queue_t; typedef linked_list_t queue_element_t; #endif //QUEUE_H_INCLUDED tinyos-2.1.2+dfsg/tos/lib/tosthreads/types/refcounter.h000066400000000000000000000035031207233610700232060ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef REFCOUNTER_H #define REFCOUNTER_H #include "thread.h" #include "thread_queue.h" typedef struct refcounter { uint8_t count; thread_queue_t thread_queue; } refcounter_t; #endif //REFCOUNTER_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/types/semaphore.h000066400000000000000000000035401207233610700230160ustar00rootroot00000000000000/* * Copyright (c) 2008 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Chieh-Jan Mike Liang */ #ifndef SEMAPHORE_H #define SEMAPHORE_H #include "thread.h" #include "mutex.h" #include "condvar.h" typedef struct semaphore { uint8_t v; uint8_t s; mutex_t lock; condvar_t condvar; } semaphore_t; #endif //SEMAPHORE_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/types/syscall_queue.h000066400000000000000000000035321207233610700237120ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef SYSCALL_QUEUE_H #define SYSCALL_QUEUE_H #include "linked_list.h" typedef struct syscall_queue { linked_list_t l; //The syscall_queue implementation uses a linked list } syscall_queue_t; #endif //SYSCALL_QUEUE_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/types/thread.h000066400000000000000000000136621207233610700223100ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef THREAD_H #define THREAD_H #include "chip_thread.h" #include "refcounter.h" typedef uint8_t thread_id_t; //Typedef for thread_id_t typedef uint8_t syscall_id_t; //Typedef for syscall_id_t typedef thread_id_t tosthread_t; //Typedef for tosthread_t used to initialize a c-based thread #ifndef TOSTHREAD_MAIN_STACK_SIZE #define TOSTHREAD_MAIN_STACK_SIZE 500 //Default stack size for the main thread that spawns all other threads in the c based api #endif //Since thread initialization is encapsulated //inside a generic component, we can statically //know the number of threads created at compile //time #define UQ_TOS_THREAD "Unique.TOS.Thread" enum { #ifdef MAX_NUM_THREADS TOSTHREAD_MAX_NUM_THREADS = MAX_NUM_THREADS, #else TOSTHREAD_MAX_NUM_THREADS = 33, //Maximum number of threads allowed to run (must be less than sizeof(thread_id_t)) #endif TOSTHREAD_NUM_STATIC_THREADS = uniqueCount(UQ_TOS_THREAD), //The number of statically allocated threads TOSTHREAD_MAX_DYNAMIC_THREADS = TOSTHREAD_MAX_NUM_THREADS - TOSTHREAD_NUM_STATIC_THREADS, TOSTHREAD_TOS_THREAD_ID = TOSTHREAD_MAX_NUM_THREADS, //The ID of the TinyOS thread (One more than max allowable threads) TOSTHREAD_INVALID_THREAD_ID = TOSTHREAD_MAX_NUM_THREADS, //An invalid thread id TOSTHREAD_PREEMPTION_PERIOD = 5, //The preemption period for switching between threads }; enum { INVALID_ID = 0xFF, //ID reserved to indicate an invalid client connected SYSCALL_WAIT_ON_EVENT = 0, //Indicates there is no actual system call to make, but rather should jsut wait on an event }; typedef struct syscall syscall_t; typedef struct thread thread_t; typedef struct init_block init_block_t; //This is the data structure associated with an initialization block from which //threads are spawned when dynamically loading them struct init_block { void* globals; void (*init_ptr)(void*); void* init_arg; refcounter_t thread_counter; }; //This is a system call data structure struct syscall { //***** next_call must be at first position in struct for casting purposes ******* struct syscall* next_call; //Pointer to next system call for use in syscall queues when blocking on them syscall_id_t id; //client id of this system call for the particular syscall_queue within which it is being held thread_t* thread; //Pointer back to the thread with which this system call is associated void (*syscall_ptr)(struct syscall*); //Pointer to the the function that actually performs the system call void* params; //Pointer to a set of parameters passed to the system call once it is running in task context }; //This is a thread data structure struct thread { //***** next_thread must be at first position in struct for casting purposes ******* volatile struct thread* next_thread; //Pointer to next thread for use in queues when blocked thread_id_t id; //id of this thread for use by the thread scheduler init_block_t* init_block; //Pointer to an initialization block from which this thread was spawned stack_ptr_t stack_ptr; //Pointer to this threads stack volatile uint8_t state; //Current state the thread is in volatile uint8_t mutex_count; //A reference count of the number of mutexes held by this thread uint8_t joinedOnMe[(TOSTHREAD_MAX_NUM_THREADS - 1) / 8 + 1]; //Bitmask of threads waiting for me to finish void (*start_ptr)(void*); //Pointer to the start function of this thread void* start_arg_ptr; //Pointer to the argument passed as a parameter to the start function of this thread syscall_t* syscall; //Pointer to an instance of a system call thread_regs_t regs; //Contents of the GPRs stored when doing a context switch }; enum { TOSTHREAD_STATE_INACTIVE = 0, //This thread is inactive and cannot be run until started TOSTHREAD_STATE_ACTIVE = 1, //This thread is currently running and using the cpu TOSTHREAD_STATE_READY = 2, //This thread is not currently running, but is not blocked and has work to do TOSTHREAD_STATE_SUSPENDED = 3, //This thread has been suspended by a system call (i.e. blocked) }; #endif //THREAD_H tinyos-2.1.2+dfsg/tos/lib/tosthreads/types/thread_queue.h000066400000000000000000000035241207233610700235100ustar00rootroot00000000000000/* * Copyright (c) 2008 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues */ #ifndef THREAD_QUEUE_H #define THREAD_QUEUE_H #include "linked_list.h" typedef struct thread_queue { linked_list_t l; //The thread_queue implementation uses a linked list } thread_queue_t; #endif //THREAD_QUEUE_H tinyos-2.1.2+dfsg/tos/lib/zigbee/000077500000000000000000000000001207233610700166015ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/zigbee/Readme.txt000066400000000000000000000103111207233610700205330ustar00rootroot00000000000000README for cluster tree test application Author/Contact: Stefano Tennina Description: This folder contains the first implementation of the Network (NWK) layer for ZigBee Cluster Tree model as well as an example application to test its functionalities. The NWK layer is implemented on top of the TKN15.4 MAC layer and uses the beacon-enabled mode. A ZigBee cluster tree network is a network composed by 3 types of devices: a PAN coordinator, which acts as root of the tree, the end devices, which are the leaves of the tree, and the routers, which lead clusters of end devices and interconnect the leaves with the root. The code for NWK layer is in the folder "clusterTree" and includes the code for the 3 devices. The application is in the folder "tests" and includes the codes for each type of device. The folder "shadow" includes a modified version of the Random interface, used to schedule the association start from multiple nodes to a single parent. If you want to use this network layer instead of your platform's default protocol in your own application, you need to modify the pmote.sh script which is used to program the nodes and configuring them to form the cluster tree network. To run the scripts it is needed to make them executable using the Linux command from the "zigbee" folder: chmod +x *.sh The pmote script must be run to compile and install software in a mote and the assumption made is that nodes are all TelosB (although any platform which is supported by the TKN154 MAC can run this code). Each mote can be a Coordinator (GW, gateway), Router (CH, cluster head), End-device (SN, sensor node) or Sniffer. Its usage is as follows: ./pmote.sh [
      ] For convenience, a pnetwork script is included to setup a small network as follows: GW <-> CH1 <-+-> SN1 +-> SN2 This scripts simply calls the pmote recursively to build the network, supposing that 4 nodes are attached on USB ports from /dev/ttyUSB0 to /dev/ttyUSB3. The addressing mechanism implemented in the NWK layer is the simple ZigBee Cskip. Some of the configuration parameters can be set on the pmote script (e.g., channel, PAN ID, transmission power), while others such as Beacon Order and Superframe Order can be changed from the MAC_profile.h file which is in the "zigbee/clusterTree/includes" folder. Criteria for a successful test: Press the USER button on the GW and it will start sending beacons (blue led toggles every beacon transmitted). The CH1 is configured to wait for beacons from the GW and it will switch on the green led when the first beacon is received. The SNs are configured to wait for CH1's beacons and toggle the red led every time they receive a beacon from nodes other than CH1. CH1 then associates with the GW and starts the negotiation phase to get a time window to start its superframe in a non-overlapping fashion with the other clusters (i.e., in this case, the GW). The windows are statically allocated based on the Time Division Cluster Scheduling algorithm. As soon as the negotiation is accomplished, CH1 starts sending beacons (blue led toggles) and the SNs switch on their green led starting the process for association. When the network has been setup, the SNs transmit dummy data towards the GW though the CH and every time the data is transmitted by SNs or the CH the green led toggles. If the USER button of a SN is pressed, the node will send a disassociation request to the parent CH and then stops transmitting data. Known bugs/limitations: - GTS allocation policies still not implemented (although GTS slots are handled at the MAC layer) - Allocation of the time windows to cluster heads for their superframe during the negotiation phase after the CHs association is based on fixed configuration (process_beacon_scheduling() function in coordinatorBasicC.nc). - Many TinyOS 2 platforms do not have a clock that satisfies the precision/accuracy requirements of the IEEE 802.15.4 standard (e.g. 62.500 Hz, +-40 ppm in the 2.4 GHz band); in this case the MAC timing is not standard compliant tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/000077500000000000000000000000001207233610700211025ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/includes/000077500000000000000000000000001207233610700227105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/includes/MAC_profile.h000066400000000000000000000010551207233610700252020ustar00rootroot00000000000000/* * @author open-zb http://www.open-zb.net * @author Stefano Tennina */ #ifndef __MAC_PROFILE__ #define __MAC_PROFILE__ // Default PAN ID #ifndef DEF_MAC_PANID #define MAC_PANID 0x123F #else #define MAC_PANID DEF_MAC_PANID #endif // Default Channel #ifndef DEF_CHANNEL #define LOGICAL_CHANNEL 26 #else #define LOGICAL_CHANNEL DEF_CHANNEL #endif #define BEACON_ORDER 8 #define SUPERFRAME_ORDER 4 #define AVAILABLEADDRESSES 0x06 #define ADDRESSINCREMENT 0x0001 #define MAXCHILDREN 0x06 #define MAXDEPTH 0x03 #define MAXROUTERS 0x04 #endif tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/includes/log_enable.h000066400000000000000000000023361207233610700251540ustar00rootroot00000000000000/* * @author open-zb http://www.open-zb.net * @author Stefano Tennina */ //Choose which printfs to enable #ifndef __LOG_ENABLE_H__ #define __LOG_ENABLE_H__ // XLayer Log Level Settings (enabled only if the LAYERS prints are enabled) #define ERROR_CONDITIONS 0x01 #define DEBUG_STATUS 0x02 #define TRACE_FUNC 0x04 #define DBG_NEIGHBOR_TABLE 0x08 #define DBG_CUSTOM 0x10 #define TIME_PERFORMANCE 0x20 //#define LOG_LEVEL (TIME_PERFORMANCE) //#define LOG_LEVEL (ERROR_CONDITIONS | DEBUG_STATUS | TRACE_FUNC) //#define LOG_LEVEL (ERROR_CONDITIONS) #define LOG_LEVEL (0) // Local ENABLERS // ********************************************** // ************** APPLICATION ******************* // ********************************************** // Uncomment this to globally enable printfs in APP //#define APP_PRINTFS_ENABLED // ****************************************** // ************** NETWORK ******************* // ****************************************** // Uncomment this to globally enable printfs in NWKP.nc //#define NWK_PRINTFS_ENABLED // Uncomment this to avoid IEEE154 status parsing messages //#define DEBUG_STATUS_MESSAGE // Uncomment this to enable prints of neighbor table //#define DBG_LIST_NEIGHBOURS #endif tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/includes/nwk_const_coordinator.h000066400000000000000000000065071207233610700275010ustar00rootroot00000000000000/* * @author open-zb http://www.open-zb.net * @author Stefano Tennina */ #ifndef __NWK_CONST__ #define __NWK_CONST__ #include "MAC_profile.h" #include "nwk_enumerations.h" //GLOBAL VARIABLES //SELECTED DEVICE TYPE #define TYPE_DEVICE COORDINATOR // Default Device Depth #ifndef DEF_DEVICE_DEPTH #define DEF_DEVICE_DEPTH 0x00 #endif // Default Parent #ifndef DEF_CHOSEN_PARENT #define DEF_CHOSEN_PARENT 0x0000 #endif // Default Position - X #ifndef DEF_MY_X #define DEF_MY_X TOS_NODE_ID #endif // Default Position - Y #ifndef DEF_MY_Y #define DEF_MY_Y (TOS_NODE_ID+5) #endif #ifdef GEO_3D // Default Position - Z #ifndef DEF_MY_Z #define DEF_MY_Z 0x0000 #endif #endif // Maximum number of alternative parents (fault tolerance) including // the actual one. This definition impacts on the neighbor table dimension #define MAXPARENTS 0x00 // The Network layer constants are defined in here. //page 202 //#define nwkcCoordinatorCapable //set at build time //#define nwkcDefaultSecurityLevel ENC-MIC-64 #define nwkcDiscoveryRetryLimit 0x03 #define nwkcMaxDepth 0x0f #define nwkcMinHeaderOverhead 0x08 #define nwkcProtocolVersion 0x01 #define nwkcRepairThreshold 0x03 #define nwkcRouteDiscoveryTime 0x2710 #define nwkcMaxBroadcastJitter 0x40 #define nwkcInitialRREQRetries 0x03 #define nwkcRREQRetries 0x02 #define nwkcRREQRetryInterval 0xfe #define nwkcMinRReQJitter 0x01 #define nwkcMaxRReQJitter 0x40 // The NWK IB attributes are defined in here. typedef struct { //page 204 uint8_t nwkSequenceNumber; uint8_t nwkPassiveAckTimeout; uint8_t nwkMaxBroadcastRetries; uint8_t nwkMaxChildren; uint8_t nwkMaxDepth; uint8_t nwkMaxRouters; //neighbortableentry nwkNeighborTable[]; uint8_t nwkNetworkBroadcastDeliveryTime; uint8_t nwkReportConstantCost; uint8_t nwkRouteDiscoveryRetriesPermitted; //set nwkRouteTable; uint8_t nwkSymLink; uint8_t nwkCapabilityInformation; uint8_t nwkUseTreeAddrAlloc; uint8_t nwkUseTreeRouting; uint16_t nwkNextAddress; uint16_t nwkAvailableAddresses; uint16_t nwkAddressIncrement; uint16_t nwkTransactionPersistenceTime; } nwkIB; typedef struct { uint16_t tosAddress; uint16_t depth; } beaconPay_t; //NWK layer NeighborTableEntry typedef struct { //page 218 uint16_t PAN_Id; uint64_t Extended_Address; uint16_t Network_Address; uint8_t Device_Type; uint8_t Relationship; //optional fields //we choose to exclude this fields due to memory limitation //bool RxOnWhenIdle; uint8_t Depth; uint8_t Permit_Joining; uint8_t Logical_Channel; uint8_t Potential_Parent; /* uint8_t Beacon_Order; uint8_t Transmit_Failure; uint8_t Potential_Parent; uint8_t LQI; uint8_t Logical_Channel; uint32_t Incoming_Beacon_Timestamp; uint32_t Beacon_Transmission_Time_Offset; */ } neighbortableentry; // NWK layer NetworkDescriptor typedef struct { //page 166 uint16_t PANId; uint8_t LogicalChannel; uint8_t StackProfile; uint8_t ZigBeeVersion; uint8_t BeaconOrder; uint8_t SuperframeOrder; uint8_t PermitJoining; } networkdescriptor; //NEIGHBOUR TABLE COUNT #define NEIGHBOUR_TABLE_SIZE (MAXCHILDREN+MAXPARENTS) //beacon scheduling mechanims typedef struct { uint8_t request_type; uint8_t beacon_order; uint8_t superframe_order; uint8_t transmission_offset[3]; }beacon_scheduling; #define SCHEDULING_REQUEST 0x01 #define SCHEDULING_ACCEPT 0x02 #define SCHEDULING_DENY 0x03 #endif tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/includes/nwk_const_end_device.h000066400000000000000000000075621207233610700272450ustar00rootroot00000000000000/* * @author open-zb http://www.open-zb.net * @author Stefano Tennina */ #ifndef __NWK_CONST__ #define __NWK_CONST__ #include "MAC_profile.h" #include "nwk_enumerations.h" //GLOBAL VARIABLES //SELECTED DEVICE TYPE #define TYPE_DEVICE END_DEVICE // Default Device Depth #ifndef DEF_DEVICE_DEPTH #define DEF_DEVICE_DEPTH 0x01 #endif // Default Parent #ifndef DEF_CHOSEN_PARENT #define DEF_CHOSEN_PARENT 0x0001 #endif // Default Position - X #ifndef DEF_MY_X #define DEF_MY_X TOS_NODE_ID #endif // Default Position - Y #ifndef DEF_MY_Y #define DEF_MY_Y (TOS_NODE_ID+5) #endif #ifdef GEO_3D // Default Position - Z #ifndef DEF_MY_Z #define DEF_MY_Z 0x0000 #endif #endif // Maximum number of alternative parents (fault tolerance) including // the actual one. This definition impacts on the neighbor table dimension #define MAXPARENTS 0x03 // The Network layer constants are defined in here. //page 202 //#define nwkcCoordinatorCapable //set at build time //#define nwkcDefaultSecurityLevel ENC-MIC-64 #define nwkcDiscoveryRetryLimit 0x03 #define nwkcMaxDepth 0x0f #define nwkcMinHeaderOverhead 0x08 #define nwkcProtocolVersion 0x01 #define nwkcRepairThreshold 0x03 #define nwkcRouteDiscoveryTime 0x2710 #define nwkcMaxBroadcastJitter 0x40 #define nwkcInitialRREQRetries 0x03 #define nwkcRREQRetries 0x02 #define nwkcRREQRetryInterval 0xfe #define nwkcMinRReQJitter 0x01 #define nwkcMaxRReQJitter 0x40 // The NWK IB attributes are defined in here. typedef struct { //page 204 uint8_t nwkSequenceNumber; uint8_t nwkPassiveAckTimeout; uint8_t nwkMaxBroadcastRetries; uint8_t nwkMaxChildren; uint8_t nwkMaxDepth; uint8_t nwkMaxRouters; //neighbortableentry nwkNeighborTable[]; uint8_t nwkNetworkBroadcastDeliveryTime; uint8_t nwkReportConstantCost; uint8_t nwkRouteDiscoveryRetriesPermitted; //set nwkRouteTable; uint8_t nwkSymLink; uint8_t nwkCapabilityInformation; uint8_t nwkUseTreeAddrAlloc; uint8_t nwkUseTreeRouting; uint16_t nwkNextAddress; uint16_t nwkAvailableAddresses; uint16_t nwkAddressIncrement; uint16_t nwkTransactionPersistenceTime; } nwkIB; typedef struct { uint16_t tosAddress; uint16_t depth; } beaconPay_t; //NWK layer NeighborTableEntry typedef struct { //page 218 uint16_t PAN_Id; uint64_t Extended_Address; uint16_t Network_Address; uint8_t Device_Type; uint8_t Relationship; //optional fields //we choose to exclude this fields due to memory limitation //bool RxOnWhenIdle; uint8_t Depth; uint8_t Permit_Joining; uint8_t Logical_Channel; uint8_t Potential_Parent; /* uint8_t Beacon_Order; uint8_t Transmit_Failure; uint8_t Potential_Parent; uint8_t LQI; uint8_t Logical_Channel; uint32_t Incoming_Beacon_Timestamp; uint32_t Beacon_Transmission_Time_Offset; */ } neighbortableentry; // NWK layer NetworkDescriptor typedef struct { //page 166 uint16_t PANId; uint8_t LogicalChannel; uint8_t StackProfile; uint8_t ZigBeeVersion; uint8_t BeaconOrder; uint8_t SuperframeOrder; uint8_t PermitJoining; } networkdescriptor; // NEIGHBOUR TABLE COUNT #define NEIGHBOUR_TABLE_SIZE MAXPARENTS // Timer for association try/retry #define JOIN_TIMER_RETRY (TOS_NODE_ID * 1000) // MAX beacon counter for random association trials //#define MAX_RANDOM_BCN_COUNTER (2*MAXCHILDREN) #define MAX_RANDOM_BCN_COUNTER (MAXCHILDREN) // Offset for the random beacon counter // The end device should wait that routers have finished their // association. #define OFFSET_BCN_COUNTER 2 // MAX association trials (after this, JOIN unsuccess is signaled) // A value 0 means infinite tentatives #define MAX_ASSOCIATION_TRIALS 0 //#define MAX_ASSOCIATION_TRIALS 3 // MAX join trials (after this, a new scan discovery should be issued) #define MAX_JOIN_TRIALS MAX_ASSOCIATION_TRIALS // Association process status #define IM_SCANNING (0x01) #define IM_ASSOCIATING (0x01 << 1) #define ASSOCIATED (0x01 << 2) #define DISASSOCIATED (0x01 << 3) #endif tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/includes/nwk_const_router.h000066400000000000000000000077501207233610700264770ustar00rootroot00000000000000/* * @author open-zb http://www.open-zb.net * @author Stefano Tennina */ #ifndef __NWK_CONST__ #define __NWK_CONST__ #include "MAC_profile.h" #include "nwk_enumerations.h" //GLOBAL VARIABLES //SELECTED DEVICE TYPE #define TYPE_DEVICE ROUTER // Default Device Depth #ifndef DEF_DEVICE_DEPTH #define DEF_DEVICE_DEPTH 0x01 #endif // Default Parent #ifndef DEF_CHOSEN_PARENT #define DEF_CHOSEN_PARENT 0x0000 #endif // Default Position - X #ifndef DEF_MY_X #define DEF_MY_X TOS_NODE_ID #endif // Default Position - Y #ifndef DEF_MY_Y #define DEF_MY_Y (TOS_NODE_ID+5) #endif #ifdef GEO_3D // Default Position - Z #ifndef DEF_MY_Z #define DEF_MY_Z 0x0000 #endif #endif // Maximum number of alternative parents (fault tolerance) including // the actual one. This definition impacts on the neighbor table dimension #define MAXPARENTS 0x03 // The Network layer constants are defined in here. //page 202 //#define nwkcCoordinatorCapable //set at build time //#define nwkcDefaultSecurityLevel ENC-MIC-64 #define nwkcDiscoveryRetryLimit 0x03 #define nwkcMaxDepth 0x0f #define nwkcMinHeaderOverhead 0x08 #define nwkcProtocolVersion 0x01 #define nwkcRepairThreshold 0x03 #define nwkcRouteDiscoveryTime 0x2710 #define nwkcMaxBroadcastJitter 0x40 #define nwkcInitialRREQRetries 0x03 #define nwkcRREQRetries 0x02 #define nwkcRREQRetryInterval 0xfe #define nwkcMinRReQJitter 0x01 #define nwkcMaxRReQJitter 0x40 // The NWK IB attributes are defined in here. typedef struct { //page 204 uint8_t nwkSequenceNumber; uint8_t nwkPassiveAckTimeout; uint8_t nwkMaxBroadcastRetries; uint8_t nwkMaxChildren; uint8_t nwkMaxDepth; uint8_t nwkMaxRouters; //neighbortableentry nwkNeighborTable[]; uint8_t nwkNetworkBroadcastDeliveryTime; uint8_t nwkReportConstantCost; uint8_t nwkRouteDiscoveryRetriesPermitted; //set nwkRouteTable; uint8_t nwkSymLink; uint8_t nwkCapabilityInformation; uint8_t nwkUseTreeAddrAlloc; uint8_t nwkUseTreeRouting; uint16_t nwkNextAddress; uint16_t nwkAvailableAddresses; uint16_t nwkAddressIncrement; uint16_t nwkTransactionPersistenceTime; } nwkIB; typedef struct { uint16_t tosAddress; uint16_t depth; } beaconPay_t; //NWK layer NeighborTableEntry typedef struct { //page 218 uint16_t PAN_Id; uint64_t Extended_Address; uint16_t Network_Address; uint8_t Device_Type; uint8_t Relationship; //optional fields //we choose to exclude this fields due to memory limitation //bool RxOnWhenIdle; uint8_t Depth; uint8_t Permit_Joining; uint8_t Logical_Channel; uint8_t Potential_Parent; /* uint8_t Beacon_Order; uint8_t Transmit_Failure; uint8_t Potential_Parent; uint8_t LQI; uint8_t Logical_Channel; uint32_t Incoming_Beacon_Timestamp; uint32_t Beacon_Transmission_Time_Offset; */ } neighbortableentry; // NWK layer NetworkDescriptor typedef struct { //page 166 uint16_t PANId; uint8_t LogicalChannel; uint8_t StackProfile; uint8_t ZigBeeVersion; uint8_t BeaconOrder; uint8_t SuperframeOrder; uint8_t PermitJoining; } networkdescriptor; //NEIGHBOUR TABLE COUNT #define NEIGHBOUR_TABLE_SIZE (MAXCHILDREN+MAXPARENTS) //beacon scheduling mechanims typedef struct { uint8_t request_type; uint8_t beacon_order; uint8_t superframe_order; uint8_t transmission_offset[3]; }beacon_scheduling; // Timer for association try/retry #define JOIN_TIMER_RETRY (TOS_NODE_ID * 1000) // MAX beacon counter for random association trials #define MAX_RANDOM_BCN_COUNTER (2*MAXROUTERS) // Offset for the random beacon counter #define OFFSET_BCN_COUNTER 0 // MAX association trials (after this, JOIN unsuccess is signaled) // A value 0 means infinite tentatives #define MAX_ASSOCIATION_TRIALS 0 // MAX join trials (after this, a new scan discovery should be issued) #define MAX_JOIN_TRIALS MAX_ASSOCIATION_TRIALS // Association process status #define IM_SCANNING (0x01) #define IM_ASSOCIATING (0x01 << 1) #define ASSOCIATED (0x01 << 2) #define DISASSOCIATED (0x01 << 3) #define SCHEDULING_REQUEST 0x01 #define SCHEDULING_ACCEPT 0x02 #define SCHEDULING_DENY 0x03 #endif tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/includes/nwk_enumerations.h000066400000000000000000000033621207233610700264550ustar00rootroot00000000000000/* * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author open-zb http://www.open-zb.net * @author Andre Cunha */ #ifndef __NWK_ENUMERATIONS__ #define __NWK_ENUMERATIONS__ //NWK layer status values //page 243 enum { NWK_SUCCESS = 0x00, NWK_INVALID_PARAMETER = 0xc1, NWK_INVALID_REQUEST = 0xc2, NWK_NOT_PERMITTED = 0xc3, NWK_STARTUP_FAILURE = 0xc4, NWK_ALREADY_PRESENT = 0xc5, NWK_SYNC_FAILURE = 0xc6, NWK_TABLE_FULL = 0xc7, NWK_UNKNOWN_DEVICE = 0xc8, NWK_UNSUPPORTED_ATTRIBUTE = 0xc9, NWK_NO_NETWORKS = 0xca, NWK_LEAVE_UNCONFIRMED = 0xcb, NWK_MAX_FRM_CNTR = 0xcc, NWK_NO_KEY = 0xcd, NWK_BAD_CCM_OUTPUT = 0xce }; //NWK layer device types //page 342 enum { COORDINATOR = 0x00, ROUTER = 0x01, END_DEVICE = 0x02 }; //NWK layer Relationship //page 342 enum { NEIGHBOR_IS_PARENT = 0x00, NEIGHBOR_IS_CHILD = 0x01, NEIGHBOR_IS_SIBLING = 0x02, NEIGHBOR_IS_NON = 0x03, NEIGHBOR_IS_PREVIOUS_CHILD = 0x04, NEIGHBOR_IS_ALT_PARENT = 0x05 // Added to identify alternative parents }; //NWK layer PIB attributs ennumerations //PAG 317 enum{ NWKSEQUENCENUMBER = 0x81, NWKPASSIVEACKTIMEOUT = 0x82, NWKMAXBROADCASTRETRIES = 0x83, NWKMAXCHILDREN = 0x84, NWKMAXDEPTH = 0x85, NWKMAXROUTERS = 0x86, //NWKNEIGHBORTABLE = 0x87 NWKMETWORKBROADCASTDELIVERYTIME = 0x88, NWKREPORTCONSTANTCOST = 0x89, NWKROUTEDISCOVERYRETRIESPERMITED = 0x8a, //NWKROUTETABLE NWKSYMLINK = 0x8e, NWKCAPABILITYINFORMATION= 0x8f, NWKUSETREEADDRALLOC = 0x90, NWKUSETREEROUTING = 0x91, NWKNEXTADDRESS = 0x92, NWKAVAILABLEADDRESSES = 0x93, NWKADDRESSINCREMENT = 0x94, NWKTRANSACTIONPERSISTENCETIME = 0x95 }; #ifdef IM_ROUTER // Interface NWK-TKN MAC 802.15.4 enum{ ROUTER_FRAME_POOL_SIZE = 10, }; #endif #endif tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/includes/nwk_func.h000066400000000000000000000063671207233610700247070ustar00rootroot00000000000000/* * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author IPP HURRAY http://www.open-zb.net * @author Andre Cunha */ #ifndef __NWK_FUNC__ #define __NWK_FUNC__ typedef struct routing_fields { //uint8_t frame_control1; //uint8_t frame_control2; uint16_t frame_control; uint16_t destination_address; uint16_t source_address; uint8_t radius; uint8_t sequence_number; }routing_fields; /*******************************************************************************************************************/ /********************************NETWORK LAYER FRAME CONTROL FUNCTIONS************************************************************/ /*******************************************************************************************************************/ //build NPDU frame control field uint16_t set_route_frame_control(uint8_t Frame_type,uint8_t Protocol_version,uint8_t Discover_route,uint8_t Security) { uint8_t fc_byte1=0; uint8_t fc_byte2=0; fc_byte1 = ( (Discover_route << 6) | (Protocol_version << 2) | (Frame_type << 0) ); fc_byte2 = ((Security<< 2)); return ( (fc_byte2 <<8 ) | (fc_byte1 << 0) ); } uint8_t route_fc1(uint8_t Security) { uint8_t fc; fc = ((Security << 2)); return fc; } uint8_t route_fc2(uint8_t Frame_type,uint8_t Protocol_version,uint8_t Discover_route) { uint8_t fc; fc = ( (Discover_route << 6) | (Protocol_version << 2) | (Frame_type << 0) ); return fc; } uint8_t get_route_frame_type(uint16_t frame_control) { return (frame_control & 0x3); } uint8_t get_route_protocol_version(uint16_t frame_control) { return ( (frame_control >> 2) & 0xf); } uint8_t get_route_discover_route(uint16_t frame_control) { return ( (frame_control >> 6) & 0x3); } uint8_t get_route_security(uint16_t frame_control) { if( ((frame_control >> 8) & 0x2) == 0x2) return 1; else return 0; } /*******************************************************************************************************************/ /********************************NETWORK LAYER BEACON PAYLOAD INFORMATION FUNCTIONS*********************************/ /*******************************************************************************************************************/ uint8_t nwk_payload_profile_protocolversion(uint8_t stackprofile,uint8_t nwkcprotocolversion) { return ((stackprofile << 0) | ( nwkcprotocolversion << 4)); } uint8_t nwk_payload_capacity(uint8_t routercapacity,uint8_t devicedepth,uint8_t enddevicecapacity) { return ((enddevicecapacity << 7) | ( devicedepth << 3 ) | (routercapacity << 2 ) ); } uint8_t get_protocolid(uint32_t nwk_information) { return (uint8_t)((nwk_information & 0xFF000000) >> 24); } uint8_t get_stackprofile(uint32_t nwk_information) { return (uint8_t)((nwk_information & 0x00F00000)>>20); } uint8_t get_nwkcprotocolversion(uint32_t nwk_information) { return (uint8_t)((nwk_information & 0x000F0000)>>16); } uint8_t get_routercapacity(uint32_t nwk_information) { if ( ( nwk_information & 0x00002000) == 0x00002000) return 1; else return 0; } uint8_t get_devicedepth(uint32_t nwk_information) { return (uint8_t)((nwk_information & 0x00001F00) >> 8); } uint8_t get_enddevicecapacity(uint32_t nwk_information) { if ( ( nwk_information & 0x00000001) == 0x00000001) return 1; else return 0; } #endif tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/includes/printfUART.h000066400000000000000000000240641207233610700250650ustar00rootroot00000000000000/* * Copyright (c) 2005 * The President and Fellows of Harvard College. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * Writes printf like output to the UART. * This works only on the AVR and MSP430 Microcontrollers! *

      * Note: For AVR we explicitly place the print statements in ROM; for * MSP430 this is done by default! For AVR, if we don't place it * explicitely in ROM, the statements will go in RAM, which will * quickly cause a descent size program to run out of RAM. By default * it doesn't disable the interupts; disabling the interupts when * writing to the UART, slows down/makes the mote quite unresponsive, * and can lead to problems! If you wish to disable all printfs to * the UART, then comment the flag: PRINTFUART_ENABLED. *

       * How to use:
       *   // (1) Call printfUART_init() from your initialization function 
       *   //     to initialize the UART
       *   printfUART_init();
       *   // (2) Set your UART client to the correct baud rate.  Look at 
       *   //     the comments in printfUART_init(), to figure out what 
       *   //     baud to use for your particular mote
       *
       *   // (3) Send printf statements like this:
       *   printfUART("Hello World, we are in year= %i\n", 2004);
       *
       * Examples and caveats:
       *   // (1) - If no parameters are passed, then the second quotes 
       *            are required because of how the macro is defined
       *   printfUART("Timer fired\n", ""); 
       *   // (2) - Must use curly braces in single section statements
       *   if (x < 3)
       *       {printfUART("The value of x is %i\n", x);}
       *   // (3) - Otherwise it more or less works like regular printf
       *   printfUART("\nThe value of x=%i, and y=%i\n", x, y); 
       * 
      *
      URL: http://www.eecs.harvard.edu/~konrad/projects/motetrack
      * @author Konrad Lorincz * @version 2.0, January 5, 2005 */ #ifndef PRINTFUART_H #define PRINTFUART_H #include //#include // Comment out the line below to DISABLE printf statements. // This should be handled at the application Makefile //#define PRINTFUART_ENABLED // STE // found: http://mansos.net/svn/mansos/mos/hpl/chips/msp430/msp430_timers.h #define SSEL_0 0x00 #define SSEL_1 0x10 #define SSEL_2 0x20 #define SSEL_3 0x30 #define SSEL_ACLK SSEL_1 #define SSEL_SMCLK SSEL_2 // End STE // ------------------------------------------------------------------- #ifdef PRINTFUART_ENABLED #define DEBUGBUF_SIZE 256 char debugbuf[DEBUGBUF_SIZE]; char debugbufROMtoRAM[DEBUGBUF_SIZE]; #if defined(PLATFORM_MICAZ) || defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) #define printfUART(__format, __args...) { \ static const char strROM[] PROGMEM = __format; \ strcpy_P((char*) &debugbufROMtoRAM, (PGM_P) &strROM); \ sprintf(debugbuf, debugbufROMtoRAM, __args); \ writedebug(); \ } #else // assume MSP430 architecture (e.g. TelosA, TelosB, etc.) #define printfUART(__format, __args...) { \ sprintf(debugbuf, __format, __args); \ writedebug(); \ } #endif #else #define printfUART(__format, __args...) void printfUART_init() {} #endif #define NOprintfUART(__format, __args...) /** Used for terminating the program from a non-nesc file. Calling exit(1) * from a non-nesc file doesn't terminate the program immeditely */ static int EXIT_PROGRAM = 0; // ------------------------------------------------------------------- #ifdef PRINTFUART_ENABLED /** * Initialize the UART port. Call this from your startup routine. */ #define printfUART_init() {atomic printfUART_init_private();} void printfUART_init_private() { #if defined(PLATFORM_MICAZ) || defined(PLATFORM_MICA2) uint8_t dummy = 0; // 56K baud UBRR0H = 0; UBRR0L = 15; //set baud rate UCSR0A = (1<> 8) & 0x0FF; U1MCTL = l_mctl; } else { U1BR0 = 0x03; // 9600 baud U1BR1 = 0x00; U1MCTL = 0x4A; } ME2 &= ~USPIE1; // USART1 SPI module disable ME2 |= (UTXE1 | URXE1); // USART1 UART module enable U1CTL &= ~SWRST; IFG2 &= ~(UTXIFG1 | URXIFG1); IE2 &= ~(UTXIE1 | URXIE1); // interrupt disabled #endif #endif } #if defined(PLATFORM_MICAZ) || defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) #else // assume AVR architecture (e.g. TelosA, TelosB) bool isTxIntrPending() { if (U1TCTL & TXEPT) return TRUE; return FALSE; } #endif /** * Outputs a char to the UART. */ void UARTPutChar(char c) { if (c == '\n') UARTPutChar('\r'); #if defined(PLATFORM_MICAZ) || defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) // Wait for bit set while( !(UCSR0A & UDRE) ); UDR0 = c; //loop_until_bit_is_set(UCSR0A, UDRE); // outb(UDR0,c); #else // assume AVR architecture (e.g. TelosA, TelosB) U1TXBUF = c; while( !isTxIntrPending() ) continue; #endif } /** * Outputs the entire debugbuf to the UART, or until it encounters '\0'. */ void writedebug() { uint16_t i = 0; while (debugbuf[i] != '\0' && i < DEBUGBUF_SIZE) UARTPutChar(debugbuf[i++]); } /** * Simplified sprintf */ #define SCRATCH 16 int sprintf(uint8_t *buf, const uint8_t *format, ...) { uint8_t scratch[SCRATCH]; uint8_t format_flag; uint32_t u_val=0, base;//modified by Andre Cunha uint8_t *ptr; va_list ap; //memset(scratch, 0, SCRATCH); buf[0] = '\0'; // KLDEBUG - fixes subtle bug ... va_start (ap, format); for (;;) { while ((format_flag = *format++) != '%') // Until '%' or '\0' { if (!format_flag) { va_end (ap); return (0); } *buf = format_flag; buf++; *buf=0; } switch (format_flag = *format++) { case 'c': format_flag = va_arg(ap,int); default: *buf = format_flag; buf++; *buf=0; continue; case 'S': case 's': ptr = va_arg(ap,char *); strcat(buf, ptr); continue; case 'o': base = 8; *buf = '0'; buf++; *buf=0; goto CONVERSION_LOOP; case 'i': if (((int)u_val) < 0) { u_val = - u_val; *buf = '-'; buf++; *buf=0; } base = 10; goto CONVERSION_LOOP; // no break -> run into next case case 'd'://added by Andre Cunha if (((int32_t)u_val) < 0) { u_val = - u_val; *buf = '-'; buf++; *buf=0; } base = 10; goto CONVERSION_LOOP32; case 'u': base = 10; goto CONVERSION_LOOP; case 'x': base = 16; goto CONVERSION_LOOP; case 'y'://unsigned int 32 bits hexadecimal//added by Andre Cunha base = 16; goto CONVERSION_LOOP32; CONVERSION_LOOP: u_val = va_arg(ap,int); ptr = scratch + SCRATCH; *--ptr = 0; do { char ch = u_val % base + '0'; if (ch > '9') ch += 'a' - '9' - 1; *--ptr = ch; u_val /= base; } while (u_val); strcat(buf, ptr); buf += strlen(ptr); break; CONVERSION_LOOP32: u_val = va_arg(ap,int32_t); ptr = scratch + SCRATCH; *--ptr = 0; do { char ch = u_val % base + '0'; if (ch > '9') ch += 'a' - '9' - 1; *--ptr = ch; u_val /= base; } while (u_val); strcat(buf, ptr); buf += strlen(ptr); } } } #endif // PRINTFUART_ENABLED // ------------------------------------------------------------------- #endif // PRINTFUART_H tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/interfaces/000077500000000000000000000000001207233610700232255ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/interfaces/NLDE_DATA.nc000066400000000000000000000010321207233610700250560ustar00rootroot00000000000000/** * NLDE-DATA * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author open-zb http://www.open-zb.net * @author Andre Cunha * */ //page 159-163 interface NLDE_DATA { command error_t request(uint16_t DstAddr, uint8_t NsduLength, uint8_t Nsdu[120], uint8_t NsduHandle, uint8_t Radius, uint8_t DiscoverRoute, uint8_t SecurityEnable); event error_t indication(uint16_t SrcAddress, uint8_t NsduLength,uint8_t Nsdu[120], uint16_t LinkQuality); event error_t confirm(uint8_t NsduHandle, uint8_t Status); } tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/interfaces/NLME_DIRECT_JOIN.nc000066400000000000000000000006121207233610700261520ustar00rootroot00000000000000/** * NLME-DIRECT-JOIN * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author http://www.open-zb.net * @author Andre Cunha */ //page 179-181 interface NLME_DIRECT_JOIN { command error_t request(uint32_t DeviceAddress0, uint32_t DeviceAddress1, CapabilityInformation); event error_t confirm(uint32_t DeviceAddress0,uint32_t DeviceAddress1, uint8_t Status); } tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/interfaces/NLME_GET.nc000066400000000000000000000005501207233610700250010ustar00rootroot00000000000000/** * NLME-GET * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author http://www.open-zb.net * @author Andre Cunha * * */ //page 190-191 interface NLME_GET { command error_t request(uint8_t NIBAttribute); event error_t confirm(uint8_t Status, uint8_t NIBAttribute, uint16_t NIBAttributeLength, uint16_t NIBAttributeValue); } tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/interfaces/NLME_JOIN.nc000066400000000000000000000011261207233610700251210ustar00rootroot00000000000000/** * NLME-JOIN * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author http://www.open-zb.net * @author Andre Cunha * * */ //page 173-179 interface NLME_JOIN { command error_t request(uint16_t PANId, bool JoinAsRouter, bool RejoinNetwork, uint32_t ScanChannels, uint8_t ScanDuration, uint8_t PowerSource, uint8_t RxOnWhenIdle, uint8_t MACSecurity); event error_t indication(uint16_t ShortAddress, uint32_t ExtendedAddress[], uint8_t CapabilityInformation, bool SecureJoin); event error_t confirm(uint16_t PANId, uint8_t Status, uint16_t parentAddress); } tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/interfaces/NLME_LEAVE.nc000066400000000000000000000006541207233610700252230ustar00rootroot00000000000000/** * NLME-LEAVE * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author http://www.open-zb.net * @author Andre Cunha * * */ //page 181-184 interface NLME_LEAVE { command error_t request(uint64_t extDeviceAddress, uint8_t RemoveChildren, uint8_t MACSecurityEnable); event error_t indication(uint64_t extDeviceAddress); event error_t confirm(uint64_t extDeviceAddress, uint8_t status); } tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/interfaces/NLME_NETWORK_DISCOVERY.nc000066400000000000000000000006131207233610700271420ustar00rootroot00000000000000/* * NLME-Network-Discovery * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author http://www.open-zb.net * @author Andre Cunha * * */ //page 164-167 interface NLME_NETWORK_DISCOVERY { command error_t request(uint32_t ScanChannels, uint8_t ScanDuration); event error_t confirm(uint8_t NetworkCount,networkdescriptor networkdescriptorlist[], uint8_t Status); } tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/interfaces/NLME_NETWORK_FORMATION.nc000066400000000000000000000011131207233610700271250ustar00rootroot00000000000000/* * NLME-NETWORK-FORMATION * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author http://www.open-zb.net * @author Andre Cunha * * */ //page 167-169 interface NLME_NETWORK_FORMATION { command error_t request(uint8_t logicalChannel, uint8_t ScanDuration, uint8_t BeaconOrder, uint8_t SuperframeOrder, uint16_t PANId, bool BatteryLifeExtension); //command error_t request(uint32_t ScanChannels, uint8_t ScanDuration, uint8_t BeaconOrder, uint8_t SuperframeOrder, uint16_t PANId, uint8_t BatteryLifeExtension); event error_t confirm(uint8_t Status); } tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/interfaces/NLME_PERMIT_JOINING.nc000066400000000000000000000004621207233610700265410ustar00rootroot00000000000000/** * NLME-PERMIT_JOINING * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author http://www.open-zb.net * @author Andre Cunha * * */ //page 170-171 interface NLME_PERMIT_JOINING { command error_t request(uint8_t PermitDuration); event error_t confirm(uint8_t Status); } tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/interfaces/NLME_RESET.nc000066400000000000000000000004141207233610700252430ustar00rootroot00000000000000/** * NLME-RESET * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author http://www.open-zb.net * @author Andre Cunha * * */ //page 185-186 interface NLME_RESET { command error_t request(); event error_t confirm(uint8_t Status); } tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/interfaces/NLME_SET.nc000066400000000000000000000005501207233610700250150ustar00rootroot00000000000000/** * NLME-SET * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author http://www.open-zb.net * @author Andre Cunha * * */ //page 191-192 interface NLME_SET { command error_t request(uint8_t NIBAttribute, uint16_t NIBAttributeLength, uint16_t NIBAttributeValue); event error_t confirm(uint8_t Status, uint8_t NIBAttribute); } tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/interfaces/NLME_START_ROUTER.nc000066400000000000000000000005611207233610700263610ustar00rootroot00000000000000/** * NLME-Start-Router * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author http://www.open-zb.net * @author Andre Cunha * */ //page 171-173 interface NLME_START_ROUTER { command error_t request(uint8_t BeaconOrder, uint8_t SuperframeOrder, uint8_t BatteryLifeExtension,uint32_t StartTime); event error_t confirm(uint8_t Status); } tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/interfaces/NLME_SYNC.nc000066400000000000000000000004701207233610700251370ustar00rootroot00000000000000/** * NLME-SYNC * @author IPP HURRAY http://www.hurray.isep.ipp.pt/art-wise * @author http://www.open-zb.net * @author Andre Cunha * * */ //page 186-189 interface NLME_SYNC { command error_t request(uint8_t Track); event error_t indication(); event error_t confirm(uint8_t Status); } tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/nwk/000077500000000000000000000000001207233610700217015ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/nwk/NWKC.nc000066400000000000000000000045771207233610700230020ustar00rootroot00000000000000/* * @author open-zb http://www.open-zb.net * @author Stefano Tennina */ #include #include "nwk_func.h" #include "nwk_enumerations.h" #ifdef IM_COORDINATOR #include "nwk_const_coordinator.h" #else #ifdef IM_ROUTER #include "nwk_const_router.h" #else #include "nwk_const_end_device.h" #endif #endif configuration NWKC { provides { //NLDE NWK data service interface NLDE_DATA; //NLME NWK Management service #ifdef IM_COORDINATOR interface NLME_NETWORK_FORMATION; #else interface NLME_NETWORK_DISCOVERY; #endif #ifdef IM_ROUTER interface NLME_START_ROUTER; #endif interface NLME_SYNC; // It implements both request and indication! interface NLME_JOIN; // It implements both request and indication! interface NLME_LEAVE; interface NLME_RESET; interface NLME_GET; interface NLME_SET; } } implementation { // Coordinator components MainC, LedsC, Ieee802154BeaconEnabledC as MAC; components NWKP; MainC.SoftwareInit -> NWKP; #ifdef IM_ROUTER components new PoolC(message_t, ROUTER_FRAME_POOL_SIZE) as FramePool; NWKP.FramePool -> FramePool; #endif NWKP.Leds -> LedsC; //components RandomC; //NWKP.Random -> RandomC; components RandomLfsrC; NWKP.Random -> RandomLfsrC; // Interface with MAC NWKP.MLME_RESET -> MAC; NWKP.MLME_START -> MAC; NWKP.MCPS_DATA -> MAC; NWKP.MLME_SET -> MAC; NWKP.MLME_GET -> MAC; NWKP.MLME_ASSOCIATE -> MAC; NWKP.MLME_COMM_STATUS -> MAC; NWKP.MLME_SYNC -> MAC; NWKP.MLME_SYNC_LOSS -> MAC; #ifndef IM_COORDINATOR NWKP.MLME_SCAN -> MAC; NWKP.MLME_BEACON_NOTIFY -> MAC; NWKP.MLME_DISASSOCIATE -> MAC; #endif // Packet's Types #ifndef IM_END_DEVICE NWKP.IEEE154TxBeaconPayload -> MAC; #endif NWKP.Frame -> MAC; NWKP.Packet -> MAC; #ifndef IM_COORDINATOR NWKP.BeaconFrame -> MAC; #endif //MAC interfaces Still excluded //NWKP.MLME_GTS -> MacC.MLME_GTS; //NWKP.MLME_ORPHAN->MacC.MLME_ORPHAN; // NLDE NWK data service NLDE_DATA=NWKP; //NLME NWK Management service #ifdef IM_COORDINATOR NLME_NETWORK_FORMATION=NWKP; #else NLME_NETWORK_DISCOVERY=NWKP; #endif NLME_JOIN=NWKP; #ifdef IM_ROUTER NLME_START_ROUTER=NWKP; #endif NLME_LEAVE=NWKP; NLME_RESET=NWKP; NLME_SYNC=NWKP; NLME_GET=NWKP; NLME_SET=NWKP; #if (LOG_LEVEL & TIME_PERFORMANCE) // components LocalTimeMilliC; // NWKP.LocalTime -> LocalTimeMilliC; components LocalTimeMicroC; NWKP.LocalTime -> LocalTimeMicroC; #endif } tinyos-2.1.2+dfsg/tos/lib/zigbee/clusterTree/nwk/NWKP.nc000066400000000000000000002277631207233610700230230ustar00rootroot00000000000000/* * @author open-zb http://www.open-zb.net * @author Stefano Tennina */ //#include #include "printfUART.h" #include "TKN154.h" #include "log_enable.h" #ifdef NWK_PRINTFS_ENABLED #define lclPrintf_NWK printfUART #define lclPrintf_NWK_UART_init printfUART_init #else #define lclPrintf_NWK(VAR, __format, __args...) void lclPrintf_NWK_UART_init() {} #endif #if (LOG_LEVEL & TIME_PERFORMANCE) #define START_RECORD() perLocTimeStart = call LocalTime.get() #define STOP_RECORD() perLocTime[idxPerLocTime++] = (call LocalTime.get()) - perLocTimeStart #define PRINT_RECORD() lclPrintf_NWK("Performance report (line %d)\n", __LINE__); \ for (idxPrintVector = 0; idxPrintVector as FramePool; #endif interface MLME_DISASSOCIATE; //MAC interfaces Still excluded //interface MLME_GTS; //interface MLME_ORPHAN; #if (LOG_LEVEL & TIME_PERFORMANCE) // interface LocalTime as LocalTime; interface LocalTime as LocalTime; #endif } provides { interface Init; interface NLDE_DATA; //NLME NWK Management services #ifdef IM_COORDINATOR interface NLME_NETWORK_FORMATION; #else interface NLME_NETWORK_DISCOVERY; #endif #ifdef IM_ROUTER interface NLME_START_ROUTER; #endif interface NLME_JOIN; interface NLME_LEAVE; interface NLME_SYNC; interface NLME_RESET; interface NLME_GET; interface NLME_SET; } } implementation { #if (LOG_LEVEL & TIME_PERFORMANCE) uint32_t perLocTimeStart; uint32_t perLocTime[10]; uint8_t idxPerLocTime; uint8_t idxPrintVector; #endif // Variable needed to count the beacon transmitted to implement // adaptive "timers" norace uint16_t beaconCount; // Flag to enable the count of the beacon transmitted norace bool beaconCountEnable; nwkIB nwk_IB; //uint8_t device_type = TYPE_DEVICE; /*****************************************************/ /*************Neighbourtable Variables****************/ /*****************************************************/ //neighbour table array: norace neighbortableentry neighbortable[NEIGHBOUR_TABLE_SIZE]; //number of neigbourtable entries: norace uint8_t neighbour_count /*= 0*/; //the index of the parents neighbortable entry uint8_t parent /*= 0xFF*/; // Conventional value meaning No parent now // Chosen parent by configuration (initialize to default) uint16_t myChosenParent /*= DEF_CHOSEN_PARENT*/; uint16_t myChosenParentAddress; // Depth by configuration (initialize to default) uint8_t nwkMyDepth /*= DEF_DEVICE_DEPTH*/; #ifndef IM_END_DEVICE // Flag to enable beacon payload setting bool flgSetBeaconPay; #endif /*****************************************************/ /****************ASSOCIATION Variables********************/ /*****************************************************/ //CURRENT NETWORK ADDRESS uint16_t networkaddress /*= 0x0000*/; //COORDINATOR OR ROUTER //address assignement variables uint16_t cskip /*= 0*/; uint16_t cskip_routing /*= 0*/; //current pan characteristics uint8_t beaconorder; uint8_t superframeorder; //next child router address uint16_t next_child_router_address /*= 0*/; uint8_t number_child_router /*= 0x01*/; uint8_t number_child_end_devices/*= 0x01*/; /******************************************************/ /*********NEIGHBORTABLE MANAGEMENT FUNCTIONS*********/ /******************************************************/ void init_nwkIB(); uint8_t check_neighbortableentry(uint8_t addrmode, ieee154_address_t address); ieee154_status_t add_neighbortableentry(uint16_t PAN_Id,uint64_t Extended_Address,uint16_t Network_Address,uint8_t Device_Type,uint8_t Relationship, bool force); void update_neighbortableentry (uint16_t PAN_Id,uint64_t Extended_Address,uint16_t Network_Address,uint8_t Device_Type,uint8_t Relationship); //uint8_t find_suitable_parent(); // Set the chosen parent after a successuful association uint8_t setParent(uint16_t shortAddress); // Remove the previously chosen parent entry in the table after a SYNC loss event uint8_t deleteParent(uint8_t idxParent); uint16_t Cskip(int8_t d); // d can even be -1!! uint16_t nexthopaddress(uint16_t destinationaddress,uint8_t d); #if (LOG_LEVEL & DBG_NEIGHBOR_TABLE) void list_neighbourtable(); #endif #ifndef IM_COORDINATOR // Try to randomize the association request sending by implementing // a random counter of the beacons received uint8_t randomAssociation /*= 0*/; // Maximum association trials after that join unsuccess confirm is signaled uint8_t maxAssocTrials /*= MAX_ASSOCIATION_TRIALS*/; // Association status variable norace uint8_t associationStatus /*= 0*/; // Parent address for Association request ieee154_address_t parentAssocAddress; #endif // IEEE802.15.4 Global Variables //uint8_t m_associatedToParent = FALSE; bool m_BeaconWasFound /*= FALSE*/; message_t m_frame; //bool m_dataConfirmPending = FALSE; ieee154_PANDescriptor_t m_PANDescriptor; #ifndef IM_COORDINATOR ieee154_CapabilityInformation_t m_capabilityInformation; uint32_t lclScanChannels; uint8_t lclScanduration; void scanForBeacons(uint32_t ScanChannels, uint8_t Scanduration); #endif #ifdef DEBUG_STATUS_MESSAGE void IEEE154PrintStatus(uint16_t lineno, ieee154_status_t status); // Since printfs at the scan/beacon notify/association procedure // preturb the system working status, we define here a couple of // variables to debug info in a deferred print ieee154_status_t addParentStatus[10]; uint8_t currentStatusIndex /*= 0*/; #endif task void initTask() { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("NWKP Init.\n", ""); #endif nwk_IB.nwkSequenceNumber = call Random.rand16(); #ifdef DEBUG_STATUS_MESSAGE currentStatusIndex = 0; memset(addParentStatus, 0, 10*sizeof(ieee154_status_t)); #endif #if (LOG_LEVEL & TIME_PERFORMANCE) perLocTimeStart = 0; memset(perLocTime, 0, 10*sizeof(uint32_t)); idxPerLocTime = 0; idxPrintVector = 0; #endif beaconCount = 0; // Count beacon disabled by default beaconCountEnable = FALSE; /*****************************************************/ /*************Neighbourtable Variables****************/ /*****************************************************/ // Initialize the neighbor table memset(neighbortable, 0, NEIGHBOUR_TABLE_SIZE*sizeof(neighbortableentry)); //number of neigbourtable entries: neighbour_count = 0; //the index of the parents neighbortable entry parent = 0xFF; // Conventional value meaning No parent now #ifndef IM_END_DEVICE // First time beacon payload has to be set flgSetBeaconPay = TRUE; #endif /*****************************************************/ /****************ASSOCIATION Variables********************/ /*****************************************************/ //CURRENT NETWORK ADDRESS networkaddress = 0x0000; //COORDINATOR OR ROUTER //address assignement variables cskip = 0; cskip_routing = 0; //next child router address next_child_router_address = 0; number_child_router = 0x01; number_child_end_devices= 0x01; /*****************************************************/ /****************Integer Variables********************/ /*****************************************************/ #ifndef IM_COORDINATOR // Try to randomize the association request sending by implementing // a random counter of the beacons received randomAssociation = 0; // Maximum association trials after that join unsuccess confirm is signaled maxAssocTrials = MAX_ASSOCIATION_TRIALS; // Association status variable associationStatus = 0; #endif // IEEE802.15.4 Global Variables //uint8_t m_associatedToParent = FALSE; m_BeaconWasFound = FALSE; // Set device type #ifdef IM_ROUTER m_capabilityInformation.AlternatePANCoordinator = 1; m_capabilityInformation.DeviceType = 1; m_capabilityInformation.PowerSource = 0; m_capabilityInformation.ReceiverOnWhenIdle = 0; m_capabilityInformation.Reserved = 0; m_capabilityInformation.SecurityCapability = 0; m_capabilityInformation.AllocateAddress = 1; #else #ifdef IM_END_DEVICE m_capabilityInformation.AlternatePANCoordinator = 0; m_capabilityInformation.DeviceType = 0; m_capabilityInformation.PowerSource = 0; m_capabilityInformation.ReceiverOnWhenIdle = 0; m_capabilityInformation.Reserved = 0; m_capabilityInformation.SecurityCapability = 0; m_capabilityInformation.AllocateAddress = 1; #endif #endif } command error_t Init.init() { lclPrintf_NWK_UART_init();//make the possibility to print init_nwkIB(); // Initialize the seed to TOS_NODE_ID (which is the default option) call Random.setSeed(0); // Chosen parent by configuration (initialize to default) myChosenParent = DEF_CHOSEN_PARENT; myChosenParentAddress = 0xFF; // Depth by configuration (initialize to default) nwkMyDepth = DEF_DEVICE_DEPTH; post initTask(); return SUCCESS; } /*****************************************************************************************************/ /**************************************MLME-RESET*****************************************************/ /*****************************************************************************************************/ event void MLME_RESET.confirm(ieee154_status_t status) { lclPrintf_NWK("resetyouupie\n",""); #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("MLME_RESET.confirm.\n", ""); #endif #ifdef DEBUG_STATUS_MESSAGE IEEE154PrintStatus(__LINE__, status); #endif signal NLME_RESET.confirm(status); } #ifndef IM_COORDINATOR task void tryAssociation() { if ( (associationStatus & IM_ASSOCIATING) == IM_ASSOCIATING ) { ieee154_status_t status; //START_RECORD(); status = call MLME_ASSOCIATE.request( m_PANDescriptor.LogicalChannel, // LogicalChannel m_PANDescriptor.ChannelPage, // ChannelPage ADDR_MODE_SHORT_ADDRESS, // CoordAddrMode MAC_PANID, // CoordPANID parentAssocAddress, // CoordAddress m_capabilityInformation, // CapabilityInformation 0 // Security ); #ifdef DEBUG_STATUS_MESSAGE // Debug status here.... addParentStatus[currentStatusIndex] = status; currentStatusIndex++; #endif } } // Scan for beacon is called by the network discovery request and // starts the scan process calling the MLME_SCAN.request void scanForBeacons(uint32_t ScanChannels, uint8_t Scanduration) { uint8_t scanDuration = Scanduration; // we only scan the single channel on which we expect the PAN coordinator ieee154_phyChannelsSupported_t channel = ((uint32_t) 1) << ScanChannels; // Initialize the flags associationStatus = IM_SCANNING; m_BeaconWasFound = FALSE; // we want to be signalled every single beacon that is received during the // channel SCAN-phase, that's why we set "macAutoRequest" to FALSE call MLME_SET.macAutoRequest(FALSE); call MLME_SCAN.request( PASSIVE_SCAN, // ScanType channel, // ScanChannels scanDuration, // ScanDuration 0x00, // ChannelPage 0, // EnergyDetectListNumEntries NULL, // EnergyDetectList 0, // PANDescriptorListNumEntries NULL, // PANDescriptorList 0 // security ); } // It asynchronously receives beacons. If in the scan time, it save information about beacon found event message_t* MLME_BEACON_NOTIFY.indication(message_t* frame) { ieee154_phyCurrentPage_t page; //networkdescriptor networkdescriptorlist; uint8_t srcBeaconDevice = COORDINATOR; #ifdef DEBUG_STATUS_MESSAGE ieee154_status_t status; #endif beaconPay_t *bcnPay; uint32_t extAddress_trial = 0; atomic { if ( (associationStatus & ASSOCIATED) == ASSOCIATED) { // We are already associated with the Parent // and just received one of its periodic beacons //call Leds.led2Toggle(); return frame; } if ( (associationStatus & IM_ASSOCIATING) == IM_ASSOCIATING ) { // Filter out the un-needed beacons (maybe it is not necessary since we should have been already sync'ed) page = call MLME_GET.phyCurrentPage(); if (call BeaconFrame.parsePANDescriptor(frame, LOGICAL_CHANNEL, page, &m_PANDescriptor) == SUCCESS) { if (m_PANDescriptor.CoordAddrMode == ADDR_MODE_SHORT_ADDRESS && m_PANDescriptor.CoordPANId == MAC_PANID && m_PANDescriptor.CoordAddress.shortAddress == parentAssocAddress.shortAddress ) { if (randomAssociation == 0) post tryAssociation(); else randomAssociation--; } } return frame; } if ( (associationStatus & IM_SCANNING) != IM_SCANNING ) return frame; START_RECORD(); // Executed only in scanning phase // We have received "some" beacon during the SCAN-phase, let's // check if it is the beacon from our PAN page = call MLME_GET.phyCurrentPage(); if ( SUCCESS == ( call BeaconFrame.parsePANDescriptor(frame, LOGICAL_CHANNEL, page, &m_PANDescriptor) ) ) { if (m_PANDescriptor.CoordAddrMode == ADDR_MODE_SHORT_ADDRESS && m_PANDescriptor.CoordPANId == MAC_PANID ) { if (m_PANDescriptor.CoordAddress.shortAddress == 0x0000) { srcBeaconDevice = COORDINATOR; //lclPrintf_NWK("found coordinator!!\n", ""); } else { srcBeaconDevice = ROUTER; //lclPrintf_NWK("found a router!!\n", ""); } // Add the parent to the neighbor table. NOTE: the extended address is not available from the Beacon. // I'm defining a different value for the extended address that can be used as a "key" to access the table extAddress_trial = ((uint32_t)(m_PANDescriptor.CoordPANId) << 16) | m_PANDescriptor.CoordAddress.shortAddress; // Children look at beacon payload bcnPay = (beaconPay_t *)(call BeaconFrame.getBeaconPayload(frame)); if (bcnPay->tosAddress != myChosenParent) { call Leds.led0Toggle(); #ifdef DEBUG_STATUS_MESSAGE // Debug status here.... addParentStatus[currentStatusIndex] = add_neighbortableentry( m_PANDescriptor.CoordPANId, extAddress_trial, m_PANDescriptor.CoordAddress.shortAddress, srcBeaconDevice, NEIGHBOR_IS_ALT_PARENT, FALSE); currentStatusIndex++; #else add_neighbortableentry( m_PANDescriptor.CoordPANId, extAddress_trial, m_PANDescriptor.CoordAddress.shortAddress, srcBeaconDevice, NEIGHBOR_IS_ALT_PARENT, FALSE); #endif STOP_RECORD(); return frame; } m_BeaconWasFound = TRUE; // yes! call Leds.led0Off(); call Leds.led1Toggle(); myChosenParentAddress = m_PANDescriptor.CoordAddress.shortAddress; // Force the neighbor table entry to be added #ifdef DEBUG_STATUS_MESSAGE // Debug status here.... addParentStatus[currentStatusIndex] = add_neighbortableentry( m_PANDescriptor.CoordPANId, extAddress_trial, m_PANDescriptor.CoordAddress.shortAddress, srcBeaconDevice, NEIGHBOR_IS_ALT_PARENT, TRUE); currentStatusIndex++; #else add_neighbortableentry( m_PANDescriptor.CoordPANId, extAddress_trial, m_PANDescriptor.CoordAddress.shortAddress, srcBeaconDevice, NEIGHBOR_IS_ALT_PARENT, TRUE); #endif } } STOP_RECORD(); } return frame; } // This is activated at the end of the scan process. // It is linked to the beacon notify to check if during the scan we get the expected beacon or not event void MLME_SCAN.confirm( ieee154_status_t status, uint8_t ScanType, uint8_t ChannelPage, uint32_t UnscannedChannels, uint8_t EnergyDetectListNumEntries, int8_t* EnergyDetectList, uint8_t PANDescriptorListNumEntries, ieee154_PANDescriptor_t* PANDescriptorList ) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("MLME_SCAN.confirm\n", ""); #endif #ifdef DEBUG_STATUS_MESSAGE IEEE154PrintStatus(__LINE__, status); #endif PRINT_RECORD(); if (m_BeaconWasFound) { atomic { // our candidate parent is out there sending beacons // Now we have a choice: // 1. signaling a discovery confirm and start the association after a join request, or // 2. avoid this signal and directly try to associate, issuing directly a JOIN confirm // after the successful association // Go for OPTION 2 // Force the topology to the one preplanned!! parentAssocAddress.shortAddress = myChosenParentAddress; // let's try to associate with it call MLME_SET.macCoordShortAddress(parentAssocAddress.shortAddress); call MLME_SET.macPANId(m_PANDescriptor.CoordPANId); call MLME_SYNC.request(m_PANDescriptor.LogicalChannel, m_PANDescriptor.ChannelPage, TRUE); // Try association after "randomAssociation" beacons randomAssociation = OFFSET_BCN_COUNTER + ((call Random.rand16()) % MAX_RANDOM_BCN_COUNTER); call Leds.led1On(); associationStatus = IM_ASSOCIATING; #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("randomAssociation %d\n", (uint32_t)randomAssociation); #endif } } else { // Not got it. Retry!! scanForBeacons(lclScanChannels, lclScanduration); } } #endif // #ifndef IM_COORDINATOR /*****************************************************************************************************/ /**************************************MLME-ASSOCIATE*************************************************/ /*****************************************************************************************************/ event void MLME_ASSOCIATE.confirm( uint16_t assocShortAddress, uint8_t status, ieee154_security_t *security ) { #ifndef IM_COORDINATOR #ifdef DEBUG_STATUS_MESSAGE uint8_t idxParent; IEEE154PrintStatus(__LINE__, status); for (idxParent=0; idxParent child communication must be enabled call MLME_SET.macAutoRequest(TRUE); associationStatus = ASSOCIATED; // Set my local address call MLME_SET.macShortAddress(assocShortAddress); networkaddress = assocShortAddress; // Set my parent //lclPrintf_NWK("Setting parent 0x%x\n", m_PANDescriptor.CoordAddress.shortAddress); parent = setParent(parentAssocAddress.shortAddress); #if (LOG_LEVEL & ERROR_CONDITIONS) if (parent == 0xFF) { // Device not found in the table lclPrintf_NWK("Parent not found in the table\n", ""); #if (LOG_LEVEL & DBG_NEIGHBOR_TABLE) list_neighbourtable(); #endif } #endif } call Leds.led0Off(); call Leds.led1Off(); // Signal the confirmation of the ASSOCIATION/JOIN process signal NLME_JOIN.confirm(MAC_PANID, NWK_SUCCESS, parentAssocAddress.shortAddress); } else { #if (MAX_ASSOCIATION_TRIALS==0) // Retry infinitely after "randomAssociation" beacons randomAssociation = (call Random.rand16()) % MAX_RANDOM_BCN_COUNTER; // Refresh the association status (might be useless...) associationStatus = IM_ASSOCIATING; #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("randomAssociation %d\n", (uint32_t)randomAssociation); #endif #else // Try a finite number of times if (maxAssocTrials == 0) { // Signal join unsuccessfull to upper level signal NLME_JOIN.confirm(MAC_PANID, NWK_STARTUP_FAILURE, parentAssocAddress.shortAddress); // Reset association trials counter maxAssocTrials = MAX_ASSOCIATION_TRIALS; // Reset association status associationStatus = 0; } else { maxAssocTrials--; // Retry after "randomAssociation" beacons randomAssociation = (call Random.rand16()) % MAX_RANDOM_BCN_COUNTER; // Refresh the association status (might be useless...) associationStatus = IM_ASSOCIATING; #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("randomAssociation %d\n", (uint32_t)randomAssociation); #endif } #endif } #endif } event void MLME_ASSOCIATE.indication( uint64_t deviceAddress, ieee154_CapabilityInformation_t capabilityInformation, ieee154_security_t *security ) { #ifndef IM_END_DEVICE uint8_t cindex = 0xFF; ieee154_address_t address; #ifdef DEBUG_STATUS_MESSAGE //ieee154_status_t status; #endif atomic { address.extendedAddress = deviceAddress; // Check the neighbour table cindex = check_neighbortableentry(ADDR_MODE_EXTENDED_ADDRESS, address); if( cindex != 0xFF ) { #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("Device already present. Confirming address: 0x%x\n", neighbortable[cindex].Network_Address); #endif call MLME_ASSOCIATE.response( deviceAddress, neighbortable[cindex].Network_Address, IEEE154_ASSOCIATION_SUCCESSFUL, 0 ); return; } if(nwk_IB.nwkAvailableAddresses == 0) { // If there are no available addresses the coordinator/router // shall not respond to the association request call MLME_ASSOCIATE.response( deviceAddress, 0xFFFF, IEEE154_PAN_AT_CAPACITY, 0 ); #if (LOG_LEVEL & ERROR_CONDITIONS) lclPrintf_NWK("nwk_IB.nwkAvailableAddresses = 0\n", ""); #endif // Terminate immediately return; } //verify if the device is associating as a router (FFD) or an end device (RFD) if ( capabilityInformation.DeviceType == 1 ) { if (number_child_router > 1 + MAXROUTERS) { // number_child_router starts from 1 instead of 0 due to cskip mechanism // If there are no available addresses the coordinator/router shall not respond to the association request call MLME_ASSOCIATE.response( deviceAddress, 0xFFFF, IEEE154_PAN_AT_CAPACITY, 0 ); #if (LOG_LEVEL & ERROR_CONDITIONS) lclPrintf_NWK("number_child_router (%d) > MAXROUTERS\n",(uint32_t)number_child_router); #endif // Terminate immediately return; } //add ROUTER to the neighbour table #ifndef DEBUG_STATUS_MESSAGE add_neighbortableentry( MAC_PANID, deviceAddress, next_child_router_address, ROUTER, NEIGHBOR_IS_CHILD, FALSE); #else IEEE154PrintStatus(__LINE__, add_neighbortableentry( MAC_PANID, deviceAddress, next_child_router_address, ROUTER, NEIGHBOR_IS_CHILD, FALSE)); #endif #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("It's a router: sending address: 0x%x\n",next_child_router_address); #endif //send response, this shall lead to confirm in child device call MLME_ASSOCIATE.response( deviceAddress, next_child_router_address, IEEE154_ASSOCIATION_SUCCESSFUL, 0 ); // Compute the next address next_child_router_address = networkaddress + ((number_child_router-1) * cskip) +1 ; // Increment the number of associated routers number_child_router++; // Decrese the number of available addresses nwk_IB.nwkAvailableAddresses--; //lclPrintf_NWK("Dn_cr %x\n",next_child_router_address); // Terminate immediately return; } // Verify if its possible to associate children in the address space // The number of end devices musts be > to maximum children minus maximum routers if (number_child_end_devices > 1 + (MAXCHILDREN - (number_child_router-1))) { // Both number_child_end_devices and number_child_router start // from 1 instead of 0 due to cskip mechanism //if there are no available addresses the coordinator/router shall not respond to the association request call MLME_ASSOCIATE.response( deviceAddress, 0xFFFF, IEEE154_PAN_AT_CAPACITY, 0 ); #if (LOG_LEVEL & ERROR_CONDITIONS) lclPrintf_NWK("number_child_end_devices (%d) > 1 + (MAXCHILDREN - (number_child_router (%d) - 1))\n", (uint32_t)number_child_end_devices, (uint32_t)number_child_router); #endif // Terminate immediately return; } //add END_DEVICE to the neighbour table #ifndef DEBUG_STATUS_MESSAGE add_neighbortableentry( MAC_PANID, deviceAddress, nwk_IB.nwkNextAddress, END_DEVICE, NEIGHBOR_IS_CHILD, FALSE); #else IEEE154PrintStatus(__LINE__, add_neighbortableentry( MAC_PANID, deviceAddress, nwk_IB.nwkNextAddress, END_DEVICE, NEIGHBOR_IS_CHILD, FALSE)); #endif #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("It's an end_device: sending address: 0x%x\n", nwk_IB.nwkNextAddress); #endif //send response, this shall lead to confirm in child device call MLME_ASSOCIATE.response( deviceAddress, nwk_IB.nwkNextAddress, IEEE154_ASSOCIATION_SUCCESSFUL, 0 ); // Compute next address nwk_IB.nwkNextAddress = nwk_IB.nwkNextAddress + nwk_IB.nwkAddressIncrement; // Increment the number of associated end devices number_child_end_devices++; // Decrese the number of available addresses nwk_IB.nwkAvailableAddresses--; } #endif } /*****************************************************************************************************/ /**************************************MLME-START*****************************************************/ /*****************************************************************************************************/ event void MLME_START.confirm(ieee154_status_t status) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("MLME_START.confirm.\n", ""); #endif #ifdef DEBUG_STATUS_MESSAGE IEEE154PrintStatus(__LINE__, status); #endif if (status != IEEE154_SUCCESS) call MLME_RESET.request(TRUE); else { #ifdef IM_COORDINATOR signal NLME_NETWORK_FORMATION.confirm(status); #else #ifdef IM_ROUTER if ( (associationStatus & ASSOCIATED) == ASSOCIATED ) signal NLME_START_ROUTER.confirm(status); #endif #endif } } #ifdef IM_COORDINATOR /*************************************************************/ /******************NLME - NETWORK - FORMATION*****************/ /*************************************************************/ //This primitive allows the NHL to request to start a ZigBee network with itself as the coordinator //Page 167-169 command error_t NLME_NETWORK_FORMATION.request(uint8_t logicalChannel, uint8_t ScanDuration, uint8_t BeaconOrder, uint8_t SuperframeOrder, uint16_t PANId, bool BatteryLifeExtension) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("NLME_NETWORK_FORMATION.request.\n", ""); #endif // COORDINATOR OR ROUTER // Reset address assignement variables // next child router address number_child_router = 0x01; number_child_end_devices= 0x01; //******************************************************* //***********SET PAN VARIABLES*************************** //depth = 0; // The depth for the coordinator is 0 by default nwk_IB.nwkAvailableAddresses = AVAILABLEADDRESSES; nwk_IB.nwkAddressIncrement = ADDRESSINCREMENT; nwk_IB.nwkMaxChildren = MAXCHILDREN; //number of children a device is allowed to have on its current network nwk_IB.nwkMaxDepth = MAXDEPTH; //the depth a device can have nwk_IB.nwkMaxRouters = MAXROUTERS; cskip = Cskip(nwkMyDepth); cskip_routing = Cskip(nwkMyDepth - 1); nwk_IB.nwkNextAddress = networkaddress + (cskip * nwk_IB.nwkMaxRouters) + nwk_IB.nwkAddressIncrement; next_child_router_address = networkaddress +((number_child_router-1) * cskip) + 1; number_child_router++; // Start the Coordinator call MLME_SET.macShortAddress(0x0000); call MLME_SET.macAssociationPermit(TRUE); #ifdef DEBUG_STATUS_MESSAGE IEEE154PrintStatus(__LINE__, call MLME_START.request( PANId, // PANId logicalChannel, // LogicalChannel 0, // ChannelPage, 0, // StartTime, BeaconOrder, // BeaconOrder SuperframeOrder,// SuperframeOrder TRUE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment 0, // CoordRealignSecurity 0 // BeaconSecurity )); #else call MLME_START.request( PANId, // PANId logicalChannel, // LogicalChannel 0, // ChannelPage, 0, // StartTime, BeaconOrder, // BeaconOrder SuperframeOrder,// SuperframeOrder TRUE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment 0, // CoordRealignSecurity 0 // BeaconSecurity ); #endif return SUCCESS; } #endif #ifndef IM_COORDINATOR /*************************************************************/ /***************NLME - NETWORK - DISCOVERY *******************/ /*************************************************************/ //This primitive allows the next higher layer to request that the NWK layer discover networks currently operating within the POS. //p164 and 210 command error_t NLME_NETWORK_DISCOVERY.request(uint32_t ScanChannels, uint8_t Scanduration) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("NLME_NETWORK_DISCOVERY.request.\n", ""); #endif // Store scan parameters for future retries lclScanChannels = ScanChannels; lclScanduration = Scanduration; scanForBeacons(ScanChannels, Scanduration); return SUCCESS; } #endif /** * The MLME-SAP communication status primitive defines how the MLME * communicates to the next higher layer about transmission status, * when the transmission was INSTIGATED by a RESPONSE PRIMITIVE, and * about security errors on incoming packets. (IEEE 802.15.4-2006, * Sect. 7.1.12) */ // In our case, security is disabled and the only response primitive is issued // by the MLME_ASSOCIATE interface!! event void MLME_COMM_STATUS.indication ( uint16_t PANId, uint8_t SrcAddrMode, ieee154_address_t SrcAddr, uint8_t DstAddrMode, ieee154_address_t DstAddr, ieee154_status_t status, ieee154_security_t *security ) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("MLME_COMM_STATUS.indication.\n", ""); #endif #ifdef DEBUG_STATUS_MESSAGE IEEE154PrintStatus(__LINE__, status); #endif if (status == IEEE154_SUCCESS){ call Leds.led0Off(); #ifndef IM_END_DEVICE signal NLME_JOIN.indication(0, 0, 0, 0); #endif } else { call Leds.led0On(); } } /*************************************************************/ /************************NLME - JOIN**************************/ /*************************************************************/ //This primitive allows the NHL to request to join a network through association. //p173 and 210 // Used only if MAX_ASSOCIATION_TRIALS > 0, since the association // request is automatically repeated in case of failure after the scan process command error_t NLME_JOIN.request(uint16_t PANId, bool JoinAsRouter, bool RejoinNetwork, uint32_t ScanChannels, uint8_t ScanDuration, uint8_t PowerSource, uint8_t RxOnWhenIdle, uint8_t MACSecurity) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("NLME_JOIN.request.\n", ""); #endif #ifndef IM_COORDINATOR atomic { if ( (associationStatus & ASSOCIATED) != ASSOCIATED ) { // Try or Retry association after "randomAssociation" beacons randomAssociation = OFFSET_BCN_COUNTER + ((call Random.rand16()) % MAX_RANDOM_BCN_COUNTER); // Refresh the association status (might be useless...) associationStatus = IM_ASSOCIATING; #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("randomAssociation %d\n", (uint32_t)randomAssociation); #endif } } #endif return SUCCESS; } /*************************************************************/ /*************************NLDE - DATA*************************/ /*************************************************************/ //This primitive requests the transfer of a data PDU //page 159-161 command error_t NLDE_DATA.request(uint16_t DstAddr, uint8_t NsduLength, uint8_t Nsdu[120], uint8_t NsduHandle, uint8_t Radius, uint8_t DiscoverRoute, uint8_t SecurityEnable) { //prefixed size because the devices reset itself when there is an error in the length routing_fields *routing_fields_ptr; uint8_t m_payloadLen = 0; // Pointer for using payload for IEEE802.15.4 TKN MAC uint8_t *p; // Destination Address for IEEE802.15.4 TKN MAC ieee154_address_t deviceShortAddress; // QoS Required from the packet uint8_t MAC_QoS = 0; #ifndef IM_END_DEVICE uint8_t next_hop_index; #endif #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("NLDE_DATA.request. DstAddr: 0x%x\n", DstAddr); #endif #if (LOG_LEVEL & DBG_NEIGHBOR_TABLE) // Print actual neighbor table list_neighbourtable(); #endif #ifndef IM_COORDINATOR if ( (associationStatus & ASSOCIATED) != ASSOCIATED ) { #if (LOG_LEVEL & ERROR_CONDITIONS) lclPrintf_NWK("NLDE_DATA.request - NWK_INVALID_REQUEST\n", ""); #endif signal NLDE_DATA.confirm(NsduHandle, NWK_INVALID_REQUEST); return FAIL; } #endif // Create Payload m_payloadLen = (NsduLength + sizeof(routing_fields)); p = call Packet.getPayload(&m_frame, m_payloadLen); if (p != NULL) { atomic { // Try to simplify/speed up this process copying directly // into the packet routing_fields_ptr = (routing_fields *)p; routing_fields_ptr->frame_control = set_route_frame_control(0x00,0x01,DiscoverRoute,SecurityEnable); routing_fields_ptr->destination_address = DstAddr; routing_fields_ptr->source_address = networkaddress; routing_fields_ptr->radius = Radius; routing_fields_ptr->sequence_number = nwk_IB.nwkSequenceNumber; nwk_IB.nwkSequenceNumber = (nwk_IB.nwkSequenceNumber+1) % 0xFF; memcpy(&(p[sizeof(routing_fields)]), Nsdu, NsduLength*sizeof(uint8_t)); } } else { #if (LOG_LEVEL & ERROR_CONDITIONS) // Some feedback on this lclPrintf_NWK("NLDE_DATA.request - Packet.getPayload fails\n", ""); #endif return FAIL; } #if (LOG_LEVEL & DBG_CUSTOM) //lclPrintf_NWK("Sending message. Payload lenght: 0x%x\n", m_payloadLen); //for (i=0; idestination_address: 0x%x\n", routing_fields_ptr->destination_address); #endif #ifdef IM_END_DEVICE // The end device always sends the message to the parent only deviceShortAddress.shortAddress = neighbortable[parent].Network_Address; // destination #else // Send message if the device is the COORDINATOR or a ROUTER if (routing_fields_ptr->destination_address == 0xFFFF) { // This is a broadcast packet. deviceShortAddress.shortAddress = 0xFFFF; // destination } else if( (networkaddress < routing_fields_ptr->destination_address) && (routing_fields_ptr->destination_address < (networkaddress + cskip_routing ) ) ) { // Route down to appropriate child // Temporarily use that variable to store the intended ultimate destination address deviceShortAddress.shortAddress = routing_fields_ptr->destination_address; // Check if destination is one of my children next_hop_index = check_neighbortableentry(ADDR_MODE_SHORT_ADDRESS, deviceShortAddress); if (next_hop_index == 0xFF) { // Destination is not my child deviceShortAddress.shortAddress = nexthopaddress(routing_fields_ptr->destination_address, nwkMyDepth); } else { // I'm routing to my child deviceShortAddress.shortAddress = neighbortable[next_hop_index].Network_Address; } #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("Sending data down\n", ""); #endif } else { // Route up to parent deviceShortAddress.shortAddress = neighbortable[parent].Network_Address; #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("Sending data up\n", ""); #endif } #endif #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("Sending data to 0x%x\n", deviceShortAddress.shortAddress); #endif // Send Message call Frame.setAddressingFields( &m_frame, ADDR_MODE_SHORT_ADDRESS, // SrcAddrMode, ADDR_MODE_SHORT_ADDRESS, // DstAddrMode, MAC_PANID, // DstPANId, &deviceShortAddress, // DstAddr, NULL // security ); #ifdef IM_COORDINATOR // The coordinator musts put INDIRECT as a TX option MAC_QoS = TX_OPTIONS_INDIRECT; #endif // Request ACK by default. If broadcast packet, then this setting // is automathically ignored at the MAC level MAC_QoS |= TX_OPTIONS_ACK; #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("MAC_QoS 0x%x\n", MAC_QoS); lclPrintf_NWK("Sending data to 0x%x\n", deviceShortAddress.shortAddress); #endif #ifndef DEBUG_STATUS_MESSAGE call MCPS_DATA.request( &m_frame, // msdu, m_payloadLen, // payloadLength, NsduHandle, // msduHandle, MAC_QoS // TxOptions, ); #else IEEE154PrintStatus(__LINE__, call MCPS_DATA.request( &m_frame, // msdu, m_payloadLen, // payloadLength, NsduHandle, // msduHandle, MAC_QoS // TxOptions, )); #endif return SUCCESS; } /*****************************************************************************************************/ /*****************************************************************************************************/ /********************* MCPS EVENTS **************************************/ /*****************************************************************************************************/ /*****************************************************************************************************/ /*****************************************************************************************************/ /********************* MCPS-DATA **************************************/ /*****************************************************************************************************/ event message_t* MCPS_DATA.indication(message_t* rcvdFrame) { #ifdef IM_ROUTER message_t* returnFrame; ieee154_address_t deviceShortAddress; uint8_t next_hop_index; uint8_t MAC_QoS; #endif uint8_t rxPayloadLen = call Frame.getPayloadLength(rcvdFrame); uint8_t* rxPayload = call Frame.getPayload(rcvdFrame); uint16_t mpduLinkQuality = call Frame.getLinkQuality(rcvdFrame); //uint8_t i = 0; routing_fields *routing_fields_ptr; routing_fields_ptr = (routing_fields *)rxPayload; #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("MCPS_DATA.indication.\n", ""); #endif // Safety check on the payload length if (rxPayloadLen < sizeof(routing_fields)) { #if (LOG_LEVEL & ERROR_CONDITIONS) lclPrintf_NWK("MCPS_DATA.indication %d: Received a bad packet.. discarding it \n", __LINE__); #endif return rcvdFrame; } #ifndef IM_COORDINATOR // If the node is not connected to a parent, // discard the packet received if ( (associationStatus & ASSOCIATED) != ASSOCIATED ) { #if (LOG_LEVEL & ERROR_CONDITIONS) lclPrintf_NWK("MCPS_DATA.indication %d: Not associated.. discarding packet \n", __LINE__); #endif return rcvdFrame; } #endif if ( routing_fields_ptr->destination_address == networkaddress || routing_fields_ptr->destination_address == 0xFFFF ) { uint8_t payload[120]; atomic { memset(payload, 0, 120*sizeof(uint8_t)); // I am the final destination or in the "destination (broadcast) group" #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("MCPS_DATA.indication. I am the destination\n", ""); #endif memcpy(payload,&(rxPayload[sizeof(routing_fields)]),(rxPayloadLen-sizeof(routing_fields))*sizeof(uint8_t)); //pass data up to APP layer signal NLDE_DATA.indication(routing_fields_ptr->source_address, (uint8_t)(rxPayloadLen-sizeof(routing_fields)), payload, mpduLinkQuality); } return rcvdFrame; } //I am not the destination: must forward this packet //lclPrintf_NWK("I am NOT the destination. Packet to forward\n", ""); #ifndef IM_ROUTER #if (LOG_LEVEL & ERROR_CONDITIONS) lclPrintf_NWK("I'm not a router. Check this!!\n", ""); #endif return rcvdFrame; #else // The message should be forwarded // Since this event handler has to return a frame buffer to the MAC, // we don't want to return "receivedFrame", because we will try // to forward that. Instead we get an "empty" // frame through the PoolC component and return that to the MAC. returnFrame = call FramePool.get(); if (returnFrame == NULL) { #if (LOG_LEVEL & ERROR_CONDITIONS) lclPrintf_NWK("no empty frame left!\n", ""); #endif return rcvdFrame; // no empty frame left! } // Act as usual forwarding the packet along the tree if( (networkaddress < routing_fields_ptr->destination_address) && (routing_fields_ptr->destination_address < (networkaddress + cskip_routing ) ) ) { #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("route down to appropriate child\n", ""); #endif MAC_QoS = TX_OPTIONS_INDIRECT | TX_OPTIONS_ACK; // Temporarily use that variable to store the intended ultimate destination address deviceShortAddress.shortAddress = (uint16_t)routing_fields_ptr->destination_address; //check if destination is one of my children next_hop_index = check_neighbortableentry(ADDR_MODE_SHORT_ADDRESS, deviceShortAddress); if (next_hop_index == 0xFF) { //destination is not my child deviceShortAddress.shortAddress = nexthopaddress(routing_fields_ptr->destination_address, nwkMyDepth); } else { //Im routing to my child deviceShortAddress.shortAddress = neighbortable[next_hop_index].Network_Address; } } else { //route up to the parent #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("route up to the parent\n", ""); #endif deviceShortAddress.shortAddress = neighbortable[parent].Network_Address; MAC_QoS = TX_OPTIONS_ACK; } // to forward the frame we update the addressing part // The payload part remains unchanged call Frame.setAddressingFields( rcvdFrame, ADDR_MODE_SHORT_ADDRESS, // SrcAddrMode, ADDR_MODE_SHORT_ADDRESS, // DstAddrMode, MAC_PANID, // DstPANId, &deviceShortAddress, // DstAddr, NULL // security ); // Forward the received Message #ifndef DEBUG_STATUS_MESSAGE call MCPS_DATA.request( rcvdFrame, // msdu, rxPayloadLen, // payloadLength, 0, // msduHandle, MAC_QoS // TxOptions ); #else IEEE154PrintStatus(__LINE__, call MCPS_DATA.request( rcvdFrame, // msdu, rxPayloadLen, // payloadLength, 0, // msduHandle, MAC_QoS // TxOptions )); #endif // Return the empty frame to the MAC return returnFrame; #endif // ifndef IM_ROUTER else branch } event void MCPS_DATA.confirm( message_t *msg, uint8_t msduHandle, ieee154_status_t status, uint32_t timestamp ) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("MCPS_DATA.confirm.\n", ""); #endif #ifdef DEBUG_STATUS_MESSAGE IEEE154PrintStatus(__LINE__, status); #endif #ifdef IM_ROUTER // Since the MCPS_DATA.indication event handler has to return a frame buffer to the MAC // we put an "empty" frame through the PoolC component to be used in the MCPS_DATA.indication. call FramePool.put(msg); #endif signal NLDE_DATA.confirm(msduHandle,status); } #ifdef IM_ROUTER /*************************************************************/ /*******************NLME - START - ROUTER*********************/ /*************************************************************/ //This primitive allows the NHL of a ZigBee Router to initialize or change its superframe configuration. //p171 and 210 command error_t NLME_START_ROUTER.request(uint8_t BeaconOrder, uint8_t SuperframeOrder, bool BatteryLifeExtension,uint32_t StartTime) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("NLME_START_ROUTER.request. StartTime: 0x%x\n", StartTime); #endif //assign current BO and SO beaconorder = BeaconOrder; superframeorder = SuperframeOrder; // Reset address assignement variables (this is for the beginning // or after a beacon loss and restart) // next child router address number_child_router = 0x01; number_child_end_devices= 0x01; //******************************************************* //***********SET PAN VARIABLES*************************** nwk_IB.nwkAvailableAddresses = AVAILABLEADDRESSES; nwk_IB.nwkAddressIncrement = ADDRESSINCREMENT; nwk_IB.nwkMaxChildren = MAXCHILDREN; //number of children a device is allowed to have on its current network nwk_IB.nwkMaxDepth = MAXDEPTH; //the depth a device can have nwk_IB.nwkMaxRouters = MAXROUTERS; cskip = Cskip(nwkMyDepth); cskip_routing = Cskip(nwkMyDepth - 1); nwk_IB.nwkNextAddress = networkaddress + (cskip * nwk_IB.nwkMaxRouters) + nwk_IB.nwkAddressIncrement; next_child_router_address = networkaddress +((number_child_router-1) * cskip) + 1; number_child_router++; #if (LOG_LEVEL & DBG_CUSTOM) lclPrintf_NWK("TOS_NODE_ID %d\n", (uint32_t)TOS_NODE_ID); lclPrintf_NWK("nwkMyDepth %d\n", (uint32_t)nwkMyDepth); //lclPrintf_NWK("nwkMyDepth %d\n", (uint32_t)nwkMyDepth); //lclPrintf_NWK("cskip %d\n", (uint32_t)cskip); //lclPrintf_NWK("C %d D %d r %d\n", (uint32_t)MAXCHILDREN, (uint32_t)MAXDEPTH, (uint32_t)MAXROUTERS); #endif call MLME_SET.macAssociationPermit(TRUE); #ifdef DEBUG_STATUS_MESSAGE IEEE154PrintStatus(__LINE__, call MLME_START.request( MAC_PANID, // PANId LOGICAL_CHANNEL, // LogicalChannel 0, // ChannelPage, StartTime, // StartTime, BeaconOrder, // BeaconOrder SuperframeOrder, // SuperframeOrder FALSE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment 0, // CoordRealignSecurity 0 // BeaconSecurity )); #else call MLME_START.request( MAC_PANID, // PANId LOGICAL_CHANNEL, // LogicalChannel 0, // ChannelPage, StartTime, // StartTime, BeaconOrder, // BeaconOrder SuperframeOrder, // SuperframeOrder FALSE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment 0, // CoordRealignSecurity 0 // BeaconSecurity ); #endif return SUCCESS; } #endif /*****************************************************************************************************/ /**************************************MLME-SYNC-LOSS*************************************************/ /*****************************************************************************************************/ event void MLME_SYNC_LOSS.indication( ieee154_status_t lossReason, uint16_t PANId, uint8_t LogicalChannel, uint8_t ChannelPage, ieee154_security_t *security ) { #ifndef IM_COORDINATOR #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("MLME_SYNC_LOSS.indication.\n", ""); #endif #ifdef DEBUG_STATUS_MESSAGE IEEE154PrintStatus(__LINE__, lossReason); #endif #ifdef IM_ROUTER // We have lost track of our Parent's beacons :( // We stop sending our own beacons, until we have synchronized with // the Parent again. if (lossReason == IEEE154_BEACON_LOSS) { call Leds.led2Off(); // Reset the sending beacons call MLME_START.request( MAC_PANID, // PANId LOGICAL_CHANNEL, // LogicalChannel 0, // ChannelPage, 0, // StartTime, 15, // BeaconOrder 15, // SuperframeOrder FALSE, // PANCoordinator FALSE, // BatteryLifeExtension FALSE, // CoordRealignment 0, // CoordRealignSecurity 0 // BeaconSecurity ); } // Block temporarily the association // mechanism from other nodes call MLME_SET.macAssociationPermit(FALSE); #endif // Remove the current parent from the neighbor table parent = deleteParent(parent); // Signal this to the Adaptation Layer to be instructed that // a new association is necessary and send again position info signal NLME_SYNC.indication(); // If the sync loss is *not* on purpose ... if ( (associationStatus & DISASSOCIATED) != DISASSOCIATED) { // ... restart automatically from the scan channels scanForBeacons(lclScanChannels, lclScanduration); } #endif // #ifndef IM_COORDINATOR } #ifndef IM_COORDINATOR task void tryDisassociation() { call MLME_DISASSOCIATE.request ( ADDR_MODE_SHORT_ADDRESS, MAC_PANID, parentAssocAddress, IEEE154_DEVICE_WISHES_TO_LEAVE, 1, 0); } #endif /*************************************************************/ /************************NLME - LEAVE*************************/ /*************************************************************/ //This primitive allows the NWK to request that it or another device leaves the network //page 181-183 command error_t NLME_LEAVE.request(uint64_t extDeviceAddress, bool RemoveChildren, bool MACSecurityEnable) { #ifndef IM_COORDINATOR if (!RemoveChildren) post tryDisassociation(); #endif return SUCCESS; } /*****************************************************************************************************/ /**************************************MLME-DISASSOCIATE**********************************************/ /*****************************************************************************************************/ event void MLME_DISASSOCIATE.confirm ( ieee154_status_t status, uint8_t DeviceAddrMode, uint16_t DevicePANID, ieee154_address_t DeviceAddress ) { uint64_t address; #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("MLME_DISASSOCIATE.confirm.\n", ""); #endif #ifdef DEBUG_STATUS_MESSAGE IEEE154PrintStatus(__LINE__, status); #endif switch (DeviceAddrMode) { case ADDR_MODE_SHORT_ADDRESS: address = (uint64_t)(DeviceAddress.shortAddress); break; case ADDR_MODE_EXTENDED_ADDRESS: address = DeviceAddress.extendedAddress; break; default: // Something strange happens #if (LOG_LEVEL & ERROR_CONDITIONS) lclPrintf_NWK("MLME_DISASSOCIATE.confirm. DeviceAddrMode (0x%x) not recognized\n", DeviceAddrMode); #endif break; } if (status == IEEE154_SUCCESS) { #ifndef IM_COORDINATOR // Association status variable set to disassociate to prevent // a new automatic association tentative after the sync loss event associationStatus = DISASSOCIATED; #endif signal NLME_LEAVE.confirm(address, NWK_SUCCESS); } else { signal NLME_LEAVE.confirm(address, NWK_LEAVE_UNCONFIRMED); } } event void MLME_DISASSOCIATE.indication ( uint64_t DeviceAddress, ieee154_disassociation_reason_t DisassociateReason, ieee154_security_t *security ) { #if (LOG_LEVEL & TRACE_FUNC) switch (DisassociateReason) { case IEEE154_COORDINATOR_WISHES_DEVICE_TO_LEAVE: lclPrintf_NWK("MLME_DISASSOCIATE.indication. IEEE154_COORDINATOR_WISHES_DEVICE_TO_LEAVE\n", ""); break; case IEEE154_DEVICE_WISHES_TO_LEAVE: lclPrintf_NWK("MLME_DISASSOCIATE.indication. IEEE154_DEVICE_WISHES_TO_LEAVE\n", ""); break; } #endif #ifndef IM_COORDINATOR if (DisassociateReason == IEEE154_COORDINATOR_WISHES_DEVICE_TO_LEAVE) { // Association status variable set to disassociate to prevent // a new automatic association tentative after the sync loss event associationStatus = DISASSOCIATED; } #endif signal NLME_LEAVE.indication(DeviceAddress); } /*************************************************************/ /*******************NLME IMPLEMENTATION***********************/ /*************************************************************/ /************************************************************* ******************* NLME-RESET******************************** **************************************************************/ command error_t NLME_RESET.request() { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("NLME_RESET.request.\n", ""); #endif call MLME_RESET.request(TRUE); return SUCCESS; } /*************************************************************/ /************************NLME - SYNC**************************/ /*************************************************************/ //This primitive allows the NHL to synchronize or extract data from its ZigBee coordinator or router //page 186-187 command error_t NLME_SYNC.request(bool Track) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("NLME_SYNC.request. Track: 0x%x\n", Track); #endif call MLME_SYNC.request(LOGICAL_CHANNEL, 0, Track); return SUCCESS; } /*************************************************************/ /***************** NLME-SET ********************/ /*************************************************************/ command error_t NLME_SET.request(uint8_t NIBAttribute, uint16_t NIBAttributeLength, uint16_t NIBAttributeValue) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("NLME_SET.request. NIBAttribute: 0x%x\n", NIBAttribute); #endif atomic{ switch(NIBAttribute) { case NWKSEQUENCENUMBER : nwk_IB.nwkSequenceNumber = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkSequenceNumber: %x\n",nwk_IB.nwkSequenceNumber); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKPASSIVEACKTIMEOUT : nwk_IB.nwkPassiveAckTimeout = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkPassiveAckTimeout: %x\n",nwk_IB.nwkPassiveAckTimeout); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKMAXBROADCASTRETRIES : nwk_IB.nwkMaxBroadcastRetries = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkMaxBroadcastRetries: %x\n",nwk_IB.nwkMaxBroadcastRetries); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKMAXCHILDREN : nwk_IB.nwkMaxChildren = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkMaxChildren: %x\n",nwk_IB.nwkMaxChildren); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKMAXDEPTH : nwk_IB.nwkMaxDepth = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkMaxDepth: %x\n",nwk_IB.nwkMaxDepth); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKMAXROUTERS : nwk_IB.nwkMaxRouters = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkMaxRouters: %x\n",nwk_IB.nwkMaxRouters); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKMETWORKBROADCASTDELIVERYTIME : nwk_IB.nwkNetworkBroadcastDeliveryTime = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkNetworkBroadcastDeliveryTime: %x\n",nwk_IB.nwkNetworkBroadcastDeliveryTime); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKREPORTCONSTANTCOST : nwk_IB.nwkReportConstantCost = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkReportConstantCost: %x\n",nwk_IB.nwkReportConstantCost); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKROUTEDISCOVERYRETRIESPERMITED : nwk_IB.nwkRouteDiscoveryRetriesPermitted = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkRouteDiscoveryRetriesPermitted: %x\n",nwk_IB.nwkRouteDiscoveryRetriesPermitted); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKSYMLINK : nwk_IB.nwkSymLink = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkSymLink: %x\n",nwk_IB.nwkSymLink); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKCAPABILITYINFORMATION : nwk_IB.nwkCapabilityInformation = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkCapabilityInformation: %x\n",nwk_IB.nwkCapabilityInformation); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKUSETREEADDRALLOC : nwk_IB.nwkUseTreeAddrAlloc = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkUseTreeAddrAlloc: %x\n",nwk_IB.nwkUseTreeAddrAlloc); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKUSETREEROUTING : nwk_IB.nwkUseTreeRouting = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkUseTreeRouting: %x\n",nwk_IB.nwkUseTreeRouting); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKNEXTADDRESS : nwk_IB.nwkNextAddress = NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkNextAddress: %x\n",nwk_IB.nwkNextAddress); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKAVAILABLEADDRESSES : nwk_IB.nwkAvailableAddresses = NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkAvailableAddresses: %x\n",nwk_IB.nwkAvailableAddresses); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKADDRESSINCREMENT : nwk_IB.nwkAddressIncrement =NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkAddressIncrement: %x\n",nwk_IB.nwkAddressIncrement); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; case NWKTRANSACTIONPERSISTENCETIME : nwk_IB.nwkTransactionPersistenceTime = (uint8_t) NIBAttributeValue; //////lclPrintf_NWK("nwk_IB.nwkTransactionPersistenceTime: %x\n",nwk_IB.nwkTransactionPersistenceTime); signal NLME_SET.confirm(NWK_SUCCESS,NIBAttribute); break; default: signal NLME_SET.confirm(NWK_UNSUPPORTED_ATTRIBUTE,NIBAttribute); break; } } return SUCCESS; } /*************************************************************/ /***************** NLME-GET ********************/ /*************************************************************/ command error_t NLME_GET.request(uint8_t NIBAttribute) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("NLME_GET.request. NIBAttribute: 0x%x\n", NIBAttribute); #endif switch(NIBAttribute) { case NWKSEQUENCENUMBER : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkSequenceNumber); break; case NWKPASSIVEACKTIMEOUT : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkPassiveAckTimeout); break; case NWKMAXBROADCASTRETRIES : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkMaxBroadcastRetries); break; case NWKMAXCHILDREN : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkMaxChildren); break; case NWKMAXDEPTH : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkMaxDepth); break; case NWKMAXROUTERS : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkMaxRouters); break; case NWKMETWORKBROADCASTDELIVERYTIME : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkNetworkBroadcastDeliveryTime); break; case NWKREPORTCONSTANTCOST : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkReportConstantCost); break; case NWKROUTEDISCOVERYRETRIESPERMITED : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkRouteDiscoveryRetriesPermitted); break; case NWKSYMLINK : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkSymLink); break; case NWKCAPABILITYINFORMATION : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkCapabilityInformation); break; case NWKUSETREEADDRALLOC : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkUseTreeAddrAlloc); break; case NWKUSETREEROUTING : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkUseTreeRouting); break; case NWKNEXTADDRESS : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0002,(uint16_t)&nwk_IB.nwkNextAddress); break; case NWKAVAILABLEADDRESSES : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0002,(uint16_t)&nwk_IB.nwkAvailableAddresses); break; case NWKADDRESSINCREMENT : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0002,(uint16_t)&nwk_IB.nwkAddressIncrement); break; case NWKTRANSACTIONPERSISTENCETIME : signal NLME_GET.confirm(NWK_SUCCESS,NIBAttribute,0x0001,(uint16_t)&nwk_IB.nwkTransactionPersistenceTime); break; default: signal NLME_GET.confirm(NWK_UNSUPPORTED_ATTRIBUTE,NIBAttribute,0x0000,0x00); break; } return SUCCESS; } /*************************************************************/ /**************neighbor table management functions************/ /*************************************************************/ //check if a specific neighbourtable Entry is present //Return 0xFF: Entry is not present //Return i: Entry is present and return its index uint8_t check_neighbortableentry(uint8_t addrmode, ieee154_address_t address) { uint8_t idx = 0; #if (LOG_LEVEL & TRACE_FUNC) lclPrintf_NWK("check_neighbortableentry. neighbour_count: 0x%x\n", neighbour_count); #endif if (neighbour_count == 0) { //lclPrintf_NWK("no neigb\n", ""); return 0xFF; } switch (addrmode) { case ADDR_MODE_SHORT_ADDRESS: while (idx < NEIGHBOUR_TABLE_SIZE) { //lclPrintf_NWK("compare %x %x\n", neighbortable[idx].Network_Address, address.shortAddress); if( (neighbortable[idx].PAN_Id != 0) && (neighbortable[idx].Network_Address == address.shortAddress) ) { //lclPrintf_NWK("already present \n", "" ); return idx; } idx++; } break; case ADDR_MODE_EXTENDED_ADDRESS: while (idx < NEIGHBOUR_TABLE_SIZE) { //lclPrintf_NWK("compare %x %x\n", neighbortable[idx].Extended_Address, address.extendedAddress); if( (neighbortable[idx].PAN_Id != 0) && (neighbortable[idx].Extended_Address == address.extendedAddress) ) { //lclPrintf_NWK("already present \n", "" ); return idx; } idx++; } break; default: return 0xFF; } return 0xFF; } #if 0 //function used to find a parent in the neighbour table //Return 0:no parent is present //Return i:parent is present and return the index of the entry + 1 uint8_t find_suitable_parent() { uint8_t i = 0; #ifdef TRACE_FUNC_ENABLED lclPrintf_NWK("find_suitable_parent. neighbour_count: 0x%x\n", neighbour_count); #endif for (i=0; i [
      ] PLATFORM=telosb ZIGBEE_PATH=$TOSDIR/lib/zigbee/clusterTree echo $ZIGBEE_PATH APP_TEST_PATH=$TOSDIR/lib/zigbee/tests echo $APP_TEST_PATH PROG_DEV=bsl if [ $# -lt 4 ]; then clear echo "Not recognized parameters!!!" echo "Usage : ./pmote.sh [
      ]" echo "pmote.sh i c 3 0, compile and program mote (i) as coordinator (c), on /dev/ttyUSB3, with address 0" echo "Installation type . Use c to compile only, i to install or r to reinstall." read -p "Installation type : " inst_type echo "Please enter device type." echo "c - Coordinator." echo "r - Router." echo "e - End Device" echo "s - Sniffer" read -p "Device type : " device read -p "Please enter USB port number : " port read -p "Please enter device address : " initAddress else inst=`echo $1` device=`echo $2` port=`echo $3` initAddress=`echo $4` fi # Set default PAN_ID DEF_MAC_PANID=0xABCD export `echo "DEF_MAC_PANID=$DEF_MAC_PANID"` # Set default channel DEF_CHANNEL=26 export `echo "DEF_CHANNEL=$DEF_CHANNEL"` #set default Build dir BUILDDIR="images/"$initAddress export `echo "BUILDDIR=$BUILDDIR"` # Set default device depth if used if [ $# -gt 4 ]; then DEF_DEVICE_DEPTH=`echo $5` export `echo "DEF_DEVICE_DEPTH=$DEF_DEVICE_DEPTH"` echo "Device Depth: $DEF_DEVICE_DEPTH" fi # Set default chosen parent if used if [ $# -gt 5 ]; then DEF_CHOSEN_PARENT=`echo $6` export `echo "DEF_CHOSEN_PARENT=$DEF_CHOSEN_PARENT"` echo "Chosen Parent: $DEF_CHOSEN_PARENT" fi # Set default X if used if [ $# -gt 6 ]; then DEF_MY_X=`echo $7` export `echo "DEF_MY_X=$DEF_MY_X"` echo "My X: $DEF_MY_X" fi # Set default Y if used if [ $# -gt 7 ]; then DEF_MY_Y=`echo $8` export `echo "DEF_MY_Y=$DEF_MY_Y"` echo "My Y: $DEF_MY_Y" fi device_type="" if [ $device = 'c' ] || [ $device = 'C' ]; then device_type="IM_COORDINATOR=1" cd $APP_TEST_PATH/coordinator elif [ $device = 'r' ] || [ $device = 'R' ]; then device_type="IM_ROUTER=1" cd $APP_TEST_PATH/router elif [ $device = 'e' ] || [ $device = 'E' ]; then device_type="IM_END_DEVICE=1" cd $APP_TEST_PATH/end_device elif [ $device = 's' ] || [ $device = 'S' ]; then cd $TOSROOT/apps/tests/tkn154/packetsniffer/ device_type="IM_SNIFFER=1" else echo "Wrong parameters" exit fi if [[ $port != ${port//[^0-9]/} ]]; then echo "Wrong parameters" echo "$port is not an integer" exit fi port=`echo "ttyUSB"$port` echo $port echo $device_type export `echo "$device_type"` if [ $inst = 'i' ] || [ $inst = 'I' ]; then make clean make $PLATFORM install.$initAddress $PROG_DEV,/dev/$port elif [ $inst = 'c' ] || [ $inst = 'C' ]; then make clean make $PLATFORM elif [ $inst = 'r' ] || [ $inst = 'R' ]; then make $PLATFORM reinstall.$initAddress $PROG_DEV,/dev/$port else echo "Wrong parameters" exit fi echo DONE!!! tinyos-2.1.2+dfsg/tos/lib/zigbee/pnetwork.sh000066400000000000000000000010511207233610700210030ustar00rootroot00000000000000#! /bin/bash # script to compile and install software in a network of telosb motes. # Usage pnetwork_install.sh # Program the PAN coordinator on /dev/ttyUSB0 with address 0 ./pmote.sh i c 0 0 # Program the Router on /dev/ttyUSB1, with address 1, depth 1 # and to associate with the coordinator (0) ./pmote.sh i r 1 1 1 0 # Program 2 end devices on /dev/ttyUSB2 and /dev/ttyUSB3, with addresses 10 and 11, depth 2, # to associate with the router (1) and at predefined positions (x,y) ./pmote.sh i e 2 10 2 1 120 150 ./pmote.sh i e 3 11 2 1 173 116 tinyos-2.1.2+dfsg/tos/lib/zigbee/shadow/000077500000000000000000000000001207233610700200665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/zigbee/shadow/Random.nc000066400000000000000000000043271207233610700216360ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Interface for generating 16-bit and 32-bit random numbers. * * @author Barbara Hohlt * @date March 1 2005 */ interface Random { /** * Initialize the pseudorandom generator with a specific seed. * @return void. */ async command void setSeed(uint16_t seed); /** * Produces a 32-bit pseudorandom number. * @return Returns the 32-bit pseudorandom number. */ async command uint32_t rand32(); /** * Produces a 32-bit pseudorandom number. * @return Returns low 16 bits of the pseudorandom number. */ async command uint16_t rand16(); } tinyos-2.1.2+dfsg/tos/lib/zigbee/shadow/RandomLfsrC.nc000066400000000000000000000073441207233610700225720ustar00rootroot00000000000000// $Id: RandomLfsrC.nc,v 1.5 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Alec Woo, David Gay, Philip Levis * Date last modified: 8/8/05 * */ /** * This is a 16 bit Linear Feedback Shift Register pseudo random number generator. It is faster than the MLCG generator, but the numbers generated * have less randomness. * * @author Alec Woo * @author David Gay * @author Philip Levis * @date August 8 2005 */ module RandomLfsrC { provides interface Init; provides interface Random; } implementation { uint16_t shiftReg; uint16_t initSeed; uint16_t mask; /** * Initialize the pseudorandom generator with a specific seed. * @return void. */ async command void Random.setSeed(uint16_t seed) { atomic { if (seed == 0) { // Use TOS_NODE_ID shiftReg = 119 * 119 * (TOS_NODE_ID + 1); initSeed = shiftReg; mask = 137 * 29 * (TOS_NODE_ID + 1); } else { // Use seed shiftReg = 119 * 119 * (seed + 1); initSeed = shiftReg; mask = 137 * 29 * (seed + 1); } } } /* Initialize the seed from the ID of the node */ command error_t Init.init() { atomic { shiftReg = 119 * 119 * (TOS_NODE_ID + 1); initSeed = shiftReg; mask = 137 * 29 * (TOS_NODE_ID + 1); } return SUCCESS; } /* Return the next 16 bit random number */ async command uint16_t Random.rand16() { bool endbit; uint16_t tmpShiftReg; atomic { tmpShiftReg = shiftReg; endbit = ((tmpShiftReg & 0x8000) != 0); tmpShiftReg <<= 1; if (endbit) tmpShiftReg ^= 0x100b; tmpShiftReg++; shiftReg = tmpShiftReg; tmpShiftReg = tmpShiftReg ^ mask; } return tmpShiftReg; } async command uint32_t Random.rand32() { return (uint32_t)call Random.rand16() << 16 | call Random.rand16(); } } tinyos-2.1.2+dfsg/tos/lib/zigbee/shadow/RandomMlcgC.nc000066400000000000000000000063771207233610700225530ustar00rootroot00000000000000/* * Copyright (c) 2002-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** This code is a fast implementation of the Park-Miller Minimal Standard * Generator for pseudo-random numbers. It uses the 32 bit multiplicative * linear congruential generator, * * S' = (A x S) mod (2^31 - 1) * * for A = 16807. * * * @author Barbara Hohlt * @date March 1 2005 */ module RandomMlcgC @safe() { provides interface Init; provides interface ParameterInit as SeedInit; provides interface Random; } implementation { uint32_t seed ; /** * Initialize the pseudorandom generator with a specific seed. * @return void. */ async command void Random.setSeed(uint16_t sseed) { } /* Initialize the seed from the ID of the node */ command error_t Init.init() { atomic seed = (uint32_t)(TOS_NODE_ID + 1); return SUCCESS; } /* Initialize with 16-bit seed */ command error_t SeedInit.init(uint16_t s) { atomic seed = (uint32_t)(s + 1); return SUCCESS; } /* Return the next 32 bit random number */ async command uint32_t Random.rand32() { uint32_t mlcg,p,q; uint64_t tmpseed; atomic { tmpseed = (uint64_t)33614U * (uint64_t)seed; q = tmpseed; /* low */ q = q >> 1; p = tmpseed >> 32 ; /* hi */ mlcg = p + q; if (mlcg & 0x80000000) { mlcg = mlcg & 0x7FFFFFFF; mlcg++; } seed = mlcg; } return mlcg; } /* Return low 16 bits of next 32 bit random number */ async command uint16_t Random.rand16() { return (uint16_t)call Random.rand32(); } #if 0 /* Return high 16 bits of 32 bit number */ inline uint16_t getHigh16(uint32_t num) { return num >> 16; } #endif } tinyos-2.1.2+dfsg/tos/lib/zigbee/tests/000077500000000000000000000000001207233610700177435ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/zigbee/tests/coordinator/000077500000000000000000000000001207233610700222665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/zigbee/tests/coordinator/Makefile000066400000000000000000000033111207233610700237240ustar00rootroot00000000000000COMPONENT=coordinatorBasicAppC PLATFORMS = telosb ZIGBEE=$(TOSDIR)/lib/zigbee/clusterTree # Shadows new version of files w.r.t. the official ones (if needed) PFLAGS += -I$(ZIGBEE)/../shadow PFLAGS += -I$(ZIGBEE)/includes \ -I$(ZIGBEE)/interfaces \ -I$(ZIGBEE)/nwk PFLAGS += -DIM_COORDINATOR ifdef DEF_MAC_PANID PFLAGS += -DDEF_MAC_PANID=$(DEF_MAC_PANID) endif ifdef DEF_CHANNEL PFLAGS += -DDEF_CHANNEL=$(DEF_CHANNEL) endif ifdef BUILDDIR PFLAGS += -DCBUILDDIR=$(BUILDDIR) endif ifdef DEF_DEVICE_DEPTH PFLAGS += -DDEF_DEVICE_DEPTH=$(DEF_DEVICE_DEPTH) endif ifdef DEF_CHOSEN_PARENT PFLAGS += -DDEF_CHOSEN_PARENT=$(DEF_CHOSEN_PARENT) endif ifdef DEF_MY_X PFLAGS += -DDEF_MY_X=$(DEF_MY_X) endif ifdef DEF_MY_Y PFLAGS += -DDEF_MY_Y=$(DEF_MY_Y) endif ifdef IEEE154_EXTENDED_ADDRESS PFLAGS += -DIEEE154_EXTENDED_ADDRESS=$(IEEE154_EXTENDED_ADDRESS) endif ifdef TKN154_DEBUG PFLAGS += -DTKN154_DEBUG CFLAGS += -I$(TOSDIR)/lib/printf PFLAGS += -DPRINTF_BUFFER_SIZE=1000 endif # Try to optimize memory allocation by disabling some MAC services #CFLAGS += -DIEEE154_RXENABLE_DISABLED -DIEEE154_DISASSOCIATION_DISABLED #CFLAGS += -DIEEE154_RXENABLE_DISABLED -DIEEE154_DISASSOCIATION_DISABLED -DIEEE154_COORD_REALIGNMENT_DISABLED #CFLAGS += -DIEEE154_RXENABLE_DISABLED CFLAGS += -DTKN154_ACTIVE_MESSAGE_SUPPORT_DISABLED -DIEEE154_PROMISCUOUS_MODE_DISABLED -DIEEE154_GTS_DISABLED # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/tos/lib/zigbee/tests/coordinator/coordinatorBasicAppC.nc000066400000000000000000000016061207233610700266440ustar00rootroot00000000000000/* * @author Stefano Tennina * */ #include #include "nwk_enumerations.h" #if defined(PLATFORM_TELOSB) #include "UserButton.h" #endif #include "nwk_const_coordinator.h" configuration coordinatorBasicAppC { } implementation { components MainC; // components LedsC; components coordinatorBasicC as App; App.Boot -> MainC; // App.Leds -> LedsC; components new TimerMilliC() as T_init; App.T_init -> T_init; #if defined(PLATFORM_TELOSB) //User Button components UserButtonC; App.Get -> UserButtonC; App.Notify -> UserButtonC; #endif components NWKC; App.NLDE_DATA ->NWKC.NLDE_DATA; App.NLME_NETWORK_FORMATION -> NWKC.NLME_NETWORK_FORMATION; App.NLME_JOIN -> NWKC.NLME_JOIN; App.NLME_LEAVE -> NWKC.NLME_LEAVE; App.NLME_RESET -> NWKC.NLME_RESET; App.NLME_SYNC -> NWKC.NLME_SYNC; App.NLME_GET -> NWKC.NLME_GET; App.NLME_SET -> NWKC.NLME_SET; } tinyos-2.1.2+dfsg/tos/lib/zigbee/tests/coordinator/coordinatorBasicC.nc000066400000000000000000000224141207233610700262030ustar00rootroot00000000000000/* PAN COORDINATOR NODE * @author Stefano Tennina * */ #include #include "printfUART.h" #include "log_enable.h" #ifdef APP_PRINTFS_ENABLED #define lclPrintf printfUART #define lclprintfUART_init printfUART_init #else #define lclPrintf(__format, __args...) void lclprintfUART_init() {} #endif module coordinatorBasicC { uses { interface Boot; // interface Leds; interface NLDE_DATA; //NLME NWK Management services interface NLME_NETWORK_FORMATION; interface NLME_JOIN; interface NLME_LEAVE; interface NLME_SYNC; interface NLME_RESET; interface NLME_GET; interface NLME_SET; //Timers interface Timer as T_init; #if defined(PLATFORM_TELOSB) //user button interface Get; interface Notify; #endif } } implementation { // Depth by configuration uint8_t networkStarted; // This function initializes the variables. void initVariables() { // Depth by configuration (initialize to default) atomic networkStarted = 0; } event void Boot.booted() { initVariables(); #if defined(PLATFORM_TELOSB) // TelosB: we can use the button to start call Notify.enable(); #else // In case of MicaZ, start immediately call NLME_RESET.request(); #endif } //function used to schedule the beacon requests (PAN coordinator) void process_beacon_scheduling(uint16_t source_address,uint8_t beacon_order, uint8_t superframe_order) { uint8_t nsdu_pay[6]; beacon_scheduling *beacon_scheduling_ptr = (beacon_scheduling *)(&nsdu_pay[0]); beacon_scheduling_ptr->beacon_order = beacon_order; beacon_scheduling_ptr->superframe_order = superframe_order; switch(source_address) { /*****************************************************************************/ /* * NORMAL TEST mwkMaxChildren (Cm) 6 nwkMaxDepth (Lm) 3 mwkMaxRouters (Rm) 4 */ case 0x0001: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0x3C; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; case 0x0020: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x01; beacon_scheduling_ptr->transmission_offset[1] = 0xE0; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; case 0x0002: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0x3C; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; case 0x0009: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0xF0; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; case 0x0021: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0x3C; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; case 0x0028: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0xF0; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; case 0x0003: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0x3C; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; case 0x0004: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0x78; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; case 0x000a: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0x3C; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; case 0x000b: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0x78; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; case 0x0022: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0x3C; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; case 0x0023: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0x78; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; case 0x0029: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0x3C; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; case 0x002a: beacon_scheduling_ptr->request_type = SCHEDULING_ACCEPT; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0x78; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; default: beacon_scheduling_ptr->request_type = SCHEDULING_DENY; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0x00; beacon_scheduling_ptr->transmission_offset[2] = 0x00; break; } lclPrintf("Coordinator: Sending negotiation reply\n", ""); call NLDE_DATA.request(source_address, 0x06, nsdu_pay, 0, 1, 0x00, 0); } /***************************************************** ****************NLDE EVENTS*************************** ******************************************************/ /*************************NLDE_DATA*****************************/ event error_t NLDE_DATA.confirm(uint8_t NsduHandle, uint8_t Status) { lclPrintf("NLDE_DATA.confirm\n", ""); return SUCCESS; } event error_t NLDE_DATA.indication(uint16_t SrcAddress, uint8_t NsduLength, uint8_t Nsdu[120], uint16_t LinkQuality) { uint8_t packetCode = Nsdu[0]; // TDBS mechanism beacon_scheduling *beacon_scheduling_ptr; lclPrintf("NLDE_DATA.indication\n", ""); // The packet is for me (check has been done into MCPS_DATA.indication) // TDBS mechanism if (packetCode == SCHEDULING_REQUEST) { beacon_scheduling_ptr = (beacon_scheduling *)Nsdu; // PAN coordinator receiving a negotiation request process_beacon_scheduling (SrcAddress, beacon_scheduling_ptr->beacon_order, beacon_scheduling_ptr->superframe_order); } // No other data is expected return SUCCESS; } /***************************************************** ****************NLME EVENTS*************************** ******************************************************/ /*****************NLME_NETWORK_FORMATION**********************/ event error_t NLME_NETWORK_FORMATION.confirm(uint8_t Status) { lclPrintf("NLME_NETWORK_FORMATION.confirm\n", ""); networkStarted = 1; // The Coordinator is transmitting its own beacons return SUCCESS; } /*************************NLME_JOIN*****************************/ event error_t NLME_JOIN.indication(uint16_t ShortAddress, uint32_t ExtendedAddress[], uint8_t CapabilityInformation, bool SecureJoin) { lclPrintf("NLME_JOIN.indication\n", ""); return SUCCESS; } event error_t NLME_JOIN.confirm(uint16_t PANId, uint8_t Status, uint16_t parentAddress) { return SUCCESS; } /*************************NLME_LEAVE****************************/ event error_t NLME_LEAVE.indication(uint64_t DeviceAddress) { lclPrintf("NLME_LEAVE.indication\n", ""); return SUCCESS; } event error_t NLME_LEAVE.confirm(uint64_t DeviceAddress, uint8_t Status) { lclPrintf("NLME_LEAVE.confirm\n", ""); return SUCCESS; } /*************************NLME_SYNC*****************************/ event error_t NLME_SYNC.indication() { lclPrintf("NLME_SYNC.indication\n", ""); // We lost connection with our parent. Automatic rescan is done // by the NWK return SUCCESS; } event error_t NLME_SYNC.confirm(uint8_t Status) { return SUCCESS; } /***************** NLME-SET ********************/ event error_t NLME_SET.confirm(uint8_t Status, uint8_t NIBAttribute) { return SUCCESS; } /***************** NLME-GET ********************/ event error_t NLME_GET.confirm(uint8_t Status, uint8_t NIBAttribute, uint16_t NIBAttributeLength, uint16_t NIBAttributeValue) { return SUCCESS; } event error_t NLME_RESET.confirm(uint8_t status) { lclPrintf("NLME_RESET.confirm\n", ""); call T_init.startOneShot(5000); return SUCCESS; } /*******************T_init**************************/ event void T_init.fired() { lclPrintf("I'm THE coordinator\n", ""); call NLME_NETWORK_FORMATION.request(LOGICAL_CHANNEL, 8, BEACON_ORDER, SUPERFRAME_ORDER, MAC_PANID, 0); return; } #if defined(PLATFORM_TELOSB) event void Notify.notify(button_state_t state) { if (state == BUTTON_PRESSED && networkStarted == 0) { lclPrintf("Button pressed\n", ""); call NLME_RESET.request(); } } #endif } tinyos-2.1.2+dfsg/tos/lib/zigbee/tests/end_device/000077500000000000000000000000001207233610700220305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/zigbee/tests/end_device/Makefile000066400000000000000000000034021207233610700234670ustar00rootroot00000000000000COMPONENT=end_deviceBasicAppC PLATFORMS = telosb ZIGBEE=$(TOSDIR)/lib/zigbee/clusterTree # Shadows new version of files w.r.t. the official ones (if needed) PFLAGS += -I$(ZIGBEE)/../shadow PFLAGS += -I$(ZIGBEE)/includes \ -I$(ZIGBEE)/interfaces \ -I$(ZIGBEE)/nwk PFLAGS += -DIM_END_DEVICE -DIEEE154_BEACON_TX_DISABLED #PFLAGS += -DPRINTFUART_ENABLED ifdef DEF_MAC_PANID PFLAGS += -DDEF_MAC_PANID=$(DEF_MAC_PANID) endif ifdef DEF_CHANNEL PFLAGS += -DDEF_CHANNEL=$(DEF_CHANNEL) endif ifdef BUILDDIR PFLAGS += -DCBUILDDIR=$(BUILDDIR) endif ifdef DEF_DEVICE_DEPTH PFLAGS += -DDEF_DEVICE_DEPTH=$(DEF_DEVICE_DEPTH) endif ifdef DEF_CHOSEN_PARENT PFLAGS += -DDEF_CHOSEN_PARENT=$(DEF_CHOSEN_PARENT) endif ifdef DEF_MY_X PFLAGS += -DDEF_MY_X=$(DEF_MY_X) endif ifdef DEF_MY_Y PFLAGS += -DDEF_MY_Y=$(DEF_MY_Y) endif ifdef IEEE154_EXTENDED_ADDRESS PFLAGS += -DIEEE154_EXTENDED_ADDRESS=$(IEEE154_EXTENDED_ADDRESS) endif ifdef TKN154_DEBUG PFLAGS += -DTKN154_DEBUG CFLAGS += -I$(TOSDIR)/lib/printf PFLAGS += -DPRINTF_BUFFER_SIZE=1000 endif # Try to optimize memory allocation by disabling some MAC services #CFLAGS += -DIEEE154_RXENABLE_DISABLED -DIEEE154_DISASSOCIATION_DISABLED #CFLAGS += -DIEEE154_RXENABLE_DISABLED -DIEEE154_DISASSOCIATION_DISABLED -DIEEE154_COORD_REALIGNMENT_DISABLED #CFLAGS += -DIEEE154_RXENABLE_DISABLED CFLAGS += -DTKN154_ACTIVE_MESSAGE_SUPPORT_DISABLED -DIEEE154_PROMISCUOUS_MODE_DISABLED -DIEEE154_GTS_DISABLED # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/tos/lib/zigbee/tests/end_device/end_deviceBasicAppC.nc000066400000000000000000000021211207233610700261410ustar00rootroot00000000000000/* * @author Stefano Tennina * */ #include #include "nwk_enumerations.h" #if defined(PLATFORM_TELOSB) #include "UserButton.h" #endif #include "nwk_const_end_device.h" configuration end_deviceBasicAppC { } implementation { components MainC; components LedsC; components end_deviceBasicC as App; App.Boot -> MainC; App.Leds -> LedsC; components new TimerMilliC() as T_init; App.T_init -> T_init; components new TimerMilliC() as KeepAliveTimer; App.KeepAliveTimer -> KeepAliveTimer; components new TimerMilliC() as NetAssociationDeferredTimer; App.NetAssociationDeferredTimer -> NetAssociationDeferredTimer; #if defined(PLATFORM_TELOSB) //User Button components UserButtonC; App.Get -> UserButtonC; App.Notify -> UserButtonC; #endif components NWKC; App.NLDE_DATA ->NWKC.NLDE_DATA; App.NLME_NETWORK_DISCOVERY -> NWKC.NLME_NETWORK_DISCOVERY; App.NLME_JOIN -> NWKC.NLME_JOIN; App.NLME_LEAVE -> NWKC.NLME_LEAVE; App.NLME_RESET -> NWKC.NLME_RESET; App.NLME_SYNC -> NWKC.NLME_SYNC; App.NLME_GET -> NWKC.NLME_GET; App.NLME_SET -> NWKC.NLME_SET; } tinyos-2.1.2+dfsg/tos/lib/zigbee/tests/end_device/end_deviceBasicC.nc000066400000000000000000000165421207233610700255140ustar00rootroot00000000000000/* * @author Ricardo Severino * END DEVICE * */ #include #include "printfUART.h" #include "log_enable.h" #ifdef APP_PRINTFS_ENABLED #define lclPrintf printfUART #define lclprintfUART_init printfUART_init #else #define lclPrintf(__format, __args...) void lclprintfUART_init() {} #endif module end_deviceBasicC { uses { interface Boot; interface Leds; interface NLDE_DATA; //NLME NWK Management services interface NLME_NETWORK_DISCOVERY; interface NLME_JOIN; interface NLME_LEAVE; interface NLME_SYNC; interface NLME_RESET; interface NLME_GET; interface NLME_SET; //Timers interface Timer as T_init; interface Timer as KeepAliveTimer; interface Timer as NetAssociationDeferredTimer; #if defined(PLATFORM_TELOSB) //user button interface Get; interface Notify; #endif } } implementation { // Depth by configuration uint8_t myDepth; //boolean variable definig if the device has joined to the PAN uint8_t joined; // Maximum number of join trials before restart from network discovery uint8_t maxJoinTrials; uint16_t myParentAddress; task void KeepAlive(); task void KeepAlive() { uint8_t nsdu_pay[6]; nsdu_pay[0]=TOS_NODE_ID & 0x00FF; nsdu_pay[1]='H'; nsdu_pay[2]='e'; nsdu_pay[3]='l'; nsdu_pay[4]='l'; nsdu_pay[5]='o'; // Send the message towards the coordinator // (default network address: 0x0000) call NLDE_DATA.request(0x0000, 6, nsdu_pay, 0, 1, 0x00, 0); } // This function initializes the variables. void initVariables() { // Depth by configuration (initialize to default) myDepth = DEF_DEVICE_DEPTH; //boolean variable definig if the device has joined to the PAN joined = 0x00; // Maximum number of join trials before restart from network discovery maxJoinTrials = MAX_JOIN_TRIALS; } event void Boot.booted() { printfUART_init(); initVariables(); #if defined(PLATFORM_TELOSB) call Notify.enable(); #endif // Start the application call NLME_RESET.request(); } /***************************************************** ****************NLDE EVENTS*************************** ******************************************************/ /*************************NLDE_DATA*****************************/ event error_t NLDE_DATA.confirm(uint8_t NsduHandle, uint8_t Status) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLDE_DATA.confirm\n", ""); #endif if (joined != 0x00) call Leds.led1Toggle(); return SUCCESS; } event error_t NLDE_DATA.indication( uint16_t SrcAddress, uint8_t NsduLength, uint8_t Nsdu[120], uint16_t LinkQuality) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLDE_DATA.indication\n", ""); #endif return SUCCESS; } /***************************************************** ****************NLME EVENTS*************************** ******************************************************/ /*****************NLME_NETWORK_DISCOVERY**************************/ // This is not called anymore by the NKWP since it tries to associate // directly to the parent and issuing a JOIN confirm, instead event error_t NLME_NETWORK_DISCOVERY.confirm(uint8_t NetworkCount,networkdescriptor networkdescriptorlist[], uint8_t Status) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_NETWORK_DISCOVERY.confirm\n", ""); #endif return SUCCESS; } /*************************NLME_JOIN*****************************/ event error_t NLME_JOIN.indication(uint16_t ShortAddress, uint32_t ExtendedAddress[], uint8_t CapabilityInformation, bool SecureJoin) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_JOIN.indication\n", ""); #endif return SUCCESS; } event error_t NLME_JOIN.confirm(uint16_t PANId, uint8_t Status, uint16_t parentAddress) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_JOIN.confirm\n", ""); #endif switch(Status) { case NWK_SUCCESS: // Join procedure successful joined = 0x01; myParentAddress=parentAddress; call KeepAliveTimer.startPeriodic(10000); break; case NWK_NOT_PERMITTED: joined = 0x00; //join failed break; case NWK_STARTUP_FAILURE: joined = 0x00; maxJoinTrials--; if (maxJoinTrials == 0) { // Retry restarting from the network discovery phase call T_init.startOneShot(5000); } else { // Retry after a few seconds call NetAssociationDeferredTimer.startOneShot(JOIN_TIMER_RETRY); } break; default: //default procedure - join failed joined = 0x00; break; } return Status; } /*************************NLME_LEAVE****************************/ event error_t NLME_LEAVE.indication(uint64_t DeviceAddress) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_LEAVE.indication\n", ""); #endif return SUCCESS; } event error_t NLME_LEAVE.confirm(uint64_t DeviceAddress, uint8_t Status) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_LEAVE.confirm\n", ""); #endif joined=0x00; return SUCCESS; } /*************************NLME_SYNC*****************************/ event error_t NLME_SYNC.indication() { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_SYNC.indication\n", ""); #endif // We lost connection with our parent. Automatic rescan is done // at the NWK layer, unless it is after a disassociation request joined=0x00; // Stop the keep alive timer, if it is still running if (call KeepAliveTimer.isRunning()) call KeepAliveTimer.stop(); // Switch off all leds call Leds.led0Off(); call Leds.led1Off(); call Leds.led2Off(); return SUCCESS; } event error_t NLME_SYNC.confirm(uint8_t Status) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_SYNC.confirm\n", ""); #endif return SUCCESS; } /***************** NLME-SET ********************/ event error_t NLME_SET.confirm(uint8_t Status, uint8_t NIBAttribute) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_SET.confirm\n", ""); #endif return SUCCESS; } /***************** NLME-GET ********************/ event error_t NLME_GET.confirm(uint8_t Status, uint8_t NIBAttribute, uint16_t NIBAttributeLength, uint16_t NIBAttributeValue) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_GET.confirm\n", ""); #endif return SUCCESS; } event error_t NLME_RESET.confirm(uint8_t status) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_RESET.confirm\n", ""); #endif call T_init.startOneShot(2000); return SUCCESS; } /***************************************************** ****************TIMER EVENTS*************************** ******************************************************/ /*******************T_init**************************/ event void T_init.fired() { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("I'm NOT the coordinator\n", ""); #endif call NLME_NETWORK_DISCOVERY.request(LOGICAL_CHANNEL, BEACON_ORDER); return; } /*******************NetAssociationDeferredTimer**************************/ event void NetAssociationDeferredTimer.fired() { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("go join as end device\n", ""); #endif call NLME_JOIN.request(MAC_PANID, FALSE, FALSE, 0, 0, 0, 0, 0); return; } /*******************KeepAlive**************************/ event void KeepAliveTimer.fired() { post KeepAlive(); } #if defined(PLATFORM_TELOSB) event void Notify.notify(button_state_t state) { if (state == BUTTON_PRESSED && joined) { call KeepAliveTimer.stop(); call NLME_LEAVE.request(0,0,0); } } #endif } tinyos-2.1.2+dfsg/tos/lib/zigbee/tests/router/000077500000000000000000000000001207233610700212635ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/lib/zigbee/tests/router/Makefile000066400000000000000000000033371207233610700227310ustar00rootroot00000000000000COMPONENT=routerBasicAppC PLATFORMS = telosb ZIGBEE=$(TOSDIR)/lib/zigbee/clusterTree # Shadows new version of files w.r.t. the official ones (if needed) PFLAGS += -I$(ZIGBEE)/../shadow PFLAGS += -I$(ZIGBEE)/includes \ -I$(ZIGBEE)/interfaces \ -I$(ZIGBEE)/nwk PFLAGS += -DIM_ROUTER #PFLAGS += -DPRINTFUART_ENABLED ifdef DEF_MAC_PANID PFLAGS += -DDEF_MAC_PANID=$(DEF_MAC_PANID) endif ifdef DEF_CHANNEL PFLAGS += -DDEF_CHANNEL=$(DEF_CHANNEL) endif ifdef BUILDDIR PFLAGS += -DCBUILDDIR=$(BUILDDIR) endif ifdef DEF_DEVICE_DEPTH PFLAGS += -DDEF_DEVICE_DEPTH=$(DEF_DEVICE_DEPTH) endif ifdef DEF_CHOSEN_PARENT PFLAGS += -DDEF_CHOSEN_PARENT=$(DEF_CHOSEN_PARENT) endif ifdef DEF_MY_X PFLAGS += -DDEF_MY_X=$(DEF_MY_X) endif ifdef DEF_MY_Y PFLAGS += -DDEF_MY_Y=$(DEF_MY_Y) endif ifdef IEEE154_EXTENDED_ADDRESS PFLAGS += -DIEEE154_EXTENDED_ADDRESS=$(IEEE154_EXTENDED_ADDRESS) endif ifdef TKN154_DEBUG PFLAGS += -DTKN154_DEBUG CFLAGS += -I$(TOSDIR)/lib/printf PFLAGS += -DPRINTF_BUFFER_SIZE=1000 endif # Try to optimize memory allocation by disabling some MAC services #CFLAGS += -DIEEE154_RXENABLE_DISABLED -DIEEE154_DISASSOCIATION_DISABLED #CFLAGS += -DIEEE154_RXENABLE_DISABLED -DIEEE154_DISASSOCIATION_DISABLED -DIEEE154_COORD_REALIGNMENT_DISABLED #CFLAGS += -DIEEE154_RXENABLE_DISABLED CFLAGS += -DTKN154_ACTIVE_MESSAGE_SUPPORT_DISABLED -DIEEE154_PROMISCUOUS_MODE_DISABLED -DIEEE154_GTS_DISABLED # To use the TKN15.4 MAC instead of a platform's default MAC protocol first # include the TinyOS "Makerules" file as usual ... include $(MAKERULES) # ... and then include the TKN15.4 "Makefile.include" file. That's all. # Hint: type "make verbose" to see the aggregate include path. include $(TOSDIR)/lib/mac/tkn154/Makefile.include tinyos-2.1.2+dfsg/tos/lib/zigbee/tests/router/routerBasicAppC.nc000066400000000000000000000021541207233610700246350ustar00rootroot00000000000000/* * @author Stefano Tennina * */ #include #include "nwk_enumerations.h" #if defined(PLATFORM_TELOSB) #include "UserButton.h" #endif #include "nwk_const_router.h" configuration routerBasicAppC { } implementation { components MainC; components LedsC; components routerBasicC as App; App.Boot -> MainC; App.Leds -> LedsC; components new TimerMilliC() as T_init; App.T_init -> T_init; components new TimerMilliC() as T_schedule; App.T_schedule -> T_schedule; components new TimerMilliC() as NetAssociationDeferredTimer; App.NetAssociationDeferredTimer -> NetAssociationDeferredTimer; #if defined(PLATFORM_TELOSB) //User Button components UserButtonC; App.Get -> UserButtonC; App.Notify -> UserButtonC; #endif components NWKC; App.NLDE_DATA ->NWKC.NLDE_DATA; App.NLME_NETWORK_DISCOVERY -> NWKC.NLME_NETWORK_DISCOVERY; App.NLME_START_ROUTER -> NWKC.NLME_START_ROUTER; App.NLME_JOIN -> NWKC.NLME_JOIN; App.NLME_LEAVE -> NWKC.NLME_LEAVE; App.NLME_RESET -> NWKC.NLME_RESET; App.NLME_SYNC -> NWKC.NLME_SYNC; App.NLME_GET -> NWKC.NLME_GET; App.NLME_SET -> NWKC.NLME_SET; } tinyos-2.1.2+dfsg/tos/lib/zigbee/tests/router/routerBasicC.nc000066400000000000000000000225631207233610700242020ustar00rootroot00000000000000/* ROUTER * @author Ricardo Severino * * */ #include #include "printfUART.h" #include "log_enable.h" #ifdef APP_PRINTFS_ENABLED #define lclPrintf printfUART #define lclprintfUART_init printfUART_init #else #define lclPrintf(__format, __args...) void lclprintfUART_init() {} #endif module routerBasicC { uses { interface Boot; interface Leds; interface NLDE_DATA; //NLME NWK Management services interface NLME_NETWORK_DISCOVERY; interface NLME_START_ROUTER; interface NLME_JOIN; interface NLME_LEAVE; interface NLME_SYNC; interface NLME_RESET; interface NLME_GET; interface NLME_SET; //Timers interface Timer as T_init; interface Timer as T_schedule; interface Timer as NetAssociationDeferredTimer; #if defined(PLATFORM_TELOSB) //user button interface Get; interface Notify; #endif } } implementation { // Depth by configuration uint8_t myDepth; //boolean variable definig if the device has joined to the PAN uint8_t joined; // Maximum number of join trials before restart from network discovery uint8_t maxJoinTrials; //boolean variable defining if the device is waiting for the beacon request response uint8_t requested_scheduling; //function used to start the beacon broadcast (router devices) task void start_sending_beacons_request(); // This function initializes the variables. void initVariables() { // Depth by configuration (initialize to default) myDepth = DEF_DEVICE_DEPTH; //boolean variable definig if the device has joined to the PAN joined = 0x00; // Maximum number of join trials before restart from network discovery maxJoinTrials = MAX_JOIN_TRIALS; //boolean variable defining if the device is waiting for the beacon request response requested_scheduling = 0x00; } event void Boot.booted() { lclprintfUART_init();//make the possibility to print initVariables(); call NLME_RESET.request(); } task void start_sending_beacons_request() { uint8_t nsdu_pay[6]; beacon_scheduling *beacon_scheduling_ptr; beacon_scheduling_ptr = (beacon_scheduling *)&nsdu_pay[0]; beacon_scheduling_ptr->request_type = SCHEDULING_REQUEST; beacon_scheduling_ptr->beacon_order = BEACON_ORDER; beacon_scheduling_ptr->superframe_order = SUPERFRAME_ORDER; beacon_scheduling_ptr->transmission_offset[0] = 0x00; beacon_scheduling_ptr->transmission_offset[1] = 0x00; beacon_scheduling_ptr->transmission_offset[2] = 0x00; requested_scheduling = 0x01; lclPrintf("Router: Sending negotiation request\n", ""); call NLDE_DATA.request(0x0000, 0x06, nsdu_pay, 0, 1, 0x00, 0); call T_schedule.startOneShot(20000); return; } /***************************************************** ****************NLDE EVENTS*************************** ******************************************************/ /*************************NLDE_DATA*****************************/ event error_t NLDE_DATA.confirm(uint8_t NsduHandle, uint8_t Status) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLDE_DATA.confirm\n", ""); #endif call Leds.led1Toggle(); return SUCCESS; } event error_t NLDE_DATA.indication(uint16_t SrcAddress, uint8_t NsduLength, uint8_t Nsdu[120], uint16_t LinkQuality) { uint8_t packetCode = Nsdu[0]; // TDBS mechanism beacon_scheduling *beacon_scheduling_ptr; #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLDE_DATA.indication\n", ""); #endif // The packet is for me (check has been done into MCPS_DATA.indication in NWKP.nc) // TDBS mechanism if(requested_scheduling == 0x01) { //the router receives a negotiation reply atomic requested_scheduling = 0x00; // Stop this timer to prevent a further fire event (if any) call T_schedule.stop(); if(packetCode == SCHEDULING_ACCEPT) { // TDBS Mechanism uint32_t start_time = 0x00000000; uint16_t start_time1= 0x0000; uint16_t start_time2= 0x0000; beacon_scheduling_ptr = (beacon_scheduling *)Nsdu; start_time1 = ( (beacon_scheduling_ptr->transmission_offset[0] << 0) ) ; start_time2 = ( (beacon_scheduling_ptr->transmission_offset[1] << 8 ) | (beacon_scheduling_ptr->transmission_offset[2] << 0 ) ); start_time = ( ((uint32_t)start_time1 << 16) | (start_time2 << 0) ); lclPrintf("start_time=0x%x\n", start_time); call NLME_START_ROUTER.request ( beacon_scheduling_ptr->beacon_order, beacon_scheduling_ptr->superframe_order, 0, start_time); } } return SUCCESS; } /***************************************************** ****************NLME EVENTS*************************** ******************************************************/ /*****************NLME_NETWORK_DISCOVERY**************************/ // This is not called anymore by the NKWP since it tries to associate // directly to the parent and issuing a JOIN confirm, instead event error_t NLME_NETWORK_DISCOVERY.confirm(uint8_t NetworkCount,networkdescriptor networkdescriptorlist[], uint8_t Status) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_NETWORK_DISCOVERY.confirm\n", ""); #endif return SUCCESS; } /*****************NLME_START_ROUTER*****************************/ event error_t NLME_START_ROUTER.confirm(uint8_t Status) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_START_ROUTER.confirm\n", ""); #endif return SUCCESS; } /*************************NLME_JOIN*****************************/ event error_t NLME_JOIN.indication(uint16_t ShortAddress, uint32_t ExtendedAddress[], uint8_t CapabilityInformation, bool SecureJoin) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_JOIN.indication\n", ""); #endif return SUCCESS; } event error_t NLME_JOIN.confirm(uint16_t PANId, uint8_t Status, uint16_t parentAddress) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_JOIN.confirm\n", ""); #endif switch(Status) { case NWK_SUCCESS: // Join procedure successful joined = 0x01; call Leds.led0Off(); requested_scheduling = 0x01; call T_schedule.startOneShot(9000); break; case NWK_NOT_PERMITTED: joined = 0x00; //join failed break; case NWK_STARTUP_FAILURE: joined = 0x00; maxJoinTrials--; if (maxJoinTrials == 0) { // Retry restarting from the network discovery phase call T_init.startOneShot(5000); } else { // Retry after a few seconds call NetAssociationDeferredTimer.startOneShot(JOIN_TIMER_RETRY); } break; default: //default procedure - join failed joined = 0x00; break; } return Status; } /*************************NLME_LEAVE****************************/ event error_t NLME_LEAVE.indication(uint64_t DeviceAddress) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_LEAVE.indication\n", ""); #endif return SUCCESS; } event error_t NLME_LEAVE.confirm(uint64_t DeviceAddress, uint8_t Status) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_LEAVE.confirm\n", ""); #endif return SUCCESS; } /*************************NLME_SYNC*****************************/ event error_t NLME_SYNC.indication() { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_SYNC.indication\n", ""); #endif // We lost connection with our parent. Automatic rescan is done // at the NWK layer // Switch off all leds call Leds.led0Off(); call Leds.led1Off(); call Leds.led2Off(); return SUCCESS; } event error_t NLME_SYNC.confirm(uint8_t Status) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_SYNC.confirm\n", ""); #endif return SUCCESS; } /***************** NLME-SET ********************/ event error_t NLME_SET.confirm(uint8_t Status, uint8_t NIBAttribute) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_SET.confirm\n", ""); #endif return SUCCESS; } /***************** NLME-GET ********************/ event error_t NLME_GET.confirm(uint8_t Status, uint8_t NIBAttribute, uint16_t NIBAttributeLength, uint16_t NIBAttributeValue) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_GET.confirm\n", ""); #endif return SUCCESS; } event error_t NLME_RESET.confirm(uint8_t status) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("NLME_RESET.confirm\n", ""); #endif call T_init.startOneShot(5000); return SUCCESS; } /***************************************************** ****************TIMER EVENTS*************************** ******************************************************/ /*******************T_init**************************/ event void T_init.fired() { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("I'm NOT the coordinator\n", ""); #endif call NLME_NETWORK_DISCOVERY.request(LOGICAL_CHANNEL, BEACON_ORDER); return; } /*******************NetAssociationDeferredTimer**************************/ event void NetAssociationDeferredTimer.fired() { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("go join as router\n", ""); #endif call NLME_JOIN.request(MAC_PANID, TRUE, FALSE, 0, 0, 0, 0, 0); } /*******************T_schedule**************************/ event void T_schedule.fired() { //event that fires if the negotiation for beacon transmission is unsuccessful //(the device does not receive any negotiation reply) if(requested_scheduling == 0x01) { post start_sending_beacons_request(); } } #if defined(PLATFORM_TELOSB) event void Notify.notify(button_state_t state) { if (state == BUTTON_PRESSED) { #if (LOG_LEVEL & TRACE_FUNC) lclPrintf("Button pressed\n", ""); #endif call Leds.led0On(); call NLME_RESET.request(); } } #endif } tinyos-2.1.2+dfsg/tos/platforms/000077500000000000000000000000001207233610700165755ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/README000066400000000000000000000024271207233610700174620ustar00rootroot00000000000000This directory contains hardware platforms that TinyOS runs on. A hardware platform is a collection of "chips," such as microcontrollers, radios, and non-volatile storage, whose implementations can be found in tos/chips. A platform includes code for the hardware resources that chip functionality depend on. For example, the CC1000 chip has a software networking stack (in chips/cc1000), which depends on being able to send bytes to the CC1000 chip over an SPI bus. How the SPI bus works is platform dependent (e.g., it could be shared between several chips and require software arbitration). Therefore, the mica2 platform, which has a CC1000 radio, connects the CC1000 code to an SPI bus that its microcontroller, an ATmega128, provides. Every platform directory has a ".platform" file, which specifies flags and options to the nesC compiler. For example, the native compiler ncc uses to compile a binary depends on what microcontroller a platform has, so a .platform file generally specifies the compiler with the "-gcc" option. Also, as platforms depend on a collection of chips, the .platform file specifies those chips with "-I" options. The standard TinyOS boot sequence depends on a platform providing a few components; details can be found in TEP 107. Phil Levis, last updated: 7/7/2005 tinyos-2.1.2+dfsg/tos/platforms/epic/000077500000000000000000000000001207233610700175155ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/epic/.platform000066400000000000000000000037641207233610700213540ustar00rootroot00000000000000 # Perl snippets that are interpreted by ncc. # Directories to add to the include path for all Epic applications. # Includes that should take precedence must come first. Platforms # come before chips because they may override files. These must be # specified as @includes instead of -I's to @opts, otherwise the %T # won't be processed by ncc. push( @includes, qw( %T/platforms/epic %T/platforms/epic/chips/at45db %T/platforms/epic/chips/ds2411 %T/platforms/telosa %T/platforms/telosa/chips/cc2420 %T/chips/cc2420 %T/chips/cc2420/alarm %T/chips/cc2420/control %T/chips/cc2420/csma %T/chips/cc2420/interfaces %T/chips/cc2420/link %T/chips/cc2420/lowpan %T/chips/cc2420/lpl %T/chips/cc2420/packet %T/chips/cc2420/receive %T/chips/cc2420/spi %T/chips/cc2420/transmit %T/chips/cc2420/unique %T/chips/cc2420/security %T/chips/msp430 %T/chips/msp430/adc12 %T/chips/msp430/dma %T/chips/msp430/pins %T/chips/msp430/timer %T/chips/msp430/usart %T/chips/msp430/sensors %T/chips/at45db %T/chips/ds2401 %T/lib/timer %T/lib/serial %T/lib/adc %T/lib/power ) ); # The @opts list contains parameters that are passed to ncc. @opts = qw( -gcc=msp430-gcc -mmcu=msp430f1611 -fnesc-target=msp430 -fnesc-no-debug ); push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{'CIL_MACHINE'} = "version_major=3 " . "version_minor=2 " . "version=msp430-3.2.3 " . "short=2,2 " . "int=2,2 " . "long=4,2 " . "long_long=8,2 " . "pointer=2,2 " . "enum=2,2 " . "float=4,2 " . "double=4,2 " . "long_double=4,2 " . "void=1,1 " . "fun=1,2 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/epic/DemoSensorC.nc000066400000000000000000000044241207233610700222240ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorC on the telosb platform provides a * voltage reading, using VoltageC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2008-08-07 06:37:05 $ * */ generic configuration DemoSensorC() { provides interface Read; } implementation { components new VoltageC() as DemoSensor; Read = DemoSensor; } tinyos-2.1.2+dfsg/tos/platforms/epic/DemoSensorNowC.nc000066400000000000000000000046341207233610700227130ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorNowC is a generic sensor device that provides a 16-bit * value that can be read from async context. The platform author * chooses which sensor actually sits behind DemoSensorNowC, and * though it's probably Voltage, Light, or Temperature, there are no * guarantees. * * This particular DemoSensorNowC on the telosb platform provides a * voltage reading, using VoltageC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2008-08-07 06:37:05 $ * */ generic configuration DemoSensorNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new Msp430InternalVoltageC() as DemoSensorNow; Resource = DemoSensorNow; ReadNow = DemoSensorNow; } tinyos-2.1.2+dfsg/tos/platforms/epic/DemoSensorStreamC.nc000066400000000000000000000045041207233610700233770ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorStreamC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorStreamC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorStreamC on the telosb platform provides a * voltage reading, using VoltageStreamC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2008-08-07 06:37:05 $ * */ generic configuration DemoSensorStreamC() { provides interface ReadStream; } implementation { components new VoltageStreamC() as DemoSensor; ReadStream = DemoSensor; } tinyos-2.1.2+dfsg/tos/platforms/epic/HplUserButtonC.nc000066400000000000000000000042761207233610700227310ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telos platform * * @author Gilman Tolle * @version $Revision: 1.1 $ */ configuration HplUserButtonC { provides interface GeneralIO; provides interface GpioInterrupt; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components HplMsp430InterruptC as InterruptC; components new Msp430GpioC() as UserButtonC; UserButtonC -> GeneralIOC.Port27; GeneralIO = UserButtonC; components new Msp430InterruptC() as InterruptUserButtonC; InterruptUserButtonC.HplInterrupt -> InterruptC.Port27; GpioInterrupt = InterruptUserButtonC.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/epic/Ieee154MessageC.nc000066400000000000000000000044731207233610700225600ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * * @author Stephen Dawson-Haggerty */ configuration Ieee154MessageC { provides { interface SplitControl; interface Resource as SendResource[uint8_t clientId]; interface Ieee154Send; interface Receive as Ieee154Receive; interface Ieee154Packet; interface Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; interface LowPowerListening; interface PacketLink; } } implementation { components CC2420Ieee154MessageC as Msg; SplitControl = Msg; SendResource = Msg; Ieee154Send = Msg; Ieee154Receive = Msg; Ieee154Packet = Msg; Packet = Msg; PacketAcknowledgements = Msg; LinkPacketMetadata = Msg; LowPowerListening = Msg; PacketLink = Msg; } tinyos-2.1.2+dfsg/tos/platforms/epic/MoteClockC.nc000066400000000000000000000036451207233610700220320ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: MoteClockC.nc,v 1.1 2008-08-07 06:37:05 prabal Exp $ * */ /** * @author Vlado Handziski */ configuration MoteClockC { provides interface Init as MoteClockInit; } implementation { components Msp430ClockC, MoteClockP; MoteClockInit = Msp430ClockC.Init; //MoteClockP.Msp430ClockInit -> Msp430ClockC; } tinyos-2.1.2+dfsg/tos/platforms/epic/MoteClockP.nc000066400000000000000000000070161207233610700220430ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: MoteClockP.nc,v 1.1 2008-08-07 06:37:05 prabal Exp $ * */ /** * @author Vlado Handziski * @author Cory Sharp */ module MoteClockP { uses interface Msp430ClockInit; } implementation { event void Msp430ClockInit.setupDcoCalibrate() { // --- setup --- TACTL = TASSEL1 | MC1; // source SMCLK, continuous mode, everything else 0 TBCTL = TBSSEL0 | MC1; BCSCTL1 = XT2OFF | RSEL2; BCSCTL2 = DCOR; // enable DCOR TBCCTL0 = CM0; } event void Msp430ClockInit.initClocks() { // BCSCTL1 // .XT2OFF = 1; disable the external oscillator for SCLK and MCLK // .XTS = 0; set low frequency mode for LXFT1 // .DIVA = 0; set the divisor on ACLK to 1 // .RSEL, do not modify BCSCTL1 = XT2OFF | (BCSCTL1 & (RSEL2|RSEL1|RSEL0)); // BCSCTL2 // .SELM = 0; select DCOCLK as source for MCLK // .DIVM = 0; set the divisor of MCLK to 1 // .SELS = 0; select DCOCLK as source for SCLK // .DIVS = 2; set the divisor of SCLK to 4 // .DCOR = 1; select internal resistor for DCO BCSCTL2 = DIVS1 | DCOR; // IE1.OFIE = 0; no interrupt for oscillator fault CLR_FLAG( IE1, OFIE ); } event void Msp430ClockInit.initTimerA() { TAR = 0; // TACTL // .TACLGRP = 0; each TACL group latched independently // .CNTL = 0; 16-bit counter // .TASSEL = 2; source SMCLK = DCO/4 // .ID = 0; input divisor of 1 // .MC = 0; initially disabled // .TACLR = 0; reset timer A // .TAIE = 1; enable timer A interrupts TACTL = TASSEL1 | TAIE; } event void Msp430ClockInit.initTimerB() { TBR = 0; // TBCTL // .TBCLGRP = 0; each TBCL group latched independently // .CNTL = 0; 16-bit counter // .TBSSEL = 1; source ACLK // .ID = 0; input divisor of 1 // .MC = 0; initially disabled // .TBCLR = 0; reset timer B // .TBIE = 1; enable timer B interrupts TBCTL = TBSSEL0 | TBIE; } } tinyos-2.1.2+dfsg/tos/platforms/epic/MotePlatformC.nc000066400000000000000000000014171207233610700225560ustar00rootroot00000000000000module MotePlatformC @safe() { provides interface Init; uses interface Init as SubInit; } implementation { command error_t Init.init() { // reset all of the ports to be input and using i/o functionality atomic { P1SEL = 0; P2SEL = 0; P3SEL = 0; P4SEL = 0; P5SEL = 0; P6SEL = 0; P1OUT = 0x00; P1DIR = 0xe0; P2OUT = 0x30; P2DIR = 0x7b; P3OUT = 0x00; P3DIR = 0xf1; P4OUT = 0xdd; P4DIR = 0xfd; P5OUT = 0xff; P5DIR = 0xff; P6OUT = 0x00; P6DIR = 0xff; P1IE = 0; P2IE = 0; // the commands above take care of the pin directions // there is no longer a need for explicit set pin // directions using the TOSH_SET/CLR macros }//atomic return call SubInit.init(); } default command error_t SubInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/epic/PlatformC.nc000066400000000000000000000040651207233610700217330ustar00rootroot00000000000000// $Id: PlatformC.nc,v 1.3 2010-06-29 22:07:52 scipio Exp $ /* * Copyright (c) 2004-2008 The Regents of the University of * California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Initialization code responsible for booting Epic to a usable state. * * @author Prabal Dutta */ #include "hardware.h" configuration PlatformC { provides { interface Init; } } implementation { components PlatformP; components MoteClockC; components MotePlatformC; Init = PlatformP; PlatformP.MoteClockInit -> MoteClockC; PlatformP.MoteInit -> MotePlatformC; } tinyos-2.1.2+dfsg/tos/platforms/epic/PlatformLedsC.nc000066400000000000000000000011501207233610700225330ustar00rootroot00000000000000#include "hardware.h" configuration PlatformLedsC { provides { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; } uses { interface Init; } } implementation { components HplMsp430GeneralIOC as GeneralIOC; components new Msp430GpioC() as Led0Impl; components new Msp430GpioC() as Led1Impl; components new Msp430GpioC() as Led2Impl; components PlatformP; Init = PlatformP.LedsInit; Led0 = Led0Impl; Led0Impl -> GeneralIOC.Port40; Led1 = Led1Impl; Led1Impl -> GeneralIOC.Port43; Led2 = Led2Impl; Led2Impl -> GeneralIOC.Port47; } tinyos-2.1.2+dfsg/tos/platforms/epic/PlatformP.nc000066400000000000000000000043341207233610700217470ustar00rootroot00000000000000// $Id: PlatformP.nc,v 1.3 2010-06-29 22:07:52 scipio Exp $ /* * Copyright (c) 2004-2008 The Regents of the University of * California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Initialization code responsible for booting Epic to a usable state. * * @author Prabal Dutta */ #include "hardware.h" module PlatformP { provides { interface Init; } uses { interface Init as MoteClockInit; interface Init as MoteInit; interface Init as LedsInit; } } implementation { command error_t Init.init() { WDTCTL = WDTPW + WDTHOLD; call MoteClockInit.init(); call MoteInit.init(); call LedsInit.init(); return SUCCESS; } default command error_t LedsInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/epic/UserButton.h000066400000000000000000000035121207233610700220010ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform * * @author Gilman Tolle * @version $Revision: 1.1 $ */ #ifndef USERBUTTON_H #define USERBUTTON_H typedef enum { BUTTON_RELEASED = 0, BUTTON_PRESSED = 1 } button_state_t; #endif tinyos-2.1.2+dfsg/tos/platforms/epic/UserButtonC.nc000066400000000000000000000050431207233610700222560ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform. Get * returns the current state of the button by reading the pin, * regardless of whether enable() or disable() has been called on the * Interface. Notify.enable() and Notify.disable() modify the * underlying interrupt state of the pin, and have the effect of * enabling or disabling notifications that the button has changed * state. * * @author Gilman Tolle * @version $Revision: 1.1 $ */ #include configuration UserButtonC { provides interface Get; provides interface Notify; } implementation { components HplUserButtonC; components new SwitchToggleC(); SwitchToggleC.GpioInterrupt -> HplUserButtonC.GpioInterrupt; SwitchToggleC.GeneralIO -> HplUserButtonC.GeneralIO; components UserButtonP; Get = UserButtonP; Notify = UserButtonP; UserButtonP.GetLower -> SwitchToggleC.Get; UserButtonP.NotifyLower -> SwitchToggleC.Notify; } tinyos-2.1.2+dfsg/tos/platforms/epic/UserButtonP.nc000066400000000000000000000050651207233610700222770ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform * * @author Gilman Tolle * @version $Revision: 1.1 $ */ #include module UserButtonP { provides interface Get; provides interface Notify; uses interface Get as GetLower; uses interface Notify as NotifyLower; } implementation { command button_state_t Get.get() { // telosb user button pin is high when released - invert state if ( call GetLower.get() ) { return BUTTON_RELEASED; } else { return BUTTON_PRESSED; } } command error_t Notify.enable() { return call NotifyLower.enable(); } command error_t Notify.disable() { return call NotifyLower.disable(); } event void NotifyLower.notify( bool val ) { // telosb user button pin is high when released - invert state if ( val ) { signal Notify.notify( BUTTON_RELEASED ); } else { signal Notify.notify( BUTTON_PRESSED ); } } } tinyos-2.1.2+dfsg/tos/platforms/epic/VoltageC.nc000066400000000000000000000040521207233610700215440ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * VoltageC is a common name for the Msp430InternalVoltageC voltage * sensor available on the telosb platform. * * To convert from ADC counts to actual voltage, divide by 4096 and * multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2008-08-07 06:37:05 $ */ generic configuration VoltageC() { provides interface Read; } implementation { components new Msp430InternalVoltageC(); Read = Msp430InternalVoltageC.Read; } tinyos-2.1.2+dfsg/tos/platforms/epic/VoltageStreamC.nc000066400000000000000000000041021207233610700227140ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * VoltageC is a common name for the Msp430InternalVoltageC voltage * sensor available on the telosb platform. * * To convert from ADC counts to actual voltage, divide by 4096 and * multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2008-08-07 06:37:05 $ */ generic configuration VoltageStreamC() { provides interface ReadStream; } implementation { components new Msp430InternalVoltageC(); ReadStream = Msp430InternalVoltageC.ReadStream; } tinyos-2.1.2+dfsg/tos/platforms/epic/chips/000077500000000000000000000000001207233610700206235ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/epic/chips/at45db/000077500000000000000000000000001207233610700217065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/epic/chips/at45db/HplAt45dbC.nc000066400000000000000000000037701207233610700240310ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ configuration HplAt45dbC { provides interface HplAt45db; } implementation { components new HplAt45dbByteC(10), new Msp430Spi0C() as Spi, HplAt45dbP, HplMsp430GeneralIOC as MspGeneralIO, new Msp430GpioC() as Select; HplAt45db = HplAt45dbByteC; HplAt45dbByteC.Resource -> Spi; HplAt45dbByteC.FlashSpi -> Spi; HplAt45dbByteC.HplAt45dbByte -> HplAt45dbP; Select -> MspGeneralIO.Port44; HplAt45dbP.Select -> Select; HplAt45dbP.FlashSpi -> Spi; } tinyos-2.1.2+dfsg/tos/platforms/epic/chips/at45db/HplAt45dbP.nc000066400000000000000000000044631207233610700240460ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ module HplAt45dbP { provides { interface HplAt45dbByte; } uses { interface SpiByte as FlashSpi; interface GeneralIO as Select; } } implementation { command void HplAt45dbByte.select() { call Select.clr(); } command void HplAt45dbByte.deselect() { call Select.set(); } task void idleTask() { uint8_t status; status = call FlashSpi.write(0); if (!(status & 0x80)) { post idleTask(); } else { //printf("idle: %d\n", status); signal HplAt45dbByte.idle(); } } command void HplAt45dbByte.waitIdle() { post idleTask(); } command bool HplAt45dbByte.getCompareStatus() { uint8_t status; status = call FlashSpi.write(0); //printf("s: %d\n", status); return (!(status & 0x40)); } } tinyos-2.1.2+dfsg/tos/platforms/epic/chips/at45db/HplAt45db_chip.h000066400000000000000000000045011207233610700245510ustar00rootroot00000000000000// $Id: HplAt45db_chip.h,v 1.2 2010-06-29 22:07:52 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef HPLAT45DB_CHIP_H #define HPLAT45DB_CHIP_H // flash characteristics enum { AT45_MAX_PAGES = 4096, AT45_PAGE_SIZE = 528, AT45_PAGE_SIZE_LOG2 = 9 // For those who want to ignore the last 8 bytes }; typedef uint16_t at45page_t; typedef uint16_t at45pageoffset_t; /* must fit 0 to AT45_PAGE_SIZE - 1 */ #endif tinyos-2.1.2+dfsg/tos/platforms/epic/chips/ds2411/000077500000000000000000000000001207233610700215415ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/epic/chips/ds2411/CachedIeeeEui64C.nc000066400000000000000000000030321207233610700247400ustar00rootroot00000000000000// $Id: CachedIeeeEui64C.nc,v 1.1 2010/02/23 06:45:38 sdhsdh Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** * Cache an EUI 64 at initialization time and return the cached value for * subsequent queries. */ configuration CachedIeeeEui64C { uses interface LocalIeeeEui64 as SubIeeeEui64; provides interface LocalIeeeEui64; } implementation { components CachedIeeeEui64P, MotePlatformC; MotePlatformC.SubInit -> CachedIeeeEui64P.Init; SubIeeeEui64 = CachedIeeeEui64P; LocalIeeeEui64 = CachedIeeeEui64P; } tinyos-2.1.2+dfsg/tos/platforms/epic/chips/ds2411/DallasId48.h000066400000000000000000000026231207233610700235460ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- */ /** * data structures for dallas/maxim serial ID chips */ /* * @author Andreas Koepke */ #ifndef DALLASID48_H #define DALLASID48_H enum { DALLASID48_SERIAL_LENGTH = 6, DALLASID48_DATA_LENGTH = 8 }; typedef union dallasid48_serial_t { uint8_t data[DALLASID48_DATA_LENGTH]; struct { uint8_t family_code; uint8_t serial[DALLASID48_SERIAL_LENGTH]; uint8_t crc; }; } dallasid48_serial_t; // The CRC polynomial is X^8 + X^5 + X^4 + 1, // code is taken from http://linux.die.net/man/3/_crc_ccitt_update bool dallasid48checkCrc(const dallasid48_serial_t *id) { uint8_t crc = 0; uint8_t idx; for(idx = 0; idx < DALLASID48_DATA_LENGTH; idx++) { uint8_t i; crc = crc ^ (*id).data[idx]; for(i = 0; i < 8; i++) { if(crc & 0x01) { crc = (crc >> 1) ^ 0x8C; } else { crc >>= 1; } } } return crc == 0; } /* test application #include #include #include #ifndef bool #define bool uint8_t #endif #include "DallasId48.h" int main(void) { dallasid48_serial_t id = { 0x02, 0x1C, 0xB8, 0x01, 0x00, 0x00, 0x00, 0xA2}; printf("fam: %x, crc: %x, crc ok: %i\n", id.family_code, id.crc, dallasid48checkCrc(&id)); } */ #endif // DALLASID48_H tinyos-2.1.2+dfsg/tos/platforms/epic/chips/ds2411/DallasId48ToIeeeEui64C.nc000066400000000000000000000015171207233610700257330ustar00rootroot00000000000000 #include "PlatformIeeeEui64.h" module DallasId48ToIeeeEui64C { provides interface LocalIeeeEui64; uses interface ReadId48; } implementation { command ieee_eui64_t LocalIeeeEui64.getId() { uint8_t id[6]; ieee_eui64_t eui; if (call ReadId48.read(id) != SUCCESS) { memset(eui.data, 0, 8); goto done; } eui.data[0] = IEEE_EUI64_COMPANY_ID_0; eui.data[1] = IEEE_EUI64_COMPANY_ID_1; eui.data[2] = IEEE_EUI64_COMPANY_ID_2; // 16 bits of the ID is generated by software // could be used for hardware model id and revision, for example eui.data[3] = IEEE_EUI64_SERIAL_ID_0; eui.data[4] = IEEE_EUI64_SERIAL_ID_1; // 24 least significant bits of the serial ID read from the DS2401 eui.data[5] = id[2]; eui.data[6] = id[1]; eui.data[7] = id[0]; done: return eui; } } tinyos-2.1.2+dfsg/tos/platforms/epic/chips/ds2411/Ds2411C.nc000066400000000000000000000011531207233610700230440ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- */ /** * DS2411 tmote sky serial id */ /** * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) */ #include "Timer.h" configuration Ds2411C { provides interface ReadId48; } implementation { components Ds2411P, PlatformOneWireLowLevelC, OneWireMasterC, BusyWaitMicroC; components HplMsp430GeneralIOC as Hpl, new Msp430GpioC() as Gpio; Gpio.HplGeneralIO -> Hpl.Port24; ReadId48 = Ds2411P; Ds2411P.OneWire -> OneWireMasterC; OneWireMasterC.Pin -> Gpio; OneWireMasterC.BusyWait -> BusyWaitMicroC; } tinyos-2.1.2+dfsg/tos/platforms/epic/chips/ds2411/Ds2411P.nc000066400000000000000000000020251207233610700230600ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- */ /** * DS2411 telosb tmote sky serial id */ /** * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) */ #include "DallasId48.h" module Ds2411P { provides { interface ReadId48; } uses { interface OneWireStream as OneWire; } } implementation { bool haveId = FALSE; dallasid48_serial_t ds2411id; error_t readId() { error_t e = call OneWire.read(0x33, ds2411id.data, DALLASID48_DATA_LENGTH); if(e == SUCCESS) { if(dallasid48checkCrc(&ds2411id)) { haveId = TRUE; } else { e = EINVAL; } } return e; } command error_t ReadId48.read(uint8_t *id) { error_t e = SUCCESS; if(!haveId) { e = readId(); } if(haveId) { uint8_t i; for(i = 0; i < DALLASID48_SERIAL_LENGTH; i++) { id[i] = ds2411id.serial[i]; } } return e; } } tinyos-2.1.2+dfsg/tos/platforms/epic/chips/ds2411/LocalIeeeEui64C.nc000066400000000000000000000026471207233610700246360ustar00rootroot00000000000000// $Id: LocalIeeeEui64C.nc,v 1.1 2010/02/23 06:45:38 sdhsdh Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai * Epic port by Stephen Dawson-Haggerty */ configuration LocalIeeeEui64C { provides interface LocalIeeeEui64; } implementation { components Ds2411C, DallasId48ToIeeeEui64C; LocalIeeeEui64 = DallasId48ToIeeeEui64C; DallasId48ToIeeeEui64C.ReadId48 -> Ds2411C; } tinyos-2.1.2+dfsg/tos/platforms/epic/chips/ds2411/OneWireMasterC.nc000066400000000000000000000061561207233610700247220ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- */ /** * Dallas/Maxim 1wire bus master * */ module OneWireMasterC { provides { interface OneWireStream as OneWire; } uses { interface GeneralIO as Pin; interface BusyWait; } } implementation { typedef enum { DELAY_5US = 5, RESET_LOW_TIME = 560, // min: 480us, max: 640 us DELAY_60US = 60, // min: 15us, max: 60us PRESENCE_DETECT_LOW_TIME = 240, // min: 60us, max: 240us PRESENCE_RESET_HIGH_TIME = 480, // maximum recommended value SLOT_TIME = 65, } onewiretimes_t; bool reset() { uint16_t i; call Pin.makeInput(); call Pin.clr(); call Pin.makeOutput(); call BusyWait.wait(RESET_LOW_TIME); call Pin.makeInput(); call BusyWait.wait(DELAY_60US); // wait until either the pin goes low or the timer expires for(i = 0; i < PRESENCE_DETECT_LOW_TIME; i += DELAY_5US, call BusyWait.wait(DELAY_5US)) if (!call Pin.get()) break; call BusyWait.wait(PRESENCE_RESET_HIGH_TIME - DELAY_60US); return i < PRESENCE_DETECT_LOW_TIME; } void writeOne() { call Pin.makeOutput(); call BusyWait.wait(DELAY_5US); call Pin.makeInput(); call BusyWait.wait(SLOT_TIME); } void writeZero() { call Pin.makeOutput(); call BusyWait.wait(DELAY_60US); call Pin.makeInput(); call BusyWait.wait(DELAY_5US); } bool readBit() { bool bit; call Pin.makeOutput(); call BusyWait.wait(DELAY_5US); call Pin.makeInput(); call BusyWait.wait(DELAY_5US); bit = call Pin.get(); call BusyWait.wait(SLOT_TIME); return bit; } void writeByte(uint8_t c) { uint8_t j; for(j = 0; j < 8; j++) { if(c & 0x01) { writeOne(); } else { writeZero(); } c >>= 1; } } uint8_t readByte() { uint8_t i,c = 0; for(i = 0; i < 8; i++) { c >>= 1; if(readBit()) { c |= 0x80; } } return c; } command error_t OneWire.read(uint8_t cmd, uint8_t* buf, uint8_t len) { error_t e = SUCCESS; atomic { if(reset()) { uint8_t i; writeByte(cmd); for(i = 0; i < len; i++) { buf[i] = readByte(); } } else { e = EOFF; } } return e; } command error_t OneWire.write(const uint8_t* buf, uint8_t len) { error_t e = SUCCESS; atomic { if(reset()) { uint8_t i; for(i = 0; i < len; i++) { writeByte(buf[i]); } } else { e = EOFF; } } return e; } } tinyos-2.1.2+dfsg/tos/platforms/epic/chips/ds2411/OneWireStream.nc000066400000000000000000000004621207233610700246110ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- */ /** * Interface to Dallas/Maxim 1wire */ /** * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) */ interface OneWireStream { command error_t read(uint8_t cmd, uint8_t* buf, uint8_t len); command error_t write(const uint8_t* buf, uint8_t len); } tinyos-2.1.2+dfsg/tos/platforms/epic/chips/ds2411/PlatformIeeeEui64.h000066400000000000000000000026631207233610700251120ustar00rootroot00000000000000// $Id: PlatformIeeeEui64.h,v 1.1 2010/02/23 06:45:38 sdhsdh Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai * changes for Epic */ #ifndef PLATFORMIEEEEUI64_H #define PLATFORMIEEEEUI64_H enum { IEEE_EUI64_COMPANY_ID_0 = 0x00, IEEE_EUI64_COMPANY_ID_1 = 0x12, IEEE_EUI64_COMPANY_ID_2 = 0x6d, IEEE_EUI64_SERIAL_ID_0 = 'E', IEEE_EUI64_SERIAL_ID_1 = 'P', }; #endif // PLATFORMIEEEEUI64_H tinyos-2.1.2+dfsg/tos/platforms/epic/chips/ds2411/PlatformOneWireLowLevelC.nc000066400000000000000000000010151207233610700267120ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- */ /** * read interface maxim/dallas 48 bit ID chips */ /** * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) */ configuration PlatformOneWireLowLevelC { provides interface GeneralIO as OneWirePin; } implementation{ components HplMsp430GeneralIOC; components new Msp430GpioC(); Msp430GpioC.HplGeneralIO -> HplMsp430GeneralIOC.Port24; OneWirePin = Msp430GpioC; // SDH : this seemed to break with mspgcc4... // components PlatformOneWireLowLevelP as Pins; } tinyos-2.1.2+dfsg/tos/platforms/epic/chips/ds2411/ReadId48.nc000066400000000000000000000005311207233610700233660ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- */ /** * read interface maxim/dallas 48 bit ID chips */ /** * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) */ interface ReadId48 { // the ID is written into the buffer pointed to by id, // the buffer must be at least 6 bytes (or 48 bit) long command error_t read(uint8_t *id); } tinyos-2.1.2+dfsg/tos/platforms/epic/hardware.h000066400000000000000000000064751207233610700214770ustar00rootroot00000000000000// $Id: hardware.h,v 1.3 2010-06-29 22:07:52 scipio Exp $ /* * Copyright (c) 2007-2008 The Regents of the University of * California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached * INTEL-LICENSE file. If you do not find these files, copies can be * found by writing to Intel Research Berkeley, 2150 Shattuck Avenue, * Suite 1300, Berkeley, CA, 94704. Attention: Intel License Inquiry. */ /** * Hardware definition for the Epic platform. * * @author Prabal Dutta */ #ifndef _H_hardware_h #define _H_hardware_h #include "msp430hardware.h" // enum so components can override power saving, // as per TEP 112. enum { TOS_SLEEP_NONE = MSP430_POWER_ACTIVE, }; // LEDS TOSH_ASSIGN_PIN(RED_LED, 4, 0); TOSH_ASSIGN_PIN(GREEN_LED, 4, 3); TOSH_ASSIGN_PIN(YELLOW_LED, 4, 7); // CC2420 RADIO TOSH_ASSIGN_PIN(RADIO_CSN, 4, 2); TOSH_ASSIGN_PIN(RADIO_VREF, 4, 5); TOSH_ASSIGN_PIN(RADIO_RESET, 4, 6); TOSH_ASSIGN_PIN(RADIO_FIFOP, 1, 0); TOSH_ASSIGN_PIN(RADIO_SFD, 4, 1); TOSH_ASSIGN_PIN(RADIO_GIO0, 1, 3); TOSH_ASSIGN_PIN(RADIO_FIFO, 1, 3); TOSH_ASSIGN_PIN(RADIO_GIO1, 1, 4); TOSH_ASSIGN_PIN(RADIO_CCA, 1, 4); TOSH_ASSIGN_PIN(CC_FIFOP, 1, 0); TOSH_ASSIGN_PIN(CC_FIFO, 1, 3); TOSH_ASSIGN_PIN(CC_SFD, 4, 1); TOSH_ASSIGN_PIN(CC_VREN, 4, 5); TOSH_ASSIGN_PIN(CC_RSTN, 4, 6); // USART0 TOSH_ASSIGN_PIN(SIMO0, 3, 1); TOSH_ASSIGN_PIN(SOMI0, 3, 2); TOSH_ASSIGN_PIN(UCLK0, 3, 3); // USART1 TOSH_ASSIGN_PIN(SIMO1, 5, 1); TOSH_ASSIGN_PIN(SOMI1, 5, 2); TOSH_ASSIGN_PIN(UCLK1, 5, 3); // UART1 TOSH_ASSIGN_PIN(UTXD0, 3, 4); TOSH_ASSIGN_PIN(URXD0, 3, 5); TOSH_ASSIGN_PIN(UTXD1, 3, 6); TOSH_ASSIGN_PIN(URXD1, 3, 7); // 1-Wire TOSH_ASSIGN_PIN(ONEWIRE, 2, 4); // need to undef atomic inside header files or nesC ignores the directive #undef atomic #endif // _H_hardware_h tinyos-2.1.2+dfsg/tos/platforms/epic/platform.h000066400000000000000000000000001207233610700215000ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/epic/platform_message.h000066400000000000000000000050741207233610700232240ustar00rootroot00000000000000/* $Id: platform_message.h,v 1.2 2010-06-29 22:07:52 scipio Exp $ * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Defining the platform-independently named packet structures to be the * chip-specific CC1000 packet structures. * * @author Philip Levis * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:52 $ */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include #include typedef union message_header { cc2420_header_t cc2420; serial_header_t serial; } message_header_t; typedef union TOSRadioFooter { cc2420_footer_t cc2420; } message_footer_t; typedef union TOSRadioMetadata { cc2420_metadata_t cc2420; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/000077500000000000000000000000001207233610700201115ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/.family000066400000000000000000000033541207233610700214000ustar00rootroot00000000000000# Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. And because of that, the current platform's include directory # must be specified, otherwise its search order is last instead of first. push( @includes, qw( # normal platform includes %T/platforms/eyesIFX %T/platforms/eyesIFX/chips/tda5250 %T/platforms/eyesIFX/chips/ad5200 %T/platforms/eyesIFX/chips/msp430 %T/platforms/eyesIFX/sensors %T/platforms/eyesIFX/byte_radio %T/chips/tda5250 %T/chips/tda5250/mac %T/chips/ad5200 %T/chips/msp430 %T/chips/msp430/adc12 %T/chips/msp430/dma %T/chips/msp430/pins %T/chips/msp430/sensors %T/chips/msp430/usart %T/chips/msp430/timer %T/lib/timer %T/lib/serial %T/lib/adc %T/lib/byte_radio %T/lib/power ) ); push (@opts, qw( -gcc=msp430-gcc -fnesc-target=msp430 -fnesc-no-debug ) ); push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{'CIL_MACHINE'} = "version_major=3 " . "version_minor=2 " . "version=msp430-3.2.3 " . "short=2,2 " . "int=2,2 " . "long=4,2 " . "long_long=8,2 " . "pointer=2,2 " . "enum=2,2 " . "float=4,2 " . "double=4,2 " . "long_double=4,2 " . "void=1,1 " . "fun=1,2 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/ActiveMessageC.nc000066400000000000000000000065741207233610700232720ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.7 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.7 2010-06-29 22:07:53 scipio Exp $ * */ /** * * The Active Message layer on the eyesIFX platforms. This is a naming wrapper * around the TDA5250 Active Message layer. * * @author Philip Levis * @author Vlado Handziski (TDA5250 modifications) * @date July 20 2005 */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components ActiveMessageFilterC as Filter; components Tda5250ActiveMessageC as AM; components PacketStampC as PacketStamp; AMSend = Filter; Receive = Filter.Receive; Snoop = Filter.Snoop; Filter.SubAMSend -> AM; Filter.SubReceive -> AM.Receive; Filter.SubSnoop -> AM.Snoop; //Filter.AMPacket -> AM; SplitControl = AM; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; PacketTimeStamp32khz = PacketStamp; PacketTimeStampMilli = PacketStamp; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/ActiveMessageFilterC.nc000066400000000000000000000071451207233610700244330ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2007-09-13 23:10:19 $ * @author: Jan Hauer * ======================================================================== */ /* This component is the default AM filter component: it does not do anything, * it uses no RAM and nesC will compile all code away. Its purpose is to allow * other components to shadow (overwrite) it to implement their own * filter/statistic component. */ #include "AM.h" module ActiveMessageFilterC { provides { interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; } uses { interface AMSend as SubAMSend[am_id_t id]; interface Receive as SubReceive[am_id_t id]; interface Receive as SubSnoop[am_id_t id]; } } implementation { command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len){ return call SubAMSend.send[id](addr, msg, len);} command error_t AMSend.cancel[am_id_t id](message_t* msg){ return call SubAMSend.cancel[id](msg);} command uint8_t AMSend.maxPayloadLength[am_id_t id](){ return call SubAMSend.maxPayloadLength[id]();} command void* AMSend.getPayload[am_id_t id](message_t* msg, uint8_t len){ return call SubAMSend.getPayload[id](msg, len);} event void SubAMSend.sendDone[am_id_t id](message_t* msg, error_t error) { signal AMSend.sendDone[id](msg, error); } default event void AMSend.sendDone[am_id_t id](message_t* msg, error_t error) { return; } event message_t* SubReceive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal Receive.receive[id](msg, payload, len); } default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len){ return msg;} event message_t* SubSnoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal Snoop.receive[id](msg, payload, len); } default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len){return msg;} } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/DummySleepP.nc000066400000000000000000000041701207233610700226410ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ module DummySleepP { provides { interface Sleeptime; } } implementation { #warning "Dummy component for LowPowerListening/Sleeptime, please define MAC_REDMAC or MAC_SPECKMACD" async command void Sleeptime.setLocalSleeptime(uint16_t sT) { } async command uint16_t Sleeptime.getLocalSleeptime() { return 0; } async command void Sleeptime.setNetworkSleeptime(uint16_t sT) { } async command uint16_t Sleeptime.getNetworkSleeptime() { return 0; } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/LedsP.nc000066400000000000000000000105071207233610700214450ustar00rootroot00000000000000// $Id: LedsP.nc,v 1.6 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The implementation of the standard LED mote abstraction. * * @author Joe Polastre * @author Philip Levis * @date March 21, 2005 */ module LedsP { provides { interface Init; interface Leds; } uses { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; } } implementation { #ifndef dbg #define dbg(n,msg) #endif command error_t Init.init() { atomic { dbg(DBG_BOOT, "LEDS: initialized.\n"); call Led0.makeOutput(); call Led1.makeOutput(); call Led2.makeOutput(); call Led0.clr(); call Led1.clr(); call Led2.clr(); } return SUCCESS; } async command void Leds.led0On() { dbg(DBG_LED, "LEDS: Led 0 on.\n"); call Led0.set(); } async command void Leds.led0Off() { dbg(DBG_LED, "LEDS: Led 0 off.\n"); call Led0.clr(); } async command void Leds.led0Toggle() { call Led0.toggle(); // this should be removed by dead code elimination when compiled for // the physical motes if (call Led0.get()) dbg(DBG_LED, "LEDS: Led 0 off.\n"); else dbg(DBG_LED, "LEDS: Led 0 on.\n"); } async command void Leds.led1On() { dbg(DBG_LED, "LEDS: Led 1 on.\n"); call Led1.set(); } async command void Leds.led1Off() { dbg(DBG_LED, "LEDS: Led 1 off.\n"); call Led1.clr(); } async command void Leds.led1Toggle() { call Led1.toggle(); if (call Led1.get()) dbg(DBG_LED, "LEDS: Led 1 off.\n"); else dbg(DBG_LED, "LEDS: Led 1 on.\n"); } async command void Leds.led2On() { dbg(DBG_LED, "LEDS: Led 2 on.\n"); call Led2.set(); } async command void Leds.led2Off() { dbg(DBG_LED, "LEDS: Led 2 off.\n"); call Led2.clr(); } async command void Leds.led2Toggle() { call Led2.toggle(); if (call Led2.get()) dbg(DBG_LED, "LEDS: Led 2 off.\n"); else dbg(DBG_LED, "LEDS: Led 2 on.\n"); } async command uint8_t Leds.get() { uint8_t rval; atomic { rval = 0; if (call Led0.get()) { rval |= LEDS_LED0; } if (call Led1.get()) { rval |= LEDS_LED1; } if (call Led2.get()) { rval |= LEDS_LED2; } return rval; } } async command void Leds.set(uint8_t val) { atomic { if (val & LEDS_LED0) { call Leds.led0On(); } else { call Leds.led0Off(); } if (val & LEDS_LED1) { call Leds.led1On(); } else { call Leds.led1Off(); } if (val & LEDS_LED2) { call Leds.led2On(); } else { call Leds.led2Off(); } } } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/LocalTimeC.nc000066400000000000000000000037261207233610700224170ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ configuration LocalTimeC { provides { interface LocalTime as LocalTimeT32khz; interface WideLocalTime as WideLocalTime; } } implementation { components LocalTimeP, Counter32khz16C as Counter; LocalTimeT32khz = LocalTimeP; WideLocalTime = LocalTimeP; LocalTimeP.Counter32khz16 -> Counter; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/LocalTimeP.nc000066400000000000000000000064071207233610700224330ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ module LocalTimeP { provides { interface LocalTime as LocalTime32kHz; interface WideLocalTime as WideLocalTime; } uses { interface Counter as Counter32khz16; } } implementation { typedef union { int64_t op; struct { uint32_t lo; int32_t hi; }; } i64parts_t; uint16_t counter2sec = 126; int32_t dayCounter = 0; bool increaseDay = FALSE; async command uint32_t LocalTime32kHz.get() { uint32_t time; unsigned t; bool dirty1; bool dirty2; atomic { increaseDay = FALSE; do { dirty1 = call Counter32khz16.isOverflowPending(); t = call Counter32khz16.get(); dirty2 = call Counter32khz16.isOverflowPending(); } while (dirty1 != dirty2); time = counter2sec; if(dirty1) { ++time; if(time == 0) { increaseDay = TRUE; } } time = (time << 16) + t; } return time; } async command int64_t WideLocalTime.get() { i64parts_t time; uint32_t t; atomic { t = call LocalTime32kHz.get(); time.hi = dayCounter; if(increaseDay) time.hi++; if(time.hi < 0) time.hi = 0; time.lo = t; } return time.op; } async event void Counter32khz16.overflow() { ++counter2sec; if(counter2sec == 0) ++dayCounter; if(dayCounter < 0) dayCounter = 0; } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/LplC.nc000066400000000000000000000041311207233610700212640ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ configuration LplC { provides { interface LowPowerListening; } } implementation { #ifdef MAC_REDMAC components RedMacC as Mac; #elif defined(MAC_SPECKMACD) components SpeckMacDC as Mac; #else components DummySleepP as Mac; #endif components LplP as Lpl, new Alarm32khz16C() as Timer, RandomLfsrC; LowPowerListening = Lpl; Lpl.Sleeptime -> Mac; Lpl.Random -> RandomLfsrC; Lpl.Timer -> Timer; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/LplP.nc000066400000000000000000000077631207233610700213170ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ module LplP { provides { interface LowPowerListening; } uses { interface Sleeptime; interface Alarm as Timer; interface Random; } } implementation { #ifdef MAC_REDMAC #define ON_TIME 15 #elif defined(MAC_SPECKMACD) #define ON_TIME 5 #else #define ON_TIME 1 #endif #define MIN_SLEEP 2048 norace uint16_t localsleep; async event void Timer.fired() { call Sleeptime.setLocalSleeptime(localsleep); } command void LowPowerListening.setLocalSleepInterval(uint16_t sleepIntervalMs) { if(sleepIntervalMs < 0x7FF) { localsleep = (sleepIntervalMs * 32); } else { localsleep = 0xffff; } if(localsleep < MIN_SLEEP) localsleep = MIN_SLEEP; call Timer.start(call Random.rand16()); }; command uint16_t LowPowerListening.getLocalSleepInterval() { return call Sleeptime.getLocalSleeptime() / 32; }; command void LowPowerListening.setLocalDutyCycle(uint16_t dutyCycle) { call LowPowerListening.setLocalSleepInterval(dutyCycle * ON_TIME); }; command uint16_t LowPowerListening.getLocalDutyCycle() { return call LowPowerListening.getLocalSleepInterval() / ON_TIME; }; command void LowPowerListening.setRxSleepInterval(message_t *msg, uint16_t sleepIntervalMs) { uint16_t rsleep; if(sleepIntervalMs < 0x7FF) { rsleep = (sleepIntervalMs * 32); } else { rsleep = 0xffffU; } if(rsleep < MIN_SLEEP) rsleep = MIN_SLEEP; call Sleeptime.setNetworkSleeptime(rsleep); }; command uint16_t LowPowerListening.getRxSleepInterval(message_t *msg) { return call Sleeptime.getNetworkSleeptime() / 32; } command void LowPowerListening.setRxDutyCycle(message_t *msg, uint16_t dutyCycle) { call LowPowerListening.setRxSleepInterval(msg, dutyCycle * ON_TIME); } command uint16_t LowPowerListening.getRxDutyCycle(message_t *msg) { return call LowPowerListening.getRxSleepInterval(msg) / ON_TIME; } command uint16_t LowPowerListening.dutyCycleToSleepInterval(uint16_t dutyCycle) { return dutyCycle * ON_TIME; } command uint16_t LowPowerListening.sleepIntervalToDutyCycle(uint16_t sleepInterval) { return sleepInterval / ON_TIME; } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/PacketStampC.nc000066400000000000000000000044621207233610700227600ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ configuration PacketStampC { provides { interface TimeSyncPacket as TimeSyncPacket32khz; interface PacketTimeStamp as PacketTimeStamp32khz; interface TimeSyncPacket as TimeSyncPacketMilli; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components PacketStampP as PS; components LocalTimeC as LT; components HilTimerMilliC as HilMilli; PacketTimeStamp32khz = PS; TimeSyncPacket32khz = PS; PacketTimeStampMilli = PS; TimeSyncPacketMilli = PS; PS.LocalTime32khz -> LT; PS.LocalTimeMilli -> HilMilli; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/PacketStampP.nc000066400000000000000000000100641207233610700227700ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "radiopacketfunctions.h" module PacketStampP { provides { interface PacketTimeStamp as PacketTimeStamp32khz; interface TimeSyncPacket as TimeSyncPacket32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncPacket as TimeSyncPacketMilli; } uses { interface LocalTime as LocalTimeMilli; interface LocalTime as LocalTime32khz; } } implementation { // 32 kHz interface // get the time when SFD event was generated async command uint32_t PacketTimeStamp32khz.timestamp(message_t* msg) { return getMetadata(msg)->sfdtime; } // set the time when SFD event was generated? async command void PacketTimeStamp32khz.set(message_t* msg, uint32_t value) { getMetadata(msg)->sfdtime = value; } // return time when event was generated at the source command uint32_t TimeSyncPacket32khz.eventTime(message_t* msg) { return getMetadata(msg)->time; }; // Milli interface // get the time when SFD was send/received async command uint32_t PacketTimeStampMilli.timestamp(message_t* msg) { return call LocalTimeMilli.get() - (call LocalTime32khz.get() - getMetadata(msg)->sfdtime)/32; } // set the time when SFD was send/received? async command void PacketTimeStampMilli.set(message_t* msg, uint32_t value) { getMetadata(msg)->sfdtime = call LocalTime32khz.get() - (call LocalTimeMilli.get() - value)*32; } // return time when event was generated command uint32_t TimeSyncPacketMilli.eventTime(message_t* msg) { return call LocalTimeMilli.get() - (call LocalTime32khz.get() - getMetadata(msg)->time)/32; }; // not really supported functions, valid section command bool TimeSyncPacket32khz.isValid(message_t* msg) { return TRUE; } command bool TimeSyncPacketMilli.isValid(message_t* msg) { return TRUE; } async command bool PacketTimeStamp32khz.isValid(message_t* msg) { return TRUE; } async command bool PacketTimeStampMilli.isValid(message_t* msg) { return TRUE; } // not really supported functions, clear section async command void PacketTimeStamp32khz.clear(message_t* msg) { } async command void PacketTimeStampMilli.clear(message_t* msg) { } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/PlatformC.nc000066400000000000000000000036261207233610700223310ustar00rootroot00000000000000// $Id: PlatformC.nc,v 1.5 2010-06-29 22:07:53 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre and Cory Sharp */ #include "hardware.h" configuration PlatformC { provides interface Init; } implementation { components PlatformP , Msp430ClockC ; Init = PlatformP; PlatformP.Msp430ClockInit -> Msp430ClockC.Init; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/PlatformLedsC.nc000066400000000000000000000047251207233610700231420ustar00rootroot00000000000000// $Id: PlatformLedsC.nc,v 1.5 2010-06-29 22:07:53 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre * @author Vlado Handziski (modifications for eyesIFX) */ #include "hardware.h" configuration PlatformLedsC { provides interface GeneralIO as Led0; provides interface GeneralIO as Led1; provides interface GeneralIO as Led2; provides interface GeneralIO as Led3; uses interface Init; } implementation { components HplMsp430GeneralIOC , new Msp430GpioC() as Led0Impl , new Msp430GpioC() as Led1Impl , new Msp430GpioC() as Led2Impl , new Msp430GpioC() as Led3Impl ; components PlatformP; Init = PlatformP.LedsInit; Led0 = Led0Impl; Led0Impl -> HplMsp430GeneralIOC.Port50; Led1 = Led1Impl; Led1Impl -> HplMsp430GeneralIOC.Port51; Led2 = Led2Impl; Led2Impl -> HplMsp430GeneralIOC.Port52; Led3 = Led3Impl; Led3Impl -> HplMsp430GeneralIOC.Port53; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/PlatformP.nc000066400000000000000000000005671207233610700223470ustar00rootroot00000000000000#include "hardware.h" module PlatformP{ provides interface Init; uses interface Init as Msp430ClockInit; uses interface Init as LedsInit; } implementation { command error_t Init.init() { call Msp430ClockInit.init(); TOSH_SET_PIN_DIRECTIONS(); call LedsInit.init(); return SUCCESS; } default command error_t LedsInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/PlatformSerialC.nc000066400000000000000000000005271207233610700234660ustar00rootroot00000000000000configuration PlatformSerialC { provides interface StdControl; provides interface UartStream; } implementation { components new Msp430Uart1C() as UartC, eyesIFXSerialP; UartStream = UartC; StdControl = eyesIFXSerialP; eyesIFXSerialP.Msp430UartConfigure <- UartC.Msp430UartConfigure; eyesIFXSerialP.Resource -> UartC.Resource; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/RadioDataLinkC.nc000066400000000000000000000101661207233610700232100ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * provides preamble sampling csma with timestamping * - Revision ------------------------------------------------------------- * $Revision: 1.9 $ * $Date: 2010-01-24 23:02:37 $ * @author: Kevin Klues (klues@tkn.tu-berlin.de) * ======================================================================== */ configuration RadioDataLinkC { provides { interface SplitControl; interface Send; interface Receive; interface Packet; interface PacketAcknowledgements; } } implementation { components //Change components below as desired Tda5250RadioC as Radio, //The actual Tda5250 radio over which data is receives/transmitted #ifdef PHY_MANCHESTER UartManchPhyC as UartPhy, #else Uart4b6bPhyC as UartPhy, //The UartPhy turns Bits into Bytes #endif PacketSerializerP as PacketSerializer, //The PacketSerializer turns Bytes into Packets #ifdef MAC_REDMAC RedMacC as Mac, //The MAC protocol to use #elif defined(MAC_SPECKMACD) SpeckMacDC as Mac, //The MAC protocol to use #else CsmaMacC as Mac, //The MAC protocol to use #endif LinkLayerC as Llc; //The Link Layer Control module to use //Don't change wirings below this point, just change which components //They are compposed of in the list above SplitControl = Llc; Llc.MacSplitControl -> Mac.SplitControl; Llc.RadioSplitControl -> Radio.SplitControl; Send = Llc.Send; Receive = Llc.Receive; PacketAcknowledgements = Llc; Packet = Mac; Llc.SendDown->Mac.MacSend; Llc.ReceiveLower->Mac.MacReceive; Llc.Packet->Mac.Packet; Mac.SubPacket->PacketSerializer.Packet; Mac.PacketSend->PacketSerializer.PhySend; Mac.PacketReceive->PacketSerializer.PhyReceive; Mac.Tda5250Control->Radio; Mac.UartPhyControl -> UartPhy; Mac.RadioTimeStamping -> PacketSerializer.RadioTimeStamping; PacketSerializer.RadioByteComm -> UartPhy.SerializerRadioByteComm; PacketSerializer.PhyPacketTx -> UartPhy.PhyPacketTx; PacketSerializer.PhyPacketRx -> UartPhy.PhyPacketRx; UartPhy.RadioByteComm -> Radio.RadioByteComm; #ifndef RADIO_UART_VCO components SmclkManagerC; #endif #ifdef PACKETSERIALIZER_DEBUG components new SerialDebugC() as SD; PacketSerializer.SerialDebug -> SD; #endif } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/SmclkManagerC.nc000066400000000000000000000037011207233610700231030ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Revision: 1.2 $ * $Date: 2007-03-10 22:03:48 $ */ /** * * @author: Andreas Koepke */ configuration SmclkManagerC { } implementation { components SmclkManagerP; components MainC; SmclkManagerP.Boot -> MainC; components Tda5250RadioC; SmclkManagerP.ClkDiv -> Tda5250RadioC; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/SmclkManagerP.nc000066400000000000000000000044351207233610700231250ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Revision: 1.2 $ * $Date: 2007-03-10 22:03:48 $ */ /** * * @author: Andreas Koepke */ module SmclkManagerP { uses { interface Boot; interface ClkDiv; } } implementation { event void Boot.booted() { ; } async event void ClkDiv.startDone() { atomic { BCSCTL1 &= ~XT2OFF; BCSCTL2 = SELS; } } async event void ClkDiv.stopping() { uint16_t sr; atomic { BCSCTL1 |= XT2OFF; BCSCTL2 = DIVS1; sr = READ_SR; sr &= ~SR_SCG1; __asm__ __volatile__( "bis %0, r2" : : "m" (sr) ); } } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/TimeSyncMessageC.nc000066400000000000000000000053501207233610700236010ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Expose the time sync capabilities of the eyesIFX platform */ configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface TimeSyncAMSend as TimeSyncAMSend32khz[am_id_t id]; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components TimeSyncMessageP as TS; components ActiveMessageC as AM; components PacketStampC as PS; SplitControl = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; TS.SubSend -> AM.AMSend; TS.AMPacket -> AM.AMPacket; TS.PacketTimeStamp32khz -> PS; TS.PacketTimeStampMilli -> PS; TimeSyncAMSend32khz = TS; TimeSyncAMSendMilli = TS; TimeSyncPacket32khz = TS; TimeSyncPacketMilli = TS; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/TimeSyncMessageP.nc000066400000000000000000000122611207233610700236150ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Expose the time sync capabilities of the eyesIFX platform */ module TimeSyncMessageP { provides { interface TimeSyncAMSend as TimeSyncAMSend32khz[am_id_t id]; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } uses { interface AMSend as SubSend[am_id_t id]; interface AMPacket; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { typedef enum { NONE, RES_32_K, RES_1_K } resolution_t; resolution_t resolution = NONE; command error_t TimeSyncAMSend32khz.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len, uint32_t event_time) { call PacketTimeStamp32khz.set(msg, event_time); resolution = RES_32_K; return call SubSend.send[id](addr, msg, len); } command error_t TimeSyncAMSend32khz.cancel[am_id_t id](message_t* msg) { return call SubSend.cancel[id](msg); } command uint8_t TimeSyncAMSend32khz.maxPayloadLength[am_id_t id]() { return call SubSend.maxPayloadLength[id](); } command void* TimeSyncAMSend32khz.getPayload[am_id_t id](message_t* m, uint8_t len) { return call SubSend.getPayload[id](m, len); } command bool TimeSyncPacket32khz.isValid(message_t* msg) { return call PacketTimeStamp32khz.isValid(msg); } command uint32_t TimeSyncPacket32khz.eventTime(message_t* msg) { return call PacketTimeStamp32khz.timestamp(msg); }; command error_t TimeSyncAMSendMilli.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len, uint32_t event_time) { call PacketTimeStampMilli.set(msg, event_time); resolution = RES_1_K; return call SubSend.send[id](addr, msg, len); } command error_t TimeSyncAMSendMilli.cancel[am_id_t id](message_t* msg) { return call SubSend.cancel[id](msg); } command uint8_t TimeSyncAMSendMilli.maxPayloadLength[am_id_t id]() { return call SubSend.maxPayloadLength[id](); } command void* TimeSyncAMSendMilli.getPayload[am_id_t id](message_t* m, uint8_t len) { return call SubSend.getPayload[id](m, len); } command bool TimeSyncPacketMilli.isValid(message_t* msg) { return call PacketTimeStamp32khz.isValid(msg); } command uint32_t TimeSyncPacketMilli.eventTime(message_t* msg) { return call PacketTimeStampMilli.timestamp(msg); }; event void SubSend.sendDone[uint8_t id](message_t* msg, error_t result) { if(resolution == RES_32_K) { signal TimeSyncAMSend32khz.sendDone[id](msg, result); } else { signal TimeSyncAMSendMilli.sendDone[id](msg, result); } } default event void TimeSyncAMSend32khz.sendDone[uint8_t id](message_t* msg, error_t err) { return; } default event void TimeSyncAMSendMilli.sendDone[uint8_t id](message_t* msg, error_t err) { return; } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/WhiteBitAccessorC.nc000066400000000000000000000040521207233610700237410ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Accessor module for link quality * * @author Andreas Koepke */ #include "radiopacketfunctions.h" module WhiteBitAccessorC { provides { interface LinkPacketMetadata; } } implementation { async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) { bool res = FALSE; if(getMetadata(msg)->strength > 13) res = TRUE; return res; } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/WideLocalTime.nc000066400000000000000000000037331207233610700231230ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A wide version of the localtime interface, 32 bit are too narrow */ #include "Timer.h" interface WideLocalTime { /** * Return current time. Time starts counting at boot - some time sources * may stop counting while the processor is in low-power mode. * * @return Current time. */ async command int64_t get(); } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/byte_radio/000077500000000000000000000000001207233610700222325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/byte_radio/RssiFixedThresholdCMC.nc000066400000000000000000000055161207233610700266630ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Configuration for the fixed Rssi Threshold module. * * @author: Kevin Klues (klues@tkn.tu-berlin.de) * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) */ // #define RSSI_FIXED_DEBUG configuration RssiFixedThresholdCMC { provides { interface StdControl; interface ChannelMonitor; interface ChannelMonitorControl; interface ChannelMonitorData; interface BatteryLevel; interface Resource as RssiAdcResource; } } implementation { components RssiFixedThresholdCMP, new RssiSensorVccC() as Rssi, new BatteryLevelSensorC() as Voltage, new TimerMilliC() as Timer, MainC; MainC.SoftwareInit -> RssiFixedThresholdCMP; StdControl = RssiFixedThresholdCMP; RssiAdcResource = Rssi; RssiFixedThresholdCMP.Rssi -> Rssi; RssiFixedThresholdCMP.Voltage -> Voltage; ChannelMonitor = RssiFixedThresholdCMP; ChannelMonitorControl = RssiFixedThresholdCMP; ChannelMonitorData = RssiFixedThresholdCMP; BatteryLevel = RssiFixedThresholdCMP; RssiFixedThresholdCMP.Timer -> Timer; #ifdef RSSI_FIXED_DEBUG components new SerialDebugC() as SD; RssiFixedThresholdCMP.SerialDebug -> SD; #endif } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/byte_radio/RssiFixedThresholdCMP.nc000066400000000000000000000310171207233610700266730ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2008-08-14 13:14:09 $ * @author: Kevin Klues (klues@tkn.tu-berlin.de) * @author: Philipp Huppertz (huppertz@tkn.tu-berlin.de) * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) * ======================================================================== */ includes shellsort; module RssiFixedThresholdCMP { provides { interface Init; interface StdControl; interface ChannelMonitor; interface ChannelMonitorControl; interface ChannelMonitorData; interface BatteryLevel; } uses { interface ReadNow as Rssi; interface Read as Voltage; interface Timer as Timer; #ifdef RSSI_FIXED_DEBUG interface SerialDebug; #endif } } implementation { #ifdef RSSI_FIXED_DEBUG void sdDebug(uint16_t p) { call SerialDebug.putPlace(p); } #else void sdDebug(uint16_t p) {}; #endif /* Measure internal voltage every 20s */ #define VOLTAGE_SAMPLE_INTERVALL 20000 /* * Number of samples for noisefloor estimation * Actually the size of the array for the median */ #define NSAMPLES 5 /* * If the channel is seen more then DEADLOCK times * in a row busy, update noisefloor nonetheless. */ #define DEADLOCK 10 /* * Initital noisefloor from data sheet ca. 350mV * Seems to depend on many things, usually values around * 250 mV are observed for the eyesIFXv2 node, but 450 has also * been measured as noise floor. It is also not stable, depending * on the placement of the node (USB cable shielding!) */ #define NOISE_FLOOR 480 // raw value compared to 3V // mu + 3*sigma -> rare event, outlier? #define THREE_SIGMA 145 // 75 mV measured against 3V Vcc #define INITIAL_BUSY_DELTA 100 // 3000/2 mV measured against 2.5V Ref #define INITIAL_BATTERY_LEVEL 2457 /*** calibration stuff *************************/ #define UPDATE_NF_RUNS 10 #define MINIMUM_POSITION 0 #define RSSI_SAMPLE_INTERVALL 20 // it makes no sense to check the channel too often /*** variable type definitions ******************/ typedef enum { VOID, CALIBRATE, // update noisefloor IDLE, // noisefloor up to date, nothing is currently attempted CCA, // in clear channel assessment SNR // measureing SNR } state_t; /**************** Variables *******************/ state_t state; // what we try to do int16_t gradient; // how to convert mV to dB in mV/dB uint16_t noisefloor; // [raw value against Vcc] uint16_t batteryLevel; // [raw value against 2.5V ref] /* if the rssi value exceeds noisefloor + busyDelta * the channel is busy */ uint16_t busyDelta; // [raw value against Vcc] // noise floor estimation uint16_t rssisamples[NSAMPLES]; uint8_t rssiindex; // deadlock protection counter uint8_t deadlockCounter; // last rssi reading uint16_t rssi; // rssi in [mV] /**************** Tasks *******************/ task void UpdateNoiseFloorTask(); // task void GetChannelStateTask(); task void SnrReadyTask(); task void CalibrateNoiseFloorTask(); // task void GetSnrTask(); task void CalibrateTask(); task void GetVoltageTask(); /***************** Helper function *************/ int16_t computeSNR(uint16_t r) { uint32_t delta; uint16_t snr; if(r > noisefloor) { delta = r - noisefloor; // speedily cacluate // (2*batteryLevel*2500mV*delta)/(4095*4095*gradient) snr = ((((uint32_t)batteryLevel*39)>>5)*delta>>12)/gradient; } else { snr = 0; } return snr; } /**************** Init *******************/ command error_t Init.init() { atomic { noisefloor = NOISE_FLOOR; rssiindex = 0; batteryLevel = INITIAL_BATTERY_LEVEL; busyDelta = INITIAL_BUSY_DELTA; state = VOID; gradient = 14; // gradient of TDA5250 /* call Led3.makeOutput(); call Led3.clr(); */ } #ifdef RSSI_FIXED_DEBUG call SerialDebug.putShortDesc("Rssi"); #endif return SUCCESS; } /**************** StdControl *******************/ command error_t StdControl.start() { return post GetVoltageTask(); } command error_t StdControl.stop() { call Timer.stop(); return SUCCESS; } /**************** RSSI *******************/ inline void addSample(uint16_t data) { if(rssiindex < NSAMPLES) rssisamples[rssiindex++] = data; deadlockCounter = 0; if(rssiindex >= NSAMPLES) post UpdateNoiseFloorTask(); } error_t rssiRead() { return call Rssi.read(); } async event void Rssi.readDone(error_t result, uint16_t data) { switch(state) { case CCA: state = IDLE; if(data < noisefloor + busyDelta) { signal ChannelMonitor.channelIdle(); addSample(data); } else { signal ChannelMonitor.channelBusy(); if(++deadlockCounter >= DEADLOCK) addSample(data); } break; case SNR: rssi = data; post SnrReadyTask(); break; case CALIBRATE: rssi = data; post CalibrateNoiseFloorTask(); break; default: break; } } /**************** Voltage *******************/ void readVoltage() { if(call Voltage.read() != SUCCESS) post GetVoltageTask(); } task void GetVoltageTask() { readVoltage(); } event void Voltage.readDone(error_t result, uint16_t data) { uint16_t nbl; int16_t d; uint16_t nbD; uint16_t bD; if(result == SUCCESS) { nbl = (data + batteryLevel)>>1; atomic bD = busyDelta; d = batteryLevel - nbl; sdDebug(10000 + batteryLevel); sdDebug(20000 + data); sdDebug(30000 + nbl); sdDebug(40000U + busyDelta); if(d > 75 || d < -75) { // recalculate busyDelta, // noisefloor already adapted by floating nbD = ((uint32_t)batteryLevel*(uint32_t)busyDelta)/(uint32_t)nbl; atomic busyDelta = nbD; batteryLevel = nbl; } sdDebug(50000U + busyDelta); } else { post GetVoltageTask(); } } /**************** ChannelMonitor *******************/ async command error_t ChannelMonitor.start() { error_t res = FAIL; atomic { if(state == IDLE) { res = rssiRead(); if(res == SUCCESS) state = CCA; } else if(state == CCA) { res = SUCCESS; } } return res; } async command void ChannelMonitor.rxSuccess() { atomic { if((deadlockCounter > 0) && (deadlockCounter < DEADLOCK)) { --deadlockCounter; } } } task void UpdateNoiseFloorTask() { shellsort(rssisamples,NSAMPLES); atomic { noisefloor = (5*noisefloor + rssisamples[NSAMPLES/2] + 3)/6; rssiindex = 0; } sdDebug(60000U + noisefloor); } /**************** ChannelMonitorControl ************/ command async error_t ChannelMonitorControl.updateNoiseFloor() { return post CalibrateTask(); } task void CalibrateTask() { atomic { if((state != IDLE) && (state != VOID)) { post CalibrateTask(); } else { state = CALIBRATE; deadlockCounter = 0; call Timer.stop(); call Timer.startPeriodic(RSSI_SAMPLE_INTERVALL); } } } task void CalibrateNoiseFloorTask() { atomic { if(rssiindex < NSAMPLES) { rssisamples[rssiindex++] = rssi; } else { shellsort(rssisamples,NSAMPLES); if(rssisamples[MINIMUM_POSITION] < noisefloor + THREE_SIGMA) { noisefloor = (7*noisefloor + rssisamples[NSAMPLES/2] + 4)/8; ++deadlockCounter; } else { noisefloor += THREE_SIGMA/8; } rssiindex = 0; } if(deadlockCounter > UPDATE_NF_RUNS) { state = IDLE; deadlockCounter = 0; call Timer.stop(); call Timer.startPeriodic(VOLTAGE_SAMPLE_INTERVALL); signal ChannelMonitorControl.updateNoiseFloorDone(); } } } event void Timer.fired() { state_t s; atomic s = state; if(s != CALIBRATE) { readVoltage(); } else { rssiRead(); } } /**************** ChannelMonitorData ************/ async command void ChannelMonitorData.setGradient(int16_t grad) { // needed to convert RSSI into dB atomic gradient = grad; } async command int16_t ChannelMonitorData.getGradient() { int16_t v; atomic v = gradient; return v; } async command uint16_t ChannelMonitorData.getNoiseFloor() { uint16_t v; atomic v = noisefloor; return v; } async command error_t ChannelMonitorData.getSnr() { error_t res = FAIL; atomic { if(state == IDLE) { res = rssiRead(); if(res == SUCCESS) state = SNR; } else if(state == SNR) { res = SUCCESS; } } return res; } task void SnrReadyTask() { int16_t snr; state_t s; uint16_t r; atomic { r = rssi; s = state; if(state == SNR) state = IDLE; } if(s == SNR) { snr = computeSNR(r); signal ChannelMonitorData.getSnrDone(snr); } } async command uint16_t ChannelMonitorData.readSnr() { uint16_t rval; if(rssi > noisefloor) { rval = (rssi-noisefloor)>>4; } else { rval = 3; } return rval; } default async event void ChannelMonitorData.getSnrDone(int16_t snr) { } /***** BatteryLevel ***************/ // get the batterylevel in mV async command uint16_t BatteryLevel.getLevel() { uint16_t l; atomic l = batteryLevel; return (uint32_t)(l+3)*6/5; } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/byte_radio/Uart4b6bPhyC.nc000066400000000000000000000051051207233610700247320ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Configuration for the byte radio physical layer. Together with the * PacketSerializerP the UartPhyP module turns byte streams into packets. * This one 4b6b encodes/decodes a byte stream * * @see PacketSerializerP * * @author Philipp Huppertz */ configuration Uart4b6bPhyC { provides{ interface PhyPacketTx; interface RadioByteComm as SerializerRadioByteComm; interface PhyPacketRx; interface UartPhyControl; } uses { interface RadioByteComm; } } implementation { components new Alarm32khz16C() as RxByteTimer, Uart4b6bPhyP, MainC; MainC.SoftwareInit -> Uart4b6bPhyP; PhyPacketRx = Uart4b6bPhyP; SerializerRadioByteComm = Uart4b6bPhyP; RadioByteComm = Uart4b6bPhyP; PhyPacketTx = Uart4b6bPhyP; UartPhyControl = Uart4b6bPhyP; Uart4b6bPhyP.RxByteTimer -> RxByteTimer; #ifdef UART_DEBUG components new SerialDebugC() as SD; Uart4b6bPhyP.SerialDebug -> SD; #endif } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/byte_radio/Uart4b6bPhyP.nc000066400000000000000000000334601207233610700247540ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "code4b6b.h" /** * Implementation of the physical layer for the eyesIFX byte radio. * Together with the PacketSerializerP this module turns byte streams * into packets. * * @author Andreas Koepke */ module Uart4b6bPhyP { provides { interface Init; interface PhyPacketTx; interface RadioByteComm as SerializerRadioByteComm; interface PhyPacketRx; interface UartPhyControl; } uses { interface RadioByteComm; interface Alarm as RxByteTimer; #ifdef UART_DEBUG interface SerialDebug; #endif } } implementation { #ifdef UART_DEBUG void sdDebug(uint16_t p) { call SerialDebug.putPlace(p); } #else void sdDebug(uint16_t p) {}; #endif /* Module Definitions */ typedef enum { STATE_PREAMBLE, STATE_PREAMBLE_CODE, STATE_SYNC, STATE_SFD1, STATE_SFD2, STATE_SFD3, STATE_HEADER_DONE, STATE_DATA_HIGH_OR_SFD, STATE_DATA_HIGH, STATE_DATA_MIDDLE, STATE_DATA_LOW, STATE_DATA_LOW_FOOTER, STATE_FOOTER_START, STATE_FOOTER_DONE } phyState_t; /* constants */ enum { PREAMBLE_LENGTH=2, BYTE_TIME=TDA5250_32KHZ_BYTE_TIME+3, PREAMBLE_BYTE=0x55, SYNC_BYTE=0xFF, SFD_BYTE=0x83, SFD_BYTE2=0x7c }; /** Module Global Variables */ phyState_t phyState; // Current Phy state State uint16_t preambleCount; uint16_t numPreambles; // Number of preambles to send before the packet uint8_t byteTime; // max. time between two bytes uint8_t bufByte; /* Local Function Declarations */ void TransmitNextByte(); void ReceiveNextByte(uint8_t data); /* Radio Init */ command error_t Init.init(){ atomic { phyState = STATE_PREAMBLE; numPreambles = PREAMBLE_LENGTH; byteTime = BYTE_TIME; } #ifdef UART_DEBUG call SerialDebug.putShortDesc("U4b6bP"); #endif return SUCCESS; } async command error_t UartPhyControl.setNumPreambles(uint16_t numPreambleBytes) { atomic { numPreambles = numPreambleBytes; } return SUCCESS; } command error_t UartPhyControl.setByteTimeout(uint8_t byteTimeout) { if (call RxByteTimer.isRunning() == TRUE) { return FAIL; } else { byteTime = byteTimeout * 33; return SUCCESS; } } async command bool UartPhyControl.isBusy() { return phyState != STATE_PREAMBLE; } void resetState() { call RxByteTimer.stop(); if(phyState >= STATE_DATA_HIGH) { signal PhyPacketRx.recvFooterDone(FAIL); sdDebug(10); } phyState = STATE_PREAMBLE; } async event void RxByteTimer.fired() { // no bytes have arrived, so... resetState(); } async command void PhyPacketTx.sendHeader() { phyState = STATE_PREAMBLE; preambleCount = numPreambles; TransmitNextByte(); } async command void SerializerRadioByteComm.txByte(uint8_t data) { uint8_t high = nibbleToSixBit[(data & 0xf0) >> 4]; uint8_t low = nibbleToSixBit[data & 0x0f]; if(phyState == STATE_DATA_HIGH) { high <<= 2; if(low & 0x20) high |= 2; if(low & 0x10) high |= 1; bufByte = low << 4; call RadioByteComm.txByte(high); phyState = STATE_DATA_MIDDLE; } else { call RadioByteComm.txByte(bufByte | (high >> 2)); if(high & 0x02) low |= 0x80; if(high & 0x01) low |= 0x40; bufByte = low; phyState = STATE_DATA_LOW; } } async command bool SerializerRadioByteComm.isTxDone() { return call RadioByteComm.isTxDone(); } async command void PhyPacketTx.sendFooter() { if(phyState == STATE_DATA_MIDDLE) { bufByte |= (nibbleToSixBit[0] >> 2); phyState = STATE_DATA_LOW_FOOTER; call RadioByteComm.txByte(bufByte); } else { phyState = STATE_FOOTER_START; TransmitNextByte(); } } /* Radio Recv */ async command void PhyPacketRx.recvFooter() { // currently there is no footer // atomic phyState = STATE_FOOTER_START; phyState = STATE_PREAMBLE; call RxByteTimer.stop(); signal PhyPacketRx.recvFooterDone(SUCCESS); sdDebug(20); } /* Tx Done */ async event void RadioByteComm.txByteReady(error_t error) { if(error == SUCCESS) { TransmitNextByte(); } else { signal SerializerRadioByteComm.txByteReady(error); phyState = STATE_PREAMBLE; } } void TransmitNextByte() { switch(phyState) { case STATE_PREAMBLE: if(preambleCount > 1) { preambleCount--; } else { phyState = STATE_SYNC; } call RadioByteComm.txByte(PREAMBLE_BYTE); break; case STATE_SYNC: phyState = STATE_SFD1; call RadioByteComm.txByte(SYNC_BYTE); break; case STATE_SFD1: phyState = STATE_SFD2; call RadioByteComm.txByte(SFD_BYTE); break; case STATE_SFD2: phyState = STATE_SFD3; call RadioByteComm.txByte(SFD_BYTE); break; case STATE_SFD3: phyState = STATE_HEADER_DONE; call RadioByteComm.txByte(SFD_BYTE); break; case STATE_HEADER_DONE: phyState = STATE_DATA_HIGH; signal PhyPacketTx.sendHeaderDone(); break; case STATE_DATA_HIGH: signal SerializerRadioByteComm.txByteReady(SUCCESS); break; case STATE_DATA_MIDDLE: signal SerializerRadioByteComm.txByteReady(SUCCESS); break; case STATE_DATA_LOW: call RadioByteComm.txByte(bufByte); phyState = STATE_DATA_HIGH; break; case STATE_DATA_LOW_FOOTER: phyState = STATE_FOOTER_START; call RadioByteComm.txByte(bufByte); break; case STATE_FOOTER_START: /* Pseudo-Footer: the MSP430 has two buffers: one for * transmit, one to store the next byte to be transmitted, * this footer fills the next-to-transmit buffer, to make * sure that the last real byte is actually * transmitted. The byte stored by this call may not be * transmitted fully or not at all. */ phyState = STATE_FOOTER_DONE; call RadioByteComm.txByte(bufByte); break; case STATE_FOOTER_DONE: phyState = STATE_PREAMBLE; signal PhyPacketTx.sendFooterDone(); break; default: break; } } /* Rx Done */ async event void RadioByteComm.rxByteReady(uint8_t data) { uint8_t decodedByte; uint8_t low; uint8_t high; if((data == SFD_BYTE) && (phyState != STATE_SFD2) && (phyState != STATE_DATA_HIGH_OR_SFD)) { resetState(); phyState = STATE_SFD2; call RxByteTimer.start(byteTime<<1); } else { switch(phyState) { case STATE_SFD2: if(data == SFD_BYTE) { phyState = STATE_DATA_HIGH_OR_SFD; call RxByteTimer.start(byteTime << 1); } else { resetState(); } break; case STATE_DATA_HIGH_OR_SFD: if(data != SFD_BYTE) { decodedByte = sixBitToNibble[data >> 2]; if(decodedByte != ILLEGAL_CODE) { bufByte = decodedByte << 2; bufByte |= data & 0x03; bufByte <<= 2; phyState = STATE_DATA_MIDDLE; call RxByteTimer.stop(); signal PhyPacketRx.recvHeaderDone(SUCCESS); call RxByteTimer.start(byteTime); } else { resetState(); } } else { phyState = STATE_DATA_HIGH; call RxByteTimer.stop(); signal PhyPacketRx.recvHeaderDone(SUCCESS); call RxByteTimer.start(byteTime); } break; case STATE_DATA_HIGH: decodedByte = sixBitToNibble[data >> 2]; if(decodedByte != ILLEGAL_CODE) { bufByte = decodedByte << 2; bufByte |= data & 0x03; bufByte <<= 2; phyState = STATE_DATA_MIDDLE; call RxByteTimer.start(byteTime); } else { resetState(); } break; case STATE_DATA_MIDDLE: decodedByte = sixBitToNibble[((bufByte & 0x0f)<<2) | (data >> 4)]; if(decodedByte != ILLEGAL_CODE) { phyState = STATE_DATA_LOW; call RxByteTimer.stop(); signal SerializerRadioByteComm.rxByteReady((bufByte & 0xf0) | decodedByte); bufByte = (data & 0x0f) << 2; call RxByteTimer.start(byteTime); } else { resetState(); } break; case STATE_DATA_LOW: decodedByte = sixBitToNibble[bufByte | (data >> 6)]; if(decodedByte != ILLEGAL_CODE) { bufByte = (decodedByte << 4); decodedByte = sixBitToNibble[data & 0x3f]; if(decodedByte != ILLEGAL_CODE) { phyState = STATE_DATA_HIGH; call RxByteTimer.stop(); signal SerializerRadioByteComm.rxByteReady(bufByte | decodedByte); call RxByteTimer.start(byteTime); } else { resetState(); } } else { resetState(); } break; case STATE_PREAMBLE: low = data & 0xf; high = data >> 4; if((low > 0) && (low < 0xf) && (high > 0) && (high < 0xf)) { phyState = STATE_PREAMBLE_CODE; call RxByteTimer.start(byteTime); } break; case STATE_PREAMBLE_CODE: low = data & 0xf; high = data >> 4; if((low == 0) || (low == 0xf) || (high == 0) || (high == 0xf)) { phyState = STATE_PREAMBLE; } else { call RxByteTimer.start(byteTime); } break; // maybe there will be a time.... we will need this. but for now there is no footer //case STATE_FOOTER_START: //phyState = STATE_FOOTER_DONE; //break; //case STATE_FOOTER_DONE: //phyState = STATE_NULL; //signal PhyPacketRx.recvFooterDone(TRUE); //break; default: break; } } } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/byte_radio/UartManchPhyC.nc000066400000000000000000000055251207233610700252310ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:41 $ * @author: Philipp Huppertz * ======================================================================== */ /** * Configuration for the byte radio physical layer. Together with the * PacketSerializerP the UartPhyP module turns byte streams into packets. * * @see PacketSerializerP * * @author Philipp Huppertz */ configuration UartManchPhyC { provides{ interface PhyPacketTx; interface RadioByteComm as SerializerRadioByteComm; interface PhyPacketRx; interface UartPhyControl; } uses { interface RadioByteComm; } } implementation { components new Alarm32khz16C() as RxByteTimer, UartManchPhyP, // PlatformLedsC, MainC; MainC.SoftwareInit -> UartManchPhyP; PhyPacketRx = UartManchPhyP; SerializerRadioByteComm = UartManchPhyP; RadioByteComm = UartManchPhyP; PhyPacketTx = UartManchPhyP; UartPhyControl = UartManchPhyP; UartManchPhyP.RxByteTimer -> RxByteTimer; // PlatformLedsC.Led0 <- UartManchPhyP.Led0; // PlatformLedsC.Led1 <- UartManchPhyP.Led1; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/byte_radio/UartManchPhyP.nc000066400000000000000000000264571207233610700252550ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * * - Revision ------------------------------------------------------------- * $Revision: 1.8 $ * $Date: 2008-03-05 11:20:43 $ * @author: Kevin Klues (klues@tkn.tu-berlin.de) * @author: Philipp Huppertz * ======================================================================== */ #include "manchester.h" /** * Implementation of the physical layer for the eyesIFX byte radio. * Together with the PacketSerializerP this module turns byte streams * into packets. * * @author Kevin Klues * @author Philipp Huppertz */ module UartManchPhyP { provides { interface Init; interface PhyPacketTx; interface RadioByteComm as SerializerRadioByteComm; interface PhyPacketRx; interface UartPhyControl; } uses { interface RadioByteComm; interface Alarm as RxByteTimer; } } implementation { /* Module Definitions */ typedef enum { STATE_PREAMBLE, STATE_PREAMBLE_MANCHESTER, STATE_SYNC, STATE_SFD, STATE_HEADER_DONE, STATE_DATA_HIGH, STATE_DATA_LOW, STATE_FOOTER_START, STATE_FOOTER_DONE } phyState_t; #define PREAMBLE_LENGTH 2 #define BYTE_TIME TDA5250_32KHZ_BYTE_TIME+3 #define PREAMBLE_BYTE 0x55 #define SYNC_BYTE 0xFF #define SFD_BYTE 0x50 /** Module Global Variables */ phyState_t phyState; // Current Phy state State uint16_t preambleCount; uint16_t numPreambles; // Number of preambles to send before the packet uint8_t byteTime; // max. time between two bytes uint8_t bufByte; /* Local Function Declarations */ void TransmitNextByte(); void ReceiveNextByte(uint8_t data); /* Radio Init */ command error_t Init.init(){ atomic { phyState = STATE_PREAMBLE; numPreambles = PREAMBLE_LENGTH; byteTime = BYTE_TIME; } return SUCCESS; } async command error_t UartPhyControl.setNumPreambles(uint16_t numPreambleBytes) { atomic { numPreambles = numPreambleBytes; } return SUCCESS; } command error_t UartPhyControl.setByteTimeout(uint8_t byteTimeout) { if (call RxByteTimer.isRunning() == TRUE) { return FAIL; } else { atomic byteTime = byteTimeout * 33; return SUCCESS; } } async command bool UartPhyControl.isBusy() { return phyState != STATE_PREAMBLE; } void resetState() { atomic { call RxByteTimer.stop(); switch(phyState) { case STATE_SYNC: case STATE_SFD: signal PhyPacketRx.recvHeaderDone(FAIL); break; case STATE_DATA_HIGH: case STATE_DATA_LOW: case STATE_FOOTER_START: signal PhyPacketRx.recvFooterDone(FAIL); break; default: break; } phyState = STATE_PREAMBLE; } } async event void RxByteTimer.fired() { // no bytes have arrived, so... resetState(); } async command void PhyPacketTx.sendHeader() { atomic { phyState = STATE_PREAMBLE; preambleCount = numPreambles; } TransmitNextByte(); } async command void SerializerRadioByteComm.txByte(uint8_t data) { bufByte = data; call RadioByteComm.txByte(manchesterEncodeNibble((bufByte & 0xf0) >> 4)); phyState = STATE_DATA_LOW; } async command bool SerializerRadioByteComm.isTxDone() { return call RadioByteComm.isTxDone(); } async command void PhyPacketTx.sendFooter() { atomic phyState = STATE_FOOTER_START; TransmitNextByte(); } /* Radio Recv */ async command void PhyPacketRx.recvFooter() { // currently there is no footer // atomic phyState = STATE_FOOTER_START; atomic { phyState = STATE_PREAMBLE; } call RxByteTimer.stop(); signal PhyPacketRx.recvFooterDone(SUCCESS); } /* Tx Done */ async event void RadioByteComm.txByteReady(error_t error) { if(error == SUCCESS) { TransmitNextByte(); } else { atomic { signal SerializerRadioByteComm.txByteReady(error); phyState = STATE_PREAMBLE; } } } void TransmitNextByte() { atomic { switch(phyState) { case STATE_PREAMBLE: if(preambleCount > 1) { preambleCount--; } else { phyState = STATE_SYNC; } call RadioByteComm.txByte(PREAMBLE_BYTE); break; case STATE_SYNC: phyState = STATE_SFD; call RadioByteComm.txByte(SYNC_BYTE); break; case STATE_SFD: phyState = STATE_HEADER_DONE; call RadioByteComm.txByte(SFD_BYTE); break; case STATE_HEADER_DONE: phyState = STATE_DATA_HIGH; signal PhyPacketTx.sendHeaderDone(); break; case STATE_DATA_HIGH: signal SerializerRadioByteComm.txByteReady(SUCCESS); break; case STATE_DATA_LOW: call RadioByteComm.txByte(manchesterEncodeNibble(bufByte & 0x0f)); phyState = STATE_DATA_HIGH; break; case STATE_FOOTER_START: /* Pseudo-Footer: the MSP430 has two buffers: one for * transmit, one to store the next byte to be transmitted, * this footer fills the next-to-transmit buffer, to make * sure that the last real byte is actually * transmitted. The byte stored by this call may not be * transmitted fully or not at all. */ phyState = STATE_FOOTER_DONE; call RadioByteComm.txByte(manchesterEncodeNibble(bufByte & 0x0f)); break; case STATE_FOOTER_DONE: phyState = STATE_PREAMBLE; signal PhyPacketTx.sendFooterDone(); break; default: break; } } } /* Rx Done */ async event void RadioByteComm.rxByteReady(uint8_t data) { call RxByteTimer.start(byteTime); ReceiveNextByte(data); } /* Receive the next Byte from the USART */ void ReceiveNextByte(uint8_t data) { uint8_t decodedByte; atomic { switch(phyState) { case STATE_SYNC: if(data != PREAMBLE_BYTE) { if (data == SFD_BYTE) { signal PhyPacketRx.recvHeaderDone(SUCCESS); phyState = STATE_DATA_HIGH; } else { phyState = STATE_SFD; } } break; case STATE_SFD: if (data == SFD_BYTE) { signal PhyPacketRx.recvHeaderDone(SUCCESS); phyState = STATE_DATA_HIGH; } else { phyState = STATE_PREAMBLE; } break; case STATE_PREAMBLE: if(data == PREAMBLE_BYTE) { phyState = STATE_SYNC; } else if(manchesterDecodeByte(data) != 0xff) { phyState = STATE_PREAMBLE_MANCHESTER; } break; case STATE_PREAMBLE_MANCHESTER: if(data == PREAMBLE_BYTE) { phyState = STATE_SYNC; } else if(manchesterDecodeByte(data) == 0xff) { phyState = STATE_PREAMBLE; } break; case STATE_DATA_HIGH: decodedByte = manchesterDecodeByte(data); if(decodedByte != 0xff) { bufByte = decodedByte << 4; phyState = STATE_DATA_LOW; } else { resetState(); } break; case STATE_DATA_LOW: decodedByte = manchesterDecodeByte(data); if(decodedByte != 0xff) { bufByte |= decodedByte; phyState = STATE_DATA_HIGH; signal SerializerRadioByteComm.rxByteReady(bufByte); } else { resetState(); } break; // maybe there will be a time.... we will need this. but for now there is no footer //case STATE_FOOTER_START: //phyState = STATE_FOOTER_DONE; //break; //case STATE_FOOTER_DONE: //phyState = STATE_NULL; //signal PhyPacketRx.recvFooterDone(TRUE); //break; default: break; } } } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/byte_radio/code4b6b.h000066400000000000000000000065231207233610700240010ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * provide functions to encode/decode a 4b 6b stream * @author Andreas Koepke * Book: RF Monolithics, Inc: ASH Transceiver Designer's Guide, Okt 2002. * http://www.rfm.com/products/tr_des24.pdf */ #ifndef CODE_4B_6B_H #define CODE_4B_6B_H enum { ILLEGAL_CODE = 0xff, ENCODED_32KHZ_BYTE_TIME = 3*TDA5250_32KHZ_BYTE_TIME/2 }; const uint8_t nibbleToSixBit[] = { 13, // 001101 14, // 001110 19, // 010011 21, // 010101 22, // 010110 25, // 011001 26, // 011010 28, // 011100 35, // 100011 37, // 100101 38, // 100110 41, // 101001 42, // 101010 44, // 101100 50, // 110010 52 // 110100 }; const uint8_t sixBitToNibble[] = { ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, 0x00, 0x01, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, 0x02, ILLEGAL_CODE, 0x03, 0x04, ILLEGAL_CODE, ILLEGAL_CODE, 0x05, 0x06, ILLEGAL_CODE, 0x07, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, 0x08, ILLEGAL_CODE, 0x09, 0x0a, ILLEGAL_CODE, ILLEGAL_CODE, 0x0b, 0x0c, ILLEGAL_CODE, 0x0d, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, 0x0e, ILLEGAL_CODE, 0x0f, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE, ILLEGAL_CODE }; #endif tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/byte_radio/manchester.h000066400000000000000000000067431207233610700245460ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * provide functions to encode/decode a manchester stream * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2008-03-05 11:14:00 $ * @author Andreas Koepke * ======================================================================== */ enum { ILLEGAL_CODE = 0xff, ENCODED_32KHZ_BYTE_TIME = 2*TDA5250_32KHZ_BYTE_TIME }; const uint8_t nibbleToManchesterByte[] = { 0x55, 0x56, 0x59, 0x5a, 0x65, 0x66, 0x69, 0x6a, 0x95, 0x96, 0x99, 0x9a, 0xa5, 0xa6, 0xa9, 0xaa }; const uint8_t manchesterByteToNibble[] = { 0x0, 0x1, 0xff, 0xff, 0x2, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4, 0x5, 0xff, 0xff, 0x6, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8, 0x9, 0xff, 0xff, 0xa, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, 0xd, 0xff, 0xff, 0xe, 0xf }; uint8_t manchesterEncodeNibble(uint8_t nib) { return nibbleToManchesterByte[nib]; } uint8_t manchesterDecodeByte(uint8_t b) { uint8_t dec; if(b < 0x55) { dec = 0xff; } else if(b > 0xaa) { dec = 0xff; } else { dec = manchesterByteToNibble[b - 0x55]; } return dec; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/000077500000000000000000000000001207233610700212175ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/ad5200/000077500000000000000000000000001207233610700221125ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/ad5200/AD5200PotIOC.nc000066400000000000000000000044651207233610700242560ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:41 $ * ======================================================================== */ /** * Configuration file for using the IO pins to the AD5200 Pot on * the eyesIFX platforms. * * @author Kevin Klues */ configuration AD5200PotIOC { provides interface GeneralIO as AD5200PotENPOT; provides interface GeneralIO as AD5200PotSDPOT; } implementation { components HplMsp430GeneralIOC as MspGeneralIO , new Msp430GpioC() as rENPOT , new Msp430GpioC() as rSDPOT ; AD5200PotENPOT = rENPOT; AD5200PotSDPOT = rSDPOT; rENPOT -> MspGeneralIO.Port24; rSDPOT -> MspGeneralIO.Port23; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/msp430/000077500000000000000000000000001207233610700222455ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/msp430/Msp430DcoSpec.h000066400000000000000000000037751207233610700246610ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Override default dco clock spec. * * SMCLK runs on 1MHz for this platform, its * source may be the radio -- a * more reliable source. * * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) */ #ifndef MS430DCOSPEC_H #define MS430DCOSPEC_H #define TARGET_DCO_KHZ 3926 // the target MCLK clock rate in binary kHz (4 020 000 Hz) #define ACLK_KHZ 32 // the ACLK rate in binary kHz #endif tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/msp430/Msp430Timer32khzMapC.nc000066400000000000000000000064011207233610700262020ustar00rootroot00000000000000//$Id: Msp430Timer32khzMapC.nc,v 1.5 2010-06-29 22:07:53 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ //@author Cory Sharp /* Msp430Timer32khzMapC presents as paramaterized interfaces all of the 32khz hardware timers on the MSP430 that are available for compile time allocation by "new Alarm32khz16C()", "new AlarmMilli32C()", and so on. Platforms based on the Msp430 are encouraged to copy in and override this file, presenting only the hardware timers that are available for allocation on that platform. */ configuration Msp430Timer32khzMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; Msp430Timer[0] = Msp430TimerC.TimerB; Msp430TimerControl[0] = Msp430TimerC.ControlB0; Msp430Compare[0] = Msp430TimerC.CompareB0; Msp430Timer[1] = Msp430TimerC.TimerB; Msp430TimerControl[1] = Msp430TimerC.ControlB1; Msp430Compare[1] = Msp430TimerC.CompareB1; Msp430Timer[2] = Msp430TimerC.TimerB; Msp430TimerControl[2] = Msp430TimerC.ControlB2; Msp430Compare[2] = Msp430TimerC.CompareB2; Msp430Timer[3] = Msp430TimerC.TimerB; Msp430TimerControl[3] = Msp430TimerC.ControlB3; Msp430Compare[3] = Msp430TimerC.CompareB3; Msp430Timer[4] = Msp430TimerC.TimerB; Msp430TimerControl[4] = Msp430TimerC.ControlB4; Msp430Compare[4] = Msp430TimerC.CompareB4; Msp430Timer[5] = Msp430TimerC.TimerB; Msp430TimerControl[5] = Msp430TimerC.ControlB5; Msp430Compare[5] = Msp430TimerC.CompareB5; Msp430Timer[6] = Msp430TimerC.TimerB; Msp430TimerControl[6] = Msp430TimerC.ControlB6; Msp430Compare[6] = Msp430TimerC.CompareB6; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/tda5250/000077500000000000000000000000001207233610700223035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/tda5250/HplTda5250DataIOC.nc000066400000000000000000000045771207233610700254570ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2008-05-22 14:56:33 $ * ======================================================================== */ /** * Wiring the TDA5250 with the Msp430 Uart abstraction. * * @author Philipp Hupertz (huppertz@tkn.tu-berlin.de) */ configuration HplTda5250DataIOC { provides { interface Resource; interface ResourceRequested; interface UartStream; interface HplTda5250DataControl as UartDataControl; } } implementation { components new Msp430Uart0C(), HplTda5250DataIOP; Resource = Msp430Uart0C.Resource; ResourceRequested = Msp430Uart0C.ResourceRequested; UartStream = Msp430Uart0C.UartStream; UartDataControl = HplTda5250DataIOP.UartDataControl; HplTda5250DataIOP.UartResourceConfigure <- Msp430Uart0C.Msp430UartConfigure; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/tda5250/HplTda5250DataIOP.nc000066400000000000000000000051651207233610700254660ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2008-05-22 14:56:33 $ * ======================================================================== */ #include "msp430usart.h" #include "tda5250BusResourceSettings.h" /** * Wrapper module for the Msp430 Uart abstraction. * * @author Philipp Hupertz (huppertz@tkn.tu-berlin.de) */ module HplTda5250DataIOP { provides { interface HplTda5250DataControl as UartDataControl; interface Msp430UartConfigure as UartResourceConfigure; } } implementation { async command error_t UartDataControl.setToTx() { atomic { tda5250_uart_config.uartConfig.utxe = 1; tda5250_uart_config.uartConfig.urxe = 0; } return SUCCESS; } async command error_t UartDataControl.setToRx() { atomic { tda5250_uart_config.uartConfig.utxe = 0; tda5250_uart_config.uartConfig.urxe = 1; } return SUCCESS; } async command msp430_uart_union_config_t* UartResourceConfigure.getConfig() { return &tda5250_uart_config; } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/tda5250/Tda5250ASKNFSKFakePinP.nc000066400000000000000000000010311207233610700262430ustar00rootroot00000000000000/* * The ASKNFSK Pin is not connected on the eyes platforms... */ module Tda5250ASKNFSKFakePinP { provides interface GeneralIO; } implementation { async command void GeneralIO.set(){} async command void GeneralIO.clr(){} async command void GeneralIO.toggle(){} async command bool GeneralIO.get(){ return FALSE; } async command void GeneralIO.makeInput(){} async command bool GeneralIO.isOutput() { return FALSE; } async command void GeneralIO.makeOutput(){} async command bool GeneralIO.isInput() { return FALSE; } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/tda5250/Tda5250RadioIOC.nc000066400000000000000000000056031207233610700251670ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:41 $ * ======================================================================== */ /** * Configuration file for using the IO pins to the TDA5250 Radio on * the eyesIFX platforms. * * @author Kevin Klues */ configuration Tda5250RadioIOC { provides interface GeneralIO as Tda5250RadioPASKNFSK; provides interface GeneralIO as Tda5250RadioBUSM; provides interface GeneralIO as Tda5250RadioENTDA; provides interface GeneralIO as Tda5250RadioTXRX; provides interface GeneralIO as Tda5250RadioDATA; provides interface GeneralIO as Tda5250RadioPWDDD; } implementation { components HplMsp430GeneralIOC as MspGeneralIO , Tda5250ASKNFSKFakePinP , new Msp430GpioC() as rBUSM , new Msp430GpioC() as rENTDA , new Msp430GpioC() as rTXRX , new Msp430GpioC() as rDATA , new Msp430GpioC() as rPWDD ; Tda5250RadioBUSM = rBUSM; Tda5250RadioENTDA = rENTDA; Tda5250RadioTXRX = rTXRX; Tda5250RadioDATA = rDATA; Tda5250RadioPWDDD = rPWDD; Tda5250RadioPASKNFSK = Tda5250ASKNFSKFakePinP; rBUSM -> MspGeneralIO.Port15; rENTDA -> MspGeneralIO.Port16; rTXRX -> MspGeneralIO.Port14; rDATA -> MspGeneralIO.Port11; rPWDD -> MspGeneralIO.Port10; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/tda5250/Tda5250RadioInterruptC.nc000066400000000000000000000043141207233610700266520ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:41 $ * ======================================================================== */ /** * Configuration file for using the PWDDD interrupt for the TDA5250 Radio * on the eyesIFX platforms. * * @author Kevin Klues */ configuration Tda5250RadioInterruptC { provides interface GpioInterrupt; } implementation { components HplMsp430InterruptC , new Msp430InterruptC() ; GpioInterrupt = Msp430InterruptC.Interrupt; Msp430InterruptC.HplInterrupt -> HplMsp430InterruptC.Port10; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/tda5250/Tda5250RegCommC.nc000066400000000000000000000056141207233610700252340ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * Controlling the TDA5250 at the HPL layer for use with the MSP430 on the * eyesIFX platforms, Configuration. * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:41 $ * @author: Kevin Klues (klues@tkn.tu-berlin.de) * ======================================================================== */ #include "tda5250BusResourceSettings.h" /** * Configuration file for the registers of TDA5250 Radio on * the eyesIFX platforms. * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ configuration Tda5250RegCommC { provides { interface Init; interface Tda5250RegComm; interface Pot; interface Resource; } } implementation { components new Msp430Spi0C() as Spi , Tda5250RegCommP , Tda5250RadioIOC , AD5200P , AD5200PotIOC ; Init = Tda5250RegCommP; Init = AD5200P; Pot = AD5200P.Pot; Resource = Tda5250RegCommP.Resource; Tda5250RegComm = Tda5250RegCommP; Tda5250RegCommP.BusM -> Tda5250RadioIOC.Tda5250RadioBUSM; Tda5250RegCommP.SpiByte -> Spi; Tda5250RegCommP.SpiResource -> Spi; AD5200P.ENPOT -> AD5200PotIOC.AD5200PotENPOT; AD5200P.SDPOT -> AD5200PotIOC.AD5200PotSDPOT; AD5200P.SpiByte -> Spi; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/tda5250/eyesIFXBaudrates.h000066400000000000000000000042351207233610700256270ustar00rootroot00000000000000/* auto generated from tda5250BusResourceSettings.h using the following perl script: #!/usr/bin/perl -w use strict; my $state = "START"; my $br; while(<>) { if(/UBR_1MHZ_/) { ($br) = /UBR_1MHZ_(\d+)/; if($state eq "START") { print '#if '; $state = "MIDDLE"; } else { print '#elif '; } print 'TDA5250_UART_BAUDRATE == ', $br,"\n"; print '#define TDA5250_UART_UBR UBR_1MHZ_', $br, "\n"; print '#define TDA5250_UART_UMCTL UMCTL_1MHZ_', $br, "\n"; } } print '#endif',"\n" */ #if TDA5250_UART_BAUDRATE == 35108 #define TDA5250_UART_UBR UBR_1MHZ_35108 #define TDA5250_UART_UMCTL UMCTL_1MHZ_35108 #elif TDA5250_UART_BAUDRATE == 10240 #define TDA5250_UART_UBR UBR_1MHZ_10240 #define TDA5250_UART_UMCTL UMCTL_1MHZ_10240 #elif TDA5250_UART_BAUDRATE == 10922 #define TDA5250_UART_UBR UBR_1MHZ_10922 #define TDA5250_UART_UMCTL UMCTL_1MHZ_10922 #elif TDA5250_UART_BAUDRATE == 11702 #define TDA5250_UART_UBR UBR_1MHZ_11702 #define TDA5250_UART_UMCTL UMCTL_1MHZ_11702 #elif TDA5250_UART_BAUDRATE == 12603 #define TDA5250_UART_UBR UBR_1MHZ_12603 #define TDA5250_UART_UMCTL UMCTL_1MHZ_12603 #elif TDA5250_UART_BAUDRATE == 13653 #define TDA5250_UART_UBR UBR_1MHZ_13653 #define TDA5250_UART_UMCTL UMCTL_1MHZ_13653 #elif TDA5250_UART_BAUDRATE == 14894 #define TDA5250_UART_UBR UBR_1MHZ_14894 #define TDA5250_UART_UMCTL UMCTL_1MHZ_14894 #elif TDA5250_UART_BAUDRATE == 16384 #define TDA5250_UART_UBR UBR_1MHZ_16384 #define TDA5250_UART_UMCTL UMCTL_1MHZ_16384 #elif TDA5250_UART_BAUDRATE == 18204 #define TDA5250_UART_UBR UBR_1MHZ_18204 #define TDA5250_UART_UMCTL UMCTL_1MHZ_18204 #elif TDA5250_UART_BAUDRATE == 20480 #define TDA5250_UART_UBR UBR_1MHZ_20480 #define TDA5250_UART_UMCTL UMCTL_1MHZ_20480 #elif TDA5250_UART_BAUDRATE == 23405 #define TDA5250_UART_UBR UBR_1MHZ_23405 #define TDA5250_UART_UMCTL UMCTL_1MHZ_23405 #elif TDA5250_UART_BAUDRATE == 27306 #define TDA5250_UART_UBR UBR_1MHZ_27306 #define TDA5250_UART_UMCTL UMCTL_1MHZ_27306 #elif TDA5250_UART_BAUDRATE == 32768 #define TDA5250_UART_UBR UBR_1MHZ_32768 #define TDA5250_UART_UMCTL UMCTL_1MHZ_32768 #elif TDA5250_UART_BAUDRATE == 40960 #define TDA5250_UART_UBR UBR_1MHZ_40960 #define TDA5250_UART_UMCTL UMCTL_1MHZ_40960 #endif tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/tda5250/tda5250BusResourceSettings.h000066400000000000000000000065041207233610700274500ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.12 $ * $Date: 2008-06-24 14:46:18 $ * ======================================================================== */ #include "msp430usart.h" #ifndef TDA5250BUSRESOURCEID_H #define TDA5250BUSRESOURCEID_H enum { TDA5250_UART_BUS_ID = unique(MSP430_UARTO_BUS) }; /* frequency of crystal: 18089580 Hz, divide by 18 -> 1004976 Hz */ #ifndef TDA5250_UART_BAUDRATE #define TDA5250_UART_BAUDRATE 32768U #endif enum { /** use real frequency, use only settings that result in an even byte time */ UBR_1MHZ_10240=0x0062, UMCTL_1MHZ_10240=0x08, // 10240 bit/s UBR_1MHZ_10922=0x005C, UMCTL_1MHZ_10922=0x00, // 10922 bit/s UBR_1MHZ_11702=0x0055, UMCTL_1MHZ_11702=0xEF, // 11702 bit/s UBR_1MHZ_12603=0x004F, UMCTL_1MHZ_12603=0xDD, // 12603 bit/s UBR_1MHZ_13653=0x0049, UMCTL_1MHZ_13653=0xB5, // 13653 bit/s UBR_1MHZ_14894=0x0043, UMCTL_1MHZ_14894=0xAA, // 14894 bit/s UBR_1MHZ_16384=0x003D, UMCTL_1MHZ_16384=0x92, // 16384 bit/s UBR_1MHZ_18204=0x0037, UMCTL_1MHZ_18204=0x84, // 18204 bit/s UBR_1MHZ_20480=0x0031, UMCTL_1MHZ_20480=0x80, // 20480 bit/s UBR_1MHZ_23405=0x002A, UMCTL_1MHZ_23405=0x7F, // 23405 bit/s UBR_1MHZ_27306=0x0024, UMCTL_1MHZ_27306=0x7B, // 27306 bit/s UBR_1MHZ_32768=0x001E, UMCTL_1MHZ_32768=0x5B, // 32768 bit/s UBR_1MHZ_40960=0x0018, UMCTL_1MHZ_40960=0x55, // 40960 bit/s }; #include "eyesIFXBaudrates.h" msp430_uart_union_config_t tda5250_uart_config = { {ubr: TDA5250_UART_UBR, umctl: TDA5250_UART_UMCTL, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie:0, urxwie: 0, urxe: 1, utxe: 0} }; enum { TDA5250_32KHZ_BYTE_TIME = (32768UL*10)/TDA5250_UART_BAUDRATE }; #endif tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/chips/tda5250/tda5250RegDefaultSettings.h000066400000000000000000000076601207233610700272350ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - Revision ------------------------------------------------------------- * $Revision: 1.13 $ * $Date: 2008-06-24 14:46:18 $ * ======================================================================== */ /** * tda5250RegDefaultSettings Header File * Defines the default values of the registers for the TDA5250 Radio * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ #ifndef TDA5250REGDEFAULTSETTINGS_H #define TDA5250REGDEFAULTSETTINGS_H // Default values of data registers /** regulate distance by switching the amplifiers */ // longest distance #define FULL_RANGE 0x04F9 // shorter distance; low gain, high tx energy consumption (30m) #define MED_RANGE_HP 0x04E9 // shorter distance; high gain, low tx energy consumption (25m) #define MED_RANGE_LP 0x04F8 // shortest: low gain; low tx energy consumption (1m to 3m range) #define TABLE_TOP 0x04E8 /** regulate distance using variable resistor, values for high tx power */ #define RF_HITX_DAMPING_0dB 255 #define RF_HITX_DAMPING_5dB 248 #define RF_HITX_DAMPING_10dB 245 #define RF_HITX_DAMPING_15dB 241 #define RF_HITX_DAMPING_20dB 239 /** regulate distance using variable resistor, values for low tx power */ #define RF_LOTX_DAMPING_0dB 255 #define RF_LOTX_DAMPING_5dB 90 #define RF_LOTX_DAMPING_10dB 67 #define RF_LOTX_DAMPING_15dB 50 #define RF_LOTX_DAMPING_16dB 40 #define RF_LOTX_DAMPING_17dB 30 // choose one #define INITIAL_RF_POWER RF_HITX_DAMPING_0dB #ifndef TDA5250_REG_DEFAULT_SETTING_CONFIG #define TDA5250_REG_DEFAULT_SETTING_CONFIG FULL_RANGE #endif #ifndef TDA5250_REG_DEFAULT_SETTING_LPF #define TDA5250_REG_DEFAULT_SETTING_LPF 0x8C #endif #define TDA5250_REG_DEFAULT_SETTING_FSK 0x0A0C #define TDA5250_REG_DEFAULT_SETTING_XTAL_TUNING 0x0012 #define TDA5250_REG_DEFAULT_SETTING_ON_TIME 0xFEC0 #define TDA5250_REG_DEFAULT_SETTING_OFF_TIME 0xF380 #define TDA5250_REG_DEFAULT_SETTING_COUNT_TH1 0x0000 #define TDA5250_REG_DEFAULT_SETTING_COUNT_TH2 0x0001 #define TDA5250_REG_DEFAULT_SETTING_RSSI_TH3 0xFF #define TDA5250_REG_DEFAULT_SETTING_CLK_DIV 0x08 #define TDA5250_REG_DEFAULT_SETTING_XTAL_CONFIG 0x01 #define TDA5250_REG_DEFAULT_SETTING_BLOCK_PD 0xFFFF #endif //TDA5250REGDEFAULTSETTINGS_H tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/crc.h000066400000000000000000000044041207233610700210330ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- */ /* Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This CRC-16 function produces a 16-bit running CRC that adheres to the * ITU-T CRC standard. * * The ITU-T polynomial is: G_16(x) = x^16 + x^12 + x^5 + 1 * @param crc Running CRC value * @param b Byte to "add" to the CRC * @return New CRC value * * @author Andreas Koepke * @author Paul Curtis (pointed out this implementation, which is believed to be public domain) */ #ifndef CRC_H #define CRC_H uint16_t crcByte(uint16_t crc, uint8_t b) { crc = (uint8_t)(crc >> 8) | (crc << 8); crc ^= b; crc ^= (uint8_t)(crc & 0xff) >> 4; crc ^= crc << 12; crc ^= (crc & 0xff) << 5; return crc; } #endif tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/eyesIFXSerialP.nc000066400000000000000000000014331207233610700232300ustar00rootroot00000000000000module eyesIFXSerialP { provides interface StdControl; provides interface Msp430UartConfigure; uses interface Resource; } implementation { enum { UBR_1MHZ_57601=0x0011, UMCTL_1MHZ_57601=0xAA // 57600 bit/s }; msp430_uart_union_config_t msp430_uart_eyes_config = { {ubr: UBR_1MHZ_57601, umctl: UMCTL_1MHZ_57601, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0, urxe: 1, utxe: 1} }; command error_t StdControl.start(){ return call Resource.immediateRequest(); } command error_t StdControl.stop(){ call Resource.release(); return SUCCESS; } event void Resource.granted(){} async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig() { return &msp430_uart_eyes_config; } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/eyesIFXv1/000077500000000000000000000000001207233610700216745ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/eyesIFXv1/.platform000066400000000000000000000006171207233610700235250ustar00rootroot00000000000000# Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. push( @includes, qw( %T/platforms/eyesIFX/eyesIFXv1 %T/platforms/eyesIFX/eyesIFXv1/chips/stm25p %T/chips/stm25p ) ); push ( @opts, qw( -mmcu=msp430f149 ) ); tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/eyesIFXv1/hardware.h000066400000000000000000000143341207233610700236470ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: hardware.h,v 1.5 2009-07-01 19:26:59 scipio Exp $ * */ #ifndef TOSH_HARDWARE_EYESIFX #define TOSH_HARDWARE_EYESIFX #include "msp430hardware.h" // enum so components can override power saving, // as per TEP 112. enum { TOS_SLEEP_NONE = MSP430_POWER_ACTIVE, }; // LED assignments TOSH_ASSIGN_PIN(RED_LED, 5, 0); // Compatibility with the mica2 TOSH_ASSIGN_PIN(GREEN_LED, 5, 1); TOSH_ASSIGN_PIN(YELLOW_LED, 5, 2); // Debug Pin assignments TOSH_ASSIGN_PIN(DEBUG_PIN1, 1, 2); TOSH_ASSIGN_PIN(DEBUG_PIN2, 1, 3); TOSH_ASSIGN_PIN(LED0, 5, 0); TOSH_ASSIGN_PIN(LED1, 5, 1); TOSH_ASSIGN_PIN(LED2, 5, 2); TOSH_ASSIGN_PIN(LED3, 5, 3); // TDA5250 assignments TOSH_ASSIGN_PIN(TDA_PWDDD, 1, 0); // TDA PWDDD TOSH_ASSIGN_PIN(TDA_DATA, 1, 1); // TDA DATA (timerA, CCI0A) TOSH_ASSIGN_PIN(TDA_TXRX, 1, 4); // TDA TX/RX TOSH_ASSIGN_PIN(TDA_BUSM, 1, 5); // TDA BUSM TOSH_ASSIGN_PIN(TDA_ENTDA, 1, 6); // TDA EN_TDA // USART0 assignments TOSH_ASSIGN_PIN(SIMO0, 3, 1); // SIMO (MSP) -> BUSDATA (TDA5250) TOSH_ASSIGN_PIN(SOMI0, 3, 2); // SOMI (MSP) -> BUSDATA (TDA5250) TOSH_ASSIGN_PIN(UCLK0, 3, 3); // UCLK (MSP) -> BUSCLK (TDA5250) TOSH_ASSIGN_PIN(UTXD0, 3, 4); // USART0 -> data1 (TDA5250) TOSH_ASSIGN_PIN(URXD0, 3, 5); // USART0 -> data1 (TDA5250) // USART1 assignments TOSH_ASSIGN_PIN(UTXD1, 3, 6); // USART1 -> ST3232 TOSH_ASSIGN_PIN(URXD1, 3, 7); // USART1 -> ST3232 TOSH_ASSIGN_PIN(UCLK1, 5, 3); TOSH_ASSIGN_PIN(SOMI1, 5, 2); TOSH_ASSIGN_PIN(SIMO1, 5, 1); // Sensor assignments TOSH_ASSIGN_PIN(RSSI, 6, 3); TOSH_ASSIGN_PIN(TEMP, 6, 0); TOSH_ASSIGN_PIN(LIGHT, 6, 2); TOSH_ASSIGN_PIN(ADC_A1, 6, 1); // Potentiometer TOSH_ASSIGN_PIN(POT_EN, 2, 4); TOSH_ASSIGN_PIN(POT_SD, 2, 3); // TimerA output TOSH_ASSIGN_PIN(TIMERA0, 1, 1); //2,7 TOSH_ASSIGN_PIN(TIMERA1, 1, 2); TOSH_ASSIGN_PIN(TIMERA2, 1, 3); // TimerB output TOSH_ASSIGN_PIN(TIMERB0, 4, 0); TOSH_ASSIGN_PIN(TIMERB1, 4, 1); TOSH_ASSIGN_PIN(TIMERB2, 4, 2); // SMCLK output TOSH_ASSIGN_PIN(SMCLK, 5, 5); //2,7 // ACLK output TOSH_ASSIGN_PIN(ACLK, 2, 0); // Flash TOSH_ASSIGN_PIN(FLASH_CS, 1, 7); // send a bit via bit-banging to the flash void TOSH_FLASH_M25P_DP_bit(bool set) { if (set) TOSH_SET_SIMO0_PIN(); else TOSH_CLR_SIMO0_PIN(); TOSH_SET_UCLK0_PIN(); TOSH_CLR_UCLK0_PIN(); } inline void TOSH_wait(void) { nop(); nop(); } inline void uwait(uint16_t u) { /* uint16_t i; if (u < 500) for (i=2; i < u; i++) { asm volatile("nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t" ::); } else for (i=0; i < u; i++) { asm volatile("nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t" ::); } */ uint16_t t0 = TAR; while((TAR - t0) <= u); } void TOSH_FLASH_M25P_DP() { // SIMO0, UCLK0 TOSH_MAKE_SIMO0_OUTPUT(); TOSH_MAKE_UCLK0_OUTPUT(); TOSH_MAKE_FLASH_CS_OUTPUT(); TOSH_SET_FLASH_CS_PIN(); TOSH_wait(); // initiate sequence; TOSH_CLR_FLASH_CS_PIN(); TOSH_CLR_UCLK0_PIN(); TOSH_FLASH_M25P_DP_bit(TRUE); // 0 TOSH_FLASH_M25P_DP_bit(FALSE); // 1 TOSH_FLASH_M25P_DP_bit(TRUE); // 2 TOSH_FLASH_M25P_DP_bit(TRUE); // 3 TOSH_FLASH_M25P_DP_bit(TRUE); // 4 TOSH_FLASH_M25P_DP_bit(FALSE); // 5 TOSH_FLASH_M25P_DP_bit(FALSE); // 6 TOSH_FLASH_M25P_DP_bit(TRUE); // 7 TOSH_SET_FLASH_CS_PIN(); TOSH_SET_SIMO0_PIN(); TOSH_MAKE_SIMO0_INPUT(); TOSH_MAKE_UCLK0_INPUT(); } #undef atomic void TOSH_SET_PIN_DIRECTIONS(void) { atomic { P1OUT = 0x00; P2OUT = 0x00; P3OUT = 0x00; P4OUT = 0x00; P5OUT = 0x00; P6OUT = 0x00; P1SEL = 0x00; P2SEL = 0x00; P3SEL = 0x00; P4SEL = 0x00; P5SEL = 0x00; P6SEL = 0x00; P1DIR = 0x07; // P2DIR = 0xff; // P3DIR = 0xff; P4DIR = 0xff; P5DIR = 0x0f; P6DIR = 0xf0; TOSH_CLR_TDA_PWDDD_PIN(); // radio has to be on on power-up TOSH_MAKE_TDA_PWDDD_OUTPUT(); TOSH_SET_TDA_ENTDA_PIN(); // deselect the radio TOSH_MAKE_TDA_ENTDA_OUTPUT(); TOSH_SET_FLASH_CS_PIN(); // put flash in standby mode TOSH_MAKE_FLASH_CS_OUTPUT(); TOSH_SET_POT_SD_PIN(); // put potentiometer in shutdown mode TOSH_MAKE_POT_SD_OUTPUT(); TOSH_SET_POT_EN_PIN(); // deselect potentiometer TOSH_MAKE_POT_EN_OUTPUT(); TOSH_SEL_TEMP_MODFUNC(); //prepare pin for analog excitation from the temperature sensor TOSH_MAKE_TEMP_INPUT(); TOSH_SEL_LIGHT_MODFUNC(); //prepare pin for analog excitation from the light sensor TOSH_MAKE_LIGHT_INPUT(); P1IE = 0; P2IE = 0; // wait 12ms for the radio and flash to start uwait(1024*12); // // Put the flash in deep sleep state TOSH_FLASH_M25P_DP(); TOSH_SET_TDA_PWDDD_PIN(); // put the radio in sleep } } #endif //TOSH_HARDWARE_H tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/eyesIFXv2/000077500000000000000000000000001207233610700216755ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/eyesIFXv2/.platform000066400000000000000000000006171207233610700235260ustar00rootroot00000000000000# Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. push( @includes, qw( %T/platforms/eyesIFX/eyesIFXv2 %T/platforms/eyesIFX/eyesIFXv2/chips/at45db %T/chips/at45db ) ); push ( @opts, qw( -mmcu=msp430f1611 ) ); tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/eyesIFXv2/chips/000077500000000000000000000000001207233610700230035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/000077500000000000000000000000001207233610700240665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45dbC.nc000066400000000000000000000040261207233610700262040ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ configuration HplAt45dbC { provides interface HplAt45db; } implementation { components new HplAt45dbByteC(9), new Msp430Spi0C() as Spi, HplAt45dbP, HplMsp430GeneralIOC as MspGeneralIO, new Msp430GpioC() as Select; HplAt45db = HplAt45dbByteC; HplAt45dbByteC.Resource -> Spi; HplAt45dbByteC.FlashSpi -> Spi; HplAt45dbByteC.HplAt45dbByte -> HplAt45dbP; Select -> MspGeneralIO.Port17; HplAt45dbP.Select -> Select; HplAt45dbP.FlashSpi -> Spi; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45dbP.nc000066400000000000000000000043261207233610700262240ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ module HplAt45dbP { provides { interface HplAt45dbByte; } uses { interface SpiByte as FlashSpi; interface GeneralIO as Select; } } implementation { command void HplAt45dbByte.select() { call Select.clr(); } command void HplAt45dbByte.deselect() { call Select.set(); } task void idleTask() { uint8_t status; status = call FlashSpi.write(0); if (!(status & 0x80)) { post idleTask(); } else { signal HplAt45dbByte.idle(); } } command void HplAt45dbByte.waitIdle() { post idleTask(); } command bool HplAt45dbByte.getCompareStatus() { uint8_t status; status = call FlashSpi.write(0); return (!(status & 0x40)); } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45db_chip.h000066400000000000000000000045011207233610700267310ustar00rootroot00000000000000// $Id: HplAt45db_chip.h,v 1.6 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef HPLAT45DB_CHIP_H #define HPLAT45DB_CHIP_H // flash characteristics enum { AT45_MAX_PAGES = 2048, AT45_PAGE_SIZE = 264, AT45_PAGE_SIZE_LOG2 = 8 // For those who want to ignore the last 8 bytes }; typedef uint16_t at45page_t; typedef uint16_t at45pageoffset_t; /* must fit 0 to AT45_PAGE_SIZE - 1 */ #endif tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/eyesIFXv2/hardware.h000066400000000000000000000125221207233610700236450ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universität Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: hardware.h,v 1.5 2009-07-01 19:27:00 scipio Exp $ * */ #ifndef TOSH_HARDWARE_EYESIFXV2 #define TOSH_HARDWARE_EYESIFXV2 #include "msp430hardware.h" // enum so components can override power saving, // as per TEP 112. enum { TOS_SLEEP_NONE = MSP430_POWER_ACTIVE, }; // LED assignments TOSH_ASSIGN_PIN(RED_LED, 5, 0); // Compatibility with the mica2 TOSH_ASSIGN_PIN(GREEN_LED, 5, 1); TOSH_ASSIGN_PIN(YELLOW_LED, 5, 2); TOSH_ASSIGN_PIN(LED0, 5, 0); TOSH_ASSIGN_PIN(LED1, 5, 1); TOSH_ASSIGN_PIN(LED2, 5, 2); TOSH_ASSIGN_PIN(LED3, 5, 3); // TDA5250 assignments TOSH_ASSIGN_PIN(TDA_BUSM, 1, 5); // TDA BUSM TOSH_ASSIGN_PIN(TDA_ENTDA, 1, 6); // TDA EN_TDA TOSH_ASSIGN_PIN(TDA_TXRX, 1, 4); // TDA TX/RX TOSH_ASSIGN_PIN(TDA_DATA, 1, 1); // TDA DATA (timerA, CCI0A) TOSH_ASSIGN_PIN(TDA_PWDDD, 1, 0); // TDA PWDDD // USART0 assignments TOSH_ASSIGN_PIN(SIMO0, 3, 1); // SIMO (MSP) -> BUSDATA (TDA5250) TOSH_ASSIGN_PIN(SOMI0, 3, 2); // SOMI (MSP) -> BUSDATA (TDA5250) TOSH_ASSIGN_PIN(UCLK0, 3, 3); // UCLK (MSP) -> BUSCLK (TDA5250) TOSH_ASSIGN_PIN(UTXD0, 3, 4); // USART0 -> data1 (TDA5250) TOSH_ASSIGN_PIN(URXD0, 3, 5); // USART0 -> data1 (TDA5250) // USART1 assignments TOSH_ASSIGN_PIN(UTXD1, 3, 6); // USART1 -> USB TOSH_ASSIGN_PIN(URXD1, 3, 7); // USART1 -> USB /* void TOSH_SEL_SIMO1_IOFUNC() { } void TOSH_SEL_SOMI1_IOFUNC() { } void TOSH_SEL_UCLK1_IOFUNC() { } void TOSH_SEL_SIMO1_MODFUNC() { } void TOSH_SEL_SOMI1_MODFUNC() { } void TOSH_SEL_UCLK1_MODFUNC() { } */ // Sensor assignments TOSH_ASSIGN_PIN(RSSI, 6, 3); TOSH_ASSIGN_PIN(TEMP, 6, 0); TOSH_ASSIGN_PIN(LIGHT, 6, 2); TOSH_ASSIGN_PIN(VREF, 6, 7); TOSH_ASSIGN_PIN(B0, 6, 4); TOSH_ASSIGN_PIN(B1, 6, 5); TOSH_ASSIGN_PIN(B2, 6, 7); TOSH_ASSIGN_PIN(B3, 6, 6); TOSH_ASSIGN_PIN(B4, 6, 1); // Potentiometer TOSH_ASSIGN_PIN(POT_EN, 2, 4); TOSH_ASSIGN_PIN(POT_SD, 2, 3); // TimerA output TOSH_ASSIGN_PIN(TIMERA0, 1, 1); //2,7 TOSH_ASSIGN_PIN(TIMERA1, 1, 2); TOSH_ASSIGN_PIN(TIMERA2, 1, 3); // TimerB output TOSH_ASSIGN_PIN(TIMERB0, 4, 0); TOSH_ASSIGN_PIN(TIMERB1, 4, 1); TOSH_ASSIGN_PIN(TIMERB2, 4, 2); // SMCLK output TOSH_ASSIGN_PIN(SMCLK, 5, 5); //2,7 // ACLK output TOSH_ASSIGN_PIN(ACLK, 2, 0); // Flash TOSH_ASSIGN_PIN(FLASH_CS, 1, 7); TOSH_ASSIGN_PIN(DEBUG_1, 1, 1); TOSH_ASSIGN_PIN(DEBUG_2, 1, 2); // Temperature sensor enable TOSH_ASSIGN_PIN(TEMP_EN, 5, 4); // USB power monitoring TOSH_ASSIGN_PIN(USB_POWER, 1, 3); inline void uwait(uint16_t u) { uint16_t t0 = TAR; while((TAR - t0) <= u); } #undef atomic void TOSH_SET_PIN_DIRECTIONS(void) { // Default seting is I/O and output zero. atomic { P1OUT = 0x00; P2OUT = 0x00; P3OUT = 0x00; P4OUT = 0x00; P5OUT = 0x00; P6OUT = 0x00; P1SEL = 0x00; P2SEL = 0x00; P3SEL = 0x00; P4SEL = 0x00; P5SEL = 0x00; P6SEL = 0x00; P1DIR = 0x07; // P2DIR = 0xff; // P3DIR = 0xff; P4DIR = 0xff; P5DIR = 0x0f; P6DIR = 0xf0; TOSH_MAKE_TDA_PWDDD_OUTPUT(); TOSH_MAKE_TDA_ENTDA_OUTPUT(); TOSH_MAKE_FLASH_CS_OUTPUT(); TOSH_MAKE_POT_SD_OUTPUT(); TOSH_MAKE_POT_EN_OUTPUT(); //disable temperature sensor TOSH_CLR_TEMP_EN_PIN(); TOSH_MAKE_TEMP_EN_OUTPUT(); // detect USB power TOSH_SEL_USB_POWER_MODFUNC(); TOSH_MAKE_USB_POWER_INPUT(); // wait 12ms for the radio to start uwait(1024*12); TOSH_SET_TDA_ENTDA_PIN(); // deselect the radio TOSH_SET_FLASH_CS_PIN(); // put flash in standby mode TOSH_SET_POT_SD_PIN(); // put potentiometer in shutdown mode TOSH_SET_POT_EN_PIN(); // deselect potentiometer TOSH_SEL_TEMP_MODFUNC(); //prepare pin for analog excitation from the temperature sensor TOSH_MAKE_TEMP_INPUT(); TOSH_SEL_LIGHT_MODFUNC(); //prepare pin for analog excitation from the light sensor TOSH_MAKE_LIGHT_INPUT(); P1IE = 0; P2IE = 0; TOSH_SET_TDA_PWDDD_PIN(); // put radio in sleep } } #endif //TOSH_HARDWARE_EYESIFXV2 tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/lf-crc.h000066400000000000000000000044041207233610700214320ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- */ /* Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This CRC-16 function produces a 16-bit running CRC that adheres to the * ITU-T CRC standard. * * The ITU-T polynomial is: G_16(x) = x^16 + x^12 + x^5 + 1 * @param crc Running CRC value * @param b Byte to "add" to the CRC * @return New CRC value * * @author Andreas Koepke * @author Paul Curtis (pointed out this implementation, which is believed to be public domain) */ #ifndef CRC_H #define CRC_H uint16_t crcByte(uint16_t crc, uint8_t b) { crc = (uint8_t)(crc >> 8) | (crc << 8); crc ^= b; crc ^= (uint8_t)(crc & 0xff) >> 4; crc ^= crc << 12; crc ^= (crc & 0xff) << 5; return crc; } #endif tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/net/000077500000000000000000000000001207233610700206775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/net/lqi/000077500000000000000000000000001207233610700214645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/net/lqi/CC2420ActiveMessageC.nc000066400000000000000000000051531207233610700253530ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode:nil -*- * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Pseudo module to enable MultihopLqi on eyesIFX. The mapping of * strength to LQI is based on the packet delivery ratio. For CC2420 * the ratios were taken from: Kannan Srinivasan and Philip Levis: * "RSSI is Under Appreciated" Third Workshop on Embedded Networked * Sensors, EmNets 2006. * * @author Andreas Köpke */ #include "radiopacketfunctions.h" module CC2420ActiveMessageC { provides { interface CC2420Packet; } } implementation { async command uint8_t CC2420Packet.getPower(message_t* p_msg ) { return 31; } async command void CC2420Packet.setPower(message_t* p_msg, uint8_t power) { } async command int8_t CC2420Packet.getRssi(message_t* p_msg ) { return (getMetadata(p_msg))->strength; } async command uint8_t CC2420Packet.getLqi( message_t* p_msg ) { uint32_t s = (getMetadata(p_msg))->strength; if(s > 60) s = 10; if(s > 22) s = 22; return (s*13/5 + 48); } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/net/lqi/CC2420Packet.nc000066400000000000000000000052631207233610700237410ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author David Moss * @author Chad Metcalf */ #include "message.h" interface CC2420Packet { /** * Get transmission power setting for current packet. * * @param the message */ async command uint8_t getPower( message_t* p_msg ); /** * Set transmission power for a given packet. Valid ranges are * between 0 and 31. * * @param p_msg the message. * @param power transmission power. */ async command void setPower( message_t* p_msg, uint8_t power ); /** * Get rssi value for a given packet. For received packets, it is * the received signal strength when receiving that packet. For sent * packets, it is the received signal strength of the ack if an ack * was received. */ async command int8_t getRssi( message_t* p_msg ); /** * Get lqi value for a given packet. For received packets, it is the * link quality indicator value when receiving that packet. For sent * packets, it is the link quality indicator value of the ack if an * ack was received. */ async command uint8_t getLqi( message_t* p_msg ); } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/platform.h000066400000000000000000000000001207233610700220740ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/platform_message.h000066400000000000000000000056731207233610700236250ustar00rootroot00000000000000/* $Id: platform_message.h,v 1.6 2010-06-29 22:07:53 scipio Exp $ * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Defining the platform-independently named packet structures to be the * chip-specific TDA5250 packet structures. * * @author Philip Levis * @author Vlado Handziski (TDA5250 Modifications) * @date May 16 2005 * Revision: $Revision: 1.6 $ */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include "Serial.h" #include "tda5250_message.h" #ifndef TOSH_DATA_LENGTH #define TOSH_DATA_LENGTH 48 #endif typedef union message_header_t { tda5250_header_t radio; serial_header_t serial; } message_header_t; typedef union message_footer_t { tda5250_footer_t radio; } message_footer_t; typedef union message_metadata_t { tda5250_metadata_t radio; } message_metadata_t; typedef tda5250_header_t message_radio_header_t; typedef tda5250_footer_t message_radio_footer_t; typedef tda5250_metadata_t message_radio_metadata_t; #if TOSH_DATA_LENGTH < 33 #error "TOSH_DATA_LENGH must be larger than 33 bytes for this platform." #endif #endif tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/000077500000000000000000000000001207233610700216055ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/BatteryLevel.nc000066400000000000000000000040461207233610700245350ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Description --------------------------------------------------------- * Measure Battery Level in mV using the internal voltage * - Author -------------------------------------------------------------- * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) * ======================================================================== */ interface BatteryLevel { // get the batterylevel in mV async command uint16_t getLevel(); } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/BatteryLevelSensorC.nc000066400000000000000000000050431207233610700260300ustar00rootroot00000000000000/* -*- mode:c++ -*- * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.5 $ * $Date: 2007-03-10 21:58:37 $ * @author: Jan Hauer * ======================================================================== */ #include generic configuration BatteryLevelSensorC() { provides { interface Read as Read; interface ReadNow as ReadNow; interface Resource as ReadNowResource; } } implementation { components SensorSettingsC as Settings; components new AdcReadClientC() as AdcReadClient; Read = AdcReadClient; AdcReadClient.AdcConfigure -> Settings.AdcConfigure[INTERNAL_VOLTAGE_REF_2_5V_LOW_FREQ]; components new AdcReadNowClientC() as AdcReadNowClient; ReadNow = AdcReadNowClient; ReadNowResource = AdcReadNowClient; AdcReadNowClient.AdcConfigure -> Settings.AdcConfigure[INTERNAL_VOLTAGE_REF_2_5V_LOW_FREQ]; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/CoulombCounter.nc000066400000000000000000000053351207233610700250750ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface to control the coulomb counter circuit * @author: Andreas Koepke (koepke@tkn.tu-berlin.de */ interface CoulombCounter { /** are we currently measureing the power consumption? */ async command bool isMeasureing(); /** * Start a measurement after delay seconds for duration seconds delay * seconds should be larger than 600 -- this allows to recover from a * buggy image. The delay must be smaller than 24 days, whereas duration * is full range 32bit in seconds. If the circuit is already measureing, * this command will only set the duration timer. Some platforms will * re-boot every time we fiddle with the power supply -- this trick * allows us to "continue" measureing. */ command error_t start(uint32_t delay, uint32_t duration); /** Stop a measurement, returns FAIL if there is no ongoing measurement */ command error_t stop(); /** notification: a fixed portion of energy has been consumed */ async event void portionConsumed(); /** notification that the measurement will be soon over */ event void soonOver(); } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/CoulombCounterC.nc000066400000000000000000000057441207233610700252040ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Configuration for the Coulomb Counter board interface. This one is for * eyesIFXv2.1 * * @author: Andreas Koepke (koepke@tkn.tu-berlin.de */ configuration CoulombCounterC { provides interface CoulombCounter; } implementation { components MainC, CoulombCounterP; components new TimerMilliC() as Timer; MainC.SoftwareInit -> CoulombCounterP; CoulombCounterP.Timer -> Timer; CoulombCounter = CoulombCounterP; components HplMsp430InterruptC, HplMsp430GeneralIOC; /** configure coulomb counter notification pin */ components new Msp430InterruptC() as EnergyInterruptC, new Msp430GpioC() as EnergyPinC; EnergyInterruptC.HplInterrupt -> HplMsp430InterruptC.Port12; CoulombCounterP.EnergyInterrupt -> EnergyInterruptC.Interrupt; EnergyPinC -> HplMsp430GeneralIOC.Port12; CoulombCounterP.EnergyPin -> EnergyPinC; /** board control interface */ components new Msp430GpioC() as UsbBatSwitch; components new Msp430GpioC() as ResetBoard; UsbBatSwitch -> HplMsp430GeneralIOC.Port64; ResetBoard -> HplMsp430GeneralIOC.Port65; CoulombCounterP.UsbBatSwitch -> UsbBatSwitch; CoulombCounterP.ResetBoard -> ResetBoard; /** Are we powered via USB? */ components new Msp430GpioC() as UsbMonitor; UsbMonitor -> HplMsp430GeneralIOC.Port13; CoulombCounterP.UsbMonitor -> UsbMonitor; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/CoulombCounterP.nc000066400000000000000000000125311207233610700252110ustar00rootroot00000000000000/* -*- mode:c++; indent-tabs-mode: nil -*- * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of coulomb counter board interface for eyesIFXv2.1 * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) */ #include "Timer.h" module CoulombCounterP { provides { interface CoulombCounter; interface Init; } uses { interface Timer as Timer; interface GpioInterrupt as EnergyInterrupt; interface GeneralIO as EnergyPin; interface GeneralIO as UsbBatSwitch; interface GeneralIO as ResetBoard; interface GeneralIO as UsbMonitor; } } implementation { #define MIN_DELAY 60 uint16_t timerHighBits = 0; uint32_t dur = 0; bool warned = FALSE; void resetBoard() { call ResetBoard.set(); __asm__("NOP"); call ResetBoard.clr(); } void startMeasure() { unsigned i; for(i = 0; i < 7; i++) { call UsbBatSwitch.set(); call UsbBatSwitch.clr(); } } void stopMeasure() { call UsbBatSwitch.set(); call UsbBatSwitch.clr(); // if your board allows it: delay until supply via USB stable resetBoard(); } command error_t Init.init() { call EnergyPin.makeInput(); call EnergyInterrupt.disable(); call UsbBatSwitch.makeOutput(); call UsbBatSwitch.clr(); call ResetBoard.makeOutput(); call ResetBoard.clr(); call UsbMonitor.makeInput(); if(!call CoulombCounter.isMeasureing()) { resetBoard(); } return SUCCESS; } async command bool CoulombCounter.isMeasureing() { return call UsbMonitor.get(); // high --> disconnected --> measuremode } void startLongTimer() { if(timerHighBits) { timerHighBits--; call Timer.startOneShot(-1); } else { call Timer.startOneShot(dur); } } command error_t CoulombCounter.start(uint32_t delay, uint32_t duration) { error_t result = SUCCESS; timerHighBits = duration >> 22; dur = duration * (uint32_t)1024; warned = FALSE; if(call CoulombCounter.isMeasureing()) { startLongTimer(); call EnergyInterrupt.enableFallingEdge(); } else { if((delay < MIN_DELAY) || (delay > ((uint32_t)1<<21))) { result = FAIL; } else { call Timer.startOneShot(delay * (uint32_t)1024); } } return result; } /** Stop a measurement, returns FAIL if there is no ongoing measurement */ command error_t CoulombCounter.stop() { error_t result = FAIL; call Timer.stop(); timerHighBits = 0; dur = 0; call EnergyInterrupt.disable(); if(call CoulombCounter.isMeasureing()) { stopMeasure(); result = SUCCESS; } return result; } async event void EnergyInterrupt.fired() { signal CoulombCounter.portionConsumed(); } event void Timer.fired() { if(call CoulombCounter.isMeasureing()) { if(timerHighBits) { startLongTimer(); } else { if(warned == TRUE) { call CoulombCounter.stop(); } else { signal CoulombCounter.soonOver(); call Timer.startOneShot((uint32_t)MIN_DELAY*1024); warned = TRUE; } } } else { // finished waiting for delay resetBoard(); startLongTimer(); call EnergyInterrupt.enableFallingEdge(); startMeasure(); } } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/DemoSensorC.nc000066400000000000000000000050011207233610700243040ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:41 $ * @author: Jan Hauer * ======================================================================== */ /** * * Please refer to TEP 109 for more information about this component and its * intended use. This component is an example component that provides * platform-independent access to a sensor via the Read and * ReadStream interface. Which actual sensor this is, is variable * defined in the implementation part below. * * @author Jan Hauer */ #include generic configuration DemoSensorC() { provides { interface Read; } } implementation { components SensorSettingsC as Settings; components new AdcReadClientC() as AdcReadClient; Read = AdcReadClient; AdcReadClient.AdcConfigure -> Settings.AdcConfigure[PHOTO_SENSOR_DEFAULT]; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/DemoSensorNowC.nc000066400000000000000000000051171207233610700250000ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:41 $ * @author: Jan Hauer * ======================================================================== */ /** * * Please refer to TEP 109 for more information about this component and its * intended use. This component is an example component that provides * platform-independent access to a sensor via the ReadNow and * interface. Which actual sensor this is, is variable and defined in the * implementation part below. * * @author Jan Hauer */ #include generic configuration DemoSensorNowC() { provides { interface Resource; interface ReadNow; } } implementation { components SensorSettingsC as Settings; components new AdcReadNowClientC() as AdcReadNowClient; Resource = AdcReadNowClient; ReadNow = AdcReadNowClient; AdcReadNowClient.AdcConfigure -> Settings.AdcConfigure[PHOTO_SENSOR_DEFAULT]; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/DemoSensorStreamC.nc000066400000000000000000000050561207233610700254720ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:41 $ * @author: Jan Hauer * ======================================================================== */ /** * * Please refer to TEP 109 for more information about this component and its * intended use. This component is an example component that provides * platform-independent access to a sensor via the Read and * ReadStream interface. Which actual sensor this is, is variable * defined in the implementation part below. * * @author Jan Hauer */ #include generic configuration DemoSensorStreamC() { provides { interface ReadStream; } } implementation { components SensorSettingsC as Settings; components new AdcReadStreamClientC() as AdcReadStreamClient; ReadStream = AdcReadStreamClient; AdcReadStreamClient.AdcConfigure -> Settings.AdcConfigure[PHOTO_SENSOR_DEFAULT]; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/PhotoSensorC.nc000066400000000000000000000053061207233610700245210ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:41 $ * @author: Jan Hauer * ======================================================================== */ /** * * Please refer to TEP 109 for more information about this component and its * intended use. This component provides platform-independent access to the * onboard photo sensor on the eyesIFXv{1,2} platform. * * @author Jan Hauer */ #include generic configuration PhotoSensorC() { provides { interface Read as Read; interface ReadNow as ReadNow; interface Resource as ReadNowResource; } } implementation { components SensorSettingsC as Settings; components new AdcReadClientC() as AdcReadClient; Read = AdcReadClient; AdcReadClient.AdcConfigure -> Settings.AdcConfigure[PHOTO_SENSOR_DEFAULT]; components new AdcReadNowClientC() as AdcReadNowClient; ReadNow = AdcReadNowClient; ReadNowResource = AdcReadNowClient; AdcReadNowClient.AdcConfigure -> Settings.AdcConfigure[PHOTO_SENSOR_DEFAULT]; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/ReadNowShiftC.nc000066400000000000000000000043121207233610700245670ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2006-12-12 18:23:41 $ * @author: Jan Hauer * ======================================================================== */ generic module ReadNowShiftC(uint8_t bits) { provides interface ReadNow as ReadNowShifted; uses interface ReadNow as ReadNowRaw; } implementation { async command error_t ReadNowShifted.read() { return call ReadNowRaw.read(); } async event void ReadNowRaw.readDone(error_t result, uint16_t val) { signal ReadNowShifted.readDone(result, (val << bits)); } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/ReadShiftC.nc000066400000000000000000000042431207233610700241060ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2006-12-12 18:23:41 $ * @author: Jan Hauer * ======================================================================== */ generic module ReadShiftC(uint8_t bits) { provides interface Read as ReadShifted; uses interface Read as ReadRaw; } implementation { command error_t ReadShifted.read() { return call ReadRaw.read(); } event void ReadRaw.readDone(error_t result, uint16_t val) { signal ReadShifted.readDone(result, (val << bits)); } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/ReadStreamShiftC.nc000066400000000000000000000052371207233610700252660ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2006-12-12 18:23:41 $ * @author: Jan Hauer * ======================================================================== */ generic module ReadStreamShiftC(uint8_t bits) { provides interface ReadStream as ReadStreamShifted; uses interface ReadStream as ReadStreamRaw; } implementation { command error_t ReadStreamShifted.postBuffer(uint16_t* buf, uint16_t count) { return call ReadStreamRaw.postBuffer(buf, count); } command error_t ReadStreamShifted.read(uint32_t usPeriod) { return call ReadStreamRaw.read(usPeriod); } event void ReadStreamRaw.bufferDone(error_t result, uint16_t* buf, uint16_t count) { uint16_t i; if (result == SUCCESS) for (i=0; i * ======================================================================== */ /** * * Please refer to TEP 109 for more information about this component and its * intended use. This component provides platform-independent access to the * RSSI sensor exported by the TDA5250 radio on the eyesIFXv{1,2} platform. * Note: The radio must be configured to output the RSSI on the pin! * * @author Jan Hauer */ #include generic configuration RssiSensorC() { provides { interface Read as Read; interface ReadNow as ReadNow; interface Resource as ReadNowResource; } } implementation { components SensorSettingsC as Settings; components new AdcReadClientC() as AdcReadClient; Read = AdcReadClient; AdcReadClient.AdcConfigure -> Settings.AdcConfigure[RSSI_SENSOR_REF_1_5V]; components new AdcReadNowClientC() as AdcReadNowClient; ReadNow = AdcReadNowClient; ReadNowResource = AdcReadNowClient; AdcReadNowClient.AdcConfigure -> Settings.AdcConfigure[RSSI_SENSOR_REF_1_5V]; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/RssiSensorVccC.nc000066400000000000000000000051671207233610700250110ustar00rootroot00000000000000/* -*- mode:c++ -*- * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:41 $ * @author: Jan Hauer * ======================================================================== */ /** * * Please refer to TEP 109 for more information about this component and its * intended use. This component provides platform-independent access to the * RSSI sensor exported by the TDA5250 radio on the eyesIFXv{1,2} platform. * Note: The radio must be configured to output the RSSI on the pin! * * @author Jan Hauer */ #include generic configuration RssiSensorVccC() { provides { interface ReadNow as ReadNow; interface Resource as ReadNowResource; } } implementation { components SensorSettingsC as Settings; components new AdcReadNowClientC() as AdcReadNowClient; ReadNow = AdcReadNowClient; ReadNowResource = AdcReadNowClient; AdcReadNowClient.AdcConfigure -> Settings.AdcConfigure[RSSI_SENSOR_VCC]; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/SensorSettingsC.nc000066400000000000000000000047151207233610700252330ustar00rootroot00000000000000/* -*- mode:c++ -*- * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2006-12-12 18:23:41 $ * @author: Jan Hauer * ======================================================================== */ /** * Default ADC channel configuration for eyesIFXv1 and eyesIFXv2. Future * eyesIFX platforms may shadow this configuration (and sensors.h) in their * respective subdirectory. * * @author Jan Hauer */ #include module SensorSettingsC { provides interface AdcConfigure as AdcConfigure[uint8_t type]; } implementation { async command const msp430adc12_channel_config_t* AdcConfigure.getConfiguration[uint8_t type]() { if (type < SENSOR_SENTINEL) return &sensorconfigurations[type]; else return &sensorconfigurations[SENSOR_SENTINEL]; } } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/TempExtSensorC.nc000066400000000000000000000060621207233610700250160ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2007-11-28 13:19:49 $ * @author: Jan Hauer * ======================================================================== */ /** * * Please refer to TEP 109 for more information about this component and its * intended use. This component provides platform-independent access to the * onboard temperature sensor on the eyesIFXv{1,2} platform. * * @author Jan Hauer */ #include generic configuration TempExtSensorC() { provides { interface Read as Read; interface ReadNow as ReadNow; interface Resource as ReadNowResource; } } implementation { components SensorSettingsC as Settings; components new AdcReadClientC() as AdcReadClient; //Read = AdcReadClient; AdcReadClient.AdcConfigure -> Settings.AdcConfigure[TEMP_SENSOR_DEFAULT]; components new AdcReadNowClientC() as AdcReadNowClient; ReadNow = AdcReadNowClient; //ReadNowResource = AdcReadNowClient; AdcReadNowClient.AdcConfigure -> Settings.AdcConfigure[TEMP_SENSOR_DEFAULT]; components HplMsp430GeneralIOC as MspGeneralIO; components new Msp430GpioC() as TEMP; TEMP -> MspGeneralIO.Port54; components TempExtSensorP; Read = TempExtSensorP.Read; TempExtSensorP.AdcRead -> AdcReadClient; ReadNowResource = TempExtSensorP.ReadNowResource; TempExtSensorP.AdcResource -> AdcReadNowClient; TempExtSensorP.TEMP -> TEMP; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/TempExtSensorP.nc000066400000000000000000000075061207233610700250370ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * @author: Philipp Huppertz (huppertz@tkn.tu-berlin.de) * ======================================================================== */ /** * The temperature sensor implementation on eyesIFX. * It just starts the sensor if there is an request and * stops when there are no open requests left * (this is done via a monitor). * * @author Philipp Huppertz * */ module TempExtSensorP { provides interface Read; provides interface Resource as ReadNowResource; uses interface GeneralIO as TEMP; uses interface Resource as AdcResource; uses interface Read as AdcRead; } implementation { uint8_t tempMonitor = 0; command error_t Read.read() { error_t error = call AdcRead.read(); if (error == SUCCESS) { atomic { if (tempMonitor == 0) { call TEMP.set(); } ++tempMonitor; } } return error; } event void AdcRead.readDone(error_t result, uint16_t val) { atomic { --tempMonitor; if (tempMonitor == 0) { call TEMP.clr(); } } signal Read.readDone(result, val); } async command error_t ReadNowResource.request() { error_t error = call AdcResource.request(); if (error == SUCCESS) { atomic { if (tempMonitor == 0) { call TEMP.set(); } ++tempMonitor; } } return error; } async command error_t ReadNowResource.immediateRequest() { error_t error = call AdcResource.immediateRequest(); if (error == SUCCESS) { atomic { if (tempMonitor == 0) { call TEMP.set(); } ++tempMonitor; } } return error; } event void AdcResource.granted() { signal ReadNowResource.granted(); } async command error_t ReadNowResource.release() { error_t error = call AdcResource.release(); if (error == SUCCESS) { atomic { --tempMonitor; if (tempMonitor == 0) { call TEMP.clr(); } } } return error; } async command bool ReadNowResource.isOwner() { return call AdcResource.isOwner(); } default event void ReadNowResource.granted() {}; } tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/sensors/sensors.h000066400000000000000000000132361207233610700234570ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2007-07-10 13:19:04 $ * @author: Jan Hauer * ======================================================================== */ #ifndef SENSORS_H #define SENSORS_H #include enum { PHOTO_SENSOR_LOW_FREQ, PHOTO_SENSOR_HIGH_FREQ, PHOTO_SENSOR_DEFAULT, PHOTO_SENSOR_VCC, TEMP_SENSOR_LOW_FREQ, TEMP_SENSOR_HIGH_FREQ, TEMP_SENSOR_DEFAULT, RSSI_SENSOR_VCC, RSSI_SENSOR_REF_1_5V, RSSI_SENSOR_DEFAULT, INTERNAL_VOLTAGE_REF_2_5V, INTERNAL_VOLTAGE_REF_2_5V_LOW_FREQ, INTERNAL_TEMP_HIGH_FREQ, INTERNAL_TEMP_LOW_FREQ, // add more entries here // last entry SENSOR_SENTINEL }; const msp430adc12_channel_config_t sensorconfigurations[] = { /* PHOTO_SENSOR_LOW_FREQ */ { INPUT_CHANNEL_A2, REFERENCE_VREFplus_AVss, REFVOLT_LEVEL_1_5, SHT_SOURCE_ACLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_4_CYCLES, SAMPCON_SOURCE_ACLK, SAMPCON_CLOCK_DIV_1 }, /* PHOTO_SENSOR_HIGH_FREQ */ { INPUT_CHANNEL_A2, REFERENCE_VREFplus_AVss, REFVOLT_LEVEL_1_5, SHT_SOURCE_SMCLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_64_CYCLES, SAMPCON_SOURCE_SMCLK, SAMPCON_CLOCK_DIV_1 }, /* PHOTO_SENSOR_DEFAULT */ { INPUT_CHANNEL_A2, REFERENCE_VREFplus_AVss, REFVOLT_LEVEL_1_5, SHT_SOURCE_SMCLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_64_CYCLES, SAMPCON_SOURCE_SMCLK, SAMPCON_CLOCK_DIV_1 }, /* PHOTO_SENSOR_VCC */ { INPUT_CHANNEL_A2, REFERENCE_AVcc_AVss, REFVOLT_LEVEL_NONE, SHT_SOURCE_SMCLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_64_CYCLES, SAMPCON_SOURCE_SMCLK, SAMPCON_CLOCK_DIV_1 }, /* TEMP_SENSOR_LOW_FREQ */ { INPUT_CHANNEL_A0, REFERENCE_VREFplus_AVss, REFVOLT_LEVEL_1_5, SHT_SOURCE_ACLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_4_CYCLES, SAMPCON_SOURCE_ACLK, SAMPCON_CLOCK_DIV_1 }, /* TEMP_SENSOR_HIGH_FREQ */ { INPUT_CHANNEL_A0, REFERENCE_VREFplus_AVss, REFVOLT_LEVEL_1_5, SHT_SOURCE_SMCLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_16_CYCLES, SAMPCON_SOURCE_SMCLK, SAMPCON_CLOCK_DIV_1 }, /* TEMP_SENSOR_DEFAULT */ { INPUT_CHANNEL_A0, REFERENCE_VREFplus_AVss, REFVOLT_LEVEL_1_5, SHT_SOURCE_ACLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_4_CYCLES, SAMPCON_SOURCE_ACLK, SAMPCON_CLOCK_DIV_1 }, /* RSSI_SENSOR_VCC */ { INPUT_CHANNEL_A3, REFERENCE_AVcc_AVss, REFVOLT_LEVEL_NONE, SHT_SOURCE_SMCLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_4_CYCLES, SAMPCON_SOURCE_SMCLK, SAMPCON_CLOCK_DIV_1 }, /* RSSI_SENSOR_REF_1_5V */ { INPUT_CHANNEL_A3, REFERENCE_VREFplus_AVss, REFVOLT_LEVEL_1_5, SHT_SOURCE_SMCLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_4_CYCLES, SAMPCON_SOURCE_SMCLK, SAMPCON_CLOCK_DIV_1 }, /* RSSI_SENSOR_DEFAULT */ { INPUT_CHANNEL_A3, REFERENCE_AVcc_AVss, REFVOLT_LEVEL_NONE, SHT_SOURCE_SMCLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_4_CYCLES, SAMPCON_SOURCE_SMCLK, SAMPCON_CLOCK_DIV_1 }, /* INTERNAL_VOLTAGE_REF_2_5V */ { SUPPLY_VOLTAGE_HALF_CHANNEL, REFERENCE_VREFplus_AVss, REFVOLT_LEVEL_2_5, SHT_SOURCE_SMCLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_32_CYCLES, SAMPCON_SOURCE_SMCLK, SAMPCON_CLOCK_DIV_1 }, /* INTERNAL_VOLTAGE_REF_2_5V_LOW_FREQ */ { SUPPLY_VOLTAGE_HALF_CHANNEL, REFERENCE_VREFplus_AVss, REFVOLT_LEVEL_2_5, SHT_SOURCE_ACLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_4_CYCLES, SAMPCON_SOURCE_ACLK, SAMPCON_CLOCK_DIV_1 }, /* INTERNAL_TEMP_HIGH_FREQ */ { TEMPERATURE_DIODE_CHANNEL, REFERENCE_VREFplus_AVss, REFVOLT_LEVEL_1_5, SHT_SOURCE_SMCLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_32_CYCLES, SAMPCON_SOURCE_SMCLK, SAMPCON_CLOCK_DIV_1 }, /* INTERNAL_TEMP_LOW_FREQ */ { TEMPERATURE_DIODE_CHANNEL, REFERENCE_VREFplus_AVss, REFVOLT_LEVEL_1_5, SHT_SOURCE_ACLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_4_CYCLES, SAMPCON_SOURCE_ACLK, SAMPCON_CLOCK_DIV_1 }, /* your stuff here */ /* SENSOR_SENTINEL */ { INPUT_CHANNEL_NONE,0,0,0,0,0,0,0 } }; #endif tinyos-2.1.2+dfsg/tos/platforms/eyesIFX/table-crc.h000066400000000000000000000057641207233610700221320ustar00rootroot00000000000000/* * CRC LOOKUP TABLE * ================ * The following CRC lookup table was generated automagically * by the Rocksoft^tm Model CRC Algorithm Table Generation * Program V1.0 * For more information on the Rocksoft^tm Model CRC Algorithm, * see the document titled "A Painless Guide to CRC Error * Detection Algorithms" by Ross Williams * (ross@guest.adelaide.edu.au.). This document is likely to be * in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft". * * (Nowadays look at: http://www.ross.net/crc/crcpaper.html) * */ #ifndef CRC_H #define CRC_H uint16_t const ccitt_crc16_table[256] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 }; uint16_t crcByte(uint16_t fcs, uint8_t c) { fcs = ccitt_crc16_table[(fcs >> 8 ^ c) & 0xffU] ^ (fcs << 8); return fcs; } #endif tinyos-2.1.2+dfsg/tos/platforms/intelmote2/000077500000000000000000000000001207233610700206575ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/intelmote2/.platform000066400000000000000000000031071207233610700225050ustar00rootroot00000000000000# # FILE: intelmote2/.platform # # Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. # # $Id: .platform,v 1.9 2009-12-18 23:31:09 jgko Exp $ # push ( @includes, qw( %T/platforms/intelmote2 %T/platforms/intelmote2/chips/cc2420 %T/platforms/intelmote2/chips/da9030 %T/platforms/intelmote2/chips/ds2745 %T/chips/cc2420 %T/chips/cc2420/alarm %T/chips/cc2420/control %T/chips/cc2420/csma %T/chips/cc2420/interfaces %T/chips/cc2420/link %T/chips/cc2420/lowpan %T/chips/cc2420/lpl %T/chips/cc2420/packet %T/chips/cc2420/receive %T/chips/cc2420/spi %T/chips/cc2420/transmit %T/chips/cc2420/unique %T/chips/cc2420/security %T/chips/pxa27x %T/chips/pxa27x/lib %T/chips/pxa27x/timer %T/chips/pxa27x/gpio %T/chips/pxa27x/dma %T/chips/pxa27x/ssp %T/chips/pxa27x/i2c %T/chips/pxa27x/uart %T/chips/pxa27x/p30 %T/chips/pxa27x/ds2745 %T/chips/pxa27x/cif %T/lib/timer %T/lib/serial %T/lib/gpio ) ); @opts = qw( -gcc=xscale-elf-gcc -nostartfiles -fnesc-target=env -fnesc-no-debug ); push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{NESC_MACHINE} = "structure_size_boundary=32, pointer=4,4 float=4,4 double=8,4 long_double=8,4 short=2,2 int=4,4 long=4,4 long_long=8,4 int1248_align=1,2,4,4 wchar_size_size=4,4 char_wchar_signed=false,true"; tinyos-2.1.2+dfsg/tos/platforms/intelmote2/ActiveMessageC.nc000066400000000000000000000060671207233610700240350ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.7 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.7 2010-06-29 22:07:53 scipio Exp $ * */ /** * * The Active Message layer on the intelmote2 platform. This is a naming wrapper * around the CC2420 Active Message layer. * * @author Philip Levis * @date June 19 2005 */ configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2420ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/BlockStorageC.nc000066400000000000000000000041251207233610700236650ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the block storage abstraction for the pxa271 * embedded flash. * * @author Philip Buonadonna * @author Kaisen Lin * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:42 $ */ generic configuration BlockStorageC( volume_id_t volume_id ) { provides interface BlockRead; provides interface BlockWrite; } implementation { enum { BLOCK_ID = unique( "pxa271p30.Block" ), }; components P30BlockC as BlockC; BlockRead = BlockC.Read[ volume_id ]; BlockWrite = BlockC.Write[ volume_id ]; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/ConfigStorageC.nc000066400000000000000000000040061207233610700240360ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Configuration component for storage management on the PXA271 * * @author KaisenLin * @author Phil Buonadonna */ generic configuration ConfigStorageC(volume_id_t vol_id) { provides interface Mount; provides interface ConfigStorage; } implementation { enum { CONFIG_ID = unique( "pxa271p30.Config" ), }; components P30ConfigC as ConfigC; ConfigStorage = ConfigC.ConfigStorage[ vol_id ]; Mount = ConfigC.Mount[ vol_id ]; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/DemoSensorC.nc000066400000000000000000000045371207233610700233730ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorC on the Intel Mote v2 provides a * voltage reading from the da9030 PMIC. * * Conversion from ADC reading to voltage: * VBAT = (2.65/256)*(ADC) + 2.65 * * @author Gilman Tolle * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:42 $ * */ generic configuration DemoSensorC() { provides interface Read; } implementation { components DemoSensorP; components PMICC; Read = DemoSensorP; DemoSensorP.PMIC -> PMICC.PMIC; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/DemoSensorP.nc000066400000000000000000000041121207233610700233750ustar00rootroot00000000000000/* $Id: DemoSensorP.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * @author Phil Buonadonna */ module DemoSensorP { provides interface Read as Read; uses interface PMIC; } implementation { task void doRead(); command error_t Read.read() { post doRead(); return SUCCESS; } task void doRead() { error_t error; uint8_t value; atomic { error = call PMIC.getBatteryVoltage(&value); } if (error != SUCCESS) value = 0; signal Read.readDone(SUCCESS, (uint16_t)value); } } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/HilTimerMilliC.nc000066400000000000000000000047231207233610700240160ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Phil Buonadonna * */ #include "Timer.h" configuration HilTimerMilliC { provides interface Init; provides interface Timer as TimerMilli[ uint8_t num ]; provides interface LocalTime; } implementation { components new VirtualizeTimerC(TMilli,uniqueCount(UQ_TIMER_MILLI)) as VirtTimersMilli32; components new AlarmToTimerC(TMilli) as AlarmToTimerMilli32; components new HalPXA27xAlarmM(TMilli,2) as PhysAlarmMilli32; components HalPXA27xOSTimerMapC; components CounterMilliC; enum {OST_CLIENT_ID = unique("PXA27xOSTimer.Resource")}; Init = PhysAlarmMilli32; TimerMilli = VirtTimersMilli32.Timer; LocalTime = CounterMilliC; VirtTimersMilli32.TimerFrom -> AlarmToTimerMilli32.Timer; AlarmToTimerMilli32.Alarm -> PhysAlarmMilli32.Alarm; PhysAlarmMilli32.OSTInit -> HalPXA27xOSTimerMapC.Init; PhysAlarmMilli32.OSTChnl -> HalPXA27xOSTimerMapC.OSTChnl[OST_CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/IM2InitSerialP.nc000066400000000000000000000041711207233610700236770ustar00rootroot00000000000000/* $Id: IM2InitSerialP.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna * */ module IM2InitSerialP { provides interface Init; uses { interface HplPXA27xGPIOPin as TXD; interface HplPXA27xGPIOPin as RXD; } } implementation { command error_t Init.init() { call TXD.setGAFRpin(STUART_TXD_ALTFN); call TXD.setGPDRbit(TRUE); call RXD.setGAFRpin(STUART_RXD_ALTFN); call RXD.setGPDRbit(FALSE); return SUCCESS; } async event void TXD.interruptGPIOPin() { return;} async event void RXD.interruptGPIOPin() { return;} } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/LocalIeeeEui64C.nc000066400000000000000000000044111207233610700237430ustar00rootroot00000000000000// $Id: LocalIeeeEui64C.nc,v 1.1 2010/02/23 06:45:38 sdhsdh Exp $ /* /* * Copyright (c) 2011 Stanford University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Philip Levis * Dummy Extended Address for intelmote2, copied from micaz code. */ #include "IeeeEui64.h" module LocalIeeeEui64C { provides interface LocalIeeeEui64; } implementation { command ieee_eui64_t LocalIeeeEui64.getId() { /* This code uses UC Berkeley's OUI; Berkeley * allows it to be used as long as bytes 3 and * 4 are 'LO' for local. */ ieee_eui64_t id; id.data[0] = 0x00; id.data[1] = 0x12; id.data[2] = 0x6d; id.data[3] = 'L'; id.data[4] = 'O'; id.data[5] = 0; id.data[6] = TOS_NODE_ID >> 8; id.data[7] = TOS_NODE_ID & 0xff; return id; } } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/LogStorageC.nc000066400000000000000000000040151207233610700233520ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Kaisen Lin * @author Phil Buonadonna * */ generic configuration LogStorageC( volume_id_t volume_id, bool circular ) { provides interface LogRead; provides interface LogWrite; } implementation { enum { LOG_ID = unique( "pxa271p30.Log" ), }; components P30LogC as LogC; LogRead = LogC.Read[ volume_id ]; LogWrite = LogC.Write[ volume_id ]; components new P30LogCircularP(circular); LogC.Circular[ volume_id ] -> P30LogCircularP.Circular; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/PlatformC.nc000066400000000000000000000037211207233610700230730ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Philip Buonadonna */ #include "hardware.h" configuration PlatformC { provides interface Init; provides interface PlatformReset; } implementation { components PlatformP,PMICC; components HplPXA27xOSTimerC; Init = PlatformP; PlatformReset = PlatformP; PlatformP.PMICInit -> PMICC.Init; PlatformP.OST0M3 -> HplPXA27xOSTimerC.OST0M3; PlatformP.PXA27xWD -> HplPXA27xOSTimerC.OSTWDCntl; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/PlatformLedsC.nc000066400000000000000000000037761207233610700237150ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Philip Buonadonna */ #include "hardware.h" configuration PlatformLedsC { provides interface GeneralIO as Led0; provides interface GeneralIO as Led1; provides interface GeneralIO as Led2; uses interface Init; } implementation { components GeneralIOC; components PlatformP; Init = PlatformP.InitL3; Led0 = GeneralIOC.GeneralIO[RED_LED_PIN]; Led1 = GeneralIOC.GeneralIO[GREEN_LED_PIN]; Led2 = GeneralIOC.GeneralIO[BLUE_LED_PIN]; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/PlatformP.nc000066400000000000000000000106061207233610700231100ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Philip Buonadonna */ #include "hardware.h" module PlatformP { provides interface Init; provides interface PlatformReset; uses { interface Init as InitL0; interface Init as InitL1; interface Init as InitL2; interface Init as InitL3; interface Init as PMICInit; } uses interface HplPXA27xOSTimer as OST0M3; uses interface HplPXA27xOSTimerWatchdog as PXA27xWD; } implementation { //void enableICache() @C(); command error_t Init.init() { // Enable clocks to critical components CKEN = (CKEN22_MEMC | CKEN20_IMEM | CKEN15_PMI2C | CKEN9_OST); // Set the arbiter to something meaningful for this platform ARB_CNTL = (ARB_CNTL_CORE_PARK | ARB_CNTL_LCD_WT(0) | ARB_CNTL_DMA_WT(1) | ARB_CNTL_CORE_WT(4)); OSCC = (OSCC_OON); while ((OSCC & OSCC_OOK) == 0); TOSH_SET_PIN_DIRECTIONS(); // Enable access to CP6 (Interrupt Controller processor) // Enable access to Intel WMMX enhancements asm volatile ("mcr p15,0,%0,c15,c1,0\n\t": : "r" (0x43)); #ifdef PXA27X_13M // Place PXA27X into 13M w/ PPLL enabled... // other bits are ignored...but might be useful later CCCR = (CCCR_CPDIS | CCCR_L(8) | CCCR_2N(2) | CCCR_A); asm volatile ( "mcr p14,0,%0,c6,c0,0\n\t" : : "r" (CLKCFG_F) ); #else // Place PXA27x into 104/104 MHz mode CCCR = CCCR_L(8) | CCCR_2N(2) | CCCR_A; asm volatile ( "mcr p14,0,%0,c6,c0,0\n\t" : : "r" (CLKCFG_B | CLKCFG_F | CLKCFG_T) ); #endif // Initialize Memory/Flash subsystems SA1110 = SA1110_SXSTACK(1); MSC0 = MSC0 | MSC_RBW024 | MSC_RBUFF024 | MSC_RT024(2) ; MSC1 = MSC1 | MSC_RBW024; MSC2 = MSC2 | MSC_RBW024; MECR = 0; // PXA271 Required initialization settings MDCNFG = (MDCNFG_SETALWAYS | MDCNFG_DTC2(0x3) | MDCNFG_STACK0 | MDCNFG_DTC0(0x3) | MDCNFG_DNB0 | MDCNFG_DRAC0(0x2) | MDCNFG_DCAC0(0x1) | MDCNFG_DWID0 /* | MDCNFG_DE0 */); MDREFR = (MDREFR & ~(MDREFR_K0DB4 | MDREFR_K0DB2)) | MDREFR_K0DB2; enableICache(); initSyncFlash(); // Place all global platform initialization before this command. // return call SubInit.init(); call InitL0.init(); call InitL1.init(); call InitL2.init(); call InitL3.init(); //call PMICInit.init(); return SUCCESS; } async command void PlatformReset.reset() { call OST0M3.setOSMR(call OST0M3.getOSCR() + 1000); call PXA27xWD.enableWatchdog(); while (1); return; // Should never get here. } async event void OST0M3.fired() { call OST0M3.setOIERbit(FALSE); call OST0M3.clearOSSRbit(); return; } default command error_t InitL0.init() { return SUCCESS; } default command error_t InitL1.init() { return SUCCESS; } default command error_t InitL2.init() { return SUCCESS; } default command error_t InitL3.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/PlatformReset.nc000066400000000000000000000031451207233610700237730ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ interface PlatformReset { async command void reset(); } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/PlatformResetC.nc000066400000000000000000000033371207233610700241010ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * @author Philip Buonadonna */ configuration PlatformResetC { provides interface PlatformReset; } implementation { components PlatformC; PlatformReset = PlatformC; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/PlatformSerialC.nc000066400000000000000000000055201207233610700242320ustar00rootroot00000000000000/* $Id: PlatformSerialC.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna * */ configuration PlatformSerialC { provides interface StdControl; provides interface UartByte; provides interface UartStream; } implementation { components new HalPXA27xSerialP(115200); components HplPXA27xSTUARTC; components HplPXA27xGPIOC; components IM2InitSerialP; StdControl = HalPXA27xSerialP; UartByte = HalPXA27xSerialP; UartStream = HalPXA27xSerialP; HalPXA27xSerialP.UARTInit -> HplPXA27xSTUARTC.Init; HalPXA27xSerialP.UART -> HplPXA27xSTUARTC.STUART; IM2InitSerialP.TXD -> HplPXA27xGPIOC.HplPXA27xGPIOPin[STUART_TXD]; IM2InitSerialP.RXD -> HplPXA27xGPIOC.HplPXA27xGPIOPin[STUART_RXD]; components PlatformP; IM2InitSerialP.Init <- PlatformP.InitL2; HalPXA27xSerialP.Init <- PlatformP.InitL3; components new HplPXA27xDMAInfoC(19, (uint32_t) &STRBR) as DMAInfoRx; components new HplPXA27xDMAInfoC(20, (uint32_t) &STTHR) as DMAInfoTx; components HplPXA27xDMAC; // how are these channels picked? HalPXA27xSerialP.TxDMA -> HplPXA27xDMAC.HplPXA27xDMAChnl[2]; HalPXA27xSerialP.RxDMA -> HplPXA27xDMAC.HplPXA27xDMAChnl[3]; DMAInfoRx.HplPXA27xDMAInfo <- HalPXA27xSerialP.UARTRxDMAInfo; DMAInfoTx.HplPXA27xDMAInfo <- HalPXA27xSerialP.UARTTxDMAInfo; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/TimeSyncMessageC.nc000066400000000000000000000064611207233610700243530ustar00rootroot00000000000000// $Id: TimeSyncMessageC.nc,v 1.2 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * The Active Message layer on the intelmote2 platform. This is a naming wrapper * around the CC2420 Active Message layer that implemets timesync interface (TEP 133). * * @author Philip Levis * @author Brano Kusy * @date June 19 2005 */ configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSend32khz[am_id_t id]; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC2420TimeSyncMessageC as AM; SplitControl = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; TimeSyncAMSend32khz = AM; TimeSyncAMSendMilli = AM; TimeSyncPacket32khz = AM; TimeSyncPacketMilli = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; }tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/000077500000000000000000000000001207233610700217655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/cc2420/000077500000000000000000000000001207233610700226625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/cc2420/HplCC2420AlarmC.nc000066400000000000000000000040131207233610700255230ustar00rootroot00000000000000/* $Id: HplCC2420AlarmC.nc,v 1.5 2008-06-11 00:42:14 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ generic configuration HplCC2420AlarmC() { provides interface Init; //provides interface Alarm as Alarm32khz16; provides interface Alarm as Alarm32khz32; } implementation { components new Alarm32khzC(); Init = Alarm32khzC; //Alarm32khz16 = Alarm32khzC.Alarm32khz16; Alarm32khz32 = Alarm32khzC.Alarm32khz32; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/cc2420/HplCC2420InterruptsC.nc000066400000000000000000000041751207233610700266570ustar00rootroot00000000000000/* $Id: HplCC2420InterruptsC.nc,v 1.5 2008-06-11 00:42:14 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ configuration HplCC2420InterruptsC { provides interface GpioCapture as CaptureSFD; provides interface GpioInterrupt as InterruptCCA; provides interface GpioInterrupt as InterruptFIFOP; } implementation { components GeneralIOC; components new SoftCaptureC(); CaptureSFD = SoftCaptureC.GpioCapture; InterruptCCA = GeneralIOC.GpioInterrupt[CC2420_CCA_PIN]; InterruptFIFOP = GeneralIOC.GpioInterrupt[CC2420_FIFOP_PIN]; SoftCaptureC.GpioInterrupt -> GeneralIOC.GpioInterrupt[CC2420_SFD_PIN]; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/cc2420/HplCC2420PinsC.nc000066400000000000000000000045211207233610700254040ustar00rootroot00000000000000/* $Id: HplCC2420PinsC.nc,v 1.5 2008-06-11 00:42:14 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ configuration HplCC2420PinsC { provides interface GeneralIO as CCA; provides interface GeneralIO as CSN; provides interface GeneralIO as FIFO; provides interface GeneralIO as FIFOP; provides interface GeneralIO as RSTN; provides interface GeneralIO as SFD; provides interface GeneralIO as VREN; } implementation { components GeneralIOC; CCA = GeneralIOC.GeneralIO[CC2420_CCA_PIN]; CSN = GeneralIOC.GeneralIO[CC2420_CSN_PIN]; FIFO = GeneralIOC.GeneralIO[CC2420_FIFO_PIN]; FIFOP = GeneralIOC.GeneralIO[CC2420_FIFOP_PIN]; RSTN = GeneralIOC.GeneralIO[CC2420_RSTN_PIN]; SFD = GeneralIOC.GeneralIO[CC2420_SFD_PIN]; VREN = GeneralIOC.GeneralIO[CC2420_VREN_PIN]; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/cc2420/HplCC2420SpiC.nc000066400000000000000000000041461207233610700252310ustar00rootroot00000000000000/* $Id: HplCC2420SpiC.nc,v 1.5 2008-06-11 00:42:14 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ generic configuration HplCC2420SpiC() { provides interface Resource; provides interface SpiByte; provides interface SpiPacket; } implementation { enum { SPI_CLIENT_ID = unique("CC2420SpiClient") }; components IM2CC2420SpiP; Resource = IM2CC2420SpiP.Resource[SPI_CLIENT_ID]; SpiByte = IM2CC2420SpiP.SpiByte; SpiPacket = IM2CC2420SpiP.SpiPacket[SPI_CLIENT_ID]; components PlatformP; IM2CC2420SpiP.Init <- PlatformP.InitL3; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/cc2420/IM2CC2420InitSpiP.nc000066400000000000000000000044511207233610700257350ustar00rootroot00000000000000/* $Id: IM2CC2420InitSpiP.nc,v 1.5 2008-06-11 00:42:14 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ module IM2CC2420InitSpiP { provides interface Init; uses { interface HplPXA27xGPIOPin as SCLK; interface HplPXA27xGPIOPin as TXD; interface HplPXA27xGPIOPin as RXD; } } implementation { command error_t Init.init() { call SCLK.setGAFRpin(SSP3_SCLK_ALTFN); call SCLK.setGPDRbit(TRUE); call TXD.setGAFRpin(SSP3_TXD_ALTFN); call TXD.setGPDRbit(TRUE); call RXD.setGAFRpin(SSP3_RXD_ALTFN); call RXD.setGPDRbit(FALSE); return SUCCESS; } async event void SCLK.interruptGPIOPin() { return;} async event void TXD.interruptGPIOPin() { return;} async event void RXD.interruptGPIOPin() { return;} } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/cc2420/IM2CC2420SpiP.nc000066400000000000000000000056111207233610700251100ustar00rootroot00000000000000/* $Id: IM2CC2420SpiP.nc,v 1.6 2008-06-11 00:42:14 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna */ configuration IM2CC2420SpiP { provides interface Init; provides interface Resource[uint8_t id]; provides interface SpiByte; provides interface SpiPacket[uint8_t instance]; } implementation { components new SimpleFcfsArbiterC("CC2420SpiClient") as FcfsArbiterC; //components new HalPXA27xSpiDMAC(1,0x7,FALSE) as HalPXA27xSpiM; // 6.5 Mbps, 8bit width components new HalPXA27xSpiPioC(1,0x7,FALSE) as HalPXA27xSpiM; // 6.5 Mbps, 8bit width components IM2CC2420InitSpiP; components HplPXA27xSSP3C; components HplPXA27xDMAC; components HplPXA27xGPIOC; components PlatformP; Init = IM2CC2420InitSpiP; Init = HalPXA27xSpiM.Init; SpiByte = HalPXA27xSpiM; SpiPacket = HalPXA27xSpiM; Resource = FcfsArbiterC; IM2CC2420InitSpiP.SCLK -> HplPXA27xGPIOC.HplPXA27xGPIOPin[SSP3_SCLK]; IM2CC2420InitSpiP.TXD -> HplPXA27xGPIOC.HplPXA27xGPIOPin[SSP3_TXD]; IM2CC2420InitSpiP.RXD -> HplPXA27xGPIOC.HplPXA27xGPIOPin[SSP3_RXD]; //HalPXA27xSpiM.RxDMA -> HplPXA27xDMAC.HplPXA27xDMAChnl[0]; //HalPXA27xSpiM.TxDMA -> HplPXA27xDMAC.HplPXA27xDMAChnl[1]; //HalPXA27xSpiM.SSPRxDMAInfo -> HplPXA27xSSP3C.SSPRxDMAInfo; //HalPXA27xSpiM.SSPTxDMAInfo -> HplPXA27xSSP3C.SSPTxDMAInfo; HalPXA27xSpiM.SSP -> HplPXA27xSSP3C.HplPXA27xSSP; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/da9030/000077500000000000000000000000001207233610700226655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/da9030/PMIC.nc000066400000000000000000000046231207233610700237440ustar00rootroot00000000000000/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * Authors: Lama Nachman, Robert Adler */ interface PMIC { /* * Set the voltage of the regulator controling the core * * @param core voltage specified in one of the supported trim values * * @return none */ command error_t setCoreVoltage(uint8_t trimValue); command error_t shutDownLDOs(); command error_t getBatteryVoltage(uint8_t *val); command error_t enableAutoCharging(bool enable); command error_t enableManualCharging(bool enable); command error_t chargingStatus(uint8_t *vBat, uint8_t *vChg, uint8_t *iChg); } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/da9030/PMICC.nc000066400000000000000000000077261207233610700240560ustar00rootroot00000000000000/* $Id: PMICC.nc,v 1.6 2008-06-11 00:46:26 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * * Authors: Lama Nachman, Robert Adler */ configuration PMICC{ provides{ interface Init; interface PMIC; } } implementation{ components PMICM; components new TimerMilliC(); components HplPXA27xPI2CC, HplPXA27xGPIOC; components PlatformP; Init = PMICM; PMIC = PMICM; PMICM.Init <- PlatformP.InitL2; PMICM.chargeMonitorTimer -> TimerMilliC; PMICM.PMICGPIO -> HplPXA27xGPIOC.HplPXA27xGPIOPin[1]; PMICM.PI2C -> HplPXA27xPI2CC.I2C; PMICM.PlatformReset -> PlatformP.PlatformReset; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/da9030/PMICM.nc000066400000000000000000000332111207233610700240540ustar00rootroot00000000000000/* $Id: PMICM.nc,v 1.7 2008-06-11 00:46:26 razvanm Exp $ */ /* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * * Authors: Lama Nachman, Robert Adler */ #define START_RADIO_LDO 1 #define START_SENSOR_BOARD_LDO 1 /* * VCC_MEM is connected to BUCK2 by default, make sure you have a board * that has the right resistor settings before disabling BUCK2 */ #define DISABLE_BUCK2 0 //#include "trace.h" #include "Timer.h" #include "pmic.h" module PMICM { provides{ interface Init; interface PMIC; } uses interface Timer as chargeMonitorTimer; uses interface HplPXA27xGPIOPin as PMICGPIO; uses interface HplPXA27xI2C as PI2C; uses interface PlatformReset; } implementation { #include "pmic.h" bool gotReset; error_t readPMIC(uint8_t address, uint8_t *value, uint8_t numBytes){ //send the PMIC the address that we want to read if(numBytes > 0){ call PI2C.setIDBR(PMIC_SLAVE_ADDR<<1); call PI2C.setICR(call PI2C.getICR() | ICR_START); call PI2C.setICR(call PI2C.getICR() | ICR_TB); while(call PI2C.getICR() & ICR_TB); //actually send the address terminated with a STOP call PI2C.setIDBR(address); call PI2C.setICR(call PI2C.getICR() & ~ICR_START); call PI2C.setICR(call PI2C.getICR() | ICR_STOP); call PI2C.setICR(call PI2C.getICR() | ICR_TB); while(call PI2C.getICR() & ICR_TB); call PI2C.setICR(call PI2C.getICR() & ~ICR_STOP); //actually request the read of the data call PI2C.setIDBR(PMIC_SLAVE_ADDR<<1 | 1); call PI2C.setICR(call PI2C.getICR() | ICR_START); call PI2C.setICR(call PI2C.getICR() | ICR_TB); while(call PI2C.getICR() & ICR_TB); call PI2C.setICR(call PI2C.getICR() & ~ICR_START); //using Page Read Mode while (numBytes > 1){ call PI2C.setICR(call PI2C.getICR() | ICR_TB); while(call PI2C.getICR() & ICR_TB); *value = call PI2C.getIDBR(); value++; numBytes--; } call PI2C.setICR(call PI2C.getICR() | ICR_STOP); call PI2C.setICR(call PI2C.getICR() | ICR_ACKNAK); call PI2C.setICR(call PI2C.getICR() | ICR_TB); while(call PI2C.getICR() & ICR_TB); *value = call PI2C.getIDBR(); call PI2C.setICR(call PI2C.getICR() & ~ICR_STOP); call PI2C.setICR(call PI2C.getICR() & ~ICR_ACKNAK); return SUCCESS; } else{ return FAIL; } } error_t writePMIC(uint8_t address, uint8_t value){ call PI2C.setIDBR(PMIC_SLAVE_ADDR<<1); call PI2C.setICR(call PI2C.getICR() | ICR_START); call PI2C.setICR(call PI2C.getICR() | ICR_TB); while(call PI2C.getICR() & ICR_TB); PIDBR = address; call PI2C.setICR(call PI2C.getICR() & ~ICR_START); call PI2C.setICR(call PI2C.getICR() | ICR_TB); while(call PI2C.getICR() & ICR_TB); PIDBR = value; call PI2C.setICR(call PI2C.getICR() | ICR_STOP); call PI2C.setICR(call PI2C.getICR() | ICR_TB); while(call PI2C.getICR() & ICR_TB); call PI2C.setICR(call PI2C.getICR() & ~ICR_STOP); PICR &= ~ICR_STOP; return SUCCESS; } void startLDOs() { //uint8_t temp; uint8_t oldVal, newVal; #if START_SENSOR_BOARD_LDO // TODO : Need to move out of here to sensor board functions readPMIC(PMIC_A_REG_CONTROL_1, &oldVal, 1); newVal = oldVal | ARC1_LDO10_EN | ARC1_LDO11_EN; // sensor board writePMIC(PMIC_A_REG_CONTROL_1, newVal); readPMIC(PMIC_B_REG_CONTROL_2, &oldVal, 1); newVal = oldVal | BRC2_LDO10_EN | BRC2_LDO11_EN; writePMIC(PMIC_B_REG_CONTROL_2, newVal); #endif #if START_RADIO_LDO // TODO : Move to radio start readPMIC(PMIC_B_REG_CONTROL_1, &oldVal, 1); newVal = oldVal | BRC1_LDO5_EN; writePMIC(PMIC_B_REG_CONTROL_1, newVal); #endif #if DISABLE_BUCK2 // Disable BUCK2 if VCC_MEM is not configured to use BUCK2 readPMIC(PMIC_B_REG_CONTROL_1, &oldVal, 1); newVal = oldVal & ~BRC1_BUCK_EN; writePMIC(PMIC_B_REG_CONTROL_1, newVal); #endif #if 0 // Configure above LDOs, Radio and sensor board LDOs to turn off in sleep // TODO : Sleep setting doesn't work temp = BSC1_LDO1(1) | BSC1_LDO2(1) | BSC1_LDO3(1) | BSC1_LDO4(1); writePMIC(PMIC_B_SLEEP_CONTROL_1, temp); temp = BSC2_LDO5(1) | BSC2_LDO7(1) | BSC2_LDO8(1) | BSC2_LDO9(1); writePMIC(PMIC_B_SLEEP_CONTROL_2, temp); temp = BSC3_LDO12(1); writePMIC(PMIC_B_SLEEP_CONTROL_3, temp); #endif } error_t startPMICstuff() { //command result_t StdControl.start(){ XXX-pb //init unit uint8_t val[3]; //call PI2CInterrupt.enable(); XXX-pb } command error_t Init.init(){ uint8_t val[3]; PCFR |= PCFR_PI2C_EN; // Overrides GPIO settings on pins call PI2C.setICR(call PI2C.getICR() | (ICR_IUE | ICR_SCLE)); atomic{ gotReset=FALSE; } call PMICGPIO.setGAFRpin(0); call PMICGPIO.setGPDRbit(FALSE); call PMICGPIO.setGFERbit(TRUE); /* * Reset the watchdog, switch it to an interrupt, so we can disable it * Ignore SLEEP_N pin, enable H/W reset via button */ writePMIC(PMIC_SYS_CONTROL_A, SCA_RESET_WDOG | SCA_WDOG_ACTION | SCA_HWRES_EN); // Disable all interrupts from PMIC except for ONKEY button writePMIC(PMIC_IRQ_MASK_A, ~IMA_ONKEY_N); writePMIC(PMIC_IRQ_MASK_B, 0xFF); writePMIC(PMIC_IRQ_MASK_C, 0xFF); //read out the EVENT registers so that we can receive interrupts readPMIC(PMIC_EVENTS, val, 3); // Set default core voltage to 0.85 V #ifdef PXA27X_13M //P85 is not reliable, using P95 call PMIC.setCoreVoltage(B2R1_TRIM_P95_V); #else call PMIC.setCoreVoltage(B2R1_TRIM_1_25_V); #endif startLDOs(); return SUCCESS; } async event void PI2C.interruptI2C() { //PI2CInterrupt.fired(){ uint32_t status, update=0; status = call PI2C.getISR(); //PISR; if(status & ISR_ITE){ update |= ISR_ITE; //trace(DBG_USR1,"sent data"); } if(status & ISR_BED){ update |= ISR_BED; //trace(DBG_USR1,"bus error"); } call PI2C.setISAR(update); //PISR = update; } async event void PMICGPIO.interruptGPIOPin(){ uint8_t events[3]; bool localGotReset; //call PMICGPIO.call PMICInterrupt.clear(); XXX autocleard by GPIO module readPMIC(PMIC_EVENTS, events, 3); if(events[EVENTS_A_OFFSET] & EA_ONKEY_N){ atomic{ localGotReset = gotReset; } if(localGotReset==TRUE){ call PlatformReset.reset(); } else{ atomic{ gotReset=TRUE; } } } else{ //trace(DBG_USR1,"PMIC EVENTs =%#x %#x %#x\r\n",events[0], events[1], events[2]); } } /* * The Buck2 controls the core voltage, set to appropriate trim value */ command error_t PMIC.setCoreVoltage(uint8_t trimValue) { writePMIC(PMIC_BUCK2_REG1, (trimValue & B2R1_TRIM_MASK) | B2R1_GO); return SUCCESS; } command error_t PMIC.shutDownLDOs() { uint8_t temp; uint8_t oldVal, newVal; /* * Shut down all LDOs that are not controlled by the sleep mode * Note, we assume here the LDO10 & LDO11 (sensor board) will be off * Should be moved to sensor board control */ // LDO1, LDO4, LDO6, LDO7, LDO8, LDO9, LDO10, LDO 11, LDO13, LDO14 readPMIC(PMIC_A_REG_CONTROL_1, &oldVal, 1); newVal = oldVal & ~ARC1_LDO13_EN & ~ARC1_LDO14_EN; newVal = newVal & ~ARC1_LDO10_EN & ~ARC1_LDO11_EN; // sensor board writePMIC(PMIC_A_REG_CONTROL_1, newVal); readPMIC(PMIC_B_REG_CONTROL_1, &oldVal, 1); newVal = oldVal & ~BRC1_LDO1_EN & ~BRC1_LDO4_EN & ~BRC1_LDO5_EN & ~BRC1_LDO6_EN & ~BRC1_LDO7_EN; writePMIC(PMIC_B_REG_CONTROL_1, newVal); readPMIC(PMIC_B_REG_CONTROL_2, &oldVal, 1); newVal = oldVal & ~BRC2_LDO8_EN & ~BRC2_LDO9_EN & ~BRC2_LDO10_EN & ~BRC2_LDO11_EN & ~BRC2_LDO14_EN & ~BRC2_SIMCP_EN; writePMIC(PMIC_B_REG_CONTROL_2, newVal); return SUCCESS; } error_t getPMICADCVal(uint8_t channel, uint8_t *val){ uint8_t oldval; error_t rval; //read out the old value so that we can reset at the end rval = readPMIC(PMIC_ADC_MAN_CONTROL, &oldval,1); if (rval == SUCCESS) { rval = writePMIC(PMIC_ADC_MAN_CONTROL, PMIC_AMC_ADCMUX(channel) | PMIC_AMC_MAN_CONV | PMIC_AMC_LDO_INT_Enable); } if (rval == SUCCESS) { rval = readPMIC(PMIC_MAN_RES,val,1); } if (rval == SUCCESS) { //reset to old state rval = writePMIC(PMIC_ADC_MAN_CONTROL, oldval); } return rval; } command error_t PMIC.getBatteryVoltage(uint8_t *val){ //for now, let's use the manual conversion mode return getPMICADCVal(0, val); } command error_t PMIC.chargingStatus(uint8_t *vBat, uint8_t *vChg, uint8_t *iChg){ getPMICADCVal(0, vBat); getPMICADCVal(2, vChg); getPMICADCVal(1, iChg); return SUCCESS; } command error_t PMIC.enableAutoCharging(bool enable){ return SUCCESS; } command error_t PMIC.enableManualCharging(bool enable){ //just turn on or off the LED for now!! uint8_t val; if(enable){ //want to turn on the charger getPMICADCVal(2, &val); //if charger is present due some stuff...75 should be 4.65V or so if(val > 75 ) { //trace(DBG_USR1,"Charger Voltage is %.3fV...enabling charger...\r\n", ((val*6) * .01035)); //write the total timeout to be 8 hours writePMIC(PMIC_TCTR_CONTROL,8); //enable the charger at 100mA and 4.35V writePMIC(PMIC_CHARGE_CONTROL,PMIC_CC_CHARGE_ENABLE | PMIC_CC_ISET(1) | PMIC_CC_VSET(7)); //turn on the LED writePMIC(PMIC_LED1_CONTROL,0x80); //start a timer to monitor our progress every 5 minutes! call chargeMonitorTimer.startPeriodic(300000); } else{ //trace(DBG_USR1,"Charger Voltage is %.3fV...charger not enabled\r\n", ((val*6) * .01035)); } } else{ //turn off the charger and the LED call PMIC.getBatteryVoltage(&val); //trace(DBG_USR1,"Disabling Charger...Battery Voltage is %.3fV\r\n", (val * .01035) + 2.65); //disable everything that we enabled writePMIC(PMIC_TCTR_CONTROL,0); writePMIC(PMIC_CHARGE_CONTROL,0); writePMIC(PMIC_LED1_CONTROL,0x00); } return SUCCESS; } event void chargeMonitorTimer.fired(){ uint8_t val; call PMIC.getBatteryVoltage(&val); //stop when vBat>4V if(val>130){ call PMIC.enableManualCharging(FALSE); call chargeMonitorTimer.stop(); } return; } } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/da9030/pmic.h000066400000000000000000000177471207233610700240060ustar00rootroot00000000000000/* * * * Copyright (c) 2000-2002 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * * Authors: Lama Nachman, Robbie Adler * * This file includes the PMIC command defintions. We are using the Dialog * DA9030 part. * */ #ifndef PMIC_H #define PMIC_H // I2C slave addr #define PMIC_SLAVE_ADDR 0x49 // Register BUCK2 with DVC1 #define PMIC_BUCK2_REG1 0x15 // Register BUCK2 with DVC2 #define PMIC_BUCK2_REG2 0x16 // LDO on/off control in App Reg space #define PMIC_A_REG_CONTROL_1 0x17 #define PMIC_A_REG_CONTROL_2 0x18 #define PMIC_EVENTS (0x01) // 3 byte array #define PMIC_EVENTA (0x01) #define PMIC_EVENTB (0x02) #define PMIC_EVENTC (0x03) #define PMIC_STATUS (0x04) #define PMIC_IRQ_MASK_A (0x05) #define PMIC_IRQ_MASK_B (0x06) #define PMIC_IRQ_MASK_C (0x07) #define PMIC_SYS_CONTROL_A (0x08) #define PMIC_SYS_CONTROL_C (0x80) #define PMIC_CHARGE_CONTROL (0x28) #define PMIC_CC_CHARGE_ENABLE (1<<7) #define PMIC_CC_ISET(_x) (((_x) & 0xF) << 3) #define PMIC_CC_VSET(_x) (((_x) & 0x7)) #define PMIC_TCTR_CONTROL (0x2A) #define PMIC_ADC_MAN_CONTROL (0x30) #define PMIC_AMC_ADCMUX(_x) ((_x & 0x7)) #define PMIC_AMC_MAN_CONV (1<<3) #define PMIC_AMC_LDO_INT_Enable (1<<4) #define PMIC_MAN_RES (0x40) #define PMIC_LED1_CONTROL (0x20) // LDO on/off control in Baseband Reg space #define PMIC_B_REG_CONTROL_1 0x97 #define PMIC_B_REG_CONTROL_2 0x98 #define PMIC_B_SLEEP_CONTROL_1 0x99 #define PMIC_B_SLEEP_CONTROL_2 0x9A #define PMIC_B_SLEEP_CONTROL_3 0x9B // IRQ_MASK_A #define IMA_ONKEY_N 0x1 #define IMA_PWREN1 0x2 #define IMA_EXTON 0x4 #define IMA_CHDET 0x8 #define IMA_TBAT 0x10 #define IMA_VBATMON_1 0x20 #define IMA_VBATMON_2 0x40 #define IMA_CHIOVER 0x80 //IRQ_MASK_B #define IMB_TCTO 0x1 #define IMB_CCTO 0x2 #define IMB_ADC_READY 0x4 #define IMB_VBUS_VALID_4_4 0x8 #define IMB_VBUS_VALID_4_0 0x10 #define IMB_SESSION_VALID 0x20 #define IMB_SRP_DETECT 0x40 #define IMB_WDOG 0x80 // SYS_CONTROL_A #define SCA_SLEEP_N_EN 0x1 #define SCA_SHUTDOWN 0x2 #define SCA_HWRES_EN 0x4 #define SCA_WDOG_ACTION 0x8 #define SCA_TWDSCALE(_x) (((_x) & 7) << 4) #define SCA_RESET_WDOG 0x80 // Events registers A, B, C #define EVENTS_A_OFFSET 0 #define EA_ONKEY_N 0x1 #define EA_PWREN1 0x2 #define EA_EXTON 0x4 #define EA_CHDET 0x8 #define EA_TBAT 0x10 #define EA_VBATMON 0x20 #define EA_VBATMON_TXON 0x40 #define EA_CHIOVER 0x80 #define EVENTS_B_OFFSET 1 #define EVENTS_C_OFFSET 2 // BUCK2 Reg 1 #define B2R1_TRIM_MASK 0x1f #define B2R1_TRIM_P85_V 0x0 #define B2R1_TRIM_P875_V 0x1 #define B2R1_TRIM_P9_V 0x2 #define B2R1_TRIM_P925_V 0x3 #define B2R1_TRIM_P95_V 0x4 #define B2R1_TRIM_P975_V 0x5 #define B2R1_TRIM_1_V 0x6 #define B2R1_TRIM_1_125_V 0xB #define B2R1_TRIM_1_25_V 0x10 #define B2R1_SLEEP 0x40 #define B2R1_GO 0x80 // Reg Control 1 for App processor reg space: Enable/Disable LDOs #define ARC1_BUCK2_EN 0x1 // on #define ARC1_LDO10_EN 0x2 // off #define ARC1_LDO11_EN 0x4 // off #define ARC1_LDO13_EN 0x8 // off #define ARC1_LDO14_EN 0x10 // off #define ARC1_LDO15_EN 0x20 // on #define ARC1_LDO16_EN 0x40 // on #define ARC1_LDO17_EN 0x80 // off // Reg Control 2 for App processor reg space : Enable/Disable LDOs #define ARC2_LDO18_EN 0x1 // on #define ARC2_LDO19_EN 0x2 // on #define ARC2_SIMCP_EN 0x40 // off // Reg Control 1 for Baseband reg space #define BRC1_BUCK_EN 0x1 // off #define BRC1_LDO1_EN 0x2 // off #define BRC1_LDO2_EN 0x4 // off #define BRC1_LDO3_EN 0x8 // BB #define BRC1_LDO4_EN 0x10 // off #define BRC1_LDO5_EN 0x20 // radio #define BRC1_LDO6_EN 0x40 // off #define BRC1_LDO7_EN 0x80 // off // Reg Control 2 for Baseband reg space #define BRC2_LDO8_EN 0x1 // off #define BRC2_LDO9_EN 0x2 // off #define BRC2_LDO10_EN 0x4 // sensor board #define BRC2_LDO11_EN 0x8 // sensor board #define BRC2_LDO12_EN 0x10 // BB_IO #define BRC2_LDO14_EN 0x20 // off #define BRC2_SIMCP_EN 0x40 // off #define BRC2_SLEEP 0x80 // off // Sleep control 1 for Baseband reg space #define BSC1_LDO1(_x) (((_x) & 0x3) << 0) #define BSC1_LDO2(_x) (((_x) & 0x3) << 2) #define BSC1_LDO3(_x) (((_x) & 0x3) << 4) #define BSC1_LDO4(_x) (((_x) & 0x3) << 6) // Sleep control 2 for Baseband reg space #define BSC2_LDO5(_x) (((_x) & 0x3) << 0) #define BSC2_LDO7(_x) (((_x) & 0x3) << 2) #define BSC2_LDO8(_x) (((_x) & 0x3) << 4) #define BSC2_LDO9(_x) (((_x) & 0x3) << 6) // Sleep control 3 for Baseband reg space #define BSC3_LDO12(_x) (((_x) & 0x3) << 0) #endif //PMIC_H tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/ds2745/000077500000000000000000000000001207233610700227155ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/ds2745/DS2745InternalC.nc000066400000000000000000000046551207233610700257010ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:42 $ */ configuration DS2745InternalC { provides interface SplitControl; provides interface Resource[uint8_t id]; provides interface HplDS2745[uint8_t id]; } implementation { components new SimpleFcfsArbiterC( "Ds2745.Resource" ) as Arbiter; components MainC; Resource = Arbiter; components new HplDS2745LogicP(DS2745_SLAVE_ADDR) as Logic; MainC.SoftwareInit -> Logic; components new HalPXA27xI2CMasterC(TRUE) as I2CC; Logic.I2CPacket -> I2CC; components HplPXA27xGPIOC; I2CC.I2CSCL -> HplPXA27xGPIOC.HplPXA27xGPIOPin[I2C_SCL]; I2CC.I2CSDA -> HplPXA27xGPIOC.HplPXA27xGPIOPin[I2C_SDA]; components DS2745InternalP as Internal; HplDS2745 = Internal.HplDS2745; Internal.ToHPLC -> Logic.HplDS2745; SplitControl = Logic; } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/chips/ds2745/DS2745InternalP.nc000066400000000000000000000106151207233610700257070ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:42 $ */ module DS2745InternalP { provides interface HplDS2745[uint8_t id]; uses interface HplDS2745 as ToHPLC; } implementation { uint8_t currentId; command error_t HplDS2745.setConfig[uint8_t id](uint8_t val) { currentId = id; return call ToHPLC.setConfig(val); } command error_t HplDS2745.measureTemperature[uint8_t id]() { currentId = id; return call ToHPLC.measureTemperature(); } command error_t HplDS2745.measureVoltage[uint8_t id]() { currentId = id; return call ToHPLC.measureVoltage(); } command error_t HplDS2745.measureCurrent[uint8_t id]() { currentId = id; return call ToHPLC.measureCurrent(); } command error_t HplDS2745.measureAccCurrent[uint8_t id]() { currentId = id; return call ToHPLC.measureAccCurrent(); } command error_t HplDS2745.setOffsetBias[uint8_t id](int8_t val) { currentId = id; return call ToHPLC.setOffsetBias(val); } command error_t HplDS2745.setAccOffsetBias[uint8_t id](int8_t val) { currentId = id; return call ToHPLC.setAccOffsetBias(val); } async event void ToHPLC.setConfigDone(error_t error) { signal HplDS2745.setConfigDone[currentId](error); } async event void ToHPLC.measureTemperatureDone(error_t result, uint16_t val) { signal HplDS2745.measureTemperatureDone[currentId](result, val); } async event void ToHPLC.measureVoltageDone(error_t result, uint16_t val) { signal HplDS2745.measureVoltageDone[currentId](result, val); } async event void ToHPLC.measureCurrentDone(error_t result, uint16_t val) { signal HplDS2745.measureCurrentDone[currentId](result, val); } async event void ToHPLC.measureAccCurrentDone(error_t result, uint16_t val) { signal HplDS2745.measureAccCurrentDone[currentId](result, val); } async event void ToHPLC.setOffsetBiasDone(error_t error) { signal HplDS2745.setOffsetBiasDone[currentId](error); } async event void ToHPLC.setAccOffsetBiasDone(error_t error) { signal HplDS2745.setAccOffsetBiasDone[currentId](error); } default async event void HplDS2745.setConfigDone[uint8_t id]( error_t error ){ return; } default async event void HplDS2745.measureTemperatureDone[uint8_t id]( error_t error, uint16_t val ){ return; } default async event void HplDS2745.measureVoltageDone[uint8_t id]( error_t error, uint16_t val ){ return; } default async event void HplDS2745.measureCurrentDone[uint8_t id]( error_t error, uint16_t val ){ return; } default async event void HplDS2745.measureAccCurrentDone[uint8_t id]( error_t error, uint16_t val ){ return; } default async event void HplDS2745.setOffsetBiasDone[uint8_t id]( error_t error ){ return; } default async event void HplDS2745.setAccOffsetBiasDone[uint8_t id](error_t error){ return; } } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/hardware.h000066400000000000000000000230461207233610700226320ustar00rootroot00000000000000/* * Copyright (c) 2005 Arched Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arched Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /* * * * Copyright (c) 2000-2002 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * * @Author Philip Buonadonna * @Author Robbie Adler * */ #ifndef __TOSH_HARDWARE_H__ #define __TOSH_HARDWARE_H__ #include "pxa27xhardware.h" //#include "AM.h" // enum so components can override power saving, // as per TEP 112. // Note that currently the pxa27x does not support // McuPowerOverride, so SLEEP_NONE is defined to // be 0. enum { TOS_SLEEP_NONE = 0, }; #define MIN(a,b) ((a) < (b) ? (a) : (b)) /* Watchdog Prescaler */ enum { TOSH_period16 = 0x00, // 47ms TOSH_period32 = 0x01, // 94ms TOSH_period64 = 0x02, // 0.19s TOSH_period128 = 0x03, // 0.38s TOSH_period256 = 0x04, // 0.75s TOSH_period512 = 0x05, // 1.5s TOSH_period1024 = 0x06, // 3.0s TOSH_period2048 = 0x07 // 6.0s }; /* Global interrupt priority table. * Table is indexed by the Peripheral ID (PPID). Priorities are 0 - 39 * where 0 is the highest. Priorities MUST be unique. 0XFF = invalid/unassigned */ const uint8_t TOSH_IRP_TABLE[] = { 0x05, // PPID 0 SSP_3 Service Req 0xFF, // PPID 1 MSL 0xFF, // PPID 2 USBH2 0xFF, // PPID 3 USBH1 0xFF, // PPID 4 Keypad 0xFF, // PPID 5 Memory Stick 0xFF, // PPID 6 Power I2C 0x04, // PPID 7 OST match Register 4-11 0x01, // PPID 8 GPIO_0 0x03, // PPID 9 GPIO_1 0x02, // PPID 10 GPIO_x 0x08, // PPID 11 USBC 0xFF, // PPID 12 PMU 0xFF, // PPID 13 I2S 0xFF, // PPID 14 AC '97 0xFF, // PPID 15 SIM status/error 0xFF, // PPID 16 SSP_2 Service Req 0xFF, // PPID 17 LCD Controller Service Req 0xFF, // PPID 18 I2C Service Req 0xFF, // PPID 19 TX/RX ERROR IRDA 0x07, // PPID 20 TX/RX ERROR STUART 0xFF, // PPID 21 TX/RX ERROR BTUART 0x06, // PPID 22 TX/RX ERROR FFUART 0xFF, // PPID 23 Flash Card status/Error Detect 0x0A, // PPID 24 SSP_1 Service Req 0x00, // PPID 25 DMA Channel Service Req 0xFF, // PPID 26 OST equals Match Register 0 0xFF, // PPID 27 OST equals Match Register 1 0xFF, // PPID 28 OST equals Match Register 2 0xFF, // PPID 29 OST equals Match Register 3 0xFF, // PPID 30 RTC One HZ TIC 0xFF, // PPID 31 RTC equals Alarm 0xFF, // PPID 32 0x09, // PPID 33 Quick Capture Interface 0xFF, // PPID 34 0xFF, // PPID 35 0xFF, // PPID 36 0xFF, // PPID 37 0xFF, // PPID 38 0xFF // PPID 39 }; #ifdef IMOTE2_DEVBOARD // LED assignments #define RED_LED_PIN (95) #define GREEN_LED_PIN (102) #define BLUE_LED_PIN (27) // CC2420 RADIO #defines #define CC2420_VREN_PIN (40) #define CC2420_RSTN_PIN (22) #define CC2420_FIFO_PIN (114) #define CC2420_CCA_PIN (116) #define CC2420_FIFOP_PIN (115) #define CC2420_SFD_PIN (16) #define CC2420_CSN_PIN (39) #else // LED assignments #define RED_LED_PIN (103) #define GREEN_LED_PIN (104) #define BLUE_LED_PIN (105) // CC2420 RADIO #defines #define CC2420_VREN_PIN (115) #define CC2420_RSTN_PIN (22) #define CC2420_FIFO_PIN (114) #define CC2420_CCA_PIN (116) #define CC2420_FIFOP_PIN (0) #define CC2420_SFD_PIN (16) #define CC2420_CSN_PIN (39) #endif /* IMOTE2_DEVBOARD */ #define SSP3_RXD (41) #define SSP3_RXD_ALTFN (3) #define SSP3_TXD (35) #define SSP3_TXD_ALTFN (3) #define SSP3_SFRM (39) #define SSP3_SFRM_ALTFN (3) #define SSP3_SCLK (34) #define SSP3_SCLK_ALTFN (3) #define SSP1_RXD (26) #define SSP1_RXD_ALTFN (1 ) #define SSP1_TXD (25) #define SSP1_TXD_ALTFN (2 ) #define SSP1_SCLK (23) #define SSP1_SCLK_ALTFN (2 ) #define SSP1_SFRM (24) #define SSP1_SFRM_ALTFN (2 ) #define FFUART_RXD (96) #define FFUART_RXD_ALTFN (3) #define FFUART_TXD (99) #define FFUART_TXD_ALTFN (3) #define STUART_RXD (46) #define STUART_RXD_ALTFN (2) #define STUART_TXD (47) #define STUART_TXD_ALTFN (1) #define I2C_SCL (117) #define I2C_SCL_ALTFN (1) #define I2C_SDA (118) #define I2C_SDA_ALTFN (1) #define DS2745_SLAVE_ADDR (0x48) #if 0 TOSH_ASSIGN_PIN(CC_VREN,A,CC_VREN_PIN); TOSH_ASSIGN_PIN(CC_RSTN,A,CC_RSTN_PIN); TOSH_ASSIGN_PIN(CC_FIFO,A,CC_FIFO_PIN); TOSH_ASSIGN_PIN(RADIO_CCA,A,RADIO_CCA_PIN); TOSH_ASSIGN_PIN(CC_FIFOP,A,CC_FIFOP_PIN); TOSH_ASSIGN_PIN(CC_SFD,A,CC_SFD_PIN); TOSH_ASSIGN_PIN(CC_CSN,A,CC_CSN_PIN); #endif void TOSH_SET_PIN_DIRECTIONS(void) { PSSR = (PSSR_RDH | PSSR_PH); // Reenable the GPIO buffers (needed out of reset) #if 0 TOSH_CLR_CC_RSTN_PIN(); TOSH_MAKE_CC_RSTN_OUTPUT(); TOSH_CLR_CC_VREN_PIN(); TOSH_MAKE_CC_VREN_OUTPUT(); TOSH_SET_CC_CSN_PIN(); TOSH_MAKE_CC_CSN_OUTPUT(); TOSH_MAKE_CC_FIFOP_INPUT(); TOSH_MAKE_CC_FIFO_INPUT(); TOSH_MAKE_CC_SFD_INPUT(); TOSH_MAKE_RADIO_CCA_INPUT(); #endif } #endif //TOSH_HARDWARE_H tinyos-2.1.2+dfsg/tos/platforms/intelmote2/platform.h000066400000000000000000000000001207233610700226420ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/intelmote2/platform_message.h000066400000000000000000000051241207233610700243620ustar00rootroot00000000000000/* $Id: platform_message.h,v 1.6 2010-06-29 22:07:53 scipio Exp $ * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Defining the platform-independently named packet structures to be the * chip-specific CC1000 packet structures. * * @author Philip Levis * @date May 16 2005 * Revision: $Revision: 1.6 $ */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include "CC2420.h" #include "Serial.h" typedef union message_header { cc2420_header_t cc2420; serial_header_t serial; } message_header_t; typedef union message_footer { cc2420_footer_t cc2420; } message_footer_t; typedef union message_metadata { cc2420_metadata_t cc2420; serial_metadata_t serial; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/intelmote2/tos.x000066400000000000000000000047331207233610700216640ustar00rootroot00000000000000OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") OUTPUT_ARCH(arm) MEMORY { text (rx) : ORIGIN = 0, LENGTH = 64M data (rw!x) : ORIGIN = 0x5c000000, LENGTH = 256K } SECTIONS { .text : { *(.vectors) *(.text .stub .text.* .gnu.linkonce.t.*) *(.rodata.*) *(.rodata) /* .gnu.warning sections are handled specially by elf32.em. */ *(.gnu.warning) *(.glue_7t) *(.glue_7) KEEP (*(.fini)) } >text PROVIDE (__etext = .); PROVIDE (_etext = .); PROVIDE (etext = .); .data : AT (ADDR(.text) + SIZEOF(.text)) { __data_start = . ; *(.data .data.* .gnu.linkonce.d.*) *(.gnu.linkonce.d*) _edata = .; PROVIDE (edata = .); } > data .bss SIZEOF(.data) + ADDR(.data) : { __bss_start = .; __bss_start__ = .; *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) _end = .; _bss_end__ = . ; __bss_end__ = . ; __end__ = . ; PROVIDE (end = .); } >data __data_load_start = LOADADDR(.data); __data_load_end = __data_load_start + SIZEOF(.data); /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } .stack 0x80000 : { _stack = .; *(.stack) } /DISCARD/ : { *(.note.GNU-stack) } } tinyos-2.1.2+dfsg/tos/platforms/intelmote2/toscrt0.s000066400000000000000000000174731207233610700224550ustar00rootroot00000000000000/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Intel Open Source License * * Copyright (c) 2002 Intel Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * */ /* * * Authors: Phil Buonadonna,David Gay * Date last modified: $Revision: 1.6 $ * */ .equ ARM_CPSR_MODE_MASK,(0x0000001F) .equ ARM_CPSR_INT_MASK,(0x000000C0) .equ ARM_CPSR_COND_MASK,(0xF8000000) .equ ARM_CPSR_MODE_USR,(0x10) .equ ARM_CPSR_MODE_FIQ,(0x11) .equ ARM_CPSR_MODE_IRQ,(0x12) .equ ARM_CPSR_MODE_SVC,(0x13) .equ ARM_CPSR_MODE_ABT,(0x17) .equ ARM_CPSR_MODE_UND,(0x1B) .equ ARM_CPSR_MODE_SYS,(0x1F) .equ ARM_CPSR_BIT_N,(0x80000000) .equ ARM_CPSR_BIT_Z,(0x40000000) .equ ARM_CPSR_BIT_C,(0x20000000) .equ ARM_CPSR_BIT_V,(0x10000000) .equ ARM_CPSR_BIT_Q,(0x08000000) .equ ARM_CPSR_BIT_I,(0x00000080) .equ ARM_CPSR_BIT_F,(0x00000040) .equ ARM_CPRS_BIT_T,(0x00000020) .equ _TOS_STACK_SIZE,(0x400) @ TinyOS Exception stack sizes .equ _TOS_ISRAM_PHYSBASE,(0x5C000000) @ Internal SRAM on PXA27X .text .globl start start: mrs r0, CPSR bic r0, r0, #ARM_CPSR_MODE_MASK orr r0, r0, #(ARM_CPSR_MODE_SVC | ARM_CPSR_INT_MASK) msr cpsr_cf, r0 /* Initialize the stack pointers for all modes */ mov r0,#_TOS_ISRAM_PHYSBASE ldr r2, =(256*1024 - 4) @ and go to the last slot (256K - 4) add r2,r2,r0 mov r0, #ARM_CPSR_MODE_ABT msr CPSR_c, R0 mov sp, r2 sub r2, r2, #_TOS_STACK_SIZE mov r0, #ARM_CPSR_MODE_UND msr CPSR_c, R0 mov sp, r2 sub r2, r2, #_TOS_STACK_SIZE mov r0, #ARM_CPSR_MODE_FIQ msr CPSR_c, R0 mov sp, r2 sub r2, r2, #_TOS_STACK_SIZE mov r0, #ARM_CPSR_MODE_IRQ msr CPSR_c, R0 mov sp, r2 sub r2, r2, #(_TOS_STACK_SIZE * 2) mov r0, #ARM_CPSR_MODE_SVC msr CPSR_c, R0 mov sp, r2 /* copy data */ ldr r0, =__data_load_start ldr r1, =__data_load_end ldr r2, =__data_start .Lcopy: cmp r0, r1 beq .Lcopydone ldrb r3, [r0], #1 strb r3, [r2], #1 b .Lcopy .Lcopydone: /* clear bss */ ldr r0, =__bss_start__ ldr r1, =__bss_end__ mov r2, #0 .Lclear: cmp r0, r1 beq .Lcleardone strb r2, [r0], #1 b .Lclear .Lcleardone: mov r0, #0 /* argc? */ mov r1, #0 /* argv? */ bl main .L1: nop b .L1 @if we receive and interrupt that we don't handle, behavior will depend on whether we're in release or not .ifdef RELEASE @reboot...assumes that we started out in supervisor mode..and that we'll be returning hplarmv_undef: movs PC, #0 hplarmv_swi: movs PC, #0 hplarmv_pabort: movs PC, #0 hplarmv_dabort: movs PC, #0 hplarmv_reserved: movs PC, #0 hplarmv_irq: movs PC, #0 hplarmv_fiq: movs PC, #0 .else @infinite loop so that we can detect what happened with a debugger @in future, we'll want to blink specific LED patter or something for the USER...or perhaps blue light of death hplarmv_undef: b hplarmv_undef hplarmv_swi: b hplarmv_swi hplarmv_pabort: b hplarmv_pabort hplarmv_dabort: b hplarmv_dabort hplarmv_reserved: b hplarmv_reserved hplarmv_irq: b hplarmv_irq hplarmv_fiq: b hplarmv_fiq .endif reset_handler_start: @ reset handler should first check whether this is a debug exception @ or a real RESET event. @ NOTE: r13 is only safe register to use. @ - For RESET, dont really care about which register is used @ - For debug exception, r13=DBG_r13, prevents application registers @ - from being corrupted, before debug handler can save. mrs r13, cpsr and r13, r13, #0x1f cmp r13, #0x15 @ are we in DBG mode? beq dbg_handler_stub @ if so, go to the dbg handler stub mov r13, #0x8000001c @ otherwise, enable debug, set MOE bits mcr p14, 0, r13, c10, c0, 0 @ and continue with the reset handler @ normal reset handler initialization follows code here, @ or branch to the reset handler. b start .align 5 @ align code to a cache line boundary. dbg_handler_stub: @ First save the state of the IC enable/disable bit in DBG_LR[0]. mrc p15, 0, r13, c1, c0, 0 and r13, r13, #0x1000 orr r14, r14, r13, lsr #12 @ Next, enable the IC. mrc p15, 0, r13, c1, c0, 0 orr r13, r13, #0x1000 mcr p15, 0, r13, c1, c0, 0 @ do a sync operation to ensure all outstanding instr fetches have @ completed before continuing. The invalidate cache line function @ serves as a synchronization operation, thats why it is used @ here. The target line is some scratch address in memory. adr r13, line2 mcr p15, 0, r13, c7, c5, 1 @ invalidate BTB. make sure downloaded vector table does not hit one of @ the applications branches cached in the BTB, branch to the wrong place mcr p15, 0, r13, c7, c5, 6 @ Now, send ready for download message to debugger, indicating debugger @ can begin the download. ready for download = 0x00B00000. TXloop: mrc p14, 0, r15, c14, c0, 0 @ first make sure TX reg. is available bvs TXloop mov r13, #0x00B00000 mcr p14, 0, r13, c8, c0, 0 @ now write to TX @ Wait for debugger to indicate that the download is complete. RXloop: mrc p14, 0, r15, c14, c0, 0 @ spin in loop waiting for data from the bpl RXloop @ debugger in RX. @ before reading the RX register to get the address to branch to, restore @ the state of the IC (saved in DBG_r14[0]) to the value it have at the @ start of the debug handler stub. Also, note it must be restored before @ reading the RX register because of limited scratch registers (r13) mrc p15, 0, r13, c1, c0, 0 @ First, check DBG_LR[0] to see if the IC was enabled or disabled tst r14, #0x1 @ Then, if it was previously disabled, then disable it now, otherwise, @ theres no need to change the state, because its already enabled. biceq r13, r13, #0x1000 mcr p15, 0, r13, c1, c0, 0 @ Restore the link register value bic r14, r14, #0x1 @ Now r13 can be used to read RX and get the target address to branch to. mrc p14, 0, r13, c9, c0, 0 @ Read RX and mov pc, r13 @ branch to downloaded address. @ scratch memory space used by the invalidate IC line function above. .align 5 @ make sure it starts at a cache line @ boundary, so nothing else is affected line2: .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 .weak hplarmv_undef, hplarmv_swi, hplarmv_pabort, hplarmv_dabort, hplarmv_reserved, hplarmv_irq, hplarmv_fiq .section .vectors b reset_handler_start b hplarmv_undef b hplarmv_swi b hplarmv_pabort b hplarmv_dabort b hplarmv_reserved b hplarmv_irq b hplarmv_fiq .end tinyos-2.1.2+dfsg/tos/platforms/iris/000077500000000000000000000000001207233610700175435ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/iris/.platform000066400000000000000000000034101207233610700213660ustar00rootroot00000000000000# # FILE: micaz/.platform # # Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. # # $Id: .platform,v 1.8 2009-03-10 20:39:18 mmaroti Exp $ # push( @includes, qw( %T/platforms/micaz %T/platforms/mica %T/platforms/iris/chips/rf230 %T/chips/rf230 %T/lib/rfxlink/layers %T/lib/rfxlink/util %T/platforms/iris/chips/at45db %T/platforms/mica2/chips/at45db %T/platforms/mica/chips/at45db %T/chips/at45db %T/platforms/iris/chips/ds2401 %T/platforms/mica2/chips/ds2401 %T/chips/ds2401 %T/chips/atm1281 %T/chips/atm1281/adc %T/chips/atm1281/timer %T/chips/atm128 %T/chips/atm128/adc %T/chips/atm128/pins %T/chips/atm128/spi %T/chips/atm128/i2c %T/chips/atm128/timer %T/lib/timer %T/lib/serial %T/lib/power %T/lib/diagmsg ) ); @opts = qw( -gcc=avr-gcc -mmcu=atmega1281 -fnesc-target=avr -fnesc-no-debug ); push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{'CIL_MACHINE'} = "version_major=3 " . "version_minor=4 " . "version=avr-3.4.3 " . "short=2,1, " . "int=2,1 " . "long=4,1 " . "long_long=8,1 " . "pointer=2,1 " . "enum=2,1 " . "float=4,1 " . "double=4,1 " . "long_double=4,1 " . "void=1,1 " . "fun=1,1 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/iris/ActiveMessageC.nc000066400000000000000000000050421207233610700227110ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface SendNotifier[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketTimeStamp as PacketTimeStampMicro; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components RF230ActiveMessageC as MessageC; SplitControl = MessageC; AMSend = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; SendNotifier = MessageC; Packet = MessageC; AMPacket = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketLink = MessageC; RadioChannel = MessageC; PacketTimeStampMilli = MessageC; PacketTimeStampMicro = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/iris/Ieee154MessageC.nc000066400000000000000000000050271207233610700226020ustar00rootroot00000000000000/* * Copyright (c) 2009, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ configuration Ieee154MessageC { provides { interface SplitControl; interface Ieee154Send; interface Receive as Ieee154Receive; interface SendNotifier; interface Packet; interface Ieee154Packet; interface Resource as SendResource[uint8_t clint]; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketTimeStamp as PacketTimeStampMicro; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components RF230Ieee154MessageC as MessageC; SplitControl = MessageC; Ieee154Send = MessageC; Ieee154Receive = MessageC; SendNotifier = MessageC; Packet = MessageC; Ieee154Packet = MessageC; SendResource = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketLink = MessageC; RadioChannel = MessageC; PacketTimeStampMilli = MessageC; PacketTimeStampMicro = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/iris/LocalTimeMicroC.nc000066400000000000000000000037501207233610700230400ustar00rootroot00000000000000/* * Copyright (c) 2008, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "Timer.h" configuration LocalTimeMicroC { provides interface LocalTime; } implementation { components CounterOne16C; components new TransformCounterC(TMicro, uint32_t, TMicro, uint16_t, 0, uint32_t); components new CounterToLocalTimeC(TMicro); LocalTime = CounterToLocalTimeC; CounterToLocalTimeC.Counter -> TransformCounterC; TransformCounterC.CounterFrom -> CounterOne16C; } tinyos-2.1.2+dfsg/tos/platforms/iris/MeasureClockC.nc000066400000000000000000000112631207233610700225500ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include #include /** * Measure cpu clock frequency at boot time. Provides an Atm128Calibrate * interface so that other components can adjust their calibration as * needed. * * @author David Gay * @author Janos Sallai */ module MeasureClockC { provides { /** * This code MUST be called from PlatformP only, hence the exactlyonce. */ interface Init @exactlyonce(); interface Atm128Calibrate; } } implementation { enum { /* This is expected number of cycles per jiffy at the platform's specified MHz. Assumes PLATFORM_MHZ == 1, 2, 4, 8 or 16. */ MAGIC = 488 / (16 / PLATFORM_MHZ) }; uint16_t cycles; command error_t Init.init() { /* Measure clock cycles per Jiffy (1/32768s) */ /* This code doesn't use the HPL to avoid timing issues when compiling with debugging on */ atomic { uint8_t now, wraps; uint16_t start; /* Setup timer2 to count 32 jiffies, and timer1 cpu cycles */ TCCR1B = 1 << CS10; ASSR = 1 << AS2; TCCR2B = 1 << CS21 | 1 << CS20; /* Wait for 1s for counter to stablilize after power-up (yes, it really does take that long). That's 122 wrap arounds of timer 1 at 8MHz. */ start = TCNT1; for (wraps = MAGIC / 2; wraps; ) { uint16_t next = TCNT1; if (next < start) wraps--; start = next; } /* Wait for a TCNT0 change */ now = TCNT2; while (TCNT2 == now) ; /* Read cpu cycles and wait for next TCNT2 change */ start = TCNT1; now = TCNT2; while (TCNT2 == now) ; cycles = TCNT1; cycles = (cycles - start + 16) >> 5; /* Reset to boot state */ ASSR = TCCR1B = TCCR2B = 0; TCNT2 = 0; TCNT1 = 0; TIFR1 = TIFR2 = 0xff; while (ASSR & (1 << TCN2UB | 1 << OCR2BUB | 1 << TCR2BUB)) ; } return SUCCESS; } async command uint16_t Atm128Calibrate.cyclesPerJiffy() { return cycles; } async command uint32_t Atm128Calibrate.calibrateMicro(uint32_t n) { return scale32(n + MAGIC / 2, cycles, MAGIC); } async command uint32_t Atm128Calibrate.actualMicro(uint32_t n) { return scale32(n + (cycles >> 1), MAGIC, cycles); } async command uint8_t Atm128Calibrate.adcPrescaler() { /* This is also log2(cycles/3.05). But that's a pain to compute */ if (cycles >= 390) return ATM128_ADC_PRESCALE_128; if (cycles >= 195) return ATM128_ADC_PRESCALE_64; if (cycles >= 97) return ATM128_ADC_PRESCALE_32; if (cycles >= 48) return ATM128_ADC_PRESCALE_16; if (cycles >= 24) return ATM128_ADC_PRESCALE_8; if (cycles >= 12) return ATM128_ADC_PRESCALE_4; return ATM128_ADC_PRESCALE_2; } async command uint16_t Atm128Calibrate.baudrateRegister(uint32_t baudrate) { // value is (cycles*32768) / (8*baudrate) - 1 return ((uint32_t)cycles << 12) / baudrate - 1; } } tinyos-2.1.2+dfsg/tos/platforms/iris/MicaTimer.h000066400000000000000000000140601207233610700215670ustar00rootroot00000000000000// $Id: MicaTimer.h,v 1.3 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MICATIMER_H #define MICATIMER_H /* This file defines the rates at which the mica family's atmega1281 timer 1 and 3 timers run at. The goal is to present the user with microsend and 32khz timers, but it may not be possible to run the timers at these rates (because of the limited prescaler selection). So TinyOS picks a prescaler (based on the selected processor MHz) for each of these timers, and builds corresponding 16-bit alarms&counters (AlarmOne16C, AlarmThree16C, CounterOne16C, CounterThree16C) over hardware timers 1 and 3. TinyOS then divides these hardware timers by the appropriate power of 2 to get approximate 32-bit 32kHz and 1MHz alarms and counters (Alarm32khz32C, AlarmMicro32C, Counter32khz32C, CounterMicro32C). The constants and typedefs for all this configuration are defined here, based on the value of the MHZ preprocessor symbol, which shoud approximate the platform's MHZ rate. Note that the timers thus obtained will not be exactly at 32768Hz or 1MHz, because the clock doesn't divide by a power of two to those frequencies, and/or the clock frequency is not accurate. If you need more accurate timing, you should use the calibration functions offered by the Atm128Calibrate interface provided by PlatformC. This file also defines EXT_STANDBY_T0_THRESHOLD, a threshold on remaining time till the next timer 0 interrupt under which the mote should sleep in ext standby rather than power save. This is only important when not using the internal oscillator. Wake up from power save takes 65536 cycles (6 cycles for ext standby), which is, e.g., ~9.4ms at 7Mhz. */ #include #include /* Some types for the non-standard rates that mica timers might be running at. */ typedef struct { } T64khz; typedef struct { } T128khz; typedef struct { } T2mhz; typedef struct { } T4mhz; /* TX is the typedef for the rate of timer X, MICA_PRESCALER_X is the prescaler for timer X, MICA_DIVIDER_X_FOR_Y_LOG2 is the number of bits to shift timer X by to get rate Y, counter_X_overflow_t is uint16_t if MICA_DIVIDER_X_FOR_Y_LOG2 is 0, uint32_t otherwise. */ #if MHZ == 1 typedef T128khz TOne; typedef TMicro TThree; typedef uint32_t counter_one_overflow_t; typedef uint16_t counter_three_overflow_t; enum { MICA_PRESCALER_ONE = ATM128_CLK16_DIVIDE_8, MICA_DIVIDE_ONE_FOR_32KHZ_LOG2 = 2, MICA_PRESCALER_THREE = ATM128_CLK16_NORMAL, MICA_DIVIDE_THREE_FOR_MICRO_LOG2 = 0, EXT_STANDBY_T0_THRESHOLD = 80, }; #elif MHZ == 2 typedef T32khz TOne; typedef T2mhz TThree; typedef uint16_t counter_one_overflow_t; typedef uint32_t counter_three_overflow_t; enum { MICA_PRESCALER_ONE = ATM128_CLK16_DIVIDE_64, MICA_DIVIDE_ONE_FOR_32KHZ_LOG2 = 0, MICA_PRESCALER_THREE = ATM128_CLK16_NORMAL, MICA_DIVIDE_THREE_FOR_MICRO_LOG2 = 1, EXT_STANDBY_T0_THRESHOLD = 40 }; #elif MHZ == 4 typedef T64khz TOne; typedef T4mhz TThree; typedef uint32_t counter_one_overflow_t; typedef uint32_t counter_three_overflow_t; enum { MICA_PRESCALER_ONE = ATM128_CLK16_DIVIDE_64, MICA_DIVIDE_ONE_FOR_32KHZ_LOG2 = 1, MICA_PRESCALER_THREE = ATM128_CLK16_NORMAL, MICA_DIVIDE_THREE_FOR_MICRO_LOG2 = 2, EXT_STANDBY_T0_THRESHOLD = 24 }; #elif MHZ == 8 /* typedef T32khz TOne; typedef TMicro TThree; typedef uint16_t counter_one_overflow_t; typedef uint16_t counter_three_overflow_t; enum { MICA_PRESCALER_ONE = ATM128_CLK16_DIVIDE_256, MICA_DIVIDE_ONE_FOR_32KHZ_LOG2 = 0, MICA_PRESCALER_THREE = ATM128_CLK16_DIVIDE_8, MICA_DIVIDE_THREE_FOR_MICRO_LOG2 = 0, EXT_STANDBY_T0_THRESHOLD = 12 }; */ // get a 1MHz (1 microsecond resolution) timer for debugging purposes typedef TMicro TOne; typedef TMicro TThree; typedef uint32_t counter_one_overflow_t; typedef uint16_t counter_three_overflow_t; enum { MICA_PRESCALER_ONE = ATM128_CLK16_DIVIDE_8, MICA_DIVIDE_ONE_FOR_32KHZ_LOG2 = 5, MICA_PRESCALER_THREE = ATM128_CLK16_DIVIDE_8, MICA_DIVIDE_THREE_FOR_MICRO_LOG2 = 0, EXT_STANDBY_T0_THRESHOLD = 12, }; #else #error "Unknown clock rate. MHZ must be defined to one of 1, 2, 4, or 8." #endif enum { PLATFORM_MHZ = MHZ }; #endif tinyos-2.1.2+dfsg/tos/platforms/iris/PlatformLed.h000066400000000000000000000041651207233610700221330ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _PLATFORMLED_H_ #define _PLATFORMLED_H_ /** Constants used in the generic LedC module to determine how many * named Led interfaces should be published. The value should match * the size of the table in PlatformLedsP, but we're not going to * guess that table's public name. */ #define PLATFORM_LED_COUNT 3 /** Map to the LED index for the red LED */ #define PLATFORM_LED_RED 0 /** Map to the LED index for the green LED */ #define PLATFORM_LED_GREEN 1 /** Map to the LED index for the blue LED */ #define PLATFORM_LED_YELLOW 2 #endif// _PLATFORMLED_H_ tinyos-2.1.2+dfsg/tos/platforms/iris/PlatformLedC.nc000066400000000000000000000037151207233610700224070ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Defines the Led and MultiLed interfaces in terms of the underlying * LedsC component. * * @author Peter A. Bigot */ configuration PlatformLedC { provides { interface MultiLed; interface Led[uint8_t led_id]; } } implementation { components LedsC; components PlatformLedP; MultiLed = PlatformLedP; Led = PlatformLedP; PlatformLedP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/iris/PlatformLedP.nc000066400000000000000000000062401207233610700224200ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Defines the Led and MultiLed interfaces in terms of the underlying * LedsC component. * * @author Peter A. Bigot */ module PlatformLedP { provides { interface MultiLed; interface Led[uint8_t led_id]; } uses { interface Leds; } } implementation { async command void Led.on[ uint8_t led_id ] () { switch(led_id) { case 0: call Leds.led0On(); break; case 1: call Leds.led1On(); break; case 2: call Leds.led2On(); break; } } async command void Led.off[ uint8_t led_id ] () { switch(led_id) { case 0: call Leds.led0Off(); break; case 1: call Leds.led1Off(); break; case 2: call Leds.led2Off(); break; } } async command void Led.set[ uint8_t led_id ] (bool turn_on) { if (turn_on) { call Led.on[led_id](); } else { call Led.off[led_id](); } } async command void Led.toggle[ uint8_t led_id ] () { switch(led_id) { case 0: call Leds.led0Toggle(); break; case 1: call Leds.led1Toggle(); break; case 2: call Leds.led2Toggle(); break; } } async command unsigned int MultiLed.get () { return call Leds.get(); } async command void MultiLed.set (unsigned int val) { call Leds.set(val); } async command void MultiLed.on (unsigned int led_id) { call Led.on[led_id](); } async command void MultiLed.off (unsigned int led_id) { call Led.off[led_id](); } async command void MultiLed.setSingle (unsigned int led_id, bool turn_on) { call Led.set[led_id](turn_on); } async command void MultiLed.toggle (unsigned int led_id) { call Led.toggle[led_id](); } } tinyos-2.1.2+dfsg/tos/platforms/iris/TimeSyncMessageC.nc000066400000000000000000000054021207233610700232310ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStampRadio; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components RF230TimeSyncMessageC as MessageC; SplitControl = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; Packet = MessageC; AMPacket = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketTimeStampRadio = MessageC; TimeSyncAMSendRadio = MessageC; TimeSyncPacketRadio = MessageC; PacketTimeStampMilli = MessageC; TimeSyncAMSendMilli = MessageC; TimeSyncPacketMilli = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/iris/chips/000077500000000000000000000000001207233610700206515ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/iris/chips/at45db/000077500000000000000000000000001207233610700217345ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/iris/chips/at45db/HplAt45dbIOC.nc000066400000000000000000000053521207233610700243050ustar00rootroot00000000000000// $Id: HplAt45dbIOC.nc,v 1.2 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Low-level access functions for the AT45DB flash on the mica2 and micaz. * * @author David Gay * @author Janos Sallai */ configuration HplAt45dbIOC { provides { interface Resource; interface SpiByte as FlashSpi; interface HplAt45dbByte; } } implementation { // Wire up byte I/O to At45db components HplAt45dbIOP, HplAtm128GeneralIOC as Pins, PlatformC; components BusyWaitMicroC; components new NoArbiterC(); Resource = NoArbiterC; FlashSpi = HplAt45dbIOP; HplAt45dbByte = HplAt45dbIOP; PlatformC.SubInit -> HplAt45dbIOP; HplAt45dbIOP.Select -> Pins.PortA3; HplAt45dbIOP.Clk -> Pins.PortD5; HplAt45dbIOP.In -> Pins.PortD2; HplAt45dbIOP.Out -> Pins.PortD3; HplAt45dbIOP.BusyWait -> BusyWaitMicroC; } tinyos-2.1.2+dfsg/tos/platforms/iris/chips/at45db/HplAt45dbIOP.nc000066400000000000000000000137161207233610700243250ustar00rootroot00000000000000// $Id: HplAt45dbIOP.nc,v 1.3 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Low level hardware access to the onboard AT45DB flash chip. *

      * Note: This component includes optimised bit-banging SPI code with the * pins hardwired. Don't copy it to some other platform without * understanding it (see txByte). * * @author Jason Hill * @author David Gay * @author Philip Levis * @author Janos Sallai */ #include "Timer.h" module HplAt45dbIOP { provides { interface Init; interface SpiByte as FlashSpi; interface HplAt45dbByte; } uses { interface GeneralIO as Select; interface GeneralIO as Clk; interface GeneralIO as Out; interface GeneralIO as In; interface BusyWait; } } implementation { // We use SPI mode 0 (clock low at select time) command error_t Init.init() { call Select.makeOutput(); call Select.set(); call Clk.clr(); call Clk.makeOutput(); call Out.set(); call Out.makeOutput(); call In.clr(); call In.makeInput(); return SUCCESS; } command void HplAt45dbByte.select() { call Clk.clr(); // ensure SPI mode 0 call Select.clr(); } command void HplAt45dbByte.deselect() { call Select.set(); } #define BITINIT \ uint8_t clrClkAndData = PORTD & ~0x28 #define BIT(n) \ PORTD = clrClkAndData; \ asm __volatile__ \ ( "sbrc %2," #n "\n" \ "\tsbi 11,3\n" \ "\tsbi 11,5\n" \ "\tsbic 9,2\n" \ "\tori %0,1<<" #n "\n" \ : "=d" (spiIn) : "0" (spiIn), "r" (spiOut)) async command uint8_t FlashSpi.write(uint8_t spiOut) { uint8_t spiIn = 0; // This atomic ensures integrity at the hardware level... atomic { BITINIT; BIT(7); BIT(6); BIT(5); BIT(4); BIT(3); BIT(2); BIT(1); BIT(0); } return spiIn; } task void avail() { signal HplAt45dbByte.idle(); } command void HplAt45dbByte.waitIdle() { // at45db041 rev d fix by handsomezhu hongsong at ios.cn // http://mail.millennium.berkeley.edu/pipermail/tinyos-help/2008-January/030255.html int i; call Clk.clr(); call BusyWait.wait(2); while( ! call In.get() ) { for( i=0; i < 8; i ++ ) { call Clk.set(); call Clk.clr(); call BusyWait.wait(2); } } post avail(); } command bool HplAt45dbByte.getCompareStatus() { call Clk.set(); call Clk.clr(); // Wait for compare value to propagate asm volatile("nop"); asm volatile("nop"); return !call In.get(); } } tinyos-2.1.2+dfsg/tos/platforms/iris/chips/ds2401/000077500000000000000000000000001207233610700215665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/iris/chips/ds2401/PlatformIeeeEui64.h000066400000000000000000000041301207233610700251260ustar00rootroot00000000000000// $Id: PlatformIeeeEui64.h,v 1.2 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ #ifndef PLATFORMIEEEEUI64_H #define PLATFORMIEEEEUI64_H /* For now, let us set the company ID to 'X' 'B' 'W', and the first two bytes * of the serial ID to 'I' 'R'. The last three bytes of the serial ID are read * from the DS2401 chip. */ enum { IEEE_EUI64_COMPANY_ID_0 = 'X', IEEE_EUI64_COMPANY_ID_1 = 'B', IEEE_EUI64_COMPANY_ID_2 = 'W', IEEE_EUI64_SERIAL_ID_0 = 'I', IEEE_EUI64_SERIAL_ID_1 = 'R', }; #endif // PLATFORMIEEEEUI64_H tinyos-2.1.2+dfsg/tos/platforms/iris/chips/rf230/000077500000000000000000000000001207233610700215055ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/iris/chips/rf230/HplRF230C.nc000066400000000000000000000050521207233610700233340ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include configuration HplRF230C { provides { interface GeneralIO as SELN; interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as SLP_TR; interface GeneralIO as RSTN; interface GpioCapture as IRQ; interface Alarm as Alarm; interface LocalTime as LocalTimeRadio; } } implementation { components HplRF230P; IRQ = HplRF230P.IRQ; HplRF230P.PortCLKM -> IO.PortD6; HplRF230P.PortIRQ -> IO.PortD4; components Atm128SpiC as SpiC; SpiResource = SpiC.Resource[unique("Atm128SpiC.Resource")]; FastSpiByte = SpiC; components HplAtm128GeneralIOC as IO; SLP_TR = IO.PortB7; RSTN = IO.PortA6; SELN = IO.PortB0; components HplAtm128Timer1C as TimerC; HplRF230P.Capture -> TimerC.Capture; components new AlarmOne16C() as AlarmC; Alarm = AlarmC; components RealMainP; RealMainP.PlatformInit -> HplRF230P.PlatformInit; components LocalTimeMicroC; LocalTimeRadio = LocalTimeMicroC; } tinyos-2.1.2+dfsg/tos/platforms/iris/chips/rf230/HplRF230P.nc000066400000000000000000000051341207233610700233520ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ module HplRF230P { provides { interface GpioCapture as IRQ; interface Init as PlatformInit; } uses { interface HplAtm128Capture as Capture; interface GeneralIO as PortCLKM; interface GeneralIO as PortIRQ; } } implementation { command error_t PlatformInit.init() { call PortCLKM.makeInput(); call PortCLKM.clr(); call PortIRQ.makeInput(); call PortIRQ.clr(); call Capture.stop(); return SUCCESS; } async event void Capture.captured(uint16_t time) { time = call Capture.get(); // TODO: ask Cory why time is not the captured time signal IRQ.captured(time); } default async event void IRQ.captured(uint16_t time) { } async command error_t IRQ.captureRisingEdge() { call Capture.setEdge(TRUE); call Capture.reset(); call Capture.start(); return SUCCESS; } async command error_t IRQ.captureFallingEdge() { // falling edge comes when the IRQ_STATUS register of the RF230 is read return FAIL; } async command void IRQ.disable() { call Capture.stop(); } } tinyos-2.1.2+dfsg/tos/platforms/iris/chips/rf230/RadioConfig.h000066400000000000000000000071201207233610700240420ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #ifndef __RADIOCONFIG_H__ #define __RADIOCONFIG_H__ #include #include #include enum { /** * This is the value of the TRX_CTRL_0 register * which configures the output pin currents and the CLKM clock */ RF230_TRX_CTRL_0_VALUE = 0, /** * This is the default value of the CCA_MODE field in the PHY_CC_CCA register * which is used to configure the default mode of the clear channel assesment */ RF230_CCA_MODE_VALUE = RF230_CCA_MODE_3, /** * This is the value of the CCA_THRES register that controls the * energy levels used for clear channel assesment */ RF230_CCA_THRES_VALUE = 0xC7, }; /* This is the default value of the TX_PWR field of the PHY_TX_PWR register. */ #ifndef RF230_DEF_RFPOWER #define RF230_DEF_RFPOWER 0 #endif /* This is the default value of the CHANNEL field of the PHY_CC_CCA register. */ #ifndef RF230_DEF_CHANNEL #define RF230_DEF_CHANNEL 11 #endif /* The number of microseconds a sending IRIS mote will wait for an acknowledgement */ #ifndef SOFTWAREACK_TIMEOUT #define SOFTWAREACK_TIMEOUT 1000 #endif /* * This is the command used to calculate the CRC for the RF230 chip. * TODO: Check why the default crcByte implementation is in a different endianness */ inline uint16_t RF230_CRCBYTE_COMMAND(uint16_t crc, uint8_t data) { return _crc_ccitt_update(crc, data); } /** * This is the timer type of the radio alarm interface */ typedef TOne TRadio; typedef uint16_t tradio_size; /** * The number of radio alarm ticks per one microsecond (0.9216). * We use integers and no parentheses just to make deputy happy. * Ok, further hacks were required for deputy, I removed 00 from the * beginning and end to ba able to handle longer wait periods. */ #define RADIO_ALARM_MICROSEC (73728UL / MHZ / 32) * (1 << MICA_DIVIDE_ONE_FOR_32KHZ_LOG2) / 10000UL /** * The base two logarithm of the number of radio alarm ticks per one millisecond */ #define RADIO_ALARM_MILLI_EXP (5 + MICA_DIVIDE_ONE_FOR_32KHZ_LOG2) #endif//__RADIOCONFIG_H__ tinyos-2.1.2+dfsg/tos/platforms/iris/platform.h000066400000000000000000000001201207233610700215310ustar00rootroot00000000000000#include #define platform_bootstrap() { MCUSR=0; wdt_disable(); } tinyos-2.1.2+dfsg/tos/platforms/iris/platform_message.h000066400000000000000000000036701207233610700232520ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include #include typedef union message_header { rf230packet_header_t rf230; serial_header_t serial; } message_header_t; typedef union message_footer { rf230packet_footer_t rf230; } message_footer_t; typedef union message_metadata { rf230packet_metadata_t rf230; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/iris/sim/000077500000000000000000000000001207233610700203335ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/iris/sim/.platform000066400000000000000000000015521207233610700221630ustar00rootroot00000000000000# # FILE: iris/.platform # # Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. And because of that, the current platform's include directory # must be specified, otherwise its search order is last instead of first. # # push( @includes, qw( %T/platforms/iris %T/platforms/micaz %T/platforms/mica %T/platforms/micaz/chips/cc2420 %T/chips/cc2420 %T/chips/atm128 %T/chips/atm128/adc %T/chips/atm128/pins %T/chips/atm128/spi %T/chips/atm128/timer %T/lib/power %T/lib/timer %T/lib/serial ) ); @opts = qw( -gcc=gcc -fnesc-no-debug -fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask ); push @opts, "-mingw-gcc" if $cygwin; tinyos-2.1.2+dfsg/tos/platforms/mica/000077500000000000000000000000001207233610700175065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica/Alarm32khz32C.nc000066400000000000000000000024661207233610700222260ustar00rootroot00000000000000// $Id: Alarm32khz32C.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * 32-bit 32kHz Alarm component as per TEP102 HAL guidelines. The mica * family 32kHz Alarm is built on hardware timer 1, and actually runs at * CPU frequency / 256. You can use the MeasureClockC.cyclesPerJiffy() * command to figure out the exact frequency. *

      * Upto three of these alarms can be created (one per hardware compare * register). Note that creating one of these Alarms consumes a 16-bit * 32kHz Alarm (see Alarm32khz16C). * * @author David Gay */ #include generic configuration Alarm32khz32C() { provides interface Alarm; } implementation { components new AlarmOne16C() as Alarm16, Counter32khz32C as Counter32, new TransformAlarmC(T32khz, uint32_t, TOne, uint16_t, MICA_DIVIDE_ONE_FOR_32KHZ_LOG2) as Transform32; Alarm = Transform32; Transform32.AlarmFrom -> Alarm16; Transform32.Counter -> Counter32; } tinyos-2.1.2+dfsg/tos/platforms/mica/AlarmCounterMilliP.nc000066400000000000000000000023741207233610700235410ustar00rootroot00000000000000// $Id: AlarmCounterMilliP.nc,v 1.7 2007-07-06 17:33:22 scipio Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Configure hardware timer 0 for use as the mica family's millisecond * timer. This component does not follow the TEP102 HAL guidelines as * there is only one compare register for timer 0, which is used to * implement HilTimerMilliC. Hence it isn't useful to expose an * AlarmMilliC or CounterMillIC component. * * @author David Gay * @author Martin Turon */ #include #include configuration AlarmCounterMilliP { provides interface Init; provides interface Alarm as AlarmMilli32; provides interface Counter as CounterMilli32; } implementation { components new Atm128AlarmAsyncC(TMilli, ATM128_CLK8_DIVIDE_32); Init = Atm128AlarmAsyncC; AlarmMilli32 = Atm128AlarmAsyncC; CounterMilli32 = Atm128AlarmAsyncC; } tinyos-2.1.2+dfsg/tos/platforms/mica/AlarmMicro32C.nc000066400000000000000000000027341207233610700223340ustar00rootroot00000000000000// $Id: AlarmMicro32C.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * 32-bit microsecond Alarm component as per TEP102 HAL guidelines. The * mica family microsecond Alarm is built on hardware timer 3, and actually * runs at CPU frequency / 8. You can use the MeasureClockC.cyclesPerJiffy() * command to figure out the exact frequency, or the * MeasureClockC.calibrateMicro() command to convert a number of microseconds * to the near-microsecond units used by this component. *

      * Upto three of these alarms can be created (one per hardware compare * register). Note that creating one of these Alarms consumes a 16-bit * microsecond Alarm (see AlarmMicro16C). * * @author David Gay */ #include generic configuration AlarmMicro32C() { provides interface Alarm; } implementation { components new AlarmThree16C() as Alarm16, CounterMicro32C as Counter32, new TransformAlarmC(TMicro, uint32_t, TThree, uint16_t, MICA_DIVIDE_THREE_FOR_MICRO_LOG2) as Transform32; Alarm = Transform32; Transform32.AlarmFrom -> Alarm16; Transform32.Counter -> Counter32; } tinyos-2.1.2+dfsg/tos/platforms/mica/AlarmOne16C.nc000066400000000000000000000025171207233610700220050ustar00rootroot00000000000000// $Id: AlarmOne16C.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * 16-bit 32kHz Alarm component as per TEP102 HAL guidelines. The mica * family 32kHz Alarm is built on hardware timer 1, and actually runs at * CPU frequency / 256. You can use the MeasureClockC.cyclesPerJiffy() * command to figure out the exact frequency. *

      * Assumes an ~8MHz CPU clock, replace this component if you are running at * a radically different frequency. *

      * Upto three of these alarms can be created (one per hardware compare * register). * * @author David Gay */ #include generic configuration AlarmOne16C() { provides interface Alarm; } implementation { components HplAtm128Timer1C as HWTimer, InitOneP, new Atm128AlarmC(TOne, uint16_t, 3) as NAlarm; enum { COMPARE_ID = unique(UQ_TIMER1_COMPARE) }; Alarm = NAlarm; NAlarm.HplAtm128Timer -> HWTimer.Timer; NAlarm.HplAtm128Compare -> HWTimer.Compare[COMPARE_ID]; } tinyos-2.1.2+dfsg/tos/platforms/mica/AlarmThree16C.nc000066400000000000000000000027661207233610700223410ustar00rootroot00000000000000// $Id: AlarmThree16C.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * 16-bit microsecond Alarm component as per TEP102 HAL guidelines. The * mica family microsecond Alarm is built on hardware timer 3, and actually * runs at CPU frequency / 8. You can use the MeasureClockC.cyclesPerJiffy() * command to figure out the exact frequency, or the * MeasureClockC.calibrateMicro() command to convert a number of microseconds * to the near-microsecond units used by this component. *

      * Assumes an ~8MHz CPU clock, replace this component if you are running at * a radically different frequency. *

      * Upto three of these alarms can be created (one per hardware compare * register). * * @author David Gay */ #include generic configuration AlarmThree16C() { provides interface Alarm; } implementation { components HplAtm128Timer3C as HWTimer, InitThreeP, new Atm128AlarmC(TThree, uint16_t, 100) as NAlarm; enum { COMPARE_ID = unique(UQ_TIMER3_COMPARE) }; Alarm = NAlarm; NAlarm.HplAtm128Timer -> HWTimer.Timer; NAlarm.HplAtm128Compare -> HWTimer.Compare[COMPARE_ID]; } tinyos-2.1.2+dfsg/tos/platforms/mica/BusyWaitMicroC.nc000066400000000000000000000062241207233610700227000ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Busy wait component as per TEP102. Supports waiting for at least some * number of microseconds. This functionality should be used sparingly, * when the overhead of posting a Timer or Alarm is greater than simply * busy waiting. * * @author David Gay */ module BusyWaitMicroC @safe() { provides interface BusyWait; } implementation { inline async command void BusyWait.wait(uint16_t dt) { /* In most cases (constant arg), the test is elided at compile-time */ if (dt) #if MHZ == 1 { dt = (dt + 3) >> 2; /* loop takes 4 cycles. */ asm volatile ( "1: sbiw %0,1\n" " brne 1b" : "+w" (dt)); } #elif MHZ == 2 { dt = (dt + 1) >> 1; /* loop takes 4 cycles. */ asm volatile ( "1: sbiw %0,1\n" " brne 1b" : "+w" (dt)); } #elif MHZ == 4 /* loop takes 4 cycles. */ asm volatile ( "1: sbiw %0,1\n" " brne 1b" : "+w" (dt)); #elif MHZ == 8 /* loop takes 8 cycles. this is 1uS if running on an internal 8MHz clock, and 1.09uS if running on the external crystal. */ asm volatile ( "1: sbiw %0,1\n" " adiw %0,1\n" " sbiw %0,1\n" " brne 1b" : "+w" (dt)); #else #error "Unknown clock rate. MHZ must be defined to one of 1, 2, 4, or 8." #endif } } tinyos-2.1.2+dfsg/tos/platforms/mica/Counter32khz32C.nc000066400000000000000000000021361207233610700226030ustar00rootroot00000000000000// $Id: Counter32khz32C.nc,v 1.5 2008-09-01 17:44:02 devdj Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * 32-bit 32kHz Counter component as per TEP102 HAL guidelines. The mica * family 32kHz clock is built on hardware timer 1, and actually runs at * CPU frequency / 256. You can use the MeasureClockC.cyclesPerJiffy() * command to figure out the exact frequency. * * @author David Gay */ #include configuration Counter32khz32C { provides interface Counter; } implementation { components CounterOne16C as Counter16, new TransformCounterC(T32khz, uint32_t, TOne, uint16_t, MICA_DIVIDE_ONE_FOR_32KHZ_LOG2, counter_one_overflow_t) as Transform32; Counter = Transform32; Transform32.CounterFrom -> Counter16; } tinyos-2.1.2+dfsg/tos/platforms/mica/CounterMicro32C.nc000066400000000000000000000021621207233610700227120ustar00rootroot00000000000000// $Id: CounterMicro32C.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * 32-bit microsecond Counter component as per TEP102 HAL guidelines. The * mica family microsecond clock is built on hardware timer 3, and actually * runs at CPU frequency / 8. You can use the MeasureClockC.cyclesPerJiffy() * command to figure out the exact frequency. * * @author David Gay */ #include configuration CounterMicro32C { provides interface Counter; } implementation { components CounterThree16C as Counter16, new TransformCounterC(TMicro, uint32_t, TThree, uint16_t, MICA_DIVIDE_THREE_FOR_MICRO_LOG2, counter_three_overflow_t) as Transform32; Counter = Transform32; Transform32.CounterFrom -> Counter16; } tinyos-2.1.2+dfsg/tos/platforms/mica/CounterOne16C.nc000066400000000000000000000017751207233610700223750ustar00rootroot00000000000000// $Id: CounterOne16C.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * 16-bit 32kHz Counter component as per TEP102 HAL guidelines. The mica * family 32kHz clock is built on hardware timer 1, and actually runs at * CPU frequency / 256. You can use the MeasureClockC.cyclesPerJiffy() * command to figure out the exact frequency. * * @author David Gay */ #include configuration CounterOne16C { provides interface Counter; } implementation { components HplAtm128Timer1C as HWTimer, InitOneP, new Atm128CounterC(TOne, uint16_t) as NCounter; Counter = NCounter; NCounter.Timer -> HWTimer; } tinyos-2.1.2+dfsg/tos/platforms/mica/CounterThree16C.nc000066400000000000000000000020221207233610700227050ustar00rootroot00000000000000// $Id: CounterThree16C.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * 16-bit microsecond Counter component as per TEP102 HAL guidelines. The * mica family microsecond clock is built on hardware timer 3, and actually * runs at CPU frequency / 8. You can use the MeasureClockC.cyclesPerJiffy() * command to figure out the exact frequency. * * @author David Gay */ #include configuration CounterThree16C { provides interface Counter; } implementation { components HplAtm128Timer3C as HWTimer, InitThreeP, new Atm128CounterC(TThree, uint16_t) as NCounter; Counter = NCounter; NCounter.Timer -> HWTimer; } tinyos-2.1.2+dfsg/tos/platforms/mica/HilTimerMilliC.nc000066400000000000000000000050241207233610700226400ustar00rootroot00000000000000//$Id: HilTimerMilliC.nc,v 1.5 2010-06-29 22:07:53 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Millisecond timer for the mica family (see TEP102). The "millisecond" * timer system is built on hardware timer 0, running at 1024Hz. * * @author Cory Sharp * @author Martin Turon */ #include "Timer.h" configuration HilTimerMilliC { provides interface Init; provides interface Timer as TimerMilli[uint8_t num]; provides interface LocalTime; } implementation { enum { TIMER_COUNT = uniqueCount(UQ_TIMER_MILLI) }; components AlarmCounterMilliP, new AlarmToTimerC(TMilli), new VirtualizeTimerC(TMilli, TIMER_COUNT), new CounterToLocalTimeC(TMilli); Init = AlarmCounterMilliP; TimerMilli = VirtualizeTimerC; VirtualizeTimerC.TimerFrom -> AlarmToTimerC; AlarmToTimerC.Alarm -> AlarmCounterMilliP; LocalTime = CounterToLocalTimeC; CounterToLocalTimeC.Counter -> AlarmCounterMilliP; } tinyos-2.1.2+dfsg/tos/platforms/mica/InitOneP.nc000066400000000000000000000016261207233610700215220ustar00rootroot00000000000000// $Id: InitOneP.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Internal mica-family timer component. Sets up hardware timer 1 to run * at cpu clock / 256, at boot time. Assumes an ~8MHz CPU clock, replace * this component if you are running at a radically different frequency. * * @author David Gay */ #include configuration InitOneP { } implementation { components PlatformC, HplAtm128Timer1C as HWTimer, new Atm128TimerInitC(uint16_t, MICA_PRESCALER_ONE) as InitOne; PlatformC.SubInit -> InitOne; InitOne.Timer -> HWTimer; } tinyos-2.1.2+dfsg/tos/platforms/mica/InitThreeP.nc000066400000000000000000000016401207233610700220440ustar00rootroot00000000000000// $Id: InitThreeP.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Internal mica-family timer component. Sets up hardware timer 3 to run * at cpu clock / 8, at boot time. Assumes an ~8MHz CPU clock, replace * this component if you are running at a radically different frequency. * * @author David Gay */ #include configuration InitThreeP { } implementation { components PlatformC, HplAtm128Timer3C as HWTimer, new Atm128TimerInitC(uint16_t, MICA_PRESCALER_THREE) as InitThree; PlatformC.SubInit -> InitThree; InitThree.Timer -> HWTimer; } tinyos-2.1.2+dfsg/tos/platforms/mica/LocalTimeMicroC.nc000066400000000000000000000035431207233610700230030ustar00rootroot00000000000000/* * Copyright (c) 2008, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include "Timer.h" configuration LocalTimeMicroC { provides interface LocalTime; } implementation { components CounterMicro32C; components new CounterToLocalTimeC(TMicro); LocalTime = CounterToLocalTimeC; CounterToLocalTimeC.Counter -> CounterMicro32C; } tinyos-2.1.2+dfsg/tos/platforms/mica/MeasureClockC.nc000066400000000000000000000062071207233610700225150ustar00rootroot00000000000000// $Id: MeasureClockC.nc,v 1.6 2010-03-27 21:29:20 mmaroti Exp $ /* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include #include /** * Measure cpu clock frequency at boot time. Provides an Atm128Calibrate * interface so that other components can adjust their calibration as * needed. * * @author David Gay */ module MeasureClockC @safe() { provides { /** * This code MUST be called from PlatformP only, hence the exactlyonce. */ interface Init @exactlyonce(); interface Atm128Calibrate; } } implementation { enum { /* This is expected number of cycles per jiffy at the platform's specified MHz. Assumes PLATFORM_MHZ == 1, 2, 4, 8 or 16. */ MAGIC = 488 / (16 / PLATFORM_MHZ) }; uint16_t cycles; command error_t Init.init() { /* Measure clock cycles per Jiffy (1/32768s) */ /* This code doesn't use the HPL to avoid timing issues when compiling with debugging on */ atomic { uint8_t now, wraps; uint16_t start; /* Setup timer0 to count 32 jiffies, and timer1 cpu cycles */ TCCR1B = 1 << CS10; ASSR = 1 << AS0; TCCR0 = 1 << CS01 | 1 << CS00; /* Wait for 1s for counter to stablilize after power-up (yes, it really does take that long). That's 122 wrap arounds of timer 1 at 8MHz. */ start = TCNT1; for (wraps = MAGIC / 2; wraps; ) { uint16_t next = TCNT1; if (next < start) wraps--; start = next; } /* Wait for a TCNT0 change */ now = TCNT0; while (TCNT0 == now) ; /* Read cpu cycles and wait for next TCNT0 change */ start = TCNT1; now = TCNT0; while (TCNT0 == now) ; cycles = TCNT1; cycles = (cycles - start + 16) >> 5; /* Reset to boot state */ ASSR = TCCR1B = TCCR0 = 0; TCNT0 = 0; TCNT1 = 0; ETIFR = TIFR = 0xff; while (ASSR & (1 << TCN0UB | 1 << OCR0UB | 1 << TCR0UB)) ; } return SUCCESS; } async command uint16_t Atm128Calibrate.cyclesPerJiffy() { return cycles; } async command uint32_t Atm128Calibrate.calibrateMicro(uint32_t n) { return scale32(n, cycles, MAGIC); } async command uint32_t Atm128Calibrate.actualMicro(uint32_t n) { return scale32(n, MAGIC, cycles); } async command uint8_t Atm128Calibrate.adcPrescaler() { /* This is also log2(cycles/3.05). But that's a pain to compute */ if (cycles >= 390) return ATM128_ADC_PRESCALE_128; if (cycles >= 195) return ATM128_ADC_PRESCALE_64; if (cycles >= 97) return ATM128_ADC_PRESCALE_32; if (cycles >= 48) return ATM128_ADC_PRESCALE_16; if (cycles >= 24) return ATM128_ADC_PRESCALE_8; if (cycles >= 12) return ATM128_ADC_PRESCALE_4; return ATM128_ADC_PRESCALE_2; } async command uint16_t Atm128Calibrate.baudrateRegister(uint32_t baudrate) { // value is (cycles*32768) / (8*baudrate) - 1 return ((uint32_t)cycles << 12) / baudrate - 1; } } tinyos-2.1.2+dfsg/tos/platforms/mica/MicaBusAdc.nc000066400000000000000000000013031207233610700217600ustar00rootroot00000000000000// $Id: MicaBusAdc.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * A simplistic beginning to providing a standard interface to the mica-family * 51-pin bus. Just provides the PW0-PW7 digital I/O pins. */ interface MicaBusAdc { /** * Return the A/D channel number to use for one of the ADCn pins. */ async command uint8_t getChannel(); } tinyos-2.1.2+dfsg/tos/platforms/mica/MicaBusC.nc000066400000000000000000000061131207233610700214570ustar00rootroot00000000000000// $Id: MicaBusC.nc,v 1.7 2010-06-15 21:24:16 mmaroti Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * A simplistic beginning to providing a standard interface to the * mica-family 51-pin bus. Just provides the PW0-PW7 and Int0-3 digital * I/O pins and returns the ADC channel number for the ADC pins. * @author David Gay */ configuration MicaBusC { provides { interface GeneralIO as PW0; interface GeneralIO as PW1; interface GeneralIO as PW2; interface GeneralIO as PW3; interface GeneralIO as PW4; interface GeneralIO as PW5; interface GeneralIO as PW6; interface GeneralIO as PW7; interface GeneralIO as Int0; interface GeneralIO as Int1; interface GeneralIO as Int2; interface GeneralIO as Int3; /* INT lines used as interrupt source */ interface GpioInterrupt as Int0_Interrupt; interface GpioInterrupt as Int1_Interrupt; interface GpioInterrupt as Int2_Interrupt; interface GpioInterrupt as Int3_Interrupt; interface GeneralIO as USART1_CLK; interface GeneralIO as USART1_RXD; interface GeneralIO as USART1_TXD; /* Separate interfaces to allow inlining to occur */ interface MicaBusAdc as Adc0; interface MicaBusAdc as Adc1; interface MicaBusAdc as Adc2; interface MicaBusAdc as Adc3; interface MicaBusAdc as Adc4; interface MicaBusAdc as Adc5; interface MicaBusAdc as Adc6; interface MicaBusAdc as Adc7; } } implementation { components HplAtm128GeneralIOC as Pins, MicaBusP; components HplAtm128InterruptC; PW0 = Pins.PortC0; PW1 = Pins.PortC1; PW2 = Pins.PortC2; PW3 = Pins.PortC3; PW4 = Pins.PortC4; PW5 = Pins.PortC5; PW6 = Pins.PortC6; PW7 = Pins.PortC7; Int0 = Pins.PortE4; Int1 = Pins.PortE5; Int2 = Pins.PortE6; Int3 = Pins.PortE7; USART1_CLK = Pins.PortD5; USART1_RXD = Pins.PortD2; USART1_TXD = Pins.PortD3; components new Atm128GpioInterruptC() as Atm128GpioInterrupt0C; Atm128GpioInterrupt0C.Atm128Interrupt->HplAtm128InterruptC.Int4; Int0_Interrupt=Atm128GpioInterrupt0C.Interrupt; components new Atm128GpioInterruptC() as Atm128GpioInterrupt1C; Atm128GpioInterrupt1C.Atm128Interrupt->HplAtm128InterruptC.Int5; Int1_Interrupt=Atm128GpioInterrupt1C.Interrupt; components new Atm128GpioInterruptC() as Atm128GpioInterrupt2C; Atm128GpioInterrupt2C.Atm128Interrupt->HplAtm128InterruptC.Int6; Int2_Interrupt=Atm128GpioInterrupt2C.Interrupt; components new Atm128GpioInterruptC() as Atm128GpioInterrupt3C; Atm128GpioInterrupt3C.Atm128Interrupt->HplAtm128InterruptC.Int7; Int3_Interrupt=Atm128GpioInterrupt3C.Interrupt; Adc0 = MicaBusP.Adc0; Adc1 = MicaBusP.Adc1; Adc2 = MicaBusP.Adc2; Adc3 = MicaBusP.Adc3; Adc4 = MicaBusP.Adc4; Adc5 = MicaBusP.Adc5; Adc6 = MicaBusP.Adc6; Adc7 = MicaBusP.Adc7; } tinyos-2.1.2+dfsg/tos/platforms/mica/MicaBusP.nc000066400000000000000000000024011207233610700214700ustar00rootroot00000000000000// $Id: MicaBusP.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Internal component of the simplistic mica bus interface. * @author David Gay */ module MicaBusP { provides { interface MicaBusAdc as Adc0; interface MicaBusAdc as Adc1; interface MicaBusAdc as Adc2; interface MicaBusAdc as Adc3; interface MicaBusAdc as Adc4; interface MicaBusAdc as Adc5; interface MicaBusAdc as Adc6; interface MicaBusAdc as Adc7; } } implementation { async command uint8_t Adc0.getChannel() { return 0; } async command uint8_t Adc1.getChannel() { return 1; } async command uint8_t Adc2.getChannel() { return 2; } async command uint8_t Adc3.getChannel() { return 3; } async command uint8_t Adc4.getChannel() { return 4; } async command uint8_t Adc5.getChannel() { return 5; } async command uint8_t Adc6.getChannel() { return 6; } async command uint8_t Adc7.getChannel() { return 7; } } tinyos-2.1.2+dfsg/tos/platforms/mica/MicaTimer.h000066400000000000000000000101161207233610700215300ustar00rootroot00000000000000// $Id: MicaTimer.h,v 1.5 2006-12-12 18:23:42 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef MICATIMER_H #define MICATIMER_H /* This file defines the rates at which the mica family's atmega128 timer 1 and 3 timers run at. The goal is to present the user with microsend and 32khz timers, but it may not be possible to run the timers at these rates (because of the limited prescaler selection). So TinyOS picks a prescaler (based on the selected processor MHz) for each of these timers, and builds corresponding 16-bit alarms&counters (AlarmOne16C, AlarmThree16C, CounterOne16C, CounterThree16C) over hardware timers 1 and 3. TinyOS then divides these hardware timers by the appropriate power of 2 to get approximate 32-bit 32kHz and 1MHz alarms and counters (Alarm32khz32C, AlarmMicro32C, Counter32khz32C, CounterMicro32C). The constants and typedefs for all this configuration are defined here, based on the value of the MHZ preprocessor symbol, which shoud approximate the platform's MHZ rate. Note that the timers thus obtained will not be exactly at 32768Hz or 1MHz, because the clock doesn't divide by a power of two to those frequencies, and/or the clock frequency is not accurate. If you need more accurate timing, you should use the calibration functions offered by the Atm128Calibrate interface provided by PlatformC. This file also defines EXT_STANDBY_T0_THRESHOLD, a threshold on remaining time till the next timer 0 interrupt under which the mote should sleep in ext standby rather than power save. This is only important when not using the internal oscillator. Wake up from power save takes 65536 cycles (6 cycles for ext standby), which is, e.g., ~9.4ms at 7Mhz. */ #include #include /* Some types for the non-standard rates that mica timers might be running at. */ typedef struct { } T64khz; typedef struct { } T128khz; typedef struct { } T2mhz; typedef struct { } T4mhz; /* TX is the typedef for the rate of timer X, MICA_PRESCALER_X is the prescaler for timer X, MICA_DIVIDER_X_FOR_Y_LOG2 is the number of bits to shift timer X by to get rate Y, counter_X_overflow_t is uint16_t if MICA_DIVIDER_X_FOR_Y_LOG2 is 0, uint32_t otherwise. */ #if MHZ == 1 typedef T128khz TOne; typedef TMicro TThree; typedef uint32_t counter_one_overflow_t; typedef uint16_t counter_three_overflow_t; enum { MICA_PRESCALER_ONE = ATM128_CLK16_DIVIDE_8, MICA_DIVIDE_ONE_FOR_32KHZ_LOG2 = 2, MICA_PRESCALER_THREE = ATM128_CLK16_NORMAL, MICA_DIVIDE_THREE_FOR_MICRO_LOG2 = 0, EXT_STANDBY_T0_THRESHOLD = 80, }; #elif MHZ == 2 typedef T32khz TOne; typedef T2mhz TThree; typedef uint16_t counter_one_overflow_t; typedef uint32_t counter_three_overflow_t; enum { MICA_PRESCALER_ONE = ATM128_CLK16_DIVIDE_64, MICA_DIVIDE_ONE_FOR_32KHZ_LOG2 = 0, MICA_PRESCALER_THREE = ATM128_CLK16_NORMAL, MICA_DIVIDE_THREE_FOR_MICRO_LOG2 = 1, EXT_STANDBY_T0_THRESHOLD = 40 }; #elif MHZ == 4 typedef T64khz TOne; typedef T4mhz TThree; typedef uint32_t counter_one_overflow_t; typedef uint32_t counter_three_overflow_t; enum { MICA_PRESCALER_ONE = ATM128_CLK16_DIVIDE_64, MICA_DIVIDE_ONE_FOR_32KHZ_LOG2 = 1, MICA_PRESCALER_THREE = ATM128_CLK16_NORMAL, MICA_DIVIDE_THREE_FOR_MICRO_LOG2 = 2, EXT_STANDBY_T0_THRESHOLD = 24 }; #elif MHZ == 8 typedef T32khz TOne; typedef TMicro TThree; typedef uint16_t counter_one_overflow_t; typedef uint16_t counter_three_overflow_t; enum { MICA_PRESCALER_ONE = ATM128_CLK16_DIVIDE_256, MICA_DIVIDE_ONE_FOR_32KHZ_LOG2 = 0, MICA_PRESCALER_THREE = ATM128_CLK16_DIVIDE_8, MICA_DIVIDE_THREE_FOR_MICRO_LOG2 = 0, EXT_STANDBY_T0_THRESHOLD = 12 }; #else #error "Unknown clock rate. MHZ must be defined to one of 1, 2, 4, or 8." #endif enum { PLATFORM_MHZ = MHZ }; #endif tinyos-2.1.2+dfsg/tos/platforms/mica/PlatformC.nc000066400000000000000000000045021207233610700217200ustar00rootroot00000000000000/// $Id: PlatformC.nc,v 1.5 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Initialisation component for mica-family platforms. See TEP107. Each * mica-family member must also provide a MotePlatformC with initialisation * specific to that member. * * @author Martin Turon */ #include "hardware.h" configuration PlatformC { provides { interface Init; /** * Provides calibration information for other components. */ interface Atm128Calibrate; } uses interface Init as SubInit; } implementation { components PlatformP, MotePlatformC, MeasureClockC; Init = PlatformP; Atm128Calibrate = MeasureClockC; PlatformP.MeasureClock -> MeasureClockC; PlatformP.MoteInit -> MotePlatformC; MotePlatformC.SubInit = SubInit; } tinyos-2.1.2+dfsg/tos/platforms/mica/PlatformLedsC.nc000066400000000000000000000042201207233610700225250ustar00rootroot00000000000000// $Id: PlatformLedsC.nc,v 1.5 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Platform-specific LED interface. * * @author Martin Turon */ #include "hardware.h" configuration PlatformLedsC { provides interface GeneralIO as Led0; provides interface GeneralIO as Led1; provides interface GeneralIO as Led2; uses interface Init; } implementation { components HplAtm128GeneralIOC as IO; components PlatformP; Init = PlatformP.MoteInit; Led0 = IO.PortA2; // Pin A2 = Red LED Led1 = IO.PortA1; // Pin A1 = Green LED Led2 = IO.PortA0; // Pin A0 = Yellow LED } tinyos-2.1.2+dfsg/tos/platforms/mica/PlatformP.nc000066400000000000000000000041161207233610700217360ustar00rootroot00000000000000/// $Id: PlatformP.nc,v 1.6 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Internal platform boot code. * * @author Martin Turon */ #include "hardware.h" module PlatformP @safe() { provides interface Init; uses interface Init as MoteInit; uses interface Init as MeasureClock; } implementation { command error_t Init.init() { error_t ok; /* First thing is to measure the clock frequency */ ok = call MeasureClock.init(); ok = ecombine(ok, call MoteInit.init()); return ok; } } tinyos-2.1.2+dfsg/tos/platforms/mica/PlatformSerialC.nc000066400000000000000000000040271207233610700230620ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Alec Woo * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:42 $ */ configuration PlatformSerialC { provides interface StdControl; provides interface UartStream; provides interface UartByte; } implementation { components Atm128Uart0C as Uart0; StdControl = Uart0; UartStream = Uart0; UartByte = Uart0; components CounterMicro32C; Uart0.Counter -> CounterMicro32C; } tinyos-2.1.2+dfsg/tos/platforms/mica/VoltageC.nc000066400000000000000000000037441207233610700215440ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Battery Voltage. The returned value represents the difference * between the battery voltage and V_BG (1.23V). The formula to convert * it to mV is: 1223 * 1024 / value. * * @author Razvan Musaloiu-E. */ generic configuration VoltageC() { provides interface Read; } implementation { components new AdcReadClientC(), VoltageP; Read = AdcReadClientC; AdcReadClientC.Atm128AdcConfig -> VoltageP; } tinyos-2.1.2+dfsg/tos/platforms/mica/VoltageNowC.nc000066400000000000000000000041121207233610700222160ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Battery Voltage. The returned value represents the difference * between the battery voltage and V_BG (1.23V). The formula to convert * it to mV is: 1223 * 1024 / value. * * @author Razvan Musaloiu-E. */ #include "hardware.h" generic configuration VoltageNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new AdcReadNowClientC(), VoltageP; ReadNow = AdcReadNowClientC; Resource = AdcReadNowClientC; AdcReadNowClientC.Atm128AdcConfig -> VoltageP; } tinyos-2.1.2+dfsg/tos/platforms/mica/VoltageP.nc000066400000000000000000000043141207233610700215530ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Battery Voltage. The returned value represents the difference * between the battery voltage and V_BG (1.23V). The formula to convert * it to mV is: 1223 * 1024 / value. * * @author Razvan Musaloiu-E. */ module VoltageP { provides interface Atm128AdcConfig; } implementation { async command uint8_t Atm128AdcConfig.getChannel() { // select the 1.23V (V_BG). Reference: Table 97, page 244 from the Atmega128 return ATM128_ADC_SNGL_1_23; } async command uint8_t Atm128AdcConfig.getRefVoltage() { return ATM128_ADC_VREF_OFF; } async command uint8_t Atm128AdcConfig.getPrescaler() { return ATM128_ADC_PRESCALE; } } tinyos-2.1.2+dfsg/tos/platforms/mica/VoltageStreamC.nc000066400000000000000000000040351207233610700227120ustar00rootroot00000000000000/* Copyright (c) 2007 Johns Hopkins University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Battery Voltage. The returned value represents the difference * between the battery voltage and V_BG (1.23V). The formula to convert * it to mV is: 1223 * 1024 / value. * * @author Razvan Musaloiu-E. */ #include "hardware.h" generic configuration VoltageStreamC() { provides interface ReadStream; } implementation { components VoltageP, new AdcReadStreamClientC(); ReadStream = AdcReadStreamClientC; AdcReadStreamClientC.Atm128AdcConfig -> VoltageP; } tinyos-2.1.2+dfsg/tos/platforms/mica/chips/000077500000000000000000000000001207233610700206145ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica/chips/at45db/000077500000000000000000000000001207233610700216775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica/chips/at45db/HplAt45dbC.nc000066400000000000000000000020021207233610700240050ustar00rootroot00000000000000// $Id: HplAt45dbC.nc,v 1.4 2006-12-12 18:23:42 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * AT45DB flash chip HPL for mica family. Each family member must provide * and HplAt45dbIOC component implementing the SPIByte and HplAt45dbByte * interfaces required by HplAt45dbByteC. * * @author David Gay */ configuration HplAt45dbC { provides interface HplAt45db @atmostonce(); } implementation { // 9 because the AT45DB041B has 264 byte pages (log2 page size rounded up) components new HplAt45dbByteC(9), HplAt45dbIOC; HplAt45db = HplAt45dbByteC; HplAt45dbByteC.Resource -> HplAt45dbIOC; HplAt45dbByteC.FlashSpi -> HplAt45dbIOC; HplAt45dbByteC.HplAt45dbByte -> HplAt45dbIOC; } tinyos-2.1.2+dfsg/tos/platforms/mica/platform.h000066400000000000000000000000001207233610700214710ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica/sim/000077500000000000000000000000001207233610700202765ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica/sim/HilTimerMilliC.nc000066400000000000000000000047461207233610700234420ustar00rootroot00000000000000//$Id: HilTimerMilliC.nc,v 1.5 2010-06-29 22:07:53 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Millisecond timer for the mica family (see TEP102). The "millisecond" * timer system is built on hardware timer 0, running at 1024Hz. * * @author Cory Sharp * @author Martin Turon */ #include "Timer.h" configuration HilTimerMilliC { provides interface Init; provides interface Timer as TimerMilli[uint8_t num]; provides interface LocalTime; } implementation { components AlarmCounterMilliP, new AlarmToTimerC(TMilli), new VirtualizeTimerC(TMilli, uniqueCount(UQ_TIMER_MILLI)), new CounterToLocalTimeC(TMilli); Init = AlarmCounterMilliP; TimerMilli = VirtualizeTimerC; VirtualizeTimerC.TimerFrom -> AlarmToTimerC; AlarmToTimerC.Alarm -> AlarmCounterMilliP; LocalTime = CounterToLocalTimeC; CounterToLocalTimeC.Counter -> AlarmCounterMilliP; } tinyos-2.1.2+dfsg/tos/platforms/mica/sim/MeasureClockC.nc000066400000000000000000000012311207233610700232750ustar00rootroot00000000000000#include "scale.h" /** * Simulation version of MeasureClockC for the mica platform. See * tos/platforms/mica/MeasureClockC.nc for more details. * * @author Phil Levis */ module MeasureClockC { /* This code MUST be called from PlatformP only, hence the exactlyonce */ provides interface Init @exactlyonce(); provides { command uint16_t cyclesPerJiffy(); command uint32_t calibrateMicro(uint32_t n); } } implementation { command error_t Init.init() { return SUCCESS; } command uint16_t cyclesPerJiffy() { return (1 << 8); } command uint32_t calibrateMicro(uint32_t n) { return scale32(n + 122, 244, (1 << 32)); } } tinyos-2.1.2+dfsg/tos/platforms/mica/sim/PlatformC.nc000066400000000000000000000040601207233610700225070ustar00rootroot00000000000000/// $Id: PlatformC.nc,v 1.5 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Martin Turon */ #include "hardware.h" configuration PlatformC { provides { interface Init; command uint32_t calibrateMicro(uint32_t n); } uses interface Init as SubInit; } implementation { components PlatformP, MotePlatformC, MeasureClockC; Init = PlatformP; PlatformP.MoteInit -> MotePlatformC; MotePlatformC.SubInit = SubInit; PlatformP.MeasureClock -> MeasureClockC; } tinyos-2.1.2+dfsg/tos/platforms/mica2/000077500000000000000000000000001207233610700175705ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica2/.platform000066400000000000000000000027731207233610700214260ustar00rootroot00000000000000# # FILE: mica2/.platform # # Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. # # $Id: .platform,v 1.9 2008-05-31 20:18:32 regehr Exp $ # push( @includes, qw( %T/platforms/mica %T/platforms/mica2/chips/cc1000 %T/chips/cc1000 %T/platforms/mica2/chips/at45db %T/platforms/mica/chips/at45db %T/chips/at45db %T/chips/atm128 %T/chips/atm128/adc %T/chips/atm128/i2c %T/chips/atm128/pins %T/chips/atm128/spi %T/chips/atm128/timer %T/lib/timer %T/lib/serial %T/lib/power ) ); @opts = qw( -gcc=avr-gcc -mmcu=atmega128 -fnesc-target=avr -fnesc-no-debug ); push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{'CIL_MACHINE'} = "version_major=3 " . "version_minor=4 " . "version=avr-3.4.3 " . "short=2,1, " . "int=2,1 " . "long=4,1 " . "long_long=8,1 " . "pointer=2,1 " . "enum=2,1 " . "float=4,1 " . "double=4,1 " . "long_double=4,1 " . "void=1,1 " . "fun=1,1 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/mica2/ActiveMessageC.nc000066400000000000000000000060741207233610700227440ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.8 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.8 2010-06-29 22:07:53 scipio Exp $ * */ /** * The Active Message layer on the mica2 platform. This is a naming wrapper * around the CC1000 Active Message layer. * * @author Philip Levis * @date June 19 2005 */ configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStampMilli; interface PacketTimeStamp as PacketTimeStamp32khz; interface LowPowerListening; } } implementation { components CC1000ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; PacketTimeStampMilli = AM; PacketTimeStamp32khz = AM; LowPowerListening = AM; } tinyos-2.1.2+dfsg/tos/platforms/mica2/DemoSensorC.nc000066400000000000000000000011731207233610700222750ustar00rootroot00000000000000/* $Id: DemoSensorC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Demo sensor for the mica2 platform. * * @author David Gay */ generic configuration DemoSensorC() { provides interface Read; } implementation { components new VoltageC() as Sensor; Read = Sensor; } tinyos-2.1.2+dfsg/tos/platforms/mica2/DemoSensorNowC.nc000066400000000000000000000012761207233610700227650ustar00rootroot00000000000000/* $Id: DemoSensorNowC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Demo sensor for the mica2 platform. * * @author David Gay */ generic configuration DemoSensorNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new VoltageNowC() as Sensor; Resource = Sensor; ReadNow = Sensor; } tinyos-2.1.2+dfsg/tos/platforms/mica2/DemoSensorStreamC.nc000066400000000000000000000012451207233610700234510ustar00rootroot00000000000000/* $Id: DemoSensorStreamC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Demo sensor for the mica2 platform. * * @author David Gay */ generic configuration DemoSensorStreamC() { provides interface ReadStream; } implementation { components new VoltageStreamC() as SensorStream; ReadStream = SensorStream; } tinyos-2.1.2+dfsg/tos/platforms/mica2/MotePlatformC.nc000066400000000000000000000015371207233610700226340ustar00rootroot00000000000000/* $Id: MotePlatformC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The portion of a mica-family initialisation that is mote-specific. * * @author David Gay */ configuration MotePlatformC { provides interface Init as PlatformInit; uses interface Init as SubInit; } implementation { components MotePlatformP, HplCC1000InitP, HplAtm128GeneralIOC as IO; PlatformInit = MotePlatformP; PlatformInit = HplCC1000InitP; MotePlatformP.SerialIdPin -> IO.PortA4; SubInit = MotePlatformP.SubInit; } tinyos-2.1.2+dfsg/tos/platforms/mica2/MotePlatformP.nc000066400000000000000000000017411207233610700226460ustar00rootroot00000000000000/* $Id: MotePlatformP.nc,v 1.5 2008-06-26 04:39:08 regehr Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The portion of a mica-family initialisation that is mote-specific. * * @author David Gay */ module MotePlatformP @safe() { provides interface Init as PlatformInit; uses interface GeneralIO as SerialIdPin; uses interface Init as SubInit; } implementation { command error_t PlatformInit.init() { // Pull C I/O port pins low PORTC = 0; DDRC = 0xff; // Prevent sourcing current call SerialIdPin.makeInput(); call SerialIdPin.clr(); return call SubInit.init(); } default command error_t SubInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/mica2/NestedResourceC.nc000066400000000000000000000031741207233610700231540ustar00rootroot00000000000000/* $Id: NestedResourceC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Package up two resources as one. Requests and releases are passed on to * both resources. granted is only signaled when both Resources are granted. * * @author David Gay */ generic module NestedResourceC() { provides interface Resource; uses { /** * First Resource to merge. This Resource MUST NOT be wired elsewhere. */ interface Resource as Resource1; /** * Second Resource to merge. This Resource MUST NOT be wired elsewhere. */ interface Resource as Resource2; } } implementation { async command error_t Resource.request() { return call Resource1.request(); } event void Resource1.granted() { call Resource2.request(); } event void Resource2.granted() { signal Resource.granted(); } async command error_t Resource.immediateRequest() { if (call Resource1.immediateRequest() == SUCCESS) { if (call Resource2.immediateRequest() == SUCCESS) return SUCCESS; call Resource1.release(); } return EBUSY; } async command error_t Resource.release() { if(call Resource1.release() == SUCCESS) return call Resource2.release(); return FAIL; } async command bool Resource.isOwner() { return call Resource1.isOwner(); } } tinyos-2.1.2+dfsg/tos/platforms/mica2/TimeSyncMessageC.nc000066400000000000000000000063241207233610700232620ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * The Active Message layer on the mica2 platform. This is a naming wrapper * around the CC1000 Active Message layer that implemets timesync interface (TEP 133). * * @author Philip Levis * @author Brano Kusy * @author Marco Langerwisch (Mica2 port) */ configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSend32khz[am_id_t id]; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC1000TimeSyncMessageC as AM; SplitControl = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; TimeSyncAMSend32khz = AM; TimeSyncAMSendMilli = AM; TimeSyncPacket32khz = AM; TimeSyncPacketMilli = AM; PacketTimeStamp32khz = AM; PacketTimeStampMilli = AM; } tinyos-2.1.2+dfsg/tos/platforms/mica2/chips/000077500000000000000000000000001207233610700206765ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica2/chips/at45db/000077500000000000000000000000001207233610700217615ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica2/chips/at45db/HplAt45dbIOC.nc000066400000000000000000000023121207233610700243230ustar00rootroot00000000000000// $Id: HplAt45dbIOC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Low-level access functions for the AT45DB flash on the mica2 and micaz. * * @author David Gay */ configuration HplAt45dbIOC { provides { interface Resource; interface SpiByte as FlashSpi; interface HplAt45dbByte; } } implementation { // Wire up byte I/O to At45db components HplAt45dbIOP, HplAtm128GeneralIOC as Pins, HplAtm128InterruptC, PlatformC; components BusyWaitMicroC; components new NoArbiterC(); Resource = NoArbiterC; FlashSpi = HplAt45dbIOP; HplAt45dbByte = HplAt45dbIOP; PlatformC.SubInit -> HplAt45dbIOP; HplAt45dbIOP.Select -> Pins.PortA3; HplAt45dbIOP.Clk -> Pins.PortD5; HplAt45dbIOP.In -> Pins.PortD2; HplAt45dbIOP.Out -> Pins.PortD3; HplAt45dbIOP.InInterrupt -> HplAtm128InterruptC.Int2; HplAt45dbIOP.BusyWait -> BusyWaitMicroC; } tinyos-2.1.2+dfsg/tos/platforms/mica2/chips/at45db/HplAt45dbIOP.nc000066400000000000000000000112261207233610700243440ustar00rootroot00000000000000// $Id: HplAt45dbIOP.nc,v 1.6 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Low level hardware access to the onboard AT45DB flash chip. *

      * Note: This component includes optimised bit-banging SPI code with the * pins hardwired. Don't copy it to some other platform without * understanding it (see txByte). * * @author Jason Hill * @author David Gay * @author Philip Levis */ #include "Timer.h" module HplAt45dbIOP { provides { interface Init; interface SpiByte as FlashSpi; interface HplAt45dbByte; } uses { interface GeneralIO as Select; interface GeneralIO as Clk; interface GeneralIO as Out; interface GeneralIO as In; interface HplAtm128Interrupt as InInterrupt; interface BusyWait; } } implementation { // We use SPI mode 0 (clock low at select time) command error_t Init.init() { call Select.makeOutput(); call Select.set(); call Clk.clr(); call Clk.makeOutput(); call Out.set(); call Out.makeOutput(); call In.clr(); call In.makeInput(); call InInterrupt.disable(); call InInterrupt.edge(TRUE); return SUCCESS; } command void HplAt45dbByte.select() { call Clk.clr(); // ensure SPI mode 0 call Select.clr(); } command void HplAt45dbByte.deselect() { call Select.set(); } #define BITINIT \ uint8_t clrClkAndData = PORTD & ~0x28 #define BIT(n) \ PORTD = clrClkAndData; \ asm __volatile__ \ ( "sbrc %2," #n "\n" \ "\tsbi 18,3\n" \ "\tsbi 18,5\n" \ "\tsbic 16,2\n" \ "\tori %0,1<<" #n "\n" \ : "=d" (spiIn) : "0" (spiIn), "r" (spiOut)) async command uint8_t FlashSpi.write(uint8_t spiOut) { uint8_t spiIn = 0; // This atomic ensures integrity at the hardware level... atomic { BITINIT; BIT(7); BIT(6); BIT(5); BIT(4); BIT(3); BIT(2); BIT(1); BIT(0); } return spiIn; } task void avail() { signal HplAt45dbByte.idle(); } command void HplAt45dbByte.waitIdle() { // Setup interrupt on rising edge of flash in atomic { call InInterrupt.clear(); call InInterrupt.enable(); call Clk.clr(); // We need to wait at least 2 cycles here (because of the signal // acquisition delay). It's also good to wait a few microseconds // to get the fast ("FAIL") exit from wait (reads are twice as fast // with a 2us delay...) call BusyWait.wait(2); if (call In.get()) signal InInterrupt.fired(); // already high } } async event void InInterrupt.fired() { call InInterrupt.disable(); post avail(); } command bool HplAt45dbByte.getCompareStatus() { call Clk.set(); call Clk.clr(); // Wait for compare value to propagate asm volatile("nop"); asm volatile("nop"); return !call In.get(); } } tinyos-2.1.2+dfsg/tos/platforms/mica2/chips/at45db/HplAt45db_chip.h000066400000000000000000000045011207233610700246240ustar00rootroot00000000000000// $Id: HplAt45db_chip.h,v 1.6 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef HPLAT45DB_CHIP_H #define HPLAT45DB_CHIP_H // flash characteristics enum { AT45_MAX_PAGES = 2048, AT45_PAGE_SIZE = 264, AT45_PAGE_SIZE_LOG2 = 8 // For those who want to ignore the last 8 bytes }; typedef uint16_t at45page_t; typedef uint16_t at45pageoffset_t; /* must fit 0 to AT45_PAGE_SIZE - 1 */ #endif tinyos-2.1.2+dfsg/tos/platforms/mica2/chips/cc1000/000077500000000000000000000000001207233610700215645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica2/chips/cc1000/HplCC1000C.nc000066400000000000000000000052101207233610700234410ustar00rootroot00000000000000// $Id: HplCC1000C.nc,v 1.7 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * HPL for the CC1000 radio, for the mica2 platform. * * @author David Gay */ configuration HplCC1000C { provides { interface ReadNow as RssiAdc; interface Resource as RssiResource; interface HplCC1000Spi; interface HplCC1000; } } implementation { components HplCC1000P, HplCC1000SpiP; components new AdcReadNowClientC() as RssiChannel; HplCC1000 = HplCC1000P; HplCC1000Spi = HplCC1000SpiP; RssiAdc = RssiChannel; RssiResource = RssiChannel; RssiChannel.Atm128AdcConfig -> HplCC1000P; // HplCC1000M, HplCC1000SpiM are wired in HplCC1000InitC which is always // included (see MotePlatformC.nc). } tinyos-2.1.2+dfsg/tos/platforms/mica2/chips/cc1000/HplCC1000InitP.nc000066400000000000000000000052151207233610700243070ustar00rootroot00000000000000// $Id: HplCC1000InitP.nc,v 1.6 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Hardware initialisation for the CC1000 radio. This component is always * included even if the radio is not used. * * @author David Gay */ configuration HplCC1000InitP { provides interface Init as PlatformInit; } implementation { components HplCC1000P, HplCC1000SpiP, HplAtm128GeneralIOC as IO; PlatformInit = HplCC1000P; PlatformInit = HplCC1000SpiP; HplCC1000P.CHP_OUT -> IO.PortA6; HplCC1000P.PALE -> IO.PortD4; HplCC1000P.PCLK -> IO.PortD6; HplCC1000P.PDATA -> IO.PortD7; HplCC1000SpiP.SpiSck -> IO.PortB1; HplCC1000SpiP.SpiMiso -> IO.PortB3; HplCC1000SpiP.SpiMosi -> IO.PortB2; HplCC1000SpiP.OC1C -> IO.PortB7; } tinyos-2.1.2+dfsg/tos/platforms/mica2/chips/cc1000/HplCC1000P.nc000066400000000000000000000153721207233610700234700ustar00rootroot00000000000000// $Id: HplCC1000P.nc,v 1.7 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Low level hardware access to the CC1000. * * @author Jaein Jeong * @author Philip Buonadonna */ #include "Atm128Adc.h" #include "CC1000Const.h" module HplCC1000P @safe() { provides { interface Init as PlatformInit; interface HplCC1000; interface Atm128AdcConfig as RssiConfig; } uses { /* These are the CC1000 pin names */ interface GeneralIO as CHP_OUT; interface GeneralIO as PALE; interface GeneralIO as PCLK; interface GeneralIO as PDATA; } } implementation { command error_t PlatformInit.init() { call CHP_OUT.makeInput(); call PALE.makeOutput(); call PCLK.makeOutput(); call PDATA.makeOutput(); call PALE.set(); call PDATA.set(); call PCLK.set(); // MAIN register to power down mode. Shut everything off call HplCC1000.write(CC1K_MAIN, 1 << CC1K_RX_PD | 1 << CC1K_TX_PD | 1 << CC1K_FS_PD | 1 << CC1K_CORE_PD | 1 << CC1K_BIAS_PD | 1 << CC1K_RESET_N); call HplCC1000.write(CC1K_PA_POW, 0); // turn off rf amp return SUCCESS; } command void HplCC1000.init() { } //********************************************************/ // function: write */ // description: accepts a 7 bit address and 8 bit data, */ // creates an array of ones and zeros for each, and */ // uses a loop counting thru the arrays to get */ // consistent timing for the chipcon radio control */ // interface. PALE active low, followed by 7 bits */ // msb first of address, then lsb high for write */ // cycle, followed by 8 bits of data msb first. data */ // is clocked out on the falling edge of PCLK. */ // Input: 7 bit address, 8 bit data */ //********************************************************/ async command void HplCC1000.write(uint8_t addr, uint8_t data) { char cnt = 0; // address cycle starts here addr <<= 1; call PALE.clr(); // enable PALE for (cnt=0;cnt<7;cnt++) // send addr PDATA msb first { if (addr&0x80) call PDATA.set(); else call PDATA.clr(); call PCLK.clr(); // toggle the PCLK call PCLK.set(); addr <<= 1; } call PDATA.set(); call PCLK.clr(); // toggle the PCLK call PCLK.set(); call PALE.set(); // disable PALE // data cycle starts here for (cnt=0;cnt<8;cnt++) // send data PDATA msb first { if (data&0x80) call PDATA.set(); else call PDATA.clr(); call PCLK.clr(); // toggle the PCLK call PCLK.set(); data <<= 1; } call PALE.set(); call PDATA.set(); call PCLK.set(); } //********************************************************/ // function: read */ // description: accepts a 7 bit address, */ // creates an array of ones and zeros for each, and */ // uses a loop counting thru the arrays to get */ // consistent timing for the chipcon radio control */ // interface. PALE active low, followed by 7 bits */ // msb first of address, then lsb low for read */ // cycle, followed by 8 bits of data msb first. data */ // is clocked in on the falling edge of PCLK. */ // Input: 7 bit address */ // Output: 8 bit data */ //********************************************************/ async command uint8_t HplCC1000.read(uint8_t addr) { int cnt; uint8_t din; uint8_t data = 0; // address cycle starts here addr <<= 1; call PALE.clr(); // enable PALE for (cnt=0;cnt<7;cnt++) // send addr PDATA msb first { if (addr&0x80) call PDATA.set(); else call PDATA.clr(); call PCLK.clr(); // toggle the PCLK call PCLK.set(); addr <<= 1; } call PDATA.clr(); call PCLK.clr(); // toggle the PCLK call PCLK.set(); call PDATA.makeInput(); // read data from chipcon call PALE.set(); // disable PALE // data cycle starts here for (cnt=7;cnt>=0;cnt--) // send data PDATA msb first { call PCLK.clr(); // toggle the PCLK din = call PDATA.get(); if(din) data = (data<<1)|0x01; else data = (data<<1)&0xfe; call PCLK.set(); } call PALE.set(); call PDATA.makeOutput(); call PDATA.set(); return data; } async command bool HplCC1000.getLOCK() { return call CHP_OUT.get(); } async command uint8_t RssiConfig.getChannel() { return CHANNEL_RSSI; } async command uint8_t RssiConfig.getRefVoltage() { return ATM128_ADC_VREF_OFF; } async command uint8_t RssiConfig.getPrescaler() { return ATM128_ADC_PRESCALE; } } tinyos-2.1.2+dfsg/tos/platforms/mica2/chips/cc1000/HplCC1000SpiP.nc000066400000000000000000000075601207233610700241440ustar00rootroot00000000000000// $Id: HplCC1000SpiP.nc,v 1.7 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Low-level functions to access the CC1000 bus. Built using the mica2 * hardware SPI. * * @author Jaein Jeong * @author Philip buonadonna */ module HplCC1000SpiP @safe() { provides interface Init as PlatformInit; provides interface HplCC1000Spi; //uses interface PowerManagement; uses { interface GeneralIO as SpiSck; interface GeneralIO as SpiMiso; interface GeneralIO as SpiMosi; interface GeneralIO as OC1C; } } implementation { uint8_t outgoingByte; command error_t PlatformInit.init() { call SpiSck.makeInput(); call OC1C.makeInput(); call HplCC1000Spi.rxMode(); return SUCCESS; } AVR_ATOMIC_HANDLER(SIG_SPI) { register uint8_t temp = SPDR; SPDR = outgoingByte; signal HplCC1000Spi.dataReady(temp); } default async event void HplCC1000Spi.dataReady(uint8_t data) { } async command void HplCC1000Spi.writeByte(uint8_t data) { atomic outgoingByte = data; } async command bool HplCC1000Spi.isBufBusy() { return bit_is_clear(SPSR, SPIF); } async command uint8_t HplCC1000Spi.readByte() { return SPDR; } async command void HplCC1000Spi.enableIntr() { //sbi(SPCR,SPIE); SPCR = 0xc0; CLR_BIT(DDRB, 0); //call PowerManagement.adjustPower(); } async command void HplCC1000Spi.disableIntr() { CLR_BIT(SPCR, SPIE); SET_BIT(DDRB, 0); CLR_BIT(PORTB, 0); //call PowerManagement.adjustPower(); } async command void HplCC1000Spi.initSlave() { atomic { CLR_BIT(SPCR, CPOL); // Set proper polarity... CLR_BIT(SPCR, CPHA); // ...and phase SET_BIT(SPCR, SPIE); // enable spi port SET_BIT(SPCR, SPE); } } async command void HplCC1000Spi.txMode() { call SpiMiso.makeOutput(); call SpiMosi.makeOutput(); } async command void HplCC1000Spi.rxMode() { call SpiMiso.makeInput(); call SpiMosi.makeInput(); } } tinyos-2.1.2+dfsg/tos/platforms/mica2/chips/ds2401/000077500000000000000000000000001207233610700216135ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica2/chips/ds2401/CachedIeeeEui64C.nc000066400000000000000000000040671207233610700250230ustar00rootroot00000000000000// $Id: CachedIeeeEui64C.nc,v 1.2 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ /** * Cache an EUI 64 at initialization time and return the cached value for * subsequent queries. */ configuration CachedIeeeEui64C { uses interface LocalIeeeEui64 as SubIeeeEui64; provides interface LocalIeeeEui64; } implementation { components CachedIeeeEui64P, MotePlatformC; MotePlatformC.SubInit -> CachedIeeeEui64P.Init; SubIeeeEui64 = CachedIeeeEui64P; LocalIeeeEui64 = CachedIeeeEui64P; } tinyos-2.1.2+dfsg/tos/platforms/mica2/chips/ds2401/LocalIeeeEui64C.nc000066400000000000000000000046531207233610700247070ustar00rootroot00000000000000// $Id: LocalIeeeEui64C.nc,v 1.2 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai */ /** * Mica2-specific wiring to access the DS2401 hardware ID chip through the * LocalIeeeEui64 interface. The CachedIeeeEui64C component reads the ID * during hardware initialization, caches it, and returns the cached value at * subsequent calls to LocalIeeeEui64.getId(). */ configuration LocalIeeeEui64C { provides interface LocalIeeeEui64; } implementation { components OneWireMasterC as OneWireC, HplDs2401C, BusyWaitMicroC, HplAtm128GeneralIOC, Ds2401ToIeeeEui64C, CachedIeeeEui64C; OneWireC.Pin -> HplAtm128GeneralIOC.PortA4; OneWireC.BusyWaitMicro -> BusyWaitMicroC.BusyWait; HplDs2401C.OneWire -> OneWireC; Ds2401ToIeeeEui64C.Hpl -> HplDs2401C; CachedIeeeEui64C.SubIeeeEui64 -> Ds2401ToIeeeEui64C; LocalIeeeEui64 = CachedIeeeEui64C; } tinyos-2.1.2+dfsg/tos/platforms/mica2/deluge.xml000066400000000000000000000001201207233610700215500ustar00rootroot00000000000000 tinyos-2.1.2+dfsg/tos/platforms/mica2/hardware.h000066400000000000000000000056521207233610700215460ustar00rootroot00000000000000/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. * Copyright (c) 2002-2003 Intel Corporation. * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Jason Hill, Philip Levis, Nelson Lee, David Gay * @author Alan Broad * @author Matt Miller * @author Martin Turon * * $Id: hardware.h,v 1.8 2010-06-29 22:07:53 scipio Exp $ */ #ifndef HARDWARE_H #define HARDWARE_H #ifndef MHZ /* Clock rate is ~8MHz except if specified by user (this value must be a power of 2, see MicaTimer.h and MeasureClockC.nc) */ #define MHZ 8 #endif #include #include #include // enum so components can override power saving, // as per TEP 112. enum { TOS_SLEEP_NONE = ATM128_POWER_IDLE, }; // A/D channels enum { CHANNEL_RSSI = ATM128_ADC_SNGL_ADC0, CHANNEL_THERMISTOR = ATM128_ADC_SNGL_ADC1, // normally unpopulated CHANNEL_BATTERY = ATM128_ADC_SNGL_ADC7, }; #ifndef PLATFORM_BAUDRATE enum { PLATFORM_BAUDRATE = 57600L }; #endif #endif //HARDWARE_H tinyos-2.1.2+dfsg/tos/platforms/mica2/platform.h000066400000000000000000000000001207233610700215530ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica2/platform_message.h000066400000000000000000000051211207233610700232700ustar00rootroot00000000000000/* $Id: platform_message.h,v 1.6 2010-06-29 22:07:53 scipio Exp $ * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Defining the platform-independently named packet structures to be the * chip-specific CC1000 packet structures. * * @author Philip Levis * @date May 16 2005 * Revision: $Revision: 1.6 $ */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include "CC1000Msg.h" #include "Serial.h" typedef union message_header { cc1000_header_t cc1k; serial_header_t serial; } message_header_t; typedef union message_footer { cc1000_footer_t cc1k; } message_footer_t; typedef union message_metadata { cc1000_metadata_t cc1k; serial_metadata_t serial; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/mica2dot/000077500000000000000000000000001207233610700202775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica2dot/.platform000066400000000000000000000031331207233610700221240ustar00rootroot00000000000000# # FILE: micaz/.platform # # Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. # # $Id: .platform,v 1.8 2008-06-24 19:03:34 beutel Exp $ # push( @includes, qw( %T/platforms/mica2dot %T/platforms/mica2 %T/platforms/mica %T/platforms/mica2dot/chips/cc1000 %T/platforms/mica2/chips/cc1000 %T/chips/cc1000 %T/platforms/mica2dot/chips/at45db %T/platforms/mica2/chips/at45db %T/platforms/mica/chips/at45db %T/chips/at45db %T/chips/atm128 %T/chips/atm128/adc %T/chips/atm128/pins %T/chips/atm128/spi %T/chips/atm128/timer %T/lib/timer %T/lib/serial %T/lib/power ) ); @opts = qw( -gcc=avr-gcc -mmcu=atmega128 -fnesc-target=avr -fnesc-no-debug ); push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{'CIL_MACHINE'} = "version_major=3 " . "version_minor=4 " . "version=avr-3.4.3 " . "short=2,1, " . "int=2,1 " . "long=4,1 " . "long_long=8,1 " . "pointer=2,1 " . "enum=2,1 " . "float=4,1 " . "double=4,1 " . "long_double=4,1 " . "void=1,1 " . "fun=1,1 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/mica2dot/DemoSensorC.nc000066400000000000000000000011701207233610700230010ustar00rootroot00000000000000/* $Id: DemoSensorC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Demo sensor for the mica2 platform. * * @author David Gay */ generic configuration DemoSensorC() { provides interface Read; } implementation { components new TempC() as Sensor; Read = Sensor; } tinyos-2.1.2+dfsg/tos/platforms/mica2dot/DemoSensorNowC.nc000066400000000000000000000012731207233610700234710ustar00rootroot00000000000000/* $Id: DemoSensorNowC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Demo sensor for the mica2 platform. * * @author David Gay */ generic configuration DemoSensorNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new TempNowC() as Sensor; Resource = Sensor; ReadNow = Sensor; } tinyos-2.1.2+dfsg/tos/platforms/mica2dot/DemoSensorStreamC.nc000066400000000000000000000012421207233610700241550ustar00rootroot00000000000000/* $Id: DemoSensorStreamC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Demo sensor for the mica2 platform. * * @author David Gay */ generic configuration DemoSensorStreamC() { provides interface ReadStream; } implementation { components new TempStreamC() as SensorStream; ReadStream = SensorStream; } tinyos-2.1.2+dfsg/tos/platforms/mica2dot/MotePlatformC.nc000066400000000000000000000015211207233610700233340ustar00rootroot00000000000000/* $Id: MotePlatformC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The portion of a mica-family initialisation that is mote-specific. * For the mica2dot, we leave everything as inputs except as explicitly * configured otherwise by other components. * * @author David Gay */ configuration MotePlatformC { provides interface Init as PlatformInit; uses interface Init as SubInit; } implementation { components HplCC1000InitP; PlatformInit = HplCC1000InitP; SubInit = PlatformInit; } tinyos-2.1.2+dfsg/tos/platforms/mica2dot/PlatformLedsC.nc000066400000000000000000000042011207233610700233150ustar00rootroot00000000000000// $Id: PlatformLedsC.nc,v 1.5 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Platform-specific LED interface. * * @author Martin Turon , David Gay */ #include "hardware.h" configuration PlatformLedsC { provides interface GeneralIO as Led0; provides interface GeneralIO as Led1; provides interface GeneralIO as Led2; uses interface Init; } implementation { components HplAtm128GeneralIOC as IO; components new NoPinC(); components PlatformP; Init = PlatformP.MoteInit; Led0 = IO.PortA2; // Pin A2 = Red LED Led1 = NoPinC; Led2 = NoPinC; } tinyos-2.1.2+dfsg/tos/platforms/mica2dot/TempC.nc000066400000000000000000000013451207233610700216340ustar00rootroot00000000000000/* $Id: TempC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Temp sensor. * * @author David Gay */ #include "hardware.h" generic configuration TempC() { provides interface Read; } implementation { components new AdcReadClientC(), TempDeviceP; Read = AdcReadClientC; AdcReadClientC.Atm128AdcConfig -> TempDeviceP; AdcReadClientC.ResourceConfigure -> TempDeviceP; } tinyos-2.1.2+dfsg/tos/platforms/mica2dot/TempDeviceP.nc000066400000000000000000000016141207233610700227700ustar00rootroot00000000000000/* $Id: TempDeviceP.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Internal component for temp sensor. Arbitrates access to the temp * sensor and automatically turns it on or off based on user requests. * * @author David Gay */ #include "hardware.h" configuration TempDeviceP { provides { interface Atm128AdcConfig; interface ResourceConfigure; } } implementation { components TempP, HplAtm128GeneralIOC as Pins; Atm128AdcConfig = TempP; ResourceConfigure = TempP; TempP.BatMon -> Pins.PortC6; TempP.BatMonRef -> Pins.PortC7; } tinyos-2.1.2+dfsg/tos/platforms/mica2dot/TempNowC.nc000066400000000000000000000014741207233610700223230ustar00rootroot00000000000000/* $Id: TempNowC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Temp sensor. * * @author David Gay */ #include "hardware.h" generic configuration TempNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new AdcReadNowClientC(), TempDeviceP; ReadNow = AdcReadNowClientC; Resource = AdcReadNowClientC; AdcReadNowClientC.Atm128AdcConfig -> TempDeviceP; AdcReadNowClientC.ResourceConfigure -> TempDeviceP; } tinyos-2.1.2+dfsg/tos/platforms/mica2dot/TempP.nc000066400000000000000000000047671207233610700216640ustar00rootroot00000000000000/// $Id: TempP.nc,v 1.5 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Internal component for temp sensor reading. * * @author Hu Siquan * @author David Gay */ module TempP { provides { interface ResourceConfigure; interface Atm128AdcConfig as TempConfig; } uses { interface GeneralIO as BatMon; interface GeneralIO as BatMonRef; } } implementation { async command uint8_t TempConfig.getChannel() { return CHANNEL_BATTERY_THERMISTOR; } async command uint8_t TempConfig.getRefVoltage() { return ATM128_ADC_VREF_OFF; } async command uint8_t TempConfig.getPrescaler() { return ATM128_ADC_PRESCALE; } async command void ResourceConfigure.configure() { call BatMonRef.makeOutput(); call BatMonRef.set(); call BatMon.makeOutput(); call BatMon.clr(); } async command void ResourceConfigure.unconfigure() { call BatMon.makeInput(); call BatMonRef.makeInput(); } } tinyos-2.1.2+dfsg/tos/platforms/mica2dot/TempStreamC.nc000066400000000000000000000014251207233610700230070ustar00rootroot00000000000000/* $Id: TempStreamC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Temp sensor. * * @author David Gay */ #include "hardware.h" generic configuration TempStreamC() { provides interface ReadStream; } implementation { components TempDeviceP, new AdcReadStreamClientC(); ReadStream = AdcReadStreamClientC; AdcReadStreamClientC.Atm128AdcConfig -> TempDeviceP; AdcReadStreamClientC.ResourceConfigure -> TempDeviceP; } tinyos-2.1.2+dfsg/tos/platforms/mica2dot/chips/000077500000000000000000000000001207233610700214055ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica2dot/chips/at45db/000077500000000000000000000000001207233610700224705ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica2dot/chips/at45db/HplAt45dbIOC.nc000066400000000000000000000020651207233610700250370ustar00rootroot00000000000000// $Id: HplAt45dbIOC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Low-level access functions for the AT45DB flash on the mica2 and micaz. * * @author David Gay */ configuration HplAt45dbIOC { provides { interface Resource; interface SpiByte as FlashSpi; interface HplAt45dbByte; } } implementation { // Wire up byte I/O to At45db components HplAt45dbIOP, HplAtm128GeneralIOC as Pins, PlatformC; components new NoArbiterC(); Resource = NoArbiterC; FlashSpi = HplAt45dbIOP; HplAt45dbByte = HplAt45dbIOP; PlatformC.SubInit -> HplAt45dbIOP; HplAt45dbIOP.Select -> Pins.PortE5; HplAt45dbIOP.Clk -> Pins.PortA3; HplAt45dbIOP.In -> Pins.PortA6; HplAt45dbIOP.Out -> Pins.PortA7; } tinyos-2.1.2+dfsg/tos/platforms/mica2dot/chips/at45db/HplAt45dbIOP.nc000066400000000000000000000100531207233610700250500ustar00rootroot00000000000000// $Id: HplAt45dbIOP.nc,v 1.6 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Low level hardware access to the onboard AT45DB flash chip. *

      * Note: This component includes optimised bit-banging SPI code with the * pins hardwired. Don't copy it to some other platform without * understanding it (see txByte). * * @author Jason Hill * @author David Gay * @author Philip Levis */ #include "Timer.h" module HplAt45dbIOP { provides { interface Init; interface SpiByte as FlashSpi; interface HplAt45dbByte; } uses { interface GeneralIO as Select; interface GeneralIO as Clk; interface GeneralIO as Out; interface GeneralIO as In; } } implementation { // We use SPI mode 0 (clock low at select time) command error_t Init.init() { call Select.makeOutput(); call Select.set(); call Clk.clr(); call Clk.makeOutput(); call Out.set(); call Out.makeOutput(); call In.clr(); call In.makeInput(); return SUCCESS; } command void HplAt45dbByte.select() { call Clk.clr(); // ensure SPI mode 0 call Select.clr(); } command void HplAt45dbByte.deselect() { call Select.set(); } #define BITINIT \ uint8_t clrClkAndData = PORTA & ~0x88 #define BIT(n) \ PORTA = clrClkAndData; \ asm __volatile__ \ ( "sbrc %2," #n "\n" \ "\tsbi 27,7\n" \ "\tsbi 27,3\n" \ "\tsbic 25,6\n" \ "\tori %0,1<<" #n "\n" \ : "=d" (spiIn) : "0" (spiIn), "r" (spiOut)) async command uint8_t FlashSpi.write(uint8_t spiOut) { uint8_t spiIn = 0; // This atomic ensures integrity at the hardware level... atomic { BITINIT; BIT(7); BIT(6); BIT(5); BIT(4); BIT(3); BIT(2); BIT(1); BIT(0); } return spiIn; } task void idleWait() { if (call In.get()) signal HplAt45dbByte.idle(); else post idleWait(); } command void HplAt45dbByte.waitIdle() { call Clk.clr(); post idleWait(); } command bool HplAt45dbByte.getCompareStatus() { call Clk.set(); call Clk.clr(); // Wait for compare value to propagate asm volatile("nop"); asm volatile("nop"); return !call In.get(); } } tinyos-2.1.2+dfsg/tos/platforms/mica2dot/chips/cc1000/000077500000000000000000000000001207233610700222735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mica2dot/chips/cc1000/HplCC1000InitP.nc000066400000000000000000000052151207233610700250160ustar00rootroot00000000000000// $Id: HplCC1000InitP.nc,v 1.6 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Hardware initialisation for the CC1000 radio. This component is always * included even if the radio is not used. * * @author David Gay */ configuration HplCC1000InitP { provides interface Init as PlatformInit; } implementation { components HplCC1000P, HplCC1000SpiP, HplAtm128GeneralIOC as IO; PlatformInit = HplCC1000P; PlatformInit = HplCC1000SpiP; HplCC1000P.CHP_OUT -> IO.PortE7; HplCC1000P.PALE -> IO.PortD5; HplCC1000P.PCLK -> IO.PortD6; HplCC1000P.PDATA -> IO.PortD7; HplCC1000SpiP.SpiSck -> IO.PortB1; HplCC1000SpiP.SpiMiso -> IO.PortB3; HplCC1000SpiP.SpiMosi -> IO.PortB2; HplCC1000SpiP.OC1C -> IO.PortB7; } tinyos-2.1.2+dfsg/tos/platforms/mica2dot/hardware.h000066400000000000000000000055071207233610700222540ustar00rootroot00000000000000/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. * Copyright (c) 2002-2003 Intel Corporation. * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Jason Hill, Philip Levis, Nelson Lee, David Gay * @author Alan Broad * @author Matt Miller * @author Martin Turon * * $Id: hardware.h,v 1.8 2010-06-29 22:07:54 scipio Exp $ */ #ifndef HARDWARE_H #define HARDWARE_H #ifndef MHZ /* Clock rate is 4MHz except if specified by user (this value must be a power of 2, see MicaTimer.h and MeasureClockC.nc) */ #define MHZ 4 #endif #include #include #include // enum so components can override power saving, // as per TEP 112. enum { TOS_SLEEP_NONE = ATM128_POWER_IDLE, }; // A/D channels enum { CHANNEL_RSSI = ATM128_ADC_SNGL_ADC0, CHANNEL_BATTERY_THERMISTOR = ATM128_ADC_SNGL_ADC1 }; enum { PLATFORM_BAUDRATE = 19200L }; #endif //HARDWARE_H tinyos-2.1.2+dfsg/tos/platforms/mica2dot/platform.h000066400000000000000000000000001207233610700222620ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/micaz/000077500000000000000000000000001207233610700177005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/micaz/.platform000066400000000000000000000035611207233610700215320ustar00rootroot00000000000000# # FILE: micaz/.platform # # Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. # # $Id: .platform,v 1.8 2009-08-14 20:33:43 jgko Exp $ # push( @includes, qw( %T/platforms/mica %T/platforms/micaz/chips/cc2420 %T/chips/cc2420 %T/chips/cc2420/alarm %T/chips/cc2420/control %T/chips/cc2420/csma %T/chips/cc2420/interfaces %T/chips/cc2420/link %T/chips/cc2420/lowpan %T/chips/cc2420/lpl %T/chips/cc2420/packet %T/chips/cc2420/receive %T/chips/cc2420/spi %T/chips/cc2420/transmit %T/chips/cc2420/unique %T/chips/cc2420/security %T/platforms/micaz/chips/at45db %T/platforms/mica2/chips/at45db %T/platforms/mica/chips/at45db %T/chips/at45db %T/chips/atm128 %T/chips/atm128/adc %T/chips/atm128/pins %T/chips/atm128/spi %T/chips/atm128/i2c %T/chips/atm128/timer %T/lib/timer %T/lib/serial %T/lib/power %T/lib/diagmsg ) ); @opts = qw( -gcc=avr-gcc -mmcu=atmega128 -fnesc-target=avr -fnesc-no-debug ); push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{'CIL_MACHINE'} = "version_major=3 " . "version_minor=4 " . "version=avr-3.4.3 " . "short=2,1, " . "int=2,1 " . "long=4,1 " . "long_long=8,1 " . "pointer=2,1 " . "enum=2,1 " . "float=4,1 " . "double=4,1 " . "long_double=4,1 " . "void=1,1 " . "fun=1,1 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/micaz/ActiveMessageC.nc000066400000000000000000000060071207233610700230500ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.9 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.9 2010-06-29 22:07:54 scipio Exp $ * */ /** * * The Active Message layer on the Telos platform. This is a naming wrapper * around the CC2420 Active Message layer. * * @author Philip Levis * @version $Revision: 1.9 $ $Date: 2010-06-29 22:07:54 $ */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface LowPowerListening; } } implementation { #ifdef RFXLINK components CC2420XActiveMessageC as AM; #else components CC2420ActiveMessageC as AM; #endif SplitControl = AM; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; LowPowerListening = AM; #ifdef RFXLINK PacketTimeStamp32khz = AM; PacketTimeStampMilli = AM; #else components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; #endif } tinyos-2.1.2+dfsg/tos/platforms/micaz/BusyWaitMicroC.nc000066400000000000000000000041251207233610700230700ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ module BusyWaitMicroC { provides interface BusyWait; } implementation { inline async command void BusyWait.wait(uint16_t dt) { /* In most cases (constant arg), the test is elided at compile-time */ if (dt) /* loop takes 8 cycles. this is 1uS if running on an internal 8MHz clock, and 1.09uS if running on the external crystal. */ asm volatile ( "1: sbiw %0,1\n" " adiw %0,1\n" " sbiw %0,1\n" " brne 1b" : "+w" (dt)); } } tinyos-2.1.2+dfsg/tos/platforms/micaz/DemoSensorC.nc000066400000000000000000000037511207233610700224110ustar00rootroot00000000000000/* $Id: DemoSensorC.nc,v 1.5 2007-05-22 20:59:01 idgay Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The micaZ doesn't have any built-in sensors - the DemoSensor returns * a constant value of 0xbeef, or just reads the ground value for the * stream sensor. * * @author Philip Levis * @authod David Gay */ generic configuration DemoSensorC() { provides interface Read; } implementation { components new VoltageC() as DemoChannel; Read = DemoChannel; } tinyos-2.1.2+dfsg/tos/platforms/micaz/DemoSensorNowC.nc000066400000000000000000000037131207233610700230730ustar00rootroot00000000000000/* $Id: DemoSensorNowC.nc,v 1.5 2007-05-22 20:59:01 idgay Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The micaZ doesn't have any built-in sensors - this DemoSensor just reads * the ground value. * * @author David Gay */ generic configuration DemoSensorNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new VoltageNowC() as Sensor; Resource = Sensor; ReadNow = Sensor; } tinyos-2.1.2+dfsg/tos/platforms/micaz/DemoSensorStreamC.nc000066400000000000000000000040001207233610700235510ustar00rootroot00000000000000/* $Id: DemoSensorStreamC.nc,v 1.5 2007-05-22 20:59:01 idgay Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * The micaZ doesn't have any built-in sensors - the DemoSensor returns * a constant value of 0xbeef, or just reads the ground value for the * stream sensor. * * @author Philip Levis * @authod David Gay */ generic configuration DemoSensorStreamC() { provides interface ReadStream; } implementation { components new VoltageStreamC() as Sensor; ReadStream = Sensor; } tinyos-2.1.2+dfsg/tos/platforms/micaz/Ieee154MessageC.nc000066400000000000000000000044731207233610700227430ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * * @author Stephen Dawson-Haggerty */ configuration Ieee154MessageC { provides { interface SplitControl; interface Resource as SendResource[uint8_t clientId]; interface Ieee154Send; interface Receive as Ieee154Receive; interface Ieee154Packet; interface Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; interface LowPowerListening; interface PacketLink; } } implementation { components CC2420Ieee154MessageC as Msg; SplitControl = Msg; SendResource = Msg; Ieee154Send = Msg; Ieee154Receive = Msg; Ieee154Packet = Msg; Packet = Msg; PacketAcknowledgements = Msg; LinkPacketMetadata = Msg; LowPowerListening = Msg; PacketLink = Msg; } tinyos-2.1.2+dfsg/tos/platforms/micaz/LocalIeeeEui64C.nc000066400000000000000000000044761207233610700227770ustar00rootroot00000000000000// $Id: LocalIeeeEui64C.nc,v 1.1 2010/02/23 06:45:38 sdhsdh Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE.* All rights reserved. * * Stephen Dawson-Haggerty * Dummy Extended Address for micaz */ #include "IeeeEui64.h" module LocalIeeeEui64C { provides interface LocalIeeeEui64; } implementation { command ieee_eui64_t LocalIeeeEui64.getId() { ieee_eui64_t id; /* this is UCB's OUI */ id.data[0] = 0x00; id.data[1] = 0x12; id.data[2] = 0x6d; /* UCB will let anyone use this OUI so long as these two octets are 'LO' -- "local". All other octets are reserved. */ /* SDH -- 9/10/2010 */ id.data[3] = 'L'; id.data[4] = 'O'; id.data[5] = 0; id.data[6] = TOS_NODE_ID >> 8; id.data[7] = TOS_NODE_ID & 0xff; return id; } } tinyos-2.1.2+dfsg/tos/platforms/micaz/MotePlatformC.nc000066400000000000000000000040161207233610700227370ustar00rootroot00000000000000/* $Id: MotePlatformC.nc,v 1.4 2006-12-12 18:23:43 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * The porttion of a mica-family initialisation that is mote-specific. * * @author David Gay */ configuration MotePlatformC { provides interface Init as PlatformInit; uses interface Init as SubInit; } implementation { components MotePlatformP, HplAtm128GeneralIOC; PlatformInit = MotePlatformP; MotePlatformP.SerialIdPin -> HplAtm128GeneralIOC.PortA4; SubInit = MotePlatformP.SubInit; } tinyos-2.1.2+dfsg/tos/platforms/micaz/MotePlatformP.nc000066400000000000000000000043031207233610700227530ustar00rootroot00000000000000/* $Id: MotePlatformP.nc,v 1.5 2008-06-26 03:38:27 regehr Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * The micaZ portion of a mica-family initialisation that is * mote-specific. * * @author David Gay */ module MotePlatformP @safe() { provides interface Init as PlatformInit; uses interface GeneralIO as SerialIdPin; uses interface Init as SubInit; } implementation { command error_t PlatformInit.init() { // Pull C I/O port pins low PORTC = 0; DDRC = 0xff; // Prevent sourcing current call SerialIdPin.makeInput(); call SerialIdPin.clr(); return call SubInit.init(); } default command error_t SubInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/micaz/TimeSyncMessageC.nc000066400000000000000000000067641207233610700234020ustar00rootroot00000000000000// $Id: TimeSyncMessageC.nc,v 1.3 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * The Active Message layer on the micaz platform. This is a naming wrapper * around the CC2420 Active Message layer that implemets timesync interface (TEP 133). * * @author Philip Levis * @author Brano Kusy * @date June 19 2005 */ configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSend32khz[am_id_t id]; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { #ifdef RFXLINK components CC2420XTimeSyncMessageC as AM; #else components CC2420TimeSyncMessageC as AM; #endif SplitControl = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; LowPowerListening = AM; TimeSyncAMSend32khz = AM; TimeSyncAMSendMilli = AM; TimeSyncPacket32khz = AM; TimeSyncPacketMilli = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; }tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/000077500000000000000000000000001207233610700210065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/at45db/000077500000000000000000000000001207233610700220715ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/at45db/HplAt45dbIOC.nc000066400000000000000000000053521207233610700244420ustar00rootroot00000000000000// $Id: HplAt45dbIOC.nc,v 1.2 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Low-level access functions for the AT45DB flash on the mica2 and micaz. * * @author David Gay * @author Janos Sallai */ configuration HplAt45dbIOC { provides { interface Resource; interface SpiByte as FlashSpi; interface HplAt45dbByte; } } implementation { // Wire up byte I/O to At45db components HplAt45dbIOP, HplAtm128GeneralIOC as Pins, PlatformC; components BusyWaitMicroC; components new NoArbiterC(); Resource = NoArbiterC; FlashSpi = HplAt45dbIOP; HplAt45dbByte = HplAt45dbIOP; PlatformC.SubInit -> HplAt45dbIOP; HplAt45dbIOP.Select -> Pins.PortA3; HplAt45dbIOP.Clk -> Pins.PortD5; HplAt45dbIOP.In -> Pins.PortD2; HplAt45dbIOP.Out -> Pins.PortD3; HplAt45dbIOP.BusyWait -> BusyWaitMicroC; } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/at45db/HplAt45dbIOP.nc000066400000000000000000000137171207233610700244630ustar00rootroot00000000000000// $Id: HplAt45dbIOP.nc,v 1.3 2010-06-29 22:07:53 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Low level hardware access to the onboard AT45DB flash chip. *

      * Note: This component includes optimised bit-banging SPI code with the * pins hardwired. Don't copy it to some other platform without * understanding it (see txByte). * * @author Jason Hill * @author David Gay * @author Philip Levis * @author Janos Sallai */ #include "Timer.h" module HplAt45dbIOP { provides { interface Init; interface SpiByte as FlashSpi; interface HplAt45dbByte; } uses { interface GeneralIO as Select; interface GeneralIO as Clk; interface GeneralIO as Out; interface GeneralIO as In; interface BusyWait; } } implementation { // We use SPI mode 0 (clock low at select time) command error_t Init.init() { call Select.makeOutput(); call Select.set(); call Clk.clr(); call Clk.makeOutput(); call Out.set(); call Out.makeOutput(); call In.clr(); call In.makeInput(); return SUCCESS; } command void HplAt45dbByte.select() { call Clk.clr(); // ensure SPI mode 0 call Select.clr(); } command void HplAt45dbByte.deselect() { call Select.set(); } #define BITINIT \ uint8_t clrClkAndData = PORTD & ~0x28 #define BIT(n) \ PORTD = clrClkAndData; \ asm __volatile__ \ ( "sbrc %2," #n "\n" \ "\tsbi 18,3\n" \ "\tsbi 18,5\n" \ "\tsbic 16,2\n" \ "\tori %0,1<<" #n "\n" \ : "=d" (spiIn) : "0" (spiIn), "r" (spiOut)) async command uint8_t FlashSpi.write(uint8_t spiOut) { uint8_t spiIn = 0; // This atomic ensures integrity at the hardware level... atomic { BITINIT; BIT(7); BIT(6); BIT(5); BIT(4); BIT(3); BIT(2); BIT(1); BIT(0); } return spiIn; } task void avail() { signal HplAt45dbByte.idle(); } command void HplAt45dbByte.waitIdle() { // at45db041 rev d fix by handsomezhu hongsong at ios.cn // http://mail.millennium.berkeley.edu/pipermail/tinyos-help/2008-January/030255.html int i; call Clk.clr(); call BusyWait.wait(2); while( ! call In.get() ) { for( i=0; i < 8; i ++ ) { call Clk.set(); call Clk.clr(); call BusyWait.wait(2); } } post avail(); } command bool HplAt45dbByte.getCompareStatus() { call Clk.set(); call Clk.clr(); // Wait for compare value to propagate asm volatile("nop"); asm volatile("nop"); return !call In.get(); } } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420/000077500000000000000000000000001207233610700217035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420/HplCC2420AlarmC.nc000066400000000000000000000103631207233610700245510ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * A platform independent abstraction of an asynchronous 32KHz, 16-bit * timer for the CC2420. As these timers (the Alarm interface) are * usually part of an HAL, they are platform specific. But as the * CC2420 needs to be cross-platform, this component bridges between * the two, providing a platform-independent abstraction of * CC2420-specific Alarm. This is a Atmega128 implementation that * uses the Compare1A register. * * @author Philip Levis * @version $Revision: 1.6 $ $Date: 2010-06-29 22:07:54 $ */ #include "Atm128Timer.h" generic configuration HplCC2420AlarmC() { provides interface Alarm; provides interface Init; } implementation { components new Alarm32khz32C(), NoInitC; Init = NoInitC; Alarm = Alarm32khz32C; } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420/HplCC2420InterruptsC.nc000066400000000000000000000046311207233610700256750ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2007-04-30 17:31:08 $ */ configuration HplCC2420InterruptsC { provides interface GpioCapture as CaptureSFD; provides interface GpioInterrupt as InterruptCCA; provides interface GpioInterrupt as InterruptFIFOP; } implementation { components new Atm128GpioCaptureC() as CaptureSFDC; components HplAtm128Timer1C as Timer1C; CaptureSFD = CaptureSFDC; CaptureSFDC.Atm128Capture -> Timer1C.Capture; components new Atm128GpioInterruptC() as InterruptFIFOPC; components HplAtm128InterruptC as Interrupts; InterruptFIFOP = InterruptFIFOPC; InterruptFIFOPC.Atm128Interrupt -> Interrupts.Int6; components HplCC2420InterruptsP; components HplCC2420PinsC; InterruptCCA = HplCC2420InterruptsP.CCA; HplCC2420InterruptsP.CC_CCA -> HplCC2420PinsC.CCA; } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420/HplCC2420InterruptsP.nc000066400000000000000000000070771207233610700257210ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * MicaZ implementation of the CC2420 interrupts. FIFOP is a real * interrupt, while CCA and FIFO are emulated through timer polling. *

       *  $Id: HplCC2420InterruptsP.nc,v 1.6 2008-06-26 04:39:12 regehr Exp $
       * 
       *
       * @author Philip Levis
       * @author Matt Miller
       * @author David Moss
       * @version @version $Revision: 1.6 $ $Date: 2008-06-26 04:39:12 $
       */
      
      module HplCC2420InterruptsP @safe() {
        provides {
          interface GpioInterrupt as CCA;
        }
        
        uses {
          interface GeneralIO as CC_CCA;
        }
      }
      implementation {
      
        norace uint8_t ccaWaitForState;
        
        norace uint8_t ccaLastState;
        
        bool ccaCheckDisabled = FALSE;
      
        // ************* CCA Interrupt handlers and dispatch *************
        
        /**
         * enable an edge interrupt on the CCA pin
         * NOT an interrupt in MICAz. Implement as a task polled pin monitor
         */
      
        task void CCATask() {
          uint8_t CCAState;
          atomic {
            if (ccaCheckDisabled) {
              return;
            }
          }
          
          //check CCA state
          CCAState = call CC_CCA.get(); //get current state here if waiting for edge
          if ((ccaLastState != ccaWaitForState) && (CCAState == ccaWaitForState)) {
            signal CCA.fired();
          }
          
          //if CCA Pin is correct and edge found
          //repost task and try again
          ccaLastState = CCAState;
          post CCATask();
        }
        
        async command error_t CCA.enableRisingEdge() { 
          atomic ccaWaitForState = TRUE; //save the state we are waiting for
          atomic ccaCheckDisabled = FALSE;
          ccaLastState = call CC_CCA.get(); //get current state
          post CCATask();
          return SUCCESS;
        }
      
        async command error_t CCA.enableFallingEdge() { 
          atomic ccaWaitForState = FALSE; //save the state we are waiting for
          atomic ccaCheckDisabled = FALSE;
          ccaLastState = call CC_CCA.get(); //get current state
          post CCATask();
          return SUCCESS;
        }
        
        async command error_t CCA.disable() {
          atomic ccaCheckDisabled = TRUE;
          return SUCCESS;
        }
      
      
        /***************** Defaults ****************/
        default async event void CCA.fired() {
        }
      
      }
      
      tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420/HplCC2420PinsC.nc000066400000000000000000000105021207233610700244210ustar00rootroot00000000000000/*
       * Copyright (c) 2005 Stanford University. All rights reserved.
       *
       * Redistribution and use in source and binary forms, with or without
       * modification, are permitted provided that the following conditions
       * are met:
       *
       * - Redistributions of source code must retain the above copyright
       *   notice, this list of conditions and the following disclaimer.
       * - Redistributions in binary form must reproduce the above copyright
       *   notice, this list of conditions and the following disclaimer in the
       *   documentation and/or other materials provided with the
       *   distribution.
       * - Neither the name of the copyright holder nor the names of
       *   its contributors may be used to endorse or promote products derived
       *   from this software without specific prior written permission.
       *
       * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
       * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
       * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
       * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
       * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
       * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
       * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
       * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
       * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
       * OF THE POSSIBILITY OF SUCH DAMAGE.
       *
       * Copyright (c) 2005 The Regents of the University  of California.  
       * All rights reserved.
       *
       * Redistribution and use in source and binary forms, with or without
       * modification, are permitted provided that the following conditions
       * are met:
       *
       * - Redistributions of source code must retain the above copyright
       *   notice, this list of conditions and the following disclaimer.
       * - Redistributions in binary form must reproduce the above copyright
       *   notice, this list of conditions and the following disclaimer in the
       *   documentation and/or other materials provided with the
       *   distribution.
       * - Neither the name of the University of California nor the names of
       *   its contributors may be used to endorse or promote products derived
       *   from this software without specific prior written permission.
       *
       * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
       * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
       * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
       * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
       * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
       * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
       * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
       * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
       * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
       * OF THE POSSIBILITY OF SUCH DAMAGE.
       *
       * Copyright (c) 2002-2003 Intel Corporation
       * All rights reserved.
       *
       * This file is distributed under the terms in the attached INTEL-LICENSE     
       * file. If you do not find these files, copies can be found by writing to
       * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, 
       * 94704.  Attention:  Intel License Inquiry.
       */
      
      /**
       * Mapping the CC2420 pins to Atmega128 pins for the micaZ platform.
       * Information on the function of these pins can be found on pages
       * 14-15 of the CC2420 datasheet (rev 1.2).
       *
       * 
       * $Id: HplCC2420PinsC.nc,v 1.6 2010-06-29 22:07:54 scipio Exp $
       * 
      * * @author Philip Levis * @version $Revision: 1.6 $ $Date: 2010-06-29 22:07:54 $ */ configuration HplCC2420PinsC { provides { interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; } } implementation { components HplAtm128GeneralIOC as IO; CCA = IO.PortD6; CSN = IO.PortB0; FIFO = IO.PortB7; FIFOP = IO.PortE6; RSTN = IO.PortA6; SFD = IO.PortD4; VREN = IO.PortA5; } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420/HplCC2420SpiC.nc000066400000000000000000000042231207233610700242460ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2008-04-24 22:31:25 $ */ generic configuration HplCC2420SpiC() { provides interface Init; provides interface Resource; provides interface SpiByte; provides interface SpiPacket; } implementation { components Atm128SpiC, HplCC2420SpiP, HplAtm128GeneralIOC as IO; Init = Atm128SpiC; Resource = HplCC2420SpiP; HplCC2420SpiP.SubResource -> Atm128SpiC.Resource[ unique("Atm128SpiC.Resource") ]; HplCC2420SpiP.SS -> IO.PortB0; // Slave set line SpiByte = Atm128SpiC; SpiPacket = Atm128SpiC; } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420/HplCC2420SpiP.nc000066400000000000000000000047211207233610700242660ustar00rootroot00000000000000/* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Automatic slave select update for the SpiResource * * @author Miklos Maroti */ module HplCC2420SpiP @safe() { provides interface Resource; uses { interface Resource as SubResource; // raw SPI resource interface GeneralIO as SS; // Slave set line } } implementation { async command error_t Resource.request() { return call SubResource.request(); } async command error_t Resource.immediateRequest() { error_t error = call SubResource.immediateRequest(); if( error == SUCCESS ) { call SS.makeOutput(); call SS.clr(); } return error; } event void SubResource.granted() { call SS.makeOutput(); call SS.clr(); signal Resource.granted(); } async command error_t Resource.release() { if( call SubResource.isOwner() ) call SS.set(); return call SubResource.release(); } async command bool Resource.isOwner() { return call SubResource.isOwner(); } } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420/sim/000077500000000000000000000000001207233610700224735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420/sim/SimAtm128SpiDeviceC.nc000066400000000000000000000052261207233610700263460ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Configuration representing the SPI device of the CC2420 for the micaZ * platform. The basic mapping is this: *
        *
      • the platform independent chips/CC2420 maps to HplCC2420SpiC;
      • *
      • HplCC2420SpiC on the micaZ maps to Atm128SpiC;
      • *
      • under TOSSIM Atm128SpiC maps to SimAtm128SpiDeviceC;
      • *
      • SimAtm128SpiDeviceC maps to the actual simulation implementation in micaz/chips/cc2420/sim
      • *
      * * @author Philip Levis * @date November 22 2005 */ configuration SimAtm128SpiDeviceC { provides interface Init; provides interface Resource[uint8_t]; provides interface SPIByte; provides interface SPIPacket; uses interface Resource as SubResource[uint8_t]; uses interface ArbiterInfo; uses interface McuPowerState; } implementation { components SimCC2420C; Init = SimCC2420C; Resource = SimCC2420C.SpiResource; SPIByte = SimCC2420C; SPIPacket = SimCC2420C; SubResource = SimCC2420C.SubSpiResource; ArbiterInfo = SimCC2420C; McuPowerState = SimCC2420C; } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420/sim/SimCC2420C.nc000066400000000000000000000050651207233610700243740ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Simulated implementation of the CC2420 radio chip. It is an * SPI end point, and also signals some interrupts/GPIO pins.\ * This is a pretty complicated component, so be aware that it * may be very helpful to have the CC2420 data sheet nearby. * * @author Philip Levis * @date November 22 2005 */ module SimCC2420C { provides { interface Init; interface Resource[uint8_t] as SpiResource; interface SPIByte; interface SPIPacket; interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; interface GpioCapture as CaptureSFD; interface GpioInterrupt as InterruptFIFOP; } uses { interface Resource[uint8_t] as SubSpiResource; interface ArbiterInfo as SpiUser; interface McuPowerState; } } implementation { } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420x/000077500000000000000000000000001207233610700220735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420x/ActiveMessageC.nc000066400000000000000000000040151207233610700252400ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface SendNotifier[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketTimeStamp as PacketTimeStampMicro; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2420XActiveMessageC as MessageC; SplitControl = MessageC; AMSend = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; SendNotifier = MessageC; Packet = MessageC; AMPacket = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketLink = MessageC; RadioChannel = MessageC; PacketTimeStampMilli = MessageC; PacketTimeStampMicro = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420x/HplCC2420XC.nc000066400000000000000000000050201207233610700241060ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include "RadioConfig.h" configuration HplCC2420XC { provides { interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface LocalTime as LocalTimeRadio; interface Init; interface Alarm; } } implementation { components Atm128SpiC, MotePlatformC, HplCC2420XSpiP, HplAtm128GeneralIOC as IO; Init = Atm128SpiC; SpiResource = HplCC2420XSpiP.Resource; HplCC2420XSpiP.SubResource -> Atm128SpiC.Resource[ unique("Atm128SpiC.Resource") ]; HplCC2420XSpiP.SS -> IO.PortB0; FastSpiByte = Atm128SpiC; CCA = IO.PortD6; CSN = IO.PortB0; FIFO = IO.PortB7; FIFOP = IO.PortE6; RSTN = IO.PortA6; SFD = IO.PortD4; VREN = IO.PortA5; components new Atm128GpioCaptureC() as SfdCaptureC; components HplAtm128Timer1C as Timer1C; SfdCapture = SfdCaptureC; SfdCaptureC.Atm128Capture -> Timer1C.Capture; components new Atm128GpioInterruptC() as FifopInterruptC; components HplAtm128InterruptC as Interrupts; FifopInterrupt= FifopInterruptC; FifopInterruptC.Atm128Interrupt -> Interrupts.Int6; components LocalTimeMicroC; LocalTimeRadio = LocalTimeMicroC.LocalTime; components new AlarmThree16C() as AlarmC; Alarm = AlarmC; } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420x/HplCC2420XSpiP.nc000066400000000000000000000035211207233610700246030ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ module HplCC2420XSpiP @safe() { provides interface Resource; uses { interface Resource as SubResource; interface GeneralIO as SS; } } implementation { async command error_t Resource.request() { return call SubResource.request(); } async command error_t Resource.immediateRequest() { error_t error = call SubResource.immediateRequest(); if( error == SUCCESS ) { call SS.makeOutput(); call SS.clr(); } return error; } event void SubResource.granted() { call SS.makeOutput(); call SS.clr(); signal Resource.granted(); } async command error_t Resource.release() { if( call SubResource.isOwner() ) call SS.set(); return call SubResource.release(); } async command bool Resource.isOwner() { return call SubResource.isOwner(); } } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420x/LocalTimeMicroC.nc000066400000000000000000000027161207233610700253710ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include "Timer.h" configuration LocalTimeMicroC { provides interface LocalTime; } implementation { components CounterOne16C; components new TransformCounterC(TMicro, uint32_t, TMicro, uint16_t, 0, uint32_t); components new CounterToLocalTimeC(TMicro); LocalTime = CounterToLocalTimeC; CounterToLocalTimeC.Counter -> TransformCounterC; TransformCounterC.CounterFrom -> CounterOne16C; } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420x/MicaTimer.h000066400000000000000000000042001207233610700241120ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #ifndef MICATIMER_H #define MICATIMER_H #include #include /* Some types for the non-standard rates that mica timers might be running at. */ typedef struct { } T64khz; typedef struct { } T128khz; typedef struct { } T2mhz; typedef struct { } T4mhz; /* TX is the typedef for the rate of timer X, MICA_PRESCALER_X is the prescaler for timer X, MICA_DIVIDER_X_FOR_Y_LOG2 is the number of bits to shift timer X by to get rate Y, counter_X_overflow_t is uint16_t if MICA_DIVIDER_X_FOR_Y_LOG2 is 0, uint32_t otherwise. */ #if MHZ == 8 // set TThree to be 1mhz, prescale to 32khz in software typedef TMicro TOne; typedef TMicro TThree; typedef uint32_t counter_one_overflow_t; typedef uint16_t counter_three_overflow_t; enum { MICA_PRESCALER_ONE = ATM128_CLK16_DIVIDE_8, MICA_DIVIDE_ONE_FOR_32KHZ_LOG2 = 5, MICA_PRESCALER_THREE = ATM128_CLK16_DIVIDE_8, MICA_DIVIDE_THREE_FOR_MICRO_LOG2 = 0, EXT_STANDBY_T0_THRESHOLD = 12, }; #else #error "Unknown clock rate. MHZ must be defined to 8." #endif enum { PLATFORM_MHZ = MHZ }; #endif tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420x/RadioConfig.h000066400000000000000000000044411207233610700244330ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai, Miklos Maroti */ #ifndef __RADIOCONFIG_H__ #define __RADIOCONFIG_H__ #include #include #include /* This is the default value of the PA_POWER field of the TXCTL register. */ #ifndef CC2420X_DEF_RFPOWER #define CC2420X_DEF_RFPOWER 0 #endif /* This is the default value of the CHANNEL field of the FSCTRL register. */ #ifndef CC2420X_DEF_CHANNEL #define CC2420X_DEF_CHANNEL 11 #endif /* The number of microseconds a sending micaz mote will wait for an acknowledgement */ #ifndef SOFTWAREACK_TIMEOUT #define SOFTWAREACK_TIMEOUT 800 #endif /** * This is the timer type of the radio alarm interface */ typedef TThree TRadio; typedef uint16_t tradio_size; /** * The number of radio alarm ticks per one microsecond (0.9216). * We use integers and no parentheses just to make deputy happy. * Ok, further hacks were required for deputy, I removed 00 from the * beginning and end to be able to handle longer wait periods. */ #define RADIO_ALARM_MICROSEC (73728UL / MHZ) * (1 << MICA_DIVIDE_THREE_FOR_MICRO_LOG2) / 10000UL /** * The base two logarithm of the number of radio alarm ticks per one millisecond */ #define RADIO_ALARM_MILLI_EXP (5 + MICA_DIVIDE_THREE_FOR_MICRO_LOG2) #endif//__RADIOCONFIG_H__ tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420x/TimeSyncMessageC.nc000066400000000000000000000041471207233610700255660ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketTimeStamp as PacketTimeStampRadio; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC2420XTimeSyncMessageC as MessageC; SplitControl = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; Packet = MessageC; AMPacket = MessageC; PacketTimeStampRadio = MessageC; TimeSyncAMSendRadio = MessageC; TimeSyncPacketRadio = MessageC; PacketTimeStampMilli = MessageC; TimeSyncAMSendMilli = MessageC; TimeSyncPacketMilli = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/micaz/chips/cc2420x/platform_message.h000066400000000000000000000027051207233610700256000ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include #include typedef union message_header { cc2420xpacket_header_t cc2420x; serial_header_t serial; } message_header_t; typedef union message_footer { cc2420xpacket_footer_t cc2420x; } message_footer_t; typedef union message_metadata { cc2420xpacket_metadata_t cc2420x; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/micaz/hardware.h000066400000000000000000000055201207233610700216500ustar00rootroot00000000000000/** * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. * Copyright (c) 2002-2003 Intel Corporation. * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Jason Hill, Philip Levis, Nelson Lee, David Gay * @author Alan Broad * @author Matt Miller * @author Martin Turon * * $Id: hardware.h,v 1.8 2010-06-29 22:07:54 scipio Exp $ */ #ifndef HARDWARE_H #define HARDWARE_H #ifndef MHZ /* Clock rate is ~8MHz except if specified by user (this value must be a power of 2, see MicaTimer.h and MeasureClockC.nc) */ #define MHZ 8 #endif #include #include #include // enum so components can override power saving, // as per TEP 112. enum { TOS_SLEEP_NONE = ATM128_POWER_IDLE, }; // A/D channels enum { CHANNEL_THERMISTOR = ATM128_ADC_SNGL_ADC1 // normally unpopulated }; #ifndef PLATFORM_BAUDRATE enum { PLATFORM_BAUDRATE = 57600L }; #endif #endif //HARDWARE_H tinyos-2.1.2+dfsg/tos/platforms/micaz/mac/000077500000000000000000000000001207233610700204405ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/micaz/mac/tkn154/000077500000000000000000000000001207233610700214665ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/micaz/mac/tkn154/Makefile.include000066400000000000000000000005731207233610700245550ustar00rootroot00000000000000# We include several platform-glue components from telosb, because they are # identical on the micaz platform (e.g. Ieee802154BeaconEnabledC.nc, # Ieee802154NonBeaconEnabledC.nc,TKN154TimingP.nc, etc.) CFLAGS += -I$(TOSDIR)/platforms/micaz/mac/tkn154 \ -I$(TOSDIR)/platforms/telosb/mac/tkn154 \ -I$(TOSDIR)/platforms/telosb/mac/tkn154/timer \ -I$(TOSDIR)/chips/cc2420_tkn154 tinyos-2.1.2+dfsg/tos/platforms/micaz/mac/tkn154/README.txt000066400000000000000000000012221207233610700231610ustar00rootroot00000000000000This directory contains the TKN15.4 "platform glue" code for the micaz platform. Like the telos platform, micaz uses the CC2420 radio and in order not to maintain identical configuration files, the micaz platform pulls in (uses) some files from the platform/telosb/mac/tkn154 directory. This includes the central MAC configurations "Ieee802154BeaconEnabledC" and "Ieee802154NonBeaconEnabledC", to which the next higher layer will wire to. The ./Makefile.include file defines in which order the directories are parsed and should be included by any micaz application. More information on TKN15.4 can be found here: tinyos-2.x/tos/lib/mac/tkn154/README.txt tinyos-2.1.2+dfsg/tos/platforms/micaz/mac/tkn154/TKN154_platform.h000066400000000000000000000053521207233610700244360ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.1 $ * $Date: 2009-05-18 16:29:56 $ * @author Jan Hauer * ======================================================================== */ #ifndef __TKN154_platform_H #define __TKN154_platform_H /**************************************************** * The following constants define guard times on MicaZ. * All values are in symbol time (1 symbol = 16 us) */ enum { // the expected maximum time between calling a transmit() operation and // the radio putting the first byte on the channel assuming no CSMA-CA IEEE154_RADIO_TX_DELAY = 400, // the expected maximum time between calling a receive() operation and the // the radio actually being put in receive mode IEEE154_RADIO_RX_DELAY = 400, // defines at what time the MAC payload for a beacon frame is assembled before // the next scheduled beacon transmission time; the value must be smaller than // the beacon interval plus the time for preparing the Tx operation BEACON_PAYLOAD_UPDATE_INTERVAL = 2500, }; // TODO: add (and test) IEEE154_RADIO_POWERUP_TIME (see telos) #endif tinyos-2.1.2+dfsg/tos/platforms/micaz/mac/tkn154/platform_message.h000066400000000000000000000012361207233610700251710ustar00rootroot00000000000000 #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include /* The following include pulls in the ieee154_header_t/ieee154_metadata_t definitions */ #include /* TOSH_DATA_LENGTH should be the maximum length of the MAC payload */ #ifndef TOSH_DATA_LENGTH #define TOSH_DATA_LENGTH 118 #elif TOSH_DATA_LENGTH < 118 #warning "MAC payload region is smaller than aMaxMACPayloadSize!" #endif typedef union message_header { ieee154_header_t ieee154; serial_header_t serial; } message_header_t; typedef union TOSRadioFooter { } message_footer_t; typedef union TOSRadioMetadata { ieee154_metadata_t ieee154; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/micaz/platform.h000066400000000000000000000000001207233610700216630ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/micaz/platform_message.h000066400000000000000000000051241207233610700234030ustar00rootroot00000000000000/* $Id: platform_message.h,v 1.6 2010-06-29 22:07:54 scipio Exp $ * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Defining the platform-independently named packet structures to be the * chip-specific CC1000 packet structures. * * @author Philip Levis * @date May 16 2005 * Revision: $Revision: 1.6 $ */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include "CC2420.h" #include "Serial.h" typedef union message_header { cc2420_header_t cc2420; serial_header_t serial; } message_header_t; typedef union message_footer { cc2420_footer_t cc2420; } message_footer_t; typedef union message_metadata { cc2420_metadata_t cc2420; serial_metadata_t serial; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/micaz/sim/000077500000000000000000000000001207233610700204705ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/micaz/sim/.platform000066400000000000000000000017501207233610700223200ustar00rootroot00000000000000# # FILE: micaz/.platform # # Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. And because of that, the current platform's include directory # must be specified, otherwise its search order is last instead of first. # # $Id: .platform,v 1.6 2009-11-14 02:12:39 razvanm Exp $ # push( @includes, qw( %T/platforms/micaz %T/platforms/mica %T/platforms/micaz/chips/cc2420 %T/chips/cc2420 %T/chips/atm128 %T/chips/atm128/adc %T/chips/atm128/pins %T/chips/atm128/spi %T/chips/atm128/timer %T/lib/power %T/lib/timer %T/lib/serial ) ); @opts = qw( -fnesc-no-debug -fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask ); if (defined($ENV{"GCC"})) { push @opts, "-gcc=$ENV{'GCC'}"; } else { push @opts, "-gcc=gcc"; } push @opts, "-mingw-gcc" if $cygwin; tinyos-2.1.2+dfsg/tos/platforms/micaz/sim/platform_hardware.h000066400000000000000000000053701207233610700243470ustar00rootroot00000000000000/** * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. * Copyright (c) 2002-2003 Intel Corporation. * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Jason Hill, Philip Levis, Nelson Lee, David Gay * @author Alan Broad * @author Matt Miller * @author Martin Turon * * $Id: platform_hardware.h,v 1.6 2010-06-29 22:07:54 scipio Exp $ */ #ifndef HARDWARE_H #define HARDWARE_H #include #include // A/D constants (channels, etc) enum { CHANNEL_RSSI = ATM128_ADC_SNGL_ADC0, CHANNEL_THERMISTOR = ATM128_ADC_SNGL_ADC1, // normally unpopulated CHANNEL_BATTERY = ATM128_ADC_SNGL_ADC7, CHANNEL_BANDGAP = 30, CHANNEL_GND = 31, // ATM128_ADC_PRESCALE = ATM128_ADC_PRESCALE_64, // normal mica2 prescaler value ATM128_TIMER0_TICKSPPS = 32768, }; #endif //HARDWARE_H tinyos-2.1.2+dfsg/tos/platforms/mulle/000077500000000000000000000000001207233610700177135ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/.platform000077500000000000000000000032641207233610700215500ustar00rootroot00000000000000push( @includes, qw( %T/platforms/mulle/fix %T/platforms/mulle %T/platforms/mulle/chips/rf230 %T/chips/rf230 %T/lib/rfxlink/layers %T/lib/rfxlink/util %T/chips/at45db %T/platforms/mulle/button %T/platforms/mulle/lib %T/platforms/mulle/i2c %T/platforms/mulle/spi %T/platforms/mulle/chips/rv8564 %T/platforms/mulle/chips/at45db %T/platforms/mulle/chips/m16c60 %T/platforms/mulle/chips/mma7261qt %T/platforms/mulle/chips/ds2782 %T/platforms/mulle/system %T/platforms/mulle/timers %T/platforms/mulle/timers/stop %T/platforms/mulle/timers/wait %T/platforms/mulle/timers/rf230 %T/chips/m16c60 %T/chips/m16c60/62p %T/chips/m16c60/control %T/chips/m16c60/adc %T/chips/m16c60/dac %T/chips/m16c60/pins %T/chips/m16c60/timer %T/chips/m16c60/uart %T/chips/m16c60/printf %T/chips/mma7261qt %T/chips/ds2782 %T/lib/power %T/lib/timer %T/lib/serial %T/lib/diagmsg %T/lib/net/Deluge ) ); @opts = qw( -gcc=m32c-elf-gcc -mcpu=m16c -fnesc-target=env ); # gcc-4.5.0/gcc/config/m32c/m32c.h # in the order of nesc/src/machine/env_machine.c $ENV{NESC_MACHINE}="". "big_endian=false " . # m16c is little endian only "pcc_bitfield_type_matters=false " . # m32c.h (all) "empty_field_boundary=8 " . "structure_size_boundary=8 " . "word_size=1 " . "pointer=2,1 " . # m32c.h (TARGET_A16 == m8 or m16c) "float=4,1 " . # m32c.h (all) "double=8,1 " . # m32c.h (all) "long_double=8,1 " . # m32c.h (all) "short=2,1 " . # m32c.h (all) "int=2,1 " . # m32c.h (all) "long=4,1 " . # m32c.h (all) "long_long=8,1 " . # m32c.h (all) "int1248_align=1,1,1,1 " . "wchar_size_size=2,2 " . "char_wchar_signed=true,true " . # m32c.h char defined "" # several undefined fields... tinyos-2.1.2+dfsg/tos/platforms/mulle/ActiveMessageC.nc000077500000000000000000000052521207233610700230670ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface SendNotifier[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface PacketTimeStamp as PacketTimeStampMicro; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components RF230ActiveMessageC as MessageC, RF230SplitControlP, new SystemClockControlC(); RF230SplitControlP.SplitControlOrig -> MessageC; RF230SplitControlP.SystemClockControl -> SystemClockControlC; SplitControl = RF230SplitControlP.SplitControl; AMSend = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; SendNotifier = MessageC; Packet = MessageC; AMPacket = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketLink = MessageC; PacketTimeStampMilli = MessageC; PacketTimeStampMicro = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/mulle/DemoSensorC.nc000077500000000000000000000044061207233610700224250ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Demo sensor that connects to the AN0 channel on the MCU. This can * easily be used together with the potentiometer on the Mulle * expansionboard. * * @author Henrik Makitaavola */ generic configuration DemoSensorC() { provides interface Read; } implementation { components new AdcReadC(M16c60_ADC_CHL_AN0, M16c60_ADC_PRECISION_10BIT, M16c60_ADC_PRESCALE_4); components HplM16c60GeneralIOC as IOs; AdcReadC.Pin -> IOs.PortP100; Read = AdcReadC; } tinyos-2.1.2+dfsg/tos/platforms/mulle/DemoSensorNowC.nc000066400000000000000000000011341207233610700231010ustar00rootroot00000000000000/** * Demo sensor for the Mulle platform. * * @author Henrik Makitaavola */ generic configuration DemoSensorNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new AdcReadNowClientC(), DemoSensorP, HplM16c60GeneralIOC as IOs, RealMainP; DemoSensorP.Pin -> IOs.PortP100; DemoSensorP.AVcc -> IOs.PortP76; ReadNow = AdcReadNowClientC; Resource = AdcReadNowClientC; AdcReadNowClientC.M16c60AdcConfig -> DemoSensorP; RealMainP.PlatformInit -> DemoSensorP; } tinyos-2.1.2+dfsg/tos/platforms/mulle/DemoSensorP.nc000066400000000000000000000014301207233610700224310ustar00rootroot00000000000000module DemoSensorP { provides interface M16c60AdcConfig; provides interface Init; uses interface GeneralIO as Pin; uses interface GeneralIO as AVcc; } implementation { command error_t Init.init() { call Pin.makeInput(); // TODO(henrik) This Vref should be turned on in connection to the A/D // converter code and not here. // Turn on the Vref call AVcc.makeOutput(); call AVcc.set(); } async command uint8_t M16c60AdcConfig.getChannel() { // select the AN0 = P10_0 to potentiometer on the expansion board. return M16c60_ADC_CHL_AN0; } async command uint8_t M16c60AdcConfig.getPrecision() { return M16c60_ADC_PRECISION_10BIT; } async command uint8_t M16c60AdcConfig.getPrescaler() { return M16c60_ADC_PRESCALE_4; } } tinyos-2.1.2+dfsg/tos/platforms/mulle/DemoSensorStreamC.nc000066400000000000000000000017441207233610700236000ustar00rootroot00000000000000/* $Id: DemoSensorStreamC.nc,v 1.4 2006/12/12 18:23:43 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Demo sensor for the Mulle platform. * * @author Henrik Makitaavola * @author David Gay */ generic configuration DemoSensorStreamC() { provides interface ReadStream; } implementation { components new AdcReadStreamClientC(), DemoSensorP, HplM16c60GeneralIOC as IOs, RealMainP; DemoSensorP.Pin -> IOs.PortP100; DemoSensorP.AVcc -> IOs.PortP76; ReadStream = AdcReadStreamClientC; AdcReadStreamClientC.M16c60AdcConfig -> DemoSensorP; RealMainP.PlatformInit -> DemoSensorP; } tinyos-2.1.2+dfsg/tos/platforms/mulle/Ieee154MessageC.nc000066400000000000000000000050271207233610700227520ustar00rootroot00000000000000/* * Copyright (c) 2009, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ configuration Ieee154MessageC { provides { interface SplitControl; interface Ieee154Send; interface Receive as Ieee154Receive; interface SendNotifier; interface Packet; interface Ieee154Packet; interface Resource as SendResource[uint8_t clint]; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketTimeStamp as PacketTimeStampMicro; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components RF230Ieee154MessageC as MessageC; SplitControl = MessageC; Ieee154Send = MessageC; Ieee154Receive = MessageC; SendNotifier = MessageC; Packet = MessageC; Ieee154Packet = MessageC; SendResource = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketLink = MessageC; RadioChannel = MessageC; PacketTimeStampMilli = MessageC; PacketTimeStampMicro = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/mulle/PlatformC.nc000077500000000000000000000047061207233610700221360ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * All the wiring of the Mulle platform components. * * @author Henrik Makitaavola */ #include "hardware.h" configuration PlatformC { provides interface Init; uses interface Init as SubInit; } implementation { components PlatformP, LedsC, M16c60ControlC, new StopModeControlC(); Init = PlatformP.Init; SubInit = PlatformP.SubInit; PlatformP.M16c60Control -> M16c60ControlC; PlatformP.StopModeControl -> StopModeControlC; #ifdef ENABLE_STOP_MODE components HplRV8564C, DS2782InternalC, RealMainP; RealMainP.SoftwareInit -> PlatformP.StopModeInit; PlatformP.RTC -> HplRV8564C; PlatformP.HplDS2782 -> DS2782InternalC; PlatformP.DS2782Control -> DS2782InternalC; #endif } tinyos-2.1.2+dfsg/tos/platforms/mulle/PlatformLedsC.nc000077500000000000000000000043711207233610700227440ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Mulle platform-specific LED interface. * * @author Henrik Makitaavola */ configuration PlatformLedsC { provides interface GeneralIO as Led0; provides interface GeneralIO as Led1; provides interface GeneralIO as Led2; uses interface Init; } implementation { components HplM16c60GeneralIOC as IO; components PlatformP; Init = PlatformP.SubInit; Led0 = IO.PortP36; // Pin P3_6 = Red LED Led1 = IO.PortP37; // Pin P3_7 = Green LED Led2 = IO.PortP34; // External LED, supplied by user. } tinyos-2.1.2+dfsg/tos/platforms/mulle/PlatformP.nc000077500000000000000000000101161207233610700221430ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Mulle platform initialization code. * * @author Henrik Makitaavola */ #include "hardware.h" #include "rv8564.h" module PlatformP { provides interface Init; uses interface Init as SubInit; uses interface M16c60Control; uses interface StopModeControl; #ifdef ENABLE_STOP_MODE provides interface Init as StopModeInit; uses interface HplRV8564 as RTC; uses interface HplDS2782; uses interface StdControl as DS2782Control; #endif } implementation { command error_t Init.init() { error_t ok = SUCCESS; ok = call M16c60Control.init(); call StopModeControl.allowStopMode(false); // Init the M16c/60 to run at 10MHz. ok = ecombine (ok, call M16c60Control.defaultSystemClock(MCU_SPEED_10MHz)); // Sub components initialization. ok = ecombine(ok, call SubInit.init()); return SUCCESS; } #ifdef ENABLE_STOP_MODE task void enableStopMode(); command error_t StopModeInit.init() { // The task is needed so we can be sure that all underlying components // have been initialized, for example the I2C resource. post enableStopMode(); } task void enableStopMode() { call StopModeControl.allowStopMode(true); // Allow the DS2782 to enter sleep call DS2782Control.start(); call HplDS2782.allowSleep(true); // Activate the RTC and set it to output 1024 tics on the CLKOUT pin call RTC.enableCLKOUT(); call RTC.writeRegister(RV8564_CLKF, 0x81); } task void stopDS2782() { call DS2782Control.stop(); } async event void RTC.fired() {} async event void RTC.readRegisterDone(error_t error, uint8_t val, uint8_t reg) {} async event void RTC.writeRegisterDone(error_t error, uint8_t reg) {} async event void HplDS2782.setConfigDone(error_t error) {return; } async event void HplDS2782.allowSleepDone( error_t error ) { post stopDS2782(); } async event void HplDS2782.measureTemperatureDone( error_t error, uint16_t val ){ return; } async event void HplDS2782.measureVoltageDone( error_t error, uint16_t val ){ return; } async event void HplDS2782.measureCurrentDone( error_t error, uint16_t val ){ return; } async event void HplDS2782.measureAccCurrentDone( error_t error, uint16_t val ){ return; } async event void HplDS2782.setOffsetBiasDone( error_t error ){ return; } async event void HplDS2782.setAccOffsetBiasDone(error_t error){ return; } #endif } tinyos-2.1.2+dfsg/tos/platforms/mulle/PlatformSerialC.nc000077500000000000000000000043751207233610700233000ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The wiring of the Serial interface used to communicate with the Mulle * platform. * * @author Henrik Makitaavola */ configuration PlatformSerialC { provides interface StdControl; provides interface UartStream; provides interface UartByte; } implementation { components M16c60UartC as Uart, PlatformSerialP; StdControl = PlatformSerialP; PlatformSerialP -> Uart.Uart1Control; PlatformSerialP -> Uart.Uart1Stream; UartStream = Uart.Uart1Stream; UartByte = Uart.Uart1Byte; } tinyos-2.1.2+dfsg/tos/platforms/mulle/PlatformSerialP.nc000066400000000000000000000052161207233610700233050ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Initialization of the PlatformSerial uart and a StdControl implementation * for it. * * @author Henrik Makitaavola */ module PlatformSerialP { provides interface StdControl; uses interface UartControl; uses interface UartStream; } implementation { command error_t StdControl.start() { call UartControl.setParity(TOS_UART_PARITY_NONE); call UartControl.setNoStop(); call UartControl.setSpeed(TOS_UART_57600); call UartControl.setDuplexMode(TOS_UART_DUPLEX); call UartStream.enableReceiveInterrupt(); return SUCCESS; } command error_t StdControl.stop() { call UartControl.setDuplexMode(TOS_UART_OFF); return SUCCESS; } async event void UartStream.sendDone( uint8_t* buf, uint16_t len, error_t error ){} async event void UartStream.receivedByte( uint8_t byte ){} async event void UartStream.receiveDone( uint8_t* buf, uint16_t len, error_t error ){} } tinyos-2.1.2+dfsg/tos/platforms/mulle/TimeSyncMessageC.nc000077500000000000000000000054731207233610700234140ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketTimeStamp as PacketTimeStampRadio; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components RF230TimeSyncMessageC as MessageC, RF230SplitControlP, new SystemClockControlC(); RF230SplitControlP.SplitControlOrig -> MessageC; RF230SplitControlP.SystemClockControl -> SystemClockControlC; SplitControl = RF230SplitControlP.SplitControl; Receive = MessageC.Receive; Snoop = MessageC.Snoop; Packet = MessageC; AMPacket = MessageC; PacketTimeStampRadio = MessageC; TimeSyncAMSendRadio = MessageC; TimeSyncPacketRadio = MessageC; PacketTimeStampMilli = MessageC; TimeSyncAMSendMilli = MessageC; TimeSyncPacketMilli = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/mulle/button/000077500000000000000000000000001207233610700212265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/button/HplUserButtonC.nc000066400000000000000000000073441207233610700244410ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the Mulle platform extension board. * * @author Henrik Makitaavola */ configuration HplUserButtonC { provides interface GeneralIO; provides interface GpioInterrupt; } implementation { components HplM16c60InterruptC as Irqs, HplM16c60GeneralIOC as IOs, new M16c60InterruptC() as Irq; Irq -> Irqs.Int4; GpioInterrupt = Irq; GeneralIO = IOs.PortP16; } tinyos-2.1.2+dfsg/tos/platforms/mulle/button/UserButton.h000066400000000000000000000071101207233610700235100ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * * @author Gilman Tolle */ /** * Implementation of the user button for the Mulle platform * * @author Henrik Makitaavola */ #ifndef __USERBUTTON_H__ #define __USERBUTTON_H__ typedef enum { BUTTON_RELEASED = 0, BUTTON_PRESSED = 1 } button_state_t; #endif tinyos-2.1.2+dfsg/tos/platforms/mulle/button/UserButtonC.nc000066400000000000000000000102231207233610700237630ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * * @author Gilman Tolle */ /** * Implementation of the user button for the Mulle platform. Get * returns the current state of the button by reading the pin, * regardless of whether enable() or disable() has been called on the * Interface. Notify.enable() and Notify.disable() modify the * underlying interrupt state of the pin, and have the effect of * enabling or disabling notifications that the button has changed * state. * * @author Henrik Makitaavola */ #include configuration UserButtonC { provides interface Get; provides interface Notify; } implementation { components HplUserButtonC; components UserButtonP; Get = UserButtonP; Notify = UserButtonP; UserButtonP.GeneralIO -> HplUserButtonC.GeneralIO; UserButtonP.GpioInterrupt -> HplUserButtonC.GpioInterrupt; } tinyos-2.1.2+dfsg/tos/platforms/mulle/button/UserButtonP.nc000066400000000000000000000104351207233610700240050ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * * @author Gilman Tolle */ /** * Implementation of the user button for the Mulle platform extension board. * * @author Henrik Makitaavola */ #include module UserButtonP { provides interface Get; provides interface Notify; uses interface GeneralIO; uses interface GpioInterrupt; } implementation { task void notify() { signal Notify.notify(BUTTON_PRESSED); } command button_state_t Get.get() { if ( call GeneralIO.get() ) { return BUTTON_PRESSED; } else { return BUTTON_RELEASED; } } command error_t Notify.enable() { call GeneralIO.clr(); call GeneralIO.makeInput(); return call GpioInterrupt.enableRisingEdge(); } command error_t Notify.disable() { call GpioInterrupt.disable(); call GeneralIO.makeOutput(); call GeneralIO.clr(); return SUCCESS; } async event void GpioInterrupt.fired() { post notify(); } } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/000077500000000000000000000000001207233610700210215ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/at45db/000077500000000000000000000000001207233610700221045ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/at45db/HplAt45dbC.nc000066400000000000000000000051161207233610700242230ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Mulle specific wiring for the AT45DB161D Flash storage. * * @author Henrik Makitaavola */ configuration HplAt45dbC { provides interface HplAt45db; } implementation { components new HplAt45dbByteC(10), new SoftwareSpiC() as Spi, new NoArbiterC(), HplAt45dbP, HplM16c60GeneralIOC as IOs, RealMainP, BusyWaitMicroC; Spi.MISO -> IOs.PortP40; Spi.MOSI -> IOs.PortP41; Spi.SCLK -> IOs.PortP42; HplAt45db = HplAt45dbByteC; HplAt45dbByteC.Resource -> NoArbiterC; HplAt45dbByteC.FlashSpi -> Spi; HplAt45dbByteC.HplAt45dbByte -> HplAt45dbP; HplAt45dbP.VCC -> IOs.PortP32; HplAt45dbP.WP -> IOs.PortP44; HplAt45dbP.Select -> IOs.PortP45; HplAt45dbP.RESET -> IOs.PortP46; HplAt45dbP.MISO -> IOs.PortP40; HplAt45dbP.MOSI -> IOs.PortP41; HplAt45dbP.SCLK -> IOs.PortP42; HplAt45dbP.FlashSpi -> Spi; HplAt45dbP.BusyWait -> BusyWaitMicroC; RealMainP.SoftwareInit -> HplAt45dbP.Init; } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/at45db/HplAt45dbP.nc000066400000000000000000000115221207233610700242360ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2006, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Mulle specific HplAt45dbByte interface implementation * for the AT45DB161D Flash storage. * * @author Henrik Makitaavola */ module HplAt45dbP { provides { interface HplAt45dbByte; interface Init; } uses { interface SpiByte as FlashSpi; interface GeneralIO as VCC; interface GeneralIO as Select; interface GeneralIO as RESET; interface GeneralIO as WP; interface GeneralIO as MISO; interface GeneralIO as MOSI; interface GeneralIO as SCLK; interface BusyWait; } } implementation { // TODO(Henrik) Move init code to a SplitControl interface and // change the busy wait into a TimerMilli.startOneShot. command error_t Init.init() { call MISO.makeInput(); call MOSI.makeOutput(); call MOSI.set(); call SCLK.makeOutput(); call SCLK.set(); call WP.makeOutput(); call WP.set(); call RESET.makeOutput(); call RESET.set(); call Select.makeOutput(); call Select.set(); call VCC.makeOutput(); call VCC.clr(); // The device needs 20ms before is accepts a write. call BusyWait.wait(20000); return SUCCESS; } command void HplAt45dbByte.select() { call Select.clr(); } command void HplAt45dbByte.deselect() { call Select.set(); } task void idleTask() { uint8_t status; status = call FlashSpi.write(0); if (!(status & 0x80)) { post idleTask(); } else { signal HplAt45dbByte.idle(); } } command void HplAt45dbByte.waitIdle() { post idleTask(); } command bool HplAt45dbByte.getCompareStatus() { uint8_t status; status = call FlashSpi.write(0); return (!(status & 0x40)); } } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/at45db/HplAt45db_chip.h000066400000000000000000000045141207233610700247530ustar00rootroot00000000000000// $Id: HplAt45db_chip.h,v 1.1 2008/08/25 16:48:47 razvanm Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef __HPLAT45DB_CHIP_H__ #define __HPLAT45DB_CHIP_H__ // flash characteristics enum { AT45_MAX_PAGES = 4096, AT45_PAGE_SIZE = 528, AT45_PAGE_SIZE_LOG2 = 9 // Ignores the last 16 bytes }; typedef uint16_t at45page_t; typedef uint16_t at45pageoffset_t; // must fit 0 to AT45_PAGE_SIZE - 1 #endif // __HPLAT45DB_CHIP_H__ tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/ds2782/000077500000000000000000000000001207233610700217525ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/ds2782/DS2782InternalC.nc000066400000000000000000000044201207233610700247250ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The DS2782 wiring on the Mulle. * * @author Henrik Makitaavola */ configuration DS2782InternalC { provides interface StdControl; provides interface HplDS2782; } implementation { components new MulleI2C2C() as I2C, new HplDS2782LogicP(0x34) as Logic, DS2782InternalP, HplM16c60GeneralIOC as IOs; Logic.I2CPacket -> I2C; Logic.I2CResource -> I2C; HplDS2782 = Logic; StdControl = Logic; DS2782InternalP.Pullup -> IOs.PortP75; DS2782InternalP.ResourceDefaultOwner -> I2C; } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/ds2782/DS2782InternalP.nc000066400000000000000000000045121207233610700247440ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The DS2782 only goes to sleep if SDA and SCL are pulled low. * So everytime the default owner of the resource becomes the * owner of the I2C bus the pins are pulled low. * * @author Henrik Makitaavola */ module DS2782InternalP { uses interface ResourceDefaultOwner; uses interface GeneralIO as Pullup; } implementation { async event void ResourceDefaultOwner.granted() { call Pullup.clr(); } async event void ResourceDefaultOwner.requested() { call Pullup.set(); } async event void ResourceDefaultOwner.immediateRequested() { call Pullup.set(); } } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/m16c60/000077500000000000000000000000001207233610700217355ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/m16c60/M16c60AdcPlatformC.nc000066400000000000000000000041171207233610700253560ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Mulle specific implementation of the M16c60AdcPlatform interface. * * @author Henrik Makitaavola */ configuration M16c60AdcPlatformC { provides interface M16c60AdcPlatform; } implementation { components M16c60AdcPlatformP, HplM16c60GeneralIOC as IOs; M16c60AdcPlatform = M16c60AdcPlatformP; M16c60AdcPlatformP -> IOs.PortP76; } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/m16c60/M16c60AdcPlatformP.nc000066400000000000000000000042241207233610700253720ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Mulle specific implementation of the M16c60AdcPlatform interface. * * @author Henrik Makitaavola */ module M16c60AdcPlatformP { provides interface M16c60AdcPlatform; uses interface GeneralIO VRef; } implementation { async command void M16c60AdcPlatform.adcOn() { call VRef.makeOutput(); call VRef.set(); } async command void M16c60AdcPlatform.adcOff() { call VRef.clr(); } } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/m16c60/M16c60ControlPlatformC.nc000066400000000000000000000052531207233610700263110ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Mulle specific implementation of the M16c60ControlPlatform interface. * * @author Henrik Makitaavola */ module M16c60ControlPlatformC { provides interface M16c60ControlPlatform; } implementation { async command void M16c60ControlPlatform.PLLOn() { // Set all timers that uses the main clock // as source to use F2 instead of F1 because // the main clock will be twice as fast when PLL // is on. // Set the UARTS clock source to F2 instead of F1. // NOTE: No need to turn on/off protections for registers, // this is handeled by the caller of this code. CLR_BIT(PCLKR.BYTE, 0); // Timers CLR_BIT(PCLKR.BYTE, 1); // Uarts } async command void M16c60ControlPlatform.PLLOff() { // Restore settings done in PLLOn() // NOTE: No need to turn on/off protections for registers, // this is handeled by the caller of this code. SET_BIT(PCLKR.BYTE, 0); SET_BIT(PCLKR.BYTE, 1); } } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/m16c60/M16c60UartCounterPlatformC.nc000066400000000000000000000040201207233610700271330ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Micro counter provided by Mulle for the M16c60 uart implementation. * * @author Henrik Makitaavola */ configuration M16c60UartCounterPlatformC { provides interface Counter; } implementation { components CounterMicro16C; Counter = CounterMicro16C; } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/mma7261qt/000077500000000000000000000000001207233610700224605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/mma7261qt/HplMMA7261QTC.nc000066400000000000000000000057371207233610700247640ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * MMA7261QT configuration. * * @author Henrik Makitaavola */ configuration HplMMA7261QTC { provides interface Read as AccelX; provides interface Read as AccelY; provides interface Read as AccelZ; provides interface GeneralIO as Sleep; provides interface GeneralIO as GSelect1; provides interface GeneralIO as GSelect2; } implementation { components new AdcReadClientC() as _AccelX, new AdcReadClientC() as _AccelY, new AdcReadClientC() as _AccelZ, HplM16c60GeneralIOC as IOs, HplMMA7261QTP; HplMMA7261QTP.VCC -> IOs.PortP76; HplMMA7261QTP.Sleep -> IOs.PortP12; HplMMA7261QTP.GSelect1 -> IOs.PortP30; HplMMA7261QTP.GSelect2 -> IOs.PortP31; HplMMA7261QTP.AccelXPort -> IOs.PortP105; HplMMA7261QTP.AccelYPort -> IOs.PortP104; HplMMA7261QTP.AccelZPort -> IOs.PortP103; Sleep = IOs.PortP12; GSelect1 = IOs.PortP30; GSelect2 = IOs.PortP31; _AccelX.M16c60AdcConfig -> HplMMA7261QTP.AccelXConf; _AccelY.M16c60AdcConfig -> HplMMA7261QTP.AccelYConf; _AccelZ.M16c60AdcConfig -> HplMMA7261QTP.AccelZConf; AccelX = _AccelX; AccelY = _AccelY; AccelZ = _AccelZ; components RealMainP; RealMainP.PlatformInit -> HplMMA7261QTP.Init; } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/mma7261qt/HplMMA7261QTP.nc000066400000000000000000000070751207233610700247760ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * MMA7261QT implementation. * * @author Henrik Makitaavola */ module HplMMA7261QTP { provides { interface Init; interface M16c60AdcConfig as AccelXConf; interface M16c60AdcConfig as AccelYConf; interface M16c60AdcConfig as AccelZConf; } uses { interface GeneralIO as VCC; interface GeneralIO as Sleep; interface GeneralIO as GSelect1; interface GeneralIO as GSelect2; interface GeneralIO as AccelXPort; interface GeneralIO as AccelYPort; interface GeneralIO as AccelZPort; } } implementation { command error_t Init.init() { call VCC.makeOutput(); call VCC.set(); call Sleep.makeOutput(); call Sleep.clr(); call GSelect1.makeOutput(); call GSelect1.clr(); call GSelect2.makeOutput(); call GSelect2.clr(); call AccelXPort.makeInput(); call AccelXPort.clr(); call AccelYPort.makeInput(); call AccelYPort.clr(); call AccelZPort.makeInput(); call AccelZPort.clr(); } inline uint8_t prescaler() { return M16c60_ADC_PRESCALE_4; } inline uint8_t precision() { return M16c60_ADC_PRECISION_8BIT; } async command uint8_t AccelXConf.getChannel() { return M16c60_ADC_CHL_AN5; } async command uint8_t AccelXConf.getPrecision() { return precision(); } async command uint8_t AccelXConf.getPrescaler() { return prescaler(); } async command uint8_t AccelYConf.getChannel() { return M16c60_ADC_CHL_AN4; } async command uint8_t AccelYConf.getPrecision() { return precision(); } async command uint8_t AccelYConf.getPrescaler() { return prescaler(); } async command uint8_t AccelZConf.getChannel() { return M16c60_ADC_CHL_AN3; } async command uint8_t AccelZConf.getPrecision() { return precision(); } async command uint8_t AccelZConf.getPrescaler() { return prescaler(); } } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/rf230/000077500000000000000000000000001207233610700216555ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/rf230/HplRF230C.nc000077500000000000000000000057211207233610700235120ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Mulle specific wiring of the HplRF230C configuration. * * @author Henrik Makitaavola */ #include configuration HplRF230C { provides { interface GeneralIO as SELN; interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as SLP_TR; interface GeneralIO as RSTN; interface GpioCapture as IRQ; interface Alarm as Alarm; interface LocalTime as LocalTimeRadio; } } implementation { components HplRF230P; IRQ = HplRF230P.IRQ; components HplM16c60GeneralIOC as IOs; components new SoftwareSpiC() as Spi, new NoArbiterC(); SpiResource = NoArbiterC; Spi.MISO -> IOs.PortP10; Spi.MOSI -> IOs.PortP11; Spi.SCLK -> IOs.PortP33; FastSpiByte = Spi; HplRF230P.PortVCC -> IOs.PortP77; HplRF230P.PortIRQ -> IOs.PortP83; HplRF230P.MISO -> IOs.PortP10; HplRF230P.MOSI -> IOs.PortP11; HplRF230P.SCLK -> IOs.PortP33; SLP_TR = IOs.PortP07; RSTN = IOs.PortP43; SELN = IOs.PortP35; components HplM16c60InterruptC as Irqs, new M16c60InterruptC() as Irq; HplRF230P.GIRQ -> Irq; Irq -> Irqs.Int1; components AlarmRF23016C as AlarmRF230; HplRF230P.Alarm -> AlarmRF230; Alarm = AlarmRF230; components PlatformP; PlatformP.SubInit -> HplRF230P.PlatformInit; components LocalTimeMicroC; LocalTimeRadio = LocalTimeMicroC; } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/rf230/HplRF230P.nc000077500000000000000000000057221207233610700235300ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the time capture on RF230 interrupt and * a initialization routine for the RF230 pins. * * @author Henrik Makitaavola */ module HplRF230P { provides { interface GpioCapture as IRQ; interface Init as PlatformInit; } uses { interface GeneralIO as PortIRQ; interface GeneralIO as PortVCC; interface GeneralIO as MOSI; interface GeneralIO as MISO; interface GeneralIO as SCLK; interface GpioInterrupt as GIRQ; interface Alarm as Alarm; } } implementation { command error_t PlatformInit.init() { call MISO.makeInput(); call MOSI.makeOutput(); call MOSI.clr(); call SCLK.makeOutput(); call SCLK.clr(); call PortIRQ.makeInput(); call PortIRQ.clr(); call GIRQ.disable(); call PortVCC.makeOutput(); call PortVCC.set(); return SUCCESS; } async event void GIRQ.fired() { signal IRQ.captured(call Alarm.getNow()); } async event void Alarm.fired() {} default async event void IRQ.captured(uint16_t time) {} async command error_t IRQ.captureRisingEdge() { call GIRQ.enableRisingEdge(); return SUCCESS; } async command error_t IRQ.captureFallingEdge() { // falling edge comes when the IRQ_STATUS register of the RF230 is read return FAIL; } async command void IRQ.disable() { call GIRQ.disable(); } } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/rf230/RF230SplitControlP.nc000066400000000000000000000053401207233610700254320ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This module overrides the default SplitControl for the RF230 chip so that * the PLL is turned on every time the RF230 chip is turned on. * * @author Henrik Makitaavola */ module RF230SplitControlP { provides interface SplitControl; uses interface SplitControl as SplitControlOrig; uses interface SystemClockControl; } implementation { command error_t SplitControl.start() { #ifndef RF230_SLOW_SPI_MULLE #ifndef RF230_SLOW_SPI call SystemClockControl.minSpeed(M16C60_PLL_CLOCK); #endif #endif return call SplitControlOrig.start(); } event void SplitControlOrig.startDone(error_t error) { #ifndef RF230_SLOW_SPI_MULLE #ifndef RF230_SLOW_SPI if (error != SUCCESS) { call SystemClockControl.minSpeed(M16C60_DONT_CARE); } #endif #endif signal SplitControl.startDone(error); } command error_t SplitControl.stop() { return call SplitControlOrig.stop(); } event void SplitControlOrig.stopDone(error_t error) { #ifndef RF230_SLOW_SPI if (error == SUCCESS) { call SystemClockControl.minSpeed(M16C60_DONT_CARE); } #endif signal SplitControl.stopDone(error); } } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/rf230/RadioConfig.h000066400000000000000000000122271207233610700242160ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ /** * @author Henrik Makitaavola */ #ifndef __RADIOCONFIG_H__ #define __RADIOCONFIG_H__ #include #include "Timer.h" enum { /** * This is the value of the TRX_CTRL_0 register * which configures the output pin currents and the CLKM clock */ RF230_TRX_CTRL_0_VALUE = 0, /** * This is the default value of the CCA_MODE field in the PHY_CC_CCA register * which is used to configure the default mode of the clear channel assessment */ RF230_CCA_MODE_VALUE = RF230_CCA_MODE_3, /** * This is the value of the CCA_THRES register that controls the * energy levels used for clear channel assessment */ RF230_CCA_THRES_VALUE = 0xC7, }; /* This is the default value of the TX_PWR field of the PHY_TX_PWR register. 0-15*/ #ifndef RF230_DEF_RFPOWER #define RF230_DEF_RFPOWER 0 #endif /* This is the default value of the CHANNEL field of the PHY_CC_CCA register. 11-26*/ #ifndef RF230_DEF_CHANNEL #define RF230_DEF_CHANNEL 11 #endif /* * This is the command used to calculate the CRC for the RF230 chip. * TODO: Check why the default crcByte implementation is in a different endianness */ inline uint16_t RF230_CRCBYTE_COMMAND(uint16_t crc, uint8_t data) { uint8_t lo8 = crc & 0x00FF; uint8_t hi8 = (crc >> 8) & 0x00FF; data ^= lo8; //lo8 (crc); data ^= data << 4; return ((((uint16_t)data << 8) | hi8 /*hi8 (crc)*/) ^ (uint8_t)(data >> 4) ^ ((uint16_t)data << 3)); } /** * This is the timer type of the radio alarm interface */ typedef TMicro TRadio; typedef uint16_t tradio_size; /** * The number of alarm ticks per one second */ #define RADIO_ALARM_SEC 2500000 // 20MHz / 8 #define RADIO_ALARM_MICROSEC 2.5// RADIO_ALARM_SEC/1000000 /** * The base two logarithm of the number of radio alarm ticks per one millisecond */ #define RADIO_ALARM_MILLI_EXP 11 /** * Make PACKET_LINK automaticaly enabled for Ieee154MessageC */ #if !defined(TFRAMES_ENABLED) && !defined(PACKET_LINK) #define PACKET_LINK #endif #endif //__RADIOCONFIG_H__ tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/rv8564/000077500000000000000000000000001207233610700217775ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/rv8564/HplRV8564.nc000077500000000000000000000057561207233610700236630ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Interface for the RV-8564-C2 real time clock. * * @author Henrik Makitaavola */ interface HplRV8564 { /** * Enables/disables the interrupts generated by the RV8564 chip. */ command void enableInterrupt(); command void disableInterrupt(); /** * Enables/disable CLKOUT from the RTC. */ command void enableCLKOUT(); command void disableCLKOUT(); /** * Reads from a register. * * @param reg The register to be read. * @return The value of the register. */ command error_t readRegister(uint8_t reg); /** * Writes to a register. * * @param reg The register that is written to. * @param value The value that is written to the register. */ command error_t writeRegister(uint8_t reg, uint8_t value); /** * Signals when a register read finished. * * @param val The value read from the register. * @param reg The register the value was read from. */ async event void readRegisterDone(error_t error, uint8_t reg, uint8_t val); /** * Signals when a register write finished. * * @param reg The register the value was written to. */ async event void writeRegisterDone(error_t error, uint8_t reg); /** * Signal when an interrupt occurs. */ async event void fired(); } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/rv8564/HplRV8564C.nc000077500000000000000000000047561207233610700237650ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Configuration of the RV-8564 Real-time Clock on the Mulle platform. * * @author Henrik Makitaavola */ configuration HplRV8564C { provides interface HplRV8564; } implementation { components HplRV8564P as RTCP, new MulleI2C2C() as I2C, HplM16c60GeneralIOC as IOs, HplM16c60InterruptC as Irqs, new M16c60InterruptC() as Irq, BusyWaitMicroC; Irq.HplM16c60Interrupt -> Irqs.Int0; HplRV8564 = RTCP; RTCP.CLKOE -> IOs.PortP47; RTCP.CLKOUT -> IOs.PortP92; RTCP.GpioInterrupt -> Irq; RTCP.I2C -> I2C; RTCP.I2CResource -> I2C; RTCP.BusyWait -> BusyWaitMicroC; components PlatformC, RealMainP; PlatformC.SubInit -> RTCP.Init; RealMainP.SoftwareInit -> RTCP.Startup; } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/rv8564/HplRV8564P.nc000077500000000000000000000116441207233610700237740ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the RV-8564-C2 real time clock. * * @author Henrik Makitaavola */ #include "rv8564.h" #include "I2C.h" module HplRV8564P { provides interface HplRV8564 as RTC; provides interface Init; provides interface Init as Startup; uses interface GeneralIO as CLKOE; uses interface GeneralIO as CLKOUT; uses interface GeneralIO; uses interface GpioInterrupt; uses interface I2CPacket as I2C; uses interface Resource as I2CResource; uses interface BusyWait; } implementation { enum { S_IDLE, S_READING, S_WRITING }; norace uint8_t m_state = S_IDLE; norace uint8_t m_buf[2]; command error_t Init.init() { call CLKOUT.makeInput(); call CLKOE.clr(); call CLKOE.makeOutput(); return SUCCESS; } command error_t Startup.init() { int i; // The RTC needs a maximum of 500ms to startup for (i = 0; i < 10; ++i) { call BusyWait.wait(50000UL); } return SUCCESS; } command void RTC.enableCLKOUT() { call CLKOE.set(); } command void RTC.disableCLKOUT() { call CLKOE.clr(); } command void RTC.enableInterrupt() { call GpioInterrupt.enableFallingEdge(); } command void RTC.disableInterrupt() { call GpioInterrupt.disable(); } command error_t RTC.readRegister(uint8_t reg) { if (m_state != S_IDLE) { return EBUSY; } m_state = S_READING; m_buf[0] = reg; if (call I2CResource.request() == SUCCESS) { return SUCCESS; } else { m_state = S_IDLE; return FAIL; } return SUCCESS; } command error_t RTC.writeRegister(uint8_t reg, uint8_t value) { if (m_state != S_IDLE) { return FAIL; } m_state = S_WRITING; atomic m_buf[0] = reg; atomic m_buf[1] = value; if (call I2CResource.request() == SUCCESS) { return SUCCESS; } else { m_state = S_IDLE; return FAIL; } } event void I2CResource.granted() { atomic { if (m_state == S_READING) { call I2C.write(I2C_START, RV8564_ADDR, 1, m_buf); } else if (m_state == S_WRITING) { call I2C.write(I2C_START | I2C_STOP, RV8564_ADDR, 2, m_buf); } } } async event void GpioInterrupt.fired() { signal RTC.fired(); } async event void I2C.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { atomic { if (m_state == S_READING) { call I2CResource.release(); m_state = S_IDLE; signal RTC.readRegisterDone(error, m_buf[0], m_buf[1]); } } } async event void I2C.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { if (m_state == S_READING) { if (error != SUCCESS) { call I2CResource.release(); m_state = S_IDLE; signal RTC.readRegisterDone(error, m_buf[0], 0); return; } else { call I2C.read(I2C_START | I2C_STOP, RV8564_ADDR, 1, m_buf + 1); } } else if (m_state == S_WRITING) { call I2CResource.release(); m_state = S_IDLE; signal RTC.writeRegisterDone(error, m_buf[0]); } } } tinyos-2.1.2+dfsg/tos/platforms/mulle/chips/rv8564/rv8564.h000077500000000000000000000077621207233610700231450ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This file is for the Microcrystal RV-8564 Real-time Clock on the Mulle * platform. * * @author: Gong Liang */ #ifndef __RV8564_H__ #define __RV8564_H__ /* constants */ #define RV8564_ADDR 0x51 //slave address #define RV8564_CS1 0x00 #define RV8564_CS2 0x01 /* Control/Status registers */ #define RV8564_CTR1 0x00 //00 Control status 1, //Test1 0 Stop 0, Test 0 0 0 #define RV8564_CTR2 0x01 //01 Control status 2, // 0 x 0 TI/TP, AF TF AIE TIE // TI/TP=1,INT pulses //Note that writing 1 to the alarm flags causes no change...0-1 is not applied. #define RV8564_SEC 0x02 // #define RV8564_MIN 0x03 // #define RV8564_HOUR 0x04 // #define RV8564_DAY 0x05 // #define RV8564_WEEK 0x06 // #define RV8564_MON 0x07 // #define RV8564_YEAR 0x08 // #define RV8564_MIN_ALARM 0x09 // #define RV8564_HR_ALARM 0x0A // #define RV8564_DAY_ALARM 0x0B // #define RV8564_WK_ALARM 0x0C // #define RV8564_CLKF 0x0D //FE x x x, x x FD1 FD0 // 0 0 32768 Hz // 0 1 61024 Hz // 1 0 32 Hz // 1 1 1 Hz #define RV8564_TC 0x0E //TE x x x, x x TD1 TD0 // 0 0 4096 Hz // 0 1 64 Hz // 1 0 1 Sec // 1 1 1 Min #define RV8564_TIMER 0x0F //128 64 32 16, 8 4 2 1 /*********** Initial setting of the RV_8564ram, Set it before using (debug only) ***********/ uint8_t RV_8564ram[16] = { 0x00, 0x13, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x80, 0x80, 0x80, 0x80, 0x83, 0x83, 1 }; #endif /* __RV8564_H__ */ tinyos-2.1.2+dfsg/tos/platforms/mulle/fix/000077500000000000000000000000001207233610700205015ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/fix/At45dbP.nc000066400000000000000000000301641207233610700221720ustar00rootroot00000000000000// $Id: At45dbP.nc,v 1.2 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "crc.h" #include "At45db.h" #include "Timer.h" /** * Private componenent for the Atmel's AT45DB HAL. * * @author David Gay */ module At45dbP @safe() { provides { interface Init; interface At45db; } uses { interface HplAt45db; interface BusyWait; } } implementation { #define CHECKARGS #if 0 uint8_t work[20]; uint8_t woffset; void wdbg(uint8_t x) { work[woffset++] = x; if (woffset == sizeof work) woffset = 0; } #else #define wdbg(n) #endif enum { // requests IDLE, R_READ, R_READCRC, R_WRITE, R_ERASE, R_COPY, R_SYNC, R_SYNCALL, R_FLUSH, R_FLUSHALL, BROKEN // Write failed. Fail all subsequent requests. }; uint8_t request; at45pageoffset_t reqOffset, reqBytes; uint8_t * COUNT_NOK(reqBytes) reqBuf; at45page_t reqPage; enum { P_READ, P_READCRC, P_WRITE, P_FLUSH, P_FILL, P_ERASE, P_COMPARE, P_COMPARE_CHECK }; struct { at45page_t page; bool busy : 1; bool clean : 1; bool erased : 1; uint8_t unchecked : 2; } buffer[2]; uint8_t selected; // buffer used by the current op uint8_t checking; bool flashBusy; // Select a command for the current buffer #define OPN(n, name) ((n) ? name ## 1 : name ## 2) #define OP(name) OPN(selected, name) command error_t Init.init() { request = IDLE; flashBusy = TRUE; // pretend we're on an invalid non-existent page buffer[0].page = buffer[1].page = AT45_MAX_PAGES; buffer[0].busy = buffer[1].busy = FALSE; buffer[0].clean = buffer[1].clean = TRUE; buffer[0].unchecked = buffer[1].unchecked = 0; buffer[0].erased = buffer[1].erased = FALSE; return SUCCESS; } void flashIdle() { flashBusy = buffer[0].busy = buffer[1].busy = FALSE; } void requestDone(error_t result, uint16_t computedCrc, uint8_t newState); void handleRWRequest(); task void taskSuccess() { requestDone(SUCCESS, 0, IDLE); } task void taskFail() { requestDone(FAIL, 0, IDLE); } void checkBuffer(uint8_t buf) { if (flashBusy) { call HplAt45db.waitIdle(); return; } call HplAt45db.compare(OPN(buf, AT45_C_COMPARE_BUFFER), buffer[buf].page); checking = buf; } void flushBuffer() { if (flashBusy) { call HplAt45db.waitIdle(); return; } call HplAt45db.flush(buffer[selected].erased ? OP(AT45_C_QFLUSH_BUFFER) : OP(AT45_C_FLUSH_BUFFER), buffer[selected].page); } event void HplAt45db.waitIdleDone() { flashIdle(); // Eager compare - this steals the current command #if 0 if ((buffer[0].unchecked || buffer[1].unchecked) && cmdPhase != P_COMPARE) checkBuffer(buffer[0].unchecked ? 0 : 1); else #endif handleRWRequest(); } event void HplAt45db.waitCompareDone(bool ok) { flashIdle(); if (ok) buffer[checking].unchecked = 0; else if (buffer[checking].unchecked < 2) buffer[checking].clean = FALSE; else { requestDone(FAIL, 0, BROKEN); return; } handleRWRequest(); } event void HplAt45db.readDone() { requestDone(SUCCESS, 0, IDLE); } event void HplAt45db.writeDone() { buffer[selected].clean = FALSE; buffer[selected].unchecked = 0; requestDone(SUCCESS, 0, IDLE); } event void HplAt45db.crcDone(uint16_t crc) { requestDone(SUCCESS, crc, IDLE); } event void HplAt45db.flushDone() { flashBusy = TRUE; buffer[selected].clean = buffer[selected].busy = TRUE; buffer[selected].unchecked++; buffer[selected].erased = FALSE; handleRWRequest(); } event void HplAt45db.compareDone() { flashBusy = TRUE; buffer[checking].busy = TRUE; // The 10us wait makes old mica motes (Atmega 103) happy, for // some mysterious reason (w/o this wait, the first compare // always fails, even though the compare after the rewrite // succeeds...) call BusyWait.wait(10); call HplAt45db.waitCompare(); } event void HplAt45db.fillDone() { flashBusy = TRUE; buffer[selected].page = reqPage; buffer[selected].clean = buffer[selected].busy = TRUE; buffer[selected].erased = FALSE; handleRWRequest(); } event void HplAt45db.eraseDone() { flashBusy = TRUE; // The buffer contains garbage, but we don't care about the state // of bits on this page anyway (if we do, we'll perform a // subsequent write) buffer[selected].page = AT45_MAX_PAGES; buffer[selected].clean = TRUE; buffer[selected].erased = TRUE; requestDone(SUCCESS, 0, IDLE); } void syncOrFlushAll(uint8_t newReq); void handleRWRequest() { if (reqPage == buffer[selected].page) switch (request) { case R_ERASE: switch (reqOffset) { case AT45_ERASE: if (flashBusy) call HplAt45db.waitIdle(); else call HplAt45db.erase(AT45_C_ERASE_PAGE, reqPage); break; case AT45_PREVIOUSLY_ERASED: // We believe the user... buffer[selected].erased = TRUE; /* Fallthrough */ case AT45_DONT_ERASE: // The buffer contains garbage, but we don't care about the state // of bits on this page anyway (if we do, we'll perform a // subsequent write) buffer[selected].clean = TRUE; requestDone(SUCCESS, 0, IDLE); break; } break; case R_COPY: if (!buffer[selected].clean) // flush any modifications flushBuffer(); else { // Just redesignate as destination page, and mark it dirty. // It will eventually be flushed, completing the copy. buffer[selected].page = reqOffset; buffer[selected].clean = FALSE; post taskSuccess(); } break; case R_SYNC: case R_SYNCALL: if (buffer[selected].clean && buffer[selected].unchecked) { checkBuffer(selected); return; } /* fall through */ case R_FLUSH: case R_FLUSHALL: if (!buffer[selected].clean) flushBuffer(); else if (request == R_FLUSH || request == R_SYNC) post taskSuccess(); else { // Check for more dirty pages uint8_t oreq = request; request = IDLE; syncOrFlushAll(oreq); } break; case R_READ: if (buffer[selected].busy) call HplAt45db.waitIdle(); else call HplAt45db.readBuffer(OP(AT45_C_READ_BUFFER), reqOffset, reqBuf, reqBytes); break; case R_READCRC: if (buffer[selected].busy) call HplAt45db.waitIdle(); else /* Hack: baseCrc was stored in reqBuf */ call HplAt45db.crc(OP(AT45_C_READ_BUFFER), 0, reqOffset, reqBytes, (uint16_t)reqBuf); break; case R_WRITE: if (buffer[selected].busy) call HplAt45db.waitIdle(); else call HplAt45db.write(OP(AT45_C_WRITE_BUFFER), 0, reqOffset, reqBuf, reqBytes); break; } else if (!buffer[selected].clean) flushBuffer(); else if (buffer[selected].unchecked) checkBuffer(selected); else { // just get the new page (except for erase) if (request == R_ERASE) { buffer[selected].page = reqPage; handleRWRequest(); } else if (flashBusy) call HplAt45db.waitIdle(); else call HplAt45db.fill(OP(AT45_C_FILL_BUFFER), reqPage); } } void requestDone(error_t result, uint16_t computedCrc, uint8_t newState) { uint8_t orequest = request; request = newState; switch (orequest) { case R_READ: signal At45db.readDone(result); break; case R_READCRC: signal At45db.computeCrcDone(result, computedCrc); break; case R_WRITE: signal At45db.writeDone(result); break; case R_SYNC: case R_SYNCALL: signal At45db.syncDone(result); break; case R_FLUSH: case R_FLUSHALL: signal At45db.flushDone(result); break; case R_ERASE: signal At45db.eraseDone(result); break; case R_COPY: signal At45db.copyPageDone(result); break; } } void newRequest(uint8_t req, at45page_t page, at45pageoffset_t offset, void * COUNT_NOK(n) reqdata, at45pageoffset_t n) { request = req; reqBuf = NULL; reqBytes = n; reqBuf = reqdata; reqPage = page; reqOffset = offset; if (page == buffer[0].page) selected = 0; else if (page == buffer[1].page) selected = 1; else selected = !selected; // LRU with 2 buffers... #ifdef CHECKARGS if (page >= AT45_MAX_PAGES || offset >= AT45_PAGE_SIZE || n > AT45_PAGE_SIZE || offset + n > AT45_PAGE_SIZE) post taskFail(); else #endif handleRWRequest(); } command void At45db.read(at45page_t page, at45pageoffset_t offset, void *reqdata, at45pageoffset_t n) { newRequest(R_READ, page, offset, reqdata, n); } command void At45db.computeCrc(at45page_t page, at45pageoffset_t offset, at45pageoffset_t n, uint16_t baseCrc) { /* This is a hack (store crc in reqBuf), but it saves 2 bytes of RAM */ newRequest(R_READCRC, page, offset, TCAST(uint8_t * COUNT(n), baseCrc), n); } command void At45db.write(at45page_t page, at45pageoffset_t offset, void *reqdata, at45pageoffset_t n) { newRequest(R_WRITE, page, offset, reqdata, n); } command void At45db.erase(at45page_t page, uint8_t eraseKind) { newRequest(R_ERASE, page, eraseKind, NULL, 0); } command void At45db.copyPage(at45page_t from, at45page_t to) { /* Assumes at45pageoffset_t can hold an at45page_t. A little icky */ newRequest(R_COPY, from, to, NULL, 0); } void syncOrFlush(at45page_t page, uint8_t newReq) { request = newReq; if (buffer[0].page == page) selected = 0; else if (buffer[1].page == page) selected = 1; else { post taskSuccess(); return; } buffer[selected].unchecked = 0; handleRWRequest(); } command void At45db.sync(at45page_t page) { syncOrFlush(page, R_SYNC); } command void At45db.flush(at45page_t page) { syncOrFlush(page, R_FLUSH); } void syncOrFlushAll(uint8_t newReq) { request = newReq; if (!buffer[0].clean) selected = 0; else if (!buffer[1].clean) selected = 1; else { post taskSuccess(); return; } buffer[selected].unchecked = 0; handleRWRequest(); } command void At45db.syncAll() { syncOrFlushAll(R_SYNCALL); } command void At45db.flushAll() { syncOrFlushAll(R_FLUSHALL); } } tinyos-2.1.2+dfsg/tos/platforms/mulle/fix/LogStorageP.nc000066400000000000000000000727661207233610700232330ustar00rootroot00000000000000/* * Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include #include /** * Private component of the AT45DB implementation of the log storage * abstraction. * * @author: David Gay * @author: Jonathan Hui */ module LogStorageP @safe() { provides { interface LogRead[uint8_t logId]; interface LogWrite[uint8_t logId]; } uses { interface At45db; interface At45dbVolume[uint8_t logId]; interface Resource[uint8_t logId]; } } implementation { /* Some design notes. - The logId's in the LogRead and LogWrites are shifted left by 1 bit. The low-order bit is 1 for circular logs, 0 for linear ones (see newRequest and endRequest, and the LogStorageC configuration) - Data is written sequentially to the pages of a log volume. Each page ends with a footer (nx_struct pageinfo) recording metadata on the current page: o a cookie o the "position" of the current page in the log (see below) o the offset of the last record on this page (i.e., the offset at which the last append ended) - only valid if flags & F_LASTVALID o flags: x F_SYNC page was synchronised - data after lastRecordOffset is not log data; implies F_LASTVALID x F_CIRCLED this page is not from the first run through the log's pages (never set in linear logs) x F_LASTVALID not set if no record ended on this page o a CRC - "Positions" are stored in the metadata, used as cookies by currentOffset and seek, and stored in the wpos and rpos fields of the volume state structure. They represent the number of bytes that writing has advanced in the log since the log was erased, with PAGE_SIZE added. Note that this is basically the number of bytes written, except that when a page is synchronised unused bytes in the page count towards increasing the position. As a result, on page p, the following equation holds: (metadata(p).pos - PAGE_SIZE) % volume-size == p * PAGE_SIZE (this also means that the "position" metadata field could be replaced by a count of the number of times writing has cycled through the log, reducing the metadata size) The PAGE_SIZE offset on positions is caused by Invariant 2 below: to ensure that Invariant 2 is respected, at flash erase time, we write a valid page with position 0 to the last block of the flash. As a result, the first writes to the flash, in page 0, are at "position" PAGE_SIZE. - This code is designed to deal with "one-at-a-time" failures (i.e., the system will not modify any blocks after a previous failed write). This should allow recovery from: o arbitrary reboots o write failure (the underlying PageEEPROM shuts down after any write fails; all pages are flushed before moving on to the next page) It will not recover from arbitrary data corruption - When sync is called, the current write page is written to flash with an F_SYNC flag and writing continues on the next page (wasting on average half a flasg page) - We maintain the following invariants on log volumes, even in the face of the "one-at-a-time" failures described above: 1) at least one of the first and last blocks are valid 2) the last block, if valid, has the F_SYNC flag - Locating the log boundary page (the page with the greatest position): Invariant 1, the one-at-a-time failure model and the metadata position definition guarantees that the physical flash pages have the following properties: an initial set of V1 valid pages, followed by a set of I invalid pages, followed by a set of V2 valid pages with V1+i+V2=total-number-of-pages, and V1, V2, I >= 0 Additionally, the position of all pages in V1 is greater than in V2, and consecutive pages in V1 (respectively V2) have greater positions than their predecessors. From this, it's possible to locate the log boundary page (the page with the greatest position) using the following algorithm: o let basepos=metadata(lastpage).pos, or 0 if the last page is invalid o locate (using a binary search) the page p with the largest position greater than basepos invalid pages can be assumed to have positions less than basepos if there is no such page p, let p = lastpage Once the log boundary page is known, we resume writing at the last page before p with a record boundary (Invariant 2, combined with limiting individual records to volumesize - PAGE_SIZE ensures there will be such a page). - The read pointer has a special "invalid" state which represents the current beginning of the log. In that state, LogRead.currentOffset() returns SEEK_BEGINNING rather than a regular position. The read pointer is invalidated: o at boot time o after the volume is erased o after the write position "catches up" with the read position o after a failed seek Reads from an invalid pointer: o start reading from the beginning of the flash if we are on the first run through the log volume o start reading at the first valid page after the write page with an F_LASTVALID flag; the read offset is set to the lastRecordOffset value if this page has the SYNC flag, we start at the beginning of the next page */ enum { F_SYNC = 1, F_CIRCLED = 2, F_LASTVALID = 4 }; nx_struct pageinfo { nx_uint16_t magic; nx_uint32_t pos; nx_uint16_t lastRecordOffset; nx_uint8_t flags; nx_uint16_t crc; }; enum { N = uniqueCount(UQ_LOG_STORAGE), NO_CLIENT = 0xff, PAGE_SIZE = AT45_PAGE_SIZE - sizeof(nx_struct pageinfo), PERSISTENT_MAGIC = 0x4256, }; enum { R_IDLE, R_ERASE, R_APPEND, R_SYNC, R_READ, R_SEEK }; enum { META_IDLE, META_LOCATEFIRST, META_LOCATE, META_LOCATELAST, META_SEEK, META_READ, META_WRITE }; uint8_t client = NO_CLIENT; uint8_t metaState; bool recordsLost; at45page_t firstPage, lastPage; storage_len_t pos; nx_struct pageinfo metadata; struct { /* The latest request made for this client, and it's arguments */ uint8_t request; uint8_t *COUNT_NOK(len) buf; storage_len_t len; /* Log r/w positions */ bool positionKnown : 1; bool circular : 1; bool circled : 1; bool rvalid : 1; uint32_t wpos; /* Bytes since start of logging */ at45page_t wpage; /* Current write page */ at45pageoffset_t woffset; /* Offset on current write page */ uint32_t rpos; /* Bytes since start of logging */ at45page_t rpage; /* Current read page */ at45pageoffset_t roffset; /* Offset on current read page */ at45pageoffset_t rend; /* Last valid offset on current read page */ } s[N]; at45page_t firstVolumePage() { return call At45dbVolume.remap[client](0); } at45page_t npages() { return call At45dbVolume.volumeSize[client](); } at45page_t lastVolumePage() { return call At45dbVolume.remap[client](npages()); } void setWritePage(at45page_t page) { if (s[client].circular && page == lastVolumePage()) { s[client].circled = TRUE; page = firstVolumePage(); } s[client].wpage = page; s[client].woffset = 0; } void invalidateReadPointer() { s[client].rvalid = FALSE; } void crcPage(at45page_t page) { call At45db.computeCrc(page, 0, PAGE_SIZE + offsetof(nx_struct pageinfo, crc), 0); } void readMetadata(at45page_t page) { call At45db.read(page, PAGE_SIZE, &metadata, sizeof metadata); } void writeMetadata(at45page_t page) { call At45db.write(page, PAGE_SIZE, &metadata, sizeof metadata); } void wmetadataStart(); void sync() { metadata.flags = F_SYNC | F_LASTVALID; metadata.lastRecordOffset = s[client].woffset; /* rend is now no longer the end of the page */ if (s[client].rpage == s[client].wpage) s[client].rend = s[client].woffset; wmetadataStart(); } /* ------------------------------------------------------------------ */ /* Queue and initiate user requests */ /* ------------------------------------------------------------------ */ void eraseStart(); void appendStart(); void syncStart(); void readStart(); void locateStart(); void rmetadataStart(); void seekStart(); void startRequest() { if (!s[client].positionKnown && s[client].request != R_ERASE) { locateStart(); return; } metaState = META_IDLE; switch (s[client].request) { case R_ERASE: eraseStart(); break; case R_APPEND: appendStart(); break; case R_SYNC: syncStart(); break; case R_READ: readStart(); break; case R_SEEK: seekStart(); break; } } void endRequest(error_t ok) { uint8_t c = client; uint8_t request = s[c].request; storage_len_t actualLen = pos; void *ptr = s[c].buf; client = NO_CLIENT; s[c].request = R_IDLE; call Resource.release[c](); c = c << 1 | s[c].circular; switch (request) { case R_ERASE: signal LogWrite.eraseDone[c](ok); break; case R_APPEND: signal LogWrite.appendDone[c](ptr, actualLen, recordsLost, ok); break; case R_SYNC: signal LogWrite.syncDone[c](ok); break; case R_READ: signal LogRead.readDone[c](ptr, actualLen, ok); break; case R_SEEK: signal LogRead.seekDone[c](ok); break; } } /* Enqueue request and request the underlying flash */ error_t newRequest(uint8_t newRequest, uint8_t id, uint8_t *COUNT_NOK(length) buf, storage_len_t length) { s[id >> 1].circular = id & 1; id >>= 1; if (s[id].request != R_IDLE) return EBUSY; s[id].request = newRequest; s[id].buf = NULL; s[id].len = length; s[id].buf = buf; call Resource.request[id](); return SUCCESS; } event void Resource.granted[uint8_t id]() { client = id; pos = 0; startRequest(); } command error_t LogWrite.append[uint8_t id](void* buf, storage_len_t length) { if (length > call LogRead.getSize[id]() - PAGE_SIZE) /* Writes greater than the volume size are invalid. Writes equal to the volume size could break the log volume invariant (see next comment). Writes that span the whole volume could lead to problems at boot time (no valid block with a record boundary). Refuse them all. */ return EINVAL; else return newRequest(R_APPEND, id, buf, length); } command storage_cookie_t LogWrite.currentOffset[uint8_t id]() { return s[id >> 1].wpos; } command error_t LogWrite.erase[uint8_t id]() { return newRequest(R_ERASE, id, NULL, 0); } command error_t LogWrite.sync[uint8_t id]() { return newRequest(R_SYNC, id, NULL, 0); } command error_t LogRead.read[uint8_t id](void* buf, storage_len_t length) { return newRequest(R_READ, id, buf, length); } command storage_cookie_t LogRead.currentOffset[uint8_t id]() { id >>= 1; return s[id].rvalid ? s[id].rpos : SEEK_BEGINNING; } command error_t LogRead.seek[uint8_t id](storage_cookie_t offset) { return newRequest(R_SEEK, id, TCAST(void *COUNT(offset), ((uint16_t)(offset >> 16))), offset); } command storage_len_t LogRead.getSize[uint8_t id]() { return call At45dbVolume.volumeSize[id >> 1]() * (storage_len_t)PAGE_SIZE; } /* ------------------------------------------------------------------ */ /* Erase */ /* ------------------------------------------------------------------ */ void eraseMetadataDone() { /* Set write pointer to the beginning of the flash */ s[client].wpos = PAGE_SIZE; // last page has offset 0 and is before us s[client].circled = FALSE; setWritePage(firstVolumePage()); invalidateReadPointer(); s[client].positionKnown = TRUE; endRequest(SUCCESS); } void eraseEraseDone() { if (firstPage == lastPage - 1) { /* We create a valid, synced last page (see invariants) */ metadata.flags = F_SYNC | F_LASTVALID; metadata.lastRecordOffset = 0; setWritePage(firstPage); s[client].circled = FALSE; s[client].wpos = 0; wmetadataStart(); } else call At45db.erase(firstPage++, AT45_ERASE); } void eraseStart() { s[client].positionKnown = FALSE; // in case erase fails firstPage = firstVolumePage(); lastPage = lastVolumePage(); eraseEraseDone(); } /* ------------------------------------------------------------------ */ /* Locate log boundaries */ /* ------------------------------------------------------------------ */ void locateLastRecord(); void locateLastCrcDone(uint16_t crc) { if (crc != metadata.crc) { locateLastRecord(); return; } /* We've found the last valid page with a record-end. Set up the read and write positions. */ invalidateReadPointer(); if (metadata.flags & F_SYNC) /* must start on next page */ { /* We need to special case the empty log, as we don't want to wrap around in the case of a full, non-circular log with a sync on its last page. */ if (firstPage == lastPage && !metadata.pos) setWritePage(firstVolumePage()); else setWritePage(firstPage + 1); s[client].wpos = metadata.pos + PAGE_SIZE; } else { s[client].wpage = firstPage; s[client].woffset = metadata.lastRecordOffset; s[client].wpos = metadata.pos + metadata.lastRecordOffset; } s[client].circled = (metadata.flags & F_CIRCLED) != 0; if (s[client].circled && !s[client].circular) // oops { endRequest(FAIL); return; } /* And we can now proceed to the real request */ s[client].positionKnown = TRUE; startRequest(); } void locateLastReadDone() { if (metadata.magic == PERSISTENT_MAGIC && metadata.flags & F_LASTVALID) crcPage(firstPage); else locateLastRecord(); } void locateLastRecord() { if (firstPage == lastPage) { /* We walked all the way back to the last page, and it's not valid. The log-volume invariant is not holding. Fail out. */ endRequest(FAIL); return; } if (firstPage == firstVolumePage()) firstPage = lastPage; else firstPage--; readMetadata(firstPage); } void located() { metaState = META_LOCATELAST; /* firstPage is one after last valid page, but the last page with a record end may be some pages earlier. Search for it. */ lastPage = lastVolumePage() - 1; locateLastRecord(); } at45page_t locateCurrentPage() { return firstPage + ((lastPage - firstPage) >> 1); } void locateBinarySearch() { if (lastPage <= firstPage) located(); else readMetadata(locateCurrentPage()); } void locateGreaterThan() { firstPage = locateCurrentPage() + 1; locateBinarySearch(); } void locateLessThan() { lastPage = locateCurrentPage(); locateBinarySearch(); } void locateCrcDone(uint16_t crc) { if (crc == metadata.crc) { s[client].wpos = metadata.pos; locateGreaterThan(); } else locateLessThan(); } void locateReadDone() { if (metadata.magic == PERSISTENT_MAGIC && s[client].wpos < metadata.pos) crcPage(locateCurrentPage()); else locateLessThan(); } void locateFirstCrcDone(uint16_t crc) { if (metadata.magic == PERSISTENT_MAGIC && crc == metadata.crc) s[client].wpos = metadata.pos; else s[client].wpos = 0; metaState = META_LOCATE; locateBinarySearch(); } void locateFirstReadDone() { crcPage(lastPage); } /* Locate log beginning and ending. See description at top of file. */ void locateStart() { metaState = META_LOCATEFIRST; firstPage = firstVolumePage(); lastPage = lastVolumePage() - 1; readMetadata(lastPage); } /* ------------------------------------------------------------------ */ /* Append */ /* ------------------------------------------------------------------ */ void appendContinue() { uint8_t *buf = s[client].buf + pos; at45pageoffset_t offset = s[client].woffset, count; storage_len_t len = s[client].len - pos; if (len == 0) { endRequest(SUCCESS); return; } if (s[client].wpage == lastVolumePage()) { /* We reached the end of a linear log */ endRequest(ESIZE); return; } if (offset + len <= PAGE_SIZE) count = len; else count = PAGE_SIZE - offset; s[client].wpos += count; s[client].woffset += count; pos += count; /* We normally lose data at the point we make the first write to a page in a log that has circled. */ if (offset == 0 && s[client].circled) recordsLost = TRUE; call At45db.write(s[client].wpage, offset, buf, count); } void appendWriteDone() { if (s[client].woffset == PAGE_SIZE) /* Time to write metadata */ wmetadataStart(); else endRequest(SUCCESS); } void appendMetadataDone() { // metadata of previous page flushed /* Setup metadata in case we overflow this page too */ metadata.flags = 0; appendContinue(); } void appendSyncDone() { s[client].wpos = metadata.pos + PAGE_SIZE; appendStart(); } void appendStart() { storage_len_t len = s[client].len - pos; storage_len_t vlen = (storage_len_t)npages() * PAGE_SIZE; recordsLost = FALSE; /* If request would span the end of the flash, sync, to maintain the invariant that the last flash page is synced and that either the first or last pages are valid. Note that >= in the if below means we won't write a record that would end on the last byte of the last page, as this would mean that we would not sync the last page, breaking the log volume invariant */ if ((s[client].wpos - PAGE_SIZE) % vlen >= vlen - len) sync(); else { /* Set lastRecordOffset in case we need to write metadata (see wmetadataStart) */ metadata.lastRecordOffset = s[client].woffset; metadata.flags = F_LASTVALID; appendContinue(); } } /* ------------------------------------------------------------------ */ /* Sync */ /* ------------------------------------------------------------------ */ void syncStart() { if (s[client].woffset == 0) /* we can't lose any writes */ endRequest(SUCCESS); else sync(); } void syncMetadataDone() { /* Write position reflect the absolute position in the flash, not user-bytes written. So update wpos to reflect sync effects. */ s[client].wpos = metadata.pos + PAGE_SIZE; endRequest(SUCCESS); } /* ------------------------------------------------------------------ */ /* Write block metadata */ /* ------------------------------------------------------------------ */ void wmetadataStart() { /* The caller ensures that metadata.flags (except F_CIRCLED) and metadata.lastRecordOffset are set correctly. */ metaState = META_WRITE; firstPage = s[client].wpage; // remember page to commit metadata.pos = s[client].wpos - s[client].woffset; metadata.magic = PERSISTENT_MAGIC; if (s[client].circled) metadata.flags |= F_CIRCLED; call At45db.computeCrc(firstPage, 0, PAGE_SIZE, 0); /* We move to the next page now. If writing the metadata fails, we'll simply leave the invalid page in place. Trying to recover seems complicated, and of little benefit (note that in practice, At45dbC shuts down after a failed write, so nothing is really going to happen after that anyway). */ setWritePage(s[client].wpage + 1); /* Invalidate read pointer if we reach it's page */ if (s[client].wpage == s[client].rpage) invalidateReadPointer(); } void wmetadataCrcDone(uint16_t crc) { uint8_t i, *md; // Include metadata in crc md = (uint8_t *)&metadata; for (i = 0; i < offsetof(nx_struct pageinfo, crc); i++) crc = crcByte(crc, md[i]); metadata.crc = crc; // And save it writeMetadata(firstPage); } void wmetadataWriteDone() { metaState = META_IDLE; if (metadata.flags & F_SYNC) call At45db.sync(firstPage); else call At45db.flush(firstPage); } /* ------------------------------------------------------------------ */ /* Read */ /* ------------------------------------------------------------------ */ void readContinue() { uint8_t *buf = s[client].buf + pos; at45pageoffset_t offset = s[client].roffset, count; at45pageoffset_t end = s[client].rend; storage_len_t len = s[client].len - pos; if (len == 0) { endRequest(SUCCESS); return; } if (!s[client].rvalid) { if (s[client].circled) /* Find a valid page after wpage, skipping invalid pages */ s[client].rpage = s[client].wpage; else { /* resume reading at the beginning of the first page */ s[client].rvalid = TRUE; s[client].rpage = lastVolumePage() - 1; } rmetadataStart(); return; } if (s[client].rpage == s[client].wpage) end = s[client].woffset; if (offset == end) { if ((s[client].rpage + 1 == lastVolumePage() && !s[client].circular) || s[client].rpage == s[client].wpage) endRequest(SUCCESS); // end of log else rmetadataStart(); return; } if (offset + len <= end) count = len; else count = end - offset; pos += count; s[client].rpos += count; s[client].roffset = offset + count; call At45db.read(s[client].rpage, offset, buf, count); } void readStart() { readContinue(); } /* ------------------------------------------------------------------ */ /* Read block metadata */ /* ------------------------------------------------------------------ */ void continueReadAt(at45pageoffset_t roffset) { /* Resume reading at firstPage whose metadata is currently available in the metadata variable */ metaState = META_IDLE; s[client].rpos = metadata.pos + roffset; s[client].rpage = firstPage; s[client].roffset = roffset; s[client].rend = metadata.flags & F_SYNC ? metadata.lastRecordOffset : PAGE_SIZE; s[client].rvalid = TRUE; readContinue(); } void rmetadataContinue() { if (++firstPage == lastVolumePage()) firstPage = firstVolumePage(); if (firstPage == s[client].wpage) if (!s[client].rvalid) /* We cannot find a record boundary to start at (we've just walked through the whole log...). Give up. */ endRequest(SUCCESS); else { /* The current write page has no metadata yet, so we fake it */ metadata.flags = 0; metadata.pos = s[client].wpos - s[client].woffset; continueReadAt(0); } else readMetadata(firstPage); } void rmetadataReadDone() { if (metadata.magic == PERSISTENT_MAGIC) crcPage(firstPage); else endRequest(SUCCESS); } void rmetadataCrcDone(uint16_t crc) { if (!s[client].rvalid) if (crc == metadata.crc && metadata.flags & F_LASTVALID) continueReadAt(metadata.lastRecordOffset); else rmetadataContinue(); else if (crc == metadata.crc) continueReadAt(0); else endRequest(SUCCESS); } void rmetadataStart() { metaState = META_READ; firstPage = s[client].rpage; rmetadataContinue(); } /* ------------------------------------------------------------------ */ /* Seek. */ /* ------------------------------------------------------------------ */ void seekCrcDone(uint16_t crc) { if (metadata.magic == PERSISTENT_MAGIC && crc == metadata.crc && metadata.pos == s[client].rpos - s[client].roffset) { s[client].rvalid = TRUE; if (metadata.flags & F_SYNC) s[client].rend = metadata.lastRecordOffset; } endRequest(SUCCESS); } void seekReadDone() { crcPage(s[client].rpage); } /* Move to position specified by cookie. */ void seekStart() { uint32_t offset = (uint32_t)(uint16_t)s[client].buf << 16 | s[client].len; invalidateReadPointer(); // default to beginning of log /* The write positions are offset by PAGE_SIZE (see emptyLog) */ if (offset == SEEK_BEGINNING) offset = PAGE_SIZE; if (offset > s[client].wpos || offset < PAGE_SIZE) { endRequest(EINVAL); return; } /* Cookies are just flash positions which continue incrementing as you circle around and around. So we can just check the requested page's metadata.pos field matches the cookie's value */ s[client].rpos = offset; s[client].roffset = (offset - PAGE_SIZE) % PAGE_SIZE; s[client].rpage = firstVolumePage() + ((offset - PAGE_SIZE) / PAGE_SIZE) % npages(); s[client].rend = PAGE_SIZE; // default to no sync flag // The last page's metadata isn't written to flash yet. Special case it. if (s[client].rpage == s[client].wpage) { /* If we're seeking within the current write page, just go there. Otherwise, we're asking for an old version of the current page so just keep the invalidated read pointer, i.e., read from the beginning. */ if (offset >= s[client].wpos - s[client].woffset) s[client].rvalid = TRUE; endRequest(SUCCESS); } else { metaState = META_SEEK; readMetadata(s[client].rpage); } } /* ------------------------------------------------------------------ */ /* Dispatch HAL operations to current user op */ /* ------------------------------------------------------------------ */ event void At45db.eraseDone(error_t error) { if (client != NO_CLIENT) if (error != SUCCESS) endRequest(FAIL); else eraseEraseDone(); } event void At45db.writeDone(error_t error) { if (client != NO_CLIENT) if (error != SUCCESS) endRequest(FAIL); else switch (metaState) { case META_WRITE: wmetadataWriteDone(); break; case META_IDLE: appendWriteDone(); break; } } event void At45db.syncDone(error_t error) { if (client != NO_CLIENT) if (error != SUCCESS) endRequest(FAIL); else switch (s[client].request) { case R_ERASE: eraseMetadataDone(); break; case R_APPEND: appendSyncDone(); break; case R_SYNC: syncMetadataDone(); break; } } event void At45db.flushDone(error_t error) { if (client != NO_CLIENT) if (error != SUCCESS) endRequest(FAIL); else appendMetadataDone(); } event void At45db.readDone(error_t error) { if (client != NO_CLIENT) if (error != SUCCESS) endRequest(FAIL); else switch (metaState) { case META_LOCATEFIRST: locateFirstReadDone(); break; case META_LOCATE: locateReadDone(); break; case META_LOCATELAST: locateLastReadDone(); break; case META_SEEK: seekReadDone(); break; case META_READ: rmetadataReadDone(); break; case META_IDLE: readContinue(); break; } } event void At45db.computeCrcDone(error_t error, uint16_t crc) { if (client != NO_CLIENT) if (error != SUCCESS) endRequest(FAIL); else switch (metaState) { case META_LOCATEFIRST: locateFirstCrcDone(crc); break; case META_LOCATE: locateCrcDone(crc); break; case META_LOCATELAST: locateLastCrcDone(crc); break; case META_SEEK: seekCrcDone(crc); break; case META_WRITE: wmetadataCrcDone(crc); break; case META_READ: rmetadataCrcDone(crc); break; } } event void At45db.copyPageDone(error_t error) { } default event void LogWrite.appendDone[uint8_t logId](void* buf, storage_len_t l, bool rLost, error_t error) { } default event void LogWrite.eraseDone[uint8_t logId](error_t error) { } default event void LogWrite.syncDone[uint8_t logId](error_t error) { } default event void LogRead.readDone[uint8_t logId](void* buf, storage_len_t l, error_t error) { } default event void LogRead.seekDone[uint8_t logId](error_t error) {} default command at45page_t At45dbVolume.remap[uint8_t logId](at45page_t volumePage) {return 0;} default command at45page_t At45dbVolume.volumeSize[uint8_t logId]() {return 0;} default async command error_t Resource.request[uint8_t logId]() {return SUCCESS;} default async command error_t Resource.release[uint8_t logId]() { return FAIL; } } tinyos-2.1.2+dfsg/tos/platforms/mulle/fix/README000066400000000000000000000042021207233610700213570ustar00rootroot00000000000000This folder contains fixes in system files and chips that are currently not committed to the source tree, are Mulle specific or doesn't have any good or general solution. Any file put in this folder should be commented in this file; the reason the file is here should be stated and a plan how to fix (be able to remove it from here) the problem should be outlined. The files here need to be overlooked regularly to include changes made in the original file. The intention is to never have any files in this folder and if a file is put in this folder there should be a very good reason for it! ------FILES------: tos/chips/at45db/At45dbP.nc: After a erase is done the buffer should be invalidated in some way. In the fix the buffer page member is set to AT45_MAX_PAGES, because the indexes of the pages are 0-(AT45_MAX_PAGES-1) thus AT45_MAX_PAGES indicates an invalid page number. Have spoken to David Gay about this. No fix seems to be committed, commit it our selfs? tos/chips/at45db/LogStorageP.nc: in struct pageinfo there is a member lastRecordOffset which is a uint8_t in the original file. Mulle and platforms using At45DB chips with 10 bit offset addresses need a larger storage unit than uint8_t and is thus changed to uint16_t. This should maybe be typedefed in every platform specific implementation of the at45db. We cant just change it to uint16_t because that would break backwards compatibility for old platforms. Have spoken with David Gay about this to, but nothing has happened. tos/chips/rf230/RF230DriverHwAckP.nc/RF230DriverLayerP.nc: Because of the use of a software spi bus on Mulle the communication between the RF230 chip and Mulle is to slow to be able to start sending a packet before the whole packet has been uploaded. We are instead uploading the packet first to the RF230 and then triggering the actual send. This may screw up protocols that need very good timing. But not using this may result in packet shifting, meaning that only half the packet is sent first and the second half is sent with the next packet. The next Mulle version will have a hardware spi connection between the radio and Mulle. Hopefully this will solve the problem. tinyos-2.1.2+dfsg/tos/platforms/mulle/fix/RF230DriverHwAckP.nc000066400000000000000000000615351207233610700240030ustar00rootroot00000000000000/* * Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include #include #include #include module RF230DriverHwAckP { provides { interface Init as PlatformInit @exactlyonce(); interface Init as SoftwareInit @exactlyonce(); interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; interface PacketAcknowledgements; } uses { interface GeneralIO as SELN; interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as SLP_TR; interface GeneralIO as RSTN; interface GpioCapture as IRQ; interface BusyWait; interface LocalTime; interface RF230DriverConfig as Config; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; interface PacketTimeStamp; interface Tasklet; interface RadioAlarm; interface PacketFlag as AckReceivedFlag; interface Ieee154PacketLayer; interface ActiveMessageAddress; #ifdef RADIO_DEBUG interface DiagMsg; #endif } } implementation { rf230_header_t* getHeader(message_t* msg) { return ((void*)msg) + call Config.headerLength(msg); } void* getPayload(message_t* msg) { return ((void*)msg) + call RadioPacket.headerLength(msg); } rf230_metadata_t* getMeta(message_t* msg) { return ((void*)msg) + sizeof(message_t) - call RadioPacket.metadataLength(msg); } /*----------------- STATE -----------------*/ tasklet_norace uint8_t state; enum { STATE_P_ON = 0, STATE_SLEEP = 1, STATE_SLEEP_2_TRX_OFF = 2, STATE_TRX_OFF = 3, STATE_TRX_OFF_2_RX_ON = 4, STATE_RX_ON = 5, STATE_BUSY_TX_2_RX_ON = 6, }; tasklet_norace uint8_t cmd; enum { CMD_NONE = 0, // the state machine has stopped CMD_TURNOFF = 1, // goto SLEEP state CMD_STANDBY = 2, // goto TRX_OFF state CMD_TURNON = 3, // goto RX_ON state CMD_TRANSMIT = 4, // currently transmitting a message CMD_CCA = 6, // performing clear chanel assesment CMD_CHANNEL = 7, // changing the channel CMD_SIGNAL_DONE = 8, // signal the end of the state transition CMD_DOWNLOAD = 9, // download the received message }; norace bool radioIrq; tasklet_norace uint8_t txPower; tasklet_norace uint8_t channel; tasklet_norace message_t* rxMsg; message_t rxMsgBuffer; uint16_t capturedTime; // the current time when the last interrupt has occured /*----------------- REGISTER -----------------*/ inline void writeRegister(uint8_t reg, uint8_t value) { RADIO_ASSERT( call SpiResource.isOwner() ); RADIO_ASSERT( reg == (reg & RF230_CMD_REGISTER_MASK) ); call SELN.clr(); call FastSpiByte.splitWrite(RF230_CMD_REGISTER_WRITE | reg); call FastSpiByte.splitReadWrite(value); call FastSpiByte.splitRead(); call SELN.set(); } inline uint8_t readRegister(uint8_t reg) { RADIO_ASSERT( call SpiResource.isOwner() ); RADIO_ASSERT( reg == (reg & RF230_CMD_REGISTER_MASK) ); call SELN.clr(); call FastSpiByte.splitWrite(RF230_CMD_REGISTER_READ | reg); call FastSpiByte.splitReadWrite(0); reg = call FastSpiByte.splitRead(); call SELN.set(); return reg; } /*----------------- ALARM -----------------*/ enum { SLEEP_WAKEUP_TIME = (uint16_t)(880 * RADIO_ALARM_MICROSEC), PLL_CALIBRATION_TIME = (uint16_t)(180 * RADIO_ALARM_MICROSEC), CCA_REQUEST_TIME = (uint16_t)(140 * RADIO_ALARM_MICROSEC), // 8 undocumented delay, 128 for CSMA, 16 for delay, 5*32 for preamble and SFD TX_SFD_DELAY = (uint16_t)((8 + 128 + 16 + 5*32) * RADIO_ALARM_MICROSEC), // 32 for frame length, 16 for delay RX_SFD_DELAY = (uint16_t)((32 + 16) * RADIO_ALARM_MICROSEC), }; tasklet_async event void RadioAlarm.fired() { if( state == STATE_SLEEP_2_TRX_OFF ) state = STATE_TRX_OFF; else if( state == STATE_TRX_OFF_2_RX_ON ) { RADIO_ASSERT( cmd == CMD_TURNON || cmd == CMD_CHANNEL ); state = STATE_RX_ON; cmd = CMD_SIGNAL_DONE; } else if( cmd == CMD_CCA ) { uint8_t cca; RADIO_ASSERT( state == STATE_RX_ON ); cmd = CMD_NONE; cca = readRegister(RF230_TRX_STATUS); RADIO_ASSERT( (cca & RF230_TRX_STATUS_MASK) == RF230_RX_AACK_ON ); signal RadioCCA.done( (cca & RF230_CCA_DONE) ? ((cca & RF230_CCA_STATUS) ? SUCCESS : EBUSY) : FAIL ); } else RADIO_ASSERT(FALSE); // make sure the rest of the command processing is called call Tasklet.schedule(); } /*----------------- INIT -----------------*/ command error_t PlatformInit.init() { call SELN.makeOutput(); call SELN.set(); call SLP_TR.makeOutput(); call SLP_TR.clr(); call RSTN.makeOutput(); call RSTN.set(); rxMsg = &rxMsgBuffer; return SUCCESS; } command error_t SoftwareInit.init() { // for powering up the radio return call SpiResource.request(); } void initRadio() { uint16_t temp; call BusyWait.wait(510); call RSTN.clr(); call SLP_TR.clr(); call BusyWait.wait(6); call RSTN.set(); writeRegister(RF230_TRX_CTRL_0, RF230_TRX_CTRL_0_VALUE); writeRegister(RF230_TRX_STATE, RF230_TRX_OFF); call BusyWait.wait(510); writeRegister(RF230_IRQ_MASK, RF230_IRQ_TRX_UR | RF230_IRQ_TRX_END ); writeRegister(RF230_CCA_THRES, RF230_CCA_THRES_VALUE); writeRegister(RF230_PHY_TX_PWR, RF230_TX_AUTO_CRC_ON | (RF230_DEF_RFPOWER & RF230_TX_PWR_MASK)); txPower = RF230_DEF_RFPOWER & RF230_TX_PWR_MASK; channel = RF230_DEF_CHANNEL & RF230_CHANNEL_MASK; writeRegister(RF230_PHY_CC_CCA, RF230_CCA_MODE_VALUE | channel); writeRegister(RF230_XAH_CTRL, 0); writeRegister(RF230_CSMA_SEED_1, 0); temp = call ActiveMessageAddress.amGroup(); writeRegister(RF230_PAN_ID_0, temp); writeRegister(RF230_PAN_ID_1, temp >> 8); call SLP_TR.set(); state = STATE_SLEEP; } /*----------------- SPI -----------------*/ event void SpiResource.granted() { call SELN.makeOutput(); call SELN.set(); if( state == STATE_P_ON ) { initRadio(); call SpiResource.release(); } else call Tasklet.schedule(); } bool isSpiAcquired() { if( call SpiResource.isOwner() ) return TRUE; if( call SpiResource.immediateRequest() == SUCCESS ) { call SELN.makeOutput(); call SELN.set(); return TRUE; } call SpiResource.request(); return FALSE; } /*----------------- CHANNEL -----------------*/ tasklet_async command uint8_t RadioState.getChannel() { return channel; } tasklet_async command error_t RadioState.setChannel(uint8_t c) { c &= RF230_CHANNEL_MASK; if( cmd != CMD_NONE ) return EBUSY; else if( channel == c ) return EALREADY; channel = c; cmd = CMD_CHANNEL; call Tasklet.schedule(); return SUCCESS; } inline void changeChannel() { RADIO_ASSERT( cmd == CMD_CHANNEL ); RADIO_ASSERT( state == STATE_SLEEP || state == STATE_TRX_OFF || state == STATE_RX_ON ); if( isSpiAcquired() && call RadioAlarm.isFree() ) { writeRegister(RF230_PHY_CC_CCA, RF230_CCA_MODE_VALUE | channel); if( state == STATE_RX_ON ) { call RadioAlarm.wait(PLL_CALIBRATION_TIME); state = STATE_TRX_OFF_2_RX_ON; } else cmd = CMD_SIGNAL_DONE; } } /*----------------- TURN ON/OFF -----------------*/ inline void changeState() { if( (cmd == CMD_STANDBY || cmd == CMD_TURNON) && state == STATE_SLEEP && call RadioAlarm.isFree() ) { call SLP_TR.clr(); call RadioAlarm.wait(SLEEP_WAKEUP_TIME); state = STATE_SLEEP_2_TRX_OFF; } else if( cmd == CMD_TURNON && state == STATE_TRX_OFF && isSpiAcquired() && call RadioAlarm.isFree() ) { uint16_t temp; RADIO_ASSERT( ! radioIrq ); readRegister(RF230_IRQ_STATUS); // clear the interrupt register call IRQ.captureRisingEdge(); // setChannel was ignored in SLEEP because the SPI was not working, so do it here writeRegister(RF230_PHY_CC_CCA, RF230_CCA_MODE_VALUE | channel); temp = call ActiveMessageAddress.amAddress(); writeRegister(RF230_SHORT_ADDR_0, temp); writeRegister(RF230_SHORT_ADDR_1, temp >> 8); call RadioAlarm.wait(PLL_CALIBRATION_TIME); writeRegister(RF230_TRX_STATE, RF230_RX_AACK_ON); state = STATE_TRX_OFF_2_RX_ON; } else if( (cmd == CMD_TURNOFF || cmd == CMD_STANDBY) && state == STATE_RX_ON && isSpiAcquired() ) { writeRegister(RF230_TRX_STATE, RF230_FORCE_TRX_OFF); call IRQ.disable(); radioIrq = FALSE; state = STATE_TRX_OFF; } if( cmd == CMD_TURNOFF && state == STATE_TRX_OFF ) { call SLP_TR.set(); state = STATE_SLEEP; cmd = CMD_SIGNAL_DONE; } else if( cmd == CMD_STANDBY && state == STATE_TRX_OFF ) cmd = CMD_SIGNAL_DONE; } tasklet_async command error_t RadioState.turnOff() { if( cmd != CMD_NONE ) return EBUSY; else if( state == STATE_SLEEP ) return EALREADY; cmd = CMD_TURNOFF; call Tasklet.schedule(); return SUCCESS; } tasklet_async command error_t RadioState.standby() { if( cmd != CMD_NONE || (state == STATE_SLEEP && ! call RadioAlarm.isFree()) ) return EBUSY; else if( state == STATE_TRX_OFF ) return EALREADY; cmd = CMD_STANDBY; call Tasklet.schedule(); return SUCCESS; } tasklet_async command error_t RadioState.turnOn() { if( cmd != CMD_NONE || (state == STATE_SLEEP && ! call RadioAlarm.isFree()) ) return EBUSY; else if( state == STATE_RX_ON ) return EALREADY; cmd = CMD_TURNON; call Tasklet.schedule(); return SUCCESS; } default tasklet_async event void RadioState.done() { } task void changeAddress() { call Tasklet.suspend(); if( isSpiAcquired() ) { uint16_t temp = call ActiveMessageAddress.amAddress(); writeRegister(RF230_SHORT_ADDR_0, temp); writeRegister(RF230_SHORT_ADDR_1, temp >> 8); } else post changeAddress(); call Tasklet.resume(); } async event void ActiveMessageAddress.changed() { post changeAddress(); } /*----------------- TRANSMIT -----------------*/ tasklet_norace message_t* txMsg; tasklet_async command error_t RadioSend.send(message_t* msg) { uint16_t time; uint8_t length; uint8_t* data; uint8_t header; uint32_t time32; void* timesync; if( cmd != CMD_NONE || state != STATE_RX_ON || ! isSpiAcquired() || radioIrq ) return EBUSY; length = (call PacketTransmitPower.isSet(msg) ? call PacketTransmitPower.get(msg) : RF230_DEF_RFPOWER) & RF230_TX_PWR_MASK; if( length != txPower ) { txPower = length; writeRegister(RF230_PHY_TX_PWR, RF230_TX_AUTO_CRC_ON | txPower); } writeRegister(RF230_TRX_STATE, RF230_TX_ARET_ON); // do something useful, just to wait a little time32 = call LocalTime.get(); timesync = call PacketTimeSyncOffset.isSet(msg) ? ((void*)msg) + call PacketTimeSyncOffset.get(msg) : 0; // we have missed an incoming message in this short amount of time if( (readRegister(RF230_TRX_STATUS) & RF230_TRX_STATUS_MASK) != RF230_TX_ARET_ON ) { RADIO_ASSERT( (readRegister(RF230_TRX_STATUS) & RF230_TRX_STATUS_MASK) == RF230_BUSY_RX_AACK ); writeRegister(RF230_TRX_STATE, RF230_RX_AACK_ON); return EBUSY; } #ifndef RF230_SLOW_SPI_MULLE #ifndef RF230_SLOW_SPI atomic { call SLP_TR.set(); time = call RadioAlarm.getNow(); } call SLP_TR.clr(); #endif #endif RADIO_ASSERT( ! radioIrq ); call SELN.clr(); call FastSpiByte.splitWrite(RF230_CMD_FRAME_WRITE); data = getPayload(msg); length = getHeader(msg)->length; // length | data[0] ... data[length-3] | automatically generated FCS call FastSpiByte.splitReadWrite(length); // the FCS is atomatically generated (2 bytes) length -= 2; header = call Config.headerPreloadLength(); if( header > length ) header = length; length -= header; // first upload the header to gain some time do { call FastSpiByte.splitReadWrite(*(data++)); } while( --header != 0 ); #ifndef RF230_SLOW_SPI_MULLE #ifdef RF230_SLOW_SPI atomic { call SLP_TR.set(); time = call RadioAlarm.getNow(); } call SLP_TR.clr(); #endif #else atomic { time = call RadioAlarm.getNow(); } #endif time32 += (int16_t)(time + TX_SFD_DELAY) - (int16_t)(time32); if( timesync != 0 ) *(timesync_relative_t*)timesync = (*(timesync_absolute_t*)timesync) - time32; while( length-- != 0 ) call FastSpiByte.splitReadWrite(*(data++)); // wait for the SPI transfer to finish call FastSpiByte.splitRead(); #ifdef RF230_SLOW_SPI_MULLE atomic { call SLP_TR.set(); } call SLP_TR.clr(); #endif call SELN.set(); /* * There is a very small window (~1 microsecond) when the RF230 went * into PLL_ON state but was somehow not properly initialized because * of an incoming message and could not go into BUSY_TX. I think the * radio can even receive a message, and generate a TRX_UR interrupt * because of concurrent access, but that message probably cannot be * recovered. * * TODO: this needs to be verified, and make sure that the chip is * not locked up in this case. */ // go back to RX_ON state when finished writeRegister(RF230_TRX_STATE, RF230_RX_AACK_ON); if( timesync != 0 ) *(timesync_absolute_t*)timesync = (*(timesync_relative_t*)timesync) + time32; call PacketTimeStamp.set(msg, time32); #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ) { length = getHeader(msg)->length; call DiagMsg.chr('t'); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.int8(length); call DiagMsg.hex8s(getPayload(msg), length - 2); call DiagMsg.send(); } #endif // wait for the TRX_END interrupt txMsg = msg; state = STATE_BUSY_TX_2_RX_ON; cmd = CMD_TRANSMIT; return SUCCESS; } default tasklet_async event void RadioSend.sendDone(error_t error) { } default tasklet_async event void RadioSend.ready() { } /*----------------- CCA -----------------*/ tasklet_async command error_t RadioCCA.request() { if( cmd != CMD_NONE || state != STATE_RX_ON || ! isSpiAcquired() || ! call RadioAlarm.isFree() ) return EBUSY; // see Errata B7 of the datasheet // writeRegister(RF230_TRX_STATE, RF230_PLL_ON); // writeRegister(RF230_TRX_STATE, RF230_RX_AACK_ON); writeRegister(RF230_PHY_CC_CCA, RF230_CCA_REQUEST | RF230_CCA_MODE_VALUE | channel); call RadioAlarm.wait(CCA_REQUEST_TIME); cmd = CMD_CCA; return SUCCESS; } default tasklet_async event void RadioCCA.done(error_t error) { } /*----------------- RECEIVE -----------------*/ inline void downloadMessage() { uint8_t length; bool crcValid = FALSE; call SELN.clr(); call FastSpiByte.write(RF230_CMD_FRAME_READ); // read the length byte length = call FastSpiByte.write(0); // if correct length if( length >= 3 && length <= call RadioPacket.maxPayloadLength() + 2 ) { uint8_t read; uint8_t* data; // initiate the reading call FastSpiByte.splitWrite(0); data = getPayload(rxMsg); getHeader(rxMsg)->length = length; // we do not store the CRC field length -= 2; read = call Config.headerPreloadLength(); if( length < read ) read = length; length -= read; do { *(data++) = call FastSpiByte.splitReadWrite(0); } while( --read != 0 ); if( signal RadioReceive.header(rxMsg) ) { while( length-- != 0 ) *(data++) = call FastSpiByte.splitReadWrite(0); call FastSpiByte.splitReadWrite(0); // two CRC bytes call FastSpiByte.splitReadWrite(0); call PacketLinkQuality.set(rxMsg, call FastSpiByte.splitRead()); // we should have no other incoming message or buffer underflow crcValid = ! radioIrq; } } call SELN.set(); if( crcValid && call PacketTimeStamp.isValid(rxMsg) ) { uint32_t time32 = call PacketTimeStamp.timestamp(rxMsg); length = getHeader(rxMsg)->length; /* * If you hate floating point arithmetics and do not care of up to 400 microsecond time stamping errors, * then define RF230_HWACK_SLOPPY_TIMESTAMP, which will be significantly faster. */ #ifdef RF230_HWACK_SLOPPY_TIMESTAMP time32 -= (uint16_t)(RX_SFD_DELAY) + ((uint16_t)(length) << (RADIO_ALARM_MILLI_EXP - 5)); #else time32 -= (uint16_t)(RX_SFD_DELAY) + (uint16_t)(32.0 * RADIO_ALARM_MICROSEC * (uint16_t)length); #endif call PacketTimeStamp.set(rxMsg, time32); } #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ) { length = getHeader(rxMsg)->length; call DiagMsg.chr('r'); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.int8(crcValid ? length : -length); call DiagMsg.hex8s(getPayload(rxMsg), length - 2); call DiagMsg.int8(call PacketRSSI.isSet(rxMsg) ? call PacketRSSI.get(rxMsg) : -1); call DiagMsg.uint8(call PacketLinkQuality.isSet(rxMsg) ? call PacketLinkQuality.get(rxMsg) : 0); call DiagMsg.send(); } #endif state = STATE_RX_ON; cmd = CMD_NONE; // signal only if it has passed the CRC check if( crcValid ) rxMsg = signal RadioReceive.receive(rxMsg); } /*----------------- IRQ -----------------*/ async event void IRQ.captured(uint16_t time) { RADIO_ASSERT( ! radioIrq ); atomic { capturedTime = time; radioIrq = TRUE; } call Tasklet.schedule(); } void serviceRadio() { if( isSpiAcquired() ) { uint16_t time; uint32_t time32; uint8_t irq; uint8_t temp; atomic time = capturedTime; radioIrq = FALSE; irq = readRegister(RF230_IRQ_STATUS); #ifdef RADIO_DEBUG // TODO: handle this interrupt if( irq & RF230_IRQ_TRX_UR ) { if( call DiagMsg.record() ) { call DiagMsg.str("assert ur"); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.hex8(readRegister(RF230_TRX_STATUS)); call DiagMsg.hex8(readRegister(RF230_TRX_STATE)); call DiagMsg.hex8(irq); call DiagMsg.uint8(state); call DiagMsg.uint8(cmd); call DiagMsg.send(); } } #endif if( irq & RF230_IRQ_TRX_END ) { if( cmd == CMD_TRANSMIT ) { RADIO_ASSERT( state == STATE_BUSY_TX_2_RX_ON ); temp = readRegister(RF230_TRX_STATE) & RF230_TRAC_STATUS_MASK; if( call Ieee154PacketLayer.getAckRequired(txMsg) ) call AckReceivedFlag.setValue(txMsg, temp != RF230_TRAC_NO_ACK); state = STATE_RX_ON; cmd = CMD_NONE; signal RadioSend.sendDone(temp != RF230_TRAC_CHANNEL_ACCESS_FAILURE ? SUCCESS : EBUSY); // TODO: we could have missed a received message RADIO_ASSERT( ! (irq & RF230_IRQ_RX_START) ); } else if( cmd == CMD_NONE ) { RADIO_ASSERT( state == STATE_RX_ON ); if( irq == RF230_IRQ_TRX_END ) { call PacketRSSI.set(rxMsg, readRegister(RF230_PHY_ED_LEVEL)); // TODO: compensate for packet transmission time when downloading time32 = call LocalTime.get(); time32 += (int16_t)(time) - (int16_t)(time32); call PacketTimeStamp.set(rxMsg, time32); } else { call PacketRSSI.clear(rxMsg); call PacketTimeStamp.clear(rxMsg); } cmd = CMD_DOWNLOAD; } else RADIO_ASSERT(FALSE); } } } default tasklet_async event bool RadioReceive.header(message_t* msg) { return TRUE; } default tasklet_async event message_t* RadioReceive.receive(message_t* msg) { return msg; } /*----------------- TASKLET -----------------*/ tasklet_async event void Tasklet.run() { if( radioIrq ) serviceRadio(); if( cmd != CMD_NONE ) { if( cmd == CMD_DOWNLOAD ) downloadMessage(); else if( CMD_TURNOFF <= cmd && cmd <= CMD_TURNON ) changeState(); else if( cmd == CMD_CHANNEL ) changeChannel(); if( cmd == CMD_SIGNAL_DONE ) { cmd = CMD_NONE; signal RadioState.done(); } } if( cmd == CMD_NONE && state == STATE_RX_ON && ! radioIrq ) signal RadioSend.ready(); if( cmd == CMD_NONE ) call SpiResource.release(); } /*----------------- RadioPacket -----------------*/ async command uint8_t RadioPacket.headerLength(message_t* msg) { return call Config.headerLength(msg) + sizeof(rf230_header_t); } async command uint8_t RadioPacket.payloadLength(message_t* msg) { return getHeader(msg)->length - 2; } async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length) { RADIO_ASSERT( 1 <= length && length <= 125 ); RADIO_ASSERT( call RadioPacket.headerLength(msg) + length + call RadioPacket.metadataLength(msg) <= sizeof(message_t) ); // we add the length of the CRC, which is automatically generated getHeader(msg)->length = length + 2; } async command uint8_t RadioPacket.maxPayloadLength() { RADIO_ASSERT( call Config.maxPayloadLength() - sizeof(rf230_header_t) <= 125 ); return call Config.maxPayloadLength() - sizeof(rf230_header_t); } async command uint8_t RadioPacket.metadataLength(message_t* msg) { return call Config.metadataLength(msg) + sizeof(rf230_metadata_t); } async command void RadioPacket.clear(message_t* msg) { // all flags are automatically cleared } /*----------------- PacketTransmitPower -----------------*/ async command bool PacketTransmitPower.isSet(message_t* msg) { return call TransmitPowerFlag.get(msg); } async command uint8_t PacketTransmitPower.get(message_t* msg) { return getMeta(msg)->power; } async command void PacketTransmitPower.clear(message_t* msg) { call TransmitPowerFlag.clear(msg); } async command void PacketTransmitPower.set(message_t* msg, uint8_t value) { call TransmitPowerFlag.set(msg); getMeta(msg)->power = value; } /*----------------- PacketRSSI -----------------*/ async command bool PacketRSSI.isSet(message_t* msg) { return call RSSIFlag.get(msg); } async command uint8_t PacketRSSI.get(message_t* msg) { return getMeta(msg)->rssi; } async command void PacketRSSI.clear(message_t* msg) { call RSSIFlag.clear(msg); } async command void PacketRSSI.set(message_t* msg, uint8_t value) { // just to be safe if the user fails to clear the packet call TransmitPowerFlag.clear(msg); call RSSIFlag.set(msg); getMeta(msg)->rssi = value; } /*----------------- PacketTimeSyncOffset -----------------*/ async command bool PacketTimeSyncOffset.isSet(message_t* msg) { return call TimeSyncFlag.get(msg); } async command uint8_t PacketTimeSyncOffset.get(message_t* msg) { return call RadioPacket.headerLength(msg) + call RadioPacket.payloadLength(msg) - sizeof(timesync_absolute_t); } async command void PacketTimeSyncOffset.clear(message_t* msg) { call TimeSyncFlag.clear(msg); } async command void PacketTimeSyncOffset.set(message_t* msg, uint8_t value) { // we do not store the value, the time sync field is always the last 4 bytes RADIO_ASSERT( call PacketTimeSyncOffset.get(msg) == value ); call TimeSyncFlag.set(msg); } /*----------------- PacketLinkQuality -----------------*/ async command bool PacketLinkQuality.isSet(message_t* msg) { return TRUE; } async command uint8_t PacketLinkQuality.get(message_t* msg) { return getMeta(msg)->lqi; } async command void PacketLinkQuality.clear(message_t* msg) { } async command void PacketLinkQuality.set(message_t* msg, uint8_t value) { getMeta(msg)->lqi = value; } /*----------------- PacketAcknowledgements -----------------*/ async command error_t PacketAcknowledgements.requestAck(message_t* msg) { call Ieee154PacketLayer.setAckRequired(msg, TRUE); return SUCCESS; } async command error_t PacketAcknowledgements.noAck(message_t* msg) { call Ieee154PacketLayer.setAckRequired(msg, FALSE); return SUCCESS; } async command bool PacketAcknowledgements.wasAcked(message_t* msg) { return call AckReceivedFlag.get(msg); } } tinyos-2.1.2+dfsg/tos/platforms/mulle/fix/RF230DriverLayerP.nc000066400000000000000000000612601207233610700240550ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include #include #include #include #include module RF230DriverLayerP { provides { interface Init as PlatformInit @exactlyonce(); interface Init as SoftwareInit @exactlyonce(); interface RadioState; interface RadioSend; interface RadioReceive; interface RadioCCA; interface RadioPacket; interface PacketField as PacketTransmitPower; interface PacketField as PacketRSSI; interface PacketField as PacketTimeSyncOffset; interface PacketField as PacketLinkQuality; interface LinkPacketMetadata; } uses { interface GeneralIO as SELN; interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as SLP_TR; interface GeneralIO as RSTN; interface GpioCapture as IRQ; interface BusyWait; interface LocalTime; interface RF230DriverConfig as Config; interface PacketFlag as TransmitPowerFlag; interface PacketFlag as RSSIFlag; interface PacketFlag as TimeSyncFlag; interface PacketTimeStamp; interface Tasklet; interface RadioAlarm; #ifdef RADIO_DEBUG interface DiagMsg; #endif } } implementation { rf230_header_t* getHeader(message_t* msg) { return ((void*)msg) + call Config.headerLength(msg); } void* getPayload(message_t* msg) { return ((void*)msg) + call RadioPacket.headerLength(msg); } rf230_metadata_t* getMeta(message_t* msg) { return ((void*)msg) + sizeof(message_t) - call RadioPacket.metadataLength(msg); } /*----------------- STATE -----------------*/ tasklet_norace uint8_t state; enum { STATE_P_ON = 0, STATE_SLEEP = 1, STATE_SLEEP_2_TRX_OFF = 2, STATE_TRX_OFF = 3, STATE_TRX_OFF_2_RX_ON = 4, STATE_RX_ON = 5, STATE_BUSY_TX_2_RX_ON = 6, STATE_PLL_ON_2_RX_ON = 7, }; tasklet_norace uint8_t cmd; enum { CMD_NONE = 0, // the state machine has stopped CMD_TURNOFF = 1, // goto SLEEP state CMD_STANDBY = 2, // goto TRX_OFF state CMD_TURNON = 3, // goto RX_ON state CMD_TRANSMIT = 4, // currently transmitting a message CMD_RECEIVE = 5, // currently receiving a message CMD_CCA = 6, // performing clear chanel assesment CMD_CHANNEL = 7, // changing the channel CMD_SIGNAL_DONE = 8, // signal the end of the state transition CMD_DOWNLOAD = 9, // download the received message }; norace bool radioIrq; tasklet_norace uint8_t txPower; tasklet_norace uint8_t channel; tasklet_norace message_t* rxMsg; message_t rxMsgBuffer; uint16_t capturedTime; // the current time when the last interrupt has occured tasklet_norace uint8_t rssiClear; tasklet_norace uint8_t rssiBusy; /*----------------- REGISTER -----------------*/ inline void writeRegister(uint8_t reg, uint8_t value) { RADIO_ASSERT( call SpiResource.isOwner() ); RADIO_ASSERT( reg == (reg & RF230_CMD_REGISTER_MASK) ); call SELN.clr(); call FastSpiByte.splitWrite(RF230_CMD_REGISTER_WRITE | reg); call FastSpiByte.splitReadWrite(value); call FastSpiByte.splitRead(); call SELN.set(); } inline uint8_t readRegister(uint8_t reg) { RADIO_ASSERT( call SpiResource.isOwner() ); RADIO_ASSERT( reg == (reg & RF230_CMD_REGISTER_MASK) ); call SELN.clr(); call FastSpiByte.splitWrite(RF230_CMD_REGISTER_READ | reg); call FastSpiByte.splitReadWrite(0); reg = call FastSpiByte.splitRead(); call SELN.set(); return reg; } /*----------------- ALARM -----------------*/ enum { SLEEP_WAKEUP_TIME = (uint16_t)(880 * RADIO_ALARM_MICROSEC), CCA_REQUEST_TIME = (uint16_t)(140 * RADIO_ALARM_MICROSEC), TX_SFD_DELAY = (uint16_t)(176 * RADIO_ALARM_MICROSEC), RX_SFD_DELAY = (uint16_t)(8 * RADIO_ALARM_MICROSEC), }; tasklet_async event void RadioAlarm.fired() { if( state == STATE_SLEEP_2_TRX_OFF ) state = STATE_TRX_OFF; else if( cmd == CMD_CCA ) { uint8_t cca; RADIO_ASSERT( state == STATE_RX_ON ); cmd = CMD_NONE; cca = readRegister(RF230_TRX_STATUS); RADIO_ASSERT( (cca & RF230_TRX_STATUS_MASK) == RF230_RX_ON ); signal RadioCCA.done( (cca & RF230_CCA_DONE) ? ((cca & RF230_CCA_STATUS) ? SUCCESS : EBUSY) : FAIL ); } else RADIO_ASSERT(FALSE); // make sure the rest of the command processing is called call Tasklet.schedule(); } /*----------------- INIT -----------------*/ command error_t PlatformInit.init() { call SELN.makeOutput(); call SELN.set(); call SLP_TR.makeOutput(); call SLP_TR.clr(); call RSTN.makeOutput(); call RSTN.set(); rxMsg = &rxMsgBuffer; // these are just good approximates rssiClear = 0; rssiBusy = 90; return SUCCESS; } command error_t SoftwareInit.init() { // for powering up the radio return call SpiResource.request(); } void initRadio() { call BusyWait.wait(510); call RSTN.clr(); call SLP_TR.clr(); call BusyWait.wait(6); call RSTN.set(); writeRegister(RF230_TRX_CTRL_0, RF230_TRX_CTRL_0_VALUE); writeRegister(RF230_TRX_STATE, RF230_TRX_OFF); call BusyWait.wait(510); writeRegister(RF230_IRQ_MASK, RF230_IRQ_TRX_UR | RF230_IRQ_PLL_LOCK | RF230_IRQ_TRX_END | RF230_IRQ_RX_START); writeRegister(RF230_CCA_THRES, RF230_CCA_THRES_VALUE); writeRegister(RF230_PHY_TX_PWR, RF230_TX_AUTO_CRC_ON | (RF230_DEF_RFPOWER & RF230_TX_PWR_MASK)); txPower = RF230_DEF_RFPOWER & RF230_TX_PWR_MASK; channel = RF230_DEF_CHANNEL & RF230_CHANNEL_MASK; writeRegister(RF230_PHY_CC_CCA, RF230_CCA_MODE_VALUE | channel); call SLP_TR.set(); state = STATE_SLEEP; } /*----------------- SPI -----------------*/ event void SpiResource.granted() { call SELN.makeOutput(); call SELN.set(); if( state == STATE_P_ON ) { initRadio(); call SpiResource.release(); } else call Tasklet.schedule(); } bool isSpiAcquired() { if( call SpiResource.isOwner() ) return TRUE; if( call SpiResource.immediateRequest() == SUCCESS ) { call SELN.makeOutput(); call SELN.set(); return TRUE; } call SpiResource.request(); return FALSE; } /*----------------- CHANNEL -----------------*/ tasklet_async command uint8_t RadioState.getChannel() { return channel; } tasklet_async command error_t RadioState.setChannel(uint8_t c) { c &= RF230_CHANNEL_MASK; if( cmd != CMD_NONE ) return EBUSY; else if( channel == c ) return EALREADY; channel = c; cmd = CMD_CHANNEL; call Tasklet.schedule(); return SUCCESS; } inline void changeChannel() { RADIO_ASSERT( cmd == CMD_CHANNEL ); RADIO_ASSERT( state == STATE_SLEEP || state == STATE_TRX_OFF || state == STATE_RX_ON ); if( isSpiAcquired() ) { writeRegister(RF230_PHY_CC_CCA, RF230_CCA_MODE_VALUE | channel); if( state == STATE_RX_ON ) state = STATE_TRX_OFF_2_RX_ON; else cmd = CMD_SIGNAL_DONE; } } /*----------------- TURN ON/OFF -----------------*/ inline void changeState() { if( (cmd == CMD_STANDBY || cmd == CMD_TURNON) && state == STATE_SLEEP && call RadioAlarm.isFree() ) { call SLP_TR.clr(); call RadioAlarm.wait(SLEEP_WAKEUP_TIME); state = STATE_SLEEP_2_TRX_OFF; } else if( cmd == CMD_TURNON && state == STATE_TRX_OFF && isSpiAcquired() ) { RADIO_ASSERT( ! radioIrq ); readRegister(RF230_IRQ_STATUS); // clear the interrupt register call IRQ.captureRisingEdge(); // setChannel was ignored in SLEEP because the SPI was not working, so do it here writeRegister(RF230_PHY_CC_CCA, RF230_CCA_MODE_VALUE | channel); writeRegister(RF230_TRX_STATE, RF230_RX_ON); state = STATE_TRX_OFF_2_RX_ON; } else if( (cmd == CMD_TURNOFF || cmd == CMD_STANDBY) && state == STATE_RX_ON && isSpiAcquired() ) { writeRegister(RF230_TRX_STATE, RF230_FORCE_TRX_OFF); call IRQ.disable(); radioIrq = FALSE; state = STATE_TRX_OFF; } if( cmd == CMD_TURNOFF && state == STATE_TRX_OFF ) { call SLP_TR.set(); state = STATE_SLEEP; cmd = CMD_SIGNAL_DONE; } else if( cmd == CMD_STANDBY && state == STATE_TRX_OFF ) cmd = CMD_SIGNAL_DONE; } tasklet_async command error_t RadioState.turnOff() { if( cmd != CMD_NONE ) return EBUSY; else if( state == STATE_SLEEP ) return EALREADY; cmd = CMD_TURNOFF; call Tasklet.schedule(); return SUCCESS; } tasklet_async command error_t RadioState.standby() { if( cmd != CMD_NONE || (state == STATE_SLEEP && ! call RadioAlarm.isFree()) ) return EBUSY; else if( state == STATE_TRX_OFF ) return EALREADY; cmd = CMD_STANDBY; call Tasklet.schedule(); return SUCCESS; } tasklet_async command error_t RadioState.turnOn() { if( cmd != CMD_NONE || (state == STATE_SLEEP && ! call RadioAlarm.isFree()) ) return EBUSY; else if( state == STATE_RX_ON ) return EALREADY; cmd = CMD_TURNON; call Tasklet.schedule(); return SUCCESS; } default tasklet_async event void RadioState.done() { } /*----------------- TRANSMIT -----------------*/ tasklet_async command error_t RadioSend.send(message_t* msg) { uint16_t time; uint8_t length; uint8_t* data; uint8_t header; uint32_t time32; void* timesync; if( cmd != CMD_NONE || state != STATE_RX_ON || ! isSpiAcquired() || radioIrq ) return EBUSY; length = (call PacketTransmitPower.isSet(msg) ? call PacketTransmitPower.get(msg) : RF230_DEF_RFPOWER) & RF230_TX_PWR_MASK; if( length != txPower ) { txPower = length; writeRegister(RF230_PHY_TX_PWR, RF230_TX_AUTO_CRC_ON | txPower); } if( call Config.requiresRssiCca(msg) && (readRegister(RF230_PHY_RSSI) & RF230_RSSI_MASK) > ((rssiClear + rssiBusy) >> 3) ) return EBUSY; writeRegister(RF230_TRX_STATE, RF230_PLL_ON); // do something useful, just to wait a little time32 = call LocalTime.get(); timesync = call PacketTimeSyncOffset.isSet(msg) ? ((void*)msg) + call PacketTimeSyncOffset.get(msg) : 0; // we have missed an incoming message in this short amount of time if( (readRegister(RF230_TRX_STATUS) & RF230_TRX_STATUS_MASK) != RF230_PLL_ON ) { RADIO_ASSERT( (readRegister(RF230_TRX_STATUS) & RF230_TRX_STATUS_MASK) == RF230_BUSY_RX ); state = STATE_PLL_ON_2_RX_ON; return EBUSY; } #ifndef RF230_SLOW_SPI_MULLE #ifndef RF230_SLOW_SPI atomic { call SLP_TR.set(); time = call RadioAlarm.getNow(); } call SLP_TR.clr(); #endif #endif RADIO_ASSERT( ! radioIrq ); call SELN.clr(); call FastSpiByte.splitWrite(RF230_CMD_FRAME_WRITE); data = getPayload(msg); length = getHeader(msg)->length; // length | data[0] ... data[length-3] | automatically generated FCS call FastSpiByte.splitReadWrite(length); // the FCS is atomatically generated (2 bytes) length -= 2; header = call Config.headerPreloadLength(); if( header > length ) header = length; length -= header; // first upload the header to gain some time do { call FastSpiByte.splitReadWrite(*(data++)); } while( --header != 0 ); #ifndef RF230_SLOW_SPI_MULLE #ifdef RF230_SLOW_SPI atomic { call SLP_TR.set(); time = call RadioAlarm.getNow(); } call SLP_TR.clr(); #endif #else atomic { time = call RadioAlarm.getNow(); } #endif time32 += (int16_t)(time + TX_SFD_DELAY) - (int16_t)(time32); if( timesync != 0 ) *(timesync_relative_t*)timesync = (*(timesync_absolute_t*)timesync) - time32; while( length-- != 0 ) call FastSpiByte.splitReadWrite(*(data++)); // wait for the SPI transfer to finish call FastSpiByte.splitRead(); #ifdef RF230_SLOW_SPI_MULLE atomic { call SLP_TR.set(); } call SLP_TR.clr(); #endif call SELN.set(); /* * There is a very small window (~1 microsecond) when the RF230 went * into PLL_ON state but was somehow not properly initialized because * of an incoming message and could not go into BUSY_TX. I think the * radio can even receive a message, and generate a TRX_UR interrupt * because of concurrent access, but that message probably cannot be * recovered. * * TODO: this needs to be verified, and make sure that the chip is * not locked up in this case. */ // go back to RX_ON state when finished writeRegister(RF230_TRX_STATE, RF230_RX_ON); if( timesync != 0 ) *(timesync_absolute_t*)timesync = (*(timesync_relative_t*)timesync) + time32; call PacketTimeStamp.set(msg, time32); #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ) { length = getHeader(msg)->length; call DiagMsg.chr('t'); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.int8(length); call DiagMsg.hex8s(getPayload(msg), length - 2); call DiagMsg.send(); } #endif // wait for the TRX_END interrupt state = STATE_BUSY_TX_2_RX_ON; cmd = CMD_TRANSMIT; return SUCCESS; } default tasklet_async event void RadioSend.sendDone(error_t error) { } default tasklet_async event void RadioSend.ready() { } /*----------------- CCA -----------------*/ tasklet_async command error_t RadioCCA.request() { if( cmd != CMD_NONE || state != STATE_RX_ON || ! isSpiAcquired() || ! call RadioAlarm.isFree() ) return EBUSY; // see Errata B7 of the datasheet // writeRegister(RF230_TRX_STATE, RF230_PLL_ON); // writeRegister(RF230_TRX_STATE, RF230_RX_ON); writeRegister(RF230_PHY_CC_CCA, RF230_CCA_REQUEST | RF230_CCA_MODE_VALUE | channel); call RadioAlarm.wait(CCA_REQUEST_TIME); cmd = CMD_CCA; return SUCCESS; } default tasklet_async event void RadioCCA.done(error_t error) { } /*----------------- RECEIVE -----------------*/ inline void downloadMessage() { uint8_t length; uint16_t crc; call SELN.clr(); call FastSpiByte.write(RF230_CMD_FRAME_READ); // read the length byte length = call FastSpiByte.write(0); // if correct length if( length >= 3 && length <= call RadioPacket.maxPayloadLength() + 2 ) { uint8_t read; uint8_t* data; // initiate the reading call FastSpiByte.splitWrite(0); data = getPayload(rxMsg); getHeader(rxMsg)->length = length; crc = 0; // we do not store the CRC field length -= 2; read = call Config.headerPreloadLength(); if( length < read ) read = length; length -= read; do { crc = RF230_CRCBYTE_COMMAND(crc, *(data++) = call FastSpiByte.splitReadWrite(0)); } while( --read != 0 ); if( signal RadioReceive.header(rxMsg) ) { while( length-- != 0 ) crc = RF230_CRCBYTE_COMMAND(crc, *(data++) = call FastSpiByte.splitReadWrite(0)); crc = RF230_CRCBYTE_COMMAND(crc, call FastSpiByte.splitReadWrite(0)); crc = RF230_CRCBYTE_COMMAND(crc, call FastSpiByte.splitReadWrite(0)); call PacketLinkQuality.set(rxMsg, call FastSpiByte.splitRead()); } else crc = 1; } else crc = 1; call SELN.set(); state = STATE_RX_ON; #ifdef RADIO_DEBUG_MESSAGES if( call DiagMsg.record() ) { length = getHeader(rxMsg)->length; call DiagMsg.chr('r'); call DiagMsg.uint32(call PacketTimeStamp.isValid(rxMsg) ? call PacketTimeStamp.timestamp(rxMsg) : 0); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.int8(crc == 0 ? length : -length); call DiagMsg.hex8s(getPayload(rxMsg), length - 2); call DiagMsg.int8(call PacketRSSI.isSet(rxMsg) ? call PacketRSSI.get(rxMsg) : -1); call DiagMsg.uint8(call PacketLinkQuality.isSet(rxMsg) ? call PacketLinkQuality.get(rxMsg) : 0); call DiagMsg.send(); } #endif cmd = CMD_NONE; // signal only if it has passed the CRC check if( crc == 0 ) rxMsg = signal RadioReceive.receive(rxMsg); } /*----------------- IRQ -----------------*/ async event void IRQ.captured(uint16_t time) { RADIO_ASSERT( ! radioIrq ); atomic { capturedTime = time; radioIrq = TRUE; } call Tasklet.schedule(); } void serviceRadio() { if( isSpiAcquired() ) { uint16_t time; uint32_t time32; uint8_t irq; uint8_t temp; atomic time = capturedTime; radioIrq = FALSE; irq = readRegister(RF230_IRQ_STATUS); #ifdef RADIO_DEBUG // TODO: handle this interrupt if( irq & RF230_IRQ_TRX_UR ) { if( call DiagMsg.record() ) { call DiagMsg.str("assert ur"); call DiagMsg.uint16(call RadioAlarm.getNow()); call DiagMsg.hex8(readRegister(RF230_TRX_STATUS)); call DiagMsg.hex8(readRegister(RF230_TRX_STATE)); call DiagMsg.hex8(irq); call DiagMsg.uint8(state); call DiagMsg.uint8(cmd); call DiagMsg.send(); } } #endif #ifdef RF230_RSSI_ENERGY if( irq & RF230_IRQ_TRX_END ) { if( irq == RF230_IRQ_TRX_END || (irq == (RF230_IRQ_RX_START | RF230_IRQ_TRX_END) && cmd == CMD_NONE) ) call PacketRSSI.set(rxMsg, readRegister(RF230_PHY_ED_LEVEL)); else call PacketRSSI.clear(rxMsg); } #endif if( irq & RF230_IRQ_PLL_LOCK ) { if( cmd == CMD_TURNON || cmd == CMD_CHANNEL ) { RADIO_ASSERT( state == STATE_TRX_OFF_2_RX_ON ); state = STATE_RX_ON; cmd = CMD_SIGNAL_DONE; } else if( cmd == CMD_TRANSMIT ) { RADIO_ASSERT( state == STATE_BUSY_TX_2_RX_ON ); } else RADIO_ASSERT(FALSE); } if( irq & RF230_IRQ_RX_START ) { if( cmd == CMD_CCA ) { signal RadioCCA.done(FAIL); cmd = CMD_NONE; } if( cmd == CMD_NONE ) { RADIO_ASSERT( state == STATE_RX_ON || state == STATE_PLL_ON_2_RX_ON ); // the most likely place for busy channel, with no TRX_END interrupt if( irq == RF230_IRQ_RX_START ) { temp = readRegister(RF230_PHY_RSSI) & RF230_RSSI_MASK; rssiBusy += temp - (rssiBusy >> 2); #ifndef RF230_RSSI_ENERGY call PacketRSSI.set(rxMsg, temp); } else { call PacketRSSI.clear(rxMsg); #endif } /* * The timestamp corresponds to the first event which could not * have been a PLL_LOCK because then cmd != CMD_NONE, so we must * have received a message (and could also have received the * TRX_END interrupt in the mean time, but that is fine. Also, * we could not be after a transmission, because then cmd = * CMD_TRANSMIT. */ if( irq == RF230_IRQ_RX_START ) // just to be cautious { time32 = call LocalTime.get(); time32 += (int16_t)(time - RX_SFD_DELAY) - (int16_t)(time32); call PacketTimeStamp.set(rxMsg, time32); } else call PacketTimeStamp.clear(rxMsg); cmd = CMD_RECEIVE; } else RADIO_ASSERT( cmd == CMD_TURNOFF ); } if( irq & RF230_IRQ_TRX_END ) { if( cmd == CMD_TRANSMIT ) { RADIO_ASSERT( state == STATE_BUSY_TX_2_RX_ON ); state = STATE_RX_ON; cmd = CMD_NONE; signal RadioSend.sendDone(SUCCESS); // TODO: we could have missed a received message RADIO_ASSERT( ! (irq & RF230_IRQ_RX_START) ); } else if( cmd == CMD_RECEIVE ) { RADIO_ASSERT( state == STATE_RX_ON || state == STATE_PLL_ON_2_RX_ON ); if( state == STATE_PLL_ON_2_RX_ON ) { RADIO_ASSERT( (readRegister(RF230_TRX_STATUS) & RF230_TRX_STATUS_MASK) == RF230_PLL_ON ); writeRegister(RF230_TRX_STATE, RF230_RX_ON); state = STATE_RX_ON; } else { // the most likely place for clear channel (hope to avoid acks) rssiClear += (readRegister(RF230_PHY_RSSI) & RF230_RSSI_MASK) - (rssiClear >> 2); } cmd = CMD_DOWNLOAD; } else RADIO_ASSERT(FALSE); } } } default tasklet_async event bool RadioReceive.header(message_t* msg) { return TRUE; } default tasklet_async event message_t* RadioReceive.receive(message_t* msg) { return msg; } /*----------------- TASKLET -----------------*/ tasklet_async event void Tasklet.run() { if( radioIrq ) serviceRadio(); if( cmd != CMD_NONE ) { if( cmd == CMD_DOWNLOAD ) downloadMessage(); else if( CMD_TURNOFF <= cmd && cmd <= CMD_TURNON ) changeState(); else if( cmd == CMD_CHANNEL ) changeChannel(); if( cmd == CMD_SIGNAL_DONE ) { cmd = CMD_NONE; signal RadioState.done(); } } if( cmd == CMD_NONE && state == STATE_RX_ON && ! radioIrq ) signal RadioSend.ready(); if( cmd == CMD_NONE ) call SpiResource.release(); } /*----------------- RadioPacket -----------------*/ async command uint8_t RadioPacket.headerLength(message_t* msg) { return call Config.headerLength(msg) + sizeof(rf230_header_t); } async command uint8_t RadioPacket.payloadLength(message_t* msg) { return getHeader(msg)->length - 2; } async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length) { RADIO_ASSERT( 1 <= length && length <= 125 ); RADIO_ASSERT( call RadioPacket.headerLength(msg) + length + call RadioPacket.metadataLength(msg) <= sizeof(message_t) ); // we add the length of the CRC, which is automatically generated getHeader(msg)->length = length + 2; } async command uint8_t RadioPacket.maxPayloadLength() { RADIO_ASSERT( call Config.maxPayloadLength() - sizeof(rf230_header_t) <= 125 ); return call Config.maxPayloadLength() - sizeof(rf230_header_t); } async command uint8_t RadioPacket.metadataLength(message_t* msg) { return call Config.metadataLength(msg) + sizeof(rf230_metadata_t); } async command void RadioPacket.clear(message_t* msg) { // all flags are automatically cleared } /*----------------- PacketTransmitPower -----------------*/ async command bool PacketTransmitPower.isSet(message_t* msg) { return call TransmitPowerFlag.get(msg); } async command uint8_t PacketTransmitPower.get(message_t* msg) { return getMeta(msg)->power; } async command void PacketTransmitPower.clear(message_t* msg) { call TransmitPowerFlag.clear(msg); } async command void PacketTransmitPower.set(message_t* msg, uint8_t value) { call TransmitPowerFlag.set(msg); getMeta(msg)->power = value; } /*----------------- PacketRSSI -----------------*/ async command bool PacketRSSI.isSet(message_t* msg) { return call RSSIFlag.get(msg); } async command uint8_t PacketRSSI.get(message_t* msg) { return getMeta(msg)->rssi; } async command void PacketRSSI.clear(message_t* msg) { call RSSIFlag.clear(msg); } async command void PacketRSSI.set(message_t* msg, uint8_t value) { // just to be safe if the user fails to clear the packet call TransmitPowerFlag.clear(msg); call RSSIFlag.set(msg); getMeta(msg)->rssi = value; } /*----------------- PacketTimeSyncOffset -----------------*/ async command bool PacketTimeSyncOffset.isSet(message_t* msg) { return call TimeSyncFlag.get(msg); } async command uint8_t PacketTimeSyncOffset.get(message_t* msg) { return call RadioPacket.headerLength(msg) + call RadioPacket.payloadLength(msg) - sizeof(timesync_absolute_t); } async command void PacketTimeSyncOffset.clear(message_t* msg) { call TimeSyncFlag.clear(msg); } async command void PacketTimeSyncOffset.set(message_t* msg, uint8_t value) { // we do not store the value, the time sync field is always the last 4 bytes RADIO_ASSERT( call PacketTimeSyncOffset.get(msg) == value ); call TimeSyncFlag.set(msg); } /*----------------- PacketLinkQuality -----------------*/ async command bool PacketLinkQuality.isSet(message_t* msg) { return TRUE; } async command uint8_t PacketLinkQuality.get(message_t* msg) { return getMeta(msg)->lqi; } async command void PacketLinkQuality.clear(message_t* msg) { } async command void PacketLinkQuality.set(message_t* msg, uint8_t value) { getMeta(msg)->lqi = value; } /*----------------- LinkPacketMetadata -----------------*/ async command bool LinkPacketMetadata.highChannelQuality(message_t* msg) { return call PacketLinkQuality.get(msg) > 200; } } tinyos-2.1.2+dfsg/tos/platforms/mulle/hardware.h000077500000000000000000000045771207233610700217010ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Henrik Makitaavola */ #ifndef __HARDWARE_H__ #define __HARDWARE_H__ #define MAIN_CRYSTAL_SPEED 10 /*MHz*/ #define PLL_MULTIPLIER M16C60_PLL_2 #define RF230_SLOW_SPI_MULLE #ifdef RF230_SLOW_SPI_MULLE #warning You are using the RF230 driver with a Mulle specific software fix. If you are using some very timecritical network protocols these may not work as intended! \ You should not remove this fix unless you are totaly sure of what you are doing! #endif #ifdef ENABLE_STOP_MODE #warning Stop mode enabled! #include "pin_configuration.h" #endif #include "m16c60hardware.h" // Header file for the MCU #endif // __HARDWARE_H__ tinyos-2.1.2+dfsg/tos/platforms/mulle/i2c/000077500000000000000000000000001207233610700203705ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/i2c/MulleI2C.h000066400000000000000000000036121207233610700221170ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Henrik Makitaavola */ #ifndef __MULLEI2C_H__ #define __MULLEI2C_H__ #define UQ_MULLE_I2C_2 "UQ_MULLE_I2C_2" #endif // __MULLEI2C_H__ tinyos-2.1.2+dfsg/tos/platforms/mulle/i2c/MulleI2C2C.nc000066400000000000000000000047061207233610700224620ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The basic client abstraction of the I2C nr 2 on Mulle used * by the RTC and battery monitor and possible to be connected * from the external connector. * The device drivers should instantiate this configuration to ensure * exclusive access to the I2C bus. * * @author Henrik Makitaavola */ #include "MulleI2C.h" #include "I2C.h" generic configuration MulleI2C2C() { provides interface Resource; provides interface I2CPacket; provides interface ResourceDefaultOwner; } implementation { enum { CLIENT_ID = unique(UQ_MULLE_I2C_2), }; components MulleI2C2P as I2C; Resource = I2C.Resource[CLIENT_ID]; I2CPacket = I2C.I2CPacket[CLIENT_ID]; ResourceDefaultOwner = I2C; } tinyos-2.1.2+dfsg/tos/platforms/mulle/i2c/MulleI2C2ControlP.nc000066400000000000000000000040521207233610700240320ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Initilizes the pullups on the I2C bus marked as nr 2 on Mulle. * * @author Henrik Makitaavola */ module MulleI2C2ControlP { provides interface Init; uses interface GeneralIO as Pullup; } implementation { command error_t Init.init() { call Pullup.makeOutput(); call Pullup.set(); } } tinyos-2.1.2+dfsg/tos/platforms/mulle/i2c/MulleI2C2P.nc000066400000000000000000000053231207233610700224730ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The wiring of the I2C bus nr 2 on Mulle and creation of it as a * shared resource. * * @author Henrik Makitaavola */ #include "MulleI2C.h" #include "I2C.h" configuration MulleI2C2P { provides interface Resource[uint8_t client]; provides interface I2CPacket[uint8_t client]; provides interface ResourceDefaultOwner; } implementation { components HplM16c60GeneralIOC as IOs, new SharedI2CPacketC(UQ_MULLE_I2C_2), MulleI2C2ControlP, PlatformP, new AsyncStdControlPowerManagerC() as PowerManager, M16c60I2CC as I2Cs; Resource = SharedI2CPacketC; I2CPacket = SharedI2CPacketC.I2CPacket; ResourceDefaultOwner = SharedI2CPacketC; SharedI2CPacketC -> I2Cs.I2CPacket2; // Init the bus MulleI2C2ControlP.Pullup -> IOs.PortP75; PowerManager.AsyncStdControl -> I2Cs.I2CPacket2Control; PowerManager.ResourceDefaultOwner -> SharedI2CPacketC; PlatformP.SubInit -> MulleI2C2ControlP; } tinyos-2.1.2+dfsg/tos/platforms/mulle/i2c/SharedI2CPacketC.nc000066400000000000000000000100341207233610700236470ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Philip Levis */ /** * The configuration that takes a I2C bus with 7-bit addressing * and turns it into a shared abstraction. * * @author Henrik Makitaavola */ #include "I2C.h" generic configuration SharedI2CPacketC(char resourceName[]) { provides interface Resource[uint8_t client]; provides interface I2CPacket[uint8_t client]; provides interface ResourceDefaultOwner; uses interface I2CPacket as SubPacket; } implementation { components new FcfsArbiterC(resourceName) as Arbiter; components new SharedI2CPacketP() as I2C; Resource = I2C.Resource; I2CPacket = I2C.I2CPacket; ResourceDefaultOwner = Arbiter; I2C.SubResource -> Arbiter; I2C.SubPacket = SubPacket; } tinyos-2.1.2+dfsg/tos/platforms/mulle/i2c/SharedI2CPacketP.nc000066400000000000000000000140071207233610700236700ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Philip Levis */ /** * The module implements the logic when creating a I2C bus with 7-bit addressing * into a shared abstraction. * * @author Henrik Makitaavola */ #include "I2C.h" generic module SharedI2CPacketP() { provides interface Resource[uint8_t client]; provides interface I2CPacket[uint8_t client]; uses interface Resource as SubResource[uint8_t]; uses interface I2CPacket as SubPacket; } implementation { enum { NO_CLIENT = 0xff }; uint8_t currentClient = NO_CLIENT; async command error_t Resource.request[uint8_t id]() { return call SubResource.request[id](); } async command error_t Resource.immediateRequest[uint8_t id]() { error_t rval = call SubResource.immediateRequest[id](); if (rval == SUCCESS) { atomic currentClient = id; } return rval; } event void SubResource.granted[uint8_t id]() { atomic currentClient = id; signal Resource.granted[id](); } async command error_t Resource.release[uint8_t id]() { return call SubResource.release[id](); } async command bool Resource.isOwner[uint8_t id]() { return call SubResource.isOwner[id](); } async command error_t I2CPacket.write[uint8_t id](i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* data) { atomic { if (currentClient != id) { return FAIL; } } return call SubPacket.write(flags, addr, len, data); } async command error_t I2CPacket.read[uint8_t id](i2c_flags_t flags, uint16_t addr, uint8_t len, uint8_t* data) { atomic { if (currentClient != id) { return FAIL; } } return call SubPacket.read(flags, addr, len, data); } default event void Resource.granted[uint8_t id]() {} async event void SubPacket.readDone( error_t error, uint16_t addr, uint8_t length, uint8_t* data) { signal I2CPacket.readDone[currentClient](error, addr, length, data); } async event void SubPacket.writeDone( error_t error, uint16_t addr, uint8_t length, uint8_t* data) { signal I2CPacket.writeDone[currentClient]( error, addr, length, data); } default async event void I2CPacket.readDone[uint8_t id]( error_t error, uint16_t addr, uint8_t length, uint8_t* data) { } default async event void I2CPacket.writeDone[uint8_t id]( error_t error, uint16_t addr, uint8_t length, uint8_t* data) { } } tinyos-2.1.2+dfsg/tos/platforms/mulle/i2c/SoftwareI2CPacketC.nc000066400000000000000000000165041207233610700242430ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "I2C.h" /** * This module implements a software I2CPacket with 7-bit addressing. * The SDA and SCL pins must have pull-up resistors. * * This code was written with help from the I2C Wikipedia page: * http://en.wikipedia.org/wiki/I%C2%B2C * * @param speed The number of micro seconds * @author Henrik Makitaavola */ generic module SoftwareI2CPacketC(int speed) { provides interface I2CPacket; uses interface GeneralIO as SDA; uses interface GeneralIO as SCL; uses interface BusyWait; } implementation { enum { S_IDLE, S_BUSY, }; uint8_t m_state = S_IDLE; uint16_t m_addr; uint8_t m_length; uint8_t* m_data; error_t m_error; bool m_read; uint8_t READSDA() { call SDA.makeInput(); return call SDA.get(); } uint8_t READSCL() { call SCL.makeInput(); return call SCL.get(); } void CLRSCL() { call SCL.clr(); call SCL.makeOutput(); } void CLRSDA() { call SDA.clr(); call SDA.makeOutput(); } void i2cDelay(uint16_t u) { call BusyWait.wait(u); } uint8_t i2cReadBit(void) { uint8_t bit; /* lets the slave drive data */ READSDA(); i2cDelay(speed/2); /* Clock stretching */ while (READSCL() == 0); /* SCL is high, now data is valid */ bit = READSDA(); i2cDelay(speed/2); CLRSCL(); return bit; } error_t i2cWriteBit(bool bit) { if (bit) READSDA(); else CLRSDA(); i2cDelay(speed/2); /* Clock stretching */ while (READSCL() == 0); /* SCL is high, now data is valid */ /* check that nobody is driving SDA */ if (bit && READSDA() == 0) return FAIL; i2cDelay(speed/2); CLRSCL(); return SUCCESS; } error_t i2cStartCond(void) { READSCL(); READSDA(); i2cDelay(speed/2); if (READSDA() == 0) return FAIL; /* SCL is high, set SDA from 1 to 0 */ CLRSDA(); i2cDelay(speed/2); CLRSCL(); return SUCCESS; } error_t i2cStopCond(void) { /* set SDA to 0 */ CLRSDA(); i2cDelay(speed/2); /* Clock stretching */ while (READSCL() == 0); /* Release SCL, wait for done */ /* SCL is high, set SDA from 0 to 1 */ i2cDelay(speed/2); READSDA(); /* Release SDA */ /* Verify, give some time to settle first */ i2cDelay(speed/2); if (READSDA() == 0) return FAIL; return SUCCESS; } error_t i2cTx(uint8_t byte) { uint8_t bit; uint8_t ack; error_t error = SUCCESS; for (bit = 0; bit < 8; bit++) { error = ecombine(error, i2cWriteBit(byte & 0x80)); byte <<= 1; } // The ack bit is 0 for success if (!i2cReadBit()) { return ecombine(error, SUCCESS); } else { return FAIL; } } uint8_t i2cRx (bool nack) { uint8_t byte = 0; uint8_t bit; for (bit = 0; bit < 8; bit++) { byte <<= 1; byte |= i2cReadBit(); } i2cWriteBit(nack); return byte; } task void signalTask() { uint16_t addr; uint8_t length; uint8_t* data; error_t error; bool read; atomic { addr = m_addr; length = m_length; data = m_data; error = m_error; m_state = S_IDLE; read = m_read; } if (read) { signal I2CPacket.readDone(error, addr, length, data); } else { signal I2CPacket.writeDone(error, addr, length, data); } } async command error_t I2CPacket.read(i2c_flags_t flags, uint16_t addr, uint8_t length, uint8_t* data) { uint8_t i; error_t error = SUCCESS; // Both I2C_STOP and I2C_ACK_END flags are not allowed at the same time. if ((flags & I2C_STOP) && (flags & I2C_ACK_END)) { return EINVAL; } atomic { if (m_state == S_IDLE) { m_state = S_BUSY; } else { return EBUSY; } } atomic { if (flags & I2C_START) { error = ecombine(error, i2cStartCond()); error = ecombine(error, i2cTx((addr<<1)|1)); } // Only read data from the device if length is >0. // TODO(henrik): Should a data length of 0 be a invalid input? if (length > 0) { // Read the data from the device. for (i = 0; i < length-1; ++i) { data[i] = i2cRx(false); } if (flags & I2C_ACK_END) { data[length-1] = i2cRx(false); } else { data[length-1] = i2cRx(true); } } if (flags & I2C_STOP) { error = ecombine(error, i2cStopCond()); } m_error = error; m_addr = addr; m_length = length; m_data = data; m_read = true; } post signalTask(); return SUCCESS; } async command error_t I2CPacket.write(i2c_flags_t flags, uint16_t addr, uint8_t length, uint8_t* data) { uint8_t i; error_t error = SUCCESS; atomic { if (m_state == S_IDLE) { m_state = S_BUSY; } else { return EBUSY; } } atomic { if (flags & I2C_START) { error = ecombine(error, i2cStartCond()); } error = ecombine(error, i2cTx(addr<<1)); // Send the data to the device (stop on error). for (i = 0; error == SUCCESS && i < length; ++i) { error = ecombine(error, i2cTx(data[i])); } if (flags & I2C_STOP) { error = ecombine(error, i2cStopCond()); } m_error = error; m_addr = addr; m_length = length; m_data = data; m_read = false; } post signalTask(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/mulle/lib/000077500000000000000000000000001207233610700204615ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/lib/AVccClientC.nc000066400000000000000000000043001207233610700230560ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Every component that intends to use AVcc on Mulle should create * an instance of this configuration and activate and deactivate * AVcc by the StdControl provided here. * * @author Henrik Makitaavola */ #include "MulleAVcc.h" generic configuration AVccClientC() { provides interface StdControl; } implementation { components AVccClientP; enum { CLIENT_ID = unique(AVCC_CLIENTS), }; StdControl = AVccClientP.StdControl[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/platforms/mulle/lib/AVccClientP.nc000066400000000000000000000042661207233610700231060ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Wiring for the shared AVcc StdControl. * * @author Henrik Makitaavola */ #include "MulleAVcc.h" configuration AVccClientP { provides interface StdControl[uint8_t client]; } implementation { components new MultiUserStdControlC(AVCC_CLIENTS), AVccStdControlC, HplM16c60GeneralIOC as IOs; AVccStdControlC.AVccPin -> IOs.PortP76; MultiUserStdControlC -> AVccStdControlC.StdControl; StdControl = MultiUserStdControlC; } tinyos-2.1.2+dfsg/tos/platforms/mulle/lib/AVccStdControlC.nc000066400000000000000000000046471207233610700237510ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of a StdControl for the AVcc on Mulle. * * @author Henrik Makitaavola */ module AVccStdControlC { provides interface StdControl; uses interface GeneralIO as AVccPin; } implementation { enum { S_OFF, S_ON, }; uint8_t m_state = S_OFF; command error_t StdControl.start() { if (m_state != S_OFF) { return EALREADY; } call AVccPin.makeOutput(); call AVccPin.set(); m_state = S_ON; return SUCCESS; } command error_t StdControl.stop() { if (m_state == S_OFF) { return EALREADY; } call AVccPin.makeOutput(); call AVccPin.clr(); m_state = S_OFF; return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/mulle/lib/AdcReadC.nc000066400000000000000000000051641207233610700223770ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Generic configuration for creating a Read interface for a AD converter * on the Mulle platform. The Read interface provided will handle the * turning on and off of the VRef pin provided by AVcc. * * For a example of use see tos/platform/mulle/DemoSensorC.nc. * * NOTE: The VRef pin can still be handled manually if needed by using * the StdControl provided by AVccClientC. * * @author Henrik Makitaavola */ generic configuration AdcReadC(uint8_t channel, uint8_t precision, uint8_t prescaler) { provides interface Read; uses interface GeneralIO as Pin; } implementation { components new AdcReadP(channel, precision, prescaler), RealMainP, new AdcReadClientC(), new AVccClientC(); AdcReadP.Pin = Pin; AdcReadP.ReadAdc -> AdcReadClientC; AdcReadP.AVccControl -> AVccClientC; AdcReadClientC.M16c60AdcConfig -> AdcReadP; Read = AdcReadP; } tinyos-2.1.2+dfsg/tos/platforms/mulle/lib/AdcReadP.nc000066400000000000000000000064311207233610700224120ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of a Read interface that can be used to read a AD port * on Mulle. It will switch VRef on and off automatically and also set * the AD port as input. * * NOTE: The state of the AD port will not be changed from input on a * readDone event. * * @author Henrik Makitaavola */ generic module AdcReadP(uint8_t channel, uint8_t precision, uint8_t prescaler) { provides interface M16c60AdcConfig; provides interface Read; uses interface GeneralIO as Pin; uses interface Read as ReadAdc; uses interface StdControl as AVccControl; } implementation { async command uint8_t M16c60AdcConfig.getChannel() { return channel; } async command uint8_t M16c60AdcConfig.getPrecision() { return precision; } async command uint8_t M16c60AdcConfig.getPrescaler() { return prescaler; } enum { S_IDLE, S_READING, }; uint8_t m_state = S_IDLE; command error_t Read.read() { if (m_state != S_IDLE) { return EBUSY; } call AVccControl.start(); call Pin.makeInput(); if (call ReadAdc.read() != SUCCESS) { call AVccControl.stop(); } m_state = S_READING; return SUCCESS; } event void ReadAdc.readDone(error_t e, uint16_t val) { m_state = S_IDLE; // The control of the off state for the pin should be // handled from somewhere else. call AVccControl.stop(); signal Read.readDone(e, val); } default async command void Pin.makeInput() {} default event void Read.readDone(error_t e, uint16_t val) {} } tinyos-2.1.2+dfsg/tos/platforms/mulle/lib/MulleAVcc.h000066400000000000000000000037171207233610700224550ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Unique count variable for the AVcc MultipleStdControl. * * @author Henrik Makitaavola */ #ifndef __MULLE_AVCC_H__ #define __MULLE_AVCC_H__ #define AVCC_CLIENTS "mulle.avcc.clients" #endif // __MULLE_AVCC_H__ tinyos-2.1.2+dfsg/tos/platforms/mulle/lib/MultiUserStdControlC.nc000066400000000000000000000047441207233610700250640ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Wiring for the MultiUserStdControl module. * A StdControl used by many different components, eg a StdControl for AVcc, * can be turned into a shared resource. * * @param name The name of the unique count variable used to indicate the * number of users for this shared StdControl. * * @author Henrik Makitaavola */ generic configuration MultiUserStdControlC(char name[]) { provides interface StdControl[uint8_t client]; uses interface StdControl as SharedStdControl; } implementation { components new MultiUserStdControlP(), new BitVectorC(uniqueCount(name)); MultiUserStdControlP.BitVector -> BitVectorC; MultiUserStdControlP.SharedStdControl = SharedStdControl; StdControl = MultiUserStdControlP; } tinyos-2.1.2+dfsg/tos/platforms/mulle/lib/MultiUserStdControlP.nc000066400000000000000000000053401207233610700250720ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A module creating multiple StdControls from one shared StdControl. * The shared StdControl will only be turned off once all of the * StdControls provided by this module are turned off. * * @author Henrik Makitaavola */ generic module MultiUserStdControlP() { provides interface StdControl[uint8_t client]; uses interface StdControl as SharedStdControl; uses interface BitVector; } implementation { command error_t StdControl.start[uint8_t client]() { call BitVector.set(client); return call SharedStdControl.start(); } command error_t StdControl.stop[uint8_t client]() { uint16_t i; call BitVector.clear(client); for (i = 0; i < call BitVector.size(); ++i) { if (call BitVector.get(i)) { // There is some other resource that still is // using the module controlled by this StdControl. // We cant turn off now, so return SUCCESS. return SUCCESS; } } return call SharedStdControl.stop(); } } tinyos-2.1.2+dfsg/tos/platforms/mulle/pin_configuration.h000066400000000000000000000252751207233610700236140ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Inactive pin states on Mulle. * * @author Henrik Makitaavola */ #ifndef __PIN_CONFIGURATION_H__ #define __PIN_CONFIGURATION_H__ //P00/D0/AN10 //P01/D1/AN11 //P02/D2/AN12 //P03/D3/AN13 //P04/D4/AN14 //P05/D5/AN15 //P06/D6/AN16 //P07/D7/AN17 - Radio.SLP_TR #define PORT_P0_INACTIVE_STATE M16C_PORT_INACTIVE_STATE(M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW) //P10/D8 RADIO.MISO (INPUT) //P11/D9 RADIO.MOSI //P12/D10 Accel.SLEEP_MODE //P13/D11 //P14/D12 //P15/D13/INT3 //P16/D14/INT4 //P17/D15/INT5 #define PORT_P1_INACTIVE_STATE M16C_PORT_INACTIVE_STATE(M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW) #define PORT_P2_INACTIVE_STATE M16C_PORT_INACTIVE_STATE(M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW) //P30 Accel.GS1 //P31 Accel.GS2 //P32/A10 Flash.EN //P33/A11 Radio.SCLK //P34/A12 Ext. LED //P35/A13 Radio.SEL (HIGH) //P36/A14 Red LED //P37/A14 Green LED #define PORT_P3_INACTIVE_STATE M16C_PORT_INACTIVE_STATE(M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_HIGH,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW) //P40/A16 Flash.SO //P41/A17 Flash.SI //P42/A18 Flash.SCK //P43/A19 Radio.RST (HIGH) //P44/CS0 Flash.WP //P45/CS1 Flash.CS //P46/CS2 Flash.RESET //P47/CS3 RTC.CLKOE #define PORT_P4_INACTIVE_STATE M16C_PORT_INACTIVE_STATE(M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW) #define PORT_P5_INACTIVE_STATE M16C_PORT_INACTIVE_STATE(M16C_PIN_INACTIVE_INPUT,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_INPUT,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW) //P62/RXD0 UART0.TXD //P63/TXD0 UART0.RXD //P66/RXD1 UART1.TXD //P67/TXD1 UART1.RXD #define PORT_P6_INACTIVE_STATE M16C_PORT_INACTIVE_STATE(M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW) //P70/TXD2/SDA2 UART2.TXD //P71/RDX2/SCK2 UART2.TXD //P72/TA1OUT //P74/TA2OUT //P75 Vcc for I2C (must be pulled high before the I2C bus can be used) //P76 Accel VCC //P77 Radio VCC (HIGH) #define PORT_P7_INACTIVE_STATE M16C_PORT_INACTIVE_STATE(M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW) //P80/TA4OUT H1.47 ; IC1.P97/ADTRG //P81/TA4IN //P82/INT0 RTC.CLKOUT //P83/INT1 RADIO.IRQ (INPUT) //P84/INT2 RTC.INT //P85/NMI pulled high through resistor //P87/XCIN RTC.CLKOUT #define PORT_P8_INACTIVE_STATE M16C_PORT_INACTIVE_STATE(M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_INPUT,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_INPUT,\ M16C_PIN_INACTIVE_INPUT,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_INPUT) //P90/TB0IN RTC.CLKOUT //P91 //P92/TB2IN RTC.CLKOUT //P93/DA0/TB3IN //P94/DA1/TB4IN //P95/ANEX0 //P96/ANEX1 //P97/ADTRG #define PORT_P9_INACTIVE_STATE M16C_PORT_INACTIVE_STATE(M16C_PIN_INACTIVE_INPUT,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_INPUT,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_INPUT) //P100/AN00 //P101/AN01 //P102/AN02 //P103/AN03 - Accel.Z //P104/AN04 - Accel.Y //P105/AN05 - Accel.X //P106/AN06 //P107/AN07 #define PORT_P_10_INACTIVE_STATE M16C_PORT_INACTIVE_STATE(M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW,\ M16C_PIN_INACTIVE_OUTPUT_LOW) #endif //__PIN_CONFIGURATION_H__ tinyos-2.1.2+dfsg/tos/platforms/mulle/platform.h000077500000000000000000000044221207233610700217150ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Defines for the different speeds supported on the Mulle platform. * * @author Henrik Makitaavola */ #ifndef __PLATFORM_H__ #define __PLATFORM_H__ #define MCU_SPEED_20MHz M16C60_PLL_CLOCK #define MCU_SPEED_10MHz M16C60_MAIN_CLOCK_DIV_0 #define MCU_SPEED_5MHz M16C60_MAIN_CLOCK_DIV_2 #define MCU_SPEED_2_5MHz M16C60_MAIN_CLOCK_DIV_4 #define MCU_SPEED_1_25MHz M16C60_MAIN_CLOCK_DIV_8 #define MCU_SPEED_0_625MHz M16C60_MAIN_CLOCK_DIV_16 #define MCU_SPEED_32KHz M16C60_SUB_CLOCK #endif // __PLATFORM_H__ tinyos-2.1.2+dfsg/tos/platforms/mulle/platform_message.h000077500000000000000000000042731207233610700234250ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Henrik Makitaavola */ #ifndef __PLATFORM_MESSAGE_H__ #define __PLATFORM_MESSAGE_H__ #include "Serial.h" #include typedef union message_header { rf230packet_header_t rf230; serial_header_t serial; } message_header_t; typedef union message_footer { rf230packet_footer_t rf230; } message_footer_t; typedef union message_metadata { rf230packet_metadata_t rf230; } message_metadata_t; #endif // __PLATFORM_MESSAGE_H__ tinyos-2.1.2+dfsg/tos/platforms/mulle/spi/000077500000000000000000000000001207233610700205065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/spi/SharedSpiPacketC.nc000066400000000000000000000066421207233610700241550ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * This module implements the logic when making a SpiPacket * into a shared abstraction. * * @author Henrik Makitaavola */ generic module SharedSpiPacketC() { provides interface Resource[uint8_t client]; provides interface SpiPacket[uint8_t client]; uses interface Resource as SubResource[uint8_t]; uses interface SpiPacket as SubPacket; } implementation { enum { NO_CLIENT = 0xff }; uint8_t currentClient = NO_CLIENT; async command error_t Resource.request[uint8_t id]() { return call SubResource.request[id](); } async command error_t Resource.immediateRequest[uint8_t id]() { error_t rval = call SubResource.immediateRequest[id](); if (rval == SUCCESS) { atomic currentClient = id; } return rval; } event void SubResource.granted[uint8_t id]() { atomic currentClient = id; signal Resource.granted[id](); } async command error_t Resource.release[uint8_t id]() { return call SubResource.release[id](); } async command bool Resource.isOwner[uint8_t id]() { return call SubResource.isOwner[id](); } async command error_t SpiPacket.send[uint8_t id](uint8_t* txBuf, uint8_t* rxBuf, uint16_t length) { atomic { if (currentClient != id) { return FAIL; } } return call SubPacket.send(txBuf, rxBuf, length); } default event void Resource.granted[uint8_t id]() {} async event void SubPacket.sendDone( uint8_t* txBuf, uint8_t* rxBuf, uint16_t length, error_t error) { signal SpiPacket.sendDone[currentClient](txBuf, rxBuf, length, error); } default async event void SpiPacket.sendDone[uint8_t id]( uint8_t* txBuf, uint8_t* rxBuf, uint16_t length, error_t error) { } } tinyos-2.1.2+dfsg/tos/platforms/mulle/spi/SoftwareSpiC.nc000066400000000000000000000073641207233610700234130ustar00rootroot00000000000000/* * Copyright (c) 2011 Lulea University of Technology * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Software implementation of all the Spi interfaces. * * @author Henrik Makitaavola */ generic module SoftwareSpiC() { provides { interface SpiPacket; interface SpiByte; interface FastSpiByte; } uses { interface GeneralIO as SCLK; interface GeneralIO as MISO; interface GeneralIO as MOSI; } } implementation { enum { S_IDLE, S_PACKET_SEND, }; uint8_t m_state = S_IDLE; uint8_t* m_txBuf; uint8_t* m_rxBuf; uint16_t m_len; norace uint8_t m_fastByte; task void signalSendDone() { uint8_t* tmpTxBuf; uint8_t* tmpRxBuf; uint16_t tmpLen; atomic { m_state = S_IDLE; tmpTxBuf = m_txBuf; tmpRxBuf = m_rxBuf; tmpLen = m_len; } signal SpiPacket.sendDone(tmpTxBuf, tmpRxBuf, tmpLen, SUCCESS); } async command error_t SpiPacket.send( uint8_t* txBuf, uint8_t* rxBuf, uint16_t len ) { uint16_t i; atomic { if (m_state != S_IDLE) { return EBUSY; } m_state = S_PACKET_SEND; m_txBuf = txBuf; m_rxBuf = rxBuf; m_len = len; for(i = 0; i < len; ++i) { rxBuf[i] = call SpiByte.write(txBuf[i]); } } post signalSendDone(); return SUCCESS; } default async event void SpiPacket.sendDone(uint8_t* txBuf, uint8_t* rxBuf, uint16_t len, error_t error) {} async command uint8_t SpiByte.write( uint8_t byte ) { uint8_t data = 0; uint8_t mask = 0x80; atomic do { if( (byte & mask) != 0 ) call MOSI.set(); else call MOSI.clr(); call SCLK.clr(); if( call MISO.get() ) data |= mask; call SCLK.set(); } while( (mask >>= 1) != 0 ); return data; } async command void FastSpiByte.splitWrite(uint8_t data) { m_fastByte = call SpiByte.write(data); } async command uint8_t FastSpiByte.splitReadWrite(uint8_t data) { uint8_t tmp = m_fastByte; m_fastByte = call SpiByte.write(data); return tmp; } async command uint8_t FastSpiByte.splitRead() { return m_fastByte; } async command uint8_t FastSpiByte.write(uint8_t data) { return call SpiByte.write(data); } } tinyos-2.1.2+dfsg/tos/platforms/mulle/system/000077500000000000000000000000001207233610700212375ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/system/LedsP.nc000077500000000000000000000077231207233610700226040ustar00rootroot00000000000000// $Id: LedsP.nc,v 1.6 2008/06/24 05:32:32 regehr Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The implementation of the standard 3 LED mote abstraction. * * @author Joe Polastre * @author Philip Levis * * @date March 21, 2005 */ /** * Mulle needs a slightly different LedsP. * * @author Henrik Makitaavola */ module LedsP @safe() { provides { interface Init; interface Leds; } uses { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; } } implementation { command error_t Init.init() { atomic { dbg("Init", "LEDS: initialized.\n"); call Led0.makeOutput(); call Led1.makeOutput(); call Led2.makeOutput(); call Led0.clr(); call Led1.clr(); call Led2.clr(); } return SUCCESS; } /* Note: the call is inside the dbg, as it's typically a read of a volatile location, so can't be deadcode eliminated */ #define DBGLED(n) \ dbg("LedsC", "LEDS: Led" #n " %s.\n", call Led ## n .get() ? "off" : "on"); async command void Leds.led0On() { call Led0.set(); DBGLED(0); } async command void Leds.led0Off() { call Led0.clr(); DBGLED(0); } async command void Leds.led0Toggle() { call Led0.toggle(); DBGLED(0); } async command void Leds.led1On() { call Led1.set(); DBGLED(1); } async command void Leds.led1Off() { call Led1.clr(); DBGLED(1); } async command void Leds.led1Toggle() { call Led1.toggle(); DBGLED(1); } async command void Leds.led2On() { call Led2.set(); DBGLED(2); } async command void Leds.led2Off() { call Led2.clr(); DBGLED(2); } async command void Leds.led2Toggle() { call Led2.toggle(); DBGLED(2); } async command uint8_t Leds.get() { uint8_t rval; atomic { rval = 0; if (call Led0.get()) { rval |= LEDS_LED0; } if (call Led1.get()) { rval |= LEDS_LED1; } if (call Led2.get()) { rval |= LEDS_LED2; } } return rval; } async command void Leds.set(uint8_t val) { atomic { if (val & LEDS_LED0) { call Leds.led0On(); } else { call Leds.led0Off(); } if (val & LEDS_LED1) { call Leds.led1On(); } else { call Leds.led1Off(); } if (val & LEDS_LED2) { call Leds.led2On(); } else { call Leds.led2Off(); } } } } tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/000077500000000000000000000000001207233610700212165ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/AlarmMicro16C.nc000077500000000000000000000050261207233610700240460ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * AlarmMicro16C provides a 16-bit TMicro alarm. * It uses 1 hw timer that is used as a alarm. * * NOTE: It uses the same source clock as the CounterMicro16C. * * @author Henrik Makitaavola */ #include "TimerConfig.h" configuration AlarmMicro16C { provides interface Alarm; } implementation { components new M16c60Alarm16C(TMicro) as AlarmFrom; components new M16c60TimerAInitC(TMR_COUNTER_MODE, M16C_TMRA_TES_TA_PREV, 0, false, false, false) as AlarmInit; components HplM16c60TimerC as Timers, CounterMicro16C, RealMainP; AlarmFrom -> Timers.ALARM_MICRO16; AlarmFrom.Counter -> CounterMicro16C; AlarmInit -> Timers.ALARM_MICRO16; AlarmInit -> Timers.ALARM_MICRO16_CTRL; RealMainP.PlatformInit -> AlarmInit.Init; Alarm = AlarmFrom; } tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/AlarmMicro32C.nc000077500000000000000000000042621207233610700240450ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * 32-bit microsecond Alarm component as per TEP102 HAL guidelines. * * @author Fan Zhang */ generic configuration AlarmMicro32C() { provides interface Alarm; } implementation { components AlarmMicro16C as Alarm16, CounterMicro32C as Counter32; components new TransformAlarmC(TMicro, uint32_t, TMicro, uint16_t, 0) as Transform32; Alarm = Transform32; Transform32.AlarmFrom -> Alarm16; Transform32.Counter -> Counter32; } tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/BusyWaitMicroC.nc000077500000000000000000000055021207233610700244110ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of the HIL required micro busy wait. * For more information see TEP 102. * * @author Henrik Makitaavola */ module BusyWaitMicroC { provides interface BusyWait; } implementation { // TODO(henrik) This will now only work on 10Mhz speed, easy to // add a signal from the control module of the mcu // to signal the change of speed and the wait function // can adjust to it. // The wait function can not be inlined because then the code alignment may // go lost thus making the busy wait around 30% slower. async command void BusyWait.wait(uint16_t dt ) __attribute__((noinline)) { atomic { asm("nop"); // Nop needed to align function asm volatile ( "sub.w #1,%[t]\n\t" "jeq 2f\n\t" "sub.w #1,%[t]\n\t" "jeq 2f\n\t" "1:\n\t" "nop\n\t" "add.w #1,%[t]\n\t" "sub.w #1,%[t]\n\t" "sub.w #1,%[t]\n\t" "jgtu 1b\n\t" "2:" : : [t] "r" (dt) ); } } } tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/CounterMicro16C.nc000077500000000000000000000056101207233610700244300ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * CounterMicro16C provides a 16-bit TMicro counter. * It uses 2 hw timers, one generates a micro tick and the other * counts the micro ticks. * * @author Henrik Makitaavola * @see Please refer to TEP 102 for more information about this component. */ #include "TimerConfig.h" configuration CounterMicro16C { provides interface Counter; } implementation { // Counter components new M16c60Counter16C(TMicro) as CounterFrom; components new M16c60TimerAInitC(TMR_COUNTER_MODE, M16C_TMRA_TES_TA_NEXT, 0xFFFF, true, true, true) as CounterInit; // Source components new M16c60TimerAInitC(TMR_TIMER_MODE, M16C_TMR_CS_F1_2, (MAIN_CRYSTAL_SPEED - 1), false, true, true) as TimerSourceInit; components HplM16c60TimerC as Timers, RealMainP, McuSleepC; // Counter CounterFrom.Timer -> Timers.COUNTER_MICRO16; CounterInit -> Timers.COUNTER_MICRO16; CounterInit -> Timers.COUNTER_MICRO16_CTRL; RealMainP.PlatformInit -> CounterInit; Counter = CounterFrom; // Timer source TimerSourceInit -> Timers.MICRO16_SOURCE; TimerSourceInit -> Timers.MICRO16_SOURCE_CTRL; RealMainP.PlatformInit -> TimerSourceInit; } tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/CounterMicro32C.nc000077500000000000000000000042001207233610700244200ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * 32-bit microsecond Counter component as per TEP102 HAL guidelines. * * @author Fan Zhang */ configuration CounterMicro32C { provides interface Counter; } implementation { components CounterMicro16C as Counter16, new TransformCounterC(TMicro, uint32_t, TMicro, uint16_t, 0, uint16_t) as Transform32; Counter = Transform32; Transform32.CounterFrom -> Counter16; } tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/HilTimerMilliC.nc000077500000000000000000000104721207233610700243560ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Cory Sharp */ /** * HilTimerMilliC provides a parameterized interface to a virtualized * millisecond timer and local time in milli precision. TimerMilliC in * tos/system/ uses this component to allocate new timers. * See TEP 102 for more information. * * @author Henrik Makitaavola */ #include "TimerConfig.h" configuration HilTimerMilliC { provides interface Init; provides interface Timer as TimerMilli[ uint8_t num ]; provides interface LocalTime; } implementation { components new AlarmToTimerC(TMilli); components new VirtualizeTimerC(TMilli,uniqueCount(UQ_TIMER_MILLI)); components new CounterToLocalTimeC(TMilli); components HIL_TIMERS as AlarmCounterMilli32C; TimerMilli = VirtualizeTimerC; LocalTime = CounterToLocalTimeC; VirtualizeTimerC.TimerFrom -> AlarmToTimerC; AlarmToTimerC.Alarm -> AlarmCounterMilli32C.Alarm; CounterToLocalTimeC.Counter -> AlarmCounterMilli32C.Counter; Init = AlarmCounterMilli32C; } tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/LocalTimeMicroC.nc000077500000000000000000000042001207233610700245050ustar00rootroot00000000000000/* * Copyright (c) 2008, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ /** * This configuration provides a local time represented in Micro seconds. * * @author Henrik Makitaavola */ #include "Timer.h" configuration LocalTimeMicroC { provides interface LocalTime; } implementation { components CounterMicro16C; components new TransformCounterC(TMicro, uint32_t, TMicro, uint16_t, 0, uint32_t); components new CounterToLocalTimeC(TMicro); LocalTime = CounterToLocalTimeC; CounterToLocalTimeC.Counter -> TransformCounterC; TransformCounterC.CounterFrom -> CounterMicro16C; } tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/TimerConfig.h000077500000000000000000000100321207233610700235740ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The M16c/60 hardware timer configuration used by Mulle. * * STOP MODE ENABLED: * TB2 generates TMilli tics from the RV8564 chip. * TA0 and TA1 are used to create a 32 bit counter. TA0 counts * tics from TB2 and TA1 counts TA0 underflows. * TB0 and TB1 are used to create a 32 bit Alarm. TB0 counts * tics from TB2 and TB1 counts TB0 underflows. * * STOP MODE DISABLED: * TA0 generates TMilli tics. * TB0 generates TMilli tics. * TA1 is a 16 bit counter that counts tics from TA0. * TB1 is a 16 bit alarm that counts tics from TB0. * * ALWAYS USED: * NOTE: Counter timers are turned off when the mcu goes into stop mode. * TA3 generates TMicro tics. * TA2 is a 16 bit TMicro counter that counts tics from TA3. * TA4 is a 16 bit TMicro alarm that counts tics from TA3. * TB3 is a 16 bit Radio counter. * TB4 is a 16 bit Radio alarm. * * @author Henrik Makitaavola */ #ifndef __TIMERCONFIG_H__ #define __TIMERCONFIG_H__ #ifdef ENABLE_STOP_MODE #define HIL_TIMERS RV8564AlarmCounterMilli32C #else #define HIL_TIMERS AlarmCounterMilli32C #endif // Use hw timers alone. #define COUNTER_MILLI32_SOURCE TimerB0 #define COUNTER_MILLI32_SOURCE_CTRL TimerB0Ctrl #define COUNTER_MILLI32 TimerB1 #define COUNTER_MILLI32_CTRL TimerB1Ctrl #define ALARM_MILLI32_SOURCE TimerA0 #define ALARM_MILLI32_SOURCE_CTRL TimerA0Ctrl #define ALARM_MILLI32 TimerA1 #define ALARM_MILLI32_CTRL TimerA1Ctrl // End // Use the RV8564 chip to generate tics (stop mode enabled). #define MILLI32_SOURCE_RV8564 TimerB2 #define MILLI32_SOURCE_RV8564_CTRL TimerB2Ctrl #define COUNTER_MILLI32_LOW TimerA0 #define COUNTER_MILLI32_LOW_CTRL TimerA0Ctrl #define COUNTER_MILLI32_HIGH TimerA1 #define COUNTER_MILLI32_HIGH_CTRL TimerA1Ctrl #define ALARM_MILLI32_LOW TimerB0 #define ALARM_MILLI32_LOW_CTRL TimerB0Ctrl #define ALARM_MILLI32_HIGH TimerB1 #define ALARM_MILLI32_HIGH_CTRL TimerB1Ctrl // end // Common settings. #define COUNTER_MICRO16 TimerA2 #define COUNTER_MICRO16_CTRL TimerA2Ctrl #define MICRO16_SOURCE TimerA3 #define MICRO16_SOURCE_CTRL TimerA3Ctrl #define ALARM_MICRO16 TimerA4 #define ALARM_MICRO16_CTRL TimerA4Ctrl #define COUNTER_RF23016 TimerB3 #define COUNTER_RF23016_CTRL TimerB3Ctrl #define ALARM_RF23016 TimerB4 #define ALARM_RF23016_CTRL TimerB4Ctrl // end. #endif // __TIMERCONFIG_H__ tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/rf230/000077500000000000000000000000001207233610700220525ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/rf230/AlarmRF23016C.nc000066400000000000000000000050111207233610700243540ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * AlarmRF23016C provides a 16-bit TRF230 alarm. * It uses 1 hw timer that is used as a alarm and runs with * speed PLL_CLOCK_SPEED / 8. * * @author Henrik Makitaavola */ #include "TimerConfig.h" #include configuration AlarmRF23016C { provides interface Alarm; } implementation { components new M16c60Alarm16C(TRadio) as AlarmFrom; components new M16c60TimerBInitC(TMR_TIMER_MODE, M16C_TMR_CS_F8, 0, false, false, false) as AlarmInit; components HplM16c60TimerC as Timers, CounterRF23016C, RealMainP; AlarmFrom -> Timers.ALARM_RF23016; AlarmFrom.Counter -> CounterRF23016C; AlarmInit -> Timers.ALARM_RF23016; AlarmInit -> Timers.ALARM_RF23016_CTRL; RealMainP.PlatformInit -> AlarmInit; Alarm = AlarmFrom; } tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/rf230/CounterRF23016C.nc000066400000000000000000000047201207233610700247450ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * CounterRF23016C provides a 16-bit TRF230 counter. * It uses 1 hw timer that counts in PLL_CLOCK_SPEED / 8. * * @author Henrik Makitaavola */ #include "TimerConfig.h" #include configuration CounterRF23016C { provides interface Counter; } implementation { components new M16c60Counter16C(TRadio) as CounterFrom; components new M16c60TimerBInitC(TMR_TIMER_MODE, M16C_TMR_CS_F8, 0xFFFF, false, true, true) as CounterInit; components HplM16c60TimerC as Timers, RealMainP; CounterFrom.Timer -> Timers.COUNTER_RF23016; CounterInit -> Timers.COUNTER_RF23016; CounterInit -> Timers.COUNTER_RF23016_CTRL; RealMainP.PlatformInit -> CounterInit; Counter = CounterFrom; } tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/stop/000077500000000000000000000000001207233610700222035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/stop/RV8564AlarmCounterMilli32C.nc000077500000000000000000000102451207233610700271640ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * RV8564AlarmCounterMilli32C provides a 32-bit TMilli alarm and counter. * The counter and alarm is driven by the RV8564 chip on Mulle. This * allows the M16c/60 mcu to be put into stop mode even when the timers * are running. * * @author Henrik Makitaavola * @see Please refer to TEP 102 for more information about this component. */ #include "TimerConfig.h" configuration RV8564AlarmCounterMilli32C { provides interface Counter; provides interface Alarm; provides interface Init; } implementation { components new M16c60Counter32C(TMilli) as CounterFrom; components new M16c60TimerAInitC(TMR_COUNTER_MODE, M16C_TMRA_TES_TB2, 0xFFFF, false, true, true) as CounterInit1; components new M16c60TimerAInitC(TMR_COUNTER_MODE, M16C_TMRA_TES_TA_PREV, 0xFFFF, true, true, true) as CounterInit2; components new M16c60Alarm32C(TMilli) as AlarmFrom; components new M16c60TimerBInitC(TMR_COUNTER_MODE, M16C_TMRB_CTR_ES_TBj, 0, false, false, true) as AlarmInit1; components new M16c60TimerBInitC(TMR_COUNTER_MODE, M16C_TMRB_CTR_ES_TBj, 0, false, false, true) as AlarmInit2; components new M16c60TimerBInitC(TMR_COUNTER_MODE, M16C_TMRB_CTR_ES_TBiIN, 0, false, true, true) as TimerSourceInit; components HplM16c60TimerC as Timers, RV8564AlarmCounterMilli32P, HplM16c60InterruptC as Irqs, HplM16c60GeneralIOC as IOs; // Setup the IO pin that RV8564 generates the clock to. RV8564AlarmCounterMilli32P -> IOs.PortP92; Init = RV8564AlarmCounterMilli32P; // Counter CounterFrom.TimerLow -> Timers.COUNTER_MILLI32_LOW; CounterFrom.TimerHigh -> Timers.COUNTER_MILLI32_HIGH; CounterInit1 -> Timers.COUNTER_MILLI32_LOW; CounterInit1 -> Timers.COUNTER_MILLI32_LOW_CTRL; CounterInit2 -> Timers.COUNTER_MILLI32_HIGH; CounterInit2 -> Timers.COUNTER_MILLI32_HIGH_CTRL; Init = CounterInit1; Init = CounterInit2; Counter = CounterFrom; // Alarm AlarmFrom.ATimerLow -> Timers.ALARM_MILLI32_LOW; AlarmFrom.ATimerHigh -> Timers.ALARM_MILLI32_HIGH; AlarmFrom.Counter -> CounterFrom; AlarmInit1 -> Timers.ALARM_MILLI32_LOW; AlarmInit1 -> Timers.ALARM_MILLI32_LOW_CTRL; AlarmInit2 -> Timers.ALARM_MILLI32_HIGH; AlarmInit2 -> Timers.ALARM_MILLI32_HIGH_CTRL; Init = AlarmInit1; Init = AlarmInit2; Alarm = AlarmFrom; // Timer source TimerSourceInit -> Timers.MILLI32_SOURCE_RV8564; TimerSourceInit -> Timers.MILLI32_SOURCE_RV8564_CTRL; Init = TimerSourceInit; } tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/stop/RV8564AlarmCounterMilli32P.nc000077500000000000000000000041021207233610700271740ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Init the port that the RV8564 chip is generating its tics to (TB0 in). * * @author Henrik Makitaavola */ module RV8564AlarmCounterMilli32P { provides interface Init; uses interface GeneralIO as IO; } implementation { command error_t Init.init() { call IO.makeInput(); call IO.clr(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/wait/000077500000000000000000000000001207233610700221625ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/mulle/timers/wait/AlarmCounterMilli32C.nc000077500000000000000000000073441207233610700263520ustar00rootroot00000000000000/* * Copyright (c) 2009 Communication Group and Eislab at * Lulea University of Technology * * Contact: Laurynas Riliskis, LTU * Mail: laurynas.riliskis@ltu.se * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Communication Group at Lulea University of Technology * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * AlarmCounterMilli32C provides a 32-bit TMilli alarm and counter. * * @author Henrik Makitaavola * @see Please refer to TEP 102 for more information about this component. */ #include "TimerConfig.h" configuration AlarmCounterMilli32C { provides interface Counter; provides interface Alarm; provides interface Init; } implementation { components new M16c60Counter16C(TMilli) as CounterFrom; components new M16c60TimerBInitC(TMR_COUNTER_MODE, M16C_TMRB_CTR_ES_TBj, 0xFFFF, true, true, false) as CounterInit; components new M16c60TimerBInitC(TMR_TIMER_MODE, M16C_TMR_CS_F1_2, (1000 * MAIN_CRYSTAL_SPEED) - 1, false, true, true) as CounterSourceInit; components new TransformCounterC(TMilli,uint32_t, TMilli,uint16_t, 0,uint16_t) as TCounter; components new M16c60Alarm16C(TMilli) as AlarmFrom; components new M16c60TimerAInitC(TMR_COUNTER_MODE, M16C_TMRA_TES_TA_PREV, 0, false, false, false) as AlarmInit; components new M16c60TimerAInitC(TMR_TIMER_MODE, M16C_TMR_CS_F1_2, (1000 * MAIN_CRYSTAL_SPEED) - 1, false, true, true) as AlarmSourceInit; components new TransformAlarmC(TMilli,uint32_t,TMilli,uint16_t,0) as TAlarm; components HplM16c60TimerC as Timers; // Counter CounterFrom.Timer -> Timers.COUNTER_MILLI32; CounterInit -> Timers.COUNTER_MILLI32; CounterInit -> Timers.COUNTER_MILLI32_CTRL; Init = CounterInit; CounterSourceInit -> Timers.COUNTER_MILLI32_SOURCE; CounterSourceInit -> Timers.COUNTER_MILLI32_SOURCE_CTRL; Init = CounterSourceInit; // Alarm AlarmFrom -> Timers.ALARM_MILLI32; AlarmFrom.Counter -> CounterFrom; AlarmInit -> Timers.ALARM_MILLI32; AlarmInit -> Timers.ALARM_MILLI32_CTRL; Init = AlarmInit.Init; AlarmSourceInit -> Timers.ALARM_MILLI32_SOURCE; AlarmSourceInit -> Timers.ALARM_MILLI32_SOURCE_CTRL; Init = AlarmSourceInit; // Transformations TCounter.CounterFrom -> CounterFrom; Counter = TCounter; TAlarm.AlarmFrom -> AlarmFrom; TAlarm.Counter -> TCounter; Alarm = TAlarm; } tinyos-2.1.2+dfsg/tos/platforms/null/000077500000000000000000000000001207233610700175475ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/null/.platform000066400000000000000000000007771207233610700214070ustar00rootroot00000000000000# # FILE: null/.platform # # A do-nothing platform. A good target for mig when using external types. # # $Id: .platform,v 1.6 2009-11-14 06:51:21 razvanm Exp $ # push( @includes, qw( %T/lib/timer %T/lib/serial ) ); @opts = qw( -fnesc-target=pc -fnesc-no-debug ); if (defined($ENV{"GCC"})) { push @opts, "-gcc=$ENV{'GCC'}"; } else { push @opts, "-gcc=gcc"; } push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; tinyos-2.1.2+dfsg/tos/platforms/null/ActiveMessageC.nc000066400000000000000000000051571207233610700227240ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.6 2008-04-24 06:52:12 klueska Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Dummy implementation to support the null platform. */ module ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements as Acks; } } implementation { command error_t SplitControl.start() { return SUCCESS; } command error_t SplitControl.stop() { return SUCCESS; } command error_t AMSend.send[uint8_t id](am_addr_t addr, message_t* msg, uint8_t len) { return SUCCESS; } command error_t AMSend.cancel[uint8_t id](message_t* msg) { return SUCCESS; } command uint8_t AMSend.maxPayloadLength[uint8_t id]() { return 0; } command void* AMSend.getPayload[uint8_t id](message_t* msg, uint8_t len) { return NULL; } command void Packet.clear(message_t* msg) { } command uint8_t Packet.payloadLength(message_t* msg) { return 0; } command uint8_t Packet.maxPayloadLength() { return 0; } command void* Packet.getPayload(message_t* msg, uint8_t len) { return msg; } command void Packet.setPayloadLength(message_t* msg, uint8_t len) { } command am_addr_t AMPacket.address() { return 0; } command am_addr_t AMPacket.destination(message_t* amsg) { return 0; } command bool AMPacket.isForMe(message_t* amsg) { return FALSE; } command am_id_t AMPacket.type(message_t* amsg) { return 0; } command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { } command void AMPacket.setType(message_t* amsg, am_id_t t) { } command am_addr_t AMPacket.source(message_t* amsg) { return 0; } command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { } command am_group_t AMPacket.group(message_t* amsg) { return 0; } command void AMPacket.setGroup(message_t* amsg, am_group_t grp) { } command am_group_t AMPacket.localGroup() { return 0; } async command error_t Acks.requestAck( message_t* msg ) { return SUCCESS; } async command error_t Acks.noAck( message_t* msg ) { return SUCCESS; } async command bool Acks.wasAcked(message_t* msg) { return FALSE; } } tinyos-2.1.2+dfsg/tos/platforms/null/BlockStorageC.nc000066400000000000000000000022121207233610700225500ustar00rootroot00000000000000// $Id: BlockStorageC.nc,v 1.4 2006-12-12 18:23:44 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Dummy implementation to support the null platform. */ #include "Storage.h" generic module BlockStorageC(volume_id_t volid) { provides { interface BlockWrite; interface BlockRead; } } implementation { command error_t BlockWrite.write( storage_addr_t addr, void* buf, uint16_t len ) { return SUCCESS; } command error_t BlockWrite.erase() { return SUCCESS; } command error_t BlockWrite.commit() { return SUCCESS; } command error_t BlockRead.read( storage_addr_t addr, void* buf, uint16_t len ) { return SUCCESS; } command error_t BlockRead.verify() { return SUCCESS; } command error_t BlockRead.computeCrc( storage_addr_t addr, storage_len_t len ) { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/null/DemoSensorC.nc000066400000000000000000000015161207233610700222550ustar00rootroot00000000000000/* $Id: DemoSensorC.nc,v 1.4 2006-12-12 18:23:44 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Null platform demo sensor code. * * @author David Gay */ generic module DemoSensorC() { provides interface Read; provides interface ReadStream; } implementation { command error_t Read.read() { return SUCCESS; } command error_t ReadStream.postBuffer(uint16_t *buf, uint16_t count) { return SUCCESS; } command error_t ReadStream.read(uint32_t usPeriod) { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/null/DemoSensorNowC.nc000066400000000000000000000016731207233610700227450ustar00rootroot00000000000000/* $Id: DemoSensorNowC.nc,v 1.4 2006-12-12 18:23:44 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Null platform demo sensor code. * * @author David Gay */ generic module DemoSensorNowC() { provides interface Resource; provides interface ReadNow; } implementation { async command error_t Resource.request() { return SUCCESS; } async command error_t Resource.immediateRequest() { return SUCCESS; } async command error_t Resource.release() { return SUCCESS; } async command bool Resource.isOwner() { return TRUE; } async command error_t ReadNow.read() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/null/HilTimerMilliC.nc000066400000000000000000000030161207233610700227000ustar00rootroot00000000000000// $Id: HilTimerMilliC.nc,v 1.4 2006-12-12 18:23:44 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Dummy implementation to support the null platform. */ module HilTimerMilliC { provides interface Init; provides interface Timer as TimerMilli[ uint8_t num ]; provides interface LocalTime; } implementation { command error_t Init.init() { return SUCCESS; } command void TimerMilli.startPeriodic[ uint8_t num ]( uint32_t dt ) { } command void TimerMilli.startOneShot[ uint8_t num ]( uint32_t dt ) { } command void TimerMilli.stop[ uint8_t num ]() { } command bool TimerMilli.isRunning[ uint8_t num ]() { return FALSE; } command bool TimerMilli.isOneShot[ uint8_t num ]() { return FALSE; } command void TimerMilli.startPeriodicAt[ uint8_t num ]( uint32_t t0, uint32_t dt ) { } command void TimerMilli.startOneShotAt[ uint8_t num ]( uint32_t t0, uint32_t dt ) { } command uint32_t TimerMilli.getNow[ uint8_t num ]() { return 0; } command uint32_t TimerMilli.gett0[ uint8_t num ]() { return 0; } command uint32_t TimerMilli.getdt[ uint8_t num ]() { return 0; } async command uint32_t LocalTime.get() { return 0; } } tinyos-2.1.2+dfsg/tos/platforms/null/McuSleepC.nc000066400000000000000000000012541207233610700217130ustar00rootroot00000000000000// $Id: McuSleepC.nc,v 1.4 2006-12-12 18:23:44 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Dummy implementation to support the null platform. */ module McuSleepC { provides { interface McuSleep; interface McuPowerState; } } implementation { async command void McuSleep.sleep() { } async command void McuPowerState.update() { } } tinyos-2.1.2+dfsg/tos/platforms/null/PlatformC.nc000066400000000000000000000011331207233610700217560ustar00rootroot00000000000000// $Id: PlatformC.nc,v 1.4 2006-12-12 18:23:44 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Dummy implementation to support the null platform. */ module PlatformC { provides interface Init; } implementation { command error_t Init.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/null/PlatformLedsC.nc000066400000000000000000000035731207233610700226000ustar00rootroot00000000000000// $Id: PlatformLedsC.nc,v 1.5 2007-05-23 22:17:49 idgay Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Dummy implementation to support the null platform. */ module PlatformLedsC { provides interface GeneralIO as Led0; provides interface GeneralIO as Led1; provides interface GeneralIO as Led2; uses interface Init; } implementation { async command void Led0.set() { } async command void Led0.clr() { } async command void Led0.toggle() { } async command bool Led0.get() { return FALSE; } async command void Led0.makeInput() { } async command void Led0.makeOutput() { call Init.init(); } async command void Led1.set() { } async command void Led1.clr() { } async command void Led1.toggle() { } async command bool Led1.get() { return FALSE; } async command void Led1.makeInput() { } async command void Led1.makeOutput() { call Init.init(); } async command void Led2.set() { } async command void Led2.clr() { } async command void Led2.toggle() { } async command bool Led2.get() { return FALSE; } async command void Led2.makeInput() { } async command void Led2.makeOutput() { call Init.init(); } async command bool Led0.isInput() { return FALSE; } async command bool Led0.isOutput() { return FALSE; } async command bool Led1.isInput() { return FALSE; } async command bool Led1.isOutput() { return FALSE; } async command bool Led2.isInput() { return FALSE; } async command bool Led2.isOutput() { return FALSE; } } tinyos-2.1.2+dfsg/tos/platforms/null/PlatformSerialC.nc000066400000000000000000000024341207233610700231230ustar00rootroot00000000000000// $Id: PlatformSerialC.nc,v 1.5 2007-05-23 22:17:49 idgay Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Dummy implementation to support the null platform. */ module PlatformSerialC { provides interface StdControl; provides interface UartByte; provides interface UartStream; } implementation { command error_t StdControl.start() { return SUCCESS; } command error_t StdControl.stop() { return SUCCESS; } async command error_t UartByte.send( uint8_t byte ) { return SUCCESS; } async command error_t UartByte.receive( uint8_t* byte, uint8_t timeout ) { return SUCCESS; } async command error_t UartStream.send( uint8_t* buf, uint16_t len ) { return SUCCESS; } async command error_t UartStream.enableReceiveInterrupt() { return SUCCESS; } async command error_t UartStream.disableReceiveInterrupt() { return SUCCESS; } async command error_t UartStream.receive( uint8_t* buf, uint16_t len ) { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/null/Storage_chip.h000066400000000000000000000000001207233610700223150ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/null/hardware.h000066400000000000000000000016511207233610700215200ustar00rootroot00000000000000 #ifndef HARDWARE_H #define HARDWARE_H inline void __nesc_enable_interrupt() { } inline void __nesc_disable_interrupt() { } typedef uint8_t __nesc_atomic_t; typedef uint8_t mcu_power_t; inline __nesc_atomic_t __nesc_atomic_start(void) @spontaneous() { return 0; } inline void __nesc_atomic_end(__nesc_atomic_t x) @spontaneous() { } inline void __nesc_atomic_sleep() { } /* Floating-point network-type support */ typedef float nx_float __attribute__((nx_base_be(afloat))); inline float __nesc_ntoh_afloat(const void *COUNT(sizeof(float)) source) @safe() { float f; memcpy(&f, source, sizeof(float)); return f; } inline float __nesc_hton_afloat(void *COUNT(sizeof(float)) target, float value) @safe() { memcpy(target, &value, sizeof(float)); return value; } // enum so components can override power saving, // as per TEP 112. // As this is not a real platform, just set it to 0. enum { TOS_SLEEP_NONE = 0, }; #endif tinyos-2.1.2+dfsg/tos/platforms/null/platform.h000066400000000000000000000000001207233610700215320ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/null/platform_message.h000066400000000000000000000014321207233610700232500ustar00rootroot00000000000000// $Id: platform_message.h,v 1.4 2006-12-12 18:23:44 vlahan Exp $ /* * Copyright (c) 2005-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Dummy implementation to support the null platform. */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include "Serial.h" typedef union message_header { serial_header_t serial; } message_header_t; typedef union message_footer { nx_uint8_t dummy; } message_footer_t; typedef union message_metadata { nx_uint8_t dummy; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/000077500000000000000000000000001207233610700203025ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/.platform000066400000000000000000000037571207233610700221430ustar00rootroot00000000000000# Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. push ( @includes, "%T/chips/cortex/m3", "%T/chips/cortex/m3/sam3", "%T/chips/cortex/m3/sam3/s", "%T/chips/cortex/m3/sam3/nvic", "%T/chips/cortex/m3/sam3/s/nvic", "%T/chips/cortex/m3/sam3/pmc", "%T/chips/cortex/m3/sam3/s/pmc", "%T/chips/cortex/m3/sam3/supc", "%T/chips/cortex/m3/sam3/s/supc", "%T/chips/cortex/m3/sam3/timer", "%T/chips/cortex/m3/sam3/s/timer", "%T/chips/cortex/m3/sam3/eefc", "%T/chips/cortex/m3/sam3/s/eefc", "%T/chips/cortex/m3/sam3/wdtc", "%T/chips/cortex/m3/sam3/s/wdtc", "%T/chips/cortex/m3/sam3/matrix", "%T/chips/cortex/m3/sam3/s/matrix", "%T/chips/cortex/m3/sam3/pins", "%T/chips/cortex/m3/sam3/s/pins", "%T/chips/cortex/m3/sam3/smc", "%T/chips/cortex/m3/sam3/s/smc", "%T/chips/cortex/m3/sam3/uart", "%T/chips/cortex/m3/sam3/s/uart", "%T/chips/cortex/m3/sam3/pdc", "%T/chips/cortex/m3/sam3/s/pdc", "%T/chips/cortex/m3/sam3/spi", "%T/chips/cortex/m3/sam3/s/spi", "%T/chips/cortex/m3/sam3/s/adc", "%T/chips/cortex/m3/sam3/s/dacc", "%T/chips/cortex/m3/sam3/s/pwm", "%T/chips/cc2520", "%T/chips/cc2520/layers", "%T/chips/cc2520/util", "%T/platforms/sam3s_ek/lcd", "%T/platforms/sam3s_ek/chips/cc2520", "%T/lib/timer", "%T/lib/serial", "%T/lib/power", "%T/lib/rfxlink/layers", "%T/lib/rfxlink/util", ); @opts = qw( -gcc=arm-none-eabi-gcc -mcpu=cortex-m3 -nostartfiles -fnesc-target=env -fnesc-no-debug ); push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{NESC_MACHINE} = "structure_size_boundary=32, pointer=4,4 float=4,4 double=8,4 long_double=8,4 short=2,2 int=4,4 long=4,4 long_long=8,4 int1248_align=1,2,4,4 wchar_size_size=4,4 char_wchar_signed=false,true"; tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/ActiveMessageC.nc000066400000000000000000000044461207233610700234570ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai * Author: Thomas Schmid (adapted to CC2520) */ #include configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface SendNotifier[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketTimeStamp as PacketTimeStampMicro; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2520ActiveMessageC as MessageC; components RadioControlP, HplSam3TCC; //SplitControl = MessageC; SplitControl = RadioControlP; RadioControlP.LowRadioControl -> MessageC; RadioControlP.TC -> HplSam3TCC.TC0; // We use TIOA1 which is channel 1 on TC0 AMSend = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; SendNotifier = MessageC; Packet = MessageC; AMPacket = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketLink = MessageC; RadioChannel = MessageC; PacketTimeStampMilli = MessageC; PacketTimeStampMicro = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/Ieee154MessageC.nc000066400000000000000000000034541207233610700233430ustar00rootroot00000000000000/* * "Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ /** * * @author Stephen Dawson-Haggerty */ configuration Ieee154MessageC { provides { interface SplitControl; interface Resource as SendResource[uint8_t clientId]; interface Ieee154Send; interface Receive as Ieee154Receive; interface Ieee154Packet; interface Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; interface LowPowerListening; interface PacketLink; } } implementation { components CC2420Ieee154MessageC as Msg; SplitControl = Msg; SendResource = Msg; Ieee154Send = Msg; Ieee154Receive = Msg; Ieee154Packet = Msg; Packet = Msg; PacketAcknowledgements = Msg; LinkPacketMetadata = Msg; LowPowerListening = Msg; PacketLink = Msg; } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/LedsP.nc000066400000000000000000000076111207233610700216400ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * The implementation of the standard 3 LED mote abstraction. * Adapted because LED 2 (red) is active high on SAM3U_EK. * * @author Joe Polastre * @author Philip Levis * @author Wanja Hofer * * @date March 21, 2005 */ module LedsP @safe() { provides { interface Init; interface Leds; } uses { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; } } implementation { command error_t Init.init() { atomic { dbg("Init", "LEDS: initialized.\n"); call Led0.makeOutput(); call Led1.makeOutput(); call Led2.makeOutput(); call Led0.clr(); call Led1.set(); call Led2.set(); } return SUCCESS; } /* Note: the call is inside the dbg, as it's typically a read of a volatile location, so can't be deadcode eliminated */ #define DBGLED(n) \ dbg("LedsC", "LEDS: Led" #n " %s.\n", call Led ## n .get() ? "off" : "on"); async command void Leds.led0On() { call Led0.set(); DBGLED(0); } async command void Leds.led0Off() { call Led0.clr(); DBGLED(0); } async command void Leds.led0Toggle() { call Led0.toggle(); DBGLED(0); } async command void Leds.led1On() { call Led1.clr(); DBGLED(1); } async command void Leds.led1Off() { call Led1.set(); DBGLED(1); } async command void Leds.led1Toggle() { call Led1.toggle(); DBGLED(1); } async command void Leds.led2On() { call Led2.clr(); DBGLED(2); } async command void Leds.led2Off() { call Led2.set(); DBGLED(2); } async command void Leds.led2Toggle() { call Led2.toggle(); DBGLED(2); } async command uint8_t Leds.get() { uint8_t rval; atomic { rval = 0; if (!call Led0.get()) { rval |= LEDS_LED0; } if (!call Led1.get()) { rval |= LEDS_LED1; } if (call Led2.get()) { rval |= LEDS_LED2; } } return rval; } async command void Leds.set(uint8_t val) { atomic { if (val & LEDS_LED0) { call Leds.led0On(); } else { call Leds.led0Off(); } if (val & LEDS_LED1) { call Leds.led1On(); } else { call Leds.led1Off(); } if (val & LEDS_LED2) { call Leds.led2On(); } else { call Leds.led2Off(); } } } } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/MoteClockC.nc000066400000000000000000000034731207233610700226160ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ configuration MoteClockC { provides { interface Init; } } implementation { components MoteClockP, HplSam3sClockC; Init = MoteClockP; MoteClockP.HplSam3Clock -> HplSam3sClockC; components LedsC; MoteClockP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/MoteClockP.nc000066400000000000000000000105371207233610700226320ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Basic Clock Initialization. * * @author Thomas Schmid */ #include "sam3spmchardware.h" #include "sam3ssupchardware.h" #include "sam3eefchardware.h" #include "sam3wdtchardware.h" #include "sam3matrixhardware.h" extern void SetDefaultMaster(unsigned char enable); module MoteClockP { provides { interface Init; } uses { interface HplSam3Clock; interface Leds; } } implementation { command error_t Init.init(){ wdtc_mr_t mr = WDTC->mr; eefc_fmr_t fmr = EEFC0->fmr; // Set 2 WS for Embedded Flash Access fmr.bits.fws = 3; EEFC0->fmr = fmr; // Disable Watchdog mr.bits.wddis = 1; WDTC->mr = mr; // Select external slow clock call HplSam3Clock.slckExternalOsc(); //call HplSam3Clock.slckRCOsc(); // Initialize main oscillator call HplSam3Clock.mckInit48(); //call HplSam3Clock.mckInit12RC(); // Enable clock for UART // FIXME: this should go into the UART start/stop! //PMC->pcdr.bits.dbgu = 1; /* Optimize CPU setting for speed */ SetDefaultMaster(1); return SUCCESS; } //------------------------------------------------------------------------------ /// Enable or disable default master access /// \param enable 1 enable defaultMaster settings, 0 disable it. //------------------------------------------------------------------------------ void SetDefaultMaster(unsigned char enable) @C() { // Set default master if (enable == 1) { // Set default master: SRAM0 -> Cortex-M3 System MATRIX->scfg0.bits.fixed_defmstr = 1; MATRIX->scfg0.bits.defmstr_type = MATRIX_SCFG_MASTER_TYPE_FIXED_DEFAULT; // Set default master: SRAM1 -> Cortex-M3 System MATRIX->scfg1.bits.fixed_defmstr = 1; MATRIX->scfg1.bits.defmstr_type = MATRIX_SCFG_MASTER_TYPE_FIXED_DEFAULT; // Set default master: Internal flash0 -> Cortex-M3 Instruction/Data MATRIX->scfg3.bits.fixed_defmstr = 0; MATRIX->scfg3.bits.defmstr_type = MATRIX_SCFG_MASTER_TYPE_FIXED_DEFAULT; } else { // Clear default master: SRAM0 -> Cortex-M3 System MATRIX->scfg0.bits.defmstr_type = MATRIX_SCFG_MASTER_TYPE_NO_DEFAULT; // Clear default master: SRAM1 -> Cortex-M3 System MATRIX->scfg1.bits.defmstr_type = MATRIX_SCFG_MASTER_TYPE_NO_DEFAULT; // Clear default master: Internal flash0 -> Cortex-M3 Instruction/Data MATRIX->scfg3.bits.defmstr_type = MATRIX_SCFG_MASTER_TYPE_NO_DEFAULT; } } /** * informs us when the main clock changes */ async event void HplSam3Clock.mainClockChanged() {} } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/PlatformC.nc000066400000000000000000000043561207233610700225230ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Wanja Hofer */ #include "hardware.h" configuration PlatformC { provides { /* Called after platform_bootstrap() and Scheduler.init() (see TEP 107) * I/O pin configuration, clock calibration, and LED configuration */ interface Init; } } implementation { components PlatformP, MoteClockC, HplSam3TCC as MoteTimerC; components McuSleepC; Init = PlatformP; PlatformP.MoteClockInit -> MoteClockC; PlatformP.IRQInit -> MoteClockC; PlatformP.MoteTimerInit -> MoteTimerC; // Used so we can initialize the platform in a state where it would draw // the lowest current possible if put to sleep. PlatformP.Sam3LowPower -> McuSleepC; } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/PlatformLedsC.nc000066400000000000000000000041431207233610700233250ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Connection of LEDs to the GPIO pins on the SAM3S-EK board. * * @author Thomas Schmid */ configuration PlatformLedsC { provides { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; } uses { interface Init; } } implementation { components HplSam3sGeneralIOC as IO; components PlatformP; Init = PlatformP.LedsInit; Led0 = IO.PioC20; // Pin C20 = RED, active high Led1 = IO.PioA19; // Pin A19 = BLUE, active low Led2 = IO.PioA20; // Pin A20 = GREEN, active low } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/PlatformP.nc000066400000000000000000000045071207233610700225360ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Wanja Hofer */ #include "hardware.h" module PlatformP { provides { interface Init; } uses { interface Init as LedsInit; interface Init as MoteClockInit; interface Init as IRQInit; interface Init as MoteTimerInit; interface Sam3LowPower; } } implementation { command error_t Init.init() { /* I/O pin configuration, clock calibration, and LED configuration * (see TEP 107) */ call IRQInit.init(); call MoteClockInit.init(); call MoteTimerInit.init(); call LedsInit.init(); return SUCCESS; } async event void Sam3LowPower.customizePio() { // currently not optimized for sam3s-ek } default command error_t LedsInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/PlatformSerialC.nc000066400000000000000000000035451207233610700236620ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Wanja Hofer */ configuration PlatformSerialC { provides { interface StdControl; interface UartStream; interface UartByte; } } implementation { components HilSam3UartC; StdControl = HilSam3UartC; UartStream = HilSam3UartC; UartByte = HilSam3UartC; } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/TimeSyncMessageC.nc000077500000000000000000000045751207233610700240050ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ #include configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC2520TimeSyncMessageC as MAC; SplitControl = MAC; Receive = MAC.Receive; Snoop = MAC.Snoop; Packet = MAC; AMPacket = MAC; TimeSyncAMSendRadio = MAC; TimeSyncPacketRadio = MAC; TimeSyncAMSendMilli = MAC; TimeSyncPacketMilli = MAC; } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/chips/000077500000000000000000000000001207233610700214105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/chips/cc2520/000077500000000000000000000000001207233610700223065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/chips/cc2520/CC2520SpiConfigC.nc000066400000000000000000000056061207233610700253420ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ module CC2520SpiConfigC { provides { interface Init; interface ResourceConfigure; } uses { interface HplSam3SpiChipSelConfig; interface HplSam3SpiConfig; } } implementation { command error_t Init.init() { // configure clock call HplSam3SpiChipSelConfig.setBaud(20); call HplSam3SpiChipSelConfig.setClockPolarity(0); // logic zero is inactive call HplSam3SpiChipSelConfig.setClockPhase(1); // out on rising, in on falling call HplSam3SpiChipSelConfig.disableAutoCS(); // disable automatic rising of CS after each transfer //call HplSam3SpiChipSelConfig.enableAutoCS(); // if the CS line is not risen automatically after the last tx. The lastxfer bit has to be used. call HplSam3SpiChipSelConfig.enableCSActive(); //call HplSam3SpiChipSelConfig.disableCSActive(); call HplSam3SpiChipSelConfig.setBitsPerTransfer(SPI_CSR_BITS_8); call HplSam3SpiChipSelConfig.setTxDelay(0); call HplSam3SpiChipSelConfig.setClkDelay(0); return SUCCESS; } async command void ResourceConfigure.configure() { // Do stuff here } async command void ResourceConfigure.unconfigure() { // Do stuff here... } } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/chips/cc2520/CounterRadio32C.nc000066400000000000000000000043231207233610700255000ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * CounterRadioC provides a 32-bit counter for the radio. It provides the * link between TRadio (generic radio timestamping precision) and the actual * timer implementations. * * @author Thomas Schmid * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration CounterRadio32C { provides interface Counter; } implementation { components HilSam3TCCounterTMicroC as CounterFrom; components new TransformCounterC(TMicro,uint32_t,TMicro,uint16_t,0,uint16_t) as Transform; Counter = Transform; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/chips/cc2520/HplCC2520C.nc000066400000000000000000000070411207233610700241770ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ #include configuration HplCC2520C { provides { interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface GpioInterrupt as FifoInterrupt; interface SpiByte; interface SpiPacket; interface Resource as SpiResource; //interface FastSpiByte; //interface GeneralIO as SLP_TR; //interface GeneralIO as RSTN; //interface GpioCapture as IRQ; interface Alarm as Alarm; interface LocalTime as LocalTimeRadio; } } implementation { components new Sam3Spi2C() as SpiC; SpiResource = SpiC; SpiByte = SpiC; SpiPacket = SpiC; components CC2520SpiConfigC as RadioSpiConfigC; RadioSpiConfigC.Init <- SpiC; RadioSpiConfigC.ResourceConfigure <- SpiC; RadioSpiConfigC.HplSam3SpiChipSelConfig -> SpiC; /* components HplSam3sGeneralIOC as IO; SLP_TR = IO.PioC22; RSTN = IO.PioC27; SELN = IO.PioA19; components HplSam3sGeneralIOC; IRQ = HplSam3sGeneralIOC.CapturePioB1; */ components HplSam3sGeneralIOC as IO; CCA = IO.PioA25; // need to remove R26 & R36! CSN = IO.PioB2; FIFO = IO.PioA24; // need to remove R27 & R37! FIFOP = IO.PioA16; RSTN = IO.PioA18; SFD = IO.PioA15; VREN = IO.PioA17; components new GpioCaptureC() as SfdCaptureC; components HplSam3TCC; SfdCapture = SfdCaptureC; SfdCaptureC.TCCapture -> HplSam3TCC.TC1Capture; // TIOA1 SfdCaptureC.GeneralIO -> IO.HplPioA15; FifopInterrupt = IO.InterruptPioA16; FifoInterrupt = IO.InterruptPioA24; components new AlarmTMicro16C() as AlarmC; Alarm = AlarmC; components LocalTimeMicroC; LocalTimeRadio = LocalTimeMicroC; } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/chips/cc2520/RadioConfig.h000066400000000000000000000057531207233610700246550ustar00rootroot00000000000000/* * Copyright (c) 2010, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai, Miklos Maroti * Author: Thomas Schmid (adapted for CC2520) */ #ifndef __RADIOCONFIG_H__ #define __RADIOCONFIG_H__ #include #include //#include /* This is the default value of the PA_POWER field of the TXCTL register. */ #ifndef CC2520_DEF_RFPOWER #define CC2520_DEF_RFPOWER 0 #endif /* This is the default value of the CHANNEL field of the FSCTRL register. */ #ifndef CC2520_DEF_CHANNEL #define CC2520_DEF_CHANNEL 11 #endif /* The number of microseconds a sending mote will wait for an acknowledgement */ #ifndef SOFTWAREACK_TIMEOUT #define SOFTWAREACK_TIMEOUT 800 #endif /** * This is the timer type of the radio alarm interface */ typedef TMicro TRadio; typedef uint16_t tradio_size; /** * The number of radio alarm ticks per one microsecond . * * Removed three '0s because of overflow... */ #define RADIO_ALARM_MICROSEC 48000 / 2 / 1000 enum cc2520_timing_enums { CC2520_SYMBOL_TIME = 16 * RADIO_ALARM_MICROSEC, // 16us IDLE_2_RX_ON_TIME = 12 * CC2520_SYMBOL_TIME, PD_2_IDLE_TIME = 860 * RADIO_ALARM_MICROSEC, // .86ms }; /** * The base two logarithm of the number of radio alarm ticks per one millisecond */ // FIXME: this needs to be calibrated #define RADIO_ALARM_MILLI_EXP (5) /** * Make PACKET_LINK automaticaly enabled for Ieee154MessageC */ #if !defined(TFRAMES_ENABLED) && !defined(PACKET_LINK) #define PACKET_LINK #endif #endif//__RADIOCONFIG_H__ tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/chips/cc2520/RadioControlP.nc000066400000000000000000000045721207233610700253570ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * * @author Thomas Schmid */ module RadioControlP{ provides interface SplitControl as HighRadioControl; uses interface SplitControl as LowRadioControl; uses interface HplSam3TC as TC; } implementation{ command error_t HighRadioControl.start(){ // start TC0 call TC.enableTC1(); return call LowRadioControl.start(); } command error_t HighRadioControl.stop(){ // stop TC1 call TC.disableTC1(); return call LowRadioControl.stop(); } event void LowRadioControl.startDone(error_t error){ signal HighRadioControl.startDone(error); } event void LowRadioControl.stopDone(error_t error) { signal HighRadioControl.stopDone(error); } default event void HighRadioControl.startDone(error_t error) {} default event void HighRadioControl.stopDone(error_t error) {} } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/hardware.h000066400000000000000000000047141207233610700222560ustar00rootroot00000000000000/* * Copyright (c) 2010 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Definitions of stuff specific to the SAM3S-EK board. * Includes definitions for the SAM3S MCU. * * @author Thomas Schmid */ #ifndef HARDWARE_H #define HARDWARE_H #include "sam3shardware.h" // #define this so we don't doubly define time_t with conflicting types // in SD card implementation Time.h file #define __time_t_defined #include #ifndef PLATFORM_BAUDRATE #define PLATFORM_BAUDRATE (57600) #endif #define IRQ_PRIO_UDPHS (0x81) #define IRQ_PRIO_TWI1 (0x82) #define IRQ_PRIO_TWI0 (0x83) #define IRQ_PRIO_DMAC (0x84) #define IRQ_PRIO_ADC (0x85) #define IRQ_PRIO_DAC (0x85) #define IRQ_PRIO_PWM (0x85) #define IRQ_PRIO_PIO (0x86) #define IRQ_PRIO_SPI (0x87) #define IRQ_PRIO_UART (0x88) #define IRQ_PRIO_USART0 (0x89) #define IRQ_PRIO_USART1 (0x90) #define IRQ_PRIO_USART2 (0x91) #define IRQ_PRIO_HSMCI (0x92) #endif // HARDWARE_H tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/000077500000000000000000000000001207233610700210445ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/Draw.nc000066400000000000000000000061611207233610700222670ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * @author Thomas Schmid **/ interface Draw { async command void fill(uint32_t color); async command void drawPixel( uint32_t x, uint32_t y, uint32_t c); async command void drawRectangle( uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t color); async command void drawString( uint32_t x, uint32_t y, const char *pString, uint32_t color); async command void drawStringWithBGColor( uint32_t x, uint32_t y, const char *pString, uint32_t fontColor, uint32_t bgColor); async command void drawInt( uint32_t x, uint32_t y, uint32_t n, int8_t sign, uint32_t fontColor); async command void drawIntWithBGColor( uint32_t x, uint32_t y, uint32_t n, int8_t sign, uint32_t fontColor, uint32_t bgColor); async command void getStringSize( const char *pString, uint32_t *pWidth, uint32_t *pHeight); async command void drawChar( uint32_t x, uint32_t y, char c, uint32_t color); async command void drawCharWithBGColor( uint32_t x, uint32_t y, char c, uint32_t fontColor, uint32_t bgColor); } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/Hx8347.nc000066400000000000000000000044641207233610700223030ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * @author Thomas Schmid **/ interface Hx8347 { async command void writeReg(void *pLcdBase, uint8_t reg, uint16_t data); async command uint16_t readReg(void *pLcdBase, uint8_t reg); async command uint16_t readStatus(void *pLcdBase); async command void writeRAM_Prepare(void *pLcdBase); async command void writeRAM(void *pLcdBase, uint16_t color); async command uint16_t readRAM(void *pLcdBase); command void initialize(void *pLcdBase); event void initializeDone(error_t err); async command void setCursor(void *pLcdBase, uint16_t x, uint16_t y); command void on(void *pLcdBase); event void onDone(); async command void off(void *pLcdBase); } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/Hx8347C.nc000066400000000000000000000350761207233610700224110ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * @author Thomas Schmid **/ module Hx8347C { uses { interface Timer as InitTimer; interface Timer as OnTimer; } provides interface Hx8347; } implementation { typedef volatile uint16_t REG16; enum { INIT0, INIT1, INIT2, }; uint8_t initState = INIT0; enum { ON0, ON1, ON2, }; uint8_t onState = ON0; void* spLcdBase; #define BOARD_LCD_RS (1 << 1) // LCD index register address #define LCD_IR(baseAddr) (*((REG16 *)(baseAddr))) // LCD status register address #define LCD_SR(baseAddr) (*((REG16 *)(baseAddr))) // LCD data address #define LCD_D(baseAddr) (*((REG16 *)((uint32_t)(baseAddr) + BOARD_LCD_RS))) // HX8347 ID code #define HX8347_HIMAXID_CODE 0x47 // HX8347 LCD Registers #define HX8347_R00H 0x00 #define HX8347_R01H 0x01 #define HX8347_R02H 0x02 #define HX8347_R03H 0x03 #define HX8347_R04H 0x04 #define HX8347_R05H 0x05 #define HX8347_R06H 0x06 #define HX8347_R07H 0x07 #define HX8347_R08H 0x08 #define HX8347_R09H 0x09 #define HX8347_R0AH 0x0A #define HX8347_R0CH 0x0C #define HX8347_R0DH 0x0D #define HX8347_R0EH 0x0E #define HX8347_R0FH 0x0F #define HX8347_R10H 0x10 #define HX8347_R11H 0x11 #define HX8347_R12H 0x12 #define HX8347_R13H 0x13 #define HX8347_R14H 0x14 #define HX8347_R15H 0x15 #define HX8347_R16H 0x16 #define HX8347_R18H 0x18 #define HX8347_R19H 0x19 #define HX8347_R1AH 0x1A #define HX8347_R1BH 0x1B #define HX8347_R1CH 0x1C #define HX8347_R1DH 0x1D #define HX8347_R1EH 0x1E #define HX8347_R1FH 0x1F #define HX8347_R20H 0x20 #define HX8347_R21H 0x21 #define HX8347_R22H 0x22 #define HX8347_R23H 0x23 #define HX8347_R24H 0x24 #define HX8347_R25H 0x25 #define HX8347_R26H 0x26 #define HX8347_R27H 0x27 #define HX8347_R28H 0x28 #define HX8347_R29H 0x29 #define HX8347_R2AH 0x2A #define HX8347_R2BH 0x2B #define HX8347_R2CH 0x2C #define HX8347_R2DH 0x2D #define HX8347_R35H 0x35 #define HX8347_R36H 0x36 #define HX8347_R37H 0x37 #define HX8347_R38H 0x38 #define HX8347_R39H 0x39 #define HX8347_R3AH 0x3A #define HX8347_R3BH 0x3B #define HX8347_R3CH 0x3C #define HX8347_R3DH 0x3D #define HX8347_R3EH 0x3E #define HX8347_R40H 0x40 #define HX8347_R41H 0x41 #define HX8347_R42H 0x42 #define HX8347_R43H 0x43 #define HX8347_R44H 0x44 #define HX8347_R45H 0x45 #define HX8347_R46H 0x46 #define HX8347_R47H 0x47 #define HX8347_R48H 0x48 #define HX8347_R49H 0x49 #define HX8347_R4AH 0x4A #define HX8347_R4BH 0x4B #define HX8347_R4CH 0x4C #define HX8347_R4DH 0x4D #define HX8347_R4EH 0x4E #define HX8347_R4FH 0x4F #define HX8347_R50H 0x50 #define HX8347_R51H 0x51 #define HX8347_R64H 0x64 #define HX8347_R65H 0x65 #define HX8347_R66H 0x66 #define HX8347_R67H 0x67 #define HX8347_R70H 0x70 #define HX8347_R72H 0x72 #define HX8347_R90H 0x90 #define HX8347_R91H 0x91 #define HX8347_R93H 0x93 #define HX8347_R94H 0x94 #define HX8347_R95H 0x95 /** * Write data to LCD Register. * \param pLcdBase LCD base address. * \param reg Register address. * \param data Data to be written. */ async command void Hx8347.writeReg(void *pLcdBase, uint8_t reg, uint16_t data) { LCD_IR(pLcdBase) = reg; LCD_D(pLcdBase) = data; } /** * Read data from LCD Register. * \param pLcdBase LCD base address. * \param reg Register address. * \return data Data to be read. */ async command uint16_t Hx8347.readReg(void *pLcdBase, uint8_t reg) { LCD_IR(pLcdBase) = reg; return LCD_D(pLcdBase); } /** * Read LCD status Register. * \param pLcdBase LCD base address. * \param reg Register address. * \return data Status Data. */ async command uint16_t Hx8347.readStatus(void *pLcdBase) { return LCD_SR(pLcdBase); } /** * Prepare to write GRAM data. * \param pLcdBase LCD base address. */ async command void Hx8347.writeRAM_Prepare(void *pLcdBase) { LCD_IR(pLcdBase) = HX8347_R22H; } /** * Write data to LCD GRAM. * \param pLcdBase LCD base address. * \param color 16-bits RGB color. */ async command void Hx8347.writeRAM(void *pLcdBase, uint16_t color) { // Write 16-bit GRAM Reg LCD_D(pLcdBase) = color; } /** * Read GRAM data. * \param pLcdBase LCD base address. * \return 16-bits RGB color. */ async command uint16_t Hx8347.readRAM(void *pLcdBase) { // Read 16-bit GRAM Reg return LCD_D(pLcdBase); } event void InitTimer.fired() { // advance in the initialization call Hx8347.initialize(spLcdBase); } /** * Initialize the LCD controller. * \param pLcdBase LCD base address. */ command void Hx8347.initialize(void *pLcdBase) { uint16_t chipid; switch(initState) { case INIT0: spLcdBase = pLcdBase; // Check HX8347 chipid chipid = call Hx8347.readReg(pLcdBase, HX8347_R67H); if(chipid != HX8347_HIMAXID_CODE) { // Read HX8347 chip ID error, skip initialization. signal Hx8347.initializeDone(FAIL); return ; } // Start internal OSC call Hx8347.writeReg(pLcdBase, HX8347_R19H, 0x49); // OSCADJ=10 0000, OSD_EN=1 //60Hz call Hx8347.writeReg(pLcdBase, HX8347_R93H, 0x0C); // RADJ=1100 // Power on flow call Hx8347.writeReg(pLcdBase, HX8347_R44H, 0x4D); // VCM=100 1101 call Hx8347.writeReg(pLcdBase, HX8347_R45H, 0x11); // VDV=1 0001 call Hx8347.writeReg(pLcdBase, HX8347_R20H, 0x40); // BT=0100 call Hx8347.writeReg(pLcdBase, HX8347_R1DH, 0x07); // VC1=111 call Hx8347.writeReg(pLcdBase, HX8347_R1EH, 0x00); // VC3=000 call Hx8347.writeReg(pLcdBase, HX8347_R1FH, 0x04); // VRH=0100 call Hx8347.writeReg(pLcdBase, HX8347_R1CH, 0x04); // AP=100 call Hx8347.writeReg(pLcdBase, HX8347_R1BH, 0x10); // GASENB=0, PON=1, DK=0, XDK=0, DDVDH_TRI=0, STB=0 initState = INIT1; call InitTimer.startOneShot(50); break; case INIT1: call Hx8347.writeReg(pLcdBase, HX8347_R43H, 0x80); // Set VCOMG=1 initState = INIT2; call InitTimer.startOneShot(50); break; case INIT2: // Gamma for CMO 2.8 call Hx8347.writeReg(pLcdBase, HX8347_R46H, 0x95); call Hx8347.writeReg(pLcdBase, HX8347_R47H, 0x51); call Hx8347.writeReg(pLcdBase, HX8347_R48H, 0x00); call Hx8347.writeReg(pLcdBase, HX8347_R49H, 0x36); call Hx8347.writeReg(pLcdBase, HX8347_R4AH, 0x11); call Hx8347.writeReg(pLcdBase, HX8347_R4BH, 0x66); call Hx8347.writeReg(pLcdBase, HX8347_R4CH, 0x14); call Hx8347.writeReg(pLcdBase, HX8347_R4DH, 0x77); call Hx8347.writeReg(pLcdBase, HX8347_R4EH, 0x13); call Hx8347.writeReg(pLcdBase, HX8347_R4FH, 0x4C); call Hx8347.writeReg(pLcdBase, HX8347_R50H, 0x46); call Hx8347.writeReg(pLcdBase, HX8347_R51H, 0x46); //240x320 window setting call Hx8347.writeReg(pLcdBase, HX8347_R02H, 0x00); // Column address start2 call Hx8347.writeReg(pLcdBase, HX8347_R03H, 0x00); // Column address start1 call Hx8347.writeReg(pLcdBase, HX8347_R04H, 0x00); // Column address end2 call Hx8347.writeReg(pLcdBase, HX8347_R05H, 0xEF); // Column address end1 call Hx8347.writeReg(pLcdBase, HX8347_R06H, 0x00); // Row address start2 call Hx8347.writeReg(pLcdBase, HX8347_R07H, 0x00); // Row address start1 call Hx8347.writeReg(pLcdBase, HX8347_R08H, 0x01); // Row address end2 call Hx8347.writeReg(pLcdBase, HX8347_R09H, 0x3F); // Row address end1 // Display Setting call Hx8347.writeReg(pLcdBase, HX8347_R01H, 0x06); // IDMON=0, INVON=1, NORON=1, PTLON=0 call Hx8347.writeReg(pLcdBase, HX8347_R16H, 0xC8); // MY=1, MX=1, MV=0, BGR=1 call Hx8347.writeReg(pLcdBase, HX8347_R23H, 0x95); // N_DC=1001 0101 call Hx8347.writeReg(pLcdBase, HX8347_R24H, 0x95); // P_DC=1001 0101 call Hx8347.writeReg(pLcdBase, HX8347_R25H, 0xFF); // I_DC=1111 1111 call Hx8347.writeReg(pLcdBase, HX8347_R27H, 0x06); // N_BP=0000 0110 call Hx8347.writeReg(pLcdBase, HX8347_R28H, 0x06); // N_FP=0000 0110 call Hx8347.writeReg(pLcdBase, HX8347_R29H, 0x06); // P_BP=0000 0110 call Hx8347.writeReg(pLcdBase, HX8347_R2AH, 0x06); // P_FP=0000 0110 call Hx8347.writeReg(pLcdBase, HX8347_R2CH, 0x06); // I_BP=0000 0110 call Hx8347.writeReg(pLcdBase, HX8347_R2DH, 0x06); // I_FP=0000 0110 call Hx8347.writeReg(pLcdBase, HX8347_R3AH, 0x01); // N_RTN=0000, N_NW=001 call Hx8347.writeReg(pLcdBase, HX8347_R3BH, 0x01); // P_RTN=0000, P_NW=001 call Hx8347.writeReg(pLcdBase, HX8347_R3CH, 0xF0); // I_RTN=1111, I_NW=000 call Hx8347.writeReg(pLcdBase, HX8347_R3DH, 0x00); // DIV=00 call Hx8347.writeReg(pLcdBase, HX8347_R3EH, 0x38); // SON=38h call Hx8347.writeReg(pLcdBase, HX8347_R40H, 0x0F); // GDON=0Fh call Hx8347.writeReg(pLcdBase, HX8347_R41H, 0xF0); // GDOF=F0h initState = INIT0; signal Hx8347.initializeDone(SUCCESS); break; } } event void OnTimer.fired() { call Hx8347.on(spLcdBase); } /** * Turn on the LCD. * \param pLcdBase LCD base address. */ command void Hx8347.on(void *pLcdBase) { switch(onState) { case ON0: // Display ON Setting spLcdBase = pLcdBase; call Hx8347.writeReg(pLcdBase, HX8347_R90H, 0x7F); // SAP=0111 1111 call Hx8347.writeReg(pLcdBase, HX8347_R26H, 0x04); // GON=0, DTE=0, D=01 call OnTimer.startOneShot(100); onState = ON1; break; case ON1: call Hx8347.writeReg(pLcdBase, HX8347_R26H, 0x24); // GON=1, DTE=0, D=01 call Hx8347.writeReg(pLcdBase, HX8347_R26H, 0x2C); // GON=1, DTE=0, D=11 call OnTimer.startOneShot(100); onState = ON2; break; case ON2: call Hx8347.writeReg(pLcdBase, HX8347_R26H, 0x3C); // GON=1, DTE=1, D=11 onState = ON0; signal Hx8347.onDone(); break; } } /** * Turn off the LCD. * \param pLcdBase LCD base address. */ async command void Hx8347.off(void *pLcdBase) { call Hx8347.writeReg(pLcdBase, HX8347_R90H, 0x00); // SAP=0000 0000 call Hx8347.writeReg(pLcdBase, HX8347_R26H, 0x00); // GON=0, DTE=0, D=00 } /** * Set cursor of LCD srceen. * \param pLcdBase LCD base address. * \param x X-coordinate of upper-left corner on LCD. * \param y Y-coordinate of upper-left corner on LCD. */ async command void Hx8347.setCursor(void *pLcdBase, uint16_t x, uint16_t y) { uint8_t x1, x2, y1l, y2; x1 = x & 0xff; x2 = (x & 0xff00) >>8; y1l = y & 0xff; y2 = (y & 0xff00) >>8; call Hx8347.writeReg(pLcdBase, HX8347_R02H, x2); // column high call Hx8347.writeReg(pLcdBase, HX8347_R03H, x1); // column low call Hx8347.writeReg(pLcdBase, HX8347_R06H, y2); // row high call Hx8347.writeReg(pLcdBase, HX8347_R07H, y1l); // row low } default event void Hx8347.initializeDone(error_t err) {}; default event void Hx8347.onDone() {}; } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/Ili9325.nc000066400000000000000000000050201207233610700224230ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * @author Thomas Schmid **/ interface Ili9325 { async command void writeReg(void *pLcdBase, uint8_t reg, uint16_t data); async command uint16_t readReg(void *pLcdBase, uint8_t reg); async command void writeRAM_Prepare(void *pLcdBase); async command void writeRAM(void *pLcdBase, uint32_t color); async command void readRAM_Prepare(void *pLcdBase); async command uint16_t readRAM(void *pLcdBase); command void initialize(void *pLcdBase); event void initializeDone(error_t err); async command void setCursor(void *pLcdBase, uint16_t x, uint16_t y); command void on(void *pLcdBase); async command void off(void *pLcdBase); async command void powerDown(void *pLcdBase); async command void setDisplayPortrait(void *pLcdBase, uint32_t dwRGB); async command void setWindow( void *pLcdBase, uint32_t dwX, uint32_t dwY, uint32_t dwWidth, uint32_t dwHeight ); } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/Ili9325C.nc000077500000000000000000000335221207233610700225410ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * * @author Thomas Schmid */ #include "ili9325.h" module Ili9325C { uses { interface Timer as InitTimer; } provides interface Ili9325; } implementation { enum { INIT0, INIT1, INIT2, INIT3, INIT4, }; void* spLcdBase; uint8_t initState = INIT0; /** * \brief Write data to LCD Register. * * \param reg Register address. * \param data Data to be written. */ async command void Ili9325.writeReg( void *pLcdBase, uint8_t reg, uint16_t data ) { LCD_IR(pLcdBase) = 0; LCD_IR(pLcdBase) = reg; LCD_D(pLcdBase) = (data >> 8) & 0xFF; LCD_D(pLcdBase) = data & 0xFF; } /** * \brief Read data from LCD Register. * * \param reg Register address. * * \return Readed data. */ async command uint16_t Ili9325.readReg(void *pLcdBase, uint8_t reg ) { uint16_t value; LCD_IR(pLcdBase) = 0; LCD_IR(pLcdBase) = reg; value = LCD_D(pLcdBase); value = (value << 8) | LCD_D(pLcdBase); return value; } /** * \brief Prepare to write GRAM data. */ async command void Ili9325.writeRAM_Prepare( void *pLcdBase) { LCD_IR(pLcdBase) = 0 ; LCD_IR(pLcdBase) = ILI9325_R22H ; /* Write Data to GRAM (R22h) */ } /** * \brief Write data to LCD GRAM. * * \param color 24-bits RGB color. */ async command void Ili9325.writeRAM(void *pLcdBase, uint32_t dwColor ) { LCD_D(pLcdBase) = ((dwColor >> 16) & 0xFF); LCD_D(pLcdBase) = ((dwColor >> 8) & 0xFF); LCD_D(pLcdBase) = (dwColor & 0xFF); } /** * \brief Prepare to read GRAM data. */ async command void Ili9325.readRAM_Prepare( void *pLcdBase) { LCD_IR(pLcdBase) = 0 ; LCD_IR(pLcdBase) = ILI9325_R22H ; /* Write Data to GRAM (R22h) */ } /** * \brief Read data to LCD GRAM. * * \return color 24-bits RGB color. */ async command uint16_t Ili9325.readRAM( void *pLcdBase) { uint8_t value[2]; uint16_t color; value[0] = LCD_D(pLcdBase); /* dummy read */ value[1] = LCD_D(pLcdBase); /* dummy read */ value[0] = LCD_D(pLcdBase); /* data upper byte */ value[1] = LCD_D(pLcdBase); /* data lower byte */ color = ((value[0] << 8) | (value[1] & 0xff)); return color; } /** * \brief Initialize the LCD controller. */ command void Ili9325.initialize( void *pLcdBase) { uint16_t chipid ; switch(initState) { case INIT0: spLcdBase = pLcdBase; /* Check ILI9325 chipid */ chipid = call Ili9325.readReg(pLcdBase, ILI9325_R00H ) ; /* Driver Code Read (R00h) */ if ( chipid != ILI9325_DEVICE_CODE ) { signal Ili9325.initializeDone(FAIL); return; } /* Turn off LCD */ call Ili9325.powerDown(pLcdBase) ; /* Start initial sequence */ call Ili9325.writeReg(pLcdBase, ILI9325_R10H, 0x0000); /* DSTB = LP = STB = 0 */ call Ili9325.writeReg(pLcdBase, ILI9325_R00H, 0x0001); /* start internal OSC */ call Ili9325.writeReg(pLcdBase, ILI9325_R01H, ILI9325_R01H_SS ) ; /* set SS and SM bit */ call Ili9325.writeReg(pLcdBase, ILI9325_R02H, 0x0700); /* set 1 line inversion */ //LCD_writeReg(ILI9325_R03H, 0xD030); /* set GRAM write direction and BGR=1. */ call Ili9325.writeReg(pLcdBase, ILI9325_R04H, 0x0000); /* Resize register */ call Ili9325.writeReg(pLcdBase, ILI9325_R08H, 0x0207); /* set the back porch and front porch */ call Ili9325.writeReg(pLcdBase, ILI9325_R09H, 0x0000); /* set non-display area refresh cycle ISC[3:0] */ call Ili9325.writeReg(pLcdBase, ILI9325_R0AH, 0x0000); /* FMARK function */ call Ili9325.writeReg(pLcdBase, ILI9325_R0CH, 0x0000); /* RGB interface setting */ call Ili9325.writeReg(pLcdBase, ILI9325_R0DH, 0x0000); /* Frame marker Position */ call Ili9325.writeReg(pLcdBase, ILI9325_R0FH, 0x0000); /* RGB interface polarity */ /* Power on sequence */ call Ili9325.writeReg(pLcdBase, ILI9325_R10H, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ call Ili9325.writeReg(pLcdBase, ILI9325_R11H, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ call Ili9325.writeReg(pLcdBase, ILI9325_R12H, 0x0000); /* VREG1OUT voltage */ call Ili9325.writeReg(pLcdBase, ILI9325_R13H, 0x0000); /* VDV[4:0] for VCOM amplitude */ initState = INIT1; call InitTimer.startOneShot(200); break; case INIT1: call Ili9325.writeReg(pLcdBase, ILI9325_R10H, 0x1290); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ call Ili9325.writeReg(pLcdBase, ILI9325_R11H, 0x0227); /* DC1[2:0], DC0[2:0], VC[2:0] */ initState = INIT2; call InitTimer.startOneShot(50); break; case INIT2: call Ili9325.writeReg(pLcdBase, ILI9325_R12H, 0x001B); /* Internal reference voltage= Vci; */ initState = INIT3; call InitTimer.startOneShot(50); break; case INIT3: call Ili9325.writeReg(pLcdBase, ILI9325_R13H, 0x1100); /* Set VDV[4:0] for VCOM amplitude */ call Ili9325.writeReg(pLcdBase, ILI9325_R29H, 0x0019); /* Set VCM[5:0] for VCOMH */ call Ili9325.writeReg(pLcdBase, ILI9325_R2BH, 0x000D); /* Set Frame Rate */ initState = INIT4; call InitTimer.startOneShot(50); break; case INIT4: /* Adjust the Gamma Curve */ call Ili9325.writeReg(pLcdBase, ILI9325_R30H, 0x0000); call Ili9325.writeReg(pLcdBase, ILI9325_R31H, 0x0204); call Ili9325.writeReg(pLcdBase, ILI9325_R32H, 0x0200); call Ili9325.writeReg(pLcdBase, ILI9325_R35H, 0x0007); call Ili9325.writeReg(pLcdBase, ILI9325_R36H, 0x1404); call Ili9325.writeReg(pLcdBase, ILI9325_R37H, 0x0705); call Ili9325.writeReg(pLcdBase, ILI9325_R38H, 0x0305); call Ili9325.writeReg(pLcdBase, ILI9325_R39H, 0x0707); call Ili9325.writeReg(pLcdBase, ILI9325_R3CH, 0x0701); call Ili9325.writeReg(pLcdBase, ILI9325_R3DH, 0x000e); call Ili9325.setDisplayPortrait(pLcdBase, 0); /* Vertical Scrolling */ call Ili9325.writeReg(pLcdBase, ILI9325_R61H, 0x0001 ) ; call Ili9325.writeReg(pLcdBase, ILI9325_R6AH, 0x0000 ) ; /* Partial Display Control */ call Ili9325.writeReg(pLcdBase, ILI9325_R80H, 0x0000); call Ili9325.writeReg(pLcdBase, ILI9325_R81H, 0x0000); call Ili9325.writeReg(pLcdBase, ILI9325_R82H, 0x0000); call Ili9325.writeReg(pLcdBase, ILI9325_R83H, 0x0000); call Ili9325.writeReg(pLcdBase, ILI9325_R84H, 0x0000); call Ili9325.writeReg(pLcdBase, ILI9325_R85H, 0x0000); /* Panel Control */ call Ili9325.writeReg(pLcdBase, ILI9325_R90H, 0x0010); call Ili9325.writeReg(pLcdBase, ILI9325_R92H, 0x0600); call Ili9325.writeReg(pLcdBase, ILI9325_R95H, 0x0110); call Ili9325.setWindow( pLcdBase, 0, 0, BOARD_LCD_WIDTH, BOARD_LCD_HEIGHT ) ; call Ili9325.setCursor( pLcdBase, 0, 0 ) ; initState = INIT0; signal Ili9325.initializeDone(SUCCESS); break; } } event void InitTimer.fired() { call Ili9325.initialize(spLcdBase); } /** * \brief Turn on the LCD. */ command void Ili9325.on( void *pLcdBase ) { /* Display Control 1 (R07h) */ /* When BASEE = 1, the base image is displayed. */ /* GON and DTE Set the output level of gate driver G1 ~ G320 : Normal Display */ /* D1=1 D0=1 BASEE=1: Base image display Operate */ call Ili9325.writeReg(pLcdBase, ILI9325_R07H, ILI9325_R07H_BASEE | ILI9325_R07H_GON | ILI9325_R07H_DTE | ILI9325_R07H_D1 | ILI9325_R07H_D0 ) ; } /** * \brief Turn off the LCD. */ async command void Ili9325.off( void *pLcdBase) { /* Display Control 1 (R07h) */ /* When BASEE = 0, no base image is displayed. */ /* When the display is turned off by setting D[1:0] = 00, the ILI9325 internal display operation is halted completely. */ /* PTDE1/0 = 0: turns off partial image. */ call Ili9325.writeReg(pLcdBase, ILI9325_R07H, 0x00 ) ; } /** * \brief Power down the LCD. */ async command void Ili9325.powerDown( void *pLcdBase) { /* Display Control 1 (R07h) */ /* When BASEE = 0, no base image is displayed. */ /* GON and DTE Set the output level of gate driver G1 ~ G320 : Normal Display */ /* D1=1 D0=1 BASEE=1: Base image display Operate */ call Ili9325.writeReg(pLcdBase, ILI9325_R07H, ILI9325_R07H_GON | ILI9325_R07H_DTE | ILI9325_R07H_D1 | ILI9325_R07H_D0 ) ; } /** * \brief Set cursor of LCD srceen. * * \param x X-coordinate of upper-left corner on LCD. * \param y Y-coordinate of upper-left corner on LCD. */ async command void Ili9325.setCursor( void *pLcdBase, uint16_t x, uint16_t y ) { /* GRAM Horizontal/Vertical Address Set (R20h, R21h) */ call Ili9325.writeReg(pLcdBase, ILI9325_R20H, x ) ; /* column */ call Ili9325.writeReg(pLcdBase, ILI9325_R21H, y ) ; /* row */ } async command void Ili9325.setDisplayPortrait(void *pLcdBase, uint32_t dwRGB) { uint16_t dwValue = 0 ; /* When AM = 1, the address is updated in vertical writing direction. */ /* DFM Set the mode of transferring data to the internal RAM when TRI = 1. */ /* When TRI = 1, data are transferred to the internal RAM in 8-bit x 3 transfers mode via the 8-bit interface. */ /* Use the high speed write mode (HWM=1) */ /* ORG = 1: The original address 00000h moves according to the I/D[1:0] setting. */ /* I/D[1:0] = 00 Horizontal : decrement Vertical : decrement, AM=0:Horizontal */ dwValue = ILI9325_R03H_AM | ILI9325_R03H_DFM | ILI9325_R03H_TRI | ILI9325_R03H_HWM; //| ILI9325_R03H_ORG ; if ( dwRGB == 0 ) { /* BGR=1: Swap the RGB data to BGR in writing into GRAM. */ dwValue |= ILI9325_R03H_BGR ; } call Ili9325.writeReg(pLcdBase, ILI9325_R03H, dwValue ) ; // LCD_WriteReg( ILI9325_R60H, (0x1d<<8)|0x00 ) ; /*Gate Scan Control */ call Ili9325.setWindow( pLcdBase, 0, 0, BOARD_LCD_HEIGHT, BOARD_LCD_WIDTH ) ; } async command void Ili9325.setWindow( void *pLcdBase, uint32_t dwX, uint32_t dwY, uint32_t dwWidth, uint32_t dwHeight ) { /* Horizontal and Vertical RAM Address Position (R50h, R51h, R52h, R53h) */ /* Set Horizontal Address Start Position */ call Ili9325.writeReg( pLcdBase, ILI9325_R50H, (uint16_t)dwX ) ; /* Set Horizontal Address End Position */ call Ili9325.writeReg( pLcdBase, ILI9325_R51H, (uint16_t)dwX+dwWidth-1 ) ; /* Set Vertical Address Start Position */ call Ili9325.writeReg( pLcdBase, ILI9325_R52H, (uint16_t)dwY ) ; /* Set Vertical Address End Position */ call Ili9325.writeReg( pLcdBase, ILI9325_R53H, (uint16_t)dwY+dwHeight-1 ) ; } default event void Ili9325.initializeDone(error_t err) {}; } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/Lcd.nc000066400000000000000000000036711207233610700220770ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * @author Thomas Schmid **/ interface Lcd { command void initialize(); event void initializeDone(error_t err); command void * displayBuffer(void *pBuffer); command void start(); event void startDone(); command void stop(); command void setBacklight (uint8_t step); } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/LcdC.nc000066400000000000000000000053451207233610700222020ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * @author Thomas Schmid **/ configuration LcdC { provides { interface Lcd; interface Draw; } } implementation { components LcdP, Ili9325C; Lcd = LcdP.Lcd; Draw = LcdP.Draw; LcdP.Ili9325 -> Ili9325C; components new TimerMilliC() as T0; Ili9325C.InitTimer -> T0; components HplSam3sGeneralIOC; LcdP.DB0 -> HplSam3sGeneralIOC.HplPioC0; LcdP.DB1 -> HplSam3sGeneralIOC.HplPioC1; LcdP.DB2 -> HplSam3sGeneralIOC.HplPioC2; LcdP.DB3 -> HplSam3sGeneralIOC.HplPioC3; LcdP.DB4 -> HplSam3sGeneralIOC.HplPioC4; LcdP.DB5 -> HplSam3sGeneralIOC.HplPioC5; LcdP.DB6 -> HplSam3sGeneralIOC.HplPioC6; LcdP.DB7 -> HplSam3sGeneralIOC.HplPioC7; LcdP.LCD_RS -> HplSam3sGeneralIOC.HplPioC19; LcdP.NRD -> HplSam3sGeneralIOC.HplPioC11; LcdP.NWE -> HplSam3sGeneralIOC.HplPioC8; LcdP.NCS -> HplSam3sGeneralIOC.HplPioC15; LcdP.Backlight -> HplSam3sGeneralIOC.PioC13; components HplSam3sClockC; LcdP.ClockControl -> HplSam3sClockC.SMCCntl; } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/LcdP.nc000066400000000000000000000377421207233610700222250ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * @author Thomas Schmid **/ #include #include "lcd.h" #include "color.h" #include "font.h" #include "font10x14.h" module LcdP { uses { interface Ili9325; interface HplSam3GeneralIOPin as DB0; interface HplSam3GeneralIOPin as DB1; interface HplSam3GeneralIOPin as DB2; interface HplSam3GeneralIOPin as DB3; interface HplSam3GeneralIOPin as DB4; interface HplSam3GeneralIOPin as DB5; interface HplSam3GeneralIOPin as DB6; interface HplSam3GeneralIOPin as DB7; interface HplSam3GeneralIOPin as LCD_RS; interface HplSam3GeneralIOPin as NRD; interface HplSam3GeneralIOPin as NWE; interface HplSam3GeneralIOPin as NCS; interface GeneralIO as Backlight; interface HplSam3PeripheralClockCntl as ClockControl; } provides { interface Lcd; interface Draw; } } implementation { #define RGB24ToRGB16(color) (((color >> 8) & 0xF800) | \ ((color >> 5) & 0x7E0) | \ ((color >> 3) & 0x1F)) #define BOARD_LCD_BASE 0x61000000 const Font gFont = {10, 14}; /** * Initializes the LCD controller. * \param pLcdBase LCD base address. */ command void Lcd.initialize(void) { smc_setup_t setup; smc_pulse_t pulse; smc_cycle_t cycle; smc_mode_t mode; // Enable pins call DB0.disablePioControl(); call DB0.selectPeripheralA(); call DB0.enablePullUpResistor(); call DB1.disablePioControl(); call DB1.selectPeripheralA(); call DB1.enablePullUpResistor(); call DB2.disablePioControl(); call DB2.selectPeripheralA(); call DB2.enablePullUpResistor(); call DB3.disablePioControl(); call DB3.selectPeripheralA(); call DB3.enablePullUpResistor(); call DB4.disablePioControl(); call DB4.selectPeripheralA(); call DB4.enablePullUpResistor(); call DB5.disablePioControl(); call DB5.selectPeripheralA(); call DB5.enablePullUpResistor(); call DB6.disablePioControl(); call DB6.selectPeripheralA(); call DB6.enablePullUpResistor(); call DB7.disablePioControl(); call DB7.selectPeripheralA(); call DB7.enablePullUpResistor(); call LCD_RS.disablePioControl(); call LCD_RS.selectPeripheralA(); call LCD_RS.enablePullUpResistor(); call NRD.disablePioControl(); call NRD.selectPeripheralA(); call NRD.enablePullUpResistor(); call NWE.disablePioControl(); call NWE.selectPeripheralA(); call NWE.enablePullUpResistor(); call NCS.disablePioControl(); call NCS.selectPeripheralA(); call NCS.enablePullUpResistor(); // Enable peripheral clock call ClockControl.enable(); // Enable pins call Backlight.makeOutput(); // EBI SMC Configuration setup.flat = 0; setup.bits.nwe_setup = 2; setup.bits.ncs_wr_setup = 2; setup.bits.nrd_setup = 2; setup.bits.ncs_rd_setup = 2; SMC_CS1->setup = setup; pulse.flat = 0; pulse.bits.nwe_pulse = 4; pulse.bits.ncs_wr_pulse = 4; pulse.bits.nrd_pulse = 10; pulse.bits.ncs_rd_pulse = 10; SMC_CS1->pulse = pulse; cycle.flat = 0; cycle.bits.nwe_cycle = 10; cycle.bits.nrd_cycle = 22; SMC_CS1->cycle = cycle; mode.bits.read_mode = 1; mode.bits.write_mode = 1; mode.bits.dbw = 0; // 8-bit operations mode.bits.pmen = 0; SMC_CS1->mode = mode; // Initialize LCD controller (HX8347) call Ili9325.initialize((void *)BOARD_LCD_BASE); } event void Ili9325.initializeDone(error_t err) { if(err == SUCCESS) call Lcd.setBacklight(25); signal Lcd.initializeDone(err); } /** * Turn on the LCD */ command void Lcd.start(void) { call Ili9325.on((void *)BOARD_LCD_BASE); signal Lcd.startDone(); } /** * Turn off the LCD */ command void Lcd.stop(void) { call Ili9325.off((void *)BOARD_LCD_BASE); } /** * Set the backlight of the LCD. * \param level Backlight brightness level [1..32], 32 is maximum level. */ command void Lcd.setBacklight (uint8_t level) { uint32_t i; // Switch off backlight call Backlight.clr(); i = 800 * (48000000 / 1000000); // wait for at least 500us while(i--); // Set new backlight level for (i = 0; i < level; i++) { call Backlight.clr(); call Backlight.clr(); call Backlight.clr(); call Backlight.set(); call Backlight.set(); call Backlight.set(); } } command void* Lcd.displayBuffer(void* pBuffer) { return (void *) BOARD_LCD_BASE; } /** * Fills the given LCD buffer with a particular color. * Only works in 24-bits packed mode for now. * \param color Fill color. */ async command void Draw.fill(uint32_t color) { uint32_t i; call Ili9325.setCursor((void *)BOARD_LCD_BASE, 0, 0); call Ili9325.writeRAM_Prepare((void *)BOARD_LCD_BASE); for (i = 0; i < (BOARD_LCD_WIDTH * BOARD_LCD_HEIGHT); i++) { call Ili9325.writeRAM((void *)BOARD_LCD_BASE, color); } } /** * Sets the specified pixel to the given color. * !!! Only works in 24-bits packed mode for now. !!! * \param x X-coordinate of pixel. * \param y Y-coordinate of pixel. * \param color Pixel color. */ async command void Draw.drawPixel( uint32_t x, uint32_t y, uint32_t color) { void* pBuffer = (void*)BOARD_LCD_BASE; call Ili9325.setCursor(pBuffer, BOARD_LCD_WIDTH - x, y); call Ili9325.writeRAM_Prepare(pBuffer); call Ili9325.writeRAM(pBuffer, color); } /** * Draws a rectangle inside a LCD buffer, at the given coordinates. * \param x X-coordinate of upper-left rectangle corner. * \param y Y-coordinate of upper-left rectangle corner. * \param width Rectangle width in pixels. * \param height Rectangle height in pixels. * \param color Rectangle color. */ async command void Draw.drawRectangle( uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t color) { uint32_t rx, ry; for (ry=0; ry < height; ry++) { for (rx=0; rx < width; rx++) { call Draw.drawPixel(x+rx, y+ry, color); } } } /** * Draws a string inside a LCD buffer, at the given coordinates. Line breaks * will be honored. * \param x X-coordinate of string top-left corner. * \param y Y-coordinate of string top-left corner. * \param pString String to display. * \param color String color. */ async command void Draw.drawString( uint32_t x, uint32_t y, const char *pString, uint32_t color) { uint32_t xorg = x; while (*pString != 0) { if (*pString == '\n') { y += gFont.height + 2; x = xorg; } else { call Draw.drawChar(x, y, *pString, color); x += gFont.width + 2; } pString++; } } /** * Draws a string inside a LCD buffer, at the given coordinates. Line breaks * will be honored. * \param x X-coordinate of string top-left corner. * \param y Y-coordinate of string top-left corner. * \param pString String to display. * \param color String color. */ async command void Draw.drawStringWithBGColor( uint32_t x, uint32_t y, const char *pString, uint32_t fontColor, uint32_t bgColor) { uint32_t xorg = x; while (*pString != 0) { if (*pString == '\n') { y += gFont.height + 2; x = xorg; } else { call Draw.drawCharWithBGColor(x, y, *pString, fontColor, bgColor); x += gFont.width + 2; } pString++; } } /** * Draws an integer inside the LCD buffer * \param x X-Coordinate of the integers top-right corner. * \param y Y-Coordinate of the integers top-right corner. * \param n Number to be printed on the screen * \param sign <0 if negative number, >=0 if positive * \param fontColor Integer color. */ async command void Draw.drawInt( uint32_t x, uint32_t y, uint32_t n, int8_t sign, uint32_t fontColor) { uint8_t i; i = 0; do { /* generate digits in reverse order */ char c = n % 10 + '0'; /* get next digit */ if (i%3 == 0 && i>0) { call Draw.drawChar(x, y, '\'', fontColor); x -= (gFont.width + 2); } call Draw.drawChar(x, y, c, fontColor); x -= (gFont.width + 2); i++; } while ((n /= 10) > 0); /* delete it */ if (sign < 0) call Draw.drawChar(x, y, '-', fontColor); } /** * Draws an integer inside the LCD buffer * \param x X-Coordinate of the integers top-right corner. * \param y Y-Coordinate of the integers top-right corner. * \param n Number to be printed on the screen * \param sign <0 if negative number, >=0 if positive * \param color Integer color. * \param bgColor Color of the background. */ async command void Draw.drawIntWithBGColor( uint32_t x, uint32_t y, uint32_t n, int8_t sign, uint32_t fontColor, uint32_t bgColor) { uint8_t i; i = 0; do { /* generate digits in reverse order */ char c = n % 10 + '0'; /* get next digit */ if (i%3 == 0 && i>0) { call Draw.drawChar(x, y, '\'', fontColor); x -= (gFont.width + 2); } call Draw.drawCharWithBGColor(x, y, c, fontColor, bgColor); x -= (gFont.width + 2); i++; } while ((n /= 10) > 0); /* delete it */ if (sign < 0) call Draw.drawCharWithBGColor(x, y, '-', fontColor, bgColor); } /** * Returns the width & height in pixels that a string will occupy on the screen * if drawn using Draw.drawString. * \param pString String. * \param pWidth Pointer for storing the string width (optional). * \param pHeight Pointer for storing the string height (optional). * \return String width in pixels. */ async command void Draw.getStringSize( const char *pString, uint32_t *pWidth, uint32_t *pHeight) { uint32_t width = 0; uint32_t height = gFont.height; while (*pString != 0) { if (*pString == '\n') { height += gFont.height + 2; } else { width += gFont.width + 2; } pString++; } if (width > 0) width -= 2; if (pWidth) *pWidth = width; if (pHeight) *pHeight = height; } /** * Draws an ASCII character on the given LCD buffer. * \param x X-coordinate of character upper-left corner. * \param y Y-coordinate of character upper-left corner. * \param c Character to output. * \param color Character color. */ async command void Draw.drawChar( uint32_t x, uint32_t y, char c, uint32_t color) { uint32_t row, col; if(!((c >= 0x20) && (c <= 0x7F))) { return; } for (col = 0; col < 10; col++) { for (row = 0; row < 8; row++) { if ((pCharset10x14[((c - 0x20) * 20) + col * 2] >> (7 - row)) & 0x1) { call Draw.drawPixel(x+col, y+row, color); } } for (row = 0; row < 6; row++) { if ((pCharset10x14[((c - 0x20) * 20) + col * 2 + 1] >> (7 - row)) & 0x1) { call Draw.drawPixel(x+col, y+row+8, color); } } } } /** * Draws an ASCII character on the given LCD buffer. * \param x X-coordinate of character upper-left corner. * \param y Y-coordinate of character upper-left corner. * \param c Character to output. * \param fontColor Character foreground color. * \param bgColor Background color of character */ async command void Draw.drawCharWithBGColor( uint32_t x, uint32_t y, char c, uint32_t fontColor, uint32_t bgColor) { uint32_t row, col; if(!((c >= 0x20) && (c <= 0x7F))) { return; } for (col = 0; col < 10; col++) { for (row = 0; row < 8; row++) { if ((pCharset10x14[((c - 0x20) * 20) + col * 2] >> (7 - row)) & 0x1) { call Draw.drawPixel(x+col, y+row, fontColor); } else { call Draw.drawPixel(x+col, y+row, bgColor); } } for (row = 0; row < 6; row++) { if ((pCharset10x14[((c - 0x20) * 20) + col * 2 + 1] >> (7 - row)) & 0x1) { call Draw.drawPixel(x+col, y+row+8, fontColor); } else { call Draw.drawPixel(x+col, y+row+8, bgColor); } } } } } tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/color.h000066400000000000000000000066251207233610700223440ustar00rootroot00000000000000/* * Copyright (c) Atmel * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef COLOR_H #define COLOR_H //------------------------------------------------------------------------------ /// RGB 24 Bpp /// RGB 888 /// R7R6R5R4 R3R2R1R0 G7G6G5G4 G3G2G1G0 B7B6B5B4 B3B2B1B0 //------------------------------------------------------------------------------ #define COLOR_BLACK 0x000000 #define COLOR_WHITE 0xFFFFFF #define COLOR_BLUE 0x0000FF #define COLOR_GREEN 0x00FF00 #define COLOR_RED 0xFF0000 #define COLOR_NAVY 0x000080 #define COLOR_DARKBLUE 0x00008B #define COLOR_DARKGREEN 0x006400 #define COLOR_DARKCYAN 0x008B8B #define COLOR_CYAN 0x00FFFF #define COLOR_TURQUOISE 0x40E0D0 #define COLOR_INDIGO 0x4B0082 #define COLOR_DARKRED 0x800000 #define COLOR_OLIVE 0x808000 #define COLOR_GRAY 0x808080 #define COLOR_SKYBLUE 0x87CEEB #define COLOR_BLUEVIOLET 0x8A2BE2 #define COLOR_LIGHTGREEN 0x90EE90 #define COLOR_DARKVIOLET 0x9400D3 #define COLOR_YELLOWGREEN 0x9ACD32 #define COLOR_BROWN 0xA52A2A #define COLOR_DARKGRAY 0xA9A9A9 #define COLOR_SIENNA 0xA0522D #define COLOR_LIGHTBLUE 0xADD8E6 #define COLOR_GREENYELLOW 0xADFF2F #define COLOR_SILVER 0xC0C0C0 #define COLOR_LIGHTGREY 0xD3D3D3 #define COLOR_LIGHTCYAN 0xE0FFFF #define COLOR_VIOLET 0xEE82EE #define COLOR_AZUR 0xF0FFFF #define COLOR_BEIGE 0xF5F5DC #define COLOR_MAGENTA 0xFF00FF #define COLOR_TOMATO 0xFF6347 #define COLOR_GOLD 0xFFD700 #define COLOR_ORANGE 0xFFA500 #define COLOR_SNOW 0xFFFAFA #define COLOR_YELLOW 0xFFFF00 #endif // #define COLOR_H tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/font.h000066400000000000000000000040371207233610700221670ustar00rootroot00000000000000/* * Copyright (c) Atmel * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef FONT_H #define FONT_H //------------------------------------------------------------------------------ /// Describes the font (width, height, supported characters, etc.) used by /// the LCD driver draw API. //------------------------------------------------------------------------------ typedef struct _Font { /// Font width in pixels. unsigned char width; /// Font height in pixels. unsigned char height; } Font; #endif //#ifndef FONT_H tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/font10x14.h000066400000000000000000000330151207233610700226630ustar00rootroot00000000000000/* * Copyright (c) Atmel * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef LCD_FONT_10x14_H #define LCD_FONT_10x14_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ const unsigned char pCharset10x14[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xCC, 0xFF, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xC0, 0x0C, 0xC0, 0xFF, 0xFC, 0xFF, 0xFC, 0x0C, 0xC0, 0x0C, 0xC0, 0xFF, 0xFC, 0xFF, 0xFC, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0x60, 0x1E, 0x70, 0x3F, 0x30, 0x33, 0x30, 0xFF, 0xFC, 0xFF, 0xFC, 0x33, 0x30, 0x33, 0xF0, 0x39, 0xE0, 0x18, 0xC0, 0x60, 0x00, 0xF0, 0x0C, 0xF0, 0x3C, 0x60, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x18, 0xF0, 0x3C, 0xC0, 0x3C, 0x00, 0x18, 0x3C, 0xF0, 0x7F, 0xF8, 0xC3, 0x1C, 0xC7, 0x8C, 0xCF, 0xCC, 0xDC, 0xEC, 0x78, 0x78, 0x30, 0x30, 0x00, 0xFC, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0xEC, 0x00, 0xF8, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x3F, 0xF0, 0x78, 0x78, 0x60, 0x18, 0xC0, 0x0C, 0xC0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0C, 0xC0, 0x0C, 0x60, 0x18, 0x78, 0x78, 0x3F, 0xF0, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x60, 0x0E, 0xE0, 0x07, 0xC0, 0x03, 0x80, 0x3F, 0xF8, 0x3F, 0xF8, 0x03, 0x80, 0x07, 0xC0, 0x0E, 0xE0, 0x0C, 0x60, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x3F, 0xF0, 0x3F, 0xF0, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x44, 0x00, 0xEC, 0x00, 0xF8, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x7F, 0xF8, 0xE0, 0xFC, 0xC1, 0xCC, 0xC3, 0x8C, 0xC7, 0x0C, 0xCE, 0x0C, 0xFC, 0x1C, 0x7F, 0xF8, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0C, 0x70, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0C, 0x70, 0x1C, 0xE0, 0x3C, 0xC0, 0x7C, 0xC0, 0xEC, 0xC1, 0xCC, 0xC3, 0x8C, 0xE7, 0x0C, 0x7E, 0x0C, 0x3C, 0x0C, 0x30, 0x30, 0x70, 0x38, 0xE0, 0x1C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xE3, 0x1C, 0x7F, 0xF8, 0x3C, 0xF0, 0x03, 0xC0, 0x07, 0xC0, 0x0E, 0xC0, 0x1C, 0xC0, 0x38, 0xC0, 0x70, 0xC0, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0xC0, 0x00, 0xC0, 0xFC, 0x30, 0xFC, 0x38, 0xCC, 0x1C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCE, 0x1C, 0xC7, 0xF8, 0xC3, 0xF0, 0x3F, 0xF0, 0x7F, 0xF8, 0xE3, 0x1C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xE3, 0x9C, 0x71, 0xF8, 0x30, 0xF0, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC3, 0xFC, 0xC7, 0xFC, 0xCE, 0x00, 0xDC, 0x00, 0xF8, 0x00, 0xF0, 0x00, 0x3C, 0xF0, 0x7F, 0xF8, 0xE7, 0x9C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xE7, 0x9C, 0x7F, 0xF8, 0x3C, 0xF0, 0x3C, 0x00, 0x7E, 0x00, 0xE7, 0x0C, 0xC3, 0x0C, 0xC3, 0x1C, 0xC3, 0x38, 0xC3, 0x70, 0xE7, 0xE0, 0x7F, 0xC0, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x60, 0x3C, 0xF0, 0x3C, 0xF0, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x44, 0x3C, 0xEC, 0x3C, 0xF8, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x80, 0x0F, 0xC0, 0x1C, 0xE0, 0x38, 0x70, 0x70, 0x38, 0xE0, 0x1C, 0xC0, 0x0C, 0x00, 0x00, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x00, 0x00, 0xC0, 0x0C, 0xE0, 0x1C, 0x70, 0x38, 0x38, 0x70, 0x1C, 0xE0, 0x0F, 0xC0, 0x07, 0x80, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0xC1, 0xEC, 0xC3, 0xEC, 0xC3, 0x00, 0xE6, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x30, 0xF0, 0x71, 0xF8, 0xE3, 0x9C, 0xC3, 0x0C, 0xC3, 0xFC, 0xC3, 0xFC, 0xC0, 0x0C, 0xE0, 0x1C, 0x7F, 0xF8, 0x3F, 0xF0, 0x3F, 0xFC, 0x7F, 0xFC, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xC0, 0x7F, 0xFC, 0x3F, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xE7, 0x9C, 0x7F, 0xF8, 0x3C, 0xF0, 0x3F, 0xF0, 0x7F, 0xF8, 0xE0, 0x1C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xE0, 0x1C, 0x70, 0x38, 0x30, 0x30, 0xFF, 0xFC, 0xFF, 0xFC, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xE0, 0x1C, 0x7F, 0xF8, 0x3F, 0xF0, 0xFF, 0xFC, 0xFF, 0xFC, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x3F, 0xF0, 0x7F, 0xF8, 0xE0, 0x1C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xE3, 0x1C, 0x73, 0xF8, 0x33, 0xF0, 0xFF, 0xFC, 0xFF, 0xFC, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0C, 0xC0, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0xC0, 0x0C, 0xC0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x38, 0xC0, 0x1C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x1C, 0xFF, 0xF8, 0xFF, 0xF0, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0x07, 0x80, 0x07, 0x80, 0x0F, 0xC0, 0x1C, 0xE0, 0x38, 0x70, 0x70, 0x38, 0xE0, 0x1C, 0xC0, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0x70, 0x00, 0x38, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x38, 0x00, 0x70, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0xFF, 0xFC, 0xFF, 0xFC, 0x3F, 0xF0, 0x7F, 0xF8, 0xE0, 0x1C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xE0, 0x1C, 0x7F, 0xF8, 0x3F, 0xF0, 0xFF, 0xFC, 0xFF, 0xFC, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xE7, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x3F, 0xF0, 0x7F, 0xF8, 0xE0, 0x1C, 0xC0, 0x0C, 0xC0, 0xCC, 0xC0, 0xEC, 0xC0, 0x7C, 0xE0, 0x38, 0x7F, 0xFC, 0x3F, 0xEC, 0xFF, 0xFC, 0xFF, 0xFC, 0xC3, 0x00, 0xC3, 0x80, 0xC3, 0x80, 0xC3, 0xC0, 0xC3, 0xC0, 0xE7, 0x70, 0x7E, 0x3C, 0x3C, 0x1C, 0x3C, 0x18, 0x7E, 0x1C, 0xE7, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x9C, 0xE1, 0xF8, 0x60, 0xF0, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0xF0, 0xFF, 0xF8, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x1C, 0xFF, 0xF8, 0xFF, 0xF0, 0xFF, 0xC0, 0xFF, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0xFF, 0xE0, 0xFF, 0xC0, 0xFF, 0xF0, 0xFF, 0xF8, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x1C, 0xFF, 0xF8, 0xFF, 0xF0, 0xF0, 0x3C, 0xF8, 0x7C, 0x1C, 0xE0, 0x0F, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x0F, 0xC0, 0x1C, 0xE0, 0xF8, 0x7C, 0xF0, 0x3C, 0xFC, 0x00, 0xFE, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xFC, 0x01, 0xFC, 0x03, 0x80, 0x07, 0x00, 0xFE, 0x00, 0xFC, 0x00, 0xC0, 0x3C, 0xC0, 0x7C, 0xC0, 0xEC, 0xC1, 0xCC, 0xC3, 0x8C, 0xC7, 0x0C, 0xCE, 0x0C, 0xDC, 0x0C, 0xF8, 0x0C, 0xF0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x78, 0x0E, 0xFC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0E, 0xCC, 0x07, 0xFC, 0x03, 0xF8, 0xFF, 0xFC, 0xFF, 0xFC, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x9C, 0x01, 0xF8, 0x00, 0xF0, 0x03, 0xF0, 0x07, 0xF8, 0x0E, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30, 0x00, 0xF0, 0x01, 0xF8, 0x03, 0x9C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0x03, 0xF0, 0x07, 0xF8, 0x0E, 0xDC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0E, 0xDC, 0x07, 0xD8, 0x03, 0x90, 0x00, 0x00, 0x03, 0x00, 0x3F, 0xFC, 0x7F, 0xFC, 0xE3, 0x00, 0xE3, 0x00, 0x70, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x07, 0x9C, 0x0F, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xDC, 0x0F, 0xF8, 0x07, 0xF0, 0xFF, 0xFC, 0xFF, 0xFC, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x80, 0x01, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFC, 0x1B, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x1C, 0xCF, 0xF8, 0xCF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0xE0, 0x01, 0xE0, 0x03, 0xF0, 0x07, 0x38, 0x0E, 0x1C, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0C, 0xC0, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x0F, 0xFC, 0x0E, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x00, 0x0E, 0x00, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x03, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x07, 0xFC, 0x03, 0xFC, 0x03, 0xF0, 0x07, 0xF8, 0x0E, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0E, 0x1C, 0x07, 0xF8, 0x03, 0xF0, 0x0F, 0xFC, 0x0F, 0xFC, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0F, 0xC0, 0x07, 0x80, 0x03, 0x00, 0x03, 0x00, 0x07, 0x80, 0x0F, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x00, 0x03, 0x18, 0x07, 0x9C, 0x0F, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xFC, 0x0E, 0x78, 0x06, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFF, 0xF0, 0xFF, 0xF8, 0x0C, 0x1C, 0x0C, 0x1C, 0x0C, 0x38, 0x0C, 0x30, 0x00, 0x00, 0x0F, 0xF0, 0x0F, 0xF8, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x1C, 0x0F, 0xF8, 0x0F, 0xF0, 0x0F, 0xC0, 0x0F, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x0F, 0xE0, 0x0F, 0xC0, 0x0F, 0xF0, 0x0F, 0xF8, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x1C, 0x00, 0x1C, 0x0F, 0xF8, 0x0F, 0xF0, 0x0C, 0x0C, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0xF0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xF0, 0x07, 0x38, 0x0E, 0x1C, 0x0C, 0x0C, 0x0C, 0x00, 0x0E, 0x00, 0x07, 0x0C, 0x03, 0x9C, 0x01, 0xF8, 0x01, 0xF0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x0C, 0x0C, 0x0C, 0x1C, 0x0C, 0x3C, 0x0C, 0x7C, 0x0C, 0xEC, 0x0D, 0xCC, 0x0F, 0x8C, 0x0F, 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x07, 0x80, 0x3F, 0xF0, 0x7C, 0xF8, 0xE0, 0x1C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0x00, 0x00, 0x03, 0x0C, 0x03, 0x0C, 0x3F, 0xFC, 0x7F, 0xFC, 0xE3, 0x0C, 0xC3, 0x0C, 0xC0, 0x0C, 0xE0, 0x0C, 0x70, 0x0C, 0x30, 0x0C, 0x00, 0x00, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xE0, 0x1C, 0x7C, 0xF8, 0x3F, 0xF0, 0x07, 0x80, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC }; #endif // #ifdef _LCD_FONT_10x14_h tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/ili9325.h000077500000000000000000000171571207233610700223330ustar00rootroot00000000000000/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2009, Atmel Corporation * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** * \file * * Interface of ILI9325 driver. * */ #ifndef _ILI9325_ #define _ILI9325_ /*---------------------------------------------------------------------------- * Headers *----------------------------------------------------------------------------*/ typedef uint32_t LcdColor_t ; /*---------------------------------------------------------------------------- * Definitions *----------------------------------------------------------------------------*/ /* ILI9325 ID code */ #define ILI9325_DEVICE_CODE 0x9325 /* ILI9325 LCD Registers */ #define ILI9325_R00H 0x00 /* Driver Code Read */ #define ILI9325_R01H 0x01 /* Driver Output Control 1 */ #define ILI9325_R01H_SS ((uint16_t)0x0100) #define ILI9325_R01H_SM ((uint16_t)0x0400) #define ILI9325_R02H 0x02 /* LCD Driving Control */ #define ILI9325_R03H 0x03 /* Entry Mode */ #define ILI9325_R03H_AM ((uint16_t)0x0008) /* AM Control the GRAM update direction */ #define ILI9325_R03H_ID0 ((uint16_t)0x0010) /* I/D[1:0] Control the address counter */ #define ILI9325_R03H_ID1 ((uint16_t)0x0020) #define ILI9325_R03H_ORG ((uint16_t)0x0080) #define ILI9325_R03H_HWM ((uint16_t)0x0200) #define ILI9325_R03H_BGR ((uint16_t)0x1000) #define ILI9325_R03H_DFM ((uint16_t)0x4000) #define ILI9325_R03H_TRI ((uint16_t)0x8000) #define ILI9325_R04H 0x04 /* Resize Control */ #define ILI9325_R07H 0x07 /* Display Control 1 */ #define ILI9325_R07H_D0 ((uint16_t)0x0001) #define ILI9325_R07H_D1 ((uint16_t)0x0002) #define ILI9325_R07H_CL ((uint16_t)0x0008) #define ILI9325_R07H_DTE ((uint16_t)0x0010) #define ILI9325_R07H_GON ((uint16_t)0x0020) #define ILI9325_R07H_BASEE ((uint16_t)0x0100) #define ILI9325_R07H_PTDE0 ((uint16_t)0x1000) #define ILI9325_R07H_PTDE1 ((uint16_t)0x2000) #define ILI9325_R08H 0x08 /* Display Control 2 */ #define ILI9325_R09H 0x09 /* Display Control 3 */ #define ILI9325_R0AH 0x0A /* Display Control 4 */ #define ILI9325_R0CH 0x0C /* RGB Display Interface Control 1 */ #define ILI9325_R0DH 0x0D /* Frame Maker Position */ #define ILI9325_R0FH 0x0F /* RGB Display Interface Control 2 */ #define ILI9325_R10H 0x10 /* Power Control 1 */ #define ILI9325_R11H 0x11 /* Power Control 2 */ #define ILI9325_R12H 0x12 /* Power Control 3 */ #define ILI9325_R13H 0x13 /* Power Control 4 */ #define ILI9325_R20H 0x20 /* Horizontal GRAM Address Set */ #define ILI9325_R21H 0x21 /* Vertical GRAM Address Set */ #define ILI9325_R22H 0x22 /* Write Data to GRAM */ #define ILI9325_R29H 0x29 /* Power Control 7 */ #define ILI9325_R2BH 0x2B /* Frame Rate and Color Control */ #define ILI9325_R30H 0x30 /* Gamma Control 1 */ #define ILI9325_R31H 0x31 /* Gamma Control 2 */ #define ILI9325_R32H 0x32 /* Gamma Control 3 */ #define ILI9325_R35H 0x35 /* Gamma Control 4 */ #define ILI9325_R36H 0x36 /* Gamma Control 5 */ #define ILI9325_R37H 0x37 /* Gamma Control 6 */ #define ILI9325_R38H 0x38 /* Gamma Control 7 */ #define ILI9325_R39H 0x39 /* Gamma Control 8 */ #define ILI9325_R3CH 0x3C /* Gamma Control 9 */ #define ILI9325_R3DH 0x3D /* Gamma Control 10 */ #define ILI9325_R50H 0x50 /* Horizontal Address Start Position */ #define ILI9325_R51H 0x51 /* Horizontal Address End Position */ #define ILI9325_R52H 0x52 /* Vertical Address Start Position */ #define ILI9325_R53H 0x53 /* Vertical Address End Position */ #define ILI9325_R60H 0x60 /* Driver Output Control 2 */ #define ILI9325_R60H_GS ((uint16_t)0x8000) #define ILI9325_R61H 0x61 /* Base Image Display Control */ #define ILI9325_R6AH 0x6A /* Vertical Scroll Control */ #define ILI9325_R80H 0x80 /* Partial Image 1 Display Position */ #define ILI9325_R81H 0x81 /* Partial Image 1 Area (Start Line) */ #define ILI9325_R82H 0x82 /* Partial Image 1 Area (End Line) */ #define ILI9325_R83H 0x83 /* Partial Image 2 Display Position */ #define ILI9325_R84H 0x84 /* Partial Image 2 Area (Start Line) */ #define ILI9325_R85H 0x85 /* Partial Image 2 Area (End Line) */ #define ILI9325_R90H 0x90 /* Panel Interface Control 1 */ #define ILI9325_R92H 0x92 /* Panel Interface Control 2 */ #define ILI9325_R95H 0x95 /* Panel Interface Control 4 */ #define ILI9325_RA1H 0xA1 /* OTP VCM Programming Control */ #define ILI9325_RA2H 0xA2 /* OTP VCM Status and Enable */ #define ILI9325_RA5H 0xA5 /* OTP Programming ID Key */ /*---------------------------------------------------------------------------- * Types *----------------------------------------------------------------------------*/ typedef volatile uint8_t REG8; /*---------------------------------------------------------------------------- * Marcos *----------------------------------------------------------------------------*/ #define BOARD_LCD_RS (1 << 1) // LCD index register address #define LCD_IR(baseAddr) (*((REG8 *)(baseAddr))) // LCD status register address #define LCD_SR(baseAddr) (*((REG8 *)(baseAddr))) // LCD data address #define LCD_D(baseAddr) (*((REG8 *)((uint32_t)(baseAddr) + BOARD_LCD_RS))) #endif /* #ifndef ILI9325 */ tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/lcd/lcd.h000066400000000000000000000032451207233610700217630ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef _LCD_H #define _LCD_H #define BOARD_LCD_HEIGHT 320 #define BOARD_LCD_WIDTH 240 #endif //_LCD_H tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/platform.h000066400000000000000000000002151207233610700222750ustar00rootroot00000000000000/* No platform_bootstrap() needed, * since memory system doesn't need configuration and * the processor mode neither. * (see TEP 107) */ tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/platform_message.h000066400000000000000000000040201207233610700237770ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Wanja Hofer */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include "Serial.h" #include "CC2520Radio.h" typedef union message_header { cc2520packet_header_t cc2520; serial_header_t serial; } message_header_t; typedef union message_footer { cc2520packet_footer_t cc2520; } message_footer_t; typedef union message_metadata { cc2520packet_metadata_t cc2520; serial_metadata_t serial; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/sam3s-ek-flash.x000066400000000000000000000070401207233610700232120ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Linker script to run code in Flash 0. * Start-up code copies data into SRAM 0 and zeroes BSS segment. * * @author Wanja Hofer * @author Thomas Schmid */ /* Output format is always little endian, irrespective of -EL or -EB flags */ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /* Output architecture is ARM */ OUTPUT_ARCH(arm) /* The first program instruction is the __init() start-up code */ ENTRY(__init) /* The IRQ vector table is put at the beginning of SRAM 0 */ /* We reserve 0x100 bytes by setting the SRAM 0 base address below accordingly */ /* Stack at the end of SRAM */ _estack = 0x2000bffc; /* Don't relocate the vector table */ /*PROVIDE (__relocate_vector = 0);*/ /* We have the SAM3S4C with 256K Flash and 48K SRAM. */ MEMORY { sram (WRX) : org = 0x20000000, len = 0x0C000 /* SRAM, 48K */ flash (RX) : org = 0x00400000, len = 0x40000 /* Flash, 256K */ } SECTIONS { /* Text is linked into Flash 0 */ .text : { . = ALIGN(4); _stext = .; /* KEEP(*(.boot*)) */ KEEP(*(.vectors)) *(.init*) *(.text*) *(.fini*) *(.rodata*) *(.glue_7) /* ARM/Thumb interworking code */ *(.glue_7t) /* ARM/Thumb interworking code */ . = ALIGN(4); _etext = .; } > flash /* Data will be loaded into RAM by start-up code */ .data : AT (_etext) { . = ALIGN(4); _sdata = .; _svect = .; KEEP(*(.vectors)) /* Interrupt vector table in first 204 bytes */ _evect = .; *(.ramfunc) /* functions linked into RAM */ *(.data.*) *(.data) . = ALIGN(4); _edata = .; } > sram /* BSS will be zeroed by start-up code */ .bss (NOLOAD) : { . = ALIGN(4); _sbss = .; *(.bss.*) *(.bss) . = ALIGN(4); } > sram /* _ebss should be inside .bss, but for some reason, it then is not defined * at the end of the BSS section. This leads to non-zeroed BSS data, since the * start-up code uses that symbol. For now, this workaround is OK and does no * harm. */ _ebss = .; } end = .; tinyos-2.1.2+dfsg/tos/platforms/sam3s_ek/vectors.c000066400000000000000000000241531207233610700221400ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Startup code and interrupt and trap handlers for the SAM3U-EK board. * * @author Wanja Hofer */ /* Section symbols defined in linker script * sam3u-ek-flash.x */ extern unsigned int _stext; extern unsigned int _etext; extern unsigned int _sdata; extern unsigned int _edata; extern unsigned int _svect; extern unsigned int _evect; extern unsigned int _sbss; extern unsigned int _ebss; extern unsigned int _estack; extern unsigned int __relocate_vector; /* main() symbol defined in RealMainP */ int main(); /* Start-up code called upon reset. * Definition see below. */ void __init(); /* Default handler for any IRQ or fault */ void DefaultHandler() { // do nothing, just return } /* Default Hardfault Handler */ void DefaultHardFaultHandler() { while(1) {} } /* Default Mpu Fault Handler */ void DefaultMpuFaultHandler() { while(1) {} } /* Default Bus Fault Handler */ void DefaultBusFaultHandler() { while(1) {} } /* Default Usage Fault Handler */ void DefaultUsageFaultHandler() { while(1) {} } /* By default, every exception and IRQ is handled by the default handler. * * If OWN_FUNCTIONS_FOR_HANDLERS is defined, then the internal IRQ and fault * handlers will get a function of their own for debug purposes. Those * functions are provided by weak aliases; thus, a regular handler * definition will override this. */ #define OWN_FUNCTION_FOR_HANDLERS #ifdef OWN_FUNCTION_FOR_HANDLERS void NmiHandler() __attribute__((weak)); void MpuFaultHandler() __attribute__((weak)); void BusFaultHandler() __attribute__((weak)); void UsageFaultHandler() __attribute__((weak)); void SVCallHandler() __attribute__((weak)); void DebugHandler() __attribute__((weak)); void PendSVHandler() __attribute__((weak)); void SysTickHandler() __attribute__((weak)); void NmiHandler() { while(1) {} } void MpuFaultHandler() { while(1) {} } void BusFaultHandler() { while(1) {} } void UsageFaultHandler() { while(1) {} } void SVCallHandler() { while(1) {} } void DebugHandler() { while(1) {} } void PendSVHandler() { while(1) {} } void SysTickHandler() { while(1) {} } #else void NmiHandler() __attribute__((weak, alias("DefaultHandler"))); void MpuFaultHandler() __attribute__((weak, alias("DefaultHandler"))); void BusFaultHandler() __attribute__((weak, alias("DefaultHandler"))); void UsageFaultHandler() __attribute__((weak, alias("DefaultHandler"))); void SVCallHandler() __attribute__((weak, alias("DefaultHandler"))); void DebugHandler() __attribute__((weak, alias("DefaultHandler"))); void PendSVHandler() __attribute__((weak, alias("DefaultHandler"))); void SysTickHandler() __attribute__((weak, alias("DefaultHandler"))); #endif void HardFaultHandler() __attribute__((weak, alias("DefaultHardFaultHandler"))); void SupcIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void RstcIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void RtcIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void RttIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void WdtIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void PmcIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void EefcIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void UartIrqHandler() __attribute__((weak, alias("DefaultHandler"))); // Note: we removed the 0! void Uart1IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void SmcIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void PioAIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void PioBIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void PioCIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void Usart0IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void Usart1IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void HsmciIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void Twi0IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void Twi1IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void SpiIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void SscIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void TC0IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void TC1IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void TC2IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void TC3IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void TC4IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void TC5IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void AdcIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void DaccIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void PwmIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void CrccuIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void AccIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void UdpIrqHandler() __attribute__((weak, alias("DefaultHandler"))); /* Stick at the top of the .text section in final binary so we can always * jump back to the init routine at the top of the stack if we want */ __attribute__((section(".boot"))) unsigned int *__boot[] = { &_estack, (unsigned int *) __init, }; __attribute__((section(".vectors"))) unsigned int *__vectors[] = { // Defined by Cortex-M3 // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 78 // See also The Definitive Guide to the ARM Cortex-M3, p. 331 &_estack, (unsigned int *) __init, (unsigned int *) NmiHandler, (unsigned int *) HardFaultHandler, (unsigned int *) MpuFaultHandler, (unsigned int *) BusFaultHandler, (unsigned int *) UsageFaultHandler, (unsigned int *) 0, // Reserved (unsigned int *) 0, // Reserved (unsigned int *) 0, // Reserved (unsigned int *) 0, // Reserved (unsigned int *) SVCallHandler, (unsigned int *) DebugHandler, (unsigned int *) 0, // Reserved (unsigned int *) PendSVHandler, (unsigned int *) SysTickHandler, // Defined by SAM3U MCU // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 41 (unsigned int *) SupcIrqHandler, // 0 (unsigned int *) RstcIrqHandler, // 1 (unsigned int *) RtcIrqHandler, // 2 (unsigned int *) RttIrqHandler, // 3 (unsigned int *) WdtIrqHandler, // 4 (unsigned int *) PmcIrqHandler, // 5 (unsigned int *) EefcIrqHandler, // 6 (unsigned int *) 0, // 7 Reserved (unsigned int *) UartIrqHandler, // 8 We remove the 0 as the Sam3u only has one UART (unsigned int *) Uart1IrqHandler, // 9 (unsigned int *) SmcIrqHandler, // 10 (unsigned int *) PioAIrqHandler, // 11 (unsigned int *) PioBIrqHandler, // 12 (unsigned int *) PioCIrqHandler, // 13 (unsigned int *) Usart0IrqHandler, // 14 (unsigned int *) Usart1IrqHandler, // 15 (unsigned int *) 0, // 16 (unsigned int *) 0, // 17 (unsigned int *) HsmciIrqHandler, // 18 (unsigned int *) Twi0IrqHandler, // 19 (unsigned int *) Twi1IrqHandler, // 20 (unsigned int *) SpiIrqHandler, // 21 (unsigned int *) SscIrqHandler, // 22 (unsigned int *) TC0IrqHandler, // 23 (unsigned int *) TC1IrqHandler, // 24 (unsigned int *) TC2IrqHandler, // 25 (unsigned int *) TC3IrqHandler, // 26 (unsigned int *) TC4IrqHandler, // 27 (unsigned int *) TC5IrqHandler, // 28 (unsigned int *) AdcIrqHandler, // 29 (unsigned int *) DaccIrqHandler, // 30 (unsigned int *) PwmIrqHandler, // 31 (unsigned int *) CrccuIrqHandler, // 32 (unsigned int *) AccIrqHandler, // 33 (unsigned int *) UdpIrqHandler // 34 }; /* Start-up code to copy data into RAM * and zero BSS segment * and call main() * and "exit" */ void __init() { unsigned int *from; unsigned int *to; unsigned int *i; volatile unsigned int *NVIC_VTOFFR = (volatile unsigned int *) 0xe000ed08; if(0 && __relocate_vector) { // Configure location of IRQ vector table // Vector table is in the beginning of text segment / Flash 0 i = (unsigned int *) &_svect; *NVIC_VTOFFR = (unsigned int) i; // Set TBLBASE bit since vector table located in SRAM *NVIC_VTOFFR |= (1 << 29); } // Copy pre-initialized data into RAM. // Data lies in Flash after the text segment (_etext), // but is linked to be at _sdata. // Thus, we have to copy it to that place in RAM. from = &_etext; to = &_sdata; while (to < &_edata) { *to = *from; to++; from++; } // Fill BSS data with 0 i = &_sbss; while (i < &_ebss) { *i = 0; i++; } // Call main() main(); // "Exit" while (1); } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/000077500000000000000000000000001207233610700203045ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/.platform000066400000000000000000000100141207233610700221250ustar00rootroot00000000000000# Copyright (c) 2011 University of Utah # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of the copyright holders nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS # OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY # WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. push ( @includes, "%P/spi", "%P/lcd", "%P/chips/cc2420", "%P/chips/sd", "%P/chips/nandflash", "%T/platforms/shimmer/chips/sd/fatfs", "%T/chips/cortex/m3", "%T/chips/cortex/m3/sam3", "%T/chips/cortex/m3/sam3/u", "%T/chips/cortex/m3/sam3/pins", "%T/chips/cortex/m3/sam3/u/pins", "%T/chips/cortex/m3/sam3/timer", "%T/chips/cortex/m3/sam3/u/timer", "%T/chips/cortex/m3/sam3/nvic", "%T/chips/cortex/m3/sam3/u/nvic", "%T/chips/cortex/m3/sam3/uart", "%T/chips/cortex/m3/sam3/u/uart", "%T/chips/cortex/m3/sam3/u/usart", "%T/chips/cortex/m3/sam3/supc", "%T/chips/cortex/m3/sam3/u/supc", "%T/chips/cortex/m3/sam3/pmc", "%T/chips/cortex/m3/sam3/u/pmc", "%T/chips/cortex/m3/sam3/eefc", "%T/chips/cortex/m3/sam3/u/eefc", "%T/chips/cortex/m3/sam3/wdtc", "%T/chips/cortex/m3/sam3/u/wdtc", "%T/chips/cortex/m3/sam3/matrix", "%T/chips/cortex/m3/sam3/u/matrix", "%T/chips/cortex/m3/sam3/u/mpu", "%T/chips/cortex/m3/sam3/spi", "%T/chips/cortex/m3/sam3/u/spi", "%T/chips/cortex/m3/sam3/smc", "%T/chips/cortex/m3/sam3/u/smc", "%T/chips/cortex/m3/sam3/u/adc12b", "%T/chips/cortex/m3/sam3/u/dma", "%T/chips/cortex/m3/sam3/pdc", "%T/chips/cortex/m3/sam3/u/pdc", "%T/chips/cortex/m3/sam3/u/twi", "%T/chips/cortex/m3/sam3/u/hsmci", "%T/chips/cortex/m3/sam3/u/usb", "%T/chips/cortex/m3/sam3/u/usb/peripherals", "%T/chips/cortex/m3/sam3/u/usb/board", "%T/chips/cc2420", "%T/chips/cc2420/alarm", "%T/chips/cc2420/control", "%T/chips/cc2420/csma", "%T/chips/cc2420/interfaces", "%T/chips/cc2420/link", "%T/chips/cc2420/lowpan", "%T/chips/cc2420/lpl", "%T/chips/cc2420/packet", "%T/chips/cc2420/receive", "%T/chips/cc2420/spi", "%T/chips/cc2420/transmit", "%T/chips/cc2420/unique", "%T/lib/timer", "%T/lib/serial", "%T/lib/power", ); @opts = qw( -gcc=arm-none-eabi-gcc -mcpu=cortex-m3 -nostartfiles -fnesc-target=env -fnesc-no-debug ); push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{NESC_MACHINE} = "structure_size_boundary=32, pointer=4,4 float=4,4 double=8,4 long_double=8,4 short=2,2 int=4,4 long=4,4 long_long=8,4 int1248_align=1,2,4,4 wchar_size_size=4,4 char_wchar_signed=false,true"; tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/ActiveMessageC.nc000066400000000000000000000052201207233610700234500ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 The Regents of the University of California. * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * * Authors: Philip Levis * */ /** * * The Active Message layer on the SAM3U-EK platform. This is a naming wrapper * around the CC2420 Active Message layer. * * @author Philip Levis * @author Thomas Schmid (adapted to SAM3U EK) */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2420ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/Ieee154MessageC.nc000066400000000000000000000044711207233610700233450ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * * @author Stephen Dawson-Haggerty */ configuration Ieee154MessageC { provides { interface SplitControl; interface Resource as SendResource[uint8_t clientId]; interface Ieee154Send; interface Receive as Ieee154Receive; interface Ieee154Packet; interface Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; interface LowPowerListening; interface PacketLink; } } implementation { components CC2420Ieee154MessageC as Msg; SplitControl = Msg; SendResource = Msg; Ieee154Send = Msg; Ieee154Receive = Msg; Ieee154Packet = Msg; Packet = Msg; PacketAcknowledgements = Msg; LinkPacketMetadata = Msg; LowPowerListening = Msg; PacketLink = Msg; } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/LedsP.nc000066400000000000000000000076111207233610700216420ustar00rootroot00000000000000/* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * The implementation of the standard 3 LED mote abstraction. * Adapted because LED 2 (red) is active high on SAM3U_EK. * * @author Joe Polastre * @author Philip Levis * @author Wanja Hofer * * @date March 21, 2005 */ module LedsP @safe() { provides { interface Init; interface Leds; } uses { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; } } implementation { command error_t Init.init() { atomic { dbg("Init", "LEDS: initialized.\n"); call Led0.makeOutput(); call Led1.makeOutput(); call Led2.makeOutput(); call Led0.set(); call Led1.set(); call Led2.clr(); } return SUCCESS; } /* Note: the call is inside the dbg, as it's typically a read of a volatile location, so can't be deadcode eliminated */ #define DBGLED(n) \ dbg("LedsC", "LEDS: Led" #n " %s.\n", call Led ## n .get() ? "off" : "on"); async command void Leds.led0On() { call Led0.clr(); DBGLED(0); } async command void Leds.led0Off() { call Led0.set(); DBGLED(0); } async command void Leds.led0Toggle() { call Led0.toggle(); DBGLED(0); } async command void Leds.led1On() { call Led1.clr(); DBGLED(1); } async command void Leds.led1Off() { call Led1.set(); DBGLED(1); } async command void Leds.led1Toggle() { call Led1.toggle(); DBGLED(1); } async command void Leds.led2On() { call Led2.set(); DBGLED(2); } async command void Leds.led2Off() { call Led2.clr(); DBGLED(2); } async command void Leds.led2Toggle() { call Led2.toggle(); DBGLED(2); } async command uint8_t Leds.get() { uint8_t rval; atomic { rval = 0; if (!call Led0.get()) { rval |= LEDS_LED0; } if (!call Led1.get()) { rval |= LEDS_LED1; } if (call Led2.get()) { rval |= LEDS_LED2; } } return rval; } async command void Leds.set(uint8_t val) { atomic { if (val & LEDS_LED0) { call Leds.led0On(); } else { call Leds.led0Off(); } if (val & LEDS_LED1) { call Leds.led1On(); } else { call Leds.led1Off(); } if (val & LEDS_LED2) { call Leds.led2On(); } else { call Leds.led2Off(); } } } } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/MoteClockC.nc000066400000000000000000000034731207233610700226200ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ configuration MoteClockC { provides { interface Init; } } implementation { components MoteClockP, HplSam3uClockC; Init = MoteClockP; MoteClockP.HplSam3Clock -> HplSam3uClockC; components LedsC; MoteClockP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/MoteClockP.nc000066400000000000000000000104351207233610700226310ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Basic Clock Initialization. * * @author Thomas Schmid */ #include "sam3upmchardware.h" #include "sam3usupchardware.h" #include "sam3eefchardware.h" #include "sam3wdtchardware.h" #include "sam3matrixhardware.h" extern void SetDefaultMaster(unsigned char enable); module MoteClockP { provides { interface Init; } uses { interface HplSam3Clock; interface Leds; } } implementation { command error_t Init.init(){ // Set 2 WS for Embedded Flash Access EEFC0->fmr.bits.fws = 2; EEFC1->fmr.bits.fws = 2; // Disable Watchdog WDTC->mr.bits.wddis = 1; // Select external slow clock call HplSam3Clock.slckExternalOsc(); //call HplSam3Clock.slckRCOsc(); // Initialize main oscillator call HplSam3Clock.mckInit48(); //call HplSam3Clock.mckInit12RC(); // Enable clock for UART // FIXME: this should go into the UART start/stop! PMC->pc.pcdr.bits.dbgu = 1; /* Optimize CPU setting for speed */ SetDefaultMaster(1); return SUCCESS; } //------------------------------------------------------------------------------ /// Enable or disable default master access /// \param enable 1 enable defaultMaster settings, 0 disable it. //------------------------------------------------------------------------------ void SetDefaultMaster(unsigned char enable) @C() { // Set default master if (enable == 1) { // Set default master: SRAM0 -> Cortex-M3 System MATRIX->scfg0.bits.fixed_defmstr = 1; MATRIX->scfg0.bits.defmstr_type = MATRIX_SCFG_MASTER_TYPE_FIXED_DEFAULT; // Set default master: SRAM1 -> Cortex-M3 System MATRIX->scfg1.bits.fixed_defmstr = 1; MATRIX->scfg1.bits.defmstr_type = MATRIX_SCFG_MASTER_TYPE_FIXED_DEFAULT; // Set default master: Internal flash0 -> Cortex-M3 Instruction/Data MATRIX->scfg3.bits.fixed_defmstr = 0; MATRIX->scfg3.bits.defmstr_type = MATRIX_SCFG_MASTER_TYPE_FIXED_DEFAULT; } else { // Clear default master: SRAM0 -> Cortex-M3 System MATRIX->scfg0.bits.defmstr_type = MATRIX_SCFG_MASTER_TYPE_NO_DEFAULT; // Clear default master: SRAM1 -> Cortex-M3 System MATRIX->scfg1.bits.defmstr_type = MATRIX_SCFG_MASTER_TYPE_NO_DEFAULT; // Clear default master: Internal flash0 -> Cortex-M3 Instruction/Data MATRIX->scfg3.bits.defmstr_type = MATRIX_SCFG_MASTER_TYPE_NO_DEFAULT; } } /** * informs us when the main clock changes */ async event void HplSam3Clock.mainClockChanged() {} } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/PlatformC.nc000066400000000000000000000043721207233610700225230ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Wanja Hofer */ #include "hardware.h" configuration PlatformC { provides { /* Called after platform_bootstrap() and Scheduler.init() (see TEP 107) * I/O pin configuration, clock calibration, and LED configuration */ interface Init; } } implementation { components PlatformP, MoteClockC, HplSam3TCC as MoteTimerC; components McuSleepC; Init = PlatformP; PlatformP.MoteClockInit -> MoteClockC; PlatformP.IRQInit -> MoteClockC; PlatformP.MoteTimerInit -> MoteTimerC; // Used so we can initialize the platform in a state where it would draw // the lowest current possible if put to sleep. PlatformP.Sam3LowPower -> McuSleepC; } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/PlatformLedsC.nc000066400000000000000000000041451207233610700233310ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Connection of LEDs to the GPIO pins on the SAM3U-EK board. * * @author Wanja Hofer */ configuration PlatformLedsC { provides { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; } uses { interface Init; } } implementation { components HplSam3uGeneralIOC as IO; components PlatformP; Init = PlatformP.LedsInit; Led0 = IO.PioB0; // Pin B0 = Green LED 1, active low Led1 = IO.PioB1; // Pin B1 = Green LED 2, active low Led2 = IO.PioB2; // Pin B2 = Red LED, active high } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/PlatformP.nc000066400000000000000000000045171207233610700225410ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Wanja Hofer */ #include "hardware.h" module PlatformP { provides { interface Init; } uses { interface Init as LedsInit; interface Init as MoteClockInit; interface Init as IRQInit; interface Init as MoteTimerInit; interface Sam3LowPower; } } implementation { command error_t Init.init() { /* I/O pin configuration, clock calibration, and LED configuration * (see TEP 107) */ call IRQInit.init(); call MoteClockInit.init(); call MoteTimerInit.init(); call LedsInit.init(); return SUCCESS; } async event void Sam3LowPower.customizePio() { // currently not optimized for sam3u-ek } default command error_t LedsInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/PlatformSerialC.nc000066400000000000000000000035451207233610700236640ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Wanja Hofer */ configuration PlatformSerialC { provides { interface StdControl; interface UartStream; interface UartByte; } } implementation { components HilSam3UartC; StdControl = HilSam3UartC; UartStream = HilSam3UartC; UartByte = HilSam3UartC; } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/000077500000000000000000000000001207233610700214125ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/nandflash-working/000077500000000000000000000000001207233610700250265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/nandflash-working/HplNandFlash.h000066400000000000000000000153231207233610700275050ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef HPLNANDFLASH_H #define HPLNANDFLASH_H /// \page "NandFlashModel options" /// This page lists the possible options for a NandFlash chip. /// /// !Options /// - NandFlashModel_DATABUS8 /// - NandFlashModel_DATABUS16 /// - NandFlashModel_COPYBACK /// Indicates the Nand uses an 8-bit databus. #define NandFlashModel_DATABUS8 (0 << 0) /// Indicates the Nand uses a 16-bit databus. #define NandFlashModel_DATABUS16 (1 << 0) /// The Nand supports the copy-back function (internal page-to-page copy). #define NandFlashModel_COPYBACK (1 << 1) //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ /// Maximum number of blocks in a device #define NandCommon_MAXNUMBLOCKS 1024//2048 /// Maximum number of pages in one block #define NandCommon_MAXNUMPAGESPERBLOCK 64 /// Maximum size of the data area of one page, in bytes. #define NandCommon_MAXPAGEDATASIZE 2048 /// Maximum size of the spare area of one page, in bytes. #define NandCommon_MAXPAGESPARESIZE 64 /// Maximum number of ecc bytes stored in the spare for one single page. #define NandCommon_MAXSPAREECCBYTES 24 /// Maximum number of extra free bytes inside the spare area of a page. #define NandCommon_MAXSPAREEXTRABYTES 38 struct NandSpareScheme { uint8_t badBlockMarkerPosition; uint8_t numEccBytes; uint8_t eccBytesPositions[NandCommon_MAXSPAREECCBYTES]; uint8_t numExtraBytes; uint8_t extraBytesPositions[NandCommon_MAXSPAREEXTRABYTES]; }; //------------------------------------------------------------------------------ /// Describes a particular model of NandFlash device. //------------------------------------------------------------------------------ struct NandFlashModel { /// Identifier for the device. uint8_t deviceId; /// Special options for the NandFlash. uint8_t options; /// Size of the data area of a page, in bytes. uint16_t pageSizeInBytes; /// Size of the device in MB. uint16_t deviceSizeInMegaBytes; /// Size of one block in kilobytes. uint16_t blockSizeInKBytes; /// Spare area placement scheme const struct NandSpareScheme *scheme; }; struct RawNandFlash { /// Model describing this NandFlash characteristics. struct NandFlashModel model; /// Address for sending commands to the NandFlash. uint32_t commandAddress; /// Address for sending addresses to the NandFlash uint32_t addressAddress; /// Address for sending data to the NandFlash. uint32_t dataAddress; /// Pin used to enable the NandFlash chip. //Pin pinChipEnable; /// Pin used to monitor the ready/busy signal from the NandFlash. //Pin pinReadyBusy; }; /// No more blocks can be allocated for a write operation. #define NandCommon_ERROR_NOMOREBLOCKS 1 /// The desired logical block has no current physical mapping. #define NandCommon_ERROR_BLOCKNOTMAPPED 2 /// Access if out-of-bounds. #define NandCommon_ERROR_OUTOFBOUNDS 3 /// There are no block having the desired property. #define NandCommon_ERROR_NOBLOCKFOUND 4 /// The nandflash device has no logical mapping information on it. #define NandCommon_ERROR_MAPPINGNOTFOUND 5 /// A read operation cannot be carried out. #define NandCommon_ERROR_CANNOTREAD 6 /// A write operation cannot be carried out. #define NandCommon_ERROR_CANNOTWRITE 7 /// NandFlash chip model cannot be recognized. #define NandCommon_ERROR_UNKNOWNMODEL 8 /// Page data is corrupted according to ECC #define NandCommon_ERROR_CORRUPTEDDATA 9 /// Block is not in the required status. #define NandCommon_ERROR_WRONGSTATUS 10 /// Device has no logical mapping stored in it #define NandCommon_ERROR_NOMAPPING 11 /// The block being accessed is bad and must be replaced #define NandCommon_ERROR_BADBLOCK 12 /// Failed to perform an erase operation #define NandCommon_ERROR_CANNOTERASE 13 /// A hardware copyback operation failed. #define NandCommon_ERROR_CANNOTCOPY 14 /// HW Ecc Not compatible with the Nand Model #define NandCommon_ERROR_ECC_NOT_COMPATIBLE 15 // -------- HSMC4_CFG : (HSMC4 Offset: 0x0) Configuration Register -------- #define AT91C_HSMC4_PAGESIZE (0x3 << 0) // (HSMC4) PAGESIZE field description #define AT91C_HSMC4_PAGESIZE_528_Bytes (0x0) // (HSMC4) 512 bytes plus 16 bytes page size #define AT91C_HSMC4_PAGESIZE_1056_Bytes (0x1) // (HSMC4) 1024 bytes plus 32 bytes page size #define AT91C_HSMC4_PAGESIZE_2112_Bytes (0x2) // (HSMC4) 2048 bytes plus 64 bytes page size #define AT91C_HSMC4_PAGESIZE_4224_Bytes (0x3) // (HSMC4) 4096 bytes plus 128 bytes page size /// Address for transferring command bytes to the nandflash. #define BOARD_NF_COMMAND_ADDR 0x61400000 /// Address for transferring address bytes to the nandflash. #define BOARD_NF_ADDRESS_ADDR 0x61200000 /// Address for transferring data bytes to the nandflash. #define BOARD_NF_DATA_ADDR 0x61000000 #endif // HPLNANDFLASH_H tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/nandflash-working/HplNandFlash.nc000066400000000000000000000074521207233610700276620ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include interface HplNandFlash{ //command void writeColumnAddress(); //command void writeRowAddress(); //command void isOperationComplete(); //command void writeData(); //command void readData(); //command void eraseBlock_i(); // internal functions //command void writePage_i(); // internal functions //command void copyPage_i(); // internal functions command void init(struct RawNandFlash *HplNand, const struct NandFlashModel *model, uint32_t commandAddr, uint32_t addressAddr, uint32_t dataAddr); command uint8_t findNandModel(const struct NandFlashModel *modelList, uint8_t size, struct NandFlashModel *model, uint32_t chipId); command void reset(); command uint32_t readId(); command uint8_t eraseBlock(const struct RawNandFlash *raw, uint16_t block); command uint8_t readPage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare); command uint8_t writePage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare); command uint8_t copyPage(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t sourcePage, uint16_t destBlock, uint16_t destPage); command uint8_t copyBlock(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t destBlock); command uint16_t getPageDataSize(const struct NandFlashModel *model); command uint32_t getDeviceSizeInPages(const struct NandFlashModel *model); command uint16_t getBlockSizeInPages(const struct NandFlashModel *model); command uint8_t getPageSpareSize(const struct NandFlashModel *model); command uint8_t hasSmallBlocks(const struct NandFlashModel *model); command uint16_t getDeviceSizeInBlocks(const struct NandFlashModel * model); command void readBadBlockMarker(const struct NandSpareScheme *scheme, const uint8_t *spare, uint8_t *marker); command void writeBadBlockMarker(const struct NandSpareScheme *scheme, uint8_t *spare, uint8_t marker); command uint32_t getDeviceSizeInBytes(const struct NandFlashModel *model); command uint32_t getBlockSizeInBytes(const struct NandFlashModel *model); command uint8_t readBlock(const struct RawNandFlash *raw, uint16_t block, void *data); command uint8_t writeBlock(const struct RawNandFlash *raw, uint16_t block, void *data); } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/nandflash-working/HplNandFlashC.nc000066400000000000000000000060661207233610700277650ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ configuration HplNandFlashC{ provides interface HplNandFlash; } implementation{ components HplNandFlashP; HplNandFlash = HplNandFlashP; components HplSam3uClockC; HplNandFlashP.HSMC4ClockControl -> HplSam3uClockC.HSMC4PPCntl; components HplSam3uGeneralIOC as IO; HplNandFlashP.NandFlash_CE -> IO.PioC12; HplNandFlashP.NandFlash_RB -> IO.PioB24; HplNandFlashP.NandFlash_OE -> IO.HplPioB17; HplNandFlashP.NandFlash_WE -> IO.HplPioB18; HplNandFlashP.NandFlash_CLE -> IO.HplPioB22; HplNandFlashP.NandFlash_ALE -> IO.HplPioB21; HplNandFlashP.NandFlash_Data00 -> IO.HplPioB9; HplNandFlashP.NandFlash_Data01 -> IO.HplPioB10; HplNandFlashP.NandFlash_Data02 -> IO.HplPioB11; HplNandFlashP.NandFlash_Data03 -> IO.HplPioB12; HplNandFlashP.NandFlash_Data04 -> IO.HplPioB13; HplNandFlashP.NandFlash_Data05 -> IO.HplPioB14; HplNandFlashP.NandFlash_Data06 -> IO.HplPioB15; HplNandFlashP.NandFlash_Data07 -> IO.HplPioB16; HplNandFlashP.NandFlash_Data08 -> IO.HplPioB25; HplNandFlashP.NandFlash_Data09 -> IO.HplPioB26; HplNandFlashP.NandFlash_Data10 -> IO.HplPioB27; HplNandFlashP.NandFlash_Data11 -> IO.HplPioB28; HplNandFlashP.NandFlash_Data12 -> IO.HplPioB29; HplNandFlashP.NandFlash_Data13 -> IO.HplPioB30; HplNandFlashP.NandFlash_Data14 -> IO.HplPioB31; HplNandFlashP.NandFlash_Data15 -> IO.HplPioB6; components LedsC, LcdC; HplNandFlashP.Leds -> LedsC; HplNandFlashP.Draw -> LcdC; components new TimerMilliC() as TimerC; HplNandFlashP.ReadBlockTimer -> TimerC; } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/nandflash-working/HplNandFlashP.nc000066400000000000000000001065511207233610700300020ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "HplNandFlash.h" module HplNandFlashP{ provides interface HplNandFlash as Hpl; uses interface HplSam3uPeripheralClockCntl as HSMC4ClockControl; uses interface GeneralIO as NandFlash_CE; uses interface GeneralIO as NandFlash_RB; uses interface HplSam3uGeneralIOPin as NandFlash_OE; uses interface HplSam3uGeneralIOPin as NandFlash_WE; uses interface HplSam3uGeneralIOPin as NandFlash_CLE; uses interface HplSam3uGeneralIOPin as NandFlash_ALE; uses interface HplSam3uGeneralIOPin as NandFlash_Data00; uses interface HplSam3uGeneralIOPin as NandFlash_Data01; uses interface HplSam3uGeneralIOPin as NandFlash_Data02; uses interface HplSam3uGeneralIOPin as NandFlash_Data03; uses interface HplSam3uGeneralIOPin as NandFlash_Data04; uses interface HplSam3uGeneralIOPin as NandFlash_Data05; uses interface HplSam3uGeneralIOPin as NandFlash_Data06; uses interface HplSam3uGeneralIOPin as NandFlash_Data07; uses interface HplSam3uGeneralIOPin as NandFlash_Data08; uses interface HplSam3uGeneralIOPin as NandFlash_Data09; uses interface HplSam3uGeneralIOPin as NandFlash_Data10; uses interface HplSam3uGeneralIOPin as NandFlash_Data11; uses interface HplSam3uGeneralIOPin as NandFlash_Data12; uses interface HplSam3uGeneralIOPin as NandFlash_Data13; uses interface HplSam3uGeneralIOPin as NandFlash_Data14; uses interface HplSam3uGeneralIOPin as NandFlash_Data15; uses interface Leds; uses interface Draw; uses interface Timer as ReadBlockTimer; } implementation { /// Nand flash commands #define COMMAND_READ_1 0x00 #define COMMAND_READ_2 0x30 #define COMMAND_COPYBACK_READ_1 0x00 #define COMMAND_COPYBACK_READ_2 0x35 #define COMMAND_COPYBACK_PROGRAM_1 0x85 #define COMMAND_COPYBACK_PROGRAM_2 0x10 #define COMMAND_RANDOM_OUT 0x05 #define COMMAND_RANDOM_OUT_2 0xE0 #define COMMAND_RANDOM_IN 0x85 #define COMMAND_READID 0x90 #define COMMAND_WRITE_1 0x80 #define COMMAND_WRITE_2 0x10 #define COMMAND_ERASE_1 0x60 #define COMMAND_ERASE_2 0xD0 #define COMMAND_STATUS 0x70 #define COMMAND_RESET 0xFF #define COMMAND_READ_A 0x00 #define COMMAND_READ_C 0x50 #define STATUS_READY (1 << 6) #define STATUS_ERROR (1 << 0) #define WRITE_COMMAND(commandAddress, u_command) \ {*((volatile uint8_t *) commandAddress) = (uint8_t) u_command;} #define WRITE_COMMAND16(commandAddress, u_command) \ {*((volatile uint16_t *) commandAddress) = (uint16_t) u_command;} #define WRITE_ADDRESS(addressAddress, address) \ {*((volatile uint8_t *) addressAddress) = (uint8_t) address;} #define WRITE_ADDRESS16(addressAddress, address) \ {*((volatile uint16_t *) addressAddress) = (uint16_t) address;} #define WRITE_DATA8(dataAddress, data) \ {*((volatile uint8_t *) dataAddress) = (uint8_t) data;} #define READ_DATA8(dataAddress) \ (*((volatile uint8_t *) dataAddress)) #define WRITE_DATA16(dataAddress, data) \ {*((volatile uint16_t *) dataAddress) = (uint16_t) data;} #define READ_DATA16(dataAddress) \ (*((volatile uint16_t *) dataAddress)) /// Number of tries for erasing a block #define NUMERASETRIES 2 /// Number of tries for writing a block #define NUMWRITETRIES 2 /// Number of tries for copying a block #define NUMCOPYTRIES 2 /// Number of NandFlash models inside the list. #define NandFlashModelList_SIZE 58 #define MODEL(raw) ((struct NandFlashModel *) raw) //------------------------------------------------------------------------------ // Exported variables //------------------------------------------------------------------------------ //extern const struct NandFlashModel nandFlashModelList[NandFlashModelList_SIZE]; /// Spare area placement scheme for 256 byte pages. const struct NandSpareScheme nandSpareScheme256 = { // Bad block marker is at position #5 5, // 3 ecc bytes 3, // Ecc bytes positions {0, 1, 2}, // 4 extra bytes 4, // Extra bytes positions {3, 4, 6, 7} }; /// Spare area placement scheme for 512 byte pages. const struct NandSpareScheme nandSpareScheme512 = { // Bad block marker is at position #5 5, // 6 ecc bytes 6, // Ecc bytes positions {0, 1, 2, 3, 6, 7}, // 8 extra bytes 8, // Extra bytes positions {8, 9, 10, 11, 12, 13, 14, 15} }; /// Spare area placement scheme for 2048 byte pages. const struct NandSpareScheme nandSpareScheme2048 = { // Bad block marker is at position #0 0, // 24 ecc bytes 24, // Ecc bytes positions {40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63}, // 38 extra bytes 38, // Extra bytes positions {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39} }; /// List of NandFlash models which can be recognized by the software. const struct NandFlashModel nandFlashModelList[NandFlashModelList_SIZE] = { // | ID | Options | Page | Mo | Block |BlkPg |DevBlk {0x6e, NandFlashModel_DATABUS8, 256, 1, 4, &nandSpareScheme256}, {0x64, NandFlashModel_DATABUS8, 256, 2, 4, &nandSpareScheme256}, {0x6b, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xe8, NandFlashModel_DATABUS8, 256, 1, 4, &nandSpareScheme256}, {0xec, NandFlashModel_DATABUS8, 256, 1, 4, &nandSpareScheme256}, {0xea, NandFlashModel_DATABUS8, 256, 2, 4, &nandSpareScheme256}, {0xd5, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xe3, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xe5, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xd6, NandFlashModel_DATABUS8, 512, 8, 8, &nandSpareScheme512}, {0x39, NandFlashModel_DATABUS8, 512, 8, 8, &nandSpareScheme512}, {0xe6, NandFlashModel_DATABUS8, 512, 8, 8, &nandSpareScheme512}, {0x49, NandFlashModel_DATABUS16, 512, 8, 8, &nandSpareScheme512}, {0x59, NandFlashModel_DATABUS16, 512, 8, 8, &nandSpareScheme512}, {0x33, NandFlashModel_DATABUS8, 512, 16, 16, &nandSpareScheme512}, {0x73, NandFlashModel_DATABUS8, 512, 16, 16, &nandSpareScheme512}, {0x43, NandFlashModel_DATABUS16, 512, 16, 16, &nandSpareScheme512}, {0x53, NandFlashModel_DATABUS16, 512, 16, 16, &nandSpareScheme512}, {0x35, NandFlashModel_DATABUS8, 512, 32, 16, &nandSpareScheme512}, {0x75, NandFlashModel_DATABUS8, 512, 32, 16, &nandSpareScheme512}, {0x45, NandFlashModel_DATABUS16, 512, 32, 16, &nandSpareScheme512}, {0x55, NandFlashModel_DATABUS16, 512, 32, 16, &nandSpareScheme512}, {0x36, NandFlashModel_DATABUS8, 512, 64, 16, &nandSpareScheme512}, {0x76, NandFlashModel_DATABUS8, 512, 64, 16, &nandSpareScheme512}, {0x46, NandFlashModel_DATABUS16, 512, 64, 16, &nandSpareScheme512}, {0x56, NandFlashModel_DATABUS16, 512, 64, 16, &nandSpareScheme512}, {0x78, NandFlashModel_DATABUS8, 512, 128, 16, &nandSpareScheme512}, {0x39, NandFlashModel_DATABUS8, 512, 128, 16, &nandSpareScheme512}, {0x79, NandFlashModel_DATABUS8, 512, 128, 16, &nandSpareScheme512}, {0x72, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x49, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x74, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x59, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x71, NandFlashModel_DATABUS8, 512, 256, 16, &nandSpareScheme512}, // Large blocks devices. Parameters must be fetched from the extended I #define OPTIONS NandFlashModel_COPYBACK {0xA2, NandFlashModel_DATABUS8 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xF2, NandFlashModel_DATABUS8 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xB2, NandFlashModel_DATABUS16 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xC2, NandFlashModel_DATABUS16 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xA1, NandFlashModel_DATABUS8 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xF1, NandFlashModel_DATABUS8 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xB1, NandFlashModel_DATABUS16 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xC1, NandFlashModel_DATABUS16 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xAA, NandFlashModel_DATABUS8 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xDA, NandFlashModel_DATABUS8 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xBA, NandFlashModel_DATABUS16 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xCA, NandFlashModel_DATABUS16 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xAC, NandFlashModel_DATABUS8 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xDC, NandFlashModel_DATABUS8 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xBC, NandFlashModel_DATABUS16 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xCC, NandFlashModel_DATABUS16 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xA3, NandFlashModel_DATABUS8 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xD3, NandFlashModel_DATABUS8 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xB3, NandFlashModel_DATABUS16 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xC3, NandFlashModel_DATABUS16 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xA5, NandFlashModel_DATABUS8 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, {0xD5, NandFlashModel_DATABUS8 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, {0xB5, NandFlashModel_DATABUS16 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, {0xC5, NandFlashModel_DATABUS16 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, }; uint16_t numBlocks; uint32_t memSize; uint32_t blockSize; uint16_t numPagesPerBlock; uint16_t pageDataSize; void WaitReady(){ WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_STATUS); while ((READ_DATA8(BOARD_NF_DATA_ADDR) & STATUS_READY) != STATUS_READY); } uint8_t GetDataBusWidth(const struct NandFlashModel *model){ return (model->options&NandFlashModel_DATABUS16)? 16: 8; } void WriteColumnAddress(const struct RawNandFlash *raw, uint16_t columnAddress){ uint16_t pageSize = call Hpl.getPageDataSize(MODEL(raw)); call Draw.drawInt(200, 250, pageSize, 1, COLOR_BLACK); /* Check the data bus width of the NandFlash */ if (GetDataBusWidth(MODEL(raw)) == 16) { /* Div 2 is because we address in word and not in byte */ columnAddress >>= 1; } while (pageSize > 0) { if (GetDataBusWidth(MODEL(raw)) == 16) { WRITE_ADDRESS16(BOARD_NF_ADDRESS_ADDR, columnAddress & 0xFF); } else { WRITE_ADDRESS(BOARD_NF_ADDRESS_ADDR, columnAddress & 0xFF); } pageSize >>= 8; columnAddress >>= 8; } } //------------------------------------------------------------------------------ /// Sends the row address to the NandFlash chip. /// \param raw Pointer to a RawNandFlash instance. /// \param rowAddress Row address to send. //------------------------------------------------------------------------------ void WriteRowAddress(const struct RawNandFlash *raw, uint32_t rowAddress){ uint32_t numPages = call Hpl.getDeviceSizeInPages(MODEL(raw)); while (numPages > 0) { if (GetDataBusWidth(MODEL(raw)) == 16) { WRITE_ADDRESS16(BOARD_NF_ADDRESS_ADDR, rowAddress & 0xFF); } else { WRITE_ADDRESS(BOARD_NF_ADDRESS_ADDR, rowAddress & 0xFF); } numPages >>= 8; rowAddress >>= 8; } } void WriteData(const struct RawNandFlash *raw, uint8_t *buffer, uint32_t size){ uint32_t i; // Check the data bus width of the NandFlash if (GetDataBusWidth(MODEL(raw)) == 16) { uint16_t *buffer16 = (uint16_t *) buffer; size >>= 1; for(i=0; i < size; i++) { //call Draw.drawInt(15,50, buffer16[i], 1, COLOR_RED); WRITE_DATA16(BOARD_NF_DATA_ADDR, /*buffer16[i]*/ 23); } } else { for(i=0; i < size; i++) { WRITE_DATA8(BOARD_NF_DATA_ADDR, buffer[i]); } } } uint8_t count = 0; void ReadData(const struct RawNandFlash *raw, uint8_t *buffer, uint32_t size){ uint32_t i; // Check the chip data bus width count ++; if (GetDataBusWidth(MODEL(raw)) == 16) { uint16_t *buffer16 = (uint16_t *) buffer; size >>= 1; call Draw.drawInt(200,130, size, 1, COLOR_YELLOW); for (i=0 ; i < size ; i++) { //buffer16[i] = READ_DATA16(BOARD_NF_DATA_ADDR); call Draw.drawInt(150,50, READ_DATA16(BOARD_NF_DATA_ADDR), 1, COLOR_BLACK); } call Draw.drawInt(100,150, buffer16[0], 1, COLOR_BLACK); call Draw.drawInt(200,150, buffer16[30], 1, COLOR_BLACK); } else { for (i=0; i < size; i++) { buffer[i] = READ_DATA8(BOARD_NF_DATA_ADDR); } } call Draw.drawInt(count*15,130, count, 1, COLOR_BLUE); } uint8_t IsOperationComplete(const struct RawNandFlash *raw){ uint8_t status; WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_STATUS); status = READ_DATA8(BOARD_NF_DATA_ADDR); if (((status & STATUS_READY) != STATUS_READY) || ((status & STATUS_ERROR) != 0)) { return 0; } return 1; } uint8_t EraseBlock( const struct RawNandFlash *raw, unsigned short block){ uint8_t error = 0; uint32_t rowAddress; // Calculate address used for erase rowAddress = block * call Hpl.getBlockSizeInPages(MODEL(raw)); // Start erase //ENABLE_CE(raw); // Enable CE call NandFlash_CE.clr(); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_ERASE_1); WriteRowAddress(raw, rowAddress); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_ERASE_2); WaitReady(); if (!IsOperationComplete(raw)) { error = NandCommon_ERROR_CANNOTERASE; } //DISABLE_CE(raw); // Disable CE call NandFlash_CE.set(); return error; } uint8_t WritePage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare){ uint32_t pageSize = call Hpl.getPageDataSize(MODEL(raw)); uint32_t spareDataSize = call Hpl.getPageSpareSize(MODEL(raw)); uint16_t dummyByte; uint32_t rowAddress; uint8_t error = 0; // Calculate physical address of the page rowAddress = block * call Hpl.getBlockSizeInPages(MODEL(raw)) + page; // Start write operation //ENABLE_CE(raw); // Enable CE; call NandFlash_CE.clr(); // Write data area if needed if (data) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_1); WriteColumnAddress(raw, 0); WriteRowAddress(raw, rowAddress); WriteData(raw, (uint8_t *) data, pageSize); //call Draw.drawInt(50, 50, (uint8_t)data[0], 1, COLOR_RED); // Spare is written here as well since it is more efficient if (spare) { WriteData(raw, (uint8_t *) spare, spareDataSize); } else { // Note: special case when ECC parity generation. // ECC results are available as soon as the counter reaches the end of the main area. // But when reach PageSize for an example, it could not generate last ECC_PR, The // workaround is to receive PageSize+1 word. ReadData(raw, (uint8_t *) (&dummyByte), 2); } WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_2); WaitReady(); if (!IsOperationComplete(raw)) { error = NandCommon_ERROR_CANNOTWRITE; } } // Write spare area alone if needed if (spare && !data) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_1); WriteColumnAddress(raw, pageSize); WriteRowAddress(raw, rowAddress); WriteData(raw, (uint8_t *) spare, spareDataSize); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_2); WaitReady(); if (!IsOperationComplete(raw)) { error = NandCommon_ERROR_CANNOTWRITE; } } // Disable chip //DISABLE_CE(raw); // Disable CE call NandFlash_CE.set(); return error; } uint8_t CopyPage(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t sourcePage, uint16_t destBlock, uint16_t destPage){ uint32_t sourceRow, destRow; uint8_t error = 0; uint8_t data[NandCommon_MAXPAGEDATASIZE]; uint8_t spare[NandCommon_MAXPAGESPARESIZE]; uint16_t numPages = call Hpl.getBlockSizeInPages(MODEL(raw)); sourceRow = sourceBlock * numPages + sourcePage; destRow = destBlock * numPages + destPage; if (call Hpl.readPage(raw, sourceBlock, sourcePage, data, spare)) { error = NandCommon_ERROR_CANNOTREAD; } else if (call Hpl.writePage(raw, destBlock, destPage, data, spare)) { error = NandCommon_ERROR_CANNOTWRITE; } return error; } void configureNandFlash(uint8_t busWidth){ // Take a look at board_memories.h -- NOT CHIP_NAND_CTRL! // set clock // set smc registers volatile smc_setup_t *SETUP = (volatile smc_setup_t *) (0x400E0084 + 0x0); smc_setup_t setup = *SETUP; volatile smc_pulse_t *PULSE = (volatile smc_pulse_t *) (0x400E0084 + 0x4); smc_pulse_t pulse = *PULSE; volatile smc_cycle_t *CYCLE = (volatile smc_cycle_t *) (0x400E0084 + 0x8); smc_cycle_t cycle = *CYCLE; volatile smc_timings_t *TIMINGS = (volatile smc_timings_t *) (0x400E0084 + 0xC); smc_timings_t timings = *TIMINGS; volatile smc_mode_t *MODE = (volatile smc_mode_t *) (0x400E0084 + 0x10); smc_mode_t mode = *MODE; // start clock for register access call HSMC4ClockControl.disable(); call HSMC4ClockControl.enable(); setup.bits.nwe_setup = 0; setup.bits.ncs_wr_setup = 1; setup.bits.nrd_setup = 0; setup.bits.ncs_rd_setup = 1; *SETUP = setup; pulse.bits.nwe_pulse = 2; pulse.bits.ncs_wr_pulse = 3; pulse.bits.nrd_pulse = 3; pulse.bits.ncs_rd_pulse = 4; *PULSE = pulse; cycle.bits.nwe_cycle = 4; cycle.bits.nrd_cycle = 7; *CYCLE = cycle; timings.bits.tclr = 1; timings.bits.tadl = 2; timings.bits.tar = 1; timings.bits.trr = 1; timings.bits.twb = 2; timings.bits.rbnsel = 7; timings.bits.nfsel = 1; *TIMINGS = timings; if(busWidth == 8){ mode.bits.dbw = 0; mode.bits.read_mode = 1; mode.bits.write_mode = 1; *MODE = mode; }else if(busWidth == 16){ mode.bits.dbw = 1; mode.bits.read_mode = 1; mode.bits.write_mode = 1; *MODE = mode; } } void configurePsRam(){ // TODO: Take a look at board_memories.h -- NOT CHIP_NAND_CTRL! // TODO: Does Atmel code work with this disabled? } void configureNandPins(){ // Pin setting call NandFlash_CE.makeOutput(); call NandFlash_RB.makeInput(); call NandFlash_OE.disablePioControl(); call NandFlash_WE.disablePioControl(); call NandFlash_CLE.disablePioControl(); call NandFlash_ALE.disablePioControl(); call NandFlash_OE.selectPeripheralA(); call NandFlash_WE.selectPeripheralA(); call NandFlash_CLE.selectPeripheralA(); call NandFlash_ALE.selectPeripheralA(); call NandFlash_Data00.disablePioControl(); call NandFlash_Data01.disablePioControl(); call NandFlash_Data02.disablePioControl(); call NandFlash_Data03.disablePioControl(); call NandFlash_Data04.disablePioControl(); call NandFlash_Data05.disablePioControl(); call NandFlash_Data06.disablePioControl(); call NandFlash_Data07.disablePioControl(); call NandFlash_Data08.disablePioControl(); call NandFlash_Data09.disablePioControl(); call NandFlash_Data10.disablePioControl(); call NandFlash_Data11.disablePioControl(); call NandFlash_Data12.disablePioControl(); call NandFlash_Data13.disablePioControl(); call NandFlash_Data14.disablePioControl(); call NandFlash_Data15.disablePioControl(); call NandFlash_Data00.selectPeripheralA(); call NandFlash_Data01.selectPeripheralA(); call NandFlash_Data02.selectPeripheralA(); call NandFlash_Data03.selectPeripheralA(); call NandFlash_Data04.selectPeripheralA(); call NandFlash_Data05.selectPeripheralA(); call NandFlash_Data06.selectPeripheralA(); call NandFlash_Data07.selectPeripheralA(); call NandFlash_Data08.selectPeripheralA(); call NandFlash_Data09.selectPeripheralA(); call NandFlash_Data10.selectPeripheralA(); call NandFlash_Data11.selectPeripheralA(); call NandFlash_Data12.selectPeripheralA(); call NandFlash_Data13.selectPeripheralA(); call NandFlash_Data14.selectPeripheralA(); call NandFlash_Data15.selectPeripheralB(); // PB6 } command uint8_t Hpl.hasSmallBlocks(const struct NandFlashModel *model){ return (model->pageSizeInBytes <= 512 )? 1: 0; } //------------------------------------------------------------------------------ /// Returns the size of the data area of a page in bytes. /// \param model Pointer to a NandFlashModel instance. //------------------------------------------------------------------------------ command uint16_t Hpl.getPageDataSize(const struct NandFlashModel *model){ return model->pageSizeInBytes; } //------------------------------------------------------------------------------ /// Returns the size of the spare area of a page in bytes. /// \param model Pointer to a NandFlashModel instance. //------------------------------------------------------------------------------ command uint8_t Hpl.getPageSpareSize(const struct NandFlashModel *model){ return (model->pageSizeInBytes>>5); /// Spare size is 16/512 of data size } command void Hpl.init(struct RawNandFlash *HplNand, const struct NandFlashModel *model, uint32_t commandAddr, uint32_t addressAddr, uint32_t dataAddr){ uint32_t chipId; uint8_t error; uint8_t busWidth = 16; //configurePsRam(); configureNandFlash(busWidth); configureNandPins(); HplNand -> commandAddress = commandAddr; HplNand -> addressAddress = addressAddr; HplNand -> dataAddress = dataAddr; call Hpl.reset(); if(!model){ chipId = call Hpl.readId(); error = call Hpl.findNandModel(nandFlashModelList, NandFlashModelList_SIZE, &(HplNand->model), chipId); }else{ HplNand -> model = *model; } if(!error){ } else { } busWidth = 0; busWidth = GetDataBusWidth(MODEL(HplNand)); configureNandFlash(busWidth); memSize = call Hpl.getDeviceSizeInBytes(MODEL(HplNand)); blockSize = call Hpl.getBlockSizeInBytes(MODEL(HplNand)); numBlocks = call Hpl.getDeviceSizeInBlocks(MODEL(HplNand)); pageDataSize = call Hpl.getPageDataSize(MODEL(HplNand)); numPagesPerBlock = call Hpl.getBlockSizeInPages(MODEL(HplNand)); call Draw.drawInt(150, 20, busWidth, 1, COLOR_BLACK); call Draw.drawInt(150, 40, pageDataSize, 1, COLOR_BLACK); call Draw.drawInt(150, 60, memSize, 1, COLOR_BLACK); call Draw.drawInt(150, 80, numPagesPerBlock, 1, COLOR_BLACK); } command uint8_t Hpl.findNandModel(const struct NandFlashModel *modelList, uint8_t size, struct NandFlashModel *model, uint32_t chipId){ uint8_t i, found = 0; //volatile smc_cfg_t *CFG = (volatile smc_cfg_t *) (0x400E0000); //smc_cfg_t cfg = *CFG; uint8_t id2 = (uint8_t)(chipId>>8); uint8_t id4 = (uint8_t)(chipId>>24); //call Draw.drawInt(100, 60, chipId, 1, COLOR_YELLOW); //call Draw.drawInt(100, 80, id2, 1, COLOR_YELLOW); for(i=0; iblockSizeInKBytes == 0 || model->pageSizeInBytes == 0) { //TRACE_DEBUG("Fetch from ID4(0x%.2x):\r\n", id4); /// Fetch from the extended ID4 /// ID4 D5 D4 BlockSize || D1 D0 PageSize /// 0 0 64K || 0 0 1K /// 0 1 128K || 0 1 2K /// 1 0 256K || 1 0 4K /// 1 1 512K || 1 1 8k switch(id4 & 0x03) { case 0x00: model->pageSizeInBytes = 1024; break; case 0x01: model->pageSizeInBytes = 2048; break; case 0x02: model->pageSizeInBytes = 4096; break; case 0x03: model->pageSizeInBytes = 8192; break; } switch(id4 & 0x30) { case 0x00: model->blockSizeInKBytes = 64; break; case 0x10: model->blockSizeInKBytes = 128; break; case 0x20: model->blockSizeInKBytes = 256; break; case 0x30: model->blockSizeInKBytes = 512; break; } } /* switch(model->pageSizeInBytes) { case 1024: pageSize = AT91C_HSMC4_PAGESIZE_1056_Bytes; break; case 2048: pageSize = AT91C_HSMC4_PAGESIZE_2112_Bytes; break; case 4096: pageSize = AT91C_HSMC4_PAGESIZE_4224_Bytes; break; default: ;//TRACE_ERROR("Unsupportted page size for NAND Flash Controller\n\r"); } // This part sets the SMC registers? this is it? cfg.bits.pagesize = pageSize; cfg.bits.dtomul = 7; cfg.bits.edgectrl = 1; cfg.bits.dtocyc = 0xF; cfg.bits.rspare = 1; *CFG = cfg; //HSMC4_SetMode(pageSize | AT91C_HSMC4_DTOMUL_1048576 | AT91C_HSMC4_EDGECTRL | AT91C_HSMC4_DTOCYC | AT91C_HSMC4_RSPARE); // ????????????? */ } break; } } // Check if chip has been detected if (found) { return 0; } else { return NandCommon_ERROR_UNKNOWNMODEL; } } command void Hpl.reset(){ /* 1. Enable CE 2. Write reset command 3. wait for ready 4. Disable CE */ // Enable CE call NandFlash_CE.clr(); WRITE_COMMAND16(BOARD_NF_COMMAND_ADDR, COMMAND_RESET); //WRTIE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_RESET); WaitReady(); // Disable CE call NandFlash_CE.set(); } command uint32_t Hpl.readId(){ uint32_t chipId; // enable CE call NandFlash_CE.clr(); WRITE_COMMAND16(BOARD_NF_COMMAND_ADDR, COMMAND_READID); //WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READID); WRITE_ADDRESS(BOARD_NF_ADDRESS_ADDR, 0); chipId = READ_DATA8(BOARD_NF_DATA_ADDR); chipId |= READ_DATA8(BOARD_NF_DATA_ADDR) << 8; chipId |= READ_DATA8(BOARD_NF_DATA_ADDR) << 16; chipId |= READ_DATA8(BOARD_NF_DATA_ADDR) << 24; // Disable CE call NandFlash_CE.set(); return chipId; } command uint16_t Hpl.getDeviceSizeInBlocks(const struct NandFlashModel * model){ return ((1024) / model->blockSizeInKBytes) * model->deviceSizeInMegaBytes; } command uint32_t Hpl.getDeviceSizeInPages(const struct NandFlashModel *model){ return (uint32_t) call Hpl.getDeviceSizeInBlocks(model) * call Hpl.getBlockSizeInPages(model); } command uint8_t Hpl.eraseBlock(const struct RawNandFlash *raw, uint16_t block){ uint8_t numTries = NUMERASETRIES; while (numTries > 0) { if (!EraseBlock(raw, block)) { return 0; } numTries--; } return NandCommon_ERROR_BADBLOCK; } command uint16_t Hpl.getBlockSizeInPages(const struct NandFlashModel *model){ return model->blockSizeInKBytes * 1024 / model->pageSizeInBytes; } command uint8_t Hpl.readPage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare){ uint32_t colAddress; uint32_t rowAddress; uint8_t hasSmallBlocks; uint32_t pageSpareSize; hasSmallBlocks = call Hpl.hasSmallBlocks(MODEL(raw)); pageSpareSize = call Hpl.getPageSpareSize(MODEL(raw)); // Calculate actual address of the page rowAddress = (uint32_t) block * numPagesPerBlock /*call Hpl.getBlockSizeInPages(MODEL(raw))*/ + page; // Start operation //ENABLE_CE(raw); // Enable CE call NandFlash_CE.clr(); if (data) { colAddress = 0; } else { // to read spare area in sequential access colAddress = pageDataSize; } // Use either small blocks or large blocks data area read if (hasSmallBlocks) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_A); WriteColumnAddress(raw, colAddress); WriteRowAddress(raw, rowAddress); } else { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_1); WriteColumnAddress(raw, colAddress); WriteRowAddress(raw, rowAddress); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_2); } // Wait for the nand to be ready WaitReady(); //pageDataSize = call Hpl.getPageDataSize(MODEL(raw)); call Draw.drawInt(200, 220, colAddress, 1, COLOR_BLUE); call Draw.drawInt(100, 220, pageDataSize, 1, COLOR_BLUE); call Draw.drawInt(rowAddress*15, 200, rowAddress, 1, COLOR_BLUE); // Read data area if needed if (data) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_1); if(pageDataSize != 2048){ call Draw.drawInt(200, 240, page, 1, COLOR_GREEN); } ReadData(raw, (uint8_t *) data, pageDataSize); if (spare) { //call Leds.led2Toggle(); ReadData(raw, (uint8_t *) spare, pageSpareSize); } } else { // Read spare area only WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_1); ReadData(raw, (uint8_t *) spare, pageSpareSize); } // Disable CE //DISABLE_CE(raw); // Disable CE call NandFlash_CE.set(); return 0; } //------------------------------------------------------------------------------ /// Reads the bad block marker inside a spare area buffer using the provided /// scheme. /// \param scheme Pointer to a NandSpareScheme instance. /// \param spare Spare area buffer. /// \param marker Pointer to the variable to store the bad block marker. //------------------------------------------------------------------------------ command void Hpl.readBadBlockMarker(const struct NandSpareScheme *scheme, const uint8_t *spare, uint8_t *marker){ *marker = spare[scheme->badBlockMarkerPosition]; } //------------------------------------------------------------------------------ /// Modifies the bad block marker inside a spare area, using the given scheme. /// \param scheme Pointer to a NandSpareScheme instance. /// \param spare Spare area buffer. /// \param marker Bad block marker to write. //------------------------------------------------------------------------------ command void Hpl.writeBadBlockMarker(const struct NandSpareScheme *scheme, uint8_t *spare, uint8_t marker){ spare[scheme->badBlockMarkerPosition] = marker; } command uint32_t Hpl.getDeviceSizeInBytes(const struct NandFlashModel *model){ return ((uint32_t) model->deviceSizeInMegaBytes) << 20; } command uint32_t Hpl.getBlockSizeInBytes(const struct NandFlashModel *model){ return (model->blockSizeInKBytes *1024); } command uint8_t Hpl.writePage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare){ uint8_t numTries = NUMWRITETRIES; while (numTries > 0) { if (!WritePage(raw, block, page, data, spare)) { return 0; } numTries--; } return NandCommon_ERROR_BADBLOCK; } command uint8_t Hpl.copyPage(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t sourcePage, uint16_t destBlock, uint16_t destPage){ uint8_t numTries = NUMCOPYTRIES; while (numTries) { if (!CopyPage(raw, sourceBlock, sourcePage, destBlock, destPage)) { return 0; } numTries--; } return NandCommon_ERROR_BADBLOCK; } command uint8_t Hpl.copyBlock(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t destBlock){ uint32_t i; uint16_t numPages = call Hpl.getBlockSizeInPages(MODEL(raw)); // Copy all pages for (i=0; i < numPages; i++) { if (call Hpl.copyPage(raw, sourceBlock, i, destBlock, i)) { return NandCommon_ERROR_BADBLOCK; } } return 0; } uint16_t totalReadFromBlock = 0; uint16_t readBlock = 0; void* readData; const struct RawNandFlash saveRaw; void readBlockTask(){ uint8_t error; call Draw.fill(COLOR_WHITE); error = call Hpl.readPage(&saveRaw, readBlock, totalReadFromBlock, readData, 0);//ECC(skipBlock), block, i, data, 0); totalReadFromBlock ++; if (error) { //call Leds.led0Toggle(); return; }else if(totalReadFromBlock < numPagesPerBlock){ //call Draw.drawInt(totalReadFromBlock*15, 170, totalReadFromBlock, 1, COLOR_BLUE); //call Draw.drawInt(200, 185, numPagesPerBlock, 1, COLOR_BLUE); readData = (void *) ((uint8_t *) readData + pageDataSize); readBlockTask(); //call ReadBlockTimer.startOneShot(5); }else{ call Leds.led2Toggle(); } } command uint8_t Hpl.readBlock(const struct RawNandFlash *raw, uint16_t block, void *data){ //uint16_t i, error; totalReadFromBlock = 0; memcpy((void*)&saveRaw, (void*)raw, sizeof(struct RawNandFlash)); readBlock = block; readData = data; readBlockTask(); return 0; } command uint8_t Hpl.writeBlock(const struct RawNandFlash *raw, uint16_t block, void *data){ uint8_t error, i; for(i=0; i as ReadBlockTimer; } implementation { /// Nand flash commands #define COMMAND_READ_1 0x00 #define COMMAND_READ_2 0x30 #define COMMAND_COPYBACK_READ_1 0x00 #define COMMAND_COPYBACK_READ_2 0x35 #define COMMAND_COPYBACK_PROGRAM_1 0x85 #define COMMAND_COPYBACK_PROGRAM_2 0x10 #define COMMAND_RANDOM_OUT 0x05 #define COMMAND_RANDOM_OUT_2 0xE0 #define COMMAND_RANDOM_IN 0x85 #define COMMAND_READID 0x90 #define COMMAND_WRITE_1 0x80 #define COMMAND_WRITE_2 0x10 #define COMMAND_ERASE_1 0x60 #define COMMAND_ERASE_2 0xD0 #define COMMAND_STATUS 0x70 #define COMMAND_RESET 0xFF #define COMMAND_READ_A 0x00 #define COMMAND_READ_C 0x50 #define STATUS_READY (1 << 6) #define STATUS_ERROR (1 << 0) #define WRITE_COMMAND(commandAddress, u_command) \ {*((volatile uint8_t *) commandAddress) = (uint8_t) u_command;} #define WRITE_COMMAND16(commandAddress, u_command) \ {*((volatile uint16_t *) commandAddress) = (uint16_t) u_command;} #define WRITE_ADDRESS(addressAddress, address) \ {*((volatile uint8_t *) addressAddress) = (uint8_t) address;} #define WRITE_ADDRESS16(addressAddress, address) \ {*((volatile uint16_t *) addressAddress) = (uint16_t) address;} #define WRITE_DATA8(dataAddress, data) \ {*((volatile uint8_t *) dataAddress) = (uint8_t) data;} #define READ_DATA8(dataAddress) \ (*((volatile uint8_t *) dataAddress)) #define WRITE_DATA16(dataAddress, data) \ {*((volatile uint16_t *) dataAddress) = (uint16_t) data;} #define READ_DATA16(dataAddress) \ (*((volatile uint16_t *) dataAddress)) /// Number of tries for erasing a block #define NUMERASETRIES 2 /// Number of tries for writing a block #define NUMWRITETRIES 2 /// Number of tries for copying a block #define NUMCOPYTRIES 2 /// Number of NandFlash models inside the list. #define NandFlashModelList_SIZE 58 #define MODEL(raw) ((struct NandFlashModel *) raw) //------------------------------------------------------------------------------ // Exported variables //------------------------------------------------------------------------------ //extern const struct NandFlashModel nandFlashModelList[NandFlashModelList_SIZE]; /// Spare area placement scheme for 256 byte pages. const struct NandSpareScheme nandSpareScheme256 = { // Bad block marker is at position #5 5, // 3 ecc bytes 3, // Ecc bytes positions {0, 1, 2}, // 4 extra bytes 4, // Extra bytes positions {3, 4, 6, 7} }; /// Spare area placement scheme for 512 byte pages. const struct NandSpareScheme nandSpareScheme512 = { // Bad block marker is at position #5 5, // 6 ecc bytes 6, // Ecc bytes positions {0, 1, 2, 3, 6, 7}, // 8 extra bytes 8, // Extra bytes positions {8, 9, 10, 11, 12, 13, 14, 15} }; /// Spare area placement scheme for 2048 byte pages. const struct NandSpareScheme nandSpareScheme2048 = { // Bad block marker is at position #0 0, // 24 ecc bytes 24, // Ecc bytes positions {40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63}, // 38 extra bytes 38, // Extra bytes positions {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39} }; /// List of NandFlash models which can be recognized by the software. const struct NandFlashModel nandFlashModelList[NandFlashModelList_SIZE] = { // | ID | Options | Page | Mo | Block |BlkPg |DevBlk {0x6e, NandFlashModel_DATABUS8, 256, 1, 4, &nandSpareScheme256}, {0x64, NandFlashModel_DATABUS8, 256, 2, 4, &nandSpareScheme256}, {0x6b, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xe8, NandFlashModel_DATABUS8, 256, 1, 4, &nandSpareScheme256}, {0xec, NandFlashModel_DATABUS8, 256, 1, 4, &nandSpareScheme256}, {0xea, NandFlashModel_DATABUS8, 256, 2, 4, &nandSpareScheme256}, {0xd5, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xe3, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xe5, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xd6, NandFlashModel_DATABUS8, 512, 8, 8, &nandSpareScheme512}, {0x39, NandFlashModel_DATABUS8, 512, 8, 8, &nandSpareScheme512}, {0xe6, NandFlashModel_DATABUS8, 512, 8, 8, &nandSpareScheme512}, {0x49, NandFlashModel_DATABUS16, 512, 8, 8, &nandSpareScheme512}, {0x59, NandFlashModel_DATABUS16, 512, 8, 8, &nandSpareScheme512}, {0x33, NandFlashModel_DATABUS8, 512, 16, 16, &nandSpareScheme512}, {0x73, NandFlashModel_DATABUS8, 512, 16, 16, &nandSpareScheme512}, {0x43, NandFlashModel_DATABUS16, 512, 16, 16, &nandSpareScheme512}, {0x53, NandFlashModel_DATABUS16, 512, 16, 16, &nandSpareScheme512}, {0x35, NandFlashModel_DATABUS8, 512, 32, 16, &nandSpareScheme512}, {0x75, NandFlashModel_DATABUS8, 512, 32, 16, &nandSpareScheme512}, {0x45, NandFlashModel_DATABUS16, 512, 32, 16, &nandSpareScheme512}, {0x55, NandFlashModel_DATABUS16, 512, 32, 16, &nandSpareScheme512}, {0x36, NandFlashModel_DATABUS8, 512, 64, 16, &nandSpareScheme512}, {0x76, NandFlashModel_DATABUS8, 512, 64, 16, &nandSpareScheme512}, {0x46, NandFlashModel_DATABUS16, 512, 64, 16, &nandSpareScheme512}, {0x56, NandFlashModel_DATABUS16, 512, 64, 16, &nandSpareScheme512}, {0x78, NandFlashModel_DATABUS8, 512, 128, 16, &nandSpareScheme512}, {0x39, NandFlashModel_DATABUS8, 512, 128, 16, &nandSpareScheme512}, {0x79, NandFlashModel_DATABUS8, 512, 128, 16, &nandSpareScheme512}, {0x72, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x49, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x74, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x59, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x71, NandFlashModel_DATABUS8, 512, 256, 16, &nandSpareScheme512}, // Large blocks devices. Parameters must be fetched from the extended I #define OPTIONS NandFlashModel_COPYBACK {0xA2, NandFlashModel_DATABUS8 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xF2, NandFlashModel_DATABUS8 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xB2, NandFlashModel_DATABUS16 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xC2, NandFlashModel_DATABUS16 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xA1, NandFlashModel_DATABUS8 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xF1, NandFlashModel_DATABUS8 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xB1, NandFlashModel_DATABUS16 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xC1, NandFlashModel_DATABUS16 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xAA, NandFlashModel_DATABUS8 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xDA, NandFlashModel_DATABUS8 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xBA, NandFlashModel_DATABUS16 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xCA, NandFlashModel_DATABUS16 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xAC, NandFlashModel_DATABUS8 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xDC, NandFlashModel_DATABUS8 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xBC, NandFlashModel_DATABUS16 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xCC, NandFlashModel_DATABUS16 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xA3, NandFlashModel_DATABUS8 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xD3, NandFlashModel_DATABUS8 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xB3, NandFlashModel_DATABUS16 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xC3, NandFlashModel_DATABUS16 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xA5, NandFlashModel_DATABUS8 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, {0xD5, NandFlashModel_DATABUS8 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, {0xB5, NandFlashModel_DATABUS16 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, {0xC5, NandFlashModel_DATABUS16 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, }; uint16_t numBlocks; uint32_t memSize; uint32_t blockSize; uint16_t numPagesPerBlock; uint16_t pageDataSize; void WaitReady(){ WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_STATUS); while ((READ_DATA8(BOARD_NF_DATA_ADDR) & STATUS_READY) != STATUS_READY); } uint8_t GetDataBusWidth(const struct NandFlashModel *model){ return (model->options&NandFlashModel_DATABUS16)? 16: 8; } void WriteColumnAddress(const struct RawNandFlash *raw, uint16_t columnAddress){ uint16_t pageSize = call Hpl.getPageDataSize(MODEL(raw)); call Draw.drawInt(200, 250, pageSize, 1, COLOR_BLACK); /* Check the data bus width of the NandFlash */ if (GetDataBusWidth(MODEL(raw)) == 16) { /* Div 2 is because we address in word and not in byte */ columnAddress >>= 1; } while (pageSize > 0) { if (GetDataBusWidth(MODEL(raw)) == 16) { WRITE_ADDRESS16(BOARD_NF_ADDRESS_ADDR, columnAddress & 0xFF); } else { WRITE_ADDRESS(BOARD_NF_ADDRESS_ADDR, columnAddress & 0xFF); } pageSize >>= 8; columnAddress >>= 8; } } //------------------------------------------------------------------------------ /// Sends the row address to the NandFlash chip. /// \param raw Pointer to a RawNandFlash instance. /// \param rowAddress Row address to send. //------------------------------------------------------------------------------ void WriteRowAddress(const struct RawNandFlash *raw, uint32_t rowAddress){ uint32_t numPages = call Hpl.getDeviceSizeInPages(MODEL(raw)); while (numPages > 0) { if (GetDataBusWidth(MODEL(raw)) == 16) { WRITE_ADDRESS16(BOARD_NF_ADDRESS_ADDR, rowAddress & 0xFF); } else { WRITE_ADDRESS(BOARD_NF_ADDRESS_ADDR, rowAddress & 0xFF); } numPages >>= 8; rowAddress >>= 8; } } void WriteData(const struct RawNandFlash *raw, uint8_t *buffer, uint32_t size){ uint32_t i; // Check the data bus width of the NandFlash if (GetDataBusWidth(MODEL(raw)) == 16) { uint16_t *buffer16 = (uint16_t *) buffer; size >>= 1; for(i=0; i < size; i++) { call Draw.drawInt(i*15,50, i, 1, COLOR_RED); WRITE_DATA16(BOARD_NF_DATA_ADDR, buffer16[i]); } } else { for(i=0; i < size; i++) { WRITE_DATA8(BOARD_NF_DATA_ADDR, buffer[i]); } } } uint8_t count = 0; void ReadData(const struct RawNandFlash *raw, uint8_t *buffer, uint32_t size){ uint16_t i; // Check the chip data bus width count ++; if (GetDataBusWidth(MODEL(raw)) == 16) { uint16_t *buffer16 = (uint16_t *) buffer; size >>= 1; //call Draw.drawInt(200,130, size, 1, COLOR_YELLOW); for (i=0; i < size; i++) { call Draw.drawInt(i*15,50, i, 1, COLOR_BLACK); buffer16[i] = READ_DATA16(BOARD_NF_DATA_ADDR); } call Draw.drawInt(100,150, buffer16[0], 1, COLOR_BLACK); call Draw.drawInt(200,150, buffer16[1], 1, COLOR_BLACK); } else { for (i=0; i < size; i++) { buffer[i] = READ_DATA8(BOARD_NF_DATA_ADDR); } } call Draw.drawInt(count*15,130, count, 1, COLOR_BLUE); } uint8_t IsOperationComplete(const struct RawNandFlash *raw){ uint8_t status; WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_STATUS); status = READ_DATA8(BOARD_NF_DATA_ADDR); if (((status & STATUS_READY) != STATUS_READY) || ((status & STATUS_ERROR) != 0)) { return 0; } return 1; } uint8_t EraseBlock( const struct RawNandFlash *raw, unsigned short block){ uint8_t error = 0; uint32_t rowAddress; // Calculate address used for erase rowAddress = block * call Hpl.getBlockSizeInPages(MODEL(raw)); // Start erase //ENABLE_CE(raw); // Enable CE call NandFlash_CE.clr(); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_ERASE_1); WriteRowAddress(raw, rowAddress); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_ERASE_2); WaitReady(); if (!IsOperationComplete(raw)) { error = NandCommon_ERROR_CANNOTERASE; } //DISABLE_CE(raw); // Disable CE call NandFlash_CE.set(); return error; } uint8_t WritePage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare){ uint32_t pageSize = call Hpl.getPageDataSize(MODEL(raw)); uint32_t spareDataSize = call Hpl.getPageSpareSize(MODEL(raw)); uint16_t dummyByte; uint32_t rowAddress; uint8_t error = 0; // Calculate physical address of the page rowAddress = block * call Hpl.getBlockSizeInPages(MODEL(raw)) + page; // Start write operation //ENABLE_CE(raw); // Enable CE; call NandFlash_CE.clr(); // Write data area if needed if (data) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_1); WriteColumnAddress(raw, 0); WriteRowAddress(raw, rowAddress); WriteData(raw, (uint8_t *) data, pageSize); //call Draw.drawInt(50, 50, (uint8_t)data[0], 1, COLOR_RED); // Spare is written here as well since it is more efficient if (spare) { WriteData(raw, (uint8_t *) spare, spareDataSize); } else { // Note: special case when ECC parity generation. // ECC results are available as soon as the counter reaches the end of the main area. // But when reach PageSize for an example, it could not generate last ECC_PR, The // workaround is to receive PageSize+1 word. ReadData(raw, (uint8_t *) (&dummyByte), 2); } WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_2); WaitReady(); if (!IsOperationComplete(raw)) { error = NandCommon_ERROR_CANNOTWRITE; } } // Write spare area alone if needed if (spare && !data) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_1); WriteColumnAddress(raw, pageSize); WriteRowAddress(raw, rowAddress); WriteData(raw, (uint8_t *) spare, spareDataSize); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_2); WaitReady(); if (!IsOperationComplete(raw)) { error = NandCommon_ERROR_CANNOTWRITE; } } // Disable chip //DISABLE_CE(raw); // Disable CE call NandFlash_CE.set(); return error; } uint8_t CopyPage(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t sourcePage, uint16_t destBlock, uint16_t destPage){ uint32_t sourceRow, destRow; uint8_t error = 0; uint8_t data[NandCommon_MAXPAGEDATASIZE]; uint8_t spare[NandCommon_MAXPAGESPARESIZE]; uint16_t numPages = call Hpl.getBlockSizeInPages(MODEL(raw)); sourceRow = sourceBlock * numPages + sourcePage; destRow = destBlock * numPages + destPage; if (call Hpl.readPage(raw, sourceBlock, sourcePage, data, spare)) { error = NandCommon_ERROR_CANNOTREAD; } else if (call Hpl.writePage(raw, destBlock, destPage, data, spare)) { error = NandCommon_ERROR_CANNOTWRITE; } return error; } void configureNandFlash(uint8_t busWidth){ // Take a look at board_memories.h -- NOT CHIP_NAND_CTRL! // set clock // set smc registers volatile smc_setup_t *SETUP = (volatile smc_setup_t *) (0x400E0084 + 0x0); smc_setup_t setup = *SETUP; volatile smc_pulse_t *PULSE = (volatile smc_pulse_t *) (0x400E0084 + 0x4); smc_pulse_t pulse = *PULSE; volatile smc_cycle_t *CYCLE = (volatile smc_cycle_t *) (0x400E0084 + 0x8); smc_cycle_t cycle = *CYCLE; volatile smc_timings_t *TIMINGS = (volatile smc_timings_t *) (0x400E0084 + 0xC); smc_timings_t timings = *TIMINGS; volatile smc_mode_t *MODE = (volatile smc_mode_t *) (0x400E0084 + 0x10); smc_mode_t mode = *MODE; // start clock for register access call HSMC4ClockControl.disable(); call HSMC4ClockControl.enable(); setup.bits.nwe_setup = 0; setup.bits.ncs_wr_setup = 1; setup.bits.nrd_setup = 0; setup.bits.ncs_rd_setup = 1; *SETUP = setup; pulse.bits.nwe_pulse = 2; pulse.bits.ncs_wr_pulse = 3; pulse.bits.nrd_pulse = 3; pulse.bits.ncs_rd_pulse = 4; *PULSE = pulse; cycle.bits.nwe_cycle = 4; cycle.bits.nrd_cycle = 7; *CYCLE = cycle; timings.bits.tclr = 1; timings.bits.tadl = 2; timings.bits.tar = 1; timings.bits.trr = 1; timings.bits.twb = 2; timings.bits.rbnsel = 7; timings.bits.nfsel = 1; *TIMINGS = timings; if(busWidth == 8){ mode.bits.dbw = 0; mode.bits.read_mode = 1; mode.bits.write_mode = 1; *MODE = mode; }else if(busWidth == 16){ mode.bits.dbw = 1; mode.bits.read_mode = 1; mode.bits.write_mode = 1; *MODE = mode; } } void configurePsRam(){ // TODO: Take a look at board_memories.h -- NOT CHIP_NAND_CTRL! // TODO: Does Atmel code work with this disabled? } void configureNandPins(){ // Pin setting call NandFlash_CE.makeOutput(); call NandFlash_RB.makeInput(); call NandFlash_OE.disablePioControl(); call NandFlash_WE.disablePioControl(); call NandFlash_CLE.disablePioControl(); call NandFlash_ALE.disablePioControl(); call NandFlash_OE.selectPeripheralA(); call NandFlash_WE.selectPeripheralA(); call NandFlash_CLE.selectPeripheralA(); call NandFlash_ALE.selectPeripheralA(); call NandFlash_Data00.disablePioControl(); call NandFlash_Data01.disablePioControl(); call NandFlash_Data02.disablePioControl(); call NandFlash_Data03.disablePioControl(); call NandFlash_Data04.disablePioControl(); call NandFlash_Data05.disablePioControl(); call NandFlash_Data06.disablePioControl(); call NandFlash_Data07.disablePioControl(); call NandFlash_Data08.disablePioControl(); call NandFlash_Data09.disablePioControl(); call NandFlash_Data10.disablePioControl(); call NandFlash_Data11.disablePioControl(); call NandFlash_Data12.disablePioControl(); call NandFlash_Data13.disablePioControl(); call NandFlash_Data14.disablePioControl(); call NandFlash_Data15.disablePioControl(); call NandFlash_Data00.selectPeripheralA(); call NandFlash_Data01.selectPeripheralA(); call NandFlash_Data02.selectPeripheralA(); call NandFlash_Data03.selectPeripheralA(); call NandFlash_Data04.selectPeripheralA(); call NandFlash_Data05.selectPeripheralA(); call NandFlash_Data06.selectPeripheralA(); call NandFlash_Data07.selectPeripheralA(); call NandFlash_Data08.selectPeripheralA(); call NandFlash_Data09.selectPeripheralA(); call NandFlash_Data10.selectPeripheralA(); call NandFlash_Data11.selectPeripheralA(); call NandFlash_Data12.selectPeripheralA(); call NandFlash_Data13.selectPeripheralA(); call NandFlash_Data14.selectPeripheralA(); call NandFlash_Data15.selectPeripheralB(); // PB6 } command uint8_t Hpl.hasSmallBlocks(const struct NandFlashModel *model){ return (model->pageSizeInBytes <= 512 )? 1: 0; } //------------------------------------------------------------------------------ /// Returns the size of the data area of a page in bytes. /// \param model Pointer to a NandFlashModel instance. //------------------------------------------------------------------------------ command uint16_t Hpl.getPageDataSize(const struct NandFlashModel *model){ return model->pageSizeInBytes; } //------------------------------------------------------------------------------ /// Returns the size of the spare area of a page in bytes. /// \param model Pointer to a NandFlashModel instance. //------------------------------------------------------------------------------ command uint8_t Hpl.getPageSpareSize(const struct NandFlashModel *model){ return (model->pageSizeInBytes>>5); /// Spare size is 16/512 of data size } command void Hpl.init(struct RawNandFlash *HplNand, const struct NandFlashModel *model, uint32_t commandAddr, uint32_t addressAddr, uint32_t dataAddr){ uint32_t chipId; uint8_t error; uint8_t busWidth = 16; //configurePsRam(); configureNandFlash(busWidth); configureNandPins(); HplNand -> commandAddress = commandAddr; HplNand -> addressAddress = addressAddr; HplNand -> dataAddress = dataAddr; call Hpl.reset(); if(!model){ chipId = call Hpl.readId(); error = call Hpl.findNandModel(nandFlashModelList, NandFlashModelList_SIZE, &(HplNand->model), chipId); }else{ HplNand -> model = *model; } if(!error){ } else { } busWidth = 0; busWidth = GetDataBusWidth(MODEL(HplNand)); configureNandFlash(busWidth); memSize = call Hpl.getDeviceSizeInBytes(MODEL(HplNand)); blockSize = call Hpl.getBlockSizeInBytes(MODEL(HplNand)); numBlocks = call Hpl.getDeviceSizeInBlocks(MODEL(HplNand)); pageDataSize = call Hpl.getPageDataSize(MODEL(HplNand)); numPagesPerBlock = call Hpl.getBlockSizeInPages(MODEL(HplNand)); call Draw.drawInt(150, 20, busWidth, 1, COLOR_BLACK); call Draw.drawInt(150, 40, pageDataSize, 1, COLOR_BLACK); call Draw.drawInt(150, 60, memSize, 1, COLOR_BLACK); call Draw.drawInt(150, 80, numPagesPerBlock, 1, COLOR_BLACK); } command uint8_t Hpl.findNandModel(const struct NandFlashModel *modelList, uint8_t size, struct NandFlashModel *model, uint32_t chipId){ uint8_t i, found = 0; //volatile smc_cfg_t *CFG = (volatile smc_cfg_t *) (0x400E0000); //smc_cfg_t cfg = *CFG; uint8_t id2 = (uint8_t)(chipId>>8); uint8_t id4 = (uint8_t)(chipId>>24); //call Draw.drawInt(100, 60, chipId, 1, COLOR_YELLOW); //call Draw.drawInt(100, 80, id2, 1, COLOR_YELLOW); for(i=0; iblockSizeInKBytes == 0 || model->pageSizeInBytes == 0) { //TRACE_DEBUG("Fetch from ID4(0x%.2x):\r\n", id4); /// Fetch from the extended ID4 /// ID4 D5 D4 BlockSize || D1 D0 PageSize /// 0 0 64K || 0 0 1K /// 0 1 128K || 0 1 2K /// 1 0 256K || 1 0 4K /// 1 1 512K || 1 1 8k switch(id4 & 0x03) { case 0x00: model->pageSizeInBytes = 1024; break; case 0x01: model->pageSizeInBytes = 2048; break; case 0x02: model->pageSizeInBytes = 4096; break; case 0x03: model->pageSizeInBytes = 8192; break; } switch(id4 & 0x30) { case 0x00: model->blockSizeInKBytes = 64; break; case 0x10: model->blockSizeInKBytes = 128; break; case 0x20: model->blockSizeInKBytes = 256; break; case 0x30: model->blockSizeInKBytes = 512; break; } } /* switch(model->pageSizeInBytes) { case 1024: pageSize = AT91C_HSMC4_PAGESIZE_1056_Bytes; break; case 2048: pageSize = AT91C_HSMC4_PAGESIZE_2112_Bytes; break; case 4096: pageSize = AT91C_HSMC4_PAGESIZE_4224_Bytes; break; default: ;//TRACE_ERROR("Unsupportted page size for NAND Flash Controller\n\r"); } // This part sets the SMC registers? this is it? cfg.bits.pagesize = pageSize; cfg.bits.dtomul = 7; cfg.bits.edgectrl = 1; cfg.bits.dtocyc = 0xF; cfg.bits.rspare = 1; *CFG = cfg; //HSMC4_SetMode(pageSize | AT91C_HSMC4_DTOMUL_1048576 | AT91C_HSMC4_EDGECTRL | AT91C_HSMC4_DTOCYC | AT91C_HSMC4_RSPARE); // ????????????? */ } break; } } // Check if chip has been detected if (found) { return 0; } else { return NandCommon_ERROR_UNKNOWNMODEL; } } command void Hpl.reset(){ /* 1. Enable CE 2. Write reset command 3. wait for ready 4. Disable CE */ // Enable CE call NandFlash_CE.clr(); WRITE_COMMAND16(BOARD_NF_COMMAND_ADDR, COMMAND_RESET); //WRTIE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_RESET); WaitReady(); // Disable CE call NandFlash_CE.set(); } command uint32_t Hpl.readId(){ uint32_t chipId; // enable CE call NandFlash_CE.clr(); WRITE_COMMAND16(BOARD_NF_COMMAND_ADDR, COMMAND_READID); //WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READID); WRITE_ADDRESS(BOARD_NF_ADDRESS_ADDR, 0); chipId = READ_DATA8(BOARD_NF_DATA_ADDR); chipId |= READ_DATA8(BOARD_NF_DATA_ADDR) << 8; chipId |= READ_DATA8(BOARD_NF_DATA_ADDR) << 16; chipId |= READ_DATA8(BOARD_NF_DATA_ADDR) << 24; // Disable CE call NandFlash_CE.set(); return chipId; } command uint16_t Hpl.getDeviceSizeInBlocks(const struct NandFlashModel * model){ return ((1024) / model->blockSizeInKBytes) * model->deviceSizeInMegaBytes; } command uint32_t Hpl.getDeviceSizeInPages(const struct NandFlashModel *model){ return (uint32_t) call Hpl.getDeviceSizeInBlocks(model) * call Hpl.getBlockSizeInPages(model); } command uint8_t Hpl.eraseBlock(const struct RawNandFlash *raw, uint16_t block){ uint8_t numTries = NUMERASETRIES; while (numTries > 0) { if (!EraseBlock(raw, block)) { return 0; } numTries--; } return NandCommon_ERROR_BADBLOCK; } command uint16_t Hpl.getBlockSizeInPages(const struct NandFlashModel *model){ return model->blockSizeInKBytes * 1024 / model->pageSizeInBytes; } command uint8_t Hpl.readPage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare){ uint32_t colAddress; uint32_t rowAddress; uint8_t hasSmallBlocks; uint32_t pageSpareSize; hasSmallBlocks = call Hpl.hasSmallBlocks(MODEL(raw)); pageSpareSize = call Hpl.getPageSpareSize(MODEL(raw)); // Calculate actual address of the page rowAddress = (uint32_t) block * numPagesPerBlock /*call Hpl.getBlockSizeInPages(MODEL(raw))*/ + page; // Start operation //ENABLE_CE(raw); // Enable CE call NandFlash_CE.clr(); if (data) { colAddress = 0; } else { // to read spare area in sequential access colAddress = pageDataSize; } // Use either small blocks or large blocks data area read if (hasSmallBlocks) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_A); WriteColumnAddress(raw, colAddress); WriteRowAddress(raw, rowAddress); } else { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_1); WriteColumnAddress(raw, colAddress); WriteRowAddress(raw, rowAddress); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_2); } // Wait for the nand to be ready WaitReady(); //pageDataSize = call Hpl.getPageDataSize(MODEL(raw)); call Draw.drawInt(200, 220, colAddress, 1, COLOR_BLUE); call Draw.drawInt(100, 220, pageDataSize, 1, COLOR_BLUE); call Draw.drawInt(rowAddress*15, 200, rowAddress, 1, COLOR_BLUE); // Read data area if needed if (data) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_1); if(pageDataSize != 2048){ call Draw.drawInt(200, 240, page, 1, COLOR_GREEN); } ReadData(raw, (uint8_t *) data, pageDataSize); if (spare) { //call Leds.led2Toggle(); ReadData(raw, (uint8_t *) spare, pageSpareSize); } } else { // Read spare area only WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_1); ReadData(raw, (uint8_t *) spare, pageSpareSize); } // Disable CE //DISABLE_CE(raw); // Disable CE call NandFlash_CE.set(); return 0; } //------------------------------------------------------------------------------ /// Reads the bad block marker inside a spare area buffer using the provided /// scheme. /// \param scheme Pointer to a NandSpareScheme instance. /// \param spare Spare area buffer. /// \param marker Pointer to the variable to store the bad block marker. //------------------------------------------------------------------------------ command void Hpl.readBadBlockMarker(const struct NandSpareScheme *scheme, const uint8_t *spare, uint8_t *marker){ *marker = spare[scheme->badBlockMarkerPosition]; } //------------------------------------------------------------------------------ /// Modifies the bad block marker inside a spare area, using the given scheme. /// \param scheme Pointer to a NandSpareScheme instance. /// \param spare Spare area buffer. /// \param marker Bad block marker to write. //------------------------------------------------------------------------------ command void Hpl.writeBadBlockMarker(const struct NandSpareScheme *scheme, uint8_t *spare, uint8_t marker){ spare[scheme->badBlockMarkerPosition] = marker; } command uint32_t Hpl.getDeviceSizeInBytes(const struct NandFlashModel *model){ return ((uint32_t) model->deviceSizeInMegaBytes) << 20; } command uint32_t Hpl.getBlockSizeInBytes(const struct NandFlashModel *model){ return (model->blockSizeInKBytes *1024); } command uint8_t Hpl.writePage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare){ uint8_t numTries = NUMWRITETRIES; while (numTries > 0) { if (!WritePage(raw, block, page, data, spare)) { return 0; } numTries--; } return NandCommon_ERROR_BADBLOCK; } command uint8_t Hpl.copyPage(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t sourcePage, uint16_t destBlock, uint16_t destPage){ uint8_t numTries = NUMCOPYTRIES; while (numTries) { if (!CopyPage(raw, sourceBlock, sourcePage, destBlock, destPage)) { return 0; } numTries--; } return NandCommon_ERROR_BADBLOCK; } command uint8_t Hpl.copyBlock(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t destBlock){ uint32_t i; uint16_t numPages = call Hpl.getBlockSizeInPages(MODEL(raw)); // Copy all pages for (i=0; i < numPages; i++) { if (call Hpl.copyPage(raw, sourceBlock, i, destBlock, i)) { return NandCommon_ERROR_BADBLOCK; } } return 0; } uint16_t totalReadFromBlock = 0; uint16_t readBlock = 0; void* readData; const struct RawNandFlash saveRaw; void readBlockTask(){ uint8_t error; call Draw.fill(COLOR_WHITE); error = call Hpl.readPage(&saveRaw, readBlock, totalReadFromBlock, readData, 0);//ECC(skipBlock), block, i, data, 0); totalReadFromBlock ++; if (error) { //call Leds.led0Toggle(); return; }else if(totalReadFromBlock < numPagesPerBlock){ //call Draw.drawInt(totalReadFromBlock*15, 170, totalReadFromBlock, 1, COLOR_BLUE); //call Draw.drawInt(200, 185, numPagesPerBlock, 1, COLOR_BLUE); readData = (void *) ((uint8_t *) readData + pageDataSize); readBlockTask(); //call ReadBlockTimer.startOneShot(5); }else{ call Leds.led2Toggle(); } } command uint8_t Hpl.readBlock(const struct RawNandFlash *raw, uint16_t block, void *data){ //uint16_t i, error; totalReadFromBlock = 0; memcpy((void*)&saveRaw, (void*)raw, sizeof(struct RawNandFlash)); readBlock = block; readData = data; readBlockTask(); return 0; } command uint8_t Hpl.writeBlock(const struct RawNandFlash *raw, uint16_t block, void *data){ uint8_t error, i; for(i=0; i interface HplNandFlash{ //command void writeColumnAddress(); //command void writeRowAddress(); //command void isOperationComplete(); //command void writeData(); //command void readData(); //command void eraseBlock_i(); // internal functions //command void writePage_i(); // internal functions //command void copyPage_i(); // internal functions command void init(struct RawNandFlash *HplNand, const struct NandFlashModel *model, uint32_t commandAddr, uint32_t addressAddr, uint32_t dataAddr); command uint8_t findNandModel(const struct NandFlashModel *modelList, uint8_t size, struct NandFlashModel *model, uint32_t chipId); command void reset(); command uint32_t readId(); command uint8_t eraseBlock(const struct RawNandFlash *raw, uint16_t block); command uint8_t readPage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare); command uint8_t writePage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare); command uint8_t copyPage(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t sourcePage, uint16_t destBlock, uint16_t destPage); command uint8_t copyBlock(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t destBlock); command uint16_t getPageDataSize(const struct NandFlashModel *model); command uint32_t getDeviceSizeInPages(const struct NandFlashModel *model); command uint16_t getBlockSizeInPages(const struct NandFlashModel *model); command uint8_t getPageSpareSize(const struct NandFlashModel *model); command uint8_t hasSmallBlocks(const struct NandFlashModel *model); command uint16_t getDeviceSizeInBlocks(const struct NandFlashModel * model); command void readBadBlockMarker(const struct NandSpareScheme *scheme, const uint8_t *spare, uint8_t *marker); command void writeBadBlockMarker(const struct NandSpareScheme *scheme, uint8_t *spare, uint8_t marker); command uint32_t getDeviceSizeInBytes(const struct NandFlashModel *model); command uint32_t getBlockSizeInBytes(const struct NandFlashModel *model); command uint8_t readBlock(const struct RawNandFlash *raw, uint16_t block, void *data); command uint8_t writeBlock(const struct RawNandFlash *raw, uint16_t block, void *data); } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/nandflash/HplNandFlashC.nc000066400000000000000000000061341207233610700263030ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ configuration HplNandFlashC{ provides interface HplNandFlash; } implementation{ components HplNandFlashP; HplNandFlash = HplNandFlashP; components HplSam3uClockC; HplNandFlashP.HSMC4ClockControl -> HplSam3uClockC.HSMC4PPCntl; components HplSam3uGeneralIOC as IO; HplNandFlashP.NandFlash_CE -> IO.PioA16; HplNandFlashP.TempPin -> IO.PioC12; HplNandFlashP.NandFlash_RB -> IO.PioB24; HplNandFlashP.NandFlash_OE -> IO.HplPioB17; HplNandFlashP.NandFlash_WE -> IO.HplPioB18; HplNandFlashP.NandFlash_CLE -> IO.HplPioB22; HplNandFlashP.NandFlash_ALE -> IO.HplPioB21; HplNandFlashP.NandFlash_Data00 -> IO.HplPioB9; HplNandFlashP.NandFlash_Data01 -> IO.HplPioB10; HplNandFlashP.NandFlash_Data02 -> IO.HplPioB11; HplNandFlashP.NandFlash_Data03 -> IO.HplPioB12; HplNandFlashP.NandFlash_Data04 -> IO.HplPioB13; HplNandFlashP.NandFlash_Data05 -> IO.HplPioB14; HplNandFlashP.NandFlash_Data06 -> IO.HplPioB15; HplNandFlashP.NandFlash_Data07 -> IO.HplPioB16; HplNandFlashP.NandFlash_Data08 -> IO.HplPioB25; HplNandFlashP.NandFlash_Data09 -> IO.HplPioB26; HplNandFlashP.NandFlash_Data10 -> IO.HplPioB27; HplNandFlashP.NandFlash_Data11 -> IO.HplPioB28; HplNandFlashP.NandFlash_Data12 -> IO.HplPioB29; HplNandFlashP.NandFlash_Data13 -> IO.HplPioB30; HplNandFlashP.NandFlash_Data14 -> IO.HplPioB31; HplNandFlashP.NandFlash_Data15 -> IO.HplPioB6; components LedsC, LcdC; HplNandFlashP.Leds -> LedsC; HplNandFlashP.Draw -> LcdC; components new TimerMilliC() as TimerC; HplNandFlashP.ReadBlockTimer -> TimerC; } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/nandflash/HplNandFlashP.nc000066400000000000000000001075701207233610700263260ustar00rootroot00000000000000/* * Copyright (c) 2009 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "HplNandFlash.h" module HplNandFlashP{ provides interface HplNandFlash as Hpl; uses interface HplSam3uPeripheralClockCntl as HSMC4ClockControl; uses interface GeneralIO as NandFlash_CE; uses interface GeneralIO as TempPin; uses interface GeneralIO as NandFlash_RB; uses interface HplSam3uGeneralIOPin as NandFlash_OE; uses interface HplSam3uGeneralIOPin as NandFlash_WE; uses interface HplSam3uGeneralIOPin as NandFlash_CLE; uses interface HplSam3uGeneralIOPin as NandFlash_ALE; uses interface HplSam3uGeneralIOPin as NandFlash_Data00; uses interface HplSam3uGeneralIOPin as NandFlash_Data01; uses interface HplSam3uGeneralIOPin as NandFlash_Data02; uses interface HplSam3uGeneralIOPin as NandFlash_Data03; uses interface HplSam3uGeneralIOPin as NandFlash_Data04; uses interface HplSam3uGeneralIOPin as NandFlash_Data05; uses interface HplSam3uGeneralIOPin as NandFlash_Data06; uses interface HplSam3uGeneralIOPin as NandFlash_Data07; uses interface HplSam3uGeneralIOPin as NandFlash_Data08; uses interface HplSam3uGeneralIOPin as NandFlash_Data09; uses interface HplSam3uGeneralIOPin as NandFlash_Data10; uses interface HplSam3uGeneralIOPin as NandFlash_Data11; uses interface HplSam3uGeneralIOPin as NandFlash_Data12; uses interface HplSam3uGeneralIOPin as NandFlash_Data13; uses interface HplSam3uGeneralIOPin as NandFlash_Data14; uses interface HplSam3uGeneralIOPin as NandFlash_Data15; uses interface Leds; uses interface Draw; uses interface Timer as ReadBlockTimer; } implementation { /// Nand flash commands #define COMMAND_READ_1 0x00 #define COMMAND_READ_2 0x30 #define COMMAND_COPYBACK_READ_1 0x00 #define COMMAND_COPYBACK_READ_2 0x35 #define COMMAND_COPYBACK_PROGRAM_1 0x85 #define COMMAND_COPYBACK_PROGRAM_2 0x10 #define COMMAND_RANDOM_OUT 0x05 #define COMMAND_RANDOM_OUT_2 0xE0 #define COMMAND_RANDOM_IN 0x85 #define COMMAND_READID 0x90 #define COMMAND_WRITE_1 0x80 #define COMMAND_WRITE_2 0x10 #define COMMAND_ERASE_1 0x60 #define COMMAND_ERASE_2 0xD0 #define COMMAND_STATUS 0x70 #define COMMAND_RESET 0xFF #define COMMAND_READ_A 0x00 #define COMMAND_READ_C 0x50 #define STATUS_READY (1 << 6) #define STATUS_ERROR (1 << 0) #define WRITE_COMMAND(commandAddress, u_command) \ {*((volatile uint8_t *) commandAddress) = (uint8_t) u_command;} #define WRITE_COMMAND16(commandAddress, u_command) \ {*((volatile uint16_t *) commandAddress) = (uint16_t) u_command;} #define WRITE_ADDRESS(addressAddress, address) \ {*((volatile uint8_t *) addressAddress) = (uint8_t) address;} #define WRITE_ADDRESS16(addressAddress, address) \ {*((volatile uint16_t *) addressAddress) = (uint16_t) address;} #define WRITE_DATA8(dataAddress, data) \ {*((volatile uint8_t *) dataAddress) = (uint8_t) data;} #define READ_DATA8(dataAddress) \ (*((volatile uint8_t *) dataAddress)) #define WRITE_DATA16(dataAddress, data) \ {*((volatile uint16_t *) dataAddress) = (uint16_t) data;} #define READ_DATA16(dataAddress) \ (*((volatile uint16_t *) dataAddress)) /// Number of tries for erasing a block #define NUMERASETRIES 2 /// Number of tries for writing a block #define NUMWRITETRIES 2 /// Number of tries for copying a block #define NUMCOPYTRIES 2 /// Number of NandFlash models inside the list. #define NandFlashModelList_SIZE 58 #define MODEL(raw) ((struct NandFlashModel *) raw) //------------------------------------------------------------------------------ // Exported variables //------------------------------------------------------------------------------ //extern const struct NandFlashModel nandFlashModelList[NandFlashModelList_SIZE]; /// Spare area placement scheme for 256 byte pages. const struct NandSpareScheme nandSpareScheme256 = { // Bad block marker is at position #5 5, // 3 ecc bytes 3, // Ecc bytes positions {0, 1, 2}, // 4 extra bytes 4, // Extra bytes positions {3, 4, 6, 7} }; /// Spare area placement scheme for 512 byte pages. const struct NandSpareScheme nandSpareScheme512 = { // Bad block marker is at position #5 5, // 6 ecc bytes 6, // Ecc bytes positions {0, 1, 2, 3, 6, 7}, // 8 extra bytes 8, // Extra bytes positions {8, 9, 10, 11, 12, 13, 14, 15} }; /// Spare area placement scheme for 2048 byte pages. const struct NandSpareScheme nandSpareScheme2048 = { // Bad block marker is at position #0 0, // 24 ecc bytes 24, // Ecc bytes positions {40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63}, // 38 extra bytes 38, // Extra bytes positions {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39} }; /// List of NandFlash models which can be recognized by the software. const struct NandFlashModel nandFlashModelList[NandFlashModelList_SIZE] = { // | ID | Options | Page | Mo | Block |BlkPg |DevBlk {0x6e, NandFlashModel_DATABUS8, 256, 1, 4, &nandSpareScheme256}, {0x64, NandFlashModel_DATABUS8, 256, 2, 4, &nandSpareScheme256}, {0x6b, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xe8, NandFlashModel_DATABUS8, 256, 1, 4, &nandSpareScheme256}, {0xec, NandFlashModel_DATABUS8, 256, 1, 4, &nandSpareScheme256}, {0xea, NandFlashModel_DATABUS8, 256, 2, 4, &nandSpareScheme256}, {0xd5, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xe3, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xe5, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xd6, NandFlashModel_DATABUS8, 512, 8, 8, &nandSpareScheme512}, {0x39, NandFlashModel_DATABUS8, 512, 8, 8, &nandSpareScheme512}, {0xe6, NandFlashModel_DATABUS8, 512, 8, 8, &nandSpareScheme512}, {0x49, NandFlashModel_DATABUS16, 512, 8, 8, &nandSpareScheme512}, {0x59, NandFlashModel_DATABUS16, 512, 8, 8, &nandSpareScheme512}, {0x33, NandFlashModel_DATABUS8, 512, 16, 16, &nandSpareScheme512}, {0x73, NandFlashModel_DATABUS8, 512, 16, 16, &nandSpareScheme512}, {0x43, NandFlashModel_DATABUS16, 512, 16, 16, &nandSpareScheme512}, {0x53, NandFlashModel_DATABUS16, 512, 16, 16, &nandSpareScheme512}, {0x35, NandFlashModel_DATABUS8, 512, 32, 16, &nandSpareScheme512}, {0x75, NandFlashModel_DATABUS8, 512, 32, 16, &nandSpareScheme512}, {0x45, NandFlashModel_DATABUS16, 512, 32, 16, &nandSpareScheme512}, {0x55, NandFlashModel_DATABUS16, 512, 32, 16, &nandSpareScheme512}, {0x36, NandFlashModel_DATABUS8, 512, 64, 16, &nandSpareScheme512}, {0x76, NandFlashModel_DATABUS8, 512, 64, 16, &nandSpareScheme512}, {0x46, NandFlashModel_DATABUS16, 512, 64, 16, &nandSpareScheme512}, {0x56, NandFlashModel_DATABUS16, 512, 64, 16, &nandSpareScheme512}, {0x78, NandFlashModel_DATABUS8, 512, 128, 16, &nandSpareScheme512}, {0x39, NandFlashModel_DATABUS8, 512, 128, 16, &nandSpareScheme512}, {0x79, NandFlashModel_DATABUS8, 512, 128, 16, &nandSpareScheme512}, {0x72, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x49, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x74, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x59, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x71, NandFlashModel_DATABUS8, 512, 256, 16, &nandSpareScheme512}, // Large blocks devices. Parameters must be fetched from the extended I #define OPTIONS NandFlashModel_COPYBACK {0xA2, NandFlashModel_DATABUS8 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xF2, NandFlashModel_DATABUS8 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xB2, NandFlashModel_DATABUS16 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xC2, NandFlashModel_DATABUS16 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xA1, NandFlashModel_DATABUS8 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xF1, NandFlashModel_DATABUS8 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xB1, NandFlashModel_DATABUS16 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xC1, NandFlashModel_DATABUS16 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xAA, NandFlashModel_DATABUS8 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xDA, NandFlashModel_DATABUS8 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xBA, NandFlashModel_DATABUS16 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xCA, NandFlashModel_DATABUS16 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xAC, NandFlashModel_DATABUS8 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xDC, NandFlashModel_DATABUS8 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xBC, NandFlashModel_DATABUS16 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xCC, NandFlashModel_DATABUS16 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xA3, NandFlashModel_DATABUS8 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xD3, NandFlashModel_DATABUS8 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xB3, NandFlashModel_DATABUS16 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xC3, NandFlashModel_DATABUS16 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xA5, NandFlashModel_DATABUS8 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, {0xD5, NandFlashModel_DATABUS8 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, {0xB5, NandFlashModel_DATABUS16 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, {0xC5, NandFlashModel_DATABUS16 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, }; uint16_t numBlocks; uint32_t memSize; uint32_t blockSize; uint16_t numPagesPerBlock; uint16_t pageDataSize; void WaitReady(){ WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_STATUS); while ((READ_DATA8(BOARD_NF_DATA_ADDR) & STATUS_READY) != STATUS_READY); } uint8_t GetDataBusWidth(const struct NandFlashModel *model){ return (model->options&NandFlashModel_DATABUS16)? 16: 8; } void WriteColumnAddress(const struct RawNandFlash *raw, uint16_t columnAddress){ uint16_t pageSize = call Hpl.getPageDataSize(MODEL(raw)); call Draw.drawInt(200, 250, pageSize, 1, COLOR_BLACK); /* Check the data bus width of the NandFlash */ if (GetDataBusWidth(MODEL(raw)) == 16) { /* Div 2 is because we address in word and not in byte */ columnAddress >>= 1; } while (pageSize > 0) { if (GetDataBusWidth(MODEL(raw)) == 16) { WRITE_ADDRESS16(BOARD_NF_ADDRESS_ADDR, columnAddress & 0xFF); } else { WRITE_ADDRESS(BOARD_NF_ADDRESS_ADDR, columnAddress & 0xFF); } pageSize >>= 8; columnAddress >>= 8; } } //------------------------------------------------------------------------------ /// Sends the row address to the NandFlash chip. /// \param raw Pointer to a RawNandFlash instance. /// \param rowAddress Row address to send. //------------------------------------------------------------------------------ void WriteRowAddress(const struct RawNandFlash *raw, uint32_t rowAddress){ uint32_t numPages = call Hpl.getDeviceSizeInPages(MODEL(raw)); while (numPages > 0) { if (GetDataBusWidth(MODEL(raw)) == 16) { WRITE_ADDRESS16(BOARD_NF_ADDRESS_ADDR, rowAddress & 0xFF); } else { WRITE_ADDRESS(BOARD_NF_ADDRESS_ADDR, rowAddress & 0xFF); } numPages >>= 8; rowAddress >>= 8; } } void WriteData(const struct RawNandFlash *raw, uint8_t *buffer, uint32_t size){ uint32_t i; // Check the data bus width of the NandFlash if (GetDataBusWidth(MODEL(raw)) == 16) { uint16_t *buffer16 = (uint16_t *) buffer; size >>= 1; for(i=0; i < size; i++) { call Draw.drawInt(15,50, buffer16[i], 1, COLOR_RED); WRITE_DATA16(BOARD_NF_DATA_ADDR, buffer16[i]); } } else { for(i=0; i < size; i++) { WRITE_DATA8(BOARD_NF_DATA_ADDR, buffer[i]); } } } uint8_t count = 0; void ReadData(const struct RawNandFlash *raw, uint8_t *buffer, uint32_t size){ uint32_t i; // Check the chip data bus width count ++; if (GetDataBusWidth(MODEL(raw)) == 16) { uint16_t *buffer16 = (uint16_t *) buffer; size >>= 1; call Draw.drawInt(200,130, size, 1, COLOR_YELLOW); for (i=0 ; i < size ; i++) { buffer16[i] = READ_DATA16(BOARD_NF_DATA_ADDR); call Draw.drawInt(150,50, buffer16[i] /*READ_DATA16(BOARD_NF_DATA_ADDR)*/, 1, COLOR_BLACK); } //call Draw.drawInt(100,150, buffer16[0], 1, COLOR_BLACK); call Draw.drawInt(200,150, buffer16[3], 1, COLOR_BLACK); //call Draw.drawInt(200,150, (uint32_t)buffer16, 1, COLOR_BLACK); } else { for (i=0; i < size; i++) { buffer[i] = READ_DATA8(BOARD_NF_DATA_ADDR); } } call Draw.drawInt(count*15,130, count, 1, COLOR_GREEN); } uint8_t IsOperationComplete(const struct RawNandFlash *raw){ uint8_t status; WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_STATUS); status = READ_DATA8(BOARD_NF_DATA_ADDR); if (((status & STATUS_READY) != STATUS_READY) || ((status & STATUS_ERROR) != 0)) { return 0; } return 1; } uint8_t EraseBlock( const struct RawNandFlash *raw, unsigned short block){ uint8_t error = 0; uint32_t rowAddress; // Calculate address used for erase rowAddress = block * call Hpl.getBlockSizeInPages(MODEL(raw)); // Start erase //ENABLE_CE(raw); // Enable CE call NandFlash_CE.clr(); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_ERASE_1); WriteRowAddress(raw, rowAddress); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_ERASE_2); WaitReady(); if (!IsOperationComplete(raw)) { error = NandCommon_ERROR_CANNOTERASE; } //DISABLE_CE(raw); // Disable CE call NandFlash_CE.set(); return error; } uint8_t WritePage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare){ uint32_t pageSize = call Hpl.getPageDataSize(MODEL(raw)); uint32_t spareDataSize = call Hpl.getPageSpareSize(MODEL(raw)); uint16_t dummyByte; uint32_t rowAddress; uint8_t error = 0; //uint8_t* temp = (uint8_t*)data; // Calculate physical address of the page rowAddress = block * call Hpl.getBlockSizeInPages(MODEL(raw)) + page; // Start write operation //ENABLE_CE(raw); // Enable CE; call NandFlash_CE.clr(); // Write data area if needed if (data) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_1); WriteColumnAddress(raw, 0); WriteRowAddress(raw, rowAddress); WriteData(raw, (uint8_t *) data, pageSize); //call Draw.drawInt(50, 50, (uint8_t)temp[0], 1, COLOR_RED); // Spare is written here as well since it is more efficient if (spare) { WriteData(raw, (uint8_t *) spare, spareDataSize); } else { // Note: special case when ECC parity generation. // ECC results are available as soon as the counter reaches the end of the main area. // But when reach PageSize for an example, it could not generate last ECC_PR, The // workaround is to receive PageSize+1 word. ReadData(raw, (uint8_t *) (&dummyByte), 2); } WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_2); WaitReady(); if (!IsOperationComplete(raw)) { error = NandCommon_ERROR_CANNOTWRITE; } } // Write spare area alone if needed if (spare && !data) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_1); WriteColumnAddress(raw, pageSize); WriteRowAddress(raw, rowAddress); WriteData(raw, (uint8_t *) spare, spareDataSize); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_2); WaitReady(); if (!IsOperationComplete(raw)) { error = NandCommon_ERROR_CANNOTWRITE; } } // Disable chip //DISABLE_CE(raw); // Disable CE call NandFlash_CE.set(); return error; } uint8_t CopyPage(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t sourcePage, uint16_t destBlock, uint16_t destPage){ uint32_t sourceRow, destRow; uint8_t error = 0; uint8_t data[NandCommon_MAXPAGEDATASIZE]; uint8_t spare[NandCommon_MAXPAGESPARESIZE]; uint16_t numPages = call Hpl.getBlockSizeInPages(MODEL(raw)); sourceRow = sourceBlock * numPages + sourcePage; destRow = destBlock * numPages + destPage; if (call Hpl.readPage(raw, sourceBlock, sourcePage, data, spare)) { error = NandCommon_ERROR_CANNOTREAD; } else if (call Hpl.writePage(raw, destBlock, destPage, data, spare)) { error = NandCommon_ERROR_CANNOTWRITE; } return error; } void configureNandFlash(uint8_t busWidth){ // Take a look at board_memories.h -- NOT CHIP_NAND_CTRL! // set clock // set smc registers volatile smc_setup_t *SETUP = (volatile smc_setup_t *) (0x400E0084 + 0x0); smc_setup_t setup = *SETUP; volatile smc_pulse_t *PULSE = (volatile smc_pulse_t *) (0x400E0084 + 0x4); smc_pulse_t pulse = *PULSE; volatile smc_cycle_t *CYCLE = (volatile smc_cycle_t *) (0x400E0084 + 0x8); smc_cycle_t cycle = *CYCLE; volatile smc_timings_t *TIMINGS = (volatile smc_timings_t *) (0x400E0084 + 0xC); smc_timings_t timings = *TIMINGS; volatile smc_mode_t *MODE = (volatile smc_mode_t *) (0x400E0084 + 0x10); smc_mode_t mode = *MODE; // start clock for register access call HSMC4ClockControl.disable(); call HSMC4ClockControl.enable(); setup.bits.nwe_setup = 0; setup.bits.ncs_wr_setup = 1; setup.bits.nrd_setup = 0; setup.bits.ncs_rd_setup = 1; *SETUP = setup; pulse.bits.nwe_pulse = 2; pulse.bits.ncs_wr_pulse = 3; pulse.bits.nrd_pulse = 3; pulse.bits.ncs_rd_pulse = 4; *PULSE = pulse; cycle.bits.nwe_cycle = 4; cycle.bits.nrd_cycle = 7; *CYCLE = cycle; timings.bits.tclr = 1; timings.bits.tadl = 2; timings.bits.tar = 1; timings.bits.trr = 1; timings.bits.twb = 2; timings.bits.rbnsel = 7; timings.bits.nfsel = 1; *TIMINGS = timings; if(busWidth == 8){ mode.bits.dbw = 0; mode.bits.read_mode = 1; mode.bits.write_mode = 1; *MODE = mode; }else if(busWidth == 16){ mode.bits.dbw = 1; mode.bits.read_mode = 1; mode.bits.write_mode = 1; *MODE = mode; } } void configurePsRam(){ // TODO: Take a look at board_memories.h -- NOT CHIP_NAND_CTRL! // TODO: Does Atmel code work with this disabled? } void configureNandPins(){ // Pin setting call NandFlash_CE.makeOutput(); call TempPin.makeInput(); call NandFlash_RB.makeInput(); call NandFlash_OE.disablePioControl(); call NandFlash_WE.disablePioControl(); call NandFlash_CLE.disablePioControl(); call NandFlash_ALE.disablePioControl(); call NandFlash_OE.selectPeripheralA(); call NandFlash_WE.selectPeripheralA(); call NandFlash_CLE.selectPeripheralA(); call NandFlash_ALE.selectPeripheralA(); call NandFlash_Data00.disablePioControl(); call NandFlash_Data01.disablePioControl(); call NandFlash_Data02.disablePioControl(); call NandFlash_Data03.disablePioControl(); call NandFlash_Data04.disablePioControl(); call NandFlash_Data05.disablePioControl(); call NandFlash_Data06.disablePioControl(); call NandFlash_Data07.disablePioControl(); call NandFlash_Data08.disablePioControl(); call NandFlash_Data09.disablePioControl(); call NandFlash_Data10.disablePioControl(); call NandFlash_Data11.disablePioControl(); call NandFlash_Data12.disablePioControl(); call NandFlash_Data13.disablePioControl(); call NandFlash_Data14.disablePioControl(); call NandFlash_Data15.disablePioControl(); call NandFlash_Data00.selectPeripheralA(); call NandFlash_Data01.selectPeripheralA(); call NandFlash_Data02.selectPeripheralA(); call NandFlash_Data03.selectPeripheralA(); call NandFlash_Data04.selectPeripheralA(); call NandFlash_Data05.selectPeripheralA(); call NandFlash_Data06.selectPeripheralA(); call NandFlash_Data07.selectPeripheralA(); call NandFlash_Data08.selectPeripheralA(); call NandFlash_Data09.selectPeripheralA(); call NandFlash_Data10.selectPeripheralA(); call NandFlash_Data11.selectPeripheralA(); call NandFlash_Data12.selectPeripheralA(); call NandFlash_Data13.selectPeripheralA(); call NandFlash_Data14.selectPeripheralA(); call NandFlash_Data15.selectPeripheralB(); // PB6 } command uint8_t Hpl.hasSmallBlocks(const struct NandFlashModel *model){ return (model->pageSizeInBytes <= 512 )? 1: 0; } //------------------------------------------------------------------------------ /// Returns the size of the data area of a page in bytes. /// \param model Pointer to a NandFlashModel instance. //------------------------------------------------------------------------------ command uint16_t Hpl.getPageDataSize(const struct NandFlashModel *model){ return model->pageSizeInBytes; } //------------------------------------------------------------------------------ /// Returns the size of the spare area of a page in bytes. /// \param model Pointer to a NandFlashModel instance. //------------------------------------------------------------------------------ command uint8_t Hpl.getPageSpareSize(const struct NandFlashModel *model){ return (model->pageSizeInBytes>>5); /// Spare size is 16/512 of data size } command void Hpl.init(struct RawNandFlash *HplNand, const struct NandFlashModel *model, uint32_t commandAddr, uint32_t addressAddr, uint32_t dataAddr){ uint32_t chipId; uint8_t error; uint8_t busWidth = 16; configureNandFlash(busWidth); configureNandPins(); HplNand -> commandAddress = commandAddr; HplNand -> addressAddress = addressAddr; HplNand -> dataAddress = dataAddr; call Hpl.reset(); if(!model){ chipId = call Hpl.readId(); error = call Hpl.findNandModel(nandFlashModelList, NandFlashModelList_SIZE, &(HplNand->model), chipId); }else{ HplNand -> model = *model; } if(!error){ } else { } busWidth = 0; busWidth = GetDataBusWidth(MODEL(HplNand)); configureNandFlash(busWidth); memSize = call Hpl.getDeviceSizeInBytes(MODEL(HplNand)); blockSize = call Hpl.getBlockSizeInBytes(MODEL(HplNand)); numBlocks = call Hpl.getDeviceSizeInBlocks(MODEL(HplNand)); pageDataSize = call Hpl.getPageDataSize(MODEL(HplNand)); numPagesPerBlock = call Hpl.getBlockSizeInPages(MODEL(HplNand)); call Draw.drawInt(150, 20, busWidth, 1, COLOR_BLACK); call Draw.drawInt(150, 40, pageDataSize, 1, COLOR_BLACK); call Draw.drawInt(150, 60, memSize, 1, COLOR_BLACK); call Draw.drawInt(150, 80, numPagesPerBlock, 1, COLOR_BLACK); } command uint8_t Hpl.findNandModel(const struct NandFlashModel *modelList, uint8_t size, struct NandFlashModel *model, uint32_t chipId){ uint8_t i, found = 0; //volatile smc_cfg_t *CFG = (volatile smc_cfg_t *) (0x400E0000); //smc_cfg_t cfg = *CFG; uint8_t id2 = (uint8_t)(chipId>>8); uint8_t id4 = (uint8_t)(chipId>>24); //call Draw.drawInt(100, 60, chipId, 1, COLOR_YELLOW); //call Draw.drawInt(100, 80, id2, 1, COLOR_YELLOW); for(i=0; iblockSizeInKBytes == 0 || model->pageSizeInBytes == 0) { //TRACE_DEBUG("Fetch from ID4(0x%.2x):\r\n", id4); /// Fetch from the extended ID4 /// ID4 D5 D4 BlockSize || D1 D0 PageSize /// 0 0 64K || 0 0 1K /// 0 1 128K || 0 1 2K /// 1 0 256K || 1 0 4K /// 1 1 512K || 1 1 8k switch(id4 & 0x03) { case 0x00: model->pageSizeInBytes = 1024; break; case 0x01: model->pageSizeInBytes = 2048; break; case 0x02: model->pageSizeInBytes = 4096; break; case 0x03: model->pageSizeInBytes = 8192; break; } switch(id4 & 0x30) { case 0x00: model->blockSizeInKBytes = 64; break; case 0x10: model->blockSizeInKBytes = 128; break; case 0x20: model->blockSizeInKBytes = 256; break; case 0x30: model->blockSizeInKBytes = 512; break; } } /* switch(model->pageSizeInBytes) { case 1024: pageSize = AT91C_HSMC4_PAGESIZE_1056_Bytes; break; case 2048: pageSize = AT91C_HSMC4_PAGESIZE_2112_Bytes; break; case 4096: pageSize = AT91C_HSMC4_PAGESIZE_4224_Bytes; break; default: ;//TRACE_ERROR("Unsupportted page size for NAND Flash Controller\n\r"); } // This part sets the SMC registers? this is it? cfg.bits.pagesize = pageSize; cfg.bits.dtomul = 7; cfg.bits.edgectrl = 1; cfg.bits.dtocyc = 0xF; cfg.bits.rspare = 1; *CFG = cfg; //HSMC4_SetMode(pageSize | AT91C_HSMC4_DTOMUL_1048576 | AT91C_HSMC4_EDGECTRL | AT91C_HSMC4_DTOCYC | AT91C_HSMC4_RSPARE); // ????????????? */ } break; } } // Check if chip has been detected if (found) { return 0; } else { return NandCommon_ERROR_UNKNOWNMODEL; } } command void Hpl.reset(){ /* 1. Enable CE 2. Write reset command 3. wait for ready 4. Disable CE */ // Enable CE call NandFlash_CE.clr(); WRITE_COMMAND16(BOARD_NF_COMMAND_ADDR, COMMAND_RESET); //WRTIE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_RESET); WaitReady(); // Disable CE call NandFlash_CE.set(); } command uint32_t Hpl.readId(){ uint32_t chipId; // enable CE call NandFlash_CE.clr(); WRITE_COMMAND16(BOARD_NF_COMMAND_ADDR, COMMAND_READID); //WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READID); WRITE_ADDRESS(BOARD_NF_ADDRESS_ADDR, 0); chipId = READ_DATA8(BOARD_NF_DATA_ADDR); chipId |= READ_DATA8(BOARD_NF_DATA_ADDR) << 8; chipId |= READ_DATA8(BOARD_NF_DATA_ADDR) << 16; chipId |= READ_DATA8(BOARD_NF_DATA_ADDR) << 24; // Disable CE call NandFlash_CE.set(); return chipId; } command uint16_t Hpl.getDeviceSizeInBlocks(const struct NandFlashModel * model){ return ((1024) / model->blockSizeInKBytes) * model->deviceSizeInMegaBytes; } command uint32_t Hpl.getDeviceSizeInPages(const struct NandFlashModel *model){ return (uint32_t) call Hpl.getDeviceSizeInBlocks(model) * call Hpl.getBlockSizeInPages(model); } command uint8_t Hpl.eraseBlock(const struct RawNandFlash *raw, uint16_t block){ uint8_t numTries = NUMERASETRIES; while (numTries > 0) { if (!EraseBlock(raw, block)) { return 0; } numTries--; } return NandCommon_ERROR_BADBLOCK; } command uint16_t Hpl.getBlockSizeInPages(const struct NandFlashModel *model){ return model->blockSizeInKBytes * 1024 / model->pageSizeInBytes; } command uint8_t Hpl.readPage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare){ uint32_t colAddress; uint32_t rowAddress; uint8_t hasSmallBlocks; uint32_t pageSpareSize; hasSmallBlocks = call Hpl.hasSmallBlocks(MODEL(raw)); pageSpareSize = call Hpl.getPageSpareSize(MODEL(raw)); // Calculate actual address of the page rowAddress = (uint32_t) block * numPagesPerBlock /*call Hpl.getBlockSizeInPages(MODEL(raw))*/ + page; // Start operation //ENABLE_CE(raw); // Enable CE call NandFlash_CE.clr(); if (data) { colAddress = 0; } else { // to read spare area in sequential access colAddress = pageDataSize; } // Use either small blocks or large blocks data area read if (hasSmallBlocks) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_A); WriteColumnAddress(raw, colAddress); WriteRowAddress(raw, rowAddress); } else { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_1); WriteColumnAddress(raw, colAddress); WriteRowAddress(raw, rowAddress); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_2); } // Wait for the nand to be ready WaitReady(); //pageDataSize = call Hpl.getPageDataSize(MODEL(raw)); call Draw.drawInt(200, 220, colAddress, 1, COLOR_BLUE); call Draw.drawInt(100, 220, pageDataSize, 1, COLOR_BLUE); call Draw.drawInt(rowAddress*15, 200, rowAddress, 1, COLOR_BLUE); // Read data area if needed if (data) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_1); if(pageDataSize != 2048){ call Draw.drawInt(200, 240, page, 1, COLOR_GREEN); } ReadData(raw, (uint8_t *) data, pageDataSize); if (spare) { //call Leds.led2Toggle(); ReadData(raw, (uint8_t *) spare, pageSpareSize); } } else { // Read spare area only WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_1); ReadData(raw, (uint8_t *) spare, pageSpareSize); } // Disable CE //DISABLE_CE(raw); // Disable CE call NandFlash_CE.set(); return 0; } //------------------------------------------------------------------------------ /// Reads the bad block marker inside a spare area buffer using the provided /// scheme. /// \param scheme Pointer to a NandSpareScheme instance. /// \param spare Spare area buffer. /// \param marker Pointer to the variable to store the bad block marker. //------------------------------------------------------------------------------ command void Hpl.readBadBlockMarker(const struct NandSpareScheme *scheme, const uint8_t *spare, uint8_t *marker){ *marker = spare[scheme->badBlockMarkerPosition]; } //------------------------------------------------------------------------------ /// Modifies the bad block marker inside a spare area, using the given scheme. /// \param scheme Pointer to a NandSpareScheme instance. /// \param spare Spare area buffer. /// \param marker Bad block marker to write. //------------------------------------------------------------------------------ command void Hpl.writeBadBlockMarker(const struct NandSpareScheme *scheme, uint8_t *spare, uint8_t marker){ spare[scheme->badBlockMarkerPosition] = marker; } command uint32_t Hpl.getDeviceSizeInBytes(const struct NandFlashModel *model){ return ((uint32_t) model->deviceSizeInMegaBytes) << 20; } command uint32_t Hpl.getBlockSizeInBytes(const struct NandFlashModel *model){ return (model->blockSizeInKBytes *1024); } command uint8_t Hpl.writePage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare){ uint8_t numTries = NUMWRITETRIES; while (numTries > 0) { if (!WritePage(raw, block, page, data, spare)) { return 0; } numTries--; } return NandCommon_ERROR_BADBLOCK; } command uint8_t Hpl.copyPage(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t sourcePage, uint16_t destBlock, uint16_t destPage){ uint8_t numTries = NUMCOPYTRIES; while (numTries) { if (!CopyPage(raw, sourceBlock, sourcePage, destBlock, destPage)) { return 0; } numTries--; } return NandCommon_ERROR_BADBLOCK; } command uint8_t Hpl.copyBlock(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t destBlock){ uint32_t i; uint16_t numPages = call Hpl.getBlockSizeInPages(MODEL(raw)); // Copy all pages for (i=0; i < numPages; i++) { if (call Hpl.copyPage(raw, sourceBlock, i, destBlock, i)) { return NandCommon_ERROR_BADBLOCK; } } return 0; } uint16_t totalReadFromBlock = 0; uint16_t readBlock = 0; void* readData; const struct RawNandFlash saveRaw; void readBlockTask(){ uint8_t error; call Draw.fill(COLOR_WHITE); error = call Hpl.readPage(&saveRaw, readBlock, totalReadFromBlock, readData, 0);//ECC(skipBlock), block, i, data, 0); totalReadFromBlock ++; if (error) { //call Leds.led0Toggle(); return; }else if(totalReadFromBlock < numPagesPerBlock){ //call Draw.drawInt(totalReadFromBlock*15, 170, totalReadFromBlock, 1, COLOR_BLUE); //call Draw.drawInt(200, 185, numPagesPerBlock, 1, COLOR_BLUE); //readData = (void *) ((uint8_t *) readData + pageDataSize); readBlockTask(); //call ReadBlockTimer.startOneShot(5); }else{ call Leds.led2Toggle(); } } command uint8_t Hpl.readBlock(const struct RawNandFlash *raw, uint16_t block, void *data){ //uint16_t i, error; //volatile twi_cr_t* CR = (volatile twi_cr_t *) (TWI1_BASE_ADDR + 0x0); uint8_t* data_local = (uint8_t*) data; totalReadFromBlock = 0; memcpy((void*)&saveRaw, (void*)raw, sizeof(struct RawNandFlash)); readBlock = block; readData = data; call Draw.drawInt(50,150, data_local[0], 1, COLOR_BLACK); call Draw.drawInt(100,150, data_local[1], 1, COLOR_BLACK); call Draw.drawInt(150,150, data_local[2], 1, COLOR_BLACK); call Draw.drawInt(200,150, data_local[3], 1, COLOR_BLACK); readBlockTask(); return 0; } command uint8_t Hpl.writeBlock(const struct RawNandFlash *raw, uint16_t block, void *data){ uint8_t error, i; for(i=0; i as ReadBlockTimer; } implementation { /// Nand flash commands #define COMMAND_READ_1 0x00 #define COMMAND_READ_2 0x30 #define COMMAND_COPYBACK_READ_1 0x00 #define COMMAND_COPYBACK_READ_2 0x35 #define COMMAND_COPYBACK_PROGRAM_1 0x85 #define COMMAND_COPYBACK_PROGRAM_2 0x10 #define COMMAND_RANDOM_OUT 0x05 #define COMMAND_RANDOM_OUT_2 0xE0 #define COMMAND_RANDOM_IN 0x85 #define COMMAND_READID 0x90 #define COMMAND_WRITE_1 0x80 #define COMMAND_WRITE_2 0x10 #define COMMAND_ERASE_1 0x60 #define COMMAND_ERASE_2 0xD0 #define COMMAND_STATUS 0x70 #define COMMAND_RESET 0xFF #define COMMAND_READ_A 0x00 #define COMMAND_READ_C 0x50 #define STATUS_READY (1 << 6) #define STATUS_ERROR (1 << 0) #define WRITE_COMMAND(commandAddress, u_command) \ {*((volatile uint8_t *) commandAddress) = (uint8_t) u_command;} #define WRITE_COMMAND16(commandAddress, u_command) \ {*((volatile uint16_t *) commandAddress) = (uint16_t) u_command;} #define WRITE_ADDRESS(addressAddress, address) \ {*((volatile uint8_t *) addressAddress) = (uint8_t) address;} #define WRITE_ADDRESS16(addressAddress, address) \ {*((volatile uint16_t *) addressAddress) = (uint16_t) address;} #define WRITE_DATA8(dataAddress, data) \ {*((volatile uint8_t *) dataAddress) = (uint8_t) data;} #define READ_DATA8(dataAddress) \ (*((volatile uint8_t *) dataAddress)) #define WRITE_DATA16(dataAddress, data) \ {*((volatile uint16_t *) dataAddress) = (uint16_t) data;} #define READ_DATA16(dataAddress) \ (*((volatile uint16_t *) dataAddress)) /// Number of tries for erasing a block #define NUMERASETRIES 2 /// Number of tries for writing a block #define NUMWRITETRIES 2 /// Number of tries for copying a block #define NUMCOPYTRIES 2 /// Number of NandFlash models inside the list. #define NandFlashModelList_SIZE 58 #define MODEL(raw) ((struct NandFlashModel *) raw) //------------------------------------------------------------------------------ // Exported variables //------------------------------------------------------------------------------ //extern const struct NandFlashModel nandFlashModelList[NandFlashModelList_SIZE]; /// Spare area placement scheme for 256 byte pages. const struct NandSpareScheme nandSpareScheme256 = { // Bad block marker is at position #5 5, // 3 ecc bytes 3, // Ecc bytes positions {0, 1, 2}, // 4 extra bytes 4, // Extra bytes positions {3, 4, 6, 7} }; /// Spare area placement scheme for 512 byte pages. const struct NandSpareScheme nandSpareScheme512 = { // Bad block marker is at position #5 5, // 6 ecc bytes 6, // Ecc bytes positions {0, 1, 2, 3, 6, 7}, // 8 extra bytes 8, // Extra bytes positions {8, 9, 10, 11, 12, 13, 14, 15} }; /// Spare area placement scheme for 2048 byte pages. const struct NandSpareScheme nandSpareScheme2048 = { // Bad block marker is at position #0 0, // 24 ecc bytes 24, // Ecc bytes positions {40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63}, // 38 extra bytes 38, // Extra bytes positions {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39} }; /// List of NandFlash models which can be recognized by the software. const struct NandFlashModel nandFlashModelList[NandFlashModelList_SIZE] = { // | ID | Options | Page | Mo | Block |BlkPg |DevBlk {0x6e, NandFlashModel_DATABUS8, 256, 1, 4, &nandSpareScheme256}, {0x64, NandFlashModel_DATABUS8, 256, 2, 4, &nandSpareScheme256}, {0x6b, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xe8, NandFlashModel_DATABUS8, 256, 1, 4, &nandSpareScheme256}, {0xec, NandFlashModel_DATABUS8, 256, 1, 4, &nandSpareScheme256}, {0xea, NandFlashModel_DATABUS8, 256, 2, 4, &nandSpareScheme256}, {0xd5, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xe3, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xe5, NandFlashModel_DATABUS8, 512, 4, 8, &nandSpareScheme512}, {0xd6, NandFlashModel_DATABUS8, 512, 8, 8, &nandSpareScheme512}, {0x39, NandFlashModel_DATABUS8, 512, 8, 8, &nandSpareScheme512}, {0xe6, NandFlashModel_DATABUS8, 512, 8, 8, &nandSpareScheme512}, {0x49, NandFlashModel_DATABUS16, 512, 8, 8, &nandSpareScheme512}, {0x59, NandFlashModel_DATABUS16, 512, 8, 8, &nandSpareScheme512}, {0x33, NandFlashModel_DATABUS8, 512, 16, 16, &nandSpareScheme512}, {0x73, NandFlashModel_DATABUS8, 512, 16, 16, &nandSpareScheme512}, {0x43, NandFlashModel_DATABUS16, 512, 16, 16, &nandSpareScheme512}, {0x53, NandFlashModel_DATABUS16, 512, 16, 16, &nandSpareScheme512}, {0x35, NandFlashModel_DATABUS8, 512, 32, 16, &nandSpareScheme512}, {0x75, NandFlashModel_DATABUS8, 512, 32, 16, &nandSpareScheme512}, {0x45, NandFlashModel_DATABUS16, 512, 32, 16, &nandSpareScheme512}, {0x55, NandFlashModel_DATABUS16, 512, 32, 16, &nandSpareScheme512}, {0x36, NandFlashModel_DATABUS8, 512, 64, 16, &nandSpareScheme512}, {0x76, NandFlashModel_DATABUS8, 512, 64, 16, &nandSpareScheme512}, {0x46, NandFlashModel_DATABUS16, 512, 64, 16, &nandSpareScheme512}, {0x56, NandFlashModel_DATABUS16, 512, 64, 16, &nandSpareScheme512}, {0x78, NandFlashModel_DATABUS8, 512, 128, 16, &nandSpareScheme512}, {0x39, NandFlashModel_DATABUS8, 512, 128, 16, &nandSpareScheme512}, {0x79, NandFlashModel_DATABUS8, 512, 128, 16, &nandSpareScheme512}, {0x72, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x49, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x74, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x59, NandFlashModel_DATABUS16, 512, 128, 16, &nandSpareScheme512}, {0x71, NandFlashModel_DATABUS8, 512, 256, 16, &nandSpareScheme512}, // Large blocks devices. Parameters must be fetched from the extended I #define OPTIONS NandFlashModel_COPYBACK {0xA2, NandFlashModel_DATABUS8 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xF2, NandFlashModel_DATABUS8 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xB2, NandFlashModel_DATABUS16 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xC2, NandFlashModel_DATABUS16 | OPTIONS, 0, 64, 0, &nandSpareScheme2048}, {0xA1, NandFlashModel_DATABUS8 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xF1, NandFlashModel_DATABUS8 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xB1, NandFlashModel_DATABUS16 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xC1, NandFlashModel_DATABUS16 | OPTIONS, 0, 128, 0, &nandSpareScheme2048}, {0xAA, NandFlashModel_DATABUS8 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xDA, NandFlashModel_DATABUS8 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xBA, NandFlashModel_DATABUS16 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xCA, NandFlashModel_DATABUS16 | OPTIONS, 0, 256, 0, &nandSpareScheme2048}, {0xAC, NandFlashModel_DATABUS8 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xDC, NandFlashModel_DATABUS8 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xBC, NandFlashModel_DATABUS16 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xCC, NandFlashModel_DATABUS16 | OPTIONS, 0, 512, 0, &nandSpareScheme2048}, {0xA3, NandFlashModel_DATABUS8 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xD3, NandFlashModel_DATABUS8 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xB3, NandFlashModel_DATABUS16 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xC3, NandFlashModel_DATABUS16 | OPTIONS, 0, 1024, 0, &nandSpareScheme2048}, {0xA5, NandFlashModel_DATABUS8 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, {0xD5, NandFlashModel_DATABUS8 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, {0xB5, NandFlashModel_DATABUS16 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, {0xC5, NandFlashModel_DATABUS16 | OPTIONS, 0, 2048, 0, &nandSpareScheme2048}, }; uint16_t numBlocks; uint32_t memSize; uint32_t blockSize; uint16_t numPagesPerBlock; uint16_t pageDataSize; void WaitReady(){ WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_STATUS); while ((READ_DATA8(BOARD_NF_DATA_ADDR) & STATUS_READY) != STATUS_READY); } uint8_t GetDataBusWidth(const struct NandFlashModel *model){ return (model->options&NandFlashModel_DATABUS16)? 16: 8; } void WriteColumnAddress(const struct RawNandFlash *raw, uint16_t columnAddress){ uint16_t pageSize = call Hpl.getPageDataSize(MODEL(raw)); call Draw.drawInt(200, 250, pageSize, 1, COLOR_BLACK); /* Check the data bus width of the NandFlash */ if (GetDataBusWidth(MODEL(raw)) == 16) { /* Div 2 is because we address in word and not in byte */ columnAddress >>= 1; } while (pageSize > 0) { if (GetDataBusWidth(MODEL(raw)) == 16) { WRITE_ADDRESS16(BOARD_NF_ADDRESS_ADDR, columnAddress & 0xFF); } else { WRITE_ADDRESS(BOARD_NF_ADDRESS_ADDR, columnAddress & 0xFF); } pageSize >>= 8; columnAddress >>= 8; } } //------------------------------------------------------------------------------ /// Sends the row address to the NandFlash chip. /// \param raw Pointer to a RawNandFlash instance. /// \param rowAddress Row address to send. //------------------------------------------------------------------------------ void WriteRowAddress(const struct RawNandFlash *raw, uint32_t rowAddress){ uint32_t numPages = call Hpl.getDeviceSizeInPages(MODEL(raw)); while (numPages > 0) { if (GetDataBusWidth(MODEL(raw)) == 16) { WRITE_ADDRESS16(BOARD_NF_ADDRESS_ADDR, rowAddress & 0xFF); } else { WRITE_ADDRESS(BOARD_NF_ADDRESS_ADDR, rowAddress & 0xFF); } numPages >>= 8; rowAddress >>= 8; } } void WriteData(const struct RawNandFlash *raw, uint8_t *buffer, uint32_t size){ uint32_t i; // Check the data bus width of the NandFlash if (GetDataBusWidth(MODEL(raw)) == 16) { uint16_t *buffer16 = (uint16_t *) buffer; size >>= 1; for(i=0; i < size; i++) { call Draw.drawInt(i*15,50, i, 1, COLOR_RED); WRITE_DATA16(BOARD_NF_DATA_ADDR, buffer16[i]); } } else { for(i=0; i < size; i++) { WRITE_DATA8(BOARD_NF_DATA_ADDR, buffer[i]); } } } uint8_t count = 0; void ReadData(const struct RawNandFlash *raw, uint8_t *buffer, uint32_t size){ uint16_t i; // Check the chip data bus width count ++; if (GetDataBusWidth(MODEL(raw)) == 16) { uint16_t *buffer16 = (uint16_t *) buffer; size >>= 1; //call Draw.drawInt(200,130, size, 1, COLOR_YELLOW); for (i=0; i < size; i++) { call Draw.drawInt(i*15,50, i, 1, COLOR_BLACK); buffer16[i] = READ_DATA16(BOARD_NF_DATA_ADDR); } call Draw.drawInt(100,150, buffer16[0], 1, COLOR_BLACK); call Draw.drawInt(200,150, buffer16[1], 1, COLOR_BLACK); } else { for (i=0; i < size; i++) { buffer[i] = READ_DATA8(BOARD_NF_DATA_ADDR); } } call Draw.drawInt(count*15,130, count, 1, COLOR_BLUE); } uint8_t IsOperationComplete(const struct RawNandFlash *raw){ uint8_t status; WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_STATUS); status = READ_DATA8(BOARD_NF_DATA_ADDR); if (((status & STATUS_READY) != STATUS_READY) || ((status & STATUS_ERROR) != 0)) { return 0; } return 1; } uint8_t EraseBlock( const struct RawNandFlash *raw, unsigned short block){ uint8_t error = 0; uint32_t rowAddress; // Calculate address used for erase rowAddress = block * call Hpl.getBlockSizeInPages(MODEL(raw)); // Start erase //ENABLE_CE(raw); // Enable CE call NandFlash_CE.clr(); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_ERASE_1); WriteRowAddress(raw, rowAddress); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_ERASE_2); WaitReady(); if (!IsOperationComplete(raw)) { error = NandCommon_ERROR_CANNOTERASE; } //DISABLE_CE(raw); // Disable CE call NandFlash_CE.set(); return error; } uint8_t WritePage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare){ uint32_t pageSize = call Hpl.getPageDataSize(MODEL(raw)); uint32_t spareDataSize = call Hpl.getPageSpareSize(MODEL(raw)); uint16_t dummyByte; uint32_t rowAddress; uint8_t error = 0; // Calculate physical address of the page rowAddress = block * call Hpl.getBlockSizeInPages(MODEL(raw)) + page; // Start write operation //ENABLE_CE(raw); // Enable CE; call NandFlash_CE.clr(); // Write data area if needed if (data) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_1); WriteColumnAddress(raw, 0); WriteRowAddress(raw, rowAddress); WriteData(raw, (uint8_t *) data, pageSize); //call Draw.drawInt(50, 50, (uint8_t)data[0], 1, COLOR_RED); // Spare is written here as well since it is more efficient if (spare) { WriteData(raw, (uint8_t *) spare, spareDataSize); } else { // Note: special case when ECC parity generation. // ECC results are available as soon as the counter reaches the end of the main area. // But when reach PageSize for an example, it could not generate last ECC_PR, The // workaround is to receive PageSize+1 word. ReadData(raw, (uint8_t *) (&dummyByte), 2); } WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_2); WaitReady(); if (!IsOperationComplete(raw)) { error = NandCommon_ERROR_CANNOTWRITE; } } // Write spare area alone if needed if (spare && !data) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_1); WriteColumnAddress(raw, pageSize); WriteRowAddress(raw, rowAddress); WriteData(raw, (uint8_t *) spare, spareDataSize); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_WRITE_2); WaitReady(); if (!IsOperationComplete(raw)) { error = NandCommon_ERROR_CANNOTWRITE; } } // Disable chip //DISABLE_CE(raw); // Disable CE call NandFlash_CE.set(); return error; } uint8_t CopyPage(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t sourcePage, uint16_t destBlock, uint16_t destPage){ uint32_t sourceRow, destRow; uint8_t error = 0; uint8_t data[NandCommon_MAXPAGEDATASIZE]; uint8_t spare[NandCommon_MAXPAGESPARESIZE]; uint16_t numPages = call Hpl.getBlockSizeInPages(MODEL(raw)); sourceRow = sourceBlock * numPages + sourcePage; destRow = destBlock * numPages + destPage; if (call Hpl.readPage(raw, sourceBlock, sourcePage, data, spare)) { error = NandCommon_ERROR_CANNOTREAD; } else if (call Hpl.writePage(raw, destBlock, destPage, data, spare)) { error = NandCommon_ERROR_CANNOTWRITE; } return error; } void configureNandFlash(uint8_t busWidth){ // Take a look at board_memories.h -- NOT CHIP_NAND_CTRL! // set clock // set smc registers volatile smc_setup_t *SETUP = (volatile smc_setup_t *) (0x400E0084 + 0x0); smc_setup_t setup = *SETUP; volatile smc_pulse_t *PULSE = (volatile smc_pulse_t *) (0x400E0084 + 0x4); smc_pulse_t pulse = *PULSE; volatile smc_cycle_t *CYCLE = (volatile smc_cycle_t *) (0x400E0084 + 0x8); smc_cycle_t cycle = *CYCLE; volatile smc_timings_t *TIMINGS = (volatile smc_timings_t *) (0x400E0084 + 0xC); smc_timings_t timings = *TIMINGS; volatile smc_mode_t *MODE = (volatile smc_mode_t *) (0x400E0084 + 0x10); smc_mode_t mode = *MODE; // start clock for register access call HSMC4ClockControl.disable(); call HSMC4ClockControl.enable(); setup.bits.nwe_setup = 0; setup.bits.ncs_wr_setup = 1; setup.bits.nrd_setup = 0; setup.bits.ncs_rd_setup = 1; *SETUP = setup; pulse.bits.nwe_pulse = 2; pulse.bits.ncs_wr_pulse = 3; pulse.bits.nrd_pulse = 3; pulse.bits.ncs_rd_pulse = 4; *PULSE = pulse; cycle.bits.nwe_cycle = 4; cycle.bits.nrd_cycle = 7; *CYCLE = cycle; timings.bits.tclr = 1; timings.bits.tadl = 2; timings.bits.tar = 1; timings.bits.trr = 1; timings.bits.twb = 2; timings.bits.rbnsel = 7; timings.bits.nfsel = 1; *TIMINGS = timings; if(busWidth == 8){ mode.bits.dbw = 0; mode.bits.read_mode = 1; mode.bits.write_mode = 1; *MODE = mode; }else if(busWidth == 16){ mode.bits.dbw = 1; mode.bits.read_mode = 1; mode.bits.write_mode = 1; *MODE = mode; } } void configurePsRam(){ // TODO: Take a look at board_memories.h -- NOT CHIP_NAND_CTRL! // TODO: Does Atmel code work with this disabled? } void configureNandPins(){ // Pin setting call NandFlash_CE.makeOutput(); call NandFlash_RB.makeInput(); call NandFlash_OE.disablePioControl(); call NandFlash_WE.disablePioControl(); call NandFlash_CLE.disablePioControl(); call NandFlash_ALE.disablePioControl(); call NandFlash_OE.selectPeripheralA(); call NandFlash_WE.selectPeripheralA(); call NandFlash_CLE.selectPeripheralA(); call NandFlash_ALE.selectPeripheralA(); call NandFlash_Data00.disablePioControl(); call NandFlash_Data01.disablePioControl(); call NandFlash_Data02.disablePioControl(); call NandFlash_Data03.disablePioControl(); call NandFlash_Data04.disablePioControl(); call NandFlash_Data05.disablePioControl(); call NandFlash_Data06.disablePioControl(); call NandFlash_Data07.disablePioControl(); call NandFlash_Data08.disablePioControl(); call NandFlash_Data09.disablePioControl(); call NandFlash_Data10.disablePioControl(); call NandFlash_Data11.disablePioControl(); call NandFlash_Data12.disablePioControl(); call NandFlash_Data13.disablePioControl(); call NandFlash_Data14.disablePioControl(); call NandFlash_Data15.disablePioControl(); call NandFlash_Data00.selectPeripheralA(); call NandFlash_Data01.selectPeripheralA(); call NandFlash_Data02.selectPeripheralA(); call NandFlash_Data03.selectPeripheralA(); call NandFlash_Data04.selectPeripheralA(); call NandFlash_Data05.selectPeripheralA(); call NandFlash_Data06.selectPeripheralA(); call NandFlash_Data07.selectPeripheralA(); call NandFlash_Data08.selectPeripheralA(); call NandFlash_Data09.selectPeripheralA(); call NandFlash_Data10.selectPeripheralA(); call NandFlash_Data11.selectPeripheralA(); call NandFlash_Data12.selectPeripheralA(); call NandFlash_Data13.selectPeripheralA(); call NandFlash_Data14.selectPeripheralA(); call NandFlash_Data15.selectPeripheralB(); // PB6 } command uint8_t Hpl.hasSmallBlocks(const struct NandFlashModel *model){ return (model->pageSizeInBytes <= 512 )? 1: 0; } //------------------------------------------------------------------------------ /// Returns the size of the data area of a page in bytes. /// \param model Pointer to a NandFlashModel instance. //------------------------------------------------------------------------------ command uint16_t Hpl.getPageDataSize(const struct NandFlashModel *model){ return model->pageSizeInBytes; } //------------------------------------------------------------------------------ /// Returns the size of the spare area of a page in bytes. /// \param model Pointer to a NandFlashModel instance. //------------------------------------------------------------------------------ command uint8_t Hpl.getPageSpareSize(const struct NandFlashModel *model){ return (model->pageSizeInBytes>>5); /// Spare size is 16/512 of data size } command void Hpl.init(struct RawNandFlash *HplNand, const struct NandFlashModel *model, uint32_t commandAddr, uint32_t addressAddr, uint32_t dataAddr){ uint32_t chipId; uint8_t error; uint8_t busWidth = 16; //configurePsRam(); configureNandFlash(busWidth); configureNandPins(); HplNand -> commandAddress = commandAddr; HplNand -> addressAddress = addressAddr; HplNand -> dataAddress = dataAddr; call Hpl.reset(); if(!model){ chipId = call Hpl.readId(); error = call Hpl.findNandModel(nandFlashModelList, NandFlashModelList_SIZE, &(HplNand->model), chipId); }else{ HplNand -> model = *model; } if(!error){ } else { } busWidth = 0; busWidth = GetDataBusWidth(MODEL(HplNand)); configureNandFlash(busWidth); memSize = call Hpl.getDeviceSizeInBytes(MODEL(HplNand)); blockSize = call Hpl.getBlockSizeInBytes(MODEL(HplNand)); numBlocks = call Hpl.getDeviceSizeInBlocks(MODEL(HplNand)); pageDataSize = call Hpl.getPageDataSize(MODEL(HplNand)); numPagesPerBlock = call Hpl.getBlockSizeInPages(MODEL(HplNand)); call Draw.drawInt(150, 20, busWidth, 1, COLOR_BLACK); call Draw.drawInt(150, 40, pageDataSize, 1, COLOR_BLACK); call Draw.drawInt(150, 60, memSize, 1, COLOR_BLACK); call Draw.drawInt(150, 80, numPagesPerBlock, 1, COLOR_BLACK); } command uint8_t Hpl.findNandModel(const struct NandFlashModel *modelList, uint8_t size, struct NandFlashModel *model, uint32_t chipId){ uint8_t i, found = 0; //volatile smc_cfg_t *CFG = (volatile smc_cfg_t *) (0x400E0000); //smc_cfg_t cfg = *CFG; uint8_t id2 = (uint8_t)(chipId>>8); uint8_t id4 = (uint8_t)(chipId>>24); //call Draw.drawInt(100, 60, chipId, 1, COLOR_YELLOW); //call Draw.drawInt(100, 80, id2, 1, COLOR_YELLOW); for(i=0; iblockSizeInKBytes == 0 || model->pageSizeInBytes == 0) { //TRACE_DEBUG("Fetch from ID4(0x%.2x):\r\n", id4); /// Fetch from the extended ID4 /// ID4 D5 D4 BlockSize || D1 D0 PageSize /// 0 0 64K || 0 0 1K /// 0 1 128K || 0 1 2K /// 1 0 256K || 1 0 4K /// 1 1 512K || 1 1 8k switch(id4 & 0x03) { case 0x00: model->pageSizeInBytes = 1024; break; case 0x01: model->pageSizeInBytes = 2048; break; case 0x02: model->pageSizeInBytes = 4096; break; case 0x03: model->pageSizeInBytes = 8192; break; } switch(id4 & 0x30) { case 0x00: model->blockSizeInKBytes = 64; break; case 0x10: model->blockSizeInKBytes = 128; break; case 0x20: model->blockSizeInKBytes = 256; break; case 0x30: model->blockSizeInKBytes = 512; break; } } /* switch(model->pageSizeInBytes) { case 1024: pageSize = AT91C_HSMC4_PAGESIZE_1056_Bytes; break; case 2048: pageSize = AT91C_HSMC4_PAGESIZE_2112_Bytes; break; case 4096: pageSize = AT91C_HSMC4_PAGESIZE_4224_Bytes; break; default: ;//TRACE_ERROR("Unsupportted page size for NAND Flash Controller\n\r"); } // This part sets the SMC registers? this is it? cfg.bits.pagesize = pageSize; cfg.bits.dtomul = 7; cfg.bits.edgectrl = 1; cfg.bits.dtocyc = 0xF; cfg.bits.rspare = 1; *CFG = cfg; //HSMC4_SetMode(pageSize | AT91C_HSMC4_DTOMUL_1048576 | AT91C_HSMC4_EDGECTRL | AT91C_HSMC4_DTOCYC | AT91C_HSMC4_RSPARE); // ????????????? */ } break; } } // Check if chip has been detected if (found) { return 0; } else { return NandCommon_ERROR_UNKNOWNMODEL; } } command void Hpl.reset(){ /* 1. Enable CE 2. Write reset command 3. wait for ready 4. Disable CE */ // Enable CE call NandFlash_CE.clr(); WRITE_COMMAND16(BOARD_NF_COMMAND_ADDR, COMMAND_RESET); //WRTIE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_RESET); WaitReady(); // Disable CE call NandFlash_CE.set(); } command uint32_t Hpl.readId(){ uint32_t chipId; // enable CE call NandFlash_CE.clr(); WRITE_COMMAND16(BOARD_NF_COMMAND_ADDR, COMMAND_READID); //WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READID); WRITE_ADDRESS(BOARD_NF_ADDRESS_ADDR, 0); chipId = READ_DATA8(BOARD_NF_DATA_ADDR); chipId |= READ_DATA8(BOARD_NF_DATA_ADDR) << 8; chipId |= READ_DATA8(BOARD_NF_DATA_ADDR) << 16; chipId |= READ_DATA8(BOARD_NF_DATA_ADDR) << 24; // Disable CE call NandFlash_CE.set(); return chipId; } command uint16_t Hpl.getDeviceSizeInBlocks(const struct NandFlashModel * model){ return ((1024) / model->blockSizeInKBytes) * model->deviceSizeInMegaBytes; } command uint32_t Hpl.getDeviceSizeInPages(const struct NandFlashModel *model){ return (uint32_t) call Hpl.getDeviceSizeInBlocks(model) * call Hpl.getBlockSizeInPages(model); } command uint8_t Hpl.eraseBlock(const struct RawNandFlash *raw, uint16_t block){ uint8_t numTries = NUMERASETRIES; while (numTries > 0) { if (!EraseBlock(raw, block)) { return 0; } numTries--; } return NandCommon_ERROR_BADBLOCK; } command uint16_t Hpl.getBlockSizeInPages(const struct NandFlashModel *model){ return model->blockSizeInKBytes * 1024 / model->pageSizeInBytes; } command uint8_t Hpl.readPage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare){ uint32_t colAddress; uint32_t rowAddress; uint8_t hasSmallBlocks; uint32_t pageSpareSize; hasSmallBlocks = call Hpl.hasSmallBlocks(MODEL(raw)); pageSpareSize = call Hpl.getPageSpareSize(MODEL(raw)); // Calculate actual address of the page rowAddress = (uint32_t) block * numPagesPerBlock /*call Hpl.getBlockSizeInPages(MODEL(raw))*/ + page; // Start operation //ENABLE_CE(raw); // Enable CE call NandFlash_CE.clr(); if (data) { colAddress = 0; } else { // to read spare area in sequential access colAddress = pageDataSize; } // Use either small blocks or large blocks data area read if (hasSmallBlocks) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_A); WriteColumnAddress(raw, colAddress); WriteRowAddress(raw, rowAddress); } else { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_1); WriteColumnAddress(raw, colAddress); WriteRowAddress(raw, rowAddress); WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_2); } // Wait for the nand to be ready WaitReady(); //pageDataSize = call Hpl.getPageDataSize(MODEL(raw)); call Draw.drawInt(200, 220, colAddress, 1, COLOR_BLUE); call Draw.drawInt(100, 220, pageDataSize, 1, COLOR_BLUE); call Draw.drawInt(rowAddress*15, 200, rowAddress, 1, COLOR_BLUE); // Read data area if needed if (data) { WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_1); if(pageDataSize != 2048){ call Draw.drawInt(200, 240, page, 1, COLOR_GREEN); } ReadData(raw, (uint8_t *) data, pageDataSize); if (spare) { //call Leds.led2Toggle(); ReadData(raw, (uint8_t *) spare, pageSpareSize); } } else { // Read spare area only WRITE_COMMAND(BOARD_NF_COMMAND_ADDR, COMMAND_READ_1); ReadData(raw, (uint8_t *) spare, pageSpareSize); } // Disable CE //DISABLE_CE(raw); // Disable CE call NandFlash_CE.set(); return 0; } //------------------------------------------------------------------------------ /// Reads the bad block marker inside a spare area buffer using the provided /// scheme. /// \param scheme Pointer to a NandSpareScheme instance. /// \param spare Spare area buffer. /// \param marker Pointer to the variable to store the bad block marker. //------------------------------------------------------------------------------ command void Hpl.readBadBlockMarker(const struct NandSpareScheme *scheme, const uint8_t *spare, uint8_t *marker){ *marker = spare[scheme->badBlockMarkerPosition]; } //------------------------------------------------------------------------------ /// Modifies the bad block marker inside a spare area, using the given scheme. /// \param scheme Pointer to a NandSpareScheme instance. /// \param spare Spare area buffer. /// \param marker Bad block marker to write. //------------------------------------------------------------------------------ command void Hpl.writeBadBlockMarker(const struct NandSpareScheme *scheme, uint8_t *spare, uint8_t marker){ spare[scheme->badBlockMarkerPosition] = marker; } command uint32_t Hpl.getDeviceSizeInBytes(const struct NandFlashModel *model){ return ((uint32_t) model->deviceSizeInMegaBytes) << 20; } command uint32_t Hpl.getBlockSizeInBytes(const struct NandFlashModel *model){ return (model->blockSizeInKBytes *1024); } command uint8_t Hpl.writePage(const struct RawNandFlash *raw, uint16_t block, uint16_t page, void *data, void *spare){ uint8_t numTries = NUMWRITETRIES; while (numTries > 0) { if (!WritePage(raw, block, page, data, spare)) { return 0; } numTries--; } return NandCommon_ERROR_BADBLOCK; } command uint8_t Hpl.copyPage(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t sourcePage, uint16_t destBlock, uint16_t destPage){ uint8_t numTries = NUMCOPYTRIES; while (numTries) { if (!CopyPage(raw, sourceBlock, sourcePage, destBlock, destPage)) { return 0; } numTries--; } return NandCommon_ERROR_BADBLOCK; } command uint8_t Hpl.copyBlock(const struct RawNandFlash *raw, uint16_t sourceBlock, uint16_t destBlock){ uint32_t i; uint16_t numPages = call Hpl.getBlockSizeInPages(MODEL(raw)); // Copy all pages for (i=0; i < numPages; i++) { if (call Hpl.copyPage(raw, sourceBlock, i, destBlock, i)) { return NandCommon_ERROR_BADBLOCK; } } return 0; } uint16_t totalReadFromBlock = 0; uint16_t readBlock = 0; void* readData; const struct RawNandFlash saveRaw; void readBlockTask(){ uint8_t error; call Draw.fill(COLOR_WHITE); error = call Hpl.readPage(&saveRaw, readBlock, totalReadFromBlock, readData, 0);//ECC(skipBlock), block, i, data, 0); totalReadFromBlock ++; if (error) { //call Leds.led0Toggle(); return; }else if(totalReadFromBlock < numPagesPerBlock){ //call Draw.drawInt(totalReadFromBlock*15, 170, totalReadFromBlock, 1, COLOR_BLUE); //call Draw.drawInt(200, 185, numPagesPerBlock, 1, COLOR_BLUE); readData = (void *) ((uint8_t *) readData + pageDataSize); readBlockTask(); //call ReadBlockTimer.startOneShot(5); }else{ call Leds.led2Toggle(); } } command uint8_t Hpl.readBlock(const struct RawNandFlash *raw, uint16_t block, void *data){ //uint16_t i, error; totalReadFromBlock = 0; memcpy((void*)&saveRaw, (void*)raw, sizeof(struct RawNandFlash)); readBlock = block; readData = data; readBlockTask(); return 0; } command uint8_t Hpl.writeBlock(const struct RawNandFlash *raw, uint16_t block, void *data){ uint8_t error, i; for(i=0; i SDC; FatFsP.diskIOStdControl -> SDC; FatFsP.Time->TimeC; components LedsC; FatFsP.Leds->LedsC; } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/sd/PlatformHsmciConfigC.nc000066400000000000000000000044761207233610700263560ustar00rootroot00000000000000/* * Copyright (c) 2010 Johns Hopkins University. * Copyright (c) 2010 CSIRO Australia * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Platform specific SD card initialization for the Sam3u Cortex HSMCI bus * * @author Kevin Klues */ #include module PlatformHsmciConfigC { provides interface Init; } implementation { command error_t Init.init() { // Write protection on the registers must first be disabled if(HSMCI->wpmr.bits.wp_en) return FAIL; HSMCI->sdcr.bits.sdcsel = 0; // Choose card slot A HSMCI->sdcr.bits.sdcbus = 2; // 4 bit data bus HSMCI->cmdr.bits.trtyp = 0; // SDCard single block transfer mode HSMCI->blkr.bits.blklen = 512; // The block size HSMCI->blkr.bits.bcnt = 1; // SDCard single block transfer return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/sd/Time.h000066400000000000000000000045111207233610700230700ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ typedef uint32_t time_t; #define HAVE_WDAY #undef HAVE_DST struct tm { int tm_sec; /* Seconds. [0-60] (1 leap second) */ int tm_min; /* Minutes. [0-59] */ int tm_hour; /* Hours. [0-23] */ int tm_mday; /* Day. [1-31] */ int tm_mon; /* Month. [0-11] */ int tm_year; /* Year - 1900. */ #ifdef HAVE_WDAY int tm_wday; /* Day of week. [0-6] */ #endif int tm_yday; /* Days in year.[0-365] */ int tm_isdst; /* DST. [-1/0/1]*/ #ifdef __UCLIBC_HAS_TM_EXTENSIONS__ #ifdef __USE_BSD long int tm_gmtoff; /* Seconds east of UTC. */ __const char *tm_zone; /* Timezone abbreviation. */ #else long int __tm_gmtoff; /* Seconds east of UTC. */ __const char *__tm_zone; /* Timezone abbreviation. */ #endif #endif /* __UCLIBC_HAS_TM_EXTENSIONS__ */ }; tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/sd/Time.nc000066400000000000000000000040641207233610700232440ustar00rootroot00000000000000/* * Copyright (c) 2005 Hewlett-Packard Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "Time.h" interface Time { command error_t gmtime(const time_t *timer, struct tm *tm); command error_t localtime(const time_t *timer, struct tm *tm); command error_t asctime(const struct tm *tm, char *buf, int buflen); command error_t time(time_t *timer); command void setCurrentTime(time_t current_time); command void setZoneInfo(uint16_t g_year, time_t g_year_time, uint8_t g_zero_day, uint16_t g_dst_fday, uint16_t g_dst_lday); event void tick(); } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/sd/TimeC.nc000066400000000000000000000042511207233610700233450ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date March, 2010 * * pulling together time modules */ configuration TimeC { provides{ interface Time; interface Init; } } implementation { components TimeP; Init = TimeP; Time = TimeP; components new TimerMilliC() as LocalTimer; TimeP.Timer -> LocalTimer; components Counter32khz64C as Counter; components new CounterToLocalTime64C(T32khz); CounterToLocalTime64C.Counter -> Counter; TimeP.LocalTime64 -> CounterToLocalTime64C; /* * and, at some point... * TimeP.NTPClient -> NTPClientM; not yet, awaiting tos-2.x ip port */ } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/sd/TimeP.nc000066400000000000000000000235061207233610700233660ustar00rootroot00000000000000/* * Copyright (C) 2002 Manuel Novoa III * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * port to tos-2.x * @author Steve Ayer * @date January, 2010 */ // includes InfoMem; let's avoid this... module TimeP { provides { interface Init; interface Time; // interface ParamView; save for ip stack port to tos-2.x } uses { interface Timer; // interface NTPClient; save for ip stack port to tos-2.x interface LocalTime64; } } implementation { #define HAVE_DST extern int snprintf(char *str, size_t len, const char *format, ...) __attribute__ ((C)); struct y_info{ time_t year_seconds; /* time_t value for beginning of year */ int8_t wday_offset; /* tm_day of first day of the year */ int8_t isleap; int16_t dst_first_yday; int16_t dst_last_yday; }; time_t g_seconds; time_t g_year_seconds; time_t g_seconds_from_year; uint16_t g_days; time_t g_seconds_from_day; //#define TZNAME_MAX 7 //#define LONG_MAX 0x7fffffffL time_t g_tick_local_time; #ifdef CURRENT_TIME time_t g_current_time = CURRENT_TIME; #else time_t g_current_time; #endif #ifndef HOST_TIME #define NUM_YEARS 4 int16_t g_first_year = 2009; struct y_info year_info[NUM_YEARS] = { /* unix time start jan 1 1970 */ // from 2007, dst begins 2nd sunday in march, ends first sunday in november { 0x495c4dd0, 3, 0, 67, 305}, { 0x4B3D8150, 4, 0, 73, 311}, { 0x4D1EB4D0, 5, 0, 72, 310}, { 0x4EFFE850, 6, 1, 71, 309} }; #else #define NUM_YEARS 1 // these will be set by setZoneInfo() int16_t g_first_year = 0; struct y_info year_info[NUM_YEARS]; #endif // time_t g_local_time; /* from LocalTime.read() */ uint64_t g_local_time; /* from LocalTime.read(), now 64 bits to handle */ typedef struct { long gmt_offset; // long dst_offset; // short day; /* for J or normal */ // short week; // short month; // short rule_type; /* J, M, \0 */ // char tzname[TZNAME_MAX+1]; } rule_struct; rule_struct _time_tzinfo[1]; // gmt_offset can stay zero, because any CURRENT_TIME we get is from a local source command error_t Init.init() { _time_tzinfo[0].gmt_offset = 60L * 0L; g_tick_local_time = call LocalTime64.get(); call Timer.startPeriodic(10*1024L); signal Time.tick(); return SUCCESS; } command void Time.setCurrentTime(time_t current_time){ atomic g_current_time = current_time; g_local_time = call LocalTime64.get(); } command void Time.setZoneInfo(uint16_t g_year, time_t g_year_time, uint8_t g_zero_day, uint16_t g_dst_fday, uint16_t g_dst_lday){ g_first_year = g_year; year_info[0].year_seconds = g_year_time; year_info[0].wday_offset = g_zero_day; if(!(g_year % 4)) year_info[0].isleap = 1; else year_info[0].isleap = 0; year_info[0].dst_first_yday = g_dst_fday; year_info[0].dst_last_yday = g_dst_lday; } void dotick(int force) { time_t tick = call LocalTime64.get(); if (force || tick >= (g_tick_local_time + 32768L*10)) { signal Time.tick(); g_tick_local_time = tick; } } event void Timer.fired() { dotick(0); } /* * save this pending tos-2.x port of ip stack * event void NTPClient.timestampReceived( uint32_t *seconds, uint32_t *fraction ) { g_current_time = *seconds; g_local_time = call LocalTime64.get(); dotick(1); } */ struct tm __time_tm; /* Notes: * If time_t is 32 bits, then no overflow is possible. * It time_t is > 32 bits, this needs to be adjusted to deal with overflow. */ static const int8_t days_per_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, /* non-leap */ 29, }; #ifdef __UCLIBC_HAS_TM_EXTENSIONS__ static const char utc_string[] = "UTC"; #endif /* import time for y in range(2004,2008): t = time.mktime((y, 1, 1, 0, 0, 0, 0, 0, 0))-5*3600 print time.gmtime(t) (2004, 1, 1, 0, 0, 0, 3, 1, 0) (2005, 1, 1, 0, 0, 0, 5, 1, 0) (2006, 1, 1, 0, 0, 0, 6, 1, 0) (2007, 1, 1, 0, 0, 0, 0, 1, 0) from below in year_info struct for 2004-7 { 0x3ff36300, 3, 1 }, { 0x41d5e800, 5, 0 }, { 0x43b71b80, 6, 0 }, { 0x45984f00, 0, 0 } NTP Timestamp starts Jan 1, 1900 and is 2208988800 jan 1 1970 '%x' % (int(time.mktime((2004, 1, 1, 0, 0, 0, 3, 1, 0))) -18000 + 2208988800l) and now, (2009, 1, 1, 0, 0, 0, 3, 1, 0) (2010, 1, 1, 0, 0, 0, 4, 1, 0) (2011, 1, 1, 0, 0, 0, 5, 1, 0) (2012, 1, 1, 0, 0, 0, 6, 1, 0) */ struct tm *_time_t2tm(const time_t *timer, int localtime, struct tm *result) { uint16_t seconds16; int i; time_t seconds = *timer; uint16_t days; uint16_t hour, min; int isleap = 0; //if year_info has dst_first_yday and dst_last_yday defined, then HAVE_DST should be defined up top. #ifdef HAVE_DST int isdst = 0; #endif if (localtime) { seconds -= _time_tzinfo[0].gmt_offset; } g_seconds = seconds; if (seconds < year_info[0].year_seconds) { memset(result, 0, sizeof(struct tm)); return NULL; } if(NUM_YEARS > 1){ for (i = 0; i < NUM_YEARS-1; i++) { if (seconds < year_info[i+1].year_seconds) { seconds -= year_info[i].year_seconds; result->tm_year = g_first_year + i; isleap = year_info[i].isleap; break; } } } else{ i = 0; seconds -= year_info[i].year_seconds; result->tm_year = g_first_year + i; isleap = year_info[i].isleap; } g_year_seconds = year_info[i].year_seconds; g_seconds_from_year = seconds; days = seconds / 86400L; g_days = days; seconds -= days * 86400L; g_seconds_from_day = seconds; #ifdef HAVE_DST if (days >= year_info[i].dst_first_yday && days <= year_info[i].dst_last_yday) { isdst = 1; seconds += 3600; if (seconds < 0) { days--; seconds += 86400L; } if (days < 0) { result->tm_year--; days += 365; } } #endif /* HAVE_DST */ result->tm_yday = days; #ifdef HAVE_WDAY result->tm_wday = (result->tm_yday + year_info[i+1].wday_offset) % 7; #endif for (i = 0; i < 12; i++) { int8_t dpm = days_per_month[i]; if (i == 1 && isleap) dpm++; if (days < dpm) break; days -= dpm; } result->tm_mon = i; result->tm_mday = 1 + days ; hour = seconds / 3600; seconds16 = seconds - hour * 3600; result->tm_hour = hour; min = seconds16 / 60; result->tm_sec = seconds16 - min * 60; result->tm_min = min; return result; } command error_t Time.gmtime(const time_t *timer, struct tm *ptm) { _time_t2tm(timer, 0, ptm); /* Can return NULL... */ return SUCCESS; } /* Note: timezone locking is done by localtime_r. */ static int tm_isdst(register const struct tm *__restrict ptm) { // no DST in arizona return 0; } command error_t Time.localtime(const time_t *timer, struct tm *result) { _time_t2tm(timer, 1, result); return SUCCESS; } static char *wday_name[] = { "Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat" }; static char *mon_name[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; command error_t Time.asctime(const struct tm *tm, char *buf, int buflen) { char *out = buf; char *outmax = buf + buflen; out += snprintf(out, outmax - out, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec); #ifdef HAVE_WDAY out += snprintf(out, outmax - out, " %s", wday_name[tm->tm_wday]); #endif out += snprintf(out, outmax - out, " %s %d %d", mon_name[tm->tm_mon], tm->tm_mday, tm->tm_year); return SUCCESS; } command error_t Time.time(time_t *timer) { // 1/32768 seconds since last NTP response uint64_t o = call LocalTime64.get() - g_local_time; *timer = g_current_time + (time_t)(o >> 15); return SUCCESS; } default event void Time.tick() { } /***************************************** * ParamView interface * save for ip stack port to tos-2.x const struct Param s_Time[] = { { "ntp time", PARAM_TYPE_UINT32, &g_current_time }, { "local time", PARAM_TYPE_UINT32, &g_local_time }, { NULL, 0, NULL } }; struct ParamList g_TimeList = { "time", &s_Time[0] }; command error_t ParamView.init() { signal ParamView.add( &g_TimeList ); return SUCCESS; } *****************************************/ } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/chips/sd/integer.h000066400000000000000000000063611207233610700236340ustar00rootroot00000000000000/*-----------------------------------------------------------------------------/ / FatFs module is an open source software to implement FAT file system to / small embedded systems. This is a free software and is opened for education, / research and commecial developments under license policy of following trems. / / Copyright (C) 2009, ChaN, all right reserved. / / * The FatFs module is a free software and there is NO WARRANTY. / * No restriction on use. You can use, modify and redistribute it for / personal, non-profit or commercial use UNDER YOUR RESPONSIBILITY. / * Redistributions of source code must retain the above copyright notice. / /-----------------------------------------------------------------------------*/ /* * Portions of this code: * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * tinyos port from ChaN's FatFs (thank you!): * * @author Steve Ayer * @date April, 2009 * ported to tos-2.x (easy) * @date January, 2010 */ #ifndef _INTEGER // original typedefs converted to nesc stdint.h types for tos consistency /* These types must be 16-bit, 32-bit or larger integer */ typedef int INT; typedef unsigned int UINT; /* These types must be 8-bit integer */ // had to change signed char typedef CHAR to SCHAR to avoid conflict with msp430 usart.h (#define CHAR 0x10) typedef int8_t SCHAR; typedef uint8_t UCHAR; typedef uint8_t BYTE; /* These types must be 16-bit integer */ typedef int16_t SHORT; typedef uint16_t USHORT; typedef uint16_t WORD; typedef uint16_t WCHAR; /* These types must be 32-bit integer */ typedef long LONG; typedef unsigned long ULONG; typedef uint32_t DWORD; /* Boolean type */ //typedef enum { FALSE = 0, TRUE } BOOL; typedef char BOOL; #define _INTEGER #endif tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/hardware.h000066400000000000000000000046351207233610700222620ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Definitions of stuff specific to the SAM3U-EK board. * Includes definitions for the SAM3U MCU. * * @author Wanja Hofer */ #ifndef HARDWARE_H #define HARDWARE_H #include "sam3uhardware.h" // #define this so we don't doubly define time_t with conflicting types // in SD card implementation Time.h file #define __time_t_defined #include #ifndef PLATFORM_BAUDRATE #define PLATFORM_BAUDRATE (9600) #endif #define IRQ_PRIO_UDPHS (0x81) #define IRQ_PRIO_TWI1 (0x82) #define IRQ_PRIO_TWI0 (0x83) #define IRQ_PRIO_DMAC (0x84) #define IRQ_PRIO_ADC12B (0x85) #define IRQ_PRIO_PIO (0x86) #define IRQ_PRIO_SPI (0x87) #define IRQ_PRIO_UART (0x88) #define IRQ_PRIO_USART0 (0x89) #define IRQ_PRIO_USART1 (0x90) #define IRQ_PRIO_USART2 (0x91) #define IRQ_PRIO_HSMCI (0x92) #endif // HARDWARE_H tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/lcd/000077500000000000000000000000001207233610700210465ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/lcd/Draw.nc000066400000000000000000000061611207233610700222710ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * @author Thomas Schmid **/ interface Draw { async command void fill(uint32_t color); async command void drawPixel( uint32_t x, uint32_t y, uint32_t c); async command void drawRectangle( uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t color); async command void drawString( uint32_t x, uint32_t y, const char *pString, uint32_t color); async command void drawStringWithBGColor( uint32_t x, uint32_t y, const char *pString, uint32_t fontColor, uint32_t bgColor); async command void drawInt( uint32_t x, uint32_t y, uint32_t n, int8_t sign, uint32_t fontColor); async command void drawIntWithBGColor( uint32_t x, uint32_t y, uint32_t n, int8_t sign, uint32_t fontColor, uint32_t bgColor); async command void getStringSize( const char *pString, uint32_t *pWidth, uint32_t *pHeight); async command void drawChar( uint32_t x, uint32_t y, char c, uint32_t color); async command void drawCharWithBGColor( uint32_t x, uint32_t y, char c, uint32_t fontColor, uint32_t bgColor); } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/lcd/Hx8347.nc000066400000000000000000000044641207233610700223050ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * @author Thomas Schmid **/ interface Hx8347 { async command void writeReg(void *pLcdBase, uint8_t reg, uint16_t data); async command uint16_t readReg(void *pLcdBase, uint8_t reg); async command uint16_t readStatus(void *pLcdBase); async command void writeRAM_Prepare(void *pLcdBase); async command void writeRAM(void *pLcdBase, uint16_t color); async command uint16_t readRAM(void *pLcdBase); command void initialize(void *pLcdBase); event void initializeDone(error_t err); async command void setCursor(void *pLcdBase, uint16_t x, uint16_t y); command void on(void *pLcdBase); event void onDone(); async command void off(void *pLcdBase); } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/lcd/Hx8347C.nc000066400000000000000000000350761207233610700224130ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * @author Thomas Schmid **/ module Hx8347C { uses { interface Timer as InitTimer; interface Timer as OnTimer; } provides interface Hx8347; } implementation { typedef volatile uint16_t REG16; enum { INIT0, INIT1, INIT2, }; uint8_t initState = INIT0; enum { ON0, ON1, ON2, }; uint8_t onState = ON0; void* spLcdBase; #define BOARD_LCD_RS (1 << 1) // LCD index register address #define LCD_IR(baseAddr) (*((REG16 *)(baseAddr))) // LCD status register address #define LCD_SR(baseAddr) (*((REG16 *)(baseAddr))) // LCD data address #define LCD_D(baseAddr) (*((REG16 *)((uint32_t)(baseAddr) + BOARD_LCD_RS))) // HX8347 ID code #define HX8347_HIMAXID_CODE 0x47 // HX8347 LCD Registers #define HX8347_R00H 0x00 #define HX8347_R01H 0x01 #define HX8347_R02H 0x02 #define HX8347_R03H 0x03 #define HX8347_R04H 0x04 #define HX8347_R05H 0x05 #define HX8347_R06H 0x06 #define HX8347_R07H 0x07 #define HX8347_R08H 0x08 #define HX8347_R09H 0x09 #define HX8347_R0AH 0x0A #define HX8347_R0CH 0x0C #define HX8347_R0DH 0x0D #define HX8347_R0EH 0x0E #define HX8347_R0FH 0x0F #define HX8347_R10H 0x10 #define HX8347_R11H 0x11 #define HX8347_R12H 0x12 #define HX8347_R13H 0x13 #define HX8347_R14H 0x14 #define HX8347_R15H 0x15 #define HX8347_R16H 0x16 #define HX8347_R18H 0x18 #define HX8347_R19H 0x19 #define HX8347_R1AH 0x1A #define HX8347_R1BH 0x1B #define HX8347_R1CH 0x1C #define HX8347_R1DH 0x1D #define HX8347_R1EH 0x1E #define HX8347_R1FH 0x1F #define HX8347_R20H 0x20 #define HX8347_R21H 0x21 #define HX8347_R22H 0x22 #define HX8347_R23H 0x23 #define HX8347_R24H 0x24 #define HX8347_R25H 0x25 #define HX8347_R26H 0x26 #define HX8347_R27H 0x27 #define HX8347_R28H 0x28 #define HX8347_R29H 0x29 #define HX8347_R2AH 0x2A #define HX8347_R2BH 0x2B #define HX8347_R2CH 0x2C #define HX8347_R2DH 0x2D #define HX8347_R35H 0x35 #define HX8347_R36H 0x36 #define HX8347_R37H 0x37 #define HX8347_R38H 0x38 #define HX8347_R39H 0x39 #define HX8347_R3AH 0x3A #define HX8347_R3BH 0x3B #define HX8347_R3CH 0x3C #define HX8347_R3DH 0x3D #define HX8347_R3EH 0x3E #define HX8347_R40H 0x40 #define HX8347_R41H 0x41 #define HX8347_R42H 0x42 #define HX8347_R43H 0x43 #define HX8347_R44H 0x44 #define HX8347_R45H 0x45 #define HX8347_R46H 0x46 #define HX8347_R47H 0x47 #define HX8347_R48H 0x48 #define HX8347_R49H 0x49 #define HX8347_R4AH 0x4A #define HX8347_R4BH 0x4B #define HX8347_R4CH 0x4C #define HX8347_R4DH 0x4D #define HX8347_R4EH 0x4E #define HX8347_R4FH 0x4F #define HX8347_R50H 0x50 #define HX8347_R51H 0x51 #define HX8347_R64H 0x64 #define HX8347_R65H 0x65 #define HX8347_R66H 0x66 #define HX8347_R67H 0x67 #define HX8347_R70H 0x70 #define HX8347_R72H 0x72 #define HX8347_R90H 0x90 #define HX8347_R91H 0x91 #define HX8347_R93H 0x93 #define HX8347_R94H 0x94 #define HX8347_R95H 0x95 /** * Write data to LCD Register. * \param pLcdBase LCD base address. * \param reg Register address. * \param data Data to be written. */ async command void Hx8347.writeReg(void *pLcdBase, uint8_t reg, uint16_t data) { LCD_IR(pLcdBase) = reg; LCD_D(pLcdBase) = data; } /** * Read data from LCD Register. * \param pLcdBase LCD base address. * \param reg Register address. * \return data Data to be read. */ async command uint16_t Hx8347.readReg(void *pLcdBase, uint8_t reg) { LCD_IR(pLcdBase) = reg; return LCD_D(pLcdBase); } /** * Read LCD status Register. * \param pLcdBase LCD base address. * \param reg Register address. * \return data Status Data. */ async command uint16_t Hx8347.readStatus(void *pLcdBase) { return LCD_SR(pLcdBase); } /** * Prepare to write GRAM data. * \param pLcdBase LCD base address. */ async command void Hx8347.writeRAM_Prepare(void *pLcdBase) { LCD_IR(pLcdBase) = HX8347_R22H; } /** * Write data to LCD GRAM. * \param pLcdBase LCD base address. * \param color 16-bits RGB color. */ async command void Hx8347.writeRAM(void *pLcdBase, uint16_t color) { // Write 16-bit GRAM Reg LCD_D(pLcdBase) = color; } /** * Read GRAM data. * \param pLcdBase LCD base address. * \return 16-bits RGB color. */ async command uint16_t Hx8347.readRAM(void *pLcdBase) { // Read 16-bit GRAM Reg return LCD_D(pLcdBase); } event void InitTimer.fired() { // advance in the initialization call Hx8347.initialize(spLcdBase); } /** * Initialize the LCD controller. * \param pLcdBase LCD base address. */ command void Hx8347.initialize(void *pLcdBase) { uint16_t chipid; switch(initState) { case INIT0: spLcdBase = pLcdBase; // Check HX8347 chipid chipid = call Hx8347.readReg(pLcdBase, HX8347_R67H); if(chipid != HX8347_HIMAXID_CODE) { // Read HX8347 chip ID error, skip initialization. signal Hx8347.initializeDone(FAIL); return ; } // Start internal OSC call Hx8347.writeReg(pLcdBase, HX8347_R19H, 0x49); // OSCADJ=10 0000, OSD_EN=1 //60Hz call Hx8347.writeReg(pLcdBase, HX8347_R93H, 0x0C); // RADJ=1100 // Power on flow call Hx8347.writeReg(pLcdBase, HX8347_R44H, 0x4D); // VCM=100 1101 call Hx8347.writeReg(pLcdBase, HX8347_R45H, 0x11); // VDV=1 0001 call Hx8347.writeReg(pLcdBase, HX8347_R20H, 0x40); // BT=0100 call Hx8347.writeReg(pLcdBase, HX8347_R1DH, 0x07); // VC1=111 call Hx8347.writeReg(pLcdBase, HX8347_R1EH, 0x00); // VC3=000 call Hx8347.writeReg(pLcdBase, HX8347_R1FH, 0x04); // VRH=0100 call Hx8347.writeReg(pLcdBase, HX8347_R1CH, 0x04); // AP=100 call Hx8347.writeReg(pLcdBase, HX8347_R1BH, 0x10); // GASENB=0, PON=1, DK=0, XDK=0, DDVDH_TRI=0, STB=0 initState = INIT1; call InitTimer.startOneShot(50); break; case INIT1: call Hx8347.writeReg(pLcdBase, HX8347_R43H, 0x80); // Set VCOMG=1 initState = INIT2; call InitTimer.startOneShot(50); break; case INIT2: // Gamma for CMO 2.8 call Hx8347.writeReg(pLcdBase, HX8347_R46H, 0x95); call Hx8347.writeReg(pLcdBase, HX8347_R47H, 0x51); call Hx8347.writeReg(pLcdBase, HX8347_R48H, 0x00); call Hx8347.writeReg(pLcdBase, HX8347_R49H, 0x36); call Hx8347.writeReg(pLcdBase, HX8347_R4AH, 0x11); call Hx8347.writeReg(pLcdBase, HX8347_R4BH, 0x66); call Hx8347.writeReg(pLcdBase, HX8347_R4CH, 0x14); call Hx8347.writeReg(pLcdBase, HX8347_R4DH, 0x77); call Hx8347.writeReg(pLcdBase, HX8347_R4EH, 0x13); call Hx8347.writeReg(pLcdBase, HX8347_R4FH, 0x4C); call Hx8347.writeReg(pLcdBase, HX8347_R50H, 0x46); call Hx8347.writeReg(pLcdBase, HX8347_R51H, 0x46); //240x320 window setting call Hx8347.writeReg(pLcdBase, HX8347_R02H, 0x00); // Column address start2 call Hx8347.writeReg(pLcdBase, HX8347_R03H, 0x00); // Column address start1 call Hx8347.writeReg(pLcdBase, HX8347_R04H, 0x00); // Column address end2 call Hx8347.writeReg(pLcdBase, HX8347_R05H, 0xEF); // Column address end1 call Hx8347.writeReg(pLcdBase, HX8347_R06H, 0x00); // Row address start2 call Hx8347.writeReg(pLcdBase, HX8347_R07H, 0x00); // Row address start1 call Hx8347.writeReg(pLcdBase, HX8347_R08H, 0x01); // Row address end2 call Hx8347.writeReg(pLcdBase, HX8347_R09H, 0x3F); // Row address end1 // Display Setting call Hx8347.writeReg(pLcdBase, HX8347_R01H, 0x06); // IDMON=0, INVON=1, NORON=1, PTLON=0 call Hx8347.writeReg(pLcdBase, HX8347_R16H, 0xC8); // MY=1, MX=1, MV=0, BGR=1 call Hx8347.writeReg(pLcdBase, HX8347_R23H, 0x95); // N_DC=1001 0101 call Hx8347.writeReg(pLcdBase, HX8347_R24H, 0x95); // P_DC=1001 0101 call Hx8347.writeReg(pLcdBase, HX8347_R25H, 0xFF); // I_DC=1111 1111 call Hx8347.writeReg(pLcdBase, HX8347_R27H, 0x06); // N_BP=0000 0110 call Hx8347.writeReg(pLcdBase, HX8347_R28H, 0x06); // N_FP=0000 0110 call Hx8347.writeReg(pLcdBase, HX8347_R29H, 0x06); // P_BP=0000 0110 call Hx8347.writeReg(pLcdBase, HX8347_R2AH, 0x06); // P_FP=0000 0110 call Hx8347.writeReg(pLcdBase, HX8347_R2CH, 0x06); // I_BP=0000 0110 call Hx8347.writeReg(pLcdBase, HX8347_R2DH, 0x06); // I_FP=0000 0110 call Hx8347.writeReg(pLcdBase, HX8347_R3AH, 0x01); // N_RTN=0000, N_NW=001 call Hx8347.writeReg(pLcdBase, HX8347_R3BH, 0x01); // P_RTN=0000, P_NW=001 call Hx8347.writeReg(pLcdBase, HX8347_R3CH, 0xF0); // I_RTN=1111, I_NW=000 call Hx8347.writeReg(pLcdBase, HX8347_R3DH, 0x00); // DIV=00 call Hx8347.writeReg(pLcdBase, HX8347_R3EH, 0x38); // SON=38h call Hx8347.writeReg(pLcdBase, HX8347_R40H, 0x0F); // GDON=0Fh call Hx8347.writeReg(pLcdBase, HX8347_R41H, 0xF0); // GDOF=F0h initState = INIT0; signal Hx8347.initializeDone(SUCCESS); break; } } event void OnTimer.fired() { call Hx8347.on(spLcdBase); } /** * Turn on the LCD. * \param pLcdBase LCD base address. */ command void Hx8347.on(void *pLcdBase) { switch(onState) { case ON0: // Display ON Setting spLcdBase = pLcdBase; call Hx8347.writeReg(pLcdBase, HX8347_R90H, 0x7F); // SAP=0111 1111 call Hx8347.writeReg(pLcdBase, HX8347_R26H, 0x04); // GON=0, DTE=0, D=01 call OnTimer.startOneShot(100); onState = ON1; break; case ON1: call Hx8347.writeReg(pLcdBase, HX8347_R26H, 0x24); // GON=1, DTE=0, D=01 call Hx8347.writeReg(pLcdBase, HX8347_R26H, 0x2C); // GON=1, DTE=0, D=11 call OnTimer.startOneShot(100); onState = ON2; break; case ON2: call Hx8347.writeReg(pLcdBase, HX8347_R26H, 0x3C); // GON=1, DTE=1, D=11 onState = ON0; signal Hx8347.onDone(); break; } } /** * Turn off the LCD. * \param pLcdBase LCD base address. */ async command void Hx8347.off(void *pLcdBase) { call Hx8347.writeReg(pLcdBase, HX8347_R90H, 0x00); // SAP=0000 0000 call Hx8347.writeReg(pLcdBase, HX8347_R26H, 0x00); // GON=0, DTE=0, D=00 } /** * Set cursor of LCD srceen. * \param pLcdBase LCD base address. * \param x X-coordinate of upper-left corner on LCD. * \param y Y-coordinate of upper-left corner on LCD. */ async command void Hx8347.setCursor(void *pLcdBase, uint16_t x, uint16_t y) { uint8_t x1, x2, y1l, y2; x1 = x & 0xff; x2 = (x & 0xff00) >>8; y1l = y & 0xff; y2 = (y & 0xff00) >>8; call Hx8347.writeReg(pLcdBase, HX8347_R02H, x2); // column high call Hx8347.writeReg(pLcdBase, HX8347_R03H, x1); // column low call Hx8347.writeReg(pLcdBase, HX8347_R06H, y2); // row high call Hx8347.writeReg(pLcdBase, HX8347_R07H, y1l); // row low } default event void Hx8347.initializeDone(error_t err) {}; default event void Hx8347.onDone() {}; } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/lcd/Lcd.nc000066400000000000000000000036711207233610700221010ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * @author Thomas Schmid **/ interface Lcd { command void initialize(); event void initializeDone(error_t err); command void * displayBuffer(void *pBuffer); command void start(); event void startDone(); command void stop(); command void setBacklight (uint8_t step); } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/lcd/LcdC.nc000066400000000000000000000062641207233610700222050ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * @author Thomas Schmid **/ configuration LcdC { provides { interface Lcd; interface Draw; } } implementation { components LcdP, Hx8347C; Lcd = LcdP.Lcd; Draw = LcdP.Draw; LcdP.Hx8347 -> Hx8347C; components new TimerMilliC() as T0; components new TimerMilliC() as T1; Hx8347C.InitTimer -> T0; Hx8347C.OnTimer -> T1; components HplSam3uGeneralIOC; LcdP.DB0 -> HplSam3uGeneralIOC.HplPioB9; LcdP.DB1 -> HplSam3uGeneralIOC.HplPioB10; LcdP.DB2 -> HplSam3uGeneralIOC.HplPioB11; LcdP.DB3 -> HplSam3uGeneralIOC.HplPioB12; LcdP.DB4 -> HplSam3uGeneralIOC.HplPioB13; LcdP.DB5 -> HplSam3uGeneralIOC.HplPioB14; LcdP.DB6 -> HplSam3uGeneralIOC.HplPioB15; LcdP.DB7 -> HplSam3uGeneralIOC.HplPioB16; LcdP.DB8 -> HplSam3uGeneralIOC.HplPioB25; LcdP.DB9 -> HplSam3uGeneralIOC.HplPioB26; LcdP.DB10 -> HplSam3uGeneralIOC.HplPioB27; LcdP.DB11 -> HplSam3uGeneralIOC.HplPioB28; LcdP.DB12 -> HplSam3uGeneralIOC.HplPioB29; LcdP.DB13 -> HplSam3uGeneralIOC.HplPioB30; LcdP.DB14 -> HplSam3uGeneralIOC.HplPioB31; LcdP.DB15 -> HplSam3uGeneralIOC.HplPioB6; LcdP.LCD_RS -> HplSam3uGeneralIOC.HplPioB8; LcdP.NRD -> HplSam3uGeneralIOC.HplPioB19; LcdP.NWE -> HplSam3uGeneralIOC.HplPioB23; LcdP.NCS2 -> HplSam3uGeneralIOC.HplPioC16; LcdP.Backlight -> HplSam3uGeneralIOC.PioC19; components HplSam3uClockC; LcdP.HSMC4ClockControl -> HplSam3uClockC.HSMC4PPCntl; } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/lcd/LcdP.nc000066400000000000000000000425251207233610700222220ustar00rootroot00000000000000/** * Copyright (c) 2009 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * Heavily inspired by the at91 library. * @author Thomas Schmid **/ #include #include "lcd.h" #include "color.h" #include "font.h" #include "font10x14.h" module LcdP { uses { interface Hx8347; interface HplSam3GeneralIOPin as DB0; interface HplSam3GeneralIOPin as DB1; interface HplSam3GeneralIOPin as DB2; interface HplSam3GeneralIOPin as DB3; interface HplSam3GeneralIOPin as DB4; interface HplSam3GeneralIOPin as DB5; interface HplSam3GeneralIOPin as DB6; interface HplSam3GeneralIOPin as DB7; interface HplSam3GeneralIOPin as DB8; interface HplSam3GeneralIOPin as DB9; interface HplSam3GeneralIOPin as DB10; interface HplSam3GeneralIOPin as DB11; interface HplSam3GeneralIOPin as DB12; interface HplSam3GeneralIOPin as DB13; interface HplSam3GeneralIOPin as DB14; interface HplSam3GeneralIOPin as DB15; interface HplSam3GeneralIOPin as LCD_RS; interface HplSam3GeneralIOPin as NRD; interface HplSam3GeneralIOPin as NWE; interface HplSam3GeneralIOPin as NCS2; interface GeneralIO as Backlight; interface HplSam3PeripheralClockCntl as HSMC4ClockControl; } provides { interface Lcd; interface Draw; } } implementation { #define RGB24ToRGB16(color) (((color >> 8) & 0xF800) | \ ((color >> 5) & 0x7E0) | \ ((color >> 3) & 0x1F)) #define BOARD_LCD_BASE 0x62000000 const Font gFont = {10, 14}; /** * Initializes the LCD controller. * \param pLcdBase LCD base address. */ command void Lcd.initialize(void) { // Enable pins call DB0.disablePioControl(); call DB0.selectPeripheralA(); call DB0.enablePullUpResistor(); call DB1.disablePioControl(); call DB1.selectPeripheralA(); call DB1.enablePullUpResistor(); call DB2.disablePioControl(); call DB2.selectPeripheralA(); call DB2.enablePullUpResistor(); call DB3.disablePioControl(); call DB3.selectPeripheralA(); call DB3.enablePullUpResistor(); call DB4.disablePioControl(); call DB4.selectPeripheralA(); call DB4.enablePullUpResistor(); call DB5.disablePioControl(); call DB5.selectPeripheralA(); call DB5.enablePullUpResistor(); call DB6.disablePioControl(); call DB6.selectPeripheralA(); call DB6.enablePullUpResistor(); call DB7.disablePioControl(); call DB7.selectPeripheralA(); call DB7.enablePullUpResistor(); call DB8.disablePioControl(); call DB8.selectPeripheralA(); call DB8.enablePullUpResistor(); call DB9.disablePioControl(); call DB9.selectPeripheralA(); call DB9.enablePullUpResistor(); call DB10.disablePioControl(); call DB10.selectPeripheralA(); call DB10.enablePullUpResistor(); call DB11.disablePioControl(); call DB11.selectPeripheralA(); call DB11.enablePullUpResistor(); call DB12.disablePioControl(); call DB12.selectPeripheralA(); call DB12.enablePullUpResistor(); call DB13.disablePioControl(); call DB13.selectPeripheralA(); call DB13.enablePullUpResistor(); call DB14.disablePioControl(); call DB14.selectPeripheralA(); call DB14.enablePullUpResistor(); call DB15.disablePioControl(); call DB15.selectPeripheralB(); call DB15.enablePullUpResistor(); call LCD_RS.disablePioControl(); call LCD_RS.selectPeripheralB(); call LCD_RS.enablePullUpResistor(); call NRD.disablePioControl(); call NRD.selectPeripheralA(); call NRD.enablePullUpResistor(); call NWE.disablePioControl(); call NWE.selectPeripheralA(); call NWE.enablePullUpResistor(); call NCS2.disablePioControl(); call NCS2.selectPeripheralA(); call NCS2.enablePullUpResistor(); // Enable peripheral clock call HSMC4ClockControl.enable(); // Enable pins call Backlight.makeOutput(); // EBI SMC Configuration SMC_CS2->setup.flat = 0; SMC_CS2->setup.bits.nwe_setup = 4; SMC_CS2->setup.bits.ncs_wr_setup = 2; SMC_CS2->setup.bits.nrd_setup = 4; SMC_CS2->setup.bits.ncs_rd_setup = 2; SMC_CS2->pulse.flat = 0; SMC_CS2->pulse.bits.nwe_pulse = 5; SMC_CS2->pulse.bits.ncs_wr_pulse = 18; SMC_CS2->pulse.bits.nrd_pulse = 5; SMC_CS2->pulse.bits.ncs_rd_pulse = 18; SMC_CS2->cycle.flat = 0; SMC_CS2->cycle.bits.nwe_cycle = 22; SMC_CS2->cycle.bits.nrd_cycle = 22; SMC_CS2->mode.bits.read_mode = 1; SMC_CS2->mode.bits.write_mode = 1; SMC_CS2->mode.bits.dbw = 1; SMC_CS2->mode.bits.pmen = 0; // Initialize LCD controller (HX8347) call Hx8347.initialize((void *)BOARD_LCD_BASE); } event void Hx8347.initializeDone(error_t err) { if(err == SUCCESS) call Lcd.setBacklight(25); signal Lcd.initializeDone(err); } /** * Turn on the LCD */ command void Lcd.start(void) { call Hx8347.on((void *)BOARD_LCD_BASE); } event void Hx8347.onDone() { signal Lcd.startDone(); } /** * Turn off the LCD */ command void Lcd.stop(void) { call Hx8347.off((void *)BOARD_LCD_BASE); } /** * Set the backlight of the LCD. * \param level Backlight brightness level [1..32], 32 is maximum level. */ command void Lcd.setBacklight (uint8_t level) { uint32_t i; // Switch off backlight call Backlight.clr(); i = 800 * (48000000 / 1000000); // wait for at least 500us while(i--); // Set new backlight level for (i = 0; i < level; i++) { call Backlight.clr(); call Backlight.clr(); call Backlight.clr(); call Backlight.set(); call Backlight.set(); call Backlight.set(); } } command void* Lcd.displayBuffer(void* pBuffer) { return (void *) BOARD_LCD_BASE; } /** * Fills the given LCD buffer with a particular color. * Only works in 24-bits packed mode for now. * \param color Fill color. */ async command void Draw.fill(uint32_t color) { uint32_t i; unsigned short color16 = RGB24ToRGB16(color); call Hx8347.setCursor((void *)BOARD_LCD_BASE, 0, 0); call Hx8347.writeRAM_Prepare((void *)BOARD_LCD_BASE); for (i = 0; i < (BOARD_LCD_WIDTH * BOARD_LCD_HEIGHT); i++) { call Hx8347.writeRAM((void *)BOARD_LCD_BASE, color16); } } /** * Sets the specified pixel to the given color. * !!! Only works in 24-bits packed mode for now. !!! * \param x X-coordinate of pixel. * \param y Y-coordinate of pixel. * \param color Pixel color. */ async command void Draw.drawPixel( uint32_t x, uint32_t y, uint32_t color) { unsigned short color16 = RGB24ToRGB16(color); void* pBuffer = (void*)BOARD_LCD_BASE; call Hx8347.setCursor(pBuffer, x, y); call Hx8347.writeRAM_Prepare(pBuffer); call Hx8347.writeRAM(pBuffer, color16); } /** * Draws a rectangle inside a LCD buffer, at the given coordinates. * \param x X-coordinate of upper-left rectangle corner. * \param y Y-coordinate of upper-left rectangle corner. * \param width Rectangle width in pixels. * \param height Rectangle height in pixels. * \param color Rectangle color. */ async command void Draw.drawRectangle( uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t color) { uint32_t rx, ry; for (ry=0; ry < height; ry++) { for (rx=0; rx < width; rx++) { call Draw.drawPixel(x+rx, y+ry, color); } } } /** * Draws a string inside a LCD buffer, at the given coordinates. Line breaks * will be honored. * \param x X-coordinate of string top-left corner. * \param y Y-coordinate of string top-left corner. * \param pString String to display. * \param color String color. */ async command void Draw.drawString( uint32_t x, uint32_t y, const char *pString, uint32_t color) { uint32_t xorg = x; while (*pString != 0) { if (*pString == '\n') { y += gFont.height + 2; x = xorg; } else { call Draw.drawChar(x, y, *pString, color); x += gFont.width + 2; } pString++; } } /** * Draws a string inside a LCD buffer, at the given coordinates. Line breaks * will be honored. * \param x X-coordinate of string top-left corner. * \param y Y-coordinate of string top-left corner. * \param pString String to display. * \param color String color. */ async command void Draw.drawStringWithBGColor( uint32_t x, uint32_t y, const char *pString, uint32_t fontColor, uint32_t bgColor) { uint32_t xorg = x; while (*pString != 0) { if (*pString == '\n') { y += gFont.height + 2; x = xorg; } else { call Draw.drawCharWithBGColor(x, y, *pString, fontColor, bgColor); x += gFont.width + 2; } pString++; } } /** * Draws an integer inside the LCD buffer * \param x X-Coordinate of the integers top-right corner. * \param y Y-Coordinate of the integers top-right corner. * \param n Number to be printed on the screen * \param sign <0 if negative number, >=0 if positive * \param fontColor Integer color. */ async command void Draw.drawInt( uint32_t x, uint32_t y, uint32_t n, int8_t sign, uint32_t fontColor) { uint8_t i; i = 0; do { /* generate digits in reverse order */ char c = n % 10 + '0'; /* get next digit */ if (i%3 == 0 && i>0) { call Draw.drawChar(x, y, '\'', fontColor); x -= (gFont.width + 2); } call Draw.drawChar(x, y, c, fontColor); x -= (gFont.width + 2); i++; } while ((n /= 10) > 0); /* delete it */ if (sign < 0) call Draw.drawChar(x, y, '-', fontColor); } /** * Draws an integer inside the LCD buffer * \param x X-Coordinate of the integers top-right corner. * \param y Y-Coordinate of the integers top-right corner. * \param n Number to be printed on the screen * \param sign <0 if negative number, >=0 if positive * \param color Integer color. * \param bgColor Color of the background. */ async command void Draw.drawIntWithBGColor( uint32_t x, uint32_t y, uint32_t n, int8_t sign, uint32_t fontColor, uint32_t bgColor) { uint8_t i; i = 0; do { /* generate digits in reverse order */ char c = n % 10 + '0'; /* get next digit */ if (i%3 == 0 && i>0) { call Draw.drawChar(x, y, '\'', fontColor); x -= (gFont.width + 2); } call Draw.drawCharWithBGColor(x, y, c, fontColor, bgColor); x -= (gFont.width + 2); i++; } while ((n /= 10) > 0); /* delete it */ if (sign < 0) call Draw.drawCharWithBGColor(x, y, '-', fontColor, bgColor); } /** * Returns the width & height in pixels that a string will occupy on the screen * if drawn using Draw.drawString. * \param pString String. * \param pWidth Pointer for storing the string width (optional). * \param pHeight Pointer for storing the string height (optional). * \return String width in pixels. */ async command void Draw.getStringSize( const char *pString, uint32_t *pWidth, uint32_t *pHeight) { uint32_t width = 0; uint32_t height = gFont.height; while (*pString != 0) { if (*pString == '\n') { height += gFont.height + 2; } else { width += gFont.width + 2; } pString++; } if (width > 0) width -= 2; if (pWidth) *pWidth = width; if (pHeight) *pHeight = height; } /** * Draws an ASCII character on the given LCD buffer. * \param x X-coordinate of character upper-left corner. * \param y Y-coordinate of character upper-left corner. * \param c Character to output. * \param color Character color. */ async command void Draw.drawChar( uint32_t x, uint32_t y, char c, uint32_t color) { uint32_t row, col; if(!((c >= 0x20) && (c <= 0x7F))) { return; } for (col = 0; col < 10; col++) { for (row = 0; row < 8; row++) { if ((pCharset10x14[((c - 0x20) * 20) + col * 2] >> (7 - row)) & 0x1) { call Draw.drawPixel(x+col, y+row, color); } } for (row = 0; row < 6; row++) { if ((pCharset10x14[((c - 0x20) * 20) + col * 2 + 1] >> (7 - row)) & 0x1) { call Draw.drawPixel(x+col, y+row+8, color); } } } } /** * Draws an ASCII character on the given LCD buffer. * \param x X-coordinate of character upper-left corner. * \param y Y-coordinate of character upper-left corner. * \param c Character to output. * \param fontColor Character foreground color. * \param bgColor Background color of character */ async command void Draw.drawCharWithBGColor( uint32_t x, uint32_t y, char c, uint32_t fontColor, uint32_t bgColor) { uint32_t row, col; if(!((c >= 0x20) && (c <= 0x7F))) { return; } for (col = 0; col < 10; col++) { for (row = 0; row < 8; row++) { if ((pCharset10x14[((c - 0x20) * 20) + col * 2] >> (7 - row)) & 0x1) { call Draw.drawPixel(x+col, y+row, fontColor); } else { call Draw.drawPixel(x+col, y+row, bgColor); } } for (row = 0; row < 6; row++) { if ((pCharset10x14[((c - 0x20) * 20) + col * 2 + 1] >> (7 - row)) & 0x1) { call Draw.drawPixel(x+col, y+row+8, fontColor); } else { call Draw.drawPixel(x+col, y+row+8, bgColor); } } } } } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/lcd/color.h000066400000000000000000000066251207233610700223460ustar00rootroot00000000000000/* * Copyright (c) Atmel * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef COLOR_H #define COLOR_H //------------------------------------------------------------------------------ /// RGB 24 Bpp /// RGB 888 /// R7R6R5R4 R3R2R1R0 G7G6G5G4 G3G2G1G0 B7B6B5B4 B3B2B1B0 //------------------------------------------------------------------------------ #define COLOR_BLACK 0x000000 #define COLOR_WHITE 0xFFFFFF #define COLOR_BLUE 0x0000FF #define COLOR_GREEN 0x00FF00 #define COLOR_RED 0xFF0000 #define COLOR_NAVY 0x000080 #define COLOR_DARKBLUE 0x00008B #define COLOR_DARKGREEN 0x006400 #define COLOR_DARKCYAN 0x008B8B #define COLOR_CYAN 0x00FFFF #define COLOR_TURQUOISE 0x40E0D0 #define COLOR_INDIGO 0x4B0082 #define COLOR_DARKRED 0x800000 #define COLOR_OLIVE 0x808000 #define COLOR_GRAY 0x808080 #define COLOR_SKYBLUE 0x87CEEB #define COLOR_BLUEVIOLET 0x8A2BE2 #define COLOR_LIGHTGREEN 0x90EE90 #define COLOR_DARKVIOLET 0x9400D3 #define COLOR_YELLOWGREEN 0x9ACD32 #define COLOR_BROWN 0xA52A2A #define COLOR_DARKGRAY 0xA9A9A9 #define COLOR_SIENNA 0xA0522D #define COLOR_LIGHTBLUE 0xADD8E6 #define COLOR_GREENYELLOW 0xADFF2F #define COLOR_SILVER 0xC0C0C0 #define COLOR_LIGHTGREY 0xD3D3D3 #define COLOR_LIGHTCYAN 0xE0FFFF #define COLOR_VIOLET 0xEE82EE #define COLOR_AZUR 0xF0FFFF #define COLOR_BEIGE 0xF5F5DC #define COLOR_MAGENTA 0xFF00FF #define COLOR_TOMATO 0xFF6347 #define COLOR_GOLD 0xFFD700 #define COLOR_ORANGE 0xFFA500 #define COLOR_SNOW 0xFFFAFA #define COLOR_YELLOW 0xFFFF00 #endif // #define COLOR_H tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/lcd/font.h000066400000000000000000000040371207233610700221710ustar00rootroot00000000000000/* * Copyright (c) Atmel * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef FONT_H #define FONT_H //------------------------------------------------------------------------------ /// Describes the font (width, height, supported characters, etc.) used by /// the LCD driver draw API. //------------------------------------------------------------------------------ typedef struct _Font { /// Font width in pixels. unsigned char width; /// Font height in pixels. unsigned char height; } Font; #endif //#ifndef FONT_H tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/lcd/font10x14.h000066400000000000000000000330151207233610700226650ustar00rootroot00000000000000/* * Copyright (c) Atmel * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef LCD_FONT_10x14_H #define LCD_FONT_10x14_H //------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------ const unsigned char pCharset10x14[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xCC, 0xFF, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xC0, 0x0C, 0xC0, 0xFF, 0xFC, 0xFF, 0xFC, 0x0C, 0xC0, 0x0C, 0xC0, 0xFF, 0xFC, 0xFF, 0xFC, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0x60, 0x1E, 0x70, 0x3F, 0x30, 0x33, 0x30, 0xFF, 0xFC, 0xFF, 0xFC, 0x33, 0x30, 0x33, 0xF0, 0x39, 0xE0, 0x18, 0xC0, 0x60, 0x00, 0xF0, 0x0C, 0xF0, 0x3C, 0x60, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x18, 0xF0, 0x3C, 0xC0, 0x3C, 0x00, 0x18, 0x3C, 0xF0, 0x7F, 0xF8, 0xC3, 0x1C, 0xC7, 0x8C, 0xCF, 0xCC, 0xDC, 0xEC, 0x78, 0x78, 0x30, 0x30, 0x00, 0xFC, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0xEC, 0x00, 0xF8, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x3F, 0xF0, 0x78, 0x78, 0x60, 0x18, 0xC0, 0x0C, 0xC0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0C, 0xC0, 0x0C, 0x60, 0x18, 0x78, 0x78, 0x3F, 0xF0, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x60, 0x0E, 0xE0, 0x07, 0xC0, 0x03, 0x80, 0x3F, 0xF8, 0x3F, 0xF8, 0x03, 0x80, 0x07, 0xC0, 0x0E, 0xE0, 0x0C, 0x60, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x3F, 0xF0, 0x3F, 0xF0, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x44, 0x00, 0xEC, 0x00, 0xF8, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x7F, 0xF8, 0xE0, 0xFC, 0xC1, 0xCC, 0xC3, 0x8C, 0xC7, 0x0C, 0xCE, 0x0C, 0xFC, 0x1C, 0x7F, 0xF8, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0C, 0x70, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0C, 0x70, 0x1C, 0xE0, 0x3C, 0xC0, 0x7C, 0xC0, 0xEC, 0xC1, 0xCC, 0xC3, 0x8C, 0xE7, 0x0C, 0x7E, 0x0C, 0x3C, 0x0C, 0x30, 0x30, 0x70, 0x38, 0xE0, 0x1C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xE3, 0x1C, 0x7F, 0xF8, 0x3C, 0xF0, 0x03, 0xC0, 0x07, 0xC0, 0x0E, 0xC0, 0x1C, 0xC0, 0x38, 0xC0, 0x70, 0xC0, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0xC0, 0x00, 0xC0, 0xFC, 0x30, 0xFC, 0x38, 0xCC, 0x1C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCE, 0x1C, 0xC7, 0xF8, 0xC3, 0xF0, 0x3F, 0xF0, 0x7F, 0xF8, 0xE3, 0x1C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xE3, 0x9C, 0x71, 0xF8, 0x30, 0xF0, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC3, 0xFC, 0xC7, 0xFC, 0xCE, 0x00, 0xDC, 0x00, 0xF8, 0x00, 0xF0, 0x00, 0x3C, 0xF0, 0x7F, 0xF8, 0xE7, 0x9C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xE7, 0x9C, 0x7F, 0xF8, 0x3C, 0xF0, 0x3C, 0x00, 0x7E, 0x00, 0xE7, 0x0C, 0xC3, 0x0C, 0xC3, 0x1C, 0xC3, 0x38, 0xC3, 0x70, 0xE7, 0xE0, 0x7F, 0xC0, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x60, 0x3C, 0xF0, 0x3C, 0xF0, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x44, 0x3C, 0xEC, 0x3C, 0xF8, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x80, 0x0F, 0xC0, 0x1C, 0xE0, 0x38, 0x70, 0x70, 0x38, 0xE0, 0x1C, 0xC0, 0x0C, 0x00, 0x00, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x00, 0x00, 0xC0, 0x0C, 0xE0, 0x1C, 0x70, 0x38, 0x38, 0x70, 0x1C, 0xE0, 0x0F, 0xC0, 0x07, 0x80, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0xC1, 0xEC, 0xC3, 0xEC, 0xC3, 0x00, 0xE6, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x30, 0xF0, 0x71, 0xF8, 0xE3, 0x9C, 0xC3, 0x0C, 0xC3, 0xFC, 0xC3, 0xFC, 0xC0, 0x0C, 0xE0, 0x1C, 0x7F, 0xF8, 0x3F, 0xF0, 0x3F, 0xFC, 0x7F, 0xFC, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0xC0, 0x7F, 0xFC, 0x3F, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xE7, 0x9C, 0x7F, 0xF8, 0x3C, 0xF0, 0x3F, 0xF0, 0x7F, 0xF8, 0xE0, 0x1C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xE0, 0x1C, 0x70, 0x38, 0x30, 0x30, 0xFF, 0xFC, 0xFF, 0xFC, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xE0, 0x1C, 0x7F, 0xF8, 0x3F, 0xF0, 0xFF, 0xFC, 0xFF, 0xFC, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x3F, 0xF0, 0x7F, 0xF8, 0xE0, 0x1C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xE3, 0x1C, 0x73, 0xF8, 0x33, 0xF0, 0xFF, 0xFC, 0xFF, 0xFC, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0C, 0xC0, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0xC0, 0x0C, 0xC0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x38, 0xC0, 0x1C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x1C, 0xFF, 0xF8, 0xFF, 0xF0, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0x07, 0x80, 0x07, 0x80, 0x0F, 0xC0, 0x1C, 0xE0, 0x38, 0x70, 0x70, 0x38, 0xE0, 0x1C, 0xC0, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0x70, 0x00, 0x38, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x38, 0x00, 0x70, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0xFF, 0xFC, 0xFF, 0xFC, 0x3F, 0xF0, 0x7F, 0xF8, 0xE0, 0x1C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xE0, 0x1C, 0x7F, 0xF8, 0x3F, 0xF0, 0xFF, 0xFC, 0xFF, 0xFC, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xE7, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x3F, 0xF0, 0x7F, 0xF8, 0xE0, 0x1C, 0xC0, 0x0C, 0xC0, 0xCC, 0xC0, 0xEC, 0xC0, 0x7C, 0xE0, 0x38, 0x7F, 0xFC, 0x3F, 0xEC, 0xFF, 0xFC, 0xFF, 0xFC, 0xC3, 0x00, 0xC3, 0x80, 0xC3, 0x80, 0xC3, 0xC0, 0xC3, 0xC0, 0xE7, 0x70, 0x7E, 0x3C, 0x3C, 0x1C, 0x3C, 0x18, 0x7E, 0x1C, 0xE7, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x9C, 0xE1, 0xF8, 0x60, 0xF0, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0xF0, 0xFF, 0xF8, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x1C, 0xFF, 0xF8, 0xFF, 0xF0, 0xFF, 0xC0, 0xFF, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0xFF, 0xE0, 0xFF, 0xC0, 0xFF, 0xF0, 0xFF, 0xF8, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x1C, 0xFF, 0xF8, 0xFF, 0xF0, 0xF0, 0x3C, 0xF8, 0x7C, 0x1C, 0xE0, 0x0F, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x0F, 0xC0, 0x1C, 0xE0, 0xF8, 0x7C, 0xF0, 0x3C, 0xFC, 0x00, 0xFE, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xFC, 0x01, 0xFC, 0x03, 0x80, 0x07, 0x00, 0xFE, 0x00, 0xFC, 0x00, 0xC0, 0x3C, 0xC0, 0x7C, 0xC0, 0xEC, 0xC1, 0xCC, 0xC3, 0x8C, 0xC7, 0x0C, 0xCE, 0x0C, 0xDC, 0x0C, 0xF8, 0x0C, 0xF0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x78, 0x0E, 0xFC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0E, 0xCC, 0x07, 0xFC, 0x03, 0xF8, 0xFF, 0xFC, 0xFF, 0xFC, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x9C, 0x01, 0xF8, 0x00, 0xF0, 0x03, 0xF0, 0x07, 0xF8, 0x0E, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0x30, 0x00, 0xF0, 0x01, 0xF8, 0x03, 0x9C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0x03, 0xF0, 0x07, 0xF8, 0x0E, 0xDC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0E, 0xDC, 0x07, 0xD8, 0x03, 0x90, 0x00, 0x00, 0x03, 0x00, 0x3F, 0xFC, 0x7F, 0xFC, 0xE3, 0x00, 0xE3, 0x00, 0x70, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x07, 0x9C, 0x0F, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xDC, 0x0F, 0xF8, 0x07, 0xF0, 0xFF, 0xFC, 0xFF, 0xFC, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x80, 0x01, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFC, 0x1B, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x1C, 0xCF, 0xF8, 0xCF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0xE0, 0x01, 0xE0, 0x03, 0xF0, 0x07, 0x38, 0x0E, 0x1C, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0C, 0xC0, 0x0C, 0xFF, 0xFC, 0xFF, 0xFC, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x0F, 0xFC, 0x0E, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x03, 0xC0, 0x07, 0x00, 0x0E, 0x00, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x03, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x07, 0xFC, 0x03, 0xFC, 0x03, 0xF0, 0x07, 0xF8, 0x0E, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0E, 0x1C, 0x07, 0xF8, 0x03, 0xF0, 0x0F, 0xFC, 0x0F, 0xFC, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0F, 0xC0, 0x07, 0x80, 0x03, 0x00, 0x03, 0x00, 0x07, 0x80, 0x0F, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x00, 0x03, 0x18, 0x07, 0x9C, 0x0F, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xFC, 0x0E, 0x78, 0x06, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFF, 0xF0, 0xFF, 0xF8, 0x0C, 0x1C, 0x0C, 0x1C, 0x0C, 0x38, 0x0C, 0x30, 0x00, 0x00, 0x0F, 0xF0, 0x0F, 0xF8, 0x00, 0x1C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x1C, 0x0F, 0xF8, 0x0F, 0xF0, 0x0F, 0xC0, 0x0F, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x0F, 0xE0, 0x0F, 0xC0, 0x0F, 0xF0, 0x0F, 0xF8, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x1C, 0x00, 0x1C, 0x0F, 0xF8, 0x0F, 0xF0, 0x0C, 0x0C, 0x0E, 0x1C, 0x07, 0x38, 0x03, 0xF0, 0x01, 0xE0, 0x01, 0xE0, 0x03, 0xF0, 0x07, 0x38, 0x0E, 0x1C, 0x0C, 0x0C, 0x0C, 0x00, 0x0E, 0x00, 0x07, 0x0C, 0x03, 0x9C, 0x01, 0xF8, 0x01, 0xF0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x0C, 0x0C, 0x0C, 0x1C, 0x0C, 0x3C, 0x0C, 0x7C, 0x0C, 0xEC, 0x0D, 0xCC, 0x0F, 0x8C, 0x0F, 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x07, 0x80, 0x3F, 0xF0, 0x7C, 0xF8, 0xE0, 0x1C, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0x00, 0x00, 0x03, 0x0C, 0x03, 0x0C, 0x3F, 0xFC, 0x7F, 0xFC, 0xE3, 0x0C, 0xC3, 0x0C, 0xC0, 0x0C, 0xE0, 0x0C, 0x70, 0x0C, 0x30, 0x0C, 0x00, 0x00, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0xE0, 0x1C, 0x7C, 0xF8, 0x3F, 0xF0, 0x07, 0x80, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC }; #endif // #ifdef _LCD_FONT_10x14_h tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/lcd/lcd.h000066400000000000000000000032451207233610700217650ustar00rootroot00000000000000/* * Copyright (c) 2011 University of Utah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef _LCD_H #define _LCD_H #define BOARD_LCD_HEIGHT 320 #define BOARD_LCD_WIDTH 240 #endif //_LCD_H tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/platform.h000066400000000000000000000002151207233610700222770ustar00rootroot00000000000000/* No platform_bootstrap() needed, * since memory system doesn't need configuration and * the processor mode neither. * (see TEP 107) */ tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/platform_message.h000066400000000000000000000036241207233610700240120ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Wanja Hofer */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include "Serial.h" typedef union message_header { serial_header_t serial; } message_header_t; typedef union message_footer { } message_footer_t; typedef union message_metadata { serial_metadata_t serial; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/sam3u-ek-flash-mp.x000066400000000000000000000137601207233610700236360ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Linker script to run code in Flash 0. * Variant that aligns and collects symbols for memory protection. * Start-up code copies data into SRAM 0 and zeroes BSS segment. * * @author Wanja Hofer */ /* Output format is always little endian, irrespective of -EL or -EB flags */ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /* Output architecture is ARM */ OUTPUT_ARCH(arm) /* The first program instruction is the __init() start-up code */ ENTRY(__init) /* The IRQ vector table is put at the beginning of SRAM 0 */ /* We reserve 0x100 bytes by setting the SRAM 0 base address below accordingly */ _vect_start = 0x20000000; /* Stack at the end of SRAM 0 */ _estack = 0x20007ffc; /* We have the SAM3U4E with 2 x 128K Flash and 48K SRAM. * SRAM is 32K SRAM 0 and 16K SRAM 1. * Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 2, p. 28, p. 29 */ MEMORY { sram0 (W!RX) : org = 0x20000100, len = 0x07f00 /* SRAM 0, 32K (- 0x100 vector table) */ sram1 (W!RX) : org = 0x20080000, len = 0x04000 /* SRAM 1, 16K */ flash0 (W!RX) : org = 0x00080000, len = 0x20000 /* Flash 0, 128K */ flash1 (W!RX) : org = 0x00100000, len = 0x20000 /* Flash 1, 128K */ } SECTIONS { /* Text is linked into Flash 0 */ .text : { . = ALIGN(4); _stext = .; KEEP(*(.vectors)) . = ALIGN(0x400); _stextcommon = .; *(.textcommon*) . = ALIGN(0x400); _etextcommon = .; . = ALIGN(0x200); _stextthread0 = .; *(.text.ThreadInfoP$0$run_thread) /* this will collect the definition of the thread's run() event in the app component */ *(.text.*$Thread0$run) *(.text.TestJoinC$NullThread$run) *(.text.BlinkC$NullThread$run) . = ALIGN(0x200); _etextthread0 = .; . = ALIGN(0x200); _stextthread1 = .; *(.text.ThreadInfoP$1$run_thread) /* this will collect the definition of the thread's run() event in the app component */ *(.text.*$Thread1$run) *(.text.TestJoinC$TinyThread0$run) *(.text.BlinkC$TinyThread0$run) . = ALIGN(0x200); _etextthread1 = .; . = ALIGN(0x200); _stextthread2 = .; *(.text.ThreadInfoP$2$run_thread) /* this will collect the definition of the thread's run() event in the app component */ *(.text.*$Thread2$run) *(.text.TestJoinC$TinyThread1$run) *(.text.BlinkC$TinyThread1$run) . = ALIGN(0x200); _etextthread2 = .; . = ALIGN(0x200); _stextthread3 = .; *(.text.ThreadInfoP$3$run_thread) /* this will collect the definition of the thread's run() event in the app component */ *(.text.*$Thread3$run) *(.text.TestJoinC$TinyThread2$run) *(.text.BlinkC$TinyThread2$run) . = ALIGN(0x200); _etextthread3 = .; *(.text*) *(.rodata*) *(.glue_7) /* ARM/Thumb interworking code */ *(.glue_7t) /* ARM/Thumb interworking code */ . = ALIGN(4); _etext = .; } > flash0 /* Data will be loaded into RAM by start-up code */ .data : AT (_etext) { . = ALIGN(4); _sdata = .; . = ALIGN(0x200); _sdatathread0 = .; *(.datathread0*) . = ALIGN(0x200); _edatathread0 = .; . = ALIGN(0x200); _sdatathread1 = .; *(.datathread1*) . = ALIGN(0x200); _edatathread1 = .; . = ALIGN(0x200); _sdatathread2 = .; *(.datathread2*) . = ALIGN(0x200); _edatathread2 = .; . = ALIGN(0x200); _sdatathread3 = .; *(.datathread3*) . = ALIGN(0x200); _edatathread3 = .; *(.ramfunc) /* functions linked into RAM */ *(.data.*) *(.data) . = ALIGN(4); _edata = .; } > sram0 /* BSS will be zeroed by start-up code */ .bss (NOLOAD) : { . = ALIGN(4); _sbss = .; . = ALIGN(0x1000); _sbssthread0 = .; *(.bss.ThreadInfoP$0$stack) *(.bss.ThreadInfoP$0$thread_info) *(.bssthread0*) . = ALIGN(0x1000); _ebssthread0 = .; . = ALIGN(0x1000); _sbssthread1 = .; *(.bss.ThreadInfoP$1$stack) *(.bss.ThreadInfoP$1$thread_info) *(.bssthread1*) . = ALIGN(0x1000); _ebssthread1 = .; . = ALIGN(0x1000); _sbssthread2 = .; *(.bss.ThreadInfoP$2$stack) *(.bss.ThreadInfoP$2$thread_info) *(.bssthread2*) . = ALIGN(0x1000); _ebssthread2 = .; . = ALIGN(0x1000); _sbssthread3 = .; *(.bss.ThreadInfoP$3$stack) *(.bss.ThreadInfoP$3$thread_info) *(.bssthread3*) . = ALIGN(0x1000); _ebssthread3 = .; *(.bss.*) *(.bss) . = ALIGN(4); } > sram0 /* _ebss should be inside .bss, but for some reason, it then is not defined * at the end of the BSS section. This leads to non-zeroed BSS data, since the * start-up code uses that symbol. For now, this workaround is OK and does no * harm. */ _ebss = .; } tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/sam3u-ek-flash.x000066400000000000000000000075701207233610700232260ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Linker script to run code in Flash 0. * Start-up code copies data into SRAM 0 and zeroes BSS segment. * * @author Wanja Hofer * @author Thomas Schmid */ /* Output format is always little endian, irrespective of -EL or -EB flags */ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /* Output architecture is ARM */ OUTPUT_ARCH(arm) /* The first program instruction is the __init() start-up code */ ENTRY(__init) /* The IRQ vector table is put at the beginning of SRAM 0 */ /* We reserve 0x100 bytes by setting the SRAM 0 base address below accordingly */ _vect_start = 0x20000000; /* Stack at the end of SRAM 0 */ _estack = 0x20007ffc; /* Don't relocate the vector table */ /*PROVIDE (__relocate_vector = 0);*/ /* We have the SAM3U4E with 2 x 128K Flash and 48K SRAM. * SRAM is 32K SRAM 0 and 16K SRAM 1. * Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 2, p. 28, p. 29 */ MEMORY { sram0 (W!RX) : org = 0x20000000, len = 0x08000 /* SRAM 0, 32K (- 0x100 vector table) */ sram1 (W!RX) : org = 0x20080000, len = 0x04000 /* SRAM 1, 16K */ flash0 (W!RX) : org = 0x00080000, len = 0x20000 /* Flash 0, 128K */ flash1 (W!RX) : org = 0x00100000, len = 0x20000 /* Flash 1, 128K */ } SECTIONS { /* Text is linked into Flash 0 */ .text : { . = ALIGN(4); _stext = .; /* KEEP(*(.boot*)) */ KEEP(*(.vectors)) *(.init*) *(.text*) *(.fini*) *(.rodata*) *(.glue_7) /* ARM/Thumb interworking code */ *(.glue_7t) /* ARM/Thumb interworking code */ . = ALIGN(4); _etext = .; } > flash0 /* Data will be loaded into RAM by start-up code */ .data : AT (_etext) { . = ALIGN(4); _sdata = .; _svect = .; KEEP(*(.vectors)) /* Interrupt vector table in first 204 bytes */ _evect = .; *(.ramfunc) /* functions linked into RAM */ *(.data.*) *(.data) . = ALIGN(4); _edata = .; } > sram0 /* BSS will be zeroed by start-up code */ .bss (NOLOAD) : { . = ALIGN(4); _sbss = .; *(.bss.*) *(.bss) . = ALIGN(4); } > sram0 /* _ebss should be inside .bss, but for some reason, it then is not defined * at the end of the BSS section. This leads to non-zeroed BSS data, since the * start-up code uses that symbol. For now, this workaround is OK and does no * harm. */ _ebss = .; } end = .; tinyos-2.1.2+dfsg/tos/platforms/sam3u_ek/vectors.c000066400000000000000000000232201207233610700221340ustar00rootroot00000000000000/* * Copyright (c) 2009 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Startup code and interrupt and trap handlers for the SAM3U-EK board. * * @author Wanja Hofer */ /* Section symbols defined in linker script * sam3u-ek-flash.x */ extern unsigned int _stext; extern unsigned int _etext; extern unsigned int _sdata; extern unsigned int _edata; extern unsigned int _svect; extern unsigned int _evect; extern unsigned int _sbss; extern unsigned int _ebss; extern unsigned int _estack; extern unsigned int __relocate_vector; /* main() symbol defined in RealMainP */ int main(); /* Start-up code called upon reset. * Definition see below. */ void __init(); /* Default handler for any IRQ or fault */ void DefaultHandler() { // do nothing, just return } /* Default Hardfault Handler */ void DefaultHardFaultHandler() { while(1) {} } /* Default Mpu Fault Handler */ void DefaultMpuFaultHandler() { while(1) {} } /* Default Bus Fault Handler */ void DefaultBusFaultHandler() { while(1) {} } /* Default Usage Fault Handler */ void DefaultUsageFaultHandler() { while(1) {} } /* By default, every exception and IRQ is handled by the default handler. * * If OWN_FUNCTIONS_FOR_HANDLERS is defined, then the internal IRQ and fault * handlers will get a function of their own for debug purposes. Those * functions are provided by weak aliases; thus, a regular handler * definition will override this. */ #define OWN_FUNCTION_FOR_HANDLERS #ifdef OWN_FUNCTION_FOR_HANDLERS void NmiHandler() __attribute__((weak)); void MpuFaultHandler() __attribute__((weak)); void BusFaultHandler() __attribute__((weak)); void UsageFaultHandler() __attribute__((weak)); void SVCallHandler() __attribute__((weak)); void DebugHandler() __attribute__((weak)); void PendSVHandler() __attribute__((weak)); void SysTickHandler() __attribute__((weak)); void NmiHandler() { while(1) {} } void MpuFaultHandler() { while(1) {} } void BusFaultHandler() { while(1) {} } void UsageFaultHandler() { while(1) {} } void SVCallHandler() { while(1) {} } void DebugHandler() { while(1) {} } void PendSVHandler() { while(1) {} } void SysTickHandler() { while(1) {} } #else void NmiHandler() __attribute__((weak, alias("DefaultHandler"))); void MpuFaultHandler() __attribute__((weak, alias("DefaultHandler"))); void BusFaultHandler() __attribute__((weak, alias("DefaultHandler"))); void UsageFaultHandler() __attribute__((weak, alias("DefaultHandler"))); void SVCallHandler() __attribute__((weak, alias("DefaultHandler"))); void DebugHandler() __attribute__((weak, alias("DefaultHandler"))); void PendSVHandler() __attribute__((weak, alias("DefaultHandler"))); void SysTickHandler() __attribute__((weak, alias("DefaultHandler"))); #endif void HardFaultHandler() __attribute__((weak, alias("DefaultHardFaultHandler"))); void SupcIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void RstcIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void RtcIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void RttIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void WdtIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void PmcIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void Eefc0IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void Eefc1IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void UartIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void SmcIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void PioAIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void PioBIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void PioCIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void Usart0IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void Usart1IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void Usart2IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void Usart3IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void HsmciIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void Twi0IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void Twi1IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void SpiIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void SscIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void TC0IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void TC1IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void TC2IrqHandler() __attribute__((weak, alias("DefaultHandler"))); void PwmIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void Adc12BIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void AdcIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void DmacIrqHandler() __attribute__((weak, alias("DefaultHandler"))); void UdphsIrqHandler() __attribute__((weak, alias("DefaultHandler"))); /* Stick at the top of the .text section in final binary so we can always * jump back to the init routine at the top of the stack if we want */ __attribute__((section(".boot"))) unsigned int *__boot[] = { &_estack, (unsigned int *) __init, }; __attribute__((section(".vectors"))) unsigned int *__vectors[] = { // Defined by Cortex-M3 // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 78 // See also The Definitive Guide to the ARM Cortex-M3, p. 331 &_estack, (unsigned int *) __init, (unsigned int *) NmiHandler, (unsigned int *) HardFaultHandler, (unsigned int *) MpuFaultHandler, (unsigned int *) BusFaultHandler, (unsigned int *) UsageFaultHandler, (unsigned int *) 0, // Reserved (unsigned int *) 0, // Reserved (unsigned int *) 0, // Reserved (unsigned int *) 0, // Reserved (unsigned int *) SVCallHandler, (unsigned int *) DebugHandler, (unsigned int *) 0, // Reserved (unsigned int *) PendSVHandler, (unsigned int *) SysTickHandler, // Defined by SAM3U MCU // Defined in AT91 ARM Cortex-M3 based Microcontrollers, SAM3U Series, Preliminary, p. 41 (unsigned int *) SupcIrqHandler, (unsigned int *) RstcIrqHandler, (unsigned int *) RtcIrqHandler, (unsigned int *) RttIrqHandler, (unsigned int *) WdtIrqHandler, (unsigned int *) PmcIrqHandler, (unsigned int *) Eefc0IrqHandler, (unsigned int *) Eefc1IrqHandler, (unsigned int *) UartIrqHandler, (unsigned int *) SmcIrqHandler, (unsigned int *) PioAIrqHandler, (unsigned int *) PioBIrqHandler, (unsigned int *) PioCIrqHandler, (unsigned int *) Usart0IrqHandler, (unsigned int *) Usart1IrqHandler, (unsigned int *) Usart2IrqHandler, (unsigned int *) Usart3IrqHandler, (unsigned int *) HsmciIrqHandler, (unsigned int *) Twi0IrqHandler, (unsigned int *) Twi1IrqHandler, (unsigned int *) SpiIrqHandler, (unsigned int *) SscIrqHandler, (unsigned int *) TC0IrqHandler, (unsigned int *) TC1IrqHandler, (unsigned int *) TC2IrqHandler, (unsigned int *) PwmIrqHandler, (unsigned int *) Adc12BIrqHandler, (unsigned int *) AdcIrqHandler, (unsigned int *) DmacIrqHandler, (unsigned int *) UdphsIrqHandler }; /* Start-up code to copy data into RAM * and zero BSS segment * and call main() * and "exit" */ void __init() { unsigned int *from; unsigned int *to; unsigned int *i; volatile unsigned int *NVIC_VTOFFR = (volatile unsigned int *) 0xe000ed08; if(0 && __relocate_vector) { // Configure location of IRQ vector table // Vector table is in the beginning of text segment / Flash 0 i = (unsigned int *) &_svect; *NVIC_VTOFFR = (unsigned int) i; // Set TBLBASE bit since vector table located in SRAM *NVIC_VTOFFR |= (1 << 29); } // Copy pre-initialized data into RAM. // Data lies in Flash after the text segment (_etext), // but is linked to be at _sdata. // Thus, we have to copy it to that place in RAM. from = &_etext; to = &_sdata; while (to < &_edata) { *to = *from; to++; from++; } // Fill BSS data with 0 i = &_sbss; while (i < &_ebss) { *i = 0; i++; } /* // Configure location of IRQ vector table // Vector table is in the beginning of text segment / Flash 0 i = (unsigned int *) &_stext; // TBLBASE bit is automatically 0 -> table in code space *NVIC_VTOFFR = (unsigned int) i; */ // Call main() main(); // "Exit" while (1); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/000077500000000000000000000000001207233610700202415ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/.platform000066400000000000000000000042231207233610700220670ustar00rootroot00000000000000# SHIMMER - platform includes # Konrad Lorincz 5/14/08 # # Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. push( @includes, qw( . %T/platforms/shimmer %T/platforms/shimmer/chips/cc2420 %T/platforms/shimmer/chips/mma7260 %T/platforms/shimmer/chips/sd %T/platforms/shimmer/chips/sd/fatfs %T/platforms/shimmer/chips/bluetooth %T/platforms/shimmer/chips/msp430 %T/platforms/shimmer/chips/ds2411 %T/platforms/shimmer/chips/gsr %T/platforms/shimmer/chips/rmcm01 %T/platforms/shimmer2/chips/gyro %T/chips/cc2420 %T/chips/cc2420/alarm %T/chips/cc2420/control %T/chips/cc2420/csma %T/chips/cc2420/interfaces %T/chips/cc2420/link %T/chips/cc2420/lowpan %T/chips/cc2420/lpl %T/chips/cc2420/packet %T/chips/cc2420/receive %T/chips/cc2420/spi %T/chips/cc2420/transmit %T/chips/cc2420/unique %T/chips/cc2420/security %T/chips/msp430 %T/chips/msp430/adc12 %T/chips/msp430/dma %T/chips/msp430/pins %T/chips/msp430/timer %T/chips/msp430/usart %T/chips/msp430/sensors %T/lib/timer %T/lib/serial %T/lib/adc %T/lib/power ) ); @opts = qw( -gcc=msp430-gcc -mmcu=msp430f1611 -fnesc-target=msp430 -fnesc-no-debug ); push @opts, "-mdisable-hwmul" if `msp430-gcc --version | grep 3.2.3`; push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{'CIL_MACHINE'} = "version_major=3 " . "version_minor=2 " . "version=msp430-3.2.3 " . "short=2,2 " . "int=2,2 " . "long=4,2 " . "long_long=8,2 " . "pointer=2,2 " . "enum=2,2 " . "float=4,2 " . "double=4,2 " . "long_double=4,2 " . "void=1,1 " . "fun=1,2 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/shimmer/ActiveMessageC.nc000066400000000000000000000061501207233610700234100ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.7 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.7 2010-06-29 22:07:54 scipio Exp $ * */ /** * The Active Message layer on the SHIMMER platform. This is a naming wrapper * around the CC2420 Active Message layer. * * @author Konrad Lorincz */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface LowPowerListening; } } implementation { components CC2420ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; LowPowerListening = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/Counter32khz64C.nc000066400000000000000000000045601207233610700233460ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Counter32khz32C provides at 32-bit counter at 32768 ticks per second. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ /* * arguments table for convenience: typedef to_precision_tag, typedef to_size_type @integer(), typedef from_precision_tag, typedef from_size_type @integer(), uint8_t bit_shift_right, typedef upper_count_type @integer()) @safe() */ configuration Counter32khz64C { provides interface Counter; } implementation { components Msp430Counter32khzC as CounterFrom; components new TransformCounterC(T32khz,uint64_t,T32khz,uint16_t,0,uint64_t) as Transform; Counter = Transform; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/CounterMicro32C.nc000066400000000000000000000042101207233610700234410ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * CounterMicro32C provides at 32-bit counter at 1024000 ticks per second. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration CounterMicro32C { provides interface Counter; } implementation { components Msp430CounterMicroC as CounterFrom; components new TransformCounterC(TMicro,uint32_t,TMicro,uint16_t,0,uint16_t) as Transform; Counter = Transform.Counter; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/CounterMilli64C.nc000066400000000000000000000042051207233610700234470ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * CounterMilli32C provides at 32-bit counter at 1024 ticks per second. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration CounterMilli64C { provides interface Counter; } implementation { components Msp430Counter32khzC as CounterFrom; components new TransformCounterC(TMilli,uint64_t,T32khz,uint16_t,5,uint32_t) as Transform; Counter = Transform.Counter; Transform.CounterFrom -> CounterFrom; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/CounterToLocalTime64C.nc000066400000000000000000000043761207233610700245660ustar00rootroot00000000000000//$Id: CounterToLocalTime64C.nc,v 1.2 2010-06-29 22:07:54 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * CounterToLocalTimeC converts a 32-bit LocalTime to a Counter. * *

      See TEP102 for more details. * @param precision_tag A type indicating the precision of the LocalTime and * Counter being converted. * * @author Cory Sharp */ generic module CounterToLocalTime64C(typedef precision_tag) @safe() { provides interface LocalTime64; uses interface Counter; } implementation { async command uint64_t LocalTime64.get() { return call Counter.get(); } async event void Counter.overflow() { } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/DemoSensorC.nc000066400000000000000000000044241207233610700227500ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorC on the telosb platform provides a * voltage reading, using VoltageC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2008-05-21 22:07:24 $ * */ generic configuration DemoSensorC() { provides interface Read; } implementation { components new VoltageC() as DemoSensor; Read = DemoSensor; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/DemoSensorNowC.nc000066400000000000000000000046341207233610700234370ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorNowC is a generic sensor device that provides a 16-bit * value that can be read from async context. The platform author * chooses which sensor actually sits behind DemoSensorNowC, and * though it's probably Voltage, Light, or Temperature, there are no * guarantees. * * This particular DemoSensorNowC on the telosb platform provides a * voltage reading, using VoltageC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2008-06-24 22:25:57 $ * */ generic configuration DemoSensorNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new Msp430InternalVoltageC() as DemoSensorNow; Resource = DemoSensorNow; ReadNow = DemoSensorNow; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/DemoSensorStreamC.nc000066400000000000000000000045041207233610700241230ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorStreamC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorStreamC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorStreamC on the telosb platform provides a * voltage reading, using VoltageStreamC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2008-06-24 22:25:57 $ * */ generic configuration DemoSensorStreamC() { provides interface ReadStream; } implementation { components new VoltageStreamC() as DemoSensor; ReadStream = DemoSensor; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/HostTime.nc000066400000000000000000000035231207233610700223220ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date June 2010 */ interface HostTime { /* * this should be used to begin execution of applications * that require a host-based timestamp sent via serial line */ event void timeAndZoneSet(char * g_timestring); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/HostTimeC.nc000066400000000000000000000040211207233610700224170ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date September, 2010 */ configuration HostTimeC { provides{ interface HostTime; interface Init; } } implementation { components HostTimeP; Init = HostTimeP; HostTime = HostTimeP; components TimeC, HplMsp430Usart0C; HostTimeP.UARTControl -> HplMsp430Usart0C.HplMsp430Usart; HostTimeP.UARTData -> HplMsp430Usart0C.HplMsp430UsartInterrupts; HostTimeP.Time -> TimeC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/HostTimeP.nc000066400000000000000000000131441207233610700224420ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date June 2010 */ #include "msp430usart.h" module HostTimeP { provides { interface Init; interface HostTime; } uses { interface Time; interface HplMsp430Usart as UARTControl; interface HplMsp430UsartInterrupts as UARTData; } } implementation { enum { NONE, TIMEBYTE_32, TIMEBYTE_24, TIMEBYTE_16, TIMEBYTE_8, YEARBYTE_32, YEARBYTE_24, YEARBYTE_16, YEARBYTE_8, ZERODAY, DST_FDAY1, DST_FDAY0, DST_LDAY1, DST_LDAY0, YEAR1, YEAR0, DONE }; struct tm g_tm; time_t g_host_time = 0, g_year_time; uint8_t byte3, byte2, byte1, byte0, byte7, byte6, byte5, byte4, byte9, byte8, byte10, byte11, byte12, byte14, byte13; uint8_t sync_state, g_zero_day, toSend, charsSent; uint16_t g_dst_fday, g_dst_lday, g_year; char g_timestring[128]; bool transmissionComplete; void setupUART() { /* * NOTE: this sets the baudrate based upon a 4mhz SMCLK given by the 8mhz xt clock config * to run at the default msp430 clock settings, use _1MHZ_ for these two flags */ msp430_uart_union_config_t RN_uart_config = { {ubr: UBR_4MHZ_115200, umctl: UMCTL_4MHZ_115200, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1,listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 0, urxwie: 0, utxe : 1, urxe :1} }; call UARTControl.setModeUart(&RN_uart_config); // set to UART mode call UARTControl.enableTxIntr(); call UARTControl.enableRxIntr(); } command error_t Init.init(){ sync_state = NONE; setupUART(); return SUCCESS; } task void assemble_timestamp() { time_t time_now; g_host_time = byte3; g_host_time = g_host_time << 24; g_host_time = (g_host_time >> 16 | byte2) << 16; g_host_time = (g_host_time >> 8 | byte1) << 8; g_host_time = g_host_time | byte0; g_year_time = byte7; g_year_time = g_year_time << 24; g_year_time = (g_year_time >> 16 | byte6) << 16; g_year_time = (g_year_time >> 8 | byte5) << 8; g_year_time = g_year_time | byte4; g_zero_day = byte8; g_dst_fday = byte10; g_dst_fday = (g_dst_fday << 8) | byte9; g_dst_lday = byte12; g_dst_lday = (g_dst_lday << 8) | byte11; g_year = byte14; g_year = (g_year << 8) | byte13; call Time.setCurrentTime(g_host_time); call Time.setZoneInfo(g_year, g_year_time, g_zero_day, g_dst_fday, g_dst_lday); call Time.time(&time_now); call Time.localtime(&time_now, &g_tm); call Time.asctime(&g_tm, g_timestring, 128); signal HostTime.timeAndZoneSet(g_timestring); } async event void UARTData.rxDone(uint8_t data) { switch (sync_state) { case NONE: case TIMEBYTE_32: byte3 = data; sync_state = TIMEBYTE_24; break; case TIMEBYTE_24: byte2 = data; sync_state = TIMEBYTE_16; break; case TIMEBYTE_16: byte1 = data; sync_state = TIMEBYTE_8; break; case TIMEBYTE_8: byte0 = data; sync_state = YEARBYTE_32; break; case YEARBYTE_32: byte7 = data; sync_state = YEARBYTE_24; break; case YEARBYTE_24: byte6 = data; sync_state = YEARBYTE_16; break; case YEARBYTE_16: byte5 = data; sync_state = YEARBYTE_8; break; case YEARBYTE_8: byte4 = data; sync_state = ZERODAY; break; case ZERODAY: byte8 = data; sync_state = DST_FDAY1; break; case DST_FDAY1: byte10 = data; sync_state = DST_FDAY0; break; case DST_FDAY0: byte9 = data; sync_state = DST_LDAY1; break; case DST_LDAY1: byte12 = data; sync_state = DST_LDAY0; break; case DST_LDAY0: byte11 = data; sync_state = YEAR1; break; case YEAR1: byte14 = data; sync_state = YEAR0; break; case YEAR0: byte13 = data; post assemble_timestamp(); sync_state = DONE; break; default: break; } } async event void UARTData.txDone() {} event void Time.tick() { } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/HplUserButtonC.nc000066400000000000000000000044151207233610700234500ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telos platform * * @author Gilman Tolle * @version $Revision: 1.1 $ * (not much to) port to shimmer * @author Steve Ayer * @date February, 2010 */ configuration HplUserButtonC { provides interface GeneralIO; provides interface GpioInterrupt; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components HplMsp430InterruptC as InterruptC; components new Msp430GpioC() as UserButtonC; UserButtonC -> GeneralIOC.Port20; GeneralIO = UserButtonC; components new Msp430InterruptC() as InterruptUserButtonC; InterruptUserButtonC.HplInterrupt -> InterruptC.Port20; GpioInterrupt = InterruptUserButtonC.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/Ieee154MessageC.nc000066400000000000000000000044731207233610700233040ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * * @author Stephen Dawson-Haggerty */ configuration Ieee154MessageC { provides { interface SplitControl; interface Resource as SendResource[uint8_t clientId]; interface Ieee154Send; interface Receive as Ieee154Receive; interface Ieee154Packet; interface Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; interface LowPowerListening; interface PacketLink; } } implementation { components CC2420Ieee154MessageC as Msg; SplitControl = Msg; SendResource = Msg; Ieee154Send = Msg; Ieee154Receive = Msg; Ieee154Packet = Msg; Packet = Msg; PacketAcknowledgements = Msg; LinkPacketMetadata = Msg; LowPowerListening = Msg; PacketLink = Msg; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/Leds.nc000066400000000000000000000120641207233610700214550ustar00rootroot00000000000000// $Id: Leds.nc,v 1.2 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2005-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Commands for controlling three LEDs. A platform can provide this * interface if it has more than or fewer than three LEDs. In the * former case, these commands refer to the first three LEDs. In the * latter case, some of the commands are null operations, and the set * of non-null operations must be contiguous and start at Led1. That * is, on platforms with 2 LEDs, LED 3's commands are null operations, * while on platforms with 1 LED, LED 2 and LED 3's commands are null * opertations. * * @author Joe Polastre * @author Philip Levis * * @author Mike Healy * @date April 20, 2009 - added support for 4th (green) LED on SHIMMER */ #include "Leds.h" interface Leds { /** * Turn on LED 0. The color of this LED depends on the platform. */ async command void led0On(); /** * Turn off LED 0. The color of this LED depends on the platform. */ async command void led0Off(); /** * Toggle LED 0; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led0Toggle(); /** * Turn on LED 1. The color of this LED depends on the platform. */ async command void led1On(); /** * Turn off LED 1. The color of this LED depends on the platform. */ async command void led1Off(); /** * Toggle LED 1; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led1Toggle(); /** * Turn on LED 2. The color of this LED depends on the platform. */ async command void led2On(); /** * Turn off LED 2. The color of this LED depends on the platform. */ async command void led2Off(); /** * Toggle LED 2; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led2Toggle(); /** * Turn on LED 3. The color of this LED depends on the platform. */ async command void led3On(); /** * Turn off LED 3. The color of this LED depends on the platform. */ async command void led3Off(); /** * Toggle LED 3; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led3Toggle(); /** * Get the current LED settings as a bitmask. Each bit corresponds to * whether an LED is on; bit 0 is LED 0, bit 1 is LED 1, etc. You can * also use the enums LEDS_LED0, LEDS_LED1. For example, this expression * will determine whether LED 2 is on: * *

       (call Leds.get() & LEDS_LED2) 
      * * This command supports up to 8 LEDs; if a platform has fewer, then * those LEDs should always be off (their bit is zero). Also see * set(). * * @return a bitmask describing which LEDs are on and which are off */ async command uint8_t get(); /** * Set the current LED configuration using a bitmask. Each bit * corresponds to whether an LED is on; bit 0 is LED 0, bit 1 is LED * 1, etc. You can also use the enums LEDS_LED0, LEDS_LED1. For example, * this statement will configure the LEDs so LED 0 and LED 2 are on: * *
       call Leds.set(LEDS_LED0 | LEDS_LED2); 
      * * This statement will turn LED 1 on if it was not already: * *
      call Leds.set(call Leds.get() | LEDS_LED1);
      * * @param val a bitmask describing the on/off settings of the LEDs */ async command void set(uint8_t val); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/LedsC.nc000066400000000000000000000042741207233610700215640ustar00rootroot00000000000000// $Id: LedsC.nc,v 1.2 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * The basic TinyOS LEDs abstraction. * * @author Phil Buonadonna * @author David Gay * @author Philip Levis * @author Joe Polastre * * @author Mike Healy * @date April 20, 2009 - added support for 4th (green) LED on SHIMMER */ configuration LedsC { provides interface Leds; } implementation { components LedsP, PlatformLedsC; Leds = LedsP; LedsP.Init <- PlatformLedsC.Init; LedsP.Led0 -> PlatformLedsC.Led0; LedsP.Led1 -> PlatformLedsC.Led1; LedsP.Led2 -> PlatformLedsC.Led2; LedsP.Led3 -> PlatformLedsC.Led3; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/LedsP.nc000066400000000000000000000107621207233610700216000ustar00rootroot00000000000000// $Id: LedsP.nc,v 1.2 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The implementation of the standard 3 LED mote abstraction. * * @author Joe Polastre * @author Philip Levis * * @date March 21, 2005 * * @author Mike Healy * @date April 20, 2009 - added support for 4th (green) LED on SHIMMER */ module LedsP @safe() { provides { interface Init; interface Leds; } uses { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; interface GeneralIO as Led3; } } implementation { command error_t Init.init() { atomic { dbg("Init", "LEDS: initialized.\n"); call Led0.makeOutput(); call Led1.makeOutput(); call Led2.makeOutput(); call Led3.makeOutput(); call Led0.set(); call Led1.set(); call Led2.set(); call Led3.set(); } return SUCCESS; } /* Note: the call is inside the dbg, as it's typically a read of a volatile location, so can't be deadcode eliminated */ #define DBGLED(n) \ dbg("LedsC", "LEDS: Led" #n " %s.\n", call Led ## n .get() ? "off" : "on"); async command void Leds.led0On() { call Led0.clr(); DBGLED(0); } async command void Leds.led0Off() { call Led0.set(); DBGLED(0); } async command void Leds.led0Toggle() { call Led0.toggle(); DBGLED(0); } async command void Leds.led1On() { call Led1.clr(); DBGLED(1); } async command void Leds.led1Off() { call Led1.set(); DBGLED(1); } async command void Leds.led1Toggle() { call Led1.toggle(); DBGLED(1); } async command void Leds.led2On() { call Led2.clr(); DBGLED(2); } async command void Leds.led2Off() { call Led2.set(); DBGLED(2); } async command void Leds.led2Toggle() { call Led2.toggle(); DBGLED(2); } async command void Leds.led3On() { call Led3.clr(); DBGLED(3); } async command void Leds.led3Off() { call Led3.set(); DBGLED(3); } async command void Leds.led3Toggle() { call Led3.toggle(); DBGLED(3); } async command uint8_t Leds.get() { uint8_t rval; atomic { rval = 0; if (!call Led0.get()) { rval |= LEDS_LED0; } if (!call Led1.get()) { rval |= LEDS_LED1; } if (!call Led2.get()) { rval |= LEDS_LED2; } if (!call Led3.get()) { rval |= LEDS_LED3; } } return rval; } async command void Leds.set(uint8_t val) { atomic { if (val & LEDS_LED0) { call Leds.led0On(); } else { call Leds.led0Off(); } if (val & LEDS_LED1) { call Leds.led1On(); } else { call Leds.led1Off(); } if (val & LEDS_LED2) { call Leds.led2On(); } else { call Leds.led2Off(); } if (val & LEDS_LED3) { call Leds.led3On(); } else { call Leds.led3Off(); } } } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/LocalTime64.nc000066400000000000000000000050231207233610700226060ustar00rootroot00000000000000//$Id: LocalTime64.nc,v 1.2 2010-06-29 22:07:54 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "Timer.h" /** * A LocalTime interface counts time in some units. If you need to detect * time overflow, you should use a component offering the Counter * interface. * *

      The LocalTime interface is parameterised by its "precision" * (milliseconds, microseconds, etc), identified by a type. This prevents, * e.g., unintentionally mixing components expecting milliseconds with * those expecting microseconds as those interfaces have a different type. * *

      See TEP102 for more details. * * @param precision_tag A type indicating the precision of this Counter. * * @author Cory Sharp */ interface LocalTime64 { /** * Return current time. Time starts counting at boot - some time sources * may stop counting while the processor is in low-power mode. * * @return Current time. */ async command uint64_t get(); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/MoteClockC.nc000066400000000000000000000035571207233610700225600ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: MoteClockC.nc,v 1.1 2008-05-21 22:07:24 konradlorincz Exp $ * */ /** * @author Vlado Handziski */ configuration MoteClockC { provides interface Init as MoteClockInit; } implementation { components Msp430ClockC; MoteClockInit = Msp430ClockC.Init; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/MotePlatformC.nc000066400000000000000000000144271207233610700233070ustar00rootroot00000000000000/* * Copyright (c) 2006, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steven Ayer * @date June 2006 */ module MotePlatformC { provides interface Init; } implementation { command error_t Init.init() { //LEDS TOSH_MAKE_RED_LED_OUTPUT(); TOSH_MAKE_YELLOW_LED_OUTPUT(); TOSH_MAKE_ORANGE_LED_OUTPUT(); TOSH_MAKE_GREEN_LED_OUTPUT(); TOSH_SEL_RED_LED_IOFUNC(); TOSH_SEL_YELLOW_LED_IOFUNC(); TOSH_SEL_ORANGE_LED_IOFUNC(); TOSH_SEL_GREEN_LED_IOFUNC(); TOSH_SET_RED_LED_PIN(); TOSH_SET_YELLOW_LED_PIN(); TOSH_SET_ORANGE_LED_PIN(); TOSH_SET_GREEN_LED_PIN(); //RADIO PINS //CC2420 pins TOSH_MAKE_RADIO_CSN_OUTPUT(); TOSH_SEL_RADIO_CSN_IOFUNC(); TOSH_SET_RADIO_CSN_PIN(); TOSH_MAKE_CSN_OUTPUT(); TOSH_SEL_CSN_IOFUNC(); TOSH_SET_CSN_PIN(); // should be reset_n TOSH_MAKE_RADIO_RESET_OUTPUT(); TOSH_SEL_RADIO_RESET_IOFUNC(); TOSH_CLR_RADIO_RESET_PIN(); TOSH_MAKE_RADIO_1V8_EN_OUTPUT(); TOSH_SEL_RADIO_1V8_EN_IOFUNC(); TOSH_CLR_RADIO_1V8_EN_PIN(); TOSH_MAKE_RADIO_CCA_INPUT(); TOSH_MAKE_RADIO_FIFO_INPUT(); TOSH_MAKE_RADIO_FIFOP_INPUT(); TOSH_MAKE_RADIO_SFD_INPUT(); TOSH_MAKE_RADIO_TIMED_SFD_INPUT(); TOSH_SEL_RADIO_CCA_IOFUNC(); TOSH_SEL_RADIO_FIFO_IOFUNC(); TOSH_SEL_RADIO_FIFOP_IOFUNC(); TOSH_SEL_RADIO_SFD_IOFUNC(); TOSH_SEL_RADIO_TIMED_SFD_IOFUNC(); TOSH_MAKE_ONEWIRE_PWR_OUTPUT(); TOSH_SET_ONEWIRE_PWR_PIN(); TOSH_SEL_SD_CS_N_IOFUNC(); TOSH_MAKE_SD_CS_N_OUTPUT(); TOSH_SET_SD_CS_N_PIN(); // BT PINS TOSH_MAKE_BT_RESET_OUTPUT(); TOSH_SEL_BT_RESET_IOFUNC(); TOSH_CLR_BT_RESET_PIN(); // mitsumi module disabled by clr TOSH_MAKE_BT_RTS_INPUT(); TOSH_SEL_BT_RTS_IOFUNC(); TOSH_MAKE_BT_PIO_INPUT(); TOSH_SEL_BT_PIO_IOFUNC(); TOSH_MAKE_BT_CTS_OUTPUT(); TOSH_SEL_BT_CTS_IOFUNC(); TOSH_MAKE_BT_TXD_OUTPUT(); TOSH_SEL_BT_TXD_MODFUNC(); TOSH_MAKE_BT_RXD_INPUT(); TOSH_SEL_BT_RXD_MODFUNC(); // BSL Prog Pins tristate em TOSH_MAKE_PROG_IN_OUTPUT(); TOSH_MAKE_PROG_OUT_OUTPUT(); TOSH_SET_PROG_OUT_PIN(); // some expansion boards have enable low TOSH_SEL_PROG_IN_IOFUNC(); TOSH_SEL_PROG_OUT_IOFUNC(); // USART lines, attached to a pullup TOSH_SEL_UCLK0_IOFUNC(); TOSH_MAKE_UCLK0_OUTPUT(); TOSH_SET_UCLK0_PIN(); TOSH_SEL_UCLK1_IOFUNC(); TOSH_MAKE_UCLK1_OUTPUT(); TOSH_SET_UCLK1_PIN(); TOSH_SEL_SIMO0_IOFUNC(); TOSH_MAKE_SIMO0_OUTPUT(); TOSH_SET_SIMO0_PIN(); TOSH_SEL_SOMI0_IOFUNC(); TOSH_MAKE_SOMI0_INPUT(); TOSH_SEL_SIMO1_IOFUNC(); TOSH_MAKE_SIMO1_OUTPUT(); TOSH_SET_SIMO1_PIN(); TOSH_SEL_SOMI1_IOFUNC(); TOSH_MAKE_SOMI1_INPUT(); // ADC lines TOSH_MAKE_ADC_0_OUTPUT(); TOSH_MAKE_ADC_1_OUTPUT(); TOSH_MAKE_ADC_2_OUTPUT(); TOSH_MAKE_ADC_6_OUTPUT(); TOSH_MAKE_ADC_7_OUTPUT(); TOSH_SEL_ADC_0_IOFUNC(); TOSH_SEL_ADC_1_IOFUNC(); TOSH_SEL_ADC_2_IOFUNC(); TOSH_SEL_ADC_6_IOFUNC(); TOSH_SEL_ADC_7_IOFUNC(); TOSH_MAKE_ADC_ACCELZ_INPUT(); TOSH_MAKE_ADC_ACCELY_INPUT(); TOSH_MAKE_ADC_ACCELX_INPUT(); TOSH_SEL_ADC_ACCELZ_MODFUNC(); TOSH_SEL_ADC_ACCELY_MODFUNC(); TOSH_SEL_ADC_ACCELX_MODFUNC(); TOSH_SEL_ROSC_IOFUNC(); TOSH_MAKE_ROSC_INPUT(); // DAC lines // Default is not to use DAC mode. Please define pin usage if you want to use them // UART pins // These declarations are to allow the UART module to work since it's using the names. // The UART module will set them to the right direction when initialized // ftdi/gio pins. Unused for now so we do not set directionality or function // 1-wire function TOSH_MAKE_ONEWIRE_PWR_OUTPUT(); TOSH_SEL_ONEWIRE_PWR_IOFUNC(); TOSH_MAKE_ONEWIRE_INPUT(); TOSH_SEL_ONEWIRE_IOFUNC(); // Accelerometer pin definitions TOSH_SEL_ACCEL_SEL0_IOFUNC(); TOSH_SEL_ACCEL_SEL1_IOFUNC(); TOSH_SEL_ACCEL_SLEEP_N_IOFUNC(); TOSH_MAKE_ACCEL_SEL0_OUTPUT(); TOSH_MAKE_ACCEL_SEL1_OUTPUT(); TOSH_MAKE_ACCEL_SLEEP_N_OUTPUT(); /* * unless the accel_sel0 pin is cleared, * a severe quiescent power hit occurs on the msp430 * we go from 3.7 ua to 65.1 ua when asleep! */ TOSH_CLR_ACCEL_SEL0_PIN(); TOSH_CLR_ACCEL_SEL1_PIN(); TOSH_CLR_ACCEL_SLEEP_N_PIN(); // idle expansion header pins TOSH_MAKE_SER0_CTS_OUTPUT(); TOSH_SEL_SER0_CTS_IOFUNC(); TOSH_MAKE_SER0_RTS_OUTPUT(); TOSH_SEL_SER0_RTS_IOFUNC(); TOSH_MAKE_GIO0_INPUT(); TOSH_SEL_GIO0_IOFUNC(); TOSH_MAKE_GIO1_OUTPUT(); TOSH_SEL_GIO1_IOFUNC(); TOSH_MAKE_UTXD0_OUTPUT(); TOSH_SEL_UTXD0_IOFUNC(); TOSH_MAKE_URXD0_OUTPUT(); TOSH_SEL_URXD0_IOFUNC(); TOSH_MAKE_RADIO_VREF_OUTPUT(); TOSH_SEL_RADIO_VREF_IOFUNC(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/Msp430Timer32khzMapC.nc000066400000000000000000000065221207233610700242020ustar00rootroot00000000000000//$Id: Msp430Timer32khzMapC.nc,v 1.4 2010-06-29 22:07:54 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * MSP430Timer32khzMapC presents as paramaterized interfaces all of * the 32khz hardware timers on the MSP430 that are available for * compile time allocation by "new Alarm32khz16C()", "new * AlarmMilli32C()", and so on. * * Platforms based on the MSP430 are * encouraged to copy in and * override this file, presenting only the * hardware timers that are * available for allocation on that platform. * * @author Cory Sharp * @version $Revision: 1.4 $ $Date: 2010-06-29 22:07:54 $ */ configuration Msp430Timer32khzMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; Msp430Timer[0] = Msp430TimerC.TimerB; Msp430TimerControl[0] = Msp430TimerC.ControlB0; Msp430Compare[0] = Msp430TimerC.CompareB0; Msp430Timer[1] = Msp430TimerC.TimerB; Msp430TimerControl[1] = Msp430TimerC.ControlB1; Msp430Compare[1] = Msp430TimerC.CompareB1; Msp430Timer[2] = Msp430TimerC.TimerB; Msp430TimerControl[2] = Msp430TimerC.ControlB2; Msp430Compare[2] = Msp430TimerC.CompareB2; Msp430Timer[3] = Msp430TimerC.TimerB; Msp430TimerControl[3] = Msp430TimerC.ControlB3; Msp430Compare[3] = Msp430TimerC.CompareB3; Msp430Timer[4] = Msp430TimerC.TimerB; Msp430TimerControl[4] = Msp430TimerC.ControlB4; Msp430Compare[4] = Msp430TimerC.CompareB4; Msp430Timer[5] = Msp430TimerC.TimerB; Msp430TimerControl[5] = Msp430TimerC.ControlB5; Msp430Compare[5] = Msp430TimerC.CompareB5; Msp430Timer[6] = Msp430TimerC.TimerB; Msp430TimerControl[6] = Msp430TimerC.ControlB6; Msp430Compare[6] = Msp430TimerC.CompareB6; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/NoLedsC.nc000066400000000000000000000043301207233610700220520ustar00rootroot00000000000000// $Id: NoLedsC.nc,v 1.1 2009/06/17 15:16:54 ayer Exp $ /* * "Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /** * A null operation replacement for the LedsC component. As many * components might concurrently signal information through LEDs, * using LedsC and NoLedsC allows an application builder to select * which components control the LEDs. * * @author Philip Levis * @date March 19, 2005 * * @author Mike Healy * @date April 20, 2009 - added support for 4th (green) LED on SHIMMER */ module NoLedsC { provides interface Init; provides interface Leds; } implementation { command error_t Init.init() {return SUCCESS;} async command void Leds.led0On() {} async command void Leds.led0Off() {} async command void Leds.led0Toggle() {} async command void Leds.led1On() {} async command void Leds.led1Off() {} async command void Leds.led1Toggle() {} async command void Leds.led2On() {} async command void Leds.led2Off() {} async command void Leds.led2Toggle() {} async command void Leds.led3On() {} async command void Leds.led3Off() {} async command void Leds.led3Toggle() {} async command uint8_t Leds.get() {return 0;} async command void Leds.set(uint8_t val) {} } tinyos-2.1.2+dfsg/tos/platforms/shimmer/PlatformC.nc000066400000000000000000000036641207233610700224630ustar00rootroot00000000000000/* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre and Cory Sharp * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:54 $ */ #include "hardware.h" configuration PlatformC { provides interface Init; } implementation { components PlatformP, MotePlatformC, MoteClockC; Init = PlatformP; PlatformP.MoteClockInit -> MoteClockC; PlatformP.MoteInit -> MotePlatformC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/PlatformLedsC.nc000066400000000000000000000050471207233610700232700ustar00rootroot00000000000000// $Id: PlatformLedsC.nc,v 1.3 2010-06-29 22:07:54 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre * @version $Revision: 1.3 $ $Date: 2010-06-29 22:07:54 $ * * @author Mike Healy * @date April 20, 2009 - added support for 4th (green) LED on SHIMMER */ #include "hardware.h" configuration PlatformLedsC { provides interface GeneralIO as Led0; provides interface GeneralIO as Led1; provides interface GeneralIO as Led2; provides interface GeneralIO as Led3; uses interface Init; } implementation { components HplMsp430GeneralIOC as GeneralIOC , new Msp430GpioC() as Led0Impl , new Msp430GpioC() as Led1Impl , new Msp430GpioC() as Led2Impl , new Msp430GpioC() as Led3Impl ; components PlatformP; Init = PlatformP.LedsInit; Led0 = Led0Impl; Led0Impl -> GeneralIOC.Port40; Led1 = Led1Impl; Led1Impl -> GeneralIOC.Port41; Led2 = Led2Impl; Led2Impl -> GeneralIOC.Port42; Led3 = Led3Impl; Led3Impl -> GeneralIOC.Port43; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/PlatformP.nc000066400000000000000000000006601207233610700224710ustar00rootroot00000000000000#include "hardware.h" module PlatformP{ provides interface Init; uses interface Init as MoteClockInit; uses interface Init as MoteInit; uses interface Init as LedsInit; } implementation { command error_t Init.init() { WDTCTL = WDTPW + WDTHOLD; call MoteClockInit.init(); call MoteInit.init(); call LedsInit.init(); return SUCCESS; } default command error_t LedsInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/PlatformSerialC.nc000066400000000000000000000041321207233610700236120ustar00rootroot00000000000000/* * Copyright (c) 2008 * The President and Fellows of Harvard College. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /** * Ported to the SHIMMER platform: uses Uart0 instead of Uart1 (telos). * * @author Konrad Lorincz * @date May 14, 2008 */ configuration PlatformSerialC { provides interface StdControl; provides interface UartStream; provides interface UartByte; } implementation { components new Msp430Uart0C() as UartC; UartStream = UartC; UartByte = UartC; components ShimmerSerialP; StdControl = ShimmerSerialP; ShimmerSerialP.Msp430UartConfigure <- UartC.Msp430UartConfigure; ShimmerSerialP.Resource -> UartC.Resource; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/README.txt000066400000000000000000000051361207233610700217440ustar00rootroot00000000000000*** SHIMMER - TinyOS 2.x platform support *** ============================================= Konrad Lorincz May 6, 2008 This directory contains tinyos 2.x platform support for the Intel SHIMMER mote. Please use the mailing list given below to post questions and comments. Usage ----- You can compile and install applications for the SHIMMER platform just like with any standard platform, "make shimmer install ..." (Note: you must have a shimmer programming board). For example, to complie and install Blink, do the following: $ cd $TOSROOT/apps/Blink $ make shimmer install bsl,X where X is your serial port. You may also want to test the radio. Do this by compiling and installing "$TOSROOT/apps/RadioCountToLeds" on TWO shimmers (for sending and receiving radio messages). Support ------- - Official documentation http://docs.tinyos.net/index.php/SHIMMER - Mailing list (requires subscription to post) https://www.eecs.harvard.edu/mailman/listinfo/shimmer-users Copyright --------- /* * Copyright (c) 2008 * The President and Fellows of Harvard College. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ tinyos-2.1.2+dfsg/tos/platforms/shimmer/ShimmerSerialP.nc000066400000000000000000000046541207233610700234600ustar00rootroot00000000000000/* * Copyright (c) 2008 * The President and Fellows of Harvard College. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /** * Ported to the SHIMMER platform: uses Uart0 instead of Uart1 (telos). * * @author Konrad Lorincz * @date May 14, 2008 */ module ShimmerSerialP { provides interface StdControl; provides interface Msp430UartConfigure; uses interface Resource; } implementation { msp430_uart_union_config_t msp430_uart_telos_config = { {ubr: UBR_1MHZ_115200, umctl: UMCTL_1MHZ_115200, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0, utxe : 1, urxe : 1} }; command error_t StdControl.start() { return call Resource.immediateRequest(); } command error_t StdControl.stop() { call Resource.release(); return SUCCESS; } event void Resource.granted(){} async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig() { return &msp430_uart_telos_config; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/SwitchToggleC.nc000066400000000000000000000045771207233610700233060ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Generic layer to translate a GIO into a toggle switch * * @author Gilman Tolle * @version $Revision: 1.1 $ * port to shimmer-style * @author Steve Ayer * @date February, 2010 */ #include generic module SwitchToggleC() { provides interface Notify; uses interface GeneralIO; uses interface GpioInterrupt; } implementation { task void sendEvent(); command error_t Notify.enable() { call GeneralIO.makeInput(); return call GpioInterrupt.enableRisingEdge(); } command error_t Notify.disable() { call GeneralIO.makeOutput(); return call GpioInterrupt.disable(); } async event void GpioInterrupt.fired() { call GpioInterrupt.disable(); post sendEvent(); } task void sendEvent() { signal Notify.notify( BUTTON_PRESSED ); } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/Time.h000066400000000000000000000014211207233610700213060ustar00rootroot00000000000000typedef uint32_t time_t; #define HAVE_WDAY #undef HAVE_DST struct tm { int tm_sec; /* Seconds. [0-60] (1 leap second) */ int tm_min; /* Minutes. [0-59] */ int tm_hour; /* Hours. [0-23] */ int tm_mday; /* Day. [1-31] */ int tm_mon; /* Month. [0-11] */ int tm_year; /* Year - 1900. */ #ifdef HAVE_WDAY int tm_wday; /* Day of week. [0-6] */ #endif int tm_yday; /* Days in year.[0-365] */ int tm_isdst; /* DST. [-1/0/1]*/ #ifdef __UCLIBC_HAS_TM_EXTENSIONS__ #ifdef __USE_BSD long int tm_gmtoff; /* Seconds east of UTC. */ __const char *tm_zone; /* Timezone abbreviation. */ #else long int __tm_gmtoff; /* Seconds east of UTC. */ __const char *__tm_zone; /* Timezone abbreviation. */ #endif #endif /* __UCLIBC_HAS_TM_EXTENSIONS__ */ }; tinyos-2.1.2+dfsg/tos/platforms/shimmer/Time.nc000066400000000000000000000042171207233610700214650ustar00rootroot00000000000000/* * Copyright (c) 2005 Hewlett-Packard Company * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of the Hewlett-Packard Company nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "Time.h" interface Time { command error_t gmtime(const time_t *timer, struct tm *tm); command error_t localtime(const time_t *timer, struct tm *tm); command error_t asctime(const struct tm *tm, char *buf, int buflen); command error_t time(time_t *timer); command error_t mktime(const struct tm *tm, time_t * t); command void setCurrentTime(time_t current_time); command void setZoneInfo(uint16_t g_year, time_t g_year_time, uint8_t g_zero_day, uint16_t g_dst_fday, uint16_t g_dst_lday); event void tick(); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/TimeC.nc000066400000000000000000000043011207233610700215620ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date March, 2010 * * pulling together time modules */ configuration TimeC { provides{ interface Time; interface Init; } } implementation { components TimeP; Init = TimeP; Time = TimeP; components new TimerMilliC() as LocalTimer; TimeP.Timer -> LocalTimer; components Counter32khz64C as Counter; components new CounterToLocalTime64C(T32khz); CounterToLocalTime64C.Counter -> Counter; TimeP.LocalTime64 -> CounterToLocalTime64C; /* * and, at some point... * TimeP.NTPClient -> NTPClientM; not yet, awaiting tos-2.x ip port */ } tinyos-2.1.2+dfsg/tos/platforms/shimmer/TimeP.nc000066400000000000000000000256631207233610700216150ustar00rootroot00000000000000 /* Copyright (C) 2002 Manuel Novoa III * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** * port to tos-2.x * @author Steve Ayer * @date January, 2010 */ // includes InfoMem; let's avoid this... module TimeP { provides { interface Init; interface Time; // interface ParamView; save for ip stack port to tos-2.x } uses { interface Timer; // interface NTPClient; save for ip stack port to tos-2.x interface LocalTime64; } } implementation { #define HAVE_DST extern int snprintf(char *str, size_t len, const char *format, ...) __attribute__ ((C)); struct y_info{ time_t year_seconds; /* time_t value for beginning of year */ int8_t wday_offset; /* tm_day of first day of the year */ int8_t isleap; int16_t dst_first_yday; int16_t dst_last_yday; }; time_t g_seconds; time_t g_year_seconds; time_t g_seconds_from_year; uint16_t g_days; time_t g_seconds_from_day; //#define TZNAME_MAX 7 //#define LONG_MAX 0x7fffffffL time_t g_tick_local_time; #ifdef CURRENT_TIME time_t g_current_time = CURRENT_TIME; #else time_t g_current_time; #endif #ifndef HOST_TIME /* * this array needs to be one longer than NUM_YEARS, because * the code tests to see if current time in seconds is less than * the start of next year... * how to generate this: * get the dates for start and end of daylight savings * get the day of week for jan 1 (0-6, 0 is monday) * in python, do this for dst dates: * >>> time.strptime("13 Mar 16", "%d %b %y") * which will give you something like * time.struct_time(tm_year=2016, tm_mon=3, tm_mday=13, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=73, tm_isdst=-1) * use tm_yday for the last two fields (def above) * for seconds for jan 1 at 00:00, set hour relative to gmtime; e.g., here in u.s. est i used 5. field 7 (the 4) is jan 1 day of week: * >>> print "%08x" % time.mktime((2016, 1, 1, 5, 0, 0, 4, 1, 0)) * field three is is_leap. */ #define NUM_YEARS 4 const int16_t g_first_year = 2012; struct y_info year_info[NUM_YEARS + 1] = { /* unix time start jan 1 1970 */ // from 2007, dst begins 2nd sunday in march, ends first sunday in november { 0x4EFFE850, 6, 1, 71, 309}, { 0x50e26d50, 1, 0, 69, 307}, { 0x52c3a0d0, 2, 0, 68, 306}, { 0x54a4d450, 3, 0, 67, 305}, { 0x568607d0, 4, 1, 73, 311} }; #else #define NUM_YEARS 1 // these will be set by setZoneInfo() int16_t g_first_year = 0; struct y_info year_info[NUM_YEARS]; #endif // time_t g_local_time; /* from LocalTime.read() */ uint64_t g_local_time; /* from LocalTime.read(), now 64 bits to handle */ typedef struct { long gmt_offset; // long dst_offset; // short day; /* for J or normal */ // short week; // short month; // short rule_type; /* J, M, \0 */ // char tzname[TZNAME_MAX+1]; } rule_struct; rule_struct _time_tzinfo[1]; // gmt_offset can stay zero, because any CURRENT_TIME we get is from a local source command error_t Init.init() { _time_tzinfo[0].gmt_offset = 60L * 0L; g_tick_local_time = call LocalTime64.get(); call Timer.startPeriodic(10*1024L); signal Time.tick(); return SUCCESS; } command void Time.setCurrentTime(time_t current_time){ atomic g_current_time = current_time; g_local_time = call LocalTime64.get(); } command void Time.setZoneInfo(uint16_t g_year, time_t g_year_time, uint8_t g_zero_day, uint16_t g_dst_fday, uint16_t g_dst_lday){ g_first_year = g_year; year_info[0].year_seconds = g_year_time; year_info[0].wday_offset = g_zero_day; if(!(g_year % 4)) year_info[0].isleap = 1; else year_info[0].isleap = 0; year_info[0].dst_first_yday = g_dst_fday; year_info[0].dst_last_yday = g_dst_lday; } void dotick(int force) { time_t tick = call LocalTime64.get(); if (force || tick >= (g_tick_local_time + 32768L*10)) { signal Time.tick(); g_tick_local_time = tick; } } event void Timer.fired() { dotick(0); } /* * save this pending tos-2.x port of ip stack * event void NTPClient.timestampReceived( uint32_t *seconds, uint32_t *fraction ) { g_current_time = *seconds; g_local_time = call LocalTime64.get(); dotick(1); } */ struct tm __time_tm; /* Notes: * If time_t is 32 bits, then no overflow is possible. * It time_t is > 32 bits, this needs to be adjusted to deal with overflow. */ static const int8_t days_per_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, /* non-leap */ 29, }; #ifdef __UCLIBC_HAS_TM_EXTENSIONS__ static const char utc_string[] = "UTC"; #endif /* import time for y in range(2004,2008): t = time.mktime((y, 1, 1, 0, 0, 0, 0, 0, 0))-5*3600 print time.gmtime(t) (2004, 1, 1, 0, 0, 0, 3, 1, 0) (2005, 1, 1, 0, 0, 0, 5, 1, 0) (2006, 1, 1, 0, 0, 0, 6, 1, 0) (2007, 1, 1, 0, 0, 0, 0, 1, 0) from below in year_info struct for 2004-7 { 0x3ff36300, 3, 1 }, { 0x41d5e800, 5, 0 }, { 0x43b71b80, 6, 0 }, { 0x45984f00, 0, 0 } NTP Timestamp starts Jan 1, 1900 and is 2208988800 jan 1 1970 '%x' % (int(time.mktime((2004, 1, 1, 0, 0, 0, 3, 1, 0))) -18000 + 2208988800l) and now, (2009, 1, 1, 0, 0, 0, 3, 1, 0) (2010, 1, 1, 0, 0, 0, 4, 1, 0) (2011, 1, 1, 0, 0, 0, 5, 1, 0) (2012, 1, 1, 0, 0, 0, 6, 1, 0) */ struct tm *_time_t2tm(const time_t *timer, int localtime, struct tm *result) { uint16_t seconds16; int i; time_t seconds = *timer; uint16_t days; uint16_t hour, min; int isleap = 0; //if year_info has dst_first_yday and dst_last_yday defined, then HAVE_DST should be defined up top. #ifdef HAVE_DST int isdst = 0; #endif if (localtime) { seconds -= _time_tzinfo[0].gmt_offset; } g_seconds = seconds; if (seconds < year_info[0].year_seconds) { memset(result, 0, sizeof(struct tm)); return NULL; } if(NUM_YEARS > 1){ for (i = 0; i < NUM_YEARS-1; i++) { if (seconds < year_info[i+1].year_seconds) { seconds -= year_info[i].year_seconds; result->tm_year = g_first_year + i; isleap = year_info[i].isleap; break; } } } else{ i = 0; seconds -= year_info[i].year_seconds; result->tm_year = g_first_year + i; isleap = year_info[i].isleap; } g_year_seconds = year_info[i].year_seconds; g_seconds_from_year = seconds; days = seconds / 86400L; g_days = days; seconds -= days * 86400L; g_seconds_from_day = seconds; #ifdef HAVE_DST if (days >= year_info[i].dst_first_yday && days <= year_info[i].dst_last_yday) { isdst = 1; seconds += 3600; if (seconds < 0) { days--; seconds += 86400L; } if (days < 0) { result->tm_year--; days += 365; } } #endif /* HAVE_DST */ result->tm_yday = days; #ifdef HAVE_WDAY if(NUM_YEARS > 1) result->tm_wday = (result->tm_yday + year_info[i+1].wday_offset) % 7; else result->tm_wday = (result->tm_yday + year_info[0].wday_offset) % 7; #endif for (i = 0; i < 12; i++) { int8_t dpm = days_per_month[i]; if (i == 1 && isleap) dpm++; if (days < dpm) break; days -= dpm; } result->tm_mon = i; result->tm_mday = 1 + days ; hour = seconds / 3600; seconds16 = seconds - hour * 3600; result->tm_hour = hour; min = seconds16 / 60; result->tm_sec = seconds16 - min * 60; result->tm_min = min; return result; } command error_t Time.gmtime(const time_t *timer, struct tm *ptm) { _time_t2tm(timer, 0, ptm); /* Can return NULL... */ return SUCCESS; } /* Note: timezone locking is done by localtime_r. */ static int tm_isdst(register const struct tm *__restrict ptm) { // no DST in arizona return 0; } command error_t Time.localtime(const time_t *timer, struct tm *result) { _time_t2tm(timer, 1, result); return SUCCESS; } static char *wday_name[] = { "Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat" }; static char *mon_name[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; command error_t Time.asctime(const struct tm *tm, char *buf, int buflen) { char *out = buf; char *outmax = buf + buflen; out += snprintf(out, outmax - out, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec); #ifdef HAVE_WDAY out += snprintf(out, outmax - out, " %s", wday_name[tm->tm_wday]); #endif out += snprintf(out, outmax - out, " %s %d %d", mon_name[tm->tm_mon], tm->tm_mday, tm->tm_year); return SUCCESS; } command error_t Time.time(time_t *timer) { // 1/32768 seconds since last NTP response uint64_t o = call LocalTime64.get() - g_local_time; *timer = g_current_time + (time_t)(o >> 15); return SUCCESS; } // this does not do tz or dst conversion! utc in (the tm struct); utc out (t) command error_t Time.mktime(const struct tm *tm, time_t * t ){ time_t unix_time; uint32_t secs_per_year = 31536000; uint32_t year_secs, mon_secs, day_secs, hour_secs; register uint16_t i; hour_secs = (uint32_t)tm->tm_hour * 3600UL; day_secs = (uint32_t)(tm->tm_mday - 1) * 86400UL; mon_secs = 0; for(i = 0; i < tm->tm_mon; i++){ mon_secs += (uint32_t)days_per_month[i] * 86400UL; if((i == 1) && ((tm->tm_year % 4) == 0)) // we can add in a day for feb. 29 mon_secs += 86400; } year_secs = 0; for(i = 0; i < (uint16_t)tm->tm_year - 70; i++){ year_secs += secs_per_year; if(((1970 + i) % 4) == 0) year_secs += 86400; } unix_time = year_secs + mon_secs + day_secs + hour_secs + (uint32_t)tm->tm_min * 60 + (uint32_t)tm->tm_sec; *t = unix_time; return SUCCESS; } default event void Time.tick() { } /***************************************** * ParamView interface * save for ip stack port to tos-2.x const struct Param s_Time[] = { { "ntp time", PARAM_TYPE_UINT32, &g_current_time }, { "local time", PARAM_TYPE_UINT32, &g_local_time }, { NULL, 0, NULL } }; struct ParamList g_TimeList = { "time", &s_Time[0] }; command error_t ParamView.init() { signal ParamView.add( &g_TimeList ); return SUCCESS; } *****************************************/ } tinyos-2.1.2+dfsg/tos/platforms/shimmer/TimeSyncMessageC.nc000066400000000000000000000066631207233610700237410ustar00rootroot00000000000000// $Id: TimeSyncMessageC.nc,v 1.6 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * The Active Message layer on the shimmer platform. This is a naming wrapper * around the CC2420 Active Message layer that implemets timesync interface (TEP 133). * * @author Konrad Lorincz * @author Brano Kusy * @date June 19 2005 */ configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSend32khz[am_id_t id]; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC2420TimeSyncMessageC as AM; SplitControl = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; LowPowerListening = AM; TimeSyncAMSend32khz = AM; TimeSyncAMSendMilli = AM; TimeSyncPacket32khz = AM; TimeSyncPacketMilli = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/UserButton.h000066400000000000000000000035121207233610700225250ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform * * @author Gilman Tolle * @version $Revision: 1.1 $ */ #ifndef USERBUTTON_H #define USERBUTTON_H typedef enum { BUTTON_RELEASED = 0, BUTTON_PRESSED = 1 } button_state_t; #endif tinyos-2.1.2+dfsg/tos/platforms/shimmer/UserButtonC.nc000066400000000000000000000051371207233610700230060ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform. Get * returns the current state of the button by reading the pin, * regardless of whether enable() or disable() has been called on the * Interface. Notify.enable() and Notify.disable() modify the * underlying interrupt state of the pin, and have the effect of * enabling or disabling notifications that the button has changed * state. * * @author Gilman Tolle * @version $Revision: 1.1 $ * port to shimmer-style * @author Steve Ayer * @date February, 2010 */ #include configuration UserButtonC { provides interface Notify; } implementation { components HplUserButtonC; components new SwitchToggleC(); SwitchToggleC.GpioInterrupt -> HplUserButtonC.GpioInterrupt; SwitchToggleC.GeneralIO -> HplUserButtonC.GeneralIO; components UserButtonP; Notify = UserButtonP; components new TimerMilliC() as debounceTimer; UserButtonP.NotifyLower -> SwitchToggleC.Notify; UserButtonP.debounceTimer -> debounceTimer; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/UserButtonP.nc000066400000000000000000000050601207233610700230160ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform * * @author Gilman Tolle * @version $Revision: 1.2 $ * port to shimmer-style * @author Steve Ayer * @date February, 2010 */ #include module UserButtonP { provides interface Notify; uses interface Notify as NotifyLower; uses interface Timer as debounceTimer; } implementation { command error_t Notify.enable() { return call NotifyLower.enable(); } command error_t Notify.disable() { return call NotifyLower.disable(); } event void debounceTimer.fired() { call Notify.enable(); // re-enable interrupt signal Notify.notify( BUTTON_PRESSED ); } task void debounce() { call Notify.disable(); call debounceTimer.startOneShot(250); } event void NotifyLower.notify( bool val ) { // we've only enabled interrupt from rising edge post debounce(); } default event void Notify.notify( button_state_t val ) { } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/VoltageC.nc000066400000000000000000000040521207233610700222700ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * VoltageC is a common name for the Msp430InternalVoltageC voltage * sensor available on the telosb platform. * * To convert from ADC counts to actual voltage, divide by 4096 and * multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2008-05-21 22:07:24 $ */ generic configuration VoltageC() { provides interface Read; } implementation { components new Msp430InternalVoltageC(); Read = Msp430InternalVoltageC.Read; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/VoltageStreamC.nc000066400000000000000000000041021207233610700234400ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * VoltageC is a common name for the Msp430InternalVoltageC voltage * sensor available on the telosb platform. * * To convert from ADC counts to actual voltage, divide by 4096 and * multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.1 $ $Date: 2008-06-24 22:25:57 $ */ generic configuration VoltageStreamC() { provides interface ReadStream; } implementation { components new Msp430InternalVoltageC(); ReadStream = Msp430InternalVoltageC.ReadStream; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/000077500000000000000000000000001207233610700213475ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/bluetooth/000077500000000000000000000000001207233610700233545ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/bluetooth/Bluetooth.nc000066400000000000000000000104421207233610700256440ustar00rootroot00000000000000/* * Copyright (c) 2007, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Authors: Steve Ayer, Adrian Burns * February, 2007 */ /** * @author Steve Ayer * @author Adrian Burns * @date February, 2007 * * @author Mike Healy * @date April 20, 2009 - ported to TinyOS 2.x */ #include "RovingNetworks.h" interface Bluetooth { /* write SPP (Serial Port Profile) data to the connected BT device */ // note: max message length is 128 bytes, beyond that msg_append_buf wraps command error_t write(const uint8_t *buf, uint8_t len); /* after this command is called there will be no link to the connected device */ command error_t disconnect(); /* commands useful for Master(client) applications only */ /* do an BT Inquiry to discover all listening devices within range */ command void discoverDevices(); /* connect to a specific device that was previously discovered */ command error_t connect(uint8_t * addr); // enum SLAVE_MODE, MASTER_MODE, TRIGGER_MASTER_MODE, AUTO_MASTER_MODE command void setRadioMode(uint8_t mode); command void setDiscoverable(bool disc); command void setEncryption(bool enc); command void setAuthentication(bool auth); command void setName(char * name); // max 16 chars command void setPIN(char * name); // max 16 chars command void setServiceClass(char * class); // max 4 chars (hex word) command void setServiceName(char * name); // max 16 chars command void setDeviceClass(char * class); // max 4 chars (hex word) command void disableRemoteConfig(bool disableConfig); /* * rate_factor is baudrate * 0.004096, e.g. to set 115200, pass in "472" */ command void setRawBaudrate(char * rate_factor); // max 4 chars, must be integer /* * provide one of the following as a string argument: * { 1200, 2400, 4800, 9600, 19.2, 38.4, 57.6, 115K, 230K, 460K, 921K } */ command void setBaudrate(char * new_baud); /* save power by minimising time Inquiry/Page scanning, call these commands from */ /* your StdControl.init() - module reset necessary for changes to take effect */ command void setPagingTime(char * hexval_time); // max 4 chars (hex word) command void setInquiryTime(char * hexval_time); // max 4 chars (hex word) command void resetDefaults(); /* whether or not it succeeded */ async event void connectionMade(uint8_t status); async event void connectionClosed(uint8_t reason); async event void commandModeEnded(); /* * buffered data depends upon line demarcation or eot for this... * event void dataAvailable(uint8_t * data, uint16_t len); * and this... * event void discoveryStatus(uint8_t * devices); * */ async event void dataAvailable(uint8_t data); event void writeDone(); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/bluetooth/RovingNetworks.h000066400000000000000000000013661207233610700265340ustar00rootroot00000000000000/* radioMode in enableBluetooth() can be set to one of the following modes, see the RovingNetworks AT command set for further details on module configuration */ #ifndef ROVINGNETWORKS_H #define ROVINGNETWORKS_H enum { SLAVE_MODE, MASTER_MODE, TRIGGER_MASTER_MODE, AUTO_MASTER_MODE }; enum { NADA, INITIAL, FINAL }; /* const char * SETMODE = "SM,"; const char * SETMASTERMODE = "SM,1"; const char * SETSLAVEMODE = "SM,0"; const char * DISCOVERRADIOS = "I,"; const char * DISCOVERRADIOS2 = ",0"; const char * SETFASTBAUD = "SU,115"; const char * ENTERCOMMANDMODE = "$$$"; const char * SETSLEEPMODE = "SW,0300"; const char * DIALRADIO = "C,"; const char * HANGUPRADIO = "R,1"; const char * WAKERADIO = ""; */ #endif tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/bluetooth/RovingNetworksC.nc000066400000000000000000000047201207233610700270050ustar00rootroot00000000000000/* * Copyright (c) 2007, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Author: Steve Ayer * February, 2007 */ /** * @author Steve Ayer * @author Adrian Burns * @date February, 2007 * * @author Mike Healy * @date April 20, 2009 - ported to TinyOS 2.x */ configuration RovingNetworksC { provides { interface StdControl; interface Bluetooth; interface Init; } } implementation { components RovingNetworksP, MainC, HplMsp430InterruptC, HplMsp430Usart1C, LedsC; StdControl = RovingNetworksP; Bluetooth = RovingNetworksP; Init = RovingNetworksP; RovingNetworksP.UARTControl -> HplMsp430Usart1C.HplMsp430Usart; RovingNetworksP.UARTData -> HplMsp430Usart1C.HplMsp430UsartInterrupts; RovingNetworksP.RTSInterrupt -> HplMsp430InterruptC.Port16; RovingNetworksP.ConnectionInterrupt -> HplMsp430InterruptC.Port15; RovingNetworksP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/bluetooth/RovingNetworksP.nc000066400000000000000000000433641207233610700270310ustar00rootroot00000000000000/* * Copyright (c) 2007, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Author: Steve Ayer * February, 2007 */ /** * @author Steve Ayer * @author Adrian Burns * @date February, 2007 * * @author Mike Healy * @date April 20, 2009 - ported to TinyOS 2.x */ #include "RovingNetworks.h" #include "shimmerMessage.h" module RovingNetworksP { provides { interface Init; interface StdControl; interface Bluetooth; } uses { interface HplMsp430Usart as UARTControl; interface HplMsp430UsartInterrupts as UARTData; interface HplMsp430Interrupt as RTSInterrupt; interface HplMsp430Interrupt as ConnectionInterrupt; interface Leds; } } implementation { extern int sprintf(char *str, const char *format, ...) __attribute__ ((C)); extern int snprintf(char *str, size_t len, const char *format, ...) __attribute__ ((C)); uint8_t radioMode, charsSent, setupStep; bool discoverable, authenticate, encrypt, setNameRequest, setPINRequest, runDiscoveryRequest, resetDefaultsRequest, setSvcClassRequest, setDevClassRequest, setSvcNameRequest, setRawBaudrate, setBaudrate, disableRemoteConfig, newMode, setCustomInquiryTime, setCustomPagingTime; /* master mode stuff */ int masterStep; bool deviceConn, btConnected, runningMasterCommands; char targetBt[16]; norace bool transmissionOverflow, messageInProgress; char expectedCommandResponse[8], newName[17], newPIN[17], newSvcClass[5], newDevClass[5], newSvcName[17], newRawBaudrate[5], newBaudrate[5], newInquiryTime[5], newPagingTime[5]; norace struct Message outgoingMsg; norace struct Message incomingMsg; task void sendNextChar() { if(charsSent < outgoingMsg.length) { call UARTControl.tx(msg_get_uint8(&outgoingMsg, charsSent)); atomic charsSent++; } else{ messageInProgress = FALSE; atomic if(!*expectedCommandResponse) signal Bluetooth.writeDone(); } } // note max message length is 128 bytes, beyond that msg_append_buf wraps command error_t Bluetooth.write(const uint8_t * buf, uint8_t len) { if(messageInProgress) return FAIL; messageInProgress = TRUE; atomic charsSent = 0; msg_clear(&outgoingMsg); msg_append_buf(&outgoingMsg, buf, len); if(!transmissionOverflow){ post sendNextChar(); } return SUCCESS; } void initRN() { register uint16_t i; /* * powerup state is reset == low (true); mike conrad of roving networks sez: * wait about 1/2 s after reset toggle */ TOSH_SET_BT_RESET_PIN(); for(i = 0; i< 400; i++) TOSH_uwait(5000); TOSH_MAKE_BT_PIO_INPUT(); // this is the connection interrupt pin, was default output call RTSInterrupt.edge(TRUE); // initially, we look for a connection call RTSInterrupt.enable(); // request to send raises when bt has trans overflow call RTSInterrupt.clear(); call ConnectionInterrupt.edge(TRUE); // initially, we look for a connection call ConnectionInterrupt.clear(); call ConnectionInterrupt.enable(); // interrupt upon connection state change (raises when connected, falls when dropped) TOSH_CLR_BT_CTS_PIN(); // toggling cts wakes it up TOSH_SET_BT_CTS_PIN(); TOSH_uwait(5000); TOSH_CLR_BT_CTS_PIN(); // tell bt module msp430 is ready } void setupUART() { msp430_uart_union_config_t RN_uart_config = { {ubr: UBR_1MHZ_115200, umctl: UMCTL_1MHZ_115200, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1,listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 0, urxwie: 0, utxe : 1, urxe :1} }; call UARTControl.setModeUart(&RN_uart_config); // set to UART mode #ifdef USE_8MHZ_CRYSTAL // we need exact divisors, else the thing acts unpredictably call UARTControl.setUbr(0x08); call UARTControl.setUmctl(0xee); /* 4mhz smclk call UARTControl.setUbr(0x23); call UARTControl.setUmctl(0xd6); */ #endif /* * to run the bt module at 230k, first the application must configure it * using its default uart speed of 115200, then reset the uart to 230k here * see accompanying bluetoothBaudrateConfiguration.pdf doc for details * yes, doc is written for tos-1.x, but setClockRate() is just broken into * two calls here in tos-2.x * call UARTControl.setUbr(0x04); call UARTControl.setUmctl(0x82); */ call UARTControl.enableTxIntr(); call UARTControl.enableRxIntr(); } void disableRN() { TOSH_CLR_BT_RESET_PIN(); call UARTControl.disableUart(); call RTSInterrupt.disable(); call ConnectionInterrupt.disable(); } error_t writeCommand(char * cmd, char * response) { atomic strcpy(expectedCommandResponse, response); if(call Bluetooth.write(cmd, strlen(cmd)) == FAIL) return FAIL; return SUCCESS; } /* * Connect and Disconnect commands are exceptional commands in that * they automatically return to data mode once they are issued */ error_t writeCommandNoRsp(char * cmd) { if(call Bluetooth.write(cmd, strlen(cmd)) == FAIL) return FAIL; return SUCCESS; } command void Bluetooth.setRadioMode(uint8_t mode){ newMode = TRUE; radioMode = mode; } command void Bluetooth.setDiscoverable(bool disc){ discoverable = disc; } command void Bluetooth.setEncryption(bool enc){ encrypt = enc; } command void Bluetooth.setAuthentication(bool auth){ authenticate = auth; } command void Bluetooth.disableRemoteConfig(bool disableConfig){ disableRemoteConfig = disableConfig; } command void Bluetooth.resetDefaults(){ resetDefaultsRequest = TRUE; } command void Bluetooth.setName(char * name){ setNameRequest = TRUE; snprintf(newName, 17, "%s", name); } command void Bluetooth.setDeviceClass(char * class){ setDevClassRequest = TRUE; snprintf(newDevClass, 5, "%s", class); } command void Bluetooth.setServiceClass(char * class){ setSvcClassRequest = TRUE; snprintf(newSvcClass, 5, "%s", class); } command void Bluetooth.setServiceName(char * name){ setSvcNameRequest = TRUE; snprintf(newSvcName, 5, "%s", name); } /* * this one makes sense only to roving networks * the supplied "rate_factor" is the baudrate * 0.004096 * this factor must be an integer value... */ command void Bluetooth.setRawBaudrate(char * rate_factor){ setRawBaudrate = TRUE; snprintf(newRawBaudrate, 5, "%s", rate_factor); } /* * to set the baudrate of the BT to MSP serial interface * as per RovingNetworks command spec EG "SU,96" or "SU,230" * SU, - Baudrate, {1200, 2400, 4800, 9600, 19.2, * 38.4, 57.6, 115K, 230K, 460K, 921K }, * BUT, the MSP USARTS will not run at > 230K in UART mode, * see MSP user guide */ command void Bluetooth.setBaudrate(char * new_baud){ setBaudrate = TRUE; snprintf(newBaudrate, 5, "%s", new_baud); } command void Bluetooth.setPIN(char * PIN){ setPINRequest = TRUE; snprintf(newPIN, 17, "%s", PIN); } /* * Sets the Inquiry Scan Window - amount of time device * spends enabling inquiry scan (discoverability). * Minimum = (hex word) "0012", corresponding to about 1% duty cycle. * Maximum = (hex word) "1000" */ command void Bluetooth.setInquiryTime(char * hexval_time){ setCustomInquiryTime = TRUE; snprintf(newInquiryTime, 5, "%s", hexval_time); } /* * Sets the Paging Scan Window - amount of time device * spends enabling page scan (connectability). * Minimum = (hex word) "0012", corresponding to about 1% duty cycle. * Maximum = (hex word) "1000" */ command void Bluetooth.setPagingTime(char * hexval_time){ setCustomPagingTime = TRUE; snprintf(newPagingTime, 5, "%s", hexval_time); } /* * IMPORTANT: Connect and Disconnect commands are exceptional commands * in that they automatically return to data mode once they are issued * so no response and no "---" needed to return to data mode */ task void runMasterCommands() { char commandbuf[32]; switch(masterStep){ case 0: masterStep++; writeCommand("$$$", "CMD"); break; case 1: masterStep++; // Connect if(deviceConn && (!btConnected)){ masterStep = -1; sprintf(commandbuf, "C,%s\r", targetBt); writeCommandNoRsp(commandbuf); runningMasterCommands = FALSE; break; } case 2: masterStep++; // Disconnect if((!deviceConn) && (btConnected)) { masterStep = -1; writeCommandNoRsp("K,\r"); runningMasterCommands = FALSE; break; } case 3: /* not needed for connect and disconnect commands */ masterStep++; // exit command mode writeCommand("---\r", "END"); break; default: deviceConn = FALSE; runningMasterCommands = FALSE; break; } } command error_t Bluetooth.connect(uint8_t *addr) { masterStep = 0; deviceConn = runningMasterCommands = TRUE; strcpy(targetBt, addr); post runMasterCommands(); return SUCCESS; } command error_t Bluetooth.disconnect() { register uint16_t i; /* * Delay: If any bytes are seen before or after $$$ in a 1 * second window, command mode will not be entered and these * bytes will be passed on to other side */ for(i = 0; i < 1600 ; i++) TOSH_uwait(5000); masterStep = 0; deviceConn = FALSE; runningMasterCommands = TRUE; post runMasterCommands(); return SUCCESS; } /* * this one is weird. we need to do one at a time; the only way * to get back is if the previous command responds properly and calls * back to runSetCommands(). so if we get into command mode, each time here * we have to send another command. we keep falling down the switch * until we find it, eventually hitting end. */ task void runSetCommands() { char commandbuf[32]; switch(setupStep) { case 0: setupStep++; writeCommand("$$$", "CMD"); break; case 1: setupStep++; // reset factory defaults if(resetDefaultsRequest){ writeCommand("SF,1\r", "AOK"); break; } case 2: setupStep++; // default is slave (== 0), otherwise set mode if(newMode){ sprintf(commandbuf, "SM,%d\r", radioMode); writeCommand(commandbuf, "AOK"); break; } case 3: setupStep++; /* * device is discoverable with a non-zero inquiry scan window * default "time" is 0x0200 (units unspecified) */ if(!discoverable){ writeCommand("SI,0000\r", "AOK"); break; } case 4: setupStep++; // device default is off if(authenticate){ writeCommand("SA,1\r", "AOK"); break; } case 5: setupStep++; // device default is off if(encrypt){ writeCommand("SE,1\r", "AOK"); break; } case 6: setupStep++; // default is none if(setNameRequest){ sprintf(commandbuf, "SN,%s\r", newName); writeCommand(commandbuf, "AOK"); break; } case 7: setupStep++; // default is none if(setPINRequest){ sprintf(commandbuf, "SP,%s\r", newPIN); writeCommand(commandbuf, "AOK"); break; } case 8: setupStep++; if(setSvcClassRequest){ sprintf(commandbuf, "SC,%s\r", newSvcClass); writeCommand(commandbuf, "AOK"); break; } case 9: setupStep++; if(setDevClassRequest){ sprintf(commandbuf, "SD,%s\r", newDevClass); writeCommand(commandbuf, "AOK"); break; } case 10: setupStep++; if(setSvcNameRequest){ sprintf(commandbuf, "SS,%s\r", newSvcName); writeCommand(commandbuf, "AOK"); break; } case 11: setupStep++; if(setRawBaudrate){ // set the baudrate to suit the MSP430 running at 8Mhz sprintf(commandbuf, "SZ,%s\r", newRawBaudrate); writeCommand(commandbuf, "AOK"); break; } case 12: setupStep++; if(disableRemoteConfig){ // disable remote configuration to enhance throughput writeCommand("ST,0\r", "AOK"); } else{ // disable remote configuration to enhance throughput writeCommand("ST,60\r", "AOK"); } break; case 13: setupStep++; if(setCustomInquiryTime){ sprintf(commandbuf, "SI,%s\r", newInquiryTime); writeCommand(commandbuf, "AOK"); } else{ // to save power only leave inquiry on for approx 40msec (every 1.28 secs) writeCommand("SI,0040\r", "AOK"); } break; case 14: setupStep++; if(setCustomPagingTime){ sprintf(commandbuf, "SJ,%s\r", newPagingTime); writeCommand(commandbuf, "AOK"); } else{ // to save power only leave paging on for approx 80msec (every 1.28 secs) writeCommand("SJ,0080\r", "AOK"); } break; case 15: setupStep++; if(setBaudrate){ // set the baudrate to suit the MSP430 running at 8Mhz sprintf(commandbuf, "SU,%s\r", newBaudrate); writeCommand(commandbuf, "AOK"); break; } case 16: setupStep++; // exit command mode writeCommand("---\r", "END"); break; default: break; } } command error_t Init.init(){ TOSH_MAKE_BT_RTS_INPUT(); TOSH_MAKE_BT_RXD_INPUT(); TOSH_SEL_BT_RXD_MODFUNC(); // this powers it up on models so equipped, otherwise harmless #ifdef BT_PWR_LOGIC_TRUE TOSH_SET_SW_BT_PWR_N_PIN(); #else TOSH_CLR_SW_BT_PWR_N_PIN(); #endif newMode = FALSE; radioMode = SLAVE_MODE; discoverable = TRUE; authenticate = FALSE; encrypt = FALSE; resetDefaultsRequest = FALSE; setNameRequest = FALSE; setPINRequest = FALSE; setSvcClassRequest = FALSE; setSvcNameRequest = FALSE; setDevClassRequest = FALSE; setRawBaudrate = FALSE; disableRemoteConfig = FALSE; setCustomInquiryTime = FALSE; setCustomPagingTime = FALSE; setBaudrate = FALSE; /* connect/disconnect commands */ deviceConn = btConnected = runningMasterCommands = FALSE; masterStep = setupStep = 0; atomic *expectedCommandResponse = 0; // NULL pointer transmissionOverflow = FALSE, messageInProgress = FALSE; initRN(); setupUART(); return SUCCESS; } command error_t StdControl.start(){ TOSH_uwait(15000); post runSetCommands(); return SUCCESS; } command error_t StdControl.stop(){ disableRN(); #ifdef BT_PWR_LOGIC_TRUE TOSH_CLR_SW_BT_PWR_N_PIN(); #else TOSH_SET_SW_BT_PWR_N_PIN(); #endif return SUCCESS; } /* commands useful for Master(client) applications only */ /* do an BT Inquiry to discover all listening devices within range */ command void Bluetooth.discoverDevices() { if(!radioMode) // we're a slave, shouldn't do this return; runDiscoveryRequest = TRUE; } async event void UARTData.rxDone(uint8_t data) { if(!*expectedCommandResponse){ signal Bluetooth.dataAvailable(data); } else{ if(isalpha(data)){ msg_append_uint8(&incomingMsg, data); if(msg_cmp_buf(&incomingMsg, // which is affirmative 0, expectedCommandResponse, strlen(expectedCommandResponse))){ msg_clear(&incomingMsg); if(!strcmp(expectedCommandResponse, "END")) signal Bluetooth.commandModeEnded(); //call Leds.greenOn(); else if(runningMasterCommands) post runMasterCommands(); else post runSetCommands(); atomic *expectedCommandResponse = '\0'; } } else msg_clear(&incomingMsg); } } async event void UARTData.txDone() { if (!transmissionOverflow) { post sendNextChar(); } } // Interrupt associated with radio flow control. Ensures that there are no buffer overflows. async event void RTSInterrupt.fired() { if (call RTSInterrupt.getValue() == TRUE) { transmissionOverflow = 1; call RTSInterrupt.edge(FALSE); } else{ atomic transmissionOverflow = 0; post sendNextChar(); call RTSInterrupt.edge(TRUE); } atomic call RTSInterrupt.clear(); } async event void ConnectionInterrupt.fired() { if(call ConnectionInterrupt.getValue() == TRUE){ btConnected = TRUE; call ConnectionInterrupt.edge(FALSE); signal Bluetooth.connectionMade(SUCCESS); } else{ btConnected = FALSE; call ConnectionInterrupt.edge(TRUE); signal Bluetooth.connectionClosed(0); } atomic call ConnectionInterrupt.clear(); } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/bluetooth/bluetoothBaudrateConversion.pdf000066400000000000000000006377151207233610700316150ustar00rootroot00000000000000%PDF-1.5 % 1 0 obj <>>> endobj 2 0 obj <> endobj 3 0 obj <>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 4 0 R/Group<>/Tabs/S/StructParents 0>> endobj 4 0 obj <> stream x\oF â$ />pXq_6P2ȪH773˥v)--p-ofa'˗'Y|cFjrq>>=eg7qŊ]ϟ?,8KE 84~xXzxFx"G+3~`Wc9z;|tq$_'bl8.ap+OoXkTӌ_8qapBp.k cϟ9tH>Xv~ʘ=s/T?1eQ#kJͦs15G8ߏ'hs#ðLٰ%nKZ>n~2dž~$R8I+GHo([oDӟ-_\G2fQK y'ބ(8TEI;:'bEIҮn̥1ҍ: md.H$Do3)#i z!FF&}m ~ަd|sGfpSY%_K`L!M@Y h^̚n +\urHn5W:85lYT20QRE3mJ:@$Ouy雳Oc8y(;ÇjFG:uGY R̍]&y+Px)GuppEBzl MVTrޠqq( T ZjtuoGo8k%ŸG3>0Qt)+u&!'i='< yK}vڟ/Tv컸CZ2O.nAwȯCkϭm񰛢!FvqR] G6(0Ck4JR\߅L4]YEijD(靓<P{0/{p5!meEh1[M_Uy^BP,@X e7dXӬj@y3U-(*xPs:t# }A!b[;!YI*2Ob8Q$,cMi[E13c,=}~A}oQ(~2UavfNhTuy*E>kTxILUaҮ3'ҚJY?qU@@i1i6)x8]a*J[Fot4B0SZAHJֽ`Zr'*U*`*Zv 8" ed8%wnɄs˹%^В3N%ENsޡy pTo^C N |V8* ~*TX .܎MaȘ$mŪ6_ƭN]j} |*/T)0q5Hkr\& X;"&}Q ً)x=9?A~(R996wP횆qpQ0?HHK:8l}_y` l^b Hï^QϦNGHM SLlcǒ V>>-zTPMG8<ś8NS Se2=(|<=1VtEzʹ%GvYT=XN|}Wg,!BJiMqqd6\4Ld9OvUp@QqbBqSw`W(DqHO8dR6Ah/3E> J-,QPmATN<`^USBޱ▜.C'm]܄ L餿\hk({ ~aM'J=nN9oìğ|^#k܍tooLqwR_CVD2!H-$'w) oh47v3J2b̐^WX*OƂGܺ^`a+)m~Paj4KIbo0uŪ-IS(!zdSxA=ٯN7-!C[^%:b 9Uwj5۔E ij؜;Sx-I4ʥ5 pK,GqŖT37+=V[f|J emyFfCvO+a^\aY|rzcűFO{)K87g!h 8+iƑhjJS`+w~YA7ߓ\9脨G'2lGB7dXѝ~xQ 0uX!CQIWG(PRwTBzG64vDԎ(T~GGZ#ZvvcDp-.9GZ3SCm.yn8J!{,6 ^2zxmƘ"ҽ:86<  49eG'vecVv @@((i{]("CAgzo:EE@͢o/Z74ϼ`M7^ʣ*L=lA[ \K#`1isO~[$q}-a_}]7۴/A1"ͼ0U7mξӔqsom=aMwXhoDoZb&Wj}R;k|Nw?^5%qݥ&*ٻTJmd{ ޢR'P\}>vz#)w %-;sMNV"Kj;u`t΢mq&[+)#dܵ;mZi_LHtz]L2D[o;tc=j{5ͮs$0$O#c^TK}@nZe&{;zy{y⎞U'o)q 3C-{4]%t=:$'$46>-" ('*Ը-݌ K޾Z; !Y'2^ڻ?;%*Wv $joqde..L 0 jl҃ekxj\k;u_`YktIYw¾ ?ECc\f5ڴ(綠%Lj;lޱ}rmTVGո%#HS L5>ݭ*McPpwglcIb#d+[+j#cs;J3=B ߜu>@7e鐵h"+/@,f3 9NUxQ10pO8 d6Tqc(-rVx&#oҾkS7I?wFGxŻFa^[ΡzwTwϐkf[kZ(ʕMd\Vz7}d_=!;?l8*IAaҧ eTϜoP 1XIכ'TGјjz??(4&DQe"[hl3vGgX5 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj [ 11 0 R] endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 17 0 R/Group<>/Tabs/S/StructParents 1>> endobj 17 0 obj <> stream xWmoH꧵t,7[Y ڴ%qBHkLY؋sB`{=o;̳|%`6>=!|9] IdLF`!Wd~;G2*by̌!'wwtAARrӒ}IE B 3|j y Gyt|H*')%qn`B'X-[0t 8+9V-7@EMo2;@<yPB3b&.$pEL82vMQ!K=IBEEF04ͤs jhaibDS{FXCP.!(ހDxIyH0+>g |hj W_^C7 (kU |۔Qj⑅Nd+nf[ HE֍pse(4Q> stream xTjP ܹ ⢻HPwUkwCiBRL&9s= 54pnAҬy3PI*B I~BTl4`A,g-0 K0XÄ6Hh gH Ŷl$<%$(pHC̣A,Pmju8ߠr>8DC8DCLD!-l/SÞS@^>sS )|fv>7|?0D47cqJJuKQJ.% =arK-ȎHCS$eG&tYri'(#QoMk/S4|n|$5^=}Tw|Y6Cl!śZm(C\fLLsIp>&/ endstream endobj 46 0 obj <> endobj 47 0 obj [ 226 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 507 507 507 507 0 507 0 0 0 0 0 0 0 0 0 0 0 0 561 0 0 488 0 0 631 267 0 547 0 874 0 0 532 0 563 473 0 0 0 0 0 0 0 0 0 0 0 0 0 494 537 418 537 503 316 474 537 246 0 480 246 813 537 538 537 0 355 399 347 537 473] endobj 48 0 obj <> stream x \032,3 0&*lB0 I*fd-Ŷvøieevۭ춗r2>3j~l9yϙ@4dP_X3y1+`;o07WU4}qz':}eٔx0zrEe8e,2~Z㛓ɍ޲/hx2@mZ;} ^Ayںz* 0o2s7oߵ`- `jPE.h[`a~ÂVX~°Ύw&>|e@A'*t{5ƯxJeg奧Ԏ%BGOO<-זyI? lߢ ߚa~o;mQǥ7nxߵx鲡z۳w-2>-ߊ>N[&*O€_?9i·|uRVЅO}6>Jq\#k[@g9 Vm+`(s{05L~<pa 蕂(f>Pu6d卂pOyO#adſVk{Y֟ϣoT]eGʒ]7(.dP<^| f7rX?2.^::S e7@1p$`0=r#xj^/{%)~X s6Gy7k듍^0¹b T/M aPtW ': xT*=;"~M~_g7*OW[/KnùߏkPwn(̾Sk{yT9Fq;cRw1Ie .ẂC̨tȶn{ FًۻB~/]CP | 3 (D C1; +3J&r!; mCx>) 0^ ;ӭ?.?~?% oAL[ǣ¡JfoPz2hfhAT^/> 9$ ۡDA! ;ȼpc^2Nk|AIOjX Ƙ1O&@ZH< ePZzhfl]nZۺdCC?gZWC?h[{=C 07 5mhX%]ϲ0.?/[sC8 K CQ'Hw;o? {38 z_T͙=3ZMMR{BMʊIҒ+vee9)dklѠiԪ0B.V9Y[dfmAGYz3l 0!+Viٌf _\aop9#IIVYaV[jygoekקQ;YЧ`P!_0) U DGe[œ"\*˧()l y"[_ލۚm0SX{ϘKWW]e+*}v,vp'wޯot-Q8 _. Caa II-{`.F|= \<SR<'2՞ć533זޗ6l;^QA~kjy*0i /ۍm؉ >e/#T,ll}:/箬UVPyY]7t/fޖKj oTmnﳶq~η5|t_K?%I5JoGYyϕ0[`[hV7{L0pIQ>el !3%hC(I"Z^mNjIgdI(ˀ6Q=?4 JUvThBK;~;`Ř#gu(It:T|cm>5;-vCf7ki|k 3ΒQ1J/09qVeC*'KhQ5d[on6| gMEhVfj ޶}OoWekg1/^kol`:yy%*jYmSYV&=e}v64hedžfֲLkeõ] \˕K W`&kRo)P`f4E^h9@KNQf4T'd.fW騙ׂ6T TX*XZTIytLplp=Z2x [lAʔ;yE{l⣠v\¶Ac3iZIJ-|2׈SR4$ʜDڧra$eK 5^]4 > 9• Lm a^LC?L+ oT}:GM._{a(s_#42V{E;+F\Yvr̻pbCK ̰̌:I;~Wn>/|$Zo 7~K&߄ _Qڗ903¿r))?!|L!? [Tw)!bmM5Jx2 /^ VB^= [' BIp;6Ÿ R[7n"HLpe'5 WQ+ W.'\Fp }1eHK2\@XOXG8pߜXC!&KXE8p6a%a,™n2R.bXEN!,$t:y6B+aa6adL B?npDDh$L'4 S u)Z B5a2PI B)000PL(! |B!C& .B!ACH'R N3BcLN#Hi#X B"!`&M5DQ  N AMPQa%)9AF @" ?'|GT-#5)"|I903¿O >&|DOɎx߄3Kxo*Dpo*G7U "IxoD7U!^#Jx~w*%* E T9³gO|OROF{o*C REP"|&-!A",&NXD8p*xPD($# y\OB6!`$zB8A1gZ&a_GVᙉʧ(|(o( (<e7(7{+F>Ws"IXN&B)0M"DΦjidS z4TBa pPML"T*Ʉ$j`%XO#Rb&AQ~@;oQA7(_|#(}PEy8Ϡ<ʓ(O q(Cy>՝(;PlC^Us F1Ah'#%Z s 'ffZ̈́'&"g2 1tB!$8hPRv #qϭ!ʇѿrEPG9ʳ](D|e]\{kxWWeWjUfq-^_8z-+Q+3gm9ӫ9iWw{[nn^}eAT(o޽[._}Yt3=W'uk«U/.ݲ+[Dv` lKgI-IICKLUĶ${xFboזӫy[NŮ]ZZܲ;mszfygo=5;s o{ڟjz4y] [\SSQ_NR=URf]UJ VX[dĮD+PD+p/xg4qr]=B(d=CFo6 K7i9CzV=PsVqZ>kD'ܕSYun8+MӉGʭRRJӴsMZ:ӫ>S>S !f@a,Z%aH90vY_ScFFmrhzOU?6iSlw>.icBy/+]|1$7'zxC< hҒ1{iҥ2f eR,? e e#|Gh6a,F<8Z<ЀAkBa60PC<.\R[7jN,n8 VJ8Vz66p \ pl+*?p\~ 7M4]-[ ܍3Ýp޿Ei(~jn[P{jm>?l8fa/p4wxq܋#P-(`?<'pf<O3,|hIvdTA{ca5VG>z|tnc+9<61.8mz0{萿 Oy&ǃ#yp8SR_pGLgt? z%|0Ǝ} 8?Q)1]##ZIdL1S3-ӱpFʣR4)cRISIɢpa,qLdfeI,yDZp S,9i&)gp^+ZČMgL_~1X6& /ƴleRu\EPBTh:b,ƞ0tfOLЙͥbTQh܏g"00 7d3cQpAT(.al //D' .`\kĨDq&4r0EX41G21Ȱ0j9l:{AZ\aԂ2UǦ&$ƪ G!$Y{KR+tA ۜfNIXe1\=mxGZOpc wȀBo2ͻ*l'әǿħIi[N2=+АcQ6Ali|@F@:rrƈ"tw݂ٓcyIh>"HPV,յzjத$VygLugU;6fMEYrKW;ί:$-25S֙pN"ߠΝv {;$ݥeMΎ\US>73G=UH >V݊wΡwXө u>!U|*?z;1"0>GuzCIƣ=^5QX WpU ]^X^8Q5=u\&OlĦJ^Znx.4CY&Hu܎kw1)G1cH}MCzx\jF$NʽRٳ2$g0\ɩ4{TC# p0G.Yry@̳֒tD -#gpGĊ9-isXqٙM쪺ނqݢNF[S2g܊1@MDou1][؏qR[ !vjy<1CIj MH/13_ܿ(UtǸc;Sΐ,Źcrei91C2U'<'$eE.ҫEe-__Tѫe2Q˒r"yMfLtfݤSJ"ӊj\CNi+s* W:PC+$))Z3qfY;iB%YG;,Oo4I?O ѫFz|?ФLvBPگ":8|eQw52|/ɞ26!nnܺZ\'חD)储i4U'dDwOfϿnAɚ㲎$%Ō)qfddO.ku,Wx%*<MH2G;3(})l52!Ҡ~GlL֩gY;'oQQDQx d;L&ڼ&)t7,Fid0q9 ٤r]،HMUSJǧap9s̱EE^`8Z ӘdZCZdJQ{{` e{y@LMTC9[dО t-g10OTK'v, -qy{AtZQ~|rMdcntFM|ܤx3R6:h6,Dvvf1̵DHg'E0&c!u"hn%dB?)r2٩}ʅx;8k@ tpۑ+hu*1zW]wYF>99'Go  1(-Ud2UxX`7[*yϘfə`NQsä T1^Tc'43$81~6v=??pbt zj1p i{p ݴ`4ulM &3Ǚ[<"[m> 74.e ;S팓l5@~6/{a :]gZ0nFGqJ;*˜7sZrOf´JQfбoJ>ץ>~Y La~>L&ǧ%mHF2WXH>E}2i=D" 6ޅ"#tjU*^Y8.<>ulZУGqE(YеxT::++9#$m2iDg{b!R~dI tp,?ȣKuKd^tt1E՘xQVXjJЋ:nܚqYY3SI<2ir~|ҨiĂ3 Ei1v}fz9^ Y6'LBAfL _#'L Sq*!}loLvc+k<:fR!iWLMk\^W{ffsNqsz{pv%+ωg<b`ףn\upFkGr龜=3|AEo/=Ez*.'LRY_}pיf ݓgzr=9' gDf3)R1KVdNZ:M liz-|*y*kt2nmZ"xuOB")w)a3ރoᏉ&h>_xUB>!7 hR5@{8o&!U3*-! 3< PmxoT]V?[!kPE>jrķH(U|e2CicR' ?T1wzFDTJ3ꅿi,Eb f2Jb~j [MC ФAd;sI3inC@K(2jfC ~"`0Z1i3`/Ldv5b!4Vm}6wHtC18.$Tk$LyԁƔFZAuvJ{JTiw_HPNrhrjz^i\qKv.@3:dS$rU0ۡR^ΗʮeR ~G l >9A_,ROag $5BK k9!K[ ̶D$HEO ;Ud)%Y+%3@fM#I )$S;%pRqRC Dt tm hh%9oE|>}[[Pp=zT?'M4˒Heh%PC +F\;\ewaR%]MA.UAVG˰:S']oUb!l=1193Xf+ˆ՞pu#&۠28Q{EiY m( rn(kF7޳Rr^Kq۞~oG׆ԓ˕"R^d=Aecu4lړri! ҅X 8!27F?{{WwJfRTzI"Y۠;Mf=w 66ǀ}IIse%љF69Mj_&1ǐI$Z ԑR?{=] bRE,"99p76ߓ?xD׸0pleE<+^$D7/N|֏U]RKMXjI֟J,Tz xI!U)]ɵ,Xb]NUfCӹ-}Ay+^-g߭"xC=Sn1ym)4 ua,{nHTN"0T 3ݱO؋H>:dv܆K &cRġDm{;5$/ TU)^%Z )\MlR~ZhS֔ߟv /4ayۇ xTGR$LkK [R5Q¥Y煈GNL# gf sضY67,b@RvRlÎȓ6S>8A&̝`yk"9rN\䲟| W$yʗ˿;F5CnkIPyxآ_ؿCj5?vhHH*w=-n7uhGB`Z_XZ_\7;=mo[sD$=p\%S կ'ӑaΗw= = hyOl6!ŃcBF!<]$9 1q,𘁂PnL U`dEyj"ɭ~Fk?kdad99Fjg{t?ӝ-RV֤MT᪇1mwÐՁװI+r+]4QیF ]4H8xX *"P ʈ`{NpV ҀxOMlDc*\.1HѪ sR0y5 >~7GnfN"bs掉޾=qpn8&ڷ;9s7N=/.u2^1h8?5"Өr^y{;}ǟ8xk<<@$DP)3 ab&[21u-dǹXmt`0_I]$HoZh#]6_>' ]z$s(_ZOJMi4x鈧zrWd[#E*oGhw Wu[)dFU㵷'L";gAɓۦ(MM!k6qpٝ EYm.Hְ銇UV|fH`* 9}%\U¥'%}-½'Sk<HE7E:^i5Ho7w rĞkD2g6W< EXꖇF"D*}}bϣ%~8gg?#A.,o  Qs؎(3v?%짊S@T'*U6k+=0ix[o?g,qHs&buFHgtv *Zj?ԴhN%U]8/]\ bsv}r5Oj9]Q%A :]&ª:v B`PL4]:qum uU`E*XbR||ӭ46NP,%᜹T*VR$W+5ke8%<8R%S`-RSC}WRJ2هY(ugr?v㓓:?bC!˺:nx@>KwXU"c>xdxu!v?|c!1xYUJ4F' 8`6@s1ieSl%" "H95…_ԍ JzyDo:$yG$>yM|DbNp6JP@uRѾ$k5GFaNglEbMh@x*-AH k9୙_QWH[9t~JXAz])VrajZĨo-&Tzs#^׏t"ҸbY cRo#ykyH%E@PO 4+j%dO?Apļe 2bQÊosSq{-'R E?Gma4QVҘwdp> C^m++J|+0>3?1nrsw\\XT7>LЇ*ۛW&xg_0>! w:}mK9`'w}tz@4Әj'k/딷4 RM*PoTθ=ˆܮƂU'jV / xۼt=3&Fw[~(wģ.]!Z.^L{wߐ6g^?s{}̎CyaC0wuC$æLL]xbmd>Hd~+26 ܽHHyp][ ?]jL ÝzuOJxW, K[j;w6Q"P*ٽfooZ_/eҎ0ʔz;mchZ%G\Ib;_'fƚRbtOhRrcqDQ &Z;flAcFjAR=E ^o]7FFj5uo,:Ŕz}C]{}Bhĉ+aG,\~Rc r/o+nq @O/rM]u6? Rxmґt nM+t!RS3csQRT51ܖor_Wz[_Sjb t&K LrzX?zFzj>^!QB)!(%t~\R~MzMg/ y*_PO@@ْ<Y$l1֣rw16[^os)@>҇V3<6Xgb[);lr%2 '+nk#i A=Y~j$imR6t4䉩"K s+##P7tV$ro  9-f(9!i Q Լjo0ysk7`ı/-v?ᛇ4 Em)qJWj7-]Ug>yX[>uhU:9œ.;.kB߾C{N{;2 )H`{\xZ&pܣ3Kr#=3ZWPAt4tjK}_OpqG:6L'G IF]1nwΟ6Pگx.q3S5a/EL NH\p_*3 1@sz_)p^JbIs%#. 2R5t0 e,2@ DM$<᫯-7#^F$\{{~y:[ F́pB#9rmVtl3)M! 7ZAtR{|~W+`r"E[ v ;wOne:@,P+z.orÅF,qT,aqWҡdGV96S t$lu"$7M UR5Pv٥ZnrkA.lQ"DL#O"|iâ mކAz)}?̠iQqwoFTEwT-b۶E[Ƣ1&sb~5TB xWހ.BaK%J_aURqKPpEa\rߦ J!9hb Pi fߞӺFC/XknTqx-.Z&o$15d6S:~]G6KLᎱhl^#]csH;oϫT↝zY#4f 2MȂf=$_n+r+S{Rc9?x֫R9 Ԭ V%\yx?kd˵t_FHHgUy\|}e1DkX[ʡ!6AMdpC2unÅϲ`jhC6oEy b\u2'm-r[ Ҹ93,=."$)]ѕńM>:sk)t8KkjũS䫉A0D_6]t*wOib3`F2NdF ;p(@>T=Lۡ`KP҅*7jwwROh|vj qY̕׹@9uf Ԧ9k:~RY UR!SxYBh@ºܤ4AoVy"|(G!u"&aQp0yP~pb7AK~yy =U&a m-ehj5 Qm-`݄B5UQt5=ْ2*ekm$rQ>~ Ph">0ԎCOM ujyJK6fsW`R Ƕ}"n8ig>j xxxaA\ hnݵ0O+9쾋:sDAZ@N2 Png5~U;Z/yS-5Nqkk9M' *_6Ϩw"q?Pc1?KU:TR!O a뎐WFqJBHf^†D>/"6~Q8fSi:4y ?7B?ʗoWd{BL(vn;'3!wEZ?T`_ʸvHeRN#ӤVŃzMǧ}J26n X%a>OгPP!;)5m<,?:K<;__Scx*QE 쒳Öu8a/b&yC/$_;<髊ikk?c\gfљMyT 0ZR[!(̄bצOFF5AWG2G2RDQEі=6rQP*Zn1(&uuddPP_R cb tT%toK[teOm$+fkEk&&gaGOⅇYmYo$z~K?'FoNP̚m`5^$prv֬R9 z,Ke~` c<嘖|pyg8ur[;;EG/{l^LBl1ܳ5x*mf )w{rۧ? K;.=hd~,4!Y$6V#r+KS;=J$g5d ;.:)MIp:>T9^ۖt)a?mӒamגvƽˤJ']A)']jVD٤Q,( #0C(f4qzM҄եvEciPh/ 7# {t:T@[F=C.1q$vίflA(: ĢBӮQ~OB\=lj2v1P #41akhG-q-|Ց\yh@C.2C \:}Q9]i\\Aiм i,[zz#ͫ´bR"RLJu}/tM߂'T)7=Is`qrXUdMm&|)暭GF>-8KEAD&Ow|B{(+w|d+#ȂBZc6FȻv)ZPb smS؜@B1!4SVbݱRHRMc `ћh}7Ŕ5z@ZrL22,Ȏ3(5 ~5#5͑7E͉^z-d<0*З2QhL;MN DmZ.D6j3Ͳv-[,[wy#/84'Ql9Ȳc71 mJ^ ҅@6mQB N?xJh6Xsd9qҔ}Gw9wϹ̽;pE<^J@C%hl~B66$}Thk#R7㨢uIo,;>X`1!7ΛGs&V'Uׯ)˖f(/0<5 ֠3fQER]4} .j=z*a%0G\(-10b!?Ϝ m3̟n^% "_C GAv22c@qHyL#G/M跌H!enB@)rߔRP N ~gScƘݞivX04#p}oy齂}u57 ۂUKS-襜0')ʢ?}J.̷5^z6SfAk~FC2eȢpVz:BeNy?kE^U?7ڵbF## oৈZ"mqekďD b$r*hs*j߅6EluAhj&GD}Od}u 7ˆDb}"V<#5|Z}AH)VR,u[RKH# |IcvE.1\<eV0nhgx(^"lԸUNRvt6y:;=M ^oR*h ZM{jįXDŽ-I40-T%k$rWu5ׯp+-Y2}- }OLoVIyQ.:"UkkmZv8i]V&%BZ(Ze}e 5w,:YvJc/1:Y˖|meVtemeK sl>+r;sZC\vlE]ߪ- ڍ$x;){N~(`' 𛏋oȒKAS)H_[eS᧝CѵA8 ,G^9%,Yj/+*̲)4,lc#ztww3^2+Kn, -!c++ \ YW9*͔n 0ʌ(0(#\DUŞǏߞw+j*:F9|iQ~:6v8ܸ馍Eu÷ϳGC_>&(A1K?RkZ9e\IԘ/ApI~i-/_ h*߫ ʈzv8 yw[jKNGBm4'wmOMkF.*qQ'1 =;e,nTf<*1~uù$ d7YT1nWݱfsk@)QDJK{>&*Dĝ{[ .FϊX[yO4ǜusNA 7R;JCʕk+C+!F}m9K\tXCҵE8԰pt)Zͩe'l4Y%ѶR ZŞڮEjZ[+$d!2fqIJ)wnikg^[ YK[ftۧj#\lq^g%q[îm7-'gvVw:6GpUYjm9g;e';3u뚜 7<:hMx#$=r2rḍ[uW.qM]x-!-V6ۡ MVJW@3Z-Rs]qX QcHF!G.Cʍ"^P/i-F(/;ЉEKTy[ͭt%0ERCÆ5oTlnx!+/9Oɲ5-k3Ddi9CaǮE쯆HinFpecG'(Rh?S:N[D@4yUâ!gD'KJk׷XV ѨdהY,5Ieun;6T$ŗThTuXl)k/CkT}Z*ˬY<63˒epU8s*"C҉+`TasYVr#-kK-*M5ᵱkhc:|3dT ohc,cv!`ݣEHlL-{amlZei@%"5*WT|`qҎ{+fu}Uká2mBgEjTXjkv{E~1yV&R#a>e<8dG 餿QƂ{T6o{DjQ&k ?>xx|0AbokںȞ}[/pw=8/5C rυZBnï[LF0g_(#\-?+(VKN0Bb . 2? 5P8ʼ6e Qf)m 4Qh@u})䤦HkZSg-Vml*VOb{ݽ掛F*^drJ]Y[uyNedMZ;Ry}?sp %FzR'?_ģFX֗ }LǗ2 RW[JL=Ҳ펞 ><`subL)-= )Nm7dk񎺾Π:+a J+NV67bK[v™mqVݿ,d~xRDi[UfHZ9oJ㴺lKŚ`Lt_U4BenR3%hCzG8LBqrꔚ^A#|!$R3d(+̅5u2tB*|!.%mds`n52,m@4os؁څd>='o>o7pdY΢`n݊bdYEA}C/o{Ƕn~/y|߷]>]M=:g.[ԌN 33JI=HR"`P1wqIL$djI4x$j&oŵP22Py`[FYA^('(\µݽwZ,KO+U<$Q񴒟UȍtT"$!i- yho!dHq`Okrh6BSQ& )zjS끹Sϗ> &>͡q!lt*r-5zȯc0y";BitQZ tfhX14$ LUeOPtWH'uѶ=㊊ɜ rstHO(ճI%.Y;+N߸iQlhG =D/1ݞb^ (U7ͥs!֐ݎcJ֛V|{+YUe}yJ7lM޺BWe^,ȯz3͠VA_մ],ɗ(5 ֢7X"Zzmfu(l5JNFZ&Joҟ'H8ݡtkC "']ˆ;[lKWonV< pMGsh!G!GȏQ"?JG(%D~{999999!C A]=6  g$0SX(M> o##0t\#p# J S :p#Ox6;S ;LA̅1 w| @!wo| $>ȼp聽 I˒ X@ X?p/cA@A?wI dX?pKH\ ??3$NӔ) U21>-tAz=S1|ZB2+ŧetYrjV> JO~QɧLӈK4M _ e~O ( |ZbjBC>-|ZJid!>-COɧTlV|ZEUH@ۙKsvҜ4gg.ٙKsvҜ4gg.ٙKsvҜ4gg.ٙKsvҜX UAjz85D fHũaȉBjÞF@Nj&[(^lAfEA"J?z l C ,A. ak/P ȏ<GA@ Z 1%X)2L겔ԵrpG ?B~:ף$h T)X,ƣR*3#u읲64`1 C kHW K"A$g(AީKRaOC7 aa|ǸG~\/q7W"5 :bpw2ðu==<4R0̫W50)/߿@,A[mTRZ)~r?8}=!·iaN;^c"KZ3n1 PzqZ[Q<ߖ2jeCy߽ KTܱ Xh/!?I@{w@8b4_k*G6\K'-p L6Lbw4Ki()rlzK~!Jr3p}d%e~P6V4Bl؛d?4\ Rm?Fj:ȷ~NWpܛ/7E %sIQ ^m4=Y>rg^ su> puVOUzI\$5|ŚrvϳiolUFȑ$FDzd?sW?_'Qce@"KCP< ~vMt0&2Fzxav`7dÃ,}h87HG`otp0;9 #a?4E‰xdGl4e a@A20ҟ@@$ÑQ0CC{]= 6:&p=G>vGt'Q%Y0ٞ<; ʏeaK< ՆH wBpzO AFqp|+ gW8"q2٦Z` [{ 'DP`Jň"1 !'coaWA FpD8ն zx42_> {Dd޽r@Ib<63/I &yQ CvcMC#`qvd8 Jx7Fc[ny#썓 x۽=2`OH/Cxz@*2𳩲ix^624j0% ""7õtĮ:R`qW;?,09`F}42"K*t- (;ñ1~H%WPS }HlRSd8ϰ(mS1U>ZK@ fU^*Vcy&x kX^pϵ e|\B ^?.U0}> x xxI.o/[ka$}>x:7/T^B{}~>xg9 2^Mw%Q;xo_I{xxwi=W j~6wx? x xg/"^*w x8xxOޟ;;@+WCf%0-f; x? xS9{&DBxKo] xw{# }> x xxfoF- xo] x㕭k~xq{}  Y3 z V5[Ӏ%*}hf~5:ļN;0=x_p(4M_aM])ӳZ/%Mr33)%z/t ΜO"f '1=1ΛffH>fH@1\T䛰 A`%DgfbSc335HiJ )8C>J" %k@qP%Cg9gcbAR,ȑ3s!Ih$( QՃDر|.r{1ۧ.6b&0XAM&y![h* (bCΦR,Xe:e8H 4|ǢL"2Z/?ȱR%bqi2jsLd'r/Qw[]nZ{umk]Jmi"xXY.m-U$j|A1 (AIK$h"`3b$>@c6!3}?I26EXغ{wkcO/Q/qǡp;t-eݳs}N5[蛟UR~cQ}*;ɷ߽mbx_#ڈn*:>:[^3sxuZ5{ogTQ3:TV1m9/RV/oɓD8VG` {}Exfggo};pDwg9yw~xnߜ F&N{T{DeNoo/6p@o(۔Iݿ`@=2:G;KN֗k >977{0tNzczE[wx5NA07"acCw-sc߁9Tѧd 3~fʇ=ghnޡEF_#w"@iցG=s_f~?Za?lljх}>/hE3=m e2VmT>m3z7'gQ~p_oG]A~l@ۦO a^;0.sA;9V,J{&jק}]zrp\rrp[be~;_ӂ/Ge_;}y]7Oٗ3/oϾ33?/XCvE1ׯ1`TvGw<Ϩ`n}Gs Ğ*vOQ{f3,-~T{D|<z>6c?(:NO.=>O/~}_X~<{畞W:oLy8# ƒǰr\9lӰM|;:ovo>)nYt\K˿DoݱaN09͙=¹fsέrƹs} ww{|G`Ns{o鹍cϟw]3➱L -,}`\\ȶG:W/ /]ś{K/9qYK.xɕK-YԢ]t{уEE?zڣ~iK/}zic?VZ|rS-~(_rQ]%%eC]eeo߼O^^<#O鉰ӥJ+}㞜'ԏ_e^>Og|ͤ9|_y$xEςw^gřŖKQexJ$ *)|T|8=S>/8_—q&g+*uŹ8C 0 ą=\K0b$pW{N]?=?|Y%(R'ӬUwnVѳSTW9*+T]aLPu+T] UWBFeQ] UWBPu+T] UWB0z UW0+T] UW=3FU"TUE*BUPU"TUE*BUPU"TUE*BUPUsobqɬ؄3a\{5aoǺ=pGRDFa42U5$Le 8rs씏S>RG(|G|G|G|GZ>򑖏|l]>v.c|l؝ gqN,@,5\3oY-+ X+\` p.V X+\`zkڥv]zkuZ[Pߢ =6/ Zԡ2[b\l-rE."[b\l-fx;VV$U6a;v *!ױ o&D'ЭߒW{wx&YnV#u:HyGRHJIاcIX4uz'6Ml6Ml6Ml6Ml6Ml6M֚h>%廤|]RKwI.)%XhǺb8j-G娵rZ*2*2*Rn*Rn*Rn*Rn*Rn*K'`"untp*UfW2;\evplrv9[].nsS87ygjxgjxFO<^O<^e?.qُ~\e>.d|]2Kw*c(M2$M2$M2$M2$M2$MVժZUTjUQkZTjURJ+2!2!2!2!2=WeYeYeYeY= >Sp*>虨)0i LF6&M)0i L)0i Ld|aS`4&MIS`4&MIS`4&MIS`el Ld|cS`4&MIys^W9Uy5vMpO4|6Go3%|g_pk8_9W0M\o໸Ÿ#p)F"[X\+q>jPzPF!%(Rn bl7!gl0*r 7gjÜ6/8%`NS; {6#p)F"0cp\=zLd`#홭vjjکwжm6}{`mvݦomvݦomvݦom\+p{bW=\+p#~?v؇>VYjVYjVYjVYjVYjVYjJSkQzl‹7r'H?Sue}uyK8{ g/%e^V{Y}/eg9-SSm-vۢ%pvWdR2oډ7ěvM;i'vډvbةυ&P MTdg&ؙ vf`g&ؙ vf `+;M$;M$;M$;uS';uS';uvq]\Di.HaFc .X\0:3$LݙavvfgavvfgavvX0It.Ceh M b)C1J c9@YI<XU>4VYW(MƧ4iF^oūhE< m؎H!)rN(rN(rN(rN(rN(?P[TUEnQ[TG,m:KҦccccccccccccccccccccc#Ny?y?y?y?y%6cpW*\ WwBW\Bz+BW腮 ]B/t^qyqyqyqyqyqy 0z+BW腮 f|3D" o7C!]9r.t\ʹЕs+BW΅ ]9r.t\Q5Q5QcZ^ R R &L2A?df0gJf!gCtϘ̜ftmZ0 #S+$S+g0|V P P PwZ*X*XB+/P P P P P P YVHBRb+>?{>7TZ>~1:Y dcu A1:Y R R R R R d=g A3zY d=gZeZeZ dl` 2A ?d 2' R u R u R u R e R e R e R e R e R e R u AAA60 dl` AAAAAAL?oǴH+H+ecbA1-R_!R_!R_!RVJZ_+kB+B+B+B+B+Co{]<0J$ ?-*騒*騒*騒*騒*騒*P B) P BWUL\VI&$$bDlMI"6I&$$wQ/Q/Q/ ka4ҰVޓ=ix/XO$TnB&TnB&TnB&TnB&TnBQ{TGQ[TEnQ[T_B%T_B%T_B%T_B%T_B%T_B%Tޖb,A18 I<XUx`5E~rsXI*sx9^eRUJuV*YzMַF[h}k5ZoַF[ַUp .Se*L#/_5*yJ^ר5*yJ^ר5*yJ^S*9S*9S*9_~op=l6\ Æazp=lV)`LR0Y &azXVUazXVUazXVUar_UazXVUazXVUazXVݥݥUazXVUazXVUazXVUaR:EJH)"StN)R:EJH)Ua:E*J=RzI"]$w.FmF魑魑魑魑魑魑 }VzgY}V?{\[$E[$E[$x5F?fg3Ll~6S?fgc1l~6F?gc1p++g0ƳxV Ya<+g'U3%|g_pk8_9W0M\o໸Ÿ#p)F"27 ukZ7֭u+kZ֭sOMTCݛKݫE_3/{"H-{"~ocq7Ʊ8~o{VH-{"w;O{yz#ȚȚȚȚȚȚȚȚȚȚȚȚȚYE|>_E|>_Evfjvfjv]qzu&2 ]E,tUBq\E0`&~2rXxQN*J&LSr0=ݬ6VXyۇ}X\wԮ5~ >oF%C:;C:;C:;C:;C:;C:;$KEQE'TtBE'TtBE'TsR5'UsR5'UsRZOΉgz3͙Los9ۜ6g͙nsۜ6g g g:DЈ` -ܧSWT+* xE^QWT+*ZVUjZ UA*W ?̣9+)s;;s;;s;;Υ\Υ\Υ\\eF?{=v؁Dο1ֵI_jC 6jC 6jC+k{`쵂V Z^+k{`쵂V swey}fF rrD=Z X\qC.*nmyZ9縴=ǭwnZ+J]"f$!,d ~0Z{j_뼞?>$$>"\~9~hV^4MhES)Y Y _}MMnkOכvţI &z vỉY͢le(E,fQ6Y͢le(i:tͼכz3_o|nο?E|8 ?܁;q=~L̰ٳ,g>3E=SL3eVefUfVefUfVefUFz6г ۼk 44w~G3WO g Ƀ$=ci>ci>c)_)_)_)u_':NvjSk^_n#6n#6g{Q?5:GE7IMo}D$&7I&G Sh@;)C P=2yLBJP=D%z(CJP= k}ۼ4%ҔHS"ML^CJjTRԨM*ФBmmKD_"їD%/}KD_"E?OD?OD?O~#GY$E_$E_$E_$E_$E_$E_u_~A/tu/_ws{{E{ZFW=^"_)_)_)_)_)U_,F{BxLLLLL}(a9 iXNr#1✿6ħE=wsQ8iEq w)4ܓ?4<{G|X_ p)N=*"*"*"*"*"QkDFkDFkDF5"ykD^k^/1&7VW|_.߉w&ڬh͊6+ڬh͊6+ڬh3LLLiHKEZ*RnJ9"#9"#9"#9"#9"#9"#9"miH[E*Vh#l{(^ NxQxQxQxQxQُEHɻ"yW$$;"yG$óyHdHdHdHdHdHdH~aخ˿)'ϧ'vhϟOO`_ϿE"{?#ug=c#?wB%*PIJ*TR TB%*PIJ*T杪yjީw*yZ%Oi>Ă(Nv S}>,2;%T2?Ex(<3=&Yy^W1kxoM1 _Rx/ś)LfMp(N"CDV܆accccsE}}.9~ÿ\{?~(N"CD+b7A{b{.c?p b{C{3n cJp]>&Q<ǣO !`c >Bv. =lg_bGG{ܣɘCSJ285h[ 7xZ= wG8v(@!vB_#.]1aw ѝq`_|8b?ďMf܂[qnmTozۨFT޻Oiw1aAq.;3P8C 3P8C 3P8C 3P8C 3P8C 3P8C 3l}n0ʧRyO_$z-y˻p^wjOS=jOS=jOSZ^Z^k9D!ZrC-h9D!w"n_Zr@-j9PˁZr#-|F-ʷ<+轈ŹvDZvD ݽw슁 crm\[,˵rm\[,˵rm׼lZ(ʫjZ(ʫjZ(ʫWEwL£x #Sxg<^KxS ^Tu74LK^βb; ?~f~3*m~cҭt*ݪJ b_kZk- P(N"CD1+b7A{bS\Kq-ŵR\Kq-ŵR\K>\~O>{ vlηog;__;__;__;__;__^i;;>9+>!{q((#p$c08p"$ .gc,MٔMٔMٔMٔMٔMٔMٔMٔMٔMٔMٔMٔMT?F2^z W^D$EMR4I$EMR4I$EMR4I$EMR4I$EMR4I$EMR4I$EMR4I$EMR4I$EMR4I$EMR4? Tmj &j TjUZEժu~ O,<^x /c ^?57&ۘC,'Ȥ!:dR*x*|<6_UW+-Ҳ+-Ҳ+-Ҳ+-Ҳ+-Ҳ+-eWj]]vˮv.eW{]]Kvuɮ.%dW]]KvʮBU( eW*]PvʮBU( eW*]PvʮBU( eW*]PvʮBU( eW*]PvʮBU( eW*]Pvuɮ.%dWv_v}3n cJp]T'x(mP dW*]@vȮU dW*]@vȮU dW*]@vȮU ٵ=u{#zdWl'eW쪓]uNvɮ:U'dW쪓]u\vˮrU.eW*]岫\vˮղkZ&ɮekZ&ɮekZƩ՜Zͩ՜Zͩ՜*T99UΩrNsS*T99UΩxM> 8zp-ѺyE^/z׋^"yE$&7IM"oyțD$6D=a8q((#p$8q,8'b N>N8 p6Tq8BlQf[inV[inV[in=d޺޳4_]W%Մ_Wcr;~ٵFv]kdٵFv]kdٵFvȮU#jdW쪑]5FvȮU㤗u:eNzY'^I/뤗u:eNzY'^I/뤗u:eNzY'^I/뤗u:eNzY'^I/뤗u:eNzY'^I/+zeW]WvȮU#jdWJȮJȮJȮJȮJȮJȮ쪑]CvuȮ!:dWP NNNNNN'_/q|D18=8vFxyEAQ+:Or_а)6 Gͱ|==z bc2:M߹m/E11k1C?q6v~{0H-{֪GjWԻ~WE/ȍQcreUb3Zο:7``_f1,flc,1ƒY`o n ެ3qu}QORc.ӥ];=K?Ï̯82,]+qxwˏ78JyDu ^/+ ȍ>WLjͥ˩oWmުPo Po'kOר>:m7k6mVmX*i;ѧoro^'+~F6&'F:y_eas>JZOb!ZՄAzn~߼.S UXaWɰ+X>_b7ϗ a{1Y?n5ɯlJ{\_\]Ѭό>3[T[qnGI;ù\#xJ|2\`sU*6fnisf|şg])C;dh+:ң3!5Ӭn6`^^k7r>ZK]"A^ Wf2u&r0)H"IҤK̥\*oHmF1F1Z#t!c2F9w>/g4p-qnvU^ܯh54fmݹVFtjY+A_ƪ2V՗WZ3g}'QQ~2LV}m F^tQ+{b}>[Es2vfk*}B'ގˆ/6`SXSL!4Cxm|G8Y(KÇ]02g's^oݷOpe|__1xW?CSd)|0ɘCLɔ,9G}=åc}=LJq}?&,'Yue_ߓqKU\Urc].#W٩Fva=zequzSF,`Y*gRB)BE#e(r(2#bu5ںc=U[K,+R+W&3^܌+\[*#̼kͼ:_ ̴ [nrY۷ů.3132&35Z35Jm2U3،>e|QF~U7fd6Mf3lf6z:c,f:24Wq bfhfh]UGf}dv\ca:22{YV֕V1sOU׾L,7ޑCSM&? `ˍwuG+s8yy?y%HUi:_ŇX2,>ەz9~~$Պf5 myXγ*U_U4H(o&d F5JQVL=FdMFxUF(FtF` VuE'haFa6gr^.+|<ßss~Nϋp.Imm^/;D2K$D2A֭u+qC'XyϷ뾦ޕ+ʯD6mj;aZ{ZrZ{Wjm Z:u[dzZ;INRk'Q~ /%DNVk'hIj$XܬNRk'qZ;Iĥ묚O _+;ONRk'YAoIVj$vZ;×|+/WkeVkVkVko#{osg>'[bܻ2~3>s\*8W{8W\Z*v-^Z*6k\\{k\TSz8VʱFUp,r[ܪVz*!&r[opkJUʭRnr n=ȭ p#nr[?V)Jus*V)*V)ܪVUǭUƭRnr[*T)J95SrSO?qf;&\JXMjRsV;V|+s1%_7K-jT586; &N,*FkʟZ *fW(1S̲,/3{#wNQ-<]h.0J(+oYuFZηFZnV=O0h{r:Ϧl:Ϧ2ږ[iYbQSBRQ =JE<6׋_7SOb\WKme27|V[wV-ZhբNԅ q Ww_toݡoǂ T W֕f䪏쪏\Nu?^ծ5]U+Wƣ4ƅefLV9 S>?ȺUn_{Or"!ޢ2fm2f뻼y1ؾZo_ϩҬfS^j͟Κ8Q#.WkzÍ~vU'y2M?&bmb^eܮuALG%ͩ#vǢ.`zkMYjO&,=ΊGcL-[eחn6Ŭ}bjߚ_[c؜˱#ӮA\/efoRҢ#pQٵGUk.zIZL+aann[a?@k…/¥|^{f<ˌ̯i4*J|^YʹˍD_h˵ТCTS7|S1+\9A)WNpv|[WtWN7u~ڱIH)#>o o:5.%&}zNE=l~>Z1'cb'E]bgcwz`g U]kQQҿLɗs8e=M{pt(/'ͻ̻!w&<<諎vwZǧXK|q%E`^UpcF"z| e^$&s3:s39$!XUg䁔}i3j1<&ɵQsӣÍǗ?  6:Gxk4^Wnqu{<{]_Oۡ6ZC1z#]NtY'<.zzKO)=;zzGO=z){ SiӁ9/SjV蹖WN>v ?8ƩiҢf3#0#85̉g׆/ 7f$FCk6O}+ A08aFb8Gh8x1'd|TqY8cqV~2",|``}kW np `(pXsq|\#\NTOuu^k\x |O>Ij:yzWmb6=޿x^```G;/;?ÂѸ,|O):eY3 `f,0fY3 `f8?9 ߊ;lpQ@ Aa;v? AabUA5P @mP~MF 4 ĂF1hzۛdA"w` * IL#DLH1R@g`0`>x ,!tCTЎ&Δ-6Xu}ѰTA#Xq.ޮۉ$ɿ7#qx-Ļg}_&B`BL !0!&rD766666Ð|CaH> ɇ!Ðʯ&"&ÄpaBL 0!&D"`BLNIx<9ް{W){T0 Lk&<f,0s< C ^~!_~y;:6x`xlfp ~?\.X_t6{쵽XX> gajcY, , ,XXTI*֤#֤+d~ޥ7MvB>Êl<)_+sV)<'^ͷ;ζ{k{k{u;l[u;lü0o=[â|X_yp'drad]~Is< <l7w3 nr77Ǎqc{7Ǎqc{7Ǎqc{7+Ї a}=nl=nl=nl=nVm,6=nl=nl=nl8KdYDV;NdYDV;NdYDV;YDl=nv!]ar؅v!]!/$/$w={!#~һ,EN:)ױÉ=s|v]Xq3;;-`bbbbbubbbbb K%x>bQN`EΈNS7o7[hzf{U1pQM~)z*̼!N[O!6],K@}oX7V;ш;["qZFkFrB~8'y#>刺c!!2=N0fQF(E)-}O v)ϛ1;oad(U*:O *s' O/Eј 1tc2dЍyɨCDND9t=O؉ha^gmoڇp"q{`| C zk\}E5>̞9;7sgE;S:ېx{eVec2κVޡ}1z2⸨Y З"V36FXs/9syYp4u뵈68c{E""a'-2;9  F4`=^}4Zh#;ȼc۫3d8kzXqfTF323v)c2vOizH/E&P)n)`NWpf:n@P߷oMJkYE>zUB_3 oFm/:q=:q>⬹YgٕRd"+5QQVm.fV_*૽V\Vgsg7״<+ZFt>n@ Kyz;gz%洽®ٴ,*vJgGjQʈ:JYHYƨKOZFQʌK@fd_|?gӈS*z9G/eRٌ]h]n^1?A4p\_`~/"s9nv[DEe+/2(?Nrn%sEVlajjv䒩U+M-gg?/ohc}o쇨6W~qE.ZKZu@]ԣ}}>IY XЈk{lYQQ59֤Ns|nXSGڵ̨Lh39QyqĊLMPKD20jg$_Ѐ(7ќN#5s"ܡUi];b˵~ sWNkojeqb@zʬ@4c9׈9] Fgνqfe=ƭϹH4\u:k@34N,Oaf]kp>1pL/`{GuV1WJTO̟ZKsG}a'V}S:c( c@Dx|?ªœGoª%ކ< VXu絭zY~V`[qj] w }F0r5))YO7r|Β:#5yȏSiioHKpqodՌedVS#]F^gd#o1[^F7rp#Gf$#935G\j3FeebFc&#+c\kYb%G1yD_Mty%c nF2nLff$#99F.N^ք擂ٕ@)oKwz$~SjlFe8g>I,e!{EOΑ4R;duIYKR^%^}.7/kZQ+̿-C~CFc{cbNj)bG\H&g!T_\PHX孲Wž*סN١XEUE}Sq^޾}b_(I+JukkSQVZavUV8:_ys8ep\ׂ?(+·|A_7<da82;}Cp2He5+jd5&Ss>90uIsjXN[QU5Q\QZqV gpaմjY:V]UqprjVu"d`U + B0U:+}?Sp(Eqk-_үWvޡwtޥzޣKWk>K;vW~֫wyrbz_I\zޤ7-z~Oo }RO"}Z_=OK%zEBW}C%齥e/܇Yv0ܫ{Lh*]r c5YTz~Y[gGOХL.P3`ʆz^  ֯J?bEX $]GxD,#%uO>#9xA+/bXM7<ɫ5:-xG' 2ɡȢ9;@n[~q@Ca2#DxNgsq\'O"qZ_bQ"s}#ΊR+s?v{(.2qY\v 3r_OWdwjD_ЅP҇VF7~csXԃdԽ!r=T;񉞠'/%>ՏGqM'-=iѬSˢ0aN-4<-nڱJnb;zZ9DY~Լ_ֽk\7Zd NbpcbL'Xs.F%Xbh+#:"ɧPVjiQƳsTu+M-4Z10R4&~hÜVH|mm^6͘{Kْh+ۢ]eWn.,bD~ 9wfUg~A44`u 0.uĕ!j?EǪj 7CH_# Nb gJf3re3r9ȌlFðPC<"ʏ镟c3<.Oȓ yJRK[>/E}I.sb-'ov)Vq2 r Me'FC߸Km> F*5HNSgx#!QE.D5yE{ȭSԔnQ.ugU߯YVu+?dJZ\}\ͯ:SIb"MLpjxUgVo.lp𺷖-:w[ ?]U+Ko-r5JU麹u _ iҏIzLR'ZՠN5\՝wddL9iBJ|sR.'H?%5--%>8Xݿ{3S:'W2)3uTjrRfje]=w8FI7!uΝ\5C\\m\ߠ!ap \lbޙ2)_ͣn2뚊`XR&MIMNp͒W:K ,)˻X{Oԫ3r^ɞ|^Ƕm>pqWs\9f>Xuτm_2{fwث!cO{|ƾ-Vwxn݇CU^j56rŅ@}~'B\oOoֱæR/UQZڦՖU[VNxoCM=0{JêCvU9_8~{{W$ol?rjɳkͮs_W:cȹA'?e!ߝy4lLofoݠ4¬]~~$s5vxj̜ЮU -{qFwWҶ\J W'\6 \ɓu ]ZU:wjI-Yg\0g, 3CZhڮ?귮ܿ_'m׶+Y^z9Ӗ5[9y^=-0X5/ `cՋ!tmJ}dcQM7cB~%|o^^nk:}STptwC7}z7s{9YaumrRE>ivkJẏ9Q[){YQO? _.~}}[=v4~(̬}*9W-SC{o)=Er3~eo-# g^yqxÉ~ }zmo.ncѴq/FjWY훛?δU&s-%7D>OĩbtX%wf %\+87v^13#Er_ſ`6?gS'|ԫiYW^Ķ{>}#\U?Yࣟ{*eS=9&~kٮwvһs߃]uc[~0-†]O|e̽Gޚ臜1_X%_x䚉=[NۭGg׆D?to+.8;yC'^xyR¦굿Ow|q5cv,_Iɀ+^HΈ@9xMx4vϽvɶ䱣P'B ձIIvm05FeN PRteBx]I|H:a\#-L1ih9(v<8^@~vo'7"8z18]y F`j|Ö.9x9'ڽTSrbgLj.S( l,{or# d}I%$xmi{|f~Ŀu*Ď1^PA!ړuجH(?1W~j뫖Nگ;)5죾y`C L˾k )΄OMh &bѐ3c^YEszKճգuW8>?YTwM4OaݥFuEU?GH9(˄ (rxz߾CNI:k1[3dw4Th;Ǹ~Q}l {TD=wFCi9@PRQA?PN(ȧN7 o /ɹLl@\N e`@A QׅϺX~,j |۶/1f=80O]q{QT RIӰꋬҹ rK̦6*ӼvXx8oW%NoX|${&|-$VC͏ѕq<勘W`;5u$ݻS/Z+{e|SO>љ}/w)!J¬hw1yom]YEtle3d3k W@v7}s&l j6Yμw/uΊ4)6%An`R#y ſ[쓓YsKhPE"c7)Z qfs+ ).?:L1~1 ġXЇ!X Eg u'͔K\%E^$67iozXDžaHq9 mj=FzW Ý>/M3tCz3: 5Y7%:$]5?:&ajj~F?U<:s87G3]wR6cLk;C^~qn]κz:OQoqan "UM#,,ЪmH""UD]`0nЪ3ūM#y=ٵo!_Z@?± ?;?ZqvsXk>jls2ÉRIn~1;t'횎M6K`?mlO0ZPDECnT'ebX09պdo"b뫌&JSs;ٳBkˇH-$hFOD%;E͓y Nh썖e3?2; U0aHLa]6:Diq(_itVӷyhrUAz_;$*LTW5漳fe[ 'hzt5%xIDC&&[%ȭNih/$b1%@(O:N'?zkivs驐LOorB[B],9$HJW ^m0!t)0[BAl_  q _C" 6ݼpسxKjI(BH_Be.0gf6B6F+fҢ:F|*jWRv xc2RTcGs01$.,7w &}RR{Z"|q—Jѐgû-'^!Ɗ9B)UV^=}Z'$vxL4[ćr> stream x| |T{-dfL2$I$@a',,"KքMAMd7(jVnjɠ*ZZUֶhպ%s9-OlNeGi C-YI$~ͭ[Vj#JJ_ںnM+wIT9l_r?$e-nY)E}eg-&!zf–X^G.W!g5G}VHC5-\u'm[I"d4w-xH/-oY˂>S >$>Hr5=چdU W_I spgM7w2e1yɏT}3{u֛҃L"B= ugK4Zu*B֓*Da?!W7Yȵ3E˴M#ini&]3BG mTmOiMMZaf6'ˑý//b^4v*Dm<5Ӊu~_=~]y擩zVvLGCWGG<3>S5N:c4X}e2ѭsy {k:j:Jk>uǯk;~nZt"}W$cE0&NNλEyq44B?y՗RhΉ>Puu< eyGCic:j uJ_''^.]$ڡvD;c,;}kD[r\ڳGQ=ҮKyGi;QƜJyZ y?*.F7w;OokKIi6&ǩv-LD+=FzGL3Q=UF=.e Qj( ': ċ^_ ytwZC5F쇞AB{a5!#/ Ǵ u8]qs?@)J}X,BBD~XN94G_MMN*ԗPNT_ߠqY1Dj{hhw`ߩw2"fSWg4X$M4hu4({ '\rмf[F$QLGLُF 5+c't:|[E{BPeheh]h}h[e_zzH/$jG͉zfQ3~܄~M>xD:o@U{Rǽ?M~޽]DIDi6R:uJI/kJoԗ'R(4B0 9yFKh5p .fbX&Vb,.Kz+OMI7~d1YM6Snrb1PLe,;8o4k5[ >xoUg4>Q}@Ʒ} ه_?ٿҿ;ԗY?n,2msfjjh>mꔓk'OX]UY1a||IcnjU6rҁJ i^'٬ITC昩0\S3@-024B0UY&j6,AEGpȡKc¡ PU20C <UTb9T^u8ኅ%aw@:b}+;DqZߪ\1-62dبh+fYBKePGK;=nk[P]jo0- WmC^+ WVŊhD\ ?#t>|#-- I)xMW7˓}3B mkt)-ni2gEeVszs8ONUUsglЀx)C1yA- ÕH%D%1֪A(ҌA,nkW !9K*j5&jJ*eBU͕AVq 1,5QG,RXض(la}. 5b&)ܸIR3h؎* ˑ[ lF-7ق!T[xXdx0]FR脱F U OIv *jd.V.}2lpOoZX٫G4jNt0I_$695*K/΅MC3I΢?pSk(2QMژچpmݬFcd)/TZ`uq@Mh%kʞCpmCl%ҔHU"E %J$+R©C IJؔ*aQ¬I ] M %Q[.%Qk%RK%PJ|gJ|ߔD8GJ|%>PJE?+R=%xW+x[xS)U7JZו)T%~JċJJ<ijJ4620y9fc2y&;S٘Lxt9Y21l8% m]k8KN}wϙ>g>@'L3伏8!8La㟙g{\䏜ayo37~oo8k~Ϙ zU6_0E^bz/0=ӳ\sd3.g=S6>0CL{:nN=Lx<}6)tӽL0dtw<絸[ ӝwӏngGL2t37vr#9뙮cWS0]t]ɭ|{wL1mgK^©v.bi[ [:鼸o\s(hk܇Xma7qL6Y\}=әL2aZMg0ZA+ӹreL1ʴ-aZ=[2qVL-LLr0A⦛ALpwg zxZ4=&0-&xy)H-x1S5LXO] mMT3EʙS~'qjl4:KcSY;42m{gs0qo hʁ {,eJLLELLqR0mqc!n%ȔrLYLq\?ʈ{ҙ|LiLL)\|| 8%?ށm?m-M~-׮ӂ~͵,0K_///"؞w->,3ON ܵ4kII>{x1Q38Wv>\taxy#olq9 DZ)ӱ9ñ%x7pNǎ?B[8N }o@[ף` >}]a>-x}qpKw/ eDY9;Fώnnٱ9,k7oܼc#S,M э;6Dϊ]kik׬?]+vkŠBsMtUtUQZ5}UU1UWiJ;{ZȭG6ryψܱ"zSѭeKv,.*k.m-[m)k/cntN٬MeSP~fٌhtnjhCY]~G]tZTاFOQ\V&::Z!S';{df'"b=ŝ3EŴL"3u%+vgvGHFՔI>9)3 .d<pa'ܾO y{zuc<-q;9[OI< 4yq,"nGСEZQ^Qq TM Am({GS#3 qEnjNlgEy͊Y.Qt!.kZŌXZ#}36o%gBSmlԑ{&i*z5pzMX+S(VAZ~i*΋Ƶ&a[ݕĿWɿ/ߣOmy9Vl` l6g3uZ` 8X NˀӀS`1Xh`60 hS@4@0L'd`PL*&PNc(  À`00(E@!P@> @2?> HR/@2I   6o//>>  x#];~m-Mwo^~ x2"<, 4s)I`3 q`/(Sa!` vq;]O;;?nnnnn~\\ >= r2`;p)p \ \\l.[_` /_` /g pg pg pg pg pg pg pg p/{_` }/wWӿ~?Njڊ6NWc-󠮣[b8=C}y99dTztt{YD*:l|x+{<ݝu]+Mt|,=#dZmzS}w:Eiͥfj/gNeN7R#o1C.Vh u^Hɼ3Z:tm6'gM`[l9t<:.]HߙjKRetG{}j~uq(뵆znƚyWrd#=@}Vx=J`Fx^<-[{ba?Wu ?ʒ$ [|'X6+eUa/`:m;VܥW4 ~ӡv1NC)fwOúb1f.F]t?fAMgߕYC0Vȣ'(Oa{,ag8 iYSOqB=K=ԋi^WpA{ mSj:YiM4rN*+mݭQoWD&͵;+<{e)_nݎ뭮K:2(}|wTw^}g HK֬4K86pСCiÇ56lq!,4+ҧuY-C͹Y4ŬeS-4.;0Ǫ[-f;rB~Z9-%'ݗvaNse__[)nLKg?I3ݩ#MYSξse>5n |ebN|*Pwz΄(9x¡"%UG]i#}E.q)}…:N~N&'9=NczvԧDQ*//O5t\o(/wPxx. =bHӓp~aሑa y6) RL+;Us &&WfQnVix[< tݰNΠƺ%Jc8mȫ,`..NMK6 {zŰZ8앋94`ٴ3&uߛѯ_(\sUϩݕU6kr|_E̩O{1bILKfl2pIJ5Qz1Ӻ86]=49͹ veӘW^ Pz8G:PSL4I3_= !Jy_< -k[Z|m*7/-W̶47~v~owJX]XE"wK܉NwKnť0ߟ?tŽ]jH%3wB|'Ϋs;y=s 1+}&W(UהɴdsZeΛuʫ6ܵpݯz$;78S),h|͜{ׁ+&*nj+X8_# '<)ݩY9~ܝXKV_V\E8ǧ/3"gEBr&3"tnvFCz!wQ!ϝ pXER)CD^FzJ%^x)GX~NW[2[^x6%MmiyPkT??fKgٴ)P* 7N6 MU+͢4D#3eܗS…p!%\H R…%{So TmqF$_^FfaWPZaR'gOϞ]NWTg=߸Pq~?YB_Xtkw@}v9v+D2B3pjs p7>'!uRС2BPDtX*ؖKiCu/'͗к' L?&$$4?IiY@^UVU7C;qf |s~GnLGRj/qm1{$`W۝p >(pf\C3Cc|W:4dStqg -쵪L[\,Ȭp׽$4>[4[jJs9^1:gĐ~fj03=bݑ3H?jk&C~6k_};45}߇eY$[)ٖmle ؆ 6 4Ws4$-mM˶!&d#i6}yhm}MCin@@?39rQb?wuWA§ L\\=Y 1Bj!X)JH ].x](vp͒!&P6Y"lhՙ2vyEC&U{=uK?{[>_xȿ˷o ]<2>>uG~}~f"!dXXXXX9rba!bAxlBlOpL,Veʏ0wŭل 3vq`V0 s cZ./ؚ'ok,T45:pkRu|03+&`ŵH(k\u "ŭ"WVN+?HP#ZhhnVQKaQ54 B$l/.BpY~$z ףI/rk7rb.Ҽak,m0խޭOʴ3 j$KL-Gchқ% 8Dndu@Vn.km0Bհd<>y$ ^5hc[ZZ\*@:U8h\A#-?bѾcӣ 9Ubіvo|hm %6<8<Ȉ IycvQ[6zt=ԢD:Ѽx]#i#=c|D`#5w#SYY>qBJzX3ل؎v0uPuG~ε: ~kN3VZKVB[\ sԻ #YQQ섮ㄵ x +n bௐ!˼pt\yC&B.+q:m;;8f$ۻ{9h\}s'5:E* L -/rkf7AW&҈ `3VO&24<פ[h \!26>֖^/&g )`ӻ $&趺4R݊p H]ءt+G9q 4HP\klmFd1#!\PQGqg|Bnj4C#^4ASCC/oi@LxJ/-\ '(k[UDvWCNWU#FieH j}vK+p1=*hKh.Fw fJi^Y[ "jb>P1ˠ"0 8<ZzWePp=av2[rLD%^8 dFzCKB[49dk/rK ? {h(9 eAg|)-[J )jp f#rāArk+&}P3gYlR"~M)D璉zZ48~H%?"x<5XR/UӑHgM\.c5QQI*ڗ_-BoXxZn>~" GH`kfe GQ[ P (ձjr9Bn2X^"BιDcMG=):`V[خёMMAX"¿bs]V&s߫C=e4fZS[daqlAy1-+ϫ&-E4Pʼ9ʙŏ8|aӣ;s<<ȝ^s߯2Ix *p H5'kN Rߠr2xC@닟BZT\|]xq,Fדrȃ :T$$ehLjI'$efhEL/_>WAhx\nAy69' ̳i:Y|-jua:#V+T HXyYP&FcX¯DesA,7]~#,rnWXHP=ձ_L"VuZGb\!oq=AS i~чEPW6F_LM7X&"IѮEGBw`#~V?X(gkekX_סv59 Z13܃맏 %?EG< x+8@ S^ҫR%׆%:`,9M(J_ZI eR/.9wcv\aNHʨ)* /$?Z ?|tG˗݃g@(1?=7€Oo yO PCIڪ7r--)v k&jBb$j#U~s(dH .H`!.Ot B]L}T3x H hݻmu\tW w\}~ ?:xkw|᥏mjd\憶90 p#~)4F:HU7\*,(א ~krCŐQYukkE_zCw £倊IE' ^ɕċIFRǤNF,1t!)U]Xu5PDO5$ ^/.8 @X%wM C{v?W٪Ro n~GνRgU5x ގ{|wl\jՉ}XC-h75:Fy \CS+qmXlƟ|VK'GXkr}lW߳"fU[">LFQe?nbHܸT%sEG\(.k}+dc3db ƀ,#`ܜ[ *búa ^HךH.w-[HܓjVq?PP"V+3W-TmS:JkJm>5E}5솞7崑bm7:_n V`f`'8jUeRv 8>rn^GfjV gJ gD{uq_Bw¶UcIXnP\}qb SzL{\柢,Iea؃t׎?9]hv1Ox:%aF!ѯnwa3w5Snж-ŦKE\_s#x NA0+lSz4@p36s= NwQA&&^ãpMul.%A>*ޢv]&RI] &56"#4*S ">~(sTTy* ╛7R& 2kH3L.xPvw(π?p`D5~Ő`%֐op ’)vH^|r%<^.L,*S ">x:Č1M|Q 4pȔ_8rjh&f#0#gt3r1J@j\r8zro cv5 ,F!=6N&zS8C@jfQ)A9G?o0KF4_? O*Ufm! V=@æT3,Fr1ekEwK ,EU$e¬TvNJ\8DrB);^7. Bmzt9!$BakN8bdN.&e~. B~QVe^R $uEQaBKԊ CTN vZo0k.w$ZeHәKnP%W^-*}֩nsEpԐT(о$T“PORPMΡcUH FPr^ zA/s҆$^JHM&Z+P ~ݍ݄U=MTHG4eXqy:j,-엊]5ȇU>5\$⤇9BY-fHذG_ݟnZ](iiY\sb_ls,[:dT(bbyKk]knו\TcIB&cc*ܹ!nLS \|V x9jY. Ga'kDa2Vd5.B脿E+)BC4IǬ4Q议6|+rc9"#cDci1`@{F# tio^2n?uׇn"DTWd~Psd-^8<<8q1'*Rw?o ;~ޛ0=+]=]ʨ Uu2eCYC5\IY(=H /gKlStG|DwitS5[/ vbLTŎ5GZ &Zi4Ƕ6&p]>3iHnZpBَ:~|VLXjΡSyD85әz,csX}>iy/>̀}wT9\99 , ?:'(:s, +>ʧ~C? $6H+~T\G<ܻ^tF42wtJv=:7!KZ*8D! 즇uA[Bn%^ݴ5~ Cp([]3Ŀ`6j鋩h3pؽ:ʤQ|Vfyg$m/rRq`ȽFeN?@Ym:1~) j`6G\ۜ_i XۀB U﹆ -w9QkSm"dgԹTl~nN Z1ą kݟXRcrM>ԅibJ)rD?. L)qR.Us(zQ4܉Evl Yy)1^;0w aIv}gOv1jʂ8%G.N拗k9]Oq3g4 &T_f*BPPؾXJZoxCw`wR]U'I8kߡR%i ۪LTiJ_])<#6=TU5rU$mf΂}˸T&[ޭk N/hȞє直4rQ[Cyİ_ jȓ͈I#TnIC&344 k&N&*PX % /]tB*f=T}\d[Y˖.WNW@pww Ÿ$i.9b`|YRWwj o vGH#k:lk:A]7n{5Dk u00Da+-ӵ80hPp\;O1xsqLP s˹w ?{G%}@ ժ'H{y0_(82z5>PJKG]3dwT_1_;[Ցov4lvcpҙuʤQ2jddwvΎ_[;TJ|;r~#2yTOA‘,EfgEp& |^7wuVwsdڌٟe9*˥8Ӊs<I^0r*O %%z>' ˜C_ҩzU"4Wd`.˓ivLT"\jL ֯#I9 #!ZX@(L!;M:orl |N^hN˶̬$DA5=#]|O>ߑMY*r Jg_6+b P`q=9 p.}G=S}jûRԑ?,ε4j=-zMk99A3 #q"yA+:HaBWf7f*t2{2D {3 ̇׌3זG R}jSWծj)q@5l&¼UC'q,vk$g.>OgC9kN%10NOp&!zA)O/AĦW|SBΆu"i@0>3k x SnFV&)8k6>y 59:ߝ57/zCwebƒnan&,ɹ5rZe{z] /cwt»OIT^;D>A{Lz  i?҉nCdޒA'6V97fZ6ϙ;/ZlWΜe I '0dK575C_>kg=FMO~7VI*5>B|AHerH;ib9=ȖE";!6c!>!=+#\-hoJ̪Em|wWęηg"ZkEOFbzxk117ps~^q^(:uU.`Dɔt6?Iʫju,VxLQA[vCm1 hx?ogu9#>Љo@u"̂yv~oje@Z"#2r"6+ W?$SPTDODŽx5oߪaltڃxU%}({jTni@l@Ub+ kE_ 5w}:R.)+&|%IC郼pOmpmSP)kb.[Zb`|ѧ0'6vtD/ň#b Btc63 VӪl9[{*^K-}p\lɴ׺ͷ7A8VnѭItF!0)XML<& 8x\CS^SNpVO D6x|ac#drpXTM :!7WV Crrwv9g6fv5Fl[&%z]*W--ŞrhWm|U+.pU¸ 0"QȓĚ^I" t2 8ѴB~m3W#pd>4EHܼXND{|K÷HIJno"tqmؿXفLXsh_6n1m.3]u/ccnұ_אk.O?qJ#ll1SRt-M 0)E?n&HޚAy}V̍AHSpbX* Ѥ T~cOMX4? U%7~kk+)W:9ɕwBJt05D S+Q!z-6;9\ik*L54,˒溄ɔlZ^J\s+;뺃9RK[0) Zmfn,$# dq"؍"*gJʠ 7/V"=`=9D<곧8_Ika3B ]j77UO j%WHvM3ԓCP3*6^])jJ1cbMSPګ[۟} R~7nҹoQjY0}O qЗ$ F21#a.c6=gdӅ lUQ:Y(Z-Էt9!2t/ Xa=/(C\ȃ϶x<\/Nl{{]]ۧ-]6: >iYF>,,ﵟ?JD)ڼ> +A h";Iend ;`3GW_u7bo 'mAL4=Uuq@͇ʙԙ.Wm\NUTQ1} |ŕwU_3=3=G}͌nitd˲eAlm c. %Y̕%rcYZ:KXlC/ߒO_M6H X{z6\juA(XL 6_;Gǰٱz\God^*VEw|%* &IrdWѦvݣD=Z?$VҹߴX]5եge–1Z7j]'0R^"ZƠX@) *UnʐU% 2X2#'A+Nƨ@rAU ޸@95)k爟 ᛇ e,K 3fޯ)eX42\(uYn!J6>p@2jޓH;ITA# ɿUcL'pSd NF~mk6R]Tֹ5BkҦ#IeG(4'mu84]mwZ#~ ?95$TE퍻 fhdCNPUz>8 Z`؆( &g"I;*8}{-`C Fs[~o|q23Xrl)9 `Uye鶈89%)f5{cVķn`r6 tBI fv3ӓLqz ơJ\5Wt:Sf^7/VYuJB)WY]۟yezaַ19vQx9'QOVm& pZ[qim%qZIi%j7q^l֩l>NV}t]yY8AӋd޿;=ᦒ @lG7πy;NԨ|PiӮօr5oI0. C ##!?va$`\ab%[!@QO̲ș sjs"?߀3$k)B(T %RaYFjM)=ʐ!v G!A3 /4QşP4{*R_ t}|b9oaJoȍ3K"1%{e0q.=8}g :Zu6k4cA |0qLP0I6 Ұ-|sH\QkހqXT;L.qL< ,Rb,`WjjupiDzjQ0%'NwuAT_*2K`#*2$F{rit%}8+~ _g&67Ex_fт1 :x~L?tC&Yv`CO1&Y vxa%~Hi7HxxZgk\q4 7B@m?5|d8CɃZ>Ri$)u ڞ + )J"]щ&bUX=ͦ9]㉶+B`5Ѥ\UKawhIasxFGxW~h Ӝ9o%`sBS}K \N-:M"6ljV >ˤ(hFtY.\_gp_$Z䰣`" hr:]7H6IVaL!4#5 1Y4= }^"Pj??APcT.(  mi3:D3$^:.JuxK Fsop%3MQA];zì@/Hh7i܄\4'/J}NL<%O}P!Y9,P|<AI9W{GWxB'(gN $"(0b *ٱb1>]\V#T#4hDA 3nIrfƼ-Ll>H L9./O[W+1ge"-T',ɞXW]P9C+z/i7p9U2/,.d`OJoo,M ;c6< 7奪XHp##U<MXqN-&cSl\kBY!|Iٱ'`22&ՆxGxv^kciw#w:]3fq457h-U}bZ`l^f8r\w6^Qw,\7xɻzxQ>H}0o[c#ll hMSp `0 =_\RsS*Q4wvb.M}l1^yx[w~-hw#;l6;/j9c,@f<0\W.XڞZIr3Oýְ@SBhA0-Jjʱ@g̺mv9 xYƭ5 7R;.#1W#Hրx$JH xj*~>X*-7UUiEad=[…$RR3[jZ0M*W*ӪDs]]h_@wFПk)N*~k9o|5C .[iT6@C5`(S\` ASU>_ʏV"1|8BH$P,94"y'_:D THJ[~XӅ&9#VIшNp[P l6d5|Ng;IpXUnBnmX 3&;eC8Fم{u@9 7PukPK6uwJ$DXb3 EyMA-@3tmn euM4EӝU]@nm>i#Y]*5UE^I;xA0mFB( |c=%#~#hhL|av*{~ ԁ c?H}A3ʱkR'vC% c8v_a"{oc(&HQv Kmc؉nR\W['PY{K6. /֗R%S LxT #ΰnkԷSY"Ӝ %UZGu90 f=1 A,{ےu`4άˁ# )iEFCQ ᷺=I=Kr֐qs4͊13QЋnڊ[ ƢIOy=odӄ2 |LgH4j?Nr6kMAf::]8!M+NLf6{(F+@%h_W\ŏ$5:]%CbZ#F:e{$q=A\ufs %`DL>Q'x',KA {fa݌gynB~ ''<흔ʆ\!+]}dŵnZ ͖xL]st:b ŀn"Y"(\N'>HQ=ܞ@KWQР7~(_̢4 'z> 9l 왴${y,9Whl&R(ثT+@jM4\Rwu8| Sz#w"tx8$E~6V OBy J_p_Bj_%h4\ViE܆ ?# tsMC8zj6'"G\n7۝8CH@)l  ;L0,Q:oSjDזNQgs\kٽ WZRT$mN%[ߤ#w) LwQU%( +XPay: ma;lӛXgO:X֑N*BA篹`T0v3f47?Q;2=͋Uh\4(2N64Pf"%C'fgY{,l8$z# "GӼ`(;xzNs&lU߂pӼğQT͖=hqZ$;;yG2iOhQ@G>,X#Ɛ'9@ }E"yݴ4+C`8hhd PQ5}nTRtT,̿#j~-Ӹ=)K.48e۟l}Lƫ!9E")6~턉 hڜA39fQS:6 ,k<fgQ* |PSO ByH\J*[) p"A޽^nJ!R~Ď44yf@6xz ○Ͼ^Aid7K^}WSSogR C2yo@#z(fuڬUI<2W]|#̍ Dfemi.۶oNnHzCsWoz g ,|eVLq y 5(|Y pw r ?} .K RFduOZvdzPl!FQzcNjGNhlP؉m3O}g=rI3)ByVOddo 9 ̀F7S#}Y{uO5!54XHkG~8N.BhT߀?7}5q4yjW9O!-Gݿ &~"25; NLNtnFΈv!0v;V?YM\4o"ˎ9__կWW6US5z5ӑ֍KDF]7zX{[xЕz7>2oƍOJ45C%Z ,9يlW׹3JJè樖B.-`6q(o9Yx QrJE& 6eh#پQ<,OG f;f@ 瞅<"$&faqfBl{)]v4 qI{F+_BHs 친Q6)V0BzvsP äRƫz6ܱ5==V/pt6:k|Lh#!G|@ŗ_"A-l`޸fCbMOb͚D{7]~ ,G,t P昅.?;Ղt%tWKcґ]QUy׶d9|$y}U>wpcys|7T \|0j\vPN ܽ%ڵ]{/k~hcPEMB:eP5ܵ)9'ôY2Ya{f[ ]7{yb EӹLP%8E,ASbpk >WƕZޕmR:.*aO Tcyf#15k} r2 gq fgح~G$Yl߅GEPu>eD=K LC`t,l"/0A.jа RCroMO^dmqgPcu{ ki,D|W|@`sXA)={`D)Wc$QdӮϑɎYwrgSoi#hӖ=VҀ Vn&QZgE`&%J~ٸ'b%;v7G2VoYfѭ-[z#]`~G{gÆ\73ؾ_vdȪzhm!ܻcGOhot=BDھAp+ y'8kzEf ONsn^uL^M6Y55RԄ{?>ȟu\ͽzt#9}"K.D&ؽm`r8˃{8mس?kgw|ptruc\4ִ-ٵ:v/CvxC|UGW˹2`gz޽8R@x)֯O~vFGT{Gnd;'=ɧhW>|f ~?:]{ؤ]&;RIIP $\yAI3sP,WE`;k7w.*%r~Qs_XXpaTeF\vg3uPϜ<˼Ѥ]4" "ȓF0EYdiHgCWF:ߑtpT h7 axΤY_vvbE5Hk*~STCyC%]ŎKtYxzE8Ji WmѶH_bz\몖V8vl&4sM״9]u_e}UђyMN,ͫ +uA Q]$ nYWCYzcSB<(ߟV~O3oB{{#e܈zVխuyV_ڴ#3?{/o~-=̟Do=th֧Ѽ4g%گIdn;,]#m+om, IRZ&Y /s r`ƭ2Fn7jp6T&ѠِFc7<.SGK&1@Lb6}yM/1;Ɏ%j+Te,/ERuقKeqа_oXR1g7F]{Y󵔹\JZe-k+ٻ&# 7g_d;e7l۠.Ke tC7%BF[HgoI7^\HYHm}C熳QϜo.ٝJnȂN*+QG]x¨Qi2*)мhI@#X׮HO7;$G\v䴥ڗ4It.9焺̀=С|Nڋh1Pk MrL2W$ReG Y-yal!Cg-d~\sLg4NI2]3@_^B]d0v8Mxtݻ (k:IVrIC@UNoi"+CƸi3N~?' ->/ؚ.;5=K?iQץpOgGO~ٙƙ:S{9S}|tp~uSܵK6HBމv!ee /;5\6HvDNZ*7KPn*AsSsS Z͛;Ei7L2L:_'Wqd[Zڟ57Ctߵ?I6:<Ց>z3mlrÆM @Lt<}&ָ"(׆WCXqd@F- N 5ɴ.}dđu2/6x!e!Ӄ dW5lj_[FZ˛ b~h*_Ep,^cvM*SS]FV߶󶞲շjPk4_kNd7&< =_1CkץrίJcM^"MaP*~1ә1TͦTLiOQ H@#<;kՐ6TAHLhR-3̵Th>.QIteFrTL-2{g˳N-ZF+oV-t(M=h\u.ԜA/6tHe ^g_S]0 oMQ(4-9/n4=k. NTo1,:Js񅶮x`YC }f,q)+9C3 x@̊:bLphF(/o̩\\a[юSVe*`Ա[)YE5bQk)4 ܨSZ nfl7Bn+Pz#5&RvuVkf> W J8RES?iXl nkʔS'O-;*^ǢEbKES^'+CΣD;m\b\E)]g^5ĹԜ/bm}3#9rkܪOu5-ր ׵ӌ5,RͲ* JTΠC)PQ'Q6c4rχY6 6]}1X-CčЭ saaޛ't~:)o>j;Ѻx5fl8o}i+╪PvYfG\\S&jgF\unA43?[ 󪖻s@~0אsѩ͞,Vt{\3-RP)RJ+DMBNW/z =LPHlXlfm$>d1eSx^?RRG;d۩gMS'[e?K}YyY,*@2^WIHZg"¨֘ o:{{@(ܺۆhQ m6n)*ެe/4| #!9ĠZ eb A9)gDG 4R07T d><Z)W 2َ]QpE<$PTgA esJ"RSЪڬp qZl:3BuU-V)!9x9)+[܍eFwWawRH$ \Jpk:{(U,>K^o\\|~J"ytUU"Tb͋e:TOe~M-nh¹6 YwqmNtnI657mR3[24*3gn簾ENȵJJ.ajWm $=' _P'@S.Vv9bӗ!|rY"Ɍx-<bGҘezlU|DObb݄GMAñG Nn0oDS<AkoPQ U1}%%~9ýC2pgȃ/ALw e6{ӵto6Os bj|ʗmUپ+JbLq:@,9#\)ժBF~C6b1b~++^UQ?V7WS}Ԙjb''v*)Tk]gkN:}J=+D[ SO3<3PpWƛ +~oE—֙- 2[;i9si2疹?lmo rkۭM=$#Qh۱;%Ww v wxn8mh'+p≁=1.x~9Ftί-XG 6& bhp\"&#Dq $=U ~/Kn?ߢ*A>a0AX z8'}T%(5KQb8 W% C '  l!IoS퐆G2i[m; !r.rO;%ᓘpw1u ?CuBZ}q}Mv9!8.prR5s %g \ُCIH%pP+PAWҤJuC9&ȻnФ i %gpp$ǻșx?N'{T7RGm͠%j koP}r7a0QRw-@;? l88H8Zx9s79=@|<xK&C tB?膙 iZrPA1?l V>EMGǁ8~y>;5 |@* voOPà1 6 |o^ }q80kIh%! (G 6&G'p+ _C*S0@%l Lǀq89 <8IB<˧!b# F g@i8N?B^w}B @/0@%l Lȵ#;qJDI{An>#:>#:>#:>#:>#:>C+ 9 :| l!VBB+mRMNRN:I9$夓NRN:I9$夓NRN:I9酻ZOw89a0AJ88?$LJ)tZF- n0턭ܲa2ǦkbSp>sOO>_ &!|@| /P_7c[  qCJqoي[Z9N=9wN=>a |%9x?<<e>qh! 3psY$$sOSIUW1w Q)9>w9w<͜;9>9 9f9>;s:8OwgN D8bp!s)~5LQp g±@A|@SL )&B!eb2@Hq oEu3;#j h!E^ ZE5K\rYBԨVZ -hk|"1@ i~sf6|{mfvΞ93).9j5mF;yywm#GmuˑHyg3R[w\wFjMYSxgt "'rxoK?xQ޿I\Sx?Z3X79 Xs.'bHdn\xZ&=][nEܶv"a涭v~}=Sx.KU{}gǺNY5Cl0"uҲeGNFv71]CO4rmCgc6t6:۶N:ۆƶmll:ۆƶmAu2)%"WE1O"g1w?*}92TPb M3·^jO=L 5 i+O-bϊ1Az?0ilE8SJ>'\ʷ8^Dod+fj5XSD&5|>c,FX}Rz1ǑˑU˅բϓg)XemqF:@1bTy}Y7(*U|:R;SHH7 w-"oVYȸnרdyֈ.c׮I9c,FOF}rhʥ:RCgMfRGcbfGt!: t+:ݏN4a)tF]tڎNFtFߦ=g) ~N4 nAi:i:C'YtZN/i:>C#@sbtNNס(tU'stN?C+i(:݂NtNGi9:Novt>ND E^Ftr)Ni:-C-tځNS:}ͲصG-=-k-Wh -נMt:S1:ӯytڀN=tڍNE&t:N9MZO[~ުGTNi:-E52:mꪓkL'C tn@jNE o"tڈNo:R#!&i'4nAi2:@)tZNġZbJS?tN#i<:tND>:}NЩ zX?[g9z&:]N#ntNѩF:mA= :5ӗ]uv]'~N`ti.:-Bzvq$.K..yZtNS:=NtzNѩjZ.Ђ_hk)4BtBW]tځNZжh#XtwC>JAtNOtz OԈN/~܊6֡q}U'~N}߈B{IηBu贉ZuYɋNWhtB6ʿN阖fj?t.\eXkٖ4&tt5:URNtB۵S J-CbtNϡztzӇ :C6tJs=߬#ֱQkjNKi :Nq9/p/--#crG7,\ZYY*wl(ʐNk4VMs8FU v***NBC֨R T.U-\X)H1:õy^>زzɒNYzT_jgaj͖0-qk1+/><##-w;7w+F6{H'm)(TJyBUdCsB%U?T9aJ6[…9ѐ!#-]~G2C 15hTU6fsY(/uJ-dlvJ(C8hQBXfZ*VYIaKzmNasVF+cIScɮttT R؈6t곈POacugÑ Djml"a;ІP|>+7+uJ]q5t5xvrm;!ìXP!"<2Ч.v(ٴl=d|V( 7[h!%(./~f85{U%yȮ9ș9FFRNrVIgR%kV͉L395ٮM2;M3/d밓 vI  G9 GbQHQƎ(v:Nd;hZ9*"\Q]1z`nQR6!ڜNt:DOTk(ONNtFۈ6ajdòTpE cNy{ [pPmV6ؒڜ.Z[[|ӡ9]\Gzh6W8lNuqWYY;iN4EX5~P.J8ӭ9S3wEThb=EkTFlA3Ї-!^RVkd>G6.o'љ.p[GM}zQ*uiA)5MF=zCJ\ҳ.Msuh;5wbJ`FQ1Nv8Mr;[5̨ܖY&'-AfH2U{9,ewvDe9qٕNUqj5MzեY\ɴ0,Vi,Ea}ʦZF M jbU͚Ҡ)T]sx;yի>ƋCV-eiXgfSuAG@32nÑ uZögHm5|kZn5rva)\ùs_˩PAt92!*NJ}uԥf\]鮄i![MV]{.JrqUpc^ ըabSsMP7 >]QQ[*'M* i7R绦vn=F{؆ ;Xgn.lmimuzfoEsl4X ̮?NJmnMsw6KC-SYnNap8Ht5w'Kc:nZܭ,"|X\oͣd^22stzL:hϼe'R'+c5Ã3_kr[U owHû]\DEDi۴~c>*ԤM׻}ȉJ9 :UNvzĩY:gIgcUU o\xL9r;Yb*BJeRNU]P0! : %!wۅSH;mlsWJыRfE N_f 94_ -5#5YWxi[4l򔢎Zx Aa"3GSC^aGG(yZFn,UO:ocsnߞSمn$TRI,]Ȥ*lygj+UTZeZQiȕT^h)_VVj>ٱOjX_icOϞ ^ FnrH. 7H/EKcKzMt?Vќqh-'k7o\{ E(#bJ\(Tp-v< !Q{[xB `u~y,\.Ȟlݵ~Wmfy2G <4OZ f`]6gG!R{/qk 栓%'@A=b*Bn{EYXCl]e8ӆGbE^ 9K=sߕk@Uwfggz1jcUs)Cey=1܁m<#$ YPΧ8 =s+Y99LݝYY=gnz'=附T%#1E,)'ƤQs~Ѫ>7Xlf<Iʃ1ͪZ58Eɜ`|n3''S}̗\M\ e̗|qJDmFڳ3 g]Wb-%-yAv;֚f(<9mK-Bϝ.='SDf?R$86f2Ũϖƶ-4as(H}uϭMsC%!q@HW>\PInQؓ7y?3gВU aɴd9jGJ^^Eh^Y>Sg3]=U%uQK'O=wN/v 墊rrY~~˪ߎ$'2hwൃf-frGrQːk[7;};|;U3kk冗:ʯ^ƍg,7J7/O덢VNil׭3;k+5*s{_YLq{w;&Q}ǧ$?LE!5rrus3@Jdpcdwe?QfNZ;-T|(y'o5ON$))Q^w|1GJ^AQ3fyŅ (ʤ *hjђX(B $tB%dȪ.UD~W{K*]2⩾ʼe53 nq֌#ތzny,3f̽g]g]E)~K2;%{s˚u 挜3U EWJ,=z(u;sJƑˇ?bpc _qq$s%I{K]]zǖ.Yj;Kuˬ˺/.̷l{]}٧g\xgŐWqɪ!UeUoj帕ѕϭ|q_W6UOj]}UoX:zWUϮ~k]fƚלX[;ck}ݪu /]Y j ΁sUI27`%\Gb$p dí0nq0&ȗ+$D&(B(b\4(A `6,J/`-6[ ކl]' {} $9ѣ  _±r񟉭8|'25|'2ҋrXUVj5zx~ / 7{J2v3>*\[F,ߕY;~?g8^#j͗ 0='B/k&d@o\9f$p dí0nq02Ca\q& s XOSzaG"NTĉ8Q'*DEq"NTĉ8Q'*b_M| >F89K%F"h$E((((P[^67BZv6t΁syDڅb)\?K琑i\//LÕp0 `Ȃk`\ > : +np3Q0newxEg\(yPT|DnkmM 5&քۚp[nkmM 5&քۚp[nkmM 5&քۚp[nk+?f[ao:;{ZFjN)`;8 .pR5rS)LiP!wn#wn#wn#wn#wnSCEa.üWG1xÁq8}n$G#DHtDtDtDtDt }p9Z p%\p58 `Ȃk`\ > : n W `4"WI VC5/[x ^WUx ~ /& Z(h{,[e0Hx#{Ԫ\#a[ n1p @>,"/-'` < OD=XOn'7sŝ9r/9r/9r/9r/9r/9r/9r/9r/9r/9r/9r/9r/9r/wˣ-r<(wˣ-r<(wˣ-r<*~wx>~/ƋxO4F<ш'D#hxO4Fq.g0%x!8?c8?>㏏c18?C8?08?08?PmwD&@K`tu8.FzйG.3p#\0p#\0p#\Wz@O8΅^pXI<OX/q{{{:2_W(|2(S2(S2(S2(S2(S-&Nwۉvn;q.3V@Ua {`=l/ uxބ&x++A;P6 CH:|Q/Eu_:|Q/_GP >}h) @b?Yw?Yw?jS-xO<ՂZT jS-x } } } } } }Nd8:NDn"v7:#uG꘏1c>R|H:#uG~|H#F#G42id>|H#F-[߷po~ߢ_&\q'֦,ڞ s sA<#P)-J"X OxpU8ZV$ zj\N;X Sa у0fl8U>ñ\o:pu|+-W[̷\o2 J,ͰBm\ېH#F#GȕAɃN.u8<>>>>>>>>>>>r~Ђ[py .o-\ނs;{@O8΅^ W_̀.HȆ[a `<c&(B(bc)LiP5rS TCn!ϼKy<.y]̻{rOk~ ޯ5x_k~ ޯ5xa<~㇉D"c߃=x|߃=x|߃=D3>e[DV"i+>cz<]t=xOzNxƈ3 3 4ƙ嚚rMfqfqfqfqfqfqfqfqfqfqfqfqfqfqV'88\Y`Y`Y`Y`_O~⧟য়w~'=u?媟4(0f}>y<.W5V`1<KIx +drXUVj5zx~ / ux M PXb\הRrJz2 jxUk=p Z9'sOxȳS룎Q0nlm0ƃ\E5 R dPEP !x W\뭖Te0#1qx*00#00'wU]Uo!:fq7>ٕR?,܋U8_U8_U8_U8_U8_u*C=C=C=%u]qIʶ^zm׶k[ﵭ{m뽶^zoy˶umd[7Mumd[7MuS1-umb[-umb[-'6ř8 'p68S43|2|+%|_Wq5jp#nݮ?,܋p?OSƃ^m5<_b!~E֣X%X8 <*,Sx+ jsxkQug>UlEq;Om΍ꟷw>fM8&8}#>b#ܿwsnmkZcmX[k5kkDDe1ezLWbvߎO]a*NlvyY}0?󝍬ݟvϖ>*\k0:\ phgJ~&c n7KiVZҧG=|1ǻ{u{u{u{u{u{;N{ZqjN{;N{;N{;NYQYQYQYQYQYQ7mt~00>',5flRYj6Kf,5f}zyv_au}ѧ}v_au>kKZ 0 (I8]E*8b\_3ڣOh阁нet/{݋fIcRT?&ՏIcRT?&ՏIcNM95N>>Z)))1)R"DH0xJP=2N}\ /T>U~*00#00'ϟSn Da,Yb9Wj\zL$܄odLf?'| QveQveQveQveQv\b bn1C[-_~G,cxD)<XU3X5xc-5-l(>l?ͨE/eu؂WPW z a;; {фfi>hsAtut"@OqLX Ȅ2aLX Ȅ2aLX pokkkkkqmvpmvpmYYYY{?&;Lv1cdg8w1cx?;~=@TʟJS)*O?RTFOG(c^? 7F܄[cgC;{ݡOp~;+ݡr ܡr>,wܡϊ *e\q2RUʸJW)*e\=!z*;YgC=b3TgS!:CLu=,wγ9r<˝,wγ9r<˝,wγ;DOw+JRz=A8A}] ?o(Όp/AkIΥC;zc_"C1 1#1 qNv~~b6~9x?]׍6͐S(C1 1#1 qN.~ϜzbZLDl+|\p5x\p=&`nB0Sp;Yz"pP P P P Pz,sK9D-sKƟzFFFFoSUrn[%VɹUrn[%VɹUrn[%VO=V/ɹKr%9{Iεȹ9"Z\ks-rEεȹ9I{dכMz3zb'ɮyk'ɮyk'E5]ȮGd#zDv="]DO>{"ɮEkZ$ɮEkZ$EOF]ebٵXv-]+d ٵBv]+d9]_]ߗ]WȮF*ѓUdWj]Qv5FO5]+eJٵRv]+eJٵRv]+eJٵ2z*KL,Qv5ʮ,kZ.ˮkZ.GOm]Qv5ʮF(eWj]1z|jO]>GOzOj:zK>zlP.]=%z,WY4lx/CP8 '3=LKTHKTHKӥ'\q Z\1pNt ΚgKRaT-fKRaT-fKR! RZ*TKjP-B(BJP*R! TB(BJP*RZ*TKjP-B(BJP*R! TB(BJP*DߧTTB(BJP*R! TB(BJP*RZ*TKjP-BT RZ*TKjP-BJjJP*R! TB Hg#-]KtIBd A6H d A6H d=H k%Z V k%Z VR=HH R#Aj$H 5FDO1 A4H yA A^ /H  ,AΑ H$Hh)HNI: R'A==II: R=GI %z ^ % KNI: R'A$H uNԕR_&EImRd=)z"Sq8T'M}7כzS0 S0 Sԛz^oM{i7޴כz^wwa OiJO kLG15tԘQc:jLG15dLAdLAdLAƝVw[ݙn5MvDl7MvDl7MvDl5{LD1{Lk5ix4fhXz:9w?ss~Ϲ9w?8-pnsr^˹{9w/r_+r_+r_+r_+r_+r_ky,b,R<DZ OITa9XXg,Vc XjCM{[w8p9|w6qgw6qgw6p[ֵ7sf9x3o7sf{!{!NZNZNZNZNZNE? 1~<৘aI_i 4w;MvXKa ;,a%찄vXKa ;,a%Lt3L79Mt;,a%찄vXKa ;,a%찄vد_a ;,a%찄vXKa ;,a%찄t)nJt)nJt)nJvXKvXKa ;,azޥw]jzޥwkz]wezw]wezw]wez7զw]mzWc&x ew]&x dx7M&x}6>iʹfg3Ll}6>iʹϦgS)l}6>bMϦgSRaT&IiRaT&IiRaTVecq& sp.'q>.>q .Ÿť q9/ | _Wp%*U\q ZwzL0Q}pF݄[۹+=޽޽ޝ`^f.+13qwq*Jo*Jo*Jv2 xݻ]f.{ٽs޹v\w;kε{ھ^$9b,R<DZ OITa9XXg,Vc XjC-lFl¿b3j<_P-xfR&$lB&$l]bwE,vyy"Lp3 .>)`<(q'OM|".bU'8AbcFbF$Dy<8 !%S8%S8%S8%S8%S8UzZ}L Ŀ`~Y6Kf ,a%llҲYZ6Kf 3.`Y5Kf ,%Xk`Y5Kf,JDJKDJKDJKDJKDJKDJK%RJ"$RJ"$RJQJQJgcJ~/}O>ҧ_K~_z2;.Snx}Ю>1{>(&N ޣvnim?m01ѓ&3i:3i:3i:3i:3i:3Yz ݋=ѓ=9[9[KO{[рm6n=[ώN'u:INtR:}H!>Ӈt\>WS:Nt:)NtJS:Nt:e'Icv1;)Yǣ(<mmmmmmpXk8`M~n.s`9OMk6ƿQz]')c;HRN$)'Iʉ$Dr"I9HRLQ0ESLQ0E4LS0Mv;NHSPPH=o:Qxǟ/Dr_NK `@*P T0 `@*P *( *(6ߦTv{杪٦m٦m٦j2ɨ&zhR_i~CyvlŃsPA9?۟ 84UUVeZiUUVeZiUUVeZiUc؈X+?ʏ7߈ao|#>ٿO}L?ԏ~$#IHGR?ӽ =uHvWUwU]~W)z虢gU6 @=4MѴ'~{1Įt ]BW.t ]BW.t ]BWtAtAtAd =A߿Gܠmx ш؉]؍=؋&ÉWlF5:Ajt&xDZb5G>jTRJ}ogP}oL}fi u*S$P;+^GxLTLTLQ+_o;=;i? +MGtMGtMGtMGtMG\Ӊ + 񕆨2~/W |W |W |W |W |} U@(PE***2(******RUVUYUeUUUVUYfY:mNfY:mNfY:u['ZuU'ZuU'Z7A8uN!.')fgs̋r[6DWTJ_q=>Ӯ>Ӯ>fi|0Um|0m7=>tS<S<S<S<S<Psz PhBP mzBoP A7(PBI %)^ }dL LpSq2.0) }FJk:Zmc:Ƙ1cc:Ƙ1cc:ƘOqG8#w3RGwnW튻]q+ʯ'ԻNb}ce^ve^ve^ve^ve^va}<>xXa}<ֿwXa;ֿwXRuwd(P"DwGѻ#5t?3e*Ϫ<ʳ*Ϫ<ʳ*Ϫ<}O>ӪO>ϫ><pTS!O<TS!O<TS!O<fγTR!KE>*Q }T׏Qo./g_____@/EտU_T}kU_Zת~~귨~귨~귨~귨~귨~귨~V۪[omGiJ|' [oc7x3>}ap37ajrE|wqm|oX)v{읪?????owWV_}Zuuuuuuuuuu{hNvӰ4la+ [iJV|MI( ( ( 4M= JL4J+ix2 '!U>Dy4a% =jVjVjVjVj<#N87o\DTߤ~ꇫǩ~R#~/UZUZUZQQwWzWzWzWzWzWz?iPEVMU͇Uk媘zO'zԫ^%*׳zC% *iPIJTҠ4A% *iPIJTҠTJR[*yK%od5بwjվOsϦW}*soLqΧD%(G>JQ}D%oB ZB*:L?Q -ThB ZB*P -ThB ZyAyAyxPyT9Necז}Fcq& sp.'q>.>q .Ÿť q9/ | _Wp%*U\q cQ1[(c 1ױus\>ױus\Ǿ+){'ޅSp*ލ>X^!|c|3Q8ʮa&܈pwIIIIII\\\\]bltK;a uUlEOg{{3젭9z,؅}'c]wŻcTx-.MNNNNNNNNNNN49%)iNIsJSҜ4K^RTP=C 3TP=C 3TP=C 3T~6)+")+")+")+")+")+")+")+")+")+")+")+")+I/S~$L(~Z6m81afH͐!5Cj R3fHͰ)ezL0'܈p|~c3(G> QWPO?V N;}JM~Iql%GQql%GQql^y}镧{^yW{^yW{^yWW\zh핣rW^9+G{hgNS_ugW^PgIkkkkkk;ym'䵝vN^k;ym'kVkVkVkVkVWի|*_W&Wj_mM|6&Wj_*/2+/2+/2+/2]?]?]?]?]?]?]?]?]?]?]?]?]?; y灼@y /tR-6,0#8,]kͺ֬kͺ֬kͺ֬kͺ֬kͺ֬kͺZkZkZk]֭kݺ֭kݺ֭kݺ֭kݺ֭k6_eu|]6_NvdNvdNvdNvdNvdNvdNvdNvdNvdC6)6Ho7i<ᵥw|○Cu{E"|u:_d/Y独E"|u:_d/Y独E"|u:_d/Y独E"|u:_d/Y独E"|u:_d/g{yg{yg{yg{yg{yg{yg{yg{yg{yg{yg{yg{yg{yS;OprM85~x"E (P4h@рE (P4h@рE (P4h@рE (P4h@рE (P4h@рѧ[ (P4h@рE (P4h@рE (P4h@рE @Hwy?{dzz;c2iL{`=0iL{WtΘiϘiϘiϘiϘLLXq|gI p!>Oc>p1.gq).y\/_—\J|Wj\8~GL݃ǘ{q ~QAQAQAQlyK2<'Qx OcVbX5xc-//eurOEONX"oY%?D *zzzzz2ܕ we+]pW2ܕ|Yrܕw+]9qWrU]U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]U]ܕw+]_wWX9wsW9wsW9wsW9wsW9wsW9wsW9wsW9wsW9wsW9wsW9wsW9wsW9wkw a5]!wrW8c>b7rWwqWwqWwqWwqWwqWwܵvsn]k7w݃m] ] ] ] ] '͊:UVڪS[ujNmթ:UoV<j>~xB*(GYEYxoe? ׇd%d&63:NWtWum:#nO-JI[Is|8SsH1"#rHqutIt+H[Nڭ-'Fn$I?!vr Ǒp wD]Zb3֘ƈ>FqgQoc7'x( *> n6~#&f11wsEalD1|{ zkOnUaiŤVLZ1io_{++=暻0}ܮvgd{y|п/egOrz-OmYfٽ,6{s̿NgmJ84lWQvY?3nt%F{G :޷;Sǡ% '~ w%t{ Beb:)HhLv*{ li6"MRvZf7{h9McDh& ޠqɬ#.qSV޷f;hf;hAa73hXf'kdlREtKetTo]ZdV+TYaZb+г=_JUnL+5ZJVjv+V{jEݬZ:CHIN$;a5F>bdvO qwl4٬fZ7ѺMnʮ;Mg+\rGd6lvQoL1Yߵ~$>w^YAmFO&31;\!wڢ8{oLnjzZʰfz[}/D ~|==,>|9XV&ހE"-&%2gъDi(3heX"'v^;~GN~hx ==0NS$ވς0R=۩{ns/]5ҙ2L~zf"_*.bobR٬.+=F1/-wþ6~7e3B-wr-wŪ9nVb=V]kVnVlՔUZuUZuV{j[}+o*ViJGpcpU$^s)yP^xކElb)S;uaA a=@m)MՅW=-MNl I4y [Uvz> W&d|+Jw $:<̃aȸ>yhTtzg{[#cDH3R䋱aR|{'pN<0X Opz81d65bAlxlH+7r6Z֭a֭g:R˂ bVԲVB;Xhv.7e]e]Y؅WS-.FYZ|5FWҼiQq.и2ǣ5^#nyͫh^Fwh@*nzZѲe֝)h\::WdxF۲dШFШFX]GѦ6Gfmf#;ǎ ؐQ)v\Km츖׊=\gU|VE[ cVJu;͖8ǖrV`\lBfYa*EV)wD+Nm|/6 3Nl6[.cFJA=ҟqglRh:Nɟ;>yN޲OE*Qe%N̥,˵ ڷ*gs˵k'މڱrrrmavɵsiֽ7k sP-k B?/fYbv\{\[(rm\[+EuP-䝋x"P-/ȵĚ|+erBk BL\[(ʵrm!/g~#ܧgrv\R}1{ޟxo"M ޫfE,,msrd8/DZ By/+׳Kvߔfif%vGZa~D0Uk/Ydd}.339u&U)i~ TuMFU܄ aQFH^^ed\OZhV1vB>:?1k=>ϟDZQ9^~*)L}6HhY=ҚJ$jo7o\tVfDJ)HYOJ3)ͤl d;8T/[;ru?دՈpHZyffW]%4dʩL>aWS|5g}ZRk&rO[&qff.5537s t-Lvx1ǰu39;fζ\_j浚ךV)øVa3Hg̾[ÜwYel9\Ьj'v.Y}o66[+cfߒ{kWgٵfj%RޤøjfLFݿI}ԇIro;~ Nj3]Xnxoߴsb7"'!L7rxx(MnpƫWπuOD_>`OeטE(it{n1F6rwm%wD%²t.ACO O~dm6+̶lE*nk 26,tӿOf8{<~vxs g4\$#`kzˣ޹xjZ;_+U=TEC`h]=ݮ تX? 4e<VFvk!0ܝ`|sՈs{tw+s+Ċ?x,YvkXr2Gyk{z7-oy>Zx$?ydދOE#O7Hz]$Fv|$@Ruf3;zGB;Sp2u6!Zɫ rDS3oD¯016Œh3l{< Vi +}΀3a8#`$| > g<8 sp|".—2Fب[ͼëy`1,,,[B ё ʢap2ip)| .a4#/WJnOS,M &p|RI ߇)pD=S~Ox]XPVjбEP?/~qHCv0gl Q~t.AC `T/:nwp7;Lffvnf;I+E![E![FS4!LG <#0/:6u.;sv=ggs SnM)v7%Ceޓ ~ =< yx/La ^P89>\O=c\N\sx=VO~sܿO;xniiU)^ˣJNuY>N=zAP)UR)UR)UR)UR)URG鷫o7DMVSaB.L[V &QuET"nQ Eԅ"BuJJJJJߠ^qp=8z\qp(b .b .b .b .b .b .bo*bo~ߎ~Vt?+ϊgE"N}ȾSd)g씜SrvJN)9;%g씜SrvJN)9;%g씜SrvJN)9;%g씜SrvJN)9;%g씜SrvJN)9;Q1e O[abbbbbbbbbbn^qg$Ըa$d>Q':~їcYF_baNfyvߌa:âW RZ5Q&LjClC}m(?S :C ݡ^;1x=>%΅;p#LΎ&ade|tZt7|=05|1?ax |oMt4b(RX `5A9T@%.rh퐆ݰ7pFCRCTP(?JRCiwy>p$􅣠0O;D C`(ì1e 7򮄯#j.,+yߌyߎ>wCռ)a~=a*Ltx~xX) ~':30*lLxNjD%.1*,Òɉq0 ]}.@mylF,q7tz1qq[H ;D3t z@O;ʜq q q q q q 0d.Ő2Cb=rŐ2Cb\ !s1d.Ő2CzcHo =1'&ĄOCAxGю a8l a6~ x_ÿo;Wxó*?s<tEa ^gx^W5buBxބ`,%`,w]뮀b(RX `5A9T@%1g-<_ a=ԄWZx6F{U:`?QW0wq;sa80w;scx1w<;s'`̝0wN ;s'`̝1w"N܉;s'`̝ui= {OƊo;{p'߇)~}p?LiCg!'=(<X?bTS~*O{٘WUx |xBxބBs9\w;dM-y%P + ]/ta0c:v,,,I!JJdlrl29^^[exQX/2d=qFgVgmSY&.-----օغ[bBl] 1oüy7a2,Z 3a&6Ć0fbLl 3a&6ĆX0SoEfQYoLJeqyWݚPqNOha:<?!xC݌1v3n#=ErOS$=ErOS$=ErOS$,p9 \rOS$=ErOS$=ErOS$=ErOj7=ErOS$=ErOS$=ErOS$=ErOkfѬ=GhڣY{4kfѬ=G=ErO{"H)y~^y~5+jW= |ZB-_:o~A^ ^>,_qYGW/Q+̳w?G;tzuzuzU.弁:*:Ο:ΦNz'aIX$w; up 1NJ'aIX$tV: +NJ'aRwn^nFW۫jt{5^nFwn&Mt{7nSt|N;E7H7H7H7H7H7H7H7H7H7(z4:CDoEFQDoί\1)1)1)1)1)1)))   ]_VWju}Z]_VW+Z.-7EˍFrcG7-#D2BKDbȇN@WI=3߱r/W@נ +хJta%]X.DV +хJta%]X.DV +хJta%]X.DV +хSd)?E"%%%%7)]@? Dv.e:1N TH%ʼnYQ"y8|+$X ŒĊ/Q}*Ѯ{Kkwpm7~/g8;̊D=tqg8MUN fY 3;.:s\{&vl:a\ 3t z@Ojiiiiiiiiiiij3VV UBjjPZZ-TVUAjuP:ZTVUA5uP:FTfQԨYj,5j5KFRfQԨYj,5jujujujujujujuju99j9Uj*]ʨnw}esU('E(<'`•^0zaQ˶zUWZQ  T@j@5P( @5P(ꍷo]r6Wkoa6zN|2E3z䭊筎δkF}ӳ1>.H|{?}:eP,NtVL;&:֌c3'E[i{fJ=Poe;=~$_֩L{~]u5˙iFft?##ZYS̷kŚy7Vʫ`Jdz29q][ > 2z+=[x(ZJnwrltL,҈UYet$^VmLٍFLy̞_! 7F$ _ t}~}":??b8*k۲jarݗYlpbӯõ_MaWW&%^3ٌlfmlz,37ggUdз}xl):Q&hǤ1P<@Q+xgWec3KGD^CNkwlά(12*urx!3:12+n}~?WÀX1c闠_¬?Nt}1C];aދfvHףN9)50?ؽ!߾pGm/ k}֘9Dc3ĘtG֮Xl=ң;=zdm{CCtJg~t·X/Ќ֜։6&*.G ΌpwhtW OƉ'G )dv/ !;Ah>ڂP#h:jt]Ck ȰwXXz za<{ai<KH ūe7͸'>/^'x$ؕ[<ؓ^xq x4Oĉ ƞd(}pHX2CH ġ$0J"q8! 8L i8y8, \dd=ف]^OΐkxA3y/%N^w&@piF JQ\C ~FըT mi[PCGڑvŸhg7R3jF0QsB%"=I M{9ڗ%ԑ::#; t whѧ14t214trbBhLwݤ G=AyzSHFIp'ד$`Ŷ'Ƅ#0c7׾Pc#v$FM@,A04"?|0zdT)^7nA zA9xVstQ;:8VpV(6q6TٹGs2kHtDQ䊀4 ^VA, 1fb"` a= $GZX9!w\uB(Ecd!l1/<16j ߈b')a(ͰC5ZbqD4ghİ3Cs6 C#A ]""H 0d'I g0p\[3?a##Y^aXÚ(q8eG91$Cy* 51l3a3bhǰ/CHΙ;1B/ cN` {`p1 0, 0p?# O2,Gs 2eQ@ i0Z1c76>:V‰3Cwc2 K3a8a2 3(ekg@b#7P)R2`' 쏨7I(f)@ſZ?`l^I)JSoڤFs3~!xwD (͂f2 4:]T ĭ OF+?vn:W,~]S7rEZM~\,5M&mnMR²IJgen7eeqd53&)odk򷛤dSbH,mWeoa2@HICR"rt먘* D!sDo`6*YKa4q4xH')t6MtK.5d 8t03uF@Di E )G4M & rdӁ+ag)XO8҃g#EDDgcE@oHwZ#qD^>Hݚ/KZG_ gi>nB8wa=*փ=Lz%8=ݧ#> hn޷-6 z?IˡZ{W러oj~OF {]Ξ3D< x$HNA9΢sP9D ]Det]xtMTnD*t~CQ5p=Bբg^BC{k> }F_P/7NFgEΘIgZ!cdػVYl[=lm} v^1VGXf:NR]y\pD( MڑN/__䌣}g| ơA }xo>_; %}}s}{ZS-m%)c2i;,ErR;BU;H0mE$eM%1S r|5:ztkG( @?S}?")G}'эV+N>wH}rNzJOO Ί( 8&jkw"DyoS09lt'JBAZU~T`l\`L_tHWTc"BEʪJ%tymBNUB!0&.4(T)j TU=4F wV-D%i ݺw>wk1nּzFƄGv)*2;5 d u,Pq`0h*6l+XT^b6\_VMvJJTPjQ8OH{+ţk'J,H;d7KK]:{Gh]^vY![I>pיUi>ID]iVE OTR9p7lssMN1H *1**f4R%u3FrjНR '߲xQoBZѹ6N哣ڻ)xAP#7fN(z~PuЛ9 !9Ej=v"?/r`pkdz4Cm̢ı]`ca߻"bI F|-gV991{ڬIWZCpT>栔6-$K3I3I#ޢ;&qQNYeq]~4 ]7(yoY-P8 ѕήX콉RYV(./?ՍCYʧ㴯,J_u~G\ʧ?zKU7_ч>VbԍQ]w}:/ݡRgqBo>O+]>=.]aފIw[iЮN}*_Qwi^_2:W~ܕ |. |K9WOWYvFЮSaIUċ-;yKPvvQVm{mR"✷i-16@Z"e7ql YK)#G[#%|{hZSmЊ+=R:ϐ%9.DՙU~c#ϧ vl>e4/Bcִs__OtyGr^~FkO_k~X4{9W/G-'gY1f{Εm+1h^ϵJ}QzS}1ÞOڶYS]S({5׮["̥>~ 8\a:3OE2u3;i KݣǾqϸMU^{) yS֝7&OAz\ʸGecqnuWwvMP}s/_uտ\gDA-۴%k7\pm͉8aǐnrI.$Ax+,E֖"K!on%>eP啛(H`%BlHDDE|_쯖ivA2ZCF\)ѓ(DyeW5ڻ.)c\{S].V:ݴ| %WRCP *6 >;v.+@\ǚI;u}jQ6<V׎ء𝉙r/ }nN6 i]3h  dIOdf)oۙnZQV7ShXo.MG5 tb?{Qi&_cUuxo:losLZk4|pK|{Dpz ]w@}x90џW`ID dnL|k۟Y^L٧*_ٮS {^u~n9_VSa^?vҕI*^/Ԯ5sၹt2/g.xnރt7v4S}ɉ:_=zbbāsU}9tni9ѯKoFJls`Ye3tҤÖn'jwl o:_PꯢmԼuI떔,̍|oL̲h711 ø?67_dڬ\ZE>pЭfS*W`h;39+v>9U~z#$QxîjU+[zF{0h!;ͫ>Z[Ft{עcUc3olV`gtcgu/9vu}aN.z\7b:ÁG,o{$)$'D4:ZaLڭG\`A'>7X.(T~߬6bDQ*w)1?9Rë} X$E%O0|2T$9L{INԊo٪η '-w\lʬS[<"/}sYB C(y >ꏢP$Cy$ XuE<2_g4_jv萉%T 92]Nlc8zg3_02!`|KMO/;e~}9tx~К3 Iu/N3$ՊǧW-pkxi|٦֓vynS_z(>?ģJryGl֊a8s/N9p޺Ǘ3zK,VM4ᠼN%\}}aJZGƻ43n>Z+ ~{#_zZ]ixs:^ku%)JŵPHP柼Hn3lyrAHY.-BT86m-N|fi+D49i__u4L>.)svȟڽj`m[4&Zu}{مJ%2;GUs'M>ȟ=~W|ѐ0Z0e&5wt4BI[O+Gg.ʭ`VE=#mt>+[{g4/vo!XMғw{ԵR^ɵE MG3 4s[uۋ/1^S endstream endobj 51 0 obj <> stream x}n0E|6NuLpR ,5L|}vہn`7]k;SYDtUqvy]ٰO\ -4.}?(X㎱Я]KiӮp{{+z$@kܥj*rɆǫ`2^E|3[vGHE5璓zz~W݋ A2!/f^TXT14 *Ak<m+ʈ DUABpճBS&_A/d h3UBm?L{Y~/:~D稾GƖfgֻd]?_ endstream endobj 52 0 obj <> stream x||TU9NLL$d&2 P3B @@^B/5Zc]u2+(*kYEѵ"$w]>;18c,7_XQZro2*/,w2\Ș΢7ncֳ¢bd#Ȕ\2~\ňJT}WUd۴1W䯭Wpg,j7{$c#c֦ƺcPTh#>5[=nUri\<۹2@{Mֹ f[neϫ[0紉(63y{c ,Y`Оhpq|r1\rJ]3>yQ,X/W|Rodvi7ԳG\VUjMDO4rؽY>E|TfZ?iu˿w+R_Meڼ|Wl%Jrdw.?%wkB8;QDnctyE!Sr-B<.7)W(J<'|2 x3_%| {>{eKoN=l%[/E%т3@MtX$c7t ;-c+wX=1]3gզRO3q?4]wb12oIi5SLUVL(?neJG 6tAݓ͝G۬ashT]\{j:{,a*>5UesӋ3O饜95 t] ݮv> zs?1y4# FJ JM.?u56]hdmf ݽw5t/ܦ0Sx_M+k/**tTk>V7Z]٢bW[KڭlFmFhnj_CV-]c;t3ܨl‰p>v~x/O=4LHÄtچ))-{ *]l#~V)1>"SNu* ,k[f21O~M[݅4nU~o!.ע_WNP^v/G).1+"b?gvZk .wyy˱3gh?)jjw:>g)~o5]X-fm8ǥhOJo喙Eύi&WPl*͝? VLf&)BR 5`HREт~I`i~Sph=WFEz 4Jk;s;1ILHa§%f*wڍ5_%&Z߲ wY*ms$KC),pi>a<-T&ZMVQ;X!saOiŹ5q.eFkۺi]ꮨ:jcxT$+eY8{6/br+" + W jۺ!j UW8i ߱X]Ι3Ig ҧ#W do-r5YSZ[-6T{8+m\1|ŝ/yŸG~0x,3֍s 98-EUTj쬬Jyq:Km*0_6 Jj.׉v0_(kL+Ʋ"K?5k@bX(Tj[`[UlvSʮnt&9A!h"&VMd EHuauKR<8uF fG0ni0?*ďЖ^bKӌxͺ ϶-hP `tT*ڂ TuMp"dD?,?ΕM⌰O^y(]Ml˽2˕/0c6n=្i:[[Mag.@e ;*[@jW{ GAlbJ"z)IV5Rb+X!r)I,R)HHR,b+)ΑbMR̒bR4HQ/ )ꤨbӤbS,EURLb>)*bRbc#h)ʤ%E#(X") ("_Rxȓbä*)K1H\)J1@R"GRR"KL)2)E)K.G4)I"U)\R8H"ID)R$H/]8)b"Z()"Ia"Bp)¤"Y)LR0HB'*"CR)J?I?HIO))H_IqX/BHIHw)>#)>@xOIH-)ޔ )H)^5)^)^%)^)9))))KOHOR<.cR<*#R<,CR쑢]R<(.)b)ڤKqIq;.=R-şK;CۥM[&-R,MR( R\/uRlZ)j)J)OR\.).R)6KqK*ER\(Rl|)deeeeeeeeeeeeeeeeeK!...........................................^SD́Ń $h] 95DV $$-#jd-!ZLE|BD)Dl^T.(('QDT(F&JS\TILDH J$ @qD!&gQ$ҬD ' # 4 (LDF"C ~%'{D#z6Y%z+7 f n"  DJY^!z/H9g DO'zr>A>DScD"CN9w .vb@@P~%A@,k~7g(N;n'VmDLDHt]OtVk5d]Mtѕv')m eDm&r^LV+ED]@)S:?3t@Ls1>PK 1_ZGrVb@+ Dˈ-SED 1T|9h.sfS&YԲTr #%N4:]C-J4:=UMNJ Dh/h| Z| |K g'᳜or~ || }=  5l>7ou8ZXUeߋa/@?a8 |:T,~}={qx x4t·C8 ]؅-+YV9ﵬquns  Ò|p+lb&G]סZr-㜗g97p^byx5]{dGĽAq(o\^,UcDbTkWHܧ1nOqD q(ElmGljWJDP Wĭ3\X Sĭ3L#jL_YaqZ_eEZ L.T>c#\q"#&M qO.3)Um_ZƕJ},)̟TQPo%)"׫NTgL[Ҽ$#c4ܦ-YNd)lileM_kiз ~߻W_0S95( @ XUJ`X4K%"`!ss@0 4 @=0j4 L&@0 JqX` 0(FH(BF^  C  / d, z=@:ҀnHR$ p @<`X HX B `B` Ѝ]5pxp8~~~~ | |__>>>>| ||    <<< << <{ǁǀGG=@;x<@vہ{?wwwۀ[뀭5Uˁ-efbFpϱ9?csϱ9?cs883 883 883 883 883 883 883 883 cs}ϱ9>{cs}{W݀>]>t\qOg%Ml3=e3Fv'>{,y,T _ t+Jfk}YUXcfe4%<y|BvoZPbv RvٯͧX[ Jv]uq=45:vkF]͚.v=e=FFDLm b ֠oZ{ ]J, ȹ9QFb @dȺJIoQ-%_W.FU[IݬNEoc;0wiJ2y{cj3gm,v0ݬ]Vڙ; {+1'Hϣ=|d?-r4{'"{=e,W/-:P bcX6{,w),4eû[a.Mz^)aܻ6v@q3ڼ9#ezms8ԧ74D+FcKwҿǝh~Ws&+j W׏MV7(ys ahf6WQ5T}`~jܢwؤH)2)6&f<>_ tsR5 MlRtC{=琔҉QV%j5#m (H`L1,g NqZ#- 7{(n. nJ/o/cHd̙"sȜ)2g̙ܻ yr;?ۉ#;#;C5lEbbkQ, c_;+YŰ((ZbĂRlܹww cNX^ΐEMzDp59Tcm(G+ތިh>tۭo.:Đ:VqCWCJ1;jٻ3>FhabSyk 资6 B QkCߣ"hk'a822jOK㯓 rjF,4$΂h hTnMAfo3d 2`1Z k/o9ϩs\W+՞DaLN8>g!}rW.W~bVD3bGElOt'%O0vhߜa0Gt֭Ğ`[IY%֯K_lX.1ֽ6d(qܰ n7HlpVcRbW z0{&X'8N\u˅{ɛ26LRN vU?yX7֝ǥz xyҒz٤oX8y|!A H5k)Fk=kn5E}ǨZ=))i&uRw-1l]==9mԵ|؄pj 9EHIՇ'ƨOY*Gjj0 }"amYS)BvezxCkiXr78qz﯇e2Ĝ"_'uݧm;c̠ԯc޽kЈ1C+ {aN7o5)E=%)~DzpSς*~{p؎YC;2{;n(}2y6lrnPuʫ-u)_i%-;fO5$!ɫ/)̞tؤa ®MJIHI* x(kbJ;%2frvK8W7$ D\\E2'K}E)5)AFe9fF4Pqwc?V_X`[fnTi rypɬǾxx6wpQ,$G֐ /Qi:pS8%h1`;j,#ֶjy+PF#22>њeGv/ZyT9YaK*5ϪshZ,ɋI$ٖg$i e @ӹR:ϓЙN)-Ks$+^':X~~BjV̂X-9i).7~d:K\\t%UʝDW(TLtR*32'U@J*DesA,oDrHY]eH|9'  ]i "=-"QA7w,pMKKk>-ݲضox[NƵb՚/?40ˇzo_ݢcXZj:v_jPC)CgfVVz{~Q`֌#9V5xeHbOy%ҋF:ã_/*jOH9 IKFj^@\}kG9= ,Q7ǨU/^U?>$3ˈMykD~ >!J1@y јj GjUšֶ< #~/P9_|^J`)`Ha@q9Gq&uJ&znOnV -:B/VO=GNQ`rj)Zg8滀~@tp/y!&'M|-j8ەcU[Qٶ1~J@ #GP`q$+-C> Vya0nQѤ;:TֈvCP[[FB0ʼ^@ _Z\d0uY-.רMՍbƄh\ [.1;RᾸ2Z]6n5eD.k {1U6s.]3 Ez0)ڟV D C3]zN@lX ^@ lOۏKrv}VaIʢmR#0No:\ 6*Or Ɔ† h`phbUԜZg6Mj:p[wZoRlG͂l3s- }V . '8@UI$?wG |R)+hdv褕 ՠ{uHMBwI5 nh(H(|D}qb]zLwO,f]hWI}:|e'ۀ6 od6hs}Қ:~76S6!:lX XID @ ~wmp2. S6ئB,GHqZyMsHpr% :V~Z\ ˔Nޢ pJN_*Q Ǣklk@8#G: y !7>G>se*<8Mqs-x^ ܃/b@0Q?21}+jN?bťZR/q) $rK\`) JZ7Tj,bBn'tF-wL%)IU`3?!5Z;^\&uL@*srJw}M\D屺}JR Q]IIePu7].Y<>sz=\Fr9:u4,1հȓ>%DX@Q&(īLE34i;iIt;|TQ|C>L j/NnE6Odĺsh H`$ǧDw*CH d9U[-fޱh׾orX86(AhY3S_ldcN\.y_~gwifЗOhId3{llV3Dʞ>HD84q5՗f,_x5A?Y)gODͷ20&G#"H$OO?Аѡ Bcס~)RGչ*|lG>?wF֠k[Bn<4йmސʠʤjxswKC/ s4CRcvCmgevPU$%S*9/]=sȁ[Fq(b˨sTgj|7@Ȏc$6>9>eۃ[ۇSƲ$Ly>BJ֋/DF$A9 W \%0 EU ֢6Y#oAԨjVNJJ%8ŽJK ) LMbZZc2qsHx,՛):+-4CJV(dohv#`5%ZS$[d [uX{A -a"~x/OK""eU#{ ;5VSZŤh[-GJ'x7Re4RӥXnr .8ᔬyln뷷u>c<йˍaX5tǚg(I`Urv Sms0Ca6;q\f'dKוafg6|rmk`!V+Kޢ>ABR?K]H 岺m]0$@!hZ.xÃSPZB1Y1.3脹52(q8{@`Vgwp_׺֥-807[։CEQ3׈x)Iw"Z)䱹cǦ9ux˖;iv:A7G:aXs~d̎On)/2&B$ ۆIp9AʲOCAIB@њĸ ޵X換<-@z%WV88AX] > Ш*H嶅-Zh`{ A`z~0¦ {{M}h!a 4ֲc,Vh49V7;@g!s{VLJXֺH&7VGټG/g$ILP^Yh-;KѢuܘ@ʧ^~^ɷ|W3=H$:J_ yXZbiC%*a_ˆB "/M>|rSql2ʕ]kq|Gg.y5Yqp̱{kgJ)J s6j2Y% C8;hkR}H 1me6bßZ}&6>nBCҌLm84g1 Gq C[;*鳫V+Fq ݵ(].]NDJJu0N9UcRX-8U\A0ejuJGb͌ln`J"g$r\6YVKX` 7e0& ~ArpHCAo| qqD\hNd_,q2 ȱT5Qxx`Ճ~D5Ð.qC\CQϴ׋+&gYD ,bE8)NW] )`zq>&Ss&XkKOѳށDhB؆S6Lp( . yғՕ#Ҍ:/W\ғeZ 5h _ F83봰P(VliS=)L3?ǝ^'Wt->#Eh^@?&F%'0Rtv壭RMVJPF<-^.j pb7Xtk!R]C_,Ϧ zc}5Nz*}~u}_B*x~b1o! Y~?8NˤVƾ0 LTe $r,$D2Y(%CJ>2Xg8|H+|~D&@z=k"K ZRk@Bn7BpV9k6hH_B8PL]E(n3(aK:=Atc 2X۟3a3(eOѦ(P̔ W Ď+u~aH-U;C1CHw rj6,[ U'%iX --&>$xwwr27dH F&7KRb LCpCZԗ%`+bG֮L5Ŧ2qT<^؜HrU/ )4]ԁ<-jjetzsMfY/_# þoMF:Oƻ0d9.#Qiah/ ”ʟqaW*Db c j׏TU YF= +B"bwYL:eT7Աs9,mfx8-ky RGHY{) TX/U"ܐVvsVhsWFP,#VV./2acj+!ܾb,MQ!~XO_7͛9f½}ހysf8GG\bL81\O 9qK Kkunj@j+AY6ˡu :)+1Dr\6 @R;._Uo%5Uwlf 랒d/;&9m 0xUnþZ ѬlAP:ռP"R(Z$D)hHHW@+W᭣r ? E"yMP-hȂR+XF0eo3Vpm70C(2$h@5#RBtշ~x4];!i^Ga;$ISIjT:DQz5)h2&Ψ$qJq)Hȉarj$ŵ 3M;tZG14ŰXζ|هt+Ȋ 87#D-{f>? ,v70ֻJH}QTUOvMdGǃ~m!~) _Hߐ z%lUh9F[pީX #-H$HP9 :e3Yn r_(ɈGQ3Wh.eAHXJe8KnMƢF[WY3TnCs Gǃ'PϮ0zC If+ 9Q_|Ů>__3Xԑzg$MH 4"3`'*{{,DCIj_]ΟoQ@]IG"Hfʽ#C7w"AA&)CQL0*#~E:*ώJd *e:-C [mh#@zP6ӄ$OҦu n&$ӬpP;utɥѫ$m=3fglxRK>, ۓ~@ wxc|шߏH)j ++c1g7"MP `/{s"FТXgе9ba)t' 7uǍw˜vP[BD3[yDig.*ݑ[ b$I{Y@̦@gX/jRiّp0Y2vc^+ҌZD?i~ֽi>( M'[j5R#jy{JDiq@#2`#IJ-)䖰h+Y F2dRsC.` $~"mEd`*Ī '"݆j7srWobwQjv)H%UcmH%ؿZ,ģfzVfmc|wGX:6s& 7'EkkT8T1;pͯ 3J v{(찋" w@1'wXXߨsw܉fbhV$D(Ot:Odf;Cəޚ{ Zb!4)wJYt7(QY΢M,M!q`ђǍm#5f_=XK7ɼ㭢fo@'yT"V3Y9Sݲ+zyoj!(줹SVhLɭ+4rآkŐ~g_ke_Dtij?F4c_ ^pJG >uA;3 vzBC&5]hӶͼF? V}uIGr!tL" Hˌz]zi0\쮳; ᠡRvS:u1) *Hx `24mc">z+#oGc] :Ϻ͈ 9u8c㣪3K2_ H""D @\$aH&d i2 A 6(i%"X݊&/HEI!rg3L X~}?ų0OTUz}/\ Y댖ШyptpLǦ]=8"$9ڀa!^gMxqWPMJ1jyWa0k>3g =|h>zU?5?n&,z-Amߗ򯆌s<6=ɪty`ꨫKwH6%ޢCN=$#i1iR᱖PkL-ªJIHI͹.%m̨ lvW2}N`^bRĬ#B-I):Ams~냠;K7>szstbr;Y,TN!Yk:dڻbuZ-Tm׌Z)ҬEc @ 6IC=1!s ze! qclL׵co&Z02ή}}䡁i-$|^Md 祁c$! Sص/''H6&cgc1ɶxyeNJ;$7FppsF}I'rKA u:=!2:!\/H}.۟5v1(fk |w搴|od3_Ȉ9F 7Dϑ <7DJR=#P# #~ߥ#J DA6JF<eҔsK2EH]+#c eM 7㢢BO0А ֋z=bxji4/η|o5O2'~h׼-#rO)cj]߯tw{^Oi1CvIM3i7h&r&fm4ѡV`\u3a ^YEoz$>\]ocsڷoPy^;KN >+q}+F;΂}L9~D-m( A݀O߈/]-A|wB!' e 1ť&% 5b&%ƙxu}pN8ɎGr8%n8FN[@L7X,Js,4r3dOF^/ FYzi%fplhcn6sŘ~*,Zm ?kԷfůP!r!-ռ֒sm/au_id굶XAFZm38rqcPkFץ$M  < ^ +Uv>c>x3~C2D_?Yw.-r`T\rVE$FZ׶P`ﱅH= IHK^dX9L+X`;L=-H/nin=B3)Gru"_cJS=M _F 1NB-b 9"պQQh2$2-K"-/lW_.ʷ}Eԏm墛$/^IArP~c&^" bJ1=$_/,Ud2'mAKŶJ26WB7nm;,xr .9(`Ϣ؏>]J-q^Y!9e^IM,G_AJWd_UI.ye /!C֟\zrI6=ur3CmC%iK|?EWe [3}LO?ȿA#TNrRyJE#ow0#L= " Jt:,ҹHo$DEhir::(,g@c8%tBǵ \|mǵ <^iNT>NUIg%GZn]fւr nVN@r> Y9ݢt|irZ0ɗ P.H#\gIg%Gz#Oj`3f t5 S餳H#݀ơ-tI ;'^:]餳H#QZXK$kwk<Cە@+NTކC;H"K:ttW&fnfzf*J- `W:r#XClĵF Vo.oU&\H:mt:,ҹHׁU-F B7nvBVfCc ޳y3z=6nDҩf.t:,ҹHޛѻhiE-zo&7wDL7S- h%t ?w3t:,ҹHQphP-{ x z/,A[8i&fi&X/t]lm)Kni6b0t:,ҹHoTއnR^nVހne_ ]<:%v:^N$=@א6ktr+TnR L㚇~)}mWA+;u {R>=[ ijxY@< g, ijxY@< g, ijxOI)B7(7h18QDZ:e 2pYFb>輁}',Mz_61Y{llioa^ҴeQY9֊z093e 3%kZ/k:o`u'e#2Mn/0,<_)J9 &\kY-~V˪ղg jY-Ϋ~V˪ղgY-~V˪ղgy7 TJVbŹWvr "8\B"וBs92*8¹rSw 8 p%/鷍\2qEɋJߪ-}2XA}7Xn㌓~F!_'R5r)%NH= vJc?r)^Ub G%ΪU x@_5^D^p߇ґg>TĽ? Bj8xD^Ig7[tL!keda?3Eyh\˰qM[b ̒bĉe}B0qR)b\s`eӓ5ױY(rXDmQǯ:"U(r%4gk-Q-đ8B3~A#(睗FX3,x(\b^x Rtzx["ᬘbȜV+)~g5jQUC/U2A䤋"M}ZHw7+zmePE]e+jaQOQ"vYP{hHWmH̽tܢ^]!RqP2Փ*Q*-Y5z w7^1u,ʞrZKWggiȫ+h=q-KiMwEoNdNNsaʊb|cEuWJKE%*yUY*JY^XUS.(rUU*bY.]&/u{KR\YQ]^._T%WU+ˋŠrWeU|W.v9Օ*,^QX5L*sAӃdyu-\^2P%{*+[ІҊr 2+e]*EdXbWfJ\,_&Vc*oo w-+Kƅ2#E8SͽPS^,Sn.,qV2}kQug#Yp%_9".8a[pXU\"W'܂,w{qON:  1wJ*}Juaj\s++Pzdd,]4,`<,ûS)YQ-(VrX"ͩkU.DL*^Ah2w)P[IjuF K_wyaiuE\sO UM}W# RCeWBqQ@~QspS]OWD Ս^"A*V8;gj ׸ ]Msɀ~\LdHtg SbG <`̠(,TkE1ӦZmf5>4T"h{D{]?}DڇILQxy˞x;ȫG:_\o+<7[4V>OK#^ ? c[rYXp׀p߃c+8~8~׀Z1*8np\  orn  `Yx38%  ߃Ap;&^ǣ131',p\ pρ* 8#}9AC0c68c8V*p98nǧup(^iւc 8 p,p,G8._p|_7Ǐd_ vp1q8ր C)8+s|8Ni8c-8q8> {/xdz?RF/jBr4eq tpwc8>q8%8G\ i U׃Vp|Cx nH35Cٚky1Rf8NX.? GNןzOzQ>Nh̚m^=)ȹQ?Fn4$=F,htjQqᴱzѥ^:0FWk263tx/~ha~"F7u dIm7 |ZK\=^>z)~Ԡem&])Z?Z1~tY֛TӤAcob>Iø'*#8/[% Q7}VtF. Sف? b|>7Z}; ͒IM_4i c< E0O \L870S%KB$\sL2',SesQ<W7p=,N&oEu&QUP&37Yؖ-g=Z1=d`eq0#l=@bQftZw-z zn0֮^}[n2grYZ%<gpckM)~b4p)`& 6"\{я9s^EVT07)~f^o͹5'W+X=k @RՠBDDȭ wa޽{_p"y| XS,$FN(V B5]՚䨭[ǂ&OSϪզ5[G&~wå:omڽֽV]t6!D?TKy8}+f6:^eSl5ŶU?F0ۦ6} /?.wMmڦ&zx=LVn =r#s{ Qv1Au_6xh؈k XZ^Ydoc21I 2! ♘) c=ZO.]`u,$4[a:kt'rPG'l ی:30P}Zccc3-ͬcRRҵe:x&ff'3&,Oa%Je\]-KxnqT1#Oz^3CÆ-qUH#=i ϯz&LB:`Fϩ$j*ǻme'=}'x [mfmm۸mn~zG;n1}G;8XԸ?72'~'ygvx=5;]WzqW:|"H b  ` ac

        V G#i4JUI[|-FL`:@#`̀6 t"( {S@0S46`:p;0 0  '(U1X<(\<l~ <vODEQс@Tt *:DEQс`*gQ 8_3J"ЎhG#yCQDgh 0fr@ D@  Jx#Od  WW)@ći ҁ \ F,z` 0n`0 [[<` 0Xfw9@x|J`pxP3hGN#'ڑȉvD;r9юhGN#'Y(h v@VvP T!ȏ#?>F~|qqqqqqqqqqqqqqON9p].(8rkf#b9>J$F#\a0u:pF#\aoڍ{k7nNJȏ|cca==c xxxxxigFxigFxid k= l6['6`;hv⺧]ni78 ,<"2 ;U`37?o4 o TZȋVE+yъhE^"/ZȋVE+|Fcm>G/v9Vϱ~BNu!S]ȩ.Tr 9ՅBNu!B }+qDZB }y+tVX;Bw b"O?~#iH+GZq?ҊV܏~#i#]iH;Gq?Ҏv܏~#iH;.]ﻰwa Xw|!,0X VܝW]߉Kq.֝ں:b8Bg\嶅2.+bXA 0! KqIX $YpĜ9K齽g}y=|{s+9xx Ocɶ؋LjR#weh8-2-2-C2-C2-C++ҩTJRTTsPu̇*|2̇r?$rH9I$RHH=it#\)O#y!O' [q٦mئmئmئmئmئMqSzLy)1=ǔSc{LydlH***ZQk8j G5ܴpnZMKi 7-%ܴpnMi?7ܴ-3sˌe2cn1̘[f-3sˌ^ګZ{Ukj n n nM-i΋SfM8&uzN?2{|=,ξou۶h[k5mkFZmѶh[kMtMtup?F6 7|7|ӂq93nZdBMQ "ws"<|6O|f{^7 8܄fG;ǭ˭˭˭˭˭!alVl퓭_~{^߱߱߱߱߱;{;d+"[{;{;{;{+b+b+b+b+b+}G|bq=c=c=f,5&dRYj2KMf,5&dk}v_n}v_n}[k1\\\\\˿z=ףz=ףzm0fì~aV?Y0vjԴ˩i.%dwZdx o 2A7k)MK2Le"%D\&2z0ꡜd,3efL23Yf1 f4&dvN٩2;UfT*Yb m6Cf3 m6Cf3 m6Cf34hР4Cfh0o`v̎ٱ2;VfX+cev̎ Ȗfv3t < a~Xx˰/+"^Jaec5UkQߠ>=T?P(^xflVlCZ-lG-vx hN4yM3vlA+M'E;A:pB'pB'pB'pB'pB'2][ktm-ӵkumm׵]׶;9999Lv1cd?&;Lv1c8q?9s1c8?????97e|7|~&VLYnW?~ЯwCsC = = = = = = =r9.r9.r9.r9.r9.r9. =ϙazzzz3TgS!:CLu 1bsssssssssss{EQEQEN+d9,g A;Ap= z39 l'19;v4LTdWDbΥw;?< < < < < < ̳Mv.gL3}>g>ph+^o;G].QK}ԥ>Ru괅$N' q]ܚpivw~nnn "%Y"%Y"%Y"%Y"%YG걘b[synU_ܯy sXa+a90V sX! P P P iVHBҬf4+Y! iVHBҬfRV(eRV(eRVHBҬf4+Y! iVHBҬf4a߰BҬf4+Y! iVHBҬf4+Y! P P P P P P iVHB)+Y! iVHB'+tB'+tB'+t~į~N?qO'5> dg A3zY d=g AJAJAJAJAJA1H1H1H1H1H1H5T3H5T3H5cu A1:K2 2WA R R R A*dT2H%T2H%3H93H93H93H9T2H%T2H%T2H%T2H%T2H%T-aa ks6㓌Ix)xo1[LSo1[L}GM}GM}xbڷ-}ibڷ-}ibڷ-nOOi, E_-,3et2Qf:LG(3et2Sc zLA)1=t67m&bn"&bn"&bn"m&D4`"L[-ix4e!k!sun[ֹun[ֹun[!;stmԹ:Q6FעZt_k}-EעZt_ky9 9ac y,rBx +QUxXos9|soԝ;uNݹSw:֝֝֝֝֝֝֝֝֝֝֝M:xޤ7M:xޤ7M:xޤ7[O[O \+trN:B'W \+k?dLO} !mͶfgll}6>bMϦgS)l}6e0tV Ya:+Lg0=+7rFl|_qy8B\1.X\Kqor\+qƷ\k#p#q{/ Owܯ0={{{,gKgY9fܛ~So*Me7T~So*M{1v2wݻ]fγ{ٽyvEX%X  /%DVebb-ʼߠ&T D%Y^$F6ʰQE,rX-bǝ~cgO;3߸E<G:nՑDmTvPf0s3̜a 3g9f0sg8+Y9cCl`'8 6Nql~/O3,ƿ܋0?İM İM İMlĖMlĖMl19c 51X51X51X51X51X51Xs51AF:H)H)FJ1RRb#)H)FJ1;`#%)H 6JQl` 3> Fgs "eGmN1gi&b| tLgtLgtLgtLgtLgtL~ݠ[ttn-:eo6T&۪[ѭԆZtLc*SJT]~WUwU]>OSJ'T: NtB*PJ'T: NIva;鰝tN xN<Zu@h:UVЪZu@hujZuu\]0WsuȍnOI6D~٪S#>#apI‰$Dp"I8$HN$ 'I‰$! L`B2 d0%)L`Z\E;A:g %20 20 8C}G 1dEAVYdEUQѴ\'ԈF45MhzD#;@con$z?iD~Da䑟:Ad 1GL=bSz#1G} y]v{WnLgB>.@BNrxG?e;pw;\.x 5ا`S}jO zԠG zԠG z爫EV؁:m4; .llFlFl}>llFlFl\n'vRlu giN@edG3&Ce+^#3:4sFcIS ڪ"*Ҫ"*Ҫ"*Ҫ"*Ҫ"ӱw+?A>gG:G:NHs>b#v>b#v>b~B @ @ aGzE+^QWT6Kat,6Kat,6KatDJDJDJ,{UbJU*WO''z8=q8I.ז!l!-uCxQcKV Sfnf>ݧwS}J}77Mi8]'joncd0!>wy]qwwLnnSdկC#?2"gF`pFpZveZveZveZveZve:vc:vc:vc:vc:vc:v_u_u_u_u_u_u_lR6%Sψ>#3,dd!# YBF2,dd!# YBOy,B,B,B,B.~lOb:8@/} D_ aѿ&D_kM}+D_!F7JU}D_%*WJU}DHDHDH4\'rtxd3 ͦlqqs9,/X-4fGv? N}»hw[-ó߲߲߲߲߲߲߲߲߲raaaaa}čIÃrxPax:- Rd9,rxN|BpaMCX"/yȋE^,bX7|o-o8j;Q;E(#яq$?Q3D~ߗ??["D%"-jj?.r\"-iHEZ.r\"-?iPDq"*ω&"@$㝬&dkկI.;r6Qv">]soս~ZV e_&e_&e_&e_&e_&B7B,4B,4B1Ϋ' , Ͳ, Ͳ, Ͳ, Ͳ, Ͳ, ͲCl>Cl>CGLX/ʱ"483 #|8\0y .e&qUwp Ep=r>k܈b'O>EX%X  /%DVebbm\'[7Q*l8mيmF w q6~ _G4sqa >/\M| \p5\)z"| ŸE`F32 fd0#`F32 fd0#`F32 fd0#`fS2D6O}̾'{2 vb Ÿ'sCGlO< p!.|#|%.Wj|5IEp#qY:OOi,3fa1`)2, ( EX k*JPS@n6}2O #k|/p{ >OTN_38S|ga>/—1w&VLBp?~<<#xsƸ"1qE+b\Wĸ"1qE+b\Wĸ"1qE+b\Wĸ"&F>8|̿.E*eE6[dE6[dE6[dE6[dE6[d#|5W6Ӳʹle3-iLfZ6Ӳι)tp3n1'`"n$k#߇ 8p p p g}RdOro\|,|^w ;8Gpn#q78Gx嗽^y+3 <+3 <+3T7<+m#rWʑ^9+GzH#rW5|jßNݞ59߽~M Z^kkmzM6֦Z^kkuzN:VZ^kuzNmkzBU V*Z^kzB_mW[V}U_mWF}Q_mWF}Q_mWF}Q_mW[E=OOi,3}7ݠwnP A}7ݠwnP A}7ݠwnP A}7sʲ簇OaoUl[eߊmF bd.ϽvfpM 'Mb%ecGFiF b%6r41, 2vYβêa! yy=/_gvw^}ÔԳb\,b\,b< ( 1F8?2e  āog~`|_qa8\; .%!.e& ܉I0wܯͿog~Y~>`!a;_гQ08ߜ<-̞6/6/6f{8_c1axq Ni8gƙ8 g|"|'2q]\lͶlͶlͶlͶlͶlͶlͶlͶlͶlͶlͶlͶlͶQj?\ JNJNkS4)Y4Ţ)MhES,bX4Ţ)MhES,bX4Ţ)MhES,bX4Ţ)MhES,bX4Ţ)MhES,bf2Ţ)MhES,bX4Ţ)MhES,bX4Ţ)MhES,bX4Ţ)YUS{|K{x,6j36j3dՕ=%S=%S=%S=%S=%S=';D{hCw!;D{GHMoaPaqNI8Tq mp6wp.|'.wq!F`$&[qn0wa ==h=Ql#F=Ql#LƟ g<^_1 /eWQ阁x o`},Ģ=+?(gॹ:-\ɂj6j6j6j6j6j꠮꠮꠮꠮Ƚ:::::+F]1QWbuŨ+F]1QWbuŨ+F]1QWbuŨ+F]1QWbuŨ+F]1QWbuŨ::s\SW>uSW>uSW>uSW>uSW>uSW>uSW>uSW>uSW>uSW>uSW>uSW>uSW~N]}u>矨r{=*jjjjjj*****rXF]˨ku-eԵQ2ZF]'+RZSKyj)O-婥if1,tc3Ƽ{GQߣݣn}w;3礫ыwvG/ݹ-jӐܫMCrZz1]9/w=Èg7Ͻ'7R }#Ű7R\|IOZs]%zJOW驟 zpnÍAojP5ZqW >5FF 8[N>hohR141+\~6\n.rΐg_:ܳ4:ʣVRTo_ulXǨX۔=~'~Ѷ/+dz3m}9m=ɼג`-,eZOz`ո>켯5v=j}+r?7rWGe.3S}C#r#}OzE~vFCSÍ?ˈg?LAEo&L"Sr^[#Oc-?5F:}䱰+tCf ޣqM-\wNLL gDrᇑG{7SD>ZfeDW2^Z}ߏ)k`fu #ȜpEd.ާ =0|6EFɑ T].Vބ>I"=!>  5mwp[t 8DŽ!vqrIvS7KrC:V)+ϔZ\[tgj越nYv\6[mUnנxqKS> 7[f$ rYn5˭Q՜sVv5Fn4'F]oԤQuQuFb-Fb-FbFfmFfx#\y9(#o3##%#//{._, uH5jP:ԇWG>pr]cvdMhAkp}-|&t7D6D*a6[K"2E {#<= > ߊt`" )^q5A_U}k_—1_3r迅E88*5_!Cq7pDx=oogs,}#K7Rݹ|Tל'==gY ^{?C؁jjttx?8xa7}F3m$y6dfVnff:g:֭c&mzlzg6BXhoMV*SVhVh]ViEuV!7SXAgijV32*3_e8*ͩyWhY̼̫ͼlmVz~l2 0 ~_lI3N\3ufΌWgl+#̨̌h5[n42i4Fl6i`رs9*Ɏkn;eǵ=Ͳ,Ͳ5]٭4z[evn}Ȟf lϋEX"ʗALWvM^Ϊ6[};=GtUKOMYeLgW,y^X>/x^2L9,`,KXoݩ<|/J=Khij>668Hv#5MvZ`7[h[%[Fn#taeFI%a_ 'q)H\f;2llEZPSw?e[.…VA?7fܜ͵wXV2J~o%TRߋ# 혋8|Ί>Vl%\{w.Ζk]ʋw˵k'Prhvn|\; \ޞ˵\[(ʵrm!˟y,\;EQ-k 2P-sy\^/P-sy\P-䥳ڟ"V`;xBwrm\[(k Bt\[(ʵ?B^|G%wrrr j%^ 7Vl/xnϭJyJyJy!+xJy~koZ)T^+R^{R^+TcX#X)oV)oV)o⭷xT*9U[%U[%U[ᭇx!zżU[%uoV o][ *޺*"jZުZz*yJnOi8g S#yjOe>x睗xUBNK/3"UFd1FMyi#OooHLD9,dH+լ%WլŊX%2󉅋2{vpU4RJy=}OkrQ>4JϷ#O1Nm`8d6fj^M\e\UlN$ٲRjOӳXBSYhy ;E*6bo i9Mw"XN˅Z.-jB.yzo[+LXw_u4ު4-SަJIK>RaV ]U2;dJ,l ׹UMj_^nWtJ;x.с.؄N!;L:?\U-ğ%T2{wReEQߗЭn=tڳJ@5[ߒUժUҮRtCte^2띥YMU}_Ϸo~Mz6c.Wl®Yn٭j5Zh5oֺF b9K&jHpkxJud}JzwUߐ{sCoD3iHwܢ,-?;d2zbb_8f>C٬m6U]FjӮK5JKvV\E:w弻(eZ.yb;hj}MZ_wZkk-E(Q2uz}Omz5Ʈ־׎pV͡FZl$˥}M'z|iwYe+͌=^2Hu8C8 yb?>цP?p|zo$tvWwӕ=qeOt.Kn ʋG/}_A m0 #̐;e6Mlךe FdX3hwt?1xU ā8Bc0DOC)8 p#fMz(U P+_kkTT8,*8ܮ7U?Wrq ϙ=;橮.`սݕ}uʡ0 #;}\% Ϯ܈񑠷g;o|2cQe5~2i n[o{Ϙwvoio#eutH3+<2G2'/鵿\=V=u[O5zZ@hNuZs'5daq1ݻNfmR:KWJUD{=D\!%„~ ~`=%mc|OÇWp4 gżoaPaqNI8Tq mp6wp.|'.wq!F`$F7 8K eCay/,` #p$ѸŅF"|2\>O,~kp]z܀ܬD܊ÃGǣx b^X(Eʱ+ NlA%V I4z7`p|?gA/}~菽qJp@p* oa[vưvcaLpn ٢- ٢- I>d܅)^܇JYh of+{ʦY4+feӬlZ݌wnMV71ê4gg<9<"ix /"L kxx#kL=m ovF{3p\d,ƅr|]߁^tʠWtU_2ZJFnTO#n[2*v<pu#de>Q20ƣx~<ڏ}G??ƀZTjR-REJH)"ZTjߗB]}ex5\M)WKM5c0P_a<5&k:Ρs(:8E)*NQqST Z1X+k`bV ֊Z1X+ko bS,vN);bXbS,vNk)Z ~w"uH/R"eD7QM}e$g'줜rvRNI9;)g'줜rvRNI9;)g'줜rvRNI9;)g'줜rvRNI9;)g'줜rvRNI9;Q?}b{l{l{l{l{l{E^Ql(W qE?'8:D܊Iwɸ Sp7<,~2|.e?Q2cVb*PըBEz4aKp\U~6уaG0rrrrrrrrrr/}/8q  _;_uCq7pz(\pȻ?sGe"0~&w~weüᬼ[qn0wa =__(xO:^S†H۳ݞ\9?8:rFFQ\q(X}jgFg/FFSR~fVg+v07(߹=zB}7Yammmmm-BEH)!"X*Bn!"XbR,BEH)!"X}D>"d_$ EB_$؟pn܃{qxpB4 cEX0V4 c'=7Oi33_ xQ%WLKxxUL kxxo-wPNuwݟ90  ,,2.G)PXU@%V kYV >DRء|cEX;VcEX;VcEX;VD8;ND8;NDx;^Ex;^Ex;^D;ANDx;^ET8A-zλ*M׻77 7㷘h^6܎;p'&a2܍{pop;dn7%d=R% X0}e2, 3K'2jgrrMM.M.MNMNMߍܝyݵAYf = ߬M=^I夰@Q[ j Dm-@9uh#Z9u+y%"D䕈QX- EH4"P$DCh( EH4"QPD~=կTG+H'hEheX]mukE}zmd܅)^܇V3jFY(e5fܓ{rOBI= '!$䞄ܓ{rOBI= #X` `rOBI= '!$䞄ܓ{rOBI= '!$XJVRI= '!$䞄ܓ{rOBI= '!$䞄ܓ`푬=GH#Y{$kd푬=GH'!$X}ܓ{rOBIp'/ wp-5[j/E"u|:(}򫃝3A> /|G/SꓼzKbN^}WW+ɳ79 rr$ r"7ng {p;aNd'l6 N8Gh|i+v*;aNXe'V Uv*;aiL3tګsګsګsګsګsګsګsګsګsګsګs;ijvڻiܯwߑN|G:7؉o`'N|; v7؉op`0(((|0a$$)&I1IIRLb$$)&I)I ~WWWWWWWWWWWO-PUr\E-WQUv'0jF-èe ˋ( 1F83VvQ߇SSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX?Q(O'e22222{8 r wA)lt ;)d#: j'H NbF:tiWHF~D#/#ӃH%X<0|=é6?=pR8=:;7n(]]iרz7z̝vNrNr6QLK Fg|B/}~菽OF}ZcwiwiwiwiwiwiwiwiwiwtoQ ըjB5jPZF-TQ ըjA5uP:FTQըjA5:uP:NTSԩY,uj:5KNRfSԩY,uj:::::::::LLLwjjy~~&/tG?wF{@;vD?Y8E?4,xﵳ5?;ggO^;ka,Ζ~aA~:؃gѪ['=%=%=%=%=%EvȮ"|&&e!;DpSETX)+E`e5]V DTR<]lP<DxUqq}7q`xt^pkߎw[|#ZnDtΈV;(My18JoG[s;?zFz?|fǜ1`o-׊lo`(fPY.uggCg`Ⱦ>;е/1VVg}. ˢ,rW Բ]׸>ג`j@5P(P  T@ T%8kzW1O}\'אּۣuFlD[* yWy [kWjC~qςDoS'O'O?%8. g낯icfHdǮ۟WMjY he"s]Xɲ0d* (̊ T@ H0 Ӛêsk,9c\ELbViws{ޞo>ӡjx}bb!++pG@yu)}bEjRiIS-{xbأ>R }q꺠В#%K -Aް:=r$<=BT .q%T=p>S!H<3sbR]YYL ژ"2PQI = H$(\ić|k8҉j]{Gi7 6I탞tk? g?Vf|΃x@G-i+_il#fjΡF_-1_)VQ} 1Dcb2lێ++,eB^Be)f(!x %]>`q[ *ŠR*jL[P.2VcC 9Mw1:F_Y#4 Zv^KzbU꫒!H1(O땓D@-èdNj;GxITq_}>aWG__Rܱ?hC9 9ѓ,_e/Y5ܬh6{9V~E,15ZU(k`O %sYJ 3Xc&-ꫡz.(5=ZdJ*[gA10꾤B.{;O 9{M TZ- eM𯬐I怶 5eݳϕA k`ʺ^ *ۣu5XV]KVUY}| AH-x0ʮ.ns9Xwb ׌]A~ X{bFD5ٿKG@.V7ɿ+DYѿG_9bΈ՝W?' DZW댼^5>j*x5ՏQCl:#.Wk1 ar,$Wao!9H5)yF;Δ.;e 4SGMs%t!>t5]Cу mdB0WF=kN{1oC{6 ڱ4ufii(hGY1?OcY q, Il(CqlæYt"lLg(]Ǝt'!{B/b^azc6SsBr9:܈pcnJrsnNK%y5^vܞ}kZQ5o0ʝ cܕ7fMoƽo[0ފb܇0#ޙwaxwLxLœfχ̉tVYmo`u6;NVY~_a.|kfTH Ih ťO=sG'EƒДx28kBCj:mbM쐽׆fBI4ړ$3BFoCkD" л@ 0o9UIubNb֤AsH8tV~Udg}C_8 iFZ6ď A.؉#( /T#UH bI꓆ĝx62z'ҙCPE# liG %!820%9M8O2x(<4. (|_&G r&PW`&r@Gutӟ kD|@S`0D%4N8G@,Wࡸԁ/ xG`A\Bx/\{%$I[@S tH@!( l,S`+"%_ITCF $pd\%pi\(pErL|NxD`ND[ WPKWerjXez lN ε& *0](aNvY w1/c_@ߡWg7 [3PRw*/_@%~3*jÛkĿvg+Rx毣WgL0s<LhD6ˬ@1r-R@kRFi)ԑ֧mC}VԔVR)CҳT[sMUS)gi%R.єy奖kyL*ջQ~XS(G~P^:ۚX8ZShʋR3ķ+Fgu WJJ$ޚx{>)33K1}y/7R)Đ>p (}OFTM8bZDb̀h"f̂0+,3{ǜ1hU21ZѪd$uNd"@=Ӂd,M d<DS:'S%Sv%X K%[FYK#;NvQlư1'6 {l6Ec8>O$@[Iu!)_KhC%S.#ʇb!Y.|ǯ2Uv5e0g挽i̠7 kO Y0ȺYwѻ2+FY{օ5cQשLYFV&$;^.9H5$GS"Մ)=$%-aEmL7&&-RIrzk.YHR%TE%%+F;|#߅d",#qv$jE'FlFnl#q$nd{^d#(Μ9Ir$ t%yr\$p]A}6C~!w=< #țY FBY Wg9@X"c vb |vȘ +)+JJ=`/+aoEgʔ\S%ȧu?@Cx(Q{>\#߄}·"݅4?stO|af@/WB }w䱰B䁝`t??wu)oѺ'cUUh\E(:V̅."'L#I*O+E,Dqйt Β86'rnM Y-ym ahк8ZXH?^y7?DݠA+ĎD,̬#f3뉙bfC1oG3H[z^ez^hNoЛM_]z>#>$o;#/N%%ov1VT2 -U UB {EI%KsIX3Fಈ`|Dyÿ!3Wͩ-b>eW۞} `]>u8aUD6A((Ѧ AV(è(isQF|.[22eT)h-X1.QLe`? .PF-0W#`TF#0Po`,m W`0"/@.D;!ft> LI Ҏt%$DD2666' N[pɓC`ZQu Eُne,PQat(QFЭDE Y,RRX,DHaR!eB +V )RXM8'Q"V@ φ*@,+ UhߢI'`t@%3ZBǙ\.~bHKkZ ' d֬:%g O.r_3>]% C/y J>|PXVI!ӓ;yiu+rucmڣۍ~cDuXVuMTUg:zZu*pfEPm:TnJYr756KlG`OFI#$ &70-+|C-~WYL~W,g*=PeI~m\ylU2&&yIیil!)7f"S"Uޡ沩Rcf?8&..Po=:tHJsUZ003/PyG&Dń$;W*R=f f _Rd$7tv]e_JFmC4jGΕd+L_W>>sVDT*OsG& LV&ͤ_JjI Y&duΖeTG[7&6ߒ[a]Nõql¡χHO<0}O/f󫷶]W;.f7]fV'/vW!Mn[͏o=f_ UmUz;5ԵLӹoE7XSpOﻀ^ <8 ʩhhGʎv[d^5-\|#[zϳe;5?UkW nj co(E~kYY̛nq(ҌrUU[Cap^+G$z4hX0 O(tjIWF([*u$]n2Z O uKUnYV!rXKhCܛHeUJvo Es\QX b=8c n'r=l@7埜;}śnv]GLp٤LYWM۰3ڧ|sOカ/~^ێ:c:Y[|ӼlX-g;6zTūVv 7xo?b7GKs'm +k*mI_5-]ݼ6OTjP]ͼn^Fk5c>V^e]ivWmm{R wjOk|G.P-06p"{NO>V2o[Zw M{dͤFe h-j{e!Z5L9=ړacV}9fJAZkl!Y3c>,ukLz8 uٟ6}3z=hiɁvtЯk-,gM-3Hyo9lөo/J LwU[UC̾r.1OΘ=b߳1I wK7yI^aC^̮.puɋE ~a씓vϟ^w{Va6mgu1e]sKkMIUL̴K嘃z38웍kVŦk/}/{|̬~8nA7ZV/UeKF|DƝLS/?ӝkѵnuW 78<|wZj4zF\WNi(l.uoMM=LO]|a5]kMQ5$To1Wg7WWgW%wi%dǐL6)O7{&G#H<dC/2b`B|'?[ &2v˰%"RJ4U${#œ Or8W5imWעCj|N}vOߜwfni49JRɝ_?ξy%:wd{yl_ţŎo:.bf4i1畩oix;vNZ}ͫɶ?bm߼ KϚ|3|zzծlK| R^.=θ,e {M&݇zvet~}tӎ k˨qc|빃<묌{:ص]+OӍ%cl:%BLZp8p/zqN$V YJ5t"jW,~!W<ĜIğ"]&-el9Ғ9/R{w^h\׸֗tW jN㺘uVn|f65k}uOvW9a6{M_fS[ic}>Z\^}? Y-~k˙Z ʬݘ~h?-{Be6tmdKnpHS#д?ijHt*c%ϳo:v˞ M84~гI֮;`{fo NX`{G^U_e E<9;ڭ We[2~̳7/:ПG.e9nePY{.l`>2y73M.T]ɱ7\3wi:[V2 GY~,t,O|Vr,,_$~?_blR 1)!"5<%bC]DBL[n)7 5t Gt#~O0rBk31sx¡Qˎ Jx-N63}|s#͏1k毾Kd`K<Wiqw/]Aͬ$=ܰryy+J_>oiGnn׾j{}M##ngZ55\э|\3p[ޱT%oxTcv{#^;P;\Un}\_?Uu۷}aEO3kcZ=^S sΔNme8p>(?NYk*ǬfOw/[-aMN۵hܠ6#6b&d53<đI@iCHowjZwкث?t^uZ 3>?dNsu.:I{[vڴ Y+ݕm'T@dX7d[.+v4k)Y}^(|9gϹ?,v̻^KȦ޻wKMYc)+_]06jiw^O]\ 6{' endstream endobj 53 0 obj [ 3[ 226] 17[ 544 533] 28[ 488] 39[ 631] 47[ 252] 68[ 855] 94[ 459] 104[ 642] 258[ 479] 271[ 525 423] 282[ 525] 286[ 498] 296[ 305] 346[ 525] 349[ 230] 367[ 230] 373[ 799 525] 381[ 527] 393[ 525] 396[ 349] 400[ 391] 410[ 335] 437[ 525] 448[ 452 715] 455[ 453] 842[ 326] 853[ 250] 856[ 252] 859[ 250] 862[ 418 418] 876[ 386] ] endobj 54 0 obj [ 278] endobj 55 0 obj <<52B80975670B63439A8BD98BF4AB6346>] /Filter/FlateDecode/Length 177>> stream x5Ϲ P `p H\@%`:*dDh ({.ɲ%":\6 x/ADr$W $AݦEKdM H:LJJ*NjA"M6ORo|4àRdkx`O0ۊ| endstream endobj xref 0 56 0000000018 65535 f 0000000017 00000 n 0000000125 00000 n 0000000188 00000 n 0000000446 00000 n 0000005097 00000 n 0000005270 00000 n 0000005514 00000 n 0000005682 00000 n 0000005921 00000 n 0000006052 00000 n 0000006082 00000 n 0000006242 00000 n 0000006316 00000 n 0000006556 00000 n 0000006716 00000 n 0000006941 00000 n 0000007182 00000 n 0000000019 65535 f 0000000020 65535 f 0000000021 65535 f 0000000022 65535 f 0000000023 65535 f 0000000024 65535 f 0000000025 65535 f 0000000026 65535 f 0000000027 65535 f 0000000028 65535 f 0000000029 65535 f 0000000030 65535 f 0000000031 65535 f 0000000032 65535 f 0000000033 65535 f 0000000034 65535 f 0000000035 65535 f 0000000036 65535 f 0000000037 65535 f 0000000038 65535 f 0000000039 65535 f 0000000040 65535 f 0000000041 65535 f 0000000042 65535 f 0000000043 65535 f 0000000044 65535 f 0000000045 65535 f 0000000000 65535 f 0000008941 00000 n 0000009157 00000 n 0000009424 00000 n 0000072212 00000 n 0000072547 00000 n 0000150483 00000 n 0000150983 00000 n 0000210700 00000 n 0000211076 00000 n 0000211103 00000 n trailer <<52B80975670B63439A8BD98BF4AB6346>] >> startxref 211481 %%EOF xref 0 0 trailer <<52B80975670B63439A8BD98BF4AB6346>] /Prev 211481/XRefStm 211103>> startxref 212759 %%EOFtinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420/000077500000000000000000000000001207233610700222445ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420/CC2420GpioCaptureC.nc000066400000000000000000000067741207233610700256470ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui * @author Joe Polastre * @author Steve Ayer/Miklos Maroti * @date February, 2011 * * re-named indicating that this HAL module is specifically required to handle anomalies in the * cc2420 stack that require sfd capture to happen on a timerb pin; designs that use a timera pin * need this code to resolve the aliasing between timestamps from 32khz and 1mhz timers. * thanks to miklos for providing this re-written captured event handler as a straight-forward work-around! */ generic module CC2420GpioCaptureC() @safe() { provides interface GpioCapture as Capture; uses interface Msp430TimerControl; uses interface Msp430Capture; uses interface HplMsp430GeneralIO as GeneralIO; uses interface LocalTime as LocalTime32khz; uses interface LocalTime as LocalTimeMicro; } implementation { error_t enableCapture( uint8_t mode ) { atomic { call Msp430TimerControl.disableEvents(); call GeneralIO.selectModuleFunc(); call Msp430TimerControl.clearPendingInterrupt(); call Msp430Capture.clearOverflow(); call Msp430TimerControl.setControlAsCapture( mode ); call Msp430TimerControl.enableEvents(); } return SUCCESS; } async command error_t Capture.captureRisingEdge() { return enableCapture( MSP430TIMER_CM_RISING ); } async command error_t Capture.captureFallingEdge() { return enableCapture( MSP430TIMER_CM_FALLING ); } async command void Capture.disable() { atomic { call Msp430TimerControl.disableEvents(); call GeneralIO.selectIOFunc(); } } async event void Msp430Capture.captured(uint16_t capturedMicro) { uint16_t elapsedMicro; uint16_t captured32khz; atomic { elapsedMicro = call LocalTimeMicro.get() - capturedMicro; captured32khz = call LocalTime32khz.get(); } captured32khz -= elapsedMicro >> 5; signal Capture.captured(captured32khz); } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420/HplCC2420AlarmC.nc000066400000000000000000000040231207233610700251060ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of 32khz alarms for the ChipCon CC2420 radio * connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2008-05-21 22:07:24 $ */ generic configuration HplCC2420AlarmC() { provides interface Init; provides interface Alarm as Alarm32khz32; } implementation { components new Alarm32khz32C(); Init = Alarm32khz32C; Alarm32khz32 = Alarm32khz32C; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420/HplCC2420InterruptsC.nc000066400000000000000000000061721207233610700262400ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of interrupts and captures for the ChipCon * CC2420 radio connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2008-05-21 22:07:25 $ */ /** * Ported to the SHIMMER platform. * * @author Konrad Lorincz * @date May 14, 2008 */ configuration HplCC2420InterruptsC { provides interface GpioCapture as CaptureSFD; provides interface GpioInterrupt as InterruptCCA; provides interface GpioInterrupt as InterruptFIFOP; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components Msp430TimerC; components new CC2420GpioCaptureC() as CaptureSFDC; CaptureSFDC.Msp430TimerControl -> Msp430TimerC.ControlA1; CaptureSFDC.Msp430Capture -> Msp430TimerC.CaptureA1; CaptureSFDC.GeneralIO -> GeneralIOC.Port12; components Counter32khz32C as Counter, new CounterToLocalTimeC(T32khz); CounterToLocalTimeC.Counter -> Counter; CaptureSFDC.LocalTime32khz -> CounterToLocalTimeC; components CounterMicro32C, new CounterToLocalTimeC(TMicro) as CounterMicroToLocalTime; CounterMicroToLocalTime.Counter -> CounterMicro32C; CaptureSFDC.LocalTimeMicro -> CounterMicroToLocalTime; components HplMsp430InterruptC; components new Msp430InterruptC() as InterruptCCAC; components new Msp430InterruptC() as InterruptFIFOPC; InterruptCCAC.HplInterrupt -> HplMsp430InterruptC.Port27; InterruptFIFOPC.HplInterrupt -> HplMsp430InterruptC.Port26; CaptureSFD = CaptureSFDC.Capture; InterruptCCA = InterruptCCAC.Interrupt; InterruptFIFOP = InterruptFIFOPC.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420/HplCC2420PinsC.nc000066400000000000000000000055351207233610700247740ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of general-purpose I/O for the ChipCon CC2420 * radio connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2008-05-21 22:07:25 $ */ /** * Ported to the SHIMMER platform. * * @author Konrad Lorincz * @date May 14, 2008 */ configuration HplCC2420PinsC { provides interface GeneralIO as CCA; provides interface GeneralIO as CSN; provides interface GeneralIO as FIFO; provides interface GeneralIO as FIFOP; provides interface GeneralIO as RSTN; provides interface GeneralIO as SFD; provides interface GeneralIO as VREN; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> GeneralIOC.Port27; CSNM -> GeneralIOC.Port54; FIFOM -> GeneralIOC.Port10; FIFOPM -> GeneralIOC.Port26; RSTNM -> GeneralIOC.Port57; SFDM -> GeneralIOC.Port12; VRENM -> GeneralIOC.Port56; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420/HplCC2420SpiC.nc000066400000000000000000000041541207233610700246120ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of the SPI bus for the ChipCon CC2420 radio * connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2008-05-21 22:07:25 $ */ /** * Ported to the SHIMMER platform. * * @author Konrad Lorincz */ generic configuration HplCC2420SpiC() { provides interface Resource; provides interface SpiByte; provides interface SpiPacket; } implementation { components new Msp430Spi1C() as SpiC; Resource = SpiC; SpiByte = SpiC; SpiPacket = SpiC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/000077500000000000000000000000001207233610700224345ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/Msp430ClockP.nc000066400000000000000000000153301207233610700250420ustar00rootroot00000000000000//$Id: Msp430ClockP.nc,v 1.1 2011-04-27 13:30:12 ayer Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp * @author Vlado Handziski * @author Janos Sallai */ /** This file programs the msp430 time subsystem such that SMCLK=DCO, and TimerA=SMCLK/4. This allows for faster peripheral access, since I/O subsystem is clocked from SMCKL. */ #include #include module Msp430ClockP @safe() { provides interface Init; provides interface Msp430ClockInit; provides interface McuPowerOverride; } implementation { MSP430REG_NORACE(IE1); MSP430REG_NORACE(TACTL); MSP430REG_NORACE(TAIV); MSP430REG_NORACE(TBCTL); MSP430REG_NORACE(TBIV); enum { ACLK_CALIB_PERIOD = 8, TARGET_DCO_DELTA = (TARGET_DCO_KHZ / ACLK_KHZ) * ACLK_CALIB_PERIOD, }; async command mcu_power_t McuPowerOverride.lowestState() { return MSP430_POWER_LPM3; } command void Msp430ClockInit.defaultSetupDcoCalibrate() { // --- setup --- TACTL = TASSEL1 | MC1; // source SMCLK, continuous mode, everything else 0 TBCTL = TBSSEL0 | MC1; BCSCTL1 = XT2OFF | RSEL2; BCSCTL2 = 0; TBCCTL0 = CM0; } command void Msp430ClockInit.defaultInitClocks() { // BCSCTL1 // .XT2OFF = 1; disable the external oscillator for SCLK and MCLK // .XTS = 0; set low frequency mode for LXFT1 // .DIVA = 0; set the divisor on ACLK to 1 // .RSEL, do not modify BCSCTL1 = XT2OFF | (BCSCTL1 & (RSEL2|RSEL1|RSEL0)); // BCSCTL2 // .SELM = 0; select DCOCLK as source for MCLK // .DIVM = 0; set the divisor of MCLK to 1 // .SELS = 0; select DCOCLK as source for SCLK // .DIVS = 0; set the divisor of SCLK to 1 // .DCOR = 0; select internal resistor for DCO BCSCTL2 = 0; // IE1.OFIE = 0; no interrupt for oscillator fault CLR_FLAG( IE1, OFIE ); } command void Msp430ClockInit.defaultInitTimerA() { TAR = 0; // TACTL // .TACLGRP = 0; each TACL group latched independently // .CNTL = 0; 16-bit counter // .TASSEL = 2; source SMCLK = DCO // .ID = 2; input divisor of 4 // .MC = 0; initially disabled // .TACLR = 0; reset timer A // .TAIE = 1; enable timer A interrupts TACTL = TASSEL1 | ID1 | TAIE; } command void Msp430ClockInit.defaultInitTimerB() { TBR = 0; // TBCTL // .TBCLGRP = 0; each TBCL group latched independently // .CNTL = 0; 16-bit counter // .TBSSEL = 1; source ACLK // .ID = 0; input divisor of 1 // .MC = 0; initially disabled // .TBCLR = 0; reset timer B // .TBIE = 1; enable timer B interrupts TBCTL = TBSSEL0 | TBIE; } default event void Msp430ClockInit.setupDcoCalibrate() { call Msp430ClockInit.defaultSetupDcoCalibrate(); } default event void Msp430ClockInit.initClocks() { call Msp430ClockInit.defaultInitClocks(); } default event void Msp430ClockInit.initTimerA() { call Msp430ClockInit.defaultInitTimerA(); } default event void Msp430ClockInit.initTimerB() { call Msp430ClockInit.defaultInitTimerB(); } void startTimerA() { // TACTL.MC = 2; continuous mode TACTL = MC1 | (TACTL & ~(MC1|MC0)); } void stopTimerA() { //TACTL.MC = 0; stop timer B TACTL = TACTL & ~(MC1|MC0); } void startTimerB() { // TBCTL.MC = 2; continuous mode TBCTL = MC1 | (TBCTL & ~(MC1|MC0)); } void stopTimerB() { //TBCTL.MC = 0; stop timer B TBCTL = TBCTL & ~(MC1|MC0); } void set_dco_calib( int calib ) { BCSCTL1 = (BCSCTL1 & ~0x07) | ((calib >> 8) & 0x07); DCOCTL = calib & 0xff; } uint16_t test_calib_busywait_delta( int calib ) { int8_t aclk_count = 2; uint16_t dco_prev = 0; uint16_t dco_curr = 0; set_dco_calib( calib ); while( aclk_count-- > 0 ) { TBCCR0 = TBR + ACLK_CALIB_PERIOD; // set next interrupt TBCCTL0 &= ~CCIFG; // clear pending interrupt while( (TBCCTL0 & CCIFG) == 0 ); // busy wait dco_prev = dco_curr; dco_curr = TAR; } return dco_curr - dco_prev; } // busyCalibrateDCO // Should take about 9ms if ACLK_CALIB_PERIOD=8. // DCOCTL and BCSCTL1 are calibrated when done. void busyCalibrateDco() { // --- variables --- int calib; int step; // --- calibrate --- // Binary search for RSEL,DCO,DCOMOD. // It's okay that RSEL isn't monotonic. for( calib=0,step=0x800; step!=0; step>>=1 ) { // if the step is not past the target, commit it if( test_calib_busywait_delta(calib|step) <= TARGET_DCO_DELTA ) calib |= step; } // if DCOx is 7 (0x0e0 in calib), then the 5-bit MODx is not useable, set it to 0 if( (calib & 0x0e0) == 0x0e0 ) calib &= ~0x01f; set_dco_calib( calib ); } command error_t Init.init() { // Reset timers and clear interrupt vectors TACTL = TACLR; TAIV = 0; TBCTL = TBCLR; TBIV = 0; atomic { signal Msp430ClockInit.setupDcoCalibrate(); busyCalibrateDco(); signal Msp430ClockInit.initClocks(); signal Msp430ClockInit.initTimerA(); signal Msp430ClockInit.initTimerB(); startTimerA(); startTimerB(); } return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/README.txt000066400000000000000000000023111207233610700241270ustar00rootroot00000000000000CC2420X is an alternative radio stack for the TI CC2420 radio, using the rfxlink library (lib/rfxlink). The stack is IEEE802.15.4 compliant. All rfxlink features are supported. See lib/rfxlink/README.txt for details. The stack can be used with microsecond-precision timestamping, as well as with 32khz timestamping. To use this stack with microsecond precision timestamping configuration, compile the application with the cc2420x extra: make telosb cc2420x To use this stack with 32khz precision timestamping configuration, add the following lines to the Makefile: make telosb cc2420x_32khz Remarks: - This stack programs the msp430 clock subsystem differently than the default cc2420 stack. In particular, SMCLK is ticking at 4MHz, which allows for faster peripheral access. - Microsecond precision timestamping requires that TimerB is set to SMCLK/4, therefore TimerA must be configured as the 32khz clock (ACLK). Since TimerA has only three compare registers, this limits the number of physical (that is, unvirtualized) 32kHz alarms in the system. (This is not an issue if 32khz timestamping is used). - 32khz timestamping is not interoperable with other devices (e.g. iris). tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/ShimmerSerialP.nc000066400000000000000000000043171207233610700256470ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** We need to set the proper USART config values since SMCLK is configured to tick at 4MHz (SMCLK=DCO). */ module ShimmerSerialP { provides interface StdControl; provides interface Msp430UartConfigure; uses interface Resource; } implementation { enum { // from http://www.daycounter.com/Calculators/MSP430-Uart-Calculator.phtml UBR_4MHZ_4800=0x0369, UMCTL_4MHZ_4800=0xfb, UBR_4MHZ_9600=0x01b4, UMCTL_4MHZ_9600=0xdf, UBR_4MHZ_57600=0x0048, UMCTL_4MHZ_57600=0xfb, UBR_4MHZ_115200=0x0024, UMCTL_4MHZ_115200=0x29, UBR_3_7MHZ_115200=0x0020, UMCTL_3_7MHZ_115200=0x00, }; msp430_uart_union_config_t msp430_uart_telos_config = { {ubr: UBR_4MHZ_115200, umctl: UBR_4MHZ_115200, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0, utxe : 1, urxe : 1} }; command error_t StdControl.start(){ return call Resource.immediateRequest(); } command error_t StdControl.stop(){ call Resource.release(); return SUCCESS; } event void Resource.granted(){} async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig() { return &msp430_uart_telos_config; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/t32khz/000077500000000000000000000000001207233610700235615ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/t32khz/HplCC2420XC.nc000066400000000000000000000055131207233610700256030ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ configuration HplCC2420XC { provides { interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface LocalTime as LocalTimeRadio; interface Init; interface Alarm; } } implementation { components HplMsp430GeneralIOC as IO, new Msp430Spi1C() as SpiC; // pins components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> IO.Port27; CSNM -> IO.Port54; FIFOM -> IO.Port10; FIFOPM -> IO.Port26; RSTNM -> IO.Port57; SFDM -> IO.Port12; VRENM -> IO.Port56; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; // spi SpiResource = SpiC.Resource; FastSpiByte = SpiC; // capture components Msp430TimerC as TimerC; components new GpioCaptureC(); GpioCaptureC.Msp430TimerControl -> TimerC.ControlA1; GpioCaptureC.Msp430Capture -> TimerC.CaptureA1; GpioCaptureC.GeneralIO -> IO.Port12; SfdCapture = GpioCaptureC; components new Msp430InterruptC() as FifopInterruptC, HplMsp430InterruptC; FifopInterruptC.HplInterrupt -> HplMsp430InterruptC.Port26; FifopInterrupt = FifopInterruptC.Interrupt; // alarm components new Alarm32khz16C() as AlarmC; Alarm = AlarmC; Init = AlarmC; // localTime components LocalTime32khzC; LocalTimeRadio = LocalTime32khzC.LocalTime; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/t32khz/RadioConfig.h000066400000000000000000000042611207233610700261210ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #ifndef __RADIOCONFIG_H__ #define __RADIOCONFIG_H__ #include #include //#include /* This is the default value of the PA_POWER field of the TXCTL register. */ #ifndef CC2420X_DEF_RFPOWER #define CC2420X_DEF_RFPOWER 0 #endif /* This is the default value of the CHANNEL field of the FSCTRL register. */ #ifndef CC2420X_DEF_CHANNEL #define CC2420X_DEF_CHANNEL 11 #endif /* The number of microseconds a sending micaz mote will wait for an acknowledgement */ #ifndef SOFTWAREACK_TIMEOUT #define SOFTWAREACK_TIMEOUT 800 #endif /** * This is the timer type of the radio alarm interface */ typedef T32khz TRadio; typedef uint16_t tradio_size; /** * The number of radio alarm ticks per one microsecond (0.9216). * We use integers and no parentheses just to make deputy happy. * Ok, further hacks were required for deputy, I removed 00 from the * beginning and end to be able to handle longer wait periods. */ #define RADIO_ALARM_MICROSEC 1/32 /** * The base two logarithm of the number of radio alarm ticks per one millisecond */ #define RADIO_ALARM_MILLI_EXP 5 #endif//__RADIOCONFIG_H__ tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/t32khz/am/000077500000000000000000000000001207233610700241565ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/t32khz/am/ActiveMessageC.nc000066400000000000000000000040641207233610700273270ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface SendNotifier[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2420XActiveMessageC as MessageC; SplitControl = MessageC; AMSend = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; SendNotifier = MessageC; Packet = MessageC; AMPacket = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketLink = MessageC; RadioChannel = MessageC; PacketTimeStampMilli = MessageC.PacketTimeStampMilli; PacketTimeStamp32khz = MessageC.PacketTimeStampRadio; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/t32khz/am/TimeSyncMessageC.nc000066400000000000000000000041441207233610700276460ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketTimeStamp as PacketTimeStampRadio; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC2420XTimeSyncMessageC as MessageC; SplitControl = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; Packet = MessageC; AMPacket = MessageC; PacketTimeStampRadio = MessageC; TimeSyncAMSendRadio = MessageC; TimeSyncPacketRadio = MessageC; PacketTimeStampMilli = MessageC; TimeSyncAMSendMilli = MessageC; TimeSyncPacketMilli = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/tmicro/000077500000000000000000000000001207233610700237315ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/tmicro/HplCC2420XC.nc000066400000000000000000000055131207233610700257530ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ configuration HplCC2420XC { provides { interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface LocalTime as LocalTimeRadio; interface Init; interface Alarm; } } implementation { components HplMsp430GeneralIOC as IO, new Msp430Spi1C() as SpiC; // pins components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> IO.Port27; CSNM -> IO.Port54; FIFOM -> IO.Port10; FIFOPM -> IO.Port26; RSTNM -> IO.Port57; SFDM -> IO.Port12; VRENM -> IO.Port56; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; // spi SpiResource = SpiC.Resource; FastSpiByte = SpiC; // capture components Msp430TimerC as TimerC; components new GpioCaptureC(); GpioCaptureC.Msp430TimerControl -> TimerC.ControlA1; GpioCaptureC.Msp430Capture -> TimerC.CaptureA1; GpioCaptureC.GeneralIO -> IO.Port12; SfdCapture = GpioCaptureC; components new Msp430InterruptC() as FifopInterruptC, HplMsp430InterruptC; FifopInterruptC.HplInterrupt -> HplMsp430InterruptC.Port26; FifopInterrupt = FifopInterruptC.Interrupt; // alarm components new AlarmMicro16C() as AlarmC; Alarm = AlarmC; Init = AlarmC; // localTime components LocalTimeMicroC; LocalTimeRadio = LocalTimeMicroC.LocalTime; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/tmicro/McuSleepC.nc000066400000000000000000000114771207233610700261050ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Implementation of TEP 112 (Microcontroller Power Management) for * the MSP430. Code for low power calculation copied from older * msp430hardware.h by Vlado Handziski, Joe Polastre, and Cory Sharp. * * * @author Philip Levis * @author Vlado Handziski * @author Joe Polastre * @author Cory Sharp * @author Janos Sallai * @date October 26, 2005 * @see Please refer to TEP 112 for more information about this component and its * intended use. * */ /** We need prevent the MCU from sleeping when the microsecond alarm is set. */ module McuSleepC @safe() { provides { interface McuSleep; interface McuPowerState; } uses { interface McuPowerOverride; } } implementation { bool dirty = TRUE; mcu_power_t powerState = MSP430_POWER_ACTIVE; /* Note that the power values are maintained in an order * based on their active components, NOT on their values.*/ // NOTE: This table should be in progmem. const uint16_t msp430PowerBits[MSP430_POWER_LPM4 + 1] = { 0, // ACTIVE SR_CPUOFF, // LPM0 SR_SCG0+SR_CPUOFF, // LPM1 SR_SCG1+SR_CPUOFF, // LPM2 SR_SCG1+SR_SCG0+SR_CPUOFF, // LPM3 SR_SCG1+SR_SCG0+SR_OSCOFF+SR_CPUOFF, // LPM4 }; mcu_power_t getPowerState() { mcu_power_t pState = MSP430_POWER_LPM4; // TimerA, USART0, USART1 check if ((((TBCCTL0 & CCIE) || (TBCCTL1 & CCIE) || (TBCCTL2 & CCIE)) && ((TBCTL & TASSEL_3) == TASSEL_2)) || ((ME1 & (UTXE0 | URXE0)) && (U0TCTL & SSEL1)) || ((ME2 & (UTXE1 | URXE1)) && (U1TCTL & SSEL1)) #ifdef __msp430_have_usart0_with_i2c // registers end in "nr" to prevent nesC race condition detection || ((U0CTLnr & I2CEN) && (I2CTCTLnr & SSEL1) && (I2CDCTLnr & I2CBUSY) && (U0CTLnr & SYNC) && (U0CTLnr & I2C)) #endif ) pState = MSP430_POWER_LPM1; #ifdef __msp430_have_adc12 // ADC12 check, pre-condition: pState != MSP430_POWER_ACTIVE if (ADC12CTL0 & ADC12ON){ if (ADC12CTL1 & ADC12SSEL_2){ // sample or conversion operation with MCLK or SMCLK if (ADC12CTL1 & ADC12SSEL_1) pState = MSP430_POWER_LPM1; else pState = MSP430_POWER_ACTIVE; } else if ((ADC12CTL1 & SHS0) && ((TACTL & TASSEL_3) == TASSEL_2)){ // Timer A is used as sample-and-hold source and SMCLK sources Timer A // (Timer A interrupts are always disabled when it is used by the // ADC subsystem, that's why the Timer check above is not enough) pState = MSP430_POWER_LPM1; } } #endif return pState; } void computePowerState() { powerState = mcombine(getPowerState(), call McuPowerOverride.lowestState()); } async command void McuSleep.sleep() { uint16_t temp; if (dirty) { computePowerState(); //dirty = 0; } temp = msp430PowerBits[powerState] | SR_GIE; __asm__ __volatile__( "bis %0, r2" : : "m" (temp) ); // All of memory may change at this point... asm volatile ("" : : : "memory"); __nesc_disable_interrupt(); } async command void McuPowerState.update() { atomic dirty = 1; } default async command mcu_power_t McuPowerOverride.lowestState() { return MSP430_POWER_LPM4; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/tmicro/Msp430ClockP.nc000066400000000000000000000145131207233610700263410ustar00rootroot00000000000000//$Id: Msp430ClockP.nc,v 1.1 2011-04-27 13:30:31 ayer Exp $ /* "Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /** * @author Cory Sharp * @author Vlado Handziski * @author Janos Sallai */ /** This file programs the msp430 time subsystem such that SMCLK=DCO, TimerA=ACLK, and TimerB=SMCLK/4. This allows for faster peripheral access, since I/O subsystem is clocked from SMCKL. Also, this allows for microsecond-precision capture of the cc2420 SFD. */ #include #include module Msp430ClockP @safe() { provides interface Init; provides interface Msp430ClockInit; provides interface McuPowerOverride; } implementation { MSP430REG_NORACE(IE1); MSP430REG_NORACE(TACTL); MSP430REG_NORACE(TAIV); MSP430REG_NORACE(TBCTL); MSP430REG_NORACE(TBIV); enum { ACLK_CALIB_PERIOD = 8, TARGET_DCO_DELTA = (TARGET_DCO_KHZ / ACLK_KHZ) * ACLK_CALIB_PERIOD, }; async command mcu_power_t McuPowerOverride.lowestState() { return MSP430_POWER_LPM3; } command void Msp430ClockInit.defaultSetupDcoCalibrate() { // --- setup --- TACTL = TASSEL0 | MC1; // source ACLK, continuous mode, everything else 0 TBCTL = TBSSEL1 | MC1; // source SMCLK, continuous mode, everything else 0 BCSCTL1 = XT2OFF | RSEL2; BCSCTL2 = 0; TBCCTL0 = CM0; } command void Msp430ClockInit.defaultInitClocks() { // BCSCTL1 // .XT2OFF = 1; disable the external oscillator for SCLK and MCLK // .XTS = 0; set low frequency mode for LXFT1 // .DIVA = 0; set the divisor on ACLK to 1 // .RSEL, do not modify BCSCTL1 = XT2OFF | (BCSCTL1 & (RSEL2|RSEL1|RSEL0)); // BCSCTL2 // .SELM = 0; select DCOCLK as source for MCLK // .DIVM = 0; set the divisor of MCLK to 1 // .SELS = 0; select DCOCLK as source for SCLK // .DIVS = 0; set the divisor of SCLK to 1 // .DCOR = 0; select internal resistor for DCO BCSCTL2 = 0; // IE1.OFIE = 0; no interrupt for oscillator fault CLR_FLAG( IE1, OFIE ); } command void Msp430ClockInit.defaultInitTimerA() { TAR = 0; // TACTL // .TACLGRP = 0; each TACL group latched independently // .CNTL = 0; 16-bit counter // .TASSEL = 1; source ACLK // .ID = 0; input divisor of 1 // .MC = 0; initially disabled // .TACLR = 0; reset timer A // .TAIE = 1; enable timer A interrupts TACTL = TASSEL0 | TAIE; } command void Msp430ClockInit.defaultInitTimerB() { TBR = 0; // TBCTL // .TBCLGRP = 0; each TBCL group latched independently // .CNTL = 0; 16-bit counter // .TBSSEL = 2; source SMCLK // .ID = 2; input divisor of 4 // .MC = 0; initially disabled // .TBCLR = 0; reset timer B // .TBIE = 1; enable timer B interrupts TBCTL = TBSSEL1 | ID1 | TBIE; } default event void Msp430ClockInit.setupDcoCalibrate() { call Msp430ClockInit.defaultSetupDcoCalibrate(); } default event void Msp430ClockInit.initClocks() { call Msp430ClockInit.defaultInitClocks(); } default event void Msp430ClockInit.initTimerA() { call Msp430ClockInit.defaultInitTimerA(); } default event void Msp430ClockInit.initTimerB() { call Msp430ClockInit.defaultInitTimerB(); } void startTimerA() { // TACTL.MC = 2; continuous mode TACTL = MC1 | (TACTL & ~(MC1|MC0)); } void stopTimerA() { //TACTL.MC = 0; stop timer A TACTL = TACTL & ~(MC1|MC0); } void startTimerB() { // TBCTL.MC = 2; continuous mode TBCTL = MC1 | (TBCTL & ~(MC1|MC0)); } void stopTimerB() { //TBCTL.MC = 0; stop timer B TBCTL = TBCTL & ~(MC1|MC0); } void set_dco_calib( int calib ) { BCSCTL1 = (BCSCTL1 & ~0x07) | ((calib >> 8) & 0x07); DCOCTL = calib & 0xff; } uint16_t test_calib_busywait_delta( int calib ) { int8_t aclk_count = 2; uint16_t dco_prev = 0; uint16_t dco_curr = 0; set_dco_calib( calib ); while( aclk_count-- > 0 ) { TACCR0 = TAR + ACLK_CALIB_PERIOD; // set next interrupt TACCTL0 &= ~CCIFG; // clear pending interrupt while( (TACCTL0 & CCIFG) == 0 ); // busy wait dco_prev = dco_curr; dco_curr = TBR; } return dco_curr - dco_prev; } // busyCalibrateDCO // Should take about 9ms if ACLK_CALIB_PERIOD=8. // DCOCTL and BCSCTL1 are calibrated when done. void busyCalibrateDco() { // --- variables --- int calib; int step; // --- calibrate --- // Binary search for RSEL,DCO,DCOMOD. // It's okay that RSEL isn't monotonic. for( calib=0,step=0x800; step!=0; step>>=1 ) { // if the step is not past the target, commit it if( test_calib_busywait_delta(calib|step) <= TARGET_DCO_DELTA ) calib |= step; } // if DCOx is 7 (0x0e0 in calib), then the 5-bit MODx is not useable, set it to 0 if( (calib & 0x0e0) == 0x0e0 ) calib &= ~0x01f; set_dco_calib( calib ); } command error_t Init.init() { // Reset timers and clear interrupt vectors TACTL = TACLR; TAIV = 0; TBCTL = TBCLR; TBIV = 0; atomic { signal Msp430ClockInit.setupDcoCalibrate(); busyCalibrateDco(); signal Msp430ClockInit.initClocks(); signal Msp430ClockInit.initTimerA(); signal Msp430ClockInit.initTimerB(); startTimerA(); startTimerB(); } return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/tmicro/Msp430Counter32khzC.nc000066400000000000000000000053651207233610700275770ustar00rootroot00000000000000 /* "Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** Configure the timer subsystem such that TimerA=ACLK (32kHz) and TimerB=SMCLK/4 (1MHz). */ /** * Msp430Counter32khC provides the standard 32khz counter for the MSP430. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration Msp430Counter32khzC { provides interface Counter as Msp430Counter32khz; } implementation { components Msp430TimerC; components new Msp430CounterC(T32khz) as Counter; Msp430Counter32khz = Counter; Counter.Msp430Timer -> Msp430TimerC.TimerA; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/tmicro/Msp430CounterMicroC.nc000066400000000000000000000054001207233610700276750ustar00rootroot00000000000000 /* "Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** Configure the timer subsystem such that TimerA=ACLK (32kHz) and TimerB=SMCLK/4 (1MHz). */ /** * Msp430Counter32khC provides the standard 32khz counter for the MSP430. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration Msp430CounterMicroC { provides interface Counter as Msp430CounterMicro; } implementation { components Msp430TimerC , new Msp430CounterC(TMicro) as Counter ; Msp430CounterMicro = Counter; Counter.Msp430Timer -> Msp430TimerC.TimerB; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/tmicro/Msp430Timer32khzMapC.nc000066400000000000000000000034501207233610700276670ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** Configure the timer subsystem such that TimerA=ACLK (32kHz) and TimerB=SMCLK/4 (1MHz). */ configuration Msp430Timer32khzMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; Msp430Timer[0] = Msp430TimerC.TimerA; Msp430TimerControl[0] = Msp430TimerC.ControlA0; Msp430Compare[0] = Msp430TimerC.CompareA0; Msp430Timer[1] = Msp430TimerC.TimerA; Msp430TimerControl[1] = Msp430TimerC.ControlA1; Msp430Compare[1] = Msp430TimerC.CompareA1; Msp430Timer[2] = Msp430TimerC.TimerA; Msp430TimerControl[2] = Msp430TimerC.ControlA2; Msp430Compare[2] = Msp430TimerC.CompareA2; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/tmicro/Msp430TimerC.nc000066400000000000000000000171651207233610700263570ustar00rootroot00000000000000 /* "Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** Configure the timer subsystem such that TimerA=ACLK (32kHz) and TimerB=SMCLK/4 (1MHz). */ /** * @author Cory Sharp */ configuration Msp430TimerC { provides interface Msp430Timer as TimerA; provides interface Msp430TimerControl as ControlA0; provides interface Msp430TimerControl as ControlA1; provides interface Msp430TimerControl as ControlA2; provides interface Msp430Compare as CompareA0; provides interface Msp430Compare as CompareA1; provides interface Msp430Compare as CompareA2; provides interface Msp430Capture as CaptureA0; provides interface Msp430Capture as CaptureA1; provides interface Msp430Capture as CaptureA2; provides interface Msp430Timer as TimerB; provides interface Msp430TimerControl as ControlB0; provides interface Msp430TimerControl as ControlB1; provides interface Msp430TimerControl as ControlB2; provides interface Msp430TimerControl as ControlB3; provides interface Msp430TimerControl as ControlB4; provides interface Msp430TimerControl as ControlB5; provides interface Msp430TimerControl as ControlB6; provides interface Msp430Compare as CompareB0; provides interface Msp430Compare as CompareB1; provides interface Msp430Compare as CompareB2; provides interface Msp430Compare as CompareB3; provides interface Msp430Compare as CompareB4; provides interface Msp430Compare as CompareB5; provides interface Msp430Compare as CompareB6; provides interface Msp430Capture as CaptureB0; provides interface Msp430Capture as CaptureB1; provides interface Msp430Capture as CaptureB2; provides interface Msp430Capture as CaptureB3; provides interface Msp430Capture as CaptureB4; provides interface Msp430Capture as CaptureB5; provides interface Msp430Capture as CaptureB6; } implementation { components new Msp430TimerP( TAIV_, TAR_, TACTL_, TAIFG, TACLR, TAIE, TASSEL0, TASSEL1, TRUE ) as Msp430TimerA , new Msp430TimerP( TBIV_, TBR_, TBCTL_, TBIFG, TBCLR, TBIE, TBSSEL0, TBSSEL1, FALSE ) as Msp430TimerB , new Msp430TimerCapComP( TACCTL0_, TACCR0_ ) as Msp430TimerA0 , new Msp430TimerCapComP( TACCTL1_, TACCR1_ ) as Msp430TimerA1 , new Msp430TimerCapComP( TACCTL2_, TACCR2_ ) as Msp430TimerA2 , new Msp430TimerCapComP( TBCCTL0_, TBCCR0_ ) as Msp430TimerB0 , new Msp430TimerCapComP( TBCCTL1_, TBCCR1_ ) as Msp430TimerB1 , new Msp430TimerCapComP( TBCCTL2_, TBCCR2_ ) as Msp430TimerB2 , new Msp430TimerCapComP( TBCCTL3_, TBCCR3_ ) as Msp430TimerB3 , new Msp430TimerCapComP( TBCCTL4_, TBCCR4_ ) as Msp430TimerB4 , new Msp430TimerCapComP( TBCCTL5_, TBCCR5_ ) as Msp430TimerB5 , new Msp430TimerCapComP( TBCCTL6_, TBCCR6_ ) as Msp430TimerB6 , Msp430TimerCommonP as Common // online DCO calibration // , Msp430DcoCalibC, new AutoStartC(); ; // online DCO calibration // Msp430DcoCalibC.StdControl <- AutoStartC; // Timer A TimerA = Msp430TimerA.Timer; Msp430TimerA.Overflow -> Msp430TimerA.Event[5]; Msp430TimerA.VectorTimerX0 -> Common.VectorTimerA0; Msp430TimerA.VectorTimerX1 -> Common.VectorTimerA1; // Timer A0 ControlA0 = Msp430TimerA0.Control; CompareA0 = Msp430TimerA0.Compare; CaptureA0 = Msp430TimerA0.Capture; Msp430TimerA0.Timer -> Msp430TimerA.Timer; Msp430TimerA0.Event -> Msp430TimerA.Event[0]; // Timer A1 ControlA1 = Msp430TimerA1.Control; CompareA1 = Msp430TimerA1.Compare; CaptureA1 = Msp430TimerA1.Capture; Msp430TimerA1.Timer -> Msp430TimerA.Timer; Msp430TimerA1.Event -> Msp430TimerA.Event[1]; // Timer A2 ControlA2 = Msp430TimerA2.Control; CompareA2 = Msp430TimerA2.Compare; CaptureA2 = Msp430TimerA2.Capture; Msp430TimerA2.Timer -> Msp430TimerA.Timer; Msp430TimerA2.Event -> Msp430TimerA.Event[2]; // Timer B TimerB = Msp430TimerB.Timer; Msp430TimerB.Overflow -> Msp430TimerB.Event[7]; Msp430TimerB.VectorTimerX0 -> Common.VectorTimerB0; Msp430TimerB.VectorTimerX1 -> Common.VectorTimerB1; // Timer B0 ControlB0 = Msp430TimerB0.Control; CompareB0 = Msp430TimerB0.Compare; CaptureB0 = Msp430TimerB0.Capture; Msp430TimerB0.Timer -> Msp430TimerB.Timer; Msp430TimerB0.Event -> Msp430TimerB.Event[0]; // Timer B1 ControlB1 = Msp430TimerB1.Control; CompareB1 = Msp430TimerB1.Compare; CaptureB1 = Msp430TimerB1.Capture; Msp430TimerB1.Timer -> Msp430TimerB.Timer; Msp430TimerB1.Event -> Msp430TimerB.Event[1]; // Timer B2 ControlB2 = Msp430TimerB2.Control; CompareB2 = Msp430TimerB2.Compare; CaptureB2 = Msp430TimerB2.Capture; Msp430TimerB2.Timer -> Msp430TimerB.Timer; Msp430TimerB2.Event -> Msp430TimerB.Event[2]; // Timer B3 ControlB3 = Msp430TimerB3.Control; CompareB3 = Msp430TimerB3.Compare; CaptureB3 = Msp430TimerB3.Capture; Msp430TimerB3.Timer -> Msp430TimerB.Timer; Msp430TimerB3.Event -> Msp430TimerB.Event[3]; // Timer B4 ControlB4 = Msp430TimerB4.Control; CompareB4 = Msp430TimerB4.Compare; CaptureB4 = Msp430TimerB4.Capture; Msp430TimerB4.Timer -> Msp430TimerB.Timer; Msp430TimerB4.Event -> Msp430TimerB.Event[4]; // Timer B5 ControlB5 = Msp430TimerB5.Control; CompareB5 = Msp430TimerB5.Compare; CaptureB5 = Msp430TimerB5.Capture; Msp430TimerB5.Timer -> Msp430TimerB.Timer; Msp430TimerB5.Event -> Msp430TimerB.Event[5]; // Timer B6 ControlB6 = Msp430TimerB6.Control; CompareB6 = Msp430TimerB6.Compare; CaptureB6 = Msp430TimerB6.Capture; Msp430TimerB6.Timer -> Msp430TimerB.Timer; Msp430TimerB6.Event -> Msp430TimerB.Event[6]; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/tmicro/Msp430TimerMicroMapC.nc000066400000000000000000000045071207233610700300030ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** Configure the timer subsystem such that TimerA=ACLK (32kHz) and TimerB=SMCLK/4 (1MHz). */ configuration Msp430TimerMicroMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; Msp430Timer[0] = Msp430TimerC.TimerB; Msp430TimerControl[0] = Msp430TimerC.ControlB0; Msp430Compare[0] = Msp430TimerC.CompareB0; Msp430Timer[1] = Msp430TimerC.TimerB; Msp430TimerControl[1] = Msp430TimerC.ControlB1; Msp430Compare[1] = Msp430TimerC.CompareB1; Msp430Timer[2] = Msp430TimerC.TimerB; Msp430TimerControl[2] = Msp430TimerC.ControlB2; Msp430Compare[2] = Msp430TimerC.CompareB2; Msp430Timer[3] = Msp430TimerC.TimerB; Msp430TimerControl[3] = Msp430TimerC.ControlB3; Msp430Compare[3] = Msp430TimerC.CompareB3; Msp430Timer[4] = Msp430TimerC.TimerB; Msp430TimerControl[4] = Msp430TimerC.ControlB4; Msp430Compare[4] = Msp430TimerC.CompareB4; Msp430Timer[5] = Msp430TimerC.TimerB; Msp430TimerControl[5] = Msp430TimerC.ControlB5; Msp430Compare[5] = Msp430TimerC.CompareB5; Msp430Timer[6] = Msp430TimerC.TimerB; Msp430TimerControl[6] = Msp430TimerC.ControlB6; Msp430Compare[6] = Msp430TimerC.CompareB6; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/tmicro/RadioConfig.h000066400000000000000000000042571207233610700262760ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #ifndef __RADIOCONFIG_H__ #define __RADIOCONFIG_H__ #include #include //#include /* This is the default value of the PA_POWER field of the TXCTL register. */ #ifndef CC2420X_DEF_RFPOWER #define CC2420X_DEF_RFPOWER 0 #endif /* This is the default value of the CHANNEL field of the FSCTRL register. */ #ifndef CC2420X_DEF_CHANNEL #define CC2420X_DEF_CHANNEL 11 #endif /* The number of microseconds a sending micaz mote will wait for an acknowledgement */ #ifndef SOFTWAREACK_TIMEOUT #define SOFTWAREACK_TIMEOUT 800 #endif /** * This is the timer type of the radio alarm interface */ typedef TMicro TRadio; typedef uint16_t tradio_size; /** * The number of radio alarm ticks per one microsecond (0.9216). * We use integers and no parentheses just to make deputy happy. * Ok, further hacks were required for deputy, I removed 00 from the * beginning and end to be able to handle longer wait periods. */ #define RADIO_ALARM_MICROSEC 1 /** * The base two logarithm of the number of radio alarm ticks per one millisecond */ #define RADIO_ALARM_MILLI_EXP 10 #endif//__RADIOCONFIG_H__ tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/tmicro/am/000077500000000000000000000000001207233610700243265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/tmicro/am/ActiveMessageC.nc000066400000000000000000000040151207233610700274730ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface SendNotifier[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketTimeStamp as PacketTimeStampMicro; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2420XActiveMessageC as MessageC; SplitControl = MessageC; AMSend = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; SendNotifier = MessageC; Packet = MessageC; AMPacket = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketLink = MessageC; RadioChannel = MessageC; PacketTimeStampMilli = MessageC; PacketTimeStampMicro = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/cc2420x/tmicro/am/TimeSyncMessageC.nc000066400000000000000000000041471207233610700300210ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketTimeStamp as PacketTimeStampRadio; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC2420XTimeSyncMessageC as MessageC; SplitControl = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; Packet = MessageC; AMPacket = MessageC; PacketTimeStampRadio = MessageC; TimeSyncAMSendRadio = MessageC; TimeSyncPacketRadio = MessageC; PacketTimeStampMilli = MessageC; TimeSyncAMSendMilli = MessageC; TimeSyncPacketMilli = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/ds2411/000077500000000000000000000000001207233610700222655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/ds2411/DallasId48ToIeeeEui64C.nc000066400000000000000000000013751207233610700264610ustar00rootroot00000000000000 #include "PlatformIeeeEui64.h" module DallasId48ToIeeeEui64C { provides interface LocalIeeeEui64; uses interface IDChip; } implementation { command ieee_eui64_t LocalIeeeEui64.getId() { uint8_t id[6]; ieee_eui64_t eui; call IDChip.read(id); eui.data[0] = IEEE_EUI64_COMPANY_ID_0; eui.data[1] = IEEE_EUI64_COMPANY_ID_1; eui.data[2] = IEEE_EUI64_COMPANY_ID_2; // 16 bits of the ID is generated by software // could be used for hardware model id and revision, for example eui.data[3] = IEEE_EUI64_SERIAL_ID_0; eui.data[4] = IEEE_EUI64_SERIAL_ID_1; // 24 least significant bits of the serial ID read from the DS2401 eui.data[5] = id[3]; eui.data[6] = id[4]; eui.data[7] = id[5]; return eui; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/ds2411/HplDs2411C.nc000066400000000000000000000123461207233610700242420ustar00rootroot00000000000000//$Id: HplDs2411C.nc,v 1.2 2010-06-29 22:07:54 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ //@author Cory Sharp /* The 1-wire timings suggested by the DS2411 data sheet are incorrect, incomplete, or unclear. The timings provided the app note 522 work: http://www.maxim-ic.com/appnotes.cfm/appnote_number/522 */ /* This is a stripped version of the DS2411 driver modified for our network stack. Instead of a nice abstraction layer, we rely on TOSH_ASSIGN_PIN(ONEWIRE) in the hardware.h file to set up the appropriate pin for communications. Andrew Christian June 2005 * "ported" to tinyos-2.x * @author Steve Ayer * @date March, 2010 */ module HplDs2411C { provides interface IDChip; } implementation { enum { STD_A = 6, STD_B = 64, STD_C = 60, STD_D = 10, STD_E = 9, STD_F = 55, STD_G = 0, STD_H = 480, STD_I = 90, STD_J = 220, }; void init_pins() { #ifdef ID_CHIP_POWER TOSH_SET_ONEWIRE_POWER_PIN(); TOSH_MAKE_ONEWIRE_POWER_OUTPUT(); #endif TOSH_SEL_ONEWIRE_IOFUNC(); TOSH_MAKE_ONEWIRE_INPUT(); TOSH_CLR_ONEWIRE_PIN(); } void clear_pins() { #ifdef TOSH_SET_ONEWIRE_POWER_PIN TOSH_CLR_ONEWIRE_POWER_OUTPUT(); #endif // Don't need to fix ONEWIRE...it finishes as an INPUT } bool reset() // >= 960us { int present; TOSH_MAKE_ONEWIRE_OUTPUT(); TOSH_uwait(STD_H); //t_RSTL TOSH_MAKE_ONEWIRE_INPUT(); TOSH_uwait(STD_I); //t_MSP present = TOSH_READ_ONEWIRE_PIN(); TOSH_uwait(STD_J); //t_REC return (present == 0); } void write_bit_one() // >= 70us { TOSH_MAKE_ONEWIRE_OUTPUT(); TOSH_uwait(STD_A); //t_W1L TOSH_MAKE_ONEWIRE_INPUT(); TOSH_uwait(STD_B); //t_SLOT - t_W1L } void write_bit_zero() // >= 70us { TOSH_MAKE_ONEWIRE_OUTPUT(); TOSH_uwait(STD_C); //t_W0L TOSH_MAKE_ONEWIRE_INPUT(); TOSH_uwait(STD_D); //t_SLOT - t_W0L } void write_bit( int is_one ) // >= 70us { if(is_one) write_bit_one(); else write_bit_zero(); } bool read_bit() // >= 70us { int bit; TOSH_MAKE_ONEWIRE_OUTPUT(); TOSH_uwait(STD_A); //t_RL TOSH_MAKE_ONEWIRE_INPUT(); TOSH_uwait(STD_E); //near-max t_MSR bit = TOSH_READ_ONEWIRE_PIN(); TOSH_uwait(STD_F); //t_REC return bit; } void write_byte( uint8_t byte ) // >= 560us { uint8_t bit; for( bit=0x01; bit!=0; bit<<=1 ) write_bit( byte & bit ); } uint8_t read_byte() // >= 560us { uint8_t byte = 0; uint8_t bit; for( bit=0x01; bit!=0; bit<<=1 ) { if( read_bit() ) byte |= bit; } return byte; } uint8_t crc8_byte( uint8_t crc, uint8_t byte ) { int i; crc ^= byte; for( i=0; i<8; i++ ) { if( crc & 1 ) crc = (crc >> 1) ^ 0x8c; else crc >>= 1; } return crc; } /* * Reset the DS2411 chip and read the 8 bytes of data out. * We verify the CRC to ensure good data, dump the family byte (it should be '1') * and fill a buffer with the 6 good uniqut address bytes. * * It is possible for the initialization to fail. */ command error_t IDChip.read( uint8_t *id_buf ) // >= 6000us { int retry = 5; uint8_t id[8]; init_pins(); TOSH_uwait( 1200 ); // Delay a bit at start up (as per DS2411 data sheet) while( retry-- > 0 ) { int crc = 0; if( reset() ) { uint8_t* byte; write_byte(0x33); //read rom for( byte=id+7; byte!=id-1; byte-- ) crc = crc8_byte( crc, *byte=read_byte() ); if( crc == 0 ) { memcpy( id_buf, id + 1, 6 ); clear_pins(); return SUCCESS; } } } clear_pins(); return FAIL; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/ds2411/IDChip.nc000066400000000000000000000037701207233610700237160ustar00rootroot00000000000000//$Id: IDChip.nc,v 1.2 2010-06-29 22:07:54 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ //@author Cory Sharp /* * This is a stripped version of the DS2411 driver that provides very * limited functionality. Generally you should call this at start up and * use the result to fill in the CC2420 Radio's long address. */ interface IDChip { command error_t read( uint8_t *id_buf ); // Fills in 6 bytes if successful. } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/ds2411/LocalIeeeEui64C.nc000066400000000000000000000026571207233610700253630ustar00rootroot00000000000000// $Id: LocalIeeeEui64C.nc,v 1.1 2010/02/23 06:45:38 sdhsdh Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai * Shimmer port by * @author Michael Healy * @date September, 2010 */ configuration LocalIeeeEui64C { provides interface LocalIeeeEui64; } implementation { components HplDs2411C, DallasId48ToIeeeEui64C; LocalIeeeEui64 = DallasId48ToIeeeEui64C; DallasId48ToIeeeEui64C.IDChip -> HplDs2411C; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/ds2411/PlatformIeeeEui64.h000066400000000000000000000027741207233610700256410ustar00rootroot00000000000000// $Id: PlatformIeeeEui64.h,v 1.1 2010/02/23 06:45:38 sdhsdh Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #ifndef PLATFORMIEEEEUI64_H #define PLATFORMIEEEEUI64_H enum { // University of California Berkeley's OUI IEEE_EUI64_COMPANY_ID_0 = 0x00, IEEE_EUI64_COMPANY_ID_1 = 0x12, IEEE_EUI64_COMPANY_ID_2 = 0x6d, // Following two octets must be 'LO' -- "local" in order to use UCB's OUI IEEE_EUI64_SERIAL_ID_0 = 'L', IEEE_EUI64_SERIAL_ID_1 = 'O', }; #endif // PLATFORMIEEEEUI64_H tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/gsr/000077500000000000000000000000001207233610700221425ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/gsr/Gsr.h000066400000000000000000000034031207233610700230460ustar00rootroot00000000000000/* * Copyright (c) 2011, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Mike Healy * @date April, 2011 */ #ifndef GSR_H #define GSR_H enum { HW_RES_40K = 0, HW_RES_287K = 1, HW_RES_1M = 2, HW_RES_3M3 = 3 }; #endif tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/gsr/Gsr.nc000066400000000000000000000064151207233610700232250ustar00rootroot00000000000000/* * Copyright (c) 2011, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Mike Healy * @date April, 2011 */ interface Gsr { /** * Adjusts the GSR's range by selecting the which internal resistor is used * * @param range: select the resistor to use * 0: 40 kohm * 1: 287 kohm * 2: 1.0 Mohm * 3: 3.3 Mohm */ command void setRange(uint8_t range); /** * Calculates resistance from a raw ADC value * * @param ADC_val: the ADC value to be used in the calculation * @param active_resistor: the currently active resistor on the GSR board * @return the calculated resistance */ command uint32_t calcResistance(uint16_t ADC_val, uint8_t active_resistor); /** * Determines whether to change the currently active internal resistor based * on the ADC value, and if necessary change the internal resistor to a new * value * * @param ADC_val: the ADC value to be used in the calculation * @param active_resistor: the currently active resistor on the GSR board * @return the active internal resistor */ command uint8_t controlRange(uint16_t ADC_val, uint8_t active_resistor); /** * Initializes the smoothing state * * @param active_resistor: the currently active resistor on the GSR board */ command void initSmoothing(uint8_t active_resistor); /** * Smooths the GSR values * * @param resistance: the current resistance value to smoothed * @param active_resistor: the currently active resistor on the GSR board * @return the smoothed resistance. Returns 0xFFFFFFFF if transient sample */ command uint32_t smoothSample(uint32_t resistance, uint8_t active_resistor); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/gsr/GsrC.nc000066400000000000000000000034401207233610700233230ustar00rootroot00000000000000/* * Copyright (c) 2011, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Mike Healy * @date April, 2011 */ configuration GsrC { provides { interface Init; interface Gsr; } } implementation { components GsrP; Init = GsrP; Gsr = GsrP; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/gsr/GsrP.nc000066400000000000000000000250441207233610700233440ustar00rootroot00000000000000/* * Copyright (c) 2011, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Mike Healy * @date April, 2011 * * Driver for the shimmer GSR board * Based heavily on Adrian Burn's GSR code from tinyos-1.x/contrib/handhelds/apps/BioMOBIUS/GSR */ #include "Gsr.h" module GsrP { provides interface Init; provides interface Gsr; } implementation { #define HW_RES_40K_MIN_ADC_VAL 1140 //10k to 56k..1159->1140 #define HW_RES_287K_MAX_ADC_VAL 3800 //56k to 220k was 4000 but was 3948 on shimer so changed to 3800 #define HW_RES_287K_MIN_ADC_VAL 1490 //56k to 220k..1510->1490 #define HW_RES_1M_MAX_ADC_VAL 3700 //220k to 680k #define HW_RES_1M_MIN_ADC_VAL 1630 //220k to 680k..1650->1630 #define HW_RES_3M3_MAX_ADC_VAL 3930 //680k to 4M7 #define HW_RES_3M3_MIN_ADC_VAL 1125 //680k to 4M7 // These constants were calculated by measuring against precision resistors // and then using polynomial curve fitting #define HW_RES_40K_CONSTANT_1 0.0000000065995 #define HW_RES_40K_CONSTANT_2 (-0.000068950) #define HW_RES_40K_CONSTANT_3 0.2699 #define HW_RES_40K_CONSTANT_4 (-476.9835) #define HW_RES_40K_CONSTANT_5 340351.3341 #define HW_RES_287K_CONSTANT_1 0.000000013569627 #define HW_RES_287K_CONSTANT_2 (-0.0001650399) #define HW_RES_287K_CONSTANT_3 0.7541990 #define HW_RES_287K_CONSTANT_4 (-1572.6287856) #define HW_RES_287K_CONSTANT_5 1367507.9270 #define HW_RES_1M_CONSTANT_1 0.00000002550036498 #define HW_RES_1M_CONSTANT_2 (-0.00033136) #define HW_RES_1M_CONSTANT_3 1.6509426597 #define HW_RES_1M_CONSTANT_4 (-3833.348044) #define HW_RES_1M_CONSTANT_5 3806317.6947 #define HW_RES_3M3_CONSTANT_1 0.00000037153627 #define HW_RES_3M3_CONSTANT_2 (-0.004239437) #define HW_RES_3M3_CONSTANT_3 17.905709 #define HW_RES_3M3_CONSTANT_4 (-33723.8657) #define HW_RES_3M3_CONSTANT_5 25368044.6279 /* when we switch resistors with the ADG658 it takes a few samples for the ADC to start to see the new sampled voltage correctly, the catch below is to eliminate any glitches in the data */ #define ONE_HUNDRED_OHM_STEP 100 #define MAX_RESISTANCE_STEP 5000 /* instead of having a large step when resistors change - have a smoother step */ #define NUM_SMOOTHING_SAMPLES 64 /* ignore these samples after a resistor switch - instead send special code */ #define NUM_SAMPLES_TO_IGNORE 6 #define STARTING_RESISTANCE 10000000 uint8_t last_active_resistor, got_first_sample; uint16_t transient_sample, transient_smoothing_samples, max_resistance_step; uint32_t last_resistance; command error_t Init.init() { // configure pins TOSH_MAKE_PROG_OUT_OUTPUT(); //A0 TOSH_SEL_PROG_OUT_IOFUNC(); TOSH_MAKE_SER0_CTS_OUTPUT(); //A1 TOSH_SEL_SER0_CTS_IOFUNC(); // by default set to use 40kohm resistor call Gsr.setRange(HW_RES_40K); call Gsr.initSmoothing(HW_RES_40K); return SUCCESS; } command void Gsr.setRange(uint8_t range) { switch(range) { case HW_RES_40K: TOSH_CLR_PROG_OUT_PIN(); TOSH_CLR_SER0_CTS_PIN(); break; case HW_RES_287K: TOSH_SET_PROG_OUT_PIN(); TOSH_CLR_SER0_CTS_PIN(); break; case HW_RES_1M: TOSH_CLR_PROG_OUT_PIN(); TOSH_SET_SER0_CTS_PIN(); break; case HW_RES_3M3: TOSH_SET_PROG_OUT_PIN(); TOSH_SET_SER0_CTS_PIN(); break; } } uint64_t multiply(uint64_t no1, uint64_t no2){ if (no1 == 0 || no2 == 0) return 0; if (no1 == 1) return no2; if (no2 == 1) return no1; return no1*no2; } command uint32_t Gsr.calcResistance(uint16_t ADC_val, uint8_t active_resistor) { uint32_t resistance=0; uint64_t adc_pow1, adc_pow2, adc_pow3, adc_pow4; adc_pow1 = ADC_val; adc_pow2 = multiply(adc_pow1, ADC_val); adc_pow3 = multiply(adc_pow2, ADC_val); adc_pow4 = multiply(adc_pow3, ADC_val); switch ( active_resistor ) { case HW_RES_40K: resistance = ( ( (HW_RES_40K_CONSTANT_1)* adc_pow4) + //(powf(ADC_val,4)) ) + ( (HW_RES_40K_CONSTANT_2)* adc_pow3) + //(powf(ADC_val,3)) ) + ( (HW_RES_40K_CONSTANT_3)* adc_pow2) + //(powf(ADC_val,2)) ) + ( (HW_RES_40K_CONSTANT_4)* adc_pow1) + //(powf(ADC_val,1)) ) + (HW_RES_40K_CONSTANT_5) ); break; case HW_RES_287K: resistance = ( ( (HW_RES_287K_CONSTANT_1)* adc_pow4) + //(powf(ADC_val,4)) ) + ( (HW_RES_287K_CONSTANT_2)* adc_pow3) + //(powf(ADC_val,3)) ) + ( (HW_RES_287K_CONSTANT_3)* adc_pow2) + //(powf(ADC_val,2)) ) + ( (HW_RES_287K_CONSTANT_4)* adc_pow1) + //(powf(ADC_val,1)) ) + (HW_RES_287K_CONSTANT_5) ); break; case HW_RES_1M: resistance = ( ( (HW_RES_1M_CONSTANT_1)* adc_pow4) + //(powf(ADC_val,4)) ) + ( (HW_RES_1M_CONSTANT_2)* adc_pow3) + //(powf(ADC_val,3)) ) + ( (HW_RES_1M_CONSTANT_3)* adc_pow2) + //(powf(ADC_val,2)) ) + ( (HW_RES_1M_CONSTANT_4)* adc_pow1) + //(powf(ADC_val,1)) ) + (HW_RES_1M_CONSTANT_5) ); break; case HW_RES_3M3: resistance = ( ( (HW_RES_3M3_CONSTANT_1)* adc_pow4) + //(powf(ADC_val,4)) ) + ( (HW_RES_3M3_CONSTANT_2)* adc_pow3) + //(powf(ADC_val,3)) ) + ( (HW_RES_3M3_CONSTANT_3)* adc_pow2) + //(powf(ADC_val,2)) ) + ( (HW_RES_3M3_CONSTANT_4)* adc_pow1) + //(powf(ADC_val,1)) ) + (HW_RES_3M3_CONSTANT_5) ); default: } return resistance; } command uint8_t Gsr.controlRange(uint16_t ADC_val, uint8_t active_resistor) { uint8_t ret = active_resistor; switch ( active_resistor ) { case HW_RES_40K: if (ADC_val < HW_RES_40K_MIN_ADC_VAL){ call Gsr.setRange(HW_RES_287K); ret = HW_RES_287K; } break; case HW_RES_287K: if( (ADC_val <= HW_RES_287K_MAX_ADC_VAL) && (ADC_val >= HW_RES_287K_MIN_ADC_VAL) ) { ;//stay here } else if (ADC_val < HW_RES_287K_MIN_ADC_VAL) { call Gsr.setRange(HW_RES_1M); ret = HW_RES_1M; } else { call Gsr.setRange(HW_RES_40K); ret = HW_RES_40K; } break; case HW_RES_1M: if( (ADC_val <= HW_RES_1M_MAX_ADC_VAL) && (ADC_val >= HW_RES_1M_MIN_ADC_VAL) ) { ;//stay here } else if (ADC_val < HW_RES_1M_MIN_ADC_VAL) { call Gsr.setRange(HW_RES_3M3); ret = HW_RES_3M3; } else { call Gsr.setRange(HW_RES_287K); ret = HW_RES_287K; } break; case HW_RES_3M3: if( (ADC_val <= HW_RES_3M3_MAX_ADC_VAL) && (ADC_val >= HW_RES_3M3_MIN_ADC_VAL) ) { ;//stay here } else if (ADC_val > HW_RES_3M3_MAX_ADC_VAL) { call Gsr.setRange(HW_RES_1M); ret = HW_RES_1M; } else { /* MIN so cant go any higher*/ } break; default: } return ret; } command void Gsr.initSmoothing(uint8_t active_resistor) { last_active_resistor = active_resistor; got_first_sample = FALSE; transient_sample = NUM_SAMPLES_TO_IGNORE; transient_smoothing_samples = 0; max_resistance_step = MAX_RESISTANCE_STEP; last_resistance = STARTING_RESISTANCE; } command uint32_t Gsr.smoothSample(uint32_t resistance, uint8_t active_resistor) { if(active_resistor != last_active_resistor) { transient_sample = NUM_SAMPLES_TO_IGNORE; max_resistance_step = ONE_HUNDRED_OHM_STEP; transient_smoothing_samples = NUM_SMOOTHING_SAMPLES; last_active_resistor = active_resistor; } // if we are after a transition then max_resistance_step will be small to ensure smooth transition if (transient_smoothing_samples) { transient_smoothing_samples--; // if we are finished smoothing then go back to a larger resistance step if (!transient_smoothing_samples) max_resistance_step = MAX_RESISTANCE_STEP; } // only prevent a large step from last resistance if we actually have a last resistance if ((got_first_sample) && (last_resistance > max_resistance_step)) { if( resistance > (last_resistance+max_resistance_step) ) resistance = (last_resistance+max_resistance_step); else if ( resistance < (last_resistance-max_resistance_step) ) resistance = (last_resistance-max_resistance_step); else ; } else { // get the first sample in this run of sampling got_first_sample = TRUE; } last_resistance = resistance; // if this sample is near a resistor transition then send a special code for data analysis if(transient_sample) { transient_sample--; resistance = 0xFFFFFFFF; } return resistance; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/mma7260/000077500000000000000000000000001207233610700224405ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/mma7260/AccelC.nc000066400000000000000000000034761207233610700241060ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date May, 2010 * */ configuration AccelC { provides { interface Mma_Accel as Accel; interface Init; } } implementation { components Mma7260P; Init = Mma7260P; Accel = Mma7260P; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/mma7260/Mma7260.h000066400000000000000000000033551207233610700236500ustar00rootroot00000000000000/* * Copyright (c) 2006, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date August, 2006 */ #ifndef MMA7260_H #define MMA7260_H enum MMA7260_RANGE { RANGE_1_5G = 0, RANGE_2_0G = 1, RANGE_4_0G = 2, RANGE_6_0G = 3 }; #endif tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/mma7260/Mma7260.nc000066400000000000000000000040631207233610700240160ustar00rootroot00000000000000/* * Copyright (c) 2006, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date August 2006 * @author Konrad Lorincz * ported to TOS 2 */ #include "Mma7260.h" interface Mma7260 { /** * Turns the accelerometer on or off. * * @param wakeup if TRUE turns it on; if FALSE turns it off */ command void wake(bool wakeup); /** * Sets the sensitivity (gain) of the sensors. * * @param sensitivity the sensitivity (gain) */ command void setSensitivity(enum MMA7260_RANGE sensitivity); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/mma7260/Mma7260P.nc000066400000000000000000000061751207233610700241440ustar00rootroot00000000000000/* * Copyright (c) 2006, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date August 2006 * @author Konrad Lorincz * ported to TOS 2 */ #include "Mma_Accel.h" module Mma7260P { provides interface Init; provides interface Mma_Accel as Accel; } implementation { command error_t Init.init() { // configure pins TOSH_MAKE_ACCEL_SLEEP_N_OUTPUT(); // sleep for accel TOSH_SEL_ACCEL_SLEEP_N_IOFUNC(); TOSH_MAKE_ADC_ACCELZ_INPUT(); TOSH_SEL_ADC_ACCELZ_MODFUNC(); TOSH_MAKE_ADC_ACCELY_INPUT(); TOSH_SEL_ADC_ACCELY_MODFUNC(); TOSH_MAKE_ADC_ACCELX_INPUT(); TOSH_SEL_ADC_ACCELX_MODFUNC(); // by default wake up accelerometer call Accel.wake(TRUE); return SUCCESS; } command void Accel.wake(bool wakeup) { if(wakeup) TOSH_SET_ACCEL_SLEEP_N_PIN(); // wakes up accel board else TOSH_CLR_ACCEL_SLEEP_N_PIN(); // puts accel board to sleep } command void Accel.setSensitivity(uint8_t sensitivity) { switch(sensitivity) { case RANGE_1_5G: TOSH_CLR_ACCEL_SEL0_PIN(); TOSH_CLR_ACCEL_SEL1_PIN(); break; case RANGE_2_0G: TOSH_SET_ACCEL_SEL0_PIN(); TOSH_CLR_ACCEL_SEL1_PIN(); break; case RANGE_4_0G: TOSH_CLR_ACCEL_SEL0_PIN(); TOSH_SET_ACCEL_SEL1_PIN(); break; case RANGE_6_0G: TOSH_SET_ACCEL_SEL0_PIN(); TOSH_SET_ACCEL_SEL1_PIN(); break; } } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/mma7260/Mma_Accel.h000066400000000000000000000034111207233610700244110ustar00rootroot00000000000000/* * Copyright (c) 2006, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date August, 2006 */ #ifndef MMA7260_H #define MMA7260_H enum MMA7260_RANGE { RANGE_1_5G = 0, RANGE_2_0G = 1, // 7260 only RANGE_4_0G = 2, // 7260 only RANGE_6_0G = 3 }; #endif tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/mma7260/Mma_Accel.nc000066400000000000000000000041601207233610700245640ustar00rootroot00000000000000/* * Copyright (c) 2006, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date August 2006 * @author Konrad Lorincz * ported to TOS 2 * @author Steve Ayer * @date May, 2010 * name abstraction to cover other accel chipsets */ interface Mma_Accel { /** * Turns the accelerometer on or off. * * @param wakeup if TRUE turns it on; if FALSE turns it off */ command void wake(bool wakeup); /** * Sets the sensitivity (gain) of the sensors. * * @param sensitivity the sensitivity (gain) */ command void setSensitivity(uint8_t sensitivity); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/000077500000000000000000000000001207233610700223755ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/FastClock.nc000066400000000000000000000035251207233610700245750ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date August, 2010 * * some people will want to turn the clock off again... */ interface FastClock { // turn xt2 off, restore default dco selection to mclk command void disable(); command void setSMCLK(uint8_t mhz); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/FastClockC.nc000066400000000000000000000035571207233610700247050ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date August, 2010 */ configuration FastClockC { provides{ interface Init; interface FastClock; } } implementation { components FastClockP; Init = FastClockP; FastClock = FastClockP; components LedsC; FastClockP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/FastClockP.nc000066400000000000000000000074431207233610700247200ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date August, 2010 * * finally sick of duplicating the same ti msp430 routine to initialize the * xt2 crystal on this family of platforms, a module to do it for us. * * ********************** APP WARNING NOTE: ************************************** * * by default this uses an smclk divisor of 2, so the smclk will * run at 4mhz, breaking some bus timings. to fix this, simply add the line * PFLAGS += -DSMCLK_4MHZ * to your app's Makefile and see SDP.nc for how this is handled in a driver. * Alternatively, you can set the smclk back to 1mhz by changing DIVS_1 to DIVS_7 * * ******************************************************************************** */ #include "msp430hardware.h" module FastClockP{ provides{ interface Init; interface FastClock; } uses interface Leds; } implementation { command error_t Init.init() { register uint8_t i; /* * set up 8mhz clock to max out * msp430 throughput */ atomic{ CLR_FLAG(BCSCTL1, XT2OFF); // basic clock system control reg, turn off XT2 osc call Leds.led0On(); do{ CLR_FLAG(IFG1, OFIFG); __delay_cycles(50); } while(READ_FLAG(IFG1, OFIFG)); call Leds.led0Off(); for(i = 0; i < 100; i++) TOSH_uwait(500); /* * select master clock source, XT2CLK when XT2 oscillator present * on-chip. LFXT1CLK when XT2 oscillator not present on-chip. */ BCSCTL2 = 0; SET_FLAG(BCSCTL2, SELM_2); SET_FLAG(BCSCTL2, SELS); // smclk from xt2 SET_FLAG(BCSCTL2, DIVS_1); // divide it by 2 } return SUCCESS; } command void FastClock.disable() { atomic { SET_FLAG(BCSCTL2, SELM_0); SET_FLAG(BCSCTL1, XT2OFF); } } command void FastClock.setSMCLK(uint8_t mhz){ switch(mhz) { case 1: SET_FLAG(BCSCTL2, DIVS_3); // divide 8mhz xt2 by 8 break; case 2: SET_FLAG(BCSCTL2, DIVS_2); // divide by 4 CLR_FLAG(BCSCTL2, DIVS_1); break; case 4: SET_FLAG(BCSCTL2, DIVS_1); // divide by 2 CLR_FLAG(BCSCTL2, DIVS_2); break; default: SET_FLAG(BCSCTL2, DIVS_3); // divide by 8 break; } } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/HilTimerMilli64C.nc000066400000000000000000000050451207233610700257040ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * HilTimerMilliC provides a parameterized interface to a virtualized * millisecond timer. TimerMilliC in tos/system/ uses this component to * allocate new timers. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration HilTimerMilli64C { provides interface Init; provides interface Timer as TimerMilli[ uint8_t num ]; provides interface LocalTime; } implementation { components new AlarmMilli32C(); components new AlarmToTimerC(TMilli); components new VirtualizeTimerC(TMilli,uniqueCount(UQ_TIMER_MILLI)); components new CounterToLocalTimeC(TMilli); components CounterMilli64C; Init = AlarmMilli32C; TimerMilli = VirtualizeTimerC; LocalTime = CounterToLocalTimeC; VirtualizeTimerC.TimerFrom -> AlarmToTimerC; AlarmToTimerC.Alarm -> AlarmMilli32C; CounterToLocalTime64C.Counter -> CounterMilli64C; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/HplMsp430I2C0P.nc000066400000000000000000000206641207233610700250570ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2010/07/29 13:18:27 $ */ module HplMsp430I2C0P @safe() { provides interface HplMsp430I2C as HplI2C; uses interface HplMsp430Usart as HplUsart; uses interface HplMsp430GeneralIO as SIMO; uses interface HplMsp430GeneralIO as UCLK; } implementation { MSP430REG_NORACE(U0CTL); MSP430REG_NORACE(I2CTCTL); MSP430REG_NORACE(I2CDR); MSP430REG_NORACE(I2CSA); MSP430REG_NORACE(I2CIE); async command bool HplI2C.isI2C() { atomic return ((U0CTL & I2C) && (U0CTL & SYNC) && (U0CTL & I2CEN)); } async command void HplI2C.clearModeI2C() { atomic { U0CTL &= ~(I2C | SYNC | I2CEN); call HplUsart.resetUsart(TRUE); } } async command void HplI2C.setModeI2C( msp430_i2c_union_config_t* config ) { call HplUsart.resetUsart(TRUE); call HplUsart.disableUart(); call HplUsart.disableSpi(); call SIMO.makeInput(); call SIMO.selectModuleFunc(); call UCLK.makeInput(); call UCLK.selectModuleFunc(); atomic { IE1 &= ~(UTXIE0 | URXIE0); // interrupt disable U0CTL &= ~(I2C | I2CEN | SYNC); U0CTL = SWRST; U0CTL |= SYNC | I2C; U0CTL &= ~I2CEN; U0CTL |= MST; I2CTCTL = I2CSSEL_2; // use 1MHz SMCLK as the I2C reference I2CPSC = 0x00; // I2C CLK runs at 1MHz/10 = 100kHz I2CSCLH = 0x03; I2CSCLL = 0x03; I2CIE = 0; // clear all I2C interrupt enables I2CIFG = 0; // clear all I2C interrupt flags /* U0CTL = (config->i2cRegisters.uctl | (I2C | SYNC)) & ~I2CEN; I2CTCTL = config->i2cRegisters.i2ctctl; I2CPSC = config->i2cRegisters.i2cpsc; I2CSCLH = config->i2cRegisters.i2csclh; I2CSCLL = config->i2cRegisters.i2cscll; I2COA = config->i2cRegisters.i2coa; */ // U0CTL |= I2CEN; } } // U0CTL async command void HplI2C.setMasterMode() { U0CTL |= MST; } async command void HplI2C.setSlaveMode() { U0CTL &= ~MST; } async command void HplI2C.enableI2C() { U0CTL |= I2CEN; } async command void HplI2C.disableI2C() { U0CTL &= ~I2CEN; } // I2CTCTL async command bool HplI2C.getWordMode() { return ( I2CTCTL & I2CWORD ) != 0; } async command void HplI2C.setWordMode( bool mode ) { I2CTCTL |= ( mode & 0x1 ) << 7; } async command bool HplI2C.getRepeatMode() { return ( I2CTCTL & I2CRM ) != 0; } async command void HplI2C.setRepeatMode( bool mode ) { I2CTCTL |= ( mode & 0x1 ) << 6;; } async command uint8_t HplI2C.getClockSource() { return ( I2CTCTL >> 4 ) & 0x3;; } async command void HplI2C.setClockSource( uint8_t src ) { atomic I2CTCTL = ( ( src & 0x3 ) << 4 ) | I2CTCTL; } async command bool HplI2C.getTransmitReceiveMode() { return ( I2CTCTL & I2CTRX ) != 0; } async command void HplI2C.setTransmitMode() { I2CTCTL |= I2CTRX; } async command void HplI2C.setReceiveMode() { I2CTCTL &= ~I2CTRX; } async command bool HplI2C.getStartByte() { return (I2CTCTL & I2CSTB) != 0; } async command void HplI2C.setStartByte() { I2CTCTL |= I2CSTB; } async command bool HplI2C.getStopBit() { return (I2CTCTL & I2CSTP) != 0; } async command void HplI2C.setStopBit() { I2CTCTL |= I2CSTP; } async command bool HplI2C.getStartBit() { return (I2CTCTL & I2CSTT) != 0; } async command void HplI2C.setStartBit() { I2CTCTL |= I2CSTT; } // I2CDR async command uint8_t HplI2C.getData() { return I2CDR; } async command void HplI2C.setData( uint8_t v ) { I2CDR = v; } // I2CNDAT async command uint8_t HplI2C.getTransferByteCount() { return I2CNDAT; } async command void HplI2C.setTransferByteCount( uint8_t v ) { I2CNDAT = v; } // I2CPSC async command uint8_t HplI2C.getClockPrescaler() { return I2CPSC; } async command void HplI2C.setClockPrescaler( uint8_t v ) { I2CPSC = v; } // I2CSCLH and I2CSCLL async command uint16_t HplI2C.getShiftClock() { uint16_t shift; atomic { shift = I2CSCLH; shift <<= 8; shift |= I2CSCLL; } return shift; } async command void HplI2C.setShiftClock( uint16_t shift ) { atomic { I2CSCLH = shift >> 8; I2CSCLL = shift; } } // I2COA async command uint16_t HplI2C.getOwnAddress() { return I2COA; } async command void HplI2C.setOwnAddress( uint16_t addr ) { I2COA = addr; } // I2CSA async command uint16_t HplI2C.getSlaveAddress() { return I2CSA; } async command void HplI2C.setSlaveAddress( uint16_t addr ) { I2CSA = addr; } // I2CIE async command void HplI2C.disableStartDetect() { I2CIE &= ~STTIE; } async command void HplI2C.enableStartDetect() { I2CIE |= STTIE; } async command void HplI2C.disableGeneralCall() { I2CIE &= ~GCIE; } async command void HplI2C.enableGeneralCall() { I2CIE |= GCIE; } async command void HplI2C.disableTransmitReady() { I2CIE &= ~TXRDYIE; } async command void HplI2C.enableTransmitReady() { I2CIE |= TXRDYIE; } async command void HplI2C.disableReceiveReady() { I2CIE &= ~RXRDYIE; } async command void HplI2C.enableReceiveReady() { I2CIE |= RXRDYIE; } async command void HplI2C.disableAccessReady() { I2CIE &= ~ARDYIE; } async command void HplI2C.enableAccessReady() { I2CIE |= ARDYIE; } async command void HplI2C.disableOwnAddress() { I2CIE &= ~OAIE; } async command void HplI2C.enableOwnAddress() { I2CIE |= OAIE; } async command void HplI2C.disableNoAck() { I2CIE &= ~NACKIE; } async command void HplI2C.enableNoAck() { I2CIE |= NACKIE; } async command void HplI2C.disableArbitrationLost() { I2CIE &= ~ALIE; } async command void HplI2C.enableArbitrationLost() { I2CIE |= ALIE; } // I2CIFG async command bool HplI2C.isStartDetectPending() { if (I2CIFG & STTIFG){ I2CIFG &= ~STTIFG; return SUCCESS; } return FAIL; } async command bool HplI2C.isGeneralCallPending() { if (I2CIFG & GCIFG){ I2CIFG &= ~GCIFG; return SUCCESS; } return FAIL; } async command bool HplI2C.isTransmitReadyPending() { return ( I2CIFG & TXRDYIFG ) != 0; } async command bool HplI2C.isReceiveReadyPending() { return ( I2CIFG & RXRDYIFG ) != 0; } async command bool HplI2C.isAccessReadyPending() { if (I2CIFG & ARDYIFG){ I2CIFG &= ~ARDYIFG; return SUCCESS; } return FAIL; } async command bool HplI2C.isOwnAddressPending() { if (I2CIFG & OAIFG){ I2CIFG &= ~OAIFG; return SUCCESS; } return FAIL; } async command bool HplI2C.isNoAckPending() { if (I2CIFG & NACKIFG){ I2CIFG &= ~NACKIFG; return SUCCESS; } return FAIL; } async command bool HplI2C.isArbitrationLostPending() { if (I2CIFG & ALIFG){ I2CIFG &= ~ALIFG; return SUCCESS; } return FAIL; } // I2CIV async command uint8_t HplI2C.getIV() { return I2CIV; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/HplMsp430Usart0P.nc000066400000000000000000000262461207233610700256020ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Copyright (c) 2004-2005, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "msp430usart.h" /** * Implementation of USART0 lowlevel functionality - stateless. * Setting a mode will by default disable USART-Interrupts. * * @author: Jan Hauer * @author: Jonathan Hui * @author: Vlado Handziski * @author: Joe Polastre * @author: Philipp Huppertz * @version $Revision: 1.2 $ $Date: 2010/07/29 13:19:06 $ */ module HplMsp430Usart0P @safe() { provides interface HplMsp430Usart as Usart; provides interface HplMsp430UsartInterrupts as Interrupts; provides interface HplMsp430I2CInterrupts as I2CInterrupts; uses interface HplMsp430I2C as HplI2C; uses interface HplMsp430GeneralIO as SIMO; uses interface HplMsp430GeneralIO as SOMI; uses interface HplMsp430GeneralIO as UCLK; uses interface HplMsp430GeneralIO as URXD; uses interface HplMsp430GeneralIO as UTXD; uses interface Leds; } implementation { MSP430REG_NORACE(IE1); MSP430REG_NORACE(ME1); MSP430REG_NORACE(IFG1); MSP430REG_NORACE(U0TCTL); MSP430REG_NORACE(U0RCTL); MSP430REG_NORACE(U0TXBUF); TOSH_SIGNAL(UART0RX_VECTOR) { uint8_t temp = U0RXBUF; // call Leds.led0Toggle(); signal Interrupts.rxDone(temp); } TOSH_SIGNAL(UART0TX_VECTOR) { if ( call HplI2C.isI2C() ){ // call Leds.led1Toggle(); signal I2CInterrupts.fired(); } else{ // call Leds.led2Toggle(); signal Interrupts.txDone(); } } async command void Usart.setUctl(msp430_uctl_t control) { U0CTL=uctl2int(control); } async command msp430_uctl_t Usart.getUctl() { return int2uctl(U0CTL); } async command void Usart.setUtctl(msp430_utctl_t control) { U0TCTL=utctl2int(control); } async command msp430_utctl_t Usart.getUtctl() { return int2utctl(U0TCTL); } async command void Usart.setUrctl(msp430_urctl_t control) { U0RCTL=urctl2int(control); } async command msp430_urctl_t Usart.getUrctl() { return int2urctl(U0RCTL); } async command void Usart.setUbr(uint16_t control) { atomic { U0BR0 = control & 0x00FF; U0BR1 = (control >> 8) & 0x00FF; } } async command uint16_t Usart.getUbr() { return (U0BR1 << 8) + U0BR0; } async command void Usart.setUmctl(uint8_t control) { U0MCTL=control; } async command uint8_t Usart.getUmctl() { return U0MCTL; } async command void Usart.resetUsart(bool reset) { if (reset) { U0CTL = SWRST; } else { CLR_FLAG(U0CTL, SWRST); } } async command bool Usart.isSpi() { atomic { return (U0CTL & SYNC) && (ME1 & USPIE0); } } async command bool Usart.isUart() { atomic { return !(U0CTL & SYNC) && ((ME1 & UTXE0) && (ME1 & URXE0)); } } async command bool Usart.isUartTx() { atomic { return !(U0CTL & SYNC) && (ME1 & UTXE0); } } async command bool Usart.isUartRx() { atomic { return !(U0CTL & SYNC) && (ME1 & URXE0); } } async command msp430_usartmode_t Usart.getMode() { if (call Usart.isUart()) return USART_UART; else if (call Usart.isUartRx()) return USART_UART_RX; else if (call Usart.isUartTx()) return USART_UART_TX; else if (call Usart.isSpi()) return USART_SPI; else if (call HplI2C.isI2C()) return USART_I2C; else return USART_NONE; } async command void Usart.enableUart() { atomic{ call UTXD.selectModuleFunc(); call URXD.selectModuleFunc(); } ME1 |= (UTXE0 | URXE0); // USART0 UART module enable } async command void Usart.disableUart() { atomic { ME1 &= ~(UTXE0 | URXE0); // USART0 UART module enable call UTXD.selectIOFunc(); call URXD.selectIOFunc(); } } async command void Usart.enableUartTx() { call UTXD.selectModuleFunc(); ME1 |= UTXE0; // USART0 UART Tx module enable } async command void Usart.disableUartTx() { ME1 &= ~UTXE0; // USART0 UART Tx module enable call UTXD.selectIOFunc(); } async command void Usart.enableUartRx() { call URXD.selectModuleFunc(); ME1 |= URXE0; // USART0 UART Rx module enable } async command void Usart.disableUartRx() { ME1 &= ~URXE0; // USART0 UART Rx module disable call URXD.selectIOFunc(); } async command void Usart.enableSpi() { atomic { call SIMO.selectModuleFunc(); call SOMI.selectModuleFunc(); call UCLK.selectModuleFunc(); } ME1 |= USPIE0; // USART0 SPI module enable } async command void Usart.disableSpi() { atomic { ME1 &= ~USPIE0; // USART0 SPI module disable call SIMO.selectIOFunc(); call SOMI.selectIOFunc(); call UCLK.selectIOFunc(); } } void configSpi(msp430_spi_union_config_t* config) { // U0CTL = (config->spiRegisters.uctl & ~I2C) | SYNC | SWRST; U0CTL = (config->spiRegisters.uctl) | SYNC | SWRST; U0TCTL = config->spiRegisters.utctl; call Usart.setUbr(config->spiRegisters.ubr); call Usart.setUmctl(0x00); } async command void Usart.setModeSpi(msp430_spi_union_config_t* config) { atomic { call Usart.resetUsart(TRUE); call HplI2C.clearModeI2C(); call Usart.disableUart(); configSpi(config); call Usart.enableSpi(); call Usart.resetUsart(FALSE); call Usart.clrIntr(); call Usart.disableIntr(); } return; } void configUart(msp430_uart_union_config_t* config) { U0CTL = (config->uartRegisters.uctl & ~SYNC) | SWRST; U0TCTL = config->uartRegisters.utctl; U0RCTL = config->uartRegisters.urctl; call Usart.setUbr(config->uartRegisters.ubr); call Usart.setUmctl(config->uartRegisters.umctl); } async command void Usart.setModeUart(msp430_uart_union_config_t* config) { atomic { call Usart.resetUsart(TRUE); call HplI2C.clearModeI2C(); call Usart.disableSpi(); configUart(config); if ((config->uartConfig.utxe == 1) && (config->uartConfig.urxe == 1)) { call Usart.enableUart(); } else if ((config->uartConfig.utxe == 0) && (config->uartConfig.urxe == 1)) { call Usart.disableUartTx(); call Usart.enableUartRx(); } else if ((config->uartConfig.utxe == 1) && (config->uartConfig.urxe == 0)){ call Usart.disableUartRx(); call Usart.enableUartTx(); } else { call Usart.disableUart(); } call Usart.resetUsart(FALSE); call Usart.clrIntr(); call Usart.disableIntr(); } return; } async command bool Usart.isTxIntrPending(){ if (IFG1 & UTXIFG0){ return TRUE; } return FALSE; } async command bool Usart.isTxEmpty(){ if (U0TCTL & TXEPT) { return TRUE; } return FALSE; } async command bool Usart.isRxIntrPending(){ if (IFG1 & URXIFG0){ return TRUE; } return FALSE; } async command void Usart.clrTxIntr(){ IFG1 &= ~UTXIFG0; } async command void Usart.clrRxIntr() { IFG1 &= ~URXIFG0; } async command void Usart.clrIntr() { IFG1 &= ~(UTXIFG0 | URXIFG0); } async command void Usart.disableRxIntr() { IE1 &= ~URXIE0; } async command void Usart.disableTxIntr() { IE1 &= ~UTXIE0; } async command void Usart.disableIntr() { IE1 &= ~(UTXIE0 | URXIE0); } async command void Usart.enableRxIntr() { atomic { IFG1 &= ~URXIFG0; IE1 |= URXIE0; } } async command void Usart.enableTxIntr() { atomic { IFG1 &= ~UTXIFG0; IE1 |= UTXIE0; } } async command void Usart.enableIntr() { atomic { IFG1 &= ~(UTXIFG0 | URXIFG0); IE1 |= (UTXIE0 | URXIE0); } } async command void Usart.tx(uint8_t data) { atomic U0TXBUF = data; } async command uint8_t Usart.rx() { uint8_t value; atomic value = U0RXBUF; return value; } default async event void I2CInterrupts.fired() { } default async command bool HplI2C.isI2C() { return FALSE; } default async command void HplI2C.clearModeI2C() { } default async event void Interrupts.rxDone( uint8_t data ) {} default async event void Interrupts.txDone() { } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/InternalFlashC.nc000066400000000000000000000071021207233610700255540ustar00rootroot00000000000000// $Id: InternalFlashC.nc,v 1.1 2010/12/17 14:24:28 mgh Exp $ /* tab:4 * * * "Copyright (c) 2000-2004 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * */ /** * InternalFlashC.nc - Internal flash implementation for telos msp * platform. On the msp, the flash must first be erased before a value * can be written. However, the msp can only erase the flash at a * segment granularity (128 bytes for the information section). This * module allows transparent read/write of individual bytes to the * information section by dynamically switching between the two * provided segments in the information section. * * Valid address range is 0x1000 - 0x107E (0x107F is used to store the * version number of the information segment). * * @author Jonathan Hui * */ module InternalFlashC { provides interface InternalFlash; } implementation { enum { IFLASH_BOUND_HIGH = 0x7e, IFLASH_OFFSET = 0x1000, IFLASH_SIZE = 128, IFLASH_SEG0_VNUM_ADDR = 0x107f, IFLASH_SEG1_VNUM_ADDR = 0x10ff, IFLASH_INVALID_VNUM = -1, }; uint8_t chooseSegment() { int8_t vnum0 = *(int8_t*)IFLASH_SEG0_VNUM_ADDR; int8_t vnum1 = *(int8_t*)IFLASH_SEG1_VNUM_ADDR; if (vnum0 == IFLASH_INVALID_VNUM) return 1; else if (vnum1 == IFLASH_INVALID_VNUM) return 0; return ( (int8_t)(vnum0 - vnum1) < 0 ); } command error_t InternalFlash.write(void* addr, void* buf, uint16_t size) { volatile int8_t *newPtr; int8_t *oldPtr; int8_t *bufPtr = (int8_t*)buf; int8_t version; uint16_t i; if (IFLASH_BOUND_HIGH + 2 < (uint16_t)addr + size) return FAIL; addr += IFLASH_OFFSET; newPtr = oldPtr = (int8_t*)IFLASH_OFFSET; if (chooseSegment()) { oldPtr += IFLASH_SIZE; } else { addr += IFLASH_SIZE; newPtr += IFLASH_SIZE; } atomic { FCTL2 = FWKEY + FSSEL1 + FN2; FCTL3 = FWKEY; FCTL1 = FWKEY + ERASE; *newPtr = 0; FCTL1 = FWKEY + WRT; for ( i = 0; i < IFLASH_SIZE-1; i++, newPtr++, oldPtr++ ) { if ((uint16_t)newPtr < (uint16_t)addr || (uint16_t)addr+size <= (uint16_t)newPtr) *newPtr = *oldPtr; else *newPtr = *bufPtr++; } version = *oldPtr + 1; if (version == IFLASH_INVALID_VNUM) version++; *newPtr = version; FCTL1 = FWKEY; FCTL3 = FWKEY + LOCK; } return SUCCESS; } command error_t InternalFlash.read(void* addr, void* buf, uint16_t size) { addr += IFLASH_OFFSET; if (chooseSegment()) addr += IFLASH_SIZE; memcpy(buf, addr, size); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/Msp430I2CC.nc000066400000000000000000000047671207233610700243240ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2012-01-31 19:41:08 $ */ #include #include "msp430usart.h" generic configuration Msp430I2CC() { provides interface Resource; provides interface ResourceRequested; provides interface I2CPacket as I2CBasicAddr; provides interface Init as I2CInit; uses interface Msp430I2CConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_I2CO_BUS ), }; components Msp430I2C0P as I2CP; Resource = I2CP.Resource[ CLIENT_ID ]; I2CBasicAddr = I2CP.I2CBasicAddr; I2CInit = I2CP.I2CInit; Msp430I2CConfigure = I2CP.Msp430I2CConfigure[ CLIENT_ID ]; components new Msp430Usart0C() as UsartC; ResourceRequested = UsartC; I2CP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; I2CP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; I2CP.I2CInterrupts -> UsartC.HplMsp430I2CInterrupts; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/Msp430I2CP.nc000066400000000000000000000160571207233610700243340ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.6 $ $Date: 2012-05-25 19:29:48 $ */ #include module Msp430I2CP { provides interface I2CPacket as I2CBasicAddr; provides interface Init as I2CInit; uses interface HplMsp430I2C as HplI2C; uses interface HplMsp430I2CInterrupts as I2CInterrupts; } implementation { #ifndef I2CDR_ #define I2CDR I2CDRW #endif MSP430REG_NORACE(I2CIE); enum { OFF = 1, IDLE, PACKET_WRITE, PACKET_READ }; norace uint8_t stateI2C = IDLE; uint8_t length; uint8_t ptr; norace error_t result; uint8_t * data; command error_t I2CInit.init() { atomic stateI2C = IDLE; return SUCCESS; } task void readDone() { // variables protected from change by the stateI2C state machine error_t _result; uint8_t _length; uint8_t* _data; uint16_t _addr; _result = result; _length = length; _data = data; _addr = I2CSA; atomic stateI2C = IDLE; signal I2CBasicAddr.readDone(_result, _addr, _length, _data); } task void writeDone() { // variables protected from change by the stateI2C state machine error_t _result; uint8_t _length; uint8_t* _data; uint16_t _addr; _result = result; _length = length; _data = data; _addr = I2CSA; // wait for the module to finish its transmission // spin only lasts ~4bit times == 4us. while (I2CDCTL & I2CBUSY) nop(); atomic stateI2C = IDLE; signal I2CBasicAddr.writeDone(_result, _addr, _length, _data); } async command error_t I2CBasicAddr.read( i2c_flags_t flags, uint16_t _addr, uint8_t _length, uint8_t* _data ) { uint8_t _state; atomic { _state = stateI2C; if (_state == IDLE) { stateI2C = PACKET_READ; } } if (_state == IDLE) { // perform register modifications with interrupts disabled // to maintain consistent state atomic { result = FAIL; // disable I2C to set the registers U0CTL &= ~I2CEN; I2CSA = _addr; length = _length; data = _data; ptr = 0; U0CTL |= MST; I2CNDAT = _length; // enable I2C module U0CTL |= I2CEN; // set receive mode I2CTCTL &= ~I2CTRX; // get an event if the receiver does not ACK I2CIE = RXRDYIE | NACKIE; I2CIFG = 0; // start condition and stop condition need to be sent I2CTCTL |= (I2CSTP | I2CSTT); } return SUCCESS; } return FAIL; } // handle the interrupt within this component void localRxData() { uint16_t* _data16 = (uint16_t*)data; if (stateI2C != PACKET_READ) return; // figure out where we are in the transmission // should only occur when I2CNDAT > 0 if (I2CTCTL & I2CWORD) { _data16[(int)ptr >> 1] = I2CDR; ptr = ptr + 2; } else { data[(int)ptr] = I2CDR & 0xFF; ptr++; } // I2CIFG = 0; if (ptr == length) { I2CIE &= ~RXRDYIE; result = SUCCESS; if (!post readDone()) stateI2C = IDLE; } } async command error_t I2CBasicAddr.write( i2c_flags_t flags, uint16_t _addr, uint8_t _length, uint8_t* _data ) { uint8_t _state; _state = stateI2C; if (_state == IDLE) { stateI2C = PACKET_WRITE; } if (_state == IDLE) { // perform register modifications with interrupts disabled atomic { // disable I2C to set the registers result = FAIL; U0CTL &= ~I2CEN; I2CSA = _addr; length = _length; data = _data; ptr = 0; U0CTL |= MST; I2CNDAT = _length; // enable I2C module U0CTL |= I2CEN; // set transmit mode I2CTCTL |= I2CTRX; // get an event if the receiver does not ACK I2CIE = TXRDYIE | NACKIE; I2CIFG = 0; // start condition and stop condition need to be sent I2CTCTL |= (I2CSTP | I2CSTT); } return SUCCESS; } return FAIL; } // handle the interrupt within this component void localTxData() { uint16_t* _data16 = (uint16_t*)data; if (stateI2C != PACKET_WRITE) return; // figure out where we are in the transmission // should only occur when I2CNDAT > 0 if (I2CTCTL & I2CWORD) { I2CDR = _data16[(int)ptr >> 1]; ptr = ptr + 2; } else { I2CDR = data[(int)ptr]; ptr++; } // I2CIFG = 0; if (ptr == length) { I2CIE &= ~TXRDYIE; result = SUCCESS; if (!post writeDone()) stateI2C = IDLE; } } void localNoAck() { if ((stateI2C != PACKET_WRITE) && (stateI2C != PACKET_READ)) return; I2CNDAT = 0; I2CIE = 0; // issue a stop command to clear the bus if it has not been stopped if (I2CDCTL & I2CBB) I2CTCTL |= I2CSTP; if (stateI2C == PACKET_WRITE) { if (!post writeDone()) stateI2C = IDLE; } else if (stateI2C == PACKET_READ) { if (!post readDone()) stateI2C = IDLE; } } async event void I2CInterrupts.fired() { volatile uint16_t value = I2CIV; switch (value) { case 0x0000: break; case 0x0002: localNoAck(); call HplI2C.isArbitrationLostPending(); break; case 0x0004: localNoAck(); call HplI2C.isNoAckPending(); break; case 0x0006: call HplI2C.isOwnAddressPending(); break; case 0x0008: call HplI2C.isAccessReadyPending(); break; case 0x000A: localRxData(); break; case 0x000C: localTxData(); break; case 0x000E: call HplI2C.isGeneralCallPending(); break; case 0x0010: call HplI2C.isStartDetectPending(); break; } } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/PowerSupplyMonitor.h000066400000000000000000000041471207233610700264350ustar00rootroot00000000000000/* * Copyright (c) 2007, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date March, 2007 * * enum to set svs thresholds, presumably more meaningful than "vld_n"? */ // as in 1.9v, 2.1v, etc. enum { OFF, ONE_9V = VLD0, TWO_1V = VLD1, TWO_2V = VLD1 | VLD0, TWO_3V = VLD2, TWO_4V = VLD2 | VLD0, TWO_5V = VLD2 | VLD1, TWO_65V = VLD2 | VLD1 | VLD0, TWO_8V = VLD3, TWO_9V = VLD3 | VLD0, THREE_05V = VLD3 | VLD1, THREE_2V = VLD3 | VLD1 | VLD0, THREE_35V = VLD3 | VLD2, THREE_5V = VLD3 | VLD2 | VLD0, THREE_7V = VLD3 | VLD2 | VLD1, EXTERNAL = VLD3 | VLD2 | VLD1 | VLD0 }; tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/PowerSupplyMonitor.nc000066400000000000000000000044521207233610700266050ustar00rootroot00000000000000/* * Copyright (c) 2007, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date March, 2007 * * simple interface to msp430 supply voltage supervisor register */ interface PowerSupplyMonitor{ command void resetOnLowVoltage(bool reset); /* enum in PowerSupplyVoltage.h */ command void setVoltageThreshold(uint8_t threshold); /* polling for low voltage condtion */ command void setMonitorInterval(uint32_t interval_ms); command void stopVoltageMonitor(); command error_t isSupplyMonitorEnabled(); /* manual query */ command error_t queryLowVoltageCondition(); /* flag is immediately reset unless power problem is remedied */ command void clearLowVoltageCondition(); command void disable(); /* triggered by polling mechanism */ event void voltageThresholdReached(uint8_t t); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/PowerSupplyMonitorC.nc000066400000000000000000000037731207233610700267150ustar00rootroot00000000000000/* * Copyright (c) 2007, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Author: Steve Ayer * March, 2007 */ configuration PowerSupplyMonitorC { provides { interface Init; interface StdControl; interface PowerSupplyMonitor; } } implementation { components PowerSupplyMonitorP, new TimerMilliC() as Timer, LedsC; Init = PowerSupplyMonitorP; StdControl = PowerSupplyMonitorP; PowerSupplyMonitor = PowerSupplyMonitorP; PowerSupplyMonitorP.Timer -> Timer; PowerSupplyMonitorP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/PowerSupplyMonitorP.nc000066400000000000000000000112011207233610700267130ustar00rootroot00000000000000/* * Copyright (c) 2007, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date March, 2007 * * support for interface to msp430 SVSCTL functionality */ //#include "PowerSupplyMonitor.h" module PowerSupplyMonitorP { provides { interface Init; interface StdControl; interface PowerSupplyMonitor; } uses{ interface Timer as Timer; interface Leds; } } implementation { uint8_t threshold; uint32_t monitor_interval; bool started, spurious_check; /* * sets svs to first voltage level beneath regulator (2.9v), * no reset, 15 minute polling */ void init() { threshold = THREE_2V; monitor_interval = 900000; SVSCTL = 0; // CLR_FLAG(SVSCTL, 0xff); } /* turns on svs to highest voltage level (3.7v), no reset */ command error_t Init.init(){ started = FALSE; spurious_check = FALSE; init(); return SUCCESS; } command error_t StdControl.start(){ CLR_FLAG(SVSCTL, EXTERNAL); SET_FLAG(SVSCTL, threshold); started = TRUE; call Timer.startPeriodic(monitor_interval); return SUCCESS; } command error_t StdControl.stop(){ call PowerSupplyMonitor.disable(); started = FALSE; return SUCCESS; } task void spurious_test(){ call Timer.stop(); started = FALSE; atomic{ CLR_FLAG(SVSCTL, EXTERNAL); // set vld to zero to stop detection CLR_FLAG(SVSCTL, SVSFG); } spurious_check = TRUE; call Timer.startOneShot(5000); } task void recheck(){ spurious_check = FALSE; SET_FLAG(SVSCTL, threshold); // set vld back to threshold, restart detection TOSH_uwait(1000); // wait for svs to settle back down (max time ~ 50us, but hey) atomic if(READ_FLAG(SVSCTL, SVSFG)){ CLR_FLAG(SVSCTL, threshold); // set vld back to threshold, restart detection signal PowerSupplyMonitor.voltageThresholdReached(threshold); } } event void Timer.fired(){ if(spurious_check) post recheck(); else{ atomic if(READ_FLAG(SVSCTL, SVSFG)) post spurious_test(); } } command void PowerSupplyMonitor.resetOnLowVoltage(bool reset){ if(reset) SET_FLAG(SVSCTL, PORON); else CLR_FLAG(SVSCTL, PORON); } /* enum in PowerSupplyVoltage.h for this */ command void PowerSupplyMonitor.setVoltageThreshold(uint8_t t){ threshold = t; if(started){ CLR_FLAG(SVSCTL, EXTERNAL); SET_FLAG(SVSCTL, t); } } command error_t PowerSupplyMonitor.isSupplyMonitorEnabled(){ return READ_FLAG(SVSCTL, SVSON); } command error_t PowerSupplyMonitor.queryLowVoltageCondition(){ return READ_FLAG(SVSCTL, SVSFG); } command void PowerSupplyMonitor.setMonitorInterval(uint32_t interval_ms){ monitor_interval = interval_ms; if(started){ call Timer.stop(); call Timer.startPeriodic(monitor_interval); } } command void PowerSupplyMonitor.clearLowVoltageCondition(){ CLR_FLAG(SVSCTL, SVSFG); } command void PowerSupplyMonitor.stopVoltageMonitor() { call Timer.stop(); } command void PowerSupplyMonitor.disable(){ CLR_FLAG(SVSCTL, 0xf0); started = FALSE; call Timer.stop(); } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/msp430hardware.h000066400000000000000000000403221207233610700253130ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // @author Vlado Handziski // @author Joe Polastre // @author Cory Sharp #ifndef _H_msp430hardware_h #define _H_msp430hardware_h #if defined(__MSPGCC__) /* mspgcc */ #include #include #else /* __MSPGCC__ */ /* old mspgcc3, forked mspgcc4 */ #include #include #endif /* __MSPGCC__ */ #include "msp430regtypes.h" #include "Msp430DcoSpec.h" #ifdef __MSP430_TI_HEADERS__ /* TI's msp430 headers define FAIL to be 0x80 in the flash module. * I'd prefer that it match the value assigned to it in the * TinyError.h. */ #undef FAIL /* Accommodate old gcc alias */ #define MC_STOP MC__STOP /* Port registers in MSP430 chips have two naming conventions: by * number (e.g., P1IN), and by letter (e.g. PAIN). The numeric-named * registers provide 8-bit values, while the alpha-named registers * provide 16-bit values. * * The headers for certain chips define numeric-named registers. * * In a very few cases, both numeric-named and alpha-named registers * are defined. By inspection, this occurs only for PAIN, which * combines P7IN (at the address of PAIN) and P8IN (at 1+&PAIN); and * for PBIN, which combines P9IN (at the address of PBIN) and P10IN * (at 1+&PBIN). * * In more recent chips, only alpha-named registers are provided. * Since the current TinyOS MSP430 port interface assumes 8-bit * registers, by convention we map numeric-named registers to the * alpha-named registers beginning with PAIN==P1IN. */ #if defined(__MSP430_HAS_PORTA__) || defined(__MSP430_HAS_PORTA_R__) #if (! defined(P1IN_)) && (defined(__MSP430_HAS_PORT1__) || defined(__MSP430_HAS_PORT1_R__)) #define P1IN_ (uint16_t)(PAIN_) #define P1OUT_ (uint16_t)(PAOUT_) #define P1DIR_ (uint16_t)(PADIR_) #define P1SEL_ (uint16_t)(PASEL_) #if defined(__MSP430_HAS_PORT1_R__) #define P1REN_ (uint16_t)(PAREN_) #endif /* __MSP430_HAS_PORT1_R__ */ #endif /* __MSP430_HAS_PORT1__ */ #if (! defined(P2IN_)) && (defined(__MSP430_HAS_PORT2__) || defined(__MSP430_HAS_PORT2_R__)) #define P2IN_ (uint16_t)(PAIN_+1) #define P2OUT_ (uint16_t)(PAOUT_+1) #define P2DIR_ (uint16_t)(PADIR_+1) #define P2SEL_ (uint16_t)(PASEL_+1) #if defined(__MSP430_HAS_PORT2_R__) #define P2REN_ (uint16_t)(PAREN_+1) #endif /* __MSP430_HAS_PORT2_R__ */ #endif /* __MSP430_HAS_PORT2__ */ #endif /* __MSP430_HAS_PORTA__ */ #if defined(__MSP430_HAS_PORTB__) || defined(__MSP430_HAS_PORTB_R__) #if (! defined(P3IN_)) && (defined(__MSP430_HAS_PORT3__) || defined(__MSP430_HAS_PORT3_R__)) #define P3IN_ (uint16_t)(PBIN_) #define P3OUT_ (uint16_t)(PBOUT_) #define P3DIR_ (uint16_t)(PBDIR_) #define P3SEL_ (uint16_t)(PBSEL_) #if defined(__MSP430_HAS_PORT3_R__) #define P3REN_ (uint16_t)(PBREN_) #endif /* __MSP430_HAS_PORT3_R__ */ #endif /* __MSP430_HAS_PORT3__ */ #if (! defined(P4IN_)) && (defined(__MSP430_HAS_PORT4__) || defined(__MSP430_HAS_PORT4_R__)) #define P4IN_ (uint16_t)(PBIN_+1) #define P4OUT_ (uint16_t)(PBOUT_+1) #define P4DIR_ (uint16_t)(PBDIR_+1) #define P4SEL_ (uint16_t)(PBSEL_+1) #if defined(__MSP430_HAS_PORT4_R__) #define P4REN_ (uint16_t)(PBREN_+1) #endif /* __MSP430_HAS_PORT4_R__ */ #endif /* __MSP430_HAS_PORT4__ */ #endif /* __MSP430_HAS_PORTB__ */ #if defined(__MSP430_HAS_PORTC__) || defined(__MSP430_HAS_PORTC_R__) #if (! defined(P5IN_)) && (defined(__MSP430_HAS_PORT5__) || defined(__MSP430_HAS_PORT5_R__)) #define P5IN_ (uint16_t)(PCIN_) #define P5OUT_ (uint16_t)(PCOUT_) #define P5DIR_ (uint16_t)(PCDIR_) #define P5SEL_ (uint16_t)(PCSEL_) #if defined(__MSP430_HAS_PORT5_R__) #define P5REN_ (uint16_t)(PCREN_) #endif /* __MSP430_HAS_PORT5_R__ */ #endif /* __MSP430_HAS_PORT5__ */ #if (! defined(P6IN_)) && (defined(__MSP430_HAS_PORT6__) || defined(__MSP430_HAS_PORT6_R__)) #define P6IN_ (uint16_t)(PCIN_+1) #define P6OUT_ (uint16_t)(PCOUT_+1) #define P6DIR_ (uint16_t)(PCDIR_+1) #define P6SEL_ (uint16_t)(PCSEL_+1) #if defined(__MSP430_HAS_PORT6_R__) #define P6REN_ (uint16_t)(PCREN_+1) #endif /* __MSP430_HAS_PORT6_R__ */ #endif /* __MSP430_HAS_PORT6__ */ #endif /* __MSP430_HAS_PORTC__ */ #if defined(__MSP430_HAS_PORTD__) || defined(__MSP430_HAS_PORTD_R__) #if (! defined(P7IN_)) && (defined(__MSP430_HAS_PORT7__) || defined(__MSP430_HAS_PORT7_R__)) #define P7IN_ (uint16_t)(PDIN_) #define P7OUT_ (uint16_t)(PDOUT_) #define P7DIR_ (uint16_t)(PDDIR_) #define P7SEL_ (uint16_t)(PDSEL_) #if defined(__MSP430_HAS_PORT7_R__) #define P7REN_ (uint16_t)(PDREN_) #endif /* __MSP430_HAS_PORT7_R__ */ #endif /* __MSP430_HAS_PORT7__ */ #if (! defined(P8IN_)) && (defined(__MSP430_HAS_PORT8__) || defined(__MSP430_HAS_PORT8_R__)) #define P8IN_ (uint16_t)(PDIN_+1) #define P8OUT_ (uint16_t)(PDOUT_+1) #define P8DIR_ (uint16_t)(PDDIR_+1) #define P8SEL_ (uint16_t)(PDSEL_+1) #if defined(__MSP430_HAS_PORT8_R__) #define P8REN_ (uint16_t)(PDREN_+1) #endif /* __MSP430_HAS_PORT8_R__ */ #endif /* __MSP430_HAS_PORT8__ */ #endif /* __MSP430_HAS_PORTD__ */ #if defined(__MSP430_HAS_PORTE__) || defined(__MSP430_HAS_PORTE_R__) #if (! defined(P9IN_)) && (defined(__MSP430_HAS_PORT9__) || defined(__MSP430_HAS_PORT9_R__)) #define P9IN_ (uint16_t)(PEIN_) #define P9OUT_ (uint16_t)(PEOUT_) #define P9DIR_ (uint16_t)(PEDIR_) #define P9SEL_ (uint16_t)(PESEL_) #if defined(__MSP430_HAS_PORT9_R__) #define P9REN_ (uint16_t)(PEREN_) #endif /* __MSP430_HAS_PORT9_R__ */ #endif /* __MSP430_HAS_PORT9__ */ #if (! defined(P10IN_)) && (defined(__MSP430_HAS_PORT10__) || defined(__MSP430_HAS_PORT10_R__)) #define P10IN_ (uint16_t)(PEIN_+1) #define P10OUT_ (uint16_t)(PEOUT_+1) #define P10DIR_ (uint16_t)(PEDIR_+1) #define P10SEL_ (uint16_t)(PESEL_+1) #if defined(__MSP430_HAS_PORT10_R__) #define P10REN_ (uint16_t)(PEREN_+1) #endif /* __MSP430_HAS_PORT10_R__ */ #endif /* __MSP430_HAS_PORT10__ */ #endif /* __MSP430_HAS_PORTE__ */ #if defined(__MSP430_HAS_PORTF__) || defined(__MSP430_HAS_PORTF_R__) #if (! defined(P11IN_)) && (defined(__MSP430_HAS_PORT11__) || defined(__MSP430_HAS_PORT11_R__)) #define P11IN_ (uint16_t)(PFIN_) #define P11OUT_ (uint16_t)(PFOUT_) #define P11DIR_ (uint16_t)(PFDIR_) #define P11SEL_ (uint16_t)(PFSEL_) #if defined(__MSP430_HAS_PORT11_R__) #define P11REN_ (uint16_t)(PFREN_) #endif /* __MSP430_HAS_PORT11_R__ */ #endif /* __MSP430_HAS_PORT11__ */ #if (! defined(P12IN_)) && (defined(__MSP430_HAS_PORT12__) || defined(__MSP430_HAS_PORT12_R__)) #define P12IN_ (uint16_t)(PFIN_+1) #define P12OUT_ (uint16_t)(PFOUT_+1) #define P12DIR_ (uint16_t)(PFDIR_+1) #define P12SEL_ (uint16_t)(PFSEL_+1) #if defined(__MSP430_HAS_PORT12_R__) #define P12REN_ (uint16_t)(PFREN_+1) #endif /* __MSP430_HAS_PORT12_R__ */ #endif /* __MSP430_HAS_PORT12__ */ #endif /* __MSP430_HAS_PORTF__ */ #endif /* __MSP430_TI_HEADERS__ */ // CPU memory-mapped register access will cause nesc to issue race condition // warnings. Race conditions are a significant conern when accessing CPU // memory-mapped registers, because they can change even while interrupts // are disabled. This means that the standard nesc tools for resolving race // conditions, atomic statements that disable interrupt handling, do not // resolve CPU register race conditions. So, CPU registers access must be // treated seriously and carefully. // The macro MSP430REG_NORACE allows individual modules to internally // redeclare CPU registers as norace, eliminating nesc's race condition // warnings for their access. This macro should only be used after the // specific CPU register use has been verified safe and correct. Example // use: // // module MyLowLevelModule // { // // ... // } // implementation // { // MSP430REG_NORACE(TACCTL0); // // ... // } #undef norace #define MSP430REG_NORACE_EXPAND(type,name,addr) \ norace static volatile type name asm(#addr) #define MSP430REG_NORACE3(type,name,addr) \ MSP430REG_NORACE_EXPAND(type,name,addr) // MSP430REG_NORACE and MSP430REG_NORACE2 presume naming conventions among // type, name, and addr, which are defined in the local header // msp430regtypes.h and mspgcc's header io.h and its children. #define MSP430REG_NORACE2(rename,name) \ MSP430REG_NORACE3(TYPE_##name,rename,name##_) #define MSP430REG_NORACE(name) \ MSP430REG_NORACE3(TYPE_##name,name,name##_) // Avoid the type-punned pointer warnings from gcc 3.3, which are warning about // creating potentially broken object code. Union casts are the appropriate work // around. Unfortunately, they require a function definiton. #define DEFINE_UNION_CAST(func_name,to_type,from_type) \ to_type func_name(from_type x) @safe() { union {from_type f; to_type t;} c = {f:x}; return c.t; } // redefine ugly defines from msp-gcc #ifndef DONT_REDEFINE_SR_FLAGS #undef C #undef Z #undef N #undef V #undef GIE #undef CPUOFF #undef OSCOFF #undef SCG0 #undef SCG1 #undef LPM0_bits #undef LPM1_bits #undef LPM2_bits #undef LPM3_bits #undef LPM4_bits #define SR_C 0x0001 #define SR_Z 0x0002 #define SR_N 0x0004 #define SR_V 0x0100 #define SR_GIE 0x0008 #define SR_CPUOFF 0x0010 #define SR_OSCOFF 0x0020 #define SR_SCG0 0x0040 #define SR_SCG1 0x0080 #define LPM0_bits SR_CPUOFF #define LPM1_bits SR_SCG0+SR_CPUOFF #define LPM2_bits SR_SCG1+SR_CPUOFF #define LPM3_bits SR_SCG1+SR_SCG0+SR_CPUOFF #define LPM4_bits SR_SCG1+SR_SCG0+SR_OSCOFF+SR_CPUOFF #endif//DONT_REDEFINE_SR_FLAGS #ifdef interrupt #undef interrupt #endif #ifdef wakeup #undef wakeup #endif #ifdef signal #undef signal #endif // Re-definitions for safe tinyOS // These rely on io.h being included at the top of this file // thus pulling the affected header files before the re-definitions #ifdef SAFE_TINYOS #undef ADC12MEM #define ADC12MEM TCAST(int* ONE, ADC12MEM_) /* ADC12 Conversion Memory (for C) */ #undef ADC12MCTL #define ADC12MCTL TCAST(char * ONE, ADC12MCTL_) #endif // define platform constants that can be changed for different compilers // these are all msp430-gcc specific (add as necessary) #ifdef __msp430_headers_adc10_h #define __msp430_have_adc10 #endif #ifdef __msp430_headers_adc12_h #define __msp430_have_adc12 #endif // backwards compatibility to older versions of the header files #ifdef __MSP430_HAS_I2C__ #define __msp430_have_usart0_with_i2c #endif // I2CBusy flag is not defined by current MSP430-GCC #ifdef __msp430_have_usart0_with_i2c #ifndef I2CBUSY #define I2CBUSY (0x01 << 5) #endif MSP430REG_NORACE2(U0CTLnr,U0CTL); MSP430REG_NORACE2(I2CTCTLnr,I2CTCTL); MSP430REG_NORACE2(I2CDCTLnr,I2CDCTL); #endif // The signal attribute has opposite meaning in msp430-gcc than in avr-gcc #define TOSH_SIGNAL(signame) \ void sig_##signame() __attribute__((interrupt (signame), wakeup)) @C() // TOSH_INTERRUPT allows nested interrupts #define TOSH_INTERRUPT(signame) \ void isr_##signame() __attribute__((interrupt (signame), signal, wakeup)) @C() inline void TOSH_wait(void) { nop(); nop(); } // #define TOSH_CYCLE_TIME_NS 250 // Our worst case is 250 ns = 1 cycle. inline void TOSH_wait_250ns(void) { nop(); } /* Following the suggestion of the mspgcc.sourceforge.net site for an intelligent pause routine */ void brief_pause(register unsigned int n) { asm volatile( "1: \n\t" "dec %0 \n\t" "jne 1b\n\t" : "+r" (n)); } #define TOSH_uwait(n) brief_pause((((unsigned long long)n) * TARGET_DCO_KHZ * 1024 / 1000000 - 2) / 3) #define SET_FLAG(port, flag) ((port) |= (flag)) #define CLR_FLAG(port, flag) ((port) &= ~(flag)) #define READ_FLAG(port, flag) ((port) & (flag)) // TOSH_ASSIGN_PIN creates functions that are effectively marked as // "norace". This means race conditions that result from their use will not // be detectde by nesc. #define TOSH_ASSIGN_PIN_HEX(name, port, hex) \ void TOSH_SET_##name##_PIN() @safe() { MSP430REG_NORACE2(r,P##port##OUT); r |= hex; } \ void TOSH_CLR_##name##_PIN() @safe() { MSP430REG_NORACE2(r,P##port##OUT); r &= ~hex; } \ void TOSH_TOGGLE_##name##_PIN() @safe(){ MSP430REG_NORACE2(r,P##port##OUT); r ^= hex; } \ uint8_t TOSH_READ_##name##_PIN() @safe() { MSP430REG_NORACE2(r,P##port##IN); return (r & hex); } \ void TOSH_MAKE_##name##_OUTPUT() @safe() { MSP430REG_NORACE2(r,P##port##DIR); r |= hex; } \ void TOSH_MAKE_##name##_INPUT() @safe() { MSP430REG_NORACE2(r,P##port##DIR); r &= ~hex; } \ void TOSH_SEL_##name##_MODFUNC() @safe() { MSP430REG_NORACE2(r,P##port##SEL); r |= hex; } \ void TOSH_SEL_##name##_IOFUNC() @safe() { MSP430REG_NORACE2(r,P##port##SEL); r &= ~hex; } #define TOSH_ASSIGN_PIN(name, port, bit) \ TOSH_ASSIGN_PIN_HEX(name,port,(1<<(bit))) typedef uint8_t mcu_power_t @combine("mcombine"); mcu_power_t mcombine(mcu_power_t m1, mcu_power_t m2) @safe() { return (m1 < m2) ? m1: m2; } enum { MSP430_POWER_ACTIVE = 0, MSP430_POWER_LPM0 = 1, MSP430_POWER_LPM1 = 2, MSP430_POWER_LPM2 = 3, MSP430_POWER_LPM3 = 4, MSP430_POWER_LPM4 = 5 }; void __nesc_disable_interrupt(void) @safe() { dint(); nop(); } void __nesc_enable_interrupt(void) @safe() { eint(); } typedef bool __nesc_atomic_t; __nesc_atomic_t __nesc_atomic_start(void); void __nesc_atomic_end(__nesc_atomic_t reenable_interrupts); #ifndef NESC_BUILD_BINARY /* @spontaneous() functions should not be included when NESC_BUILD_BINARY is #defined, to avoid duplicate functions definitions when binary components are used. Such functions do need a prototype in all cases, though. */ __nesc_atomic_t __nesc_atomic_start(void) @spontaneous() @safe() { __nesc_atomic_t result = ((READ_SR & SR_GIE) != 0); __nesc_disable_interrupt(); asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ return result; } void __nesc_atomic_end(__nesc_atomic_t reenable_interrupts) @spontaneous() @safe() { asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ if( reenable_interrupts ) __nesc_enable_interrupt(); } #endif /* Floating-point network-type support. These functions must convert to/from a 32-bit big-endian integer that follows the layout of Java's java.lang.float.floatToRawIntBits method. Conveniently, for the MSP430 family, this is a straight byte copy... */ typedef float nx_float __attribute__((nx_base_be(afloat))); inline float __nesc_ntoh_afloat(const void *COUNT(sizeof(float)) source) @safe() { float f; memcpy(&f, source, sizeof(float)); return f; } inline float __nesc_hton_afloat(void *COUNT(sizeof(float)) target, float value) @safe() { memcpy(target, &value, sizeof(float)); return value; } /* Support for chips with configurable resistors on digital inputs. These * are denoted with __MSP430_HAS_PORT1_R__ and similar defines. */ enum { MSP430_PORT_RESISTOR_INVALID, /**< Hardware does not support resistor control, or pin is output */ MSP430_PORT_RESISTOR_OFF, /**< Resistor disabled */ MSP430_PORT_RESISTOR_PULLDOWN, /**< Pulldown resistor enabled */ MSP430_PORT_RESISTOR_PULLUP, /**< Pullup resistor enabled */ }; #endif//_H_msp430hardware_h tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/msp430/msp430usart.h000066400000000000000000000275331207233610700246650ustar00rootroot00000000000000/* * Copyright (c) 2004-2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Vlado Handziski * @author Philipp Huppertz */ #ifndef _H_Msp430Usart_h #define _H_Msp430Usart_h #define MSP430_HPLUSART0_RESOURCE "Msp430Usart0.Resource" #define MSP430_SPIO_BUS "Msp430Spi0.Resource" #define MSP430_UARTO_BUS "Msp430Uart0.Resource" #define MSP430_I2CO_BUS "Msp430I2C0.Resource" #define MSP430_HPLUSART1_RESOURCE "Msp430Usart1.Resource" #define MSP430_SPI1_BUS "Msp430Spi1.Resource" #define MSP430_UART1_BUS "Msp430Uart1.Resource" typedef enum { USART_NONE = 0, USART_UART = 1, USART_UART_TX = 2, USART_UART_RX = 3, USART_SPI = 4, USART_I2C = 5 } msp430_usartmode_t; typedef struct { unsigned int swrst: 1; //Software reset (0=operational; 1=reset) unsigned int mm: 1; //Multiprocessor mode (0=idle-line protocol; 1=address-bit protocol) unsigned int sync: 1; //Synchronous mode (0=UART; 1=SPI/I2C) unsigned int listen: 1; //Listen enable (0=disabled; 1=enabled, feed tx back to receiver) unsigned int clen: 1; //Character length (0=7-bit data; 1=8-bit data) unsigned int spb: 1; //Stop bits (0=one stop bit; 1=two stop bits) unsigned int pev: 1; //Parity select (0=odd; 1=even) unsigned int pena: 1; //Parity enable (0=disabled; 1=enabled) } __attribute__ ((packed)) msp430_uctl_t ; typedef struct { unsigned int txept:1; //Transmitter empty (0=busy; 1=TX buffer empty or SWRST=1) unsigned int stc:1; //Slave transmit (0=4-pin SPI && STE enabled; 1=3-pin SPI && STE disabled) unsigned int txwake: 1; //Transmiter wake (0=next char is data; 1=next char is address) unsigned int urxse: 1; //Receive start-edge detection (0=disabled; 1=enabled) unsigned int ssel: 2; //Clock source (00=UCLKI; 01=ACLK; 10=SMCLK; 11=SMCLK) unsigned int ckpl: 1; //Clock polarity (0=normal; 1=inverted) unsigned int ckph:1; //Clock phase (0=normal; 1=half-cycle delayed) } __attribute__ ((packed)) msp430_utctl_t; typedef struct { unsigned int rxerr: 1; //Receive error (0=no errors; 1=error detected) unsigned int rxwake: 1; //Receive wake-up (0=received data; 1=received an address) unsigned int urxwie: 1; //Wake-up interrupt-enable (0=all characters set URXIFGx; 1=only address sets URXIFGx) unsigned int urxeie: 1; //Erroneous-character receive (0=rejected; 1=recieved and URXIFGx set) unsigned int brk:1; //Break detect (0=no break; 1=break occured) unsigned int oe:1; //Overrun error (0=no error; 1=overrun error) unsigned int pe:1; //Parity error (0=no error; 1=parity error) unsigned int fe:1; //Framing error (0=no error; 1=low stop bit) } __attribute__ ((packed)) msp430_urctl_t; DEFINE_UNION_CAST(uctl2int,uint8_t,msp430_uctl_t) DEFINE_UNION_CAST(int2uctl,msp430_uctl_t,uint8_t) DEFINE_UNION_CAST(utctl2int,uint8_t,msp430_utctl_t) DEFINE_UNION_CAST(int2utctl,msp430_utctl_t,uint8_t) DEFINE_UNION_CAST(urctl2int,uint8_t,msp430_urctl_t) DEFINE_UNION_CAST(int2urctl,msp430_urctl_t,uint8_t) typedef struct { unsigned int ubr: 16; //Clock division factor (>=0x0002) unsigned int :1; unsigned int mm: 1; //Master mode (0=slave; 1=master) unsigned int :1; unsigned int listen: 1; //Listen enable (0=disabled; 1=enabled, feed tx back to receiver) unsigned int clen: 1; //Character length (0=7-bit data; 1=8-bit data) unsigned int: 3; unsigned int:1; unsigned int stc: 1; //Slave transmit (0=4-pin SPI && STE enabled; 1=3-pin SPI && STE disabled) unsigned int:2; unsigned int ssel: 2; //Clock source (00=external UCLK [slave]; 01=ACLK [master]; 10=SMCLK [master] 11=SMCLK [master]); unsigned int ckpl: 1; //Clock polarity (0=inactive is low && data at rising edge; 1=inverted) unsigned int ckph: 1; //Clock phase (0=normal; 1=half-cycle delayed) unsigned int :0; } msp430_spi_config_t; typedef struct { uint16_t ubr; uint8_t uctl; uint8_t utctl; } msp430_spi_registers_t; typedef union { msp430_spi_config_t spiConfig; msp430_spi_registers_t spiRegisters; } msp430_spi_union_config_t; msp430_spi_union_config_t msp430_spi_default_config = { { ubr : 0x0002, ssel : 0x02, clen : 1, listen : 0, mm : 1, ckph : 1, ckpl : 0, stc : 1 } }; /** The calculations were performed using the msp-uart.pl script: msp-uart.pl -- calculates the uart registers for MSP430 Copyright (C) 2002 - Pedro Zorzenon Neto - pzn dot debian dot org **/ typedef enum { //32KHZ = 32,768 Hz, 1MHZ = 1,048,576 Hz UBR_32KHZ_1200=0x001B, UMCTL_32KHZ_1200=0x94, UBR_32KHZ_1800=0x0012, UMCTL_32KHZ_1800=0x84, UBR_32KHZ_2400=0x000D, UMCTL_32KHZ_2400=0x6D, UBR_32KHZ_4800=0x0006, UMCTL_32KHZ_4800=0x77, UBR_32KHZ_9600=0x0003, UMCTL_32KHZ_9600=0x29, // (Warning: triggers MSP430 errata US14) UBR_1MHZ_1200=0x0369, UMCTL_1MHZ_1200=0x7B, UBR_1MHZ_1800=0x0246, UMCTL_1MHZ_1800=0x55, UBR_1MHZ_2400=0x01B4, UMCTL_1MHZ_2400=0xDF, UBR_1MHZ_4800=0x00DA, UMCTL_1MHZ_4800=0xAA, UBR_1MHZ_9600=0x006D, UMCTL_1MHZ_9600=0x44, UBR_1MHZ_19200=0x0036, UMCTL_1MHZ_19200=0xB5, UBR_1MHZ_38400=0x001B, UMCTL_1MHZ_38400=0x94, UBR_1MHZ_57600=0x0012, UMCTL_1MHZ_57600=0x84, UBR_1MHZ_76800=0x000D, UMCTL_1MHZ_76800=0x6D, UBR_1MHZ_115200=0x0009, UMCTL_1MHZ_115200=0x10, UBR_1MHZ_230400=0x0004, UMCTL_1MHZ_230400=0x55, UBR_4MHZ_115200=0x0024, UMCTL_4MHZ_115200=0x29, } msp430_uart_rate_t; typedef struct { unsigned int ubr:16; //Baud rate (use enum msp430_uart_rate_t for predefined rates) unsigned int umctl: 8; //Modulation (use enum msp430_uart_rate_t for predefined rates) unsigned int :1; unsigned int mm: 1; //Multiprocessor mode (0=idle-line protocol; 1=address-bit protocol) unsigned int :1; unsigned int listen: 1; //Listen enable (0=disabled; 1=enabled, feed tx back to receiver) unsigned int clen: 1; //Character length (0=7-bit data; 1=8-bit data) unsigned int spb: 1; //Stop bits (0=one stop bit; 1=two stop bits) unsigned int pev: 1; //Parity select (0=odd; 1=even) unsigned int pena: 1; //Parity enable (0=disabled; 1=enabled) unsigned int :0; unsigned int :3; unsigned int urxse: 1; //Receive start-edge detection (0=disabled; 1=enabled) unsigned int ssel: 2; //Clock source (00=UCLKI; 01=ACLK; 10=SMCLK; 11=SMCLK) unsigned int ckpl: 1; //Clock polarity (0=normal; 1=inverted) unsigned int :1; unsigned int :2; unsigned int urxwie: 1; //Wake-up interrupt-enable (0=all characters set URXIFGx; 1=only address sets URXIFGx) unsigned int urxeie: 1; //Erroneous-character receive (0=rejected; 1=recieved and URXIFGx set) unsigned int :4; unsigned int :0; unsigned int utxe:1; // 1:enable tx module unsigned int urxe:1; // 1:enable rx module } msp430_uart_config_t; typedef struct { uint16_t ubr; uint8_t umctl; uint8_t uctl; uint8_t utctl; uint8_t urctl; uint8_t ume; } msp430_uart_registers_t; typedef union { msp430_uart_config_t uartConfig; msp430_uart_registers_t uartRegisters; } msp430_uart_union_config_t; msp430_uart_union_config_t msp430_uart_default_config = { { utxe : 1, urxe : 1, ubr : UBR_1MHZ_57600, umctl : UMCTL_1MHZ_57600, ssel : 0x02, pena : 0, pev : 0, spb : 0, clen : 1, listen : 0, mm : 0, ckpl : 0, urxse : 0, urxeie : 1, urxwie : 0, utxe : 1, urxe : 1 } }; typedef struct { unsigned int i2cstt: 1; // I2CSTT Bit 0 START bit. (0=No action; 1=Send START condition) unsigned int i2cstp: 1; // I2CSTP Bit 1 STOP bit. (0=No action; 1=Send STOP condition) unsigned int i2cstb: 1; // I2CSTB Bit 2 Start byte. (0=No action; 1=Send START condition and start byte (01h)) unsigned int i2cctrx: 1; //I2CTRX Bit 3 I2C transmit. (0=Receive mode; 1=Transmit mode) pin. unsigned int i2cssel: 2; // I2C clock source select. (00=No clock; 01=ACLK; 10=SMCLK; 11=SMCLK) unsigned int i2ccrm: 1; // I2C repeat mode unsigned int i2cword: 1; // I2C word mode. Selects byte(=0) or word(=1) mode for the I2C data register. } __attribute__ ((packed)) msp430_i2ctctl_t; DEFINE_UNION_CAST(i2ctctl2int,uint8_t,msp430_i2ctctl_t) DEFINE_UNION_CAST(int2i2ctctl,msp430_i2ctctl_t,uint8_t) typedef struct { unsigned int :1; unsigned int mst: 1; //Master mode (0=slave; 1=master) unsigned int :1; unsigned int listen: 1; //Listen enable (0=disabled; 1=enabled, feed tx back to receiver) unsigned int xa: 1; //Extended addressing (0=7-bit addressing; 1=8-bit addressing) unsigned int :1; unsigned int txdmaen: 1; //DMA to TX (0=disabled; 1=enabled) unsigned int rxdmaen: 1; //RX to DMA (0=disabled; 1=enabled) unsigned int :4; unsigned int i2cssel: 2; //Clock source (00=disabled; 01=ACLK; 10=SMCLK; 11=SMCLK) unsigned int i2crm: 1; //Repeat mode (0=use I2CNDAT; 1=count in software) unsigned int i2cword: 1; //Word mode (0=byte mode; 1=word mode) unsigned int i2cpsc: 8; //Clock prescaler (values >0x04 not recomended) unsigned int i2csclh: 8; //High period (high period=[value+2]*i2cpsc; can not be lower than 5*i2cpsc) unsigned int i2cscll: 8; //Low period (low period=[value+2]*i2cpsc; can not be lower than 5*i2cpsc) unsigned int i2coa : 10; // Own address register. unsigned int :6; } msp430_i2c_config_t; typedef struct { uint8_t uctl; uint8_t i2ctctl; uint8_t i2cpsc; uint8_t i2csclh; uint8_t i2cscll; uint16_t i2coa; } msp430_i2c_registers_t; typedef union { msp430_i2c_config_t i2cConfig; msp430_i2c_registers_t i2cRegisters; } msp430_i2c_union_config_t; msp430_i2c_union_config_t msp430_i2c_default_config = { { rxdmaen : 0, txdmaen : 0, xa : 0, listen : 0, mst : 1, i2cword : 0, i2crm : 1, i2cssel : 0x2, i2cpsc : 0, i2csclh : 0x3, i2cscll : 0x3, i2coa : 0, } }; typedef uint8_t uart_speed_t; typedef uint8_t uart_parity_t; typedef uint8_t uart_duplex_t; enum { TOS_UART_1200 = 0, TOS_UART_1800 = 1, TOS_UART_2400 = 2, TOS_UART_4800 = 3, TOS_UART_9600 = 4, TOS_UART_19200 = 5, TOS_UART_38400 = 6, TOS_UART_57600 = 7, TOS_UART_76800 = 8, TOS_UART_115200 = 9, TOS_UART_230400 = 10 }; enum { TOS_UART_OFF, TOS_UART_RONLY, TOS_UART_TONLY, TOS_UART_DUPLEX }; enum { TOS_UART_PARITY_NONE, TOS_UART_PARITY_EVEN, TOS_UART_PARITY_ODD }; #endif//_H_Msp430Usart_h tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/rmcm01/000077500000000000000000000000001207233610700224465ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/rmcm01/DigitalHeartRate.nc000066400000000000000000000037331207233610700261530ustar00rootroot00000000000000/* * Copyright (c) 2011, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date September, 2011 * */ interface DigitalHeartRate { // number_of_samples is the number of beats to use in rate calculation, max 256 command void enableRate(uint8_t number_of_samples); command void disableRate(); command error_t getRate(uint8_t * rate); async event void beat(uint32_t time_32k); event void newConnectionState(bool up); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/rmcm01/DigitalHeartRateC.nc000066400000000000000000000046751207233610700262640ustar00rootroot00000000000000/* * Copyright (c) 2011, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date January, 2011 * * this is a Notify wrapper for pulling heart rate from a Polar RMCM01 * module, which provides a positive digital pulse on the line connected * to GPIO_EXTERNAL on the anex board. */ configuration DigitalHeartRateC { provides{ interface Init; interface DigitalHeartRate; } } implementation { components Rmcm01P; Init = Rmcm01P; DigitalHeartRate = Rmcm01P; components HplMsp430InterruptP, HplMsp430GeneralIOC as GpioC; Rmcm01P.BeatInterrupt -> HplMsp430InterruptP.Port20; Rmcm01P.Msp430GeneralIO -> GpioC.Port20; components Counter32khz32C as Counter, new CounterToLocalTimeC(T32khz); CounterToLocalTimeC.Counter -> Counter; Rmcm01P.LocalTime -> CounterToLocalTimeC; components new TimerMilliC() as connectionTimer; Rmcm01P.connectionTimer -> connectionTimer; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/rmcm01/Rmcm01P.nc000066400000000000000000000117171207233610700241560ustar00rootroot00000000000000/* * Copyright (c) 2011, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date January, 2011 * * this is a Notify wrapper for pulling heart rate from a Polar RMCM01 * module, which provides a positive digital pulse on the line connected * to GPIO_EXTERNAL on the anex board. */ module Rmcm01P { provides{ interface Init; interface DigitalHeartRate; } uses{ interface HplMsp430Interrupt as BeatInterrupt; interface HplMsp430GeneralIO as Msp430GeneralIO; interface LocalTime; interface Timer as connectionTimer; } } implementation { enum { MAX_SAMPLES = 256 }; bool connected, beat_received; uint8_t calculate_rate, number_of_samples, current_beat; uint16_t beat_count; uint32_t beat_times[MAX_SAMPLES], now; command error_t Init.init() { TOSH_MAKE_ADC_0_INPUT(); TOSH_MAKE_ADC_7_INPUT(); // power hard-wired (at this writing) atomic { call Msp430GeneralIO.makeInput(); call Msp430GeneralIO.selectIOFunc(); call BeatInterrupt.disable(); call BeatInterrupt.edge(TRUE); call BeatInterrupt.clear(); call BeatInterrupt.enable(); } calculate_rate = FALSE; number_of_samples = 15; beat_count = 0; current_beat = 0; /* * assume that we're not connected until we see a beat * we'll check for a beat every three seconds */ connected = beat_received = FALSE; call connectionTimer.startPeriodic(3000); return SUCCESS; } command void DigitalHeartRate.enableRate(uint8_t num_samples) { atomic { number_of_samples = num_samples; calculate_rate = TRUE; beat_count = 0; } } command void DigitalHeartRate.disableRate() { atomic calculate_rate = FALSE; memset(beat_times, 0, MAX_SAMPLES * sizeof(uint32_t)); beat_count = 0; } command error_t DigitalHeartRate.getRate(uint8_t * rate){ uint32_t total, interval; register int16_t i, j; float f_rate; if(beat_count < number_of_samples) return FAIL; total = 0; j = current_beat - 1; for(i = 0; i < number_of_samples; i++, j--){ if(j < 0) j += MAX_SAMPLES; // ack; this just wraps the j - 1 counter interval = *(beat_times + j) - *(beat_times + (((j - 1) < 0) ? (j + MAX_SAMPLES - 1) : (j - 1))); total += interval; } // total is in seconds / 32768 total >>= 15; // there, that's better! f_rate = (float)((float)number_of_samples / (float)total * 60.0); *rate = (uint8_t)(f_rate + 0.5); return SUCCESS; } task void store_beat() { *(beat_times + current_beat) = now; if(current_beat == 255) current_beat = 0; else current_beat++; // we only need to to ensure we have enough beats for sample-size request if(beat_count < MAX_SAMPLES) beat_count++; } event void connectionTimer.fired() { if(beat_received) beat_received = FALSE; else if(connected){ call connectionTimer.stop(); connected = FALSE; signal DigitalHeartRate.newConnectionState(FALSE); } } async event void BeatInterrupt.fired() { now = call LocalTime.get(); signal DigitalHeartRate.beat(now); call BeatInterrupt.clear(); if(!connected){ connected = TRUE; call connectionTimer.startPeriodic(3000); signal DigitalHeartRate.newConnectionState(TRUE); } else beat_received = TRUE; if(calculate_rate) post store_beat(); } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/000077500000000000000000000000001207233610700217555ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/SD.h000066400000000000000000000144241207233610700224410ustar00rootroot00000000000000/* *********************************************************** * THIS PROGRAM IS PROVIDED "AS IS". TI MAKES NO WARRANTIES OR * REPRESENTATIONS, EITHER EXPRESS, IMPLIED OR STATUTORY, * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR * COMPLETENESS OF RESPONSES, RESULTS AND LACK OF NEGLIGENCE. * TI DISCLAIMS ANY WARRANTY OF TITLE, QUIET ENJOYMENT, QUIET * POSSESSION, AND NON-INFRINGEMENT OF ANY THIRD PARTY * INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE PROGRAM OR * YOUR USE OF THE PROGRAM. * * IN NO EVENT SHALL TI BE LIABLE FOR ANY SPECIAL, INCIDENTAL, * CONSEQUENTIAL OR INDIRECT DAMAGES, HOWEVER CAUSED, ON ANY * THEORY OF LIABILITY AND WHETHER OR NOT TI HAS BEEN ADVISED * OF THE POSSIBILITY OF SUCH DAMAGES, ARISING IN ANY WAY OUT * OF THIS AGREEMENT, THE PROGRAM, OR YOUR USE OF THE PROGRAM. * EXCLUDED DAMAGES INCLUDE, BUT ARE NOT LIMITED TO, COST OF * REMOVAL OR REINSTALLATION, COMPUTER TIME, LABOR COSTS, LOSS * OF GOODWILL, LOSS OF PROFITS, LOSS OF SAVINGS, OR LOSS OF * USE OR INTERRUPTION OF BUSINESS. IN NO EVENT WILL TI'S * AGGREGATE LIABILITY UNDER THIS AGREEMENT OR ARISING OUT OF * YOUR USE OF THE PROGRAM EXCEED FIVE HUNDRED DOLLARS * (U.S.$500). * * Unless otherwise stated, the Program written and copyrighted * by Texas Instruments is distributed as "freeware". You may, * only under TI's copyright in the Program, use and modify the * Program without any charge or restriction. You may * distribute to third parties, provided that you transfer a * copy of this license to the third party and the third party * agrees to these terms by its first use of the Program. You * must reproduce the copyright notice and any other legend of * ownership on each copy or partial copy, of the Program. * * You acknowledge and agree that the Program contains * copyrighted material, trade secrets and other TI proprietary * information and is protected by copyright laws, * international copyright treaties, and trade secret laws, as * well as other intellectual property laws. To protect TI's * rights in the Program, you agree not to decompile, reverse * engineer, disassemble or otherwise translate any object code * versions of the Program to a human-readable form. You agree * that in no event will you alter, remove or destroy any * copyright notice included in the Program. TI reserves all * rights not specifically granted under this license. Except * as specifically provided herein, nothing in this agreement * shall be construed as conferring by implication, estoppel, * or otherwise, upon you, any license or other right under any * TI patents, copyrights or trade secrets. * * You may not use the Program in non-TI devices. * ********************************************************* */ /* * Copyright (c) 2006, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * copied and edited from Texas Instruments sample code * * @author Steve Ayer * @date May 2006 */ #ifndef SD_H #define SD_H #define MMC_START_DATA_BLOCK_TOKEN 0xfe // Data token start byte, Start Single Block Read #define MMC_R1_RESPONSE 0x00 typedef uint8_t mmcerror_t; #define MMC_SUCCESS 0x00 #define MMC_BLOCK_SET_ERROR 0x01 #define MMC_RESPONSE_ERROR 0x02 #define MMC_DATA_TOKEN_ERROR 0x03 #define MMC_INIT_ERROR 0x04 #define MMC_CRC_ERROR 0x10 #define MMC_WRITE_ERROR 0x11 #define MMC_OTHER_ERROR 0x12 #define MMC_TIMEOUT_ERROR 0xFF #define MMC_GO_IDLE_STATE 0x40 //CMD0 #define MMC_SEND_OP_COND 0x41 //CMD1 #define MMC_READ_CSD 0x49 //CMD9 #define MMC_SEND_CID 0x4a //CMD10 #define MMC_STOP_TRANSMISSION 0x4c //CMD12 #define MMC_SEND_STATUS 0x4d //CMD13 #define MMC_SET_BLOCKLEN 0x50 //CMD16 Set block length for next read/write #define MMC_READ_SINGLE_BLOCK 0x51 //CMD17 Read block from memory #define MMC_READ_MULTIPLE_BLOCK 0x52 //CMD18 #define MMC_CMD_WRITEBLOCK 0x54 //CMD20 Write block to memory #define MMC_WRITE_BLOCK 0x58 //CMD24 #define MMC_WRITE_MULTIPLE_BLOCK 0x59 //CMD25 #define MMC_WRITE_CSD 0x5b //CMD27 PROGRAM_CSD #define MMC_SET_WRITE_PROT 0x5c //CMD28 #define MMC_CLR_WRITE_PROT 0x5d //CMD29 #define MMC_SEND_WRITE_PROT 0x5e //CMD30 #define MMC_TAG_SECTOR_START 0x60 //CMD32 #define MMC_TAG_SECTOR_END 0x61 //CMD33 #define MMC_UNTAG_SECTOR 0x62 //CMD34 #define MMC_TAG_EREASE_GROUP_START 0x63 //CMD35 #define MMC_TAG_EREASE_GROUP_END 0x64 //CMD36 #define MMC_UNTAG_EREASE_GROUP 0x65 //CMD37 #define MMC_EREASE 0x66 //CMD38 #define MMC_READ_OCR 0x67 //CMD39 #define MMC_CRC_ON_OFF 0x68 //CMD40 #endif tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/SD.nc000066400000000000000000000056571207233610700226220ustar00rootroot00000000000000/* * Copyright (c) 2006, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Interface for communciating with an SD card via a standard sd card slot. * * @author Steve Ayer * @author Konrad Lorincz * @date May 2006 */ #include "SD.h" interface SD { /** * Returns the card size in bytes. * * @return the card size in bytes. */ command uint32_t readCardSize(); /** * Reads 512 bytes from the SD at sector and copies it to bufferPtr * * @param sector the sector on the SD card (in multiples of 512 bytes). * @param bufferPtr pointer to where the SD will copy the data to. Must be 512 bytes. * @return SUCCESS if it was read successfully; FAIL otherwise */ command error_t readBlock(const uint32_t sector, uint8_t * buffer); /** * Writes 512 bytes from the bufferPtr to the SD card * * @param sector the sector on the SD card (in multiples of 512 bytes * where to write the data to). * @param bufferPtr pointer to data to be added. Must be 512 bytes. * @return SUCCESS if it was written successfully; FAIL otherwise */ command error_t writeBlock(const uint32_t sector, uint8_t * buffer); /** * the device has control over the sd card */ async event void available(); /** * the device has lost control of the sd and should cease * attempts to talk to the card */ async event void unavailable(); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/SDC.nc000066400000000000000000000042601207233610700227120ustar00rootroot00000000000000/** * Copyright (c) 2005 Hewlett-Packard Company * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of the Hewlett-Packard Company nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * communicate with a micro-sd slot wired to a telosb header */ /** * @author Steve Ayer * @date July 2006 * @date July 2009 (reworked, updated to maintained version) * @author Konrad Lorincz * @date March 25, 2008 - ported to TOS 2.x */ configuration SDC { provides { interface SD; interface StdControl; } } implementation { components SDP, new Msp430Usart0C(), HplMsp430InterruptP, LedsC; SD = SDP; StdControl = SDP; SDP.Usart -> Msp430Usart0C; SDP.DockInterrupt -> HplMsp430InterruptP.Port25; SDP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/SDP.nc000066400000000000000000000430501207233610700227270ustar00rootroot00000000000000/* *********************************************************** * THIS PROGRAM IS PROVIDED "AS IS". TI MAKES NO WARRANTIES OR * REPRESENTATIONS, EITHER EXPRESS, IMPLIED OR STATUTORY, * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR * COMPLETENESS OF RESPONSES, RESULTS AND LACK OF NEGLIGENCE. * TI DISCLAIMS ANY WARRANTY OF TITLE, QUIET ENJOYMENT, QUIET * POSSESSION, AND NON-INFRINGEMENT OF ANY THIRD PARTY * INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE PROGRAM OR * YOUR USE OF THE PROGRAM. * * IN NO EVENT SHALL TI BE LIABLE FOR ANY SPECIAL, INCIDENTAL, * CONSEQUENTIAL OR INDIRECT DAMAGES, HOWEVER CAUSED, ON ANY * THEORY OF LIABILITY AND WHETHER OR NOT TI HAS BEEN ADVISED * OF THE POSSIBILITY OF SUCH DAMAGES, ARISING IN ANY WAY OUT * OF THIS AGREEMENT, THE PROGRAM, OR YOUR USE OF THE PROGRAM. * EXCLUDED DAMAGES INCLUDE, BUT ARE NOT LIMITED TO, COST OF * REMOVAL OR REINSTALLATION, COMPUTER TIME, LABOR COSTS, LOSS * OF GOODWILL, LOSS OF PROFITS, LOSS OF SAVINGS, OR LOSS OF * USE OR INTERRUPTION OF BUSINESS. IN NO EVENT WILL TI'S * AGGREGATE LIABILITY UNDER THIS AGREEMENT OR ARISING OUT OF * YOUR USE OF THE PROGRAM EXCEED FIVE HUNDRED DOLLARS * (U.S.$500). * * Unless otherwise stated, the Program written and copyrighted * by Texas Instruments is distributed as "freeware". You may, * only under TI's copyright in the Program, use and modify the * Program without any charge or restriction. You may * distribute to third parties, provided that you transfer a * copy of this license to the third party and the third party * agrees to these terms by its first use of the Program. You * must reproduce the copyright notice and any other legend of * ownership on each copy or partial copy, of the Program. * * You acknowledge and agree that the Program contains * copyrighted material, trade secrets and other TI proprietary * information and is protected by copyright laws, * international copyright treaties, and trade secret laws, as * well as other intellectual property laws. To protect TI's * rights in the Program, you agree not to decompile, reverse * engineer, disassemble or otherwise translate any object code * versions of the Program to a human-readable form. You agree * that in no event will you alter, remove or destroy any * copyright notice included in the Program. TI reserves all * rights not specifically granted under this license. Except * as specifically provided herein, nothing in this agreement * shall be construed as conferring by implication, estoppel, * or otherwise, upon you, any license or other right under any * TI patents, copyrights or trade secrets. * * You may not use the Program in non-TI devices. * ********************************************************* */ /* * Copyright (c) 2006, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Operations for communciating with an SD card via a standard sd card slot. * * functional pieces based upon or copied from Texas Instruments sample code * * @author Steve Ayer * @date May 2006 * @date July 2009 (extensive rework, tep conformance) * @author Konrad Lorincz (initial port to tos-2) * @date March 25, 2008 */ #include "SD.h" #include "msp430usart.h" module SDP { provides { interface StdControl; interface SD; } uses { interface HplMsp430Usart as Usart; interface HplMsp430Interrupt as DockInterrupt; interface Leds; } } implementation { error_t cardInit(); #define SPI_TX_DONE while(call Usart.isTxEmpty() == FALSE); #define CS_LOW() TOSH_CLR_SD_CS_N_PIN(); // Card Select #define CS_HIGH() SPI_TX_DONE; TOSH_SET_SD_CS_N_PIN(); /* * this routine is supposed to prevent windows from locking up when * the device is docked. */ void powerCycle() { register uint8_t i; // wait until the tx buf is clear before killing the card CS_HIGH(); // this connects the path from mcu to card TOSH_MAKE_DOCK_N_OUTPUT(); TOSH_SET_DOCK_N_PIN(); TOSH_SET_SW_SD_PWR_N_PIN(); TOSH_CLR_SD_CS_N_PIN(); /* * here we have to clear all input pins to the card, as * the card in spi mode will leech power from any pin */ call Usart.disableSpi(); TOSH_CLR_SD_DI_PIN(); TOSH_CLR_SD_DO_PIN(); TOSH_CLR_SD_CLK_PIN(); for(i = 0; i < 10; i++) TOSH_uwait(6000); TOSH_SET_SD_CS_N_PIN(); TOSH_CLR_SW_SD_PWR_N_PIN(); // undo the override above TOSH_MAKE_DOCK_N_INPUT(); } command error_t StdControl.start(){ TOSH_CLR_SW_SD_PWR_N_PIN(); // powers up module on models so equipped /* * this pin, when low, tells us that the sd card is unavailable to the processor * it should be attached to a pullup unless platform has a docking pin doing an sd override; * generally, we need to avoid talking to the sd with the mcu when the pin is low; * if it's low now, we'll fire an interrupt when the sd is available to software. */ if(!TOSH_READ_DOCK_N_PIN()){ call DockInterrupt.edge(TRUE); // watch for it to go high, off the dock powerCycle(); signal SD.unavailable(); } else{ call DockInterrupt.edge(FALSE); // tell us when we're docked cardInit(); signal SD.available(); } call DockInterrupt.enable(); call DockInterrupt.clear(); return SUCCESS; } command error_t StdControl.stop(){ TOSH_SET_SW_SD_PWR_N_PIN(); // powers down module TOSH_CLR_SD_CS_N_PIN(); call DockInterrupt.disable(); call DockInterrupt.clear(); return SUCCESS; } async event void DockInterrupt.fired() { if (call DockInterrupt.getValue() == TRUE){ // off the dock powerCycle(); cardInit(); call DockInterrupt.edge(FALSE); signal SD.available(); // tell the app that it can talk to the sd card } else{ call DockInterrupt.edge(TRUE); signal SD.unavailable(); // tell the app to stop talking to the card powerCycle(); } call DockInterrupt.clear(); } void initSPI() { msp430_spi_union_config_t * config; TOSH_MAKE_SD_CS_N_OUTPUT(); TOSH_SEL_SD_CS_N_IOFUNC(); config = &msp430_spi_default_config; call Usart.setModeSpi(config); /* * set the clock to 115200 for sd init, default is smclk / 2 * cardInit raises speed back to smclk / 2 at end of init routine */ #ifndef SMCLK_4MHZ call Usart.setUbr(UBR_1MHZ_115200); call Usart.setUmctl(UMCTL_1MHZ_115200); #else call Usart.setUbr(0x0024); call Usart.setUmctl(0x0029); #endif call Usart.enableRxIntr(); TOSH_SET_SD_CS_N_PIN(); while(call Usart.isTxEmpty() == FALSE); } uint8_t spiSendByte (const uint8_t data){ atomic{ while(call Usart.isTxEmpty() == FALSE); call Usart.tx(data); while(call Usart.isRxIntrPending() == FALSE); // rx buffer has a character } return call Usart.rx(); } void sendCmd(const uint8_t cmd, uint32_t data, const uint8_t crc){ uint8_t frame[6]; register int8_t i; frame[0] = cmd | 0x40; for(i = 3; i >= 0; i--) frame[4 - i] = (uint8_t)(data >> 8 * i); frame[5] = crc; for(i = 0; i < 6; i++) spiSendByte(frame[i]); } /* Response comes 1-8bytes after command * the first bit will be a 0 * followed by an error code * data will be 0xff until response */ uint8_t getResponse() { register int i=0; uint8_t response; for(i = 0; i < 65; i++){ if(((response = spiSendByte(0xff)) == 0x00) || (response == 0x01)) break; } return response; } uint8_t getXXResponse(const uint8_t resp){ register uint16_t i; uint8_t response; for(i = 0; i < 1001; i++) if((response = spiSendByte(0xff)) == resp) break; return response; } uint8_t checkBusy(){ register uint8_t i, j; uint8_t response, rvalue; for(i = 0; i < 65; i++){ response = spiSendByte(0xff); response &= 0x1f; switch(response){ case 0x05: rvalue = MMC_SUCCESS; break; case 0x0b: return MMC_CRC_ERROR; case 0x0d: return MMC_WRITE_ERROR; default: rvalue = MMC_OTHER_ERROR; break; } if(rvalue == MMC_SUCCESS) break; } // while((response = spiSendByte(0xff)) == 0); // sma sez DANGER! use some kinda timeout! for(j = 0; j < 512; j++){ if(spiSendByte(0xff)){ break; } } return response; } error_t setIdle(){ char response; CS_LOW(); // put card in SPI mode sendCmd(MMC_GO_IDLE_STATE, 0, 0x95); // confirm that card is READY if((response = getResponse()) != 0x01) return MMC_INIT_ERROR; do{ CS_HIGH(); spiSendByte(0xff); CS_LOW(); sendCmd(MMC_SEND_OP_COND, 0x00, 0xff); }while((response = getResponse()) == 0x01); CS_HIGH(); spiSendByte(0xff); return MMC_SUCCESS; } error_t cardInit(){ register uint8_t i; uint8_t r; initSPI(); CS_HIGH(); for(i = 0; i < 10; i++) spiSendByte(0xff); r = setIdle(); // here's where we set the clock speed up to smclk / 2 (512k) call Usart.setUbr(0x0002); call Usart.setUmctl(0x00); return r; } // change block length to 2^len bytes; default is 512 error_t setBlockLength (const uint16_t len) { CS_LOW (); sendCmd(MMC_SET_BLOCKLEN, len, 0xff); // get response from card, should be 0; so, shouldn't this be 'while'? if(getResponse() != 0x00){ cardInit(); sendCmd(MMC_SET_BLOCKLEN, len, 0xff); getResponse(); } CS_HIGH (); // Send 8 Clock pulses of delay. spiSendByte(0xff); return MMC_SUCCESS; } /* * renamed to clear the way for renaming what was readSector -- which called this -- * to be renamed readBlock. --sma */ error_t read_block(const uint32_t address, const uint16_t count, uint8_t * buffer){ register uint16_t i = 0; uint8_t rvalue = MMC_RESPONSE_ERROR; // Set the block length to read if(setBlockLength(count) == MMC_SUCCESS){ // block length can be set CS_LOW (); sendCmd(MMC_READ_SINGLE_BLOCK, address, 0xff); // Send 8 Clock pulses of delay, check if the MMC acknowledged the read block command // it will do this by sending an affirmative response // in the R1 format (0x00 is no errors) if(getResponse() == 0x00){ // now look for the data token to signify the start of the data if(getXXResponse(MMC_START_DATA_BLOCK_TOKEN) == MMC_START_DATA_BLOCK_TOKEN){ // clock the actual data transfer and receive the bytes; spi_read automatically finds the Data Block for (i = 0; i < count; i++) buffer[i] = spiSendByte(0xff); // is executed with card inserted // get CRC bytes (not really needed by us, but required by MMC) spiSendByte(0xff); spiSendByte(0xff); rvalue = MMC_SUCCESS; } else{ // the data token was never received rvalue = MMC_DATA_TOKEN_ERROR; // 3 } } else{ // the MMC never acknowledge the read command rvalue = MMC_RESPONSE_ERROR; // 2 } } else{ rvalue = MMC_BLOCK_SET_ERROR; // 1 } CS_HIGH (); spiSendByte(0xff); return rvalue; } /* * need to test dock pin for some platforms * on others this will be attached to a pullup */ command error_t SD.readBlock(const uint32_t sector, uint8_t * buffer) { if(!TOSH_READ_DOCK_N_PIN()) return MMC_INIT_ERROR; return read_block(sector * 512, 512, buffer); } error_t write_block(const uint32_t address, const uint16_t count, uint8_t * buffer){ register uint16_t i; uint8_t rvalue = MMC_RESPONSE_ERROR; // MMC_SUCCESS; // Set the block length to write if(setBlockLength (count) == MMC_SUCCESS){ // block length could be set CS_LOW (); sendCmd(MMC_WRITE_BLOCK, address, 0xff); // check if the MMC acknowledged the write block command // it will do this by sending an affirmative response // in the R1 format (0x00 is no errors) if(getXXResponse(MMC_R1_RESPONSE) == MMC_R1_RESPONSE){ spiSendByte(0xff); // send the data token to signify the start of the data spiSendByte(0xfe); // clock the actual data transfer and transmitt the bytes for(i = 0; i < count; i++) spiSendByte(buffer[i]); // put CRC bytes (not really needed by us, but required by MMC) spiSendByte(0xff); spiSendByte(0xff); // read the data response xxx01 : status 010: Data accected, status 101: Data // rejected due to a crc error, status 110: Data rejected due to a Write error. checkBusy(); rvalue = MMC_SUCCESS; } else{ // the MMC never acknowledge the write command rvalue = MMC_RESPONSE_ERROR; // 2 } } else{ rvalue = MMC_BLOCK_SET_ERROR; // 1 } CS_HIGH (); // Send 8 Clock pulses of delay. spiSendByte(0xff); return rvalue; } command error_t SD.writeBlock(const uint32_t sector, uint8_t * buffer){ /* * need to test dock pin for some platforms * on others this will be attached to a pullup */ if(!TOSH_READ_DOCK_N_PIN()) return MMC_INIT_ERROR; return write_block(sector * 512, 512, buffer); } /* * feel our way out over the cliff of the card to estimate the size * turns out cmd9 is not supported on sdio, as there's no csd register */ uint32_t hackGetCardSize() { uint32_t howbig = 0; uint8_t b[512]; error_t failed; /* we'll estimate based upon popular sizes of cards, e.g. 128mb, 256 mb, 512mb, 1gb, 2gb * experimentally, we find that 512mb == ~990900 sectors, 1gb == ~1983000 sectors * extrapolating down, we'll say that 247700 should be readable on a 128mb * reading beyond that returns an error */ failed = call SD.readBlock(0, b); failed = call SD.readBlock(200000, b); // if we can't get this far, we're toast anyway if(!failed){ howbig = 247000; while(!call SD.readBlock(howbig, b)){ howbig = howbig * 2; } howbig = howbig / 2; } return howbig; } // Read the Card Size from the CSD Register // this command is unsupported on sdio-only, like sandisk micro sd cards command uint32_t SD.readCardSize(){ // Read contents of Card Specific Data (CSD) uint32_t MMC_CardSize = 0; uint16_t i, j, b, response, mmc_C_SIZE; uint8_t mmc_READ_BL_LEN, mmc_C_SIZE_MULT; // return hackGetCardSize(); CS_LOW (); spiSendByte(MMC_READ_CSD); // CMD 9 for(i = 0; i < 4; i++) // Send four dummy bytes spiSendByte(0); spiSendByte(0xff); // Send CRC byte response = getResponse(); // data transmission always starts with 0xFE b = spiSendByte(0xff); if(!response){ while(b != 0xfe) b = spiSendByte(0xff); // bits 127:87 for(j = 0; j < 5; j++) // Host must keep the clock running for at b = spiSendByte(0xff); // 4 bits of READ_BL_LEN // bits 84:80 b = spiSendByte(0xff); // lower 4 bits of CCC and mmc_READ_BL_LEN = b & 0x0f; b = spiSendByte(0xff); // bits 73:62 C_Size // xxCC CCCC CCCC CC mmc_C_SIZE = (b & 0x03) << 10; b = spiSendByte(0xff); mmc_C_SIZE += b << 2; b = spiSendByte(0xff); mmc_C_SIZE += b >> 6; // bits 55:53 b = spiSendByte(0xff); // bits 49:47 mmc_C_SIZE_MULT = (b & 0x03) << 1; b = spiSendByte(0xff); mmc_C_SIZE_MULT += b >> 7; // bits 41:37 b = spiSendByte(0xff); b = spiSendByte(0xff); b = spiSendByte(0xff); b = spiSendByte(0xff); b = spiSendByte(0xff); for(j = 0; j < 4; j++) // Host must keep the clock running for at b = spiSendByte(0xff); // least Ncr (max = 4 bytes) cycles after // the card response is received b = spiSendByte(0xff); CS_LOW (); MMC_CardSize = (mmc_C_SIZE + 1); for(i = 2, j = mmc_C_SIZE_MULT + 2; j > 1; j--) i <<= 1; MMC_CardSize *= i; for(i = 2,j = mmc_READ_BL_LEN; j > 1; j--) i <<= 1; MMC_CardSize *= i; } return MMC_CardSize; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/Storage_chip.h000066400000000000000000000033361207233610700245420ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2008-06-30 00:39:34 $ */ #ifndef STORAGE_CHIP_H #define STORAGE_CHIP_H #endif tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/fatfs/000077500000000000000000000000001207233610700230605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/fatfs/FatFs.h000066400000000000000000001114351207233610700242410ustar00rootroot00000000000000/*----------------------------------------------------------------------------/ FatFs module is an open source project to implement FAT file system to small embedded systems. It is opened for education, research and development under license policy of following trems. Copyright (C) 2009, ChaN, all right reserved. * The FatFs module is a free software and there is no warranty. * You can use, modify and/or redistribute it for personal, non-profit or commercial use without any restriction under your responsibility. * Redistributions of source code must retain the above copyright notice. ----------------------------------------------------------------------------*/ /* * Portions of this code: * * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * tinyos port of ChaN's FatFs module (thank you!): * * @author Steve Ayer * @date April, 2009 * ported to tos-2.x * @date January, 2010 */ #include /*---------------------------------------------------------------------------/ / FatFs - FAT file system module configuration file R0.07e (C)ChaN, 2009 ffconf.h NOTE: these are not broken out to ffconf.h in tinyos for maintenance reasons that make sense right now... /----------------------------------------------------------------------------*/ #ifndef _FATFS #define _FATFS 0x007E #define REALTIME 1 #if REALTIME #warning "Using enhanced/optimized version of FatFs............." #endif /*---------------------------------------------------------------------------/ / Function and Buffer Configurations /----------------------------------------------------------------------------*/ #define _FS_TINY 0 /* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system / object instead of the sector buffer in the individual file object for file / data transfer. This reduces memory consumption 512 bytes each file object. */ #define _FS_READONLY 0 /* Setting _FS_READONLY to 1 defines read only configuration. This removes / writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, / f_truncate and useless f_getfree. */ #define _FS_MINIMIZE 0 /* The _FS_MINIMIZE option defines minimization level to remove some functions. / / 0: Full function. / 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename / are removed. / 2: f_opendir and f_readdir are removed in addition to level 1. / 3: f_lseek is removed in addition to level 2. */ #define _USE_STRFUNC 1 /* To enable string functions, set _USE_STRFUNC to 1 or 2. */ #define _USE_MKFS 1 /* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ #define _USE_FORWARD 0 /* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ /*---------------------------------------------------------------------------/ / Locale and Namespace Configurations /----------------------------------------------------------------------------*/ #define _CODE_PAGE 437 /* The _CODE_PAGE specifies the OEM code page to be used on the target system. / / 932 - Japanese Shift-JIS (DBCS, OEM, Windows) / 936 - Simplified Chinese GBK (DBCS, OEM, Windows) / 949 - Korean (DBCS, OEM, Windows) / 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) / 1250 - Central Europe (Windows) / 1251 - Cyrillic (Windows) / 1252 - Latin 1 (Windows) / 1253 - Greek (Windows) / 1254 - Turkish (Windows) / 1255 - Hebrew (Windows) / 1256 - Arabic (Windows) / 1257 - Baltic (Windows) / 1258 - Vietnam (OEM, Windows) / 437 - U.S. (OEM) / 720 - Arabic (OEM) / 737 - Greek (OEM) / 775 - Baltic (OEM) / 850 - Multilingual Latin 1 (OEM) / 858 - Multilingual Latin 1 + Euro (OEM) / 852 - Latin 2 (OEM) / 855 - Cyrillic (OEM) / 866 - Russian (OEM) / 857 - Turkish (OEM) / 862 - Hebrew (OEM) / 874 - Thai (OEM, Windows) / 1 - ASCII (Valid for only non LFN cfg.) */ #define _USE_LFN 1 #define _MAX_LFN 255 /* Maximum LFN length to handle (max:255) */ /* The _USE_LFN option switches the LFN support. / / 0: Disable LFN. / 1: Enable LFN with static working buffer on the bss. Not re-entrant. / 2: Enable LFN with dynamic working buffer on the caller's 'stack'. / / The working buffer occupies (_MAX_LFN + 1) * 2 bytes. When enable LFN, / a Unicode - OEM code conversion function ff_convert() must be linked. */ #define _LFN_UNICODE 0 /* 0 or 1 */ /* To switch the character code set on FatFs API to Unicode, / enable LFN feature and set _LFN_UNICODE to 1. */ #define _FS_RPATH 1 /* When _FS_RPATH is set to 1, relative path feature is enabled and f_chdir, / f_chdrive function are available. / Note that output of the f_readdir fnction is affected by this option. */ /*---------------------------------------------------------------------------/ / Physical Drive Configurations /----------------------------------------------------------------------------*/ #define _DRIVES 1 /* Number of volumes (logical drives) to be used. */ #define _MAX_SS 512 /* Maximum sector size to be handled. (512/1024/2048/4096) */ /* 512 for memroy card and hard disk, 1024 for floppy disk, 2048 for MO disk */ #define _MULTI_PARTITION 0 /* When _MULTI_PARTITION is set to 0, each volume is bound to same physical / drive number and can mount only 1st primaly partition. When it is set to 1, / each volume is tied to the partition listed in Drives[]. */ /*---------------------------------------------------------------------------/ / System Configurations /----------------------------------------------------------------------------*/ #define _WORD_ACCESS 0 /* The _WORD_ACCESS option defines which access method is used to the word / data in the FAT structure. / / 0: Byte-by-byte access. Always compatible with all platforms. / 1: Word access. Do not choose this unless following condition is met. / / When the byte order on the memory is big-endian or address miss-aligned / word access results incorrect behavior, the _WORD_ACCESS must be set to 0. / If it is not the case, the value can also be set to 1 to improve the / performance and code efficiency. */ #define _FS_REENTRANT 0 #define _TIMEOUT 1000 #define _SYNC_t HANDLE /* Type of sync object used on the OS. e.g. HANDLE, OS_EVENT*, ID and etc.. */ /* To make the FatFs module re-entrant, set _FS_REENTRANT to 1 and add user / provided synchronization handlers, ff_req_grant, ff_rel_grant, ff_del_syncobj / and ff_cre_syncobj function to the project. */ /* End of configuration options. Do not change followings without care. */ /*--------------------------------------------------------------------------*/ #if _MAX_SS == 512 #define SS(fs) 512 #else #if _MAX_SS == 1024 || _MAX_SS == 2048 || _MAX_SS == 4096 #define SS(fs) ((fs)->s_size) #else #error Sector size must be 512, 1024, 2048 or 4096. #endif #endif /* Type of file name on FatFs API */ #if _LFN_UNICODE && _USE_LFN typedef WCHAR XCHAR; /* Unicode */ #else typedef char XCHAR; /* SBCS, DBCS */ #endif /* File system object structure */ typedef struct _FATFS_ { BYTE fs_type; /* FAT sub type */ BYTE drive; /* Physical drive number */ BYTE csize; /* Number of sectors per cluster */ BYTE n_fats; /* Number of FAT copies */ BYTE wflag; /* win[] dirty flag (1:must be written back) */ BYTE fsi_flag; /* fsinfo dirty flag (1:must be written back) */ WORD id; /* File system mount ID */ WORD n_rootdir; /* Number of root directory entries (0 on FAT32) */ #if _FS_REENTRANT _SYNC_t sobj; /* Identifier of sync object */ #endif #if _MAX_SS != 512 WORD s_size; /* Sector size */ #endif #if !_FS_READONLY DWORD last_clust; /* Last allocated cluster */ DWORD free_clust; /* Number of free clusters */ DWORD fsi_sector; /* fsinfo sector */ #endif #if _FS_RPATH DWORD cdir; /* Current directory (0:root)*/ #endif DWORD sects_fat; /* Sectors per fat */ DWORD max_clust; /* Maximum cluster# + 1. Number of clusters is max_clust - 2 */ DWORD fatbase; /* FAT start sector */ DWORD dirbase; /* Root directory start sector (Cluster# on FAT32) */ DWORD database; /* Data start sector */ DWORD winsect; /* Current sector appearing in the win[] */ #if REALTIME BYTE *win; BYTE win_dflt[_MAX_SS]; BYTE win_alt[_MAX_SS]; BYTE current_buffer; BYTE buffer_used; DWORD win_alt_sector; #else BYTE win[_MAX_SS]; /* Disk access window for Directory/FAT */ #endif } FATFS; /* Directory object structure */ typedef struct _DIR_ { FATFS* fs; /* Pointer to the owner file system object */ WORD id; /* Owner file system mount ID */ WORD index; /* Current read/write index number */ DWORD sclust; /* Table start cluster (0:Static table) */ DWORD clust; /* Current cluster */ DWORD sect; /* Current sector */ BYTE* dir; /* Pointer to the current SFN entry in the win[] */ BYTE* fn; /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */ #if _USE_LFN WCHAR* lfn; /* Pointer to the LFN working buffer */ WORD lfn_idx; /* Last matched LFN index number (0xFFFF:No LFN) */ #endif } DIR; /* File object structure */ typedef struct _FIL_ { FATFS* fs; /* Pointer to the owner file system object */ WORD id; /* Owner file system mount ID */ BYTE flag; /* File status flags */ BYTE csect; /* Sector address in the cluster */ DWORD fptr; /* File R/W pointer */ DWORD fsize; /* File size */ DWORD org_clust; /* File start cluster */ DWORD curr_clust; /* Current cluster */ DWORD dsect; /* Current data sector */ #if !_FS_READONLY DWORD dir_sect; /* Sector containing the directory entry */ BYTE* dir_ptr; /* Ponter to the directory entry in the window */ #endif #if !_FS_TINY BYTE buf[_MAX_SS]; /* File R/W buffer */ #endif } FIL; /* File status structure */ typedef struct _FILINFO_ { DWORD fsize; /* File size */ WORD fdate; /* Last modified date */ WORD ftime; /* Last modified time */ BYTE fattrib; /* Attribute */ char fname[13]; /* Short file name (8.3 format) */ #if _USE_LFN XCHAR* lfname; /* Pointer to the LFN buffer */ int lfsize; /* Size of LFN buffer [chrs] */ #endif } FILINFO; /* DBCS code ranges and SBCS extend char conversion table */ #if _CODE_PAGE == 932 /* Japanese Shift-JIS */ #define _DF1S 0x81 /* DBC 1st byte range 1 start */ #define _DF1E 0x9F /* DBC 1st byte range 1 end */ #define _DF2S 0xE0 /* DBC 1st byte range 2 start */ #define _DF2E 0xFC /* DBC 1st byte range 2 end */ #define _DS1S 0x40 /* DBC 2nd byte range 1 start */ #define _DS1E 0x7E /* DBC 2nd byte range 1 end */ #define _DS2S 0x80 /* DBC 2nd byte range 2 start */ #define _DS2E 0xFC /* DBC 2nd byte range 2 end */ #elif _CODE_PAGE == 936 /* Simplified Chinese GBK */ #define _DF1S 0x81 #define _DF1E 0xFE #define _DS1S 0x40 #define _DS1E 0x7E #define _DS2S 0x80 #define _DS2E 0xFE #elif _CODE_PAGE == 949 /* Korean */ #define _DF1S 0x81 #define _DF1E 0xFE #define _DS1S 0x41 #define _DS1E 0x5A #define _DS2S 0x61 #define _DS2E 0x7A #define _DS3S 0x81 #define _DS3E 0xFE #elif _CODE_PAGE == 950 /* Traditional Chinese Big5 */ #define _DF1S 0x81 #define _DF1E 0xFE #define _DS1S 0x40 #define _DS1E 0x7E #define _DS2S 0xA1 #define _DS2E 0xFE #elif _CODE_PAGE == 437 /* U.S. (OEM) */ #define _DF1S 0 #define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F,0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} #elif _CODE_PAGE == 720 /* Arabic (OEM) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x45,0x41,0x84,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x49,0x49,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} #elif _CODE_PAGE == 737 /* Greek (OEM) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xE7,0xE8,0xF1,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} #elif _CODE_PAGE == 775 /* Baltic (OEM) */ #define _DF1S 0 #define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} #elif _CODE_PAGE == 850 /* Multilingual Latin 1 (OEM) */ #define _DF1S 0 #define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} #elif _CODE_PAGE == 852 /* Latin 2 (OEM) */ #define _DF1S 0 #define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F,0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0x9F, \ 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} #elif _CODE_PAGE == 855 /* Cyrillic (OEM) */ #define _DF1S 0 #define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F,0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} #elif _CODE_PAGE == 857 /* Turkish (OEM) */ #define _DF1S 0 #define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x98,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0x59,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} #elif _CODE_PAGE == 858 /* Multilingual Latin 1 + Euro (OEM) */ #define _DF1S 0 #define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} #elif _CODE_PAGE == 862 /* Hebrew (OEM) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} #elif _CODE_PAGE == 866 /* Russian (OEM) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} #elif _CODE_PAGE == 874 /* Thai (OEM, Windows) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} #elif _CODE_PAGE == 1250 /* Central Europe (Windows) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xA3,0xB4,0xB5,0xB6,0xB7,0xB8,0xA5,0xAA,0xBB,0xBC,0xBD,0xBC,0xAF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} #elif _CODE_PAGE == 1251 /* Cyrillic (Windows) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x82,0x82,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x80,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ 0xA0,0xA2,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB2,0xA5,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xA3,0xBD,0xBD,0xAF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF} #elif _CODE_PAGE == 1252 /* Latin 1 (Windows) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xAd,0x9B,0x8C,0x9D,0xAE,0x9F, \ 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} #elif _CODE_PAGE == 1253 /* Greek (Windows) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xA2,0xB8,0xB9,0xBA, \ 0xE0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xFB,0xBC,0xFD,0xBF,0xFF} #elif _CODE_PAGE == 1254 /* Turkish (Windows) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x9D,0x9E,0x9F, \ 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} #elif _CODE_PAGE == 1255 /* Hebrew (Windows) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} #elif _CODE_PAGE == 1256 /* Arabic (Windows) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x8C,0x9D,0x9E,0x9F, \ 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0x41,0xE1,0x41,0xE3,0xE4,0xE5,0xE6,0x43,0x45,0x45,0x45,0x45,0xEC,0xED,0x49,0x49,0xF0,0xF1,0xF2,0xF3,0x4F,0xF5,0xF6,0xF7,0xF8,0x55,0xFA,0x55,0x55,0xFD,0xFE,0xFF} #elif _CODE_PAGE == 1257 /* Baltic (Windows) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xBC,0xBD,0xBE,0xAF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} #elif _CODE_PAGE == 1258 /* Vietnam (OEM, Windows) */ #define _DF1S 0 #define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0xAC,0x9D,0x9E,0x9F, \ 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xEC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xFE,0x9F} #elif _CODE_PAGE == 1 /* ASCII (for only non-LFN cfg) */ #define _DF1S 0 #else #error Unknown code page #endif /* Character code support macros */ #define IsUpper(c) (((c)>='A')&&((c)<='Z')) #define IsLower(c) (((c)>='a')&&((c)<='z')) #if _DF1S /* DBCS configuration */ #if _DF2S /* Two 1st byte areas */ #define IsDBCS1(c) (((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) || ((BYTE)(c) >= _DF2S && (BYTE)(c) <= _DF2E)) #else /* One 1st byte area */ #define IsDBCS1(c) ((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) #endif #if _DS3S /* Three 2nd byte areas */ #define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E) || ((BYTE)(c) >= _DS3S && (BYTE)(c) <= _DS3E)) #else /* Two 2nd byte areas */ #define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E)) #endif #else /* SBCS configuration */ #define IsDBCS1(c) 0 #define IsDBCS2(c) 0 #endif /* _DF1S */ /* Definitions corresponds to multi partition */ #if _MULTI_PARTITION /* Multiple partition configuration */ typedef struct _PARTITION { BYTE pd; /* Physical drive# */ BYTE pt; /* Partition # (0-3) */ } PARTITION; extern const PARTITION Drives[]; /* Logical drive# to physical location conversion table */ #define LD2PD(drv) (Drives[drv].pd) /* Get physical drive# */ #define LD2PT(drv) (Drives[drv].pt) /* Get partition# */ #else /* Single partition configuration */ #define LD2PD(drv) (drv) /* Physical drive# is equal to the logical drive# */ #define LD2PT(drv) 0 /* Always mounts the 1st partition */ #endif /* File function return code (FRESULT) */ typedef enum { FR_OK = 0, /* 0 */ FR_DISK_ERR, /* 1 */ FR_INT_ERR, /* 2 */ FR_NOT_READY, /* 3 */ FR_NO_FILE, /* 4 */ FR_NO_PATH, /* 5 */ FR_INVALID_NAME, /* 6 */ FR_DENIED, /* 7 */ FR_EXIST, /* 8 */ FR_INVALID_OBJECT, /* 9 */ FR_WRITE_PROTECTED, /* 10 */ FR_INVALID_DRIVE, /* 11 */ FR_NOT_ENABLED, /* 12 */ FR_NO_FILESYSTEM, /* 13 */ FR_MKFS_ABORTED, /* 14 */ FR_TIMEOUT /* 15 */ } FRESULT; /*--------------------------------------------------------------*/ /* FatFs module application interface */ FRESULT f_mount (BYTE, FATFS*); /* Mount/Unmount a logical drive */ FRESULT f_open (FIL*, const XCHAR*, BYTE); /* Open or create a file */ FRESULT f_read (FIL*, void*, UINT, UINT*); /* Read data from a file */ FRESULT f_write (FIL*, const void*, UINT, UINT*); /* Write data to a file */ //FRESULT f_lseek (FIL*, DWORD); /* Move file pointer of a file object */ FRESULT f_lseek (FIL*, LONG); /* Move file pointer of a file object */ FRESULT f_close (FIL*); /* Close an open file object */ FRESULT f_opendir (DIR*, const XCHAR*); /* Open an existing directory */ FRESULT f_readdir (DIR*, FILINFO*); /* Read a directory item */ FRESULT f_stat (const XCHAR*, FILINFO*); /* Get file status */ FRESULT f_getfree (const XCHAR*, DWORD*, FATFS**); /* Get number of free clusters on the drive */ FRESULT f_truncate (FIL*); /* Truncate file */ FRESULT f_sync (FIL*); /* Flush cached data of a writing file */ FRESULT f_unlink (const XCHAR*); /* Delete an existing file or directory */ FRESULT f_mkdir (const XCHAR*); /* Create a new directory */ FRESULT f_chmod (const XCHAR*, BYTE, BYTE); /* Change attriburte of the file/dir */ FRESULT f_utime (const XCHAR*, const FILINFO*); /* Change timestamp of the file/dir */ FRESULT f_rename (const XCHAR*, const XCHAR*); /* Rename/Move a file or directory */ FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream */ FRESULT f_mkfs (BYTE, BYTE, WORD); /* Create a file system on the drive */ FRESULT f_chdir (const XCHAR*); /* Change current directory */ FRESULT f_chdrive (BYTE); /* Change current drive */ #if _USE_STRFUNC int f_putc (int, FIL*); /* Put a character to the file */ int f_puts (const char*, FIL*); /* Put a string to the file */ int f_printf (FIL*, const char*, ...); /* Put a formatted string to the file */ char* f_gets (char*, int, FIL*); /* Get a string from the file */ #define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0) #define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0) #ifndef EOF #define EOF -1 #endif #endif /*--------------------------------------------------------------*/ /* User defined functions */ /* Real time clock */ DWORD get_fattime (void); /* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */ /* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */ /* Unicode - OEM code conversion */ #if _USE_LFN WCHAR ff_convert (WCHAR, UINT); #endif /*--------------------------------------------------------------*/ /* Flags and offset address */ /* File access control and file status flags (FIL.flag) */ #define FA_READ 0x01 #define FA_OPEN_EXISTING 0x00 #if _FS_READONLY == 0 #define FA_WRITE 0x02 #define FA_CREATE_NEW 0x04 #define FA_CREATE_ALWAYS 0x08 #define FA_OPEN_ALWAYS 0x10 #define FA__WRITTEN 0x20 #define FA__DIRTY 0x40 #endif #define FA__ERROR 0x80 /* FAT sub type (FATFS.fs_type) */ #define FS_FAT12 1 #define FS_FAT16 2 #define FS_FAT32 3 /* File attribute bits for directory entry */ #define AM_RDO 0x01 /* Read only */ #define AM_HID 0x02 /* Hidden */ #define AM_SYS 0x04 /* System */ #define AM_VOL 0x08 /* Volume label */ #define AM_LFN 0x0F /* LFN entry */ #define AM_DIR 0x10 /* Directory */ #define AM_ARC 0x20 /* Archive */ #define AM_MASK 0x3F /* Mask of defined bits */ /* FatFs refers the members in the FAT structures with byte offset instead / of structure member because there are incompatibility of the packing option / between various compilers. */ #define BS_jmpBoot 0 #define BS_OEMName 3 #define BPB_BytsPerSec 11 #define BPB_SecPerClus 13 #define BPB_RsvdSecCnt 14 #define BPB_NumFATs 16 #define BPB_RootEntCnt 17 #define BPB_TotSec16 19 #define BPB_Media 21 #define BPB_FATSz16 22 #define BPB_SecPerTrk 24 #define BPB_NumHeads 26 #define BPB_HiddSec 28 #define BPB_TotSec32 32 #define BS_55AA 510 #define BS_DrvNum 36 #define BS_BootSig 38 #define BS_VolID 39 #define BS_VolLab 43 #define BS_FilSysType 54 #define BPB_FATSz32 36 #define BPB_ExtFlags 40 #define BPB_FSVer 42 #define BPB_RootClus 44 #define BPB_FSInfo 48 #define BPB_BkBootSec 50 #define BS_DrvNum32 64 #define BS_BootSig32 66 #define BS_VolID32 67 #define BS_VolLab32 71 #define BS_FilSysType32 82 #define FSI_LeadSig 0 #define FSI_StrucSig 484 #define FSI_Free_Count 488 #define FSI_Nxt_Free 492 #define MBR_Table 446 #define DIR_Name 0 #define DIR_Attr 11 #define DIR_NTres 12 #define DIR_CrtTime 14 #define DIR_CrtDate 16 #define DIR_FstClusHI 20 #define DIR_WrtTime 22 #define DIR_WrtDate 24 #define DIR_FstClusLO 26 #define DIR_FileSize 28 #define LDIR_Ord 0 #define LDIR_Attr 11 #define LDIR_Type 12 #define LDIR_Chksum 13 #define LDIR_FstClusLO 26 /*--------------------------------*/ /* Multi-byte word access macros */ #if _WORD_ACCESS == 1 /* Enable word access to the FAT structure */ #define LD_WORD(ptr) (WORD)(*(WORD*)(BYTE*)(ptr)) #define LD_DWORD(ptr) (DWORD)(*(DWORD*)(BYTE*)(ptr)) #define ST_WORD(ptr,val) *(WORD*)(BYTE*)(ptr)=(WORD)(val) #define ST_DWORD(ptr,val) *(DWORD*)(BYTE*)(ptr)=(DWORD)(val) #else /* Use byte-by-byte access to the FAT structure */ #define LD_WORD(ptr) (WORD)(((WORD)*(volatile BYTE*)((ptr)+1)<<8)|(WORD)*(volatile BYTE*)(ptr)) #define LD_DWORD(ptr) (DWORD)(((DWORD)*(volatile BYTE*)((ptr)+3)<<24)|((DWORD)*(volatile BYTE*)((ptr)+2)<<16)|((WORD)*(volatile BYTE*)((ptr)+1)<<8)|*(volatile BYTE*)(ptr)) #define ST_WORD(ptr,val) *(volatile BYTE*)(ptr)=(BYTE)(val); *(volatile BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8) #define ST_DWORD(ptr,val) *(volatile BYTE*)(ptr)=(BYTE)(val); *(volatile BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8); *(volatile BYTE*)((ptr)+2)=(BYTE)((DWORD)(val)>>16); *(volatile BYTE*)((ptr)+3)=(BYTE)((DWORD)(val)>>24) #endif #endif /* _FATFS */ tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/fatfs/FatFs.nc000066400000000000000000000137341207233610700244150ustar00rootroot00000000000000/* * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date April, 2009 * ported to tos-2.x * @date January, 2010 */ #include "FatFs.h" interface FatFs { /* non-zero return codes indicate an error; the codes for these are in an enum in FatFs.h */ command void asc_fattime(char * timestring); /* * do this before performing file ops! * pointer to FATFS struct provides required bookkeeping space for the fs */ command error_t mount(FATFS * fs); command error_t unmount(); /* * take the card down, "unmount" the fs */ command void disable(); /* * mode flags: * FA_READ Specifies read access to the object. Data can be read from the file. * Combine with FA_WRITE for read-write access. * FA_WRITE Specifies write access to the object. Data can be written to the file. Combine with FA_READ for read-write access. * FA_OPEN_EXISTING Opens the file. The function fails if the file is not existing. (Default) * FA_OPEN_ALWAYS Opens the file, if it is existing. If not, the function creates the new file. * FA_CREATE_NEW Creates a new file. The function fails if the file is already existing. * FA_CREATE_ALWAYS Creates a new file. If the file is existing, it is truncated and overwritten. * */ command error_t fopen(FIL * fp, const char * filename, BYTE mode); command error_t fclose(FIL * fp); command error_t fread(FIL * fp, void * buffer, uint bytesToRead, uint * bytesRead); command error_t fwrite(FIL * fp, const void * buffer, uint bytesToWrite, uint * bytesWritten); // no ftell, but fp has fptr once file is open command error_t fseek(FIL * fp, int32_t offset); // truncate this file at the current location of the pointer command error_t ftruncate(FIL * fp); /* * flush the file cache to physical media; good for avoiding data loss due * to potential platform disruption (battery, app failure, media removal), * but should be used sparingly to avoid excess flash r/w cycles; fp struct has * a 512-byte buffer. */ command error_t fsync(FIL * fp); command error_t mkdir(const char * dirname); command error_t chdir(const char * dirname); // feed it an empty DIR struct, used before doing readdir calls command error_t opendir(DIR * dp, const char * dirname); /* * reads dir entries in sequence until fi->fname is "" (fname[0] == NULL) * * since long filenames are used here, a buffer of sufficient size * (_MAX_LFN + 1, unless using some asian code pages. see FatFs.h) * must be attached to fi->lfname, with its size in fi->lfsize * */ command error_t readdir(DIR * dp, FILINFO * fi); /* * path is to root; fatfs struct is statically declared in driver */ command error_t getfree(const char * path, uint32_t * clusters, FATFS ** fs); command error_t stat(const char * filename, FILINFO * fi); command error_t unlink(const char * filename); /* * this one's a bit weird * these are the flags for "value": * AM_RDO Read only (0x01) * AM_ARC Archive (0x20) * AM_SYS System (0x04) * AM_HID Hidden (0x02) * * mask is for exposing attributes to effect of value flag; i.e., * if the value bit is zero for a particular attribute and the mask * has a 1 in that position (e.g. value is AM_HID|AM_RDO and mask is * AM_HID|AM_SYS|AM_RDO, then AM_SYS will be turned off) that attribute * will be disabled. */ command error_t chmod(const char * filename, BYTE value, BYTE mask); /* * a good time to introduce this: * in timedate, the fields break out thus: * for fdate, * bit15:9 * Year origin from 1980 (0..127) * bit8:5 * Month (1..12) * bit4:0 * Day (1..31) * * for ftime, * bit15:11 * Hour (0..23) * bit10:5 * Minute (0..59) * bit4:0 * Second / 2 (0..29) */ command error_t f_utime(const char * filename, FILINFO * timedate); command error_t rename(const char * oldname, const char * newname); /* * size in sectors; 512 bytes/sector is fixed * a zero allocates the whole drive/card */ command error_t mkfs(WORD allocSize); command const char * ff_strerror(error_t errnum); /* * these bubble the sd-driver-level events that the app has, * or has lost, access to the card */ async event void mediaUnavailable(); async event void mediaAvailable(); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/fatfs/FatFsP.nc000066400000000000000000003420461207233610700245360ustar00rootroot00000000000000/*---------------------------------------------------------------------------/ / FatFs module is an open source project to implement FAT file system to small / embedded systems. It is opened for education, research and development under / license policy of following trems. / / Copyright (C) 2009, ChaN, all right reserved. / / * The FatFs module is a free software and there is no warranty. / * You can use, modify and/or redistribute it for personal, non-profit or / commercial use without any restriction under your responsibility. / * Redistributions of source code must retain the above copyright notice. / /----------------------------------------------------------------------------*/ /* * Portions of this code are: * * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * This is a tinyos-1.x implementation of ChaN's FatFs embedded FAT filesystem. * Many thanks to ChaN for his excellent work, which has been modified as little * as possible to fit into the tinyos framework. * * @author Steve Ayer * @date April, 2009 * port to tos-2.x * @date January, 2010 * * Cluster window optimizations: * @author Victor Cionca * @date July, 2009 * */ #include "FatFs.h" module FatFsP { provides { interface FatFs; } uses{ interface StdControl as diskIOStdControl; interface SD as diskIO; interface Leds; interface Time; } } implementation { #include "diskio.c" #include "ccsbcs.c" FRESULT f_mount (BYTE, FATFS*); /* Mount/Unmount a logical drive */ FRESULT f_open (FIL*, const char*, BYTE); /* Open or create a file */ FRESULT f_read (FIL*, void*, UINT, UINT*); /* Read data from a file */ FRESULT f_write (FIL*, const void*, UINT, UINT*); /* Write data to a file */ FRESULT f_lseek (FIL*, LONG); /* Move file pointer of a file object */ FRESULT f_close (FIL*); /* Close an open file object */ FRESULT f_opendir (DIR*, const char*); /* Open an existing directory */ FRESULT f_readdir (DIR*, FILINFO*); /* Read a directory item */ FRESULT f_stat (const char*, FILINFO*); /* Get file status */ FRESULT f_getfree (const char*, DWORD*, FATFS**); /* Get number of free clusters on the drive */ FRESULT f_truncate (FIL*); /* Truncate file */ FRESULT f_sync (FIL*); /* Flush cached data of a writing file */ FRESULT f_unlink (const char*); /* Delete an existing file or directory */ FRESULT f_mkdir (const char*); /* Create a new directory */ FRESULT f_chmod (const char*, BYTE, BYTE); /* Change attriburte of the file/dir */ FRESULT f_utime (const char*, const FILINFO*); /* Change timestamp of the file/dir */ FRESULT f_rename (const char*, const char*); /* Rename/Move a file or directory */ FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream */ FRESULT f_mkfs (BYTE, BYTE, WORD); /* Create a file system on the drive */ FRESULT f_chdir (const XCHAR*); /* Change current directory */ FRESULT f_chdrive (BYTE); /* Change current drive */ DWORD get_fattime (); #if REALTIME /** * Dirty hack function to get the address of the file directory entry * in the window, if we are using buffers for the window * * The problem is that the original code represents the directory entry * as a fixed address in the fs window (dirty hack, but makes sense). * As we use two windows (dflt and buffer), we need to update the address * of the dir entry: find in what window the address was, get the offset * in the window and add it to the main window address */ BYTE *get_dir_ptr(FATFS *fs, BYTE *ptr){ // UINT window_address; // UINT dir_obj_address; INT diff_win; diff_win = ptr - fs->win_dflt; if (diff_win < 0 || diff_win >= _MAX_SS){ // the dir_ptr is not in the first window buffer diff_win = ptr - fs->win_alt; // try the second buffer if (diff_win < 0 || diff_win >= _MAX_SS){ // error, can't find the dir_ptr in any of the buffers return 0; } } return fs->win + diff_win; } BYTE cluster_in_alt_window(FATFS *fs, DWORD cluster){ switch (fs->fs_type){ case FS_FAT16: if (cluster/(SS(fs)/2)+fs->fatbase == fs->win_alt_sector) return 1; else return 0; case FS_FAT32: if (cluster/(SS(fs)/4)+fs->fatbase == fs->win_alt_sector) return 1; else return 0; } return 0; } void invert_buffers(FATFS *fs){ DWORD wsect = 0; atomic{ switch (fs->current_buffer){ case 0: fs->win = fs->win_alt; fs->current_buffer = 1; break; case 1: fs->win = fs->win_dflt; fs->current_buffer = 0; break; } wsect = fs->winsect; fs->winsect = fs->win_alt_sector; // update the active sector, since we are moving the window fs->win_alt_sector = wsect; // update the buffer sector } } DWORD sync_both_win_buffers(FATFS *fs){ // write both buffers to disk switch (fs->current_buffer){ case 0: // we are currently using buffer 0 (dflt), so write buffer 1 (alt) if (disk_write(fs->drive, fs->win_alt, fs->win_alt_sector, 1) != RES_OK) return FR_DISK_ERR; if (disk_write(fs->drive, fs->win_dflt, fs->winsect, 1) != RES_OK) return FR_DISK_ERR; break; case 1: if (disk_write(fs->drive, fs->win_dflt, fs->win_alt_sector, 1) != RES_OK) return FR_DISK_ERR; if (disk_write(fs->drive, fs->win_alt, fs->winsect, 1) != RES_OK) return FR_DISK_ERR; break; } fs->win_alt_sector = 0; // the alternative sector is 0 (not used) fs->buffer_used = 0; // buffer is not used return RES_OK; } DWORD sync_win_buffers(FATFS *fs){ switch (fs->current_buffer){ case 0: // we are currently using buffer 0 (dflt), so write buffer 1 (alt) if (disk_write(fs->drive, fs->win_alt, fs->win_alt_sector, 1) != RES_OK) return FR_DISK_ERR; break; case 1: if (disk_write(fs->drive, fs->win_dflt, fs->win_alt_sector, 1) != RES_OK) return FR_DISK_ERR; break; } fs->win_alt_sector = 0; // the alternative sector is 0 (not used) fs->buffer_used = 0; // buffer is not used return RES_OK; } void init_fatfs(FATFS *fs){ atomic{ fs->win = fs->win_dflt; fs->current_buffer = 0; fs->win_alt_sector = 0; fs->buffer_used = 0; } } #endif /* * do this before performing file ops! * pointer to FATFS struct provides required bookkeeping space for the fs */ command error_t FatFs.mount(FATFS * fs){ return f_mount(0, fs); } command error_t FatFs.unmount(){ dock_disk(); // this calls diskiostdcontrol.start() return SUCCESS; } /* * disable_disk is a wrapper for diskIOStdControl.stop, * which disables the card completely */ command void FatFs.disable(){ f_mount(0, NULL); // this is supposed to unmount disable_disk(); } /* * mode flags: * FA_READ Specifies read access to the object. Data can be read from the file. * Combine with FA_WRITE for read-write access. * FA_WRITE Specifies write access to the object. Data can be written to the file. Combine with FA_READ for read-write access. * FA_OPEN_EXISTING Opens the file. The function fails if the file is not existing. (Default) * FA_OPEN_ALWAYS Opens the file, if it is existing. If not, the function creates the new file. * FA_CREATE_NEW Creates a new file. The function fails if the file is already existing. * FA_CREATE_ALWAYS Creates a new file. If the file is existing, it is truncated and overwritten. * */ command error_t FatFs.fopen(FIL * fp, const char * filename, BYTE mode){ return f_open(fp, filename, mode); } command void FatFs.asc_fattime(char * timestring) { time_t time_now; struct tm ltime; DWORD now; now = get_fattime(); #ifdef SPRINTF sprintf(timestring, "raw fattime is %08lx", now); #endif /* call Time.time(&time_now); call Time.localtime(&time_now, <ime); call Time.asctime(<ime, timestring, 128); */ } command error_t FatFs.fclose(FIL * fp){ return f_close(fp); } command error_t FatFs.fread(FIL * fp, void * buffer, uint bytesToRead, uint * bytesRead){ if (!fp || !fp->fs) return FR_INVALID_OBJECT; #if REALTIME if (cluster_in_alt_window(fp->fs, fp->curr_clust)){ // the current cluster FAT entry is in the buffered window, // so invert the buffers invert_buffers(fp->fs); } if (fp->fs->buffer_used) if (sync_win_buffers(fp->fs) != RES_OK) return FR_DISK_ERR; #endif return f_read(fp, buffer, bytesToRead, bytesRead); } command error_t FatFs.fwrite(FIL * fp, const void * buffer, uint bytesToWrite, uint * bytesWritten){ if (!fp || !fp->fs) return FR_INVALID_OBJECT; #if REALTIME if (cluster_in_alt_window(fp->fs, fp->curr_clust)){ // the current cluster FAT entry is in the buffered window, // so invert the buffers invert_buffers(fp->fs); } if (fp->fs->buffer_used) if (sync_win_buffers(fp->fs) != RES_OK) return FR_DISK_ERR; #endif return f_write(fp, buffer, bytesToWrite, bytesWritten); } // no ftell, but fp has fptr once file is open command error_t FatFs.fseek(FIL * fp, int32_t offset){ if (!fp || !fp->fs) return FR_INVALID_OBJECT; #if REALTIME if (cluster_in_alt_window(fp->fs, fp->curr_clust)){ // the current cluster FAT entry is in the buffered window, // so invert the buffers invert_buffers(fp->fs); } if (fp->fs->buffer_used) if (sync_win_buffers(fp->fs) != RES_OK) return FR_DISK_ERR; #endif return f_lseek(fp, offset); } // truncate this file at the current location of the pointer command error_t FatFs.ftruncate(FIL * fp){ if (!fp || !fp->fs) return FR_INVALID_OBJECT; #if REALTIME if (cluster_in_alt_window(fp->fs, fp->curr_clust)){ // the current cluster FAT entry is in the buffered window, // so invert the buffers invert_buffers(fp->fs); } if (fp->fs->buffer_used) if (sync_win_buffers(fp->fs) != RES_OK) return FR_DISK_ERR; #endif return f_truncate(fp); } /* * flush the file cache to physical media; good for avoiding data loss due * to potential platform disruption (battery, app failure, media removal), * but should be used sparingly to avoid excess flash r/w cycles; fp struct has * a 512-byte buffer. */ command error_t FatFs.fsync(FIL * fp){ return f_sync(fp); } command error_t FatFs.mkdir(const char * dirname){ return f_mkdir(dirname); } // feed it an empty DIR struct, used before doing readdir calls command error_t FatFs.opendir(DIR * dp, const char * dirname){ return f_opendir(dp, dirname); } // set current working directory command error_t FatFs.chdir(const char * dirname){ return f_chdir(dirname); } /* * reads dir entries in sequence until fi->fname is "" (fname[0] == NULL) * * since long filenames are used here, a buffer of sufficient size * (_MAX_LFN + 1, unless using some asian code pages. see FatFs.h) * must be attached to fi->lfname, with its size in fi->lfsize * */ command error_t FatFs.readdir(DIR * dp, FILINFO * fi){ return f_readdir(dp, fi); } /* * path is to root; fatfs struct is statically declared in driver */ command error_t FatFs.getfree(const char * path, uint32_t * clusters, FATFS ** fs){ return f_getfree(path, clusters, fs); } command error_t FatFs.stat(const char * filename, FILINFO * fi){ return f_stat(filename, fi); } command error_t FatFs.unlink(const char * filename){ return f_unlink(filename); } command const char * FatFs.ff_strerror(error_t errnum){ switch(errnum){ case FR_OK: /* 0 */ return "No Error"; case FR_DISK_ERR: /* 1 */ return "Disk Error"; case FR_INT_ERR: /* 2 */ return "Internal Error (bad or out of range cluster?)"; case FR_NOT_READY: /* 3 */ return "Drive Not Ready (uninitialized?)"; case FR_NO_FILE: /* 4 */ return "File Not Found"; case FR_NO_PATH: /* 5 */ return "Path Not Found"; case FR_INVALID_NAME: /* 6 */ return "Invalid Name (root dir?)"; case FR_DENIED: /* 7 */ return "Operation Denied"; case FR_EXIST: /* 8 */ return "File Object Already Exists"; case FR_INVALID_OBJECT: /* 9 */ return "Invalid Object"; case FR_WRITE_PROTECTED: /* 10 */ return "Write Protected"; case FR_INVALID_DRIVE: /* 11 */ return "Invalid Drive"; case FR_NOT_ENABLED: /* 12 */ return "Filesystem Not Enabled (improper drive?)"; case FR_NO_FILESYSTEM: /* 13 */ return "No Valid FAT Partition Found"; case FR_MKFS_ABORTED: /* 14 */ return "Unable to Build Filesystem; Aborting"; case FR_TIMEOUT: /* 15 */ return "Re-entrant Operation Timed Out (invalid error in tos!)"; case 22: return "My ERROR!"; default: return "Unknown Error"; } } /* * this one's a bit weird * these are the flags for "value": * AM_RDO Read only (0x01) * AM_ARC Archive (0x20) * AM_SYS System (0x04) * AM_HID Hidden (0x02) * * mask is for exposing attributes to effect of value flag; i.e., * if the value bit is zero for a particular attribute and the mask * has a 1 in that position (e.g. value is AM_HID|AM_RDO and mask is * AM_HID|AM_SYS|AM_RDO, then AM_SYS will be turned off) that attribute * will be disabled. */ command error_t FatFs.chmod(const char * filename, BYTE value, BYTE mask){ return f_chmod(filename, value, mask); } /* * a good time to introduce this: * in timedate, the fields break out thus: * for fdate, * bit15:9 * Year origin from 1980 (0..127) * bit8:5 * Month (1..12) * bit4:0 * Day (1..31) * * for ftime, * bit15:11 * Hour (0..23) * bit10:5 * Minute (0..59) * bit4:0 * Second / 2 (0..29) */ command error_t FatFs.f_utime(const char * filename, FILINFO * timedate){ return f_utime(filename, timedate); } command error_t FatFs.rename(const char * oldname, const char * newname){ return f_rename(oldname, newname); } /* * size in sectors; 512 bytes/sector is fixed * a zero allocates the whole drive/card */ command error_t FatFs.mkfs(WORD allocSize){ return f_mkfs(0, 0, allocSize); } #define ENTER_FF(fs) #define LEAVE_FF(fs, res) return res #define ABORT(fs, res) { fp->flag |= FA__ERROR; LEAVE_FF(fs, res); } /* Name status flags */ #define NS 11 /* Offset of name status byte */ #define NS_LOSS 0x01 /* Out of 8.3 format */ #define NS_LFN 0x02 /* Force to create LFN entry */ #define NS_LAST 0x04 /* Last segment */ #define NS_BODY 0x08 /* Lower case flag (body) */ #define NS_EXT 0x10 /* Lower case flag (ext) */ #define NS_DOT 0x20 /* Dot entry */ #if _DRIVES < 1 || _DRIVES > 9 #error Number of drives must be 1-9. #endif static FATFS * FatFs[_DRIVES]; /* Pointer to the file system objects (logical drives) */ static WORD Fsid; /* File system mount ID */ #if _FS_RPATH static BYTE Drive; /* Current drive */ #endif #if _USE_LFN == 1 /* LFN with static LFN working buffer */ static WCHAR LfnBuf[_MAX_LFN + 1]; #define NAMEBUF(sp,lp) BYTE sp[12]; WCHAR *lp = LfnBuf #define INITBUF(dj,sp,lp) dj.fn = sp; dj.lfn = lp #elif _USE_LFN > 1 /* LFN with dynamic LFN working buffer */ #define NAMEBUF(sp,lp) BYTE sp[12]; WCHAR lbuf[_MAX_LFN + 1], *lp = lbuf #define INITBUF(dj,sp,lp) dj.fn = sp; dj.lfn = lp #else /* No LFN */ #define NAMEBUF(sp,lp) BYTE sp[12] #define INITBUF(dj,sp,lp) dj.fn = sp #endif event void Time.tick() {} /* return type bitmask: * 31-25: Year(0-127 org.1980) * 24-21: Month(1-12) * 20-16: Day(1-31) * 15-11: Hour(0-23) * 10-5: Minute(0-59) * 4-0: Second(0-29 *2) */ DWORD get_fattime (){ DWORD now; uint32_t year_from_80, month, day, hour, minute, second; struct tm ltime; time_t time_now; call Time.time(&time_now); call Time.localtime(&time_now, <ime); year_from_80 = ltime.tm_year - 1980; month = ltime.tm_mon + 1; day = ltime.tm_mday; hour = ltime.tm_hour; minute = ltime.tm_min; second = ltime.tm_sec / 2; now = (year_from_80 << 25) | (month << 21) | (day << 16) | (hour << 11) | (minute << 5) | ((second * 2)); return now; } /*-----------------------------------------------------------------------*/ /* Change window offset */ /*-----------------------------------------------------------------------*/ /* Move to zero only writes back dirty window */ static FRESULT move_window ( FATFS *fs, DWORD sector) /* File system object, Sector number to make apperance in the fs->win[] */ { DWORD wsect; wsect = fs->winsect; if (wsect != sector) { /* Changed current window */ #if !_FS_READONLY #if REALTIME // since we are buffering windows, we can check if the // request matches the buffer, and avoid the move if (fs->buffer_used && fs->win_alt_sector == sector){ // we have to switch the buffers, without writing // as the next window to be accessed might be the other one invert_buffers(fs); return FR_OK; } #endif if (fs->wflag) { /* Write back dirty window if needed */ #if REALTIME // moving the window to 0 shouldn't do any buffering // plus, leave the buffer alone, it will be handled // in the future if (sector == 0){ fs->wflag = 0; return disk_write(fs->drive, fs->win, wsect, 1); } // buffer the current window and write it on the next I/O op, // thus creating an even I/O load per write request // (currently, we have 3 additional I/O when this event happens; // with this change we have only two split accross two consecutive requests) if (fs->buffer_used) { if (sync_win_buffers(fs) != RES_OK) return FR_DISK_ERR; } atomic{ switch (fs->current_buffer){ case 0: fs->win = fs->win_alt; fs->current_buffer = 1; break; case 1: fs->win = fs->win_dflt; fs->current_buffer = 0; break; } fs->win_alt_sector = fs->winsect; fs->buffer_used = 1; } #else if (disk_write(fs->drive, fs->win, wsect, 1) != RES_OK) return FR_DISK_ERR; #endif fs->wflag = 0; #if !REALTIME // in realtime we care about timing, not redundancy if (wsect < (fs->fatbase + fs->sects_fat)) { /* In FAT area */ BYTE nf; for (nf = fs->n_fats; nf > 1; nf--) { /* Refrect the change to FAT copy */ wsect += fs->sects_fat; disk_write(fs->drive, fs->win, wsect, 1); } } #endif } #endif if (sector) { if (disk_read(fs->drive, fs->win, sector, 1) != RES_OK) return FR_DISK_ERR; fs->winsect = sector; } } return FR_OK; } /*-----------------------------------------------------------------------*/ /* Clean-up cached data */ /*-----------------------------------------------------------------------*/ #if !_FS_READONLY /* FR_OK: successful, FR_DISK_ERR: failed */ static FRESULT sync (FATFS *fs) { FRESULT res = 0; #if !REALTIME res = move_window(fs, 0); if (res == FR_OK) { #endif /* Update FSInfo sector if needed */ if (fs->fs_type == FS_FAT32 && fs->fsi_flag) { #if !REALTIME fs->winsect = 0; #else res = move_window(fs, fs->fsi_sector); #endif memset(fs->win, 0, 512); ST_WORD(fs->win+BS_55AA, 0xAA55); ST_DWORD(fs->win+FSI_LeadSig, 0x41615252); ST_DWORD(fs->win+FSI_StrucSig, 0x61417272); ST_DWORD(fs->win+FSI_Free_Count, fs->free_clust); ST_DWORD(fs->win+FSI_Nxt_Free, fs->last_clust); #if !REALTIME disk_write(fs->drive, fs->win, fs->fsi_sector, 1); #endif fs->fsi_flag = 0; fs->wflag = 1; } /* Make sure that no pending write process in the physical drive */ if (disk_ioctl(fs->drive, CTRL_SYNC, (void*)NULL) != RES_OK) res = FR_DISK_ERR; #if !REALTIME } #endif #if REALTIME if (fs->buffer_used) if (sync_win_buffers(fs) != RES_OK) return FR_DISK_ERR; move_window(fs, 0); #endif return res; } #endif /*-----------------------------------------------------------------------*/ /* FAT access - Read value of a FAT entry */ /*-----------------------------------------------------------------------*/ /* 0xFFFFFFFF:Disk error, 1:Interal error, Else:Cluster status */ DWORD get_fat (FATFS *fs, DWORD clst) /* Cluster# to get the link information */ { UINT wc, bc; DWORD fsect; if (clst < 2 || clst >= fs->max_clust) /* Range check */ return 1; fsect = fs->fatbase; switch (fs->fs_type) { case FS_FAT12: bc = clst; bc += bc / 2; if (move_window(fs, fsect + (bc / SS(fs)))) break; wc = fs->win[bc & (SS(fs) - 1)]; bc++; if (move_window(fs, fsect + (bc / SS(fs)))) break; wc |= (WORD)fs->win[bc & (SS(fs) - 1)] << 8; return (clst & 1) ? (wc >> 4) : (wc & 0xFFF); case FS_FAT16 : if (move_window(fs, fsect + (clst / (SS(fs) / 2)))) break; return LD_WORD(&fs->win[((WORD)clst * 2) & (SS(fs) - 1)]); case FS_FAT32 : if (move_window(fs, fsect + (clst / (SS(fs) / 4)))) break; return LD_DWORD(&fs->win[((WORD)clst * 4) & (SS(fs) - 1)]) & 0x0FFFFFFF; } return 0xFFFFFFFF; /* An error occured at the disk I/O layer */ } /*-----------------------------------------------------------------------*/ /* FAT access - Change value of a FAT entry */ /*-----------------------------------------------------------------------*/ #if !_FS_READONLY FRESULT put_fat (FATFS *fs, /* File system object */ DWORD clst, /* Cluster# to be changed in range of 2 to fs->max_clust - 1 */ DWORD val) /* New value to mark the cluster */ { UINT bc; BYTE *p; DWORD fsect; FRESULT res; if (clst < 2 || clst >= fs->max_clust) { /* Range check */ res = FR_INT_ERR; } else { fsect = fs->fatbase; switch (fs->fs_type) { case FS_FAT12 : bc = clst; bc += bc / 2; res = move_window(fs, fsect + (bc / SS(fs))); if (res != FR_OK) break; p = &fs->win[bc & (SS(fs) - 1)]; *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; bc++; fs->wflag = 1; res = move_window(fs, fsect + (bc / SS(fs))); if (res != FR_OK) break; p = &fs->win[bc & (SS(fs) - 1)]; *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); break; case FS_FAT16 : res = move_window(fs, fsect + (clst / (SS(fs) / 2))); if (res != FR_OK) break; ST_WORD(&fs->win[((WORD)clst * 2) & (SS(fs) - 1)], (WORD)val); break; case FS_FAT32 : res = move_window(fs, fsect + (clst / (SS(fs) / 4))); if (res != FR_OK) break; ST_DWORD(&fs->win[((WORD)clst * 4) & (SS(fs) - 1)], val); break; default : res = FR_INT_ERR; } fs->wflag = 1; } return res; } #endif /* !_FS_READONLY */ /*-----------------------------------------------------------------------*/ /* Remove a cluster chain */ /*-----------------------------------------------------------------------*/ #if !_FS_READONLY static FRESULT remove_chain (FATFS *fs, DWORD clst) /* Cluster# to a remove chain from */ { FRESULT res; DWORD nxt; if (clst < 2 || clst >= fs->max_clust) { /* Check the range of cluster# */ res = FR_INT_ERR; } else { res = FR_OK; while (clst < fs->max_clust) { /* Not a last link? */ nxt = get_fat(fs, clst); /* Get cluster status */ if (nxt == 0) break; /* Empty cluster? */ if (nxt == 1) { res = FR_INT_ERR; break; } /* Internal error? */ if (nxt == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } /* Disk error? */ res = put_fat(fs, clst, 0); /* Mark the cluster "empty" */ if (res != FR_OK) break; if (fs->free_clust != 0xFFFFFFFF) { /* Update FSInfo */ fs->free_clust++; fs->fsi_flag = 1; } clst = nxt; /* Next cluster */ } } return res; } #endif /*-----------------------------------------------------------------------*/ /* FAT handling - Stretch or Create a cluster chain */ /*-----------------------------------------------------------------------*/ #if !_FS_READONLY /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ static DWORD create_chain (FATFS *fs, DWORD clst) /* Cluster# to stretch. 0 means create a new chain. */ { DWORD cs, ncl, scl, mcl; mcl = fs->max_clust; if (clst == 0) { /* Create new chain */ scl = fs->last_clust; /* Get suggested start point */ if (scl == 0 || scl >= mcl) scl = 1; } else { /* Stretch existing chain */ cs = get_fat(fs, clst); /* Check the cluster status */ if (cs < 2) return 1; /* It is an invalid cluster */ if (cs < mcl) return cs; /* It is already followed by next cluster */ scl = clst; } ncl = scl; /* Start cluster */ for (;;) { ncl++; /* Next cluster */ if (ncl >= mcl) { /* Wrap around */ ncl = 2; if (ncl > scl) return 0; /* No free custer */ } cs = get_fat(fs, ncl); /* Get the cluster status */ if (cs == 0) break; /* Found a free cluster */ if (cs == 0xFFFFFFFF || cs == 1)/* An error occured */ return cs; if (ncl == scl) return 0; /* No free custer */ } if (put_fat(fs, ncl, 0x0FFFFFFF)) /* Mark the new cluster "in use" */ return 0xFFFFFFFF; if (clst != 0) { /* Link it to the previous one if needed */ if (put_fat(fs, clst, ncl)) return 0xFFFFFFFF; } fs->last_clust = ncl; /* Update FSINFO */ if (fs->free_clust != 0xFFFFFFFF) { fs->free_clust--; fs->fsi_flag = 1; } return ncl; /* Return new cluster number */ } #endif /* !_FS_READONLY */ /*-----------------------------------------------------------------------*/ /* Get sector# from cluster# */ /*-----------------------------------------------------------------------*/ /* !=0: sector number, 0: failed - invalid cluster# */ static DWORD clust2sect (FATFS *fs, DWORD clst) /* Cluster# to be converted */ { clst -= 2; if (clst >= (fs->max_clust - 2)) return 0; /* Invalid cluster# */ return clst * fs->csize + fs->database; } /*-----------------------------------------------------------------------*/ /* Directory handling - Seek directory index */ /*-----------------------------------------------------------------------*/ static FRESULT dir_seek (DIR *dj, WORD idx) /* Pointer to directory object, Directory index number */ { DWORD clst; WORD ic; dj->index = idx; clst = dj->sclust; if (clst == 1 || clst >= dj->fs->max_clust) /* Check start cluster range */ return FR_INT_ERR; if (!clst && dj->fs->fs_type == FS_FAT32) /* Replace cluster# 0 with root cluster# if in FAT32 */ clst = dj->fs->dirbase; if (clst == 0) { /* Static table */ dj->clust = clst; if (idx >= dj->fs->n_rootdir) /* Index is out of range */ return FR_INT_ERR; dj->sect = dj->fs->dirbase + idx / (SS(dj->fs) / 32); /* Sector# */ } else { /* Dynamic table */ ic = SS(dj->fs) / 32 * dj->fs->csize; /* Entries per cluster */ while (idx >= ic) { /* Follow cluster chain */ clst = get_fat(dj->fs, clst); /* Get next cluster */ if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ if (clst < 2 || clst >= dj->fs->max_clust) /* Reached to end of table or int error */ return FR_INT_ERR; idx -= ic; } dj->clust = clst; dj->sect = clust2sect(dj->fs, clst) + idx / (SS(dj->fs) / 32); /* Sector# */ } dj->dir = dj->fs->win + (idx % (SS(dj->fs) / 32)) * 32; return FR_OK; /* Seek succeeded */ } /*-----------------------------------------------------------------------*/ /* Directory handling - Move directory index next */ /*-----------------------------------------------------------------------*/ /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:EOT and could not streach */ static FRESULT dir_next (DIR *dj, BOOL streach) /* FALSE: Do not streach table, TRUE: Streach table if needed */ { DWORD clst; WORD i; i = dj->index + 1; if (!i || !dj->sect) /* Report EOT when index has reached 65535 */ return FR_NO_FILE; if (!(i % (SS(dj->fs) / 32))) { /* Sector changed? */ dj->sect++; /* Next sector */ if (dj->clust == 0) { /* Static table */ if (i >= dj->fs->n_rootdir) /* Report EOT when end of table */ return FR_NO_FILE; } else { /* Dynamic table */ if (((i / (SS(dj->fs) / 32)) & (dj->fs->csize - 1)) == 0) { /* Cluster changed? */ clst = get_fat(dj->fs, dj->clust); /* Get next cluster */ if (clst <= 1) return FR_INT_ERR; if (clst == 0xFFFFFFFF) return FR_DISK_ERR; if (clst >= dj->fs->max_clust) { /* When it reached end of dynamic table */ #if !_FS_READONLY BYTE c; if (!streach) return FR_NO_FILE; /* When do not streach, report EOT */ clst = create_chain(dj->fs, dj->clust); /* Streach cluster chain */ if (clst == 0) return FR_DENIED; /* No free cluster */ if (clst == 1) return FR_INT_ERR; if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Clean-up streached table */ if (move_window(dj->fs, 0)) return FR_DISK_ERR; /* Flush active window */ memset(dj->fs->win, 0, SS(dj->fs)); /* Clear window buffer */ dj->fs->winsect = clust2sect(dj->fs, clst); /* Cluster start sector */ for (c = 0; c < dj->fs->csize; c++) { /* Fill the new cluster with 0 */ dj->fs->wflag = 1; if (move_window(dj->fs, 0)) return FR_DISK_ERR; dj->fs->winsect++; } dj->fs->winsect -= c; /* Rewind window address */ #else return FR_NO_FILE; /* Report EOT */ #endif } dj->clust = clst; /* Initialize data for new cluster */ dj->sect = clust2sect(dj->fs, clst); } } } dj->index = i; dj->dir = dj->fs->win + (i % (SS(dj->fs) / 32)) * 32; return FR_OK; } /*-----------------------------------------------------------------------*/ /* LFN handling - Test/Pick/Fit an LFN segment from/to directory entry */ /*-----------------------------------------------------------------------*/ #if _USE_LFN static const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* Offset of LFN chars in the directory entry */ /* TRUE:Matched, FALSE:Not matched */ static BOOL cmp_lfn (WCHAR *lfnbuf, BYTE *dir) /* Pointer to the LFN to be compared, Pointer to the directory entry containing a part of LFN */ { int i, s; WCHAR wc, uc; i = ((dir[LDIR_Ord] & 0xBF) - 1) * 13; /* Get offset in the LFN buffer */ s = 0; wc = 1; do { uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ if (wc) { /* Last char has not been processed */ wc = ff_wtoupper(uc); /* Convert it to upper case */ if (i >= _MAX_LFN || wc != ff_wtoupper(lfnbuf[i++])) /* Compare it */ return FALSE; /* Not matched */ } else if (uc != 0xFFFF) return FALSE; /* Check filler */ } while (++s < 13); /* Repeat until all chars in the entry are checked */ if ((dir[LDIR_Ord] & 0x40) && wc && lfnbuf[i]) /* Last segment matched but different length */ return FALSE; return TRUE; /* The part of LFN matched */ } /* TRUE:Succeeded, FALSE:Buffer overflow */ static BOOL pick_lfn (WCHAR *lfnbuf, BYTE *dir) /* Pointer to the Unicode-LFN buffer, Pointer to the directory entry */ { int i, s; WCHAR wc, uc; i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ s = 0; wc = 1; do { uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ if (wc) { /* Last char has not been processed */ if (i >= _MAX_LFN) return FALSE; /* Buffer overflow? */ lfnbuf[i++] = wc = uc; /* Store it */ } else if (uc != 0xFFFF) return FALSE; /* Check filler */ } while (++s < 13); /* Read all character in the entry */ if (dir[LDIR_Ord] & 0x40) { /* Put terminator if it is the last LFN part */ if (i >= _MAX_LFN) return FALSE; /* Buffer overflow? */ lfnbuf[i] = 0; } return TRUE; } #if !_FS_READONLY static void fit_lfn (const WCHAR *lfnbuf, /* Pointer to the LFN buffer */ BYTE *dir, /* Pointer to the directory entry */ BYTE ord, /* LFN order (1-20) */ BYTE sum) /* SFN sum */ { int i, s; WCHAR wc; dir[LDIR_Chksum] = sum; /* Set check sum */ dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ dir[LDIR_Type] = 0; ST_WORD(dir+LDIR_FstClusLO, 0); i = (ord - 1) * 13; /* Get offset in the LFN buffer */ s = wc = 0; do { if (wc != 0xFFFF) wc = lfnbuf[i++]; /* Get an effective char */ ST_WORD(dir+LfnOfs[s], wc); /* Put it */ if (!wc) wc = 0xFFFF; /* Padding chars following last char */ } while (++s < 13); if (wc == 0xFFFF || !lfnbuf[i]) ord |= 0x40; /* Bottom LFN part is the start of LFN sequence */ dir[LDIR_Ord] = ord; /* Set the LFN order */ } #endif #endif /*-----------------------------------------------------------------------*/ /* Create numbered name */ /*-----------------------------------------------------------------------*/ #if _USE_LFN void gen_numname (BYTE *dst, /* Pointer to genartated SFN */ const BYTE *src, /* Pointer to source SFN to be modified */ const WCHAR *lfn, /* Pointer to LFN */ WORD num) /* Sequense number */ { char ns[8]; int i, j; memcpy(dst, src, 11); if (num > 5) { /* On many collisions, generate a hash number instead of sequencial number */ do num = (num >> 1) + (num << 15) + (WORD)*lfn++; while (*lfn); } /* itoa */ i = 7; do { ns[i--] = (num % 10) + '0'; num /= 10; } while (num); ns[i] = '~'; /* Append the number */ for (j = 0; j < i && dst[j] != ' '; j++) { if (IsDBCS1(dst[j])) { if (j == i - 1) break; j++; } } do { dst[j++] = (i < 8) ? ns[i++] : ' '; } while (j < 8); } #endif /*-----------------------------------------------------------------------*/ /* Calculate sum of an SFN */ /*-----------------------------------------------------------------------*/ #if _USE_LFN static BYTE sum_sfn (const BYTE *dir) /* Ptr to directory entry */ { BYTE sum = 0; int n = 11; do sum = (sum >> 1) + (sum << 7) + *dir++; while (--n); return sum; } #endif /*-----------------------------------------------------------------------*/ /* Directory handling - Find an object in the directory */ /*-----------------------------------------------------------------------*/ static FRESULT dir_find (DIR *dj) /* Pointer to the directory object linked to the file name */ { FRESULT res; BYTE c, *dir; #if _USE_LFN BYTE a, ord, sum; #endif res = dir_seek(dj, 0); /* Rewind directory object */ if (res != FR_OK) return res; #if _USE_LFN ord = sum = 0xFF; #endif do { res = move_window(dj->fs, dj->sect); if (res != FR_OK) break; #if REALTIME dir = get_dir_ptr(dj->fs, dj->dir); #else dir = dj->dir; /* Ptr to the directory entry of current index */ #endif c = dir[DIR_Name]; if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ #if _USE_LFN /* LFN configuration */ a = dir[DIR_Attr] & AM_MASK; if (c == 0xE5 || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ ord = 0xFF; } else { if (a == AM_LFN) { /* An LFN entry is found */ if (dj->lfn) { if (c & 0x40) { /* Is it start of LFN sequence? */ sum = dir[LDIR_Chksum]; c &= 0xBF; ord = c; /* LFN start order */ dj->lfn_idx = dj->index; } /* Check validity of the LFN entry and compare it with given name */ ord = (c == ord && sum == dir[LDIR_Chksum] && cmp_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF; } } else { /* An SFN entry is found */ if (!ord && sum == sum_sfn(dir)) break; /* LFN matched? */ ord = 0xFF; dj->lfn_idx = 0xFFFF; /* Reset LFN sequence */ if (!(dj->fn[NS] & NS_LOSS) && !memcmp(dir, dj->fn, 11)) break; /* SFN matched? */ } } #else /* Non LFN configuration */ if (!(dir[DIR_Attr] & AM_VOL) && !mem_cmp(dir, dj->fn, 11)) /* Is it a valid entry? */ break; #endif res = dir_next(dj, FALSE); /* Next entry */ } while (res == FR_OK); return res; } /*-----------------------------------------------------------------------*/ /* Read an object from the directory */ /*-----------------------------------------------------------------------*/ #if _FS_MINIMIZE <= 1 static FRESULT dir_read (DIR *dj) /* Pointer to the directory object to store read object name */ { FRESULT res; BYTE c, *dir; #if _USE_LFN BYTE a, ord = 0xFF, sum = 0xFF; #endif res = FR_NO_FILE; while (dj->sect) { res = move_window(dj->fs, dj->sect); if (res != FR_OK) break; #if REALTIME dir = get_dir_ptr(dj->fs, dj->dir); #else dir = dj->dir; /* Ptr to the directory entry of current index */ #endif c = dir[DIR_Name]; if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ #if _USE_LFN /* LFN configuration */ a = dir[DIR_Attr] & AM_MASK; if (c == 0xE5 || (!_FS_RPATH && c == '.') || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ ord = 0xFF; } else { if (a == AM_LFN) { /* An LFN entry is found */ if (c & 0x40) { /* Is it start of LFN sequence? */ sum = dir[LDIR_Chksum]; c &= 0xBF; ord = c; dj->lfn_idx = dj->index; } /* Check LFN validity and capture it */ ord = (c == ord && sum == dir[LDIR_Chksum] && pick_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF; } else { /* An SFN entry is found */ if (ord || sum != sum_sfn(dir)) /* Is there a valid LFN? */ dj->lfn_idx = 0xFFFF; /* It has no LFN. */ break; } } #else /* Non LFN configuration */ if (c != 0xE5 && (_FS_RPATH || c != '.') && !(dir[DIR_Attr] & AM_VOL)) /* Is it a valid entry? */ break; #endif res = dir_next(dj, FALSE); /* Next entry */ if (res != FR_OK) break; } if (res != FR_OK) dj->sect = 0; return res; } #endif /*-----------------------------------------------------------------------*/ /* Register an object to the directory */ /*-----------------------------------------------------------------------*/ #if !_FS_READONLY /* FR_OK:Successful, FR_DENIED:No free entry or too many SFN collision, FR_DISK_ERR:Disk error */ static FRESULT dir_register (DIR *dj) /* Target directory with object name to be created */ { FRESULT res; BYTE c, *dir; #if _USE_LFN /* LFN configuration */ WORD n, ne, is; BYTE sn[12], *fn, sum; WCHAR *lfn; fn = dj->fn; lfn = dj->lfn; memcpy(sn, fn, 12); if (_FS_RPATH && (sn[NS] & NS_DOT)) return FR_INVALID_NAME; /* Cannot create dot entry */ if (sn[NS] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ fn[NS] = 0; dj->lfn = NULL; /* Find only SFN */ for (n = 1; n < 100; n++) { gen_numname(fn, sn, lfn, n); /* Generate a numbered name */ res = dir_find(dj); /* Check if the name collides with existing SFN */ if (res != FR_OK) break; } if (n == 100) return FR_DENIED; /* Abort if too many collisions */ if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ fn[NS] = sn[NS]; dj->lfn = lfn; } if (sn[NS] & NS_LFN) { /* When LFN is to be created, reserve reserve an SFN + LFN entries. */ for (ne = 0; lfn[ne]; ne++) ; ne = (ne + 25) / 13; } else { /* Otherwise reserve only an SFN entry. */ ne = 1; } /* Reserve contiguous entries */ res = dir_seek(dj, 0); if (res != FR_OK) return res; n = is = 0; do { res = move_window(dj->fs, dj->sect); if (res != FR_OK) break; #if REALTIME c = *(get_dir_ptr(dj->fs, dj->dir)); #else c = *dj->dir; /* Check the entry status */ #endif if (c == 0xE5 || c == 0) { /* Is it a blank entry? */ if (n == 0) is = dj->index; /* First index of the contigulus entry */ if (++n == ne) break; /* A contiguous entry that requiered count is found */ } else { n = 0; /* Not a blank entry. Restart to search */ } res = dir_next(dj, TRUE); /* Next entry with table streach */ } while (res == FR_OK); if (res == FR_OK && ne > 1) { /* Initialize LFN entry if needed */ res = dir_seek(dj, is); if (res == FR_OK) { sum = sum_sfn(dj->fn); /* Sum of the SFN tied to the LFN */ ne--; do { /* Store LFN entries in bottom first */ res = move_window(dj->fs, dj->sect); if (res != FR_OK) break; #if REALTIME dj->dir = get_dir_ptr(dj->fs, dj->dir); #endif fit_lfn(dj->lfn, dj->dir, (BYTE)ne, sum); dj->fs->wflag = 1; res = dir_next(dj, FALSE); /* Next entry */ } while (res == FR_OK && --ne); } } #else /* Non LFN configuration */ res = dir_seek(dj, 0); if (res == FR_OK) { do { /* Find a blank entry for the SFN */ res = move_window(dj->fs, dj->sect); if (res != FR_OK) break; #if REALTIME c = *(get_dir_ptr(dj->dir)); #else c = *dj->dir; #endif if (c == 0xE5 || c == 0) break; /* Is it a blank entry? */ res = dir_next(dj, TRUE); /* Next entry with table streach */ } while (res == FR_OK); } #endif if (res == FR_OK) { /* Initialize the SFN entry */ res = move_window(dj->fs, dj->sect); if (res == FR_OK) { #if REALTIME dir = get_dir_ptr(dj->fs, dj->dir); #else dir = dj->dir; #endif memset(dir, 0, 32); /* Clean the entry */ memcpy(dir, dj->fn, 11); /* Put SFN */ dir[DIR_NTres] = *(dj->fn+NS) & (NS_BODY | NS_EXT); /* Put NT flag */ dj->fs->wflag = 1; } } return res; } #endif /* !_FS_READONLY */ /*-----------------------------------------------------------------------*/ /* Remove an object from the directory */ /*-----------------------------------------------------------------------*/ #if !_FS_READONLY && !_FS_MINIMIZE /* FR_OK: Successful, FR_DISK_ERR: A disk error */ static FRESULT dir_remove (DIR *dj) /* Directory object pointing the entry to be removed */ { FRESULT res; #if _USE_LFN /* LFN configuration */ WORD i; i = dj->index; /* SFN index */ res = dir_seek(dj, (WORD)((dj->lfn_idx == 0xFFFF) ? i : dj->lfn_idx)); /* Goto the SFN or top of the LFN entries */ if (res == FR_OK) { do { res = move_window(dj->fs, dj->sect); if (res != FR_OK) break; #if REALTIME dj->dir = get_dir_ptr(dj->fs, dj->dir); #endif *dj->dir = 0xE5; /* Mark the entry "deleted" */ dj->fs->wflag = 1; if (dj->index >= i) break; /* When SFN is deleted, all entries of the object is deleted. */ res = dir_next(dj, FALSE); /* Next entry */ } while (res == FR_OK); if (res == FR_NO_FILE) res = FR_INT_ERR; } #else /* Non LFN configuration */ res = dir_seek(dj, dj->index); if (res == FR_OK) { res = move_window(dj->fs, dj->sect); if (res == FR_OK) { #if REALTIME dj->dir = get_dir_ptr(dj->fs, dj->dir); #endif *dj->dir = 0xE5; /* Mark the entry "deleted" */ dj->fs->wflag = 1; } } #endif return res; } #endif /* !_FS_READONLY */ /*-----------------------------------------------------------------------*/ /* Pick a segment and create the object name in directory form */ /*-----------------------------------------------------------------------*/ static FRESULT create_name (DIR *dj, const XCHAR **path) /* Pointer to pointer to the segment in the path string */ { #ifdef _EXCVT static const BYTE cvt[] = _EXCVT; #endif #if _USE_LFN /* LFN configuration */ BYTE b, cf; WCHAR w, *lfn; int i, ni, si, di; const XCHAR *p; /* Create LFN in Unicode */ si = di = 0; p = *path; lfn = dj->lfn; for (;;) { w = p[si++]; /* Get a character */ if (w < ' ' || w == '/' || w == '\\') break; /* Break on end of segment */ if (di >= _MAX_LFN) /* Reject too long name */ return FR_INVALID_NAME; #if !_LFN_UNICODE w &= 0xFF; if (IsDBCS1(w)) { /* If it is a DBC 1st byte */ b = p[si++]; /* Get 2nd byte */ if (!IsDBCS2(b)) /* Reject invalid code for DBC */ return FR_INVALID_NAME; w = (w << 8) + b; } w = ff_convert(w, 1); /* Convert OEM to Unicode */ if (!w) return FR_INVALID_NAME; /* Reject invalid code */ #endif if (w < 0x80 && strchr("\"*:<>\?|\x7F", w)) /* Reject illegal chars for LFN */ return FR_INVALID_NAME; lfn[di++] = w; /* Store the Unicode char */ } *path = &p[si]; /* Rerurn pointer to the next segment */ cf = (w < ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ #if _FS_RPATH if ((di == 1 && lfn[di - 1] == '.') || /* Is this a dot entry? */ (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == L'.')) { lfn[di] = 0; for (i = 0; i < 11; i++) dj->fn[i] = (i < di) ? '.' : ' '; dj->fn[i] = cf | NS_DOT; /* This is a dot entry */ return FR_OK; } #endif while (di) { /* Strip trailing spaces and dots */ w = lfn[di - 1]; if (w != ' ' && w != '.') break; di--; } if (!di) return FR_INVALID_NAME; /* Reject null string */ lfn[di] = 0; /* LFN is created */ /* Create SFN in directory form */ memset(dj->fn, ' ', 11); for (si = 0; lfn[si] == ' ' || lfn[si] == '.'; si++) ; /* Strip leading spaces and dots */ if (si) cf |= NS_LOSS | NS_LFN; while (di && lfn[di - 1] != '.') di--; /* Find extension (di<=si: no extension) */ b = i = 0; ni = 8; for (;;) { w = lfn[si++]; /* Get an LFN char */ if (!w) break; /* Break on enf of the LFN */ if (w == ' ' || (w == '.' && si != di)) { /* Remove spaces and dots */ cf |= NS_LOSS | NS_LFN; continue; } if (i >= ni || si == di) { /* Extension or end of SFN */ if (ni == 11) { /* Long extension */ cf |= NS_LOSS | NS_LFN; break; } if (si != di) cf |= NS_LOSS | NS_LFN; /* Out of 8.3 format */ if (si > di) break; /* No extension */ si = di; i = 8; ni = 11; /* Enter extension section */ b <<= 2; continue; } if (w >= 0x80) { /* Non ASCII char */ #ifdef _EXCVT w = ff_convert(w, 0); /* Unicode -> OEM code */ if (w) w = cvt[w - 0x80]; /* Convert extend char to upper (SBCS) */ #else w = ff_convert(ff_wtoupper(w), 0); /* Upper converted Unicode -> OEM code */ #endif cf |= NS_LFN; /* Force create LFN entry */ } if (_DF1S && w >= 0x100) { /* Double byte char */ if (i >= ni - 1) { cf |= NS_LOSS | NS_LFN; i = ni; continue; } dj->fn[i++] = (BYTE)(w >> 8); } else { /* Single byte char */ if (!w || strchr("+,;[=]", w)) { /* Replace illegal chars for SFN */ w = '_'; cf |= NS_LOSS | NS_LFN; /* Lossy conversion */ } else { if (IsUpper(w)) { /* ASCII Large capital */ b |= 2; } else { if (IsLower(w)) { /* ASCII Small capital */ b |= 1; w -= 0x20; } } } } dj->fn[i++] = (BYTE)w; } if (dj->fn[0] == 0xE5) dj->fn[0] = 0x05; /* If the first char collides with deleted mark, replace it with 0x05 */ if (ni == 8) b <<= 2; if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) /* Create LFN entry when there are composite capitals */ cf |= NS_LFN; if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended char, NT flags are created */ if ((b & 0x03) == 0x01) cf |= NS_EXT; /* NT flag (Extension has only small capital) */ if ((b & 0x0C) == 0x04) cf |= NS_BODY; /* NT flag (Filename has only small capital) */ } dj->fn[NS] = cf; /* SFN is created */ return FR_OK; #else /* Non-LFN configuration */ BYTE b, c, d, *sfn; int ni, si, i; const char *p; /* Create file name in directory form */ sfn = dj->fn; memset(sfn, ' ', 11); si = i = b = 0; ni = 8; p = *path; #if _FS_RPATH if (p[si] == '.') { /* Is this a dot entry? */ for (;;) { c = p[si++]; if (c != '.' || si >= 3) break; sfn[i++] = c; } if (c != '/' && c != '\\' && c > ' ') return FR_INVALID_NAME; *path = &p[si]; /* Rerurn pointer to the next segment */ sfn[NS] = (c < ' ') ? NS_LAST|NS_DOT : NS_DOT; /* Set last segment flag if end of path */ return FR_OK; } #endif for (;;) { c = p[si++]; if (c <= ' ' || c == '/' || c == '\\') break; /* Break on end of segment */ if (c == '.' || i >= ni) { if (ni != 8 || c != '.') return FR_INVALID_NAME; i = 8; ni = 11; b <<= 2; continue; } if (c >= 0x80) { /* Extended char */ #ifdef _EXCVT c = cvt[c - 0x80]; /* Convert extend char (SBCS) */ #else b |= 3; /* Eliminate NT flag if ext char is exist */ #if !_DF1S /* ASCII only cfg */ return FR_INVALID_NAME; #endif #endif } if (IsDBCS1(c)) { /* DBC 1st byte? */ d = p[si++]; /* Get 2nd byte */ if (!IsDBCS2(d) || i >= ni - 1) /* Reject invalid DBC */ return FR_INVALID_NAME; sfn[i++] = c; sfn[i++] = d; } else { if (strchr(" \"*+,[=]|\x7F", c)) /* Reject illegal chrs for SFN */ return FR_INVALID_NAME; if (IsUpper(c)) { /* ASCII large capital? */ b |= 2; } else { if (IsLower(c)) { /* ASCII small capital? */ b |= 1; c -= 0x20; } } sfn[i++] = c; } } *path = &p[si]; /* Rerurn pointer to the next segment */ c = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ if (!i) return FR_INVALID_NAME; /* Reject null string */ if (sfn[0] == 0xE5) sfn[0] = 0x05; /* When first char collides with 0xE5, replace it with 0x05 */ if (ni == 8) b <<= 2; if ((b & 0x03) == 0x01) c |= NS_EXT; /* NT flag (Extension has only small capital) */ if ((b & 0x0C) == 0x04) c |= NS_BODY; /* NT flag (Filename has only small capital) */ sfn[NS] = c; /* Store NT flag, File name is created */ return FR_OK; #endif } /*-----------------------------------------------------------------------*/ /* Get file information from directory entry */ /*-----------------------------------------------------------------------*/ #if _FS_MINIMIZE <= 1 static void get_fileinfo (DIR *dj, FILINFO *fno) /* Pointer to the file information to be filled */ { int i; BYTE c, nt, *dir; char *p; p = fno->fname; if (dj->sect) { #if REALTIME dir = get_dir_ptr(dj->fs, dj->dir); #else dir = dj->dir; #endif nt = dir[DIR_NTres]; /* NT flag */ for (i = 0; i < 8; i++) { /* Copy name body */ c = dir[i]; if (c == ' ') break; if (c == 0x05) c = 0xE5; if (_USE_LFN && (nt & NS_BODY) && IsUpper(c)) c += 0x20; *p++ = c; } if (dir[8] != ' ') { /* Copy name extension */ *p++ = '.'; for (i = 8; i < 11; i++) { c = dir[i]; if (c == ' ') break; if (_USE_LFN && (nt & NS_EXT) && IsUpper(c)) c += 0x20; *p++ = c; } } fno->fattrib = dir[DIR_Attr]; /* Attribute */ fno->fsize = LD_DWORD(dir+DIR_FileSize); /* Size */ fno->fdate = LD_WORD(dir+DIR_WrtDate); /* Date */ fno->ftime = LD_WORD(dir+DIR_WrtTime); /* Time */ } *p = 0; #if _USE_LFN if (fno->lfname) { XCHAR *tp = fno->lfname; WCHAR w, *lfn; i = 0; if (dj->sect && dj->lfn_idx != 0xFFFF) {/* Get LFN if available */ lfn = dj->lfn; while ((w = *lfn++) != 0) { /* Get an LFN char */ #if !_LFN_UNICODE w = ff_convert(w, 0); /* Unicode -> OEM conversion */ if (!w) { i = 0; break; } /* Could not convert, no LFN */ if (_DF1S && w >= 0x100) /* Put 1st byte if it is a DBC */ tp[i++] = (XCHAR)(w >> 8); #endif if (i >= fno->lfsize - 1) { i = 0; break; } /* Buffer overrun, no LFN */ tp[i++] = (XCHAR)w; } } tp[i] = 0; /* Terminator */ } #endif } #endif /* _FS_MINIMIZE <= 1 */ /*-----------------------------------------------------------------------*/ /* Follow a file path */ /*-----------------------------------------------------------------------*/ /* FR_OK(0): successful, !=0: error code */ static FRESULT follow_path (DIR *dj, const char *path) /* Directory object to return last directory and found object, Full-path string to find a file or directory */ { FRESULT res; BYTE *dir, last; while (!_USE_LFN && *path == ' ') path++; /* Skip leading spaces */ #if _FS_RPATH if (*path == '/' || *path == '\\') { /* There is a heading separator */ path++; dj->sclust = 0; /* Strip it and start from the root dir */ } else { /* No heading saparator */ dj->sclust = dj->fs->cdir; /* Start from the current dir */ } #else if (*path == '/' || *path == '\\') /* Strip heading separator if exist */ path++; dj->sclust = 0; /* Start from the root dir */ #endif if ((UINT)*path < ' ') { /* Null path means the start directory itself */ res = dir_seek(dj, 0); dj->dir = NULL; } else { /* Follow path */ for (;;) { res = create_name(dj, &path); /* Get a segment */ if (res != FR_OK) break; res = dir_find(dj); /* Find it */ last = *(dj->fn+NS) & NS_LAST; if (res != FR_OK) { /* Could not find the object */ if (res == FR_NO_FILE && !last) res = FR_NO_PATH; break; } if (last) break; /* Last segment match. Function completed. */ #if REALTIME dir = get_dir_ptr(dj->fs, dj->dir); #else dir = dj->dir; /* There is next segment. Follow the sub directory */ #endif if (!(dir[DIR_Attr] & AM_DIR)) { /* Cannot follow because it is a file */ res = FR_NO_PATH; break; } dj->sclust = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); } } return res; } /*-----------------------------------------------------------------------*/ /* Load boot record and check if it is an FAT boot record */ /*-----------------------------------------------------------------------*/ /* 0:The FAT boot record, 1:Valid boot record but not an FAT, 2:Not a boot record, 3:Error */ static BYTE check_fs (FATFS *fs, DWORD sect) /* File system object, Sector# (lba) to check if it is an FAT boot record or not */ { if (disk_read(fs->drive, fs->win, sect, 1) != RES_OK) /* Load boot record */ return 3; if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55) /* Check record signature (always placed at offset 510 even if the sector size is >512) */ return 2; if ((LD_DWORD(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146) /* Check "FAT" string */ return 0; if ((LD_DWORD(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146) return 0; return 1; } /*-----------------------------------------------------------------------*/ /* Make sure that the file system is valid */ /*-----------------------------------------------------------------------*/ /* FR_OK(0): successful, !=0: any error occured */ static FRESULT chk_mounted (const XCHAR **path, /* Pointer to pointer to the path name (drive number) */ FATFS **rfs, /* Pointer to pointer to the found file system object */ BYTE chk_wp) /* !=0: Check media write protection for write access */ { BYTE fmt, *tbl; UINT vol; DSTATUS stat; DWORD bsect, fsize, tsect, mclst; const XCHAR *p = *path; FATFS *fs; /* Get logical drive number from the path name */ vol = p[0] - '0'; /* Is there a drive number? */ if (vol <= 9 && p[1] == ':') { /* Found a drive number, get and strip it */ p += 2; *path = p; /* Return pointer to the path name */ } else { /* No drive number is given */ #if _FS_RPATH vol = Drive; /* Use current drive */ #else vol = 0; /* Use drive 0 */ #endif } /* Check if the logical drive is valid or not */ if (vol >= _DRIVES) /* Is the drive number valid? */ return FR_INVALID_DRIVE; *rfs = fs = FatFs[vol]; /* Returen pointer to the corresponding file system object */ if (!fs) return FR_NOT_ENABLED; /* Is the file system object available? */ ENTER_FF(fs); /* Lock file system */ if (fs->fs_type) { /* If the logical drive has been mounted */ stat = disk_status(fs->drive); if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized (has not been changed), */ #if !_FS_READONLY if (chk_wp && (stat & STA_PROTECT)) /* Check write protection if needed */ return FR_WRITE_PROTECTED; #endif return FR_OK; /* The file system object is valid */ } } /* The logical drive must be mounted. Following code attempts to mount the volume */ fs->fs_type = 0; /* Clear the file system object */ fs->drive = (BYTE)LD2PD(vol); /* Bind the logical drive and a physical drive */ stat = disk_initialize(fs->drive); /* Initialize low level disk I/O layer */ if (stat & STA_NOINIT) /* Check if the drive is ready */ return FR_NOT_READY; #if _MAX_SS != 512 /* Get disk sector size if needed */ if (disk_ioctl(fs->drive, GET_SECTOR_SIZE, &SS(fs)) != RES_OK || SS(fs) > _MAX_SS) return FR_NO_FILESYSTEM; #endif #if !_FS_READONLY if (chk_wp && (stat & STA_PROTECT)) /* Check disk write protection if needed */ return FR_WRITE_PROTECTED; #endif /* Search FAT partition on the drive */ fmt = check_fs(fs, bsect = 0); /* Check sector 0 as an SFD format */ if (fmt == 1) { /* Not an FAT boot record, it may be patitioned */ /* Check a partition listed in top of the partition table */ tbl = &fs->win[MBR_Table + LD2PT(vol) * 16]; /* Partition table */ if (tbl[4]) { /* Is the partition existing? */ bsect = LD_DWORD(&tbl[8]); /* Partition offset in LBA */ fmt = check_fs(fs, bsect); /* Check the partition */ } } if (fmt == 3) return FR_DISK_ERR; if (fmt || LD_WORD(fs->win+BPB_BytsPerSec) != SS(fs)) /* No valid FAT patition is found */ return FR_NO_FILESYSTEM; /* Initialize the file system object */ fsize = LD_WORD(fs->win+BPB_FATSz16); /* Number of sectors per FAT */ if (!fsize) fsize = LD_DWORD(fs->win+BPB_FATSz32); fs->sects_fat = fsize; fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FAT copies */ fsize *= fs->n_fats; /* (Number of sectors in FAT area) */ fs->fatbase = bsect + LD_WORD(fs->win+BPB_RsvdSecCnt); /* FAT start sector (lba) */ fs->csize = fs->win[BPB_SecPerClus]; /* Number of sectors per cluster */ fs->n_rootdir = LD_WORD(fs->win+BPB_RootEntCnt); /* Nmuber of root directory entries */ tsect = LD_WORD(fs->win+BPB_TotSec16); /* Number of sectors on the volume */ if (!tsect) tsect = LD_DWORD(fs->win+BPB_TotSec32); fs->max_clust = mclst = (tsect /* Last cluster# + 1 (Number of clusters + 2) */ - LD_WORD(fs->win+BPB_RsvdSecCnt) - fsize - fs->n_rootdir / (SS(fs)/32) ) / fs->csize + 2; fmt = FS_FAT12; /* Determine the FAT sub type */ if (mclst >= 0xFF7) fmt = FS_FAT16; /* Number of clusters >= 0xFF5 */ if (mclst >= 0xFFF7) fmt = FS_FAT32; /* Number of clusters >= 0xFFF5 */ if (fmt == FS_FAT32) fs->dirbase = LD_DWORD(fs->win+BPB_RootClus); /* Root directory start cluster */ else fs->dirbase = fs->fatbase + fsize; /* Root directory start sector (lba) */ fs->database = fs->fatbase + fsize + fs->n_rootdir / (SS(fs)/32); /* Data start sector (lba) */ #if !_FS_READONLY /* Initialize allocation information */ fs->free_clust = 0xFFFFFFFF; fs->wflag = 0; /* Get fsinfo if needed */ if (fmt == FS_FAT32) { fs->fsi_flag = 0; fs->fsi_sector = bsect + LD_WORD(fs->win+BPB_FSInfo); if (disk_read(fs->drive, fs->win, fs->fsi_sector, 1) == RES_OK && LD_WORD(fs->win+BS_55AA) == 0xAA55 && LD_DWORD(fs->win+FSI_LeadSig) == 0x41615252 && LD_DWORD(fs->win+FSI_StrucSig) == 0x61417272) { fs->last_clust = LD_DWORD(fs->win+FSI_Nxt_Free); fs->free_clust = LD_DWORD(fs->win+FSI_Free_Count); } } #endif fs->fs_type = fmt; /* FAT sub-type */ fs->winsect = 0; /* Invalidate sector cache */ #if _FS_RPATH fs->cdir = 0; /* Current directory (root dir) */ #endif fs->id = ++Fsid; /* File system mount ID */ return FR_OK; } /*-----------------------------------------------------------------------*/ /* Check if the file/dir object is valid or not */ /*-----------------------------------------------------------------------*/ /* FR_OK(0): The object is valid, !=0: Invalid */ static FRESULT validate (FATFS *fs, WORD id) /* Member id of the target object to be checked */ { if (!fs || !fs->fs_type || fs->id != id) return FR_INVALID_OBJECT; ENTER_FF(fs); /* Lock file system */ if (disk_status(fs->drive) & STA_NOINIT) return FR_NOT_READY; return FR_OK; } /*-------------------------------------------------------------------------- Public Functions --------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/ /* Mount/Unmount a Locical Drive */ /*-----------------------------------------------------------------------*/ FRESULT f_mount (BYTE vol, /* Logical drive number to be mounted/unmounted */ FATFS *fs) /* Pointer to new file system object (NULL for unmount)*/ { FATFS *rfs; DSTATUS stat; if (vol >= _DRIVES) /* Check if the drive number is valid */ return FR_INVALID_DRIVE; rfs = FatFs[vol]; /* Get current fs object */ if (rfs) { #if _FS_REENTRANT /* Discard sync object of the current volume */ if (!ff_del_syncobj(rfs->sobj)) return FR_INT_ERR; #endif rfs->fs_type = 0; /* Clear old fs object */ } FatFs[vol] = fs; /* Register new fs object */ if (fs) { fs->fs_type = 0; /* Clear new fs object */ #if _FS_REENTRANT /* Create sync object for the new volume */ if (!ff_cre_syncobj(vol, &fs->sobj)) return FR_INT_ERR; #endif #if REALTIME init_fatfs(fs); #endif fs->drive = (BYTE)LD2PD(vol); /* Bind the logical drive and a physical drive */ stat = disk_initialize(fs->drive); /* Initialize low level disk I/O layer */ if (stat & STA_NOINIT) /* Check if the drive is ready */ return FR_NOT_READY; } return FR_OK; } /*-----------------------------------------------------------------------*/ /* Open or Create a File */ /*-----------------------------------------------------------------------*/ FRESULT f_open (FIL *fp, /* Pointer to the blank file object */ const XCHAR *path, /* Pointer to the file name */ BYTE mode) /* Access mode and file open mode flags */ { FRESULT res; DIR dj; NAMEBUF(sfn, lfn); BYTE *dir; fp->fs = NULL; /* Clear file object */ #if !_FS_READONLY mode &= (FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW); res = chk_mounted(&path, &dj.fs, (BYTE)(mode & (FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW))); #else mode &= FA_READ; res = chk_mounted(&path, &dj.fs, 0); #endif if (res != FR_OK) LEAVE_FF(dj.fs, res); INITBUF(dj, sfn, lfn); res = follow_path(&dj, path); /* Follow the file path */ #if !_FS_READONLY /* Create or Open a file */ if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { DWORD ps, cl; if (res != FR_OK) { /* No file, create new */ if (res == FR_NO_FILE) /* There is no file to open, create a new entry */ res = dir_register(&dj); if (res != FR_OK) LEAVE_FF(dj.fs, res); mode |= FA_CREATE_ALWAYS; #if REALTIME dir = get_dir_ptr(dj.fs, dj.dir); #else dir = dj.dir; /* Created entry (SFN entry) */ #endif } else { /* Any object is already existing */ if (mode & FA_CREATE_NEW) /* Cannot create new */ LEAVE_FF(dj.fs, FR_EXIST); #if REALTIME dir = get_dir_ptr(dj.fs, dj.dir); #else dir = dj.dir; #endif if (!dir || (dir[DIR_Attr] & (AM_RDO | AM_DIR))) /* Cannot overwrite it (R/O or DIR) */ LEAVE_FF(dj.fs, FR_DENIED); if (mode & FA_CREATE_ALWAYS) { /* Resize it to zero on overwrite mode */ cl = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); /* Get start cluster */ ST_WORD(dir+DIR_FstClusHI, 0); /* cluster = 0 */ ST_WORD(dir+DIR_FstClusLO, 0); ST_DWORD(dir+DIR_FileSize, 0); /* size = 0 */ dj.fs->wflag = 1; ps = dj.fs->winsect; /* Remove the cluster chain */ if (cl) { res = remove_chain(dj.fs, cl); if (res) LEAVE_FF(dj.fs, res); dj.fs->last_clust = cl - 1; /* Reuse the cluster hole */ } res = move_window(dj.fs, ps); if (res != FR_OK) LEAVE_FF(dj.fs, res); } } if (mode & FA_CREATE_ALWAYS) { #if REALTIME dir = get_dir_ptr(dj.fs, dir); #endif dir[DIR_Attr] = 0; /* Reset attribute */ ps = get_fattime(); ST_DWORD(dir+DIR_CrtTime, ps); /* Created time */ dj.fs->wflag = 1; mode |= FA__WRITTEN; /* Set file changed flag */ } } /* Open an existing file */ else { #endif /* !_FS_READONLY */ if (res != FR_OK) LEAVE_FF(dj.fs, res); /* Follow failed */ #if REALTIME dir = get_dir_ptr(dj.fs, dj.dir); #else dir = dj.dir; #endif if (!dir || (dir[DIR_Attr] & AM_DIR)) /* It is a directory */ LEAVE_FF(dj.fs, FR_NO_FILE); #if !_FS_READONLY if ((mode & FA_WRITE) && (dir[DIR_Attr] & AM_RDO)) /* R/O violation */ LEAVE_FF(dj.fs, FR_DENIED); } fp->dir_sect = dj.fs->winsect; /* Pointer to the directory entry */ fp->dir_ptr = dj.dir; #endif fp->flag = mode; /* File access mode */ fp->org_clust = /* File start cluster */ ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); fp->fsize = LD_DWORD(dir+DIR_FileSize); /* File size */ fp->fptr = 0; fp->csect = 255; /* File pointer */ fp->dsect = 0; fp->fs = dj.fs; fp->id = dj.fs->id; /* Owner file system object of the file */ #if REALTIME if (fp && fp->fs && fp->fs->buffer_used) if (sync_win_buffers(fp->fs) != RES_OK) return FR_DISK_ERR; if (fp && fp->fs) move_window(fp->fs, 0); #endif LEAVE_FF(dj.fs, FR_OK); } /*-----------------------------------------------------------------------*/ /* Read File */ /*-----------------------------------------------------------------------*/ FRESULT f_read (FIL *fp, /* Pointer to the file object */ void *buff, /* Pointer to data buffer */ UINT btr, /* Number of bytes to read */ UINT *br) /* Pointer to number of bytes read */ { FRESULT res; DWORD clst, sect, remain; UINT rcnt, cc; BYTE *rbuff = buff; *br = 0; /* Initialize bytes read */ res = validate(fp->fs, fp->id); /* Check validity of the object */ if (res != FR_OK) LEAVE_FF(fp->fs, res); if (fp->flag & FA__ERROR) /* Check abort flag */ LEAVE_FF(fp->fs, FR_INT_ERR); if (!(fp->flag & FA_READ)) /* Check access mode */ LEAVE_FF(fp->fs, FR_DENIED); remain = fp->fsize - fp->fptr; if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ for ( ; btr; /* Repeat until all data transferred */ rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt) { if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ clst = (fp->fptr == 0) ? /* On the top of the file? */ fp->org_clust : get_fat(fp->fs, fp->curr_clust); if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); fp->curr_clust = clst; /* Update current cluster */ fp->csect = 0; /* Reset sector offset in the cluster */ } sect = clust2sect(fp->fs, fp->curr_clust); /* Get current sector */ if (!sect) ABORT(fp->fs, FR_INT_ERR); sect += fp->csect; cc = btr / SS(fp->fs); /* When remaining bytes >= sector size, */ if (cc) { /* Read maximum contiguous sectors directly */ if (fp->csect + cc > fp->fs->csize) /* Clip at cluster boundary */ cc = fp->fs->csize - fp->csect; if (disk_read(fp->fs->drive, rbuff, sect, (BYTE)cc) != RES_OK) ABORT(fp->fs, FR_DISK_ERR); #if !_FS_READONLY && _FS_MINIMIZE <= 2 #if _FS_TINY if (fp->fs->wflag && fp->fs->winsect - sect < cc) /* Replace one of the read sectors with cached data if it contains a dirty sector */ memcpy(rbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), fp->fs->win, SS(fp->fs)); #else if ((fp->flag & FA__DIRTY) && fp->dsect - sect < cc) /* Replace one of the read sectors with cached data if it contains a dirty sector */ memcpy(rbuff + ((fp->dsect - sect) * SS(fp->fs)), fp->buf, SS(fp->fs)); #endif #endif fp->csect += (BYTE)cc; /* Next sector address in the cluster */ rcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ continue; } #if !_FS_TINY #if !_FS_READONLY if (fp->flag & FA__DIRTY) { /* Write sector I/O buffer if needed */ if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) ABORT(fp->fs, FR_DISK_ERR); fp->flag &= ~FA__DIRTY; } #endif if (fp->dsect != sect) { /* Fill sector buffer with file data */ if (disk_read(fp->fs->drive, fp->buf, sect, 1) != RES_OK) ABORT(fp->fs, FR_DISK_ERR); } #endif fp->dsect = sect; fp->csect++; /* Next sector address in the cluster */ } rcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs)); /* Get partial sector data from sector buffer */ if (rcnt > btr) rcnt = btr; #if _FS_TINY if (move_window(fp->fs, fp->dsect)) /* Move sector window */ ABORT(fp->fs, FR_DISK_ERR); memcpy(rbuff, &fp->fs->win[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ #else memcpy(rbuff, &fp->buf[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ #endif } LEAVE_FF(fp->fs, FR_OK); } #if !_FS_READONLY /*-----------------------------------------------------------------------*/ /* Write File */ /*-----------------------------------------------------------------------*/ FRESULT f_write (FIL *fp, /* Pointer to the file object */ const void *buff, /* Pointer to the data to be written */ UINT btw, /* Number of bytes to write */ UINT *bw) /* Pointer to number of bytes written */ { FRESULT res; DWORD clst, sect; UINT wcnt, cc; const BYTE *wbuff = buff; *bw = 0; /* Initialize bytes written */ res = validate(fp->fs, fp->id); /* Check validity of the object */ if (res != FR_OK) LEAVE_FF(fp->fs, res); if (fp->flag & FA__ERROR) /* Check abort flag */ LEAVE_FF(fp->fs, FR_INT_ERR); if (!(fp->flag & FA_WRITE)) /* Check access mode */ LEAVE_FF(fp->fs, FR_DENIED); if (fp->fsize + btw < fp->fsize) btw = 0; /* File size cannot reach 4GB */ for ( ; btw; /* Repeat until all data transferred */ wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) { if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ if (fp->fptr == 0) { /* On the top of the file? */ clst = fp->org_clust; /* Follow from the origin */ if (clst == 0) /* When there is no cluster chain, */ fp->org_clust = clst = create_chain(fp->fs, 0); /* Create a new cluster chain */ } else { /* Middle or end of the file */ clst = create_chain(fp->fs, fp->curr_clust); /* Follow or streach cluster chain */ } if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ if (clst == 1) ABORT(fp->fs, FR_INT_ERR); if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); fp->curr_clust = clst; /* Update current cluster */ fp->csect = 0; /* Reset sector address in the cluster */ } #if _FS_TINY if (fp->fs->winsect == fp->dsect && move_window(fp->fs, 0)) /* Write back data buffer prior to following direct transfer */ ABORT(fp->fs, FR_DISK_ERR); #else if (fp->flag & FA__DIRTY) { /* Write back data buffer prior to following direct transfer */ if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) ABORT(fp->fs, FR_DISK_ERR); fp->flag &= ~FA__DIRTY; } #endif sect = clust2sect(fp->fs, fp->curr_clust); /* Get current sector */ if (!sect) ABORT(fp->fs, FR_INT_ERR); sect += fp->csect; cc = btw / SS(fp->fs); /* When remaining bytes >= sector size, */ if (cc) { /* Write maximum contiguous sectors directly */ if (fp->csect + cc > fp->fs->csize) /* Clip at cluster boundary */ cc = fp->fs->csize - fp->csect; if (disk_write(fp->fs->drive, wbuff, sect, (BYTE)cc) != RES_OK) ABORT(fp->fs, FR_DISK_ERR); #if _FS_TINY if (fp->fs->winsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */ memcpy(fp->fs->win, wbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), SS(fp->fs)); fp->fs->wflag = 0; } #else if (fp->dsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */ memcpy(fp->buf, wbuff + ((fp->dsect - sect) * SS(fp->fs)), SS(fp->fs)); fp->flag &= ~FA__DIRTY; } #endif fp->csect += (BYTE)cc; /* Next sector address in the cluster */ wcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ continue; } #if _FS_TINY if (fp->fptr >= fp->fsize) { /* Avoid silly buffer filling at growing edge */ if (move_window(fp->fs, 0)) ABORT(fp->fs, FR_DISK_ERR); fp->fs->winsect = sect; } #else if (fp->dsect != sect) { /* Fill sector buffer with file data */ if (fp->fptr < fp->fsize){ if (disk_read(fp->fs->drive, fp->buf, sect, 1) != RES_OK) ABORT(fp->fs, FR_DISK_ERR); } } #endif fp->dsect = sect; fp->csect++; /* Next sector address in the cluster */ } wcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs)); /* Put partial sector into file I/O buffer */ if (wcnt > btw) wcnt = btw; #if _FS_TINY if (move_window(fp->fs, fp->dsect)) /* Move sector window */ ABORT(fp->fs, FR_DISK_ERR); memcpy(&fp->fs->win[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ fp->fs->wflag = 1; #else memcpy(&fp->buf[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ fp->flag |= FA__DIRTY; #endif } if (fp->fptr > fp->fsize) fp->fsize = fp->fptr; /* Update file size if needed */ fp->flag |= FA__WRITTEN; /* Set file changed flag */ LEAVE_FF(fp->fs, FR_OK); } /*-----------------------------------------------------------------------*/ /* Synchronize the File Object */ /*-----------------------------------------------------------------------*/ FRESULT f_sync (FIL *fp) /* Pointer to the file object */ { FRESULT res; DWORD tim; BYTE *dir; res = validate(fp->fs, fp->id); /* Check validity of the object */ if (res == FR_OK) { if (fp->flag & FA__WRITTEN) { /* Has the file been written? */ #if !_FS_TINY /* Write-back dirty buffer */ if (fp->flag & FA__DIRTY) { if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) LEAVE_FF(fp->fs, FR_DISK_ERR); fp->flag &= ~FA__DIRTY; } #endif /* Update the directory entry */ res = move_window(fp->fs, fp->dir_sect); if (res == FR_OK) { #if REALTIME dir = get_dir_ptr(fp->fs, fp->dir_ptr); #else dir = fp->dir_ptr; #endif dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ ST_DWORD(dir+DIR_FileSize, fp->fsize); /* Update file size */ ST_WORD(dir+DIR_FstClusLO, fp->org_clust); /* Update start cluster */ ST_WORD(dir+DIR_FstClusHI, fp->org_clust >> 16); tim = get_fattime(); /* Updated time */ ST_DWORD(dir+DIR_WrtTime, tim); fp->flag &= ~FA__WRITTEN; fp->fs->wflag = 1; res = sync(fp->fs); } } } #if REALTIME if (fp && fp->fs && fp->fs->buffer_used) if (sync_win_buffers(fp->fs) != RES_OK) return FR_DISK_ERR; if (fp && fp->fs) move_window(fp->fs, 0); #endif LEAVE_FF(fp->fs, res); } #endif /* !_FS_READONLY */ /*-----------------------------------------------------------------------*/ /* Close File */ /*-----------------------------------------------------------------------*/ FRESULT f_close (FIL *fp) /* Pointer to the file object to be closed */ { FRESULT res; #if _FS_READONLY FATFS *fs = fp->fs; res = validate(fp->fs, fp->id); if (res == FR_OK) fp->fs = NULL; LEAVE_FF(fs, res); #else res = f_sync(fp); #if REALTIME if (fp && fp->fs && fp->fs->buffer_used) if (sync_win_buffers(fp->fs) != RES_OK) return FR_DISK_ERR; if (fp && fp->fs) move_window(fp->fs, 0); #endif if (res == FR_OK) fp->fs = NULL; return res; #endif } /*-----------------------------------------------------------------------*/ /* Change Current Drive/Directory */ /*-----------------------------------------------------------------------*/ #if _FS_RPATH FRESULT f_chdrive (BYTE drv) /* Drive number */ { if (drv >= _DRIVES) return FR_INVALID_DRIVE; Drive = drv; return FR_OK; } FRESULT f_chdir ( const XCHAR *path /* Pointer to the directory path */ ) { FRESULT res; DIR dj; NAMEBUF(sfn, lfn); BYTE *dir; res = chk_mounted(&path, &dj.fs, 0); if (res == FR_OK) { INITBUF(dj, sfn, lfn); res = follow_path(&dj, path); /* Follow the file path */ if (res == FR_OK) { /* Follow completed */ #if REALTIME dir = get_dir_ptr(dj.fs, dj.dir); #else dir = dj.dir; /* Pointer to the entry */ #endif if (!dir) { dj.fs->cdir = 0; /* No entry (root dir) */ } else { if (dir[DIR_Attr] & AM_DIR) /* Reached to the dir */ dj.fs->cdir = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); else res = FR_NO_PATH; /* Could not reach the dir (it is a file) */ } } if (res == FR_NO_FILE) res = FR_NO_PATH; } LEAVE_FF(dj.fs, res); } #endif #if _FS_MINIMIZE <= 2 /*-----------------------------------------------------------------------*/ /* Seek File R/W Pointer */ /*-----------------------------------------------------------------------*/ FRESULT f_lseek (FIL *fp, LONG ofs) /* File pointer from top of file */ { FRESULT res; DWORD clst, bcs, nsect, ifptr; res = validate(fp->fs, fp->id); /* Check validity of the object */ if (res != FR_OK) LEAVE_FF(fp->fs, res); if (fp->flag & FA__ERROR) /* Check abort flag */ LEAVE_FF(fp->fs, FR_INT_ERR); if (ofs > fp->fsize /* In read-only mode, clip offset with the file size */ #if !_FS_READONLY && !(fp->flag & FA_WRITE) #endif ) ofs = fp->fsize; ifptr = fp->fptr; fp->fptr = nsect = 0; fp->csect = 255; if (ofs > 0) { bcs = (DWORD)fp->fs->csize * SS(fp->fs); /* Cluster size (byte) */ if (ifptr > 0 && (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ fp->fptr = (ifptr - 1) & ~(bcs - 1); /* start from the current cluster */ ofs -= fp->fptr; clst = fp->curr_clust; } else { /* When seek to back cluster, */ clst = fp->org_clust; /* start from the first cluster */ #if !_FS_READONLY if (clst == 0) { /* If no cluster chain, create a new chain */ clst = create_chain(fp->fs, 0); if (clst == 1) ABORT(fp->fs, FR_INT_ERR); if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); fp->org_clust = clst; } #endif fp->curr_clust = clst; } if (clst != 0) { while (ofs > bcs) { /* Cluster following loop */ #if !_FS_READONLY if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ clst = create_chain(fp->fs, clst); /* Force streached if in write mode */ if (clst == 0) { /* When disk gets full, clip file size */ ofs = bcs; break; } } else #endif clst = get_fat(fp->fs, clst); /* Follow cluster chain if not in write mode */ if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); if (clst <= 1 || clst >= fp->fs->max_clust) ABORT(fp->fs, FR_INT_ERR); fp->curr_clust = clst; fp->fptr += bcs; ofs -= bcs; } fp->fptr += ofs; fp->csect = (BYTE)(ofs / SS(fp->fs)); /* Sector offset in the cluster */ if (ofs % SS(fp->fs)) { nsect = clust2sect(fp->fs, clst); /* Current sector */ if (!nsect) ABORT(fp->fs, FR_INT_ERR); nsect += fp->csect; fp->csect++; } } } if (fp->fptr % SS(fp->fs) && nsect != fp->dsect) { #if !_FS_TINY #if !_FS_READONLY if (fp->flag & FA__DIRTY) { /* Write-back dirty buffer if needed */ if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) ABORT(fp->fs, FR_DISK_ERR); fp->flag &= ~FA__DIRTY; } #endif if (disk_read(fp->fs->drive, fp->buf, nsect, 1) != RES_OK) ABORT(fp->fs, FR_DISK_ERR); #endif fp->dsect = nsect; } #if !_FS_READONLY if (fp->fptr > fp->fsize) { /* Set changed flag if the file size is extended */ fp->fsize = fp->fptr; fp->flag |= FA__WRITTEN; } #endif LEAVE_FF(fp->fs, res); } #if _FS_MINIMIZE <= 1 /*-----------------------------------------------------------------------*/ /* Create a Directroy Object */ /*-----------------------------------------------------------------------*/ FRESULT f_opendir (DIR *dj, /* Pointer to directory object to create */ const XCHAR *path) /* Pointer to the directory path */ { FRESULT res; NAMEBUF(sfn, lfn); BYTE *dir; res = chk_mounted(&path, &dj->fs, 0); if (res == FR_OK) { INITBUF((*dj), sfn, lfn); res = follow_path(dj, path); /* Follow the path to the directory */ if (res == FR_OK) { /* Follow completed */ #if REALTIME dir = get_dir_ptr(dj->fs, dj->dir); #else dir = dj->dir; #endif if (dir) { /* It is not the root dir */ if (dir[DIR_Attr] & AM_DIR) { /* The object is a directory */ dj->sclust = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); } else { /* The object is not a directory */ res = FR_NO_PATH; } } if (res == FR_OK) { dj->id = dj->fs->id; res = dir_seek(dj, 0); /* Rewind dir */ } } if (res == FR_NO_FILE) res = FR_NO_PATH; } LEAVE_FF(dj->fs, res); } /*-----------------------------------------------------------------------*/ /* Read Directory Entry in Sequense */ /*-----------------------------------------------------------------------*/ FRESULT f_readdir (DIR *dj, /* Pointer to the open directory object */ FILINFO *fno) /* Pointer to file information to return */ { FRESULT res; NAMEBUF(sfn, lfn); res = validate(dj->fs, dj->id); /* Check validity of the object */ if (res == FR_OK) { INITBUF((*dj), sfn, lfn); if (!fno) { res = dir_seek(dj, 0); } else { res = dir_read(dj); if (res == FR_NO_FILE) { dj->sect = 0; res = FR_OK; } if (res == FR_OK) { /* A valid entry is found */ get_fileinfo(dj, fno); /* Get the object information */ res = dir_next(dj, FALSE); /* Increment index for next */ if (res == FR_NO_FILE) { dj->sect = 0; res = FR_OK; } } } } LEAVE_FF(dj->fs, res); } #if _FS_MINIMIZE == 0 /*-----------------------------------------------------------------------*/ /* Get File Status */ /*-----------------------------------------------------------------------*/ FRESULT f_stat (const XCHAR *path, /* Pointer to the file path */ FILINFO *fno) /* Pointer to file information to return */ { FRESULT res; DIR dj; NAMEBUF(sfn, lfn); res = chk_mounted(&path, &dj.fs, 0); if (res == FR_OK) { INITBUF(dj, sfn, lfn); res = follow_path(&dj, path); /* Follow the file path */ if (res == FR_OK) { /* Follwo completed */ #if REALTIME if (get_dir_ptr(dj.fs, dj.dir)) #else if (dj.dir) /* Found an object */ #endif get_fileinfo(&dj, fno); else /* It is root dir */ res = FR_INVALID_NAME; } } LEAVE_FF(dj.fs, res); } #if !_FS_READONLY /*-----------------------------------------------------------------------*/ /* Get Number of Free Clusters */ /*-----------------------------------------------------------------------*/ FRESULT f_getfree ( const XCHAR *path, /* Pointer to the logical drive number (root dir) */ DWORD *nclst, /* Pointer to the variable to return number of free clusters */ FATFS **fatfs /* Pointer to pointer to corresponding file system object to return */ ) { FRESULT res; DWORD n, clst, sect, stat; UINT i; BYTE fat, *p; /* Get drive number */ res = chk_mounted(&path, fatfs, 0); if (res != FR_OK) LEAVE_FF(*fatfs, res); /* If number of free cluster is valid, return it without cluster scan. */ if ((*fatfs)->free_clust <= (*fatfs)->max_clust - 2) { *nclst = (*fatfs)->free_clust; LEAVE_FF(*fatfs, FR_OK); } /* Get number of free clusters */ fat = (*fatfs)->fs_type; n = 0; if (fat == FS_FAT12) { clst = 2; do { stat = get_fat(*fatfs, clst); if (stat == 0xFFFFFFFF) LEAVE_FF(*fatfs, FR_DISK_ERR); if (stat == 1) LEAVE_FF(*fatfs, FR_INT_ERR); if (stat == 0) n++; } while (++clst < (*fatfs)->max_clust); } else { clst = (*fatfs)->max_clust; sect = (*fatfs)->fatbase; i = 0; p = 0; do { if (!i) { res = move_window(*fatfs, sect++); if (res != FR_OK) LEAVE_FF(*fatfs, res); p = (*fatfs)->win; i = SS(*fatfs); } if (fat == FS_FAT16) { if (LD_WORD(p) == 0) n++; p += 2; i -= 2; } else { if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) n++; p += 4; i -= 4; } } while (--clst); } (*fatfs)->free_clust = n; if (fat == FS_FAT32) (*fatfs)->fsi_flag = 1; *nclst = n; LEAVE_FF(*fatfs, FR_OK); } /*-----------------------------------------------------------------------*/ /* Truncate File */ /*-----------------------------------------------------------------------*/ FRESULT f_truncate ( FIL *fp /* Pointer to the file object */ ) { FRESULT res; DWORD ncl; res = validate(fp->fs, fp->id); /* Check validity of the object */ if (res != FR_OK) LEAVE_FF(fp->fs, res); if (fp->flag & FA__ERROR) /* Check abort flag */ LEAVE_FF(fp->fs, FR_INT_ERR); if (!(fp->flag & FA_WRITE)) /* Check access mode */ LEAVE_FF(fp->fs, FR_DENIED); if (fp->fsize > fp->fptr) { fp->fsize = fp->fptr; /* Set file size to current R/W point */ fp->flag |= FA__WRITTEN; if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ res = remove_chain(fp->fs, fp->org_clust); fp->org_clust = 0; } else { /* When truncate a part of the file, remove remaining clusters */ ncl = get_fat(fp->fs, fp->curr_clust); res = FR_OK; if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; if (ncl == 1) res = FR_INT_ERR; if (res == FR_OK && ncl < fp->fs->max_clust) { res = put_fat(fp->fs, fp->curr_clust, 0x0FFFFFFF); if (res == FR_OK) res = remove_chain(fp->fs, ncl); } } } if (res != FR_OK) fp->flag |= FA__ERROR; LEAVE_FF(fp->fs, res); } /*-----------------------------------------------------------------------*/ /* Delete a File or Directory */ /*-----------------------------------------------------------------------*/ FRESULT f_unlink (const XCHAR *path) /* Pointer to the file or directory path */ { FRESULT res; DIR dj, sdj; NAMEBUF(sfn, lfn); BYTE *dir; DWORD dclst; res = chk_mounted(&path, &dj.fs, 1); if (res != FR_OK) LEAVE_FF(dj.fs, res); INITBUF(dj, sfn, lfn); res = follow_path(&dj, path); /* Follow the file path */ if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) res = FR_INVALID_NAME; if (res != FR_OK) LEAVE_FF(dj.fs, res); /* Follow failed */ #if REALTIME dir = get_dir_ptr(dj.fs, dj.dir); #else dir = dj.dir; #endif if (!dir) /* Is it the root directory? */ LEAVE_FF(dj.fs, FR_INVALID_NAME); if (dir[DIR_Attr] & AM_RDO) /* Is it a R/O object? */ LEAVE_FF(dj.fs, FR_DENIED); dclst = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); if (dir[DIR_Attr] & AM_DIR) { /* It is a sub-directory */ if (dclst < 2) LEAVE_FF(dj.fs, FR_INT_ERR); memcpy(&sdj, &dj, sizeof(DIR)); /* Check if the sub-dir is empty or not */ sdj.sclust = dclst; res = dir_seek(&sdj, 2); if (res != FR_OK) LEAVE_FF(dj.fs, res); res = dir_read(&sdj); if (res == FR_OK) res = FR_DENIED; /* Not empty sub-dir */ if (res != FR_NO_FILE) LEAVE_FF(dj.fs, res); } res = dir_remove(&dj); /* Remove directory entry */ if (res == FR_OK) { if (dclst) res = remove_chain(dj.fs, dclst); /* Remove the cluster chain */ if (res == FR_OK) res = sync(dj.fs); } #if REALTIME if (dj.fs && dj.fs->buffer_used) if (sync_win_buffers(dj.fs) != RES_OK) return FR_DISK_ERR; if (dj.fs) move_window(dj.fs, 0); #endif LEAVE_FF(dj.fs, res); } /*-----------------------------------------------------------------------*/ /* Create a Directory */ /*-----------------------------------------------------------------------*/ FRESULT f_mkdir (const XCHAR *path) /* Pointer to the directory path */ { FRESULT res; DIR dj; NAMEBUF(sfn, lfn); BYTE *dir, n; DWORD dsect, dclst, pclst, tim; res = chk_mounted(&path, &dj.fs, 1); if (res != FR_OK) LEAVE_FF(dj.fs, res); INITBUF(dj, sfn, lfn); res = follow_path(&dj, path); /* Follow the file path */ if (res == FR_OK) res = FR_EXIST; /* Any file or directory is already existing */ if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NS] & NS_DOT)) res = FR_INVALID_NAME; if (res != FR_NO_FILE) /* Any error occured */ LEAVE_FF(dj.fs, res); dclst = create_chain(dj.fs, 0); /* Allocate a new cluster for new directory table */ res = FR_OK; if (dclst == 0) res = FR_DENIED; if (dclst == 1) res = FR_INT_ERR; if (dclst == 0xFFFFFFFF) res = FR_DISK_ERR; if (res == FR_OK) res = move_window(dj.fs, 0); if (res != FR_OK) LEAVE_FF(dj.fs, res); dsect = clust2sect(dj.fs, dclst); dir = dj.fs->win; /* Initialize the new directory table */ memset(dir, 0, SS(dj.fs)); memset(dir+DIR_Name, ' ', 8+3); /* Create "." entry */ dir[DIR_Name] = '.'; dir[DIR_Attr] = AM_DIR; tim = get_fattime(); ST_DWORD(dir+DIR_WrtTime, tim); ST_WORD(dir+DIR_FstClusLO, dclst); ST_WORD(dir+DIR_FstClusHI, dclst >> 16); memcpy(dir+32, dir, 32); /* Create ".." entry */ dir[33] = '.'; pclst = dj.sclust; if (dj.fs->fs_type == FS_FAT32 && pclst == dj.fs->dirbase) pclst = 0; ST_WORD(dir+32+DIR_FstClusLO, pclst); ST_WORD(dir+32+DIR_FstClusHI, pclst >> 16); for (n = 0; n < dj.fs->csize; n++) { /* Write dot entries and clear left sectors */ dj.fs->winsect = dsect++; dj.fs->wflag = 1; res = move_window(dj.fs, 0); if (res) LEAVE_FF(dj.fs, res); #if REALTIME dir = dj.fs->win; #endif memset(dir, 0, SS(dj.fs)); } res = dir_register(&dj); if (res != FR_OK) { remove_chain(dj.fs, dclst); } else { #if REALTIME dir = get_dir_ptr(dj.fs, dj.dir); #else dir = dj.dir; #endif dir[DIR_Attr] = AM_DIR; /* Attribute */ ST_DWORD(dir+DIR_WrtTime, tim); /* Crated time */ ST_WORD(dir+DIR_FstClusLO, dclst); /* Table start cluster */ ST_WORD(dir+DIR_FstClusHI, dclst >> 16); dj.fs->wflag = 1; res = sync(dj.fs); } #if REALTIME if (dj.fs && dj.fs->buffer_used) if (sync_win_buffers(dj.fs) != RES_OK) return FR_DISK_ERR; if (dj.fs) move_window(dj.fs, 0); #endif LEAVE_FF(dj.fs, res); } /*-----------------------------------------------------------------------*/ /* Change File Attribute */ /*-----------------------------------------------------------------------*/ FRESULT f_chmod (const XCHAR *path, /* Pointer to the file path */ BYTE value, /* Attribute bits */ BYTE mask) /* Attribute mask to change */ { FRESULT res; DIR dj; NAMEBUF(sfn, lfn); BYTE *dir; res = chk_mounted(&path, &dj.fs, 1); if (res == FR_OK) { INITBUF(dj, sfn, lfn); res = follow_path(&dj, path); /* Follow the file path */ if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) res = FR_INVALID_NAME; if (res == FR_OK) { #if REALTIME dir = get_dir_ptr(dj.fs, dj.dir); #else dir = dj.dir; #endif if (!dir) { /* Is it a root directory? */ res = FR_INVALID_NAME; } else { /* File or sub directory */ mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ dir[DIR_Attr] = (value & mask) | (dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ dj.fs->wflag = 1; res = sync(dj.fs); } } } #if REALTIME if (dj.fs && dj.fs->buffer_used) if (sync_win_buffers(dj.fs) != RES_OK) return FR_DISK_ERR; if (dj.fs) move_window(dj.fs, 0); #endif LEAVE_FF(dj.fs, res); } /*-----------------------------------------------------------------------*/ /* Change Timestamp */ /*-----------------------------------------------------------------------*/ FRESULT f_utime (const XCHAR *path, /* Pointer to the file/directory name */ const FILINFO *fno) /* Pointer to the timestamp to be set */ { FRESULT res; DIR dj; NAMEBUF(sfn, lfn); BYTE *dir; res = chk_mounted(&path, &dj.fs, 1); if (res == FR_OK) { INITBUF(dj, sfn, lfn); res = follow_path(&dj, path); /* Follow the file path */ if (_FS_RPATH && res == FR_OK && (dj.fn[11] & NS_DOT)) res = FR_INVALID_NAME; if (res == FR_OK) { #if REALTIME dir = get_dir_ptr(dj.fs, dj.dir); #else dir = dj.dir; #endif if (!dir) { /* Root directory */ res = FR_INVALID_NAME; } else { /* File or sub-directory */ ST_WORD(dir+DIR_WrtTime, fno->ftime); ST_WORD(dir+DIR_WrtDate, fno->fdate); dj.fs->wflag = 1; res = sync(dj.fs); } } } #if REALTIME if (dj.fs && dj.fs->buffer_used) if (sync_win_buffers(dj.fs) != RES_OK) return FR_DISK_ERR; if (dj.fs) move_window(dj.fs, 0); #endif LEAVE_FF(dj.fs, res); } /*-----------------------------------------------------------------------*/ /* Rename File/Directory */ /*-----------------------------------------------------------------------*/ FRESULT f_rename (const XCHAR *path_old, /* Pointer to the old name */ const XCHAR *path_new) /* Pointer to the new name */ { FRESULT res = 0; DIR dj_old, dj_new; NAMEBUF(sfn, lfn); BYTE buf[21], *dir; DWORD dw; INITBUF(dj_old, sfn, lfn); res = chk_mounted(&path_old, &dj_old.fs, 1); if (res == FR_OK) { dj_new.fs = dj_old.fs; res = follow_path(&dj_old, path_old); /* Check old object */ if (_FS_RPATH && res == FR_OK && (dj_old.fn[NS] & NS_DOT)) res = FR_INVALID_NAME; } if (res != FR_OK) LEAVE_FF(dj_old.fs, res); /* The old object is not found */ if (!dj_old.dir) LEAVE_FF(dj_old.fs, FR_NO_FILE); /* Is root dir? */ memcpy(buf, dj_old.dir+DIR_Attr, 21); /* Save the object information */ memcpy(&dj_new, &dj_old, sizeof(DIR)); res = follow_path(&dj_new, path_new); /* Check new object */ if (res == FR_OK) res = FR_EXIST; /* The new object name is already existing */ if (res == FR_NO_FILE) { /* Is it a valid path and no name collision? */ res = dir_register(&dj_new); /* Register the new object */ if (res == FR_OK) { #if REALTIME dir = get_dir_ptr(dj_new.fs, dj_new.dir); #else dir = dj_new.dir; /* Copy object information into new entry */ #endif memcpy(dir+13, buf+2, 19); dir[DIR_Attr] = buf[0] | AM_ARC; dj_old.fs->wflag = 1; if (dir[DIR_Attr] & AM_DIR) { /* Update .. entry in the directory if needed */ dw = clust2sect(dj_new.fs, (DWORD)LD_WORD(dir+DIR_FstClusHI) | LD_WORD(dir+DIR_FstClusLO)); if (!dw) { res = FR_INT_ERR; } else { res = move_window(dj_new.fs, dw); dir = dj_new.fs->win+32; if (res == FR_OK && dir[1] == '.') { dw = (dj_new.fs->fs_type == FS_FAT32 && dj_new.sclust == dj_new.fs->dirbase) ? 0 : dj_new.sclust; ST_WORD(dir+DIR_FstClusLO, dw); ST_WORD(dir+DIR_FstClusHI, dw >> 16); dj_new.fs->wflag = 1; } } } if (res == FR_OK) { res = dir_remove(&dj_old); /* Remove old entry */ if (res == FR_OK) res = sync(dj_old.fs); } } } #if REALTIME if (dj_old.fs && dj_old.fs->buffer_used) if (sync_win_buffers(dj_old.fs) != RES_OK) return FR_DISK_ERR; if (dj_old.fs) move_window(dj_old.fs, 0); #endif LEAVE_FF(dj_old.fs, res); } #endif /* !_FS_READONLY */ #endif /* _FS_MINIMIZE == 0 */ #endif /* _FS_MINIMIZE <= 1 */ #endif /* _FS_MINIMIZE <= 2 */ /*-----------------------------------------------------------------------*/ /* Forward data to the stream directly (Available on only _FS_TINY cfg) */ /*-----------------------------------------------------------------------*/ #if _USE_FORWARD && _FS_TINY FRESULT f_forward (FIL *fp, /* Pointer to the file object */ UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ UINT btr, /* Number of bytes to forward */ UINT *bf) /* Pointer to number of bytes forwarded */ { FRESULT res; DWORD remain, clst, sect; UINT rcnt; *bf = 0; res = validate(fp->fs, fp->id); /* Check validity of the object */ if (res != FR_OK) LEAVE_FF(fp->fs, res); if (fp->flag & FA__ERROR) /* Check error flag */ LEAVE_FF(fp->fs, FR_INT_ERR); if (!(fp->flag & FA_READ)) /* Check access mode */ LEAVE_FF(fp->fs, FR_DENIED); remain = fp->fsize - fp->fptr; if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ for ( ; btr && (*func)(NULL, 0); /* Repeat until all data transferred or stream becomes busy */ fp->fptr += rcnt, *bf += rcnt, btr -= rcnt) { if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ clst = (fp->fptr == 0) ? /* On the top of the file? */ fp->org_clust : get_fat(fp->fs, fp->curr_clust); if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); fp->curr_clust = clst; /* Update current cluster */ fp->csect = 0; /* Reset sector address in the cluster */ } fp->csect++; /* Next sector address in the cluster */ } sect = clust2sect(fp->fs, fp->curr_clust); /* Get current data sector */ if (!sect) ABORT(fp->fs, FR_INT_ERR); sect += fp->csect - 1; if (move_window(fp->fs, sect)) /* Move sector window */ ABORT(fp->fs, FR_DISK_ERR); fp->dsect = sect; rcnt = SS(fp->fs) - (WORD)(fp->fptr % SS(fp->fs)); /* Forward data from sector window */ if (rcnt > btr) rcnt = btr; rcnt = (*func)(&fp->fs->win[(WORD)fp->fptr % SS(fp->fs)], rcnt); if (!rcnt) ABORT(fp->fs, FR_INT_ERR); } LEAVE_FF(fp->fs, FR_OK); } #endif /* _USE_FORWARD */ #if _USE_MKFS && !_FS_READONLY /*-----------------------------------------------------------------------*/ /* Create File System on the Drive */ /*-----------------------------------------------------------------------*/ #define N_ROOTDIR 512 /* Multiple of 32 and <= 2048 */ #define N_FATS 1 /* 1 or 2 */ #define MAX_SECTOR 131072000UL /* Maximum partition size */ #define MIN_SECTOR 2000UL /* Minimum partition size */ FRESULT f_mkfs (BYTE drv, /* Logical drive number */ BYTE partition, /* Partitioning rule 0:FDISK, 1:SFD */ WORD allocsize) /* Allocation unit size [bytes] */ { uint32_t sstbl[] = { 2048000UL, 1024000UL, 512000UL, 256000UL, 128000UL, 64000UL, 32000, 16000, 8000, 4000, 0 }; uint16_t cstbl[] = { 32768, 16384, 8192, 4096, 2048, 16384, 8192, 4096, 2048, 1024, 512 }; BYTE fmt, m, *tbl; DWORD b_part, b_fat, b_dir, b_data; /* Area offset (LBA) */ DWORD n_part, n_rsv, n_fat, n_dir; /* Area size */ DWORD n_clst, d, n; WORD ass; // fatfs uses 'as' but that's a keyword FATFS *fs; DSTATUS stat; /* Check validity of the parameters */ if (drv >= _DRIVES) return FR_INVALID_DRIVE; if (partition >= 2) return FR_MKFS_ABORTED; /* Check mounted drive and clear work area */ fs = FatFs[drv]; if (!fs) return FR_NOT_ENABLED; fs->fs_type = 0; drv = LD2PD(drv); /* Get disk statics */ stat = disk_initialize(drv); if (stat & STA_NOINIT) return FR_NOT_READY; if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; #if _MAX_SS != 512 /* Get disk sector size */ if (disk_ioctl(drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK || SS(fs) > _MAX_SS) return FR_MKFS_ABORTED; #endif if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_part) != RES_OK || n_part < MIN_SECTOR) return FR_MKFS_ABORTED; if (n_part > MAX_SECTOR) n_part = MAX_SECTOR; b_part = (!partition) ? 63 : 0; /* Boot sector */ n_part -= b_part; for (d = 512; d <= 32768U && d != allocsize; d <<= 1) ; /* Check validity of the allocation unit size */ if (d != allocsize) allocsize = 0; if (!allocsize) { /* Auto selection of cluster size */ d = n_part; for (ass = SS(fs); ass > 512U; ass >>= 1) d >>= 1; for (n = 0; d < sstbl[n]; n++) ; allocsize = cstbl[n]; } if (allocsize < SS(fs)) allocsize = SS(fs); allocsize /= SS(fs); /* Number of sectors per cluster */ /* Pre-compute number of clusters and FAT type */ n_clst = n_part / allocsize; fmt = FS_FAT12; if (n_clst >= 0xFF5) fmt = FS_FAT16; if (n_clst >= 0xFFF5) fmt = FS_FAT32; /* Determine offset and size of FAT structure */ switch (fmt) { case FS_FAT12: n_fat = ((n_clst * 3 + 1) / 2 + 3 + SS(fs) - 1) / SS(fs); n_rsv = 1 + partition; n_dir = N_ROOTDIR * 32 / SS(fs); break; case FS_FAT16: n_fat = ((n_clst * 2) + 4 + SS(fs) - 1) / SS(fs); n_rsv = 1 + partition; n_dir = N_ROOTDIR * 32 / SS(fs); break; default: n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); n_rsv = 33 - partition; n_dir = 0; } b_fat = b_part + n_rsv; /* FATs start sector */ b_dir = b_fat + n_fat * N_FATS; /* Directory start sector */ b_data = b_dir + n_dir; /* Data start sector */ /* Align data start sector to erase block boundary (for flash memory media) */ if (disk_ioctl(drv, GET_BLOCK_SIZE, &n) != RES_OK) return FR_MKFS_ABORTED; n = (b_data + n - 1) & ~(n - 1); n_fat += (n - b_data) / N_FATS; /* b_dir and b_data are no longer used below */ /* Determine number of cluster and final check of validity of the FAT type */ n_clst = (n_part - n_rsv - n_fat * N_FATS - n_dir) / allocsize; if ( (fmt == FS_FAT16 && n_clst < 0xFF5) || (fmt == FS_FAT32 && n_clst < 0xFFF5)) return FR_MKFS_ABORTED; /* Create partition table if needed */ if (!partition) { DWORD n_disk = b_part + n_part; memset(fs->win, 0, SS(fs)); tbl = fs->win+MBR_Table; ST_DWORD(tbl, 0x00010180); /* Partition start in CHS */ if (n_disk < 63UL * 255 * 1024) { /* Partition end in CHS */ n_disk = n_disk / 63 / 255; tbl[7] = (BYTE)n_disk; tbl[6] = (BYTE)((n_disk >> 2) | 63); } else { ST_WORD(&tbl[6], 0xFFFF); } tbl[5] = 254; if (fmt != FS_FAT32) /* System ID */ tbl[4] = (n_part < 0x10000) ? 0x04 : 0x06; else tbl[4] = 0x0c; ST_DWORD(tbl+8, 63); /* Partition start in LBA */ ST_DWORD(tbl+12, n_part); /* Partition size in LBA */ ST_WORD(tbl+64, 0xAA55); /* Signature */ if (disk_write(drv, fs->win, 0, 1) != RES_OK) return FR_DISK_ERR; partition = 0xF8; } else { partition = 0xF0; } /* Create boot record */ tbl = fs->win; /* Clear buffer */ memset(tbl, 0, SS(fs)); ST_DWORD(tbl+BS_jmpBoot, 0x90FEEB); /* Boot code (jmp $, nop) */ ST_WORD(tbl+BPB_BytsPerSec, SS(fs)); /* Sector size */ tbl[BPB_SecPerClus] = (BYTE)allocsize; /* Sectors per cluster */ ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ ST_WORD(tbl+BPB_RootEntCnt, SS(fs) / 32 * n_dir); /* Number of rootdir entries */ if (n_part < 0x10000) { /* Number of total sectors */ ST_WORD(tbl+BPB_TotSec16, n_part); } else { ST_DWORD(tbl+BPB_TotSec32, n_part); } tbl[BPB_Media] = partition; /* Media descripter */ ST_WORD(tbl+BPB_SecPerTrk, 63); /* Number of sectors per track */ ST_WORD(tbl+BPB_NumHeads, 255); /* Number of heads */ ST_DWORD(tbl+BPB_HiddSec, b_part); /* Hidden sectors */ n = get_fattime(); /* Use current time as a VSN */ if (fmt != FS_FAT32) { ST_DWORD(tbl+BS_VolID, n); /* Volume serial number */ ST_WORD(tbl+BPB_FATSz16, n_fat); /* Number of secters per FAT */ tbl[BS_DrvNum] = 0x80; /* Drive number */ tbl[BS_BootSig] = 0x29; /* Extended boot signature */ memcpy(tbl+BS_VolLab, "NO NAME FAT ", 19); /* Volume lavel, FAT signature */ } else { ST_DWORD(tbl+BS_VolID32, n); /* Volume serial number */ ST_DWORD(tbl+BPB_FATSz32, n_fat); /* Number of secters per FAT */ ST_DWORD(tbl+BPB_RootClus, 2); /* Root directory cluster (2) */ ST_WORD(tbl+BPB_FSInfo, 1); /* FSInfo record offset (bs+1) */ ST_WORD(tbl+BPB_BkBootSec, 6); /* Backup boot record offset (bs+6) */ tbl[BS_DrvNum32] = 0x80; /* Drive number */ tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ memcpy(tbl+BS_VolLab32, "NO NAME FAT32 ", 19); /* Volume lavel, FAT signature */ } ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature */ if (SS(fs) > 512U) { ST_WORD(tbl+SS(fs)-2, 0xAA55); } if (disk_write(drv, tbl, b_part+0, 1) != RES_OK) return FR_DISK_ERR; if (fmt == FS_FAT32) disk_write(drv, tbl, b_part+6, 1); /* Initialize FAT area */ for (m = 0; m < N_FATS; m++) { memset(tbl, 0, SS(fs)); /* 1st sector of the FAT */ if (fmt != FS_FAT32) { n = (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00; n |= partition; ST_DWORD(tbl, n); /* Reserve cluster #0-1 (FAT12/16) */ } else { ST_DWORD(tbl+0, 0xFFFFFFF8); /* Reserve cluster #0-1 (FAT32) */ ST_DWORD(tbl+4, 0xFFFFFFFF); ST_DWORD(tbl+8, 0x0FFFFFFF); /* Reserve cluster #2 for root dir */ } if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) return FR_DISK_ERR; memset(tbl, 0, SS(fs)); /* Following FAT entries are filled by zero */ for (n = 1; n < n_fat; n++) { if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) return FR_DISK_ERR; } } /* Initialize Root directory */ m = (BYTE)((fmt == FS_FAT32) ? allocsize : n_dir); do { if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) return FR_DISK_ERR; } while (--m); /* Create FSInfo record if needed */ if (fmt == FS_FAT32) { ST_WORD(tbl+BS_55AA, 0xAA55); ST_DWORD(tbl+FSI_LeadSig, 0x41615252); ST_DWORD(tbl+FSI_StrucSig, 0x61417272); ST_DWORD(tbl+FSI_Free_Count, n_clst - 1); ST_DWORD(tbl+FSI_Nxt_Free, 0xFFFFFFFF); disk_write(drv, tbl, b_part+1, 1); disk_write(drv, tbl, b_part+7, 1); } return (disk_ioctl(drv, CTRL_SYNC, (void*)NULL) == RES_OK) ? FR_OK : FR_DISK_ERR; } #endif /* _USE_MKFS && !_FS_READONLY */ #if _USE_STRFUNC /*-----------------------------------------------------------------------*/ /* Get a string from the file */ /*-----------------------------------------------------------------------*/ char* f_gets (char* buff, /* Pointer to the string buffer to read */ int len, /* Size of string buffer */ FIL* fil) /* Pointer to the file object */ { int i = 0; char *p = buff; UINT rc; while (i < len - 1) { /* Read bytes until buffer gets filled */ f_read(fil, p, 1, &rc); if (rc != 1) break; /* Break when no data to read */ #if _USE_STRFUNC >= 2 if (*p == '\r') continue; /* Strip '\r' */ #endif i++; if (*p++ == '\n') break; /* Break when reached end of line */ } *p = 0; return i ? buff : NULL; /* When no data read (eof or error), return with error. */ } #if !_FS_READONLY #include /*-----------------------------------------------------------------------*/ /* Put a character to the file */ /*-----------------------------------------------------------------------*/ int f_putc (int chr, /* A character to be output */ FIL* fil) /* Ponter to the file object */ { UINT bw; char c; #if _USE_STRFUNC >= 2 if (chr == '\n') f_putc ('\r', fil); /* LF -> CRLF conversion */ #endif if (!fil) { /* Special value may be used to switch the destination to any other device */ /* put_console(chr); */ return chr; } c = (char)chr; f_write(fil, &c, 1, &bw); /* Write a byte to the file */ return bw ? chr : EOF; /* Return the result */ } /*-----------------------------------------------------------------------*/ /* Put a string to the file */ /*-----------------------------------------------------------------------*/ int f_puts (const char* str, /* Pointer to the string to be output */ FIL* fil) /* Pointer to the file object */ { int n; for (n = 0; *str; str++, n++) { if (f_putc(*str, fil) == EOF) return EOF; } return n; } /*-----------------------------------------------------------------------*/ /* Put a formatted string to the file */ /*-----------------------------------------------------------------------*/ int f_printf (FIL* fil, /* Pointer to the file object */ const char* str, /* Pointer to the format string */ ...) /* Optional arguments... */ { va_list arp; UCHAR c, f, r; ULONG val; char s[16]; int i, w, res, cc; va_start(arp, str); for (cc = res = 0; cc != EOF; res += cc) { c = *str++; if (c == 0) break; /* End of string */ if (c != '%') { /* Non escape cahracter */ cc = f_putc(c, fil); if (cc != EOF) cc = 1; continue; } w = f = 0; c = *str++; if (c == '0') { /* Flag: '0' padding */ f = 1; c = *str++; } while (c >= '0' && c <= '9') { /* Precision */ w = w * 10 + (c - '0'); c = *str++; } if (c == 'l') { /* Prefix: Size is long int */ f |= 2; c = *str++; } if (c == 's') { /* Type is string */ cc = f_puts(va_arg(arp, char*), fil); continue; } if (c == 'c') { /* Type is character */ cc = f_putc(va_arg(arp, int), fil); if (cc != EOF) cc = 1; continue; } r = 0; if (c == 'd') r = 10; /* Type is signed decimal */ if (c == 'u') r = 10; /* Type is unsigned decimal */ if (c == 'X') r = 16; /* Type is unsigned hexdecimal */ if (r == 0) break; /* Unknown type */ if (f & 2) { /* Get the value */ val = (ULONG)va_arg(arp, long); } else { val = (c == 'd') ? (ULONG)(long)va_arg(arp, int) : (ULONG)va_arg(arp, unsigned int); } /* Put numeral string */ if (c == 'd') { if (val & 0x80000000) { val = 0 - val; f |= 4; } } i = sizeof(s) - 1; s[i] = 0; do { c = (UCHAR)(val % r + '0'); if (c > '9') c += 7; s[--i] = c; val /= r; } while (i && val); if (i && (f & 4)) s[--i] = '-'; w = sizeof(s) - 1 - w; while (i && i > w) s[--i] = (f & 1) ? '0' : ' '; cc = f_puts(&s[i], fil); } va_end(arp); return (cc == EOF) ? cc : res; } #endif /* !_FS_READONLY */ #endif /* _USE_STRFUNC */ } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/fatfs/README000066400000000000000000000035761207233610700237530ustar00rootroot00000000000000The FatFs implementation is a direct port of the ChaN FatFs project (http://elm-chan.org/fsw/ff/00index_e.html) to TinyOS. During testing of the initial port, Victor Cionca at University of Limerick discovered a great deal of overhead in the filesystem's cluster window operations, and devised an improved method to handle these without compromising the integrity of the fs. These are incorporated here. First note: Your app must call mount before proceeding with any other file operations. Boot.booted is a good place to do this. Application developers should note that FatFs development used the IP stack and NTP updates in order to provide accurate timestamps. tinyos-1.x/contrib/handhelds/swtest/TestFATLogging shows how to do this. Without these mechanisms, an application will need another method to seed the app's time value with something realistic (not 1/1/1980-relative) at compile time, or devise a way to provide a runtime update from a host. One way: ------- copy the simple python script timeSec.py in tinyos-2.x-contrib/shimmer/apps/JustFATLogging to your app directory. add these lines to your app's Makefile, which will provide a hook for the the compile time variable CURRENT_TIME. TimeP uses this to set the runtime g_current_time that sets the baseline for reporting localtime on the device: ifdef CURRENT_TIME PFLAGS += -DCURRENT_TIME=$(CURRENT_TIME) endif then, at compile-time, add CURRENT_TIME=`python ./timeSec.py` to the build line. unfortunately, this seed will be restored if you reset the board. Another way: ----------- add a mechanism to provide the current time from a host machine via serial line. one example of how to do this is in tinyos-1.x/contrib/handhelds/apps/ThreeAxisRecorder. Yet Another way: --------------- use the bluetooth radio to do similar (don't know why this would be easier than using the built-in access point-ip stack infrastructure...). tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/fatfs/ccsbcs.c000066400000000000000000000727011207233610700244730ustar00rootroot00000000000000/*------------------------------------------------------------------------*/ /* Unicode - Local code bidirectional converter (C)ChaN, 2009 */ /* (SBCS code pages) */ /*------------------------------------------------------------------------*/ /* 437 U.S. (OEM) / 720 Arabic (OEM) / 1256 Arabic (Windows) / 737 Greek (OEM) / 1253 Greek (Windows) / 1250 Central Europe (Windows) / 775 Baltic (OEM) / 1257 Baltic (Windows) / 850 Multilingual Latin 1 (OEM) / 852 Latin 2 (OEM) / 1252 Latin 1 (Windows) / 855 Cyrillic (OEM) / 1251 Cyrillic (Windows) / 866 Russian (OEM) / 857 Turkish (OEM) / 1254 Turkish (Windows) / 858 Multilingual Latin 1 + Euro (OEM) / 862 Hebrew (OEM) / 1255 Hebrew (Windows) / 874 Thai (OEM, Windows) / 1258 Vietnam (OEM, Windows) */ //#include "../ff.h" #if _CODE_PAGE == 437 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP437(0x80-0xFF) to Unicode conversion table */ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 720 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP720(0x80-0xFF) to Unicode conversion table */ 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0xO650, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 737 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP737(0x80-0xFF) to Unicode conversion table */ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 775 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP775(0x80-0xFF) to Unicode conversion table */ 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 850 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP850(0x80-0xFF) to Unicode conversion table */ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 852 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP852(0x80-0xFF) to Unicode conversion table */ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 855 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP855(0x80-0xFF) to Unicode conversion table */ 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 857 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP857(0x80-0xFF) to Unicode conversion table */ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 858 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP858(0x80-0xFF) to Unicode conversion table */ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x2550, 0x00A2, 0x00A5, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x20AC, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00C6, 0x00CC, 0x2580, 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 862 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP862(0x80-0xFF) to Unicode conversion table */ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 866 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP866(0x80-0xFF) to Unicode conversion table */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 874 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP874(0x80-0xFF) to Unicode conversion table */ 0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F, 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000 }; #elif _CODE_PAGE == 1250 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP1250(0x80-0xFF) to Unicode conversion table */ 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 }; #elif _CODE_PAGE == 1251 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP1251(0x80-0xFF) to Unicode conversion table */ 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2111, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042D, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F }; #elif _CODE_PAGE == 1252 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP1252(0x80-0xFF) to Unicode conversion table */ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000, 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF }; #elif _CODE_PAGE == 1253 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP1253(0x80-0xFF) to Unicode conversion table */ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AD, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000 }; #elif _CODE_PAGE == 1254 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP1254(0x80-0xFF) to Unicode conversion table */ 0x20AC, 0x0000, 0x210A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x0130, 0x015E, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF }; #elif _CODE_PAGE == 1255 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP1255(0x80-0xFF) to Unicode conversion table */ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000 }; #elif _CODE_PAGE == 1256 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP1256(0x80-0xFF) to Unicode conversion table */ 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0640, 0x0642, 0x0643, 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2 } #elif _CODE_PAGE == 1257 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP1257(0x80-0xFF) to Unicode conversion table */ 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8, 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000, 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x014E, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9 }; #elif _CODE_PAGE == 1258 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP1258(0x80-0xFF) to Unicode conversion table */ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF, 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF }; #endif #if !_TBLDEF || !_USE_LFN #error This file is not needed in current configuration #endif WCHAR ff_convert ( /* Converted character, Returns zero on error */ WCHAR src, /* Character code to be converted */ UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ ) { WCHAR c; if (src < 0x80) { /* ASCII */ c = src; } else { if (dir) { /* OEMCP to Unicode */ c = (src >= 0x100) ? 0 : Tbl[src - 0x80]; } else { /* Unicode to OEMCP */ for (c = 0; c < 0x80; c++) { if (src == Tbl[c]) break; } c = (c + 0x80) & 0xFF; } } return c; } WCHAR ff_wtoupper ( /* Upper converted character */ WCHAR chr /* Input character */ ) { static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; int i; for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; return tbl_lower[i] ? tbl_upper[i] : chr; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/fatfs/diskIOC.nc000066400000000000000000000052771207233610700247020ustar00rootroot00000000000000/* * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date April, 2009 * port to tos-2.x * @date January, 2010 * * wire the FatFs interface to the current implementation * wire the diskIO abstraction in the FatFs module to physical medium */ configuration diskIOC { provides { interface FatFs; interface StdControl as diskIOStdControl; interface SD as diskIO; } } implementation { components FatFsP, SDC, // new Msp430Usart0C(), new TimerMilliC(), // HplMsp430InterruptP, LedsC, TimeP; //, NTPClientM; FatFs = FatFsP; diskIOStdControl = SDC; // diskIOStdControl = TimeP; diskIO = SDC; FatFsP.Leds -> LedsC; components TimeC; FatFsP.Time -> TimeC; // FatFsP.Time -> TimeP; /* SDP.Usart -> Msp430Usart0C; SDP.DockInterrupt -> HplMsp430InterruptP.Port23; SDP.Leds -> LedsC; */ /* components Counter32khz64C as Counter; components new CounterToLocalTime64C(T32khz); CounterToLocalTime64C.Counter -> Counter; TimeP.LocalTime64 -> CounterToLocalTime64C; TimeP.Timer -> TimerMilliC; */ } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/fatfs/diskio.c000066400000000000000000000131531207233610700245110ustar00rootroot00000000000000/*----------------------------------------------------------------------------/ / FatFs module is an open source project to implement FAT file system to small / embedded systems. It is opened for education, research and development under / license policy of following trems. / / Copyright (C) 2009, ChaN, all right reserved. / / * The FatFs module is a free software and there is no warranty. / * You can use, modify and/or redistribute it for personal, non-profit or / commercial use without any restriction under your responsibility. / * Redistributions of source code must retain the above copyright notice. / /----------------------------------------------------------------------------*/ /* * Most of this code: * * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * tinyos instantiation of ChaN's diskio stubs (thank you!): * function declarations are kept from ChaN's code to make updating easier; * contents of these point to abstract calls -- as "diskio" -- * to real physical io; for now, the control will point to SD. * * @author Steve Ayer * @date April, 2009 * ported from tos-1.x * @date January, 2010 */ #include "diskio.h" static BOOL disk_available, disk_initialized; DSTATUS disk_initialize (BYTE drv) // we only have one { if(!disk_initialized){ atomic disk_available = TRUE; call diskIOStdControl.start(); atomic disk_initialized = TRUE; } return 0; } void disable_disk() { atomic disk_available = FALSE; disk_initialized = FALSE; call diskIOStdControl.stop(); } void dock_disk() { atomic disk_available = FALSE; call diskIOStdControl.start(); } DSTATUS disk_status (BYTE drv) // just one { atomic { if(!disk_available) return STA_NOINIT; } return FR_OK; } DRESULT disk_read (BYTE drv, BYTE * buff, /* Data buffer to store read data */ DWORD sector, /* Sector address (LBA) */ BYTE count) /* Number of sectors to read (1..255) */ { int result = FR_OK; register int i; if(disk_available){ for(i = 0; i < count; i++) if((result = call diskIO.readBlock(sector++, (uint8_t *)(buff + i * 512)))) // success is (still) 0 break; } else result = FR_NOT_READY; return result; } #if _READONLY == 0 DRESULT disk_write (BYTE drv, const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address (LBA) */ BYTE count) /* Number of sectors to write (1..255) */ { int result = FR_OK; register int i; if(disk_available){ for(i = 0; i < count; i++) if((result = call diskIO.writeBlock(sector++, (uint8_t *)(buff + i * 512)))) // success is (still) 0 break; } else return FR_NOT_READY; return result; } #endif /* _READONLY */ DRESULT disk_ioctl (BYTE drv, BYTE ctrl, /* Control code */ void * answer) /* Buffer to send/receive control data */ { int result; uint32_t capacity; // bytes /* * calls we have to deal with (ctrl param) as of ff v0.07a: * * CTRL_SYNC make sure no accesses are pending * GET_SECTOR_SIZE we're only supporting sd so far * GET_BLOCK_SIZE right, as above * GET_SECTOR_COUNT sd driver has a read-success hack for this, should work */ switch(ctrl){ case CTRL_SYNC: // make sure we have availability atomic{ if(disk_available) result = FR_OK; else result = FR_NOT_READY; } break; case GET_SECTOR_SIZE: case GET_BLOCK_SIZE: *(WORD *)answer = 512; result = RES_OK; break; case GET_SECTOR_COUNT: capacity = call diskIO.readCardSize(); *(DWORD *)answer = capacity / 512; result = FR_OK; break; default: *(WORD *)answer = 0; result = FR_INVALID_NAME; break; } return result; } async event void diskIO.available(){ signal FatFs.mediaAvailable(); atomic disk_available = TRUE; } async event void diskIO.unavailable(){ signal FatFs.mediaUnavailable(); atomic disk_available = FALSE; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/fatfs/diskio.h000066400000000000000000000100561207233610700245150ustar00rootroot00000000000000/*-----------------------------------------------------------------------------/ / FatFs module is an open source software to implement FAT file system to / small embedded systems. This is a free software and is opened for education, / research and commecial developments under license policy of following trems. / / Copyright (C) 2009, ChaN, all right reserved. / / * The FatFs module is a free software and there is NO WARRANTY. / * No restriction on use. You can use, modify and redistribute it for / personal, non-profit or commercial use UNDER YOUR RESPONSIBILITY. / * Redistributions of source code must retain the above copyright notice. / /-----------------------------------------------------------------------------*/ /* * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date April, 2009 * ported to tos-2.x * @date January, 2010 */ #ifndef _DISKIO #define _READONLY 0 /* 1: Read-only mode */ #define _USE_IOCTL 1 #include /* Status of Disk Functions */ typedef BYTE DSTATUS; /* Results of Disk Functions */ typedef enum { RES_OK = 0, /* 0: Successful */ RES_ERROR, /* 1: R/W Error */ RES_WRPRT, /* 2: Write Protected */ RES_NOTRDY, /* 3: Not Ready */ RES_PARERR /* 4: Invalid Parameter */ } DRESULT; /*---------------------------------------*/ /* Prototypes for disk control functions */ BOOL assign_drives (int argc, char *argv[]); DSTATUS disk_initialize (BYTE); void disable_disk(void); DSTATUS disk_status (BYTE); DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE); #if _READONLY == 0 DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE); #endif DRESULT disk_ioctl (BYTE, BYTE, void*); /* Disk Status Bits (DSTATUS) */ #define STA_NOINIT 0x01 /* Drive not initialized */ #define STA_NODISK 0x02 /* No medium in the drive */ #define STA_PROTECT 0x04 /* Write protected */ /* Command code for disk_ioctrl() */ /* Generic command */ #define CTRL_SYNC 0 /* Mandatory for write functions */ #define GET_SECTOR_COUNT 1 /* Mandatory for only f_mkfs() */ #define GET_SECTOR_SIZE 2 #define GET_BLOCK_SIZE 3 /* Mandatory for only f_mkfs() */ #define CTRL_POWER 4 #define CTRL_LOCK 5 #define CTRL_EJECT 6 /* MMC/SDC command */ #define MMC_GET_TYPE 10 #define MMC_GET_CSD 11 #define MMC_GET_CID 12 #define MMC_GET_OCR 13 #define MMC_GET_SDSTAT 14 /* ATA/CF command */ #define ATA_GET_REV 20 #define ATA_GET_MODEL 21 #define ATA_GET_SN 22 #define _DISKIO #endif tinyos-2.1.2+dfsg/tos/platforms/shimmer/chips/sd/fatfs/integer.h000066400000000000000000000064761207233610700247030ustar00rootroot00000000000000/*-----------------------------------------------------------------------------/ / FatFs module is an open source software to implement FAT file system to / small embedded systems. This is a free software and is opened for education, / research and commecial developments under license policy of following trems. / / Copyright (C) 2009, ChaN, all right reserved. / / * The FatFs module is a free software and there is NO WARRANTY. / * No restriction on use. You can use, modify and redistribute it for / personal, non-profit or commercial use UNDER YOUR RESPONSIBILITY. / * Redistributions of source code must retain the above copyright notice. / /-----------------------------------------------------------------------------*/ /* * Portions of this code: * * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * tinyos port from ChaN's FatFs (thank you!): * * @author Steve Ayer * @date April, 2009 * ported to tos-2.x (easy) * @date January, 2010 */ #ifndef _INTEGER // original typedefs converted to nesc stdint.h types for tos consistency /* These types must be 16-bit, 32-bit or larger integer */ typedef int16_t INT; typedef uint16_t UINT; /* These types must be 8-bit integer */ // had to change signed char typedef CHAR to SCHAR to avoid conflict with msp430 usart.h (#define CHAR 0x10) typedef int8_t SCHAR; typedef uint8_t UCHAR; typedef uint8_t BYTE; /* These types must be 16-bit integer */ typedef int16_t SHORT; typedef uint16_t USHORT; typedef uint16_t WORD; typedef uint16_t WCHAR; /* These types must be 32-bit integer */ typedef int32_t LONG; typedef uint32_t ULONG; typedef uint32_t DWORD; /* Boolean type */ //typedef enum { FALSE = 0, TRUE } BOOL; typedef char BOOL; #define _INTEGER #endif tinyos-2.1.2+dfsg/tos/platforms/shimmer/hardware.h000066400000000000000000000112351207233610700222110ustar00rootroot00000000000000/* * Copyright (c) 2006, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steven Ayer * @date June 2006 */ #ifndef _H_hardware_h #define _H_hardware_h #include "msp430hardware.h" // enum so components can override power saving, // as per TEP 112. enum { TOS_SLEEP_NONE = MSP430_POWER_ACTIVE, }; // LEDs TOSH_ASSIGN_PIN(RED_LED, 4, 0); TOSH_ASSIGN_PIN(ORANGE_LED, 4, 1); TOSH_ASSIGN_PIN(YELLOW_LED, 4, 2); TOSH_ASSIGN_PIN(GREEN_LED, 4, 3); // CC2420 RADIO #defines TOSH_ASSIGN_PIN(RADIO_FIFO, 1, 0); TOSH_ASSIGN_PIN(RADIO_TIMED_SFD, 1, 2); TOSH_ASSIGN_PIN(RADIO_FIFOP, 2, 6); TOSH_ASSIGN_PIN(RADIO_CCA, 2, 7); TOSH_ASSIGN_PIN(RADIO_1V8_EN, 4, 7); TOSH_ASSIGN_PIN(RADIO_VREF, 5, 6); // unused in shimmer TOSH_ASSIGN_PIN(SW_BT_PWR_N, 5, 6); // " " " TOSH_ASSIGN_PIN(SW_SD_PWR_N, 5, 6); // " " " TOSH_ASSIGN_PIN(DOCK_N, 2, 5); // not used, but has to be a pull-up for sd card to work TOSH_ASSIGN_PIN(RADIO_SFD, 5, 0); TOSH_ASSIGN_PIN(RADIO_SIMO1, 5, 1); TOSH_ASSIGN_PIN(RADIO_SOMI1, 5, 2); TOSH_ASSIGN_PIN(RADIO_CSN, 5, 4); TOSH_ASSIGN_PIN(CSN, 5, 4); TOSH_ASSIGN_PIN(RADIO_RESET, 5, 7); // redefinitions for the sd card driver TOSH_ASSIGN_PIN(SD_CLK, 3, 3); TOSH_ASSIGN_PIN(SD_DO, 3, 2); TOSH_ASSIGN_PIN(SD_DI, 3, 1); // this happens in hplcc2420pinsc TOSH_ASSIGN_PIN(CC_FIFOP, 2, 6); TOSH_ASSIGN_PIN(CC_FIFO, 1, 0); TOSH_ASSIGN_PIN(CC_SFD, 1, 2); TOSH_ASSIGN_PIN(CC_VREN, 5, 6); TOSH_ASSIGN_PIN(CC_RSTN, 5, 7); // BT pins TOSH_ASSIGN_PIN(BT_PIO, 1, 5); TOSH_ASSIGN_PIN(BT_RTS, 1, 6); TOSH_ASSIGN_PIN(BT_CTS, 1, 7); TOSH_ASSIGN_PIN(BT_TXD, 3, 6); TOSH_ASSIGN_PIN(BT_RXD, 3, 7); TOSH_ASSIGN_PIN(BT_RESET, 5, 5); //BSL Pins TOSH_ASSIGN_PIN(PROG_OUT, 1, 1); TOSH_ASSIGN_PIN(PROG_IN, 2, 2); // SD uart chip-select TOSH_ASSIGN_PIN(SD_CS_N, 3, 0); // ADC TOSH_ASSIGN_PIN(ADC0, 6, 5); TOSH_ASSIGN_PIN(ADC1, 6, 4); TOSH_ASSIGN_PIN(ADC2, 6, 3); // ADC lines on the testpoints TOSH_ASSIGN_PIN(ADC_0, 6, 0); TOSH_ASSIGN_PIN(ADC_1, 6, 1); TOSH_ASSIGN_PIN(ADC_2, 6, 2); TOSH_ASSIGN_PIN(ADC_3, 6, 3); TOSH_ASSIGN_PIN(ADC_4, 6, 4); TOSH_ASSIGN_PIN(ADC_5, 6, 5); TOSH_ASSIGN_PIN(ADC_6, 6, 6); TOSH_ASSIGN_PIN(ADC_7, 6, 7); TOSH_ASSIGN_PIN(ADC_ACCELZ, 6, 3); TOSH_ASSIGN_PIN(ADC_ACCELY, 6, 4); TOSH_ASSIGN_PIN(ADC_ACCELX, 6, 5); TOSH_ASSIGN_PIN(DAC0_AN, 6, 6); TOSH_ASSIGN_PIN(DAC1_AN, 6, 7); // UART pins // SPI1 attached to bt, cc2420 TOSH_ASSIGN_PIN(UCLK1, 5, 3); TOSH_ASSIGN_PIN(SOMI1, 5, 2); TOSH_ASSIGN_PIN(SIMO1, 5, 1); // used as GPIOs TOSH_ASSIGN_PIN(UCLK0, 3, 3); TOSH_ASSIGN_PIN(SOMI0, 3, 2); TOSH_ASSIGN_PIN(SIMO0, 3, 1); // connected to UART (0 and 1) TOSH_ASSIGN_PIN(UTXD0, 3, 4); TOSH_ASSIGN_PIN(URXD0, 3, 5); TOSH_ASSIGN_PIN(UTXD1, 3, 6); TOSH_ASSIGN_PIN(URXD1, 3, 7); // GIO pins TOSH_ASSIGN_PIN(SER0_RTS, 1, 3); TOSH_ASSIGN_PIN(SER0_CTS, 1, 4); TOSH_ASSIGN_PIN(ROSC, 2, 5); TOSH_ASSIGN_PIN(GIO0, 2, 0); TOSH_ASSIGN_PIN(GIO1, 2, 1); // 1-Wire TOSH_ASSIGN_PIN(ONEWIRE_PWR, 2, 3); TOSH_ASSIGN_PIN(ONEWIRE, 2, 4); // ACCEL TOSH_ASSIGN_PIN(ACCEL_SEL0, 4, 4); TOSH_ASSIGN_PIN(ACCEL_SEL1, 4, 5); TOSH_ASSIGN_PIN(ACCEL_SLEEP_N, 4, 6); #endif // _H_hardware_h tinyos-2.1.2+dfsg/tos/platforms/shimmer/platform.h000066400000000000000000000000001207233610700222240ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer/platform_message.h000066400000000000000000000051301207233610700237410ustar00rootroot00000000000000/* $Id: platform_message.h,v 1.2 2010-06-29 22:07:54 scipio Exp $ * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Defining the platform-independently named packet structures to be the * chip-specific CC1000 packet structures. * * @author Philip Levis * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:54 $ */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include #include typedef union message_header { cc2420_header_t cc2420; serial_header_t serial; } message_header_t; typedef union TOSRadioFooter { cc2420_footer_t cc2420; } message_footer_t; typedef union TOSRadioMetadata { cc2420_metadata_t cc2420; serial_metadata_t serial; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/shimmer/shimmerAnalogSetup.nc000066400000000000000000000055171207233610700244020ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date March, 2010 * * this interface is really just for cleaning up apps. * wire the app's softwareinit.init to the component's * then call *in sequence* the addInputs you want to sample: * that will be the order of the samples. * * REMEMBER: only eight channels, only one internal daughter card at a time, but * notice that the anex is provided. */ interface shimmerAnalogSetup { // three channels command void addAccelInputs(); // three channels command void addGyroInputs(); // two channels command void addECGInputs(); // three channels command void addUVInputs(); // one channels command void addGSRInput(); // one channels command void addEMGInput(); // either of two channels command void addAnExInput(uint8_t channel); // identical to ecg command void addStrainGaugeInputs(); // sets number of channels back to zero command void reset(); /* * call this after adding devices. * pass in a buffer to hold the sampling results * switching buffers can be done in the transferDone event */ command void finishADCSetup(uint16_t * buffer); command void triggerConversion(); command void stopConversion(); command uint8_t getNumberOfChannels(); } tinyos-2.1.2+dfsg/tos/platforms/shimmer/shimmerAnalogSetupC.nc000066400000000000000000000042131207233610700244750ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date March, 2010 */ configuration shimmerAnalogSetupC { provides { interface Init; interface shimmerAnalogSetup; } } implementation { components shimmerAnalogSetupP; shimmerAnalogSetup = shimmerAnalogSetupP; Init = shimmerAnalogSetupP; components HplAdc12P; shimmerAnalogSetupP.HplAdc12 -> HplAdc12P; components Msp430DmaC; shimmerAnalogSetupP.Msp430DmaControl -> Msp430DmaC; shimmerAnalogSetupP.Msp430DmaChannel -> Msp430DmaC.Channel0; components LedsC; shimmerAnalogSetupP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer/shimmerAnalogSetupP.nc000066400000000000000000000171151207233610700245170ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date March, 2010 * this is going to get duplicated in a million apps, so we gather simple setup * routines with reasonable defaults here. specific */ module shimmerAnalogSetupP { provides{ interface shimmerAnalogSetup; interface Init; } uses { interface Msp430DmaControl; interface Msp430DmaChannel; interface HplAdc12; interface Leds; } } implementation { void initADC12CTL0(); void initADC12CTL1(); void initADC12MEMCTLx(); void setupDMA(uint16_t * destAddr); void addNewChannels(uint8_t * chans, uint8_t howmany_new); uint8_t NUM_ADC_CHANS = 0; uint8_t ADC_CHANS[8]; // msp430 only has eight! command void shimmerAnalogSetup.addAccelInputs() { uint8_t new_chans[] = { 5, 4, 3 }; addNewChannels(new_chans, 3); initADC12MEMCTLx(); TOSH_MAKE_ADC_5_INPUT(); TOSH_SEL_ADC_5_MODFUNC(); TOSH_MAKE_ADC_4_INPUT(); TOSH_SEL_ADC_4_MODFUNC(); TOSH_MAKE_ADC_3_INPUT(); TOSH_SEL_ADC_3_MODFUNC(); } command void shimmerAnalogSetup.addGyroInputs() { uint8_t new_chans[] = { 1, 6, 2 }; // x, y, z addNewChannels(new_chans, 3); initADC12MEMCTLx(); TOSH_MAKE_ADC_1_INPUT(); TOSH_SEL_ADC_1_MODFUNC(); TOSH_MAKE_ADC_6_INPUT(); TOSH_SEL_ADC_6_MODFUNC(); TOSH_MAKE_ADC_2_INPUT(); TOSH_SEL_ADC_2_MODFUNC(); } // identical to ecg command void shimmerAnalogSetup.addStrainGaugeInputs(){ call shimmerAnalogSetup.addECGInputs(); } command void shimmerAnalogSetup.addECGInputs() { uint8_t new_chans[] = { 1, 2 }; // ecg_lall, ecg_rall addNewChannels(new_chans, 2); initADC12MEMCTLx(); TOSH_MAKE_ADC_1_INPUT(); TOSH_SEL_ADC_1_MODFUNC(); TOSH_MAKE_ADC_2_INPUT(); TOSH_SEL_ADC_2_MODFUNC(); } command void shimmerAnalogSetup.addUVInputs() { uint8_t new_chans[] = { 1, 2, 6 }; // ambient, uvb, uva addNewChannels(new_chans, 3); initADC12MEMCTLx(); TOSH_MAKE_ADC_1_INPUT(); TOSH_SEL_ADC_1_MODFUNC(); TOSH_MAKE_ADC_2_INPUT(); TOSH_SEL_ADC_2_MODFUNC(); TOSH_MAKE_ADC_6_INPUT(); TOSH_SEL_ADC_6_MODFUNC(); } command void shimmerAnalogSetup.addGSRInput() { uint8_t new_chans[] = { 6 }; addNewChannels(new_chans, 1); initADC12MEMCTLx(); TOSH_MAKE_ADC_6_INPUT(); TOSH_SEL_ADC_6_MODFUNC(); } command void shimmerAnalogSetup.addEMGInput() { uint8_t new_chans[] = { 1 }; // ecg_lall, ecg_rall addNewChannels(new_chans, 1); initADC12MEMCTLx(); TOSH_MAKE_ADC_1_INPUT(); TOSH_SEL_ADC_1_MODFUNC(); // this channel is identical to adc1, so we we don't read it, but make it an input to avoid pushing against the signal TOSH_MAKE_ADC_2_INPUT(); } command void shimmerAnalogSetup.addAnExInput(uint8_t channel) { uint8_t new_chans[1]; if(channel == 0){ new_chans[0] = 0; addNewChannels(new_chans, 1); initADC12MEMCTLx(); TOSH_MAKE_ADC_0_INPUT(); TOSH_SEL_ADC_0_MODFUNC(); } else if(channel == 7) { new_chans[0] = 7; addNewChannels(new_chans, 1); initADC12MEMCTLx(); TOSH_MAKE_ADC_7_INPUT(); TOSH_SEL_ADC_7_MODFUNC(); } } command void shimmerAnalogSetup.finishADCSetup(uint16_t * buffer){ setupDMA(buffer); } command void shimmerAnalogSetup.triggerConversion() { call Msp430DmaChannel.startTransfer(); call HplAdc12.startConversion(); } command void shimmerAnalogSetup.stopConversion() { call HplAdc12.stopConversion(); call HplAdc12.setIEFlags(0); call HplAdc12.resetIFGs(); } command uint8_t shimmerAnalogSetup.getNumberOfChannels() { return NUM_ADC_CHANS; } command void shimmerAnalogSetup.reset() { NUM_ADC_CHANS = 0; } command error_t Init.init() { initADC12CTL0(); initADC12CTL1(); // initADC12MEMCTLx(); TOSH_uwait(50000UL); return SUCCESS; } void addNewChannels(uint8_t * chans, uint8_t howmany_new) { register uint8_t i, j; for(j = 0, i = NUM_ADC_CHANS; (j < howmany_new) && (i < 8) ; i++, j++) ADC_CHANS[i] = chans[j]; NUM_ADC_CHANS += howmany_new; } void initADC12CTL0() { ADC12CTL0 = 0; SET_FLAG(ADC12CTL0, ADC12ON); SET_FLAG(ADC12CTL0, REF2_5V); SET_FLAG(ADC12CTL0, MSC); SET_FLAG(ADC12CTL0, SHT0_0); SET_FLAG(ADC12CTL0, SHT1_0); } void initADC12CTL1() { ADC12CTL1 = 0; SET_FLAG(ADC12CTL1, CONSEQ_1); SET_FLAG(ADC12CTL1, ADC12SSEL_3); SET_FLAG(ADC12CTL1, ADC12DIV_0); SET_FLAG(ADC12CTL1, SHP); } void initADC12MEMCTLx() { uint8_t i; for (i = 0; i < NUM_ADC_CHANS; ++i) { ADC12MCTL[i] = 0; SET_FLAG(ADC12MCTL[i], ADC_CHANS[i]); // inch is lower four bits // don't have to do anything to set sref to AVcc_AVss, which is 0 } SET_FLAG(ADC12MCTL[i - 1], EOS); } void setupDMA(uint16_t * destAddr) { call Msp430DmaControl.init(); // blanks registers call Msp430DmaControl.setFlags(FALSE, FALSE, FALSE); // enable_nmi, round_robin, on_fetch call Msp430DmaChannel.setupTransfer(DMA_BLOCK_TRANSFER, //dma_transfer_mode_t transfer_mode, DMA_TRIGGER_ADC12IFGx, //dma_trigger_t trigger, DMA_EDGE_SENSITIVE, //dma_level_t level, (void *)ADC12MEM0_, //void *src_addr, (void *)destAddr, //void *dst_addr, NUM_ADC_CHANS, //uint16_t size, DMA_WORD, //dma_byte_t src_byte, DMA_WORD, //dma_byte_t dst_byte, DMA_ADDRESS_INCREMENTED, //dma_incr_t src_incr, DMA_ADDRESS_INCREMENTED); //dma_incr_t dst_incr call Msp430DmaChannel.startTransfer(); } async event void Msp430DmaChannel.transferDone(error_t success) { } async event void HplAdc12.conversionDone(uint16_t iv) { } } tinyos-2.1.2+dfsg/tos/platforms/shimmer/shimmerMessage.h000066400000000000000000000254371207233610700233760ustar00rootroot00000000000000/** * Copyright (c) 2004,2005 Hewlett-Packard Company * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of the Hewlett-Packard Company nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Simple message format for exchanging network data. * We use the 'start' index to allow messages to have data * prepended. * * Each message contains a 'next' field, which allows us * to maintain queues. * * Note that we encode 16 and 32 bit values in network byte * order, which is MSB (most significant byte) first. * * However, 802.15.4 multibyte fields are always encoded LSB, * or least significant byte first. The Chipcon radio also * stores values LSB, as does the TI MSP processor. * This really only shows up when we are setting the PanID and * short address of our messages. * * @author Andrew Christian */ #ifndef _MESSAGE_H #define _MESSAGE_H #define MESSAGE_MAX_LENGTH 128 struct Message { uint8_t data[ MESSAGE_MAX_LENGTH ]; uint8_t start; uint8_t length; struct Message *next; }; /* * this is useful for tracking down allocs w/out frees. add a uint8_t who to the Message structure and then see who holds * all the messages using param... #ifdef DEBUG_MESSAGE enum { MSG_WHO_FREE=0, MSG_WHO_CLIENT_HAWR, MSG_WHO_CLIENT_HSNOOZET, MSG_WHO_CLIENT_AR, MSG_WHO_CLIENT_HSCANT, MSG_WHO_CC2420H_DELAYEDRXFIFO, MSG_WHO_UIP_SENDMESSAGE, MSG_WHO_UIP_SENDUDPMESSAGE }; #endif */ /** * Message manipulation functions. * * All integers are sent in network byte order - MSB first */ inline void msg_set_uint8( struct Message *msg, uint8_t offset, uint8_t data ) { uint8_t i = msg->start + offset; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[ i] = data; } inline void msg_set_uint16( struct Message *msg, uint8_t offset, uint16_t data ) { uint8_t i = msg->start + offset; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0xff00) >> 8; if ( ++i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0xff); } inline void msg_set_saddr( struct Message *msg, uint8_t offset, uint16_t data ) { uint8_t i = msg->start + offset; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0xff); if ( ++i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0xff00) >> 8; } inline void msg_set_uint32( struct Message *msg, uint8_t offset, uint32_t data ) { uint8_t i = msg->start + offset; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0xff000000) >> 24; if ( ++i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0x00ff0000) >> 16; if ( ++i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0x0000ff00) >> 8; if ( ++i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0xff); } inline void msg_set_buf( struct Message *msg, uint8_t offset, const uint8_t *buf, uint8_t len ) { uint8_t i = msg->start + offset; for ( ; len ; len--, i++ ) { if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = *buf++; } } inline uint8_t msg_get_uint8( const struct Message *msg, uint8_t offset ) { uint8_t i = msg->start + offset; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; return msg->data[ i ]; } inline int8_t msg_get_int8( const struct Message *msg, uint8_t offset ) { uint8_t i = msg->start + offset; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; return ((int8_t *)(msg->data))[ i ]; } inline uint16_t msg_get_uint16( const struct Message *msg, uint8_t offset ) { uint8_t i = msg->start + offset; uint16_t result; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; result = (msg->data[i] << 8); if ( ++i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; result |= msg->data[i]; return result; } inline uint16_t msg_get_saddr( const struct Message *msg, uint8_t offset ) { uint8_t i = msg->start + offset; uint16_t result; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; result = msg->data[i]; if ( ++i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; result |= (msg->data[i] << 8); return result; } inline void msg_get_buf( const struct Message *msg, uint8_t offset, uint8_t *buf, uint8_t len ) { uint8_t i = msg->start + offset; for ( ; len ; len--, i++ ) { if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; *buf++ = msg->data[i]; } } inline void msg_get_str( const struct Message *msg, uint8_t offset, uint8_t *str, uint8_t len ) { uint8_t i = msg->start + offset; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; while (--len && msg->data[i] ) { *str++ = msg->data[i++]; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; } *str = 0; } inline bool msg_cmp_buf( const struct Message *msg, uint8_t offset, const uint8_t *buf, uint8_t len ) { uint8_t i = msg->start + offset; for ( ; len ; len--, i++ ) { if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; if ( *buf++ != msg->data[i]) return FALSE; } return TRUE; } inline bool msg_cmp_str( const struct Message *msg, uint8_t offset, const uint8_t *buf ) { uint8_t i = msg->start + offset; while (1) { if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; if ( *buf++ != msg->data[i]) return FALSE; if ( msg->data[i] == 0 ) return TRUE; i++; } return TRUE; } inline void msg_append_uint8( struct Message *msg, uint8_t data ) { uint8_t i = msg->start + msg->length; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[ i ] = data; msg->length++; } inline void msg_append_uint16( struct Message *msg, uint16_t data ) { uint8_t i = msg->start + msg->length; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0xff00) >> 8; if ( ++i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0xff); msg->length += 2; } inline void msg_append_saddr( struct Message *msg, uint16_t data ) { uint8_t i = msg->start + msg->length; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0xff); if ( ++i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0xff00) >> 8; msg->length += 2; } inline void msg_append_uint32( struct Message *msg, uint32_t data ) { uint8_t i = msg->start + msg->length; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0xff000000) >> 24; if ( ++i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0x00ff0000) >> 16; if ( ++i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0x0000ff00) >> 8; if ( ++i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = (data & 0xff); msg->length += 4; } inline void msg_append_buf( struct Message *msg, const uint8_t *buf, uint8_t len ) { uint8_t i = msg->start + msg->length; msg->length += len; for ( ; len ; len--, i++ ) { if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = *buf++; } } inline void msg_append_str( struct Message *msg, const uint8_t *str ) { uint8_t i = msg->start + msg->length; for ( ; *str ; i++ ) { if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = *str++; msg->length++; } if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; msg->data[i] = 0; msg->length++; } inline void msg_prepend_uint8( struct Message *msg, uint8_t data ) { msg->length++; if ( msg->start == 0 ) msg->start = MESSAGE_MAX_LENGTH - 1; else msg->start--; msg->data[ msg->start ] = data; } inline void msg_add_to_front( struct Message *msg, uint8_t count ) { if ( msg->start < count ) msg->start = MESSAGE_MAX_LENGTH - count + msg->start; else msg->start -= count; msg->length += count; } inline void msg_drop_from_front( struct Message *msg, uint8_t count ) { msg->start += count; if ( msg->start >= MESSAGE_MAX_LENGTH ) msg->start -= MESSAGE_MAX_LENGTH; msg->length -= count; } inline void msg_add_to_end( struct Message *msg, uint8_t count ) { msg->length += count; } inline void msg_drop_from_end( struct Message *msg, uint8_t count ) { msg->length -= count; } inline uint8_t * msg_get_pointer( struct Message *msg, uint8_t offset ) { uint8_t i = msg->start + offset; if ( i >= MESSAGE_MAX_LENGTH ) i -= MESSAGE_MAX_LENGTH; return msg->data + i; } inline void msg_clear( struct Message *msg ) { msg->length = 0; msg->start = 0; } inline void msg_set_length( struct Message *msg, uint8_t len ) { msg->length = len; } inline uint8_t msg_get_length( const struct Message *msg ) { return msg->length; } inline uint8_t msg_get_max_length( void ) { return MESSAGE_MAX_LENGTH; } /** * Message queue functions. Message queues are simple * linked lists. */ inline struct Message * pop_queue( struct Message **head ) { struct Message *result = *head; if ( result != NULL ) *head = (*head)->next; return result; } inline void push_queue( struct Message **head, struct Message *item ) { item->next = *head; *head = item; } inline void append_queue( struct Message **head, struct Message *item ) { if (*head == NULL) { *head = item; } else { struct Message *bm = *head; while ( bm->next != NULL ) bm = bm->next; bm->next = item; } item->next = NULL; } inline uint8_t count_queue( struct Message *head ) { uint8_t count = 0; while ( head ) { count++; head = head->next; } return count; } #endif // _BASIC_MESSAGE_H tinyos-2.1.2+dfsg/tos/platforms/shimmer2/000077500000000000000000000000001207233610700203235ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/.platform000066400000000000000000000051271207233610700221550ustar00rootroot00000000000000# SHIMMER2 - platform includes # Steve Ayer, June 2009; derived from Konrad Lorincz's SHIMMER platform # # Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. push( @includes, qw( . %T/platforms/shimmer2 %T/platforms/shimmer2/chips/msp430 %T/platforms/shimmer2/chips/cc2420 %T/platforms/shimmer2/chips/mma7260 %T/platforms/shimmer2/chips/sd %T/platforms/shimmer2/chips/bluetooth %T/platforms/shimmer2/chips/tilt %T/platforms/shimmer2/chips/gyro %T/platforms/shimmer2/chips/gyromag %T/platforms/shimmer2/chips/fgpmmopa6b %T/platforms/shimmer2/chips/bmp085 %T/platforms/shimmer2/chips/hmc5843 %T/platforms/shimmer2/chips/straingauge %T/platforms/shimmer %T/platforms/shimmer/chips/msp430 %T/platforms/shimmer/chips/mma7260 %T/platforms/shimmer/chips/sd %T/platforms/shimmer/chips/sd/fatfs %T/platforms/shimmer/chips/bluetooth %T/platforms/shimmer/chips/ds2411 %T/platforms/shimmer/chips/gsr %T/platforms/shimmer/chips/rmcm01 %T/chips/cc2420 %T/chips/cc2420/alarm %T/chips/cc2420/control %T/chips/cc2420/csma %T/chips/cc2420/interfaces %T/chips/cc2420/link %T/chips/cc2420/lowpan %T/chips/cc2420/lpl %T/chips/cc2420/packet %T/chips/cc2420/receive %T/chips/cc2420/spi %T/chips/cc2420/transmit %T/chips/cc2420/unique %T/chips/cc2420/security %T/chips/msp430 %T/chips/msp430/adc12 %T/chips/msp430/dma %T/chips/msp430/pins %T/chips/msp430/timer %T/chips/msp430/usart %T/chips/msp430/sensors %T/lib/timer %T/lib/serial %T/lib/adc %T/lib/power ) ); @opts = qw( -gcc=msp430-gcc -mmcu=msp430f1611 -fnesc-target=msp430 -fnesc-no-debug ); push @opts, "-mdisable-hwmul" if `msp430-gcc --version | grep 3.2.3`; push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{'CIL_MACHINE'} = "version_major=3 " . "version_minor=2 " . "version=msp430-3.2.3 " . "short=2,2 " . "int=2,2 " . "long=4,2 " . "long_long=8,2 " . "pointer=2,2 " . "enum=2,2 " . "float=4,2 " . "double=4,2 " . "long_double=4,2 " . "void=1,1 " . "fun=1,2 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/shimmer2/ActiveMessageC.nc000066400000000000000000000061501207233610700234720ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.3 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.3 2010-06-29 22:07:54 scipio Exp $ * */ /** * The Active Message layer on the SHIMMER platform. This is a naming wrapper * around the CC2420 Active Message layer. * * @author Konrad Lorincz */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface LowPowerListening; } } implementation { components CC2420ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; LowPowerListening = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/HplUserButtonC.nc000066400000000000000000000044151207233610700235320ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telos platform * * @author Gilman Tolle * @version $Revision: 1.1 $ * * @author Mike Healy * @date May 9, 2009 - modified for use with SHIMMER2 */ configuration HplUserButtonC { provides interface GeneralIO; provides interface GpioInterrupt; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components HplMsp430InterruptC as InterruptC; components new Msp430GpioC() as UserButtonC; UserButtonC -> GeneralIOC.Port20; GeneralIO = UserButtonC; components new Msp430InterruptC() as InterruptUserButtonC; InterruptUserButtonC.HplInterrupt -> InterruptC.Port20; GpioInterrupt = InterruptUserButtonC.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/Leds.nc000066400000000000000000000111131207233610700215310ustar00rootroot00000000000000// $Id: Leds.nc,v 1.4 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2005-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Commands for controlling three LEDs. A platform can provide this * interface if it has more than or fewer than three LEDs. In the * former case, these commands refer to the first three LEDs. In the * latter case, some of the commands are null operations, and the set * of non-null operations must be contiguous and start at Led1. That * is, on platforms with 2 LEDs, LED 3's commands are null operations, * while on platforms with 1 LED, LED 2 and LED 3's commands are null * opertations. * * @author Joe Polastre * @author Philip Levis * */ #include "Leds.h" interface Leds { /** * Turn on LED 0. The color of this LED depends on the platform. */ async command void led0On(); /** * Turn off LED 0. The color of this LED depends on the platform. */ async command void led0Off(); /** * Toggle LED 0; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led0Toggle(); /** * Turn on LED 1. The color of this LED depends on the platform. */ async command void led1On(); /** * Turn off LED 1. The color of this LED depends on the platform. */ async command void led1Off(); /** * Toggle LED 1; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led1Toggle(); /** * Turn on LED 2. The color of this LED depends on the platform. */ async command void led2On(); /** * Turn off LED 2. The color of this LED depends on the platform. */ async command void led2Off(); /** * Toggle LED 2; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led2Toggle(); /** * Get the current LED settings as a bitmask. Each bit corresponds to * whether an LED is on; bit 0 is LED 0, bit 1 is LED 1, etc. You can * also use the enums LEDS_LED0, LEDS_LED1. For example, this expression * will determine whether LED 2 is on: * *
         (call Leds.get() & LEDS_LED2) 
        * * This command supports up to 8 LEDs; if a platform has fewer, then * those LEDs should always be off (their bit is zero). Also see * set(). * * @return a bitmask describing which LEDs are on and which are off */ async command uint8_t get(); /** * Set the current LED configuration using a bitmask. Each bit * corresponds to whether an LED is on; bit 0 is LED 0, bit 1 is LED * 1, etc. You can also use the enums LEDS_LED0, LEDS_LED1. For example, * this statement will configure the LEDs so LED 0 and LED 2 are on: * *
         call Leds.set(LEDS_LED0 | LEDS_LED2); 
        * * This statement will turn LED 1 on if it was not already: * *
        call Leds.set(call Leds.get() | LEDS_LED1);
        * * @param val a bitmask describing the on/off settings of the LEDs */ async command void set(uint8_t val); } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/LedsC.nc000066400000000000000000000040731207233610700216430ustar00rootroot00000000000000// $Id: LedsC.nc,v 1.4 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * The basic TinyOS LEDs abstraction. * * @author Phil Buonadonna * @author David Gay * @author Philip Levis * @author Joe Polastre * */ configuration LedsC { provides interface Leds; } implementation { components LedsP, PlatformLedsC; Leds = LedsP; LedsP.Init <- PlatformLedsC.Init; LedsP.Led0 -> PlatformLedsC.Led0; LedsP.Led1 -> PlatformLedsC.Led1; LedsP.Led2 -> PlatformLedsC.Led2; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/LedsP.nc000066400000000000000000000076341207233610700216660ustar00rootroot00000000000000// $Id: LedsP.nc,v 1.4 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The implementation of the standard 3 LED mote abstraction. * * @author Joe Polastre * @author Philip Levis * * @date March 21, 2005 * */ module LedsP @safe() { provides { interface Init; interface Leds; } uses { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; } } implementation { command error_t Init.init() { atomic { dbg("Init", "LEDS: initialized.\n"); call Led0.makeOutput(); call Led1.makeOutput(); call Led2.makeOutput(); call Led0.set(); call Led1.set(); call Led2.set(); } return SUCCESS; } /* Note: the call is inside the dbg, as it's typically a read of a volatile location, so can't be deadcode eliminated */ #define DBGLED(n) \ dbg("LedsC", "LEDS: Led" #n " %s.\n", call Led ## n .get() ? "off" : "on"); async command void Leds.led0On() { call Led0.clr(); DBGLED(0); } async command void Leds.led0Off() { call Led0.set(); DBGLED(0); } async command void Leds.led0Toggle() { call Led0.toggle(); DBGLED(0); } async command void Leds.led1On() { call Led1.clr(); DBGLED(1); } async command void Leds.led1Off() { call Led1.set(); DBGLED(1); } async command void Leds.led1Toggle() { call Led1.toggle(); DBGLED(1); } async command void Leds.led2On() { call Led2.clr(); DBGLED(2); } async command void Leds.led2Off() { call Led2.set(); DBGLED(2); } async command void Leds.led2Toggle() { call Led2.toggle(); DBGLED(2); } async command uint8_t Leds.get() { uint8_t rval; atomic { rval = 0; if (!call Led0.get()) { rval |= LEDS_LED0; } if (!call Led1.get()) { rval |= LEDS_LED1; } if (!call Led2.get()) { rval |= LEDS_LED2; } } return rval; } async command void Leds.set(uint8_t val) { atomic { if (val & LEDS_LED0) { call Leds.led0On(); } else { call Leds.led0Off(); } if (val & LEDS_LED1) { call Leds.led1On(); } else { call Leds.led1Off(); } if (val & LEDS_LED2) { call Leds.led2On(); } else { call Leds.led2Off(); } } } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/MoteClockC.nc000066400000000000000000000035471207233610700226410ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: MoteClockC.nc,v 1.1 2009-09-04 18:27:46 ayer1 Exp $ * */ /** * @author Vlado Handziski */ configuration MoteClockC { provides interface Init as MoteClockInit; } implementation { components Msp430ClockC; MoteClockInit = Msp430ClockC.Init; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/MotePlatformC.nc000066400000000000000000000151351207233610700233660ustar00rootroot00000000000000/* * Copyright (c) 2007, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steven Ayer * @date July 2007 * * tos-2.x port June 2009 * */ module MotePlatformC { provides interface Init; } implementation { command error_t Init.init() { // have to tell mux to connect path from msp430 to sd TOSH_SEL_DOCK_N_IOFUNC(); TOSH_MAKE_DOCK_N_OUTPUT(); TOSH_SET_DOCK_N_PIN(); // bus arbitration pins TOSH_SEL_SW_SD_PWR_N_IOFUNC(); TOSH_MAKE_SW_SD_PWR_N_OUTPUT(); TOSH_SEL_SD_CS_N_IOFUNC(); TOSH_MAKE_SD_CS_N_OUTPUT(); TOSH_SEL_SD_CLK_IOFUNC(); TOSH_MAKE_SD_CLK_OUTPUT(); TOSH_SEL_SD_DO_IOFUNC(); TOSH_MAKE_SD_DO_INPUT(); TOSH_SEL_SD_DI_IOFUNC(); TOSH_MAKE_SD_DI_OUTPUT(); // power down sd module; overridden by dock pin on programming board /* * other pins are zeroed to reset card * at end of this routine, we raise them again (they have pullups, too) */ TOSH_SET_SW_SD_PWR_N_PIN(); TOSH_CLR_SD_CS_N_PIN(); TOSH_CLR_SD_DI_PIN(); TOSH_CLR_SD_CLK_PIN(); TOSH_SEL_SW_BT_PWR_N_IOFUNC(); TOSH_MAKE_SW_BT_PWR_N_OUTPUT(); TOSH_SET_SW_BT_PWR_N_PIN(); // power down bt module; overridden by dock pin on programming board //LEDS TOSH_SEL_RED_LED_IOFUNC(); TOSH_MAKE_RED_LED_OUTPUT(); TOSH_SEL_YELLOW_LED_IOFUNC(); TOSH_MAKE_YELLOW_LED_OUTPUT(); TOSH_SEL_GREEN_LED_IOFUNC(); TOSH_MAKE_GREEN_LED_OUTPUT(); TOSH_SET_RED_LED_PIN(); TOSH_SET_YELLOW_LED_PIN(); TOSH_SET_GREEN_LED_PIN(); //RADIO PINS //CC2420 pins TOSH_MAKE_RADIO_VREF_OUTPUT(); TOSH_SEL_RADIO_VREF_IOFUNC(); TOSH_CLR_RADIO_VREF_PIN(); // power down TOSH_MAKE_RADIO_CSN_OUTPUT(); TOSH_SEL_RADIO_CSN_IOFUNC(); TOSH_SET_RADIO_CSN_PIN(); // should be reset_n TOSH_MAKE_RADIO_RESET_OUTPUT(); TOSH_SEL_RADIO_RESET_IOFUNC(); TOSH_CLR_RADIO_RESET_PIN(); TOSH_SEL_RADIO_CCA_IOFUNC(); TOSH_MAKE_RADIO_CCA_INPUT(); TOSH_SEL_RADIO_FIFO_IOFUNC(); TOSH_MAKE_RADIO_FIFO_INPUT(); TOSH_SEL_RADIO_FIFOP_IOFUNC(); TOSH_MAKE_RADIO_FIFOP_INPUT(); TOSH_SEL_RADIO_SFD_IOFUNC(); TOSH_MAKE_RADIO_SFD_INPUT(); TOSH_SEL_TILT_IOFUNC(); TOSH_MAKE_TILT_INPUT(); // BT PINS TOSH_MAKE_BT_RESET_OUTPUT(); TOSH_SEL_BT_RESET_IOFUNC(); TOSH_CLR_BT_RESET_PIN(); // mitsumi module disabled by clr TOSH_MAKE_BT_RTS_INPUT(); TOSH_SEL_BT_RTS_IOFUNC(); TOSH_MAKE_BT_PIO_INPUT(); TOSH_SEL_BT_PIO_IOFUNC(); TOSH_MAKE_BT_CTS_OUTPUT(); TOSH_SEL_BT_CTS_IOFUNC(); TOSH_MAKE_BT_TXD_OUTPUT(); TOSH_SEL_BT_TXD_IOFUNC(); TOSH_MAKE_BT_RXD_INPUT(); TOSH_SEL_BT_RXD_IOFUNC(); // BSL Prog Pins tristate em TOSH_MAKE_PROG_IN_OUTPUT(); TOSH_MAKE_PROG_OUT_OUTPUT(); TOSH_SET_PROG_OUT_PIN(); // some expansion boards have enable low TOSH_SEL_PROG_IN_IOFUNC(); TOSH_SEL_PROG_OUT_IOFUNC(); // ADC lines TOSH_SEL_ADC_0_IOFUNC(); TOSH_MAKE_ADC_0_OUTPUT(); TOSH_SEL_ADC_1_IOFUNC(); TOSH_MAKE_ADC_1_OUTPUT(); TOSH_SEL_ADC_2_IOFUNC(); TOSH_MAKE_ADC_2_OUTPUT(); TOSH_SEL_ADC_6_IOFUNC(); TOSH_MAKE_ADC_6_OUTPUT(); TOSH_SEL_ADC_7_IOFUNC(); TOSH_MAKE_ADC_7_OUTPUT(); TOSH_SEL_ADC_ACCELZ_IOFUNC(); TOSH_MAKE_ADC_ACCELZ_INPUT(); TOSH_SEL_ADC_ACCELY_IOFUNC(); TOSH_MAKE_ADC_ACCELY_INPUT(); TOSH_SEL_ADC_ACCELX_IOFUNC(); TOSH_MAKE_ADC_ACCELX_INPUT(); TOSH_SEL_ROSC_IOFUNC(); TOSH_MAKE_ROSC_INPUT(); // 1-wire function TOSH_SEL_ONEWIRE_IOFUNC(); TOSH_MAKE_ONEWIRE_OUTPUT(); TOSH_SET_ONEWIRE_PIN(); /* * Accelerometer pin definitions * unless the accel_sel0 pin is cleared, * a severe quiescent power hit occurs on the msp430 * we go from 3.7 ua to 65.1 ua when asleep! */ TOSH_SEL_ACCEL_SEL0_IOFUNC(); TOSH_MAKE_ACCEL_SEL0_OUTPUT(); TOSH_CLR_ACCEL_SEL0_PIN(); TOSH_SEL_ACCEL_SEL1_IOFUNC(); TOSH_MAKE_ACCEL_SEL1_OUTPUT(); TOSH_CLR_ACCEL_SEL1_PIN(); TOSH_SEL_ACCEL_SLEEP_N_IOFUNC(); TOSH_MAKE_ACCEL_SLEEP_N_OUTPUT(); TOSH_CLR_ACCEL_SLEEP_N_PIN(); // idle expansion header pins TOSH_SEL_SER0_CTS_IOFUNC(); TOSH_MAKE_SER0_CTS_OUTPUT(); TOSH_SEL_SER0_RTS_IOFUNC(); TOSH_MAKE_SER0_RTS_OUTPUT(); // this pin is now tied to the user button on the prog board TOSH_SEL_GIO0_IOFUNC(); TOSH_MAKE_GIO0_INPUT(); TOSH_SEL_GIO1_IOFUNC(); TOSH_MAKE_GIO1_OUTPUT(); TOSH_SEL_UTXD0_IOFUNC(); TOSH_MAKE_UTXD0_OUTPUT(); TOSH_SEL_URXD0_IOFUNC(); TOSH_MAKE_URXD0_OUTPUT(); TOSH_SET_URXD0_PIN(); TOSH_SEL_UTXD1_IOFUNC(); TOSH_MAKE_UTXD1_OUTPUT(); TOSH_SEL_URXD1_IOFUNC(); TOSH_MAKE_URXD1_OUTPUT(); TOSH_SEL_UCLK1_IOFUNC(); TOSH_MAKE_UCLK1_OUTPUT(); TOSH_SEL_SIMO1_IOFUNC(); TOSH_MAKE_SIMO1_OUTPUT(); TOSH_SEL_SOMI1_IOFUNC(); TOSH_MAKE_SOMI1_INPUT(); TOSH_SET_SD_CS_N_PIN(); TOSH_SET_SD_DI_PIN(); TOSH_SET_SD_CLK_PIN(); // these are attached to the same pullup as above TOSH_SET_SIMO1_PIN(); TOSH_SET_UCLK1_PIN(); // set it back to default state TOSH_MAKE_DOCK_N_INPUT(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/Msp430Timer32khzMapC.nc000066400000000000000000000065221207233610700242640ustar00rootroot00000000000000//$Id: Msp430Timer32khzMapC.nc,v 1.3 2010-06-29 22:07:54 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * MSP430Timer32khzMapC presents as paramaterized interfaces all of * the 32khz hardware timers on the MSP430 that are available for * compile time allocation by "new Alarm32khz16C()", "new * AlarmMilli32C()", and so on. * * Platforms based on the MSP430 are * encouraged to copy in and * override this file, presenting only the * hardware timers that are * available for allocation on that platform. * * @author Cory Sharp * @version $Revision: 1.3 $ $Date: 2010-06-29 22:07:54 $ */ configuration Msp430Timer32khzMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; Msp430Timer[0] = Msp430TimerC.TimerB; Msp430TimerControl[0] = Msp430TimerC.ControlB0; Msp430Compare[0] = Msp430TimerC.CompareB0; Msp430Timer[1] = Msp430TimerC.TimerB; Msp430TimerControl[1] = Msp430TimerC.ControlB1; Msp430Compare[1] = Msp430TimerC.CompareB1; Msp430Timer[2] = Msp430TimerC.TimerB; Msp430TimerControl[2] = Msp430TimerC.ControlB2; Msp430Compare[2] = Msp430TimerC.CompareB2; Msp430Timer[3] = Msp430TimerC.TimerB; Msp430TimerControl[3] = Msp430TimerC.ControlB3; Msp430Compare[3] = Msp430TimerC.CompareB3; Msp430Timer[4] = Msp430TimerC.TimerB; Msp430TimerControl[4] = Msp430TimerC.ControlB4; Msp430Compare[4] = Msp430TimerC.CompareB4; Msp430Timer[5] = Msp430TimerC.TimerB; Msp430TimerControl[5] = Msp430TimerC.ControlB5; Msp430Compare[5] = Msp430TimerC.CompareB5; Msp430Timer[6] = Msp430TimerC.TimerB; Msp430TimerControl[6] = Msp430TimerC.ControlB6; Msp430Compare[6] = Msp430TimerC.CompareB6; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/NoLedsC.nc000066400000000000000000000050311207233610700221330ustar00rootroot00000000000000// $Id: NoLedsC.nc,v 1.2 2010-06-29 22:07:54 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A null operation replacement for the LedsC component. As many * components might concurrently signal information through LEDs, * using LedsC and NoLedsC allows an application builder to select * which components control the LEDs. * * @author Philip Levis * @date March 19, 2005 * */ module NoLedsC { provides interface Init; provides interface Leds; } implementation { command error_t Init.init() {return SUCCESS;} async command void Leds.led0On() {} async command void Leds.led0Off() {} async command void Leds.led0Toggle() {} async command void Leds.led1On() {} async command void Leds.led1Off() {} async command void Leds.led1Toggle() {} async command void Leds.led2On() {} async command void Leds.led2Off() {} async command void Leds.led2Toggle() {} async command uint8_t Leds.get() {return 0;} async command void Leds.set(uint8_t val) {} } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/PlatformC.nc000066400000000000000000000036641207233610700225450ustar00rootroot00000000000000/* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre and Cory Sharp * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:54 $ */ #include "hardware.h" configuration PlatformC { provides interface Init; } implementation { components PlatformP, MotePlatformC, MoteClockC; Init = PlatformP; PlatformP.MoteClockInit -> MoteClockC; PlatformP.MoteInit -> MotePlatformC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/PlatformLedsC.nc000066400000000000000000000045061207233610700233510ustar00rootroot00000000000000// $Id: PlatformLedsC.nc,v 1.2 2010-06-29 22:07:54 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:54 $ */ #include "hardware.h" configuration PlatformLedsC { provides interface GeneralIO as Led0; provides interface GeneralIO as Led1; provides interface GeneralIO as Led2; uses interface Init; } implementation { components HplMsp430GeneralIOC as GeneralIOC , new Msp430GpioC() as Led0Impl , new Msp430GpioC() as Led1Impl , new Msp430GpioC() as Led2Impl ; components PlatformP; Init = PlatformP.LedsInit; Led0 = Led0Impl; Led0Impl -> GeneralIOC.Port40; Led1 = Led1Impl; Led1Impl -> GeneralIOC.Port42; Led2 = Led2Impl; Led2Impl -> GeneralIOC.Port43; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/PlatformP.nc000066400000000000000000000006601207233610700225530ustar00rootroot00000000000000#include "hardware.h" module PlatformP{ provides interface Init; uses interface Init as MoteClockInit; uses interface Init as MoteInit; uses interface Init as LedsInit; } implementation { command error_t Init.init() { WDTCTL = WDTPW + WDTHOLD; call MoteClockInit.init(); call MoteInit.init(); call LedsInit.init(); return SUCCESS; } default command error_t LedsInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/PlatformSerialC.nc000066400000000000000000000041001207233610700236670ustar00rootroot00000000000000/* * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * mostly copied from shimmer * * @author Steve Ayer * @date June 2009 */ configuration PlatformSerialC { provides interface StdControl; provides interface UartStream; provides interface UartByte; } implementation { components new Msp430Uart0C() as UartC; UartStream = UartC; UartByte = UartC; components ShimmerSerialP; StdControl = ShimmerSerialP; ShimmerSerialP.Msp430UartConfigure <- UartC.Msp430UartConfigure; ShimmerSerialP.Resource -> UartC.Resource; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/ShimmerSerialP.nc000066400000000000000000000047101207233610700235330ustar00rootroot00000000000000/* * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date June 2009 */ module ShimmerSerialP { provides interface StdControl; provides interface Msp430UartConfigure; uses interface Resource; } implementation { msp430_uart_union_config_t msp430_uart_shimmer2_config = { { ubr: UBR_1MHZ_115200, umctl: UMCTL_1MHZ_115200, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0, utxe : 1, urxe : 1 } }; command error_t StdControl.start(){ return call Resource.immediateRequest(); } command error_t StdControl.stop(){ call Resource.release(); return SUCCESS; } event void Resource.granted(){} async command msp430_uart_union_config_t * Msp430UartConfigure.getConfig(){ return &msp430_uart_shimmer2_config; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/TimeSyncMessageC.nc000066400000000000000000000056421207233610700240170ustar00rootroot00000000000000// $Id: TimeSyncMessageC.nc,v 1.2 2010/05/17 13:12:21 ayer Exp $ /* * "Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * The Active Message layer on the shimmer platform. This is a naming wrapper * around the CC2420 Active Message layer that implemets timesync interface (TEP 133). * * @author Konrad Lorincz * @author Brano Kusy * @date June 19 2005 */ configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSend32khz[am_id_t id]; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC2420TimeSyncMessageC as AM; SplitControl = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; LowPowerListening = AM; TimeSyncAMSend32khz = AM; TimeSyncAMSendMilli = AM; TimeSyncPacket32khz = AM; TimeSyncPacketMilli = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/000077500000000000000000000000001207233610700214315ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/bluetooth/000077500000000000000000000000001207233610700234365ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/bluetooth/RovingNetworksC.nc000077500000000000000000000047201207233610700270720ustar00rootroot00000000000000/* * Copyright (c) 2007, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Author: Steve Ayer * February, 2007 */ /** * @author Steve Ayer * @author Adrian Burns * @date February, 2007 * * @author Mike Healy * @date April 20, 2009 - ported to TinyOS 2.x */ configuration RovingNetworksC { provides { interface StdControl; interface Bluetooth; interface Init; } } implementation { components RovingNetworksP, MainC, HplMsp430InterruptC, HplMsp430Usart1C, LedsC; StdControl = RovingNetworksP; Bluetooth = RovingNetworksP; Init = RovingNetworksP; RovingNetworksP.UARTControl -> HplMsp430Usart1C.HplMsp430Usart; RovingNetworksP.UARTData -> HplMsp430Usart1C.HplMsp430UsartInterrupts; RovingNetworksP.RTSInterrupt -> HplMsp430InterruptC.Port16; RovingNetworksP.ConnectionInterrupt -> HplMsp430InterruptC.Port26; RovingNetworksP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/bmp085/000077500000000000000000000000001207233610700224445ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/bmp085/Bmp085P.nc000066400000000000000000000236161207233610700240710ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * @author Steve Ayer * @date November, 2010 * * driver for bosch bmp085 pressure sensor module (port from tos-1.x) */ module Bmp085P { provides { interface Init; interface StdControl; interface PressureSensor; } uses { interface I2CPacket as I2CPacket; interface Init as I2CInit; interface HplMsp430I2C as HplI2C; // interface HplMsp430Usart as Usart; interface HplMsp430UsartInterrupts as UsartInterrupts; interface HplMsp430I2CInterrupts as I2CInterrupts; interface HplMsp430Interrupt as EOCInterrupt; interface HplMsp430GeneralIO as Msp430GeneralIO; } } implementation { extern int sprintf(char *str, const char *format, ...) __attribute__ ((C)); extern int snprintf(char *str, size_t len, const char *format, ...) __attribute__ ((C)); void readReg(uint8_t reg_addr, uint8_t size); uint8_t readbuff[128], bytesToRead, regToRead, bytesRead, cal_run; uint16_t sbuf0[64]; uint8_t packet[4]; bool enabled; // sensing mode uint8_t oss; // default is ultra high res // calibration vars int16_t AC1, AC2, AC3, B1, B2, MB, MC, MD; uint16_t AC4, AC5, AC6; // calculation vars int32_t x1, x2, x3, b3, b5, b6, press; uint32_t b4, b7, up, ut; int16_t temp; bool operatingState; /* * these settings aren't used, as these bitfields * cause trouble and are ignored in the hpl layer */ msp430_i2c_union_config_t msp430_i2c_my_config = { { rxdmaen : 0, txdmaen : 0, xa : 0, listen : 0, mst : 1, i2cword : 0, i2crm : 1, i2cssel : 0x2, i2cpsc : 0, i2csclh : 0x3, i2cscll : 0x3, i2coa : 0, } }; enum { WAITING_ON_REG, NORMAL }; command error_t Init.init() { TOSH_SET_ADC_1_PIN(); // this is a pull-up to enable the i2c bus TOSH_SET_ADC_2_PIN(); // module clear pin, logical false (basically reset) call HplI2C.setModeI2C(&msp430_i2c_my_config); call I2CInit.init(); TOSH_MAKE_SER0_RTS_INPUT(); // this is the EOC (end o calculation) pin oss = 3; operatingState = NORMAL; enabled = FALSE; return SUCCESS; } task void cal(){ readReg(0xaa, 22); } command error_t StdControl.start(){ // this is the EOC (end o calculation) pin atomic { call Msp430GeneralIO.makeInput(); call Msp430GeneralIO.selectIOFunc(); call EOCInterrupt.disable(); call EOCInterrupt.edge(TRUE); call EOCInterrupt.clear(); call EOCInterrupt.enable(); } call PressureSensor.powerUp(); TOSH_uwait(15000); // power-on startup time enabled = TRUE; post cal(); return SUCCESS; } command error_t StdControl.stop(){ call EOCInterrupt.disable(); enabled = FALSE; call PressureSensor.powerDown(); call EOCInterrupt.clear(); TOSH_CLR_ADC_1_PIN(); // disable the i2c bus return SUCCESS; } command void PressureSensor.disableBus(){ call HplI2C.disableI2C(); enabled = FALSE; call EOCInterrupt.disable(); call EOCInterrupt.clear(); // TOSH_CLR_ADC_1_PIN(); // disable the i2c bus } command void PressureSensor.enableBus(){ TOSH_SET_ADC_1_PIN(); // this is a pull-up to enable the i2c bus call HplI2C.setModeI2C(&msp430_i2c_my_config); enabled = TRUE; call EOCInterrupt.clear(); call EOCInterrupt.enable(); } command void PressureSensor.powerUp(){ TOSH_SET_ADC_2_PIN(); // out of reset } command void PressureSensor.powerDown(){ TOSH_CLR_ADC_2_PIN(); // reset } void readReg(uint8_t reg_addr, uint8_t size){ // first we have to write the unary register address uint8_t ra = reg_addr; operatingState = WAITING_ON_REG; bytesToRead = size; call I2CInit.init(); call I2CPacket.write(I2C_START | I2C_STOP, 0x77, 1, &ra); } error_t writeReg(uint8_t reg_addr, uint8_t val) { // pack the packet with address of reg target, then register value *packet = reg_addr; *(packet + 1) = val; *(packet + 2) = *(packet + 3) = 0; call I2CInit.init(); // write addr is 0xee, so 7-bit addr should be 77 return call I2CPacket.write(I2C_START | I2C_STOP, 0x77, 3, packet); } task void cleanup() { readReg(regToRead, bytesToRead); } async event void EOCInterrupt.fired() { call EOCInterrupt.clear(); post cleanup(); } command void PressureSensor.readTemperature() { operatingState = NORMAL; regToRead = 0xf6; bytesToRead = 2; writeReg(0xf4, 0x2e); } command void PressureSensor.readPressure(){ uint8_t pressureMode; pressureMode = 0x34 + (oss << 6); operatingState = NORMAL; regToRead = 0xf6; bytesToRead = 3; writeReg(0xf4, pressureMode); } task void calc_temp() { x1 = (ut - AC6) * AC5 >> 15; x2 = ((int32_t)MC << 11) / (x1 + (int32_t)MD); b5 = x1 + x2; temp = (b5 + 8) >> 4; signal PressureSensor.tempAvailable(&temp); } task void calc_press() { b6 = b5 - 4000; x1 = (int32_t)B2 * (b6 * b6 >> 12) >> 11; x2 = (int32_t)AC2 * b6 >> 11; x3 = x1 + x2; b3 = (((((int32_t)AC1 << 2) + x3) << oss) + 2) >> 2; x1 = (int32_t)AC3 * b6 >> 13; x2 = (int32_t)B1 * (b6 * b6 >> 12) >> 16; x3 = (x1 + x2 + 2) >> 2; b4 = (uint32_t)AC4 * (uint32_t)(x3 + 32768L) >> 15; b7 = (uint32_t)(up - b3) * (50000UL >> oss); if(b7 < 0x80000000UL) press = (b7 << 1) / b4; else press = b7 / b4 << 1; x1 = (press >> 8) * (press >> 8); x1 = x1 * 3038 >> 16; x2 = -7357 * press >> 16; press = press + ((x1 + x2 + 3791) >> 4); signal PressureSensor.pressAvailable(&press); } task void store_cal(){ uint16_t * src; src = sbuf0; AC1 = *(int16_t *)src++; AC2 = *(int16_t *)src++; AC3 = *(int16_t *)src++; AC4 = *src++; AC5 = *src++; AC6 = *src++; B1 = *(int16_t *)src++; B2 = *(int16_t *)src++; MB = *(int16_t *)src++; MC = *(int16_t *)src++; MD = *(int16_t *)src++; } task void collect_data() { register uint8_t i; uint16_t * src, * dest; uint8_t swapbuff[128]; uint8_t pressureData[4]; // temp if(bytesRead == 2){ src = swapbuff; *(swapbuff + 1) = *readbuff; *swapbuff = *(readbuff + 1); ut = *src; post calc_temp(); } // pressure else if(bytesRead == 3){ *pressureData = *readbuff; *(pressureData + 1) = *(readbuff + 1); *(pressureData + 2) = *(readbuff + 2); up = ((uint32_t)*pressureData << 16 | (uint32_t)*(pressureData + 1) << 8 | *(pressureData + 2)) >> (8 - oss); post calc_press(); } // calibration else if(!(bytesRead % 2)){ src = swapbuff; dest = sbuf0; for(i = 0; i < bytesRead; i+=2){ *(swapbuff + i + 1) = *(readbuff + i); *(swapbuff + i) = *(readbuff + i + 1); *dest++ = *src++; } post store_cal(); } } /* * 0 = ultra low power; power ~3uA, conversion time 4.5ms * 1 = standard ; power ~5uA, conversion time 7.5ms * 2 = high res ; power ~7uA, conversion time 13.5ms * 3 = ultra high res ; power ~12uA, conversion time 25.5ms */ command void PressureSensor.setSensingMode(uint8_t mode){ oss = mode; } async event void I2CPacket.readDone(error_t _success, uint16_t _addr, uint8_t _length, uint8_t* _data) { if(enabled){ bytesRead = _length; memcpy(readbuff, _data, _length); post collect_data(); } } async event void I2CPacket.writeDone(error_t _success, uint16_t _addr, uint8_t _length, uint8_t* _data) { if(enabled){ if(operatingState == WAITING_ON_REG){ call I2CPacket.read(I2C_START | I2C_STOP, 0x77, bytesToRead, readbuff); operatingState = NORMAL; } } } async event void UsartInterrupts.rxDone( uint8_t data ) {} async event void UsartInterrupts.txDone() {} async event void I2CInterrupts.fired() {} /* // these will trigger from the i2civ, but separate interrupts are available in i2cifg (separate enable, too). async event void I2CEvents.arbitrationLost() { } async event void I2CEvents.noAck() { } async event void I2CEvents.ownAddr() { } async event void I2CEvents.readyRegAccess() { } async event void I2CEvents.readyRxData() { } async event void I2CEvents.readyTxData() { } async event void I2CEvents.generalCall() { } async event void I2CEvents.startRecv() { } */ } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/bmp085/PressureSensor.nc000066400000000000000000000041021207233610700257650ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date September, 2010 * */ interface PressureSensor { command void powerUp(); command void powerDown(); /* * range 0 to 3, lowest power to highest resolution * see driver for details */ command void setSensingMode(uint8_t mode); command void readTemperature(); command void readPressure(); command void disableBus(); command void enableBus(); event void tempAvailable(int16_t * data); event void pressAvailable(int32_t * data); } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/bmp085/PressureSensorC.nc000066400000000000000000000047551207233610700261060ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date November, 2010 */ configuration PressureSensorC { provides { interface Init; interface StdControl; interface PressureSensor; } } implementation { components Bmp085P; Init = Bmp085P; StdControl = Bmp085P; PressureSensor = Bmp085P; enum { CLIENT_ID = unique( MSP430_I2CO_BUS ), }; components Msp430I2CP; // this is mine, ported from tos-1.x; find it in shimmer/chips/msp430 Bmp085P.I2CPacket -> Msp430I2CP.I2CBasicAddr; Bmp085P.I2CInit -> Msp430I2CP.I2CInit; components HplMsp430I2C0C; Bmp085P.HplI2C -> HplMsp430I2C0C; Msp430I2CP.HplI2C -> HplMsp430I2C0C; components HplMsp430Usart0C; Msp430I2CP.I2CInterrupts -> HplMsp430Usart0C; components HplMsp430InterruptP; Bmp085P.EOCInterrupt -> HplMsp430InterruptP.Port13; components HplMsp430GeneralIOC as GpioC; Bmp085P.Msp430GeneralIO -> GpioC.Port13; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420/000077500000000000000000000000001207233610700223265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420/HplCC2420AlarmC.nc000066400000000000000000000040231207233610700251700ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of 32khz alarms for the ChipCon CC2420 radio * connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2009-10-21 18:13:22 $ */ generic configuration HplCC2420AlarmC() { provides interface Init; provides interface Alarm as Alarm32khz32; } implementation { components new Alarm32khz32C(); Init = Alarm32khz32C; Alarm32khz32 = Alarm32khz32C; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420/HplCC2420InterruptsC.nc000066400000000000000000000061371207233610700263230ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of interrupts and captures for the ChipCon * CC2420 radio connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.3 $ $Date: 2010-01-20 18:17:32 $ */ /** * Ported to the SHIMMER platform. * * @author Konrad Lorincz * @date May 14, 2008 * re-written to use interrupt-driven sfd capture; * shimmer2 does not have sfd wired to a timer pin * @author Steve Ayer * @date January, 2010 */ configuration HplCC2420InterruptsC { provides interface GpioCapture as CaptureSFD; provides interface GpioInterrupt as InterruptSFD; provides interface GpioInterrupt as InterruptCCA; provides interface GpioInterrupt as InterruptFIFOP; } implementation { components HplMsp430InterruptC; components new Msp430InterruptC() as InterruptCCAC; components new Msp430InterruptC() as InterruptFIFOPC; components new Msp430InterruptC() as InterruptSFDC; InterruptCCAC.HplInterrupt -> HplMsp430InterruptC.Port27; InterruptFIFOPC.HplInterrupt -> HplMsp430InterruptC.Port12; InterruptSFDC.HplInterrupt -> HplMsp430InterruptC.Port10; components HplCC2420InterruptsP; components Counter32khz16C; components new GpioCaptureC() as CaptureSFDC; components HplCC2420PinsC; CaptureSFD = HplCC2420InterruptsP.CaptureSFD; HplCC2420InterruptsP.InterruptSFD -> InterruptSFDC.Interrupt; HplCC2420InterruptsP.Counter -> Counter32khz16C; InterruptCCA = InterruptCCAC.Interrupt; InterruptFIFOP = InterruptFIFOPC.Interrupt; InterruptSFD = InterruptSFDC.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420/HplCC2420InterruptsP.nc000066400000000000000000000052401207233610700263320ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date January, 2010 * * this implements an interrupt-driven capture interface for the cc2420 * tx-mode use of sfd. shimmer2 does not have sfd routed to a timer pin * on the msp430, so cc2420's capture mechanism fails. * this module will trigger a capture.captured event after receiving the * appropriate interrupt from the shimmer2 sfd pin (1.0) */ module HplCC2420InterruptsP @safe() { provides{ interface GpioCapture as CaptureSFD; } uses{ interface GpioInterrupt as InterruptSFD; interface Counter; } } implementation { async command error_t CaptureSFD.captureRisingEdge() { call InterruptSFD.enableRisingEdge(); return SUCCESS; } async command error_t CaptureSFD.captureFallingEdge() { call InterruptSFD.enableFallingEdge(); return SUCCESS; } async command void CaptureSFD.disable() { call InterruptSFD.disable(); } async event void InterruptSFD.fired() { uint16_t t = call Counter.get(); signal CaptureSFD.captured(t); } async event void Counter.overflow() { } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420/HplCC2420PinsC.nc000066400000000000000000000055351207233610700250560ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of general-purpose I/O for the ChipCon CC2420 * radio connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2009-10-21 18:13:22 $ */ /** * Ported to the SHIMMER platform. * * @author Konrad Lorincz * @date May 14, 2008 */ configuration HplCC2420PinsC { provides interface GeneralIO as CCA; provides interface GeneralIO as CSN; provides interface GeneralIO as FIFO; provides interface GeneralIO as FIFOP; provides interface GeneralIO as RSTN; provides interface GeneralIO as SFD; provides interface GeneralIO as VREN; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> GeneralIOC.Port27; CSNM -> GeneralIOC.Port54; FIFOM -> GeneralIOC.Port15; FIFOPM -> GeneralIOC.Port12; RSTNM -> GeneralIOC.Port57; SFDM -> GeneralIOC.Port10; VRENM -> GeneralIOC.Port56; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420/HplCC2420SpiC.nc000066400000000000000000000041541207233610700246740ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of the SPI bus for the ChipCon CC2420 radio * connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2009-10-21 18:13:22 $ */ /** * Ported to the SHIMMER platform. * * @author Konrad Lorincz */ generic configuration HplCC2420SpiC() { provides interface Resource; provides interface SpiByte; provides interface SpiPacket; } implementation { components new Msp430Spi1C() as SpiC; Resource = SpiC; SpiByte = SpiC; SpiPacket = SpiC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420x/000077500000000000000000000000001207233610700225165ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420x/HplCC2420XInterruptsP.nc000066400000000000000000000052651207233610700266610ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date January, 2010 * * this implements an interrupt-driven capture interface for the cc2420 * tx-mode use of sfd. shimmer2 does not have sfd routed to a timer pin * on the msp430, so cc2420's capture mechanism fails. * this module will trigger a capture.captured event after receiving the * appropriate interrupt from the shimmer2 sfd pin (1.0) */ module HplCC2420XInterruptsP @safe() { provides{ interface GpioCapture as SfdCapture; } uses{ interface GpioInterrupt as InterruptSFD; interface Counter; interface Leds; } } implementation { async command error_t SfdCapture.captureRisingEdge() { call InterruptSFD.enableRisingEdge(); return SUCCESS; } async command error_t SfdCapture.captureFallingEdge() { call InterruptSFD.enableFallingEdge(); return SUCCESS; } async command void SfdCapture.disable() { call InterruptSFD.disable(); } async event void InterruptSFD.fired() { uint16_t t = call Counter.get(); signal SfdCapture.captured(t); } async event void Counter.overflow() { } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420x/HplSFDXInterruptsC.nc000066400000000000000000000053341207233610700264600ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of interrupts and captures for the ChipCon * CC2420 radio connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2011-04-27 19:36:45 $ */ /** * Ported to the SHIMMER platform. * * @author Konrad Lorincz * @date May 14, 2008 * re-written to use interrupt-driven sfd capture; * shimmer2 does not have sfd wired to a timer pin * @author Steve Ayer * @date January, 2010 */ configuration HplSFDXInterruptsC { provides interface GpioCapture as SfdCapture; provides interface GpioInterrupt as InterruptSFD; } implementation { components HplMsp430InterruptC; components new Msp430InterruptC() as InterruptSFDC; InterruptSFDC.HplInterrupt -> HplMsp430InterruptC.Port10; components HplCC2420XInterruptsP; components Counter32khz16C; components new GpioCaptureC() as SfdCaptureC; SfdCapture = HplCC2420XInterruptsP.SfdCapture; HplCC2420XInterruptsP.InterruptSFD -> InterruptSFDC.Interrupt; HplCC2420XInterruptsP.Counter -> Counter32khz16C; InterruptSFD = InterruptSFDC.Interrupt; components LedsC; HplCC2420XInterruptsP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420x/t32khz/000077500000000000000000000000001207233610700236435ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420x/t32khz/HplCC2420XC.nc000066400000000000000000000060111207233610700256570ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ configuration HplCC2420XC { provides { interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface LocalTime as LocalTimeRadio; interface Init; interface Alarm; } } implementation { components HplMsp430GeneralIOC as IO, new Msp430Spi1C() as SpiC; // pins components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> IO.Port27; CSNM -> IO.Port54; FIFOM -> IO.Port15; FIFOPM -> IO.Port12; RSTNM -> IO.Port57; SFDM -> IO.Port10; VRENM -> IO.Port56; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; // spi SpiResource = SpiC.Resource; FastSpiByte = SpiC; /* * original capture won't work, sfd is not on a capture pin components Msp430TimerC as TimerC; components new GpioCaptureC(); GpioCaptureC.Msp430TimerControl -> TimerC.ControlA1; GpioCaptureC.Msp430Capture -> TimerC.CaptureA1; GpioCaptureC.GeneralIO -> IO.Port10; SfdCapture = GpioCaptureC; */ // this replaces it, interrupt-based gpiocapture implementation components HplSFDXInterruptsC; SfdCapture = HplSFDXInterruptsC; components new Msp430InterruptC() as FifopInterruptC, HplMsp430InterruptC; FifopInterruptC.HplInterrupt -> HplMsp430InterruptC.Port12; FifopInterrupt = FifopInterruptC.Interrupt; // alarm components new Alarm32khz16C() as AlarmC; Alarm = AlarmC; Init = AlarmC; // localTime components LocalTime32khzC; LocalTimeRadio = LocalTime32khzC.LocalTime; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420x/t32khz/RadioConfig.h000066400000000000000000000043731207233610700262070ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #ifndef __RADIOCONFIG_H__ #define __RADIOCONFIG_H__ #include #include //#include #define RADIO_DEBUG #define RADIO_DEBUG_MESSAGES #define RADIO_DEBUG_IRQ /* This is the default value of the PA_POWER field of the TXCTL register. */ #ifndef CC2420X_DEF_RFPOWER #define CC2420X_DEF_RFPOWER 0 #endif /* This is the default value of the CHANNEL field of the FSCTRL register. */ #ifndef CC2420X_DEF_CHANNEL #define CC2420X_DEF_CHANNEL 11 #endif /* The number of microseconds a sending micaz mote will wait for an acknowledgement */ #ifndef SOFTWAREACK_TIMEOUT #define SOFTWAREACK_TIMEOUT 800 #endif /** * This is the timer type of the radio alarm interface */ typedef T32khz TRadio; typedef uint16_t tradio_size; /** * The number of radio alarm ticks per one microsecond (0.9216). * We use integers and no parentheses just to make deputy happy. * Ok, further hacks were required for deputy, I removed 00 from the * beginning and end to be able to handle longer wait periods. */ #define RADIO_ALARM_MICROSEC 1/32 /** * The base two logarithm of the number of radio alarm ticks per one millisecond */ #define RADIO_ALARM_MILLI_EXP 5 #endif//__RADIOCONFIG_H__ tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420x/tmicro/000077500000000000000000000000001207233610700240135ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420x/tmicro/HplCC2420XC.nc000066400000000000000000000060111207233610700260270ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ configuration HplCC2420XC { provides { interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface LocalTime as LocalTimeRadio; interface Init; interface Alarm; } } implementation { components HplMsp430GeneralIOC as IO, new Msp430Spi1C() as SpiC; // pins components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> IO.Port27; CSNM -> IO.Port54; FIFOM -> IO.Port15; FIFOPM -> IO.Port12; RSTNM -> IO.Port57; SFDM -> IO.Port10; VRENM -> IO.Port56; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; // spi SpiResource = SpiC.Resource; FastSpiByte = SpiC; /* * original capture won't work, sfd is not on a capture pin components Msp430TimerC as TimerC; components new GpioCaptureC(); GpioCaptureC.Msp430TimerControl -> TimerC.ControlA1; GpioCaptureC.Msp430Capture -> TimerC.CaptureA1; GpioCaptureC.GeneralIO -> IO.Port12; SfdCapture = GpioCaptureC; */ // this replaces it, interrupt-based gpiocapture implementation components HplSFDXInterruptsC; SfdCapture = HplSFDXInterruptsC; components new Msp430InterruptC() as FifopInterruptC, HplMsp430InterruptC; FifopInterruptC.HplInterrupt -> HplMsp430InterruptC.Port12; FifopInterrupt = FifopInterruptC.Interrupt; // alarm components new AlarmMicro16C() as AlarmC; Alarm = AlarmC; Init = AlarmC; // localTime components LocalTimeMicroC; LocalTimeRadio = LocalTimeMicroC.LocalTime; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/cc2420x/tmicro/RadioConfig.h000066400000000000000000000043711207233610700263550ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #ifndef __RADIOCONFIG_H__ #define __RADIOCONFIG_H__ #include #include //#include #define RADIO_DEBUG #define RADIO_DEBUG_MESSAGES #define RADIO_DEBUG_IRQ /* This is the default value of the PA_POWER field of the TXCTL register. */ #ifndef CC2420X_DEF_RFPOWER #define CC2420X_DEF_RFPOWER 0 #endif /* This is the default value of the CHANNEL field of the FSCTRL register. */ #ifndef CC2420X_DEF_CHANNEL #define CC2420X_DEF_CHANNEL 11 #endif /* The number of microseconds a sending micaz mote will wait for an acknowledgement */ #ifndef SOFTWAREACK_TIMEOUT #define SOFTWAREACK_TIMEOUT 800 #endif /** * This is the timer type of the radio alarm interface */ typedef TMicro TRadio; typedef uint16_t tradio_size; /** * The number of radio alarm ticks per one microsecond (0.9216). * We use integers and no parentheses just to make deputy happy. * Ok, further hacks were required for deputy, I removed 00 from the * beginning and end to be able to handle longer wait periods. */ #define RADIO_ALARM_MICROSEC 1 /** * The base two logarithm of the number of radio alarm ticks per one millisecond */ #define RADIO_ALARM_MILLI_EXP 10 #endif//__RADIOCONFIG_H__ tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/fgpmmopa6b/000077500000000000000000000000001207233610700234675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/fgpmmopa6b/Fgpmmopa6bP.nc000066400000000000000000000140001207233610700261220ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date September, 2010 */ module Fgpmmopa6bP { provides { interface Init; interface Gps; } uses { interface HplMsp430Usart as UARTControl; interface HplMsp430UsartInterrupts as UARTData; } } implementation { extern int sprintf(char *str, const char *format, ...) __attribute__ ((C)); char databuf0[256], databuf1[256], * scout, cmdstring[128]; uint8_t current_buffer, toSend, charsSent; bool transmissionComplete; task void send_command(); task void setupUART() { msp430_uart_union_config_t RN_uart_config = { { ubr: UBR_1MHZ_115200, umctl: UMCTL_1MHZ_115200, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 0, urxwie: 0, utxe : 1, urxe :1 } }; call UARTControl.setModeUart(&RN_uart_config); // set to UART mode call UARTControl.enableTxIntr(); call UARTControl.enableRxIntr(); } command error_t Init.init() { TOSH_SET_PROG_OUT_PIN(); TOSH_MAKE_ADC_6_INPUT(); transmissionComplete = FALSE; post setupUART(); call Gps.enable(); return SUCCESS; } command void Gps.enable() { scout = databuf0; current_buffer = 0; TOSH_CLR_PROG_OUT_PIN(); } command void Gps.disable() { TOSH_SET_PROG_OUT_PIN(); } command void Gps.disableBus(){ call UARTControl.disableUart(); } command void Gps.enableBus(){ post setupUART(); } uint8_t byteCRC(char * str) { register uint8_t i; uint8_t sum = 0, len; len = strlen(str); for(i = 0; i < len; i++) sum = sum ^ *(str + i); return sum; } /* * string of boolean on/off switches for sentences, in order * 0 NMEA_SEN_GLL, // GPGLL interval - Geographic Position - Latitude longitude * 1 NMEA_SEN_RMC, // GPRMC interval - Recomended Minimum Specific GNSS * Sentence * 2 NMEA_SEN_VTG, // GPVTG interval - Course Over Ground and Ground Speed * 3 NMEA_SEN_GGA, // GPGGA interval - GPS Fix Data * 4 NMEA_SEN_GSA, // GPGSA interval - GNSS DOPS and Active Satellites * 5 NMEA_SEN_GSV, // GPGSV interval - GNSS Satellites in View * 18 NMEA_SEN_MCHN, // PMTKCHN interval \u2013 GPS channel status */ command void Gps.restrictNMEASentences() { uint8_t crc; char cmd[128]; sprintf(cmd, "$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"); crc = byteCRC(cmd + 1); sprintf(cmdstring, "%s*%02X\r\n", cmd, crc); post send_command(); } command void Gps.resetNMEASentences() { sprintf(cmdstring, "$PMTK314,-1*04\r\n"); post send_command(); } /* * range is 0/ 0.2/ 0.4/ 0.6/ 0.8/ 1.0/1.5/2.0 (m/s) * e.g. * $PMTK397,0.20* * $PMTK397,0* */ command void Gps.setNavThreshold() { uint8_t crc; char cmd[128]; sprintf(cmd, "$PMTK397,0"); crc = byteCRC(cmd + 1); sprintf(cmdstring, "%s*%02X\r\n", cmd, crc); post send_command(); } command void Gps.getNavThreshold() { sprintf(cmdstring, "$PMTK447*35\r\n"); post send_command(); } // tell it to come up in hot start mode command void Gps.setHotStart() { sprintf(cmdstring, "$PMTK101*32\r\n"); post send_command(); } // datarate in milliseconds, min 100 command void Gps.setDatarate(uint16_t datarate) { uint8_t crc; char cmd[128]; sprintf(cmd, "$PMTK300,%d,0,0,0,0", datarate); crc = byteCRC(cmd + 1); sprintf(cmdstring, "%s*%02X\r\n", cmd, crc); post send_command(); } task void tell_app() { if(current_buffer == 0) signal Gps.NMEADataAvailable(databuf1); else signal Gps.NMEADataAvailable(databuf0); } async event void UARTData.rxDone(uint8_t data) { if(!call UARTControl.isUart()) return; *scout = data; scout++; if(*(scout - 1) == '\n'){ *(scout - 2) = '\0'; if(current_buffer == 0){ scout = databuf1; current_buffer = 1; } else{ scout = databuf0; current_buffer = 0; } post tell_app(); } } task void sendOneChar() { if(charsSent < toSend) call UARTControl.tx(cmdstring[charsSent++]); else{ transmissionComplete = TRUE; } } task void send_command() { toSend = strlen(cmdstring) + 1; charsSent = 0; transmissionComplete = FALSE; post sendOneChar(); } async event void UARTData.txDone() { if(!call UARTControl.isUart()) return; if(!transmissionComplete) { post sendOneChar(); } } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/fgpmmopa6b/Gps.nc000066400000000000000000000040501207233610700245410ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date September, 2010 */ interface Gps { command void enable(); command void disable(); command void setDatarate(uint16_t datarate); command void setNavThreshold(); command void getNavThreshold(); command void setHotStart(); command void restrictNMEASentences(); command void resetNMEASentences(); command void disableBus(); command void enableBus(); async event void NMEADataAvailable(char * data); } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/fgpmmopa6b/GpsC.nc000066400000000000000000000036751207233610700246600ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date September, 2010 */ configuration GpsC { provides { interface Init; interface Gps; } } implementation { components Fgpmmopa6bP; Init = Fgpmmopa6bP; Gps = Fgpmmopa6bP; components HplMsp430Usart0C; Fgpmmopa6bP.UARTControl -> HplMsp430Usart0C; Fgpmmopa6bP.UARTData -> HplMsp430Usart0C; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/gyro/000077500000000000000000000000001207233610700224115ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/gyro/GyroBoard.nc000066400000000000000000000037721207233610700246340ustar00rootroot00000000000000/* * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date August 2009 * * tinyos-2.x port * @date March, 2010 * */ interface GyroBoard { // no explicit enable/disable, use stdcontrol. // it has its own command void ledOn(); command void ledOff(); command void ledToggle(); command void autoZero(); // it has its own, just a reflection of UserButton.fired(), which is debounced async event void buttonPressed(); } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/gyro/GyroBoardC.nc000066400000000000000000000037551207233610700247400ustar00rootroot00000000000000/* * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date August 2009 * * tinyos-2.x port * @date March, 2010 */ configuration GyroBoardC { provides{ interface Init; interface StdControl; interface GyroBoard; } } implementation { components GyroBoardP; Init = GyroBoardP; StdControl = GyroBoardP; GyroBoard = GyroBoardP; components GyroButtonC; GyroBoardP.buttonNotify -> GyroButtonC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/gyro/GyroBoardP.nc000066400000000000000000000104061207233610700247440ustar00rootroot00000000000000/* * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date August, 2009 * * tinyos-2.x port * @date March, 2010 * */ #include module GyroBoardP { provides { interface Init; interface StdControl; interface GyroBoard; } uses{ interface Notify as buttonNotify; } } implementation { command error_t Init.init(){ register uint16_t i; // power, active low TOSH_MAKE_PROG_OUT_OUTPUT(); TOSH_SEL_PROG_OUT_IOFUNC(); TOSH_SET_PROG_OUT_PIN(); // off // analog signal enable, active low TOSH_MAKE_SER0_CTS_OUTPUT(); TOSH_SEL_SER0_CTS_IOFUNC(); TOSH_SET_SER0_CTS_PIN(); // signal disabled // signal goes to gyro-zero pins TOSH_MAKE_UTXD0_OUTPUT(); TOSH_SEL_UTXD0_IOFUNC(); TOSH_CLR_UTXD0_PIN(); // this one tied to the led TOSH_MAKE_URXD0_OUTPUT(); TOSH_SEL_URXD0_IOFUNC(); call GyroBoard.ledOff(); // x TOSH_MAKE_ADC_1_INPUT(); TOSH_SEL_ADC_1_MODFUNC(); // y TOSH_MAKE_ADC_6_INPUT(); TOSH_SEL_ADC_6_MODFUNC(); // z TOSH_MAKE_ADC_2_INPUT(); TOSH_SEL_ADC_2_MODFUNC(); /* * gyro power-down after start-up transients, which are particularly rough during programming * we're waiting for caps to discharge... */ for(i = 0; i < 6000; i++) TOSH_uwait(1000); // now power it up, max ready-time 200ms TOSH_CLR_PROG_OUT_PIN(); for(i = 0; i < 200; i++) TOSH_uwait(1000); call buttonNotify.enable(); return SUCCESS; } command error_t StdControl.start(){ // call buttonNotify.enable(); /* * adding a redundant power-up for apps that power cycle the gyro mid-course to save current * since we're past the initial on-dock programming, gyro should power back up gracefully */ TOSH_CLR_PROG_OUT_PIN(); // enable analog signal path TOSH_CLR_SER0_CTS_PIN(); return SUCCESS; } command error_t StdControl.stop(){ // disable analog signals, then power down TOSH_SET_SER0_CTS_PIN(); TOSH_SET_PROG_OUT_PIN(); // kill the led call GyroBoard.ledOff(); // call buttonNotify.disable(); return SUCCESS; } command void GyroBoard.autoZero() { TOSH_SET_UTXD0_PIN(); TOSH_uwait(100); // pulse between 2 (!) and 1500 usec TOSH_CLR_UTXD0_PIN(); TOSH_uwait(6900); // takes 7ms to settle } command void GyroBoard.ledOn() { TOSH_CLR_URXD0_PIN(); } command void GyroBoard.ledOff() { TOSH_SET_URXD0_PIN(); } command void GyroBoard.ledToggle() { TOSH_TOGGLE_URXD0_PIN(); } event void buttonNotify.notify( button_state_t val){ signal GyroBoard.buttonPressed(); } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/gyro/GyroButtonC.nc000066400000000000000000000051371207233610700251600ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform. Get * returns the current state of the button by reading the pin, * regardless of whether enable() or disable() has been called on the * Interface. Notify.enable() and Notify.disable() modify the * underlying interrupt state of the pin, and have the effect of * enabling or disabling notifications that the button has changed * state. * * @author Gilman Tolle * @version $Revision: 1.2 $ * port to shimmer-style * @author Steve Ayer * @date February, 2010 */ #include configuration GyroButtonC { provides interface Notify; } implementation { components HplGyroButtonC; components new SwitchToggleC(); SwitchToggleC.GpioInterrupt -> HplGyroButtonC.GpioInterrupt; SwitchToggleC.GeneralIO -> HplGyroButtonC.GeneralIO; components GyroButtonP; Notify = GyroButtonP; components new TimerMilliC() as debounceTimer; GyroButtonP.NotifyLower -> SwitchToggleC.Notify; GyroButtonP.debounceTimer -> debounceTimer; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/gyro/GyroButtonP.nc000066400000000000000000000050251207233610700251710ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform * * @author Gilman Tolle * @version $Revision: 1.1 $ * port to shimmer-style * @author Steve Ayer * @date February, 2010 */ #include module GyroButtonP { provides interface Notify; uses interface Notify as NotifyLower; uses interface Timer as debounceTimer; } implementation { command error_t Notify.enable() { return call NotifyLower.enable(); } command error_t Notify.disable() { return call NotifyLower.disable(); } event void debounceTimer.fired() { call Notify.enable(); // re-enable interrupt signal Notify.notify( BUTTON_PRESSED ); } task void debounce() { call debounceTimer.startOneShot(250); } event void NotifyLower.notify( bool val ) { // we've only enabled interrupt from rising edge post debounce(); } default event void Notify.notify( button_state_t val ) { } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/gyro/HplGyroButtonC.nc000066400000000000000000000044201207233610700256160ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telos platform * * @author Gilman Tolle * @version $Revision: 1.2 $ * (not much to) port to shimmer2 gyro * @author Steve Ayer * @date March, 2010 */ configuration HplGyroButtonC { provides interface GeneralIO; provides interface GpioInterrupt; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components HplMsp430InterruptC as InterruptC; components new Msp430GpioC() as UserButtonC; UserButtonC -> GeneralIOC.Port13; GeneralIO = UserButtonC; components new Msp430InterruptC() as InterruptUserButtonC; InterruptUserButtonC.HplInterrupt -> InterruptC.Port13; GpioInterrupt = InterruptUserButtonC.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/gyromag/000077500000000000000000000000001207233610700230765ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/gyromag/GyroMagBoard.nc000066400000000000000000000064331207233610700257430ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date March, 2010 */ interface GyroMagBoard { // gyroboard stuff first command void ledOn(); command void ledOff(); command void ledToggle(); // for gyro, use use GyroStdControl, see platform's GyroMagBoardC command void gyroAutoZero(); // magnetometer uses its own stdcontrol, see platform's GyroMagBoardC // 0.5, 1, 2, 5, 10 (default), 20, 50hz. 20 and 50 up power burn dramatically command error_t setMagOutputRate(uint8_t rate); // +-0.7, 1.0 (default), 1.5, 2.0, 3.2, 3.8, 4.5Ga command error_t setMagGain(uint8_t gain); command error_t setMagIdle(); command error_t magGoToSleep(); command error_t magRunSingleConversion(); command error_t magRunContinuousConversion(); // call to clock out data; collect it from the "done" event command error_t readMagData(); // convert raw data to heading command uint16_t readMagHeading(uint8_t * readBuf); // read result after readdone event command void magSelfTest(); // call this to see three-axis magnetometer values command void convertMagRegistersToData(uint8_t * readBuf, int16_t * data); // this is where the app will find its mag readings event void magReadDone(uint8_t * data, error_t success); event void magWriteDone(error_t success); // it has its own, just a reflection of UserButton.fired(), which is debounced async event void buttonPressed(); // event void magReady(); command void writeReg(uint8_t reg_addr, uint8_t val); // command error_t readValues(uint8_t reg_addr, uint8_t size, uint8_t * data); // command error_t readValues(uint8_t size, uint8_t * data); // command error_t poke(uint8_t val); // command error_t peek(uint8_t * val); } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/gyromag/GyroMagBoardC.nc000066400000000000000000000064651207233610700260530ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date March, 2010 * * @author Steve Ayer * @date July, 2010 * tos-2.x port * * wiring to msp430 i2c implmentation to flesh out gyro/mag board on shimmer2 * using direct module because we don't need arbitration for this platform. * note gyro implementation is used for everything except mag */ configuration GyroMagBoardC { provides { interface Init; interface StdControl; interface GyroMagBoard; } } implementation { components GyroMagBoardP; Init = GyroMagBoardP; StdControl = GyroMagBoardP; GyroMagBoard = GyroMagBoardP; components LedsC; GyroMagBoardP.Leds -> LedsC; components new TimerMilliC() as testTimer; GyroMagBoardP.testTimer -> testTimer; enum { CLIENT_ID = unique( MSP430_I2CO_BUS ), }; components Msp430I2CP; // this is mine, ported from tos-1.x; find it in shimmer/chips/msp430 GyroMagBoardP.I2CPacket -> Msp430I2CP.I2CBasicAddr; HplMsp430Usart0P.HplI2C -> HplMsp430I2C0P.HplI2C; components HplMsp430I2C0P; GyroMagBoardP.HplI2C -> HplMsp430I2C0P.HplI2C; Msp430I2CP.HplI2C -> HplMsp430I2C0P.HplI2C; components HplMsp430Usart0P; HplMsp430I2C0P.HplUsart -> HplMsp430Usart0P.Usart; Msp430I2CP.I2CInterrupts -> HplMsp430Usart0P.I2CInterrupts; components HplMsp430GeneralIOC as GIO; HplMsp430Usart0P.SIMO -> GIO.SIMO0; HplMsp430Usart0P.SOMI -> GIO.SOMI0; HplMsp430Usart0P.UCLK -> GIO.UCLK0; HplMsp430Usart0P.UTXD -> GIO.UTXD0; HplMsp430Usart0P.URXD -> GIO.URXD0; HplMsp430I2C0P.SIMO -> GIO.SIMO0; HplMsp430I2C0P.UCLK -> GIO.UCLK0; components GyroBoardC; GyroMagBoardP.GyroBoard -> GyroBoardC.GyroBoard; GyroMagBoardP.GyroInit -> GyroBoardC.Init; GyroMagBoardP.GyroStdControl -> GyroBoardC.StdControl; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/gyromag/GyroMagBoardP.nc000066400000000000000000000241021207233610700260540ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * @author Steve Ayer * @date March, 2010 * * this module adds functionality of honeywell hmc5843 magnetometer * to similar gyro board (idg-500 3-axis plus user button and led) * * since gyro board is stand-alone, this module uses existing gyro module * and interface for everything but magnetometer. */ #include "Magnetometer.h" module GyroMagBoardP { provides { interface Init; interface StdControl; interface GyroMagBoard; } uses { interface GyroBoard; interface I2CPacket as I2CPacket; interface HplMsp430I2C as HplI2C; interface HplMsp430Usart as Usart; interface HplMsp430UsartInterrupts as UsartInterrupts; interface HplMsp430I2CInterrupts as I2CInterrupts; interface Init as GyroInit; interface StdControl as GyroStdControl; interface Leds; interface Timer as testTimer; } } implementation { extern int sprintf(char *str, const char *format, ...) __attribute__ ((C)); extern int snprintf(char *str, size_t len, const char *format, ...) __attribute__ ((C)); uint8_t readbuff[7], testPhase; uint8_t packet[2], readSize, * readDataBuffer; enum { INIT, WRITE, READ, IDLE, }; #warning "DO NOT CONTINUE TO USE THIS MODULE; IT HAS BEEN DEPRECATED. USE SEPARATE GYROBOARD AND MAGNETOMETER INSTEAD." command error_t Init.init() { msp430_i2c_union_config_t msp430_i2c_my_config = { { rxdmaen : 0, txdmaen : 0, xa : 0, listen : 0, mst : 1, i2cword : 0, i2crm : 1, i2cssel : 0x2, i2cpsc : 0, i2csclh : 0x3, i2cscll : 0x3, i2coa : 0, } }; /* * same power pin as gyro regulator, this will bring up second power pin (first tied to * shimmer regulator). it turns on in idle mode */ call GyroInit.init(); call HplI2C.setModeI2C(&msp430_i2c_my_config); testPhase = 0; return SUCCESS; } command error_t StdControl.start(){ call GyroStdControl.start(); // mag ready time nominally 5ms, though we have lots of lag in gyro power-up called in init // TOSH_uwait(5000UL); return SUCCESS; } command error_t StdControl.stop(){ call GyroStdControl.stop(); return SUCCESS; } // GyroBoard wrappers command void GyroMagBoard.ledOn() { call GyroBoard.ledOn(); } command void GyroMagBoard.ledOff() { call GyroBoard.ledOff(); } command void GyroMagBoard.ledToggle() { call GyroBoard.ledToggle(); } async event void GyroBoard.buttonPressed() { signal GyroMagBoard.buttonPressed(); } // for gyro, use use GyroStdControl, see platform's GyroMagBoardC command void GyroMagBoard.gyroAutoZero() { call GyroBoard.autoZero(); } error_t writeRegValue(uint8_t reg_addr, uint8_t val) { // uint8_t packet[2]; // pack the packet with address of reg target, then register value packet[0] = reg_addr; packet[1] = val; call I2CPacket.write(I2C_START | I2C_STOP, 0x1e, 2, packet); return SUCCESS; } command void GyroMagBoard.writeReg(uint8_t reg_addr, uint8_t val) { writeRegValue(reg_addr, val); } error_t readValues(uint8_t size, uint8_t * data){ readSize = size; readDataBuffer = data; call I2CPacket.read(I2C_START | I2C_STOP, 0x1e, size, data); return SUCCESS; } async event void UsartInterrupts.rxDone( uint8_t data ) {} async event void UsartInterrupts.txDone() {} async event void I2CInterrupts.fired() {} /* * 0.5, 1, 2, 5, 10 (default), 20, 50hz. 20 and 50 up power burn dramatically * bits 2-4 control this, values 0 - 6 map to values above, respectively * since the remainder of the register defaults to 0, we write the mask directly */ command error_t GyroMagBoard.setMagOutputRate(uint8_t rate){ uint8_t ret = SUCCESS, bitmask = 0x10; // default 10hz switch(rate){ case 0: bitmask = 0; break; case 1: bitmask = 0x04; break; case 2: bitmask = 0x08; break; case 3: bitmask = 0x0c; break; case 4: bitmask = 0x10; break; case 5: bitmask = 0x14; break; case 6: bitmask = 0x18; break; default: ret = FAIL; // input value unknown, using default break; } writeRegValue(0, bitmask); return ret; } /* * weird way to do this, but we need to leave the mag time * to run tests without disabling the i2c bus with TOSH_uwait * * read results from readDone event */ command void GyroMagBoard.magSelfTest(){ switch(testPhase++){ case 0: call testTimer.startPeriodic(5); call Leds.led1On(); call GyroMagBoard.writeReg(0, 0x11); break; case 1: call Leds.led1Off(); call GyroMagBoard.writeReg(2, 0x01); break; case 2: call Leds.led1On(); call GyroMagBoard.readMagData(); break; case 3: call Leds.led1Off(); call GyroMagBoard.writeReg(0, 0x10); break; default: call testTimer.stop(); testPhase = 0; break; } } event void testTimer.fired() { call GyroMagBoard.magSelfTest(); } // +-0.7, 1.0 (default), 1.5, 2.0, 3.2, 3.8, 4.5Ga command error_t GyroMagBoard.setMagGain(uint8_t gain){ uint8_t ret = SUCCESS, bitmask = 0x20; // default 1.0Ga switch(gain){ case 0: bitmask = 0x00; break; case 1: bitmask = 0x20; break; case 2: bitmask = 0x40; break; case 5: bitmask = 0x50; break; case 10: bitmask = 0x80; break; case 20: bitmask = 0x90; break; case 50: bitmask = 0xc0; break; default: ret = FAIL; // input value unknown, using default break; } writeRegValue(1, bitmask); return ret; } command error_t GyroMagBoard.setMagIdle(){ writeRegValue(2, 0x02); return SUCCESS; } command error_t GyroMagBoard.magGoToSleep(){ writeRegValue(2, 0x03); return SUCCESS; } command error_t GyroMagBoard.magRunSingleConversion(){ writeRegValue(2, 0x01); return SUCCESS; } command error_t GyroMagBoard.magRunContinuousConversion(){ writeRegValue(2, 0x00); return SUCCESS; } /* * returning the real value doesn't help; * success is measured in the magreaddone event */ command error_t GyroMagBoard.readMagData(){ readValues(7, readbuff); return SUCCESS; } uint16_t mag_to_heading(uint16_t x, uint16_t y, uint16_t z) { uint16_t heading; if(x == 0){ if(y < 0) heading = 270; else heading = 90; } else if(z < 0) heading = (uint16_t)(180.0 - atanf((float)y/(float)-x)); else heading = (uint16_t)(180.0 - atanf((float)y/(float)x)); return heading; } int16_t twos_comp_pack(uint8_t up, uint8_t low) { int16_t out; uint16_t uout; uout = up; uout = uout << 8; uout |= low; out = (int16_t)uout; return out; } // call this to see three-axis magnetometer values command void GyroMagBoard.convertMagRegistersToData(uint8_t * readBuf, int16_t * data){ uint8_t * src; register uint8_t i; src = readBuf; // this loop is just for the three 16-bit x,y,z values for(i = 0; i < 3; i++){ data[i] = twos_comp_pack(*src, *(src + 1)); src += 2; } } // call after readDone event command uint16_t GyroMagBoard.readMagHeading(uint8_t * readBuf){ int16_t realVals[3]; uint16_t heading; call GyroMagBoard.convertMagRegistersToData(readBuf, realVals); heading = mag_to_heading(realVals[0], realVals[1], realVals[2]); return heading; } /* error_t poke(uint8_t val) { return call I2CPacket.writePacket(0x1e, 1, &val); } error_t peek(uint8_t * val) { return call I2CPacket.readPacket(0x1e, 1, val); } */ async event void I2CPacket.readDone(error_t success, uint16_t addr, uint8_t length, uint8_t* data) { signal GyroMagBoard.magReadDone(data, success); } async event void I2CPacket.writeDone(error_t success, uint16_t addr, uint8_t length, uint8_t* data) { signal GyroMagBoard.magWriteDone(success); } /* // these will trigger from the i2civ, but separate interrupts are available in i2cifg (separate enable, too). async event void I2CEvents.arbitrationLost() { } async event void I2CEvents.noAck() { } async event void I2CEvents.ownAddr() { } async event void I2CEvents.readyRegAccess() { } async event void I2CEvents.readyRxData() { } async event void I2CEvents.readyTxData() { } async event void I2CEvents.generalCall() { } async event void I2CEvents.startRecv() { } */ } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/gyromag/Magnetometer.h000066400000000000000000000036421207233610700257030ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * @author Steve Ayer * @date April, 2010 * * attempt to provide mneonics for honeywell HMC5843 config settings */ enum { ZERO_7_GAUSS, ONE_GAUSS, ONE_5_GAUSS, TWO_GAUSS, THREE_2_GAUSS, THREE_8_GAUSS, FOUR_5_GAUSS }; enum { ZERO_5_HZ, ONE_HZ, TWO_HZ, FIVE_HZ, TEN_HZ, TWENTY_HZ, FIFTY_HZ }; tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/hmc5843/000077500000000000000000000000001207233610700225245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/hmc5843/Hmc5843P.nc000066400000000000000000000211701207233610700242220ustar00rootroot00000000000000/* * Copyright (c) 2011, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * @author Steve Ayer * @date February, 2011 * * broken out from original gyromagboard* interface/implementation * * this module adds functionality of honeywell hmc5843 magnetometer * to similar gyro board (idg-500 3-axis plus user button and led) * * since gyro board is stand-alone, this module uses existing gyro module * and interface for everything but magnetometer. */ module Hmc5843P { provides { interface Init; interface Magnetometer; } uses { interface I2CPacket as I2CPacket; interface Init as I2CInit; interface HplMsp430I2C as HplI2C; interface HplMsp430Usart as Usart; interface HplMsp430UsartInterrupts as UsartInterrupts; interface HplMsp430I2CInterrupts as I2CInterrupts; interface Timer as testTimer; } } implementation { extern int sprintf(char *str, const char *format, ...) __attribute__ ((C)); extern int snprintf(char *str, size_t len, const char *format, ...) __attribute__ ((C)); uint8_t readbuff[8], testPhase; uint8_t packet[2], readSize, * readDataBuffer; bool enabled; msp430_i2c_union_config_t msp430_i2c_my_config = { { rxdmaen : 0, txdmaen : 0, xa : 0, listen : 0, mst : 1, i2cword : 0, i2crm : 1, i2cssel : 0x2, i2cpsc : 0, i2csclh : 0x3, i2cscll : 0x3, i2coa : 0, } }; command error_t Init.init() { /* * same power pin as gyro regulator, this will bring up second power pin (first tied to * shimmer regulator). it turns on in idle mode */ // power, active low TOSH_MAKE_PROG_OUT_OUTPUT(); TOSH_SEL_PROG_OUT_IOFUNC(); TOSH_CLR_PROG_OUT_PIN(); // on TOSH_uwait(5000); // 5 ms for mag atomic enabled = FALSE; call Magnetometer.enableBus(); testPhase = 0; return SUCCESS; } command void Magnetometer.enableBus() { call HplI2C.setModeI2C(&msp430_i2c_my_config); call I2CInit.init(); atomic enabled = TRUE; } command void Magnetometer.disableBus() { call HplI2C.clearModeI2C(); atomic enabled = FALSE; } error_t writeRegValue(uint8_t reg_addr, uint8_t val) { // uint8_t packet[2]; // pack the packet with address of reg target, then register value packet[0] = reg_addr; packet[1] = val; call I2CPacket.write(I2C_START | I2C_STOP, 0x1e, 2, packet); return SUCCESS; } error_t readValues(uint8_t size, uint8_t * data){ readSize = size; readDataBuffer = data; call I2CInit.init(); call I2CPacket.read(I2C_START | I2C_STOP, 0x1e, size, data); return SUCCESS; } async event void UsartInterrupts.rxDone( uint8_t data ) {} async event void UsartInterrupts.txDone() {} async event void I2CInterrupts.fired() {} /* * 0.5, 1, 2, 5, 10 (default), 20, 50hz. 20 and 50 up power burn dramatically * bits 2-4 control this, values 0 - 6 map to values above, respectively * since the remainder of the register defaults to 0, we write the mask directly */ command error_t Magnetometer.setOutputRate(uint8_t rate){ uint8_t ret = SUCCESS, bitmask = 0x10; // default 10hz switch(rate){ case 0: bitmask = 0; break; case 1: bitmask = 0x04; break; case 2: bitmask = 0x08; break; case 3: bitmask = 0x0c; break; case 4: bitmask = 0x10; break; case 5: bitmask = 0x14; break; case 6: bitmask = 0x18; break; default: ret = FAIL; // input value unknown, using default break; } writeRegValue(0, bitmask); return ret; } /* * weird way to do this, but we need to leave the mag time * to run tests without disabling the i2c bus with TOSH_uwait * * read results from readDone event */ command void Magnetometer.selfTest(){ switch(testPhase++){ case 0: call testTimer.startPeriodic(8); writeRegValue(0, 0x11); break; case 1: writeRegValue(2, 0x01); break; case 2: call Magnetometer.readData(); break; case 3: writeRegValue(0, 0x10); break; default: call testTimer.stop(); testPhase = 0; break; } } event void testTimer.fired() { call Magnetometer.selfTest(); } // +-0.7, 1.0 (default), 1.5, 2.0, 3.2, 3.8, 4.5Ga command error_t Magnetometer.setGain(uint8_t gain){ uint8_t ret = SUCCESS, bitmask = 0x20; // default 1.0Ga switch(gain){ case 0: bitmask = 0x00; break; case 1: bitmask = 0x20; break; case 2: bitmask = 0x40; break; case 5: bitmask = 0x50; break; case 10: bitmask = 0x80; break; case 20: bitmask = 0x90; break; case 50: bitmask = 0xc0; break; default: ret = FAIL; // input value unknown, using default break; } writeRegValue(1, bitmask); return ret; } command error_t Magnetometer.setIdle(){ writeRegValue(2, 0x02); return SUCCESS; } command error_t Magnetometer.goToSleep(){ writeRegValue(2, 0x03); return SUCCESS; } command error_t Magnetometer.runSingleConversion(){ writeRegValue(2, 0x01); return SUCCESS; } command error_t Magnetometer.runContinuousConversion(){ writeRegValue(2, 0x00); return SUCCESS; } /* * returning the real value doesn't help; * success is measured in the magreaddone event */ command error_t Magnetometer.readData(){ readValues(7, readbuff); return SUCCESS; } uint16_t mag_to_heading(int16_t x, int16_t y, int16_t z) { uint16_t heading; if(x == 0){ if(y < 0) heading = 270; else heading = 90; } else if(z < 0) heading = (uint16_t)(180.0 - atan2f((float)y, (float)-x) * 57.3); else heading = (uint16_t)(180.0 - atan2f((float)y, (float)x) * 57.3); return heading; } int16_t twos_comp_pack(uint8_t up, uint8_t low) { int16_t out; uint16_t uout; uout = up; uout = uout << 8; uout |= low; out = (int16_t)uout; return out; } // call this to see three-axis magnetometer values command void Magnetometer.convertRegistersToData(uint8_t * readBuf, int16_t * data){ uint8_t * src; register uint8_t i; src = readBuf; // this loop is just for the three 16-bit x,y,z values for(i = 0; i < 3; i++){ data[i] = twos_comp_pack(*src, *(src + 1)); src += 2; } } // call after readDone event command uint16_t Magnetometer.readHeading(uint8_t * readBuf){ int16_t realVals[4]; uint16_t heading; call Magnetometer.convertRegistersToData(readBuf, realVals); heading = mag_to_heading(realVals[0], realVals[1], realVals[2]); return heading; } async event void I2CPacket.readDone(error_t success, uint16_t addr, uint8_t length, uint8_t* data) { if(enabled) signal Magnetometer.readDone(data, success); } async event void I2CPacket.writeDone(error_t success, uint16_t addr, uint8_t length, uint8_t* data) { if(enabled) signal Magnetometer.writeDone(success); } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/hmc5843/Magnetometer.h000066400000000000000000000036421207233610700253310ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * @author Steve Ayer * @date April, 2010 * * attempt to provide mneonics for honeywell HMC5843 config settings */ enum { ZERO_7_GAUSS, ONE_GAUSS, ONE_5_GAUSS, TWO_GAUSS, THREE_2_GAUSS, THREE_8_GAUSS, FOUR_5_GAUSS }; enum { ZERO_5_HZ, ONE_HZ, TWO_HZ, FIVE_HZ, TEN_HZ, TWENTY_HZ, FIFTY_HZ }; tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/hmc5843/Magnetometer.nc000066400000000000000000000053171207233610700255030ustar00rootroot00000000000000/* * Copyright (c) 2011, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date February, 2011 * * broken out from original gyromagboard* interface/implementation */ interface Magnetometer { // i2c bus, that is command void enableBus(); command void disableBus(); // 0.5, 1, 2, 5, 10 (default), 20, 50hz. 20 and 50 up power burn dramatically command error_t setOutputRate(uint8_t rate); // +-0.7, 1.0 (default), 1.5, 2.0, 3.2, 3.8, 4.5Ga command error_t setGain(uint8_t gain); command error_t setIdle(); command error_t goToSleep(); command error_t runSingleConversion(); command error_t runContinuousConversion(); // call to clock out data; collect it from the "done" event command error_t readData(); // convert raw data to heading command uint16_t readHeading(uint8_t * readBuf); // read result after readdone event command void selfTest(); // call this to see three-axis magnetometer values command void convertRegistersToData(uint8_t * readBuf, int16_t * data); // this is where the app will find its mag readings async event void readDone(uint8_t * data, error_t success); async event void writeDone(error_t success); } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/hmc5843/MagnetometerC.nc000066400000000000000000000052031207233610700256000ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date March, 2010 * * @author Steve Ayer * @date July, 2010 * tos-2.x port * * broken out from original gyromagboard* interface/implementation * * wiring to msp430 i2c implmentation to flesh out gyro/mag board on shimmer2 * using direct module because we don't need arbitration for this platform. */ #include "msp430usart.h" configuration MagnetometerC { provides { interface Init; interface Magnetometer; } } implementation { components Hmc5843P; Init = Hmc5843P; Magnetometer = Hmc5843P; components new TimerMilliC() as testTimer; Hmc5843P.testTimer -> testTimer; enum { CLIENT_ID = unique( MSP430_I2CO_BUS ), }; components Msp430I2CP; // this is mine, ported from tos-1.x; find it in shimmer/chips/msp430 Hmc5843P.I2CPacket -> Msp430I2CP.I2CBasicAddr; Hmc5843P.I2CInit -> Msp430I2CP.I2CInit; components HplMsp430I2C0C; Hmc5843P.HplI2C -> HplMsp430I2C0C; Msp430I2CP.HplI2C -> HplMsp430I2C0C; components HplMsp430Usart0C; Msp430I2CP.I2CInterrupts -> HplMsp430Usart0C; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/sd/000077500000000000000000000000001207233610700220375ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/sd/SDC.nc000066400000000000000000000044031207233610700227730ustar00rootroot00000000000000/** * Copyright (c) 2005 Hewlett-Packard Company * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of the Hewlett-Packard Company nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * communicate with a micro-sd slot wired to a telosb header */ /** * @author Steve Ayer * @date July 2006 * @date July 2009 (reworked, updated to maintained version) * @date March 2010 (reworked for shimmer2) * @author Konrad Lorincz * @date March 25, 2008 - ported to TOS 2.x */ configuration SDC { provides { interface SD; interface StdControl; } } implementation { components SDP; SD = SDP; StdControl = SDP; components new Msp430Usart0C(); SDP.Usart -> Msp430Usart0C; components HplMsp430InterruptP; SDP.DockInterrupt -> HplMsp430InterruptP.Port23; components LedsC; SDP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/straingauge/000077500000000000000000000000001207233610700237425ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/straingauge/StrainGauge.nc000066400000000000000000000035001207233610700264730ustar00rootroot00000000000000/* * Copyright (c) 2011, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date February, 2011 */ interface StrainGauge { command void powerOn(); command void powerOff(); // it has its own command void ledOn(); command void ledOff(); command void ledToggle(); } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/straingauge/StrainGaugeC.nc000066400000000000000000000035271207233610700266070ustar00rootroot00000000000000/* * Copyright (c) 2011, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date February, 2011 * */ configuration StrainGaugeC { provides{ interface Init; interface StrainGauge; } } implementation { components StrainGaugeP; Init = StrainGaugeP; StrainGauge = StrainGaugeP; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/straingauge/StrainGaugeP.nc000066400000000000000000000050771207233610700266260ustar00rootroot00000000000000/* * Copyright (c) 2011, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date February, 2011 */ module StrainGaugeP { provides { interface Init; interface StrainGauge; } } implementation { /* * don't forget to power it up, not done here */ command error_t Init.init(){ // power, active low TOSH_MAKE_SER0_RTS_OUTPUT(); TOSH_SEL_SER0_RTS_IOFUNC(); // best to leave this off until it's actually in use call StrainGauge.powerOff(); // this one tied to the led TOSH_MAKE_URXD0_OUTPUT(); TOSH_SEL_URXD0_IOFUNC(); call StrainGauge.ledOff(); return SUCCESS; } command void StrainGauge.powerOn(){ call StrainGauge.ledOn(); TOSH_SET_SER0_RTS_PIN(); } command void StrainGauge.powerOff(){ call StrainGauge.ledOff(); TOSH_CLR_SER0_RTS_PIN(); } command void StrainGauge.ledOn() { TOSH_CLR_URXD0_PIN(); } command void StrainGauge.ledOff() { TOSH_SET_URXD0_PIN(); } command void StrainGauge.ledToggle() { TOSH_TOGGLE_URXD0_PIN(); } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/tilt/000077500000000000000000000000001207233610700224055ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/tilt/HplTiltDetectorC.nc000066400000000000000000000044331207233610700261100ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telos platform * * @author Gilman Tolle * @version $Revision: 1.1 $ * (not much to) port to shimmer * @author Steve Ayer * @date February, 2010 */ configuration HplTiltDetectorC { provides interface GeneralIO; provides interface GpioInterrupt; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components HplMsp430InterruptC as InterruptC; components new Msp430GpioC() as TiltDetectorC; TiltDetectorC -> GeneralIOC.Port24; GeneralIO = TiltDetectorC; components new Msp430InterruptC() as InterruptTiltDetectorC; InterruptTiltDetectorC.HplInterrupt -> InterruptC.Port24; GpioInterrupt = InterruptTiltDetectorC.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/tilt/TiltDetectorC.nc000066400000000000000000000051351207233610700254440ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform. Get * returns the current state of the button by reading the pin, * regardless of whether enable() or disable() has been called on the * Interface. Notify.enable() and Notify.disable() modify the * underlying interrupt state of the pin, and have the effect of * enabling or disabling notifications that the button has changed * state. * * @author Gilman Tolle * @version $Revision: 1.2 $ * port to shimmer2 tilt switch * @author Steve Ayer * @date February, 2010 */ configuration TiltDetectorC { provides interface Notify; } implementation { components HplTiltDetectorC; components new SwitchToggleC(); SwitchToggleC.GpioInterrupt -> HplTiltDetectorC.GpioInterrupt; SwitchToggleC.GeneralIO -> HplTiltDetectorC.GeneralIO; components TiltDetectorP; Notify = TiltDetectorP; components new TimerMilliC() as debounceTimer; TiltDetectorP.NotifyLower -> SwitchToggleC.Notify; TiltDetectorP.debounceTimer -> debounceTimer; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/chips/tilt/TiltDetectorP.nc000066400000000000000000000050271207233610700254610ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform * * @author Gilman Tolle * @version $Revision: 1.1 $ * port to shimmer-style * @author Steve Ayer * @date February, 2010 */ #include module TiltDetectorP { provides interface Notify; uses interface Notify as NotifyLower; uses interface Timer as debounceTimer; } implementation { command error_t Notify.enable() { return call NotifyLower.enable(); } command error_t Notify.disable() { return call NotifyLower.disable(); } event void debounceTimer.fired() { call Notify.enable(); // re-enable interrupt signal Notify.notify( BUTTON_PRESSED ); } task void debounce() { call debounceTimer.startOneShot(250); } event void NotifyLower.notify( bool val ) { // we've only enabled interrupt from rising edge post debounce(); } default event void Notify.notify( button_state_t val ) { } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2/hardware.h000066400000000000000000000106231207233610700222730ustar00rootroot00000000000000/* * Copyright (c) 2007, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steven Ayer * @date July 2007 */ #ifndef _H_hardware_h #define _H_hardware_h #include "msp430hardware.h" /* * these left from tos-1.x... * *#include "MSP430ADC12.h" * *#include "CC2420Const.h" */ // LEDs TOSH_ASSIGN_PIN(RED_LED, 4, 0); TOSH_ASSIGN_PIN(YELLOW_LED, 4, 2); TOSH_ASSIGN_PIN(GREEN_LED, 4, 3); // CC2420 RADIO TOSH_ASSIGN_PIN(RADIO_FIFO, 1, 5); TOSH_ASSIGN_PIN(RADIO_FIFOP, 1, 2); TOSH_ASSIGN_PIN(RADIO_CCA, 2, 7); // vref is legacy from telos and cc2420 lib; schematic and cc2420 pin say vreg_en TOSH_ASSIGN_PIN(RADIO_VREF, 5, 6); TOSH_ASSIGN_PIN(RADIO_SFD, 1, 0); TOSH_ASSIGN_PIN(RADIO_SIMO1, 5, 1); TOSH_ASSIGN_PIN(RADIO_SOMI1, 5, 2); TOSH_ASSIGN_PIN(RADIO_CSN, 5, 4); TOSH_ASSIGN_PIN(RADIO_RESET, 5, 7); // this happens in hplcc2420pinsc TOSH_ASSIGN_PIN(CC_FIFOP, 1, 2); TOSH_ASSIGN_PIN(CC_FIFO, 1, 5); TOSH_ASSIGN_PIN(CC_SFD, 1, 0); TOSH_ASSIGN_PIN(CC_VREN, 5, 6); TOSH_ASSIGN_PIN(CC_RSTN, 5, 7); // BT pins TOSH_ASSIGN_PIN(BT_PIO, 2, 6); TOSH_ASSIGN_PIN(BT_RTS, 1, 6); TOSH_ASSIGN_PIN(BT_CTS, 1, 7); TOSH_ASSIGN_PIN(BT_TXD, 3, 6); TOSH_ASSIGN_PIN(BT_RXD, 3, 7); TOSH_ASSIGN_PIN(BT_RESET, 5, 5); //BSL Pins TOSH_ASSIGN_PIN(PROG_OUT, 1, 1); TOSH_ASSIGN_PIN(PROG_IN, 2, 2); // SD uart chip-select TOSH_ASSIGN_PIN(SD_CS_N, 3, 0); TOSH_ASSIGN_PIN(TILT, 2, 4); // ADC lines on the testpoints TOSH_ASSIGN_PIN(ADC_0, 6, 0); TOSH_ASSIGN_PIN(ADC_1, 6, 1); TOSH_ASSIGN_PIN(ADC_2, 6, 2); TOSH_ASSIGN_PIN(ADC_3, 6, 3); TOSH_ASSIGN_PIN(ADC_4, 6, 4); TOSH_ASSIGN_PIN(ADC_5, 6, 5); TOSH_ASSIGN_PIN(ADC_6, 6, 6); TOSH_ASSIGN_PIN(ADC_7, 6, 7); TOSH_ASSIGN_PIN(ADC_ACCELZ, 6, 3); TOSH_ASSIGN_PIN(ADC_ACCELY, 6, 4); TOSH_ASSIGN_PIN(ADC_ACCELX, 6, 5); TOSH_ASSIGN_PIN(DAC0_AN, 6, 6); TOSH_ASSIGN_PIN(DAC1_AN, 6, 7); TOSH_ASSIGN_PIN(VSENSE_ADC6, 6, 6); TOSH_ASSIGN_PIN(VSENSE_ADC7, 6, 7); // bus arbitration pins TOSH_ASSIGN_PIN(SW_SD_PWR_N, 4, 5); TOSH_ASSIGN_PIN(SW_BT_PWR_N, 4, 6); // if used as expansion GPIOs TOSH_ASSIGN_PIN(SER0_RTS, 1, 3); TOSH_ASSIGN_PIN(SER0_CTS, 1, 4); TOSH_ASSIGN_PIN(SIMO0, 3, 1); TOSH_ASSIGN_PIN(SOMI0, 3, 2); TOSH_ASSIGN_PIN(UCLK0, 3, 3); TOSH_ASSIGN_PIN(UTXD0, 3, 4); TOSH_ASSIGN_PIN(URXD0, 3, 5); // redefinitions for the sd card driver TOSH_ASSIGN_PIN(SD_DI, 3, 1); TOSH_ASSIGN_PIN(SD_DO, 3, 2); TOSH_ASSIGN_PIN(SD_CLK, 3, 3); TOSH_ASSIGN_PIN(SIMO1, 5, 1); TOSH_ASSIGN_PIN(SOMI1, 5, 2); TOSH_ASSIGN_PIN(UCLK1, 5, 3); TOSH_ASSIGN_PIN(UTXD1, 3, 6); TOSH_ASSIGN_PIN(URXD1, 3, 7); TOSH_ASSIGN_PIN(GIO0, 2, 0); TOSH_ASSIGN_PIN(GIO1, 2, 1); TOSH_ASSIGN_PIN(GIO2, 2, 5); // second internal expansion gpio // 1-Wire TOSH_ASSIGN_PIN(ONEWIRE, 4, 7); // ROSC TOSH_ASSIGN_PIN(ROSC, 2, 5); // docked signal from programming board TOSH_ASSIGN_PIN(DOCK_N, 2, 3); // ACCEL TOSH_ASSIGN_PIN(ACCEL_SEL0, 4, 1); TOSH_ASSIGN_PIN(ACCEL_SEL1, 4, 4); TOSH_ASSIGN_PIN(ACCEL_SLEEP_N, 5, 0); #endif // _H_hardware_h tinyos-2.1.2+dfsg/tos/platforms/shimmer2/platform.h000066400000000000000000000000001207233610700223060ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2/platform_message.h000066400000000000000000000051301207233610700240230ustar00rootroot00000000000000/* $Id: platform_message.h,v 1.2 2010-06-29 22:07:54 scipio Exp $ * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Defining the platform-independently named packet structures to be the * chip-specific CC1000 packet structures. * * @author Philip Levis * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:54 $ */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include #include typedef union message_header { cc2420_header_t cc2420; serial_header_t serial; } message_header_t; typedef union TOSRadioFooter { cc2420_footer_t cc2420; } message_footer_t; typedef union TOSRadioMetadata { cc2420_metadata_t cc2420; serial_metadata_t serial; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/000077500000000000000000000000001207233610700205055ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/.platform000066400000000000000000000051151207233610700223340ustar00rootroot00000000000000# SHIMMER2 - platform includes # Steve Ayer, June 2009; derived from Konrad Lorincz's SHIMMER platform # # Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. push( @includes, qw( . %T/platforms/shimmer2r %T/platforms/shimmer2r/chips/cc2420 %T/platforms/shimmer2r/chips/mma7361 %T/platforms/shimmer2 %T/platforms/shimmer2/chips/sd %T/platforms/shimmer2/chips/bluetooth %T/platforms/shimmer2/chips/tilt %T/platforms/shimmer2/chips/gyro %T/platforms/shimmer2/chips/gyromag %T/platforms/shimmer2/chips/fgpmmopa6b %T/platforms/shimmer2/chips/bmp085 %T/platforms/shimmer2/chips/hmc5843 %T/platforms/shimmer2/chips/straingauge %T/platforms/shimmer %T/platforms/shimmer/chips/msp430 %T/platforms/shimmer/chips/mma7260 %T/platforms/shimmer/chips/sd %T/platforms/shimmer/chips/sd/fatfs %T/platforms/shimmer/chips/bluetooth %T/platforms/shimmer/chips/ds2411 %T/platforms/shimmer/chips/gsr %T/platforms/shimmer/chips/rmcm01 %T/chips/cc2420 %T/chips/cc2420/alarm %T/chips/cc2420/control %T/chips/cc2420/csma %T/chips/cc2420/interfaces %T/chips/cc2420/link %T/chips/cc2420/lowpan %T/chips/cc2420/lpl %T/chips/cc2420/packet %T/chips/cc2420/receive %T/chips/cc2420/spi %T/chips/cc2420/transmit %T/chips/cc2420/unique %T/chips/cc2420/security %T/chips/msp430 %T/chips/msp430/adc12 %T/chips/msp430/dma %T/chips/msp430/pins %T/chips/msp430/timer %T/chips/msp430/usart %T/chips/msp430/sensors %T/lib/timer %T/lib/serial %T/lib/adc %T/lib/power ) ); @opts = qw( -gcc=msp430-gcc -mmcu=msp430f1611 -fnesc-target=msp430 -fnesc-no-debug ); push @opts, "-mdisable-hwmul" if `msp430-gcc --version | grep 3.2.3`; push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{'CIL_MACHINE'} = "version_major=3 " . "version_minor=2 " . "version=msp430-3.2.3 " . "short=2,2 " . "int=2,2 " . "long=4,2 " . "long_long=8,2 " . "pointer=2,2 " . "enum=2,2 " . "float=4,2 " . "double=4,2 " . "long_double=4,2 " . "void=1,1 " . "fun=1,2 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/ActiveMessageC.nc000066400000000000000000000061501207233610700236540ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:55 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:55 scipio Exp $ * */ /** * The Active Message layer on the SHIMMER platform. This is a naming wrapper * around the CC2420 Active Message layer. * * @author Konrad Lorincz */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface LowPowerListening; } } implementation { components CC2420ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; LowPowerListening = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/HplUserButtonC.nc000066400000000000000000000044151207233610700237140ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telos platform * * @author Gilman Tolle * @version $Revision: 1.1 $ * * @author Mike Healy * @date May 9, 2009 - modified for use with SHIMMER2 */ configuration HplUserButtonC { provides interface GeneralIO; provides interface GpioInterrupt; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components HplMsp430InterruptC as InterruptC; components new Msp430GpioC() as UserButtonC; UserButtonC -> GeneralIOC.Port20; GeneralIO = UserButtonC; components new Msp430InterruptC() as InterruptUserButtonC; InterruptUserButtonC.HplInterrupt -> InterruptC.Port20; GpioInterrupt = InterruptUserButtonC.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/Leds.nc000066400000000000000000000111131207233610700217130ustar00rootroot00000000000000// $Id: Leds.nc,v 1.2 2010-06-29 22:07:55 scipio Exp $ /* * Copyright (c) 2005-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Commands for controlling three LEDs. A platform can provide this * interface if it has more than or fewer than three LEDs. In the * former case, these commands refer to the first three LEDs. In the * latter case, some of the commands are null operations, and the set * of non-null operations must be contiguous and start at Led1. That * is, on platforms with 2 LEDs, LED 3's commands are null operations, * while on platforms with 1 LED, LED 2 and LED 3's commands are null * opertations. * * @author Joe Polastre * @author Philip Levis * */ #include "Leds.h" interface Leds { /** * Turn on LED 0. The color of this LED depends on the platform. */ async command void led0On(); /** * Turn off LED 0. The color of this LED depends on the platform. */ async command void led0Off(); /** * Toggle LED 0; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led0Toggle(); /** * Turn on LED 1. The color of this LED depends on the platform. */ async command void led1On(); /** * Turn off LED 1. The color of this LED depends on the platform. */ async command void led1Off(); /** * Toggle LED 1; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led1Toggle(); /** * Turn on LED 2. The color of this LED depends on the platform. */ async command void led2On(); /** * Turn off LED 2. The color of this LED depends on the platform. */ async command void led2Off(); /** * Toggle LED 2; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led2Toggle(); /** * Get the current LED settings as a bitmask. Each bit corresponds to * whether an LED is on; bit 0 is LED 0, bit 1 is LED 1, etc. You can * also use the enums LEDS_LED0, LEDS_LED1. For example, this expression * will determine whether LED 2 is on: * *
         (call Leds.get() & LEDS_LED2) 
        * * This command supports up to 8 LEDs; if a platform has fewer, then * those LEDs should always be off (their bit is zero). Also see * set(). * * @return a bitmask describing which LEDs are on and which are off */ async command uint8_t get(); /** * Set the current LED configuration using a bitmask. Each bit * corresponds to whether an LED is on; bit 0 is LED 0, bit 1 is LED * 1, etc. You can also use the enums LEDS_LED0, LEDS_LED1. For example, * this statement will configure the LEDs so LED 0 and LED 2 are on: * *
         call Leds.set(LEDS_LED0 | LEDS_LED2); 
        * * This statement will turn LED 1 on if it was not already: * *
        call Leds.set(call Leds.get() | LEDS_LED1);
        * * @param val a bitmask describing the on/off settings of the LEDs */ async command void set(uint8_t val); } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/LedsC.nc000066400000000000000000000040731207233610700220250ustar00rootroot00000000000000// $Id: LedsC.nc,v 1.2 2010-06-29 22:07:55 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * The basic TinyOS LEDs abstraction. * * @author Phil Buonadonna * @author David Gay * @author Philip Levis * @author Joe Polastre * */ configuration LedsC { provides interface Leds; } implementation { components LedsP, PlatformLedsC; Leds = LedsP; LedsP.Init <- PlatformLedsC.Init; LedsP.Led0 -> PlatformLedsC.Led0; LedsP.Led1 -> PlatformLedsC.Led1; LedsP.Led2 -> PlatformLedsC.Led2; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/LedsP.nc000066400000000000000000000076341207233610700220500ustar00rootroot00000000000000// $Id: LedsP.nc,v 1.2 2010-06-29 22:07:55 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The implementation of the standard 3 LED mote abstraction. * * @author Joe Polastre * @author Philip Levis * * @date March 21, 2005 * */ module LedsP @safe() { provides { interface Init; interface Leds; } uses { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; } } implementation { command error_t Init.init() { atomic { dbg("Init", "LEDS: initialized.\n"); call Led0.makeOutput(); call Led1.makeOutput(); call Led2.makeOutput(); call Led0.set(); call Led1.set(); call Led2.set(); } return SUCCESS; } /* Note: the call is inside the dbg, as it's typically a read of a volatile location, so can't be deadcode eliminated */ #define DBGLED(n) \ dbg("LedsC", "LEDS: Led" #n " %s.\n", call Led ## n .get() ? "off" : "on"); async command void Leds.led0On() { call Led0.clr(); DBGLED(0); } async command void Leds.led0Off() { call Led0.set(); DBGLED(0); } async command void Leds.led0Toggle() { call Led0.toggle(); DBGLED(0); } async command void Leds.led1On() { call Led1.clr(); DBGLED(1); } async command void Leds.led1Off() { call Led1.set(); DBGLED(1); } async command void Leds.led1Toggle() { call Led1.toggle(); DBGLED(1); } async command void Leds.led2On() { call Led2.clr(); DBGLED(2); } async command void Leds.led2Off() { call Led2.set(); DBGLED(2); } async command void Leds.led2Toggle() { call Led2.toggle(); DBGLED(2); } async command uint8_t Leds.get() { uint8_t rval; atomic { rval = 0; if (!call Led0.get()) { rval |= LEDS_LED0; } if (!call Led1.get()) { rval |= LEDS_LED1; } if (!call Led2.get()) { rval |= LEDS_LED2; } } return rval; } async command void Leds.set(uint8_t val) { atomic { if (val & LEDS_LED0) { call Leds.led0On(); } else { call Leds.led0Off(); } if (val & LEDS_LED1) { call Leds.led1On(); } else { call Leds.led1Off(); } if (val & LEDS_LED2) { call Leds.led2On(); } else { call Leds.led2Off(); } } } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/MoteClockC.nc000066400000000000000000000035471207233610700230230ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: MoteClockC.nc,v 1.1 2010-06-10 18:22:02 ayer1 Exp $ * */ /** * @author Vlado Handziski */ configuration MoteClockC { provides interface Init as MoteClockInit; } implementation { components Msp430ClockC; MoteClockInit = Msp430ClockC.Init; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/MotePlatformC.nc000066400000000000000000000154411207233610700235500ustar00rootroot00000000000000/* * Copyright (c) 2007, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steven Ayer * @date July 2007 * * tos-2.x port June 2009 * */ module MotePlatformC { provides interface Init; } implementation { command error_t Init.init() { // have to tell mux to connect path from msp430 to sd TOSH_SEL_DOCK_N_IOFUNC(); TOSH_MAKE_DOCK_N_OUTPUT(); TOSH_SET_DOCK_N_PIN(); // bus arbitration pins TOSH_SEL_SW_SD_PWR_N_IOFUNC(); TOSH_MAKE_SW_SD_PWR_N_OUTPUT(); TOSH_SEL_SD_CS_N_IOFUNC(); TOSH_MAKE_SD_CS_N_OUTPUT(); TOSH_SEL_SD_CLK_IOFUNC(); TOSH_MAKE_SD_CLK_OUTPUT(); TOSH_SEL_SD_DO_IOFUNC(); TOSH_MAKE_SD_DO_INPUT(); TOSH_SEL_SD_DI_IOFUNC(); TOSH_MAKE_SD_DI_OUTPUT(); // power down sd module; overridden by dock pin on programming board /* * other pins are zeroed to reset card * at end of this routine, we raise them again (they have pullups, too) */ TOSH_SET_SW_SD_PWR_N_PIN(); TOSH_CLR_SD_CS_N_PIN(); TOSH_CLR_SD_DI_PIN(); TOSH_CLR_SD_CLK_PIN(); TOSH_SEL_SW_BT_PWR_N_IOFUNC(); TOSH_MAKE_SW_BT_PWR_N_OUTPUT(); TOSH_SET_SW_BT_PWR_N_PIN(); // power down bt module; overridden by dock pin on programming board //LEDS TOSH_SEL_RED_LED_IOFUNC(); TOSH_MAKE_RED_LED_OUTPUT(); TOSH_SEL_YELLOW_LED_IOFUNC(); TOSH_MAKE_YELLOW_LED_OUTPUT(); TOSH_SEL_GREEN_LED_IOFUNC(); TOSH_MAKE_GREEN_LED_OUTPUT(); TOSH_SET_RED_LED_PIN(); TOSH_SET_YELLOW_LED_PIN(); TOSH_SET_GREEN_LED_PIN(); //RADIO PINS //CC2420 pins TOSH_MAKE_RADIO_VREF_OUTPUT(); TOSH_SEL_RADIO_VREF_IOFUNC(); TOSH_CLR_RADIO_VREF_PIN(); // power down TOSH_MAKE_RADIO_CSN_OUTPUT(); TOSH_SEL_RADIO_CSN_IOFUNC(); TOSH_SET_RADIO_CSN_PIN(); // should be reset_n TOSH_MAKE_RADIO_RESET_OUTPUT(); TOSH_SEL_RADIO_RESET_IOFUNC(); TOSH_CLR_RADIO_RESET_PIN(); TOSH_SEL_RADIO_CCA_IOFUNC(); TOSH_MAKE_RADIO_CCA_INPUT(); TOSH_SEL_RADIO_FIFO_IOFUNC(); TOSH_MAKE_RADIO_FIFO_INPUT(); TOSH_SEL_RADIO_FIFOP_IOFUNC(); TOSH_MAKE_RADIO_FIFOP_INPUT(); TOSH_SEL_RADIO_SFD_IOFUNC(); TOSH_MAKE_RADIO_SFD_INPUT(); TOSH_SEL_TILT_IOFUNC(); TOSH_MAKE_TILT_INPUT(); // BT PINS TOSH_MAKE_BT_RESET_OUTPUT(); TOSH_SEL_BT_RESET_IOFUNC(); TOSH_CLR_BT_RESET_PIN(); // mitsumi module disabled by clr TOSH_MAKE_BT_RTS_INPUT(); TOSH_SEL_BT_RTS_IOFUNC(); TOSH_MAKE_BT_PIO_INPUT(); TOSH_SEL_BT_PIO_IOFUNC(); TOSH_MAKE_BT_CTS_OUTPUT(); TOSH_SEL_BT_CTS_IOFUNC(); TOSH_MAKE_BT_TXD_OUTPUT(); TOSH_SEL_BT_TXD_IOFUNC(); TOSH_MAKE_BT_RXD_INPUT(); TOSH_SEL_BT_RXD_IOFUNC(); // BSL Prog Pins tristate em TOSH_MAKE_PROG_IN_OUTPUT(); TOSH_MAKE_PROG_OUT_OUTPUT(); TOSH_SET_PROG_OUT_PIN(); // some expansion boards have enable low TOSH_SEL_PROG_IN_IOFUNC(); TOSH_SEL_PROG_OUT_IOFUNC(); // ADC lines TOSH_SEL_ADC_0_IOFUNC(); TOSH_MAKE_ADC_0_OUTPUT(); TOSH_SEL_ADC_1_IOFUNC(); TOSH_MAKE_ADC_1_OUTPUT(); TOSH_SEL_ADC_2_IOFUNC(); TOSH_MAKE_ADC_2_OUTPUT(); TOSH_SEL_ADC_6_IOFUNC(); TOSH_MAKE_ADC_6_OUTPUT(); TOSH_SEL_ADC_7_IOFUNC(); TOSH_MAKE_ADC_7_OUTPUT(); TOSH_SEL_ADC_ACCELZ_IOFUNC(); TOSH_MAKE_ADC_ACCELZ_INPUT(); TOSH_SEL_ADC_ACCELY_IOFUNC(); TOSH_MAKE_ADC_ACCELY_INPUT(); TOSH_SEL_ADC_ACCELX_IOFUNC(); TOSH_MAKE_ADC_ACCELX_INPUT(); TOSH_SEL_ROSC_IOFUNC(); TOSH_MAKE_ROSC_INPUT(); // 1-wire function TOSH_SEL_ONEWIRE_IOFUNC(); TOSH_MAKE_ONEWIRE_OUTPUT(); TOSH_SET_ONEWIRE_PIN(); /* * Accelerometer pin definitions * unless the accel_sel0 pin is cleared, * a severe quiescent power hit occurs on the msp430 * we go from 3.7 ua to 65.1 ua when asleep! */ TOSH_SEL_ACCEL_SEL0_IOFUNC(); TOSH_MAKE_ACCEL_SEL0_OUTPUT(); TOSH_CLR_ACCEL_SEL0_PIN(); TOSH_SEL_ACCEL_SLEEP_N_IOFUNC(); TOSH_MAKE_ACCEL_SLEEP_N_OUTPUT(); TOSH_CLR_ACCEL_SLEEP_N_PIN(); /* * switches between adc0 & adc7 pass-through when low * and battery/regulator signals for power monitoring */ TOSH_SEL_PWRMUX_SEL_IOFUNC(); TOSH_MAKE_PWRMUX_SEL_OUTPUT(); TOSH_CLR_PWRMUX_SEL_PIN(); // idle expansion header pins TOSH_SEL_SER0_CTS_IOFUNC(); TOSH_MAKE_SER0_CTS_OUTPUT(); TOSH_SEL_SER0_RTS_IOFUNC(); TOSH_MAKE_SER0_RTS_OUTPUT(); TOSH_CLR_SER0_RTS_PIN(); // this pin is now tied to the user button on the prog board TOSH_SEL_GIO0_IOFUNC(); TOSH_MAKE_GIO0_OUTPUT(); TOSH_CLR_GIO0_PIN(); TOSH_SEL_GIO1_IOFUNC(); TOSH_MAKE_GIO1_OUTPUT(); TOSH_SEL_UTXD0_IOFUNC(); TOSH_MAKE_UTXD0_OUTPUT(); TOSH_SEL_URXD0_IOFUNC(); TOSH_MAKE_URXD0_OUTPUT(); TOSH_SET_URXD0_PIN(); TOSH_SEL_UTXD1_IOFUNC(); TOSH_MAKE_UTXD1_OUTPUT(); TOSH_SEL_URXD1_IOFUNC(); TOSH_MAKE_URXD1_OUTPUT(); TOSH_SEL_UCLK1_IOFUNC(); TOSH_MAKE_UCLK1_OUTPUT(); TOSH_SEL_SIMO1_IOFUNC(); TOSH_MAKE_SIMO1_OUTPUT(); TOSH_SEL_SOMI1_IOFUNC(); TOSH_MAKE_SOMI1_INPUT(); TOSH_SET_SD_CS_N_PIN(); TOSH_SET_SD_DI_PIN(); TOSH_SET_SD_CLK_PIN(); // these are attached to the same pullup as above TOSH_SET_SIMO1_PIN(); TOSH_SET_UCLK1_PIN(); // set it back to default state TOSH_MAKE_DOCK_N_INPUT(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/Msp430Timer32khzMapC.nc000066400000000000000000000065221207233610700244460ustar00rootroot00000000000000//$Id: Msp430Timer32khzMapC.nc,v 1.2 2010-06-29 22:07:55 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * MSP430Timer32khzMapC presents as paramaterized interfaces all of * the 32khz hardware timers on the MSP430 that are available for * compile time allocation by "new Alarm32khz16C()", "new * AlarmMilli32C()", and so on. * * Platforms based on the MSP430 are * encouraged to copy in and * override this file, presenting only the * hardware timers that are * available for allocation on that platform. * * @author Cory Sharp * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:55 $ */ configuration Msp430Timer32khzMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; Msp430Timer[0] = Msp430TimerC.TimerB; Msp430TimerControl[0] = Msp430TimerC.ControlB0; Msp430Compare[0] = Msp430TimerC.CompareB0; Msp430Timer[1] = Msp430TimerC.TimerB; Msp430TimerControl[1] = Msp430TimerC.ControlB1; Msp430Compare[1] = Msp430TimerC.CompareB1; Msp430Timer[2] = Msp430TimerC.TimerB; Msp430TimerControl[2] = Msp430TimerC.ControlB2; Msp430Compare[2] = Msp430TimerC.CompareB2; Msp430Timer[3] = Msp430TimerC.TimerB; Msp430TimerControl[3] = Msp430TimerC.ControlB3; Msp430Compare[3] = Msp430TimerC.CompareB3; Msp430Timer[4] = Msp430TimerC.TimerB; Msp430TimerControl[4] = Msp430TimerC.ControlB4; Msp430Compare[4] = Msp430TimerC.CompareB4; Msp430Timer[5] = Msp430TimerC.TimerB; Msp430TimerControl[5] = Msp430TimerC.ControlB5; Msp430Compare[5] = Msp430TimerC.CompareB5; Msp430Timer[6] = Msp430TimerC.TimerB; Msp430TimerControl[6] = Msp430TimerC.ControlB6; Msp430Compare[6] = Msp430TimerC.CompareB6; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/NoLedsC.nc000066400000000000000000000050311207233610700223150ustar00rootroot00000000000000// $Id: NoLedsC.nc,v 1.2 2010-06-29 22:07:55 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A null operation replacement for the LedsC component. As many * components might concurrently signal information through LEDs, * using LedsC and NoLedsC allows an application builder to select * which components control the LEDs. * * @author Philip Levis * @date March 19, 2005 * */ module NoLedsC { provides interface Init; provides interface Leds; } implementation { command error_t Init.init() {return SUCCESS;} async command void Leds.led0On() {} async command void Leds.led0Off() {} async command void Leds.led0Toggle() {} async command void Leds.led1On() {} async command void Leds.led1Off() {} async command void Leds.led1Toggle() {} async command void Leds.led2On() {} async command void Leds.led2Off() {} async command void Leds.led2Toggle() {} async command uint8_t Leds.get() {return 0;} async command void Leds.set(uint8_t val) {} } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/PlatformC.nc000066400000000000000000000036641207233610700227270ustar00rootroot00000000000000/* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre and Cory Sharp * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:55 $ */ #include "hardware.h" configuration PlatformC { provides interface Init; } implementation { components PlatformP, MotePlatformC, MoteClockC; Init = PlatformP; PlatformP.MoteClockInit -> MoteClockC; PlatformP.MoteInit -> MotePlatformC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/PlatformLedsC.nc000066400000000000000000000045061207233610700235330ustar00rootroot00000000000000// $Id: PlatformLedsC.nc,v 1.2 2010-06-29 22:07:55 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:55 $ */ #include "hardware.h" configuration PlatformLedsC { provides interface GeneralIO as Led0; provides interface GeneralIO as Led1; provides interface GeneralIO as Led2; uses interface Init; } implementation { components HplMsp430GeneralIOC as GeneralIOC , new Msp430GpioC() as Led0Impl , new Msp430GpioC() as Led1Impl , new Msp430GpioC() as Led2Impl ; components PlatformP; Init = PlatformP.LedsInit; Led0 = Led0Impl; Led0Impl -> GeneralIOC.Port40; Led1 = Led1Impl; Led1Impl -> GeneralIOC.Port42; Led2 = Led2Impl; Led2Impl -> GeneralIOC.Port43; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/PlatformP.nc000066400000000000000000000006601207233610700227350ustar00rootroot00000000000000#include "hardware.h" module PlatformP{ provides interface Init; uses interface Init as MoteClockInit; uses interface Init as MoteInit; uses interface Init as LedsInit; } implementation { command error_t Init.init() { WDTCTL = WDTPW + WDTHOLD; call MoteClockInit.init(); call MoteInit.init(); call LedsInit.init(); return SUCCESS; } default command error_t LedsInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/PlatformSerialC.nc000066400000000000000000000041001207233610700240510ustar00rootroot00000000000000/* * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * mostly copied from shimmer * * @author Steve Ayer * @date June 2009 */ configuration PlatformSerialC { provides interface StdControl; provides interface UartStream; provides interface UartByte; } implementation { components new Msp430Uart0C() as UartC; UartStream = UartC; UartByte = UartC; components ShimmerSerialP; StdControl = ShimmerSerialP; ShimmerSerialP.Msp430UartConfigure <- UartC.Msp430UartConfigure; ShimmerSerialP.Resource -> UartC.Resource; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/ShimmerSerialP.nc000066400000000000000000000047101207233610700237150ustar00rootroot00000000000000/* * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date June 2009 */ module ShimmerSerialP { provides interface StdControl; provides interface Msp430UartConfigure; uses interface Resource; } implementation { msp430_uart_union_config_t msp430_uart_shimmer2_config = { { ubr: UBR_1MHZ_115200, umctl: UMCTL_1MHZ_115200, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0, utxe : 1, urxe : 1 } }; command error_t StdControl.start(){ return call Resource.immediateRequest(); } command error_t StdControl.stop(){ call Resource.release(); return SUCCESS; } event void Resource.granted(){} async command msp430_uart_union_config_t * Msp430UartConfigure.getConfig(){ return &msp430_uart_shimmer2_config; } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/000077500000000000000000000000001207233610700216135ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420/000077500000000000000000000000001207233610700225105ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420/CC2420CsmaC.nc000066400000000000000000000057171207233610700245500ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Basic implementation of a CSMA MAC for the ChipCon CC2420 radio. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2012-07-26 17:51:39 $ * * mods to provide CC2420RxState interface, which allows application * to disable radio reception and/or cca for manual control of high-density * synchronization routines * @author Steve Ayer * @date March, 2012 */ #include "CC2420.h" #include "IEEE802154.h" configuration CC2420CsmaC { provides interface SplitControl; provides interface Send; provides interface Receive; provides interface RadioBackoff; provides interface CC2420RxState; } implementation { components CC2420CsmaP as CsmaP; RadioBackoff = CsmaP; SplitControl = CsmaP; Send = CsmaP; CC2420RxState = CsmaP; components CC2420ControlC; CsmaP.Resource -> CC2420ControlC; CsmaP.CC2420Power -> CC2420ControlC; components CC2420TransmitC; CsmaP.SubControl -> CC2420TransmitC; CsmaP.CC2420Transmit -> CC2420TransmitC; CsmaP.SubBackoff -> CC2420TransmitC; components CC2420ReceiveC; Receive = CC2420ReceiveC; CsmaP.SubControl -> CC2420ReceiveC; components CC2420PacketC; CsmaP.CC2420Packet -> CC2420PacketC; CsmaP.CC2420PacketBody -> CC2420PacketC; components RandomC; CsmaP.Random -> RandomC; components new StateC(); CsmaP.SplitControlState -> StateC; components LedsC as Leds; CsmaP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420/CC2420CsmaP.nc000066400000000000000000000223671207233610700245650ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2012-03-02 16:52:48 $ * * mods to provide CC2420RxState interface, which allows application * to disable radio reception and/or cca for manual control of high-density * synchronization routines * @author Steve Ayer * @date March, 2012 */ module CC2420CsmaP @safe() { provides interface SplitControl; provides interface Send; provides interface RadioBackoff; provides interface CC2420RxState; uses interface Resource; uses interface CC2420Power; uses interface StdControl as SubControl; uses interface CC2420Transmit; uses interface RadioBackoff as SubBackoff; uses interface Random; uses interface Leds; uses interface CC2420Packet; uses interface CC2420PacketBody; uses interface State as SplitControlState; } implementation { enum { S_STOPPED, S_STARTING, S_STARTED, S_STOPPING, S_TRANSMITTING, }; message_t* ONE_NOK m_msg; error_t sendErr = SUCCESS; /** TRUE if we are to use CCA when sending the current packet */ norace bool ccaOn = TRUE; bool RxState = TRUE; /****************** Prototypes ****************/ task void startDone_task(); task void stopDone_task(); task void sendDone_task(); void shutdown(); command error_t CC2420RxState.enableRx(bool enabled) { atomic { if(enabled) RxState = TRUE; else RxState = FALSE; } return SUCCESS; } command error_t CC2420RxState.enableCca(bool enabled) { atomic { if(enabled) ccaOn = TRUE; else ccaOn = FALSE; } return SUCCESS; } /***************** SplitControl Commands ****************/ command error_t SplitControl.start() { if(call SplitControlState.requestState(S_STARTING) == SUCCESS) { call CC2420Power.startVReg(); return SUCCESS; } else if(call SplitControlState.isState(S_STARTED)) { return EALREADY; } else if(call SplitControlState.isState(S_STARTING)) { return SUCCESS; } return EBUSY; } command error_t SplitControl.stop() { if (call SplitControlState.isState(S_STARTED)) { call SplitControlState.forceState(S_STOPPING); shutdown(); return SUCCESS; } else if(call SplitControlState.isState(S_STOPPED)) { return EALREADY; } else if(call SplitControlState.isState(S_TRANSMITTING)) { call SplitControlState.forceState(S_STOPPING); // At sendDone, the radio will shut down return SUCCESS; } else if(call SplitControlState.isState(S_STOPPING)) { return SUCCESS; } return EBUSY; } /***************** Send Commands ****************/ command error_t Send.cancel( message_t* p_msg ) { return call CC2420Transmit.cancel(); } command error_t Send.send( message_t* p_msg, uint8_t len ) { cc2420_header_t* header = call CC2420PacketBody.getHeader( p_msg ); cc2420_metadata_t* metadata = call CC2420PacketBody.getMetadata( p_msg ); atomic { if (!call SplitControlState.isState(S_STARTED)) { return FAIL; } call SplitControlState.forceState(S_TRANSMITTING); m_msg = p_msg; } // header->length = len + CC2420_SIZE; #ifdef CC2420_HW_SECURITY header->fcf &= ((1 << IEEE154_FCF_ACK_REQ)| (1 << IEEE154_FCF_SECURITY_ENABLED)| (0x3 << IEEE154_FCF_SRC_ADDR_MODE) | (0x3 << IEEE154_FCF_DEST_ADDR_MODE)); #else header->fcf &= ((1 << IEEE154_FCF_ACK_REQ) | (0x3 << IEEE154_FCF_SRC_ADDR_MODE) | (0x3 << IEEE154_FCF_DEST_ADDR_MODE)); #endif header->fcf |= ( ( IEEE154_TYPE_DATA << IEEE154_FCF_FRAME_TYPE ) | ( 1 << IEEE154_FCF_INTRAPAN ) ); metadata->ack = FALSE; metadata->rssi = 0; metadata->lqi = 0; //metadata->timesync = FALSE; metadata->timestamp = CC2420_INVALID_TIMESTAMP; // ccaOn = FALSE; signal RadioBackoff.requestCca(m_msg); call CC2420Transmit.send( m_msg, ccaOn ); return SUCCESS; } command void* Send.getPayload(message_t* m, uint8_t len) { if (len <= call Send.maxPayloadLength()) { return (void* COUNT_NOK(len ))(m->data); } else { return NULL; } } command uint8_t Send.maxPayloadLength() { return TOSH_DATA_LENGTH; } /**************** RadioBackoff Commands ****************/ /** * Must be called within a requestInitialBackoff event * @param backoffTime the amount of time in some unspecified units to backoff */ async command void RadioBackoff.setInitialBackoff(uint16_t backoffTime) { call SubBackoff.setInitialBackoff(backoffTime); } /** * Must be called within a requestCongestionBackoff event * @param backoffTime the amount of time in some unspecified units to backoff */ async command void RadioBackoff.setCongestionBackoff(uint16_t backoffTime) { call SubBackoff.setCongestionBackoff(backoffTime); } /** * Enable CCA for the outbound packet. Must be called within a requestCca * event * @param ccaOn TRUE to enable CCA, which is the default. */ async command void RadioBackoff.setCca(bool useCca) { // ccaOn = useCca; } /**************** Events ****************/ async event void CC2420Transmit.sendDone( message_t* p_msg, error_t err ) { atomic sendErr = err; post sendDone_task(); } async event void CC2420Power.startVRegDone() { call Resource.request(); } event void Resource.granted() { call CC2420Power.startOscillator(); } async event void CC2420Power.startOscillatorDone() { post startDone_task(); } /***************** SubBackoff Events ****************/ async event void SubBackoff.requestInitialBackoff(message_t *msg) { call SubBackoff.setInitialBackoff ( call Random.rand16() % (0x1F * CC2420_BACKOFF_PERIOD) + CC2420_MIN_BACKOFF); signal RadioBackoff.requestInitialBackoff(msg); } async event void SubBackoff.requestCongestionBackoff(message_t *msg) { call SubBackoff.setCongestionBackoff( call Random.rand16() % (0x7 * CC2420_BACKOFF_PERIOD) + CC2420_MIN_BACKOFF); signal RadioBackoff.requestCongestionBackoff(msg); } async event void SubBackoff.requestCca(message_t *msg) { // Lower layers than this do not configure the CCA settings signal RadioBackoff.requestCca(msg); } /***************** Tasks ****************/ task void sendDone_task() { error_t packetErr; atomic packetErr = sendErr; if(call SplitControlState.isState(S_STOPPING)) { shutdown(); } else { call SplitControlState.forceState(S_STARTED); } signal Send.sendDone( m_msg, packetErr ); } task void startDone_task() { call SubControl.start(); if(RxState == TRUE) call CC2420Power.rxOn(); call Resource.release(); call SplitControlState.forceState(S_STARTED); signal SplitControl.startDone( SUCCESS ); } task void stopDone_task() { call SplitControlState.forceState(S_STOPPED); signal SplitControl.stopDone( SUCCESS ); } /***************** Functions ****************/ /** * Shut down all sub-components and turn off the radio */ void shutdown() { call SubControl.stop(); call CC2420Power.stopVReg(); post stopDone_task(); } /***************** Defaults ***************/ default event void SplitControl.startDone(error_t error) { } default event void SplitControl.stopDone(error_t error) { } default async event void RadioBackoff.requestInitialBackoff(message_t *msg) { } default async event void RadioBackoff.requestCongestionBackoff(message_t *msg) { } default async event void RadioBackoff.requestCca(message_t *msg) { } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420/CC2420GpioCaptureC.nc000066400000000000000000000067741207233610700261130ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Jonathan Hui * @author Joe Polastre * @author Steve Ayer/Miklos Maroti * @date February, 2011 * * re-named indicating that this HAL module is specifically required to handle anomalies in the * cc2420 stack that require sfd capture to happen on a timerb pin; designs that use a timera pin * need this code to resolve the aliasing between timestamps from 32khz and 1mhz timers. * thanks to miklos for providing this re-written captured event handler as a straight-forward work-around! */ generic module CC2420GpioCaptureC() @safe() { provides interface GpioCapture as Capture; uses interface Msp430TimerControl; uses interface Msp430Capture; uses interface HplMsp430GeneralIO as GeneralIO; uses interface LocalTime as LocalTime32khz; uses interface LocalTime as LocalTimeMicro; } implementation { error_t enableCapture( uint8_t mode ) { atomic { call Msp430TimerControl.disableEvents(); call GeneralIO.selectModuleFunc(); call Msp430TimerControl.clearPendingInterrupt(); call Msp430Capture.clearOverflow(); call Msp430TimerControl.setControlAsCapture( mode ); call Msp430TimerControl.enableEvents(); } return SUCCESS; } async command error_t Capture.captureRisingEdge() { return enableCapture( MSP430TIMER_CM_RISING ); } async command error_t Capture.captureFallingEdge() { return enableCapture( MSP430TIMER_CM_FALLING ); } async command void Capture.disable() { atomic { call Msp430TimerControl.disableEvents(); call GeneralIO.selectIOFunc(); } } async event void Msp430Capture.captured(uint16_t capturedMicro) { uint16_t elapsedMicro; uint16_t captured32khz; atomic { elapsedMicro = call LocalTimeMicro.get() - capturedMicro; captured32khz = call LocalTime32khz.get(); } captured32khz -= elapsedMicro >> 5; signal Capture.captured(captured32khz); } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420/CC2420RxState.nc000066400000000000000000000036311207233610700251450ustar00rootroot00000000000000/* * Copyright (c) 2012, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * strictly for manipulating the receiver prior to radio start-up * so that we can run without reception and/or cca under certain circumstances * * @author Steve Ayer * @date February, 2012 */ interface CC2420RxState { command error_t enableRx(bool enabled); command error_t enableCca(bool enabled); } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420/HplCC2420AlarmC.nc000066400000000000000000000040231207233610700253520ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of 32khz alarms for the ChipCon CC2420 radio * connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2010-06-10 18:22:02 $ */ generic configuration HplCC2420AlarmC() { provides interface Init; provides interface Alarm as Alarm32khz32; } implementation { components new Alarm32khz32C(); Init = Alarm32khz32C; Alarm32khz32 = Alarm32khz32C; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420/HplCC2420InterruptsC.nc000066400000000000000000000062501207233610700265010ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of interrupts and captures for the ChipCon * CC2420 radio connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2010-06-10 18:22:02 $ */ /** * Ported to the SHIMMER platform. * * @author Konrad Lorincz * @date May 14, 2008 * * @author Steve Ayer * @date April, 2010 */ configuration HplCC2420InterruptsC { provides interface GpioCapture as CaptureSFD; provides interface GpioInterrupt as InterruptCCA; provides interface GpioInterrupt as InterruptFIFOP; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components Msp430TimerC; components new CC2420GpioCaptureC() as CaptureSFDC; CaptureSFDC.Msp430TimerControl -> Msp430TimerC.ControlA1; CaptureSFDC.Msp430Capture -> Msp430TimerC.CaptureA1; CaptureSFDC.GeneralIO -> GeneralIOC.Port12; components Counter32khz32C as Counter, new CounterToLocalTimeC(T32khz); CounterToLocalTimeC.Counter -> Counter; CaptureSFDC.LocalTime32khz -> CounterToLocalTimeC; components CounterMicro32C, new CounterToLocalTimeC(TMicro) as CounterMicroToLocalTime; CounterMicroToLocalTime.Counter -> CounterMicro32C; CaptureSFDC.LocalTimeMicro -> CounterMicroToLocalTime; components HplMsp430InterruptC; components new Msp430InterruptC() as InterruptCCAC; components new Msp430InterruptC() as InterruptFIFOPC; InterruptCCAC.HplInterrupt -> HplMsp430InterruptC.Port27; InterruptFIFOPC.HplInterrupt -> HplMsp430InterruptC.Port10; InterruptCCA = InterruptCCAC.Interrupt; InterruptFIFOP = InterruptFIFOPC.Interrupt; CaptureSFD = CaptureSFDC.Capture; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420/HplCC2420PinsC.nc000066400000000000000000000055351207233610700252400ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of general-purpose I/O for the ChipCon CC2420 * radio connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2010-06-10 18:22:02 $ */ /** * Ported to the SHIMMER platform. * * @author Konrad Lorincz * @date May 14, 2008 */ configuration HplCC2420PinsC { provides interface GeneralIO as CCA; provides interface GeneralIO as CSN; provides interface GeneralIO as FIFO; provides interface GeneralIO as FIFOP; provides interface GeneralIO as RSTN; provides interface GeneralIO as SFD; provides interface GeneralIO as VREN; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> GeneralIOC.Port27; CSNM -> GeneralIOC.Port54; FIFOM -> GeneralIOC.Port15; FIFOPM -> GeneralIOC.Port10; RSTNM -> GeneralIOC.Port57; SFDM -> GeneralIOC.Port12; VRENM -> GeneralIOC.Port56; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420/HplCC2420SpiC.nc000066400000000000000000000041541207233610700250560ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of the SPI bus for the ChipCon CC2420 radio * connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2010-06-10 18:22:02 $ */ /** * Ported to the SHIMMER platform. * * @author Konrad Lorincz */ generic configuration HplCC2420SpiC() { provides interface Resource; provides interface SpiByte; provides interface SpiPacket; } implementation { components new Msp430Spi1C() as SpiC; Resource = SpiC; SpiByte = SpiC; SpiPacket = SpiC; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420x/000077500000000000000000000000001207233610700227005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420x/t32khz/000077500000000000000000000000001207233610700240255ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420x/t32khz/HplCC2420XC.nc000066400000000000000000000055131207233610700260470ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ configuration HplCC2420XC { provides { interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface LocalTime as LocalTimeRadio; interface Init; interface Alarm; } } implementation { components HplMsp430GeneralIOC as IO, new Msp430Spi1C() as SpiC; // pins components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> IO.Port27; CSNM -> IO.Port54; FIFOM -> IO.Port15; FIFOPM -> IO.Port10; RSTNM -> IO.Port57; SFDM -> IO.Port12; VRENM -> IO.Port56; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; // spi SpiResource = SpiC.Resource; FastSpiByte = SpiC; // capture components Msp430TimerC as TimerC; components new GpioCaptureC(); GpioCaptureC.Msp430TimerControl -> TimerC.ControlA1; GpioCaptureC.Msp430Capture -> TimerC.CaptureA1; GpioCaptureC.GeneralIO -> IO.Port12; SfdCapture = GpioCaptureC; components new Msp430InterruptC() as FifopInterruptC, HplMsp430InterruptC; FifopInterruptC.HplInterrupt -> HplMsp430InterruptC.Port10; FifopInterrupt = FifopInterruptC.Interrupt; // alarm components new Alarm32khz16C() as AlarmC; Alarm = AlarmC; Init = AlarmC; // localTime components LocalTime32khzC; LocalTimeRadio = LocalTime32khzC.LocalTime; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420x/tmicro/000077500000000000000000000000001207233610700241755ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/cc2420x/tmicro/HplCC2420XC.nc000066400000000000000000000055131207233610700262170ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ configuration HplCC2420XC { provides { interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface LocalTime as LocalTimeRadio; interface Init; interface Alarm; } } implementation { components HplMsp430GeneralIOC as IO, new Msp430Spi1C() as SpiC; // pins components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> IO.Port27; CSNM -> IO.Port54; FIFOM -> IO.Port15; FIFOPM -> IO.Port10; RSTNM -> IO.Port57; SFDM -> IO.Port12; VRENM -> IO.Port56; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; // spi SpiResource = SpiC.Resource; FastSpiByte = SpiC; // capture components Msp430TimerC as TimerC; components new GpioCaptureC(); GpioCaptureC.Msp430TimerControl -> TimerC.ControlA1; GpioCaptureC.Msp430Capture -> TimerC.CaptureA1; GpioCaptureC.GeneralIO -> IO.Port12; SfdCapture = GpioCaptureC; components new Msp430InterruptC() as FifopInterruptC, HplMsp430InterruptC; FifopInterruptC.HplInterrupt -> HplMsp430InterruptC.Port10; FifopInterrupt = FifopInterruptC.Interrupt; // alarm components new AlarmMicro16C() as AlarmC; Alarm = AlarmC; Init = AlarmC; // localTime components LocalTimeMicroC; LocalTimeRadio = LocalTimeMicroC.LocalTime; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/mma7361/000077500000000000000000000000001207233610700227065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/mma7361/AccelC.nc000066400000000000000000000034761207233610700243540ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date May, 2010 * */ configuration AccelC { provides { interface Mma_Accel as Accel; interface Init; } } implementation { components Mma7361P; Init = Mma7361P; Accel = Mma7361P; } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/chips/mma7361/Mma7361P.nc000066400000000000000000000052171207233610700244100ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date April, 2010 */ #include "Mma_Accel.h" module Mma7361P { provides { interface Init; interface Mma_Accel as Accel; } } implementation { #warning "This accelerometer chipset supports only 1.5 and 6.0g; other settings will default to 1.5g" command error_t Init.init(){ // control pins are already iofunc/input TOSH_SEL_ADC_ACCELZ_MODFUNC(); TOSH_SEL_ADC_ACCELY_MODFUNC(); TOSH_SEL_ADC_ACCELX_MODFUNC(); call Accel.wake(1); return SUCCESS; } command void Accel.wake (bool wakeup) { if(wakeup) TOSH_SET_ACCEL_SLEEP_N_PIN(); // wakes up accel board else TOSH_CLR_ACCEL_SLEEP_N_PIN(); // puts accel board to sleep } command void Accel.setSensitivity (uint8_t sensitivity) { switch(sensitivity) { case RANGE_1_5G: TOSH_CLR_ACCEL_SEL0_PIN(); break; case RANGE_6_0G: TOSH_SET_ACCEL_SEL0_PIN(); break; default: // in case someone feeds it a non-7361 range TOSH_CLR_ACCEL_SEL0_PIN(); break; } } } tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/hardware.h000066400000000000000000000106231207233610700224550ustar00rootroot00000000000000/* * Copyright (c) 2007, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @author Steven Ayer * @date July 2007 */ #ifndef _H_hardware_h #define _H_hardware_h #include "msp430hardware.h" /* * these left from tos-1.x... * *#include "MSP430ADC12.h" * *#include "CC2420Const.h" */ // LEDs TOSH_ASSIGN_PIN(RED_LED, 4, 0); TOSH_ASSIGN_PIN(YELLOW_LED, 4, 2); TOSH_ASSIGN_PIN(GREEN_LED, 4, 3); // CC2420 RADIO TOSH_ASSIGN_PIN(RADIO_FIFO, 1, 5); TOSH_ASSIGN_PIN(RADIO_FIFOP, 1, 0); TOSH_ASSIGN_PIN(RADIO_CCA, 2, 7); // vref is legacy from telos and cc2420 lib; schematic and cc2420 pin say vreg_en TOSH_ASSIGN_PIN(RADIO_VREF, 5, 6); TOSH_ASSIGN_PIN(RADIO_SFD, 1, 2); TOSH_ASSIGN_PIN(RADIO_SIMO1, 5, 1); TOSH_ASSIGN_PIN(RADIO_SOMI1, 5, 2); TOSH_ASSIGN_PIN(RADIO_CSN, 5, 4); TOSH_ASSIGN_PIN(RADIO_RESET, 5, 7); // this happens in hplcc2420pinsc TOSH_ASSIGN_PIN(CC_FIFOP, 1, 0); TOSH_ASSIGN_PIN(CC_FIFO, 1, 5); TOSH_ASSIGN_PIN(CC_SFD, 1, 2); TOSH_ASSIGN_PIN(CC_VREN, 5, 6); TOSH_ASSIGN_PIN(CC_RSTN, 5, 7); // BT pins TOSH_ASSIGN_PIN(BT_PIO, 2, 6); TOSH_ASSIGN_PIN(BT_RTS, 1, 6); TOSH_ASSIGN_PIN(BT_CTS, 1, 7); TOSH_ASSIGN_PIN(BT_TXD, 3, 6); TOSH_ASSIGN_PIN(BT_RXD, 3, 7); TOSH_ASSIGN_PIN(BT_RESET, 5, 5); //BSL Pins TOSH_ASSIGN_PIN(PROG_OUT, 1, 1); TOSH_ASSIGN_PIN(PROG_IN, 2, 2); // SD uart chip-select TOSH_ASSIGN_PIN(SD_CS_N, 3, 0); TOSH_ASSIGN_PIN(TILT, 2, 4); // ADC lines on the testpoints TOSH_ASSIGN_PIN(ADC_0, 6, 0); TOSH_ASSIGN_PIN(ADC_1, 6, 1); TOSH_ASSIGN_PIN(ADC_2, 6, 2); TOSH_ASSIGN_PIN(ADC_3, 6, 3); TOSH_ASSIGN_PIN(ADC_4, 6, 4); TOSH_ASSIGN_PIN(ADC_5, 6, 5); TOSH_ASSIGN_PIN(ADC_6, 6, 6); TOSH_ASSIGN_PIN(ADC_7, 6, 7); TOSH_ASSIGN_PIN(ADC_ACCELZ, 6, 3); TOSH_ASSIGN_PIN(ADC_ACCELY, 6, 4); TOSH_ASSIGN_PIN(ADC_ACCELX, 6, 5); TOSH_ASSIGN_PIN(DAC0_AN, 6, 6); TOSH_ASSIGN_PIN(DAC1_AN, 6, 7); TOSH_ASSIGN_PIN(VSENSE_ADC6, 6, 6); TOSH_ASSIGN_PIN(VSENSE_ADC7, 6, 7); // bus arbitration pins TOSH_ASSIGN_PIN(SW_SD_PWR_N, 4, 5); TOSH_ASSIGN_PIN(SW_BT_PWR_N, 4, 6); // if used as expansion GPIOs TOSH_ASSIGN_PIN(SER0_RTS, 1, 3); TOSH_ASSIGN_PIN(SER0_CTS, 1, 4); TOSH_ASSIGN_PIN(SIMO0, 3, 1); TOSH_ASSIGN_PIN(SOMI0, 3, 2); TOSH_ASSIGN_PIN(UCLK0, 3, 3); TOSH_ASSIGN_PIN(UTXD0, 3, 4); TOSH_ASSIGN_PIN(URXD0, 3, 5); // redefinitions for the sd card driver TOSH_ASSIGN_PIN(SD_DI, 3, 1); TOSH_ASSIGN_PIN(SD_DO, 3, 2); TOSH_ASSIGN_PIN(SD_CLK, 3, 3); TOSH_ASSIGN_PIN(SIMO1, 5, 1); TOSH_ASSIGN_PIN(SOMI1, 5, 2); TOSH_ASSIGN_PIN(UCLK1, 5, 3); TOSH_ASSIGN_PIN(UTXD1, 3, 6); TOSH_ASSIGN_PIN(URXD1, 3, 7); TOSH_ASSIGN_PIN(GIO0, 2, 0); TOSH_ASSIGN_PIN(GIO1, 2, 1); TOSH_ASSIGN_PIN(GIO2, 2, 5); // second internal expansion gpio // 1-Wire TOSH_ASSIGN_PIN(ONEWIRE, 4, 7); // ROSC TOSH_ASSIGN_PIN(ROSC, 2, 5); // docked signal from programming board TOSH_ASSIGN_PIN(DOCK_N, 2, 3); // ACCEL TOSH_ASSIGN_PIN(PWRMUX_SEL, 4, 1); TOSH_ASSIGN_PIN(ACCEL_SEL0, 4, 4); TOSH_ASSIGN_PIN(ACCEL_SLEEP_N, 5, 0); #endif // _H_hardware_h tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/platform.h000066400000000000000000000000001207233610700224700ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/shimmer2r/platform_message.h000066400000000000000000000051301207233610700242050ustar00rootroot00000000000000/* $Id: platform_message.h,v 1.2 2010-06-29 22:07:55 scipio Exp $ * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Defining the platform-independently named packet structures to be the * chip-specific CC1000 packet structures. * * @author Philip Levis * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:55 $ */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include #include typedef union message_header { cc2420_header_t cc2420; serial_header_t serial; } message_header_t; typedef union TOSRadioFooter { cc2420_footer_t cc2420; } message_footer_t; typedef union TOSRadioMetadata { cc2420_metadata_t cc2420; serial_metadata_t serial; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/span/000077500000000000000000000000001207233610700175365ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/span/.platform000066400000000000000000000036231207233610700213670ustar00rootroot00000000000000# span - platform includes # Steve Ayer, December 2009 # # Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. push( @includes, qw( . %T/platforms/span %T/platforms/span/chips/cc2420 %T/platforms/shimmer/chips/msp430 %T/platforms/shimmer/chips/ds2411 %T/chips/cc2420 %T/chips/cc2420/alarm %T/chips/cc2420/control %T/chips/cc2420/csma %T/chips/cc2420/interfaces %T/chips/cc2420/link %T/chips/cc2420/lowpan %T/chips/cc2420/lpl %T/chips/cc2420/packet %T/chips/cc2420/receive %T/chips/cc2420/spi %T/chips/cc2420/transmit %T/chips/cc2420/unique %T/chips/cc2420/security %T/chips/msp430 %T/chips/msp430/adc12 %T/chips/msp430/dma %T/chips/msp430/pins %T/chips/msp430/timer %T/chips/msp430/usart %T/chips/msp430/sensors %T/lib/timer %T/lib/serial %T/lib/adc %T/lib/power ) ); @opts = qw( -gcc=msp430-gcc -mmcu=msp430f1611 -fnesc-target=msp430 -fnesc-no-debug ); push @opts, "-mdisable-hwmul" if `msp430-gcc --version | grep 3.2.3`; push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{'CIL_MACHINE'} = "version_major=3 " . "version_minor=2 " . "version=msp430-3.2.3 " . "short=2,2 " . "int=2,2 " . "long=4,2 " . "long_long=8,2 " . "pointer=2,2 " . "enum=2,2 " . "float=4,2 " . "double=4,2 " . "long_double=4,2 " . "void=1,1 " . "fun=1,2 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/span/ActiveMessageC.nc000066400000000000000000000060551207233610700227110ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:55 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.2 2010-06-29 22:07:55 scipio Exp $ * */ /** * The Active Message layer on the SHIMMER platform. This is a naming wrapper * around the CC2420 Active Message layer. * * @author Konrad Lorincz */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2420ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/platforms/span/Ieee154MessageC.nc000066400000000000000000000044731207233610700226010ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * * @author Stephen Dawson-Haggerty */ configuration Ieee154MessageC { provides { interface SplitControl; interface Resource as SendResource[uint8_t clientId]; interface Ieee154Send; interface Receive as Ieee154Receive; interface Ieee154Packet; interface Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; interface LowPowerListening; interface PacketLink; } } implementation { components CC2420Ieee154MessageC as Msg; SplitControl = Msg; SendResource = Msg; Ieee154Send = Msg; Ieee154Receive = Msg; Ieee154Packet = Msg; Packet = Msg; PacketAcknowledgements = Msg; LinkPacketMetadata = Msg; LowPowerListening = Msg; PacketLink = Msg; } tinyos-2.1.2+dfsg/tos/platforms/span/LedsP.nc000066400000000000000000000064121207233610700210720ustar00rootroot00000000000000// $Id: LedsP.nc,v 1.3 2010-06-29 22:07:55 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The implementation of the standard 3 LED mote abstraction. * * @author Joe Polastre * @author Philip Levis * * @date March 21, 2005 */ /* * one-led hacks for span, sma 6/2010 */ module LedsP @safe() { provides { interface Init; interface Leds; } uses { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; } } implementation { command error_t Init.init() { atomic { dbg("Init", "LEDS: initialized.\n"); call Led0.makeOutput(); call Led0.set(); } return SUCCESS; } /* Note: the call is inside the dbg, as it's typically a read of a volatile location, so can't be deadcode eliminated */ #define DBGLED(n) \ dbg("LedsC", "LEDS: Led" #n " %s.\n", call Led ## n .get() ? "off" : "on"); async command void Leds.led0On() { call Led0.clr(); DBGLED(0); } async command void Leds.led0Off() { call Led0.set(); DBGLED(0); } async command void Leds.led0Toggle() { call Led0.toggle(); DBGLED(0); } async command void Leds.led1On() { } async command void Leds.led1Off() { } async command void Leds.led1Toggle() { } async command void Leds.led2On() { } async command void Leds.led2Off() { } async command void Leds.led2Toggle() { } async command uint8_t Leds.get() { uint8_t rval; atomic { rval = 0; if (!call Led0.get()) { rval |= LEDS_LED0; } } return rval; } async command void Leds.set(uint8_t val) { atomic { if (val & LEDS_LED0) { call Leds.led0On(); } else { call Leds.led0Off(); } } } } tinyos-2.1.2+dfsg/tos/platforms/span/MoteClockC.nc000066400000000000000000000035471207233610700220540ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: MoteClockC.nc,v 1.1 2010-03-24 17:42:14 ayer1 Exp $ * */ /** * @author Vlado Handziski */ configuration MoteClockC { provides interface Init as MoteClockInit; } implementation { components Msp430ClockC; MoteClockInit = Msp430ClockC.Init; } tinyos-2.1.2+dfsg/tos/platforms/span/MotePlatformC.nc000066400000000000000000000121561207233610700226010ustar00rootroot00000000000000/* * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date May, 2009 */ module MotePlatformC { provides interface Init; } implementation { command error_t Init.init() { //LEDS TOSH_MAKE_GREEN_LED_OUTPUT(); TOSH_SEL_GREEN_LED_IOFUNC(); //RADIO PINS //CC2420 pins TOSH_MAKE_RADIO_CSN_OUTPUT(); TOSH_SEL_RADIO_CSN_IOFUNC(); TOSH_SET_RADIO_CSN_PIN(); // should be reset_n TOSH_MAKE_RADIO_RESET_OUTPUT(); TOSH_SEL_RADIO_RESET_IOFUNC(); TOSH_CLR_RADIO_RESET_PIN(); TOSH_MAKE_RADIO_CCA_INPUT(); TOSH_MAKE_RADIO_FIFO_INPUT(); TOSH_MAKE_RADIO_FIFOP_INPUT(); TOSH_MAKE_RADIO_SFD_INPUT(); TOSH_SEL_RADIO_CCA_IOFUNC(); TOSH_SEL_RADIO_FIFO_IOFUNC(); TOSH_SEL_RADIO_FIFOP_IOFUNC(); TOSH_SEL_RADIO_SFD_IOFUNC(); TOSH_MAKE_RADIO_VREF_OUTPUT(); TOSH_SEL_RADIO_VREF_IOFUNC(); // BSL Prog Pins tristate em TOSH_MAKE_PROG_IN_OUTPUT(); TOSH_MAKE_PROG_OUT_OUTPUT(); TOSH_SEL_PROG_IN_IOFUNC(); TOSH_SEL_PROG_OUT_IOFUNC(); // USART lines, attached to a pullup and cc2420 TOSH_SEL_UCLK1_IOFUNC(); TOSH_MAKE_UCLK1_OUTPUT(); TOSH_SET_UCLK1_PIN(); TOSH_SEL_SIMO1_IOFUNC(); TOSH_MAKE_SIMO1_OUTPUT(); TOSH_SET_SIMO1_PIN(); TOSH_SEL_SOMI1_IOFUNC(); TOSH_MAKE_SOMI1_INPUT(); TOSH_SEL_ROSC_IOFUNC(); TOSH_MAKE_ROSC_INPUT(); // 1-wire function TOSH_MAKE_ONEWIRE_INPUT(); TOSH_SEL_ONEWIRE_IOFUNC(); TOSH_MAKE_ADC_7_OUTPUT(); TOSH_SEL_ADC_7_IOFUNC(); TOSH_SEL_GIO0_IOFUNC(); TOSH_MAKE_GIO0_OUTPUT(); TOSH_SEL_GIO1_IOFUNC(); TOSH_MAKE_GIO1_OUTPUT(); TOSH_SEL_GIO2_IOFUNC(); TOSH_MAKE_GIO2_OUTPUT(); TOSH_SEL_FTDI_ADBUS_7_IOFUNC(); TOSH_MAKE_FTDI_ADBUS_7_INPUT(); TOSH_SEL_FTDI_ADBUS_3_IOFUNC(); TOSH_MAKE_FTDI_ADBUS_7_INPUT(); // idle expansion header pins TOSH_MAKE_SER0_CTS_OUTPUT(); TOSH_SEL_SER0_CTS_IOFUNC(); TOSH_MAKE_SER0_RTS_OUTPUT(); TOSH_SEL_SER0_RTS_IOFUNC(); TOSH_MAKE_UTXD0_OUTPUT(); TOSH_SEL_UTXD0_IOFUNC(); TOSH_MAKE_URXD0_OUTPUT(); TOSH_SEL_URXD0_IOFUNC(); /* * assignments for nc pins */ TOSH_MAKE_NC_GIO0_OUTPUT(); TOSH_SEL_NC_GIO0_IOFUNC(); TOSH_MAKE_NC_GIO1_OUTPUT(); TOSH_SEL_NC_GIO1_IOFUNC(); TOSH_MAKE_NC_CS_OUTPUT(); TOSH_SEL_NC_CS_IOFUNC(); TOSH_MAKE_SIMO0_INPUT(); TOSH_SEL_SIMO0_IOFUNC(); TOSH_MAKE_SOMI0_INPUT(); TOSH_SEL_SOMI0_IOFUNC(); TOSH_MAKE_UTXD1_OUTPUT(); TOSH_SEL_UTXD1_IOFUNC(); TOSH_MAKE_URXD1_OUTPUT(); TOSH_SEL_URXD1_IOFUNC(); TOSH_MAKE_NC_LED0_INPUT(); TOSH_SEL_NC_LED0_IOFUNC(); TOSH_MAKE_NC_LED1_OUTPUT(); TOSH_SEL_NC_LED1_IOFUNC(); TOSH_MAKE_NC_LED2_OUTPUT(); TOSH_SEL_NC_LED2_IOFUNC(); TOSH_MAKE_NC_ACCEL0_OUTPUT(); TOSH_SEL_NC_ACCEL0_IOFUNC(); TOSH_MAKE_NC_ACCEL1_OUTPUT(); TOSH_SEL_NC_ACCEL1_IOFUNC(); TOSH_MAKE_NC_ACCELS_OUTPUT(); TOSH_SEL_NC_ACCELS_IOFUNC(); TOSH_MAKE_NC_TB0_OUTPUT(); TOSH_SEL_NC_TB0_IOFUNC(); TOSH_MAKE_NC_GIO2_OUTPUT(); TOSH_SEL_NC_GIO2_IOFUNC(); TOSH_MAKE_NC_SVS_OUTPUT(); TOSH_SEL_NC_SVS_IOFUNC(); TOSH_MAKE_NC_ADC_0_OUTPUT(); TOSH_SEL_NC_ADC_0_IOFUNC(); TOSH_MAKE_NC_ADC_1_OUTPUT(); TOSH_SEL_NC_ADC_1_IOFUNC(); TOSH_MAKE_NC_ADC_2_OUTPUT(); TOSH_SEL_NC_ADC_2_IOFUNC(); TOSH_MAKE_NC_ADC_3_OUTPUT(); TOSH_SEL_NC_ADC_3_IOFUNC(); TOSH_MAKE_NC_ADC_4_OUTPUT(); TOSH_SEL_NC_ADC_4_IOFUNC(); TOSH_MAKE_NC_ADC_5_OUTPUT(); TOSH_SEL_NC_ADC_5_IOFUNC(); TOSH_MAKE_NC_ADC_6_OUTPUT(); TOSH_SEL_NC_ADC_6_IOFUNC(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/span/Msp430Timer32khzMapC.nc000066400000000000000000000066321207233610700235010ustar00rootroot00000000000000//$Id: Msp430Timer32khzMapC.nc,v 1.2 2010-06-29 22:07:55 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * MSP430Timer32khzMapC presents as paramaterized interfaces all of * the 32khz hardware timers on the MSP430 that are available for * compile time allocation by "new Alarm32khz16C()", "new * AlarmMilli32C()", and so on. * * Platforms based on the MSP430 are * encouraged to copy in and * override this file, presenting only the * hardware timers that are * available for allocation on that platform. * * @author Cory Sharp * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:55 $ * port to span * @author Steve Ayer * @date January, 2010 */ configuration Msp430Timer32khzMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; // Timer pin B0 is used by the CC2420 radio's SFD pin // this is the only difference between the default 32khz map // and the map on span Msp430Timer[0] = Msp430TimerC.TimerB; Msp430TimerControl[0] = Msp430TimerC.ControlB1; Msp430Compare[0] = Msp430TimerC.CompareB1; Msp430Timer[1] = Msp430TimerC.TimerB; Msp430TimerControl[1] = Msp430TimerC.ControlB2; Msp430Compare[1] = Msp430TimerC.CompareB2; Msp430Timer[2] = Msp430TimerC.TimerB; Msp430TimerControl[2] = Msp430TimerC.ControlB3; Msp430Compare[2] = Msp430TimerC.CompareB3; Msp430Timer[3] = Msp430TimerC.TimerB; Msp430TimerControl[3] = Msp430TimerC.ControlB4; Msp430Compare[3] = Msp430TimerC.CompareB4; Msp430Timer[4] = Msp430TimerC.TimerB; Msp430TimerControl[4] = Msp430TimerC.ControlB5; Msp430Compare[4] = Msp430TimerC.CompareB5; Msp430Timer[5] = Msp430TimerC.TimerB; Msp430TimerControl[5] = Msp430TimerC.ControlB6; Msp430Compare[5] = Msp430TimerC.CompareB6; } tinyos-2.1.2+dfsg/tos/platforms/span/PlatformC.nc000066400000000000000000000036641207233610700217600ustar00rootroot00000000000000/* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre and Cory Sharp * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:55 $ */ #include "hardware.h" configuration PlatformC { provides interface Init; } implementation { components PlatformP, MotePlatformC, MoteClockC; Init = PlatformP; PlatformP.MoteClockInit -> MoteClockC; PlatformP.MoteInit -> MotePlatformC; } tinyos-2.1.2+dfsg/tos/platforms/span/PlatformLedsC.nc000066400000000000000000000044601207233610700225630ustar00rootroot00000000000000// $Id: PlatformLedsC.nc,v 1.3 2010-06-29 22:07:55 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre * @version $Revision: 1.3 $ $Date: 2010-06-29 22:07:55 $ */ /* * one-led hacks for span, sma 6/2010 */ #include "hardware.h" configuration PlatformLedsC { provides interface GeneralIO as Led0; provides interface GeneralIO as Led1; provides interface GeneralIO as Led2; uses interface Init; } implementation { components HplMsp430GeneralIOC as GeneralIOC , new Msp430GpioC() as Led0Impl , new Msp430GpioC() as Led1Impl , new Msp430GpioC() as Led2Impl ; components PlatformP; Init = PlatformP.LedsInit; Led0 = Led0Impl; Led0Impl -> GeneralIOC.Port43; Led1 = Led1Impl; Led2 = Led2Impl; } tinyos-2.1.2+dfsg/tos/platforms/span/PlatformP.nc000066400000000000000000000006601207233610700217660ustar00rootroot00000000000000#include "hardware.h" module PlatformP{ provides interface Init; uses interface Init as MoteClockInit; uses interface Init as MoteInit; uses interface Init as LedsInit; } implementation { command error_t Init.init() { WDTCTL = WDTPW + WDTHOLD; call MoteClockInit.init(); call MoteInit.init(); call LedsInit.init(); return SUCCESS; } default command error_t LedsInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/span/PlatformSerialC.nc000066400000000000000000000040531207233610700231110ustar00rootroot00000000000000/* * Copyright (c) 2008 * The President and Fellows of Harvard College. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /** * From Konrad's SHIMMER conversbion * * @author Konrad Lorincz * @date May 14, 2008 */ configuration PlatformSerialC { provides interface StdControl; provides interface UartStream; provides interface UartByte; } implementation { components new Msp430Uart0C() as UartC; UartStream = UartC; UartByte = UartC; components SpanSerialP; StdControl = SpanSerialP; SpanSerialP.Msp430UartConfigure <- UartC.Msp430UartConfigure; SpanSerialP.Resource -> UartC.Resource; } tinyos-2.1.2+dfsg/tos/platforms/span/SpanSerialP.nc000066400000000000000000000046631207233610700222520ustar00rootroot00000000000000/* * Copyright (c) 2008 * The President and Fellows of Harvard College. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /** * Conversion of Konrad's conversion * * @author Konrad Lorincz * @date May 14, 2008 * @author Steve Ayer * @date December 2009 */ module SpanSerialP { provides interface StdControl; provides interface Msp430UartConfigure; uses interface Resource; } implementation { msp430_uart_union_config_t msp430_uart_telos_config = { {ubr: UBR_1MHZ_115200, umctl: UMCTL_1MHZ_115200, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0, utxe : 1, urxe : 1} }; command error_t StdControl.start() { return call Resource.immediateRequest(); } command error_t StdControl.stop() { call Resource.release(); return SUCCESS; } event void Resource.granted(){} async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig() { return &msp430_uart_telos_config; } } tinyos-2.1.2+dfsg/tos/platforms/span/TimeSyncMessageC.nc000066400000000000000000000066631207233610700232360ustar00rootroot00000000000000// $Id: TimeSyncMessageC.nc,v 1.2 2010-06-29 22:07:55 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * The Active Message layer on the shimmer platform. This is a naming wrapper * around the CC2420 Active Message layer that implemets timesync interface (TEP 133). * * @author Konrad Lorincz * @author Brano Kusy * @date June 19 2005 */ configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSend32khz[am_id_t id]; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC2420TimeSyncMessageC as AM; SplitControl = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; LowPowerListening = AM; TimeSyncAMSend32khz = AM; TimeSyncAMSendMilli = AM; TimeSyncPacket32khz = AM; TimeSyncPacketMilli = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/platforms/span/chips/000077500000000000000000000000001207233610700206445ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/span/chips/cc2420/000077500000000000000000000000001207233610700215415ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/span/chips/cc2420/HplCC2420AlarmC.nc000066400000000000000000000040231207233610700244030ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of 32khz alarms for the ChipCon CC2420 radio * connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2010-03-24 17:42:14 $ */ generic configuration HplCC2420AlarmC() { provides interface Init; provides interface Alarm as Alarm32khz32; } implementation { components new Alarm32khz32C(); Init = Alarm32khz32C; Alarm32khz32 = Alarm32khz32C; } tinyos-2.1.2+dfsg/tos/platforms/span/chips/cc2420/HplCC2420InterruptsC.nc000066400000000000000000000053731207233610700255370ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of interrupts and captures for the ChipCon * CC2420 radio connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2010-03-24 17:42:14 $ */ /** * Ported to the span platform. * * @author Steve Ayer * @date January, 2010 */ configuration HplCC2420InterruptsC { provides interface GpioCapture as CaptureSFD; provides interface GpioInterrupt as InterruptCCA; provides interface GpioInterrupt as InterruptFIFOP; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components Msp430TimerC; components new GpioCaptureC() as CaptureSFDC; CaptureSFDC.Msp430TimerControl -> Msp430TimerC.ControlB0; CaptureSFDC.Msp430Capture -> Msp430TimerC.CaptureB0; CaptureSFDC.GeneralIO -> GeneralIOC.Port40; components HplMsp430InterruptC; components new Msp430InterruptC() as InterruptCCAC; components new Msp430InterruptC() as InterruptFIFOPC; InterruptCCAC.HplInterrupt -> HplMsp430InterruptC.Port26; InterruptFIFOPC.HplInterrupt -> HplMsp430InterruptC.Port23; CaptureSFD = CaptureSFDC.Capture; InterruptCCA = InterruptCCAC.Interrupt; InterruptFIFOP = InterruptFIFOPC.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/span/chips/cc2420/HplCC2420InterruptsP.nc000066400000000000000000000052111207233610700255430ustar00rootroot00000000000000/* * Copyright (c) 2010, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date January, 2010 * * this implements an interrupt-driven capture interface for the cc2420 * tx-mode use of sfd. span does not have sfd routed to a timer capture pin * on the msp430, so cc2420's capture mechanism fails. * this module will trigger a capture.captured event after receiving the * appropriate interrupt from the span sfd pin (2.7) */ module HplCC2420InterruptsP @safe() { provides{ interface GpioCapture as CaptureSFD; } uses{ interface GpioInterrupt as InterruptSFD; interface LocalTime; } } implementation { async command error_t CaptureSFD.captureRisingEdge() { call InterruptSFD.enableRisingEdge(); return SUCCESS; } async command error_t CaptureSFD.captureFallingEdge() { call InterruptSFD.enableFallingEdge(); return SUCCESS; } async command void CaptureSFD.disable() { call InterruptSFD.disable(); } async event void InterruptSFD.fired() { uint32_t t = call LocalTime.get(); signal CaptureSFD.captured((uint16_t)(t & 0x0000ffff)); } } tinyos-2.1.2+dfsg/tos/platforms/span/chips/cc2420/HplCC2420PinsC.nc000066400000000000000000000056341207233610700242710ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of general-purpose I/O for the ChipCon CC2420 * radio connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2010-03-24 17:42:14 $ */ /** * Ported to the span * * @author Konrad Lorincz * @date May 14, 2008 * @author Steve Ayer * @date December, 2009 */ configuration HplCC2420PinsC { provides interface GeneralIO as CCA; provides interface GeneralIO as CSN; provides interface GeneralIO as FIFO; provides interface GeneralIO as FIFOP; provides interface GeneralIO as RSTN; provides interface GeneralIO as SFD; provides interface GeneralIO as VREN; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> GeneralIOC.Port26; CSNM -> GeneralIOC.Port54; FIFOM -> GeneralIOC.Port24; FIFOPM -> GeneralIOC.Port23; RSTNM -> GeneralIOC.Port33; //SFDM -> GeneralIOC.Port27; SFDM -> GeneralIOC.Port40; VRENM -> GeneralIOC.Port55; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; } tinyos-2.1.2+dfsg/tos/platforms/span/chips/cc2420/HplCC2420SpiC.nc000066400000000000000000000041541207233610700241070ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of the SPI bus for the ChipCon CC2420 radio * connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2010-03-24 17:42:14 $ */ /** * Ported to the SHIMMER platform. * * @author Konrad Lorincz */ generic configuration HplCC2420SpiC() { provides interface Resource; provides interface SpiByte; provides interface SpiPacket; } implementation { components new Msp430Spi1C() as SpiC; Resource = SpiC; SpiByte = SpiC; SpiPacket = SpiC; } tinyos-2.1.2+dfsg/tos/platforms/span/chips/cc2420x/000077500000000000000000000000001207233610700217315ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/span/chips/cc2420x/SpanSerialP.nc000066400000000000000000000054151207233610700244410ustar00rootroot00000000000000/* * Copyright (c) 2008 * The President and Fellows of Harvard College. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /** * Conversion of Konrad's conversion * * @author Konrad Lorincz * @date May 14, 2008 * @author Steve Ayer * @date December 2009 */ module SpanSerialP { provides interface StdControl; provides interface Msp430UartConfigure; uses interface Resource; } implementation { enum { // from http://www.daycounter.com/Calculators/MSP430-Uart-Calculator.phtml UBR_4MHZ_4800=0x0369, UMCTL_4MHZ_4800=0xfb, UBR_4MHZ_9600=0x01b4, UMCTL_4MHZ_9600=0xdf, UBR_4MHZ_57600=0x0048, UMCTL_4MHZ_57600=0xfb, UBR_4MHZ_115200=0x0024, UMCTL_4MHZ_115200=0x29, UBR_3_7MHZ_115200=0x0020, UMCTL_3_7MHZ_115200=0x00, }; msp430_uart_union_config_t msp430_uart_telos_config = { {ubr: UBR_4MHZ_115200, umctl: UMCTL_4MHZ_115200, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0, utxe : 1, urxe : 1} }; command error_t StdControl.start() { return call Resource.immediateRequest(); } command error_t StdControl.stop() { call Resource.release(); return SUCCESS; } event void Resource.granted(){} async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig() { return &msp430_uart_telos_config; } } tinyos-2.1.2+dfsg/tos/platforms/span/chips/cc2420x/t32khz/000077500000000000000000000000001207233610700230565ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/span/chips/cc2420x/t32khz/HplCC2420XC.nc000066400000000000000000000055131207233610700251000ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ configuration HplCC2420XC { provides { interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface LocalTime as LocalTimeRadio; interface Init; interface Alarm; } } implementation { components HplMsp430GeneralIOC as IO, new Msp430Spi1C() as SpiC; // pins components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> IO.Port26; CSNM -> IO.Port54; FIFOM -> IO.Port24; FIFOPM -> IO.Port23; RSTNM -> IO.Port33; SFDM -> IO.Port40; VRENM -> IO.Port55; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; // spi SpiResource = SpiC.Resource; FastSpiByte = SpiC; // capture components Msp430TimerC as TimerC; components new GpioCaptureC(); GpioCaptureC.Msp430TimerControl -> TimerC.ControlB0; GpioCaptureC.Msp430Capture -> TimerC.CaptureB0; GpioCaptureC.GeneralIO -> IO.Port40; SfdCapture = GpioCaptureC; components new Msp430InterruptC() as FifopInterruptC, HplMsp430InterruptC; FifopInterruptC.HplInterrupt -> HplMsp430InterruptC.Port23; FifopInterrupt = FifopInterruptC.Interrupt; // alarm components new Alarm32khz16C() as AlarmC; Alarm = AlarmC; Init = AlarmC; // localTime components LocalTime32khzC; LocalTimeRadio = LocalTime32khzC.LocalTime; } tinyos-2.1.2+dfsg/tos/platforms/span/chips/cc2420x/tmicro/000077500000000000000000000000001207233610700232265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/span/chips/cc2420x/tmicro/HplCC2420XC.nc000066400000000000000000000055131207233610700252500ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ configuration HplCC2420XC { provides { interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface LocalTime as LocalTimeRadio; interface Init; interface Alarm; } } implementation { components HplMsp430GeneralIOC as IO, new Msp430Spi1C() as SpiC; // pins components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> IO.Port26; CSNM -> IO.Port54; FIFOM -> IO.Port24; FIFOPM -> IO.Port23; RSTNM -> IO.Port33; SFDM -> IO.Port40; VRENM -> IO.Port55; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; // spi SpiResource = SpiC.Resource; FastSpiByte = SpiC; // capture components Msp430TimerC as TimerC; components new GpioCaptureC(); GpioCaptureC.Msp430TimerControl -> TimerC.ControlB0; GpioCaptureC.Msp430Capture -> TimerC.CaptureB0; GpioCaptureC.GeneralIO -> IO.Port40; SfdCapture = GpioCaptureC; components new Msp430InterruptC() as FifopInterruptC, HplMsp430InterruptC; FifopInterruptC.HplInterrupt -> HplMsp430InterruptC.Port23; FifopInterrupt = FifopInterruptC.Interrupt; // alarm components new AlarmMicro16C() as AlarmC; Alarm = AlarmC; Init = AlarmC; // localTime components LocalTimeMicroC; LocalTimeRadio = LocalTimeMicroC.LocalTime; } tinyos-2.1.2+dfsg/tos/platforms/span/chips/cc2420x/tmicro/Msp430TimerMicroMapC.nc000066400000000000000000000043721207233610700273000ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** Configure the timer subsystem such that TimerA=ACLK (32kHz) and TimerB=SMCLK/4 (1MHz). */ configuration Msp430TimerMicroMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; // Timer B0 is used for SFD capture on the CC2420 radio Msp430Timer[0] = Msp430TimerC.TimerB; Msp430TimerControl[0] = Msp430TimerC.ControlB1; Msp430Compare[0] = Msp430TimerC.CompareB1; Msp430Timer[1] = Msp430TimerC.TimerB; Msp430TimerControl[1] = Msp430TimerC.ControlB2; Msp430Compare[1] = Msp430TimerC.CompareB2; Msp430Timer[2] = Msp430TimerC.TimerB; Msp430TimerControl[2] = Msp430TimerC.ControlB3; Msp430Compare[2] = Msp430TimerC.CompareB3; Msp430Timer[3] = Msp430TimerC.TimerB; Msp430TimerControl[3] = Msp430TimerC.ControlB4; Msp430Compare[3] = Msp430TimerC.CompareB4; Msp430Timer[4] = Msp430TimerC.TimerB; Msp430TimerControl[4] = Msp430TimerC.ControlB5; Msp430Compare[4] = Msp430TimerC.CompareB5; Msp430Timer[5] = Msp430TimerC.TimerB; Msp430TimerControl[5] = Msp430TimerC.ControlB6; Msp430Compare[5] = Msp430TimerC.CompareB6; } tinyos-2.1.2+dfsg/tos/platforms/span/chips/msp430/000077500000000000000000000000001207233610700216725ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/span/chips/msp430/msp430hardware.h000066400000000000000000000232301207233610700246070ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ // @author Vlado Handziski // @author Joe Polastre // @author Cory Sharp #ifndef _H_msp430hardware_h #define _H_msp430hardware_h #if defined(__MSPGCC__) /* mspgcc */ #include #include #else /* __MSPGCC__ */ /* old mspgcc3, forked mspgcc4 */ #include #include #endif /* __MSPGCC__ */ #include "msp430regtypes.h" #include "Msp430DcoSpec.h" // CPU memory-mapped register access will cause nesc to issue race condition // warnings. Race conditions are a significant conern when accessing CPU // memory-mapped registers, because they can change even while interrupts // are disabled. This means that the standard nesc tools for resolving race // conditions, atomic statements that disable interrupt handling, do not // resolve CPU register race conditions. So, CPU registers access must be // treated seriously and carefully. // The macro MSP430REG_NORACE allows individual modules to internally // redeclare CPU registers as norace, eliminating nesc's race condition // warnings for their access. This macro should only be used after the // specific CPU register use has been verified safe and correct. Example // use: // // module MyLowLevelModule // { // // ... // } // implementation // { // MSP430REG_NORACE(TACCTL0); // // ... // } #undef norace #define MSP430REG_NORACE_EXPAND(type,name,addr) \ norace static volatile type name asm(#addr) #define MSP430REG_NORACE3(type,name,addr) \ MSP430REG_NORACE_EXPAND(type,name,addr) // MSP430REG_NORACE and MSP430REG_NORACE2 presume naming conventions among // type, name, and addr, which are defined in the local header // msp430regtypes.h and mspgcc's header io.h and its children. #define MSP430REG_NORACE2(rename,name) \ MSP430REG_NORACE3(TYPE_##name,rename,name##_) #define MSP430REG_NORACE(name) \ MSP430REG_NORACE3(TYPE_##name,name,name##_) // Avoid the type-punned pointer warnings from gcc 3.3, which are warning about // creating potentially broken object code. Union casts are the appropriate work // around. Unfortunately, they require a function definiton. #define DEFINE_UNION_CAST(func_name,to_type,from_type) \ to_type func_name(from_type x) @safe() { union {from_type f; to_type t;} c = {f:x}; return c.t; } // redefine ugly defines from msp-gcc #ifndef DONT_REDEFINE_SR_FLAGS #undef C #undef Z #undef N #undef V #undef GIE #undef CPUOFF #undef OSCOFF #undef SCG0 #undef SCG1 #undef LPM0_bits #undef LPM1_bits #undef LPM2_bits #undef LPM3_bits #undef LPM4_bits #define SR_C 0x0001 #define SR_Z 0x0002 #define SR_N 0x0004 #define SR_V 0x0100 #define SR_GIE 0x0008 #define SR_CPUOFF 0x0010 #define SR_OSCOFF 0x0020 #define SR_SCG0 0x0040 #define SR_SCG1 0x0080 #define LPM0_bits SR_CPUOFF #define LPM1_bits SR_SCG0+SR_CPUOFF #define LPM2_bits SR_SCG1+SR_CPUOFF #define LPM3_bits SR_SCG1+SR_SCG0+SR_CPUOFF #define LPM4_bits SR_SCG1+SR_SCG0+SR_OSCOFF+SR_CPUOFF #endif//DONT_REDEFINE_SR_FLAGS #ifdef interrupt #undef interrupt #endif #ifdef wakeup #undef wakeup #endif #ifdef signal #undef signal #endif // Re-definitions for safe tinyOS // These rely on io.h being included at the top of this file // thus pulling the affected header files before the re-definitions #ifdef SAFE_TINYOS #undef ADC12MEM #define ADC12MEM TCAST(int* ONE, ADC12MEM_) /* ADC12 Conversion Memory (for C) */ #undef ADC12MCTL #define ADC12MCTL TCAST(char * ONE, ADC12MCTL_) #endif // define platform constants that can be changed for different compilers // these are all msp430-gcc specific (add as necessary) #ifdef __msp430_headers_adc10_h #define __msp430_have_adc10 #endif #ifdef __msp430_headers_adc12_h #define __msp430_have_adc12 #endif // backwards compatibility to older versions of the header files #ifdef __MSP430_HAS_I2C__ #define __msp430_have_usart0_with_i2c #endif // I2CBusy flag is not defined by current MSP430-GCC #ifdef __msp430_have_usart0_with_i2c #ifndef I2CBUSY #define I2CBUSY (0x01 << 5) #endif MSP430REG_NORACE2(U0CTLnr,U0CTL); MSP430REG_NORACE2(I2CTCTLnr,I2CTCTL); MSP430REG_NORACE2(I2CDCTLnr,I2CDCTL); #endif // The signal attribute has opposite meaning in msp430-gcc than in avr-gcc #define TOSH_SIGNAL(signame) \ void sig_##signame() __attribute__((interrupt (signame), wakeup)) @C() // TOSH_INTERRUPT allows nested interrupts #define TOSH_INTERRUPT(signame) \ void isr_##signame() __attribute__((interrupt (signame), signal, wakeup)) @C() inline void TOSH_wait(void) { nop(); nop(); } // #define TOSH_CYCLE_TIME_NS 250 // Our worst case is 250 ns = 1 cycle. inline void TOSH_wait_250ns(void) { nop(); } /* Following the suggestion of the mspgcc.sourceforge.net site for an intelligent pause routine */ void brief_pause(register unsigned int n) { asm volatile( "1: \n\t" "dec %0 \n\t" "jne 1b\n\t" : "+r" (n)); } #define TOSH_uwait(n) brief_pause((((unsigned long long)n) * TARGET_DCO_KHZ * 1024 / 1000000 - 2) / 3) #define SET_FLAG(port, flag) ((port) |= (flag)) #define CLR_FLAG(port, flag) ((port) &= ~(flag)) #define READ_FLAG(port, flag) ((port) & (flag)) // TOSH_ASSIGN_PIN creates functions that are effectively marked as // "norace". This means race conditions that result from their use will not // be detectde by nesc. #define TOSH_ASSIGN_PIN_HEX(name, port, hex) \ void TOSH_SET_##name##_PIN() @safe() { MSP430REG_NORACE2(r,P##port##OUT); r |= hex; } \ void TOSH_CLR_##name##_PIN() @safe() { MSP430REG_NORACE2(r,P##port##OUT); r &= ~hex; } \ void TOSH_TOGGLE_##name##_PIN() @safe(){ MSP430REG_NORACE2(r,P##port##OUT); r ^= hex; } \ uint8_t TOSH_READ_##name##_PIN() @safe() { MSP430REG_NORACE2(r,P##port##IN); return (r & hex); } \ void TOSH_MAKE_##name##_OUTPUT() @safe() { MSP430REG_NORACE2(r,P##port##DIR); r |= hex; } \ void TOSH_MAKE_##name##_INPUT() @safe() { MSP430REG_NORACE2(r,P##port##DIR); r &= ~hex; } \ void TOSH_SEL_##name##_MODFUNC() @safe() { MSP430REG_NORACE2(r,P##port##SEL); r |= hex; } \ void TOSH_SEL_##name##_IOFUNC() @safe() { MSP430REG_NORACE2(r,P##port##SEL); r &= ~hex; } #define TOSH_ASSIGN_PIN(name, port, bit) \ TOSH_ASSIGN_PIN_HEX(name,port,(1<<(bit))) typedef uint8_t mcu_power_t @combine("mcombine"); mcu_power_t mcombine(mcu_power_t m1, mcu_power_t m2) @safe() { return (m1 < m2) ? m1: m2; } enum { MSP430_POWER_ACTIVE = 0, MSP430_POWER_LPM0 = 1, MSP430_POWER_LPM1 = 2, MSP430_POWER_LPM2 = 3, MSP430_POWER_LPM3 = 4, MSP430_POWER_LPM4 = 5 }; void __nesc_disable_interrupt(void) @safe() { dint(); nop(); } void __nesc_enable_interrupt(void) @safe() { eint(); } typedef bool __nesc_atomic_t; __nesc_atomic_t __nesc_atomic_start(void); void __nesc_atomic_end(__nesc_atomic_t reenable_interrupts); #ifndef NESC_BUILD_BINARY /* @spontaneous() functions should not be included when NESC_BUILD_BINARY is #defined, to avoid duplicate functions definitions when binary components are used. Such functions do need a prototype in all cases, though. */ __nesc_atomic_t __nesc_atomic_start(void) @spontaneous() @safe() { __nesc_atomic_t result = ((READ_SR & SR_GIE) != 0); __nesc_disable_interrupt(); asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ return result; } void __nesc_atomic_end(__nesc_atomic_t reenable_interrupts) @spontaneous() @safe() { asm volatile("" : : : "memory"); /* ensure atomic section effect visibility */ if( reenable_interrupts ) __nesc_enable_interrupt(); } #endif /* Floating-point network-type support. These functions must convert to/from a 32-bit big-endian integer that follows the layout of Java's java.lang.float.floatToRawIntBits method. Conveniently, for the MSP430 family, this is a straight byte copy... */ typedef float nx_float __attribute__((nx_base_be(afloat))); inline float __nesc_ntoh_afloat(const void *COUNT(sizeof(float)) source) @safe() { float f; memcpy(&f, source, sizeof(float)); return f; } inline float __nesc_hton_afloat(void *COUNT(sizeof(float)) target, float value) @safe() { memcpy(target, &value, sizeof(float)); return value; } #endif//_H_msp430hardware_h tinyos-2.1.2+dfsg/tos/platforms/span/hardware.h000066400000000000000000000100401207233610700214770ustar00rootroot00000000000000/* * Copyright (c) 2009, Shimmer Research, Ltd. * All rights reserved * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Shimmer Research, Ltd. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Steve Ayer * @date May, 2009 */ #ifndef _H_hardware_h #define _H_hardware_h #include "msp430hardware.h" //#include "CC2420Const.h" // enum so components can override power saving, // as per TEP 112. enum { TOS_SLEEP_NONE = MSP430_POWER_ACTIVE, }; TOSH_ASSIGN_PIN(GREEN_LED, 4, 3); // CC2420 RADIO #defines TOSH_ASSIGN_PIN(RADIO_FIFOP, 2, 3); TOSH_ASSIGN_PIN(RADIO_FIFO, 2, 4); TOSH_ASSIGN_PIN(RADIO_CCA, 2, 6); TOSH_ASSIGN_PIN(RADIO_SFD, 2, 7); TOSH_ASSIGN_PIN(RADIO_VREF, 5, 5); TOSH_ASSIGN_PIN(RADIO_SIMO1, 5, 1); TOSH_ASSIGN_PIN(RADIO_SOMI1, 5, 2); TOSH_ASSIGN_PIN(RADIO_CSN, 5, 4); TOSH_ASSIGN_PIN(RADIO_RESET, 3, 3); // for mainstream tos... TOSH_ASSIGN_PIN(CC_FIFOP, 2, 3); TOSH_ASSIGN_PIN(CC_FIFO, 2, 4); TOSH_ASSIGN_PIN(CC_SFD, 2, 7); TOSH_ASSIGN_PIN(CC_VREN, 5, 5); TOSH_ASSIGN_PIN(CC_RSTN, 3, 3); // UART pins // SPI1 attached to cc2420 TOSH_ASSIGN_PIN(UCLK1, 5, 3); TOSH_ASSIGN_PIN(SOMI1, 5, 2); TOSH_ASSIGN_PIN(SIMO1, 5, 1); // 1-Wire TOSH_ASSIGN_PIN(ONEWIRE, 5, 6); //BSL Pins TOSH_ASSIGN_PIN(PROG_OUT, 1, 1); TOSH_ASSIGN_PIN(PROG_IN, 2, 2); // ADC lines on the testpoints TOSH_ASSIGN_PIN(ADC_7, 6, 7); TOSH_ASSIGN_PIN(DAC1_AN, 6, 7); // connected to external UART TOSH_ASSIGN_PIN(UTXD0, 3, 4); TOSH_ASSIGN_PIN(URXD0, 3, 5); TOSH_ASSIGN_PIN(UTXD1, 3, 6); TOSH_ASSIGN_PIN(URXD1, 3, 7); // GIO pins TOSH_ASSIGN_PIN(SER0_RTS, 1, 3); TOSH_ASSIGN_PIN(SER0_CTS, 1, 4); TOSH_ASSIGN_PIN(ROSC, 2, 5); TOSH_ASSIGN_PIN(GIO0, 1, 0); TOSH_ASSIGN_PIN(GIO1, 1, 5); TOSH_ASSIGN_PIN(GIO2, 1, 6); TOSH_ASSIGN_PIN(FTDI_ADBUS_7, 1, 2); TOSH_ASSIGN_PIN(FTDI_ADBUS_3, 2, 0); /* * NC Pins below */ TOSH_ASSIGN_PIN(NC_GIO0, 1, 7); TOSH_ASSIGN_PIN(NC_GIO1, 2, 1); TOSH_ASSIGN_PIN(NC_CS, 3, 0); TOSH_ASSIGN_PIN(SIMO0, 3, 1); TOSH_ASSIGN_PIN(SOMI0, 3, 2); TOSH_ASSIGN_PIN(UCLK0, 3, 3); TOSH_ASSIGN_PIN(NC_LED0, 4, 0); TOSH_ASSIGN_PIN(NC_LED1, 4, 1); TOSH_ASSIGN_PIN(NC_LED2, 4, 2); TOSH_ASSIGN_PIN(NC_ACCEL0, 4, 4); TOSH_ASSIGN_PIN(NC_ACCEL1, 4, 5); TOSH_ASSIGN_PIN(NC_ACCELS, 4, 6); TOSH_ASSIGN_PIN(NC_TB0, 4, 7); TOSH_ASSIGN_PIN(NC_GIO2, 5, 0); TOSH_ASSIGN_PIN(NC_SVS, 5, 7); TOSH_ASSIGN_PIN(NC_ADC_0, 6, 0); TOSH_ASSIGN_PIN(NC_ADC_1, 6, 1); TOSH_ASSIGN_PIN(NC_ADC_2, 6, 2); TOSH_ASSIGN_PIN(NC_ADC_3, 6, 3); TOSH_ASSIGN_PIN(NC_ADC_4, 6, 4); TOSH_ASSIGN_PIN(NC_ADC_5, 6, 5); TOSH_ASSIGN_PIN(NC_ADC_6, 6, 6); #endif // _H_hardware_h tinyos-2.1.2+dfsg/tos/platforms/span/platform.h000066400000000000000000000000001207233610700215210ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/span/platform_message.h000066400000000000000000000051301207233610700232360ustar00rootroot00000000000000/* $Id: platform_message.h,v 1.2 2010-06-29 22:07:55 scipio Exp $ * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Defining the platform-independently named packet structures to be the * chip-specific CC1000 packet structures. * * @author Philip Levis * @version $Revision: 1.2 $ $Date: 2010-06-29 22:07:55 $ */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include #include typedef union message_header { cc2420_header_t cc2420; serial_header_t serial; } message_header_t; typedef union TOSRadioFooter { cc2420_footer_t cc2420; } message_footer_t; typedef union TOSRadioMetadata { cc2420_metadata_t cc2420; serial_metadata_t serial; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/telosa/000077500000000000000000000000001207233610700200645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosa/.platform000066400000000000000000000035121207233610700217120ustar00rootroot00000000000000# Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. push( @includes, qw( %T/platforms/telosa %T/platforms/telosa/chips/cc2420 %T/platforms/telosa/chips/s1087 %T/platforms/telosa/chips/s10871 %T/platforms/telosa/chips/sht11 %T/platforms/telosa/chips/at45db %T/chips/cc2420 %T/chips/cc2420/alarm %T/chips/cc2420/control %T/chips/cc2420/csma %T/chips/cc2420/interfaces %T/chips/cc2420/link %T/chips/cc2420/lowpan %T/chips/cc2420/lpl %T/chips/cc2420/packet %T/chips/cc2420/receive %T/chips/cc2420/spi %T/chips/cc2420/transmit %T/chips/cc2420/unique %T/chips/at45db %T/chips/msp430 %T/chips/msp430/adc12 %T/chips/msp430/pins %T/chips/msp430/timer %T/chips/msp430/usart %T/chips/msp430/sensors %T/chips/sht11 %T/lib/timer %T/lib/serial %T/lib/adc %T/lib/power ) ); @opts = qw( -gcc=msp430-gcc -mmcu=msp430f149 -fnesc-target=msp430 -fnesc-no-debug ); push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{'CIL_MACHINE'} = "version_major=3 " . "version_minor=2 " . "version=msp430-3.2.3 " . "short=2,2 " . "int=2,2 " . "long=4,2 " . "long_long=8,2 " . "pointer=2,2 " . "enum=2,2 " . "float=4,2 " . "double=4,2 " . "long_double=4,2 " . "void=1,1 " . "fun=1,2 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/telosa/ActiveMessageC.nc000066400000000000000000000062421207233610700232350ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.9 2010-06-29 22:07:55 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.9 2010-06-29 22:07:55 scipio Exp $ * */ /** * * The Active Message layer on the Telos platform. This is a naming wrapper * around the CC2420 Active Message layer. * * @author Philip Levis * @version $Revision: 1.9 $ $Date: 2010-06-29 22:07:55 $ */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface LowPowerListening; } } implementation { components CC2420ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; LowPowerListening = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/platforms/telosa/DemoSensorC.nc000066400000000000000000000044241207233610700225730ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorC on the telosb platform provides a * voltage reading, using VoltageC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.5 $ $Date: 2006-12-13 01:22:36 $ * */ generic configuration DemoSensorC() { provides interface Read; } implementation { components new VoltageC() as DemoSensor; Read = DemoSensor; } tinyos-2.1.2+dfsg/tos/platforms/telosa/DemoSensorNowC.nc000066400000000000000000000046341207233610700232620ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorNowC is a generic sensor device that provides a 16-bit * value that can be read from async context. The platform author * chooses which sensor actually sits behind DemoSensorNowC, and * though it's probably Voltage, Light, or Temperature, there are no * guarantees. * * This particular DemoSensorNowC on the telosb platform provides a * voltage reading, using VoltageC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.2 $ $Date: 2006-12-13 01:22:36 $ * */ generic configuration DemoSensorNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new Msp430InternalVoltageC() as DemoSensorNow; Resource = DemoSensorNow; ReadNow = DemoSensorNow; } tinyos-2.1.2+dfsg/tos/platforms/telosa/DemoSensorStreamC.nc000066400000000000000000000045041207233610700237460ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorStreamC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorStreamC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorStreamC on the telosb platform provides a * voltage reading, using VoltageStreamC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.2 $ $Date: 2006-12-13 01:22:36 $ * */ generic configuration DemoSensorStreamC() { provides interface ReadStream; } implementation { components new VoltageStreamC() as DemoSensor; ReadStream = DemoSensor; } tinyos-2.1.2+dfsg/tos/platforms/telosa/Ieee154MessageC.nc000066400000000000000000000044731207233610700231270ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved." * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * * @author Stephen Dawson-Haggerty */ configuration Ieee154MessageC { provides { interface SplitControl; interface Resource as SendResource[uint8_t clientId]; interface Ieee154Send; interface Receive as Ieee154Receive; interface Ieee154Packet; interface Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; interface LowPowerListening; interface PacketLink; } } implementation { components CC2420Ieee154MessageC as Msg; SplitControl = Msg; SendResource = Msg; Ieee154Send = Msg; Ieee154Receive = Msg; Ieee154Packet = Msg; Packet = Msg; PacketAcknowledgements = Msg; LinkPacketMetadata = Msg; LowPowerListening = Msg; PacketLink = Msg; } tinyos-2.1.2+dfsg/tos/platforms/telosa/MSP430ADC12ChannelConfigM.nc000066400000000000000000000006771207233610700245150ustar00rootroot00000000000000module MSP430ADC12ChannelConfigM { uses interface MSP430ADC12ChannelConfig; } implementation { async event msp430adc12_channel_config_t MSP430ADC12ChannelConfig.getConfigurationData(uint8_t channel) { msp430adc12_channel_config_t config = { channel, REFERENCE_AVcc_AVss, REFVOLT_LEVEL_1_5, SHT_SOURCE_SMCLK, SHT_CLOCK_DIV_1, SAMPLE_HOLD_4_CYCLES, SAMPCON_SOURCE_SMCLK, SAMPCON_CLOCK_DIV_1 }; return config; } } tinyos-2.1.2+dfsg/tos/platforms/telosa/MoteClockC.nc000066400000000000000000000035501207233610700223740ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: MoteClockC.nc,v 1.1 2007-07-10 00:24:31 vlahan Exp $ * */ /** * @author Vlado Handziski */ configuration MoteClockC { provides interface Init as MoteClockInit; } implementation { components Msp430ClockC; MoteClockInit = Msp430ClockC.Init; } tinyos-2.1.2+dfsg/tos/platforms/telosa/MotePlatformC.nc000066400000000000000000000026301207233610700231230ustar00rootroot00000000000000module MotePlatformC { provides interface Init; } implementation { command error_t Init.init() { //LEDS TOSH_SET_RED_LED_PIN(); TOSH_SET_GREEN_LED_PIN(); TOSH_SET_YELLOW_LED_PIN(); TOSH_MAKE_RED_LED_OUTPUT(); TOSH_MAKE_GREEN_LED_OUTPUT(); TOSH_MAKE_YELLOW_LED_OUTPUT(); //RADIO PINS //CC2420 pins TOSH_MAKE_SOMI0_INPUT(); TOSH_MAKE_SIMO0_INPUT(); TOSH_MAKE_UCLK0_INPUT(); TOSH_MAKE_SOMI1_INPUT(); TOSH_MAKE_SIMO1_INPUT(); TOSH_MAKE_UCLK1_INPUT(); TOSH_SET_RADIO_RESET_PIN(); TOSH_MAKE_RADIO_RESET_OUTPUT(); TOSH_CLR_RADIO_VREF_PIN(); TOSH_MAKE_RADIO_VREF_OUTPUT(); TOSH_SET_RADIO_CSN_PIN(); TOSH_MAKE_RADIO_CSN_OUTPUT(); TOSH_MAKE_RADIO_FIFOP_INPUT(); TOSH_MAKE_RADIO_GIO0_INPUT(); TOSH_MAKE_RADIO_SFD_INPUT(); TOSH_MAKE_RADIO_GIO1_INPUT(); //UART PINS TOSH_MAKE_UTXD0_INPUT(); TOSH_MAKE_URXD0_INPUT(); TOSH_MAKE_UTXD1_INPUT(); TOSH_MAKE_URXD1_INPUT(); //PROG PINS TOSH_MAKE_PROG_RX_INPUT(); TOSH_MAKE_PROG_TX_INPUT(); //FLASH PINS TOSH_MAKE_FLASH_PWR_OUTPUT(); TOSH_SET_FLASH_PWR_PIN(); TOSH_MAKE_FLASH_CS_OUTPUT(); TOSH_SET_FLASH_CS_PIN(); //HUMIDITY PINS TOSH_MAKE_HUM_SCL_OUTPUT(); TOSH_MAKE_HUM_SDA_OUTPUT(); TOSH_MAKE_HUM_PWR_OUTPUT(); TOSH_CLR_HUM_SCL_PIN(); TOSH_CLR_HUM_SDA_PIN(); TOSH_CLR_HUM_PWR_PIN(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/telosa/Msp430Timer32khzMapC.nc000066400000000000000000000065341207233610700240300ustar00rootroot00000000000000//$Id: Msp430Timer32khzMapC.nc,v 1.5 2010-06-29 22:07:55 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * MSP430Timer32khzMapC presents as paramaterized interfaces all of * the 32khz hardware timers on the MSP430 that are available for * compile time allocation by "new Alarm32khz16C()", "new * AlarmMilli32C()", and so on. * * Platforms based on the MSP430 are * encouraged to copy in and * override this file, presenting only the * hardware timers that are * available for allocation on that platform. * * @author Cory Sharp * @version $Revision: 1.5 $ $Date: 2010-06-29 22:07:55 $ */ configuration Msp430Timer32khzMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; Msp430Timer[0] = Msp430TimerC.TimerB; Msp430TimerControl[0] = Msp430TimerC.ControlB0; Msp430Compare[0] = Msp430TimerC.CompareB0; // Timer pin B1 is used by the CC2420 radio's SFD pin // this is the only difference between the default 32khz map // and the map on telos Msp430Timer[1] = Msp430TimerC.TimerB; Msp430TimerControl[1] = Msp430TimerC.ControlB2; Msp430Compare[1] = Msp430TimerC.CompareB2; Msp430Timer[2] = Msp430TimerC.TimerB; Msp430TimerControl[2] = Msp430TimerC.ControlB3; Msp430Compare[2] = Msp430TimerC.CompareB3; Msp430Timer[3] = Msp430TimerC.TimerB; Msp430TimerControl[3] = Msp430TimerC.ControlB4; Msp430Compare[3] = Msp430TimerC.CompareB4; Msp430Timer[4] = Msp430TimerC.TimerB; Msp430TimerControl[4] = Msp430TimerC.ControlB5; Msp430Compare[4] = Msp430TimerC.CompareB5; Msp430Timer[5] = Msp430TimerC.TimerB; Msp430TimerControl[5] = Msp430TimerC.ControlB6; Msp430Compare[5] = Msp430TimerC.CompareB6; } tinyos-2.1.2+dfsg/tos/platforms/telosa/PlatformC.nc000066400000000000000000000037621207233610700223050ustar00rootroot00000000000000// $Id: PlatformC.nc,v 1.6 2010-06-29 22:07:55 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre and Cory Sharp * @version $Revision: 1.6 $ $Date: 2010-06-29 22:07:55 $ */ #include "hardware.h" configuration PlatformC { provides interface Init; } implementation { components PlatformP, MotePlatformC, MoteClockC; Init = PlatformP; PlatformP.MoteClockInit -> MoteClockC; PlatformP.MoteInit -> MotePlatformC; } tinyos-2.1.2+dfsg/tos/platforms/telosa/PlatformHdlcUartC.nc000066400000000000000000000044771207233610700237400ustar00rootroot00000000000000/* Copyright (c) 2011 University of California, Berkeley * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** */ configuration PlatformHdlcUartC { provides { interface StdControl; interface HdlcUart; } } implementation { #warning Enabling DMA on UART1RX components NoLedsC as Leds; components PlatformHdlcUartP as HdlcUartC; components TelosSerialP; StdControl = HdlcUartC; HdlcUart = HdlcUartC; components new Msp430Usart1C() as UsartC; HdlcUartC.UsartResource -> UsartC; UsartC.ResourceConfigure -> HdlcUartC.ResourceConfigure; HdlcUartC.Usart -> UsartC; HdlcUartC.UsartInterrupts -> UsartC; HdlcUartC.Msp430UartConfigure -> TelosSerialP; components Msp430DmaC as DmaC; HdlcUartC.DmaChannel -> DmaC.Channel2; components new Alarm32khz16C(); HdlcUartC.RxAbort -> Alarm32khz16C; HdlcUartC.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/platforms/telosa/PlatformHdlcUartP.nc000066400000000000000000000173631207233610700237530ustar00rootroot00000000000000/* Copyright (c) 2011 University of California, Berkeley * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /* * Improved DMA UART implementation for MSP-base platforms to fix some * of the timing issues. Based on my earlier implementation, but * moved to Peter Bigot's new layer so we can coexist with other * serial port users. * * Instead of needing to service each UART interrupt as they occur, we * set up a continuous DMA transfer into a ring buffer; and an alarm * which periodically checks the progress of the transfer and delivers * data if new bytes have come in. This results in significantly * looser timing requirements. * * The size of the buffer controls how much freedom you have, timing * wise; you can set this at compile time with * PLATFORM_SERIAL_RX_BUFFER_SIZE * * @author Stephen Dawson-Haggerty */ #include #include module PlatformHdlcUartP { provides { interface StdControl; interface HdlcUart; interface ResourceConfigure; } uses { interface Resource as UsartResource; interface Msp430UartConfigure; interface HplMsp430Usart as Usart; interface HplMsp430UsartInterrupts as UsartInterrupts; interface Msp430DmaChannel as DmaChannel; interface Alarm as RxAbort; interface Leds; } } implementation { norace uint16_t m_tx_len; norace uint8_t * COUNT_NOK(m_tx_len) m_tx_buf, * COUNT_NOK(sizeof(__rx_buf)) m_rx_buf; norace uint16_t m_tx_pos; norace uint8_t m_byte_time; #ifndef PLATFORM_SERIAL_RX_BUFFER_SIZE /* at 115200 baud, this is about 9ms of buffer * * therefore, that is the longest we can get delayed by other * tasks without dropping * bytes. */ #define PLATFORM_SERIAL_RX_BUFFER_SIZE 64 #endif uint8_t __rx_buf[PLATFORM_SERIAL_RX_BUFFER_SIZE]; bool m_rx_enabled; norace uint8_t *m_rx_delivery_start, *m_rx_delivery_stop; enum { // this is essentially how often the alarm fires, as a fraction of // the buffer. For instance, at the default of three, the // delivery check should run every time the buffer would have // filled by a third if we were receiving the whole time. BUFFER_TIMEOUT_BYTES = 8, }; command error_t StdControl.start() { call Leds.led1Toggle(); return call UsartResource.request(); } command error_t StdControl.stop() { call UsartResource.release(); call RxAbort.stop(); return SUCCESS; } async command void ResourceConfigure.configure() { msp430_uart_union_config_t* config = call Msp430UartConfigure.getConfig(); call Leds.led0On(); m_byte_time = (config->uartConfig.ubr / 4); // SDH : assume 4MHZ... call Usart.setModeUart(config); call Usart.enableIntr(); } async command void ResourceConfigure.unconfigure() { call RxAbort.stop(); call DmaChannel.stopTransfer(); call Usart.resetUsart(TRUE); call Usart.disableIntr(); call Usart.disableUart(); /* leave the usart in reset */ //call Usart.resetUsart(FALSE); // this shouldn't be called. } /* * Receive side * * Incoming bytes are placed into the buffer by the DMA processor, * and delivered asynchronously by the receive task, which is * started from an alarm, and from the dma interrupt if present. * There is still the possiblity for buffer underruns if the receive * handler delays too long or the alarm cannot run. */ task void deliverTask() { /* deliver to the stop point, or the end of the buffer */ while (m_rx_delivery_start != m_rx_delivery_stop) { signal HdlcUart.receivedByte(*(m_rx_delivery_start++)); if (m_rx_delivery_start == m_rx_buf + sizeof(__rx_buf)) m_rx_delivery_start = m_rx_buf; } } event void UsartResource.granted() { atomic { if ( m_rx_buf ) return; m_rx_buf = __rx_buf; /* SDH : important : the dma transfer won't occur if the interrupt is enabled */ call Usart.clrRxIntr(); call Usart.disableRxIntr(); call DmaChannel.setupTransfer(DMA_REPEATED_SINGLE_TRANSFER, DMA_TRIGGER_URXIFG1, DMA_EDGE_SENSITIVE, (void *)U1RXBUF_, (void *)m_rx_buf, sizeof(__rx_buf), DMA_BYTE, DMA_BYTE, DMA_ADDRESS_UNCHANGED, DMA_ADDRESS_INCREMENTED); call DmaChannel.startTransfer(); /* start the timeout */ /* this will be fired when the buffer is about a third full so we can deliver the first half... */ m_rx_delivery_stop = m_rx_delivery_start = m_rx_buf; call RxAbort.startAt(call RxAbort.getNow(), m_byte_time * BUFFER_TIMEOUT_BYTES); } } async event void UsartInterrupts.rxDone( uint8_t data ) { /* if there were a buffer, we would have recieved it on the dma channel ... */ // this should never happen since we're using DMA... signal HdlcUart.receivedByte(data); } async event void RxAbort.fired() { /* time out and deliver */ m_rx_delivery_stop = m_rx_buf + sizeof(__rx_buf) - DMA2SZ; if (m_rx_delivery_stop != m_rx_delivery_start) post deliverTask(); call RxAbort.startAt(call RxAbort.getNow(), m_byte_time * BUFFER_TIMEOUT_BYTES); } async event void DmaChannel.transferDone(error_t success) { } /* * Send side. no dma here, just send it out. * * We could do dma in the future, but it ties up another controller, * and the timing requirements on the pc side tend to be pretty * relaxed so it doesn't really matter if we get delayed while this * is going out. */ command error_t HdlcUart.send( uint8_t* buf, uint16_t len ) { if ( len == 0 ) return FAIL; else if ( m_tx_buf ) return EBUSY; m_tx_buf = buf; m_tx_len = len; m_tx_pos = 0; call Usart.tx( buf[ m_tx_pos++ ] ); return SUCCESS; } async event void UsartInterrupts.txDone() { if (m_tx_buf == NULL) return; if ( m_tx_pos < m_tx_len ) { call Usart.tx( m_tx_buf[ m_tx_pos++ ] ); } else { m_tx_buf = NULL; signal HdlcUart.sendDone(SUCCESS); } } } tinyos-2.1.2+dfsg/tos/platforms/telosa/PlatformLed.h000066400000000000000000000042111207233610700224440ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _PLATFORM_TMOTE_LED_H_ #define _PLATFORM_TMOTE_LED_H_ /** Constants used in the generic LedC module to determine how many * named Led interfaces should be published. The value should match * the size of the table in PlatformLedsP, but we're not going to * guess that table's public name. */ #define PLATFORM_LED_COUNT 3 /** Map to the LED index for the red LED */ #define PLATFORM_LED_RED 0 /** Map to the LED index for the green LED */ #define PLATFORM_LED_GREEN 1 /** Map to the LED index for the blue LED */ #define PLATFORM_LED_BLUE 2 #endif // _PLATFORM_TMOTE_LED_H_ tinyos-2.1.2+dfsg/tos/platforms/telosa/PlatformLedC.nc000066400000000000000000000037151207233610700227300ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Defines the Led and MultiLed interfaces in terms of the underlying * LedsC component. * * @author Peter A. Bigot */ configuration PlatformLedC { provides { interface MultiLed; interface Led[uint8_t led_id]; } } implementation { components LedsC; components PlatformLedP; MultiLed = PlatformLedP; Led = PlatformLedP; PlatformLedP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/telosa/PlatformLedP.nc000066400000000000000000000062401207233610700227410ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Defines the Led and MultiLed interfaces in terms of the underlying * LedsC component. * * @author Peter A. Bigot */ module PlatformLedP { provides { interface MultiLed; interface Led[uint8_t led_id]; } uses { interface Leds; } } implementation { async command void Led.on[ uint8_t led_id ] () { switch(led_id) { case 0: call Leds.led0On(); break; case 1: call Leds.led1On(); break; case 2: call Leds.led2On(); break; } } async command void Led.off[ uint8_t led_id ] () { switch(led_id) { case 0: call Leds.led0Off(); break; case 1: call Leds.led1Off(); break; case 2: call Leds.led2Off(); break; } } async command void Led.set[ uint8_t led_id ] (bool turn_on) { if (turn_on) { call Led.on[led_id](); } else { call Led.off[led_id](); } } async command void Led.toggle[ uint8_t led_id ] () { switch(led_id) { case 0: call Leds.led0Toggle(); break; case 1: call Leds.led1Toggle(); break; case 2: call Leds.led2Toggle(); break; } } async command unsigned int MultiLed.get () { return call Leds.get(); } async command void MultiLed.set (unsigned int val) { call Leds.set(val); } async command void MultiLed.on (unsigned int led_id) { call Led.on[led_id](); } async command void MultiLed.off (unsigned int led_id) { call Led.off[led_id](); } async command void MultiLed.setSingle (unsigned int led_id, bool turn_on) { call Led.set[led_id](turn_on); } async command void MultiLed.toggle (unsigned int led_id) { call Led.toggle[led_id](); } } tinyos-2.1.2+dfsg/tos/platforms/telosa/PlatformLedsC.nc000066400000000000000000000045051207233610700231110ustar00rootroot00000000000000// $Id: PlatformLedsC.nc,v 1.5 2010-06-29 22:07:55 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre * @version $Revision: 1.5 $ $Date: 2010-06-29 22:07:55 $ */ #include "hardware.h" configuration PlatformLedsC { provides interface GeneralIO as Led0; provides interface GeneralIO as Led1; provides interface GeneralIO as Led2; uses interface Init; } implementation { components HplMsp430GeneralIOC as GeneralIOC , new Msp430GpioC() as Led0Impl , new Msp430GpioC() as Led1Impl , new Msp430GpioC() as Led2Impl ; components PlatformP; Init = PlatformP.LedsInit; Led0 = Led0Impl; Led0Impl -> GeneralIOC.Port54; Led1 = Led1Impl; Led1Impl -> GeneralIOC.Port55; Led2 = Led2Impl; Led2Impl -> GeneralIOC.Port56; } tinyos-2.1.2+dfsg/tos/platforms/telosa/PlatformP.nc000066400000000000000000000006701207233610700223150ustar00rootroot00000000000000#include "hardware.h" module PlatformP @safe() { provides interface Init; uses interface Init as MoteClockInit; uses interface Init as MoteInit; uses interface Init as LedsInit; } implementation { command error_t Init.init() { WDTCTL = WDTPW + WDTHOLD; call MoteClockInit.init(); call MoteInit.init(); call LedsInit.init(); return SUCCESS; } default command error_t LedsInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/telosa/PlatformSerialC.nc000066400000000000000000000006411207233610700234360ustar00rootroot00000000000000 configuration PlatformSerialC { provides interface StdControl; provides interface UartStream; provides interface UartByte; } implementation { components new Msp430Uart1C() as UartC; UartStream = UartC; UartByte = UartC; components TelosSerialP; StdControl = TelosSerialP; TelosSerialP.Msp430UartConfigure <- UartC.Msp430UartConfigure; TelosSerialP.Resource -> UartC.Resource; } tinyos-2.1.2+dfsg/tos/platforms/telosa/TelosSerialP.nc000066400000000000000000000013171207233610700227560ustar00rootroot00000000000000module TelosSerialP { provides interface StdControl; provides interface Msp430UartConfigure; uses interface Resource; } implementation { msp430_uart_union_config_t msp430_uart_telos_config = { {ubr: UBR_1MHZ_115200, umctl: UMCTL_1MHZ_115200, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0, utxe : 1, urxe : 1} }; command error_t StdControl.start(){ return call Resource.immediateRequest(); } command error_t StdControl.stop(){ call Resource.release(); return SUCCESS; } event void Resource.granted(){} async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig() { return &msp430_uart_telos_config; } } tinyos-2.1.2+dfsg/tos/platforms/telosa/TimeSyncMessageC.nc000066400000000000000000000067651207233610700235670ustar00rootroot00000000000000// $Id: TimeSyncMessageC.nc,v 1.3 2010-06-29 22:07:55 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * The Active Message layer on the telosa platform. This is a naming wrapper * around the CC2420 Active Message layer that implemets timesync interface (TEP 133). * * @author Philip Levis * @author Brano Kusy * @date June 19 2005 */ configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSend32khz[am_id_t id]; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { #ifdef RFXLINK components CC2420XTimeSyncMessageC as AM; #else components CC2420TimeSyncMessageC as AM; #endif SplitControl = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; LowPowerListening = AM; TimeSyncAMSend32khz = AM; TimeSyncAMSendMilli = AM; TimeSyncPacket32khz = AM; TimeSyncPacketMilli = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; }tinyos-2.1.2+dfsg/tos/platforms/telosa/VoltageC.nc000066400000000000000000000040521207233610700221130ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * VoltageC is a common name for the Msp430InternalVoltageC voltage * sensor available on the telosb platform. * * To convert from ADC counts to actual voltage, divide by 4096 and * multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.2 $ $Date: 2006-12-13 01:22:36 $ */ generic configuration VoltageC() { provides interface Read; } implementation { components new Msp430InternalVoltageC(); Read = Msp430InternalVoltageC.Read; } tinyos-2.1.2+dfsg/tos/platforms/telosa/VoltageStreamC.nc000066400000000000000000000041021207233610700232630ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * VoltageC is a common name for the Msp430InternalVoltageC voltage * sensor available on the telosb platform. * * To convert from ADC counts to actual voltage, divide by 4096 and * multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.2 $ $Date: 2006-12-13 01:22:36 $ */ generic configuration VoltageStreamC() { provides interface ReadStream; } implementation { components new Msp430InternalVoltageC(); ReadStream = Msp430InternalVoltageC.ReadStream; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/000077500000000000000000000000001207233610700211725ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/at45db/000077500000000000000000000000001207233610700222555ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/at45db/HplAt45dbC.nc000066400000000000000000000037671207233610700244060ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ configuration HplAt45dbC { provides interface HplAt45db; } implementation { components new HplAt45dbByteC(9), new Msp430Spi0C() as Spi, HplAt45dbP, HplMsp430GeneralIOC as MspGeneralIO, new Msp430GpioC() as Select; HplAt45db = HplAt45dbByteC; HplAt45dbByteC.Resource -> Spi; HplAt45dbByteC.FlashSpi -> Spi; HplAt45dbByteC.HplAt45dbByte -> HplAt45dbP; Select -> MspGeneralIO.Port44; HplAt45dbP.Select -> Select; HplAt45dbP.FlashSpi -> Spi; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/at45db/HplAt45dbP.nc000066400000000000000000000043541207233610700244140ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ module HplAt45dbP { provides { interface HplAt45dbByte; } uses { interface SpiByte as FlashSpi; interface GeneralIO as Select; } } implementation { command void HplAt45dbByte.select() { call Select.clr(); } command void HplAt45dbByte.deselect() { call Select.set(); } task void idleTask() { uint8_t status; status = call FlashSpi.write(0); if (!(status & 0x80)) { post idleTask(); } else { signal HplAt45dbByte.idle(); } } command void HplAt45dbByte.waitIdle() { post idleTask(); } command bool HplAt45dbByte.getCompareStatus() { uint8_t status; status = call FlashSpi.write(0); return (!(status & 0x40)); } } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/at45db/HplAt45db_chip.h000066400000000000000000000045011207233610700251200ustar00rootroot00000000000000// $Id: HplAt45db_chip.h,v 1.4 2010-06-29 22:07:55 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef HPLAT45DB_CHIP_H #define HPLAT45DB_CHIP_H // flash characteristics enum { AT45_MAX_PAGES = 2048, AT45_PAGE_SIZE = 264, AT45_PAGE_SIZE_LOG2 = 8 // For those who want to ignore the last 8 bytes }; typedef uint16_t at45page_t; typedef uint16_t at45pageoffset_t; /* must fit 0 to AT45_PAGE_SIZE - 1 */ #endif tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420/000077500000000000000000000000001207233610700220675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420/HplCC2420AlarmC.nc000066400000000000000000000040231207233610700247310ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of 32khz alarms for the ChipCon CC2420 radio * connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:44 $ */ generic configuration HplCC2420AlarmC() { provides interface Init; provides interface Alarm as Alarm32khz32; } implementation { components new Alarm32khz32C(); Init = Alarm32khz32C; Alarm32khz32 = Alarm32khz32C; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420/HplCC2420InterruptsC.nc000066400000000000000000000052421207233610700260600ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of interrupts and captures for the ChipCon * CC2420 radio connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:44 $ */ configuration HplCC2420InterruptsC { provides interface GpioCapture as CaptureSFD; provides interface GpioInterrupt as InterruptCCA; provides interface GpioInterrupt as InterruptFIFOP; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components Msp430TimerC; components new GpioCaptureC() as CaptureSFDC; CaptureSFDC.Msp430TimerControl -> Msp430TimerC.ControlB1; CaptureSFDC.Msp430Capture -> Msp430TimerC.CaptureB1; CaptureSFDC.GeneralIO -> GeneralIOC.Port41; components HplMsp430InterruptC; components new Msp430InterruptC() as InterruptCCAC; components new Msp430InterruptC() as InterruptFIFOPC; InterruptCCAC.HplInterrupt -> HplMsp430InterruptC.Port14; InterruptFIFOPC.HplInterrupt -> HplMsp430InterruptC.Port10; CaptureSFD = CaptureSFDC.Capture; InterruptCCA = InterruptCCAC.Interrupt; InterruptFIFOP = InterruptFIFOPC.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420/HplCC2420PinsC.nc000066400000000000000000000053761207233610700246220ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of general-purpose I/O for the ChipCon CC2420 * radio connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:44 $ */ configuration HplCC2420PinsC { provides interface GeneralIO as CCA; provides interface GeneralIO as CSN; provides interface GeneralIO as FIFO; provides interface GeneralIO as FIFOP; provides interface GeneralIO as RSTN; provides interface GeneralIO as SFD; provides interface GeneralIO as VREN; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> GeneralIOC.Port14; CSNM -> GeneralIOC.Port42; FIFOM -> GeneralIOC.Port13; FIFOPM -> GeneralIOC.Port10; RSTNM -> GeneralIOC.Port46; SFDM -> GeneralIOC.Port41; VRENM -> GeneralIOC.Port45; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420/HplCC2420SpiC.nc000066400000000000000000000040431207233610700244320ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of the SPI bus for the ChipCon CC2420 radio * connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:44 $ */ generic configuration HplCC2420SpiC() { provides interface Resource; provides interface SpiByte; provides interface SpiPacket; } implementation { components new Msp430Spi0C() as SpiC; Resource = SpiC; SpiByte = SpiC; SpiPacket = SpiC; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/000077500000000000000000000000001207233610700222575ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/Msp430ClockP.nc000066400000000000000000000153321207233610700246670ustar00rootroot00000000000000//$Id: Msp430ClockP.nc,v 1.9 2010-06-29 22:07:45 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp * @author Vlado Handziski * @author Janos Sallai */ /** This file programs the msp430 time subsystem such that SMCLK=DCO, and TimerA=SMCLK/4. This allows for faster peripheral access, since I/O subsystem is clocked from SMCKL. */ #include #include module Msp430ClockP @safe() { provides interface Init; provides interface Msp430ClockInit; provides interface McuPowerOverride; } implementation { MSP430REG_NORACE(IE1); MSP430REG_NORACE(TACTL); MSP430REG_NORACE(TAIV); MSP430REG_NORACE(TBCTL); MSP430REG_NORACE(TBIV); enum { ACLK_CALIB_PERIOD = 8, TARGET_DCO_DELTA = (TARGET_DCO_KHZ / ACLK_KHZ) * ACLK_CALIB_PERIOD, }; async command mcu_power_t McuPowerOverride.lowestState() { return MSP430_POWER_LPM3; } command void Msp430ClockInit.defaultSetupDcoCalibrate() { // --- setup --- TACTL = TASSEL1 | MC1; // source SMCLK, continuous mode, everything else 0 TBCTL = TBSSEL0 | MC1; BCSCTL1 = XT2OFF | RSEL2; BCSCTL2 = 0; TBCCTL0 = CM0; } command void Msp430ClockInit.defaultInitClocks() { // BCSCTL1 // .XT2OFF = 1; disable the external oscillator for SCLK and MCLK // .XTS = 0; set low frequency mode for LXFT1 // .DIVA = 0; set the divisor on ACLK to 1 // .RSEL, do not modify BCSCTL1 = XT2OFF | (BCSCTL1 & (RSEL2|RSEL1|RSEL0)); // BCSCTL2 // .SELM = 0; select DCOCLK as source for MCLK // .DIVM = 0; set the divisor of MCLK to 1 // .SELS = 0; select DCOCLK as source for SCLK // .DIVS = 0; set the divisor of SCLK to 1 // .DCOR = 0; select internal resistor for DCO BCSCTL2 = 0; // IE1.OFIE = 0; no interrupt for oscillator fault CLR_FLAG( IE1, OFIE ); } command void Msp430ClockInit.defaultInitTimerA() { TAR = 0; // TACTL // .TACLGRP = 0; each TACL group latched independently // .CNTL = 0; 16-bit counter // .TASSEL = 2; source SMCLK = DCO // .ID = 2; input divisor of 4 // .MC = 0; initially disabled // .TACLR = 0; reset timer A // .TAIE = 1; enable timer A interrupts TACTL = TASSEL1 | ID1 | TAIE; } command void Msp430ClockInit.defaultInitTimerB() { TBR = 0; // TBCTL // .TBCLGRP = 0; each TBCL group latched independently // .CNTL = 0; 16-bit counter // .TBSSEL = 1; source ACLK // .ID = 0; input divisor of 1 // .MC = 0; initially disabled // .TBCLR = 0; reset timer B // .TBIE = 1; enable timer B interrupts TBCTL = TBSSEL0 | TBIE; } default event void Msp430ClockInit.setupDcoCalibrate() { call Msp430ClockInit.defaultSetupDcoCalibrate(); } default event void Msp430ClockInit.initClocks() { call Msp430ClockInit.defaultInitClocks(); } default event void Msp430ClockInit.initTimerA() { call Msp430ClockInit.defaultInitTimerA(); } default event void Msp430ClockInit.initTimerB() { call Msp430ClockInit.defaultInitTimerB(); } void startTimerA() { // TACTL.MC = 2; continuous mode TACTL = MC1 | (TACTL & ~(MC1|MC0)); } void stopTimerA() { //TACTL.MC = 0; stop timer B TACTL = TACTL & ~(MC1|MC0); } void startTimerB() { // TBCTL.MC = 2; continuous mode TBCTL = MC1 | (TBCTL & ~(MC1|MC0)); } void stopTimerB() { //TBCTL.MC = 0; stop timer B TBCTL = TBCTL & ~(MC1|MC0); } void set_dco_calib( int calib ) { BCSCTL1 = (BCSCTL1 & ~0x07) | ((calib >> 8) & 0x07); DCOCTL = calib & 0xff; } uint16_t test_calib_busywait_delta( int calib ) { int8_t aclk_count = 2; uint16_t dco_prev = 0; uint16_t dco_curr = 0; set_dco_calib( calib ); while( aclk_count-- > 0 ) { TBCCR0 = TBR + ACLK_CALIB_PERIOD; // set next interrupt TBCCTL0 &= ~CCIFG; // clear pending interrupt while( (TBCCTL0 & CCIFG) == 0 ); // busy wait dco_prev = dco_curr; dco_curr = TAR; } return dco_curr - dco_prev; } // busyCalibrateDCO // Should take about 9ms if ACLK_CALIB_PERIOD=8. // DCOCTL and BCSCTL1 are calibrated when done. void busyCalibrateDco() { // --- variables --- int calib; int step; // --- calibrate --- // Binary search for RSEL,DCO,DCOMOD. // It's okay that RSEL isn't monotonic. for( calib=0,step=0x800; step!=0; step>>=1 ) { // if the step is not past the target, commit it if( test_calib_busywait_delta(calib|step) <= TARGET_DCO_DELTA ) calib |= step; } // if DCOx is 7 (0x0e0 in calib), then the 5-bit MODx is not useable, set it to 0 if( (calib & 0x0e0) == 0x0e0 ) calib &= ~0x01f; set_dco_calib( calib ); } command error_t Init.init() { // Reset timers and clear interrupt vectors TACTL = TACLR; TAIV = 0; TBCTL = TBCLR; TBIV = 0; atomic { signal Msp430ClockInit.setupDcoCalibrate(); busyCalibrateDco(); signal Msp430ClockInit.initClocks(); signal Msp430ClockInit.initTimerA(); signal Msp430ClockInit.initTimerB(); startTimerA(); startTimerB(); } return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/README.txt000066400000000000000000000023111207233610700237520ustar00rootroot00000000000000CC2420X is an alternative radio stack for the TI CC2420 radio, using the rfxlink library (lib/rfxlink). The stack is IEEE802.15.4 compliant. All rfxlink features are supported. See lib/rfxlink/README.txt for details. The stack can be used with microsecond-precision timestamping, as well as with 32khz timestamping. To use this stack with microsecond precision timestamping configuration, compile the application with the cc2420x extra: make telosb cc2420x To use this stack with 32khz precision timestamping configuration, add the following lines to the Makefile: make telosb cc2420x_32khz Remarks: - This stack programs the msp430 clock subsystem differently than the default cc2420 stack. In particular, SMCLK is ticking at 4MHz, which allows for faster peripheral access. - Microsecond precision timestamping requires that TimerB is set to SMCLK/4, therefore TimerA must be configured as the 32khz clock (ACLK). Since TimerA has only three compare registers, this limits the number of physical (that is, unvirtualized) 32kHz alarms in the system. (This is not an issue if 32khz timestamping is used). - 32khz timestamping is not interoperable with other devices (e.g. iris). tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/TelosSerialP.nc000066400000000000000000000043251207233610700251530ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** We need to set the proper USART config values since SMCLK is configured to tick at 4MHz (SMCLK=DCO). */ module TelosSerialP { provides interface StdControl; provides interface Msp430UartConfigure; uses interface Resource; } implementation { enum { // from http://www.daycounter.com/Calculators/MSP430-Uart-Calculator.phtml UBR_4MHZ_4800=0x0369, UMCTL_4MHZ_4800=0xfb, UBR_4MHZ_9600=0x01b4, UMCTL_4MHZ_9600=0xdf, UBR_4MHZ_57600=0x0048, UMCTL_4MHZ_57600=0xfb, UBR_4MHZ_115200=0x0024, UMCTL_4MHZ_115200=0x4a, UBR_3_7MHZ_115200=0x0020, UMCTL_3_7MHZ_115200=0x00, }; msp430_uart_union_config_t msp430_uart_telos_config = { {ubr: UBR_4MHZ_115200, umctl: UBR_4MHZ_115200, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0, utxe : 1, urxe : 1} }; command error_t StdControl.start(){ return call Resource.immediateRequest(); } command error_t StdControl.stop(){ call Resource.release(); return SUCCESS; } event void Resource.granted(){} async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig() { return &msp430_uart_telos_config; } } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/t32khz/000077500000000000000000000000001207233610700234045ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/t32khz/HplCC2420XC.nc000066400000000000000000000055541207233610700254330ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ configuration HplCC2420XC { provides { interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface LocalTime as LocalTimeRadio; interface Init; interface Alarm; } } implementation { components HplMsp430GeneralIOC as IO, new Msp430Spi0C() as SpiC; // pins components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> IO.Port14; CSNM -> IO.Port42; FIFOM -> IO.Port13; FIFOPM -> IO.Port10; RSTNM -> IO.Port46; SFDM -> IO.Port41; VRENM -> IO.Port45; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; // spi SpiResource = SpiC.Resource; FastSpiByte = SpiC; // capture components Msp430TimerC as TimerC; components new GpioCaptureC(); GpioCaptureC.Msp430TimerControl -> TimerC.ControlB1; GpioCaptureC.Msp430Capture -> TimerC.CaptureB1; GpioCaptureC.GeneralIO -> IO.Port41; SfdCapture = GpioCaptureC; components new Msp430InterruptC() as FifopInterruptC, HplMsp430InterruptC; FifopInterruptC.HplInterrupt -> HplMsp430InterruptC.Port10; FifopInterrupt = FifopInterruptC.Interrupt; // alarm components new Alarm32khz16C() as AlarmC; Alarm = AlarmC; Init = AlarmC; // localTime components LocalTime32khzC; LocalTimeRadio = LocalTime32khzC.LocalTime; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/t32khz/RadioConfig.h000066400000000000000000000042611207233610700257440ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #ifndef __RADIOCONFIG_H__ #define __RADIOCONFIG_H__ #include #include //#include /* This is the default value of the PA_POWER field of the TXCTL register. */ #ifndef CC2420X_DEF_RFPOWER #define CC2420X_DEF_RFPOWER 0 #endif /* This is the default value of the CHANNEL field of the FSCTRL register. */ #ifndef CC2420X_DEF_CHANNEL #define CC2420X_DEF_CHANNEL 11 #endif /* The number of microseconds a sending micaz mote will wait for an acknowledgement */ #ifndef SOFTWAREACK_TIMEOUT #define SOFTWAREACK_TIMEOUT 800 #endif /** * This is the timer type of the radio alarm interface */ typedef T32khz TRadio; typedef uint16_t tradio_size; /** * The number of radio alarm ticks per one microsecond (0.9216). * We use integers and no parentheses just to make deputy happy. * Ok, further hacks were required for deputy, I removed 00 from the * beginning and end to be able to handle longer wait periods. */ #define RADIO_ALARM_MICROSEC 1/32 /** * The base two logarithm of the number of radio alarm ticks per one millisecond */ #define RADIO_ALARM_MILLI_EXP 5 #endif//__RADIOCONFIG_H__ tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/t32khz/am/000077500000000000000000000000001207233610700240015ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/t32khz/am/ActiveMessageC.nc000066400000000000000000000040641207233610700271520ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface SendNotifier[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2420XActiveMessageC as MessageC; SplitControl = MessageC; AMSend = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; SendNotifier = MessageC; Packet = MessageC; AMPacket = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketLink = MessageC; RadioChannel = MessageC; PacketTimeStampMilli = MessageC.PacketTimeStampMilli; PacketTimeStamp32khz = MessageC.PacketTimeStampRadio; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/t32khz/am/TimeSyncMessageC.nc000066400000000000000000000041441207233610700274710ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketTimeStamp as PacketTimeStampRadio; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components CC2420XTimeSyncMessageC as MessageC; SplitControl = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; Packet = MessageC; AMPacket = MessageC; PacketTimeStampRadio = MessageC; TimeSyncAMSendRadio = MessageC; TimeSyncPacketRadio = MessageC; PacketTimeStampMilli = MessageC; TimeSyncAMSendMilli = MessageC; TimeSyncPacketMilli = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/tmicro/000077500000000000000000000000001207233610700235545ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/tmicro/HplCC2420XC.nc000066400000000000000000000055541207233610700256030ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ configuration HplCC2420XC { provides { interface Resource as SpiResource; interface FastSpiByte; interface GeneralIO as CCA; interface GeneralIO as CSN; interface GeneralIO as FIFO; interface GeneralIO as FIFOP; interface GeneralIO as RSTN; interface GeneralIO as SFD; interface GeneralIO as VREN; interface GpioCapture as SfdCapture; interface GpioInterrupt as FifopInterrupt; interface LocalTime as LocalTimeRadio; interface Init; interface Alarm; } } implementation { components HplMsp430GeneralIOC as IO, new Msp430Spi0C() as SpiC; // pins components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; CCAM -> IO.Port14; CSNM -> IO.Port42; FIFOM -> IO.Port13; FIFOPM -> IO.Port10; RSTNM -> IO.Port46; SFDM -> IO.Port41; VRENM -> IO.Port45; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; // spi SpiResource = SpiC.Resource; FastSpiByte = SpiC; // capture components Msp430TimerC as TimerC; components new GpioCaptureC(); GpioCaptureC.Msp430TimerControl -> TimerC.ControlB1; GpioCaptureC.Msp430Capture -> TimerC.CaptureB1; GpioCaptureC.GeneralIO -> IO.Port41; SfdCapture = GpioCaptureC; components new Msp430InterruptC() as FifopInterruptC, HplMsp430InterruptC; FifopInterruptC.HplInterrupt -> HplMsp430InterruptC.Port10; FifopInterrupt = FifopInterruptC.Interrupt; // alarm components new AlarmMicro16C() as AlarmC; Alarm = AlarmC; Init = AlarmC; // localTime components LocalTimeMicroC; LocalTimeRadio = LocalTimeMicroC.LocalTime; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/tmicro/McuSleepC.nc000066400000000000000000000114771207233610700257300ustar00rootroot00000000000000/* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Implementation of TEP 112 (Microcontroller Power Management) for * the MSP430. Code for low power calculation copied from older * msp430hardware.h by Vlado Handziski, Joe Polastre, and Cory Sharp. * * * @author Philip Levis * @author Vlado Handziski * @author Joe Polastre * @author Cory Sharp * @author Janos Sallai * @date October 26, 2005 * @see Please refer to TEP 112 for more information about this component and its * intended use. * */ /** We need prevent the MCU from sleeping when the microsecond alarm is set. */ module McuSleepC @safe() { provides { interface McuSleep; interface McuPowerState; } uses { interface McuPowerOverride; } } implementation { bool dirty = TRUE; mcu_power_t powerState = MSP430_POWER_ACTIVE; /* Note that the power values are maintained in an order * based on their active components, NOT on their values.*/ // NOTE: This table should be in progmem. const uint16_t msp430PowerBits[MSP430_POWER_LPM4 + 1] = { 0, // ACTIVE SR_CPUOFF, // LPM0 SR_SCG0+SR_CPUOFF, // LPM1 SR_SCG1+SR_CPUOFF, // LPM2 SR_SCG1+SR_SCG0+SR_CPUOFF, // LPM3 SR_SCG1+SR_SCG0+SR_OSCOFF+SR_CPUOFF, // LPM4 }; mcu_power_t getPowerState() { mcu_power_t pState = MSP430_POWER_LPM4; // TimerA, USART0, USART1 check if ((((TBCCTL0 & CCIE) || (TBCCTL1 & CCIE) || (TBCCTL2 & CCIE)) && ((TBCTL & TASSEL_3) == TASSEL_2)) || ((ME1 & (UTXE0 | URXE0)) && (U0TCTL & SSEL1)) || ((ME2 & (UTXE1 | URXE1)) && (U1TCTL & SSEL1)) #ifdef __msp430_have_usart0_with_i2c // registers end in "nr" to prevent nesC race condition detection || ((U0CTLnr & I2CEN) && (I2CTCTLnr & SSEL1) && (I2CDCTLnr & I2CBUSY) && (U0CTLnr & SYNC) && (U0CTLnr & I2C)) #endif ) pState = MSP430_POWER_LPM1; #ifdef __msp430_have_adc12 // ADC12 check, pre-condition: pState != MSP430_POWER_ACTIVE if (ADC12CTL0 & ADC12ON){ if (ADC12CTL1 & ADC12SSEL_2){ // sample or conversion operation with MCLK or SMCLK if (ADC12CTL1 & ADC12SSEL_1) pState = MSP430_POWER_LPM1; else pState = MSP430_POWER_ACTIVE; } else if ((ADC12CTL1 & SHS0) && ((TACTL & TASSEL_3) == TASSEL_2)){ // Timer A is used as sample-and-hold source and SMCLK sources Timer A // (Timer A interrupts are always disabled when it is used by the // ADC subsystem, that's why the Timer check above is not enough) pState = MSP430_POWER_LPM1; } } #endif return pState; } void computePowerState() { powerState = mcombine(getPowerState(), call McuPowerOverride.lowestState()); } async command void McuSleep.sleep() { uint16_t temp; if (dirty) { computePowerState(); //dirty = 0; } temp = msp430PowerBits[powerState] | SR_GIE; __asm__ __volatile__( "bis %0, r2" : : "m" (temp) ); // All of memory may change at this point... asm volatile ("" : : : "memory"); __nesc_disable_interrupt(); } async command void McuPowerState.update() { atomic dirty = 1; } default async command mcu_power_t McuPowerOverride.lowestState() { return MSP430_POWER_LPM4; } } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/tmicro/Msp430ClockP.nc000066400000000000000000000145141207233610700261650ustar00rootroot00000000000000//$Id: Msp430ClockP.nc,v 1.8 2009/07/07 18:53:40 scipio Exp $ /* "Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /** * @author Cory Sharp * @author Vlado Handziski * @author Janos Sallai */ /** This file programs the msp430 time subsystem such that SMCLK=DCO, TimerA=ACLK, and TimerB=SMCLK/4. This allows for faster peripheral access, since I/O subsystem is clocked from SMCKL. Also, this allows for microsecond-precision capture of the cc2420 SFD. */ #include #include module Msp430ClockP @safe() { provides interface Init; provides interface Msp430ClockInit; provides interface McuPowerOverride; } implementation { MSP430REG_NORACE(IE1); MSP430REG_NORACE(TACTL); MSP430REG_NORACE(TAIV); MSP430REG_NORACE(TBCTL); MSP430REG_NORACE(TBIV); enum { ACLK_CALIB_PERIOD = 8, TARGET_DCO_DELTA = (TARGET_DCO_KHZ / ACLK_KHZ) * ACLK_CALIB_PERIOD }; async command mcu_power_t McuPowerOverride.lowestState() { return MSP430_POWER_LPM3; } command void Msp430ClockInit.defaultSetupDcoCalibrate() { // --- setup --- TACTL = TASSEL0 | MC1; // source ACLK, continuous mode, everything else 0 TBCTL = TBSSEL1 | MC1; // source SMCLK, continuous mode, everything else 0 BCSCTL1 = XT2OFF | RSEL2; BCSCTL2 = 0; TBCCTL0 = CM0; } command void Msp430ClockInit.defaultInitClocks() { // BCSCTL1 // .XT2OFF = 1; disable the external oscillator for SCLK and MCLK // .XTS = 0; set low frequency mode for LXFT1 // .DIVA = 0; set the divisor on ACLK to 1 // .RSEL, do not modify BCSCTL1 = XT2OFF | (BCSCTL1 & (RSEL2|RSEL1|RSEL0)); // BCSCTL2 // .SELM = 0; select DCOCLK as source for MCLK // .DIVM = 0; set the divisor of MCLK to 1 // .SELS = 0; select DCOCLK as source for SCLK // .DIVS = 0; set the divisor of SCLK to 1 // .DCOR = 0; select internal resistor for DCO BCSCTL2 = 0; // IE1.OFIE = 0; no interrupt for oscillator fault CLR_FLAG( IE1, OFIE ); } command void Msp430ClockInit.defaultInitTimerA() { TAR = 0; // TACTL // .TACLGRP = 0; each TACL group latched independently // .CNTL = 0; 16-bit counter // .TASSEL = 1; source ACLK // .ID = 0; input divisor of 1 // .MC = 0; initially disabled // .TACLR = 0; reset timer A // .TAIE = 1; enable timer A interrupts TACTL = TASSEL0 | TAIE; } command void Msp430ClockInit.defaultInitTimerB() { TBR = 0; // TBCTL // .TBCLGRP = 0; each TBCL group latched independently // .CNTL = 0; 16-bit counter // .TBSSEL = 2; source SMCLK // .ID = 2; input divisor of 4 // .MC = 0; initially disabled // .TBCLR = 0; reset timer B // .TBIE = 1; enable timer B interrupts TBCTL = TBSSEL1 | ID1 | TBIE; } default event void Msp430ClockInit.setupDcoCalibrate() { call Msp430ClockInit.defaultSetupDcoCalibrate(); } default event void Msp430ClockInit.initClocks() { call Msp430ClockInit.defaultInitClocks(); } default event void Msp430ClockInit.initTimerA() { call Msp430ClockInit.defaultInitTimerA(); } default event void Msp430ClockInit.initTimerB() { call Msp430ClockInit.defaultInitTimerB(); } void startTimerA() { // TACTL.MC = 2; continuous mode TACTL = MC1 | (TACTL & ~(MC1|MC0)); } void stopTimerA() { //TACTL.MC = 0; stop timer A TACTL = TACTL & ~(MC1|MC0); } void startTimerB() { // TBCTL.MC = 2; continuous mode TBCTL = MC1 | (TBCTL & ~(MC1|MC0)); } void stopTimerB() { //TBCTL.MC = 0; stop timer B TBCTL = TBCTL & ~(MC1|MC0); } void set_dco_calib( int calib ) { BCSCTL1 = (BCSCTL1 & ~0x07) | ((calib >> 8) & 0x07); DCOCTL = calib & 0xff; } uint16_t test_calib_busywait_delta( int calib ) { int8_t aclk_count = 2; uint16_t dco_prev = 0; uint16_t dco_curr = 0; set_dco_calib( calib ); while( aclk_count-- > 0 ) { TACCR0 = TAR + ACLK_CALIB_PERIOD; // set next interrupt TACCTL0 &= ~CCIFG; // clear pending interrupt while( (TACCTL0 & CCIFG) == 0 ); // busy wait dco_prev = dco_curr; dco_curr = TBR; } return dco_curr - dco_prev; } // busyCalibrateDCO // Should take about 9ms if ACLK_CALIB_PERIOD=8. // DCOCTL and BCSCTL1 are calibrated when done. void busyCalibrateDco() { // --- variables --- int calib; int step; // --- calibrate --- // Binary search for RSEL,DCO,DCOMOD. // It's okay that RSEL isn't monotonic. for( calib=0,step=0x800; step!=0; step>>=1 ) { // if the step is not past the target, commit it if( test_calib_busywait_delta(calib|step) <= TARGET_DCO_DELTA ) calib |= step; } // if DCOx is 7 (0x0e0 in calib), then the 5-bit MODx is not useable, set it to 0 if( (calib & 0x0e0) == 0x0e0 ) calib &= ~0x01f; set_dco_calib( calib ); } command error_t Init.init() { // Reset timers and clear interrupt vectors TACTL = TACLR; TAIV = 0; TBCTL = TBCLR; TBIV = 0; atomic { signal Msp430ClockInit.setupDcoCalibrate(); busyCalibrateDco(); signal Msp430ClockInit.initClocks(); signal Msp430ClockInit.initTimerA(); signal Msp430ClockInit.initTimerB(); startTimerA(); startTimerB(); } return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/tmicro/Msp430Counter32khzC.nc000066400000000000000000000053651207233610700274220ustar00rootroot00000000000000 /* "Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** Configure the timer subsystem such that TimerA=ACLK (32kHz) and TimerB=SMCLK/4 (1MHz). */ /** * Msp430Counter32khC provides the standard 32khz counter for the MSP430. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration Msp430Counter32khzC { provides interface Counter as Msp430Counter32khz; } implementation { components Msp430TimerC; components new Msp430CounterC(T32khz) as Counter; Msp430Counter32khz = Counter; Counter.Msp430Timer -> Msp430TimerC.TimerA; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/tmicro/Msp430CounterMicroC.nc000066400000000000000000000054001207233610700275200ustar00rootroot00000000000000 /* "Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** Configure the timer subsystem such that TimerA=ACLK (32kHz) and TimerB=SMCLK/4 (1MHz). */ /** * Msp430Counter32khC provides the standard 32khz counter for the MSP430. * * @author Cory Sharp * @see Please refer to TEP 102 for more information about this component and its * intended use. */ configuration Msp430CounterMicroC { provides interface Counter as Msp430CounterMicro; } implementation { components Msp430TimerC , new Msp430CounterC(TMicro) as Counter ; Msp430CounterMicro = Counter; Counter.Msp430Timer -> Msp430TimerC.TimerB; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/tmicro/Msp430Timer32khzMapC.nc000066400000000000000000000034501207233610700275120ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** Configure the timer subsystem such that TimerA=ACLK (32kHz) and TimerB=SMCLK/4 (1MHz). */ configuration Msp430Timer32khzMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; Msp430Timer[0] = Msp430TimerC.TimerA; Msp430TimerControl[0] = Msp430TimerC.ControlA0; Msp430Compare[0] = Msp430TimerC.CompareA0; Msp430Timer[1] = Msp430TimerC.TimerA; Msp430TimerControl[1] = Msp430TimerC.ControlA1; Msp430Compare[1] = Msp430TimerC.CompareA1; Msp430Timer[2] = Msp430TimerC.TimerA; Msp430TimerControl[2] = Msp430TimerC.ControlA2; Msp430Compare[2] = Msp430TimerC.CompareA2; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/tmicro/Msp430TimerC.nc000066400000000000000000000171651207233610700262020ustar00rootroot00000000000000 /* "Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ /* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** Configure the timer subsystem such that TimerA=ACLK (32kHz) and TimerB=SMCLK/4 (1MHz). */ /** * @author Cory Sharp */ configuration Msp430TimerC { provides interface Msp430Timer as TimerA; provides interface Msp430TimerControl as ControlA0; provides interface Msp430TimerControl as ControlA1; provides interface Msp430TimerControl as ControlA2; provides interface Msp430Compare as CompareA0; provides interface Msp430Compare as CompareA1; provides interface Msp430Compare as CompareA2; provides interface Msp430Capture as CaptureA0; provides interface Msp430Capture as CaptureA1; provides interface Msp430Capture as CaptureA2; provides interface Msp430Timer as TimerB; provides interface Msp430TimerControl as ControlB0; provides interface Msp430TimerControl as ControlB1; provides interface Msp430TimerControl as ControlB2; provides interface Msp430TimerControl as ControlB3; provides interface Msp430TimerControl as ControlB4; provides interface Msp430TimerControl as ControlB5; provides interface Msp430TimerControl as ControlB6; provides interface Msp430Compare as CompareB0; provides interface Msp430Compare as CompareB1; provides interface Msp430Compare as CompareB2; provides interface Msp430Compare as CompareB3; provides interface Msp430Compare as CompareB4; provides interface Msp430Compare as CompareB5; provides interface Msp430Compare as CompareB6; provides interface Msp430Capture as CaptureB0; provides interface Msp430Capture as CaptureB1; provides interface Msp430Capture as CaptureB2; provides interface Msp430Capture as CaptureB3; provides interface Msp430Capture as CaptureB4; provides interface Msp430Capture as CaptureB5; provides interface Msp430Capture as CaptureB6; } implementation { components new Msp430TimerP( TAIV_, TAR_, TACTL_, TAIFG, TACLR, TAIE, TASSEL0, TASSEL1, TRUE ) as Msp430TimerA , new Msp430TimerP( TBIV_, TBR_, TBCTL_, TBIFG, TBCLR, TBIE, TBSSEL0, TBSSEL1, FALSE ) as Msp430TimerB , new Msp430TimerCapComP( TACCTL0_, TACCR0_ ) as Msp430TimerA0 , new Msp430TimerCapComP( TACCTL1_, TACCR1_ ) as Msp430TimerA1 , new Msp430TimerCapComP( TACCTL2_, TACCR2_ ) as Msp430TimerA2 , new Msp430TimerCapComP( TBCCTL0_, TBCCR0_ ) as Msp430TimerB0 , new Msp430TimerCapComP( TBCCTL1_, TBCCR1_ ) as Msp430TimerB1 , new Msp430TimerCapComP( TBCCTL2_, TBCCR2_ ) as Msp430TimerB2 , new Msp430TimerCapComP( TBCCTL3_, TBCCR3_ ) as Msp430TimerB3 , new Msp430TimerCapComP( TBCCTL4_, TBCCR4_ ) as Msp430TimerB4 , new Msp430TimerCapComP( TBCCTL5_, TBCCR5_ ) as Msp430TimerB5 , new Msp430TimerCapComP( TBCCTL6_, TBCCR6_ ) as Msp430TimerB6 , Msp430TimerCommonP as Common // online DCO calibration // , Msp430DcoCalibC, new AutoStartC(); ; // online DCO calibration // Msp430DcoCalibC.StdControl <- AutoStartC; // Timer A TimerA = Msp430TimerA.Timer; Msp430TimerA.Overflow -> Msp430TimerA.Event[5]; Msp430TimerA.VectorTimerX0 -> Common.VectorTimerA0; Msp430TimerA.VectorTimerX1 -> Common.VectorTimerA1; // Timer A0 ControlA0 = Msp430TimerA0.Control; CompareA0 = Msp430TimerA0.Compare; CaptureA0 = Msp430TimerA0.Capture; Msp430TimerA0.Timer -> Msp430TimerA.Timer; Msp430TimerA0.Event -> Msp430TimerA.Event[0]; // Timer A1 ControlA1 = Msp430TimerA1.Control; CompareA1 = Msp430TimerA1.Compare; CaptureA1 = Msp430TimerA1.Capture; Msp430TimerA1.Timer -> Msp430TimerA.Timer; Msp430TimerA1.Event -> Msp430TimerA.Event[1]; // Timer A2 ControlA2 = Msp430TimerA2.Control; CompareA2 = Msp430TimerA2.Compare; CaptureA2 = Msp430TimerA2.Capture; Msp430TimerA2.Timer -> Msp430TimerA.Timer; Msp430TimerA2.Event -> Msp430TimerA.Event[2]; // Timer B TimerB = Msp430TimerB.Timer; Msp430TimerB.Overflow -> Msp430TimerB.Event[7]; Msp430TimerB.VectorTimerX0 -> Common.VectorTimerB0; Msp430TimerB.VectorTimerX1 -> Common.VectorTimerB1; // Timer B0 ControlB0 = Msp430TimerB0.Control; CompareB0 = Msp430TimerB0.Compare; CaptureB0 = Msp430TimerB0.Capture; Msp430TimerB0.Timer -> Msp430TimerB.Timer; Msp430TimerB0.Event -> Msp430TimerB.Event[0]; // Timer B1 ControlB1 = Msp430TimerB1.Control; CompareB1 = Msp430TimerB1.Compare; CaptureB1 = Msp430TimerB1.Capture; Msp430TimerB1.Timer -> Msp430TimerB.Timer; Msp430TimerB1.Event -> Msp430TimerB.Event[1]; // Timer B2 ControlB2 = Msp430TimerB2.Control; CompareB2 = Msp430TimerB2.Compare; CaptureB2 = Msp430TimerB2.Capture; Msp430TimerB2.Timer -> Msp430TimerB.Timer; Msp430TimerB2.Event -> Msp430TimerB.Event[2]; // Timer B3 ControlB3 = Msp430TimerB3.Control; CompareB3 = Msp430TimerB3.Compare; CaptureB3 = Msp430TimerB3.Capture; Msp430TimerB3.Timer -> Msp430TimerB.Timer; Msp430TimerB3.Event -> Msp430TimerB.Event[3]; // Timer B4 ControlB4 = Msp430TimerB4.Control; CompareB4 = Msp430TimerB4.Compare; CaptureB4 = Msp430TimerB4.Capture; Msp430TimerB4.Timer -> Msp430TimerB.Timer; Msp430TimerB4.Event -> Msp430TimerB.Event[4]; // Timer B5 ControlB5 = Msp430TimerB5.Control; CompareB5 = Msp430TimerB5.Compare; CaptureB5 = Msp430TimerB5.Capture; Msp430TimerB5.Timer -> Msp430TimerB.Timer; Msp430TimerB5.Event -> Msp430TimerB.Event[5]; // Timer B6 ControlB6 = Msp430TimerB6.Control; CompareB6 = Msp430TimerB6.Compare; CaptureB6 = Msp430TimerB6.Capture; Msp430TimerB6.Timer -> Msp430TimerB.Timer; Msp430TimerB6.Event -> Msp430TimerB.Event[6]; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/tmicro/Msp430TimerMicroMapC.nc000066400000000000000000000043721207233610700276260ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ /** Configure the timer subsystem such that TimerA=ACLK (32kHz) and TimerB=SMCLK/4 (1MHz). */ configuration Msp430TimerMicroMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; Msp430Timer[0] = Msp430TimerC.TimerB; Msp430TimerControl[0] = Msp430TimerC.ControlB0; Msp430Compare[0] = Msp430TimerC.CompareB0; // Timer B1 is used for SFD capture on the CC2420 radio Msp430Timer[1] = Msp430TimerC.TimerB; Msp430TimerControl[1] = Msp430TimerC.ControlB2; Msp430Compare[1] = Msp430TimerC.CompareB2; Msp430Timer[2] = Msp430TimerC.TimerB; Msp430TimerControl[2] = Msp430TimerC.ControlB3; Msp430Compare[2] = Msp430TimerC.CompareB3; Msp430Timer[3] = Msp430TimerC.TimerB; Msp430TimerControl[3] = Msp430TimerC.ControlB4; Msp430Compare[3] = Msp430TimerC.CompareB4; Msp430Timer[4] = Msp430TimerC.TimerB; Msp430TimerControl[4] = Msp430TimerC.ControlB5; Msp430Compare[4] = Msp430TimerC.CompareB5; Msp430Timer[5] = Msp430TimerC.TimerB; Msp430TimerControl[5] = Msp430TimerC.ControlB6; Msp430Compare[5] = Msp430TimerC.CompareB6; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/tmicro/RadioConfig.h000066400000000000000000000042571207233610700261210ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #ifndef __RADIOCONFIG_H__ #define __RADIOCONFIG_H__ #include #include //#include /* This is the default value of the PA_POWER field of the TXCTL register. */ #ifndef CC2420X_DEF_RFPOWER #define CC2420X_DEF_RFPOWER 0 #endif /* This is the default value of the CHANNEL field of the FSCTRL register. */ #ifndef CC2420X_DEF_CHANNEL #define CC2420X_DEF_CHANNEL 11 #endif /* The number of microseconds a sending micaz mote will wait for an acknowledgement */ #ifndef SOFTWAREACK_TIMEOUT #define SOFTWAREACK_TIMEOUT 800 #endif /** * This is the timer type of the radio alarm interface */ typedef TMicro TRadio; typedef uint16_t tradio_size; /** * The number of radio alarm ticks per one microsecond (0.9216). * We use integers and no parentheses just to make deputy happy. * Ok, further hacks were required for deputy, I removed 00 from the * beginning and end to be able to handle longer wait periods. */ #define RADIO_ALARM_MICROSEC 1 /** * The base two logarithm of the number of radio alarm ticks per one millisecond */ #define RADIO_ALARM_MILLI_EXP 10 #endif//__RADIOCONFIG_H__ tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/tmicro/am/000077500000000000000000000000001207233610700241515ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/tmicro/am/ActiveMessageC.nc000066400000000000000000000040151207233610700273160ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface SendNotifier[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface RadioChannel; interface PacketTimeStamp as PacketTimeStampMicro; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components CC2420XActiveMessageC as MessageC; SplitControl = MessageC; AMSend = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; SendNotifier = MessageC; Packet = MessageC; AMPacket = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketLink = MessageC; RadioChannel = MessageC; PacketTimeStampMilli = MessageC; PacketTimeStampMicro = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/cc2420x/tmicro/am/TimeSyncMessageC.nc000066400000000000000000000042571207233610700276460ustar00rootroot00000000000000/* * Copyright (c) 2011, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Janos Sallai */ #include configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketTimeStamp as PacketTimeStampRadio; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; interface LowPowerListening; } } implementation { components CC2420XTimeSyncMessageC as MessageC; SplitControl = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; Packet = MessageC; AMPacket = MessageC; PacketTimeStampRadio = MessageC; TimeSyncAMSendRadio = MessageC; TimeSyncPacketRadio = MessageC; PacketTimeStampMilli = MessageC; TimeSyncAMSendMilli = MessageC; TimeSyncPacketMilli = MessageC; LowPowerListening = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/s1087/000077500000000000000000000000001207233610700217545ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/s1087/HamamatsuS1087ParC.nc000066400000000000000000000044461207233610700254370ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HamamatsuS1087ParC is a driver for a photosynthetically-active * radiation sensor available on the telosb platform. * * @author Gilman Tolle * @version $Revision: 1.5 $ $Date: 2007-04-13 21:46:18 $ */ generic configuration HamamatsuS1087ParC() { provides interface DeviceMetadata; provides interface Read; provides interface ReadStream; } implementation { components new AdcReadClientC(); Read = AdcReadClientC; components new AdcReadStreamClientC(); ReadStream = AdcReadStreamClientC; components HamamatsuS1087ParP; DeviceMetadata = HamamatsuS1087ParP; AdcReadClientC.AdcConfigure -> HamamatsuS1087ParP; AdcReadStreamClientC.AdcConfigure -> HamamatsuS1087ParP; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/s1087/HamamatsuS1087ParP.nc000066400000000000000000000047211207233610700254500ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "Msp430Adc12.h" /** * HamamatsuS1087ParP is a driver for a photosynthetically-active * radiation sensor available on the telosb platform. * * @author Gilman Tolle * @version $Revision: 1.5 $ $Date: 2007-04-13 21:46:18 $ */ module HamamatsuS1087ParP { provides interface DeviceMetadata; provides interface AdcConfigure; } implementation { msp430adc12_channel_config_t config = { inch: INPUT_CHANNEL_A4, sref: REFERENCE_VREFplus_AVss, ref2_5v: REFVOLT_LEVEL_1_5, adc12ssel: SHT_SOURCE_ACLK, adc12div: SHT_CLOCK_DIV_1, sht: SAMPLE_HOLD_4_CYCLES, sampcon_ssel: SAMPCON_SOURCE_SMCLK, sampcon_id: SAMPCON_CLOCK_DIV_1 }; command uint8_t DeviceMetadata.getSignificantBits() { return 12; } async command const msp430adc12_channel_config_t* AdcConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/s10871/000077500000000000000000000000001207233610700220355ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/s10871/HamamatsuS10871TsrC.nc000066400000000000000000000044351207233610700256250ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HamamatsuS10871TsrC is a driver for a total solar radiation sensor * available on the telosb platform. * * @author Gilman Tolle * @version $Revision: 1.5 $ $Date: 2007-04-13 21:46:18 $ */ generic configuration HamamatsuS10871TsrC() { provides interface DeviceMetadata; provides interface Read; provides interface ReadStream; } implementation { components new AdcReadClientC(); Read = AdcReadClientC; components new AdcReadStreamClientC(); ReadStream = AdcReadStreamClientC; components HamamatsuS10871TsrP; DeviceMetadata = HamamatsuS10871TsrP; AdcReadClientC.AdcConfigure -> HamamatsuS10871TsrP; AdcReadStreamClientC.AdcConfigure -> HamamatsuS10871TsrP; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/s10871/HamamatsuS10871TsrP.nc000066400000000000000000000047251207233610700256440ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "Msp430Adc12.h" /** * HamamatsuS10871TsrP is a driver for a photosynthetically-active * radiation sensor available on the telosb platform. * * @author Gilman Tolle * @version $Revision: 1.5 $ $Date: 2007-04-13 21:46:18 $ */ module HamamatsuS10871TsrP { provides interface DeviceMetadata; provides interface AdcConfigure; } implementation { msp430adc12_channel_config_t config = { inch: INPUT_CHANNEL_A5, sref: REFERENCE_VREFplus_AVss, ref2_5v: REFVOLT_LEVEL_1_5, adc12ssel: SHT_SOURCE_ACLK, adc12div: SHT_CLOCK_DIV_1, sht: SAMPLE_HOLD_4_CYCLES, sampcon_ssel: SAMPCON_SOURCE_SMCLK, sampcon_id: SAMPCON_CLOCK_DIV_1 }; command uint8_t DeviceMetadata.getSignificantBits() { return 12; } async command const msp430adc12_channel_config_t* AdcConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/sht11/000077500000000000000000000000001207233610700221325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/sht11/HalSensirionSht11C.nc000066400000000000000000000051461207233610700260040ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HalSensirionSht11C is an advanced access component for the * Sensirion SHT11 model humidity and temperature sensor, available on * the telosb platform. This component provides the SensirionSht11 * interface, which offers full control over the device. Please * acquire the Resource before using it. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ configuration HalSensirionSht11C { provides interface Resource[ uint8_t client ]; provides interface SensirionSht11[ uint8_t client ]; } implementation { components new SensirionSht11LogicP(); SensirionSht11 = SensirionSht11LogicP; components HplSensirionSht11C; Resource = HplSensirionSht11C.Resource; SensirionSht11LogicP.DATA -> HplSensirionSht11C.DATA; SensirionSht11LogicP.CLOCK -> HplSensirionSht11C.SCK; SensirionSht11LogicP.InterruptDATA -> HplSensirionSht11C.InterruptDATA; components new TimerMilliC(); SensirionSht11LogicP.Timer -> TimerMilliC; components LedsC; SensirionSht11LogicP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/sht11/HplSensirionSht11C.nc000066400000000000000000000063501207233610700260210ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HplSensirionSht11C is a low-level component, intended to provide * the physical resources used by the Sensirion SHT11 sensor on the * telosb platform so that the chip driver can make use of them. You * really shouldn't be wiring to this, unless you're writing a new * Sensirion SHT11 driver. * * @author Gilman Tolle * @version $Revision: 1.6 $ $Date: 2007-02-04 19:56:29 $ */ configuration HplSensirionSht11C { provides interface Resource[ uint8_t id ]; provides interface GeneralIO as DATA; provides interface GeneralIO as SCK; provides interface GpioInterrupt as InterruptDATA; } implementation { components HplMsp430GeneralIOC; components new Msp430GpioC() as DATAM; components new Msp430GpioC() as SCKM; components new Msp430GpioC() as PWRM; DATAM -> HplMsp430GeneralIOC.Port15; SCKM -> HplMsp430GeneralIOC.Port16; PWRM -> HplMsp430GeneralIOC.Port17; DATA = DATAM; SCK = SCKM; components HplSensirionSht11P; HplSensirionSht11P.PWR -> PWRM; HplSensirionSht11P.DATA -> DATAM; HplSensirionSht11P.SCK -> SCKM; components new TimerMilliC(); HplSensirionSht11P.Timer -> TimerMilliC; components HplMsp430InterruptC; components new Msp430InterruptC() as InterruptDATAC; InterruptDATAC.HplInterrupt -> HplMsp430InterruptC.Port15; InterruptDATA = InterruptDATAC.Interrupt; components new FcfsArbiterC( "Sht11.Resource" ) as Arbiter; Resource = Arbiter; components new SplitControlPowerManagerC(); SplitControlPowerManagerC.SplitControl -> HplSensirionSht11P; SplitControlPowerManagerC.ArbiterInfo -> Arbiter.ArbiterInfo; SplitControlPowerManagerC.ResourceDefaultOwner -> Arbiter.ResourceDefaultOwner; } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/sht11/HplSensirionSht11P.nc000066400000000000000000000050631207233610700260360ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "Timer.h" /** * HplSensirionSht11P is a low-level component that controls power for * the Sensirion SHT11 sensor on the telosb platform. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ module HplSensirionSht11P { provides interface SplitControl; uses interface Timer; uses interface GeneralIO as PWR; uses interface GeneralIO as DATA; uses interface GeneralIO as SCK; } implementation { task void stopTask(); command error_t SplitControl.start() { call PWR.makeOutput(); call PWR.set(); call Timer.startOneShot( 11 ); return SUCCESS; } event void Timer.fired() { signal SplitControl.startDone( SUCCESS ); } command error_t SplitControl.stop() { call SCK.makeInput(); call SCK.clr(); call DATA.makeInput(); call DATA.clr(); call PWR.clr(); post stopTask(); return SUCCESS; } task void stopTask() { signal SplitControl.stopDone( SUCCESS ); } } tinyos-2.1.2+dfsg/tos/platforms/telosa/chips/sht11/SensirionSht11C.nc000066400000000000000000000061011207233610700253470ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * SensirionSht11C is a top-level access component for the Sensirion * SHT11 model humidity and temperature sensor, available on the * telosb platform. Because this component represents one physical * device, simultaneous calls to read temperature and humidity will be * arbitrated and executed in sequential order. Feel free to read both * at the same time, just be aware that they'll come back * sequentially. * * @author Gilman Tolle * @version $Revision: 1.5 $ $Date: 2007-04-13 21:46:18 $ */ generic configuration SensirionSht11C() { provides interface Read as Temperature; provides interface DeviceMetadata as TemperatureMetadata; provides interface Read as Humidity; provides interface DeviceMetadata as HumidityMetadata; } implementation { components new SensirionSht11ReaderP(); Temperature = SensirionSht11ReaderP.Temperature; TemperatureMetadata = SensirionSht11ReaderP.TemperatureMetadata; Humidity = SensirionSht11ReaderP.Humidity; HumidityMetadata = SensirionSht11ReaderP.HumidityMetadata; components HalSensirionSht11C; enum { TEMP_KEY = unique("Sht11.Resource") }; enum { HUM_KEY = unique("Sht11.Resource") }; SensirionSht11ReaderP.TempResource -> HalSensirionSht11C.Resource[ TEMP_KEY ]; SensirionSht11ReaderP.Sht11Temp -> HalSensirionSht11C.SensirionSht11[ TEMP_KEY ]; SensirionSht11ReaderP.HumResource -> HalSensirionSht11C.Resource[ HUM_KEY ]; SensirionSht11ReaderP.Sht11Hum -> HalSensirionSht11C.SensirionSht11[ HUM_KEY ]; } tinyos-2.1.2+dfsg/tos/platforms/telosa/hardware.h000066400000000000000000000045471207233610700220440ustar00rootroot00000000000000#ifndef _H_hardware_h #define _H_hardware_h #include "msp430hardware.h" // enum so components can override power saving, // as per TEP 112. enum { TOS_SLEEP_NONE = MSP430_POWER_ACTIVE, }; // LEDs TOSH_ASSIGN_PIN(RED_LED, 5, 4); TOSH_ASSIGN_PIN(GREEN_LED, 5, 5); TOSH_ASSIGN_PIN(YELLOW_LED, 5, 6); // CC2420 RADIO #defines TOSH_ASSIGN_PIN(RADIO_CSN, 4, 2); TOSH_ASSIGN_PIN(RADIO_VREF, 4, 5); TOSH_ASSIGN_PIN(RADIO_RESET, 4, 6); TOSH_ASSIGN_PIN(RADIO_FIFOP, 1, 0); TOSH_ASSIGN_PIN(RADIO_SFD, 4, 1); TOSH_ASSIGN_PIN(RADIO_GIO0, 1, 3); TOSH_ASSIGN_PIN(RADIO_FIFO, 1, 3); TOSH_ASSIGN_PIN(RADIO_GIO1, 1, 4); TOSH_ASSIGN_PIN(RADIO_CCA, 1, 4); TOSH_ASSIGN_PIN(CC_FIFOP, 1, 0); TOSH_ASSIGN_PIN(CC_FIFO, 1, 3); TOSH_ASSIGN_PIN(CC_SFD, 4, 1); TOSH_ASSIGN_PIN(CC_VREN, 4, 5); TOSH_ASSIGN_PIN(CC_RSTN, 4, 6); // UART pins TOSH_ASSIGN_PIN(SOMI0, 3, 2); TOSH_ASSIGN_PIN(SIMO0, 3, 1); TOSH_ASSIGN_PIN(UCLK0, 3, 3); TOSH_ASSIGN_PIN(UTXD0, 3, 4); TOSH_ASSIGN_PIN(URXD0, 3, 5); TOSH_ASSIGN_PIN(UTXD1, 3, 6); TOSH_ASSIGN_PIN(URXD1, 3, 7); TOSH_ASSIGN_PIN(UCLK1, 5, 3); TOSH_ASSIGN_PIN(SOMI1, 5, 2); TOSH_ASSIGN_PIN(SIMO1, 5, 1); // ADC TOSH_ASSIGN_PIN(ADC0, 6, 0); TOSH_ASSIGN_PIN(ADC1, 6, 1); TOSH_ASSIGN_PIN(ADC2, 6, 2); TOSH_ASSIGN_PIN(ADC3, 6, 3); // HUMIDITY TOSH_ASSIGN_PIN(HUM_SDA, 1, 5); TOSH_ASSIGN_PIN(HUM_SCL, 1, 6); TOSH_ASSIGN_PIN(HUM_PWR, 1, 7); // GIO pins TOSH_ASSIGN_PIN(GIO0, 2, 0); TOSH_ASSIGN_PIN(GIO1, 2, 1); void HUMIDITY_MAKE_CLOCK_OUTPUT() { TOSH_MAKE_HUM_SCL_OUTPUT(); } void HUMIDITY_MAKE_CLOCK_INPUT() { TOSH_MAKE_HUM_SCL_INPUT(); } void HUMIDITY_CLEAR_CLOCK() { TOSH_CLR_HUM_SCL_PIN(); } void HUMIDITY_SET_CLOCK() { TOSH_SET_HUM_SCL_PIN(); } void HUMIDITY_MAKE_DATA_OUTPUT() { TOSH_MAKE_HUM_SDA_OUTPUT(); } void HUMIDITY_MAKE_DATA_INPUT() { TOSH_MAKE_HUM_SDA_INPUT(); } void HUMIDITY_CLEAR_DATA() { TOSH_CLR_HUM_SDA_PIN(); } void HUMIDITY_SET_DATA() { TOSH_SET_HUM_SDA_PIN(); } char HUMIDITY_GET_DATA() { return TOSH_READ_HUM_SDA_PIN(); } #define HUMIDITY_TIMEOUT_MS 30 #define HUMIDITY_TIMEOUT_TRIES 20 enum { // Sensirion Humidity addresses and commands TOSH_HUMIDITY_ADDR = 5, TOSH_HUMIDTEMP_ADDR = 3, TOSH_HUMIDITY_RESET = 0x1E }; // FLASH TOSH_ASSIGN_PIN(FLASH_PWR, 4, 3); TOSH_ASSIGN_PIN(FLASH_CS, 4, 4); // PROGRAMMING PINS (tri-state) //TOSH_ASSIGN_PIN(TCK, ); TOSH_ASSIGN_PIN(PROG_RX, 1, 1); TOSH_ASSIGN_PIN(PROG_TX, 2, 2); #endif // _H_hardware_h tinyos-2.1.2+dfsg/tos/platforms/telosa/platform.h000066400000000000000000000000001207233610700220470ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosa/platform_message.h000066400000000000000000000051301207233610700235640ustar00rootroot00000000000000/* $Id: platform_message.h,v 1.6 2010-06-29 22:07:55 scipio Exp $ * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Defining the platform-independently named packet structures to be the * chip-specific CC1000 packet structures. * * @author Philip Levis * @version $Revision: 1.6 $ $Date: 2010-06-29 22:07:55 $ */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include #include typedef union message_header { cc2420_header_t cc2420; serial_header_t serial; } message_header_t; typedef union TOSRadioFooter { cc2420_footer_t cc2420; } message_footer_t; typedef union TOSRadioMetadata { cc2420_metadata_t cc2420; serial_metadata_t serial; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/telosb/000077500000000000000000000000001207233610700200655ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosb/.platform000066400000000000000000000036751207233610700217250ustar00rootroot00000000000000# Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. push( @includes, qw( %T/platforms/telosb %T/platforms/telosb/chips/stm25p %T/platforms/telosa %T/platforms/telosa/chips/cc2420 %T/platforms/telosa/chips/s1087 %T/platforms/telosa/chips/s10871 %T/platforms/telosa/chips/sht11 %T/platforms/epic/chips/ds2411 %T/chips/cc2420 %T/chips/cc2420/alarm %T/chips/cc2420/control %T/chips/cc2420/csma %T/chips/cc2420/interfaces %T/chips/cc2420/link %T/chips/cc2420/lowpan %T/chips/cc2420/lpl %T/chips/cc2420/packet %T/chips/cc2420/receive %T/chips/cc2420/spi %T/chips/cc2420/transmit %T/chips/cc2420/unique %T/chips/cc2420/security %T/chips/msp430 %T/chips/msp430/adc12 %T/chips/msp430/dma %T/chips/msp430/pins %T/chips/msp430/timer %T/chips/msp430/usart %T/chips/msp430/sensors %T/chips/stm25p %T/chips/sht11 %T/chips/ds2401 %T/lib/timer %T/lib/serial %T/lib/adc %T/lib/power ) ); @opts = qw( -gcc=msp430-gcc -mmcu=msp430f1611 -fnesc-target=msp430 -fnesc-no-debug ); push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; $ENV{'CIL_MACHINE'} = "version_major=3 " . "version_minor=2 " . "version=msp430-3.2.3 " . "short=2,2 " . "int=2,2 " . "long=4,2 " . "long_long=8,2 " . "pointer=2,2 " . "enum=2,2 " . "float=4,2 " . "double=4,2 " . "long_double=4,2 " . "void=1,1 " . "fun=1,2 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/telosb/DemoSensorC.nc000066400000000000000000000044241207233610700225740ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorC on the telosb platform provides a * voltage reading, using VoltageC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ * */ generic configuration DemoSensorC() { provides interface Read; } implementation { components new VoltageC() as DemoSensor; Read = DemoSensor; } tinyos-2.1.2+dfsg/tos/platforms/telosb/DemoSensorNowC.nc000066400000000000000000000046341207233610700232630ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorNowC is a generic sensor device that provides a 16-bit * value that can be read from async context. The platform author * chooses which sensor actually sits behind DemoSensorNowC, and * though it's probably Voltage, Light, or Temperature, there are no * guarantees. * * This particular DemoSensorNowC on the telosb platform provides a * voltage reading, using VoltageC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ * */ generic configuration DemoSensorNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new Msp430InternalVoltageC() as DemoSensorNow; Resource = DemoSensorNow; ReadNow = DemoSensorNow; } tinyos-2.1.2+dfsg/tos/platforms/telosb/DemoSensorStreamC.nc000066400000000000000000000045041207233610700237470ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorStreamC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorStreamC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorStreamC on the telosb platform provides a * voltage reading, using VoltageStreamC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ * */ generic configuration DemoSensorStreamC() { provides interface ReadStream; } implementation { components new VoltageStreamC() as DemoSensor; ReadStream = DemoSensor; } tinyos-2.1.2+dfsg/tos/platforms/telosb/HplUserButtonC.nc000066400000000000000000000042761207233610700233010ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telos platform * * @author Gilman Tolle * @version $Revision: 1.1 $ */ configuration HplUserButtonC { provides interface GeneralIO; provides interface GpioInterrupt; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components HplMsp430InterruptC as InterruptC; components new Msp430GpioC() as UserButtonC; UserButtonC -> GeneralIOC.Port27; GeneralIO = UserButtonC; components new Msp430InterruptC() as InterruptUserButtonC; InterruptUserButtonC.HplInterrupt -> InterruptC.Port27; GpioInterrupt = InterruptUserButtonC.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/telosb/MoteClockC.nc000066400000000000000000000036451207233610700224020ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: MoteClockC.nc,v 1.1 2007-07-10 00:24:31 vlahan Exp $ * */ /** * @author Vlado Handziski */ configuration MoteClockC { provides interface Init as MoteClockInit; } implementation { components Msp430ClockC, MoteClockP; MoteClockInit = Msp430ClockC.Init; //MoteClockP.Msp430ClockInit -> Msp430ClockC; } tinyos-2.1.2+dfsg/tos/platforms/telosb/MoteClockP.nc000066400000000000000000000070161207233610700224130ustar00rootroot00000000000000/* * Copyright (c) 2007, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universität Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: MoteClockP.nc,v 1.1 2007-07-10 00:24:31 vlahan Exp $ * */ /** * @author Vlado Handziski * @author Cory Sharp */ module MoteClockP { uses interface Msp430ClockInit; } implementation { event void Msp430ClockInit.setupDcoCalibrate() { // --- setup --- TACTL = TASSEL1 | MC1; // source SMCLK, continuous mode, everything else 0 TBCTL = TBSSEL0 | MC1; BCSCTL1 = XT2OFF | RSEL2; BCSCTL2 = DCOR; // enable DCOR TBCCTL0 = CM0; } event void Msp430ClockInit.initClocks() { // BCSCTL1 // .XT2OFF = 1; disable the external oscillator for SCLK and MCLK // .XTS = 0; set low frequency mode for LXFT1 // .DIVA = 0; set the divisor on ACLK to 1 // .RSEL, do not modify BCSCTL1 = XT2OFF | (BCSCTL1 & (RSEL2|RSEL1|RSEL0)); // BCSCTL2 // .SELM = 0; select DCOCLK as source for MCLK // .DIVM = 0; set the divisor of MCLK to 1 // .SELS = 0; select DCOCLK as source for SCLK // .DIVS = 2; set the divisor of SCLK to 4 // .DCOR = 1; select internal resistor for DCO BCSCTL2 = DIVS1 | DCOR; // IE1.OFIE = 0; no interrupt for oscillator fault CLR_FLAG( IE1, OFIE ); } event void Msp430ClockInit.initTimerA() { TAR = 0; // TACTL // .TACLGRP = 0; each TACL group latched independently // .CNTL = 0; 16-bit counter // .TASSEL = 2; source SMCLK = DCO/4 // .ID = 0; input divisor of 1 // .MC = 0; initially disabled // .TACLR = 0; reset timer A // .TAIE = 1; enable timer A interrupts TACTL = TASSEL1 | TAIE; } event void Msp430ClockInit.initTimerB() { TBR = 0; // TBCTL // .TBCLGRP = 0; each TBCL group latched independently // .CNTL = 0; 16-bit counter // .TBSSEL = 1; source ACLK // .ID = 0; input divisor of 1 // .MC = 0; initially disabled // .TBCLR = 0; reset timer B // .TBIE = 1; enable timer B interrupts TBCTL = TBSSEL0 | TBIE; } } tinyos-2.1.2+dfsg/tos/platforms/telosb/MotePlatformC.nc000066400000000000000000000037111207233610700231250ustar00rootroot00000000000000module MotePlatformC @safe() { provides interface Init; } implementation { inline void uwait(uint16_t u) { uint16_t t0 = TAR; while((TAR - t0) <= u); } inline void TOSH_wait() { nop(); nop(); } // send a bit via bit-banging to the flash void TOSH_FLASH_M25P_DP_bit(bool set) { if (set) TOSH_SET_SIMO0_PIN(); else TOSH_CLR_SIMO0_PIN(); TOSH_SET_UCLK0_PIN(); TOSH_CLR_UCLK0_PIN(); } // put the flash into deep sleep mode // important to do this by default void TOSH_FLASH_M25P_DP() { // SIMO0, UCLK0 TOSH_MAKE_SIMO0_OUTPUT(); TOSH_MAKE_UCLK0_OUTPUT(); TOSH_MAKE_FLASH_HOLD_OUTPUT(); TOSH_MAKE_FLASH_CS_OUTPUT(); TOSH_SET_FLASH_HOLD_PIN(); TOSH_SET_FLASH_CS_PIN(); TOSH_wait(); // initiate sequence; TOSH_CLR_FLASH_CS_PIN(); TOSH_CLR_UCLK0_PIN(); TOSH_FLASH_M25P_DP_bit(TRUE); // 0 TOSH_FLASH_M25P_DP_bit(FALSE); // 1 TOSH_FLASH_M25P_DP_bit(TRUE); // 2 TOSH_FLASH_M25P_DP_bit(TRUE); // 3 TOSH_FLASH_M25P_DP_bit(TRUE); // 4 TOSH_FLASH_M25P_DP_bit(FALSE); // 5 TOSH_FLASH_M25P_DP_bit(FALSE); // 6 TOSH_FLASH_M25P_DP_bit(TRUE); // 7 TOSH_SET_FLASH_CS_PIN(); TOSH_SET_UCLK0_PIN(); TOSH_SET_SIMO0_PIN(); } command error_t Init.init() { // reset all of the ports to be input and using i/o functionality atomic { P1SEL = 0; P2SEL = 0; P3SEL = 0; P4SEL = 0; P5SEL = 0; P6SEL = 0; P1OUT = 0x00; P1DIR = 0xe0; P2OUT = 0x30; P2DIR = 0x7b; P3OUT = 0x00; P3DIR = 0xf1; P4OUT = 0xdd; P4DIR = 0xfd; P5OUT = 0xff; P5DIR = 0xff; P6OUT = 0x00; P6DIR = 0xff; P1IE = 0; P2IE = 0; // the commands above take care of the pin directions // there is no longer a need for explicit set pin // directions using the TOSH_SET/CLR macros // wait 10ms for the flash to startup uwait(1024*10); // Put the flash in deep sleep state TOSH_FLASH_M25P_DP(); }//atomic return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/telosb/SwitchToggleC.nc000066400000000000000000000053651207233610700231260ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Generic layer to translate a GIO into a toggle switch * * @author Gilman Tolle * @version $Revision: 1.1 $ */ #include generic module SwitchToggleC() { provides interface Get; provides interface Notify; uses interface GeneralIO; uses interface GpioInterrupt; } implementation { norace bool m_pinHigh; task void sendEvent(); command bool Get.get() { return call GeneralIO.get(); } command error_t Notify.enable() { call GeneralIO.makeInput(); if ( call GeneralIO.get() ) { m_pinHigh = TRUE; return call GpioInterrupt.enableFallingEdge(); } else { m_pinHigh = FALSE; return call GpioInterrupt.enableRisingEdge(); } } command error_t Notify.disable() { return call GpioInterrupt.disable(); } async event void GpioInterrupt.fired() { call GpioInterrupt.disable(); m_pinHigh = !m_pinHigh; post sendEvent(); } task void sendEvent() { bool pinHigh; pinHigh = m_pinHigh; signal Notify.notify( pinHigh ); if ( pinHigh ) { call GpioInterrupt.enableFallingEdge(); } else { call GpioInterrupt.enableRisingEdge(); } } } tinyos-2.1.2+dfsg/tos/platforms/telosb/UserButton.h000066400000000000000000000035121207233610700223510ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform * * @author Gilman Tolle * @version $Revision: 1.1 $ */ #ifndef USERBUTTON_H #define USERBUTTON_H typedef enum { BUTTON_RELEASED = 0, BUTTON_PRESSED = 1 } button_state_t; #endif tinyos-2.1.2+dfsg/tos/platforms/telosb/UserButtonC.nc000066400000000000000000000050431207233610700226260ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform. Get * returns the current state of the button by reading the pin, * regardless of whether enable() or disable() has been called on the * Interface. Notify.enable() and Notify.disable() modify the * underlying interrupt state of the pin, and have the effect of * enabling or disabling notifications that the button has changed * state. * * @author Gilman Tolle * @version $Revision: 1.1 $ */ #include configuration UserButtonC { provides interface Get; provides interface Notify; } implementation { components HplUserButtonC; components new SwitchToggleC(); SwitchToggleC.GpioInterrupt -> HplUserButtonC.GpioInterrupt; SwitchToggleC.GeneralIO -> HplUserButtonC.GeneralIO; components UserButtonP; Get = UserButtonP; Notify = UserButtonP; UserButtonP.GetLower -> SwitchToggleC.Get; UserButtonP.NotifyLower -> SwitchToggleC.Notify; } tinyos-2.1.2+dfsg/tos/platforms/telosb/UserButtonP.nc000066400000000000000000000051651207233610700226500ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform * * @author Gilman Tolle * @version $Revision: 1.2 $ */ #include module UserButtonP { provides interface Get; provides interface Notify; uses interface Get as GetLower; uses interface Notify as NotifyLower; } implementation { command button_state_t Get.get() { // telosb user button pin is high when released - invert state if ( call GetLower.get() ) { return BUTTON_RELEASED; } else { return BUTTON_PRESSED; } } command error_t Notify.enable() { return call NotifyLower.enable(); } command error_t Notify.disable() { return call NotifyLower.disable(); } event void NotifyLower.notify( bool val ) { // telosb user button pin is high when released - invert state if ( val ) { signal Notify.notify( BUTTON_RELEASED ); } else { signal Notify.notify( BUTTON_PRESSED ); } } default event void Notify.notify( button_state_t val ) { } } tinyos-2.1.2+dfsg/tos/platforms/telosb/VoltageC.nc000066400000000000000000000040521207233610700221140ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * VoltageC is a common name for the Msp430InternalVoltageC voltage * sensor available on the telosb platform. * * To convert from ADC counts to actual voltage, divide by 4096 and * multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ generic configuration VoltageC() { provides interface Read; } implementation { components new Msp430InternalVoltageC(); Read = Msp430InternalVoltageC.Read; } tinyos-2.1.2+dfsg/tos/platforms/telosb/VoltageStreamC.nc000066400000000000000000000041021207233610700232640ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * VoltageC is a common name for the Msp430InternalVoltageC voltage * sensor available on the telosb platform. * * To convert from ADC counts to actual voltage, divide by 4096 and * multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ generic configuration VoltageStreamC() { provides interface ReadStream; } implementation { components new Msp430InternalVoltageC(); ReadStream = Msp430InternalVoltageC.ReadStream; } tinyos-2.1.2+dfsg/tos/platforms/telosb/chips/000077500000000000000000000000001207233610700211735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosb/chips/stm25p/000077500000000000000000000000001207233610700223255ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosb/chips/stm25p/HplStm25pPinsC.nc000066400000000000000000000041721207233610700253460ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of general-purpose I/O for a ST M25P chip * connected to a TI MSP430. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ configuration HplStm25pPinsC { provides interface GeneralIO as CSN; provides interface GeneralIO as Hold; } implementation { components HplMsp430GeneralIOC as HplGeneralIOC; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as HoldM; CSNM -> HplGeneralIOC.Port44; HoldM -> HplGeneralIOC.Port47; CSN = CSNM; Hold = HoldM; } tinyos-2.1.2+dfsg/tos/platforms/telosb/chips/stm25p/HplStm25pSpiC.nc000066400000000000000000000037731207233610700251760ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of the Spi bus for a ST M25P chip connected to a * TI MSP430. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ configuration HplStm25pSpiC { provides interface Resource; provides interface SpiByte; provides interface SpiPacket; } implementation { components new Msp430Spi0C() as SpiC; Resource = SpiC; SpiByte = SpiC; SpiPacket = SpiC; } tinyos-2.1.2+dfsg/tos/platforms/telosb/hardware.h000066400000000000000000000052161207233610700220370ustar00rootroot00000000000000#ifndef _H_hardware_h #define _H_hardware_h #include "msp430hardware.h" // enum so components can override power saving, // as per TEP 112. enum { TOS_SLEEP_NONE = MSP430_POWER_ACTIVE, }; // LEDs TOSH_ASSIGN_PIN(RED_LED, 5, 4); TOSH_ASSIGN_PIN(GREEN_LED, 5, 5); TOSH_ASSIGN_PIN(YELLOW_LED, 5, 6); // CC2420 RADIO #defines TOSH_ASSIGN_PIN(RADIO_CSN, 4, 2); TOSH_ASSIGN_PIN(RADIO_VREF, 4, 5); TOSH_ASSIGN_PIN(RADIO_RESET, 4, 6); TOSH_ASSIGN_PIN(RADIO_FIFOP, 1, 0); TOSH_ASSIGN_PIN(RADIO_SFD, 4, 1); TOSH_ASSIGN_PIN(RADIO_GIO0, 1, 3); TOSH_ASSIGN_PIN(RADIO_FIFO, 1, 3); TOSH_ASSIGN_PIN(RADIO_GIO1, 1, 4); TOSH_ASSIGN_PIN(RADIO_CCA, 1, 4); TOSH_ASSIGN_PIN(CC_FIFOP, 1, 0); TOSH_ASSIGN_PIN(CC_FIFO, 1, 3); TOSH_ASSIGN_PIN(CC_SFD, 4, 1); TOSH_ASSIGN_PIN(CC_VREN, 4, 5); TOSH_ASSIGN_PIN(CC_RSTN, 4, 6); // UART pins TOSH_ASSIGN_PIN(SOMI0, 3, 2); TOSH_ASSIGN_PIN(SIMO0, 3, 1); TOSH_ASSIGN_PIN(UCLK0, 3, 3); TOSH_ASSIGN_PIN(UTXD0, 3, 4); TOSH_ASSIGN_PIN(URXD0, 3, 5); TOSH_ASSIGN_PIN(UTXD1, 3, 6); TOSH_ASSIGN_PIN(URXD1, 3, 7); TOSH_ASSIGN_PIN(UCLK1, 5, 3); TOSH_ASSIGN_PIN(SOMI1, 5, 2); TOSH_ASSIGN_PIN(SIMO1, 5, 1); // ADC TOSH_ASSIGN_PIN(ADC0, 6, 0); TOSH_ASSIGN_PIN(ADC1, 6, 1); TOSH_ASSIGN_PIN(ADC2, 6, 2); TOSH_ASSIGN_PIN(ADC3, 6, 3); // HUMIDITY TOSH_ASSIGN_PIN(HUM_SDA, 1, 5); TOSH_ASSIGN_PIN(HUM_SCL, 1, 6); TOSH_ASSIGN_PIN(HUM_PWR, 1, 7); // GIO pins TOSH_ASSIGN_PIN(GIO0, 2, 0); TOSH_ASSIGN_PIN(GIO1, 2, 1); TOSH_ASSIGN_PIN(GIO2, 2, 3); TOSH_ASSIGN_PIN(GIO3, 2, 6); // 1-Wire TOSH_ASSIGN_PIN(ONEWIRE, 2, 4); void HUMIDITY_MAKE_CLOCK_OUTPUT() @safe() { TOSH_MAKE_HUM_SCL_OUTPUT(); } void HUMIDITY_MAKE_CLOCK_INPUT() @safe() { TOSH_MAKE_HUM_SCL_INPUT(); } void HUMIDITY_CLEAR_CLOCK() @safe() { TOSH_CLR_HUM_SCL_PIN(); } void HUMIDITY_SET_CLOCK() @safe() { TOSH_SET_HUM_SCL_PIN(); } void HUMIDITY_MAKE_DATA_OUTPUT() @safe() { TOSH_MAKE_HUM_SDA_OUTPUT(); } void HUMIDITY_MAKE_DATA_INPUT() @safe() { TOSH_MAKE_HUM_SDA_INPUT(); } void HUMIDITY_CLEAR_DATA() @safe() { TOSH_CLR_HUM_SDA_PIN(); } void HUMIDITY_SET_DATA() @safe() { TOSH_SET_HUM_SDA_PIN(); } char HUMIDITY_GET_DATA() @safe() { return TOSH_READ_HUM_SDA_PIN(); } #define HUMIDITY_TIMEOUT_MS 30 #define HUMIDITY_TIMEOUT_TRIES 20 enum { // Sensirion Humidity addresses and commands TOSH_HUMIDITY_ADDR = 5, TOSH_HUMIDTEMP_ADDR = 3, TOSH_HUMIDITY_RESET = 0x1E }; // FLASH TOSH_ASSIGN_PIN(FLASH_PWR, 4, 3); TOSH_ASSIGN_PIN(FLASH_CS, 4, 4); TOSH_ASSIGN_PIN(FLASH_HOLD, 4, 7); // PROGRAMMING PINS (tri-state) //TOSH_ASSIGN_PIN(TCK, ); TOSH_ASSIGN_PIN(PROG_RX, 1, 1); TOSH_ASSIGN_PIN(PROG_TX, 2, 2); // need to undef atomic inside header files or nesC ignores the directive #undef atomic #endif // _H_hardware_h tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/000077500000000000000000000000001207233610700206255ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/000077500000000000000000000000001207233610700216535ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/Ieee802154BeaconEnabledC.nc000066400000000000000000000140471207233610700262240ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author: Jan Hauer */ #include "TKN154.h" configuration Ieee802154BeaconEnabledC { provides { // MCPS-SAP interface MCPS_DATA; interface MCPS_PURGE; // MLME-SAP interface MLME_ASSOCIATE; interface MLME_BEACON_NOTIFY; interface MLME_COMM_STATUS; interface MLME_DISASSOCIATE; interface MLME_GET; interface MLME_GTS; interface MLME_ORPHAN; interface MLME_POLL; interface MLME_RESET; interface MLME_RX_ENABLE; interface MLME_SCAN; interface MLME_SET; interface MLME_START; interface MLME_SYNC; interface MLME_SYNC_LOSS; interface IEEE154Frame; interface IEEE154BeaconFrame; interface IEEE154TxBeaconPayload; interface SplitControl as PromiscuousMode; interface Get as LocalExtendedAddress; interface Timestamp; interface Packet; } } implementation { components TKN154BeaconEnabledP as MAC; MLME_START = MAC; MLME_GET = MAC; MLME_SET = MAC; MLME_RESET = MAC; MLME_SYNC = MAC; MLME_SYNC_LOSS = MAC; MLME_BEACON_NOTIFY = MAC; MLME_SCAN = MAC; MCPS_DATA = MAC; MCPS_PURGE = MAC; MLME_ASSOCIATE = MAC; MLME_DISASSOCIATE = MAC; MLME_COMM_STATUS = MAC; MLME_RX_ENABLE = MAC; MLME_POLL = MAC; MLME_ORPHAN = MAC; MLME_GTS=MAC; IEEE154Frame = MAC; IEEE154BeaconFrame = MAC; LocalExtendedAddress = MAC; IEEE154TxBeaconPayload = MAC; PromiscuousMode = MAC; Packet = MAC; components CC2420TKN154C as PHY, new Alarm62500hz32C() as PHYAlarm1, new Alarm62500hz32VirtualizedC() as PHYAlarm2, new Alarm62500hz32C() as TKN154TimingPAlarm, LocalTime62500hzC, TKN154TimingP; // wire PHY to the PIB PHY.PIBUpdate[IEEE154_macShortAddress] -> MAC.PIBUpdate[IEEE154_macShortAddress]; PHY.PIBUpdate[IEEE154_macPANId] -> MAC.PIBUpdate[IEEE154_macPANId]; PHY.PIBUpdate[IEEE154_phyCurrentChannel] -> MAC.PIBUpdate[IEEE154_phyCurrentChannel]; PHY.PIBUpdate[IEEE154_phyTransmitPower] -> MAC.PIBUpdate[IEEE154_phyTransmitPower]; PHY.PIBUpdate[IEEE154_phyCCAMode] -> MAC.PIBUpdate[IEEE154_phyCCAMode]; PHY.PIBUpdate[IEEE154_macPanCoordinator] -> MAC.PIBUpdate[IEEE154_macPanCoordinator]; Timestamp = PHY; PHY.Alarm1 -> PHYAlarm1; PHY.Alarm2 -> PHYAlarm2; PHY.LocalTime -> LocalTime62500hzC; PHY.ReliableWait -> TKN154TimingP; PHY.TimeCalc -> MAC; PHY.CaptureTime -> TKN154TimingP; TKN154TimingP.TimeCalc -> MAC; TKN154TimingP.Leds -> LedsC; TKN154TimingP.CCA -> PHY; TKN154TimingP.SymbolAlarm -> TKN154TimingPAlarm; components new Alarm62500hz32VirtualizedC() as MACAlarm1, new Alarm62500hz32VirtualizedC() as MACAlarm2, new Alarm62500hz32VirtualizedC() as MACAlarm3, new Alarm62500hz32VirtualizedC() as MACAlarm4, new Alarm62500hz32VirtualizedC() as MACAlarm5, new Alarm62500hz32VirtualizedC() as MACAlarm6, new Alarm62500hz32VirtualizedC() as MACAlarm7, new Alarm62500hz32VirtualizedC() as MACAlarm8, new Alarm62500hz32VirtualizedC() as MACAlarm9, new Alarm62500hz32VirtualizedC() as MACAlarm10, new Alarm62500hz32VirtualizedC() as MACAlarm11, new Alarm62500hz32VirtualizedC() as MACAlarm12, new Alarm62500hz32VirtualizedC() as MACAlarm13, new Timer62500C() as MACTimer1, new Timer62500C() as MACTimer2, new Timer62500C() as MACTimer3, new Timer62500C() as MACTimer4, new Timer62500C() as MACTimer5; MAC.Alarm1 -> MACAlarm1; MAC.Alarm2 -> MACAlarm2; MAC.Alarm3 -> MACAlarm3; MAC.Alarm4 -> MACAlarm4; MAC.Alarm5 -> MACAlarm5; MAC.Alarm6 -> MACAlarm6; MAC.Alarm7 -> MACAlarm7; MAC.Alarm8 -> MACAlarm8; MAC.Alarm9 -> MACAlarm9; MAC.Alarm10 -> MACAlarm10; MAC.Alarm11 -> MACAlarm11; MAC.Alarm12 -> MACAlarm12; MAC.Alarm13 -> MACAlarm13; MAC.Timer1 -> MACTimer1; MAC.Timer2 -> MACTimer2; MAC.Timer3 -> MACTimer3; MAC.Timer4 -> MACTimer4; MAC.Timer5 -> MACTimer5; MAC.LocalTime -> LocalTime62500hzC; // wire MAC <-> PHY MAC.RadioTx -> PHY; MAC.SlottedCsmaCa -> PHY; MAC.RadioRx -> PHY; MAC.RadioOff -> PHY; MAC.EnergyDetection -> PHY; MAC.PhySplitControl -> PHY; MAC.RadioPromiscuousMode -> PHY.RadioPromiscuousMode; PHY.FrameUtility -> MAC; components RandomC, LedsC, NoLedsC; MAC.Random -> RandomC; MAC.Leds -> LedsC; PHY.Random -> RandomC; #ifdef TKN154_DEBUG components DebugC; #endif } tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/Ieee802154NonBeaconEnabledC.nc000066400000000000000000000117361207233610700267010ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-05-18 12:54:11 $ * @author: Jan Hauer * ======================================================================== */ #include "TKN154.h" configuration Ieee802154NonBeaconEnabledC { provides { // MCPS-SAP interface MCPS_DATA; interface MCPS_PURGE; // MLME-SAP interface MLME_ASSOCIATE; interface MLME_BEACON_NOTIFY; interface MLME_COMM_STATUS; interface MLME_DISASSOCIATE; interface MLME_GET; interface MLME_ORPHAN; interface MLME_POLL; interface MLME_RESET; interface MLME_RX_ENABLE; interface MLME_SCAN; interface MLME_SET; interface MLME_START; interface IEEE154Frame; interface IEEE154BeaconFrame; interface IEEE154TxBeaconPayload; interface SplitControl as PromiscuousMode; interface Get as LocalExtendedAddress; interface Timestamp; interface Packet; } } implementation { components TKN154NonBeaconEnabledP as MAC; MLME_START = MAC; MLME_GET = MAC; MLME_SET = MAC; MLME_RESET = MAC; MLME_BEACON_NOTIFY = MAC; MLME_SCAN = MAC; MCPS_DATA = MAC; MCPS_PURGE = MAC; MLME_ASSOCIATE = MAC; MLME_DISASSOCIATE = MAC; MLME_COMM_STATUS = MAC; MLME_RX_ENABLE = MAC; MLME_POLL = MAC; MLME_ORPHAN = MAC; IEEE154Frame = MAC; IEEE154BeaconFrame = MAC; IEEE154TxBeaconPayload = MAC; LocalExtendedAddress = MAC; PromiscuousMode = MAC; Packet = MAC; components CC2420TKN154C as PHY, new Alarm62500hz32C() as PHYAlarm1, new Alarm62500hz32VirtualizedC() as PHYAlarm2, new Alarm62500hz32C() as TKN154TimingPAlarm, LocalTime62500hzC, TKN154TimingP; // wire PHY to the PIB PHY.PIBUpdate[IEEE154_macShortAddress] -> MAC.PIBUpdate[IEEE154_macShortAddress]; PHY.PIBUpdate[IEEE154_macPANId] -> MAC.PIBUpdate[IEEE154_macPANId]; PHY.PIBUpdate[IEEE154_phyCurrentChannel] -> MAC.PIBUpdate[IEEE154_phyCurrentChannel]; PHY.PIBUpdate[IEEE154_phyTransmitPower] -> MAC.PIBUpdate[IEEE154_phyTransmitPower]; PHY.PIBUpdate[IEEE154_phyCCAMode] -> MAC.PIBUpdate[IEEE154_phyCCAMode]; PHY.PIBUpdate[IEEE154_macPanCoordinator] -> MAC.PIBUpdate[IEEE154_macPanCoordinator]; Timestamp = PHY; PHY.Alarm1 -> PHYAlarm1; PHY.Alarm2 -> PHYAlarm2; PHY.LocalTime -> LocalTime62500hzC; PHY.ReliableWait -> TKN154TimingP; PHY.TimeCalc -> MAC; PHY.CaptureTime -> TKN154TimingP; TKN154TimingP.TimeCalc -> MAC; TKN154TimingP.Leds -> LedsC; TKN154TimingP.CCA -> PHY; TKN154TimingP.SymbolAlarm -> TKN154TimingPAlarm; components new Timer62500C() as MACTimer1, new Timer62500C() as MACTimer2, new Timer62500C() as MACTimer3, new Timer62500C() as MACTimer4, new Timer62500C() as MACTimer5; MAC.Timer1 -> MACTimer1; MAC.Timer2 -> MACTimer2; MAC.Timer3 -> MACTimer3; MAC.Timer4 -> MACTimer4; MAC.Timer5 -> MACTimer5; MAC.LocalTime -> LocalTime62500hzC; // wire MAC <-> PHY MAC.RadioTx -> PHY; MAC.UnslottedCsmaCa -> PHY; MAC.RadioRx -> PHY; MAC.RadioOff -> PHY; MAC.EnergyDetection -> PHY; MAC.PhySplitControl -> PHY; MAC.RadioPromiscuousMode -> PHY.RadioPromiscuousMode; PHY.FrameUtility -> MAC; components RandomC, LedsC, NoLedsC; MAC.Random -> RandomC; MAC.Leds -> LedsC; PHY.Random -> RandomC; #ifdef TKN154_DEBUG components DebugC; #endif } tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/Makefile.include000066400000000000000000000003531207233610700247360ustar00rootroot00000000000000ifdef TKN154_PIERCEBOARD CFLAGS += -I$(TOSDIR)/platforms/telosb/mac/tkn154/timer/pierceboard endif CFLAGS += -I$(TOSDIR)/platforms/telosb/mac/tkn154 \ -I$(TOSDIR)/platforms/telosb/mac/tkn154/timer \ -I$(TOSDIR)/chips/cc2420_tkn154 tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/TKN154TimingP.nc000066400000000000000000000106141207233610700243550ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * extraification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.3 $ * $Date: 2009-03-04 18:31:56 $ * @author: Jan Hauer * ======================================================================== */ /** * In slotted CSMA-CA frames must be sent on backoff boundaries (slot width: * 320 us). The TelosB platform lacks a clock with sufficient precision and * accuracy, i.e. for slotted CSMA-CA the timing is *not* standard compliant * (this code is experimental) */ #include "TKN154_platform.h" module TKN154TimingP { provides { interface ReliableWait; interface CaptureTime; } uses { interface TimeCalc; interface GetNow as CCA; interface Alarm as SymbolAlarm; interface Leds; } } implementation { enum { S_WAIT_OFF, S_WAIT_RX, S_WAIT_TX, S_WAIT_BACKOFF, }; uint8_t m_state = S_WAIT_OFF; async command uint32_t CaptureTime.getTimestamp(uint16_t captured_time) { uint32_t now = call SymbolAlarm.getNow(); // On telos the capture_time is from the 32 KHz quartz, in // order to transform it to symbols we multiply by 2 // We also subtract 10 because the returned value should represent // the time of the first bit of the frame, not the SFD byte. return now - (uint16_t)(now - captured_time * 2) - 10; } async command uint16_t CaptureTime.getSFDUptime(uint16_t SFDCaptureTime, uint16_t EFDCaptureTime) { // Return the time between two 32khz timestamps converted to symbols. return (EFDCaptureTime - SFDCaptureTime) * 2; } async command bool ReliableWait.ccaOnBackoffBoundary(uint32_t slot0) { // There is no point in trying return (call CCA.getNow() ? 20: 0); } async command void ReliableWait.waitRx(uint32_t t0, uint32_t dt) { if (m_state != S_WAIT_OFF){ ASSERT(0); return; } m_state = S_WAIT_RX; call SymbolAlarm.startAt(t0 - 16, dt); // subtract 12 symbols required for Rx calibration } async command void ReliableWait.waitTx(uint32_t t0, uint32_t dt) { if (m_state != S_WAIT_OFF){ ASSERT(0); return; } m_state = S_WAIT_TX; call SymbolAlarm.startAt(t0 - 16, dt); // subtract 12 symbols required for Tx calibration } async command void ReliableWait.waitBackoff(uint32_t dt) { if (m_state != S_WAIT_OFF){ ASSERT(0); return; } m_state = S_WAIT_BACKOFF; call SymbolAlarm.start(dt); } async event void SymbolAlarm.fired() { switch (m_state) { case S_WAIT_RX: m_state = S_WAIT_OFF; signal ReliableWait.waitRxDone(); break; case S_WAIT_TX: m_state = S_WAIT_OFF; signal ReliableWait.waitTxDone(); break; case S_WAIT_BACKOFF: m_state = S_WAIT_OFF; signal ReliableWait.waitBackoffDone(); break; default: ASSERT(0); break; } } } tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/TKN154_platform.h000066400000000000000000000066231207233610700246250ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.4 $ * $Date: 2009-03-26 17:50:44 $ * @author Jan Hauer * ======================================================================== */ #ifndef __TKN154_platform_H #define __TKN154_platform_H /**************************************************** * The following constants define guard times on Tmote Sky / TelosB. * All values are in symbol time (1 symbol = 16 us) and assume the * default system configuration (MCLK running at 4 MHz) */ enum { // the expected maximum time between calling a transmit() operation and // the radio putting the first byte on the channel assuming no CSMA-CA IEEE154_RADIO_TX_DELAY = 400, // the expected maximum time between calling a receive() operation and the // the radio actually being put in receive mode IEEE154_RADIO_RX_DELAY = 400, // defines at what time the MAC payload for a beacon frame is assembled before // the next scheduled beacon transmission time; the value must be smaller than // the beacon interval plus the time for preparing the Tx operation BEACON_PAYLOAD_UPDATE_INTERVAL = 2500, }; // Defines the time to power the CC2420 radio from "Power Down" mode to "Idle" // mode. The actual start up time of the oscillator is 860 us (with default // capacitor, see CC2420 datasheet), but our constant must also include // software latency (task posting, etc.) + shutting the radio down // -> we keep it conservative, otherwise we may lose beacons // NOTE: if this constant is not defined, the radio will never be powered down // during inactive period, but always stay in idle (which consumes more energy). #ifndef IEEE154_INACTIVE_PERIOD_POWERDOWN_DISABLED #ifndef IEEE154_RADIO_POWERUP_TIME #define IEEE154_RADIO_POWERUP_TIME 200 #endif #endif #endif tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/platform_message.h000066400000000000000000000012361207233610700253560ustar00rootroot00000000000000 #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include /* The following include pulls in the ieee154_header_t/ieee154_metadata_t definitions */ #include /* TOSH_DATA_LENGTH should be the maximum length of the MAC payload */ #ifndef TOSH_DATA_LENGTH #define TOSH_DATA_LENGTH 118 #elif TOSH_DATA_LENGTH < 118 #warning "MAC payload region is smaller than aMaxMACPayloadSize!" #endif typedef union message_header { ieee154_header_t ieee154; serial_header_t serial; } message_header_t; typedef union TOSRadioFooter { } message_footer_t; typedef union TOSRadioMetadata { ieee154_metadata_t ieee154; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/timer/000077500000000000000000000000001207233610700227735ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/timer/Alarm32khz32VirtualizedP.nc000066400000000000000000000012751207233610700277500ustar00rootroot00000000000000#include "Timer62500hz.h" configuration Alarm32khz32VirtualizedP { provides interface Alarm as Alarm[ uint8_t num ]; } implementation { components new Alarm32khz32C(), MainC; components new VirtualizeAlarmC(T32khz, uint32_t, uniqueCount(UQ_ALARM_32KHZ32)); #ifndef PLATFORM_MICAZ // On msp430-based (e.g. TelosB) platforms Alarm32khz32C provides // the Init interface, on the atmega-based (e.g. micaz) platforms // it does not. If you use this file as a template for a new // platform you might need to adapt this ... MainC -> Alarm32khz32C.Init; #endif Alarm = VirtualizeAlarmC; MainC -> VirtualizeAlarmC.Init; VirtualizeAlarmC.AlarmFrom -> Alarm32khz32C; } tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/timer/Alarm32khzTo62500hzTransformC.nc000066400000000000000000000101321207233610700304710ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Date: 2009-03-04 18:31:56 $ * @author Jan Hauer * ======================================================================== */ module Alarm32khzTo62500hzTransformC { provides interface Alarm as Alarm[ uint8_t num ]; uses interface Alarm as AlarmFrom[ uint8_t num ]; } implementation { /** * TelosB lacks a clock that satisfies the precision and accuracy * requirements of the IEEE 802.15.4 standard (62500 Hz, +-40 ppm). * As a workaround, we cast one tick of the 32768 Hz clock to two * IEEE 802.15.4 symbols, which introduces a small (5%) error. * As a consequence the timing of the beacon interval and slotted * CSMA-CA algorithm is not standard-compliant anymore. */ #warning "Warning: MAC timing is not standard compliant!" async command void Alarm.start[ uint8_t num ](uint32_t dt){ call AlarmFrom.start[num](dt >> 1);} async command void Alarm.stop[ uint8_t num ](){ call AlarmFrom.stop[num]();} async event void AlarmFrom.fired[ uint8_t num ](){ signal Alarm.fired[num]();} async command bool Alarm.isRunning[ uint8_t num ](){ return call AlarmFrom.isRunning[num]();} async command uint32_t Alarm.getAlarm[ uint8_t num ](){ return call AlarmFrom.getAlarm[num]() << 1;} async command uint32_t Alarm.getNow[ uint8_t num ](){ // this might shift out the most significant bit // that's why Alarm.startAt() is converted to a Alarm.start() return call AlarmFrom.getNow[num]() << 1; } async command void Alarm.startAt[ uint8_t num ](uint32_t t0, uint32_t dt){ // t0 occured before "now" atomic { uint32_t now = call Alarm.getNow[num](), elapsed; if (t0 < now) elapsed = now - t0; else elapsed = ~(t0 - now) + 1; if (elapsed > dt) dt = elapsed; dt -= elapsed; call Alarm.start[num](dt); } } /******************** Defaults ****************************/ default async command void AlarmFrom.start[ uint8_t num ](uint32_t dt){ } default async command void AlarmFrom.stop[ uint8_t num ](){ } default async command bool AlarmFrom.isRunning[ uint8_t num ](){ return FALSE;} default async event void Alarm.fired[ uint8_t num ](){} default async command void AlarmFrom.startAt[ uint8_t num ](uint32_t t0, uint32_t dt){ } default async command uint32_t AlarmFrom.getNow[ uint8_t num ](){ return 0;} default async command uint32_t AlarmFrom.getAlarm[ uint8_t num ](){ return 0;} } tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/timer/Alarm62500hz32C.nc000066400000000000000000000005541207233610700255640ustar00rootroot00000000000000#include "Timer62500hz.h" generic configuration Alarm62500hz32C() { provides interface Alarm as Alarm; } implementation { components new Alarm32khz32C(), MainC; components new Alarm62500hz32P(); Alarm = Alarm62500hz32P; #if defined(PLATFORM_TELOSB) MainC -> Alarm32khz32C.Init; #endif Alarm62500hz32P.AlarmFrom -> Alarm32khz32C; } tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/timer/Alarm62500hz32P.nc000066400000000000000000000073221207233610700256010ustar00rootroot00000000000000/* * Copyright (c) 2008, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Date: 2008-11-25 09:35:09 $ * @author Jan Hauer * ======================================================================== */ generic module Alarm62500hz32P() { provides interface Alarm as Alarm; uses interface Alarm as AlarmFrom; } implementation { /** * TelosB lacks a clock with the precision and accuracy * required by the 802.15.4 standard (62500 Hz, 40 ppm). * As a workaround, we cast one tick of the 32768 Hz clock to * two 802.15.4 symbols, which introduces a small (5%) error. * Thus the channel access in particular in beacon-enabled PANs * (slotted CSMA-CA) is not be standard-compliant! */ async command void Alarm.start(uint32_t dt){ call AlarmFrom.start(dt >> 1);} async command void Alarm.stop(){ call AlarmFrom.stop();} async event void AlarmFrom.fired(){ signal Alarm.fired();} async command bool Alarm.isRunning(){ return call AlarmFrom.isRunning();} async command uint32_t Alarm.getAlarm(){ return call AlarmFrom.getAlarm() << 1;} async command uint32_t Alarm.getNow(){ // this might shift out the most significant bit // that's why Alarm.startAt() is converted to a Alarm.start() return call AlarmFrom.getNow() << 1; } async command void Alarm.startAt(uint32_t t0, uint32_t dt){ // t0 occured before "now" atomic { uint32_t now = call Alarm.getNow(), elapsed; if (t0 < now) elapsed = now - t0; else elapsed = ~(t0 - now) + 1; if (elapsed > dt) dt = elapsed; dt -= elapsed; call Alarm.start(dt); } } /******************** Defaults ****************************/ default async command void AlarmFrom.start(uint32_t dt){ } default async command void AlarmFrom.stop(){ } default async command bool AlarmFrom.isRunning(){ return FALSE;} default async event void Alarm.fired(){} default async command void AlarmFrom.startAt(uint32_t t0, uint32_t dt){ } default async command uint32_t AlarmFrom.getNow(){ return 0;} default async command uint32_t AlarmFrom.getAlarm(){ return 0;} } tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/timer/Alarm62500hz32VirtualizedC.nc000066400000000000000000000044671207233610700300160ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Alarm62500hzC is the alarm for async 62500hz alarms (virtualized) * * @author Cory Sharp * @author Jan Hauer * @see Please refer to TEP 102 for more information about this component and its * intended use. */ //#include "Timer.h" #include "Timer62500hz.h" generic configuration Alarm62500hz32VirtualizedC() { provides interface Alarm; } implementation { components Alarm32khzTo62500hzTransformC, Alarm32khz32VirtualizedP; enum { CLIENT_ID = unique(UQ_ALARM_32KHZ32), }; Alarm = Alarm32khzTo62500hzTransformC.Alarm[CLIENT_ID]; Alarm32khzTo62500hzTransformC.AlarmFrom[CLIENT_ID] -> Alarm32khz32VirtualizedP.Alarm[CLIENT_ID]; } tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/timer/HilTimer62500hzC.nc000066400000000000000000000044001207233610700260720ustar00rootroot00000000000000 /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * @author Cory Sharp * @author: Jan Hauer (62500hz) * @see Please refer to TEP 102 for more information about this component and its * intended use. */ #include "Timer.h" #include "Timer62500hz.h" configuration HilTimer62500hzC { provides interface Timer as Timer62500hz[ uint8_t num ]; } implementation { components new Alarm62500hz32VirtualizedC() as Alarm; components new AlarmToTimerC(T62500hz); components new VirtualizeTimerC(T62500hz,uniqueCount(UQ_TIMER_62500HZ)); Timer62500hz = VirtualizeTimerC; VirtualizeTimerC.TimerFrom -> AlarmToTimerC; AlarmToTimerC.Alarm -> Alarm; } tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/timer/LocalTime62500hzC.nc000066400000000000000000000005371207233610700262350ustar00rootroot00000000000000#include "Timer62500hz.h" configuration LocalTime62500hzC { provides interface LocalTime; } implementation { // should be done properly one day (not wasting an alarm slot) components new Alarm62500hz32VirtualizedC(), LocalTime62500hzP; LocalTime = LocalTime62500hzP; LocalTime62500hzP.Alarm -> Alarm62500hz32VirtualizedC.Alarm; } tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/timer/LocalTime62500hzP.nc000066400000000000000000000004241207233610700262450ustar00rootroot00000000000000#include "Timer62500hz.h" module LocalTime62500hzP { provides interface LocalTime; uses interface Alarm; } implementation { async command uint32_t LocalTime.get() { return call Alarm.getNow(); } async event void Alarm.fired(){} } tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/timer/Timer62500C.nc000066400000000000000000000041151207233610700250760ustar00rootroot00000000000000// $Id: Timer62500C.nc,v 1.2 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The virtualized 62500 Hz timer abstraction. Instantiating this * component gives an 62500 Hz granularity timer. * * @author Philip Levis * @author: Jan Hauer (62500hz) * @date January 16 2006 * @see TEP 102: Timers */ #include "Timer62500hz.h" generic configuration Timer62500C() { provides interface Timer; } implementation { components Timer62500P; Timer = Timer62500P.Timer62500[unique(UQ_TIMER_62500HZ)]; } tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/timer/Timer62500P.nc000066400000000000000000000037671207233610700251270ustar00rootroot00000000000000// $Id: Timer62500P.nc,v 1.2 2010-06-29 22:07:56 scipio Exp $ /* tab:4 * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* * * @author Philip Levis * @author Cory Sharp * @author: Jan Hauer (62500hz) * @date May 16 2005 */ #include "Timer.h" configuration Timer62500P { provides interface Timer as Timer62500[uint8_t id]; } implementation { components HilTimer62500hzC; Timer62500 = HilTimer62500hzC; } tinyos-2.1.2+dfsg/tos/platforms/telosb/mac/tkn154/timer/Timer62500hz.h000066400000000000000000000003611207233610700251630ustar00rootroot00000000000000#ifndef _H_Timer_62500hz_h #define _H_Timer_62500hz_h typedef struct { } T62500hz; #define UQ_ALARM_32KHZ32 "Virtual.32khz32Alarm" #define UQ_ALARM_62500HZ32 "Virtual.62500hzAlarm" #define UQ_TIMER_62500HZ "HilTimer62500hzC.Timer" #endif tinyos-2.1.2+dfsg/tos/platforms/telosb/platform.h000066400000000000000000000000001207233610700220500ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/tinynode/000077500000000000000000000000001207233610700204265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/tinynode/.platform000066400000000000000000000033461207233610700222610ustar00rootroot00000000000000# Includes that should take precedence come first. Platforms come before # chips because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. And because of that, the current platform's include directory # must be specified, otherwise its search order is last instead of first. push( @includes, qw( %T/platforms/tinynode/chips/xe1205 %T/platforms/tinynode/chips/mm74hc595 %T/platforms/tinynode/chips/at45db %T/chips/xe1205/conf %T/chips/xe1205/phy %T/chips/xe1205/mac %T/chips/xe1205 %T/chips/mm74hc595 %T/chips/msp430 %T/chips/msp430/adc12 %T/chips/msp430/dma %T/chips/msp430/pins %T/chips/msp430/timer %T/chips/msp430/usart %T/chips/msp430/sensors %T/chips/at45db %T/lib/timer %T/lib/serial %T/lib/adc %T/lib/power ) ); @opts = qw( -gcc=msp430-gcc -mmcu=msp430f1611 -fnesc-target=msp430 -fnesc-no-debug); push @opts, "-fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask" if !$with_scheduler_flag; push @opts, "-mingw-gcc" if $cygwin; #@commonplatforms = ("msp430"); $ENV{'CIL_MACHINE'} = "version_major=3 " . "version_minor=2 " . "version=msp430-3.2.3 " . "short=2,2 " . "int=2,2 " . "long=4,2 " . "long_long=8,2 " . "pointer=2,2 " . "enum=2,2 " . "float=4,2 " . "double=4,2 " . "long_double=4,2 " . "void=1,1 " . "fun=1,2 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/tinynode/ActiveMessageC.nc000066400000000000000000000055041207233610700235770ustar00rootroot00000000000000// $Id: ActiveMessageC.nc,v 1.6 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: ActiveMessageC.nc,v 1.6 2010-06-29 22:07:56 scipio Exp $ * */ /** * * The Active Message layer on the TinyNode platform. This is a naming wrapper * around the XE1205 Active Message layer. * * @author Philip Levis, Henri Dubois-Ferriere */ configuration ActiveMessageC { provides { interface SplitControl @atleastonce(); interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; } } implementation { components XE1205ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/DemoSensorC.nc000066400000000000000000000044241207233610700231350ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorC on the telosb platform provides a * voltage reading, using VoltageC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ * */ generic configuration DemoSensorC() { provides interface Read; } implementation { components new VoltageC() as DemoSensor; Read = DemoSensor; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/DemoSensorNowC.nc000066400000000000000000000045551207233610700236260ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorC on the telosb platform provides a * voltage reading, using VoltageC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ * */ generic configuration DemoSensorNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new Msp430InternalVoltageC() as DemoSensorNow; Resource = DemoSensorNow; ReadNow = DemoSensorNow; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/DemoSensorStreamC.nc000066400000000000000000000045041207233610700243100ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorStreamC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorStreamC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorStreamC on the telosb platform provides a * voltage reading, using VoltageStreamC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ * */ generic configuration DemoSensorStreamC() { provides interface ReadStream; } implementation { components new VoltageStreamC() as DemoSensor; ReadStream = DemoSensor; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/LedsP.nc000066400000000000000000000105071207233610700217620ustar00rootroot00000000000000// $Id: LedsP.nc,v 1.6 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The implementation of the standard LED mote abstraction. * * @author Joe Polastre * @author Philip Levis * @date March 21, 2005 */ module LedsP { provides { interface Init; interface Leds; } uses { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; } } implementation { #ifndef dbg #define dbg(n,msg) #endif command error_t Init.init() { atomic { dbg(DBG_BOOT, "LEDS: initialized.\n"); call Led0.makeOutput(); call Led1.makeOutput(); call Led2.makeOutput(); call Led0.clr(); call Led1.clr(); call Led2.clr(); } return SUCCESS; } async command void Leds.led0On() { dbg(DBG_LED, "LEDS: Led 0 on.\n"); call Led0.set(); } async command void Leds.led0Off() { dbg(DBG_LED, "LEDS: Led 0 off.\n"); call Led0.clr(); } async command void Leds.led0Toggle() { call Led0.toggle(); // this should be removed by dead code elimination when compiled for // the physical motes if (call Led0.get()) dbg(DBG_LED, "LEDS: Led 0 off.\n"); else dbg(DBG_LED, "LEDS: Led 0 on.\n"); } async command void Leds.led1On() { dbg(DBG_LED, "LEDS: Led 1 on.\n"); call Led1.set(); } async command void Leds.led1Off() { dbg(DBG_LED, "LEDS: Led 1 off.\n"); call Led1.clr(); } async command void Leds.led1Toggle() { call Led1.toggle(); if (call Led1.get()) dbg(DBG_LED, "LEDS: Led 1 off.\n"); else dbg(DBG_LED, "LEDS: Led 1 on.\n"); } async command void Leds.led2On() { dbg(DBG_LED, "LEDS: Led 2 on.\n"); call Led2.set(); } async command void Leds.led2Off() { dbg(DBG_LED, "LEDS: Led 2 off.\n"); call Led2.clr(); } async command void Leds.led2Toggle() { call Led2.toggle(); if (call Led2.get()) dbg(DBG_LED, "LEDS: Led 2 off.\n"); else dbg(DBG_LED, "LEDS: Led 2 on.\n"); } async command uint8_t Leds.get() { uint8_t rval; atomic { rval = 0; if (call Led0.get()) { rval |= LEDS_LED0; } if (call Led1.get()) { rval |= LEDS_LED1; } if (call Led2.get()) { rval |= LEDS_LED2; } return rval; } } async command void Leds.set(uint8_t val) { atomic { if (val & LEDS_LED0) { call Leds.led0On(); } else { call Leds.led0Off(); } if (val & LEDS_LED1) { call Leds.led1On(); } else { call Leds.led1Off(); } if (val & LEDS_LED2) { call Leds.led2On(); } else { call Leds.led2Off(); } } } } tinyos-2.1.2+dfsg/tos/platforms/tinynode/PlatformC.nc000066400000000000000000000036271207233610700226470ustar00rootroot00000000000000// $Id: PlatformC.nc,v 1.5 2010-06-29 22:07:56 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre and Cory Sharp */ #include "hardware.h" configuration PlatformC { provides interface Init; } implementation { components PlatformP , Msp430ClockC ; Init = PlatformP; PlatformP.Msp430ClockInit -> Msp430ClockC.Init; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/PlatformLedsC.nc000066400000000000000000000044311207233610700234510ustar00rootroot00000000000000// $Id: PlatformLedsC.nc,v 1.5 2010-06-29 22:07:56 scipio Exp $ /* Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre */ #include "hardware.h" configuration PlatformLedsC { provides interface GeneralIO as Led0; // red provides interface GeneralIO as Led1; // green provides interface GeneralIO as Led2; // yellow uses interface Init; } implementation { components HplMsp430GeneralIOC as GeneralIOC, new Msp430GpioC() as Led0Impl, new Msp430GpioC() as Led1Impl, new Msp430GpioC() as Led2Impl; Led0 = Led0Impl; Led0Impl -> GeneralIOC.Port15; Led1 = Led1Impl; Led1Impl -> GeneralIOC.Port23; Led2 = Led2Impl; Led2Impl -> GeneralIOC.Port24; components PlatformP; Init = PlatformP.LedsInit; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/PlatformP.nc000066400000000000000000000006271207233610700226610ustar00rootroot00000000000000#include "hardware.h" module PlatformP{ provides interface Init; uses interface Init as Msp430ClockInit; uses interface Init as LedsInit; } implementation { command error_t Init.init() { WDTCTL = WDTPW + WDTHOLD; call Msp430ClockInit.init(); TOSH_SET_PIN_DIRECTIONS(); call LedsInit.init(); return SUCCESS; } default command error_t LedsInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/tinynode/PlatformSerialC.nc000066400000000000000000000005521207233610700240010ustar00rootroot00000000000000configuration PlatformSerialC { provides interface StdControl; provides interface UartStream; } implementation { components new Msp430Uart1C() as UartC; UartStream = UartC; components TinyNodeSerialP; StdControl = TinyNodeSerialP; TinyNodeSerialP.Msp430UartConfigure <- UartC.Msp430UartConfigure; TinyNodeSerialP.Resource -> UartC.Resource; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/TinyNodeSerialP.nc000066400000000000000000000013341207233610700237620ustar00rootroot00000000000000module TinyNodeSerialP { provides interface StdControl; provides interface Msp430UartConfigure; uses interface Resource; } implementation { msp430_uart_union_config_t msp430_uart_tinynode_config = {{ubr: UBR_1MHZ_115200, umctl: UMCTL_1MHZ_115200, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0, utxe : 1, urxe : 1}}; command error_t StdControl.start(){ return call Resource.immediateRequest(); } command error_t StdControl.stop(){ call Resource.release(); return SUCCESS; } event void Resource.granted(){} async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig() { return &msp430_uart_tinynode_config; } } tinyos-2.1.2+dfsg/tos/platforms/tinynode/VoltageC.nc000066400000000000000000000040521207233610700224550ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * VoltageC is a common name for the Msp430InternalVoltageC voltage * sensor available on the telosb platform. * * To convert from ADC counts to actual voltage, divide by 4096 and * multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ generic configuration VoltageC() { provides interface Read; } implementation { components new Msp430InternalVoltageC(); Read = Msp430InternalVoltageC.Read; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/VoltageStreamC.nc000066400000000000000000000041021207233610700236250ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * VoltageC is a common name for the Msp430InternalVoltageC voltage * sensor available on the telosb platform. * * To convert from ADC counts to actual voltage, divide by 4096 and * multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ generic configuration VoltageStreamC() { provides interface ReadStream; } implementation { components new Msp430InternalVoltageC(); ReadStream = Msp430InternalVoltageC.ReadStream; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/chips/000077500000000000000000000000001207233610700215345ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/tinynode/chips/at45db/000077500000000000000000000000001207233610700226175ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/tinynode/chips/at45db/HplAt45dbC.nc000066400000000000000000000040211207233610700247300ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ configuration HplAt45dbC { provides interface HplAt45db; } implementation { components new HplAt45dbByteC(9), new Msp430Spi0C() as Spi, HplAt45dbP, HplMsp430GeneralIOC as MspGeneralIO, new Msp430GpioC() as Select; HplAt45db = HplAt45dbByteC; HplAt45dbByteC.Resource -> Spi; HplAt45dbByteC.FlashSpi -> Spi; HplAt45dbByteC.HplAt45dbByte -> HplAt45dbP; Select -> MspGeneralIO.Port47; HplAt45dbP.Select -> Select; HplAt45dbP.FlashSpi -> Spi; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/chips/at45db/HplAt45dbP.nc000066400000000000000000000043641207233610700247570ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ module HplAt45dbP { provides { interface HplAt45dbByte; } uses { interface SpiByte as FlashSpi; interface GeneralIO as Select; } } implementation { command void HplAt45dbByte.select() { call Select.clr(); } command void HplAt45dbByte.deselect() { call Select.set(); } task void idleTask() { uint8_t status; status = call FlashSpi.write(0); if (!(status & 0x80)) { post idleTask(); } else { signal HplAt45dbByte.idle(); } } command void HplAt45dbByte.waitIdle() { post idleTask(); } command bool HplAt45dbByte.getCompareStatus() { uint8_t status; status = call FlashSpi.write(0); return (!(status & 0x40)); } } tinyos-2.1.2+dfsg/tos/platforms/tinynode/chips/at45db/HplAt45db_chip.h000066400000000000000000000045011207233610700254620ustar00rootroot00000000000000// $Id: HplAt45db_chip.h,v 1.6 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef HPLAT45DB_CHIP_H #define HPLAT45DB_CHIP_H // flash characteristics enum { AT45_MAX_PAGES = 2048, AT45_PAGE_SIZE = 264, AT45_PAGE_SIZE_LOG2 = 8 // For those who want to ignore the last 8 bytes }; typedef uint16_t at45page_t; typedef uint16_t at45pageoffset_t; /* must fit 0 to AT45_PAGE_SIZE - 1 */ #endif tinyos-2.1.2+dfsg/tos/platforms/tinynode/chips/xe1205/000077500000000000000000000000001207233610700224605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/tinynode/chips/xe1205/HplXE1205InterruptsC.nc000066400000000000000000000045561207233610700265070ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * HPL implementation of interrupts for the Semtech * XE1205 radio connected to a TI MSP430 processor on the * tinynode platform. * * @author Henri Dubois-Ferriere * */ configuration HplXE1205InterruptsC { provides interface GpioInterrupt as Interrupt0; provides interface GpioInterrupt as Interrupt1; } implementation{ components HplMsp430InterruptC; components new Msp430InterruptC() as Interrupt0C; components new Msp430InterruptC() as Interrupt1C; Interrupt0C.HplInterrupt -> HplMsp430InterruptC.Port20; Interrupt1C.HplInterrupt -> HplMsp430InterruptC.Port21; Interrupt0 = Interrupt0C.Interrupt; Interrupt1 = Interrupt1C.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/chips/xe1205/HplXE1205PinsC.nc000066400000000000000000000067721207233610700252430ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * HPL implementation of general-purpose I/O for the Semtech XE1205 * radio connected to a TI MSP430 processor on a tinynode platform. * * @author Henri Dubois-Ferriere */ configuration HplXE1205PinsC { provides interface GeneralIO as Irq0Pin @atmostonce(); provides interface GeneralIO as Irq1Pin @atmostonce(); provides interface GeneralIO as AntSelTXPin @atmostonce(); provides interface GeneralIO as AntSelRXPin @atmostonce(); provides interface GeneralIO as DataPin @atmostonce(); provides interface GeneralIO as ModeSel0Pin @atmostonce(); provides interface GeneralIO as ModeSel1Pin @atmostonce(); provides interface GeneralIO as NssDataPin @atmostonce(); provides interface GeneralIO as NssConfigPin @atmostonce(); } implementation { components HplMsp430GeneralIOC; components new Msp430GpioC() as Irq0PinM; components new Msp430GpioC() as Irq1PinM; components new Msp430GpioC() as AntSelTXM; components new Msp430GpioC() as AntSelRXM; components new Msp430GpioC() as DataM; components new Msp430GpioC() as ModeSel0M; components new Msp430GpioC() as ModeSel1M; components new Msp430GpioC() as NssConfigM; components new Msp430GpioC() as NssDataM; Irq0PinM -> HplMsp430GeneralIOC.Port20; Irq1PinM -> HplMsp430GeneralIOC.Port21; AntSelTXM -> HplMsp430GeneralIOC.Port27; AntSelRXM -> HplMsp430GeneralIOC.Port26; DataM -> HplMsp430GeneralIOC.Port57; ModeSel0M -> HplMsp430GeneralIOC.Port34; ModeSel1M -> HplMsp430GeneralIOC.Port35; NssConfigM -> HplMsp430GeneralIOC.Port14; NssDataM -> HplMsp430GeneralIOC.Port10; Irq0Pin = Irq0PinM; Irq1Pin = Irq1PinM; AntSelTXPin = AntSelTXM; AntSelRXPin = AntSelRXM; DataPin = DataM; ModeSel0Pin = ModeSel0M; ModeSel1Pin = ModeSel1M; NssConfigPin = NssConfigM; NssDataPin = NssDataM; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/chips/xe1205/HplXE1205SpiC.nc000066400000000000000000000041651207233610700250570ustar00rootroot00000000000000/* * Copyright (c) 2006, Ecole Polytechnique Federale de Lausanne (EPFL), * Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /** * HPL implementation of the SPI bus for the Xemics XE1205 radio * connected to a TI MSP430 processor. * * @author Henri Dubois-Ferriere */ generic configuration HplXE1205SpiC() { provides interface Resource; provides interface SpiByte; provides interface SpiPacket; } implementation { components new Xe1205Spi0C() as SpiC; Resource = SpiC; SpiByte = SpiC; SpiPacket = SpiC; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/chips/xe1205/Xe1205Spi0C.nc000066400000000000000000000051541207233610700245320ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * An implementation of the SPI on USART0 for the MSP430. The current * implementation defaults not using the DMA and performing the SPI * transfers in software. To utilize the DMA, use Msp430SpiDma0P in * place of Msp430SpiNoDma0P. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2007-07-13 15:54:09 $ */ #include "msp430usart.h" generic configuration Xe1205Spi0C() { provides interface Resource; provides interface SpiByte; provides interface SpiPacket; uses interface Msp430SpiConfigure; } implementation { enum { CLIENT_ID = unique( MSP430_SPIO_BUS ), }; components Xe1205SpiNoDma0P as SpiP; Resource = SpiP.Resource[ CLIENT_ID ]; SpiByte = SpiP.SpiByte; SpiPacket = SpiP.SpiPacket[ CLIENT_ID ]; Msp430SpiConfigure = SpiP.Msp430SpiConfigure[ CLIENT_ID ]; components new Msp430Usart0C() as UsartC; SpiP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; SpiP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; SpiP.UsartInterrupts -> UsartC.HplMsp430UsartInterrupts; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/chips/xe1205/Xe1205SpiNoDma0P.nc000066400000000000000000000047531207233610700254720ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2007-07-13 15:54:09 $ */ configuration Xe1205SpiNoDma0P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[uint8_t id ]; provides interface SpiByte; provides interface SpiPacket[ uint8_t id ]; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430SpiConfigure[ uint8_t id ]; uses interface HplMsp430UsartInterrupts as UsartInterrupts; } implementation { components new Xe1205SpiNoDmaP() as SpiP; Resource = SpiP.Resource; ResourceConfigure = SpiP.ResourceConfigure; Msp430SpiConfigure = SpiP.Msp430SpiConfigure; SpiByte = SpiP.SpiByte; SpiPacket = SpiP.SpiPacket; UsartResource = SpiP.UsartResource; UsartInterrupts = SpiP.UsartInterrupts; components HplMsp430Usart0C as UsartC; SpiP.Usart -> UsartC; components LedsC as Leds; SpiP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/platforms/tinynode/chips/xe1205/Xe1205SpiNoDmaP.nc000066400000000000000000000152371207233610700254110ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Maxime Muller * @version $Revision: 1.1 $ $Date: 2007-07-13 15:54:09 $ * * nss_data toggling for each rx byte */ generic module Xe1205SpiNoDmaP() { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[ uint8_t id ]; provides interface SpiByte; provides interface SpiPacket[ uint8_t id ]; uses interface Resource as UsartResource[ uint8_t id ]; uses interface Msp430SpiConfigure[ uint8_t id ]; uses interface HplMsp430Usart as Usart; uses interface HplMsp430UsartInterrupts as UsartInterrupts; uses interface Leds; } implementation { enum { SPI_ATOMIC_SIZE = 2, }; norace uint8_t* m_tx_buf; norace uint8_t* m_rx_buf; norace uint16_t m_len; norace uint16_t m_pos; norace uint8_t m_client; void signalDone(); task void signalDone_task(); async command error_t Resource.immediateRequest[ uint8_t id ]() { return call UsartResource.immediateRequest[ id ](); } async command error_t Resource.request[ uint8_t id ]() { return call UsartResource.request[ id ](); } async command bool Resource.isOwner[ uint8_t id ]() { return call UsartResource.isOwner[ id ](); } async command error_t Resource.release[ uint8_t id ]() { return call UsartResource.release[ id ](); } async command void ResourceConfigure.configure[ uint8_t id ]() { call Usart.setModeSpi(call Msp430SpiConfigure.getConfig[id]()); } async command void ResourceConfigure.unconfigure[ uint8_t id ]() { call Usart.resetUsart(TRUE); call Usart.disableSpi(); call Usart.resetUsart(FALSE); } event void UsartResource.granted[ uint8_t id ]() { signal Resource.granted[ id ](); } async command uint8_t SpiByte.write( uint8_t tx ) { uint8_t byte; // we are in spi mode which is configured to have turned off interrupts // call Usart.disableRxIntr(); call Usart.tx( tx ); while( !call Usart.isRxIntrPending() ); call Usart.clrRxIntr(); byte = call Usart.rx(); // call Usart.enableRxIntr(); return byte; } default async command bool UsartResource.isOwner[ uint8_t id ]() { return FALSE; } default async command error_t UsartResource.request[ uint8_t id ]() { return FAIL; } default async command error_t UsartResource.immediateRequest[ uint8_t id ]() { return FAIL; } default async command error_t UsartResource.release[ uint8_t id ]() { return FAIL; } default async command msp430_spi_union_config_t* Msp430SpiConfigure.getConfig[uint8_t id]() { return &msp430_spi_default_config; } default event void Resource.granted[ uint8_t id ]() {} void continueOp() { uint8_t end; uint8_t tmp; atomic { TOSH_CLR_NSS_DATA_PIN(); call Usart.tx( 0 ); while( !call Usart.isRxIntrPending() ); TOSH_SET_NSS_DATA_PIN(); end = m_pos + SPI_ATOMIC_SIZE; if ( end > m_len ) end = m_len; while ( ++m_pos < end ) { TOSH_CLR_NSS_DATA_PIN(); call Usart.tx( 0 ); while( !call Usart.isRxIntrPending() ); tmp = call Usart.rx(); m_rx_buf[ m_pos - 1 ] = tmp; } } } inline void sendBuffer(uint8_t const* buffer_, int size_) { TOSH_CLR_NSS_DATA_PIN(); call Usart.isTxIntrPending(); call Usart.rx(); while(size_ > 0) { call Usart.tx(*buffer_); ++buffer_; --size_; while( !call Usart.isRxIntrPending() ); call Usart.rx(); } call Usart.disableRxIntr(); TOSH_SET_NSS_DATA_PIN(); } inline void readData() { uint8_t end; uint8_t tmp; atomic { TOSH_TOGGLE_YELLOW_LED_PIN(); call Usart.tx( 0 ); call Usart.isTxIntrPending(); call Usart.rx(); end = m_pos + SPI_ATOMIC_SIZE; if ( end > m_len ) end = m_len; while ( ++m_pos < end ) { TOSH_CLR_NSS_DATA_PIN(); call Usart.tx( 0 ); while( !call Usart.isRxIntrPending() ); tmp = call Usart.rx(); TOSH_SET_NSS_DATA_PIN(); m_rx_buf[ m_pos - 1 ] = tmp; } } } async command error_t SpiPacket.send[ uint8_t id ]( uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len ) { m_client = id; m_tx_buf = tx_buf; m_rx_buf = rx_buf; m_len = len; m_pos = 0; if (m_tx_buf) sendBuffer(m_tx_buf,m_len); else { call Usart.enableRxIntr(); continueOp(); } return SUCCESS; } task void signalDone_task() { atomic signalDone(); } async event void UsartInterrupts.rxDone( uint8_t data ) { if ( m_rx_buf ) { m_rx_buf[ m_pos-1 ] = data; } else return; TOSH_SET_NSS_DATA_PIN(); if ( m_pos < m_len ) { continueOp(); } else { call Usart.disableRxIntr(); signalDone(); } } void signalDone() { signal SpiPacket.sendDone[ m_client ]( m_tx_buf, m_rx_buf, m_len, SUCCESS ); } async event void UsartInterrupts.txDone() {} default async event void SpiPacket.sendDone[ uint8_t id ]( uint8_t* tx_buf, uint8_t* rx_buf, uint16_t len, error_t error ) {} } tinyos-2.1.2+dfsg/tos/platforms/tinynode/hardware.h000066400000000000000000000142701207233610700224000ustar00rootroot00000000000000/* * Copyright (c) 2005-2006, Ecole Polytechnique Federale de Lausanne (EPFL) * and Shockfish SA, Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * and Shockfish SA, nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ /* * Platform definitions for tinynode platform * * @author Remy Blank * @author Henri Dubois-Ferriere * @author Roger Meier * */ #ifndef _H_hardware_h #define _H_hardware_h #include "msp430hardware.h" // enum so components can override power saving, // as per TEP 112. enum { TOS_SLEEP_NONE = MSP430_POWER_ACTIVE, }; // XE1205 radio TOSH_ASSIGN_PIN(NSS_DATA, 1, 0); TOSH_ASSIGN_PIN(DATA, 5, 7); TOSH_ASSIGN_PIN(NSS_CONFIG, 1, 4); TOSH_ASSIGN_PIN(IRQ0, 2, 0); TOSH_ASSIGN_PIN(IRQ1, 2, 1); TOSH_ASSIGN_PIN(SW_RX, 2, 6); TOSH_ASSIGN_PIN(SW_TX, 2, 7); TOSH_ASSIGN_PIN(POR, 3, 0); TOSH_ASSIGN_PIN(SCK, 3, 3); TOSH_ASSIGN_PIN(SW0, 3, 4); TOSH_ASSIGN_PIN(SW1, 3, 5); // LED TOSH_ASSIGN_PIN(RED_LED, 1, 5); // on tinynode TOSH_ASSIGN_PIN(RED_LED2, 1, 6); // external, for compatibility with Mica TOSH_ASSIGN_PIN(GREEN_LED, 2, 3); TOSH_ASSIGN_PIN(YELLOW_LED, 2, 4); // TOSH_ASSIGN_PIN(RED_LED2, 1, 5); // external, for compatibility with Mica // TOSH_ASSIGN_PIN(GREEN_LED, 1, 3); // TOSH_ASSIGN_PIN(YELLOW_LED, 1, 2); // Other IO TOSH_ASSIGN_PIN(TEMPE, 5, 4); // optional temperature sensor TOSH_ASSIGN_PIN(NVSUPE, 5, 5); // voltage supply monitor TOSH_ASSIGN_PIN(NREGE, 5, 6); // voltage regulator enable // UART0 pins (shared with XE1205 radio) TOSH_ASSIGN_PIN(STE0, 3, 0); TOSH_ASSIGN_PIN(SIMO0, 3, 1); TOSH_ASSIGN_PIN(SOMI0, 3, 2); TOSH_ASSIGN_PIN(UCLK0, 3, 3); TOSH_ASSIGN_PIN(UTXD0, 3, 4); TOSH_ASSIGN_PIN(URXD0, 3, 5); // UART1 pins TOSH_ASSIGN_PIN(STE1, 5, 0); TOSH_ASSIGN_PIN(SIMO1, 5, 1); TOSH_ASSIGN_PIN(SOMI1, 5, 2); TOSH_ASSIGN_PIN(UCLK1, 5, 3); TOSH_ASSIGN_PIN(UTXD1, 3, 6); TOSH_ASSIGN_PIN(URXD1, 3, 7); // ADC TOSH_ASSIGN_PIN(TEMP, 6, 0); // channel 0: optional temperature sensor TOSH_ASSIGN_PIN(VSUP, 6, 1); // channel 1: supply monitor TOSH_ASSIGN_PIN(ADC2, 6, 2); TOSH_ASSIGN_PIN(ADC3, 6, 3); TOSH_ASSIGN_PIN(ADC4, 6, 4); TOSH_ASSIGN_PIN(ADC5, 6, 5); TOSH_ASSIGN_PIN(ADC6, 6, 6); TOSH_ASSIGN_PIN(ADC7, 6, 7); // External FLASH TOSH_ASSIGN_PIN(NFL_RST, 4, 6); TOSH_ASSIGN_PIN(NFL_CS, 4, 7); TOSH_ASSIGN_PIN(FLASH_RST, 4, 6); TOSH_ASSIGN_PIN(FLASH_CS, 4, 7); // PROGRAMMING PINS (tri-state) TOSH_ASSIGN_PIN(PROG_RX, 1, 1); TOSH_ASSIGN_PIN(PROG_TX, 2, 2); // Oscillator resistance TOSH_ASSIGN_PIN(ROSC, 2, 5); // unused TOSH_ASSIGN_PIN(P12, 1, 2); TOSH_ASSIGN_PIN(P13, 1, 3); TOSH_ASSIGN_PIN(P16, 1, 6); TOSH_ASSIGN_PIN(P23, 2, 3); TOSH_ASSIGN_PIN(P24, 2, 4); TOSH_ASSIGN_PIN(P40, 4, 0); TOSH_ASSIGN_PIN(P41, 4, 1); // unconnected TOSH_ASSIGN_PIN(NOT_CONNECTED1, 1, 7); TOSH_ASSIGN_PIN(NOT_CONNECTED2, 4, 2); TOSH_ASSIGN_PIN(NOT_CONNECTED3, 4, 3); TOSH_ASSIGN_PIN(NOT_CONNECTED4, 4, 4); TOSH_ASSIGN_PIN(NOT_CONNECTED5, 4, 5); void TOSH_SET_PIN_DIRECTIONS(void) { //LEDS TOSH_CLR_RED_LED_PIN(); TOSH_MAKE_RED_LED_OUTPUT(); // XE1205 radio // TOSH_SET_NSS_DATA_PIN(); // TOSH_MAKE_NSS_DATA_OUTPUT(); // TOSH_CLR_DATA_PIN(); // TOSH_MAKE_DATA_OUTPUT(); // TOSH_SET_NSS_CONFIG_PIN(); // TOSH_MAKE_NSS_CONFIG_OUTPUT(); // TOSH_CLR_IRQ0_PIN(); // TOSH_MAKE_IRQ0_OUTPUT(); // TOSH_CLR_IRQ1_PIN(); // TOSH_MAKE_IRQ1_OUTPUT(); // TOSH_CLR_SW_RX_PIN(); // TOSH_MAKE_SW_RX_OUTPUT(); // TOSH_CLR_SW_TX_PIN(); // TOSH_MAKE_SW_TX_OUTPUT(); TOSH_MAKE_POR_INPUT(); // SPI0 TOSH_CLR_SCK_PIN(); TOSH_MAKE_SCK_OUTPUT(); // antenna switch // TOSH_CLR_SW0_PIN(); // TOSH_MAKE_SW0_OUTPUT(); // TOSH_CLR_SW1_PIN(); // TOSH_MAKE_SW1_OUTPUT(); // optional temperature sensor TOSH_CLR_TEMPE_PIN(); TOSH_MAKE_TEMPE_OUTPUT(); TOSH_MAKE_TEMP_INPUT(); TOSH_SEL_TEMP_MODFUNC(); // voltage supply monitor TOSH_SET_NVSUPE_PIN(); TOSH_MAKE_NVSUPE_INPUT(); TOSH_MAKE_VSUP_INPUT(); TOSH_SEL_VSUP_MODFUNC(); // voltage regulator TOSH_SET_NREGE_PIN(); // disable regulator for low power mode TOSH_MAKE_NREGE_OUTPUT(); //UART PINS TOSH_MAKE_UTXD1_INPUT(); TOSH_MAKE_URXD1_INPUT(); TOSH_SEL_UTXD1_IOFUNC(); // External FLASH TOSH_SET_FLASH_RST_PIN(); TOSH_MAKE_FLASH_RST_OUTPUT(); TOSH_SET_FLASH_CS_PIN(); TOSH_MAKE_FLASH_CS_OUTPUT(); //PROG PINS TOSH_MAKE_PROG_RX_INPUT(); TOSH_MAKE_PROG_TX_INPUT(); // ROSC PIN TOSH_SET_ROSC_PIN(); TOSH_MAKE_ROSC_OUTPUT(); // set unconnected pins to avoid instability TOSH_SET_NOT_CONNECTED1_PIN(); TOSH_SET_NOT_CONNECTED2_PIN(); TOSH_SET_NOT_CONNECTED3_PIN(); TOSH_SET_NOT_CONNECTED4_PIN(); TOSH_SET_NOT_CONNECTED5_PIN(); TOSH_MAKE_NOT_CONNECTED1_OUTPUT(); TOSH_MAKE_NOT_CONNECTED2_OUTPUT(); TOSH_MAKE_NOT_CONNECTED3_OUTPUT(); TOSH_MAKE_NOT_CONNECTED4_OUTPUT(); TOSH_MAKE_NOT_CONNECTED5_OUTPUT(); } #endif // _H_hardware_h tinyos-2.1.2+dfsg/tos/platforms/tinynode/platform.h000066400000000000000000000000001207233610700224110ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/tinynode/platform_message.h000066400000000000000000000041761207233610700241370ustar00rootroot00000000000000/* * Copyright (c) 2005, Ecole Polytechnique Federale de Lausanne (EPFL) * and Shockfish SA, Switzerland. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Ecole Polytechnique Federale de Lausanne (EPFL) * and Shockfish SA, nor the names of its contributors may be used to * endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ======================================================================== */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include "XE1205.h" #include "Serial.h" typedef union message_header { xe1205_header_t xe1205; serial_header_t serial; } message_header_t; typedef union message_footer { xe1205_footer_t xe1205; } message_footer_t; typedef union message_metadata { xe1205_metadata_t xe1205; serial_metadata_t serial; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/ucmini/000077500000000000000000000000001207233610700200615ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/ucmini/.platform000066400000000000000000000031461207233610700217120ustar00rootroot00000000000000 push( @includes, qw( %T/platforms/ucmini %T/platforms/ucmini/chips/cp2102 %T/platforms/ucmini/chips/stm25p %T/platforms/ucmini/chips/sht21 %T/platforms/ucmini/chips/bh1750fvi %T/platforms/ucmini/chips/ms5607 %T/platforms/ucmini/chips/bma180 %T/chips/atm128rfa1 %T/chips/atm128rfa1/adc %T/chips/atm128rfa1/pins %T/chips/atm128rfa1/sensors %T/chips/atm128rfa1/timer %T/chips/atm128rfa1/radio %T/chips/atm128rfa1/i2c %T/chips/atm128rfa1/spi %T/chips/atm1281 %T/chips/atm1281/adc %T/chips/atm128 %T/chips/atm128/adc %T/chips/atm128/spi %T/chips/atm128/i2c %T/chips/atm128/timer %T/chips/cp2102 %T/chips/stm25p %T/chips/sht21 %T/chips/bh1750fvi %T/chips/ms5607 %T/chips/bma180 %T/lib/timer %T/lib/serial %T/lib/power %T/lib/rfxlink/layers %T/lib/rfxlink/util %T/lib/diagmsg ) ); @opts = qw( -gcc=avr-gcc -mmcu=atmega128rfa1 -fnesc-target=avr -fnesc-no-debug -fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask ); $ENV{'CIL_MACHINE'} = "version_major=4 " . "version_minor=1 " . "version=avr-4.1.2 " . "short=2,1, " . "int=2,1 " . "long=4,1 " . "long_long=8,1 " . "pointer=2,1 " . "enum=2,1 " . "float=4,1 " . "double=4,1 " . "long_double=4,1 " . "void=1,1 " . "fun=1,1 " . "wchar_size_size=2,2 " . "alignof_string=1 " . "max_alignment=1 " . "char_wchar_signed=true,true " . "const_string_literals=true " . "big_endian=false " . "underscore_name=false " . "__builtin_va_list=true " . "__thread_is_keyword=true"; tinyos-2.1.2+dfsg/tos/platforms/ucmini/ActiveMessageC.nc000066400000000000000000000037231207233610700232330ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Miklos Maroti */ #include configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[uint8_t id]; interface Receive[uint8_t id]; interface Receive as Snoop[uint8_t id]; interface SendNotifier[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketLink; interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; } } implementation { components RFA1ActiveMessageC as MessageC; SplitControl = MessageC; AMSend = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; SendNotifier = MessageC; Packet = MessageC; AMPacket = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketLink = MessageC; PacketTimeStampRadio = MessageC; PacketTimeStampMilli = MessageC; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/DemoSensorC.nc000066400000000000000000000033551207233610700225720ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ generic configuration DemoSensorC() { provides interface Read; } implementation { components Sht21C as Sensor; Read = Sensor.Temperature; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/DemoSensorNowC.nc000066400000000000000000000035001207233610700232460ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ generic configuration DemoSensorNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new AtmegaVoltageNowC() as DemoSensorC; Resource = DemoSensorC; ReadNow = DemoSensorC; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/DemoSensorStreamC.nc000066400000000000000000000034271207233610700237460ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ generic configuration DemoSensorStreamC() { provides interface ReadStream; } implementation { components new AtmegaTemperatureStreamC() as DemoSensorC; ReadStream = DemoSensorC; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/HplSerialAutoControlC.nc000066400000000000000000000037041207233610700245670ustar00rootroot00000000000000/** Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ configuration HplSerialAutoControlC { provides interface GpioInterrupt; provides interface GeneralIO; } implementation { components AtmegaPinChange0C, AtmegaGeneralIOC as IO; #if ( defined(SERIAL_AUTO_VDD) || UCMINI_REV==49 ) GpioInterrupt = AtmegaPinChange0C.GpioInterrupt[7]; GeneralIO = IO.PortB7; #else GpioInterrupt = AtmegaPinChange0C.GpioInterrupt[5]; GeneralIO = IO.PortB5; #endif }tinyos-2.1.2+dfsg/tos/platforms/ucmini/I2CBusPowerManagerC.nc000066400000000000000000000035511207233610700240510ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ configuration I2CBusPowerManagerC{ provides interface BusPowerManager; } implementation{ components AtmegaGeneralIOC as IO, new BusPowerManagerC(TRUE, FALSE); #if UCMINI_REV == 49 BusPowerManagerC.GeneralIO->IO.PortF2; #else BusPowerManagerC.GeneralIO->IO.PortF1; #endif BusPowerManager=BusPowerManagerC; }tinyos-2.1.2+dfsg/tos/platforms/ucmini/Leds.nc000066400000000000000000000115661207233610700213030ustar00rootroot00000000000000// $Id: Leds.nc,v 1.1 2010-11-18 21:57:02 andrasbiro Exp $ /* * Copyright (c) 2006 ETH Zurich. * Copyright (c) 2005-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Commands for controlling three LEDs. A platform can provide this * interface if it has more than or fewer than three LEDs. In the * former case, these commands refer to the first three LEDs. In the * latter case, some of the commands are null operations, and the set * of non-null operations must be contiguous and start at Led1. That * is, on platforms with 2 LEDs, LED 3's commands are null operations, * while on platforms with 1 LED, LED 2 and LED 3's commands are null * opertations. * * @author Joe Polastre * @author Philip Levis * @author Jan Beutel */ #include "Leds.h" interface Leds { /** * Turn on LED 0. The color of this LED depends on the platform. */ async command void led0On(); /** * Turn off LED 0. The color of this LED depends on the platform. */ async command void led0Off(); /** * Toggle LED 0; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led0Toggle(); /** * Turn on LED 1. The color of this LED depends on the platform. */ async command void led1On(); /** * Turn off LED 1. The color of this LED depends on the platform. */ async command void led1Off(); /** * Toggle LED 1; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led1Toggle(); /** * Turn on LED 2. The color of this LED depends on the platform. */ async command void led2On(); /** * Turn off LED 2. The color of this LED depends on the platform. */ async command void led2Off(); /** * Toggle LED 2; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led2Toggle(); /** * Turn on LED 3. The color of this LED depends on the platform. */ async command void led3On(); /** * Turn off LED 3. The color of this LED depends on the platform. */ async command void led3Off(); /** * Toggle LED 3; if it was off, turn it on, if was on, turn it off. * The color of this LED depends on the platform. */ async command void led3Toggle(); /** * Get the current LED settings as a bitmask. Each bit corresponds to * whether an LED is on; bit 0 is LED 0, bit 1 is LED 1, etc. You can * also use the enums LED_LED0, LED_LED1. For example, this expression * will determine whether LED 2 is on: * *
         (call Leds.get() & LEDS_LED2) 
        * * This command supports up to 8 LEDs; if a platform has fewer, then * those LEDs should always be off (their bit is zero). Also see * set(). */ async command uint8_t get(); /** * Set the current LED configuration using a bitmask. Each bit * corresponds to whether an LED is on; bit 0 is LED 0, bit 1 is LED * 1, etc. You can also use the enums LEDS_LED0, LEDS_LED1. For example, * this statement will configure the LEDs so LED 0 and LED 2 are on: * *
         call Leds.set(LEDS_LED0 | LEDS_LED2); 
        * * This statement will turn LED 1 on if it was not already: * *
        call Leds.set(call Leds.get() | LEDS_LED1);
        */ async command void set(uint8_t val); } tinyos-2.1.2+dfsg/tos/platforms/ucmini/LedsC.nc000066400000000000000000000040461207233610700214010ustar00rootroot00000000000000// $Id: LedsC.nc,v 1.1 2010-11-18 21:57:02 andrasbiro Exp $ /* * Copyright (c) 2006 ETH Zurich. * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Joe Polastre * @author Jan Beutel */ configuration LedsC { provides interface Leds; } implementation { components LedsP, PlatformLedsC; Leds = LedsP; LedsP.Init <- PlatformLedsC.Init; LedsP.Led0 -> PlatformLedsC.Led0; LedsP.Led1 -> PlatformLedsC.Led1; LedsP.Led2 -> PlatformLedsC.Led2; LedsP.Led3 -> PlatformLedsC.Led3; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/LedsP.nc000066400000000000000000000105131207233610700214120ustar00rootroot00000000000000// $Id: LedsP.nc,v 1.2 2010-11-18 21:57:02 andrasbiro Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The implementation of the standard 3 LED mote abstraction. * * @author Joe Polastre * @author Philip Levis * * @date March 21, 2005 */ module LedsP @safe() { provides { interface Init; interface Leds; } uses { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; interface GeneralIO as Led3; } } implementation { command error_t Init.init() { atomic { dbg("Init", "LEDS: initialized.\n"); call Led0.makeOutput(); call Led1.makeOutput(); call Led2.makeOutput(); call Led3.makeOutput(); call Led0.clr(); call Led1.clr(); call Led2.clr(); call Led3.clr(); } return SUCCESS; } /* Note: the call is inside the dbg, as it's typically a read of a volatile location, so can't be deadcode eliminated */ #define DBGLED(n) \ dbg("LedsC", "LEDS: Led" #n " %s.\n", call Led ## n .get() ? "off" : "on"); async command void Leds.led0On() { call Led0.set(); DBGLED(0); } async command void Leds.led0Off() { call Led0.clr(); DBGLED(0); } async command void Leds.led0Toggle() { call Led0.toggle(); DBGLED(0); } async command void Leds.led1On() { call Led1.set(); DBGLED(1); } async command void Leds.led1Off() { call Led1.clr(); DBGLED(1); } async command void Leds.led1Toggle() { call Led1.toggle(); DBGLED(1); } async command void Leds.led2On() { call Led2.set(); DBGLED(2); } async command void Leds.led2Off() { call Led2.clr(); DBGLED(2); } async command void Leds.led2Toggle() { call Led2.toggle(); DBGLED(2); } async command void Leds.led3On() { call Led3.set(); DBGLED(2); } async command void Leds.led3Off() { call Led3.clr(); DBGLED(3); } async command void Leds.led3Toggle() { call Led3.toggle(); DBGLED(3); } async command uint8_t Leds.get() { uint8_t rval; atomic { rval = 0; if (call Led0.get()) { rval |= LEDS_LED0; } if (call Led1.get()) { rval |= LEDS_LED1; } if (call Led2.get()) { rval |= LEDS_LED2; } if (call Led3.get()) { rval |= LEDS_LED3; } } return rval; } async command void Leds.set(uint8_t val) { atomic { if (val & LEDS_LED0) { call Leds.led0On(); } else { call Leds.led0Off(); } if (val & LEDS_LED1) { call Leds.led1On(); } else { call Leds.led1Off(); } if (val & LEDS_LED2) { call Leds.led2On(); } else { call Leds.led2Off(); } if (val & LEDS_LED3) { call Leds.led3On(); } else { call Leds.led3Off(); } } } } tinyos-2.1.2+dfsg/tos/platforms/ucmini/LocalIeeeEui64C.nc000066400000000000000000000044761207233610700231600ustar00rootroot00000000000000// $Id: LocalIeeeEui64C.nc,v 1.1 2010/02/23 06:45:38 sdhsdh Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE.* All rights reserved. * * Stephen Dawson-Haggerty * Dummy Extended Address for micaz */ #include "IeeeEui64.h" module LocalIeeeEui64C { provides interface LocalIeeeEui64; } implementation { command ieee_eui64_t LocalIeeeEui64.getId() { ieee_eui64_t id; /* this is UCB's OUI */ id.data[0] = 0x00; id.data[1] = 0x12; id.data[2] = 0x6d; /* UCB will let anyone use this OUI so long as these two octets are 'LO' -- "local". All other octets are reserved. */ /* SDH -- 9/10/2010 */ id.data[3] = 'L'; id.data[4] = 'O'; id.data[5] = 0; id.data[6] = TOS_NODE_ID >> 8; id.data[7] = TOS_NODE_ID & 0xff; return id; } } tinyos-2.1.2+dfsg/tos/platforms/ucmini/NoLedsC.nc000066400000000000000000000052241207233610700216750ustar00rootroot00000000000000// $Id: NoLedsC.nc,v 1.1 2010-11-19 10:02:09 andrasbiro Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A null operation replacement for the LedsC component. As many * components might concurrently signal information through LEDs, * using LedsC and NoLedsC allows an application builder to select * which components control the LEDs. * * @author Philip Levis * @date March 19, 2005 */ module NoLedsC { provides interface Init; provides interface Leds; } implementation { command error_t Init.init() {return SUCCESS;} async command void Leds.led0On() {} async command void Leds.led0Off() {} async command void Leds.led0Toggle() {} async command void Leds.led1On() {} async command void Leds.led1Off() {} async command void Leds.led1Toggle() {} async command void Leds.led2On() {} async command void Leds.led2Off() {} async command void Leds.led2Toggle() {} async command void Leds.led3On() {} async command void Leds.led3Off() {} async command void Leds.led3Toggle() {} async command uint8_t Leds.get() {return 0;} async command void Leds.set(uint8_t val) {} } tinyos-2.1.2+dfsg/tos/platforms/ucmini/PlatformC.nc000066400000000000000000000043021207233610700222710ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ configuration PlatformC { provides { interface Init; interface Atm128Calibrate; // TODO: should be moved to McuInitC } uses interface Init as LedsInit; } implementation { //initialization components PlatformP, McuInitC, MeasureClockC; Init = PlatformP; LedsInit = PlatformP.LedsInit; PlatformP.McuInit -> McuInitC; Atm128Calibrate = MeasureClockC; //turning off unused components components Stm25pOffC; PlatformP.Stm25pInit -> Stm25pOffC; #ifndef DISABLE_SERIAL_AUTO components SerialAutoControlC; #endif #ifndef DISABLE_SERIAL_RESET components SerialResetC; #endif } tinyos-2.1.2+dfsg/tos/platforms/ucmini/PlatformLed.h000066400000000000000000000034221207233610700224440ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef PLATFORMLED_H #define PLATFORMLED_H #define PLATFORM_LED_COUNT 4 #define PLATFORM_LED_RED 0 #define PLATFORM_LED_GREEN 1 #define PLATFORM_LED_YELLOW 2 #define PLATFORM_LED_ORANGE 3 #endif PLATFORMLED_H tinyos-2.1.2+dfsg/tos/platforms/ucmini/PlatformLedC.nc000066400000000000000000000037151207233610700227250ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Defines the Led and MultiLed interfaces in terms of the underlying * LedsC component. * * @author Peter A. Bigot */ configuration PlatformLedC { provides { interface MultiLed; interface Led[uint8_t led_id]; } } implementation { components LedsC; components PlatformLedP; MultiLed = PlatformLedP; Led = PlatformLedP; PlatformLedP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/PlatformLedP.nc000066400000000000000000000064401207233610700227400ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Defines the Led and MultiLed interfaces in terms of the underlying * LedsC component. * * @author Peter A. Bigot */ module PlatformLedP { provides { interface MultiLed; interface Led[uint8_t led_id]; } uses { interface Leds; } } implementation { async command void Led.on[ uint8_t led_id ] () { switch(led_id) { case 0: call Leds.led0On(); break; case 1: call Leds.led1On(); break; case 2: call Leds.led2On(); break; case 3: call Leds.led3On(); break; } } async command void Led.off[ uint8_t led_id ] () { switch(led_id) { case 0: call Leds.led0Off(); break; case 1: call Leds.led1Off(); break; case 2: call Leds.led2Off(); break; case 3: call Leds.led3Off(); break; } } async command void Led.set[ uint8_t led_id ] (bool turn_on) { if (turn_on) { call Led.on[led_id](); } else { call Led.off[led_id](); } } async command void Led.toggle[ uint8_t led_id ] () { switch(led_id) { case 0: call Leds.led0Toggle(); break; case 1: call Leds.led1Toggle(); break; case 2: call Leds.led2Toggle(); break; case 3: call Leds.led3Toggle(); break; } } async command unsigned int MultiLed.get () { return call Leds.get(); } async command void MultiLed.set (unsigned int val) { call Leds.set(val); } async command void MultiLed.on (unsigned int led_id) { call Led.on[led_id](); } async command void MultiLed.off (unsigned int led_id) { call Led.off[led_id](); } async command void MultiLed.setSingle (unsigned int led_id, bool turn_on) { call Led.set[led_id](turn_on); } async command void MultiLed.toggle (unsigned int led_id) { call Led.toggle[led_id](); } } tinyos-2.1.2+dfsg/tos/platforms/ucmini/PlatformLedsC.nc000066400000000000000000000043631207233610700231100ustar00rootroot00000000000000/* Copyright (c) 2009, Distributed Computing Group (DCG), ETH Zurich. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor the names of * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, * OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * * @author Roland Flury * @author Philipp Sommer * @author Richard Huber * @author Thomas Fahrni * @author Gabor Salamon */ configuration PlatformLedsC { provides { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; interface GeneralIO as Led3; } uses interface Init; } implementation { components AtmegaGeneralIOC as IO; components PlatformC; Init = PlatformC.LedsInit; #if UCMINI_REV == 49 Led0 = IO.PortE5; Led1 = IO.PortE6; Led2 = IO.PortE7; Led3 = IO.PortE3; #else Led0 = IO.PortE4; Led1 = IO.PortE5; Led2 = IO.PortE6; Led3 = IO.PortE7; #endif } tinyos-2.1.2+dfsg/tos/platforms/ucmini/PlatformP.nc000066400000000000000000000041301207233610700223050ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Martin Turon * @author Miklos Maroti */ #include "hardware.h" module PlatformP @safe() { provides interface Init; uses { interface Init as McuInit; interface Init as LedsInit; interface Init as Stm25pInit; } } implementation { command error_t Init.init() { error_t ok; ok = call McuInit.init(); ok = ecombine(ok, call Stm25pInit.init()); ok = ecombine(ok, call LedsInit.init()); return ok; } default command error_t LedsInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/ucmini/PlatformSerialC.nc000066400000000000000000000040211207233610700234270ustar00rootroot00000000000000/* * Copyright (c) 2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Alec Woo * @author Jonathan Hui * @version $Revision: 1.3 $ $Date: 2010-10-26 09:27:59 $ */ configuration PlatformSerialC { provides interface StdControl; provides interface UartStream; provides interface UartByte; } implementation { components Atm128Uart1C as UartC;//1 StdControl = UartC; UartStream = UartC; UartByte = UartC; components CounterMicro32C; UartC.Counter -> CounterMicro32C; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/RCCalibrate.nc000066400000000000000000000032501207233610700225160ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ interface RCCalibrate { async command void calibrateInternalRC(uint32_t HzToCalib); } tinyos-2.1.2+dfsg/tos/platforms/ucmini/RCCalibrateP.nc000066400000000000000000000131141207233610700226360ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ module RCCalibrateP { provides interface RCCalibrate; } implementation { enum { XTAL_FREQUENCY = 32768, EXTERNAL_TICKS = 100, DEFAULT_OSCCAL_MASK = 0x00, DEFAULT_OSCCAL_MASK_HIGH = 0x80, OSCCAL_BITS = 7, }; enum { LOOP_CYCLES = 7, }; #define CALIBRATION_METHOD_SIMPLE unsigned char neighborsSearched; //! The binary search step size unsigned char calStep; //! The lowest difference between desired and measured counter value unsigned char bestCountDiff = 0xFF; //! Stores the lowest difference between desired and measured counter value for the first search unsigned char bestCountDiff_first; //! The OSCCAL value corresponding to the bestCountDiff unsigned char bestOSCCAL; //! Stores the OSCCAL value corresponding to the bestCountDiff for the first search unsigned char bestOSCCAL_first; //! The desired counter value unsigned int countVal; //! Calibration status unsigned int calibration; //! Stores the direction of the binary step (-1 or 1) signed char sign; uint32_t calibrationFrequency; #define DEFAULT_OSCCAL_HIGH ((1 << (OSCCAL_BITS - 1)) | DEFAULT_OSCCAL_MASK_HIGH) #define INITIAL_STEP (1 << (OSCCAL_BITS - 2)) #define DEFAULT_OSCCAL ((1 << (OSCCAL_BITS - 1)) | DEFAULT_OSCCAL_MASK) inline void prepareCalibration(void) { calStep = INITIAL_STEP; calibration = 0; } #define COMPUTE_COUNT_VALUE() \ countVal = ((EXTERNAL_TICKS*calibrationFrequency)/(XTAL_FREQUENCY*LOOP_CYCLES)); // Set up timer to be ASYNCHRONOUS from the CPU clock with a second EXTERNAL 32,768kHz CRYSTAL driving it. No prescaling on asynchronous timer. #define SETUP_ASYNC_TIMER() \ ASSR |= (1< countVal) OSCCAL--; // If count is more than count value corresponding to the given frequency: NOP(); // - decrease speed if (count < countVal) OSCCAL++; NOP(); // If count is less: - increase speed if (count == countVal) cycles=1; } while(--cycles); // Calibrate using 128(0x80) calibration cycles #else #endif } async command void RCCalibrate.calibrateInternalRC(uint32_t HzToCalib) { calibrationFrequency = HzToCalib; CalibrationInit(); prepareCalibration(); CalibrateInternalRc(); } } tinyos-2.1.2+dfsg/tos/platforms/ucmini/README000066400000000000000000000015201207233610700207370ustar00rootroot00000000000000The ucmini platform has the following configuration options: DISABLE_SERIAL_AUTO You can disable the automatic serial control by defining this DISABLE_SERIAL_RESET You can disable the automatic serial reset by defining this SERIAL_AUTO_VDD You can change the automatic serial control detection mode by defining this: If you define this, the serial control checks the usb power, otherwise it checks the usb suspend signal (if you define this, the serial stack turns on if you plug your mote to a usb charger) UCMINI_REV The ucmini revison you use, multiplied by 100. Known revisions (default is the highest): 49: testboard 52: new ldo, accelerometer, leds moved, usb detection and Vbatt measurment changed 53: accelerometer connection changed 100: usb detection changed, pull-up resistors on i2c bus 101: switchable power for flash chip, user buttontinyos-2.1.2+dfsg/tos/platforms/ucmini/RadioConfig.h000066400000000000000000000057551207233610700224320ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * Copyright (c) 2010, Univeristy of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti * Author: Andras Biro */ #ifndef __RADIOCONFIG_H__ #define __RADIOCONFIG_H__ #include #include "TimerConfig.h" enum { /** * This is the default value of the CCA_MODE field in the PHY_CC_CCA register * which is used to configure the default mode of the clear channel assesment */ RFA1_CCA_MODE_VALUE = CCA_CS<HplSerialAutoControlC.GpioInterrupt; SerialAutoControlP.ControlPin->HplSerialAutoControlC.GeneralIO; SerialAutoControlP.SplitControl->SerialActiveMessageC; MainC.SoftwareInit -> SerialAutoControlP; #ifdef SERIAL_AUTO_DEBUG components LedsC; SerialAutoControlP.Leds->LedsC; #endif } tinyos-2.1.2+dfsg/tos/platforms/ucmini/SerialAutoControlP.nc000066400000000000000000000062341207233610700241410ustar00rootroot00000000000000/** Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ module SerialAutoControlP{ uses interface SplitControl; uses interface GpioInterrupt as ControlInt; uses interface GeneralIO as ControlPin; provides interface Init as SoftwareInit; #ifdef SERIAL_AUTO_DEBUG uses interface Leds; #endif } implementation{ bool isSerialOn; task void turnOn(){ error_t err=call SplitControl.start(); if(err!=SUCCESS&&err!=EALREADY) post turnOn(); else{ #ifdef SERIAL_AUTO_DEBUG call Leds.led3On(); #endif } } task void turnOff(){ error_t err=call SplitControl.stop(); if(err!=SUCCESS&&err!=EALREADY) post turnOff(); else{ #ifdef SERIAL_AUTO_DEBUG call Leds.led3Off(); #endif } } event void SplitControl.startDone(error_t err){ if(err!=SUCCESS) call SplitControl.start(); } event void SplitControl.stopDone(error_t err){ if(err!=SUCCESS) call SplitControl.stop(); } command error_t SoftwareInit.init(){ if(call ControlPin.get()){ isSerialOn=TRUE; post turnOn(); call ControlInt.enableFallingEdge(); } else { isSerialOn=FALSE; post turnOff(); call ControlInt.enableRisingEdge(); } return SUCCESS; } async event void ControlInt.fired(){ bool pinState=call ControlPin.get(); if(pinState && !isSerialOn ){ isSerialOn=TRUE; post turnOn(); call ControlInt.enableFallingEdge(); } else if ( !pinState && isSerialOn){ isSerialOn=FALSE; post turnOff(); call ControlInt.enableRisingEdge(); } #ifdef SERIAL_AUTO_DEBUG call Leds.led0Toggle(); #endif } }tinyos-2.1.2+dfsg/tos/platforms/ucmini/SerialResetC.nc000066400000000000000000000036761207233610700227440ustar00rootroot00000000000000/** Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ // just to make sure that fastserial can get its include file #include "Serial.h" configuration SerialResetC { } implementation { components SerialResetP, LedsC, SerialDispatcherC, MainC, PlatformSerialC; SerialResetP.Leds -> LedsC; SerialResetP.Send -> SerialDispatcherC.Send[0x72]; SerialResetP.Receive -> SerialDispatcherC.Receive[0x72]; SerialDispatcherC.SerialPacketInfo[0x72] -> SerialResetP; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/SerialResetP.nc000066400000000000000000000053141207233610700227500ustar00rootroot00000000000000/** Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ module SerialResetP { provides { interface SerialPacketInfo; } uses { interface Send; interface Receive; interface Leds; } } implementation { // this is dirty, but we do to save ram message_t* sendMsg; task void sendAck() { uint8_t* p = (uint8_t*)sendMsg; p[0] = 'Z'; p[1] = 'B'; p[2] = 'P'; if( call Send.send(sendMsg, 3) != SUCCESS ) post sendAck(); } event void Send.sendDone(message_t* msg, error_t error) { if( error != SUCCESS ) post sendAck(); else { //void (*bootloader)( void ) = (void*) BOOTLOADER_ADDRESS; atomic { //bootloader(); wdt_enable(1); while(1); } } } event message_t * Receive.receive(message_t *msg, void *payload, uint8_t len) { uint8_t* p = (uint8_t*)msg; if( len == 3 && p[0] == 'R' && p[1] == 'S' && p[2] == 'T' ) { sendMsg = msg; post sendAck(); } return msg; } async command uint8_t SerialPacketInfo.offset() { return 0; } async command uint8_t SerialPacketInfo.dataLinkLength(message_t* msg, uint8_t upperLen) { return upperLen; } async command uint8_t SerialPacketInfo.upperLength(message_t* msg, uint8_t dataLinkLen) { return dataLinkLen; } } tinyos-2.1.2+dfsg/tos/platforms/ucmini/TimeSyncMessageC.nc000066400000000000000000000044441207233610700235540ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Author: Miklos Maroti */ #include configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[uint8_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStampRadio; interface TimeSyncAMSend as TimeSyncAMSendRadio[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketRadio; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { components RFA1TimeSyncMessageC as MessageC; SplitControl = MessageC; Receive = MessageC.Receive; Snoop = MessageC.Snoop; Packet = MessageC; AMPacket = MessageC; PacketAcknowledgements = MessageC; LowPowerListening = MessageC; PacketTimeStampRadio = MessageC; TimeSyncAMSendRadio = MessageC; TimeSyncPacketRadio = MessageC; PacketTimeStampMilli = MessageC.PacketTimeStampMilli; TimeSyncAMSendMilli = MessageC.TimeSyncAMSendMilli; TimeSyncPacketMilli = MessageC.TimeSyncPacketMilli; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/UserButton.h000066400000000000000000000035121207233610700223450ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform * * @author Gilman Tolle * @version $Revision: 1.1 $ */ #ifndef USERBUTTON_H #define USERBUTTON_H typedef enum { BUTTON_RELEASED = 0, BUTTON_PRESSED = 1 } button_state_t; #endif tinyos-2.1.2+dfsg/tos/platforms/ucmini/UserButtonC.nc000066400000000000000000000040131207233610700226160ustar00rootroot00000000000000/** Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include #if defined(UCMINI_REV) && !(UCMINI_REV>=100) #error "There's no button on the ucmini rev<1.0" #endif configuration UserButtonC { provides interface Get; provides interface Notify; } implementation{ components UserButtonP, AtmegaPinChange0C, AtmegaGeneralIOC as IO, MainC; UserButtonP->AtmegaPinChange0C.GpioInterrupt[4]; UserButtonP->IO.PortB4; MainC.SoftwareInit->UserButtonP; Get=UserButtonP; Notify=UserButtonP; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/UserButtonP.nc000066400000000000000000000054171207233610700226440ustar00rootroot00000000000000/** Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ #include module UserButtonP{ uses interface GpioInterrupt as Irq; uses interface GeneralIO as Io; provides interface Init; provides interface Get; provides interface Notify; } implementation{ bool prevState; command error_t Init.init(){ call Io.set(); return SUCCESS; } command button_state_t Get.get() { if(!call Io.get()) return BUTTON_PRESSED; else return BUTTON_RELEASED; } command error_t Notify.enable(){ atomic { prevState=call Io.get(); if(prevState) call Irq.enableFallingEdge(); else call Irq.enableRisingEdge(); } return SUCCESS; } command error_t Notify.disable(){ call Irq.disable(); return SUCCESS; } task void NotifyReleased(){ signal Notify.notify( BUTTON_RELEASED ); } task void NotifyPressed(){ signal Notify.notify( BUTTON_PRESSED ); } async event void Irq.fired(){ bool pinState=call Io.get(); if(prevState!=pinState){ prevState=pinState; if(pinState){ call Irq.enableFallingEdge(); post NotifyReleased(); }else{ call Irq.enableRisingEdge(); post NotifyPressed(); } } } }tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/000077500000000000000000000000001207233610700211675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/bh1750fvi/000077500000000000000000000000001207233610700226025ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/bh1750fvi/HplBh1750C.nc000066400000000000000000000036161207233610700245470ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo, Andras Biro */ configuration HplBh1750C { provides interface I2CPacket; provides interface Resource; provides interface BusPowerManager; } implementation { components new Atm128I2CMasterC() as I2CBus, Bh1750fviC, I2CBusPowerManagerC; I2CPacket = I2CBus.I2CPacket; Resource = I2CBus.Resource; BusPowerManager = I2CBusPowerManagerC; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/bh1750fvi/LightC.nc000066400000000000000000000033021207233610700242740ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ generic configuration LightC() { provides interface Read; } implementation { components new Bh1750fviRawLightC(); Read=Bh1750fviRawLightC; }tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/bma180/000077500000000000000000000000001207233610700221575ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/bma180/HplBma180C.nc000066400000000000000000000040411207233610700241770ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ configuration HplBma180C{ provides interface GeneralIO as CSN; provides interface GeneralIO as PWR; provides interface GpioInterrupt as ACCINT; provides interface FastSpiByte; provides interface Resource; } implementation { components AtmegaGeneralIOC as IO, AtmegaPinChange0C, Atm128rfa1Usart0SpiC; CSN = IO.PortD7; PWR = IO.PortE3; ACCINT= AtmegaPinChange0C.GpioInterrupt[6]; Resource=Atm128rfa1Usart0SpiC.Resource[unique("Atm128SpiC.Resource")]; FastSpiByte=Atm128rfa1Usart0SpiC; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/ms5607/000077500000000000000000000000001207233610700221305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/ms5607/HplMs5607C.nc000066400000000000000000000037241207233610700241300ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ configuration HplMs5607C { provides interface I2CPacket ; provides interface Resource; provides interface BusPowerManager; } implementation { components new Atm128I2CMasterC() as I2CBus; I2CPacket = I2CBus.I2CPacket; Resource = I2CBus.Resource; components I2CBusPowerManagerC; //new DummyBusPowerManagerC(); BusPowerManager = I2CBusPowerManagerC; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/ms5607/PressureC.nc000066400000000000000000000035471207233610700243760ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ generic configuration PressureC() { provides interface Read; //You can't use the following interfaces if you're waiting for any readDone provides interface Set as SetPrecision; } implementation { components new Ms5607PressureC(); SetPrecision=Ms5607PressureC; Read=Ms5607PressureC.Read; }tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/sht21/000077500000000000000000000000001207233610700221305ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/sht21/HplSht21C.nc000066400000000000000000000036651207233610700241340ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo, Andras Biro */ configuration HplSht21C { provides interface I2CPacket ; provides interface Resource; provides interface BusPowerManager; } implementation { components new Atm128I2CMasterC() as I2CBus, I2CBusPowerManagerC; I2CPacket = I2CBus.I2CPacket; Resource = I2CBus.Resource; BusPowerManager = I2CBusPowerManagerC; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/sht21/HumidityC.nc000066400000000000000000000033031207233610700243500ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ generic configuration HumidityC() { provides interface Read; } implementation { components new Sht21RawHumidityC(); Read=Sht21RawHumidityC; }tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/sht21/TemperatureC.nc000066400000000000000000000033141207233610700250530ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ generic configuration TemperatureC() { provides interface Read; } implementation { components new Sht21RawTemperatureC(); Read=Sht21RawTemperatureC; }tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/stm25p/000077500000000000000000000000001207233610700223215ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/stm25p/HplStm25pPinsC.nc000066400000000000000000000044051207233610700253410ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of general-purpose I/O for a ST M25P chip * connected to a TI MSP430. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2010-11-18 23:16:35 $ */ configuration HplStm25pPinsC { provides interface GeneralIO as CSN; provides interface GeneralIO as Hold; #if (UCMINI_REV>100 || !defined(UCMINI_REV)) provides interface GeneralIO as Power; #endif } implementation { components AtmegaGeneralIOC as IO; components new NoPinC(); #if (UCMINI_REV==49||UCMINI_REV==52||UCMINI_REV==53) CSN = IO.PortB4; #else CSN = IO.PortB0; #endif #if (UCMINI_REV>100 || !defined(UCMINI_REV)) Power=IO.PortD6; #endif Hold = NoPinC; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/stm25p/HplStm25pSpiC.nc000066400000000000000000000040341207233610700251610ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of the Spi bus for a ST M25P chip connected to a * TI MSP430. * * @author Jonathan Hui * @version $Revision: 1.1 $ $Date: 2010-11-18 23:16:35 $ */ configuration HplStm25pSpiC { provides interface Resource; provides interface SpiByte; provides interface SpiPacket; } implementation { components Atm128SpiC as SpiC; Resource = SpiC.Resource[unique("Atm128SpiC.Resource")]; SpiByte = SpiC; SpiPacket = SpiC; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/stm25p/Stm25pOffC.nc000066400000000000000000000040451207233610700244760ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ configuration Stm25pOffC { provides interface Init as Stm25pOff; } implementation { components Stm25pOffP, HplStm25pPinsC as PinsC; Stm25pOff = Stm25pOffP; #if !defined(UCMINI_REV) || (UCMINI_REV > 100) Stm25pOffP.Toggle -> PinsC.Power; #else components HplStm25pSpiC as SpiC; Stm25pOffP.SpiResource -> SpiC; Stm25pOffP.SpiByte -> SpiC; //SpiP.SpiPacket -> SpiC; Stm25pOffP.CSN -> PinsC.CSN; Stm25pOffP.Hold -> PinsC.Hold; #endif } tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/stm25p/Stm25pOffP.nc000066400000000000000000000051071207233610700245130ustar00rootroot00000000000000/* * Copyright (c) 2010, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zsolt Szabo */ module Stm25pOffP { provides interface Init as Stm25pOff; #if !defined(UCMINI_REV) || (UCMINI_REV > 100) uses interface GeneralIO as Toggle; #else uses interface Resource as SpiResource; uses interface GeneralIO as CSN; uses interface GeneralIO as Hold; uses interface SpiByte; #endif } implementation { command error_t Stm25pOff.init() { #if !defined(UCMINI_REV) || (UCMINI_REV > 100) call Toggle.makeOutput(); call Toggle.set(); #else call CSN.makeOutput(); call Hold.makeOutput(); if(!uniqueCount("Stm25pOn")) { call SpiResource.request(); } #endif return SUCCESS; } #if (defined(UCMINI_REV) && UCMINI_REV<101) event void SpiResource.granted() { if(!uniqueCount("Stm25pOn")) {//we got the granted event if the real driver asks for the resource call CSN.clr(); call Hold.clr(); call SpiByte.write(0xb9);//deep sleep call CSN.set(); call Hold.set(); call SpiResource.release(); } } #endif } tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/stm25p/Stm25pPowerC.nc000066400000000000000000000040641207233610700250610ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ configuration Stm25pPowerC{ provides interface SplitControl; uses interface SplitControl as SpiControl; } implementation{ components Stm25pPowerP, MainC, HplStm25pPinsC; Stm25pPowerP.Init<-MainC.SoftwareInit; Stm25pPowerP.Power->HplStm25pPinsC.Power; #ifdef STM25P_HW_POWER_DISABLE SplitControl=SpiControl; #else components new TimerMilliC(); SplitControl=Stm25pPowerP; Stm25pPowerP.Timer->TimerMilliC; Stm25pPowerP.SpiControl=SpiControl; #endif }tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/stm25p/Stm25pPowerP.nc000066400000000000000000000064071207233610700251010ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ module Stm25pPowerP{ provides interface Init; uses interface GeneralIO as Power; #ifndef STM25P_HW_POWER_DISABLE provides interface SplitControl; uses interface SplitControl as SpiControl; uses interface Timer; #endif } implementation{ #ifdef STM25P_HW_POWER_DISABLE command error_t Init.init(){ call Power.makeOutput(); call Power.clr(); return SUCCESS; } #else bool spiOn=FALSE; bool powerOn=TRUE; command error_t Init.init(){ call Power.makeOutput(); call Power.set(); powerOn=FALSE; return SUCCESS; } command error_t SplitControl.start(){ error_t err; if(spiOn&&powerOn) return EALREADY; else if(spiOn||powerOn) return EBUSY; err=call SpiControl.start(); if(err==SUCCESS){ call Power.clr(); call Timer.startOneShot(10); } return err; } event void Timer.fired(){ powerOn=TRUE; if(spiOn) signal SplitControl.startDone(SUCCESS); } event void SpiControl.startDone(error_t err){ if(err==SUCCESS){ spiOn=TRUE; if(powerOn) signal SplitControl.startDone(SUCCESS); } else { call Timer.stop(); call Power.set(); signal SplitControl.startDone(err); } } task void signalStopDone(){ signal SplitControl.stopDone(SUCCESS); } command error_t SplitControl.stop(){ if((!spiOn)&&(!powerOn)) return EALREADY; else if((!spiOn)||(!powerOn)) return EBUSY; return call SpiControl.stop(); } event void SpiControl.stopDone(error_t err){ if(err==SUCCESS){ spiOn=FALSE; call Power.set(); powerOn=FALSE; } signal SplitControl.stopDone(err); } #endif } tinyos-2.1.2+dfsg/tos/platforms/ucmini/chips/stm25p/Stm25pSectorC.nc000066400000000000000000000054111207233610700252210ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the sector storage absraction for the ST M25P * serial code flash. * * @author Jonathan Hui * @version $Revision: 1.5 $ $Date: 2007-02-04 19:55:17 $ */ configuration Stm25pSectorC { provides interface Resource as ClientResource[ uint8_t id ]; provides interface Stm25pSector as Sector[ uint8_t id ]; provides interface Stm25pVolume as Volume[ uint8_t id ]; } implementation { components MainC; components Stm25pSectorP as SectorP; ClientResource = SectorP; Sector = SectorP; Volume = SectorP; components new FcfsArbiterC( "Stm25p.Volume" ) as ArbiterC; SectorP.Stm25pResource -> ArbiterC; components new SplitControlDeferredPowerManagerC( 1024 ) as PowerManagerC; PowerManagerC.ResourceDefaultOwner -> ArbiterC; PowerManagerC.ArbiterInfo -> ArbiterC; #if (defined(UCMINI_REV) && UCMINI_REV<101) PowerManagerC.SplitControl -> SectorP; #else components Stm25pPowerC; Stm25pPowerC.SpiControl -> SectorP; PowerManagerC.SplitControl -> Stm25pPowerC; #endif components Stm25pSpiC as SpiC; SectorP.SpiResource -> SpiC; SectorP.Spi -> SpiC; MainC.SoftwareInit -> SpiC; components LedsC as Leds; SectorP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/platforms/ucmini/hardware.h000066400000000000000000000044771207233610700220430ustar00rootroot00000000000000/** * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By * downloading, copying, installing or using the software you agree to * this license. If you do not agree to this license, do not download, * install, copy or use the software. * * Copyright (c) 2004-2005 Crossbow Technology, Inc. * Copyright (c) 2002-2003 Intel Corporation. * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written * agreement is hereby granted, provided that the above copyright * notice, the (updated) modification history and the author appear in * all copies of this source code. * * Permission is also granted to distribute this software under the * standard BSD license as contained in the TinyOS distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Jason Hill, Philip Levis, Nelson Lee, David Gay * @author Alan Broad * @author Matt Miller * @author Martin Turon */ #ifndef HARDWARE_H #define HARDWARE_H #include #include // enum so components can override power saving, // as per TEP 112. enum { TOS_SLEEP_NONE = ATM128_POWER_IDLE, }; #ifndef PLATFORM_BAUDRATE #define PLATFORM_BAUDRATE 115200L #endif // we have no external pullups #define ATM128_I2C_EXTERNAL_PULLDOWN TRUE #endif //HARDWARE_H tinyos-2.1.2+dfsg/tos/platforms/ucmini/platform.h000066400000000000000000000033711207233610700220620ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Miklos Maroti */ // disable watchdog timer at startup (see AVR132: Using the Enhanced Watchdog Timer) #include #define platform_bootstrap() { MCUSR = 0; wdt_disable(); } tinyos-2.1.2+dfsg/tos/platforms/ucmini/platform_message.h000066400000000000000000000026271207233610700235710ustar00rootroot00000000000000/* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include #include typedef union message_header { rfa1packet_header_t rfa1; serial_header_t serial; } message_header_t; typedef union message_footer { rfa1packet_footer_t rfa1; } message_footer_t; typedef union message_metadata { rfa1packet_metadata_t rfa1; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/platforms/z1/000077500000000000000000000000001207233610700171275ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/.platform000066400000000000000000000024341207233610700207570ustar00rootroot00000000000000push( @includes, qw( %T/platforms/z1 %T/platforms/z1/chips/msp430 %T/platforms/z1/chips/msp430/adc12 %T/platforms/z1/chips/msp430/usci %T/platforms/z1/chips/msp430/timer %T/platforms/z1/chips/adxl345 %T/platforms/z1/chips/cc2420 %T/platforms/z1/chips/sht11 %T/platforms/z1/chips/stm25p %T/platforms/z1/chips/tmp102 %T/chips/cc2420 %T/chips/cc2420/alarm %T/chips/cc2420/control %T/chips/cc2420/csma %T/chips/cc2420/interfaces %T/chips/cc2420/link %T/chips/cc2420/lowpan %T/chips/cc2420/lpl %T/chips/cc2420/packet %T/chips/cc2420/receive %T/chips/cc2420/spi %T/chips/cc2420/transmit %T/chips/cc2420/unique %T/chips/cc2420/security %T/chips/msp430 %T/chips/msp430/adc12 %T/chips/msp430/dma %T/chips/msp430/pins %T/chips/msp430/timer %T/chips/msp430/sensors %T/chips/msp430/x2xxx %T/chips/msp430/x2xxx/usci %T/chips/stm25p %T/chips/sht11 %T/chips/tmp102 %T/chips/adxl345 %T/lib/timer %T/lib/serial %T/lib/power ) ); @opts = qw( -gcc=msp430-gcc -fnesc-target=msp430 -fnesc-no-debug -fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask ); if (`msp430-gcc --version | grep 3.2.3`){ push (@opts, "-mmcu=msp430x2617", "-mdisable-hwmul"); } else { push (@opts, "-mmcu=msp430f2617"); } tinyos-2.1.2+dfsg/tos/platforms/z1/ActiveMessageC.nc000066400000000000000000000057341207233610700223050ustar00rootroot00000000000000/* * Copyright (c) 2004-2005 The Regents of the University of California. * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * * @author Philip Levis * @version $Id: ActiveMessageC.nc,v 1.8 2009/09/16 00:51:51 razvanm Exp $ */ /** * * The Active Message layer on the Telos platform. This is a naming wrapper * around the CC2420 Active Message layer. * */ #include "Timer.h" configuration ActiveMessageC { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface LowPowerListening; } } implementation { components CC2420ActiveMessageC as AM; SplitControl = AM; AMSend = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; LowPowerListening = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/platforms/z1/DemoSensorC.nc000066400000000000000000000045071207233610700216400ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * DemoSensorC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorC on the z1 platform provides a * voltage reading using BatteryC, * or * a temperature reading using * the TMP102 sensor. * * Works with Oscilloscope. * * @author: Jordi Soucheiron * @author: Antonio Linan */ generic configuration DemoSensorC() { provides interface Read; } implementation { components new BatteryC() as DemoSensor; Read = DemoSensor; /* components new SimpleTMP102C() as DemoSensor; Read = DemoSensor; */ } tinyos-2.1.2+dfsg/tos/platforms/z1/DemoSensorNowC.nc000066400000000000000000000046341207233610700223250ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorNowC is a generic sensor device that provides a 16-bit * value that can be read from async context. The platform author * chooses which sensor actually sits behind DemoSensorNowC, and * though it's probably Voltage, Light, or Temperature, there are no * guarantees. * * This particular DemoSensorNowC on the telosb platform provides a * voltage reading, using VoltageC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ * */ generic configuration DemoSensorNowC() { provides interface Resource; provides interface ReadNow; } implementation { components new Msp430InternalVoltageC() as DemoSensorNow; Resource = DemoSensorNow; ReadNow = DemoSensorNow; } tinyos-2.1.2+dfsg/tos/platforms/z1/DemoSensorStreamC.nc000066400000000000000000000044721207233610700230150ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * DemoSensorStreamC is a generic sensor device that provides a 16-bit * value. The platform author chooses which sensor actually sits * behind DemoSensorStreamC, and though it's probably Voltage, Light, or * Temperature, there are no guarantees. * * This particular DemoSensorStreamC on the z1 platform provides a * voltage reading, using VoltageStreamC. * * To convert from ADC counts to actual voltage, divide this reading * by 4096 and multiply by 3. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ * */ generic configuration DemoSensorStreamC() { provides interface ReadStream; } implementation { components new BatteryC() as DemoSensor; ReadStream = DemoSensor; } tinyos-2.1.2+dfsg/tos/platforms/z1/HplUserButtonC.nc000066400000000000000000000042761207233610700223430ustar00rootroot00000000000000/** * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telos platform * * @author Gilman Tolle * @version $Revision: 1.1 $ */ configuration HplUserButtonC { provides interface GeneralIO; provides interface GpioInterrupt; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components HplMsp430InterruptC as InterruptC; components new Msp430GpioC() as UserButtonC; UserButtonC -> GeneralIOC.Port25; GeneralIO = UserButtonC; components new Msp430InterruptC() as InterruptUserButtonC; InterruptUserButtonC.HplInterrupt -> InterruptC.Port25; GpioInterrupt = InterruptUserButtonC.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/z1/Ieee154MessageC.nc000066400000000000000000000044631207233610700221710ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Stephen Dawson-Haggerty */ configuration Ieee154MessageC { provides { interface SplitControl; interface Resource as SendResource[uint8_t clientId]; interface Ieee154Send; interface Receive as Ieee154Receive; interface Ieee154Packet; interface Packet; interface PacketAcknowledgements; interface LinkPacketMetadata; interface LowPowerListening; interface PacketLink; } } implementation { components CC2420Ieee154MessageC as Msg; SplitControl = Msg; SendResource = Msg; Ieee154Send = Msg; Ieee154Receive = Msg; Ieee154Packet = Msg; Packet = Msg; PacketAcknowledgements = Msg; LinkPacketMetadata = Msg; LowPowerListening = Msg; PacketLink = Msg; } tinyos-2.1.2+dfsg/tos/platforms/z1/LedsIntensity.nc000066400000000000000000000034541207233610700222550ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author: Xavier Orduna * @author: Jordi Soucheiron */ interface LedsIntensity { command void set( uint8_t ledNum, uint8_t intensity ); command void glow(uint8_t a, uint8_t b); } tinyos-2.1.2+dfsg/tos/platforms/z1/LedsIntensityC.nc000066400000000000000000000037311207233610700223560ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author: Xavier Orduna * @author: Jordi Soucheiron */ configuration LedsIntensityC { provides interface StdControl; provides interface LedsIntensity; } implementation { components new LedsIntensityP(), LedsC, MainC; StdControl = LedsIntensityP; LedsIntensity = LedsIntensityP; LedsIntensityP.Leds -> LedsC; LedsIntensityP.Boot -> MainC; } tinyos-2.1.2+dfsg/tos/platforms/z1/LedsIntensityP.nc000066400000000000000000000071251207233610700223740ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author: Xavier Orduna * @author: Jordi Soucheiron */ generic module LedsIntensityP() { provides interface StdControl; provides interface LedsIntensity; uses interface Leds; uses interface Boot; } implementation { enum { NUM_LEDS = 3, NUM_INTENSITY = 32, RESOLUTION = 128, }; bool m_run; int8_t m_intensity[NUM_LEDS]; int8_t m_accum[NUM_LEDS]; static const int8_t m_exp[NUM_INTENSITY] = { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 16, 19, 22, 26, 30, 36, 42, 49, 58, 67, 79, 93, 108, 127, }; void wait(uint16_t t) { for ( ; t > 0; t-- ); } void longwait( uint16_t t ) { for( ; t > 0; t-- ) wait(0xa0); } task void dimleds() { if( m_run ) { int i; int ledval = 0; for( i=NUM_LEDS-1; i>=0; i-- ) { ledval <<= 1; if( (m_accum[i] += m_intensity[i]) >= 0 ) { m_accum[i] -= (RESOLUTION-1); ledval |= 1; } } call Leds.set( ledval ); post dimleds(); } else { call Leds.set( 0 ); } } command void LedsIntensity.set( uint8_t ledNum, uint8_t intensity ) { if( ledNum < NUM_LEDS ) { intensity >>= 3; if( intensity >= (NUM_INTENSITY-1) ) { m_intensity[ledNum] = m_exp[NUM_INTENSITY-1]; m_accum[ledNum] = 0; } else { m_intensity[ledNum] = m_exp[intensity]; if( m_intensity[ledNum] == 0 ) m_accum[ledNum] = -1; } } } command void LedsIntensity.glow(uint8_t a, uint8_t b) { int i; for (i = 1536; i > 0; i -= 4) { call Leds.set(a); longwait(i); call Leds.set(b); longwait(1536-i); } } event void Boot.booted() { int i; for( i=0; i * Dummy Extended Address for micaz */ #include "IeeeEui64.h" module LocalIeeeEui64C { provides interface LocalIeeeEui64; } implementation { command ieee_eui64_t LocalIeeeEui64.getId() { ieee_eui64_t id; /* this is UCB's OUI */ id.data[0] = 0x00; id.data[1] = 0x12; id.data[2] = 0x6d; /* UCB will let anyone use this OUI so long as these two octets are 'LO' -- "local". All other octets are reserved. */ /* SDH -- 9/10/2010 */ id.data[3] = 'L'; id.data[4] = 'O'; id.data[5] = 0; id.data[6] = TOS_NODE_ID >> 8; id.data[7] = TOS_NODE_ID & 0xff; return id; } } tinyos-2.1.2+dfsg/tos/platforms/z1/Msp430Timer32khzMapC.nc000066400000000000000000000064361207233610700230740ustar00rootroot00000000000000/* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * MSP430Timer32khzMapC presents as paramaterized interfaces all of * the 32khz hardware timers on the MSP430 that are available for * compile time allocation by "new Alarm32khz16C()", "new * AlarmMilli32C()", and so on. * * Platforms based on the MSP430 are * encouraged to copy in and * override this file, presenting only the * hardware timers that are * available for allocation on that platform. * * @author Cory Sharp * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:44 $ */ configuration Msp430Timer32khzMapC { provides interface Msp430Timer[ uint8_t id ]; provides interface Msp430TimerControl[ uint8_t id ]; provides interface Msp430Compare[ uint8_t id ]; } implementation { components Msp430TimerC; Msp430Timer[0] = Msp430TimerC.TimerB; Msp430TimerControl[0] = Msp430TimerC.ControlB0; Msp430Compare[0] = Msp430TimerC.CompareB0; // Timer pin B1 is used by the CC2420 radio's SFD pin // this is the only difference between the default 32khz map // and the map on telos Msp430Timer[1] = Msp430TimerC.TimerB; Msp430TimerControl[1] = Msp430TimerC.ControlB2; Msp430Compare[1] = Msp430TimerC.CompareB2; Msp430Timer[2] = Msp430TimerC.TimerB; Msp430TimerControl[2] = Msp430TimerC.ControlB3; Msp430Compare[2] = Msp430TimerC.CompareB3; Msp430Timer[3] = Msp430TimerC.TimerB; Msp430TimerControl[3] = Msp430TimerC.ControlB4; Msp430Compare[3] = Msp430TimerC.CompareB4; Msp430Timer[4] = Msp430TimerC.TimerB; Msp430TimerControl[4] = Msp430TimerC.ControlB5; Msp430Compare[4] = Msp430TimerC.CompareB5; Msp430Timer[5] = Msp430TimerC.TimerB; Msp430TimerControl[5] = Msp430TimerC.ControlB6; Msp430Compare[5] = Msp430TimerC.CompareB6; } tinyos-2.1.2+dfsg/tos/platforms/z1/PlatformC.nc000066400000000000000000000035731207233610700213500ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author: Xavier Orduna * @author: Jordi Soucheiron */ #include "hardware.h" configuration PlatformC { provides interface Init; } implementation{ components PlatformP, Msp430ClockC; Init = PlatformP; PlatformP.Msp430ClockInit -> Msp430ClockC.Init; } tinyos-2.1.2+dfsg/tos/platforms/z1/PlatformLed.h000066400000000000000000000042001207233610700215050ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef _PLATFORM_Z1_LED_H_ #define _PLATFORM_Z1_LED_H_ /** Constants used in the generic LedC module to determine how many * named Led interfaces should be published. The value should match * the size of the table in PlatformLedsP, but we're not going to * guess that table's public name. */ #define PLATFORM_LED_COUNT 3 /** Map to the LED index for the red LED */ #define PLATFORM_LED_RED 0 /** Map to the LED index for the green LED */ #define PLATFORM_LED_GREEN 1 /** Map to the LED index for the blue LED */ #define PLATFORM_LED_BLUE 2 #endif // _PLATFORM_Z1_LED_H_ tinyos-2.1.2+dfsg/tos/platforms/z1/PlatformLedC.nc000066400000000000000000000037151207233610700217730ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Defines the Led and MultiLed interfaces in terms of the underlying * LedsC component. * * @author Peter A. Bigot */ configuration PlatformLedC { provides { interface MultiLed; interface Led[uint8_t led_id]; } } implementation { components LedsC; components PlatformLedP; MultiLed = PlatformLedP; Led = PlatformLedP; PlatformLedP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/z1/PlatformLedP.nc000066400000000000000000000062401207233610700220040ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ /** Defines the Led and MultiLed interfaces in terms of the underlying * LedsC component. * * @author Peter A. Bigot */ module PlatformLedP { provides { interface MultiLed; interface Led[uint8_t led_id]; } uses { interface Leds; } } implementation { async command void Led.on[ uint8_t led_id ] () { switch(led_id) { case 0: call Leds.led0On(); break; case 1: call Leds.led1On(); break; case 2: call Leds.led2On(); break; } } async command void Led.off[ uint8_t led_id ] () { switch(led_id) { case 0: call Leds.led0Off(); break; case 1: call Leds.led1Off(); break; case 2: call Leds.led2Off(); break; } } async command void Led.set[ uint8_t led_id ] (bool turn_on) { if (turn_on) { call Led.on[led_id](); } else { call Led.off[led_id](); } } async command void Led.toggle[ uint8_t led_id ] () { switch(led_id) { case 0: call Leds.led0Toggle(); break; case 1: call Leds.led1Toggle(); break; case 2: call Leds.led2Toggle(); break; } } async command unsigned int MultiLed.get () { return call Leds.get(); } async command void MultiLed.set (unsigned int val) { call Leds.set(val); } async command void MultiLed.on (unsigned int led_id) { call Led.on[led_id](); } async command void MultiLed.off (unsigned int led_id) { call Led.off[led_id](); } async command void MultiLed.setSingle (unsigned int led_id, bool turn_on) { call Led.set[led_id](turn_on); } async command void MultiLed.toggle (unsigned int led_id) { call Led.toggle[led_id](); } } tinyos-2.1.2+dfsg/tos/platforms/z1/PlatformLedsC.nc000066400000000000000000000045041207233610700221530ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author: Xavier Orduna * @author: Jordi Soucheiron */ #include "hardware.h" configuration PlatformLedsC { provides interface GeneralIO as Led0; provides interface GeneralIO as Led1; provides interface GeneralIO as Led2; uses interface Init; } implementation{ components HplMsp430GeneralIOC as GeneralIOC , new Msp430GpioC() as Led0Impl , new Msp430GpioC() as Led1Impl , new Msp430GpioC() as Led2Impl ; components PlatformP; Init = PlatformP.LedsInit; Led0 = Led0Impl; //THIS IS FOR THE ZOLERTIA OR TMOTE, CHANGED FOR THE FET LED Led0Impl -> GeneralIOC.Port54; Led1 = Led1Impl; Led1Impl -> GeneralIOC.Port56; Led2 = Led2Impl; Led2Impl -> GeneralIOC.Port55; } tinyos-2.1.2+dfsg/tos/platforms/z1/PlatformP.nc000066400000000000000000000041711207233610700213600ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2011 Eric B. Decker * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author: Xavier Orduna * @author: Jordi Soucheiron * @author: Eric B. Decker */ #include "hardware.h" module PlatformP{ provides interface Init; uses interface Init as Msp430ClockInit; uses interface Init as LedsInit; } implementation { command error_t Init.init() { WDTCTL = WDTPW + WDTHOLD; call Msp430ClockInit.init(); call LedsInit.init(); return SUCCESS; } default command error_t LedsInit.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/z1/PlatformSerialC.nc000066400000000000000000000042241207233610700225020ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2011 Eric B. Decker * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author: Xavier Orduna * @author: Jordi Soucheiron * @author: Eric B. Decker */ configuration PlatformSerialC { provides interface StdControl; provides interface UartStream; provides interface UartByte; } implementation { components new Msp430Uart0C() as UartC; UartStream = UartC; UartByte = UartC; components Z1SerialP; StdControl = Z1SerialP; Z1SerialP.Msp430UartConfigure <- UartC.Msp430UartConfigure; Z1SerialP.Resource -> UartC.Resource; } tinyos-2.1.2+dfsg/tos/platforms/z1/SwitchToggleC.nc000066400000000000000000000053621207233610700221650ustar00rootroot00000000000000/* * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Generic layer to translate a GIO into a toggle switch * * @author Gilman Tolle * @version $Revision: 1.1 $ */ #include generic module SwitchToggleC() { provides interface Get; provides interface Notify; uses interface GeneralIO; uses interface GpioInterrupt; } implementation { norace bool m_pinHigh; task void sendEvent(); command bool Get.get() { return call GeneralIO.get(); } command error_t Notify.enable() { call GeneralIO.makeInput(); if ( call GeneralIO.get() ) { m_pinHigh = TRUE; return call GpioInterrupt.enableFallingEdge(); } else { m_pinHigh = FALSE; return call GpioInterrupt.enableRisingEdge(); } } command error_t Notify.disable() { return call GpioInterrupt.disable(); } async event void GpioInterrupt.fired() { call GpioInterrupt.disable(); m_pinHigh = !m_pinHigh; post sendEvent(); } task void sendEvent() { bool pinHigh; pinHigh = m_pinHigh; signal Notify.notify( pinHigh ); if ( pinHigh ) { call GpioInterrupt.enableFallingEdge(); } else { call GpioInterrupt.enableRisingEdge(); } } } tinyos-2.1.2+dfsg/tos/platforms/z1/TimeSyncMessageC.nc000066400000000000000000000067621207233610700226270ustar00rootroot00000000000000// $Id: TimeSyncMessageC.nc,v 1.3 2010-06-29 22:07:55 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * The Active Message layer on the z1 platform. This is a naming wrapper * around the CC2420 Active Message layer that implemets timesync interface (TEP 133). * * @author Philip Levis * @author Brano Kusy * @date June 19 2005 */ configuration TimeSyncMessageC { provides { interface SplitControl; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; interface LowPowerListening; interface PacketTimeStamp as PacketTimeStamp32khz; interface PacketTimeStamp as PacketTimeStampMilli; interface TimeSyncAMSend as TimeSyncAMSend32khz[am_id_t id]; interface TimeSyncPacket as TimeSyncPacket32khz; interface TimeSyncAMSend as TimeSyncAMSendMilli[am_id_t id]; interface TimeSyncPacket as TimeSyncPacketMilli; } } implementation { #ifdef RFXLINK components CC2420XTimeSyncMessageC as AM; #else components CC2420TimeSyncMessageC as AM; #endif SplitControl = AM; Receive = AM.Receive; Snoop = AM.Snoop; Packet = AM; AMPacket = AM; PacketAcknowledgements = AM; LowPowerListening = AM; TimeSyncAMSend32khz = AM; TimeSyncAMSendMilli = AM; TimeSyncPacket32khz = AM; TimeSyncPacketMilli = AM; components CC2420PacketC; PacketTimeStamp32khz = CC2420PacketC; PacketTimeStampMilli = CC2420PacketC; } tinyos-2.1.2+dfsg/tos/platforms/z1/UserButton.h000066400000000000000000000035071207233610700214170ustar00rootroot00000000000000/* * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform * * @author Gilman Tolle * @version $Revision: 1.1 $ */ #ifndef USERBUTTON_H #define USERBUTTON_H typedef enum { BUTTON_RELEASED = 0, BUTTON_PRESSED = 1 } button_state_t; #endif tinyos-2.1.2+dfsg/tos/platforms/z1/UserButtonC.nc000066400000000000000000000050401207233610700216650ustar00rootroot00000000000000/* * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform. Get * returns the current state of the button by reading the pin, * regardless of whether enable() or disable() has been called on the * Interface. Notify.enable() and Notify.disable() modify the * underlying interrupt state of the pin, and have the effect of * enabling or disabling notifications that the button has changed * state. * * @author Gilman Tolle * @version $Revision: 1.1 $ */ #include configuration UserButtonC { provides interface Get; provides interface Notify; } implementation { components HplUserButtonC; components new SwitchToggleC(); SwitchToggleC.GpioInterrupt -> HplUserButtonC.GpioInterrupt; SwitchToggleC.GeneralIO -> HplUserButtonC.GeneralIO; components UserButtonP; Get = UserButtonP; Notify = UserButtonP; UserButtonP.GetLower -> SwitchToggleC.Get; UserButtonP.NotifyLower -> SwitchToggleC.Notify; } tinyos-2.1.2+dfsg/tos/platforms/z1/UserButtonP.nc000066400000000000000000000051621207233610700217070ustar00rootroot00000000000000/* * Copyright (c) 2007 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Implementation of the user button for the telosb platform * * @author Gilman Tolle * @version $Revision: 1.2 $ */ #include module UserButtonP { provides interface Get; provides interface Notify; uses interface Get as GetLower; uses interface Notify as NotifyLower; } implementation { command button_state_t Get.get() { // telosb user button pin is high when released - invert state if ( call GetLower.get() ) { return BUTTON_RELEASED; } else { return BUTTON_PRESSED; } } command error_t Notify.enable() { return call NotifyLower.enable(); } command error_t Notify.disable() { return call NotifyLower.disable(); } event void NotifyLower.notify( bool val ) { // telosb user button pin is high when released - invert state if ( val ) { signal Notify.notify( BUTTON_RELEASED ); } else { signal Notify.notify( BUTTON_PRESSED ); } } default event void Notify.notify( button_state_t val ) { } } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/000077500000000000000000000000001207233610700202355ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/chips/adxl345/000077500000000000000000000000001207233610700214215ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/chips/adxl345/HplADXL345C.nc000066400000000000000000000053601207233610700235020ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 20011 ZOLERTIA LABS * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Implementation of ADXL345 accelerometer, as a part of Zolertia Z1 mote * * Credits goes to DEXMA SENSORS SL * @author: Xavier Orduna * @author: Jordi Soucheiron * @author: Antonio Linan */ configuration HplADXL345C { provides interface GeneralIO as GeneralIO1; provides interface GeneralIO as GeneralIO2; provides interface GpioInterrupt as GpioInterrupt1; provides interface GpioInterrupt as GpioInterrupt2; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components HplMsp430InterruptC as InterruptC; components new Msp430GpioC() as ADXL345Int1C; ADXL345Int1C -> GeneralIOC.Port16; GeneralIO1 = ADXL345Int1C; components new Msp430GpioC() as ADXL345Int2C; ADXL345Int2C -> GeneralIOC.Port17; GeneralIO2 = ADXL345Int2C; components new Msp430InterruptC() as InterruptAccel1C; InterruptAccel1C.HplInterrupt -> InterruptC.Port16; GpioInterrupt1 = InterruptAccel1C.Interrupt; components new Msp430InterruptC() as InterruptAccel2C; InterruptAccel2C.HplInterrupt -> InterruptC.Port17; GpioInterrupt2 = InterruptAccel2C.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/cc2420/000077500000000000000000000000001207233610700211325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/chips/cc2420/HplCC2420AlarmC.nc000066400000000000000000000040211207233610700237720ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of 32khz alarms for the ChipCon CC2420 radio * connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:44 $ */ generic configuration HplCC2420AlarmC() { provides interface Init; provides interface Alarm as Alarm32khz32; } implementation { components new Alarm32khz32C(); Init = Alarm32khz32C; Alarm32khz32 = Alarm32khz32C; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/cc2420/HplCC2420InterruptsC.nc000066400000000000000000000052401207233610700251210ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of interrupts and captures for the ChipCon * CC2420 radio connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:44 $ */ configuration HplCC2420InterruptsC { provides interface GpioCapture as CaptureSFD; provides interface GpioInterrupt as InterruptCCA; provides interface GpioInterrupt as InterruptFIFOP; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components Msp430TimerC; components new GpioCaptureC() as CaptureSFDC; CaptureSFDC.Msp430TimerControl -> Msp430TimerC.ControlB1; CaptureSFDC.Msp430Capture -> Msp430TimerC.CaptureB1; CaptureSFDC.GeneralIO -> GeneralIOC.Port41; components HplMsp430InterruptC; components new Msp430InterruptC() as InterruptCCAC; components new Msp430InterruptC() as InterruptFIFOPC; InterruptCCAC.HplInterrupt -> HplMsp430InterruptC.Port14; InterruptFIFOPC.HplInterrupt -> HplMsp430InterruptC.Port12; CaptureSFD = CaptureSFDC.Capture; InterruptCCA = InterruptCCAC.Interrupt; InterruptFIFOP = InterruptFIFOPC.Interrupt; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/cc2420/HplCC2420PinsC.nc000066400000000000000000000057371207233610700236660ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of general-purpose I/O for the ChipCon CC2420 * radio connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:44 $ */ configuration HplCC2420PinsC { provides interface GeneralIO as CCA; provides interface GeneralIO as CSN; provides interface GeneralIO as FIFO; provides interface GeneralIO as FIFOP; provides interface GeneralIO as RSTN; provides interface GeneralIO as SFD; provides interface GeneralIO as VREN; } implementation { components HplMsp430GeneralIOC as GeneralIOC; components new Msp430GpioC() as CCAM; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as FIFOM; components new Msp430GpioC() as FIFOPM; components new Msp430GpioC() as RSTNM; components new Msp430GpioC() as SFDM; components new Msp430GpioC() as VRENM; /* Zoul CCAM -> GeneralIOC.Port14; CSNM -> GeneralIOC.Port42; FIFOM -> GeneralIOC.Port13; FIFOPM -> GeneralIOC.Port10; RSTNM -> GeneralIOC.Port46; SFDM -> GeneralIOC.Port41; VRENM -> GeneralIOC.Port45; */ // Z1 CCAM -> GeneralIOC.Port14; CSNM -> GeneralIOC.Port30; FIFOM -> GeneralIOC.Port13; FIFOPM -> GeneralIOC.Port12; RSTNM -> GeneralIOC.Port46; SFDM -> GeneralIOC.Port41; VRENM -> GeneralIOC.Port45; CCA = CCAM; CSN = CSNM; FIFO = FIFOM; FIFOP = FIFOPM; RSTN = RSTNM; SFD = SFDM; VREN = VRENM; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/cc2420/HplCC2420SpiC.nc000066400000000000000000000040411207233610700234730ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of the SPI bus for the ChipCon CC2420 radio * connected to a TI MSP430 processor. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:44 $ */ generic configuration HplCC2420SpiC() { provides interface Resource; provides interface SpiByte; provides interface SpiPacket; } implementation { components new Msp430SpiB0C() as SpiC; Resource = SpiC; SpiByte = SpiC; SpiPacket = SpiC; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/000077500000000000000000000000001207233610700212635ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/McuSleepC.nc000066400000000000000000000111431207233610700234250ustar00rootroot00000000000000/* * Copyright (c) 2011 Eric B. Decker * Copyright (c) 2009-2010 DEXMA SENSORS SL * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Implementation of TEP 112 (Microcontroller Power Management) for * the MSP430. Code for low power calculation copied from older * msp430hardware.h by Vlado Handziski, Joe Polastre, and Cory Sharp. * * * @author Philip Levis * @author Vlado Handziski * @author Joe Polastre * @author Cory Sharp * @author Xavier Orduna * @author Eric B. Decker */ module McuSleepC @safe() { provides { interface McuSleep; interface McuPowerState; } uses { interface McuPowerOverride; } } implementation { bool dirty = TRUE; mcu_power_t powerState = MSP430_POWER_ACTIVE; /* Note that the power values are maintained in an order * based on their active components, NOT on their values.*/ // NOTE: This table should be in progmem. const uint16_t msp430PowerBits[MSP430_POWER_LPM4 + 1] = { 0, // ACTIVE SR_CPUOFF, // LPM0 SR_SCG0+SR_CPUOFF, // LPM1 SR_SCG1+SR_CPUOFF, // LPM2 SR_SCG1+SR_SCG0+SR_CPUOFF, // LPM3 SR_SCG1+SR_SCG0+SR_OSCOFF+SR_CPUOFF, // LPM4 }; mcu_power_t getPowerState() { mcu_power_t pState = MSP430_POWER_LPM3; // TimerA, USCI check if ((((TACCTL0 & CCIE) || (TACCTL1 & CCIE) || (TACCTL2 & CCIE)) && ((TACTL & TASSEL_3) == TASSEL_2)) || ((UCA0CTL1 & UCSSEL_3) != UCSSEL_0) || ((UCA1CTL1 & UCSSEL_3) != UCSSEL_0) || ((UCB0CTL1 & UCSSEL_3) != UCSSEL_0) || ((UCB1CTL1 & UCSSEL_3) != UCSSEL_0) ) pState = MSP430_POWER_LPM1; #if defined(__msp430_have_adc12) || defined(__MSP430_HAS_ADC12__) // ADC12 check, pre-condition: pState != MSP430_POWER_ACTIVE if (ADC12CTL0 & ADC12ON){ if (ADC12CTL1 & ADC12SSEL_2){ // sample or conversion operation with MCLK or SMCLK if (ADC12CTL1 & ADC12SSEL_1) pState = MSP430_POWER_LPM1; else pState = MSP430_POWER_ACTIVE; } else if ((ADC12CTL1 & SHS0) && ((TACTL & TASSEL_3) == TASSEL_2)){ // Timer A is used as sample-and-hold source and SMCLK sources Timer A // (Timer A interrupts are always disabled when it is used by the // ADC subsystem, that's why the Timer check above is not enough) pState = MSP430_POWER_LPM1; } } #endif return pState; } void computePowerState() { powerState = mcombine(getPowerState(), call McuPowerOverride.lowestState()); } async command void McuSleep.sleep() { uint16_t temp; if (dirty) { computePowerState(); //dirty = 0; } temp = msp430PowerBits[powerState] | SR_GIE; __asm__ __volatile__( "bis %0, r2" : : "m" (temp) ); // All of memory may change at this point... asm volatile ("" : : : "memory"); __nesc_disable_interrupt(); } async command void McuPowerState.update() { atomic dirty = 1; } default async command mcu_power_t McuPowerOverride.lowestState() { return MSP430_POWER_LPM4; } } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/adc12/000077500000000000000000000000001207233610700221555ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/adc12/BatteryC.nc000066400000000000000000000041521207233610700242160ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author: Xavier Orduna * @author: Jordi Soucheiron */ generic configuration BatteryC() { provides interface DeviceMetadata; provides interface Read; provides interface ReadStream; } implementation { components new AdcReadClientC(); Read = AdcReadClientC; components new AdcReadStreamClientC(); ReadStream = AdcReadStreamClientC; components BatteryP; DeviceMetadata = BatteryP; AdcReadClientC.AdcConfigure -> BatteryP; AdcReadStreamClientC.AdcConfigure -> BatteryP; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/adc12/BatteryP.nc000066400000000000000000000045031207233610700242330ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author: Xavier Orduna * @author: Jordi Soucheiron */ #include "Msp430Adc12.h" module BatteryP { provides interface DeviceMetadata; provides interface AdcConfigure; } implementation { msp430adc12_channel_config_t config = { inch: SUPPLY_VOLTAGE_HALF_CHANNEL, sref: REFERENCE_VREFplus_AVss, ref2_5v: REFVOLT_LEVEL_1_5, adc12ssel: SHT_SOURCE_ACLK, adc12div: SHT_CLOCK_DIV_1, sht: SAMPLE_HOLD_4_CYCLES, sampcon_ssel: SAMPCON_SOURCE_SMCLK, sampcon_id: SAMPCON_CLOCK_DIV_1 }; command uint8_t DeviceMetadata.getSignificantBits() { return 12; } async command const msp430adc12_channel_config_t* AdcConfigure.getConfiguration() { return &config; } } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/adc12/Msp430Adc12ImplP.nc000066400000000000000000000513771207233610700252170ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitaet Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * - Revision ------------------------------------------------------------- * $Revision: 1.14 $ * $Date: 2008-11-10 14:56:12 $ * @author: Jan Hauer * ======================================================================== */ #include module Msp430Adc12ImplP @safe() { provides { interface Init; interface Msp430Adc12SingleChannel as SingleChannel[uint8_t id]; interface Msp430Adc12MultiChannel as MultiChannel[uint8_t id]; interface Msp430Adc12Overflow as Overflow[uint8_t id]; interface AsyncStdControl as DMAExtension[uint8_t id]; } uses { interface ArbiterInfo as ADCArbiterInfo; interface HplAdc12; interface Msp430Timer as TimerA;; interface Msp430TimerControl as ControlA0; interface Msp430TimerControl as ControlA1; interface Msp430Compare as CompareA0; interface Msp430Compare as CompareA1; interface HplMsp430GeneralIO as Port60; interface HplMsp430GeneralIO as Port61; interface HplMsp430GeneralIO as Port62; interface HplMsp430GeneralIO as Port63; interface HplMsp430GeneralIO as Port64; interface HplMsp430GeneralIO as Port65; interface HplMsp430GeneralIO as Port66; interface HplMsp430GeneralIO as Port67; } } implementation { #if defined(PLATFORM_Z1) #warning Msp430Adc12ImplP shadowed at z1/chips/msp430 #endif #ifdef ADC12_TIMERA_ENABLED #warning Accessing TimerA for ADC12 #endif enum { SINGLE_DATA = 1, SINGLE_DATA_REPEAT = 2, MULTIPLE_DATA = 4, MULTIPLE_DATA_REPEAT = 8, MULTI_CHANNEL = 16, CONVERSION_MODE_MASK = 0x1F, ADC_BUSY = 32, /* request pending */ USE_TIMERA = 64, /* TimerA used for SAMPCON signal */ ADC_OVERFLOW = 128, }; uint8_t state; /* see enum above */ uint16_t resultBufferLength; /* length of buffer */ uint16_t *COUNT_NOK(resultBufferLength) resultBufferStart; uint16_t resultBufferIndex; /* offset into buffer */ uint8_t numChannels; /* number of channels (multi-channel conversion) */ uint8_t clientID; /* ID of client that called getData() */ command error_t Init.init() { adc12ctl0_t ctl0; atomic { // stop any ongoing conversion (conversion data -if any- is unreliable) call HplAdc12.stopConversion(); // clear pending interrupt flags (potential relict from SW reset / PUC) // call HplAdc12.resetIFGs(); ctl0 = call HplAdc12.getCtl0(); ctl0.adc12tovie = 1; ctl0.adc12ovie = 1; call HplAdc12.setCtl0(ctl0); } return SUCCESS; } void prepareTimerA(uint16_t interval, uint16_t csSAMPCON, uint16_t cdSAMPCON) { #ifdef ADC12_TIMERA_ENABLED msp430_compare_control_t ccResetSHI = { ccifg : 0, cov : 0, out : 0, cci : 0, ccie : 0, outmod : 0, cap : 0, clld : 0, scs : 0, ccis : 0, cm : 0 }; call TimerA.setMode(MSP430TIMER_STOP_MODE); call TimerA.clear(); call TimerA.disableEvents(); call TimerA.setClockSource(csSAMPCON); call TimerA.setInputDivider(cdSAMPCON); call ControlA0.setControl(ccResetSHI); call CompareA0.setEvent(interval-1); call CompareA1.setEvent((interval-1)/2); #endif } void startTimerA() { #ifdef ADC12_TIMERA_ENABLED msp430_compare_control_t ccSetSHI = { ccifg : 0, cov : 0, out : 1, cci : 0, ccie : 0, outmod : 0, cap : 0, clld : 0, scs : 0, ccis : 0, cm : 0 }; msp430_compare_control_t ccResetSHI = { ccifg : 0, cov : 0, out : 0, cci : 0, ccie : 0, outmod : 0, cap : 0, clld : 0, scs : 0, ccis : 0, cm : 0 }; msp430_compare_control_t ccRSOutmod = { ccifg : 0, cov : 0, out : 0, cci : 0, ccie : 0, outmod : 7, cap : 0, clld : 0, scs : 0, ccis : 0, cm : 0 }; // manually trigger first conversion, then switch to Reset/set conversionMode call ControlA1.setControl(ccResetSHI); call ControlA1.setControl(ccSetSHI); //call ControlA1.setControl(ccResetSHI); call ControlA1.setControl(ccRSOutmod); call TimerA.setMode(MSP430TIMER_UP_MODE); // go! #endif } void configureAdcPin( uint8_t inch ) { #ifdef ADC12_P6PIN_AUTO_CONFIGURE switch (inch) { case 0: call Port60.selectModuleFunc(); call Port60.makeInput(); break; case 1: call Port61.selectModuleFunc(); call Port61.makeInput(); break; case 2: call Port62.selectModuleFunc(); call Port62.makeInput(); break; case 3: call Port63.selectModuleFunc(); call Port63.makeInput(); break; case 4: call Port64.selectModuleFunc(); call Port64.makeInput(); break; case 5: call Port65.selectModuleFunc(); call Port65.makeInput(); break; case 6: call Port66.selectModuleFunc(); call Port66.makeInput(); break; case 7: call Port67.selectModuleFunc(); call Port67.makeInput(); break; } #endif } void resetAdcPin( uint8_t inch ) { #ifdef ADC12_P6PIN_AUTO_CONFIGURE switch (inch) { case 0: call Port60.selectIOFunc(); break; case 1: call Port61.selectIOFunc(); break; case 2: call Port62.selectIOFunc(); break; case 3: call Port63.selectIOFunc(); break; case 4: call Port64.selectIOFunc(); break; case 5: call Port65.selectIOFunc(); break; case 6: call Port66.selectIOFunc(); break; case 7: call Port67.selectIOFunc(); break; } #endif } async command error_t SingleChannel.configureSingle[uint8_t id]( const msp430adc12_channel_config_t *config) { error_t result = ERESERVE; #ifdef ADC12_CHECK_ARGS if (!config) return EINVAL; #endif atomic { if (state & ADC_BUSY) return EBUSY; if (call ADCArbiterInfo.userId() == id){ adc12ctl1_t ctl1 = { adc12busy: 0, conseq: 0, adc12ssel: config->adc12ssel, adc12div: config->adc12div, issh: 0, shp: 1, shs: 0, cstartadd: 0 }; adc12memctl_t memctl = { inch: config->inch, sref: config->sref, eos: 1 }; adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); ctl0.msc = 1; ctl0.sht0 = config->sht; ctl0.sht1 = config->sht; state = SINGLE_DATA; call HplAdc12.setCtl0(ctl0); call HplAdc12.setCtl1(ctl1); call HplAdc12.setMCtl(0, memctl); call HplAdc12.setIEFlags(0x01); result = SUCCESS; } } return result; } async command error_t SingleChannel.configureSingleRepeat[uint8_t id]( const msp430adc12_channel_config_t *config, uint16_t jiffies) { error_t result = ERESERVE; #ifdef ADC12_CHECK_ARGS #ifndef ADC12_TIMERA_ENABLED if (jiffies>0) return EINVAL; #endif if (!config || jiffies == 1 || jiffies == 2) return EINVAL; #endif atomic { if (state & ADC_BUSY) return EBUSY; if (call ADCArbiterInfo.userId() == id) { adc12ctl1_t ctl1 = { adc12busy: 0, conseq: 2, adc12ssel: config->adc12ssel, adc12div: config->adc12div, issh: 0, shp: 1, shs: (jiffies == 0) ? 0 : 1, cstartadd: 0 }; adc12memctl_t memctl = { inch: config->inch, sref: config->sref, eos: 1 }; adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); ctl0.msc = (jiffies == 0) ? 1 : 0; ctl0.sht0 = config->sht; ctl0.sht1 = config->sht; state = SINGLE_DATA_REPEAT; call HplAdc12.setCtl0(ctl0); call HplAdc12.setCtl1(ctl1); call HplAdc12.setMCtl(0, memctl); call HplAdc12.setIEFlags(0x01); if (jiffies){ state |= USE_TIMERA; prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id); } result = SUCCESS; } } return result; } async command error_t SingleChannel.configureMultiple[uint8_t id]( const msp430adc12_channel_config_t *config, uint16_t *buf, uint16_t length, uint16_t jiffies) { error_t result = ERESERVE; #ifdef ADC12_CHECK_ARGS #ifndef ADC12_TIMERA_ENABLED if (jiffies>0) return EINVAL; #endif if (!config || !buf || !length || jiffies == 1 || jiffies == 2) return EINVAL; #endif atomic { if (state & ADC_BUSY) return EBUSY; if (call ADCArbiterInfo.userId() == id){ adc12ctl1_t ctl1 = { adc12busy: 0, conseq: (length > 16) ? 3 : 1, adc12ssel: config->adc12ssel, adc12div: config->adc12div, issh: 0, shp: 1, shs: (jiffies == 0) ? 0 : 1, cstartadd: 0 }; adc12memctl_t memctl = { inch: config->inch, sref: config->sref, eos: 0 }; uint16_t i, mask = 1; adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); ctl0.msc = (jiffies == 0) ? 1 : 0; ctl0.sht0 = config->sht; ctl0.sht1 = config->sht; state = MULTIPLE_DATA; resultBufferStart = NULL; resultBufferLength = length; resultBufferStart = buf; resultBufferIndex = 0; call HplAdc12.setCtl0(ctl0); call HplAdc12.setCtl1(ctl1); for (i=0; i<(length-1) && i < 15; i++) call HplAdc12.setMCtl(i, memctl); memctl.eos = 1; call HplAdc12.setMCtl(i, memctl); call HplAdc12.setIEFlags(mask << i); if (jiffies){ state |= USE_TIMERA; prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id); } result = SUCCESS; } } return result; } async command error_t SingleChannel.configureMultipleRepeat[uint8_t id]( const msp430adc12_channel_config_t *config, uint16_t *buf, uint8_t length, uint16_t jiffies) { error_t result = ERESERVE; #ifdef ADC12_CHECK_ARGS #ifndef ADC12_TIMERA_ENABLED if (jiffies>0) return EINVAL; #endif if (!config || !buf || !length || length > 16 || jiffies == 1 || jiffies == 2) return EINVAL; #endif atomic { if (state & ADC_BUSY) return EBUSY; if (call ADCArbiterInfo.userId() == id){ adc12ctl1_t ctl1 = { adc12busy: 0, conseq: 3, adc12ssel: config->adc12ssel, adc12div: config->adc12div, issh: 0, shp: 1, shs: (jiffies == 0) ? 0 : 1, cstartadd: 0 }; adc12memctl_t memctl = { inch: config->inch, sref: config->sref, eos: 0 }; uint16_t i, mask = 1; adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); ctl0.msc = (jiffies == 0) ? 1 : 0; ctl0.sht0 = config->sht; ctl0.sht1 = config->sht; state = MULTIPLE_DATA_REPEAT; resultBufferStart = NULL; resultBufferLength = length; resultBufferStart = buf; resultBufferIndex = 0; call HplAdc12.setCtl0(ctl0); call HplAdc12.setCtl1(ctl1); for (i=0; i<(length-1) && i < 15; i++) call HplAdc12.setMCtl(i, memctl); memctl.eos = 1; call HplAdc12.setMCtl(i, memctl); call HplAdc12.setIEFlags(mask << i); if (jiffies){ state |= USE_TIMERA; prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id); } result = SUCCESS; } } return result; } async command error_t SingleChannel.getData[uint8_t id]() { atomic { if (call ADCArbiterInfo.userId() == id){ if ((state & MULTIPLE_DATA_REPEAT) && !resultBufferStart) return EINVAL; if (state & ADC_BUSY) return EBUSY; state |= ADC_BUSY; clientID = id; configureAdcPin((call HplAdc12.getMCtl(0)).inch); call HplAdc12.startConversion(); if (state & USE_TIMERA) startTimerA(); return SUCCESS; } } return FAIL; } async command error_t MultiChannel.configure[uint8_t id]( const msp430adc12_channel_config_t *config, adc12memctl_t *memctl, uint8_t numMemctl, uint16_t *buf, uint16_t numSamples, uint16_t jiffies) { error_t result = ERESERVE; #ifdef ADC12_CHECK_ARGS #ifndef ADC12_TIMERA_ENABLED if (jiffies>0) return EINVAL; #endif if (!config || !memctl || !numMemctl || numMemctl > 15 || !numSamples || !buf || jiffies == 1 || jiffies == 2 || numSamples % (numMemctl+1) != 0) return EINVAL; #endif atomic { if (state & ADC_BUSY) return EBUSY; if (call ADCArbiterInfo.userId() == id){ adc12ctl1_t ctl1 = { adc12busy: 0, conseq: (numSamples > numMemctl+1) ? 3 : 1, adc12ssel: config->adc12ssel, adc12div: config->adc12div, issh: 0, shp: 1, shs: (jiffies == 0) ? 0 : 1, cstartadd: 0 }; adc12memctl_t firstMemctl = { inch: config->inch, sref: config->sref, eos: 0 }; uint16_t i, mask = 1; adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); ctl0.msc = (jiffies == 0) ? 1 : 0; ctl0.sht0 = config->sht; ctl0.sht1 = config->sht; state = MULTI_CHANNEL; resultBufferStart = NULL; resultBufferLength = numSamples; resultBufferStart = buf; resultBufferIndex = 0; numChannels = numMemctl+1; call HplAdc12.setCtl0(ctl0); call HplAdc12.setCtl1(ctl1); call HplAdc12.setMCtl(0, firstMemctl); for (i=0; i<(numMemctl-1) && i < 14; i++){ memctl[i].eos = 0; call HplAdc12.setMCtl(i+1, memctl[i]); } memctl[i].eos = 1; call HplAdc12.setMCtl(i+1, memctl[i]); call HplAdc12.setIEFlags(mask << (i+1)); if (jiffies){ state |= USE_TIMERA; prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id); } result = SUCCESS; } } return result; } async command error_t MultiChannel.getData[uint8_t id]() { uint8_t i; atomic { if (call ADCArbiterInfo.userId() == id){ if (!resultBufferStart) return EINVAL; if (state & ADC_BUSY) return EBUSY; state |= ADC_BUSY; clientID = id; for (i=0; i 16) length = 16; else length = resultBufferLength - resultBufferIndex; do { *resultBuffer++ = call HplAdc12.getMem(i); } while (++i < length); resultBufferIndex += length; if (overflow || resultBufferLength == resultBufferIndex){ stopConversion(); resultBuffer -= resultBufferIndex; k = resultBufferIndex - length; resultBufferIndex = 0; signal SingleChannel.multipleDataReady[clientID](resultBuffer, overflow ? k : resultBufferLength); } else if (resultBufferLength - resultBufferIndex > 15) return; else { // last sequence < 16 samples adc12memctl_t memctl = call HplAdc12.getMCtl(0); memctl.eos = 1; call HplAdc12.setMCtl(resultBufferLength - resultBufferIndex, memctl); } } break; case MULTIPLE_DATA_REPEAT: { uint8_t i = 0; resultBuffer = resultBufferStart; do { *resultBuffer++ = call HplAdc12.getMem(i); } while (++i < resultBufferLength); resultBufferStart = signal SingleChannel.multipleDataReady[clientID]( resultBuffer-resultBufferLength, overflow ? 0 : resultBufferLength); if (!resultBufferStart) stopConversion(); break; } #endif default: stopConversion(); break; } // switch } default async event error_t SingleChannel.singleDataReady[uint8_t id](uint16_t data) { return FAIL; } default async event uint16_t* SingleChannel.multipleDataReady[uint8_t id]( uint16_t *buf, uint16_t numSamples) { return 0; } default async event void MultiChannel.dataReady[uint8_t id](uint16_t *buffer, uint16_t numSamples) {}; default async event void Overflow.memOverflow[uint8_t id](){} default async event void Overflow.conversionTimeOverflow[uint8_t id](){} } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/timer/000077500000000000000000000000001207233610700224035ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/timer/Msp430ClockP.nc000066400000000000000000000160041207233610700250100ustar00rootroot00000000000000//$Id: Msp430ClockP.nc,v 1.9 2010-06-29 22:07:45 scipio Exp $ /* * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Cory Sharp * @author Vlado Handziski * @author Xavier Orduna */ #include #include "Msp430XDcoCalib.h" #include "Msp430Timer.h" module Msp430ClockP @safe() { provides interface Init; provides interface Msp430ClockInit; provides interface McuPowerOverride; } implementation { MSP430REG_NORACE(IE1); MSP430REG_NORACE(TACTL); MSP430REG_NORACE(TAIV); MSP430REG_NORACE(TBCTL); MSP430REG_NORACE(TBIV); enum { ACLK_CALIB_PERIOD = 8, TARGET_DCO_DELTA = (TARGET_DCO_KHZ / ACLK_KHZ) * ACLK_CALIB_PERIOD, }; async command mcu_power_t McuPowerOverride.lowestState() { return MSP430_POWER_LPM3; } command void Msp430ClockInit.defaultSetupDcoCalibrate() { // --- setup --- TACTL = TASSEL1 | MC1; // source SMCLK, continuous mode, everything else 0 TBCTL = TBSSEL0 | MC1; BCSCTL1 = XT2OFF | RSEL2; BCSCTL2 = 0; TBCCTL0 = CM0; } command void Msp430ClockInit.defaultInitClocks() { //check if calib tables are OK if(CALBC1_8MHZ != 0xFF) { DCOCTL = 0x00; BCSCTL1 = CALBC1_8MHZ; //Set DCO to 8MHz DCOCTL = CALDCO_8MHZ; } else { //start using reasonable values at 8 Mhz DCOCTL = 0x00; BCSCTL1 = 0x8D; DCOCTL = 0x88; } // BCSCTL1 // .XT2OFF = 1; disable the external oscillator for SCLK and MCLK // .XTS = 0; set low frequency mode for LXFT1 // .DIVA = 0; set the divisor on ACLK to 1 // .RSEL, do not modify //BCSCTL1 = XT2OFF | (BCSCTL1 & (RSEL2|RSEL1|RSEL0)); BCSCTL1 = XT2OFF | (BCSCTL1); // BCSCTL2 // .SELM = 0; select DCOCLK as source for MCLK // .DIVM = 0; set the divisor of MCLK to 1 // .SELS = 0; select DCOCLK as source for SCLK // .DIVS = 2; set the divisor of SCLK to 4 // .DCOR = 0; select internal resistor for DCO //BCSCTL2 = DIVS1; //BCSCTL2 = DIVS1 | 0x01; // IE1.OFIE = 0; no interrupt for oscillator fault CLR_FLAG( IE1, OFIE ); } command void Msp430ClockInit.defaultInitTimerA() { TAR = 0; // TACTL // .TACLGRP = 0; each TACL group latched independently // .CNTL = 0; 16-bit counter // .TASSEL = 2; source SMCLK = DCO/4 // .ID = 0; input divisor of 1 // .MC = 0; initially disabled // .TACLR = 0; reset timer A // .TAIE = 1; enable timer A interrupts TACTL = TASSEL1 | TAIE; } command void Msp430ClockInit.defaultInitTimerB() { TBR = 0; // TBCTL // .TBCLGRP = 0; each TBCL group latched independently // .CNTL = 0; 16-bit counter // .TBSSEL = 1; source ACLK // .ID = 0; input divisor of 1 // .MC = 0; initially disabled // .TBCLR = 0; reset timer B // .TBIE = 1; enable timer B interrupts TBCTL = TBSSEL0 | TBIE; } default event void Msp430ClockInit.setupDcoCalibrate() { call Msp430ClockInit.defaultSetupDcoCalibrate(); } default event void Msp430ClockInit.initClocks() { call Msp430ClockInit.defaultInitClocks(); } default event void Msp430ClockInit.initTimerA() { call Msp430ClockInit.defaultInitTimerA(); } default event void Msp430ClockInit.initTimerB() { call Msp430ClockInit.defaultInitTimerB(); } void startTimerA() { // TACTL.MC = 2; continuous mode TACTL = MC1 | (TACTL & ~(MC1|MC0)); } void stopTimerA() { //TACTL.MC = 0; stop timer B TACTL = TACTL & ~(MC1|MC0); } void startTimerB() { // TBCTL.MC = 2; continuous mode TBCTL = MC1 | (TBCTL & ~(MC1|MC0)); } void stopTimerB() { //TBCTL.MC = 0; stop timer B TBCTL = TBCTL & ~(MC1|MC0); } void set_dco_calib( int calib ) { BCSCTL1 = (BCSCTL1 & ~0x07) | ((calib >> 8) & 0x07); DCOCTL = calib & 0xff; } uint16_t test_calib_busywait_delta( int calib ) { int8_t aclk_count = 2; uint16_t dco_prev = 0; uint16_t dco_curr = 0; set_dco_calib( calib ); while( aclk_count-- > 0 ) { TBCCR0 = TBR + ACLK_CALIB_PERIOD; // set next interrupt TBCCTL0 &= ~CCIFG; // clear pending interrupt while( (TBCCTL0 & CCIFG) == 0 ); // busy wait dco_prev = dco_curr; dco_curr = TAR; } return dco_curr - dco_prev; } // busyCalibrateDCO // Should take about 9ms if ACLK_CALIB_PERIOD=8. // DCOCTL and BCSCTL1 are calibrated when done. void busyCalibrateDco() { // --- variables --- int calib; int step; // --- calibrate --- // Binary search for RSEL,DCO,DCOMOD. // It's okay that RSEL isn't monotonic. for( calib=0,step=0x800; step!=0; step>>=1 ) { // if the step is not past the target, commit it if( test_calib_busywait_delta(calib|step) <= TARGET_DCO_DELTA ) calib |= step; } // if DCOx is 7 (0x0e0 in calib), then the 5-bit MODx is not useable, set it to 0 if( (calib & 0x0e0) == 0x0e0 ) calib &= ~0x01f; set_dco_calib( calib ); } command error_t Init.init() { // Reset timers and clear interrupt vectors TACTL = TACLR; TAIV = 0; TBCTL = TBCLR; TBIV = 0; atomic { //signal Msp430ClockInit.setupDcoCalibrate(); //busyCalibrateDco(); signal Msp430ClockInit.initClocks(); signal Msp430ClockInit.initTimerA(); signal Msp430ClockInit.initTimerB(); startTimerA(); startTimerB(); } Set_DCO(DELTA_8MHZ); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/timer/Msp430XDcoCalib.h000066400000000000000000000120021207233610700252460ustar00rootroot00000000000000/** * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the DEXMA SENSORS SL nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * DEXMA SENSORS SL OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * This code is extracted from code examples at TI website. * * * @author: Xavier Orduña (xorduna@dexmatech.com) */ #ifndef MS430XDCOCALIB_H #define MS430XDCOCALIB_H #define DELTA_1MHZ 244 #define DELTA_8MHZ 1953 #define DELTA_12MHZ 2930 #define DELTA_16MHZ 3906 unsigned char CAL_DATA[8]; //volatile unsigned int k; int dcoj; char *Flash_ptrA; void Set_DCO(unsigned int Delta); void dco_flash() { //WDTCTL = WDTPW + WDTHOLD; for (dcoj = 0; dcoj < 0xfffe; dcoj++); P5OUT=0x00; P5DIR=0x21; //P5DIR=0x20; P5OUT=0x01; P2SEL |= 0x02; P2DIR |= 0x02; dcoj = 0; Set_DCO(DELTA_16MHZ); // Set DCO and obtain constants CAL_DATA[dcoj++] = DCOCTL; CAL_DATA[dcoj++] = BCSCTL1; Set_DCO(DELTA_12MHZ); // Set DCO and obtain constants CAL_DATA[dcoj++] = DCOCTL; CAL_DATA[dcoj++] = BCSCTL1; Set_DCO(DELTA_8MHZ); // Set DCO and obtain constants CAL_DATA[dcoj++] = DCOCTL; CAL_DATA[dcoj++] = BCSCTL1; Set_DCO(DELTA_1MHZ); // Set DCO and obtain constants CAL_DATA[dcoj++] = DCOCTL; CAL_DATA[dcoj++] = BCSCTL1; Flash_ptrA = (char *)0x10C0; // Point to beginning of seg A FCTL2 = FWKEY + FSSEL0 + FN1; // MCLK/3 for Flash Timing Generator FCTL1 = FWKEY + ERASE; // Set Erase bit FCTL3 = FWKEY + LOCKA; // Clear LOCK & LOCKA bits *Flash_ptrA = 0x00; // Dummy write to erase Flash seg A FCTL1 = FWKEY + WRT; // Set WRT bit for write operation Flash_ptrA = (char *)0x10F8; // Point to beginning of cal consts for (dcoj = 0; dcoj < 8; dcoj++) *Flash_ptrA++ = CAL_DATA[dcoj]; // re-flash DCO calibration data FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCKA + LOCK; // Set LOCK & LOCKA bit P5OUT ^= 0x20; // Toggle LED //P5OUT ^= 0x20; // Toggle LED } void Set_DCO(unsigned int Delta) // Set DCO to selected frequency { unsigned int Compare, Oldcapture = 0; BCSCTL1 |= DIVA_3; // ACLK = LFXT1CLK/8 TACCTL2 = CM_1 + CCIS_1 + CAP; // CAP, ACLK TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, cont-mode, clear while (1) { while (!(CCIFG & TACCTL2)); // Wait until capture occured TACCTL2 &= ~CCIFG; // Capture occured, clear flag Compare = TACCR2; // Get current captured SMCLK Compare = Compare - Oldcapture; // SMCLK difference Oldcapture = TACCR2; // Save current captured SMCLK if (Delta == Compare) break; // If equal, leave "while(1)" else if (Delta < Compare) { DCOCTL--; // DCO is too fast, slow it down if (DCOCTL == 0xFF) // Did DCO roll under? if (BCSCTL1 & 0x0f) BCSCTL1--; // Select lower RSEL } else { DCOCTL++; // DCO is too slow, speed it up if (DCOCTL == 0x00) // Did DCO roll over? if ((BCSCTL1 & 0x0f) != 0x0f) BCSCTL1++; // Sel higher RSEL } } TACCTL2 = 0; // Stop TACCR2 TACTL = 0; // Stop Timer_A BCSCTL1 &= ~DIVA_3; // ACLK = LFXT1CLK } #endif tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/usci/000077500000000000000000000000001207233610700222265ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/usci/Msp430I2C1P.nc000066400000000000000000000050771207233610700242460ustar00rootroot00000000000000/** * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the DEXMA SENSORS SL nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * DEXMA SENSORS SL OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Xavier Orduna * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:11 $ */ configuration Msp430I2C1P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[uint8_t id ]; provides interface I2CPacket as I2CBasicAddr; uses interface Resource as UsciResource[ uint8_t id ]; uses interface Msp430I2CConfigure[ uint8_t id ]; uses interface HplMsp430UsciInterrupts as Interrupts; } implementation { components new Msp430I2CP() as I2CP; components new Z1UsciP() as Z1UsciP; Resource = I2CP.Resource; ResourceConfigure = I2CP.ResourceConfigure; Msp430I2CConfigure = I2CP.Msp430I2CConfigure; I2CP.Msp430I2CConfigure -> Z1UsciP.Msp430I2CConfigure; I2CBasicAddr = I2CP.I2CBasicAddr; UsciResource = I2CP.UsciResource; Interrupts = I2CP.Interrupts; components HplMsp430UsciB1C as UsciC; I2CP.UsciB -> UsciC; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/usci/Msp430SpiNoDmaB0P.nc000066400000000000000000000052351207233610700254400ustar00rootroot00000000000000/** * Copyright (c) 2009 DEXMA SENSORS SL * Copyright (c) 2005-2006 Arched Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the DEXMA SENSORS SL nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * DEXMA SENSORS SL OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Jonathan Hui * @author Xavier Orduna * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:11 $ */ configuration Msp430SpiNoDmaB0P { provides interface Resource[ uint8_t id ]; provides interface ResourceConfigure[uint8_t id ]; provides interface SpiByte; provides interface SpiPacket[ uint8_t id ]; uses interface Resource as UsciResource[ uint8_t id ]; uses interface Msp430SpiConfigure[ uint8_t id ]; uses interface HplMsp430UsciInterrupts as UsciInterrupts; } implementation { components new Msp430SpiNoDmaBP() as SpiP; components new Z1UsciP() as Z1UsciP; Resource = SpiP.Resource; ResourceConfigure = SpiP.ResourceConfigure; Msp430SpiConfigure = SpiP.Msp430SpiConfigure; SpiP.Msp430SpiConfigure -> Z1UsciP.Msp430SpiConfigure; SpiByte = SpiP.SpiByte; SpiPacket = SpiP.SpiPacket; UsciResource = SpiP.UsciResource; UsciInterrupts = SpiP.UsciInterrupts; components HplMsp430UsciB0C as UsciC; SpiP.Usci -> UsciC; components LedsC as Leds; SpiP.Leds -> Leds; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/usci/Z1SerialP.nc000066400000000000000000000046221207233610700243260ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author: Xavier Orduna * @author: Jordi Soucheiron */ module Z1SerialP { provides interface StdControl; provides interface Msp430UartConfigure; uses interface Resource; } implementation { msp430_uart_union_config_t msp430_uart_z1_config = { { ubr: UBR_8MHZ_115200, umctl: UMCTL_8MHZ_115200, ucssel: 2, } }; //, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0, utxe : 1, urxe : 1 command error_t StdControl.start(){ return call Resource.immediateRequest(); } command error_t StdControl.stop(){ call Resource.release(); return SUCCESS; } event void Resource.granted(){} async command msp430_uart_union_config_t* Msp430UartConfigure.getConfig() { return &msp430_uart_z1_config; } } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/usci/Z1UsciP.nc000066400000000000000000000056741207233610700240220ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author: Xavier Orduna * @author: Jordi Soucheiron */ generic module Z1UsciP() { provides interface Msp430SpiConfigure[ uint8_t id ]; provides interface Msp430I2CConfigure[ uint8_t id ]; } implementation { msp430_spi_union_config_t msp430_spi_z1_config = { { ubr : 2, /* smclk/2 */ ucmode : 0, /* 3 pin master, no ste */ ucmst : 1, uc7bit : 0, /* 8 bit */ ucmsb : 1, /* msb first, compatible with msp430 usart */ ucckpl : 1, /* inactive state low */ ucckph : 0, /* data captured on rising, changed falling */ ucssel : 2, /* smclk */ } }; async command msp430_spi_union_config_t* Msp430SpiConfigure.getConfig[uint8_t id]() { return (msp430_spi_union_config_t*) &msp430_spi_z1_config; } msp430_i2c_union_config_t msp430_i2c_z1_config = { { ucmode : 3, /* i2c mode */ ucmst : 1, /* master */ ucmm : 0, /* single master */ ucsla10 : 0, /* 7 bit slave */ uca10 : 0, /* 7 bit us */ uctr : 0, /* rx mode to start */ ucssel : 2, /* smclk */ i2coa : 1, /* our address is 1 */ ucgcen : 1, /* respond to general call */ ubr : 800, /* smclk/2 */ } }; async command msp430_i2c_union_config_t* Msp430I2CConfigure.getConfig[uint8_t id]() { return (msp430_i2c_union_config_t *) &msp430_i2c_z1_config; } } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/msp430/usci/printfZ1.h000066400000000000000000000311361207233610700241200ustar00rootroot00000000000000/* * Copyright (c) 2008 The Regents of the University of California. * Copyright (c) 2005 The President and Fellows of Harvard College. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Writes printf like output to the UART. * This works only on the AVR and MSP430 Microcontrollers! *

        * Note: For AVR we explicitly place the print statements in ROM; for * MSP430 this is done by default! For AVR, if we don't place it * explicitely in ROM, the statements will go in RAM, which will * quickly cause a descent size program to run out of RAM. By default * it doesn't disable the interupts; disabling the interupts when * writing to the UART, slows down/makes the mote quite unresponsive, * and can lead to problems! If you wish to disable all printfs to * the UART, then comment the flag: PRINTFUART_ENABLED. *

         * How to use:
         *   // (0) In your Makefile, define PRINTFUART_ENABLED
         *   CFLAGS += -DPRINTFUART_ENABLED
         *   // (1) Call printfUART_init() from your initialization function 
         *   //     to initialize the UART
         *   printfUART_init();
         *   // (2) Set your UART client to the correct baud rate.  Look at 
         *   //     the comments in printfUART_init(), to figure out what 
         *   //     baud to use for your particular mote
         *
         *   // (3) Send printf statements like this:
         *   printfUART("Hello World, we are in year= %u\n", 2004);
         *   printfUART("Printing uint32_t variable, value= %lu\n", 4294967295);
         *
         * Examples and caveats:
         *   // (1) - Must use curly braces in single section statements.  
         *            (Look in the app.c to see why -- hint: it's a macro)
         *   if (x < 3)
         *       {printfUART("The value of x is %i\n", x);}
         *   // (2) - Otherwise it more or less works like regular printf
         *   printfUART("\nThe value of x=%u, and y=%u\n", x, y); 
         * 
        *
        URL: http://www.eecs.harvard.edu/~konrad/projects/motetrack
        * @author Konrad Lorincz * @version 2.0, January 5, 2005 */ #ifndef PRINTFZ1_H #define PRINTFZ1_H #ifndef PRINTFUART_H #define PRINTFUART_H #include #include #warning including printfZ1 // ------------------------------------------------------------------- #ifdef PRINTFUART_ENABLED #define DEBUGBUF_SIZE 256 char debugbuf[DEBUGBUF_SIZE]; char debugbufROMtoRAM[DEBUGBUF_SIZE]; #if defined(PLATFORM_MICAZ) || defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) #define printfUART(__format...) { \ static const char strROM[] PROGMEM = __format; \ strcpy_P((char*) &debugbufROMtoRAM, (PGM_P) &strROM); \ sprintf(debugbuf, debugbufROMtoRAM); \ writedebug(); \ } #else // assume MSP430 architecture (e.g. TelosA, TelosB, etc.) #define printfUART(__format...) { \ sprintf(debugbuf, __format); \ writedebug(); \ } #define printfz1(__format...) { \ snprintf(debugbuf,DEBUGBUF_SIZE, __format); \ writedebug(); \ } #endif #else #define printfz1(X, args...) dbg("printf", X, ## args) #define printfUART(X, args...) dbg("printf", X, ## args) // #define printfUART(__format...) {} void printfz1_init() {} void printfUART_init() {} #endif #define NOprintfUART(__format...) // ------------------------------------------------------------------- #ifdef PRINTFUART_ENABLED /** * Initialize the UART port. Call this from your startup routine. */ #define printfz1_init() {atomic printfUART_init_private();} #define printfUART_init() {atomic printfUART_init_private();} void printfUART_init_private() { #if defined(PLATFORM_MICAZ) || defined(PLATFORM_MICA2) // 56K baud outp(0,UBRR0H); outp(15, UBRR0L); //set baud rate outp((1< = STDRXD = ALT2(in) GPIO<47> = STDTXD = ALT1(out) *********/ //atomic{ //configure the GPIO Alt functions and directions _GPIO_setaltfn(46,2); // STD_RXD _GPIO_setaltfn(47,1); // STD_TXD _GPDR(46) &= ~_GPIO_bit(46); // input _GPDR(47) |= _GPIO_bit(47); // output STLCR |=LCR_DLAB; //turn on DLAB so we can change the divisor STDLL = 8; //configure to 115200; STDLH = 0; STLCR &= ~(LCR_DLAB); //turn off DLAB STLCR |= 0x3; //configure to 8 bits STMCR &= ~MCR_LOOP; STMCR |= MCR_OUT2; STIER |= IER_RAVIE; STIER |= IER_TIE; STIER |= IER_UUE; //enable the UART //STMCR |= MCR_AFE; //Auto flow control enabled; //STMCR |= MCR_RTS; STFCR |= FCR_TRFIFOE; //enable the fifos // call Interrupt.allocate(); // call Interrupt.enable(); //configure all the interrupt stuff //make sure that the interrupt causes an IRQ not an FIQ // __REG(0x40D00008) &= ~(1<<21); //configure the priority as IPR1 //__REG(0x40D00020) = (1<<31 | 21); //unmask the interrupt //__REG(0x40D00004) |= (1<<21); CKEN |= CKEN5_STUART; //enable the UART's clk #else #if defined(PLATFORM_Z1) P3SEL |= 0x30; // P3.4,5 = USCI_A1 TXD/RXD UCA0CTL1 |= UCSSEL_2; // CLK = ACLK UCA0BR0 = 0x45; // 32kHz/9600 = 3.41 UCA0BR1 = 0x00; // UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3 UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** #else // assume TelosA, TelosB, etc. // Variabel baud // To change the baud rate, see /tos/platform/msp430/msp430baudrates.h uint8_t source = SSEL_SMCLK; uint16_t baudrate = 0x0012; // UBR_SMCLK_57600=0x0012 uint8_t mctl = 0x84; // UMCTL_SMCLK_57600=0x84 //uint16_t baudrate = 0x0009; // UBR_SMCLK_115200=0x0009 //uint8_t mctl = 0x10; // UMCTL_SMCLK_115200=0x10 uint16_t l_br = 0; uint8_t l_mctl = 0; uint8_t l_ssel = 0; TOSH_SEL_UTXD1_MODFUNC(); TOSH_SEL_URXD1_MODFUNC(); UCTL1 = SWRST; UCTL1 |= CHAR; // 8-bit char, UART-mode U1RCTL &= ~URXEIE; // even erroneous characters trigger interrupts UCTL1 = SWRST; UCTL1 |= CHAR; // 8-bit char, UART-mode if (l_ssel & 0x80) { U1TCTL &= ~(SSEL_0 | SSEL_1 | SSEL_2 | SSEL_3); U1TCTL |= (l_ssel & 0x7F); } else { U1TCTL &= ~(SSEL_0 | SSEL_1 | SSEL_2 | SSEL_3); U1TCTL |= SSEL_ACLK; // use ACLK, assuming 32khz } if ((l_mctl != 0) || (l_br != 0)) { U1BR0 = l_br & 0x0FF; U1BR1 = (l_br >> 8) & 0x0FF; U1MCTL = l_mctl; } else { U1BR0 = 0x03; // 9600 baud U1BR1 = 0x00; U1MCTL = 0x4A; } ME2 &= ~USPIE1; // USART1 SPI module disable ME2 |= (UTXE1 | URXE1); // USART1 UART module enable U1CTL &= ~SWRST; IFG2 &= ~(UTXIFG1 | URXIFG1); IE2 &= ~(UTXIE1 | URXIE1); // interrupt disabled //async command void USARTControl.setClockSource(uint8_t source) { // atomic { l_ssel = source | 0x80; U1TCTL &= ~(SSEL_0 | SSEL_1 | SSEL_2 | SSEL_3); U1TCTL |= (l_ssel & 0x7F); // } //} //async command void USARTControl.setClockRate(uint16_t baudrate, uint8_t mctl) { //atomic { l_br = baudrate; l_mctl = mctl; U1BR0 = baudrate & 0x0FF; U1BR1 = (baudrate >> 8) & 0x0FF; U1MCTL = mctl; //} //} //async command result_t USARTControl.enableRxIntr(){ //atomic { IFG2 &= ~URXIFG1; IE2 |= URXIE1; //} //return SUCCESS; //} //async command result_t USARTControl.enableTxIntr(){ //atomic { IFG2 &= ~UTXIFG1; IE2 |= UTXIE1; //} //return SUCCESS; //} #endif #endif #endif #endif } #if defined(PLATFORM_MICAZ) || defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) #else #if defined(PLATFORM_IMOTE2) #else #if defined(PLATFORM_Z1) #else // assume AVR architecture (e.g. TelosA, TelosB) bool isTxIntrPending() { if (U1TCTL & TXEPT) { return TRUE; } return FALSE; } #endif #endif #endif /** * Outputs a char to the UART. */ void UARTPutChar(char c) { if (c == '\n') UARTPutChar('\r'); #if defined(PLATFORM_MICAZ) || defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) loop_until_bit_is_set(UCSR0A, UDRE); outb(UDR0,c); #else #if defined(PLATFORM_IMOTE2) STTHR = c; #else #if defined(PLATFORM_Z1) while (!(IFG2&UCA0TXIFG)); atomic UCA0TXBUF = c; #else // assume AVR architecture (e.g. TelosA, TelosB) U1TXBUF = c; while( !isTxIntrPending() ) continue; #endif #endif #endif } /** * Outputs the entire debugbuf to the UART, or until it encounters '\0'. */ void writedebug() { uint16_t i = 0; while (debugbuf[i] != '\0' && i < DEBUGBUF_SIZE) UARTPutChar(debugbuf[i++]); } #endif // PRINTFUART_ENABLED // ------------------------------------------------------------------- #if 0 // -------------------------------------------------------------- #define assertUART(x) if (!(x)) { __assertUART(__FILE__, __LINE__); } void __assertUART(const char* file, int line) { printfUART("ASSERT FAILED: file= %s, lineNbr= %i\n", file, line); // for some reason, CLR means on TOSH_MAKE_RED_LED_OUTPUT(); TOSH_MAKE_YELLOW_LED_OUTPUT(); TOSH_MAKE_GREEN_LED_OUTPUT(); TOSH_CLR_RED_LED_PIN(); TOSH_CLR_YELLOW_LED_PIN(); TOSH_CLR_GREEN_LED_PIN(); exit(1); } // -------------------------------------------------------------- #endif #endif // PRINTFUART_H #endif // PRINTFZ1_H tinyos-2.1.2+dfsg/tos/platforms/z1/chips/sht11/000077500000000000000000000000001207233610700211755ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/chips/sht11/HalSensirionSht11C.nc000066400000000000000000000052031207233610700250410ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HalSensirionSht11C is an advanced access component for the * Sensirion SHT11 model humidity and temperature sensor, available on * the telosb platform. This component provides the SensirionSht11 * interface, which offers full control over the device. Please * acquire the Resource before using it. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ configuration HalSensirionSht11C { provides interface Resource[ uint8_t client ]; provides interface SensirionSht11[ uint8_t client ]; } implementation { components new SensirionSht11LogicP(); SensirionSht11 = SensirionSht11LogicP; components HplSensirionSht11C; Resource = HplSensirionSht11C.Resource; SensirionSht11LogicP.DATA -> HplSensirionSht11C.DATA; SensirionSht11LogicP.CLOCK -> HplSensirionSht11C.SCK; #ifndef IS_ZIGLET SensirionSht11LogicP.InterruptDATA -> HplSensirionSht11C.InterruptDATA; #endif components new TimerMilliC(); SensirionSht11LogicP.Timer -> TimerMilliC; components LedsC; SensirionSht11LogicP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/sht11/HplSensirionSht11C.nc000066400000000000000000000070211207233610700250600ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HplSensirionSht11C is a low-level component, intended to provide * the physical resources used by the Sensirion SHT11 sensor on the * telosb platform so that the chip driver can make use of them. You * really shouldn't be wiring to this, unless you're writing a new * Sensirion SHT11 driver. * * @author Gilman Tolle * @version $Revision: 1.6 $ $Date: 2007-02-04 19:56:29 $ */ configuration HplSensirionSht11C { provides interface Resource[ uint8_t id ]; provides interface GeneralIO as DATA; provides interface GeneralIO as SCK; #ifndef IS_ZIGLET provides interface GpioInterrupt as InterruptDATA; #endif } implementation { components HplMsp430GeneralIOC; components new Msp430GpioC() as DATAM; components new Msp430GpioC() as SCKM; #ifdef IS_ZIGLET #warning USING SHT1X SENSOR IN ZIGLET PORT DATAM -> HplMsp430GeneralIOC.Port51; //10 SCKM -> HplMsp430GeneralIOC.Port52; //56 #else components new Msp430GpioC() as PWRM; PWRM -> HplMsp430GeneralIOC.Port21; DATAM -> HplMsp430GeneralIOC.Port10; SCKM -> HplMsp430GeneralIOC.Port16; #endif DATA = DATAM; SCK = SCKM; components HplSensirionSht11P; #ifndef IS_ZIGLET HplSensirionSht11P.PWR -> PWRM; #endif HplSensirionSht11P.DATA -> DATAM; HplSensirionSht11P.SCK -> SCKM; components new TimerMilliC(); HplSensirionSht11P.Timer -> TimerMilliC; #ifndef IS_ZIGLET components HplMsp430InterruptC; components new Msp430InterruptC() as InterruptDATAC; InterruptDATAC.HplInterrupt -> HplMsp430InterruptC.Port10; InterruptDATA = InterruptDATAC.Interrupt; #endif components new FcfsArbiterC( "Sht11.Resource" ) as Arbiter; Resource = Arbiter; components new SplitControlPowerManagerC(); SplitControlPowerManagerC.SplitControl -> HplSensirionSht11P; SplitControlPowerManagerC.ArbiterInfo -> Arbiter.ArbiterInfo; SplitControlPowerManagerC.ResourceDefaultOwner -> Arbiter.ResourceDefaultOwner; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/sht11/HplSensirionSht11P.nc000066400000000000000000000052721207233610700251030ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "Timer.h" /** * HplSensirionSht11P is a low-level component that controls power for * the Sensirion SHT11 sensor on the telosb platform. * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ module HplSensirionSht11P { provides interface SplitControl; uses interface Timer; uses interface GeneralIO as PWR; uses interface GeneralIO as DATA; uses interface GeneralIO as SCK; } implementation { task void stopTask(); command error_t SplitControl.start() { #ifndef IS_ZIGLET call PWR.makeOutput(); call PWR.set(); call Timer.startOneShot( 11 ); #endif #ifdef IS_ZIGLET signal SplitControl.startDone( SUCCESS ); #endif return SUCCESS; } event void Timer.fired() { signal SplitControl.startDone( SUCCESS ); } command error_t SplitControl.stop() { call SCK.makeInput(); call SCK.clr(); call DATA.makeInput(); call DATA.clr(); #ifndef IS_ZIGLET call PWR.clr(); #endif post stopTask(); return SUCCESS; } task void stopTask() { signal SplitControl.stopDone( SUCCESS ); } } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/sht11/SensirionSht11C.nc000066400000000000000000000061011207233610700244120ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * SensirionSht11C is a top-level access component for the Sensirion * SHT11 model humidity and temperature sensor, available on the * telosb platform. Because this component represents one physical * device, simultaneous calls to read temperature and humidity will be * arbitrated and executed in sequential order. Feel free to read both * at the same time, just be aware that they'll come back * sequentially. * * @author Gilman Tolle * @version $Revision: 1.5 $ $Date: 2007-04-13 21:46:18 $ */ generic configuration SensirionSht11C() { provides interface Read as Temperature; provides interface DeviceMetadata as TemperatureMetadata; provides interface Read as Humidity; provides interface DeviceMetadata as HumidityMetadata; } implementation { components new SensirionSht11ReaderP(); Temperature = SensirionSht11ReaderP.Temperature; TemperatureMetadata = SensirionSht11ReaderP.TemperatureMetadata; Humidity = SensirionSht11ReaderP.Humidity; HumidityMetadata = SensirionSht11ReaderP.HumidityMetadata; components HalSensirionSht11C; enum { TEMP_KEY = unique("Sht11.Resource") }; enum { HUM_KEY = unique("Sht11.Resource") }; SensirionSht11ReaderP.TempResource -> HalSensirionSht11C.Resource[ TEMP_KEY ]; SensirionSht11ReaderP.Sht11Temp -> HalSensirionSht11C.SensirionSht11[ TEMP_KEY ]; SensirionSht11ReaderP.HumResource -> HalSensirionSht11C.Resource[ HUM_KEY ]; SensirionSht11ReaderP.Sht11Hum -> HalSensirionSht11C.SensirionSht11[ HUM_KEY ]; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/sht11/SensirionSht11LogicP.nc000066400000000000000000000257451207233610700254240ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "Timer.h" #include "SensirionSht11.h" /** * SensirionSht11LogicP contains the actual driver logic needed to * read from the Sensirion SHT11 temperature/humidity sensor. It * depends on 2 underlying GeneralIO interfaces, one for the data pin * and one for the clock pin, and one underlying GpioInterrupt. It * provides the HAL-level SensirionSht11 interface. It's generic, so * you can instantiate it multiple times if you have more than one * Sensirion SHT11 attached to a node. * *

        * This code assumes that the MCU clock is less than 10 MHz. If you * ever run this on a faster MCU, you'll need to insert a lot of * waits to keep the Sensirion happy. * * Modified to work for both GPIO's and Ziglet port of Zolertia Z1 mote * Shadows /chip/sht1x * * @author Gilman Tolle * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:12 $ */ generic module SensirionSht11LogicP() { provides interface SensirionSht11[ uint8_t client ]; uses interface GeneralIO as DATA; uses interface GeneralIO as CLOCK; uses interface Timer; uses interface Leds; #ifndef IS_ZIGLET uses interface GpioInterrupt as InterruptDATA; #endif } implementation { typedef enum { CMD_MEASURE_TEMPERATURE = 0x3, CMD_MEASURE_HUMIDITY = 0x5, CMD_READ_STATUS = 0x7, CMD_WRITE_STATUS = 0x6, CMD_SOFT_RESET = 0x1E, } sht_cmd_t; enum { TIMEOUT_RESET = 11, TIMEOUT_14BIT = 250, TIMEOUT_12BIT = 80, //70, TIMEOUT_8BIT = 20, //15, } sht_timeout_t; bool on = TRUE; bool busy = FALSE; uint8_t status = 0; sht_cmd_t cmd; uint8_t newStatus; bool writeFail = FALSE; uint8_t currentClient; error_t performCommand(); void initPins(); void resetDevice(); void transmissionStart(); void sendCommand(uint8_t _cmd); void writeByte(uint8_t byte); error_t waitForResponse(); void enableInterrupt(); uint8_t readByte(); void ack(); void endTransmission(); task void readSensor(); task void signalStatusDone(); command error_t SensirionSht11.reset[ uint8_t client ]() { if ( !on ) { return EOFF; } if ( busy ) { return EBUSY; } else { busy = TRUE; } cmd = CMD_SOFT_RESET; currentClient = client; return performCommand(); } command error_t SensirionSht11.measureTemperature[ uint8_t client ]() { if ( !on ) { return EOFF; } if ( busy ) { return EBUSY; } else { busy = TRUE; } cmd = CMD_MEASURE_TEMPERATURE; currentClient = client; return performCommand(); } command error_t SensirionSht11.measureHumidity[ uint8_t client ]() { if ( !on ) { return EOFF; } if ( busy ) { return EBUSY; } else { busy = TRUE; } cmd = CMD_MEASURE_HUMIDITY; currentClient = client; return performCommand(); } /* FIXME: these don't seem to work */ command error_t SensirionSht11.readStatusReg[ uint8_t client ]() { if ( !on ) { return EOFF; } if ( busy ) { return EBUSY; } else { busy = TRUE; } cmd = CMD_READ_STATUS; currentClient = client; return performCommand(); } /* FIXME: these don't seem to work */ command error_t SensirionSht11.writeStatusReg[ uint8_t client ]( uint8_t val ) { if ( !on ) { return EOFF; } if ( busy ) { return EBUSY; } else { busy = TRUE; } cmd = CMD_WRITE_STATUS; newStatus = val; currentClient = client; return performCommand(); } // performCommand() returns both error_t and status reg -- fortunately, error_t is 8bit error_t performCommand() { initPins(); resetDevice(); transmissionStart(); cmd &= 0x1F; // clear the first 3 address bits to 000 sendCommand(cmd); if ( waitForResponse() != SUCCESS ) { busy = FALSE; return FAIL; } switch(cmd) { case CMD_SOFT_RESET: call Timer.startOneShot( TIMEOUT_RESET ); break; case CMD_MEASURE_TEMPERATURE: enableInterrupt(); if ( status & SHT11_STATUS_LOW_RES_BIT ) { call Timer.startOneShot( TIMEOUT_12BIT ); } else { call Timer.startOneShot( TIMEOUT_14BIT ); } break; case CMD_MEASURE_HUMIDITY: enableInterrupt(); if ( status & SHT11_STATUS_LOW_RES_BIT ) { call Timer.startOneShot( TIMEOUT_8BIT ); } else { call Timer.startOneShot( TIMEOUT_12BIT ); } break; case CMD_READ_STATUS: { uint8_t tempStatus; uint8_t crc; tempStatus = readByte(); crc = readByte(); endTransmission(); status = tempStatus; // FIXME: need to check CRC! post signalStatusDone(); } case CMD_WRITE_STATUS: writeByte( newStatus ); if ( waitForResponse() != SUCCESS ) { writeFail = TRUE; } else { status = newStatus; } post signalStatusDone(); } // leave the device busy...we're waiting for an interrupt return SUCCESS; } void initPins() { call CLOCK.makeOutput(); call CLOCK.clr(); call DATA.makeInput(); call DATA.set(); #ifndef IS_ZIGLET call InterruptDATA.disable(); #endif } void resetDevice() { uint8_t i; call DATA.makeOutput(); call DATA.set(); call CLOCK.clr(); for( i = 0; i < 9; i++ ) { call CLOCK.set(); call CLOCK.clr(); } } void transmissionStart() { call DATA.makeOutput(); call DATA.set(); call CLOCK.clr(); call CLOCK.set(); call DATA.clr(); call CLOCK.clr(); call CLOCK.set(); call DATA.set(); call CLOCK.clr(); } void sendCommand(uint8_t _cmd) { writeByte(_cmd); } void writeByte(uint8_t byte) { uint8_t i; for( i = 0; i < 8; i++ ) { if ( byte & 0x80 ) call DATA.set(); else call DATA.clr(); byte = byte << 1; call CLOCK.set(); call CLOCK.clr(); } } error_t waitForResponse() { call DATA.makeInput(); call DATA.set(); call CLOCK.set(); if (call DATA.get()) { // the device didn't pull the DATA line low // the command wasn't received or acknowledged return FAIL; } call CLOCK.clr(); return SUCCESS; } #ifdef IS_ZIGLET task void stayAwake(){ if (!call DATA.get()){ post readSensor(); } else { post stayAwake(); } } #endif void enableInterrupt() { call DATA.makeInput(); call DATA.set(); #ifndef IS_ZIGLET call InterruptDATA.enableFallingEdge(); #else post stayAwake(); #endif } event void Timer.fired() { switch(cmd) { case CMD_SOFT_RESET: // driver has waited long enough for device to reset busy = FALSE; signal SensirionSht11.resetDone[currentClient]( SUCCESS ); break; case CMD_MEASURE_TEMPERATURE: // timeout expired with no data interrupt busy = FALSE; signal SensirionSht11.measureTemperatureDone[currentClient]( FAIL, 0 ); break; case CMD_MEASURE_HUMIDITY: // timeout expired with no data interrupt busy = FALSE; signal SensirionSht11.measureHumidityDone[currentClient]( FAIL, 0 ); break; default: // we're in an unexpected state. what to do? break; } } #ifndef IS_ZIGLET async event void InterruptDATA.fired() { call InterruptDATA.disable(); post readSensor(); } #endif task void readSensor() { uint16_t data = 0; uint8_t crc; if ( busy == FALSE ) { // the interrupt was received after the timeout. // we've already signaled FAIL to the client, so just give up. return; } call Timer.stop(); data = readByte() << 8; data |= readByte(); // printfUART("readb %d %d\n", data, readByte()); crc = readByte(); endTransmission(); switch( cmd ) { case CMD_MEASURE_TEMPERATURE: busy = FALSE; signal SensirionSht11.measureTemperatureDone[currentClient]( SUCCESS, data ); break; case CMD_MEASURE_HUMIDITY: busy = FALSE; signal SensirionSht11.measureHumidityDone[currentClient]( SUCCESS, data ); break; default: break; // unknown command - shouldn't reach here } } uint8_t readByte() { uint8_t byte = 0; uint8_t i; for( i = 0; i < 8; i++ ) { call CLOCK.set(); if (call DATA.get()) byte |= 1; if (i != 7) byte = byte << 1; call CLOCK.clr(); } ack(); return byte; } void ack() { call DATA.makeOutput(); call DATA.clr(); call CLOCK.set(); call CLOCK.clr(); call DATA.makeInput(); call DATA.set(); } void endTransmission() { call DATA.makeOutput(); call DATA.set(); call CLOCK.set(); call CLOCK.clr(); } task void signalStatusDone() { bool _writeFail = writeFail; switch( cmd ) { case CMD_READ_STATUS: busy = FALSE; signal SensirionSht11.readStatusRegDone[currentClient]( SUCCESS, status ); break; case CMD_WRITE_STATUS: busy = FALSE; writeFail = FALSE; signal SensirionSht11.writeStatusRegDone[currentClient]( (_writeFail ? FAIL : SUCCESS) ); break; default: // shouldn't happen. break; } } default event void SensirionSht11.resetDone[uint8_t client]( error_t result ) { } default event void SensirionSht11.measureTemperatureDone[uint8_t client]( error_t result, uint16_t val ) { } default event void SensirionSht11.measureHumidityDone[uint8_t client]( error_t result, uint16_t val ) { } default event void SensirionSht11.readStatusRegDone[uint8_t client]( error_t result, uint8_t val ) { } default event void SensirionSht11.writeStatusRegDone[uint8_t client]( error_t result ) { } } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/stm25p/000077500000000000000000000000001207233610700213675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/chips/stm25p/HplStm25pPinsC.nc000066400000000000000000000041721207233610700244100ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of general-purpose I/O for a ST M25P chip * connected to a TI MSP430. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:45 $ */ configuration HplStm25pPinsC { provides interface GeneralIO as CSN; provides interface GeneralIO as Hold; } implementation { components HplMsp430GeneralIOC as HplGeneralIOC; components new Msp430GpioC() as CSNM; components new Msp430GpioC() as HoldM; CSNM -> HplGeneralIOC.Port44; HoldM -> HplGeneralIOC.Port57; CSN = CSNM; Hold = HoldM; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/stm25p/HplStm25pSpiC.nc000066400000000000000000000037741207233610700242410ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HPL implementation of the Spi bus for a ST M25P chip connected to a * TI MSP430. * * @author Jonathan Hui * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:45 $ */ configuration HplStm25pSpiC { provides interface Resource; provides interface SpiByte; provides interface SpiPacket; } implementation { components new Msp430SpiB0C() as SpiC; Resource = SpiC; SpiByte = SpiC; SpiPacket = SpiC; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/tmp102/000077500000000000000000000000001207233610700212605ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/chips/tmp102/HalTMP102Advanced.nc000066400000000000000000000052551207233610700245470ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HalTMP175Advanced is the HAL control interface for the TI TMP175 * Digital Temperature Sensor. * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:14 $ */ #include "TMP102.h" interface HalTMP102Advanced { command error_t setThermostatMode(bool useInt); event void setThermostatModeDone(error_t error); command error_t setPolarity(bool polarity); event void setPolarityDone(error_t error); command error_t setFaultQueue(tmp102_fqd_t depth); event void setFaultQueueDone(error_t error); command error_t setTLow(uint16_t val); event void setTLowDone(error_t error); command error_t setTHigh(uint16_t val); event void setTHighDone(error_t error); //it is not possible to configure sensor resolution event void alertThreshold(); /* We must include following modes for TMP102 */ //conversion rate //extended mode command error_t setExtendedMode(bool extendedmode); event void setExtendedModeDone(error_t error); command error_t setConversionRate(tmp102_cr_t rate); event void setConversionRateDone(error_t error); } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/tmp102/HalTMP102ControlP.nc000066400000000000000000000161121207233610700245740ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HalTMP175ControlP device specific Hal interfaces for the TI TMP175 Chip. * * Note that only the data path uses split phase resource arbitration * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:14 $ */ module HalTMP102ControlP { provides interface HalTMP102Advanced; uses interface HplTMP102; uses interface Resource as TMP102Resource; } implementation { enum { STATE_SET_MODE, STATE_SET_POLARITY, STATE_SET_FQ, STATE_SET_CR, STATE_SET_EM STATE_NONE, STATE_SET_TLOW, STATE_SET_THIGH, }; uint8_t mState = STATE_NONE; uint8_t mConfigRegVal = 0; error_t mHplError; task void complete_Alert() { signal HalTMP102Advanced.alertThreshold(); } static error_t setCfg(uint8_t nextState, uint32_t val) { error_t error; mState = nextState; error = call HplTMP102.setConfigReg(val); if (error) { call TMP102Resource.release(); } else { mConfigRegVal = val; } return error; } static error_t setThresh(uint8_t nextState, uint32_t val) { error_t error; mState = nextState; if(mState == STATE_SET_TLOW) error = call HplTMP102.setTLowReg(val << 4); else error = call HplTMP102.setTHighReg(val << 4); if (error) { call TMP102Resource.release(); } return error; } command error_t HalTMP102Advanced.setThermostatMode(bool useInt) { error_t error; uint8_t newRegVal; error = call TMP102Resource.immediateRequest(); if (error) { return error; } newRegVal = (useInt) ? (mConfigRegVal | TMP102_CFG_TM) : (mConfigRegVal & ~TMP102_CFG_TM); error = setCfg(STATE_SET_MODE, newRegVal); return error; } command error_t HalTMP175Advanced.setPolarity(bool polarity) { error_t error; uint8_t newRegVal; error = call TMP102Resource.immediateRequest(); if (error) { return error; } newRegVal = (polarity) ? (mConfigRegVal | TMP102_CFG_POL) : (mConfigRegVal & ~TMP102_CFG_POL); error = setCfg(STATE_SET_POLARITY, newRegVal); return error; } command error_t HalTMP175Advanced.setFaultQueue(tmp102_fqd_t depth) { error_t error; uint8_t newRegVal; if ((uint8_t)depth > 3) { error = EINVAL; return error; } error = call TMP102Resource.immediateRequest(); if (error) { return error; } newRegVal = (mConfigRegVal & ~TMP102_CFG_FQ(3)) | (TMP102_CFG_FQ(depth)); error = setCfg(STATE_SET_FQ, newRegVal); return error; } command error_t HalTMP102Advanced.setTLow(uint16_t val) { error_t error; error = call TMP102Resource.immediateRequest(); if (error) { return error; } error = setThresh(STATE_SET_TLOW, val); if (error) { call TMP102Resource.release(); } return error; } command error_t HalTMP102Advanced.setTHigh(uint16_t val) { error_t error; error = call TMP102Resource.immediateRequest(); if (error) { return error; } error = setThresh(STATE_SET_THIGH, val); if (error) { call TMP102Resource.release(); } return error; } task void handleConfigReg() { error_t lasterror; atomic lasterror = mHplError; call TMP102Resource.release(); switch (mState) { case STATE_SET_MODE: mState = STATE_NONE; signal HalTMP102Advanced.setThermostatModeDone(lasterror); break; case STATE_SET_POLARITY: mState = STATE_NONE; signal HalTMP102Advanced.setPolarityDone(lasterror); break; case STATE_SET_FQ: mState = STATE_NONE; signal HalTMP102Advanced.setFaultQueueDone(lasterror); break; case STATE_SET_RES: mState = STATE_NONE; signal HalTMP102Advanced.setResolutionDone(lasterror); break; default: break; } //mState = STATE_NONE; return; } task void handleTReg() { error_t lasterror; atomic lasterror = mHplError; call TMP102Resource.release(); switch (mState) { case STATE_SET_TLOW: mState = STATE_NONE; signal HalTMP102Advanced.setTLowDone(lasterror); break; case STATE_SET_THIGH: mState = STATE_NONE; signal HalTMP102Advanced.setTHighDone(lasterror); break; default: mState = STATE_NONE; break; } //mState = STATE_NONE; } event void TMP102Resource.granted() { // intentionally left blank } async event void HplTMP102.setConfigRegDone(error_t error) { mHplError = error; post handleConfigReg(); return; } async event void HplTMP102.setTLowRegDone(error_t error) { mHplError = error; post handleTReg(); } async event void HplTMP102.setTHighRegDone(error_t error) { mHplError = error; post handleTReg(); } async event void HplTMP102.alertThreshold() { post complete_Alert(); } async event void HplTMP102.measureTemperatureDone(error_t error, uint16_t val) { // intentionally left blank } default event void HalTMP102Advanced.setTHighDone(error_t error) { return; } default event void HalTMP102Advanced.setThermostatModeDone(error_t error){ return; } default event void HalTMP102Advanced.setPolarityDone(error_t error){ return; } default event void HalTMP102Advanced.setFaultQueueDone(error_t error){ return; } default event void HalTMP102Advanced.setResolutionDone(error_t error){ return; } default event void HalTMP102Advanced.setTLowDone(error_t error){ return; } default event void HalTMP102Advanced.alertThreshold(){ return; } //we must include other functions for tmp102. } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/tmp102/HalTMP102ReaderP.nc000066400000000000000000000061521207233610700243610ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HalTMP102ReaderP provides the service level HIL and device * specific Hal interfaces for the TI TMP102 Chip. * * Note that only the data path uses split phase resource arbitration * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:14 $ */ generic module HalTMP102ReaderP() { provides interface Read as Temperature; uses interface HplTMP102; uses interface Resource as TMP102Resource; } implementation { enum { STATE_SET_MODE, STATE_SET_POLARITY, STATE_SET_FQ, STATE_SET_CR, STATE_SET_EM, STATE_NONE }; uint8_t mState = STATE_NONE; uint8_t mConfigRegVal = 0; error_t mHplError; command error_t Temperature.read() { return call TMP102Resource.request(); } event void TMP102Resource.granted() { error_t error; error = call HplTMP102.measureTemperature(); if (error) { call TMP102Resource.release(); signal Temperature.readDone(error,0); } return; } async event void HplTMP102.measureTemperatureDone(error_t tmp102_error, uint16_t val) { call TMP102Resource.release(); signal Temperature.readDone(tmp102_error,(val >> 4)); return; } // intentionally left empty async event void HplTMP102.setTLowRegDone(error_t error) {} async event void HplTMP102.setTHighRegDone(error_t error) {} async event void HplTMP102.setConfigRegDone(error_t error) {} async event void HplTMP102.alertThreshold() {} default event void Temperature.readDone(error_t error, uint16_t val) {return ;} } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/tmp102/HplTMP102.nc000066400000000000000000000055051207233610700231360ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HplTMP102 is the HPL inteface to the Texas Instrument TMP102 * Digital Temperature Sensor. * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:14 $ */ interface HplTMP102 { /** * Starts a temperature measurement. * * @return SUCCESS if the measurement will be made */ command error_t measureTemperature(); /** * Presents the result of a temperature measurement. * * @param error SUCCESS if the measurement was successful * @param val the temperature reading */ async event void measureTemperatureDone( error_t error, uint16_t val ); /** * Sets a new value to the TMP102 configuration register. * * @param val the new value to be written * * @return SUCCESS if the set will be performed */ command error_t setConfigReg( uint16_t val ); /** * Signals the completion of the configuration register set. * * @param error SUCCESS if the set was successful */ async event void setConfigRegDone( error_t error ); command error_t setTLowReg(uint16_t val); async event void setTLowRegDone(error_t error); command error_t setTHighReg(uint16_t val); async event void setTHighRegDone(error_t error); async event void alertThreshold(); } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/tmp102/HplTMP102LogicP.nc000066400000000000000000000173521207233610700242370ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HplTMP175LogicP is the driver for the TI TMP175. It requires an * I2C packet interface and provides the HplTMP175 HPL interface. * This module DOES NOT apply any specific configuration to the GpioInterrupt * pin associated with the theshold alerts. This must be handled by an * outside configuration/module according to the host platform. * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:14 $ */ #include "TMP102.h" #include "I2C.h" generic module HplTMP102LogicP(uint16_t devAddr) { provides interface Init; provides interface SplitControl; provides interface HplTMP102; uses interface I2CPacket; uses interface GpioInterrupt as AlertInterrupt; uses interface GeneralIO as InterruptPin; } implementation { enum { STATE_IDLE, STATE_STARTING, STATE_STOPPING, STATE_STOPPED, STATE_READTEMP, STATE_SETCONFIG, STATE_SETTHIGH, STATE_SETTLOW, }; bool mfPtrReset; uint8_t mI2CBuffer[4]; uint8_t mState; uint8_t mConfigRegVal; norace error_t mSSError; static error_t doSetReg(uint8_t nextState, uint8_t reg, uint8_t val) { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = nextState; } else { error = EBUSY; } } if (error) return error; mI2CBuffer[0] = reg; mI2CBuffer[1] = val; error = call I2CPacket.write((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); if (error) atomic mState = STATE_IDLE; return error; } static error_t doSetRegWord(uint8_t nextState, uint8_t reg, uint16_t val) { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = nextState; } else { error = EBUSY; } } if (error) return error; mI2CBuffer[0] = reg; mI2CBuffer[1] = (val >> 8) & 0xFF; mI2CBuffer[2] = val & 0xFF; error = call I2CPacket.write((I2C_START | I2C_STOP),devAddr,3,mI2CBuffer); if (error) atomic mState = STATE_IDLE; return error; } task void StartDone() { atomic mState = STATE_IDLE; signal SplitControl.startDone(mSSError); return; } task void StopDone() { atomic mState = STATE_STOPPED; signal SplitControl.stopDone(mSSError); return; } command error_t Init.init() { // careful! this can be changed via polarity I believe call InterruptPin.makeInput(); call AlertInterrupt.enableRisingEdge(); mfPtrReset = FALSE; mConfigRegVal = 0; mState = STATE_STOPPED; return SUCCESS; } command error_t SplitControl.start() { error_t error = SUCCESS; atomic { if (mState == STATE_STOPPED) { mState = STATE_IDLE; } else { error = EBUSY; } } if (error) return error; return doSetReg(STATE_STARTING,TMP102_PTR_CFG,(mConfigRegVal & ~TMP175_CFG_SD)); } command error_t SplitControl.stop() { return doSetReg(STATE_STOPPING,TMP102_PTR_CFG,(mConfigRegVal | TMP175_CFG_SD)); } command error_t HplTMP102.measureTemperature() { error_t error = SUCCESS; atomic { if (mState == STATE_IDLE) { mState = STATE_READTEMP; } else { error = EBUSY; } } if (error) return error; mI2CBuffer[0] = mI2CBuffer[1] = 0; error = call I2CPacket.read(I2C_START | I2C_STOP, devAddr,2,mI2CBuffer); if (error) atomic mState = STATE_IDLE; return error; } command error_t HplTMP102.setConfigReg( uint16_t val ){ return doSetReg(STATE_SETCONFIG,TMP102_PTR_CFG,val); } command error_t HplTMP102.setTLowReg(uint16_t val){ return doSetRegWord(STATE_SETTLOW,TMP102_PTR_TLOW,val); } command error_t HplTMP102.setTHighReg(uint16_t val){ return doSetRegWord(STATE_SETTHIGH,TMP102_PTR_THIGH,val); } async event void I2CPacket.readDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { uint16_t tempVal; switch (mState) { case STATE_READTEMP: tempVal = buf[0]; tempVal = ((tempVal << 8) | buf[1]); mState = STATE_IDLE; signal HplTMP175.measureTemperatureDone(i2c_error,tempVal); break; default: break; } return; } async event void I2CPacket.writeDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { error_t error = i2c_error; if (mfPtrReset) { mfPtrReset = FALSE; switch (mState) { case STATE_STARTING: mSSError = error; post StartDone(); break; case STATE_STOPPING: mSSError = error; post StopDone(); break; case STATE_READTEMP: // Should never get here. break; case STATE_SETCONFIG: mState = STATE_IDLE; signal HplTMP102.setConfigRegDone(error); break; case STATE_SETTHIGH: mState = STATE_IDLE; signal HplTMP102.setTHighRegDone(error); break; case STATE_SETTLOW: mState = STATE_IDLE; signal HplTMP102.setTLowRegDone(error); break; default: mState = STATE_IDLE; break; } } else { // Reset the PTR register back to the temperature register mI2CBuffer[0] = TMP102_PTR_TEMP; mfPtrReset = TRUE; call I2CPacket.write(I2C_START | I2C_STOP, devAddr,1,mI2CBuffer); } return; } async event void AlertInterrupt.fired() { // This alert is decoupled from whatever state the TMP102 is in. // Upper layers must handle dealing with this alert appropriately. signal HplTMP102.alertThreshold(); return; } default event void SplitControl.startDone( error_t error ) { return; } default event void SplitControl.stopDone( error_t error ) { return; } default async event void HplTMP102.measureTemperatureDone( error_t error, uint16_t val ){ return; } default async event void HplTMP102.setConfigRegDone( error_t error ){ return; } default async event void HplTMP102.setTHighRegDone(error_t error){ return; } default async event void HplTMP102.setTLowRegDone(error_t error){ return; } default async event void HplTMP102.alertThreshold(){ return; } } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/tmp102/TMP102.h000066400000000000000000000050201207233610700223110ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Types and definitions for the TI TMP175 * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006/12/12 18:23:14 $ */ #ifndef _TMP102_H #define _TMP102_H #define TMP102_SLAVE_ADDR (0x48) #define TMP102_PTR_TEMP (0x0) #define TMP102_PTR_CFG (0x1) #define TMP102_PTR_TLOW (0x2) #define TMP102_PTR_THIGH (0x3) #define TMP102_CFG_OS ((1 << 7) << 8) #define TMP102_CFG_RES(_x) ((((_x) & 0x3) << 5) << 8) #define TMP102_CFG_FQ(_x) ((((_x) & 0x3) << 3) << 8) #define TMP102_CFG_POL ((1 << 2) << 8) #define TMP102_CFG_TM ((1 << 1) << 8) #define TMP102_CFG_SD ((1 << 0) << 8) #define TMP102_CFG_CR(_x) (((_x) & 0x3) << 6) #define TMP102_CFG_AL (1 << 5) #define TMP102_CFG_EM (1 << 4) typedef enum { TMP102_FQD_1 = 0, TMP102_FQD_2 = 1, TMP102_FQD_4 = 2, TMP102_FQD_6 = 3 } tmp102_fqd_t; typedef enum { TMP102_CR_025HZ, TMP102_RES_1HZ, TMP102_RES_4HZ, TMP102_RES_8HZ } tmp102_cr_t; #endif /* _TMP102_H */ tinyos-2.1.2+dfsg/tos/platforms/z1/chips/tmp102/TMP102C.nc000066400000000000000000000046741207233610700226030ustar00rootroot00000000000000/* $Id: TMP175C.nc,v 1.4 2006/12/12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ //#include "im2sb.h" generic configuration TMP102C() { provides interface Read as Temperature; provides interface HalTMP102Advanced; provides interface SplitControl; } implementation { components new HalTMP102ReaderP(); components HalTMP102ControlP; Temperature = HalTMP102ReaderP.Temperature; enum { TMP_KEY = unique("TMP102.Resource"), ADV_KEY = unique("TMP102.Resource"), READER_ID = unique("TMP102.HplAccess"), }; components TMP102InternalC; HalTMP102ReaderP.TMP102Resource -> TMP102InternalC.Resource[TMP_KEY]; HalTMP102ControlP.TMP102Resource -> TMP102InternalC.Resource[ADV_KEY]; HalTMP102ReaderP.HplTMP175 -> TMP102InternalC.HplTMP102[READER_ID]; HalTMP102Advanced = HalTMP102ControlP.HalTMP102Advanced; SplitControl = TMP102InternalC; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/tmp102/TMP102InternalC.nc000066400000000000000000000051221207233610700242650ustar00rootroot00000000000000/* $Id: TMP175InternalC.nc,v 1.4 2006/12/12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ //#include "im2sb.h" configuration TMP102InternalC { provides interface Resource[uint8_t id]; provides interface HplTMP102[uint8_t id]; provides interface SplitControl; } implementation { enum { ADV_ID = unique("TMP102.HplAccess"), }; components new SimpleFcfsArbiterC( "TMP102.Resource" ) as Arbiter; components MainC; Resource = Arbiter; components new HplTMP102LogicP(TMP102_SLAVE_ADDR) as Logic; MainC.SoftwareInit -> Logic; /* dubtos */ components GeneralIOC; Logic.AlertInterrupt -> GeneralIOC.GpioInterrupt[GPIO_TMP102_TEMP_ALERT]; Logic.InterruptPin -> GeneralIOC.GeneralIO[GPIO_TMP102_TEMP_ALERT]; components new Msp430I2CC() as I2CBus; Logic.I2CPacket -> I2CBus; components TMP102InternalP as Internal; HplTMP102 = Internal.HplTMP102; Internal.ToHPLC -> Logic.HplTMP102; SplitControl = Logic; components HalTMP102ControlP; HalTMP102ControlP.HplTMP102 -> Logic; } tinyos-2.1.2+dfsg/tos/platforms/z1/chips/tmp102/TMP102InternalP.nc000066400000000000000000000066751207233610700243200ustar00rootroot00000000000000/* $Id: TMP175InternalP.nc,v 1.4 2006/12/12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ module TMP102InternalP { provides interface HplTMP102[uint8_t id]; uses interface HplTMP102 as ToHPLC; } implementation { uint8_t currentId; command error_t HplTMP102.measureTemperature[uint8_t id]() { currentId = id; return call ToHPLC.measureTemperature(); } // configuration register of TMP102 is 16 bit command error_t HplTMP102.setConfigReg[uint8_t id](uint16_t val) { currentId = id; return call ToHPLC.setConfigReg(val); } command error_t HplTMP102.setTLowReg[uint8_t id](uint16_t val) { currentId = id; return call ToHPLC.setTLowReg(val); } command error_t HplTMP102.setTHighReg[uint8_t id](uint16_t val) { currentId = id; return call ToHPLC.setTHighReg(val); } async event void ToHPLC.measureTemperatureDone(error_t error, uint16_t val) { signal HplTMP102.measureTemperatureDone[currentId](error, val); } async event void ToHPLC.setConfigRegDone(error_t error) { signal HplTMP102.setConfigRegDone[currentId](error); } async event void ToHPLC.setTLowRegDone(error_t error) { signal HplTMP102.setTLowRegDone[currentId](error); } async event void ToHPLC.setTHighRegDone(error_t error) { signal HplTMP102.setTHighRegDone[currentId](error); } async event void ToHPLC.alertThreshold() { signal HplTMP102.alertThreshold[currentId](); } default async event void HplTMP102.measureTemperatureDone[uint8_t id](error_t error, uint16_t val) { return; } default async event void HplTMP102.setConfigRegDone[uint8_t id](error_t error) { return; } default async event void HplTMP102.setTLowRegDone[uint8_t id](error_t error) { return; } default async event void HplTMP102.setTHighRegDone[uint8_t id](error_t error) { return; } default async event void HplTMP102.alertThreshold[uint8_t id]() { return; } } tinyos-2.1.2+dfsg/tos/platforms/z1/hardware.h000066400000000000000000000042671207233610700211060ustar00rootroot00000000000000/* * Copyright (c) 2009 DEXMA SENSORS SL * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author: Xavier Orduna * @author: Jordi Soucheiron */ #ifndef _H_hardware_h #define _H_hardware_h #include "msp430hardware.h" // LEDs TOSH_ASSIGN_PIN(RED_LED, 5, 4); TOSH_ASSIGN_PIN(GREEN_LED, 5, 6); TOSH_ASSIGN_PIN(YELLOW_LED, 5, 5); // UART pins TOSH_ASSIGN_PIN(SOMI0, 3, 2); TOSH_ASSIGN_PIN(SIMO0, 3, 1); TOSH_ASSIGN_PIN(UCLK0, 3, 3); TOSH_ASSIGN_PIN(UTXD0, 3, 4); TOSH_ASSIGN_PIN(URXD0, 3, 5); TOSH_ASSIGN_PIN(UTXD1, 3, 6); TOSH_ASSIGN_PIN(URXD1, 3, 7); TOSH_ASSIGN_PIN(UCLK1, 5, 3); TOSH_ASSIGN_PIN(SOMI1, 5, 2); TOSH_ASSIGN_PIN(SIMO1, 5, 1); #endif // _H_hardware_h tinyos-2.1.2+dfsg/tos/platforms/z1/mac/000077500000000000000000000000001207233610700176675ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/mac/tkn154/000077500000000000000000000000001207233610700207155ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/mac/tkn154/Makefile.include000066400000000000000000000005651207233610700240050ustar00rootroot00000000000000# We include several platform-glue components from telosb, because they are # identical on the z1 platform (e.g. Ieee802154BeaconEnabledC.nc, # Ieee802154NonBeaconEnabledC.nc,TKN154TimingP.nc, etc.) CFLAGS += -I$(TOSDIR)/platforms/z1/mac/tkn154 \ -I$(TOSDIR)/platforms/telosb/mac/tkn154 \ -I$(TOSDIR)/platforms/telosb/mac/tkn154/timer \ -I$(TOSDIR)/chips/cc2420_tkn154 tinyos-2.1.2+dfsg/tos/platforms/z1/mac/tkn154/README.txt000066400000000000000000000007601207233610700224160ustar00rootroot00000000000000This directory contains the TKN15.4 "platform glue" code for the z1 platform. Like the telos platform, z1 uses the CC2420 radio and in order not to maintain identical configuration files, the z1 platform pulls in (uses) some files from the platform/telosb/mac/tkn154 directory. The ./Makefile.include file defines in which order the directories are parsed and should be included by any z1 application. More information on TKN15.4 can be found here: tinyos-2.x/tos/lib/mac/tkn154/README.txt tinyos-2.1.2+dfsg/tos/platforms/z1/platform.h000066400000000000000000000000001207233610700211120ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/platforms/z1/platform_message.h000066400000000000000000000047751207233610700226450ustar00rootroot00000000000000/* * Copyright (c) 2005 The Regents of the University of California. * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Defining the platform-independently named packet structures to be the * chip-specific CC1000 packet structures. * * @author Philip Levis * @version $Revision: 1.5 $ $Date: 2008/02/19 22:03:45 $ */ #ifndef PLATFORM_MESSAGE_H #define PLATFORM_MESSAGE_H #include #include typedef union message_header { cc2420_header_t cc2420; serial_header_t serial; } message_header_t; typedef union TOSRadioFooter { cc2420_footer_t cc2420; } message_footer_t; typedef union TOSRadioMetadata { cc2420_metadata_t cc2420; serial_metadata_t serial; } message_metadata_t; #endif tinyos-2.1.2+dfsg/tos/sensorboards/000077500000000000000000000000001207233610700172725ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/basicsb/000077500000000000000000000000001207233610700207005ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/basicsb/.sensor000066400000000000000000000000001207233610700222000ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/basicsb/DemoSensorC.nc000066400000000000000000000011731207233610700234050ustar00rootroot00000000000000/* $Id: DemoSensorC.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Demo sensor for basicsb sensorboard. * * @author David Gay */ generic configuration DemoSensorC() { provides interface Read; } implementation { components new PhotoC() as Sensor; Read = Sensor; } tinyos-2.1.2+dfsg/tos/sensorboards/basicsb/DemoSensorStreamC.nc000066400000000000000000000012451207233610700245610ustar00rootroot00000000000000/* $Id: DemoSensorStreamC.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Demo sensor for basicsb sensorboard. * * @author David Gay */ generic configuration DemoSensorStreamC() { provides interface ReadStream; } implementation { components new PhotoStreamC() as SensorStream; ReadStream = SensorStream; } tinyos-2.1.2+dfsg/tos/sensorboards/basicsb/PhotoC.nc000066400000000000000000000014041207233610700224150ustar00rootroot00000000000000/* $Id: PhotoC.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Photodiode of the basicsb sensor board. * * @author David Gay */ #include "basicsb.h" generic configuration PhotoC() { provides interface Read; } implementation { components new AdcReadClientC(), PhotoDeviceP; Read = AdcReadClientC; AdcReadClientC.Atm128AdcConfig -> PhotoDeviceP; AdcReadClientC.ResourceConfigure -> PhotoDeviceP; } tinyos-2.1.2+dfsg/tos/sensorboards/basicsb/PhotoDeviceP.nc000066400000000000000000000016131207233610700235540ustar00rootroot00000000000000/* $Id: PhotoDeviceP.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Internal component for basicsb photodiode. Arbitrates access to the photo * diode and automatically turns it on or off based on user requests. * * @author David Gay */ #include "basicsb.h" configuration PhotoDeviceP { provides { interface ResourceConfigure; interface Atm128AdcConfig; } } implementation { components PhotoP, MicaBusC; ResourceConfigure = PhotoP; Atm128AdcConfig = PhotoP; PhotoP.PhotoPin -> MicaBusC.PW1; PhotoP.PhotoAdc -> MicaBusC.Adc6; } tinyos-2.1.2+dfsg/tos/sensorboards/basicsb/PhotoP.nc000066400000000000000000000022721207233610700224360ustar00rootroot00000000000000/* $Id: PhotoP.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * basicsb photodiode power control and ADC configuration. * @author David Gay */ module PhotoP { provides { interface ResourceConfigure; interface Atm128AdcConfig; } uses { interface GeneralIO as PhotoPin; interface MicaBusAdc as PhotoAdc; } } implementation { async command uint8_t Atm128AdcConfig.getChannel() { return call PhotoAdc.getChannel(); } async command uint8_t Atm128AdcConfig.getRefVoltage() { return ATM128_ADC_VREF_OFF; } async command uint8_t Atm128AdcConfig.getPrescaler() { return ATM128_ADC_PRESCALE; } async command void ResourceConfigure.configure() { call PhotoPin.makeOutput(); call PhotoPin.set(); } async command void ResourceConfigure.unconfigure() { call PhotoPin.clr(); } } tinyos-2.1.2+dfsg/tos/sensorboards/basicsb/PhotoStreamC.nc000066400000000000000000000014641207233610700235770ustar00rootroot00000000000000/* $Id: PhotoStreamC.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Photodiode of the basicsb sensor board. * * @author David Gay */ #include "basicsb.h" generic configuration PhotoStreamC() { provides interface ReadStream; } implementation { components PhotoDeviceP, new AdcReadStreamClientC(); ReadStream = AdcReadStreamClientC; AdcReadStreamClientC.Atm128AdcConfig -> PhotoDeviceP; AdcReadStreamClientC.ResourceConfigure -> PhotoDeviceP; } tinyos-2.1.2+dfsg/tos/sensorboards/basicsb/TempC.nc000066400000000000000000000013771207233610700222420ustar00rootroot00000000000000/* $Id: TempC.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Thermistor of the basicsb sensor board. * * @author David Gay */ #include "basicsb.h" generic configuration TempC() { provides interface Read; } implementation { components new AdcReadClientC(), TempDeviceP; Read = AdcReadClientC; AdcReadClientC.Atm128AdcConfig -> TempDeviceP; AdcReadClientC.ResourceConfigure -> TempDeviceP; } tinyos-2.1.2+dfsg/tos/sensorboards/basicsb/TempDeviceP.nc000066400000000000000000000016001207233610700233640ustar00rootroot00000000000000/* $Id: TempDeviceP.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Internal component for basicsb tempdiode. Arbitrates access to the temp * diode and automatically turns it on or off based on user requests. * * @author David Gay */ #include "basicsb.h" configuration TempDeviceP { provides { interface ResourceConfigure; interface Atm128AdcConfig; } } implementation { components TempP, MicaBusC; ResourceConfigure = TempP; Atm128AdcConfig = TempP; TempP.TempPin -> MicaBusC.PW2; TempP.TempAdc -> MicaBusC.Adc5; } tinyos-2.1.2+dfsg/tos/sensorboards/basicsb/TempP.nc000066400000000000000000000022621207233610700222510ustar00rootroot00000000000000/* $Id: TempP.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * basicsb thermistor power control and ADC configuration. * @author David Gay */ module TempP { provides { interface ResourceConfigure; interface Atm128AdcConfig; } uses { interface GeneralIO as TempPin; interface MicaBusAdc as TempAdc; } } implementation { async command uint8_t Atm128AdcConfig.getChannel() { return call TempAdc.getChannel(); } async command uint8_t Atm128AdcConfig.getRefVoltage() { return ATM128_ADC_VREF_OFF; } async command uint8_t Atm128AdcConfig.getPrescaler() { return ATM128_ADC_PRESCALE; } async command void ResourceConfigure.configure() { call TempPin.makeOutput(); call TempPin.set(); } async command void ResourceConfigure.unconfigure() { call TempPin.clr(); } } tinyos-2.1.2+dfsg/tos/sensorboards/basicsb/TempStreamC.nc000066400000000000000000000014571207233610700234150ustar00rootroot00000000000000/* $Id: TempStreamC.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Thermistor of the basicsb sensor board. * * @author David Gay */ #include "basicsb.h" generic configuration TempStreamC() { provides interface ReadStream; } implementation { components TempDeviceP, new AdcReadStreamClientC(); ReadStream = AdcReadStreamClientC; AdcReadStreamClientC.Atm128AdcConfig -> TempDeviceP; AdcReadStreamClientC.ResourceConfigure -> TempDeviceP; } tinyos-2.1.2+dfsg/tos/sensorboards/basicsb/basicsb.h000066400000000000000000000004011207233610700224520ustar00rootroot00000000000000#ifndef BASICSB_H #define BASICSB_H #define UQ_TEMPDEVICE "TempDeviceP.Resource" #define UQ_TEMPDEVICE_STREAM "TempDeviceStreamP.Resource" #define UQ_PHOTODEVICE "PhotoDeviceP.Resource" #define UQ_PHOTODEVICE_STREAM "PhotoDeviceStreamP.Resource" #endif tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/000077500000000000000000000000001207233610700203065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/.sensor000066400000000000000000000041741207233610700216260ustar00rootroot00000000000000# # Copyright (c) 2005-2006 Arch Rock Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # - Neither the name of the Arch Rock Corporation nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # OF THE POSSIBILITY OF SUCH DAMAGE # # FILE: im2sb/.sensor # # Includes that should take precedence come first. Sensorboard "superclasses" # come before because they may override files. These must be specified as # @includes instead of -I's to @opts, otherwise the %T won't be processed # by ncc. And because of that, the current sensorboard's include directory # must be specified, otherwise its search order is last instead of first. # # $Id: .sensor,v 1.4 2006-12-12 18:23:45 vlahan Exp $ # push( @includes, qw( %T/sensorboards/im2sb %T/chips/lis3l02dq %T/chips/max136x %T/chips/sht11 %T/chips/tmp175 %T/chips/tsl2561 ) ); tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/HalSensirionSht11C.nc000066400000000000000000000053511207233610700241560ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HalSensirionSht11C is an advanced access component for the * Sensirion SHT11 model humidity and temperature sensor, available on * the telosb platform. This component provides the SensirionSht11 * interface, which offers full control over the device. Please * acquire the Resource before using it. * * @author Gilman Tolle * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ configuration HalSensirionSht11C { provides interface SplitControl; provides interface Resource[ uint8_t client ]; provides interface SensirionSht11[ uint8_t client ]; } implementation { components new SensirionSht11LogicP(); SensirionSht11 = SensirionSht11LogicP; components HplSensirionSht11C; SplitControl = HplSensirionSht11C; Resource = HplSensirionSht11C.Resource; SensirionSht11LogicP.DATA -> HplSensirionSht11C.DATA; SensirionSht11LogicP.CLOCK -> HplSensirionSht11C.SCK; SensirionSht11LogicP.InterruptDATA -> HplSensirionSht11C.InterruptDATA; components new TimerMilliC(); SensirionSht11LogicP.Timer -> TimerMilliC; components NoLedsC; SensirionSht11LogicP.Leds -> NoLedsC; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/HplSensirionSht11C.nc000066400000000000000000000056221207233610700241760ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HplSensirionSht11C is a low-level component, intended to provide * the physical resources used by the Sensirion SHT11 sensor on the * telosb platform so that the chip driver can make use of them. You * really shouldn't be wiring to this, unless you're writing a new * Sensirion SHT11 driver. * * @author Gilman Tolle * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ #include configuration HplSensirionSht11C { provides interface SplitControl; provides interface Resource[ uint8_t id ]; provides interface GeneralIO as DATA; provides interface GeneralIO as SCK; provides interface GpioInterrupt as InterruptDATA; } implementation { components GeneralIOC; DATA = GeneralIOC.GeneralIO[GPIO_SHT11_DATA]; SCK = GeneralIOC.GeneralIO[GPIO_SHT11_CLK]; InterruptDATA = GeneralIOC.GpioInterrupt[GPIO_SHT11_DATA]; components HplSensirionSht11P; SplitControl = HplSensirionSht11P; components new TimerMilliC(); components HplPXA27xGPIOC; HplSensirionSht11P.Timer -> TimerMilliC; HplSensirionSht11P.DATA -> HplPXA27xGPIOC.HplPXA27xGPIOPin[GPIO_SHT11_DATA]; HplSensirionSht11P.SCK -> HplPXA27xGPIOC.HplPXA27xGPIOPin[GPIO_SHT11_CLK]; components new SimpleFcfsArbiterC( "Sht11.Resource" ) as Arbiter; Resource = Arbiter; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/HplSensirionSht11P.nc000066400000000000000000000052441207233610700242130ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "Timer.h" /** * HplSensirionSht11P is a low-level component that controls power for * the Sensirion SHT11 sensor on the telosb platform. * * @author Phil Buonadonna * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ module HplSensirionSht11P { provides interface SplitControl; uses interface Timer; uses interface HplPXA27xGPIOPin as DATA; uses interface HplPXA27xGPIOPin as SCK; } implementation { task void stopTask(); command error_t SplitControl.start() { call DATA.setGAFRpin(0); call SCK.setGAFRpin(0); call Timer.startOneShot( 11 ); return SUCCESS; } event void Timer.fired() { signal SplitControl.startDone( SUCCESS ); } command error_t SplitControl.stop() { call SCK.setGPDRbit(FALSE); call SCK.setGPCRbit(); call DATA.setGPDRbit(FALSE); call DATA.setGPCRbit(); post stopTask(); return SUCCESS; } task void stopTask() { signal SplitControl.stopDone( SUCCESS ); } async event void DATA.interruptGPIOPin() { return; } async event void SCK.interruptGPIOPin() { return; } } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/LIS3L02DQC.nc000066400000000000000000000056401207233610700221550ustar00rootroot00000000000000/* $Id: LIS3L02DQC.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #include "im2sb.h" generic configuration LIS3L02DQC() { //provides interface Init; provides interface SplitControl; provides interface Read as AccelX; provides interface Read as AccelY; provides interface Read as AccelZ; provides interface HalLIS3L02DQAdvanced; } implementation { components new HalLIS3L02DQReaderP(); components HalLIS3L02DQControlP; AccelX = HalLIS3L02DQReaderP.AccelX; AccelY = HalLIS3L02DQReaderP.AccelY; AccelZ = HalLIS3L02DQReaderP.AccelZ; HalLIS3L02DQAdvanced = HalLIS3L02DQControlP.Advanced; enum { ACCELX_KEY = unique("LIS3L02DQ.Resource"), ACCELY_KEY = unique("LIS3L02DQ.Resource"), ACCELZ_KEY = unique("LIS3L02DQ.Resource"), ADV_KEY = unique("LIS3L02DQ.Resource"), READER_ID = unique("LIS3L02DQ.HplAccess"), }; components LIS3L02DQInternalC; HalLIS3L02DQReaderP.AccelXResource -> LIS3L02DQInternalC.Resource[ACCELX_KEY]; HalLIS3L02DQReaderP.AccelYResource -> LIS3L02DQInternalC.Resource[ACCELY_KEY]; HalLIS3L02DQReaderP.AccelZResource -> LIS3L02DQInternalC.Resource[ACCELZ_KEY]; HalLIS3L02DQControlP.Resource -> LIS3L02DQInternalC.Resource[ADV_KEY]; HalLIS3L02DQReaderP.Hpl -> LIS3L02DQInternalC.HplLIS3L02DQ[READER_ID]; SplitControl = LIS3L02DQInternalC; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/LIS3L02DQInternalC.nc000066400000000000000000000060501207233610700236460ustar00rootroot00000000000000/* $Id: LIS3L02DQInternalC.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #include "im2sb.h" configuration LIS3L02DQInternalC { provides interface Resource[uint8_t id]; provides interface HplLIS3L02DQ[uint8_t id]; provides interface SplitControl; } implementation { components LIS3L02DQInternalP as InternalP; components new SimpleFcfsArbiterC( "LIS3L02DQ.Resource" ) as Arbiter; components MainC; Resource = Arbiter; HplLIS3L02DQ = InternalP; SplitControl = InternalP; MainC.SoftwareInit -> InternalP; components HplLIS3L02DQLogicSPIP as LogicSPIP; components HalLIS3L02DQControlP as ControlP; components new HalPXA27xSpiPioC(128, 7, FALSE) as HalSpi; components HplPXA27xSSP1C; components GeneralIOC; components HplPXA27xGPIOC; InternalP.ToHPLC -> LogicSPIP.HplLIS3L02DQ; InternalP.SubControl -> LogicSPIP.SplitControl; InternalP.SPICLK -> HplPXA27xGPIOC.HplPXA27xGPIOPin[SSP1_SCLK]; InternalP.SPIRxD -> HplPXA27xGPIOC.HplPXA27xGPIOPin[SSP1_RXD]; InternalP.SPITxD -> HplPXA27xGPIOC.HplPXA27xGPIOPin[SSP1_TXD]; InternalP.HPWRCntl -> HplPXA27xGPIOC.HplPXA27xGPIOPin[GPIO_PWR_ADC_NSHDWN]; LogicSPIP.SpiPacket -> HalSpi.SpiPacket[unique("SPIInstance")]; LogicSPIP.SPIFRM -> GeneralIOC.GeneralIO[SSP1_SFRM]; LogicSPIP.InterruptAlert -> GeneralIOC.GpioInterrupt[GPIO_LIS3L02DQ_RDY_INT]; ControlP.Hpl -> LogicSPIP; MainC.SoftwareInit -> HalSpi; MainC.SoftwareInit -> LogicSPIP; HalSpi.SSP -> HplPXA27xSSP1C; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/LIS3L02DQInternalP.nc000066400000000000000000000105561207233610700236710ustar00rootroot00000000000000/* $Id: LIS3L02DQInternalP.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * This Hal module implements the TinyOS 2.0 I2CPacket interface over * the PXA27x I2C Hpl * * @author Kaisen Lin * @author Phil Buonadonna */ module LIS3L02DQInternalP { provides interface Init; provides interface SplitControl; provides interface HplLIS3L02DQ[uint8_t id]; uses interface SplitControl as SubControl; uses interface HplLIS3L02DQ as ToHPLC; uses interface HplPXA27xGPIOPin as SPIRxD; uses interface HplPXA27xGPIOPin as SPITxD; uses interface HplPXA27xGPIOPin as SPICLK; uses interface HplPXA27xGPIOPin as HPWRCntl; } implementation { uint8_t currentId; command error_t Init.init() { // Initialize Pin Directions call SPICLK.setGAFRpin(SSP1_SCLK_ALTFN); call SPICLK.setGPDRbit(TRUE); call SPIRxD.setGAFRpin(SSP1_RXD_ALTFN); call SPIRxD.setGPDRbit(FALSE); call SPITxD.setGAFRpin(SSP1_TXD_ALTFN); call SPITxD.setGPDRbit(TRUE); call HPWRCntl.setGPDRbit(TRUE); call HPWRCntl.setGPSRbit(); return SUCCESS; } command error_t SplitControl.start() { error_t error = SUCCESS; error = call SubControl.start(); return error; } command error_t SplitControl.stop() { error_t error = SUCCESS; error = call SubControl.stop(); return error; } command error_t HplLIS3L02DQ.getReg[uint8_t id](uint8_t regAddr) { currentId = id; return call ToHPLC.getReg(regAddr); } command error_t HplLIS3L02DQ.setReg[uint8_t id](uint8_t regAddr, uint8_t val) { currentId = id; return call ToHPLC.setReg(regAddr, val); } event void SubControl.startDone(error_t error) { signal SplitControl.startDone(error); return; } event void SubControl.stopDone(error_t error) { signal SplitControl.stopDone(error); return; } async event void ToHPLC.getRegDone(error_t error, uint8_t regAddr, uint8_t val) { signal HplLIS3L02DQ.getRegDone[currentId](error, regAddr, val); } async event void ToHPLC.setRegDone(error_t error, uint8_t regAddr, uint8_t val) { signal HplLIS3L02DQ.setRegDone[currentId](error, regAddr, val); } async event void ToHPLC.alertThreshold() { signal HplLIS3L02DQ.alertThreshold[currentId](); } async event void SPITxD.interruptGPIOPin() {} async event void SPIRxD.interruptGPIOPin() {} async event void SPICLK.interruptGPIOPin() {} async event void HPWRCntl.interruptGPIOPin() {} default event void SplitControl.startDone(error_t error) { return; } default event void SplitControl.stopDone(error_t error) { return; } default async event void HplLIS3L02DQ.getRegDone[uint8_t id](error_t error, uint8_t regAddr, uint8_t val) { } default async event void HplLIS3L02DQ.setRegDone[uint8_t id](error_t error, uint8_t regAddr, uint8_t val) { } default async event void HplLIS3L02DQ.alertThreshold[uint8_t id]() { } } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/MAX136xC.nc000066400000000000000000000046751207233610700220160ustar00rootroot00000000000000/* $Id: MAX136xC.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #include "im2sb.h" #include "MAX136x.h" generic configuration MAX136xC() { provides interface Read as ADC; provides interface HalMAX136xAdvanced; provides interface SplitControl; } implementation { components new HalMAX136xReaderP(); components HalMAX136xControlP; ADC = HalMAX136xReaderP.ADC; enum { ADC_KEY = unique("MAX136x.Resource"), ADV_KEY = unique("MAX136x.Resource"), READER_ID = unique("MAX136x.HplAccess"), }; components MAX136xInternalC; HalMAX136xReaderP.MAX136xResource -> MAX136xInternalC.Resource[ADC_KEY]; HalMAX136xReaderP.HplMAX136x -> MAX136xInternalC.HplMAX136x[READER_ID]; HalMAX136xControlP.Resource -> MAX136xInternalC.Resource[ADV_KEY]; HalMAX136xAdvanced = HalMAX136xControlP; SplitControl = MAX136xInternalC; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/MAX136xInternalC.nc000066400000000000000000000055131207233610700235030ustar00rootroot00000000000000/* $Id: MAX136xInternalC.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #include "im2sb.h" configuration MAX136xInternalC { provides interface Resource[uint8_t id]; provides interface HplMAX136x[uint8_t id]; provides interface SplitControl; } implementation { components new SimpleFcfsArbiterC( "MAX136x.Resource" )as Arbiter; components MainC; Resource = Arbiter; components new HplMAX136xLogicP(MAX136_SLAVE_ADDR) as Logic; //MainC.SoftwareInit -> Logic; components GeneralIOC; Logic.InterruptAlert -> GeneralIOC.GpioInterrupt[GPIO_MAX1363_ANALOG_INT]; Logic.InterruptPin -> GeneralIOC.GeneralIO[GPIO_MAX1363_ANALOG_INT]; components new HalPXA27xI2CMasterC(TRUE) as I2CC; Logic.I2CPacket -> I2CC; components MAX136xInternalP as Internal; HplMAX136x = Internal.HplMAX136x; Internal.ToHPLC -> Logic.HplMAX136x; Internal.SubInit -> Logic.Init; Internal.InterruptAlert -> GeneralIOC.GpioInterrupt[GPIO_MAX1363_ANALOG_INT]; MainC.SoftwareInit -> Internal.Init; SplitControl = Logic; components HplPXA27xGPIOC; I2CC.I2CSCL -> HplPXA27xGPIOC.HplPXA27xGPIOPin[I2C_SCL]; I2CC.I2CSDA -> HplPXA27xGPIOC.HplPXA27xGPIOPin[I2C_SDA]; components HalMAX136xControlP; HalMAX136xControlP.HplMAX136x -> Logic; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/MAX136xInternalP.nc000066400000000000000000000072171207233610700235230ustar00rootroot00000000000000/* $Id: MAX136xInternalP.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ module MAX136xInternalP { provides interface Init; provides interface HplMAX136x[uint8_t id]; uses interface Init as SubInit; uses interface HplMAX136x as ToHPLC; uses interface GpioInterrupt as InterruptAlert; } implementation { uint8_t currentId; command error_t Init.init() { call SubInit.init(); // The Intel Mote 2 Sensorboard multiplexes the MAX136 interrupt through a NAND // gate. Need to override the edge trigger from the driver default call InterruptAlert.enableRisingEdge(); return SUCCESS; } command error_t HplMAX136x.measureChannels[uint8_t id](uint8_t *buf, uint8_t len) { currentId = id; return call ToHPLC.measureChannels(buf, len); } command error_t HplMAX136x.setConfig[uint8_t id](uint8_t *cfgbuf, uint8_t len) { currentId = id; return call ToHPLC.setConfig(cfgbuf, len); } command error_t HplMAX136x.readStatus[uint8_t id](uint8_t *buf, uint8_t len) { currentId = id; return call ToHPLC.readStatus(buf, len); } async event void ToHPLC.measureChannelsDone(error_t error, uint8_t *buf, uint8_t len) { signal HplMAX136x.measureChannelsDone[currentId](error, buf, len); } async event void ToHPLC.setConfigDone(error_t error, uint8_t *cfgbuf, uint8_t len) { signal HplMAX136x.setConfigDone[currentId](error, cfgbuf, len); } async event void ToHPLC.alertThreshold() { signal HplMAX136x.alertThreshold[currentId](); } async event void ToHPLC.readStatusDone(error_t error, uint8_t * buf) { signal HplMAX136x.readStatusDone[currentId](error, buf); } async event void InterruptAlert.fired() {} default async event void HplMAX136x.measureChannelsDone[uint8_t id]( error_t error, uint8_t *buf, uint8_t len ) {} default async event void HplMAX136x.setConfigDone[uint8_t id]( error_t error , uint8_t *cfgbuf, uint8_t len) {} default async event void HplMAX136x.alertThreshold[uint8_t id]() {} default async event void HplMAX136x.readStatusDone[uint8_t id](error_t error, uint8_t *buf) { } } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/README.txt000066400000000000000000000007551207233610700220130ustar00rootroot00000000000000Intel Mote 2 Demo Sensorboard Release Notes * The configuration provided assumes the following I2C addresses: TSL2561 - 0x49 TMP175 - 0X4A MAX136 - 0x34 These address assignments are compatible with the DS2745 on the optional battery board. Modify the address assignments as needed. * The TMP175 anbd TSL2561 interrupts will work ONLY IF the board has been modified to include a pullup resistor on their associated interrupt lines. Some boards do not include these resistors. tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/SensirionSht11C.nc000066400000000000000000000064021207233610700235270ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * SensirionSht11C is a top-level access component for the Sensirion * SHT11 model humidity and temperature sensor, available on the * telosb platform. Because this component represents one physical * device, simultaneous calls to read temperature and humidity will be * arbitrated and executed in sequential order. Feel free to read both * at the same time, just be aware that they'll come back * sequentially. * * @author Phil Buonadonna * @author Gilman Tolles * @version $Revision: 1.4 $ $Date: 2006-12-12 18:23:45 $ */ generic configuration SensirionSht11C() { provides interface SplitControl; provides interface Read as Temperature; provides interface Read as Humidity; provides interface HalSht11Advanced; } implementation { components new SensirionSht11ReaderP(); Temperature = SensirionSht11ReaderP.Temperature; Humidity = SensirionSht11ReaderP.Humidity; components HalSensirionSht11C; enum { TEMP_KEY = unique("Sht11.Resource") }; enum { HUM_KEY = unique("Sht11.Resource") }; SplitControl = HalSensirionSht11C; SensirionSht11ReaderP.TempResource -> HalSensirionSht11C.Resource[ TEMP_KEY ]; SensirionSht11ReaderP.Sht11Temp -> HalSensirionSht11C.SensirionSht11[ TEMP_KEY ]; SensirionSht11ReaderP.HumResource -> HalSensirionSht11C.Resource[ HUM_KEY ]; SensirionSht11ReaderP.Sht11Hum -> HalSensirionSht11C.SensirionSht11[ HUM_KEY ]; enum { ADV_KEY = unique("Sht11.Resource") }; components HalSht11ControlP; HalSht11Advanced = HalSht11ControlP; HalSht11ControlP.Resource -> HalSensirionSht11C.Resource[ ADV_KEY ]; HalSht11ControlP.SensirionSht11 -> HalSensirionSht11C.SensirionSht11[ ADV_KEY ]; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/TMP175C.nc000066400000000000000000000047271207233610700216420ustar00rootroot00000000000000/* $Id: TMP175C.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #include "im2sb.h" generic configuration TMP175C() { provides interface Read as Temperature; provides interface HalTMP175Advanced; provides interface SplitControl; //provides interface Init; } implementation { components new HalTMP175ReaderP(); components HalTMP175ControlP; Temperature = HalTMP175ReaderP.Temperature; enum { TMP_KEY = unique("TMP175.Resource"), ADV_KEY = unique("TMP175.Resource"), READER_ID = unique("TMP175.HplAccess"), }; components TMP175InternalC; HalTMP175ReaderP.TMP175Resource -> TMP175InternalC.Resource[TMP_KEY]; HalTMP175ControlP.TMP175Resource -> TMP175InternalC.Resource[ADV_KEY]; HalTMP175ReaderP.HplTMP175 -> TMP175InternalC.HplTMP175[READER_ID]; HalTMP175Advanced = HalTMP175ControlP.HalTMP175Advanced; SplitControl = TMP175InternalC; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/TMP175InternalC.nc000066400000000000000000000053361207233610700233340ustar00rootroot00000000000000/* $Id: TMP175InternalC.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #include "im2sb.h" configuration TMP175InternalC { provides interface Resource[uint8_t id]; provides interface HplTMP175[uint8_t id]; provides interface SplitControl; } implementation { enum { ADV_ID = unique("TMP175.HplAccess"), }; components new SimpleFcfsArbiterC( "TMP175.Resource" ) as Arbiter; components MainC; Resource = Arbiter; components new HplTMP175LogicP(TMP175_SLAVE_ADDR) as Logic; MainC.SoftwareInit -> Logic; components GeneralIOC; Logic.AlertInterrupt -> GeneralIOC.GpioInterrupt[GPIO_TMP175_TEMP_ALERT]; Logic.InterruptPin -> GeneralIOC.GeneralIO[GPIO_TMP175_TEMP_ALERT]; components new HalPXA27xI2CMasterC(TRUE) as I2CC; Logic.I2CPacket -> I2CC; components TMP175InternalP as Internal; HplTMP175 = Internal.HplTMP175; Internal.ToHPLC -> Logic.HplTMP175; SplitControl = Logic; components HplPXA27xGPIOC; I2CC.I2CSCL -> HplPXA27xGPIOC.HplPXA27xGPIOPin[I2C_SCL]; I2CC.I2CSDA -> HplPXA27xGPIOC.HplPXA27xGPIOPin[I2C_SDA]; components HalTMP175ControlP; HalTMP175ControlP.HplTMP175 -> Logic; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/TMP175InternalP.nc000066400000000000000000000066111207233610700233460ustar00rootroot00000000000000/* $Id: TMP175InternalP.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ module TMP175InternalP { provides interface HplTMP175[uint8_t id]; uses interface HplTMP175 as ToHPLC; } implementation { uint8_t currentId; command error_t HplTMP175.measureTemperature[uint8_t id]() { currentId = id; return call ToHPLC.measureTemperature(); } command error_t HplTMP175.setConfigReg[uint8_t id](uint8_t val) { currentId = id; return call ToHPLC.setConfigReg(val); } command error_t HplTMP175.setTLowReg[uint8_t id](uint16_t val) { currentId = id; return call ToHPLC.setTLowReg(val); } command error_t HplTMP175.setTHighReg[uint8_t id](uint16_t val) { currentId = id; return call ToHPLC.setTHighReg(val); } async event void ToHPLC.measureTemperatureDone(error_t error, uint16_t val) { signal HplTMP175.measureTemperatureDone[currentId](error, val); } async event void ToHPLC.setConfigRegDone(error_t error) { signal HplTMP175.setConfigRegDone[currentId](error); } async event void ToHPLC.setTLowRegDone(error_t error) { signal HplTMP175.setTLowRegDone[currentId](error); } async event void ToHPLC.setTHighRegDone(error_t error) { signal HplTMP175.setTHighRegDone[currentId](error); } async event void ToHPLC.alertThreshold() { signal HplTMP175.alertThreshold[currentId](); } default async event void HplTMP175.measureTemperatureDone[uint8_t id](error_t error, uint16_t val) { return; } default async event void HplTMP175.setConfigRegDone[uint8_t id](error_t error) { return; } default async event void HplTMP175.setTLowRegDone[uint8_t id](error_t error) { return; } default async event void HplTMP175.setTHighRegDone[uint8_t id](error_t error) { return; } default async event void HplTMP175.alertThreshold[uint8_t id]() { return; } } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/Tsl2561C.nc000066400000000000000000000053501207233610700220160ustar00rootroot00000000000000/* $Id: Tsl2561C.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #include "im2sb.h" generic configuration Tsl2561C() { provides interface Read as BroadbandPhoto; provides interface Read as IRPhoto; provides interface HalTsl2561Advanced; provides interface SplitControl; // this is for power control? //provides interface Init; } implementation { components new HalTsl2561ReaderP(); components HalTsl2561ControlP; BroadbandPhoto = HalTsl2561ReaderP.BroadbandPhoto; IRPhoto = HalTsl2561ReaderP.IRPhoto; enum { BB_KEY = unique("Tsl2561.Resource"), IR_KEY = unique("Tsl2561.Resource"), ADV_KEY = unique("Tsl2561.Resource"), READER_ID = unique("Tsl2561.HplAccess"), }; components Tsl2561InternalC; HalTsl2561ReaderP.BroadbandResource -> Tsl2561InternalC.Resource[BB_KEY]; HalTsl2561ReaderP.IRResource -> Tsl2561InternalC.Resource[IR_KEY]; HalTsl2561ControlP.Resource -> Tsl2561InternalC.Resource[ADV_KEY]; HalTsl2561ReaderP.HplTSL256x -> Tsl2561InternalC.HplTSL256x[READER_ID]; HalTsl2561Advanced = HalTsl2561ControlP.HalTsl2561Advanced; // for debugging SplitControl = Tsl2561InternalC; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/Tsl2561InternalC.nc000066400000000000000000000056451207233610700235220ustar00rootroot00000000000000/* $Id: Tsl2561InternalC.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ #include "im2sb.h" configuration Tsl2561InternalC { provides interface Resource[uint8_t id]; provides interface HplTSL256x[uint8_t id]; provides interface SplitControl; } implementation { enum { ADV_ID = unique("Tsl2561.HplAccess"), }; components new SimpleFcfsArbiterC( "Tsl2561.Resource" ) as Arbiter; components MainC; Resource = Arbiter; components new HplTSL2561LogicP(TSL2561_SLAVE_ADDR) as Logic; //MainC.SoftwareInit -> Logic; components LedsC; Logic.Leds -> LedsC; components GeneralIOC; Logic.InterruptAlert -> GeneralIOC.GpioInterrupt[GPIO_TSL2561_LIGHT_INT]; Logic.InterruptPin -> GeneralIOC.GeneralIO[GPIO_TSL2561_LIGHT_INT]; components new HalPXA27xI2CMasterC(TRUE) as I2CC; Logic.I2CPacket -> I2CC; components Tsl2561InternalP as Internal; HplTSL256x = Internal.HplTSL256x; Internal.ToHPLC -> Logic.HplTSL256x; Internal.SubInit -> Logic.Init; Internal.InterruptAlert -> GeneralIOC.GpioInterrupt[GPIO_TSL2561_LIGHT_INT]; SplitControl = Logic; MainC.SoftwareInit -> Internal; components HplPXA27xGPIOC; I2CC.I2CSCL -> HplPXA27xGPIOC.HplPXA27xGPIOPin[I2C_SCL]; I2CC.I2CSDA -> HplPXA27xGPIOC.HplPXA27xGPIOPin[I2C_SDA]; components HalTsl2561ControlP; HalTsl2561ControlP.HplTSL256x -> Logic; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/Tsl2561InternalP.nc000066400000000000000000000122371207233610700235320ustar00rootroot00000000000000/* $Id: Tsl2561InternalP.nc,v 1.4 2006-12-12 18:23:45 vlahan Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Kaisen Lin * @author Phil Buonadonna */ module Tsl2561InternalP { provides interface Init; provides interface HplTSL256x[uint8_t id]; uses interface Init as SubInit; uses interface HplTSL256x as ToHPLC; uses interface GpioInterrupt as InterruptAlert; } implementation { uint8_t currentId; command error_t Init.init() { call SubInit.init(); // The Intel Mote 2 Sensorboard multiplexes the TSL interrupt through a NAND // gate. Need to overrid the edge trigger from the driver default call InterruptAlert.enableRisingEdge(); return SUCCESS; } command error_t HplTSL256x.measureCh0[uint8_t id]() { currentId = id; return call ToHPLC.measureCh0(); } command error_t HplTSL256x.measureCh1[uint8_t id]() { currentId = id; return call ToHPLC.measureCh1(); } command error_t HplTSL256x.setCONTROL[uint8_t id](uint8_t val) { currentId = id; return call ToHPLC.setCONTROL(val); } command error_t HplTSL256x.setTIMING[uint8_t id](uint8_t val) { currentId = id; return call ToHPLC.setTIMING(val); } command error_t HplTSL256x.setTHRESHLOW[uint8_t id](uint16_t val) { currentId = id; return call ToHPLC.setTHRESHLOW(val); } command error_t HplTSL256x.setTHRESHHIGH[uint8_t id](uint16_t val) { currentId = id; return call ToHPLC.setTHRESHHIGH(val); } command error_t HplTSL256x.setINTERRUPT[uint8_t id](uint8_t val) { currentId = id; return call ToHPLC.setINTERRUPT(val); } command error_t HplTSL256x.getID[uint8_t id]() { currentId = id; return call ToHPLC.getID(); } async event void ToHPLC.measureCh0Done(error_t result, uint16_t val) { signal HplTSL256x.measureCh0Done[currentId](result, val); } async event void ToHPLC.measureCh1Done(error_t result, uint16_t val) { signal HplTSL256x.measureCh1Done[currentId](result, val); } async event void ToHPLC.setCONTROLDone(error_t error) { signal HplTSL256x.setCONTROLDone[currentId](error); } async event void ToHPLC.setTIMINGDone(error_t error) { signal HplTSL256x.setTIMINGDone[currentId](error); } async event void ToHPLC.setTHRESHLOWDone(error_t error) { signal HplTSL256x.setTHRESHLOWDone[currentId](error); } async event void ToHPLC.setTHRESHHIGHDone(error_t error) { signal HplTSL256x.setTHRESHHIGHDone[currentId](error); } async event void ToHPLC.setINTERRUPTDone(error_t error) { signal HplTSL256x.setINTERRUPTDone[currentId](error); } async event void ToHPLC.getIDDone(error_t error, uint8_t idval) { signal HplTSL256x.getIDDone[currentId](error, idval); } async event void ToHPLC.alertThreshold() { signal HplTSL256x.alertThreshold[currentId](); } async event void InterruptAlert.fired() {} default async event void HplTSL256x.measureCh0Done[uint8_t id]( error_t error, uint16_t val ){ return; } default async event void HplTSL256x.measureCh1Done[uint8_t id]( error_t error, uint16_t val ){ return; } default async event void HplTSL256x.setCONTROLDone[uint8_t id]( error_t error ){ return; } default async event void HplTSL256x.setTIMINGDone[uint8_t id](error_t error){ return; } default async event void HplTSL256x.setTHRESHLOWDone[uint8_t id](error_t error){ return;} default async event void HplTSL256x.setTHRESHHIGHDone[uint8_t id](error_t error){ return; } default async event void HplTSL256x.setINTERRUPTDone[uint8_t id](error_t error){ return;} default async event void HplTSL256x.getIDDone[uint8_t id](error_t error, uint8_t idval){ return; } default async event void HplTSL256x.alertThreshold[uint8_t id](){ return; } } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/000077500000000000000000000000001207233610700221245ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/Makefile000066400000000000000000000002751207233610700235700ustar00rootroot00000000000000 TestSensor.class: $(wildcard *.java) TestSensorMsg.java javac *.java TestSensorMsg.java: mig java -target=null $(CFLAGS) -java-classname=TestSensorMsg TestSensor.h TestSensorMsg -o $@ tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestLis3l02dq/000077500000000000000000000000001207233610700244415ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestLis3l02dq/Makefile000066400000000000000000000001011207233610700260710ustar00rootroot00000000000000COMPONENT=TestSensorC SENSORBOARD ?= im2sb include $(MAKERULES)tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestLis3l02dq/TestSensorC.nc000066400000000000000000000045751207233610700272120ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Demo application of the STMicroelectronics LIS3L02DQ . Originally * developed for the Intel Mote 2 sensorboard. * * @author Kaisen Lin * @author Philip Buonadonna */ configuration TestSensorC{} implementation { components MainC, TestSensorM, LedsC; components new LIS3L02DQC() as Sensor; MainC.Boot <- TestSensorM; TestSensorM.Leds -> LedsC; TestSensorM.ReadAccelX -> Sensor.AccelX; TestSensorM.ReadAccelY -> Sensor.AccelY; TestSensorM.ReadAccelZ -> Sensor.AccelZ; TestSensorM.SubControl -> Sensor.SplitControl; TestSensorM.Advanced -> Sensor.HalLIS3L02DQAdvanced; components new TimerMilliC() as Timer0; TestSensorM.Timer0 -> Timer0; components SerialActiveMessageC as AM; TestSensorM.AMSend -> AM.AMSend[AM_TESTSENSORMSG]; TestSensorM.Packet -> AM; TestSensorM.SubControl -> AM; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestLis3l02dq/TestSensorM.nc000066400000000000000000000077271207233610700272260ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Demo application of the STMicroelectronics LIS3L02DQ . Originally * developed for the Intel Mote 2 sensorboard. * * @author Kaisen Lin * @author Philip Buonadonna */ #include "../TestSensor.h" /* Uncomment the flag below to test the interrupt functions of the chip */ //#define USE_INTERRUPTS module TestSensorM { uses interface Boot; uses interface Timer as Timer0; uses interface Read as ReadAccelX; uses interface Read as ReadAccelY; uses interface Read as ReadAccelZ; uses interface SplitControl as SubControl; uses interface HalLIS3L02DQAdvanced as Advanced; uses interface Leds; uses interface AMSend; uses interface Packet; } implementation { message_t packet; event void Boot.booted() { call SubControl.start(); } event void Timer0.fired() { call ReadAccelX.read(); call ReadAccelY.read(); call ReadAccelZ.read(); } event void SubControl.startDone(error_t result) { #ifndef USE_INTERRUPTS call Timer0.startPeriodic( 100 ); #else call Advanced.setTLow(0xA0); #endif } event void SubControl.stopDone(error_t result) { } event void ReadAccelX.readDone(error_t result, uint16_t val) { TestSensorMsg *rcm = (TestSensorMsg *)call Packet.getPayload(&packet, NULL); call Leds.led0Toggle(); if (call Packet.maxPayloadLength() < sizeof(TestSensorMsg)) { return; } rcm->value = val; call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(TestSensorMsg)); } event void ReadAccelY.readDone(error_t result, uint16_t val) { if(val > 0x800) call Leds.led1Toggle(); } event void ReadAccelZ.readDone(error_t result, uint16_t val) { if(val > 0x800) call Leds.led2Toggle(); } event void Advanced.setDecimationDone(error_t error) {} event void Advanced.enableAxisDone(error_t error) {} event void Advanced.enableAlertDone(error_t error) { call Leds.led2Toggle(); } event void Advanced.getAlertSourceDone(error_t error, uint8_t vector) {} event void Advanced.setTLowDone(error_t error) { call Advanced.setTHigh(0xF); } event void Advanced.setTHighDone(error_t error) { call Advanced.enableAlert(LIS_AFLAGS_HIGH, LIS_AFLAGS_NONE, LIS_AFLAGS_NONE, FALSE); } event void Advanced.alertThreshold() { call Leds.led0Toggle(); } event void AMSend.sendDone(message_t* bufPtr, error_t error) { return; } } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestMax136/000077500000000000000000000000001207233610700237435ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestMax136/Makefile000066400000000000000000000001011207233610700253730ustar00rootroot00000000000000COMPONENT=TestSensorC SENSORBOARD ?= im2sb include $(MAKERULES)tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestMax136/TestSensorC.nc000066400000000000000000000043761207233610700265130ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Demo application of the Maxim MAX136X. Originally developed for the * Intel Mote 2 sensorboard. * * @author Kaisen Lin * @author Philip Buonadonna */ configuration TestSensorC{} implementation { components MainC, TestSensorM, LedsC; components new MAX136xC() as Sensor; MainC.Boot <- TestSensorM; TestSensorM.Leds -> LedsC; TestSensorM.ADC -> Sensor; TestSensorM.SensorControl -> Sensor.SplitControl; TestSensorM.HalMAX136xAdvanced -> Sensor; components new TimerMilliC() as Timer0; TestSensorM.Timer0 -> Timer0; components SerialActiveMessageC as AM; TestSensorM.AMSend -> AM.AMSend[AM_TESTSENSORMSG]; TestSensorM.Packet -> AM; TestSensorM.MsgControl -> AM; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestMax136/TestSensorM.nc000066400000000000000000000106001207233610700265100ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Demo application of the Maxim MAX136X. Originally developed for the * Intel Mote 2 sensorboard. * * @author Kaisen Lin * @author Philip Buonadonna */ #include "MAX136x.h" #include "../TestSensor.h" /* Uncomment the flag below to test the interrupt functions of the chip */ //#define USE_INTERRUPTS module TestSensorM { uses interface Boot; uses interface Timer as Timer0; uses interface Read as ADC; uses interface HalMAX136xAdvanced; uses interface SplitControl as SensorControl; uses interface SplitControl as MsgControl; uses interface Leds; uses interface AMSend; uses interface Packet; } implementation { message_t packet; event void Boot.booted() { call SensorControl.start(); } event void Timer0.fired() { call ADC.read(); } event void SensorControl.startDone(error_t result) { call MsgControl.start(); } event void SensorControl.stopDone(error_t result) { return; } event void MsgControl.startDone(error_t result) { #ifndef USE_INTERRUPTS call Timer0.startPeriodic( 100 ); #else uint16_t chan0Low = 200; uint16_t chan0High = 700; uint8_t ucThresholds[12]; uint8_t i; ucThresholds[0] = (chan0Low >> 4); ucThresholds[1] = ( ((chan0Low & 0xF) << 4) | (chan0High >> 8)); ucThresholds[2] = chan0High & 0xFF; for (i=3;i<12;i+=3) { ucThresholds[i] = 0x00; ucThresholds[i+1] = 0x0F; ucThresholds[i+2] = 0xFF; } call HalMAX136xAdvanced.setMonitorMode(0,0,MAX136X_DELAY_1_0,ucThresholds); #endif } event void MsgControl.stopDone(error_t result) { return; } event void ADC.readDone(error_t result, max136x_data_t val) { TestSensorMsg *rcm = (TestSensorMsg *)call Packet.getPayload(&packet, NULL); call Leds.led0Toggle(); if (call Packet.maxPayloadLength() < sizeof(TestSensorMsg)) { return; } rcm->value = val & 0x3FF; call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(TestSensorMsg)); } event void HalMAX136xAdvanced.setScanModeDone(error_t error) {} event void HalMAX136xAdvanced.setMonitorModeDone(error_t error) { call Leds.set(LEDS_LED1); call HalMAX136xAdvanced.enableAlert(TRUE); } event void HalMAX136xAdvanced.setConversionModeDone(error_t error) {} event void HalMAX136xAdvanced.setClockDone(error_t error) {} event void HalMAX136xAdvanced.setRefDone(error_t error) {} event void HalMAX136xAdvanced.getStatusDone(error_t error, uint8_t status, max136x_data_t data) {} event void HalMAX136xAdvanced.enableAlertDone(error_t error) { call Leds.set(LEDS_LED1 | LEDS_LED2); return; } event void HalMAX136xAdvanced.alertThreshold() { call Leds.led0Toggle(); call HalMAX136xAdvanced.enableAlert(TRUE); // Clears interrupt return; } event void AMSend.sendDone(message_t* bufPtr, error_t error) { return; } } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestSensor.h000066400000000000000000000002411207233610700244030ustar00rootroot00000000000000#ifndef TEST_SENSOR_H #define TEST_SENSOR_H typedef nx_struct TestSensorMsg { nx_uint16_t value; } TestSensorMsg; enum { AM_TESTSENSORMSG = 10, }; #endif tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestSensor.java000066400000000000000000000070501207233610700251020ustar00rootroot00000000000000/* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Java-side application for testing serial port communication. * * * @author Phil Levis * @date August 12 2005 */ import java.io.IOException; import net.tinyos.message.*; import net.tinyos.packet.*; import net.tinyos.util.*; public class TestSensor implements MessageListener { private MoteIF moteIF; public TestSensor(MoteIF moteIF) { this.moteIF = moteIF; this.moteIF.registerListener(new TestSensorMsg(), this); } public void sendPackets() { int counter = 0; TestSensorMsg payload = new TestSensorMsg(); try { while (true) { /* System.out.println("Sending packet " + counter); payload.set_counter(counter); moteIF.send(0, payload); counter++; */ try {Thread.sleep(1000);} catch (InterruptedException exception) {} } } catch (Exception exception) { System.err.println("Exception thrown when sending packets. Exiting."); System.err.println(exception); } } public void messageReceived(int to, Message message) { TestSensorMsg msg = (TestSensorMsg)message; System.out.println("Received packet. Value= " + msg.get_value()); } private static void usage() { System.err.println("usage: TestSensor [-comm ]"); } public static void main(String[] args) throws Exception { String source = null; if (args.length == 2) { if (!args[0].equals("-comm")) { usage(); System.exit(1); } source = args[1]; } else if (args.length != 0) { usage(); System.exit(1); } PhoenixSource phoenix; if (source == null) { phoenix = BuildSource.makePhoenix(PrintStreamMessenger.err); } else { phoenix = BuildSource.makePhoenix(source, PrintStreamMessenger.err); } MoteIF mif = new MoteIF(phoenix); TestSensor serial = new TestSensor(mif); serial.sendPackets(); } } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestSensorMsg.java000066400000000000000000000102201207233610700255420ustar00rootroot00000000000000/** * This class is automatically generated by mig. DO NOT EDIT THIS FILE. * This class implements a Java interface to the 'TestSensorMsg' * message type. */ public class TestSensorMsg extends net.tinyos.message.Message { /** The default size of this message type in bytes. */ public static final int DEFAULT_MESSAGE_SIZE = 2; /** The Active Message type associated with this message. */ public static final int AM_TYPE = 10; /** Create a new TestSensorMsg of size 2. */ public TestSensorMsg() { super(DEFAULT_MESSAGE_SIZE); amTypeSet(AM_TYPE); } /** Create a new TestSensorMsg of the given data_length. */ public TestSensorMsg(int data_length) { super(data_length); amTypeSet(AM_TYPE); } /** * Create a new TestSensorMsg with the given data_length * and base offset. */ public TestSensorMsg(int data_length, int base_offset) { super(data_length, base_offset); amTypeSet(AM_TYPE); } /** * Create a new TestSensorMsg using the given byte array * as backing store. */ public TestSensorMsg(byte[] data) { super(data); amTypeSet(AM_TYPE); } /** * Create a new TestSensorMsg using the given byte array * as backing store, with the given base offset. */ public TestSensorMsg(byte[] data, int base_offset) { super(data, base_offset); amTypeSet(AM_TYPE); } /** * Create a new TestSensorMsg using the given byte array * as backing store, with the given base offset and data length. */ public TestSensorMsg(byte[] data, int base_offset, int data_length) { super(data, base_offset, data_length); amTypeSet(AM_TYPE); } /** * Create a new TestSensorMsg embedded in the given message * at the given base offset. */ public TestSensorMsg(net.tinyos.message.Message msg, int base_offset) { super(msg, base_offset, DEFAULT_MESSAGE_SIZE); amTypeSet(AM_TYPE); } /** * Create a new TestSensorMsg embedded in the given message * at the given base offset and length. */ public TestSensorMsg(net.tinyos.message.Message msg, int base_offset, int data_length) { super(msg, base_offset, data_length); amTypeSet(AM_TYPE); } /** /* Return a String representation of this message. Includes the * message type name and the non-indexed field values. */ public String toString() { String s = "Message \n"; try { s += " [value=0x"+Long.toHexString(get_value())+"]\n"; } catch (ArrayIndexOutOfBoundsException aioobe) { /* Skip field */ } return s; } // Message-type-specific access methods appear below. ///////////////////////////////////////////////////////// // Accessor methods for field: value // Field type: int, unsigned // Offset (bits): 0 // Size (bits): 16 ///////////////////////////////////////////////////////// /** * Return whether the field 'value' is signed (false). */ public static boolean isSigned_value() { return false; } /** * Return whether the field 'value' is an array (false). */ public static boolean isArray_value() { return false; } /** * Return the offset (in bytes) of the field 'value' */ public static int offset_value() { return (0 / 8); } /** * Return the offset (in bits) of the field 'value' */ public static int offsetBits_value() { return 0; } /** * Return the value (as a int) of the field 'value' */ public int get_value() { return (int)getUIntBEElement(offsetBits_value(), 16); } /** * Set the value of the field 'value' */ public void set_value(int value) { setUIntBEElement(offsetBits_value(), 16, value); } /** * Return the size, in bytes, of the field 'value' */ public static int size_value() { return (16 / 8); } /** * Return the size, in bits, of the field 'value' */ public static int sizeBits_value() { return 16; } } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestSht11/000077500000000000000000000000001207233610700236645ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestSht11/README.txt000066400000000000000000000003511207233610700253610ustar00rootroot00000000000000Sht11 Test Sensor A simple application to demonstrate/test the SHT11 on the Intel Mote 2 sensorboard. NOTE: If using the debug/programming board you must set SW5 to either the SPI or I2C settings for the SHT11 to work correctly. tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestSht11/TestSensorC.nc000066400000000000000000000045041207233610700264250ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Demo application of the Sensirion SHT11. Originally developed for the * Intel Mote 2 sensorboard. * * @author Kaisen Lin * @author Philip Buonadonna */ configuration TestSensorC{} implementation { components MainC, TestSensorM, LedsC; components new SensirionSht11C() as Sensor; MainC.Boot <- TestSensorM; TestSensorM.Leds -> LedsC; TestSensorM.Temperature -> Sensor.Temperature; TestSensorM.Humidity -> Sensor.Humidity; TestSensorM.HalSht11Advanced -> Sensor; TestSensorM.SensorControl -> Sensor.SplitControl; components new TimerMilliC() as Timer0; TestSensorM.Timer0 -> Timer0; components SerialActiveMessageC as AM; TestSensorM.AMSend -> AM.AMSend[AM_TESTSENSORMSG]; TestSensorM.Packet -> AM; TestSensorM.MsgControl -> AM; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestSht11/TestSensorM.nc000066400000000000000000000066111207233610700264400ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Demo application of the TAOS Tsl2561. Originally developed for the * Intel Mote 2 sensorboard. * * @author Kaisen Lin * @author Philip Buonadonna */ #include "../TestSensor.h" module TestSensorM { uses interface Boot; uses interface Timer as Timer0; uses interface Read as Temperature; uses interface Read as Humidity; uses interface HalSht11Advanced; uses interface SplitControl as SensorControl; uses interface SplitControl as MsgControl; uses interface Leds; uses interface AMSend; uses interface Packet; } implementation { message_t packet; event void Boot.booted() { call SensorControl.start(); } event void SensorControl.startDone(error_t error) { call MsgControl.start(); } event void SensorControl.stopDone(error_t error) { } event void MsgControl.startDone(error_t error) { call HalSht11Advanced.getVoltageStatus(); call Timer0.startPeriodic( 100 ); } event void MsgControl.stopDone(error_t error) { } event void Timer0.fired() { //call Temperature.read(); call Humidity.read(); } event void Temperature.readDone(error_t result, uint16_t val) { call Leds.led0Toggle(); } event void Humidity.readDone(error_t result, uint16_t val) { TestSensorMsg *rcm = (TestSensorMsg *)call Packet.getPayload(&packet, NULL); call Leds.led1Toggle(); if (call Packet.maxPayloadLength() < sizeof(TestSensorMsg)) { return; } rcm->value = val; call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(TestSensorMsg)); } event void HalSht11Advanced.getVoltageStatusDone(error_t error, bool isLow) {} event void HalSht11Advanced.setHeaterDone(error_t error) {} event void HalSht11Advanced.setResolutionDone(error_t error) {} event void AMSend.sendDone(message_t* bufPtr, error_t error) { return; } } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestTmp175/000077500000000000000000000000001207233610700237615ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestTmp175/Makefile000066400000000000000000000001301207233610700254130ustar00rootroot00000000000000COMPONENT=TestSensorC CFLAGS += -I%T/lib/oski SENSORBOARD ?= im2sb include $(MAKERULES)tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestTmp175/TestSensorC.nc000066400000000000000000000043751207233610700265300ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Demo application of the TI TMP175. Originally developed for the * Intel Mote 2 sensorboard. * * @author Kaisen Lin * @author Philip Buonadonna */ configuration TestSensorC{} implementation { components MainC, TestSensorM, LedsC; components new TMP175C() as Sensor; MainC.Boot <- TestSensorM; TestSensorM.Leds -> LedsC; TestSensorM.Temperature -> Sensor; TestSensorM.SubControl -> Sensor.SplitControl; TestSensorM.HalTMP175Advanced -> Sensor; components new TimerMilliC() as Timer0; TestSensorM.Timer0 -> Timer0; components SerialActiveMessageC as AM; TestSensorM.AMSend -> AM.AMSend[AM_TESTSENSORMSG]; TestSensorM.Packet -> AM; TestSensorM.SubControl -> AM; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestTmp175/TestSensorM.nc000066400000000000000000000073471207233610700265440ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Demo application of the TI TMP175. Originally developed for the * Intel Mote 2 sensorboard. * * @author Kaisen Lin * @author Philip Buonadonna */ #include "../TestSensor.h" /* Uncomment the flag below to test the interrupt functions of the chip */ //#define USE_INTERRUPTS module TestSensorM { uses interface Boot; uses interface Timer as Timer0; uses interface Read as Temperature; uses interface SplitControl as SubControl; uses interface HalTMP175Advanced; uses interface Leds; uses interface AMSend; uses interface Packet; } implementation { uint8_t ledcount = 0; message_t packet; event void Boot.booted() { call SubControl.start(); } event void Timer0.fired() { call Temperature.read(); } event void SubControl.startDone(error_t result) { #ifdef USE_INTERRUPTS call HalTMP175Advanced.setPolarity(TRUE); #else call Timer0.startPeriodic( 100 ); #endif } event void SubControl.stopDone(error_t result) { } event void Temperature.readDone(error_t result, uint16_t val) { TestSensorMsg *rcm = (TestSensorMsg *)call Packet.getPayload(&packet, NULL); call Leds.led0Toggle(); if (call Packet.maxPayloadLength() < sizeof(TestSensorMsg)) { return; } rcm->value = val; call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(TestSensorMsg)); } event void HalTMP175Advanced.setTHighDone(error_t error) { call HalTMP175Advanced.setTLow(352); } event void HalTMP175Advanced.setThermostatModeDone(error_t error){ call HalTMP175Advanced.setTHigh(448); } event void HalTMP175Advanced.setPolarityDone(error_t error){ call HalTMP175Advanced.setThermostatMode(TRUE); } event void HalTMP175Advanced.setFaultQueueDone(error_t error){ return; } event void HalTMP175Advanced.setResolutionDone(error_t error){ return; } event void HalTMP175Advanced.setTLowDone(error_t error){ //call Timer0.startPeriodic( 1000 ); call Leds.led2Toggle(); } event void HalTMP175Advanced.alertThreshold() { #ifdef USE_INTERRUPTS call Temperature.read(); call Leds.led0Toggle(); #endif } event void AMSend.sendDone(message_t* bufPtr, error_t error) { return; } } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestTsl2561/000077500000000000000000000000001207233610700240445ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestTsl2561/Makefile000066400000000000000000000001011207233610700254740ustar00rootroot00000000000000COMPONENT=TestSensorC SENSORBOARD ?= im2sb include $(MAKERULES)tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestTsl2561/TestSensorC.nc000066400000000000000000000044731207233610700266120ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Demo application of the TAOS Tsl2561. Originally developed for the * Intel Mote 2 sensorboard. * * @author Kaisen Lin * @author Philip Buonadonna */ configuration TestSensorC{} implementation { components MainC, TestSensorM, LedsC; components new Tsl2561C() as Sensor; MainC.Boot <- TestSensorM; TestSensorM.Leds -> LedsC; TestSensorM.ReadBroadband -> Sensor.BroadbandPhoto; TestSensorM.SubControl -> Sensor.SplitControl; TestSensorM.ReadIR -> Sensor.IRPhoto; TestSensorM.HalTsl2561Advanced -> Sensor; components new TimerMilliC() as Timer0; TestSensorM.Timer0 -> Timer0; components SerialActiveMessageC as AM; TestSensorM.AMSend -> AM.AMSend[AM_TESTSENSORMSG]; TestSensorM.Packet -> AM; TestSensorM.SubControl -> AM; } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/examples/TestTsl2561/TestSensorM.nc000066400000000000000000000100361207233610700266140ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Demo application of the TAOS Tsl2561. Originally developed for the * Intel Mote 2 sensorboard. * * @author Kaisen Lin * @author Philip Buonadonna */ #include "../TestSensor.h" /* Uncomment the flag below to test the interrupt functions of the chip */ //#define USE_INTERRUPTS module TestSensorM { uses interface Boot; uses interface Timer as Timer0; uses interface Read as ReadIR; uses interface Read as ReadBroadband; uses interface SplitControl as SubControl; uses interface HalTsl2561Advanced; uses interface Leds; uses interface AMSend; uses interface Packet; } implementation { message_t packet; uint8_t initCounter = 0; event void Boot.booted() { call SubControl.start(); } event void Timer0.fired() { call ReadBroadband.read(); } event void SubControl.startDone(error_t result) { #ifndef USE_INTERRUPTS call Timer0.startPeriodic( 100 ); #else call HalTsl2561Advanced.enableAlert(FALSE); #endif return; } event void SubControl.stopDone(error_t result) { } event void ReadBroadband.readDone(error_t result, uint16_t val) { TestSensorMsg *rcm = (TestSensorMsg *)call Packet.getPayload(&packet, NULL); call Leds.led0Toggle(); if (call Packet.maxPayloadLength() < sizeof(TestSensorMsg)) { return; } rcm->value = val; call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(TestSensorMsg)); } event void ReadIR.readDone(error_t result, uint16_t val) { } event void HalTsl2561Advanced.setGainDone(error_t error) { } event void HalTsl2561Advanced.setIntegrationDone(error_t error) { } event void HalTsl2561Advanced.setPersistenceDone(error_t error) { call HalTsl2561Advanced.enableAlert(TRUE); } event void HalTsl2561Advanced.setTLowDone(error_t error) { call HalTsl2561Advanced.setTHigh(7000); } event void HalTsl2561Advanced.setTHighDone(error_t error) { call HalTsl2561Advanced.setPersistence(1); } event void HalTsl2561Advanced.enableAlertDone(error_t error) { switch (initCounter) { case 0: call HalTsl2561Advanced.setTLow(200); initCounter++; break; case 1: call Leds.set(LEDS_LED2 | LEDS_LED0); initCounter++; break; default: break; } } event void HalTsl2561Advanced.alertThreshold() { call Leds.led1Toggle(); call HalTsl2561Advanced.enableAlert(TRUE); // Clears interrupt } event void AMSend.sendDone(message_t* bufPtr, error_t error) { return; } } tinyos-2.1.2+dfsg/tos/sensorboards/im2sb/im2sb.h000066400000000000000000000041401207233610700214720ustar00rootroot00000000000000/* $Id: im2sb.h,v 1.5 2008-06-11 00:42:14 razvanm Exp $ */ /* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ /** * * @author Phil Buonadonna * Revision: $Revision: 1.5 $ * */ #ifndef _IM2SB_H #define _IM2SB_H #define GPIO_SHT11_DATA (100) #define GPIO_SHT11_CLK (98) #define GPIO_TSL2561_LIGHT_INT (99) #define GPIO_MAX1363_ANALOG_INT (99) #define GPIO_LIS3L02DQ_RDY_INT (96) #define GPIO_TMP175_TEMP_ALERT (96) #define GPIO_PWR_ADC_NSHDWN (93) #define TSL2561_SLAVE_ADDR (0x49) #define TMP175_SLAVE_ADDR (0x48) #define MAX136_SLAVE_ADDR (0x34) #endif /* _IM2SB_H */ tinyos-2.1.2+dfsg/tos/sensorboards/mda100/000077500000000000000000000000001207233610700202545ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/mda100/.sensor000066400000000000000000000000001207233610700215540ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/mda100/ArbitratedPhotoDeviceP.nc000066400000000000000000000037041207233610700251350ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date August 20th, 2007 */ configuration ArbitratedPhotoDeviceP { provides interface Read[uint8_t client]; } implementation { components PhotoImplP, new ArbitratedReadC(uint16_t) as ArbitrateRead; Read = ArbitrateRead; ArbitrateRead.Service -> PhotoImplP.Read; ArbitrateRead.Resource -> PhotoImplP.Resource; } tinyos-2.1.2+dfsg/tos/sensorboards/mda100/ArbitratedTempDeviceP.nc000066400000000000000000000037001207233610700247450ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date August 20th, 2007 */ configuration ArbitratedTempDeviceP { provides interface Read[uint8_t client]; } implementation { components TempImplP, new ArbitratedReadC(uint16_t) as ArbitrateRead; Read = ArbitrateRead; ArbitrateRead.Service -> TempImplP.Read; ArbitrateRead.Resource -> TempImplP.Resource; } tinyos-2.1.2+dfsg/tos/sensorboards/mda100/DemoSensorC.nc000066400000000000000000000011741207233610700227620ustar00rootroot00000000000000/* $Id: DemoSensorC.nc,v 1.1 2007-08-21 04:44:09 klueska Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Demo sensor for basicsb sensorboard. * * @author David Gay */ generic configuration DemoSensorC() { provides interface Read; } implementation { components new PhotoC() as Sensor; Read = Sensor; } tinyos-2.1.2+dfsg/tos/sensorboards/mda100/PhotoC.nc000066400000000000000000000013001207233610700217640ustar00rootroot00000000000000/* $Id: PhotoC.nc,v 1.1 2007-08-21 04:44:09 klueska Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Photodiode of the mda100 sensor board. * * @author David Gay */ #include "mda100.h" generic configuration PhotoC() { provides interface Read; } implementation { components ArbitratedPhotoDeviceP; Read = ArbitratedPhotoDeviceP.Read[unique(UQ_MDA100_PHOTO_RESOURCE)]; } tinyos-2.1.2+dfsg/tos/sensorboards/mda100/PhotoImplP.nc000066400000000000000000000041341207233610700226330ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date August 20th, 2007 */ #include "mda100.h" configuration PhotoImplP { provides { interface Resource[uint8_t]; interface Read[uint8_t]; } } implementation { components new SharedAnalogDeviceC(UQ_MDA100_PHOTO_RESOURCE, 10); components MicaBusC; components PhotoTempConfigC as PhotoConfigC; Resource = SharedAnalogDeviceC; Read = SharedAnalogDeviceC; SharedAnalogDeviceC.AdcConfig -> PhotoConfigC; SharedAnalogDeviceC.EnablePin -> MicaBusC.Int1; } tinyos-2.1.2+dfsg/tos/sensorboards/mda100/PhotoTempConfigC.nc000066400000000000000000000035731207233610700237560ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date August 20th, 2007 */ configuration PhotoTempConfigC { provides interface Atm128AdcConfig; } implementation { components PhotoTempConfigP; components MicaBusC; Atm128AdcConfig = PhotoTempConfigP; PhotoTempConfigP.PhotoTempAdc -> MicaBusC.Adc1; } tinyos-2.1.2+dfsg/tos/sensorboards/mda100/PhotoTempConfigP.nc000066400000000000000000000016551207233610700237720ustar00rootroot00000000000000/* $Id: PhotoTempConfigP.nc,v 1.1 2007-08-21 04:44:09 klueska Exp $ * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * MDA100 photo and temp sensor ADC configuration. * @author David Gay */ module PhotoTempConfigP { provides interface Atm128AdcConfig; uses interface MicaBusAdc as PhotoTempAdc; } implementation { async command uint8_t Atm128AdcConfig.getChannel() { return call PhotoTempAdc.getChannel(); } async command uint8_t Atm128AdcConfig.getRefVoltage() { return ATM128_ADC_VREF_OFF; } async command uint8_t Atm128AdcConfig.getPrescaler() { return ATM128_ADC_PRESCALE; } } tinyos-2.1.2+dfsg/tos/sensorboards/mda100/SharedAnalogDeviceC.nc000066400000000000000000000050641207233610700243560ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date August 20th, 2007 */ generic configuration SharedAnalogDeviceC(char resourceName[], uint32_t startup_delay) { provides { interface Resource[uint8_t]; interface Read[uint8_t]; } uses { interface Atm128AdcConfig as AdcConfig; interface GeneralIO as EnablePin; } } implementation { components new RoundRobinArbiterC(resourceName) as Arbiter; components new SplitControlPowerManagerC() as PowerManager; components new SharedAnalogDeviceP(startup_delay) as AnalogDevice; components new AdcReadNowClientC() as Adc; components new TimerMilliC(); Resource = Arbiter; Read = AnalogDevice; PowerManager.ArbiterInfo -> Arbiter; PowerManager.SplitControl -> AnalogDevice; PowerManager.ResourceDefaultOwner -> Arbiter; AnalogDevice.ActualRead -> Adc; AnalogDevice.Timer -> TimerMilliC; AnalogDevice.AnalogDeviceResource -> Adc; Adc.Atm128AdcConfig = AdcConfig; AnalogDevice.EnablePin = EnablePin; } tinyos-2.1.2+dfsg/tos/sensorboards/mda100/SharedAnalogDeviceP.nc000066400000000000000000000067371207233610700244030ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date August 20th, 2007 */ generic module SharedAnalogDeviceP(uint32_t startup_delay) { provides { interface SplitControl; interface Read[uint8_t]; } uses { interface Resource as AnalogDeviceResource; interface Timer; interface GeneralIO as EnablePin; interface ReadNow as ActualRead; } } implementation { bool started = FALSE; bool busy = FALSE; uint8_t client_id; norace error_t read_result; norace uint16_t read_val; command error_t SplitControl.start() { error_t error; if(started == FALSE) { error = call AnalogDeviceResource.request(); if(error == SUCCESS) started = TRUE; return error; } return FAIL; } event void AnalogDeviceResource.granted() { call EnablePin.makeOutput(); call EnablePin.set(); call Timer.startOneShot(startup_delay); } event void Timer.fired() { signal SplitControl.startDone(SUCCESS); } task void stopDone() { call AnalogDeviceResource.release(); started = FALSE; signal SplitControl.stopDone(SUCCESS); } command error_t SplitControl.stop() { if(started == TRUE) { call EnablePin.clr(); call EnablePin.makeInput(); post stopDone(); return SUCCESS; } else if(busy == TRUE) return EBUSY; return FAIL; } command error_t Read.read[uint8_t id]() { error_t error; if(call AnalogDeviceResource.isOwner() && busy == FALSE) { error = call ActualRead.read(); if(error == SUCCESS) { busy = TRUE; client_id = id; } return error; } return FAIL; } task void readDoneTask() { busy = FALSE; signal Read.readDone[client_id](read_result, read_val); } async event void ActualRead.readDone(error_t result, uint16_t val) { read_result = result; read_val = val; post readDoneTask(); } } tinyos-2.1.2+dfsg/tos/sensorboards/mda100/TempC.nc000066400000000000000000000012731207233610700216110ustar00rootroot00000000000000/* $Id: TempC.nc,v 1.2 2008-06-11 00:42:15 razvanm Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Photodiode of the mda100 sensor board. * * @author David Gay */ #include "mda100.h" generic configuration TempC() { provides interface Read; } implementation { components ArbitratedTempDeviceP; Read = ArbitratedTempDeviceP.Read[unique(UQ_MDA100_TEMP_RESOURCE)]; } tinyos-2.1.2+dfsg/tos/sensorboards/mda100/ca/000077500000000000000000000000001207233610700206375ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/mda100/ca/TempImplP.nc000066400000000000000000000041301207233610700230260ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date August 20th, 2007 */ #include "mda100.h" configuration TempImplP { provides { interface Resource[uint8_t]; interface Read[uint8_t]; } } implementation { components new SharedAnalogDeviceC(UQ_MDA100_TEMP_RESOURCE, 10); components MicaBusC; components PhotoTempConfigC as TempConfigC; Resource = SharedAnalogDeviceC; Read = SharedAnalogDeviceC; SharedAnalogDeviceC.AdcConfig -> TempConfigC; SharedAnalogDeviceC.EnablePin -> MicaBusC.Int2; } tinyos-2.1.2+dfsg/tos/sensorboards/mda100/cb/000077500000000000000000000000001207233610700206405ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/mda100/cb/TempImplP.nc000066400000000000000000000041271207233610700230350ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date August 20th, 2007 */ #include "mda100.h" configuration TempImplP { provides { interface Resource[uint8_t]; interface Read[uint8_t]; } } implementation { components new SharedAnalogDeviceC(UQ_MDA100_TEMP_RESOURCE, 10); components MicaBusC; components PhotoTempConfigC as TempConfigC; Resource = SharedAnalogDeviceC; Read = SharedAnalogDeviceC; SharedAnalogDeviceC.AdcConfig -> TempConfigC; SharedAnalogDeviceC.EnablePin -> MicaBusC.PW0; } tinyos-2.1.2+dfsg/tos/sensorboards/mda100/mda100.h000066400000000000000000000034541207233610700214150ustar00rootroot00000000000000/* * Copyright (c) 2007 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Kevin Klues * @date August 20th, 2007 */ #ifndef _MDA100_H #define _MDA100_H #define UQ_MDA100_PHOTO_RESOURCE "mda100.photo" #define UQ_MDA100_TEMP_RESOURCE "mda100.temp" #endif /* _MDA100_H */ tinyos-2.1.2+dfsg/tos/sensorboards/mts300/000077500000000000000000000000001207233610700203205ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/mts300/.sensor000066400000000000000000000003101207233610700216240ustar00rootroot00000000000000# # The MTS300 board does not have an external pullup resistor on the I2C # lines, so we need to enable the internal pullup resistor on the MCU. # push @new_args, "-DATM128_I2C_EXTERNAL_PULLDOWN=1"; tinyos-2.1.2+dfsg/tos/sensorboards/mts300/AccelConfigP.nc000066400000000000000000000024331207233610700231210ustar00rootroot00000000000000/* $Id: AccelConfigP.nc,v 1.3 2007-03-14 03:25:05 pipeng Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Internal component for basicsb photodiode. Arbitrates access to the photo * diode and automatically turns it on or off based on user requests. * * @author David Gay */ configuration AccelConfigP { provides { interface Resource[uint8_t client]; interface Atm128AdcConfig as ConfigX; interface Atm128AdcConfig as ConfigY; } } implementation { components AccelP, MicaBusC, new TimerMilliC() as WarmupTimer, new RoundRobinArbiterC(UQ_ACCEL_RESOURCE) as Arbiter, new SplitControlPowerManagerC() as PowerManager; Resource = Arbiter; ConfigX = AccelP.ConfigX; ConfigY = AccelP.ConfigY; PowerManager.ResourceDefaultOwner -> Arbiter; PowerManager.ArbiterInfo -> Arbiter; PowerManager.SplitControl -> AccelP; AccelP.Timer -> WarmupTimer; AccelP.AccelPin -> MicaBusC.PW4; AccelP.AccelAdcX -> MicaBusC.Adc3; AccelP.AccelAdcY -> MicaBusC.Adc4; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/AccelP.nc000066400000000000000000000035471207233610700220020ustar00rootroot00000000000000/* $Id: AccelP.nc,v 1.3 2007-03-14 03:25:05 pipeng Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * ADXL202JE accelerometer ADC configuration and power management. * @author David Gay */ module AccelP { provides { interface SplitControl; interface Atm128AdcConfig as ConfigX; interface Atm128AdcConfig as ConfigY; } uses { interface Timer; interface GeneralIO as AccelPin; interface MicaBusAdc as AccelAdcX; interface MicaBusAdc as AccelAdcY; } } implementation { async command uint8_t ConfigX.getChannel() { return call AccelAdcX.getChannel(); } async command uint8_t ConfigX.getRefVoltage() { return ATM128_ADC_VREF_OFF; } async command uint8_t ConfigX.getPrescaler() { return ATM128_ADC_PRESCALE; } async command uint8_t ConfigY.getChannel() { return call AccelAdcY.getChannel(); } async command uint8_t ConfigY.getRefVoltage() { return ATM128_ADC_VREF_OFF; } async command uint8_t ConfigY.getPrescaler() { return ATM128_ADC_PRESCALE; } command error_t SplitControl.start() { call AccelPin.makeOutput(); call AccelPin.set(); /* Startup time is 16.3ms for 0.1uF capacitors, according to the ADXL202E data sheet */ call Timer.startOneShot(17); return SUCCESS; } event void Timer.fired() { signal SplitControl.startDone(SUCCESS); } task void stopDone() { call AccelPin.clr(); signal SplitControl.stopDone(SUCCESS); } command error_t SplitControl.stop() { post stopDone(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/AccelReadP.nc000066400000000000000000000016011207233610700225630ustar00rootroot00000000000000configuration AccelReadP { provides { interface Read as ReadX[uint8_t client]; interface Read as ReadY[uint8_t client]; } uses { interface Read as ActualX[uint8_t client]; interface Read as ActualY[uint8_t client]; } } implementation { components AccelConfigP, // new MultiplexedReadC(uint16_t) as MultiplexX, // new MultiplexedReadC(uint16_t) as MultiplexY, new ArbitratedReadC(uint16_t) as MultiplexX, new ArbitratedReadC(uint16_t) as MultiplexY; // new AdcReadClientC() as AdcX, // new AdcReadClientC() as AdcY; ReadX = MultiplexX; MultiplexX.Resource -> AccelConfigP; MultiplexX.Service = ActualX; //AdcX.Atm128AdcConfig -> AccelConfigP.ConfigX; ReadY = MultiplexY; MultiplexY.Resource -> AccelConfigP; MultiplexY.Service = ActualY; //AdcY.Atm128AdcConfig -> AccelConfigP.ConfigY; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/AccelReadStreamP.nc000066400000000000000000000014141207233610700237410ustar00rootroot00000000000000configuration AccelReadStreamP { provides { interface ReadStream as ReadStreamX[uint8_t client]; interface ReadStream as ReadStreamY[uint8_t client]; } uses { interface ReadStream as ActualX[uint8_t client]; interface ReadStream as ActualY[uint8_t client]; } } implementation { enum { NACCEL_CLIENTS = uniqueCount(UQ_ACCEL_RESOURCE) }; components AccelConfigP, new ArbitratedReadStreamC(NACCEL_CLIENTS, uint16_t) as MultiplexX, new ArbitratedReadStreamC(NACCEL_CLIENTS, uint16_t) as MultiplexY; ReadStreamX = MultiplexX; MultiplexX.Resource -> AccelConfigP; MultiplexX.Service = ActualX; ReadStreamY = MultiplexY; MultiplexY.Resource -> AccelConfigP; MultiplexY.Service = ActualY; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/AccelXC.nc000066400000000000000000000014771207233610700221150ustar00rootroot00000000000000/* $Id: AccelXC.nc,v 1.3 2007-03-14 04:57:35 pipeng Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Acceldiode of the basicsb sensor board. * * @author David Gay */ #include "mts300.h" generic configuration AccelXC() { provides interface Read; } implementation { enum { ID = unique(UQ_ACCEL_RESOURCE) }; components AccelReadP,AccelConfigP, new AdcReadClientC() as AdcX; Read = AccelReadP.ReadX[ID]; AccelReadP.ActualX[ID] -> AdcX; AdcX.Atm128AdcConfig -> AccelConfigP.ConfigX; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/AccelXStreamC.nc000066400000000000000000000016131207233610700232610ustar00rootroot00000000000000/* $Id: AccelXStreamC.nc,v 1.3 2007-03-14 04:57:35 pipeng Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * AccelXdiode of the basicsb sensor board. * * @author David Gay */ #include "mts300.h" generic configuration AccelXStreamC() { provides interface ReadStream; } implementation { enum { ID = unique(UQ_ACCEL_RESOURCE) }; components AccelReadStreamP, AccelConfigP, new AdcReadStreamClientC(); ReadStream = AccelReadStreamP.ReadStreamX[ID]; AccelReadStreamP.ActualX[ID] -> AdcReadStreamClientC; AdcReadStreamClientC.Atm128AdcConfig -> AccelConfigP.ConfigX; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/AccelYC.nc000066400000000000000000000014751207233610700221140ustar00rootroot00000000000000/* $Id: AccelYC.nc,v 1.3 2007-03-14 04:57:35 pipeng Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Acceldiode of the basicsb sensor board. * * @author David Gay */ #include "mts300.h" generic configuration AccelYC() { provides interface Read; } implementation { enum { ID = unique(UQ_ACCEL_RESOURCE) }; components AccelReadP,AccelConfigP, new AdcReadClientC() as AdcY; Read = AccelReadP.ReadY[ID]; AccelReadP.ActualY[ID] -> AdcY; AdcY.Atm128AdcConfig -> AccelConfigP.ConfigY; }tinyos-2.1.2+dfsg/tos/sensorboards/mts300/AccelYStreamC.nc000066400000000000000000000016131207233610700232620ustar00rootroot00000000000000/* $Id: AccelYStreamC.nc,v 1.3 2007-03-14 04:57:35 pipeng Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * AccelXdiode of the basicsb sensor board. * * @author David Gay */ #include "mts300.h" generic configuration AccelYStreamC() { provides interface ReadStream; } implementation { enum { ID = unique(UQ_ACCEL_RESOURCE) }; components AccelReadStreamP, AccelConfigP, new AdcReadStreamClientC(); ReadStream = AccelReadStreamP.ReadStreamY[ID]; AccelReadStreamP.ActualY[ID] -> AdcReadStreamClientC; AdcReadStreamClientC.Atm128AdcConfig -> AccelConfigP.ConfigY; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/ArbitratedPhotoDeviceP.nc000066400000000000000000000005201207233610700251720ustar00rootroot00000000000000configuration ArbitratedPhotoDeviceP { provides interface Read[uint8_t client]; } implementation { components PhotoTempDeviceC, new ArbitratedReadC(uint16_t) as ArbitrateRead; Read = ArbitrateRead; ArbitrateRead.Service -> PhotoTempDeviceC.ReadPhoto; ArbitrateRead.Resource -> PhotoTempDeviceC.PhotoResource; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/ArbitratedTempDeviceP.nc000066400000000000000000000005151207233610700250120ustar00rootroot00000000000000configuration ArbitratedTempDeviceP { provides interface Read[uint8_t client]; } implementation { components PhotoTempDeviceC, new ArbitratedReadC(uint16_t) as ArbitrateRead; Read = ArbitrateRead; ArbitrateRead.Service -> PhotoTempDeviceC.ReadTemp; ArbitrateRead.Resource -> PhotoTempDeviceC.TempResource; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/DemoSensorC.nc000066400000000000000000000011721207233610700230240ustar00rootroot00000000000000/* $Id: DemoSensorC.nc,v 1.3 2007-04-18 20:56:53 idgay Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Demo sensor for basicsb sensorboard. * * @author David Gay */ generic configuration DemoSensorC() { provides interface Read; } implementation { components new PhotoC() as Sensor; Read = Sensor; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/DemoSensorStreamC.nc000066400000000000000000000012441207233610700242000ustar00rootroot00000000000000/* $Id: DemoSensorStreamC.nc,v 1.3 2007-04-18 20:56:54 idgay Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Demo sensor for basicsb sensorboard. * * @author David Gay */ generic configuration DemoSensorStreamC() { provides interface ReadStream; } implementation { components new PhotoStreamC() as SensorStream; ReadStream = SensorStream; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/Mag.nc000066400000000000000000000062011207233610700213450ustar00rootroot00000000000000// $Id: Mag.nc,v 1.5 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Authors: Alec Woo * Date lase modified: 8/20/02 * * The MagSetting inteface provides an asynchronous mechanism for * setting the gain offset for the Magnetometer on the mica sensorboard. * This is particularly useful in calibrating the offset of the Magnetometer * such that X and Y axis can stay in the center for idle signals. * If not calibrated, the data you get may rail. (railing means * the data either stays at the maximum (~785) or minimum (~240)). * * The gain adjust has 256 steps ranging from 0 to 255. * */ /** * @author Alec Woo */ interface Mag { /* Effects: adjust pot setting on the X axis of the magnetometer. * Returns: return SUCCESS of FAILED. */ command error_t gainAdjustX(uint8_t val); /* Effects: adjust pot setting on the Y axis of the magnetometer. * Returns: return SUCCESS of FAILED. */ command error_t gainAdjustY(uint8_t val); /* Pot adjustment on the X axis of the magnetometer is finished. */ event void gainAdjustXDone(error_t result); /* Pot adjustment on the Y axis of the magnetometer is finished. */ event void gainAdjustYDone(error_t result); } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MagConfigP.nc000066400000000000000000000026401207233610700226160ustar00rootroot00000000000000/* $Id: MagConfigP.nc,v 1.4 2008-06-11 00:42:14 razvanm Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Internal component for basicsb photodiode. Arbitrates access to the photo * diode and automatically turns it on or off based on user requests. * * @author Alif Chen */ #include "mts300.h" #include "I2C.h" configuration MagConfigP { provides { interface Mag; interface Resource[uint8_t client]; interface Atm128AdcConfig as ConfigX; interface Atm128AdcConfig as ConfigY; } } implementation { components MagP, MicaBusC, new Atm128I2CMasterC() as I2CPot, new TimerMilliC() as WarmupTimer, new RoundRobinArbiterC(UQ_MAG_RESOURCE) as Arbiter, new SplitControlPowerManagerC() as PowerManager; Mag = MagP; Resource = Arbiter; ConfigX = MagP.ConfigX; ConfigY = MagP.ConfigY; PowerManager.ResourceDefaultOwner -> Arbiter; PowerManager.ArbiterInfo -> Arbiter; PowerManager.SplitControl -> MagP; MagP.I2CPacket -> I2CPot; MagP.I2CResource -> I2CPot; MagP.Timer -> WarmupTimer; MagP.MagPower -> MicaBusC.PW5; MagP.MagAdcX -> MicaBusC.Adc6; MagP.MagAdcY -> MicaBusC.Adc5; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MagP.nc000066400000000000000000000051271207233610700214730ustar00rootroot00000000000000#include "mts300.h" #include "Timer.h" #include "I2C.h" module MagP { provides interface SplitControl; provides interface Mag; provides interface Atm128AdcConfig as ConfigX; provides interface Atm128AdcConfig as ConfigY; uses interface Timer; uses interface GeneralIO as MagPower; uses interface MicaBusAdc as MagAdcX; uses interface MicaBusAdc as MagAdcY; uses interface I2CPacket; uses interface Resource as I2CResource; } implementation { norace uint8_t gainData[2]; command error_t SplitControl.start() { call MagPower.makeOutput(); call MagPower.set(); call Timer.startOneShot(100); return SUCCESS; } event void Timer.fired() { signal SplitControl.startDone(SUCCESS); } command error_t SplitControl.stop() { call MagPower.clr(); call MagPower.makeInput(); signal SplitControl.stopDone(SUCCESS); return SUCCESS; } command error_t Mag.gainAdjustX(uint8_t val) { gainData[0] = 1; // pot subaddr gainData[1] = val; // value to write return call I2CResource.request(); } command error_t Mag.gainAdjustY(uint8_t val) { gainData[0] = 0; // pot subaddr gainData[1] = val; // value to write return call I2CResource.request(); } /** * Resource request * */ event void I2CResource.granted() { if ( call I2CPacket.write(I2C_START|I2C_STOP,TOS_MAG_POT_ADDR, 2, gainData) == SUCCESS) { return ; } } /** * I2CPot2 * */ async event void I2CPacket.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { return ; } task void signalAdjustDone() { if (gainData[0] == 1) signal Mag.gainAdjustXDone(gainData[1]); else signal Mag.gainAdjustYDone(gainData[1]); } async event void I2CPacket.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { call I2CResource.release(); gainData[1] = error; post signalAdjustDone(); return; } async command uint8_t ConfigX.getChannel() { return call MagAdcX.getChannel(); } async command uint8_t ConfigX.getRefVoltage() { return ATM128_ADC_VREF_OFF; } async command uint8_t ConfigX.getPrescaler() { return ATM128_ADC_PRESCALE; } async command uint8_t ConfigY.getChannel() { return call MagAdcY.getChannel(); } async command uint8_t ConfigY.getRefVoltage() { return ATM128_ADC_VREF_OFF; } async command uint8_t ConfigY.getPrescaler() { return ATM128_ADC_PRESCALE; } default event void Mag.gainAdjustXDone(error_t result) { } default event void Mag.gainAdjustYDone(error_t result) { } }tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MagReadP.nc000066400000000000000000000051301207233610700222610ustar00rootroot00000000000000// $Id: MagReadP.nc,v 1.4 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "mts300.h" configuration MagReadP { provides { interface Mag; interface Read as MagX[uint8_t client]; interface Read as MagY[uint8_t client]; } uses { interface Read as ActualX[uint8_t client]; interface Read as ActualY[uint8_t client]; } } implementation { components MagConfigP, new ArbitratedReadC(uint16_t) as AdcX, new ArbitratedReadC(uint16_t) as AdcY; Mag = MagConfigP; MagX = AdcX; AdcX.Resource -> MagConfigP; AdcX.Service = ActualX; MagY = AdcY; AdcY.Resource -> MagConfigP; AdcY.Service = ActualY; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MagReadStreamP.nc000066400000000000000000000054471207233610700234500ustar00rootroot00000000000000// $Id: MagReadStreamP.nc,v 1.4 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #include "mts300.h" configuration MagReadStreamP { provides { interface Mag; interface ReadStream as ReadStreamX[uint8_t client]; interface ReadStream as ReadStreamY[uint8_t client]; } uses { interface ReadStream as ActualX[uint8_t client]; interface ReadStream as ActualY[uint8_t client]; } } implementation { enum { NMAG_CLIENTS = uniqueCount(UQ_MAG_RESOURCE) }; components MagConfigP, new ArbitratedReadStreamC(NMAG_CLIENTS, uint16_t) as MultiplexX, new ArbitratedReadStreamC(NMAG_CLIENTS, uint16_t) as MultiplexY; Mag = MagConfigP; ReadStreamX = MultiplexX; MultiplexX.Resource -> MagConfigP; MultiplexX.Service = ActualX; ReadStreamY = MultiplexY; MultiplexY.Resource -> MagConfigP; MultiplexY.Service = ActualY; }tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MagXC.nc000066400000000000000000000014551207233610700216060ustar00rootroot00000000000000/* $Id: MagXC.nc,v 1.2 2008-06-11 00:42:14 razvanm Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * @author Alif Chen */ #include "mts300.h" generic configuration MagXC() { provides interface Mag; provides interface Read; } implementation { enum { ID = unique(UQ_MAG_RESOURCE) }; components MagReadP,MagConfigP, new AdcReadClientC() as AdcX; Mag = MagReadP; Read = MagReadP.MagX[ID]; MagReadP.ActualX[ID] -> AdcX; AdcX.Atm128AdcConfig -> MagConfigP.ConfigX; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MagXStreamC.nc000066400000000000000000000016051207233610700227570ustar00rootroot00000000000000/* $Id: MagXStreamC.nc,v 1.2 2008-06-11 00:42:14 razvanm Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * * @author Alif Chen */ #include "mts300.h" generic configuration MagXStreamC() { provides interface ReadStream; provides interface Mag; } implementation { enum { ID = unique(UQ_ACCEL_RESOURCE) }; components MagReadStreamP, MagConfigP, new AdcReadStreamClientC(); Mag = MagReadStreamP; ReadStream = MagReadStreamP.ReadStreamX[ID]; MagReadStreamP.ActualX[ID] -> AdcReadStreamClientC; AdcReadStreamClientC.Atm128AdcConfig -> MagConfigP.ConfigX; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MagYC.nc000066400000000000000000000014551207233610700216070ustar00rootroot00000000000000/* $Id: MagYC.nc,v 1.2 2008-06-11 00:42:15 razvanm Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * @author Alif Chen */ #include "mts300.h" generic configuration MagYC() { provides interface Mag; provides interface Read; } implementation { enum { ID = unique(UQ_MAG_RESOURCE) }; components MagReadP,MagConfigP, new AdcReadClientC() as AdcY; Mag = MagReadP; Read = MagReadP.MagY[ID]; MagReadP.ActualY[ID] -> AdcY; AdcY.Atm128AdcConfig -> MagConfigP.ConfigY; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MagYStreamC.nc000066400000000000000000000016011207233610700227540ustar00rootroot00000000000000/* $Id: MagYStreamC.nc,v 1.2 2008-06-11 00:42:14 razvanm Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * @author Alif Chen */ #include "mts300.h" generic configuration MagYStreamC() { provides interface ReadStream; provides interface Mag; } implementation { enum { ID = unique(UQ_ACCEL_RESOURCE) }; components MagReadStreamP, MagConfigP, new AdcReadStreamClientC(); Mag = MagReadStreamP; ReadStream = MagReadStreamP.ReadStreamY[ID]; MagReadStreamP.ActualY[ID] -> AdcReadStreamClientC; AdcReadStreamClientC.Atm128AdcConfig -> MagConfigP.ConfigY; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MicC.nc000066400000000000000000000041111207233610700214520ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Hu Siquan * * $Id: MicC.nc,v 1.4 2010-06-29 22:07:56 scipio Exp $ */ #include "mts300.h" generic configuration MicC() { provides interface Read; provides interface MicSetting; } implementation { enum { ID = unique(UQ_MIC_RESOURCE) }; components MicReadP, MicDeviceP, new AdcReadClientC(); Read = MicReadP.Read[ID]; MicReadP.ActualRead[ID] -> AdcReadClientC; AdcReadClientC.Atm128AdcConfig -> MicDeviceP.Atm128AdcConfig; MicSetting = MicDeviceP; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MicDeviceP.nc000066400000000000000000000050461207233610700226170ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Hu Siquan * * $Id: MicDeviceP.nc,v 1.2 2010-07-21 13:23:50 zkincses Exp $ */ #include "mts300.h" #include "I2C.h" configuration MicDeviceP { provides { interface Resource[uint8_t client]; interface Atm128AdcConfig; interface MicSetting; } } implementation { components MicP, MicaBusC, new Atm128I2CMasterC() as I2CPot, new TimerMilliC() as WarmupTimer, new RoundRobinArbiterC(UQ_MIC_RESOURCE) as Arbiter, new SplitControlPowerManagerC() as PowerManager; Resource = Arbiter; Atm128AdcConfig = MicP; MicSetting = MicP; PowerManager.ResourceDefaultOwner -> Arbiter; PowerManager.ArbiterInfo -> Arbiter; PowerManager.SplitControl -> MicP; MicP.Timer -> WarmupTimer; MicP.MicPower -> MicaBusC.PW3; MicP.MicMuxSel -> MicaBusC.PW6; MicP.InterruptPin -> MicaBusC.Int3; MicP.MicAdc -> MicaBusC.Adc2; MicP.I2CPacket -> I2CPot; MicP.I2CResource -> I2CPot; MicP.AlertInterrupt -> MicaBusC.Int3_Interrupt; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MicP.nc000066400000000000000000000121501207233610700214710ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Hu Siquan * * $Id: MicP.nc,v 1.4 2010-07-21 13:23:51 zkincses Exp $ */ #include "Timer.h" #include "I2C.h" // The MTS300 does not have an external pullup resistor for I2C #if !defined(ATM128_I2C_EXTERNAL_PULLDOWN) || !(ATM128_I2C_EXTERNAL_PULLDOWN) #error You must set ATM128_I2C_EXTERNAL_PULLDOWN=1 #endif module MicP { provides interface SplitControl; provides interface MicSetting; provides interface Atm128AdcConfig as MicAtm128AdcConfig; uses interface Timer; uses interface GeneralIO as MicPower; uses interface GeneralIO as MicMuxSel; uses interface GeneralIO as InterruptPin; uses interface MicaBusAdc as MicAdc; uses interface I2CPacket; uses interface Resource as I2CResource; uses interface GpioInterrupt as AlertInterrupt; } implementation { uint8_t gainData[2]; uint8_t lastGain = 64; command error_t SplitControl.start() { call AlertInterrupt.disable(); call MicPower.makeOutput(); call MicPower.set(); call MicMuxSel.makeOutput(); call MicMuxSel.clr(); call MicSetting.muxSel(1); // Set the mux so that raw microhpone output is selected call MicSetting.gainAdjust(lastGain); // Set the gain of the microphone. call Timer.startOneShot(1200); return SUCCESS; } event void Timer.fired() { signal SplitControl.startDone(SUCCESS); } command error_t SplitControl.stop() { call AlertInterrupt.disable(); call MicPower.clr(); call MicPower.makeInput(); signal SplitControl.stopDone(SUCCESS); return SUCCESS; } /** * Resource request * */ event void I2CResource.granted() { call I2CPacket.write(I2C_START|I2C_STOP,TOS_MIC_POT_ADDR, 2, gainData); } /** * mic control * */ command error_t MicSetting.muxSel(uint8_t sel) { if (sel == 0) { call MicMuxSel.clr(); return SUCCESS; } else if (sel == 1) { call MicMuxSel.set(); return SUCCESS; } return FAIL; } command error_t MicSetting.startMic(){ call MicPower.makeOutput(); call MicPower.set(); return SUCCESS; } command error_t MicSetting.stopMic(){ call MicPower.makeOutput(); call MicPower.clr(); return SUCCESS; } command error_t MicSetting.gainAdjust(uint8_t val) { lastGain = val; gainData[0] = 0; // pot subaddr gainData[1] = val; // value to write return call I2CResource.request(); } command uint8_t MicSetting.readToneDetector() { bool bVal = call InterruptPin.get(); return bVal ? 1 : 0; } /** * mic interrupt control */ async command error_t MicSetting.enable() { call AlertInterrupt.enableFallingEdge(); return SUCCESS; } async command error_t MicSetting.disable() { call AlertInterrupt.disable(); return SUCCESS; } default async event error_t MicSetting.toneDetected() { return SUCCESS; } async event void AlertInterrupt.fired() { signal MicSetting.toneDetected(); } async command uint8_t MicAtm128AdcConfig.getChannel() { return call MicAdc.getChannel(); } async command uint8_t MicAtm128AdcConfig.getRefVoltage() { return ATM128_ADC_VREF_OFF; } async command uint8_t MicAtm128AdcConfig.getPrescaler() { return ATM128_ADC_PRESCALE; } async event void I2CPacket.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { } async event void I2CPacket.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { call I2CResource.release(); } } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MicReadP.nc000066400000000000000000000005431207233610700222700ustar00rootroot00000000000000configuration MicReadP { provides { interface Read[uint8_t client]; } uses { interface Read as ActualRead[uint8_t client]; } } implementation { components MicDeviceP, new ArbitratedReadC(uint16_t); Read = ArbitratedReadC; ArbitratedReadC.Resource -> MicDeviceP; ArbitratedReadC.Service = ActualRead; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MicReadStreamP.nc000066400000000000000000000010251207233610700234400ustar00rootroot00000000000000configuration MicReadStreamP { provides { interface MicSetting; interface ReadStream[uint8_t client]; } uses { interface ReadStream as ActualRead[uint8_t client]; } } implementation { enum { NMIC_CLIENTS = uniqueCount(UQ_MIC_RESOURCE) }; components MicDeviceP, new ArbitratedReadStreamC(NMIC_CLIENTS, uint16_t); MicSetting = MicDeviceP; ReadStream = ArbitratedReadStreamC; ArbitratedReadStreamC.Resource -> MicDeviceP; ArbitratedReadStreamC.Service = ActualRead; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MicSetting.nc000066400000000000000000000103401207233610700227060ustar00rootroot00000000000000// $Id: MicSetting.nc,v 1.1 2010-07-21 13:23:51 zkincses Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * Authors: Alec Woo * Date last modified: 8/20/02 * * The microphone on the mica sensor board has two methods for control and * one method to read the binary output of the tone detector. (Note: The tone * detector's binary output can be configured as an interrupt. Please see MicInterrupt.ti) * * muxSel allows users to switch the ADC to sample from phase lock loop output of * the tone detector (by setting the value to 0 (default)) or the raw voice-band output * of the micrphone (by setting the value to 1). * * gainAdjust allows users to adjust the amplification gain on the microphone. The range * is 0 to 255 with 0 being the minmum and 255 being the maximum amplification. Note that * setting amplification too high can result in clipping (signal distortion). * * If an audio signal at 4.3kHz is picked up by the microphone, the tone * detect will decode it and generate a binary ouput (0 meaning tone is detected, 1 meaning * tone is not detected). Users can read this output simply by calling readToneDetector(). */ /** * @author Alec Woo */ interface MicSetting { /* Effect: Set the multiplexer's setting on the microphone * Return: returns SUCCESS or FAIL */ command error_t muxSel(uint8_t sel); /* Effect: Set the amplificatoin gain on the microphone * Return: returns SUCCESS or FAIL */ command error_t gainAdjust(uint8_t val); /* Effect: Power on the microphone * Return: returns SUCCESS or FAIL */ command error_t startMic(); /* Effect: Power off the microphone * Return: returns SUCCESS or FAIL */ command error_t stopMic(); /* Effect: returns the binary tone detector's output * Return: 0 meaning tone is detected, 1 meanning tone is not detected */ command uint8_t readToneDetector(); /* Effects: disable interrupts Returns: SUCCESS */ async command error_t disable(); /* Effects: enable interrupts Returns: SUCCESS */ async command error_t enable(); /* Interrupt signal for tone detected. Note that MicInterrupt is automatically disabled * before this event is signaled. (Upper layer needs to reenable this interrupt for future * tone detect. * * Returns: SUCCESS */ async event error_t toneDetected(); } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/MicStreamC.nc000066400000000000000000000042171207233610700226350ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Hu Siquan * * $Id: MicStreamC.nc,v 1.3 2010-06-29 22:07:56 scipio Exp $ */ #include "mts300.h" generic configuration MicStreamC() { provides interface ReadStream; provides interface MicSetting; } implementation { enum { ID = unique(UQ_MIC_RESOURCE) }; components MicReadStreamP, MicDeviceP, new AdcReadStreamClientC(); ReadStream = MicReadStreamP.ReadStream[ID]; MicReadStreamP.ActualRead[ID] -> AdcReadStreamClientC; AdcReadStreamClientC.Atm128AdcConfig -> MicDeviceP.Atm128AdcConfig; MicSetting = MicReadStreamP; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/Mts300Sounder.nc000066400000000000000000000001021207233610700231610ustar00rootroot00000000000000interface Mts300Sounder { command void beep(uint16_t length); } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/PhotoC.nc000066400000000000000000000012701207233610700220360ustar00rootroot00000000000000/* $Id: PhotoC.nc,v 1.4 2007-03-14 04:14:13 pipeng Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Photodiode of the mts300 sensor board. * * @author David Gay */ #include "mts300.h" generic configuration PhotoC() { provides interface Read; } implementation { components ArbitratedPhotoDeviceP; Read = ArbitratedPhotoDeviceP.Read[unique(UQ_PHOTO_RESOURCE)]; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/PhotoTempControlP.nc000066400000000000000000000023741207233610700242500ustar00rootroot00000000000000generic module PhotoTempControlP() { provides { interface SplitControl; interface Read[uint8_t client]; } uses { interface Resource as PhotoTempResource; interface Timer; interface GeneralIO as Power; interface Read as ActualRead; } } implementation { command error_t SplitControl.start() { call PhotoTempResource.request(); return SUCCESS; } event void PhotoTempResource.granted() { call Power.makeOutput(); call Power.set(); call Timer.startOneShot(10); } event void Timer.fired() { if (call PhotoTempResource.isOwner()) signal SplitControl.startDone(SUCCESS); } task void stopDone() { call PhotoTempResource.release(); signal SplitControl.stopDone(SUCCESS); } command error_t SplitControl.stop() { call Power.clr(); call Power.makeInput(); post stopDone(); return SUCCESS; } uint8_t id; command error_t Read.read[uint8_t client]() { id = client; return call ActualRead.read(); } event void ActualRead.readDone(error_t result, uint16_t val) { if (call PhotoTempResource.isOwner()) signal Read.readDone[id](result, val); } default event void Read.readDone[uint8_t x](error_t result, uint16_t val) { } } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/PhotoTempDeviceC.nc000066400000000000000000000035721207233610700240130ustar00rootroot00000000000000#include "mts300.h" configuration PhotoTempDeviceC { provides interface Resource as PhotoResource[uint8_t client]; provides interface Resource as TempResource[uint8_t client]; provides interface Read as ReadPhoto[uint8_t client]; provides interface Read as ReadTemp[uint8_t client]; } implementation { components MicaBusC, PhotoTempP, new RoundRobinArbiterC(UQ_PHOTOTEMP_RESOURCE) as SharingArbiter, new RoundRobinArbiterC(UQ_PHOTO_RESOURCE) as PhotoArbiter, new RoundRobinArbiterC(UQ_TEMP_RESOURCE) as TempArbiter, new SplitControlPowerManagerC() as PhotoPower, new SplitControlPowerManagerC() as TempPower, new PhotoTempControlP() as PhotoControl, new PhotoTempControlP() as TempControl, new TimerMilliC() as WarmupTimer, new AdcReadClientC() as Adc; PhotoResource = PhotoArbiter; PhotoPower.ResourceDefaultOwner -> PhotoArbiter; PhotoPower.ArbiterInfo -> PhotoArbiter; PhotoPower.SplitControl -> PhotoControl; PhotoControl.PhotoTempResource -> SharingArbiter.Resource[unique(UQ_PHOTOTEMP_RESOURCE)]; PhotoControl.Timer -> WarmupTimer; PhotoControl.Power -> MicaBusC.Int1; ReadPhoto = PhotoControl; PhotoControl.ActualRead -> Adc; TempResource = TempArbiter; TempPower.ResourceDefaultOwner -> TempArbiter; TempPower.ArbiterInfo -> TempArbiter; TempPower.SplitControl -> TempControl; TempControl.PhotoTempResource -> SharingArbiter.Resource[unique(UQ_PHOTOTEMP_RESOURCE)]; TempControl.Timer -> WarmupTimer; #if defined(MTS300CA) || defined(MTS310CA) TempControl.Power -> MicaBusC.Int2; #elif defined(MTS300CB) | defined(MTS310CB) TempControl.Power -> MicaBusC.PW0; #else #error "Please define your sensorboard revision: MTS300CA, MTS300CB, MTS310CA, MTS310CB" #endif ReadTemp = TempControl; TempControl.ActualRead -> Adc; Adc.Atm128AdcConfig -> PhotoTempP; PhotoTempP.PhotoTempAdc -> MicaBusC.Adc1; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/PhotoTempP.nc000066400000000000000000000016401207233610700227020ustar00rootroot00000000000000/* $Id: PhotoTempP.nc,v 1.4 2007-03-14 04:14:13 pipeng Exp $ * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * MTS300 photo and temp sensor ADC configuration. * @author David Gay */ module PhotoTempP { provides interface Atm128AdcConfig; uses interface MicaBusAdc as PhotoTempAdc; } implementation { async command uint8_t Atm128AdcConfig.getChannel() { return call PhotoTempAdc.getChannel(); } async command uint8_t Atm128AdcConfig.getRefVoltage() { return ATM128_ADC_VREF_OFF; } async command uint8_t Atm128AdcConfig.getPrescaler() { return ATM128_ADC_PRESCALE; } } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/SensorMts300C.nc000066400000000000000000000053501207233610700231300ustar00rootroot00000000000000/** * Copyright (c) 2005-2006 Crossbow Technology, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Martin Turon * @author Hu Siquan * * $Id: SensorMts300C.nc,v 1.9 2010-06-29 22:07:56 scipio Exp $ */ //configuration SensorMts300C generic configuration SensorMts300C() { provides { interface Mts300Sounder as Sounder; //!< sounder interface Read as Vref; //!< voltage interface Read as Temp; //!< Thermister interface Read as Light; //!< Photo sensor interface Read as Microphone; //!< Mic sensor interface Read as AccelX; //!< Accelerometer sensor interface Read as AccelY; //!< Accelerometer sensor interface Read as MagX; //!< magnetometer sensor interface Read as MagY; //!< magnetometer sensor } } implementation { components SounderC, new VoltageC(), new AccelXC(), new AccelYC(), new PhotoC(), new TempC(), new MicC(), new MagXC(), new MagYC(); Sounder = SounderC; Vref = VoltageC; Temp = TempC; Light = PhotoC; Microphone = MicC; AccelX = AccelXC; AccelY = AccelYC; MagX = MagXC; MagY = MagYC; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/SounderC.nc000066400000000000000000000003531207233610700223650ustar00rootroot00000000000000configuration SounderC { provides interface Mts300Sounder; } implementation { components SounderP, new TimerMilliC(), MicaBusC; Mts300Sounder = SounderP; SounderP.Timer -> TimerMilliC; SounderP.SounderPin -> MicaBusC.PW2; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/SounderP.nc000066400000000000000000000012611207233610700224010ustar00rootroot00000000000000module SounderP { provides interface Mts300Sounder; uses { interface Timer; interface GeneralIO as SounderPin; } } implementation { command void Mts300Sounder.beep(uint16_t length) { if (call Timer.isRunning()) { uint32_t remaining = call Timer.getdt(), elapsed = call Timer.getNow() - call Timer.gett0(); /* If more time left than we are requesting, just exit */ if (remaining > elapsed && (remaining - elapsed) > length) return; /* Override timer with new duration */ } call Timer.startOneShot(length); call SounderPin.makeOutput(); call SounderPin.set(); } event void Timer.fired() { call SounderPin.clr(); } } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/TempC.nc000066400000000000000000000012641207233610700216550ustar00rootroot00000000000000/* $Id: TempC.nc,v 1.4 2008-06-11 00:42:15 razvanm Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Photodiode of the mts300 sensor board. * * @author David Gay */ #include "mts300.h" generic configuration TempC() { provides interface Read; } implementation { components ArbitratedTempDeviceP; Read = ArbitratedTempDeviceP.Read[unique(UQ_TEMP_RESOURCE)]; } tinyos-2.1.2+dfsg/tos/sensorboards/mts300/mts300.h000066400000000000000000000044751207233610700215310ustar00rootroot00000000000000/* $Id: mts300.h,v 1.6 2010-06-29 22:07:56 scipio Exp $ */ /* * Copyright (c) 2005-2006 Crossbow Technology, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of Crossbow Technology nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * @author Hu Siquan * Revision: $Revision: 1.6 $ * */ #ifndef _MTS300_H #define _MTS300_H // sounder enable (1) /disable (0) #ifndef SOUNDER #define SOUNDER 1 #endif #define UQ_ACCEL_RESOURCE "mts300.accel" #define UQ_PHOTO_RESOURCE "mts300.photo" #define UQ_TEMP_RESOURCE "mts300.temp" #define UQ_PHOTOTEMP_RESOURCE "mts300.phototemp" #define UQ_MIC_RESOURCE "mts300.microphone" #define UQ_MAG_RESOURCE "mts300.mag" enum { TOS_MIC_POT_ADDR = 0x2D, TOS_MAG_POT_ADDR = 0x2C, }; // debug leds //#define _DEBUG_LEDS #ifdef _DEBUG_LEDS #define DEBUG_LEDS(X) X.DebugLeds -> LedsC #else #define DEBUG_LEDS(X) X.DebugLeds -> NoLedsC #endif #endif /* _MTS300_H */ tinyos-2.1.2+dfsg/tos/sensorboards/mts400/000077500000000000000000000000001207233610700203215ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/sensorboards/mts400/.sensor000066400000000000000000000000541207233610700216320ustar00rootroot00000000000000 push( @includes, qw( %T/chips/sht11 ) ); tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Accel202.h000066400000000000000000000031741207233610700217320ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #ifndef ACCEL202_H #define ACCEL202_H #define UQ_ACCEL202 "Accel202.Resource" #endif tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Accel202C.nc000066400000000000000000000041751207233610700222100ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #include "Accel202.h" generic configuration Accel202C() { provides interface Read as X_Axis; provides interface Read as Y_Axis; } implementation { components new Accel202ReaderP(); X_Axis = Accel202ReaderP.X_Axis; Y_Axis = Accel202ReaderP.Y_Axis; components HalAccel202C; enum { X_KEY = unique(UQ_ACCEL202)}; enum { Y_KEY = unique(UQ_ACCEL202)}; Accel202ReaderP.X_Resoure -> HalAccel202C.Resource[ X_KEY ]; Accel202ReaderP.XRead -> HalAccel202C.XAxis; Accel202ReaderP.Y_Resoure -> HalAccel202C.Resource[ Y_KEY]; Accel202ReaderP.YRead -> HalAccel202C.YAxis; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Accel202LogicP.nc000066400000000000000000000056511207233610700232030ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ generic module Accel202LogicP() { provides interface Read as XAxis; provides interface Read as YAxis; uses interface Resource; uses interface Atm128AdcSingle; uses interface MicaBusAdc as XADC; uses interface MicaBusAdc as YADC; } implementation { enum{ ADCX=1, ADCY, }; task void read(); task void failTask(); error_t performCommand(uint8_t); uint8_t cmd,readData; command error_t XAxis.read() { return performCommand(ADCX); } command error_t YAxis.read() { return performCommand(ADCY); } error_t performCommand(uint8_t Command) { cmd=Command; return call Resource.request(); } event void Resource.granted(){ if(cmd==ADCX){ call Atm128AdcSingle.getData(call XADC.getChannel(),ATM128_ADC_VREF_OFF,FALSE,ATM128_ADC_PRESCALE); }else { call Atm128AdcSingle.getData(call YADC.getChannel(),ATM128_ADC_VREF_OFF,FALSE,ATM128_ADC_PRESCALE); } } async event void Atm128AdcSingle.dataReady(uint16_t data, bool precise){ call Resource.release(); if (precise){ atomic readData=data; post read(); }else { post failTask(); } } task void read(){ atomic{ if(cmd==ADCX){ signal XAxis.readDone(SUCCESS,readData); }else { signal YAxis.readDone(SUCCESS,readData); } } } task void failTask(){ if(cmd==ADCX){ signal XAxis.readDone(FAIL,0); }else{ signal YAxis.readDone(FAIL,0); } } } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Accel202ReaderP.nc000066400000000000000000000053561207233610700233520ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ generic module Accel202ReaderP() { provides interface Read as X_Axis; provides interface Read as Y_Axis; uses interface Resource as X_Resoure; uses interface Resource as Y_Resoure; uses interface Read as XRead; uses interface Read as YRead; } implementation { command error_t X_Axis.read() { return call X_Resoure.request(); } event void X_Resoure.granted() { error_t result; if ((result = call XRead.read()) != SUCCESS) { call X_Resoure.release(); signal X_Axis.readDone( result, 0 ); } } event void XRead.readDone( error_t result, uint16_t val ) { call X_Resoure.release(); signal X_Axis.readDone( result, val ); } command error_t Y_Axis.read() { return call Y_Resoure.request(); } event void Y_Resoure.granted() { error_t result; if ((result = call YRead.read()) != SUCCESS) { call Y_Resoure.release(); signal Y_Axis.readDone( result, 0 ); } } event void YRead.readDone( error_t result, uint16_t val ) { call Y_Resoure.release(); signal Y_Axis.readDone( result, val ); } default event void X_Axis.readDone( error_t result, uint16_t val ) { } default event void Y_Axis.readDone( error_t result, uint16_t val ) { } } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Adg715.h000066400000000000000000000042511207233610700214240ustar00rootroot00000000000000/* * Copyright (c) 2008 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * * @author Danny Park */ #ifndef ADG715_H #define ADG715_H /** * enum is used instead of #ifndef/#define/#endif becuase these relate * to the hardware being written for and will not change unless the * hardware design is change which would require a new version of the * driver anyway. */ enum { ADG715_BASE_ADDR = 0x48, //binary 1001000 ADG715_PIN_A0_HIGH = 0x01,//binary 00000001 ADG715_PIN_A1_HIGH = 0x02,//binary 00000010 ADG715_CMD_LEN = 1, ADG715_CH_MIN = 1, ADG715_CH_MAX = 8, ADG715_CH_OPEN = 1, ADG715_CH_CLOSE = 0, }; #define UQ_ADG715 "Adg715.Resource" #endif //ADG715_H tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Adg715C.nc000066400000000000000000000115311207233610700216770ustar00rootroot00000000000000/* * Copyright (c) 2008 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * The adg715 chip has 8 channels that are controlled through the I2C * bus. This configuration provides 8 Channel interfaces corresponding * to the 8 physical channels on the chip. This implementation is * specific to the mts420CA sensorboard and the adg715 that connects * the communication wires. * * @author Danny Park */ #include"Adg715.h" configuration Adg715C { provides { /** Connects UART_TXD to GPS_RX */ //interface Channel as ChannelGpsRx; /** Connects Accel_X to ADC1 */ interface Channel as ChannelAccel_X; /** Connects UART_RXD to GPS_TX */ //interface Channel as ChannelGpsTx; /** Connects Accel_Y to ADC2 */ interface Channel as ChannelAccel_Y; /** Connects UART_CLK to Pressure_SCLK */ /** Connects Pressure_SCLK to FLASH_CLK*/ interface Channel as ChannelPressureClock; /** Connects UART_TX to Pressure_DOUT */ /** Connects Pressure_DIN to FLASH_SI */ interface Channel as ChannelPressureDin; /** Connects UART_RX to Pressure_DIN */ /** Connects Pressure_DOUT to FLASH_SO */ interface Channel as ChannelPressureDout; /** Pins not connected for channel 6 on this chip */ //interface Channel as Channel6CommNull; /** Connects Thermopile_Select_Cnt to GND */ interface Channel as ChannelThermopile_Select_Cnt; /** Connects PW3 to Humidity_SCK */ interface Channel as ChannelHumidityClock; /** Connects INT3 to Humidity_DATA */ interface Channel as ChannelHumidityData; /** Connects VCC to Light_Power */ interface Channel as ChannelLightPower; /** Pins not connected for channel 2 on this chip */ interface Channel as Channel2PowerNull; /** Connects VCC to Pressure_Power */ interface Channel as ChannelPressurePower; /** Connects VCC to Humidity_Power */ interface Channel as ChannelHumidityPower; /** Connects VCC to EEPROM_Power */ interface Channel as ChannelEepromPower; /** Connects VCC to Accel_Power */ interface Channel as ChannelAccelPower; /** Connect 33VDCDCBOOST to GND (switch on)*/ interface Channel as DcDcBoost33Channel; /** Connects VCC to GPS_PWR */ //interface Channel as ChannelGpsPower; /** Connect 5VDCDCBOOST_SHUTDOWN to GND (switch on)*/ interface Channel as DcDcBoost5Channel; /** Connects VCC to GPS_ENA */ //interface Channel as ChannelGpsEnable; interface Resource[ uint8_t id ]; } } implementation { components new FcfsArbiterC( UQ_ADG715 ); Resource = FcfsArbiterC; components new HplAdg715C(FALSE, TRUE) as Comm; ChannelAccel_X = Comm.Channel1; ChannelAccel_Y = Comm.Channel2; ChannelPressureClock = Comm.Channel3; ChannelPressureDin = Comm.Channel4; ChannelPressureDout = Comm.Channel5; // Channel6CommNull = Comm.Channel6; ChannelThermopile_Select_Cnt = Comm.Channel6; ChannelHumidityClock = Comm.Channel7; ChannelHumidityData = Comm.Channel8; components new HplAdg715C(FALSE, FALSE) as Power; ChannelLightPower = Power.Channel1; Channel2PowerNull = Power.Channel2; ChannelPressurePower = Power.Channel3; ChannelHumidityPower = Power.Channel4; ChannelEepromPower = Power.Channel5; ChannelAccelPower = Power.Channel6; DcDcBoost33Channel = Power.Channel7; // ChannelGpsEnable = Power.Channel8; DcDcBoost5Channel = Power.Channel8; // ChannelGpsPower = Power.Channel7; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Adg715ControlC.nc000066400000000000000000000055311207233610700232430ustar00rootroot00000000000000/* * Copyright (c) 2008 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * The adg715 chip has 8 channels that are controlled through the I2C * bus. This configuration provides 8 Channel interfaces corresponding * to the 8 physical channels on the chip. The I2C bus needs to be * wired to this configuration through the I2CPacket and Resource * interfaces. * * @author Danny Park */ generic configuration Adg715ControlC(bool pinA1High, bool pinA2High) { provides { interface Channel as Channel1; interface Channel as Channel2; interface Channel as Channel3; interface Channel as Channel4; interface Channel as Channel5; interface Channel as Channel6; interface Channel as Channel7; interface Channel as Channel8; } uses { interface I2CPacket; interface Resource; } } implementation { components new Adg715ControlP(pinA1High, pinA2High), MainC; components LedsC; Channel1 = Adg715ControlP.Channel[1]; Channel2 = Adg715ControlP.Channel[2]; Channel3 = Adg715ControlP.Channel[3]; Channel4 = Adg715ControlP.Channel[4]; Channel5 = Adg715ControlP.Channel[5]; Channel6 = Adg715ControlP.Channel[6]; Channel7 = Adg715ControlP.Channel[7]; Channel8 = Adg715ControlP.Channel[8]; I2CPacket = Adg715ControlP; Resource = Adg715ControlP; Adg715ControlP.Leds->LedsC; MainC.SoftwareInit -> Adg715ControlP.Init; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Adg715ControlP.nc000066400000000000000000000162501207233610700232600ustar00rootroot00000000000000/* * Copyright (c) 2008 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * The adg715 hardware provides 8 channels which are controlled using * an I2C interface. The channels here are provided using a * parameterized interface but are checked for being out of bounds * (ADG715_CH_MIN and ADG715_CH_MAX from the header file). * The channels can only be controlled one at a time and they will * be controlled through the I2CPacket interface which is used by * this module. * * @author Danny Park */ #include #include "Adg715.h" generic module Adg715ControlP(bool pinA1High, bool pinA0High) { uses { interface I2CPacket; interface Resource; interface Leds; } provides { interface Channel[uint8_t channel]; interface Init; } } implementation { /**************** Global Variables ****************/ /** TRUE if this module is busy and cannot accept another command */ bool busy; /** In process of opening a channel if TRUE and busy is TRUE */ bool opening; /** In process of closing a channel if TRUE and busy is TRUE */ bool closing; /** Setting of previous command or command currently in process */ uint8_t mySetting; /** Current channel being set if busy is TRUE */ uint8_t currentChannel; /** I2C address that is set based on compile time parameters */ uint16_t myAddress; /**************** Prototypes ****************/ task void successTask(); task void failTask(); /**************** Init Interface Commands ****************/ /** * Initialization command that fires once during boot up. */ command error_t Init.init() { if(pinA1High && pinA0High) { myAddress = ADG715_BASE_ADDR | ADG715_PIN_A1_HIGH | ADG715_PIN_A0_HIGH; } else if(pinA1High) { myAddress = ADG715_BASE_ADDR | ADG715_PIN_A1_HIGH; } else if(pinA0High) { myAddress = ADG715_BASE_ADDR | ADG715_PIN_A0_HIGH; } else { myAddress = ADG715_BASE_ADDR; } mySetting = 0x00; busy = FALSE; opening = FALSE; closing = FALSE; return SUCCESS; } /**************** Channel Interface Commands ****************/ /** * Starts the opening of the given channel or returns an error. * If SUCCESS is returned then an openDone event will be signalled. * * @param channel The channel to be opened (limited between * ADG715_CH_MIN and ADG715_CH_MAX). */ command error_t Channel.open[uint8_t channel]() { if(channel > ADG715_CH_MAX || channel < ADG715_CH_MIN) { return ESIZE; } else if(busy) { return EBUSY; } else { busy = TRUE; opening = TRUE; currentChannel = channel; mySetting |= ADG715_CH_OPEN << (channel - 1); call Resource.request(); return SUCCESS; } } /** * Starts the closing of the given channel or returns an error. * If SUCCESS is returned then a closeDone event will be signalled. * * @param channel The channel to be closed (limited between * ADG715_CH_MIN and ADG715_CH_MAX). */ command error_t Channel.close[uint8_t channel]() { if(channel > ADG715_CH_MAX || channel < ADG715_CH_MIN) { return ESIZE; } else if(busy) { return EBUSY; } else { busy = TRUE; closing = TRUE; currentChannel = channel; // mySetting &= ADG715_CH_CLOSE << (channel - 1); mySetting ^= ADG715_CH_OPEN << (channel - 1); call Resource.request(); return SUCCESS; } } /** * Open status of the given channel. * * @param channel The channel to be closed (limited between * ADG715_CH_MIN and ADG715_CH_MAX). * @return TRUE if the given channel is open, FALSE otherwise. */ command bool Channel.isOpen[uint8_t channel]() { return ((mySetting >> (channel - 1)) & ADG715_CH_OPEN)== ADG715_CH_OPEN; } /**************** Resource Interface Events ****************/ /** * Signalled when the I2CBus is available for use. */ event void Resource.granted() { call I2CPacket.write(I2C_START|I2C_STOP, myAddress, ADG715_CMD_LEN, &mySetting); } /**************** I2CPacket Interface Events ****************/ async event void I2CPacket.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) {} async event void I2CPacket.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data) { if(addr == myAddress) { if(length == ADG715_CMD_LEN && data == &mySetting) { call Resource.release(); if(error == SUCCESS){ post successTask(); } else { post failTask(); } } } } /**************** Local Tasks ****************/ task void successTask() { if(busy) { /** * If busy is not released before signalling a *Done() event * then a serial call of open/close channels on the same * chip will fail with EBUSY. */ busy = FALSE; if(opening) { opening = FALSE; if(((mySetting >> (currentChannel - 1)) & ADG715_CH_OPEN)== ADG715_CH_OPEN) { signal Channel.openDone[currentChannel](SUCCESS); } else { signal Channel.openDone[currentChannel](FAIL); } } else if(closing) { closing = FALSE; if(((mySetting >> (currentChannel - 1)) & ADG715_CH_OPEN)== ADG715_CH_CLOSE) { signal Channel.closeDone[currentChannel](SUCCESS); } else { signal Channel.closeDone[currentChannel](FAIL); } } } } task void failTask() { if(busy) { /** * If busy is not released before signalling a *Done() event * then a serial call of open/close channels on the same * chip will fail with EBUSY. */ busy = FALSE; if(opening) { opening = FALSE; signal Channel.openDone[currentChannel](FAIL); } if(closing) { closing = FALSE; signal Channel.closeDone[currentChannel](FAIL); } } } /**************** Channel Interface Defaults ****************/ default event void Channel.openDone[uint8_t channel](error_t error) {} default event void Channel.closeDone[uint8_t channel](error_t error) {} } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Calibration.nc000066400000000000000000000042461207233610700231000ustar00rootroot00000000000000/* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Joe Polastre * * $Id: Calibration.nc,v 1.3 2010-06-29 22:07:56 scipio Exp $ */ interface Calibration { command error_t getData(); event void dataReady(error_t error, uint16_t* calibration); } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Channel.nc000066400000000000000000000047541207233610700222250ustar00rootroot00000000000000/* * Copyright (c) 2008 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * Open or close a channel and retrieve the open status of the channel. * * @author Danny Park */ interface Channel { /** * Open the channel. * * @return SUCCESS if the openDone event will fire in the future. */ command error_t open(); /** * Close the channel. * * @return SUCCESS if the closeDone event will fire in the future. */ command error_t close(); /** * Determine if the channel is open. * * @return TRUE if the channel is open, FALSE otherwise. */ command bool isOpen(); /** * Notify the caller that the channel has been opened. * * @param error SUCCESS if the channel was opened without any problems. */ event void openDone(error_t error); /** * Notify the caller that the channel has been closed. * * @param error SUCCESS if the channel was closed without any problems. */ event void closeDone(error_t error); } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/HalAccel202C.nc000066400000000000000000000042001207233610700226220ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ configuration HalAccel202C { provides interface Resource[ uint8_t client ]; provides interface Read as XAxis; provides interface Read as YAxis; } implementation { components new Accel202LogicP(); XAxis = Accel202LogicP.XAxis; YAxis = Accel202LogicP.YAxis; components HplAccel202C; Resource = HplAccel202C.Resource; components MicaBusC; components Atm128AdcC; Accel202LogicP.Resource -> Atm128AdcC.Resource[unique(UQ_ATM128ADC_RESOURCE)]; Accel202LogicP.Atm128AdcSingle -> Atm128AdcC; Accel202LogicP.XADC -> MicaBusC.Adc1; Accel202LogicP.YADC -> MicaBusC.Adc2; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/HalIntersema5534C.nc000066400000000000000000000043561207233610700236530ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ configuration HalIntersema5534C { provides interface Resource[ uint8_t client ]; provides interface Read as Temp; provides interface Read as Press; provides interface Calibration as Cal; } implementation { components new Intersema5534LogicP(); Temp = Intersema5534LogicP.Temp; Press = Intersema5534LogicP.Press; Cal = Intersema5534LogicP.Cal; components HplIntersema5534C; Resource = HplIntersema5534C.Resource; components MicaBusC; Intersema5534LogicP.SPI_CLK -> MicaBusC.USART1_CLK; Intersema5534LogicP.SPI_SI -> MicaBusC.USART1_RXD; Intersema5534LogicP.SPI_SO -> MicaBusC.USART1_TXD; components new TimerMilliC() as Timer; Intersema5534LogicP.Timer->Timer; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/HalSensirionSht11C.nc000066400000000000000000000051461207233610700241730ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HalSensirionSht11C is an advanced access component for the * Sensirion SHT11 model humidity and temperature sensor, available on * the telosb platform. This component provides the SensirionSht11 * interface, which offers full control over the device. Please * acquire the Resource before using it. * * @author Gilman Tolle * @version $Revision: 1.2 $ $Date: 2010-06-15 21:19:52 $ */ configuration HalSensirionSht11C { provides interface Resource[ uint8_t client ]; provides interface SensirionSht11[ uint8_t client ]; } implementation { components new SensirionSht11LogicP(); SensirionSht11 = SensirionSht11LogicP; components HplSensirionSht11C; Resource = HplSensirionSht11C.Resource; SensirionSht11LogicP.DATA -> HplSensirionSht11C.DATA; SensirionSht11LogicP.CLOCK -> HplSensirionSht11C.SCK; SensirionSht11LogicP.InterruptDATA -> HplSensirionSht11C.InterruptDATA; components new TimerMilliC(); SensirionSht11LogicP.Timer -> TimerMilliC; components LedsC; SensirionSht11LogicP.Leds -> LedsC; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/HalTaos2550C.nc000066400000000000000000000040211207233610700226120ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ configuration HalTaos2550C { provides interface Resource[ uint8_t client ]; provides interface Read as VLight; provides interface Read as IRLight; } implementation { components new Taos2550LogicP(); VLight = Taos2550LogicP.VLight; IRLight = Taos2550LogicP.IRLight; components HplTaos2550C; Resource = HplTaos2550C.Resource; components new Atm128I2CMasterC(); Taos2550LogicP.I2CPacket -> Atm128I2CMasterC; Taos2550LogicP.I2CResource -> Atm128I2CMasterC; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/HplAccel202C.nc000066400000000000000000000045241207233610700226520ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #include"Accel202.h" #include"Adg715.h" configuration HplAccel202C { provides interface Resource[ uint8_t id ]; } implementation { components HplAccel202P; components new FcfsArbiterC( UQ_ACCEL202 ) as Arbiter; Resource = Arbiter; components new SplitControlPowerManagerC(); SplitControlPowerManagerC.SplitControl -> HplAccel202P; SplitControlPowerManagerC.ArbiterInfo -> Arbiter.ArbiterInfo; SplitControlPowerManagerC.ResourceDefaultOwner -> Arbiter.ResourceDefaultOwner; components Adg715C; HplAccel202P.DcDcBoost33Channel -> Adg715C.DcDcBoost33Channel; HplAccel202P.ChannelAccelPower -> Adg715C.ChannelAccelPower; HplAccel202P.ChannelAccel_X -> Adg715C.ChannelAccel_X; HplAccel202P.ChannelAccel_Y -> Adg715C.ChannelAccel_Y; HplAccel202P.Resource -> Adg715C.Resource[ unique(UQ_ADG715)]; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/HplAccel202P.nc000066400000000000000000000077241207233610700226740ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ module HplAccel202P { provides interface SplitControl; uses interface Channel as DcDcBoost33Channel; uses interface Channel as ChannelAccelPower; uses interface Channel as ChannelAccel_X; uses interface Channel as ChannelAccel_Y; uses interface Resource; } implementation { enum{ IDLE=0, START, STOP, }; uint8_t state=IDLE; command error_t SplitControl.start() { state=START; return call Resource.request(); } event void Resource.granted(){ error_t err; if(state==START){ if((err=call DcDcBoost33Channel.open())==SUCCESS){ return; } }else{ if((err=call DcDcBoost33Channel.close())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.startDone(err); } event void DcDcBoost33Channel.openDone(error_t err){ if(err==SUCCESS){ if((err=call ChannelAccelPower.open())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.startDone(err); } event void ChannelAccelPower.openDone(error_t err){ if(err==SUCCESS){ if((err=call ChannelAccel_X.open())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.startDone(err); } event void ChannelAccel_X.openDone(error_t err){ if(err==SUCCESS){ if((err=call ChannelAccel_Y.open())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.startDone(err); } event void ChannelAccel_Y.openDone(error_t err){ state=IDLE; call Resource.release(); signal SplitControl.startDone(err); } command error_t SplitControl.stop() { state=STOP; return call Resource.request(); } event void DcDcBoost33Channel.closeDone(error_t err){ if(err==SUCCESS){ if((err=call ChannelAccelPower.close())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.stopDone(err); } event void ChannelAccelPower.closeDone(error_t err){ if(err==SUCCESS){ if((err=call ChannelAccel_X.close())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.stopDone(err); } event void ChannelAccel_X.closeDone(error_t err){ if(err==SUCCESS){ if((err=call ChannelAccel_Y.close())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.stopDone(err); } event void ChannelAccel_Y.closeDone(error_t err){ state=IDLE; call Resource.release(); signal SplitControl.stopDone(err); } } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/HplAdg715C.nc000066400000000000000000000053131207233610700223440ustar00rootroot00000000000000/* * Copyright (c) 2008 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * The adg715 chip has 8 channels that are controlled through the I2C * bus. This configuration provides 8 Channel interfaces corresponding * to the 8 physical channels on the chip. This implementation is * specific to how the I2C bus is implemented on the micaz platform. * * @author Danny Park */ generic configuration HplAdg715C(bool pinA1High, bool pinA2High) { provides { interface Channel as Channel1; interface Channel as Channel2; interface Channel as Channel3; interface Channel as Channel4; interface Channel as Channel5; interface Channel as Channel6; interface Channel as Channel7; interface Channel as Channel8; } } implementation { components new Adg715ControlC(pinA1High, pinA2High), new Atm128I2CMasterC(); Channel1 = Adg715ControlC.Channel1; Channel2 = Adg715ControlC.Channel2; Channel3 = Adg715ControlC.Channel3; Channel4 = Adg715ControlC.Channel4; Channel5 = Adg715ControlC.Channel5; Channel6 = Adg715ControlC.Channel6; Channel7 = Adg715ControlC.Channel7; Channel8 = Adg715ControlC.Channel8; Adg715ControlC.I2CPacket -> Atm128I2CMasterC; Adg715ControlC.Resource -> Atm128I2CMasterC; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/HplIntersema5534C.nc000066400000000000000000000052511207233610700236650ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #include"Intersema5534.h" #include"Adg715.h" configuration HplIntersema5534C { provides interface Resource[ uint8_t id ]; } implementation { components HplIntersema5534P; components new FcfsArbiterC( UQ_INTERSEMA5534 ) as Arbiter; Resource = Arbiter; components new SplitControlPowerManagerC(); SplitControlPowerManagerC.SplitControl -> HplIntersema5534P; SplitControlPowerManagerC.ArbiterInfo -> Arbiter.ArbiterInfo; SplitControlPowerManagerC.ResourceDefaultOwner -> Arbiter.ResourceDefaultOwner; components Adg715C; HplIntersema5534P.ChannelPressurePower -> Adg715C.ChannelPressurePower; HplIntersema5534P.ChannelPressureClock -> Adg715C.ChannelPressureClock; HplIntersema5534P.ChannelPressureDin -> Adg715C.ChannelPressureDin; HplIntersema5534P.ChannelPressureDout -> Adg715C.ChannelPressureDout; HplIntersema5534P.Resource -> Adg715C.Resource[ unique(UQ_ADG715)]; components MicaBusC; HplIntersema5534P.SPI_CLK -> MicaBusC.USART1_CLK; HplIntersema5534P.SPI_SI -> MicaBusC.USART1_RXD; HplIntersema5534P.SPI_SO -> MicaBusC.USART1_TXD; components new TimerMilliC() as Timer; HplIntersema5534P.Timer -> Timer; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/HplIntersema5534P.nc000066400000000000000000000106471207233610700237070ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ module HplIntersema5534P { provides interface SplitControl; uses interface Channel as ChannelPressurePower; uses interface Channel as ChannelPressureClock; uses interface Channel as ChannelPressureDin; uses interface Channel as ChannelPressureDout; uses interface Timer; uses interface GeneralIO as SPI_CLK; uses interface GeneralIO as SPI_SI; uses interface GeneralIO as SPI_SO; uses interface Resource; } implementation { enum{ IDLE=0, START, STOP, }; uint8_t state=IDLE; command error_t SplitControl.start() { state=START; return call Resource.request(); } event void Resource.granted(){ error_t err; if(state==START){ if((err=call ChannelPressurePower.open())==SUCCESS){ return; } }else{ if((err=call ChannelPressurePower.close())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.startDone(err); } event void ChannelPressurePower.openDone(error_t err){ if(err==SUCCESS){ if((err=call ChannelPressureClock.open())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.startDone(err); } event void ChannelPressureClock.openDone(error_t err){ if(err==SUCCESS){ if((err=call ChannelPressureDin.open())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.startDone(err); } event void ChannelPressureDin.openDone(error_t err){ if(err==SUCCESS){ if((err=call ChannelPressureDout.open())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.startDone(err); } event void ChannelPressureDout.openDone(error_t err){ state=IDLE; call Resource.release(); if(err==SUCCESS){ call SPI_CLK.makeOutput(); call SPI_SI.makeInput(); call SPI_SI.set(); call SPI_SO.makeOutput(); call Timer.startOneShot(300); return; } signal SplitControl.startDone(err); } event void Timer.fired(){ signal SplitControl.startDone(SUCCESS); } command error_t SplitControl.stop() { state=STOP; return call Resource.request(); } event void ChannelPressurePower.closeDone(error_t err){ if(err==SUCCESS){ if((err=call ChannelPressureClock.close())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.stopDone(err); } event void ChannelPressureClock.closeDone(error_t err){ if(err==SUCCESS){ if((err=call ChannelPressureDin.close())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.stopDone(err); } event void ChannelPressureDin.closeDone(error_t err){ if(err==SUCCESS){ if((err=call ChannelPressureDout.close())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.stopDone(err); } event void ChannelPressureDout.closeDone(error_t err){ state=IDLE; call Resource.release(); signal SplitControl.stopDone(err); } } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/HplSensirionSht11C.nc000066400000000000000000000062231207233610700242070ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * HplSensirionSht11C is a low-level component, intended to provide * the physical resources used by the Sensirion SHT11 sensor on the * telosb platform so that the chip driver can make use of them. You * really shouldn't be wiring to this, unless you're writing a new * Sensirion SHT11 driver. * * @author Gilman Tolle * @version $Revision: 1.2 $ $Date: 2010-06-15 21:19:52 $ */ #include"Adg715.h" configuration HplSensirionSht11C { provides interface Resource[ uint8_t id ]; provides interface GeneralIO as DATA; provides interface GeneralIO as SCK; provides interface GpioInterrupt as InterruptDATA; } implementation { components MicaBusC; DATA = MicaBusC.Int3; SCK =MicaBusC.PW3; components HplSensirionSht11P; HplSensirionSht11P.DATA -> MicaBusC.Int3; HplSensirionSht11P.SCK -> MicaBusC.PW3; components new TimerMilliC(); HplSensirionSht11P.Timer -> TimerMilliC; InterruptDATA = MicaBusC.Int3_Interrupt; components new FcfsArbiterC( "Sht11.Resource" ) as Arbiter; Resource = Arbiter; components new SplitControlPowerManagerC(); SplitControlPowerManagerC.SplitControl -> HplSensirionSht11P; SplitControlPowerManagerC.ArbiterInfo -> Arbiter.ArbiterInfo; SplitControlPowerManagerC.ResourceDefaultOwner -> Arbiter.ResourceDefaultOwner; components Adg715C; HplSensirionSht11P.ChannelHumidityClock->Adg715C.ChannelHumidityClock; HplSensirionSht11P.ChannelHumidityData->Adg715C.ChannelHumidityData; HplSensirionSht11P.ChannelHumidityPower->Adg715C.ChannelHumidityPower; HplSensirionSht11P.Resource->Adg715C.Resource[ unique(UQ_ADG715)]; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/HplSensirionSht11P.nc000066400000000000000000000100611207233610700242170ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ #include "Timer.h" /** * HplSensirionSht11P is a low-level component that controls power for * the Sensirion SHT11 sensor on the telosb platform. * * @author Gilman Tolle * @version $Revision: 1.2 $ $Date: 2010-06-15 21:19:52 $ */ module HplSensirionSht11P { provides interface SplitControl; uses interface Timer; uses interface Channel as ChannelHumidityClock; uses interface Channel as ChannelHumidityData; uses interface Channel as ChannelHumidityPower; uses interface GeneralIO as DATA; uses interface GeneralIO as SCK; uses interface Resource; } implementation { enum{ IDLE=0, START, STOP, }; uint8_t state=IDLE; command error_t SplitControl.start() { state=START; return call Resource.request(); } event void Resource.granted(){ error_t err; if(state==START){ if((err=call ChannelHumidityClock.open())==SUCCESS){ return; } }else{ call SCK.makeInput(); call SCK.clr(); call DATA.makeInput(); call DATA.clr(); if((err=call ChannelHumidityClock.close())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.startDone(err); } event void ChannelHumidityClock.openDone(error_t err){ if (err==SUCCESS){ call ChannelHumidityData.open(); return; } state=IDLE; call Resource.release(); signal SplitControl.startDone( err ); } event void ChannelHumidityData.openDone(error_t err){ if (err==SUCCESS){ call ChannelHumidityPower.open(); return; } state=IDLE; call Resource.release(); signal SplitControl.startDone( err ); } event void ChannelHumidityPower.openDone(error_t err){ state=IDLE; call Resource.release(); if (err==SUCCESS){ call Timer.startOneShot(11); return; } signal SplitControl.startDone( err ); } event void Timer.fired(){ signal SplitControl.startDone( SUCCESS ); } command error_t SplitControl.stop(){ state=STOP; return call Resource.request(); } event void ChannelHumidityClock.closeDone(error_t err){ if (err==SUCCESS){ call ChannelHumidityData.close(); return; } state=IDLE; call Resource.release(); signal SplitControl.stopDone( err ); } event void ChannelHumidityData.closeDone(error_t err){ if (err==SUCCESS){ call ChannelHumidityPower.close(); return; } state=IDLE; call Resource.release(); signal SplitControl.stopDone( err ); } event void ChannelHumidityPower.closeDone(error_t err){ state=IDLE; call Resource.release(); signal SplitControl.stopDone( err ); } } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/HplTaos2550C.nc000066400000000000000000000045521207233610700226420ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #include"Taos2550.h" #include"Adg715.h" configuration HplTaos2550C { provides interface Resource[ uint8_t id ]; } implementation { components HplTaos2550P; components new FcfsArbiterC( UQ_TAOS2550 ) as Arbiter; Resource = Arbiter; components new SplitControlPowerManagerC(); SplitControlPowerManagerC.SplitControl -> HplTaos2550P; SplitControlPowerManagerC.ArbiterInfo -> Arbiter.ArbiterInfo; SplitControlPowerManagerC.ResourceDefaultOwner -> Arbiter.ResourceDefaultOwner; components Adg715C; HplTaos2550P.ChannelLightPower -> Adg715C.ChannelLightPower; HplTaos2550P.Resource -> Adg715C.Resource[ unique(UQ_ADG715)]; components new TimerMilliC()as Timer; HplTaos2550P.Timer -> Timer; components new Atm128I2CMasterC(); HplTaos2550P.I2CPacket -> Atm128I2CMasterC; HplTaos2550P.I2CResource -> Atm128I2CMasterC; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/HplTaos2550P.nc000066400000000000000000000071701207233610700226560ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #include"Taos2550.h" module HplTaos2550P { provides interface SplitControl; uses interface Channel as ChannelLightPower; uses interface Timer as Timer; uses interface I2CPacket; uses interface Resource as I2CResource; uses interface Resource; } implementation { enum{ IDLE=0, START, STOP, }; norace uint8_t state=IDLE; uint8_t cmd=TAOS_START; task void failTask(); task void startTimer(); command error_t SplitControl.start() { state=START; return call Resource.request(); } event void Resource.granted(){ error_t err; if(state==START){ if((err=call ChannelLightPower.open())==SUCCESS){ return; } }else{ if((err=call ChannelLightPower.close())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.startDone(err); } event void ChannelLightPower.openDone(error_t err){ if(err==SUCCESS){ if((err=call I2CResource.request())==SUCCESS){ return; } } state=IDLE; call Resource.release(); signal SplitControl.startDone(err); } event void I2CResource.granted(){ error_t err; if((err=call I2CPacket.write((I2C_START|I2C_STOP|I2C_ACK_END),TAOS_I2C_ADDR,1,&cmd))!=SUCCESS){ state=IDLE; call Resource.release(); call I2CResource.release(); signal SplitControl.startDone(err); } } async event void I2CPacket.writeDone(error_t error, uint16_t addr,uint8_t length, uint8_t* data){ state=IDLE; call Resource.release(); call I2CResource.release(); if(error!=SUCCESS){ post failTask(); }else{ post startTimer(); } } event void Timer.fired(){ signal SplitControl.startDone(SUCCESS); } command error_t SplitControl.stop() { state=STOP; return call Resource.request(); } event void ChannelLightPower.closeDone(error_t err) { state=IDLE; call Resource.release(); signal SplitControl.stopDone(err); } task void failTask(){ signal SplitControl.startDone(FAIL); } task void startTimer(){ call Timer.startOneShot(WARM_UP_TIME); } async event void I2CPacket.readDone(error_t error, uint16_t addr,uint8_t length, uint8_t* data){} } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Intersema.nc000066400000000000000000000032211207233610700225700ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ interface Intersema { command error_t read(); event void readDone(error_t error, int16_t* mesResult); } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Intersema5534.h000066400000000000000000000033551207233610700227500ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #ifndef INTERSEMA5534_H #define INTERSEMA5534_H #define UQ_INTERSEMA5534 "Intersema5534.Resource" #define PRESSURE_TIMEOUT_TRIES 5 void inline TOSH_wait() { asm volatile ("nop" ::); } #endif tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Intersema5534C.nc000066400000000000000000000040321207233610700232150ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #include "Intersema5534.h" generic configuration Intersema5534C() { provides interface Intersema; } implementation { components new Intersema5534ReaderP(); Intersema = Intersema5534ReaderP.Intersema; components HalIntersema5534C; Intersema5534ReaderP.Resource -> HalIntersema5534C.Resource[ unique(UQ_INTERSEMA5534)]; Intersema5534ReaderP.TempRead -> HalIntersema5534C.Temp; Intersema5534ReaderP.PressRead -> HalIntersema5534C.Press; Intersema5534ReaderP.Cal -> HalIntersema5534C.Cal; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Intersema5534LogicP.nc000066400000000000000000000144761207233610700242250ustar00rootroot00000000000000/* tab:4 * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Joe Polastre * * $Id: Intersema5534LogicP.nc,v 1.2 2010-06-29 22:07:56 scipio Exp $ */ #include "Intersema5534.h" generic module Intersema5534LogicP() { provides interface Read as Temp; provides interface Read as Press; provides interface Calibration as Cal; uses interface Timer as Timer; uses interface GeneralIO as SPI_CLK; uses interface GeneralIO as SPI_SI; uses interface GeneralIO as SPI_SO; } implementation { enum{ IDLE=0, CALIB, TEMP, PRESS, }; uint8_t state=IDLE; uint8_t timeout=0; uint16_t calibration[4]; uint16_t reading; void write_bit(bool); uint8_t read_bit(); uint16_t spi_word(uint8_t); uint16_t data_read(); void pulse_clock(); void spi_reset(); void sense(); task void SPITask(); task void gotInterrupt(); command error_t Cal.getData(){ if(state==IDLE){ state=CALIB; post SPITask(); return SUCCESS; } return FAIL; } command error_t Press.read() { if (state == IDLE) { state = PRESS; post SPITask(); return SUCCESS; } return FAIL; } command error_t Temp.read() { if (state == IDLE) { state = TEMP; post SPITask(); return SUCCESS; } return FAIL; } task void SPITask() { uint8_t i; if(state==CALIB){ atomic { for (i = 0; i < 4; i++) { // reset the device spi_reset(); calibration[i] = spi_word(i+1); } } // send the calibration data up to the application state = IDLE; signal Cal.dataReady(SUCCESS, calibration); }else{ atomic { // reset the device spi_reset(); // grab the sensor reading and store it locally sense(); } } } void task gotInterrupt() { uint16_t l_reading; atomic { reading = data_read(); } l_reading = reading; // give the application the sensor data if (state == TEMP) { state = IDLE; signal Temp.readDone(SUCCESS,l_reading); } else if (state == PRESS) { state = IDLE; signal Press.readDone(SUCCESS,l_reading); } } uint16_t data_read() { uint16_t result = 0,tresult = 0; uint8_t i; TOSH_wait(); for (i = 0; i < 16; i++) { tresult = (uint16_t)read_bit(); tresult = tresult << (15-i); result += tresult; } return result; } void pulse_clock() { TOSH_wait(); TOSH_wait(); call SPI_CLK.set(); TOSH_wait(); TOSH_wait(); call SPI_CLK.clr(); } void write_bit(bool bit) { if (bit) call SPI_SO.set(); else call SPI_SO.clr(); pulse_clock(); } uint8_t read_bit() { uint8_t i; call SPI_SO.clr(); call SPI_CLK.set(); TOSH_wait(); TOSH_wait(); i = call SPI_SI.get(); call SPI_CLK.clr(); return i; } uint16_t spi_word(uint8_t num) { uint8_t i; TOSH_wait(); TOSH_wait(); // write first byte for (i = 0; i < 3; i++) { write_bit(TRUE); } write_bit(FALSE); write_bit(TRUE); if (num == 1) { write_bit(FALSE); write_bit(TRUE); write_bit(FALSE); write_bit(TRUE); } else if (num == 2) { write_bit(FALSE); write_bit(TRUE); write_bit(TRUE); write_bit(FALSE); } else if (num == 3) { write_bit(TRUE); write_bit(FALSE); write_bit(FALSE); write_bit(TRUE); } else if (num == 4) { write_bit(TRUE); write_bit(FALSE); write_bit(TRUE); write_bit(FALSE); } for (i = 0; i < 4; i++){ write_bit(FALSE); } TOSH_wait(); return data_read(); } void spi_reset() { uint8_t i = 0; for (i = 0; i < 21; i++) { if (i < 16) { if ((i % 2) == 0) write_bit(TRUE); else write_bit(FALSE); } else write_bit(FALSE); } } void sense() { uint8_t i; TOSH_wait(); TOSH_wait(); // write first byte for (i = 0; i < 3; i++) { write_bit(TRUE); } if (state == PRESS) { write_bit(TRUE); write_bit(FALSE); write_bit(TRUE); write_bit(FALSE); } else if (state == TEMP) { write_bit(TRUE); write_bit(FALSE); write_bit(FALSE); write_bit(TRUE); } for (i = 0; i < 5; i++) { write_bit(FALSE); } timeout = 0; call Timer.startOneShot(36); } event void Timer.fired() { if (call SPI_SI.get() == 1) { timeout++; if (timeout > PRESSURE_TIMEOUT_TRIES) { if (state == PRESS) { state = IDLE; signal Press.readDone( FAIL, 0 ); return; }else if (state == TEMP) { state = IDLE; signal Temp.readDone( FAIL, 0 ); return; } } call Timer.startOneShot(20); } else post gotInterrupt(); } } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Intersema5534ReaderP.nc000066400000000000000000000075011207233610700243610ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ generic module Intersema5534ReaderP() { provides interface Intersema; uses interface Resource; uses interface Read as TempRead; uses interface Read as PressRead; uses interface Calibration as Cal; } implementation { int16_t mesResults[2]; int32_t C1,C2,C3,C4,C5,C6,UT1,dT,T2; bool startUP=TRUE; command error_t Intersema.read() { return call Resource.request(); } event void Resource.granted() { error_t result; if ((result = startUP ? call Cal.getData() : call TempRead.read()) != SUCCESS) { call Resource.release(); signal Intersema.readDone( result, 0 ); } startUP=FALSE; } event void Cal.dataReady(error_t error, uint16_t* calibration){ if(error==SUCCESS){ C1=(int32_t)((calibration[0] & 0xFFFE)>>1); C2=(int32_t)(((calibration[2] & 0x003F)<<6)|(calibration[3] & 0x003F)); C3=(int32_t)((calibration[3] & 0xFFC0)>>6); C4=(int32_t)((calibration[2] & 0xFFC0)>>6); C5=(int32_t)(((calibration[0] & 0x0001)<<10)| ((calibration[1] & 0xFFC0)>>6)); C6=(int32_t)(calibration[1] & 0x003F); UT1=(C5<<3)+20224; if ((error = call TempRead.read()) == SUCCESS) { return; } } call Resource.release(); signal Intersema.readDone( error, 0 ); } event void TempRead.readDone( error_t error, uint16_t val ) { if(error==SUCCESS){ dT=(int32_t)val-UT1; mesResults[0]=200+((dT*(C6+50))>>10); if(mesResults[0]<200){ T2=(11*(C6+24)*(200-(int32_t)mesResults[0])*(200-(int32_t)mesResults[0]))>>20; }else if (mesResults[0]>450){ T2=(3*(C6+24)*(450-(int32_t)mesResults[0])*(450-(int32_t)mesResults[0]))>>20; } else{ T2=0; } mesResults[0]-=T2; if ((error = call PressRead.read()) == SUCCESS) { return; } } call Resource.release(); signal Intersema.readDone( error, 0); } event void PressRead.readDone( error_t error, uint16_t val ) { int32_t SENS,OFF,X; call Resource.release(); if(error==SUCCESS){ OFF=(C2<<2)+(((C4-512)*dT)>>12); SENS=C1+((C3*dT)>>10)+24576; X=((SENS*((int32_t)val-7168))>>14)-OFF; mesResults[1]=(((X*10)>>5)+2500); if(mesResults[0]<200){ mesResults[1]-=3*T2*(((int32_t)mesResults[1]-3500)>>14); }else if(mesResults[0]>450){ mesResults[1]-=T2*(((int32_t)mesResults[1]-10000)>>13); } } signal Intersema.readDone( error, mesResults); } } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/SensirionSht11C.nc000066400000000000000000000061011207233610700235360ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * SensirionSht11C is a top-level access component for the Sensirion * SHT11 model humidity and temperature sensor, available on the * telosb platform. Because this component represents one physical * device, simultaneous calls to read temperature and humidity will be * arbitrated and executed in sequential order. Feel free to read both * at the same time, just be aware that they'll come back * sequentially. * * @author Gilman Tolle * @version $Revision: 1.2 $ $Date: 2010-06-15 21:19:53 $ */ generic configuration SensirionSht11C() { provides interface Read as Temperature; provides interface DeviceMetadata as TemperatureMetadata; provides interface Read as Humidity; provides interface DeviceMetadata as HumidityMetadata; } implementation { components new SensirionSht11ReaderP(); Temperature = SensirionSht11ReaderP.Temperature; TemperatureMetadata = SensirionSht11ReaderP.TemperatureMetadata; Humidity = SensirionSht11ReaderP.Humidity; HumidityMetadata = SensirionSht11ReaderP.HumidityMetadata; components HalSensirionSht11C; enum { TEMP_KEY = unique("Sht11.Resource") }; enum { HUM_KEY = unique("Sht11.Resource") }; SensirionSht11ReaderP.TempResource -> HalSensirionSht11C.Resource[ TEMP_KEY ]; SensirionSht11ReaderP.Sht11Temp -> HalSensirionSht11C.SensirionSht11[ TEMP_KEY ]; SensirionSht11ReaderP.HumResource -> HalSensirionSht11C.Resource[ HUM_KEY ]; SensirionSht11ReaderP.Sht11Hum -> HalSensirionSht11C.SensirionSht11[ HUM_KEY ]; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Taos2550.h000066400000000000000000000033641207233610700217220ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #ifndef TAOS2550_H #define TAOS2550_H #define UQ_TAOS2550 "Taos2550.Resource" enum{ TAOS_I2C_ADDR = 0x39, TAOS_I2C_ADC0 =0x43, TAOS_I2C_ADC1 =0x83, TAOS_START = 0x03, WARM_UP_TIME = 1000, }; #endif tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Taos2550C.nc000066400000000000000000000042571207233610700222000ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #include "Taos2550.h" generic configuration Taos2550C() { provides interface Read as VisibleLight; provides interface Read as InfraredLight; } implementation { components new Taos2550ReaderP(); VisibleLight = Taos2550ReaderP.VisibleLight; InfraredLight = Taos2550ReaderP.InfraredLight; components HalTaos2550C; enum { VL_KEY = unique(UQ_TAOS2550)}; enum { IRL_KEY = unique(UQ_TAOS2550)}; Taos2550ReaderP.VLResource -> HalTaos2550C.Resource[ VL_KEY ]; Taos2550ReaderP.VLRead -> HalTaos2550C.VLight; Taos2550ReaderP.IRResource -> HalTaos2550C.Resource[ IRL_KEY]; Taos2550ReaderP.IRRead -> HalTaos2550C.IRLight; } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Taos2550LogicP.nc000066400000000000000000000064311207233610700231670ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ #include"Taos2550.h" generic module Taos2550LogicP() { provides interface Read as VLight; provides interface Read as IRLight; uses interface I2CPacket; uses interface Resource as I2CResource; } implementation { task void read(); task void readDone(); task void failTask(); error_t performCommand(uint8_t); uint8_t cmd,readData; command error_t VLight.read() { return performCommand(TAOS_I2C_ADC0); } command error_t IRLight.read() { return performCommand(TAOS_I2C_ADC1); } error_t performCommand(uint8_t Command) { cmd=Command; return call I2CResource.request(); } event void I2CResource.granted(){ if(call I2CPacket.write((I2C_START|I2C_STOP|I2C_ACK_END),TAOS_I2C_ADDR,1,&cmd)!=SUCCESS){ call I2CResource.release(); post failTask(); } } async event void I2CPacket.writeDone(error_t error, uint16_t addr,uint8_t length, uint8_t* data){ if(error!=SUCCESS){ call I2CResource.release(); post failTask(); }else{ post read(); } } task void read(){ if(call I2CPacket.read((I2C_START|I2C_STOP|I2C_ACK_END),TAOS_I2C_ADDR,1,&readData)!=SUCCESS){ call I2CResource.release(); post failTask(); } } async event void I2CPacket.readDone(error_t error, uint16_t addr,uint8_t length, uint8_t* data){ call I2CResource.release(); if(error!=SUCCESS){ post failTask(); }else{ post readDone(); } } task void readDone(){ error_t res=(readData>>7==1)?SUCCESS:FAIL; if(cmd==TAOS_I2C_ADC0){ signal VLight.readDone( res, (readData & 0x7F)); } else { signal IRLight.readDone( res, (readData & 0x7F) ); } } task void failTask(){ if(cmd==TAOS_I2C_ADC0){ signal VLight.readDone( FAIL, 0 ); } else { signal IRLight.readDone( FAIL, 0 ); } } } tinyos-2.1.2+dfsg/tos/sensorboards/mts400/Taos2550ReaderP.nc000066400000000000000000000054661207233610700233430ustar00rootroot00000000000000/** Copyright (c) 2009, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Zoltan Kincses */ generic module Taos2550ReaderP() { provides interface Read as VisibleLight; provides interface Read as InfraredLight; uses interface Resource as VLResource; uses interface Resource as IRResource; uses interface Read as VLRead; uses interface Read as IRRead; } implementation { command error_t VisibleLight.read() { return call VLResource.request(); } event void VLResource.granted() { error_t result; if ((result = call VLRead.read()) != SUCCESS) { call VLResource.release(); signal VisibleLight.readDone( result, 0 ); } } event void VLRead.readDone( error_t result, uint8_t val ) { call VLResource.release(); signal VisibleLight.readDone( result, val ); } command error_t InfraredLight.read() { return call IRResource.request(); } event void IRResource.granted() { error_t result; if ((result = call IRRead.read()) != SUCCESS) { call IRResource.release(); signal InfraredLight.readDone( result, 0 ); } } event void IRRead.readDone( error_t result, uint8_t val ) { call IRResource.release(); signal InfraredLight.readDone( result, val ); } default event void VisibleLight.readDone( error_t result, uint8_t val ) { } default event void InfraredLight.readDone( error_t result, uint8_t val ) { } } tinyos-2.1.2+dfsg/tos/system/000077500000000000000000000000001207233610700161125ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/system/AMQueueEntryP.nc000066400000000000000000000050531207233610700211030ustar00rootroot00000000000000// $Id: AMQueueEntryP.nc,v 1.7 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Internal AM component that fills in needed packet fields for the * AMSend -> Send transformation. * * @author Philip Levis * @date Jan 16 2006 */ #include "AM.h" generic module AMQueueEntryP(am_id_t amId) @safe() { provides interface AMSend; uses{ interface Send; interface AMPacket; } } implementation { command error_t AMSend.send(am_addr_t dest, message_t* msg, uint8_t len) { call AMPacket.setDestination(msg, dest); call AMPacket.setType(msg, amId); return call Send.send(msg, len); } command error_t AMSend.cancel(message_t* msg) { return call Send.cancel(msg); } event void Send.sendDone(message_t* m, error_t err) { signal AMSend.sendDone(m, err); } command uint8_t AMSend.maxPayloadLength() { return call Send.maxPayloadLength(); } command void* AMSend.getPayload(message_t* m, uint8_t len) { return call Send.getPayload(m, len); } } tinyos-2.1.2+dfsg/tos/system/AMQueueImplP.nc000066400000000000000000000167271207233610700207150ustar00rootroot00000000000000// $Id: AMQueueImplP.nc,v 1.11 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * An AM send queue that provides a Service Instance pattern for * formatted packets and calls an underlying AMSend in a round-robin * fashion. Used to share L2 bandwidth between different communication * clients. * * @author Philip Levis * @date Jan 16 2006 */ #include "AM.h" generic module AMQueueImplP(int numClients) @safe() { provides interface Send[uint8_t client]; uses{ interface AMSend[am_id_t id]; interface AMPacket; interface Packet; } } implementation { typedef struct { message_t* ONE_NOK msg; } queue_entry_t; uint8_t current = numClients; // mark as empty queue_entry_t queue[numClients]; uint8_t cancelMask[numClients/8 + 1]; void tryToSend(); void nextPacket() { uint8_t i; current = (current + 1) % numClients; for(i = 0; i < numClients; i++) { if((queue[current].msg == NULL) || (cancelMask[current/8] & (1 << current%8))) { current = (current + 1) % numClients; } else { break; } } if(i >= numClients) current = numClients; } /** * Accepts a properly formatted AM packet for later sending. * Assumes that someone has filled in the AM packet fields * (destination, AM type). * * @param msg - the message to send * @param len - the length of the payload * */ command error_t Send.send[uint8_t clientId](message_t* msg, uint8_t len) { if (clientId >= numClients) { return FAIL; } if (queue[clientId].msg != NULL) { return EBUSY; } dbg("AMQueue", "AMQueue: request to send from %hhu (%p): passed checks\n", clientId, msg); queue[clientId].msg = msg; call Packet.setPayloadLength(msg, len); if (current >= numClients) { // queue empty error_t err; am_id_t amId = call AMPacket.type(msg); am_addr_t dest = call AMPacket.destination(msg); dbg("AMQueue", "%s: request to send from %hhu (%p): queue empty\n", __FUNCTION__, clientId, msg); current = clientId; err = call AMSend.send[amId](dest, msg, len); if (err != SUCCESS) { dbg("AMQueue", "%s: underlying send failed.\n", __FUNCTION__); current = numClients; queue[clientId].msg = NULL; } return err; } else { dbg("AMQueue", "AMQueue: request to send from %hhu (%p): queue not empty\n", clientId, msg); } return SUCCESS; } task void CancelTask() { uint8_t i,j,mask,last; message_t *msg; for(i = 0; i < numClients/8 + 1; i++) { if(cancelMask[i]) { for(mask = 1, j = 0; j < 8; j++) { if(cancelMask[i] & mask) { last = i*8 + j; msg = queue[last].msg; queue[last].msg = NULL; cancelMask[i] &= ~mask; signal Send.sendDone[last](msg, ECANCEL); } mask <<= 1; } } } } command error_t Send.cancel[uint8_t clientId](message_t* msg) { if (clientId >= numClients || // Not a valid client queue[clientId].msg == NULL || // No packet pending queue[clientId].msg != msg) { // Not the right packet return FAIL; } if(current == clientId) { am_id_t amId = call AMPacket.type(msg); error_t err = call AMSend.cancel[amId](msg); return err; } else { cancelMask[clientId/8] |= 1 << clientId % 8; post CancelTask(); return SUCCESS; } } void sendDone(uint8_t last, message_t * ONE msg, error_t err) { queue[last].msg = NULL; tryToSend(); signal Send.sendDone[last](msg, err); } task void errorTask() { sendDone(current, queue[current].msg, FAIL); } // NOTE: Increments current! void tryToSend() { nextPacket(); if (current < numClients) { // queue not empty error_t nextErr; message_t* nextMsg = queue[current].msg; am_id_t nextId = call AMPacket.type(nextMsg); am_addr_t nextDest = call AMPacket.destination(nextMsg); uint8_t len = call Packet.payloadLength(nextMsg); nextErr = call AMSend.send[nextId](nextDest, nextMsg, len); if(nextErr != SUCCESS) { post errorTask(); } } } event void AMSend.sendDone[am_id_t id](message_t* msg, error_t err) { // Bug fix from John Regehr: if the underlying radio mixes things // up, we don't want to read memory incorrectly. This can occur // on the mica2. // Note that since all AM packets go through this queue, this // means that the radio has a problem. -pal if (current >= numClients) { return; } if(queue[current].msg == msg) { sendDone(current, msg, err); } else { dbg("PointerBug", "%s received send done for %p, signaling for %p.\n", __FUNCTION__, msg, queue[current].msg); } } command uint8_t Send.maxPayloadLength[uint8_t id]() { return call AMSend.maxPayloadLength[0](); } command void* Send.getPayload[uint8_t id](message_t* m, uint8_t len) { return call AMSend.getPayload[0](m, len); } default event void Send.sendDone[uint8_t id](message_t* msg, error_t err) { // Do nothing } default command error_t AMSend.send[uint8_t id](am_addr_t am_id, message_t* msg, uint8_t len) { return FAIL; } } tinyos-2.1.2+dfsg/tos/system/AMQueueP.nc000066400000000000000000000041431207233610700200600ustar00rootroot00000000000000// $Id: AMQueueP.nc,v 1.5 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The fair-share send queue for AM radio communication. * * @author Philip Levis * @date Jan 16 2006 */ #include "AM.h" configuration AMQueueP { provides interface Send[uint8_t client]; } implementation { enum { NUM_CLIENTS = uniqueCount(UQ_AMQUEUE_SEND) }; components new AMQueueImplP(NUM_CLIENTS), ActiveMessageC; Send = AMQueueImplP; AMQueueImplP.AMSend -> ActiveMessageC; AMQueueImplP.AMPacket -> ActiveMessageC; AMQueueImplP.Packet -> ActiveMessageC; } tinyos-2.1.2+dfsg/tos/system/AMReceiverC.nc000066400000000000000000000040561207233610700205260ustar00rootroot00000000000000// $Id: AMReceiverC.nc,v 1.5 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The virtualized AM reception abstraction. * * @author Philip Levis * @date Jan 16 2006 * @see TEP 116: Packet Protocols */ #include "AM.h" generic configuration AMReceiverC(am_id_t amId) { provides { interface Receive; interface Packet; interface AMPacket; } } implementation { components ActiveMessageC; Receive = ActiveMessageC.Receive[amId]; Packet = ActiveMessageC; AMPacket = ActiveMessageC; } tinyos-2.1.2+dfsg/tos/system/AMSenderC.nc000066400000000000000000000047251207233610700202050ustar00rootroot00000000000000// $Id: AMSenderC.nc,v 1.6 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The virtualized active message send abstraction. Each instantiation * of AMSenderC has its own queue of depth one. Therefore, it does not * have to contend with other AMSenderC instantiations for queue space. * The underlying implementation schedules the packets in these queues * using some form of fair-share queueing. * * @author Philip Levis * @date Jan 16 2006 * @see TEP 116: Packet Protocols */ #include "AM.h" generic configuration AMSenderC(am_id_t AMId) { provides { interface AMSend; interface Packet; interface AMPacket; interface PacketAcknowledgements as Acks; } } implementation { #if defined(LOW_POWER_LISTENING) components new LplAMSenderC(AMId) as SenderC; #else components new DirectAMSenderC(AMId) as SenderC; #endif AMSend = SenderC; Packet = SenderC; AMPacket = SenderC; Acks = SenderC; } tinyos-2.1.2+dfsg/tos/system/AMSnooperC.nc000066400000000000000000000041341207233610700204040ustar00rootroot00000000000000// $Id: AMSnooperC.nc,v 1.5 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The virtualization of snooping on overheard packets that are not * destined to this node. * * @author Philip Levis * @date Jan 16 2006 * @see TEP 116: Packet Protocols */ #include "AM.h" generic configuration AMSnooperC(am_id_t AMId) { provides { interface Receive; interface Packet; interface AMPacket; } } implementation { components ActiveMessageC; Receive = ActiveMessageC.Snoop[AMId]; Packet = ActiveMessageC; AMPacket = ActiveMessageC; } tinyos-2.1.2+dfsg/tos/system/AMSnoopingReceiverC.nc000066400000000000000000000042551207233610700222440ustar00rootroot00000000000000// $Id: AMSnoopingReceiverC.nc,v 1.6 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The virtualized abstraction to hearing all packets of a given AM type, * whether destined for this node or not. * * @author Philip Levis * @date Jan 16 2006 * @see TEP 116: Packet Protocols */ #include "AM.h" generic configuration AMSnoopingReceiverC(am_id_t AMId) { provides { interface Receive; interface Packet; interface AMPacket; } } implementation { components ActiveMessageC; Receive = ActiveMessageC.Snoop[AMId]; Receive = ActiveMessageC.Receive[AMId]; Packet = ActiveMessageC; AMPacket = ActiveMessageC; } tinyos-2.1.2+dfsg/tos/system/ActiveMessageAddressC.nc000066400000000000000000000101041207233610700225610ustar00rootroot00000000000000// $Id: ActiveMessageAddressC.nc,v 1.10 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * * Date last modified: $Id: ActiveMessageAddressC.nc,v 1.10 2010-06-29 22:07:56 scipio Exp $ * */ /** * Component that stores the node's active message address and group ID. * * @author Philip Levis * @author David Moss */ module ActiveMessageAddressC @safe() { provides { interface ActiveMessageAddress; async command am_addr_t amAddress(); async command void setAmAddress(am_addr_t a); } } implementation { /** Node address */ am_addr_t addr = TOS_AM_ADDRESS; /** Group address */ am_group_t group = TOS_AM_GROUP; /***************** ActiveMessageAddress Commands ****************/ /** * @return the active message address of this node */ async command am_addr_t ActiveMessageAddress.amAddress() { return call amAddress(); } /** * Set the active message address of this node * @param group The node's group ID * @param addr The node's active message address */ async command void ActiveMessageAddress.setAddress(am_group_t myGroup, am_addr_t myAddr) { atomic { addr = myAddr; group = myGroup; } signal ActiveMessageAddress.changed(); } /** * @return the group address of this node */ async command am_group_t ActiveMessageAddress.amGroup() { am_group_t myGroup; atomic myGroup = group; return myGroup; } /***************** Deprecated Commands ****************/ /** * Get the node's default AM address. * @return address * @deprecated Use ActiveMessageAddress.amAddress() instead */ async command am_addr_t amAddress() { am_addr_t myAddr; atomic myAddr = addr; return myAddr; } /** * Set the node's default AM address. * * @param a - the address. * @deprecated Use ActiveMessageAddress.setAddress() instead */ async command void setAmAddress(am_addr_t a) { atomic addr = a; signal ActiveMessageAddress.changed(); } /***************** Defaults ****************/ /** * Notification that the address of this node changed. */ default async event void ActiveMessageAddress.changed() { } } tinyos-2.1.2+dfsg/tos/system/ActiveMessageImplP.nc000066400000000000000000000054011207233610700221160ustar00rootroot00000000000000// $Id: ActiveMessageImplP.nc,v 1.6 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2004 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The underlying configuration of the AM layer. and exports * the AM interfaces. Deprecated and so should not be wired to. * * @author Philip Levis * @date January 5 2005 */ #include "AM.h" configuration ActiveMessageImplP { provides { interface SplitControl; interface AMSend[am_id_t id]; interface Receive[am_id_t id]; interface Receive as Snoop[am_id_t id]; interface Packet; interface AMPacket; interface PacketAcknowledgements; } } implementation { components ActiveMessageC; SplitControl = ActiveMessageC; AMSend = ActiveMessageC; Receive = ActiveMessageC.Receive; Snoop = ActiveMessageC.Snoop; Packet = ActiveMessageC; AMPacket = ActiveMessageC; PacketAcknowledgements = ActiveMessageC; } tinyos-2.1.2+dfsg/tos/system/ArbiterP.nc000066400000000000000000000154701207233610700201530ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Please refer to TEP 108 for more information about this component and its * intended use.

        * * This component provides the Resource, ResourceRequested, ArbiterInfo, * and ResourceDefaultOwner interfaces and uses the ResourceConfigure interface as * described in TEP 108. It provides arbitration to a shared resource. * A Queue is used to keep track of which users have put * in requests for the resource. Upon the release of the resource by one * of these users, the queue is checked and the next user * that has a pending request will ge granted control of the resource. If * there are no pending requests, then the user of the ResourceDefaultOwner * interface gains access to the resource, and holds onto it until * another user makes a request. * * @param default_owner_id -- The id of the default owner of this * resource * * @author Kevin Klues (klues@tkn.tu-berlin.de) * @author Philip Levis */ generic module ArbiterP(uint8_t default_owner_id) @safe() { provides { interface Resource[uint8_t id]; interface ResourceRequested[uint8_t id]; interface ResourceDefaultOwner; interface ArbiterInfo; } uses { interface ResourceConfigure[uint8_t id]; interface ResourceQueue as Queue; interface Leds; } } implementation { enum {RES_CONTROLLED, RES_GRANTING, RES_IMM_GRANTING, RES_BUSY}; enum {default_owner_id = default_owner_id}; enum {NO_RES = 0xFF}; uint8_t state = RES_CONTROLLED; norace uint8_t resId = default_owner_id; norace uint8_t reqResId; task void grantedTask(); async command error_t Resource.request[uint8_t id]() { signal ResourceRequested.requested[resId](); atomic { if(state == RES_CONTROLLED) { state = RES_GRANTING; reqResId = id; } else if (reqResId == id) { return SUCCESS; } else return call Queue.enqueue(id); } signal ResourceDefaultOwner.requested(); return SUCCESS; } async command error_t Resource.immediateRequest[uint8_t id]() { signal ResourceRequested.immediateRequested[resId](); atomic { if(state == RES_CONTROLLED) { state = RES_IMM_GRANTING; reqResId = id; } else return FAIL; } signal ResourceDefaultOwner.immediateRequested(); if(resId == id) { call ResourceConfigure.configure[resId](); return SUCCESS; } atomic state = RES_CONTROLLED; return FAIL; } async command error_t Resource.release[uint8_t id]() { atomic { if(state == RES_BUSY && resId == id) { if(call Queue.isEmpty() == FALSE) { reqResId = call Queue.dequeue(); resId = NO_RES; state = RES_GRANTING; post grantedTask(); call ResourceConfigure.unconfigure[id](); } else { resId = default_owner_id; state = RES_CONTROLLED; call ResourceConfigure.unconfigure[id](); signal ResourceDefaultOwner.granted(); } return SUCCESS; } } return FAIL; } async command error_t ResourceDefaultOwner.release() { atomic { if(resId == default_owner_id) { if(state == RES_GRANTING) { post grantedTask(); return SUCCESS; } else if(state == RES_IMM_GRANTING) { resId = reqResId; state = RES_BUSY; return SUCCESS; } } } return FAIL; } /** Check if the Resource is currently in use */ async command bool ArbiterInfo.inUse() { atomic { if (state == RES_CONTROLLED) return FALSE; } return TRUE; } /** Returns the current user of the Resource. If there is no current user, the return value will be 0xFF */ async command uint8_t ArbiterInfo.userId() { atomic { if(state != RES_BUSY) return NO_RES; return resId; } } /** * Returns my user id. */ async command bool Resource.isOwner[uint8_t id]() { atomic { if(resId == id && state == RES_BUSY) return TRUE; else return FALSE; } } async command bool ResourceDefaultOwner.isOwner() { atomic return (state == RES_CONTROLLED || (resId == default_owner_id && (state == RES_GRANTING || state == RES_IMM_GRANTING))); } task void grantedTask() { atomic { resId = reqResId; state = RES_BUSY; } call ResourceConfigure.configure[resId](); signal Resource.granted[resId](); } //Default event/command handlers for all of the other //potential users/providers of the parameterized interfaces //that have not been connected to. default event void Resource.granted[uint8_t id]() { } default async event void ResourceRequested.requested[uint8_t id]() { } default async event void ResourceRequested.immediateRequested[uint8_t id]() { } default async event void ResourceDefaultOwner.granted() { } default async event void ResourceDefaultOwner.requested() { call ResourceDefaultOwner.release(); } default async event void ResourceDefaultOwner.immediateRequested() { call ResourceDefaultOwner.release(); } default async command void ResourceConfigure.configure[uint8_t id]() { } default async command void ResourceConfigure.unconfigure[uint8_t id]() { } } tinyos-2.1.2+dfsg/tos/system/ArbitratedReadC.nc000066400000000000000000000033741207233610700214230ustar00rootroot00000000000000/* $Id: ArbitratedReadC.nc,v 1.6 2008-06-26 04:39:14 regehr Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implement arbitrated access to a Read interface, based on an * underlying arbitrated Resource interface. * * Note that this code does not deal with unexpected events: it assumes * that all events it receives are in response to commands that it * made. See tos/chips/atm128/adc for an example of using ArbitratedReadC * in a safe way. * * @param width_t Width of the underlying Read interface. * * @author David Gay */ generic module ArbitratedReadC(typedef width_t) @safe() { provides interface Read[uint8_t client]; uses { interface Read as Service[uint8_t client]; interface Resource[uint8_t client]; } } implementation { command error_t Read.read[uint8_t client]() { return call Resource.request[client](); } event void Resource.granted[uint8_t client]() { call Service.read[client](); } event void Service.readDone[uint8_t client](error_t result, width_t data) { call Resource.release[client](); signal Read.readDone[client](result, data); } default async command error_t Resource.request[uint8_t client]() { return FAIL; } default async command error_t Resource.release[uint8_t client]() { return FAIL; } default event void Read.readDone[uint8_t client](error_t result, width_t data) { } default command error_t Service.read[uint8_t client]() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/system/ArbitratedReadNowC.nc000066400000000000000000000034521207233610700221040ustar00rootroot00000000000000/* $Id: ArbitratedReadNowC.nc,v 1.4 2006-12-12 18:23:47 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implement arbitrated access to a ReadNow interface, based on an * underlying arbitrated Resource interface. * * Note that this code does not deal with unexpected events: it assumes * that all events it receives are in response to commands that it * made. * * @param width_t Width of the underlying ReadNow interface. * * @author David Gay */ generic module ArbitratedReadNowC(typedef width_t) { provides interface ReadNow[uint8_t client]; uses { interface ReadNow as Service[uint8_t client]; interface Resource[uint8_t client]; } } implementation { async command error_t ReadNow.read[uint8_t client]() { error_t req = call Resource.immediateRequest[client](); if (req != SUCCESS) return req; call Service.read[client](); return SUCCESS; } async event void Service.readDone[uint8_t client](error_t result, width_t data) { call Resource.release[client](); signal ReadNow.readDone[client](result, data); } default async command error_t Resource.immediateRequest[uint8_t client]() { return FAIL; } default async command error_t Resource.release[uint8_t client]() { return FAIL; } default async event void ReadNow.readDone[uint8_t client](error_t result, width_t data) { } default async command error_t Service.read[uint8_t client]() { return SUCCESS; } event void Resource.granted[uint8_t client]() { } } tinyos-2.1.2+dfsg/tos/system/ArbitratedReadStreamC.nc000066400000000000000000000050731207233610700225750ustar00rootroot00000000000000/* $Id: ArbitratedReadStreamC.nc,v 1.4 2006-12-12 18:23:47 vlahan Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Implement arbitrated access to a Read interface, based on an * underlying arbitrated Resource interface. * * Note that this code does not deal with unexpected events: it assumes * that all events it receives are in response to commands that it * made. See tos/chips/atm128/adc for an example of using * ArbitratedReadStreamC in a safe way. * * @param width_t Width of the underlying ReadStream interface. * * @author David Gay */ generic module ArbitratedReadStreamC(uint8_t nClients, typedef val_t) { provides interface ReadStream[uint8_t client]; uses { interface ReadStream as Service[uint8_t client]; interface Resource[uint8_t client]; } } implementation { uint32_t period[nClients]; command error_t ReadStream.postBuffer[uint8_t client](val_t* buf, uint16_t count) { return call Service.postBuffer[client](buf, count); } command error_t ReadStream.read[uint8_t client](uint32_t usPeriod) { error_t ok = call Resource.request[client](); if (ok == SUCCESS) period[client] = usPeriod; return ok; } event void Service.bufferDone[uint8_t client](error_t result, val_t *buf, uint16_t count) { signal ReadStream.bufferDone[client](result, buf, count); } event void Service.readDone[uint8_t client](error_t result, uint32_t actualPeriod) { call Resource.release[client](); signal ReadStream.readDone[client](result, actualPeriod); } event void Resource.granted[uint8_t client]() { call Service.read[client](period[client]); } /* Defaults to keep compiler happy */ default async command error_t Resource.request[uint8_t client]() { return SUCCESS; } default async command error_t Resource.release[uint8_t client]() { return FAIL; } default command error_t Service.postBuffer[uint8_t client](val_t* buf, uint16_t count) { return FAIL; } default command error_t Service.read[uint8_t client](uint32_t usPeriod) { return FAIL; } default event void ReadStream.bufferDone[uint8_t client](error_t result, val_t *buf, uint16_t count) { } default event void ReadStream.readDone[uint8_t client](error_t result, uint32_t actualPeriod) { } } tinyos-2.1.2+dfsg/tos/system/BigQueueC.nc000066400000000000000000000065321207233610700202530ustar00rootroot00000000000000/* $Id: BigQueueC.nc,v 1.1 2007-09-19 17:20:47 klueska Exp $ */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A general FIFO queue component, whose queue has a bounded size. * * @author Philip Levis * @author Geoffrey Mainland * @date $Date: 2007-09-19 17:20:47 $ */ generic module BigQueueC(typedef queue_t, uint16_t QUEUE_SIZE) { provides interface BigQueue as Queue; } implementation { queue_t queue[QUEUE_SIZE]; uint16_t head = 0; uint16_t tail = 0; uint16_t size = 0; command bool Queue.empty() { return size == 0; } command uint16_t Queue.size() { return size; } command uint16_t Queue.maxSize() { return QUEUE_SIZE; } command queue_t Queue.head() { return queue[head]; } void printQueue() { #ifdef TOSSIM int i, j; dbg("QueueC", "head <-"); for (i = head; i < head + size; i++) { dbg_clear("QueueC", "["); for (j = 0; j < sizeof(queue_t); j++) { uint8_t v = ((uint8_t*)&queue[i % QUEUE_SIZE])[j]; dbg_clear("QueueC", "%0.2hhx", v); } dbg_clear("QueueC", "] "); } dbg_clear("QueueC", "<- tail\n"); #endif } command queue_t Queue.dequeue() { queue_t t = call Queue.head(); dbg("QueueC", "%s: size is %hhu\n", __FUNCTION__, size); if (!call Queue.empty()) { head++; head %= QUEUE_SIZE; size--; printQueue(); } return t; } command error_t Queue.enqueue(queue_t newVal) { if (call Queue.size() < call Queue.maxSize()) { dbg("QueueC", "%s: size is %hhu\n", __FUNCTION__, size); queue[tail] = newVal; tail++; tail %= QUEUE_SIZE; size++; printQueue(); return SUCCESS; } else { return FAIL; } } command queue_t Queue.element(uint16_t idx) { idx += head; idx %= QUEUE_SIZE; return queue[idx]; } } tinyos-2.1.2+dfsg/tos/system/BitVectorC.nc000066400000000000000000000065721207233610700204520ustar00rootroot00000000000000//$Id: BitVectorC.nc,v 1.6 2010-06-29 22:07:56 scipio Exp $ /* Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Generic bit vector implementation. Note that if you use this bit vector * from interrupt code, you must use appropriate atomic * statements to ensure atomicity. * * @param max_bits Bit vector length. * * @author Cory Sharp */ generic module BitVectorC(uint16_t max_bits) { provides interface Init; provides interface BitVector; } implementation { typedef uint8_t int_type; enum { ELEMENT_SIZE = 8*sizeof(int_type), ARRAY_SIZE = (max_bits + ELEMENT_SIZE-1) / ELEMENT_SIZE, }; int_type m_bits[ ARRAY_SIZE ]; uint16_t getIndex(uint16_t bitnum) { return bitnum / ELEMENT_SIZE; } uint16_t getMask(uint16_t bitnum) { return 1 << (bitnum % ELEMENT_SIZE); } command error_t Init.init() { call BitVector.clearAll(); return SUCCESS; } async command void BitVector.clearAll() { memset(m_bits, 0, sizeof(m_bits)); } async command void BitVector.setAll() { memset(m_bits, 255, sizeof(m_bits)); } async command bool BitVector.get(uint16_t bitnum) { atomic {return (m_bits[getIndex(bitnum)] & getMask(bitnum)) ? TRUE : FALSE;} } async command void BitVector.set(uint16_t bitnum) { atomic {m_bits[getIndex(bitnum)] |= getMask(bitnum);} } async command void BitVector.clear(uint16_t bitnum) { atomic {m_bits[getIndex(bitnum)] &= ~getMask(bitnum);} } async command void BitVector.toggle(uint16_t bitnum) { atomic {m_bits[getIndex(bitnum)] ^= getMask(bitnum);} } async command void BitVector.assign(uint16_t bitnum, bool value) { if(value) call BitVector.set(bitnum); else call BitVector.clear(bitnum); } async command uint16_t BitVector.size() { return max_bits; } } tinyos-2.1.2+dfsg/tos/system/ConstantSensorC.nc000066400000000000000000000041211207233610700215200ustar00rootroot00000000000000/// $Id: ConstantSensorC.nc,v 1.6 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Simple sensor emulator that just outputs a constant value. * * @author Philip Levis * @date Oct 31 2005 */ generic module ConstantSensorC(typedef width_t @integer(), uint32_t val) { provides interface Read; } implementation { task void senseResult() { signal Read.readDone(SUCCESS, val); } command error_t Read.read() { return post senseResult(); } } tinyos-2.1.2+dfsg/tos/system/CrcC.nc000066400000000000000000000054261207233610700172550ustar00rootroot00000000000000/* * * Copyright (c) 2000-2007 The Regents of the University of * California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Wrapper around the CRC-16 primitive to allow computing the CRC * value of a byte array. * * @author Jonathan Hui * @author David Moss */ #include module CrcC { provides interface Crc; } implementation { /** * Compute the CRC-16 value of a byte array. * * @param buf A pointer to the buffer over which to compute CRC. * @param len The length of the buffer over which to compute CRC. * @return The CRC-16 value. */ async command uint16_t Crc.crc16(void *buf, uint8_t len) { return call Crc.seededCrc16(0, buf, len); } /** * Compute a generic CRC-16 using a given seed. Used to compute CRC's * of discontinuous data. * * @param startCrc An initial CRC value to begin with * @param buf A pointer to a buffer of data * @param len The length of the buffer * @return The CRC-16 value. */ async command uint16_t Crc.seededCrc16(uint16_t startCrc, void *buf, uint8_t len) { uint8_t *tmp = (uint8_t *) buf; uint16_t crc; for (crc = startCrc; len > 0; len--) { crc = crcByte(crc, *tmp++); } return crc; } } tinyos-2.1.2+dfsg/tos/system/DirectAMSenderC.nc000066400000000000000000000050671207233610700213400ustar00rootroot00000000000000// $Id: DirectAMSenderC.nc,v 1.2 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2006 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The virtualized active message send abstraction. Each instantiation * of AMSenderC has its own queue of depth one. Therefore, it does not * have to contend with other AMSenderC instantiations for queue space. * The underlying implementation schedules the packets in these queues * using some form of fair-share queueing. * * @author Philip Levis * @date Jan 16 2006 * @see TEP 116: Packet Protocols */ #include "AM.h" generic configuration DirectAMSenderC(am_id_t AMId) { provides { interface AMSend; interface Packet; interface AMPacket; interface PacketAcknowledgements as Acks; } } implementation { components new AMQueueEntryP(AMId) as AMQueueEntryP; components AMQueueP, ActiveMessageC; AMQueueEntryP.Send -> AMQueueP.Send[unique(UQ_AMQUEUE_SEND)]; AMQueueEntryP.AMPacket -> ActiveMessageC; AMSend = AMQueueEntryP; Packet = ActiveMessageC; AMPacket = ActiveMessageC; Acks = ActiveMessageC; } tinyos-2.1.2+dfsg/tos/system/FcfsArbiterC.nc000066400000000000000000000116511207233610700207350ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.7 $ * $Date: 2010-06-29 22:07:56 $ * ======================================================================== */ /** * Please refer to TEP 108 for more information about this component and its * intended use.

        * * This component provides the Resource, ArbiterInfo, and ResourceDefaultOwner * interfaces and uses the ResourceConfigure interface as * described in TEP 108. It provides arbitration to a shared resource in * an FCFS fashion. An array is used to keep track of which users have put * in requests for the resource. Upon the release of the resource by one * of these users, the array is checked and the next user (in FCFS order) * that has a pending request will ge granted control of the resource. If * there are no pending requests, then the resource is granted to the default * user. If a new request is made, the default user will release the resource, * and it will be granted to the requesting cleint. * * @param resourceName -- The name of the Resource being shared * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ generic configuration FcfsArbiterC(char resourceName[]) { provides { interface Resource[uint8_t id]; interface ResourceRequested[uint8_t id]; interface ResourceDefaultOwner; interface ArbiterInfo; } uses interface ResourceConfigure[uint8_t id]; } implementation { components MainC; components new FcfsResourceQueueC(uniqueCount(resourceName)) as Queue; components new ArbiterP(uniqueCount(resourceName)) as Arbiter; MainC.SoftwareInit -> Queue; Resource = Arbiter; ResourceRequested = Arbiter; ResourceDefaultOwner = Arbiter; ArbiterInfo = Arbiter; ResourceConfigure = Arbiter; Arbiter.Queue -> Queue; } tinyos-2.1.2+dfsg/tos/system/FcfsPriorityArbiterC.nc000066400000000000000000000324571207233610700225060ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.6 $ * $Date: 2010-06-29 22:07:56 $ * ======================================================================== */ /** * Please refer to TEP 108 for more information about this component and its * intended use.

        * * This component provides the Resource, ArbiterInfo, and Resource * Controller interfaces and uses the ResourceConfigure interface as * described in TEP 108. An additional ResourceDefaultOwner interface is * provided to allow clients of differing Priorities to control the * Resource according to some policy implemented in an external * component. This component provides arbitration to a shared resource in * an FCFS fashion. An array is used to keep track of which users have put * in requests for the resource. Upon the release of the resource by one * of these users, the array is checked and the next user (in first-come * first-served order) that has a pending request will ge granted control * of the resource. If there are no pending requests, then the resource * becomes idle and any user can put in a request and immediately receive * access to the Resource. * * @param resourceName -- The name of the Resource being shared * * @author Kevin Klues (klues@tkn.tu-berlin.de) * @author Philip Levis * @author Philipp Huppertz */ generic module FcfsPriorityArbiterC(char resourceName[]) { provides { interface Init; interface Resource[uint8_t id]; interface ResourceDefaultOwner as HighPriorityClient; interface ResourceDefaultOwner as LowPriorityClient; interface ArbiterInfo; } uses { interface ResourceConfigure[uint8_t id]; } } implementation { enum {RES_IDLE, RES_GRANTING, RES_BUSY}; enum {NO_RES = 0xFF}; enum {LOW_PRIORITY_CLIENT_ID = uniqueCount(resourceName) + 1}; enum {HIGH_PRIORITY_CLIENT_ID = uniqueCount(resourceName) + 2}; uint8_t state = RES_IDLE; uint8_t resId = NO_RES; uint8_t reqResId = NO_RES; uint8_t resQ[uniqueCount(resourceName)]; uint8_t qHead = NO_RES; uint8_t qTail = NO_RES; bool hpreq = FALSE; // request from the high priority client bool irp = FALSE; // immediate request pending task void grantedTask(); error_t queueRequest(uint8_t id); void grantNextRequest(); bool requested(uint8_t id) { return ( ( resQ[id] != NO_RES ) || ( qTail == id ) ); } /** Initialize the Arbiter to the idle state */ command error_t Init.init() { memset( resQ, NO_RES, sizeof( resQ ) ); return SUCCESS; } /** Request the use of the shared resource If the user has not already requested access to the resource, the request will be either served immediately or queued for later service in an FCFS fashion. A SUCCESS value will be returned and the user will receive the granted() event in synchronous context once it has been given access to the resource. Whenever requests are queued, the highest priority client will receive a requested() event after he receives granted(), notifying him that another user would like to have access to the resource. If the user has already requested access to the resource and is waiting on a pending granted() event, an EBUSY value will be returned to the caller. */ async command error_t Resource.request[uint8_t id]() { atomic { if( state == RES_IDLE ) { state = RES_GRANTING; reqResId = id; post grantedTask(); return SUCCESS; } if (resId == LOW_PRIORITY_CLIENT_ID) { signal LowPriorityClient.requested(); } else if (resId == HIGH_PRIORITY_CLIENT_ID) { signal HighPriorityClient.requested(); } return queueRequest( id ); } } async command error_t LowPriorityClient.request() { atomic { if((state == RES_IDLE) && (!hpreq)) { state = RES_GRANTING; reqResId = LOW_PRIORITY_CLIENT_ID; post grantedTask(); return SUCCESS; } } return EBUSY; } async command error_t HighPriorityClient.request() { atomic { if (resId == LOW_PRIORITY_CLIENT_ID) { signal LowPriorityClient.requested(); } hpreq = TRUE; if( state == RES_IDLE ) { state = RES_GRANTING; reqResId = HIGH_PRIORITY_CLIENT_ID; post grantedTask(); } return SUCCESS; } } /** * Request immediate access to the shared resource. Requests are * not queued, and no granted event is returned. A return value * of SUCCESS signifies that the resource has been granted to you, * while a return value of EBUSY signifies that the resource is * currently being used. */ uint8_t tryImmediateRequest(uint8_t id) { atomic { if( state == RES_IDLE ) { state = RES_BUSY; resId = id; return id; } return resId; } } async command error_t Resource.immediateRequest[uint8_t id]() { uint8_t ownerId = tryImmediateRequest(id); if(ownerId == id) { call ResourceConfigure.configure[id](); return SUCCESS; } else if( ownerId == LOW_PRIORITY_CLIENT_ID ){ atomic { irp = TRUE; //indicate that immediateRequest is pending reqResId = id; //Id to grant resource to if can } signal LowPriorityClient.requested(); atomic { ownerId = resId; //See if I have been granted the resource irp = FALSE; //Indicate that immediate request no longer pending } if(ownerId == id) { call ResourceConfigure.configure[id](); return SUCCESS; } return EBUSY; } else { return EBUSY; } } async command error_t LowPriorityClient.immediateRequest() { return call Resource.immediateRequest[LOW_PRIORITY_CLIENT_ID](); } async command error_t HighPriorityClient.immediateRequest() { return call Resource.immediateRequest[HIGH_PRIORITY_CLIENT_ID](); } /** Release the use of the shared resource The resource will only actually be released if there are no pending requests for the resource. If requests are pending, then the next pending request will be serviced, according to a Fist come first serve arbitration scheme. If no requests are currently pending, then the resource is released, and any users can put in a request for immediate access to the resource. */ async command void Resource.release[uint8_t id]() { uint8_t currentState; atomic { if (state == RES_BUSY && resId == id) { if (irp) resId = reqResId; else grantNextRequest(); call ResourceConfigure.unconfigure[id](); } currentState = state; } if (currentState == RES_IDLE) { signal HighPriorityClient.idle(); signal LowPriorityClient.idle(); } } async command void LowPriorityClient.release() { call Resource.release[LOW_PRIORITY_CLIENT_ID](); } async command void HighPriorityClient.release() { call Resource.release[HIGH_PRIORITY_CLIENT_ID](); } /** Check if the Resource is currently in use */ async command bool ArbiterInfo.inUse() { atomic { if ( state == RES_IDLE ) return FALSE; } return TRUE; } /** Returns the current user of the Resource. If there is no current user, the return value will be 0xFF */ async command uint8_t ArbiterInfo.userId() { atomic return resId; } /** * Returns my user id. */ async command bool Resource.isOwner[uint8_t id]() { atomic { if(resId == id) return TRUE; else return FALSE; } } async command bool LowPriorityClient.isOwner() { return call Resource.isOwner[LOW_PRIORITY_CLIENT_ID](); } async command bool HighPriorityClient.isOwner() { return call Resource.isOwner[HIGH_PRIORITY_CLIENT_ID](); } //Grant a request to the next Pending user //in FCFS order void grantNextRequest() { resId = NO_RES; // do not grant, if highest priority client had the resource before if ( (hpreq) && (resId != HIGH_PRIORITY_CLIENT_ID) ) { atomic { hpreq = FALSE; } reqResId = HIGH_PRIORITY_CLIENT_ID; state = RES_GRANTING; post grantedTask(); } else { if(qHead != NO_RES) { uint8_t id = qHead; qHead = resQ[qHead]; if(qHead == NO_RES) { qTail = NO_RES; } resQ[id] = NO_RES; reqResId = id; state = RES_GRANTING; post grantedTask(); } else { state = RES_IDLE; } } } //Queue the requests so that they can be granted //in FCFS order after release of the resource error_t queueRequest(uint8_t id) { atomic { if( !requested( id ) ) { if(qHead == NO_RES ) { qHead = id; } else { resQ[qTail] = id; } qTail = id; return SUCCESS; } return EBUSY; } } //Task for pulling the Resource.granted() signal //into synchronous context task void grantedTask() { uint8_t tmpId; atomic { tmpId = resId = reqResId; state = RES_BUSY; } if (tmpId == HIGH_PRIORITY_CLIENT_ID) { signal HighPriorityClient.granted(); // lets throw pending request at him... atomic { if (qHead != NO_RES) { signal HighPriorityClient.requested(); } } } else if (tmpId == LOW_PRIORITY_CLIENT_ID) { signal LowPriorityClient.granted(); } else { call ResourceConfigure.configure[tmpId](); signal Resource.granted[tmpId](); } } //Default event/command handlers for all of the other //potential users/providers of the parameterized interfaces //that have not been connected to. default event void Resource.granted[uint8_t id]() { signal LowPriorityClient.granted(); } default event void LowPriorityClient.granted() { } default async event void LowPriorityClient.requested() { } default async event void LowPriorityClient.idle() { } default event void HighPriorityClient.granted() { } default async event void HighPriorityClient.requested() { } default async event void HighPriorityClient.idle() { } default async command void ResourceConfigure.configure[uint8_t id]() { } default async command void ResourceConfigure.unconfigure[uint8_t id]() { } } tinyos-2.1.2+dfsg/tos/system/FcfsResourceQueueC.nc000066400000000000000000000056051207233610700221430ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.7 $ * @date $Date: 2010-06-29 22:07:56 $ */ #include "Resource.h" generic module FcfsResourceQueueC(uint8_t size) @safe() { provides { interface Init; interface ResourceQueue as FcfsQueue; } } implementation { enum {NO_ENTRY = 0xFF}; uint8_t resQ[size]; uint8_t qHead = NO_ENTRY; uint8_t qTail = NO_ENTRY; command error_t Init.init() { memset(resQ, NO_ENTRY, sizeof(resQ)); return SUCCESS; } async command bool FcfsQueue.isEmpty() { atomic return (qHead == NO_ENTRY); } async command bool FcfsQueue.isEnqueued(resource_client_id_t id) { atomic return resQ[id] != NO_ENTRY || qTail == id; } async command resource_client_id_t FcfsQueue.dequeue() { atomic { if(qHead != NO_ENTRY) { uint8_t id = qHead; qHead = resQ[qHead]; if(qHead == NO_ENTRY) qTail = NO_ENTRY; resQ[id] = NO_ENTRY; return id; } return NO_ENTRY; } } async command error_t FcfsQueue.enqueue(resource_client_id_t id) { atomic { if(!(call FcfsQueue.isEnqueued(id))) { if(qHead == NO_ENTRY) qHead = id; else resQ[qTail] = id; qTail = id; return SUCCESS; } return EBUSY; } } } tinyos-2.1.2+dfsg/tos/system/LedC.nc000066400000000000000000000102361207233610700172450ustar00rootroot00000000000000/* Copyright (c) 2009-2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #include "PlatformLed.h" /** * Provide access to the Led components available on this platform. * LEDs are made available positionally (e.g., Led0) and by color * (e.g., Green). * * @author Peter A. Bigot */ configuration LedC { provides { #if 0 < PLATFORM_LED_COUNT interface Led as Led0; #if 1 < PLATFORM_LED_COUNT interface Led as Led1; #if 2 < PLATFORM_LED_COUNT interface Led as Led2; #if 3 < PLATFORM_LED_COUNT interface Led as Led3; #if 4 < PLATFORM_LED_COUNT interface Led as Led4; #if 5 < PLATFORM_LED_COUNT interface Led as Led5; #if 6 < PLATFORM_LED_COUNT interface Led as Led6; #if 7 < PLATFORM_LED_COUNT interface Led as Led7; #endif // count 7 #endif // count 6 #endif // count 5 #endif // count 4 #endif // count 3 #endif // count 2 #endif // count 1 #endif // count 0 #if defined(PLATFORM_LED_GREEN) interface Led as Green; #endif // GREEN #if defined(PLATFORM_LED_RED) interface Led as Red; #endif // RED #if defined(PLATFORM_LED_WHITE) interface Led as White; #endif // WHITE #if defined(PLATFORM_LED_YELLOW) interface Led as Yellow; #endif // YELLOW #if defined(PLATFORM_LED_ORANGE) interface Led as Orange; #endif // ORANGE #if defined(PLATFORM_LED_BLUE) interface Led as Blue; #endif // BLUE interface MultiLed; } } implementation { components PlatformLedC; MultiLed = PlatformLedC; /* Define the positional LEDs */ #if 0 < PLATFORM_LED_COUNT Led0 = PlatformLedC.Led[0]; #if 1 < PLATFORM_LED_COUNT Led1 = PlatformLedC.Led[1]; #if 2 < PLATFORM_LED_COUNT Led2 = PlatformLedC.Led[2]; #if 3 < PLATFORM_LED_COUNT Led3 = PlatformLedC.Led[3]; #if 4 < PLATFORM_LED_COUNT Led4 = PlatformLedC.Led[4]; #if 5 < PLATFORM_LED_COUNT Led5 = PlatformLedC.Led[5]; #if 6 < PLATFORM_LED_COUNT Led6 = PlatformLedC.Led[6]; #if 7 < PLATFORM_LED_COUNT Led7 = PlatformLedC.Led[7]; #endif // count 7 #endif // count 6 #endif // count 5 #endif // count 4 #endif // count 3 #endif // count 2 #endif // count 1 #endif // count 0 /* Define the color-specific LEDs */ #if defined(PLATFORM_LED_GREEN) Green = PlatformLedC.Led[PLATFORM_LED_GREEN]; #endif // GREEN #if defined(PLATFORM_LED_RED) Red = PlatformLedC.Led[PLATFORM_LED_RED]; #endif // RED #if defined(PLATFORM_LED_WHITE) White = PlatformLedC.Led[PLATFORM_LED_WHITE]; #endif // WHITE #if defined(PLATFORM_LED_YELLOW) Yellow = PlatformLedC.Led[PLATFORM_LED_YELLOW]; #endif // YELLOW #if defined(PLATFORM_LED_ORANGE) Orange = PlatformLedC.Led[PLATFORM_LED_ORANGE]; #endif // ORANGE #if defined(PLATFORM_LED_BLUE) Blue = PlatformLedC.Led[PLATFORM_LED_BLUE]; #endif // BLUE } tinyos-2.1.2+dfsg/tos/system/LedsC.nc000066400000000000000000000040701207233610700174270ustar00rootroot00000000000000// $Id: LedsC.nc,v 1.6 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * The basic TinyOS LEDs abstraction. * * @author Phil Buonadonna * @author David Gay * @author Philip Levis * @author Joe Polastre */ configuration LedsC { provides interface Leds; } implementation { components LedsP, PlatformLedsC; Leds = LedsP; LedsP.Init <- PlatformLedsC.Init; LedsP.Led0 -> PlatformLedsC.Led0; LedsP.Led1 -> PlatformLedsC.Led1; LedsP.Led2 -> PlatformLedsC.Led2; } tinyos-2.1.2+dfsg/tos/system/LedsP.nc000066400000000000000000000075431207233610700174540ustar00rootroot00000000000000// $Id: LedsP.nc,v 1.7 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The implementation of the standard 3 LED mote abstraction. * * @author Joe Polastre * @author Philip Levis * * @date March 21, 2005 */ module LedsP @safe() { provides { interface Init; interface Leds; } uses { interface GeneralIO as Led0; interface GeneralIO as Led1; interface GeneralIO as Led2; } } implementation { command error_t Init.init() { atomic { dbg("Init", "LEDS: initialized.\n"); call Led0.makeOutput(); call Led1.makeOutput(); call Led2.makeOutput(); call Led0.set(); call Led1.set(); call Led2.set(); } return SUCCESS; } /* Note: the call is inside the dbg, as it's typically a read of a volatile location, so can't be deadcode eliminated */ #define DBGLED(n) \ dbg("LedsC", "LEDS: Led" #n " %s.\n", call Led ## n .get() ? "off" : "on"); async command void Leds.led0On() { call Led0.clr(); DBGLED(0); } async command void Leds.led0Off() { call Led0.set(); DBGLED(0); } async command void Leds.led0Toggle() { call Led0.toggle(); DBGLED(0); } async command void Leds.led1On() { call Led1.clr(); DBGLED(1); } async command void Leds.led1Off() { call Led1.set(); DBGLED(1); } async command void Leds.led1Toggle() { call Led1.toggle(); DBGLED(1); } async command void Leds.led2On() { call Led2.clr(); DBGLED(2); } async command void Leds.led2Off() { call Led2.set(); DBGLED(2); } async command void Leds.led2Toggle() { call Led2.toggle(); DBGLED(2); } async command uint8_t Leds.get() { uint8_t rval; atomic { rval = 0; if (!call Led0.get()) { rval |= LEDS_LED0; } if (!call Led1.get()) { rval |= LEDS_LED1; } if (!call Led2.get()) { rval |= LEDS_LED2; } } return rval; } async command void Leds.set(uint8_t val) { atomic { if (val & LEDS_LED0) { call Leds.led0On(); } else { call Leds.led0Off(); } if (val & LEDS_LED1) { call Leds.led1On(); } else { call Leds.led1Off(); } if (val & LEDS_LED2) { call Leds.led2On(); } else { call Leds.led2Off(); } } } } tinyos-2.1.2+dfsg/tos/system/LocalTimeMilliC.nc000066400000000000000000000012701207233610700213770ustar00rootroot00000000000000/* $Id: LocalTimeMilliC.nc,v 1.1 2007-05-23 21:58:08 idgay Exp $ * Copyright (c) 2007 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * */ /** * Provide current time via the LocalTime interface. * * @author David Gay */ #include "Timer.h" configuration LocalTimeMilliC { provides interface LocalTime; } implementation { components HilTimerMilliC, TimerMilliP; LocalTime = HilTimerMilliC; } tinyos-2.1.2+dfsg/tos/system/LplAMSenderC.nc000066400000000000000000000011601207233610700206430ustar00rootroot00000000000000#include "AM.h" generic configuration LplAMSenderC(am_id_t AMId) { provides { interface AMSend; interface Packet; interface AMPacket; interface PacketAcknowledgements as Acks; } } implementation { components new DirectAMSenderC(AMId); components new LplAMSenderP(); components ActiveMessageC; components SystemLowPowerListeningC; AMSend = LplAMSenderP; Packet = DirectAMSenderC; AMPacket = DirectAMSenderC; Acks = DirectAMSenderC; LplAMSenderP.SubAMSend -> DirectAMSenderC; LplAMSenderP.Lpl -> ActiveMessageC; LplAMSenderP.SystemLowPowerListening -> SystemLowPowerListeningC; } tinyos-2.1.2+dfsg/tos/system/LplAMSenderP.nc000066400000000000000000000015071207233610700206650ustar00rootroot00000000000000generic module LplAMSenderP() { provides interface AMSend; uses { interface AMSend as SubAMSend; interface LowPowerListening as Lpl; interface SystemLowPowerListening; } } implementation { command error_t AMSend.send(am_addr_t addr, message_t* msg, uint8_t len) { call Lpl.setRemoteWakeupInterval(msg, call SystemLowPowerListening.getDefaultRemoteWakeupInterval()); return call SubAMSend.send(addr, msg, len); } event void SubAMSend.sendDone(message_t* msg, error_t error) { signal AMSend.sendDone(msg, error); } command error_t AMSend.cancel(message_t* msg) { return call SubAMSend.cancel(msg); } command uint8_t AMSend.maxPayloadLength() { return call SubAMSend.maxPayloadLength(); } command void* AMSend.getPayload(message_t* msg, uint8_t len) { return call SubAMSend.getPayload(msg, len); } } tinyos-2.1.2+dfsg/tos/system/LruIntCacheC.nc000066400000000000000000000037431207233610700207070ustar00rootroot00000000000000/* * Copyright (c) 2006 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * An LRU cache of integers, where insertion represents use. * * @author Rodrigo Fonseca */ generic configuration LruIntCacheC(typedef cache_key_t@integer(), uint8_t CACHE_SIZE) { provides interface Cache; } implementation { components MainC, new LruIntCacheP(cache_key_t, CACHE_SIZE) as CacheP; Cache = CacheP; MainC.SoftwareInit -> CacheP; } tinyos-2.1.2+dfsg/tos/system/LruIntCacheP.nc000066400000000000000000000076531207233610700207300ustar00rootroot00000000000000/* * Copyright (c) 2006 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * An LRU cache that stores integer values, where an insert operation * indicates "use". Inserting an element not in the cache will replace * the oldest, and inserting an element already in the cache will refresh * its age. * * @author Rodrigo Fonseca * @author Philip Levis */ generic module LruIntCacheP(typedef cache_key_t @integer(), uint8_t size) { provides { interface Init; interface Cache; } } implementation { cache_key_t cache[size]; uint8_t first; uint8_t count; command error_t Init.init() { first = 0; count = 0; return SUCCESS; } void printCache() { #ifdef TOSSIM int i; dbg("Cache","Cache:"); for (i = 0; i < count; i++) { dbg_clear("Cache", " %08x", cache[i]); if (i == first) dbg_clear("Cache","*"); } dbg_clear("Cache","\n"); #endif } /* if key is in cache returns the index (offset by first), otherwise returns count */ uint8_t lookup(cache_key_t key) { uint8_t i; cache_key_t k; for (i = 0; i < count; i++) { k = cache[(i + first) % size]; if (k == key) break; } return i; } /* remove the entry with index i (relative to first) */ void remove(uint8_t i) { uint8_t j; if (i >= count) return; if (i == 0) { //shift all by moving first first = (first + 1) % size; } else { //shift everyone down for (j = i; j < count; j++) { cache[(j + first) % size] = cache[(j + first + 1) % size]; } } count--; } command void Cache.insert(cache_key_t key) { uint8_t i; if (count == size ) { //remove someone. If item not in //cache, remove the first item. //otherwise remove the item temporarily for //reinsertion. This moves the item up in the //LRU stack. i = lookup(key); remove(i % count); } //now count < size cache[(first + count) % size] = key; count++; } command bool Cache.lookup(cache_key_t key) { return (lookup(key) < count); } command void Cache.flush() { call Init.init(); } } tinyos-2.1.2+dfsg/tos/system/MainC.nc000066400000000000000000000054721207233610700174330ustar00rootroot00000000000000// $Id: MainC.nc,v 1.7 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. * * Date last modified: $Id: MainC.nc,v 1.7 2010-06-29 22:07:56 scipio Exp $ */ /** * MainC is the system interface the TinyOS boot sequence. It wires the * boot sequence implementation to the scheduler and hardware resources. * * @author Philip Levis * @date August 6 2005 * @see TEP 107: Boot Sequence */ #include "hardware.h" configuration MainC { provides interface Boot; uses interface Init as SoftwareInit; } implementation { components PlatformC, RealMainP, TinySchedulerC; #ifdef SAFE_TINYOS components SafeFailureHandlerC; #endif RealMainP.Scheduler -> TinySchedulerC; RealMainP.PlatformInit -> PlatformC; // Export the SoftwareInit and Booted for applications SoftwareInit = RealMainP.SoftwareInit; Boot = RealMainP; } tinyos-2.1.2+dfsg/tos/system/MultiplexedReadC.nc000066400000000000000000000027221207233610700216320ustar00rootroot00000000000000/* $Id: MultiplexedReadC.nc,v 1.1 2007-02-08 17:49:05 idgay Exp $ * Copyright (c) 2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Multiplex access to a single Read interface for a parameterised * Read interface whose access is controlled by an arbiter. * * @param width_t Width of the underlying Read interface. * * @author David Gay */ generic module MultiplexedReadC(typedef width_t) { provides interface Read[uint8_t client]; uses { interface Read as Service; interface Resource[uint8_t client]; } } implementation { command error_t Read.read[uint8_t client]() { return call Resource.request[client](); } event void Resource.granted[uint8_t client]() { call Service.read(); } event void Service.readDone(error_t result, width_t data) { uint8_t client = call ArbiterInfo.userId(); call Resource.release[client](); signal Read.readDone[client](result, data); } default async command error_t Resource.request[uint8_t client]() { return FAIL; } default async command error_t Resource.release[uint8_t client]() { return FAIL; } default event void Read.readDone[uint8_t client](error_t result, width_t data) { } } tinyos-2.1.2+dfsg/tos/system/NoArbiterC.nc000066400000000000000000000025031207233610700204240ustar00rootroot00000000000000/* * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * A do-nothing arbiter for non-shared resources which need to pretend to * have arbitration. Just grants all requests, without any error * checking. Does still call ResourceConfigure at the right time. * * @author David Gay * @author Kevin Klues */ generic module NoArbiterC() { provides interface Resource; uses interface ResourceConfigure; } implementation { task void granted() { call ResourceConfigure.configure(); signal Resource.granted(); } async command error_t Resource.request() { post granted(); return SUCCESS; } async command error_t Resource.immediateRequest() { call ResourceConfigure.configure(); return SUCCESS; } async command error_t Resource.release() { call ResourceConfigure.unconfigure(); return SUCCESS; } async command bool Resource.isOwner() { return TRUE; } default async command void ResourceConfigure.configure() { } default async command void ResourceConfigure.unconfigure() { } } tinyos-2.1.2+dfsg/tos/system/NoInitC.nc000066400000000000000000000013461207233610700177430ustar00rootroot00000000000000/* $Id: NoInitC.nc,v 1.5 2008-06-26 04:39:15 regehr Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * A do-nothing Init implementation. Useful for implementing components whose * specification has an Init, but whose implementation doesn't need one. * * @author David Gay */ module NoInitC @safe() { provides interface Init; } implementation { command error_t Init.init() { return SUCCESS; } } tinyos-2.1.2+dfsg/tos/system/NoLedsC.nc000066400000000000000000000050261207233610700177260ustar00rootroot00000000000000// $Id: NoLedsC.nc,v 1.7 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A null operation replacement for the LedsC component. As many * components might concurrently signal information through LEDs, * using LedsC and NoLedsC allows an application builder to select * which components control the LEDs. * * @author Philip Levis * @date March 19, 2005 */ module NoLedsC { provides interface Init; provides interface Leds; } implementation { command error_t Init.init() {return SUCCESS;} async command void Leds.led0On() {} async command void Leds.led0Off() {} async command void Leds.led0Toggle() {} async command void Leds.led1On() {} async command void Leds.led1Off() {} async command void Leds.led1Toggle() {} async command void Leds.led2On() {} async command void Leds.led2Off() {} async command void Leds.led2Toggle() {} async command uint8_t Leds.get() {return 0;} async command void Leds.set(uint8_t val) {} } tinyos-2.1.2+dfsg/tos/system/NoPinC.nc000066400000000000000000000016111207233610700175610ustar00rootroot00000000000000/* $Id: NoPinC.nc,v 1.4 2006-12-12 18:23:47 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * Dummy pin component. * * @author David Gay */ generic module NoPinC() { provides interface GeneralIO; } implementation { async command bool GeneralIO.get() { return 0; } async command void GeneralIO.set() { } async command void GeneralIO.clr() { } async command void GeneralIO.toggle() { } async command void GeneralIO.makeInput() { } async command void GeneralIO.makeOutput() { } async command bool GeneralIO.isInput() { } async command bool GeneralIO.isOutput() { } } tinyos-2.1.2+dfsg/tos/system/PoolC.nc000066400000000000000000000037541207233610700174610ustar00rootroot00000000000000/* $Id: PoolC.nc,v 1.4 2006-12-12 18:23:47 vlahan Exp $ */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A general dynamic memory pool component. * * @author Philip Levis * @author Geoffrey Mainland * @date $Date: 2006-12-12 18:23:47 $ */ generic configuration PoolC(typedef pool_t, uint8_t POOL_SIZE) { provides interface Pool; } implementation { components MainC, new PoolP(pool_t, POOL_SIZE); MainC.SoftwareInit -> PoolP; Pool = PoolP; } tinyos-2.1.2+dfsg/tos/system/PoolP.nc000066400000000000000000000073301207233610700174700ustar00rootroot00000000000000/* $Id: PoolP.nc,v 1.7 2010-01-20 19:59:07 scipio Exp $ */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Implementation of a general dynamic memory pool component. * Note that the allocation/deallocation policies are * different than traditional dynamic allocators such as * malloc or slab allocators. When initialized, the Pool * contains size items of type pool_t. * These elements can be removed from the pool for use with * Pool.get, and new elements can be placed in * the pool with Pool.put. The pool allows * components to put elements besides those which * were obtained with get. The pool can never have * more than size elements in it. * * @author Philip Levis * @author Kyle Jamieson * @author Geoffrey Mainland * @date $Date: 2010-01-20 19:59:07 $ */ generic module PoolP(typedef pool_t, uint8_t size) { provides { interface Init; interface Pool; } } implementation { uint8_t free; uint8_t index; pool_t* ONE_NOK queue[size]; pool_t pool[size]; command error_t Init.init() { int i; for (i = 0; i < size; i++) { queue[i] = &pool[i]; } free = size; index = 0; return SUCCESS; } command bool Pool.empty() { dbg("PoolP", "%s size is %i\n", __FUNCTION__, (int)free); return free == 0; } command uint8_t Pool.size() { dbg("PoolP", "%s size is %i\n", __FUNCTION__, (int)free); return free; } command uint8_t Pool.maxSize() { return size; } command pool_t* Pool.get() { if (free) { pool_t* rval = queue[index]; queue[index] = NULL; free--; index++; if (index == size) { index = 0; } dbg("PoolP", "%s size is %i\n", __FUNCTION__, (int)free); return rval; } return NULL; } command error_t Pool.put(pool_t* newVal) { if (free >= size) { return FAIL; } else { uint16_t emptyIndex = (index + free); if (emptyIndex >= size) { emptyIndex -= size; } queue[emptyIndex] = newVal; free++; dbg("PoolP", "%s size is %i\n", __FUNCTION__, (int)free); return SUCCESS; } } } tinyos-2.1.2+dfsg/tos/system/QueueC.nc000066400000000000000000000066111207233610700176270ustar00rootroot00000000000000/* $Id: QueueC.nc,v 1.7 2009-06-25 18:37:24 scipio Exp $ */ /* * Copyright (c) 2006 Stanford University. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Stanford University nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * A general FIFO queue component, whose queue has a bounded size. * * @author Philip Levis * @author Geoffrey Mainland * @date $Date: 2009-06-25 18:37:24 $ */ generic module QueueC(typedef queue_t, uint8_t QUEUE_SIZE) { provides interface Queue; } implementation { queue_t ONE_NOK queue[QUEUE_SIZE]; uint8_t head = 0; uint8_t tail = 0; uint8_t size = 0; command bool Queue.empty() { return size == 0; } command uint8_t Queue.size() { return size; } command uint8_t Queue.maxSize() { return QUEUE_SIZE; } command queue_t Queue.head() { return queue[head]; } void printQueue() { #ifdef TOSSIM int i, j; dbg("QueueC", "head <-"); for (i = head; i < head + size; i++) { dbg_clear("QueueC", "["); for (j = 0; j < sizeof(queue_t); j++) { uint8_t v = ((uint8_t*)&queue[i % QUEUE_SIZE])[j]; dbg_clear("QueueC", "%0.2hhx", v); } dbg_clear("QueueC", "] "); } dbg_clear("QueueC", "<- tail\n"); #endif } command queue_t Queue.dequeue() { queue_t t = call Queue.head(); dbg("QueueC", "%s: size is %hhu\n", __FUNCTION__, size); if (!call Queue.empty()) { head++; if (head == QUEUE_SIZE) head = 0; size--; printQueue(); } return t; } command error_t Queue.enqueue(queue_t newVal) { if (call Queue.size() < call Queue.maxSize()) { dbg("QueueC", "%s: size is %hhu\n", __FUNCTION__, size); queue[tail] = newVal; tail++; if (tail == QUEUE_SIZE) tail = 0; size++; printQueue(); return SUCCESS; } else { return FAIL; } } command queue_t Queue.element(uint8_t idx) { idx += head; if (idx >= QUEUE_SIZE) { idx -= QUEUE_SIZE; } return queue[idx]; } } tinyos-2.1.2+dfsg/tos/system/RandomC.nc000066400000000000000000000042111207233610700177550ustar00rootroot00000000000000/* * Copyright (c) 2002-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The standard TinyOS random number generator. If your system requires a * specific random number generator, it should wire to that component * directly. * * @author Barbara Hohlt * @author Phil Levis * @date March 1 2005 */ configuration RandomC { provides interface Init; provides interface ParameterInit as SeedInit; provides interface Random; } implementation { components RandomMlcgC, MainC; MainC.SoftwareInit -> RandomMlcgC; Init = RandomMlcgC; SeedInit = RandomMlcgC; Random = RandomMlcgC; } tinyos-2.1.2+dfsg/tos/system/RandomLfsrC.nc000066400000000000000000000064271207233610700206170ustar00rootroot00000000000000// $Id: RandomLfsrC.nc,v 1.5 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Alec Woo, David Gay, Philip Levis * Date last modified: 8/8/05 * */ /** * This is a 16 bit Linear Feedback Shift Register pseudo random number generator. It is faster than the MLCG generator, but the numbers generated * have less randomness. * * @author Alec Woo * @author David Gay * @author Philip Levis * @date August 8 2005 */ module RandomLfsrC { provides interface Init; provides interface Random; } implementation { uint16_t shiftReg; uint16_t initSeed; uint16_t mask; /* Initialize the seed from the ID of the node */ command error_t Init.init() { atomic { shiftReg = 119 * 119 * (TOS_NODE_ID + 1); initSeed = shiftReg; mask = 137 * 29 * (TOS_NODE_ID + 1); } return SUCCESS; } /* Return the next 16 bit random number */ async command uint16_t Random.rand16() { bool endbit; uint16_t tmpShiftReg; atomic { tmpShiftReg = shiftReg; endbit = ((tmpShiftReg & 0x8000) != 0); tmpShiftReg <<= 1; if (endbit) tmpShiftReg ^= 0x100b; tmpShiftReg++; shiftReg = tmpShiftReg; tmpShiftReg = tmpShiftReg ^ mask; } return tmpShiftReg; } async command uint32_t Random.rand32() { return (uint32_t)call Random.rand16() << 16 | call Random.rand16(); } } tinyos-2.1.2+dfsg/tos/system/RandomMlcgC.nc000066400000000000000000000060501207233610700205630ustar00rootroot00000000000000/* * Copyright (c) 2002-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** This code is a fast implementation of the Park-Miller Minimal Standard * Generator for pseudo-random numbers. It uses the 32 bit multiplicative * linear congruential generator, * * S' = (A x S) mod (2^31 - 1) * * for A = 16807. * * * @author Barbara Hohlt * @date March 1 2005 */ module RandomMlcgC @safe() { provides interface Init; provides interface ParameterInit as SeedInit; provides interface Random; } implementation { uint32_t seed ; /* Initialize the seed from the ID of the node */ command error_t Init.init() { atomic seed = (uint32_t)(TOS_NODE_ID + 1); return SUCCESS; } /* Initialize with 16-bit seed */ command error_t SeedInit.init(uint16_t s) { atomic seed = (uint32_t)(s + 1); return SUCCESS; } /* Return the next 32 bit random number */ async command uint32_t Random.rand32() { uint32_t mlcg,p,q; uint64_t tmpseed; atomic { tmpseed = (uint64_t)33614U * (uint64_t)seed; q = tmpseed; /* low */ q = q >> 1; p = tmpseed >> 32 ; /* hi */ mlcg = p + q; if (mlcg & 0x80000000) { mlcg = mlcg & 0x7FFFFFFF; mlcg++; } seed = mlcg; } return mlcg; } /* Return low 16 bits of next 32 bit random number */ async command uint16_t Random.rand16() { return (uint16_t)call Random.rand32(); } #if 0 /* Return high 16 bits of 32 bit number */ inline uint16_t getHigh16(uint32_t num) { return num >> 16; } #endif } tinyos-2.1.2+dfsg/tos/system/ReadClientP.nc000066400000000000000000000037721207233610700205770ustar00rootroot00000000000000/* * Copyright (c) 2011, University of Szeged * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * - Neither the name of University of Szeged nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Andras Biro */ generic module ReadClientP(typedef type){ provides interface Read[uint8_t client]; uses interface Read as ActualRead; } implementation{ uint8_t client; command error_t Read.read[uint8_t cl](){ client=cl; return call ActualRead.read(); } event void ActualRead.readDone(error_t result, type value) { signal Read.readDone[client](result, value); } default event void Read.readDone[uint8_t cl](error_t result, type value){} } tinyos-2.1.2+dfsg/tos/system/RealMainP.nc000066400000000000000000000076201207233610700202510ustar00rootroot00000000000000// $Id: RealMainP.nc,v 1.9 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * * Authors: Philip Levis * Date last modified: $Id: RealMainP.nc,v 1.9 2010-06-29 22:07:56 scipio Exp $ * */ /** * RealMain implements the TinyOS boot sequence, as documented in TEP 107. * * @author Philip Levis * @date January 17 2005 */ module RealMainP @safe() { provides interface Boot; uses interface Scheduler; uses interface Init as PlatformInit; uses interface Init as SoftwareInit; } implementation { int main() @C() @spontaneous() { atomic { /* First, initialize the Scheduler so components can post tasks. Initialize all of the very hardware specific stuff, such as CPU settings, counters, etc. After the hardware is ready, initialize the requisite software components and start execution.*/ platform_bootstrap(); call Scheduler.init(); /* Initialize the platform. Then spin on the Scheduler, passing * FALSE so it will not put the system to sleep if there are no * more tasks; if no tasks remain, continue on to software * initialization */ call PlatformInit.init(); while (call Scheduler.runNextTask()); /* Initialize software components.Then spin on the Scheduler, * passing FALSE so it will not put the system to sleep if there * are no more tasks; if no tasks remain, the system has booted * successfully.*/ call SoftwareInit.init(); while (call Scheduler.runNextTask()); } /* Enable interrupts now that system is ready. */ __nesc_enable_interrupt(); signal Boot.booted(); /* Spin in the Scheduler */ call Scheduler.taskLoop(); /* We should never reach this point, but some versions of * gcc don't realize that and issue a warning if we return * void from a non-void function. So include this. */ return -1; } default command error_t PlatformInit.init() { return SUCCESS; } default command error_t SoftwareInit.init() { return SUCCESS; } default event void Boot.booted() { } } tinyos-2.1.2+dfsg/tos/system/RoundRobinArbiterC.nc000066400000000000000000000117031207233610700221330ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * - Revision ------------------------------------------------------------- * $Revision: 1.7 $ * $Date: 2010-06-29 22:07:56 $ * ======================================================================== */ /** * Please refer to TEP 108 for more information about this component and its * intended use.

        * * This component provides the Resource, ArbiterInfo, and ResourceDefaultOwner * interfaces and uses the ResourceConfigure interface as * described in TEP 108. It provides arbitration to a shared resource in * a Round Robin fashion. An array is used to keep track of which users have * put in requests for the resource. Upon the release of the resource by one * of these users, the array is checked and the next user (in Round Robin order) * that has a pending request will ge granted control of the resource. If * there are no pending requests, then the resource is granted to the default * user. If a new request is made, the default user will release the resource, * and it will be granted to the requesting cleint. * * @param resourceName -- The name of the Resource being shared * * @author Kevin Klues (klues@tkn.tu-berlin.de) */ generic configuration RoundRobinArbiterC(char resourceName[]) { provides { interface Resource[uint8_t id]; interface ResourceRequested[uint8_t id]; interface ResourceDefaultOwner; interface ArbiterInfo; } uses interface ResourceConfigure[uint8_t id]; } implementation { components MainC; components new RoundRobinResourceQueueC(uniqueCount(resourceName)) as Queue; components new ArbiterP(uniqueCount(resourceName)) as Arbiter; MainC.SoftwareInit -> Queue; Resource = Arbiter; ResourceRequested = Arbiter; ResourceDefaultOwner = Arbiter; ArbiterInfo = Arbiter; ResourceConfigure = Arbiter; Arbiter.Queue -> Queue; } tinyos-2.1.2+dfsg/tos/system/RoundRobinResourceQueueC.nc000066400000000000000000000060751207233610700233450ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * @author Kevin Klues (klueska@cs.wustl.edu) * @version $Revision: 1.7 $ * @date $Date: 2010-06-29 22:07:56 $ */ #include "Resource.h" generic module RoundRobinResourceQueueC(uint8_t size) @safe() { provides { interface Init; interface ResourceQueue as RoundRobinQueue; } } implementation { enum { NO_ENTRY = 0xFF, SIZE = size ? (size - 1) / 8 + 1 : 0 }; uint8_t resQ[SIZE]; uint8_t last = 0; void clearEntry(uint8_t id) { resQ[id / 8] &= ~(1 << (id % 8)); } command error_t Init.init() { memset(resQ, 0, sizeof(resQ)); return SUCCESS; } async command bool RoundRobinQueue.isEmpty() { int i; atomic { for (i = 0; i 0) return FALSE; return TRUE; } } async command bool RoundRobinQueue.isEnqueued(resource_client_id_t id) { return resQ[id / 8] & (1 << (id % 8)); } async command resource_client_id_t RoundRobinQueue.dequeue() { int i; atomic { for (i = last+1; ; i++) { if(i == size) i = 0; if (call RoundRobinQueue.isEnqueued(i)) { clearEntry(i); last = i; return i; } if (i == last) break; } return NO_ENTRY; } } async command error_t RoundRobinQueue.enqueue(resource_client_id_t id) { atomic { if (!(call RoundRobinQueue.isEnqueued(id))) { resQ[id / 8] |= 1 << (id % 8); return SUCCESS; } return EBUSY; } } } tinyos-2.1.2+dfsg/tos/system/SchedulerBasicP.nc000066400000000000000000000106331207233610700214370ustar00rootroot00000000000000// $Id: SchedulerBasicP.nc,v 1.11 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * SchedulerBasicP implements the default TinyOS scheduler sequence, as * documented in TEP 106. * * @author Philip Levis * @author Cory Sharp * @date January 19 2005 */ #include "hardware.h" module SchedulerBasicP @safe() { provides interface Scheduler; provides interface TaskBasic[uint8_t id]; uses interface McuSleep; } implementation { enum { NUM_TASKS = uniqueCount("TinySchedulerC.TaskBasic"), NO_TASK = 255, }; uint8_t m_head; uint8_t m_tail; uint8_t m_next[NUM_TASKS]; // Helper functions (internal functions) intentionally do not have atomic // sections. It is left as the duty of the exported interface functions to // manage atomicity to minimize chances for binary code bloat. // move the head forward // if the head is at the end, mark the tail at the end, too // mark the task as not in the queue inline uint8_t popTask() { if( m_head != NO_TASK ) { uint8_t id = m_head; m_head = m_next[m_head]; if( m_head == NO_TASK ) { m_tail = NO_TASK; } m_next[id] = NO_TASK; return id; } else { return NO_TASK; } } bool isWaiting( uint8_t id ) { return (m_next[id] != NO_TASK) || (m_tail == id); } bool pushTask( uint8_t id ) { if( !isWaiting(id) ) { if( m_head == NO_TASK ) { m_head = id; m_tail = id; } else { m_next[m_tail] = id; m_tail = id; } return TRUE; } else { return FALSE; } } command void Scheduler.init() { atomic { memset( (void *)m_next, NO_TASK, sizeof(m_next) ); m_head = NO_TASK; m_tail = NO_TASK; } } command bool Scheduler.runNextTask() { uint8_t nextTask; atomic { nextTask = popTask(); if( nextTask == NO_TASK ) { return FALSE; } } signal TaskBasic.runTask[nextTask](); return TRUE; } command void Scheduler.taskLoop() { for (;;) { uint8_t nextTask; atomic { while ((nextTask = popTask()) == NO_TASK) { call McuSleep.sleep(); } } signal TaskBasic.runTask[nextTask](); } } /** * Return SUCCESS if the post succeeded, EBUSY if it was already posted. */ async command error_t TaskBasic.postTask[uint8_t id]() { atomic { return pushTask(id) ? SUCCESS : EBUSY; } } default event void TaskBasic.runTask[uint8_t id]() { } } tinyos-2.1.2+dfsg/tos/system/SimpleArbiterP.nc000066400000000000000000000124611207233610700213220ustar00rootroot00000000000000/* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Please refer to TEP 108 for more information about this component and its * intended use.

        * * This component provides the Resource, ArbiterInfo, and ResourceRequested * interfaces and uses the ResourceConfigure interface as * described in TEP 108. It provides arbitration to a shared resource. * An queue is used to keep track of which users have put * in requests for the resource. Upon the release of the resource by one * of these users, the queue is checked and the next user * that has a pending request will ge granted control of the resource. If * there are no pending requests, then the resource becomes idle and any * user can put in a request and immediately receive access to the * Resource. * * @author Kevin Klues (klues@tkn.tu-berlin.de) * @author Philip Levis */ generic module SimpleArbiterP() @safe() { provides { interface Resource[uint8_t id]; interface ResourceRequested[uint8_t id]; interface ArbiterInfo; } uses { interface ResourceConfigure[uint8_t id]; interface ResourceQueue as Queue; } } implementation { enum {RES_IDLE = 0, RES_GRANTING = 1, RES_BUSY = 2}; enum {NO_RES = 0xFF}; uint8_t state = RES_IDLE; norace uint8_t resId = NO_RES; norace uint8_t reqResId; task void grantedTask(); async command error_t Resource.request[uint8_t id]() { signal ResourceRequested.requested[resId](); atomic { if(state == RES_IDLE) { state = RES_GRANTING; reqResId = id; post grantedTask(); return SUCCESS; } return call Queue.enqueue(id); } } async command error_t Resource.immediateRequest[uint8_t id]() { signal ResourceRequested.immediateRequested[resId](); atomic { if(state == RES_IDLE) { state = RES_BUSY; resId = id; call ResourceConfigure.configure[resId](); return SUCCESS; } return FAIL; } } async command error_t Resource.release[uint8_t id]() { bool released = FALSE; atomic { if(state == RES_BUSY && resId == id) { if(call Queue.isEmpty() == FALSE) { resId = NO_RES; reqResId = call Queue.dequeue(); state = RES_GRANTING; post grantedTask(); } else { resId = NO_RES; state = RES_IDLE; } released = TRUE; } } if(released == TRUE) { call ResourceConfigure.unconfigure[id](); return SUCCESS; } return FAIL; } /** Check if the Resource is currently in use */ async command bool ArbiterInfo.inUse() { atomic { if (state == RES_IDLE) return FALSE; } return TRUE; } /** Returns the current user of the Resource. If there is no current user, the return value will be 0xFF */ async command uint8_t ArbiterInfo.userId() { atomic { if(state != RES_BUSY) return NO_RES; return resId; } } /** * Returns whether you are the current owner of the resource or not */ async command bool Resource.isOwner[uint8_t id]() { atomic { if(resId == id && state == RES_BUSY) return TRUE; else return FALSE; } } task void grantedTask() { atomic { resId = reqResId; state = RES_BUSY; } call ResourceConfigure.configure[resId](); signal Resource.granted[resId](); } //Default event/command handlers default event void Resource.granted[uint8_t id]() { } default async event void ResourceRequested.requested[uint8_t id]() { } default async event void ResourceRequested.immediateRequested[uint8_t id]() { } default async command void ResourceConfigure.configure[uint8_t id]() { } default async command void ResourceConfigure.unconfigure[uint8_t id]() { } } tinyos-2.1.2+dfsg/tos/system/SimpleFcfsArbiterC.nc000066400000000000000000000111341207233610700221030ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Please refer to TEP 108 for more information about this component and its * intended use.

        * * This component provides the Resource, ArbiterInfo, and Resource * Controller interfaces and uses the ResourceConfigure interface as * described in TEP 108. It provides arbitration to a shared resource in * an FCFS fashion. An array is used to keep track of which users have put * in requests for the resource. Upon the release of the resource by one * of these users, the array is checked and the next user (in FCFS order) * that has a pending request will ge granted control of the resource. If * there are no pending requests, then the resource becomes idle and any * user can put in a request and immediately receive access to the * Resource. * * @param resourceName -- The name of the Resource being shared * * @author Kevin Klues (klues@tkn.tu-berlin.de) * @author Philip Levis */ generic configuration SimpleFcfsArbiterC(char resourceName[]) { provides { interface Resource[uint8_t id]; interface ResourceRequested[uint8_t id]; interface ArbiterInfo; } uses interface ResourceConfigure[uint8_t id]; } implementation { components MainC; components new FcfsResourceQueueC(uniqueCount(resourceName)) as Queue; components new SimpleArbiterP() as Arbiter; MainC.SoftwareInit -> Queue; Resource = Arbiter; ResourceRequested = Arbiter; ArbiterInfo = Arbiter; ResourceConfigure = Arbiter; Arbiter.Queue -> Queue; } tinyos-2.1.2+dfsg/tos/system/SimpleRoundRobinArbiterC.nc000066400000000000000000000111501207233610700233010ustar00rootroot00000000000000/* * Copyright (c) 2005 Washington University in St. Louis. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Copyright (c) 2004, Technische Universitat Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Please refer to TEP 108 for more information about this component and its * intended use.

        * * This component provides the Resource, ArbiterInfo, and Resource * Controller interfaces and uses the ResourceConfigure interface as * described in TEP 108. It provides arbitration to a shared resource in * an FCFS fashion. An array is used to keep track of which users have put * in requests for the resource. Upon the release of the resource by one * of these users, the array is checked and the next user (in FCFS order) * that has a pending request will ge granted control of the resource. If * there are no pending requests, then the resource becomes idle and any * user can put in a request and immediately receive access to the * Resource. * * @param resourceName -- The name of the Resource being shared * * @author Kevin Klues (klues@tkn.tu-berlin.de) * @author Philip Levis */ generic configuration SimpleRoundRobinArbiterC(char resourceName[]) { provides { interface Resource[uint8_t id]; interface ResourceRequested[uint8_t id]; interface ArbiterInfo; } uses interface ResourceConfigure[uint8_t id]; } implementation { components MainC; components new RoundRobinResourceQueueC(uniqueCount(resourceName)) as Queue; components new SimpleArbiterP() as Arbiter; MainC.SoftwareInit -> Queue; Resource = Arbiter; ResourceRequested = Arbiter; ArbiterInfo = Arbiter; ResourceConfigure = Arbiter; Arbiter.Queue -> Queue; } tinyos-2.1.2+dfsg/tos/system/SineSensorC.nc000066400000000000000000000021531207233610700206300ustar00rootroot00000000000000/* $Id: SineSensorC.nc,v 1.4 2006-12-12 18:23:47 vlahan Exp $ * Copyright (c) 2006 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * The micaZ doesn't have any built-in sensors - the DemoSensor returns * a constant value of 0xbeef, or just reads the ground value for the * stream sensor. * * @author Philip Levis * @authod David Gay */ generic module SineSensorC() { provides interface Init; provides interface Read; } implementation { uint32_t counter; command error_t Init.init() { counter = TOS_NODE_ID * 40; return SUCCESS; } task void readTask() { float val = (float)counter; val = val / 20.0; val = sin(val) * 32768.0; val += 32768.0; counter++; signal Read.readDone(SUCCESS, (uint16_t)val); } command error_t Read.read() { post readTask(); return SUCCESS; } } tinyos-2.1.2+dfsg/tos/system/StateC.nc000066400000000000000000000055511207233610700176250ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * This is a state controller for any and every component's * state machine(s). * * There are several compelling reasons to use the State module/interface * in all your components that have any kind of state associated with them: * * 1) It provides a unified interface to control any state, which makes * it easy for everyone to understand your code * 2) You can easily keep track of multiple state machines in one component * 3) You could have one state machine control several components * * There are three ways to change a component's state: * > Request a state change * The state is only changed if the state is currently in S_IDLE. If * the state changes and access is grated, requestState returns SUCCESS. * * > Force a state change * The state changes no matter what * * > toIdle() * The state changes to S_IDLE, no matter what state the component is in. * * S_IDLE is the default state, and is always equal to 0. Therefore, * setup the enums in your internal component so the IDLE/default state is * always 0. * * @author David Moss - dmm@rincon.com */ #include "State.h" generic configuration StateC() { provides { interface State; } } implementation { components StateImplC; State = StateImplC.State[unique(UQ_STATE)]; } tinyos-2.1.2+dfsg/tos/system/StateImplC.nc000066400000000000000000000056101207233610700204430ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * This is a state controller for any and every component's * state machine(s). * * There are several compelling reasons to use the State module/interface * in all your components that have any kind of state associated with them: * * 1) It provides a unified interface to control any state, which makes * it easy for everyone to understand your code * 2) You can easily keep track of multiple state machines in one component * 3) You could have one state machine control several components * * There are three ways to change a component's state: * > Request a state change * The state is only changed if the state is currently in S_IDLE. If * the state changes and access is grated, requestState returns SUCCESS. * * > Force a state change * The state changes no matter what * * > toIdle() * The state changes to S_IDLE, no matter what state the component is in. * * S_IDLE is the default state, and is always equal to 0. Therefore, * setup the enums in your internal component so the IDLE/default state is * always 0. * * @author David Moss - dmm@rincon.com */ #include "State.h" configuration StateImplC { provides { interface State[uint8_t id]; } } implementation { components MainC, StateImplP; MainC.SoftwareInit -> StateImplP; State = StateImplP; } tinyos-2.1.2+dfsg/tos/system/StateImplP.nc000066400000000000000000000110631207233610700204570ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Rincon Research Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * This is a state controller for any and every component's * state machine(s). * * There are several compelling reasons to use the State module/interface * in all your components that have any kind of state associated with them: * * 1) It provides a unified interface to control any state, which makes * it easy for everyone to understand your code * 2) You can easily keep track of multiple state machines in one component * 3) You could have one state machine control several components * * There are three ways to change a component's state: * > Request a state change * The state is only changed if the state is currently in S_IDLE. If * the state changes and access is grated, requestState returns SUCCESS. * * > Force a state change * The state changes no matter what * * > toIdle() * The state changes to S_IDLE, no matter what state the component is in. * * S_IDLE is the default state, and is always equal to 0. Therefore, * setup the enums in your internal component so the IDLE/default state is * always 0. * * @author David Moss - dmm@rincon.com */ #include "State.h" module StateImplP @safe() { provides { interface Init; interface State[uint8_t id]; } } implementation { /** Each component's state - uniqueCount("State") of them */ uint8_t state[uniqueCount(UQ_STATE)]; enum { S_IDLE = 0, }; /***************** Init Commands ****************/ command error_t Init.init() { int i; for(i = 0; i < uniqueCount(UQ_STATE); i++) { state[i] = S_IDLE; } return SUCCESS; } /***************** State Commands ****************/ /** * This will allow a state change so long as the current * state is S_IDLE. * @return SUCCESS if the state is change, FAIL if it isn't */ async command error_t State.requestState[uint8_t id](uint8_t reqState) { error_t returnVal = FAIL; atomic { if(reqState == S_IDLE || state[id] == S_IDLE) { state[id] = reqState; returnVal = SUCCESS; } } return returnVal; } /** * Force the state machine to go into a certain state, * regardless of the current state it's in. */ async command void State.forceState[uint8_t id](uint8_t reqState) { atomic state[id] = reqState; } /** * Set the current state back to S_IDLE */ async command void State.toIdle[uint8_t id]() { atomic state[id] = S_IDLE; } /** * @return TRUE if the state machine is in S_IDLE */ async command bool State.isIdle[uint8_t id]() { return call State.isState[id](S_IDLE); } /** * @return TRUE if the state machine is in the given state */ async command bool State.isState[uint8_t id](uint8_t myState) { bool isState; atomic isState = (state[id] == myState); return isState; } /** * Get the current state */ async command uint8_t State.getState[uint8_t id]() { uint8_t theState; atomic theState = state[id]; return theState; } } tinyos-2.1.2+dfsg/tos/system/SystemLowPowerListeningC.nc000066400000000000000000000003121207233610700233730ustar00rootroot00000000000000configuration SystemLowPowerListeningC { provides interface SystemLowPowerListening; } implementation { components SystemLowPowerListeningP; SystemLowPowerListening = SystemLowPowerListeningP; } tinyos-2.1.2+dfsg/tos/system/SystemLowPowerListeningP.nc000066400000000000000000000012231207233610700234120ustar00rootroot00000000000000#include "Lpl.h" module SystemLowPowerListeningP { provides interface SystemLowPowerListening; } implementation { uint16_t remoteWakeup = LPL_DEF_REMOTE_WAKEUP; uint16_t delayAfterReceive = DELAY_AFTER_RECEIVE; command void SystemLowPowerListening.setDefaultRemoteWakeupInterval(uint16_t intervalMs) { remoteWakeup = intervalMs; } command void SystemLowPowerListening.setDelayAfterReceive(uint16_t intervalMs) { delayAfterReceive = intervalMs; } command uint16_t SystemLowPowerListening.getDefaultRemoteWakeupInterval() { return remoteWakeup; } command uint16_t SystemLowPowerListening.getDelayAfterReceive() { return delayAfterReceive; } } tinyos-2.1.2+dfsg/tos/system/TimerMilliC.nc000066400000000000000000000042611207233610700206110ustar00rootroot00000000000000// $Id: TimerMilliC.nc,v 1.5 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2005 Stanford University. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The virtualized millisecond timer abstraction. Instantiating this * component gives an independent millisecond granularity timer. * * @author Philip Levis * @date January 16 2006 * @see TEP 102: Timers */ #include "Timer.h" generic configuration TimerMilliC() { provides interface Timer; } implementation { components TimerMilliP; // The key to unique is based off of TimerMilliC because TimerMilliImplP // is just a pass-through to the underlying HIL component (TimerMilli). Timer = TimerMilliP.TimerMilli[unique(UQ_TIMER_MILLI)]; } tinyos-2.1.2+dfsg/tos/system/TimerMilliP.nc000066400000000000000000000043271207233610700206310ustar00rootroot00000000000000// $Id: TimerMilliP.nc,v 1.6 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ /** * Components should never wire to this component. This is the * underlying configuration of virtualized millisecond timers. * It auto-wires wires the timer * implementation (TimerC) to the boot sequence and exports the * various Timer interfaces. * * @author Philip Levis * @author Cory Sharp * @date May 16 2005 */ #include "Timer.h" configuration TimerMilliP { provides interface Timer as TimerMilli[uint8_t id]; } implementation { components HilTimerMilliC, MainC; MainC.SoftwareInit -> HilTimerMilliC; TimerMilli = HilTimerMilliC; } tinyos-2.1.2+dfsg/tos/system/TinySchedulerC.nc000066400000000000000000000044711207233610700213270ustar00rootroot00000000000000// $Id: TinySchedulerC.nc,v 1.5 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * The TinyOS scheduler. It provides two interfaces: Scheduler, * for TinyOS to initialize and run tasks, and TaskBasic, the simplext * class of TinyOS tasks (reserved always at-most-once posting, * FIFO, parameter-free). For details and information on how to * replace the scheduler, refer to TEP 106. * * @author Phil Levis * @date August 7 2005 * @see TEP 106: Tasks and Schedulers */ configuration TinySchedulerC { provides interface Scheduler; provides interface TaskBasic[uint8_t id]; } implementation { components SchedulerBasicP as Sched; components McuSleepC as Sleep; Scheduler = Sched; TaskBasic = Sched; Sched.McuSleep -> Sleep; } tinyos-2.1.2+dfsg/tos/system/crc.h000066400000000000000000000067071207233610700170440ustar00rootroot00000000000000// $Id: crc.h,v 1.7 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ #ifndef CRC_H #define CRC_H /* We don't want to duplicate this function inside binary components. */ #ifdef NESC_BUILD_BINARY uint16_t crcByte(uint16_t oldCrc, uint8_t byte); #else /* * Default CRC function. Some microcontrollers may provide more efficient * implementations. * * This CRC-16 function produces a 16-bit running CRC that adheres to the * ITU-T CRC standard. * * The ITU-T polynomial is: G_16(x) = x^16 + x^12 + x^5 + 1 * @param crc Running CRC value * @param b Byte to "add" to the CRC * @return New CRC value * * To understand how the CRC works and how it relates to the polynomial, read through this * loop based implementation. */ /* uint16_t crcByte(uint16_t crc, uint8_t b) { uint8_t i; crc = crc ^ b << 8; i = 8; do if (crc & 0x8000) crc = crc << 1 ^ 0x1021; else crc = crc << 1; while (--i); return crc; } */ /** * The following implementation computes the same polynomial. It should be * (much) faster on any processor architecture, as it does not involve * loops. Unfortunately, I can not yet give a reference to a derivation. * * @author Andreas Koepke (porting to tinyos) * @author Paul Curtis (pointed out this implementation on the MSP430 yahoo mailing list) */ uint16_t crcByte(uint16_t crc, uint8_t b) { crc = (uint8_t)(crc >> 8) | (crc << 8); crc ^= b; crc ^= (uint8_t)(crc & 0xff) >> 4; crc ^= crc << 12; crc ^= (crc & 0xff) << 5; return crc; } #endif #endif tinyos-2.1.2+dfsg/tos/system/dbg.h000066400000000000000000000042221207233610700170170ustar00rootroot00000000000000// $Id: dbg.h,v 1.6 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2003 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /** * This file is part of the TOSSIM DBG (debug) system. * * @author Philip Levis * @date 2/08/05 */ #ifndef DBG_H #define DBG_H #endif /* DBG_H */ tinyos-2.1.2+dfsg/tos/system/scale.h000066400000000000000000000010731207233610700173530ustar00rootroot00000000000000#ifndef SCALE_H #define SCALE_H /* * Multiply x by a/b while avoiding overflow when possible. Requires that * a*b <= max value of from_t, and assumes unsigned arithmetic. * * @param x Number to scale * @param a Numerator of scaling value * @param b Denominator of scaling value * @return round(x * a/b) */ inline uint32_t scale32(uint32_t x, uint32_t a, uint32_t b) { uint32_t x_over_b = x / b; uint32_t x_mod_b = x % b; x_mod_b *= a; // on a separate line just in case some compiler goes weird return x_over_b * a + (x_mod_b + (b>>1)) / b; } #endif tinyos-2.1.2+dfsg/tos/system/tos.h000066400000000000000000000023731207233610700170750ustar00rootroot00000000000000#if !defined(__CYGWIN__) #if defined(__MSP430__) #include #else #include #endif #else //cygwin #define _HAVE_STDC // hack to force the definition _EXFNPTR under cygwin #undef _ANSIDECL_H_ // which is used in reent.h #include // reload _ansi.h #include #include #endif #include #include #include #include #include /* TEMPORARY: include the Safe TinyOS macros so that annotations get * defined away for non-safe users */ #include "../lib/safe/include/annots_stage1.h" typedef uint8_t bool; enum { FALSE = 0, TRUE = 1 }; typedef nx_int8_t nx_bool; uint16_t TOS_NODE_ID = 1; /* This macro is used to mark pointers that represent ownership transfer in interfaces. See TEP 3 for more discussion. */ #define PASS #ifdef NESC struct @atmostonce { }; struct @atleastonce { }; struct @exactlyonce { }; #endif /* This platform_bootstrap macro exists in accordance with TEP 107. A platform may override this through a platform.h file. */ #include #ifndef platform_bootstrap #define platform_bootstrap() {} #endif #ifndef TOSSIM #define dbg(s, ...) #define dbgerror(s, ...) #define dbg_clear(s, ...) #define dbgerror_clear(s, ...) #endif tinyos-2.1.2+dfsg/tos/system/unittest/000077500000000000000000000000001207233610700177715ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/system/unittest/README.txt000066400000000000000000000023201207233610700214640ustar00rootroot00000000000000Crude infrastructure for TinyOS unit tests. In the implementation section of your application configuration, add this line: #include Where the specification section of your application module changes to the implementation section, use this pattern: #include } implementation { #include Within your test module, use these macros: ASSERT_EQUAL(v1, v2); ASSERT_EQUAL_32(long1, long2); ASSERT_EQUAL_PTR(p1, p2); ASSERT_TRUE(condition); Put the following line after all tests: ALL_TESTS_PASSED() Then make platform install, cat /dev/ttyUSB0, and watch as everything is verified. If something goes wrong, the red LED will be lit and failure will be repeatedly printed to the screen, including the parameters and the line number of the failure. If everything goes right, the green LED will be lit and "All tests passed" will be printed to the screen. You can run all unit tests that are found within a directory (default: ${TOSROOT/apps}) by using the ${TOSDIR}/system/unittests/runtests script. When creating a new unit test, copy the basic configuration (Makefile, application configuration, application module) from ${TOSDIR}/system/unittest/Stub. tinyos-2.1.2+dfsg/tos/system/unittest/Stub/000077500000000000000000000000001207233610700207065ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/system/unittest/Stub/Makefile000066400000000000000000000001111207233610700223370ustar00rootroot00000000000000COMPONENT=TestAppC PFLAGS += -I$(TOSDIR)/lib/printf include $(MAKERULES) tinyos-2.1.2+dfsg/tos/system/unittest/Stub/TestAppC.nc000066400000000000000000000002231207233610700227100ustar00rootroot00000000000000configuration TestAppC { } implementation { components TestP; components MainC; TestP.Boot -> MainC; #include } tinyos-2.1.2+dfsg/tos/system/unittest/Stub/TestP.nc000066400000000000000000000003151207233610700222660ustar00rootroot00000000000000#include module TestP { uses interface Boot; #include } implementation { #include event void Boot.booted () { ALL_TESTS_PASSED(); } } tinyos-2.1.2+dfsg/tos/system/unittest/config_impl.h000066400000000000000000000035531207233610700224360ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef OIP_TEST_UNITTEST_CONFIG_IMPL_H_ #define OIP_TEST_UNITTEST_CONFIG_IMPL_H_ components LedC; TestP.PassLed -> LedC.Green; TestP.FailLed -> LedC.Red; // @todo The destination for the printed messages should be configurable components SerialPrintfC; #endif /* OIP_TEST_UNITTEST_CONFIG_IMPL_H_ */ tinyos-2.1.2+dfsg/tos/system/unittest/module_impl.h000066400000000000000000000065701207233610700224600ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef OIP_TEST_UNITTEST_MODULE_IMPL_H_ #define OIP_TEST_UNITTEST_MODULE_IMPL_H_ char messageBuffer_[64]; void fail (const char* msg) { call FailLed.on(); while (1) { volatile uint16_t ctr = 0x8000; printf("%s\r\n", msg); while (--ctr); } } #define ASSERT_EQUAL_PTR(_v1, _v2) { \ const void* v1 = (const void*)_v1; \ const void* v2 = (const void*)_v2; \ if (v1 != v2) { \ sprintf(messageBuffer_, "FAIL[%d]: %p != %p (%s != %s)", __LINE__, v1, v2, #_v1, #_v2); \ fail(messageBuffer_); \ } \ printf("Pass: %s == %s (%p)\r\n", #_v1, #_v2, v1); \ } #define ASSERT_EQUAL(_v1, _v2) { \ int v1 = _v1; \ int v2 = _v2; \ if (v1 != v2) { \ sprintf(messageBuffer_, "FAIL[%d]: %d != %d (%s != %s)", __LINE__, v1, v2, #_v1, #_v2); \ fail(messageBuffer_); \ } \ printf("Pass: %s == %s (%d)\r\n", #_v1, #_v2, v1); \ } #define ASSERT_EQUAL_32(_v1, _v2) { \ int32_t v1 = _v1; \ int32_t v2 = _v2; \ if (v1 != v2) { \ sprintf(messageBuffer_, "FAIL[%d]: %ld != %ld (%s != %s)", __LINE__, v1, v2, #_v1, #_v2); \ fail(messageBuffer_); \ } \ printf("Pass: %s == %s (%ld)\r\n", #_v1, #_v2, v1); \ } #define ASSERT_EQUAL_U32(_v1, _v2) { \ uint32_t v1 = _v1; \ uint32_t v2 = _v2; \ if (v1 != v2) { \ sprintf(messageBuffer_, "FAIL[%d]: %lu != %lu (%s != %s)", __LINE__, v1, v2, #_v1, #_v2); \ fail(messageBuffer_); \ } \ printf("Pass: %s == %s (%lu)\r\n", #_v1, #_v2, v1); \ } #define ASSERT_TRUE(_p) { \ bool p = _p; \ if (! p) { \ sprintf(messageBuffer_, "FAIL[%d]: %s is false", __LINE__, #_p); \ fail(messageBuffer_); \ } \ printf("Pass: %s\r\n", #_p); \ } #define ALL_TESTS_PASSED() do { \ call PassLed.on(); \ printf("All tests passed\r\n"); \ while(1); \ } while (0) #endif /* OIP_TEST_UNITTEST_MODULE_IMPL_H_ */ tinyos-2.1.2+dfsg/tos/system/unittest/module_spec.h000066400000000000000000000033771207233610700224530ustar00rootroot00000000000000/* Copyright (c) 2010 People Power Co. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the People Power Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * PEOPLE POWER CO. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE * */ #ifndef OIP_TEST_UNITTEST_MODULE_SPEC_H_ #define OIP_TEST_UNITTEST_MODULE_SPEC_H_ uses { interface Led as PassLed; interface Led as FailLed; } #endif /* OIP_TEST_UNITTEST_MODULE_SPEC_H_ */ tinyos-2.1.2+dfsg/tos/system/unittest/runtests000077500000000000000000000030501207233610700216040ustar00rootroot00000000000000#!/bin/sh # # Usage: runtests [root [platform]] # # Search all directories in root (default: ${TOSROOT}/apps) that use # the OSIAN unittest framework. For each such test, build it for # platform (default ${PLATFORM} or tmote), and run it. # # This version does not automatically detect pass/fail; the green LED # will be lit on pass and the red LED on failure, and the screen will # print "FAIL:*" repeatedly when something goes wrong or "All tests # passed" once if everything was good. In either situation, you have # to type control-c to move to the next test. ROOT=${1:-${TOSROOT}/apps} PLATFORM=${2:-${PLATFORM:-tmote}} MOTEDEV=${MOTEDEV:-/dev/ttyUSB0} MOTEBAUD=${MOTEBAUD:-115200} fail () { case=${1} ; shift echo 1>&2 "FAILED BUILD ${case}:" cat utbuild.log exit 1 } trap true INT echo "Looking for unit tests in ${ROOT}" find ${ROOT} -name Makefile \ | while read FOUND_MAKEFILE ; do mf_dir=$(dirname ${FOUND_MAKEFILE}) component=$(grep '^COMPONENT *=' ${FOUND_MAKEFILE} | cut -d= -f2 | sed -e 's@ @@g') if [ -z "${component}" ] ; then continue fi test_source=${mf_dir}/${component}.nc if [ ! -f "${test_source}" ] ; then continue fi if grep -q "unittest/config_impl.h" ${test_source} ; then : ; else continue fi t=$(echo ${mf_dir} | sed -e "s@^${ROOT}/@@") ( cd ${mf_dir} echo "Building for ${t}" make ${PLATFORM} install > utbuild.log 2>&1 || fail ${t} echo "Running ${t} (^C when finished)" trap true INT stty ${MOTEBAUD} min 1 time 5 -icrnl -parenb cs8 < ${MOTEDEV} cat ${MOTEDEV} ) done tinyos-2.1.2+dfsg/tos/types/000077500000000000000000000000001207233610700157325ustar00rootroot00000000000000tinyos-2.1.2+dfsg/tos/types/AM.h000066400000000000000000000011661207233610700164040ustar00rootroot00000000000000#ifndef AM_H #define AM_H // These are the right types, but ncc currently does not // like parameters being network types typedef nx_uint8_t nx_am_id_t; typedef nx_uint8_t nx_am_group_t; typedef nx_uint16_t nx_am_addr_t; typedef uint8_t am_id_t; typedef uint8_t am_group_t; typedef uint16_t am_addr_t; enum { AM_BROADCAST_ADDR = 0xffff, }; #ifndef DEFINED_TOS_AM_GROUP #define DEFINED_TOS_AM_GROUP 0x22 #endif #ifndef DEFINED_TOS_AM_ADDRESS #define DEFINED_TOS_AM_ADDRESS 1 #endif enum { TOS_AM_GROUP = DEFINED_TOS_AM_GROUP, TOS_AM_ADDRESS = DEFINED_TOS_AM_ADDRESS }; #define UQ_AMQUEUE_SEND "amqueue.send" #endif tinyos-2.1.2+dfsg/tos/types/I2C.h000066400000000000000000000035371207233610700164700ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Arch Rock Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arched Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author Phil Buonadonna * @author Philip Levis */ #ifndef _I2C_H #define _I2C_H typedef struct { } TI2CExtdAddr; typedef struct { } TI2CBasicAddr; typedef uint8_t i2c_flags_t; enum { I2C_START = 0x01, I2C_STOP = 0x02, I2C_ACK_END = 0x04, }; #endif /* _I2C_H */ tinyos-2.1.2+dfsg/tos/types/Ieee154.h000066400000000000000000000060761207233610700172150ustar00rootroot00000000000000/* * Copyright (c) 2008-2010 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * @author Stephen Dawson-Haggerty * @version $Revision: 1.1 $ $Date: 2009/08/19 17:54:35 $ */ #ifndef __IEEE154_H__ #define __IEEE154_H__ #include "IeeeEui64.h" #define IEEE154_SEND_CLIENT "IEEE154_SEND_CLIENT" typedef uint16_t ieee154_panid_t; typedef uint16_t ieee154_saddr_t; typedef ieee_eui64_t ieee154_laddr_t; typedef struct { uint8_t ieee_mode:2; union { ieee154_saddr_t saddr; ieee154_laddr_t laddr; } ieee_addr; } ieee154_addr_t; #define i_saddr ieee_addr.saddr #define i_laddr ieee_addr.laddr enum { IEEE154_BROADCAST_ADDR = 0xffff, IEEE154_LINK_MTU = 127, }; struct ieee154_frame_addr { ieee154_addr_t ieee_src; ieee154_addr_t ieee_dst; ieee154_panid_t ieee_dstpan; }; enum { IEEE154_MIN_HDR_SZ = 6, }; #if 0 struct ieee154_header_base { uint8_t length; uint16_t fcf; uint8_t dsn; uint16_t destpan; } __attribute__((packed)); #else #endif enum ieee154_fcf_enums { IEEE154_FCF_FRAME_TYPE = 0, IEEE154_FCF_SECURITY_ENABLED = 3, IEEE154_FCF_FRAME_PENDING = 4, IEEE154_FCF_ACK_REQ = 5, IEEE154_FCF_INTRAPAN = 6, IEEE154_FCF_DEST_ADDR_MODE = 10, IEEE154_FCF_SRC_ADDR_MODE = 14, }; enum ieee154_fcf_type_enums { IEEE154_TYPE_BEACON = 0, IEEE154_TYPE_DATA = 1, IEEE154_TYPE_ACK = 2, IEEE154_TYPE_MAC_CMD = 3, IEEE154_TYPE_MASK = 7, }; enum ieee154_fcf_addr_mode_enums { IEEE154_ADDR_NONE = 0, IEEE154_ADDR_SHORT = 2, IEEE154_ADDR_EXT = 3, IEEE154_ADDR_MASK = 3, }; #endif tinyos-2.1.2+dfsg/tos/types/IeeeEui64.h000066400000000000000000000035571207233610700176010ustar00rootroot00000000000000// $Id: IeeeEui64.h,v 1.2 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2007, Vanderbilt University * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holders nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Author: Janos Sallai * Author: Gilman Tolle, Jonathan Hui (TEP 122) */ #ifndef IEEEEUI64_H #define IEEEEUI64_H enum { IEEE_EUI64_LENGTH = 8 }; typedef struct ieee_eui64 { uint8_t data[IEEE_EUI64_LENGTH]; } ieee_eui64_t; #endif // IEEEEUI64_H tinyos-2.1.2+dfsg/tos/types/Leds.h000066400000000000000000000037051207233610700167770ustar00rootroot00000000000000//$Id: Leds.h,v 1.6 2010-06-29 22:07:56 scipio Exp $ /* Copyright (c) 2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the copyright holder nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Constants for manipulating LEDs. * * @author Philip Levis * @date March 21, 2005 */ #ifndef LEDS_H #define LEDS_H enum { LEDS_LED0 = 1 << 0, LEDS_LED1 = 1 << 1, LEDS_LED2 = 1 << 2, LEDS_LED3 = 1 << 3, LEDS_LED4 = 1 << 4, LEDS_LED5 = 1 << 5, LEDS_LED6 = 1 << 6, LEDS_LED7 = 1 << 7 }; #endif tinyos-2.1.2+dfsg/tos/types/Lpl.h000066400000000000000000000006201207233610700166300ustar00rootroot00000000000000#ifndef LPL_H #define LPL_H /** * Amount of time, in milliseconds, to keep the radio on after * a successful receive addressed to this node */ #ifndef DELAY_AFTER_RECEIVE #define DELAY_AFTER_RECEIVE 100 #endif /** * The LPL defaults to stay-on. */ #ifndef LPL_DEF_LOCAL_WAKEUP #define LPL_DEF_LOCAL_WAKEUP 0 #endif #ifndef LPL_DEF_REMOTE_WAKEUP #define LPL_DEF_REMOTE_WAKEUP 0 #endif #endif tinyos-2.1.2+dfsg/tos/types/README000066400000000000000000000000161207233610700166070ustar00rootroot00000000000000Update this. tinyos-2.1.2+dfsg/tos/types/Resource.h000066400000000000000000000032261207233610700176750ustar00rootroot00000000000000/* * Copyright (c) 2006, Technische Universitaet Berlin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Technische Universitat Berlin nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef RESOURCE_H #define RESOURCE_H typedef uint8_t resource_client_id_t; #endif tinyos-2.1.2+dfsg/tos/types/State.h000066400000000000000000000032771207233610700171740ustar00rootroot00000000000000/* * Copyright (c) 2005-2006 Rincon Research Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the Arch Rock Corporation nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE */ /** * @author David Moss */ #ifndef STATE_H #define STATE_H #ifndef UQ_STATE #define UQ_STATE "State" #endif #endif tinyos-2.1.2+dfsg/tos/types/Storage.h000066400000000000000000000046021207233610700175110ustar00rootroot00000000000000// $Id: Storage.h,v 1.6 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright (c) 2002-2005 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, * 94704. Attention: Intel License Inquiry. */ /* * @author: Jonathan Hui * @author: David Gay * @version $Revision: 1.6 $ $Date: 2010-06-29 22:07:56 $ */ #ifndef STORAGE_H #define STORAGE_H typedef uint8_t volume_id_t; typedef uint32_t storage_addr_t; typedef uint32_t storage_len_t; typedef uint32_t storage_cookie_t; enum { SEEK_BEGINNING = 0 }; #include "Storage_chip.h" #endif tinyos-2.1.2+dfsg/tos/types/TinyError.h000066400000000000000000000062121207233610700200410ustar00rootroot00000000000000// $Id: TinyError.h,v 1.12 2010-06-29 22:07:56 scipio Exp $ /* * Copyright (c) 2000-2005 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * - Neither the name of the University of California nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * @author Phil Levis * @author David Gay * Revision: $Revision: 1.12 $ * * Defines global error codes for error_t in TinyOS. */ #ifndef TINY_ERROR_H_INCLUDED #define TINY_ERROR_H_INCLUDED #ifdef NESC #define NESC_COMBINE(x) @combine(x) #else #define NESC_COMBINE(x) #endif enum { SUCCESS = 0, FAIL = 1, // Generic condition: backwards compatible ESIZE = 2, // Parameter passed in was too big. ECANCEL = 3, // Operation cancelled by a call. EOFF = 4, // Subsystem is not active EBUSY = 5, // The underlying system is busy; retry later EINVAL = 6, // An invalid parameter was passed ERETRY = 7, // A rare and transient failure: can retry ERESERVE = 8, // Reservation required before usage EALREADY = 9, // The device state you are requesting is already set ENOMEM = 10, // Memory required not available ENOACK = 11, // A packet was not acknowledged ELAST = 11 // Last enum value }; typedef uint8_t error_t NESC_COMBINE("ecombine"); error_t ecombine(error_t r1, error_t r2) @safe() /* Returns: r1 if r1 == r2, FAIL otherwise. This is the standard error combination function: two successes, or two identical errors are preserved, while conflicting errors are represented by FAIL. */ { return r1 == r2 ? r1 : FAIL; } #endif tinyos-2.1.2+dfsg/tos/types/message.h000066400000000000000000000012151207233610700175260ustar00rootroot00000000000000#ifndef __MESSAGE_H__ #define __MESSAGE_H__ #include "platform_message.h" #ifndef TOSH_DATA_LENGTH #define TOSH_DATA_LENGTH 28 #endif #ifndef TOS_BCAST_ADDR #define TOS_BCAST_ADDR 0xFFFF #endif typedef nx_struct message_t { nx_uint8_t header[sizeof(message_header_t)]; nx_uint8_t data[TOSH_DATA_LENGTH]; nx_uint8_t footer[sizeof(message_footer_t)]; nx_uint8_t metadata[sizeof(message_metadata_t)]; } message_t; /* * This resource is used to arbitrate access between ActiveMessageC, * Ieee154MessageC and possibly future MessageC components to the * underlying radio driver. */ #define RADIO_SEND_RESOURCE "RADIO_SEND_RESOURCE" #endif